[
  {
    "path": ".editorconfig",
    "content": "[*]\ncharset = utf-8\nindent_size = 4\ntab_width = 4\nindent_style = space\ninsert_final_newline = true\ntrim_trailing_whitespace = true\nmax_line_length = 180\n\n[*.md]\ntrim_trailing_whitespace = false\n"
  },
  {
    "path": ".gitattributes",
    "content": "# Auto detect text files and perform LF normalization\n* text=auto\n\n\n# Whitespace rules\n# normal (no trailing)\n*.sql    whitespace=trailing-space,space-before-tab,cr-at-eol\n*.txt    whitespace=trailing-space,space-before-tab,cr-at-eol\n\n# special files which must ignore whitespace\n*.patch  whitespace=-trailing-space eol=lf\n*.diff   whitespace=-trailing-space eol=lf\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "content": "blank_issues_enabled: false\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/issue_template.yml",
    "content": "name: Issue Report\ndescription: Create a report of a problem encountered\ntitle: \"[TC] [AC] [Bug/Crash] [Group/Spell/Core] ISSUE_TITLE\"\nlabels: [bug]\n\nbody:\n  - type: checkboxes\n    attributes:\n      label: DO NOT REMOVE OR SKIP THE ISSUE TEMPLATE\n      description: Fill all fields even if you think it is irrelevant for the issue\n      options:\n        - label: I understand that my issue may get **closed without notice** if I *intentionally* remove or skip any mandatory\\* field\n          required: true\n  - type: textarea\n    id: behaviour_cur\n    attributes:\n      label: Current behaviour\n      description: Provide a description of what happens\n      placeholder: Worldserver crashes if boss BOSSNAME casts spell SPELLNAME (SPELLID) on a bot\n    validations:\n      required: true\n  - type: textarea\n    id: behaviour_exp\n    attributes:\n      label: Expected behaviour\n      description: Tell what should happen instead\n      placeholder: Boss BOSSNAME spell cast of SPELLNAME on a bot should not cause a crash\n  - type: input\n    id: crashlog\n    attributes:\n      label: Crashlog\n      description: If this is a crash, post **debug** crashlog (upload to https://gist.github.com/)\n      placeholder: N/A\n  - type: textarea\n    id: repro_steps\n    attributes:\n      label: Steps to reproduce the problem\n      placeholder: |\n        1) Engage boss BOSSNAME with tank bot\n        2) Wait until botss casts SPELLNAME on bot\n        3) ???\n        4) CRASH!\n  - type: dropdown\n    id: core_types\n    attributes:\n      label: TrinityCore or AzerothCore\n      options:\n        - TrinityCore\n        - AzerothCore\n        - Both\n    validations:\n      required: true\n  - type: input\n    id: core_rev\n    attributes:\n      label: Core rev. hash/commit\n      description: Copy the first line of the `worldserver` or `authserver` startup\n      placeholder: Trinity/Azeroth Core rev. 0000000000 2000-01-09 11:31:41 +0100 (my branch) (Win64, Debug, Static) (worldserver)\n    validations:\n      required: true\n  - type: input\n    id: os\n    attributes:\n      label: Operating system\n      placeholder: Win10 / Ubuntu 22.04 / Debian 11\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/question_feature_template.yml",
    "content": "name: Question / Feature Request\ndescription: Ask NPCBots related question or request NPCBots feature\ntitle: \"[TC] [AC] [Question/Feature] [Group/Spell/Core] ISSUE_TITLE\"\nlabels: [enhancement, question]\n\nbody:\n  - type: checkboxes\n    attributes:\n      label: DO NOT REMOVE OR SKIP THE ISSUE TEMPLATE\n      description: Fill all fields even if you think it is irrelevant for the issue\n      options:\n        - label: I understand that my issue may get **closed without notice** if I *intentionally* remove or skip any mandatory\\* field\n          required: true\n        - label: This is NOT a bug/crash report\n          required: true\n        - label: I've searched the bugtracker for similar questions/requests **including closed ones**\n          required: true\n  - type: textarea\n    id: desc\n    attributes:\n      label: Description\n      description: Please make sure your question or request is wordy enough to be understood, especially if you're using a tranlator\n      placeholder: Provide as much info as possible, with examples if needed, try to avoid being asked for more defined description\n    validations:\n      required: true\n  - type: dropdown\n    id: core_types\n    attributes:\n      label: TrinityCore or AzerothCore\n      options:\n        - TrinityCore\n        - AzerothCore\n        - Both\n    validations:\n      required: true\n  - type: input\n    id: core_rev\n    attributes:\n      label: Core rev. hash/commit\n      description: Copy the first line of the `worldserver` or `authserver` startup\n      placeholder: Trinity/Azeroth Core rev. 0000000000 2000-01-09 11:31:41 +0100 (my branch) (Win64, Debug, Static) (worldserver)\n  - type: input\n    id: os\n    attributes:\n      label: Operating system\n      placeholder: Win10 / Ubuntu 22.04 / Debian 11\n"
  },
  {
    "path": "AC/NPCBots.patch",
    "content": " .github/README.md                                  |    61 +-\n .github/workflows/core-build-nopch.yml             |     5 +-\n .github/workflows/windows_build.yml                |     8 +-\n .gitignore                                         |     4 +\n data/sql/Bots/locales/deDE/npc_text_locale.sql     |   409 +\n data/sql/Bots/locales/esES/npc_text_locale.sql     |   382 +\n data/sql/Bots/locales/esMX/npc_text_locale.sql     |   382 +\n data/sql/Bots/locales/ruRU/npc_text_locale.sql     |   380 +\n .../Bots/locales/zhCN/creature_template_locale.sql |   742 +\n data/sql/Bots/locales/zhCN/npc_text_locale.sql     |   410 +\n data/sql/Bots/locales/zhTW/npc_text_locale.sql     |   410 +\n data/sql/base/db_characters/characters_npcbot.sql  |    33 +\n .../characters_npcbot_group_member.sql             |    14 +\n .../base/db_characters/characters_npcbot_stats.sql |    36 +\n .../db_characters/characters_npcbot_transmog.sql   |    14 +\n .../creature_template_npcbot_appearance.sql        |   306 +\n .../db_world/creature_template_npcbot_extras.sql   |   376 +\n .../base/db_world/creature_template_outfits.sql    |    35 +\n ...023_05_16_00_characters_npcbot_gear_storage.sql |    11 +\n .../2023_05_26_00_characters_npcbot_transmog.sql   |     2 +\n .../2024_03_12_00_characters_npcbot.sql            |    20 +\n .../2024_05_29_00_characters_npcbot_logs.sql       |    19 +\n .../2024_10_17_00_characters_npcbot_settings.sql   |    14 +\n .../2024_11_13_00_characters_npcbot_gear_set.sql   |     8 +\n ...24_11_13_01_characters_npcbot_gear_set_item.sql |     9 +\n .../2024_11_21_00_characters_npcbot.sql            |     3 +\n .../2026_01_15_00_characters_npcbot.sql            |    27 +\n .../0000-00-00_npcbot_01_creature_template.sql     |   368 +\n ...000-00-00_npcbot_02_creature_equip_template.sql |   322 +\n .../db_world/0000-00-00_npcbot_03_npc_text.sql     |   389 +\n ...00-00-00_npcbot_04_creature_classlevelstats.sql |   611 +\n .../db_world/0000-00-00_npcbot_05_command.sql      |    43 +\n ...000-00-00_npcbot_06_creature_template_model.sql |   375 +\n .../sql/custom/db_world/2022_12_08_00_npc_text.sql |     8 +\n data/sql/custom/db_world/2022_12_17_00_command.sql |     7 +\n data/sql/custom/db_world/2022_12_17_01_command.sql |     2 +\n data/sql/custom/db_world/2022_12_23_00_command.sql |     6 +\n data/sql/custom/db_world/2022_12_29_00_command.sql |     2 +\n .../sql/custom/db_world/2023_01_02_00_npc_text.sql |     8 +\n ...12_00_creature_template_npcbot_wander_nodes.sql |    18 +\n .../2023_03_14_00_creature_wander_nodes.sql        |     2 +\n ...21_00_creature_template_npcbot_wander_nodes.sql |   964 +\n .../db_world/2023_03_22_00_creature_template.sql   |     2 +\n ...04_00_creature_template_npcbot_wander_nodes.sql |  2343 ++\n ...11_00_creature_template_npcbot_wander_nodes.sql |    27 +\n ...16_00_creature_template_npcbot_wander_nodes.sql |    27 +\n ...4_18_00_creature_template_npcbot_appearance.sql |     2 +\n ...22_00_creature_template_npcbot_wander_nodes.sql |    25 +\n .../db_world/2023_04_28_00_creature_template.sql   |     3 +\n ...14_00_creature_template_npcbot_wander_nodes.sql |     2 +\n .../sql/custom/db_world/2023_05_16_00_npc_text.sql |    13 +\n .../db_world/2023_05_20_00_creature_template.sql   |    22 +\n .../2023_05_20_01_creature_equip_template.sql      |    13 +\n ...23_05_20_02_creature_template_npcbot_extras.sql |    15 +\n .../sql/custom/db_world/2023_05_20_03_npc_text.sql |    27 +\n ...23_06_02_00_creature_template_npcbot_extras.sql |     2 +\n .../db_world/2023_06_03_00_creature_template.sql   |     2 +\n ...09_00_creature_template_npcbot_wander_nodes.sql |  2627 +++\n ...16_00_creature_template_npcbot_wander_nodes.sql |     9 +\n ..._01_creature_template_npcbot_disabled_items.sql |     6 +\n ..._00_creature_template_npcbot_disabled_items.sql |    53 +\n .../db_world/2023_06_19_01_creature_template.sql   |     2 +\n ...24_00_creature_template_npcbot_wander_nodes.sql |    55 +\n ...26_00_creature_template_npcbot_wander_nodes.sql |     5 +\n ..._00_creature_template_npcbot_disabled_items.sql |    11 +\n ...8_13_00_creature_template_npcbot_appearance.sql |     2 +\n .../sql/custom/db_world/2024_03_12_00_npc_text.sql |     7 +\n .../sql/custom/db_world/2024_03_18_00_npc_text.sql |     2 +\n .../sql/custom/db_world/2024_03_19_00_npc_text.sql |    17 +\n data/sql/custom/db_world/2024_05_21_00_command.sql |    73 +\n data/sql/custom/db_world/2024_05_29_00_command.sql |     3 +\n .../sql/custom/db_world/2024_08_14_00_npc_text.sql |     7 +\n .../sql/custom/db_world/2024_08_14_01_npc_text.sql |     3 +\n data/sql/custom/db_world/2024_08_15_00_command.sql |     3 +\n data/sql/custom/db_world/2024_08_31_00_command.sql |     3 +\n .../sql/custom/db_world/2024_10_21_00_npc_text.sql |     7 +\n data/sql/custom/db_world/2024_10_27_00_command.sql |     3 +\n .../2024_10_31_creature_template_wander_nodes.sql  |  2727 +++\n .../2024_11_01_creature_template_wander_nodes.sql  |    85 +\n .../2024_11_04_creature_template_wander_nodes.sql  |    56 +\n .../2024_11_05_creature_template_wander_nodes.sql  |     2 +\n .../2024_11_07_creature_template_wander_nodes.sql  |    39 +\n .../sql/custom/db_world/2024_11_11_00_npc_text.sql |     7 +\n .../sql/custom/db_world/2024_11_11_01_npc_text.sql |     8 +\n .../sql/custom/db_world/2024_11_13_00_npc_text.sql |    11 +\n .../2026_01_07_creature_template_wander_nodes.sql  |    24 +\n .../sql/custom/db_world/2026_01_15_00_npc_text.sql |    13 +\n .../2026_03_12_creature_template_wander_nodes.sql  |     5 +\n data/sql/custom/db_world/2026_03_28_00_command.sql |     2 +\n src/common/Common.h                                |     2 +-\n src/common/Utilities/EventProcessor.h              |     1 +\n src/server/apps/worldserver/worldserver.conf.dist  |   765 +\n .../Database/Implementation/CharacterDatabase.cpp  |    32 +\n .../Database/Implementation/CharacterDatabase.h    |    27 +\n .../Database/Implementation/WorldDatabase.cpp      |     5 +\n .../Database/Implementation/WorldDatabase.h        |     5 +\n src/server/game/AI/CoreAI/UnitAI.h                 |     3 +\n src/server/game/AI/NpcBots/bot_Events.h            |    80 +\n src/server/game/AI/NpcBots/bot_GridNotifiers.h     |  1386 ++\n src/server/game/AI/NpcBots/bot_InstanceEvents.h    |    53 +\n src/server/game/AI/NpcBots/bot_ai.cpp              | 21574 +++++++++++++++++++\n src/server/game/AI/NpcBots/bot_ai.h                |   859 +\n src/server/game/AI/NpcBots/bot_archmage_ai.cpp     |   410 +\n src/server/game/AI/NpcBots/bot_bm_ai.cpp           |   961 +\n src/server/game/AI/NpcBots/bot_crypt_lord_ai.cpp   |   824 +\n src/server/game/AI/NpcBots/bot_dark_ranger_ai.cpp  |   617 +\n src/server/game/AI/NpcBots/bot_death_knight_ai.cpp |  2152 ++\n src/server/game/AI/NpcBots/bot_dreadlord_ai.cpp    |   536 +\n src/server/game/AI/NpcBots/bot_druid_ai.cpp        |  2986 +++\n src/server/game/AI/NpcBots/bot_hunter_ai.cpp       |  2238 ++\n src/server/game/AI/NpcBots/bot_mage_ai.cpp         |  1851 ++\n src/server/game/AI/NpcBots/bot_necromancer_ai.cpp  |   770 +\n src/server/game/AI/NpcBots/bot_paladin_ai.cpp      |  2634 +++\n src/server/game/AI/NpcBots/bot_priest_ai.cpp       |  2018 ++\n src/server/game/AI/NpcBots/bot_rogue_ai.cpp        |  2053 ++\n src/server/game/AI/NpcBots/bot_sea_witch_ai.cpp    |   796 +\n src/server/game/AI/NpcBots/bot_shaman_ai.cpp       |  2875 +++\n src/server/game/AI/NpcBots/bot_spellbreaker_ai.cpp |   626 +\n src/server/game/AI/NpcBots/bot_sphynx_ai.cpp       |   559 +\n src/server/game/AI/NpcBots/bot_warlock_ai.cpp      |  2120 ++\n src/server/game/AI/NpcBots/bot_warrior_ai.cpp      |  2192 ++\n src/server/game/AI/NpcBots/botcommands.cpp         |  5125 +++++\n src/server/game/AI/NpcBots/botcommon.h             |   679 +\n src/server/game/AI/NpcBots/botconfig.cpp           |  1355 ++\n src/server/game/AI/NpcBots/botconfig.h             |   142 +\n src/server/game/AI/NpcBots/botdatamgr.cpp          |  3503 +++\n src/server/game/AI/NpcBots/botdatamgr.h            |   273 +\n src/server/game/AI/NpcBots/botdefine.h             |    33 +\n src/server/game/AI/NpcBots/botdpstracker.cpp       |    99 +\n src/server/game/AI/NpcBots/botdpstracker.h         |    45 +\n src/server/game/AI/NpcBots/botdump.cpp             |  1009 +\n src/server/game/AI/NpcBots/botdump.h               |    49 +\n src/server/game/AI/NpcBots/botgearscore.cpp        |   147 +\n src/server/game/AI/NpcBots/botgearscore.h          |    16 +\n src/server/game/AI/NpcBots/botgiver.cpp            |   299 +\n src/server/game/AI/NpcBots/botgossip.h             |   153 +\n src/server/game/AI/NpcBots/botlog.cpp              |    83 +\n src/server/game/AI/NpcBots/botlog.h                |    35 +\n src/server/game/AI/NpcBots/botmgr.cpp              |  2120 ++\n src/server/game/AI/NpcBots/botmgr.h                |   292 +\n src/server/game/AI/NpcBots/botspell.cpp            |  1909 ++\n src/server/game/AI/NpcBots/botspell.h              |   322 +\n src/server/game/AI/NpcBots/bottext.h               |   441 +\n src/server/game/AI/NpcBots/botwanderful.cpp        |   455 +\n src/server/game/AI/NpcBots/botwanderful.h          |   240 +\n src/server/game/AI/NpcBots/bpet_ai.cpp             |  2573 +++\n src/server/game/AI/NpcBots/bpet_ai.h               |   200 +\n src/server/game/AI/NpcBots/bpet_archmage.cpp       |   151 +\n src/server/game/AI/NpcBots/bpet_crypt_lord.cpp     |   380 +\n src/server/game/AI/NpcBots/bpet_dark_ranger.cpp    |   219 +\n src/server/game/AI/NpcBots/bpet_death_knight.cpp   |   190 +\n src/server/game/AI/NpcBots/bpet_dreadlord.cpp      |   164 +\n src/server/game/AI/NpcBots/bpet_druid.cpp          |   146 +\n src/server/game/AI/NpcBots/bpet_hunter.cpp         |  1000 +\n src/server/game/AI/NpcBots/bpet_mage.cpp           |   177 +\n src/server/game/AI/NpcBots/bpet_necromancer.cpp    |   198 +\n src/server/game/AI/NpcBots/bpet_priest.cpp         |   172 +\n src/server/game/AI/NpcBots/bpet_sea_witch.cpp      |   250 +\n src/server/game/AI/NpcBots/bpet_shaman.cpp         |   191 +\n src/server/game/AI/NpcBots/bpet_warlock.cpp        |   408 +\n src/server/game/AI/NpcBots/lib/botlogtraits.h      |    53 +\n src/server/game/AI/NpcBots/lib/bottraits.h         |   136 +\n src/server/game/AI/SmartScripts/SmartScript.cpp    |     3 +\n .../game/AuctionHouse/AuctionHouseSearcher.cpp     |     7 +\n src/server/game/Battlegrounds/Arena.cpp            |    85 +\n src/server/game/Battlegrounds/Arena.h              |    10 +\n src/server/game/Battlegrounds/Battleground.cpp     |   541 +\n src/server/game/Battlegrounds/Battleground.h       |    38 +\n src/server/game/Battlegrounds/BattlegroundMgr.h    |     5 +\n .../game/Battlegrounds/BattlegroundQueue.cpp       |   141 +\n src/server/game/Battlegrounds/BattlegroundQueue.h  |     4 +\n .../game/Battlegrounds/Zones/BattlegroundAB.cpp    |   222 +\n .../game/Battlegrounds/Zones/BattlegroundAB.h      |    12 +\n .../game/Battlegrounds/Zones/BattlegroundAV.cpp    |   380 +-\n .../game/Battlegrounds/Zones/BattlegroundAV.h      |    24 +\n .../game/Battlegrounds/Zones/BattlegroundEY.cpp    |   338 +\n .../game/Battlegrounds/Zones/BattlegroundEY.h      |    21 +\n .../game/Battlegrounds/Zones/BattlegroundWS.cpp    |   322 +\n .../game/Battlegrounds/Zones/BattlegroundWS.h      |    14 +\n src/server/game/Combat/CombatManager.cpp           |    58 +\n src/server/game/Conditions/ConditionMgr.cpp        |    47 +\n src/server/game/DungeonFinding/LFGMgr.cpp          |   180 +\n src/server/game/DungeonFinding/LFGScripts.cpp      |     9 +\n src/server/game/Entities/Creature/Creature.cpp     |   633 +\n src/server/game/Entities/Creature/Creature.h       |    96 +\n src/server/game/Entities/Creature/CreatureData.h   |    20 +\n src/server/game/Entities/Creature/GossipDef.h      |     2 +-\n .../game/Entities/Creature/TemporarySummon.cpp     |    36 +\n src/server/game/Entities/GameObject/GameObject.cpp |    97 +\n src/server/game/Entities/Object/Object.cpp         |    63 +-\n src/server/game/Entities/Object/Object.h           |    13 +-\n src/server/game/Entities/Player/KillRewarder.cpp   |    72 +\n src/server/game/Entities/Player/KillRewarder.h     |     4 +\n src/server/game/Entities/Player/Player.cpp         |   172 +\n src/server/game/Entities/Player/Player.h           |    24 +\n src/server/game/Entities/Player/PlayerStorage.cpp  |    16 +\n src/server/game/Entities/Player/PlayerUpdates.cpp  |    13 +\n src/server/game/Entities/Totem/Totem.cpp           |    27 +\n src/server/game/Entities/Transport/Transport.cpp   |    11 +\n src/server/game/Entities/Unit/StatSystem.cpp       |    56 +\n src/server/game/Entities/Unit/Unit.cpp             |  1180 +-\n src/server/game/Entities/Unit/Unit.h               |    57 +-\n src/server/game/Entities/Vehicle/Vehicle.cpp       |    44 +\n src/server/game/Entities/Vehicle/Vehicle.h         |     6 +\n src/server/game/Globals/ObjectMgr.cpp              |    96 +\n src/server/game/Globals/ObjectMgr.h                |    21 +\n src/server/game/Grids/Notifiers/GridNotifiers.h    |     4 +\n src/server/game/Groups/Group.cpp                   |   360 +-\n src/server/game/Groups/Group.h                     |    17 +\n src/server/game/Groups/GroupMgr.cpp                |     7 +\n src/server/game/Groups/GroupRefMgr.h               |    12 +\n src/server/game/Groups/GroupReference.cpp          |    20 +\n src/server/game/Groups/GroupReference.h            |    20 +\n src/server/game/Handlers/BattleGroundHandler.cpp   |   139 +\n src/server/game/Handlers/GroupHandler.cpp          |    43 +\n src/server/game/Handlers/ItemHandler.cpp           |    19 +\n src/server/game/Handlers/LootHandler.cpp           |    49 +\n src/server/game/Handlers/QueryHandler.cpp          |    45 +\n src/server/game/Handlers/SpellHandler.cpp          |   109 +\n src/server/game/Instances/InstanceScript.cpp       |    38 +\n src/server/game/Instances/InstanceScript.h         |     7 +\n src/server/game/Maps/Map.cpp                       |    69 +\n src/server/game/Maps/MapMgr.cpp                    |    17 +\n src/server/game/Movement/MotionMaster.cpp          |    20 +\n src/server/game/Movement/MotionMaster.h            |     4 +\n .../MovementGenerators/PointMovementGenerator.cpp  |     7 +\n .../TargetedMovementGenerator.cpp                  |    22 +\n src/server/game/Movement/Spline/MoveSplineInit.cpp |     5 +\n src/server/game/OutdoorPvP/OutdoorPvP.cpp          |    17 +\n src/server/game/Scripting/ScriptMgr.cpp            |     8 +\n src/server/game/Scripting/ScriptMgr.h              |     2 +\n src/server/game/Server/WorldSession.cpp            |    10 +\n src/server/game/Spells/Auras/SpellAuraEffects.cpp  |   157 +\n src/server/game/Spells/Auras/SpellAuras.cpp        |    52 +\n src/server/game/Spells/Spell.cpp                   |   298 +\n src/server/game/Spells/Spell.h                     |     3 +\n src/server/game/Spells/SpellEffects.cpp            |   251 +\n src/server/game/Spells/SpellInfo.cpp               |    65 +\n src/server/game/Spells/SpellInfo.h                 |     8 +\n src/server/game/Spells/SpellInfoCorrections.cpp    |    62 +\n src/server/scripts/Commands/cs_npc.cpp             |    28 +\n .../Kalimdor/TempleOfAhnQiraj/boss_viscidus.cpp    |     8 +\n .../boss_icecrown_gunship_battle.cpp               |    49 +\n .../Northrend/IcecrownCitadel/boss_sindragosa.cpp  |    40 +\n .../IcecrownCitadel/boss_the_lich_king.cpp         |     3 +\n .../IcecrownCitadel/instance_icecrown_citadel.cpp  |     9 +\n .../Northrend/Naxxramas/boss_four_horsemen.cpp     |     2 +-\n .../scripts/Northrend/Nexus/Oculus/oculus.cpp      |    14 +\n src/server/scripts/Northrend/zone_wintergrasp.cpp  |     5 +\n .../boss_shirrak_the_dead_watcher.cpp              |     7 +\n src/server/scripts/Pet/pet_dk.cpp                  |    24 +\n src/server/scripts/Pet/pet_mage.cpp                |    16 +\n src/server/scripts/Spells/spell_dk.cpp             |    74 +\n src/server/scripts/Spells/spell_druid.cpp          |    64 +\n src/server/scripts/Spells/spell_generic.cpp        |    21 +\n src/server/scripts/Spells/spell_hunter.cpp         |    16 +\n src/server/scripts/Spells/spell_item.cpp           |     5 +\n src/server/scripts/Spells/spell_mage.cpp           |     5 +\n src/server/scripts/Spells/spell_paladin.cpp        |    63 +\n src/server/scripts/Spells/spell_priest.cpp         |     8 +\n src/server/scripts/Spells/spell_rogue.cpp          |    52 +\n src/server/scripts/Spells/spell_shaman.cpp         |    10 +\n src/server/scripts/Spells/spell_warlock.cpp        |     9 +\n src/server/shared/DataStores/DBCStructure.h        |     6 +-\n src/server/shared/DataStores/DBCfmt.h              |     2 +-\n src/server/shared/SharedDefines.h                  |     7 +\n 266 files changed, 102759 insertions(+), 63 deletions(-)\n create mode 100644 data/sql/Bots/locales/deDE/npc_text_locale.sql\n create mode 100644 data/sql/Bots/locales/esES/npc_text_locale.sql\n create mode 100644 data/sql/Bots/locales/esMX/npc_text_locale.sql\n create mode 100644 data/sql/Bots/locales/ruRU/npc_text_locale.sql\n create mode 100644 data/sql/Bots/locales/zhCN/creature_template_locale.sql\n create mode 100644 data/sql/Bots/locales/zhCN/npc_text_locale.sql\n create mode 100644 data/sql/Bots/locales/zhTW/npc_text_locale.sql\n create mode 100644 data/sql/base/db_characters/characters_npcbot.sql\n create mode 100644 data/sql/base/db_characters/characters_npcbot_group_member.sql\n create mode 100644 data/sql/base/db_characters/characters_npcbot_stats.sql\n create mode 100644 data/sql/base/db_characters/characters_npcbot_transmog.sql\n create mode 100644 data/sql/base/db_world/creature_template_npcbot_appearance.sql\n create mode 100644 data/sql/base/db_world/creature_template_npcbot_extras.sql\n create mode 100644 data/sql/base/db_world/creature_template_outfits.sql\n create mode 100644 data/sql/custom/db_characters/2023_05_16_00_characters_npcbot_gear_storage.sql\n create mode 100644 data/sql/custom/db_characters/2023_05_26_00_characters_npcbot_transmog.sql\n create mode 100644 data/sql/custom/db_characters/2024_03_12_00_characters_npcbot.sql\n create mode 100644 data/sql/custom/db_characters/2024_05_29_00_characters_npcbot_logs.sql\n create mode 100644 data/sql/custom/db_characters/2024_10_17_00_characters_npcbot_settings.sql\n create mode 100644 data/sql/custom/db_characters/2024_11_13_00_characters_npcbot_gear_set.sql\n create mode 100644 data/sql/custom/db_characters/2024_11_13_01_characters_npcbot_gear_set_item.sql\n create mode 100644 data/sql/custom/db_characters/2024_11_21_00_characters_npcbot.sql\n create mode 100644 data/sql/custom/db_characters/2026_01_15_00_characters_npcbot.sql\n create mode 100644 data/sql/custom/db_world/0000-00-00_npcbot_01_creature_template.sql\n create mode 100644 data/sql/custom/db_world/0000-00-00_npcbot_02_creature_equip_template.sql\n create mode 100644 data/sql/custom/db_world/0000-00-00_npcbot_03_npc_text.sql\n create mode 100644 data/sql/custom/db_world/0000-00-00_npcbot_04_creature_classlevelstats.sql\n create mode 100644 data/sql/custom/db_world/0000-00-00_npcbot_05_command.sql\n create mode 100644 data/sql/custom/db_world/0000-00-00_npcbot_06_creature_template_model.sql\n create mode 100644 data/sql/custom/db_world/2022_12_08_00_npc_text.sql\n create mode 100644 data/sql/custom/db_world/2022_12_17_00_command.sql\n create mode 100644 data/sql/custom/db_world/2022_12_17_01_command.sql\n create mode 100644 data/sql/custom/db_world/2022_12_23_00_command.sql\n create mode 100644 data/sql/custom/db_world/2022_12_29_00_command.sql\n create mode 100644 data/sql/custom/db_world/2023_01_02_00_npc_text.sql\n create mode 100644 data/sql/custom/db_world/2023_03_12_00_creature_template_npcbot_wander_nodes.sql\n create mode 100644 data/sql/custom/db_world/2023_03_14_00_creature_wander_nodes.sql\n create mode 100644 data/sql/custom/db_world/2023_03_21_00_creature_template_npcbot_wander_nodes.sql\n create mode 100644 data/sql/custom/db_world/2023_03_22_00_creature_template.sql\n create mode 100644 data/sql/custom/db_world/2023_04_04_00_creature_template_npcbot_wander_nodes.sql\n create mode 100644 data/sql/custom/db_world/2023_04_11_00_creature_template_npcbot_wander_nodes.sql\n create mode 100644 data/sql/custom/db_world/2023_04_16_00_creature_template_npcbot_wander_nodes.sql\n create mode 100644 data/sql/custom/db_world/2023_04_18_00_creature_template_npcbot_appearance.sql\n create mode 100644 data/sql/custom/db_world/2023_04_22_00_creature_template_npcbot_wander_nodes.sql\n create mode 100644 data/sql/custom/db_world/2023_04_28_00_creature_template.sql\n create mode 100644 data/sql/custom/db_world/2023_05_14_00_creature_template_npcbot_wander_nodes.sql\n create mode 100644 data/sql/custom/db_world/2023_05_16_00_npc_text.sql\n create mode 100644 data/sql/custom/db_world/2023_05_20_00_creature_template.sql\n create mode 100644 data/sql/custom/db_world/2023_05_20_01_creature_equip_template.sql\n create mode 100644 data/sql/custom/db_world/2023_05_20_02_creature_template_npcbot_extras.sql\n create mode 100644 data/sql/custom/db_world/2023_05_20_03_npc_text.sql\n create mode 100644 data/sql/custom/db_world/2023_06_02_00_creature_template_npcbot_extras.sql\n create mode 100644 data/sql/custom/db_world/2023_06_03_00_creature_template.sql\n create mode 100644 data/sql/custom/db_world/2023_06_09_00_creature_template_npcbot_wander_nodes.sql\n create mode 100644 data/sql/custom/db_world/2023_06_16_00_creature_template_npcbot_wander_nodes.sql\n create mode 100644 data/sql/custom/db_world/2023_06_18_01_creature_template_npcbot_disabled_items.sql\n create mode 100644 data/sql/custom/db_world/2023_06_19_00_creature_template_npcbot_disabled_items.sql\n create mode 100644 data/sql/custom/db_world/2023_06_19_01_creature_template.sql\n create mode 100644 data/sql/custom/db_world/2023_06_24_00_creature_template_npcbot_wander_nodes.sql\n create mode 100644 data/sql/custom/db_world/2023_06_26_00_creature_template_npcbot_wander_nodes.sql\n create mode 100644 data/sql/custom/db_world/2023_07_01_00_creature_template_npcbot_disabled_items.sql\n create mode 100644 data/sql/custom/db_world/2023_08_13_00_creature_template_npcbot_appearance.sql\n create mode 100644 data/sql/custom/db_world/2024_03_12_00_npc_text.sql\n create mode 100644 data/sql/custom/db_world/2024_03_18_00_npc_text.sql\n create mode 100644 data/sql/custom/db_world/2024_03_19_00_npc_text.sql\n create mode 100644 data/sql/custom/db_world/2024_05_21_00_command.sql\n create mode 100644 data/sql/custom/db_world/2024_05_29_00_command.sql\n create mode 100644 data/sql/custom/db_world/2024_08_14_00_npc_text.sql\n create mode 100644 data/sql/custom/db_world/2024_08_14_01_npc_text.sql\n create mode 100644 data/sql/custom/db_world/2024_08_15_00_command.sql\n create mode 100644 data/sql/custom/db_world/2024_08_31_00_command.sql\n create mode 100644 data/sql/custom/db_world/2024_10_21_00_npc_text.sql\n create mode 100644 data/sql/custom/db_world/2024_10_27_00_command.sql\n create mode 100644 data/sql/custom/db_world/2024_10_31_creature_template_wander_nodes.sql\n create mode 100644 data/sql/custom/db_world/2024_11_01_creature_template_wander_nodes.sql\n create mode 100644 data/sql/custom/db_world/2024_11_04_creature_template_wander_nodes.sql\n create mode 100644 data/sql/custom/db_world/2024_11_05_creature_template_wander_nodes.sql\n create mode 100644 data/sql/custom/db_world/2024_11_07_creature_template_wander_nodes.sql\n create mode 100644 data/sql/custom/db_world/2024_11_11_00_npc_text.sql\n create mode 100644 data/sql/custom/db_world/2024_11_11_01_npc_text.sql\n create mode 100644 data/sql/custom/db_world/2024_11_13_00_npc_text.sql\n create mode 100644 data/sql/custom/db_world/2026_01_07_creature_template_wander_nodes.sql\n create mode 100644 data/sql/custom/db_world/2026_01_15_00_npc_text.sql\n create mode 100644 data/sql/custom/db_world/2026_03_12_creature_template_wander_nodes.sql\n create mode 100644 data/sql/custom/db_world/2026_03_28_00_command.sql\n create mode 100644 src/server/game/AI/NpcBots/bot_Events.h\n create mode 100644 src/server/game/AI/NpcBots/bot_GridNotifiers.h\n create mode 100644 src/server/game/AI/NpcBots/bot_InstanceEvents.h\n create mode 100644 src/server/game/AI/NpcBots/bot_ai.cpp\n create mode 100644 src/server/game/AI/NpcBots/bot_ai.h\n create mode 100644 src/server/game/AI/NpcBots/bot_archmage_ai.cpp\n create mode 100644 src/server/game/AI/NpcBots/bot_bm_ai.cpp\n create mode 100644 src/server/game/AI/NpcBots/bot_crypt_lord_ai.cpp\n create mode 100644 src/server/game/AI/NpcBots/bot_dark_ranger_ai.cpp\n create mode 100644 src/server/game/AI/NpcBots/bot_death_knight_ai.cpp\n create mode 100644 src/server/game/AI/NpcBots/bot_dreadlord_ai.cpp\n create mode 100644 src/server/game/AI/NpcBots/bot_druid_ai.cpp\n create mode 100644 src/server/game/AI/NpcBots/bot_hunter_ai.cpp\n create mode 100644 src/server/game/AI/NpcBots/bot_mage_ai.cpp\n create mode 100644 src/server/game/AI/NpcBots/bot_necromancer_ai.cpp\n create mode 100644 src/server/game/AI/NpcBots/bot_paladin_ai.cpp\n create mode 100644 src/server/game/AI/NpcBots/bot_priest_ai.cpp\n create mode 100644 src/server/game/AI/NpcBots/bot_rogue_ai.cpp\n create mode 100644 src/server/game/AI/NpcBots/bot_sea_witch_ai.cpp\n create mode 100644 src/server/game/AI/NpcBots/bot_shaman_ai.cpp\n create mode 100644 src/server/game/AI/NpcBots/bot_spellbreaker_ai.cpp\n create mode 100644 src/server/game/AI/NpcBots/bot_sphynx_ai.cpp\n create mode 100644 src/server/game/AI/NpcBots/bot_warlock_ai.cpp\n create mode 100644 src/server/game/AI/NpcBots/bot_warrior_ai.cpp\n create mode 100644 src/server/game/AI/NpcBots/botcommands.cpp\n create mode 100644 src/server/game/AI/NpcBots/botcommon.h\n create mode 100644 src/server/game/AI/NpcBots/botconfig.cpp\n create mode 100644 src/server/game/AI/NpcBots/botconfig.h\n create mode 100644 src/server/game/AI/NpcBots/botdatamgr.cpp\n create mode 100644 src/server/game/AI/NpcBots/botdatamgr.h\n create mode 100644 src/server/game/AI/NpcBots/botdefine.h\n create mode 100644 src/server/game/AI/NpcBots/botdpstracker.cpp\n create mode 100644 src/server/game/AI/NpcBots/botdpstracker.h\n create mode 100644 src/server/game/AI/NpcBots/botdump.cpp\n create mode 100644 src/server/game/AI/NpcBots/botdump.h\n create mode 100644 src/server/game/AI/NpcBots/botgearscore.cpp\n create mode 100644 src/server/game/AI/NpcBots/botgearscore.h\n create mode 100644 src/server/game/AI/NpcBots/botgiver.cpp\n create mode 100644 src/server/game/AI/NpcBots/botgossip.h\n create mode 100644 src/server/game/AI/NpcBots/botlog.cpp\n create mode 100644 src/server/game/AI/NpcBots/botlog.h\n create mode 100644 src/server/game/AI/NpcBots/botmgr.cpp\n create mode 100644 src/server/game/AI/NpcBots/botmgr.h\n create mode 100644 src/server/game/AI/NpcBots/botspell.cpp\n create mode 100644 src/server/game/AI/NpcBots/botspell.h\n create mode 100644 src/server/game/AI/NpcBots/bottext.h\n create mode 100644 src/server/game/AI/NpcBots/botwanderful.cpp\n create mode 100644 src/server/game/AI/NpcBots/botwanderful.h\n create mode 100644 src/server/game/AI/NpcBots/bpet_ai.cpp\n create mode 100644 src/server/game/AI/NpcBots/bpet_ai.h\n create mode 100644 src/server/game/AI/NpcBots/bpet_archmage.cpp\n create mode 100644 src/server/game/AI/NpcBots/bpet_crypt_lord.cpp\n create mode 100644 src/server/game/AI/NpcBots/bpet_dark_ranger.cpp\n create mode 100644 src/server/game/AI/NpcBots/bpet_death_knight.cpp\n create mode 100644 src/server/game/AI/NpcBots/bpet_dreadlord.cpp\n create mode 100644 src/server/game/AI/NpcBots/bpet_druid.cpp\n create mode 100644 src/server/game/AI/NpcBots/bpet_hunter.cpp\n create mode 100644 src/server/game/AI/NpcBots/bpet_mage.cpp\n create mode 100644 src/server/game/AI/NpcBots/bpet_necromancer.cpp\n create mode 100644 src/server/game/AI/NpcBots/bpet_priest.cpp\n create mode 100644 src/server/game/AI/NpcBots/bpet_sea_witch.cpp\n create mode 100644 src/server/game/AI/NpcBots/bpet_shaman.cpp\n create mode 100644 src/server/game/AI/NpcBots/bpet_warlock.cpp\n create mode 100644 src/server/game/AI/NpcBots/lib/botlogtraits.h\n create mode 100644 src/server/game/AI/NpcBots/lib/bottraits.h\n\ndiff --git a/.github/README.md b/.github/README.md\nindex 3a9e654d62..40df42cc3e 100644\n--- a/.github/README.md\n+++ b/.github/README.md\n@@ -1,20 +1,12 @@\n # ![logo](https://raw.githubusercontent.com/azerothcore/azerothcore.github.io/master/images/logo-github.png) AzerothCore\n \n [![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg)](CODE_OF_CONDUCT.md)\n-[![CodeFactor](https://www.codefactor.io/repository/github/azerothcore/azerothcore-wotlk/badge)](https://www.codefactor.io/repository/github/azerothcore/azerothcore-wotlk)\n-[![StackOverflow](http://img.shields.io/badge/stackoverflow-azerothcore-blue.svg?logo=stackoverflow)](https://stackoverflow.com/questions/tagged/azerothcore?sort=newest \"Ask / browse questions here\")\n-[![Discord](https://img.shields.io/discord/217589275766685707?logo=discord&logoColor=white)](https://discord.gg/gkt4y2x \"Our community hub on Discord\")\n-[![Bounties on BountyHub](https://img.shields.io/badge/Bounties-on%20BountyHub-yellow)](https://www.bountyhub.dev/bounties?repo=azerothcore)\n-\n ## Build Status\n \n-[![nopch-build](https://github.com/azerothcore/azerothcore-wotlk/actions/workflows/core-build-nopch.yml/badge.svg?branch=master)](https://github.com/azerothcore/azerothcore-wotlk/actions/workflows/core-build-nopch.yml?query=branch%3Amaster)\n-[![pch-build](https://github.com/azerothcore/azerothcore-wotlk/actions/workflows/core-build-pch.yml/badge.svg?branch=master)](https://github.com/azerothcore/azerothcore-wotlk/actions/workflows/core-build-pch.yml?query=branch%3Amaster)\n-[![core-modules-build](https://github.com/azerothcore/azerothcore-wotlk/actions/workflows/core_modules_build.yml/badge.svg?branch=master)](https://github.com/azerothcore/azerothcore-wotlk/actions/workflows/core_modules_build.yml?query=branch%3Amaster)\n-[![windows-build](https://github.com/azerothcore/azerothcore-wotlk/actions/workflows/windows_build.yml/badge.svg?branch=master)](https://github.com/azerothcore/azerothcore-wotlk/actions/workflows/windows_build.yml?query=branch%3Amaster)\n-[![macos-build](https://github.com/azerothcore/azerothcore-wotlk/actions/workflows/macos_build.yml/badge.svg?branch=master)](https://github.com/azerothcore/azerothcore-wotlk/actions/workflows/macos_build.yml?query=branch%3Amaster)\n-[![docker-build](https://github.com/azerothcore/azerothcore-wotlk/actions/workflows/docker_build.yml/badge.svg?branch=master)](https://github.com/azerothcore/azerothcore-wotlk/actions/workflows/docker_build.yml?query=branch%3Amaster)\n-[![tools-build](https://github.com/azerothcore/azerothcore-wotlk/actions/workflows/tools_build.yml/badge.svg?branch=master)](https://github.com/azerothcore/azerothcore-wotlk/actions/workflows/tools_build.yml?query=branch%3Amaster)\n+3.3.5\n+:------------:\n+[![nopch-build](https://github.com/trickerer/AzerothCore-wotlk-with-NPCBots/actions/workflows/core-build-nopch.yml/badge.svg?branch=npcbots_3.3.5)](https://github.com/trickerer/AzerothCore-wotlk-with-NPCBots/actions/workflows/core-build-nopch.yml)\n+[![windows-build](https://github.com/trickerer/AzerothCore-wotlk-with-NPCBots/actions/workflows/windows_build.yml/badge.svg)](https://github.com/trickerer/AzerothCore-wotlk-with-NPCBots/actions/workflows/windows_build.yml)\n [![dashboard-ci](https://github.com/azerothcore/azerothcore-wotlk/actions/workflows/dashboard-ci.yml/badge.svg?branch=master)](https://github.com/azerothcore/azerothcore-wotlk/actions/workflows/dashboard-ci.yml?query=branch%3Amaster)\n \n ## Introduction\n@@ -23,55 +15,42 @@ AzerothCore is an open-source game server application and framework designed for\n \n The original code is based on MaNGOS, TrinityCore, and SunwellCore and has since then had extensive development to improve stability, in-game mechanics, and modularity to the game. AC has also grown into a community-driven project with a significant number of contributors and developers. It is written in C++ and provides a solid foundation for creating private servers that mimic the mechanics and behavior of the official WoW servers.\n \n-## Philosophy\n-\n-Our main goal is to create a playable game server, offering a fully working in-game experience.\n-\n-Here are the main points we focus on:\n-\n-* Stability\n-  * We make sure all changes pass the CIs before being merged into the master branch.\n+[NPCBots](https://github.com/trickerer/Trinity-Bots) is AzerothCore mod.\n \n-* Blizzlike content\n-  * We strive to make all in-game content to be blizzlike. Therefore we have a high standard for fixes being made.\n \n-* Customization\n-  * It is easy to customize your experience using [modules](#modules).\n+## Installation\n \n-* Community driven\n-  * AzerothCore has an active community of developers, contributors, and users who collaborate, share knowledge, and provide support through forums, Discord channels, and other communication platforms. \n+Installation instructions are available [here](http://www.azerothcore.org/wiki/Installation).\n \n-### Modules\n+NPCBots installation guide is available in the [NPCBots Readme](https://github.com/trickerer/Trinity-Bots#npcbot-mod-installation).\n \n-AzerothCore is designed to be highly modular, allowing developers to extend and customize the game to suit their preferences or create unique gameplay experiences. This flexibility enables the addition of custom features, content, and modifications.\n \n-We have a lot of modules already made by the community, many of which can be found in the [Module Catalogue](https://www.azerothcore.org/catalogue.html#/).\n+## Support\n \n-## Installation\n+AzerothCore self-made wiki probably has a lot of answers for you.\n \n-Detailed installation instructions are available [here](http://www.azerothcore.org/wiki/installation).\n+For help requests, it is recommended to ask your question on [StackOverflow](https://stackoverflow.com/questions/tagged/azerothcore) and link it in [our chat](https://discordapp.com/channels/217589275766685707/284406375495368704).\n \n-## Contributing\n \n-AzerothCore can also serve as a learning resource for aspiring developers who want to understand how WoW servers work, how MMORPGs are structured, how game server emulators are created, or to improve their C++ and SQL knowledge.\n+## Reporting issues\n \n-If you want to contribute to the project, you will find a lot of resources that will guide you in our [wiki](https://www.azerothcore.org/wiki/contribute).\n+NPCBots issues can be reported via the [Github issue tracker](https://github.com/trickerer/Trinity-Bots/issues/).\n \n-We also recommend you read our [Contributor Covenant Code of Conduct](https://github.com/azerothcore/azerothcore-wotlk/blob/master/.github/CODE_OF_CONDUCT.md).\n+Please take the time to review existing issues before submitting your own to\n+prevent duplicates.\n \n-Feel free to join our [Discord server](https://discord.gg/gkt4y2x).\n \n-Click on the \"⭐ Star\" button to help us gain more visibility on Github!\n+## Submitting fixes\n \n-## Authors & Contributors\n+C++ fixes are submitted as [pull requests](https://github.com/trickerer/Azerothcore-wotlk-with-NPCBots/pulls).\n \n-The project was born in 2016 based on SunwellCore. Unfortunately, SunwellCore was published without any git history, so on git there are no credits for all the contributors before 2016.\n \n You can check the [authors](https://github.com/azerothcore/azerothcore-wotlk/blob/master/AUTHORS) file for more details.\n \n ## Important Links\n \n-- [Doxygen documentation](https://www.azerothcore.org/pages/doxygen/index.html)\n+- [NPCBots Readme](https://github.com/trickerer/Trinity-Bots/)\n+\n - [Website](http://www.azerothcore.org/)\n - [AzerothCore catalogue](http://www.azerothcore.org/catalogue.html  \"Modules, tools, and other stuff for AzerothCore\") (modules, tools, etc...)\n - [Our Discord server](https://discord.gg/gkt4y2x)\n@@ -88,6 +67,6 @@ It's important to note that AzerothCore is not an official Blizzard Entertainmen\n \n ## Special thanks\n \n-[JetBrains](https://www.jetbrains.com/?from=AzerothCore) is providing free [open-source licenses](https://www.jetbrains.com/community/opensource/) to the AzerothCore developers.\n+It's important to note that AzerothCore is not an official Blizzard Entertainment product, and it is not affiliated with or endorsed by World of Warcraft or Blizzard Entertainment. AzerothCore does not in any case sponsor nor support illegal public servers. If you use this project to run an illegal public server and not for testing and learning it is your own personal choice.\n \n [![JetBrains logo.](https://resources.jetbrains.com/storage/products/company/brand/logos/jetbrains.svg)](https://jb.gg/OpenSourceSupport)\ndiff --git a/.github/workflows/core-build-nopch.yml b/.github/workflows/core-build-nopch.yml\nindex 56f0a6a2d8..99db6825b0 100644\n--- a/.github/workflows/core-build-nopch.yml\n+++ b/.github/workflows/core-build-nopch.yml\n@@ -2,7 +2,8 @@ name: nopch-build\n on:\n   push:\n     branches:\n-      - 'master'\n+      - 'npcbots_3.3.5'\n+      - 'CI'\n   pull_request:\n     types:\n       - opened\n@@ -44,7 +45,7 @@ jobs:\n               CXX: g++-14\n     runs-on: ${{ matrix.os }}\n     name: ${{ matrix.os }}-${{ matrix.compiler.CC }}-nopch\n-    if: github.repository == 'azerothcore/azerothcore-wotlk' && !github.event.pull_request.draft\n+    if: github.repository == 'trickerer/AzerothCore-wotlk-with-NPCBots' && !github.event.pull_request.draft\n     steps:\n       - uses: actions/checkout@v4\n       - uses: ./.github/actions/linux-build\ndiff --git a/.github/workflows/windows_build.yml b/.github/workflows/windows_build.yml\nindex c23c87be1c..f4a4faa5ca 100644\n--- a/.github/workflows/windows_build.yml\n+++ b/.github/workflows/windows_build.yml\n@@ -2,7 +2,8 @@ name: windows-build\n on:\n   push:\n     branches:\n-      - 'master'\n+      - 'npcbots_3.3.5'\n+      - 'CI'\n   pull_request:\n     types:\n       - labeled\n@@ -29,10 +30,7 @@ jobs:\n     name: ${{ matrix.os }}\n     env:\n       BOOST_ROOT: C:\\local\\boost_1_82_0\n-    if: |\n-      github.repository == 'azerothcore/azerothcore-wotlk'\n-      && !github.event.pull_request.draft\n-      && (github.ref == 'refs/heads/master' || contains(github.event.pull_request.labels.*.name, 'run-build') || github.event.label.name == 'run-build')\n+    if: github.repository == 'trickerer/AzerothCore-wotlk-with-NPCBots' && !github.event.pull_request.draft\n     steps:\n       - uses: actions/checkout@v4\n       - name: ccache\ndiff --git a/.gitignore b/.gitignore\nindex dff3ed7be1..3c2d6b476d 100644\n--- a/.gitignore\n+++ b/.gitignore\n@@ -107,3 +107,7 @@ local.properties\n #  !modules/yourmodule\n #\n # ==================\n+\n+#NPCBots\n+!/data/sql/custom/db_characters/\n+!/data/sql/custom/db_world/\ndiff --git a/data/sql/Bots/locales/deDE/npc_text_locale.sql b/data/sql/Bots/locales/deDE/npc_text_locale.sql\nnew file mode 100644\nindex 0000000000..d2a6f6be4c\n--- /dev/null\n+++ b/data/sql/Bots/locales/deDE/npc_text_locale.sql\n@@ -0,0 +1,409 @@\n+DELETE FROM `npc_text_locale` WHERE `Locale`='deDE' AND `ID` BETWEEN '70000' AND '71000';\n+INSERT INTO `npc_text_locale` (`ID`, `Locale`, `Text0_0`, `Text0_1`, `Text1_0`, `Text1_1`, `Text2_0`, `Text2_1`, `Text3_0`, `Text3_1`, `Text4_0`, `Text4_1`, `Text5_0`, `Text5_1`, `Text6_0`, `Text6_1`, `Text7_0`, `Text7_1`)\n+VALUES\n+('70001','deDE','Ich lebe nur um dem Meister zu dienen.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70002','deDE','Brauchst du etwas?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70003','deDE','Sterbliche... Normalerweise töte ich Abschaum wie euch auf den ersten Blick.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70004','deDE','<Du siehst etwas, das ein Obsidian-Zerstörer sein soll. Dieser sieht jedoch anders aus, beschädigt und verblasst, und er reagiert nicht auf deine Anwesenheit. Du erinnerst dich, dass die Geißel irgendwann in der Vergangenheit ihre eigenen Versionen davon benutzt haben. Wie zum Teufel ist es hierher gekommen? Nach einer weiteren Untersuchung bemerkst du eine Öffnung auf dem Rücken der Kreatur.>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70005','deDE','<Obsidischan-Zerstörer starrt dich an und gibt ein leises Knurren von sich.>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70006','deDE','Bist du überrascht, Sterblicher? Als unbedeutenderer Nathrezim muss ich mir Verbündete suchen. Du siehst aus, als könntest du mich zumindest unterhalten.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70007','deDE','Was ist es diesmal, Sterblicher?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70008','deDE','Kannst du mich einfach in Ruhe lassen? <seufz>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70009','deDE','Was nun?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70010','deDE','<Du siehst eine ausgemergelte Naga-Matrone. Sie sieht müde und schwach aus und vermeidet es, dich anzusehen.>$B$BS-s-s-spare die Worte, Sterblicher...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70011','deDE','Habe ich wieder meine Haare durcheinander gebracht? <Sie bürstet ihr \"Haar\">$B...Nein, habe ich nicht. Was ist es dann?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70012','deDE','<Der vom Kampf vernarbte Gruftlord steht vor dir, er ist offensichtlich unkontrolliert. Ohne seinen Meister hat dieser mächtige untote nerubische Fürst den größten Teil seiner Macht verloren>$B$BWas wird es sein, kleine Kreatur? Dein Fleisch wird wie jedes andere sein...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70013','deDE','Ich verzehre die Lebenden und die Toten.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70101','deDE','|cffff3300Klingenmeister|r$b|cffdd6600-=Warcraft III Tribut=-|r$B$B \"Ein Elite-Schwertkämpfer, ehemaliges Mitglied des Clans der Brennenden Klinge, jetzt ein Elite-Kämpfer der Horde\".$B$BHauptattribut: Beweglichkeit.$B$BNetherlauf (Windlauf). Ermöglicht es dem Blademaster, unsichtbar zu werden und sich für eine bestimmte Zeit schneller zu bewegen. Wenn der Klingenmeister eine Einheit angreift, um die Unsichtbarkeit zu durchbrechen, verursacht er zusätzlichen Schaden.$B$BSpiegelbild. Verwirrt den Feind, indem er Illusionen des Klingenmeisters erzeugt und alle auf den Klingenmeister wirkende Zauber bannt.$B$BKritischer Schlag (passiv). Gewährt eine 15%ige Chance, mit seinen Angriffen das 2(3,4)-fache des normalen Schadens als kritisch zu verursachen.$B$BKlingensturm (NYI). Gewährt Immunität gegen Magie und fügt allen umstehenden Feinden Schaden zu.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70102','deDE','|cff9900ccObsidian Zerstörer|r$b|cffdd6600-=Warcraft III Tribut=-|r$B$B \"Ein geflügeltes Monstrum aus Obsidian mit unstillbarem Hunger nach Magie\". $B$BHohe Rüstung, sehr hohe Resistenzen, teilweise immun gegen Magie, verliert mit der Zeit Mana und profitiert nicht von passiven Manaregenerationseffekten, Kettenhemd/Plattenrüstung, zwei Zauberstäbe, verursacht Schattenzauber-Schaden, kein physischer Angriff, kann keine Gegner angreifen, die sich nicht in der Nähe befinden, während er sich bewegt, Zauberkraft-Bonus: 50% Angriffskraft + 200% Intellekt + Zauberstab-Schaden.$B$BMagie verschlingen. Entfernt bis zu 2 magische Effekte von Gegnern, bis zu 2 magische Effekte und bis zu 2 Flüche von Verbündeten und Schaden verursachende beschworene Einheiten im Umkreis von 20 Metern. Jeder gebannte Effekt stellt 20% Mana und 5% Gesundheit wieder her, 7 Sekunden Abklingzeit.$B$BSchattenschlag. Verstärkter Angriff, der erhöhten Splash-Schaden verursacht.$B$BMana entziehen. Entzieht einer zufälligen befreundeten Einheit das gesamte Mana (begrenzt durch den Manapool des Zaubernden).$B$BMana auffrischen. Versorgt umstehende Gruppen- und Schlachtzugsmitglieder im Umkreis von 25 Metern mit 3% ihres maximalen Manas, wobei das Mana des Zaubernden annulliert wird, 3 Sekunden Abklingzeit.$B$BRegenerierende Aura. Heilt Gruppen- und Schlachtzugsmitglieder im Umkreis von 25 Metern um 3% ihrer maximalen Gesundheit und macht das Mana des Zaubernden zunichte, 3 Sekunden Abklingzeit.$B$BSchattenrüstung (passiv). Stellt Mana in Höhe eines Prozentsatzes des erlittenen Schadens wieder her.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70103','deDE','|cff0000ddErzmagier|r$b|cffdd6600-=Warcraft III Tribut=-|r$B$BSZauberschaden um 35% reduziert, teilweise immun gegen Kontrolleffekte, Stoffrüstung, verursacht Feuerzauber/Frostzauber Schaden, kein physischer Angriff, Zaubermachtbonus: 100% Intelligenz. Hauptattribut: Intelligenz.$B$BBlizzard. Ein typischer Blizzard, nur etwas mächtiger, 6 Sekunden Abklingzeit.$B$BWasserelementar beschwören. Beschwört ein Wasserelementar, das die Feinde des Erzmagiers 1 Minute lang angreift, 20 Sekunden Abklingzeit.$B$BBrillianz Aura. Erhöht das maximale Mana um 10% und erhöht die Manaregeneration von Gruppen- und Schlachtzugsmitgliedern im Umkreis von 40 Metern erheblich.$B$BMassenteleport. NYI.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70104','deDE','|cff9900ccSchreckenslord|r$b|cffdd6600-=Warcraft III Tribut=-|r$B$B\"|Unglaublich mächtiger Dämon, der die Macht der Finsternis und geistige Beherrschung ausübt\".$B$BHohe Rüstung, hohe Resistenzen, teilweise immun gegen Kontrolleffekte, erlittener Schaden beschleunigt die Wiederaufladung von Zaubern, Plattenrüstung, verursacht Nahkampf-/Schattenzauberschaden, Bonusschaden gegen kampfunfähige Ziele, Bonus auf Zaubermacht: 200% Stärke. Hauptattribut: Stärke.$B$BAasschwarm. Schickt eine Horde Fledermäuse in Kombination mit Chaos Magie, um Gegnern in einem sehr großen Frontalkegel Schaden zuzufügen, kann nicht kritisch sein, 10 Sekunden Abklingzeit.$B$BSchlaf. Versetzt das gegnerische Ziel für 60 Sekunden in Schlaf und ermöglicht es, dass der nächste physische Angriff auf dieses Ziel die Rüstung umgeht, direkter verursachter Schaden weckt das Ziel auf, 6 Sekunden Abklingzeit.$B$BVampirische Aura. Erhöht physischen kritischen Schaden um 5% und heilt Gruppen- und Schlachtzugsmitglieder im Umkreis von 40 Metern um einen bestimmten Prozentsatz (100% für den Schreckenslord und 25% für alle anderen) des durch physische Nahkampfangriffe und Aasschwarm verursachten Schadens, keine Bedrohung.$B$BSBeschwörung eines Höllendieners. Ruft einen Höllendiener vom Himmel, der Schaden verursacht und gegnerische Einheiten betäubt. Der Höllendiener ist sehr resistent gegen Magie und hält 180 Sekunden lang, 180 Sekunden Abklingzeit.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70105','deDE','|cff0000ddZauberbrecher|r$b|cffdd6600-=Warcraft III Tribut=-|r$B$B\"Ein elfischer Krieger, der darauf trainiert ist, magische Energien zu unterbrechen und zu verzerren\".$B$BSZauberschaden um 75% reduziert, teilweise immun gegen Kontrolleffekte, Rüstungsabzug -30%, Ketten-/Panzerrüstung, verursacht Nahkampf-/Arkanschaden, Zaubermachtbonus: 200% Stärke. Hauptattribut: Stärke.$B$BMagie stehlen (Zauberraub). Stiehlt einem Feind einen nützlichen Zauber und wendet ihn auf einen Verbündeten in der Nähe an oder entfernt einen negativen Zauber von einem Verbündeten und wendet ihn auf einen Feind in der Nähe an, wirkt auf Magie- und Fluch-Effekte, 2 Sekunden Abklingzeit.$B$BRückkopplung (passiv). Erfolgreiche Nahkampfangriffe verbrennen das Mana des Ziels in Höhe des verursachten Schadens (erhöht durch Zaubermacht) und verursachen arkanen Schaden. Wenn das Mana des Ziels aufgebraucht ist, verursachen die Nahkampfangriffe von Zauberbrecher dreifachen Schaden mit erhöhter Chance auf einen kritischen Treffer. Wenn das Ziel kein Mana hat, erhält der Zauberbrecher Mana in Höhe von 25% des verursachten Schadens.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70106','deDE','|cff9900ccDunkler Waldläufer|r$b|cffdd6600-=Warcraft III Tribut=-|r$B$B\"Ein ehemaliger Waldläufer von Quel Thalas, der gewaltsam von den Toten auferweckt wurde.\"$B$BSZauberschaden um 35% reduziert, untot, teilweise immun gegen Kontrolleffekte, Leder-/Stoffrüstung, verursacht physischen/zauberhaften Schattenschaden, haftet an Schatten und stellt keine Bedrohung dar, Zauberkraftbonus: 50% Intelligenz. Hauptattribut: Beweglichkeit.$B$BStille. Bringt einen Gegner und bis zu 4 Ziele in der Nähe 8 Sekunden lang zum Schweigen, 15 Sekunden Abklingzeit.$B$BBSchwarzer Pfeil. Feuert einen verfluchten Pfeil ab, der 150% Waffenschaden und zusätzlichen Schattenzauberschaden über Zeit verursacht. Wenn das betroffene Ziel durch den Schaden des dunklen Waldläufers stirbt, spawnen aus der Leiche dunkle Schergen (maximal 5 Schergen, 80 Sekunden Dauer, funktioniert nur bei Humanoiden, Bestien und Drachenkin). Verursacht fünfmal mehr Schaden, wenn das Ziel weniger als 20% Gesundheit hat.$B$BLebensentzug. Entzieht einem Feind 5 Sekunden lang jede Sekunde Leben und heilt den dunklen Waldläufer für 200% der entzogenen Menge.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70107','deDE','|cff9900ccTotenbeschwörer|r$b|cffdd6600-=Warcraft III / Diablo II Tribut=-|r$B$BSZauberschaden um 20% reduziert, teilweise immun gegen Kontrolleffekte, Stoffrüstung, verursacht Zauberschattenschaden, kein physischer Angriff, Zaubermachtbonus: 100% Intelligenz. Hauptattribut: Intelligenz.$B$BRaise Dead. Erweckt 2 Skelette aus einer Leiche (maximal 6 Skelette, 65 Sekunden Dauer, funktioniert nur bei Humanoiden, Bestien und Drachenkin).$B$BUnheilige Raserei. Erhöht das Nahkampfangriffstempo des Ziels um 75%, entzieht ihm aber ständig Lebenspunkte. Hält 45 Sekunden lang an. Kann nicht abgebrochen werden. Wird auf Stufe 30 freigeschaltet.$B$BCorpse Explosion. Lässt eine Leiche explodieren und fügt allen umstehenden Gegnern Schaden in Höhe von 35% bis 75% der maximalen Lebenspunkte der toten Einheit zu (abhängig von der Stufe des Nekromanten). Dieser Schaden erzeugt keine Bedrohung. Wird auf Stufe 40 freigeschaltet.$B$BCVerkrüppeln. Verringert das Bewegungstempo, das Nahkampfangriffstempo und die Gesamtstärke des Ziels 60 Sekunden lang um 50%. Wird auf Stufe 50 freigeschaltet.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70108','deDE','|cff0000ddMeereshexe|r$b|cffdd6600-=Warcraft III Tribut=-|r$B$B\"Eine bösartige, schuppige Meeresbewohnerin, die oft mit dem Aufkommen gewaltiger Stürme in Verbindung gebracht wird.\" $B$BSZauberschaden um 30% reduziert, teilweise immun gegen Kontrolleffekte, Stoffrüstung, verursacht physischen Schaden, Zauberfrost und Zaubersturm, Angriffskraftbonus: Beweglichkeit x2, Zauberkraftbonus: 200% Intelligenz. Hauptattribut: Intelligenz.$B$BGabelblitzschlag. Ruft einen Blitzkegel herbei, um Feinden Schaden zuzufügen. Trifft 2 bis alle Ziele (je nach Stufe der Meerhexe) und betäubt sie 2 Sekunden lang. Dieser Schaden erzeugt keine Bedrohung.$B$BFrostpfeile. Durchtränkt Pfeile mit Frostzauber für zusätzlichen Schaden und verlangsamt die Bewegungs-, Angriffs- und Wirkgeschwindigkeit des Ziels um 30% bis 70% (abhängig von der Stufe der Meereshexe).$B$BMana-Schild. Erzeugt einen Schild, der 100% des eingehenden (nicht gemilderten) Schadens absorbiert, indem er das Mana der Meerhexe verwendet. Die Wirkung reicht von 1 Schaden pro 10 Mana bis 10 Schaden pro 1 Mana (je nach Stufe der Meereshexe).$B$BTornado. Beschwört einen heftigen Tornado, der gegnerische Einheiten in der Nähe beschädigt und verlangsamt, manchmal sogar komplett außer Gefecht setzt. Der Tornado wächst im Freien mit der Zeit und erhöht den verursachten Schaden und den Wirkungsbereich, schrumpft aber in geschlossenen Räumen und löst sich schnell auf. Wird auf Stufe 60 freigeschaltet.$B$BNaga (Passiv). Schwimmgeschwindigkeit, Schaden und Ausweichchance werden im Wasser stark erhöht.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70109','deDE','|cff9900ccGruftlord|r$b|cffdd6600-=Warcraft III Tribut=-|r$B$B\"Uraltes Ungetüm, einst einer der Könige von Azjol-Nerub, jetzt ein untotes Monster in den Reihen der mächtigsten Krieger des Lichkönigs\".$B$BSehr hohe Rüstung, erhöhte Resistenzen, teilweise immun gegen Steuerungseffekte, immun gegen Gifteffekte, Kettenhemd/Plattenrüstung, verursacht Nahkampf-/Zauberschattenschaden, Zauberkraftbonus: 200% Stärke. Hauptattribut: Stärke.$B$BImpale. Der Gruftlord schlägt mit seinen massiven Klauen auf den Boden und schießt Stacheln in einem frontalen Kegel aus, die Schaden verursachen und feindliche Einheiten in die Luft schleudern, um sie zu betäuben. Wird auf Stufe 20 freigeschaltet.$B$BSpitzenpanzer. Der Chitinpanzer des Crypt Lords erhöht die Schadensresistenz und fügt gegnerischen Nahkämpfern 15% bis 50% Schaden zu.$B$BAaskäfer. Der Gruftlord generiert aus der frischen Leiche eines Feindes einen Aaskäfer, der seine Feinde angreift. Die Käfer sind permanent, regenerieren aber keine Gesundheit und es können nur 6 gleichzeitig kontrolliert werden. Höhere Stufen erlauben es dem Gruftlord, mächtigere Käfer zu beschwören. Wird auf Stufe 10 freigeschaltet.$B$BLKäferschwarm. Der Gruftlord lässt einen Schwarm von 20-40 (hängt von der Stufe des Crypt Lords ab) wütenden Heuschrecken frei, die in der Nähe befindliche feindliche Einheiten beißen und zerreißen, wodurch deren Bewegungs- und Angriffsfähigkeit eingeschränkt wird. Während sie das gegnerische Fleisch verzehren, wandeln sie es in eine Substanz um, die dem Gruftlord bei seiner Rückkehr Trefferpunkte zurückgibt. Wird auf Stufe 40 freigeschaltet.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70201','deDE','Es gibt immer Leute, die bereit sind, für Geld zu töten.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70202','deDE','Söldner sind immer gefragt. Hier ist, was im Moment verfügbar ist:',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70203','deDE','Söldner sind immer gefragt. Hier ist, was im Moment verfügbar ist:',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70204','deDE','Im Moment scheint niemand verfügbar zu sein, schauen Sie später noch einmal nach.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70300','deDE','Stirb!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70301','deDE','Belebe dich wieder',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70302','deDE','Wiederbelebe  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70303','deDE','dein bot',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70304','deDE',' Bot',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70305','deDE','Ich kann noch kein Wasser herbeizaubern',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70306','deDE','Ich kann noch kein Essen herbeizaubern',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70307','deDE','Ich kann das jetzt nicht tun',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70308','deDE','Bitte sehr...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70309','deDE','Deaktiviert',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70310','deDE','Noch nicht bereit',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70311','deDE','Ungültiger Objekttyp',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70312','deDE','Fehlgeschlagen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70313','deDE','Erledigt',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70314','deDE','Ich bin nicht gestaltgewandelt',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70315','deDE','Ich habe keinen Gesundheitsstein',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70316','deDE','Ich kann noch keine Gesundheitssteine erstellen!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70317','deDE','WTF Ich kann keine Schlösser knacken!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70318','deDE','Mein Fähigkeitslevel ist nicht hoch genug',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70319','deDE','Ich ändere meine Talente zu ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70320','deDE','Waffen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70321','deDE','Furor',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70322','deDE','Schutz',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70323','deDE','Vergeltung',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70324','deDE','Tierherrschaft',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70325','deDE','Treffsicherheit',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70326','deDE','Überleben',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70327','deDE','Meucheln',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70328','deDE','Kampf',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70329','deDE','Täuschung',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70330','deDE','Disziplin',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70331','deDE','Heilig',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70332','deDE','Schatten',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70333','deDE','Blut',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70334','deDE','Frost',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70335','deDE','Unheilig',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70336','deDE','Elementar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70337','deDE','Verstärkung',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70338','deDE','Wiederherstellung',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70339','deDE','Arkan',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70340','deDE','Feuer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70341','deDE','Gebrechen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70342','deDE','Dämonologie',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70343','deDE','Zerstörung',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70344','deDE','Gleichgewicht',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70345','deDE','Widlheit',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70346','deDE','Unbekannt',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70347','deDE','Verschwinde, Schwächling',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70348','deDE',' ist nicht überzeugt',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70349','deDE','Ich werde meine Zeit nicht mit irgendetwas verschwenden.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70350','deDE','NYI',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70351','deDE','NYI',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70352','deDE','NYI',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70353','deDE','Ich bin bereit',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70354','deDE','Geh weg. Ich diene meinem Herrn  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70355','deDE','unbekannt',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70356','deDE',' auf dich!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70357','deDE',' auf mich!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70358','deDE',' auf ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70359','deDE',' benutzt!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70360','deDE','bot tank',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70361','deDE','Klasse',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70362','deDE','Spieler',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70363','deDE','Meister',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70364','deDE','nichts',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70365','deDE','Rang',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70366','deDE','Talent',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70367','deDE','Passiv',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70368','deDE','versteckt',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70369','deDE','bekannt',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70370','deDE','Fähigkeit',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70371','deDE','Str',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70372','deDE','Bew',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70373','deDE','Aus',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70374','deDE','Int',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70375','deDE','Wil',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70376','deDE','unk stat',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70377','deDE','Gesamt',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70378','deDE','Nahkampf AP',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70379','deDE','Distanz AP',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70380','deDE','Rüstung',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70381','deDE','Krit',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70382','deDE','Verteidigung',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70383','deDE','Verfehlen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70384','deDE','Ausweichen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70385','deDE','Parrieren',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70386','deDE','Blocken',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70387','deDE','Blockwert',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70388','deDE','Schaden erhalten Nahkampf',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70389','deDE','Schaden erhalten Zauber',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70390','deDE','Schadensreichweite Waffenhand',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70391','deDE','Schadensmultiplikator Waffenhand',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70392','deDE','Angriffszeit Waffenahnd',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70393','deDE','Schadensreichweite Schildhand',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70394','deDE','Schadensmultiplikator Schildhand',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70395','deDE','Angriffszeit Schildhand',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70396','deDE','Schadensreichweite Distanz',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70397','deDE','SchadensmultiplikatorDistanz',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70398','deDE','Angriffszeit Distanz',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70399','deDE','min',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70400','deDE','max',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70401','deDE','DPS',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70402','deDE','Grundlegende HP',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70403','deDE','Gesamt HP',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70404','deDE','Grundlegendes Mana',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70405','deDE','Gesamt Mana',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70406','deDE','Aktuelles Mana',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70407','deDE','Zaubermacht',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70408','deDE','Leben alle 5 Sekunden bonus',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70409','deDE','Mana alle 5 Sekunden ohne Zaubern',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70410','deDE','Mana alle 5 Sekunden beim Zaubern',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70411','deDE','Tempo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70412','deDE','Trefferwertung',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70413','deDE','Waffenkunde',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70414','deDE','Rüstungsdurchschlag',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70415','deDE','Zauberdurchschlag',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70416','deDE','%',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70417','deDE','Heilig',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70418','deDE','Feuer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70419','deDE','Natur',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70420','deDE','Frost',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70421','deDE','Schatten',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70422','deDE','Arkan',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70423','deDE','Resistenz',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70424','deDE','Befehlszustand',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70425','deDE','Folgen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70426','deDE','Angreifen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70427','deDE','Warten',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70428','deDE','Zurücksetzen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70429','deDE','Vollständig stoppen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70430','deDE','Folgeabstand',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70431','deDE','Spezifikation',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70432','deDE','Hauptaufgabe des Bots',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70433','deDE','Bot Sammelrolle',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70434','deDE','PvP Tötungen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70435','deDE','Spieler',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70436','deDE','Gestorben ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70437','deDE',' mal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70438','deDE','%s (Bot) beruhigt sich wieder',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70439','deDE','<Debug>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70440','deDE','Bist du sicher, dass du es riskieren willst  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70441','deDE',' Aufmerksamkeit?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70442','deDE','<Geld einwerfen>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70443','deDE','Möchtest du anlocken ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70444','deDE','<Versuche ein Angebot zu machen>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70445','deDE','Möchtest du folgendes anheuern ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70446','deDE','<Bot anheuern>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70447','deDE','Ausrüstung verwalten...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70448','deDE','Rollen verwalten...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70449','deDE','Formation verwalten...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70450','deDE','Fähigkeiten verwalten...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70451','deDE','Talente verwalten...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70452','deDE','Verbrauchsgüter geben...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70453','deDE','<Gruppe erstellen>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70454','deDE','<Gruppe erstellen (alle Bots)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70455','deDE','<Zur Gruppe hinzufügen>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70456','deDE','<Alle Bots zur Gruppe hinzufügen>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70457','deDE','<Aus der Gruppe entfernen>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70458','deDE','Folge mir',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70459','deDE','Halte deine Position',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70460','deDE','Bleibe hier und tue nichts',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70461','deDE','Ich brauche Essen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70462','deDE','Ich brauche was zu trinken',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70463','deDE','Ich brauche einen gedeckten Tisch',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70464','deDE','Hilf mir ein Schloss zu knacken',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70465','deDE','Ich brauche einen Gesundheitsstein',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70466','deDE','Ich brauche einen Seelenbrunnen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70467','deDE','Frische deine Gifte auf',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70468','deDE','<Gift auswählen (Waffenhand)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70469','deDE','<Gift auswählen (Schildhand)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70470','deDE','Ich möchte Verzauberungen erneuern',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70471','deDE','<Verzauberung auswählen (Waffenhand)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70472','deDE','<Verzauberung auswählen (Schildhand)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70473','deDE','Entferne deine Gestaltwandlung',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70474','deDE','<Haustierart auswählen>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70475','deDE','Du bist entlassen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70476','deDE','Willst du aufgeben ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70477','deDE','Du wirst es vielleicht bereuen...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70478','deDE','Reiß dich zusammen, verdammt noch mal!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70479','deDE','<Studiere die Kreatur>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70480','deDE','Vergiss es',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70481','deDE','Distanz',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70482','deDE','ZURÜCK',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70483','deDE','<Automatisch>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70484','deDE','<Nichts>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70485','deDE','Zufällig (Gerissenheit)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70486','deDE','Zufällig (Wildheit)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70487','deDE','Zufällig (Zähigkeit)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70488','deDE','Zeig mir deine Ausrüstung',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70489','deDE','Automatisch anlegen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70490','deDE','Waffenhand',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70491','deDE','Schildhand',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70492','deDE','Distanz',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70493','deDE','Relikt',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70494','deDE','Kopf',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70495','deDE','Schultern',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70496','deDE','Brust',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70497','deDE','Tailie',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70498','deDE','Beine',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70499','deDE','Füße',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70500','deDE','Handgelenke',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70501','deDE','Hände',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70502','deDE','Rücken',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70503','deDE','Hemd',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70504','deDE','Finger 1',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70505','deDE','Finger 2',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70506','deDE','Schmuck 1',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70507','deDE','Schmuck 2',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70508','deDE','Hals',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70509','deDE','Alles ablegen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70510','deDE','Ausrüstung aktualisieren (nur Visuell)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70511','deDE','nur Visuell',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70512','deDE','Ausgerüstet',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70513','deDE','nichts',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70514','deDE','Verwende deine alte Ausrüstung',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70515','deDE','Ablegen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70516','deDE','Hm... Ich habe nichts, was ich dir geben könnte.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70517','deDE','Sammeln',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70518','deDE','Fähigkeiten Status',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70519','deDE','Erlaubte Fähigkeiten verwalten',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70520','deDE','Benutze ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70521','deDE','Aktualisieren',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70522','deDE','Schaden',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70523','deDE','Kontrolle',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70524','deDE','Heiler',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70525','deDE','Anderes',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70526','deDE',' macht ein knirschendes Geräusch und beginnt zu folgen  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70527','deDE','%s wird sich dir erst anschließen, wenn sein Besitzer ihn entlässt',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70528','deDE','%s wird sich dir erst anschließen, wenn du Stufe 60 erreicht hast.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70529','deDE','%s wird sich dir erst anschließen, wenn du Stufe 55 erreicht hast.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70530','deDE','%s wird sich dir erst anschließen, wenn du Stufe 40 erreicht hast.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70531','deDE','%s wird sich dir erst anschließen, wenn du Stufe 20 erreicht hast.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70532','deDE','Du hast die maximale Anzahl an Npcbots für dein Level überschritten (%u)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70533','deDE','Sie haben nicht genug Geld',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70534','deDE','Du kannst nicht mehr Bots dieser Klasse haben! %u von %u',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70535','deDE','Ausrüstung in Slot %u (%s) kann nicht zurückgesetzt werden! Bot kann nicht entlassen werden!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70536','deDE','aktuell',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70537','deDE','Angriffsdistanz',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70538','deDE','Angriffe aus kurzer Entfernung',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70539','deDE','Angriffe aus großer Entfernung',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70540','deDE','Exakt',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70541','deDE','Buff entfernen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70542','deDE','Lege deinen Krafttyp fest',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70543','deDE','Kann %s aus irgendeinem dummen Grund nicht ausrüsten! Versenden per Post',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70544','deDE','Tank',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70545','deDE','Distanz',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70546','deDE','Bergbauer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70547','deDE','Kräuterkundler',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70548','deDE','Kürschner',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70549','deDE','Ingenieur',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70550','deDE','Besitz des Bots abgelaufen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70551','deDE','Das NpcBot-System ist derzeit deaktiviert. Bitte kontaktiere die Administration.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70552','deDE','%s wird sich Ihnen nicht anschließen, hat bereits einen Meister: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70553','deDE','%s kann Ihnen nicht beitreten, wenn Sie sich teleportieren wollen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70554','deDE','Aspekt',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70555','deDE','des Affen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70556','deDE','des Falken',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70557','deDE','des Geparden',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70558','deDE','der Viper',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70559','deDE','des Wildtiers',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70560','deDE','des Rudels',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70561','deDE','der Wildnis',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70562','deDE','des Drachenfalken',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70563','deDE','kein Aspekt',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70564','deDE','Aura',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70565','deDE','der Hingabe',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70566','deDE','der Konzentration',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70567','deDE','des Feuerwiderstands',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70568','deDE','des Frostwiderstands',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70569','deDE','des Schattenwiderstands',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70570','deDE','der Vergeltung',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70571','deDE','des Kreuzfahrers',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70572','deDE','Keine Aura',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70573','deDE','Verkrüppelndes Gift',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70574','deDE','Sofort wirkendes Gift',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70575','deDE','Tödliches Gift',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70576','deDE','Wundgift',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70577','deDE','Gedankenbenebelndes Gift',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70578','deDE','Narkotisierendes Gift',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70579','deDE','Nichts',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70580','deDE','Flammenzunge',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70581','deDE','Frostbrand',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70582','deDE','Windzorn',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70583','deDE','Lebensgeister',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70584','deDE','Ich brauche deine Dienste',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70585','deDE','Du hast zuviele Bots',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70586','deDE','Möchtest du diesen Bot anheuern? ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70587','deDE',' ist im Moment etwas beschäftigt, versuchen Sie es später noch einmal.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70588','deDE','Ein Vergnügen, mit Ihnen Geschäfte zu machen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70589','deDE','Krieger',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70590','deDE','Paladine',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70591','deDE','Magier',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70592','deDE','Priester',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70593','deDE','Hexenmeister',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70594','deDE','Druiden',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70595','deDE','Todesritter',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70596','deDE','Schurken',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70597','deDE','Schamanen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70598','deDE','Jäger',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70599','deDE','Klingenmeister',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70600','deDE','Zerstörer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70601','deDE','Erzmagier',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70602','deDE','Schreckenslords',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70603','deDE','Zauberbrecher',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70604','deDE','Dunkle Waldläufer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70605','deDE','Krieger',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70606','deDE','Paladin',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70607','deDE','Magier',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70608','deDE','Priester',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70609','deDE','Hexenmeister',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70610','deDE','Druide',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70611','deDE','Todesritter',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70612','deDE','Schurke',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70613','deDE','Schamane',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70614','deDE','Jäger',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70615','deDE','Klingenmeister',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70616','deDE','Zerstörer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70617','deDE','Erzmagier',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70618','deDE','Schreckenslord',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70619','deDE','Zauberbrecher',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70620','deDE','Dunkler Waldläufer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70621','deDE','Männlich',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70622','deDE','Weiblich',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70623','deDE','Mensch',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70624','deDE','Orc',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70625','deDE','Zwerg',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70626','deDE','Nachtelf',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70627','deDE','Untote',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70628','deDE','Tauren',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70629','deDE','Gnom',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70630','deDE','Troll',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70631','deDE','Blutelf',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70632','deDE','Draenei',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70633','deDE','Unbekannt',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70634','deDE','Plündern',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70635','deDE','|cff9d9d9dSchlecht|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70636','deDE','|cffffffffGewöhnlich|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70637','deDE','|cff1eff00Außergewöhnlich|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70638','deDE','|cff0070ddSelten|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70639','deDE','|cffa335eeEpisch|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70640','deDE','|cffff8000Legendär|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70641','deDE','Kampfbeginn verhalten',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70642','deDE','Verzögerung des Angriffs um',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70643','deDE','Verzögerung der Heilung um',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70644','deDE','s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70645','deDE','Off-Tank',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70646','deDE','Totenbeschwörers',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70647','deDE','Totenbeschwörer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70648','deDE','Angriffswinkel',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70649','deDE','Normal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70650','deDE','Frontales AOE vermeiden',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70651','deDE','NYI',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70652','deDE','Bist du sicher, dass das klappt? Es sollte besser das beste Wasser der Welt sein...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70653','deDE','Es scheint, als könnten Sie wirklich einen Schluck frisches Wasser gebrauchen.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70654','deDE','Meereshexes',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70655','deDE','Meereshexe',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70656','deDE','Mana pro Schaden',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70657','deDE','Schaden pro Mana',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70658','deDE','TransfiguTransmogrifikation...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70659','deDE','Kampfpositionierung DEAKTIVIEREN',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70660','deDE','Vorrangiges Ziel',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70661','deDE','Bot Ausrüstungsbank...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70662','deDE','Gegenstände einlagern...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70663','deDE','Gegenstände entnehmen...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70664','deDE','Bank ist leer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70665','deDE','Vorherige Seite',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70666','deDE','Nächste Seite',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70667','deDE','Willst du wirklich so viel Geld ausgeben, damit der Gruftlord sich wieder bewegt?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70668','deDE','Ich bezweifle, dass ihr in eurem jetzigen Zustand viel Schaden anrichten könnt, aber ich bin bereit, euch zu führen und euch dabei zu helfen, eure Kräfte wiederherzustellen.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70669','deDE','Gruftlords',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70670','deDE','Gruftlord',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70671','deDE','Reflektieren',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70672','deDE','Heuschrecken',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70673','deDE','Gesundheitsschwelle des Ziels heilen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70674','deDE','Ich benötige ein Portal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70675','deDE','Sturmwind',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70676','deDE','Eisenschmiede',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70680','deDE','Unterstadt',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70681','deDE','Donnerfels',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70682','deDE','Silbermond',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);\ndiff --git a/data/sql/Bots/locales/esES/npc_text_locale.sql b/data/sql/Bots/locales/esES/npc_text_locale.sql\nnew file mode 100644\nindex 0000000000..8e0f8b2eac\n--- /dev/null\n+++ b/data/sql/Bots/locales/esES/npc_text_locale.sql\n@@ -0,0 +1,382 @@\n+DELETE FROM `npc_text_locale` WHERE `Locale`='esES' AND `ID` BETWEEN '70000' AND '71000';\n+INSERT INTO `npc_text_locale` (`ID`, `Locale`, `Text0_0`, `Text0_1`, `Text1_0`, `Text1_1`, `Text2_0`, `Text2_1`, `Text3_0`, `Text3_1`, `Text4_0`, `Text4_1`, `Text5_0`, `Text5_1`, `Text6_0`, `Text6_1`, `Text7_0`, `Text7_1`)\n+VALUES\n+('70001','esES','Vivo solo para servir a mi dueño.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70002','esES','¿Necesitas algo?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70003','esES','Mortales... normalmente mato a miserables como tú a la vista.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70004','esES','<Ves lo que se supone que es un destructor de obsidiana. Sin embargo, este se ve diferente, dañado y descolorido, y no reacciona a tu presencia. Recuerdas que la Plaga ha estado usando sus propias versiones de esos en algún momento en el pasado. ¿Cómo diablos terminó aquí? Después de un examen más detallado, notas una abertura en la espalda de la criatura.>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70005','esES','<El Destructor de obsidiana te mira fijamente y emite un gruñido bajo.>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70006','esES','¿Estás sorprendido, mortal? Como nathrezim menor, tengo que recurrir a buscar aliados. Parece que podrías divertirme al menos.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70007','esES','¿Qué pasa ahora, mortal?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70008','esES','¿Puedes dejarme en paz? <suspiro>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70009','esES','¿Ahora que?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70101','esES','|cffff3300Blademaster|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\"An elite swordsman, former member of Burning Blade clan, now an elite fighter within the Horde\".$B$BMain attribute: Agility.$B$BNetherwalk (Windwalk). Allows Blademaster to become invisible, and move faster for a set amount of time. When the Blademaster attacks a unit to break invisibility, he will deal bonus damage.$B$BMirror Image. Confuses the enemy by creating illusions of the Blademaster and dispelling all magic from the Blademaster.$B$BCritical Strike (passive). Gives a 15% chance to deal critical x2(x3,x4) times normal damage on his attacks.$B$BBladestorm (NIY). Grants immunity to magic and deals damage to all surrounding enemies.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70102','esES','|cff9900ccObsidian Destroyer|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\"An obsidian winged monstrocity with insatiable hunger for magic\".$B$BHigh armor, very high resistances, partially immune to magic, loses mana over time and doesnt benefit from passive mana regeneration effects, mail/plate armor, dual-wielding wands, deals spellshadow damage, no physical attack, cannot attack enemies not in front while moving, spell power bonus: 50% attack power + 200% intellect + wands damage.$B$BDevour Magic. Dispels up to 2 magic effects from enemies, up to 2 magic effects and up to 2 curses from allies and damaging summoned units in 20 yards area. Every dispelled effect restores 20% mana and 5% health, 7 seconds cooldown.$B$BShadow Blast. Empowered attack that deals increased splash damage.$B$BDrain Mana. Drains all mana (limited by casters mana pool) from a random friendly unit.$B$BReplenish Mana. Energizes surrounding party and raid members within 25 yards for 2% of their maximum mana nullifying casters mana, affects up to 10 targets, 3 seconds cooldown.$B$BRegenerating Aura. Heals surrounding party and raid members within 25 yards for 3% of their maximum health nullifying casters mana, affects up to 10 targets, 3 seconds cooldown.$B$BShadow Armor (passive). Restores mana equal to a percentage of damage taken.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70103','esES','|cff0000ddArchmage|r$b|cffdd6600-=Warcraft III tribute=-|r$B$BSpell damage taken reduced by 35%, partially immune to control effects, cloth armor, deals spellsfire/spellfrost damage, no physical attack, spell power bonus: 100% intellect. Main attribute: Intellect.$B$BBlizzard. Your typical blizzard, just a little more powerful, 6 seconds cooldown.$B$BSummon Water Elemental. Summons a water elemental to attack archmage enemies for 1 min, 20 seconds cooldown.$B$BBrilliance Aura. Increases maximum mana by 10% and greatly increases mana regeneration of party and raid members within 40 yards.$B$BMass Teleport. NIY.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70104','esES','|cff9900ccDreadlord|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\"Incredibly powerful demon who wields power of darkness and mental domination\".$B$BHigh armor, high resistances, partially immune to control effects, damage taken speeds up spells recharge, plate armor, deals melee/spellshadow damage, bonus damage against incapacitated targets, spell power bonus: 200% strength. Main attribute: Strength.$B$BCarrion Swarm. Sends a horde of bats combined with chaotic magic to damage enemies in a very large frontal cone, cannot crit, 10 seconds cooldown.$B$BSleep. Puts the enemy target to sleep for 60 seconds and allows next physical attack on that target to bypass armor, direct damage caused will awaken the target, 6 seconds cooldown.$B$BVampiric Aura. Increases physical critical damage by 5% and heals party and raid members within 40 yards for a percentage (100% for Dreadlord and 25% for everyone else) of damage done by melee physical attacks and Carrion Swarm, no threat.$B$BSummon Infernal Servant. Calls an infernal down from the sky dealing damage and stunning enemy units, infernal is very resistant to magic and lasts 180 seconds, 180 seconds cooldown.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70105','esES','|cff0000ddSpell Breaker|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\"An elven warrior trained to disrupt and contort magical energies\".$B$BSpell damage taken reduced by 75%, partially immune to control effects, armor penalty -30%, mail/plate armor, deals melee/arcane damage, spell power bonus: 200% strength. Main attribute: Strength.$B$BSteal Magic (Spellsteal). Steals a benefical spell from an enemy and applies it to a nearby ally or removes a negative spell from an ally and applies it to a nearby enemy, affects magic and curse effects, 3 seconds cooldown.$B$BFeedback (passive). Successful melee attacks burn target mana equal to damage caused (increased by spellpower) dealing arcane damage. If target is drained, Spell Breaker melee attacks will do triple damage with increased critical strike chance',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70106','esES','|cff9900ccDark Ranger|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\"A former ranger of Quel thalas forcibly raised from the dead\".$B$BSpell damage taken reduced by 35%, undead, partially immune to control effects, leather/cloth armor, deals physical/spellshadow damage, stick to shadows and generates no threat, spell power bonus: 50% intellect. Main attribute: Agility.$B$BSilence. Silences an enemy and up to 4 nearby targets for 8 seconds, 15 seconds cooldown.$B$BBlack Arrow. Fires a cursed arrow dealing 150% weapon damage and additional spellshadow damage over time. If affected target dies from Dark Ranger damage, Dark Minion will spawn from the corpse (maximum 5 Minions, 80 seconds duration, only works on humanoids, beasts and dragonkin). Deals five times more damage if target is under 20% health.$B$BDrain Life. Drains health from an enemy every second for 5 seconds, healing Dark Ranger for 200% of the drained amount.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70201','esES','Siempre hay tipos dispuestos a matar por dinero.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70202','esES','Estos son los bots que están disponibles en este momento: ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70203','esES','Estos son los bots que están disponibles en este momento: ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70204','esES','Parece que no hay nadie disponible en este momento, vuelve más tarde.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70300','esES','¡Muere!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70301','esES','Resucitandote',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70302','esES','Resucitando ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70303','esES','tu bot',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70304','esES',' bot',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70305','esES','Todavía no puedo crear agua',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70306','esES','Todavía no puedo crear comida',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70307','esES','No puedo hacerlo ahora',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70308','esES','Aquí tienes...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70309','esES','Desactivado',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70310','esES','No está listo todavía',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70311','esES','Tipo de objeto no válido',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70312','esES','Fallido',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70313','esES','Vale',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70314','esES','No estoy en ninguna forma',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70315','esES','No tengo piedra de salud',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70316','esES','¡Aún no puedo crear piedras de salud!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70317','esES','¡WTF, no tengo forzar cerraduras!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70318','esES','Mi nivel de habilidad no es alto',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70319','esES','Cambiando mi talento a ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70320','esES','Armas',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70321','esES','Furia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70322','esES','Protección',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70323','esES','Retribución',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70324','esES','Maestro de bestias',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70325','esES','Punteria',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70326','esES','Supervivencia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70327','esES','Asesinato',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70328','esES','Combate',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70329','esES','Sutileza',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70330','esES','Disciplina',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70331','esES','Sagrado',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70332','esES','Sombra',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70333','esES','Sangre',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70334','esES','Escarcha',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70335','esES','Profano',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70336','esES','Elemental',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70337','esES','Mejora',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70338','esES','Restauración',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70339','esES','Arcano',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70340','esES','Fuego',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70341','esES','Aflición',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70342','esES','Demologia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70343','esES','Destrucción',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70344','esES','Equilibrio',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70345','esES','Combate feral',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70346','esES','Unknown',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70347','esES','Vete, debilucho',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70348','esES',' no está convencido',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70349','esES','No voy a perder el tiempo en nada',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70350','esES','NIY',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70351','esES','NIY',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70352','esES','NIY',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70353','esES','Estoy listo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70354','esES','Vete, sirvo a mi dueño ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70355','esES','unknown',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70356','esES',' en ti!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70357','esES',' en mí mismo!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70358','esES',' en ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70359','esES',' usado!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70360','esES','bot tank',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70361','esES','clase',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70362','esES','jugador',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70363','esES','dueño',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70364','esES','ninguno',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70365','esES','Rango',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70366','esES','talento',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70367','esES','pasivo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70368','esES','oculto',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70369','esES','conocido',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70370','esES','habilidad',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70371','esES','str',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70372','esES','agi',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70373','esES','sta',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70374','esES','int',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70375','esES','spi',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70376','esES','unk stat',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70377','esES','total',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70378','esES','Melee AP',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70379','esES','Ranged AP',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70380','esES','armadura',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70381','esES','crit',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70382','esES','defensa',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70383','esES','miss',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70384','esES','evasión',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70385','esES','parry',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70386','esES','bloqueo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70387','esES','valor de bloqueo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70388','esES','Daño recibido cuerpo a cuerpo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70389','esES','Daño recibido de hechizos',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70390','esES','Rango de daño mano principal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70391','esES','Daño múltiple mano principal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70392','esES','Tiempo de ataque mano principal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70393','esES','Rango de daño de mano secundaria',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70394','esES','Daño múltiple mano secundaria',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70395','esES','Tiempo de ataque mano secundaria',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70396','esES','Rango de daño a distancia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70397','esES','Daño a distancia múltiple',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70398','esES','Tiempo de ataque a distancia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70399','esES','min',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70400','esES','max',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70401','esES','DPS',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70402','esES','base hp',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70403','esES','total hp',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70404','esES','base mana',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70405','esES','total mana',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70406','esES','mana actual',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70407','esES','poder de hechizos',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70408','esES','health regen_5 bonus',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70409','esES','mana regen_5 no cast',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70410','esES','mana regen_5 casting',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70411','esES','haste',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70412','esES','hit',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70413','esES','pericia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70414','esES','penetración de armadura',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70415','esES','penetración de hechizos',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70416','esES','%',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70417','esES','sagrado',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70418','esES','fuego',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70419','esES','naturaleza',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70420','esES','escarcha',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70421','esES','sombra',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70422','esES','arcano',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70423','esES','Resistencia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70424','esES','Estados de comando',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70425','esES','Seguir',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70426','esES','Ataque',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70427','esES','Quédate',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70428','esES','Reiniciar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70429','esES','Parar por completo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70430','esES','Distancia de seguimiento',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70431','esES','Especificaciones',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70432','esES','Rol principal del bot',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70433','esES','Rol de recoleción del bot',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70434','esES','Muertes PvP',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70435','esES','jugadores',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70436','esES','Murió ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70437','esES',' veces',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70438','esES','%s (bot) se calma',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70439','esES','<Debug>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70440','esES','¿Estás seguro de que quieres arriesgarte a dibujar ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70441','esES',' atención?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70442','esES','<Insertar Moneda>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70443','esES','Quieres atraer ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70444','esES','<Intenta hacer una ofrenda>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70445','esES','Quieres contratar a ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70446','esES','<Contratar Bot>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70447','esES','Administrar equipamiento...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70448','esES','Administrar rol...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70449','esES','Administrar formación...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70450','esES','Administrar habilidades...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70451','esES','Administrar talentos...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70452','esES','Dar consumibles...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70453','esES','<Crear grupo>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70454','esES','<Crear grupo (Todos los bots)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70455','esES','<Añadir al grupo>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70456','esES','<Añadir todos los bots al grupo>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70457','esES','<Quitar del grupo>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70458','esES','¡Sigueme!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70459','esES','¡Mantén tu posición!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70460','esES','¡Quédate aquí, no hagas nada!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70461','esES','Necesito comida',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70462','esES','Necesito agua',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70463','esES','Necesito una mesa de refrigerios',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70464','esES','Ayúdame a abrir esta cerradura',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70465','esES','Necesito una piedra de salud',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70466','esES','Necesito un pozo de alma',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70467','esES','Necesito que actualices tus venenos',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70468','esES','<Elegir veneno (Mano Principal)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70469','esES','<Elegir veneno (Mano Sencundaria)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70470','esES','Necesito que actualices tus encantamientos',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70471','esES','<Elegir encantamiento (Mano Principal)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70472','esES','<Elegir encantamiento (Mano Secundaria)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70473','esES','Necesito que te quites el cambio de forma',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70474','esES','<Elegir tipo de mascota>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70475','esES','Despedir',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70476','esES','Despedir a ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70477','esES','Puede que te arrepientas...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70478','esES','!Tranquilizaté!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70479','esES','<Estudia a la criatura>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70480','esES','Nada',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70481','esES','Distancia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70482','esES','ATRÁS',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70483','esES','<auto>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70484','esES','<ninguna>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70485','esES','Aleatoria (Astucia)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70486','esES','Aleatoria (Ferocidad)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70487','esES','Aleatoria (Tenacidad)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70488','esES','Muéstrame tu inventario',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70489','esES','Auto-equipar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70490','esES','Mano Principal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70491','esES','Mano Secundaria',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70492','esES','A distancia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70493','esES','Reliquia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70494','esES','Cabeza',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70495','esES','Hombros',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70496','esES','Pecho',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70497','esES','Cintura',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70498','esES','Piernas',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70499','esES','Pies',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70500','esES','Brazales',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70501','esES','Guantes',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70502','esES','Capa',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70503','esES','Camisa',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70504','esES','Anillo1...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70505','esES','Anillo2...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70506','esES','Abalorio1',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70507','esES','Abalorio2',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70508','esES','Collar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70509','esES','Desequipar todo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70510','esES','Actualizar equipamiento (Visual)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70511','esES','Solo visual',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70512','esES','Equipado',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70513','esES','nada',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70514','esES','Usa tu equipamiento antiguo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70515','esES','Desequipar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70516','esES','Mmmm... no tengo nada que darte',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70517','esES','Recolectar material',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70518','esES','Estado de las habilidades',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70519','esES','Administrar habilidades disponibles',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70520','esES','Usar ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70521','esES','Actualizar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70522','esES','Daño',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70523','esES','Control',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70524','esES','Healer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70525','esES','Otros',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70526','esES',' hace un ruido chirriante y comienza a seguir ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70527','esES','%s no se unira a ti hasta que su dueño no lo despida.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70528','esES','%s no se unira a ti hasta que seas nivel 60',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70529','esES','%s no se unira a ti hasta que seas nivel 55',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70530','esES','%s no se unira a ti hasta que seas nivel 40',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70531','esES','%s no se unira a ti hasta que seas nivel 20',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70532','esES','Superas el número máximo de bots (%u)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70533','esES','No tienes suficiente dinero',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70534','esES','¡No puedes tener más bots de esa clase! %u de %u ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70535','esES','¡No se puede reiniciar el equipamiento en el slot %u (%s)! ¡No se puede despedir el bot!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70536','esES','actual',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70537','esES','Distancia de ataque',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70538','esES','Ataques de corto alcance',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70539','esES','Ataques de largo alcance',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70540','esES','Exacto',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70541','esES','Eliminar Buff',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70542','esES','Fija tu tipo de poder',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70543','esES','¡No se puede desequipar a %s por alguna razón! Enviando por correo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70544','esES','Tank',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70545','esES','A distancia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70546','esES','Mineria',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70547','esES','Herbolistaeria',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70548','esES','Desollar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70549','esES','Ingeniería',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70550','esES','El contrato del bot expiró',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70551','esES','Los NPCBot están deshabilitado actualmente.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70552','esES','%s No se unira a ti, ya tiene un dueño: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70553','esES','%s no puede unirse mientras estás a punto de teletransportarte',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70554','esES','Aspecto',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70555','esES','de Mono',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70556','esES','de Halcón',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70557','esES','de Guepardo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70558','esES','de Víbora',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70559','esES','de la Bestia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70560','esES','de la Manada',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70561','esES','de lo Salvaje',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70562','esES','de Dracohalcón',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70563','esES','Sin Aspecto',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70564','esES','Aura',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70565','esES','de Devoción',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70566','esES','de Concentración',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70567','esES','de Resistencia al fuego',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70568','esES','de Resistencia a la escarcha',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70569','esES','de Resistencia a las sombras',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70570','esES','de Reprensión',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70571','esES','de Cruzado',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70572','esES','Sin Aura',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70573','esES','Veneno entorpecedor',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70574','esES','Veneno instantáneo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70575','esES','Veneno mortal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70576','esES','Veneno hiriente',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70577','esES','Veneno de aturdimiento mental',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70578','esES','Veneno anestésico',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70579','esES','Nada',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70580','esES','Lengua de fuego',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70581','esES','Estigma de escarcha',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70582','esES','Viento furioso',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70583','esES','Vida terrestre',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70584','esES','Necesito tus servicios',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70585','esES','Tienes demasiados bots',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70586','esES','Quieres contratar a ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70587','esES',' está ocupado en este momento, vuelve a intentarlo más tarde.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70588','esES','Un placer hacer negocios contigo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70589','esES','Guerreros',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70590','esES','Paladines',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70591','esES','Magos',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70592','esES','Sacerdotes',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70593','esES','Brujos',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70594','esES','Druidas',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70595','esES','Caballeros de la Muerte',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70596','esES','Picaros',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70597','esES','Chamanes',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70598','esES','Cazadores',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70599','esES','Blademasters',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70600','esES','Destroyers',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70601','esES','Archmagi',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70602','esES','Dreadlords',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70603','esES','Spell Breakers',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70604','esES','Dark Rangers',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70605','esES','Guerrero',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70606','esES','Paladin',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70607','esES','Mago',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70608','esES','Sacerdote',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70609','esES','Brujo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70610','esES','Druida',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70611','esES','Caballero de la Muerte',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70612','esES','Picaro',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70613','esES','Chaman',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70614','esES','Cazador',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70615','esES','Blademaster',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70616','esES','Destroyer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70617','esES','Archmage',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70618','esES','Dreadlord',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70619','esES','Spell Breaker',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70620','esES','Dark Ranger',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70621','esES','Hombre',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70622','esES','Mujer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70623','esES','Humano',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70624','esES','Orco',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70625','esES','Enano',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70626','esES','Elfo de la noche',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70627','esES','No-muerto',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70628','esES','Tauren',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70629','esES','Gnomo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70630','esES','Troll',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70631','esES','Elfo de sangre',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70632','esES','Draenei',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70633','esES','Unknown',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70634','esES','Saquear',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70635','esES','|cff9d9d9dBasura|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70636','esES','|cffffffffComún|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70637','esES','|cff1eff00Poco común|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70638','esES','|cff0070ddRaro|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70639','esES','|cffa335eeÉpico|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70640','esES','|cffff8000Legendario|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70641','esES','Elige un comprtamineto',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70642','esES','Retrasa el ataque a',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70643','esES','Retrasa la sanación a',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70644','esES','s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70645','esES','Off-Tank',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70646','esES','Necromancers',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70647','esES','Necromancer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70648','esES','Ángulo de ataque',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70649','esES','Normal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70650','esES','Evitar AOE frontal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70652','esES','¿Estás seguro de que esto va a funcionar? Más vale que sea la mejor agua del mundo...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70653','esES','Parece que realmente te vendría bien un trago de agua fresca.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70654','esES','Brujas del mar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70655','esES','Bruja de mar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70656','esES','Maná por daño',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70657','esES','Daño por maná',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70658','esES','Transfiguración...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70659','esES','DESACTIVAR el posicionamiento de combate',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70660','esES','Objetivo prioritario',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);\ndiff --git a/data/sql/Bots/locales/esMX/npc_text_locale.sql b/data/sql/Bots/locales/esMX/npc_text_locale.sql\nnew file mode 100644\nindex 0000000000..d71d858238\n--- /dev/null\n+++ b/data/sql/Bots/locales/esMX/npc_text_locale.sql\n@@ -0,0 +1,382 @@\n+DELETE FROM `npc_text_locale` WHERE `Locale`='esMX' AND `ID` BETWEEN '70000' AND '71000';\n+INSERT INTO `npc_text_locale` (`ID`, `Locale`, `Text0_0`, `Text0_1`, `Text1_0`, `Text1_1`, `Text2_0`, `Text2_1`, `Text3_0`, `Text3_1`, `Text4_0`, `Text4_1`, `Text5_0`, `Text5_1`, `Text6_0`, `Text6_1`, `Text7_0`, `Text7_1`)\n+VALUES\n+('70001','esMX','Vivo solo para servir a mi dueño.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70002','esMX','¿Necesitas algo?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70003','esMX','Mortales... normalmente mato a miserables como tú a la vista.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70004','esMX','<Ves lo que se supone que es un destructor de obsidiana. Sin embargo, este se ve diferente, dañado y descolorido, y no reacciona a tu presencia. Recuerdas que la Plaga ha estado usando sus propias versiones de esos en algún momento en el pasado. ¿Cómo diablos terminó aquí? Después de un examen más detallado, notas una abertura en la espalda de la criatura.>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70005','esMX','<El Destructor de obsidiana te mira fijamente y emite un gruñido bajo.>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70006','esMX','¿Estás sorprendido, mortal? Como nathrezim menor, tengo que recurrir a buscar aliados. Parece que podrías divertirme al menos.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70007','esMX','¿Qué pasa ahora, mortal?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70008','esMX','¿Puedes dejarme en paz? <suspiro>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70009','esMX','¿Ahora que?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70101','esMX','|cffff3300Blademaster|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\"An elite swordsman, former member of Burning Blade clan, now an elite fighter within the Horde\".$B$BMain attribute: Agility.$B$BNetherwalk (Windwalk). Allows Blademaster to become invisible, and move faster for a set amount of time. When the Blademaster attacks a unit to break invisibility, he will deal bonus damage.$B$BMirror Image. Confuses the enemy by creating illusions of the Blademaster and dispelling all magic from the Blademaster.$B$BCritical Strike (passive). Gives a 15% chance to deal critical x2(x3,x4) times normal damage on his attacks.$B$BBladestorm (NIY). Grants immunity to magic and deals damage to all surrounding enemies.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70102','esMX','|cff9900ccObsidian Destroyer|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\"An obsidian winged monstrocity with insatiable hunger for magic\".$B$BHigh armor, very high resistances, partially immune to magic, loses mana over time and doesnt benefit from passive mana regeneration effects, mail/plate armor, dual-wielding wands, deals spellshadow damage, no physical attack, cannot attack enemies not in front while moving, spell power bonus: 50% attack power + 200% intellect + wands damage.$B$BDevour Magic. Dispels up to 2 magic effects from enemies, up to 2 magic effects and up to 2 curses from allies and damaging summoned units in 20 yards area. Every dispelled effect restores 20% mana and 5% health, 7 seconds cooldown.$B$BShadow Blast. Empowered attack that deals increased splash damage.$B$BDrain Mana. Drains all mana (limited by casters mana pool) from a random friendly unit.$B$BReplenish Mana. Energizes surrounding party and raid members within 25 yards for 2% of their maximum mana nullifying casters mana, affects up to 10 targets, 3 seconds cooldown.$B$BRegenerating Aura. Heals surrounding party and raid members within 25 yards for 3% of their maximum health nullifying casters mana, affects up to 10 targets, 3 seconds cooldown.$B$BShadow Armor (passive). Restores mana equal to a percentage of damage taken.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70103','esMX','|cff0000ddArchmage|r$b|cffdd6600-=Warcraft III tribute=-|r$B$BSpell damage taken reduced by 35%, partially immune to control effects, cloth armor, deals spellsfire/spellfrost damage, no physical attack, spell power bonus: 100% intellect. Main attribute: Intellect.$B$BBlizzard. Your typical blizzard, just a little more powerful, 6 seconds cooldown.$B$BSummon Water Elemental. Summons a water elemental to attack archmage enemies for 1 min, 20 seconds cooldown.$B$BBrilliance Aura. Increases maximum mana by 10% and greatly increases mana regeneration of party and raid members within 40 yards.$B$BMass Teleport. NIY.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70104','esMX','|cff9900ccDreadlord|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\"Incredibly powerful demon who wields power of darkness and mental domination\".$B$BHigh armor, high resistances, partially immune to control effects, damage taken speeds up spells recharge, plate armor, deals melee/spellshadow damage, bonus damage against incapacitated targets, spell power bonus: 200% strength. Main attribute: Strength.$B$BCarrion Swarm. Sends a horde of bats combined with chaotic magic to damage enemies in a very large frontal cone, cannot crit, 10 seconds cooldown.$B$BSleep. Puts the enemy target to sleep for 60 seconds and allows next physical attack on that target to bypass armor, direct damage caused will awaken the target, 6 seconds cooldown.$B$BVampiric Aura. Increases physical critical damage by 5% and heals party and raid members within 40 yards for a percentage (100% for Dreadlord and 25% for everyone else) of damage done by melee physical attacks and Carrion Swarm, no threat.$B$BSummon Infernal Servant. Calls an infernal down from the sky dealing damage and stunning enemy units, infernal is very resistant to magic and lasts 180 seconds, 180 seconds cooldown.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70105','esMX','|cff0000ddSpell Breaker|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\"An elven warrior trained to disrupt and contort magical energies\".$B$BSpell damage taken reduced by 75%, partially immune to control effects, armor penalty -30%, mail/plate armor, deals melee/arcane damage, spell power bonus: 200% strength. Main attribute: Strength.$B$BSteal Magic (Spellsteal). Steals a benefical spell from an enemy and applies it to a nearby ally or removes a negative spell from an ally and applies it to a nearby enemy, affects magic and curse effects, 3 seconds cooldown.$B$BFeedback (passive). Successful melee attacks burn target mana equal to damage caused (increased by spellpower) dealing arcane damage. If target is drained, Spell Breaker melee attacks will do triple damage with increased critical strike chance',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70106','esMX','|cff9900ccDark Ranger|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\"A former ranger of Quel thalas forcibly raised from the dead\".$B$BSpell damage taken reduced by 35%, undead, partially immune to control effects, leather/cloth armor, deals physical/spellshadow damage, stick to shadows and generates no threat, spell power bonus: 50% intellect. Main attribute: Agility.$B$BSilence. Silences an enemy and up to 4 nearby targets for 8 seconds, 15 seconds cooldown.$B$BBlack Arrow. Fires a cursed arrow dealing 150% weapon damage and additional spellshadow damage over time. If affected target dies from Dark Ranger damage, Dark Minion will spawn from the corpse (maximum 5 Minions, 80 seconds duration, only works on humanoids, beasts and dragonkin). Deals five times more damage if target is under 20% health.$B$BDrain Life. Drains health from an enemy every second for 5 seconds, healing Dark Ranger for 200% of the drained amount.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70201','esMX','Siempre hay tipos dispuestos a matar por dinero.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70202','esMX','Estos son los bots que están disponibles en este momento: ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70203','esMX','Estos son los bots que están disponibles en este momento: ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70204','esMX','Parece que no hay nadie disponible en este momento, vuelve más tarde.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70300','esMX','¡Muere!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70301','esMX','Resucitandote',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70302','esMX','Resucitando ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70303','esMX','tu bot',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70304','esMX',' bot',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70305','esMX','Todavía no puedo crear agua',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70306','esMX','Todavía no puedo crear comida',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70307','esMX','No puedo hacerlo ahora',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70308','esMX','Aquí tienes...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70309','esMX','Desactivado',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70310','esMX','No está listo todavía',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70311','esMX','Tipo de objeto no válido',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70312','esMX','Fallido',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70313','esMX','Vale',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70314','esMX','No estoy en ninguna forma',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70315','esMX','No tengo piedra de salud',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70316','esMX','¡Aún no puedo crear piedras de salud!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70317','esMX','¡WTF, no tengo forzar cerraduras!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70318','esMX','Mi nivel de habilidad no es alto',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70319','esMX','Cambiando mi talento a ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70320','esMX','Armas',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70321','esMX','Furia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70322','esMX','Protección',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70323','esMX','Retribución',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70324','esMX','Maestro de bestias',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70325','esMX','Punteria',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70326','esMX','Supervivencia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70327','esMX','Asesinato',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70328','esMX','Combate',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70329','esMX','Sutileza',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70330','esMX','Disciplina',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70331','esMX','Sagrado',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70332','esMX','Sombra',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70333','esMX','Sangre',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70334','esMX','Escarcha',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70335','esMX','Profano',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70336','esMX','Elemental',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70337','esMX','Mejora',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70338','esMX','Restauración',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70339','esMX','Arcano',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70340','esMX','Fuego',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70341','esMX','Aflición',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70342','esMX','Demologia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70343','esMX','Destrucción',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70344','esMX','Equilibrio',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70345','esMX','Combate feral',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70346','esMX','Unknown',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70347','esMX','Vete, debilucho',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70348','esMX',' no está convencido',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70349','esMX','No voy a perder el tiempo en nada',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70350','esMX','NIY',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70351','esMX','NIY',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70352','esMX','NIY',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70353','esMX','Estoy listo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70354','esMX','Vete, sirvo a mi dueño ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70355','esMX','unknown',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70356','esMX',' en ti!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70357','esMX',' en mí mismo!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70358','esMX',' en ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70359','esMX',' usado!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70360','esMX','bot tank',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70361','esMX','clase',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70362','esMX','jugador',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70363','esMX','dueño',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70364','esMX','ninguno',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70365','esMX','Rango',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70366','esMX','talento',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70367','esMX','pasivo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70368','esMX','oculto',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70369','esMX','conocido',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70370','esMX','habilidad',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70371','esMX','str',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70372','esMX','agi',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70373','esMX','sta',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70374','esMX','int',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70375','esMX','spi',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70376','esMX','unk stat',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70377','esMX','total',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70378','esMX','Melee AP',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70379','esMX','Ranged AP',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70380','esMX','armadura',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70381','esMX','crit',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70382','esMX','defensa',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70383','esMX','miss',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70384','esMX','evasión',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70385','esMX','parry',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70386','esMX','bloqueo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70387','esMX','valor de bloqueo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70388','esMX','Daño recibido cuerpo a cuerpo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70389','esMX','Daño recibido de hechizos',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70390','esMX','Rango de daño mano principal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70391','esMX','Daño múltiple mano principal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70392','esMX','Tiempo de ataque mano principal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70393','esMX','Rango de daño de mano secundaria',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70394','esMX','Daño múltiple mano secundaria',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70395','esMX','Tiempo de ataque mano secundaria',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70396','esMX','Rango de daño a distancia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70397','esMX','Daño a distancia múltiple',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70398','esMX','Tiempo de ataque a distancia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70399','esMX','min',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70400','esMX','max',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70401','esMX','DPS',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70402','esMX','base hp',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70403','esMX','total hp',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70404','esMX','base mana',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70405','esMX','total mana',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70406','esMX','mana actual',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70407','esMX','poder de hechizos',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70408','esMX','health regen_5 bonus',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70409','esMX','mana regen_5 no cast',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70410','esMX','mana regen_5 casting',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70411','esMX','haste',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70412','esMX','hit',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70413','esMX','pericia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70414','esMX','penetración de armadura',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70415','esMX','penetración de hechizos',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70416','esMX','%',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70417','esMX','sagrado',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70418','esMX','fuego',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70419','esMX','naturaleza',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70420','esMX','escarcha',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70421','esMX','sombra',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70422','esMX','arcano',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70423','esMX','Resistencia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70424','esMX','Estados de comando',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70425','esMX','Seguir',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70426','esMX','Ataque',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70427','esMX','Quédate',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70428','esMX','Reiniciar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70429','esMX','Parar por completo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70430','esMX','Distancia de seguimiento',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70431','esMX','Especificaciones',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70432','esMX','Rol principal del bot',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70433','esMX','Rol de recoleción del bot',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70434','esMX','Muertes PvP',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70435','esMX','jugadores',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70436','esMX','Murió ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70437','esMX',' veces',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70438','esMX','%s (bot) se calma',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70439','esMX','<Debug>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70440','esMX','¿Estás seguro de que quieres arriesgarte a dibujar ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70441','esMX',' atención?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70442','esMX','<Insertar Moneda>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70443','esMX','Quieres atraer ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70444','esMX','<Intenta hacer una ofrenda>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70445','esMX','Quieres contratar a ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70446','esMX','<Contratar Bot>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70447','esMX','Administrar equipamiento...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70448','esMX','Administrar rol...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70449','esMX','Administrar formación...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70450','esMX','Administrar habilidades...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70451','esMX','Administrar talentos...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70452','esMX','Dar consumibles...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70453','esMX','<Crear grupo>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70454','esMX','<Crear grupo (Todos los bots)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70455','esMX','<Añadir al grupo>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70456','esMX','<Añadir todos los bots al grupo>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70457','esMX','<Quitar del grupo>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70458','esMX','¡Sigueme!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70459','esMX','¡Mantén tu posición!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70460','esMX','¡Quédate aquí, no hagas nada!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70461','esMX','Necesito comida',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70462','esMX','Necesito agua',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70463','esMX','Necesito una mesa de refrigerios',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70464','esMX','Ayúdame a abrir esta cerradura',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70465','esMX','Necesito una piedra de salud',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70466','esMX','Necesito un pozo de alma',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70467','esMX','Necesito que actualices tus venenos',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70468','esMX','<Elegir veneno (Mano Principal)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70469','esMX','<Elegir veneno (Mano Sencundaria)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70470','esMX','Necesito que actualices tus encantamientos',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70471','esMX','<Elegir encantamiento (Mano Principal)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70472','esMX','<Elegir encantamiento (Mano Secundaria)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70473','esMX','Necesito que te quites el cambio de forma',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70474','esMX','<Elegir tipo de mascota>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70475','esMX','Despedir',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70476','esMX','Despedir a ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70477','esMX','Puede que te arrepientas...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70478','esMX','!Tranquilizaté!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70479','esMX','<Estudia a la criatura>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70480','esMX','Nada',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70481','esMX','Distancia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70482','esMX','ATRÁS',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70483','esMX','<auto>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70484','esMX','<ninguna>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70485','esMX','Aleatoria (Astucia)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70486','esMX','Aleatoria (Ferocidad)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70487','esMX','Aleatoria (Tenacidad)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70488','esMX','Muéstrame tu inventario',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70489','esMX','Auto-equipar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70490','esMX','Mano Principal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70491','esMX','Mano Secundaria',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70492','esMX','A distancia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70493','esMX','Reliquia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70494','esMX','Cabeza',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70495','esMX','Hombros',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70496','esMX','Pecho',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70497','esMX','Cintura',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70498','esMX','Piernas',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70499','esMX','Pies',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70500','esMX','Brazales',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70501','esMX','Guantes',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70502','esMX','Capa',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70503','esMX','Camisa',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70504','esMX','Anillo1...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70505','esMX','Anillo2...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70506','esMX','Abalorio1',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70507','esMX','Abalorio2',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70508','esMX','Collar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70509','esMX','Desequipar todo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70510','esMX','Actualizar equipamiento (Visual)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70511','esMX','Solo visual',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70512','esMX','Equipado',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70513','esMX','nada',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70514','esMX','Usa tu equipamiento antiguo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70515','esMX','Desequipar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70516','esMX','Mmmm... no tengo nada que darte',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70517','esMX','Recolectar material',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70518','esMX','Estado de las habilidades',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70519','esMX','Administrar habilidades disponibles',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70520','esMX','Usar ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70521','esMX','Actualizar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70522','esMX','Daño',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70523','esMX','Control',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70524','esMX','Healer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70525','esMX','Otros',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70526','esMX',' hace un ruido chirriante y comienza a seguir ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70527','esMX','%s no se unira a ti hasta que su dueño no lo despida.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70528','esMX','%s no se unira a ti hasta que seas nivel 60',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70529','esMX','%s no se unira a ti hasta que seas nivel 55',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70530','esMX','%s no se unira a ti hasta que seas nivel 40',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70531','esMX','%s no se unira a ti hasta que seas nivel 20',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70532','esMX','Superas el número máximo de bots (%u)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70533','esMX','No tienes suficiente dinero',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70534','esMX','¡No puedes tener más bots de esa clase! %u de %u ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70535','esMX','¡No se puede reiniciar el equipamiento en el slot %u (%s)! ¡No se puede despedir el bot!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70536','esMX','actual',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70537','esMX','Distancia de ataque',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70538','esMX','Ataques de corto alcance',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70539','esMX','Ataques de largo alcance',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70540','esMX','Exacto',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70541','esMX','Eliminar Buff',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70542','esMX','Fija tu tipo de poder',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70543','esMX','¡No se puede desequipar a %s por alguna razón! Enviando por correo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70544','esMX','Tank',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70545','esMX','A distancia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70546','esMX','Mineria',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70547','esMX','Herbolistaeria',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70548','esMX','Desollar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70549','esMX','Ingeniería',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70550','esMX','El contrato del bot expiró',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70551','esMX','Los NPCBot están deshabilitado actualmente.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70552','esMX','%s No se unira a ti, ya tiene un dueño: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70553','esMX','%s no puede unirse mientras estás a punto de teletransportarte',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70554','esMX','Aspecto',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70555','esMX','de Mono',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70556','esMX','de Halcón',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70557','esMX','de Guepardo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70558','esMX','de Víbora',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70559','esMX','de la Bestia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70560','esMX','de la Manada',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70561','esMX','de lo Salvaje',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70562','esMX','de Dracohalcón',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70563','esMX','Sin Aspecto',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70564','esMX','Aura',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70565','esMX','de Devoción',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70566','esMX','de Concentración',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70567','esMX','de Resistencia al fuego',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70568','esMX','de Resistencia a la escarcha',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70569','esMX','de Resistencia a las sombras',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70570','esMX','de Reprensión',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70571','esMX','de Cruzado',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70572','esMX','Sin Aura',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70573','esMX','Veneno entorpecedor',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70574','esMX','Veneno instantáneo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70575','esMX','Veneno mortal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70576','esMX','Veneno hiriente',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70577','esMX','Veneno de aturdimiento mental',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70578','esMX','Veneno anestésico',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70579','esMX','Nada',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70580','esMX','Lengua de fuego',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70581','esMX','Estigma de escarcha',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70582','esMX','Viento furioso',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70583','esMX','Vida terrestre',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70584','esMX','Necesito tus servicios',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70585','esMX','Tienes demasiados bots',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70586','esMX','Quieres contratar a ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70587','esMX',' está ocupado en este momento, vuelve a intentarlo más tarde.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70588','esMX','Un placer hacer negocios contigo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70589','esMX','Guerreros',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70590','esMX','Paladines',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70591','esMX','Magos',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70592','esMX','Sacerdotes',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70593','esMX','Brujos',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70594','esMX','Druidas',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70595','esMX','Caballeros de la Muerte',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70596','esMX','Picaros',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70597','esMX','Chamanes',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70598','esMX','Cazadores',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70599','esMX','Blademasters',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70600','esMX','Destroyers',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70601','esMX','Archmagi',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70602','esMX','Dreadlords',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70603','esMX','Spell Breakers',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70604','esMX','Dark Rangers',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70605','esMX','Guerrero',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70606','esMX','Paladin',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70607','esMX','Mago',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70608','esMX','Sacerdote',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70609','esMX','Brujo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70610','esMX','Druida',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70611','esMX','Caballero de la Muerte',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70612','esMX','Picaro',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70613','esMX','Chaman',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70614','esMX','Cazador',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70615','esMX','Blademaster',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70616','esMX','Destroyer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70617','esMX','Archmage',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70618','esMX','Dreadlord',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70619','esMX','Spell Breaker',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70620','esMX','Dark Ranger',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70621','esMX','Hombre',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70622','esMX','Mujer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70623','esMX','Humano',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70624','esMX','Orco',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70625','esMX','Enano',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70626','esMX','Elfo de la noche',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70627','esMX','No-muerto',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70628','esMX','Tauren',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70629','esMX','Gnomo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70630','esMX','Troll',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70631','esMX','Elfo de sangre',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70632','esMX','Draenei',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70633','esMX','Unknown',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70634','esMX','Saquear',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70635','esMX','|cff9d9d9dBasura|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70636','esMX','|cffffffffComún|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70637','esMX','|cff1eff00Poco común|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70638','esMX','|cff0070ddRaro|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70639','esMX','|cffa335eeÉpico|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70640','esMX','|cffff8000Legendario|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70641','esMX','Elige un comprtamineto',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70642','esMX','Retrasa el ataque a',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70643','esMX','Retrasa la sanación a',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70644','esMX','s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70645','esMX','Off-Tank',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70646','esMX','Necromancers',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70647','esMX','Necromancer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70648','esMX','Ángulo de ataque',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70649','esMX','Normal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70650','esMX','Evitar AOE frontal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70652','esMX','¿Estás seguro de que esto va a funcionar? Más vale que sea la mejor agua del mundo...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70653','esMX','Parece que realmente te vendría bien un trago de agua fresca.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70654','esMX','Brujas del mar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70655','esMX','Bruja de mar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70656','esMX','Maná por daño',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70657','esMX','Daño por maná',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70658','esMX','Transfiguración...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70659','esMX','DESACTIVAR el posicionamiento de combate',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70660','esMX','Objetivo prioritario',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);\ndiff --git a/data/sql/Bots/locales/ruRU/npc_text_locale.sql b/data/sql/Bots/locales/ruRU/npc_text_locale.sql\nnew file mode 100644\nindex 0000000000..015aca79bf\n--- /dev/null\n+++ b/data/sql/Bots/locales/ruRU/npc_text_locale.sql\n@@ -0,0 +1,380 @@\n+DELETE FROM `npc_text_locale` WHERE `Locale`='ruRU' AND `ID` BETWEEN '70000' AND '71000';\n+INSERT INTO `npc_text_locale` (`ID`, `Locale`, `Text0_0`, `Text0_1`, `Text1_0`, `Text1_1`, `Text2_0`, `Text2_1`, `Text3_0`, `Text3_1`, `Text4_0`, `Text4_1`, `Text5_0`, `Text5_1`, `Text6_0`, `Text6_1`, `Text7_0`, `Text7_1`)\n+VALUES\n+('70001', 'ruRU', 'Я живу только для того, чтобы служить хозяину!', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70002', 'ruRU', 'Тебе что-то нужно?', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70003', 'ruRU', 'Смертные... обычно я убиваю тварей вроде тебя как только увижу!', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70004', 'ruRU', '<Перед вами, похоже, обсидиановый разрушитель. Этот, впрочем, выглядит иначе, поврежденный и поблекший, он не реагирует на ваше присутствие. Вам помнится Плеть когда-то давно использовала таких. Как, черт возьми, он оказался здесь? При дальнейшем осмотре вы замечаете щель на его спине.>', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70005', 'ruRU', '<Обсидиановый Разрушитель смотрит на вас и издает глубокий рычащий звук.>', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70006', 'ruRU', 'Ты удивлен, смертный? Как низший натрезим, я вынужден прибегать к поиску союзников. Ты выглядишь так, будто сможешь меня хотя бы развлечь.', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70007', 'ruRU', 'Ну что ещё, смертный?', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70008', 'ruRU', 'Ты можешь просто оставить меня в покое? <вздох>', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70009', 'ruRU', 'Что теперь?', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70010', 'ruRU', '<Вы видите истощенную предводительницу наг. Она выглядит усталой и слабой, и пытается не смотреть на вас.>$B$BНе нуж-жно с-с-слов, с-с-смертный...', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70011', 'ruRU', 'У меня опять что-то не так с-с причёс-ской? <Она расчесывает свои \"волосы\">$B... Нет, вс-сё в порядке. Так в чём же дело?', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70101', 'ruRU', '|cffff3300Мастер Клинка|r$b|cffdd6600-=отсылка к Warcraft III=-|r$B$B\"Элитный мечник, бывший член клана Пылающего Клинка, ныне элитный воин ​​Орды\".$B$BОсновная характеристика: Ловкость.$B$BПуть Пустоты (Прогулка с ветром). Позволяет Мастеру клинка становиться невидимым и двигаться быстрее в течение определенного времени. Если Мастер клинка атакует врага, выходя из невидимости, он наносит дополнительный урон.$B$BЗеркальное изображение. Сбивает противника с толку, создавая иллюзию Мастера клинка и рассеивая всю магию Мастера клинка.$B$BКритический удар (пассивный). Дает 15% шанс нанести критический урон в 2(3,4) раза больше обычного при атаках.$B$BВихрь клинков (NIY). Дает иммунитет к магии и наносит урон всем окружающим врагам.$B$B', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70102', 'ruRU', '|cff9900ccОбсидиановый Разрушитель|r$b|cffdd6600-=отсылка к Warcraft III=-|r$B$B\"Крылатое чудовище из обсидиана, обладающее ненасытной жаждой магии\".$B$BКрепкая броня, очень высокое сопротивление, частичный иммунитет к магии, постоянно теряет ману, пассивные эффекты регенерации маны для него бесполезны, кольчужная/латная броня, использует жезлы в обоих руках, наносит урон темной магией, нет физической атаки, не может атаковать во время перемещения, бонус к силе заклинаний: 50% силы атаки + 200% интеллекта + урон жезлов.$B$BПожирание магии. Снимает до 2 магических эффектов с врагов, до 2 магических эффектов и до 2 проклятий с союзников и наносит урон призванным юнитам в радиусе 20 м. Каждый развеянный эффект восстанавливает 20% маны и 5% здоровья, время восстановления 7 секунд.$B$BТеневой взрыв. Усиленная атака, наносящая повышенный урон по площади.$B$BВытягивание маны. Вытягивает всю ману (ограниченную запасом маны заклинателя) из случайного дружественного юнита.$B$BПополнить запасы маны. Восполняет манну окружающим участникав группы и рейда в радиусе 25 ярдов на 3% от их максимального запаса, сводя на нет ману заклинателя, время восстановления 3 секунды.$B$BАура восстановления. Исцеляет окружающих членов группы и рейда в радиусе 25 м на 3% от их максимального запаса здоровья, сводя на нет ману заклинателя, время восстановления 3 секунды.$B$BТемная броня (пассивная). Восстанавливает ману в размере процента от полученного урона.$B$B', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70103', 'ruRU', '|cff0000ddАрхимаг|r$b|cffdd6600-=отсылка к Warcraft III=-|r$B$B Получаемый урон от заклинаний уменьшен на 35%, частично невосприимчив к эффектам контроля, тканевая броня, наносит урон от магии огня/льда, нет физической атаки, бонус к силе заклинаний: 100% интеллекта. Основная характеристика: Интеллект.$B$BСнежная буря. Обычная снежная буря, только немного мощнее, время восстановления 6 секунд.$B$BПризыв элементаля воды. Призывает элементаля воды, который атакует врагов архимага. Время восстановления: 1 мин., 20 сек.$B$BАура великолепия. Увеличивает максимальный запас маны на 10% и значительно увеличивает регенерацию маны участников группы и рейда в радиусе 40 м.$B$BM Массовая телепортация. NIY.$B$B', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70104', 'ruRU', '|cff9900ccПовелитель Ужаса|r$b|cffdd6600-=отсылка к Warcraft III=-|r$B$B\"Невероятно могущественный демон, владеющий силами тьмы и управления разумом\".$B$BКрепкая броня, высокое сопротивление, частичная невосприимчивость к эффектам контроля, получаемый урон ускоряет перезарядку заклинаний, латная броня, наносит урон в ближнем бою а также урон от темной магии, дополнительный урон по целям выведенным из равновесия, бонус к силе заклинаний: 200% силы. Основная характеристика: Сила.$B$BТемная Стая. Посылает стаю летучих мышей наносящих урон от магии в конусе перед собой, не может нанести критический урон, время восстановления 10 секунд.$B$BСон. Погружает вражескую цель в сон на 60 секунд и позволяет при наненсения урона следующей физической атаке этой цели игнорировать ее броню, нанесенный прямой урон пробудит цель, время восстановления 6 секунд.$B$BАура вампиризма. Увеличивает физический критический урон на 5% и исцеляет членов группы и рейда в радиусе 40 м в процентном соотношении (100% для Повелителя ужаса и 25% для всех остальных) от урона, нанесенного физическими атаками в ближнем бою и Темной Стаей, без угрозы.$B$BПризыв Инфернала. Призывает инфернала с неба на 180 секунд, нанося урон и оглушая врагов, инфернал очень устойчив к магии, время восстановления 180 секунд.$B$B', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70105', 'ruRU', '|cff0000ddРазрушитель Заклинаний|r$b|cffdd6600-=отсылка к Warcraft III=-|r$B$B\"Эльфийский воин, специально обученный разрушать и искажать магию\".$B$BУрон, получаемый от заклинаний, уменьшен на 75%, частично невосприимчив к эффектам контроля, штраф за броню -30%, кольчужная/латная броня, наносит урон в ближнем бою и урон от тайной магии, бонус к силе заклинаний: 200% силы. Основная характеристика: Сила.$B$BПохищение Магии. Похищает полезное заклинание у врага и передаёт его ближайшему союзнику или снимает отрицательное заклинание с союзника на ближайшего врага, влияет на эффекты магии и проклятия, время восстановления 2 секунды.$B$BСожжение Маны (пассивная). Успешные атаки ближнего боя сжигают ману цели, равную нанесенному урону (увеличенному силой заклинаний), нанося урон от тайной магии. Если мана цели исчерпана, атаки ближнего боя Разрушителя Заклинаний будут наносить тройной урон с повышенным шансом критического удара. Если у цели нет маны, Разрушитель Заклинаний восполнит ману в количестве 25% от нанесенного урона.$B$B', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70106', 'ruRU', '|cff9900ccТемная Охотница|r$b|cffdd6600-=отсылка к Warcraft III=-|r$B$B\"Бывшая охотница Кель\\'Таласа, насильно возвращённая из мира мёртвых\".$B$B Получаемый урон от заклинаний уменьшен на 35%, нежить, частично невосприимчива к эффектам контроля, кожаная/тканевая броня, наносит физический урон/урон от темной магии, придерживается теней и не генерирует угрозы, бонус к силе заклинаний: 50% интеллекта. Основное характеристика: Ловкость.$B$BБезмолвие. Заставляет врага и до 4 его ближайших друзей замолчать на 8 секунд, теряя возможность применять заклинания, время восстановления 15 секунд.$B$BЧерная стрела. Выпускает проклятую стрелу, наносящую 150% урона от оружия и дополнительный урон от темной магии каждые несколько секунд. Если цель умирает от урона Темной Охотницы, она превратится в Тёмного Приспешника (максимум 5 приспешников, продолжительность 80 секунд, срабатывает только на гуманоидах, зверях и драконах). Наносит пятикратный урон, если у цели меньше 20% здоровья.$B$Bпохищение Жизни. Высасывает здоровье врага каждую секунду в течение 5 секунд, исцеляя Темную Охотницу на 200% от похищенного количества.$B$B', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70107', 'ruRU', '|cff9900ccНекромант|r$b|cffdd6600-=отсылка к Warcraft III / Diablo II=-|r$B$BПолучаемый урон от заклинаний уменьшен на 20%, частично невосприимчив к эффектам контроля, тканевая броня, наносит урон от темной магии, нет физической атаки, бонус к силе заклинаний: интеллект 100%. Основная характеристика: Интеллект.$B$BВоскрешение Мертвых. Поднимает 2 скелета из трупа (максимум 6 скелетов, продолжительность 65 секунд, работает только с гуманоидами, зверями и драконами).$B$BНечестивое Бешенство. Увеличивает скорость атаки цели в ближнем бою на 75%, но постоянно истощает здоровье. Длится 45 секунд. Не может быть отменено. Разблокируется на 30 уровне.$B$BВзрыв Трупа. Заставляет труп взорваться, нанося урон в размере от 35% до 75% от максимального здоровья мертвого существа (зависит от уровня Некроманта) всем окружающим врагам. Этот урон не генерирует угрозы. Разблокируется на 40 уровне.$B$BУвечье. Снижает скорость передвижения цели, скорость атаки в ближнем бою и общую силу на 50% на 60 секунд. Разблокируется на уровне 50.$B$B', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70108', 'ruRU', '|cff0000ddМорская Ведьма|r$b|cffdd6600-=отсылка к Warcraft III=-|r$B$B\"Грозная колдунья наг, часто ассоциирующаяся с приходом ужасных штормов\".$B$BПолучаемый урон от заклинаний уменьшен на 30%, частично невосприимчив к эффектам контроля, тканевая броня, наносит физический урон/урон от магии льда, бонус к силе атаки: ловкость x2, бонус к силе заклинаний: 200% к интеллекту. Основная характеристика: Интеллект.$B$BРаздвоенная молния. Вызывает разветвлённую молнию, наносящую урон врагам. Поражает от 2 до всех целей (в зависимости от уровня Морской Ведьмы), оглушая их на 2 секунды. Этот урон не создает угрозы.$B$BЛедяные Стрелы. Наполняет стрелу магическим морозом для дополнительного урона, снижая скорость движения цели, скорость атаки и произнесения заклинаний на 30-70% (в зависимости от уровня Морской ведьмы).$B$BЩит Маны. Создает щит, который поглощает 100% входящего (не смягченного) урона, используя ману Морской Ведьмы. Эффект варьируется от 1 единицы урона за 10 единиц маны до 10 единиц урона за 1 единицу ману (в зависимости от уровня Морской Ведьмы).$B$BТорнадо. Вызывает яростный торнадо, который наносит урон и замедляет ближайших врагов, иногда полностью выводя их из строя. На открытом пространстве Торнадо со временем разрастается, увеличивая наносимый урон и область действия, но в закрытом помещении уменьшается и быстро рассеивается. Разблокируется на уровне 60.$B$BНага (пассивный эффект). Скорость плавания, урон и шанс уклонения значительно увеличиваются в воде.$B$B', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70201', 'ruRU', 'Всегда найдутся чуваки, готовые убить за деньги.', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70202', 'ruRU', 'Наёмники востребованы всегда. Вот кто доступен прямо сейчас.', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70203', 'ruRU', 'Наёмники востребованы всегда. Вот кто доступен прямо сейчас.', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70204', 'ruRU', 'Похоже сейчас никого нет, проверь позже.', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70300', 'ruRU', 'Умри!', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70301', 'ruRU', 'Воскрешаю тебя', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70302', 'ruRU', 'Воскрешаю ', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70303', 'ruRU', 'твой бот', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70304', 'ruRU', ' бот', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70305', 'ruRU', 'Я пока не могу применить заклинание создания воды', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70306', 'ruRU', 'Я пока не могу применить заклинание создания еды', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70307', 'ruRU', 'Я не могу сделать это сейчас', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70308', 'ruRU', 'Во-о-от...', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70309', 'ruRU', 'Отключено', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70310', 'ruRU', 'Ещё не готово', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70311', 'ruRU', 'Неверный тип объекта', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70312', 'ruRU', 'Не удалось', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70313', 'ruRU', 'Готово', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70314', 'ruRU', 'Я не изменил форму', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70315', 'ruRU', 'У меня нет камня здоровья', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70316', 'ruRU', 'Я пока не могу создавать камни здоровья!', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70317', 'ruRU', 'WTF у меня нет отмычек!', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70318', 'ruRU', 'Мой уровень навыка недостаточно высок', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70319', 'ruRU', 'Меняю специализацию на ', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70320', 'ruRU', 'Оружие', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70321', 'ruRU', 'Неистовство', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70322', 'ruRU', 'Защита', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70323', 'ruRU', 'Воздаяние', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70324', 'ruRU', 'Повелитель зверей', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70325', 'ruRU', 'Стрельба', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70326', 'ruRU', 'Выживание', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70327', 'ruRU', 'Ликвидация', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70328', 'ruRU', 'Бой', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70329', 'ruRU', 'Скрытность', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70330', 'ruRU', 'Послушание', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70331', 'ruRU', 'Свет', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70332', 'ruRU', 'Тьма', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70333', 'ruRU', 'Кровь', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70334', 'ruRU', 'Лёд', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70335', 'ruRU', 'Нечестивость', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70336', 'ruRU', 'Стихии', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70337', 'ruRU', 'Совершенствование', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70338', 'ruRU', 'Исцеление', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70339', 'ruRU', 'Тайная магия', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70340', 'ruRU', 'Огонь', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70341', 'ruRU', 'Колдовство', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70342', 'ruRU', 'Демонология', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70343', 'ruRU', 'Разрушение', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70344', 'ruRU', 'Баланс', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70345', 'ruRU', 'Сила зверя', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70346', 'ruRU', 'Неизвестно', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70347', 'ruRU', 'Проваливай, слабак', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70348', 'ruRU', ' не убеждён', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70349', 'ruRU', 'Я не собираюсь тратить свое время на всякую ерунду', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70353', 'ruRU', 'Я готов', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70354', 'ruRU', 'Уходи. Я служу своему хозяину ', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70355', 'ruRU', 'неизвестный', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70356', 'ruRU', ' на тебя!', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70357', 'ruRU', ' на себя!', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70358', 'ruRU', ' на ', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70359', 'ruRU', ' использовано!', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70360', 'ruRU', 'бот-танк', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70361', 'ruRU', 'класс', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70362', 'ruRU', 'игрок', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70363', 'ruRU', 'владелец', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70364', 'ruRU', 'никто', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70365', 'ruRU', 'Уровень', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70366', 'ruRU', 'талант', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70367', 'ruRU', 'пассивный', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70368', 'ruRU', 'скрытый', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70369', 'ruRU', 'изучен', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70370', 'ruRU', 'способность', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70371', 'ruRU', 'сила', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70372', 'ruRU', 'ловкость', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70373', 'ruRU', 'выносливость', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70374', 'ruRU', 'интеллект', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70375', 'ruRU', 'дух', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70376', 'ruRU', 'неизвестный стат', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70377', 'ruRU', 'всего', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70378', 'ruRU', 'Сила атаки ближний бой', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70379', 'ruRU', 'Сила атаки дальний бой', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70380', 'ruRU', 'броня', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70381', 'ruRU', 'крит', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70382', 'ruRU', 'защита', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70383', 'ruRU', 'промах', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70384', 'ruRU', 'уклонение', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70385', 'ruRU', 'парирование', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70386', 'ruRU', 'блок', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70387', 'ruRU', 'показатель блокирования', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70388', 'ruRU', 'Получаемый урон в ближнем бою', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70389', 'ruRU', 'Получаемый урон от заклинаний', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70390', 'ruRU', 'Разброс урона оружия в правой руке', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70391', 'ruRU', 'Множитель урона оружия в правой руке', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70392', 'ruRU', 'Скорость атаки оружием в правой руке', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70393', 'ruRU', 'Разброс урон оружия в левой руке', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70394', 'ruRU', 'Множитель урона оружия в левой руке', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70395', 'ruRU', 'Скорость атаки оружием в левой руке', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70396', 'ruRU', 'Разброс урона оружия дальнего боя', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70397', 'ruRU', 'Множитель урона оружия дальнего боя', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70398', 'ruRU', 'Скорость атаки оружием дальнего боя', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70399', 'ruRU', 'минимум', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70400', 'ruRU', 'максимум', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70402', 'ruRU', 'базовый уровень здоровья', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70403', 'ruRU', 'всего здоровья', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70404', 'ruRU', 'базовый уровень маны', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70405', 'ruRU', 'всего маны', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70406', 'ruRU', 'текущий запас маны', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70407', 'ruRU', 'сила заклинаний', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70408', 'ruRU', 'бонус регенерации здоровья_5', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70409', 'ruRU', 'регенерация маны_5 без использования заклинания', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70410', 'ruRU', 'регенерация маны_5 при использовании заклинания', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70411', 'ruRU', 'скорость', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70412', 'ruRU', 'меткость', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70413', 'ruRU', 'мастерство', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70414', 'ruRU', 'пробивание брони', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70415', 'ruRU', 'проникновение заклинаний', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70416', 'ruRU', 'проц.', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70417', 'ruRU', 'святлая магия', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70418', 'ruRU', 'магия огня', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70419', 'ruRU', 'силы природы', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70420', 'ruRU', 'магия льда', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70421', 'ruRU', 'темная магия', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70422', 'ruRU', 'тайная магия', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70423', 'ruRU', 'Сопротивление', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70424', 'ruRU', 'Состояния команд', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70425', 'ruRU', 'Следовать', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70426', 'ruRU', 'Атаковать', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70427', 'ruRU', 'Стоять', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70428', 'ruRU', 'Сброс', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70429', 'ruRU', 'Полная остановка', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70430', 'ruRU', 'Дистанция следования', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70431', 'ruRU', 'Специализация', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70432', 'ruRU', 'Маска ролей ботов (главная)', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70433', 'ruRU', 'Маска ролей ботов (сбор)', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70434', 'ruRU', 'PvP-убийства', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70435', 'ruRU', 'игроки', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70436', 'ruRU', 'Умер ', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70437', 'ruRU', ' раз', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70438', 'ruRU', '%s (бот) успокаивается', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70439', 'ruRU', '<Отладка>', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70440', 'ruRU', 'Вы уверены, что хотите рискнуть, привлекая внимание ', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70441', 'ruRU', '?', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70442', 'ruRU', '<Вставить монету>', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70443', 'ruRU', 'Вы хотите приманить ', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70444', 'ruRU', '<Попробовать сделать подношение>', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70445', 'ruRU', 'Вы хотите нанять ', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70446', 'ruRU', '<Нанять бота>', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70447', 'ruRU', 'Снаряжение...', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70448', 'ruRU', 'Роли...', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70449', 'ruRU', 'Построение...', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70450', 'ruRU', 'Способности...', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70451', 'ruRU', 'Специализация...', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70452', 'ruRU', 'Дать использовать...', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70453', 'ruRU', '<Создать группу>', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70454', 'ruRU', '<Создать группу (все боты)>', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70455', 'ruRU', '<Добавить в группу>', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70456', 'ruRU', '<Добавить всех ботов в группу>', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70457', 'ruRU', '<Удалить из группы>', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70458', 'ruRU', 'Следуй за мной', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70459', 'ruRU', 'Удерживай позицию', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70460', 'ruRU', 'Стой здесь и ничего не делай', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70461', 'ruRU', 'Мне нужна еда', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70462', 'ruRU', 'Мне нужна вода', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70463', 'ruRU', 'Мне нужен стол с едой', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70464', 'ruRU', 'Помоги мне взломать замок', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70465', 'ruRU', 'Мне нужен камень здоровья', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70466', 'ruRU', 'Мне нужен источник душ', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70467', 'ruRU', 'Мне нужно, чтобы ты обновил яды', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70468', 'ruRU', '<Выберите яд (правая рука)>', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70469', 'ruRU', '<Выберите яд (левая рука)>', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70470', 'ruRU', 'Мне нужно, чтобы ты обновил чары', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70471', 'ruRU', '<Выберите чары (правая рука)>', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70472', 'ruRU', '<Выберите чары (левая рука)>', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70473', 'ruRU', 'Мне нужно, чтобы ты вышел из формы', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70474', 'ruRU', '<Выбрать тип питомца>', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70475', 'ruRU', 'Свободен отсюда', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70476', 'ruRU', 'Вы действительно хотите уволить ', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70477', 'ruRU', 'Вы можете пожалеть об этом...', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70478', 'ruRU', 'Соберись, тряпка', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70479', 'ruRU', '<Рассмотреть существо>', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70480', 'ruRU', 'Ладно, не важно', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70481', 'ruRU', 'дист.', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70482', 'ruRU', 'НАЗАД', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70483', 'ruRU', '<Авто>', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70484', 'ruRU', '<Нет>', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70485', 'ruRU', 'Случайный (Хитрость)', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70486', 'ruRU', 'Случайный (Свирепость)', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70487', 'ruRU', 'Случайный (Упорство)', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70488', 'ruRU', 'Покажи мне свой инвентарь', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70489', 'ruRU', 'Автовыбор', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70490', 'ruRU', 'Правая рука', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70491', 'ruRU', 'Левая рука', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70492', 'ruRU', 'Дальний бой', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70493', 'ruRU', 'Реликвия', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70494', 'ruRU', 'Голова', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70495', 'ruRU', 'Плечи', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70496', 'ruRU', 'Грудь', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70497', 'ruRU', 'Пояс', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70498', 'ruRU', 'Ноги', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70499', 'ruRU', 'Ступни', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70500', 'ruRU', 'Запястья', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70501', 'ruRU', 'Кисти рук', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70502', 'ruRU', 'Спина', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70503', 'ruRU', 'Рубашка', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70504', 'ruRU', 'Палец1', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70505', 'ruRU', 'Палец2', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70506', 'ruRU', 'Аксессуар1', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70507', 'ruRU', 'Аксессуар2', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70508', 'ruRU', 'Шея', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70509', 'ruRU', 'Снять все', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70510', 'ruRU', 'Обновить внешний вид', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70511', 'ruRU', 'только внешний вид', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70512', 'ruRU', 'Надето', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70513', 'ruRU', 'ничего', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70514', 'ruRU', 'Используй свое старое cнаряжение', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70515', 'ruRU', 'Снять', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70516', 'ruRU', 'Хм... мне нечего тебе дать', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70517', 'ruRU', 'Сбор ингредиентов', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70518', 'ruRU', 'Статус способностей', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70519', 'ruRU', 'Разрешённые способности', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70520', 'ruRU', 'Используй ', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70521', 'ruRU', 'Обновить', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70522', 'ruRU', 'Урон', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70523', 'ruRU', 'Контроль', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70524', 'ruRU', 'Лечение', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70525', 'ruRU', 'Другое', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70526', 'ruRU', ' издает скрежет и начинает следовать за ', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70527', 'ruRU', '%s не присоединится к вам, пока владелец не уволит', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70528', 'ruRU', '%s не присоединится к вам, пока вы не достигнете 60-го уровня', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70529', 'ruRU', '%s не присоединится к вам, пока вы не достигнете 55-го уровня', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70530', 'ruRU', '%s не присоединится к вам, пока вы не достигнете 40-го уровня', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70531', 'ruRU', '%s не присоединится к вам, пока вы не достигнете 20-го уровня', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70532', 'ruRU', 'Вы превысили максимальное количество ботов (%u)', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70533', 'ruRU', 'У вас недостаточно денег', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70534', 'ruRU', 'У вас не может быть больше ботов этого класса! %u из %u', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70535', 'ruRU', 'Не удается сбросить снаряжение в слоте %u (%s)! Не могу уволить бота!', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70536', 'ruRU', 'сейчас', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70537', 'ruRU', 'Дистанция атаки', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70538', 'ruRU', 'Короткая дистанция', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70539', 'ruRU', 'Длинная дистанция', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70540', 'ruRU', 'Заданная', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70541', 'ruRU', 'Снять бафф', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70542', 'ruRU', 'Исправь тип энергии', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70543', 'ruRU', 'Не могу снять %s по какой-то идиотской причине! Отправляю по почте', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70544', 'ruRU', 'Танк', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70545', 'ruRU', 'Дальний бой', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70546', 'ruRU', 'Горное дело', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70547', 'ruRU', 'Травничество', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70548', 'ruRU', 'Снятие шкур', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70549', 'ruRU', 'Инженерное дело', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70550', 'ruRU', 'Срок владения ботом истек из-за бездействия', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70551', 'ruRU', 'Система NpcBot в данный момент отключена. Пожалуйста, обратитесь к администратору', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70552', 'ruRU', '%s не присоединится к вам, уже есть владелец: %s', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70553', 'ruRU', '%s не может присоединиться к вам: телепортируется', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70554', 'ruRU', 'Дух', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70555', 'ruRU', 'Обезьяна', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70556', 'ruRU', 'Ястреб', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70557', 'ruRU', 'Гепард', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70558', 'ruRU', 'Гадюка', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70559', 'ruRU', 'Зверь', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70560', 'ruRU', 'Стая', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70561', 'ruRU', 'Дикий', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70562', 'ruRU', 'Дракондор', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70563', 'ruRU', 'Нет духа', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70564', 'ruRU', 'Аура', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70565', 'ruRU', 'Благочестие', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70566', 'ruRU', 'Сосредоточенность', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70567', 'ruRU', 'Защита от огня', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70568', 'ruRU', 'Защита от магии льда', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70569', 'ruRU', 'Защита от темной магии', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70570', 'ruRU', 'Воздаяние', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70571', 'ruRU', 'Воин света', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70572', 'ruRU', 'Нет ауры', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70573', 'ruRU', 'Калечащий', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70574', 'ruRU', 'Быстродействующий', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70575', 'ruRU', 'Смертельный', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70576', 'ruRU', 'Нейтрализующий', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70577', 'ruRU', 'Дурманящий', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70578', 'ruRU', 'Анестезирующий', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70579', 'ruRU', 'Ничего', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70580', 'ruRU', 'Языки пламени', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70581', 'ruRU', 'Ледяное клеймо', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70582', 'ruRU', 'Неистовство ветра', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70583', 'ruRU', 'Жизнь земли', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70584', 'ruRU', 'Мне нужны твои услуги', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70585', 'ruRU', 'У тебя слишком много ботов', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70586', 'ruRU', 'Вы хотите нанять ', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70587', 'ruRU', ' сейчас немного занят, повторите попытку позже.', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70588', 'ruRU', 'Приятно иметь с тобой дело', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70589', 'ruRU', 'Воины', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70590', 'ruRU', 'Паладины', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70591', 'ruRU', 'Маги', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70592', 'ruRU', 'Жрецы', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70593', 'ruRU', 'Чернокнижники', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70594', 'ruRU', 'Друиды', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70595', 'ruRU', 'Рыцари Смерти', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70596', 'ruRU', 'Разбойники', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70597', 'ruRU', 'Шаманы', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70598', 'ruRU', 'Охотники', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70599', 'ruRU', 'Мастера Клинка', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70600', 'ruRU', 'Разрушители', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70601', 'ruRU', 'Архимаги', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70602', 'ruRU', 'Повелители Ужаса', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70603', 'ruRU', 'Разрушители Заклинаний', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70604', 'ruRU', 'Тёмные Охотницы', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70605', 'ruRU', 'Воин', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70606', 'ruRU', 'Паладин', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70607', 'ruRU', 'Маг', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70608', 'ruRU', 'Жрец', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70609', 'ruRU', 'Чернокнижник', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70610', 'ruRU', 'Друид', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70611', 'ruRU', 'Рыцарь смерти', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70612', 'ruRU', 'Разбойник', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70613', 'ruRU', 'Шаман', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70614', 'ruRU', 'Охотник', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70615', 'ruRU', 'Мастер Клинка', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70616', 'ruRU', 'Разрушитель', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70617', 'ruRU', 'Архимаг', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70618', 'ruRU', 'Повелитель Ужаса', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70619', 'ruRU', 'Разрушитель Заклинаний', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70620', 'ruRU', 'Темная Охотница', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70621', 'ruRU', 'Мужчина', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70622', 'ruRU', 'Женщина', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70623', 'ruRU', 'Человек', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70624', 'ruRU', 'Орк', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70625', 'ruRU', 'Гном', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70626', 'ruRU', 'Ночной эльф', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70627', 'ruRU', 'Нежить', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70628', 'ruRU', 'Таурен', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70629', 'ruRU', 'Гном', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70630', 'ruRU', 'Тролль', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70631', 'ruRU', 'Эльф крови', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70632', 'ruRU', 'Дреней', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70633', 'ruRU', 'Неизвестно', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70634', 'ruRU', 'Сбор добычи', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70635', 'ruRU', '|cff9d9d9dПлохой|r', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70636', 'ruRU', '|cffffffffОбычный|r', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70637', 'ruRU', '|cff1eff00Необычный|r', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70638', 'ruRU', '|cff0070ddРедкий|r', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70639', 'ruRU', '|cffa335eeЭпический|r', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70640', 'ruRU', '|cffff8000Легендарный|r', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70641', 'ruRU', 'Активное действие', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70642', 'ruRU', 'Задержка атаки на', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70643', 'ruRU', 'Задержка лечения на', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70644', 'ruRU', 'с', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70645', 'ruRU', 'Off-танк (второй танк)', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70646', 'ruRU', 'Некроманты', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70647', 'ruRU', 'Некромант', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70648', 'ruRU', 'Позиционирование в дальнем бою', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70649', 'ruRU', 'Обычное', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70650', 'ruRU', 'Избегать фронтального АОЕ', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70652', 'ruRU', 'Вы уверены, что это сработает? Это должна быть самая лучшая вода в мире...', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70653', 'ruRU', 'Похоже, тебе не помешает хороший глоток свежей воды.', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70654', 'ruRU', 'Морские Ведьмы', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70655', 'ruRU', 'Морская Ведьма', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70656', 'ruRU', 'Маны на единицу урона', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70657', 'ruRU', 'Урона на еденицу маны', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70658', 'ruRU', 'Трансмогрификация...', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\ndiff --git a/data/sql/Bots/locales/zhCN/creature_template_locale.sql b/data/sql/Bots/locales/zhCN/creature_template_locale.sql\nnew file mode 100644\nindex 0000000000..59fd943711\n--- /dev/null\n+++ b/data/sql/Bots/locales/zhCN/creature_template_locale.sql\n@@ -0,0 +1,742 @@\n+DELETE FROM `creature_template_locale` WHERE `entry`=70595 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70595, 'zhCN', '蝗虫', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70594 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70594, 'zhCN', '腐尸甲虫', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70593 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70593, 'zhCN', '腐尸甲虫', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70592 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70592, 'zhCN', '腐尸甲虫', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70591 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70591, 'zhCN', '荷鲁斯明', '机动 地穴领主', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70590 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70590, 'zhCN', '阿拉克-阿拉姆', '机动 地穴领主', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70589 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70589, 'zhCN', '翡若斯', '机动 地穴领主', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70588 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70588, 'zhCN', '厄努比洛斯', '机动 地穴领主', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70587 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70587, 'zhCN', '图坦阿拉克', '机动 地穴领主', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70586 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70586, 'zhCN', '龙卷风', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70585 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70585, 'zhCN', '恰利布迪沙', '机动 深渊海巫', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70584 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70584, 'zhCN', '灰云', '机动 深渊海巫', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70583 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70583, 'zhCN', '小丽', '机动 深渊海巫', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70582 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70582, 'zhCN', '毒蛇娜', '机动 深渊海巫', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70581 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70581, 'zhCN', '康德拉', '机动 深渊海巫', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70580 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70580, 'zhCN', '骷髅', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70579 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70579, 'zhCN', '德罗萨姆', '机动 死灵法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70578 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70578, 'zhCN', '丰磨', '机动 死灵法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70577 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70577, 'zhCN', '赫克斯尔', '机动 死灵法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70576 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70576, 'zhCN', '罗希克', '机动 死灵法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70575 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70575, 'zhCN', '帕卡', '机动 死灵法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70574 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70574, 'zhCN', '黑暗使徒', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70573 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70573, 'zhCN', '暗影使徒', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70572 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70572, 'zhCN', '丽拉', '机动 黑暗游侠', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70571 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70571, 'zhCN', '达莉丝', '机动 黑暗游侠', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70570 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70570, 'zhCN', '伊娃', '机动 黑暗游侠', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70569 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70569, 'zhCN', '谭', '机动 黑暗游侠', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70568 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70568, 'zhCN', '玛拉', '机动 黑暗游侠', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70567 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70567, 'zhCN', '涅什达', '机动 破法者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70566 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70566, 'zhCN', '丹斯德', '机动 破法者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70565 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70565, 'zhCN', '凯尔诺', '机动 破法者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70564 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70564, 'zhCN', '纳森', '机动 破法者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70563 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70563, 'zhCN', '伊诺尔', '机动 破法者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70562 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70562, 'zhCN', '炼狱', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70561 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70561, 'zhCN', '拉马罗特', '机动 恐惧魔王', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70560 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70560, 'zhCN', '罗特修斯', '机动 恐惧魔王', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70559 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70559, 'zhCN', '扎拉蒙', '机动 恐惧魔王', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70558 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70558, 'zhCN', '恶魔罗斯', '机动 恐惧魔王', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70557 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70557, 'zhCN', '尼罗斯', '机动 恐惧魔王', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70556 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70556, 'zhCN', '水元素', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70555 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70555, 'zhCN', '迪崔', '机动 高阶法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70554 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70554, 'zhCN', '阿默', '机动 殁境神蚀者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70553 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70553, 'zhCN', '欧西斯', '机动 殁境神蚀者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70552 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70552, 'zhCN', '剑圣', '机动 剑圣', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70551 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70551, 'zhCN', '戈克拉马托', '机动 剑圣', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70545 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70545, 'zhCN', '树人', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70544 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70544, 'zhCN', '水元素', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70543 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70543, 'zhCN', '灵狼', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70542 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70542, 'zhCN', '暗影恶魔', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70538 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70538, 'zhCN', '升起食尸鬼', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70537 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70537, 'zhCN', '虫子', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70536 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70536, 'zhCN', '犀牛', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70535 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70535, 'zhCN', '魔暴龙', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70534 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70534, 'zhCN', '核心犬', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70533 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70533, 'zhCN', '灵兽', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70532 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70532, 'zhCN', '奇美拉', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70531 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70531, 'zhCN', '蛰鞭兽', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70530 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70530, 'zhCN', '扭曲潜行者', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70529 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70529, 'zhCN', '鳄鱼兽', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70528 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70528, 'zhCN', '螃蟹', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70527 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70527, 'zhCN', '猪', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70526 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70526, 'zhCN', '熊', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70525 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70525, 'zhCN', '大猩猩', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70524 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70524, 'zhCN', '乌龟', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70523 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70523, 'zhCN', '天蝎灵', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70522 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70522, 'zhCN', '特罗莫斯', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70521 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70521, 'zhCN', '黄蜂', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70520 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70520, 'zhCN', '鬣狗', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70519 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70519, 'zhCN', '猫', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70518 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70518, 'zhCN', '高大步行者', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70517 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70517, 'zhCN', '狼', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70516 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70516, 'zhCN', '猛禽', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70515 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70515, 'zhCN', '腐肉鸟', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70514 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70514, 'zhCN', '孢子蝙', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70513 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70513, 'zhCN', '虚空鳐', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70512 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70512, 'zhCN', '龙鹰', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70511 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70511, 'zhCN', '毁灭者', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70510 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70510, 'zhCN', '风蛇', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70509 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70509, 'zhCN', '蝙蝠', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70508 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70508, 'zhCN', '掠食之鸟', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70507 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70507, 'zhCN', '毒蛇', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70506 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70506, 'zhCN', '蜘蛛', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70505 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70505, 'zhCN', '恶魔卫士', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70504 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70504, 'zhCN', '邪能猎犬', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70503 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70503, 'zhCN', '魅魔', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70502 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70502, 'zhCN', '虚空行者', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70501 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70501, 'zhCN', '小恶魔', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70465 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70465, 'zhCN', '史蒂芬', '机动 死亡骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70464 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70464, 'zhCN', '曼陀罗', '机动 死亡骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70463 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70463, 'zhCN', '佐贝', '机动 死亡骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70462 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70462, 'zhCN', '克洛克', '机动 死亡骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70461 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70461, 'zhCN', '伊利丽额', '机动 死亡骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70460 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70460, 'zhCN', '乌佐', '机动 死亡骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70459 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70459, 'zhCN', '星澈', '机动 死亡骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70458 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70458, 'zhCN', '阿莉', '机动 死亡骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70457 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70457, 'zhCN', '维瑞思', '机动 死亡骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70456 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70456, 'zhCN', '银缕', '机动 死亡骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70455 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70455, 'zhCN', '岚克雷', '机动 死亡骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70454 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70454, 'zhCN', '缪妮克斯', '机动 死亡骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70453 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70453, 'zhCN', '维伦', '机动 死亡骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70452 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70452, 'zhCN', '音风', '机动 死亡骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70451 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70451, 'zhCN', '苏西', '机动 死亡骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70418 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70418, 'zhCN', '夏兰尼斯', '机动 德鲁伊', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70417 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70417, 'zhCN', '哈琳', '机动 德鲁伊', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70416 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70416, 'zhCN', '洛加纳尔', '机动 德鲁伊', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70415 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70415, 'zhCN', '高林', '机动 德鲁伊', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70414 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70414, 'zhCN', '杰诺斯', '机动 德鲁伊', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70413 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70413, 'zhCN', '曼德林', '机动 德鲁伊', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70412 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70412, 'zhCN', '瑟里德兰', '机动 德鲁伊', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70411 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70411, 'zhCN', '谢尔德拉斯', '机动 德鲁伊', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70410 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70410, 'zhCN', '费勒里安', '机动 德鲁伊', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70409 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70409, 'zhCN', '丹纳萨利安', '机动 德鲁伊', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70408 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70408, 'zhCN', '玛斯兰吉尔', '机动 德鲁伊', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70407 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70407, 'zhCN', '卡尔', '机动 德鲁伊', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70406 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70406, 'zhCN', '马丹特', '机动 德鲁伊', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70405 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70405, 'zhCN', '珍雅', '机动 德鲁伊', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70404 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70404, 'zhCN', '嘉特', '机动 德鲁伊', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70403 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70403, 'zhCN', '凯姆', '机动 德鲁伊', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70402 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70402, 'zhCN', '希尔', '机动 德鲁伊', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70401 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70401, 'zhCN', '图拉克', '机动 德鲁伊', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70377 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70377, 'zhCN', '巴巴加亚', '机动 术士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70376 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70376, 'zhCN', '赞尼恩', '机动 术士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70375 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70375, 'zhCN', '复仇者', '机动 术士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70374 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70374, 'zhCN', '阿拉玛', '机动 术士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70373 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70373, 'zhCN', '赛洛尼斯', '机动 术士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70372 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70372, 'zhCN', '泰莉拉琳', '机动 术士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70371 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70371, 'zhCN', '金瑞兹', '机动 术士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70370 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70370, 'zhCN', '桑达尔', '机动 术士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70369 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70369, 'zhCN', '厄伊', '机动 术士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70368 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70368, 'zhCN', '亚历山大', '机动 术士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70367 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70367, 'zhCN', '荆棘霜', '机动 术士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70366 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70366, 'zhCN', '蓟心', '机动 术士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70365 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70365, 'zhCN', '理查德', '机动 术士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70364 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70364, 'zhCN', '路德', '机动 术士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70363 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70363, 'zhCN', '卡尔', '机动 术士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70362 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70362, 'zhCN', '泽弗洛斯', '机动 术士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70361 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70361, 'zhCN', '米尔凯', '机动 术士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70360 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70360, 'zhCN', '格洛达', '机动 术士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70359 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70359, 'zhCN', '杜古如', '机动 术士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70358 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70358, 'zhCN', '纳托克', '机动 术士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70357 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70357, 'zhCN', '鲁珀', '机动 术士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70356 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70356, 'zhCN', '马克西米利安', '机动 术士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70355 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70355, 'zhCN', '卡托什', '机动 术士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70354 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70354, 'zhCN', '马克西米利安', '机动 术士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70353 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70353, 'zhCN', '德米赛特', '机动 术士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70352 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70352, 'zhCN', '阿拉玛', '机动 术士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70351 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70351, 'zhCN', '杜瑟拉', '机动 术士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70336 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70336, 'zhCN', '德里克', '机动 法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70335 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70335, 'zhCN', '巴蒂', '机动 法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70334 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70334, 'zhCN', '哈南', '机动 法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70333 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70333, 'zhCN', '半葵', '机动 法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70332 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70332, 'zhCN', '华兰斯', '机动 法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70331 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70331, 'zhCN', '伊迪拉', '机动 法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70330 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70330, 'zhCN', '纳林思', '机动 法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70329 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70329, 'zhCN', '因特芬', '机动 法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70328 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70328, 'zhCN', '奎萨思', '机动 法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70327 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70327, 'zhCN', '泽达娜', '机动 法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70326 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70326, 'zhCN', '瓦拉图', '机动 法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70325 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70325, 'zhCN', '嘉瑞德', '机动 法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70324 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70324, 'zhCN', '朱莉', '机动 法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70323 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70323, 'zhCN', '丁克', '机动 法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70322 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70322, 'zhCN', '优瑟妮', '机动 法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70321 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70321, 'zhCN', '迪诺', '机动 法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70320 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70320, 'zhCN', '麦亚', '机动 法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70319 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70319, 'zhCN', '恩尤', '机动 法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70318 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70318, 'zhCN', '菲佛德', '机动 法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70317 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70317, 'zhCN', '恩图瓦', '机动 法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70316 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70316, 'zhCN', '洁娜', '机动 法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70315 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70315, 'zhCN', '尼特尔伯', '机动 法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70314 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70314, 'zhCN', '朱莉', '机动 法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70313 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70313, 'zhCN', '彬克', '机动 法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70312 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70312, 'zhCN', '安娜斯塔西娅', '机动 法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70311 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70311, 'zhCN', '皮尔斯', '机动 法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70310 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70310, 'zhCN', '瑟斯顿', '机动 法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70309 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70309, 'zhCN', '乌尔辛', '机动 法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70308 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70308, 'zhCN', '什姆', '机动 法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70307 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70307, 'zhCN', '肯', '机动 法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70306 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70306, 'zhCN', '伊莎贝拉', '机动 法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70305 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70305, 'zhCN', '魔姬', '机动 法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70304 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70304, 'zhCN', '玛瑞克', '机动 法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70303 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70303, 'zhCN', '玛吉诺', '机动 法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70302 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70302, 'zhCN', '赞迪玛', '机动 法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70301 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70301, 'zhCN', '凯尔登', '机动 法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70268 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70268, 'zhCN', '贾瓦德', '机动 萨满', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70267 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70267, 'zhCN', '幽蓝', '机动 萨满', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70265 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70265, 'zhCN', '舒拉', '机动 萨满', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70261 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70261, 'zhCN', '萨戈恩', '机动 萨满', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70260 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70260, 'zhCN', '思安德', '机动 萨满', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70259 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70259, 'zhCN', '卡德里斯', '机动 萨满', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70258 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70258, 'zhCN', '斯沃特', '机动 萨满', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70257 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70257, 'zhCN', '采莎', '机动 萨满', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70256 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70256, 'zhCN', '楠琳', '机动 萨满', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70255 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70255, 'zhCN', '米拉', '机动 萨满', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70254 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70254, 'zhCN', '贝拉姆', '机动 萨满', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70253 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70253, 'zhCN', '腾格', '机动 萨满', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70252 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70252, 'zhCN', '思琳', '机动 萨满', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70251 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70251, 'zhCN', '哈罗姆', '机动 萨满', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70240 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70240, 'zhCN', '法拉特', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70239 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70239, 'zhCN', '伊兹密尔', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70238 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70238, 'zhCN', '谷万', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70237 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70237, 'zhCN', '凯德莫斯', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70236 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70236, 'zhCN', '贝莱斯特拉', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70235 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70235, 'zhCN', '洛西兰', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70234 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70234, 'zhCN', '艾尔德雷', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70233 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70233, 'zhCN', '沙尔顿', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70232 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70232, 'zhCN', '波纳里斯', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70231 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70231, 'zhCN', '竞技场', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70230 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70230, 'zhCN', '若涵', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70229 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70229, 'zhCN', '艾莉西娅', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70228 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70228, 'zhCN', '娜拉', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70227 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70227, 'zhCN', '乌尔奇奥', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70226 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70226, 'zhCN', '席雅拉', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70225 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70225, 'zhCN', '泽尤斯', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70224 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70224, 'zhCN', '约书亚', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70223 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70223, 'zhCN', '本杰明', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70222 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70222, 'zhCN', '托尔德伦', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70221 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70221, 'zhCN', '布雷娜', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70220 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70220, 'zhCN', '西奥德鲁斯', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70219 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70219, 'zhCN', '拉撒路', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70218 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70218, 'zhCN', '兰开斯特', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70217 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70217, 'zhCN', '拉莉娅', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70216 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70216, 'zhCN', '杨迪儿', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70215 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70215, 'zhCN', '阿斯塔丽', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70214 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70214, 'zhCN', '肯杰', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70213 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70213, 'zhCN', '泰津', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70212 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70212, 'zhCN', '罗娜', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70211 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70211, 'zhCN', '珊达', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70210 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70210, 'zhCN', '科布', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70209 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70209, 'zhCN', '马拉凯', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70208 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70208, 'zhCN', '迈尔斯', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70207 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70207, 'zhCN', '贝丽', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70206 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70206, 'zhCN', '迪斯滕', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70205 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70205, 'zhCN', '马克森', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70204 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70204, 'zhCN', '枝根', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70203 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70203, 'zhCN', '若青', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70202 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70202, 'zhCN', '罗芮娜', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70201 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70201, 'zhCN', '安妮塔', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70181 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70181, 'zhCN', '涅莉森', '机动 潜行者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70180 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70180, 'zhCN', '艾拉拉', '机动 潜行者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70179 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70179, 'zhCN', '泽兰尼斯', '机动 潜行者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70178 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70178, 'zhCN', '坦娜莉娅', '机动 潜行者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70177 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70177, 'zhCN', '卡丽尔', '机动 潜行者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70176 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70176, 'zhCN', '托尼', '机动 潜行者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70175 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70175, 'zhCN', '法拉德', '机动 潜行者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70174 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70174, 'zhCN', '芬瑟维克', '机动 潜行者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70173 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70173, 'zhCN', '奥米尔', '机动 潜行者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70172 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70172, 'zhCN', '霍尔夫丹', '机动 潜行者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70171 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70171, 'zhCN', '格雷戈里', '机动 潜行者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70170 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70170, 'zhCN', '迈尔斯', '机动 潜行者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70169 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70169, 'zhCN', '凯琳', '机动 潜行者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70168 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70168, 'zhCN', '安尼莎', '机动 潜行者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70167 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70167, 'zhCN', '艾瑞昂', '机动 潜行者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70166 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70166, 'zhCN', '思娜', '机动 潜行者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70165 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70165, 'zhCN', '简诺', '机动 潜行者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70164 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70164, 'zhCN', '弗拉洪', '机动 潜行者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70163 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70163, 'zhCN', '深石', '机动 潜行者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70162 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70162, 'zhCN', '奥莫克', '机动 潜行者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70161 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70161, 'zhCN', '盖斯特', '机动 潜行者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70160 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70160, 'zhCN', '卡普拉', '机动 潜行者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70159 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70159, 'zhCN', '鲁瓦格', '机动 潜行者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70158 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70158, 'zhCN', '玛丽安', '机动 潜行者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70157 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70157, 'zhCN', '大卫', '机动 潜行者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70156 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70156, 'zhCN', '伊恩', '机动 潜行者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70155 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70155, 'zhCN', '猎獭', '机动 潜行者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70154 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70154, 'zhCN', '奥斯本', '机动 潜行者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70153 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70153, 'zhCN', '凯琳', '机动 潜行者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70152 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70152, 'zhCN', '索尔姆', '机动 潜行者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70151 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70151, 'zhCN', '乔里克', '机动 潜行者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70139 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70139, 'zhCN', '杀手', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70138 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70138, 'zhCN', '沃德', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70137 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70137, 'zhCN', '阿克特翁', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70136 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70136, 'zhCN', '德蕾米丝', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70135 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70135, 'zhCN', '赞迪娜', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70134 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70134, 'zhCN', '奥尼纳丝', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70133 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70133, 'zhCN', '塔娜', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70132 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70132, 'zhCN', '凯尔内', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70131 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70131, 'zhCN', '汉诺维亚', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70130 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70130, 'zhCN', '萨琳娜', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70129 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70129, 'zhCN', '达格', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70128 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70128, 'zhCN', '阿伦达', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70127 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70127, 'zhCN', '托尔芬', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70126 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70126, 'zhCN', '乌尔菲尔', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70125 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70125, 'zhCN', '恩瑞斯', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70124 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70124, 'zhCN', '凯布鲁斯', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70123 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70123, 'zhCN', '雷格努斯', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70122 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70122, 'zhCN', '奥尔明', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70121 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70121, 'zhCN', '德拉', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70120 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70120, 'zhCN', '多里昂', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70119 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70119, 'zhCN', '约卡斯特', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70118 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70118, 'zhCN', '洁娜', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70117 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70117, 'zhCN', '丹拉尔', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70116 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70116, 'zhCN', '达扎拉', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70115 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70115, 'zhCN', '艾安娜', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70114 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70114, 'zhCN', '思安杜尔', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70113 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70113, 'zhCN', '索兹朱尔', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70112 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70112, 'zhCN', '奥玛克', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70111 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70111, 'zhCN', '索费雷', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70110 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70110, 'zhCN', '杰尚', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70109 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70109, 'zhCN', '尧', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70108 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70108, 'zhCN', '兰卡', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70107 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70107, 'zhCN', '优瑞', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70106 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70106, 'zhCN', '霍尔特', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70105 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70105, 'zhCN', '凯瑞', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70104 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70104, 'zhCN', '克拉格', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70103 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70103, 'zhCN', '格里夫', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70102 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70102, 'zhCN', '奥格罗姆', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70101 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70101, 'zhCN', '索尔加斯', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70100 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70100, 'zhCN', '深海对话触发器', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70074 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70074, 'zhCN', '如云', '机动 圣骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70073 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70073, 'zhCN', '烈焰者', '机动 圣骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70072 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70072, 'zhCN', '希莎', '机动 圣骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70071 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70071, 'zhCN', '乔勒', '机动 圣骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70070 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70070, 'zhCN', '图拉斯', '机动 圣骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70069 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70069, 'zhCN', '卡万', '机动 圣骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70068 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70068, 'zhCN', '巴屯', '机动 圣骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70067 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70067, 'zhCN', '巴奇', '机动 圣骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70066 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70066, 'zhCN', '艾瑟丽丝', '机动 圣骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70065 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70065, 'zhCN', '欧瑟兰', '机动 圣骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70064 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70064, 'zhCN', '奥瑞隆', '机动 圣骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70063 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70063, 'zhCN', '娜琳', '机动 圣骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70062 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70062, 'zhCN', '杰斯汀', '机动 圣骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70061 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70061, 'zhCN', '卡曼', '机动 圣骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70060 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70060, 'zhCN', '凯瑟琳', '机动 圣骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70059 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70059, 'zhCN', '亚瑟', '机动 圣骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70058 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70058, 'zhCN', '布兰德尔', '机动 圣骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70057 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70057, 'zhCN', '贝尔德鲁克', '机动 圣骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70056 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70056, 'zhCN', '瓦尔加', '机动 圣骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70055 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70055, 'zhCN', '阿萨尔', '机动 圣骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70054 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70054, 'zhCN', '格雷森', '机动 圣骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70053 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70053, 'zhCN', '威廉', '机动 圣骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70052 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70052, 'zhCN', '溴盐', '机动 圣骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70051 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70051, 'zhCN', '山缪尔', '机动 圣骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70038 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70038, 'zhCN', '凯丽娅', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70037 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70037, 'zhCN', '卡茲', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70036 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70036, 'zhCN', '如娜', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70035 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70035, 'zhCN', '贝霍玛', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70034 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70034, 'zhCN', '阿霍南', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70033 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70033, 'zhCN', '柯蕊', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70032 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70032, 'zhCN', '均糖', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70031 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70031, 'zhCN', '达纳斯', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70030 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70030, 'zhCN', '伊莎', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70029 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70029, 'zhCN', '吴', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70028 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70028, 'zhCN', '毕尔邦', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70027 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70027, 'zhCN', '凯尔夫', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70026 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70026, 'zhCN', '巴尔图斯', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70025 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70025, 'zhCN', '安琪拉', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70024 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70024, 'zhCN', '克里斯', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70023 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70023, 'zhCN', '西尔丹爱尔', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70022 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70022, 'zhCN', '阿丽亚思塔', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70021 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70021, 'zhCN', '凯拉', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70020 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70020, 'zhCN', '爱丽西娅', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70019 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70019, 'zhCN', '泽尔马克', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70018 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70018, 'zhCN', '索热克', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70017 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70017, 'zhCN', '格雷兹', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70016 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70016, 'zhCN', '塔尔肖', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70015 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70015, 'zhCN', '方儿', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70014 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70014, 'zhCN', '克兰', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70013 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70013, 'zhCN', '哈鲁特', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70012 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70012, 'zhCN', '柯尔', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70011 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70011, 'zhCN', '萨克', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70010 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70010, 'zhCN', '托姆', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70009 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70009, 'zhCN', '奥斯汀', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70008 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70008, 'zhCN', '丹娜', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70007 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70007, 'zhCN', '凯尔斯特拉姆', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70006 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70006, 'zhCN', '格兰尼斯', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70005 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70005, 'zhCN', '马洛什', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70004 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70004, 'zhCN', '安德尔', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70003 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70003, 'zhCN', '丽娜', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70002 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70002, 'zhCN', '思兰', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70001 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70001, 'zhCN', '莱恩', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70000 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70000, 'zhCN', '拉格雷塔', '机动雇佣兵 首领', NULL);\ndiff --git a/data/sql/Bots/locales/zhCN/npc_text_locale.sql b/data/sql/Bots/locales/zhCN/npc_text_locale.sql\nnew file mode 100644\nindex 0000000000..f31b23a401\n--- /dev/null\n+++ b/data/sql/Bots/locales/zhCN/npc_text_locale.sql\n@@ -0,0 +1,410 @@\n+DELETE FROM `npc_text_locale` WHERE `Locale`='zhCN' AND `ID` BETWEEN '70000' AND '71000';\n+INSERT INTO `npc_text_locale` (`ID`, `Locale`, `Text0_0`, `Text0_1`, `Text1_0`, `Text1_1`, `Text2_0`, `Text2_1`, `Text3_0`, `Text3_1`, `Text4_0`, `Text4_1`, `Text5_0`, `Text5_1`, `Text6_0`, `Text6_1`, `Text7_0`, `Text7_1`)\n+VALUES\n+('70001','zhCN','我愿意为你奉献一切。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70002','zhCN','你需要什么吗？',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70003','zhCN','凡人,通常情况下,我会立刻杀了你这混蛋！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70004','zhCN','<你看着这个黑曜石毁灭者。它看起来有点与众不同,它并没有因为你的伤害而消失,在仔细检查过后,你注意到它的背部有一个小口。>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70005','zhCN','<毁灭者盯着你,发出低沉的咆哮。>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70006','zhCN','你惊讶吗,凡人？作为一名纳斯雷兹姆,我不得不寻求盟友,你看起来至少可以逗我开心。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70007','zhCN','现在怎么样了,凡人？',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70008','zhCN','你就不能让我一个人静一静吗？ <唉。。。>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70009','zhCN','现在如何？',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70101','zhCN','|cffff3300剑圣|r$b|cffdd6600-=致敬魔兽争霸III=-|r$B$B\\\\\\\"剑圣,以前是燃烧之刃家族的成员,现在是部落中的精锐战士\\\".$B$B主要属性:敏捷.$B$B疾风步.让剑圣隐形,并在一段时间内移动得更快.当剑圣攻击一个单位以打破隐身状态时,他将造成额外的伤害.$B$B镜像.制造剑圣幻象迷惑敌人,并驱散剑圣的所有魔法.$B$B爆击(被动).有15%的几率在他的攻击中造成致命的x2(x3,x4)倍的正常伤害.$B$B剑刃风暴. 给予魔法免疫并对周围所有敌人造成伤害.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70102','zhCN','|cff9900cc黑曜石毁灭者|r$b|cffdd6600-=致敬魔兽争霸III=-|r$B$B\\\\\\\"黑曜石毁灭者,对魔法有着无法满足的渴望\\\\\\\".$B$B高护甲,非常高的抵抗力,部分免疫魔法,随着时间的推移失去法力\\\\并且不受益于被动法力再生效果,板甲,双持魔杖,造成暗影法术伤害,没有物理攻击\\\\法术伤害加成:50%攻击力+200% 智力增加魔杖伤害.$B$B吞噬魔法.从敌人身上驱散最多2个魔法效果,从盟友身上驱散最多2个魔法效果和最多2个诅咒,并在20码范围内伤害召唤单位.每次驱散效果回复20%法力和5%生命,7秒冷却.$B$B暗影爆炸.强化攻击,增加飞溅伤害.$B$B吸取法力.从随机友方单位吸取所有法力(受施法者法力限制).$B$B补充法力.给周围15码范围内的团队和团队成员通电,使其法力值达到最大值的1%,影响最多10个目标,冷却3秒.$B$B再生光环.治疗周围15码范围内的团队和团队成员,使其生命值降低施法者法力上限的2%,最多影响10个目标,冷却3秒.$B$B暗影护甲(被动).恢复相当于所受伤害百分比的法力值.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70103','zhCN','|cff0000dd大魔导师|r$b|cffdd6600-=致敬魔兽争霸III=-|r$B$B\\\\\\\"大法师,无法用言语来形容的暴雪亲儿子\\\\\\\".$B$B法术伤害降低35%,部分免疫控制效果,布甲,造成火/冰法术伤害,无物理攻击,法术能量加成:100%智力.主要属性:智力.$B$B暴风雪!典型的暴风雪,只是稍微强大一点,6秒冷却.召唤水元素攻击大法师的敌人1分钟,冷却20秒.$B$B光辉光环.增加10%的法力上限,大大提高40码范围内己方和队友的法力回复.$B$B大规模传送.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70104','zhCN','|cff9900cc恐惧魔王|r$b|cffdd6600-=致敬魔兽争霸III=-|r$B$B\\\\\\\"恐惧魔王,拥有黑暗力量和精神控制力的强大恶魔\\\\\\\".$B$B高护甲,高抵抗,部分免疫控制效果,所受伤害加速法术能量,板甲,造成近战/暗影法术伤害,对瘫痪目标造成额外伤害,法术能量加成:200%力量.主要属性:力量.$B$B腐蚀虫群.派一大群蝙蝠与混乱魔法结合,对面前锥形范围的敌人造成伤害,无法暴击,冷却10秒.$B$B沉睡.使敌方目标睡眠60秒,并允许下次对该目标的物理攻击忽视护甲,造成的直接伤害将唤醒目标,冷却6秒.$B$B吸血鬼的光环.增加5%的物理暴击伤害,治疗40码范围内的团队和突袭成员受到近战物理攻击和腐肉群伤害的百分比(恐惧领主100%,其他人25%),没有威胁.$B$B召唤地狱恶魔.召唤一个来自天空的恶魔,恶魔对魔法有很强的抵抗力并且持续180秒,180秒的冷却时间.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70105','zhCN','|cff0000dd破法者|r$b|cffdd6600-=致敬魔兽争霸III=-|r$B$B\\\\\\\"破法者,一个被训练来破坏和扭曲魔法能量的精灵战士\\\\\\\".$B$B法术伤害减少75%,部分免疫控制效果,护甲降低-30%,板甲,近战/奥术伤害,法术能量加成:200%力量.主要属性:力量.$B$B魔法偷取.从敌人身上偷取一个有益的法术并施于附近的盟友,或者从盟友身上移除一个消极的法术并施于附近的敌人,影响魔法和诅咒效果,3秒冷却.$B$B能量窃取(被动).成功的近战攻击消耗目标的法力,相当于造成的伤害(由法术力增加),造成奥术伤害.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70106','zhCN','|cff9900cc黑暗游侠|r$b|cffdd6600-=致敬魔兽争霸III=-|r$B$B\\\\\\\"黑暗游侠,强行起死回生的奎尔萨拉斯的前游侠\\\\\\\".$B$B法术伤害减少35%,不死系,部分免疫控制效果,皮甲/布甲,造成物理/暗影法术伤害,不产生威胁,法术力量加成:50%智力.主要属性:敏捷.$B$B沉默.使一个敌人和最多4个附近目标沉默8秒,15秒冷却.$B$B黑箭.射出一支诅咒之箭,造成150%武器伤害和额外的暗影伤害.如果受影响的目标死于黑暗游侠的伤害,黑暗仆从将从尸体中产生(最多5个仆从,持续时间80秒,只对人形、野兽和龙类有效).如果目标生命低于20%,造成5倍伤害.$B$B吸取生命.每秒吸取一个敌人的生命值,持续5秒,治疗黑暗游侠消耗生命值的200%.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70107','zhCN','|cff9900cc死灵法师|r$b|cffdd6600-=魔兽争霸III / 暗黑破坏神II致敬=-|r$B$B受到的法术伤害减少20%,部分免疫控制效果,布甲,造成暗影法术伤害,没有物理攻击,法术强度加成: 智力的100%。主属性: 智力。$B$B复活死者: 从尸体上复活2个骷髅(最多6个骷髅,持续65秒,只对人型生物、野兽和龙类有效)。$B$B邪恶狂热: 增加目标的近战攻击速度75%,但持续消耗生命。持续45秒。不能取消。30级解锁。$B$B尸体爆炸。让尸体爆炸,对周围所有敌人造成相当于死亡单位最大生命值35%至75%的伤害(取决于死灵法师的等级)。这种伤害不产生威胁。40级解锁。$B$B残废: 减少目标的移动速度、近战攻击速度和总力量50%,持续60秒。50级解锁。$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70108','zhCN','|cff0000dd海巫|r$b|cffdd6600-=魔兽争霸III致敬=-|r$B$B\"海洋中的凶猛鳞皮居民,常与巨大风暴的到来联系在一起。\"$B$B受到的法术伤害减少30%,部分免疫控制效果,布甲,造成物理/冰霜法术/风暴法术伤害,攻击力加成: 敏捷x2,法术强度加成: 智力的200%。主属性: 智力。$B$B分叉闪电: 召唤一道闪电锥,伤害敌人。从2到所有目标(取决于海巫的等级),使它们昏迷2秒。这种伤害不产生威胁。$B$B冰霜箭。用冰霜法术为箭矢增加额外伤害,减慢目标的移动、攻击和施法速度30%至70%(取决于海巫的等级)。$B$B法力护盾: 创造一个护盾,使用海巫的法力吸收100%的(未减免的)进来伤害。效果范围从每10法力吸收1伤害到每1法力吸收10伤害(取决于海巫的等级)。$B$B龙卷风: 召唤一个猛烈的龙卷风,伤害并减慢附近敌方单位的速度,有时完全使它们失去行动能力。龙卷风在户外随时间增长,增加伤害和影响区域,但在室内缩小,迅速消散。60级解锁。$B$B娜迦(被动): 在水中游泳速度、伤害和躲避几率大幅提升。$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70109','zhCN','|cff9900cc地穴领主|r$b|cffdd6600-=魔兽争霸III致敬=-|r$B$B\"古老的庞然大物,曾是艾泽拉斯之王之一,现在是巫妖王麾下最强大的亡灵战士之一。\"$B$B高度护甲,增加的抗性,部分免疫控制效果,免疫基于毒素的效果,锁甲/板甲,造成近战/暗影法术伤害,法术强度加成: 力量的200%。主属性: 力量。$B$B穿刺。地穴领主用他巨大的爪子猛击地面,向前锥形射出尖刺,造成伤害并将敌方单位掀入空中,使他们晕眩。20级解锁。$B$B刺甲: 地穴领主的几丁质护甲增加伤害抗性,并将15%至50%的伤害反弹给近战攻击者。$B$B腐尸甲虫。地穴领主从敌人的新鲜尸体上产生一个腐尸甲虫来攻击他的敌人。甲虫是永久的,但不会恢复生命值,一次最多控制6个。更高等级允许地穴领主召唤更强大的甲虫。10级解锁。$B$B蝗虫群: 地穴领主释放一群20-40只(取决于地穴领主的等级)愤怒的蝗虫,啃咬并撕扯附近的敌方单位,减少他们的移动或攻击能力。当它们啃食敌人肉体时,它们将其转化为一种物质,当它们返回时恢复地穴领主的生命值。40级解锁。$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70201','zhCN','并不总是有人愿意为钱去卖命！',NULL,'我们的服务遍布艾泽拉斯的每个角落！',NULL,'很高兴为您服务,我这里有最能打的家伙！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70202','zhCN','雇佣兵向来十分抢手；以下是现在你能雇佣的人: ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70203','zhCN','雇佣兵向来十分抢手；以下是现在你能雇佣的人: ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70204','zhCN','看来现在没有空闲的雇佣兵,你过些时候再来看看吧。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70300','zhCN','去死！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70301','zhCN','正在复活你！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70302','zhCN','正在复活 ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70303','zhCN','你的机器人',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70304','zhCN','的机器人',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70305','zhCN','我现在还不能制造魔法水',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70306','zhCN','我现在还不能制造魔法食物',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70307','zhCN','我还不能那样做',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70308','zhCN','给你...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70309','zhCN','已禁用',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70310','zhCN','还没有准备好',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70311','zhCN','无效的物品类型',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70312','zhCN','失败',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70313','zhCN','完成',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70314','zhCN','我没有变形',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70315','zhCN','我没有治疗石',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70316','zhCN','我还不能制造治疗石',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70317','zhCN','搞什么鬼,我没有锁可开！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70318','zhCN','我的技能等级还不够高',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70319','zhCN','正在将我的天赋切换为',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70320','zhCN','武器',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70321','zhCN','狂怒',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70322','zhCN','防护',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70323','zhCN','惩戒',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70324','zhCN','野兽控制',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70325','zhCN','射击',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70326','zhCN','生存',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70327','zhCN','刺杀',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70328','zhCN','战斗',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70329','zhCN','敏锐',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70330','zhCN','戒律',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70331','zhCN','神圣',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70332','zhCN','暗影',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70333','zhCN','鲜血',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70334','zhCN','冰霜',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70335','zhCN','邪恶',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70336','zhCN','元素',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70337','zhCN','增强',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70338','zhCN','恢复',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70339','zhCN','奥术',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70340','zhCN','火焰',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70341','zhCN','痛苦',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70342','zhCN','恶魔学识',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70343','zhCN','毁灭',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70344','zhCN','平衡',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70345','zhCN','野性战斗',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70346','zhCN','未知',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70347','zhCN','滚开！ 懦夫。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70348','zhCN',' 不方便。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70349','zhCN','我不会把我宝贵的时间浪费在这些琐事上！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70350','zhCN','NIY',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70351','zhCN','NIY',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70352','zhCN','NIY',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70353','zhCN','我准备好了',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70354','zhCN','走开！我已经有雇主了！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70355','zhCN','未知',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70356','zhCN','在你身上！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70357','zhCN','在我身上！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70358','zhCN',' 对 ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70359','zhCN',' 已使用！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70360','zhCN','坦克机器人',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70361','zhCN','职业',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70362','zhCN','玩家',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70363','zhCN','雇主',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70364','zhCN','无',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70365','zhCN','级别',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70366','zhCN','天赋',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70367','zhCN','被动',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70368','zhCN','隐藏',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70369','zhCN','已知',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70370','zhCN','能力',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70371','zhCN','力量',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70372','zhCN','敏捷',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70373','zhCN','耐力',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70374','zhCN','智力',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70375','zhCN','精神',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70376','zhCN','未知属性',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70377','zhCN','共',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70378','zhCN','近战攻击强度',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70379','zhCN','远程攻击强度',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70380','zhCN','护甲',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70381','zhCN','暴击',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70382','zhCN','防御',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70383','zhCN','未命中',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70384','zhCN','躲闪',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70385','zhCN','招架',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70386','zhCN','格挡',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70387','zhCN','盾牌格挡值',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70388','zhCN','近战防御',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70389','zhCN','法术防御',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70390','zhCN','主手攻击伤害范围',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70391','zhCN','主手攻击伤害加成',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70392','zhCN','主手攻击速度',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70393','zhCN','副手攻击伤害范围',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70394','zhCN','副手攻击伤害加成',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70395','zhCN','副手攻击速度',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70396','zhCN','远程攻击伤害范围',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70397','zhCN','远程攻击伤害加成',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70398','zhCN','远程攻击速度',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70399','zhCN','最小',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70400','zhCN','最大',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70401','zhCN','输出',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70402','zhCN','基础生命值',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70403','zhCN','最大生命值',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70404','zhCN','基础法力值',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70405','zhCN','最大法力值',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70406','zhCN','当前法力值',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70407','zhCN','法术强度',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70408','zhCN','每5秒恢复生命',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70409','zhCN','非施法状态: 每5秒回复法力值',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70410','zhCN','施法状态: 每5秒回复法力值',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70411','zhCN','急速',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70412','zhCN','命中',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70413','zhCN','专精',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70414','zhCN','物理 护甲穿透',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70415','zhCN','法术 护甲穿透',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70416','zhCN','%',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70417','zhCN','神圣',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70418','zhCN','火焰',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70419','zhCN','自然',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70420','zhCN','冰霜',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70421','zhCN','暗影',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70422','zhCN','奥术',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70423','zhCN','抗性',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70424','zhCN','指令状态',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70425','zhCN','跟随',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70426','zhCN','攻击',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70427','zhCN','停留',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70428','zhCN','重置',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70429','zhCN','完全停止',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70430','zhCN','跟随距离',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70431','zhCN','天赋',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70432','zhCN','机器人主职务',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70433','zhCN','机器人材料采集',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70434','zhCN','PvP 杀敌',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70435','zhCN','玩家',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70436','zhCN','已死亡 ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70437','zhCN',' 次',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70438','zhCN','%s (机器人)渐渐冷静了下来。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70439','zhCN','<Debug调试>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70440','zhCN','你真的想冒险引起',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70441','zhCN','对你的注意？',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70442','zhCN','<请投币>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70443','zhCN','你想吸引',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70444','zhCN','<试着发出邀请...>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70445','zhCN','你想雇佣',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70446','zhCN','<雇佣机器人>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70447','zhCN','机器人 装备 管理...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70448','zhCN','机器人 职责 管理...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70449','zhCN','机器人 队形 管理...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70450','zhCN','机器人 技能 管理...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70451','zhCN','机器人 天赋 管理...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70452','zhCN','使用消耗品、合剂等...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70453','zhCN','<创建队伍>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70454','zhCN','<创建队伍(所有机器人)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70455','zhCN','<加入队伍>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70456','zhCN','<将所有机器人加入队伍>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70457','zhCN','<移出队伍>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70458','zhCN','跟着我！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70459','zhCN','原地守候！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70460','zhCN','停下来,什么也别做！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70461','zhCN','给我一些食物',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70462','zhCN','给我一些水',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70463','zhCN','召唤一个魔法餐桌！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70464','zhCN','帮我开个锁',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70465','zhCN','给我一颗治疗石',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70466','zhCN','召唤一个灵魂之井！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70467','zhCN','给你的武器重新上毒...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70468','zhCN','<选择毒药 (主手武器)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70469','zhCN','<选择毒药 (副手武器)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70470','zhCN','元素武器附魔...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70471','zhCN','<选择附魔 (主手武器)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70472','zhCN','<选择附魔 (副手武器)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70473','zhCN','取消你的变形形态',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70474','zhCN','<选择宠物类型>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70475','zhCN','你被解雇了！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70476','zhCN','你确定要解雇',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70477','zhCN','你可别后悔...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70478','zhCN','该死的,振作起来！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70479','zhCN','<职业介绍>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70480','zhCN','没事了',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70481','zhCN','距离',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70482','zhCN','返回',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70483','zhCN','<自动>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70484','zhCN','<解散宠物>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70485','zhCN','召唤随机宠物 (狡诈型)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70486','zhCN','召唤随机宠物 (残暴型)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70487','zhCN','召唤随机宠物 (坚韧型)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70488','zhCN','让我看看你的装备',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70489','zhCN','自动筛选可用装备...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70490','zhCN','主手武器...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70491','zhCN','副手武器...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70492','zhCN','远程武器...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70493','zhCN','圣物...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70494','zhCN','头部...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70495','zhCN','肩部...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70496','zhCN','胸部...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70497','zhCN','腰带...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70498','zhCN','腿部...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70499','zhCN','脚...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70500','zhCN','手腕...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70501','zhCN','手...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70502','zhCN','披风...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70503','zhCN','衬衣...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70504','zhCN','戒指1...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70505','zhCN','戒指2...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70506','zhCN','饰品1...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70507','zhCN','饰品2...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70508','zhCN','颈部...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70509','zhCN','卸下全部装备(退回到背包)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70510','zhCN','刷新机器人外观',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70511','zhCN','只有外观,无实际效果',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70512','zhCN','已装备',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70513','zhCN','没有可供选择的装备',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70514','zhCN','使用你的旧装备',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70515','zhCN','卸下这件装备',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70516','zhCN','额...我没有适合你的装备了...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70517','zhCN','收集材料',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70518','zhCN','技能状态...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70519','zhCN','管理可用技能...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70520','zhCN','使用 ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70521','zhCN','刷新',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70522','zhCN','伤害类技能...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70523','zhCN','控制类技能...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70524','zhCN','治疗类技能...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70525','zhCN','其他技能...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70526','zhCN',' 发出了一阵摩擦声,并开始跟随着 ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70527','zhCN','在他的雇主把他解雇之前, %s不能加入你的队伍。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70528','zhCN','在你到达60级以前, %s不会加入你们',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70529','zhCN','在你到达55级以前, %s不会加入你们',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70530','zhCN','在你到达40级以前, %s不会加入你们',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70531','zhCN','在你到达20级以前, %s不会加入你们',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70532','zhCN','你最多只能招募%u个机器人！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70533','zhCN','你没有足够的现金',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70534','zhCN','你最多只能招募%u位%u。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70535','zhCN','无法退还装备 %u (%s)! 无法解雇机器人！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70536','zhCN','当前设定',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70537','zhCN','攻击距离',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70538','zhCN','最小远程攻击距离...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70539','zhCN','最大远程攻击距离...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70540','zhCN','设定攻击距离',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70541','zhCN','移除增益魔法...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70542','zhCN','修正属性...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70543','zhCN','因为某些原因,无法卸下 %s 这件装备将发到你的邮箱。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70544','zhCN','坦克',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70545','zhCN','远程',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70546','zhCN','采矿',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70547','zhCN','草药',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70548','zhCN','剥皮',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70549','zhCN','工程学',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70550','zhCN','由于长时间未上线,已自动解除雇佣状态。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70551','zhCN','机器人系统已被禁用,请联系管理员。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70552','zhCN','%s 不能假如你的队伍,已经有雇主了: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70553','zhCN','%s 正在传送中,不能加入你的队伍',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70554','zhCN','守护',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70555','zhCN','灵猴',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70556','zhCN','雄鹰守护',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70557','zhCN','猎豹守护',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70558','zhCN','蝰蛇守护',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70559','zhCN','野兽守护',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70560','zhCN','豹群守护',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70561','zhCN','野性守护',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70562','zhCN','龙鹰守护',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70563','zhCN','无守护',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70564','zhCN','光环',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70565','zhCN','虔诚',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70566','zhCN','专注',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70567','zhCN','火焰抗性',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70568','zhCN','冰霜抗性',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70569','zhCN','暗影抗性',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70570','zhCN','惩戒',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70571','zhCN','十字军',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70572','zhCN','无光环',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70573','zhCN','减速药膏',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70574','zhCN','速效药膏',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70575','zhCN','致命药膏',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70576','zhCN','致伤药膏',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70577','zhCN','麻痹药膏',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70578','zhCN','麻醉药膏',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70579','zhCN','无',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70580','zhCN','火舌武器',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70581','zhCN','冰封武器',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70582','zhCN','风怒武器',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70583','zhCN','大地生命武器',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70584','zhCN','我需要你的服务。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70585','zhCN','你不能再雇佣更多的机器人了。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70586','zhCN','你希望雇佣',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70587','zhCN','现在正在忙着,请稍后再试。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70588','zhCN','很高兴和你进行交易。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70589','zhCN','战士',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70590','zhCN','圣骑士',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70591','zhCN','法师',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70592','zhCN','牧师',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70593','zhCN','术士',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70594','zhCN','德鲁伊',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70595','zhCN','死亡骑士',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70596','zhCN','盗贼',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70597','zhCN','萨满',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70598','zhCN','猎人',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70599','zhCN','剑圣',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70600','zhCN','黑曜石毁灭者',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70601','zhCN','大法师',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70602','zhCN','恐惧魔王',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70603','zhCN','破法者',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70604','zhCN','黑暗游侠',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70605','zhCN','战士',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70606','zhCN','圣骑士',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70607','zhCN','法师',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70608','zhCN','牧师',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70609','zhCN','术士',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70610','zhCN','德鲁伊',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70611','zhCN','死亡骑士',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70612','zhCN','盗贼',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70613','zhCN','萨满',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70614','zhCN','猎人',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70615','zhCN','剑圣',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70616','zhCN','黑曜石毁灭者',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70617','zhCN','大法师',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70618','zhCN','恐惧魔王',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70619','zhCN','破法者',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70620','zhCN','黑暗游侠',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70621','zhCN','男',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70622','zhCN','女',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70623','zhCN','人类',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70624','zhCN','兽人',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70625','zhCN','矮人',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70626','zhCN','暗夜精灵',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70627','zhCN','亡灵',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70628','zhCN','牛头人',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70629','zhCN','侏儒',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70630','zhCN','地精',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70631','zhCN','血精灵',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70632','zhCN','德莱尼',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70633','zhCN','未知',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70634','zhCN','自动拾取',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70635','zhCN','|cff9d9d9d灰色|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70636','zhCN','|cffffffff白色|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70637','zhCN','|cff1eff00绿色|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70638','zhCN','|cff0070dd蓝色|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70639','zhCN','|cffa335ee紫色|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70640','zhCN','|cffff8000橙色|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70641','zhCN','参与行为',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70642','zhCN','|延迟攻击时间|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70643','zhCN','|延迟治疗时间|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70644','zhCN','|秒|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70645','zhCN','|副坦克|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70646','zhCN','|亡灵法师们|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70647','zhCN','|亡灵法师|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70648','zhCN','|攻击方向|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70649','zhCN','|正常|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70650','zhCN','|避免正面AOE|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70651','zhCN','|NIY|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70652','zhCN','|你确定这会奏效吗？最好是世界上最好的水....|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70653','zhCN','|看来你真的需要喝点淡水。|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70654','zhCN','|海女巫们|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70655','zhCN','|海女巫|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70656','zhCN','|每点伤害的法力|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70657','zhCN','|每点魔法的伤害|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70658','zhCN','幻化...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70659','zhCN','禁用战斗定位',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70660','zhCN','优先目标',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70661','zhCN','机器人装备银行...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70662','zhCN','存款项目...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70663','zhCN','撤回物品...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70664','zhCN','银行是空的',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70665','zhCN','前一页',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70666','zhCN','下一页',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70667','zhCN','你真的想花这么多钱让地穴领主再次动起来吗？',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70668','zhCN','我很怀疑你现在的状态,但我愿意带领你并帮助你恢复力量。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70669','zhCN','地穴领主们|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70670','zhCN','|地穴领主|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70671','zhCN','反射',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70672','zhCN','蝗虫',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70673','zhCN','治疗目标生命阈值',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70674','zhCN','我需要传送门',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70675','zhCN','暴风城',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70676','zhCN','铁炉堡',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70677','zhCN','达纳苏斯',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70678','zhCN','埃索达',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70679','zhCN','奥格瑞玛',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70680','zhCN','幽暗城',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70681','zhCN','雷霆崖',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70682','zhCN','银月城',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70683','zhCN','沙塔斯城',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70684','zhCN','达拉然',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);\n\\ No newline at end of file\ndiff --git a/data/sql/Bots/locales/zhTW/npc_text_locale.sql b/data/sql/Bots/locales/zhTW/npc_text_locale.sql\nnew file mode 100644\nindex 0000000000..755337d834\n--- /dev/null\n+++ b/data/sql/Bots/locales/zhTW/npc_text_locale.sql\n@@ -0,0 +1,410 @@\n+DELETE FROM `npc_text_locale` WHERE `Locale`='zhTW' AND `ID` BETWEEN '70000' AND '71000';\n+INSERT INTO `npc_text_locale` (`ID`, `Locale`, `Text0_0`, `Text0_1`, `Text1_0`, `Text1_1`, `Text2_0`, `Text2_1`, `Text3_0`, `Text3_1`, `Text4_0`, `Text4_1`, `Text5_0`, `Text5_1`, `Text6_0`, `Text6_1`, `Text7_0`, `Text7_1`)\n+VALUES\n+('70001','zhTW','我願意為你奉獻一切。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70002','zhTW','你需要什麼嗎？',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70003','zhTW','凡人，通常情況下，我會立刻殺了你這混蛋！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70004','zhTW','<你看著這個黑曜石毀滅者。它看起來有點與眾不同，它並沒有因為你的傷害而消失，在仔細檢查過後，你注意到它的背部有一個小口。>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70005','zhTW','<毀滅者盯著你，發出低沉的咆哮。>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70006','zhTW','你驚訝嗎，凡人？作為一名納斯雷茲姆，我不得不尋求盟友，你看起來至少可以逗我開心。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70007','zhTW','現在怎麼樣了，凡人？',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70008','zhTW','你就不能讓我一個人靜一靜嗎？ <唉...>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70009','zhTW','現在如何？',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70101','zhTW','|cffff3300劍聖|r$b|cffdd6600-=致敬魔獸爭霸III=-|r$B$B\\\\\\\"劍聖,以前是燃燒之刃家族的成員,現在是部落中的精銳戰士\\\".$B$B主要屬性:敏捷.$B$B疾風步.讓劍聖隱形,並在一段時間內移動得更快.當劍聖攻擊一個單位以打破隱身狀態時,他將造成額外的傷害.$B$B鏡像.製造劍聖幻象迷惑敵人,並驅散劍聖的所有魔法.$B$B爆擊(被動).有15%的機率在他的攻擊中造成致命的x2(x3,x4)倍的正常傷害.$B$B劍刃風暴. 給予魔法免疫並對周圍所有敵人造成傷害.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70102','zhTW','|cff9900cc黑曜石毀滅者|r$b|cffdd6600-=致敬魔獸爭霸III=-|r$B$B\\\\\\\"黑曜石毀滅者,對魔法有著無法滿足的渴望\\\\\\\".$B$B高護甲,非常高的抵抗力,部分免疫魔法,隨著時間的推移失去法力\\\\並且不受益於被動法力再生效果,鎧甲,雙持魔杖,造成暗影法術傷害,沒有物理攻擊\\\\法術傷害加成:50%攻擊力+200% 智力增加魔杖傷害.$B$B吞噬魔法.從敵人身上驅散最多2個魔法效果,從盟友身上驅散最多2個魔法效果和最多2個詛咒,並在20碼範圍內傷害召喚單位.每次驅散效果回復20%法力和5%生命,7秒冷卻.$B$B暗影爆炸.強化攻擊,增加飛濺傷害.$B$B吸取法力.從隨機友方單位吸取所有法力(受施法者法力限制).$B$B補充法力.給周圍15碼範圍內的團隊和團隊成員通電,使其法力值達到最大值的1%,影響最多10個目標,冷卻3秒.$B$B再生光環.治療周圍15碼範圍內的團隊和團隊成員,使其生命值降低施法者法力上限的2%,最多影響10個目標,冷卻3秒.$B$B暗影護甲(被動).恢復相當於所受傷害百分比的法力值.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70103','zhTW','|cff0000dd大魔導師|r$b|cffdd6600-=致敬魔獸爭霸III=-|r$B$B\\\\\\\"大法師,無法用言語來形容的暴雪親兒子\\\\\\\".$B$B法術傷害降低35%,部分免疫控制效果,布甲,造成火/冰法術傷害,無物理攻擊,法術能量加成:100%智力.主要屬性:智力.$B$B暴風雪！典型的暴風雪,只是稍微強大一點,6秒冷卻.召喚水元素攻擊大法師的敵人1分鐘,冷卻20秒.$B$B光輝光環.增加10%的法力上限,大大提高40碼範圍內己方和隊友的法力回復.$B$B大規模傳送.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70104','zhTW','|cff9900cc恐懼魔王|r$b|cffdd6600-=致敬魔獸爭霸III=-|r$B$B\\\\\\\"恐懼魔王,擁有黑暗力量和精神控制力的強大惡魔\\\\\\\".$B$B高護甲,高抵抗,部分免疫控制效果,所受傷害加速法術能量,鎧甲,造成近戰/暗影法術傷害,對癱瘓目標造成額外傷害,法術能量加成:200%力量.主要屬性:力量.$B$B腐蝕蟲群.派一大群蝙蝠與混亂魔法結合,對面前錐形範圍的敵人造成傷害,無法暴擊,冷卻10秒.$B$B沉睡.使敵方目標睡眠60秒,並允許下次對該目標的物理攻擊忽視護甲,造成的直接傷害將喚醒目標,冷卻6秒.$B$B吸血鬼的光環.增加5%的物理暴擊傷害,治療40碼範圍內的團隊和突襲成員受到近戰物理攻擊和腐肉群傷害的百分比(驚懼領主100%,其他人25%),沒有威脅.$B$B召喚地獄惡魔.召喚一個來自天空的惡魔,惡魔對魔法有很強的抵抗力並且持續180秒,180秒的冷卻時間.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70105','zhTW','|cff0000dd破法者|r$b|cffdd6600-=致敬魔獸爭霸III=-|r$B$B\\\\\\\"破法者,一個被訓練來破壞和扭曲魔法能量的精靈戰士\\\\\\\".$B$B法術傷害減少75%,部分免疫控制效果,護甲降低-30%,鎧甲,近戰/秘法傷害,法術能量加成:200%力量.主要屬性:力量.$B$B魔法偷取.從敵人身上偷取一個有益的法術並施於附近的盟友,或者從盟友身上移除一個消極的法術並施於附近的敵人,影響魔法和詛咒效果,3秒冷卻.$B$B能量竊取(被動).成功的近戰攻擊消耗目標的法力,相當於造成的傷害(由法術力增加),造成秘法傷害.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70106','zhTW','|cff9900cc黑暗遊俠|r$b|cffdd6600-=致敬魔獸爭霸III=-|r$B$B\\\\\\\"黑暗遊俠,強行起死回生的奎爾薩拉斯的前遊俠\\\\\\\".$B$B法術傷害減少35%,不死系,部分免疫控制效果,皮甲/布甲,造成物理/暗影法術傷害,不產生威脅,法術力量加成:50%智力.主要屬性:敏捷.$B$B沉默.使一個敵人和最多4個附近目標沉默8秒,15秒冷卻.$B$B黑箭.射出一支詛咒之箭,造成150%武器傷害和額外的暗影傷害.如果受影響的目標死於黑暗遊俠的傷害,黑暗僕從將從屍體中產生(最多5個僕從,持續時間80秒,只對人形、野獸和龍類有效).如果目標生命低於20%,造成5倍傷害.$B$B吸取生命.每秒吸取一個敵人的生命值,持續5秒,治療黑暗遊俠消耗生命值的200%.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70107','zhTW','|cff9900cc死靈法師|r$b|cffdd6600-=魔獸爭霸III / 暗黑破壞神II致敬=-|r$B$B受到的法術傷害減少20%,部分免疫控制效果,布甲,造成暗影法術傷害,沒有物理攻擊,法術強度加成: 智力的100%。主屬性: 智力。$B$B復活死者: 從屍體上復活2個骷髏(最多6個骷髏,持續65秒,只對人型生物、野獸和龍類有效)。$B$B邪惡狂熱: 增加目標的近戰攻擊速度75%,但持續消耗生命。持續45秒。不能取消。30級解鎖。$B$B屍體爆炸。讓屍體爆炸,對周圍所有敵人造成相當於死亡單位最大生命值35%至75%的傷害(取決於死靈法師的等級)。這種傷害不產生威脅。40級解鎖。$B$B殘廢: 減少目標的移動速度、近戰攻擊速度和總力量50%,持續60秒。50級解鎖。$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70108','zhTW','|cff0000dd海巫|r$b|cffdd6600-=魔獸爭霸III致敬=-|r$B$B\"海洋中的凶猛鱗皮居民,常與巨大風暴的到來聯繫在一起。\"$B$B受到的法術傷害減少30%,部分免疫控制效果,布甲,造成物理/冰霜法術/風暴法術傷害,攻擊力加成: 敏捷x2,法術強度加成: 智力的200%。主屬性: 智力。$B$B分叉閃電: 召喚一道閃電錐,傷害敵人。從2到所有目標(取決於海巫的等級),使它們昏迷2秒。這種傷害不產生威脅。$B$B冰霜箭。用冰霜法術為箭矢增加額外傷害,減慢目標的移動、攻擊和施法速度30%至70%(取決於海巫的等級)。$B$B法力護盾: 創造一個護盾,使用海巫的法力吸收100%的(未減免的)進來傷害。效果範圍從每10法力吸收1傷害到每1法力吸收10傷害(取決於海巫的等級)。$B$B龍捲風: 召喚一個猛烈的龍捲風,傷害並減慢附近敵方單位的速度,有時完全使它們失去行動能力。龍捲風在戶外隨時間增長,增加傷害和影響區域,但在室內縮小,迅速消散。60級解鎖。$B$B娜迦(被動): 在水中游泳速度、傷害和躲避機率大幅提升。$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70109','zhTW','|cff9900cc地穴領主|r$b|cffdd6600-=魔獸爭霸III致敬=-|r$B$B\"古老的龐然大物,曾是艾澤拉斯之王之一,現在是巫妖王麾下最強大的亡靈戰士之一。\"$B$B高度護甲,增加的抗性,部分免疫控制效果,免疫基於毒素的效果,鎖甲/板甲,造成近戰/暗影法術傷害,法術強度加成: 力量的200%。主屬性: 力量。$B$B穿刺。地穴領主用他巨大的爪子猛擊地面,向前錐形射出尖刺,造成傷害並將敵方單位掀入空中,使他們暈眩。20級解鎖。$B$B刺甲: 地穴領主的幾丁質護甲增加傷害抗性,並將15%至50%的傷害反彈給近戰攻擊者。$B$B腐屍甲蟲。地穴領主從敵人的新鮮屍體上產生一個腐屍甲蟲來攻擊他的敵人。甲蟲是永久的,但不會恢復生命值,一次最多控制6個。更高等級允許地穴領主召喚更強大的甲蟲。10級解鎖。$B$B蝗蟲群: 地穴領主釋放一群20-40隻(取決於地穴領主的等級)憤怒的蝗蟲,啃咬並撕扯附近的敵方單位,減少他們的移動或攻擊能力。當它們啃食敵人肉體時,它們將其轉化為一種物質,當它們返回時恢復地穴領主的生命值。40級解鎖。$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70201','zhTW','並不總是有人願意為錢去賣命！',NULL,'我們的服務遍布艾澤拉斯的每個角落！',NULL,'很高興為您服務，我這里有最能打的傢伙！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70202','zhTW','雇傭兵向來十分搶手；以下是現在你能雇傭的人：',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70203','zhTW','雇傭兵向來十分搶手；以下是現在你能雇傭的人：',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70204','zhTW','看來現在沒有空閒的雇傭兵，你過些時候再來看看吧。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70300','zhTW','去死！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70301','zhTW','正在復活你！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70302','zhTW','正在復活 ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70303','zhTW','你的機器人',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70304','zhTW','的機器人',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70305','zhTW','我現在還不能製造魔法水',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70306','zhTW','我現在還不能製造魔法食物',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70307','zhTW','我還不能那樣做',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70308','zhTW','給你...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70309','zhTW','已禁用',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70310','zhTW','還沒有準備好',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70311','zhTW','無效的物品類型',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70312','zhTW','失敗',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70313','zhTW','完成',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70314','zhTW','我沒有變形',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70315','zhTW','我沒有治療石',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70316','zhTW','我還不能製造治療石',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70317','zhTW','搞什麼鬼，我沒有鎖可開！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70318','zhTW','我的技能等級還不夠高',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70319','zhTW','正在將我的天賦切換為',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70320','zhTW','武器',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70321','zhTW','狂怒',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70322','zhTW','防護',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70323','zhTW','懲戒',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70324','zhTW','野獸控制',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70325','zhTW','射擊',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70326','zhTW','生存',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70327','zhTW','刺殺',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70328','zhTW','戰鬥',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70329','zhTW','敏銳',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70330','zhTW','戒律',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70331','zhTW','神聖',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70332','zhTW','暗影',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70333','zhTW','鮮血',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70334','zhTW','冰霜',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70335','zhTW','邪惡',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70336','zhTW','元素',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70337','zhTW','增強',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70338','zhTW','恢復',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70339','zhTW','秘法',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70340','zhTW','火焰',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70341','zhTW','痛苦',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70342','zhTW','惡魔學識',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70343','zhTW','毀滅',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70344','zhTW','平衡',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70345','zhTW','野性戰鬥',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70346','zhTW','未知',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70347','zhTW','滾開！ 懦夫。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70348','zhTW',' 不方便。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70349','zhTW','我不會把我寶貴的時間浪費在這些瑣事上！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70350','zhTW','NIY',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70351','zhTW','NIY',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70352','zhTW','NIY',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70353','zhTW','我準備好了',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70354','zhTW','走開！我已經有雇主了！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70355','zhTW','未知',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70356','zhTW','在你身上！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70357','zhTW','在我身上！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70358','zhTW',' 對 ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70359','zhTW',' 已使用！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70360','zhTW','坦克機器人',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70361','zhTW','職業',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70362','zhTW','玩家',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70363','zhTW','雇主',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70364','zhTW','無',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70365','zhTW','級別',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70366','zhTW','天賦',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70367','zhTW','被動',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70368','zhTW','隱藏',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70369','zhTW','已知',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70370','zhTW','能力',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70371','zhTW','力量',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70372','zhTW','敏捷',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70373','zhTW','耐力',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70374','zhTW','智力',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70375','zhTW','精神',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70376','zhTW','未知屬性',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70377','zhTW','共',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70378','zhTW','近戰攻擊強度',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70379','zhTW','遠程攻擊強度',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70380','zhTW','護甲',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70381','zhTW','暴擊',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70382','zhTW','防禦',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70383','zhTW','未命中',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70384','zhTW','躲閃',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70385','zhTW','招架',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70386','zhTW','格擋',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70387','zhTW','盾牌格擋值',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70388','zhTW','近戰防禦',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70389','zhTW','法術防禦',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70390','zhTW','主手攻擊傷害範圍',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70391','zhTW','主手攻擊傷害加成',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70392','zhTW','主手攻擊速度',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70393','zhTW','副手攻擊傷害範圍',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70394','zhTW','副手攻擊傷害加成',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70395','zhTW','副手攻擊速度',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70396','zhTW','遠程攻擊傷害範圍',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70397','zhTW','遠程攻擊傷害加成',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70398','zhTW','遠程攻擊速度',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70399','zhTW','最小',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70400','zhTW','最大',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70401','zhTW','輸出',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70402','zhTW','基礎生命值',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70403','zhTW','最大生命值',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70404','zhTW','基礎法力值',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70405','zhTW','最大法力值',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70406','zhTW','當前法力值',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70407','zhTW','法術強度',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70408','zhTW','每5秒恢復生命',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70409','zhTW','非施法狀態：每5秒回復法力值',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70410','zhTW','施法狀態：每5秒回復法力值',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70411','zhTW','急速',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70412','zhTW','命中',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70413','zhTW','專精',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70414','zhTW','物理 護甲穿透',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70415','zhTW','法術 護甲穿透',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70416','zhTW','%',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70417','zhTW','神聖',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70418','zhTW','火焰',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70419','zhTW','自然',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70420','zhTW','冰霜',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70421','zhTW','暗影',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70422','zhTW','秘法',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70423','zhTW','抗性',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70424','zhTW','指令狀態',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70425','zhTW','跟隨',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70426','zhTW','攻擊',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70427','zhTW','停留',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70428','zhTW','重置',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70429','zhTW','完全停止',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70430','zhTW','跟隨距離',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70431','zhTW','天賦',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70432','zhTW','機器人主職務',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70433','zhTW','機器人材料採集',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70434','zhTW','PvP 殺敵',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70435','zhTW','玩家',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70436','zhTW','已死亡 ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70437','zhTW',' 次',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70438','zhTW','%s （機器人）漸漸冷靜了下來。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70439','zhTW','<Debug調試>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70440','zhTW','你真的想冒險引起',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70441','zhTW','對你的注意？',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70442','zhTW','<請投幣>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70443','zhTW','你想吸引',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70444','zhTW','<試著發出邀請...>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70445','zhTW','你想雇傭',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70446','zhTW','<雇傭機器人>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70447','zhTW','機器人 裝備 管理...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70448','zhTW','機器人 職責 管理...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70449','zhTW','機器人 隊形 管理...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70450','zhTW','機器人 技能 管理...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70451','zhTW','機器人 天賦 管理...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70452','zhTW','使用消耗品、合劑等...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70453','zhTW','<創建隊伍>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70454','zhTW','<創建隊伍（所有機器人）>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70455','zhTW','<加入隊伍>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70456','zhTW','<將所有機器人加入隊伍>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70457','zhTW','<移出隊伍>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70458','zhTW','跟著我！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70459','zhTW','原地守候！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70460','zhTW','停下來，什麼也別做！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70461','zhTW','給我一些食物',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70462','zhTW','給我一些水',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70463','zhTW','召喚一個魔法餐桌！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70464','zhTW','幫我開個鎖',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70465','zhTW','給我一顆治療石',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70466','zhTW','召喚一個靈魂之井！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70467','zhTW','給你的武器重新上毒...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70468','zhTW','<選擇毒藥 （主手武器）>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70469','zhTW','<選擇毒藥 （副手武器）>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70470','zhTW','元素武器附魔...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70471','zhTW','<選擇附魔 （主手武器）>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70472','zhTW','<選擇附魔 （副手武器）>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70473','zhTW','取消你的變形形態',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70474','zhTW','<選擇寵物類型>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70475','zhTW','你被解雇了！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70476','zhTW','你確定要解雇',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70477','zhTW','你可別後悔...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70478','zhTW','該死的，振作起來！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70479','zhTW','<職業介紹>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70480','zhTW','沒事了',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70481','zhTW','距離',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70482','zhTW','返回',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70483','zhTW','<自動>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70484','zhTW','<解散寵物>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70485','zhTW','召喚隨機寵物 (狡詐型)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70486','zhTW','召喚隨機寵物 (殘暴型)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70487','zhTW','召喚隨機寵物 (堅韌型)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70488','zhTW','讓我看看你的裝備',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70489','zhTW','自動篩選可用裝備...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70490','zhTW','主手武器...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70491','zhTW','副手武器...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70492','zhTW','遠程武器...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70493','zhTW','聖物...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70494','zhTW','頭部...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70495','zhTW','肩部...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70496','zhTW','胸部...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70497','zhTW','腰帶...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70498','zhTW','腿部...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70499','zhTW','腳...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70500','zhTW','手腕...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70501','zhTW','手...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70502','zhTW','披風...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70503','zhTW','襯衣...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70504','zhTW','戒指1...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70505','zhTW','戒指2...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70506','zhTW','飾品1...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70507','zhTW','飾品2...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70508','zhTW','頸部...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70509','zhTW','卸下全部裝備（退回到背包）',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70510','zhTW','刷新機器人外觀',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70511','zhTW','只有外觀，無實際效果',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70512','zhTW','已裝備',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70513','zhTW','沒有可供選擇的裝備',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70514','zhTW','使用你的舊裝備',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70515','zhTW','卸下這件裝備',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70516','zhTW','額...我沒有適合你的裝備了...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70517','zhTW','收集材料',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70518','zhTW','技能狀態...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70519','zhTW','管理可用技能...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70520','zhTW','使用 ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70521','zhTW','刷新',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70522','zhTW','傷害類技能...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70523','zhTW','控制類技能...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70524','zhTW','治療類技能...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70525','zhTW','其他技能...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70526','zhTW',' 發出了一陣摩擦聲，並開始跟隨著 ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70527','zhTW','在他的雇主把他解雇之前， %s不能加入你的隊伍。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70528','zhTW','在你到達60級以前， %s不會加入你們',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70529','zhTW','在你到達55級以前， %s不會加入你們',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70530','zhTW','在你到達40級以前， %s不會加入你們',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70531','zhTW','在你到達20級以前， %s不會加入你們',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70532','zhTW','你最多只能招募%u個機器人！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70533','zhTW','你沒有足夠的現金',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70534','zhTW','你最多只能招募%u位%u。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70535','zhTW','無法退還裝備 %u (%s)! 無法解雇機器人！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70536','zhTW','當前設定',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70537','zhTW','攻擊距離',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70538','zhTW','最小遠程攻擊距離...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70539','zhTW','最大遠程攻擊距離...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70540','zhTW','設定攻擊距離',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70541','zhTW','移除增益魔法...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70542','zhTW','修正屬性...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70543','zhTW','因為某些原因，無法卸下 %s 這件裝備將發到你的郵箱。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70544','zhTW','坦克',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70545','zhTW','遠程',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70546','zhTW','採礦',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70547','zhTW','草藥',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70548','zhTW','剝皮',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70549','zhTW','工程學',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70550','zhTW','由於長時間未上線，已自動解除雇傭狀態。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70551','zhTW','機器人系統已被停用，請聯系管理員。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70552','zhTW','%s 不能假如你的隊伍，已經有雇主了：%s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70553','zhTW','%s 正在傳送中，不能加入你的隊伍',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70554','zhTW','守護',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70555','zhTW','靈猴',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70556','zhTW','雄鷹守護',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70557','zhTW','獵豹守護',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70558','zhTW','蝮蛇守護',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70559','zhTW','野獸守護',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70560','zhTW','豹群守護',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70561','zhTW','野性守護',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70562','zhTW','龍鷹守護',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70563','zhTW','無守護',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70564','zhTW','光環',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70565','zhTW','虔誠',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70566','zhTW','專注',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70567','zhTW','火焰抗性',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70568','zhTW','冰霜抗性',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70569','zhTW','暗影抗性',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70570','zhTW','懲戒',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70571','zhTW','十字軍',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70572','zhTW','無光環',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70573','zhTW','減速藥膏',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70574','zhTW','速效藥膏',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70575','zhTW','致命藥膏',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70576','zhTW','致傷藥膏',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70577','zhTW','麻痹藥膏',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70578','zhTW','麻醉藥膏',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70579','zhTW','無',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70580','zhTW','火舌武器',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70581','zhTW','冰封武器',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70582','zhTW','風怒武器',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70583','zhTW','大地生命武器',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70584','zhTW','我需要你的服務。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70585','zhTW','你不能再雇傭更多的機器人了。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70586','zhTW','你希望雇傭',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70587','zhTW','現在正在忙著，請稍後再試。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70588','zhTW','很高興和你進行交易。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70589','zhTW','戰士',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70590','zhTW','聖騎士',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70591','zhTW','法師',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70592','zhTW','牧師',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70593','zhTW','術士',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70594','zhTW','德魯伊',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70595','zhTW','死亡騎士',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70596','zhTW','盜賊',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70597','zhTW','薩滿',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70598','zhTW','獵人',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70599','zhTW','劍聖',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70600','zhTW','黑曜石毀滅者',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70601','zhTW','大法師',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70602','zhTW','恐懼魔王',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70603','zhTW','破法者',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70604','zhTW','黑暗遊俠',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70605','zhTW','戰士',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70606','zhTW','聖騎士',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70607','zhTW','法師',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70608','zhTW','牧師',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70609','zhTW','術士',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70610','zhTW','德魯伊',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70611','zhTW','死亡騎士',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70612','zhTW','盜賊',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70613','zhTW','薩滿',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70614','zhTW','獵人',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70615','zhTW','劍聖',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70616','zhTW','黑曜石毀滅者',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70617','zhTW','大法師',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70618','zhTW','恐懼魔王',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70619','zhTW','破法者',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70620','zhTW','黑暗遊俠',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70621','zhTW','男',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70622','zhTW','女',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70623','zhTW','人類',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70624','zhTW','獸人',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70625','zhTW','矮人',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70626','zhTW','夜精靈',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70627','zhTW','不死族',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70628','zhTW','牛頭人',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70629','zhTW','地精',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70630','zhTW','食人妖',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70631','zhTW','血精靈',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70632','zhTW','德萊尼',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70633','zhTW','未知',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70634','zhTW','自動拾取',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70635','zhTW','|cff9d9d9d灰色|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70636','zhTW','|cffffffff白色|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70637','zhTW','|cff1eff00綠色|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70638','zhTW','|cff0070dd藍色|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70639','zhTW','|cffa335ee紫色|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70640','zhTW','|cffff8000橙色|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70641','zhTW','參與行為',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70642','zhTW','|延遲攻擊時間|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70643','zhTW','|延遲治療時間|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70644','zhTW','|秒|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70645','zhTW','|副坦克|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70646','zhTW','|死靈法師們|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70647','zhTW','|死靈法師|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70648','zhTW','|攻擊方向|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70649','zhTW','|正常|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70650','zhTW','|避免正面AOE|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70651','zhTW','|NIY|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70652','zhTW','|你確定這會奏效嗎？最好是世界上最好的水....|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70653','zhTW','|看來你真的需要喝點淡水。|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70654','zhTW','|海女巫們|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70655','zhTW','|海女巫|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70656','zhTW','|每點傷害的法力|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70657','zhTW','|每點魔法的傷害|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70658','zhTW','幻化...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70659','zhTW','禁用戰鬥定位',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70660','zhTW','優先目標',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70661','zhTW','機器人裝備銀行...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70662','zhTW','存款項目...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70663','zhTW','撤回物品...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70664','zhTW','銀行是空的',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70665','zhTW','前一頁',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70666','zhTW','下一頁',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70667','zhTW','你真的想花這麼多錢讓地窟領主再次動起來嗎？',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70668','zhTW','我很懷疑你現在的狀態,但我願意帶領你並幫助你恢復力量。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70669','zhTW','地窟領主們|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70670','zhTW','|地窟領主|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70671','zhTW','反射',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70672','zhTW','蝗蟲',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70673','zhTW','治療目標生命閾值',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70674','zhTW','我需要傳送門',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70675','zhTW','暴風城',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70676','zhTW','鐵爐堡',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70677','zhTW','達納蘇斯',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70678','zhTW','艾克索達',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70679','zhTW','奧格瑞瑪',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70680','zhTW','幽暗城',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70681','zhTW','雷霆崖',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70682','zhTW','銀月城',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70683','zhTW','沙塔斯城',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70684','zhTW','達拉然',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);\ndiff --git a/data/sql/base/db_characters/characters_npcbot.sql b/data/sql/base/db_characters/characters_npcbot.sql\nnew file mode 100644\nindex 0000000000..bf7b507753\n--- /dev/null\n+++ b/data/sql/base/db_characters/characters_npcbot.sql\n@@ -0,0 +1,33 @@\n+--\n+SET FOREIGN_KEY_CHECKS=0;\n+-- ----------------------------\n+-- Table structure for characters_npcbot\n+-- ----------------------------\n+DROP TABLE IF EXISTS `characters_npcbot`;\n+CREATE TABLE `characters_npcbot` (\n+  `entry` int(10) unsigned NOT NULL COMMENT 'creature_template.entry',\n+  `owner` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'characters.guid (lowguid)',\n+  `roles` int(10) unsigned NOT NULL COMMENT 'bitmask: tank(1),dps(2),heal(4),ranged(8)',\n+  `spec` tinyint(3) unsigned NOT NULL DEFAULT '1',\n+  `faction` int(10) unsigned NOT NULL DEFAULT '35',\n+  `equipMhEx` int(10) unsigned NOT NULL DEFAULT '0',\n+  `equipOhEx` int(10) unsigned NOT NULL DEFAULT '0',\n+  `equipRhEx` int(10) unsigned NOT NULL DEFAULT '0',\n+  `equipHead` int(10) unsigned NOT NULL DEFAULT '0',\n+  `equipShoulders` int(10) unsigned NOT NULL DEFAULT '0',\n+  `equipChest` int(10) unsigned NOT NULL DEFAULT '0',\n+  `equipWaist` int(10) unsigned NOT NULL DEFAULT '0',\n+  `equipLegs` int(10) unsigned NOT NULL DEFAULT '0',\n+  `equipFeet` int(10) unsigned NOT NULL DEFAULT '0',\n+  `equipWrist` int(10) unsigned NOT NULL DEFAULT '0',\n+  `equipHands` int(10) unsigned NOT NULL DEFAULT '0',\n+  `equipBack` int(10) unsigned NOT NULL DEFAULT '0',\n+  `equipBody` int(10) unsigned NOT NULL DEFAULT '0',\n+  `equipFinger1` int(10) unsigned NOT NULL DEFAULT '0',\n+  `equipFinger2` int(10) unsigned NOT NULL DEFAULT '0',\n+  `equipTrinket1` int(10) unsigned NOT NULL DEFAULT '0',\n+  `equipTrinket2` int(10) unsigned NOT NULL DEFAULT '0',\n+  `equipNeck` int(10) unsigned NOT NULL DEFAULT '0',\n+  `spells_disabled` longtext,\n+  PRIMARY KEY (`entry`)\n+) ENGINE=InnoDB DEFAULT CHARSET=utf8;\ndiff --git a/data/sql/base/db_characters/characters_npcbot_group_member.sql b/data/sql/base/db_characters/characters_npcbot_group_member.sql\nnew file mode 100644\nindex 0000000000..82e3fd801c\n--- /dev/null\n+++ b/data/sql/base/db_characters/characters_npcbot_group_member.sql\n@@ -0,0 +1,14 @@\n+--\n+SET FOREIGN_KEY_CHECKS=0;\n+-- ----------------------------\n+-- Table structure for characters_npcbot_group_member\n+-- ----------------------------\n+DROP TABLE IF EXISTS `characters_npcbot_group_member`;\n+CREATE TABLE `characters_npcbot_group_member` (\n+  `guid` int(10) unsigned NOT NULL,\n+  `entry` int(10) unsigned NOT NULL,\n+  `memberFlags` tinyint(3) unsigned NOT NULL DEFAULT '0',\n+  `subgroup` tinyint(3) unsigned NOT NULL DEFAULT '0',\n+  `roles` tinyint(3) unsigned NOT NULL DEFAULT '0',\n+  PRIMARY KEY (`entry`)\n+) ENGINE=InnoDB DEFAULT CHARSET=utf8;\ndiff --git a/data/sql/base/db_characters/characters_npcbot_stats.sql b/data/sql/base/db_characters/characters_npcbot_stats.sql\nnew file mode 100644\nindex 0000000000..1870cf36b0\n--- /dev/null\n+++ b/data/sql/base/db_characters/characters_npcbot_stats.sql\n@@ -0,0 +1,36 @@\n+--\n+SET FOREIGN_KEY_CHECKS=0;\n+-- ----------------------------\n+-- Table structure for characters_npcbot_stats\n+-- ----------------------------\n+DROP TABLE IF EXISTS `characters_npcbot_stats`;\n+CREATE TABLE `characters_npcbot_stats` (\n+  `entry` int(10) unsigned NOT NULL DEFAULT '0',\n+  `maxhealth` int(10) unsigned NOT NULL DEFAULT '0',\n+  `maxpower` int(10) unsigned NOT NULL DEFAULT '0',\n+  `strength` int(10) unsigned NOT NULL DEFAULT '0',\n+  `agility` int(10) unsigned NOT NULL DEFAULT '0',\n+  `stamina` int(10) unsigned NOT NULL DEFAULT '0',\n+  `intellect` int(10) unsigned NOT NULL DEFAULT '0',\n+  `spirit` int(10) unsigned NOT NULL DEFAULT '0',\n+  `armor` int(10) unsigned NOT NULL DEFAULT '0',\n+  `defense` int(10) unsigned NOT NULL DEFAULT '0',\n+  `resHoly` int(10) unsigned NOT NULL DEFAULT '0',\n+  `resFire` int(10) unsigned NOT NULL DEFAULT '0',\n+  `resNature` int(10) unsigned NOT NULL DEFAULT '0',\n+  `resFrost` int(10) unsigned NOT NULL DEFAULT '0',\n+  `resShadow` int(10) unsigned NOT NULL DEFAULT '0',\n+  `resArcane` int(10) unsigned NOT NULL DEFAULT '0',\n+  `blockPct` float unsigned NOT NULL DEFAULT '0',\n+  `dodgePct` float unsigned NOT NULL DEFAULT '0',\n+  `parryPct` float unsigned NOT NULL DEFAULT '0',\n+  `critPct` float unsigned NOT NULL DEFAULT '0',\n+  `attackPower` int(10) unsigned NOT NULL DEFAULT '0',\n+  `spellPower` int(10) unsigned NOT NULL DEFAULT '0',\n+  `spellPen` int(10) unsigned NOT NULL DEFAULT '0',\n+  `hastePct` float unsigned NOT NULL DEFAULT '0',\n+  `hitBonusPct` float unsigned NOT NULL DEFAULT '0',\n+  `expertise` int(10) unsigned NOT NULL DEFAULT '0',\n+  `armorPenPct` float unsigned NOT NULL DEFAULT '0',\n+  PRIMARY KEY (`entry`)\n+) ENGINE=InnoDB DEFAULT CHARSET=utf8;\ndiff --git a/data/sql/base/db_characters/characters_npcbot_transmog.sql b/data/sql/base/db_characters/characters_npcbot_transmog.sql\nnew file mode 100644\nindex 0000000000..36674af698\n--- /dev/null\n+++ b/data/sql/base/db_characters/characters_npcbot_transmog.sql\n@@ -0,0 +1,14 @@\n+--\n+SET FOREIGN_KEY_CHECKS=0;\n+-- ----------------------------\n+-- Table structure for characters_npcbot_transmog\n+-- ----------------------------\n+DROP TABLE IF EXISTS `characters_npcbot_transmog`;\n+CREATE TABLE `characters_npcbot_transmog` (\n+  `entry` int(10) unsigned NOT NULL,\n+  `slot` tinyint(3) unsigned NOT NULL,\n+  `item_id` int(10) unsigned NOT NULL DEFAULT '0',\n+  `fake_id` int(10) unsigned NOT NULL DEFAULT '0',\n+  PRIMARY KEY (`entry`,`slot`),\n+  CONSTRAINT `bot_id` FOREIGN KEY (`entry`) REFERENCES `characters_npcbot` (`entry`) ON DELETE CASCADE ON UPDATE CASCADE\n+) ENGINE=InnoDB DEFAULT CHARSET=utf8;\ndiff --git a/data/sql/base/db_world/creature_template_npcbot_appearance.sql b/data/sql/base/db_world/creature_template_npcbot_appearance.sql\nnew file mode 100644\nindex 0000000000..c042e1e969\n--- /dev/null\n+++ b/data/sql/base/db_world/creature_template_npcbot_appearance.sql\n@@ -0,0 +1,306 @@\n+--\n+SET FOREIGN_KEY_CHECKS=0;\n+-- ----------------------------\n+-- Table structure for creature_template_npcbot_appearance\n+-- ----------------------------\n+DROP TABLE IF EXISTS `creature_template_npcbot_appearance`;\n+CREATE TABLE `creature_template_npcbot_appearance` (\n+  `entry` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,\n+  `name*` char(16) DEFAULT 'unk' COMMENT 'unused',\n+  `gender` tinyint(3) unsigned NOT NULL DEFAULT '0',\n+  `skin` tinyint(3) unsigned NOT NULL DEFAULT '0',\n+  `face` tinyint(3) unsigned NOT NULL DEFAULT '0',\n+  `hair` tinyint(3) unsigned NOT NULL DEFAULT '0',\n+  `haircolor` tinyint(3) unsigned NOT NULL DEFAULT '0',\n+  `features` tinyint(3) unsigned NOT NULL DEFAULT '0',\n+  PRIMARY KEY (`entry`)\n+) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n+\n+-- ----------------------------\n+-- Records\n+-- ----------------------------\n+INSERT INTO `creature_template_npcbot_appearance` VALUES\n+('70001', 'Llane', '0', '3', '0', '1', '1', '6'),\n+('70002', 'Thran', '0', '0', '0', '4', '5', '4'),\n+('70003', 'Lyria', '1', '3', '4', '6', '4', '0'),\n+('70004', 'Ander', '0', '1', '11', '1', '7', '6'),\n+('70005', 'Malosh', '0', '7', '0', '5', '5', '5'),\n+('70006', 'Granis', '0', '0', '2', '9', '4', '4'),\n+('70007', 'Kelstrum', '0', '5', '4', '2', '2', '2'),\n+('70008', 'Dannal', '0', '1', '0', '8', '5', '0'),\n+('70009', 'Austil', '0', '4', '1', '8', '1', '7'),\n+('70010', 'Torm', '0', '7', '1', '2', '0', '2'),\n+('70011', 'Sark', '0', '0', '3', '7', '0', '5'),\n+('70012', 'Ker', '1', '4', '0', '0', '0', '1'),\n+('70013', 'Harutt', '0', '1', '3', '7', '0', '4'),\n+('70014', 'Krang', '0', '5', '2', '6', '2', '0'),\n+('70015', 'Frang', '0', '0', '4', '1', '1', '3'),\n+('70016', 'Tarshaw', '0', '3', '3', '1', '0', '7'),\n+('70017', 'Grezz', '0', '3', '5', '1', '0', '3'),\n+('70018', 'Sorek', '0', '2', '1', '3', '1', '6'),\n+('70019', 'Zel\\'mak', '0', '1', '0', '4', '8', '1'),\n+('70020', 'Alyissia', '1', '5', '1', '5', '2', '0'),\n+('70021', 'Kyra', '1', '6', '8', '4', '6', '1'),\n+('70022', 'Arias\\'ta', '1', '0', '6', '3', '4', '1'),\n+('70023', 'Sildanair', '1', '3', '0', '2', '4', '2'),\n+('70024', 'Chris', '0', '3', '2', '2', '2', '10'),\n+('70025', 'Angela', '1', '2', '7', '3', '8', '6'),\n+('70026', 'Baltus', '0', '0', '0', '1', '8', '1'),\n+('70027', 'Kelv', '0', '5', '1', '7', '3', '1'),\n+('70028', 'Bilban', '0', '2', '2', '2', '7', '1'),\n+('70029', 'Wu', '0', '4', '5', '1', '0', '8'),\n+('70030', 'Ilsa', '1', '5', '6', '7', '3', '4'),\n+('70031', 'Darnath', '0', '7', '8', '3', '0', '0'),\n+('70032', 'Evencane', '0', '5', '9', '2', '4', '2'),\n+('70033', 'Kore', '0', '4', '0', '2', '1', '6'),\n+('70034', 'Ahonan', '0', '6', '1', '1', '6', '5'),\n+('70035', 'Behomat', '0', '4', '8', '3', '6', '3'),\n+('70036', 'Ruada', '1', '1', '2', '1', '6', '0'),\n+('70037', 'Kazi', '1', '1', '2', '3', '3', '0'),\n+('70038', 'Kerra', '1', '2', '0', '2', '2', '0'),\n+('70051', 'Sammuel', '0', '9', '11', '6', '2', '7'),\n+('70052', 'Bromos', '0', '6', '4', '2', '9', '1'),\n+('70053', 'Wilhelm', '0', '4', '2', '2', '1', '6'),\n+('70054', 'Grayson', '0', '3', '2', '2', '0', '2'),\n+('70055', 'Azar', '0', '2', '4', '3', '1', '6'),\n+('70056', 'Valgar', '0', '4', '3', '0', '0', '0'),\n+('70057', 'Beldruk', '0', '4', '6', '2', '4', '2'),\n+('70058', 'Brandur', '0', '5', '4', '1', '1', '3'),\n+('70059', 'Arthur', '0', '1', '0', '1', '5', '2'),\n+('70060', 'Katherine', '1', '1', '3', '2', '4', '0'),\n+('70061', 'Karman', '0', '3', '11', '10', '5', '8'),\n+('70062', 'Jesthenis', '0', '4', '0', '0', '0', '0'),\n+('70063', 'Noellene', '1', '0', '1', '1', '1', '0'),\n+('70064', 'Aurelon', '0', '8', '0', '0', '0', '0'),\n+('70065', 'Osselan', '0', '8', '1', '1', '2', '0'),\n+('70066', 'Ithelis', '0', '9', '2', '2', '2', '0'),\n+('70067', 'Bachi', '0', '3', '0', '10', '1', '0'),\n+('70068', 'Baatun', '0', '6', '4', '3', '0', '7'),\n+('70069', 'Kavaan', '0', '2', '5', '5', '6', '4'),\n+('70070', 'Tullas', '1', '0', '9', '9', '2', '0'),\n+('70071', 'Jol', '1', '0', '8', '8', '6', '0'),\n+('70072', 'Cyssa', '1', '4', '1', '7', '6', '0'),\n+('70073', 'Pyreanor', '0', '3', '3', '2', '7', '1'),\n+('70074', 'Rukua', '1', '5', '8', '4', '4', '1'),\n+('70101', 'Thorgas', '0', '4', '5', '8', '4', '8'),\n+('70102', 'Ogromm', '0', '4', '4', '3', '1', '4'),\n+('70103', 'Grif', '0', '0', '1', '5', '4', '4'),\n+('70104', 'Kragg', '0', '7', '4', '3', '2', '2'),\n+('70105', 'Kary', '1', '2', '1', '1', '2', '1'),\n+('70106', 'Holt', '0', '18', '3', '4', '0', '3'),\n+('70107', 'Urek', '0', '4', '2', '2', '1', '1'),\n+('70108', 'Lanka', '0', '4', '2', '2', '1', '2'),\n+('70109', 'Yaw', '0', '1', '1', '5', '2', '2'),\n+('70110', 'Jen\\'shan', '1', '3', '0', '2', '6', '3'),\n+('70111', 'Thotar', '0', '0', '3', '3', '1', '9'),\n+('70112', 'Ormak', '0', '5', '8', '1', '0', '5'),\n+('70113', 'Xor\\'juul', '0', '2', '3', '2', '0', '1'),\n+('70114', 'Sian\\'dur', '1', '2', '4', '1', '2', '4'),\n+('70115', 'Ayanna', '1', '5', '0', '6', '5', '8'),\n+('70116', 'Dazalar', '0', '8', '0', '6', '2', '3'),\n+('70117', 'Danlaar', '0', '0', '0', '3', '6', '0'),\n+('70118', 'Jeen\\'ra', '1', '7', '2', '1', '4', '1'),\n+('70119', 'Jocaste', '1', '6', '1', '1', '6', '1'),\n+('70120', 'Dorion', '0', '4', '6', '5', '0', '5'),\n+('70121', 'Daera', '1', '0', '3', '12', '4', '0'),\n+('70122', 'Olmin', '0', '3', '1', '2', '2', '4'),\n+('70123', 'Regnus', '0', '3', '9', '1', '4', '2'),\n+('70124', 'Kaerbrus', '0', '2', '0', '0', '2', '2'),\n+('70125', 'Einris', '1', '1', '1', '5', '4', '0'),\n+('70126', 'Ulfir', '0', '6', '2', '5', '8', '1'),\n+('70127', 'Thorfin', '0', '2', '2', '5', '4', '7'),\n+('70128', 'Alenndaar', '0', '2', '6', '3', '2', '2'),\n+('70129', 'Dargh', '0', '3', '1', '1', '4', '4'),\n+('70130', 'Sallina', '1', '4', '2', '1', '1', '0'),\n+('70131', 'Hannovia', '1', '0', '2', '2', '1', '0'),\n+('70132', 'Keilnei', '1', '7', '5', '2', '4', '1'),\n+('70133', 'Tana', '1', '8', '1', '1', '2', '0'),\n+('70134', 'Oninath', '0', '0', '0', '0', '0', '0'),\n+('70135', 'Zandine', '1', '8', '0', '1', '4', '0'),\n+('70136', 'Deremiis', '0', '11', '0', '5', '6', '7'),\n+('70137', 'Acteon', '0', '2', '0', '0', '0', '0'),\n+('70138', 'Vord', '0', '11', '0', '5', '6', '7'),\n+('70139', 'Killac', '0', '11', '0', '5', '6', '7'),\n+('70151', 'Jorik', '0', '3', '0', '11', '1', '2'),\n+('70152', 'Solm', '0', '7', '8', '4', '9', '6'),\n+('70153', 'Keryn', '1', '4', '4', '7', '0', '0'),\n+('70154', 'Osborne', '0', '4', '9', '9', '0', '1'),\n+('70155', 'Hogral', '0', '6', '7', '10', '5', '7'),\n+('70156', 'Ian', '0', '5', '9', '9', '1', '6'),\n+('70157', 'David', '0', '4', '2', '1', '1', '1'),\n+('70158', 'Marion', '1', '5', '2', '3', '5', '7'),\n+('70159', 'Rwag', '0', '0', '0', '0', '0', '0'),\n+('70160', 'Kaplak', '0', '3', '5', '0', '0', '3'),\n+('70161', 'Gest', '0', '4', '0', '2', '0', '1'),\n+('70162', 'Ormok', '0', '3', '8', '4', '0', '3'),\n+('70163', 'Shenthul', '0', '3', '0', '5', '5', '1'),\n+('70164', 'Frahun', '0', '2', '1', '3', '5', '4'),\n+('70165', 'Jannok', '0', '3', '2', '4', '5', '3'),\n+('70166', 'Syurna', '1', '0', '3', '5', '4', '0'),\n+('70167', 'Erion', '0', '5', '0', '3', '4', '3'),\n+('70168', 'Anishar', '0', '5', '6', '4', '6', '5'),\n+('70169', 'Carolyn', '1', '0', '6', '3', '1', '7'),\n+('70170', 'Miles', '0', '0', '0', '1', '9', '8'),\n+('70171', 'Gregory', '0', '3', '7', '8', '4', '14'),\n+('70172', 'Hulfdan', '0', '8', '8', '8', '5', '6'),\n+('70173', 'Ormyr', '0', '0', '6', '4', '4', '4'),\n+('70174', 'Fenthwick', '0', '0', '2', '2', '5', '0'),\n+('70175', 'Fahrad', '0', '3', '0', '9', '4', '2'),\n+('70176', 'Tony', '0', '3', '0', '1', '0', '2'),\n+('70177', 'Kariel', '0', '1', '0', '0', '0', '0'),\n+('70178', 'Tannaria', '1', '2', '2', '0', '2', '0'),\n+('70179', 'Zelanis', '0', '0', '1', '1', '1', '0'),\n+('70180', 'Elara', '1', '2', '2', '1', '4', '0'),\n+('70181', 'Nerisen', '0', '1', '1', '2', '1', '0'),\n+('70201', 'Anetta', '1', '0', '9', '14', '5', '0'),\n+('70202', 'Laurena', '1', '0', '1', '4', '5', '0'),\n+('70203', 'Josetta', '1', '1', '3', '17', '2', '0'),\n+('70204', 'Branstock', '0', '2', '7', '1', '8', '0'),\n+('70205', 'Maxan', '0', '2', '0', '6', '1', '5'),\n+('70206', 'Duesten', '0', '0', '9', '5', '1', '0'),\n+('70207', 'Beryl', '0', '0', '0', '0', '0', '12'),\n+('70208', 'Miles', '0', '0', '2', '7', '9', '2'),\n+('70209', 'Malakai', '0', '4', '3', '2', '6', '8'),\n+('70210', 'Cobb', '0', '5', '6', '6', '4', '14'),\n+('70211', 'Shanda', '1', '1', '0', '2', '7', '4'),\n+('70212', 'Laurna', '1', '0', '7', '0', '2', '4'),\n+('70213', 'Tai\\'jin', '1', '0', '3', '1', '6', '5'),\n+('70214', 'Ken\\'jai', '0', '5', '2', '4', '3', '0'),\n+('70215', 'Astarii', '1', '0', '0', '0', '0', '0'),\n+('70216', 'Jandria', '1', '1', '1', '5', '3', '0'),\n+('70217', 'Lariia', '1', '0', '3', '3', '6', '0'),\n+('70218', 'Lankester', '0', '2', '0', '9', '4', '16'),\n+('70219', 'Lazarus', '0', '0', '0', '6', '6', '14'),\n+('70220', 'Theodrus', '0', '2', '6', '5', '7', '4'),\n+('70221', 'Braenna', '1', '0', '1', '1', '0', '0'),\n+('70222', 'Toldren', '0', '4', '1', '3', '3', '10'),\n+('70223', 'Benjamin', '0', '9', '11', '0', '0', '8'),\n+('70224', 'Joshua', '0', '3', '0', '1', '1', '8'),\n+('70225', 'Zayus', '0', '2', '0', '3', '1', '4'),\n+('70226', 'X\\'yera', '0', '2', '1', '2', '4', '4'),\n+('70227', 'Ur\\'kyo', '0', '0', '2', '2', '3', '2'),\n+('70228', 'Nara', '1', '0', '7', '4', '1', '3'),\n+('70229', 'Alathea', '1', '4', '3', '0', '4', '5'),\n+('70230', 'Rohan', '0', '0', '9', '4', '7', '5'),\n+('70231', 'Arena', '1', '0', '2', '2', '1', '0'),\n+('70232', 'Ponaris', '0', '1', '0', '1', '2', '0'),\n+('70233', 'Zalduun', '0', '9', '0', '0', '0', '0'),\n+('70234', 'Aldrae', '0', '3', '1', '1', '1', '0'),\n+('70235', 'Lotheolan', '0', '8', '8', '1', '2', '0'),\n+('70236', 'Belestra', '1', '4', '0', '1', '3', '0'),\n+('70237', 'Caedmos', '0', '4', '0', '0', '4', '3'),\n+('70238', 'Guvan', '0', '12', '0', '5', '6', '4'),\n+('70239', 'Izmir', '0', '7', '0', '4', '6', '6'),\n+('70240', 'Fallat', '0', '7', '1', '4', '6', '6'),\n+('70251', 'Haromm', '0', '0', '3', '5', '0', '6'),\n+('70252', 'Siln', '1', '10', '1', '3', '2', '1'),\n+('70253', 'Tigor', '0', '13', '2', '2', '2', '1'),\n+('70254', 'Beram', '0', '10', '0', '2', '0', '5'),\n+('70255', 'Meela', '1', '8', '1', '3', '0', '0'),\n+('70256', 'Narm', '0', '17', '0', '6', '1', '4'),\n+('70257', 'Shikrik', '1', '3', '4', '5', '1', '1'),\n+('70258', 'Swart', '0', '0', '4', '5', '0', '7'),\n+('70259', 'Kardris', '1', '0', '4', '7', '0', '6'),\n+('70260', 'Sian\\'tsu', '1', '3', '3', '3', '1', '3'),\n+('70261', 'Sagorne', '0', '6', '1', '1', '1', '2'),\n+('70265', 'Sulaa', '1', '7', '2', '2', '4', '6'),\n+('70266', 'Hobahken', '0', '0', '0', '0', '0', '0'),\n+('70267', 'Umbrua', '1', '1', '7', '5', '5', '1'),\n+('70268', 'Javad', '0', '4', '1', '6', '0', '1'),\n+('70301', 'Khelden', '0', '7', '5', '7', '0', '5'),\n+('70302', 'Zaldimar', '0', '2', '10', '11', '9', '3'),\n+('70303', 'Maginor', '0', '1', '9', '8', '7', '4'),\n+('70304', 'Marryk', '0', '0', '4', '6', '7', '1'),\n+('70305', 'Magis', '0', '1', '5', '4', '6', '4'),\n+('70306', 'Isabella', '1', '2', '0', '7', '1', '5'),\n+('70307', 'Cain', '0', '0', '0', '7', '1', '10'),\n+('70308', 'Shymm', '0', '5', '6', '6', '5', '12'),\n+('70309', 'Ursyn', '1', '0', '5', '9', '1', '7'),\n+('70310', 'Thurston', '0', '4', '1', '5', '5', '1'),\n+('70311', 'Pierce', '0', '0', '2', '5', '8', '2'),\n+('70312', 'Anastasia', '1', '2', '7', '3', '8', '5'),\n+('70313', 'Bink', '1', '2', '1', '1', '6', '0'),\n+('70314', 'Juli', '1', '1', '5', '5', '3', '0'),\n+('70315', 'Nittlebur', '0', '0', '4', '0', '7', '6'),\n+('70316', 'Jennea', '1', '5', '4', '5', '4', '4'),\n+('70317', 'Un\\'Thuwa', '0', '1', '2', '1', '3', '4'),\n+('70318', 'Pephredo', '1', '0', '4', '1', '2', '5'),\n+('70319', 'Enyo', '1', '3', '4', '4', '0', '0'),\n+('70320', 'Mai\\'ah', '1', '1', '2', '1', '1', '5'),\n+('70321', 'Deino', '1', '2', '0', '3', '3', '2'),\n+('70322', 'Uthel\\'nay', '0', '3', '4', '2', '3', '0'),\n+('70323', 'Dink', '0', '1', '3', '2', '6', '1'),\n+('70324', 'Julia', '1', '2', '6', '2', '0', '0'),\n+('70325', 'Garridel', '1', '3', '1', '2', '2', '0'),\n+('70326', 'Valaatu', '1', '9', '6', '7', '6', '5'),\n+('70327', 'Zaedana', '1', '3', '2', '2', '1', '0'),\n+('70328', 'Quithas', '0', '2', '3', '1', '1', '0'),\n+('70329', 'Inethven', '0', '0', '0', '0', '3', '0'),\n+('70330', 'Narinth', '1', '0', '2', '2', '0', '0'),\n+('70331', 'Edirah', '1', '5', '0', '5', '3', '0'),\n+('70332', 'Valustraa', '1', '5', '5', '9', '6', '5'),\n+('70333', 'Semid', '0', '8', '9', '8', '0', '7'),\n+('70334', 'Harnan', '0', '8', '8', '7', '1', '3'),\n+('70335', 'Bati', '1', '8', '1', '2', '1', '0'),\n+('70336', 'Derek', '0', '5', '3', '3', '1', '5'),\n+('70351', 'Drusilla', '1', '0', '10', '4', '0', '0'),\n+('70352', 'Alamar', '0', '2', '2', '3', '2', '5'),\n+('70353', 'Demisette', '1', '0', '9', '2', '0', '0'),\n+('70354', 'Maximillian', '0', '1', '10', '6', '0', '6'),\n+('70355', 'Kartosh', '0', '0', '7', '0', '1', '6'),\n+('70356', 'Maximillion', '0', '5', '0', '9', '5', '5'),\n+('70357', 'Rupert', '0', '0', '0', '0', '0', '8'),\n+('70358', 'Nartok', '0', '0', '6', '4', '0', '1'),\n+('70359', 'Dhugru', '0', '5', '6', '4', '3', '9'),\n+('70360', 'Grol\\'dar', '0', '3', '2', '3', '1', '2'),\n+('70361', 'Mirket', '1', '5', '3', '7', '0', '5'),\n+('70362', 'Zevrost', '0', '3', '7', '5', '5', '9'),\n+('70363', 'Kaal', '0', '3', '1', '4', '2', '3'),\n+('70364', 'Luther', '0', '4', '9', '0', '0', '0'),\n+('70365', 'Richard', '0', '5', '5', '0', '0', '0'),\n+('70366', 'Thistleheart', '0', '3', '2', '6', '3', '0'),\n+('70367', 'Briarthorn', '0', '0', '6', '1', '0', '3'),\n+('70368', 'Alexander', '0', '0', '10', '11', '0', '6'),\n+('70369', 'Ursula', '1', '1', '4', '18', '3', '6'),\n+('70370', 'Sandahl', '0', '4', '2', '11', '1', '6'),\n+('70371', 'Gimrizz', '0', '2', '5', '2', '0', '3'),\n+('70372', 'Teli\\'Larien', '0', '0', '0', '0', '0', '0'),\n+('70373', 'Celoenus', '0', '0', '0', '2', '0', '0'),\n+('70374', 'Alamma', '0', '0', '1', '0', '0', '0'),\n+('70375', 'Talionia', '1', '0', '2', '1', '2', '0'),\n+('70376', 'Zanien', '0', '0', '0', '0', '3', '0'),\n+('70377', 'Babagaya', '1', '0', '6', '0', '3', '0'),\n+('70401', 'Turak', '0', '4', '3', '5', '0', '5'),\n+('70402', 'Sheal', '1', '7', '0', '3', '1', '1'),\n+('70403', 'Kym', '1', '9', '2', '3', '0', '0'),\n+('70404', 'Gart', '0', '13', '1', '3', '2', '2'),\n+('70405', 'Gennia', '1', '9', '3', '0', '1', '3'),\n+('70406', 'Mardant', '0', '1', '1', '2', '0', '4'),\n+('70407', 'Kal', '0', '2', '2', '4', '4', '2'),\n+('70408', 'Mathrengyl', '0', '5', '0', '2', '6', '3'),\n+('70409', 'Denatharion', '0', '4', '8', '3', '2', '5'),\n+('70410', 'Fylerian', '0', '2', '1', '4', '5', '0'),\n+('70411', 'Sheldras', '0', '0', '3', '2', '2', '4'),\n+('70412', 'Theridran', '0', '2', '1', '3', '7', '3'),\n+('70413', 'Maldryn', '0', '2', '8', '5', '4', '0'),\n+('70414', 'Jannos', '0', '5', '3', '2', '1', '5'),\n+('70415', 'Golhine', '0', '0', '2', '6', '0', '4'),\n+('70416', 'Loganaar', '0', '2', '1', '1', '0', '1'),\n+('70417', 'Harene', '1', '6', '0', '3', '2', '4'),\n+('70418', 'Shalannius', '0', '4', '3', '0', '4', '5'),\n+('70451', 'Siouxsie', '1', '9', '9', '3', '4', '9'),\n+('70452', 'Imhadria', '1', '10', '8', '6', '1', '0'),\n+('70453', 'Vaelen', '0', '16', '9', '11', '9', '8'),\n+('70454', 'Mynx', '1', '10', '0', '17', '11', '0'),\n+('70455', 'Lankral', '0', '6', '13', '16', '12', '4'),\n+('70456', 'Sliver', '0', '10', '11', '11', '6', '0'),\n+('70457', 'Vereth', '0', '4', '0', '8', '9', '10'),\n+('70458', 'Arly', '1', '7', '9', '2', '8', '4'),\n+('70459', 'Setaal', '1', '14', '12', '15', '9', '2'),\n+('70460', 'Uzo', '0', '8', '7', '8', '9', '18'),\n+('70461', 'Illyrie', '1', '9', '11', '1', '12', '0'),\n+('70462', 'Crok', '0', '11', '9', '10', '7', '3'),\n+('70463', 'Zor\\'be', '0', '8', '7', '6', '9', '18'),\n+('70464', 'Datura', '1', '10', '11', '11', '18', '0'),\n+('70465', 'Stefan', '0', '10', '12', '6', '12', '2'),\n+('70555', 'Detrae', '0', '3', '12', '11', '19', '4');\ndiff --git a/data/sql/base/db_world/creature_template_npcbot_extras.sql b/data/sql/base/db_world/creature_template_npcbot_extras.sql\nnew file mode 100644\nindex 0000000000..2b2f083a31\n--- /dev/null\n+++ b/data/sql/base/db_world/creature_template_npcbot_extras.sql\n@@ -0,0 +1,376 @@\n+--\n+SET FOREIGN_KEY_CHECKS=0;\n+-- ----------------------------\n+-- Table structure for creature_template_npcbot_extras\n+-- ----------------------------\n+DROP TABLE IF EXISTS `creature_template_npcbot_extras`;\n+CREATE TABLE `creature_template_npcbot_extras` (\n+  `entry` mediumint(8) unsigned NOT NULL,\n+  `class` tinyint(3) unsigned NOT NULL DEFAULT '1',\n+  `race` tinyint(3) unsigned NOT NULL DEFAULT '1',\n+  PRIMARY KEY (`entry`)\n+) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n+\n+-- ----------------------------\n+-- Records\n+-- ----------------------------\n+INSERT INTO `creature_template_npcbot_extras` VALUES\n+('70001', '1', '1'),\n+('70002', '1', '3'),\n+('70003', '1', '1'),\n+('70004', '1', '3'),\n+('70005', '1', '2'),\n+('70006', '1', '3'),\n+('70007', '1', '3'),\n+('70008', '1', '5'),\n+('70009', '1', '5'),\n+('70010', '1', '6'),\n+('70011', '1', '6'),\n+('70012', '1', '6'),\n+('70013', '1', '6'),\n+('70014', '1', '6'),\n+('70015', '1', '2'),\n+('70016', '1', '2'),\n+('70017', '1', '2'),\n+('70018', '1', '2'),\n+('70019', '1', '8'),\n+('70020', '1', '4'),\n+('70021', '1', '4'),\n+('70022', '1', '4'),\n+('70023', '1', '4'),\n+('70024', '1', '5'),\n+('70025', '1', '5'),\n+('70026', '1', '5'),\n+('70027', '1', '3'),\n+('70028', '1', '7'),\n+('70029', '1', '1'),\n+('70030', '1', '1'),\n+('70031', '1', '4'),\n+('70032', '1', '1'),\n+('70033', '1', '11'),\n+('70034', '1', '11'),\n+('70035', '1', '11'),\n+('70036', '1', '11'),\n+('70037', '1', '11'),\n+('70038', '1', '10'),\n+('70051', '2', '1'),\n+('70052', '2', '3'),\n+('70053', '2', '1'),\n+('70054', '2', '1'),\n+('70055', '2', '3'),\n+('70056', '2', '3'),\n+('70057', '2', '3'),\n+('70058', '2', '3'),\n+('70059', '2', '1'),\n+('70060', '2', '1'),\n+('70061', '2', '1'),\n+('70062', '2', '10'),\n+('70063', '2', '10'),\n+('70064', '2', '11'),\n+('70065', '2', '10'),\n+('70066', '2', '10'),\n+('70067', '2', '10'),\n+('70068', '2', '11'),\n+('70069', '2', '11'),\n+('70070', '2', '11'),\n+('70071', '2', '11'),\n+('70072', '2', '10'),\n+('70073', '2', '10'),\n+('70074', '2', '11'),\n+('70101', '3', '3'),\n+('70102', '3', '2'),\n+('70103', '3', '3'),\n+('70104', '3', '2'),\n+('70105', '3', '6'),\n+('70106', '3', '6'),\n+('70107', '3', '6'),\n+('70108', '3', '6'),\n+('70109', '3', '6'),\n+('70110', '3', '8'),\n+('70111', '3', '2'),\n+('70112', '3', '2'),\n+('70113', '3', '8'),\n+('70114', '3', '8'),\n+('70115', '3', '4'),\n+('70116', '3', '4'),\n+('70117', '3', '4'),\n+('70118', '3', '4'),\n+('70119', '3', '4'),\n+('70120', '3', '4'),\n+('70121', '3', '3'),\n+('70122', '3', '3'),\n+('70123', '3', '3'),\n+('70124', '3', '4'),\n+('70125', '3', '3'),\n+('70126', '3', '3'),\n+('70127', '3', '3'),\n+('70128', '3', '4'),\n+('70129', '3', '3'),\n+('70130', '3', '10'),\n+('70131', '3', '10'),\n+('70132', '3', '11'),\n+('70133', '3', '10'),\n+('70134', '3', '10'),\n+('70135', '3', '10'),\n+('70136', '3', '11'),\n+('70137', '3', '11'),\n+('70138', '3', '11'),\n+('70139', '3', '11'),\n+('70151', '4', '1'),\n+('70152', '4', '3'),\n+('70153', '4', '1'),\n+('70154', '4', '1'),\n+('70155', '4', '3'),\n+('70156', '4', '1'),\n+('70157', '4', '5'),\n+('70158', '4', '5'),\n+('70159', '4', '2'),\n+('70160', '4', '2'),\n+('70161', '4', '2'),\n+('70162', '4', '2'),\n+('70163', '4', '8'),\n+('70164', '4', '4'),\n+('70165', '4', '4'),\n+('70166', '4', '4'),\n+('70167', '4', '4'),\n+('70168', '4', '4'),\n+('70169', '4', '5'),\n+('70170', '4', '5'),\n+('70171', '4', '5'),\n+('70172', '4', '3'),\n+('70173', '4', '3'),\n+('70174', '4', '7'),\n+('70175', '4', '1'),\n+('70176', '4', '1'),\n+('70177', '4', '10'),\n+('70178', '4', '10'),\n+('70179', '4', '10'),\n+('70180', '4', '10'),\n+('70181', '4', '10'),\n+('70201', '5', '1'),\n+('70202', '5', '1'),\n+('70203', '5', '1'),\n+('70204', '5', '3'),\n+('70205', '5', '3'),\n+('70206', '5', '5'),\n+('70207', '5', '5'),\n+('70208', '5', '5'),\n+('70209', '5', '5'),\n+('70210', '5', '5'),\n+('70211', '5', '4'),\n+('70212', '5', '4'),\n+('70213', '5', '8'),\n+('70214', '5', '8'),\n+('70215', '5', '4'),\n+('70216', '5', '4'),\n+('70217', '5', '4'),\n+('70218', '5', '5'),\n+('70219', '5', '5'),\n+('70220', '5', '3'),\n+('70221', '5', '3'),\n+('70222', '5', '3'),\n+('70223', '5', '1'),\n+('70224', '5', '1'),\n+('70225', '5', '8'),\n+('70226', '5', '8'),\n+('70227', '5', '8'),\n+('70228', '5', '4'),\n+('70229', '5', '4'),\n+('70230', '5', '3'),\n+('70231', '5', '10'),\n+('70232', '5', '10'),\n+('70233', '5', '11'),\n+('70234', '5', '10'),\n+('70235', '5', '10'),\n+('70236', '5', '10'),\n+('70237', '5', '11'),\n+('70238', '5', '11'),\n+('70239', '5', '11'),\n+('70240', '5', '11'),\n+('70251', '7', '2'),\n+('70252', '7', '6'),\n+('70253', '7', '6'),\n+('70254', '7', '6'),\n+('70255', '7', '6'),\n+('70256', '7', '6'),\n+('70257', '7', '2'),\n+('70258', '7', '2'),\n+('70259', '7', '2'),\n+('70260', '7', '8'),\n+('70261', '7', '6'),\n+('70265', '7', '11'),\n+('70267', '7', '11'),\n+('70268', '7', '11'),\n+('70301', '8', '1'),\n+('70302', '8', '1'),\n+('70303', '8', '1'),\n+('70304', '8', '7'),\n+('70305', '8', '7'),\n+('70306', '8', '5'),\n+('70307', '8', '5'),\n+('70308', '8', '5'),\n+('70309', '8', '5'),\n+('70310', '8', '5'),\n+('70311', '8', '5'),\n+('70312', '8', '5'),\n+('70313', '8', '7'),\n+('70314', '8', '7'),\n+('70315', '8', '7'),\n+('70316', '8', '1'),\n+('70317', '8', '8'),\n+('70318', '8', '8'),\n+('70319', '8', '8'),\n+('70320', '8', '8'),\n+('70321', '8', '8'),\n+('70322', '8', '8'),\n+('70323', '8', '7'),\n+('70324', '8', '10'),\n+('70325', '8', '10'),\n+('70326', '8', '11'),\n+('70327', '8', '10'),\n+('70328', '8', '10'),\n+('70329', '8', '10'),\n+('70330', '8', '10'),\n+('70331', '8', '11'),\n+('70332', '8', '11'),\n+('70333', '8', '11'),\n+('70334', '8', '11'),\n+('70335', '8', '11'),\n+('70336', '8', '5'),\n+('70351', '9', '1'),\n+('70352', '9', '7'),\n+('70353', '9', '1'),\n+('70354', '9', '1'),\n+('70355', '9', '2'),\n+('70356', '9', '5'),\n+('70357', '9', '5'),\n+('70358', '9', '2'),\n+('70359', '9', '2'),\n+('70360', '9', '2'),\n+('70361', '9', '2'),\n+('70362', '9', '2'),\n+('70363', '9', '2'),\n+('70364', '9', '5'),\n+('70365', '9', '5'),\n+('70366', '9', '7'),\n+('70367', '9', '7'),\n+('70368', '9', '1'),\n+('70369', '9', '1'),\n+('70370', '9', '1'),\n+('70371', '9', '7'),\n+('70372', '9', '10'),\n+('70373', '9', '10'),\n+('70374', '9', '10'),\n+('70375', '9', '10'),\n+('70376', '9', '10'),\n+('70377', '9', '7'),\n+('70401', '11', '6'),\n+('70402', '11', '6'),\n+('70403', '11', '6'),\n+('70404', '11', '6'),\n+('70405', '11', '6'),\n+('70406', '11', '4'),\n+('70407', '11', '4'),\n+('70408', '11', '4'),\n+('70409', '11', '4'),\n+('70410', '11', '4'),\n+('70411', '11', '4'),\n+('70412', '11', '4'),\n+('70413', '11', '4'),\n+('70414', '11', '6'),\n+('70415', '11', '4'),\n+('70416', '11', '4'),\n+('70417', '11', '6'),\n+('70418', '11', '4'),\n+('70451', '6', '4'),\n+('70452', '6', '10'),\n+('70453', '6', '11'),\n+('70454', '6', '10'),\n+('70455', '6', '1'),\n+('70456', '6', '10'),\n+('70457', '6', '5'),\n+('70458', '6', '7'),\n+('70459', '6', '11'),\n+('70460', '6', '8'),\n+('70461', '6', '4'),\n+('70462', '6', '2'),\n+('70463', '6', '8'),\n+('70464', '6', '10'),\n+('70465', '6', '1'),\n+('70501', '0', '0'),\n+('70502', '0', '0'),\n+('70503', '0', '0'),\n+('70504', '0', '0'),\n+('70505', '0', '0'),\n+('70506', '0', '0'),\n+('70507', '0', '0'),\n+('70508', '0', '0'),\n+('70509', '0', '0'),\n+('70510', '0', '0'),\n+('70511', '0', '0'),\n+('70512', '0', '0'),\n+('70513', '0', '0'),\n+('70514', '0', '0'),\n+('70515', '0', '0'),\n+('70516', '0', '0'),\n+('70517', '0', '0'),\n+('70518', '0', '0'),\n+('70519', '0', '0'),\n+('70520', '0', '0'),\n+('70521', '0', '0'),\n+('70522', '0', '0'),\n+('70523', '0', '0'),\n+('70524', '0', '0'),\n+('70525', '0', '0'),\n+('70526', '0', '0'),\n+('70527', '0', '0'),\n+('70528', '0', '0'),\n+('70529', '0', '0'),\n+('70530', '0', '0'),\n+('70531', '0', '0'),\n+('70532', '0', '0'),\n+('70533', '0', '0'),\n+('70534', '0', '0'),\n+('70535', '0', '0'),\n+('70536', '0', '0'),\n+('70537', '0', '0'),\n+('70538', '0', '0'),\n+('70542', '0', '0'),\n+('70543', '0', '0'),\n+('70544', '0', '0'),\n+('70545', '0', '0'),\n+('70551', '12', '15'),\n+('70552', '12', '15'),\n+('70553', '13', '15'),\n+('70554', '13', '15'),\n+('70555', '14', '1'),\n+('70556', '0', '0'),\n+('70557', '15', '15'),\n+('70558', '15', '15'),\n+('70559', '15', '15'),\n+('70560', '15', '15'),\n+('70561', '15', '15'),\n+('70562', '0', '0'),\n+('70563', '16', '15'),\n+('70564', '16', '15'),\n+('70565', '16', '15'),\n+('70566', '16', '15'),\n+('70567', '16', '15'),\n+('70568', '17', '10'),\n+('70569', '17', '10'),\n+('70570', '17', '10'),\n+('70571', '17', '10'),\n+('70572', '17', '10'),\n+('70573', '0', '15'),\n+('70574', '0', '15'),\n+('70575', '18', '1'),\n+('70576', '18', '1'),\n+('70577', '18', '1'),\n+('70578', '18', '1'),\n+('70579', '18', '1'),\n+('70580', '0', '15'),\n+('70581', '19', '13'),\n+('70582', '19', '13'),\n+('70583', '19', '13'),\n+('70584', '19', '13'),\n+('70585', '19', '13');\ndiff --git a/data/sql/base/db_world/creature_template_outfits.sql b/data/sql/base/db_world/creature_template_outfits.sql\nnew file mode 100644\nindex 0000000000..d9176a925a\n--- /dev/null\n+++ b/data/sql/base/db_world/creature_template_outfits.sql\n@@ -0,0 +1,35 @@\n+--\n+SET FOREIGN_KEY_CHECKS=0;\n+-- ----------------------------\n+-- Table structure for creature_template_outfits\n+-- ----------------------------\n+DROP TABLE IF EXISTS `creature_template_outfits`;\n+CREATE TABLE IF NOT EXISTS `creature_template_outfits` (\n+  `entry` int(10) unsigned NOT NULL,\n+  `race` tinyint(3) unsigned NOT NULL DEFAULT '1',\n+  `gender` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '0 for male, 1 for female',\n+  `skin` tinyint(3) unsigned NOT NULL DEFAULT '0',\n+  `face` tinyint(3) unsigned NOT NULL DEFAULT '0',\n+  `hair` tinyint(3) unsigned NOT NULL DEFAULT '0',\n+  `haircolor` tinyint(3) unsigned NOT NULL DEFAULT '0',\n+  `facialhair` tinyint(3) unsigned NOT NULL DEFAULT '0',\n+  `head` int(10) unsigned NOT NULL DEFAULT '0',\n+  `shoulders` int(10) unsigned NOT NULL DEFAULT '0',\n+  `body` int(10) unsigned NOT NULL DEFAULT '0',\n+  `chest` int(10) unsigned NOT NULL DEFAULT '0',\n+  `waist` int(10) unsigned NOT NULL DEFAULT '0',\n+  `legs` int(10) unsigned NOT NULL DEFAULT '0',\n+  `feet` int(10) unsigned NOT NULL DEFAULT '0',\n+  `wrists` int(10) unsigned NOT NULL DEFAULT '0',\n+  `hands` int(10) unsigned NOT NULL DEFAULT '0',\n+  `back` int(10) unsigned NOT NULL DEFAULT '0',\n+  `tabard` int(10) unsigned NOT NULL DEFAULT '0',\n+  PRIMARY KEY (`entry`)\n+) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n+\n+-- ----------------------------\n+-- Records\n+-- ----------------------------\n+INSERT INTO `creature_template_outfits` VALUES\n+('70551', '2', '0', '0', '14', '9', '7', '5', '0', '0', '0', '0', '59194', '64674', '0', '36248', '0', '0', '0'),\n+('70552', '2', '0', '0', '14', '9', '7', '5', '0', '0', '0', '0', '59194', '64674', '0', '36248', '0', '0', '0');\ndiff --git a/data/sql/custom/db_characters/2023_05_16_00_characters_npcbot_gear_storage.sql b/data/sql/custom/db_characters/2023_05_16_00_characters_npcbot_gear_storage.sql\nnew file mode 100644\nindex 0000000000..32e9f89529\n--- /dev/null\n+++ b/data/sql/custom/db_characters/2023_05_16_00_characters_npcbot_gear_storage.sql\n@@ -0,0 +1,11 @@\n+--\n+SET FOREIGN_KEY_CHECKS=0;\n+DROP TABLE IF EXISTS `characters_npcbot_gear_storage`;\n+CREATE TABLE `characters_npcbot_gear_storage` (\n+  `guid` int(10) unsigned NOT NULL DEFAULT '0',\n+  `item_guid` int(10) unsigned NOT NULL DEFAULT '0',\n+  PRIMARY KEY (`item_guid`),\n+  KEY `existing_player` (`guid`),\n+  CONSTRAINT `characters_npcbot_gear_storage_ibfk_1` FOREIGN KEY (`item_guid`) REFERENCES `item_instance` (`guid`) ON DELETE CASCADE ON UPDATE CASCADE,\n+  CONSTRAINT `existing_player` FOREIGN KEY (`guid`) REFERENCES `characters` (`guid`) ON DELETE CASCADE ON UPDATE CASCADE\n+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Bot item storage system';\ndiff --git a/data/sql/custom/db_characters/2023_05_26_00_characters_npcbot_transmog.sql b/data/sql/custom/db_characters/2023_05_26_00_characters_npcbot_transmog.sql\nnew file mode 100644\nindex 0000000000..a037563ba7\n--- /dev/null\n+++ b/data/sql/custom/db_characters/2023_05_26_00_characters_npcbot_transmog.sql\n@@ -0,0 +1,2 @@\n+--\n+ALTER TABLE `characters_npcbot_transmog` MODIFY `fake_id` int(11) NOT NULL DEFAULT '-1' AFTER `item_id`;\ndiff --git a/data/sql/custom/db_characters/2024_03_12_00_characters_npcbot.sql b/data/sql/custom/db_characters/2024_03_12_00_characters_npcbot.sql\nnew file mode 100644\nindex 0000000000..220cc7b575\n--- /dev/null\n+++ b/data/sql/custom/db_characters/2024_03_12_00_characters_npcbot.sql\n@@ -0,0 +1,20 @@\n+--\n+/*!50003 DROP PROCEDURE IF EXISTS `sp__drop_column_if_exists`*/;\n+DELIMITER ;;\n+/*!50003 CREATE*/\n+/*!50003 PROCEDURE `sp__drop_column_if_exists`(`@TABLE` varchar(100), `@COLUMN` varchar(100))\n+BEGIN\n+DECLARE `@EXISTS` INT DEFAULT 0;\n+SELECT COUNT(*) INTO `@EXISTS` FROM `information_schema`.`columns`WHERE `TABLE_SCHEMA` = DATABASE() AND `TABLE_NAME` = `@TABLE` AND `COLUMN_NAME` = `@COLUMN`;\n+IF (`@EXISTS` > 0) THEN\n+    ALTER TABLE `characters_npcbot` DROP COLUMN `hire_time`;\n+END IF;\n+END */;;\n+\n+DELIMITER ;\n+\n+CALL `sp__drop_column_if_exists`('characters_npcbot', 'hire_time');\n+\n+DROP PROCEDURE IF EXISTS `sp__drop_column_if_exists`;\n+\n+ALTER TABLE `characters_npcbot` ADD `hire_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP AFTER `faction`;\ndiff --git a/data/sql/custom/db_characters/2024_05_29_00_characters_npcbot_logs.sql b/data/sql/custom/db_characters/2024_05_29_00_characters_npcbot_logs.sql\nnew file mode 100644\nindex 0000000000..61b872eee9\n--- /dev/null\n+++ b/data/sql/custom/db_characters/2024_05_29_00_characters_npcbot_logs.sql\n@@ -0,0 +1,19 @@\n+--\n+SET FOREIGN_KEY_CHECKS=0;\n+DROP TABLE IF EXISTS `characters_npcbot_logs`;\n+CREATE TABLE `characters_npcbot_logs` (\n+  `id` bigint unsigned NOT NULL AUTO_INCREMENT,\n+  `entry` int unsigned NOT NULL DEFAULT '0',\n+  `owner` int NOT NULL DEFAULT '-1',\n+  `mapid` int NOT NULL DEFAULT '-1',\n+  `inmap` tinyint NOT NULL DEFAULT '-1',\n+  `inworld` tinyint NOT NULL DEFAULT '-1',\n+  `type` smallint unsigned NOT NULL DEFAULT '0',\n+  `param1` varchar(51) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,\n+  `param2` varchar(51) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,\n+  `param3` varchar(51) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,\n+  `param4` varchar(51) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,\n+  `param5` varchar(51) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,\n+  `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,\n+  PRIMARY KEY (`id`)\n+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;\ndiff --git a/data/sql/custom/db_characters/2024_10_17_00_characters_npcbot_settings.sql b/data/sql/custom/db_characters/2024_10_17_00_characters_npcbot_settings.sql\nnew file mode 100644\nindex 0000000000..204ad5b936\n--- /dev/null\n+++ b/data/sql/custom/db_characters/2024_10_17_00_characters_npcbot_settings.sql\n@@ -0,0 +1,14 @@\n+--\n+SET FOREIGN_KEY_CHECKS=0;\n+DROP TABLE IF EXISTS `characters_npcbot_settings`;\n+CREATE TABLE `characters_npcbot_settings` (\n+  `owner` int unsigned NOT NULL,\n+  `dist_follow` tinyint unsigned NOT NULL DEFAULT '30',\n+  `dist_attack` tinyint unsigned NOT NULL DEFAULT '0',\n+  `attack_range_mode` tinyint unsigned NOT NULL DEFAULT '1',\n+  `attack_angle_mode` tinyint unsigned NOT NULL DEFAULT '1',\n+  `engage_delay_dps` int unsigned NOT NULL DEFAULT '0',\n+  `engage_delay_heal` int unsigned NOT NULL DEFAULT '0',\n+  `flags` int unsigned NOT NULL DEFAULT '0',\n+  PRIMARY KEY (`owner`)\n+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;\ndiff --git a/data/sql/custom/db_characters/2024_11_13_00_characters_npcbot_gear_set.sql b/data/sql/custom/db_characters/2024_11_13_00_characters_npcbot_gear_set.sql\nnew file mode 100644\nindex 0000000000..5ff55aebc3\n--- /dev/null\n+++ b/data/sql/custom/db_characters/2024_11_13_00_characters_npcbot_gear_set.sql\n@@ -0,0 +1,8 @@\n+--\n+DROP TABLE IF EXISTS `characters_npcbot_gear_set`;\n+CREATE TABLE `characters_npcbot_gear_set` (\n+  `owner` int unsigned NOT NULL DEFAULT '0',\n+  `set_id` tinyint unsigned NOT NULL DEFAULT '0',\n+  `set_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n+  PRIMARY KEY (`owner`,`set_id`)\n+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Bot equipment sets system';\ndiff --git a/data/sql/custom/db_characters/2024_11_13_01_characters_npcbot_gear_set_item.sql b/data/sql/custom/db_characters/2024_11_13_01_characters_npcbot_gear_set_item.sql\nnew file mode 100644\nindex 0000000000..6559dfb87d\n--- /dev/null\n+++ b/data/sql/custom/db_characters/2024_11_13_01_characters_npcbot_gear_set_item.sql\n@@ -0,0 +1,9 @@\n+--\n+DROP TABLE IF EXISTS `characters_npcbot_gear_set_item`;\n+CREATE TABLE `characters_npcbot_gear_set_item` (\n+  `owner` int unsigned NOT NULL DEFAULT '0',\n+  `set_id` tinyint unsigned NOT NULL DEFAULT '0',\n+  `slot` tinyint unsigned NOT NULL DEFAULT '0',\n+  `item_id` mediumint unsigned NOT NULL DEFAULT '0',\n+  PRIMARY KEY (`owner`,`set_id`,`slot`)\n+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Bot equipment sets system';\ndiff --git a/data/sql/custom/db_characters/2024_11_21_00_characters_npcbot.sql b/data/sql/custom/db_characters/2024_11_21_00_characters_npcbot.sql\nnew file mode 100644\nindex 0000000000..b60283d3c1\n--- /dev/null\n+++ b/data/sql/custom/db_characters/2024_11_21_00_characters_npcbot.sql\n@@ -0,0 +1,3 @@\n+--\n+ALTER TABLE `characters_npcbot` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;\n+ALTER TABLE `characters_npcbot` ADD `miscvalues` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL AFTER `spells_disabled`;\ndiff --git a/data/sql/custom/db_characters/2026_01_15_00_characters_npcbot.sql b/data/sql/custom/db_characters/2026_01_15_00_characters_npcbot.sql\nnew file mode 100644\nindex 0000000000..89dac5ccb3\n--- /dev/null\n+++ b/data/sql/custom/db_characters/2026_01_15_00_characters_npcbot.sql\n@@ -0,0 +1,27 @@\n+/*!50003 DROP PROCEDURE IF EXISTS `sp__add_column_if_not_exists`*/;\n+\n+DELIMITER ;;\n+\n+/*!50003 CREATE*/\n+/*!50003 PROCEDURE `sp__add_column_if_not_exists`(IN p_table_name VARCHAR(64), IN p_column_name VARCHAR(64), IN p_column_options TEXT)\n+BEGIN\n+    IF NOT EXISTS (\n+        SELECT 1\n+        FROM INFORMATION_SCHEMA.COLUMNS\n+        WHERE TABLE_SCHEMA = DATABASE()\n+          AND TABLE_NAME = p_table_name\n+          AND COLUMN_NAME = p_column_name\n+    ) THEN\n+        SET @sql = CONCAT('ALTER TABLE ', p_table_name, ' ADD ', p_column_name, ' ', p_column_options);\n+\n+        PREPARE stmt FROM @sql;\n+        EXECUTE stmt;\n+        DEALLOCATE PREPARE stmt;\n+    END IF;\n+END */;;\n+\n+DELIMITER ;\n+\n+CALL sp__add_column_if_not_exists('`characters_npcbot`', '`shared_owners`', 'longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL AFTER `hire_time`');\n+\n+DROP PROCEDURE `sp__add_column_if_not_exists`;\ndiff --git a/data/sql/custom/db_world/0000-00-00_npcbot_01_creature_template.sql b/data/sql/custom/db_world/0000-00-00_npcbot_01_creature_template.sql\nnew file mode 100644\nindex 0000000000..81af45cf24\n--- /dev/null\n+++ b/data/sql/custom/db_world/0000-00-00_npcbot_01_creature_template.sql\n@@ -0,0 +1,368 @@\n+--\n+SET @BOT_START = 70000;\n+SET @BOT_END   = 70586;\n+\n+INSERT IGNORE INTO `creature_template`\n+(`entry`,`difficulty_entry_1`,`difficulty_entry_2`,`difficulty_entry_3`,`KillCredit1`,`KillCredit2`,`name`,`subname`,`IconName`,`gossip_menu_id`,`minlevel`,`maxlevel`,`exp`,`faction`,`npcflag`,`speed_walk`,`speed_run`,`speed_swim`,`speed_flight`,`detection_range`,`rank`,`dmgschool`,`DamageModifier`,`BaseAttackTime`,`RangeAttackTime`,`BaseVariance`,`RangeVariance`,`unit_class`,`unit_flags`,`unit_flags2`,`dynamicflags`,`family`,`type`,`type_flags`,`lootid`,`pickpocketloot`,`skinloot`,`PetSpellDataId`,`VehicleId`,`mingold`,`maxgold`,`AIName`,`MovementType`,`HoverHeight`,`HealthModifier`,`ManaModifier`,`ArmorModifier`,`ExperienceModifier`,`RacialLeader`,`movementId`,`RegenHealth`,`flags_extra`,`ScriptName`,`VerifiedBuild`)\n+VALUES\n+(70000, 0, 0, 0, 0, 0, \"Lagretta\", \"Bots for hire\", \"\", 0, 83, 83, 2, 35, 1, 1.4, 1.14286, 1, 1, 20, 4, 0, 1, 0, 0, 1, 1, 1, 33088, 2048, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 4.8, 1, 1, 1, 0, 0, 1, 0, \"script_bot_giver\", -1),\n+(70001, 0, 0, 0, 0, 0, \"Llane\", \"Warrior Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3400, 2000, 1, 1, 1, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"warrior_bot\", -1),\n+(70002, 0, 0, 0, 0, 0, \"Thran\", \"Warrior Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3400, 2000, 1, 1, 1, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"warrior_bot\", -1),\n+(70003, 0, 0, 0, 0, 0, \"Lyria\", \"Warrior Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3400, 2000, 1, 1, 1, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"warrior_bot\", -1),\n+(70004, 0, 0, 0, 0, 0, \"Ander\", \"Warrior Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3400, 2000, 1, 1, 1, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"warrior_bot\", -1),\n+(70005, 0, 0, 0, 0, 0, \"Malosh\", \"Warrior Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3400, 2000, 1, 1, 1, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"warrior_bot\", -1),\n+(70006, 0, 0, 0, 0, 0, \"Granis\", \"Warrior Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3400, 2000, 1, 1, 1, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"warrior_bot\", -1),\n+(70007, 0, 0, 0, 0, 0, \"Kelstrum\", \"Warrior Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3400, 2000, 1, 1, 1, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"warrior_bot\", -1),\n+(70008, 0, 0, 0, 0, 0, \"Dannal\", \"Warrior Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3400, 2000, 1, 1, 1, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"warrior_bot\", -1),\n+(70009, 0, 0, 0, 0, 0, \"Austil\", \"Warrior Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3400, 2000, 1, 1, 1, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"warrior_bot\", -1),\n+(70010, 0, 0, 0, 0, 0, \"Torm\", \"Warrior Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3400, 2000, 1, 1, 1, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"warrior_bot\", -1),\n+(70011, 0, 0, 0, 0, 0, \"Sark\", \"Warrior Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3400, 2000, 1, 1, 1, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"warrior_bot\", -1),\n+(70012, 0, 0, 0, 0, 0, \"Ker\", \"Warrior Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3400, 2000, 1, 1, 1, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"warrior_bot\", -1),\n+(70013, 0, 0, 0, 0, 0, \"Harutt\", \"Warrior Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3400, 2000, 1, 1, 1, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"warrior_bot\", -1),\n+(70014, 0, 0, 0, 0, 0, \"Krang\", \"Warrior Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3400, 2000, 1, 1, 1, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"warrior_bot\", -1),\n+(70015, 0, 0, 0, 0, 0, \"Frang\", \"Warrior Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3400, 2000, 1, 1, 1, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"warrior_bot\", -1),\n+(70016, 0, 0, 0, 0, 0, \"Tarshaw\", \"Warrior Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3400, 2000, 1, 1, 1, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"warrior_bot\", -1),\n+(70017, 0, 0, 0, 0, 0, \"Grezz\", \"Warrior Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3400, 2000, 1, 1, 1, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"warrior_bot\", -1),\n+(70018, 0, 0, 0, 0, 0, \"Sorek\", \"Warrior Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3400, 2000, 1, 1, 1, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"warrior_bot\", -1),\n+(70019, 0, 0, 0, 0, 0, \"Zel'mak\", \"Warrior Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3400, 2000, 1, 1, 1, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"warrior_bot\", -1),\n+(70020, 0, 0, 0, 0, 0, \"Alyissia\", \"Warrior Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3400, 2000, 1, 1, 1, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"warrior_bot\", -1),\n+(70021, 0, 0, 0, 0, 0, \"Kyra\", \"Warrior Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3400, 2000, 1, 1, 1, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"warrior_bot\", -1),\n+(70022, 0, 0, 0, 0, 0, \"Arias'ta\", \"Warrior Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3400, 2000, 1, 1, 1, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"warrior_bot\", -1),\n+(70023, 0, 0, 0, 0, 0, \"Sildanair\", \"Warrior Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3400, 2000, 1, 1, 1, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"warrior_bot\", -1),\n+(70024, 0, 0, 0, 0, 0, \"Chris\", \"Warrior Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3400, 2000, 1, 1, 1, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"warrior_bot\", -1),\n+(70025, 0, 0, 0, 0, 0, \"Angela\", \"Warrior Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3400, 2000, 1, 1, 1, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"warrior_bot\", -1),\n+(70026, 0, 0, 0, 0, 0, \"Baltus\", \"Warrior Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3400, 2000, 1, 1, 1, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"warrior_bot\", -1),\n+(70027, 0, 0, 0, 0, 0, \"Kelv\", \"Warrior Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3400, 2000, 1, 1, 1, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"warrior_bot\", -1),\n+(70028, 0, 0, 0, 0, 0, \"Bilban\", \"Warrior Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3400, 2000, 1, 1, 1, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"warrior_bot\", -1),\n+(70029, 0, 0, 0, 0, 0, \"Wu\", \"Warrior Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3400, 2000, 1, 1, 1, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"warrior_bot\", -1),\n+(70030, 0, 0, 0, 0, 0, \"Ilsa\", \"Warrior Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3400, 2000, 1, 1, 1, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"warrior_bot\", -1),\n+(70031, 0, 0, 0, 0, 0, \"Darnath\", \"Warrior Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3400, 2000, 1, 1, 1, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"warrior_bot\", -1),\n+(70032, 0, 0, 0, 0, 0, \"Evencane\", \"Warrior Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3400, 2000, 1, 1, 1, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"warrior_bot\", -1),\n+(70033, 0, 0, 0, 0, 0, \"Kore\", \"Warrior Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3400, 2000, 1, 1, 1, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"warrior_bot\", -1),\n+(70034, 0, 0, 0, 0, 0, \"Ahonan\", \"Warrior Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3400, 2000, 1, 1, 1, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"warrior_bot\", -1),\n+(70035, 0, 0, 0, 0, 0, \"Behomat\", \"Warrior Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3400, 2000, 1, 1, 1, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"warrior_bot\", -1),\n+(70036, 0, 0, 0, 0, 0, \"Ruada\", \"Warrior Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3400, 2000, 1, 1, 1, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"warrior_bot\", -1),\n+(70037, 0, 0, 0, 0, 0, \"Kazi\", \"Warrior Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3400, 2000, 1, 1, 1, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"warrior_bot\", -1),\n+(70038, 0, 0, 0, 0, 0, \"Kerra\", \"Warrior Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3400, 2000, 1, 1, 1, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"warrior_bot\", -1),\n+(70051, 0, 0, 0, 0, 0, \"Sammuel\", \"Paladin Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2300, 2000, 1, 1, 2, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"paladin_bot\", -1),\n+(70052, 0, 0, 0, 0, 0, \"Bromos\", \"Paladin Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2300, 2000, 1, 1, 2, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"paladin_bot\", -1),\n+(70053, 0, 0, 0, 0, 0, \"Wilhelm\", \"Paladin Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2300, 2000, 1, 1, 2, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"paladin_bot\", -1),\n+(70054, 0, 0, 0, 0, 0, \"Grayson\", \"Paladin Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2300, 2000, 1, 1, 2, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"paladin_bot\", -1),\n+(70055, 0, 0, 0, 0, 0, \"Azar\", \"Paladin Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2300, 2000, 1, 1, 2, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"paladin_bot\", -1),\n+(70056, 0, 0, 0, 0, 0, \"Valgar\", \"Paladin Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2300, 2000, 1, 1, 2, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"paladin_bot\", -1),\n+(70057, 0, 0, 0, 0, 0, \"Beldruk\", \"Paladin Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2300, 2000, 1, 1, 2, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"paladin_bot\", -1),\n+(70058, 0, 0, 0, 0, 0, \"Brandur\", \"Paladin Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2300, 2000, 1, 1, 2, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"paladin_bot\", -1),\n+(70059, 0, 0, 0, 0, 0, \"Arthur\", \"Paladin Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2300, 2000, 1, 1, 2, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"paladin_bot\", -1),\n+(70060, 0, 0, 0, 0, 0, \"Katherine\", \"Paladin Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2300, 2000, 1, 1, 2, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"paladin_bot\", -1),\n+(70061, 0, 0, 0, 0, 0, \"Karman\", \"Paladin Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2300, 2000, 1, 1, 2, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"paladin_bot\", -1),\n+(70062, 0, 0, 0, 0, 0, \"Jesthenis\", \"Paladin Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2300, 2000, 1, 1, 2, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"paladin_bot\", -1),\n+(70063, 0, 0, 0, 0, 0, \"Noellene\", \"Paladin Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2300, 2000, 1, 1, 2, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"paladin_bot\", -1),\n+(70064, 0, 0, 0, 0, 0, \"Aurelon\", \"Paladin Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2300, 2000, 1, 1, 2, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"paladin_bot\", -1),\n+(70065, 0, 0, 0, 0, 0, \"Osselan\", \"Paladin Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2300, 2000, 1, 1, 2, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"paladin_bot\", -1),\n+(70066, 0, 0, 0, 0, 0, \"Ithelis\", \"Paladin Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2300, 2000, 1, 1, 2, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"paladin_bot\", -1),\n+(70067, 0, 0, 0, 0, 0, \"Bachi\", \"Paladin Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2300, 2000, 1, 1, 2, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"paladin_bot\", -1),\n+(70068, 0, 0, 0, 0, 0, \"Baatun\", \"Paladin Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2300, 2000, 1, 1, 2, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"paladin_bot\", -1),\n+(70069, 0, 0, 0, 0, 0, \"Kavaan\", \"Paladin Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2300, 2000, 1, 1, 2, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"paladin_bot\", -1),\n+(70070, 0, 0, 0, 0, 0, \"Tullas\", \"Paladin Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2300, 2000, 1, 1, 2, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"paladin_bot\", -1),\n+(70071, 0, 0, 0, 0, 0, \"Jol\", \"Paladin Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2300, 2000, 1, 1, 2, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"paladin_bot\", -1),\n+(70072, 0, 0, 0, 0, 0, \"Cyssa\", \"Paladin Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2300, 2000, 1, 1, 2, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"paladin_bot\", -1),\n+(70073, 0, 0, 0, 0, 0, \"Pyreanor\", \"Paladin Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2300, 2000, 1, 1, 2, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"paladin_bot\", -1),\n+(70074, 0, 0, 0, 0, 0, \"Rukua\", \"Paladin Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2300, 2000, 1, 1, 2, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"paladin_bot\", -1),\n+(70101, 0, 0, 0, 0, 0, \"Thorgas\", \"Hunter Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2800, 2000, 1, 1, 3, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"hunter_bot\", -1),\n+(70102, 0, 0, 0, 0, 0, \"Ogromm\", \"Hunter Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2800, 2000, 1, 1, 3, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"hunter_bot\", -1),\n+(70103, 0, 0, 0, 0, 0, \"Grif\", \"Hunter Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2800, 2000, 1, 1, 3, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"hunter_bot\", -1),\n+(70104, 0, 0, 0, 0, 0, \"Kragg\", \"Hunter Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2800, 2000, 1, 1, 3, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"hunter_bot\", -1),\n+(70105, 0, 0, 0, 0, 0, \"Kary\", \"Hunter Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2800, 2000, 1, 1, 3, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"hunter_bot\", -1),\n+(70106, 0, 0, 0, 0, 0, \"Holt\", \"Hunter Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2800, 2000, 1, 1, 3, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"hunter_bot\", -1),\n+(70107, 0, 0, 0, 0, 0, \"Urek\", \"Hunter Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2800, 2000, 1, 1, 3, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"hunter_bot\", -1),\n+(70108, 0, 0, 0, 0, 0, \"Lanka\", \"Hunter Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2800, 2000, 1, 1, 3, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"hunter_bot\", -1),\n+(70109, 0, 0, 0, 0, 0, \"Yaw\", \"Hunter Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2800, 2000, 1, 1, 3, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"hunter_bot\", -1),\n+(70110, 0, 0, 0, 0, 0, \"Jen'shan\", \"Hunter Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2800, 2000, 1, 1, 3, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"hunter_bot\", -1),\n+(70111, 0, 0, 0, 0, 0, \"Thotar\", \"Hunter Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2800, 2000, 1, 1, 3, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"hunter_bot\", -1),\n+(70112, 0, 0, 0, 0, 0, \"Ormak\", \"Hunter Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2800, 2000, 1, 1, 3, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"hunter_bot\", -1),\n+(70113, 0, 0, 0, 0, 0, \"Xor'juul\", \"Hunter Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2800, 2000, 1, 1, 3, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"hunter_bot\", -1),\n+(70114, 0, 0, 0, 0, 0, \"Sian'dur\", \"Hunter Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2800, 2000, 1, 1, 3, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"hunter_bot\", -1),\n+(70115, 0, 0, 0, 0, 0, \"Ayanna\", \"Hunter Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2800, 2000, 1, 1, 3, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"hunter_bot\", -1),\n+(70116, 0, 0, 0, 0, 0, \"Dazalar\", \"Hunter Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2800, 2000, 1, 1, 3, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"hunter_bot\", -1),\n+(70117, 0, 0, 0, 0, 0, \"Danlaar\", \"Hunter Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2800, 2000, 1, 1, 3, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"hunter_bot\", -1),\n+(70118, 0, 0, 0, 0, 0, \"Jeen'ra\", \"Hunter Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2800, 2000, 1, 1, 3, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"hunter_bot\", -1),\n+(70119, 0, 0, 0, 0, 0, \"Jocaste\", \"Hunter Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2800, 2000, 1, 1, 3, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"hunter_bot\", -1),\n+(70120, 0, 0, 0, 0, 0, \"Dorion\", \"Hunter Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2800, 2000, 1, 1, 3, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"hunter_bot\", -1),\n+(70121, 0, 0, 0, 0, 0, \"Daera\", \"Hunter Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2800, 2000, 1, 1, 3, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"hunter_bot\", -1),\n+(70122, 0, 0, 0, 0, 0, \"Olmin\", \"Hunter Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2800, 2000, 1, 1, 3, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"hunter_bot\", -1),\n+(70123, 0, 0, 0, 0, 0, \"Regnus\", \"Hunter Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2800, 2000, 1, 1, 3, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"hunter_bot\", -1),\n+(70124, 0, 0, 0, 0, 0, \"Kaerbrus\", \"Hunter Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2800, 2000, 1, 1, 3, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"hunter_bot\", -1),\n+(70125, 0, 0, 0, 0, 0, \"Einris\", \"Hunter Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2800, 2000, 1, 1, 3, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"hunter_bot\", -1),\n+(70126, 0, 0, 0, 0, 0, \"Ulfir\", \"Hunter Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2800, 2000, 1, 1, 3, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"hunter_bot\", -1),\n+(70127, 0, 0, 0, 0, 0, \"Thorfin\", \"Hunter Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2800, 2000, 1, 1, 3, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"hunter_bot\", -1),\n+(70128, 0, 0, 0, 0, 0, \"Alenndaar\", \"Hunter Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2800, 2000, 1, 1, 3, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"hunter_bot\", -1),\n+(70129, 0, 0, 0, 0, 0, \"Dargh\", \"Hunter Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2800, 2000, 1, 1, 3, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"hunter_bot\", -1),\n+(70130, 0, 0, 0, 0, 0, \"Sallina\", \"Hunter Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2800, 2000, 1, 1, 3, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"hunter_bot\", -1),\n+(70131, 0, 0, 0, 0, 0, \"Hannovia\", \"Hunter Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2800, 2000, 1, 1, 3, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"hunter_bot\", -1),\n+(70132, 0, 0, 0, 0, 0, \"Keilnei\", \"Hunter Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2800, 2000, 1, 1, 3, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"hunter_bot\", -1),\n+(70133, 0, 0, 0, 0, 0, \"Tana\", \"Hunter Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2800, 2000, 1, 1, 3, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"hunter_bot\", -1),\n+(70134, 0, 0, 0, 0, 0, \"Oninath\", \"Hunter Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2800, 2000, 1, 1, 3, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"hunter_bot\", -1),\n+(70135, 0, 0, 0, 0, 0, \"Zandine\", \"Hunter Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2800, 2000, 1, 1, 3, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"hunter_bot\", -1),\n+(70136, 0, 0, 0, 0, 0, \"Deremiis\", \"Hunter Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2800, 2000, 1, 1, 3, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"hunter_bot\", -1),\n+(70137, 0, 0, 0, 0, 0, \"Acteon\", \"Hunter Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2800, 2000, 1, 1, 3, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"hunter_bot\", -1),\n+(70138, 0, 0, 0, 0, 0, \"Vord\", \"Hunter Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2800, 2000, 1, 1, 3, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"hunter_bot\", -1),\n+(70139, 0, 0, 0, 0, 0, \"Killac\", \"Hunter bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2800, 2000, 1, 1, 3, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"hunter_bot\", -1),\n+(70151, 0, 0, 0, 0, 0, \"Jorik\", \"Rogue Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 1600, 2000, 1, 1, 4, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"rogue_bot\", -1),\n+(70152, 0, 0, 0, 0, 0, \"Solm\", \"Rogue Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 1600, 2000, 1, 1, 4, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"rogue_bot\", -1),\n+(70153, 0, 0, 0, 0, 0, \"Keryn\", \"Rogue Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 1600, 2000, 1, 1, 4, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"rogue_bot\", -1),\n+(70154, 0, 0, 0, 0, 0, \"Osborne\", \"Rogue Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 1600, 2000, 1, 1, 4, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"rogue_bot\", -1),\n+(70155, 0, 0, 0, 0, 0, \"Hogral\", \"Rogue Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 1600, 2000, 1, 1, 4, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"rogue_bot\", -1),\n+(70156, 0, 0, 0, 0, 0, \"Ian\", \"Rogue Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 1600, 2000, 1, 1, 4, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"rogue_bot\", -1),\n+(70157, 0, 0, 0, 0, 0, \"David\", \"Rogue Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 1600, 2000, 1, 1, 4, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"rogue_bot\", -1),\n+(70158, 0, 0, 0, 0, 0, \"Marion\", \"Rogue Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 1600, 2000, 1, 1, 4, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"rogue_bot\", -1),\n+(70159, 0, 0, 0, 0, 0, \"Rwag\", \"Rogue Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 1600, 2000, 1, 1, 4, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"rogue_bot\", -1),\n+(70160, 0, 0, 0, 0, 0, \"Kaplak\", \"Rogue Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 1600, 2000, 1, 1, 4, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"rogue_bot\", -1),\n+(70161, 0, 0, 0, 0, 0, \"Gest\", \"Rogue Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 1600, 2000, 1, 1, 4, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"rogue_bot\", -1),\n+(70162, 0, 0, 0, 0, 0, \"Ormok\", \"Rogue Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 1600, 2000, 1, 1, 4, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"rogue_bot\", -1),\n+(70163, 0, 0, 0, 0, 0, \"Shenthul\", \"Rogue Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 1600, 2000, 1, 1, 4, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"rogue_bot\", -1),\n+(70164, 0, 0, 0, 0, 0, \"Frahun\", \"Rogue Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 1600, 2000, 1, 1, 4, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"rogue_bot\", -1),\n+(70165, 0, 0, 0, 0, 0, \"Jannok\", \"Rogue Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 1600, 2000, 1, 1, 4, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"rogue_bot\", -1),\n+(70166, 0, 0, 0, 0, 0, \"Syurna\", \"Rogue Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 1600, 2000, 1, 1, 4, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"rogue_bot\", -1),\n+(70167, 0, 0, 0, 0, 0, \"Erion\", \"Rogue Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 1600, 2000, 1, 1, 4, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"rogue_bot\", -1),\n+(70168, 0, 0, 0, 0, 0, \"Anishar\", \"Rogue Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 1600, 2000, 1, 1, 4, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"rogue_bot\", -1),\n+(70169, 0, 0, 0, 0, 0, \"Carolyn\", \"Rogue Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 1600, 2000, 1, 1, 4, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"rogue_bot\", -1),\n+(70170, 0, 0, 0, 0, 0, \"Miles\", \"Rogue Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 1600, 2000, 1, 1, 4, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"rogue_bot\", -1),\n+(70171, 0, 0, 0, 0, 0, \"Gregory\", \"Rogue Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 1600, 2000, 1, 1, 4, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"rogue_bot\", -1),\n+(70172, 0, 0, 0, 0, 0, \"Hulfdan\", \"Rogue Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 1600, 2000, 1, 1, 4, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"rogue_bot\", -1),\n+(70173, 0, 0, 0, 0, 0, \"Ormyr\", \"Rogue Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 1600, 2000, 1, 1, 4, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"rogue_bot\", -1),\n+(70174, 0, 0, 0, 0, 0, \"Fenthwick\", \"Rogue Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 1600, 2000, 1, 1, 4, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"rogue_bot\", -1),\n+(70175, 0, 0, 0, 0, 0, \"Fahrad\", \"Rogue Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 1600, 2000, 1, 1, 4, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"rogue_bot\", -1),\n+(70176, 0, 0, 0, 0, 0, \"Tony\", \"Rogue Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 1600, 2000, 1, 1, 4, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"rogue_bot\", -1),\n+(70177, 0, 0, 0, 0, 0, \"Kariel\", \"Rogue Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 1600, 2000, 1, 1, 4, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"rogue_bot\", -1),\n+(70178, 0, 0, 0, 0, 0, \"Tannaria\", \"Rogue Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 1600, 2000, 1, 1, 4, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"rogue_bot\", -1),\n+(70179, 0, 0, 0, 0, 0, \"Zelanis\", \"Rogue Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 1600, 2000, 1, 1, 4, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"rogue_bot\", -1),\n+(70180, 0, 0, 0, 0, 0, \"Elara\", \"Rogue Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 1600, 2000, 1, 1, 4, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"rogue_bot\", -1),\n+(70181, 0, 0, 0, 0, 0, \"Nerisen\", \"Rogue Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 1600, 2000, 1, 1, 4, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"rogue_bot\", -1),\n+(70201, 0, 0, 0, 0, 0, \"Anetta\", \"Priest Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3600, 2000, 1, 1, 5, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"priest_bot\", -1),\n+(70202, 0, 0, 0, 0, 0, \"Laurena\", \"Priest Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3600, 2000, 1, 1, 5, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"priest_bot\", -1),\n+(70203, 0, 0, 0, 0, 0, \"Josetta\", \"Priest Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3600, 2000, 1, 1, 5, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"priest_bot\", -1),\n+(70204, 0, 0, 0, 0, 0, \"Branstock\", \"Priest Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3600, 2000, 1, 1, 5, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"priest_bot\", -1),\n+(70205, 0, 0, 0, 0, 0, \"Maxan\", \"Priest Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3600, 2000, 1, 1, 5, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"priest_bot\", -1),\n+(70206, 0, 0, 0, 0, 0, \"Duesten\", \"Priest Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3600, 2000, 1, 1, 5, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"priest_bot\", -1),\n+(70207, 0, 0, 0, 0, 0, \"Beryl\", \"Priest Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3600, 2000, 1, 1, 5, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"priest_bot\", -1),\n+(70208, 0, 0, 0, 0, 0, \"Miles\", \"Priest Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3600, 2000, 1, 1, 5, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"priest_bot\", -1),\n+(70209, 0, 0, 0, 0, 0, \"Malakai\", \"Priest Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3600, 2000, 1, 1, 5, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"priest_bot\", -1),\n+(70210, 0, 0, 0, 0, 0, \"Cobb\", \"Priest Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3600, 2000, 1, 1, 5, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"priest_bot\", -1),\n+(70211, 0, 0, 0, 0, 0, \"Shanda\", \"Priest Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3600, 2000, 1, 1, 5, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"priest_bot\", -1),\n+(70212, 0, 0, 0, 0, 0, \"Laurna\", \"Priest Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3600, 2000, 1, 1, 5, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"priest_bot\", -1),\n+(70213, 0, 0, 0, 0, 0, \"Tai'jin\", \"Priest Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3600, 2000, 1, 1, 5, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"priest_bot\", -1),\n+(70214, 0, 0, 0, 0, 0, \"Ken'jai\", \"Priest Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3600, 2000, 1, 1, 5, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"priest_bot\", -1),\n+(70215, 0, 0, 0, 0, 0, \"Astarii\", \"Priest Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3600, 2000, 1, 1, 5, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"priest_bot\", -1),\n+(70216, 0, 0, 0, 0, 0, \"Jandria\", \"Priest Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3600, 2000, 1, 1, 5, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"priest_bot\", -1),\n+(70217, 0, 0, 0, 0, 0, \"Lariia\", \"Priest Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3600, 2000, 1, 1, 5, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"priest_bot\", -1),\n+(70218, 0, 0, 0, 0, 0, \"Lankester\", \"Priest Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3600, 2000, 1, 1, 5, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"priest_bot\", -1),\n+(70219, 0, 0, 0, 0, 0, \"Lazarus\", \"Priest Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3600, 2000, 1, 1, 5, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"priest_bot\", -1),\n+(70220, 0, 0, 0, 0, 0, \"Theodrus\", \"Priest Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3600, 2000, 1, 1, 5, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"priest_bot\", -1),\n+(70221, 0, 0, 0, 0, 0, \"Braenna\", \"Priest Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3600, 2000, 1, 1, 5, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"priest_bot\", -1),\n+(70222, 0, 0, 0, 0, 0, \"Toldren\", \"Priest Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3600, 2000, 1, 1, 5, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"priest_bot\", -1),\n+(70223, 0, 0, 0, 0, 0, \"Benjamin\", \"Priest Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3600, 2000, 1, 1, 5, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"priest_bot\", -1),\n+(70224, 0, 0, 0, 0, 0, \"Joshua\", \"Priest Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3600, 2000, 1, 1, 5, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"priest_bot\", -1),\n+(70225, 0, 0, 0, 0, 0, \"Zayus\", \"Priest Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3600, 2000, 1, 1, 5, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"priest_bot\", -1),\n+(70226, 0, 0, 0, 0, 0, \"X'yera\", \"Priest Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3600, 2000, 1, 1, 5, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"priest_bot\", -1),\n+(70227, 0, 0, 0, 0, 0, \"Ur'kyo\", \"Priest Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3600, 2000, 1, 1, 5, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"priest_bot\", -1),\n+(70228, 0, 0, 0, 0, 0, \"Nara\", \"Priest Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3600, 2000, 1, 1, 5, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"priest_bot\", -1),\n+(70229, 0, 0, 0, 0, 0, \"Alathea\", \"Priest Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3600, 2000, 1, 1, 5, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"priest_bot\", -1),\n+(70230, 0, 0, 0, 0, 0, \"Rohan\", \"Priest Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3600, 2000, 1, 1, 5, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"priest_bot\", -1),\n+(70231, 0, 0, 0, 0, 0, \"Arena\", \"Priest Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3600, 2000, 1, 1, 5, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"priest_bot\", -1),\n+(70232, 0, 0, 0, 0, 0, \"Ponaris\", \"Priest Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3600, 2000, 1, 1, 5, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"priest_bot\", -1),\n+(70233, 0, 0, 0, 0, 0, \"Zalduun\", \"Priest Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3600, 2000, 1, 1, 5, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"priest_bot\", -1),\n+(70234, 0, 0, 0, 0, 0, \"Aldrae\", \"Priest Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3600, 2000, 1, 1, 5, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"priest_bot\", -1),\n+(70235, 0, 0, 0, 0, 0, \"Lotheolan\", \"Priest Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3600, 2000, 1, 1, 5, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"priest_bot\", -1),\n+(70236, 0, 0, 0, 0, 0, \"Belestra\", \"Priest Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3600, 2000, 1, 1, 5, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"priest_bot\", -1),\n+(70237, 0, 0, 0, 0, 0, \"Caedmos\", \"Priest Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3600, 2000, 1, 1, 5, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"priest_bot\", -1),\n+(70238, 0, 0, 0, 0, 0, \"Guvan\", \"Priest Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3600, 2000, 1, 1, 5, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"priest_bot\", -1),\n+(70239, 0, 0, 0, 0, 0, \"Izmir\", \"Priest Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3600, 2000, 1, 1, 5, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"priest_bot\", -1),\n+(70240, 0, 0, 0, 0, 0, \"Fallat\", \"Priest Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3600, 2000, 1, 1, 5, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"priest_bot\", -1),\n+(70251, 0, 0, 0, 0, 0, \"Haromm\", \"Shaman Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2600, 2000, 1, 1, 7, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"shaman_bot\", -1),\n+(70252, 0, 0, 0, 0, 0, \"Siln\", \"Shaman Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2600, 2000, 1, 1, 7, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"shaman_bot\", -1),\n+(70253, 0, 0, 0, 0, 0, \"Tigor\", \"Shaman Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2600, 2000, 1, 1, 7, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"shaman_bot\", -1),\n+(70254, 0, 0, 0, 0, 0, \"Beram\", \"Shaman Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2600, 2000, 1, 1, 7, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"shaman_bot\", -1),\n+(70255, 0, 0, 0, 0, 0, \"Meela\", \"Shaman Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2600, 2000, 1, 1, 7, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"shaman_bot\", -1),\n+(70256, 0, 0, 0, 0, 0, \"Narm\", \"Shaman Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2600, 2000, 1, 1, 7, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"shaman_bot\", -1),\n+(70257, 0, 0, 0, 0, 0, \"Shikrik\", \"Shaman Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2600, 2000, 1, 1, 7, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"shaman_bot\", -1),\n+(70258, 0, 0, 0, 0, 0, \"Swart\", \"Shaman Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2600, 2000, 1, 1, 7, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"shaman_bot\", -1),\n+(70259, 0, 0, 0, 0, 0, \"Kardris\", \"Shaman Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2600, 2000, 1, 1, 7, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"shaman_bot\", -1),\n+(70260, 0, 0, 0, 0, 0, \"Sian'tsu\", \"Shaman Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2600, 2000, 1, 1, 7, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"shaman_bot\", -1),\n+(70261, 0, 0, 0, 0, 0, \"Sagorne\", \"Shaman Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2600, 2000, 1, 1, 7, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"shaman_bot\", -1),\n+(70265, 0, 0, 0, 0, 0, \"Sulaa\", \"Shaman Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2600, 2000, 1, 1, 7, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"shaman_bot\", -1),\n+(70267, 0, 0, 0, 0, 0, \"Umbrua\", \"Shaman Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2600, 2000, 1, 1, 7, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"shaman_bot\", -1),\n+(70268, 0, 0, 0, 0, 0, \"Javad\", \"Shaman Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2600, 2000, 1, 1, 7, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"shaman_bot\", -1),\n+(70301, 0, 0, 0, 0, 0, \"Khelden\", \"Mage Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3800, 2000, 1, 1, 8, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"mage_bot\", -1),\n+(70302, 0, 0, 0, 0, 0, \"Zaldimar\", \"Mage Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3800, 2000, 1, 1, 8, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"mage_bot\", -1),\n+(70303, 0, 0, 0, 0, 0, \"Maginor\", \"Mage Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3800, 2000, 1, 1, 8, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"mage_bot\", -1),\n+(70304, 0, 0, 0, 0, 0, \"Marryk\", \"Mage Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3800, 2000, 1, 1, 8, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"mage_bot\", -1),\n+(70305, 0, 0, 0, 0, 0, \"Magis\", \"Mage Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3800, 2000, 1, 1, 8, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"mage_bot\", -1),\n+(70306, 0, 0, 0, 0, 0, \"Isabella\", \"Mage Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3800, 2000, 1, 1, 8, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"mage_bot\", -1),\n+(70307, 0, 0, 0, 0, 0, \"Cain\", \"Mage Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3800, 2000, 1, 1, 8, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"mage_bot\", -1),\n+(70308, 0, 0, 0, 0, 0, \"Shymm\", \"Mage Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3800, 2000, 1, 1, 8, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"mage_bot\", -1),\n+(70309, 0, 0, 0, 0, 0, \"Ursyn\", \"Mage Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3800, 2000, 1, 1, 8, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"mage_bot\", -1),\n+(70310, 0, 0, 0, 0, 0, \"Thurston\", \"Mage Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3800, 2000, 1, 1, 8, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"mage_bot\", -1),\n+(70311, 0, 0, 0, 0, 0, \"Pierce\", \"Mage Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3800, 2000, 1, 1, 8, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"mage_bot\", -1),\n+(70312, 0, 0, 0, 0, 0, \"Anastasia\", \"Mage Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3800, 2000, 1, 1, 8, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"mage_bot\", -1),\n+(70313, 0, 0, 0, 0, 0, \"Bink\", \"Mage Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3800, 2000, 1, 1, 8, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"mage_bot\", -1),\n+(70314, 0, 0, 0, 0, 0, \"Juli\", \"Mage Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3800, 2000, 1, 1, 8, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"mage_bot\", -1),\n+(70315, 0, 0, 0, 0, 0, \"Nittlebur\", \"Mage Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3800, 2000, 1, 1, 8, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"mage_bot\", -1),\n+(70316, 0, 0, 0, 0, 0, \"Jennea\", \"Mage Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3800, 2000, 1, 1, 8, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"mage_bot\", -1),\n+(70317, 0, 0, 0, 0, 0, \"Un'Thuwa\", \"Mage Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3800, 2000, 1, 1, 8, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"mage_bot\", -1),\n+(70318, 0, 0, 0, 0, 0, \"Pephredo\", \"Mage Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3800, 2000, 1, 1, 8, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"mage_bot\", -1),\n+(70319, 0, 0, 0, 0, 0, \"Enyo\", \"Mage Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3800, 2000, 1, 1, 8, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"mage_bot\", -1),\n+(70320, 0, 0, 0, 0, 0, \"Mai'ah\", \"Mage Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3800, 2000, 1, 1, 8, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"mage_bot\", -1),\n+(70321, 0, 0, 0, 0, 0, \"Deino\", \"Mage Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3800, 2000, 1, 1, 8, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"mage_bot\", -1),\n+(70322, 0, 0, 0, 0, 0, \"Uthel'nay\", \"Mage Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3800, 2000, 1, 1, 8, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"mage_bot\", -1),\n+(70323, 0, 0, 0, 0, 0, \"Dink\", \"Mage Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3800, 2000, 1, 1, 8, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"mage_bot\", -1),\n+(70324, 0, 0, 0, 0, 0, \"Julia\", \"Mage Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3800, 2000, 1, 1, 8, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"mage_bot\", -1),\n+(70325, 0, 0, 0, 0, 0, \"Garridel\", \"Mage Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3800, 2000, 1, 1, 8, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"mage_bot\", -1),\n+(70326, 0, 0, 0, 0, 0, \"Valaatu\", \"Mage Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3800, 2000, 1, 1, 8, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"mage_bot\", -1),\n+(70327, 0, 0, 0, 0, 0, \"Zaedana\", \"Mage Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3800, 2000, 1, 1, 8, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"mage_bot\", -1),\n+(70328, 0, 0, 0, 0, 0, \"Quithas\", \"Mage Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3800, 2000, 1, 1, 8, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"mage_bot\", -1),\n+(70329, 0, 0, 0, 0, 0, \"Inethven\", \"Mage Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3800, 2000, 1, 1, 8, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"mage_bot\", -1),\n+(70330, 0, 0, 0, 0, 0, \"Narinth\", \"Mage Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3800, 2000, 1, 1, 8, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"mage_bot\", -1),\n+(70331, 0, 0, 0, 0, 0, \"Edirah\", \"Mage Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3800, 2000, 1, 1, 8, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"mage_bot\", -1),\n+(70332, 0, 0, 0, 0, 0, \"Valustraa\", \"Mage Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3800, 2000, 1, 1, 8, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"mage_bot\", -1),\n+(70333, 0, 0, 0, 0, 0, \"Semid\", \"Mage Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3800, 2000, 1, 1, 8, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"mage_bot\", -1),\n+(70334, 0, 0, 0, 0, 0, \"Harnan\", \"Mage Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3800, 2000, 1, 1, 8, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"mage_bot\", -1),\n+(70335, 0, 0, 0, 0, 0, \"Bati\", \"Mage Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3800, 2000, 1, 1, 8, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"mage_bot\", -1),\n+(70336, 0, 0, 0, 0, 0, \"Derek\", \"Mage Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3800, 2000, 1, 1, 8, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"mage_bot\", -1),\n+(70351, 0, 0, 0, 0, 0, \"Drusilla\", \"Warlock Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3500, 2000, 1, 1, 9, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"warlock_bot\", -1),\n+(70352, 0, 0, 0, 0, 0, \"Alamar\", \"Warlock Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3500, 2000, 1, 1, 9, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"warlock_bot\", -1),\n+(70353, 0, 0, 0, 0, 0, \"Demisette\", \"Warlock Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3500, 2000, 1, 1, 9, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"warlock_bot\", -1),\n+(70354, 0, 0, 0, 0, 0, \"Maximillian\", \"Warlock Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3500, 2000, 1, 1, 9, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"warlock_bot\", -1),\n+(70355, 0, 0, 0, 0, 0, \"Kartosh\", \"Warlock Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3500, 2000, 1, 1, 9, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"warlock_bot\", -1),\n+(70356, 0, 0, 0, 0, 0, \"Maximillion\", \"Warlock Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3500, 2000, 1, 1, 9, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"warlock_bot\", -1),\n+(70357, 0, 0, 0, 0, 0, \"Rupert\", \"Warlock Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3500, 2000, 1, 1, 9, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"warlock_bot\", -1),\n+(70358, 0, 0, 0, 0, 0, \"Nartok\", \"Warlock Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3500, 2000, 1, 1, 9, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"warlock_bot\", -1),\n+(70359, 0, 0, 0, 0, 0, \"Dhugru\", \"Warlock Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3500, 2000, 1, 1, 9, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"warlock_bot\", -1),\n+(70360, 0, 0, 0, 0, 0, \"Grol'dar\", \"Warlock Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3500, 2000, 1, 1, 9, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"warlock_bot\", -1),\n+(70361, 0, 0, 0, 0, 0, \"Mirket\", \"Warlock Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3500, 2000, 1, 1, 9, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"warlock_bot\", -1),\n+(70362, 0, 0, 0, 0, 0, \"Zevrost\", \"Warlock Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3500, 2000, 1, 1, 9, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"warlock_bot\", -1),\n+(70363, 0, 0, 0, 0, 0, \"Kaal\", \"Warlock Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3500, 2000, 1, 1, 9, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"warlock_bot\", -1),\n+(70364, 0, 0, 0, 0, 0, \"Luther\", \"Warlock Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3500, 2000, 1, 1, 9, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"warlock_bot\", -1),\n+(70365, 0, 0, 0, 0, 0, \"Richard\", \"Warlock Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3500, 2000, 1, 1, 9, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"warlock_bot\", -1),\n+(70366, 0, 0, 0, 0, 0, \"Thistleheart\", \"Warlock Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3500, 2000, 1, 1, 9, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"warlock_bot\", -1),\n+(70367, 0, 0, 0, 0, 0, \"Briarthorn\", \"Warlock Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3500, 2000, 1, 1, 9, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"warlock_bot\", -1),\n+(70368, 0, 0, 0, 0, 0, \"Alexander\", \"Warlock Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3500, 2000, 1, 1, 9, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"warlock_bot\", -1),\n+(70369, 0, 0, 0, 0, 0, \"Ursula\", \"Warlock Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3500, 2000, 1, 1, 9, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"warlock_bot\", -1),\n+(70370, 0, 0, 0, 0, 0, \"Sandahl\", \"Warlock Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3500, 2000, 1, 1, 9, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"warlock_bot\", -1),\n+(70371, 0, 0, 0, 0, 0, \"Gimrizz\", \"Warlock Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3500, 2000, 1, 1, 9, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"warlock_bot\", -1),\n+(70372, 0, 0, 0, 0, 0, \"Teli'Larien\", \"Warlock Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3500, 2000, 1, 1, 9, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"warlock_bot\", -1),\n+(70373, 0, 0, 0, 0, 0, \"Celoenus\", \"Warlock Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3500, 2000, 1, 1, 9, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"warlock_bot\", -1),\n+(70374, 0, 0, 0, 0, 0, \"Alamma\", \"Warlock Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3500, 2000, 1, 1, 9, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"warlock_bot\", -1),\n+(70375, 0, 0, 0, 0, 0, \"Talionia\", \"Warlock Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3500, 2000, 1, 1, 9, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"warlock_bot\", -1),\n+(70376, 0, 0, 0, 0, 0, \"Zanien\", \"Warlock Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3500, 2000, 1, 1, 9, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"warlock_bot\", -1),\n+(70377, 0, 0, 0, 0, 0, \"Babagaya\", \"Warlock Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3500, 2000, 1, 1, 9, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"warlock_bot\", -1),\n+(70401, 0, 0, 0, 0, 0, \"Turak\", \"Druid Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2200, 2000, 1, 1, 11, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"druid_bot\", -1),\n+(70402, 0, 0, 0, 0, 0, \"Sheal\", \"Druid Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2200, 2000, 1, 1, 11, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"druid_bot\", -1),\n+(70403, 0, 0, 0, 0, 0, \"Kym\", \"Druid Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2200, 2000, 1, 1, 11, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"druid_bot\", -1),\n+(70404, 0, 0, 0, 0, 0, \"Gart\", \"Druid Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2200, 2000, 1, 1, 11, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"druid_bot\", -1),\n+(70405, 0, 0, 0, 0, 0, \"Gennia\", \"Druid Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2200, 2000, 1, 1, 11, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"druid_bot\", -1),\n+(70406, 0, 0, 0, 0, 0, \"Mardant\", \"Druid Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2200, 2000, 1, 1, 11, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"druid_bot\", -1),\n+(70407, 0, 0, 0, 0, 0, \"Kal\", \"Druid Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2200, 2000, 1, 1, 11, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"druid_bot\", -1),\n+(70408, 0, 0, 0, 0, 0, \"Mathrengyl\", \"Druid Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2200, 2000, 1, 1, 11, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"druid_bot\", -1),\n+(70409, 0, 0, 0, 0, 0, \"Denatharion\", \"Druid Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2200, 2000, 1, 1, 11, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"druid_bot\", -1),\n+(70410, 0, 0, 0, 0, 0, \"Fylerian\", \"Druid Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2200, 2000, 1, 1, 11, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"druid_bot\", -1),\n+(70411, 0, 0, 0, 0, 0, \"Sheldras\", \"Druid Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2200, 2000, 1, 1, 11, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"druid_bot\", -1),\n+(70412, 0, 0, 0, 0, 0, \"Theridran\", \"Druid Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2200, 2000, 1, 1, 11, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"druid_bot\", -1),\n+(70413, 0, 0, 0, 0, 0, \"Maldryn\", \"Druid Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2200, 2000, 1, 1, 11, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"druid_bot\", -1),\n+(70414, 0, 0, 0, 0, 0, \"Jannos\", \"Druid Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2200, 2000, 1, 1, 11, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"druid_bot\", -1),\n+(70415, 0, 0, 0, 0, 0, \"Golhine\", \"Druid Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2200, 2000, 1, 1, 11, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"druid_bot\", -1),\n+(70416, 0, 0, 0, 0, 0, \"Loganaar\", \"Druid Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2200, 2000, 1, 1, 11, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"druid_bot\", -1),\n+(70417, 0, 0, 0, 0, 0, \"Harene\", \"Druid Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2200, 2000, 1, 1, 11, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"druid_bot\", -1),\n+(70418, 0, 0, 0, 0, 0, \"Shalannius\", \"Druid Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 2200, 2000, 1, 1, 11, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"druid_bot\", -1),\n+(70451, 0, 0, 0, 0, 0, \"Siouxsie\", \"Death Knight Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3300, 2000, 1, 1, 6, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"death_knight_bot\", -1),\n+(70452, 0, 0, 0, 0, 0, \"Imhadria\", \"Death Knight Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3300, 2000, 1, 1, 6, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"death_knight_bot\", -1),\n+(70453, 0, 0, 0, 0, 0, \"Vaelen\", \"Death Knight Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3300, 2000, 1, 1, 6, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"death_knight_bot\", -1),\n+(70454, 0, 0, 0, 0, 0, \"Mynx\", \"Death Knight Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3300, 2000, 1, 1, 6, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"death_knight_bot\", -1),\n+(70455, 0, 0, 0, 0, 0, \"Lankral\", \"Death Knight Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3300, 2000, 1, 1, 6, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"death_knight_bot\", -1),\n+(70456, 0, 0, 0, 0, 0, \"Sliver\", \"Death Knight Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3300, 2000, 1, 1, 6, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"death_knight_bot\", -1),\n+(70457, 0, 0, 0, 0, 0, \"Vereth\", \"Death Knight Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3300, 2000, 1, 1, 6, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"death_knight_bot\", -1),\n+(70458, 0, 0, 0, 0, 0, \"Arly\", \"Death Knight Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3300, 2000, 1, 1, 6, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"death_knight_bot\", -1),\n+(70459, 0, 0, 0, 0, 0, \"Setaal\", \"Death Knight Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3300, 2000, 1, 1, 6, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"death_knight_bot\", -1),\n+(70460, 0, 0, 0, 0, 0, \"Uzo\", \"Death Knight Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3300, 2000, 1, 1, 6, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"death_knight_bot\", -1),\n+(70461, 0, 0, 0, 0, 0, \"Illyrie\", \"Death Knight Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3300, 2000, 1, 1, 6, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"death_knight_bot\", -1),\n+(70462, 0, 0, 0, 0, 0, \"Crok\", \"Death Knight Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3300, 2000, 1, 1, 6, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"death_knight_bot\", -1),\n+(70463, 0, 0, 0, 0, 0, \"Zor'be\", \"Death Knight Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3300, 2000, 1, 1, 6, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"death_knight_bot\", -1),\n+(70464, 0, 0, 0, 0, 0, \"Datura\", \"Death Knight Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3300, 2000, 1, 1, 6, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"death_knight_bot\", -1),\n+(70465, 0, 0, 0, 0, 0, \"Stefan\", \"Death Knight Bot\", \"\", 0, 80, 80, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 0, 0, 1, 3300, 2000, 1, 1, 6, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"death_knight_bot\", -1),\n+(70501, 0, 0, 0, 0, 0, \"Imp\", \"NULL\", \"\", 0, 80, 80, 2, 35, 0, 1.2, 1.3, 1, 1, 20, 0, 0, 1, 2000, 2000, 1, 1, 8, 0, 0, 0, 0, 3, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 135266416, \"warlock_pet_bot\", -1),\n+(70502, 0, 0, 0, 0, 0, \"Voidwalker\", \"NULL\", \"\", 0, 80, 80, 2, 35, 0, 1.2, 1.3, 1, 1, 20, 0, 0, 1, 2000, 2000, 1, 1, 8, 0, 0, 0, 0, 3, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 135266416, \"warlock_pet_bot\", -1),\n+(70503, 0, 0, 0, 0, 0, \"Succubus\", \"NULL\", \"\", 0, 80, 80, 2, 35, 0, 1.2, 1.3, 1, 1, 20, 0, 0, 1, 2000, 2000, 1, 1, 8, 0, 0, 0, 0, 3, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 135266416, \"warlock_pet_bot\", -1),\n+(70504, 0, 0, 0, 0, 0, \"Felhunter\", \"NULL\", \"\", 0, 80, 80, 2, 35, 0, 1.2, 1.3, 1, 1, 20, 0, 0, 1, 2000, 2000, 1, 1, 8, 0, 0, 0, 0, 3, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 135266416, \"warlock_pet_bot\", -1),\n+(70505, 0, 0, 0, 0, 0, \"Felguard\", \"NULL\", \"\", 0, 80, 80, 2, 35, 0, 1.2, 1.3, 1, 1, 20, 0, 0, 1, 2000, 2000, 1, 1, 8, 0, 0, 0, 0, 3, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 135266416, \"warlock_pet_bot\", -1),\n+(70506, 0, 0, 0, 0, 0, \"Spider\", \"NULL\", \"\", 0, 80, 80, 2, 35, 0, 1.2, 1.3, 1, 1, 20, 0, 0, 1, 2000, 2000, 1, 1, 1, 0, 0, 0, 0, 1, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 135266416, \"hunter_pet_bot\", -1),\n+(70507, 0, 0, 0, 0, 0, \"Serpent\", \"NULL\", \"\", 0, 80, 80, 2, 35, 0, 1.2, 1.3, 1, 1, 20, 0, 0, 1, 2000, 2000, 1, 1, 1, 0, 0, 0, 0, 1, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 135266416, \"hunter_pet_bot\", -1),\n+(70508, 0, 0, 0, 0, 0, \"Bird of Prey\", \"NULL\", \"\", 0, 80, 80, 2, 35, 0, 1.2, 1.3, 1, 1, 20, 0, 0, 1, 2000, 2000, 1, 1, 1, 0, 0, 0, 0, 1, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 135266416, \"hunter_pet_bot\", -1),\n+(70509, 0, 0, 0, 0, 0, \"Bat\", \"NULL\", \"\", 0, 80, 80, 2, 35, 0, 1.2, 1.3, 1, 1, 20, 0, 0, 1, 2000, 2000, 1, 1, 1, 0, 0, 0, 0, 1, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 135266416, \"hunter_pet_bot\", -1),\n+(70510, 0, 0, 0, 0, 0, \"Wind Serpent\", \"NULL\", \"\", 0, 80, 80, 2, 35, 0, 1.2, 1.3, 1, 1, 20, 0, 0, 1, 2000, 2000, 1, 1, 1, 0, 0, 0, 0, 1, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 135266416, \"hunter_pet_bot\", -1),\n+(70511, 0, 0, 0, 0, 0, \"Ravager\", \"NULL\", \"\", 0, 80, 80, 2, 35, 0, 1.2, 1.3, 1, 1, 20, 0, 0, 1, 2000, 2000, 1, 1, 1, 0, 0, 0, 0, 1, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 135266416, \"hunter_pet_bot\", -1),\n+(70512, 0, 0, 0, 0, 0, \"Dragonhawk\", \"NULL\", \"\", 0, 80, 80, 2, 35, 0, 1.2, 1.3, 1, 1, 20, 0, 0, 1, 2000, 2000, 1, 1, 1, 0, 0, 0, 0, 1, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 135266416, \"hunter_pet_bot\", -1),\n+(70513, 0, 0, 0, 0, 0, \"Nether Ray\", \"NULL\", \"\", 0, 80, 80, 2, 35, 0, 1.2, 1.3, 1, 1, 20, 0, 0, 1, 2000, 2000, 1, 1, 1, 0, 0, 0, 0, 1, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 135266416, \"hunter_pet_bot\", -1),\n+(70514, 0, 0, 0, 0, 0, \"Sporebat\", \"NULL\", \"\", 0, 80, 80, 2, 35, 0, 1.2, 1.3, 1, 1, 20, 0, 0, 1, 2000, 2000, 1, 1, 1, 0, 0, 0, 0, 1, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 135266416, \"hunter_pet_bot\", -1),\n+(70515, 0, 0, 0, 0, 0, \"Carrion Bird\", \"NULL\", \"\", 0, 80, 80, 2, 35, 0, 1.2, 1.3, 1, 1, 20, 0, 0, 1, 2000, 2000, 1, 1, 1, 0, 0, 0, 0, 1, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 135266416, \"hunter_pet_bot\", -1),\n+(70516, 0, 0, 0, 0, 0, \"Raptor\", \"NULL\", \"\", 0, 80, 80, 2, 35, 0, 1.2, 1.3, 1, 1, 20, 0, 0, 1, 2000, 2000, 1, 1, 1, 0, 0, 0, 0, 1, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 135266416, \"hunter_pet_bot\", -1),\n+(70517, 0, 0, 0, 0, 0, \"Wolf\", \"NULL\", \"\", 0, 80, 80, 2, 35, 0, 1.2, 1.3, 1, 1, 20, 0, 0, 1, 2000, 2000, 1, 1, 1, 0, 0, 0, 0, 1, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 135266416, \"hunter_pet_bot\", -1),\n+(70518, 0, 0, 0, 0, 0, \"Tallstrider\", \"NULL\", \"\", 0, 80, 80, 2, 35, 0, 1.2, 1.3, 1, 1, 20, 0, 0, 1, 2000, 2000, 1, 1, 1, 0, 0, 0, 0, 1, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 135266416, \"hunter_pet_bot\", -1),\n+(70519, 0, 0, 0, 0, 0, \"Cat\", \"NULL\", \"\", 0, 80, 80, 2, 35, 0, 1.2, 1.3, 1, 1, 20, 0, 0, 1, 2000, 2000, 1, 1, 1, 0, 0, 0, 0, 1, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 135266416, \"hunter_pet_bot\", -1),\n+(70520, 0, 0, 0, 0, 0, \"Hyena\", \"NULL\", \"\", 0, 80, 80, 2, 35, 0, 1.2, 1.3, 1, 1, 20, 0, 0, 1, 2000, 2000, 1, 1, 1, 0, 0, 0, 0, 1, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 135266416, \"hunter_pet_bot\", -1),\n+(70521, 0, 0, 0, 0, 0, \"Wasp\", \"NULL\", \"\", 0, 80, 80, 2, 35, 0, 1.2, 1.3, 1, 1, 20, 0, 0, 1, 2000, 2000, 1, 1, 1, 0, 0, 0, 0, 1, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 135266416, \"hunter_pet_bot\", -1),\n+(70522, 0, 0, 0, 0, 0, \"Teromoth\", \"NULL\", \"\", 0, 80, 80, 2, 35, 0, 1.2, 1.3, 1, 1, 20, 0, 0, 1, 2000, 2000, 1, 1, 1, 0, 0, 0, 0, 1, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 135266416, \"hunter_pet_bot\", -1),\n+(70523, 0, 0, 0, 0, 0, \"Scorpid\", \"NULL\", \"\", 0, 80, 80, 2, 35, 0, 1.2, 1.3, 1, 1, 20, 0, 0, 1, 2000, 2000, 1, 1, 1, 0, 0, 0, 0, 1, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 135266416, \"hunter_pet_bot\", -1),\n+(70524, 0, 0, 0, 0, 0, \"Turtle\", \"NULL\", \"\", 0, 80, 80, 2, 35, 0, 1.2, 1.3, 1, 1, 20, 0, 0, 1, 2000, 2000, 1, 1, 1, 0, 0, 0, 0, 1, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 135266416, \"hunter_pet_bot\", -1),\n+(70525, 0, 0, 0, 0, 0, \"Gorilla\", \"NULL\", \"\", 0, 80, 80, 2, 35, 0, 1.2, 1.3, 1, 1, 20, 0, 0, 1, 2000, 2000, 1, 1, 1, 0, 0, 0, 0, 1, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 135266416, \"hunter_pet_bot\", -1),\n+(70526, 0, 0, 0, 0, 0, \"Bear\", \"NULL\", \"\", 0, 80, 80, 2, 35, 0, 1.2, 1.3, 1, 1, 20, 0, 0, 1, 2000, 2000, 1, 1, 1, 0, 0, 0, 0, 1, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 135266416, \"hunter_pet_bot\", -1),\n+(70527, 0, 0, 0, 0, 0, \"Boar\", \"NULL\", \"\", 0, 80, 80, 2, 35, 0, 1.2, 1.3, 1, 1, 20, 0, 0, 1, 2000, 2000, 1, 1, 1, 0, 0, 0, 0, 1, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 135266416, \"hunter_pet_bot\", -1),\n+(70528, 0, 0, 0, 0, 0, \"Crab\", \"NULL\", \"\", 0, 80, 80, 2, 35, 0, 1.2, 1.3, 1, 1, 20, 0, 0, 1, 2000, 2000, 1, 1, 1, 0, 0, 0, 0, 1, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 135266416, \"hunter_pet_bot\", -1),\n+(70529, 0, 0, 0, 0, 0, \"Crocolisk\", \"NULL\", \"\", 0, 80, 80, 2, 35, 0, 1.2, 1.3, 1, 1, 20, 0, 0, 1, 2000, 2000, 1, 1, 1, 0, 0, 0, 0, 1, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 135266416, \"hunter_pet_bot\", -1),\n+(70530, 0, 0, 0, 0, 0, \"Warp Stalker\", \"NULL\", \"\", 0, 80, 80, 2, 35, 0, 1.2, 1.3, 1, 1, 20, 0, 0, 1, 2000, 2000, 1, 1, 1, 0, 0, 0, 0, 1, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 135266416, \"hunter_pet_bot\", -1),\n+(70531, 0, 0, 0, 0, 0, \"Silithid\", \"NULL\", \"\", 0, 80, 80, 2, 35, 0, 1.2, 1.3, 1, 1, 20, 0, 0, 1, 2000, 2000, 1, 1, 1, 0, 0, 0, 0, 1, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 135266416, \"hunter_pet_bot\", -1),\n+(70532, 0, 0, 0, 0, 0, \"Chimaera\", \"NULL\", \"\", 0, 80, 80, 2, 35, 0, 1.2, 1.3, 1, 1, 20, 0, 0, 1, 2000, 2000, 1, 1, 1, 0, 0, 0, 0, 1, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 135266416, \"hunter_pet_bot\", -1),\n+(70533, 0, 0, 0, 0, 0, \"Spirit Beast\", \"NULL\", \"\", 0, 80, 80, 2, 35, 0, 1.2, 1.3, 1, 1, 20, 0, 0, 1, 2000, 2000, 1, 1, 1, 0, 0, 0, 0, 1, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 135266416, \"hunter_pet_bot\", -1),\n+(70534, 0, 0, 0, 0, 0, \"Core Hound\", \"NULL\", \"\", 0, 80, 80, 2, 35, 0, 1.2, 1.3, 1, 1, 20, 0, 0, 1, 2000, 2000, 1, 1, 1, 0, 0, 0, 0, 1, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 135266416, \"hunter_pet_bot\", -1),\n+(70535, 0, 0, 0, 0, 0, \"Devilsaur\", \"NULL\", \"\", 0, 80, 80, 2, 35, 0, 1.2, 1.3, 1, 1, 20, 0, 0, 1, 2000, 2000, 1, 1, 1, 0, 0, 0, 0, 1, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 135266416, \"hunter_pet_bot\", -1),\n+(70536, 0, 0, 0, 0, 0, \"Rhino\", \"NULL\", \"\", 0, 80, 80, 2, 35, 0, 1.2, 1.3, 1, 1, 20, 0, 0, 1, 2000, 2000, 1, 1, 1, 0, 0, 0, 0, 1, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 135266416, \"hunter_pet_bot\", -1),\n+(70537, 0, 0, 0, 0, 0, \"Worm\", \"NULL\", \"\", 0, 80, 80, 2, 35, 0, 1.2, 1.3, 1, 1, 20, 0, 0, 1, 2000, 2000, 1, 1, 1, 0, 0, 0, 0, 1, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 135266416, \"hunter_pet_bot\", -1),\n+(70538, 0, 0, 0, 0, 0, \"Risen Ghoul\", \"NULL\", \"\", 0, 80, 80, 2, 35, 0, 1.2, 1.3, 1, 1, 20, 0, 0, 1, 2000, 2000, 1, 1, 8, 0, 0, 0, 0, 6, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 135266416, \"deathknight_pet_bot\", -1),\n+(70542, 0, 0, 0, 0, 0, \"Shadowfiend\", \"NULL\", \"\", 0, 80, 80, 2, 35, 0, 1.2, 1.3, 1, 1, 20, 0, 5, 1, 1500, 1500, 1, 1, 2, 0, 0, 0, 0, 10, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 135266416, \"priest_pet_bot\", -1),\n+(70543, 0, 0, 0, 0, 0, \"Spirit Wolf\", \"NULL\", \"\", 0, 80, 80, 2, 35, 0, 1.2, 1.3, 1, 1, 20, 0, 0, 1, 1500, 1500, 1, 1, 1, 0, 0, 0, 0, 1, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 135266416, \"shaman_pet_bot\", -1),\n+(70544, 0, 0, 0, 0, 0, \"Water Elemental\", \"NULL\", \"\", 0, 80, 80, 2, 35, 0, 1.2, 1.3, 1, 1, 20, 0, 0, 1, 2000, 2000, 1, 1, 8, 0, 0, 0, 0, 4, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 135266416, \"mage_pet_bot\", -1),\n+(70545, 0, 0, 0, 0, 0, \"Treant\", \"NULL\", \"\", 0, 80, 80, 2, 35, 0, 1.2, 1.3, 1, 1, 20, 0, 0, 1, 2000, 2000, 1, 1, 1, 0, 0, 0, 0, 4, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 135266416, \"druid_pet_bot\", -1),\n+(70551, 0, 0, 0, 0, 0, \"Gorkramato\", \"Blademaster Bot\", \"\", 0, 81, 81, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 4, 0, 1, 1940, 1940, 1, 1, 1, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157560, \"blademaster_bot\", -1),\n+(70552, 0, 0, 0, 0, 0, \"Mirror Image (Blademaster)\", \"Blademaster bot\", \"\", 0, 81, 81, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 4, 0, 1, 1940, 1940, 1, 1, 1, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157560, \"blademaster_bot\", -1),\n+(70553, 0, 0, 0, 0, 0, \"Osis\", \"Obsidian Destroyer Bot\", \"\", 0, 83, 83, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 2, 0, 1, 1350, 1350, 1, 1, 9, 0, 32, 0, 0, 10, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"sphynx_bot\", -1),\n+(70554, 0, 0, 0, 0, 0, \"Amot\", \"Obsidian Destroyer Bot\", \"\", 0, 83, 83, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 2, 0, 1, 1350, 1350, 1, 1, 9, 0, 32, 0, 0, 10, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"sphynx_bot\", -1),\n+(70555, 0, 0, 0, 0, 0, \"Detrae\", \"Archmage Bot\", \"\", 0, 81, 81, 2, 35, 1, 1.1, 2.1, 1, 1, 20, 4, 0, 1, 1420, 1420, 1, 1, 8, 0, 32, 0, 0, 7, 6144, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"archmage_bot\", -1),\n+(70556, 0, 0, 0, 0, 0, \"Water Elemental\", \"NULL\", \"\", 0, 81, 81, 2, 35, 0, 1.2, 1.3, 1, 1, 20, 0, 0, 1, 1500, 1500, 1, 1, 1, 0, 0, 0, 0, 4, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 135266416, \"archmage_pet_bot\", -1),\n+(70557, 0, 0, 0, 0, 0, \"Neroth\", \"Dreadlord Bot\", \"\", 0, 83, 83, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 2, 0, 1, 2600, 2600, 1, 1, 9, 0, 32, 0, 0, 3, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"dreadlord_bot\", -1),\n+(70558, 0, 0, 0, 0, 0, \"Fearoth\", \"Dreadlord Bot\", \"\", 0, 83, 83, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 2, 0, 1, 2600, 2600, 1, 1, 9, 0, 32, 0, 0, 3, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"dreadlord_bot\", -1),\n+(70559, 0, 0, 0, 0, 0, \"Zalamon\", \"Dreadlord Bot\", \"\", 0, 83, 83, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 2, 0, 1, 2600, 2600, 1, 1, 9, 0, 32, 0, 0, 3, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"dreadlord_bot\", -1),\n+(70560, 0, 0, 0, 0, 0, \"Lotthicus\", \"Dreadlord Bot\", \"\", 0, 83, 83, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 2, 0, 1, 2600, 2600, 1, 1, 9, 0, 32, 0, 0, 3, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"dreadlord_bot\", -1),\n+(70561, 0, 0, 0, 0, 0, \"Ramarot\", \"Dreadlord Bot\", \"\", 0, 83, 83, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 2, 0, 1, 2600, 2600, 1, 1, 9, 0, 32, 0, 0, 3, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"dreadlord_bot\", -1),\n+(70562, 0, 0, 0, 0, 0, \"Infernal\", \"NULL\", \"\", 0, 83, 83, 2, 35, 0, 1.2, 1.3, 1, 1, 20, 0, 2, 1, 1350, 1350, 1, 1, 1, 0, 0, 0, 0, 3, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 135266416, \"dreadlord_pet_bot\", -1),\n+(70563, 0, 0, 0, 0, 0, \"Eanor\", \"Spell Breaker Bot\", \"\", 0, 81, 81, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 4, 0, 1, 1900, 1900, 1, 1, 2, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"spellbreaker_bot\", -1),\n+(70564, 0, 0, 0, 0, 0, \"Narsen\", \"Spell Breaker Bot\", \"\", 0, 81, 81, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 4, 0, 1, 1900, 1900, 1, 1, 2, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"spellbreaker_bot\", -1),\n+(70565, 0, 0, 0, 0, 0, \"Caelnor\", \"Spell Breaker Bot\", \"\", 0, 81, 81, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 4, 0, 1, 1900, 1900, 1, 1, 2, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"spellbreaker_bot\", -1),\n+(70566, 0, 0, 0, 0, 0, \"Daenste\", \"Spell Breaker Bot\", \"\", 0, 81, 81, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 4, 0, 1, 1900, 1900, 1, 1, 2, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"spellbreaker_bot\", -1),\n+(70567, 0, 0, 0, 0, 0, \"Neshdar\", \"Spell Breaker Bot\", \"\", 0, 81, 81, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 4, 0, 1, 1900, 1900, 1, 1, 2, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"spellbreaker_bot\", -1),\n+(70568, 0, 0, 0, 0, 0, \"Mara\", \"Dark Ranger Bot\", \"\", 0, 82, 82, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 2, 0, 1, 2000, 2000, 1, 1, 6, 0, 32, 0, 0, 6, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"dark_ranger_bot\", -1),\n+(70569, 0, 0, 0, 0, 0, \"Tani\", \"Dark Ranger Bot\", \"\", 0, 82, 82, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 2, 0, 1, 2000, 2000, 1, 1, 6, 0, 32, 0, 0, 6, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"dark_ranger_bot\", -1),\n+(70570, 0, 0, 0, 0, 0, \"Eva\", \"Dark Ranger Bot\", \"\", 0, 82, 82, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 2, 0, 1, 2000, 2000, 1, 1, 6, 0, 32, 0, 0, 6, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"dark_ranger_bot\", -1),\n+(70571, 0, 0, 0, 0, 0, \"Darise\", \"Dark Ranger Bot\", \"\", 0, 82, 82, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 2, 0, 1, 2000, 2000, 1, 1, 6, 0, 32, 0, 0, 6, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"dark_ranger_bot\", -1),\n+(70572, 0, 0, 0, 0, 0, \"Lyra\", \"Dark Ranger Bot\", \"\", 0, 82, 82, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 2, 0, 1, 2000, 2000, 1, 1, 6, 0, 32, 0, 0, 6, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"dark_ranger_bot\", -1),\n+(70573, 0, 0, 0, 0, 0, \"Dark Minion\", \"NULL\", \"\", 0, 83, 83, 2, 35, 0, 1.2, 1.3, 1, 1, 20, 0, 0, 1, 2000, 2000, 1, 1, 1, 0, 0, 0, 0, 6, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 135266400, \"dark_ranger_pet_bot\", -1),\n+(70574, 0, 0, 0, 0, 0, \"Dark Minion\", \"NULL\", \"\", 0, 83, 83, 2, 35, 0, 1.2, 1.3, 1, 1, 20, 1, 0, 1, 2000, 2000, 1, 1, 1, 0, 0, 0, 0, 6, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 135266400, \"dark_ranger_pet_bot\", -1),\n+(70575, 0, 0, 0, 0, 0, \"Prakar\", \"Necromancer Bot\", \"\", 0, 82, 82, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 1, 0, 1, 1800, 1800, 1, 1, 9, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"necromancer_bot\", -1),\n+(70576, 0, 0, 0, 0, 0, \"Rothik\", \"Necromancer Bot\", \"\", 0, 82, 82, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 1, 0, 1, 1800, 1800, 1, 1, 9, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"necromancer_bot\", -1),\n+(70577, 0, 0, 0, 0, 0, \"Hexir\", \"Necromancer Bot\", \"\", 0, 82, 82, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 1, 0, 1, 1800, 1800, 1, 1, 9, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"necromancer_bot\", -1),\n+(70578, 0, 0, 0, 0, 0, \"Fikhar\", \"Necromancer Bot\", \"\", 0, 82, 82, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 1, 0, 1, 1800, 1800, 1, 1, 9, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"necromancer_bot\", -1),\n+(70579, 0, 0, 0, 0, 0, \"Drothum\", \"Necromancer Bot\", \"\", 0, 82, 82, 2, 35, 1, 1.1, 1.1, 1, 1, 20, 1, 0, 1, 1800, 1800, 1, 1, 9, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"necromancer_bot\", -1),\n+(70580, 0, 0, 0, 0, 0, \"Skeleton\", \"NULL\", \"\", 0, 82, 82, 2, 35, 0, 1.2, 1.3, 1, 1, 20, 0, 0, 1, 2000, 2000, 1, 1, 1, 0, 0, 0, 0, 6, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 135266400, \"necromancer_pet_bot\", -1),\n+(70581, 0, 0, 0, 0, 0, \"Kondra\", \"Sea Witch Bot\", \"\", 0, 83, 83, 2, 35, 1, 1.05, 1.05, 1, 1, 20, 2, 0, 1, 1900, 1900, 1, 1, 8, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"sea_witch_bot\", -1),\n+(70582, 0, 0, 0, 0, 0, \"Serpentra\", \"Sea Witch Bot\", \"\", 0, 83, 83, 2, 35, 1, 1.05, 1.05, 1, 1, 20, 2, 0, 1, 1900, 1900, 1, 1, 8, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"sea_witch_bot\", -1),\n+(70583, 0, 0, 0, 0, 0, \"Serena\", \"Sea Witch Bot\", \"\", 0, 83, 83, 2, 35, 1, 1.05, 1.05, 1, 1, 20, 2, 0, 1, 1900, 1900, 1, 1, 8, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"sea_witch_bot\", -1),\n+(70584, 0, 0, 0, 0, 0, \"Asprah\", \"Sea Witch Bot\", \"\", 0, 83, 83, 2, 35, 1, 1.05, 1.05, 1, 1, 20, 2, 0, 1, 1900, 1900, 1, 1, 8, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"sea_witch_bot\", -1),\n+(70585, 0, 0, 0, 0, 0, \"Charib'dishal\", \"Sea Witch Bot\", \"\", 0, 83, 83, 2, 35, 1, 1.05, 1.05, 1, 1, 20, 2, 0, 1, 1900, 1900, 1, 1, 8, 0, 32, 0, 0, 7, 4096, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 68157552, \"sea_witch_bot\", -1),\n+(70586, 0, 0, 0, 0, 0, \"Tornado\", \"\", \"\", 0, 83, 83, 2, 35, 0, 0.9, 0.9, 1, 1, 20, 1, 0, 1, 2000, 2000, 1, 1, 1, 33554432, 32768, 0, 0, 4, 33554432, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 1, 1, 1, 1, 0, 0, 0, 671096832, \"sea_witch_pet_bot\", -1);\ndiff --git a/data/sql/custom/db_world/0000-00-00_npcbot_02_creature_equip_template.sql b/data/sql/custom/db_world/0000-00-00_npcbot_02_creature_equip_template.sql\nnew file mode 100644\nindex 0000000000..f46a5963d0\n--- /dev/null\n+++ b/data/sql/custom/db_world/0000-00-00_npcbot_02_creature_equip_template.sql\n@@ -0,0 +1,322 @@\n+--\n+SET @BOT_START = 70000;\n+SET @BOT_END   = 70585;\n+\n+DELETE FROM `creature_equip_template` WHERE `CreatureID` BETWEEN @BOT_START AND @BOT_END AND `CreatureID` != 70100;\n+\n+INSERT INTO `creature_equip_template` (`CreatureID`,`ID`,`ItemID1`,`ItemID2`,`ItemID3`,`VerifiedBuild`) VALUES\n+(70001, 1, 2497, 0, 0, -1),\n+(70002, 1, 2483, 0, 0, -1),\n+(70003, 1, 2497, 0, 0, -1),\n+(70004, 1, 2483, 0, 0, -1),\n+(70005, 1, 2483, 0, 0, -1),\n+(70006, 1, 2483, 0, 0, -1),\n+(70007, 1, 2483, 0, 0, -1),\n+(70008, 1, 2497, 0, 0, -1),\n+(70009, 1, 2497, 0, 0, -1),\n+(70010, 1, 2361, 0, 0, -1),\n+(70011, 1, 2361, 0, 0, -1),\n+(70012, 1, 2361, 0, 0, -1),\n+(70013, 1, 2361, 0, 0, -1),\n+(70014, 1, 2361, 0, 0, -1),\n+(70015, 1, 2483, 0, 0, -1),\n+(70016, 1, 2483, 0, 0, -1),\n+(70017, 1, 2483, 0, 0, -1),\n+(70018, 1, 2483, 0, 0, -1),\n+(70019, 1, 2497, 0, 0, -1),\n+(70020, 1, 2497, 0, 0, -1),\n+(70021, 1, 2497, 0, 0, -1),\n+(70022, 1, 2497, 0, 0, -1),\n+(70023, 1, 2497, 0, 0, -1),\n+(70024, 1, 2497, 0, 0, -1),\n+(70025, 1, 2497, 0, 0, -1),\n+(70026, 1, 2497, 0, 0, -1),\n+(70027, 1, 2483, 0, 0, -1),\n+(70028, 1, 2497, 0, 0, -1),\n+(70029, 1, 2497, 0, 0, -1),\n+(70030, 1, 2497, 0, 0, -1),\n+(70031, 1, 2497, 0, 0, -1),\n+(70032, 1, 2497, 0, 0, -1),\n+(70033, 1, 2497, 0, 0, -1),\n+(70034, 1, 2497, 0, 0, -1),\n+(70035, 1, 2497, 0, 0, -1),\n+(70036, 1, 2497, 0, 0, -1),\n+(70037, 1, 2497, 0, 0, -1),\n+(70038, 1, 2497, 0, 0, -1),\n+(70051, 1, 2488, 7188, 0, -1),\n+(70052, 1, 2488, 7188, 0, -1),\n+(70053, 1, 2488, 7188, 0, -1),\n+(70054, 1, 2488, 7188, 0, -1),\n+(70055, 1, 2488, 7188, 0, -1),\n+(70056, 1, 2488, 7188, 0, -1),\n+(70057, 1, 2488, 7188, 0, -1),\n+(70058, 1, 2488, 7188, 0, -1),\n+(70059, 1, 2488, 7188, 0, -1),\n+(70060, 1, 2488, 7188, 0, -1),\n+(70061, 1, 2488, 7188, 0, -1),\n+(70062, 1, 2488, 20841, 0, -1),\n+(70063, 1, 2488, 20841, 0, -1),\n+(70064, 1, 2488, 7188, 0, -1),\n+(70065, 1, 2488, 20841, 0, -1),\n+(70066, 1, 2488, 20841, 0, -1),\n+(70067, 1, 2488, 20841, 0, -1),\n+(70068, 1, 2488, 7188, 0, -1),\n+(70069, 1, 2488, 7188, 0, -1),\n+(70070, 1, 2488, 7188, 0, -1),\n+(70071, 1, 2488, 7188, 0, -1),\n+(70072, 1, 2488, 20841, 0, -1),\n+(70073, 1, 2488, 20841, 0, -1),\n+(70074, 1, 2488, 7188, 0, -1),\n+(70101, 1, 12282, 0, 2506, -1),\n+(70102, 1, 12282, 0, 2506, -1),\n+(70103, 1, 12282, 0, 2506, -1),\n+(70104, 1, 12282, 0, 2506, -1),\n+(70105, 1, 12282, 0, 2506, -1),\n+(70106, 1, 12282, 0, 2506, -1),\n+(70107, 1, 12282, 0, 2506, -1),\n+(70108, 1, 12282, 0, 2506, -1),\n+(70109, 1, 12282, 0, 2506, -1),\n+(70110, 1, 12282, 0, 2506, -1),\n+(70111, 1, 12282, 0, 2506, -1),\n+(70112, 1, 12282, 0, 2506, -1),\n+(70113, 1, 12282, 0, 2506, -1),\n+(70114, 1, 12282, 0, 2506, -1),\n+(70115, 1, 12282, 0, 2506, -1),\n+(70116, 1, 12282, 0, 2506, -1),\n+(70117, 1, 12282, 0, 2506, -1),\n+(70118, 1, 12282, 0, 2506, -1),\n+(70119, 1, 12282, 0, 2506, -1),\n+(70120, 1, 12282, 0, 2506, -1),\n+(70121, 1, 12282, 0, 2506, -1),\n+(70122, 1, 12282, 0, 2506, -1),\n+(70123, 1, 12282, 0, 2506, -1),\n+(70124, 1, 12282, 0, 2506, -1),\n+(70125, 1, 12282, 0, 2506, -1),\n+(70126, 1, 12282, 0, 2506, -1),\n+(70127, 1, 12282, 0, 2506, -1),\n+(70128, 1, 12282, 0, 2506, -1),\n+(70129, 1, 12282, 0, 2506, -1),\n+(70130, 1, 12282, 0, 2506, -1),\n+(70131, 1, 12282, 0, 2506, -1),\n+(70132, 1, 12282, 0, 2506, -1),\n+(70133, 1, 12282, 0, 2506, -1),\n+(70134, 1, 12282, 0, 2506, -1),\n+(70135, 1, 12282, 0, 2506, -1),\n+(70136, 1, 12282, 0, 2506, -1),\n+(70137, 1, 12282, 0, 2506, -1),\n+(70138, 1, 12282, 0, 2506, -1),\n+(70139, 1, 12282, 0, 2506, -1),\n+(70151, 1, 2092, 3296, 25873, -1),\n+(70152, 1, 2131, 2484, 25873, -1),\n+(70153, 1, 2092, 3296, 25873, -1),\n+(70154, 1, 2131, 2484, 25873, -1),\n+(70155, 1, 2092, 3296, 25873, -1),\n+(70156, 1, 2131, 2484, 25873, -1),\n+(70157, 1, 2092, 3296, 25873, -1),\n+(70158, 1, 2131, 2484, 25873, -1),\n+(70159, 1, 2092, 3296, 25873, -1),\n+(70160, 1, 2131, 2484, 25873, -1),\n+(70161, 1, 2092, 3296, 25873, -1),\n+(70162, 1, 2131, 2484, 25873, -1),\n+(70163, 1, 2092, 3296, 25873, -1),\n+(70164, 1, 2131, 2484, 25873, -1),\n+(70165, 1, 2092, 3296, 25873, -1),\n+(70166, 1, 2131, 2484, 25873, -1),\n+(70167, 1, 2092, 3296, 25873, -1),\n+(70168, 1, 2131, 2484, 25873, -1),\n+(70169, 1, 2092, 3296, 25873, -1),\n+(70170, 1, 2131, 2484, 25873, -1),\n+(70171, 1, 2092, 3296, 25873, -1),\n+(70172, 1, 2131, 2484, 25873, -1),\n+(70173, 1, 2092, 3296, 25873, -1),\n+(70174, 1, 2131, 2484, 25873, -1),\n+(70175, 1, 2092, 3296, 25873, -1),\n+(70176, 1, 2131, 2484, 25873, -1),\n+(70177, 1, 2092, 3296, 25873, -1),\n+(70178, 1, 2131, 2484, 25873, -1),\n+(70179, 1, 2092, 3296, 25873, -1),\n+(70180, 1, 2131, 2484, 25873, -1),\n+(70181, 1, 2092, 3296, 25873, -1),\n+(70201, 1, 1388, 0, 0, -1),\n+(70202, 1, 1388, 0, 0, -1),\n+(70203, 1, 1388, 0, 0, -1),\n+(70204, 1, 1388, 0, 0, -1),\n+(70205, 1, 1388, 0, 0, -1),\n+(70206, 1, 1388, 0, 0, -1),\n+(70207, 1, 1388, 0, 0, -1),\n+(70208, 1, 1388, 0, 0, -1),\n+(70209, 1, 1388, 0, 0, -1),\n+(70210, 1, 1388, 0, 0, -1),\n+(70211, 1, 1388, 0, 0, -1),\n+(70212, 1, 1388, 0, 0, -1),\n+(70213, 1, 1388, 0, 0, -1),\n+(70214, 1, 1388, 0, 0, -1),\n+(70215, 1, 1388, 0, 0, -1),\n+(70216, 1, 1388, 0, 0, -1),\n+(70217, 1, 1388, 0, 0, -1),\n+(70218, 1, 1388, 0, 0, -1),\n+(70219, 1, 1388, 0, 0, -1),\n+(70220, 1, 1388, 0, 0, -1),\n+(70221, 1, 1388, 0, 0, -1),\n+(70222, 1, 1388, 0, 0, -1),\n+(70223, 1, 1388, 0, 0, -1),\n+(70224, 1, 1388, 0, 0, -1),\n+(70225, 1, 1388, 0, 0, -1),\n+(70226, 1, 1388, 0, 0, -1),\n+(70227, 1, 1388, 0, 0, -1),\n+(70228, 1, 1388, 0, 0, -1),\n+(70229, 1, 1388, 0, 0, -1),\n+(70230, 1, 1388, 0, 0, -1),\n+(70231, 1, 1388, 0, 0, -1),\n+(70232, 1, 1388, 0, 0, -1),\n+(70233, 1, 1388, 0, 0, -1),\n+(70234, 1, 1388, 0, 0, -1),\n+(70235, 1, 1388, 0, 0, -1),\n+(70236, 1, 1388, 0, 0, -1),\n+(70237, 1, 1388, 0, 0, -1),\n+(70238, 1, 1388, 0, 0, -1),\n+(70239, 1, 1388, 0, 0, -1),\n+(70240, 1, 1388, 0, 0, -1),\n+(70251, 1, 15903, 0, 0, -1),\n+(70252, 1, 15903, 0, 0, -1),\n+(70253, 1, 15903, 0, 0, -1),\n+(70254, 1, 15903, 0, 0, -1),\n+(70255, 1, 15903, 0, 0, -1),\n+(70256, 1, 15903, 0, 0, -1),\n+(70257, 1, 15903, 0, 0, -1),\n+(70258, 1, 15903, 0, 0, -1),\n+(70259, 1, 15903, 0, 0, -1),\n+(70260, 1, 15903, 0, 0, -1),\n+(70261, 1, 15903, 0, 0, -1),\n+(70265, 1, 15903, 0, 0, -1),\n+(70267, 1, 15903, 0, 0, -1),\n+(70268, 1, 15903, 0, 0, -1),\n+(70301, 1, 2132, 0, 0, -1),\n+(70302, 1, 2132, 0, 0, -1),\n+(70303, 1, 2132, 0, 0, -1),\n+(70304, 1, 2132, 0, 0, -1),\n+(70305, 1, 2132, 0, 0, -1),\n+(70306, 1, 2132, 0, 0, -1),\n+(70307, 1, 2132, 0, 0, -1),\n+(70308, 1, 2132, 0, 0, -1),\n+(70309, 1, 2132, 0, 0, -1),\n+(70310, 1, 2132, 0, 0, -1),\n+(70311, 1, 2132, 0, 0, -1),\n+(70312, 1, 2132, 0, 0, -1),\n+(70313, 1, 2132, 0, 0, -1),\n+(70314, 1, 2132, 0, 0, -1),\n+(70315, 1, 2132, 0, 0, -1),\n+(70316, 1, 2132, 0, 0, -1),\n+(70317, 1, 2132, 0, 0, -1),\n+(70318, 1, 2132, 0, 0, -1),\n+(70319, 1, 2132, 0, 0, -1),\n+(70320, 1, 2132, 0, 0, -1),\n+(70321, 1, 2132, 0, 0, -1),\n+(70322, 1, 2132, 0, 0, -1),\n+(70323, 1, 2132, 0, 0, -1),\n+(70324, 1, 2132, 0, 0, -1),\n+(70325, 1, 2132, 0, 0, -1),\n+(70326, 1, 2132, 0, 0, -1),\n+(70327, 1, 2132, 0, 0, -1),\n+(70328, 1, 2132, 0, 0, -1),\n+(70329, 1, 2132, 0, 0, -1),\n+(70330, 1, 2132, 0, 0, -1),\n+(70331, 1, 2132, 0, 0, -1),\n+(70332, 1, 2132, 0, 0, -1),\n+(70333, 1, 2132, 0, 0, -1),\n+(70334, 1, 2132, 0, 0, -1),\n+(70335, 1, 2132, 0, 0, -1),\n+(70336, 1, 2132, 0, 0, -1),\n+(70351, 1, 3661, 0, 0, -1),\n+(70352, 1, 3661, 0, 0, -1),\n+(70353, 1, 3661, 0, 0, -1),\n+(70354, 1, 3661, 0, 0, -1),\n+(70355, 1, 3661, 0, 0, -1),\n+(70356, 1, 3661, 0, 0, -1),\n+(70357, 1, 3661, 0, 0, -1),\n+(70358, 1, 3661, 0, 0, -1),\n+(70359, 1, 3661, 0, 0, -1),\n+(70360, 1, 3661, 0, 0, -1),\n+(70361, 1, 3661, 0, 0, -1),\n+(70362, 1, 3661, 0, 0, -1),\n+(70363, 1, 3661, 0, 0, -1),\n+(70364, 1, 3661, 0, 0, -1),\n+(70365, 1, 3661, 0, 0, -1),\n+(70366, 1, 3661, 0, 0, -1),\n+(70367, 1, 3661, 0, 0, -1),\n+(70368, 1, 3661, 0, 0, -1),\n+(70369, 1, 3661, 0, 0, -1),\n+(70370, 1, 3661, 0, 0, -1),\n+(70371, 1, 3661, 0, 0, -1),\n+(70372, 1, 3661, 0, 0, -1),\n+(70373, 1, 3661, 0, 0, -1),\n+(70374, 1, 3661, 0, 0, -1),\n+(70375, 1, 3661, 0, 0, -1),\n+(70376, 1, 3661, 0, 0, -1),\n+(70377, 1, 3661, 0, 0, -1),\n+(70401, 1, 3327, 0, 0, -1),\n+(70402, 1, 3327, 0, 0, -1),\n+(70403, 1, 3327, 0, 0, -1),\n+(70404, 1, 3327, 0, 0, -1),\n+(70405, 1, 3327, 0, 0, -1),\n+(70406, 1, 3327, 0, 0, -1),\n+(70407, 1, 3327, 0, 0, -1),\n+(70408, 1, 3327, 0, 0, -1),\n+(70409, 1, 3327, 0, 0, -1),\n+(70410, 1, 3327, 0, 0, -1),\n+(70411, 1, 3327, 0, 0, -1),\n+(70412, 1, 3327, 0, 0, -1),\n+(70413, 1, 3327, 0, 0, -1),\n+(70414, 1, 3327, 0, 0, -1),\n+(70415, 1, 3327, 0, 0, -1),\n+(70416, 1, 3327, 0, 0, -1),\n+(70417, 1, 3327, 0, 0, -1),\n+(70418, 1, 3327, 0, 0, -1),\n+(70451, 1, 38633, 0, 0, -1),\n+(70452, 1, 38633, 0, 0, -1),\n+(70453, 1, 38633, 0, 0, -1),\n+(70454, 1, 38633, 0, 0, -1),\n+(70455, 1, 38633, 0, 0, -1),\n+(70456, 1, 38633, 0, 0, -1),\n+(70457, 1, 38633, 0, 0, -1),\n+(70458, 1, 38633, 0, 0, -1),\n+(70459, 1, 38633, 0, 0, -1),\n+(70460, 1, 38633, 0, 0, -1),\n+(70461, 1, 38633, 0, 0, -1),\n+(70462, 1, 38633, 0, 0, -1),\n+(70463, 1, 38633, 0, 0, -1),\n+(70464, 1, 38633, 0, 0, -1),\n+(70465, 1, 38633, 0, 0, -1),\n+(70551, 1, 24044, 0, 0, -1),\n+(70552, 1, 24044, 0, 0, -1),\n+(70553, 1, 5208, 5208, 0, -1),\n+(70554, 1, 5208, 5208, 0, -1),\n+(70555, 1, 25917, 0, 0, -1),\n+(70557, 1, 0, 0, 0, -1),\n+(70558, 1, 0, 0, 0, -1),\n+(70559, 1, 0, 0, 0, -1),\n+(70560, 1, 0, 0, 0, -1),\n+(70561, 1, 0, 0, 0, -1),\n+(70563, 1, 0, 0, 0, -1),\n+(70564, 1, 0, 0, 0, -1),\n+(70565, 1, 0, 0, 0, -1),\n+(70566, 1, 0, 0, 0, -1),\n+(70567, 1, 0, 0, 0, -1),\n+(70568, 1, 20849, 0, 34529, -1),\n+(70569, 1, 20849, 0, 34529, -1),\n+(70570, 1, 20849, 0, 34529, -1),\n+(70571, 1, 20849, 0, 34529, -1),\n+(70572, 1, 20849, 0, 34529, -1),\n+(70573, 1, 3935, 15648, 0, -1),\n+(70574, 1, 3935, 15648, 0, -1),\n+(70575, 1, 13937, 0, 0, -1),\n+(70576, 1, 13937, 0, 0, -1),\n+(70577, 1, 13937, 0, 0, -1),\n+(70578, 1, 13937, 0, 0, -1),\n+(70579, 1, 13937, 0, 0, -1),\n+(70580, 1, 3935, 15648, 0, -1),\n+(70581, 1, 20852, 20852, 17069, -1),\n+(70582, 1, 20852, 20852, 17069, -1),\n+(70583, 1, 20852, 20852, 17069, -1),\n+(70584, 1, 20852, 20852, 17069, -1),\n+(70585, 1, 20852, 20852, 17069, -1);\ndiff --git a/data/sql/custom/db_world/0000-00-00_npcbot_03_npc_text.sql b/data/sql/custom/db_world/0000-00-00_npcbot_03_npc_text.sql\nnew file mode 100644\nindex 0000000000..17ac1ac0e5\n--- /dev/null\n+++ b/data/sql/custom/db_world/0000-00-00_npcbot_03_npc_text.sql\n@@ -0,0 +1,389 @@\n+--\n+SET @BOT_START = 70000;\n+SET @BOT_END   = 70658;\n+\n+DELETE FROM `npc_text` WHERE `ID` BETWEEN @BOT_START AND @BOT_END AND `ID` != 70100;\n+\n+INSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n+(70001, \"I live only to serve the master.\", -1),\n+(70002, \"You need something?\", -1),\n+(70003, \"Mortals... usually I kill wretches like you at sight.\", -1),\n+(70004, \"<You see what is supposed to be an obsidian destroyer. This one looks different though, damaged and faded, and does not react to your presence. You recall the Scourge have been using their own versions of those at some point in the past. How the hell did it end up here? After further examination you notice an opening on creature's back.>\", -1),\n+(70005, \"<Obsidian Destroyer stares at you and makes a low growling sound.>\", -1),\n+(70006, \"Are you surprised, mortal? As a lesser nathrezim I have to resort to seeking out allies. You look like you could amuse me at least.\", -1),\n+(70007, \"What is it now, mortal?\", -1),\n+(70008, \"Can you just leave me be? <sigh>\", -1),\n+(70009, \"Now what?\", -1),\n+(70010, \"<You see an emaciated naga matron. She looks tired and weak, and avoids looking at you.>$B$BS-s-s-spare the words, mortal...\", -1),\n+(70011, \"Did I mess-s-s-s up my hair again? <She brushes her \"\"hair\"\">$B...No, I didn't. Then what is it?\", -1),\n+(70101, \"|cffff3300Blademaster|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\"\"An elite swordsman, former member of Burning Blade clan, now an elite fighter within the Horde\"\".$B$BMain attribute: Agility.$B$BNetherwalk (Windwalk). Allows Blademaster to become invisible, and move faster for a set amount of time. When the Blademaster attacks a unit to break invisibility, he will deal bonus damage.$B$BMirror Image. Confuses the enemy by creating illusions of the Blademaster and dispelling all magic from the Blademaster.$B$BCritical Strike (passive). Gives a 15% chance to deal critical x2(x3,x4) times normal damage on his attacks.$B$BBladestorm (NIY). Grants immunity to magic and deals damage to all surrounding enemies.$B$B\", -1),\n+(70102, \"|cff9900ccObsidian Destroyer|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\"\"An obsidian winged monstrocity with insatiable hunger for magic\"\".$B$BHigh armor, very high resistances, partially immune to magic, loses mana over time and doesn't benefit from passive mana regeneration effects, mail/plate armor, dual-wielding wands, deals spellshadow damage, no physical attack, cannot attack enemies not in front while moving, spell power bonus: 50% attack power + 200% intellect + wands damage.$B$BDevour Magic. Dispels up to 2 magic effects from enemies, up to 2 magic effects and up to 2 curses from allies and damaging summoned units in 20 yards area. Every dispelled effect restores 20% mana and 5% health, 7 seconds cooldown.$B$BShadow Blast. Empowered attack that deals increased splash damage.$B$BDrain Mana. Drains all mana (limited by caster's mana pool) from a random friendly unit.$B$BReplenish Mana. Energizes surrounding party and raid members within 25 yards for 3% of their maximum mana nullifying caster's mana, 3 seconds cooldown.$B$BRegenerating Aura. Heals surrounding party and raid members within 25 yards for 3% of their maximum health nullifying caster's mana, 3 seconds cooldown.$B$BShadow Armor (passive). Restores mana equal to a percentage of damage taken.$B$B\", -1),\n+(70103, \"|cff0000ddArchmage|r$b|cffdd6600-=Warcraft III tribute=-|r$B$BSpell damage taken reduced by 35%, partially immune to control effects, cloth armor, deals spellsfire/spellfrost damage, no physical attack, spell power bonus: 100% intellect. Main attribute: Intellect.$B$BBlizzard. Your typical blizzard, just a little more powerful, 6 seconds cooldown.$B$BSummon Water Elemental. Summons a water elemental to attack archmage's enemies for 1 min, 20 seconds cooldown.$B$BBrilliance Aura. Increases maximum mana by 10% and greatly increases mana regeneration of party and raid members within 40 yards.$B$BMass Teleport. NIY.$B$B\", -1),\n+(70104, \"|cff9900ccDreadlord|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\"\"Incredibly powerful demon who wields power of darkness and mental domination\"\".$B$BHigh armor, high resistances, partially immune to control effects, damage taken speeds up spells recharge, plate armor, deals melee/spellshadow damage, bonus damage against incapacitated targets, spell power bonus: 200% strength. Main attribute: Strength.$B$BCarrion Swarm. Sends a horde of bats combined with chaotic magic to damage enemies in a very large frontal cone, cannot crit, 10 seconds cooldown.$B$BSleep. Puts the enemy target to sleep for 60 seconds and allows next physical attack on that target to bypass armor, direct damage caused will awaken the target, 6 seconds cooldown.$B$BVampiric Aura. Increases physical critical damage by 5% and heals party and raid members within 40 yards for a percentage (100% for Dreadlord and 25% for everyone else) of damage done by melee physical attacks and Carrion Swarm, no threat.$B$BSummon Infernal Servant. Calls an infernal down from the sky dealing damage and stunning enemy units, infernal is very resistant to magic and lasts 180 seconds, 180 seconds cooldown.$B$B\", -1),\n+(70105, \"|cff0000ddSpell Breaker|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\"\"An elven warrior trained to disrupt and contort magical energies\"\".$B$BSpell damage taken reduced by 75%, partially immune to control effects, armor penalty -30%, mail/plate armor, deals melee/arcane damage, spell power bonus: 200% strength. Main attribute: Strength.$B$BSteal Magic (Spellsteal). Steals a benefical spell from an enemy and applies it to a nearby ally or removes a negative spell from an ally and applies it to a nearby enemy, affects magic and curse effects, 2 seconds cooldown.$B$BFeedback (passive). Successful melee attacks burn target's mana equal to damage caused (increased by spellpower) dealing arcane damage. If target's mana is depleted, Spell Breaker's melee attacks will do triple damage with increased critical strike chance. If target does not have mana, Spell Breaker will gain mana equal to 25% of damage dealt.$B$B\", -1),\n+(70106, \"|cff9900ccDark Ranger|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\"\"A former ranger of Quel'thalas forcibly raised from the dead\"\".$B$BSpell damage taken reduced by 35%, undead, partially immune to control effects, leather/cloth armor, deals physical/spellshadow damage, stick to shadows and generates no threat, spell power bonus: 50% intellect. Main attribute: Agility.$B$BSilence. Silences an enemy and up to 4 nearby targets for 8 seconds, 15 seconds cooldown.$B$BBlack Arrow. Fires a cursed arrow dealing 150% weapon damage and additional spellshadow damage over time. If affected target dies from Dark Ranger's damage, Dark Minion will spawn from the corpse (maximum 5 Minions, 80 seconds duration, only works on humanoids, beasts and dragonkin). Deals five times more damage if target is under 20% health.$B$BDrain Life. Drains health from an enemy every second for 5 seconds, healing Dark Ranger for 200% of the drained amount.$B$B\", -1),\n+(70107, \"|cff9900ccNecromancer|r$b|cffdd6600-=Warcraft III / Diablo II tribute=-|r$B$BSpell damage taken reduced by 20%, partially immune to control effects, cloth armor, deals spellshadow damage, no physical attack, spell power bonus: 100% intellect. Main attribute: Intellect.$B$BRaise Dead. Raises 2 Skeletons from a corpse (maximum 6 Skeletons, 65 seconds duration, only works on humanoids, beasts and dragonkin).$B$BUnholy Frenzy. Increases target's melee attack speed by 75%, but constantly drains health. Lasts 45 seconds. Cannot be cancelled. Unlocked at level 30.$B$BCorpse Explosion. Causes a corpse to explode, dealing damage equal to 35% to 75% of dead unit's maximum health (depends on Necromancer's level) to all surrounding enemies. This damage generates no threat. Unlocked at level 40.$B$BCripple. Reduces target's movement speed, melee attack speed and total strength by 50% for 60 seconds. Unlocked at level 50.$B$B\", -1),\n+(70108, \"|cff0000ddSea Witch|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\"\"A vicious scaly denizen of ocean often associated with the coming of prodigious storms\"\".$B$BSpell damage taken reduced by 30%, partially immune to control effects, cloth armor, deals physical/spellfrost/spellstorm damage, attack power bonus: agility x2, spell power bonus: 200% intellect. Main attribute: Intellect.$B$BForked Lightning. Calls forth a cone of lightning to damage enemies. Hits from 2 to all targets (depending on Sea Witch's level), stunning them for 2 seconds. This damage generates no threat.$B$BFrost Arrows. Imbues arrow with spellfrost for extra damage, slowing target's movement, attack and casting speed by 30% to 70% (depending on Sea Witch's level).$B$BMana Shield. Creates a shield that absorbs 100% incoming (non-mitigated) damage by using Sea Witch's mana. Effect ranges from 1 damage per 10 mana to 10 damage per 1 mana (depending on Sea Witch's level).$B$BTornado. Summons a fierce tornado that damages and slows nearby enemy units, sometimes incapacitating them completely. Tornado grows over time outdoors, increasing damage dealt and area of effect, but shrinks indoors, dissipating quickly. Unlocked at level 60.$B$BNaga (Passive). Swim speed, damage and dodge chance are greatly increased while in water.$B$B\", -1),\n+(70201, \"There are always dudes ready to kill for money.\", -1),\n+(70202, \"Mercenaries are always in demand. Here is what available right now.\", -1),\n+(70203, \"Mercenaries are always in demand. Here is what available right now.\", -1),\n+(70204, \"Seems like there is nobody available right now, check again later.\", -1),\n+(70300, \"Die!\", -1),\n+(70301, \"Rezzing You\", -1),\n+(70302, \"Rezzing \", -1),\n+(70303, \"your bot\", -1),\n+(70304, \"'s bot\", -1),\n+(70305, \"I can't conjure water yet\", -1),\n+(70306, \"I can't conjure food yet\", -1),\n+(70307, \"I can't do it right now\", -1),\n+(70308, \"Here you go...\", -1),\n+(70309, \"Disabled\", -1),\n+(70310, \"Not ready yet\", -1),\n+(70311, \"Invalid object type\", -1),\n+(70312, \"Failed\", -1),\n+(70313, \"Done\", -1),\n+(70314, \"I am not shapeshifted\", -1),\n+(70315, \"I don't have a healthstone\", -1),\n+(70316, \"I can't create healthstones yet!\", -1),\n+(70317, \"WTF I don't have lockpicking!\", -1),\n+(70318, \"My skill level in not high enough\", -1),\n+(70319, \"Changing my spec to \", -1),\n+(70320, \"Arms\", -1),\n+(70321, \"Fury\", -1),\n+(70322, \"Protection\", -1),\n+(70323, \"Retribution\", -1),\n+(70324, \"Beast Mastery\", -1),\n+(70325, \"Marksmanship\", -1),\n+(70326, \"Survival\", -1),\n+(70327, \"Assassination\", -1),\n+(70328, \"Combat\", -1),\n+(70329, \"Subtlety\", -1),\n+(70330, \"Discipline\", -1),\n+(70331, \"Holy\", -1),\n+(70332, \"Shadow\", -1),\n+(70333, \"Blood\", -1),\n+(70334, \"Frost\", -1),\n+(70335, \"Unholy\", -1),\n+(70336, \"Elemental\", -1),\n+(70337, \"Enhancement\", -1),\n+(70338, \"Restoration\", -1),\n+(70339, \"Arcane\", -1),\n+(70340, \"Fire\", -1),\n+(70341, \"Affliction\", -1),\n+(70342, \"Demonology\", -1),\n+(70343, \"Destruction\", -1),\n+(70344, \"Balance\", -1),\n+(70345, \"Feral Combat\", -1),\n+(70346, \"Unknown\", -1),\n+(70347, \"Go away, weakling\", -1),\n+(70348, \" is not convinced\", -1),\n+(70349, \"I am not going to waste my time on just anything\", -1),\n+(70350, \"NIY\", -1),\n+(70351, \"NIY\", -1),\n+(70352, \"NIY\", -1),\n+(70353, \"I am ready\", -1),\n+(70354, \"Go away. I serve my master \", -1),\n+(70355, \"unknown\", -1),\n+(70356, \" on You!\", -1),\n+(70357, \" on myself!\", -1),\n+(70358, \" on \", -1),\n+(70359, \" used!\", -1),\n+(70360, \"bot tank\", -1),\n+(70361, \"class\", -1),\n+(70362, \"player\", -1),\n+(70363, \"master\", -1),\n+(70364, \"none\", -1),\n+(70365, \"Rank\", -1),\n+(70366, \"talent\", -1),\n+(70367, \"passive\", -1),\n+(70368, \"hidden\", -1),\n+(70369, \"known\", -1),\n+(70370, \"ability\", -1),\n+(70371, \"str\", -1),\n+(70372, \"agi\", -1),\n+(70373, \"sta\", -1),\n+(70374, \"int\", -1),\n+(70375, \"spi\", -1),\n+(70376, \"unk stat\", -1),\n+(70377, \"total\", -1),\n+(70378, \"Melee AP\", -1),\n+(70379, \"Ranged AP\", -1),\n+(70380, \"armor\", -1),\n+(70381, \"crit\", -1),\n+(70382, \"defense\", -1),\n+(70383, \"miss\", -1),\n+(70384, \"dodge\", -1),\n+(70385, \"parry\", -1),\n+(70386, \"block\", -1),\n+(70387, \"block value\", -1),\n+(70388, \"Damage taken melee\", -1),\n+(70389, \"Damage taken spell\", -1),\n+(70390, \"Damage range mainhand\", -1),\n+(70391, \"Damage mult mainhand\", -1),\n+(70392, \"Attack time mainhand\", -1),\n+(70393, \"Damage range offhand\", -1),\n+(70394, \"Damage mult offhand\", -1),\n+(70395, \"Attack time offhand\", -1),\n+(70396, \"Damage range ranged\", -1),\n+(70397, \"Damage mult ranged\", -1),\n+(70398, \"Attack time ranged\", -1),\n+(70399, \"min\", -1),\n+(70400, \"max\", -1),\n+(70401, \"DPS\", -1),\n+(70402, \"base hp\", -1),\n+(70403, \"total hp\", -1),\n+(70404, \"base mana\", -1),\n+(70405, \"total mana\", -1),\n+(70406, \"current mana\", -1),\n+(70407, \"spell power\", -1),\n+(70408, \"health regen_5 bonus\", -1),\n+(70409, \"mana regen_5 no cast\", -1),\n+(70410, \"mana regen_5 casting\", -1),\n+(70411, \"haste\", -1),\n+(70412, \"hit\", -1),\n+(70413, \"expertise\", -1),\n+(70414, \"armor penetration\", -1),\n+(70415, \"spell penetration\", -1),\n+(70416, \"pct\", -1),\n+(70417, \"holy\", -1),\n+(70418, \"fire\", -1),\n+(70419, \"nature\", -1),\n+(70420, \"frost\", -1),\n+(70421, \"shadow\", -1),\n+(70422, \"arcane\", -1),\n+(70423, \"Resistance\", -1),\n+(70424, \"Command states\", -1),\n+(70425, \"Follow\", -1),\n+(70426, \"Attack\", -1),\n+(70427, \"Stay\", -1),\n+(70428, \"Reset\", -1),\n+(70429, \"FullStop\", -1),\n+(70430, \"Follow distance\", -1),\n+(70431, \"Spec\", -1),\n+(70432, \"Bot roles mask main\", -1),\n+(70433, \"Bot roles mask gathering\", -1),\n+(70434, \"PvP kills\", -1),\n+(70435, \"players\", -1),\n+(70436, \"Died \", -1),\n+(70437, \" times\", -1),\n+(70438, \"%s (bot) calms down\", -1),\n+(70439, \"<Debug>\", -1),\n+(70440, \"Are you sure you want to risk drawing \", -1),\n+(70441, \"'s attention?\", -1),\n+(70442, \"<Insert Coin>\", -1),\n+(70443, \"Do you want to entice \", -1),\n+(70444, \"<Try to make an offering>\", -1),\n+(70445, \"Do you wish to hire \", -1),\n+(70446, \"<Hire bot>\", -1),\n+(70447, \"Manage equipment...\", -1),\n+(70448, \"Manage roles...\", -1),\n+(70449, \"Manage formation...\", -1),\n+(70450, \"Manage abilities...\", -1),\n+(70451, \"Manage talents...\", -1),\n+(70452, \"Give consumable...\", -1),\n+(70453, \"<Create group>\", -1),\n+(70454, \"<Create group (all bots)>\", -1),\n+(70455, \"<Add to group>\", -1),\n+(70456, \"<Add all bots to group>\", -1),\n+(70457, \"<Remove from group>\", -1),\n+(70458, \"Follow me\", -1),\n+(70459, \"Hold your position\", -1),\n+(70460, \"Stay here and don't do anything\", -1),\n+(70461, \"I need food\", -1),\n+(70462, \"I need water\", -1),\n+(70463, \"I need a refreshment table\", -1),\n+(70464, \"Help me pick a lock\", -1),\n+(70465, \"I need your your healthstone\", -1),\n+(70466, \"I need a soulwell\", -1),\n+(70467, \"I need you to refresh poisons\", -1),\n+(70468, \"<Choose poison (Main Hand)>\", -1),\n+(70469, \"<Choose poison (Offhand)>\", -1),\n+(70470, \"I need you to refresh enchants\", -1),\n+(70471, \"<Choose enchant (Main Hand)>\", -1),\n+(70472, \"<Choose enchant (Offhand)>\", -1),\n+(70473, \"I need you to remove shapeshift\", -1),\n+(70474, \"<Choose pet type>\", -1),\n+(70475, \"You are dismissed\", -1),\n+(70476, \"Are you going to abandon \", -1),\n+(70477, \"You may regret it...\", -1),\n+(70478, \"Pull yourself together, damnit\", -1),\n+(70479, \"<Study the creature>\", -1),\n+(70480, \"Nevermind\", -1),\n+(70481, \"dist\", -1),\n+(70482, \"BACK\", -1),\n+(70483, \"<Auto>\", -1),\n+(70484, \"<None>\", -1),\n+(70485, \"Random (Cunning)\", -1),\n+(70486, \"Random (Ferocity)\", -1),\n+(70487, \"Random (Tenacity)\", -1),\n+(70488, \"Show me your inventory\", -1),\n+(70489, \"Auto-equip\", -1),\n+(70490, \"Main hand\", -1),\n+(70491, \"Off-hand\", -1),\n+(70492, \"Ranged\", -1),\n+(70493, \"Relic\", -1),\n+(70494, \"Head\", -1),\n+(70495, \"Shoulders\", -1),\n+(70496, \"Chest\", -1),\n+(70497, \"Waist\", -1),\n+(70498, \"Legs\", -1),\n+(70499, \"Feet\", -1),\n+(70500, \"Wrist\", -1),\n+(70501, \"Hands\", -1),\n+(70502, \"Back\", -1),\n+(70503, \"Shirt\", -1),\n+(70504, \"Finger1\", -1),\n+(70505, \"Finger2\", -1),\n+(70506, \"Trinket1\", -1),\n+(70507, \"Trinket2\", -1),\n+(70508, \"Neck\", -1),\n+(70509, \"Unequip all\", -1),\n+(70510, \"Update visual\", -1),\n+(70511, \"visual only\", -1),\n+(70512, \"Equipped\", -1),\n+(70513, \"nothing\", -1),\n+(70514, \"Use your old equipment\", -1),\n+(70515, \"Unequip it\", -1),\n+(70516, \"Hm... I have nothing to give you\", -1),\n+(70517, \"Gathering\", -1),\n+(70518, \"Abilities status\", -1),\n+(70519, \"Manage allowed abilities\", -1),\n+(70520, \"Use \", -1),\n+(70521, \"Update\", -1),\n+(70522, \"Damage\", -1),\n+(70523, \"Control\", -1),\n+(70524, \"Heal\", -1),\n+(70525, \"Other\", -1),\n+(70526, \" makes a grinding sound and begins to follow \", -1),\n+(70527, \"%s will not join you until dismissed by the owner\", -1),\n+(70528, \"%s will not join you until you are level 60\", -1),\n+(70529, \"%s will not join you until you are level 55\", -1),\n+(70530, \"%s will not join you until you are level 40\", -1),\n+(70531, \"%s will not join you until you are level 20\", -1),\n+(70532, \"You exceed max npcbots (%u)\", -1),\n+(70533, \"You don't have enough money\", -1),\n+(70534, \"You cannot have more bots of that class! %u of %u\", -1),\n+(70535, \"Cannot reset equipment in slot %u (%s)! Cannot dismiss bot!\", -1),\n+(70536, \"current\", -1),\n+(70537, \"Attack distance\", -1),\n+(70538, \"Short range attacks\", -1),\n+(70539, \"Long range attacks\", -1),\n+(70540, \"Exact\", -1),\n+(70541, \"Remove buff\", -1),\n+(70542, \"Fix your power type\", -1),\n+(70543, \"Cannot unequip %s for some stupid reason! Sending through mail\", -1),\n+(70544, \"Tank\", -1),\n+(70545, \"Ranged\", -1),\n+(70546, \"Miner\", -1),\n+(70547, \"Herbalist\", -1),\n+(70548, \"Skinner\", -1),\n+(70549, \"Engineer\", -1),\n+(70550, \"Bot ownership expired\", -1),\n+(70551, \"NpcBot system is currently disabled. Please contact administration.\", -1),\n+(70552, \"%s will not join you, already has master: %s\", -1),\n+(70553, \"%s cannot join you while about to teleport\", -1),\n+(70554, \"Aspect\", -1),\n+(70555, \"Monkey\", -1),\n+(70556, \"Hawk\", -1),\n+(70557, \"Cheetah\", -1),\n+(70558, \"Viper\", -1),\n+(70559, \"Beast\", -1),\n+(70560, \"Pack\", -1),\n+(70561, \"Wild\", -1),\n+(70562, \"Dragonhawk\", -1),\n+(70563, \"No Aspect\", -1),\n+(70564, \"Aura\", -1),\n+(70565, \"Devotion\", -1),\n+(70566, \"Concentration\", -1),\n+(70567, \"Fire Resistance\", -1),\n+(70568, \"Frost Resistance\", -1),\n+(70569, \"Shadow Resistance\", -1),\n+(70570, \"Retribution\", -1),\n+(70571, \"Crusader\", -1),\n+(70572, \"No Aura\", -1),\n+(70573, \"Crippling\", -1),\n+(70574, \"Instant\", -1),\n+(70575, \"Deadly\", -1),\n+(70576, \"Wound\", -1),\n+(70577, \"Mind-Numbing\", -1),\n+(70578, \"Anesthetic\", -1),\n+(70579, \"Nothing\", -1),\n+(70580, \"Flametongue\", -1),\n+(70581, \"Frostbrand\", -1),\n+(70582, \"Windfury\", -1),\n+(70583, \"Earthliving\", -1),\n+(70584, \"I need your services\", -1),\n+(70585, \"You have too many bots\", -1),\n+(70586, \"Do you wish to hire \", -1),\n+(70587, \" is a bit busy at the moment, try again later.\", -1),\n+(70588, \"Pleasure doing business with you\", -1),\n+(70589, \"Warriors\", -1),\n+(70590, \"Paladins\", -1),\n+(70591, \"Mages\", -1),\n+(70592, \"Priests\", -1),\n+(70593, \"Warlocks\", -1),\n+(70594, \"Druids\", -1),\n+(70595, \"Death Knights\", -1),\n+(70596, \"Rogues\", -1),\n+(70597, \"Shamans\", -1),\n+(70598, \"Hunters\", -1),\n+(70599, \"Blademasters\", -1),\n+(70600, \"Destroyers\", -1),\n+(70601, \"Archmagi\", -1),\n+(70602, \"Dreadlords\", -1),\n+(70603, \"Spell Breakers\", -1),\n+(70604, \"Dark Rangers\", -1),\n+(70605, \"Warrior\", -1),\n+(70606, \"Paladin\", -1),\n+(70607, \"Mage\", -1),\n+(70608, \"Priest\", -1),\n+(70609, \"Warlock\", -1),\n+(70610, \"Druid\", -1),\n+(70611, \"Death Knight\", -1),\n+(70612, \"Rogue\", -1),\n+(70613, \"Shaman\", -1),\n+(70614, \"Hunter\", -1),\n+(70615, \"Blademaster\", -1),\n+(70616, \"Destroyer\", -1),\n+(70617, \"Archmage\", -1),\n+(70618, \"Dreadlord\", -1),\n+(70619, \"Spell Breaker\", -1),\n+(70620, \"Dark Ranger\", -1),\n+(70621, \"Male\", -1),\n+(70622, \"Female\", -1),\n+(70623, \"Human\", -1),\n+(70624, \"Orc\", -1),\n+(70625, \"Dwarf\", -1),\n+(70626, \"Night Elf\", -1),\n+(70627, \"Undead\", -1),\n+(70628, \"Tauren\", -1),\n+(70629, \"Gnome\", -1),\n+(70630, \"Troll\", -1),\n+(70631, \"Blood Elf\", -1),\n+(70632, \"Draenei\", -1),\n+(70633, \"Unknown\", -1),\n+(70634, \"Looting\", -1),\n+(70635, \"|cff9d9d9dPoor|r\", -1),\n+(70636, \"|cffffffffCommon|r\", -1),\n+(70637, \"|cff1eff00Uncommon|r\", -1),\n+(70638, \"|cff0070ddRare|r\", -1),\n+(70639, \"|cffa335eeEpic|r\", -1),\n+(70640, \"|cffff8000Legendary|r\", -1),\n+(70641, \"Engage behavior\", -1),\n+(70642, \"Delay attack by\", -1),\n+(70643, \"Delay healing by\", -1),\n+(70644, \"s\", -1),\n+(70645, \"Off-Tank\", -1),\n+(70646, \"Necromancers\", -1),\n+(70647, \"Necromancer\", -1),\n+(70648, \"Attack angle\", -1),\n+(70649, \"Normal\", -1),\n+(70650, \"Avoid frontal AOE\", -1),\n+(70651, \"NIY\", -1),\n+(70652, \"Are you sure this is gonna work? It's better be the best water in the world...\", -1),\n+(70653, \"Seems like you could really use a drink of fresh water.\", -1),\n+(70654, \"Sea Witches\", -1),\n+(70655, \"Sea Witch\", -1),\n+(70656, \"Mana per damage\", -1),\n+(70657, \"Damage per mana\", -1),\n+(70658, \"Transmogrification...\", -1);\ndiff --git a/data/sql/custom/db_world/0000-00-00_npcbot_04_creature_classlevelstats.sql b/data/sql/custom/db_world/0000-00-00_npcbot_04_creature_classlevelstats.sql\nnew file mode 100644\nindex 0000000000..e43ad27611\n--- /dev/null\n+++ b/data/sql/custom/db_world/0000-00-00_npcbot_04_creature_classlevelstats.sql\n@@ -0,0 +1,611 @@\n+--\n+SET @CLASS_HUNTER           = 3;\n+SET @CLASS_PRIEST           = 5;\n+SET @CLASS_DK               = 6;\n+SET @CLASS_SHAMAN           = 7;\n+SET @CLASS_WARLOCK          = 9;\n+SET @CLASS_DRUID            = 11;\n+\n+-- actual values are irrelevant, but hp and mana must be > 1\n+DELETE FROM `creature_classlevelstats` WHERE `class` IN (@CLASS_HUNTER,@CLASS_PRIEST,@CLASS_DK,@CLASS_SHAMAN,@CLASS_WARLOCK,@CLASS_DRUID) AND `level` BETWEEN 1 AND 100;\n+INSERT INTO `creature_classlevelstats` (`level`,`class`,`basehp0`,`basehp1`,`basehp2`,`basemana`,`basearmor`,`attackpower`,`rangedattackpower`,`damage_base`,`damage_exp1`,`damage_exp2`,`comment`) VALUES\n+('1', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('1', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('1', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('1', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('1', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('1', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('2', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('2', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('2', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('2', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('2', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('2', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('3', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('3', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('3', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('3', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('3', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('3', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('4', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('4', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('4', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('4', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('4', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('4', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('5', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('5', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('5', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('5', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('5', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('5', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('6', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('6', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('6', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('6', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('6', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('6', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('7', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('7', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('7', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('7', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('7', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('7', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('8', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('8', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('8', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('8', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('8', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('8', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('9', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('9', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('9', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('9', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('9', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('9', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('10', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('10', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('10', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('10', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('10', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('10', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('11', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('11', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('11', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('11', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('11', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('11', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('12', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('12', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('12', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('12', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('12', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('12', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('13', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('13', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('13', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('13', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('13', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('13', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('14', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('14', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('14', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('14', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('14', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('14', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('15', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('15', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('15', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('15', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('15', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('15', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('16', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('16', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('16', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('16', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('16', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('16', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('17', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('17', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('17', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('17', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('17', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('17', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('18', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('18', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('18', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('18', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('18', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('18', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('19', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('19', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('19', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('19', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('19', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('19', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('20', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('20', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('20', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('20', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('20', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('20', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('21', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('21', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('21', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('21', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('21', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('21', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('22', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('22', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('22', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('22', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('22', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('22', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('23', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('23', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('23', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('23', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('23', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('23', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('24', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('24', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('24', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('24', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('24', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('24', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('25', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('25', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('25', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('25', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('25', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('25', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('26', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('26', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('26', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('26', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('26', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('26', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('27', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('27', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('27', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('27', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('27', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('27', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('28', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('28', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('28', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('28', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('28', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('28', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('29', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('29', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('29', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('29', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('29', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('29', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('30', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('30', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('30', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('30', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('30', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('30', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('31', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('31', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('31', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('31', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('31', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('31', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('32', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('32', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('32', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('32', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('32', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('32', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('33', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('33', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('33', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('33', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('33', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('33', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('34', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('34', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('34', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('34', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('34', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('34', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('35', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('35', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('35', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('35', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('35', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('35', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('36', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('36', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('36', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('36', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('36', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('36', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('37', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('37', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('37', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('37', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('37', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('37', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('38', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('38', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('38', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('38', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('38', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('38', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('39', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('39', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('39', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('39', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('39', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('39', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('40', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('40', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('40', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('40', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('40', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('40', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('41', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('41', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('41', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('41', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('41', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('41', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('42', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('42', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('42', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('42', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('42', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('42', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('43', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('43', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('43', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('43', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('43', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('43', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('44', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('44', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('44', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('44', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('44', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('44', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('45', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('45', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('45', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('45', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('45', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('45', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('46', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('46', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('46', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('46', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('46', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('46', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('47', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('47', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('47', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('47', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('47', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('47', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('48', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('48', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('48', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('48', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('48', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('48', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('49', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('49', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('49', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('49', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('49', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('49', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('50', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('50', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('50', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('50', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('50', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('50', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('51', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('51', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('51', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('51', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('51', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('51', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('52', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('52', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('52', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('52', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('52', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('52', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('53', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('53', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('53', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('53', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('53', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('53', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('54', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('54', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('54', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('54', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('54', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('54', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('55', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('55', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('55', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('55', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('55', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('55', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('56', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('56', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('56', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('56', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('56', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('56', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('57', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('57', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('57', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('57', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('57', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('57', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('58', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('58', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('58', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('58', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('58', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('58', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('59', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('59', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('59', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('59', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('59', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('59', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('60', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('60', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('60', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('60', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('60', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('60', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('61', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('61', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('61', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('61', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('61', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('61', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('62', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('62', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('62', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('62', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('62', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('62', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('63', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('63', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('63', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('63', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('63', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('63', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('64', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('64', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('64', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('64', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('64', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('64', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('65', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('65', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('65', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('65', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('65', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('65', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('66', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('66', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('66', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('66', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('66', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('66', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('67', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('67', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('67', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('67', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('67', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('67', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('68', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('68', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('68', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('68', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('68', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('68', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('69', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('69', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('69', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('69', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('69', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('69', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('70', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('70', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('70', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('70', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('70', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('70', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('71', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('71', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('71', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('71', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('71', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('71', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('72', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('72', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('72', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('72', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('72', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('72', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('73', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('73', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('73', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('73', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('73', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('73', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('74', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('74', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('74', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('74', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('74', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('74', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('75', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('75', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('75', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('75', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('75', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('75', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('76', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('76', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('76', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('76', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('76', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('76', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('77', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('77', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('77', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('77', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('77', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('77', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('78', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('78', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('78', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('78', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('78', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('78', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('79', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('79', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('79', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('79', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('79', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('79', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('80', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('80', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('80', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('80', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('80', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('80', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('81', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('81', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('81', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('81', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('81', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('81', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('82', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('82', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('82', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('82', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('82', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('82', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('83', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('83', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('83', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('83', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('83', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('83', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('84', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('84', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('84', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('84', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('84', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('84', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('85', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('85', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('85', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('85', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('85', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('85', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('86', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('86', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('86', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('86', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('86', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('86', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('87', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('87', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('87', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('87', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('87', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('87', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('88', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('88', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('88', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('88', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('88', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('88', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('89', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('89', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('89', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('89', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('89', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('89', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('90', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('90', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('90', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('90', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('90', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('90', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('91', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('91', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('91', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('91', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('91', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('91', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('92', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('92', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('92', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('92', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('92', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('92', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('93', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('93', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('93', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('93', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('93', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('93', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('94', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('94', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('94', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('94', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('94', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('94', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('95', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('95', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('95', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('95', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('95', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('95', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('96', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('96', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('96', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('96', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('96', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('96', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('97', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('97', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('97', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('97', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('97', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('97', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('98', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('98', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('98', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('98', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('98', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('98', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('99', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('99', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('99', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('99', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('99', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('99', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('100', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('100', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('100', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('100', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('100', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('100', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL);\ndiff --git a/data/sql/custom/db_world/0000-00-00_npcbot_05_command.sql b/data/sql/custom/db_world/0000-00-00_npcbot_05_command.sql\nnew file mode 100644\nindex 0000000000..3b0f92f7d0\n--- /dev/null\n+++ b/data/sql/custom/db_world/0000-00-00_npcbot_05_command.sql\n@@ -0,0 +1,43 @@\n+--\n+DELETE FROM `command` WHERE `name` LIKE \"npcbot %\";\n+\n+INSERT INTO `command` (`name`,`security`,`help`) VALUES\n+(\"npcbot add\", 0, \"NULL\"),\n+(\"npcbot command\", 0, \"NULL\"),\n+(\"npcbot command follow\", 0, \"NULL\"),\n+(\"npcbot command standstill\", 0, \"NULL\"),\n+(\"npcbot command stopfully\", 0, \"NULL\"),\n+(\"npcbot command walk\", 0, \"NULL\"),\n+(\"npcbot createnew\", 0, \"NULL\"),\n+(\"npcbot delete\", 0, \"NULL\"),\n+(\"npcbot distance\", 0, \"NULL\"),\n+(\"npcbot distance attack\", 0, \"NULL\"),\n+(\"npcbot distance attack long\", 0, \"NULL\"),\n+(\"npcbot distance attack short\", 0, \"NULL\"),\n+(\"npcbot dump\", 0, \"NULL\"),\n+(\"npcbot dump load\", 0, \"NULL\"),\n+(\"npcbot dump write\", 0, \"NULL\"),\n+(\"npcbot hide\", 0, \"NULL\"),\n+(\"npcbot info\", 0, \"NULL\"),\n+(\"npcbot kill\", 0, \"NULL\"),\n+(\"npcbot lookup\", 0, \"NULL\"),\n+(\"npcbot move\", 0, \"NULL\"),\n+(\"npcbot order\", 0, \"NULL\"),\n+(\"npcbot order cast\", 0, \"NULL\"),\n+(\"npcbot recall\", 0, \"NULL\"),\n+(\"npcbot recall teleport\", 0, \"NULL\"),\n+(\"npcbot reloadconfig\", 0, \"NULL\"),\n+(\"npcbot remove\", 0, \"NULL\"),\n+(\"npcbot revive\", 0, \"NULL\"),\n+(\"npcbot sendto\", 0, \"NULL\"),\n+(\"npcbot set\", 0, \"NULL\"),\n+(\"npcbot set faction\", 0, \"NULL\"),\n+(\"npcbot set owner\", 0, \"NULL\"),\n+(\"npcbot set spec\", 0, \"NULL\"),\n+(\"npcbot show\", 0, \"NULL\"),\n+(\"npcbot spawn\", 0, \"NULL\"),\n+(\"npcbot spawned\", 0, \"NULL\"),\n+(\"npcbot suicide\", 0, \"NULL\"),\n+(\"npcbot unhide\", 0, \"NULL\"),\n+(\"npcbot vehicle\", 0, \"NULL\"),\n+(\"npcbot vehicle eject\", 0, \"NULL\");\ndiff --git a/data/sql/custom/db_world/0000-00-00_npcbot_06_creature_template_model.sql b/data/sql/custom/db_world/0000-00-00_npcbot_06_creature_template_model.sql\nnew file mode 100644\nindex 0000000000..dc04e983cd\n--- /dev/null\n+++ b/data/sql/custom/db_world/0000-00-00_npcbot_06_creature_template_model.sql\n@@ -0,0 +1,375 @@\n+--\n+INSERT IGNORE INTO `creature_template_model` (`CreatureID`,`Idx`,`CreatureDisplayID`,`DisplayScale`,`Probability`,`VerifiedBuild`) VALUES\n+(70000,0,27541,0.7,1,0),\n+(70001,0,3343,1,1,0),\n+(70002,0,3399,1,1,0),\n+(70003,0,1300,1,1,0),\n+(70004,0,3431,1,1,0),\n+(70005,0,4556,1,1,0),\n+(70006,0,3431,1,1,0),\n+(70007,0,3053,1,1,0),\n+(70008,0,1578,1,1,0),\n+(70009,0,1599,1,1,0),\n+(70010,0,2103,1,1,0),\n+(70011,0,2096,1,1,0),\n+(70012,0,2113,1,1,0),\n+(70013,0,3793,1,1,0),\n+(70014,0,3794,1,1,0),\n+(70015,0,1880,1,1,0),\n+(70016,0,3743,1,1,0),\n+(70017,0,1374,1,1,0),\n+(70018,0,1375,1,1,0),\n+(70019,0,4242,1,1,0),\n+(70020,0,1721,1,1,0),\n+(70021,0,1707,1,1,0),\n+(70022,0,2196,1,1,0),\n+(70023,0,2198,1,1,0),\n+(70024,0,2620,1,1,0),\n+(70025,0,2658,1,1,0),\n+(70026,0,2614,1,1,0),\n+(70027,0,3054,1,1,0),\n+(70028,0,3055,1,1,0),\n+(70029,0,3280,1,1,0),\n+(70030,0,3287,1,1,0),\n+(70031,0,6071,1,1,0),\n+(70032,0,11037,1,1,0),\n+(70033,0,16226,1,1,0),\n+(70034,0,17212,1,1,0),\n+(70035,0,17213,1,1,0),\n+(70036,0,17215,1,1,0),\n+(70037,0,17214,1,1,0),\n+(70038,0,17211,1,1,0),\n+(70051,0,3346,1,1,0),\n+(70052,0,3393,1,1,0),\n+(70053,0,1299,1,1,0),\n+(70054,0,1499,1,1,0),\n+(70055,0,1622,1,1,0),\n+(70056,0,3089,1,1,0),\n+(70057,0,3088,1,1,0),\n+(70058,0,3087,1,1,0),\n+(70059,0,3284,1,1,0),\n+(70060,0,3289,1,1,0),\n+(70061,0,7356,1,1,0),\n+(70062,0,15521,1,1,0),\n+(70063,0,16685,1,1,0),\n+(70064,0,16224,1,1,0),\n+(70065,0,16815,1,1,0),\n+(70066,0,16811,1,1,0),\n+(70067,0,16829,1,1,0),\n+(70068,0,17225,1,1,0),\n+(70069,0,17227,1,1,0),\n+(70070,0,17234,1,1,0),\n+(70071,0,17226,1,1,0),\n+(70072,0,19596,1,1,0),\n+(70073,0,21264,1,1,0),\n+(70074,0,29735,1,1,0),\n+(70101,0,3395,1,1,0),\n+(70102,0,4560,1,1,0),\n+(70103,0,3558,1,1,0),\n+(70104,0,4372,1,1,0),\n+(70105,0,2112,1,1,0),\n+(70106,0,2087,1,1,0),\n+(70107,0,2105,1,1,0),\n+(70108,0,3810,1,1,0),\n+(70109,0,3811,1,1,0),\n+(70110,0,1882,1,1,0),\n+(70111,0,3744,1,1,0),\n+(70112,0,1373,1,1,0),\n+(70113,0,4239,1,1,0),\n+(70114,0,4241,1,1,0),\n+(70115,0,1723,1,1,0),\n+(70116,0,1703,1,1,0),\n+(70117,0,2066,1,1,0),\n+(70118,0,2205,1,1,0),\n+(70119,0,2206,1,1,0),\n+(70120,0,2251,1,1,0),\n+(70121,0,3056,1,1,0),\n+(70122,0,3072,1,1,0),\n+(70123,0,3073,1,1,0),\n+(70124,0,3299,1,1,0),\n+(70125,0,3312,1,1,0),\n+(70126,0,3309,1,1,0),\n+(70127,0,3310,1,1,0),\n+(70128,0,7538,1,1,0),\n+(70129,0,10245,1,1,0),\n+(70130,0,15520,1,1,0),\n+(70131,0,16681,1,1,0),\n+(70132,0,16222,1,1,0),\n+(70133,0,16778,1,1,0),\n+(70134,0,16816,1,1,0),\n+(70135,0,16802,1,1,0),\n+(70136,0,17434,1,1,0),\n+(70137,0,16860,1,1,0),\n+(70138,0,17511,1,1,0),\n+(70139,0,17488,1,1,0),\n+(70151,0,3351,1,1,0),\n+(70152,0,3407,1,1,0),\n+(70153,0,1297,1,1,0),\n+(70154,0,1507,1,1,0),\n+(70155,0,3436,1,1,0),\n+(70156,0,5146,1,1,0),\n+(70157,0,1580,1,1,0),\n+(70158,0,1603,1,1,0),\n+(70159,0,1886,1,1,0),\n+(70160,0,3749,1,1,0),\n+(70161,0,1327,1,1,0),\n+(70162,0,1328,1,1,0),\n+(70163,0,4360,1,1,0),\n+(70164,0,1725,1,1,0),\n+(70165,0,1704,1,1,0),\n+(70166,0,2231,1,1,0),\n+(70167,0,2252,1,1,0),\n+(70168,0,2243,1,1,0),\n+(70169,0,2659,1,1,0),\n+(70170,0,2639,1,1,0),\n+(70171,0,2631,1,1,0),\n+(70172,0,3101,1,1,0),\n+(70173,0,3100,1,1,0),\n+(70174,0,3113,1,1,0),\n+(70175,0,5528,1,1,0),\n+(70176,0,13171,1,1,0),\n+(70177,0,15519,1,1,0),\n+(70178,0,16689,1,1,0),\n+(70179,0,16767,1,1,0),\n+(70180,0,16798,1,1,0),\n+(70181,0,16818,1,1,0),\n+(70201,0,3344,1,1,0),\n+(70202,0,1495,1,1,0),\n+(70203,0,1295,1,1,0),\n+(70204,0,3401,1,1,0),\n+(70205,0,3429,1,1,0),\n+(70206,0,1579,1,1,0),\n+(70207,0,1602,1,1,0),\n+(70208,0,2139,1,1,0),\n+(70209,0,2138,1,1,0),\n+(70210,0,2137,1,1,0),\n+(70211,0,1733,1,1,0),\n+(70212,0,1708,1,1,0),\n+(70213,0,1897,1,1,0),\n+(70214,0,4068,1,1,0),\n+(70215,0,2200,1,1,0),\n+(70216,0,2201,1,1,0),\n+(70217,0,2202,1,1,0),\n+(70218,0,2626,1,1,0),\n+(70219,0,2618,1,1,0),\n+(70220,0,3086,1,1,0),\n+(70221,0,3066,1,1,0),\n+(70222,0,3085,1,1,0),\n+(70223,0,3282,1,1,0),\n+(70224,0,3283,1,1,0),\n+(70225,0,4690,1,1,0),\n+(70226,0,10473,1,1,0),\n+(70227,0,4711,1,1,0),\n+(70228,0,11044,1,1,0),\n+(70229,0,11048,1,1,0),\n+(70230,0,11053,1,1,0),\n+(70231,0,15518,1,1,0),\n+(70232,0,16707,1,1,0),\n+(70233,0,16225,1,1,0),\n+(70234,0,16788,1,1,0),\n+(70235,0,16817,1,1,0),\n+(70236,0,16795,1,1,0),\n+(70237,0,17247,1,1,0),\n+(70238,0,17232,1,1,0),\n+(70239,0,17249,1,1,0),\n+(70240,0,17248,1,1,0),\n+(70251,0,4552,1,1,0),\n+(70252,0,2123,1,1,0),\n+(70253,0,2102,1,1,0),\n+(70254,0,2082,1,1,0),\n+(70255,0,10180,1,1,0),\n+(70256,0,3816,1,1,0),\n+(70257,0,1878,1,1,0),\n+(70258,0,3746,1,1,0),\n+(70259,0,1360,1,1,0),\n+(70260,0,4231,1,1,0),\n+(70261,0,13341,1,1,0),\n+(70265,0,16914,1,1,0),\n+(70267,0,19598,1,1,0),\n+(70268,0,21265,1,1,0),\n+(70301,0,5001,1,1,0),\n+(70302,0,1294,1,1,0),\n+(70303,0,1484,1,1,0),\n+(70304,0,10216,1,1,0),\n+(70305,0,10215,1,1,0),\n+(70306,0,1592,1,1,0),\n+(70307,0,1600,1,1,0),\n+(70308,0,2134,1,1,0),\n+(70309,0,6058,1,1,0),\n+(70310,0,2135,1,1,0),\n+(70311,0,2644,1,1,0),\n+(70312,0,2657,1,1,0),\n+(70313,0,3108,1,1,0),\n+(70314,0,10214,1,1,0),\n+(70315,0,3109,1,1,0),\n+(70316,0,3292,1,1,0),\n+(70317,0,10171,1,1,0),\n+(70318,0,4524,1,1,0),\n+(70319,0,4522,1,1,0),\n+(70320,0,4526,1,1,0),\n+(70321,0,4523,1,1,0),\n+(70322,0,6060,1,1,0),\n+(70323,0,6072,1,1,0),\n+(70324,0,15522,1,1,0),\n+(70325,0,16680,1,1,0),\n+(70326,0,16223,1,1,0),\n+(70327,0,16781,1,1,0),\n+(70328,0,16824,1,1,0),\n+(70329,0,16809,1,1,0),\n+(70330,0,16777,1,1,0),\n+(70331,0,17242,1,1,0),\n+(70332,0,16856,1,1,0),\n+(70333,0,17233,1,1,0),\n+(70334,0,17243,1,1,0),\n+(70335,0,17241,1,1,0),\n+(70336,0,11466,1,1,0),\n+(70351,0,3345,1,1,0),\n+(70352,0,1930,1,1,0),\n+(70353,0,1469,1,1,0),\n+(70354,0,3271,1,1,0),\n+(70355,0,4567,1,1,0),\n+(70356,0,1581,1,1,0),\n+(70357,0,1604,1,1,0),\n+(70358,0,1884,1,1,0),\n+(70359,0,3745,1,1,0),\n+(70360,0,1324,1,1,0),\n+(70361,0,1325,1,1,0),\n+(70362,0,1326,1,1,0),\n+(70363,0,2675,1,1,0),\n+(70364,0,2637,1,1,0),\n+(70365,0,2646,1,1,0),\n+(70366,0,3115,1,1,0),\n+(70367,0,3116,1,1,0),\n+(70368,0,3122,1,1,0),\n+(70369,0,3291,1,1,0),\n+(70370,0,3286,1,1,0),\n+(70371,0,3607,1,1,0),\n+(70372,0,15524,1,1,0),\n+(70373,0,16700,1,1,0),\n+(70374,0,16787,1,1,0),\n+(70375,0,16800,1,1,0),\n+(70376,0,16831,1,1,0),\n+(70377,0,21604,1,1,0),\n+(70401,0,2106,1,1,0),\n+(70402,0,2121,1,1,0),\n+(70403,0,2115,1,1,0),\n+(70404,0,3819,1,1,0),\n+(70405,0,10734,1,1,0),\n+(70406,0,1732,1,1,0),\n+(70407,0,1706,1,1,0),\n+(70408,0,2261,1,1,0),\n+(70409,0,2250,1,1,0),\n+(70410,0,2255,1,1,0),\n+(70411,0,3300,1,1,0),\n+(70412,0,3301,1,1,0),\n+(70413,0,3302,1,1,0),\n+(70414,0,7357,1,1,0),\n+(70415,0,10738,1,1,0),\n+(70416,0,12053,1,1,0),\n+(70417,0,16739,1,1,0),\n+(70418,0,16858,1,1,0),\n+(70451,0,24935,1,1,0),\n+(70452,0,26939,1,1,0),\n+(70453,0,26854,1,1,0),\n+(70454,0,28039,1,1,0),\n+(70455,0,26688,1,1,0),\n+(70456,0,26195,1,1,0),\n+(70457,0,27402,1,1,0),\n+(70458,0,27189,1,1,0),\n+(70459,0,26217,1,1,0),\n+(70460,0,26222,1,1,0),\n+(70461,0,28842,1,1,0),\n+(70462,0,28837,1,1,0),\n+(70463,0,28840,1,1,0),\n+(70464,0,25512,1,1,0),\n+(70465,0,25500,1,1,0),\n+(70501,0,4449,1,1,0),\n+(70502,0,1132,1,1,0),\n+(70503,0,4162,1,1,0),\n+(70504,0,850,1,1,0),\n+(70505,0,14255,1,1,0),\n+(70506,0,368,1,1,0),\n+(70507,0,4312,1,1,0),\n+(70508,0,16724,1,1,0),\n+(70509,0,8808,1,1,0),\n+(70510,0,17562,1,1,0),\n+(70511,0,20308,1,1,0),\n+(70512,0,17545,1,1,0),\n+(70513,0,19405,1,1,0),\n+(70514,0,17753,1,1,0),\n+(70515,0,15590,1,1,0),\n+(70516,0,11319,1,1,0),\n+(70517,0,741,1,1,0),\n+(70518,0,1220,1,1,0),\n+(70519,0,321,1,1,0),\n+(70520,0,2714,1,1,0),\n+(70521,0,29113,1,1,0),\n+(70522,0,17798,1,1,0),\n+(70523,0,20790,1,1,0),\n+(70524,0,1244,1,1,0),\n+(70525,0,809,1,1,0),\n+(70526,0,706,1,1,0),\n+(70527,0,381,1,1,0),\n+(70528,0,1938,1,1,0),\n+(70529,0,1250,1,1,0),\n+(70530,0,19998,1,1,0),\n+(70531,0,11087,1,1,0),\n+(70532,0,10810,1,1,0),\n+(70533,0,29673,1,1,0),\n+(70534,0,12168,1,1,0),\n+(70535,0,5239,1,1,0),\n+(70536,0,26279,1,1,0),\n+(70537,0,13212,1,1,0),\n+(70538,0,24994,1,1,0),\n+(70538,1,24993,1,1,0),\n+(70538,2,24992,1,1,0),\n+(70538,3,24995,1,1,0),\n+(70542,0,19110,1,1,0),\n+(70543,0,21114,1,1,0),\n+(70544,0,525,1,1,0),\n+(70545,0,18922,1,1,0),\n+(70551,0,17659,1,1,0),\n+(70552,0,17659,1,1,0),\n+(70553,0,15343,0.7,1,0),\n+(70554,0,15343,0.7,1,0),\n+(70555,0,6769,1,1,0),\n+(70556,0,5561,1.3,1,0),\n+(70557,0,348,1.2,1,0),\n+(70558,0,348,1.2,1,0),\n+(70559,0,348,1.2,1,0),\n+(70560,0,348,1.2,1,0),\n+(70561,0,348,1.2,1,0),\n+(70562,0,169,1.5,1,0),\n+(70563,0,15511,1.1,1,0),\n+(70564,0,15511,1.1,1,0),\n+(70565,0,15511,1.1,1,0),\n+(70566,0,15511,1.1,1,0),\n+(70567,0,15511,1.1,1,0),\n+(70568,0,30072,1,1,0),\n+(70569,0,30072,1,1,0),\n+(70570,0,30072,1,1,0),\n+(70571,0,30072,1,1,0),\n+(70572,0,30072,1,1,0),\n+(70573,0,30363,0.8,1,0),\n+(70574,0,30363,0.9,1,0),\n+(70575,0,23277,1,1,0),\n+(70576,0,23277,1,1,0),\n+(70577,0,23277,1,1,0),\n+(70578,0,23277,1,1,0),\n+(70579,0,23277,1,1,0),\n+(70580,0,200,1.1,1,0),\n+(70581,0,20748,0.5,1,0),\n+(70582,0,20748,0.5,1,0),\n+(70583,0,20748,0.5,1,0),\n+(70584,0,20748,0.5,1,0),\n+(70585,0,20748,0.5,1,0),\n+(70586,0,20211,3,1,0),\n+(70587,0,27395,0.5,1,0),\n+(70588,0,27395,0.5,1,0),\n+(70589,0,27395,0.5,1,0),\n+(70590,0,27395,0.5,1,0),\n+(70591,0,27395,0.5,1,0),\n+(70592,0,11094,0.5,1,0),\n+(70593,0,11094,0.7,1,0),\n+(70594,0,11094,0.9,1,0),\n+(70595,0,19252,0.25,1,0);\ndiff --git a/data/sql/custom/db_world/2022_12_08_00_npc_text.sql b/data/sql/custom/db_world/2022_12_08_00_npc_text.sql\nnew file mode 100644\nindex 0000000000..e39b014b1e\n--- /dev/null\n+++ b/data/sql/custom/db_world/2022_12_08_00_npc_text.sql\n@@ -0,0 +1,8 @@\n+--\n+SET @BOT_START = 70659;\n+SET @BOT_END   = 70659;\n+\n+DELETE FROM `npc_text` WHERE `ID` BETWEEN @BOT_START AND @BOT_END AND `ID` != 70100;\n+\n+INSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n+(@BOT_START+0, \"DISABLE combat positioning\", -1);\ndiff --git a/data/sql/custom/db_world/2022_12_17_00_command.sql b/data/sql/custom/db_world/2022_12_17_00_command.sql\nnew file mode 100644\nindex 0000000000..ad173b9c86\n--- /dev/null\n+++ b/data/sql/custom/db_world/2022_12_17_00_command.sql\n@@ -0,0 +1,7 @@\n+--\n+DELETE FROM `command` WHERE `name` IN ('npcbot list spawned','npcbot list spawned free','npcbot delete free','npcbot delete id');\n+INSERT INTO `command` (`name`) VALUES\n+('npcbot list spawned'),\n+('npcbot list spawned free'),\n+('npcbot delete free'),\n+('npcbot delete id');\ndiff --git a/data/sql/custom/db_world/2022_12_17_01_command.sql b/data/sql/custom/db_world/2022_12_17_01_command.sql\nnew file mode 100644\nindex 0000000000..61e785282b\n--- /dev/null\n+++ b/data/sql/custom/db_world/2022_12_17_01_command.sql\n@@ -0,0 +1,2 @@\n+--\n+DELETE FROM `command` WHERE `name` = 'npcbot spawned';\ndiff --git a/data/sql/custom/db_world/2022_12_23_00_command.sql b/data/sql/custom/db_world/2022_12_23_00_command.sql\nnew file mode 100644\nindex 0000000000..658014fa8f\n--- /dev/null\n+++ b/data/sql/custom/db_world/2022_12_23_00_command.sql\n@@ -0,0 +1,6 @@\n+--\n+DELETE FROM `command` WHERE `name` IN ('npcbot command nogossip','npcbot command rebind','npcbot command unbind');\n+INSERT INTO `command` (`name`) VALUES\n+('npcbot command nogossip'),\n+('npcbot command rebind'),\n+('npcbot command unbind');\ndiff --git a/data/sql/custom/db_world/2022_12_29_00_command.sql b/data/sql/custom/db_world/2022_12_29_00_command.sql\nnew file mode 100644\nindex 0000000000..cb337042df\n--- /dev/null\n+++ b/data/sql/custom/db_world/2022_12_29_00_command.sql\n@@ -0,0 +1,2 @@\n+--\n+DELETE FROM `command` WHERE `name` LIKE \"npcbot%\";\ndiff --git a/data/sql/custom/db_world/2023_01_02_00_npc_text.sql b/data/sql/custom/db_world/2023_01_02_00_npc_text.sql\nnew file mode 100644\nindex 0000000000..44625a44fe\n--- /dev/null\n+++ b/data/sql/custom/db_world/2023_01_02_00_npc_text.sql\n@@ -0,0 +1,8 @@\n+--\n+SET @BOT_START = 70660;\n+SET @BOT_END   = 70660;\n+\n+DELETE FROM `npc_text` WHERE `ID` BETWEEN @BOT_START AND @BOT_END;\n+\n+INSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n+(@BOT_START+0, \"Priority target\", -1);\ndiff --git a/data/sql/custom/db_world/2023_03_12_00_creature_template_npcbot_wander_nodes.sql b/data/sql/custom/db_world/2023_03_12_00_creature_template_npcbot_wander_nodes.sql\nnew file mode 100644\nindex 0000000000..d6589a6e92\n--- /dev/null\n+++ b/data/sql/custom/db_world/2023_03_12_00_creature_template_npcbot_wander_nodes.sql\n@@ -0,0 +1,18 @@\n+--\n+DROP TABLE IF EXISTS `creature_template_npcbot_wander_nodes`;\n+CREATE TABLE `creature_template_npcbot_wander_nodes` (\n+  `id` int(10) unsigned NOT NULL,\n+  `name` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'RENAME_ME',\n+  `mapid` smallint(5) unsigned NOT NULL DEFAULT '0',\n+  `zoneid` int(10) unsigned NOT NULL DEFAULT '0',\n+  `areaid` int(10) unsigned NOT NULL DEFAULT '0',\n+  `minlevel` tinyint(3) unsigned NOT NULL DEFAULT '0',\n+  `maxlevel` tinyint(3) unsigned NOT NULL DEFAULT '0',\n+  `flags` int(10) unsigned NOT NULL DEFAULT '0',\n+  `x` float NOT NULL DEFAULT '0',\n+  `y` float NOT NULL DEFAULT '0',\n+  `z` float NOT NULL DEFAULT '0',\n+  `o` float NOT NULL DEFAULT '0',\n+  `links` mediumtext COLLATE utf8mb4_unicode_ci,\n+  PRIMARY KEY (`id`)\n+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Bot Wander Map';\ndiff --git a/data/sql/custom/db_world/2023_03_14_00_creature_wander_nodes.sql b/data/sql/custom/db_world/2023_03_14_00_creature_wander_nodes.sql\nnew file mode 100644\nindex 0000000000..ebd3093bbb\n--- /dev/null\n+++ b/data/sql/custom/db_world/2023_03_14_00_creature_wander_nodes.sql\n@@ -0,0 +1,2 @@\n+--\n+DROP TABLE IF EXISTS `creature_wander_nodes`;\ndiff --git a/data/sql/custom/db_world/2023_03_21_00_creature_template_npcbot_wander_nodes.sql b/data/sql/custom/db_world/2023_03_21_00_creature_template_npcbot_wander_nodes.sql\nnew file mode 100644\nindex 0000000000..57d005227b\n--- /dev/null\n+++ b/data/sql/custom/db_world/2023_03_21_00_creature_template_npcbot_wander_nodes.sql\n@@ -0,0 +1,964 @@\n+--\n+DROP TABLE IF EXISTS `creature_template_npcbot_wander_nodes`;\n+\n+CREATE TABLE `creature_template_npcbot_wander_nodes` (\n+  `id` int(10) unsigned NOT NULL,\n+  `name` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'RENAME_ME',\n+  `mapid` smallint(5) unsigned NOT NULL DEFAULT '0',\n+  `zoneid` int(10) unsigned NOT NULL DEFAULT '0',\n+  `areaid` int(10) unsigned NOT NULL DEFAULT '0',\n+  `minlevel` tinyint(3) unsigned NOT NULL DEFAULT '0',\n+  `maxlevel` tinyint(3) unsigned NOT NULL DEFAULT '0',\n+  `flags` int(10) unsigned NOT NULL DEFAULT '0',\n+  `x` float NOT NULL DEFAULT '0',\n+  `y` float NOT NULL DEFAULT '0',\n+  `z` float NOT NULL DEFAULT '0',\n+  `o` float NOT NULL DEFAULT '0',\n+  `links` mediumtext COLLATE utf8mb4_unicode_ci,\n+  PRIMARY KEY (`id`)\n+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Bot Wander Map';\n+\n+INSERT INTO `creature_template_npcbot_wander_nodes`(`id`,`name`,`mapid`,`zoneid`,`areaid`,`minlevel`,`maxlevel`,`flags`,`x`,`y`,`z`,`o`,`links`) VALUES\n+(1,'Anvilmar',0,1,132,1,5,2,-6077.84,384.826,393.598,4.63263,'542:0 '),\n+(2,'Brill',0,85,159,1,10,5,2249.85,278.414,34.1142,5.11546,'18:0 277:0 278:0 279:0 281:0 '),\n+(3,'Darkshire',0,10,42,18,30,3,-10560.6,-1182.34,27.9637,3.1803,'783:0 784:0 787:0 788:0 789:0 '),\n+(4,'Deathknell',0,85,154,1,10,5,1879.83,1588.2,90.1725,5.25172,'295:0 296:0 '),\n+(5,'Dun Algaz',0,11,836,18,30,0,-4245.13,-2356.42,204.034,3.9477,'483:0 '),\n+(6,'Dun Modr',0,11,205,18,30,0,-2610.26,-2350.56,81.5918,1.1263,'444:0 '),\n+(7,'Goldshire',0,12,87,1,10,3,-9480.09,63.5218,56.1755,3.4173,'88:0 71:0 16:0 42:0 72:0 710:0 709:0 714:0 717:0 '),\n+(8,'Ironforge',0,1,809,1,10,2,-5023.64,-831.425,495.319,5.37056,'559:0 560:0 '),\n+(9,'Kharanos',0,1,131,1,10,3,-5501.22,-472.604,408.453,2.4002,'537:0 545:0 557:0 '),\n+(10,'Lakeshire',0,44,69,13,25,3,-9235.12,-2145.54,71.2121,5.71383,'665:0 666:0 '),\n+(11,'Menethil Harbor',0,11,150,18,30,3,-3672.7,-828.455,9.89925,3.18444,'476:0 477:0 478:0 '),\n+(12,'Moonbrook',0,40,20,8,20,2,-11017.1,1510.17,43.1667,2.58627,'737:0 738:0 736:0 747:0 '),\n+(13,'Northshire Abbey',0,12,9,1,10,3,-8900.51,-116.199,81.8499,0.369434,'710:0 70:0 73:0 '),\n+(14,'Raven Hill',0,10,94,18,30,0,-10805.5,291.025,30.9282,3.92422,'751:0 753:0 754:0 755:0 766:0 '),\n+(15,'Sentinel Hill',0,40,108,8,20,3,-10509.5,1047.74,60.519,5.20046,'741:0 742:0 745:0 746:0 736:0 750:0 '),\n+(16,'Stormwind City',0,12,12,1,10,2,-9153.77,364.057,90.151,5.16709,'42:0 710:0 712:0 7:0 '),\n+(17,'The Sepulcher',0,130,228,8,20,5,470.768,1589.82,126.632,5.16292,'305:0 '),\n+(18,'Undercity',0,85,153,1,10,5,1885.94,236.924,58.0313,3.1016,'2:0 285:0 '),\n+(19,'Thelsamar',0,38,144,8,20,3,-5334.7,-3015.26,324.2,1.73643,'503:0 504:0 '),\n+(20,'Southshore',0,267,271,18,30,3,-803.031,-531.727,15.9656,1.39359,'362:0 363:0 376:0 384:0 385:0 356:0 '),\n+(21,'Tarren Mill',0,267,272,18,30,5,-27.0354,-900.562,55.9602,4.57301,'378:0 380:0 379:0 384:0 '),\n+(22,'Refuge Pointe',0,45,320,28,40,3,-1280.81,-2466.89,34.7175,5.16384,'78:0 416:0 419:0 '),\n+(23,'Hammerfall',0,45,321,28,40,5,-955.494,-3540.82,56.7101,3.23882,'438:0 '),\n+(24,'Kargath',0,3,340,33,45,5,-6625,-2152.82,249.141,4.5492,'594:0 598:0 '),\n+(25,'Angor Fortress',0,3,338,33,45,0,-6392.65,-3158,299.765,4.68826,'608:0 620:0 '),\n+(26,'Bloodhoof Village',1,215,222,1,10,0,-2323.92,-394.981,-9.12757,0.10888,''),\n+(27,'Camp Narache',1,215,221,1,10,0,-2906.49,-253.607,52.941,5.73627,''),\n+(28,'Razor Hill',1,14,362,1,10,0,312.659,-4745.52,9.54734,1.10362,'66:0 '),\n+(29,'The Den',1,14,363,1,10,0,-604.098,-4202.92,38.7281,1.10189,''),\n+(30,'Orgrimmar',1,14,14,1,10,0,1381.77,-4371.16,26.023,2.19128,''),\n+(31,'Senjin Village',1,14,367,1,10,0,-819.492,-4918.24,18.3507,2.67153,''),\n+(32,'The Crossroads',1,17,380,8,20,0,-455.9,-2652.15,95.5864,4.41391,''),\n+(33,'Aldrassil',1,141,256,1,10,0,10462.7,805.993,1312.66,0.945149,'61:0 62:0 63:0 65:0 '),\n+(34,'Dolanaar',1,141,186,1,10,0,9787.99,949.897,1306.73,0.734179,'63:0 '),\n+(35,'Ratchet',1,17,392,8,20,0,-951.364,-3680.07,8.04046,0.798474,''),\n+(36,'Booty Bay',0,33,35,33,45,0,-14308.8,440.139,25.5878,0.828079,'959:0 960:0 961:0 '),\n+(37,'Gromgol Base Camp',0,33,117,33,45,5,-12416.5,185.125,1.83125,6.17782,'904:0 900:0 908:0 '),\n+(38,'Astranaar',1,331,415,18,30,0,2720.43,-382.391,107.089,1.24727,''),\n+(39,'Stonetalon Peak',1,406,467,13,25,0,2658.78,1449.71,226.135,5.85107,'155:0 '),\n+(40,'Thalanaar',1,357,489,38,50,0,-4510.03,-779.474,-41.5367,0.513916,''),\n+(41,'Freewind Post',1,400,484,23,35,0,-5454.07,-2445.5,90.1122,6.10667,'119:0 120:0 '),\n+(42,'Mirror Lake',0,12,92,1,10,2,-9389.26,458.427,38.2852,2.4529,'72:0 16:0 88:0 7:0 '),\n+(44,'Drywhisker Gorge',0,45,318,28,40,0,-1014.22,-3827.39,145.41,2.59534,'440:0 '),\n+(45,'Sun Rock Retreat',1,406,460,13,25,0,936.308,910.974,104.44,0.864181,'151:0 '),\n+(46,'Temple of Zin-Malor',1,16,1223,43,54,0,3549.15,-5359.12,188.348,1.22969,''),\n+(47,'Hetaeras Clutch',1,16,1222,43,54,0,3556.64,-6232.79,44.0085,4.90175,'141:0 195:0 '),\n+(48,'Uthers Tomb',0,28,196,48,56,0,1021.5,-1809.43,77.1448,3.5376,'271:0 '),\n+(49,'Scholomance',0,139,2057,53,60,0,1262.19,-2579.41,123.746,4.56181,''),\n+(50,'Whitereach Post',1,400,2237,23,35,0,-4917.35,-1375.5,-52.612,3.05417,''),\n+(51,'Stonard',0,8,75,33,45,5,-10445,-3261.11,20.179,5.57373,'828:0 829:0 830:0 '),\n+(52,'Gadgetzan',1,440,976,38,50,0,-7139.15,-3752.11,8.53951,2.41012,''),\n+(53,'Camp Mojache',1,357,1099,38,50,0,-4394.98,215.611,25.4138,0.668987,'136:0 137:0 '),\n+(54,'Theramore Isle',1,15,513,33,45,0,-3680.17,-4388.51,10.5544,2.126,'109:0 '),\n+(55,'Aerie Peak',0,47,348,38,50,0,170.251,-2085.14,112.706,5.73674,'82:0 386:0 387:0 388:0 '),\n+(56,'Everlook',1,618,2255,53,60,0,6723.46,-4662.5,720.986,4.0489,'143:0 147:0 '),\n+(57,'Shadowprey Village',1,405,2408,28,40,0,-1657.85,3097.92,30.5002,4.53043,'127:0 '),\n+(58,'Feathermoon Stronghold',1,357,1116,38,50,0,-4434.99,3276.74,11.7782,1.86721,''),\n+(59,'Auberdine',1,148,442,8,20,0,6439.33,411.951,10.8632,4.98592,''),\n+(60,'Nijels Point',1,405,608,28,40,0,202.521,1308.24,190.237,3.56577,''),\n+(61,'Aldrassil',1,141,256,1,10,0,10479.6,812.281,1322.74,1.7975,'33:0 62:0 63:0 65:0 '),\n+(62,'Shadowthread Cave',1,141,257,1,10,0,10756.2,921.301,1338.56,2.9431,'33:0 61:0 65:0 '),\n+(63,'Fel Rock',1,141,258,1,10,0,10050.6,1031.2,1329.95,1.85839,'33:0 34:0 61:0 65:0 '),\n+(64,'Banethil Barrow Den',1,141,736,1,10,0,9864.17,1557.41,1328.3,4.60699,''),\n+(65,'The Cleft',1,141,263,1,10,0,10316.4,1200.62,1458.08,3.62911,'33:0 61:0 62:0 63:0 '),\n+(66,'Razorwind Canyon',1,14,410,1,10,0,636.963,-4534.04,8.82068,1.74237,'28:0 67:0 '),\n+(67,'Torkren Farm',1,14,2979,1,10,0,726.297,-4242.41,17.2915,1.86203,'66:0 '),\n+(69,'Ironbands Compound',0,1,716,1,10,2,-5858.7,-2004.1,401.648,0.478922,'523:0 528:0 '),\n+(70,'Echo Ridge Mine',0,12,34,1,10,2,-8691.38,-113.152,89.09,5.86134,'73:0 13:0 711:0 '),\n+(71,'Maclure Vineyards',0,12,64,1,10,2,-9948.39,69.1568,33.3005,5.49869,'72:0 7:0 714:0 716:0 '),\n+(72,'Stonefield Farm',0,12,63,1,10,2,-9901.14,378.19,35.2801,5.75613,'71:0 7:0 42:0 88:0 713:0 714:0 717:0 '),\n+(73,'Northshire Vineyards',0,12,59,1,10,2,-9067.35,-333.965,73.4519,1.09469,'70:0 13:0 '),\n+(74,'Tower of Ilgalar',0,44,96,18,25,0,-9282.21,-3330.43,115.604,1.41034,'683:0 685:0 686:0 '),\n+(75,'Renders Rock',0,44,998,13,25,0,-8677.89,-2302.91,155.917,1.18325,'661:0 662:0 '),\n+(76,'Spirit Den',0,33,1742,33,45,0,-13751.4,-18.3165,44.0002,0.851192,'964:0 '),\n+(77,'Rethban Caverns',0,44,98,13,25,2,-8976.38,-2016.83,136.063,1.26142,'670:0 671:0 '),\n+(78,'Boulderfist Outpost',0,45,1858,28,40,0,-1183.46,-2180.67,55.5524,1.6849,'22:0 415:0 416:0 419:0 '),\n+(79,'Groshgok Compound',0,41,2937,50,60,0,-11094.7,-2311.06,117.13,4.77931,'800:0 803:0 804:0 '),\n+(80,'Stagalbog Cave',0,8,1817,33,45,0,-10775.6,-3747.85,22.347,3.74768,'186:0 825:0 824:0 826:0 828:0 832:0 '),\n+(81,'The Tower of Arathor',0,45,324,28,40,0,-1760.68,-1537.05,64.8696,2.02383,'425:0 '),\n+(82,'Wildhammer Keep',0,47,349,38,50,0,257.234,-2208.21,142.103,6.19816,'55:0 387:0 388:0 '),\n+(83,'Night Webs Hollow',0,85,155,1,10,4,2053.22,1802.16,99.8006,1.83635,'295:0 '),\n+(84,'Terrorweb Tunnel',0,139,2626,53,60,0,3035.33,-2773.9,100.473,5.05065,'215:0 243:0 '),\n+(85,'Browman Mill',0,139,2269,53,60,0,2483.98,-5183.79,76.1135,3.20045,'234:0 211:0 '),\n+(86,'Uldaman',0,3,1337,33,45,0,-6092.01,-3179.35,255.852,5.9237,'621:0 '),\n+(87,'Dustbelch Grotto',0,3,347,33,45,0,-7299.86,-2270.26,244.599,3.07308,'595:0 '),\n+(88,'Westbrook Garrison',0,12,120,1,10,2,-9671.96,690.134,36.5414,5.31336,'72:0 42:0 713:0 7:0 717:0 '),\n+(89,'Jasperlode Mine',0,12,54,1,10,0,-9194.18,-610.205,60.7892,0.426731,'701:0 702:0 707:0 708:0 '),\n+(91,'Algaz Station',0,38,925,8,20,0,-4880.26,-2723,328.908,0.873682,'485:0 486:0 487:0 500:0 502:0 '),\n+(92,'Grim Batol',0,11,1037,61,70,0,-4130,-3468.16,259.76,0.014411,'454:0 '),\n+(93,'Venture Co. Mine',1,215,215,1,10,0,-1501.49,-1036.19,151.717,1.01756,''),\n+(94,'Blackwood Den',1,148,455,8,20,0,4619.42,25.6126,69.7834,4.80597,'95:0 '),\n+(95,'Wildbend River',1,148,454,8,20,0,5056.04,220.755,22.9081,5.20884,'94:0 '),\n+(96,'Cliffspring Falls',1,148,445,8,20,0,6870.57,-662.396,82.9506,0.302464,''),\n+(97,'Fray Island',1,17,720,8,20,0,-1668.51,-4329.2,3.26569,0.222455,''),\n+(98,'Wailing Caverns',1,17,718,8,20,0,-837.968,-2037,80.467,1.58062,''),\n+(99,'Shady Rest Inn',1,15,403,33,45,0,-3723.63,-2535.18,69.5651,1.00004,'103:0 '),\n+(100,'Darkmist Cavern',1,15,499,33,45,0,-2829.79,-2722.81,36.7883,2.20851,'102:0 187:0 '),\n+(101,'North Point Tower',1,15,504,33,45,0,-2884.79,-3429.99,39.357,3.86048,'102:0 110:0 '),\n+(102,'Bluefen',1,15,507,33,45,0,-2685.32,-3087.58,41.4492,4.02905,'100:0 101:0 187:0 '),\n+(103,'Lost Point',1,15,506,33,45,0,-3925.5,-2862.15,46.4791,4.55427,'99:0 108:0 '),\n+(104,'Tidefury Cove',1,15,517,33,45,0,-4300.98,-4062.71,-10.5964,2.84709,'106:0 '),\n+(105,'Stonemaul Ruins',1,15,508,33,45,0,-4346.02,-3321.15,34.2542,6.16796,'106:0 233:0 '),\n+(106,'Onyxias Lair',1,15,511,33,45,0,-4698.06,-3720.58,47.1529,0.469848,'104:0 105:0 107:0 '),\n+(107,'Emberstrifes Den',1,15,2158,33,45,0,-4987.73,-3832.99,44.1305,3.70876,'106:0 '),\n+(108,'Bloodfen Burrow',1,15,498,33,45,0,-4335.04,-2639.53,38.0638,1.30845,'103:0 '),\n+(109,'Sentry Point',1,15,503,33,45,0,-3476.59,-4109.08,17.1041,4.05466,'54:0 '),\n+(110,'Swamplight Manor',1,15,497,33,45,0,-2949.47,-3893.5,35.0303,1.23141,'101:0 '),\n+(111,'Marshals Refuge',1,490,541,46,56,0,-6143.21,-1078.89,-198.367,5.66637,''),\n+(112,'Fungal Rock',1,490,542,46,56,0,-6370.15,-1836.52,-260.084,0.958035,''),\n+(113,'Wavestrider Beach',1,440,988,38,50,0,-7693.45,-4878.96,0.661957,4.5132,''),\n+(114,'Uldum',1,440,989,38,50,0,-9635.41,-2787.2,7.85617,5.44167,''),\n+(115,'Darkcloud Pinnacle',1,400,2097,23,35,0,-5086.21,-1919.44,88.1806,6.15461,'116:0 119:0 '),\n+(116,'Roguefeather Den',1,400,487,23,35,0,-5466.71,-1636.27,29.0246,3.60035,'115:0 '),\n+(117,'Mirage Raceway',1,400,2240,23,35,0,-6239.42,-3973.12,-58.7501,5.06259,'122:0 123:0 '),\n+(118,'The Rustmaul Digsite',1,400,479,23,35,0,-6490.61,-3449.15,-58.7821,3.58106,'123:0 '),\n+(119,'Splithoof Hold',1,400,1557,23,35,0,-5065.61,-2367.61,-53.6725,4.0206,'41:0 115:0 120:0 '),\n+(120,'The Weathered Nook',1,400,2303,23,35,0,-5213.85,-2794.53,-7.83752,2.24538,'41:0 119:0 '),\n+(121,'Ironstone Camp',1,400,3037,23,35,0,-5848.05,-3412.38,-51.0548,0.373431,'122:0 '),\n+(122,'Weazels Crater',1,400,3038,23,35,0,-5799.94,-3899.53,-96.7429,1.92693,'117:0 121:0 '),\n+(123,'Tahonda Ruins',1,400,3039,23,35,0,-6569.91,-3894.97,-58.7495,0.100017,'117:0 118:0 '),\n+(124,'Rolands Doom',0,10,2161,24,30,0,-11045.3,-1130.98,38.585,3.65547,'780:0 781:0 '),\n+(126,'Bolgans Hole',1,405,600,28,40,0,-2281.95,2499.6,73.7525,5.34105,''),\n+(127,'Maraudon',1,405,2100,28,40,0,-1422.62,2918.45,136.147,4.46498,'57:0 '),\n+(128,'Ghost Walker Post',1,405,597,28,40,0,-1224.06,1736.67,90.0219,0.112112,'129:0 '),\n+(129,'Scrabblescrews Camp',1,405,2617,28,40,0,-1407.87,1493.13,60.8875,4.75641,'128:0 '),\n+(130,'Valley of Bones',1,405,2657,28,40,0,-2251.19,1513.55,63.5889,6.25387,''),\n+(131,'Rage Scar Hold',1,357,1115,38,50,0,-3842.71,1738.94,142.708,2.30123,''),\n+(132,'Ruins of Solarsal',1,357,1117,38,50,0,-4852.91,3616.63,16.4186,4.11504,''),\n+(133,'Ravaged Twilight Camp',1,1377,3100,53,60,0,-6206.25,1766.95,17.464,4.2566,''),\n+(134,'Twilight Post',1,1377,3098,53,60,0,-6740.04,1636.32,15.2836,4.04162,'189:0 202:0 '),\n+(135,'Twilight Outpost',1,1377,3099,53,60,0,-7929.11,1833.28,4.86506,0.733634,''),\n+(136,'Woodpaw Hills',1,357,2519,38,50,0,-4915.81,199.275,52.2959,6.13256,'53:0 '),\n+(137,'Lariss Pavillion',1,357,2518,38,50,0,-4052.72,81.5525,77.1755,5.22503,'53:0 '),\n+(138,'Slither Rock',0,46,2419,48,56,0,-7653.86,-2991.1,135.917,1.62615,'648:0 650:0 652:0 '),\n+(139,'Flame Crest',0,46,251,48,56,0,-7486.64,-2184.45,166.505,5.87909,'646:0 '),\n+(140,'Shalzarus Lair',1,357,3117,38,50,0,-5492.37,3622.79,1.62975,3.27216,''),\n+(141,'Scalebeards Cave',1,16,3140,43,54,0,3705.1,-6043.45,2.50768,0.191079,'47:0 195:0 '),\n+(142,'Timbermaw Hold',1,618,618,53,60,0,6900.63,-2298.18,588.52,1.94812,'148:0 '),\n+(143,'The Ruins of KelTheril',1,618,2252,53,60,0,6426.76,-4304.99,664.687,3.04093,'56:0 194:0 '),\n+(144,'Dun Mandarr',1,618,2248,53,60,0,5718.83,-4507.31,761.083,4.26757,''),\n+(145,'Talrendis Point',1,16,3137,43,54,0,2707.72,-3869.25,104.208,5.79411,''),\n+(146,'Rethress Sanctum',1,16,3138,43,54,0,2195.67,-6438.33,2.1301,4.39206,''),\n+(147,'Moon Horror Den',1,618,3139,53,60,0,7123.02,-4631.57,639.68,2.0052,'56:0 '),\n+(148,'Timbermaw Hold',1,361,1769,46,56,0,6817.78,-2097.68,624.839,2.56313,'142:0 '),\n+(149,'Irontree Cavern',1,361,1768,46,56,0,6481.87,-1571,438.965,0.859127,''),\n+(150,'Bloodvenom Post',1,361,1997,46,56,0,5111.98,-353.403,357.231,5.23802,''),\n+(151,'Sishir Canyon',1,406,2541,13,25,0,515.845,624.05,68.1596,5.69462,'45:0 '),\n+(152,'Cragpool Lake',1,406,463,13,25,0,1543.57,70.1338,-10.3835,0.632571,''),\n+(153,'Windshear Mine',1,406,461,13,25,0,981.949,-358.9,14.3123,3.71479,''),\n+(154,'The Talondeep Path',1,406,1277,13,25,0,1531.94,-576.57,67.9212,5.18318,'168:0 '),\n+(155,'The Talon Den',1,406,468,13,25,0,2416.89,1792.39,393.641,3.36062,'39:0 '),\n+(156,'The Ruins of OrdilAran',1,331,412,18,30,0,3493.89,-119.601,0.714987,2.44963,'157:0 '),\n+(157,'Bathrans Haunt',1,331,411,18,30,0,3827.37,-161.305,-0.60768,3.24941,'156:0 '),\n+(158,'Zoramgar Outpost',1,331,2897,18,30,0,3362.22,1010.16,3.59814,2.49558,''),\n+(159,'Falfarren River',1,331,433,18,30,0,2231.21,-2222.91,94.4116,6.0491,'163:0 175:0 '),\n+(160,'Xavian',1,331,429,18,30,0,2936.56,-2822.67,212.731,0.0776333,'161:0 '),\n+(161,'Forest Song',1,331,2358,18,30,0,2880.33,-3287.54,156.204,1.1163,'160:0 '),\n+(162,'Demon Fall Canyon',1,331,435,18,30,0,1702.45,-3150.99,93.5217,3.37253,'164:0 '),\n+(163,'Silverwing Outpost',1,331,2360,18,30,0,1776.64,-2065.15,102.283,2.23373,'159:0 169:0 182:0 '),\n+(164,'The DorDanil Barrow Den',1,331,432,18,30,0,1776.23,-2678.36,111.666,5.44343,'162:0 169:0 175:0 '),\n+(165,'Silverwind Refuge',1,331,420,18,30,0,2130.27,-1190.25,99.3456,1.77657,'166:0 168:0 '),\n+(166,'Greenpaw Village',1,331,2359,18,30,0,2291.29,-1444.96,87.8806,1.08665,'165:0 '),\n+(167,'Bloodtooth Camp',1,331,2357,18,30,0,1612.52,-1465.1,157.023,5.78447,'182:0 '),\n+(168,'The Talondeep Path',1,406,1277,13,25,0,1930.26,-732.677,114.534,3.7975,'154:0 165:0 '),\n+(169,'Warsong Labor Camp',1,331,3177,18,30,0,1575.91,-2463.94,98.549,2.24558,'163:0 164:0 '),\n+(170,'Aridens Camp',0,41,2560,50,60,0,-10443.3,-2141.1,90.7796,5.92189,'801:0 '),\n+(171,'Deadwind Ravine',0,41,2558,50,60,0,-10607.9,-1904.89,117.201,2.66188,'798:0 799:0 '),\n+(172,'Sleeping Gorge',0,41,2938,50,60,0,-10740.7,-1951.45,121.127,3.69664,'800:0 801:0 '),\n+(173,'Chillwind Camp',0,28,3197,48,56,1,940.955,-1419.2,66.7723,0.796556,'271:0 272:0 334:0 '),\n+(174,'Camp Taurajo',1,17,378,8,20,0,-2352.66,-1921.67,95.7825,1.62324,''),\n+(175,'Splintertree Post',1,331,431,18,30,0,2286.41,-2564.67,105.481,4.11999,'159:0 164:0 '),\n+(176,'The Swarming Pillar',1,1377,3097,53,60,0,-7066.79,731.852,67.2655,1.04864,'177:0 188:0 189:0 205:0 '),\n+(177,'Bones of Grakkarond',1,1377,3257,53,60,0,-7234.61,874.224,0.285286,1.72442,'176:0 188:0 189:0 205:0 '),\n+(178,'Woodpaw Den',1,357,2520,38,50,0,-4835.2,863.048,137.048,3.8637,''),\n+(179,'Revantusk Village',0,47,3317,38,50,5,-573.459,-4590.51,10.4122,3.48476,'407:0 '),\n+(180,'Thorium Point',0,51,1446,43,54,0,-6521.12,-1190.02,309.255,4.39589,'590:0 '),\n+(181,'Morshan Base Camp',1,17,1599,8,20,0,1035.13,-2113.34,122.947,5.1989,'182:0 '),\n+(182,'Silverwing Grove',1,331,3319,18,30,0,1462.48,-1858.93,123.55,1.74032,'163:0 167:0 181:0 '),\n+(183,'The Weeping Cave',0,28,198,48,56,0,2249.61,-2389.63,59.8017,5.27414,'244:0 255:0 256:0 '),\n+(184,'Valors Rest',1,1377,3077,53,60,0,-6404.33,-292.647,1.04401,3.06251,'190:0 191:0 '),\n+(185,'Yojamba Isle',0,33,3357,33,45,0,-11838,1268.18,1.74176,4.79629,'894:0 887:0 895:0 896:0 '),\n+(186,'Misty Reed Post',0,8,1978,33,45,4,-10854.8,-4093.43,21.7429,5.03063,'825:0 80:0 826:0 '),\n+(187,'Brackenwall Village',1,15,496,33,45,0,-3132.98,-2880.71,34.718,4.58324,'100:0 102:0 '),\n+(188,'Cenarion Hold',1,1377,3425,53,60,0,-6886.15,718.398,42.798,6.10305,'176:0 177:0 189:0 '),\n+(189,'Twilight Base Camp',1,1377,2739,53,60,0,-6996.15,1195.01,11.4959,1.16226,'134:0 176:0 177:0 188:0 202:0 204:0 '),\n+(190,'Staghelm Point',1,1377,3426,53,60,0,-6517.49,97.5554,126.126,1.85794,'184:0 191:0 '),\n+(191,'Twilights Run',1,1377,3446,53,60,0,-6310.14,136.591,15.4595,2.53339,'184:0 190:0 '),\n+(192,'Ortells Hideout',1,1377,2744,53,60,0,-7586.17,226.396,10.8663,1.24673,'205:0 '),\n+(193,'Bronzebeard Encampment',1,1377,3427,53,60,0,-8021.76,1105.84,3.54927,1.43333,'203:0 '),\n+(194,'Under Attack - Winterspring',1,618,2251,53,60,0,6519.57,-4117.1,661.535,4.32283,'143:0 '),\n+(195,'Under Attack - Azshara',1,16,1222,43,54,0,3366.79,-6226.81,-15.3194,1.50275,'47:0 141:0 '),\n+(196,'BLC1',0,4,4,43,54,0,-11202.2,-3034.46,6.232,1.13173,'839:0 841:0 845:0 852:0 854:0 '),\n+(198,'Under Attack - Tanaris Desert',1,440,440,38,50,0,-8277.12,-3484.09,17.7284,1.51601,''),\n+(199,'Under Attack - Eastern Plaguelands',0,139,2258,53,60,0,2492.32,-3803.41,177.692,4.09879,'248:0 '),\n+(200,'Ivars Patch',0,130,239,8,20,4,1233.05,1214.28,52.5845,3.07876,'201:0 298:0 299:0 303:0 '),\n+(201,'Valgans Field',0,130,227,8,20,4,908.754,1255.63,45.9684,0.575633,'299:0 302:0 303:0 200:0 '),\n+(202,'Sandworm! - A Silithyst beast has surfaced',1,1377,2742,53,60,0,-6548.72,1150.51,-1.23794,4.6252,'134:0 189:0 '),\n+(203,'Sandworm! - A Silithyst beast has surfaced',1,1377,1377,53,60,0,-7786.01,978.815,-2.90318,5.53981,'193:0 '),\n+(204,'Sandworm! - A Silithyst beast has surfaced',1,1377,2743,53,60,0,-7463.3,1411.7,3.70656,4.14577,'189:0 '),\n+(205,'Sandworm! - A Silithyst beast has surfaced',1,1377,2738,53,60,0,-7377.08,447.046,4.53578,2.59898,'176:0 177:0 192:0 '),\n+(211,'Eastwall Tower - Horde',0,139,2271,53,60,0,2550.77,-4783.57,109.501,5.47479,'85:0 235:0 237:0 250:0 '),\n+(215,'Plaguewood Tower - Horde, Progressing',0,139,4067,53,60,0,2991.34,-3045.27,119.143,2.65173,'84:0 241:0 242:0 '),\n+(220,'Northpass Tower - Horde, Contested',0,139,2275,53,60,0,3168.41,-4356.58,138.976,4.89792,'236:0 237:0 238:0 '),\n+(230,'Crown Guard Tower - Alliance',0,139,2263,53,60,0,1861.6,-3701.08,160.834,4.34226,'248:0 247:0 249:0 '),\n+(233,'Mudsprocket',1,15,4010,33,45,0,-4590.83,-3182.5,34.9064,2.13752,'105:0 '),\n+(234,'LightsHopeChapel',0,139,2268,53,60,1,2273.52,-5332.92,88.0978,1.44413,'85:0 252:0 '),\n+(235,'BlackwoodLake',0,139,2624,53,60,0,2464.31,-4192.32,86.7625,5.25334,'211:0 236:0 250:0 '),\n+(236,'EPL_hubN1',0,139,139,53,60,0,2895.84,-4274.37,91.0774,2.94428,'220:0 235:0 237:0 240:0 '),\n+(237,'Northdale',0,139,2272,53,60,0,2939.45,-4922.8,110.201,2.76758,'236:0 211:0 220:0 238:0 '),\n+(238,'ZulMasharEntrance',0,139,2273,53,60,0,3243.57,-4728.42,157.177,1.67982,'237:0 220:0 239:0 '),\n+(239,'MazraAlor',0,139,2274,53,60,0,3446.77,-4987,196.046,5.53613,'238:0 '),\n+(240,'PlaguewoodEast',0,139,2277,53,60,0,3031.09,-3786.79,119.967,4.37961,'236:0 241:0 242:0 '),\n+(241,'PlaguewoodSouth',0,139,2277,53,60,0,2764.18,-3442.19,97.1331,4.24216,'215:0 240:0 242:0 '),\n+(242,'PlaguewoodCenter',0,139,2277,53,60,0,3137.26,-3403.95,139.517,0.937594,'215:0 240:0 241:0 '),\n+(243,'TerrorweTunnelWest',0,139,2619,53,60,0,2724.41,-2453.2,66.836,5.42496,'244:0 84:0 '),\n+(244,'ThondorilRiverSouth',0,139,2619,53,60,0,2417.75,-2469.65,72.4504,0.00296164,'183:0 243:0 245:0 '),\n+(245,'EPL_hubSW',0,139,139,53,60,0,2076.2,-2853.69,86.3391,0.879086,'244:0 246:0 248:0 255:0 '),\n+(246,'EPL_hubSWRoad',0,139,139,53,60,0,1811.3,-3046.98,75.4985,1.09939,'245:0 247:0 255:0 '),\n+(247,'Undercroft',0,139,2261,53,60,0,1600.37,-3283.08,91.4858,0.567285,'246:0 230:0 '),\n+(248,'EPL_hubSW2',0,139,139,53,60,0,2175.83,-3487.76,123.024,5.90406,'199:0 230:0 245:0 '),\n+(249,'EPL_SRoad',0,139,139,53,60,0,1841.76,-4088.5,101.961,5.05584,'230:0 250:0 '),\n+(250,'CorinsCrossing',0,139,2264,53,60,0,2074.45,-4556.23,73.5772,0.745981,'211:0 235:0 249:0 251:0 252:0 '),\n+(251,'ScarletBaseCamp',0,139,2265,53,60,0,1656.05,-4826.35,87.7738,0.384695,'250:0 252:0 253:0 '),\n+(252,'PestilentScar',0,139,2622,53,60,0,2013.6,-4964.85,73.6116,5.58402,'234:0 250:0 251:0 253:0 '),\n+(253,'TyrshandEntrance',0,139,2266,53,60,0,1690.77,-5201.46,74.6226,4.83788,'251:0 252:0 254:0 '),\n+(254,'Tyrshand',0,139,2266,53,60,0,1609.91,-5528.27,111.168,4.2076,'253:0 '),\n+(255,'ThondorilRiverBridge',0,139,2619,53,60,0,1924.72,-2608.2,62.8109,4.6761,'183:0 245:0 246:0 256:0 '),\n+(256,'GahrronWithering',0,28,201,48,56,0,1768.07,-2280.14,59.7087,0.010807,'183:0 255:0 257:0 258:0 '),\n+(257,'WritingHaunt',0,28,202,48,56,0,1506.64,-1862.76,59.0986,5.271,'256:0 258:0 259:0 266:0 269:0 '),\n+(258,'WPL_hubC2',0,28,28,48,56,0,1760.12,-1779.45,64.8245,4.87437,'256:0 257:0 259:0 260:0 266:0 269:0 '),\n+(259,'DalsonTears',0,28,200,48,56,0,1864.12,-1558.81,59.2668,3.44495,'257:0 258:0 260:0 266:0 267:0 269:0 '),\n+(260,'WPL_hubN1',0,28,28,48,56,0,2122.47,-1665.81,64.0458,5.36013,'258:0 259:0 261:0 262:0 '),\n+(261,'NorthridgeLumberCamp',0,28,192,48,56,0,2421.88,-1647.26,103.541,5.77835,'260:0 '),\n+(262,'WPL_hubN2',0,28,28,48,56,0,2425.99,-1947.45,109.098,4.71217,'260:0 263:0 '),\n+(263,'HearthglenTower',0,28,28,48,56,0,2701.43,-1944.23,107.238,0.832291,'262:0 265:0 '),\n+(264,'Hearthglen',0,28,203,48,56,0,2924.12,-1426.31,150.782,1.09736,'265:0 '),\n+(265,'HearthglenEntrance',0,28,190,48,56,0,2782.62,-1612.54,129.551,0.826396,'264:0 263:0 '),\n+(266,'WPL_hubC1',0,28,28,48,56,0,1680.03,-1358.64,69.8578,5.02985,'268:0 257:0 258:0 259:0 267:0 269:0 270:0 274:0 '),\n+(267,'FelstoneField',0,28,199,48,56,0,1795.08,-1188.53,59.8914,5.54821,'268:0 259:0 266:0 269:0 273:0 274:0 '),\n+(268,'AndorhalW',0,28,193,48,56,0,1336.99,-1272.01,57.8614,2.26525,'266:0 267:0 269:0 270:0 272:0 '),\n+(269,'AndorhalNE',0,28,193,48,56,0,1540.11,-1606.19,65.1216,5.937,'257:0 258:0 259:0 266:0 267:0 268:0 270:0 '),\n+(270,'AndorhalEntranceSE',0,28,197,48,56,0,1294.98,-1678.78,62.5727,3.83801,'268:0 266:0 269:0 271:0 '),\n+(271,'SorrowHillCR',0,28,197,48,56,0,1162.78,-1758.3,60.6308,3.04279,'48:0 173:0 270:0 '),\n+(272,'AndorhalEntranceSW',0,28,28,48,56,0,1214.59,-1145.63,60.8962,5.48342,'268:0 173:0 '),\n+(273,'Bulwark',0,28,813,10,56,4,1718.17,-802.509,57.5466,1.68044,'267:0 274:0 275:0 276:0 '),\n+(274,'WPL_hubE',0,28,813,48,56,0,1663.85,-956.731,69.3084,0.651574,'266:0 267:0 273:0 '),\n+(275,'TG_hubSE',0,85,85,1,10,4,1806.63,-369.504,32.3876,6.02566,'273:0 276:0 277:0 '),\n+(276,'BalnirFarmstead',0,85,165,6,10,4,2029.54,-432.459,35.4011,5.30269,'273:0 275:0 277:0 '),\n+(277,'TG_hubC2',0,85,85,1,10,4,2029.86,-87.8105,35.5077,4.49765,'2:0 275:0 276:0 '),\n+(278,'BrillEntrance',0,85,159,1,10,4,2296.05,429.197,35.7333,5.74799,'2:0 279:0 285:0 297:0 '),\n+(279,'GarrensHauntGraves',0,85,85,4,10,4,2599.87,521.024,17.2769,5.97968,'2:0 278:0 280:0 281:0 '),\n+(280,'GarrensHaunt',0,85,164,6,10,4,2883.52,376.589,25.8553,5.87914,'279:0 281:0 284:0 '),\n+(281,'BrightwaterLake',0,85,85,1,10,4,2634.44,79.5244,31.089,6.13244,'2:0 279:0 280:0 282:0 284:0 '),\n+(282,'NorthCoastE',0,85,168,7,10,4,3032.54,-341.266,5.44748,2.52746,'281:0 283:0 '),\n+(283,'NorthCoastC',0,85,168,1,10,4,2935.15,41.7046,6.92148,4.82869,'282:0 284:0 '),\n+(284,'NorthCoastW',0,85,168,1,10,4,2984.21,388.32,7.96326,4.49688,'280:0 281:0 283:0 '),\n+(285,'ColdHearthManor',0,85,166,1,10,4,2107.98,617.879,35.0405,0.497239,'278:0 18:0 286:0 287:0 297:0 '),\n+(286,'TG_hubC1',0,85,85,1,10,0,2204.7,1063.28,28.6853,4.1572,'285:0 287:0 288:0 292:0 294:0 '),\n+(287,'CrusadersOutpost',0,85,85,1,10,0,1797.65,703.831,48.147,1.54771,'286:0 285:0 297:0 '),\n+(288,'TH_hubNE',0,85,85,1,10,4,2446.9,1082.07,58.5203,0.911539,'286:0 289:0 292:0 293:0 294:0 '),\n+(289,'AgamandMillsEntrance',0,85,157,4,10,4,2701.33,937.571,110.912,0.173269,'288:0 290:0 291:0 '),\n+(290,'AgamandMillsW',0,85,157,6,10,4,2889.98,1065.92,105.434,5.38438,'289:0 291:0 '),\n+(291,'AgamandMillsE',0,85,157,6,10,4,2973.71,619.932,93.8373,1.31013,'289:0 290:0 '),\n+(292,'SollidenFarmstead',0,85,156,1,10,4,2329.03,1407.79,33.3337,0.622907,'286:0 288:0 293:0 294:0 '),\n+(293,'CrusadersOutpost',0,85,85,1,10,4,2430.28,1585.02,37.0619,0.587566,'288:0 292:0 '),\n+(294,'UndeadStartExit',0,85,85,5,10,4,2197.51,1192.39,31.5497,5.11342,'288:0 286:0 292:0 295:0 '),\n+(295,'UndeadStartEnd',0,85,154,1,10,4,2061.91,1418.99,63.8379,5.30978,'294:0 83:0 4:0 296:0 '),\n+(296,'UndeadStartE',0,85,154,1,10,4,1805.3,1351.42,87.1354,0.232168,'295:0 4:0 '),\n+(297,'TH_exitS',0,85,85,7,12,4,1642.09,555.658,33.4922,2.88878,'278:0 285:0 287:0 298:0 '),\n+(298,'ShiningStrandN',0,130,927,8,14,4,1331.69,679.903,40.5373,1.02387,'297:0 200:0 '),\n+(299,'DeadField',0,130,240,8,20,4,1076.06,1545.35,28.6412,4.79771,'201:0 300:0 301:0 302:0 303:0 200:0 '),\n+(300,'SkitteringDark',0,130,226,8,20,4,1271.34,1974.49,17.8502,4.31862,'299:0 301:0 '),\n+(301,'NorthTidesHollow',0,130,305,8,20,4,833.25,1880.5,21.9868,5.06279,'299:0 300:0 '),\n+(302,'SPF_hubC1',0,130,130,8,20,4,867.729,1518.72,35.2045,0.160734,'201:0 299:0 303:0 304:0 '),\n+(303,'SPF_hubC2',0,130,130,8,20,4,934.532,1356.51,43.5579,3.0887,'201:0 299:0 302:0 200:0 305:0 '),\n+(304,'SPF_hubC3',0,130,130,8,20,4,736.764,1449.26,64.4284,0.457609,'302:0 305:0 306:0 '),\n+(305,'SPF_hubC4',0,130,130,8,20,4,587.903,1352.93,90.6192,0.359403,'303:0 304:0 306:0 17:0 313:0 '),\n+(306,'DecrepitFerry',0,130,237,13,20,4,664.305,1021.48,45.3265,5.10911,'304:0 305:0 307:0 '),\n+(307,'FenrisIsle',0,130,172,15,20,4,704.961,674.359,43.3624,1.57874,'306:0 308:0 311:0 '),\n+(308,'FenrisIsleSE',0,130,172,15,20,4,653.059,335.097,35.0481,1.33722,'307:0 309:0 '),\n+(309,'FenrisIsleE',0,130,232,16,20,4,866.03,78.8803,34.2361,2.23258,'308:0 310:0 '),\n+(310,'DawningIsles',0,130,232,17,22,4,1199.57,370.42,34.3257,3.13185,'309:0 '),\n+(311,'FenrisKeep',0,130,172,8,20,4,1013.6,734.689,59.2651,3.23986,'307:0 '),\n+(312,'DeepElemMineFork',0,130,213,8,20,4,271.231,1110.33,80.2136,5.99661,'313:0 314:0 317:0 318:0 '),\n+(313,'SPF_hubC5',0,130,130,8,20,4,385.877,1253.37,80.2878,0.320144,'305:0 312:0 315:0 '),\n+(314,'DeepElemMine',0,130,213,8,20,4,376.82,1082.54,106.396,3.03959,'312:0 '),\n+(315,'SPF_hubC6',0,130,130,8,20,4,194.263,1268.01,72.8331,6.23812,'313:0 316:0 317:0 318:0 '),\n+(316,'OlsensFarthing',0,130,229,8,20,4,171.155,1487.65,114.395,4.84404,'315:0 '),\n+(317,'SPF_DalaranCamp1',0,130,130,8,20,4,-50.4703,1331.43,60.9321,5.92005,'315:0 312:0 318:0 319:0 323:0 '),\n+(318,'SPF_hubS1',0,130,130,8,20,4,-132.172,1170.25,63.4384,0.508657,'315:0 317:0 312:0 319:0 323:0 326:0 '),\n+(319,'AmberhillEntrance',0,130,233,11,20,4,-131.822,896.74,65.831,1.54539,'317:0 318:0 320:0 321:0 323:0 325:0 '),\n+(320,'AmberhillHall',0,130,233,13,20,4,-141.972,812.61,63.737,1.09457,'319:0 '),\n+(321,'AmberhillFarms',0,130,233,15,20,4,88.1028,694.265,60.6053,2.4376,'322:0 319:0 '),\n+(322,'AmberhillMurlocCamp',0,130,130,15,20,4,434.265,696.251,33.7837,3.19747,'321:0 '),\n+(323,'SPF_hubS2',0,130,130,8,20,4,-330.828,1311.68,37.1012,1.70757,'317:0 318:0 319:0 324:0 326:0 327:0 '),\n+(324,'PyrewoodVillage',0,130,204,8,20,4,-383.772,1597.45,16.8392,4.90611,'323:0 '),\n+(325,'SPF_exitSE',0,130,130,15,20,4,-543.136,724.877,91.2236,0.975962,'319:0 326:0 357:0 '),\n+(326,'SPF_hubS3',0,130,130,8,20,4,-503.287,1113.31,76.93,0.514545,'318:0 323:0 325:0 '),\n+(327,'GreymaneWall',0,130,230,8,20,4,-744.895,1522.56,15.5245,5.84742,'323:0 '),\n+(328,'DandredsFold',0,36,1682,35,40,0,1235.47,-274.821,40.3856,4.48552,'329:0 '),\n+(329,'UplandsN',0,36,284,28,40,0,1085.27,-663.59,87.8456,1.24773,'328:0 330:0 '),\n+(330,'UplandsS',0,36,284,28,40,0,958.693,-748.597,114.797,4.04964,'329:0 331:0 335:0 '),\n+(331,'Strahnbard',0,36,280,28,40,0,683.909,-963.157,164.301,0.671641,'330:0 332:0 343:0 '),\n+(332,'AM_hubE1',0,36,36,28,40,0,615.654,-1043.7,168.11,0.331968,'331:0 333:0 381:0 '),\n+(333,'AM_hubE2',0,36,1684,36,42,0,640.065,-1460.93,76.3018,6.17925,'332:0 334:0 '),\n+(334,'ChillwindCampRoad',0,28,3197,48,56,0,933.473,-1479.87,62.8272,3.06319,'333:0 173:0 '),\n+(335,'SlaughterHollowNE',0,36,283,28,40,0,802.9,-628.854,149.733,3.01018,'330:0 336:0 337:0 '),\n+(336,'SlaughterHollowN',0,36,283,28,40,0,835.191,-445.445,134.228,4.48673,'335:0 '),\n+(337,'SlaughterHollowC',0,36,281,28,40,0,620.637,-522.586,179.928,5.73159,'335:0 338:0 343:0 '),\n+(338,'RuinsOfAlterac',0,36,281,28,40,0,631.058,-371.491,154.481,2.42898,'340:0 337:0 339:0 '),\n+(339,'RuinsOfAlteracSW',0,36,281,28,40,0,500.776,-173.116,151.449,5.19357,'340:0 338:0 341:0 '),\n+(340,'RuinsOfAlteracSE',0,36,281,28,40,0,397.344,-248.661,161.727,5.94755,'338:0 339:0 '),\n+(341,'RuinsOfAlteracE',0,36,281,28,40,0,573.088,-14.3215,142.366,3.66008,'339:0 342:0 '),\n+(342,'RuinsOfAlteracSSW',0,36,1683,28,40,0,252.323,-82.4394,141.544,0.263228,'341:0 344:0 '),\n+(343,'RuinsOfAlteracE',0,36,1357,28,40,0,493.629,-621.553,172.877,0.602885,'331:0 337:0 344:0 345:0 380:0 '),\n+(344,'RuinsOfAlteracS',0,36,1683,28,40,0,141.788,-316.452,150.648,1.12125,'342:0 343:0 346:0 '),\n+(345,'CorrahnsDagger',0,36,1679,28,40,0,-45.3608,-581.074,153.724,5.82187,'343:0 346:0 380:0 '),\n+(346,'CorrahnsDaggerFork',0,36,1679,28,40,0,57.1052,-405.389,132.108,2.70582,'344:0 345:0 347:0 385:0 '),\n+(347,'Headland',0,36,1680,28,40,0,-163.833,-293.019,151.411,0.123425,'346:0 348:0 '),\n+(348,'GavinsNaze',0,36,1677,28,40,0,-63.0062,-197.056,131.24,2.72704,'347:0 349:0 350:0 355:0 '),\n+(349,'GavinsNazeTop',0,36,1677,28,40,0,-125.184,-59.9939,147.694,5.63693,'348:0 350:0 '),\n+(350,'GavinsNazeW',0,36,279,28,40,0,68.1015,-53.44,99.6287,3.99152,'348:0 349:0 351:0 352:0 353:0 '),\n+(351,'DalaranCraterN',0,36,279,28,40,4,466.751,167.322,41.9053,3.38088,'350:0 352:0 '),\n+(352,'DalaranCraterS',0,36,279,28,40,4,90.2654,237.935,43.2902,5.2894,'351:0 350:0 353:0 354:0 '),\n+(353,'LordamereInternmentCamp',0,36,278,28,40,4,-90.5356,218.366,53.2755,6.11997,'352:0 350:0 354:0 '),\n+(354,'HillsbradFieldsC',0,267,286,18,30,4,-499.681,78.0454,56.6165,0.278575,'352:0 353:0 356:0 355:0 '),\n+(355,'HillsbradFieldsE',0,267,286,18,30,0,-437.039,-135.243,56.2029,2.13409,'354:0 356:0 348:0 385:0 '),\n+(356,'HillsbradFieldsSRoad',0,267,267,18,30,0,-639.845,-98.2014,47.262,0.172558,'358:0 360:0 354:0 357:0 361:0 355:0 385:0 20:0 '),\n+(357,'SouthPointTower',0,267,285,18,30,0,-637.717,273.387,63.926,4.49972,'356:0 325:0 358:0 359:0 '),\n+(358,'WesternStrandW',0,267,295,18,30,0,-979.029,273.179,7.90667,5.62479,'357:0 356:0 359:0 '),\n+(359,'WesternStrandSW',0,267,295,18,30,0,-1128.84,276.704,0.0000662804,5.89576,'357:0 358:0 360:0 '),\n+(360,'WesternStrandS',0,267,295,18,30,0,-1156.55,7.61478,0.00000548363,6.16081,'359:0 356:0 361:0 '),\n+(361,'WesternStrandS',0,267,295,18,30,0,-1102.38,-114.03,0.0000309944,0.148599,'362:0 360:0 356:0 '),\n+(362,'WesternStrandE',0,267,271,18,30,0,-962.262,-506.545,2.13023,1.90396,'361:0 363:0 20:0 '),\n+(363,'SouthshoreS',0,267,271,18,30,0,-974.276,-592.998,0.229758,0.372044,'362:0 364:0 20:0 '),\n+(364,'EasternStrandW',0,267,294,18,30,0,-1012.85,-790.213,9.01406,5.30042,'363:0 365:0 368:0 376:0 '),\n+(365,'EasternStrandC',0,267,294,18,30,0,-1183.14,-847.579,1.43171,6.18988,'364:0 366:0 '),\n+(366,'EasternStrandS',0,267,294,18,30,0,-1311.64,-1052.47,18.2271,0.929683,'365:0 367:0 368:0 '),\n+(367,'DunGarok',0,267,290,18,30,4,-1256.01,-1190.37,38.9786,2.03514,'366:0 368:0 376:0 '),\n+(368,'DunGarokRoad',0,267,267,18,30,0,-1049.49,-1239.84,53.3175,1.75045,'364:0 366:0 367:0 369:0 373:0 '),\n+(369,'HillsbradFoothillsExitSE',0,267,267,18,30,0,-784.955,-1512.45,56.6724,1.97822,'370:0 368:0 373:0 410:0 '),\n+(370,'HillsbradFoothillsExitE',0,267,275,18,30,0,-594.279,-1721.03,62.3187,2.25507,'369:0 371:0 411:0 '),\n+(371,'DurnholdeNE',0,267,275,18,30,0,-383.173,-1720.01,90.0634,3.41784,'372:0 370:0 '),\n+(372,'DurnholdeNNE',0,267,275,18,30,0,-316.76,-1609.34,86.0559,5.49914,'371:0 377:0 386:0 '),\n+(373,'DurnholdeS',0,267,267,18,30,0,-669.891,-1326.66,66.6887,5.65621,'376:0 374:0 368:0 369:0 383:0 '),\n+(374,'DurnholdeInside',0,267,275,18,30,0,-518.661,-1435.16,64.889,2.5637,'373:0 375:0 '),\n+(375,'DurnholdeInsideDeep',0,267,275,18,30,0,-512.473,-1541.62,67.1947,1.69387,'374:0 '),\n+(376,'NethanderStead',0,267,289,18,30,0,-915.831,-926.49,31.1754,1.19711,'364:0 367:0 373:0 383:0 20:0 '),\n+(377,'DurnholdeN',0,267,275,18,30,0,-298.033,-1310.71,76.9034,4.69017,'372:0 378:0 383:0 '),\n+(378,'DurnholdeNN',0,267,267,18,30,0,-37.1467,-1296.59,83.7166,3.13705,'377:0 21:0 '),\n+(379,'TarrenMillN',0,267,267,18,30,4,188.047,-974.547,75.5356,0.0209713,'21:0 381:0 '),\n+(380,'GallowsCorner',0,36,1357,28,40,0,324.254,-615.115,145.246,3.03887,'343:0 345:0 21:0 382:0 '),\n+(381,'SoferasCorner',0,36,36,28,40,0,461.934,-926.633,129.374,2.72668,'379:0 332:0 382:0 '),\n+(382,'SoferasNaze',0,36,1678,28,40,0,248.314,-839.928,146.333,0.818164,'381:0 380:0 '),\n+(383,'HFH_bridge',0,267,267,18,30,0,-487.607,-967.55,34.4918,4.54488,'377:0 376:0 373:0 384:0 '),\n+(384,'DarrowHillE',0,267,267,18,30,0,-323.998,-672.57,54.6417,3.9048,'21:0 383:0 385:0 20:0 '),\n+(385,'DarrowHillW',0,267,1056,18,30,0,-332.483,-447.42,58.4647,0.297842,'346:0 355:0 356:0 384:0 20:0 '),\n+(386,'HinterlandsEntrance',0,47,47,38,50,0,-77.4076,-1845.63,143.116,2.46164,'372:0 55:0 '),\n+(387,'ZunWatha',0,47,352,38,50,0,-11.9998,-2493.37,119.659,1.99629,'55:0 82:0 388:0 391:0 '),\n+(388,'QuelDanilS',0,47,47,38,50,0,65.3995,-2664.2,111.823,5.20269,'55:0 82:0 387:0 389:0 390:0 391:0 392:0 '),\n+(389,'QuelDanil',0,47,350,38,50,4,210.196,-2789.46,122.156,1.50935,'388:0 390:0 392:0 '),\n+(390,'HL_hubW',0,47,47,38,50,0,132.208,-2876.17,116.583,1.69588,'388:0 389:0 392:0 393:0 397:0 398:0 '),\n+(391,'BogensLedge',0,47,1887,38,50,0,-198.398,-2585.67,120.378,6.18051,'387:0 388:0 393:0 '),\n+(392,'HiriWatha',0,47,1885,38,50,0,-35.4616,-2815.33,122.143,0.435323,'389:0 390:0 388:0 393:0 '),\n+(393,'ShadraAlorEntrance',0,47,47,38,50,0,-160.179,-2955.33,115.773,1.96371,'391:0 392:0 390:0 395:0 394:0 396:0 398:0 400:0 '),\n+(394,'ShadraAlorE',0,47,353,38,50,0,-366.126,-2955.41,89.39,6.27554,'393:0 395:0 396:0 '),\n+(395,'ShadraAlorS',0,47,353,38,50,0,-455.461,-2839.4,105.834,6.08704,'393:0 394:0 396:0 '),\n+(396,'ShadraAlorW',0,47,353,38,50,0,-296.621,-2833,96.7074,5.15045,'393:0 395:0 394:0 '),\n+(397,'AgolWatha',0,47,1884,38,50,0,397.177,-3352.2,123.451,2.24644,'390:0 398:0 399:0 '),\n+(398,'CreepingRun',0,47,1886,38,50,0,116.576,-3466.05,107.658,1.12922,'393:0 397:0 390:0 399:0 400:0 401:0 '),\n+(399,'SkulkRock',0,47,351,38,50,0,363.014,-3796.73,171.76,1.54745,'397:0 398:0 401:0 404:0 '),\n+(400,'AltarOfZul',0,47,355,38,50,0,-147.861,-3319.03,121.957,3.93113,'393:0 398:0 '),\n+(401,'HL_hubC',0,47,47,38,50,0,109.926,-3922.75,136.697,0.948588,'398:0 399:0 402:0 403:0 404:0 '),\n+(402,'JinthaAlor',0,47,354,38,50,0,-217.196,-4159.98,118.665,0.453769,'401:0 403:0 '),\n+(403,'OverlookCliffsS',0,47,307,38,50,0,-150.233,-4250.21,120.905,4.17653,'401:0 402:0 405:0 '),\n+(404,'SeradaneBridge',0,47,351,38,50,0,472.513,-3907.18,113.731,5.88677,'399:0 401:0 409:0 '),\n+(405,'OverlookCliffsRampTop',0,47,307,38,50,0,-243.665,-4377.48,105.997,0.98978,'403:0 406:0 '),\n+(406,'OverlookCliffsRampBottom',0,47,307,38,50,0,-3.15739,-4629.26,13.899,2.27391,'405:0 407:0 408:0 '),\n+(407,'RevantuskOutside',0,47,307,38,50,0,-355.789,-4475.87,11.3783,0.924997,'406:0 179:0 '),\n+(408,'OverlookCliffsEnd',0,47,307,38,50,0,133.371,-4745.73,2.05405,2.27392,'406:0 '),\n+(409,'Seradane',0,47,356,60,80,0,755.958,-4011.61,92.8808,5.95432,'404:0 '),\n+(410,'ArathiExitNW',0,45,334,28,40,0,-889.426,-1677.32,57.6111,1.06053,'369:0 411:0 412:0 414:0 '),\n+(411,'ArathiExitN',0,45,45,28,40,0,-684.458,-1831.3,53.3946,0.936824,'370:0 410:0 412:0 413:0 '),\n+(412,'ArathiCW',0,45,45,28,40,0,-863.176,-1785.9,39.6302,5.66886,'410:0 411:0 413:0 414:0 '),\n+(413,'NorthfoldManor',0,45,313,28,40,0,-822.895,-2039.83,34.4558,1.25884,'411:0 412:0 415:0 '),\n+(414,'Arathi_hubW',0,45,45,28,40,0,-1190.48,-1731.63,56.3674,6.26181,'410:0 412:0 415:0 420:0 '),\n+(415,'NorthfoldManor',0,45,313,28,40,0,-933.512,-2120.29,56.5869,2.05011,'78:0 413:0 414:0 416:0 '),\n+(416,'RefugePointeExitN',0,45,315,28,40,0,-1158.07,-2706.9,52.0215,2.18796,'78:0 22:0 415:0 417:0 418:0 419:0 435:0 '),\n+(417,'DabyrieFarmstead',0,45,45,28,40,0,-1091.19,-2856.55,42.4006,1.78073,'416:0 418:0 435:0 436:0 '),\n+(418,'ArathiCO',0,45,336,28,40,0,-1352.09,-2738.95,59.0948,6.08275,'416:0 417:0 419:0 431:0 432:0 435:0 '),\n+(419,'RefugePointeExitS',0,45,45,28,40,0,-1466.43,-2424.6,57.8277,5.98262,'22:0 78:0 416:0 418:0 420:0 427:0 429:0 431:0 '),\n+(420,'StromgardeRoad',0,45,45,28,40,0,-1323.01,-1833.39,63.6564,0.712589,'421:0 414:0 419:0 427:0 '),\n+(421,'StromgardeInside',0,45,324,28,40,0,-1576.29,-1800.48,67.6512,3.46934,'422:0 423:0 424:0 420:0 '),\n+(422,'StromgardeKeep',0,45,324,28,40,0,-1660.06,-1803.63,83.0724,6.27321,'421:0 426:0 '),\n+(423,'StromgardeE',0,45,324,28,40,0,-1602.44,-1922.26,67.2707,1.50115,'421:0 '),\n+(424,'StromgardeW1',0,45,324,28,40,0,-1596.2,-1745.56,67.3627,5.09826,'421:0 425:0 '),\n+(425,'StromgardeW2',0,45,324,28,40,0,-1720.34,-1736.69,52.4064,6.26851,'424:0 81:0 '),\n+(426,'StromgardeKeepSide',0,45,324,28,40,0,-1681.32,-1933.25,80.6272,1.35821,'422:0 '),\n+(427,'ArathiCI',0,45,335,28,40,0,-1517.62,-2100.44,22.3405,4.92548,'419:0 420:0 428:0 '),\n+(428,'ThandolRoadN',0,45,45,28,40,0,-1995.23,-2466.74,78.7992,0.837489,'427:0 429:0 441:0 '),\n+(429,'ArathiRoadSmid',0,45,45,28,40,0,-1763.42,-2422.8,59.5627,0.9015,'419:0 428:0 431:0 430:0 '),\n+(430,'BoulderfistHall',0,45,316,28,40,0,-1941.13,-2794.22,85.7724,0.38314,'429:0 431:0 432:0 '),\n+(431,'Arathi_hubE1',0,45,45,28,40,0,-1570.23,-2675.51,35.6533,6.03014,'419:0 418:0 429:0 432:0 435:0 430:0 '),\n+(432,'Arathi_hubE2',0,45,317,28,40,0,-1705.19,-3021.39,31.689,0.310091,'433:0 418:0 431:0 434:0 430:0 '),\n+(433,'WitherbarkVillage',0,45,317,28,40,0,-1867.12,-3365.42,56.1179,1.07782,'432:0 '),\n+(434,'GoshekFarm',0,45,314,28,40,0,-1526.14,-3075.57,14.1487,2.82925,'432:0 435:0 '),\n+(435,'Arathi_hubNE1',0,45,45,28,40,0,-1297.32,-3141.76,34.9289,1.25489,'416:0 417:0 418:0 431:0 434:0 436:0 438:0 '),\n+(436,'Arathi_hubNE2',0,45,45,28,40,0,-1005.91,-3313.55,55.2766,2.32737,'435:0 417:0 437:0 438:0 '),\n+(437,'ArathiCE',0,45,333,28,40,0,-839.717,-3280.93,78.5616,3.98495,'436:0 438:0 '),\n+(438,'HammerfallEntrance',0,45,321,28,40,0,-1164.53,-3558.81,50.1497,1.47167,'435:0 436:0 437:0 23:0 439:0 '),\n+(439,'DrywhiskerGorgeOutside',0,45,318,28,40,0,-1086,-3696.31,81.3913,2.10981,'438:0 440:0 '),\n+(440,'DrywhiskerGorgeEntrance',0,45,318,28,40,0,-1083.95,-3820.83,128.504,1.71515,'439:0 44:0 '),\n+(441,'ArathiRoadSbottom',0,45,880,28,40,0,-2248.64,-2487.38,80.1236,4.70713,'428:0 442:0 443:0 '),\n+(442,'ThandolSpanCamp',0,45,45,28,40,0,-2249.4,-2633.38,78.816,1.44851,'441:0 '),\n+(443,'ThandolSpanS',0,11,881,18,30,0,-2478.16,-2506.16,78.5672,0.110205,'441:0 444:0 '),\n+(444,'DunModrCamp',0,11,881,18,30,0,-2609.79,-2494.69,80.9667,1.57693,'443:0 6:0 445:0 '),\n+(445,'Wetlands_hubN1',0,11,11,18,30,0,-2937.95,-2470.57,26.6988,6.13028,'444:0 446:0 447:0 461:0 462:0 '),\n+(446,'DaggerforgeHill',0,11,1016,18,30,0,-2859.63,-2907.96,33.1564,1.54551,'445:0 448:0 449:0 '),\n+(447,'WL_hubC1',0,11,11,18,30,0,-3206.06,-2452.65,10.0327,5.76822,'445:0 448:0 455:0 461:0 462:0 '),\n+(448,'Greenwarden',0,11,1025,18,30,0,-3254.89,-2726.4,9.41813,1.21683,'446:0 447:0 449:0 455:0 458:0 '),\n+(449,'WL_hubE1',0,11,11,18,30,0,-3421.46,-3088.4,22.5006,4.5862,'446:0 448:0 450:0 451:0 455:0 456:0 '),\n+(450,'RaptorRidge',0,11,1017,23,30,0,-3132.51,-3240.98,63.5747,2.76015,'449:0 451:0 '),\n+(451,'DragonmawGates',0,11,1038,61,70,0,-3452,-3659.86,58.5533,1.08333,'449:0 450:0 452:0 '),\n+(452,'DragonmawGatesI1',0,11,1038,61,70,0,-3594.66,-4056.85,113.625,1.23963,'451:0 453:0 '),\n+(453,'DragonmawGatesI2',0,11,1038,61,70,0,-3956.61,-4019.52,170.857,6.00896,'452:0 454:0 '),\n+(454,'DragonmawGatesI3',0,11,1037,61,70,0,-4145.01,-3662.88,204.651,5.17056,'92:0 453:0 '),\n+(455,'WL_hubS1',0,11,1020,18,30,0,-3777.35,-2817.99,12.647,0.508038,'447:0 448:0 449:0 456:0 457:0 '),\n+(456,'MosshideFen',0,11,1020,18,30,0,-3913.48,-3043.47,11.7092,0.398469,'449:0 455:0 457:0 '),\n+(457,'ThelgenRock',0,11,1021,18,30,0,-3921.58,-2647.27,36.3203,4.94005,'455:0 456:0 479:0 '),\n+(458,'AngerfangEnampmentE',0,11,1036,18,30,0,-3503.17,-2440.43,48.2306,5.48001,'448:0 459:0 '),\n+(459,'AngerfangEnampmentW',0,11,1036,18,30,0,-3354.34,-2190.82,45.3521,1.88565,'458:0 460:0 461:0 '),\n+(460,'AngerfangEnampmentTop',0,11,1036,18,30,0,-3458.4,-2008.76,119.804,5.31784,'459:0 '),\n+(461,'WL_hubW1',0,11,11,18,30,0,-3186.98,-2117.49,15.8054,4.81126,'445:0 447:0 459:0 462:0 463:0 467:0 '),\n+(462,'IronbeardsTomb',0,11,309,18,30,0,-2861.94,-2217.72,29.2628,4.06121,'445:0 447:0 461:0 463:0 464:0 '),\n+(463,'MosshideWest',0,11,11,18,30,0,-2916.55,-1848.65,10.201,4.36986,'461:0 462:0 464:0 465:0 466:0 467:0 '),\n+(464,'BaradinBayN',0,11,1023,18,30,0,-2598.33,-1745.42,10.159,4.05766,'462:0 463:0 465:0 466:0 '),\n+(465,'BaradinBayNW',0,11,298,18,30,0,-2723.52,-1348.51,9.75282,4.1578,'464:0 463:0 466:0 474:0 '),\n+(466,'BaradinBayW',0,11,1022,18,30,0,-2951.24,-1112.1,9.14625,2.36904,'464:0 463:0 465:0 474:0 475:0 476:0 '),\n+(467,'WhelgarsOutside',0,11,1024,18,30,0,-3208.01,-1693.31,8.6748,4.04314,'461:0 463:0 468:0 473:0 474:0 '),\n+(468,'WhelgarsEntrance',0,11,118,18,30,0,-3328.04,-1856.79,25.9266,3.14189,'467:0 469:0 470:0 '),\n+(469,'WhelgarsBottom',0,11,118,18,30,0,-3540.59,-1803.75,24.3572,5.93869,'468:0 '),\n+(470,'WhelgarsRamp',0,11,118,18,30,0,-3370.49,-1931.82,63.5201,0.805329,'468:0 471:0 '),\n+(471,'WhelgarsRampTop',0,11,118,18,30,0,-3471.16,-1925.52,113.829,3.80162,'470:0 472:0 '),\n+(472,'WhelgarsCave',0,11,118,18,30,0,-3569.75,-1976.96,117.678,0.449137,'471:0 '),\n+(473,'BlueChannelMarsh',0,11,1018,18,30,0,-3582.96,-1324.33,9.39017,5.56012,'467:0 474:0 476:0 '),\n+(474,'BluegillMarsh',0,11,1022,18,30,0,-3135.95,-1301.23,7.27194,1.32132,'465:0 466:0 467:0 473:0 475:0 476:0 '),\n+(475,'BaradinBayS',0,11,298,18,30,0,-3202.27,-925.946,8.88303,5.67636,'466:0 474:0 476:0 '),\n+(476,'MenethilHarborRoad',0,11,1022,18,30,2,-3333.27,-1053.79,8.28482,2.51317,'11:0 466:0 473:0 474:0 475:0 '),\n+(477,'MenethilBayS',0,11,298,18,30,2,-3909.27,-638.054,4.91793,5.35238,'11:0 '),\n+(478,'MenethilBayN',0,11,298,18,30,2,-3732.25,-581.622,4.65228,4.77512,'11:0 '),\n+(479,'DunAlgazBottom',0,11,836,18,30,0,-4086.88,-2624.69,43.3702,1.60133,'457:0 480:0 '),\n+(480,'DunAlgazMid1',0,11,836,18,30,0,-4092.37,-2403.53,100.01,4.74881,'479:0 481:0 '),\n+(481,'DunAlgazMid2',0,11,836,18,30,0,-3994.82,-2377.44,120.415,3.60017,'480:0 482:0 '),\n+(482,'DunAlgazMid3',0,11,836,18,30,0,-4070,-2464.84,155.161,3.20551,'481:0 483:0 '),\n+(483,'DunAlgazMid4',0,11,836,18,30,0,-4418.61,-2470.44,212.203,0.00303268,'482:0 5:0 484:0 '),\n+(484,'DunAlgazMid5',0,11,836,18,30,0,-4453.35,-2691.02,268.159,1.48548,'483:0 485:0 '),\n+(485,'DunAlgazTop',0,38,837,8,20,0,-4741.84,-2699.03,325.269,6.26389,'484:0 91:0 487:0 488:0 '),\n+(486,'NorthGatePassBottom',0,38,838,8,20,2,-4797.55,-2537.41,354.11,2.07534,'91:0 524:0 '),\n+(487,'SilverStreamMine',0,38,149,8,20,2,-4801.44,-2968.22,321.735,1.63004,'91:0 485:0 488:0 '),\n+(488,'StonewroughDamW',0,38,146,8,20,2,-4676.63,-3184.73,310.249,2.0836,'487:0 485:0 489:0 '),\n+(489,'StonewroughDamC',0,38,146,8,20,2,-4761.78,-3306.52,310.258,4.81285,'488:0 490:0 '),\n+(490,'StonewroughDamE',0,38,146,8,20,2,-4680.9,-3464.1,310.208,3.57506,'489:0 491:0 '),\n+(491,'TheLochNE',0,38,38,8,20,2,-4859.79,-3631.09,306.481,2.35809,'490:0 492:0 495:0 496:0 497:0 '),\n+(492,'MogroshStronghold',0,38,143,8,20,2,-4884.91,-3956.61,298.791,3.26837,'491:0 493:0 494:0 495:0 '),\n+(493,'MogroshStrongholdTop',0,38,143,8,20,2,-4853.52,-4046.55,315.354,1.54756,'492:0 '),\n+(494,'LochModanE',0,38,38,8,20,2,-5200.93,-4080.99,324.555,1.53421,'492:0 495:0 512:0 '),\n+(495,'LochModanC2',0,38,38,8,20,2,-5358.15,-3755.11,304.073,5.92655,'491:0 492:0 494:0 496:0 506:0 512:0 '),\n+(496,'LochIsleE',0,38,38,8,20,2,-4983.21,-3478.31,305.5,4.76612,'491:0 495:0 497:0 498:0 '),\n+(497,'LochIsleW',0,38,38,8,20,2,-4869.1,-3302.75,307.516,3.90807,'491:0 496:0 498:0 '),\n+(498,'LochIsleS',0,38,38,8,20,2,-5031.68,-3316.94,298.701,5.51616,'497:0 496:0 499:0 '),\n+(499,'LochC1',0,38,556,8,20,2,-5138.3,-3125.08,302.046,2.10361,'498:0 502:0 '),\n+(500,'LochW1',0,38,38,8,20,2,-5067.56,-2665.82,323.188,6.27801,'91:0 501:0 502:0 '),\n+(501,'LochW2',0,38,38,8,20,2,-5383.73,-2741.02,362.182,0.255963,'500:0 502:0 503:0 '),\n+(502,'LochW3',0,38,38,8,20,0,-5215.01,-2861.61,336.947,0.715418,'91:0 499:0 500:0 501:0 503:0 '),\n+(503,'ThelsamarEntrance',0,38,38,8,20,0,-5405.86,-2884.97,342.8,0.491581,'501:0 502:0 19:0 504:0 515:0 '),\n+(504,'LochC3',0,38,144,8,20,0,-5441.5,-3109.22,349.359,0.721317,'503:0 19:0 505:0 '),\n+(505,'LochS',0,38,38,8,20,0,-5860.82,-3292.84,292.88,5.93047,'504:0 506:0 621:0 '),\n+(506,'IronbandsExcavationOutside',0,38,142,8,20,2,-5617.55,-3680.57,313.913,2.11697,'495:0 505:0 507:0 509:0 '),\n+(507,'IronbandsExcavationSW',0,38,142,8,20,2,-5787.94,-3777.91,328.169,4.57725,'506:0 508:0 510:0 '),\n+(508,'IronbandsExcavationInside1',0,38,142,8,20,2,-5722.82,-3946.06,324.917,2.02667,'507:0 509:0 '),\n+(509,'IronbandsExcavationInside2',0,38,142,8,20,2,-5578.49,-3926.28,327.498,1.64379,'506:0 508:0 '),\n+(510,'LochCornerSE',0,38,147,8,20,2,-5843.55,-4145.23,387.605,1.3532,'507:0 511:0 512:0 '),\n+(511,'FastriderLodgeEntrance',0,38,147,8,20,2,-5555.41,-4251.75,380.644,2.87687,'510:0 512:0 513:0 '),\n+(512,'LochModanSE',0,38,147,8,20,2,-5553.71,-4104.44,372.683,1.01823,'494:0 495:0 510:0 511:0 '),\n+(513,'FarstriderLodge',0,38,147,8,20,2,-5621.61,-4334.97,403.763,0.951478,'511:0 514:0 '),\n+(514,'FarstriderLodgeInside',0,38,147,8,20,3,-5674.26,-4247.48,407.006,5.29276,'513:0 '),\n+(515,'LochModanSW1',0,38,38,8,20,2,-5673.4,-2775.82,363.022,5.89359,'503:0 516:0 519:0 '),\n+(516,'StonesplinterValley1',0,38,923,8,20,2,-5878.01,-2909.13,366.788,0.558766,'515:0 517:0 518:0 '),\n+(517,'StonesplinterValley2',0,38,923,8,20,2,-6057.08,-3024.86,403.365,0.541086,'516:0 '),\n+(518,'StonesplinterValley3',0,38,923,8,20,2,-6077.12,-2770.04,413.566,5.71294,'516:0 '),\n+(519,'LochModanSW2',0,38,924,8,20,2,-5804.6,-2605.8,316.201,6.15474,'515:0 520:0 521:0 '),\n+(520,'LochModanSW3',0,38,924,8,20,2,-6029.33,-2496.11,310.016,2.1924,'519:0 561:0 '),\n+(521,'SouthGatePassBottom',0,38,839,8,20,2,-5690.63,-2589.07,346.087,0.415367,'519:0 522:0 '),\n+(522,'SouthGateOutpost',0,1,806,1,10,0,-5520.09,-2399.78,400.417,2.27487,'521:0 523:0 '),\n+(523,'SouthGatePassTop',0,1,805,1,10,2,-5636.7,-2242.95,424.761,5.34381,'522:0 527:0 69:0 '),\n+(524,'NorthGatePassTop1',0,1,808,1,10,2,-4911.88,-2330.69,408.794,5.22601,'486:0 525:0 '),\n+(525,'NorthGatePassBottom2',0,1,808,1,10,2,-5204.26,-2288.4,400.984,2.97781,'524:0 526:0 '),\n+(526,'NorthGatePassTop2',0,1,807,1,10,2,-5294.53,-2180,423.003,2.8011,'525:0 527:0 '),\n+(527,'DunMoroghPassFork',0,1,1,1,10,2,-5515.28,-2008.17,399.376,4.60752,'526:0 523:0 528:0 '),\n+(528,'DunMoroghE1',0,1,1,1,10,2,-5509.11,-1798.18,397.338,5.99176,'527:0 69:0 529:0 '),\n+(529,'GolBolarFork',0,1,1,1,10,2,-5611.84,-1487.57,399.057,5.05517,'528:0 530:0 533:0 '),\n+(530,'GolBolarCamp',0,1,134,1,10,2,-5711.36,-1562.28,383.568,2.84075,'529:0 531:0 '),\n+(531,'GolBolarQuarry1',0,1,134,1,10,2,-5849.25,-1514.03,358.812,5.96152,'530:0 532:0 '),\n+(532,'GolBolarQuarry2',0,1,134,1,10,2,-5737.17,-1683.52,362.196,6.04595,'531:0 '),\n+(533,'TundridHills',0,1,804,1,10,2,-5651.13,-1033.73,410.816,4.75985,'529:0 534:0 536:0 556:0 '),\n+(534,'Vagash1',0,1,1,1,10,2,-5422.73,-1195.14,450.063,2.06791,'533:0 535:0 '),\n+(535,'Vagash2',0,1,803,1,10,2,-5417.7,-1264.17,446.78,2.22146,'534:0 '),\n+(536,'DunMoroghS1',0,1,1,1,10,2,-5892.71,-628.276,400.121,5.26175,'533:0 537:0 '),\n+(537,'DwarfGnomeStartExit1',0,1,1,1,10,2,-5975.18,-476.82,406.774,5.36188,'536:0 9:0 538:0 '),\n+(538,'DwarfGnomeStartExit2',0,1,1,1,10,2,-6013.25,-224.693,412.196,4.79638,'537:0 539:0 '),\n+(539,'DwarfGnomeStartExit3',0,1,800,1,10,2,-5890.34,69.4737,372.157,4.07706,'538:0 540:0 545:0 546:0 '),\n+(540,'ColdridgePass1',0,1,800,1,10,2,-6066.08,42.2314,408.342,0.120498,'539:0 541:0 '),\n+(541,'ColdridgePass2',0,1,800,4,10,2,-6231.65,125.6,430.753,5.63871,'540:0 542:0 '),\n+(542,'DwarfGnomeStart1',0,1,132,1,10,3,-6261.08,369.552,383.537,4.94484,'541:0 1:0 543:0 544:0 '),\n+(543,'DwarfGnomeStart2',0,1,132,1,10,2,-6482.65,496.244,386.328,5.80485,'542:0 544:0 '),\n+(544,'DwarfGnomeStart3',0,1,132,1,10,2,-6269.69,741.137,386.893,4.77403,'542:0 543:0 '),\n+(545,'GrizzledDen',0,1,136,1,10,2,-5690.95,-281.229,364.314,5.54297,'539:0 9:0 '),\n+(546,'DunMoroghSW1',0,1,1,1,10,2,-5756.39,127.948,368.817,4.07511,'539:0 547:0 548:0 '),\n+(547,'OldIcebeard',0,1,801,1,10,2,-5602.44,-28.5472,416.22,2.31387,'546:0 '),\n+(548,'DunMoroghW1',0,1,135,1,10,2,-5661.62,365.277,393.274,4.27146,'546:0 549:0 550:0 551:0 '),\n+(549,'FrostmaneHold',0,1,135,1,10,2,-5549.4,568.067,394.761,1.30462,'548:0 551:0 '),\n+(550,'GnomereganS',0,1,133,1,10,2,-5183.81,585.068,404.291,4.35,'548:0 551:0 '),\n+(551,'IceflowLake',0,1,211,1,10,2,-5250.86,115.774,394.041,2.85773,'548:0 549:0 550:0 552:0 555:0 '),\n+(552,'ShimmerRidge1',0,1,802,1,10,2,-5266.4,-149.752,437.903,6.01894,'551:0 553:0 '),\n+(553,'ShimmerRidge2',0,1,802,1,10,2,-5088.11,-166.104,442.035,0.727311,'552:0 554:0 555:0 '),\n+(554,'ShimmerRidge3',0,1,802,1,10,2,-5043,-267.85,441.4,2.19994,'553:0 '),\n+(555,'ShimmerRidge4',0,1,802,1,10,2,-5021.64,-132.237,411.899,3.77858,'553:0 551:0 '),\n+(556,'DunmoroghC1',0,1,1,1,10,2,-5391.34,-928.482,393.467,4.06525,'533:0 557:0 '),\n+(557,'IronforgeRamp',0,1,1,1,10,2,-5259.37,-493.579,386.436,3.14828,'556:0 9:0 558:0 '),\n+(558,'IronforgeRampMid',0,1,809,1,10,2,-5197.66,-730.697,445.722,5.89324,'557:0 559:0 '),\n+(559,'IronforgeRampTop',0,1,809,1,10,2,-5060.46,-745.984,480.27,3.47972,'558:0 8:0 '),\n+(560,'IronforgeBank',0,1537,1537,1,60,3,-4909.88,-969.761,501.463,5.46481,'8:0 '),\n+(561,'SGgate',0,51,1959,43,54,0,-6413.58,-2007.56,244.634,2.74852,'520:0 562:0 563:0 '),\n+(562,'DustfireValleyMid',0,51,1959,43,54,0,-6590.48,-1884.27,245.713,1.74321,'561:0 580:0 585:0 '),\n+(563,'SGexitE',0,51,51,43,54,0,-6906.38,-1818.59,241.661,5.89992,'561:0 564:0 566:0 593:0 '),\n+(564,'GrimesiltDigSite',0,51,247,43,54,0,-7019.65,-1698.57,241.667,5.46992,'563:0 565:0 566:0 567:0 568:0 '),\n+(565,'TannerCamp',0,51,1958,43,54,0,-7225.75,-1752.49,244.286,0.924438,'564:0 566:0 567:0 568:0 '),\n+(566,'SGtower4',0,51,1444,43,54,0,-6980,-1505.92,242.742,3.93841,'563:0 564:0 565:0 567:0 568:0 '),\n+(567,'SGtower3',0,51,1444,43,54,0,-7036.7,-1320.2,244.272,4.7631,'565:0 564:0 566:0 568:0 '),\n+(568,'SGsouth1',0,51,1444,43,54,0,-7155.86,-1317.76,242.155,5.03211,'565:0 569:0 567:0 564:0 566:0 '),\n+(569,'BRM_SG1',0,51,1445,43,54,0,-7215.95,-1057.94,242.73,1.72755,'571:0 568:0 570:0 572:0 573:0 '),\n+(570,'BRM_SG2',0,25,25,46,60,0,-7399.25,-1106.95,278.077,0.229401,'569:0 622:0 '),\n+(571,'SGwest1',0,51,51,43,54,0,-7085,-941.753,268.272,4.123,'569:0 572:0 573:0 '),\n+(572,'SGtower2',0,51,51,43,54,0,-7001.07,-1109.84,243.97,2.78587,'571:0 569:0 573:0 '),\n+(573,'SGwest2',0,51,51,43,54,0,-6974.99,-1007.32,241.667,3.29324,'571:0 569:0 572:0 574:0 588:0 '),\n+(574,'CauldronRampTop',0,51,246,43,54,0,-6974.25,-1172.02,228.781,3.87051,'573:0 575:0 '),\n+(575,'CauldronRampMid1',0,51,246,43,54,0,-7024.61,-1220.88,207.974,5.71816,'574:0 576:0 '),\n+(576,'CauldronRampMid2',0,51,246,43,54,0,-6955.19,-1270.62,180.686,0.528642,'575:0 577:0 581:0 '),\n+(577,'CauldronRampBottom',0,51,246,43,54,0,-6866.28,-1410.17,172.855,2.20156,'576:0 578:0 '),\n+(578,'CauldronRamp2Bottom',0,51,246,43,54,0,-6712.76,-1610.77,196.339,2.17329,'577:0 579:0 '),\n+(579,'CauldronRamp2Mid',0,51,246,43,54,0,-6668.28,-1664.76,229.053,1.92432,'578:0 580:0 '),\n+(580,'CauldronRamp2Top',0,51,246,43,54,0,-6680,-1730.07,255.913,4.54363,'562:0 579:0 '),\n+(581,'SlagPit1',0,51,1443,43,54,0,-6850.01,-1218.8,177.395,3.61294,'576:0 582:0 '),\n+(582,'SlagPit2',0,51,1443,43,54,0,-6764.59,-1174.15,187.213,1.12951,'581:0 583:0 '),\n+(583,'SlagPit3',0,51,1443,43,54,0,-6439.47,-1311.02,180.938,2.63197,'582:0 584:0 '),\n+(584,'SlagPit4',0,51,1443,43,54,0,-6631.29,-1289.33,208.714,0.00481129,'583:0 '),\n+(585,'SG_hubN1',0,51,51,43,54,0,-6686.77,-1347.22,247.961,4.79378,'562:0 586:0 588:0 589:0 '),\n+(586,'CauldronTopN',0,51,246,43,54,0,-6862.1,-1188.37,240.366,5.51045,'585:0 '),\n+(587,'FirewatchRidgeBottom',0,51,1442,43,54,0,-6612.66,-860.886,244.297,0.237204,'588:0 589:0 591:0 '),\n+(588,'FirewatchRidgeS',0,51,1442,43,54,0,-6817.17,-866.771,248.462,4.87941,'573:0 585:0 587:0 '),\n+(589,'ThoriumPointRampBottom',0,51,1442,43,54,0,-6608.41,-1025.59,244.328,1.21161,'587:0 585:0 590:0 '),\n+(590,'ThoriumPointRampTop',0,51,1446,43,54,1,-6473.64,-1104.63,303.285,2.64303,'589:0 180:0 '),\n+(591,'FirewatchRidgeTop1',0,51,1442,43,54,0,-6473.38,-887.709,324.088,3.80543,'587:0 592:0 '),\n+(592,'FirewatchRidgeTop2',0,51,1442,43,54,0,-6502.46,-1018.74,344.372,1.2407,'591:0 '),\n+(593,'SGexitEmid',0,51,51,43,54,0,-6952.2,-2064.74,282.478,5.11429,'563:0 594:0 '),\n+(594,'BLexitW',0,3,3,33,45,0,-6885.86,-2233.35,242.64,0.361067,'593:0 595:0 24:0 '),\n+(595,'ApocryphansRest',0,3,337,33,45,0,-6892.26,-2477.47,247.238,1.71982,'594:0 87:0 596:0 597:0 600:0 601:0 602:0 '),\n+(596,'CampCaggS',0,3,344,33,45,0,-7270.91,-2407.34,268.195,5.1163,'595:0 597:0 '),\n+(597,'CampCaggE',0,3,3,33,45,0,-7140.34,-2650.51,243.568,0.467924,'595:0 596:0 602:0 603:0 '),\n+(598,'KargathE',0,3,3,33,45,0,-6600.53,-2373.56,254.037,0.026153,'600:0 599:0 24:0 '),\n+(599,'KargathNE',0,3,3,33,45,0,-6431.02,-2454.24,321.326,3.51922,'598:0 600:0 '),\n+(600,'DustbowlW',0,3,1878,33,45,0,-6718.55,-2572.24,241.801,0.471881,'595:0 598:0 599:0 601:0 602:0 '),\n+(601,'DustbowlNE',0,3,1878,33,45,0,-6653.03,-2889.09,241.667,2.73974,'595:0 600:0 602:0 620:0 '),\n+(602,'BL_hubC',0,3,1879,33,45,0,-6902.56,-2958.24,244.772,1.67356,'600:0 597:0 601:0 595:0 608:0 603:0 '),\n+(603,'AgmondsendS',0,3,345,33,45,0,-7141.97,-3251.77,246.326,0.774282,'597:0 602:0 604:0 605:0 607:0 '),\n+(604,'BL_elemsS',0,3,3,33,45,0,-7319.09,-3144.54,317.901,5.93436,'603:0 '),\n+(605,'AgmondsEnd',0,3,345,33,45,0,-7033.01,-3313.39,238.277,2.5061,'603:0 606:0 607:0 609:0 '),\n+(606,'BL_elemsSE',0,3,3,33,45,0,-7339.37,-3450.9,320.961,0.385524,'605:0 '),\n+(607,'CampBoff',0,3,342,33,45,0,-7039.11,-3655.92,244.152,1.66966,'603:0 605:0 608:0 609:0 '),\n+(608,'BL_hubN1',0,3,1877,33,45,0,-6667.51,-3285.91,241.069,2.14484,'25:0 602:0 607:0 609:0 620:0 '),\n+(609,'BL_hubNE1',0,3,1898,33,45,0,-6775.23,-3555.53,245.004,5.79028,'605:0 607:0 608:0 610:0 617:0 620:0 '),\n+(610,'LethlorRavineEntranceS',0,3,339,38,45,0,-6742.54,-3895.6,264.574,1.61394,'609:0 611:0 '),\n+(611,'LethlorRavineS',0,3,339,38,45,0,-7002.17,-3938.58,263.889,5.47219,'610:0 612:0 '),\n+(612,'LethlorRavineC',0,3,339,38,45,0,-6820.98,-4135.08,263.933,2.32276,'611:0 613:0 '),\n+(613,'LethlorRavineN',0,3,339,38,45,0,-6424.74,-4106.41,263.889,3.0143,'612:0 614:0 '),\n+(614,'LethlorRavineNW',0,3,339,38,45,0,-6513.4,-4004.6,264.394,5.30492,'613:0 615:0 '),\n+(615,'LethlorRavineEntranceN',0,3,339,38,45,0,-6396.09,-3976.18,268.618,3.37284,'614:0 616:0 '),\n+(616,'LethlorRavineExitN',0,3,1898,38,45,0,-6467.07,-3837.32,315.608,5.41801,'615:0 617:0 '),\n+(617,'CampKoshS',0,3,1898,33,45,0,-6360.66,-3685.6,245.154,4.17511,'616:0 609:0 618:0 619:0 '),\n+(618,'CampKosh',0,3,341,33,45,0,-6249.45,-3750.01,243.041,2.72409,'617:0 619:0 '),\n+(619,'HammertoesDigsite',0,3,346,33,45,0,-6349.91,-3447.28,241.681,0.369852,'617:0 618:0 620:0 621:0 '),\n+(620,'BL_hubN2',0,3,338,33,45,0,-6494.59,-3248.21,242.617,1.06886,'25:0 601:0 608:0 609:0 619:0 '),\n+(621,'MakersTerrace',0,3,1897,33,45,0,-6056.99,-3302.11,258.645,3.45646,'86:0 505:0 619:0 '),\n+(622,'BRM_SG3',0,25,25,46,60,0,-7496.19,-1063.83,264.543,4.72301,'570:0 623:0 628:0 '),\n+(623,'BRM_chain1',0,25,25,46,60,0,-7501.48,-1151.43,269.644,1.34305,'622:0 624:0 627:0 '),\n+(624,'BRM_chain2',0,25,25,46,60,0,-7599.78,-1110.62,249.93,1.94977,'623:0 625:0 '),\n+(625,'BRM_chain3',0,25,25,46,60,0,-7523.43,-1048.09,180.912,0.471264,'624:0 626:0 '),\n+(626,'BRM_chain4',0,25,25,46,60,0,-7383.99,-1012.09,173.658,3.00809,'625:0 '),\n+(627,'BRM_BRS1',0,25,25,46,60,0,-7609.9,-1226.43,233.401,0.518375,'623:0 628:0 '),\n+(628,'BRM_BS1',0,25,25,46,60,0,-7697.61,-1089.8,217.609,3.00611,'627:0 622:0 629:0 '),\n+(629,'BRM_BS2',0,25,25,46,60,0,-7769.06,-1129.81,215.084,0.38328,'628:0 630:0 '),\n+(630,'BRM_BS3',0,25,25,46,60,0,-7993.75,-1138.96,163.061,0.128021,'629:0 631:0 637:0 639:0 641:0 '),\n+(631,'DracodarNW',0,46,2421,48,56,0,-7968.74,-817.038,131.202,4.58672,'630:0 632:0 636:0 '),\n+(632,'AltarOfStormsRoad',0,46,46,48,56,0,-7803.25,-717,176.761,6.28318,'631:0 633:0 '),\n+(633,'AltarOfStormsFork',0,46,255,48,56,0,-7679.67,-712.976,183.628,3.3461,'632:0 634:0 635:0 '),\n+(634,'AltarOfStormsVendor',0,46,255,48,56,0,-7644.75,-636.535,200.452,4.00749,'633:0 '),\n+(635,'AltarOfStorms',0,46,255,48,56,0,-7586.74,-773.071,190.859,2.70569,'633:0 '),\n+(636,'DracodarW',0,46,2421,48,56,0,-8170.67,-727.141,135.21,5.81979,'631:0 637:0 '),\n+(637,'DracodarS',0,46,2421,48,56,0,-8255.07,-1040.7,147.3,0.143321,'630:0 636:0 638:0 639:0 '),\n+(638,'DracodarS_hill1',0,46,2421,48,56,0,-8419.15,-933.413,214.705,5.70788,'637:0 '),\n+(639,'DracodarSE',0,46,46,48,56,0,-8254.03,-1168.68,144.64,0.0510463,'630:0 637:0 640:0 641:0 '),\n+(640,'DracodarS_hill2',0,46,46,48,56,0,-8431.62,-1227.92,207.816,0.498725,'639:0 '),\n+(641,'DracodarHub',0,46,46,48,56,0,-8073.86,-1401.78,132.05,4.03301,'630:0 639:0 642:0 644:0 645:0 '),\n+(642,'BlackrockStrongholdOutside',0,46,46,48,56,0,-7757.29,-1591.7,133.263,1.43923,'641:0 643:0 644:0 646:0 '),\n+(643,'BlackrockStrongholdInside',0,46,252,48,56,0,-7698.11,-1443.02,139.787,4.00159,'642:0 '),\n+(644,'PillarOfAshS',0,46,46,48,56,0,-8232.79,-1737.58,147.888,6.17911,'641:0 642:0 645:0 658:0 '),\n+(645,'PillarOfAshE',0,46,253,48,56,0,-8102.12,-1922.65,134.695,1.31201,'641:0 644:0 646:0 647:0 658:0 '),\n+(646,'ThaurissanNW',0,46,250,48,56,0,-7704.8,-2045.32,133.437,1.61634,'642:0 645:0 139:0 647:0 648:0 '),\n+(647,'DreadmaulRockW',0,46,249,48,56,0,-7971.45,-2449.46,130.882,1.47692,'646:0 645:0 648:0 652:0 654:0 658:0 659:0 660:0 '),\n+(648,'DreadmaulRockNW',0,46,249,48,56,0,-7665.96,-2453.95,147.044,2.94798,'647:0 646:0 138:0 649:0 654:0 '),\n+(649,'DreadmaulRockNE',0,46,249,48,56,0,-7765.85,-2707.5,172.836,1.14313,'648:0 650:0 655:0 '),\n+(650,'DreadmaulRockSE',0,46,2420,48,56,0,-8161.75,-2869.02,134.8,0.000368118,'649:0 138:0 651:0 652:0 659:0 '),\n+(651,'MorgansVigil',0,46,2418,48,56,0,-8379.57,-2741.96,186.492,6.13436,'650:0 652:0 659:0 '),\n+(652,'DreadmaulRockTop1',0,46,249,48,56,0,-7971.64,-2664.1,198.213,2.32517,'647:0 650:0 651:0 138:0 653:0 '),\n+(653,'DreadmaulRockTop2',0,46,249,48,56,0,-7873.63,-2613.13,221.072,2.92403,'652:0 '),\n+(654,'DreadmaulRockNWW',0,46,249,48,56,0,-7776.13,-2493.23,160.084,5.03518,'648:0 647:0 '),\n+(655,'DreadmaulRockInside1',0,46,249,48,56,0,-7848.98,-2661.75,172.955,1.73534,'649:0 656:0 657:0 '),\n+(656,'DreadmaulRockInside2',0,46,249,48,56,0,-7961.48,-2603.36,173.834,6.08133,'655:0 '),\n+(657,'DreadmaulRockInside3',0,46,249,48,56,0,-7975.04,-2695.45,157.958,5.80842,'655:0 '),\n+(658,'DreadmaulPassW',0,46,46,48,56,0,-8216.14,-2308.1,151.442,1.03911,'644:0 645:0 647:0 659:0 '),\n+(659,'DreadmaulPassN',0,46,46,48,56,0,-8150.16,-2629.44,133.659,1.18246,'647:0 650:0 651:0 658:0 660:0 '),\n+(660,'DreadmaulPass',0,46,2417,48,56,0,-8431.68,-2546.4,133.207,6.07628,'647:0 659:0 661:0 '),\n+(661,'RedridgeExitN',0,44,44,13,25,0,-8900,-2574.56,131.851,0.152413,'660:0 75:0 663:0 '),\n+(662,'RendersRockInside',0,44,998,13,25,0,-8738.68,-2205.37,149.754,2.59501,'75:0 '),\n+(663,'AlthersMillEntrance',0,44,97,13,25,0,-9153.73,-2628.6,109.561,0.156359,'661:0 664:0 690:0 '),\n+(664,'RedridgeHub1',0,44,44,13,25,0,-9099.79,-2451.23,120.464,0.197585,'663:0 665:0 667:0 669:0 '),\n+(665,'RedridgeBridgeN',0,44,69,13,25,2,-9287.68,-2284.47,67.5443,5.81789,'664:0 10:0 672:0 673:0 '),\n+(666,'RedridgeW',0,44,44,13,25,2,-9312.11,-1873.26,82.1473,5.08747,'10:0 672:0 '),\n+(667,'RedridgeCanyons1',0,44,95,13,25,2,-8916.14,-2305.07,134.682,3.96044,'664:0 668:0 670:0 '),\n+(668,'RedridgeCanyons2',0,44,95,13,25,2,-8864.57,-2150.9,133.327,3.71892,'667:0 669:0 670:0 '),\n+(669,'RedridgeCanyons3',0,44,69,13,25,2,-9145.97,-2198.54,119.516,4.7478,'668:0 664:0 670:0 '),\n+(670,'RedridgeCanyons4',0,44,95,13,25,2,-9135.91,-2029.37,127.775,5.01877,'667:0 668:0 669:0 77:0 '),\n+(671,'RethbanCavernsInside',0,44,98,13,25,0,-8826.83,-1947.01,133.091,2.11555,'77:0 '),\n+(672,'RedridgeBridgeS',0,44,44,13,25,2,-9503.49,-2289.12,74.7234,1.13183,'665:0 666:0 674:0 675:0 '),\n+(673,'EverstillN',0,44,68,13,25,2,-9263.45,-2458.04,56.1636,1.20646,'665:0 '),\n+(674,'ThreeCorners',0,44,1002,13,25,0,-9607.09,-2055.97,65.077,4.99696,'672:0 675:0 692:0 693:0 694:0 '),\n+(675,'RedridgeS1',0,44,1001,13,25,0,-9713.82,-2284.16,63.9369,5.46531,'672:0 674:0 676:0 677:0 '),\n+(676,'RedridgeS2',0,44,68,13,25,0,-9620.32,-2514.61,59.4453,0.974015,'675:0 677:0 '),\n+(677,'RedridgeS3',0,44,1001,13,25,0,-9624.96,-2717.09,56.3955,1.53951,'676:0 675:0 678:0 679:0 691:0 '),\n+(678,'StonewatchS',0,44,70,18,25,0,-9468.55,-3007.78,135.551,1.52185,'677:0 689:0 '),\n+(679,'RedridgeS4',0,44,997,13,25,0,-9751.37,-3185.18,58.6091,5.63735,'677:0 680:0 681:0 '),\n+(680,'RedridgeE1',0,44,997,13,25,0,-9611,-3315.1,49.8404,2.09716,'679:0 681:0 682:0 683:0 684:0 '),\n+(681,'RedridgeE2',0,44,71,13,25,0,-9499.43,-3249.9,50.6,3.02197,'679:0 680:0 '),\n+(682,'RedridgeE3',0,44,44,18,25,0,-9598.71,-3503.57,121.964,2.30923,'680:0 683:0 '),\n+(683,'RedridgeE4',0,44,71,18,25,0,-9465.03,-3460.8,116.076,2.91242,'680:0 682:0 74:0 684:0 '),\n+(684,'RedridgeE5',0,44,71,18,25,0,-9469.61,-3328.04,5.51622,4.94268,'680:0 683:0 '),\n+(685,'RedridgeNE',0,44,1000,18,25,0,-9116.4,-3271.35,104.33,2.00332,'74:0 686:0 687:0 '),\n+(686,'RedridgeE6',0,44,1000,18,25,0,-9317.33,-3210.41,107.191,5.54352,'685:0 74:0 687:0 '),\n+(687,'StonewatchFork',0,44,70,18,25,0,-9195.1,-3020.88,94.6252,4.57746,'686:0 685:0 688:0 689:0 690:0 '),\n+(688,'StonewatchTower',0,44,999,18,25,0,-9297.56,-2958.62,128.754,5.64364,'687:0 689:0 '),\n+(689,'StonewatchTop',0,44,2099,18,25,0,-9364.92,-3072.52,164.756,3.2698,'687:0 688:0 678:0 '),\n+(690,'AlthersMillCenter',0,44,97,13,25,0,-9215.61,-2770.74,89.3399,4.66193,'687:0 663:0 '),\n+(691,'EverstillE',0,44,44,13,25,0,-9457.68,-2870.36,85.486,2.24488,'677:0 '),\n+(692,'ThreeCornersCamp1',0,44,1002,13,25,0,-9472.89,-1956.22,83.561,4.19346,'674:0 693:0 694:0 '),\n+(693,'RedridgeExitW1',0,44,1002,13,25,2,-9620.34,-1809.71,51.8565,1.49408,'692:0 674:0 694:0 696:0 '),\n+(694,'RedridgeExitW2',0,44,1002,13,25,0,-9831.1,-1766.69,23.8242,2.51983,'692:0 674:0 693:0 695:0 792:0 '),\n+(695,'ElwynnHubS1',0,12,798,1,10,2,-9928.36,-1115.12,24.1788,6.21189,'705:0 704:0 694:0 696:0 706:0 '),\n+(696,'ElwynnHubE1',0,12,12,1,10,2,-9659.48,-1341.54,48.8561,4.72993,'693:0 697:0 698:0 704:0 695:0 '),\n+(697,'EastvaleLC1',0,12,88,1,10,2,-9405,-1343.43,50.0284,2.89799,'696:0 698:0 699:0 '),\n+(698,'StoneCairnLakeSE',0,12,86,1,10,2,-9299.52,-1180.36,69.4951,3.31622,'696:0 697:0 699:0 701:0 797:0 '),\n+(699,'StoneCairnLakeNE',0,12,86,1,10,2,-8956.22,-1264.96,77.7779,2.94511,'700:0 697:0 698:0 797:0 '),\n+(700,'StoneCairnLakeNW',0,12,86,1,10,2,-8860.62,-826.796,71.9141,4.57088,'699:0 701:0 797:0 '),\n+(701,'StoneCairnLakeSW',0,12,12,1,10,2,-9355.59,-802.598,64.4981,0.692979,'89:0 700:0 708:0 698:0 705:0 706:0 707:0 797:0 '),\n+(702,'JasperlodeMineInside1',0,12,54,1,10,2,-9125.33,-585.357,58.3507,3.90606,'89:0 703:0 '),\n+(703,'JasperlodeMineInside2',0,12,54,1,10,2,-9049.44,-618.138,53.1456,4.05725,'702:0 '),\n+(704,'ElwynnHubE2',0,12,12,1,10,2,-9613.79,-1100.85,40.5009,4.62273,'696:0 705:0 695:0 '),\n+(705,'ElwynnHubE3',0,12,12,1,10,2,-9618.95,-1024.81,40.4731,4.99973,'704:0 695:0 701:0 706:0 707:0 '),\n+(706,'BrackwellPumpkinPatch',0,12,62,1,10,2,-9777.88,-877.924,39.5328,5.4101,'705:0 701:0 695:0 707:0 '),\n+(707,'ElwynnHubC1',0,12,12,1,10,2,-9609.57,-527.364,55.1285,4.48725,'89:0 708:0 701:0 705:0 706:0 716:0 '),\n+(708,'CrystalLakeE',0,12,18,1,10,2,-9464.16,-422.645,58.9952,3.63313,'89:0 701:0 707:0 709:0 '),\n+(709,'CrystalLakeW',0,12,18,1,10,2,-9470.07,-173.045,59.9322,4.58858,'708:0 710:0 7:0 '),\n+(710,'NorthshireExit',0,12,12,1,10,2,-9133.8,-66.2742,82.4151,1.35237,'709:0 16:0 13:0 7:0 '),\n+(711,'EchoRidgeMineInside',0,12,34,1,10,2,-8560.22,-214.447,85.0045,2.95145,'70:0 '),\n+(712,'TradeDistrict',0,1519,1519,1,60,3,-8794.44,645.505,94.4595,3.54245,'16:0 '),\n+(713,'ForestsEdgeS',0,12,60,1,10,2,-10070.2,658.114,37.3319,5.88491,'72:0 88:0 717:0 '),\n+(714,'FargodeepMineOutside',0,12,57,1,10,2,-9868.23,221.066,14.0194,6.19474,'7:0 71:0 72:0 715:0 '),\n+(715,'FargodeepMineInside',0,12,57,1,10,2,-9779.25,104.966,4.57989,3.01191,'714:0 '),\n+(716,'ElwynnHubS2',0,12,12,1,10,2,-9808.32,-269.092,40.0067,5.15408,'71:0 707:0 '),\n+(717,'ElwynnExitW',0,12,60,1,10,2,-9747.07,741.601,25.5892,4.55914,'7:0 88:0 72:0 713:0 718:0 '),\n+(718,'WestfallExitNE',0,40,916,8,20,2,-9853.3,918.261,30.2216,5.34454,'717:0 719:0 745:0 746:0 '),\n+(719,'Longshore1',0,40,2,8,20,2,-9616.19,1059.16,5.79699,0.013632,'720:0 718:0 745:0 '),\n+(720,'Longshore2',0,40,2,8,20,2,-9634.2,1389.29,9.09694,4.71817,'719:0 721:0 '),\n+(721,'Longshore3',0,40,2,8,20,2,-9648.12,1575.23,3.54258,4.75547,'720:0 722:0 '),\n+(722,'Longshore4',0,40,2,8,20,2,-9776.1,1654.24,11.5179,2.15188,'721:0 723:0 742:0 743:0 '),\n+(723,'Longshore5',0,40,2,8,20,2,-9985.75,1913.6,4.86301,5.35756,'722:0 724:0 742:0 '),\n+(724,'Longshore6',0,40,2,8,20,2,-10334,2061.94,3.69692,5.05125,'723:0 725:0 739:0 '),\n+(725,'Longshore7',0,40,2,8,20,2,-10695.4,2102.07,8.28685,6.14098,'724:0 726:0 738:0 '),\n+(726,'Longshore8',0,40,2,8,20,2,-10975.2,2108.77,-0.213533,6.27058,'725:0 727:0 737:0 '),\n+(727,'Longshore9',0,40,2,8,20,2,-11307.8,1926.18,9.26031,4.25015,'726:0 728:0 '),\n+(728,'Longshore10',0,40,2,8,20,2,-11466.2,1725.82,8.61195,0.641238,'727:0 729:0 '),\n+(729,'DaggerHillsW',0,40,920,8,20,2,-11264.1,1714.56,39.9062,4.76851,'728:0 730:0 737:0 '),\n+(730,'DaggerHillsC1',0,40,920,8,20,2,-11258.8,1470.77,88.9353,4.93148,'729:0 731:0 '),\n+(731,'DaggerHillsC2',0,40,920,8,20,2,-11211.1,1297.89,91.1699,1.90966,'730:0 732:0 733:0 '),\n+(732,'DaggerHillsNook',0,40,920,8,20,2,-11235.2,1182.36,91.6522,1.1871,'731:0 733:0 '),\n+(733,'DaggerHillsE',0,40,920,8,20,2,-11062.7,1163.02,43.0261,2.75789,'736:0 732:0 731:0 734:0 735:0 750:0 '),\n+(734,'DustPlains',0,40,922,8,20,2,-11152,739.176,32.5228,1.40505,'733:0 735:0 750:0 '),\n+(735,'DeadAcre',0,40,917,8,20,2,-10770.8,864.294,33.1505,2.913,'736:0 733:0 734:0 746:0 750:0 '),\n+(736,'WestfallHubC1',0,40,40,8,20,2,-10842.5,1196.94,34.875,1.14192,'12:0 15:0 735:0 733:0 738:0 741:0 750:0 '),\n+(737,'DemontsPlace',0,40,921,8,20,2,-11087.9,1894.97,35.4372,5.06105,'726:0 729:0 12:0 738:0 '),\n+(738,'AlexstonFarmstead',0,40,219,8,20,2,-10615,1671.77,41.41,4.1441,'737:0 725:0 12:0 741:0 742:0 736:0 '),\n+(739,'GoldCoastQuarry',0,40,113,8,20,2,-10403.7,1909.99,9.96272,4.64675,'724:0 740:0 741:0 '),\n+(740,'GoldCoastQuarryInside',0,40,113,8,20,2,-10575.3,1990.25,-8.03668,3.01509,'739:0 '),\n+(741,'WestfallHubC2',0,40,40,8,20,2,-10495.4,1349.24,42.6842,1.76042,'738:0 739:0 15:0 742:0 745:0 736:0 '),\n+(742,'WestfallHubC3',0,40,918,8,20,2,-10274.9,1408.84,38.9079,3.90454,'741:0 738:0 723:0 722:0 15:0 743:0 745:0 '),\n+(743,'JangolodeMine',0,40,111,8,20,2,-10017,1466.37,41.0745,6.08639,'742:0 722:0 744:0 745:0 '),\n+(744,'JangolodeMineInside',0,40,111,8,20,2,-9887.11,1427.15,40.0346,0.896887,'743:0 '),\n+(745,'SaldeansFarm',0,40,107,8,20,2,-10154.1,1116.55,36.8816,1.65283,'15:0 718:0 719:0 741:0 742:0 743:0 746:0 '),\n+(746,'WestfallHubE1',0,40,40,8,20,2,-10333.7,859.579,39.774,0.563072,'15:0 718:0 735:0 745:0 752:0 '),\n+(747,'DefiasHideout',0,1581,1581,15,22,2,-11112,1483.69,32.39,3.56723,'12:0 748:0 '),\n+(748,'Deadmines1',0,1581,1581,15,22,2,-11252.8,1533.82,28.6803,0.814416,'747:0 749:0 '),\n+(749,'Deadmines2',0,1581,1581,15,22,2,-11214.4,1638.37,27.2613,1.55073,'748:0 '),\n+(750,'WestfallExitSE',0,40,40,8,20,2,-10870.3,667.353,30.8385,4.48578,'733:0 734:0 735:0 736:0 15:0 751:0 '),\n+(751,'DuskwoodExitW',0,10,10,18,30,0,-10857.5,557.367,30.4883,6.27453,'750:0 752:0 14:0 753:0 755:0 '),\n+(752,'HushedBankN',0,10,1097,18,30,0,-10326.3,623.959,26.42,3.17024,'746:0 751:0 757:0 758:0 763:0 '),\n+(753,'AddlesSteadW',0,10,536,18,30,0,-11054.9,270.776,25.2035,6.01338,'751:0 14:0 754:0 '),\n+(754,'AddlesSteadE',0,10,536,18,30,0,-10997.4,179.443,30.4059,1.04377,'753:0 14:0 766:0 '),\n+(755,'RHCemetaryS',0,10,492,18,30,0,-10587.6,294.965,31.0441,0.0129175,'751:0 14:0 756:0 757:0 765:0 766:0 '),\n+(756,'RHCemetaryNE',0,10,492,24,30,0,-10398,201.223,34.2462,5.21064,'755:0 757:0 758:0 762:0 764:0 765:0 '),\n+(757,'RHCemetaryW',0,10,492,22,30,0,-10427.4,409.679,46.6267,4.40525,'752:0 755:0 756:0 758:0 759:0 '),\n+(758,'RHCemetaryN',0,10,243,24,30,0,-10308.2,348.036,59.693,3.07006,'752:0 757:0 756:0 '),\n+(759,'DawningWoodCatacombs1',0,10,2098,18,30,0,-10261.5,383.964,10.414,2.92673,'757:0 760:0 '),\n+(760,'DawningWoodCatacombs2',0,10,2098,18,30,0,-10234.6,284.99,2.79944,4.82935,'759:0 761:0 '),\n+(761,'DawningWoodCatacombs3',0,10,2098,18,30,0,-10220.1,166.144,0.047382,3.23144,'760:0 762:0 '),\n+(762,'DawningWoodCatacombs4',0,10,2098,18,30,0,-10338.4,136.513,4.82896,0.380849,'756:0 761:0 '),\n+(763,'DuskwoodNW1',0,10,799,18,30,0,-10173.2,350.099,32.3759,4.62356,'752:0 764:0 '),\n+(764,'DuskwoodNW2',0,10,799,18,30,0,-10183.8,-55.3832,27.6626,5.67208,'763:0 756:0 765:0 793:0 '),\n+(765,'DuskwoodC1',0,10,10,18,30,0,-10482,-16.5716,51.5694,0.81242,'764:0 755:0 756:0 766:0 '),\n+(766,'DuskwoodC2',0,10,10,18,30,0,-10750.8,67.4617,28.3337,1.80202,'765:0 755:0 14:0 754:0 767:0 '),\n+(767,'DuskwoodC3',0,10,10,18,30,0,-10910.1,-371.894,39.8351,3.06651,'766:0 768:0 769:0 773:0 774:0 775:0 779:0 795:0 '),\n+(768,'DuskwoodExitS',0,10,10,18,30,0,-11268.2,-368.936,61.3823,6.14723,'767:0 858:0 '),\n+(769,'VulGolOgreMound1',0,10,93,24,30,0,-11005.9,-176.407,14.5532,5.12818,'767:0 770:0 771:0 '),\n+(770,'VulGolOgreMound2',0,10,93,24,30,0,-10959.3,-38.5543,13.6432,4.44096,'769:0 771:0 '),\n+(771,'VulGolOgreMound3',0,10,93,24,30,0,-11083.6,-80.7448,16.7954,5.39522,'769:0 770:0 772:0 '),\n+(772,'VulGolOgreMoundInside',0,10,93,24,30,0,-11234.1,-172.07,4.22438,4.5174,'771:0 '),\n+(773,'YorgenFarmsteadW',0,10,245,24,30,0,-11096.9,-452.028,32.1764,4.54422,'767:0 774:0 '),\n+(774,'YorgenFarmsteadE',0,10,245,24,30,0,-11052.8,-598.054,29.3447,1.47723,'767:0 773:0 776:0 '),\n+(775,'DuskwoodC4',0,10,10,18,30,0,-10908,-739.892,54.8364,0.583838,'767:0 776:0 778:0 779:0 '),\n+(776,'RottingOrchardW',0,10,241,18,30,0,-10986.3,-770.892,55.1122,1.55183,'774:0 775:0 777:0 778:0 '),\n+(777,'RottingOrchardS',0,10,241,18,30,0,-11103.5,-891.729,62.1149,0.69773,'776:0 778:0 '),\n+(778,'DuskwoodC5',0,10,10,18,30,0,-10823,-837.935,55.75,1.63037,'775:0 776:0 777:0 779:0 780:0 '),\n+(779,'DuskwoodC6',0,10,10,18,30,0,-10768,-644.008,42.2621,2.90859,'767:0 775:0 778:0 786:0 '),\n+(780,'DuskwoodE1',0,10,42,18,30,0,-10757.1,-1156.72,24.9918,1.69202,'778:0 124:0 782:0 783:0 '),\n+(781,'RolandsDoomInside',0,10,2161,24,30,0,-11157.5,-1167.04,42.5151,0.315576,'124:0 '),\n+(782,'TranquilGardensCemetery',0,10,121,18,30,0,-11023.4,-1315.7,53.1833,6.14911,'780:0 783:0 '),\n+(783,'DuskwoodE2',0,10,10,18,30,0,-10813.8,-1366.37,42.2527,0.00140238,'780:0 782:0 3:0 784:0 794:0 '),\n+(784,'DarkshireExitE',0,10,10,18,30,0,-10539.7,-1338.09,48.0906,1.65268,'785:0 783:0 3:0 '),\n+(785,'DuskwoodExitE',0,10,10,18,30,0,-10442.9,-1486.98,73.8977,5.13748,'784:0 798:0 '),\n+(786,'DuskwoodC7',0,10,242,24,30,0,-10451.9,-825.607,50.4132,2.61635,'779:0 787:0 788:0 793:0 '),\n+(787,'DuskwoodC8',0,10,242,24,30,0,-10647.9,-908.344,50.934,5.93661,'786:0 3:0 788:0 '),\n+(788,'DuskwoodNE1',0,10,242,18,30,0,-10219.2,-1021.98,31.9202,2.92658,'786:0 787:0 3:0 789:0 790:0 793:0 '),\n+(789,'ManorMismantle',0,10,1098,24,30,0,-10332.7,-1264.03,35.3024,1.53643,'788:0 3:0 790:0 '),\n+(790,'DuskwoodNE2',0,10,10,18,30,0,-10181.4,-1145.35,24.304,3.28393,'788:0 789:0 791:0 793:0 '),\n+(791,'DuskwoodNE3',0,10,10,18,30,0,-10067.1,-1379.68,29.9246,1.99195,'790:0 792:0 '),\n+(792,'DuskwoodExitNE',0,10,10,18,30,0,-9963.01,-1637.21,27.2574,2.08816,'694:0 791:0 '),\n+(793,'DuskwoodN',0,10,799,18,30,0,-10020.5,-660.012,39.1578,1.66406,'790:0 788:0 764:0 786:0 '),\n+(794,'Naraxis',0,10,10,18,30,0,-10619.4,-1502.44,90.534,3.1465,'783:0 '),\n+(795,'TwilightGroveEntrance',0,10,10,50,60,0,-10718.7,-425.681,126.691,0.442773,'767:0 796:0 '),\n+(796,'TwilightGrove',0,10,856,50,60,0,-10419.3,-421.597,45.6561,3.03852,'795:0 '),\n+(797,'HeroesVigil',0,12,56,1,10,0,-9101.04,-1034.1,72.9837,5.20227,'698:0 699:0 700:0 701:0 '),\n+(798,'DWPExitW',0,41,2697,50,60,0,-10464.2,-1734.78,86.7801,1.49361,'785:0 171:0 802:0 '),\n+(799,'DeadwindRavineSW',0,41,2558,50,60,0,-10919.4,-1957.74,114.777,4.67839,'171:0 800:0 '),\n+(800,'TheViceW',0,41,2561,50,60,0,-10843.3,-2118.87,121.161,1.51324,'799:0 172:0 79:0 '),\n+(801,'DWPExitE',0,41,2938,50,60,0,-10593.5,-2125.78,90.9212,3.83802,'172:0 170:0 802:0 811:0 '),\n+(802,'DeadsmansCrossingE',0,41,41,50,60,0,-10437,-2037.61,94.6245,1.59492,'798:0 801:0 810:0 '),\n+(803,'GroshgokCompoundInside',0,41,2937,50,60,0,-11169.4,-2483.11,105.139,0.944598,'79:0 '),\n+(804,'KarazhanOutskirts',0,41,2562,50,60,0,-11148.9,-2130,55.9803,1.2403,'79:0 805:0 806:0 '),\n+(805,'Karazhan',0,41,2562,50,60,0,-11115.2,-2008.72,48.4017,4.31317,'804:0 806:0 '),\n+(806,'KarazhanCellarEntrance',0,41,2837,50,60,0,-11173.4,-2033.69,47.0759,0.798522,'804:0 805:0 807:0 '),\n+(807,'KarazhanCellar1',0,41,2837,50,60,0,-11100.4,-1963.77,1.93936,4.49657,'806:0 808:0 '),\n+(808,'KarazhanCellar2',0,41,2837,50,60,0,-11159.5,-1898.41,-17.7918,6.21463,'807:0 809:0 '),\n+(809,'KarazhanCellar3',0,41,2837,50,60,0,-11033.9,-1910.04,-32.9889,4.98353,'808:0 '),\n+(810,'DeadmansCrossingBottom',0,41,41,50,60,0,-10282.6,-2019.49,51.0186,2.21028,'802:0 '),\n+(811,'SSExitW',0,8,8,33,45,0,-10546.2,-2376.39,84.2413,1.87648,'801:0 812:0 '),\n+(812,'SSW1',0,8,8,33,45,0,-10381.8,-2424.26,52.7345,2.75809,'811:0 813:0 '),\n+(813,'SSW2',0,8,8,33,45,0,-10427.8,-2549.06,24.1947,5.68762,'812:0 814:0 830:0 '),\n+(814,'IthariusCaveOutside',0,8,1777,33,45,0,-10561.3,-2508.68,22.0709,5.83489,'813:0 815:0 816:0 '),\n+(815,'IthariusCave',0,8,1777,33,45,0,-10677.4,-2531.21,28.912,6.2649,'814:0 '),\n+(816,'SSCRW1',0,8,1780,33,45,0,-10387.5,-2710.03,21.6778,1.56036,'814:0 817:0 818:0 819:0 830:0 '),\n+(817,'MistyValley',0,8,116,33,45,0,-10110,-2413.91,29.9136,4.35049,'816:0 818:0 '),\n+(818,'SSW3',0,8,8,33,45,0,-10320.4,-2794.27,21.9908,1.07734,'817:0 816:0 819:0 820:0 829:0 830:0 '),\n+(819,'Harborage',0,8,657,33,45,3,-10113,-2807.71,22.1444,3.06047,'818:0 816:0 820:0 829:0 '),\n+(820,'SSN1',0,8,1798,33,45,0,-10099.4,-3266.23,20.4381,1.58785,'818:0 819:0 821:0 827:0 828:0 829:0 '),\n+(821,'SSN2',0,8,76,33,45,0,-9974.74,-3687.45,21.6788,2.09247,'820:0 822:0 823:0 827:0 828:0 829:0 '),\n+(822,'SSNE1',0,8,2403,33,45,0,-9634.53,-3969.85,0.0000146627,2.75613,'821:0 823:0 '),\n+(823,'SSNE2',0,8,300,33,45,0,-10034.8,-4306.49,1.78832,0.101491,'822:0 821:0 824:0 826:0 827:0 '),\n+(824,'SSE',0,8,300,33,45,0,-10512,-4371.71,6.04597,6.27469,'823:0 825:0 80:0 826:0 827:0 '),\n+(825,'SSSE',0,8,300,33,45,0,-11038.3,-4116.28,1.98503,5.82703,'186:0 824:0 80:0 '),\n+(826,'PoolOfTearsE',0,8,1778,33,45,0,-10444.5,-4087.57,23.9872,1.47592,'80:0 186:0 823:0 824:0 827:0 '),\n+(827,'PoolOfTearsN',0,8,8,33,45,0,-10147.3,-3802.05,22.1649,2.27113,'820:0 821:0 823:0 824:0 826:0 828:0 829:0 '),\n+(828,'PoolOfTearsW',0,8,8,33,45,0,-10377.4,-3577.61,22.0023,3.94206,'820:0 821:0 827:0 80:0 51:0 829:0 '),\n+(829,'SSC',0,8,1798,33,45,0,-10292.9,-3192.2,22.1489,5.69742,'818:0 819:0 820:0 821:0 827:0 828:0 51:0 830:0 '),\n+(830,'SSExitS',0,8,8,33,45,0,-10553.9,-3043.33,24.794,0.0857489,'813:0 816:0 818:0 829:0 51:0 831:0 '),\n+(831,'SSExitSS',0,4,4,43,54,0,-10690.8,-2978.8,37.8508,5.87412,'830:0 834:0 '),\n+(832,'StagalbogInside1',0,8,1817,33,45,0,-10966.8,-3697.03,11.0105,4.21105,'80:0 833:0 '),\n+(833,'StagalbogInside2',0,8,1817,33,45,0,-10894.6,-3613.42,16.0499,6.1176,'832:0 '),\n+(834,'BLExitN',0,4,4,43,54,0,-10811.4,-2992.21,41.134,0.16765,'831:0 835:0 839:0 846:0 '),\n+(835,'BLNW1',0,4,1437,43,54,0,-11009.6,-2785.5,4.70615,5.63206,'834:0 836:0 839:0 840:0 '),\n+(836,'DreadmaulHoldEntrance',0,4,1437,43,54,0,-10916.9,-2714.76,7.63624,3.85903,'835:0 837:0 838:0 '),\n+(837,'DreadmaulHoldRight',0,4,1437,43,54,0,-10814.2,-2705.35,8.14439,3.20125,'836:0 838:0 '),\n+(838,'DreadmaulHoldLeft',0,4,1437,43,54,0,-10859.8,-2615.61,8.07541,4.52661,'836:0 837:0 '),\n+(839,'BLNW2',0,4,4,43,54,0,-11080.5,-2903.3,9.18506,0.371865,'835:0 834:0 196:0 '),\n+(840,'BLW1',0,4,4,43,54,0,-11249.1,-2724.95,13.3527,2.49675,'835:0 841:0 842:0 '),\n+(841,'DreadmaulPost',0,4,1439,43,54,0,-11528.8,-2858.71,8.50437,6.19557,'840:0 196:0 842:0 856:0 '),\n+(842,'BLAltarOfStormsBottom',0,4,4,43,54,0,-11501.6,-2718.85,5.65372,0.900431,'840:0 841:0 843:0 856:0 '),\n+(843,'BLAltarOfStormsMid',0,4,4,47,54,0,-11381.5,-2566.03,75.8033,3.74358,'842:0 844:0 '),\n+(844,'BLAltarOfStormsTop',0,4,1441,47,54,0,-11255.9,-2556.41,97.0494,2.9896,'843:0 '),\n+(845,'BLE1',0,4,4,43,54,0,-11149.6,-3232.6,8.07553,2.30354,'196:0 846:0 850:0 '),\n+(846,'NethergardeOutside',0,4,1438,43,54,0,-10961.7,-3200.5,45.5708,0.954623,'834:0 845:0 847:0 '),\n+(847,'NethergardeInside1',0,4,1438,43,54,2,-11008.9,-3340.48,64.7225,4.78147,'846:0 848:0 '),\n+(848,'NethergardeInside2',0,4,1438,43,54,3,-10993.2,-3453.24,64.8707,3.21459,'847:0 849:0 '),\n+(849,'NethergardeInside3',0,4,1438,43,54,2,-11112.2,-3438.11,79.0946,6.1402,'848:0 '),\n+(850,'BLE2',0,4,1440,43,54,0,-11310.9,-3410.18,7.46828,4.16649,'845:0 851:0 852:0 '),\n+(851,'BLE2Inside',0,4,1440,43,54,0,-11225.8,-3486.48,8.69295,2.17551,'850:0 '),\n+(852,'BLE3',0,4,4,43,54,0,-11438.8,-3304.34,7.30604,5.76674,'196:0 850:0 853:0 854:0 '),\n+(853,'BLSE',0,4,72,43,54,0,-11632.5,-3381.23,14.577,0.215935,'852:0 854:0 855:0 '),\n+(854,'BLS1',0,4,4,43,54,0,-11607.8,-3099.85,7.81021,5.30924,'196:0 852:0 853:0 855:0 '),\n+(855,'BLS2',0,4,72,43,54,0,-11765.8,-2959.84,7.91609,5.25623,'853:0 854:0 856:0 '),\n+(856,'BLS3',0,4,4,43,54,0,-11716.6,-2785.99,8.27783,3.20635,'855:0 841:0 842:0 857:0 '),\n+(857,'TaintedScar1',0,4,73,55,60,0,-11907.8,-2658.64,-2.15637,5.48008,'856:0 '),\n+(858,'SVExitN',0,33,33,33,45,0,-11362.1,-380.82,64.9035,0.170793,'768:0 859:0 '),\n+(859,'SVExitNFork',0,33,33,33,45,0,-11397.1,-284.376,58.1739,3.29667,'858:0 860:0 861:0 '),\n+(860,'RebelCamp',0,33,99,33,45,3,-11314.2,-182.813,75.1397,3.66777,'859:0 '),\n+(861,'SVEntranceN',0,33,33,33,45,0,-11511.9,-302.586,38.7986,0.353382,'859:0 863:0 864:0 862:0 '),\n+(862,'NesingwarysExpeditionCamp',0,33,100,33,45,0,-11616,-50.0157,10.9823,4.49439,'861:0 879:0 880:0 881:0 901:0 902:0 907:0 '),\n+(863,'SVNBridge1N',0,33,33,33,45,0,-11604.1,-282.333,37.221,5.64107,'861:0 879:0 '),\n+(864,'SVNHubN1',0,33,33,33,45,0,-11643.7,-473.703,17.1608,0.3141,'861:0 865:0 873:0 '),\n+(865,'KurzensCompound',0,33,101,33,45,0,-11604,-644.056,29.157,3.77181,'864:0 866:0 872:0 '),\n+(866,'TheStockpile1',0,33,106,33,45,0,-11461.5,-750.28,30.6105,4.24893,'865:0 867:0 '),\n+(867,'TheStockpile2',0,33,106,33,45,0,-11514.8,-845.839,22.0076,3.08261,'866:0 868:0 869:0 '),\n+(868,'TheStockpile3',0,33,106,33,45,0,-11418.4,-794.929,14.9653,3.89354,'867:0 '),\n+(869,'TheStockpile4',0,33,106,33,45,0,-11506.4,-946.763,29.2275,0.414209,'867:0 870:0 '),\n+(870,'TheStockpile5',0,33,106,33,45,0,-11406.8,-896.737,18.0813,0.89682,'869:0 871:0 '),\n+(871,'TheStockpile6',0,33,106,33,45,0,-11337.1,-985.396,27.3203,1.9202,'870:0 '),\n+(872,'SVNHubN2',0,33,33,33,45,0,-11729.7,-799.127,29.6214,0.89486,'865:0 873:0 875:0 913:0 '),\n+(873,'VentureCoBaseCamp',0,33,1760,33,45,0,-11959.6,-531.751,11.3978,5.11834,'872:0 864:0 874:0 875:0 913:0 '),\n+(874,'SVNHub1',0,33,33,33,45,0,-12225,-546.002,28.8839,0.0407319,'873:0 875:0 911:0 913:0 915:0 '),\n+(875,'SVE1',0,33,33,33,45,0,-12149.1,-965.968,32.4681,1.43677,'872:0 873:0 874:0 876:0 878:0 913:0 '),\n+(876,'MoshoggOgreMound',0,33,105,33,45,0,-12352.7,-972.262,13.1171,5.38338,'875:0 877:0 878:0 913:0 '),\n+(877,'MoshoggOgreMoundInside',0,33,105,33,45,0,-12364,-1147.48,0.104103,2.92311,'876:0 '),\n+(878,'MoshoggOgreMoundUpper',0,33,105,33,45,0,-12466.5,-881.644,39.1084,5.72306,'875:0 876:0 914:0 918:0 '),\n+(879,'SVNBridge1C',0,33,33,33,45,0,-11710.1,-210.005,39.5643,5.90174,'863:0 880:0 862:0 '),\n+(880,'SVNBridge1S',0,33,33,33,45,0,-11818.3,-43.4252,39.7487,5.27146,'879:0 862:0 903:0 905:0 907:0 '),\n+(881,'SVNHubW1',0,33,33,33,45,0,-11518.9,255.102,25.1192,4.23669,'862:0 882:0 883:0 901:0 '),\n+(882,'SVNHubW2',0,33,33,33,45,0,-11502.5,373.117,53.2392,3.3217,'881:0 883:0 '),\n+(883,'ZulKundaNE',0,33,33,33,45,0,-11650.7,401.397,42.8581,5.68183,'881:0 882:0 884:0 889:0 890:0 '),\n+(884,'ZulKundaE',0,33,33,33,45,0,-11785.5,436.17,47.4037,6.2807,'883:0 885:0 889:0 899:0 '),\n+(885,'ZulKundaSE',0,33,33,33,45,0,-11863.3,560.263,47.0214,5.06137,'884:0 886:0 887:0 889:0 '),\n+(886,'ZulKundaS',0,33,33,33,45,0,-11831.5,711.922,45.1329,4.4252,'885:0 888:0 '),\n+(887,'SavageCoastNW1',0,33,301,33,45,0,-11924.1,793.032,3.06387,4.97496,'885:0 894:0 185:0 897:0 898:0 '),\n+(888,'ZulKunda1',0,33,102,33,45,0,-11690.4,742.837,49.7495,3.41987,'886:0 889:0 891:0 '),\n+(889,'ZulKunda2',0,33,102,33,45,0,-11694.8,565.959,49.7011,1.34053,'883:0 884:0 885:0 888:0 890:0 891:0 '),\n+(890,'ZulKunda3',0,33,102,33,45,0,-11550.4,601.183,50.5784,3.11945,'883:0 889:0 891:0 '),\n+(891,'ZulKunda4',0,33,102,33,45,0,-11622.9,760.15,39.7329,0.007312,'888:0 889:0 890:0 892:0 893:0 '),\n+(892,'ZulKunda5',0,33,102,33,45,0,-11528.7,724.898,59.4101,3.50037,'891:0 '),\n+(893,'ZulKundaW',0,33,122,33,45,0,-11572.6,840.524,8.14386,2.72086,'891:0 894:0 '),\n+(894,'SavageCoastNW2',0,33,122,33,45,0,-11692.5,954.651,3.70656,5.00441,'893:0 887:0 185:0 897:0 '),\n+(895,'YojambaIsleW',0,33,3357,33,45,0,-11810.6,1364.62,0.0261903,4.46053,'185:0 '),\n+(896,'YojambaIsleN',0,33,3357,33,45,0,-11748.3,1318.44,5.22585,2.37531,'185:0 '),\n+(897,'VileReefIsle',0,33,301,33,45,0,-12154.2,871.091,18.6659,5.996,'894:0 887:0 '),\n+(898,'SavageCoastW1',0,33,301,33,45,0,-12016.1,440.588,3.35169,0.661185,'887:0 899:0 900:0 '),\n+(899,'SVNWHub1',0,33,33,33,45,0,-11888.7,290.463,12.6077,0.998902,'898:0 884:0 900:0 901:0 902:0 903:0 '),\n+(900,'SavageCoastW2',0,33,33,33,45,0,-12196.8,238.239,2.19021,4.81004,'898:0 899:0 904:0 37:0 '),\n+(901,'SVNHunW3',0,33,100,33,45,0,-11656.6,59.5536,17.3151,1.50941,'899:0 881:0 862:0 902:0 '),\n+(902,'TkashiRuins',0,33,126,33,45,0,-11843.2,59.0602,14.1655,3.34528,'899:0 901:0 862:0 903:0 905:0 '),\n+(903,'KalaiRuins',0,33,125,33,45,0,-12069.3,66.3927,-5.18214,3.5436,'902:0 899:0 880:0 904:0 906:0 '),\n+(904,'SVNHub2',0,33,33,33,45,0,-12283.3,28.601,18.2879,0.246879,'903:0 900:0 37:0 912:0 '),\n+(905,'SVNBridge2N',0,33,33,33,45,0,-11907.9,-50.0313,39.7259,0.870484,'902:0 880:0 906:0 907:0 '),\n+(906,'SVNBridge2S',0,33,33,33,45,0,-12090.1,-139.679,35.2928,0.399245,'903:0 905:0 910:0 '),\n+(907,'SVCHub1',0,33,33,33,45,0,-11853.5,-167.599,15.3333,0.51312,'862:0 880:0 905:0 '),\n+(908,'SavageCoastW3',0,33,301,33,45,0,-12543.1,74.9728,0.873061,0.513523,'37:0 912:0 '),\n+(909,'SavageCoastW4',0,33,1578,33,45,0,-12691.2,142.464,3.092,5.80512,'921:0 924:0 925:0 936:0 '),\n+(910,'SVNBridge3W',0,33,33,33,45,0,-12171.4,-240.719,29.8621,0.766786,'906:0 911:0 912:0 '),\n+(911,'SVNBridge3E',0,33,33,33,45,0,-12157.4,-431.52,30.3485,1.45204,'874:0 910:0 913:0 '),\n+(912,'MizjahRuins',0,33,129,33,45,0,-12468.7,-147.093,13.8431,5.95827,'904:0 908:0 910:0 916:0 '),\n+(913,'SVNHub3',0,33,1740,33,45,0,-12127.6,-649.027,14.8876,2.30225,'874:0 876:0 911:0 873:0 875:0 872:0 '),\n+(914,'BaliamahRuins',0,33,127,33,45,0,-12540.7,-734.478,39.4424,6.20568,'878:0 915:0 917:0 918:0 '),\n+(915,'SVNHub4',0,33,33,33,45,0,-12417,-580.502,11.0755,6.10556,'914:0 874:0 916:0 '),\n+(916,'SVNHub5',0,33,33,33,45,0,-12522,-370.721,12.7107,0.882666,'912:0 915:0 917:0 921:0 '),\n+(917,'ZiatajaiRuins',0,33,128,33,45,0,-12701.1,-464.07,30.0552,6.19787,'914:0 916:0 918:0 920:0 '),\n+(918,'ZulMamweN',0,33,33,33,45,0,-12776.9,-784.489,63.0348,0.421265,'878:0 914:0 917:0 919:0 '),\n+(919,'ZulMamweC',0,33,103,33,45,0,-12985.7,-833.459,69.9343,0.193503,'918:0 920:0 '),\n+(920,'ZulMamweW',0,33,103,33,45,0,-12943.6,-608.837,53.0521,6.05178,'917:0 919:0 '),\n+(921,'SVSHub1',0,33,33,33,45,0,-12826,-301.024,9.96047,5.46666,'916:0 922:0 909:0 925:0 '),\n+(922,'SVSVentureCoMine1',0,33,33,33,45,0,-12978,-452.477,53.6008,5.60214,'921:0 923:0 '),\n+(923,'SVSVentureCoMine2',0,33,33,33,45,0,-13088.9,-466.483,47.2022,3.61705,'922:0 '),\n+(924,'GurubashiArenaOuterN',0,33,1577,33,45,0,-12949,251.702,18.4183,2.2214,'909:0 937:0 '),\n+(925,'STCHub1',0,33,1577,33,45,0,-13136.8,-184.248,-3.10173,5.92455,'909:0 921:0 926:0 929:0 '),\n+(926,'CrystalveinMine1',0,33,310,33,45,0,-13322.7,-420.202,15.4509,2.04861,'925:0 927:0 928:0 929:0 '),\n+(927,'CrystalveinMine2',0,33,310,33,45,0,-13158.5,-564.518,4.64271,0.568135,'926:0 928:0 '),\n+(928,'CrystalveinMine3',0,33,310,33,45,0,-13170,-467.696,3.57551,3.1305,'926:0 927:0 '),\n+(929,'STCHub2',0,33,1577,33,45,0,-13246.3,-110.492,19.5979,5.04296,'926:0 925:0 930:0 '),\n+(930,'GurubashiOuterSE',0,33,1741,33,45,0,-13280.6,57.3154,17.1498,4.95263,'929:0 931:0 932:0 933:0 934:0 '),\n+(931,'GurubashiOuterSSE',0,33,1741,33,45,0,-13402.5,96.0163,23.7905,6.03724,'930:0 932:0 933:0 934:0 935:0 943:0 944:0 '),\n+(932,'RuinsOfJubuwal',0,33,477,33,45,0,-13382.8,-24.5642,22.0332,0.894086,'930:0 931:0 '),\n+(933,'GurubashiArenaInside1',0,33,2177,33,45,0,-13216,312.587,21.8574,3.50161,'930:0 931:0 934:0 '),\n+(934,'GurubashiArenaInside2',0,33,2177,33,45,0,-13163.8,257.166,21.8574,3.62531,'930:0 931:0 933:0 '),\n+(935,'STCHub3',0,33,1577,33,45,0,-13475.6,312.292,31.942,5.22555,'931:0 938:0 942:0 '),\n+(936,'SSavageCoast1',0,33,1578,33,45,0,-12862.3,459.666,6.403,4.74253,'909:0 937:0 '),\n+(937,'GurubashiArenaOuterW',0,33,1741,33,45,0,-13076.6,428.328,24.6507,6.12678,'924:0 936:0 938:0 '),\n+(938,'GurubashiArenaOuterSW',0,33,1577,33,45,0,-13273.2,479.65,3.7542,5.77924,'935:0 937:0 939:0 940:0 '),\n+(939,'BloodsailCompoundW',0,33,1739,33,45,0,-13331.9,777.87,2.16424,3.85895,'938:0 940:0 941:0 '),\n+(940,'BloodsailCompoundC',0,33,1739,33,45,0,-13470.3,687.069,8.46535,3.18977,'938:0 939:0 941:0 '),\n+(941,'SSavageCoast2',0,33,1578,33,45,0,-13705.9,620.54,10.152,3.17013,'939:0 940:0 966:0 968:0 '),\n+(942,'STCHub4',0,33,1577,33,45,0,-13618.7,330.576,43.7429,5.59271,'935:0 943:0 968:0 '),\n+(943,'STCHub5',0,33,1577,33,45,0,-13719.1,129.331,23.7103,3.72188,'931:0 942:0 944:0 964:0 965:0 '),\n+(944,'STCHub6',0,33,1577,33,45,0,-13572.2,-93.8439,42.7481,1.44857,'931:0 943:0 945:0 '),\n+(945,'RuinsOfAboraz',0,33,311,33,45,0,-13627.7,-351.772,12.434,1.10692,'944:0 946:0 '),\n+(946,'CrystalShore1',0,33,302,33,45,0,-13867.2,-89.5993,18.4363,2.92315,'945:0 947:0 964:0 '),\n+(947,'CrystalShore2',0,33,302,33,45,0,-14086.6,-142.781,3.55938,1.30916,'946:0 948:0 '),\n+(948,'WildShore1',0,33,43,33,45,0,-14260.2,-15.7846,3.81308,5.84287,'947:0 949:0 '),\n+(949,'WildShore2',0,33,43,33,45,0,-14293.2,109.305,7.5176,0.82025,'948:0 950:0 962:0 '),\n+(950,'WildShore3',0,33,43,33,45,0,-14585.8,177.319,2.91916,6.15507,'949:0 951:0 952:0 955:0 958:0 '),\n+(951,'WildShore4',0,33,43,33,45,0,-14708.6,511.328,2.52661,5.16547,'950:0 952:0 '),\n+(952,'WildShoreShips1',0,33,43,33,45,0,-14894,302.458,3.67936,4.08476,'950:0 951:0 953:0 954:0 955:0 '),\n+(953,'WildShoreShips1Left',0,33,43,33,45,0,-14940,357.129,0.221882,0.0694,'952:0 '),\n+(954,'WildShoreShips1Right',0,33,43,33,45,0,-15009.9,266.91,0.198072,0.0485881,'952:0 '),\n+(955,'WildShoreShips2',0,33,43,33,45,0,-14843.8,75.9812,2.07268,0.570875,'950:0 952:0 956:0 957:0 '),\n+(956,'WildShoreShips2Center',0,33,43,33,45,0,-14926.8,110.764,0.2001,4.9102,'955:0 '),\n+(957,'JagueroIsle1',0,33,297,33,45,0,-14817.1,-427.547,1.62653,0.804531,'955:0 958:0 '),\n+(958,'JagueroIsle2',0,33,297,33,45,0,-14556.9,-277.709,10.043,3.68499,'950:0 957:0 '),\n+(959,'BootyBayW',0,33,35,33,45,0,-14300.4,523.178,8.69884,4.45859,'36:0 960:0 '),\n+(960,'BootyBayS',0,33,35,33,45,1,-14462.8,467.081,15.1246,5.4423,'36:0 959:0 '),\n+(961,'BootyBayEntrance',0,33,1577,33,45,0,-14249.5,333.168,24.6767,2.49077,'36:0 962:0 967:0 '),\n+(962,'STCHub7',0,33,1577,33,45,0,-14217.2,239.309,20.2817,3.77098,'949:0 961:0 963:0 '),\n+(963,'STCHub8',0,33,1577,33,45,0,-14073.6,266.586,17.42,5.16308,'962:0 964:0 965:0 '),\n+(964,'MistvaleValley',0,33,1737,33,45,0,-13952.8,86.1666,15.8298,5.2161,'76:0 943:0 946:0 963:0 '),\n+(965,'STCHub9',0,33,1577,33,45,0,-13879.6,258.837,17.7662,5.83459,'943:0 963:0 '),\n+(966,'SSavageCoast3',0,33,1578,33,45,0,-13908.6,676.67,10.0579,5.32409,'967:0 941:0 969:0 '),\n+(967,'SSavageCoast4',0,33,1578,33,45,0,-14050.8,500.109,2.8225,0.635261,'961:0 966:0 '),\n+(968,'SSavageCoast5',0,33,1578,33,45,0,-13683.6,505.174,34.349,3.2526,'941:0 942:0 969:0 970:0 '),\n+(969,'SSavageCoast6',0,33,1577,33,45,0,-13859.9,575.635,44.9464,6.06235,'966:0 968:0 '),\n+(970,'SSavageCoast7',0,33,1577,33,45,0,-13849.3,494.156,89.7643,5.84244,'968:0 971:0 '),\n+(971,'SSavageCoast8',0,33,1738,33,45,0,-13806.7,377.83,94.1372,2.10198,'970:0 ');\ndiff --git a/data/sql/custom/db_world/2023_03_22_00_creature_template.sql b/data/sql/custom/db_world/2023_03_22_00_creature_template.sql\nnew file mode 100644\nindex 0000000000..595dce3b7a\n--- /dev/null\n+++ b/data/sql/custom/db_world/2023_03_22_00_creature_template.sql\n@@ -0,0 +1,2 @@\n+--\n+UPDATE `creature_template` SET `subname`='' WHERE (`entry` BETWEEN 70501 AND 70580) AND `subname`='NULL';\ndiff --git a/data/sql/custom/db_world/2023_04_04_00_creature_template_npcbot_wander_nodes.sql b/data/sql/custom/db_world/2023_04_04_00_creature_template_npcbot_wander_nodes.sql\nnew file mode 100644\nindex 0000000000..8d55e92e7c\n--- /dev/null\n+++ b/data/sql/custom/db_world/2023_04_04_00_creature_template_npcbot_wander_nodes.sql\n@@ -0,0 +1,2343 @@\n+--\n+DROP TABLE IF EXISTS `creature_template_npcbot_wander_nodes`;\n+CREATE TABLE `creature_template_npcbot_wander_nodes` (\n+  `id` int(10) unsigned NOT NULL,\n+  `name` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'RENAME_ME',\n+  `mapid` smallint(5) unsigned NOT NULL DEFAULT '0',\n+  `zoneid` int(10) unsigned NOT NULL DEFAULT '0',\n+  `areaid` int(10) unsigned NOT NULL DEFAULT '0',\n+  `minlevel` tinyint(3) unsigned NOT NULL DEFAULT '0',\n+  `maxlevel` tinyint(3) unsigned NOT NULL DEFAULT '0',\n+  `flags` int(10) unsigned NOT NULL DEFAULT '0',\n+  `x` float NOT NULL DEFAULT '0',\n+  `y` float NOT NULL DEFAULT '0',\n+  `z` float NOT NULL DEFAULT '0',\n+  `o` float NOT NULL DEFAULT '0',\n+  `links` mediumtext COLLATE utf8mb4_unicode_ci,\n+  PRIMARY KEY (`id`)\n+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Bot Wander Map';\n+\n+INSERT INTO `creature_template_npcbot_wander_nodes` (`id`,`name`,`mapid`,`zoneid`,`areaid`,`minlevel`,`maxlevel`,`flags`,`x`,`y`,`z`,`o`,`links`) VALUES\n+(1,'Anvilmar',0,1,132,1,5,2,-6077.84,384.826,393.598,4.63263,'542:0 '),\n+(2,'Brill',0,85,159,1,10,5,2249.85,278.414,34.1142,5.11546,'18:0 277:0 278:0 279:0 281:0 '),\n+(3,'Darkshire',0,10,42,18,30,3,-10560.6,-1182.34,27.9637,3.1803,'783:0 784:0 787:0 788:0 789:0 '),\n+(4,'Deathknell',0,85,154,1,10,5,1879.83,1588.2,90.1725,5.25172,'295:0 296:0 '),\n+(5,'Dun Algaz',0,11,836,18,30,0,-4245.13,-2356.42,204.034,3.9477,'483:0 '),\n+(6,'Dun Modr',0,11,205,18,30,0,-2610.26,-2350.56,81.5918,1.1263,'444:0 '),\n+(7,'Goldshire',0,12,87,1,10,3,-9480.09,63.5218,56.1755,3.4173,'88:0 71:0 16:0 42:0 72:0 710:0 709:0 714:0 717:0 '),\n+(8,'Ironforge',0,1,809,1,10,2,-5023.64,-831.425,495.319,5.37056,'559:0 560:0 '),\n+(9,'Kharanos',0,1,131,1,10,3,-5501.22,-472.604,408.453,2.4002,'537:0 545:0 557:0 '),\n+(10,'Lakeshire',0,44,69,13,25,3,-9235.12,-2145.54,71.2121,5.71383,'665:0 666:0 '),\n+(11,'Menethil Harbor',0,11,150,18,30,3,-3672.7,-828.455,9.89925,3.18444,'476:0 477:0 478:0 '),\n+(12,'Moonbrook',0,40,20,8,20,2,-11017.1,1510.17,43.1667,2.58627,'737:0 738:0 736:0 747:0 '),\n+(13,'Northshire Abbey',0,12,9,1,10,3,-8900.51,-116.199,81.8499,0.369434,'710:0 70:0 73:0 '),\n+(14,'Raven Hill',0,10,94,18,30,0,-10805.5,291.025,30.9282,3.92422,'751:0 753:0 754:0 755:0 766:0 '),\n+(15,'Sentinel Hill',0,40,108,8,20,3,-10509.5,1047.74,60.519,5.20046,'741:0 742:0 745:0 746:0 736:0 750:0 '),\n+(16,'Stormwind City',0,12,12,1,10,2,-9153.77,364.057,90.151,5.16709,'42:0 710:0 712:0 7:0 '),\n+(17,'The Sepulcher',0,130,228,8,20,5,470.768,1589.82,126.632,5.16292,'305:0 '),\n+(18,'Undercity',0,85,153,1,10,5,1885.94,236.924,58.0313,3.1016,'2:0 285:0 '),\n+(19,'Thelsamar',0,38,144,8,20,3,-5334.7,-3015.26,324.2,1.73643,'503:0 504:0 '),\n+(20,'Southshore',0,267,271,18,30,3,-803.031,-531.727,15.9656,1.39359,'362:0 363:0 376:0 384:0 385:0 356:0 '),\n+(21,'Tarren Mill',0,267,272,18,30,5,-27.0354,-900.562,55.9602,4.57301,'378:0 380:0 379:0 384:0 '),\n+(22,'Refuge Pointe',0,45,320,28,40,3,-1280.81,-2466.89,34.7175,5.16384,'78:0 416:0 419:0 '),\n+(23,'Hammerfall',0,45,321,28,40,5,-955.494,-3540.82,56.7101,3.23882,'438:0 '),\n+(24,'Kargath',0,3,340,33,45,5,-6625,-2152.82,249.141,4.5492,'594:0 598:0 '),\n+(25,'Angor Fortress',0,3,338,33,45,0,-6392.65,-3158,299.765,4.68826,'608:0 620:0 '),\n+(26,'Bloodhoof Village',1,215,222,1,10,5,-2383.39,-343.878,-0.729101,4.63375,'1817:0 1818:0 1819:0 '),\n+(27,'Camp Narache',1,215,221,1,10,5,-2886.88,-207.003,54.8208,5.16976,'1825:0 1826:0 '),\n+(28,'Razor Hill',1,14,362,1,10,0,311.158,-4740.49,9.58476,2.69842,'1401:0 1402:0 1409:0 '),\n+(29,'The Den',1,14,363,1,10,0,-604.098,-4202.92,38.7281,1.10189,'1431:0 '),\n+(30,'Orgrimmar',1,14,14,1,10,5,1429.15,-4364.86,25.4626,0.273189,'1361:0 '),\n+(31,'Senjin Village',1,14,367,1,10,0,-827.631,-4901.78,19.7839,0.842982,'1413:0 1419:0 1420:0 1421:0 1422:0 '),\n+(32,'The Crossroads',1,17,380,8,25,5,-456.721,-2653.33,95.6449,4.9548,'1487:0 1490:0 1526:0 1535:0 '),\n+(33,'Aldrassil',1,141,256,1,4,2,10318.8,828.943,1326.38,0.947904,'972:0 62:0 974:0 '),\n+(34,'Dolanaar',1,141,186,1,10,3,9809.39,956.34,1308.79,0.244923,'981:0 983:0 985:0 '),\n+(35,'Ratchet',1,17,392,8,25,0,-949.408,-3670.31,9.21524,5.18454,'1475:0 1562:0 1484:0 1618:0 '),\n+(36,'Booty Bay',0,33,35,33,45,0,-14308.8,440.139,25.5878,0.828079,'959:0 960:0 961:0 '),\n+(37,'Gromgol Base Camp',0,33,117,33,45,5,-12416.5,185.125,1.83125,6.17782,'904:0 900:0 908:0 '),\n+(38,'Astranaar',1,331,415,18,30,3,2687.8,-420.338,107.402,0.195851,'1056:0 1055:0 '),\n+(39,'Stonetalon Peak',1,406,467,18,25,3,2693.45,1481.51,235.304,5.88192,'1692:0 1694:0 1690:0 '),\n+(40,'Thalanaar',1,357,489,23,35,3,-4496.36,-778.473,-40.558,2.54579,'2014:0 2019:0 2020:0 2021:0 '),\n+(41,'Freewind Post',1,400,484,23,35,4,-5429.82,-2388.59,89.4787,2.85815,'2104:0 2105:0 '),\n+(42,'Mirror Lake',0,12,92,1,10,2,-9389.26,458.427,38.2852,2.4529,'72:0 16:0 88:0 7:0 '),\n+(44,'Drywhisker Gorge',0,45,318,28,40,0,-1014.22,-3827.39,145.41,2.59534,'440:0 '),\n+(45,'Sun Rock Retreat',1,406,460,13,25,4,946.771,895.865,106.952,1.46258,'1662:0 1663:0 '),\n+(46,'Temple of Zin-Malor',1,16,1223,43,54,0,3549.15,-5359.12,188.348,1.22969,'1325:0 '),\n+(48,'Uthers Tomb',0,28,196,48,56,0,1021.5,-1809.43,77.1448,3.5376,'271:0 '),\n+(50,'Whitereach Post',1,400,2237,23,35,0,-4917.35,-1375.5,-52.612,3.05417,'2034:0 2036:0 2038:0 2040:0 '),\n+(51,'Stonard',0,8,75,33,45,5,-10445,-3261.11,20.179,5.57373,'828:0 829:0 830:0 '),\n+(52,'Gadgetzan',1,440,976,38,50,0,-7145.2,-3724,8.49316,4.91643,'2144:0 2146:0 2147:0 '),\n+(53,'Camp Mojache',1,357,1099,38,50,4,-4402.29,263.941,25.2783,4.51526,'1995:0 1996:0 1997:0 '),\n+(54,'Theramore Isle',1,15,513,33,45,2,-3702.55,-4393.17,15.8191,0.332538,'1882:0 1883:0 '),\n+(55,'Aerie Peak',0,47,348,38,50,0,151.003,-2052.21,117.992,6.03287,'82:0 386:0 387:0 388:0 '),\n+(56,'Everlook',1,618,2255,53,60,0,6726.4,-4671.8,720.854,3.62348,'1218:0 1240:0 '),\n+(57,'Shadowprey Village',1,405,2408,31,40,5,-1591.76,3150,62.5296,3.57741,'1792:0 '),\n+(58,'Feathermoon Stronghold',1,357,1116,38,50,3,-4377.97,3297.09,28.7853,5.12409,'1940:0 1941:0 1939:0 '),\n+(59,'Auberdine',1,148,442,8,20,0,6300.77,315.841,22.9342,5.97913,'993:0 994:0 1008:0 1010:0 1011:0 1012:0 '),\n+(60,'Nijels Point',1,405,608,28,40,3,164.433,1335.57,197.473,2.41439,'1716:0 '),\n+(62,'Shadowthread Cave',1,141,257,1,4,2,10749.1,923.327,1336.99,6.25796,'33:0 972:0 973:0 '),\n+(63,'Fel Rock',1,141,258,1,10,2,10038.9,1030.06,1329.12,0.362337,'983:0 984:0 '),\n+(64,'Banethil Barrow Den',1,141,736,4,10,2,9972.27,1541.52,1308.75,3.05312,'985:0 986:0 987:0 '),\n+(66,'DurotarCanyon1_1',1,14,410,1,10,0,622.608,-4563.33,7.7631,0.614446,'1372:0 1373:0 1374:0 '),\n+(67,'Torkren Farm',1,14,2979,1,10,0,723.247,-4242.04,17.2031,4.54537,'1372:0 1373:0 1385:0 1392:0 1400:0 '),\n+(69,'Ironbands Compound',0,1,716,1,10,2,-5858.7,-2004.1,401.648,0.478922,'523:0 528:0 '),\n+(70,'Echo Ridge Mine',0,12,34,1,10,2,-8691.38,-113.152,89.09,5.86134,'73:0 13:0 711:0 '),\n+(71,'Maclure Vineyards',0,12,64,1,10,2,-9948.39,69.1568,33.3005,5.49869,'72:0 7:0 714:0 716:0 '),\n+(72,'Stonefield Farm',0,12,63,1,10,2,-9901.14,378.19,35.2801,5.75613,'71:0 7:0 42:0 88:0 713:0 714:0 717:0 '),\n+(73,'Northshire Vineyards',0,12,59,1,10,2,-9067.35,-333.965,73.4519,1.09469,'70:0 13:0 '),\n+(74,'Tower of Ilgalar',0,44,96,18,25,0,-9282.21,-3330.43,115.604,1.41034,'683:0 685:0 686:0 '),\n+(75,'Renders Rock',0,44,998,13,25,0,-8677.89,-2302.91,155.917,1.18325,'661:0 662:0 '),\n+(76,'Spirit Den',0,33,1742,33,45,0,-13751.4,-18.3165,44.0002,0.851192,'964:0 '),\n+(77,'Rethban Caverns',0,44,98,13,25,2,-8976.38,-2016.83,136.063,1.26142,'670:0 671:0 '),\n+(78,'Boulderfist Outpost',0,45,1858,28,40,0,-1183.46,-2180.67,55.5524,1.6849,'22:0 415:0 416:0 419:0 '),\n+(79,'Groshgok Compound',0,41,2937,50,60,0,-11094.7,-2311.06,117.13,4.77931,'800:0 803:0 804:0 '),\n+(80,'Stagalbog Cave',0,8,1817,33,45,0,-10775.6,-3747.85,22.347,3.74768,'186:0 825:0 824:0 826:0 828:0 832:0 '),\n+(81,'The Tower of Arathor',0,45,324,28,40,0,-1760.68,-1537.05,64.8696,2.02383,'425:0 '),\n+(82,'Wildhammer Keep',0,47,349,38,50,3,250.073,-2203.83,125.172,0.474207,'55:0 387:0 388:0 '),\n+(83,'Night Webs Hollow',0,85,155,1,10,4,2053.22,1802.16,99.8006,1.83635,'295:0 '),\n+(84,'Terrorweb Tunnel',0,139,2626,53,60,0,3035.33,-2773.9,100.473,5.05065,'215:0 243:0 '),\n+(85,'Browman Mill',0,139,2269,53,60,0,2475.41,-5143.98,77.5041,5.20031,'234:0 211:0 '),\n+(86,'Uldaman',0,3,1337,33,45,0,-6092.01,-3179.35,255.852,5.9237,'621:0 '),\n+(87,'Dustbelch Grotto',0,3,347,33,45,0,-7299.86,-2270.26,244.599,3.07308,'595:0 '),\n+(88,'Westbrook Garrison',0,12,120,1,10,2,-9671.96,690.134,36.5414,5.31336,'72:0 42:0 713:0 7:0 717:0 '),\n+(89,'Jasperlode Mine',0,12,54,1,10,0,-9194.18,-610.205,60.7892,0.426731,'701:0 702:0 707:0 708:0 '),\n+(91,'Algaz Station',0,38,925,8,20,0,-4880.26,-2723,328.908,0.873682,'485:0 486:0 487:0 500:0 502:0 '),\n+(92,'Grim Batol',0,11,1037,61,70,0,-4130,-3468.16,259.76,0.014411,'454:0 '),\n+(93,'Venture Co. Mine',1,215,215,1,10,4,-1466.09,-994.107,148.38,4.09562,'1868:0 '),\n+(94,'Blackwood Den',1,148,455,8,20,0,4626.07,40.557,68.8626,1.32329,'95:0 999:0 1003:0 1006:0 '),\n+(95,'WindbendRiverS',1,148,454,8,20,0,5014.05,224.988,33.2141,0.194282,'996:0 999:0 1005:0 94:0 1006:0 '),\n+(96,'Cliffspring Falls',1,148,445,8,20,0,6878.37,-656.215,84.4074,3.85022,'1019:0 1020:0 1021:0 '),\n+(98,'Wailing Caverns',1,17,718,8,25,0,-868.365,-2044.69,81.6627,1.16842,'1539:0 1540:0 1557:0 1614:0 '),\n+(99,'Shady Rest Inn',1,15,403,33,45,0,-3695.7,-2558.8,61.0548,1.48476,'1872:0 1873:0 1904:0 '),\n+(100,'Darkmist Cavern',1,15,499,33,45,0,-2829.79,-2722.81,36.7883,2.20851,'187:0 102:0 1902:0 '),\n+(101,'North Point Tower',1,15,504,33,45,2,-2869.79,-3419.99,39.3517,3.30334,'102:0 1875:0 1877:0 1878:0 1902:0 '),\n+(102,'Bluefen',1,15,507,33,45,0,-2695.87,-3011.4,41.88,2.01726,'100:0 187:0 1874:0 101:0 1875:0 1902:0 '),\n+(103,'Lost Point',1,15,506,33,45,0,-3917.65,-2833.95,42.7963,4.55319,'1873:0 1904:0 1907:0 1908:0 1909:0 '),\n+(104,'Tidefury Cove',1,15,517,33,45,0,-4414.52,-4100.84,6.37542,0.28057,'106:0 1912:0 '),\n+(105,'Stonemaul Ruins',1,15,508,33,45,0,-4346.02,-3321.15,34.2542,6.16796,'106:0 233:0 1906:0 1907:0 1909:0 '),\n+(106,'Onyxias Lair',1,15,511,33,45,0,-4638.56,-3708.98,38.6239,2.33441,'233:0 105:0 1910:0 1911:0 104:0 '),\n+(107,'Emberstrifes Den',1,15,2158,33,45,0,-4956.66,-3850.19,43.6067,2.10466,'1910:0 1911:0 '),\n+(108,'Bloodfen Burrow',1,15,498,33,45,0,-4335.04,-2639.53,38.0638,1.30845,'1908:0 1909:0 '),\n+(109,'Sentry Point',1,15,503,33,45,0,-3410.26,-4186.35,10.7187,3.27073,'1881:0 1882:0 '),\n+(110,'Swamplight Manor',1,15,497,33,45,0,-2949.47,-3893.5,35.0303,1.23141,'1877:0 1878:0 1879:0 1880:0 '),\n+(111,'Marshals Refuge',1,490,541,46,56,1,-6112.07,-1130.95,-187.426,1.5835,'2245:0 2246:0 '),\n+(112,'Fungal Rock',1,490,542,46,56,0,-6383.04,-1806.79,-266.123,6.01903,'2249:0 2250:0 2251:0 '),\n+(113,'Wavestrider Beach',1,440,988,38,50,0,-7619.63,-4828.43,0.668867,3.36332,'2157:0 2158:0 2159:0 2160:0 '),\n+(114,'Uldum',1,440,989,44,55,0,-9473.22,-2749.02,15.4728,5.89777,'2193:0 2194:0 2195:0 '),\n+(115,'Darkcloud Pinnacle',1,400,2097,23,35,0,-5086.21,-1919.44,88.1806,6.15461,'2071:0 2077:0 2078:0 '),\n+(116,'Roguefeather Den',1,400,487,23,35,0,-5462.36,-1633.26,30.0036,4.16001,'2056:0 2057:0 '),\n+(117,'Mirage Raceway',1,400,2240,23,35,0,-6239.42,-3973.12,-58.7501,5.06259,'122:0 123:0 2136:0 2137:0 118:0 2138:0 '),\n+(118,'The Rustmaul Digsite',1,400,479,23,35,0,-6490.61,-3449.15,-58.7821,3.58106,'117:0 123:0 2138:0 2139:0 '),\n+(119,'Splithoof Hold',1,400,1557,23,35,0,-5071.33,-2349.27,-53.6634,5.48527,'2084:0 2094:0 2112:0 '),\n+(121,'Ironstone Camp',1,400,3037,23,35,0,-5813.18,-3421.49,-50.9325,2.44381,'2131:0 2133:0 122:0 2134:0 2138:0 '),\n+(122,'Weazels Crater',1,400,3038,23,35,0,-5880.19,-3796.15,-59.9445,0.25844,'121:0 2133:0 2134:0 2136:0 117:0 2138:0 '),\n+(123,'Tahonda Ruins',1,400,3039,23,35,0,-6569.91,-3894.97,-58.7495,0.100017,'117:0 2137:0 118:0 2138:0 2140:0 '),\n+(124,'Rolands Doom',0,10,2161,24,30,0,-11045.3,-1130.98,38.585,3.65547,'780:0 781:0 '),\n+(127,'Maraudon',1,405,2100,33,40,0,-1421.88,2905.15,136.781,1.31624,'1786:0 1787:0 '),\n+(128,'Ghost Walker Post',1,405,597,28,40,4,-1258.05,1699.26,89.9098,0.914953,'1765:0 1766:0 1769:0 1776:0 '),\n+(129,'Scrabblescrews Camp',1,405,2617,31,40,0,-1407.87,1493.13,60.8875,4.75641,'1749:0 1750:0 1764:0 1769:0 1770:0 1777:0 1778:0 '),\n+(130,'Valley of Bones',1,405,2657,33,40,0,-2323.83,1355.6,63.5887,1.00444,'1812:0 1813:0 '),\n+(131,'Rage Scar Hold',1,357,1115,38,50,0,-3839.01,1752.22,143.122,4.59397,'1927:0 1928:0 '),\n+(132,'Ruins of Solarsal',1,357,1117,38,50,2,-4932.61,3653.2,12.2193,0.301741,'1940:0 1941:0 140:0 '),\n+(133,'Ravaged Twilight Camp',1,1377,3100,53,60,0,-6206.25,1766.95,17.464,4.2566,'2318:0 2319:0 '),\n+(134,'Twilight Post',1,1377,3098,55,60,0,-6753.94,1661.67,6.34336,0.541008,'2319:0 2320:0 2321:0 2322:0 '),\n+(135,'Twilight Outpost',1,1377,3099,55,60,0,-7929.11,1833.28,4.86506,0.733634,'2336:0 2337:0 2338:0 '),\n+(136,'Woodpaw Hills',1,357,2519,38,50,0,-4867.47,196.488,57.1639,3.31322,'1991:0 1992:0 '),\n+(137,'Lariss Pavillion',1,357,2518,38,50,0,-4097.42,96.644,76.2811,5.8877,'2004:0 2006:0 2007:0 '),\n+(138,'Slither Rock',0,46,2419,48,56,0,-7653.86,-2991.1,135.917,1.62615,'648:0 650:0 652:0 '),\n+(139,'Flame Crest',0,46,251,48,56,5,-7486.64,-2184.45,166.505,5.87909,'646:0 '),\n+(140,'Shalzarus Lair',1,357,3117,38,50,0,-5418.89,3677.45,4.7662,3.81836,'132:0 1942:0 '),\n+(142,'Timbermaw Hold',1,618,618,53,60,0,6889.31,-2300.49,584.754,3.03017,'1196:0 1202:0 '),\n+(143,'The Ruins of KelTheril',1,618,2252,53,60,0,6430.1,-4328.62,666.714,0.935105,'1216:0 '),\n+(144,'Dun Mandarr',1,618,2248,53,60,0,5667.17,-4495.06,769.144,0.689558,'1255:0 1258:0 1259:0 1260:0 '),\n+(145,'Talrendis Point',1,16,3137,43,54,3,2689.78,-3854.8,103.228,5.51976,'1270:0 '),\n+(147,'Moon Horror Den',1,618,3139,53,60,0,7122.72,-4596.74,637.499,3.77862,'1225:0 '),\n+(148,'Timbermaw Hold',1,361,1769,46,56,0,6811.82,-2090.36,625.019,5.71392,'1148:0 1196:0 '),\n+(149,'Irontree Cavern',1,361,1768,46,56,0,6464.49,-1502.77,438.462,4.97283,'1142:0 1143:0 1183:0 1184:0 '),\n+(150,'Bloodvenom Post',1,361,1997,46,56,5,5070.53,-333.931,367.077,5.98328,'1164:0 '),\n+(151,'Sishir Canyon',1,406,2541,13,25,0,599.482,622.34,74.9622,3.1924,'1645:0 '),\n+(152,'Cragpool Lake',1,406,463,13,25,0,1491.34,85.8624,11.9254,3.12763,'1649:0 1650:0 1651:0 1652:0 '),\n+(153,'Windshear Mine',1,406,461,13,25,0,981.949,-358.9,14.3123,3.71479,'1648:0 1654:0 1655:0 '),\n+(154,'The Talondeep Path',1,406,1277,13,25,0,1531.94,-576.57,67.9212,5.18318,'1653:0 1655:0 168:0 '),\n+(155,'The Talon Den',1,406,468,18,25,4,2416.89,1792.39,393.641,3.36062,'1692:0 1693:0 '),\n+(156,'The Ruins of OrdilAran',1,331,412,18,30,0,3476.85,-104.536,2.98631,5.31466,'157:0 1029:0 1031:0 1033:0 '),\n+(157,'Bathrans Haunt',1,331,411,18,30,0,3827.37,-161.305,-0.60768,3.24941,'1028:0 156:0 '),\n+(158,'Zoramgar Outpost',1,331,2897,18,30,5,3362.22,1010.16,3.59814,2.49558,'1035:0 1036:0 1037:0 '),\n+(159,'Falfarren River',1,331,433,18,30,0,2247.11,-2187.63,105.176,0.680699,'1078:0 1079:0 '),\n+(160,'Xavian',1,331,429,18,30,0,2931.82,-2808,212.839,0.056247,'1080:0 1081:0 1085:0 '),\n+(161,'Forest Song',1,331,2358,18,30,3,2936.03,-3270.73,159.15,3.69459,'1085:0 1091:0 1093:0 '),\n+(162,'Demon Fall Canyon',1,331,435,18,30,0,1708.23,-3157.86,94.4801,5.70126,'1099:0 1100:0 1104:0 '),\n+(163,'Silverwing Outpost',1,331,2360,18,30,0,1776.04,-2061.14,106.556,1.50326,'1109:0 '),\n+(164,'The DorDanil Barrow Den',1,331,432,18,30,0,1776.92,-2583.5,85.9882,3.82761,'169:0 1113:0 1115:0 1117:0 '),\n+(165,'Silverwind Refuge',1,331,420,18,30,0,2141.6,-1189.65,96.7733,3.54353,'1063:0 1064:0 1066:0 '),\n+(166,'Greenpaw Village',1,331,2359,18,30,0,2274.68,-1460.01,90.2583,4.48209,'1066:0 1068:0 1069:0 '),\n+(167,'Bloodtooth Camp',1,331,2357,18,30,0,1668.68,-1469.31,140.228,5.79562,'1067:0 '),\n+(168,'The Talondeep Path',1,406,1277,13,25,0,1941.31,-740.96,113.545,2.12791,'154:0 1063:0 '),\n+(169,'Warsong Labor Camp',1,331,3177,18,30,0,1575.91,-2463.94,98.549,2.24558,'164:0 1110:0 '),\n+(170,'Aridens Camp',0,41,2560,50,60,0,-10443.3,-2141.1,90.7796,5.92189,'801:0 '),\n+(171,'Deadwind Ravine',0,41,2558,50,60,0,-10607.9,-1904.89,117.201,2.66188,'798:0 799:0 '),\n+(172,'Sleeping Gorge',0,41,2938,50,60,0,-10740.7,-1951.45,121.127,3.69664,'800:0 801:0 '),\n+(173,'Chillwind Camp',0,28,3197,48,56,3,940.955,-1419.2,66.7723,0.796556,'271:0 272:0 334:0 '),\n+(174,'Camp Taurajo',1,17,378,8,25,5,-2353.97,-1913.23,95.7826,0.204344,'1550:0 1551:0 1553:0 1554:0 1584:0 1585:0 1814:0 '),\n+(175,'Splintertree Post',1,331,431,18,30,5,2251.83,-2538.3,90.4185,6.01297,'1113:0 1114:0 '),\n+(177,'Bones of Grakkarond',1,1377,3257,53,60,0,-7228.09,854.674,-1.38994,1.38965,'2323:0 2324:0 2335:0 2343:0 2348:0 2349:0 2350:0 '),\n+(178,'Woodpaw Den',1,357,2520,38,50,0,-4775.84,905.452,142.986,4.17326,'1980:0 '),\n+(179,'Revantusk Village',0,47,3317,38,50,5,-573.459,-4590.51,10.4122,3.48476,'407:0 '),\n+(180,'Thorium Point',0,51,1446,43,54,0,-6521.12,-1190.02,309.255,4.39589,'590:0 '),\n+(183,'The Weeping Cave',0,28,198,48,56,0,2249.61,-2389.63,59.8017,5.27414,'244:0 255:0 256:0 '),\n+(184,'Valors Rest',1,1377,3077,50,60,0,-6382.38,-308.522,-1.89701,4.0769,'2292:0 2293:0 '),\n+(185,'Yojamba Isle',0,33,3357,33,45,0,-11838,1268.18,1.74176,4.79629,'894:0 887:0 895:0 896:0 '),\n+(186,'Misty Reed Post',0,8,1978,33,45,4,-10854.8,-4093.43,21.7429,5.03063,'825:0 80:0 826:0 '),\n+(187,'Brackenwall Village',1,15,496,33,45,5,-3113.73,-2860.5,34.4097,2.94207,'1873:0 100:0 102:0 '),\n+(188,'Cenarion Hold',1,1377,3425,53,60,3,-6886.15,718.398,42.798,6.10305,'2305:0 2306:0 '),\n+(189,'Twilight Base Camp',1,1377,2739,53,60,0,-6969.25,1167.66,12.8483,1.06764,'2322:0 2323:0 2324:0 2325:0 2335:0 '),\n+(191,'Twilights Run',1,1377,3446,55,60,0,-6332.81,164.268,6.01109,2.33216,'2295:0 2296:0 2297:0 2299:0 '),\n+(192,'Ortells Hideout',1,1377,2744,53,60,0,-7601.34,285.736,2.83228,0.367888,'2349:0 2357:0 2358:0 '),\n+(193,'Bronzebeard Encampment',1,1377,3427,53,60,0,-7993.44,1118.16,-1.76652,1.00873,'2339:0 2340:0 2341:0 2344:0 2347:0 2346:0 '),\n+(196,'BLC1',0,4,4,43,54,0,-11202.2,-3034.46,6.232,1.13173,'839:0 841:0 845:0 852:0 854:0 '),\n+(199,'Under Attack - Eastern Plaguelands',0,139,2258,53,60,0,2492.32,-3803.41,177.692,4.09879,'248:0 '),\n+(200,'Ivars Patch',0,130,239,8,20,4,1233.05,1214.28,52.5845,3.07876,'201:0 298:0 299:0 303:0 '),\n+(201,'Valgans Field',0,130,227,8,20,4,908.754,1255.63,45.9684,0.575633,'299:0 302:0 303:0 200:0 '),\n+(211,'Eastwall Tower - Horde',0,139,2271,53,60,0,2550.77,-4783.57,109.501,5.47479,'85:0 235:0 237:0 250:0 '),\n+(215,'Plaguewood Tower - Horde, Progressing',0,139,4067,53,60,0,2991.34,-3045.27,119.143,2.65173,'84:0 241:0 242:0 '),\n+(220,'Northpass Tower - Horde, Contested',0,139,2275,53,60,0,3168.41,-4356.58,138.976,4.89792,'236:0 237:0 238:0 '),\n+(230,'Crown Guard Tower - Alliance',0,139,2263,53,60,0,1861.6,-3701.08,160.834,4.34226,'248:0 247:0 249:0 2369:0 '),\n+(233,'Mudsprocket',1,15,4010,33,45,1,-4601.09,-3173.17,38.4677,3.21013,'1909:0 106:0 105:0 1911:0 '),\n+(234,'LightsHopeChapel',0,139,2268,53,60,1,2207.38,-5321.35,92.2225,0.203619,'85:0 252:0 '),\n+(235,'BlackwoodLake',0,139,2624,53,60,0,2464.31,-4192.32,86.7625,5.25334,'211:0 236:0 250:0 '),\n+(236,'EPL_hubN1',0,139,139,53,60,0,2895.84,-4274.37,91.0774,2.94428,'220:0 235:0 237:0 240:0 '),\n+(237,'Northdale',0,139,2272,53,60,0,2939.45,-4922.8,110.201,2.76758,'236:0 211:0 220:0 238:0 '),\n+(238,'ZulMasharEntrance',0,139,2273,53,60,0,3243.57,-4728.42,157.177,1.67982,'237:0 220:0 239:0 '),\n+(239,'MazraAlor',0,139,2274,53,60,0,3446.77,-4987,196.046,5.53613,'238:0 '),\n+(240,'PlaguewoodEast',0,139,2277,53,60,0,3031.09,-3786.79,119.967,4.37961,'236:0 241:0 242:0 '),\n+(241,'PlaguewoodSouth',0,139,2277,53,60,0,2764.18,-3442.19,97.1331,4.24216,'215:0 240:0 242:0 '),\n+(242,'PlaguewoodCenter',0,139,2277,53,60,0,3137.26,-3403.95,139.517,0.937594,'215:0 240:0 241:0 '),\n+(243,'TerrorweTunnelWest',0,139,2619,53,60,0,2724.41,-2453.2,66.836,5.42496,'244:0 84:0 '),\n+(244,'ThondorilRiverSouth',0,139,2619,53,60,0,2417.75,-2469.65,72.4504,0.00296164,'183:0 243:0 245:0 '),\n+(245,'EPL_hubSW',0,139,139,53,60,0,2076.2,-2853.69,86.3391,0.879086,'244:0 246:0 248:0 255:0 '),\n+(246,'EPL_hubSWRoad',0,139,139,53,60,0,1811.3,-3046.98,75.4985,1.09939,'245:0 247:0 255:0 '),\n+(247,'Undercroft',0,139,2261,53,60,0,1600.37,-3283.08,91.4858,0.567285,'246:0 230:0 '),\n+(248,'EPL_hubSW2',0,139,139,53,60,0,2175.83,-3487.76,123.024,5.90406,'199:0 230:0 245:0 '),\n+(249,'EPL_SRoad',0,139,139,53,60,0,1841.76,-4088.5,101.961,5.05584,'230:0 250:0 '),\n+(250,'CorinsCrossing',0,139,2264,53,60,0,2074.45,-4556.23,73.5772,0.745981,'211:0 235:0 249:0 251:0 252:0 '),\n+(251,'ScarletBaseCamp',0,139,2265,53,60,0,1656.05,-4826.35,87.7738,0.384695,'250:0 252:0 253:0 '),\n+(252,'PestilentScar',0,139,2622,53,60,0,2013.6,-4964.85,73.6116,5.58402,'234:0 250:0 251:0 253:0 '),\n+(253,'TyrshandEntrance',0,139,2266,53,60,0,1690.77,-5201.46,74.6226,4.83788,'251:0 252:0 254:0 '),\n+(254,'Tyrshand',0,139,2266,53,60,0,1609.91,-5528.27,111.168,4.2076,'253:0 '),\n+(255,'ThondorilRiverBridge',0,139,2619,53,60,0,1924.72,-2608.2,62.8109,4.6761,'183:0 245:0 246:0 256:0 '),\n+(256,'GahrronWithering',0,28,201,48,56,0,1768.07,-2280.14,59.7087,0.010807,'183:0 255:0 257:0 258:0 '),\n+(257,'WritingHaunt',0,28,202,48,56,0,1506.64,-1862.76,59.0986,5.271,'256:0 258:0 259:0 266:0 269:0 '),\n+(258,'WPL_hubC2',0,28,28,48,56,0,1760.12,-1779.45,64.8245,4.87437,'256:0 257:0 259:0 260:0 266:0 269:0 '),\n+(259,'DalsonTears',0,28,200,48,56,0,1864.12,-1558.81,59.2668,3.44495,'257:0 258:0 260:0 266:0 267:0 269:0 '),\n+(260,'WPL_hubN1',0,28,28,48,56,0,2122.47,-1665.81,64.0458,5.36013,'258:0 259:0 261:0 262:0 '),\n+(261,'NorthridgeLumberCamp',0,28,192,48,56,0,2421.88,-1647.26,103.541,5.77835,'260:0 '),\n+(262,'WPL_hubN2',0,28,28,48,56,0,2425.99,-1947.45,109.098,4.71217,'260:0 263:0 '),\n+(263,'HearthglenTower',0,28,28,48,56,0,2701.43,-1944.23,107.238,0.832291,'262:0 265:0 '),\n+(264,'Hearthglen',0,28,203,48,56,0,2924.12,-1426.31,150.782,1.09736,'265:0 '),\n+(265,'HearthglenEntrance',0,28,190,48,56,0,2782.62,-1612.54,129.551,0.826396,'264:0 263:0 '),\n+(266,'WPL_hubC1',0,28,28,48,56,0,1680.03,-1358.64,69.8578,5.02985,'268:0 257:0 258:0 259:0 267:0 269:0 270:0 274:0 '),\n+(267,'FelstoneField',0,28,199,48,56,0,1795.08,-1188.53,59.8914,5.54821,'268:0 259:0 266:0 269:0 273:0 274:0 '),\n+(268,'AndorhalW',0,28,193,48,56,0,1336.99,-1272.01,57.8614,2.26525,'266:0 267:0 269:0 270:0 272:0 '),\n+(269,'AndorhalNE',0,28,193,48,56,0,1540.11,-1606.19,65.1216,5.937,'257:0 258:0 259:0 266:0 267:0 268:0 270:0 '),\n+(270,'AndorhalEntranceSE',0,28,197,48,56,0,1294.98,-1678.78,62.5727,3.83801,'268:0 266:0 269:0 271:0 '),\n+(271,'SorrowHillCR',0,28,197,48,56,0,1162.78,-1758.3,60.6308,3.04279,'48:0 173:0 270:0 334:0 '),\n+(272,'AndorhalEntranceSW',0,28,28,48,56,0,1214.59,-1145.63,60.8962,5.48342,'268:0 173:0 334:0 '),\n+(273,'Bulwark',0,28,813,48,56,5,1718.17,-802.509,57.5466,1.68044,'267:0 274:0 275:0 276:0 '),\n+(274,'WPL_hubE',0,28,813,48,56,0,1663.85,-956.731,69.3084,0.651574,'266:0 267:0 273:0 '),\n+(275,'TG_hubSE',0,85,85,1,10,4,1806.63,-369.504,32.3876,6.02566,'273:0 276:0 277:0 '),\n+(276,'BalnirFarmstead',0,85,165,6,10,4,2029.54,-432.459,35.4011,5.30269,'273:0 275:0 277:0 '),\n+(277,'TG_hubC2',0,85,85,1,10,4,2029.86,-87.8105,35.5077,4.49765,'2:0 275:0 276:0 '),\n+(278,'BrillEntrance',0,85,159,1,10,4,2296.05,429.197,35.7333,5.74799,'2:0 279:0 285:0 297:0 '),\n+(279,'GarrensHauntGraves',0,85,85,4,10,4,2599.87,521.024,17.2769,5.97968,'2:0 278:0 280:0 281:0 '),\n+(280,'GarrensHaunt',0,85,164,6,10,4,2883.52,376.589,25.8553,5.87914,'279:0 281:0 284:0 '),\n+(281,'BrightwaterLake',0,85,85,1,10,4,2634.44,79.5244,31.089,6.13244,'2:0 279:0 280:0 282:0 284:0 '),\n+(282,'NorthCoastE',0,85,168,7,10,4,3032.54,-341.266,5.44748,2.52746,'281:0 283:0 '),\n+(283,'NorthCoastC',0,85,168,1,10,4,2935.15,41.7046,6.92148,4.82869,'282:0 284:0 '),\n+(284,'NorthCoastW',0,85,168,1,10,4,2984.21,388.32,7.96326,4.49688,'280:0 281:0 283:0 '),\n+(285,'ColdHearthManor',0,85,166,1,10,4,2107.98,617.879,35.0405,0.497239,'278:0 18:0 286:0 287:0 297:0 '),\n+(286,'TG_hubC1',0,85,85,1,10,0,2204.7,1063.28,28.6853,4.1572,'285:0 287:0 288:0 292:0 294:0 '),\n+(287,'CrusadersOutpost',0,85,85,1,10,0,1797.65,703.831,48.147,1.54771,'286:0 285:0 297:0 '),\n+(288,'TG_hubNE',0,85,85,1,10,4,2446.9,1082.07,58.5203,0.911539,'286:0 289:0 292:0 293:0 294:0 '),\n+(289,'AgamandMillsEntrance',0,85,157,4,10,4,2701.33,937.571,110.912,0.173269,'288:0 290:0 291:0 '),\n+(290,'AgamandMillsW',0,85,157,6,10,4,2889.98,1065.92,105.434,5.38438,'289:0 291:0 '),\n+(291,'AgamandMillsE',0,85,157,6,10,4,2973.71,619.932,93.8373,1.31013,'289:0 290:0 '),\n+(292,'SollidenFarmstead',0,85,156,1,10,4,2329.03,1407.79,33.3337,0.622907,'286:0 288:0 293:0 294:0 '),\n+(293,'CrusadersOutpost',0,85,85,1,10,4,2430.28,1585.02,37.0619,0.587566,'288:0 292:0 '),\n+(294,'UndeadStartExit',0,85,85,5,10,4,2197.51,1192.39,31.5497,5.11342,'288:0 286:0 292:0 295:0 '),\n+(295,'UndeadStartEnd',0,85,154,1,10,4,2061.91,1418.99,63.8379,5.30978,'294:0 83:0 4:0 296:0 '),\n+(296,'UndeadStartE',0,85,154,1,10,4,1805.3,1351.42,87.1354,0.232168,'295:0 4:0 '),\n+(297,'TH_exitS',0,85,85,7,12,4,1642.09,555.658,33.4922,2.88878,'278:0 285:0 287:0 298:0 '),\n+(298,'ShiningStrandN',0,130,927,8,14,4,1331.69,679.903,40.5373,1.02387,'297:0 200:0 '),\n+(299,'DeadField',0,130,240,8,20,4,1076.06,1545.35,28.6412,4.79771,'201:0 300:0 301:0 302:0 303:0 200:0 '),\n+(300,'SkitteringDark',0,130,226,8,20,4,1271.34,1974.49,17.8502,4.31862,'299:0 301:0 '),\n+(301,'NorthTidesHollow',0,130,305,8,20,4,833.25,1880.5,21.9868,5.06279,'299:0 300:0 '),\n+(302,'SPF_hubC1',0,130,130,8,20,4,867.729,1518.72,35.2045,0.160734,'201:0 299:0 303:0 304:0 '),\n+(303,'SPF_hubC2',0,130,130,8,20,4,934.532,1356.51,43.5579,3.0887,'201:0 299:0 302:0 200:0 305:0 '),\n+(304,'SPF_hubC3',0,130,130,8,20,4,736.764,1449.26,64.4284,0.457609,'302:0 305:0 306:0 '),\n+(305,'SPF_hubC4',0,130,130,8,20,4,587.903,1352.93,90.6192,0.359403,'303:0 304:0 306:0 17:0 313:0 '),\n+(306,'DecrepitFerry',0,130,237,13,20,4,664.305,1021.48,45.3265,5.10911,'304:0 305:0 307:0 '),\n+(307,'FenrisIsle',0,130,172,15,20,4,704.961,674.359,43.3624,1.57874,'306:0 308:0 311:0 '),\n+(308,'FenrisIsleSE',0,130,172,15,20,4,653.059,335.097,35.0481,1.33722,'307:0 309:0 '),\n+(309,'FenrisIsleE',0,130,232,16,20,4,866.03,78.8803,34.2361,2.23258,'308:0 310:0 '),\n+(310,'DawningIsles',0,130,232,17,22,4,1199.57,370.42,34.3257,3.13185,'309:0 '),\n+(311,'FenrisKeep',0,130,172,8,20,4,1013.6,734.689,59.2651,3.23986,'307:0 '),\n+(312,'DeepElemMineFork',0,130,213,8,20,4,271.231,1110.33,80.2136,5.99661,'313:0 314:0 317:0 318:0 '),\n+(313,'SPF_hubC5',0,130,130,8,20,4,385.877,1253.37,80.2878,0.320144,'305:0 312:0 315:0 '),\n+(314,'DeepElemMine',0,130,213,8,20,4,376.82,1082.54,106.396,3.03959,'312:0 '),\n+(315,'SPF_hubC6',0,130,130,8,20,4,194.263,1268.01,72.8331,6.23812,'313:0 316:0 317:0 318:0 '),\n+(316,'OlsensFarthing',0,130,229,8,20,4,171.155,1487.65,114.395,4.84404,'315:0 '),\n+(317,'SPF_DalaranCamp1',0,130,130,8,20,4,-50.4703,1331.43,60.9321,5.92005,'315:0 312:0 318:0 319:0 323:0 '),\n+(318,'SPF_hubS1',0,130,130,8,20,4,-132.172,1170.25,63.4384,0.508657,'315:0 317:0 312:0 319:0 323:0 326:0 '),\n+(319,'AmberhillEntrance',0,130,233,11,20,4,-131.822,896.74,65.831,1.54539,'317:0 318:0 320:0 321:0 323:0 325:0 '),\n+(320,'AmberhillHall',0,130,233,13,20,4,-141.972,812.61,63.737,1.09457,'319:0 '),\n+(321,'AmberhillFarms',0,130,233,15,20,4,88.1028,694.265,60.6053,2.4376,'322:0 319:0 '),\n+(322,'AmberhillMurlocCamp',0,130,130,15,20,4,434.265,696.251,33.7837,3.19747,'321:0 '),\n+(323,'SPF_hubS2',0,130,130,8,20,4,-330.828,1311.68,37.1012,1.70757,'317:0 318:0 319:0 324:0 326:0 327:0 '),\n+(324,'PyrewoodVillage',0,130,204,8,20,4,-383.772,1597.45,16.8392,4.90611,'323:0 '),\n+(325,'SPF_exitSE',0,130,130,15,20,4,-543.136,724.877,91.2236,0.975962,'319:0 326:0 357:0 '),\n+(326,'SPF_hubS3',0,130,130,8,20,4,-503.287,1113.31,76.93,0.514545,'318:0 323:0 325:0 '),\n+(327,'GreymaneWall',0,130,230,8,20,4,-744.895,1522.56,15.5245,5.84742,'323:0 '),\n+(328,'DandredsFold',0,36,1682,35,40,0,1235.47,-274.821,40.3856,4.48552,'329:0 '),\n+(329,'UplandsN',0,36,284,28,40,0,1085.27,-663.59,87.8456,1.24773,'328:0 330:0 '),\n+(330,'UplandsS',0,36,284,28,40,0,958.693,-748.597,114.797,4.04964,'329:0 331:0 335:0 '),\n+(331,'Strahnbard',0,36,280,28,40,0,683.909,-963.157,164.301,0.671641,'330:0 332:0 343:0 '),\n+(332,'AM_hubE1',0,36,36,28,40,0,615.654,-1043.7,168.11,0.331968,'331:0 333:0 381:0 '),\n+(333,'AM_hubE2',0,36,1684,36,42,0,641.277,-1429.39,84.6042,5.55291,'332:0 334:0 '),\n+(334,'ChillwindCampRoad',0,28,3197,48,56,0,966.365,-1511.29,75.4645,2.81971,'173:0 271:0 272:0 333:0 '),\n+(335,'SlaughterHollowNE',0,36,283,28,40,0,802.9,-628.854,149.733,3.01018,'330:0 336:0 337:0 '),\n+(336,'SlaughterHollowN',0,36,283,28,40,0,835.191,-445.445,134.228,4.48673,'335:0 '),\n+(337,'SlaughterHollowC',0,36,281,28,40,0,620.637,-522.586,179.928,5.73159,'335:0 338:0 343:0 '),\n+(338,'RuinsOfAlterac',0,36,281,28,40,0,631.058,-371.491,154.481,2.42898,'340:0 337:0 339:0 '),\n+(339,'RuinsOfAlteracSW',0,36,281,28,40,0,500.776,-173.116,151.449,5.19357,'340:0 338:0 341:0 '),\n+(340,'RuinsOfAlteracSE',0,36,281,28,40,0,397.344,-248.661,161.727,5.94755,'338:0 339:0 '),\n+(341,'RuinsOfAlteracE',0,36,281,28,40,0,573.088,-14.3215,142.366,3.66008,'339:0 342:0 '),\n+(342,'RuinsOfAlteracSSW',0,36,1683,28,40,0,252.323,-82.4394,141.544,0.263228,'341:0 344:0 '),\n+(343,'RuinsOfAlteracE',0,36,1357,28,40,0,493.629,-621.553,172.877,0.602885,'331:0 337:0 344:0 345:0 380:0 '),\n+(344,'RuinsOfAlteracS',0,36,1683,28,40,0,141.788,-316.452,150.648,1.12125,'342:0 343:0 346:0 '),\n+(345,'CorrahnsDagger',0,36,1679,28,40,0,-45.3608,-581.074,153.724,5.82187,'343:0 346:0 380:0 '),\n+(346,'CorrahnsDaggerFork',0,36,1679,28,40,0,57.1052,-405.389,132.108,2.70582,'344:0 345:0 347:0 385:0 '),\n+(347,'Headland',0,36,1680,28,40,0,-163.833,-293.019,151.411,0.123425,'346:0 348:0 '),\n+(348,'GavinsNaze',0,36,1677,28,40,0,-63.0062,-197.056,131.24,2.72704,'347:0 349:0 350:0 355:0 '),\n+(349,'GavinsNazeTop',0,36,1677,28,40,0,-125.184,-59.9939,147.694,5.63693,'348:0 350:0 '),\n+(350,'GavinsNazeW',0,36,279,28,40,0,68.1015,-53.44,99.6287,3.99152,'348:0 349:0 351:0 352:0 353:0 '),\n+(351,'DalaranCraterN',0,36,279,28,40,4,466.751,167.322,41.9053,3.38088,'350:0 352:0 '),\n+(352,'DalaranCraterS',0,36,279,28,40,4,90.2654,237.935,43.2902,5.2894,'351:0 350:0 353:0 354:0 '),\n+(353,'LordamereInternmentCamp',0,36,278,28,40,4,-90.5356,218.366,53.2755,6.11997,'352:0 350:0 354:0 '),\n+(354,'HillsbradFieldsC',0,267,286,18,30,4,-499.681,78.0454,56.6165,0.278575,'352:0 353:0 356:0 355:0 '),\n+(355,'HillsbradFieldsE',0,267,286,18,30,0,-437.039,-135.243,56.2029,2.13409,'354:0 356:0 348:0 385:0 '),\n+(356,'HillsbradFieldsSRoad',0,267,267,18,30,0,-639.845,-98.2014,47.262,0.172558,'20:0 358:0 360:0 354:0 355:0 361:0 385:0 357:0 '),\n+(357,'SouthPointTower',0,267,285,18,30,5,-613.976,388.915,83.0604,2.91123,'325:0 356:0 358:0 '),\n+(358,'WesternStrandW',0,267,295,18,30,0,-979.029,273.179,7.90667,5.62479,'356:0 359:0 357:0 '),\n+(359,'WesternStrandSW',0,267,295,18,30,0,-1128.84,276.704,0.0000662804,5.89576,'358:0 360:0 '),\n+(360,'WesternStrandS',0,267,295,18,30,0,-1156.55,7.61478,0.00000548363,6.16081,'359:0 356:0 361:0 '),\n+(361,'WesternStrandS',0,267,295,18,30,0,-1102.38,-114.03,0.0000309944,0.148599,'362:0 360:0 356:0 '),\n+(362,'WesternStrandE',0,267,271,18,30,0,-962.262,-506.545,2.13023,1.90396,'361:0 363:0 20:0 '),\n+(363,'SouthshoreS',0,267,271,18,30,0,-974.276,-592.998,0.229758,0.372044,'362:0 364:0 20:0 '),\n+(364,'EasternStrandW',0,267,294,18,30,0,-1012.85,-790.213,9.01406,5.30042,'363:0 365:0 368:0 376:0 '),\n+(365,'EasternStrandC',0,267,294,18,30,0,-1183.14,-847.579,1.43171,6.18988,'364:0 366:0 '),\n+(366,'EasternStrandS',0,267,294,18,30,0,-1311.64,-1052.47,18.2271,0.929683,'365:0 367:0 368:0 '),\n+(367,'DunGarok',0,267,290,18,30,4,-1256.01,-1190.37,38.9786,2.03514,'366:0 368:0 376:0 '),\n+(368,'DunGarokRoad',0,267,267,18,30,0,-1049.49,-1239.84,53.3175,1.75045,'364:0 366:0 367:0 369:0 373:0 '),\n+(369,'HillsbradFoothillsExitSE',0,267,267,18,30,0,-784.955,-1512.45,56.6724,1.97822,'370:0 368:0 373:0 410:0 '),\n+(370,'HillsbradFoothillsExitE',0,267,275,18,30,0,-594.279,-1721.03,62.3187,2.25507,'369:0 371:0 411:0 '),\n+(371,'DurnholdeNE',0,267,275,18,30,0,-383.173,-1720.01,90.0634,3.41784,'372:0 370:0 '),\n+(372,'DurnholdeNNE',0,267,275,18,30,0,-316.76,-1609.34,86.0559,5.49914,'371:0 377:0 386:0 '),\n+(373,'DurnholdeS',0,267,267,18,30,0,-669.891,-1326.66,66.6887,5.65621,'376:0 374:0 368:0 369:0 383:0 '),\n+(374,'DurnholdeInside',0,267,275,18,30,0,-518.661,-1435.16,64.889,2.5637,'373:0 375:0 '),\n+(375,'DurnholdeInsideDeep',0,267,275,18,30,0,-512.473,-1541.62,67.1947,1.69387,'374:0 '),\n+(376,'NethanderStead',0,267,289,18,30,0,-915.831,-926.49,31.1754,1.19711,'364:0 367:0 373:0 383:0 20:0 '),\n+(377,'DurnholdeN',0,267,275,18,30,0,-298.033,-1310.71,76.9034,4.69017,'372:0 378:0 383:0 '),\n+(378,'DurnholdeNN',0,267,267,18,30,0,-37.1467,-1296.59,83.7166,3.13705,'377:0 21:0 '),\n+(379,'TarrenMillN',0,267,267,18,30,4,188.047,-974.547,75.5356,0.0209713,'21:0 381:0 '),\n+(380,'GallowsCorner',0,36,1357,28,40,0,324.254,-615.115,145.246,3.03887,'343:0 345:0 21:0 382:0 '),\n+(381,'SoferasCorner',0,36,36,28,40,0,461.934,-926.633,129.374,2.72668,'379:0 332:0 382:0 '),\n+(382,'SoferasNaze',0,36,1678,28,40,0,248.314,-839.928,146.333,0.818164,'381:0 380:0 '),\n+(383,'HFH_bridge',0,267,267,18,30,0,-487.607,-967.55,34.4918,4.54488,'377:0 376:0 373:0 384:0 '),\n+(384,'DarrowHillE',0,267,267,18,30,0,-323.998,-672.57,54.6417,3.9048,'21:0 383:0 385:0 20:0 '),\n+(385,'DarrowHillW',0,267,1056,18,30,0,-332.483,-447.42,58.4647,0.297842,'346:0 355:0 356:0 384:0 20:0 '),\n+(386,'HinterlandsEntrance',0,47,47,38,50,0,-77.4076,-1845.63,143.116,2.46164,'372:0 55:0 '),\n+(387,'ZunWatha',0,47,352,38,50,0,-11.9998,-2493.37,119.659,1.99629,'55:0 82:0 388:0 391:0 '),\n+(388,'QuelDanilS',0,47,47,38,50,0,65.3995,-2664.2,111.823,5.20269,'55:0 82:0 387:0 389:0 390:0 391:0 392:0 '),\n+(389,'QuelDanil',0,47,350,38,50,4,210.196,-2789.46,122.156,1.50935,'388:0 390:0 392:0 '),\n+(390,'HL_hubW',0,47,47,38,50,0,132.208,-2876.17,116.583,1.69588,'388:0 389:0 392:0 393:0 397:0 398:0 '),\n+(391,'BogensLedge',0,47,1887,38,50,0,-198.398,-2585.67,120.378,6.18051,'387:0 388:0 393:0 '),\n+(392,'HiriWatha',0,47,1885,38,50,0,-35.4616,-2815.33,122.143,0.435323,'389:0 390:0 388:0 393:0 '),\n+(393,'ShadraAlorEntrance',0,47,47,38,50,0,-160.179,-2955.33,115.773,1.96371,'391:0 392:0 390:0 395:0 394:0 396:0 398:0 400:0 '),\n+(394,'ShadraAlorE',0,47,353,38,50,0,-366.126,-2955.41,89.39,6.27554,'393:0 395:0 396:0 '),\n+(395,'ShadraAlorS',0,47,353,38,50,0,-455.461,-2839.4,105.834,6.08704,'393:0 394:0 396:0 '),\n+(396,'ShadraAlorW',0,47,353,38,50,0,-296.621,-2833,96.7074,5.15045,'393:0 395:0 394:0 '),\n+(397,'AgolWatha',0,47,1884,38,50,0,397.177,-3352.2,123.451,2.24644,'390:0 398:0 399:0 '),\n+(398,'CreepingRun',0,47,1886,38,50,0,116.576,-3466.05,107.658,1.12922,'393:0 397:0 390:0 399:0 400:0 401:0 '),\n+(399,'SkulkRock',0,47,351,38,50,0,363.014,-3796.73,171.76,1.54745,'397:0 398:0 401:0 404:0 '),\n+(400,'AltarOfZul',0,47,355,38,50,0,-147.861,-3319.03,121.957,3.93113,'393:0 398:0 '),\n+(401,'HL_hubC',0,47,47,38,50,0,109.926,-3922.75,136.697,0.948588,'398:0 399:0 402:0 403:0 404:0 '),\n+(402,'JinthaAlor',0,47,354,38,50,0,-217.196,-4159.98,118.665,0.453769,'401:0 403:0 '),\n+(403,'OverlookCliffsS',0,47,307,38,50,0,-150.233,-4250.21,120.905,4.17653,'401:0 402:0 405:0 '),\n+(404,'SeradaneBridge',0,47,351,38,50,0,472.513,-3907.18,113.731,5.88677,'399:0 401:0 409:0 '),\n+(405,'OverlookCliffsRampTop',0,47,307,38,50,0,-243.665,-4377.48,105.997,0.98978,'403:0 406:0 '),\n+(406,'OverlookCliffsRampBottom',0,47,307,38,50,0,-3.15739,-4629.26,13.899,2.27391,'405:0 407:0 408:0 '),\n+(407,'RevantuskOutside',0,47,307,38,50,0,-355.789,-4475.87,11.3783,0.924997,'406:0 179:0 '),\n+(408,'OverlookCliffsEnd',0,47,307,38,50,0,133.371,-4745.73,2.05405,2.27392,'406:0 '),\n+(409,'Seradane',0,47,356,60,80,0,755.958,-4011.61,92.8808,5.95432,'404:0 '),\n+(410,'ArathiExitNW',0,45,334,28,40,0,-889.426,-1677.32,57.6111,1.06053,'369:0 411:0 412:0 414:0 '),\n+(411,'ArathiExitN',0,45,45,28,40,0,-684.458,-1831.3,53.3946,0.936824,'370:0 410:0 412:0 413:0 '),\n+(412,'ArathiCW',0,45,45,28,40,0,-863.176,-1785.9,39.6302,5.66886,'410:0 411:0 413:0 414:0 '),\n+(413,'NorthfoldManor',0,45,313,28,40,0,-822.895,-2039.83,34.4558,1.25884,'411:0 412:0 415:0 '),\n+(414,'Arathi_hubW',0,45,45,28,40,0,-1190.48,-1731.63,56.3674,6.26181,'410:0 412:0 415:0 420:0 '),\n+(415,'NorthfoldManor',0,45,313,28,40,0,-933.512,-2120.29,56.5869,2.05011,'78:0 413:0 414:0 416:0 '),\n+(416,'RefugePointeExitN',0,45,315,28,40,0,-1158.07,-2706.9,52.0215,2.18796,'78:0 22:0 415:0 417:0 418:0 419:0 435:0 '),\n+(417,'DabyrieFarmstead',0,45,45,28,40,0,-1091.19,-2856.55,42.4006,1.78073,'416:0 418:0 435:0 436:0 '),\n+(418,'ArathiCO',0,45,336,28,40,0,-1352.09,-2738.95,59.0948,6.08275,'416:0 417:0 419:0 431:0 432:0 435:0 '),\n+(419,'RefugePointeExitS',0,45,45,28,40,0,-1466.43,-2424.6,57.8277,5.98262,'22:0 78:0 416:0 418:0 420:0 427:0 429:0 431:0 '),\n+(420,'StromgardeRoad',0,45,45,28,40,0,-1323.01,-1833.39,63.6564,0.712589,'421:0 414:0 419:0 427:0 '),\n+(421,'StromgardeInside',0,45,324,28,40,0,-1576.29,-1800.48,67.6512,3.46934,'422:0 423:0 424:0 420:0 '),\n+(422,'StromgardeKeep',0,45,324,28,40,0,-1660.06,-1803.63,83.0724,6.27321,'421:0 426:0 '),\n+(423,'StromgardeE',0,45,324,28,40,0,-1602.44,-1922.26,67.2707,1.50115,'421:0 '),\n+(424,'StromgardeW1',0,45,324,28,40,0,-1596.2,-1745.56,67.3627,5.09826,'421:0 425:0 '),\n+(425,'StromgardeW2',0,45,324,28,40,0,-1720.34,-1736.69,52.4064,6.26851,'424:0 81:0 '),\n+(426,'StromgardeKeepSide',0,45,324,28,40,0,-1681.32,-1933.25,80.6272,1.35821,'422:0 '),\n+(427,'ArathiCI',0,45,335,28,40,0,-1517.62,-2100.44,22.3405,4.92548,'419:0 420:0 428:0 '),\n+(428,'ThandolRoadN',0,45,45,28,40,0,-1995.23,-2466.74,78.7992,0.837489,'427:0 429:0 441:0 '),\n+(429,'ArathiRoadSmid',0,45,45,28,40,0,-1763.42,-2422.8,59.5627,0.9015,'419:0 428:0 431:0 430:0 '),\n+(430,'BoulderfistHall',0,45,316,28,40,0,-1941.13,-2794.22,85.7724,0.38314,'429:0 431:0 432:0 '),\n+(431,'Arathi_hubE1',0,45,45,28,40,0,-1570.23,-2675.51,35.6533,6.03014,'419:0 418:0 429:0 432:0 435:0 430:0 '),\n+(432,'Arathi_hubE2',0,45,317,28,40,0,-1705.19,-3021.39,31.689,0.310091,'433:0 418:0 431:0 434:0 430:0 '),\n+(433,'WitherbarkVillage',0,45,317,28,40,0,-1867.12,-3365.42,56.1179,1.07782,'432:0 '),\n+(434,'GoshekFarm',0,45,314,28,40,0,-1526.14,-3075.57,14.1487,2.82925,'432:0 435:0 '),\n+(435,'Arathi_hubNE1',0,45,45,28,40,0,-1297.32,-3141.76,34.9289,1.25489,'416:0 417:0 418:0 431:0 434:0 436:0 438:0 '),\n+(436,'Arathi_hubNE2',0,45,45,28,40,0,-1005.91,-3313.55,55.2766,2.32737,'435:0 417:0 437:0 438:0 '),\n+(437,'ArathiCE',0,45,333,28,40,0,-839.717,-3280.93,78.5616,3.98495,'436:0 438:0 '),\n+(438,'HammerfallEntrance',0,45,321,28,40,0,-1164.53,-3558.81,50.1497,1.47167,'435:0 436:0 437:0 23:0 439:0 '),\n+(439,'DrywhiskerGorgeOutside',0,45,318,28,40,0,-1086,-3696.31,81.3913,2.10981,'438:0 440:0 '),\n+(440,'DrywhiskerGorgeEntrance',0,45,318,28,40,0,-1083.95,-3820.83,128.504,1.71515,'439:0 44:0 '),\n+(441,'ArathiRoadSbottom',0,45,880,28,40,0,-2248.64,-2487.38,80.1236,4.70713,'428:0 442:0 443:0 '),\n+(442,'ThandolSpanCamp',0,45,45,28,40,0,-2249.4,-2633.38,78.816,1.44851,'441:0 '),\n+(443,'ThandolSpanS',0,11,881,18,30,0,-2478.16,-2506.16,78.5672,0.110205,'441:0 444:0 '),\n+(444,'DunModrCamp',0,11,881,18,30,0,-2609.79,-2494.69,80.9667,1.57693,'443:0 6:0 445:0 '),\n+(445,'Wetlands_hubN1',0,11,11,18,30,0,-2937.95,-2470.57,26.6988,6.13028,'444:0 446:0 447:0 461:0 462:0 '),\n+(446,'DaggerforgeHill',0,11,1016,18,30,0,-2859.63,-2907.96,33.1564,1.54551,'445:0 448:0 449:0 '),\n+(447,'WL_hubC1',0,11,11,18,30,0,-3206.06,-2452.65,10.0327,5.76822,'445:0 448:0 455:0 461:0 462:0 '),\n+(448,'Greenwarden',0,11,1025,18,30,0,-3254.89,-2726.4,9.41813,1.21683,'446:0 447:0 449:0 455:0 458:0 '),\n+(449,'WL_hubE1',0,11,11,18,30,0,-3421.46,-3088.4,22.5006,4.5862,'446:0 448:0 450:0 451:0 455:0 456:0 '),\n+(450,'RaptorRidge',0,11,1017,23,30,0,-3132.51,-3240.98,63.5747,2.76015,'449:0 451:0 '),\n+(451,'DragonmawGates',0,11,1038,61,70,0,-3452,-3659.86,58.5533,1.08333,'449:0 450:0 452:0 '),\n+(452,'DragonmawGatesI1',0,11,1038,61,70,0,-3594.66,-4056.85,113.625,1.23963,'451:0 453:0 '),\n+(453,'DragonmawGatesI2',0,11,1038,61,70,0,-3956.61,-4019.52,170.857,6.00896,'452:0 454:0 '),\n+(454,'DragonmawGatesI3',0,11,1037,61,70,0,-4145.01,-3662.88,204.651,5.17056,'92:0 453:0 '),\n+(455,'WL_hubS1',0,11,1020,18,30,0,-3777.35,-2817.99,12.647,0.508038,'447:0 448:0 449:0 456:0 457:0 '),\n+(456,'MosshideFen',0,11,1020,18,30,0,-3913.48,-3043.47,11.7092,0.398469,'449:0 455:0 457:0 '),\n+(457,'ThelgenRock',0,11,1021,18,30,0,-3921.58,-2647.27,36.3203,4.94005,'455:0 456:0 479:0 '),\n+(458,'AngerfangEnampmentE',0,11,1036,18,30,0,-3503.17,-2440.43,48.2306,5.48001,'448:0 459:0 '),\n+(459,'AngerfangEnampmentW',0,11,1036,18,30,0,-3354.34,-2190.82,45.3521,1.88565,'458:0 460:0 461:0 '),\n+(460,'AngerfangEnampmentTop',0,11,1036,18,30,0,-3458.4,-2008.76,119.804,5.31784,'459:0 '),\n+(461,'WL_hubW1',0,11,11,18,30,0,-3186.98,-2117.49,15.8054,4.81126,'445:0 447:0 459:0 462:0 463:0 467:0 '),\n+(462,'IronbeardsTomb',0,11,309,18,30,0,-2861.94,-2217.72,29.2628,4.06121,'445:0 447:0 461:0 463:0 464:0 '),\n+(463,'MosshideWest',0,11,11,18,30,0,-2916.55,-1848.65,10.201,4.36986,'461:0 462:0 464:0 465:0 466:0 467:0 '),\n+(464,'BaradinBayN',0,11,1023,18,30,5,-2598.33,-1745.42,10.159,4.05766,'462:0 463:0 465:0 466:0 '),\n+(465,'BaradinBayNW',0,11,298,18,30,0,-2723.52,-1348.51,9.75282,4.1578,'464:0 463:0 466:0 474:0 '),\n+(466,'BaradinBayW',0,11,1022,18,30,0,-2951.24,-1112.1,9.14625,2.36904,'464:0 463:0 465:0 474:0 475:0 476:0 '),\n+(467,'WhelgarsOutside',0,11,1024,18,30,0,-3208.01,-1693.31,8.6748,4.04314,'461:0 463:0 468:0 473:0 474:0 '),\n+(468,'WhelgarsEntrance',0,11,118,18,30,0,-3328.04,-1856.79,25.9266,3.14189,'467:0 469:0 470:0 '),\n+(469,'WhelgarsBottom',0,11,118,18,30,0,-3540.59,-1803.75,24.3572,5.93869,'468:0 '),\n+(470,'WhelgarsRamp',0,11,118,18,30,0,-3370.49,-1931.82,63.5201,0.805329,'468:0 471:0 '),\n+(471,'WhelgarsRampTop',0,11,118,18,30,0,-3471.16,-1925.52,113.829,3.80162,'470:0 472:0 '),\n+(472,'WhelgarsCave',0,11,118,18,30,0,-3569.75,-1976.96,117.678,0.449137,'471:0 '),\n+(473,'BlueChannelMarsh',0,11,1018,18,30,0,-3582.96,-1324.33,9.39017,5.56012,'467:0 474:0 476:0 '),\n+(474,'BluegillMarsh',0,11,1022,18,30,0,-3135.95,-1301.23,7.27194,1.32132,'465:0 466:0 467:0 473:0 475:0 476:0 '),\n+(475,'BaradinBayS',0,11,298,18,30,0,-3202.27,-925.946,8.88303,5.67636,'466:0 474:0 476:0 '),\n+(476,'MenethilHarborRoad',0,11,1022,18,30,2,-3333.27,-1053.79,8.28482,2.51317,'11:0 466:0 473:0 474:0 475:0 '),\n+(477,'MenethilBayS',0,11,298,18,30,2,-3909.27,-638.054,4.91793,5.35238,'11:0 '),\n+(478,'MenethilBayN',0,11,298,18,30,2,-3732.25,-581.622,4.65228,4.77512,'11:0 '),\n+(479,'DunAlgazBottom',0,11,836,18,30,0,-4086.88,-2624.69,43.3702,1.60133,'457:0 480:0 '),\n+(480,'DunAlgazMid1',0,11,836,18,30,0,-4092.37,-2403.53,100.01,4.74881,'479:0 481:0 '),\n+(481,'DunAlgazMid2',0,11,836,18,30,0,-3994.82,-2377.44,120.415,3.60017,'480:0 482:0 '),\n+(482,'DunAlgazMid3',0,11,836,18,30,0,-4070,-2464.84,155.161,3.20551,'481:0 483:0 '),\n+(483,'DunAlgazMid4',0,11,836,18,30,0,-4418.61,-2470.44,212.203,0.00303268,'482:0 5:0 484:0 '),\n+(484,'DunAlgazMid5',0,11,836,18,30,0,-4453.35,-2691.02,268.159,1.48548,'483:0 485:0 '),\n+(485,'DunAlgazTop',0,38,837,8,20,0,-4741.84,-2699.03,325.269,6.26389,'484:0 91:0 487:0 488:0 '),\n+(486,'NorthGatePassBottom',0,38,838,8,20,2,-4797.55,-2537.41,354.11,2.07534,'91:0 524:0 '),\n+(487,'SilverStreamMine',0,38,149,8,20,2,-4801.44,-2968.22,321.735,1.63004,'91:0 485:0 488:0 '),\n+(488,'StonewroughDamW',0,38,146,8,20,2,-4676.63,-3184.73,310.249,2.0836,'487:0 485:0 489:0 '),\n+(489,'StonewroughDamC',0,38,146,8,20,2,-4761.78,-3306.52,310.258,4.81285,'488:0 490:0 '),\n+(490,'StonewroughDamE',0,38,146,8,20,2,-4680.9,-3464.1,310.208,3.57506,'489:0 491:0 '),\n+(491,'TheLochNE',0,38,38,8,20,2,-4859.79,-3631.09,306.481,2.35809,'490:0 492:0 495:0 496:0 497:0 '),\n+(492,'MogroshStronghold',0,38,143,8,20,2,-4884.91,-3956.61,298.791,3.26837,'491:0 493:0 494:0 495:0 '),\n+(493,'MogroshStrongholdTop',0,38,143,8,20,2,-4853.52,-4046.55,315.354,1.54756,'492:0 '),\n+(494,'LochModanE',0,38,38,8,20,2,-5200.93,-4080.99,324.555,1.53421,'492:0 495:0 512:0 '),\n+(495,'LochModanC2',0,38,38,8,20,2,-5358.15,-3755.11,304.073,5.92655,'491:0 492:0 494:0 496:0 506:0 512:0 '),\n+(496,'LochIsleE',0,38,38,8,20,2,-4983.21,-3478.31,305.5,4.76612,'491:0 495:0 497:0 498:0 '),\n+(497,'LochIsleW',0,38,38,8,20,2,-4869.1,-3302.75,307.516,3.90807,'491:0 496:0 498:0 '),\n+(498,'LochIsleS',0,38,38,8,20,2,-5031.68,-3316.94,298.701,5.51616,'497:0 496:0 499:0 '),\n+(499,'LochC1',0,38,556,8,20,2,-5138.3,-3125.08,302.046,2.10361,'498:0 502:0 '),\n+(500,'LochW1',0,38,38,8,20,2,-5067.56,-2665.82,323.188,6.27801,'91:0 501:0 502:0 '),\n+(501,'LochW2',0,38,38,8,20,2,-5383.73,-2741.02,362.182,0.255963,'500:0 502:0 503:0 '),\n+(502,'LochW3',0,38,38,8,20,0,-5215.01,-2861.61,336.947,0.715418,'91:0 499:0 500:0 501:0 503:0 '),\n+(503,'ThelsamarEntrance',0,38,38,8,20,0,-5405.86,-2884.97,342.8,0.491581,'501:0 502:0 19:0 504:0 515:0 '),\n+(504,'LochC3',0,38,144,8,20,0,-5441.5,-3109.22,349.359,0.721317,'503:0 19:0 505:0 '),\n+(505,'LochS',0,38,38,8,20,0,-5860.82,-3292.84,292.88,5.93047,'504:0 506:0 621:0 '),\n+(506,'IronbandsExcavationOutside',0,38,142,8,20,2,-5617.55,-3680.57,313.913,2.11697,'495:0 505:0 507:0 509:0 '),\n+(507,'IronbandsExcavationSW',0,38,142,8,20,2,-5787.94,-3777.91,328.169,4.57725,'506:0 508:0 510:0 '),\n+(508,'IronbandsExcavationInside1',0,38,142,8,20,2,-5722.82,-3946.06,324.917,2.02667,'507:0 509:0 '),\n+(509,'IronbandsExcavationInside2',0,38,142,8,20,2,-5578.49,-3926.28,327.498,1.64379,'506:0 508:0 '),\n+(510,'LochCornerSE',0,38,147,8,20,2,-5843.55,-4145.23,387.605,1.3532,'507:0 511:0 512:0 '),\n+(511,'FastriderLodgeEntrance',0,38,147,8,20,2,-5555.41,-4251.75,380.644,2.87687,'510:0 512:0 513:0 '),\n+(512,'LochModanSE',0,38,147,8,20,2,-5553.71,-4104.44,372.683,1.01823,'494:0 495:0 510:0 511:0 '),\n+(513,'FarstriderLodge',0,38,147,8,20,2,-5621.61,-4334.97,403.763,0.951478,'511:0 514:0 '),\n+(514,'FarstriderLodgeInside',0,38,147,8,20,3,-5674.26,-4247.48,407.006,5.29276,'513:0 '),\n+(515,'LochModanSW1',0,38,38,8,20,2,-5673.4,-2775.82,363.022,5.89359,'503:0 516:0 519:0 '),\n+(516,'StonesplinterValley1',0,38,923,8,20,2,-5878.01,-2909.13,366.788,0.558766,'515:0 517:0 518:0 '),\n+(517,'StonesplinterValley2',0,38,923,8,20,2,-6057.08,-3024.86,403.365,0.541086,'516:0 '),\n+(518,'StonesplinterValley3',0,38,923,8,20,2,-6077.12,-2770.04,413.566,5.71294,'516:0 '),\n+(519,'LochModanSW2',0,38,924,8,20,2,-5804.6,-2605.8,316.201,6.15474,'515:0 520:0 521:0 '),\n+(520,'LochModanSW3',0,38,924,8,20,2,-6029.33,-2496.11,310.016,2.1924,'519:0 561:0 '),\n+(521,'SouthGatePassBottom',0,38,839,8,20,2,-5690.63,-2589.07,346.087,0.415367,'519:0 522:0 '),\n+(522,'SouthGateOutpost',0,1,806,1,10,0,-5520.09,-2399.78,400.417,2.27487,'521:0 523:0 '),\n+(523,'SouthGatePassTop',0,1,805,1,10,2,-5636.7,-2242.95,424.761,5.34381,'522:0 527:0 69:0 '),\n+(524,'NorthGatePassTop1',0,1,808,1,10,2,-4911.88,-2330.69,408.794,5.22601,'486:0 525:0 '),\n+(525,'NorthGatePassBottom2',0,1,808,1,10,2,-5204.26,-2288.4,400.984,2.97781,'524:0 526:0 '),\n+(526,'NorthGatePassTop2',0,1,807,1,10,2,-5294.53,-2180,423.003,2.8011,'525:0 527:0 '),\n+(527,'DunMoroghPassFork',0,1,1,1,10,2,-5515.28,-2008.17,399.376,4.60752,'526:0 523:0 528:0 '),\n+(528,'DunMoroghE1',0,1,1,1,10,2,-5509.11,-1798.18,397.338,5.99176,'527:0 69:0 529:0 '),\n+(529,'GolBolarFork',0,1,1,1,10,2,-5611.84,-1487.57,399.057,5.05517,'528:0 530:0 533:0 '),\n+(530,'GolBolarCamp',0,1,134,1,10,2,-5711.36,-1562.28,383.568,2.84075,'529:0 531:0 '),\n+(531,'GolBolarQuarry1',0,1,134,1,10,2,-5849.25,-1514.03,358.812,5.96152,'530:0 532:0 '),\n+(532,'GolBolarQuarry2',0,1,134,1,10,2,-5737.17,-1683.52,362.196,6.04595,'531:0 '),\n+(533,'TundridHills',0,1,804,1,10,2,-5651.13,-1033.73,410.816,4.75985,'529:0 534:0 536:0 556:0 '),\n+(534,'Vagash1',0,1,1,1,10,2,-5422.73,-1195.14,450.063,2.06791,'533:0 535:0 '),\n+(535,'Vagash2',0,1,803,1,10,2,-5417.7,-1264.17,446.78,2.22146,'534:0 '),\n+(536,'DunMoroghS1',0,1,1,1,10,2,-5892.71,-628.276,400.121,5.26175,'533:0 537:0 '),\n+(537,'DwarfGnomeStartExit1',0,1,1,1,10,2,-5975.18,-476.82,406.774,5.36188,'536:0 9:0 538:0 '),\n+(538,'DwarfGnomeStartExit2',0,1,1,1,10,2,-6013.25,-224.693,412.196,4.79638,'537:0 539:0 '),\n+(539,'DwarfGnomeStartExit3',0,1,800,1,10,2,-5890.34,69.4737,372.157,4.07706,'538:0 540:0 545:0 546:0 '),\n+(540,'ColdridgePass1',0,1,800,1,10,2,-6066.08,42.2314,408.342,0.120498,'539:0 541:0 '),\n+(541,'ColdridgePass2',0,1,800,4,10,2,-6231.65,125.6,430.753,5.63871,'540:0 542:0 '),\n+(542,'DwarfGnomeStart1',0,1,132,1,10,3,-6261.08,369.552,383.537,4.94484,'541:0 1:0 543:0 544:0 '),\n+(543,'DwarfGnomeStart2',0,1,132,1,10,2,-6482.65,496.244,386.328,5.80485,'542:0 544:0 '),\n+(544,'DwarfGnomeStart3',0,1,132,1,10,2,-6269.69,741.137,386.893,4.77403,'542:0 543:0 '),\n+(545,'GrizzledDen',0,1,136,1,10,2,-5690.95,-281.229,364.314,5.54297,'539:0 9:0 '),\n+(546,'DunMoroghSW1',0,1,1,1,10,2,-5756.39,127.948,368.817,4.07511,'539:0 547:0 548:0 '),\n+(547,'OldIcebeard',0,1,801,1,10,2,-5602.44,-28.5472,416.22,2.31387,'546:0 '),\n+(548,'DunMoroghW1',0,1,135,1,10,2,-5661.62,365.277,393.274,4.27146,'546:0 549:0 550:0 551:0 '),\n+(549,'FrostmaneHold',0,1,135,1,10,2,-5549.4,568.067,394.761,1.30462,'548:0 551:0 '),\n+(550,'GnomereganS',0,1,133,1,10,2,-5183.81,585.068,404.291,4.35,'548:0 551:0 '),\n+(551,'IceflowLake',0,1,211,1,10,2,-5250.86,115.774,394.041,2.85773,'548:0 549:0 550:0 552:0 555:0 '),\n+(552,'ShimmerRidge1',0,1,802,1,10,2,-5266.4,-149.752,437.903,6.01894,'551:0 553:0 '),\n+(553,'ShimmerRidge2',0,1,802,1,10,2,-5088.11,-166.104,442.035,0.727311,'552:0 554:0 555:0 '),\n+(554,'ShimmerRidge3',0,1,802,1,10,2,-5043,-267.85,441.4,2.19994,'553:0 '),\n+(555,'ShimmerRidge4',0,1,802,1,10,2,-5021.64,-132.237,411.899,3.77858,'553:0 551:0 '),\n+(556,'DunmoroghC1',0,1,1,1,10,2,-5391.34,-928.482,393.467,4.06525,'533:0 557:0 '),\n+(557,'IronforgeRamp',0,1,1,1,10,2,-5259.37,-493.579,386.436,3.14828,'556:0 9:0 558:0 '),\n+(558,'IronforgeRampMid',0,1,809,1,10,2,-5197.66,-730.697,445.722,5.89324,'557:0 559:0 '),\n+(559,'IronforgeRampTop',0,1,809,1,10,2,-5060.46,-745.984,480.27,3.47972,'558:0 8:0 '),\n+(560,'IronforgeBank',0,1537,1537,1,10,3,-4909.88,-969.761,501.463,5.46481,'8:0 '),\n+(561,'SGgate',0,51,1959,43,54,0,-6413.58,-2007.56,244.634,2.74852,'520:0 562:0 563:0 '),\n+(562,'DustfireValleyMid',0,51,1959,43,54,0,-6590.48,-1884.27,245.713,1.74321,'561:0 580:0 585:0 '),\n+(563,'SGexitE',0,51,51,43,54,0,-6906.38,-1818.59,241.661,5.89992,'561:0 564:0 566:0 593:0 '),\n+(564,'GrimesiltDigSite',0,51,247,43,54,0,-7019.65,-1698.57,241.667,5.46992,'563:0 565:0 566:0 567:0 568:0 '),\n+(565,'TannerCamp',0,51,1958,43,54,0,-7225.75,-1752.49,244.286,0.924438,'564:0 566:0 567:0 568:0 '),\n+(566,'SGtower4',0,51,1444,43,54,0,-6980,-1505.92,242.742,3.93841,'563:0 564:0 565:0 567:0 568:0 '),\n+(567,'SGtower3',0,51,1444,43,54,0,-7036.7,-1320.2,244.272,4.7631,'565:0 564:0 566:0 568:0 '),\n+(568,'SGsouth1',0,51,1444,43,54,0,-7155.86,-1317.76,242.155,5.03211,'565:0 569:0 567:0 564:0 566:0 '),\n+(569,'BRM_SG1',0,51,1445,43,54,0,-7215.95,-1057.94,242.73,1.72755,'571:0 568:0 570:0 572:0 573:0 '),\n+(570,'BRM_SG2',0,25,25,46,60,0,-7399.25,-1106.95,278.077,0.229401,'569:0 622:0 '),\n+(571,'SGwest1',0,51,51,43,54,0,-7085,-941.753,268.272,4.123,'569:0 572:0 573:0 '),\n+(572,'SGtower2',0,51,51,43,54,0,-7001.07,-1109.84,243.97,2.78587,'571:0 569:0 573:0 '),\n+(573,'SGwest2',0,51,51,43,54,0,-6974.99,-1007.32,241.667,3.29324,'571:0 569:0 572:0 574:0 588:0 '),\n+(574,'CauldronRampTop',0,51,246,43,54,0,-6974.25,-1172.02,228.781,3.87051,'573:0 575:0 '),\n+(575,'CauldronRampMid1',0,51,246,43,54,0,-7024.61,-1220.88,207.974,5.71816,'574:0 576:0 '),\n+(576,'CauldronRampMid2',0,51,246,43,54,0,-6955.19,-1270.62,180.686,0.528642,'575:0 577:0 581:0 '),\n+(577,'CauldronRampBottom',0,51,246,43,54,0,-6866.28,-1410.17,172.855,2.20156,'576:0 578:0 '),\n+(578,'CauldronRamp2Bottom',0,51,246,43,54,0,-6712.76,-1610.77,196.339,2.17329,'577:0 579:0 '),\n+(579,'CauldronRamp2Mid',0,51,246,43,54,0,-6668.28,-1664.76,229.053,1.92432,'578:0 580:0 '),\n+(580,'CauldronRamp2Top',0,51,246,43,54,0,-6680,-1730.07,255.913,4.54363,'562:0 579:0 '),\n+(581,'SlagPit1',0,51,1443,43,54,0,-6850.01,-1218.8,177.395,3.61294,'576:0 582:0 '),\n+(582,'SlagPit2',0,51,1443,43,54,0,-6764.59,-1174.15,187.213,1.12951,'581:0 583:0 '),\n+(583,'SlagPit3',0,51,1443,43,54,0,-6439.47,-1311.02,180.938,2.63197,'582:0 584:0 '),\n+(584,'SlagPit4',0,51,1443,43,54,0,-6631.29,-1289.33,208.714,0.00481129,'583:0 '),\n+(585,'SG_hubN1',0,51,51,43,54,0,-6686.77,-1347.22,247.961,4.79378,'562:0 586:0 588:0 589:0 '),\n+(586,'CauldronTopN',0,51,246,43,54,0,-6862.1,-1188.37,240.366,5.51045,'585:0 '),\n+(587,'FirewatchRidgeBottom',0,51,1442,43,54,0,-6612.66,-860.886,244.297,0.237204,'588:0 589:0 591:0 '),\n+(588,'FirewatchRidgeS',0,51,1442,43,54,0,-6817.17,-866.771,248.462,4.87941,'573:0 585:0 587:0 '),\n+(589,'ThoriumPointRampBottom',0,51,1442,43,54,0,-6608.41,-1025.59,244.328,1.21161,'587:0 585:0 590:0 '),\n+(590,'ThoriumPointRampTop',0,51,1446,43,54,1,-6473.64,-1104.63,303.285,2.64303,'589:0 180:0 '),\n+(591,'FirewatchRidgeTop1',0,51,1442,43,54,0,-6473.38,-887.709,324.088,3.80543,'587:0 592:0 '),\n+(592,'FirewatchRidgeTop2',0,51,1442,43,54,0,-6502.46,-1018.74,344.372,1.2407,'591:0 '),\n+(593,'SGexitEmid',0,51,51,43,54,0,-6952.2,-2064.74,282.478,5.11429,'563:0 594:0 '),\n+(594,'BLexitW',0,3,3,33,45,0,-6885.86,-2233.35,242.64,0.361067,'593:0 595:0 24:0 '),\n+(595,'ApocryphansRest',0,3,337,33,45,0,-6892.26,-2477.47,247.238,1.71982,'594:0 87:0 596:0 597:0 600:0 601:0 602:0 '),\n+(596,'CampCaggS',0,3,344,33,45,0,-7270.91,-2407.34,268.195,5.1163,'595:0 597:0 '),\n+(597,'CampCaggE',0,3,3,33,45,0,-7140.34,-2650.51,243.568,0.467924,'595:0 596:0 602:0 603:0 '),\n+(598,'KargathE',0,3,3,33,45,0,-6600.53,-2373.56,254.037,0.026153,'600:0 599:0 24:0 '),\n+(599,'KargathNE',0,3,3,33,45,0,-6431.02,-2454.24,321.326,3.51922,'598:0 600:0 '),\n+(600,'DustbowlW',0,3,1878,33,45,0,-6718.55,-2572.24,241.801,0.471881,'595:0 598:0 599:0 601:0 602:0 '),\n+(601,'DustbowlNE',0,3,1878,33,45,0,-6653.03,-2889.09,241.667,2.73974,'595:0 600:0 602:0 620:0 '),\n+(602,'BL_hubC',0,3,1879,33,45,0,-6902.56,-2958.24,244.772,1.67356,'600:0 597:0 601:0 595:0 608:0 603:0 '),\n+(603,'AgmondsendS',0,3,345,33,45,0,-7141.97,-3251.77,246.326,0.774282,'597:0 602:0 604:0 605:0 607:0 '),\n+(604,'BL_elemsS',0,3,3,33,45,0,-7319.09,-3144.54,317.901,5.93436,'603:0 '),\n+(605,'AgmondsEnd',0,3,345,33,45,0,-7033.01,-3313.39,238.277,2.5061,'603:0 606:0 607:0 609:0 '),\n+(606,'BL_elemsSE',0,3,3,33,45,0,-7339.37,-3450.9,320.961,0.385524,'605:0 '),\n+(607,'CampBoff',0,3,342,33,45,0,-7039.11,-3655.92,244.152,1.66966,'603:0 605:0 608:0 609:0 '),\n+(608,'BL_hubN1',0,3,1877,33,45,0,-6667.51,-3285.91,241.069,2.14484,'25:0 602:0 607:0 609:0 620:0 '),\n+(609,'BL_hubNE1',0,3,1898,33,45,0,-6775.23,-3555.53,245.004,5.79028,'605:0 607:0 608:0 610:0 617:0 620:0 '),\n+(610,'LethlorRavineEntranceS',0,3,339,38,45,0,-6742.54,-3895.6,264.574,1.61394,'609:0 611:0 '),\n+(611,'LethlorRavineS',0,3,339,38,45,0,-7002.17,-3938.58,263.889,5.47219,'610:0 612:0 '),\n+(612,'LethlorRavineC',0,3,339,38,45,0,-6820.98,-4135.08,263.933,2.32276,'611:0 613:0 '),\n+(613,'LethlorRavineN',0,3,339,38,45,0,-6424.74,-4106.41,263.889,3.0143,'612:0 614:0 '),\n+(614,'LethlorRavineNW',0,3,339,38,45,0,-6513.4,-4004.6,264.394,5.30492,'613:0 615:0 '),\n+(615,'LethlorRavineEntranceN',0,3,339,38,45,0,-6396.09,-3976.18,268.618,3.37284,'614:0 616:0 '),\n+(616,'LethlorRavineExitN',0,3,1898,38,45,0,-6467.07,-3837.32,315.608,5.41801,'615:0 617:0 '),\n+(617,'CampKoshS',0,3,1898,33,45,0,-6360.66,-3685.6,245.154,4.17511,'616:0 609:0 618:0 619:0 '),\n+(618,'CampKosh',0,3,341,33,45,0,-6249.45,-3750.01,243.041,2.72409,'617:0 619:0 '),\n+(619,'HammertoesDigsite',0,3,346,33,45,0,-6349.91,-3447.28,241.681,0.369852,'617:0 618:0 620:0 621:0 '),\n+(620,'BL_hubN2',0,3,338,33,45,0,-6494.59,-3248.21,242.617,1.06886,'25:0 601:0 608:0 609:0 619:0 '),\n+(621,'MakersTerrace',0,3,1897,33,45,0,-6056.99,-3302.11,258.645,3.45646,'86:0 505:0 619:0 '),\n+(622,'BRM_SG3',0,25,25,46,60,0,-7496.19,-1063.83,264.543,4.72301,'570:0 623:0 628:0 '),\n+(623,'BRM_chain1',0,25,25,46,60,0,-7501.48,-1151.43,269.644,1.34305,'622:0 624:0 627:0 '),\n+(624,'BRM_chain2',0,25,25,46,60,0,-7599.78,-1110.62,249.93,1.94977,'623:0 625:0 '),\n+(625,'BRM_chain3',0,25,25,46,60,0,-7523.43,-1048.09,180.912,0.471264,'624:0 626:0 '),\n+(626,'BRM_chain4',0,25,25,46,60,0,-7383.99,-1012.09,173.658,3.00809,'625:0 '),\n+(627,'BRM_BRS1',0,25,25,46,60,0,-7609.9,-1226.43,233.401,0.518375,'623:0 628:0 '),\n+(628,'BRM_BS1',0,25,25,46,60,0,-7697.61,-1089.8,217.609,3.00611,'627:0 622:0 629:0 '),\n+(629,'BRM_BS2',0,25,25,46,60,0,-7769.06,-1129.81,215.084,0.38328,'628:0 630:0 '),\n+(630,'BRM_BS3',0,25,25,46,60,0,-7993.75,-1138.96,163.061,0.128021,'629:0 631:0 637:0 639:0 641:0 '),\n+(631,'DracodarNW',0,46,2421,48,56,0,-7968.74,-817.038,131.202,4.58672,'630:0 632:0 636:0 '),\n+(632,'AltarOfStormsRoad',0,46,46,48,56,0,-7803.25,-717,176.761,6.28318,'631:0 633:0 '),\n+(633,'AltarOfStormsFork',0,46,255,48,56,0,-7679.67,-712.976,183.628,3.3461,'632:0 634:0 635:0 '),\n+(634,'AltarOfStormsVendor',0,46,255,48,56,0,-7644.75,-636.535,200.452,4.00749,'633:0 '),\n+(635,'AltarOfStorms1',0,46,255,48,56,0,-7626.75,-709.048,183.359,5.20123,'633:0 2368:0 '),\n+(636,'DracodarW',0,46,2421,48,56,0,-8170.67,-727.141,135.21,5.81979,'631:0 637:0 '),\n+(637,'DracodarS',0,46,2421,48,56,0,-8255.07,-1040.7,147.3,0.143321,'630:0 636:0 638:0 639:0 '),\n+(638,'DracodarS_hill1',0,46,2421,48,56,0,-8419.15,-933.413,214.705,5.70788,'637:0 '),\n+(639,'DracodarSE',0,46,46,48,56,0,-8254.03,-1168.68,144.64,0.0510463,'630:0 637:0 640:0 641:0 '),\n+(640,'DracodarS_hill2',0,46,46,48,56,0,-8431.62,-1227.92,207.816,0.498725,'639:0 '),\n+(641,'DracodarHub',0,46,46,48,56,0,-8073.86,-1401.78,132.05,4.03301,'630:0 639:0 642:0 644:0 645:0 '),\n+(642,'BlackrockStrongholdOutside',0,46,46,48,56,0,-7757.29,-1591.7,133.263,1.43923,'641:0 643:0 644:0 646:0 '),\n+(643,'BlackrockStrongholdInside',0,46,252,48,56,0,-7698.11,-1443.02,139.787,4.00159,'642:0 '),\n+(644,'PillarOfAshS',0,46,46,48,56,0,-8232.79,-1737.58,147.888,6.17911,'641:0 642:0 645:0 658:0 '),\n+(645,'PillarOfAshE',0,46,253,48,56,0,-8102.12,-1922.65,134.695,1.31201,'641:0 644:0 646:0 647:0 658:0 '),\n+(646,'ThaurissanNW',0,46,250,48,56,0,-7704.8,-2045.32,133.437,1.61634,'642:0 645:0 139:0 647:0 648:0 '),\n+(647,'DreadmaulRockW',0,46,249,48,56,0,-7971.45,-2449.46,130.882,1.47692,'646:0 645:0 648:0 652:0 654:0 658:0 659:0 660:0 '),\n+(648,'DreadmaulRockNW',0,46,249,48,56,0,-7665.96,-2453.95,147.044,2.94798,'647:0 646:0 138:0 649:0 654:0 '),\n+(649,'DreadmaulRockNE',0,46,249,48,56,0,-7765.85,-2707.5,172.836,1.14313,'648:0 650:0 655:0 '),\n+(650,'DreadmaulRockSE',0,46,2420,48,56,0,-8161.75,-2869.02,134.8,0.000368118,'649:0 138:0 651:0 652:0 659:0 '),\n+(651,'MorgansVigil',0,46,2418,48,56,3,-8379.57,-2741.96,186.492,6.13436,'650:0 652:0 659:0 '),\n+(652,'DreadmaulRockTop1',0,46,249,48,56,0,-7971.64,-2664.1,198.213,2.32517,'647:0 650:0 651:0 138:0 653:0 '),\n+(653,'DreadmaulRockTop2',0,46,249,48,56,0,-7873.63,-2613.13,221.072,2.92403,'652:0 '),\n+(654,'DreadmaulRockNWW',0,46,249,48,56,0,-7776.13,-2493.23,160.084,5.03518,'648:0 647:0 '),\n+(655,'DreadmaulRockInside1',0,46,249,48,56,0,-7848.98,-2661.75,172.955,1.73534,'649:0 656:0 657:0 '),\n+(656,'DreadmaulRockInside2',0,46,249,48,56,0,-7961.48,-2603.36,173.834,6.08133,'655:0 '),\n+(657,'DreadmaulRockInside3',0,46,249,48,56,0,-7975.04,-2695.45,157.958,5.80842,'655:0 '),\n+(658,'DreadmaulPassW',0,46,46,48,56,0,-8216.14,-2308.1,151.442,1.03911,'644:0 645:0 647:0 659:0 '),\n+(659,'DreadmaulPassN',0,46,46,48,56,0,-8150.16,-2629.44,133.659,1.18246,'647:0 650:0 651:0 658:0 660:0 '),\n+(660,'DreadmaulPass',0,46,2417,48,56,0,-8431.68,-2546.4,133.207,6.07628,'647:0 659:0 661:0 '),\n+(661,'RedridgeExitN',0,44,44,13,25,0,-8900,-2574.56,131.851,0.152413,'660:0 75:0 663:0 '),\n+(662,'RendersRockInside',0,44,998,13,25,0,-8738.68,-2205.37,149.754,2.59501,'75:0 '),\n+(663,'AlthersMillEntrance',0,44,97,13,25,0,-9153.73,-2628.6,109.561,0.156359,'661:0 664:0 690:0 '),\n+(664,'RedridgeHub1',0,44,44,13,25,0,-9099.79,-2451.23,120.464,0.197585,'663:0 665:0 667:0 669:0 '),\n+(665,'RedridgeBridgeN',0,44,69,13,25,2,-9287.68,-2284.47,67.5443,5.81789,'664:0 10:0 672:0 673:0 '),\n+(666,'RedridgeW',0,44,44,13,25,2,-9312.11,-1873.26,82.1473,5.08747,'10:0 672:0 '),\n+(667,'RedridgeCanyons1',0,44,95,13,25,2,-8916.14,-2305.07,134.682,3.96044,'664:0 668:0 670:0 '),\n+(668,'RedridgeCanyons2',0,44,95,13,25,2,-8864.57,-2150.9,133.327,3.71892,'667:0 669:0 670:0 '),\n+(669,'RedridgeCanyons3',0,44,69,13,25,2,-9145.97,-2198.54,119.516,4.7478,'668:0 664:0 670:0 '),\n+(670,'RedridgeCanyons4',0,44,95,13,25,2,-9135.91,-2029.37,127.775,5.01877,'667:0 668:0 669:0 77:0 '),\n+(671,'RethbanCavernsInside',0,44,98,13,25,0,-8826.83,-1947.01,133.091,2.11555,'77:0 '),\n+(672,'RedridgeBridgeS',0,44,44,13,25,2,-9503.49,-2289.12,74.7234,1.13183,'665:0 666:0 674:0 675:0 '),\n+(673,'EverstillN',0,44,68,13,25,2,-9263.45,-2458.04,56.1636,1.20646,'665:0 '),\n+(674,'ThreeCorners',0,44,1002,13,25,0,-9607.09,-2055.97,65.077,4.99696,'672:0 675:0 692:0 693:0 694:0 '),\n+(675,'RedridgeS1',0,44,1001,13,25,0,-9713.82,-2284.16,63.9369,5.46531,'672:0 674:0 676:0 677:0 '),\n+(676,'RedridgeS2',0,44,68,13,25,0,-9620.32,-2514.61,59.4453,0.974015,'675:0 677:0 '),\n+(677,'RedridgeS3',0,44,1001,13,25,0,-9624.96,-2717.09,56.3955,1.53951,'676:0 675:0 678:0 679:0 691:0 '),\n+(678,'StonewatchS',0,44,70,18,25,0,-9468.55,-3007.78,135.551,1.52185,'677:0 689:0 '),\n+(679,'RedridgeS4',0,44,997,13,25,0,-9751.37,-3185.18,58.6091,5.63735,'677:0 680:0 681:0 '),\n+(680,'RedridgeE1',0,44,997,13,25,0,-9611,-3315.1,49.8404,2.09716,'679:0 681:0 682:0 683:0 684:0 '),\n+(681,'RedridgeE2',0,44,71,13,25,0,-9499.43,-3249.9,50.6,3.02197,'679:0 680:0 '),\n+(682,'RedridgeE3',0,44,44,18,25,2,-9598.71,-3503.57,121.964,2.30923,'680:0 683:0 '),\n+(683,'RedridgeE4',0,44,71,18,25,1,-9465.03,-3460.8,116.076,2.91242,'680:0 682:0 74:0 684:0 '),\n+(684,'RedridgeE5',0,44,71,18,25,0,-9469.61,-3328.04,5.51622,4.94268,'680:0 683:0 '),\n+(685,'RedridgeNE',0,44,1000,18,25,0,-9116.4,-3271.35,104.33,2.00332,'74:0 686:0 687:0 '),\n+(686,'RedridgeE6',0,44,1000,18,25,0,-9317.33,-3210.41,107.191,5.54352,'685:0 74:0 687:0 '),\n+(687,'StonewatchFork',0,44,70,18,25,0,-9195.1,-3020.88,94.6252,4.57746,'686:0 685:0 688:0 689:0 690:0 '),\n+(688,'StonewatchTower',0,44,999,18,25,0,-9297.56,-2958.62,128.754,5.64364,'687:0 689:0 '),\n+(689,'StonewatchTop',0,44,2099,18,25,0,-9364.92,-3072.52,164.756,3.2698,'687:0 688:0 678:0 '),\n+(690,'AlthersMillCenter',0,44,97,13,25,0,-9215.61,-2770.74,89.3399,4.66193,'687:0 663:0 '),\n+(691,'EverstillE',0,44,44,13,25,0,-9457.68,-2870.36,85.486,2.24488,'677:0 '),\n+(692,'ThreeCornersCamp1',0,44,1002,13,25,0,-9472.89,-1956.22,83.561,4.19346,'674:0 693:0 694:0 '),\n+(693,'RedridgeExitW1',0,44,1002,13,25,2,-9620.34,-1809.71,51.8565,1.49408,'692:0 674:0 694:0 696:0 '),\n+(694,'RedridgeExitW2',0,44,1002,13,25,0,-9831.1,-1766.69,23.8242,2.51983,'692:0 674:0 693:0 695:0 792:0 '),\n+(695,'ElwynnHubS1',0,12,798,1,10,2,-9928.36,-1115.12,24.1788,6.21189,'705:0 704:0 694:0 696:0 706:0 '),\n+(696,'ElwynnHubE1',0,12,12,1,10,2,-9659.48,-1341.54,48.8561,4.72993,'693:0 697:0 698:0 704:0 695:0 '),\n+(697,'EastvaleLC1',0,12,88,1,10,2,-9405,-1343.43,50.0284,2.89799,'696:0 698:0 699:0 '),\n+(698,'StoneCairnLakeSE',0,12,86,1,10,2,-9299.52,-1180.36,69.4951,3.31622,'696:0 697:0 699:0 701:0 797:0 '),\n+(699,'StoneCairnLakeNE',0,12,86,1,10,2,-8956.22,-1264.96,77.7779,2.94511,'700:0 697:0 698:0 797:0 '),\n+(700,'StoneCairnLakeNW',0,12,86,1,10,2,-8860.62,-826.796,71.9141,4.57088,'699:0 701:0 797:0 '),\n+(701,'StoneCairnLakeSW',0,12,12,1,10,2,-9355.59,-802.598,64.4981,0.692979,'89:0 700:0 708:0 698:0 705:0 706:0 707:0 797:0 '),\n+(702,'JasperlodeMineInside1',0,12,54,1,10,2,-9125.33,-585.357,58.3507,3.90606,'89:0 703:0 '),\n+(703,'JasperlodeMineInside2',0,12,54,1,10,2,-9049.44,-618.138,53.1456,4.05725,'702:0 '),\n+(704,'ElwynnHubE2',0,12,12,1,10,2,-9613.79,-1100.85,40.5009,4.62273,'696:0 705:0 695:0 '),\n+(705,'ElwynnHubE3',0,12,12,1,10,2,-9618.95,-1024.81,40.4731,4.99973,'704:0 695:0 701:0 706:0 707:0 '),\n+(706,'BrackwellPumpkinPatch',0,12,62,1,10,2,-9777.88,-877.924,39.5328,5.4101,'705:0 701:0 695:0 707:0 '),\n+(707,'ElwynnHubC1',0,12,12,1,10,2,-9609.57,-527.364,55.1285,4.48725,'89:0 708:0 701:0 705:0 706:0 716:0 '),\n+(708,'CrystalLakeE',0,12,18,1,10,2,-9464.16,-422.645,58.9952,3.63313,'89:0 701:0 707:0 709:0 '),\n+(709,'CrystalLakeW',0,12,18,1,10,2,-9470.07,-173.045,59.9322,4.58858,'708:0 710:0 7:0 '),\n+(710,'NorthshireExit',0,12,12,1,10,2,-9133.8,-66.2742,82.4151,1.35237,'709:0 16:0 13:0 7:0 '),\n+(711,'EchoRidgeMineInside',0,12,34,1,10,2,-8560.22,-214.447,85.0045,2.95145,'70:0 '),\n+(712,'TradeDistrict',0,1519,1519,1,10,3,-8794.44,645.505,94.4595,3.54245,'16:0 '),\n+(713,'ForestsEdgeS',0,12,60,1,10,2,-10070.2,658.114,37.3319,5.88491,'72:0 88:0 717:0 '),\n+(714,'FargodeepMineOutside',0,12,57,1,10,2,-9868.23,221.066,14.0194,6.19474,'7:0 71:0 72:0 715:0 '),\n+(715,'FargodeepMineInside',0,12,57,1,10,2,-9779.25,104.966,4.57989,3.01191,'714:0 '),\n+(716,'ElwynnHubS2',0,12,12,1,10,2,-9808.32,-269.092,40.0067,5.15408,'71:0 707:0 '),\n+(717,'ElwynnExitW',0,12,60,1,10,2,-9747.07,741.601,25.5892,4.55914,'7:0 88:0 72:0 713:0 718:0 '),\n+(718,'WestfallExitNE',0,40,916,8,20,2,-9853.3,918.261,30.2216,5.34454,'717:0 719:0 745:0 746:0 '),\n+(719,'Longshore1',0,40,2,8,20,2,-9616.19,1059.16,5.79699,0.013632,'720:0 718:0 745:0 '),\n+(720,'Longshore2',0,40,2,8,20,2,-9634.2,1389.29,9.09694,4.71817,'719:0 721:0 '),\n+(721,'Longshore3',0,40,2,8,20,2,-9648.12,1575.23,3.54258,4.75547,'720:0 722:0 '),\n+(722,'Longshore4',0,40,2,8,20,2,-9776.1,1654.24,11.5179,2.15188,'721:0 723:0 742:0 743:0 '),\n+(723,'Longshore5',0,40,2,8,20,2,-9985.75,1913.6,4.86301,5.35756,'722:0 724:0 742:0 '),\n+(724,'Longshore6',0,40,2,8,20,2,-10334,2061.94,3.69692,5.05125,'723:0 725:0 739:0 '),\n+(725,'Longshore7',0,40,2,8,20,2,-10695.4,2102.07,8.28685,6.14098,'724:0 726:0 738:0 '),\n+(726,'Longshore8',0,40,2,8,20,2,-10975.2,2108.77,-0.213533,6.27058,'725:0 727:0 737:0 '),\n+(727,'Longshore9',0,40,2,8,20,2,-11307.8,1926.18,9.26031,4.25015,'726:0 728:0 '),\n+(728,'Longshore10',0,40,2,8,20,2,-11466.2,1725.82,8.61195,0.641238,'727:0 729:0 '),\n+(729,'DaggerHillsW',0,40,920,8,20,2,-11264.1,1714.56,39.9062,4.76851,'728:0 730:0 737:0 '),\n+(730,'DaggerHillsC1',0,40,920,8,20,2,-11258.8,1470.77,88.9353,4.93148,'729:0 731:0 '),\n+(731,'DaggerHillsC2',0,40,920,8,20,2,-11211.1,1297.89,91.1699,1.90966,'730:0 732:0 733:0 '),\n+(732,'DaggerHillsNook',0,40,920,8,20,2,-11235.2,1182.36,91.6522,1.1871,'731:0 733:0 '),\n+(733,'DaggerHillsE',0,40,920,8,20,2,-11062.7,1163.02,43.0261,2.75789,'736:0 732:0 731:0 734:0 735:0 750:0 '),\n+(734,'DustPlains',0,40,922,8,20,2,-11152,739.176,32.5228,1.40505,'733:0 735:0 750:0 '),\n+(735,'DeadAcre',0,40,917,8,20,2,-10770.8,864.294,33.1505,2.913,'736:0 733:0 734:0 746:0 750:0 '),\n+(736,'WestfallHubC1',0,40,40,8,20,2,-10842.5,1196.94,34.875,1.14192,'12:0 15:0 735:0 733:0 738:0 741:0 750:0 '),\n+(737,'DemontsPlace',0,40,921,8,20,2,-11087.9,1894.97,35.4372,5.06105,'726:0 729:0 12:0 738:0 '),\n+(738,'AlexstonFarmstead',0,40,219,8,20,2,-10615,1671.77,41.41,4.1441,'737:0 725:0 12:0 741:0 742:0 736:0 '),\n+(739,'GoldCoastQuarry',0,40,113,8,20,2,-10403.7,1909.99,9.96272,4.64675,'724:0 740:0 741:0 '),\n+(740,'GoldCoastQuarryInside',0,40,113,8,20,2,-10575.3,1990.25,-8.03668,3.01509,'739:0 '),\n+(741,'WestfallHubC2',0,40,40,8,20,2,-10495.4,1349.24,42.6842,1.76042,'738:0 739:0 15:0 742:0 745:0 736:0 '),\n+(742,'WestfallHubC3',0,40,918,8,20,2,-10274.9,1408.84,38.9079,3.90454,'741:0 738:0 723:0 722:0 15:0 743:0 745:0 '),\n+(743,'JangolodeMine',0,40,111,8,20,2,-10017,1466.37,41.0745,6.08639,'742:0 722:0 744:0 745:0 '),\n+(744,'JangolodeMineInside',0,40,111,8,20,2,-9887.11,1427.15,40.0346,0.896887,'743:0 '),\n+(745,'SaldeansFarm',0,40,107,8,20,2,-10154.1,1116.55,36.8816,1.65283,'15:0 718:0 719:0 741:0 742:0 743:0 746:0 '),\n+(746,'WestfallHubE1',0,40,40,8,20,2,-10333.7,859.579,39.774,0.563072,'15:0 718:0 735:0 745:0 752:0 '),\n+(747,'DefiasHideout',0,1581,1581,15,22,2,-11112,1483.69,32.39,3.56723,'12:0 748:0 '),\n+(748,'Deadmines1',0,1581,1581,15,22,2,-11252.8,1533.82,28.6803,0.814416,'747:0 749:0 '),\n+(749,'Deadmines2',0,1581,1581,15,22,2,-11214.4,1638.37,27.2613,1.55073,'748:0 '),\n+(750,'WestfallExitSE',0,40,40,8,20,2,-10870.3,667.353,30.8385,4.48578,'733:0 734:0 735:0 736:0 15:0 751:0 '),\n+(751,'DuskwoodExitW',0,10,10,18,30,0,-10857.5,557.367,30.4883,6.27453,'750:0 752:0 14:0 753:0 755:0 '),\n+(752,'HushedBankN',0,10,1097,18,30,0,-10326.3,623.959,26.42,3.17024,'746:0 751:0 757:0 758:0 763:0 '),\n+(753,'AddlesSteadW',0,10,536,18,30,0,-11054.9,270.776,25.2035,6.01338,'751:0 14:0 754:0 '),\n+(754,'AddlesSteadE',0,10,536,18,30,0,-10997.4,179.443,30.4059,1.04377,'753:0 14:0 766:0 '),\n+(755,'RHCemetaryS',0,10,492,18,30,0,-10587.6,294.965,31.0441,0.0129175,'751:0 14:0 756:0 757:0 765:0 766:0 '),\n+(756,'RHCemetaryNE',0,10,492,24,30,0,-10398,201.223,34.2462,5.21064,'755:0 757:0 758:0 762:0 764:0 765:0 '),\n+(757,'RHCemetaryW',0,10,492,22,30,0,-10427.4,409.679,46.6267,4.40525,'752:0 755:0 756:0 758:0 759:0 '),\n+(758,'RHCemetaryN',0,10,243,24,30,0,-10308.2,348.036,59.693,3.07006,'752:0 757:0 756:0 '),\n+(759,'DawningWoodCatacombs1',0,10,2098,18,30,0,-10261.5,383.964,10.414,2.92673,'757:0 760:0 '),\n+(760,'DawningWoodCatacombs2',0,10,2098,18,30,0,-10234.6,284.99,2.79944,4.82935,'759:0 761:0 '),\n+(761,'DawningWoodCatacombs3',0,10,2098,18,30,0,-10220.1,166.144,0.047382,3.23144,'760:0 762:0 '),\n+(762,'DawningWoodCatacombs4',0,10,2098,18,30,0,-10338.4,136.513,4.82896,0.380849,'756:0 761:0 '),\n+(763,'DuskwoodNW1',0,10,799,18,30,0,-10173.2,350.099,32.3759,4.62356,'752:0 764:0 '),\n+(764,'DuskwoodNW2',0,10,799,18,30,0,-10183.8,-55.3832,27.6626,5.67208,'763:0 756:0 765:0 793:0 '),\n+(765,'DuskwoodC1',0,10,10,18,30,0,-10482,-16.5716,51.5694,0.81242,'764:0 755:0 756:0 766:0 '),\n+(766,'DuskwoodC2',0,10,10,18,30,0,-10750.8,67.4617,28.3337,1.80202,'765:0 755:0 14:0 754:0 767:0 '),\n+(767,'DuskwoodC3',0,10,10,18,30,0,-10910.1,-371.894,39.8351,3.06651,'766:0 768:0 769:0 773:0 774:0 775:0 779:0 795:0 '),\n+(768,'DuskwoodExitS',0,10,10,18,30,0,-11268.2,-368.936,61.3823,6.14723,'767:0 858:0 '),\n+(769,'VulGolOgreMound1',0,10,93,24,30,0,-11005.9,-176.407,14.5532,5.12818,'767:0 770:0 771:0 '),\n+(770,'VulGolOgreMound2',0,10,93,24,30,0,-10959.3,-38.5543,13.6432,4.44096,'769:0 771:0 '),\n+(771,'VulGolOgreMound3',0,10,93,24,30,0,-11083.6,-80.7448,16.7954,5.39522,'769:0 770:0 772:0 '),\n+(772,'VulGolOgreMoundInside',0,10,93,24,30,0,-11234.1,-172.07,4.22438,4.5174,'771:0 '),\n+(773,'YorgenFarmsteadW',0,10,245,24,30,0,-11096.9,-452.028,32.1764,4.54422,'767:0 774:0 '),\n+(774,'YorgenFarmsteadE',0,10,245,24,30,0,-11052.8,-598.054,29.3447,1.47723,'767:0 773:0 776:0 '),\n+(775,'DuskwoodC4',0,10,10,18,30,0,-10908,-739.892,54.8364,0.583838,'767:0 776:0 778:0 779:0 '),\n+(776,'RottingOrchardW',0,10,241,18,30,0,-10986.3,-770.892,55.1122,1.55183,'774:0 775:0 777:0 778:0 '),\n+(777,'RottingOrchardS',0,10,241,18,30,0,-11103.5,-891.729,62.1149,0.69773,'776:0 778:0 '),\n+(778,'DuskwoodC5',0,10,10,18,30,0,-10823,-837.935,55.75,1.63037,'775:0 776:0 777:0 779:0 780:0 '),\n+(779,'DuskwoodC6',0,10,10,18,30,0,-10768,-644.008,42.2621,2.90859,'767:0 775:0 778:0 786:0 '),\n+(780,'DuskwoodE1',0,10,42,18,30,0,-10757.1,-1156.72,24.9918,1.69202,'778:0 124:0 782:0 783:0 '),\n+(781,'RolandsDoomInside',0,10,2161,24,30,0,-11157.5,-1167.04,42.5151,0.315576,'124:0 '),\n+(782,'TranquilGardensCemetery',0,10,121,18,30,0,-11023.4,-1315.7,53.1833,6.14911,'780:0 783:0 '),\n+(783,'DuskwoodE2',0,10,10,18,30,0,-10813.8,-1366.37,42.2527,0.00140238,'780:0 782:0 3:0 784:0 794:0 '),\n+(784,'DarkshireExitE',0,10,10,18,30,0,-10539.7,-1338.09,48.0906,1.65268,'785:0 783:0 3:0 '),\n+(785,'DuskwoodExitE',0,10,10,18,30,0,-10442.9,-1486.98,73.8977,5.13748,'784:0 798:0 '),\n+(786,'DuskwoodC7',0,10,242,24,30,0,-10451.9,-825.607,50.4132,2.61635,'779:0 787:0 788:0 793:0 '),\n+(787,'DuskwoodC8',0,10,242,24,30,0,-10647.9,-908.344,50.934,5.93661,'786:0 3:0 788:0 '),\n+(788,'DuskwoodNE1',0,10,242,18,30,0,-10219.2,-1021.98,31.9202,2.92658,'786:0 787:0 3:0 789:0 790:0 793:0 '),\n+(789,'ManorMismantle',0,10,1098,24,30,0,-10332.7,-1264.03,35.3024,1.53643,'788:0 3:0 790:0 '),\n+(790,'DuskwoodNE2',0,10,10,18,30,0,-10181.4,-1145.35,24.304,3.28393,'788:0 789:0 791:0 793:0 '),\n+(791,'DuskwoodNE3',0,10,10,18,30,0,-10067.1,-1379.68,29.9246,1.99195,'790:0 792:0 '),\n+(792,'DuskwoodExitNE',0,10,10,18,30,0,-9963.01,-1637.21,27.2574,2.08816,'694:0 791:0 '),\n+(793,'DuskwoodN',0,10,799,18,30,0,-10020.5,-660.012,39.1578,1.66406,'790:0 788:0 764:0 786:0 '),\n+(794,'Naraxis',0,10,10,18,30,0,-10619.4,-1502.44,90.534,3.1465,'783:0 '),\n+(795,'TwilightGroveEntrance',0,10,10,50,60,0,-10718.7,-425.681,126.691,0.442773,'767:0 796:0 '),\n+(796,'TwilightGrove',0,10,856,50,60,0,-10419.3,-421.597,45.6561,3.03852,'795:0 '),\n+(797,'HeroesVigil',0,12,56,1,10,0,-9101.04,-1034.1,72.9837,5.20227,'698:0 699:0 700:0 701:0 '),\n+(798,'DWPExitW',0,41,2697,50,60,0,-10464.2,-1734.78,86.7801,1.49361,'785:0 171:0 802:0 '),\n+(799,'DeadwindRavineSW',0,41,2558,50,60,0,-10919.4,-1957.74,114.777,4.67839,'171:0 800:0 '),\n+(800,'TheViceW',0,41,2561,50,60,0,-10843.3,-2118.87,121.161,1.51324,'799:0 172:0 79:0 '),\n+(801,'DWPExitE',0,41,2938,50,60,0,-10593.5,-2125.78,90.9212,3.83802,'172:0 170:0 802:0 811:0 '),\n+(802,'DeadsmansCrossingE',0,41,41,50,60,0,-10437,-2037.61,94.6245,1.59492,'798:0 801:0 810:0 '),\n+(803,'GroshgokCompoundInside',0,41,2937,50,60,0,-11169.4,-2483.11,105.139,0.944598,'79:0 '),\n+(804,'KarazhanOutskirts',0,41,2562,50,60,0,-11148.9,-2130,55.9803,1.2403,'79:0 805:0 806:0 '),\n+(805,'Karazhan',0,41,2562,50,60,0,-11115.2,-2008.72,48.4017,4.31317,'804:0 806:0 '),\n+(806,'KarazhanCellarEntrance',0,41,2837,50,60,0,-11173.4,-2033.69,47.0759,0.798522,'804:0 805:0 807:0 '),\n+(807,'KarazhanCellar1',0,41,2837,50,60,0,-11100.4,-1963.77,1.93936,4.49657,'806:0 808:0 '),\n+(808,'KarazhanCellar2',0,41,2837,50,60,0,-11159.5,-1898.41,-17.7918,6.21463,'807:0 809:0 '),\n+(809,'KarazhanCellar3',0,41,2837,50,60,0,-11033.9,-1910.04,-32.9889,4.98353,'808:0 '),\n+(810,'DeadmansCrossingBottom',0,41,41,50,60,0,-10282.6,-2019.49,51.0186,2.21028,'802:0 '),\n+(811,'SSExitW',0,8,8,33,45,0,-10546.2,-2376.39,84.2413,1.87648,'801:0 812:0 '),\n+(812,'SSW1',0,8,8,33,45,0,-10381.8,-2424.26,52.7345,2.75809,'811:0 813:0 '),\n+(813,'SSW2',0,8,8,33,45,0,-10427.8,-2549.06,24.1947,5.68762,'812:0 814:0 830:0 '),\n+(814,'IthariusCaveOutside',0,8,1777,33,45,0,-10561.3,-2508.68,22.0709,5.83489,'813:0 815:0 816:0 '),\n+(815,'IthariusCave',0,8,1777,33,45,0,-10677.4,-2531.21,28.912,6.2649,'814:0 '),\n+(816,'SSCRW1',0,8,1780,33,45,0,-10387.5,-2710.03,21.6778,1.56036,'814:0 817:0 818:0 819:0 830:0 '),\n+(817,'MistyValley',0,8,116,33,45,0,-10110,-2413.91,29.9136,4.35049,'816:0 818:0 '),\n+(818,'SSW3',0,8,8,33,45,0,-10320.4,-2794.27,21.9908,1.07734,'817:0 816:0 819:0 820:0 829:0 830:0 '),\n+(819,'Harborage',0,8,657,33,45,2,-10113,-2807.71,22.1444,3.06047,'818:0 816:0 820:0 829:0 '),\n+(820,'SSN1',0,8,1798,33,45,0,-10099.4,-3266.23,20.4381,1.58785,'818:0 819:0 821:0 827:0 828:0 829:0 '),\n+(821,'SSN2',0,8,76,33,45,0,-9974.74,-3687.45,21.6788,2.09247,'820:0 822:0 823:0 827:0 828:0 829:0 '),\n+(822,'SSNE1',0,8,2403,33,45,0,-9634.53,-3969.85,0.0000146627,2.75613,'821:0 823:0 '),\n+(823,'SSNE2',0,8,300,33,45,0,-10034.8,-4306.49,1.78832,0.101491,'822:0 821:0 824:0 826:0 827:0 '),\n+(824,'SSE',0,8,300,33,45,0,-10512,-4371.71,6.04597,6.27469,'823:0 825:0 80:0 826:0 827:0 '),\n+(825,'SSSE',0,8,300,33,45,0,-11038.3,-4116.28,1.98503,5.82703,'186:0 824:0 80:0 '),\n+(826,'PoolOfTearsE',0,8,1778,33,45,0,-10444.5,-4087.57,23.9872,1.47592,'80:0 186:0 823:0 824:0 827:0 '),\n+(827,'PoolOfTearsN',0,8,8,33,45,0,-10147.3,-3802.05,22.1649,2.27113,'820:0 821:0 823:0 824:0 826:0 828:0 829:0 '),\n+(828,'PoolOfTearsW',0,8,8,33,45,0,-10377.4,-3577.61,22.0023,3.94206,'820:0 821:0 827:0 80:0 51:0 829:0 '),\n+(829,'SSC',0,8,1798,33,45,0,-10292.9,-3192.2,22.1489,5.69742,'818:0 819:0 820:0 821:0 827:0 828:0 51:0 830:0 '),\n+(830,'SSExitS',0,8,8,33,45,0,-10553.9,-3043.33,24.794,0.0857489,'813:0 816:0 818:0 829:0 51:0 831:0 '),\n+(831,'SSExitSS',0,4,4,43,54,0,-10690.8,-2978.8,37.8508,5.87412,'830:0 834:0 '),\n+(832,'StagalbogInside1',0,8,1817,33,45,0,-10966.8,-3697.03,11.0105,4.21105,'80:0 833:0 '),\n+(833,'StagalbogInside2',0,8,1817,33,45,0,-10894.6,-3613.42,16.0499,6.1176,'832:0 '),\n+(834,'BLExitN',0,4,4,43,54,0,-10811.4,-2992.21,41.134,0.16765,'831:0 835:0 839:0 846:0 '),\n+(835,'BLNW1',0,4,1437,43,54,0,-11009.6,-2785.5,4.70615,5.63206,'834:0 836:0 839:0 840:0 '),\n+(836,'DreadmaulHoldEntrance',0,4,1437,43,54,0,-10916.9,-2714.76,7.63624,3.85903,'835:0 837:0 838:0 '),\n+(837,'DreadmaulHoldRight',0,4,1437,43,54,0,-10814.2,-2705.35,8.14439,3.20125,'836:0 838:0 '),\n+(838,'DreadmaulHoldLeft',0,4,1437,43,54,0,-10859.8,-2615.61,8.07541,4.52661,'836:0 837:0 '),\n+(839,'BLNW2',0,4,4,43,54,0,-11080.5,-2903.3,9.18506,0.371865,'835:0 834:0 196:0 '),\n+(840,'BLW1',0,4,4,43,54,0,-11268.2,-2725.08,11.1047,5.91718,'835:0 841:0 842:0 '),\n+(841,'DreadmaulPost',0,4,1439,43,54,0,-11528.8,-2858.71,8.50437,6.19557,'840:0 196:0 842:0 856:0 '),\n+(842,'BLAltarOfStormsBottom',0,4,4,43,54,0,-11501.6,-2718.85,5.65372,0.900431,'840:0 841:0 843:0 856:0 '),\n+(843,'BLAltarOfStormsMid',0,4,4,47,54,0,-11381.5,-2566.03,75.8033,3.74358,'842:0 844:0 '),\n+(844,'BLAltarOfStormsTop',0,4,1441,47,54,1,-11255.9,-2556.41,97.0494,2.9896,'843:0 '),\n+(845,'BLE1',0,4,4,43,54,0,-11149.6,-3232.6,8.07553,2.30354,'196:0 846:0 850:0 '),\n+(846,'NethergardeOutside',0,4,1438,43,54,0,-10961.7,-3200.5,45.5708,0.954623,'834:0 845:0 847:0 '),\n+(847,'NethergardeInside1',0,4,1438,43,54,2,-11008.9,-3340.48,64.7225,4.78147,'846:0 848:0 '),\n+(848,'NethergardeInside2',0,4,1438,43,54,3,-10993.2,-3453.24,64.8707,3.21459,'847:0 849:0 '),\n+(849,'NethergardeInside3',0,4,1438,43,54,2,-11112.2,-3438.11,79.0946,6.1402,'848:0 '),\n+(850,'BLE2',0,4,1440,43,54,0,-11310.9,-3410.18,7.46828,4.16649,'845:0 851:0 852:0 '),\n+(851,'BLE2Inside',0,4,1440,43,54,0,-11225.8,-3486.48,8.69295,2.17551,'850:0 '),\n+(852,'BLE3',0,4,4,43,54,0,-11438.8,-3304.34,7.30604,5.76674,'196:0 850:0 853:0 854:0 '),\n+(853,'BLSE',0,4,72,43,54,0,-11632.5,-3381.23,14.577,0.215935,'852:0 854:0 855:0 '),\n+(854,'BLS1',0,4,4,43,54,0,-11607.8,-3099.85,7.81021,5.30924,'196:0 852:0 853:0 855:0 '),\n+(855,'BLS2',0,4,72,43,54,0,-11765.8,-2959.84,7.91609,5.25623,'853:0 854:0 856:0 2370:0 '),\n+(856,'BLS3',0,4,4,43,54,0,-11716.6,-2785.99,8.27783,3.20635,'855:0 841:0 842:0 857:0 '),\n+(857,'TaintedScar1',0,4,73,55,60,0,-11907.8,-2658.64,-2.15637,5.48008,'856:0 '),\n+(858,'SVExitN',0,33,33,33,45,0,-11362.1,-380.82,64.9035,0.170793,'768:0 859:0 '),\n+(859,'SVExitNFork',0,33,33,33,45,0,-11397.1,-284.376,58.1739,3.29667,'858:0 860:0 861:0 '),\n+(860,'RebelCamp',0,33,99,33,45,3,-11314.2,-182.813,75.1397,3.66777,'859:0 '),\n+(861,'SVEntranceN',0,33,33,33,45,0,-11511.9,-302.586,38.7986,0.353382,'859:0 863:0 864:0 862:0 '),\n+(862,'NesingwarysExpeditionCamp',0,33,100,33,45,1,-11616,-50.0157,10.9823,4.49439,'861:0 879:0 880:0 881:0 901:0 902:0 907:0 '),\n+(863,'SVNBridge1N',0,33,33,33,45,0,-11604.1,-282.333,37.221,5.64107,'861:0 879:0 '),\n+(864,'SVNHubN1',0,33,33,33,45,0,-11643.7,-473.703,17.1608,0.3141,'861:0 865:0 873:0 '),\n+(865,'KurzensCompound',0,33,101,33,45,0,-11604,-644.056,29.157,3.77181,'864:0 866:0 872:0 '),\n+(866,'TheStockpile1',0,33,106,33,45,0,-11461.5,-750.28,30.6105,4.24893,'865:0 867:0 '),\n+(867,'TheStockpile2',0,33,106,33,45,0,-11514.8,-845.839,22.0076,3.08261,'866:0 868:0 869:0 '),\n+(868,'TheStockpile3',0,33,106,33,45,0,-11418.4,-794.929,14.9653,3.89354,'867:0 '),\n+(869,'TheStockpile4',0,33,106,33,45,0,-11506.4,-946.763,29.2275,0.414209,'867:0 870:0 '),\n+(870,'TheStockpile5',0,33,106,33,45,0,-11406.8,-896.737,18.0813,0.89682,'869:0 871:0 '),\n+(871,'TheStockpile6',0,33,106,33,45,0,-11337.1,-985.396,27.3203,1.9202,'870:0 '),\n+(872,'SVNHubN2',0,33,33,33,45,0,-11729.7,-799.127,29.6214,0.89486,'865:0 873:0 875:0 913:0 '),\n+(873,'VentureCoBaseCamp',0,33,1760,33,45,0,-11959.6,-531.751,11.3978,5.11834,'872:0 864:0 874:0 875:0 913:0 '),\n+(874,'SVNHub1',0,33,33,33,45,0,-12225,-546.002,28.8839,0.0407319,'873:0 875:0 911:0 913:0 915:0 '),\n+(875,'SVE1',0,33,33,33,45,0,-12149.1,-965.968,32.4681,1.43677,'872:0 873:0 874:0 876:0 878:0 913:0 '),\n+(876,'MoshoggOgreMound',0,33,105,33,45,0,-12352.7,-972.262,13.1171,5.38338,'875:0 877:0 878:0 913:0 '),\n+(877,'MoshoggOgreMoundInside',0,33,105,33,45,0,-12364,-1147.48,0.104103,2.92311,'876:0 '),\n+(878,'MoshoggOgreMoundUpper',0,33,105,33,45,0,-12466.5,-881.644,39.1084,5.72306,'875:0 876:0 914:0 918:0 '),\n+(879,'SVNBridge1C',0,33,33,33,45,0,-11710.1,-210.005,39.5643,5.90174,'863:0 880:0 862:0 '),\n+(880,'SVNBridge1S',0,33,33,33,45,0,-11818.3,-43.4252,39.7487,5.27146,'879:0 862:0 903:0 905:0 907:0 '),\n+(881,'SVNHubW1',0,33,33,33,45,0,-11518.9,255.102,25.1192,4.23669,'862:0 882:0 883:0 901:0 '),\n+(882,'SVNHubW2',0,33,33,33,45,0,-11502.5,373.117,53.2392,3.3217,'881:0 883:0 '),\n+(883,'ZulKundaNE',0,33,33,33,45,0,-11650.7,401.397,42.8581,5.68183,'881:0 882:0 884:0 889:0 890:0 '),\n+(884,'ZulKundaE',0,33,33,33,45,0,-11785.5,436.17,47.4037,6.2807,'883:0 885:0 889:0 899:0 '),\n+(885,'ZulKundaSE',0,33,33,33,45,0,-11863.3,560.263,47.0214,5.06137,'884:0 886:0 887:0 889:0 '),\n+(886,'ZulKundaS',0,33,33,33,45,0,-11831.5,711.922,45.1329,4.4252,'885:0 888:0 '),\n+(887,'SavageCoastNW1',0,33,301,33,45,0,-11924.1,793.032,3.06387,4.97496,'885:0 894:0 185:0 897:0 898:0 '),\n+(888,'ZulKunda1',0,33,102,33,45,0,-11690.4,742.837,49.7495,3.41987,'886:0 889:0 891:0 '),\n+(889,'ZulKunda2',0,33,102,33,45,0,-11694.8,565.959,49.7011,1.34053,'883:0 884:0 885:0 888:0 890:0 891:0 '),\n+(890,'ZulKunda3',0,33,102,33,45,0,-11550.4,601.183,50.5784,3.11945,'883:0 889:0 891:0 '),\n+(891,'ZulKunda4',0,33,102,33,45,0,-11622.9,760.15,39.7329,0.007312,'888:0 889:0 890:0 892:0 893:0 '),\n+(892,'ZulKunda5',0,33,102,33,45,0,-11528.7,724.898,59.4101,3.50037,'891:0 '),\n+(893,'ZulKundaW',0,33,122,33,45,0,-11572.6,840.524,8.14386,2.72086,'891:0 894:0 '),\n+(894,'SavageCoastNW2',0,33,122,33,45,0,-11692.5,954.651,3.70656,5.00441,'893:0 887:0 185:0 897:0 '),\n+(895,'YojambaIsleW',0,33,3357,33,45,0,-11810.6,1364.62,0.0261903,4.46053,'185:0 '),\n+(896,'YojambaIsleN',0,33,3357,33,45,0,-11748.3,1318.44,5.22585,2.37531,'185:0 '),\n+(897,'VileReefIsle',0,33,301,33,45,0,-12154.2,871.091,18.6659,5.996,'894:0 887:0 '),\n+(898,'SavageCoastW1',0,33,301,33,45,0,-12016.1,440.588,3.35169,0.661185,'887:0 899:0 900:0 '),\n+(899,'SVNWHub1',0,33,33,33,45,0,-11888.7,290.463,12.6077,0.998902,'898:0 884:0 900:0 901:0 902:0 903:0 '),\n+(900,'SavageCoastW2',0,33,33,33,45,0,-12196.8,238.239,2.19021,4.81004,'898:0 899:0 904:0 37:0 '),\n+(901,'SVNHunW3',0,33,100,33,45,0,-11656.6,59.5536,17.3151,1.50941,'899:0 881:0 862:0 902:0 '),\n+(902,'TkashiRuins',0,33,126,33,45,0,-11843.2,59.0602,14.1655,3.34528,'899:0 901:0 862:0 903:0 905:0 '),\n+(903,'KalaiRuins',0,33,125,33,45,0,-12069.3,66.3927,-5.18214,3.5436,'902:0 899:0 880:0 904:0 906:0 '),\n+(904,'SVNHub2',0,33,33,33,45,0,-12283.3,28.601,18.2879,0.246879,'903:0 900:0 37:0 912:0 '),\n+(905,'SVNBridge2N',0,33,33,33,45,0,-11907.9,-50.0313,39.7259,0.870484,'902:0 880:0 906:0 907:0 '),\n+(906,'SVNBridge2S',0,33,33,33,45,0,-12090.1,-139.679,35.2928,0.399245,'903:0 905:0 910:0 '),\n+(907,'SVCHub1',0,33,33,33,45,0,-11853.5,-167.599,15.3333,0.51312,'862:0 880:0 905:0 '),\n+(908,'SavageCoastW3',0,33,301,33,45,0,-12543.1,74.9728,0.873061,0.513523,'37:0 912:0 '),\n+(909,'SavageCoastW4',0,33,1578,33,45,0,-12691.2,142.464,3.092,5.80512,'921:0 924:0 925:0 936:0 '),\n+(910,'SVNBridge3W',0,33,33,33,45,0,-12171.4,-240.719,29.8621,0.766786,'906:0 911:0 912:0 '),\n+(911,'SVNBridge3E',0,33,33,33,45,0,-12157.4,-431.52,30.3485,1.45204,'874:0 910:0 913:0 '),\n+(912,'MizjahRuins',0,33,129,33,45,0,-12468.7,-147.093,13.8431,5.95827,'904:0 908:0 910:0 916:0 '),\n+(913,'SVNHub3',0,33,1740,33,45,0,-12127.6,-649.027,14.8876,2.30225,'874:0 876:0 911:0 873:0 875:0 872:0 '),\n+(914,'BaliamahRuins',0,33,127,33,45,0,-12540.7,-734.478,39.4424,6.20568,'878:0 915:0 917:0 918:0 '),\n+(915,'SVNHub4',0,33,33,33,45,0,-12417,-580.502,11.0755,6.10556,'914:0 874:0 916:0 '),\n+(916,'SVNHub5',0,33,33,33,45,0,-12522,-370.721,12.7107,0.882666,'912:0 915:0 917:0 921:0 '),\n+(917,'ZiatajaiRuins',0,33,128,33,45,0,-12701.1,-464.07,30.0552,6.19787,'914:0 916:0 918:0 920:0 '),\n+(918,'ZulMamweN',0,33,33,33,45,0,-12776.9,-784.489,63.0348,0.421265,'878:0 914:0 917:0 919:0 '),\n+(919,'ZulMamweC',0,33,103,33,45,0,-12985.7,-833.459,69.9343,0.193503,'918:0 920:0 '),\n+(920,'ZulMamweW',0,33,103,33,45,0,-12943.6,-608.837,53.0521,6.05178,'917:0 919:0 '),\n+(921,'SVSHub1',0,33,33,33,45,0,-12826,-301.024,9.96047,5.46666,'916:0 922:0 909:0 925:0 '),\n+(922,'SVSVentureCoMine1',0,33,33,33,45,0,-12978,-452.477,53.6008,5.60214,'921:0 923:0 '),\n+(923,'SVSVentureCoMine2',0,33,33,33,45,0,-13088.9,-466.483,47.2022,3.61705,'922:0 '),\n+(924,'GurubashiArenaOuterN',0,33,1577,33,45,0,-12949,251.702,18.4183,2.2214,'909:0 937:0 '),\n+(925,'STCHub1',0,33,1577,33,45,0,-13136.8,-184.248,-3.10173,5.92455,'909:0 921:0 926:0 929:0 '),\n+(926,'CrystalveinMine1',0,33,310,33,45,0,-13322.7,-420.202,15.4509,2.04861,'925:0 927:0 928:0 929:0 '),\n+(927,'CrystalveinMine2',0,33,310,33,45,0,-13158.5,-564.518,4.64271,0.568135,'926:0 928:0 '),\n+(928,'CrystalveinMine3',0,33,310,33,45,0,-13170,-467.696,3.57551,3.1305,'926:0 927:0 '),\n+(929,'STCHub2',0,33,1577,33,45,0,-13246.3,-110.492,19.5979,5.04296,'926:0 925:0 930:0 '),\n+(930,'GurubashiOuterSE',0,33,1741,33,45,0,-13280.6,57.3154,17.1498,4.95263,'929:0 931:0 932:0 933:0 934:0 '),\n+(931,'GurubashiOuterSSE',0,33,1741,33,45,0,-13402.5,96.0163,23.7905,6.03724,'930:0 932:0 933:0 934:0 935:0 943:0 944:0 '),\n+(932,'RuinsOfJubuwal',0,33,477,33,45,0,-13382.8,-24.5642,22.0332,0.894086,'930:0 931:0 '),\n+(933,'GurubashiArenaInside1',0,33,2177,33,45,0,-13216,312.587,21.8574,3.50161,'930:0 931:0 934:0 '),\n+(934,'GurubashiArenaInside2',0,33,2177,33,45,0,-13163.8,257.166,21.8574,3.62531,'930:0 931:0 933:0 '),\n+(935,'STCHub3',0,33,1577,33,45,0,-13475.6,312.292,31.942,5.22555,'931:0 938:0 942:0 '),\n+(936,'SSavageCoast1',0,33,1578,33,45,0,-12862.3,459.666,6.403,4.74253,'909:0 937:0 '),\n+(937,'GurubashiArenaOuterW',0,33,1741,33,45,0,-13076.6,428.328,24.6507,6.12678,'924:0 936:0 938:0 '),\n+(938,'GurubashiArenaOuterSW',0,33,1577,33,45,0,-13273.2,479.65,3.7542,5.77924,'935:0 937:0 939:0 940:0 '),\n+(939,'BloodsailCompoundW',0,33,1739,33,45,0,-13331.9,777.87,2.16424,3.85895,'938:0 940:0 941:0 '),\n+(940,'BloodsailCompoundC',0,33,1739,33,45,0,-13470.3,687.069,8.46535,3.18977,'938:0 939:0 941:0 '),\n+(941,'SSavageCoast2',0,33,1578,33,45,0,-13705.9,620.54,10.152,3.17013,'939:0 940:0 966:0 968:0 '),\n+(942,'STCHub4',0,33,1577,33,45,0,-13618.7,330.576,43.7429,5.59271,'935:0 943:0 968:0 '),\n+(943,'STCHub5',0,33,1577,33,45,0,-13719.1,129.331,23.7103,3.72188,'931:0 942:0 944:0 964:0 965:0 '),\n+(944,'STCHub6',0,33,1577,33,45,0,-13572.2,-93.8439,42.7481,1.44857,'931:0 943:0 945:0 '),\n+(945,'RuinsOfAboraz',0,33,311,33,45,0,-13627.7,-351.772,12.434,1.10692,'944:0 946:0 '),\n+(946,'CrystalShore1',0,33,302,33,45,0,-13867.2,-89.5993,18.4363,2.92315,'945:0 947:0 964:0 '),\n+(947,'CrystalShore2',0,33,302,33,45,0,-14086.6,-142.781,3.55938,1.30916,'946:0 948:0 '),\n+(948,'WildShore1',0,33,43,33,45,0,-14260.2,-15.7846,3.81308,5.84287,'947:0 949:0 '),\n+(949,'WildShore2',0,33,43,33,45,0,-14293.2,109.305,7.5176,0.82025,'948:0 950:0 962:0 '),\n+(950,'WildShore3',0,33,43,33,45,0,-14585.8,177.319,2.91916,6.15507,'949:0 951:0 952:0 955:0 958:0 '),\n+(951,'WildShore4',0,33,43,33,45,0,-14708.6,511.328,2.52661,5.16547,'950:0 952:0 '),\n+(952,'WildShoreShips1',0,33,43,33,45,0,-14894,302.458,3.67936,4.08476,'950:0 951:0 953:0 954:0 955:0 '),\n+(953,'WildShoreShips1Left',0,33,43,33,45,0,-14940,357.129,0.221882,0.0694,'952:0 '),\n+(954,'WildShoreShips1Right',0,33,43,33,45,0,-15009.9,266.91,0.198072,0.0485881,'952:0 '),\n+(955,'WildShoreShips2',0,33,43,33,45,0,-14843.8,75.9812,2.07268,0.570875,'950:0 952:0 956:0 957:0 '),\n+(956,'WildShoreShips2Center',0,33,43,33,45,0,-14926.8,110.764,0.2001,4.9102,'955:0 '),\n+(957,'JagueroIsle1',0,33,297,33,45,0,-14817.1,-427.547,1.62653,0.804531,'955:0 958:0 '),\n+(958,'JagueroIsle2',0,33,297,33,45,0,-14556.9,-277.709,10.043,3.68499,'950:0 957:0 '),\n+(959,'BootyBayW',0,33,35,33,45,0,-14300.4,523.178,8.69884,4.45859,'36:0 960:0 '),\n+(960,'BootyBayS',0,33,35,33,45,1,-14462.8,467.081,15.1246,5.4423,'36:0 959:0 '),\n+(961,'BootyBayEntrance',0,33,1577,33,45,0,-14249.5,333.168,24.6767,2.49077,'36:0 962:0 967:0 '),\n+(962,'STCHub7',0,33,1577,33,45,0,-14217.2,239.309,20.2817,3.77098,'949:0 961:0 963:0 '),\n+(963,'STCHub8',0,33,1577,33,45,0,-14073.6,266.586,17.42,5.16308,'962:0 964:0 965:0 '),\n+(964,'MistvaleValley',0,33,1737,33,45,0,-13952.8,86.1666,15.8298,5.2161,'76:0 943:0 946:0 963:0 '),\n+(965,'STCHub9',0,33,1577,33,45,0,-13879.6,258.837,17.7662,5.83459,'943:0 963:0 '),\n+(966,'SSavageCoast3',0,33,1578,33,45,0,-13908.6,676.67,10.0579,5.32409,'967:0 941:0 969:0 '),\n+(967,'SSavageCoast4',0,33,1578,33,45,0,-14050.8,500.109,2.8225,0.635261,'961:0 966:0 '),\n+(968,'SSavageCoast5',0,33,1578,33,45,0,-13683.6,505.174,34.349,3.2526,'941:0 942:0 969:0 970:0 '),\n+(969,'SSavageCoast6',0,33,1577,33,45,0,-13859.9,575.635,44.9464,6.06235,'966:0 968:0 '),\n+(970,'SSavageCoast7',0,33,1577,33,45,0,-13849.3,494.156,89.7643,5.84244,'968:0 971:0 '),\n+(971,'SSavageCoast8',0,33,1738,33,45,0,-13806.7,377.83,94.1372,2.10198,'970:0 '),\n+(972,'Shadowglen',1,141,188,1,4,2,10281,1001.05,1342.98,5.96933,'33:0 62:0 '),\n+(973,'ShadowthreadCaveInside',1,141,257,1,10,2,10936.3,951.018,1322.87,0.852457,'62:0 '),\n+(974,'ShadowglenExit1',1,141,188,1,10,2,10236.2,699.749,1353.3,3.24203,'33:0 975:0 '),\n+(975,'ShadowglenExit2',1,141,141,1,10,2,9988.41,591.889,1315.9,0.829698,'974:0 976:0 983:0 '),\n+(976,'StarbreezeVillage',1,141,260,1,10,2,9825.13,399.226,1308.15,0.857567,'975:0 977:0 978:0 '),\n+(977,'StarbreezeBackyard',1,141,141,1,10,2,10038.9,286.037,1323.77,1.89429,'976:0 '),\n+(978,'TeldrassilS1',1,141,141,1,10,2,9396.17,568.108,1320.55,0.244948,'976:0 979:0 '),\n+(979,'TeldrassilS2',1,141,141,1,10,2,9232.75,931.478,1321.37,5.94693,'978:0 980:0 '),\n+(980,'TeldrassilS3',1,141,141,1,10,2,9171.08,1419.38,1320.31,5.13404,'979:0 981:0 '),\n+(981,'TeldrassilHubS1',1,141,141,1,10,2,9352.14,1496.95,1274.46,0.140488,'980:0 982:0 34:0 988:0 '),\n+(982,'GnarlpineHold',1,141,261,5,10,2,9106.12,1796.37,1324.94,4.59408,'981:0 '),\n+(983,'DolanaarRoadE',1,141,141,1,10,2,9883.36,802.735,1309.84,1.38768,'975:0 63:0 34:0 '),\n+(984,'FelRockInside',1,141,258,1,10,2,10112.3,1195.5,1312.02,5.06294,'63:0 '),\n+(985,'DolanaarRoadW',1,141,141,1,10,2,9956.16,1248.6,1307.74,2.3227,'34:0 64:0 989:0 '),\n+(986,'BanethilBarrowDenInside',1,141,262,4,10,2,9759.16,1553.23,1264.26,3.07786,'64:0 '),\n+(987,'TeldrassilHubW1',1,141,141,1,10,2,10032.9,1820.23,1320.1,4.58073,'64:0 988:0 989:0 990:0 992:0 '),\n+(988,'PoolsOfArlithrien',1,141,478,1,10,2,9596.69,1802.05,1293.91,5.64964,'981:0 987:0 '),\n+(989,'TeldrassilHubW2',1,141,141,1,10,2,10162.3,1440.21,1325.14,3.89821,'985:0 987:0 '),\n+(990,'OracleGladeRoad',1,141,141,4,10,2,10352,1874.33,1324.48,6.02465,'987:0 991:0 '),\n+(991,'OracleGlade',1,141,264,1,10,2,10884.7,2071.72,1327.43,2.94589,'990:0 '),\n+(992,'DarnassusEntrance',1,1657,1657,1,60,3,9945.1,2019.66,1351.87,4.64235,'987:0 '),\n+(993,'AuberdineSpawn',1,148,442,8,20,3,6553.45,522.918,11.8561,3.67005,'59:0 994:0 '),\n+(994,'LongWash1',1,148,453,8,20,2,6232.15,537.866,7.35703,5.18,'59:0 993:0 995:0 1008:0 '),\n+(995,'LongWash2',1,148,2077,8,20,2,5552.17,453.898,19.6886,6.27955,'994:0 996:0 1005:0 1008:0 '),\n+(996,'TwilightShore1',1,148,2078,14,20,2,5012.98,536.041,5.96794,4.54499,'995:0 997:0 1005:0 95:0 '),\n+(997,'TwilightShore2',1,148,2078,14,20,2,4688.48,865.878,2.79823,2.76606,'996:0 998:0 999:0 '),\n+(998,'TwilightShore3',1,148,2078,14,20,2,4503.92,906.145,4.30626,5.45958,'997:0 1002:0 1038:0 '),\n+(999,'RemtravelsExcavation',1,148,450,8,20,2,4714.44,550.759,26.823,1.95474,'997:0 1000:0 95:0 94:0 '),\n+(1000,'RemtravelsExcavationInside1',1,148,450,14,20,2,4620.8,642.65,6.43919,5.10026,'999:0 1001:0 '),\n+(1001,'RemtravelsExcavationInside2',1,148,450,14,20,2,4567.99,561.83,1.27184,0.69615,'1000:0 '),\n+(1002,'DarkshoreExitSW',1,148,2077,8,20,2,4243.34,412.704,58.3351,0.245327,'998:0 1003:0 1027:0 '),\n+(1003,'DarkshoreExitFork',1,148,2077,8,20,2,4395.16,213.188,52.2559,2.29326,'1002:0 1004:0 94:0 1006:0 '),\n+(1004,'DarkshoreExitSE',1,148,2077,8,20,2,4141.67,41.4988,23.6074,3.67163,'1003:0 1028:0 '),\n+(1005,'WindbendRiverN',1,148,2077,8,20,2,5261.19,254.236,30.0406,3.18665,'995:0 996:0 95:0 1008:0 1009:0 '),\n+(1006,'MastersGlaiveRoad',1,148,2077,8,20,2,4568.13,285.307,57.6068,1.63547,'94:0 95:0 1003:0 1007:0 '),\n+(1007,'MastersGlaive',1,148,449,8,20,2,4541.58,449.011,32.0175,5.01071,'1006:0 '),\n+(1008,'AmetharanRoad',1,148,2077,8,20,2,5720.14,311.438,20.1904,4.41184,'59:0 994:0 995:0 1005:0 1009:0 1010:0 '),\n+(1009,'Ametharan',1,148,447,8,20,2,5586.01,84.3345,27.1266,1.57459,'1005:0 1008:0 1010:0 '),\n+(1010,'AmetharanN',1,148,447,8,20,2,5801.69,83.785,34.5622,2.98046,'59:0 1008:0 1009:0 1011:0 '),\n+(1011,'DarkshoreMoonkins',1,148,148,8,20,2,6267.1,23.9018,32.4976,3.19251,'59:0 1010:0 1012:0 1013:0 '),\n+(1012,'DarkshoreNRoad1',1,148,148,8,20,2,6568,183.3,33.0481,3.37511,'59:0 1011:0 1013:0 1014:0 '),\n+(1013,'BashalAran',1,148,446,8,20,2,6724.32,-182.155,32.4813,2.68198,'1011:0 1012:0 1014:0 '),\n+(1014,'DarkshoreNRoad2',1,148,148,8,20,2,6818.81,102.669,19.5599,2.84101,'1012:0 1013:0 1015:0 '),\n+(1015,'DarkshoreNRoad3',1,148,148,8,20,2,6851.5,-74.339,19.6655,5.58399,'1014:0 1016:0 1022:0 '),\n+(1016,'DarkshoreNRoad4',1,148,148,8,20,2,7119.42,-81.8027,14.4199,3.09232,'1015:0 1017:0 1022:0 '),\n+(1017,'DarkshoreNRoad5',1,148,148,8,20,2,7256.24,-291.22,21.0422,4.79468,'1016:0 1018:0 1022:0 '),\n+(1018,'DarkshoreNRoad6',1,148,148,8,20,2,7251.65,-503.552,27.2626,1.57453,'1017:0 1019:0 1023:0 1026:0 1024:0 '),\n+(1019,'CliffspringFalls1',1,148,445,8,20,2,6945.23,-647.544,58.2647,0.698808,'1018:0 96:0 1022:0 '),\n+(1020,'CliffspringFallsInside1',1,148,445,8,20,2,6751.15,-678.916,69.6518,0.322209,'96:0 '),\n+(1021,'CliffspringFallsInside2',1,148,445,8,20,2,6801.08,-758.228,69.6369,1.04478,'96:0 '),\n+(1022,'CliffspringRiverCamp',1,148,456,8,20,2,6874.54,-444.951,41.5568,5.10331,'1015:0 1016:0 1017:0 1019:0 '),\n+(1023,'TowerOfAlthalaxx',1,148,444,14,20,2,7134.02,-794.131,67.6245,1.1665,'1018:0 1024:0 '),\n+(1024,'RuinsOfMathystra1',1,148,443,14,20,2,7266.69,-945.767,35.1327,5.29378,'1018:0 1023:0 1025:0 1026:0 '),\n+(1025,'RuinsOfMathystra2',1,148,443,14,20,2,7600.47,-1097.96,49.7759,2.73731,'1026:0 1024:0 '),\n+(1026,'RuinsOfMathystra3',1,148,443,14,20,2,7493.36,-767.521,12.9545,3.62677,'1018:0 1025:0 1024:0 '),\n+(1027,'ZoramStrandFork',1,331,331,18,30,2,3817.2,679.137,5.10897,5.73165,'1002:0 1035:0 1036:0 1039:0 '),\n+(1028,'AshenvaleNW_hub1',1,331,331,18,30,0,3974.7,-4.75098,16.9651,0.475045,'157:0 1004:0 1029:0 '),\n+(1029,'AshenvaleNW_hub2',1,331,331,18,30,0,3657.91,209.708,2.09702,5.65554,'156:0 1028:0 1030:0 1031:0 '),\n+(1030,'AshenvaleNW_hub3',1,331,331,18,30,0,3467.65,456.674,-1.34147,5.28246,'1029:0 1031:0 1032:0 1033:0 1035:0 '),\n+(1031,'AshenvaleNW_hub4',1,331,413,18,30,0,3455.92,219.392,12.6662,4.49903,'156:0 1029:0 1030:0 1033:0 '),\n+(1032,'AshenvaleNW_hub5',1,331,441,18,30,0,3249.97,704.667,5.38086,5.25498,'1030:0 1034:0 '),\n+(1033,'MaestrasPost',1,331,413,18,30,0,3259.03,232.17,11.012,5.89391,'156:0 1030:0 1031:0 1034:0 1040:0 '),\n+(1034,'LakeFalathim',1,331,441,18,30,0,3042.8,537.807,4.22352,5.78789,'1032:0 1033:0 '),\n+(1035,'ZoramStrandExit',1,331,331,18,30,0,3657.05,656.795,4.96231,0.51393,'158:0 1027:0 1030:0 1036:0 '),\n+(1036,'ZoramStrandC',1,331,414,18,30,0,3801.56,849.009,0.513784,2.44601,'158:0 1027:0 1035:0 1037:0 1039:0 '),\n+(1037,'ZoramStrandS',1,331,414,18,30,0,3530.82,1106.94,3.5186,5.37358,'158:0 1036:0 '),\n+(1038,'ZoramStrandNWIsle',1,331,414,18,30,0,4170.75,1326.83,19.2012,4.42522,'998:0 1039:0 '),\n+(1039,'ZoramStrandN',1,331,414,18,30,0,4069.2,824.531,3.14713,3.15877,'1027:0 1036:0 1038:0 '),\n+(1040,'MaestraHighway1',1,331,413,18,30,0,3098.29,226.932,38.2729,0.113369,'1033:0 1041:0 '),\n+(1041,'MaestraHighway2',1,331,413,18,30,0,3010.21,148.647,65.398,0.16052,'1040:0 1042:0 '),\n+(1042,'MaestraHighway3',1,331,331,18,30,0,2859.2,196.478,94.7169,5.92141,'1041:0 1043:0 '),\n+(1043,'MaestraHighway4',1,331,331,18,30,0,2812.81,41.9868,95.6736,1.28951,'1042:0 1044:0 1058:0 '),\n+(1044,'ThistlefurVillageExit',1,331,331,18,30,0,2868.2,-73.4622,101.174,1.57029,'1043:0 1045:0 1046:0 1056:0 1058:0 '),\n+(1045,'ThistlefurVillageRoad1',1,331,331,18,30,0,3135.26,-172.008,106.895,2.338,'1044:0 1046:0 1047:0 1051:0 '),\n+(1046,'ThistlefurVillageRoad2',1,331,331,18,30,0,3105.59,-62.1211,99.9184,3.67319,'1044:0 1045:0 '),\n+(1047,'ThistlefurVillage1',1,331,2301,18,30,0,3406.44,-322.711,134.117,2.65215,'1045:0 1048:0 '),\n+(1048,'ThistlefurVillage2',1,331,2301,18,30,0,3405.57,-442.447,153.072,1.32875,'1047:0 1049:0 1051:0 '),\n+(1049,'ThistlefurVillage3',1,331,2301,18,30,0,3502.9,-501.921,187.011,2.83083,'1048:0 1050:0 '),\n+(1050,'ThistlefurVillage4',1,331,2301,18,30,0,3340.18,-745.556,165.112,0.56888,'1049:0 '),\n+(1051,'ThistlefurVillage5',1,331,331,18,30,0,3151.47,-574.826,152.496,0.537465,'1045:0 1048:0 1052:0 '),\n+(1052,'IrisLakeFork',1,331,424,18,30,0,2898.98,-769.452,163.783,4.51548,'1051:0 1053:0 1054:0 1055:0 '),\n+(1053,'IrisLake',1,331,424,18,30,0,2942.58,-1048.01,198.163,1.57223,'1052:0 '),\n+(1054,'AshenvaleC_hub1',1,331,331,18,30,0,2507.45,-866.571,135.152,0.193841,'1052:0 1055:0 1065:0 '),\n+(1055,'AshenvaleC_hub2',1,331,415,18,30,0,2438.14,-533.1,114.408,0.47461,'38:0 1052:0 1054:0 1057:0 1059:0 '),\n+(1056,'AshenvaleC_hub3',1,331,415,18,30,2,2850.97,-220.421,105.829,4.13457,'38:0 1044:0 '),\n+(1057,'AshenvaleC_hub4h',1,331,415,18,30,0,2496.08,-368.618,107.608,4.35054,'1055:0 1058:0 '),\n+(1058,'AshenvaleC_hub5h',1,331,415,18,30,0,2723.63,-97.6203,94.1401,0.260605,'1043:0 1044:0 1057:0 1060:0 '),\n+(1059,'RuinsOfStardust',1,331,418,18,30,0,2078.15,-208.159,97.3023,6.04115,'1055:0 1063:0 '),\n+(1060,'FireScarShrine1',1,331,417,18,30,0,2256.66,75.4186,101.15,2.42832,'1058:0 1061:0 '),\n+(1061,'FireScarShrine2',1,331,417,18,30,0,2216.37,200.114,132.147,0.0014348,'1060:0 1062:0 '),\n+(1062,'FireScarShrine3',1,331,417,18,30,0,2267.87,408.396,133.106,0.831985,'1061:0 '),\n+(1063,'MystralLakeW',1,331,421,18,30,0,2023,-843.478,97.5457,1.65663,'1064:0 1059:0 165:0 168:0 '),\n+(1064,'MystralLakeC',1,331,421,18,30,0,1984.95,-1113.44,95.5274,1.49563,'1063:0 165:0 1067:0 '),\n+(1065,'AshenvaleC_hub6',1,331,331,18,30,0,2450.24,-1258.76,125.028,2.45577,'1054:0 1066:0 1068:0 1071:0 '),\n+(1066,'AshenvaleC_hub7',1,331,331,18,30,0,2235.23,-1257.52,78.4907,4.80606,'166:0 1065:0 165:0 '),\n+(1067,'AshenvaleC_hub8',1,331,331,18,30,0,1948.15,-1576.73,62.1809,2.79343,'167:0 1064:0 1069:0 '),\n+(1068,'AshenvaleC_hub9',1,331,426,18,30,0,2312.84,-1688.24,121.859,1.16373,'166:0 1065:0 1072:0 1074:0 '),\n+(1069,'AshenvaleC_hub10',1,331,331,18,30,0,2066.34,-1671.01,66.4345,2.13565,'166:0 1067:0 1070:0 '),\n+(1070,'AshenvaleE_hub1',1,331,2457,18,30,0,2042.45,-1869.26,98.5045,1.0065,'1069:0 1074:0 1106:0 '),\n+(1071,'AshenvaleC_hub11',1,331,331,18,30,0,2610.58,-1273.73,147.484,1.45233,'1065:0 1072:0 '),\n+(1072,'AshenvaleC_hub12',1,331,426,18,30,0,2492.08,-1690.32,135.531,1.25401,'1068:0 1071:0 1073:0 '),\n+(1073,'AshenvaleC_hub13',1,331,2457,18,30,0,2524.32,-1885.69,143.053,1.82734,'1072:0 1074:0 1075:0 '),\n+(1074,'AshenvaleC_hub14',1,331,2457,18,30,0,2243.34,-1738.27,110.775,5.1594,'1068:0 1073:0 1070:0 '),\n+(1075,'AshenvaleExitN1',1,331,2457,18,30,0,2722.91,-1983,158.23,2.65788,'1073:0 1076:0 1078:0 '),\n+(1076,'AshenvaleExitN2',1,331,2457,18,30,0,3188.58,-1706.76,164.247,3.95184,'1075:0 1077:0 '),\n+(1077,'AshenvaleExitN3',1,331,2457,18,30,0,3297.65,-1543.44,164.945,5.56976,'1076:0 1118:0 '),\n+(1078,'AshenvaleC_hub14',1,331,2457,18,30,0,2434.66,-2007.27,137.863,5.44996,'159:0 1075:0 '),\n+(1079,'FalfarenRiverN1',1,331,433,18,30,0,2635.78,-2457.48,169.635,2.50866,'159:0 1080:0 1086:0 '),\n+(1080,'FalfarenRiverN2',1,331,433,18,30,0,2714.01,-2536.19,182.43,2.13757,'1079:0 1081:0 160:0 '),\n+(1081,'NightRunE',1,331,428,18,30,0,2790.65,-2428.46,206.042,3.93612,'1080:0 1082:0 160:0 '),\n+(1082,'NightRun',1,331,428,18,30,0,2635.93,-2273.51,202.702,5.29878,'1081:0 1083:0 1084:0 '),\n+(1083,'NightRunC',1,331,428,18,30,0,2508.34,-2113.14,200.284,6.10971,'1082:0 1084:0 '),\n+(1084,'NightRunW1',1,331,428,18,30,0,2796.44,-2157.58,201.403,3.2489,'1082:0 1083:0 '),\n+(1085,'ForestSongEntranceW',1,331,2358,18,30,0,2816.28,-3116.79,176.969,1.10278,'160:0 161:0 1088:0 1089:0 '),\n+(1086,'AshenvaleE_hub2',1,331,2457,18,30,0,2468.98,-2717.07,150.406,4.36767,'1079:0 1087:0 1114:0 '),\n+(1087,'AshenvaleE_hub3',1,331,2457,18,30,0,2544.03,-2863.47,160.596,1.768,'1086:0 1088:0 '),\n+(1088,'SatyrnaarEntrance',1,331,2457,18,30,0,2634.38,-3046.12,161.142,6.24673,'1085:0 1087:0 1089:0 1090:0 1096:0 '),\n+(1089,'Satyrnaar',1,331,430,18,30,0,2728.6,-2942.91,140.775,5.09219,'1085:0 1088:0 '),\n+(1090,'AshenvaleE_hub4',1,331,2457,18,30,0,2718.15,-3174.63,154.002,4.95083,'1088:0 1091:0 '),\n+(1091,'AshenvaleE_hub5',1,331,2457,18,30,0,2747.9,-3325.14,129.722,0.481917,'161:0 1090:0 1092:0 1096:0 1097:0 '),\n+(1092,'AshenvaleE_hub6',1,331,2457,18,30,0,2858.75,-3503.4,106.63,0.432834,'1091:0 1093:0 1095:0 '),\n+(1093,'BoughShadowEntrance',1,331,2358,18,30,0,3097.87,-3414.65,140.149,2.35511,'161:0 1092:0 1094:0 '),\n+(1094,'BoughShadow',1,331,438,50,60,0,3193.56,-3715.88,121.867,1.87405,'1093:0 '),\n+(1095,'AshenvaleExitE1',1,331,2457,18,30,0,2885.88,-3697.95,96.0233,1.45779,'1092:0 1269:0 '),\n+(1096,'WarsongLumberCampW1',1,331,437,18,30,0,2228.79,-3249.63,101.566,0.607582,'1088:0 1091:0 1097:0 1099:0 '),\n+(1097,'WarsongLumberCampE1',1,331,437,18,30,0,2451.74,-3379.23,102.331,4.70735,'1091:0 1096:0 1098:0 1356:0 '),\n+(1098,'KargathiaKeep',1,331,2637,18,30,2,2437.92,-3546.25,98.3118,2.20389,'1097:0 '),\n+(1099,'FelfireHillFork',1,331,434,18,30,0,2080.86,-3145.14,101.473,3.35095,'1116:0 162:0 1096:0 1356:0 '),\n+(1100,'DemonFallRidgeW1',1,331,436,18,30,0,1674.45,-3019.31,126.383,5.53436,'162:0 1101:0 '),\n+(1101,'DemonFallRidgeW2',1,331,436,18,30,0,1590.49,-2969.19,181.724,5.65806,'1100:0 1102:0 '),\n+(1102,'DemonFallRidgeW3',1,331,436,18,30,0,1540.54,-2824.95,181.724,2.53218,'1101:0 1103:0 '),\n+(1103,'DemonFallRidgeW4',1,331,436,18,30,0,1461.22,-2803.04,146.324,2.97199,'1102:0 '),\n+(1104,'DemonFallRidgeE1',1,331,435,18,30,0,1627.48,-3316.31,144.676,0.784629,'162:0 1105:0 '),\n+(1105,'DemonFallRidgeE2',1,331,435,18,30,0,1721.33,-3476.04,144.293,2.30437,'1104:0 '),\n+(1106,'AshenvaleE_hub7',1,331,433,18,30,0,1988.27,-1943.15,97.1296,1.1247,'1070:0 1107:0 '),\n+(1107,'AshenvaleE_hub8',1,331,2457,18,30,0,1962.79,-2012.8,96.2461,1.06579,'1106:0 1108:0 '),\n+(1108,'AshenvaleE_hub9',1,331,2457,18,30,0,1921.52,-2170.42,94.4681,2.67153,'1107:0 1109:0 1113:0 '),\n+(1109,'AshenvaleE_hub10',1,331,2457,18,30,0,1650,-2198.36,90.4962,0.191633,'163:0 1108:0 1110:0 1111:0 1112:0 '),\n+(1110,'AshenvaleExitSh',1,331,2457,18,30,0,1372.44,-2259.8,89.962,3.46083,'1111:0 1109:0 1112:0 169:0 1518:0 '),\n+(1111,'AshenvaleExitSa',1,17,1703,8,25,2,1283.04,-2337.27,95.7661,5.44005,'1109:0 1110:0 1519:0 '),\n+(1112,'AshenvaleE_hub11',1,331,422,18,30,0,1407.02,-2005.8,95.7095,5.15141,'1109:0 1110:0 '),\n+(1113,'SplintertreePostRoadW',1,331,431,18,30,0,1994.45,-2424.98,91.2477,1.28488,'164:0 175:0 1108:0 1114:0 '),\n+(1114,'SplintertreePostFork',1,331,2457,18,30,0,2176.5,-2659.1,114.31,6.03653,'175:0 1086:0 1113:0 1115:0 '),\n+(1115,'SplintertreePostRoadE',1,331,2457,18,30,0,2082.36,-2724.41,108.011,0.790059,'164:0 1114:0 1116:0 '),\n+(1116,'FelfireHillBridgeW',1,331,434,18,30,0,2039.97,-2914.67,108.448,1.43407,'1099:0 1115:0 1356:0 '),\n+(1117,'DorDanilarrowDenInside',1,331,432,18,30,0,1800.96,-2749.28,74.2595,4.55915,'164:0 '),\n+(1118,'FelwoodExitS',1,361,361,46,56,0,3743.81,-1481.83,196.177,3.29581,'1077:0 1119:0 '),\n+(1119,'EmeraldSanctuaryFork',1,361,2479,46,56,0,3880.67,-1320.46,216.16,2.5595,'1118:0 1120:0 1123:0 1124:0 '),\n+(1120,'DeadwoodVillage1',1,361,1761,46,56,0,3687.18,-1161.35,207.07,5.5283,'1119:0 1121:0 1122:0 '),\n+(1121,'DeadwoodVillage2',1,361,1761,46,56,0,3530.84,-1083.16,232.998,0.383932,'1120:0 1122:0 '),\n+(1122,'DeadwoodVillage3',1,361,361,46,56,0,3799.15,-1018.83,233.051,3.60798,'1120:0 1121:0 1124:0 1149:0 '),\n+(1123,'EmeraldSanctuary',1,361,2479,46,56,1,4008.37,-1323.24,254.74,2.01756,'1119:0 1124:0 '),\n+(1124,'FelwoodRoad1',1,361,361,46,56,0,3917.77,-1102.56,251.192,4.86854,'1119:0 1122:0 1123:0 1125:0 1149:0 '),\n+(1125,'FelwoodRoad2',1,361,361,46,56,0,4111.01,-1000.91,273.994,3.79844,'1124:0 1126:0 1149:0 1155:0 '),\n+(1126,'FelwoodRoad3',1,361,361,46,56,0,4217.57,-895.05,283.719,4.15774,'1125:0 1127:0 1149:0 1156:0 1157:0 1158:0 '),\n+(1127,'FelwoodRoad4',1,361,361,46,56,0,4284.53,-848.098,284.982,3.75914,'1126:0 1128:0 '),\n+(1128,'FelwoodRoad5',1,361,361,46,56,0,4421.12,-848.39,292.935,3.21525,'1127:0 1129:0 1157:0 '),\n+(1129,'FelwoodRoad6',1,361,361,46,56,0,4543.91,-853.393,298.894,3.13867,'1128:0 1130:0 '),\n+(1130,'FelwoodRoad7',1,361,361,46,56,0,4626.9,-811.164,299.948,3.55493,'1129:0 1131:0 1158:0 '),\n+(1131,'FelwoodRoad8',1,361,361,46,56,0,4816.57,-743.65,300.125,3.49799,'1130:0 1132:0 1162:0 '),\n+(1132,'FelwoodRoad9',1,361,361,46,56,0,4924.41,-736.286,307.085,3.21525,'1131:0 1133:0 1161:0 '),\n+(1133,'FelwoodRoad10',1,361,361,46,56,0,5067.29,-754.16,325.077,3.06602,'1132:0 1134:0 1162:0 '),\n+(1134,'FelwoodRoad11',1,361,361,46,56,0,5190.8,-721.312,342.065,3.32245,'1133:0 1135:0 1163:0 '),\n+(1135,'FelwoodRoad12',1,361,1765,46,56,0,5321.67,-714.318,345.44,3.1693,'1134:0 1136:0 1175:0 '),\n+(1136,'FelwoodRoad13',1,361,361,46,56,0,5528.6,-586.974,357.722,3.70533,'1135:0 1137:0 1175:0 1176:0 '),\n+(1137,'FelwoodRoad14',1,361,361,46,56,0,5829.53,-657.626,373.409,2.93956,'1136:0 1138:0 1176:0 1177:0 '),\n+(1138,'FelwoodRoad15',1,361,361,46,56,0,6212.38,-740.556,409.705,2.87084,'1137:0 1139:0 '),\n+(1139,'FelwoodRoad16',1,361,361,46,56,0,6248.94,-853.467,415.845,1.8714,'1138:0 1140:0 1180:0 1188:0 '),\n+(1140,'FelwoodRoad17',1,361,361,46,56,0,6316.22,-1000.95,421.045,1.77912,'1139:0 1141:0 1181:0 '),\n+(1141,'FelwoodRoad18',1,361,361,46,56,0,6517.96,-1128.86,435.787,2.40548,'1140:0 1142:0 1187:0 '),\n+(1142,'FelwoodRoad19',1,361,361,46,56,0,6589.42,-1238.14,446.438,2.19734,'1141:0 1143:0 1181:0 149:0 '),\n+(1143,'FelwoodRoad20',1,361,361,46,56,0,6642.07,-1424.29,466.141,1.83997,'1142:0 1144:0 149:0 1190:0 '),\n+(1144,'FelwoodRoad21',1,361,361,46,56,0,6582.2,-1624.29,494.577,1.32358,'1143:0 1145:0 1190:0 '),\n+(1145,'FelwoodRoad22',1,361,361,46,56,0,6510.95,-1745.71,510.835,1.13311,'1144:0 1146:0 1183:0 '),\n+(1146,'FelwoodRoad23',1,361,361,46,56,0,6528.61,-1901.05,539.009,1.63379,'1145:0 1147:0 1191:0 1193:0 '),\n+(1147,'FelwoodRoad24',1,361,361,46,56,0,6558.12,-2008.36,559.656,1.52776,'1146:0 1148:0 1193:0 '),\n+(1148,'FelwoodRoad25',1,361,361,46,56,0,6560.77,-2085.29,574.689,1.48063,'1147:0 1191:0 148:0 '),\n+(1149,'JadefireGlenEntrance',1,361,361,46,56,0,3926.58,-911.03,268.957,1.31568,'1122:0 1124:0 1125:0 1126:0 1150:0 1157:0 '),\n+(1150,'JadefireGlen1',1,361,2480,46,56,0,3811.45,-783.703,310.11,5.52543,'1149:0 1151:0 1152:0 1153:0 '),\n+(1151,'JadefireGlen2',1,361,2480,46,56,0,3718.85,-847.307,312.709,0.532263,'1150:0 '),\n+(1152,'JadefireGlen3',1,361,2480,46,56,0,3912.89,-762.669,314.637,3.43039,'1150:0 '),\n+(1153,'JadefireGlen4',1,361,2480,46,56,0,3856.5,-672.112,328.888,4.11173,'1150:0 1154:0 '),\n+(1154,'JadefireGlen5',1,361,2480,46,56,0,4036.91,-552.243,344.95,3.72492,'1153:0 '),\n+(1155,'FelwoodSide1_1',1,361,361,46,56,0,4213.32,-1147.96,320.929,1.94598,'1125:0 1156:0 '),\n+(1156,'FelwoodSide1_2',1,361,361,46,56,0,4310.85,-1068.85,323.86,2.16393,'1126:0 1155:0 '),\n+(1157,'FelwoodSide2_1',1,361,361,46,56,0,4140.08,-676.318,285.659,4.10583,'1126:0 1128:0 1149:0 '),\n+(1158,'RuinsOfConstellas1',1,361,2481,46,56,0,4508.94,-658.169,260.072,5.34478,'1126:0 1130:0 1159:0 '),\n+(1159,'RuinsOfConstellas2',1,361,2481,46,56,0,4578.21,-555.417,290.438,2.46629,'1158:0 1160:0 '),\n+(1160,'RuinsOfConstellas3',1,361,2481,46,56,0,4580.93,-222.976,301.195,4.57508,'1159:0 '),\n+(1161,'Jaedenar1',1,361,1763,46,56,0,4922.62,-656.651,308.014,3.98916,'1132:0 1162:0 '),\n+(1162,'Jaedenar2',1,361,1763,46,56,0,4883.95,-595.824,308.56,5.16136,'1131:0 1133:0 1161:0 1163:0 1165:0 1166:0 '),\n+(1163,'BloodvenomPostEntrance',1,361,361,46,56,0,5228.11,-538.087,328.617,3.14997,'1134:0 1162:0 1164:0 '),\n+(1164,'BloodvenomPost',1,361,1997,46,56,0,5222.93,-365.293,325.373,4.62848,'150:0 1163:0 '),\n+(1165,'ShrineOfTheDeceiver',1,361,1771,46,56,0,4783.38,-551.646,274.445,4.62258,'1162:0 '),\n+(1166,'Jaedenar3',1,361,1763,46,56,0,4729.93,-453.696,349.944,4.46628,'1162:0 1167:0 '),\n+(1167,'Jaedenar4',1,361,1763,46,56,0,4856.52,-382.228,350.288,4.8845,'1166:0 1168:0 '),\n+(1168,'ShadowHold1',1,361,1770,46,56,0,4986.27,-445.68,316.676,5.65694,'1167:0 1169:0 '),\n+(1169,'ShadowHold2',1,361,1770,46,56,0,5098.64,-485.812,296.677,4.68186,'1168:0 1170:0 '),\n+(1170,'ShadowHold3',1,361,1770,46,56,0,5178.54,-485.604,301.227,5.33099,'1169:0 1171:0 '),\n+(1171,'ShadowHold4',1,361,1770,46,56,0,5275.41,-671.399,253.46,3.4162,'1170:0 1172:0 '),\n+(1172,'ShadowHold5',1,361,1770,46,56,0,5339.64,-532.836,254.255,4.57192,'1171:0 1173:0 1174:0 '),\n+(1173,'ShadowHold6',1,361,1770,46,56,0,5427.58,-486.39,248.303,2.98345,'1172:0 '),\n+(1174,'ShadowHold7',1,361,1770,46,56,0,5435.52,-425.111,272.429,5.11384,'1172:0 '),\n+(1175,'ShatterScarVale1',1,361,1766,46,56,0,5476.34,-722.154,342.284,2.91904,'1135:0 1136:0 1176:0 1178:0 '),\n+(1176,'ShatterScarVale2',1,361,1766,46,56,0,5601.44,-768.8,344.125,2.60488,'1136:0 1137:0 1175:0 1178:0 '),\n+(1177,'ShatterScarVale3',1,361,1766,46,56,0,5560.13,-1032.72,379.177,1.06354,'1137:0 1178:0 1179:0 '),\n+(1178,'ShatterScarVale4',1,361,1766,46,56,0,5457.81,-881.575,366.112,0.423435,'1175:0 1176:0 1177:0 '),\n+(1179,'ShatterScarVale5',1,361,1766,46,56,0,5754.61,-1189.42,406.559,5.86624,'1177:0 1180:0 '),\n+(1180,'IrontreeWoods1',1,361,1767,46,56,0,6121.79,-1182.38,370.89,3.93611,'1139:0 1179:0 1181:0 1182:0 '),\n+(1181,'IrontreeWoods2',1,361,1767,46,56,0,6394.76,-1179.55,386.014,6.27855,'1140:0 1142:0 1180:0 '),\n+(1182,'IrontreeWoods3',1,361,1767,46,56,0,6130.52,-1612.09,477.459,1.51512,'1180:0 1183:0 '),\n+(1183,'IrontreeWoods4',1,361,1767,46,56,0,6296.99,-1561.48,453.656,3.98913,'1145:0 1182:0 149:0 '),\n+(1184,'IrontreeCavern1',1,361,1768,46,56,0,6352.66,-1649.89,424.433,0.128896,'149:0 1185:0 1186:0 '),\n+(1185,'IrontreeCavern2',1,361,1768,46,56,0,6439.2,-1697.67,413.417,3.51397,'1184:0 '),\n+(1186,'IrontreeCavern3',1,361,1768,46,56,0,6348.65,-1752.82,421.668,2.4419,'1184:0 '),\n+(1187,'JadefireRun1',1,361,2618,46,56,0,6621.19,-889.352,485.149,4.30328,'1141:0 1188:0 '),\n+(1188,'JadefireRun2',1,361,2618,46,56,0,6459.98,-779.685,474.056,3.5611,'1139:0 1187:0 1189:0 '),\n+(1189,'JadefireRun3',1,361,2618,46,56,0,6292.94,-589.199,467.536,5.59331,'1188:0 '),\n+(1190,'FelwoodSide3_1',1,361,361,46,56,0,6839.58,-1594.78,491.498,3.27443,'1143:0 1144:0 '),\n+(1191,'TalonbranchGladeEntrance',1,361,1998,46,56,0,6265.97,-1990.07,570.371,0.397118,'1146:0 1148:0 1192:0 '),\n+(1192,'TalonbranchGlade',1,361,1998,46,56,3,6170.94,-1933.43,569.997,5.3569,'1191:0 '),\n+(1193,'FelpawVillage1',1,361,1762,46,56,0,6806.95,-1993.95,564.972,2.74938,'1146:0 1147:0 1194:0 1195:0 '),\n+(1194,'FelpawVillage2',1,361,1762,46,56,0,6789.17,-1850.3,554.16,4.19844,'1193:0 1195:0 '),\n+(1195,'FelpawVillage3',1,361,1762,46,56,0,6929.55,-1812.01,575.12,3.87447,'1193:0 1194:0 '),\n+(1196,'TimbermawHoldInside',1,361,1769,46,56,0,7017.44,-2122.43,586.887,0.262027,'142:0 148:0 1197:0 '),\n+(1197,'MoongladeExitS',1,493,493,46,60,0,7409.39,-2177.56,520.829,3.84148,'1196:0 1198:0 1199:0 '),\n+(1198,'MoongladeFlightH',1,493,493,46,60,5,7479.01,-2119.01,492.215,1.99187,'1197:0 1199:0 '),\n+(1199,'MoongladeMainRoad1',1,493,493,46,60,0,7621.21,-2207.23,468.939,2.73996,'1197:0 1198:0 1200:0 '),\n+(1200,'MoongladeMainRoad2',1,493,493,46,60,0,7521.64,-2483.68,454.141,1.37142,'1199:0 1201:0 '),\n+(1201,'MoongladeFlightA',1,493,493,46,60,3,7441.03,-2497.31,462.16,0.100638,'1200:0 '),\n+(1202,'FrostfireHotSprings1',1,618,2246,53,60,0,6669.75,-2350.35,569.688,6.11089,'142:0 1203:0 1204:0 1205:0 '),\n+(1203,'FrostfireHotSprings2',1,618,618,53,60,0,6516.03,-2438.96,575.469,0.575811,'1202:0 1204:0 1205:0 1206:0 '),\n+(1204,'FrostfireHotSprings3',1,618,2246,53,60,0,6739.97,-2534.28,547.608,2.35473,'1202:0 1203:0 1205:0 1206:0 1207:0 '),\n+(1205,'FrostfireHotSprings4',1,618,2246,53,60,0,6844.94,-2510.17,562.168,2.83383,'1202:0 1203:0 1204:0 1207:0 '),\n+(1206,'WinterspringWRoad1',1,618,618,53,60,0,6552.68,-2761.31,569.286,1.6412,'1203:0 1204:0 1208:0 1209:0 '),\n+(1207,'FrostfireHotSprings5',1,618,2246,53,60,0,6778.35,-2683.46,542.964,1.10124,'1204:0 1205:0 '),\n+(1208,'WinterspringWRoad2',1,618,618,53,60,0,6544.07,-3009.5,594.631,1.59877,'1206:0 1209:0 1211:0 1213:0 '),\n+(1209,'TimbermawPost1',1,618,2243,53,60,0,6443.26,-2975.94,574.619,1.46329,'1206:0 1208:0 1210:0 '),\n+(1210,'TimbermawPost2',1,618,2243,53,60,0,6501.28,-3395.1,596.264,1.54182,'1209:0 1212:0 '),\n+(1211,'WinterspringWRoad3',1,618,618,53,60,0,6612.45,-3218.46,610.975,1.85402,'1208:0 1212:0 1213:0 '),\n+(1212,'WinterspringWRoad4',1,618,618,53,60,0,6645.3,-3475.9,667.925,1.61251,'1210:0 1211:0 1214:0 '),\n+(1213,'FrostfireHotSprings6',1,618,2246,53,60,0,6782.88,-3070.45,577.01,3.04979,'1208:0 1211:0 '),\n+(1214,'WinterspringWRoad5',1,618,618,53,60,0,6657.52,-3668.1,695.82,1.56341,'1212:0 1215:0 1216:0 1221:0 '),\n+(1215,'WinterspringWRoad6',1,618,2252,53,60,0,6397.07,-3892.14,680.982,0.597365,'1214:0 1216:0 1217:0 '),\n+(1216,'LakeKeltheril',1,618,2251,53,60,0,6536.55,-4131.94,665.606,1.20213,'1214:0 1215:0 143:0 1218:0 '),\n+(1217,'Mazthoril1',1,618,2245,53,60,0,6183.02,-4265.44,745.257,1.04309,'1215:0 1218:0 1219:0 '),\n+(1218,'EverlookFork1',1,618,2255,53,60,0,6655.73,-4560.81,717.041,1.46131,'56:0 1216:0 1217:0 1239:0 1240:0 '),\n+(1219,'Mazthoril2',1,618,2245,53,60,0,5991.6,-4416.44,712.225,0.648425,'1217:0 1220:0 1255:0 1259:0 '),\n+(1220,'Mazthoril3',1,618,2245,53,60,0,6111.88,-4459.18,665.247,2.8927,'1219:0 1254:0 1255:0 '),\n+(1221,'WinterspringCFork',1,618,618,53,60,0,6913.24,-4134.15,695.074,1.72442,'1214:0 1222:0 1224:0 1225:0 '),\n+(1222,'WinterspringNRoad1',1,618,618,53,60,0,7189.47,-4145.52,708.652,2.01894,'1221:0 1223:0 1224:0 1225:0 1226:0 '),\n+(1223,'StarfallVillage1',1,618,2253,53,60,2,7163.35,-3949.34,749.855,4.52632,'1222:0 1224:0 '),\n+(1224,'StarfallVillage2',1,618,2253,53,60,2,7095.04,-4017.7,744.806,3.57795,'1221:0 1222:0 1223:0 '),\n+(1225,'WinterspringN_hub1',1,618,618,53,60,0,7243.63,-4428.68,637.464,1.30573,'147:0 1221:0 1222:0 1235:0 '),\n+(1226,'WinterspringNRoad2',1,618,618,53,60,0,7437.77,-4106.34,703.256,3.39493,'1222:0 1227:0 1231:0 1233:0 '),\n+(1227,'WinterspringNRoad3',1,618,2241,53,60,0,7658.36,-4006.12,703.193,3.60307,'1226:0 1228:0 1229:0 1230:0 '),\n+(1228,'FrostsaberRock',1,618,2241,53,60,0,8080.15,-3838.54,691.237,3.49507,'1227:0 1229:0 1230:0 '),\n+(1229,'FrostsaberRockSide1',1,618,2241,53,60,0,7601.67,-3828.53,689.193,5.16206,'1227:0 1228:0 '),\n+(1230,'FrostsaberRockSide2',1,618,2241,53,60,0,7960.17,-4207.36,694.89,1.05442,'1227:0 1228:0 1231:0 1232:0 '),\n+(1231,'FrostsaberRockSide3',1,618,2241,53,60,0,7696.88,-4240.08,674.756,0.182632,'1226:0 1230:0 1232:0 1233:0 '),\n+(1232,'FrostsaberRockSide4',1,618,2241,53,60,0,7898.77,-4343.01,714.863,1.26058,'1230:0 1231:0 1234:0 '),\n+(1233,'WinterspringN_hub2',1,618,618,53,60,0,7541.26,-4433.34,604.622,1.91639,'1226:0 1231:0 1234:0 1235:0 '),\n+(1234,'WinterspringN_hub3',1,618,618,53,60,0,7841.47,-4633.94,711.459,1.96351,'1232:0 1233:0 '),\n+(1235,'WinterspringN_hub4',1,618,618,53,60,0,7409.79,-4690.69,629.373,2.1363,'1225:0 1233:0 1236:0 1238:0 '),\n+(1236,'WinterspringN_hub5',1,618,618,53,60,0,7593.76,-4979.89,701.375,2.05382,'1235:0 1237:0 1238:0 '),\n+(1237,'HiddenGrove',1,618,2242,53,60,0,7765.82,-4824.05,695.683,4.13316,'1236:0 '),\n+(1238,'WinterfallVillage1',1,618,2244,53,60,0,7043.19,-4998.21,715.354,0.445711,'1235:0 1236:0 1243:0 '),\n+(1239,'EverlookFork2',1,618,2255,53,60,0,6611.3,-4739.92,698.015,0.695072,'1218:0 1241:0 1247:0 1254:0 '),\n+(1240,'EverlookFlightH',1,618,2255,53,60,5,6816.77,-4612.99,710.669,6.21445,'56:0 1218:0 1242:0 '),\n+(1241,'EverlookFlightA',1,618,2255,53,60,3,6790.08,-4744.29,701.5,3.20441,'1239:0 1242:0 '),\n+(1242,'WinterspringN_hub6',1,618,618,53,60,0,6927.32,-4786.97,694.458,2.5918,'1240:0 1241:0 1243:0 '),\n+(1243,'WinterfallVillageOutside',1,618,2244,53,60,0,6939.52,-5010.6,692.554,1.59042,'1238:0 1242:0 1244:0 '),\n+(1244,'WinterfallVillage2',1,618,2244,53,60,0,6808.46,-5094.96,695.933,0.427246,'1243:0 1245:0 '),\n+(1245,'WinterfallVillage3',1,618,2244,53,60,0,6729.74,-5155.43,735.364,6.18029,'1244:0 1246:0 '),\n+(1246,'WinterfallVillage4',1,618,2244,53,60,0,6716.73,-5241.35,779.049,1.49343,'1245:0 '),\n+(1247,'IceThistleHills1',1,618,2247,53,60,0,6422.5,-5063.45,747.183,0.955424,'1239:0 1248:0 1249:0 '),\n+(1248,'IceThistleHills2',1,618,2247,53,60,0,6075.66,-5048.11,793.011,6.23722,'1247:0 1255:0 '),\n+(1249,'IceThistleHillsCave1',1,618,2247,53,60,0,6558.26,-5114.63,770.071,4.80583,'1247:0 1250:0 '),\n+(1250,'IceThistleHillsCave2',1,618,2247,53,60,0,6647.69,-5270.98,753.532,0.248568,'1249:0 1251:0 1252:0 '),\n+(1251,'IceThistleHillsCave3',1,618,2247,53,60,0,6547.52,-5279.93,751.433,0.29569,'1250:0 '),\n+(1252,'IceThistleHillsCave4',1,618,2247,53,60,0,6591.19,-5377.61,757.91,2.11585,'1250:0 1253:0 '),\n+(1253,'IceThistleHillsCave5',1,618,2247,53,60,0,6749.19,-5302.24,746.013,3.42748,'1252:0 '),\n+(1254,'WinterspringSFork',1,618,618,53,60,0,6181.52,-4918.26,736.9,1.70352,'1220:0 1239:0 1255:0 '),\n+(1255,'WinterspringSRoad1',1,618,618,53,60,0,5738.96,-4759.97,772.327,5.63249,'144:0 1219:0 1220:0 1248:0 1254:0 1256:0 1258:0 '),\n+(1256,'OwlWingThicket1',1,618,2250,53,60,0,5704.51,-4972.1,807.203,1.24015,'1255:0 1257:0 '),\n+(1257,'OwlWingThicket2',1,618,2250,53,60,0,5516.17,-4932.2,843.306,5.86024,'1256:0 '),\n+(1258,'WinterspringSRoad2',1,618,618,53,60,0,5542.21,-4699,784.197,5.83863,'144:0 1255:0 1263:0 '),\n+(1259,'DunMandarrW',1,618,2248,53,60,0,5726.18,-4420.5,778.036,0.0455333,'144:0 1219:0 '),\n+(1260,'FrostwhisperGorge1',1,618,2249,53,60,0,5376.4,-4513.45,720.025,0.126024,'144:0 1261:0 '),\n+(1261,'FrostwhisperGorge2',1,618,2249,53,60,0,5296.85,-4663.41,691.461,1.09206,'1260:0 1262:0 '),\n+(1262,'FrostwhisperGorge3',1,618,2249,53,60,0,5259.63,-4868.84,691.501,1.4769,'1261:0 '),\n+(1263,'FrostwhisperGorgeBridge1',1,618,618,53,60,0,5329.29,-4753.88,815.467,6.28158,'1258:0 1264:0 '),\n+(1264,'FrostwhisperGorgeBridge2',1,618,618,53,60,1,5184.44,-4704.74,823.398,6.16966,'1263:0 1265:0 '),\n+(1265,'DarkwhisperGorge1',1,618,618,53,60,0,5076.75,-4593.36,846.068,5.72001,'1264:0 1266:0 1267:0 1268:0 '),\n+(1266,'DarkwhisperGorge2',1,618,2249,53,60,0,5094.49,-4876.76,867.355,1.66931,'1265:0 '),\n+(1267,'DarkwhisperGorge3',1,618,2249,53,60,0,5323.19,-4418.49,854.383,3.62103,'1265:0 '),\n+(1268,'DarkwhisperGorge4',1,618,2256,53,60,0,4938.26,-4535.16,855.372,3.64264,'1265:0 '),\n+(1269,'AzsharaExitW',1,16,878,43,54,0,2800.83,-3813.24,83.7107,0.929092,'1095:0 1270:0 '),\n+(1270,'TalrendisPointRoad',1,16,3137,43,54,0,2749.62,-3926.91,89.3218,0.361656,'1269:0 145:0 1271:0 1273:0 '),\n+(1271,'ShadowsongShrine1',1,16,878,43,54,0,2935.67,-3982.68,124.392,2.73551,'1270:0 1272:0 '),\n+(1272,'ShadowsongShrine2',1,16,1235,43,54,0,2850.78,-4024.75,140.874,0.32041,'1271:0 '),\n+(1273,'AzsharaRoad1',1,16,16,43,54,0,2815.94,-4122.46,94.8896,2.21715,'1270:0 1274:0 1279:0 '),\n+(1274,'AzsharaRoad2',1,16,16,43,54,0,2941.29,-4227.56,95.186,2.45278,'1273:0 1275:0 1280:0 '),\n+(1275,'AzsharaRoad3',1,16,16,43,54,0,3057.29,-4322.31,90.9214,2.58827,'1274:0 1276:0 1280:0 '),\n+(1276,'AzsharaRoad4',1,16,16,43,54,0,3229.99,-4491.16,92.7121,1.9737,'1275:0 1277:0 1280:0 1284:0 '),\n+(1277,'AzsharaRoad5',1,16,16,43,54,0,3333.33,-4589.69,92.2964,2.31141,'1276:0 1278:0 1283:0 1286:0 1326:0 '),\n+(1278,'AzsharaRoad6',1,16,16,43,54,0,3451.9,-4750.56,108.662,2.10326,'1277:0 1286:0 1287:0 1288:0 1324:0 1327:0 '),\n+(1279,'AzsharaE1',1,16,16,43,54,0,2997.33,-4106.35,99.9666,3.2087,'1273:0 1280:0 1283:0 '),\n+(1280,'AzsharaE2',1,16,1236,43,54,0,3118.77,-4225.25,100.015,2.98486,'1274:0 1275:0 1276:0 1279:0 1281:0 1283:0 '),\n+(1281,'AzsharaE3',1,16,1236,43,54,0,3300.36,-4275.9,126.16,2.80817,'1280:0 1282:0 '),\n+(1282,'AzsharaE4',1,16,1236,43,54,0,3271.81,-4373.57,125.961,1.43765,'1281:0 '),\n+(1283,'AzsharaE5',1,16,1236,43,54,0,3373.1,-4206.33,105.482,3.57,'1277:0 1279:0 1280:0 1284:0 1285:0 '),\n+(1284,'AzsharaE6',1,16,16,43,54,0,3582.46,-4138.13,104.333,3.80758,'1276:0 1283:0 1285:0 '),\n+(1285,'Valormok',1,16,1237,43,54,5,3613.75,-4414.24,112.731,2.85922,'1283:0 1284:0 1286:0 '),\n+(1286,'AzsharaE7',1,16,16,43,54,0,3590.09,-4639.97,116.675,1.6988,'1277:0 1278:0 1285:0 1287:0 '),\n+(1287,'AzsharaE8',1,16,1224,43,54,0,3744.78,-4813.74,138.923,2.88199,'1278:0 1286:0 1289:0 '),\n+(1288,'AzsharaE9',1,16,1221,43,54,0,3499.39,-4902.72,144.155,1.64696,'1278:0 1289:0 '),\n+(1289,'AzsharaE10',1,16,1221,43,54,0,3759.42,-4967.77,142.273,2.79364,'1287:0 1288:0 1290:0 '),\n+(1290,'AzsharaN1',1,16,1216,43,54,0,4036.22,-5259.02,107.607,2.29688,'1289:0 1291:0 1292:0 1322:0 '),\n+(1291,'AzsharaN2',1,16,1216,43,54,0,4056.25,-5430.36,110.698,6.13747,'1290:0 1294:0 1293:0 1322:0 '),\n+(1292,'AzsharaN3',1,16,1216,43,54,0,4443.1,-5422.68,110.062,2.83485,'1290:0 1293:0 '),\n+(1293,'AzsharaN4',1,16,1225,43,54,0,4501.55,-5509.11,112.466,2.9016,'1291:0 1292:0 1294:0 1295:0 '),\n+(1294,'AzsharaN5',1,16,1225,43,54,0,4344.93,-5684.07,101.657,1.91789,'1291:0 1293:0 1296:0 1297:0 1322:0 '),\n+(1295,'AzsharaN6',1,16,1219,43,54,0,4731.82,-5683.23,101.157,2.58744,'1293:0 1296:0 1297:0 '),\n+(1296,'AzsharaN7',1,16,1220,43,54,0,4463.44,-6017.87,99.0046,1.97484,'1294:0 1295:0 1299:0 1300:0 '),\n+(1297,'AzsharaN8',1,16,1219,43,54,0,4794.73,-5948.23,94.5572,2.9291,'1294:0 1295:0 1298:0 1300:0 '),\n+(1298,'AzsharaN9',1,16,1219,43,54,0,4752.23,-6324.43,112.261,1.52126,'1297:0 1300:0 1301:0 '),\n+(1299,'AzsharaN10',1,16,1220,43,54,0,4304.26,-6172.26,132.068,0.476687,'1296:0 1300:0 '),\n+(1300,'AzsharaN11',1,16,1220,43,54,0,4483.15,-6277.92,109.808,2.02983,'1296:0 1297:0 1298:0 1299:0 1302:0 '),\n+(1301,'AzsharaN12',1,16,1219,43,54,0,4815.57,-6641.1,96.3628,1.82366,'1298:0 1302:0 1304:0 '),\n+(1302,'AzsharaN13',1,16,1219,43,54,0,4579.43,-6593.47,100.233,1.80599,'1300:0 1301:0 1303:0 '),\n+(1303,'AzsharaN14',1,16,2497,43,54,0,4335.22,-6872.83,94.6868,0.889033,'1302:0 1304:0 1305:0 1306:0 '),\n+(1304,'AzsharaN15',1,16,2497,43,54,0,4772.55,-7077.06,93.7659,1.50753,'1301:0 1303:0 1306:0 1308:0 '),\n+(1305,'AzsharaN16',1,16,1228,43,54,0,4163.23,-7077.25,104.42,0.918482,'1303:0 '),\n+(1306,'AzsharaN17',1,16,2497,43,54,0,4378.53,-7190.76,114.567,1.36616,'1303:0 1304:0 1307:0 '),\n+(1307,'AzsharaN18',1,16,2497,43,54,0,4547.1,-7477.55,77.7456,1.89042,'1306:0 1308:0 1312:0 1313:0 '),\n+(1308,'AzsharaN19',1,16,2497,43,54,0,4697.79,-7545.77,76.1055,2.41466,'1304:0 1307:0 1309:0 1311:0 '),\n+(1309,'AzsharaN20',1,16,1230,43,54,0,4879.55,-7649.88,-0.264126,2.8859,'1308:0 1310:0 1311:0 '),\n+(1310,'AzsharaN21',1,16,1230,43,54,0,4981.1,-7379.41,2.45741,4.29372,'1309:0 '),\n+(1311,'AzsharaN22',1,16,1230,43,54,0,4636.23,-7784.83,-0.404812,0.517923,'1308:0 1309:0 1312:0 1313:0 '),\n+(1312,'AzsharaN23',1,16,1229,43,54,0,4265.54,-7853.88,3.0357,0.839938,'1307:0 1311:0 1313:0 '),\n+(1313,'AzsharaN24',1,16,1228,43,54,0,4328.17,-7549.27,10.4959,5.60927,'1307:0 1311:0 1312:0 1314:0 1316:0 '),\n+(1314,'AzsharaN25',1,16,1228,43,54,0,4248.34,-7195.83,18.9926,3.96189,'1313:0 1315:0 '),\n+(1315,'AzsharaN26',1,16,1226,43,54,0,4103.25,-7187.96,10.5715,6.16297,'1314:0 1316:0 1317:0 '),\n+(1316,'AzsharaN27',1,16,1226,43,54,0,4038.51,-7321.54,1.12717,0.769242,'1313:0 1315:0 1317:0 '),\n+(1317,'AzsharaN28',1,16,1226,43,54,0,3934.81,-7205.7,26.486,5.91163,'1315:0 1316:0 1318:0 1320:0 1321:0 '),\n+(1318,'TempleOfArkkoran1',1,16,1226,43,54,0,3807.79,-7280.66,26.4812,1.14034,'1317:0 1319:0 '),\n+(1319,'TempleOfArkkoran2',1,16,1226,43,54,0,3768.46,-7134.44,26.4806,5.96857,'1318:0 1320:0 '),\n+(1320,'TempleOfArkkoran3',1,16,1226,43,54,0,3902.48,-7060.61,26.4811,4.31335,'1317:0 1319:0 '),\n+(1321,'TempleOfArkkoran4',1,16,1226,43,54,0,3858.12,-7171.88,24.03,5.83506,'1317:0 '),\n+(1322,'AzsharaRamp1Top',1,16,1225,43,54,0,4108.38,-5554.42,99.4778,1.77221,'1290:0 1291:0 1294:0 1323:0 '),\n+(1323,'AzsharaRamp1Bottom',1,16,1228,43,54,0,3897.1,-5695.14,17.2205,0.46452,'1322:0 1341:0 1342:0 '),\n+(1324,'AzsharaC1',1,16,1221,43,54,0,3389.18,-4881.96,119.527,0.94754,'1278:0 1325:0 '),\n+(1325,'AzsharaC2',1,16,1221,43,54,0,3548.39,-5142.38,83.2368,2.40053,'1324:0 1326:0 1328:0 46:0 1332:0 '),\n+(1326,'AzsharaC3',1,16,1221,43,54,0,3353.2,-4996.79,88.9565,1.84487,'1277:0 1325:0 '),\n+(1327,'AzsharaC4',1,16,1233,43,54,0,3111.76,-5099.04,133.69,0.892567,'1278:0 1328:0 1343:0 1344:0 '),\n+(1328,'AzsharaC5',1,16,1221,43,54,0,3288.43,-5313.47,92.0357,2.24738,'1325:0 1327:0 1329:0 '),\n+(1329,'AzsharaC6',1,16,1221,43,54,0,3069.52,-5522.7,98.46,0.58232,'1328:0 1330:0 1343:0 '),\n+(1330,'AzsharaC7',1,16,1231,43,54,0,3063.44,-5615.53,60.2217,1.67206,'1329:0 1331:0 1338:0 '),\n+(1331,'AzsharaC8',1,16,1231,43,54,0,3004.41,-5699.66,35.8993,0.918073,'1330:0 1334:0 '),\n+(1332,'AzsharaC9',1,16,1221,43,54,0,3744.95,-5305.2,85.9123,2.48299,'1325:0 1333:0 '),\n+(1333,'AzsharaC10',1,16,1228,43,54,0,3658.05,-5517.8,24.2321,1.28329,'1332:0 1339:0 1340:0 1341:0 '),\n+(1334,'AzsharaC11',1,16,1231,43,54,0,3087.73,-5859.39,-0.161575,2.13546,'1331:0 1335:0 1338:0 '),\n+(1335,'AzsharaC12',1,16,1231,43,54,0,2934.41,-5884.56,25.8109,0.120912,'1334:0 1336:0 '),\n+(1336,'AzsharaC13',1,16,1231,43,54,0,2980.62,-6084.05,0.213247,2.38089,'1335:0 1337:0 '),\n+(1337,'AzsharaC14',1,16,1231,43,54,0,2846.38,-6166.7,3.60284,0.643192,'1336:0 '),\n+(1338,'AzsharaC15',1,16,1231,43,54,0,3226.36,-5673.24,15.8216,3.93007,'1330:0 1334:0 1339:0 1340:0 '),\n+(1339,'AzsharaC16',1,16,1231,43,54,0,3427.33,-5505.43,26.9806,5.26131,'1333:0 1338:0 1340:0 1341:0 '),\n+(1340,'AzsharaC17',1,16,1231,43,54,0,3475.44,-5753.95,11.6531,1.76236,'1333:0 1338:0 1339:0 1341:0 '),\n+(1341,'AzsharaC18',1,16,1228,43,54,0,3704.73,-5723.53,4.41024,0.254392,'1323:0 1333:0 1339:0 1340:0 1342:0 '),\n+(1342,'AzsharaC19',1,16,1228,43,54,0,3948.84,-5885.08,8.49314,2.09811,'1323:0 1341:0 '),\n+(1343,'AzsharaS1',1,16,1234,43,54,0,2887.1,-5407.2,110.727,1.29111,'1327:0 1329:0 1344:0 1347:0 1346:0 '),\n+(1344,'AzsharaS2',1,16,1234,43,54,0,2671.51,-5134.67,110.162,6.23323,'1327:0 1343:0 1345:0 '),\n+(1345,'AzsharaS3',1,16,1234,43,54,0,2476.44,-5345.72,112.668,0.747221,'1344:0 1346:0 '),\n+(1346,'AzsharaS4',1,16,16,43,54,0,2551.54,-5739.78,99.3784,1.5499,'1343:0 1345:0 1347:0 1348:0 '),\n+(1347,'AzsharaS5',1,16,16,43,54,0,2773.38,-5801.37,102.296,1.23417,'1343:0 1346:0 '),\n+(1348,'AzsharaS6',1,16,16,43,54,0,2497.05,-6122.14,101.12,1.55774,'1346:0 1349:0 '),\n+(1349,'AzsharaS7',1,16,16,43,54,0,2591.64,-6535.29,102.94,1.79136,'1348:0 1350:0 1351:0 '),\n+(1350,'AzsharaS8',1,16,16,43,54,0,2738.28,-6626.16,105.229,0.130243,'1349:0 '),\n+(1351,'AzsharaS9',1,16,1232,43,54,0,2530.76,-6691.49,105.655,1.22588,'1349:0 1352:0 1353:0 '),\n+(1352,'AzsharaS10',1,16,1232,43,54,0,2594.6,-6859.47,124.355,1.98575,'1351:0 '),\n+(1353,'AzsharaS11',1,16,1232,43,54,0,2469.22,-6950.98,112.622,1.32995,'1351:0 1354:0 '),\n+(1354,'AzsharaS12',1,16,1232,43,54,0,2290.99,-6837.2,120.824,5.67516,'1353:0 1355:0 '),\n+(1355,'AzsharaS13',1,16,1232,43,54,0,2245.13,-6620.49,130.493,5.82242,'1354:0 '),\n+(1356,'NightsongWoodsSE',1,331,2457,18,30,0,2031.76,-3416.6,92.6375,6.12481,'1097:0 1099:0 1116:0 1357:0 '),\n+(1357,'SouthfuryRiver1',1,331,879,18,30,0,2157.71,-3580.65,40.0791,2.2096,'1356:0 1358:0 '),\n+(1358,'SouthfuryRiver2',1,331,879,18,30,0,1982.59,-3613.01,40.3535,1.3378,'1357:0 1359:0 '),\n+(1359,'SouthfuryRiver3',1,331,879,18,30,4,1751.38,-3745.84,39.7381,3.16817,'1358:0 1360:0 '),\n+(1360,'OrgrimmarExitW',1,17,815,8,25,4,1641.94,-3837.63,50.7719,5.47332,'1359:0 1454:0 '),\n+(1361,'DurotarN_hub1',1,14,14,1,10,4,1290.89,-4391.75,26.2836,3.73994,'30:0 1362:0 1377:0 1385:0 1386:0 '),\n+(1362,'DurotarN_hub2',1,14,14,1,10,4,1341.58,-4623.78,24.2112,1.68496,'1361:0 1363:0 1365:0 1377:0 '),\n+(1363,'SkullRock1',1,14,817,1,10,4,1448.11,-4879.66,11.5034,1.9029,'1362:0 1364:0 1365:0 '),\n+(1364,'SkullRock2',1,14,817,1,10,4,1445.58,-4687.97,-5.65162,4.9365,'1363:0 '),\n+(1365,'DurotarN_hub3',1,14,14,1,10,4,1100.2,-4908.62,14.577,0.165201,'1362:0 1363:0 1366:0 1367:0 '),\n+(1366,'DurotarN_hub4',1,14,375,1,10,4,985.89,-5115.68,1.41706,1.16658,'1365:0 1367:0 '),\n+(1367,'DurotarN_hub5',1,14,14,1,10,4,809.043,-4957.4,16.2794,2.83475,'1365:0 1366:0 1368:0 1370:0 '),\n+(1368,'DustwindCave1',1,14,14,1,10,4,778.919,-4756.62,37.5488,4.94158,'1367:0 1369:0 1370:0 '),\n+(1369,'DustwindCave2',1,14,371,1,10,4,931.181,-4715.15,19.9519,2.6443,'1368:0 '),\n+(1370,'DurotarN_hub6',1,14,14,1,10,4,512.237,-4785.91,29.1897,1.93467,'1367:0 1368:0 1371:0 1407:0 '),\n+(1371,'DurotarN_hub7',1,14,14,1,10,4,438.776,-4564.65,52.1313,5.05391,'1370:0 1372:0 1400:0 1403:0 '),\n+(1372,'DurotarN_hub8',1,14,14,1,10,4,599.139,-4404.63,18.4833,5.05392,'1371:0 66:0 67:0 1400:0 1403:0 '),\n+(1373,'DurotarCanyon1_2',1,14,410,1,10,4,754.968,-4457.2,15.6687,1.93155,'66:0 67:0 '),\n+(1374,'DurotarCanyon1_3',1,14,14,1,10,4,720.095,-4682.12,-6.58629,2.1711,'66:0 1375:0 1401:0 '),\n+(1375,'DurotarCanyon1_4',1,14,14,1,10,4,762.27,-4587.67,0.395604,5.89975,'1374:0 1376:0 1384:0 '),\n+(1376,'DurotarCanyon1_5',1,14,410,1,10,4,909.793,-4623.59,17.4591,2.58341,'1375:0 1377:0 1378:0 '),\n+(1377,'DurotarCanyon1_6',1,14,14,1,10,4,1089.79,-4544.84,18.7912,3.37862,'1361:0 1362:0 1376:0 1385:0 '),\n+(1378,'DurotarCanyon1_7',1,14,410,1,10,4,846.499,-4687.15,10.6635,4.45069,'1376:0 1379:0 '),\n+(1379,'DurotarCanyon1_8',1,14,370,1,10,4,822.93,-4819.09,11.1622,1.25216,'1378:0 1380:0 '),\n+(1380,'DurotarCanyon1_9',1,14,370,1,10,4,922.247,-4823.86,14.833,3.04091,'1379:0 1381:0 1382:0 '),\n+(1381,'DurotarCanyon1_10',1,14,370,1,10,4,984.82,-4668.01,26.8858,4.65295,'1380:0 '),\n+(1382,'DurotarCanyon1_11',1,14,370,1,10,4,1028.11,-4807.86,13.422,1.33267,'1380:0 1383:0 '),\n+(1383,'DurotarCanyon1_12',1,14,370,1,10,4,1112.67,-4667.33,19.0025,5.6445,'1382:0 '),\n+(1384,'DurotarCanyon1_13',1,14,14,1,10,4,863.608,-4507.22,5.89497,4.47623,'1375:0 1385:0 '),\n+(1385,'DurotarCanyon1_14',1,14,14,1,10,4,1076.54,-4421.72,18.043,3.13516,'67:0 1361:0 1377:0 1384:0 1387:0 '),\n+(1386,'RocktuskFarm',1,14,1296,1,10,4,1261.75,-4189.97,25.9612,5.01817,'1361:0 1387:0 1388:0 '),\n+(1387,'DurotarN_hub9',1,14,14,1,10,4,1103.69,-4095.77,17.1414,5.61704,'1385:0 1386:0 1388:0 1389:0 '),\n+(1388,'DurotarN_hub10',1,14,14,1,10,4,1240.84,-3994.36,19.8563,4.64119,'1386:0 1387:0 1389:0 1452:0 1453:0 '),\n+(1389,'DurotarN_hub11',1,14,814,1,10,4,932.462,-3903.15,18.4923,5.69476,'1387:0 1388:0 1390:0 1391:0 1451:0 1452:0 '),\n+(1390,'DurotarN_hub12',1,14,14,1,10,4,554.028,-3867,21.5181,6.15421,'1389:0 1391:0 1392:0 1405:0 1406:0 '),\n+(1391,'DurotarN_hub13',1,14,14,1,10,4,484.992,-4008.81,21.634,0.40509,'1389:0 1390:0 1392:0 1400:0 1405:0 1406:0 '),\n+(1392,'DurotarCanyon2_1',1,14,14,1,10,4,621.087,-4034.14,5.79289,6.22882,'67:0 1390:0 1391:0 1393:0 1400:0 '),\n+(1393,'DurotarCanyon2_2',1,14,369,1,10,4,805.35,-4026.74,-8.81716,3.20306,'1392:0 1394:0 1398:0 '),\n+(1394,'DurotarCanyon2_3',1,14,369,1,10,4,924.692,-4010.46,-13.3326,3.34246,'1393:0 1395:0 '),\n+(1395,'DurotarCanyon2_4',1,14,369,1,10,4,969.211,-4144.86,-6.8125,2.00533,'1394:0 1396:0 1397:0 '),\n+(1396,'DurotarCanyon2_5',1,14,369,1,10,4,858.51,-4186.73,-13.9605,0.410964,'1395:0 '),\n+(1397,'DurotarCanyon2_6',1,14,369,1,10,4,955.695,-4276.78,-6.40429,1.49874,'1395:0 '),\n+(1398,'DurotarCanyon2_7',1,14,369,1,10,4,832.014,-4096.6,-12.8537,2.28805,'1393:0 1399:0 '),\n+(1399,'DurotarCanyon2_8',1,14,369,1,10,4,733.597,-4112.95,-9.91997,0.344189,'1398:0 '),\n+(1400,'RazormaneGrounds',1,14,816,1,10,4,394.471,-4227.01,25.6721,6.10902,'67:0 1371:0 1372:0 1391:0 1392:0 1403:0 1404:0 '),\n+(1401,'DurotarCanyon1_15',1,14,14,1,10,4,618.018,-4729.15,-9.7302,0.530719,'1374:0 28:0 '),\n+(1402,'DurotarRoadW1',1,14,14,1,10,4,229.555,-4564.93,14.4257,4.87206,'28:0 1403:0 1409:0 1437:0 '),\n+(1403,'DurotarRoadW2',1,14,14,1,10,4,311.231,-4367.13,23.2866,0.650496,'1371:0 1372:0 1400:0 1402:0 1404:0 1437:0 1440:0 '),\n+(1404,'DurotarRoadW3',1,14,14,1,10,4,290.25,-4093.37,30.0616,4.8897,'1400:0 1403:0 1405:0 1440:0 1441:0 1443:0 '),\n+(1405,'DurotarRoadW4',1,14,14,1,10,4,289.101,-3928.87,32.0584,5.95001,'1390:0 1391:0 1404:0 1406:0 1441:0 1443:0 '),\n+(1406,'DurotarWBridge',1,14,814,1,10,4,317.731,-3805.25,24.3367,6.02659,'1390:0 1391:0 1405:0 1443:0 1449:0 '),\n+(1407,'DurotarS_hub1',1,14,14,1,10,4,250.862,-4982.03,19.1509,0.356019,'1370:0 1408:0 1409:0 1410:0 1414:0 '),\n+(1408,'DurotarS_hub2',1,14,373,1,10,4,274.781,-5126.02,4.75879,2.02892,'1407:0 1414:0 '),\n+(1409,'DurotarRoadS1',1,14,14,1,10,4,119.098,-4745.19,15.4912,5.09591,'28:0 1402:0 1407:0 1410:0 1414:0 1415:0 '),\n+(1410,'DurotarRoadS2',1,14,14,1,10,4,-99.4238,-4745.37,21.6208,0.102741,'1407:0 1409:0 1411:0 1414:0 '),\n+(1411,'DurotarRoadS3',1,14,14,1,10,4,-278.577,-4798.87,28.7297,0.267683,'1410:0 1412:0 1414:0 1415:0 '),\n+(1412,'DurotarRoadS4',1,14,14,1,10,4,-448.465,-4791.29,35.8497,6.27205,'1411:0 1413:0 '),\n+(1413,'DurotarRoadS5',1,14,14,1,10,4,-640.871,-4736.39,33.6569,6.15227,'1412:0 31:0 1419:0 1421:0 1422:0 1429:0 '),\n+(1414,'TirigardeKeep1',1,14,372,1,10,4,-84.5912,-5061.01,15.5227,0.185219,'1407:0 1408:0 1409:0 1410:0 1411:0 1415:0 '),\n+(1415,'TirigardeKeep2',1,14,372,1,10,4,-198.068,-5050.76,20.9866,3.49606,'1409:0 1411:0 1414:0 1416:0 1417:0 '),\n+(1416,'TirigardeKeep3',1,14,372,1,10,4,-225.492,-5115.3,49.3248,1.51096,'1415:0 '),\n+(1417,'TirigardeKeep4',1,14,372,1,10,4,-321.717,-5084.89,21.2127,0.285748,'1415:0 1418:0 '),\n+(1418,'TirigardeKeep5',1,14,373,1,10,4,-291.897,-5186.7,20.4791,1.8644,'1417:0 '),\n+(1419,'DurotarS_hub3',1,14,393,1,10,4,-716.008,-5088.67,9.54796,1.34603,'31:0 1413:0 1420:0 1444:0 '),\n+(1420,'DurotarS_hub4',1,14,393,1,10,4,-920.843,-4982.52,11.1974,5.87385,'31:0 1419:0 1421:0 1422:0 1445:0 '),\n+(1421,'DurotarS_hub5',1,14,393,1,10,4,-1100.19,-4784.19,8.13918,5.95632,'31:0 1413:0 1420:0 1422:0 '),\n+(1422,'DurotarCanyon3_1',1,14,14,1,10,4,-978.237,-4704.6,20.1681,1.62878,'31:0 1413:0 1420:0 1421:0 1423:0 '),\n+(1423,'DurotarCanyon3_2',1,14,366,1,10,4,-986.47,-4574.42,25.5859,4.28734,'1422:0 1424:0 1425:0 1427:0 '),\n+(1424,'DurotarCanyon3_3',1,14,366,1,10,4,-1067.61,-4604.24,25.8221,3.64331,'1423:0 '),\n+(1425,'DurotarCanyon3_4',1,14,366,1,10,4,-1047.58,-4451.84,27.4603,4.97458,'1423:0 1426:0 '),\n+(1426,'DurotarCanyon3_5',1,14,366,1,10,4,-965.059,-4407.81,29.5222,3.58441,'1425:0 '),\n+(1427,'DurotarCanyon3_6',1,14,366,1,10,4,-981.936,-4503.15,25.7079,1.87618,'1423:0 1428:0 '),\n+(1428,'DurotarCanyon3_7',1,14,366,1,10,4,-904.997,-4477.99,29.6937,3.30756,'1427:0 '),\n+(1429,'ValleyOfTrials1',1,14,363,1,10,4,-603.24,-4597.62,41.2213,4.5544,'1413:0 1430:0 '),\n+(1430,'ValleyOfTrials2',1,14,363,1,10,4,-580.729,-4526.65,41.4449,4.54262,'1429:0 1431:0 '),\n+(1431,'ValleyOfTrials3',1,14,363,1,10,4,-589.381,-4297.57,37.9694,5.56165,'1430:0 29:0 1432:0 1433:0 1434:0 1436:0 '),\n+(1432,'ValleyOfTrials4',1,14,363,1,10,4,-746.092,-4261.15,43.9991,6.03879,'1431:0 '),\n+(1433,'ValleyOfTrials5',1,14,363,1,10,4,-409.694,-4455.21,51.0433,2.32778,'1431:0 1434:0 1436:0 '),\n+(1434,'ValleyOfTrials6',1,14,363,1,10,4,-197.604,-4331.89,68.4747,3.01697,'1431:0 1433:0 1435:0 1436:0 '),\n+(1435,'ValleyOfTrials7',1,14,365,1,10,4,-87.1332,-4210.24,49.4149,4.1067,'1434:0 '),\n+(1436,'ValleyOfTrials8',1,14,363,1,10,4,-403.018,-4206.27,53.0641,5.51453,'1431:0 1433:0 1434:0 '),\n+(1437,'DurotarSW_hub1',1,14,816,1,10,4,162.168,-4433.07,35.4298,5.87386,'1402:0 1403:0 1438:0 1439:0 '),\n+(1438,'DurotarSW_hub2',1,14,816,1,10,4,80.4142,-4475.95,43.2596,0.578313,'1437:0 1439:0 '),\n+(1439,'DurotarSW_hub3',1,14,816,1,10,4,107.992,-4332.41,52.3223,5.13559,'1437:0 1438:0 1440:0 '),\n+(1440,'DurotarSW_hub4',1,14,816,1,10,4,29.2317,-4205.25,67.7773,5.8385,'1403:0 1404:0 1439:0 1441:0 '),\n+(1441,'DurotarSW_hub5',1,14,14,1,10,4,-53.7095,-4041.71,67.3331,0.00298548,'1404:0 1405:0 1440:0 1442:0 1443:0 '),\n+(1442,'DurotarSW_hub6',1,14,814,1,10,4,-173.855,-3864.96,35.2069,5.30244,'1441:0 1443:0 1476:0 1474:0 '),\n+(1443,'DurotarSW_hub7',1,14,14,1,10,4,72.4652,-3876.98,41.5453,3.44105,'1404:0 1405:0 1406:0 1441:0 1442:0 1474:0 '),\n+(1444,'EchoIsles1',1,14,368,1,10,4,-808.575,-5363.62,2.20208,1.32598,'1419:0 1445:0 1448:0 '),\n+(1445,'EchoIsles2',1,14,368,1,10,4,-1142.01,-5152.05,1.44042,0.283367,'1420:0 1444:0 1446:0 '),\n+(1446,'EchoIsles3',1,14,368,1,10,4,-1236.39,-5359.85,5.43454,0.742817,'1445:0 1447:0 1448:0 '),\n+(1447,'EchoIsles4',1,14,368,1,10,4,-1232.75,-5606.75,4.85907,1.49091,'1446:0 1448:0 '),\n+(1448,'EchoIsles5',1,14,368,1,10,4,-1035.61,-5519.3,7.91372,2.83395,'1444:0 1446:0 1447:0 '),\n+(1449,'BarrensNWBridge',1,17,17,8,25,4,313.815,-3718.22,26.5065,4.61206,'1406:0 1450:0 '),\n+(1450,'BarrensNW1',1,17,379,8,25,4,319.615,-3637.99,27.1854,4.5885,'1449:0 1451:0 1473:0 1474:0 '),\n+(1451,'BarrensNW2',1,17,17,8,25,4,824.833,-3721.02,27.1993,3.19834,'1389:0 1450:0 1452:0 '),\n+(1452,'BarrensNW3',1,17,17,8,25,0,1017.81,-3739.15,27.7416,5.18933,'1388:0 1389:0 1451:0 1453:0 1455:0 1459:0 '),\n+(1453,'BarrensNW4',1,17,17,8,25,4,1260.21,-3830.17,30.3266,3.3515,'1388:0 1452:0 1454:0 '),\n+(1454,'BarrensNW5',1,17,815,8,25,4,1550.39,-3863.76,40.7872,0.119578,'1360:0 1453:0 '),\n+(1455,'BarrensNW6',1,17,381,12,25,0,1205.41,-3622.44,82.8357,4.34975,'1452:0 1456:0 1457:0 '),\n+(1456,'BarrensNW7',1,17,381,12,25,0,1348.99,-3642.47,111.642,2.66035,'1455:0 1457:0 '),\n+(1457,'BarrensNW8',1,17,381,12,25,0,1351.11,-3571.19,92.4931,1.99552,'1455:0 1456:0 1458:0 '),\n+(1458,'BarrensNW9',1,17,381,8,25,0,1340.7,-3455.1,93.8483,3.69787,'1457:0 '),\n+(1459,'BarrensNW10',1,17,17,12,25,0,1103.13,-3455.42,87.1314,4.31322,'1452:0 1460:0 1462:0 1465:0 '),\n+(1460,'BarrensNW11',1,17,17,12,25,0,724.802,-3585.11,91.2962,0.655228,'1459:0 1461:0 '),\n+(1461,'BarrensNW12',1,17,17,8,25,0,383.869,-3439.47,95.2678,5.6425,'1460:0 1470:0 1471:0 '),\n+(1462,'BarrensNW13',1,17,17,12,25,0,1223.08,-3084.31,93.9201,4.30731,'1459:0 1463:0 1464:0 1466:0 '),\n+(1463,'BarrensNW14',1,17,17,18,25,0,1229.76,-2928.45,141.696,4.49974,'1462:0 1464:0 '),\n+(1464,'BarrensNW15',1,17,17,12,25,0,1012.81,-2999.42,92.4922,0.109361,'1462:0 1463:0 1465:0 1466:0 1467:0 1469:0 '),\n+(1465,'BarrensNW16',1,17,382,12,25,0,955.029,-3084.95,93.7057,5.40099,'1459:0 1464:0 1466:0 '),\n+(1466,'BarrensNW17',1,17,382,12,25,0,1020.82,-3080.5,105.204,1.82743,'1462:0 1464:0 1465:0 '),\n+(1467,'BarrensNW18',1,17,17,8,25,0,898.48,-2740.8,99.757,5.46973,'1464:0 1468:0 1469:0 '),\n+(1468,'BarrensNW19',1,17,17,8,25,0,803.624,-2654.79,91.6669,5.87813,'1467:0 1469:0 1496:0 1497:0 '),\n+(1469,'BarrensNW20',1,17,17,8,25,0,605.003,-2881.18,91.6679,0.109375,'1464:0 1467:0 1468:0 1470:0 1471:0 1493:0 1496:0 '),\n+(1470,'BarrensNW21',1,17,17,8,25,0,470.698,-3149.25,95.5705,1.16378,'1461:0 1469:0 1471:0 1472:0 '),\n+(1471,'BarrensNW22',1,17,17,8,25,0,382.399,-3074.79,91.8682,5.88794,'1461:0 1469:0 1470:0 1472:0 1477:0 '),\n+(1472,'BarrensNW23',1,17,17,8,25,0,146.635,-3204.39,80.1468,0.405853,'1470:0 1471:0 1473:0 1474:0 1477:0 1478:0 1479:0 '),\n+(1473,'BarrensNW24',1,17,17,8,25,0,204.31,-3418.93,30.6025,4.75106,'1450:0 1472:0 1474:0 '),\n+(1474,'BarrensNW25',1,17,17,8,25,0,18.7822,-3604.62,27.213,0.267903,'1442:0 1443:0 1450:0 1472:0 1473:0 1476:0 '),\n+(1475,'BarrensNW26',1,17,391,8,25,0,-701.915,-3931.25,25.2456,2.31781,'35:0 1476:0 '),\n+(1476,'BarrensNW27',1,17,17,8,25,0,-364.212,-3750.15,28.5958,0.262038,'1442:0 1475:0 1474:0 '),\n+(1477,'BarrensNW28',1,17,17,8,25,0,111.71,-2964.41,95.9003,5.8816,'1471:0 1472:0 1478:0 1491:0 1492:0 '),\n+(1478,'BarrensNW29',1,17,1699,8,25,0,-7.39568,-3036.98,91.6667,5.57137,'1472:0 1477:0 1479:0 1480:0 1489:0 1491:0 '),\n+(1479,'BarrensNW30',1,17,1699,8,25,0,-80.6494,-3175.83,92.6429,0.527153,'1472:0 1478:0 1480:0 '),\n+(1480,'BarrensNW31',1,17,1699,8,25,0,-43.7595,-3360.78,91.6672,1.44018,'1478:0 1479:0 1481:0 '),\n+(1481,'BarrensNW32',1,17,1699,8,25,0,-298.484,-3473.6,91.6745,0.415233,'1480:0 1482:0 1483:0 '),\n+(1482,'BarrensNW33',1,17,17,8,25,0,-636.173,-3699.63,92.7051,0.694045,'1481:0 1483:0 '),\n+(1483,'BarrensNW34',1,17,17,8,25,0,-807.155,-3308.81,91.6657,5.92872,'1482:0 1481:0 1485:0 1486:0 1484:0 '),\n+(1484,'BarrensNW35',1,17,17,8,25,0,-1029.31,-3412.99,75.3336,4.91947,'35:0 1483:0 1485:0 1563:0 '),\n+(1485,'BarrensNW36',1,17,17,8,25,0,-949.557,-3245.5,94.7159,4.38735,'1483:0 1486:0 1536:0 1538:0 1484:0 1563:0 '),\n+(1486,'BarrensNW37',1,17,17,8,25,0,-679.296,-2946.69,95.7877,4.08497,'1487:0 1488:0 1483:0 1485:0 1535:0 1536:0 1537:0 1539:0 '),\n+(1487,'BarrensNW38',1,17,17,8,25,0,-494.28,-2779.02,91.6669,0.741136,'1486:0 32:0 1488:0 '),\n+(1488,'BarrensNW39',1,17,1699,8,25,0,-242.594,-2859.38,91.9719,3.12681,'1486:0 1487:0 1489:0 1490:0 1491:0 '),\n+(1489,'BarrensNW40',1,17,1699,8,25,0,-191.258,-3014.29,91.6673,2.33356,'1478:0 1488:0 1491:0 '),\n+(1490,'BarrensNW41',1,17,458,8,25,0,-264.197,-2688.78,95.0971,4.53071,'32:0 1488:0 1491:0 1525:0 '),\n+(1491,'BarrensNW42',1,17,17,8,25,0,72.2048,-2789.84,95.8713,3.29567,'1490:0 1488:0 1489:0 1477:0 1478:0 1492:0 1525:0 '),\n+(1492,'BarrensNW43',1,17,458,8,25,0,205.138,-2695.31,91.667,3.68445,'1477:0 1491:0 1493:0 1494:0 1495:0 '),\n+(1493,'BarrensNW44',1,17,458,8,25,0,400.957,-2643.1,91.667,3.49596,'1469:0 1492:0 1494:0 1496:0 '),\n+(1494,'BarrensNW45',1,17,17,8,25,0,266.964,-2535.13,91.6658,3.36441,'1492:0 1493:0 1495:0 '),\n+(1495,'BarrensNW46',1,17,17,8,25,0,78.9108,-2561.24,92.6826,5.54193,'1492:0 1494:0 1524:0 '),\n+(1496,'BarrensNW47',1,17,458,8,25,0,575.696,-2568.22,95.8126,5.44179,'1468:0 1469:0 1493:0 1497:0 '),\n+(1497,'BarrensNW48',1,17,458,8,25,0,687.068,-2366.64,91.6681,4.22717,'1468:0 1496:0 1498:0 1499:0 '),\n+(1498,'BarrensNW49',1,17,458,8,25,0,804.041,-2282.18,91.6685,3.41822,'1497:0 1499:0 1500:0 1519:0 '),\n+(1499,'BarrensNW50',1,17,17,12,25,0,703.606,-2031.77,91.6667,4.72591,'1497:0 1498:0 1500:0 1509:0 1510:0 '),\n+(1500,'BarrensNW51',1,17,17,12,25,0,529.014,-2166.69,94.5542,0.545634,'1498:0 1499:0 1501:0 '),\n+(1501,'DreadmistPeak1',1,17,384,12,25,0,459.817,-2082.78,138.447,5.5015,'1500:0 1502:0 1504:0 '),\n+(1502,'DreadmistPeak2',1,17,384,12,25,0,375.749,-2068.56,138.668,6.1259,'1501:0 1503:0 '),\n+(1503,'DreadmistPeak3',1,17,384,12,25,0,324.847,-1976.99,98.671,5.27963,'1502:0 1510:0 1520:0 '),\n+(1504,'DreadmistPeak4',1,17,384,12,25,0,417.639,-2212.21,181.222,1.37424,'1501:0 1505:0 '),\n+(1505,'DreadmistPeak5',1,17,384,12,25,0,307.073,-2144.55,210.989,5.7273,'1504:0 1506:0 1507:0 '),\n+(1506,'DreadmistPeak6',1,17,2138,12,25,0,319.238,-2233.42,211.954,1.68053,'1505:0 '),\n+(1507,'DreadmistPeak7',1,17,384,8,25,0,353.055,-2209.97,222.18,1.93971,'1505:0 1508:0 '),\n+(1508,'DreadmistPeak8',1,17,384,17,25,0,322.312,-2277.26,243.384,1.42331,'1507:0 '),\n+(1509,'BarrensNW52',1,17,17,12,25,0,583.146,-1755.46,92.9558,1.45863,'1499:0 1510:0 1511:0 '),\n+(1510,'BarrensNW53',1,17,17,8,25,0,372.587,-1848.86,91.6675,6.01198,'1503:0 1499:0 1509:0 1520:0 1521:0 1522:0 '),\n+(1511,'BarrensNW54',1,17,383,12,25,0,535.439,-1429.14,91.6668,4.989,'1509:0 1512:0 1514:0 1515:0 1516:0 '),\n+(1512,'BarrensNW55',1,17,383,12,25,0,709.638,-1260.36,91.682,3.91105,'1511:0 1513:0 '),\n+(1513,'BarrensNW56',1,17,383,12,25,0,817.064,-1365.59,91.871,2.68583,'1512:0 '),\n+(1514,'BarrensNW57',1,17,383,12,25,0,532.937,-1155.43,91.6668,4.67093,'1511:0 '),\n+(1515,'BarrensNW58',1,17,383,12,25,0,296.616,-1482.58,91.6668,0.139182,'1511:0 1517:0 1516:0 1520:0 '),\n+(1516,'BarrensNW59',1,17,383,12,25,0,300.682,-1617.75,91.6668,0.681106,'1511:0 1515:0 1517:0 1520:0 '),\n+(1517,'BarrensNW60',1,17,17,8,25,0,42.8186,-1528.23,91.6728,3.42876,'1515:0 1516:0 1520:0 1523:0 1531:0 1533:0 '),\n+(1518,'BarrensExitN1h',1,17,1703,8,25,4,1261.05,-2223.39,92.0335,0.0904736,'1110:0 1519:0 '),\n+(1519,'BarrensExitN2',1,17,1703,8,25,0,1157.98,-2338.54,92.3068,2.80599,'1111:0 1498:0 1518:0 '),\n+(1520,'BarrensNW61',1,17,17,8,25,0,242.384,-1748.46,91.6668,5.32751,'1503:0 1510:0 1515:0 1516:0 1517:0 1521:0 '),\n+(1521,'BarrensNW62',1,17,17,8,25,0,130.568,-1864.4,92.6122,0.169403,'1510:0 1520:0 1522:0 1523:0 '),\n+(1522,'BarrensNW63',1,17,386,8,25,0,132.261,-1980.79,93.8709,0.723104,'1510:0 1521:0 1524:0 1528:0 '),\n+(1523,'BarrensNW64',1,17,17,8,25,0,-136.632,-1764.4,93.1031,0.640629,'1517:0 1521:0 1524:0 1528:0 1529:0 1530:0 1531:0 '),\n+(1524,'BarrensNW65',1,17,17,8,25,0,-73.4923,-2214.29,92.1839,1.03725,'1495:0 1522:0 1523:0 1527:0 1528:0 '),\n+(1525,'BarrensNW66',1,17,17,8,25,0,-246.525,-2527.3,91.7286,5.22342,'1490:0 1491:0 1527:0 1526:0 1528:0 '),\n+(1526,'BarrensNW67',1,17,380,8,25,4,-349.471,-2524,95.5815,4.46591,'32:0 1525:0 1527:0 '),\n+(1527,'BarrensNW68',1,17,17,8,25,0,-344.921,-2376.03,92.3735,5.15509,'1524:0 1525:0 1526:0 1528:0 1534:0 '),\n+(1528,'BarrensNW69',1,17,17,8,25,0,-281.4,-2113.94,95.7902,6.18005,'1522:0 1523:0 1524:0 1525:0 1527:0 1529:0 '),\n+(1529,'BarrensNW70',1,17,17,8,25,0,-430.244,-1826.78,95.7877,0.218878,'1523:0 1528:0 1530:0 1557:0 '),\n+(1530,'BarrensNW71',1,17,17,8,25,0,-515.745,-1537.11,91.6677,5.10603,'1523:0 1529:0 1531:0 1532:0 1557:0 '),\n+(1531,'BarrensNW72',1,17,17,8,25,0,-343.855,-1488.98,92.6671,5.38288,'1517:0 1523:0 1530:0 1532:0 '),\n+(1532,'BarrensExitW1h',1,17,1702,8,25,4,-390.512,-1368.33,91.7005,4.15177,'1530:0 1531:0 1533:0 '),\n+(1533,'BarrensExitW2h',1,17,17,13,25,0,-245.782,-1071.05,33.877,5.35494,'1517:0 1532:0 1619:0 1621:0 '),\n+(1534,'BarrensC1',1,17,17,8,25,0,-554.876,-2457.12,91.7172,0.415224,'1527:0 1535:0 '),\n+(1535,'BarrensC2',1,17,458,8,25,0,-733.228,-2616.64,95.7878,6.07401,'32:0 1486:0 1534:0 1536:0 1537:0 1539:0 '),\n+(1536,'BarrensC3',1,17,388,8,25,0,-1088.78,-2943.42,93.188,0.309157,'1485:0 1486:0 1535:0 1537:0 1538:0 1539:0 1563:0 '),\n+(1537,'BarrensC4',1,17,388,8,25,0,-1234.76,-2828.43,94.4675,5.62828,'1486:0 1535:0 1536:0 1542:0 1543:0 '),\n+(1538,'BarrensC5',1,17,17,8,25,0,-1482.86,-2989.48,91.6667,0.000901222,'1485:0 1536:0 1542:0 1543:0 1546:0 1545:0 1544:0 1563:0 '),\n+(1539,'BarrensC6',1,17,458,8,25,0,-950.333,-2486.75,94.2879,5.17669,'98:0 1486:0 1535:0 1536:0 1540:0 1541:0 '),\n+(1540,'BarrensC7',1,17,387,8,25,0,-1024.84,-2164.71,84.5132,0.52637,'98:0 1539:0 1541:0 '),\n+(1541,'BarrensC8',1,17,17,8,25,0,-1117.92,-2388.71,94.9693,5.93383,'1539:0 1540:0 1542:0 1556:0 '),\n+(1542,'BarrensC9',1,17,458,8,25,0,-1390.23,-2505.64,95.7878,4.84017,'1537:0 1538:0 1541:0 1543:0 1555:0 '),\n+(1543,'BarrensC10',1,17,458,8,25,0,-1623.03,-2514.87,91.6709,0.0433447,'1537:0 1538:0 1542:0 1546:0 1555:0 1544:0 '),\n+(1544,'BarrensC11',1,17,17,8,25,0,-1811.46,-3139.58,82.9337,0.885322,'1571:0 1545:0 1538:0 1543:0 1546:0 1568:0 1613:0 '),\n+(1545,'BarrensC12',1,17,1698,14,25,0,-1907.03,-2804.32,92.2989,1.69465,'1538:0 1546:0 1547:0 1548:0 1544:0 '),\n+(1546,'BarrensC13',1,17,1157,8,25,0,-1711.88,-2559.16,91.6722,0.463532,'1538:0 1543:0 1545:0 1548:0 1549:0 1544:0 '),\n+(1547,'BarrensC14',1,17,1698,14,25,0,-2248.79,-2613.16,92.2697,5.81799,'1545:0 1548:0 1550:0 1551:0 '),\n+(1548,'BarrensC15',1,17,1698,14,25,0,-2094.77,-2532.69,91.9084,5.93581,'1545:0 1546:0 1547:0 1549:0 1550:0 1551:0 1583:0 '),\n+(1549,'BarrensC16',1,17,1157,8,25,0,-1876.87,-2436.12,95.4993,5.38799,'1546:0 1548:0 1551:0 1552:0 1555:0 '),\n+(1550,'BarrensC17',1,17,1157,8,25,0,-2277.85,-2179.6,95.7945,5.15236,'174:0 1547:0 1548:0 1551:0 1552:0 1554:0 1583:0 1585:0 '),\n+(1551,'BarrensC18',1,17,1157,8,25,0,-2101.34,-2220.57,95.7877,5.73158,'174:0 1547:0 1548:0 1549:0 1550:0 1552:0 '),\n+(1552,'BarrensC19',1,17,1700,14,25,0,-1909.45,-2038.55,92.9508,3.72685,'1549:0 1550:0 1551:0 1553:0 1554:0 1555:0 1560:0 '),\n+(1553,'BarrensC20',1,17,1700,14,25,0,-2121.99,-1733.9,91.6668,3.88196,'174:0 1552:0 1554:0 1560:0 1584:0 '),\n+(1554,'BarrensC21',1,17,1700,14,25,0,-2085.34,-1938.99,95.871,2.79616,'174:0 1550:0 1552:0 1553:0 1560:0 '),\n+(1555,'BarrensC22',1,17,17,14,25,0,-1638.12,-2190.4,92.6765,5.08558,'1542:0 1543:0 1549:0 1552:0 1556:0 1558:0 1561:0 '),\n+(1556,'BarrensC23',1,17,17,8,25,0,-1266.05,-2043.5,92.6438,3.55996,'1541:0 1555:0 1557:0 1558:0 '),\n+(1557,'BarrensC24',1,17,17,8,25,0,-926.196,-1839.83,92.0056,5.03258,'98:0 1529:0 1530:0 1556:0 1558:0 '),\n+(1558,'BarrensC25',1,17,1700,14,25,0,-1425.03,-1796.65,92.0678,5.31103,'1555:0 1556:0 1557:0 1559:0 1561:0 '),\n+(1559,'BarrensC26',1,17,1700,14,25,0,-1440.3,-1560.56,95.9826,0.920663,'1558:0 1561:0 '),\n+(1560,'BarrensC27',1,17,1700,14,25,0,-1871.3,-1875.92,93.6595,4.45692,'1552:0 1553:0 1554:0 1561:0 '),\n+(1561,'BarrensC28',1,17,1700,14,25,0,-1612.86,-1781.52,91.7801,1.78067,'1555:0 1558:0 1559:0 1560:0 '),\n+(1562,'BarrensC29',1,17,391,8,25,0,-1376.36,-3840.81,18.7024,0.388567,'35:0 1565:0 1569:0 '),\n+(1563,'BarrensC30',1,17,17,8,25,0,-1136.17,-3317.73,91.835,0.363033,'1484:0 1485:0 1536:0 1538:0 1564:0 '),\n+(1564,'BarrensC31',1,17,17,8,25,0,-1232.04,-3640.85,93.8864,1.23286,'1563:0 1565:0 '),\n+(1565,'BarrensC32',1,17,17,12,25,0,-1358.56,-3651.68,91.8621,5.3562,'1562:0 1564:0 1566:0 '),\n+(1566,'BarrensC33',1,17,17,12,25,0,-1611.42,-3708.07,89.8631,0.284498,'1565:0 1567:0 1568:0 '),\n+(1567,'BarrensC34',1,17,17,12,25,0,-1630.78,-3593.7,93.0714,4.90264,'1566:0 1568:0 '),\n+(1568,'BarrensC35',1,17,17,12,25,0,-1755.9,-3578.38,93.1759,5.92169,'1544:0 1566:0 1567:0 '),\n+(1569,'BarrensC36',1,17,391,8,25,0,-1644.33,-3851.75,13.843,0.197311,'1562:0 1570:0 '),\n+(1570,'BarrensC37',1,17,385,8,25,0,-1877.52,-3684.16,8.56349,5.68766,'1569:0 1571:0 1572:0 1575:0 '),\n+(1571,'BarrensC38',1,17,385,8,25,0,-1962.03,-3412.38,56.1606,4.99848,'1544:0 1570:0 '),\n+(1572,'BarrensC39',1,17,385,8,25,0,-2093.49,-3786.65,1.11667,0.38229,'1570:0 1573:0 '),\n+(1573,'BarrensC40',1,17,385,33,45,0,-2168.16,-3893.99,0.105911,2.3988,'1572:0 1574:0 1900:0 '),\n+(1574,'BarrensC41',1,17,385,33,45,0,-2296.44,-3875.08,0.411085,0.0838384,'1573:0 1896:0 1900:0 '),\n+(1575,'NorthwatchHold1',1,17,385,12,25,4,-2006.43,-3674.7,21.8223,5.27337,'1570:0 1576:0 '),\n+(1576,'NorthwatchHold2',1,17,385,12,25,4,-2014.16,-3558.11,22.9401,4.40551,'1575:0 1577:0 '),\n+(1577,'NorthwatchHold3',1,17,385,12,25,4,-2105.62,-3592.85,59.4242,0.125087,'1576:0 1578:0 1579:0 '),\n+(1578,'NorthwatchHold4',1,17,385,8,25,4,-2106.59,-3663.32,96.1895,0.928159,'1577:0 '),\n+(1579,'NorthwatchHold5',1,17,385,12,25,4,-2186.42,-3696.81,90.2787,1.00002,'1577:0 1580:0 1581:0 '),\n+(1580,'NorthwatchHold6',1,17,385,12,25,4,-2222.08,-3775.47,130.862,0.551559,'1579:0 '),\n+(1581,'NorthwatchHold7',1,17,385,12,25,4,-2146.93,-3560.64,91.6658,4.29007,'1579:0 1582:0 '),\n+(1582,'NorthwatchHold8',1,17,385,12,25,4,-2088.88,-3507.98,130.084,4.00692,'1581:0 '),\n+(1583,'BarrensS1',1,17,1156,18,25,0,-2489.54,-2427.29,91.7094,6.28066,'1548:0 1550:0 1585:0 1586:0 '),\n+(1584,'BarrensS2',1,17,1156,18,25,0,-2509.21,-1790.84,91.6888,0.117235,'174:0 1553:0 1585:0 1586:0 1587:0 '),\n+(1585,'BarrensS3',1,17,1157,18,25,0,-2496.45,-2147.95,95.7846,6.25905,'174:0 1550:0 1583:0 1584:0 1586:0 '),\n+(1586,'BarrensS4',1,17,1157,18,25,0,-2759.08,-2184.15,95.793,0.0131506,'1583:0 1584:0 1585:0 1587:0 '),\n+(1587,'BarrensS5',1,17,1157,18,25,0,-2945.71,-2047.99,95.7879,0.507956,'1584:0 1586:0 1588:0 1589:0 1591:0 '),\n+(1588,'BarrensS6',1,17,1157,18,25,0,-3285.06,-2049.93,92.2466,6.10862,'1587:0 1589:0 1590:0 1591:0 1593:0 1594:0 1596:0 '),\n+(1589,'BarrensS7',1,17,390,18,25,0,-3079.79,-1941.98,94.9653,3.28119,'1587:0 1588:0 1590:0 '),\n+(1590,'BarrensS8',1,17,390,18,25,0,-3131.93,-1680.95,92.0185,4.74203,'1588:0 1589:0 '),\n+(1591,'BarrensS9',1,17,390,18,25,0,-3131.04,-2171.34,93.5897,1.45786,'1587:0 1588:0 1592:0 1596:0 '),\n+(1592,'BarrensS10',1,17,390,18,25,0,-3110.95,-2348.03,94.3578,1.81325,'1591:0 '),\n+(1593,'BarrensS11',1,17,1156,18,25,0,-3458.57,-1830.89,91.667,5.2042,'1588:0 1595:0 '),\n+(1594,'BarrensS12',1,17,1157,18,25,0,-3481.33,-2051.77,96.4547,0.0284251,'1588:0 1595:0 1596:0 '),\n+(1595,'BarrensS13',1,17,1157,18,25,0,-3653.21,-2015.41,91.6668,0.540897,'1593:0 1594:0 1596:0 1597:0 1599:0 1600:0 '),\n+(1596,'BarrensS14',1,17,1156,18,25,0,-3651.34,-2318.77,91.6674,0.625316,'1595:0 1588:0 1591:0 1594:0 1597:0 1607:0 1872:0 '),\n+(1597,'BarrensS15',1,17,1157,18,25,0,-3840.72,-2048.27,91.6821,6.27935,'1595:0 1596:0 1598:0 1599:0 1600:0 1607:0 '),\n+(1598,'BarrensS16',1,17,1157,18,25,0,-4067.36,-2048.82,91.6672,6.16353,'1597:0 1601:0 1602:0 1607:0 1610:0 '),\n+(1599,'BarrensS17',1,17,1701,18,25,0,-3730.53,-1594.06,93.2113,4.82441,'1595:0 1597:0 1600:0 1601:0 '),\n+(1600,'BarrensS18',1,17,1701,18,25,0,-3894.71,-1618.14,91.6668,0.128916,'1595:0 1597:0 1599:0 1601:0 '),\n+(1601,'BarrensS19',1,17,1701,18,25,0,-4039.89,-1841.83,94.2054,0.676733,'1598:0 1599:0 1600:0 1602:0 '),\n+(1602,'BarrensS20',1,17,1157,18,25,0,-4188.61,-1914.07,91.6668,5.68758,'1598:0 1601:0 1603:0 '),\n+(1603,'BarrensS21',1,17,1157,18,25,0,-4356.79,-1884.72,89.6352,5.97818,'1602:0 1604:0 1606:0 '),\n+(1604,'BarrensS22',1,17,1157,18,25,0,-4478.66,-1866.94,86.1087,1.26186,'1603:0 1605:0 '),\n+(1605,'BarrensRFK1',1,17,1717,18,25,0,-4476,-1686.51,81.5791,4.60765,'1604:0 '),\n+(1606,'BarrensRFD1',1,17,1316,30,40,0,-4487.33,-2054.23,75.9531,5.76807,'1603:0 '),\n+(1607,'BaelModan1',1,17,359,18,25,4,-3989.77,-2218.81,95.0004,6.06065,'1596:0 1597:0 1598:0 1608:0 '),\n+(1608,'BaelModan2',1,17,359,18,25,4,-4109.4,-2315.19,125.071,0.600164,'1607:0 1609:0 '),\n+(1609,'BaelModan3',1,17,2157,8,25,4,-4073.79,-2368.19,108.909,2.02644,'1608:0 '),\n+(1610,'BaelModan4',1,17,359,18,25,4,-4176.57,-2101.49,72.6592,0.294635,'1598:0 1611:0 '),\n+(1611,'BaelModan5',1,17,359,18,25,4,-4071.12,-2157.56,50.3844,2.75686,'1610:0 1612:0 '),\n+(1612,'BaelModan6',1,17,359,18,25,4,-4223.35,-2272.53,60.9001,0.575407,'1611:0 '),\n+(1613,'RaptorGrounds',1,17,1697,12,25,0,-2042.89,-3229.73,91.8767,0.499641,'1544:0 '),\n+(1614,'BarrensWC1',1,718,718,8,20,0,-692.325,-2048.77,65.8045,0.216115,'98:0 1615:0 '),\n+(1615,'BarrensWC2',1,718,718,12,25,0,-580.407,-2042.49,57.4486,4.80284,'1614:0 1616:0 '),\n+(1616,'BarrensWC3',1,718,718,12,25,0,-677.272,-2203.72,25.3109,0.830688,'1615:0 1617:0 '),\n+(1617,'BarrensWC4',1,718,718,12,25,0,-638.458,-2387.33,25.6848,1.69853,'1616:0 '),\n+(1618,'RatchetSpawn',1,17,392,8,20,1,-1057.17,-3641.62,23.878,5.32863,'35:0 '),\n+(1619,'BarrensExitW2_1a',1,17,17,13,25,2,-365.7,-970.989,26.4604,0.0515498,'1533:0 1620:0 '),\n+(1620,'BarrensExitW2_2',1,17,17,13,25,2,-257.953,-835.045,8.42398,4.38694,'1619:0 1621:0 1622:0 '),\n+(1621,'STMExitE',1,406,469,13,25,4,-231.912,-777.297,7.15901,4.25107,'1533:0 1620:0 1622:0 '),\n+(1622,'StonetalonSE1',1,406,469,13,25,0,-183.878,-696.708,0.285728,4.19806,'1620:0 1621:0 1623:0 '),\n+(1623,'StonetalonSE2',1,406,2538,13,25,0,7.63915,-645.484,-33.8698,3.50887,'1622:0 1624:0 1625:0 1626:0 1630:0 '),\n+(1624,'StonetalonSE3',1,406,469,13,25,0,-21.452,-771.961,1.19909,1.25477,'1623:0 1625:0 '),\n+(1625,'StonetalonSE4',1,406,469,13,25,0,173.964,-863.908,2.87119,2.42107,'1623:0 1624:0 '),\n+(1626,'StonetalonSE5',1,406,2537,13,25,0,127.03,-646.104,-0.157034,3.15149,'1623:0 1627:0 '),\n+(1627,'StonetalonSE6',1,406,2537,13,25,0,102.577,-522.122,3.25329,4.9677,'1626:0 1628:0 1629:0 '),\n+(1628,'StonetalonSE7',1,406,2537,13,25,0,219.214,-475.456,21.9453,3.60701,'1627:0 1629:0 '),\n+(1629,'StonetalonSE8',1,406,469,13,25,0,104.777,-261.978,5.20105,5.15819,'1627:0 1628:0 1632:0 1633:0 '),\n+(1630,'StonetalonSE9',1,406,2538,13,25,0,-62.1728,-442.081,-37.1112,5.01095,'1623:0 1631:0 '),\n+(1631,'StonetalonSE10',1,406,469,13,25,0,-29.9825,-291.416,-5.66732,4.59076,'1630:0 1632:0 '),\n+(1632,'StonetalonSE11',1,406,2539,13,25,0,-2.18294,-227.074,15.1619,4.29231,'1629:0 1631:0 1633:0 1640:0 '),\n+(1633,'StonetalonSE12',1,406,1076,13,25,0,59.7029,-127.555,15.3056,4.18039,'1629:0 1632:0 1634:0 '),\n+(1634,'StonetalonSE13',1,406,1076,13,25,0,109.545,-71.7213,22.4065,2.6092,'1633:0 1635:0 1641:0 '),\n+(1635,'StonetalonSE14',1,406,2540,13,25,0,23.5805,-29.4616,31.6752,5.8097,'1634:0 1636:0 '),\n+(1636,'StonetalonSE15',1,406,2540,13,25,0,-14.5426,41.0345,49.7486,5.30902,'1635:0 1637:0 '),\n+(1637,'StonetalonSE16',1,406,2540,13,25,0,-152.111,135.096,48.9698,5.51519,'1636:0 1638:0 '),\n+(1638,'StonetalonSE17',1,406,3157,13,25,0,-114.052,239.055,102.383,4.22518,'1637:0 1639:0 '),\n+(1639,'StonetalonSE18',1,406,3157,13,25,0,2.62312,403.85,101.011,3.79714,'1638:0 '),\n+(1640,'StonetalonSE19',1,406,2539,13,25,5,-235.218,-347.587,20.2574,0.490614,'1632:0 '),\n+(1641,'StonetalonSE20',1,406,1076,13,25,0,197.073,203.918,52.5873,4.43331,'1634:0 1642:0 '),\n+(1642,'StonetalonSE21',1,406,1076,13,25,0,274.453,322.855,41.911,4.60022,'1641:0 1643:0 '),\n+(1643,'StonetalonSE22',1,406,1076,13,25,0,447.877,347.349,47.8893,3.28665,'1642:0 1644:0 1646:0 '),\n+(1644,'StonetalonSE23',1,406,2541,13,25,0,426.687,491.945,98.4352,4.79266,'1643:0 1645:0 '),\n+(1645,'StonetalonSE24',1,406,2541,13,25,0,465.249,636.071,69.1319,4.43923,'1644:0 151:0 '),\n+(1646,'StonetalonSE25',1,406,1076,13,25,0,547.002,317.026,51.4155,2.61083,'1643:0 1647:0 1660:0 '),\n+(1647,'StonetalonSE26',1,406,461,13,25,0,944.851,205.469,22.8061,2.8916,'1646:0 1648:0 1649:0 1650:0 '),\n+(1648,'StonetalonE1',1,406,636,13,25,0,1111.38,-250.367,-1.11603,1.94521,'1647:0 153:0 1649:0 1651:0 1655:0 '),\n+(1649,'StonetalonE2',1,406,636,13,25,0,1154.28,55.6527,1.56437,2.89789,'1647:0 1648:0 152:0 1650:0 1651:0 1655:0 '),\n+(1650,'StonetalonE3',1,406,461,13,25,0,1307.08,338.017,30.2635,3.38681,'152:0 1647:0 1649:0 1651:0 '),\n+(1651,'StonetalonE4',1,406,461,13,25,0,1299.88,-37.5445,6.46784,2.5696,'152:0 1648:0 1649:0 1650:0 1655:0 '),\n+(1652,'StonetalonE5',1,406,463,13,25,0,1596.92,-164.112,37.8,1.7689,'152:0 1653:0 1656:0 '),\n+(1653,'StonetalonE6',1,406,461,13,25,0,1503.38,-325.077,23.7601,0.679167,'154:0 1652:0 1655:0 '),\n+(1654,'StonetalonE7',1,406,461,13,25,0,1239.88,-573.82,14.7456,2.30493,'153:0 1655:0 '),\n+(1655,'StonetalonE8',1,406,461,13,25,0,1274.45,-389.01,15.6582,4.91048,'153:0 154:0 1648:0 1649:0 1651:0 1653:0 1654:0 '),\n+(1656,'StonetalonE9',1,406,463,13,25,0,1689.34,-66.4877,90.3719,1.43312,'1652:0 1657:0 '),\n+(1657,'StonetalonE10',1,406,463,13,25,0,1683.31,88.067,136.952,4.78089,'1656:0 1658:0 '),\n+(1658,'StonetalonE11',1,406,463,13,25,0,1607.48,98.5127,98.5487,1.23875,'1657:0 1659:0 '),\n+(1659,'StonetalonE12',1,406,463,13,25,0,1607.14,183.852,104.64,5.9099,'1658:0 '),\n+(1660,'StonetalonC1',1,406,1076,13,25,0,741.152,432.351,64.3987,3.6401,'1646:0 1661:0 1662:0 '),\n+(1661,'StonetalonC2',1,406,1076,13,25,3,734.898,323.955,63.5237,1.26623,'1660:0 1662:0 '),\n+(1662,'StonetalonC3',1,406,1076,13,25,0,911.255,644.216,97.0932,4.02886,'1660:0 1661:0 45:0 1670:0 '),\n+(1663,'StonetalonC4',1,406,460,13,25,5,967.945,1059.83,107.154,4.48637,'45:0 1664:0 '),\n+(1664,'StonetalonC5',1,406,460,20,25,4,857.673,1068.45,134.552,6.12668,'1663:0 1665:0 '),\n+(1665,'StonetalonC6',1,406,406,20,25,4,770.751,1128.86,184.567,5.69273,'1664:0 1666:0 '),\n+(1666,'StonetalonC7',1,406,406,20,25,4,763.22,1201.45,167.109,4.77383,'1665:0 1667:0 '),\n+(1667,'StonetalonC8',1,406,406,20,25,4,612.567,1230.12,105.052,5.96764,'1666:0 1668:0 '),\n+(1668,'StonetalonC9',1,406,465,20,25,4,639.837,1320.23,57.7872,0.670119,'1667:0 1669:0 '),\n+(1669,'StonetalonC10',1,406,465,20,25,0,717.122,1407.26,-11.3895,4.23973,'1668:0 1698:0 1699:0 1703:0 '),\n+(1670,'StonetalonC11',1,406,1076,16,25,0,1254.55,723.188,177.709,3.60317,'1662:0 1671:0 1677:0 '),\n+(1671,'StonetalonC12',1,406,406,18,25,2,1149.35,812.103,216.145,0.074743,'1670:0 1672:0 '),\n+(1672,'StonetalonC13',1,406,406,18,25,2,1174.45,1039.29,211.338,4.51028,'1671:0 1673:0 '),\n+(1673,'StonetalonC14',1,406,406,18,25,2,1150.98,1125.82,230.66,4.8323,'1672:0 1674:0 '),\n+(1674,'StonetalonC15',1,406,406,18,25,2,1185.65,1218.77,221.734,4.2727,'1673:0 1675:0 '),\n+(1675,'StonetalonC16',1,406,406,18,25,2,1120.4,1212.75,204.833,0.0197749,'1674:0 1676:0 '),\n+(1676,'StonetalonC17',1,406,406,18,25,2,1150.62,1371.11,126.775,4.37873,'1675:0 1697:0 '),\n+(1677,'StonetalonC18',1,406,464,16,25,0,1370.73,733.802,156.258,3.23598,'1670:0 1678:0 1681:0 '),\n+(1678,'StonetalonC19',1,406,464,16,25,0,1446.65,663,145.249,2.57819,'1677:0 1679:0 1680:0 '),\n+(1679,'StonetalonC20',1,406,464,16,25,0,1553.51,543.727,164.574,2.16586,'1678:0 1680:0 '),\n+(1680,'StonetalonC21',1,406,464,16,25,0,1584.31,756.555,132.915,4.49848,'1678:0 1679:0 1681:0 1686:0 '),\n+(1681,'StonetalonC22',1,406,464,16,25,0,1440.45,891.877,138.324,4.65164,'1677:0 1680:0 1682:0 1683:0 '),\n+(1682,'StonetalonC23',1,406,464,16,25,0,1361.44,1063.47,166.157,5.2289,'1681:0 1683:0 '),\n+(1683,'StonetalonC24',1,406,464,16,25,0,1500.8,1046.96,144.855,4.37673,'1681:0 1682:0 1684:0 1685:0 '),\n+(1684,'StonetalonC25',1,406,464,16,25,0,1668.56,1003.04,136.669,2.88249,'1683:0 1685:0 1686:0 1687:0 '),\n+(1685,'StonetalonC26',1,406,406,16,25,0,1533.39,1167.23,150.198,5.27402,'1683:0 1684:0 1695:0 '),\n+(1686,'StonetalonC27',1,406,464,16,25,0,1837.17,772.144,145.217,3.08276,'1680:0 1684:0 1687:0 '),\n+(1687,'StonetalonC28',1,406,464,16,25,0,1832.42,946.127,147.601,2.87658,'1684:0 1686:0 1688:0 '),\n+(1688,'StonetalonN1',1,406,406,16,25,0,2089.45,985.763,224.629,0.496822,'1687:0 1689:0 1690:0 '),\n+(1689,'StonetalonN2',1,406,467,16,25,0,2389.72,1113.13,305.081,3.60307,'1688:0 '),\n+(1690,'StonetalonN3',1,406,467,16,25,0,2406.02,1262.32,293.173,4.48076,'39:0 1688:0 1691:0 1694:0 '),\n+(1691,'StonetalonN4',1,406,467,16,25,0,2308.04,1474.22,278.518,5.29758,'1692:0 1694:0 1690:0 '),\n+(1692,'StonetalonN5',1,406,468,16,25,0,2455.85,1706.87,321.807,3.7366,'1691:0 155:0 39:0 1694:0 '),\n+(1693,'StonetalonN6',1,406,468,16,25,4,2502.8,1923.14,341.618,4.8177,'155:0 '),\n+(1694,'StonetalonN7',1,406,467,18,25,0,2490.31,1474.07,262.723,0.177969,'39:0 1691:0 1692:0 1690:0 '),\n+(1695,'StonetalonW1',1,406,406,18,25,0,1531.08,1382.61,154.485,3.40792,'1685:0 1696:0 '),\n+(1696,'StonetalonW2',1,406,406,18,25,0,1396,1443.1,122.505,3.64354,'1695:0 1697:0 '),\n+(1697,'StonetalonW3',1,406,406,18,25,0,1250.91,1480.82,78.0749,3.62587,'1676:0 1696:0 1698:0 '),\n+(1698,'StonetalonW4',1,406,465,20,25,0,926.026,1574.39,-15.7829,5.87604,'1669:0 1697:0 1702:0 1703:0 '),\n+(1699,'StonetalonW5',1,406,465,20,25,0,546.937,1540.31,-5.73179,5.59329,'1669:0 1700:0 1703:0 '),\n+(1700,'StonetalonW6',1,406,465,20,25,0,498.082,1756.93,4.7637,5.0278,'1699:0 1701:0 1703:0 1704:0 '),\n+(1701,'StonetalonW7',1,406,465,20,25,0,684.965,1869.36,-7.54489,3.9518,'1700:0 1702:0 1703:0 '),\n+(1702,'StonetalonW8',1,406,465,20,25,0,905.075,1799.18,-4.36236,2.8974,'1698:0 1701:0 1703:0 '),\n+(1703,'StonetalonW9',1,406,465,20,25,0,709.779,1654.47,-27.9084,0.454811,'1669:0 1698:0 1699:0 1700:0 1701:0 1702:0 '),\n+(1704,'STMExitSW',1,406,465,20,25,0,386.19,1791.83,40.6481,5.89762,'1700:0 1705:0 '),\n+(1705,'DesolaceExitN',1,405,405,28,40,0,254.286,1837.65,86.6541,5.89961,'1704:0 1706:0 '),\n+(1706,'DesolaceN1',1,405,405,28,40,0,136.31,1790.75,86.2292,4.91001,'1705:0 1707:0 1708:0 1709:0 '),\n+(1707,'DesolaceN2',1,405,405,28,40,0,174.958,1580.05,166.08,3.19588,'1706:0 1708:0 '),\n+(1708,'DesolaceN3',1,405,405,28,40,0,-43.4822,1503,100.016,0.657084,'1706:0 1707:0 1709:0 1711:0 1712:0 1713:0 '),\n+(1709,'DesolaceN4',1,405,599,28,40,0,-240.456,1624.18,94.7617,2.12576,'1706:0 1708:0 1710:0 1711:0 1712:0 '),\n+(1710,'DesolaceN5',1,405,599,28,40,0,-478.435,1651.62,103.311,6.16664,'1709:0 1711:0 1724:0 1727:0 '),\n+(1711,'DesolaceN6',1,405,405,28,40,0,-519.027,1436.95,89.0591,0.360579,'1708:0 1709:0 1710:0 1712:0 1723:0 1743:0 1744:0 1745:0 '),\n+(1712,'DesolaceN7',1,405,405,28,40,0,-262.519,1170.51,90.2776,1.81553,'1708:0 1709:0 1711:0 1713:0 1717:0 1720:0 1723:0 '),\n+(1713,'DesolaceN8',1,405,405,28,40,0,-68.2755,1158.91,90.8663,1.88621,'1708:0 1712:0 1714:0 1717:0 1720:0 '),\n+(1714,'DesolaceN9',1,405,608,28,40,2,24.7744,1218.69,134.023,3.19194,'1713:0 1715:0 '),\n+(1715,'DesolaceN10',1,405,608,28,40,2,166.996,1219.58,166.116,3.12321,'1714:0 1716:0 '),\n+(1716,'DesolaceN11',1,405,608,28,40,2,222.502,1276.25,189.878,5.01405,'1715:0 60:0 '),\n+(1717,'DesolaceN12',1,405,603,28,40,0,-37.1114,929.567,91.722,2.17957,'1712:0 1713:0 1718:0 1720:0 1721:0 '),\n+(1718,'DesolaceN13',1,405,603,28,40,0,7.08753,779.096,91.8455,4.34648,'1717:0 1719:0 '),\n+(1719,'DesolaceN14',1,405,603,28,40,0,-67.217,604.321,91.3718,1.59562,'1718:0 1720:0 1721:0 '),\n+(1720,'DesolaceN15',1,405,603,28,40,0,-319.285,898.298,89.3548,5.81712,'1712:0 1713:0 1717:0 1719:0 1721:0 1722:0 1723:0 '),\n+(1721,'DesolaceN16',1,405,603,28,40,0,-88.9887,771.679,132.892,1.27553,'1717:0 1719:0 1720:0 '),\n+(1722,'DesolaceN17',1,405,405,28,40,0,-524.771,816.278,91.0366,0.333055,'1720:0 1723:0 1744:0 '),\n+(1723,'DesolaceN18',1,405,405,28,40,0,-518.678,1099.09,93.063,6.1992,'1711:0 1712:0 1720:0 1722:0 1744:0 1745:0 '),\n+(1724,'DesolaceN19',1,405,599,28,40,0,-433.656,1712.56,127.171,4.07939,'1710:0 1725:0 1726:0 '),\n+(1725,'DesolaceN20',1,405,599,28,40,0,-346.92,1761.61,138.371,0.287887,'1724:0 '),\n+(1726,'DesolaceN21',1,405,599,28,40,0,-409.361,1865.43,127.463,4.65667,'1724:0 '),\n+(1727,'DesolaceN22',1,405,599,28,40,0,-557.524,1836.01,96.4213,5.15932,'1710:0 1728:0 1743:0 '),\n+(1728,'DesolaceN23',1,405,405,28,40,0,-596.61,2002.61,88.4432,6.14696,'1727:0 1729:0 1730:0 1731:0 1742:0 1743:0 '),\n+(1729,'DesolaceN24',1,405,405,28,40,0,-409.395,2019.53,98.1479,3.16245,'1728:0 1730:0 1731:0 '),\n+(1730,'DesolaceN25',1,405,598,28,40,0,-362.318,2211.47,90.4702,1.2127,'1728:0 1729:0 1731:0 1732:0 1733:0 '),\n+(1731,'DesolaceN26',1,405,2405,28,40,0,-574.499,2247.88,89.8498,5.11024,'1728:0 1729:0 1730:0 1732:0 1738:0 1741:0 1742:0 1772:0 '),\n+(1732,'DesolaceN27',1,405,2405,28,40,0,-436.581,2351.38,60.8605,4.01462,'1730:0 1731:0 1734:0 1735:0 '),\n+(1733,'DesolaceN28',1,405,598,28,40,0,-45.3846,2199.95,94.7517,3.10159,'1730:0 '),\n+(1734,'DesolaceN29',1,405,598,28,40,0,-223.597,2401.87,19.3117,3.25671,'1732:0 1735:0 '),\n+(1735,'DesolaceN30',1,405,598,28,40,0,-240.439,2492.2,1.43883,3.79864,'1732:0 1734:0 1736:0 1737:0 '),\n+(1736,'DesolaceN31',1,405,2405,28,40,0,-370.369,2605.96,1.54797,5.56185,'1735:0 1739:0 '),\n+(1737,'DesolaceN32',1,405,2406,31,40,0,263.113,2974.68,2.07535,3.87325,'1735:0 '),\n+(1738,'DesolaceN33',1,405,2405,28,40,0,-601.969,2431.57,74.1931,4.86205,'1731:0 1739:0 1741:0 '),\n+(1739,'DesolaceN34',1,405,2405,28,40,0,-502.176,2576.74,18.2199,4.19054,'1736:0 1738:0 1740:0 '),\n+(1740,'DesolaceN35',1,405,598,28,40,0,-719.849,2595.3,58.3371,6.23453,'1739:0 1741:0 '),\n+(1741,'DesolaceN36',1,405,405,31,40,0,-750.951,2392.96,91.9055,1.38273,'1731:0 1738:0 1740:0 1742:0 1770:0 1772:0 '),\n+(1742,'DesolaceN37',1,405,405,28,40,0,-759.272,2036.09,91.7138,1.7715,'1728:0 1731:0 1741:0 1770:0 1771:0 '),\n+(1743,'DesolaceN38',1,405,405,28,40,0,-785.037,1666.3,90.7953,3.33248,'1711:0 1727:0 1728:0 1745:0 1769:0 1770:0 '),\n+(1744,'DesolaceN39',1,405,609,28,40,0,-796.298,1079.33,90.2949,6.11672,'1711:0 1722:0 1723:0 1745:0 1746:0 1747:0 '),\n+(1745,'DesolaceN40',1,405,405,28,40,0,-754.549,1363.26,88.5616,5.47467,'1711:0 1723:0 1743:0 1744:0 1769:0 '),\n+(1746,'DesolaceN41',1,405,609,28,40,0,-897.587,897.096,95.0181,0.982181,'1744:0 1747:0 1748:0 '),\n+(1747,'DesolaceC1',1,405,405,28,40,0,-1125.97,1230.91,93.7933,5.43931,'1744:0 1746:0 1748:0 1749:0 1769:0 '),\n+(1748,'DesolaceC2',1,405,405,28,40,0,-1391.67,958.264,89.5921,0.552166,'1746:0 1747:0 1750:0 1751:0 '),\n+(1749,'DesolaceC3',1,405,405,28,40,0,-1427.18,1225.61,103.863,0.133931,'1747:0 129:0 1750:0 '),\n+(1750,'DesolaceC4',1,405,604,28,40,0,-1577.16,1114.97,90.6547,0.632647,'129:0 1748:0 1749:0 1751:0 1760:0 1762:0 '),\n+(1751,'DesolaceC5',1,405,604,28,40,0,-1631.55,978.868,90.3134,0.0954253,'1748:0 1750:0 1752:0 1759:0 1760:0 '),\n+(1752,'DesolaceC6',1,405,604,34,40,0,-1672.96,839.546,93.6943,1.409,'1751:0 1753:0 '),\n+(1753,'DesolaceC7',1,405,604,34,40,0,-1824.57,798.663,103.148,0.209302,'1752:0 1754:0 '),\n+(1754,'DesolaceC8',1,405,2198,34,40,0,-1847.21,666.041,107.727,1.26565,'1753:0 1755:0 1756:0 '),\n+(1755,'DesolaceC9',1,405,2198,34,40,0,-1837.82,584.775,136.457,1.64775,'1754:0 '),\n+(1756,'DesolaceC10',1,405,2198,34,40,0,-2020.93,674.999,118.726,6.26783,'1754:0 1757:0 '),\n+(1757,'DesolaceC11',1,405,2198,34,40,0,-2022.56,589.179,143.38,5.31357,'1756:0 1758:0 '),\n+(1758,'DesolaceC12',1,405,2198,34,40,0,-1933.59,514.493,164.939,2.49988,'1757:0 '),\n+(1759,'DesolaceC13',1,405,604,28,40,0,-1799.06,928.096,91.3039,0.218297,'1751:0 1760:0 1762:0 '),\n+(1760,'DesolaceC14',1,405,604,28,40,0,-1889.74,1110.04,92.5553,5.97134,'1750:0 1751:0 1759:0 1761:0 1762:0 '),\n+(1761,'DesolaceC15',1,405,405,31,40,0,-1897.9,1372.61,61.1381,4.74417,'1760:0 1762:0 1764:0 1777:0 1811:0 1813:0 '),\n+(1762,'DesolaceC16',1,405,604,28,40,0,-1749.34,1214.45,91.3952,0.204553,'1750:0 1759:0 1760:0 1761:0 1763:0 '),\n+(1763,'DesolaceC17',1,405,405,28,40,0,-1569.77,1277.99,87.9315,3.56017,'1762:0 1764:0 '),\n+(1764,'DesolaceC18',1,405,405,31,40,0,-1699.9,1433.42,61.6894,0.112268,'129:0 1761:0 1763:0 '),\n+(1765,'DesolaceC19',1,405,597,28,40,4,-1335.75,1704.43,89.9029,5.8932,'128:0 '),\n+(1766,'DesolaceC20',1,405,597,28,40,4,-1199.03,1771.37,99.5835,4.08873,'128:0 1767:0 '),\n+(1767,'DesolaceC21',1,405,597,28,40,4,-1157.92,1848.6,99.595,4.17119,'1766:0 1768:0 '),\n+(1768,'DesolaceC22',1,405,597,28,40,4,-1151.69,1938.33,88.8694,1.73253,'1767:0 '),\n+(1769,'DesolaceC23',1,405,405,31,40,0,-1193.57,1475.36,61.1112,4.30472,'128:0 129:0 1743:0 1745:0 1747:0 1770:0 1777:0 '),\n+(1770,'DesolaceC24',1,405,405,31,40,0,-1051.16,1759.04,62.2132,3.91398,'129:0 1741:0 1742:0 1743:0 1769:0 1771:0 1776:0 '),\n+(1771,'DesolaceC25',1,405,405,31,40,0,-1096.46,2045.41,58.5175,4.84859,'1742:0 1770:0 1772:0 1775:0 '),\n+(1772,'DesolaceC26',1,405,405,31,40,0,-1095.17,2383.16,92.5366,5.96779,'1731:0 1741:0 1771:0 1773:0 '),\n+(1773,'DesolaceC27',1,405,405,31,40,0,-1419.73,2331.31,91.8161,0.0556962,'1772:0 1774:0 1778:0 1779:0 1798:0 '),\n+(1774,'DesolaceC28',1,405,596,31,40,0,-1340.98,2101.55,63.5443,1.99366,'1773:0 1775:0 1776:0 1778:0 '),\n+(1775,'DesolaceC29',1,405,596,31,40,0,-1225.31,2021.97,59.0277,2.34708,'1771:0 1774:0 1776:0 '),\n+(1776,'DesolaceC30',1,405,596,31,40,0,-1362.19,1917.79,50.1441,0.929436,'128:0 1770:0 1774:0 1775:0 1777:0 '),\n+(1777,'DesolaceC31',1,405,405,31,40,0,-1575.89,1726.59,58.925,5.73608,'129:0 1761:0 1769:0 1776:0 1778:0 1809:0 1810:0 '),\n+(1778,'DesolaceC32',1,405,405,31,40,0,-1561.67,1991.32,61.6415,0.949069,'129:0 1773:0 1774:0 1777:0 1809:0 '),\n+(1779,'DesolaceC33',1,405,607,33,40,0,-1371.99,2554.03,108.02,4.4441,'1773:0 1780:0 1781:0 '),\n+(1780,'DesolaceC34',1,405,607,33,40,0,-1392.44,2659.84,112.065,5.41015,'1779:0 1781:0 '),\n+(1781,'DesolaceC35',1,405,607,33,40,0,-1251.49,2685.06,111.557,3.5193,'1779:0 1780:0 1782:0 1783:0 '),\n+(1782,'DesolaceC36',1,405,607,33,40,0,-1123.21,2688.52,111.831,2.59448,'1781:0 1783:0 '),\n+(1783,'DesolaceC37',1,405,607,33,40,0,-1161.95,2795.33,122.835,2.23711,'1781:0 1782:0 1784:0 1785:0 '),\n+(1784,'DesolaceC38',1,405,607,33,40,0,-1067.79,2918.91,179.121,3.97481,'1783:0 '),\n+(1785,'DesolaceC39',1,405,607,33,40,0,-1289.84,2920.03,113.966,5.30998,'1783:0 1786:0 '),\n+(1786,'DesolaceC40',1,405,607,33,40,0,-1360.57,2783.12,113.08,5.63201,'1785:0 127:0 1787:0 '),\n+(1787,'DesolaceC41',1,405,607,33,40,0,-1422.79,2793.13,111.697,0.937294,'127:0 1786:0 1788:0 '),\n+(1788,'DesolaceC42',1,405,607,33,40,0,-1470.51,2717.61,112.426,0.907843,'1787:0 1789:0 '),\n+(1789,'DesolaceC43',1,405,607,33,40,0,-1526.76,2740.76,111.941,5.60649,'1788:0 1790:0 '),\n+(1790,'DesolaceC44',1,405,607,33,40,0,-1487.94,2839.33,111.17,4.34789,'1789:0 1791:0 '),\n+(1791,'DesolaceC45',1,405,607,33,40,0,-1571.53,2902.93,112.301,5.73411,'1790:0 1794:0 '),\n+(1792,'DesolaceC46',1,405,2408,31,40,4,-1727.84,3103.88,35.0044,5.61552,'57:0 1793:0 '),\n+(1793,'DesolaceC47',1,405,598,31,40,4,-1841.75,3013.22,11.277,0.475075,'1792:0 1794:0 1795:0 '),\n+(1794,'DesolaceC48',1,405,598,31,40,0,-1852.69,2854.14,50.9586,0.237108,'1791:0 1795:0 1793:0 1796:0 1797:0 '),\n+(1795,'DesolaceC49',1,405,598,31,40,0,-1990.78,2803.76,56.2314,0.896844,'1794:0 1793:0 1796:0 1797:0 '),\n+(1796,'DesolaceS1',1,405,606,28,40,0,-2002.35,2610.23,62.383,1.22083,'1794:0 1795:0 1797:0 1799:0 1800:0 '),\n+(1797,'DesolaceS2',1,405,405,28,40,0,-1772.22,2471.83,73.3018,5.67404,'1794:0 1795:0 1796:0 1798:0 1800:0 '),\n+(1798,'DesolaceS3',1,405,405,31,40,0,-1592.19,2396.96,91.4972,2.81715,'1773:0 1797:0 1799:0 '),\n+(1799,'DesolaceS4',1,405,405,31,40,0,-1797.31,2149.68,62.4428,1.77847,'1796:0 1798:0 1800:0 1809:0 '),\n+(1800,'DesolaceS5',1,405,606,28,40,0,-1967.47,2474.94,61.5806,1.35043,'1796:0 1797:0 1799:0 1801:0 1803:0 '),\n+(1801,'DesolaceS6',1,405,606,28,40,0,-2098.84,2409.19,61.4027,3.19808,'1800:0 1802:0 1803:0 '),\n+(1802,'DesolaceExitS',1,405,405,28,40,0,-2402.61,2363.59,108.604,0.107536,'1801:0 1913:0 '),\n+(1803,'DesolaceS7',1,405,602,33,40,0,-2145.67,2180.6,67.6286,1.21495,'1800:0 1801:0 1804:0 1806:0 '),\n+(1804,'DesolaceS8',1,405,602,33,40,0,-2190.56,1992.71,64.0673,1.30332,'1803:0 1805:0 '),\n+(1805,'DesolaceS9',1,405,602,33,40,0,-2171.01,1903.5,66.9158,1.58018,'1804:0 1807:0 '),\n+(1806,'DesolaceS10',1,405,602,33,40,0,-1981.74,2045.99,59.3955,2.2831,'1803:0 1808:0 1809:0 '),\n+(1807,'DesolaceS11',1,405,602,33,40,0,-2096.65,1787.92,57.1531,1.95912,'1805:0 1808:0 1811:0 '),\n+(1808,'DesolaceS12',1,405,602,33,40,0,-1982.92,1838.14,63.409,3.36694,'1806:0 1807:0 1810:0 '),\n+(1809,'DesolaceS13',1,405,602,33,40,0,-1815.92,1988.94,59.0664,1.39951,'1777:0 1778:0 1799:0 1806:0 '),\n+(1810,'DesolaceS14',1,405,602,33,40,0,-1765.64,1678.32,60.7555,0.438962,'1777:0 1808:0 1811:0 '),\n+(1811,'DesolaceS15',1,405,405,31,40,0,-2062.67,1679.65,60.5781,5.56172,'1761:0 1807:0 1810:0 1812:0 '),\n+(1812,'DesolaceS16',1,405,2657,33,40,0,-2225.06,1577.55,60.1882,0.421288,'130:0 1811:0 '),\n+(1813,'DesolaceS17',1,405,2657,33,40,0,-2153.93,1293.66,63.9415,0.29169,'130:0 1761:0 '),\n+(1814,'MulgoreExitE',1,215,215,1,10,4,-2345.37,-1484.97,40.0713,4.66713,'174:0 1815:0 '),\n+(1815,'Mulgore1',1,215,215,1,10,4,-2440.53,-1200.03,-9.30534,1.55892,'1814:0 1816:0 1865:0 1869:0 '),\n+(1816,'Mulgore2',1,215,215,1,10,4,-2371.49,-904.809,-9.42438,4.38439,'1815:0 1817:0 1865:0 1866:0 1869:0 '),\n+(1817,'Mulgore3',1,215,215,1,10,4,-2311.97,-607.857,-9.42454,4.65338,'1816:0 26:0 1818:0 1819:0 1869:0 '),\n+(1818,'Mulgore4',1,215,223,1,10,4,-2105.91,-429.602,-6.83183,3.82086,'26:0 1817:0 1846:0 '),\n+(1819,'Mulgore5',1,215,215,1,10,4,-2475.36,-501.699,-9.42479,5.94732,'26:0 1817:0 1820:0 1869:0 '),\n+(1820,'Mulgore6',1,215,215,1,10,4,-2628.95,-190.942,-9.21765,5.24046,'1819:0 1821:0 1843:0 1844:0 1869:0 '),\n+(1821,'Mulgore7',1,215,215,1,10,4,-2844.69,184.459,62.1599,5.51927,'1820:0 1822:0 1843:0 1844:0 '),\n+(1822,'Mulgore8',1,215,215,1,10,4,-2993.74,194.655,71.8138,0.231569,'1821:0 1823:0 '),\n+(1823,'Mulgore9',1,215,220,1,10,4,-3072.38,82.3203,78.0188,1.03857,'1822:0 1824:0 '),\n+(1824,'Mulgore10',1,215,220,1,10,4,-3137.17,-93.9051,45.0213,1.34488,'1823:0 1825:0 1842:0 '),\n+(1825,'Mulgore11',1,215,220,1,10,4,-3063.95,-239.512,50.6424,1.85735,'1824:0 27:0 1842:0 '),\n+(1826,'Mulgore12',1,215,220,1,10,4,-2891.86,-697.729,45.2768,1.58442,'27:0 1827:0 1842:0 '),\n+(1827,'Mulgore13',1,215,220,1,10,4,-3261.33,-846.251,48.8421,0.235503,'1826:0 1828:0 1830:0 1841:0 1842:0 '),\n+(1828,'Mulgore14',1,215,220,1,10,4,-3366.64,-1016.68,109.367,6.12009,'1827:0 1829:0 '),\n+(1829,'Mulgore15',1,215,358,1,10,4,-3224,-1083.1,88.5366,2.85872,'1828:0 1830:0 '),\n+(1830,'Mulgore16',1,215,358,1,10,4,-3119.41,-1033.45,49.7491,3.46937,'1827:0 1829:0 1831:0 1832:0 '),\n+(1831,'Mulgore17',1,215,358,1,10,4,-3063.5,-1162.46,66.0398,0.149071,'1830:0 1832:0 1833:0 '),\n+(1832,'Mulgore18',1,215,358,1,10,4,-2991.05,-1001.3,57.8123,3.50664,'1830:0 1831:0 '),\n+(1833,'Mulgore19',1,215,358,1,10,4,-2989.95,-1155.46,58.1984,3.50469,'1831:0 1834:0 1837:0 '),\n+(1834,'Mulgore20',1,215,358,1,10,4,-2907.83,-1077.93,55.9333,3.94844,'1833:0 1835:0 1837:0 '),\n+(1835,'Mulgore21',1,215,358,1,10,4,-2844.44,-1016.64,56.9403,4.16051,'1834:0 1836:0 '),\n+(1836,'Mulgore22',1,215,358,1,10,4,-2854.01,-1100.12,90.8135,0.692983,'1835:0 '),\n+(1837,'Mulgore23',1,215,358,1,10,4,-2883.85,-1231.28,72.9943,1.82985,'1833:0 1834:0 1838:0 1840:0 '),\n+(1838,'Mulgore24',1,215,358,1,10,4,-3026.45,-1229.87,71.6597,6.01404,'1837:0 1839:0 '),\n+(1839,'Mulgore25',1,215,358,1,10,4,-2970.92,-1323.02,80.5074,1.92996,'1838:0 1840:0 '),\n+(1840,'Mulgore26',1,215,358,1,10,4,-2895.78,-1325.44,95.4793,2.24804,'1837:0 1839:0 '),\n+(1841,'Mulgore27',1,215,220,1,10,4,-3440.17,-866.836,69.6282,6.24768,'1827:0 1842:0 '),\n+(1842,'Mulgore28',1,215,220,1,10,4,-3367.33,-495.02,69.8435,4.71616,'1824:0 1825:0 1826:0 1827:0 1841:0 '),\n+(1843,'Mulgore29',1,215,818,1,10,4,-2404.86,217.609,48.1932,3.41043,'1820:0 1821:0 1844:0 1845:0 1847:0 1870:0 '),\n+(1844,'Mulgore30',1,215,215,1,10,4,-2261.05,-69.3042,-1.37537,2.79193,'1820:0 1821:0 1843:0 1845:0 1846:0 1847:0 '),\n+(1845,'Mulgore31',1,215,215,1,10,4,-1909.74,216.749,46.1874,3.10216,'1843:0 1844:0 1847:0 1848:0 1849:0 1871:0 '),\n+(1846,'Mulgore32',1,215,223,1,10,4,-2045.76,-343.178,-6.87874,4.09177,'1818:0 1844:0 1847:0 1862:0 1863:0 '),\n+(1847,'Mulgore33',1,215,215,1,10,4,-1920.69,-119.003,-11.7465,4.00341,'1843:0 1844:0 1845:0 1846:0 1848:0 1862:0 '),\n+(1848,'Mulgore34',1,215,215,1,10,4,-1668.96,-1.5923,-11.6961,3.52429,'1845:0 1847:0 1849:0 1850:0 1862:0 '),\n+(1849,'Mulgore35',1,215,215,1,10,5,-1427.28,82.3261,15.7467,3.85023,'1845:0 1848:0 1850:0 '),\n+(1850,'Mulgore36',1,215,215,1,10,4,-1347.57,320.413,8.78348,0.441607,'1848:0 1849:0 1851:0 1852:0 '),\n+(1851,'Mulgore37',1,1638,1638,1,10,4,-1148.06,245.946,40.6026,3.4811,'1850:0 1852:0 1853:0 1854:0 '),\n+(1852,'Mulgore38',1,215,215,1,10,4,-996.688,514.659,49.632,4.10942,'1850:0 1851:0 '),\n+(1853,'Mulgore39',1,215,215,1,10,4,-751.74,38.1612,-20.8616,2.04343,'1851:0 1854:0 1856:0 1855:0 '),\n+(1854,'Mulgore40',1,215,215,1,10,4,-927.854,10.2372,12.3669,2.39686,'1851:0 1853:0 1856:0 1855:0 '),\n+(1855,'Mulgore41',1,215,819,1,10,4,-561.426,-405.799,30.6454,1.96489,'1853:0 1854:0 1856:0 1857:0 '),\n+(1856,'Mulgore42',1,215,215,1,10,4,-901.7,-443.722,-39.0694,1.58907,'1853:0 1854:0 1855:0 1857:0 1861:0 '),\n+(1857,'Mulgore43',1,215,820,1,10,4,-924.517,-801.42,-5.66428,4.78761,'1855:0 1856:0 1858:0 1860:0 1861:0 '),\n+(1858,'Mulgore44',1,215,225,1,10,4,-956.811,-1082.75,42.1933,1.43395,'1857:0 1859:0 '),\n+(1859,'Mulgore45',1,215,225,1,10,4,-1099.12,-1152.59,50.0739,0.809557,'1858:0 1860:0 '),\n+(1860,'Mulgore46',1,215,820,1,10,4,-1365.16,-841.737,-8.11366,5.8636,'1857:0 1859:0 1861:0 1862:0 1863:0 '),\n+(1861,'Mulgore47',1,215,820,1,10,4,-1254.38,-429.801,-44.919,0.114484,'1856:0 1857:0 1860:0 1862:0 '),\n+(1862,'Mulgore48',1,215,820,1,10,4,-1600.99,-429.634,-38.9597,5.5357,'1846:0 1847:0 1848:0 1860:0 1861:0 1863:0 1864:0 '),\n+(1863,'Mulgore49',1,215,820,1,10,4,-1742.71,-749.243,-8.79196,6.02461,'1846:0 1860:0 1862:0 1864:0 1865:0 1866:0 '),\n+(1864,'Mulgore50',1,215,224,1,10,4,-1925.81,-713.913,3.65139,0.842938,'1862:0 1863:0 1865:0 1866:0 '),\n+(1865,'Mulgore51',1,215,215,1,10,4,-2111.14,-877.576,-5.68659,6.00889,'1815:0 1816:0 1863:0 1864:0 1866:0 '),\n+(1866,'Mulgore52',1,215,360,1,10,4,-1975.78,-1068.43,47.7644,0.687805,'1816:0 1863:0 1864:0 1865:0 1867:0 '),\n+(1867,'Mulgore53',1,215,360,1,10,4,-1884.66,-1112.51,92.8851,6.08152,'1866:0 1868:0 '),\n+(1868,'Mulgore54',1,215,360,1,10,4,-1584.13,-1092.53,103.917,3.87848,'1867:0 93:0 '),\n+(1869,'Mulgore55',1,215,215,1,10,4,-2751.82,-857.915,4.54324,5.9912,'1815:0 1816:0 1817:0 1819:0 1820:0 '),\n+(1870,'Mulgore56',1,215,818,1,10,4,-2369.44,444.618,66.6944,2.44118,'1843:0 '),\n+(1871,'Mulgore57',1,215,404,1,10,4,-1938.35,454.865,133.59,5.01926,'1845:0 '),\n+(1872,'DWMExitW',1,15,15,33,45,0,-3684.38,-2471.41,78.489,4.65716,'1596:0 99:0 '),\n+(1873,'DustwallowC1',1,15,15,33,45,0,-3476.61,-2710.46,33.3673,2.4724,'99:0 187:0 1903:0 1904:0 103:0 '),\n+(1874,'BlackhoofVillage',1,15,512,33,45,0,-2455.85,-3159.6,35.8624,3.43489,'102:0 1875:0 '),\n+(1875,'DustwallowN1',1,15,15,33,45,0,-2686.37,-3372.62,34.5997,0.845044,'101:0 102:0 1874:0 1876:0 1877:0 1902:0 '),\n+(1876,'DustwallowN2',1,15,15,33,45,0,-2562.07,-3486.87,34.2695,2.37303,'1875:0 1877:0 '),\n+(1877,'DustwallowN3',1,15,15,33,45,0,-2671.59,-3675.6,30.8794,2.00782,'101:0 110:0 1875:0 1876:0 1878:0 1879:0 1894:0 '),\n+(1878,'DustwallowN4',1,15,502,33,45,0,-2914.27,-3675.73,33.4338,1.38735,'101:0 110:0 1877:0 1879:0 1880:0 '),\n+(1879,'DustwallowN5',1,15,502,33,45,0,-2802.66,-3997.22,36.7838,2.19983,'110:0 1877:0 1878:0 1880:0 1892:0 '),\n+(1880,'DustwallowN6',1,15,502,33,45,0,-3155.95,-3974.68,29.251,1.17881,'110:0 1878:0 1879:0 1881:0 1887:0 '),\n+(1881,'DustwallowN7',1,15,15,33,45,0,-3305.97,-4095.97,23.4925,0.654559,'109:0 1880:0 '),\n+(1882,'DustwallowN8',1,15,15,33,45,0,-3491.34,-4245.46,7.816,1.17292,'109:0 54:0 1884:0 1912:0 '),\n+(1883,'TheramoreInn',1,15,513,33,45,3,-3627.66,-4472.85,17.4714,0.218669,'54:0 '),\n+(1884,'DustwallowCoastN1',1,15,518,33,45,0,-3458.13,-4377.69,0.755389,2.14564,'1882:0 1885:0 '),\n+(1885,'DustwallowCoastN2',1,15,518,33,45,0,-3329.33,-4289.33,1.48119,3.70268,'1884:0 1886:0 '),\n+(1886,'DustwallowCoastN3',1,15,518,33,45,0,-3142.27,-4215.25,0.891156,0.280307,'1885:0 1887:0 1897:0 '),\n+(1887,'DustwallowCoastN4',1,15,518,33,45,0,-2985.17,-4207.51,1.60007,3.33747,'1880:0 1886:0 1888:0 1897:0 '),\n+(1888,'DustwallowCoastN5',1,15,518,33,45,0,-2802.02,-4220.5,1.16157,3.12737,'1889:0 1887:0 1897:0 1898:0 '),\n+(1889,'DustwallowCoastN6',1,15,518,33,45,0,-2682.96,-4150.2,0.491195,3.24911,'1888:0 1890:0 1898:0 '),\n+(1890,'DustwallowCoastN7',1,15,518,33,45,0,-2644.79,-4076.96,0.24736,4.12678,'1889:0 1891:0 1892:0 1893:0 '),\n+(1891,'DustwallowCoastN8',1,15,518,33,45,0,-2634.51,-3970.05,1.40599,4.46647,'1890:0 1892:0 1893:0 1894:0 '),\n+(1892,'DustwallowCoastN9',1,15,518,33,45,0,-2678.39,-4014.18,4.97984,2.78377,'1879:0 1890:0 1891:0 '),\n+(1893,'DustwallowCoastN10',1,15,518,33,45,0,-2559.21,-4015.96,9.99785,3.70856,'1890:0 1891:0 1899:0 '),\n+(1894,'DustwallowCoastN11',1,15,518,33,45,0,-2607.14,-3826.64,6.27917,4.49985,'1877:0 1891:0 1895:0 '),\n+(1895,'DustwallowCoastN12',1,15,518,33,45,0,-2466.63,-3818.63,2.61691,3.22358,'1896:0 1894:0 1899:0 1900:0 '),\n+(1896,'DustwallowCoastN13',1,17,385,33,45,0,-2395.84,-3763.83,5.73158,5.36182,'1574:0 1895:0 '),\n+(1897,'DustwallowCoastN14',1,15,518,33,45,0,-3001.64,-4378.46,9.05538,1.1933,'1886:0 1887:0 1888:0 '),\n+(1898,'DustwallowCoastN15',1,15,518,33,45,0,-2662.99,-4255.03,3.90542,2.70126,'1888:0 1889:0 1901:0 '),\n+(1899,'DustwallowCoastN16',1,15,518,33,45,0,-2408.96,-4080.5,3.33986,2.28499,'1893:0 1895:0 1900:0 1901:0 '),\n+(1900,'DustwallowCoastN17',1,15,518,33,45,0,-2302.1,-4086.25,16.0641,1.37353,'1573:0 1574:0 1895:0 1899:0 1901:0 '),\n+(1901,'DustwallowCoastN18',1,15,518,33,45,0,-2291.73,-4303.19,4.72444,2.85793,'1898:0 1899:0 1900:0 '),\n+(1902,'DustwallowN9',1,15,15,33,45,0,-2942.4,-3252.27,31.3912,5.0692,'100:0 101:0 102:0 1875:0 1903:0 '),\n+(1903,'DustwallowC2',1,15,15,33,45,0,-3285.02,-3185.79,32.3767,5.19094,'1873:0 1902:0 1904:0 1905:0 '),\n+(1904,'DustwallowC3',1,15,2302,33,45,0,-3645.37,-3105.83,35.4956,0.749902,'99:0 1873:0 1903:0 1905:0 1907:0 103:0 '),\n+(1905,'DustwallowC4',1,15,4046,33,45,0,-3692.77,-3428.45,36.5831,1.67942,'1903:0 1904:0 1906:0 1907:0 '),\n+(1906,'DustwallowC5',1,15,501,33,45,0,-4023.01,-3761.02,42.2472,0.725162,'1905:0 1907:0 105:0 '),\n+(1907,'DustwallowC6',1,15,4049,33,45,0,-4017.64,-3385.66,38.3117,5.35312,'1904:0 1905:0 1906:0 103:0 105:0 '),\n+(1908,'DustwallowC7',1,15,510,33,45,0,-4230.28,-2794.11,27.7681,6.16323,'103:0 108:0 1909:0 '),\n+(1909,'DustwallowS1',1,15,509,33,45,0,-4392.92,-2968.72,72.0173,1.4685,'103:0 108:0 1908:0 233:0 105:0 '),\n+(1910,'DustwallowS2',1,15,511,33,45,0,-4652.75,-3983.64,63.5063,1.62756,'106:0 107:0 '),\n+(1911,'DustwallowS3',1,15,511,33,45,0,-4869.31,-3443.39,39.4441,0.620287,'106:0 107:0 233:0 '),\n+(1912,'DustwallowCoastS1',1,15,516,33,45,0,-3990.53,-4144.75,15.8765,3.0059,'104:0 1882:0 '),\n+(1913,'FeralasN1',1,357,1114,38,50,0,-2571.82,2244.63,96.3995,0.543668,'1802:0 1914:0 '),\n+(1914,'FeralasN2',1,357,1114,38,50,0,-2742,2335.99,62.5691,5.81565,'1913:0 1915:0 1920:0 1921:0 '),\n+(1915,'FeralasN3',1,357,1114,38,50,0,-2829.93,2719.49,74.7843,5.10291,'1914:0 1916:0 1920:0 '),\n+(1916,'FeralasN4',1,357,1114,38,50,0,-3032.68,2638.14,54.8507,0.249148,'1915:0 1917:0 1920:0 '),\n+(1917,'FeralasN5',1,357,1119,38,50,0,-3246.59,2815.94,85.1355,5.88045,'1916:0 1918:0 '),\n+(1918,'FeralasN6',1,357,1119,38,50,0,-3570.32,2569.75,80.1298,0.734128,'1917:0 1919:0 1923:0 '),\n+(1919,'FeralasN7',1,357,1119,38,50,0,-3349.08,2217.29,32.4203,2.18908,'1918:0 1920:0 1922:0 '),\n+(1920,'FeralasN8',1,357,1119,38,50,0,-2939.01,2249.46,45.7452,1.87688,'1914:0 1915:0 1916:0 1919:0 1921:0 '),\n+(1921,'FeralasN9',1,357,1111,50,60,0,-2867.51,1894.77,52.6495,3.09033,'1914:0 1920:0 '),\n+(1922,'FeralasN10',1,357,1119,38,50,0,-3464.98,2077.93,40.3195,0.882963,'1919:0 1923:0 1925:0 1926:0 '),\n+(1923,'FeralasN11',1,357,1119,38,50,0,-3508.95,2343.43,61.5171,1.82151,'1918:0 1922:0 1924:0 '),\n+(1924,'FeralasN12',1,357,1119,38,50,0,-3582.9,2225.74,39.1949,3.55134,'1923:0 1925:0 '),\n+(1925,'FeralasN13',1,357,1119,38,50,0,-3677.85,2192.02,79.5813,5.92325,'1922:0 1924:0 1929:0 '),\n+(1926,'FeralasN14',1,357,1119,38,50,0,-3902.37,1958.83,79.7325,5.2537,'1922:0 1927:0 1931:0 '),\n+(1927,'FeralasN15',1,357,1115,38,50,0,-3845.14,1829.16,124.075,1.98644,'1926:0 131:0 '),\n+(1928,'FeralasN16',1,357,1115,38,50,0,-3896.35,1647.85,117.592,4.8178,'131:0 '),\n+(1929,'FeralasN17',1,357,1119,38,50,0,-3899.54,2080.79,120.315,0.496151,'1925:0 1930:0 '),\n+(1930,'FeralasN18',1,357,1119,38,50,0,-4106.11,2126.23,91.7704,5.83686,'1929:0 1931:0 1932:0 '),\n+(1931,'FeralasN19',1,357,1119,38,50,0,-4171.24,2101.97,88.0788,0.490217,'1926:0 1930:0 1943:0 '),\n+(1932,'FeralasCoast1',1,357,1108,38,50,0,-4118.28,2330.97,2.19033,5.05932,'1930:0 1933:0 1935:0 '),\n+(1933,'FeralasCoast2',1,357,1108,38,50,0,-4052.79,2718.62,0.6784,4.75105,'1932:0 1934:0 1939:0 '),\n+(1934,'FeralasCoast3',1,357,1108,38,50,0,-3843.41,3064.54,7.61114,4.17574,'1933:0 '),\n+(1935,'FeralasCoast4',1,357,1108,38,50,0,-4379.47,2356.68,-0.331094,5.57371,'1932:0 1936:0 1937:0 1939:0 1944:0 '),\n+(1936,'FeralasCoast5',1,357,1108,38,50,0,-4743.36,2004.49,5.62754,0.704225,'1935:0 1937:0 1950:0 '),\n+(1937,'FeralasCoast6',1,357,1108,38,50,0,-4901.88,2189.77,1.21295,5.78972,'1935:0 1936:0 1938:0 '),\n+(1938,'FeralasCoast7',1,357,1108,38,50,0,-5436.32,2245.93,4.15669,6.02534,'1937:0 '),\n+(1939,'FeathermoonCoast',1,357,1116,38,50,2,-4396.44,3096.49,-0.543116,1.686,'58:0 1933:0 1935:0 '),\n+(1940,'SardorIsle1',1,357,1117,38,50,2,-4874.91,3238.84,9.84719,0.996823,'58:0 132:0 1941:0 '),\n+(1941,'SardorIsle2',1,357,1120,38,50,2,-4509.12,3541.55,19.5222,3.63969,'58:0 132:0 1940:0 '),\n+(1942,'ShalzarusLairInside',1,357,3117,38,50,0,-5628.12,3481.23,0.291859,1.03412,'140:0 '),\n+(1943,'FeralasC1',1,357,1108,38,50,0,-4354.27,2114.61,65.9115,3.94793,'1931:0 1944:0 '),\n+(1944,'FeralasC2',1,357,1108,38,50,0,-4459.61,2051.49,45.6382,0.749398,'1935:0 1943:0 1945:0 '),\n+(1945,'FeralasC3',1,357,1108,38,50,0,-4587.74,2020.12,49.7424,0.107333,'1944:0 1946:0 '),\n+(1946,'FeralasC4',1,357,1108,38,50,0,-4669.12,1941.38,71.209,4.65283,'1945:0 1947:0 '),\n+(1947,'FeralasC5',1,357,1136,38,50,0,-4689.38,1793.15,92.5165,3.59252,'1946:0 1948:0 1951:0 '),\n+(1948,'FeralasC6',1,357,1136,38,50,0,-4548.77,1825.47,91.6009,4.86489,'1947:0 1949:0 '),\n+(1949,'FeralasC7',1,357,2577,38,50,0,-4570.42,1333.99,110.276,1.57406,'1948:0 1952:0 1966:0 '),\n+(1950,'FeralasC8',1,357,1136,38,50,0,-4774.62,1706.39,79.0617,1.25399,'1936:0 1951:0 '),\n+(1951,'FeralasC9',1,357,1136,38,50,0,-4747.41,1601.96,83.6922,1.48372,'1947:0 1950:0 1952:0 1953:0 '),\n+(1952,'FeralasC10',1,357,1136,38,50,0,-4850.91,1315.71,81.0286,0.264391,'1949:0 1951:0 1966:0 '),\n+(1953,'FeralasC11',1,357,1105,38,50,0,-4984.77,1575.59,59.7078,0.164254,'1951:0 1954:0 1956:0 1964:0 '),\n+(1954,'FeralasC12',1,357,1105,38,50,0,-4932.88,1723.53,64.1127,4.66263,'1953:0 1955:0 '),\n+(1955,'FeralasC13',1,357,1105,38,50,0,-5149.79,1759.34,78.4796,0.706951,'1954:0 '),\n+(1956,'FeralasC14',1,357,1136,38,50,0,-5121.12,1597.3,62.6844,6.11245,'1953:0 1957:0 1964:0 '),\n+(1957,'FeralasC15',1,357,1136,38,50,0,-5312.41,1586.43,50.2301,2.5919,'1956:0 1958:0 1961:0 1964:0 '),\n+(1958,'FeralasC16',1,357,1106,38,50,0,-5747.35,1698.84,93.4873,6.16546,'1957:0 1959:0 '),\n+(1959,'FeralasC17',1,357,2522,38,50,0,-5765.25,1224.11,66.4458,1.50412,'1958:0 1960:0 '),\n+(1960,'FeralasC18',1,357,2522,38,50,0,-5550.63,1116.69,56.7549,0.496841,'1959:0 1961:0 '),\n+(1961,'FeralasC19',1,357,2522,38,50,0,-5461.46,1368.9,22.0332,4.46507,'1957:0 1960:0 1962:0 1964:0 '),\n+(1962,'FeralasC20',1,357,2522,38,50,0,-5595.89,1373.16,54.1263,3.31838,'1961:0 1963:0 '),\n+(1963,'FeralasC21',1,357,2522,38,50,0,-5687.79,1413.51,73.2559,3.3773,'1962:0 '),\n+(1964,'FeralasC22',1,357,2522,38,50,0,-5109.82,1250.83,51.7218,2.34252,'1953:0 1956:0 1957:0 1961:0 1965:0 '),\n+(1965,'FeralasC23',1,357,2522,38,50,0,-4947.18,1144.74,76.4718,2.43362,'1964:0 1966:0 '),\n+(1966,'FeralasC24',1,357,1136,38,50,0,-4819.41,1182.67,88.2722,1.88973,'1949:0 1952:0 1965:0 1967:0 '),\n+(1967,'FeralasC25',1,357,2521,38,50,0,-4850.75,1054.39,94.6178,1.13575,'1966:0 1968:0 '),\n+(1968,'FeralasC26',1,357,357,38,50,0,-4701.43,1002.11,106.384,2.81258,'1967:0 1969:0 1972:0 '),\n+(1969,'FeralasC27',1,357,357,38,50,0,-4686.71,913.041,90.3337,1.80138,'1968:0 1970:0 '),\n+(1970,'FeralasC28',1,357,357,38,50,0,-4641.48,856.356,83.6012,2.41398,'1969:0 1971:0 '),\n+(1971,'FeralasC29',1,357,357,38,50,0,-4679.42,716.437,75.2356,1.09647,'1970:0 1974:0 1981:0 '),\n+(1972,'FeralasC30',1,357,357,38,50,0,-4555.72,884.281,58.0988,3.21115,'1968:0 1973:0 '),\n+(1973,'FeralasC31',1,357,357,38,50,0,-4505.93,684.371,66.7637,1.78171,'1972:0 1974:0 1975:0 1976:0 '),\n+(1974,'FeralasE1',1,357,357,38,50,0,-4659.39,623.64,52.4147,4.96061,'1971:0 1973:0 1975:0 1978:0 2006:0 '),\n+(1975,'FeralasE2',1,357,357,38,50,0,-4635.27,542.675,37.1032,1.8524,'1973:0 1974:0 1976:0 1981:0 1993:0 1994:0 1995:0 '),\n+(1976,'FeralasE3',1,357,357,38,50,0,-4390.02,604.52,62.0106,2.9598,'1973:0 1975:0 1977:0 1995:0 2006:0 '),\n+(1977,'FeralasE4',1,357,1100,38,50,0,-4212.24,655.545,69.8097,3.6706,'1976:0 2005:0 2006:0 '),\n+(1978,'FeralasE5',1,357,2519,38,50,0,-4898.74,674.126,43.55,1.02185,'1974:0 1979:0 1981:0 1982:0 '),\n+(1979,'FeralasE6',1,357,2519,38,50,0,-4953.5,761.759,82.878,5.39652,'1978:0 1980:0 '),\n+(1980,'FeralasE7',1,357,2520,38,50,0,-4845.02,785.634,113.891,1.35172,'1979:0 178:0 '),\n+(1981,'FeralasE8',1,357,2519,38,50,0,-4880.52,558.22,12.8999,1.88775,'1971:0 1975:0 1978:0 1993:0 1994:0 '),\n+(1982,'FeralasE9',1,357,2519,38,50,0,-5149.35,692.713,54.9213,6.26831,'1978:0 1983:0 1994:0 '),\n+(1983,'FeralasE10',1,357,1101,38,50,0,-5319.6,478.232,53.9695,0.898155,'1982:0 1984:0 1994:0 '),\n+(1984,'FeralasE11',1,357,1101,38,50,0,-5163.07,220.677,54.4074,1.30064,'1983:0 1985:0 1986:0 1987:0 1988:0 1991:0 '),\n+(1985,'FeralasE12',1,357,1101,38,50,0,-5302,428.292,8.41442,3.73933,'1984:0 '),\n+(1986,'FeralasE13',1,357,1101,38,50,0,-5384.3,261.887,20.4496,0.905996,'1984:0 '),\n+(1987,'FeralasE14',1,357,1101,38,50,0,-5265.18,-4.42852,15.1479,1.56377,'1984:0 '),\n+(1988,'FeralasE15',1,357,1101,38,50,0,-5343.63,67.4607,28.7204,3.66077,'1984:0 1989:0 1990:0 '),\n+(1989,'FeralasE16',1,357,1101,38,50,0,-5450.99,119.201,27.5633,6.28204,'1988:0 '),\n+(1990,'FeralasE17',1,357,1101,38,50,0,-5340.47,-23.1596,18.5077,1.41062,'1988:0 '),\n+(1991,'FeralasE18',1,357,2519,38,50,0,-4991.17,205.185,56.0523,2.62992,'1984:0 136:0 1992:0 1994:0 '),\n+(1992,'FeralasE19',1,357,1137,38,50,0,-4866.29,339.413,26.1994,4.53453,'136:0 1991:0 1993:0 1994:0 1999:0 '),\n+(1993,'FeralasE20',1,357,357,38,50,0,-4722.79,464.496,31.986,3.94744,'1975:0 1981:0 1992:0 '),\n+(1994,'FeralasE21',1,357,2519,38,50,0,-5009.99,424.997,15.1355,0.648747,'1975:0 1981:0 1982:0 1983:0 1991:0 1992:0 '),\n+(1995,'FeralasE22',1,357,357,38,50,4,-4578.16,370.868,33.8808,1.77815,'1975:0 1976:0 53:0 2006:0 '),\n+(1996,'FeralasE23',1,357,1099,38,50,5,-4481.74,227.782,48.3927,0.264285,'53:0 '),\n+(1997,'FeralasE24',1,357,1099,38,50,4,-4376.3,121.922,32.6793,1.76165,'53:0 1998:0 '),\n+(1998,'FeralasE25',1,357,1137,38,50,4,-4328.21,-19.6833,60.5124,1.72631,'1997:0 2003:0 '),\n+(1999,'FeralasE26',1,357,357,38,50,0,-4659.2,184.738,43.8095,4.93936,'1992:0 2000:0 '),\n+(2000,'FeralasE27',1,357,357,38,50,0,-4603.74,66.3705,89.2353,5.28101,'1999:0 2001:0 '),\n+(2001,'FeralasE28',1,357,357,38,50,0,-4564.62,-31.7688,90.9571,1.80758,'2000:0 2002:0 '),\n+(2002,'FeralasE29',1,357,357,38,50,0,-4446.96,-44.7766,57.3336,5.9427,'2001:0 2003:0 2009:0 '),\n+(2003,'FeralasE30',1,357,1137,38,50,0,-4300.16,-85.5649,62.2238,2.29256,'1998:0 2002:0 2004:0 2007:0 2008:0 '),\n+(2004,'FeralasE31',1,357,2518,38,50,0,-4205.65,113.809,55.5058,4.08129,'2003:0 2006:0 137:0 '),\n+(2005,'FeralasE32',1,357,1100,38,50,0,-4133.72,537.891,69.2153,3.29981,'1977:0 2006:0 '),\n+(2006,'FeralasE33',1,357,357,38,50,0,-4279.19,459.305,53.0559,3.87904,'1974:0 1976:0 1977:0 1995:0 2004:0 2005:0 137:0 '),\n+(2007,'FeralasE34',1,357,1137,38,50,0,-4106.63,-81.3584,57.9545,3.10739,'2003:0 137:0 2008:0 '),\n+(2008,'FeralasE35',1,357,1137,38,50,0,-4234.2,-193.867,59.9266,1.9823,'2003:0 2007:0 2010:0 2017:0 '),\n+(2009,'FeralasE36',1,357,1137,38,50,0,-4457.62,-347.118,42.7385,1.56603,'2002:0 2010:0 2013:0 '),\n+(2010,'FeralasE37',1,357,1137,38,50,0,-4279.38,-302.439,53.8359,3.38225,'2008:0 2009:0 2011:0 '),\n+(2011,'FeralasE38',1,357,1137,38,50,0,-4304.01,-380.254,42.9873,1.37949,'2010:0 2012:0 '),\n+(2012,'FeralasE39',1,357,1137,38,50,0,-4323.94,-518.378,18.8016,1.66222,'2011:0 2013:0 2015:0 '),\n+(2013,'FeralasE40',1,357,1137,38,50,0,-4484.94,-528.383,12.6689,1.34413,'2009:0 2012:0 2014:0 '),\n+(2014,'FeralasE41',1,357,1137,38,50,0,-4483.85,-680.591,-13.4172,2.0451,'2013:0 40:0 2019:0 '),\n+(2015,'FeralasE42',1,357,1137,38,50,0,-4357.69,-582.597,3.62467,1.18115,'2012:0 2016:0 '),\n+(2016,'FeralasE43',1,357,1137,38,50,0,-4283.62,-657.145,-16.5908,4.73115,'2015:0 2019:0 '),\n+(2017,'FeralasE44',1,357,1137,38,50,0,-4097.49,-507.444,10.4313,4.54463,'2008:0 2018:0 '),\n+(2018,'FeralasE45',1,357,1137,38,50,0,-4189.57,-767.003,-39.6189,2.74803,'2017:0 2019:0 2023:0 '),\n+(2019,'FeralasE46',1,357,1137,38,50,0,-4273.71,-763.178,-44.585,1.5287,'40:0 2014:0 2016:0 2018:0 2020:0 '),\n+(2020,'ThousandNeedlesW1',1,400,400,23,35,0,-4400.82,-883.395,-57.6691,2.28464,'40:0 2019:0 2022:0 2024:0 '),\n+(2021,'ThousandNeedlesW2',1,400,400,23,35,0,-4635.23,-913.058,-56.816,0.876811,'40:0 2022:0 2030:0 '),\n+(2022,'ThousandNeedlesW3',1,400,400,23,35,0,-4526.31,-1003.24,-57.3019,0.841468,'2020:0 2021:0 2024:0 2025:0 '),\n+(2023,'ThousandNeedlesW4',1,400,400,23,35,0,-4265.7,-975.548,-52.6163,1.36572,'2018:0 2024:0 '),\n+(2024,'ThousandNeedlesW5',1,400,400,23,35,0,-4345.17,-1001.19,-55.4334,0.859138,'2020:0 2022:0 2023:0 2026:0 '),\n+(2025,'ThousandNeedlesW6',1,400,400,23,35,0,-4577.79,-1063.18,-51.9676,0.682426,'2022:0 2026:0 2027:0 '),\n+(2026,'ThousandNeedlesW7',1,400,480,23,35,0,-4478.86,-1145.77,-53.883,1.10654,'2024:0 2025:0 2028:0 '),\n+(2027,'ThousandNeedlesW8',1,400,400,23,35,0,-4653.89,-1114.06,-54.8856,5.97601,'2025:0 2028:0 2029:0 '),\n+(2028,'ThousandNeedlesW9',1,400,480,23,35,0,-4608.02,-1288.85,-51.0977,0.870926,'2026:0 2027:0 2033:0 2037:0 '),\n+(2029,'ThousandNeedlesW10',1,400,400,23,35,0,-4726.44,-1099.89,-54.2582,6.07616,'2027:0 2030:0 2033:0 '),\n+(2030,'ThousandNeedlesW11',1,400,400,23,35,0,-4790.74,-1025.56,-58.7304,0.476274,'2021:0 2029:0 2031:0 2058:0 '),\n+(2031,'ThousandNeedlesW12',1,400,400,23,35,0,-4923.35,-1082.53,-50.209,0.562663,'2030:0 2032:0 2035:0 '),\n+(2032,'ThousandNeedlesW13',1,400,400,23,35,0,-4838.39,-1191.4,-49.6151,2.08829,'2031:0 2033:0 2034:0 '),\n+(2033,'ThousandNeedlesW14',1,400,400,23,35,0,-4768.1,-1216.56,-52.8083,3.08574,'2028:0 2029:0 2032:0 2036:0 '),\n+(2034,'ThousandNeedlesW15',1,400,400,23,35,0,-4942.46,-1263.31,-48.5414,1.36768,'2032:0 2035:0 50:0 '),\n+(2035,'ThousandNeedlesW16',1,400,400,23,35,0,-5066.47,-1194.08,-55.537,0.71973,'2031:0 2034:0 2039:0 '),\n+(2036,'ThousandNeedlesW17',1,400,400,23,35,0,-4769.77,-1352.68,-49.836,1.52869,'50:0 2033:0 2037:0 2040:0 '),\n+(2037,'ThousandNeedlesW18',1,400,400,23,35,0,-4652.8,-1464.98,-50.872,2.47901,'2028:0 2036:0 2041:0 2043:0 '),\n+(2038,'ThousandNeedlesW19',1,400,400,23,35,0,-5074.73,-1410.96,-52.2312,0.222955,'50:0 2039:0 2048:0 '),\n+(2039,'ThousandNeedlesW20',1,400,400,23,35,0,-5194.18,-1406.79,-50.3763,0.764877,'2035:0 2038:0 2050:0 '),\n+(2040,'ThousandNeedlesW21',1,400,400,23,35,0,-4891.87,-1456.05,-51.236,1.07118,'50:0 2036:0 2042:0 2048:0 '),\n+(2041,'ThousandNeedlesW22',1,400,400,23,35,0,-4757,-1501.21,-28.7948,0.370198,'2037:0 2042:0 '),\n+(2042,'ThousandNeedlesW23',1,400,400,23,35,0,-4811.64,-1556.31,-50.0359,0.963171,'2040:0 2041:0 2043:0 2046:0 '),\n+(2043,'ThousandNeedlesW24',1,400,400,23,35,0,-4661.22,-1624.56,-25.4573,1.73482,'2037:0 2042:0 2044:0 '),\n+(2044,'ThousandNeedlesW25',1,400,400,23,35,0,-4624.13,-1730.14,-31.5621,1.85852,'2043:0 2045:0 '),\n+(2045,'ThousandNeedlesW26',1,400,485,23,35,0,-4691.02,-1824.75,-56.5207,1.01619,'2044:0 2047:0 2081:0 '),\n+(2046,'ThousandNeedlesW27',1,400,400,23,35,0,-4811.86,-1670.4,-51.0873,1.72892,'2042:0 2047:0 2052:0 '),\n+(2047,'ThousandNeedlesW28',1,400,2097,23,35,0,-4783.23,-1788.72,-49.3172,1.42261,'2045:0 2046:0 2051:0 '),\n+(2048,'ThousandNeedlesW29',1,400,400,23,35,0,-4982.42,-1560.83,-47.125,1.17787,'2038:0 2040:0 2049:0 2052:0 '),\n+(2049,'ThousandNeedlesW30',1,400,400,23,35,0,-5165.39,-1577.56,-54.4116,0.343386,'2048:0 2050:0 2054:0 '),\n+(2050,'ThousandNeedlesW31',1,400,483,23,35,0,-5295.65,-1509.76,-56.4121,0.573119,'2039:0 2049:0 2055:0 '),\n+(2051,'ThousandNeedlesW32',1,400,2097,23,35,0,-4855.93,-1831.87,-51.9183,1.28194,'2047:0 2052:0 2079:0 2080:0 '),\n+(2052,'ThousandNeedlesW33',1,400,400,23,35,0,-4969.52,-1717.69,-61.5435,1.6491,'2046:0 2048:0 2051:0 2053:0 '),\n+(2053,'ThousandNeedlesW34',1,400,400,23,35,0,-5061.47,-1763.65,-66.1325,0.36653,'2052:0 2054:0 2068:0 '),\n+(2054,'ThousandNeedlesW35',1,400,400,23,35,0,-5173.45,-1717.17,-61.8311,6.25112,'2049:0 2053:0 2055:0 2086:0 2087:0 '),\n+(2055,'ThousandNeedlesW36',1,400,483,23,35,0,-5372.83,-1603.26,-55.6282,0.975215,'2050:0 2054:0 2056:0 2087:0 2088:0 '),\n+(2056,'ThousandNeedlesW37',1,400,483,23,35,0,-5472.25,-1702.35,2.75952,1.04984,'2055:0 116:0 '),\n+(2057,'ThousandNeedlesW38',1,400,487,23,35,0,-5593.3,-1588.57,6.36415,0.366532,'116:0 '),\n+(2058,'ThousandNeedlesW39',1,400,482,23,35,0,-4950.58,-1058.58,-14.0026,1.23243,'2030:0 2059:0 '),\n+(2059,'ThousandNeedlesW40',1,400,482,23,35,0,-4980.25,-980.015,-4.94507,5.09659,'2058:0 2060:0 2062:0 2061:0 '),\n+(2060,'ThousandNeedlesW41',1,400,482,23,35,0,-4876.43,-922.254,-5.58887,3.87725,'2059:0 2062:0 2061:0 '),\n+(2061,'ThousandNeedlesW42',1,400,482,23,35,0,-5005.39,-842.193,-5.46968,5.01411,'2059:0 2060:0 2062:0 '),\n+(2062,'ThousandNeedlesW43',1,400,482,23,35,0,-5051.17,-927.317,-5.60775,4.14232,'2059:0 2060:0 2061:0 2063:0 2064:0 '),\n+(2063,'ThousandNeedlesW44',1,400,482,23,35,0,-5166.88,-896.379,-5.07889,5.92361,'2062:0 '),\n+(2064,'ThousandNeedlesW45',1,400,482,23,35,0,-5091.13,-1008.99,-5.23615,3.78733,'2062:0 2065:0 '),\n+(2065,'ThousandNeedlesW46',1,400,482,23,35,0,-5126.17,-1095.6,50.5447,1.11501,'2064:0 2066:0 '),\n+(2066,'ThousandNeedlesW47',1,400,482,23,35,0,-5191.66,-1142.08,49.8328,4.3371,'2065:0 2067:0 '),\n+(2067,'ThousandNeedlesW48',1,400,482,23,35,0,-5186.85,-1242.42,53.7882,2.36968,'2066:0 '),\n+(2068,'DarkcloudPinnacle1',1,400,2097,23,35,0,-5005.12,-1890.45,3.66479,1.83561,'2053:0 2069:0 '),\n+(2069,'DarkcloudPinnacle2',1,400,2097,23,35,0,-4901.08,-1867.77,34.9781,3.58507,'2068:0 2070:0 '),\n+(2070,'DarkcloudPinnacle3',1,400,2097,23,35,0,-4776.06,-1872.74,90.3879,3.04316,'2069:0 2071:0 '),\n+(2071,'DarkcloudPinnacle4',1,400,2097,23,35,0,-4876.74,-1978.26,91.8746,0.720343,'2070:0 2072:0 115:0 '),\n+(2072,'DarkcloudPinnacle5',1,400,2097,23,35,0,-4915.54,-2071.05,84.7897,4.93989,'2071:0 2073:0 2076:0 '),\n+(2073,'DarkcloudPinnacle6',1,400,2097,23,35,0,-4831.42,-2151.41,81.6488,1.60588,'2072:0 2074:0 2075:0 '),\n+(2074,'DarkcloudPinnacle7',1,400,2097,23,35,0,-4748.26,-2111.8,83.523,4.04415,'2073:0 '),\n+(2075,'DarkcloudPinnacle8',1,400,400,23,35,0,-4842.57,-2213.19,85.1857,5.94087,'2073:0 '),\n+(2076,'DarkcloudPinnacle9',1,400,2097,23,35,0,-5016.1,-2107.74,83.8605,6.28252,'2072:0 '),\n+(2077,'DarkcloudPinnacle10',1,400,2097,23,35,0,-5170.08,-2145.09,93.7072,3.77318,'115:0 '),\n+(2078,'DarkcloudPinnacle11',1,400,2097,23,35,0,-4921.47,-1843.98,80.8273,3.6318,'115:0 '),\n+(2079,'ThousandNeedlesC1',1,400,2097,23,35,0,-4970.93,-1895.26,-42.399,2.08851,'2051:0 2080:0 '),\n+(2080,'ThousandNeedlesC2',1,400,2097,23,35,0,-4870.6,-1904.88,-51.5857,2.74235,'2051:0 2079:0 2082:0 '),\n+(2081,'ThousandNeedlesC3',1,400,2097,23,35,0,-4709.18,-1916.95,-45.1441,1.27365,'2045:0 2082:0 '),\n+(2082,'ThousandNeedlesC4',1,400,2097,23,35,0,-4776.72,-1989.22,-60.8744,1.12639,'2080:0 2081:0 2083:0 '),\n+(2083,'ThousandNeedlesC5',1,400,2097,23,35,0,-4881.01,-2128.55,-44.1711,3.78849,'2082:0 2084:0 '),\n+(2084,'ThousandNeedlesC6',1,400,481,23,35,0,-5057.5,-2264.52,-53.5104,0.73918,'2083:0 2085:0 2094:0 119:0 '),\n+(2085,'ThousandNeedlesC7',1,400,2097,23,35,0,-5086.72,-2103.07,-39.7408,4.73175,'2084:0 2086:0 '),\n+(2086,'ThousandNeedlesC8',1,400,400,23,35,0,-5241.22,-1991.69,-60.4397,4.88884,'2054:0 2085:0 2090:0 2094:0 '),\n+(2087,'ThousandNeedlesC9',1,400,483,23,35,0,-5343.03,-1806.64,-52.2102,0.525945,'2054:0 2055:0 2089:0 '),\n+(2088,'ThousandNeedlesC10',1,400,483,23,35,0,-5473.39,-1743.1,-18.0835,0.979516,'2055:0 2089:0 '),\n+(2089,'ThousandNeedlesC11',1,400,483,23,35,0,-5533.01,-1878.93,-58.2063,1.19746,'2087:0 2088:0 2090:0 2092:0 '),\n+(2090,'ThousandNeedlesC12',1,400,400,23,35,0,-5432.97,-2043.66,-64.7738,6.26721,'2086:0 2089:0 2091:0 '),\n+(2091,'ThousandNeedlesC13',1,400,400,23,35,0,-5465.16,-2122.43,-60.3274,1.03645,'2090:0 2092:0 2095:0 '),\n+(2092,'ThousandNeedlesC14',1,400,400,23,35,0,-5599.58,-2073.33,-64.8276,0.983438,'2089:0 2091:0 2093:0 '),\n+(2093,'ThousandNeedlesC15',1,400,400,23,35,0,-5667.81,-2212.47,-58.1306,1.11303,'2092:0 2096:0 2106:0 '),\n+(2094,'ThousandNeedlesC16',1,400,400,23,35,0,-5287.5,-2195.62,-54.0753,0.741926,'2084:0 2086:0 2095:0 2097:0 119:0 '),\n+(2095,'ThousandNeedlesC17',1,400,400,23,35,0,-5426.32,-2213.81,-58.3051,6.2613,'2091:0 2094:0 2096:0 2097:0 '),\n+(2096,'ThousandNeedlesC18',1,400,400,23,35,0,-5522.8,-2260.72,-59.6581,0.457222,'2093:0 2095:0 2098:0 '),\n+(2097,'ThousandNeedlesC19',1,400,400,23,35,0,-5326.39,-2315.08,-42.353,1.99266,'2094:0 2095:0 2098:0 2110:0 '),\n+(2098,'ThousandNeedlesC20',1,400,484,23,35,4,-5535.61,-2362.59,-50.5979,1.14639,'2096:0 2097:0 2099:0 2107:0 '),\n+(2099,'ThousandNeedlesC21',1,400,484,23,35,4,-5649.75,-2375.72,2.56609,6.22399,'2098:0 2100:0 '),\n+(2100,'ThousandNeedlesC22',1,400,484,23,35,4,-5656.57,-2454.18,0.642997,4.88096,'2099:0 2101:0 '),\n+(2101,'ThousandNeedlesC23',1,400,484,23,35,4,-5604.75,-2490.4,30.4679,0.258887,'2100:0 2102:0 '),\n+(2102,'ThousandNeedlesC24',1,400,484,23,35,4,-5527.14,-2463.43,30.6774,2.88172,'2101:0 2103:0 '),\n+(2103,'ThousandNeedlesC25',1,400,484,23,35,4,-5474.04,-2382.59,57.2742,4.1305,'2102:0 2104:0 '),\n+(2104,'ThousandNeedlesC26',1,400,484,23,35,4,-5424.92,-2272.98,82.5255,4.55855,'2103:0 41:0 '),\n+(2105,'ThousandNeedlesC27',1,400,484,23,35,5,-5477.21,-2454.4,89.2838,1.45228,'41:0 '),\n+(2106,'ThousandNeedlesC28',1,400,400,23,35,0,-5735.44,-2408.6,-53.3532,0.767009,'2093:0 2107:0 2108:0 '),\n+(2107,'ThousandNeedlesC29',1,400,484,23,35,0,-5587.73,-2442.35,-50.4618,1.40318,'2098:0 2106:0 2109:0 '),\n+(2108,'ThousandNeedlesC30',1,400,400,23,35,0,-5685.83,-2597.38,-56.0596,2.12378,'2106:0 2109:0 2119:0 '),\n+(2109,'ThousandNeedlesC31',1,400,484,23,35,0,-5520.25,-2555.03,-56.5953,1.46797,'2107:0 2108:0 2111:0 2118:0 '),\n+(2110,'ThousandNeedlesC32',1,400,484,23,35,0,-5309.22,-2432.88,-43.4182,2.04524,'2097:0 2111:0 2112:0 '),\n+(2111,'ThousandNeedlesC33',1,400,400,23,35,4,-5357.57,-2551.14,-55.4342,1.46403,'2109:0 2110:0 2113:0 2115:0 '),\n+(2112,'ThousandNeedlesC34',1,400,400,23,35,0,-5163.1,-2464.2,-52.5964,1.02224,'119:0 2110:0 2113:0 '),\n+(2113,'ThousandNeedlesC35',1,400,400,23,35,0,-5168.45,-2584.79,-50.393,1.73498,'2111:0 2112:0 2114:0 '),\n+(2114,'ThousandNeedlesC36',1,400,400,23,35,0,-5206.18,-2701.85,-49.9805,1.80567,'2113:0 2115:0 2116:0 '),\n+(2115,'ThousandNeedlesC37',1,400,400,23,35,0,-5338.74,-2645.97,-45.5587,1.67019,'2111:0 2114:0 2117:0 '),\n+(2116,'ThousandNeedlesC38',1,400,2303,23,35,0,-5338.36,-2841.96,-55.7141,1.17145,'2114:0 2117:0 2120:0 2123:0 '),\n+(2117,'ThousandNeedlesC39',1,400,400,23,35,0,-5400.44,-2696.1,-41.6368,5.12985,'2115:0 2116:0 2118:0 '),\n+(2118,'ThousandNeedlesC40',1,400,400,23,35,0,-5508.15,-2681.27,-49.789,6.27849,'2109:0 2117:0 2119:0 '),\n+(2119,'ThousandNeedlesC41',1,400,400,23,35,0,-5557.86,-2761.38,-53.7029,2.24548,'2108:0 2118:0 2121:0 '),\n+(2120,'ThousandNeedlesC42',1,400,2303,23,35,0,-5427.21,-2905.53,-56.1528,0.737522,'2116:0 2121:0 2122:0 '),\n+(2121,'ThousandNeedlesC43',1,400,400,23,35,0,-5557.61,-2850.74,-55.2145,1.22644,'2119:0 2120:0 2124:0 '),\n+(2122,'ThousandNeedlesC44',1,400,2303,23,35,0,-5449.75,-3008,-48.4049,1.26768,'2120:0 2123:0 2125:0 '),\n+(2123,'ThousandNeedlesC45',1,400,2303,23,35,0,-5324.57,-3065.64,-49.0275,2.62249,'2116:0 2122:0 2127:0 '),\n+(2124,'ThousandNeedlesC46',1,400,400,23,35,0,-5623.73,-2943.53,-50.4623,1.05563,'2121:0 2125:0 2126:0 '),\n+(2125,'ThousandNeedlesC47',1,400,400,23,35,0,-5602.92,-3056.82,-51.9701,1.71732,'2122:0 2124:0 2126:0 2130:0 '),\n+(2126,'ThousandNeedlesC48',1,400,400,23,35,0,-5718.6,-3126.82,-37.7719,1.04973,'2124:0 2125:0 2131:0 '),\n+(2127,'ThousandNeedlesC49',1,400,400,23,35,0,-5328.41,-3207.34,-47.4244,5.04348,'2123:0 2128:0 2129:0 '),\n+(2128,'ThousandNeedlesC50',1,400,400,23,35,0,-5464.87,-3276.04,-34.1317,0.525478,'2127:0 2129:0 2130:0 '),\n+(2129,'ThousandNeedlesC51',1,400,400,23,35,0,-5455.25,-3387.53,-41.6009,1.22056,'2127:0 2128:0 2132:0 '),\n+(2130,'ThousandNeedlesC52',1,400,400,23,35,0,-5569.49,-3268.7,-44.3082,1.72125,'2125:0 2128:0 2131:0 2133:0 '),\n+(2131,'ThousandNeedlesC53',1,400,400,23,35,0,-5740.95,-3216.87,-41.218,1.17932,'2126:0 2130:0 121:0 '),\n+(2132,'ThousandNeedlesC54',1,400,439,23,35,0,-5553.99,-3514.19,-56.2254,0.918174,'2129:0 2133:0 2134:0 '),\n+(2133,'ThousandNeedlesC55',1,400,439,23,35,0,-5650.38,-3490.29,-57.2333,1.16557,'121:0 2130:0 2132:0 122:0 2134:0 '),\n+(2134,'ThousandNeedlesE1',1,400,2240,23,35,0,-5619.93,-3820.34,-58.7494,1.7723,'121:0 122:0 2132:0 2133:0 2135:0 2136:0 '),\n+(2135,'ThousandNeedlesE2',1,400,439,23,35,0,-5645.47,-4214.99,-58.7498,1.71339,'2134:0 2136:0 '),\n+(2136,'ThousandNeedlesE3',1,400,2240,23,35,0,-5936.34,-4266.6,-58.7493,0.65899,'122:0 2134:0 2135:0 117:0 2137:0 '),\n+(2137,'ThousandNeedlesE4',1,400,2240,23,35,0,-6405.27,-4240.86,-58.749,0.861231,'117:0 123:0 2136:0 '),\n+(2138,'ThousandNeedlesE5',1,400,439,23,35,0,-6173.94,-3567.25,-58.7497,5.13183,'117:0 118:0 121:0 122:0 123:0 '),\n+(2139,'ThousandNeedlesE6',1,400,439,23,35,0,-6638.63,-3654.02,-58.7493,0.631484,'118:0 2141:0 '),\n+(2140,'ThousandNeedlesE7',1,400,439,23,35,0,-6660.6,-3797.14,-58.5293,2.97002,'123:0 2141:0 '),\n+(2141,'ThousandNeedlesE8',1,400,439,23,35,0,-6820.59,-3759.56,21.2097,1.72713,'2139:0 2140:0 2142:0 '),\n+(2142,'TanarisExitN1',1,440,440,38,50,0,-6890.93,-3772.75,52.9557,0.201496,'2141:0 2143:0 '),\n+(2143,'TanarisExitN2',1,440,440,38,50,0,-6952.74,-3716.92,43.1345,3.42359,'2142:0 2144:0 2145:0 '),\n+(2144,'GadgetzanH1',1,440,976,38,50,5,-7047.86,-3764.87,11.4018,3.75207,'2143:0 52:0 2147:0 2148:0 2149:0 2166:0 '),\n+(2145,'GadgetzanA1',1,440,976,38,50,2,-7182.58,-3638.57,11.2417,5.95314,'2143:0 2146:0 2165:0 2166:0 '),\n+(2146,'GadgetzanA2',1,440,976,38,50,3,-7232.4,-3740.53,8.47838,5.52708,'2145:0 52:0 2147:0 2148:0 2165:0 2166:0 '),\n+(2147,'GadgetzanS',1,440,976,38,50,1,-7160.74,-3844,8.72832,1.31539,'52:0 2144:0 2146:0 '),\n+(2148,'Tanaris1',1,440,440,38,50,0,-7236.3,-4040.94,11.0963,1.40179,'2144:0 2146:0 2149:0 2150:0 2158:0 2161:0 2165:0 '),\n+(2149,'Tanaris2',1,440,1937,38,50,0,-7012.17,-4180.07,10.8027,2.40318,'2144:0 2148:0 2150:0 2151:0 2152:0 '),\n+(2150,'Tanaris3',1,440,440,38,50,0,-7183.44,-4321.24,9.48149,1.28398,'2148:0 2149:0 2151:0 2152:0 2157:0 2158:0 '),\n+(2151,'Tanaris4',1,440,1937,38,50,0,-6915.38,-4366.17,11.3936,2.18522,'2149:0 2150:0 2152:0 '),\n+(2152,'Tanaris5',1,440,440,38,50,0,-7083.47,-4512.85,8.48356,1.53726,'2149:0 2150:0 2151:0 2153:0 2157:0 2158:0 '),\n+(2153,'Tanaris6',1,440,977,38,50,0,-6965.03,-4691.43,8.43736,2.08705,'2152:0 2154:0 2155:0 2156:0 2157:0 '),\n+(2154,'Tanaris7',1,440,977,38,50,0,-6745.21,-4852.73,0.167925,2.76838,'2153:0 2155:0 '),\n+(2155,'Tanaris8',1,440,977,38,50,0,-6936.98,-4872.05,0.71439,1.89659,'2153:0 2154:0 2156:0 '),\n+(2156,'Tanaris9',1,440,988,38,50,0,-7135.69,-4833.99,0.699453,1.36644,'2153:0 2155:0 2157:0 '),\n+(2157,'Tanaris10',1,440,985,38,50,0,-7326.32,-4666.64,8.78219,0.194235,'2150:0 2152:0 2153:0 2156:0 2158:0 113:0 '),\n+(2158,'Tanaris11',1,440,985,38,50,0,-7455.84,-4410.59,11.5646,0.58301,'2148:0 2150:0 2152:0 2157:0 113:0 2160:0 2161:0 '),\n+(2159,'Tanaris12',1,440,988,40,50,0,-7777.85,-4943.31,6.30343,4.78293,'113:0 2160:0 2210:0 '),\n+(2160,'Tanaris13',1,440,985,38,50,0,-7765.82,-4633.67,11.3435,5.2954,'113:0 2158:0 2159:0 2161:0 2162:0 '),\n+(2161,'Tanaris14',1,440,1938,38,50,0,-7816.44,-4067.72,9.39531,5.57225,'2148:0 2158:0 2160:0 2162:0 2163:0 2164:0 2165:0 '),\n+(2162,'Tanaris15',1,440,440,40,50,0,-8124.61,-4381.44,10.6814,6.10827,'2160:0 2161:0 2163:0 2206:0 '),\n+(2163,'Tanaris16',1,440,440,40,50,0,-8211.49,-4018.52,10.2243,5.89032,'2161:0 2162:0 2164:0 2205:0 2209:0 '),\n+(2164,'Tanaris17',1,440,1938,38,50,0,-7957.98,-3774.76,42.6206,4.73579,'2161:0 2163:0 2165:0 2173:0 '),\n+(2165,'Tanaris18',1,440,440,38,50,0,-7532.17,-3671.41,9.08631,5.75681,'2145:0 2146:0 2148:0 2161:0 2164:0 2166:0 2172:0 2173:0 '),\n+(2166,'Tanaris19',1,440,440,38,50,0,-7149.95,-3429.64,10.9479,4.73187,'2144:0 2145:0 2146:0 2165:0 2167:0 2170:0 2172:0 '),\n+(2167,'Tanaris20',1,440,979,38,50,0,-6944.47,-3147.06,30.6034,1.0405,'2166:0 2168:0 2169:0 2170:0 '),\n+(2168,'Tanaris21',1,440,978,38,50,0,-6847.43,-2908.93,8.88901,4.55712,'2167:0 2169:0 2170:0 '),\n+(2169,'Tanaris22',1,440,979,38,50,0,-6994.4,-2790.52,8.87793,5.49763,'2167:0 2168:0 2170:0 2171:0 '),\n+(2170,'Tanaris23',1,440,979,38,50,0,-7181.29,-3008.99,31.1598,2.12434,'2166:0 2167:0 2168:0 2169:0 2171:0 2172:0 '),\n+(2171,'Tanaris24',1,440,982,40,50,0,-7405.37,-2656.15,12.3269,5.64056,'2169:0 2170:0 2172:0 2174:0 2175:0 '),\n+(2172,'Tanaris25',1,440,979,38,50,0,-7432.96,-3165.88,11.6881,0.195781,'2165:0 2166:0 2170:0 2171:0 2173:0 2174:0 '),\n+(2173,'Tanaris26',1,440,1939,38,50,0,-7856.78,-3289.98,68.7512,5.401,'2164:0 2165:0 2172:0 2174:0 2184:0 2187:0 '),\n+(2174,'Tanaris27',1,440,982,40,50,0,-7689.14,-2835.54,14.0257,3.79487,'2171:0 2172:0 2173:0 2175:0 2179:0 2182:0 2184:0 '),\n+(2175,'Tanaris28',1,440,982,44,55,0,-7757.78,-2516.52,8.85209,5.79567,'2171:0 2174:0 2176:0 2177:0 2178:0 2179:0 2183:0 '),\n+(2176,'Tanaris29',1,440,982,38,50,0,-7885.89,-2645.63,-56.7571,1.76264,'2175:0 '),\n+(2177,'Tanaris30',1,440,982,38,50,0,-7691.97,-2600,-56.5855,2.87594,'2175:0 '),\n+(2178,'Tanaris31',1,440,982,38,50,0,-7867.56,-2503.34,-45.915,6.01951,'2175:0 '),\n+(2179,'Tanaris32',1,440,982,44,55,0,-8024.98,-2496.1,4.7767,5.76032,'2174:0 2175:0 2180:0 2181:0 2182:0 '),\n+(2180,'Tanaris33',1,440,982,38,50,0,-7961.12,-2608.77,-51.3402,2.94075,'2181:0 2179:0 '),\n+(2181,'Tanaris34',1,440,982,38,50,0,-7948.03,-2388.48,-27.27,2.48522,'2180:0 2179:0 '),\n+(2182,'Tanaris35',1,440,982,44,55,0,-8192.63,-2678.87,9.10516,6.208,'2174:0 2179:0 2183:0 2185:0 '),\n+(2183,'Tanaris36',1,440,982,40,50,0,-8237.94,-2283.21,9.47101,5.21841,'2175:0 2182:0 2188:0 2189:0 2190:0 '),\n+(2184,'Tanaris37',1,440,1939,40,50,0,-8080.23,-2940.32,41.1249,5.97434,'2173:0 2174:0 2185:0 2186:0 2187:0 '),\n+(2185,'Tanaris38',1,440,983,40,50,0,-8463.57,-2772.2,16.342,6.04503,'2182:0 2184:0 2186:0 2187:0 2190:0 '),\n+(2186,'Tanaris39',1,440,983,40,50,0,-8572.13,-2989.04,10.5515,0.775002,'2184:0 2185:0 2187:0 2190:0 2194:0 2196:0 '),\n+(2187,'Tanaris40',1,440,983,40,50,0,-8349.72,-3161.78,10.5974,1.38762,'2173:0 2184:0 2185:0 2186:0 '),\n+(2188,'Tanaris41',1,440,440,44,55,0,-8568.73,-2090.66,8.81721,5.96256,'2183:0 2189:0 2220:0 '),\n+(2189,'Tanaris42',1,440,980,44,55,0,-8728.04,-2264.78,8.87691,0.109387,'2183:0 2188:0 2190:0 2191:0 2192:0 '),\n+(2190,'Tanaris43',1,440,440,40,50,0,-8780.75,-2536.53,12.5632,1.2757,'2183:0 2185:0 2186:0 2189:0 2192:0 2194:0 '),\n+(2191,'Tanaris44',1,440,980,44,55,0,-9113.86,-2138.28,14.5526,5.80156,'2189:0 2192:0 '),\n+(2192,'Tanaris45',1,440,440,44,55,0,-9078.5,-2368.44,15.1243,6.03129,'2189:0 2190:0 2191:0 2193:0 2194:0 '),\n+(2193,'Tanaris46',1,440,440,40,50,0,-9394.76,-2441.52,12.341,0.162396,'2192:0 114:0 2194:0 '),\n+(2194,'Tanaris47',1,440,992,40,50,0,-9166,-2942.59,27.3153,4.4055,'114:0 2186:0 2190:0 2192:0 2193:0 2195:0 2196:0 '),\n+(2195,'Tanaris48',1,440,992,40,50,0,-9259.98,-3213.55,17.6595,1.63894,'114:0 2194:0 2196:0 2197:0 2198:0 '),\n+(2196,'Tanaris49',1,440,984,40,50,0,-8891.65,-3316.57,17.9459,2.09054,'2186:0 2194:0 2195:0 2197:0 2198:0 '),\n+(2197,'Tanaris50',1,440,981,44,55,0,-8891.37,-3634.86,9.8928,2.97216,'2195:0 2196:0 2198:0 2199:0 2204:0 2205:0 '),\n+(2198,'Tanaris51',1,440,440,40,50,0,-9376.51,-3525.65,10.4557,1.04009,'2195:0 2196:0 2197:0 2199:0 '),\n+(2199,'Tanaris52',1,440,981,44,55,0,-9238.88,-3842.23,16.1398,6.21782,'2197:0 2198:0 2200:0 2201:0 2204:0 '),\n+(2200,'Tanaris53',1,440,981,44,55,0,-9122.46,-4119.91,14.5657,1.92562,'2199:0 2202:0 2203:0 2204:0 '),\n+(2201,'Tanaris54',1,440,981,38,50,0,-9448.09,-4056.48,-45.7265,1.70179,'2199:0 '),\n+(2202,'Tanaris55',1,440,981,38,50,0,-9058.94,-4138.03,-30.5429,1.76658,'2200:0 '),\n+(2203,'Tanaris56',1,440,981,38,50,0,-9239.16,-3990.68,-38.2526,5.54632,'2200:0 '),\n+(2204,'Tanaris57',1,440,981,44,55,0,-8846.97,-4120.67,11.0961,2.09647,'2197:0 2199:0 2200:0 2205:0 2209:0 '),\n+(2205,'Tanaris58',1,440,440,40,50,0,-8582.56,-3848.15,27.4666,3.85733,'2163:0 2197:0 2204:0 2209:0 '),\n+(2206,'Tanaris59',1,440,440,40,50,0,-8436.38,-4485.59,9.98615,0.059917,'2162:0 2207:0 2209:0 '),\n+(2207,'Tanaris60',1,440,1940,44,50,0,-8543.26,-4792.62,0.74885,2.08624,'2206:0 2208:0 2371:0 '),\n+(2208,'Tanaris61',1,440,1940,44,50,0,-8731.47,-4651.05,6.22094,6.04857,'2207:0 2209:0 '),\n+(2209,'Tanaris62',1,440,981,40,50,0,-8636.73,-4274.81,14.2733,1.53645,'2163:0 2204:0 2205:0 2206:0 2208:0 '),\n+(2210,'Tanaris63',1,440,1336,40,50,0,-7834.45,-5044.24,4.58704,0.700017,'2159:0 2211:0 '),\n+(2211,'Tanaris64',1,440,1336,40,50,0,-7869.58,-5185.77,0.738081,3.22506,'2210:0 2212:0 2213:0 2215:0 '),\n+(2212,'Tanaris65',1,440,1336,40,50,0,-8043.72,-5139.25,11.1577,5.95236,'2211:0 '),\n+(2213,'Tanaris66',1,440,1336,40,50,0,-7985.53,-5405.09,1.12058,1.11823,'2211:0 2214:0 2215:0 2216:0 '),\n+(2214,'Tanaris67',1,440,1336,40,50,0,-7957.94,-5481.79,0.207866,2.5025,'2213:0 '),\n+(2215,'Tanaris68',1,440,1336,40,50,0,-7979.86,-5272.84,0.574685,0.762833,'2211:0 2213:0 2216:0 2217:0 2218:0 2219:0 '),\n+(2216,'Tanaris69',1,440,1336,40,50,0,-8057.83,-5349.53,19.8843,5.57338,'2213:0 2215:0 '),\n+(2217,'Tanaris70',1,440,1336,40,50,0,-8101.51,-5296.31,2.11654,0.146278,'2215:0 '),\n+(2218,'Tanaris71',1,440,1336,40,50,0,-8088.86,-5238.43,1.94444,6.18206,'2215:0 '),\n+(2219,'Tanaris72',1,440,1336,40,50,0,-8005.83,-5204.31,4.73672,1.59535,'2215:0 '),\n+(2220,'TanarisExitSW',1,440,440,44,55,0,-8243.03,-2079.74,-95.586,0.052021,'2188:0 2221:0 '),\n+(2221,'Ungoro1',1,490,490,44,56,0,-8066.01,-2098.76,-168.295,6.18792,'2220:0 2222:0 '),\n+(2222,'Ungoro2',1,490,490,44,56,0,-7916.41,-2142.07,-238.077,0.49967,'2221:0 2223:0 '),\n+(2223,'Ungoro3',1,490,490,44,56,0,-7864.72,-2099.17,-266.094,3.40762,'2222:0 2224:0 2260:0 '),\n+(2224,'Ungoro4',1,490,1942,44,56,0,-7934.33,-2040.71,-267.978,5.68527,'2223:0 2225:0 '),\n+(2225,'Ungoro5',1,490,1942,44,56,0,-7884.5,-1843.96,-274.777,4.70158,'2224:0 2226:0 2260:0 2261:0 '),\n+(2226,'Ungoro6',1,490,540,46,56,0,-8088.18,-1491.28,-269.655,5.9268,'2225:0 2227:0 2228:0 2261:0 '),\n+(2227,'Ungoro7',1,490,490,46,56,0,-8249.65,-1584.9,-198.819,0.538974,'2226:0 2229:0 '),\n+(2228,'Ungoro8',1,490,540,46,56,0,-8064.8,-1172.37,-270.687,4.96077,'2226:0 2229:0 2232:0 '),\n+(2229,'Ungoro9',1,490,540,46,56,0,-7866.69,-1345.21,-274.102,2.63992,'2227:0 2228:0 2230:0 2231:0 2232:0 2261:0 2262:0 2265:0 '),\n+(2230,'Ungoro10',1,490,490,46,56,0,-7978.25,-1085.08,-328.506,4.68783,'2229:0 '),\n+(2231,'Ungoro11',1,490,540,46,56,0,-8110.2,-1212.13,-336.702,6.17813,'2229:0 '),\n+(2232,'Ungoro12',1,490,539,48,56,0,-7862.94,-1011.26,-266.988,4.49344,'2228:0 2229:0 2233:0 2234:0 2262:0 '),\n+(2233,'Ungoro13',1,490,539,48,56,0,-7893.05,-604.125,-260.044,4.74085,'2232:0 2234:0 2235:0 '),\n+(2234,'Ungoro14',1,490,539,48,56,0,-7779.84,-752.864,-268.32,4.3658,'2232:0 2233:0 2235:0 2262:0 2263:0 '),\n+(2235,'Ungoro15',1,490,543,48,56,0,-7516.02,-568.085,-272.224,3.45867,'2233:0 2234:0 2236:0 2240:0 2263:0 '),\n+(2236,'Ungoro16',1,490,543,48,56,0,-7357.96,-423.47,-270.864,3.80227,'2235:0 2237:0 2238:0 '),\n+(2237,'Ungoro17',1,490,543,48,56,0,-7453.5,-224.428,-202.131,5.11585,'2236:0 '),\n+(2238,'Ungoro18',1,490,543,48,56,0,-7065.02,-412.024,-271.337,3.13271,'2236:0 2239:0 2240:0 '),\n+(2239,'Ungoro19',1,490,490,48,56,0,-6942.78,-227.898,-200.477,4.11643,'2238:0 '),\n+(2240,'Ungoro20',1,490,543,48,56,0,-7057.61,-568.049,-272.117,3.13074,'2235:0 2238:0 2241:0 2273:0 2275:0 '),\n+(2241,'Ungoro21',1,490,490,46,56,0,-6819.88,-500.077,-273.734,4.04377,'2240:0 2242:0 2273:0 '),\n+(2242,'Ungoro22',1,490,490,46,56,0,-6621.16,-628.631,-271.06,2.65557,'2241:0 2243:0 2273:0 2289:0 '),\n+(2243,'Ungoro23',1,490,490,46,56,0,-6516.77,-714.125,-272.04,4.8802,'2242:0 2244:0 2271:0 '),\n+(2244,'Ungoro24',1,490,538,46,56,0,-6357.05,-1044.55,-271.024,2.01939,'2243:0 2245:0 2247:0 '),\n+(2245,'Ungoro25',1,490,541,46,56,0,-6247.33,-1096.9,-216.374,2.3198,'111:0 2244:0 2246:0 '),\n+(2246,'Ungoro26',1,490,541,46,56,0,-6263.44,-1146.22,-245.676,0.70581,'111:0 2245:0 2247:0 '),\n+(2247,'Ungoro27',1,490,538,46,56,0,-6307.92,-1177.22,-269.521,1.78377,'2244:0 2246:0 2248:0 '),\n+(2248,'Ungoro28',1,490,538,46,56,0,-6416.8,-1325.76,-272.118,0.908046,'2247:0 2249:0 2270:0 2271:0 '),\n+(2249,'Ungoro29',1,490,538,46,56,0,-6394.87,-1511.09,-269.907,1.76217,'2248:0 112:0 2251:0 2269:0 2270:0 2271:0 '),\n+(2250,'Ungoro30',1,490,542,46,56,0,-6359.08,-1992.29,-276.383,1.21435,'112:0 '),\n+(2251,'Ungoro31',1,490,538,46,56,0,-6575.48,-1808.43,-271.11,0.413242,'112:0 2249:0 2252:0 2253:0 2269:0 2270:0 '),\n+(2252,'Ungoro32',1,490,490,46,56,0,-6527.29,-2027.48,-271.963,1.5501,'2251:0 2253:0 '),\n+(2253,'Ungoro33',1,490,490,46,56,0,-6834.73,-2083.14,-267.953,0.248293,'2251:0 2252:0 2254:0 2267:0 2269:0 '),\n+(2254,'Ungoro34',1,490,1942,46,56,0,-7068.84,-2256.36,-271.191,0.560497,'2253:0 2255:0 2256:0 2267:0 '),\n+(2255,'Ungoro35',1,490,1943,46,56,0,-6944.44,-2436.79,-201.566,2.1097,'2254:0 '),\n+(2256,'Ungoro36',1,490,1942,46,56,0,-7266.48,-2293,-268.44,0.00677204,'2254:0 2257:0 '),\n+(2257,'Ungoro37',1,490,1942,44,56,0,-7476.48,-2263.22,-266.534,5.76177,'2256:0 2258:0 2259:0 '),\n+(2258,'Ungoro38',1,490,1942,46,56,0,-7419.79,-2422.73,-214.477,1.54419,'2257:0 '),\n+(2259,'Ungoro39',1,490,1942,44,56,0,-7613.45,-2129.98,-272.086,5.58506,'2257:0 2260:0 2266:0 '),\n+(2260,'Ungoro40',1,490,1942,44,56,0,-7787.58,-1962.82,-272.166,5.62628,'2223:0 2225:0 2259:0 2261:0 2266:0 '),\n+(2261,'Ungoro41',1,490,1942,46,56,0,-7685.24,-1654.69,-272.216,4.29698,'2225:0 2226:0 2229:0 2260:0 2265:0 2266:0 '),\n+(2262,'Ungoro42',1,490,490,48,56,0,-7724.44,-1062.81,-269.408,1.8701,'2229:0 2232:0 2234:0 2263:0 2264:0 '),\n+(2263,'Ungoro43',1,490,539,48,56,0,-7524.61,-811.974,-269.097,2.63781,'2234:0 2235:0 2262:0 2264:0 2276:0 '),\n+(2264,'Ungoro44',1,490,490,46,56,0,-7536.49,-1136.09,-271.668,2.21958,'2262:0 2263:0 2265:0 2276:0 '),\n+(2265,'Ungoro45',1,490,490,46,56,0,-7540.94,-1440.28,-272.37,1.75227,'2229:0 2261:0 2264:0 2268:0 '),\n+(2266,'Ungoro46',1,490,1942,44,56,0,-7481.25,-1864.35,-272.185,3.61563,'2259:0 2260:0 2261:0 2267:0 '),\n+(2267,'Ungoro47',1,490,1942,46,56,0,-7196.2,-1804.18,-272.191,4.61501,'2253:0 2254:0 2266:0 2268:0 '),\n+(2268,'Ungoro48',1,490,537,46,56,0,-7052.38,-1597.57,-270.962,3.20599,'2265:0 2267:0 2269:0 2270:0 2272:0 2279:0 2280:0 '),\n+(2269,'Ungoro49',1,490,538,46,56,0,-6864.28,-1691.91,-271.236,0.290198,'2249:0 2251:0 2253:0 2268:0 2270:0 '),\n+(2270,'Ungoro50',1,490,538,46,56,0,-6742.71,-1481.45,-270.728,0.152749,'2248:0 2249:0 2251:0 2268:0 2269:0 2271:0 2272:0 '),\n+(2271,'Ungoro51',1,490,538,46,56,0,-6687.22,-1202.84,-270.132,5.43062,'2243:0 2248:0 2249:0 2270:0 2272:0 2274:0 2275:0 '),\n+(2272,'Ungoro52',1,490,537,48,56,0,-6971.9,-1359.19,-272.023,5.74869,'2268:0 2270:0 2271:0 2280:0 '),\n+(2273,'Ungoro53',1,490,490,46,56,0,-6905.86,-744.591,-271.912,1.82168,'2240:0 2241:0 2242:0 2274:0 2275:0 '),\n+(2274,'Ungoro54',1,490,490,46,56,0,-6713.26,-889.582,-269.981,2.47553,'2271:0 2273:0 2275:0 '),\n+(2275,'Ungoro55',1,490,490,46,56,0,-7071.75,-971.188,-268.921,1.5625,'2240:0 2271:0 2273:0 2274:0 2276:0 '),\n+(2276,'Ungoro56',1,490,537,48,56,0,-7262.04,-1142.55,-256.214,3.05082,'2263:0 2264:0 2275:0 2277:0 '),\n+(2277,'Ungoro57',1,490,537,48,56,0,-7276.34,-1237.12,-242.301,0.11537,'2276:0 2278:0 2286:0 '),\n+(2278,'Ungoro58',1,490,537,48,56,0,-7196.58,-1221.48,-206.377,2.70522,'2277:0 '),\n+(2279,'Ungoro59',1,490,537,48,56,0,-7139.11,-1460.35,-240.441,5.44625,'2268:0 '),\n+(2280,'Ungoro60',1,490,537,48,56,0,-6995.92,-1426.86,-263.362,1.61744,'2268:0 2272:0 2281:0 '),\n+(2281,'Ungoro61',1,490,537,48,56,0,-7087.82,-1424.62,-235.604,0.254778,'2280:0 2282:0 '),\n+(2282,'Ungoro62',1,490,537,48,56,0,-7094.67,-1371.27,-215.077,4.51555,'2281:0 2283:0 '),\n+(2283,'Ungoro63',1,490,537,48,56,0,-7151.31,-1318.52,-184.389,0.761355,'2282:0 2284:0 2285:0 '),\n+(2284,'Ungoro64',1,490,537,48,56,0,-7093.52,-1298.11,-185.557,3.52203,'2283:0 '),\n+(2285,'Ungoro65',1,490,537,48,56,0,-7193.59,-1360.95,-184.286,6.25914,'2283:0 '),\n+(2286,'Ungoro66',1,490,537,48,56,0,-7288.45,-1306.18,-240.621,1.48982,'2277:0 2287:0 '),\n+(2287,'Ungoro67',1,490,537,48,56,0,-7220.03,-1431,-231.915,2.60313,'2286:0 2288:0 '),\n+(2288,'Ungoro68',1,490,537,48,56,0,-7328.61,-1466.63,-241.155,0.211588,'2287:0 '),\n+(2289,'Ungoro69',1,490,490,50,56,0,-6487.3,-527.418,-240.618,3.68697,'2242:0 2290:0 '),\n+(2290,'Ungoro70',1,490,490,50,56,0,-6221.83,-588.48,-118.307,2.76414,'2289:0 2291:0 '),\n+(2291,'Ungoro71',1,490,490,50,56,0,-6222.04,-471.141,-64.8223,4.41936,'2290:0 2292:0 '),\n+(2292,'Silithus1',1,1377,1377,50,60,0,-6290.28,-372.309,-0.180207,5.29035,'2291:0 184:0 '),\n+(2293,'Silithus2',1,1377,1377,50,60,0,-6723.42,16.99,1.33043,2.60703,'184:0 2294:0 2295:0 2296:0 '),\n+(2294,'Silithus3',1,1377,2738,50,60,0,-7058.45,311.497,7.73577,5.31076,'2293:0 2295:0 2304:0 2350:0 2351:0 2352:0 2353:0 '),\n+(2295,'Silithus4',1,1377,1377,50,60,0,-6775.62,325.939,7.96733,4.88272,'191:0 2293:0 2294:0 2296:0 2304:0 2350:0 '),\n+(2296,'Silithus5',1,1377,1377,53,60,0,-6480.77,427.825,2.85797,3.86957,'191:0 2293:0 2295:0 2299:0 2304:0 2311:0 '),\n+(2297,'Silithus6',1,1377,3446,53,60,0,-6249.14,4.14336,6.27956,4.62356,'191:0 2298:0 '),\n+(2298,'Silithus7',1,1377,3446,53,60,0,-6303.03,23.7784,-8.51367,4.98288,'2297:0 '),\n+(2299,'Silithus8',1,1377,1377,53,60,0,-6325.77,679.48,7.83164,4.56898,'191:0 2296:0 2300:0 2304:0 2311:0 '),\n+(2300,'Silithus9',1,1377,2742,53,60,0,-6512.68,1140.49,5.52295,5.13838,'2299:0 2301:0 2311:0 2317:0 2322:0 2323:0 '),\n+(2301,'Silithus10',1,1377,2742,53,60,0,-6376.67,1003.32,-29.6361,5.81971,'2300:0 2302:0 2303:0 '),\n+(2302,'Silithus11',1,1377,2742,53,60,0,-6233.34,982.199,-44.8168,2.95104,'2301:0 2303:0 '),\n+(2303,'Silithus12',1,1377,2742,53,60,0,-6264.39,1180.37,-17.4845,2.70757,'2301:0 2302:0 '),\n+(2304,'Silithus13',1,1377,3425,50,60,0,-6806.63,645.151,14.4502,4.36084,'2294:0 2295:0 2296:0 2299:0 2305:0 2350:0 2351:0 '),\n+(2305,'Silithus14',1,1377,3425,53,60,0,-6809.1,722.467,39.8123,2.17349,'2304:0 2306:0 188:0 '),\n+(2306,'Silithus15',1,1377,3425,53,60,0,-6835.28,767.676,43.3803,5.14818,'2305:0 188:0 2307:0 2308:0 2309:0 2310:0 '),\n+(2307,'Silithus16',1,1377,3425,53,60,5,-6754.01,823.51,57.2677,3.58719,'2306:0 '),\n+(2308,'Silithus17',1,1377,3425,53,60,1,-6739.83,766.866,128.438,3.03271,'2306:0 '),\n+(2309,'Silithus18',1,1377,3425,53,60,0,-6767.97,869.849,23.6798,5.43995,'2306:0 2310:0 2311:0 '),\n+(2310,'Silithus19',1,1377,3425,53,60,0,-6882.21,862.037,35.6652,6.05845,'2306:0 2309:0 2323:0 '),\n+(2311,'Silithus20',1,1377,2742,53,60,0,-6689.89,843.881,1.63418,4.68008,'2296:0 2299:0 2300:0 2309:0 2312:0 2313:0 '),\n+(2312,'Silithus21',1,1377,2742,53,60,0,-6610.39,1133.65,-47.8484,4.53085,'2311:0 '),\n+(2313,'Silithus22',1,1377,2742,53,60,0,-6560.42,848.396,-19.7968,5.5872,'2311:0 2314:0 2315:0 2316:0 '),\n+(2314,'Silithus23',1,1377,2742,53,60,0,-6485.94,926.037,-42.1164,4.07923,'2313:0 '),\n+(2315,'Silithus24',1,1377,2742,53,60,0,-6592.71,755.859,-52.6973,0.303426,'2313:0 '),\n+(2316,'Silithus25',1,1377,2742,53,60,0,-6626.24,951.29,-53.3026,5.44387,'2313:0 '),\n+(2317,'Silithus26',1,1377,2742,53,60,0,-6416.82,1332.7,1.61694,4.0223,'2300:0 2318:0 2322:0 '),\n+(2318,'Silithus27',1,1377,2740,53,60,0,-6260.69,1633.49,6.1983,4.14011,'2317:0 2319:0 133:0 '),\n+(2319,'Silithus28',1,1377,1377,53,60,0,-6412.61,1879.6,4.97151,5.48313,'2318:0 133:0 2320:0 134:0 '),\n+(2320,'Silithus29',1,1377,1377,53,60,0,-6709.78,1906.69,5.58306,6.01956,'2319:0 2321:0 134:0 '),\n+(2321,'Silithus30',1,1377,2743,53,60,0,-6952.45,1684.29,2.49135,0.649405,'2320:0 134:0 2322:0 2325:0 '),\n+(2322,'Silithus31',1,1377,1377,53,60,0,-6798.69,1359.48,2.84112,2.99187,'134:0 189:0 2300:0 2317:0 2321:0 2325:0 '),\n+(2323,'Silithus32',1,1377,1377,53,60,0,-6935.53,933.15,20.0826,5.50711,'177:0 189:0 2300:0 2310:0 2324:0 2351:0 '),\n+(2324,'Silithus33',1,1377,1377,53,60,0,-7170.32,969.526,1.6856,0.846154,'177:0 189:0 2323:0 2335:0 2343:0 '),\n+(2325,'Silithus34',1,1377,2743,55,60,0,-7102.06,1490.93,6.9342,0.374927,'189:0 2321:0 2322:0 2326:0 '),\n+(2326,'Silithus35',1,1377,2743,55,60,0,-7227.39,1476.62,-3.4765,1.83774,'2325:0 2327:0 2335:0 2336:0 '),\n+(2327,'Silithus36',1,1377,2743,55,60,0,-7304.89,1624.78,-30.4609,5.43684,'2326:0 2328:0 2329:0 2330:0 '),\n+(2328,'Silithus37',1,1377,2743,55,60,0,-7466.84,1605.7,-50.256,4.1959,'2327:0 2331:0 '),\n+(2329,'Silithus38',1,1377,2743,55,60,0,-7434.92,1813.75,-46.5685,5.83934,'2327:0 2332:0 '),\n+(2330,'Silithus39',1,1377,2743,55,60,0,-7246.4,1714.88,-63.0024,4.43346,'2327:0 2333:0 2334:0 '),\n+(2331,'Silithus40',1,1377,1377,53,60,0,-7396.76,1242.93,-84.3036,3.00401,'2328:0 '),\n+(2332,'Silithus41',1,1377,2743,53,60,0,-7611.96,1707.51,-36.9118,0.00770472,'2329:0 '),\n+(2333,'Silithus42',1,1377,2743,53,60,0,-7390.74,1717.46,-92.9352,5.54673,'2330:0 '),\n+(2334,'Silithus43',1,1377,2743,53,60,0,-7320.18,1835.39,-90.5829,0.977671,'2330:0 '),\n+(2335,'Silithus44',1,1377,1377,53,60,0,-7395.86,1200.83,3.1343,6.21237,'177:0 189:0 2324:0 2326:0 2336:0 2341:0 2342:0 2343:0 '),\n+(2336,'Silithus45',1,1377,2743,53,60,0,-7467.85,1375.97,4.32407,0.317961,'2326:0 2335:0 135:0 2337:0 2341:0 2342:0 '),\n+(2337,'Silithus46',1,1377,1377,53,60,0,-7741.83,1415.69,0.628408,1.87894,'135:0 2336:0 2338:0 2339:0 2340:0 '),\n+(2338,'Silithus47',1,1377,1377,53,60,0,-7929.26,1491.4,-6.62955,0.141247,'135:0 2337:0 2339:0 '),\n+(2339,'Silithus48',1,1377,1377,53,60,0,-7951.61,1381.21,2.92482,0.094128,'193:0 2337:0 2338:0 2340:0 '),\n+(2340,'Silithus49',1,1377,1377,53,60,0,-7884.95,1305.55,-9.32275,1.92018,'193:0 2337:0 2339:0 2341:0 '),\n+(2341,'Silithus50',1,1377,1377,53,60,0,-7724.06,1121.13,1.90701,2.14991,'193:0 2335:0 2336:0 2340:0 2342:0 2347:0 '),\n+(2342,'Silithus51',1,1377,1377,53,60,0,-7614.56,1040.35,4.34335,2.37375,'2335:0 2336:0 2341:0 2343:0 2347:0 2348:0 '),\n+(2343,'Silithus52',1,1377,1377,53,60,0,-7446.46,1011.04,1.56245,2.60898,'177:0 2324:0 2335:0 2342:0 2348:0 '),\n+(2344,'Silithus53',1,1377,3427,53,60,0,-8071.74,1080.25,7.69378,0.464863,'193:0 2345:0 '),\n+(2345,'Silithus54',1,1377,1377,55,60,0,-8049.18,988.938,42.0219,2.43622,'2344:0 '),\n+(2346,'Silithus55',1,1377,2744,55,60,0,-8023.11,662.371,-12.5444,1.51572,'193:0 2359:0 '),\n+(2347,'Silithus56',1,1377,2744,53,60,0,-7855.36,863.831,-4.99768,1.56248,'193:0 2341:0 2342:0 2348:0 '),\n+(2348,'Silithus57',1,1377,1377,53,60,0,-7512.58,878.283,-2.19269,1.08534,'177:0 2342:0 2343:0 2347:0 2349:0 2350:0 '),\n+(2349,'Silithus58',1,1377,1377,53,60,0,-7412.18,577.662,-7.35207,4.30862,'177:0 2348:0 2355:0 2357:0 192:0 2359:0 '),\n+(2350,'Silithus59',1,1377,1377,53,60,0,-7177.07,574.409,1.58818,2.04744,'177:0 2294:0 2295:0 2304:0 2348:0 2351:0 2352:0 2355:0 '),\n+(2351,'Silithus60',1,1377,3097,53,60,0,-6922.48,666.906,11.4539,0.176223,'2294:0 2304:0 2323:0 2350:0 '),\n+(2352,'Silithus61',1,1377,2738,50,60,0,-7078.09,417.604,8.20627,4.43703,'2294:0 2350:0 2353:0 '),\n+(2353,'Silithus62',1,1377,2738,50,60,0,-7146.41,350.222,26.2951,0.0509645,'2294:0 2352:0 2354:0 2356:0 '),\n+(2354,'Silithus63',1,1377,2738,50,60,0,-7259.78,328.568,47.9494,0.00187492,'2353:0 2356:0 2357:0 '),\n+(2355,'Silithus64',1,1377,2738,50,60,0,-7283.42,473.511,11.4843,5.52991,'2349:0 2350:0 2356:0 2357:0 '),\n+(2356,'Silithus65',1,1377,2738,50,60,0,-7183.12,437.593,64.3972,4.38322,'2353:0 2354:0 2355:0 '),\n+(2357,'Silithus66',1,1377,2738,50,60,0,-7342.29,338.615,9.9245,1.29662,'2349:0 2354:0 2355:0 192:0 '),\n+(2358,'Silithus67',1,1377,2744,53,60,0,-7815.08,208.412,5.58908,6.15627,'192:0 '),\n+(2359,'Silithus68',1,1377,2744,55,60,0,-7734.1,629.157,-47.1739,6.08166,'2349:0 2360:0 2361:0 2346:0 '),\n+(2360,'Silithus69',1,1377,2744,55,60,0,-7803.61,427.995,-36.2971,1.11402,'2359:0 2361:0 2362:0 '),\n+(2361,'Silithus70',1,1377,2744,55,60,0,-7937.51,488.881,-34.8964,5.632,'2359:0 2360:0 2365:0 2366:0 '),\n+(2362,'Silithus71',1,1377,2744,55,60,0,-7860.7,346.797,-48.3413,1.79141,'2360:0 2363:0 2364:0 '),\n+(2363,'Silithus72',1,1377,2744,53,60,0,-7708.29,262.213,-42.7965,5.31941,'2362:0 '),\n+(2364,'Silithus73',1,1377,2744,53,60,0,-7678.37,284.795,-37.2732,5.97131,'2362:0 '),\n+(2365,'Silithus74',1,1377,1377,53,60,0,-8294.16,376.133,-94.7165,0.44759,'2361:0 '),\n+(2366,'Silithus75',1,1377,2744,53,60,0,-8140.13,753.793,-85.1582,5.97285,'2361:0 2367:0 '),\n+(2367,'Silithus76',1,1377,1377,53,60,0,-8313.26,729.325,-74.3037,4.85955,'2366:0 '),\n+(2368,'AltarOfStorms2',0,46,255,48,56,1,-7605.65,-798.145,190.852,3.45765,'635:0 '),\n+(2369,'Darrowshire',0,139,2262,53,60,1,1416.41,-3653.3,82.0183,4.38389,'230:0 '),\n+(2370,'BLS4H',0,4,72,43,54,5,-11896.1,-3084.13,31.0889,0.713907,'855:0 '),\n+(2371,'TanarisSpawnAll',1,440,1940,44,50,1,-8319.94,-5071.72,4.11589,2.25351,'2207:0 ');\ndiff --git a/data/sql/custom/db_world/2023_04_11_00_creature_template_npcbot_wander_nodes.sql b/data/sql/custom/db_world/2023_04_11_00_creature_template_npcbot_wander_nodes.sql\nnew file mode 100644\nindex 0000000000..907e4f27b0\n--- /dev/null\n+++ b/data/sql/custom/db_world/2023_04_11_00_creature_template_npcbot_wander_nodes.sql\n@@ -0,0 +1,27 @@\n+--\n+DELETE FROM `creature_template_npcbot_wander_nodes` WHERE `id` IN (2372,2373,2374,2375,2376,2377,2378,2379,2380,2381,2382,2383,2384,2385,2386,2387,2388,2389,2390,2391,2392,2393,2394,2395);\n+INSERT INTO `creature_template_npcbot_wander_nodes`(`id`,`name`,`mapid`,`zoneid`,`areaid`,`minlevel`,`maxlevel`,`flags`,`x`,`y`,`z`,`o`,`links`) VALUES\n+(2372,'WarsongGulchSpawnA1',489,3277,4571,10,80,59,1523.81,1481.76,351.992,3.14159,'2373:0 2375:0 2378:0 2377:0 '),\n+(2373,'WarsongGulchAInside1',489,3277,3321,10,80,0,1488.03,1463.62,362.472,1.46358,'2372:0 2374:0 2379:0 '),\n+(2374,'WarsongGulchAInside2',489,3277,4571,10,80,32,1530.85,1468.31,362.665,3.14825,'2372:0 2373:0 '),\n+(2375,'WarsongGulchAInside3',489,3277,3321,10,80,0,1471.13,1454.77,342.795,6.27608,'2372:0 2376:0 2380:0 '),\n+(2376,'WarsongGulchAInside4',489,3277,3321,10,80,32,1523.32,1468.01,373.688,4.44809,'2374:0 2375:0 '),\n+(2377,'WarsongGulchAInside5',489,3277,3321,10,80,0,1439.11,1574.68,343.587,5.09406,'2381:0 2383:0 2372:0 '),\n+(2378,'WarsongGulchAInside6',489,3277,3321,10,80,0,1416.56,1540.82,342.735,5.58886,'2381:0 2383:0 2372:0 '),\n+(2379,'WarsongGulchAInside7',489,3277,3321,10,80,0,1360.6,1392.13,326.593,5.39054,'2381:0 2382:0 2373:0 '),\n+(2380,'WarsongGulchAInside8',489,3277,3321,10,80,0,1356.9,1461.83,324.512,0.0216269,'2381:0 2382:0 2383:0 2375:0 '),\n+(2381,'WarsongGulchMidC1',489,3277,3277,10,80,2,1231.42,1473.79,307.813,5.82692,'2391:0 2392:0 '),\n+(2382,'WarsongGulchMidE1',489,3277,3277,10,80,2,1225.27,1411.04,310.329,0.0703331,'2391:0 2392:0 '),\n+(2383,'WarsongGulchMidW1',489,3277,3277,10,80,2,1195.67,1530.47,306.785,6.16029,'2391:0 2392:0 '),\n+(2384,'WarsongGulchSpawnH1',489,3277,4572,10,80,61,929.191,1434.63,345.536,0.0577507,'2385:0 2387:0 2390:0 2389:0 '),\n+(2385,'WarsongGulchHInside1',489,3277,3320,10,80,0,965.729,1453.27,356.269,4.75445,'2384:0 2391:0 2386:0 '),\n+(2386,'WarsongGulchHInside2',489,3277,4572,10,80,32,925.907,1451.62,355.856,5.79629,'2384:0 2385:0 '),\n+(2387,'WarsongGulchHInside3',489,3277,3320,10,80,0,982.314,1463.02,335.964,1.72006,'2384:0 2392:0 2388:0 '),\n+(2388,'WarsongGulchHInside4',489,3277,3320,10,80,32,931.381,1448.91,367.604,1.1742,'2386:0 2387:0 '),\n+(2389,'WarsongGulchHInside5',489,3277,3320,10,80,0,1033.59,1363.21,342.852,2.24035,'2394:0 2395:0 2384:0 '),\n+(2390,'WarsongGulchHInside6',489,3277,3320,10,80,0,1060.56,1390.51,338.618,2.82356,'2394:0 2395:0 2384:0 '),\n+(2391,'WarsongGulchHInside7',489,3277,3320,10,80,0,1086.1,1540.21,316.792,2.79013,'2393:0 2394:0 2385:0 '),\n+(2392,'WarsongGulchHInside8',489,3277,3320,10,80,0,1119.21,1462.5,316.34,3.25941,'2393:0 2394:0 2395:0 2387:0 '),\n+(2393,'WarsongGulchMidW2',489,3277,3277,10,80,4,1255.33,1511.56,309.973,3.31243,'2379:0 2380:0 '),\n+(2394,'WarsongGulchMidC2',489,3277,3277,10,80,4,1217.19,1480.7,306.432,3.41258,'2379:0 2380:0 '),\n+(2395,'WarsongGulchMidE2',489,3277,3277,10,80,4,1263.56,1400.5,310.369,3.07681,'2379:0 2380:0 ');\ndiff --git a/data/sql/custom/db_world/2023_04_16_00_creature_template_npcbot_wander_nodes.sql b/data/sql/custom/db_world/2023_04_16_00_creature_template_npcbot_wander_nodes.sql\nnew file mode 100644\nindex 0000000000..ecd225cab0\n--- /dev/null\n+++ b/data/sql/custom/db_world/2023_04_16_00_creature_template_npcbot_wander_nodes.sql\n@@ -0,0 +1,27 @@\n+--\n+DELETE FROM `creature_template_npcbot_wander_nodes` WHERE `id` IN (2372,2373,2374,2375,2376,2377,2378,2379,2380,2381,2382,2383,2384,2385,2386,2387,2388,2389,2390,2391,2392,2393,2394,2395);\n+INSERT INTO `creature_template_npcbot_wander_nodes`(`id`,`name`,`mapid`,`zoneid`,`areaid`,`minlevel`,`maxlevel`,`flags`,`x`,`y`,`z`,`o`,`links`) VALUES\n+(2372,'WarsongGulchSpawnA1',489,3277,4571,10,80,251,1535.77,1481.37,352.109,0.188495,'2373:0 2375:0 2378:0 2377:0 '),\n+(2373,'WarsongGulchAInside1',489,3277,3321,10,80,0,1488.03,1463.62,362.472,1.46358,'2372:0 2374:0 2379:0 '),\n+(2374,'WarsongGulchAInside2',489,3277,4571,10,80,32,1530.85,1468.31,362.665,3.14825,'2372:0 2373:0 '),\n+(2375,'WarsongGulchAInside3',489,3277,3321,10,80,0,1471.13,1454.77,342.795,6.27608,'2372:0 2376:0 2380:0 '),\n+(2376,'WarsongGulchAInside4',489,3277,3321,10,80,32,1523.32,1468.01,373.688,4.44809,'2374:0 2375:0 '),\n+(2377,'WarsongGulchAInside5',489,3277,3321,10,80,0,1439.11,1574.68,343.587,5.09406,'2381:0 2383:0 2372:0 '),\n+(2378,'WarsongGulchAInside6',489,3277,3321,10,80,0,1416.56,1540.82,342.735,5.58886,'2381:0 2383:0 2372:0 '),\n+(2379,'WarsongGulchAInside7',489,3277,3321,10,80,0,1360.6,1392.13,326.593,5.39054,'2381:0 2382:0 2373:0 '),\n+(2380,'WarsongGulchAInside8',489,3277,3321,10,80,0,1356.9,1461.83,324.512,0.0216269,'2381:0 2382:0 2383:0 2375:0 '),\n+(2381,'WarsongGulchMidC1',489,3277,3277,10,80,0,1231.42,1473.79,307.813,5.82692,'2391:0 2392:0 '),\n+(2382,'WarsongGulchMidE1',489,3277,3277,10,80,0,1225.27,1411.04,310.329,0.0703331,'2391:0 2392:0 '),\n+(2383,'WarsongGulchMidW1',489,3277,3277,10,80,0,1195.67,1530.47,306.785,6.16029,'2391:0 2392:0 '),\n+(2384,'WarsongGulchSpawnH1',489,3277,4572,10,80,253,919.418,1434.62,345.695,3.13216,'2385:0 2387:0 2390:0 2389:0 '),\n+(2385,'WarsongGulchHInside1',489,3277,3320,10,80,0,965.729,1453.27,356.269,4.75445,'2384:0 2391:0 2386:0 '),\n+(2386,'WarsongGulchHInside2',489,3277,4572,10,80,32,925.907,1451.62,355.856,5.79629,'2384:0 2385:0 '),\n+(2387,'WarsongGulchHInside3',489,3277,3320,10,80,0,982.314,1463.02,335.964,1.72006,'2384:0 2392:0 2388:0 '),\n+(2388,'WarsongGulchHInside4',489,3277,3320,10,80,32,931.381,1448.91,367.604,1.1742,'2386:0 2387:0 '),\n+(2389,'WarsongGulchHInside5',489,3277,3320,10,80,0,1033.59,1363.21,342.852,2.24035,'2394:0 2395:0 2384:0 '),\n+(2390,'WarsongGulchHInside6',489,3277,3320,10,80,0,1060.56,1390.51,338.618,2.82356,'2394:0 2395:0 2384:0 '),\n+(2391,'WarsongGulchHInside7',489,3277,3320,10,80,0,1086.1,1540.21,316.792,2.79013,'2393:0 2394:0 2385:0 '),\n+(2392,'WarsongGulchHInside8',489,3277,3320,10,80,0,1119.21,1462.5,316.34,3.25941,'2393:0 2394:0 2395:0 2387:0 '),\n+(2393,'WarsongGulchMidW2',489,3277,3277,10,80,0,1255.33,1511.56,309.973,3.31243,'2379:0 2380:0 '),\n+(2394,'WarsongGulchMidC2',489,3277,3277,10,80,0,1217.19,1480.7,306.432,3.41258,'2379:0 2380:0 '),\n+(2395,'WarsongGulchMidE2',489,3277,3277,10,80,0,1263.56,1400.5,310.369,3.07681,'2379:0 2380:0 ');\ndiff --git a/data/sql/custom/db_world/2023_04_18_00_creature_template_npcbot_appearance.sql b/data/sql/custom/db_world/2023_04_18_00_creature_template_npcbot_appearance.sql\nnew file mode 100644\nindex 0000000000..09018660d7\n--- /dev/null\n+++ b/data/sql/custom/db_world/2023_04_18_00_creature_template_npcbot_appearance.sql\n@@ -0,0 +1,2 @@\n+--\n+DELETE FROM `creature_template_npcbot_appearance` WHERE (`entry`='70266');\ndiff --git a/data/sql/custom/db_world/2023_04_22_00_creature_template_npcbot_wander_nodes.sql b/data/sql/custom/db_world/2023_04_22_00_creature_template_npcbot_wander_nodes.sql\nnew file mode 100644\nindex 0000000000..2c5a4b48bb\n--- /dev/null\n+++ b/data/sql/custom/db_world/2023_04_22_00_creature_template_npcbot_wander_nodes.sql\n@@ -0,0 +1,25 @@\n+--\n+DELETE FROM `creature_template_npcbot_wander_nodes` WHERE `id` IN (2396,2397,2398,2399,2400,2401,2402,2403,2404,2405,2406,2407,2408,2409,2410,2411,2412,2413,2414,2415,2416,2417,2418,2419,2420,2421,2422,2423,2424,2425,2426,2427,2428,2429,2430,2431,2432,2433,2434,2435,2436);\n+INSERT INTO `creature_template_npcbot_wander_nodes`(`id`,`name`,`mapid`,`zoneid`,`areaid`,`minlevel`,`maxlevel`,`flags`,`x`,`y`,`z`,`o`,`links`) VALUES\n+(2396,'ArathiBasinSpawnA',529,3358,3417,20,80,3,1313.9,1310.74,-9.01043,3.83874,'2397:0 '),\n+(2397,'ArathiBasinStartA',529,3358,3358,20,80,0,1241.32,1228.52,-40.2271,4.12149,'2411:0 2398:0 '),\n+(2398,'ArathiBasinStables',529,3358,3424,20,80,128,1168.45,1204.15,-56.582,6.24992,'2397:0 2399:0 '),\n+(2399,'ArathiBasinStablesBridge',529,3358,3358,20,80,0,1089.36,1231.75,-51.8785,4.23379,'2400:0 2398:0 2403:0 '),\n+(2400,'ArathiBasinMillLow1',529,3358,3358,20,80,0,988.277,1179.75,-50.2717,5.04236,'2399:0 2401:0 2416:0 '),\n+(2401,'ArathiBasinMillLow2',529,3358,3358,20,80,0,890.451,1109.94,-56.335,4.04097,'2400:0 2402:0 '),\n+(2402,'ArathiBasinMillLow3',529,3358,3358,20,80,0,845.513,978.663,-60.2139,0.977914,'2401:0 2408:0 2415:0 '),\n+(2403,'ArathiBasinMillUp1',529,3358,3358,20,80,0,939.139,1227.33,-23.8137,3.6404,'2399:0 2404:0 '),\n+(2404,'ArathiBasinMill',529,3358,3422,20,80,136,852.619,1151.8,11.5342,0.752077,'2405:0 2403:0 '),\n+(2405,'ArathiBasinMillUp2',529,3358,3422,20,80,0,783.565,1047.78,-26.1072,1.57478,'2404:0 2408:0 '),\n+(2406,'ArathiBasinSpawnH',529,3358,3418,20,80,5,684.071,681.281,-12.9148,0.836507,'2407:0 '),\n+(2407,'ArathiBasinStartH',529,3358,3358,20,80,0,748.646,759.099,-41.5104,0.818832,'2409:0 2408:0 '),\n+(2408,'ArathiBasinFarm',529,3358,3420,20,80,128,809.5,872.547,-56.7509,1.20759,'2405:0 2407:0 2402:0 '),\n+(2409,'ArathiBasinFarmBridge',529,3358,3420,20,80,0,864.499,771.902,-51.7236,0.695112,'2407:0 2410:0 '),\n+(2410,'ArathiBasinMineForkSE',529,3358,3358,20,80,0,956.739,804.522,-61.6094,0.524283,'2409:0 2412:0 2414:0 '),\n+(2411,'ArathiBasinMineForkNW',529,3358,3358,20,80,0,1221.3,1088.37,-59.7666,4.47091,'2412:0 2397:0 2413:0 '),\n+(2412,'ArathiBasinMine',529,3358,3423,20,80,136,1151.72,846.381,-110.525,2.55257,'2411:0 2410:0 '),\n+(2413,'ArathiBasinMineUp1',529,3358,3358,20,80,0,1156.61,991.63,-63.6154,2.3307,'2411:0 2414:0 2416:0 '),\n+(2414,'ArathiBasinMineUp2',529,3358,3358,20,80,0,1040.93,882.871,-61.8051,2.33458,'2410:0 2415:0 2413:0 '),\n+(2415,'ArathiBasinBlacksmithForkS',529,3358,3421,20,80,0,922.673,999.161,-55.5623,5.49188,'2402:0 2414:0 2417:0 2416:0 '),\n+(2416,'ArathiBasinBlacksmithForkN',529,3358,3421,20,80,0,1050.68,999.89,-50.4064,5.62341,'2400:0 2413:0 2415:0 2417:0 '),\n+(2417,'ArathiBasinBlacksmith',529,3358,3421,20,80,136,979.258,1043.34,-44.3749,0.106003,'2415:0 2416:0 ');\ndiff --git a/data/sql/custom/db_world/2023_04_28_00_creature_template.sql b/data/sql/custom/db_world/2023_04_28_00_creature_template.sql\nnew file mode 100644\nindex 0000000000..460bf90f47\n--- /dev/null\n+++ b/data/sql/custom/db_world/2023_04_28_00_creature_template.sql\n@@ -0,0 +1,3 @@\n+--\n+UPDATE `creature_template` SET `flags_extra` = (`flags_extra` | 0x02000000) WHERE (`flags_extra` & 0x0A000000) = 0x08000000 AND `entry` > 70000;\n+UPDATE `creature_template` SET `flags_extra` = (`flags_extra` | 0x0A000000) WHERE (`flags_extra` & 0x0E000000) = 0x04000000 AND `entry` > 70000;\ndiff --git a/data/sql/custom/db_world/2023_05_14_00_creature_template_npcbot_wander_nodes.sql b/data/sql/custom/db_world/2023_05_14_00_creature_template_npcbot_wander_nodes.sql\nnew file mode 100644\nindex 0000000000..d6ae832db3\n--- /dev/null\n+++ b/data/sql/custom/db_world/2023_05_14_00_creature_template_npcbot_wander_nodes.sql\n@@ -0,0 +1,2 @@\n+--\n+UPDATE `creature_template_npcbot_wander_nodes` SET `minlevel`='23',`flags`='1' WHERE (`id`='753');\ndiff --git a/data/sql/custom/db_world/2023_05_16_00_npc_text.sql b/data/sql/custom/db_world/2023_05_16_00_npc_text.sql\nnew file mode 100644\nindex 0000000000..23a4901092\n--- /dev/null\n+++ b/data/sql/custom/db_world/2023_05_16_00_npc_text.sql\n@@ -0,0 +1,13 @@\n+--\n+SET @BOT_START = 70661;\n+SET @BOT_END   = 70666;\n+\n+DELETE FROM `npc_text` WHERE `ID` BETWEEN @BOT_START AND @BOT_END;\n+\n+INSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n+(@BOT_START+0, \"Bot gear bank...\", -1),\n+(@BOT_START+1, \"Deposit items...\", -1),\n+(@BOT_START+2, \"Withdraw items...\", -1),\n+(@BOT_START+3, \"Bank is empty\", -1),\n+(@BOT_START+4, \"Previous page\", -1),\n+(@BOT_START+5, \"Next page\", -1);\ndiff --git a/data/sql/custom/db_world/2023_05_20_00_creature_template.sql b/data/sql/custom/db_world/2023_05_20_00_creature_template.sql\nnew file mode 100644\nindex 0000000000..246d6eb20b\n--- /dev/null\n+++ b/data/sql/custom/db_world/2023_05_20_00_creature_template.sql\n@@ -0,0 +1,22 @@\n+--\n+SET @BOT_START = 70587;\n+SET @BOT_END   = 70595;\n+\n+INSERT IGNORE INTO `creature_template`\n+(`entry`,`difficulty_entry_1`,`difficulty_entry_2`,`difficulty_entry_3`,`KillCredit1`,`KillCredit2`,\n+`name`,`subname`,`IconName`,`gossip_menu_id`,`minlevel`,`maxlevel`,`exp`,\n+`faction`,`npcflag`,`speed_walk`,`speed_run`,`rank`,`dmgschool`,`BaseAttackTime`,`RangeAttackTime`,\n+`BaseVariance`,`RangeVariance`,`unit_class`,`unit_flags`,`unit_flags2`,`dynamicflags`,`family`,`type`,`type_flags`,`lootid`,\n+`pickpocketloot`,`skinloot`,`PetSpellDataId`,`VehicleId`,`mingold`,`maxgold`,`AIName`,`MovementType`,\n+`HoverHeight`,`HealthModifier`,`ManaModifier`,`ArmorModifier`,`DamageModifier`,`ExperienceModifier`,`RacialLeader`,`movementId`,\n+`RegenHealth`,`flags_extra`,`ScriptName`,`VerifiedBuild`)\n+VALUES\n+('70587','0','0','0','0','0','Tuten\\'arak','Crypt Lord Bot','','0','83','83','2','35','1','1.1','1.1','2','0','1900','1900','1','1','1','0','32','0','0','6','4096','0','0','0','0','0','0','0','','0','1','1','1','1','1','1','0','0','0','235929712','crypt_lord_bot','-1'),\n+('70588','0','0','0','0','0','Anubiros','Crypt Lord Bot','','0','83','83','2','35','1','1.1','1.1','2','0','1900','1900','1','1','1','0','32','0','0','6','4096','0','0','0','0','0','0','0','','0','1','1','1','1','1','1','0','0','0','235929712','crypt_lord_bot','-1'),\n+('70589','0','0','0','0','0','Nephri\\'thos','Crypt Lord Bot','','0','83','83','2','35','1','1.1','1.1','2','0','1900','1900','1','1','1','0','32','0','0','6','4096','0','0','0','0','0','0','0','','0','1','1','1','1','1','1','0','0','0','235929712','crypt_lord_bot','-1'),\n+('70590','0','0','0','0','0','Arak-arahm','Crypt Lord Bot','','0','83','83','2','35','1','1.1','1.1','2','0','1900','1900','1','1','1','0','32','0','0','6','4096','0','0','0','0','0','0','0','','0','1','1','1','1','1','1','0','0','0','235929712','crypt_lord_bot','-1'),\n+('70591','0','0','0','0','0','Horus\\'aman','Crypt Lord Bot','','0','83','83','2','35','1','1.1','1.1','2','0','1900','1900','1','1','1','0','32','0','0','6','4096','0','0','0','0','0','0','0','','0','1','1','1','1','1','1','0','0','0','235929712','crypt_lord_bot','-1'),\n+('70592','0','0','0','0','0','Carrion Beetle','','','0','83','83','2','35','0','1.05','1.05','0','0','1500','1500','1','1','1','0','0','0','0','6','4096','0','0','0','0','0','0','0','','0','1','1','1','1','1','1','0','0','0','168820832','crypt_lord_pet_bot','-1'),\n+('70593','0','0','0','0','0','Carrion Beetle','','','0','83','83','2','35','0','1.05','1.05','0','0','1500','1500','1','1','1','0','0','0','0','6','4096','0','0','0','0','0','0','0','','0','1','1','1','1','1','1','0','0','0','168820832','crypt_lord_pet_bot','-1'),\n+('70594','0','0','0','0','0','Carrion Beetle','','','0','83','83','2','35','0','1.05','1.05','0','0','1500','1500','1','1','1','0','0','0','0','6','4096','0','0','0','0','0','0','0','','0','1','1','1','1','1','1','0','0','0','168820832','crypt_lord_pet_bot','-1'),\n+('70595','0','0','0','0','0','Locust','','','0','83','83','2','35','0','1.4','1.4','1','0','1200','1200','1','1','1','33554432','0','0','0','6','4096','0','0','0','0','0','0','0','','0','2','1','1','1','1','1','0','0','0','704782368','crypt_lord_pet_bot','-1');\ndiff --git a/data/sql/custom/db_world/2023_05_20_01_creature_equip_template.sql b/data/sql/custom/db_world/2023_05_20_01_creature_equip_template.sql\nnew file mode 100644\nindex 0000000000..f852a3cb20\n--- /dev/null\n+++ b/data/sql/custom/db_world/2023_05_20_01_creature_equip_template.sql\n@@ -0,0 +1,13 @@\n+--\n+SET @BOT_START = 70587;\n+SET @BOT_END   = 70591;\n+\n+DELETE FROM `creature_equip_template` WHERE `CreatureID` BETWEEN @BOT_START AND @BOT_END;\n+INSERT INTO `creature_equip_template`\n+(`CreatureID`,`ID`,`VerifiedBuild`)\n+VALUES\n+('70587','1','-1'),\n+('70588','1','-1'),\n+('70589','1','-1'),\n+('70590','1','-1'),\n+('70591','1','-1');\ndiff --git a/data/sql/custom/db_world/2023_05_20_02_creature_template_npcbot_extras.sql b/data/sql/custom/db_world/2023_05_20_02_creature_template_npcbot_extras.sql\nnew file mode 100644\nindex 0000000000..45a25bd762\n--- /dev/null\n+++ b/data/sql/custom/db_world/2023_05_20_02_creature_template_npcbot_extras.sql\n@@ -0,0 +1,15 @@\n+--\n+SET @BOT_START = 70587;\n+SET @BOT_END   = 70595;\n+\n+DELETE FROM `creature_template_npcbot_extras` WHERE `entry` BETWEEN @BOT_START AND @BOT_END;\n+INSERT INTO `creature_template_npcbot_extras` (`entry`,`class`,`race`) VALUES\n+('70587', '20', '15'),\n+('70588', '20', '15'),\n+('70589', '20', '15'),\n+('70590', '20', '15'),\n+('70591', '20', '15'),\n+('70592', '0', '15'),\n+('70593', '0', '15'),\n+('70594', '0', '15'),\n+('70595', '0', '15');\ndiff --git a/data/sql/custom/db_world/2023_05_20_03_npc_text.sql b/data/sql/custom/db_world/2023_05_20_03_npc_text.sql\nnew file mode 100644\nindex 0000000000..34f28dbcea\n--- /dev/null\n+++ b/data/sql/custom/db_world/2023_05_20_03_npc_text.sql\n@@ -0,0 +1,27 @@\n+--\n+SET @LOCALIZED_STRINGS_START = 70012;\n+SET @LOCALIZED_STRINGS_END   = 70013;\n+\n+DELETE FROM `npc_text` WHERE ID BETWEEN @LOCALIZED_STRINGS_START and @LOCALIZED_STRINGS_END;\n+INSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n+(70012,'<Battle-scarred Crypt Lord stands before you, he is obviously uncontrolled. Without master this mighty undead nerubian lord has lost most of his power>$B$BWhat will it be, tiny creature? Your flesh will do like any other...','-1'),\n+(70013,'I consume the living and the dead.','-1');\n+\n+SET @LOCALIZED_STRINGS_START = 70109;\n+SET @LOCALIZED_STRINGS_END   = 70109;\n+\n+DELETE FROM `npc_text` WHERE ID BETWEEN @LOCALIZED_STRINGS_START and @LOCALIZED_STRINGS_END;\n+INSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n+(70109,'|cff9900ccCrypt Lord|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\\\"Ancient behemoth, once one of the kings of Azjol-Nerub, now an undead monster within ranks of Lich King\\'s mightiest warriors\\\".$B$BVery high armor, increased resistances, partially immune to control effects, immune to poison-based effects, mail/plate armor, deals melee/spellshadow damage, spell power bonus: 200% strength. Main attribute: Strength.$B$BImpale. Crypt Lord slams the ground with his massive claws, shooting spikes out in a frontal cone, dealing damage and hurling enemy units into the air in their wake, stunning them. Unlocked at level 20.$B$BSpiked Carapace. Crypt Lord\\'s chitinous armor increases damage resistance and returns 15% to 50% damage to enemy melee attackers.$B$BCarrion Beetles. Crypt Lord progenerates a Carrion Beetle from a fresh corpse of an enemy to attack his enemies. Beetles are permanent but do not regenerate health and only 6 can be controlled at a time. Higher levels allow Crypt Lord to summon more powerful beetles. Unlocked at level 10.$B$BLocust Swarm. Crypt Lord releases a swarm of 20-40 (depends on Crypt Lord\\'s level) angry locusts that bite and tear at nearby enemy units, reducing their ability to move or attack. As they chew the enemy flesh, they convert it into a substance that restores hit points to the Crypt Lord when they return. Unlocked at level 40.$B$B',-1);\n+\n+SET @LOCALIZED_STRINGS_START = 70667;\n+SET @LOCALIZED_STRINGS_END   = 70672;\n+\n+DELETE FROM `npc_text` WHERE ID BETWEEN @LOCALIZED_STRINGS_START and @LOCALIZED_STRINGS_END;\n+INSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n+(70667,'Do you really want to spend all this money to make Crypt Lord move again?','-1'),\n+(70668,'I doubt your ability to do much harm in your current state, but I am willing to lead you and help you restore your powers.','-1'),\n+(70669,'Crypt Lords','-1'),\n+(70670,'Crypt Lord','-1'),\n+(70671,'Reflect','-1'),\n+(70672,'Locusts','-1');\ndiff --git a/data/sql/custom/db_world/2023_06_02_00_creature_template_npcbot_extras.sql b/data/sql/custom/db_world/2023_06_02_00_creature_template_npcbot_extras.sql\nnew file mode 100644\nindex 0000000000..778d13d7a8\n--- /dev/null\n+++ b/data/sql/custom/db_world/2023_06_02_00_creature_template_npcbot_extras.sql\n@@ -0,0 +1,2 @@\n+--\n+UPDATE `creature_template_npcbot_wander_nodes` SET `flags`='1' WHERE (`id`='283');\ndiff --git a/data/sql/custom/db_world/2023_06_03_00_creature_template.sql b/data/sql/custom/db_world/2023_06_03_00_creature_template.sql\nnew file mode 100644\nindex 0000000000..c55f7313b1\n--- /dev/null\n+++ b/data/sql/custom/db_world/2023_06_03_00_creature_template.sql\n@@ -0,0 +1,2 @@\n+--\n+UPDATE `creature_template` SET `flags_extra`=(`flags_extra`|0x80000000) WHERE `entry` > 70000 AND (`flags_extra`&0x8E000000) IN (0xE000000, 0xA000000);\ndiff --git a/data/sql/custom/db_world/2023_06_09_00_creature_template_npcbot_wander_nodes.sql b/data/sql/custom/db_world/2023_06_09_00_creature_template_npcbot_wander_nodes.sql\nnew file mode 100644\nindex 0000000000..725842fa36\n--- /dev/null\n+++ b/data/sql/custom/db_world/2023_06_09_00_creature_template_npcbot_wander_nodes.sql\n@@ -0,0 +1,2627 @@\n+--\n+SET @WP_START = 2418;\n+SET @WP_END   = 5038;\n+\n+DELETE FROM `creature_template_npcbot_wander_nodes` WHERE `id` BETWEEN @WP_START AND @WP_END;\n+INSERT INTO `creature_template_npcbot_wander_nodes`(`id`,`name`,`mapid`,`zoneid`,`areaid`,`minlevel`,`maxlevel`,`flags`,`x`,`y`,`z`,`o`,`links`) VALUES\n+('2418','hellfire001','530','3483','3804','60','63','0','-88.1661','1757.73','61.4158','2.30551','2419:0 2422:0 '),\n+('2419','hellfire002','530','3483','3804','60','63','0','-130.83','1837.76','78.4899','5.22012','2418:0 2420:0 2422:0 '),\n+('2420','hellfire003','530','3483','3542','60','63','0','-228.144','1920.56','96.8968','1.90495','2419:0 2421:0 2422:0 '),\n+('2421','hellfire004','530','3483','3542','60','63','1','-207.846','2150.92','80.3185','1.58606','2420:0 2442:0 2453:0 '),\n+('2422','hellfire005','530','3483','3804','60','63','0','-320.252','1725.48','60.1535','0.383608','2418:0 2419:0 2420:0 2423:0 '),\n+('2423','hellfire006','530','3483','3804','60','63','0','-443.68','1809.38','64.2507','6.17593','2422:0 2424:0 '),\n+('2424','hellfire007','530','3483','3815','60','63','0','-614.482','1855.41','72.3221','2.91339','2423:0 2425:0 '),\n+('2425','hellfire008','530','3483','3483','60','63','0','-772.087','1924.89','51.3142','3.69486','2424:0 2426:0 2427:0 '),\n+('2426','hellfire009','530','3483','3582','60','63','0','-890.066','1889.54','71.6232','2.99193','2425:0 '),\n+('2427','hellfire010','530','3483','3483','60','63','0','-665.15','2133.08','41.0304','6.09818','2425:0 2428:0 '),\n+('2428','hellfire011','530','3483','3483','60','63','0','-830.651','2170.3','10.6442','6.00392','2427:0 2429:0 '),\n+('2429','hellfire012','530','3483','3582','60','63','0','-1044.48','2221.12','18.1881','2.68955','2428:0 2430:0 2432:0 '),\n+('2430','hellfire013','530','3483','3582','60','63','0','-1060.21','2075.54','65.7492','1.53579','2429:0 2431:0 '),\n+('2431','hellfire014','530','3483','3582','60','63','0','-1136.98','1968.35','74.7199','4.3593','2430:0 '),\n+('2432','hellfire015','530','3483','3483','60','63','0','-1116.71','2366.85','26.2','1.55936','2429:0 2433:0 '),\n+('2433','hellfire016','530','3483','3483','60','63','0','-1209.75','2517.59','48.9283','1.97249','2432:0 '),\n+('2434','hellfire017','530','3483','3483','60','63','0','-927.061','2680.73','24.4655','4.225','2435:0 2438:0 '),\n+('2435','hellfire018','530','3483','3483','60','63','0','-991.176','2930.18','4.1955','4.89571','2434:0 2458:0 2459:0 '),\n+('2436','hellfire019','530','3483','3483','60','63','0','-652.576','2459.81','56.8494','0.00658825','2437:0 2438:0 '),\n+('2437','hellfire020','530','3483','3483','60','63','0','-382.816','2594.23','50.224','3.72781','2436:0 '),\n+('2438','hellfire021','530','3483','3538','60','63','3','-721.67','2675.81','95.7509','0.770785','2434:0 2436:0 '),\n+('2439','hellfire022','530','3483','3483','60','63','0','-449.715','2925.64','21.2132','0.32312','2440:0 '),\n+('2440','hellfire023','530','3483','3483','60','63','0','-593.071','2998.53','15.8438','0.017592','2439:0 2441:0 '),\n+('2441','hellfire024','530','3483','3483','60','63','0','-749.912','3117.85','4.88152','5.75179','2440:0 2458:0 2499:0 '),\n+('2442','hellfire025','530','3483','3483','60','63','0','-80.7943','2320.17','65.6333','4.50299','2421:0 2443:0 2446:0 2453:0 '),\n+('2443','hellfire026','530','3483','3483','60','63','0','18.4377','2469.36','53.639','4.22811','2442:0 2444:0 2446:0 '),\n+('2444','hellfire027','530','3483','3536','60','63','4','33.0662','2661.07','75.7738','3.89274','2443:0 2445:0 '),\n+('2445','hellfire028','530','3483','3536','60','63','5','221.743','2789.93','121.175','3.98307','2444:0 2496:0 '),\n+('2446','hellfire029','530','3483','3793','60','63','0','158.425','2334.4','54.1841','5.04414','2442:0 2443:0 2447:0 '),\n+('2447','hellfire030','530','3483','3793','60','63','0','270.62','2240.47','56.9978','2.96989','2446:0 2448:0 '),\n+('2448','hellfire031','530','3483','3793','60','63','0','255.635','2040.2','31.817','2.78925','2447:0 2449:0 '),\n+('2449','hellfire032','530','3483','3483','60','63','0','446.912','2049.26','99.1622','3.3783','2448:0 2450:0 '),\n+('2450','hellfire033','530','3483','3483','60','63','0','442.066','2351.62','123.026','4.69385','2449:0 2451:0 '),\n+('2451','hellfire034','530','3483','3483','60','63','0','438.394','2661.09','177.718','4.90591','2450:0 2452:0 '),\n+('2452','hellfire035','530','3483','3549','60','63','0','549.636','2796.65','217.8','4.31374','2451:0 '),\n+('2453','hellfire036','530','3483','3542','60','63','0','-220.959','2363','37.4537','1.6049','2421:0 2442:0 2454:0 '),\n+('2454','hellfire037','530','3483','3542','60','63','0','-248.594','2648.76','-11.9763','4.88786','2453:0 2455:0 '),\n+('2455','hellfire038','530','3483','3542','60','63','0','-270.052','2895.86','-55.0992','4.86824','2454:0 2456:0 2457:0 '),\n+('2456','hellfire039','530','3483','3545','60','63','0','-371.638','3039.8','-63.8946','5.60259','2455:0 '),\n+('2457','hellfire040','530','3483','3545','60','63','0','-243.298','3044.75','-65.4235','4.48185','2455:0 '),\n+('2458','hellfire041','530','3483','3483','60','63','0','-930.007','3088.24','16.9479','0.133084','2435:0 2441:0 2459:0 2466:0 '),\n+('2459','hellfire042','530','3483','3483','60','63','0','-1233.86','3071.59','29.2379','5.81622','2458:0 2435:0 2460:0 2462:0 '),\n+('2460','hellfire043','530','3483','3796','60','63','0','-1370.5','2890.29','-26.0325','3.35557','2459:0 2461:0 '),\n+('2461','hellfire044','530','3483','3546','60','63','0','-1257.98','2677.11','1.84108','2.88824','2460:0 '),\n+('2462','hellfire045','530','3483','3483','60','63','0','-1343.14','3305.78','47.482','2.24265','2459:0 2463:0 '),\n+('2463','hellfire046','530','3483','3765','60','63','0','-1519.57','3487.42','30.3847','2.18217','2462:0 2464:0 '),\n+('2464','hellfire047','530','3483','3765','60','63','0','-1621.55','3645.56','31.4811','1.74235','2463:0 2465:0 '),\n+('2465','hellfire048','530','3483','3765','60','63','0','-1680.38','3854.3','36.4441','1.97326','2464:0 2784:0 '),\n+('2466','hellfire049','530','3483','3483','60','63','0','-1003.35','3339.19','79.143','4.83211','2458:0 2467:0 '),\n+('2467','hellfire050','530','3483','3483','60','63','0','-866.12','3482.05','93.6018','3.97209','2466:0 2468:0 '),\n+('2468','hellfire051','530','3483','3543','60','63','0','-842.626','3645.6','31.4407','5.28056','2467:0 2469:0 '),\n+('2469','hellfire052','530','3483','3543','60','63','0','-578.854','3725.85','28.9962','3.4176','2468:0 2470:0 '),\n+('2470','hellfire053','530','3483','3543','60','63','0','-629.058','3954.17','28.9952','4.88236','2469:0 2471:0 2472:0 2474:0 '),\n+('2471','hellfire054','530','3483','3483','60','63','0','-503.474','4084.93','51.2172','4.03729','2470:0 2474:0 2481:0 '),\n+('2472','hellfire055','530','3483','3543','60','63','0','-841.235','4095.51','32.9704','5.79579','2470:0 2473:0 2474:0 2477:0 '),\n+('2473','hellfire056','530','3483','3483','60','63','0','-950.497','4184.92','29.5337','3.20635','2472:0 2475:0 2477:0 '),\n+('2474','hellfire057','530','3483','3554','60','63','5','-659.228','4167.05','67.8382','3.41684','2470:0 2471:0 2472:0 2481:0 '),\n+('2475','hellfire058','530','3483','3556','60','63','0','-1174.94','4209.88','20.9412','0.188851','2473:0 2476:0 '),\n+('2476','hellfire059','530','3483','3798','60','63','0','-1287.84','4075.76','93.8567','5.93954','2475:0 '),\n+('2477','hellfire060','530','3483','3483','60','63','0','-1036.95','4000.75','83.0333','2.90005','2472:0 2473:0 2478:0 '),\n+('2478','hellfire061','530','3483','3483','60','63','0','-891.162','4017.27','84.496','3.16788','2477:0 2479:0 '),\n+('2479','hellfire062','530','3483','3543','60','63','0','-799.397','3955.75','91.0415','2.42568','2478:0 2480:0 '),\n+('2480','hellfire063','530','3483','3483','60','63','0','-766.496','3789.21','113.362','1.77223','2479:0 '),\n+('2481','hellfire064','530','3483','3483','60','63','0','-593.759','4335.47','52.0515','4.60437','2474:0 2471:0 2482:0 '),\n+('2482','hellfire065','530','3483','3483','60','63','0','-336.014','4367.15','59.658','3.93679','2481:0 2483:0 2509:0 '),\n+('2483','hellfire066','530','3483','3483','60','63','0','-202.4','4447.51','42.6762','3.81506','2482:0 2484:0 2506:0 2509:0 '),\n+('2484','hellfire067','530','3483','3483','60','63','0','-100.749','4241.25','83.9687','2.24269','2483:0 2485:0 2487:0 2489:0 2505:0 '),\n+('2485','hellfire068','530','3483','3552','60','63','2','63.0268','4335.15','96.8814','6.21365','2484:0 2486:0 2487:0 '),\n+('2486','hellfire069','530','3483','3552','60','63','3','215.545','4332.38','119.241','2.95661','2485:0 '),\n+('2487','hellfire070','530','3483','3483','60','63','0','39.4389','4153.06','71.524','1.85939','2484:0 2485:0 2488:0 2489:0 2505:0 '),\n+('2488','hellfire071','530','3483','3483','60','63','0','150.282','3945.51','79.661','2.2835','2487:0 2489:0 2515:0 '),\n+('2489','hellfire072','530','3483','3483','60','63','0','-96.2588','3960.84','99.7364','0.521852','2484:0 2488:0 2487:0 2490:0 2505:0 '),\n+('2490','hellfire073','530','3483','3669','60','63','0','-120.509','3779.67','72.1233','1.75885','2489:0 2491:0 '),\n+('2491','hellfire074','530','3483','3553','60','63','0','-61.6848','3514.21','73.5858','5.1667','2490:0 2492:0 2494:0 2498:0 '),\n+('2492','hellfire075','530','3483','3553','60','63','0','318.42','3476.5','61.5198','2.95581','2491:0 2493:0 '),\n+('2493','hellfire076','530','3483','3553','60','63','0','383.974','3310.89','74.522','1.91516','2492:0 '),\n+('2494','hellfire077','530','3483','3483','60','63','0','-44.2798','3288.99','27.2629','1.47534','2491:0 2495:0 2498:0 '),\n+('2495','hellfire078','530','3483','3483','60','63','0','-43.1353','3087.28','-1.55873','1.59942','2494:0 2496:0 '),\n+('2496','hellfire079','530','3483','3483','60','63','0','312.814','2983.21','19.5651','2.81914','2445:0 2495:0 2497:0 '),\n+('2497','hellfire080','530','3483','3799','60','63','0','459.167','3040.66','17.0606','3.687','2496:0 '),\n+('2498','hellfire081','530','3483','3670','60','63','0','-182.907','3456.14','39.4587','0.671851','2491:0 2494:0 '),\n+('2499','hellfire082','530','3483','3671','60','63','0','-567.836','3269.14','15.2208','4.86979','2441:0 2500:0 '),\n+('2500','hellfire083','530','3483','3671','60','63','0','-549.666','3476.52','45.226','4.64597','2499:0 2501:0 2502:0 '),\n+('2501','hellfire084','530','3483','3671','60','63','0','-445.867','3462.18','37.6671','2.82071','2500:0 '),\n+('2502','hellfire085','530','3483','3669','60','63','0','-452.212','3658.72','45.9024','0.816375','2500:0 2503:0 '),\n+('2503','hellfire086','530','3483','3483','60','63','0','-378.049','3871.34','62.3491','4.48419','2502:0 2504:0 '),\n+('2504','hellfire087','530','3483','3669','60','63','0','-294.007','3742.96','51.9568','2.11386','2503:0 2505:0 '),\n+('2505','hellfire088','530','3483','3483','60','63','0','-203.95','4100.77','98.2207','5.35677','2484:0 2487:0 2489:0 2504:0 '),\n+('2506','hellfire089','530','3483','3483','60','63','1','-249.051','4768.73','14.6773','1.56722','2483:0 2507:0 2508:0 2509:0 2512:0 2513:0 '),\n+('2507','hellfire090','530','3483','3797','60','63','0','13.8026','4691.45','41.6534','6.21284','2506:0 2513:0 '),\n+('2508','hellfire091','530','3483','3551','60','63','0','-556.09','4800.17','34.169','3.11602','2506:0 2509:0 2512:0 '),\n+('2509','hellfire092','530','3483','3483','60','63','0','-412.14','4578.53','39.0585','2.37774','2506:0 2482:0 2483:0 2508:0 2512:0 '),\n+('2510','hellfire093','530','3483','3800','60','63','0','-259.551','5042.36','65.21','1.36455','2511:0 2517:0 '),\n+('2511','hellfire094','530','3483','3795','60','63','0','-403.556','4975.22','40.4154','0.508468','2510:0 2512:0 '),\n+('2512','hellfire095','530','3483','3795','60','63','0','-417.252','4788.73','19.9639','2.94399','2509:0 2506:0 2508:0 2511:0 '),\n+('2513','hellfire096','530','3483','3797','60','63','0','-68.76','4846.8','50.753','4.86823','2506:0 2507:0 2514:0 '),\n+('2514','hellfire097','530','3483','3797','60','63','0','173.831','4854.22','77.6594','3.44272','2513:0 '),\n+('2515','hellfire098','530','3483','3483','60','63','0','335.776','4014.33','100.063','3.83622','2488:0 2516:0 '),\n+('2516','hellfire099','530','3483','3483','60','63','0','353.816','3871.24','144.979','1.47611','2515:0 '),\n+('2517','hellfire100','530','3483','3800','60','63','0','-234.311','5165.64','83.9852','4.49598','2510:0 2518:0 '),\n+('2518','zangar101','530','3521','3521','61','64','0','-271.021','5303.67','41.8812','4.77871','2517:0 2519:0 '),\n+('2519','zangar102','530','3521','3565','61','64','1','-220.592','5436.56','21.669','5.30379','2518:0 2520:0 2521:0 '),\n+('2520','zangar103','530','3521','3521','61','64','0','-84.4992','5395.31','22.3401','3.21027','2519:0 2659:0 '),\n+('2521','zangar104','530','3521','3521','61','64','0','-395.049','5385.52','18.5881','6.06676','2519:0 2522:0 '),\n+('2522','zangar105','530','3521','3521','61','64','0','-535.462','5435.61','20.9825','5.81938','2521:0 2523:0 '),\n+('2523','zangar106','530','3521','3521','61','64','0','-672.658','5367.99','22.9724','0.237551','2522:0 2524:0 '),\n+('2524','zangar107','530','3521','3641','61','64','0','-758.891','5282.57','17.6121','1.72588','2523:0 2525:0 '),\n+('2525','zangar108','530','3521','3641','61','64','0','-813.122','5198.88','19.1746','1.05202','2524:0 2526:0 '),\n+('2526','zangar109','530','3521','3641','61','64','0','-976.189','5260.97','19.0927','6.05108','2525:0 2527:0 2672:0 '),\n+('2527','zangar110','530','3521','3521','61','64','0','-934.208','5419.78','22.8095','4.46851','2526:0 2528:0 2672:0 '),\n+('2528','zangar111','530','3521','3521','61','64','0','-966.5','5606.91','22.0137','4.97508','2527:0 2529:0 '),\n+('2529','zangar112','530','3521','3521','61','64','0','-912.293','5682.09','21.6937','5.08504','2528:0 2530:0 '),\n+('2530','zangar113','530','3521','3521','61','64','0','-913.195','5896.44','20.1725','4.59652','2529:0 2531:0 2534:0 '),\n+('2531','zangar114','530','3521','3521','61','64','0','-909.682','6045.49','19.7314','4.59651','2530:0 2532:0 2534:0 2535:0 '),\n+('2532','zangar115','530','3521','3521','61','64','0','-1037.12','6091.11','19.5931','5.89242','2531:0 2533:0 '),\n+('2533','zangar116','530','3521','3521','61','64','0','-1163.58','6201.43','53.0219','5.61282','2532:0 2671:0 '),\n+('2534','zangar117','530','3521','3841','61','64','0','-796.58','5918.23','22.3409','2.31415','2530:0 2531:0 2535:0 '),\n+('2535','zangar118','530','3521','3521','61','64','0','-701.347','6013.97','22.3146','3.22521','2534:0 2531:0 2536:0 2537:0 '),\n+('2536','zangar119','530','3521','3841','61','64','0','-592.408','5933.75','20.813','5.51464','2535:0 2537:0 '),\n+('2537','zangar120','530','3521','3521','61','64','0','-504.59','6048.64','23.1686','4.20775','2536:0 2535:0 2538:0 '),\n+('2538','zangar121','530','3521','3841','61','64','0','-495.325','5854.59','20.3458','2.52376','2537:0 2539:0 '),\n+('2539','zangar122','530','3521','3521','61','64','0','-318.55','6013.33','23.3657','3.50315','2538:0 2540:0 2654:0 '),\n+('2540','zangar123','530','3521','3819','61','64','0','-352.699','6158.62','21.7844','4.91293','2539:0 2541:0 2654:0 '),\n+('2541','zangar124','530','3521','3819','61','64','0','-338.739','6298.09','21.04','4.63411','2540:0 2542:0 '),\n+('2542','zangar125','530','3521','3819','61','64','0','-409.277','6401.64','21.9404','0.801373','2541:0 2543:0 2546:0 '),\n+('2543','zangar126','530','3521','3819','61','64','0','-230.832','6354.36','21.7058','3.81024','2542:0 2544:0 '),\n+('2544','zangar127','530','3521','3659','61','64','0','-139.857','6456.59','20.0973','3.85658','2543:0 2545:0 2653:0 '),\n+('2545','zangar128','530','3521','3659','61','64','0','-269.671','6613.48','23.0533','4.34353','2544:0 2546:0 '),\n+('2546','zangar129','530','3521','3659','61','64','0','-383.175','6598.68','22.9642','4.52024','2542:0 2545:0 2547:0 '),\n+('2547','zangar130','530','3521','3659','61','64','0','-215.725','6703.55','20.6145','4.19588','2546:0 2548:0 2549:0 '),\n+('2548','zangar131','530','3521','3659','61','64','0','-63.9463','6759.2','20.4434','3.22986','2547:0 2549:0 2555:0 '),\n+('2549','zangar132','530','3521','3659','61','64','0','-261.475','6823.98','21.6241','5.85702','2547:0 2548:0 2550:0 '),\n+('2550','zangar133','530','3521','3642','61','64','0','-208.234','6950.07','20.1839','0.893301','2549:0 2551:0 '),\n+('2551','zangar134','530','3521','3642','61','64','0','-126.36','7041.34','18.9083','3.86997','2550:0 2552:0 '),\n+('2552','zangar135','530','3521','3642','61','64','0','-50.056','7132.44','19.2134','4.60817','2551:0 2553:0 '),\n+('2553','zangar136','530','3521','3521','61','64','0','64.7648','7212.88','22.0782','0.46519','2552:0 2554:0 2562:0 2563:0 2574:0 '),\n+('2554','zangar137','530','3521','3521','61','64','0','44.854','7014.88','23.4767','1.78543','2553:0 2555:0 '),\n+('2555','zangar138','530','3521','3521','61','64','0','43.5835','6871.99','22.3894','4.7567','2554:0 2548:0 2556:0 2557:0 '),\n+('2556','zangar139','530','3521','3521','61','64','0','157.048','6719.99','20.4444','2.3259','2555:0 2557:0 2641:0 '),\n+('2557','zangar140','530','3521','3720','61','64','0','223.784','6824.17','25.6438','3.74197','2555:0 2556:0 2558:0 2641:0 '),\n+('2558','zangar141','530','3521','3720','61','64','0','234.681','6926.14','23.7418','4.49203','2557:0 2559:0 '),\n+('2559','zangar142','530','3521','3720','61','64','0','212.404','7079.58','35.2277','4.69231','2558:0 2560:0 '),\n+('2560','zangar143','530','3521','3720','61','64','0','220.362','7208.94','25.1738','4.71196','2559:0 2561:0 '),\n+('2561','zangar144','530','3521','3720','61','64','0','336.506','7340.86','41.5461','4.13471','2560:0 2562:0 2633:0 '),\n+('2562','zangar145','530','3521','3720','61','64','0','157.889','7365.75','22.1067','6.02358','2553:0 2561:0 2563:0 '),\n+('2563','zangar146','530','3521','3521','61','64','0','63.1597','7443.51','22.1993','5.2932','2553:0 2562:0 2564:0 2574:0 '),\n+('2564','zangar147','530','3521','3521','61','64','0','115.528','7547.02','21.6598','4.53135','2563:0 2565:0 2569:0 '),\n+('2565','zangar148','530','3521','3521','61','64','0','118.141','7658.13','21.5634','4.72141','2564:0 2566:0 2569:0 2575:0 2633:0 '),\n+('2566','zangar149','530','3521','3521','61','64','4','246.937','7753.08','23.1428','3.93445','2565:0 2567:0 2569:0 2575:0 2633:0 '),\n+('2567','zangar150','530','3521','3645','61','64','5','264.306','7863.47','23.7956','4.64131','2566:0 2568:0 2569:0 2575:0 '),\n+('2568','zangar151','530','3521','3521','61','64','4','449.39','7844.62','22.0319','3.04694','2567:0 2615:0 '),\n+('2569','zangar152','530','3521','3521','61','64','0','81.5617','7740.29','21.6356','3.14119','2564:0 2565:0 2566:0 2567:0 2570:0 2575:0 '),\n+('2570','zangar153','530','3521','3521','61','64','0','-28.0868','7736.24','20.5893','6.25922','2569:0 2571:0 2575:0 2582:0 '),\n+('2571','zangar154','530','3521','3521','61','64','0','-170.551','7601.35','23.3202','0.757515','2570:0 2572:0 2581:0 '),\n+('2572','zangar155','530','3521','3521','61','64','0','-174.825','7443.51','21.9702','1.57433','2571:0 2573:0 2574:0 '),\n+('2573','zangar156','530','3521','3642','61','64','0','-120.981','7305.7','23.422','1.77461','2572:0 2574:0 '),\n+('2574','zangar157','530','3521','3521','61','64','0','-20.2426','7327.37','23.7348','2.19481','2573:0 2572:0 2563:0 2553:0 '),\n+('2575','zangar158','530','3521','3521','61','64','0','84.0333','7841.91','22.0373','4.55886','2565:0 2566:0 2567:0 2569:0 2570:0 2576:0 '),\n+('2576','zangar159','530','3521','3521','61','64','0','65.13','7971.37','21.6779','4.89266','2575:0 2577:0 '),\n+('2577','zangar160','530','3521','3521','61','64','0','43.5829','8117.3','22.3841','4.94372','2576:0 2578:0 2598:0 '),\n+('2578','zangar161','530','3521','3521','61','64','0','-49.1017','8195.83','23.1999','5.71343','2577:0 2579:0 2583:0 2587:0 '),\n+('2579','zangar162','530','3521','3646','61','64','0','-209.87','8126.35','19.9595','0.261968','2578:0 2580:0 2582:0 2583:0 '),\n+('2580','zangar163','530','3521','3646','61','64','0','-261.772','7885.5','18.5845','1.41258','2579:0 2581:0 2582:0 '),\n+('2581','zangar164','530','3521','3521','61','64','0','-259.719','7720.02','20.8878','1.65605','2571:0 2580:0 '),\n+('2582','zangar165','530','3521','3646','61','64','0','-98.2706','7905.01','21.2267','4.92567','2570:0 2579:0 2580:0 '),\n+('2583','zangar166','530','3521','3521','61','64','0','-180.804','8271.58','22.3452','2.13749','2578:0 2579:0 2584:0 2587:0 '),\n+('2584','zangar167','530','3521','3521','61','64','0','-280.916','8401.01','22.613','5.34193','2583:0 2585:0 '),\n+('2585','zangar168','530','3521','3521','61','64','0','-414.115','8416.71','22.9544','6.2098','2584:0 2586:0 2949:0 '),\n+('2586','zangar169','530','3521','3521','61','64','0','-208.705','8507.09','22.1101','4.05625','2585:0 2587:0 '),\n+('2587','zangar170','530','3521','3521','61','64','0','-76.6423','8339.54','20.5708','1.28772','2583:0 2578:0 2586:0 2588:0 '),\n+('2588','zangar171','530','3521','3521','61','64','0','2.14825','8447.62','24.0799','1.18326','2587:0 2589:0 2596:0 '),\n+('2589','zangar172','530','3521','3647','61','64','0','-67.5414','8574.38','21.4033','5.22493','2588:0 2590:0 2596:0 '),\n+('2590','zangar173','530','3521','3647','61','64','0','-131.783','8711.6','20.1378','5.16367','2589:0 2591:0 '),\n+('2591','zangar174','530','3521','3647','61','64','0','-58.2395','8845.13','19.6236','4.45683','2590:0 2592:0 '),\n+('2592','zangar175','530','3521','3647','61','64','0','-158.14','8998.32','22.6743','5.39853','2591:0 2593:0 '),\n+('2593','zangar176','530','3521','3521','61','64','0','49.2289','8919.95','22.8353','4.08298','2592:0 2594:0 2612:0 '),\n+('2594','zangar177','530','3521','3658','61','64','0','191.332','8791.02','22.5064','3.15621','2593:0 2595:0 '),\n+('2595','zangar178','530','3521','3658','61','64','0','100.838','8633.77','22.3518','1.01992','2594:0 2596:0 '),\n+('2596','zangar179','530','3521','3521','61','64','0','46.3545','8528.92','21.3211','3.67772','2588:0 2589:0 2595:0 2597:0 '),\n+('2597','zangar180','530','3521','3521','61','64','1','201.143','8506.92','24.4625','4.24664','2596:0 2598:0 '),\n+('2598','zangar181','530','3521','3656','61','64','0','176.313','8271.1','19.3723','2.275','2577:0 2597:0 2599:0 '),\n+('2599','zangar182','530','3521','3656','61','64','0','285.943','8219.3','20.2926','3.15229','2598:0 2600:0 '),\n+('2600','zangar183','530','3521','3656','61','64','0','386.339','8346.33','22.789','4.31625','2599:0 2601:0 '),\n+('2601','zangar184','530','3521','3656','61','64','0','494.267','8437.25','21.4802','4.07671','2600:0 2602:0 2609:0 2613:0 '),\n+('2602','zangar185','530','3521','3656','61','64','0','608.933','8508.26','22.3504','3.55914','2601:0 2603:0 2609:0 '),\n+('2603','zangar186','530','3521','3521','61','64','0','742.61','8532.55','22.4318','3.26227','2602:0 2604:0 2608:0 2609:0 '),\n+('2604','zangar187','530','3521','3521','61','64','0','895.923','8416.01','24.0337','2.57898','2603:0 2605:0 '),\n+('2605','zangar188','530','3521','3650','61','64','0','1075.84','8407.67','22.4904','3.12875','2604:0 2606:0 2607:0 2620:0 '),\n+('2606','zangar189','530','3521','3650','61','64','0','1227.41','8505.09','22.644','3.70367','2605:0 2607:0 2621:0 '),\n+('2607','zangar190','530','3521','3650','61','64','0','1037.11','8556.71','23.1526','5.52971','2605:0 2606:0 2608:0 '),\n+('2608','zangar191','530','3521','3521','61','64','0','838.679','8631.92','21.121','3.9','2607:0 2603:0 '),\n+('2609','zangar192','530','3521','3657','61','64','0','532.243','8648.7','20.2148','1.72209','2601:0 2602:0 2603:0 2610:0 '),\n+('2610','zangar193','530','3521','3521','61','64','0','500.585','8831.78','29.9762','3.31252','2609:0 2611:0 '),\n+('2611','zangar194','530','3521','3521','61','64','0','312.939','8988.81','29.3602','2.17448','2610:0 2612:0 '),\n+('2612','zangar195','530','3521','3521','61','64','0','153.844','9001.52','20.6373','4.20787','2593:0 2611:0 '),\n+('2613','zangar196','530','3521','3643','61','64','0','634.189','8249.73','20.9802','4.23537','2601:0 2614:0 '),\n+('2614','zangar197','530','3521','3643','61','64','0','610.771','8068.12','19.5665','1.60114','2613:0 2615:0 2617:0 '),\n+('2615','zangar198','530','3521','3667','61','64','0','579.736','7860.06','21.923','1.46997','2568:0 2614:0 2616:0 '),\n+('2616','zangar199','530','3521','3667','61','64','0','737.751','7895.31','21.9665','6.19807','2615:0 2617:0 '),\n+('2617','zangar200','530','3521','3521','61','64','0','787.048','8075.83','19.8301','1.19115','2614:0 2616:0 2618:0 '),\n+('2618','zangar201','530','3521','3667','61','64','0','940.179','8075.93','22.3322','3.07219','2617:0 2619:0 2625:0 '),\n+('2619','zangar202','530','3521','3667','61','64','0','1079.94','8078.99','22.0839','3.44134','2618:0 2620:0 2624:0 '),\n+('2620','zangar203','530','3521','3640','61','64','0','1142.01','8208.94','18.3815','1.68911','2605:0 2619:0 2624:0 '),\n+('2621','zangar204','530','3521','3650','61','64','0','1365.27','8597.28','20.4376','3.62905','2606:0 2622:0 '),\n+('2622','zangar205','530','3521','3650','61','64','0','1473.46','8617.75','-19.2604','3.20336','2621:0 2623:0 '),\n+('2623','zangar206','530','3521','3651','61','64','0','1617.83','8604.6','-25.7602','3.11932','2622:0 '),\n+('2624','zangar207','530','3521','3521','61','64','0','1204.46','7994.66','23.5559','2.79496','2619:0 2620:0 2625:0 '),\n+('2625','zangar208','530','3521','3667','61','64','0','985.581','7906.61','21.9749','1.94279','2618:0 2624:0 2626:0 '),\n+('2626','zangar209','530','3521','3667','61','64','0','924.71','7759.51','22.2632','4.47963','2625:0 2627:0 '),\n+('2627','zangar210','530','3521','3667','61','64','0','972.886','7540.98','20.6745','5.06474','2626:0 2628:0 '),\n+('2628','zangar211','530','3521','3766','61','64','3','1008.04','7381.67','36.2454','2.67557','2627:0 2629:0 3123:0 '),\n+('2629','zangar212','530','3521','3521','61','64','2','888.478','7369.16','20.9021','3.3785','2628:0 2630:0 2634:0 '),\n+('2630','zangar213','530','3521','3521','61','64','0','749.898','7401.62','22.0246','0.295815','2629:0 2631:0 2634:0 '),\n+('2631','zangar214','530','3521','3653','61','64','0','578.096','7540.84','19.4559','5.3043','2630:0 2632:0 '),\n+('2632','zangar215','530','3521','3653','61','64','0','453.399','7459.1','23.6644','2.9591','2631:0 2633:0 '),\n+('2633','zangar216','530','3521','3521','61','64','0','301.56','7502.53','18.7007','4.88489','2561:0 2632:0 2566:0 2565:0 '),\n+('2634','zangar217','530','3521','3653','61','64','0','723.766','7219.4','18.4476','1.52104','2629:0 2630:0 2635:0 '),\n+('2635','zangar218','530','3521','3653','61','64','0','828.704','7046.99','21.9746','5.47316','2634:0 2636:0 '),\n+('2636','zangar219','530','3521','3521','61','64','0','813.291','6859.8','21.1175','4.5346','2635:0 2637:0 '),\n+('2637','zangar220','530','3521','3521','61','64','0','786.813','6686.79','19.6235','4.77415','2636:0 2638:0 '),\n+('2638','zangar221','530','3521','3521','61','64','0','739.145','6548.18','21.4284','2.68185','2637:0 2639:0 2646:0 '),\n+('2639','zangar222','530','3521','3653','61','64','0','533.697','6616.1','23.4617','5.98523','2638:0 2640:0 2646:0 '),\n+('2640','zangar223','530','3521','3521','61','64','0','392.669','6497.59','21.0234','1.88546','2639:0 2641:0 2642:0 2646:0 '),\n+('2641','zangar224','530','3521','3521','61','64','0','309.995','6655.73','21.2137','5.01134','2556:0 2640:0 2557:0 '),\n+('2642','zangar225','530','3521','3521','61','64','0','377.938','6282.83','22.023','4.47492','2640:0 2643:0 '),\n+('2643','zangar226','530','3521','3521','61','64','0','413.817','6144.54','22.2423','1.89569','2642:0 2644:0 2649:0 '),\n+('2644','zangar227','530','3521','3521','61','64','0','588.059','6075.05','22.5742','2.63553','2643:0 2645:0 2647:0 2670:0 '),\n+('2645','zangar228','530','3521','3818','61','64','0','603.408','6285.69','21.8038','4.64065','2644:0 2646:0 2647:0 '),\n+('2646','zangar229','530','3521','3653','61','64','0','621.81','6442.18','20.5988','2.00643','2638:0 2639:0 2640:0 2645:0 '),\n+('2647','zangar230','530','3521','3521','61','64','0','691.526','6136.65','24.626','4.02491','2644:0 2645:0 2648:0 3018:0 '),\n+('2648','zangar231','530','3521','3521','61','64','0','718.677','6010.01','23.0266','4.85273','2647:0 2670:0 3018:0 '),\n+('2649','zangar232','530','3521','3644','61','64','3','284.699','5949','26.4296','1.71192','2643:0 2650:0 2657:0 '),\n+('2650','zangar233','530','3521','3521','61','64','2','171.4','6095.69','21.4396','5.75672','2649:0 2651:0 2654:0 2657:0 '),\n+('2651','zangar234','530','3521','3521','61','64','0','220.592','6179.94','22.7879','2.4926','2650:0 2652:0 '),\n+('2652','zangar235','530','3521','3521','61','64','0','109.112','6307.6','20.5752','2.47375','2651:0 2653:0 2654:0 '),\n+('2653','zangar236','530','3521','3659','61','64','0','-2.05183','6372.4','21.196','6.01275','2544:0 2652:0 '),\n+('2654','zangar237','530','3521','3521','61','64','0','-101.637','6148.49','20.9712','3.74609','2539:0 2540:0 2652:0 2650:0 2655:0 '),\n+('2655','zangar238','530','3521','3521','61','64','0','-95.8529','5919.89','21.912','1.45665','2654:0 2656:0 '),\n+('2656','zangar239','530','3521','3521','61','64','0','13.2803','5837.85','22.8222','2.53657','2655:0 2657:0 '),\n+('2657','zangar240','530','3521','3521','61','64','0','151.585','5801.02','22.4062','1.73938','2649:0 2650:0 2656:0 2658:0 '),\n+('2658','zangar241','530','3521','3521','61','64','0','12.867','5638.72','21.5024','0.850312','2657:0 2659:0 '),\n+('2659','zangar242','530','3521','3521','61','64','0','48.9274','5481.91','21.872','2.08181','2520:0 2658:0 2660:0 2662:0 '),\n+('2660','zangar243','530','3521','3521','61','64','4','71.9609','5332.54','21.9147','5.20377','2659:0 2661:0 2662:0 '),\n+('2661','zangar244','530','3521','3718','61','64','5','85.2911','5223.84','22.6669','1.80693','2660:0 '),\n+('2662','zangar245','530','3521','3648','61','64','0','158.923','5429.39','21.7352','4.09636','2660:0 2659:0 2663:0 '),\n+('2663','zangar246','530','3521','3648','61','64','0','315.219','5408.5','20.9134','6.16588','2662:0 2664:0 2665:0 '),\n+('2664','zangar247','530','3521','3648','61','64','0','377.232','5291.67','16.6948','0.491381','2663:0 2665:0 '),\n+('2665','zangar248','530','3521','3648','61','64','0','610.457','5425.64','-14.6579','4.20083','2663:0 2664:0 2666:0 2667:0 2668:0 '),\n+('2666','zangar249','530','3521','3648','61','64','0','820.719','5482.54','9.38793','3.43975','2665:0 2667:0 '),\n+('2667','zangar250','530','3521','3648','61','64','0','675.579','5207.73','-0.430108','1.71187','2665:0 2666:0 '),\n+('2668','zangar251','530','3521','3648','61','64','0','581.932','5617.72','21.5502','1.58306','2665:0 2669:0 '),\n+('2669','zangar252','530','3521','3521','61','64','0','549.492','5772.45','23.2954','1.1668','2668:0 2670:0 '),\n+('2670','zangar253','530','3521','3521','61','64','0','569.447','5936.2','20.4341','1.13146','2669:0 2648:0 2644:0 3018:0 '),\n+('2671','nagrand254','530','3521','3521','61','64','0','-1293.68','6268.96','47.863','5.30897','2533:0 2973:0 '),\n+('2672','zangar255','530','3521','3521','61','64','0','-1072.75','5374.44','23.0643','3.2316','2526:0 2527:0 2673:0 '),\n+('2673','tero256','530','3519','3519','61','64','0','-1193.26','5326.41','32.1568','3.76253','2672:0 2674:0 '),\n+('2674','tero257','530','3519','3519','61','64','0','-1352.86','5166.19','60.3214','0.730896','2673:0 2675:0 '),\n+('2675','tero258','530','3519','3519','61','64','0','-1481.09','5196.68','44.2804','2.26164','2674:0 2676:0 '),\n+('2676','tero259','530','3703','3703','61','64','0','-1562.26','5219.05','26.8104','5.79513','2675:0 2677:0 '),\n+('2677','tero260','530','3703','3703','61','64','0','-1646.24','5089.63','9.06231','3.96908','2676:0 2678:0 2679:0 '),\n+('2678','tero261','530','3519','3519','62','65','0','-1504.23','5007.75','-5.38562','2.6182','2677:0 '),\n+('2679','tero262','530','3703','3703','62','65','0','-1767.61','5061.37','7.70519','3.4303','2677:0 2680:0 '),\n+('2680','tero263','530','3703','3703','62','65','0','-1923.14','5054.44','19.4908','2.72737','2679:0 2681:0 2682:0 2787:0 '),\n+('2681','tero264','530','3519','3519','62','65','0','-1970.49','4974.82','28.2638','4.09397','2680:0 2770:0 2787:0 '),\n+('2682','tero265','530','3703','3703','62','65','0','-2043.23','5134.06','8.27497','5.68597','2680:0 2683:0 2787:0 '),\n+('2683','tero266','530','3519','3519','62','65','0','-2181.58','5096.17','-21.1362','0.23923','2682:0 2684:0 2685:0 2686:0 2787:0 '),\n+('2684','tero267','530','3519','3519','62','65','0','-2216.99','4909.63','1.39859','1.40554','2683:0 2787:0 '),\n+('2685','tero268','530','3519','3519','62','65','0','-2303.98','5268.43','-9.97572','5.28148','2683:0 2686:0 2687:0 2690:0 '),\n+('2686','tero269','530','3519','3682','62','65','0','-2344.61','5051.57','-2.04758','0.266708','2685:0 2683:0 2690:0 '),\n+('2687','tero270','530','3519','3677','62','65','0','-2431.44','5399.92','1.64547','5.51947','2685:0 2688:0 '),\n+('2688','tero271','530','3519','3519','62','65','0','-2521.64','5210.06','1.76945','1.04896','2687:0 2689:0 2691:0 '),\n+('2689','tero272','530','3519','3682','62','65','0','-2502.78','5113.56','7.96009','6.26007','2688:0 2690:0 2691:0 '),\n+('2690','tero273','530','3519','3519','62','65','0','-2359.81','5159.68','-3.26821','3.01403','2689:0 2685:0 2686:0 '),\n+('2691','tero274','530','3519','3519','62','65','0','-2640.66','5114.54','-2.29','3.12004','2688:0 2689:0 2692:0 '),\n+('2692','tero275','530','3519','3887','62','65','1','-2764.32','5083.04','-6.61069','4.7576','2691:0 2693:0 2694:0 '),\n+('2693','tero276','530','3519','3697','62','65','0','-2753.24','4900.43','-9.77721','1.5139','2692:0 2694:0 2696:0 '),\n+('2694','tero277','530','3519','3697','62','65','0','-2924.05','5077.7','-21.4831','6.27734','2693:0 2692:0 2695:0 2696:0 '),\n+('2695','tero278','530','3519','3697','62','65','0','-2988.38','5242.11','-18.2224','5.09376','2694:0 2737:0 2739:0 '),\n+('2696','tero279','530','3519','3697','62','65','0','-2927.67','4884.87','-20.3937','1.65765','2693:0 2694:0 2697:0 '),\n+('2697','tero280','530','3519','3891','62','65','0','-2833.33','4763.19','-3.82034','2.17758','2696:0 2698:0 '),\n+('2698','tero281','530','3519','3891','62','65','0','-2735.66','4761.53','-7.97762','3.14205','2697:0 2699:0 '),\n+('2699','tero282','530','3519','3697','62','65','0','-2927.04','4629.03','-20.1141','1.04898','2698:0 2700:0 2701:0 2703:0 '),\n+('2700','tero283','530','3519','3697','62','65','0','-2792.58','4548.65','-5.17792','2.36688','2699:0 '),\n+('2701','tero284','530','3519','3697','62','65','0','-3098.66','4626.88','-20.2418','0.186611','2699:0 2702:0 2707:0 '),\n+('2702','tero285','530','3519','3697','62','65','0','-3111.3','4451.66','-21.8624','1.72364','2701:0 2703:0 '),\n+('2703','tero286','530','3519','3697','62','65','0','-2978.71','4453.52','-19.1914','1.37334','2702:0 2699:0 2704:0 2762:0 '),\n+('2704','tero287','530','3519','3697','62','65','0','-3124.74','4312.73','-13.4977','1.36941','2703:0 2705:0 2744:0 '),\n+('2705','tero288','530','3519','3697','62','65','0','-3343.1','4318.47','-21.2101','0.0703571','2704:0 2706:0 2708:0 2744:0 '),\n+('2706','tero289','530','3519','3697','62','65','0','-3251.81','4540.47','-21.009','4.41204','2705:0 2707:0 2709:0 '),\n+('2707','tero290','530','3519','3688','62','65','0','-3251.45','4665.87','-22.0178','5.15817','2706:0 2701:0 '),\n+('2708','tero291','530','3519','3892','62','65','0','-3461.56','4373.44','-11.6911','5.77627','2705:0 2709:0 2710:0 '),\n+('2709','tero292','530','3519','3697','62','65','0','-3412.64','4543.05','-19.8323','4.37513','2708:0 2706:0 2710:0 '),\n+('2710','tero293','530','3519','3697','62','65','0','-3615.55','4423.5','-15.264','6.23338','2708:0 2709:0 2711:0 2712:0 '),\n+('2711','tero294','530','3519','3885','62','65','0','-3737.19','4335.92','3.0303','0.715952','2710:0 2712:0 '),\n+('2712','tero295','530','3519','3697','62','65','0','-3717.12','4553.09','-15.395','5.41343','2710:0 2711:0 2713:0 '),\n+('2713','tero296','530','3519','3886','62','65','0','-3751.58','4692.08','-17.1029','5.18959','2712:0 2714:0 2717:0 '),\n+('2714','tero297','530','3519','3688','62','65','0','-3628.23','4736.46','-22.1214','3.39967','2713:0 2715:0 '),\n+('2715','tero298','530','3519','3688','62','65','0','-3683.64','4880.37','-22.2453','4.85659','2714:0 2716:0 '),\n+('2716','tero299','530','3519','3697','62','65','0','-3787.46','5013.52','-20.1657','5.31998','2715:0 2717:0 2718:0 '),\n+('2717','tero300','530','3519','3697','62','65','0','-3875.72','4882.7','-35.8103','0.180317','2716:0 2713:0 '),\n+('2718','tero301','530','3519','3697','62','65','0','-3756.44','5163.25','-22.4721','4.73093','2716:0 2720:0 2719:0 '),\n+('2719','tero302','530','3519','3697','62','65','1','-3750.45','5404.46','-3.33481','1.38198','2718:0 2720:0 2721:0 '),\n+('2720','tero303','530','3519','3894','62','65','0','-3634.78','5300.46','-21.1377','3.63217','2718:0 2721:0 2741:0 2719:0 '),\n+('2721','tero304','530','3519','3697','62','65','0','-3670.35','5445.73','-4.16488','5.0239','2720:0 2722:0 2741:0 2719:0 '),\n+('2722','tero305','530','3519','3697','62','65','0','-3645.73','5559.5','-2.14497','4.56524','2721:0 2723:0 '),\n+('2723','tero306','530','3519','3686','62','65','0','-3642.69','5710.06','-2.77685','4.68385','2722:0 2724:0 2725:0 '),\n+('2724','tero307','530','3519','3519','62','65','0','-3501.7','5745.82','0.234953','3.52538','2723:0 2730:0 '),\n+('2725','tero308','530','3519','3519','62','65','0','-3733.98','5830.74','-2.74856','5.14723','2723:0 2726:0 '),\n+('2726','tero309','530','3519','3519','62','65','0','-3787.12','5986.43','-1.72887','4.96659','2725:0 2727:0 '),\n+('2727','tero310','530','3519','3519','62','65','0','-3628.51','6056.29','-3.33948','3.46806','2726:0 2728:0 '),\n+('2728','tero311','530','3519','3519','62','65','0','-3508.49','6174.6','4.08676','3.93145','2727:0 2729:0 '),\n+('2729','tero312','530','3519','3519','62','65','0','-3378.56','5998.98','-6.51004','2.27505','2728:0 2730:0 2731:0 2742:0 '),\n+('2730','tero313','530','3519','3519','62','65','0','-3476.42','5902.44','-30.7079','0.739594','2729:0 2724:0 2731:0 '),\n+('2731','tero314','530','3519','3519','62','65','0','-3285.32','5879.96','-19.0985','2.70702','2730:0 2729:0 2732:0 2742:0 '),\n+('2732','tero315','530','3519','3519','62','65','0','-3364.14','5789.3','-1.76223','1.10479','2731:0 2733:0 2742:0 '),\n+('2733','tero316','530','3519','3697','62','65','0','-3305.33','5740.49','0.884062','4.92025','2732:0 2734:0 2742:0 '),\n+('2734','tero317','530','3519','3697','62','65','0','-3286.23','5602.34','-6.97428','4.90454','2733:0 2735:0 '),\n+('2735','tero318','530','3519','3697','62','65','0','-3117.93','5582.45','-7.6733','6.23185','2734:0 2736:0 2739:0 '),\n+('2736','tero319','530','3519','3697','62','65','0','-2973.64','5517.8','-7.12772','5.62318','2735:0 2737:0 2739:0 '),\n+('2737','tero320','530','3519','3697','62','65','0','-2940.15','5358.09','-13.875','4.96972','2736:0 2695:0 2738:0 2739:0 '),\n+('2738','tero321','530','3519','3697','62','65','0','-2795.19','5341.13','-2.81699','5.23676','2737:0 '),\n+('2739','tero322','530','3519','3697','62','65','0','-3141.55','5381.37','-22.1389','0.524372','2695:0 2735:0 2736:0 2737:0 2740:0 '),\n+('2740','tero323','530','3519','3697','62','65','0','-3327.94','5329.47','-18.7903','0.115962','2739:0 2741:0 '),\n+('2741','tero324','530','3519','3697','62','65','0','-3499.7','5387.05','-17.1808','2.91198','2740:0 2720:0 2721:0 '),\n+('2742','tero325','530','3519','3519','62','65','0','-3184.45','5888','2.6866','3.28897','2729:0 2731:0 2732:0 2733:0 2743:0 2823:0 '),\n+('2743','tero326','530','3519','3519','62','65','0','-3032.12','5978.81','4.34466','3.72093','2742:0 2823:0 '),\n+('2744','tero327','530','3519','3697','62','65','0','-3134.88','4193.43','-7.28336','1.29796','2704:0 2705:0 2745:0 '),\n+('2745','tero328','530','3519','3697','62','65','0','-3028.19','4178.94','-0.0653765','2.95906','2744:0 2746:0 '),\n+('2746','tero329','530','3519','3519','62','65','0','-2977.23','4157.96','8.11812','3.04232','2745:0 2747:0 '),\n+('2747','tero330','530','3519','3684','62','65','3','-2960.39','4073.83','2.27582','5.22886','2746:0 2748:0 '),\n+('2748','tero331','530','3519','3684','62','65','3','-2931.59','3983.95','-0.908721','4.85187','2747:0 2749:0 '),\n+('2749','tero332','530','3519','3519','62','65','2','-2826.95','3982.66','1.7483','3.08078','2748:0 2750:0 '),\n+('2750','tero333','530','3519','3519','62','65','0','-2775.95','3939.94','2.93918','0.30046','2749:0 2751:0 '),\n+('2751','tero334','530','3519','3519','62','65','0','-2653.89','3959.73','4.49025','3.42242','2750:0 2752:0 2791:0 '),\n+('2752','tero335','530','3519','3519','62','65','0','-2556.49','4106.29','1.74147','4.38846','2751:0 2753:0 2790:0 '),\n+('2753','tero336','530','3519','3519','62','65','0','-2371.13','4150.23','2.76251','3.40672','2752:0 2754:0 2763:0 '),\n+('2754','tero337','530','3519','3519','62','65','0','-2284.4','4192.35','1.1876','3.57951','2753:0 2755:0 2763:0 '),\n+('2755','tero338','530','3519','3675','62','65','0','-2258.83','4242.98','1.82659','4.04289','2754:0 2756:0 2763:0 '),\n+('2756','tero339','530','3519','3519','62','65','0','-2454.44','4246.04','1.04828','6.28128','2755:0 2757:0 '),\n+('2757','tero340','530','3519','3519','62','65','4','-2553.08','4300.19','21.2595','5.70952','2756:0 2758:0 '),\n+('2758','tero341','530','3519','3683','62','65','5','-2594.46','4387.9','29.7655','5.39144','2757:0 2759:0 '),\n+('2759','tero342','530','3519','3683','62','65','5','-2656.03','4422.89','36.1553','5.66241','2758:0 2760:0 '),\n+('2760','tero343','530','3519','3683','62','65','4','-2719.28','4376.75','22.1052','0.28636','2759:0 2761:0 '),\n+('2761','tero344','530','3519','3697','62','65','0','-2834.82','4335.44','5.95973','3.39654','2760:0 2762:0 '),\n+('2762','tero345','530','3519','3697','62','65','0','-2909.54','4349.69','0.308415','2.08492','2761:0 2703:0 '),\n+('2763','tero346','530','3519','3675','62','65','0','-2170.52','4243.01','5.56803','3.39654','2753:0 2754:0 2755:0 2764:0 2822:0 '),\n+('2764','tero347','530','3519','3675','62','65','0','-2148.84','4189.65','7.46099','4.90842','2763:0 2765:0 2766:0 2822:0 '),\n+('2765','tero348','530','3519','3519','62','65','0','-2169.46','4024.43','0.27975','4.58248','2764:0 2788:0 2793:0 '),\n+('2766','tero349','530','3519','3675','62','65','0','-2043.89','4276.14','4.85305','3.85599','2764:0 2767:0 2780:0 2822:0 '),\n+('2767','tero350','530','3519','3519','62','65','0','-2003.56','4443.33','7.66134','1.22491','2766:0 2768:0 2780:0 2785:0 2822:0 '),\n+('2768','tero351','530','3519','3674','62','65','0','-1957.79','4600.09','4.55853','1.42126','2767:0 2769:0 2777:0 2780:0 2785:0 '),\n+('2769','tero352','530','3519','3674','62','65','0','-1958.96','4765.62','-1.86355','1.51943','2768:0 2770:0 2785:0 2787:0 '),\n+('2770','tero353','530','3519','3519','62','65','0','-1920.31','4893.8','2.58999','4.29189','2769:0 2681:0 2771:0 2787:0 '),\n+('2771','tero354','530','3519','3674','62','65','0','-1767.42','4808.53','10.9381','2.60326','2770:0 2772:0 '),\n+('2772','tero355','530','3519','3519','62','65','0','-1610.9','4687.94','-0.462587','3.37452','2771:0 2773:0 '),\n+('2773','tero356','530','3519','3519','62','65','0','-1438.54','4646.53','23.7191','3.09413','2772:0 2774:0 '),\n+('2774','tero357','530','3519','3689','62','65','0','-1505.3','4470.55','41.7643','1.30342','2773:0 2775:0 2779:0 '),\n+('2775','tero358','530','3519','3674','62','65','0','-1652.18','4568.13','2.67411','5.85088','2774:0 2776:0 '),\n+('2776','tero359','530','3519','3674','62','65','0','-1796.78','4588.16','10.9079','6.12577','2775:0 2777:0 2778:0 2780:0 '),\n+('2777','tero360','530','3519','3674','62','65','0','-1895.32','4551.89','11.162','0.506242','2776:0 2768:0 2778:0 2780:0 2785:0 '),\n+('2778','tero361','530','3519','3689','62','65','0','-1732.56','4448.64','2.34425','5.26889','2777:0 2776:0 2779:0 2780:0 '),\n+('2779','tero362','530','3519','3689','62','65','0','-1608.22','4353.23','36.5945','1.16519','2778:0 2774:0 '),\n+('2780','tero363','530','3519','3519','62','65','0','-1921.27','4373.25','1.92765','2.16501','2766:0 2767:0 2768:0 2776:0 2777:0 2778:0 2781:0 2822:0 '),\n+('2781','tero364','530','3519','3519','62','65','0','-1840.29','4219.11','25.1803','2.004','2780:0 2782:0 2822:0 '),\n+('2782','tero365','530','3519','3519','62','65','0','-1752.97','4184.94','57.0737','5.13381','2781:0 2783:0 2822:0 '),\n+('2783','tero366','530','3519','3858','62','65','0','-1716.88','4074.81','63.5817','4.67042','2782:0 2784:0 '),\n+('2784','tero367','530','3519','3858','62','65','0','-1691.82','3935.7','48.2267','4.84636','2783:0 2465:0 '),\n+('2785','tero368','530','3519','3519','62','65','0','-2102.76','4635.13','-7.65692','2.95747','2767:0 2768:0 2769:0 2777:0 2786:0 '),\n+('2786','tero369','530','3519','3519','62','65','0','-2257.36','4704.28','-0.0780256','1.2021','2785:0 '),\n+('2787','tero370','530','3519','3519','62','65','0','-2070.88','4924.17','13.5597','3.10277','2680:0 2681:0 2682:0 2683:0 2684:0 2769:0 2770:0 '),\n+('2788','tero371','530','3519','3519','62','65','0','-2246.8','3880.41','2.21742','1.23746','2765:0 2789:0 2793:0 '),\n+('2789','tero372','530','3519','3519','62','65','0','-2340.28','3972.87','-13.2572','5.73387','2788:0 2790:0 2793:0 '),\n+('2790','tero373','530','3519','3519','62','65','0','-2488.61','4019.54','0.242718','5.94199','2789:0 2752:0 2792:0 '),\n+('2791','tero374','530','3519','3860','62','65','0','-2554.91','3912.09','9.61175','2.80825','2751:0 2792:0 '),\n+('2792','tero375','530','3519','3860','62','65','0','-2485.03','3909.12','5.70774','1.75582','2791:0 2790:0 '),\n+('2793','tero376','530','3519','3519','62','65','0','-2259.61','3793.94','0.912792','1.33958','2765:0 2788:0 2789:0 2794:0 2817:0 '),\n+('2794','tero377','530','3519','3519','62','65','0','-2386.92','3640.31','1.09836','4.00208','2793:0 2795:0 2804:0 '),\n+('2795','tero378','530','3519','3519','62','65','0','-2479.53','3552.42','1.40969','5.89488','2794:0 2796:0 2805:0 '),\n+('2796','tero379','530','3519','3519','62','65','0','-2345.97','3468.35','-9.89249','2.70223','2795:0 2797:0 2805:0 '),\n+('2797','tero380','530','3519','3519','62','65','0','-2312.38','3409.64','-11.2993','4.48901','2796:0 2798:0 '),\n+('2798','tero381','530','3519','3681','62','65','0','-2354.51','3272.69','-1.60544','1.28851','2797:0 2799:0 '),\n+('2799','tero382','530','3519','3681','62','65','0','-2370.38','3203.41','-1.58182','4.34763','2798:0 2800:0 2808:0 '),\n+('2800','tero383','530','3519','3681','62','65','0','-2266.46','3160.45','-5.07597','2.81611','2799:0 2801:0 '),\n+('2801','tero384','530','3519','3519','62','65','0','-2151','3259.96','-30.9173','0.993986','2800:0 2802:0 '),\n+('2802','tero385','530','3519','3519','62','65','0','-2122.05','3416.4','-46.8967','4.54007','2801:0 2803:0 2817:0 '),\n+('2803','tero386','530','3519','3519','62','65','0','-2185.17','3533.98','-39.5174','5.06236','2802:0 2804:0 2817:0 '),\n+('2804','tero387','530','3519','3519','62','65','0','-2281.3','3632.39','-12.7757','5.10555','2803:0 2794:0 2817:0 '),\n+('2805','tero388','530','3519','3519','62','65','0','-2591.73','3492.79','0.37378','0.569874','2795:0 2796:0 2806:0 '),\n+('2806','tero389','530','3519','3519','62','65','0','-2706.59','3361.89','-0.445352','4.0649','2805:0 2807:0 2809:0 2810:0 '),\n+('2807','tero390','530','3519','3519','62','65','0','-2599.6','3260.29','1.92252','2.39202','2806:0 2808:0 2809:0 '),\n+('2808','tero391','530','3519','3519','62','65','0','-2474.91','3212.52','3.71098','0.644506','2807:0 2799:0 '),\n+('2809','tero392','530','3519','3519','62','65','0','-2789.26','3261.1','5.82088','0.813367','2806:0 2807:0 3580:0 '),\n+('2810','tero393','530','3519','3685','62','65','0','-2834.79','3413.38','-40.4077','5.88312','2806:0 2811:0 2816:0 '),\n+('2811','tero394','530','3519','3519','62','65','0','-2792.39','3494.53','-29.9885','3.12636','2810:0 2812:0 '),\n+('2812','tero395','530','3519','3685','62','65','0','-2893.22','3498.45','-28.8532','2.48233','2811:0 2813:0 '),\n+('2813','tero396','530','3519','3685','62','65','0','-2966.27','3553.99','-6.76611','5.48021','2812:0 2814:0 '),\n+('2814','tero397','530','3519','3685','62','65','0','-2986.16','3462.38','0.040144','1.25475','2813:0 2815:0 '),\n+('2815','tero398','530','3519','3685','62','65','0','-2966.04','3366.93','-1.18287','0.0020256','2814:0 2816:0 '),\n+('2816','tero399','530','3519','3519','62','65','0','-2877.47','3356.32','-19.7096','2.96298','2815:0 2810:0 '),\n+('2817','tero400','530','3519','3519','62','65','0','-2096.95','3654.03','-54.8181','4.15287','2793:0 2802:0 2803:0 2804:0 2818:0 '),\n+('2818','tero401','530','3519','3519','62','65','0','-2064.06','3807.53','1.04682','4.11754','2817:0 2819:0 '),\n+('2819','tero402','530','3519','3676','62','65','0','-1908.63','3920.4','-2.85436','0.610731','2818:0 2820:0 2821:0 '),\n+('2820','tero403','530','3519','3519','62','65','0','-1975.78','4077.99','-0.0257859','4.60841','2819:0 2821:0 2822:0 '),\n+('2821','tero404','530','3519','3676','62','65','0','-2060.38','3925.05','-0.749629','0.524347','2820:0 2819:0 '),\n+('2822','tero405','530','3519','3519','62','65','0','-1932.67','4229.67','0.0246133','4.45526','2763:0 2764:0 2766:0 2767:0 2780:0 2781:0 2782:0 2820:0 '),\n+('2823','nag406','530','3518','3788','62','65','0','-2979.16','5983.95','6.75645','5.87684','2742:0 2743:0 2824:0 '),\n+('2824','nag407','530','3518','3788','64','67','0','-2903.9','5958.93','14.5613','0.547909','2823:0 2825:0 '),\n+('2825','nag408','530','3518','3788','64','67','0','-2695.32','6074.17','39.2839','0.398684','2824:0 2826:0 '),\n+('2826','nag409','530','3518','3518','64','67','0','-2642.01','6196.52','35.4889','4.38459','2825:0 2827:0 2830:0 '),\n+('2827','nag410','530','3518','3610','64','67','0','-2584.26','6153','22.5432','1.45591','2826:0 2828:0 2878:0 '),\n+('2828','nag411','530','3518','3518','64','67','0','-2469.6','6354.46','29.3999','3.93692','2827:0 2829:0 2848:0 2868:0 '),\n+('2829','nag412','530','3518','3518','64','67','0','-2598.81','6353.52','38.4982','4.67519','2828:0 2830:0 2848:0 '),\n+('2830','nag413','530','3518','3518','64','67','0','-2647.16','6298.81','39.1645','4.36889','2829:0 2826:0 2831:0 '),\n+('2831','nag414','530','3518','3518','64','67','0','-2698.48','6403.1','37.6375','5.24131','2830:0 2832:0 '),\n+('2832','nag416','530','3518','3637','64','67','0','-2811.55','6437.45','63.1489','2.87099','2833:0 2834:0 2838:0 2831:0 '),\n+('2833','nag417','530','3518','3637','64','67','0','-2883.12','6557.15','51.9561','5.05205','2832:0 2836:0 2839:0 '),\n+('2834','nag418','530','3518','3637','64','67','0','-2866.92','6391.89','80.9253','0.732363','2832:0 2835:0 '),\n+('2835','nag419','530','3518','3637','64','67','0','-2947.68','6377.55','94.6931','0.234009','2834:0 2836:0 2837:0 '),\n+('2836','nag420','530','3518','3637','64','67','0','-2933.99','6526.24','74.3112','5.85317','2833:0 2835:0 '),\n+('2837','nag421','530','3518','3637','64','67','0','-2858.26','6300.73','73.5168','2.16181','2835:0 2838:0 '),\n+('2838','nag422','530','3518','3637','64','67','0','-2800.78','6320.06','63.9422','1.52171','2837:0 2832:0 '),\n+('2839','nag423','530','3518','3518','64','67','0','-2813.58','6624.23','27.952','0.826629','2833:0 2840:0 2843:0 '),\n+('2840','nag424','530','3518','3518','64','67','0','-2876.27','6701.94','18.9403','5.46206','2839:0 2841:0 '),\n+('2841','nag425','530','3518','3518','64','67','0','-2695.5','6579.52','23.3102','2.71395','2840:0 2842:0 '),\n+('2842','nag426','530','3518','3518','64','67','0','-2618.02','6729.9','-1.1338','4.0884','2841:0 2843:0 '),\n+('2843','nag427','530','3518','3518','64','67','0','-2762.9','6813.59','-4.67732','4.5989','2839:0 2842:0 2844:0 2979:0 '),\n+('2844','nag428','530','3518','3518','64','67','0','-2754.65','6993.51','-7.49834','4.92564','2843:0 2845:0 2979:0 2980:0 '),\n+('2845','nag429','530','3518','3518','64','67','0','-2554.45','7061.91','-8.95898','0.31535','2844:0 2846:0 2849:0 '),\n+('2846','nag430','530','3518','3518','64','67','0','-2401.18','6918.47','-1.9365','5.18482','2845:0 2847:0 2849:0 2860:0 2871:0 '),\n+('2847','nag431','530','3518','3518','64','67','0','-2443.4','6718.82','0.5495','4.75286','2846:0 2848:0 2870:0 '),\n+('2848','nag432','530','3518','3518','64','67','0','-2465.96','6485.46','18.388','4.48583','2847:0 2828:0 2829:0 '),\n+('2849','nag433','530','3518','3518','64','67','0','-2495.17','7067.29','-6.61379','5.16519','2845:0 2846:0 2850:0 2860:0 '),\n+('2850','nag434','530','3518','3518','64','67','2','-2545.1','7142.88','17.2089','5.26259','2849:0 2851:0 '),\n+('2851','nag435','530','3518','3626','64','67','3','-2587.61','7240.05','13.2805','5.09373','2850:0 2852:0 2853:0 '),\n+('2852','nag436','530','3518','3626','64','67','2','-2552.46','7299.13','13.4929','4.96416','2851:0 2855:0 '),\n+('2853','nag437','530','3518','3626','64','67','2','-2670.89','7210.11','23.8723','0.310654','2851:0 2854:0 '),\n+('2854','nag438','530','3518','3626','64','67','3','-2655.58','7280.08','30.7964','4.57931','2853:0 '),\n+('2855','nag439','530','3518','3626','64','67','2','-2487.77','7333.59','-15.1601','0.389211','2852:0 2856:0 '),\n+('2856','nag440','530','3518','3518','64','67','2','-2287.49','7419.75','-15.9035','3.46169','2855:0 2857:0 2913:0 '),\n+('2857','nag441','530','3518','3518','64','67','0','-2167.73','7320.37','-34.5989','5.71198','2856:0 2912:0 2858:0 '),\n+('2858','nag443','530','3518','3705','64','67','0','-2271.92','7267.29','-57.0529','4.8127','2859:0 2857:0 '),\n+('2859','nag444','530','3518','3705','64','67','0','-2261.19','7161.5','-56.5907','4.81663','2860:0 2861:0 2858:0 '),\n+('2860','nag445','530','3518','3518','64','67','0','-2347.48','7041.26','-12.5344','2.817','2859:0 2846:0 2849:0 '),\n+('2861','nag447','530','3518','3705','64','67','0','-2116.24','7209.42','-112.779','5.97431','2859:0 2862:0 '),\n+('2862','nag448','530','3518','3705','64','67','0','-1904.26','7175.34','-92.9691','3.12725','2863:0 2861:0 '),\n+('2863','nag449','530','3518','3705','64','67','0','-1985.26','6900.65','-85.609','5.34993','2862:0 2864:0 '),\n+('2864','nag450','530','3518','3518','64','67','0','-1848.57','6696.54','-53.151','5.40883','2863:0 2865:0 2872:0 '),\n+('2865','nag451','530','3518','3518','64','67','0','-1730.63','6547.09','19.5667','5.00434','2864:0 2866:0 2872:0 2885:0 2889:0 '),\n+('2866','nag452','530','3518','3518','64','67','0','-1929.46','6510.46','16.1863','2.96231','2865:0 2867:0 2885:0 2974:0 '),\n+('2867','nag453','530','3518','3638','64','67','0','-2134.61','6517.76','14.0285','6.16673','2866:0 2868:0 2869:0 2885:0 '),\n+('2868','nag454','530','3518','3518','64','67','0','-2312.35','6407.62','22.8307','0.6603','2867:0 2828:0 2869:0 '),\n+('2869','nag455','530','3518','3518','64','67','0','-2275.72','6586.73','3.55526','5.16535','2868:0 2867:0 2870:0 2877:0 '),\n+('2870','nag456','530','3518','3518','64','67','0','-2337.25','6706.87','-0.736603','5.08052','2869:0 2847:0 '),\n+('2871','nag457','530','3518','3518','64','67','0','-2230.6','6874.1','-6.45156','5.78973','2846:0 '),\n+('2872','nag458','530','3518','3518','64','67','0','-1596.41','6719.35','6.94102','2.95446','2865:0 2864:0 2873:0 2889:0 '),\n+('2873','nag459','530','3518','3518','64','67','0','-1749.49','6887.02','-31.8672','3.0919','2872:0 2874:0 2902:0 '),\n+('2874','nag460','530','3518','3705','64','67','0','-2033.22','6893.42','-39.0869','0.112087','2873:0 2875:0 '),\n+('2875','nag461','530','3518','3638','64','67','0','-2099.87','6812.26','-29.9742','0.936751','2874:0 2876:0 '),\n+('2876','nag462','530','3518','3638','64','67','0','-2097.69','6747.79','-3.22856','3.89457','2875:0 2877:0 '),\n+('2877','nag463','530','3518','3638','64','67','0','-2181.79','6690.97','-0.800369','0.623385','2876:0 2869:0 '),\n+('2878','nag464','530','3518','3610','64','67','0','-2569.73','6270.11','18.4891','5.91894','2827:0 2879:0 '),\n+('2879','nag465','530','3518','3610','64','67','0','-2480.31','6262.64','30.7263','5.11194','2878:0 2880:0 '),\n+('2880','nag466','530','3518','3610','64','67','0','-2447.6','6170.75','50.9756','3.42333','2879:0 2881:0 '),\n+('2881','nag467','530','3518','3610','64','67','0','-2505.35','6175.86','59.938','5.6892','2880:0 2882:0 '),\n+('2882','nag468','530','3518','3610','64','67','0','-2439.68','6122.93','84.0967','2.43372','2881:0 2883:0 '),\n+('2883','nag469','530','3518','3610','64','67','0','-2332.91','6161.97','53.5534','0.177271','2882:0 2884:0 '),\n+('2884','nag470','530','3518','3610','64','67','0','-2259.12','6100.84','76.839','2.48242','2883:0 '),\n+('2885','nag471','530','3518','3518','64','67','0','-1938.01','6408.13','38.4565','3.95504','2865:0 2866:0 2867:0 2886:0 2974:0 '),\n+('2886','nag472','530','3518','3518','64','67','0','-2080.87','6349.27','43.0054','5.9188','2885:0 2887:0 2974:0 '),\n+('2887','nag473','530','3518','3634','64','67','0','-1853.87','6319.73','46.4678','2.96543','2886:0 2888:0 2974:0 '),\n+('2888','nag474','530','3518','3518','64','67','0','-1699.25','6393.14','40.5718','0.499271','2887:0 2889:0 2973:0 '),\n+('2889','nag475','530','3518','3518','64','67','0','-1534.13','6557.83','19.5951','2.01038','2872:0 2888:0 2865:0 2890:0 2973:0 '),\n+('2890','nag476','530','3518','3518','64','67','0','-1482.81','6727.6','24.7441','1.27603','2889:0 2891:0 '),\n+('2891','nag477','530','3518','3518','64','67','0','-1390.93','6854.77','28.5326','0.624149','2890:0 2902:0 2899:0 '),\n+('2892','nag480','530','3518','3613','64','67','4','-1409.34','7112.02','33.814','1.09183','2893:0 2899:0 '),\n+('2893','nag481','530','3518','3613','64','67','5','-1329.62','7212.68','33.1588','0.853479','2892:0 2894:0 2901:0 '),\n+('2894','nag482','530','3518','3613','64','67','4','-1270.74','7314.59','33.6816','4.21027','2893:0 2895:0 '),\n+('2895','nag483','530','3518','3613','64','67','4','-1220.36','7373.07','33.23','4.20635','2894:0 2896:0 2897:0 '),\n+('2896','nag484','530','3518','3518','64','67','0','-1212.08','7477.88','22.0868','1.54857','2895:0 2908:0 2972:0 '),\n+('2897','nag485','530','3518','3613','64','67','4','-1182.14','7317.1','34.1095','4.44589','2895:0 2898:0 '),\n+('2898','nag486','530','3518','3613','64','67','4','-1195.71','7212.96','50.7515','1.47708','2897:0 2900:0 '),\n+('2899','nag487','530','3518','3613','64','67','4','-1266.65','6971.73','37.8915','2.73527','2891:0 2892:0 2900:0 '),\n+('2900','nag488','530','3518','3613','64','67','5','-1222.4','7167.59','57.2656','4.44744','2898:0 2901:0 2899:0 '),\n+('2901','nag489','530','3518','3613','64','67','4','-1276.87','7200.65','48.3758','5.06006','2893:0 2900:0 '),\n+('2902','nag491','530','3518','3518','64','67','0','-1550.75','6994.79','2.3684','5.6216','2891:0 2873:0 2903:0 '),\n+('2903','nag492','530','3518','3518','64','67','0','-1663.57','7019.01','0.239528','1.55716','2902:0 2904:0 2910:0 '),\n+('2904','nag493','530','3518','3518','64','67','0','-1624.79','7247.01','1.99533','4.52597','2903:0 2905:0 2910:0 '),\n+('2905','nag494','530','3518','3518','64','67','0','-1561.04','7386.09','1.02012','0.650024','2904:0 2906:0 2909:0 '),\n+('2906','nag495','530','3518','3518','64','67','0','-1369.87','7525.98','8.40119','6.06534','2905:0 2907:0 3014:0 '),\n+('2907','nag496','530','3518','3628','64','67','0','-1342.35','7749.72','-4.85434','4.51025','2906:0 2908:0 3005:0 '),\n+('2908','nag497','530','3518','3518','64','67','0','-1244.21','7675','9.34848','4.90297','2907:0 2896:0 2965:0 '),\n+('2909','nag498','530','3518','3518','64','67','0','-1822.25','7460.83','-6.36199','6.02215','2905:0 2910:0 3017:0 '),\n+('2910','nag499','530','3518','3518','64','67','0','-1788.32','7255.55','-7.10964','1.73702','2909:0 2904:0 2903:0 2911:0 '),\n+('2911','nag500','530','3518','3518','64','67','0','-1876.28','7247.82','-15.0226','2.58134','2910:0 2912:0 '),\n+('2912','nag501','530','3518','3518','64','67','0','-2010.2','7318.56','-33.8028','5.83525','2911:0 2857:0 '),\n+('2913','nag502','530','3518','3518','64','67','0','-2284.88','7613.96','-8.38883','4.91632','2856:0 2914:0 2915:0 2928:0 '),\n+('2914','nag503','530','3518','3518','64','67','0','-2110.77','7507.01','-30.9661','2.75255','2913:0 '),\n+('2915','nag504','530','3518','3518','64','67','0','-2280.53','7760.34','-25.2768','3.08634','2913:0 2916:0 2928:0 2999:0 '),\n+('2916','nag505','530','3518','3631','64','67','0','-2202.48','7982.31','-19.9501','4.31156','2915:0 2917:0 2930:0 2999:0 '),\n+('2917','nag506','530','3518','3518','64','67','0','-2164.5','8163.38','-23.2432','1.37024','2916:0 2918:0 2930:0 2995:0 '),\n+('2918','nag507','530','3518','3518','64','67','0','-2186.27','8355.19','-20.7293','1.74723','2917:0 2919:0 2931:0 2995:0 '),\n+('2919','nag508','530','3518','3518','64','67','0','-2261.53','8552.19','-18.4527','1.93573','2918:0 2920:0 2931:0 2932:0 2933:0 '),\n+('2920','nag509','530','3518','3631','64','67','0','-2454.9','8618.3','-25.5244','2.80359','2919:0 2921:0 2932:0 '),\n+('2921','nag510','530','3518','3518','64','67','0','-2638.28','8663.06','-21.4046','2.94104','2920:0 2922:0 2932:0 '),\n+('2922','nag511','530','3518','3631','64','67','0','-2824.97','8623.37','-27.21','4.0995','2921:0 2923:0 '),\n+('2923','nag512','530','3518','3518','64','67','0','-2867.65','8450.08','-30.1391','4.44507','2922:0 2924:0 '),\n+('2924','nag513','530','3518','3631','64','67','0','-2899.04','8250.79','-34.7269','4.57858','2923:0 2925:0 '),\n+('2925','nag514','530','3518','3518','64','67','0','-2888.4','8048.68','-26.7216','5.47001','2924:0 2926:0 '),\n+('2926','nag515','530','3518','3518','64','67','0','-2777.53','7867.47','-33.0086','5.33648','2925:0 2927:0 2984:0 '),\n+('2927','nag516','530','3518','3518','64','67','0','-2646.42','7719.28','-30.5333','5.53675','2926:0 2928:0 2929:0 2984:0 '),\n+('2928','nag517','530','3518','3518','64','67','0','-2469.37','7698.03','-17.5014','0.0114679','2915:0 2927:0 2913:0 2929:0 '),\n+('2929','nag518','530','3518','3631','64','67','0','-2548.6','7872.59','-53.4948','1.39927','2928:0 2927:0 2930:0 '),\n+('2930','nag519','530','3518','3631','64','67','0','-2377.16','8119.54','-42.3084','5.94673','2929:0 2916:0 2917:0 2931:0 '),\n+('2931','nag520','530','3518','3631','64','67','0','-2383.8','8337.19','-39.2254','0.68063','2930:0 2918:0 2919:0 2932:0 '),\n+('2932','nag521','530','3518','3631','64','67','0','-2489.29','8499.84','-36.8544','3.07375','2931:0 2920:0 2919:0 2921:0 '),\n+('2933','nag522','530','3518','3518','64','67','0','-2206.87','8693.03','-3.10935','4.27148','2919:0 2934:0 2985:0 '),\n+('2934','nag523','530','3518','3518','64','67','1','-2042.46','8705.35','18.0019','0.174061','2933:0 2935:0 '),\n+('2935','nag524','530','3518','3518','64','67','0','-1841.7','8722.11','25.2892','5.96245','2934:0 2936:0 '),\n+('2936','nag525','530','3518','3518','64','67','0','-1640.31','8750.19','32.1406','6.19414','2935:0 2937:0 2959:0 2987:0 '),\n+('2937','nag526','530','3518','3518','64','67','0','-1515.41','8730.96','27.2727','5.36163','2936:0 2938:0 2959:0 2940:0 '),\n+('2938','nag527','530','3518','3518','64','67','0','-1371.92','8548.95','11.8041','3.728','2937:0 2939:0 2944:0 2950:0 '),\n+('2939','nag528','530','3518','3622','64','67','0','-1460.34','8490.57','4.09139','0.714427','2938:0 2943:0 3011:0 '),\n+('2940','nag530','530','3518','3622','64','67','0','-1570.36','8600.16','4.98091','3.67147','2937:0 2941:0 2943:0 '),\n+('2941','nag531','530','3518','3622','64','67','0','-1642.07','8541.56','-12.6482','5.37185','2942:0 2940:0 '),\n+('2942','nag532','530','3518','3622','64','67','0','-1595.85','8476.21','-11.7076','0.541643','2941:0 2943:0 '),\n+('2943','nag533','530','3518','3622','64','67','0','-1526.1','8519.38','1.01318','3.57721','2942:0 2939:0 2940:0 '),\n+('2944','nag534','530','3518','3518','64','67','0','-1207.6','8431.13','20.2568','5.9334','2938:0 2945:0 2950:0 '),\n+('2945','nag535','530','3518','3518','64','67','0','-1095.6','8405.41','20.4451','5.79204','2944:0 2946:0 2950:0 '),\n+('2946','nag536','530','3518','3518','64','67','0','-953.793','8333.32','22.8678','0.0193606','2945:0 2947:0 2962:0 '),\n+('2947','nag537','530','3518','3518','64','67','0','-745.188','8393.11','33.9484','0.313885','2946:0 2948:0 '),\n+('2948','nag538','530','3518','3763','64','67','0','-588.034','8447.14','64.625','6.12976','2947:0 2949:0 '),\n+('2949','nag539','530','3518','3763','64','67','0','-494.831','8433.32','38.1295','6.07479','2948:0 2585:0 '),\n+('2950','nag540','530','3518','3518','64','67','0','-1168.9','8591.89','36.759','1.21709','2938:0 2944:0 2945:0 2951:0 2961:0 '),\n+('2951','nag541','530','3518','3617','64','67','0','-1067.77','8749.39','84.4276','1.60586','2950:0 2952:0 '),\n+('2952','nag542','530','3518','3617','64','67','0','-1080.66','8823.02','100.874','1.41736','2951:0 2953:0 '),\n+('2953','nag543','530','3518','3617','64','67','0','-1090.98','8945.42','103.447','0.588767','2952:0 2954:0 '),\n+('2954','nag544','530','3518','3617','64','67','0','-963.69','8887.28','146.6','3.44055','2953:0 2955:0 '),\n+('2955','nag545','530','3518','3617','64','67','0','-868.709','8940.17','156.257','5.74571','2954:0 2956:0 '),\n+('2956','nag546','530','3518','3617','64','67','0','-752.326','8861.16','182.978','4.2134','2955:0 2957:0 2958:0 '),\n+('2957','nag547','530','3518','3617','64','67','0','-651.777','8791','201.252','0.180777','2956:0 '),\n+('2958','nag553','530','3518','3617','64','67','0','-902.893','8685.38','170.054','1.29602','2956:0 '),\n+('2959','nag554','530','3518','3625','64','67','0','-1431.81','8885.86','36.9729','1.07333','2936:0 2937:0 2960:0 2994:0 '),\n+('2960','nag555','530','3518','3625','64','67','0','-1305.49','8958.42','58.5828','5.24728','2959:0 2961:0 '),\n+('2961','nag556','530','3518','3518','64','67','0','-1225.12','8803.57','39.6271','4.88207','2960:0 2950:0 '),\n+('2962','nag557','530','3518','3518','64','67','0','-968.504','8169.97','14.3663','5.25514','2946:0 2963:0 '),\n+('2963','nag558','530','3518','3518','64','67','0','-917.128','8072.21','21.4411','5.19624','2962:0 2964:0 2966:0 '),\n+('2964','nag559','530','3518','3518','64','67','0','-1020.93','7945.51','22.9619','4.026','2963:0 2965:0 2966:0 '),\n+('2965','nag560','530','3518','3518','64','67','0','-1146.56','7828.51','14.0417','4.1548','2964:0 2908:0 '),\n+('2966','nag561','530','3518','3616','64','67','0','-852.563','7887.28','40.6401','4.6339','2963:0 2964:0 2967:0 '),\n+('2967','nag562','530','3518','3616','64','67','0','-830.358','7797.91','38.3027','4.69279','2966:0 2968:0 '),\n+('2968','nag563','530','3518','3616','64','67','0','-829.954','7695.84','37.7371','5.2465','2967:0 2969:0 '),\n+('2969','nag564','530','3518','3616','64','67','0','-783.358','7540.05','60.9113','5.00303','2968:0 2970:0 '),\n+('2970','nag565','530','3518','3518','64','67','0','-763.166','7451.73','58.8323','4.56714','2969:0 2971:0 '),\n+('2971','nag566','530','3518','3518','64','67','0','-933.691','7394.83','34.4282','3.14949','2970:0 2972:0 '),\n+('2972','nag567','530','3518','3518','64','67','0','-1090.44','7395.57','33.0234','2.48583','2971:0 2896:0 '),\n+('2973','nag568','530','3518','3518','64','67','1','-1409.72','6385.4','38.2999','5.37255','2671:0 2888:0 2889:0 '),\n+('2974','nag569','530','3518','3634','64','67','0','-2075.76','6274.62','62.3128','0.289453','2866:0 2885:0 2886:0 2887:0 2975:0 '),\n+('2975','nag571','530','3518','3518','64','67','0','-2094.97','6179.79','87.9183','1.00219','2974:0 2976:0 '),\n+('2976','nag572','530','3518','3761','64','67','0','-2030.06','6071.21','119.672','4.93705','2977:0 2975:0 '),\n+('2977','nag573','530','3518','3761','64','67','0','-2001.22','5972.22','151.597','6.26043','2976:0 2978:0 '),\n+('2978','nag574','530','3518','3761','64','67','0','-1946.52','5928.39','150.948','1.91915','2977:0 '),\n+('2979','nag575','530','3518','3518','64','67','0','-2897.91','6988.92','-35.6052','0.23407','2843:0 2844:0 2980:0 '),\n+('2980','nag576','530','3518','3518','64','67','0','-2847.89','7102.5','-8.05767','2.77876','2979:0 2844:0 2981:0 '),\n+('2981','nag577','530','3518','3518','64','67','0','-2912.74','7175.13','-2.27885','1.70277','2980:0 2982:0 '),\n+('2982','nag578','530','3518','3518','64','67','0','-2935.1','7301.43','3.27707','1.53784','2981:0 2983:0 '),\n+('2983','nag579','530','3518','3518','64','67','0','-2902.48','7467.17','2.79586','1.43181','2982:0 2984:0 '),\n+('2984','nag580','530','3518','3518','64','67','0','-2802.19','7645.35','-6.45531','0.870248','2983:0 2926:0 2927:0 '),\n+('2985','nag581','530','3518','3633','64','67','0','-2196.09','8827.81','16.1506','4.59461','2933:0 2986:0 '),\n+('2986','nag582','530','3518','3633','64','67','0','-2071.65','8894.1','28.0157','0.506613','2985:0 2987:0 '),\n+('2987','nag583','530','3518','3518','64','67','0','-1884.01','8889.41','36.2099','5.7138','2936:0 2986:0 2988:0 '),\n+('2988','nag584','530','3518','3518','64','67','0','-1916.54','9091.13','52.9111','1.74753','2987:0 2989:0 '),\n+('2989','nag585','530','3518','3624','64','67','0','-1849.22','9237.75','70.9999','5.57243','2988:0 2990:0 '),\n+('2990','nag586','530','3518','3624','64','67','0','-1755.41','9160.76','79.5049','5.59599','2989:0 2991:0 '),\n+('2991','nag587','530','3518','3518','64','67','0','-1651.3','9137.62','86.3008','5.99261','2990:0 2992:0 '),\n+('2992','nag588','530','3518','3518','64','67','0','-1545.69','9099.13','82.8122','5.48996','2991:0 2993:0 '),\n+('2993','nag589','530','3518','3625','64','67','0','-1448.69','9002.9','57.299','5.25434','2992:0 2994:0 '),\n+('2994','nag590','530','3518','3625','64','67','0','-1419.87','8948.03','58.9144','6.12613','2993:0 2959:0 '),\n+('2995','nag591','530','3518','3518','64','67','0','-2052.37','8225.22','-6.54776','2.94922','2917:0 2918:0 2996:0 '),\n+('2996','nag592','530','3518','3518','64','67','0','-1986.35','8210.53','0.797534','4.84989','2995:0 2997:0 3000:0 '),\n+('2997','nag593','530','3518','3518','64','67','0','-2024.61','8154.98','1.25254','4.1077','2996:0 2998:0 '),\n+('2998','nag594','530','3518','3518','64','67','0','-2103.83','8063.36','2.18912','4.10771','2997:0 2999:0 '),\n+('2999','nag595','530','3518','3518','64','67','0','-2156.48','7911.49','-11.2008','4.37866','2998:0 2916:0 2915:0 '),\n+('3000','nag596','530','3518','3628','64','67','0','-1840.26','7999.74','-24.7446','2.3484','2996:0 3001:0 '),\n+('3001','nag597','530','3518','3628','64','67','0','-1746.01','7996.18','-27.0075','3.06865','3000:0 3002:0 '),\n+('3002','nag598','530','3518','3628','64','67','0','-1653.08','7993.42','-26.6535','6.25344','3001:0 3006:0 '),\n+('3003','nag600','530','3518','3628','64','67','0','-1550.22','7929.2','-21.6393','6.03352','3004:0 3006:0 '),\n+('3004','nag601','530','3518','3628','64','67','0','-1483.84','7905.42','-19.2864','5.65261','3003:0 3005:0 '),\n+('3005','nag602','530','3518','3628','64','67','0','-1404.2','7842.35','-18.1886','5.40914','3004:0 2907:0 '),\n+('3006','nag603','530','3518','3628','64','67','0','-1554.58','7990.68','-21.1856','3.99937','3002:0 3003:0 3007:0 3008:0 '),\n+('3007','nag604','530','3518','3628','64','67','0','-1601.1','7865.59','-22.0744','4.70386','3012:0 3006:0 '),\n+('3008','nag605','530','3518','3628','64','67','0','-1478.18','8079.45','-21.4921','0.88839','3009:0 3006:0 '),\n+('3009','nag606','530','3518','3518','64','67','0','-1517.43','8229.34','-15.3084','1.82694','3008:0 3010:0 '),\n+('3010','nag607','530','3518','3622','64','67','0','-1508.91','8347.15','-12.1475','1.98089','3009:0 3011:0 '),\n+('3011','nag608','530','3518','3622','64','67','0','-1502.91','8432.5','-0.939562','0.853047','3010:0 2939:0 '),\n+('3012','nag609','530','3518','3628','64','67','0','-1604.12','7762.81','-21.7436','1.48608','3007:0 3013:0 3015:0 '),\n+('3013','nag610','530','3518','3518','64','67','0','-1587.52','7621.15','-10.2326','4.91826','3012:0 3014:0 3015:0 '),\n+('3014','nag611','530','3518','3518','64','67','0','-1475.29','7596.72','-5.21911','5.69972','3013:0 2906:0 3015:0 '),\n+('3015','nag612','530','3518','3628','64','67','0','-1647.6','7686.9','-14.3996','0.653543','3013:0 3014:0 3012:0 3016:0 '),\n+('3016','nag613','530','3518','3518','64','67','0','-1703.41','7669.14','-14.3192','3.85013','3015:0 3017:0 '),\n+('3017','nag614','530','3518','3518','64','67','0','-1781.28','7605.53','-8.7957','3.82657','3016:0 2909:0 '),\n+('3018','zang615','530','3521','3521','64','67','0','794.211','5932.33','57.6977','1.47191','2647:0 2648:0 2670:0 3019:0 '),\n+('3019','zang616','530','3521','3521','64','67','0','820.771','6049.46','79.8283','4.84129','3018:0 3020:0 '),\n+('3020','bedg617','530','3522','3767','65','70','0','882.952','5919.73','115.632','0.505885','3019:0 3021:0 '),\n+('3021','bedg618','530','3522','3767','65','70','0','942.091','5960.21','121.279','0.600133','3020:0 3022:0 '),\n+('3022','bedg619','530','3522','3522','65','70','0','1067.62','6060.89','132.716','0.256129','3021:0 3023:0 '),\n+('3023','bedg620','530','3522','3522','65','70','0','1132.44','6081.19','153.605','5.97461','3022:0 3024:0 '),\n+('3024','bedg621','530','3522','3522','65','70','0','1202.41','6057.05','164.269','5.95105','3023:0 3025:0 '),\n+('3025','bedg622','530','3522','3522','65','70','0','1278.35','5993.43','168.127','5.58584','3024:0 3026:0 '),\n+('3026','bedg623','530','3522','3522','65','70','0','1406.14','6036.86','152.292','0.476827','3025:0 3027:0 '),\n+('3027','bedg624','530','3522','3522','65','70','0','1466.01','6069.6','133.93','6.17882','3026:0 3028:0 '),\n+('3028','bedg625','530','3522','3522','65','70','0','1591.09','6047.48','128.651','6.21023','3027:0 3029:0 '),\n+('3029','bedg626','530','3522','3768','65','70','0','1713.44','6043.35','143.923','6.2495','3028:0 3030:0 3049:0 '),\n+('3030','bedg627','530','3522','3768','65','70','0','1762.72','5869.71','155.631','4.98895','3029:0 3031:0 3049:0 '),\n+('3031','bedg628','530','3522','3833','65','70','0','1802.41','5792.15','188.129','6.12384','3030:0 3032:0 '),\n+('3032','bedg629','530','3522','3833','65','70','0','1865.39','5786.05','215.307','4.78866','3031:0 3033:0 '),\n+('3033','bedg631','530','3522','3833','65','70','0','1882.59','5668.18','256.167','1.82379','3034:0 3037:0 3032:0 '),\n+('3034','bedg632','530','3522','3833','65','70','0','2046.5','5630.87','263.828','6.03743','3033:0 3035:0 3036:0 3037:0 3040:0 '),\n+('3035','bedg633','530','3522','3922','65','70','0','2186.78','5679.45','267.903','1.53317','3034:0 3236:0 '),\n+('3036','bedg634','530','3522','3833','65','70','0','2078.91','5730.76','265.935','3.74408','3034:0 3037:0 '),\n+('3037','bedg635','530','3522','3833','65','70','0','1986.76','5663.91','265.451','5.29919','3036:0 3034:0 3033:0 3038:0 '),\n+('3038','bedg636','530','3522','3918','65','70','0','1882.53','5595.86','256.211','0.429695','3037:0 3039:0 '),\n+('3039','bedg637','530','3522','3918','65','70','3','1913.85','5539.89','265.641','4.76903','3038:0 3040:0 '),\n+('3040','bedg638','530','3522','3918','65','70','3','1980.47','5572.14','258.131','2.97243','3039:0 3034:0 3041:0 '),\n+('3041','bedg639','530','3522','3833','65','70','0','1818.29','5603','261.471','3.82655','3040:0 3042:0 3048:0 '),\n+('3042','bedg640','530','3522','3918','65','70','0','1800.72','5550.99','267.48','2.61311','3041:0 3043:0 3047:0 '),\n+('3043','bedg641','530','3522','3919','65','70','0','1708.89','5566.11','265.641','3.36316','3042:0 3047:0 3235:0 '),\n+('3044','bedg643','530','3522','3919','65','70','0','1564.28','5423.88','265.088','1.83317','3045:0 3235:0 '),\n+('3045','bedg644','530','3522','3919','65','70','0','1534.04','5541.59','258.021','1.3761','3044:0 3046:0 '),\n+('3046','bedg645','530','3522','3919','65','70','0','1599.86','5605.47','266.783','0.413989','3045:0 3047:0 '),\n+('3047','bedg646','530','3522','3919','65','70','0','1692.34','5649.63','265.597','5.29918','3046:0 3043:0 3042:0 3048:0 '),\n+('3048','bedg647','530','3522','3919','65','70','0','1775.77','5678.9','267.502','5.25597','3041:0 3047:0 '),\n+('3049','bedg648','530','3522','3768','65','70','0','1827.31','6004.38','138.57','2.3814','3029:0 3030:0 3050:0 '),\n+('3050','bedg649','530','3522','3768','65','70','0','1934.89','5992.25','140.661','0.472881','3049:0 3051:0 3087:0 '),\n+('3051','bedg650','530','3522','3768','65','70','0','2035.37','6038.3','145.555','3.92079','3050:0 3052:0 3087:0 '),\n+('3052','bedg651','530','3522','3768','65','70','0','2098.1','5939.59','137.134','5.31486','3051:0 3053:0 3087:0 '),\n+('3053','bedg652','530','3522','3831','65','70','0','2140.78','5883.29','138.074','5.36983','3052:0 3054:0 '),\n+('3054','bedg653','530','3522','3831','65','70','0','2169.87','5811.41','120.231','1.97692','3053:0 3055:0 '),\n+('3055','bedg654','530','3522','3831','65','70','0','2156.44','5731.77','120.753','4.55303','3054:0 3056:0 '),\n+('3056','bedg655','530','3522','3831','65','70','0','2209.5','5671.79','127.813','5.09887','3055:0 3057:0 '),\n+('3057','bedg656','530','3522','3831','65','70','0','2242.52','5586.84','144.63','4.98106','3056:0 3058:0 '),\n+('3058','bedg657','530','3522','3831','65','70','0','2242.64','5516.54','161.969','4.74938','3057:0 3059:0 '),\n+('3059','bedg658','530','3522','3831','65','70','0','2266.32','5460.89','147.107','3.73228','3058:0 3060:0 3061:0 '),\n+('3060','bedg659','530','3522','3831','65','70','0','2243.22','5409.52','144.241','3.16286','3061:0 3059:0 '),\n+('3061','bedg660','530','3522','3831','65','70','0','2184.26','5427.04','144.314','3.26496','3060:0 3062:0 3059:0 '),\n+('3062','bedg661','530','3522','3831','65','70','0','2056.91','5452.67','144.871','3.87757','3061:0 3063:0 '),\n+('3063','bedg662','530','3522','3831','65','70','0','1986.16','5372.79','148.912','3.58305','3062:0 3064:0 '),\n+('3064','bedg663','530','3522','3831','65','70','0','1869.19','5342.55','144.553','3.39455','3063:0 3065:0 '),\n+('3065','bedg664','530','3522','3831','65','70','0','1844.86','5256.68','138.071','1.36038','3064:0 3066:0 '),\n+('3066','bedg666','530','3522','3831','65','70','0','1882.44','5202','150.044','6.2809','3065:0 3067:0 '),\n+('3067','bedg668','530','3522','3831','65','70','0','1942.47','5157.81','163.104','1.47426','3066:0 3068:0 '),\n+('3068','bedg670','530','3522','3831','65','70','0','1859.25','5091.18','146.37','4.69048','3067:0 3069:0 '),\n+('3069','bedg672','530','3522','3831','65','70','0','1892.19','4998.98','146.563','5.3777','3070:0 3068:0 '),\n+('3070','bedg673','530','3522','3827','65','70','0','1882.75','4918.05','144.661','4.59623','3069:0 3071:0 3079:0 '),\n+('3071','bedg674','530','3522','3827','65','70','0','1970.05','4876.31','143.046','5.83716','3070:0 3072:0 3078:0 '),\n+('3072','bedg675','530','3522','3844','65','70','0','2066.28','4886.71','148.962','0.107673','3071:0 3073:0 '),\n+('3073','bedg676','530','3522','3844','65','70','0','2113.18','4914.06','149.085','6.14739','3072:0 3074:0 '),\n+('3074','bedg677','530','3522','3827','65','70','0','2197.61','4955.01','153.824','2.65786','3073:0 3075:0 3232:0 '),\n+('3075','bedg678','530','3522','3844','65','70','5','2122.42','4767.11','145.442','4.39595','3074:0 3076:0 3077:0 '),\n+('3076','bedg679','530','3522','3844','65','70','5','2051.79','4712.94','149.377','4.14775','3075:0 '),\n+('3077','bedg680','530','3522','3844','65','70','4','2045.43','4756.7','142.832','3.24454','3075:0 3078:0 '),\n+('3078','bedg681','530','3522','3827','65','70','0','1924.25','4753.97','143.374','3.15815','3077:0 3071:0 3079:0 '),\n+('3079','bedg682','530','3522','3827','65','70','0','1818.76','4741.32','143.599','3.17386','3078:0 3080:0 3081:0 3070:0 '),\n+('3080','bedg683','530','3522','3783','65','70','0','1763.5','4636.75','148.572','2.17246','3081:0 3079:0 '),\n+('3081','bedg684','530','3522','3827','65','70','0','1721.08','4751.46','141.246','2.47877','3080:0 3082:0 3079:0 '),\n+('3082','bedg685','530','3522','3827','65','70','0','1671.81','4805.51','144.067','1.15537','3081:0 3083:0 '),\n+('3083','bedg686','530','3522','3827','65','70','0','1716.64','4889.56','168.716','1.08076','3082:0 3084:0 '),\n+('3084','bedg690','530','3522','3779','65','70','0','1764.57','5020.59','169.786','2.98533','3083:0 3085:0 '),\n+('3085','bedg691','530','3522','3779','65','70','0','1689.52','5029.67','171.17','6.17405','3086:0 3084:0 '),\n+('3086','bedg692','530','3522','3779','65','70','0','1644.1','5086.59','174.824','5.08627','3085:0 '),\n+('3087','bedg693','530','3522','3768','65','70','0','2051.36','6085.99','147.268','1.58417','3050:0 3051:0 3052:0 3088:0 3094:0 '),\n+('3088','bedg694','530','3522','3768','65','70','0','2163.29','6091.67','144.685','6.16931','3087:0 3089:0 3093:0 '),\n+('3089','bedg695','530','3522','3769','65','70','5','2276.18','6049.52','143.141','5.80411','3088:0 3090:0 '),\n+('3090','bedg696','530','3522','3769','65','70','4','2338.36','6031.21','142.438','2.8196','3089:0 3091:0 '),\n+('3091','bedg697','530','3522','3769','65','70','5','2384.95','6054.49','138.162','1.60222','3090:0 3092:0 '),\n+('3092','bedg698','530','3522','3768','65','70','0','2372.13','6149.95','128.725','3.20443','3091:0 3093:0 3160:0 '),\n+('3093','bedg699','530','3522','3768','65','70','0','2265.65','6155.81','138.179','3.41256','3092:0 3088:0 '),\n+('3094','bedg700','530','3522','3768','65','70','0','2028.28','6216.03','134.538','4.67706','3087:0 3095:0 '),\n+('3095','bedg701','530','3522','3771','65','70','0','2041.4','6592.18','135.807','3.54607','3094:0 3096:0 3102:0 '),\n+('3096','bedg702','530','3522','3772','65','70','3','2066.72','6735.02','154.854','4.59066','3095:0 3097:0 3101:0 '),\n+('3097','bedg703','530','3522','3772','65','70','2','1972.28','6779.92','162.128','1.46478','3096:0 3098:0 '),\n+('3098','bedg704','530','3522','3772','65','70','2','1959.55','6842.15','158.876','3.29476','3097:0 3099:0 3105:0 '),\n+('3099','bedg705','530','3522','3772','65','70','3','2065.72','6849.09','172.562','0.0589211','3098:0 3100:0 '),\n+('3100','bedg706','530','3522','3772','65','70','2','2135.82','6829.36','173.431','4.65351','3099:0 3101:0 '),\n+('3101','bedg707','530','3522','3772','65','70','2','2140.28','6753.83','165.006','3.40472','3100:0 3096:0 '),\n+('3102','bedg708','530','3522','3771','65','70','0','1952.24','6615.86','143.542','5.85751','3095:0 3103:0 3104:0 '),\n+('3103','bedg709','530','3522','3771','65','70','0','1869.68','6608.28','143.783','2.00906','3102:0 3104:0 '),\n+('3104','bedg710','530','3522','3771','65','70','0','1867.3','6714.18','142.554','2.81017','3102:0 3103:0 3105:0 '),\n+('3105','bedg711','530','3522','3771','65','70','0','1794.79','6806.46','137.334','0.147653','3104:0 3098:0 3106:0 3125:0 '),\n+('3106','bedg712','530','3522','3782','65','70','0','1698.35','6823.85','136.031','2.50777','3105:0 3107:0 3112:0 3113:0 '),\n+('3107','bedg713','530','3522','3782','65','70','0','1660.38','6861.71','142.107','2.01886','3106:0 3108:0 '),\n+('3108','bedg714','530','3522','3782','65','70','0','1628.86','6909.46','152.556','2.54312','3107:0 3109:0 '),\n+('3109','bedg715','530','3522','3782','65','70','0','1565.97','6934.47','157.679','0.579622','3108:0 3110:0 '),\n+('3110','bedg716','530','3522','3782','65','70','0','1642.57','6995.64','157.952','6.01458','3109:0 3111:0 '),\n+('3111','bedg717','530','3522','3782','65','70','0','1706.57','6967.44','152.552','5.15456','3110:0 3112:0 '),\n+('3112','bedg718','530','3522','3782','65','70','0','1749.11','6892.32','140.635','4.05192','3111:0 3106:0 '),\n+('3113','bedg719','530','3522','3782','65','70','0','1636.12','6812.12','131.714','0.187751','3106:0 3114:0 3124:0 '),\n+('3114','bedg720','530','3522','3782','65','70','0','1569.95','6826.69','128.23','3.23117','3113:0 3115:0 '),\n+('3115','bedg721','530','3522','3522','65','70','0','1487.42','6820.82','107.218','2.83454','3114:0 3116:0 '),\n+('3116','bedg722','530','3522','3522','65','70','0','1418.63','6847.18','110.541','2.77564','3115:0 3117:0 '),\n+('3117','bedg723','530','3522','3522','65','70','0','1357.84','6881.95','95.233','5.88189','3116:0 3118:0 '),\n+('3118','bedg724','530','3522','3522','65','70','0','1305.01','6962.51','93.0961','3.03875','3117:0 3119:0 '),\n+('3119','bedg725','530','3522','3522','65','70','0','1224.71','6978.54','90.3881','2.59893','3118:0 3120:0 '),\n+('3120','bedg726','530','3522','3522','65','70','0','1145.67','7048.89','113.579','2.41436','3119:0 3121:0 '),\n+('3121','bedg727','530','3522','3522','65','70','2','1107.87','7095.02','122.35','3.18012','3120:0 3122:0 '),\n+('3122','bedg728','530','3522','3770','65','70','2','1053.11','7098.72','116.217','0.376251','3121:0 3123:0 '),\n+('3123','bedg729','530','3522','3770','65','70','2','1020.4','7173.65','86.2439','1.66823','3122:0 2628:0 '),\n+('3124','bedg730','530','3522','3824','65','70','0','1647.1','6732.39','116.704','4.75248','3113:0 3125:0 '),\n+('3125','bedg731','530','3522','3771','65','70','0','1740.86','6736.89','134.249','0.774434','3124:0 3105:0 3126:0 '),\n+('3126','bedg732','530','3522','3824','65','70','0','1628.32','6690.04','108.29','6.13869','3125:0 3127:0 '),\n+('3127','bedg733','530','3522','3824','65','70','0','1723.61','6678.08','87.8644','5.8481','3126:0 3128:0 '),\n+('3128','bedg734','530','3522','3824','65','70','0','1772.91','6642.19','74.5483','2.51408','3127:0 3129:0 '),\n+('3129','bedg735','530','3522','3824','65','70','0','1619.66','6621.4','33.3376','3.64899','3128:0 3130:0 '),\n+('3130','bedg736','530','3522','3824','65','70','0','1761.7','6532.98','4.13407','5.72636','3129:0 3131:0 3263:0 '),\n+('3131','bedg737','530','3522','3824','65','70','0','1936.85','6455.82','1.98027','5.87558','3130:0 3132:0 3261:0 '),\n+('3132','bedg738','530','3522','3824','65','70','0','2158.79','6394.21','-10.3376','6.01302','3131:0 3133:0 '),\n+('3133','bedg739','530','3522','3931','65','70','0','2352.32','6410.86','-10.3378','0.246553','3132:0 3134:0 3136:0 '),\n+('3134','bedg740','530','3522','3773','65','70','0','2401.13','6465.38','3.57212','0.140524','3133:0 3135:0 '),\n+('3135','bedg741','530','3522','3773','65','70','0','2489.83','6479','-6.94094','0.898433','3134:0 3136:0 3137:0 '),\n+('3136','bedg742','530','3522','3931','65','70','0','2486.13','6407.7','-10.338','3.05435','3135:0 3133:0 3143:0 '),\n+('3137','bedg743','530','3522','3773','65','70','0','2546.35','6560.09','1.844','4.13898','3135:0 3138:0 3139:0 3140:0 3142:0 '),\n+('3138','bedg744','530','3522','3773','65','70','0','2667.31','6519.19','0.94932','5.95717','3137:0 '),\n+('3139','bedg745','530','3522','3773','65','70','0','2613.6','6682.32','23.1547','1.02881','3137:0 3142:0 '),\n+('3140','bedg746','530','3522','3773','65','70','0','2376.02','6637.4','10.9828','6.02394','3137:0 3141:0 '),\n+('3141','bedg747','530','3522','3773','65','70','0','2482.22','6684.55','0.72676','5.48987','3140:0 3142:0 '),\n+('3142','bedg748','530','3522','3773','65','70','0','2570.07','6610.1','7.6561','4.0683','3141:0 3137:0 3139:0 '),\n+('3143','bedg749','530','3522','3931','65','70','0','2625.59','6357.13','-10.3379','0.0313585','3136:0 3144:0 3150:0 '),\n+('3144','bedg750','530','3522','3862','65','70','0','2747.24','6390.91','2.251','5.27782','3143:0 3145:0 '),\n+('3145','bedg751','530','3522','3862','65','70','0','2871.51','6233.27','11.692','5.37992','3144:0 3146:0 3150:0 '),\n+('3146','bedg752','530','3522','3862','65','70','0','2980.33','6146.77','4.99801','5.25426','3145:0 3147:0 '),\n+('3147','bedg753','530','3522','3826','65','70','0','3036.46','6073.22','0.772358','5.36224','3146:0 3148:0 '),\n+('3148','bedg754','530','3522','3826','65','70','0','3098.88','6022.32','1.18446','4.5042','3147:0 3149:0 '),\n+('3149','bedg755','530','3522','3826','65','70','0','3081.27','5967.39','-10.3385','2.55249','3148:0 3150:0 3154:0 '),\n+('3150','bedg756','530','3522','3825','65','70','0','2759.83','6108.29','-10.3396','6.08285','3145:0 3149:0 3143:0 3151:0 3157:0 '),\n+('3151','bedg757','530','3522','3825','65','70','1','2685.12','5895.26','-16.1123','4.71862','3150:0 3152:0 '),\n+('3152','bedg758','530','3522','3825','65','70','0','2687.78','5785.12','-16.8636','4.73433','3151:0 3153:0 '),\n+('3153','bedg759','530','3522','3904','65','70','0','2695.75','5583.37','-10.6374','4.75001','3152:0 '),\n+('3154','bedg760','530','3522','3826','65','70','0','3126.83','5854.78','-10.3341','5.52444','3149:0 3155:0 3156:0 '),\n+('3155','bedg761','530','3522','3826','65','70','0','3287.4','5738.99','-10.3325','5.79933','3154:0 3156:0 3161:0 '),\n+('3156','bedg762','530','3522','3826','65','70','0','3281.88','5854.49','-1.4584','3.21929','3155:0 3154:0 3161:0 '),\n+('3157','bedg763','530','3522','3825','65','70','0','2582.1','6136.86','24.0804','4.49162','3150:0 3158:0 '),\n+('3158','bedg765','530','3522','3825','65','70','0','2521.32','6015.69','84.9349','2.22967','3157:0 3159:0 '),\n+('3159','bedg767','530','3522','3768','65','70','0','2494.15','6124.82','111.3','1.62492','3160:0 3158:0 '),\n+('3160','bedg768','530','3522','3768','65','70','0','2427.5','6152.5','122.621','2.74804','3159:0 3092:0 '),\n+('3161','bedg769','530','3522','3826','65','70','0','3383.33','5729.17','-10.3389','3.41014','3155:0 3156:0 3162:0 3163:0 3172:0 '),\n+('3162','bedg770','530','3522','3777','65','70','0','3452.63','5809.98','1.12407','0.865436','3161:0 3164:0 '),\n+('3163','bedg771','530','3522','3826','65','70','0','3520','5691.54','-10.3386','6.05377','3161:0 3164:0 '),\n+('3164','bedg772','530','3522','3777','65','70','0','3523.18','5795.46','1.6669','1.53041','3163:0 3162:0 3165:0 '),\n+('3165','bedg773','530','3522','3826','65','70','0','3589.57','5684.17','-10.2714','6.25066','3164:0 3166:0 '),\n+('3166','bedg774','530','3522','3774','65','70','0','3660.48','5491.29','-20.7025','5.0647','3165:0 3171:0 '),\n+('3167','bedg775','530','3522','3774','65','70','0','3641.58','5308.33','-20.5148','5.3867','3168:0 3171:0 '),\n+('3168','bedg776','530','3522','3774','65','70','0','3587.11','5221.49','14.2925','1.80371','3169:0 3167:0 '),\n+('3169','bedg777','530','3522','3774','65','70','0','3438.2','5241.29','-6.61032','0.307527','3168:0 '),\n+('3170','bedg779','530','3522','3774','65','70','0','3593.15','5382.62','-9.51038','0.0970404','3171:0 '),\n+('3171','bedg780','530','3522','3774','65','70','0','3651.06','5374.99','-20.2357','1.49502','3170:0 3166:0 3167:0 '),\n+('3172','bedg781','530','3522','3826','65','70','0','3233.27','5636.21','38.3515','5.69295','3161:0 3173:0 '),\n+('3173','bedg782','530','3522','3826','65','70','0','3303.69','5597.03','55.3332','6.0071','3172:0 3174:0 '),\n+('3174','bedg783','530','3522','3826','65','70','0','3374.58','5579.62','85.0975','4.19284','3173:0 3175:0 '),\n+('3175','bedg784','530','3522','3828','65','70','0','3306.73','5468.57','141.818','6.03852','3174:0 3176:0 3179:0 '),\n+('3176','bedg785','530','3522','3828','65','70','0','3389.48','5461.86','145.745','4.75047','3175:0 3177:0 '),\n+('3177','bedg786','530','3522','3829','65','70','0','3363.88','5342.13','147.792','3.91795','3176:0 3178:0 '),\n+('3178','bedg787','530','3522','3829','65','70','0','3286','5287.73','147.247','2.3825','3177:0 3179:0 3182:0 '),\n+('3179','bedg788','530','3522','3828','65','70','0','3187.06','5468.2','146.95','2.07226','3178:0 3175:0 3180:0 '),\n+('3180','bedg789','530','3522','3828','65','70','0','3116.13','5482.01','145.293','4.71905','3179:0 3181:0 3183:0 '),\n+('3181','bedg790','530','3522','3829','65','70','0','3130.15','5332.98','148.604','4.94682','3180:0 3182:0 '),\n+('3182','bedg791','530','3522','3829','65','70','0','3215.6','5360.26','142.29','5.42984','3181:0 3178:0 '),\n+('3183','bedg792','530','3522','3828','65','70','0','2956.95','5583.27','146.351','5.04498','3180:0 3184:0 3186:0 '),\n+('3184','bedg793','530','3522','3952','65','70','0','2952.85','5779.65','134.692','1.27116','3183:0 3185:0 '),\n+('3185','bedg794','530','3522','3952','65','70','0','3050.1','5991.54','130.725','1.20636','3184:0 3238:0 '),\n+('3186','bedg795','530','3522','3951','65','70','1','2949.59','5525.69','144.16','2.62095','3183:0 3187:0 '),\n+('3187','bedg796','530','3522','3828','65','70','0','2915.37','5365.92','147.713','1.64902','3186:0 3188:0 '),\n+('3188','bedg797','530','3522','3867','65','70','0','2973.41','5294.89','183.643','6.14688','3187:0 3189:0 '),\n+('3189','bedg798','530','3522','3867','65','70','0','3038.23','5281.8','219.214','4.54468','3188:0 3190:0 '),\n+('3190','bedg799','530','3522','3867','65','70','0','3021.8','5214.18','250.296','5.00414','3189:0 3191:0 '),\n+('3191','bedg800','530','3522','3867','65','70','0','3082.54','5063.01','264.326','4.87847','3190:0 3192:0 3211:0 3212:0 '),\n+('3192','bedg801','530','3522','3867','65','70','0','3099.95','4980.23','265.505','6.22935','3191:0 3193:0 3218:0 3221:0 '),\n+('3193','bedg802','530','3522','3867','65','70','0','3304.97','4970.79','264.838','5.68742','3192:0 3194:0 3210:0 '),\n+('3194','bedg803','530','3522','3867','65','70','0','3434.24','4937.21','262.546','5.47143','3193:0 3195:0 3209:0 3210:0 '),\n+('3195','bedg804','530','3522','3867','65','70','0','3574.68','4758.04','240.131','5.37718','3194:0 3196:0 3202:0 '),\n+('3196','bedg805','530','3522','3863','65','70','0','3564.29','4641.89','228.617','3.77105','3195:0 3197:0 '),\n+('3197','bedg806','530','3522','3863','65','70','0','3459.92','4594.26','206.487','3.08147','3196:0 3198:0 3199:0 '),\n+('3198','bedg807','530','3522','3962','65','70','0','3346.24','4594.8','221.66','2.70055','3197:0 '),\n+('3199','bedg808','530','3522','3863','65','70','0','3393.49','4543.75','179.957','4.49519','3197:0 3200:0 '),\n+('3200','bedg809','530','3522','3863','65','70','0','3360.85','4462.38','157.372','4.73472','3199:0 3201:0 3269:0 '),\n+('3201','bedg810','530','3522','3863','65','70','0','3368.28','4367.62','122.375','1.75021','3200:0 3269:0 '),\n+('3202','bedg811','530','3522','3866','65','70','0','3701.21','4770.37','244.343','1.75806','3195:0 3203:0 '),\n+('3203','bedg812','530','3522','3866','65','70','0','3761.47','4802.74','254.61','1.73842','3202:0 3204:0 '),\n+('3204','bedg813','530','3522','3866','65','70','0','3738.29','4879.52','256.491','2.75944','3203:0 3205:0 '),\n+('3205','bedg814','530','3522','3866','65','70','0','3668.47','4898.18','260.046','1.56956','3204:0 3206:0 '),\n+('3206','bedg815','530','3522','3866','65','70','0','3668.33','5008.48','266.738','4.7465','3205:0 3207:0 3208:0 '),\n+('3207','bedg816','530','3522','3866','65','70','0','3732.68','5010.06','273.797','4.86824','3206:0 '),\n+('3208','bedg817','530','3522','3866','65','70','0','3581.65','5022.38','265.138','6.01885','3206:0 3209:0 '),\n+('3209','bedg818','530','3522','3866','65','70','0','3523.16','4984.99','269.146','3.77261','3208:0 3194:0 '),\n+('3210','bedg819','530','3522','3867','65','70','0','3312.28','5066.6','254.195','4.73865','3193:0 3194:0 3211:0 '),\n+('3211','bedg820','530','3522','3867','65','70','0','3243.07','5149.71','260.466','2.97621','3210:0 3191:0 '),\n+('3212','bedg821','530','3522','3942','65','70','0','2961.39','5151.76','265.026','5.66383','3191:0 3213:0 3217:0 '),\n+('3213','bedg822','530','3522','3942','65','70','0','2940.58','5217.19','264.835','2.79713','3212:0 3214:0 '),\n+('3214','bedg823','530','3522','3942','65','70','0','2844.64','5234.99','267.298','3.70426','3213:0 3215:0 '),\n+('3215','bedg824','530','3522','3942','65','70','0','2724.25','5157.06','265.076','3.71605','3214:0 3216:0 3222:0 '),\n+('3216','bedg825','530','3522','3867','65','70','0','2816.5','5099.67','265.683','5.72666','3215:0 3217:0 '),\n+('3217','bedg826','530','3522','3867','65','70','0','2900.18','5096.37','265.127','0.775502','3212:0 3216:0 3218:0 3221:0 '),\n+('3218','bedg827','530','3522','3787','65','70','0','2929.12','4947.5','266.731','4.91062','3192:0 3217:0 3219:0 3221:0 '),\n+('3219','bedg828','530','3522','3787','65','70','0','2898.72','4782.92','277.957','4.52971','3218:0 3220:0 '),\n+('3220','bedg829','530','3522','3787','65','70','0','2984.26','4824.35','278.892','1.56875','3219:0 3221:0 '),\n+('3221','bedg830','530','3522','3787','65','70','0','2852.35','4933.54','267.974','6.12327','3220:0 3218:0 3192:0 3217:0 '),\n+('3222','bedg831','530','3522','3833','65','70','0','2545.57','5293.37','266.598','6.1005','3215:0 3223:0 3237:0 '),\n+('3223','bedg832','530','3522','3833','65','70','0','2456.71','5321.66','264.923','2.73899','3222:0 3224:0 3230:0 3237:0 '),\n+('3224','bedg833','530','3522','3833','65','70','0','2282.88','5171.44','264.676','3.69325','3223:0 3225:0 3230:0 '),\n+('3225','bedg834','530','3522','3953','65','70','0','2194.7','5122.32','258.602','4.28623','3224:0 3226:0 '),\n+('3226','bedg835','530','3522','3953','65','70','0','2189.16','5051.76','252.603','2.1395','3225:0 3227:0 '),\n+('3227','bedg836','530','3522','3953','65','70','0','2116.51','5085.08','256.974','5.94279','3226:0 3228:0 3231:0 '),\n+('3228','bedg837','530','3522','3953','65','70','0','2090.4','5162.61','265.04','2.37496','3227:0 3229:0 3233:0 '),\n+('3229','bedg838','530','3522','3953','65','70','0','2063.34','5235.11','265.179','0.122197','3228:0 3230:0 '),\n+('3230','bedg839','530','3522','3833','65','70','0','2316.24','5243.18','261.206','0.031876','3229:0 3224:0 3223:0 '),\n+('3231','bedg840','530','3522','3953','65','70','0','2089.3','5022.57','223.769','0.835746','3227:0 3232:0 '),\n+('3232','bedg841','530','3522','3953','65','70','0','2164.72','5005.6','178.623','5.23199','3231:0 3074:0 '),\n+('3233','bedg842','530','3522','3953','65','70','0','1740.09','5133.27','265.058','3.33132','3228:0 3234:0 '),\n+('3234','bedg843','530','3522','3919','65','70','0','1674.61','5254.04','265.321','1.92546','3233:0 3235:0 '),\n+('3235','bedg844','530','3522','3919','65','70','0','1612.29','5464.5','265.941','1.8587','3234:0 3044:0 3043:0 '),\n+('3236','bedg845','530','3522','3833','65','70','0','2395.42','5588.73','267.895','5.88623','3035:0 3237:0 '),\n+('3237','bedg846','530','3522','3833','65','70','0','2397.69','5390.93','264.287','4.72385','3236:0 3223:0 3222:0 '),\n+('3238','bedg847','530','3522','3954','65','70','0','3094.62','6101.88','130.589','1.3065','3185:0 3239:0 '),\n+('3239','bedg848','530','3522','3954','65','70','0','3120.37','6181.58','137.697','1.30738','3238:0 3240:0 '),\n+('3240','bedg849','530','3522','3954','65','70','0','3147.57','6248.67','124.212','0.486635','3239:0 3241:0 '),\n+('3241','bedg850','530','3522','3954','65','70','0','3217.19','6289.41','124.654','1.62939','3240:0 3242:0 '),\n+('3242','bedg851','530','3522','3954','65','70','0','3215.71','6365.94','119.805','1.02856','3241:0 3243:0 '),\n+('3243','bedg852','530','3522','3954','65','70','0','3279.94','6464.48','149.929','0.887189','3242:0 3244:0 '),\n+('3244','bedg853','530','3522','3830','65','70','0','3323.9','6505.86','159.443','0.796868','3243:0 3245:0 3260:0 '),\n+('3245','bedg854','530','3522','3781','65','70','0','3488.68','6673.14','148.361','0.895043','3244:0 3246:0 3260:0 '),\n+('3246','bedg855','530','3522','3781','65','70','0','3566.67','6807.32','137.289','2.01031','3245:0 3247:0 3256:0 '),\n+('3247','bedg856','530','3522','3830','65','70','0','3446.01','7089.42','152.831','1.97497','3246:0 3248:0 3250:0 3251:0 '),\n+('3248','bedg857','530','3522','3830','65','70','0','3286.14','7143.51','168.873','3.41617','3247:0 3249:0 '),\n+('3249','bedg858','530','3522','3830','65','70','0','3303.87','6962.97','164.125','0.482707','3248:0 3250:0 '),\n+('3250','bedg859','530','3522','3830','65','70','0','3360.25','6980.78','163.409','0.305992','3249:0 3247:0 '),\n+('3251','bedg860','530','3522','3903','65','70','0','3481.37','7222.76','141.365','1.30345','3247:0 3252:0 '),\n+('3252','bedg861','530','3522','3903','65','70','0','3590.93','7211.94','137.85','5.43858','3251:0 3253:0 '),\n+('3253','bedg862','530','3522','3903','65','70','0','3641.59','7154.45','142.814','5.19904','3252:0 3254:0 '),\n+('3254','bedg863','530','3522','3903','65','70','0','3697.31','7047.11','149.054','4.94771','3253:0 3255:0 '),\n+('3255','bedg864','530','3522','3830','65','70','0','3765.97','6838.37','141.277','4.82598','3254:0 3256:0 '),\n+('3256','bedg865','530','3522','3781','65','70','0','3736.74','6702.81','136.262','4.17018','3246:0 3255:0 3257:0 '),\n+('3257','bedg866','530','3522','3781','65','70','0','3630.09','6582.49','134.163','3.31724','3256:0 3258:0 '),\n+('3258','bedg867','530','3522','3781','65','70','0','3502.63','6555.2','131.654','3.74921','3257:0 3259:0 '),\n+('3259','bedg868','530','3522','3830','65','70','0','3447.34','6507.7','134.998','3.17979','3258:0 3260:0 '),\n+('3260','bedg869','530','3522','3830','65','70','0','3367.73','6538.54','150.282','2.78317','3244:0 3259:0 3245:0 '),\n+('3261','bedg870','530','3522','3824','65','70','0','1832.55','6314.24','0.000980531','2.39439','3131:0 3262:0 '),\n+('3262','bedg871','530','3522','3824','65','70','0','1739.41','6384.91','-10.3385','3.01878','3261:0 3263:0 '),\n+('3263','bedg872','530','3522','3776','65','70','0','1654.93','6407.76','-10.1815','2.87741','3262:0 3130:0 3264:0 '),\n+('3264','bedg873','530','3522','3776','65','70','0','1604.99','6316.74','1.22794','4.18509','3263:0 3265:0 '),\n+('3265','bedg874','530','3522','3824','65','70','0','1475.3','6532.8','-10.3385','5.60273','3264:0 3266:0 '),\n+('3266','bedg876','530','3522','3778','65','70','0','1361.1','6534.43','6.43101','6.15055','3265:0 3267:0 '),\n+('3267','bedg877','530','3522','3778','65','70','0','1339.54','6590.17','-8.16829','2.78314','3268:0 3266:0 '),\n+('3268','bedg878','530','3522','3778','65','70','0','1355.69','6688.28','-22.7054','2.60447','3267:0 '),\n+('3269','net880','530','3523','3868','67','70','0','3385.12','4257.44','122.681','4.84713','3200:0 3201:0 3270:0 '),\n+('3270','net881','530','3523','3523','67','70','0','3394.02','4139.94','151.096','1.574','3269:0 3271:0 '),\n+('3271','net883','530','3523','3523','67','70','0','3433.77','4036.61','177.446','4.57617','3272:0 3270:0 '),\n+('3272','net884','530','3523','3523','67','70','0','3443.07','3946.93','166.449','4.15205','3271:0 3273:0 '),\n+('3273','net885','530','3523','3523','67','70','0','3403.88','3894.6','153.082','3.72008','3272:0 3274:0 '),\n+('3274','net886','530','3523','3523','67','70','0','3356.69','3870.95','144.623','4.91389','3273:0 3275:0 3284:0 3285:0 '),\n+('3275','net887','530','3523','3523','67','70','0','3379','3814.14','142.822','4.46228','3274:0 3276:0 '),\n+('3276','net888','530','3523','3725','67','70','0','3356.46','3730.03','141.12','5.51863','3275:0 3277:0 '),\n+('3277','net889','530','3523','3725','67','70','0','3395.58','3698.26','144.989','5.91132','3276:0 3278:0 '),\n+('3278','net890','530','3523','3725','67','70','0','3463.55','3674.25','150.706','4.98848','3277:0 3279:0 '),\n+('3279','net891','530','3523','3725','67','70','0','3489.72','3601.83','158.293','4.35231','3278:0 3280:0 '),\n+('3280','net892','530','3523','3725','67','70','0','3537.5','3575.94','135.389','2.48697','3279:0 3281:0 '),\n+('3281','net893','530','3523','3725','67','70','0','3582.4','3548.11','124.35','1.42276','3280:0 3282:0 '),\n+('3282','net894','530','3523','3721','67','70','0','3601.15','3625.27','127.148','2.16889','3281:0 3283:0 '),\n+('3283','net895','530','3523','3725','67','70','0','3506.7','3744.78','141.004','1.82724','3282:0 3284:0 '),\n+('3284','net896','530','3523','3523','67','70','0','3492.41','3820.83','138.898','2.78542','3283:0 3274:0 '),\n+('3285','net897','530','3523','3523','67','70','0','3288.33','3814.38','139.103','3.2089','3274:0 3286:0 '),\n+('3286','net898','530','3523','3523','67','70','0','3228.8','3802.26','137.833','3.34242','3285:0 3287:0 3318:0 3319:0 '),\n+('3287','net899','530','3523','3712','67','70','0','3127.16','3690.44','142.929','3.42881','3286:0 3318:0 3319:0 3324:0 '),\n+('3288','net903','530','3523','3712','67','70','0','2999.35','3698.08','144.031','2.76314','3289:0 3315:0 3323:0 3316:0 '),\n+('3289','net904','530','3523','3712','67','70','0','2922.84','3722.08','143.833','1.69299','3290:0 3288:0 '),\n+('3290','net905','530','3523','3523','67','70','0','2885.06','3679.8','140.256','0.687686','3289:0 3291:0 '),\n+('3291','net906','530','3523','3523','67','70','0','2816.99','3697.81','120.765','3.2795','3290:0 3292:0 '),\n+('3292','net907','530','3523','3523','67','70','0','2757.67','3673.48','134.526','2.26241','3291:0 3293:0 3336:0 '),\n+('3293','net908','530','3523','3729','67','70','0','2719.32','3721.32','139.083','3.091','3292:0 3294:0 '),\n+('3294','net909','530','3523','3729','67','70','0','2639.32','3732.64','144.622','2.23884','3293:0 3295:0 '),\n+('3295','net910','530','3523','3729','67','70','0','2585.42','3776.42','143.482','2.4509','3294:0 3296:0 3339:0 '),\n+('3296','net911','530','3523','3729','67','70','0','2514.06','3815.49','129.888','2.12889','3295:0 3297:0 '),\n+('3297','net912','530','3523','3729','67','70','0','2508.94','3883.67','132.691','1.6655','3296:0 3298:0 '),\n+('3298','net913','530','3523','3729','67','70','0','2477.31','4067.17','130.201','5.03879','3297:0 3299:0 '),\n+('3299','net914','530','3523','3523','67','70','0','2545.65','4202.77','136.176','0.542382','3298:0 3300:0 '),\n+('3300','net915','530','3523','3523','67','70','0','2609.03','4303.08','140.386','0.000453472','3299:0 3301:0 '),\n+('3301','net916','530','3523','3726','67','70','0','2747.27','4290.97','151.997','6.19723','3300:0 3302:0 '),\n+('3302','net917','530','3523','3726','67','70','0','2895.85','4349.05','157.653','4.53219','3301:0 3303:0 '),\n+('3303','net918','530','3523','3726','67','70','0','2865.03','4280.18','159.366','5.10554','3302:0 3304:0 '),\n+('3304','net919','530','3523','3726','67','70','0','2890.62','4215.62','164.008','5.09376','3303:0 3305:0 3312:0 '),\n+('3305','net920','530','3523','3726','67','70','0','2940.62','4199.62','164.007','0.322464','3304:0 3306:0 3311:0 '),\n+('3306','net921','530','3523','3726','67','70','0','2999.27','4224.49','160.851','0.401004','3305:0 3307:0 '),\n+('3307','net922','530','3523','3726','67','70','0','3026.75','4163.73','153.291','4.74035','3306:0 3308:0 '),\n+('3308','net923','530','3523','3726','67','70','0','3010.04','4106.05','150.967','4.08455','3307:0 3309:0 '),\n+('3309','net924','530','3523','3726','67','70','0','2977.7','4033.08','148.218','1.89329','3308:0 3310:0 3313:0 '),\n+('3310','net925','530','3523','3726','67','70','0','2939.58','4099.08','162.599','2.04252','3309:0 3311:0 '),\n+('3311','net926','530','3523','3726','67','70','0','2918.39','4149.56','164.008','1.96398','3310:0 3305:0 3312:0 '),\n+('3312','net927','530','3523','3726','67','70','0','2870.91','4167.67','164.007','1.92863','3311:0 3304:0 '),\n+('3313','net928','530','3523','3523','67','70','0','2982.92','3921.89','146.316','1.62627','3309:0 3314:0 '),\n+('3314','net929','530','3523','3523','67','70','0','3051.56','3890.86','143.683','5.83993','3313:0 3315:0 '),\n+('3315','net930','530','3523','3712','67','70','0','3039.6','3790.04','145.363','4.28485','3314:0 3317:0 3288:0 '),\n+('3316','net931','530','3523','3712','67','70','0','3064.35','3704.05','142.478','3.15387','3288:0 3324:0 '),\n+('3317','net932','530','3523','3523','67','70','0','3092.9','3822.62','142.74','5.9106','3315:0 3318:0 '),\n+('3318','net933','530','3523','3523','67','70','0','3125.95','3779.17','142.072','0.118293','3317:0 3287:0 3286:0 '),\n+('3319','net934','530','3523','3523','67','70','0','3196.76','3711.71','129.813','5.90669','3287:0 3286:0 3320:0 '),\n+('3320','net935','530','3523','3523','67','70','0','3253.35','3630.84','126.607','3.66438','3319:0 3321:0 '),\n+('3321','net936','530','3523','3523','67','70','0','3139.27','3579.06','142.77','3.24419','3320:0 3322:0 '),\n+('3322','net937','530','3523','3712','67','70','0','3046.95','3595.34','143.235','1.59486','3321:0 3325:0 3324:0 '),\n+('3323','net938','530','3523','3712','1','60','0','2935.94','3648.71','132.577','0.379446','3288:0 3324:0 '),\n+('3324','net939','530','3523','3712','67','70','1','3062.95','3645.68','144.33','5.51596','3287:0 3322:0 3323:0 3316:0 '),\n+('3325','net940','530','3523','3523','67','70','0','3016.58','3539.17','143.581','3.54657','3322:0 3326:0 3340:0 '),\n+('3326','net941','530','3523','3523','67','70','0','2859.55','3471.67','136.322','0.389269','3325:0 3327:0 3334:0 '),\n+('3327','net942','530','3523','3723','67','70','0','2805.81','3360.76','144.743','4.68931','3326:0 3328:0 '),\n+('3328','net944','530','3523','3723','67','70','0','2802.57','3251.58','147.597','1.60466','3327:0 3329:0 '),\n+('3329','net945','530','3523','3723','67','70','0','2769.35','3153.34','149.314','2.61194','3330:0 3328:0 '),\n+('3330','net946','530','3523','3723','67','70','0','2713.25','3168.67','147.073','4.21416','3329:0 3331:0 '),\n+('3331','net947','530','3523','3721','67','70','0','2645.59','3055.71','123.459','0.911553','3330:0 3332:0 3347:0 3348:0 '),\n+('3332','net948','530','3523','3723','67','70','0','2635.1','3154.85','135.257','1.35923','3331:0 3333:0 '),\n+('3333','net949','530','3523','3523','67','70','0','2617.24','3347.94','142.696','1.66554','3332:0 3334:0 3337:0 '),\n+('3334','net950','530','3523','3523','67','70','0','2742.84','3444.31','140.23','4.12776','3333:0 3326:0 3335:0 '),\n+('3335','net951','530','3523','3523','67','70','0','2704.66','3571.67','134.738','5.57132','3334:0 3336:0 '),\n+('3336','net952','530','3523','3523','67','70','0','2828.97','3612.56','157.278','2.2157','3335:0 3292:0 '),\n+('3337','net953','530','3523','3721','67','70','0','2522.14','3469.45','130.706','1.47151','3333:0 3338:0 '),\n+('3338','net954','530','3523','3523','67','70','0','2544.17','3592.01','138.626','1.39297','3337:0 3339:0 '),\n+('3339','net955','530','3523','3721','67','70','0','2528.36','3697.54','134.608','0.964924','3338:0 3295:0 '),\n+('3340','net956','530','3523','3523','67','70','0','3051.39','3455.12','118.577','4.822','3325:0 3341:0 '),\n+('3341','net957','530','3523','3523','67','70','0','3057.51','3309.81','106.678','5.00264','3340:0 3342:0 '),\n+('3342','net958','530','3523','3721','67','70','0','3103.15','3197.03','101.208','5.67416','3341:0 3343:0 3344:0 '),\n+('3343','net959','530','3523','3721','67','70','0','3221.06','3114.67','102.79','5.68986','3342:0 3385:0 3386:0 '),\n+('3344','net960','530','3523','3921','67','70','0','2987.27','3194.73','134.342','4.05624','3342:0 3345:0 '),\n+('3345','net961','530','3523','3921','67','70','0','2929.07','3149.43','147.291','1.12512','3344:0 3346:0 '),\n+('3346','net962','530','3523','3721','67','70','0','2829.63','2992.81','120.478','2.75876','3345:0 3347:0 '),\n+('3347','net963','530','3523','3721','67','70','0','2726.18','3015.49','121.825','2.99045','3346:0 3331:0 '),\n+('3348','net964','530','3523','3721','67','70','0','2519.49','2940.34','119.757','3.88108','3331:0 3349:0 '),\n+('3349','net965','530','3523','3730','67','70','0','2455.26','2867.95','131.925','4.34839','3348:0 3350:0 3354:0 '),\n+('3350','net966','530','3523','3730','67','70','0','2531.85','2827','126.995','4.61936','3351:0 3349:0 '),\n+('3351','net967','530','3523','3730','67','70','0','2555.92','2738.68','119.45','1.55822','3350:0 3352:0 3376:0 '),\n+('3352','net970','530','3523','3730','67','70','0','2501.34','2718.83','131.657','2.74617','3353:0 3351:0 3375:0 '),\n+('3353','net971','530','3523','3730','67','70','0','2440.85','2747.78','134.493','2.69511','3354:0 3356:0 3352:0 '),\n+('3354','net972','530','3523','3730','67','70','0','2424.83','2798.75','134.493','1.0929','3353:0 3355:0 3349:0 '),\n+('3355','net973','530','3523','3730','67','70','0','2364.39','2781.17','133.656','5.81904','3354:0 3356:0 '),\n+('3356','net974','530','3523','3730','67','70','0','2392.65','2726.98','134.491','5.0199','3353:0 3355:0 3357:0 '),\n+('3357','net975','530','3523','3730','67','70','0','2364.76','2665.91','130.977','1.12433','3356:0 3358:0 '),\n+('3358','net976','530','3523','3523','67','70','0','2326','2600.19','126.548','4.98456','3357:0 3359:0 '),\n+('3359','net977','530','3523','3523','67','70','0','2287.03','2439.79','104.053','4.47406','3358:0 3360:0 '),\n+('3360','net978','530','3523','3523','67','70','0','2336.37','2367.16','115.816','5.18877','3359:0 3373:0 3361:0 '),\n+('3361','net979','530','3523','3523','67','70','0','2310.67','2271.59','98.2741','5.2673','3360:0 3362:0 3367:0 '),\n+('3362','net981','530','3523','3935','67','70','0','2246.67','2310.26','89.8977','3.71223','3363:0 3372:0 3361:0 '),\n+('3363','net982','530','3523','3934','67','70','0','2176.86','2262.3','76.0387','4.01068','3362:0 3364:0 3372:0 '),\n+('3364','net983','530','3523','3934','67','70','0','2119.56','2206.31','71.3039','6.1607','3363:0 3365:0 '),\n+('3365','net984','530','3523','3934','67','70','0','2180.34','2173.31','71.6002','5.61288','3364:0 3366:0 '),\n+('3366','net985','530','3523','3934','67','70','0','2233.52','2115.22','71.2016','2.29655','3365:0 3367:0 '),\n+('3367','net987','530','3523','3934','67','70','0','2294.17','2189.49','93.5883','6.28047','3368:0 3361:0 3366:0 '),\n+('3368','net990','530','3523','3934','67','70','0','2353.3','2183.05','89.3993','6.15874','3367:0 3369:0 '),\n+('3369','net991','530','3523','3879','67','70','0','2411.12','2183.37','89.9985','4.94529','3368:0 3370:0 '),\n+('3370','net992','530','3523','3879','67','70','0','2523.75','2185.83','102.693','5.98201','3369:0 3371:0 '),\n+('3371','net993','530','3523','3879','67','70','0','2484.6','2033.27','88.1469','4.36606','3370:0 '),\n+('3372','net997','530','3523','3935','67','70','0','2183.73','2382.64','98.0661','5.72675','3362:0 3363:0 '),\n+('3373','net999','530','3523','3837','67','70','0','2400.24','2395.93','142.613','3.9737','3374:0 3360:0 '),\n+('3374','net1000','530','3523','3837','67','70','0','2482.84','2424.13','134.571','3.45533','3373:0 3375:0 '),\n+('3375','net1001','530','3523','3523','67','70','0','2516.55','2638.79','129.583','6.18383','3374:0 3352:0 3376:0 '),\n+('3376','net1003','530','3523','3523','67','70','0','2599.94','2630.3','129.384','5.99453','3351:0 3375:0 3377:0 '),\n+('3377','net1004','530','3523','3721','67','70','0','2697.9','2608.37','102.479','0.0883238','3378:0 3376:0 '),\n+('3378','net1005','530','3523','3721','67','70','0','2824.9','2626.19','104.537','0.139375','3377:0 3379:0 '),\n+('3379','net1006','530','3523','3523','67','70','0','2944.38','2624.27','115.88','6.27726','3378:0 3380:0 '),\n+('3380','net1007','530','3523','3523','67','70','0','3044.31','2606.49','109.94','6.10839','3379:0 3381:0 3410:0 '),\n+('3381','net1008','530','3523','3523','67','70','0','3088.57','2759.93','115.588','1.28997','3380:0 3382:0 '),\n+('3382','net1009','530','3523','3523','67','70','0','3181.15','2839.31','132.63','0.00191784','3381:0 3383:0 '),\n+('3383','net1010','530','3523','3877','67','70','0','3314.68','2857.1','140.864','0.174705','3382:0 3384:0 3394:0 '),\n+('3384','net1011','530','3523','3523','67','70','0','3251.04','2889.15','139.525','5.61752','3383:0 3385:0 '),\n+('3385','net1012','530','3523','3523','67','70','0','3260.45','2979.53','133.71','1.72431','3384:0 3343:0 '),\n+('3386','net1013','530','3523','3721','67','70','0','3328.19','3109.33','123.938','0.003479','3343:0 3387:0 '),\n+('3387','net1014','530','3523','3721','67','70','0','3467.09','3253.66','100.83','0.804579','3386:0 3388:0 '),\n+('3388','net1015','530','3523','3523','67','70','0','3558.21','3192.19','105.717','5.68976','3387:0 3389:0 '),\n+('3389','net1016','530','3523','3877','67','70','0','3523.96','3113.12','130.592','4.30353','3388:0 3390:0 '),\n+('3390','net1017','530','3523','3877','67','70','0','3511.13','3048.77','142.826','5.09678','3389:0 3391:0 '),\n+('3391','net1018','530','3523','3877','67','70','0','3536.43','3000.68','143.097','5.20281','3390:0 3395:0 3392:0 '),\n+('3392','net1020','530','3523','3877','67','70','0','3646.43','3045.04','123.609','0.195882','3391:0 3393:0 '),\n+('3393','net1021','530','3523','3523','67','70','0','3924.41','3119.4','115.634','0.278359','3526:0 3392:0 '),\n+('3394','net1022','530','3523','3877','67','70','1','3410.82','2878.14','142.972','0.18804','3383:0 3395:0 3396:0 '),\n+('3395','net1023','530','3523','3877','67','70','0','3473.27','2973.11','143.266','0.989146','3394:0 3391:0 '),\n+('3396','net1024','530','3523','3877','67','70','0','3472.55','2819.87','145.201','4.69465','3394:0 3397:0 '),\n+('3397','net1025','530','3523','3523','67','70','0','3576.26','2719.73','151.525','3.15525','3396:0 3398:0 '),\n+('3398','net1026','530','3523','3523','67','70','0','3439.56','2608.19','150.833','0.802981','3397:0 3399:0 '),\n+('3399','net1027','530','3523','3523','67','70','0','3372.76','2617.96','145.564','2.25596','3398:0 3400:0 3403:0 '),\n+('3400','net1028','530','3523','3727','67','70','0','3328.76','2674.02','157.504','3.71287','3399:0 3401:0 '),\n+('3401','net1029','530','3523','3727','67','70','0','3250.52','2628.38','139.888','2.91962','3400:0 3402:0 '),\n+('3402','net1030','530','3523','3523','67','70','0','3285.42','2563.6','113.658','4.09772','3401:0 3403:0 '),\n+('3403','net1031','530','3523','3523','67','70','0','3352.87','2536.5','95.7401','1.21138','3399:0 3402:0 3404:0 '),\n+('3404','net1033','530','3523','3728','67','70','0','3246.86','2379.03','91.5897','4.38044','3403:0 3405:0 '),\n+('3405','net1035','530','3523','3728','67','70','0','3241.13','2272.31','99.5301','4.56501','3404:0 3406:0 '),\n+('3406','net1037','530','3523','3728','67','70','0','3202.86','2140.94','138.867','1.63547','3423:0 3405:0 3407:0 '),\n+('3407','net1039','530','3523','3728','67','70','0','3162.82','2326.75','134.887','1.78864','3406:0 3408:0 '),\n+('3408','net1040','530','3523','3728','67','70','0','3160.48','2406.47','131.04','1.60014','3409:0 3407:0 '),\n+('3409','net1041','530','3523','3728','67','70','0','3113.17','2449.04','120.183','2.1774','3408:0 3410:0 '),\n+('3410','net1042','530','3523','3728','67','70','0','3069.26','2504.52','114.18','1.78077','3409:0 3380:0 3411:0 '),\n+('3411','net1043','530','3523','3734','67','70','0','3083.75','2363.04','144.526','4.81242','3410:0 3412:0 '),\n+('3412','net1044','530','3523','3734','67','70','0','3085.33','2294.83','150.494','4.74173','3411:0 3413:0 3419:0 '),\n+('3413','net1045','530','3523','3734','67','70','0','3125.61','2238.22','150.562','3.67359','3412:0 3414:0 '),\n+('3414','net1046','530','3523','3734','67','70','0','3074.15','2209.78','161.33','3.55578','3413:0 3415:0 '),\n+('3415','net1047','530','3523','3734','67','70','0','3017.03','2183.87','165.329','3.55578','3414:0 3416:0 3418:0 '),\n+('3416','net1048','530','3523','3734','67','70','0','2998.08','2133.47','165.328','4.35295','3415:0 3417:0 3420:0 '),\n+('3417','net1049','530','3523','3734','67','70','0','2946.6','2153.28','165.328','2.77429','3416:0 3418:0 '),\n+('3418','net1050','530','3523','3734','67','70','0','2965.73','2206.06','165.328','1.22313','3417:0 3415:0 3419:0 '),\n+('3419','net1051','530','3523','3734','67','70','0','2936.31','2281.19','161.738','6.1684','3412:0 3418:0 '),\n+('3420','net1054','530','3523','3734','67','70','0','3024.32','2073.46','161.904','5.51533','3416:0 3421:0 '),\n+('3421','net1055','530','3523','3728','67','70','0','3109.36','1996.97','143.897','5.55067','3420:0 3422:0 '),\n+('3422','net1056','530','3523','3728','67','70','0','3166.19','1968.36','143.636','5.79022','3421:0 3423:0 3424:0 '),\n+('3423','net1057','530','3523','3728','67','70','0','3200.13','2051.68','140.786','4.08789','3422:0 3406:0 '),\n+('3424','net1058','530','3523','3728','67','70','0','3152.12','1897.92','143.899','6.07689','3422:0 3425:0 3427:0 '),\n+('3425','net1059','530','3523','3728','67','70','0','3101.78','1824.2','144.391','4.03094','3426:0 3424:0 '),\n+('3426','net1060','530','3523','3728','67','70','1','3001.93','1820.1','139.674','3.72463','3425:0 '),\n+('3427','net1061','530','3523','3728','67','70','0','3242.1','1874.48','139.223','3.2581','3424:0 3428:0 '),\n+('3428','net1062','530','3523','3721','67','70','0','3356.3','1846.42','102.117','6.15621','3427:0 3429:0 '),\n+('3429','net1063','530','3523','3721','67','70','0','3493.95','1840.83','95.7573','0.214661','3428:0 3430:0 '),\n+('3430','net1064','530','3523','3735','67','70','0','3613.29','1892.38','114.291','3.62722','3429:0 3459:0 3460:0 '),\n+('3431','net1066','530','3523','3736','67','70','0','3865.27','1760.4','212.947','0.885387','3432:0 3456:0 '),\n+('3432','net1067','530','3523','3736','67','70','0','3913.4','1809.95','227.674','2.24413','3431:0 3442:0 3433:0 '),\n+('3433','net1070','530','3523','3736','67','70','0','3881.31','1918.58','254.223','0.97178','3432:0 3434:0 '),\n+('3434','net1071','530','3523','3736','67','70','0','3915.93','1973.35','257.813','1.00712','3435:0 3437:0 3433:0 '),\n+('3435','net1072','530','3523','3736','67','70','0','3903.14','2024.48','257.813','1.77289','3434:0 3436:0 '),\n+('3436','net1073','530','3523','3736','67','70','0','3959.61','2037.62','257.813','0.233506','3435:0 3437:0 3438:0 '),\n+('3437','net1074','530','3523','3736','67','70','0','3969.45','1982.24','257.813','4.86736','3436:0 3434:0 '),\n+('3438','net1075','530','3523','3736','67','70','0','3996.64','2094.06','254.332','0.975711','3436:0 3439:0 '),\n+('3439','net1077','530','3523','3736','67','70','0','4094.87','2029.53','236.513','5.17366','3438:0 3440:0 '),\n+('3440','net1078','530','3523','3736','67','70','0','4145.6','1950.14','225.805','2.1106','3443:0 3441:0 3439:0 '),\n+('3441','net1079','530','3523','3736','67','70','0','4106.82','1883.96','228.654','3.273','3440:0 3442:0 '),\n+('3442','net1081','530','3523','3736','67','70','0','3993.09','1800.64','228.295','3.01381','3432:0 3441:0 '),\n+('3443','net1082','530','3523','3736','67','70','0','4192.46','2017.97','187.695','1.85243','3440:0 3444:0 '),\n+('3444','net1083','530','3523','3736','67','70','0','4174.2','2071.5','164.367','1.33406','3443:0 3445:0 '),\n+('3445','net1084','530','3523','3735','67','70','0','4198.79','2173.44','151.336','1.33406','3444:0 3446:0 3447:0 3477:0 '),\n+('3446','net1085','530','3523','3735','67','70','0','4292.53','2293.49','122.367','0.595787','3445:0 3478:0 '),\n+('3447','net1086','530','3523','3854','67','70','0','4247.96','2110.73','144.575','4.7741','3445:0 3448:0 '),\n+('3448','net1087','530','3523','3735','67','70','0','4252.18','1989.35','136.107','4.82514','3447:0 3449:0 '),\n+('3449','net1088','530','3523','3735','67','70','0','4268.67','1894.47','138.946','4.87226','3448:0 3450:0 3453:0 '),\n+('3450','net1089','530','3523','3735','67','70','0','4299.75','1730.52','113.615','4.18507','3449:0 3451:0 '),\n+('3451','net1090','530','3523','3735','67','70','0','4113.8','1674.62','130.483','2.68103','3450:0 3452:0 '),\n+('3452','net1091','530','3523','3735','67','70','0','4046.36','1742.75','145.812','2.35116','3451:0 3453:0 3454:0 '),\n+('3453','net1092','530','3523','3735','67','70','0','4181.61','1781.88','136.718','0.423012','3452:0 3449:0 '),\n+('3454','net1093','530','3523','3735','67','70','0','3930.55','1683.62','139.355','3.27165','3452:0 3455:0 '),\n+('3455','net1094','530','3523','3735','67','70','0','3819.95','1651.37','133.174','2.01794','3454:0 3457:0 3456:0 '),\n+('3456','net1095','530','3523','3735','67','70','0','3785.44','1751.5','175.377','2.55396','3431:0 3455:0 3459:0 '),\n+('3457','net1097','530','3523','3735','67','70','0','3779.17','1581.07','120.895','1.36998','3455:0 3458:0 '),\n+('3458','net1098','530','3523','3735','67','70','0','3710.46','1647.45','128.67','1.14614','3457:0 3459:0 '),\n+('3459','net1099','530','3523','3735','67','70','0','3682.83','1822.97','129.53','5.05546','3458:0 3430:0 3456:0 '),\n+('3460','net1100','530','3523','3735','67','70','0','3551.83','1960.87','89.9501','1.23472','3430:0 3461:0 3462:0 '),\n+('3461','net1101','530','3523','3735','67','70','0','3582.85','2061.58','97.1173','1.30541','3460:0 '),\n+('3462','net1102','530','3523','3735','67','70','0','3654.98','2151.19','121.699','1.26065','3460:0 3463:0 '),\n+('3463','net1103','530','3523','3735','67','70','0','3647.05','2320.07','95.0628','1.67298','3462:0 3464:0 '),\n+('3464','net1104','530','3523','3735','67','70','0','3753.6','2270.39','127.706','5.84031','3463:0 3465:0 '),\n+('3465','net1105','530','3523','3735','67','70','0','3743.54','2216.22','132.261','5.08632','3464:0 3466:0 '),\n+('3466','net1106','530','3523','3880','67','70','0','3752.43','2164.28','140.754','4.1949','3465:0 3467:0 3473:0 '),\n+('3467','net1107','530','3523','3880','67','70','0','3712.58','2091.74','151.686','5.93062','3466:0 3468:0 '),\n+('3468','net1108','530','3523','3880','67','70','0','3791.21','2078.46','153.464','0.004788','3467:0 3469:0 '),\n+('3469','net1109','530','3523','3880','67','70','0','3833.37','2045.96','145.651','5.41226','3468:0 3470:0 '),\n+('3470','net1110','530','3523','3880','67','70','0','3890.34','2027.56','147.129','1.10633','3469:0 3471:0 '),\n+('3471','net1112','530','3523','3880','67','70','0','3911.03','2086.24','156.158','1.07294','3470:0 3472:0 '),\n+('3472','net1113','530','3523','3880','67','70','0','3942.19','2139.62','160.422','6.24086','3471:0 '),\n+('3473','net1114','530','3523','3735','67','70','0','3790.48','2245.91','149.586','4.56011','3466:0 3474:0 '),\n+('3474','net1115','530','3523','3735','67','70','0','3843.92','2279.21','153.861','2.84204','3473:0 3475:0 '),\n+('3475','net1116','530','3523','3735','67','70','0','3944.34','2283.35','158.599','6.04059','3474:0 3476:0 '),\n+('3476','net1117','530','3523','3735','67','70','0','4063.98','2226.19','164.346','5.41228','3475:0 3477:0 '),\n+('3477','net1119','530','3523','3735','67','70','0','4123.87','2142.65','157.701','2.91076','3445:0 3476:0 '),\n+('3478','net1121','530','3523','3741','67','70','0','4466.87','2397.83','122.968','0.527102','3446:0 3479:0 '),\n+('3479','net1122','530','3523','3741','67','70','0','4530.13','2410.14','141.874','5.42799','3478:0 3480:0 3484:0 '),\n+('3480','net1123','530','3523','3741','67','70','0','4566.37','2316.31','146.43','5.07457','3479:0 3481:0 '),\n+('3481','net1124','530','3523','3741','67','70','0','4632.34','2295.23','162.104','1.47351','3480:0 3482:0 '),\n+('3482','net1125','530','3523','3741','67','70','0','4622.3','2365.33','187.361','1.96046','3481:0 3483:0 '),\n+('3483','net1126','530','3523','3741','67','70','0','4729.92','2383.24','198.355','3.24458','3482:0 '),\n+('3484','net1127','530','3523','3741','67','70','0','4575.52','2543.12','194.543','0.915856','3479:0 3485:0 '),\n+('3485','net1128','530','3523','3741','67','70','0','4579.8','2608.07','196.971','1.06115','3484:0 3486:0 '),\n+('3486','net1129','530','3523','3741','67','70','0','4616.02','2682.15','187.718','1.52847','3485:0 3487:0 '),\n+('3487','net1130','530','3523','3523','67','70','0','4613.1','2774.93','159.097','0.786306','3486:0 3488:0 3507:0 '),\n+('3488','net1131','530','3523','3523','67','70','0','4581.46','2841.92','146.738','1.62271','3487:0 3489:0 3508:0 '),\n+('3489','net1132','530','3523','3523','67','70','0','4623.84','2957.12','144.621','1.21823','3488:0 3490:0 3509:0 '),\n+('3490','net1133','530','3523','3850','67','70','0','4760.8','2985.3','129.535','0.205073','3489:0 3491:0 '),\n+('3491','net1134','530','3523','3850','67','70','0','4849.32','2917.43','146.288','5.62826','3490:0 3492:0 '),\n+('3492','net1135','530','3523','3874','67','70','0','4916.97','2942.46','157.256','0.212934','3491:0 3493:0 '),\n+('3493','net1136','530','3523','3850','67','70','0','4803.44','3004.17','134.11','2.64374','3492:0 3494:0 '),\n+('3494','net1137','530','3523','3523','67','70','0','4689.74','3022.54','131.238','0.00480604','3493:0 3495:0 '),\n+('3495','net1138','530','3523','3523','67','70','0','4770.95','3072.84','120.927','0.216864','3494:0 3496:0 '),\n+('3496','net1139','530','3523','3523','67','70','0','4841.73','3077.92','111.914','5.77749','3495:0 3497:0 3579:0 '),\n+('3497','net1140','530','3523','3874','67','70','0','4921.37','3026.16','99.5096','5.7068','3496:0 3498:0 '),\n+('3498','net1141','530','3523','3874','67','70','0','5030.73','3015.92','91.2729','6.18983','3497:0 3499:0 '),\n+('3499','net1142','530','3523','3874','67','70','0','5047.36','2928.45','88.8179','4.9057','3498:0 3500:0 '),\n+('3500','net1143','530','3523','3874','67','70','0','4988.68','2838.26','81.9239','3.64121','3499:0 3501:0 '),\n+('3501','net1144','530','3523','3850','67','70','0','4907.06','2817.68','91.5802','3.63336','3500:0 3502:0 '),\n+('3502','net1145','530','3523','3850','67','70','0','4903.41','2721.51','83.4709','4.33629','3501:0 3503:0 '),\n+('3503','net1146','530','3523','3850','67','70','0','4844.82','2634.49','94.0377','2.49061','3502:0 3504:0 '),\n+('3504','net1147','530','3523','3850','67','70','0','4803.14','2703.36','87.3788','2.22751','3503:0 3505:0 '),\n+('3505','net1148','530','3523','3850','67','70','0','4741.03','2771.78','92.6406','2.30998','3504:0 3506:0 '),\n+('3506','net1149','530','3523','3850','67','70','0','4719.31','2848.51','113.113','1.8623','3505:0 3507:0 '),\n+('3507','net1150','530','3523','3850','67','70','0','4656.43','2805.22','134.562','3.22497','3506:0 3487:0 '),\n+('3508','net1151','530','3523','3876','67','70','0','4484.96','2804.2','139.481','1.71701','3488:0 3530:0 '),\n+('3509','net1152','530','3523','3740','67','70','0','4590.85','3169.73','146.93','4.87431','3489:0 3510:0 3511:0 3516:0 3569:0 '),\n+('3510','net1153','530','3523','3740','67','70','0','4693.85','3149.86','170.153','5.31804','3509:0 3511:0 '),\n+('3511','net1154','530','3523','3740','1','60','0','4655.8','3065','169.231','2.59665','3510:0 3509:0 3512:0 '),\n+('3512','net1155','530','3523','3740','67','70','0','4685.7','3259.51','173.132','2.39442','3511:0 3513:0 3515:0 '),\n+('3513','net1156','530','3523','3740','67','70','0','4776.31','3293.39','196.421','1.55207','3512:0 3514:0 '),\n+('3514','net1157','530','3523','3740','67','70','0','4732.45','3359.96','201.252','3.83758','3513:0 3515:0 '),\n+('3515','net1158','530','3523','3740','67','70','0','4630.74','3310.08','170.694','5.45551','3514:0 3512:0 '),\n+('3516','net1159','530','3523','3523','67','70','0','4397.77','3265.13','143.404','2.67128','3509:0 3517:0 3521:0 3522:0 3569:0 3533:0 '),\n+('3517','net1160','530','3523','3739','67','70','0','4463.52','3434.86','167.212','1.19866','3516:0 3518:0 3521:0 '),\n+('3518','net1161','530','3523','3739','67','70','0','4387.49','3412.69','167.78','2.42782','3517:0 3519:0 '),\n+('3519','net1162','530','3523','3739','67','70','0','4350.61','3471.82','175.837','4.81542','3518:0 3520:0 '),\n+('3520','net1163','530','3523','3739','67','70','0','4364.97','3377.13','154.103','0.876653','3519:0 3521:0 '),\n+('3521','net1164','530','3523','3739','67','70','0','4427.16','3339.99','152.658','0.896303','3520:0 3516:0 3517:0 '),\n+('3522','net1165','530','3523','3738','67','70','0','4313.76','3185.04','161.274','0.774559','3516:0 3523:0 '),\n+('3523','net1166','530','3523','3738','67','70','1','4231.39','3159.2','178.712','0.566429','3522:0 3524:0 '),\n+('3524','net1167','530','3523','3738','67','70','0','4178.63','3151.63','175.35','3.55094','3523:0 3525:0 '),\n+('3525','net1168','530','3523','3738','67','70','0','4098.18','3118.59','159.275','3.31924','3524:0 3526:0 '),\n+('3526','net1169','530','3523','3738','67','70','0','4000.86','3107.64','138.035','3.24856','3525:0 3393:0 3527:0 '),\n+('3527','net1170','530','3523','3875','67','70','0','4031.23','3259.48','139.947','1.37536','3526:0 3528:0 '),\n+('3528','net1171','530','3523','3875','67','70','0','4071.98','3372.71','141.877','5.11779','3527:0 3529:0 3535:0 '),\n+('3529','net1172','530','3523','3875','67','70','0','4151.5','3229.24','196.056','3.95933','3528:0 '),\n+('3530','net1173','530','3523','3876','67','70','0','4466.66','2879.42','140.619','2.91867','3508:0 3531:0 '),\n+('3531','net1174','530','3523','3876','67','70','0','4370.42','2904.8','148.304','2.95794','3530:0 3532:0 '),\n+('3532','net1175','530','3523','3876','67','70','0','4330.52','2945.08','132.085','5.41232','3531:0 '),\n+('3533','net1176','530','3523','3523','67','70','0','4301.84','3317.13','147.441','2.74981','3516:0 3534:0 '),\n+('3534','net1178','530','3523','3523','67','70','0','4181.61','3456.1','144.034','2.38458','3535:0 3533:0 '),\n+('3535','net1179','530','3523','3875','67','70','0','4137.43','3393.24','142.177','3.93968','3534:0 3528:0 3536:0 '),\n+('3536','net1180','530','3523','3523','67','70','0','4138.78','3496.33','135.37','2.48591','3535:0 3537:0 3563:0 '),\n+('3537','net1181','530','3523','3852','67','70','0','4091.57','3538.26','117.689','1.98718','3536:0 3538:0 '),\n+('3538','net1182','530','3523','3852','67','70','0','4069.39','3591.81','114.31','2.34453','3537:0 3539:0 '),\n+('3539','net1183','530','3523','3722','67','70','0','3910.13','3724.58','112.828','2.44664','3538:0 3540:0 '),\n+('3540','net1184','530','3523','3722','67','70','0','3891.58','3773.08','119.636','1.37064','3539:0 3541:0 3556:0 '),\n+('3541','net1185','530','3523','3722','67','70','0','3908.92','3833.69','129.749','1.2921','3540:0 3542:0 '),\n+('3542','net1186','530','3523','3722','67','70','0','3990.07','3844.3','168.636','3.74058','3541:0 3543:0 '),\n+('3543','net1188','530','3523','3722','67','70','0','3883.22','3936.25','179.58','1.96754','3542:0 3544:0 '),\n+('3544','net1189','530','3523','3722','67','70','0','3884.07','3990.71','182.988','1.21356','3545:0 3555:0 3543:0 '),\n+('3545','net1190','530','3523','3722','67','70','0','3912.9','4038.34','190.499','6.07518','3544:0 3546:0 '),\n+('3546','net1191','530','3523','3722','67','70','0','3973.04','4023.83','194.227','6.0634','3545:0 3547:0 3549:0 '),\n+('3547','net1192','530','3523','3722','67','70','0','4018.79','4051.87','194.227','0.549902','3546:0 3548:0 3552:0 '),\n+('3548','net1193','530','3523','3722','67','70','0','4047.95','4004.82','194.226','3.89178','3547:0 3549:0 '),\n+('3549','net1194','530','3523','3722','67','70','0','4001.04','3975.21','194.226','3.74256','3548:0 3546:0 3550:0 '),\n+('3550','net1195','530','3523','3722','67','70','0','3987.35','3916.16','191.701','4.48476','3549:0 3551:0 '),\n+('3551','net1196','530','3523','3722','67','70','0','4046.25','3890.47','189.426','0.432092','3550:0 '),\n+('3552','net1197','530','3523','3722','67','70','0','4034.82','4111.42','191.69','4.44076','3547:0 3553:0 '),\n+('3553','net1198','530','3523','3722','67','70','0','4009.09','4170.41','196.566','3.6907','3552:0 3554:0 '),\n+('3554','net1199','530','3523','3722','67','70','0','3913.64','4108.63','193.142','4.23262','3553:0 3555:0 '),\n+('3555','net1200','530','3523','3722','67','70','0','3881.18','4041.13','183.645','4.80596','3554:0 3544:0 '),\n+('3556','net1202','530','3523','3722','67','70','0','3793.14','3905.54','108.811','1.48529','3540:0 3557:0 '),\n+('3557','net1203','530','3523','3881','67','70','0','3802.78','4013.52','122.041','4.63866','3558:0 3556:0 '),\n+('3558','net1204','530','3523','3881','67','70','0','3873.36','4009.36','122.335','5.89452','3557:0 3559:0 '),\n+('3559','net1205','530','3523','3881','67','70','0','3925.68','3980.18','123.291','0.96222','3558:0 3560:0 '),\n+('3560','net1206','530','3523','3881','67','70','0','3946.32','4028.85','115.31','5.07772','3559:0 3561:0 '),\n+('3561','net1207','530','3523','3881','67','70','0','4034.51','3981.16','124.954','0.0315266','3560:0 3562:0 '),\n+('3562','net1208','530','3523','3881','67','70','0','4093.15','3979.78','116.913','6.25973','3561:0 '),\n+('3563','net1209','530','3523','3523','67','70','0','4192.46','3560.85','141.75','3.80144','3536:0 3564:0 '),\n+('3564','net1210','530','3523','3721','67','70','0','4226.42','3607.77','132.686','0.593084','3563:0 3565:0 '),\n+('3565','net1212','530','3523','3721','67','70','0','4313.98','3676.81','118.894','5.57251','3564:0 3566:0 '),\n+('3566','net1213','530','3523','3523','67','70','0','4402.34','3609.63','125.622','5.65104','3567:0 3565:0 '),\n+('3567','net1214','530','3523','3523','67','70','0','4488.77','3626.57','104.723','0.252208','3566:0 3568:0 '),\n+('3568','net1215','530','3523','3721','67','70','0','4533.39','3589.74','117.794','5.57721','3567:0 '),\n+('3569','net1216','530','3523','3740','67','70','0','4515.18','3245.18','144.362','1.06117','3509:0 3516:0 3570:0 '),\n+('3570','net1217','530','3523','3740','67','70','0','4540.26','3296.59','134.776','0.813774','3569:0 3571:0 '),\n+('3571','net1218','530','3523','3523','67','70','0','4586.71','3342.4','125.714','0.566373','3570:0 3572:0 '),\n+('3572','net1219','530','3523','3523','67','70','0','4668.88','3392.34','110.519','0.444637','3571:0 3573:0 '),\n+('3573','net1220','530','3523','3900','67','70','0','4744.11','3423.26','102.517','0.629205','3572:0 3574:0 '),\n+('3574','net1221','530','3523','3900','67','70','0','4791.18','3452.42','102.703','5.32589','3573:0 3575:0 '),\n+('3575','net1222','530','3523','3523','67','70','0','4831.57','3384.27','122','4.79967','3574:0 3576:0 '),\n+('3576','net1223','530','3523','3523','67','70','0','4850.84','3313.75','131.13','3.99465','3575:0 3577:0 '),\n+('3577','net1224','530','3523','3523','67','70','0','4816.07','3269.64','149.703','0.982658','3576:0 3578:0 '),\n+('3578','net1225','530','3523','3523','67','70','0','4832.65','3173.12','139.44','1.878','3577:0 3579:0 '),\n+('3579','net1226','530','3523','3523','67','70','0','4806.1','3117.37','139.757','4.67009','3578:0 3496:0 '),\n+('3580','shmv1227','530','3520','3520','67','70','0','-2866.67','3174.8','12.0966','4.03472','2809:0 3581:0 '),\n+('3581','shmv1228','530','3520','3520','67','70','0','-2919.41','3080.6','39.7651','0.776879','3580:0 3582:0 '),\n+('3582','shmv1229','530','3520','3520','67','70','0','-2912.13','3021.5','54.1235','3.61375','3581:0 3583:0 '),\n+('3583','shmv1230','530','3520','3520','67','70','0','-3025.35','2947.82','86.1102','3.93969','3582:0 3584:0 '),\n+('3584','shmv1231','530','3520','3743','67','70','0','-3075.55','2877.97','82.0334','3.71192','3583:0 3585:0 3592:0 3749:0 '),\n+('3585','shmv1232','530','3520','3743','67','70','0','-3179.64','2866.95','94.9902','2.90296','3584:0 3586:0 '),\n+('3586','shmv1233','530','3520','3743','67','70','0','-3236.04','2882.68','114.136','3.1857','3585:0 3587:0 3746:0 '),\n+('3587','shmv1234','530','3520','3743','67','70','0','-3367.61','2868.56','158.738','3.24853','3586:0 3588:0 3591:0 '),\n+('3588','shmv1235','530','3520','3743','67','70','0','-3404.24','2930.17','169.88','0.354339','3587:0 3589:0 '),\n+('3589','shmv1236','530','3520','3743','67','70','0','-3346.8','2955.36','169.88','0.413244','3588:0 3590:0 '),\n+('3590','shmv1237','530','3520','3743','67','70','0','-3375.43','3001.18','170.817','2.12933','3589:0 3591:0 '),\n+('3591','shmv1238','530','3520','3743','67','70','0','-3444.14','2938.58','172.959','3.88077','3590:0 3587:0 '),\n+('3592','shmv1239','530','3520','3520','67','70','0','-3181.96','2718.28','68.7275','4.12424','3584:0 3593:0 3602:0 '),\n+('3593','shmv1240','530','3520','3744','67','70','0','-3176.94','2562.78','61.0113','0.102998','3592:0 3594:0 3603:0 '),\n+('3594','shmv1241','530','3520','3744','67','70','5','-3111.48','2564.12','61.7347','0.0205314','3593:0 3595:0 '),\n+('3595','shmv1242','530','3520','3744','67','70','5','-3059.25','2507.74','62.9718','4.55621','3594:0 3596:0 '),\n+('3596','shmv1243','530','3520','3744','67','70','4','-3069.01','2436.27','63.7223','4.4227','3595:0 3597:0 '),\n+('3597','shmv1244','530','3520','3520','67','70','0','-3123.06','2321.13','59.93','3.60981','3596:0 3598:0 3604:0 '),\n+('3598','shmv1245','530','3520','3520','67','70','0','-3231.28','2289.35','59.5698','4.92143','3597:0 3599:0 3652:0 '),\n+('3599','shmv1246','530','3520','3520','67','70','0','-3462.86','2282.37','63.8282','3.30352','3598:0 3600:0 3605:0 '),\n+('3600','shmv1247','530','3520','3949','67','70','0','-3455.95','2462.16','58.5579','1.65025','3599:0 3601:0 3652:0 '),\n+('3601','shmv1248','530','3520','3520','67','70','0','-3483.53','2605.88','62.0554','4.92536','3600:0 3602:0 3750:0 '),\n+('3602','shmv1249','530','3520','3520','67','70','0','-3301.81','2669.56','57.3856','0.154061','3601:0 3592:0 3603:0 '),\n+('3603','shmv1250','530','3520','3744','67','70','0','-3199.36','2470.72','62.1645','2.00446','3602:0 3593:0 3604:0 '),\n+('3604','shmv1251','530','3520','3520','67','70','0','-3210.03','2392.06','61.8107','5.34555','3597:0 3603:0 '),\n+('3605','shmv1252','530','3520','3520','67','70','0','-3690.32','2310.79','78.5618','6.17099','3599:0 3606:0 3612:0 3750:0 '),\n+('3606','shmv1253','530','3520','3752','67','70','0','-3792.84','2478.03','79.8242','1.51751','3605:0 3607:0 3611:0 '),\n+('3607','shmv1254','530','3520','3752','67','70','0','-3790.89','2565.75','91.2376','1.68244','3606:0 3608:0 3609:0 '),\n+('3608','shmv1255','530','3520','3752','67','70','0','-3793.32','2666.77','101.912','1.6471','3607:0 '),\n+('3609','shmv1256','530','3520','3752','67','70','0','-4020.54','2670.54','126.986','4.24676','3607:0 3610:0 '),\n+('3610','shmv1257','530','3520','3752','67','70','0','-4064.49','2549.64','134.278','5.45704','3609:0 3611:0 '),\n+('3611','shmv1258','530','3520','3752','67','70','0','-3950.4','2473.76','116.781','0.0024457','3610:0 3606:0 '),\n+('3612','shmv1259','530','3520','3745','67','70','0','-3762.45','2127.89','76.7131','3.78807','3605:0 3613:0 3616:0 '),\n+('3613','shmv1260','530','3520','3745','67','70','2','-3882.03','2033.78','96.002','2.18978','3612:0 3614:0 3616:0 '),\n+('3614','shmv1261','530','3520','3745','67','70','3','-3952.84','2136.12','98.2022','2.21727','3613:0 3615:0 '),\n+('3615','shmv1262','530','3520','3745','67','70','3','-3972.41','2203.81','101.676','5.04862','3614:0 '),\n+('3616','shmv1263','530','3520','3520','67','70','0','-3769.55','1947.31','94.6509','4.07473','3612:0 3613:0 3617:0 '),\n+('3617','shmv1264','530','3520','3520','67','70','0','-3890.57','1771.31','96.9587','3.89017','3616:0 3618:0 3653:0 '),\n+('3618','shmv1265','530','3520','3520','67','70','0','-4052.33','1643.87','94.7068','4.5499','3617:0 3619:0 '),\n+('3619','shmv1266','530','3520','3520','67','70','0','-4057.55','1395.83','83.9803','4.95438','3618:0 3620:0 3664:0 3679:0 '),\n+('3620','shmv1267','530','3520','3520','67','70','0','-4028.73','1253.84','79.0241','1.89525','3619:0 3621:0 '),\n+('3621','shmv1268','530','3520','3520','67','70','0','-3956.14','1083.59','27.6555','5.11538','3620:0 3622:0 3684:0 3771:0 '),\n+('3622','shmv1269','530','3520','3520','67','70','0','-3882.17','883.51','18.5293','4.46743','3621:0 3623:0 3685:0 '),\n+('3623','shmv1270','530','3520','3520','67','70','0','-3840.27','741.517','11.8649','0.0181477','3622:0 3624:0 3685:0 '),\n+('3624','shmv1271','530','3520','3520','67','70','0','-3586.49','737.497','-11.4566','0.0534906','3623:0 3625:0 3627:0 3778:0 '),\n+('3625','shmv1272','530','3520','3520','67','70','0','-3561.52','586.272','10.6201','4.78552','3624:0 3626:0 3693:0 3705:0 '),\n+('3626','shmv1273','530','3520','3520','67','70','0','-3569.67','423.902','28.3305','4.75019','3625:0 '),\n+('3627','shmv1274','530','3520','3520','67','70','0','-3346.71','753.909','-26.6716','0.0849111','3624:0 3628:0 3729:0 '),\n+('3628','shmv1275','530','3520','3520','67','70','0','-3232.2','784.314','-19.8198','0.00243998','3627:0 3629:0 '),\n+('3629','shmv1276','530','3520','3754','67','70','0','-3120.7','799.898','-22.5484','1.24337','3628:0 3630:0 3717:0 '),\n+('3630','shmv1277','530','3520','3520','67','70','0','-3121.46','1102.68','20.44','1.2473','3629:0 3631:0 3717:0 '),\n+('3631','shmv1278','530','3520','3753','67','70','0','-3106.91','1197.3','22.976','1.40439','3630:0 3632:0 3725:0 3726:0 '),\n+('3632','shmv1279','530','3520','3520','67','70','0','-3026.37','1314.44','8.68562','0.968488','3631:0 3633:0 3733:0 '),\n+('3633','shmv1280','530','3520','3520','67','70','0','-2904.03','1491.38','14.8027','0.960634','3632:0 3634:0 '),\n+('3634','shmv1281','530','3520','3750','67','70','0','-2867.58','1577.53','15.2282','2.85737','3633:0 3635:0 3751:0 '),\n+('3635','shmv1282','530','3520','3750','67','70','0','-2824.65','1682.74','22.3429','1.17662','3634:0 3636:0 '),\n+('3636','shmv1283','530','3520','3750','67','70','0','-2886.26','1742.5','43.8502','2.40576','3635:0 3637:0 '),\n+('3637','shmv1284','530','3520','3520','67','70','0','-2975.68','1908','104.519','2.08612','3636:0 3638:0 '),\n+('3638','shmv1285','530','3520','3520','67','70','0','-3102.48','1972.24','105.605','0.868752','3637:0 3639:0 3642:0 '),\n+('3639','shmv1286','530','3520','3520','67','70','0','-3180.63','2099.72','75.4619','0.291484','3638:0 3640:0 3643:0 '),\n+('3640','shmv1287','530','3520','3933','67','70','0','-3042.81','2156.41','79.2338','0.393586','3639:0 3641:0 '),\n+('3641','shmv1288','530','3520','3933','67','70','0','-3015.9','2104.22','90.4026','4.71721','3640:0 3642:0 '),\n+('3642','shmv1289','530','3520','3933','67','70','0','-3017.6','2046.19','96.9335','3.75903','3641:0 3638:0 '),\n+('3643','shmv1290','530','3520','3748','67','70','0','-3265.68','2066.96','73.9146','4.35987','3639:0 3652:0 3644:0 '),\n+('3644','shmv1291','530','3520','3748','67','70','0','-3287.9','1978.44','52.6152','2.07043','3643:0 3648:0 '),\n+('3645','shmv1294','530','3520','3748','67','70','0','-3389.68','1984.65','24.8931','1.53832','3646:0 3648:0 '),\n+('3646','shmv1295','530','3520','3748','67','70','0','-3405.52','2054.01','15.1476','3.06395','3647:0 3645:0 '),\n+('3647','shmv1296','530','3520','3748','67','70','0','-3321.42','2125.97','3.08638','2.40814','3646:0 '),\n+('3648','shmv1297','530','3520','3748','67','70','0','-3343.59','2008.19','32.1771','2.00758','3649:0 3645:0 3644:0 '),\n+('3649','shmv1298','530','3520','3748','67','70','0','-3419.14','2114.58','34.4588','2.18822','3648:0 3650:0 '),\n+('3650','shmv1299','530','3520','3748','67','70','0','-3495.43','2186.55','33.5276','5.96992','3649:0 3651:0 '),\n+('3651','shmv1301','530','3520','3748','67','70','0','-3410.98','2272.59','33.8565','1.54813','3650:0 '),\n+('3652','shmv1302','530','3520','3949','67','70','0','-3336.88','2207.97','74.9806','2.06645','3643:0 3598:0 3600:0 '),\n+('3653','shmv1303','530','3520','3932','67','70','0','-4003.29','1878.34','76.5277','5.50491','3617:0 3654:0 '),\n+('3654','shmv1304','530','3520','3932','67','70','0','-4085.04','1923.15','77.0726','5.10829','3653:0 3655:0 '),\n+('3655','shmv1305','530','3520','3932','67','70','0','-4058.27','1821.93','84.9857','4.00088','3654:0 3656:0 '),\n+('3656','shmv1306','530','3520','3932','67','70','0','-4103.15','1784.26','103.457','4.80985','3655:0 3657:0 '),\n+('3657','shmv1307','530','3520','3932','67','70','0','-4195.07','1861.58','109.916','5.5167','3656:0 3658:0 '),\n+('3658','shmv1308','530','3520','3822','67','70','0','-4334.08','1789.5','144.816','3.61996','3657:0 3659:0 '),\n+('3659','shmv1309','530','3520','3822','67','70','0','-4420.11','1797.35','157.396','4.44855','3658:0 3660:0 3668:0 '),\n+('3660','shmv1310','530','3520','3822','67','70','0','-4448.82','1724.98','158.876','4.33467','3659:0 3661:0 3666:0 '),\n+('3661','shmv1311','530','3520','3822','67','70','0','-4383.86','1707.44','156.573','5.0533','3660:0 3662:0 '),\n+('3662','shmv1312','530','3520','3822','67','70','0','-4361','1640.49','156.748','5.04152','3661:0 3663:0 3665:0 '),\n+('3663','shmv1313','530','3520','3822','67','70','0','-4252.69','1521.47','129.453','5.45072','3662:0 3664:0 3672:0 '),\n+('3664','shmv1314','530','3520','3822','67','70','0','-4141.51','1512.19','103.518','6.20863','3663:0 3619:0 '),\n+('3665','shmv1315','530','3520','3822','67','70','0','-4423.22','1575.75','164.241','3.96398','3662:0 3666:0 '),\n+('3666','shmv1316','530','3520','3822','67','70','0','-4491.12','1668.12','165.043','2.20469','3665:0 3660:0 3667:0 '),\n+('3667','shmv1317','530','3520','3822','67','70','0','-4564.8','1670.31','174.579','3.11182','3666:0 '),\n+('3668','shmv1318','530','3520','3520','67','70','0','-4426.81','1860.99','159.258','2.50232','3659:0 3669:0 '),\n+('3669','shmv1319','530','3520','3930','67','70','0','-4488.03','1934.26','144.075','1.12787','3668:0 3670:0 '),\n+('3670','shmv1320','530','3520','3930','67','70','0','-4450.04','1988.33','105.344','2.32482','3669:0 3671:0 '),\n+('3671','shmv1321','530','3520','3930','67','70','0','-4500.91','2022.31','100.196','4.19013','3670:0 '),\n+('3672','shmv1323','530','3520','3929','67','70','0','-4234.47','1405.21','129.348','4.72107','3663:0 3673:0 '),\n+('3673','shmv1324','530','3520','3929','67','70','0','-4309.54','1384.96','143.997','3.08352','3672:0 3674:0 '),\n+('3674','shmv1325','530','3520','3950','67','70','0','-4558.9','1328.47','135.392','6.27616','3673:0 3675:0 '),\n+('3675','shmv1326','530','3520','3929','67','70','0','-4452.67','1313.79','113.624','0.000826359','3674:0 3676:0 '),\n+('3676','shmv1327','530','3520','3929','67','70','0','-4318.73','1322.33','73.5928','6.21333','3675:0 3677:0 3680:0 '),\n+('3677','shmv1328','530','3520','3929','67','70','0','-4226.21','1305.14','56.0568','6.20155','3676:0 3678:0 '),\n+('3678','shmv1329','530','3520','3929','67','70','0','-4117.45','1299.67','52.606','1.29281','3677:0 3679:0 '),\n+('3679','shmv1330','530','3520','3520','67','70','0','-4096.52','1451.91','87.6478','5.2198','3678:0 3619:0 '),\n+('3680','shmv1331','530','3520','3929','67','70','0','-4403.59','1300.45','84.0575','3.42125','3676:0 3681:0 '),\n+('3681','shmv1332','530','3520','3520','67','70','0','-4511.47','1203.3','34.9082','3.43695','3680:0 3682:0 '),\n+('3682','shmv1333','530','3520','3945','67','70','0','-4641.99','1163.55','-14.0182','0.205018','3681:0 3683:0 '),\n+('3683','shmv1334','530','3520','3945','67','70','0','-4660.62','1088.53','0.90432','5.98162','3682:0 '),\n+('3684','shmv1335','530','3520','3938','67','70','1','-4090.85','1104.54','41.0582','5.28662','3621:0 3685:0 '),\n+('3685','shmv1336','530','3520','3758','67','70','0','-4110.45','861.06','9.26995','4.56397','3684:0 3622:0 3623:0 3686:0 '),\n+('3686','shmv1337','530','3520','3939','67','70','0','-4149.68','586.65','8.64057','4.66214','3685:0 3687:0 '),\n+('3687','shmv1338','530','3520','3939','67','70','0','-4184.61','489.528','29.5585','1.24958','3688:0 3689:0 3686:0 '),\n+('3688','shmv1339','530','3520','3939','67','70','0','-4114.39','424.914','34.9882','2.74575','3687:0 '),\n+('3689','shmv1341','530','3520','3939','67','70','0','-4224.07','420.493','51.1341','1.46947','3687:0 3690:0 '),\n+('3690','shmv1342','530','3520','3939','67','70','0','-4299.45','334.074','109.437','3.99453','3689:0 3691:0 '),\n+('3691','shmv1344','530','3520','3939','67','70','0','-4202.19','250.869','124.805','2.69862','3690:0 3692:0 '),\n+('3692','shmv1345','530','3520','3939','67','70','0','-4203.68','345.854','115.285','1.493','3691:0 '),\n+('3693','shmv1346','530','3520','3520','67','70','0','-3501.72','557.894','16.7235','0.323666','3625:0 3694:0 '),\n+('3694','shmv1347','530','3520','3757','67','70','0','-3426.99','580.376','42.2179','5.95105','3693:0 3695:0 '),\n+('3695','shmv1348','530','3520','3757','67','70','0','-3327.45','544.282','74.5225','4.63944','3694:0 3696:0 '),\n+('3696','shmv1349','530','3520','3757','67','70','0','-3333.62','454.382','99.8124','6.05315','3695:0 3697:0 3704:0 '),\n+('3697','shmv1350','530','3520','3757','67','70','0','-3228.24','439.514','104.731','3.31604','3696:0 3698:0 '),\n+('3698','shmv1351','530','3520','3757','67','70','0','-3392.06','415.921','103.96','4.61195','3697:0 3699:0 3704:0 '),\n+('3699','shmv1352','530','3520','3757','67','70','0','-3390.43','293.527','103.961','4.72583','3698:0 3700:0 '),\n+('3700','shmv1353','530','3520','3757','67','70','0','-3337.54','294.86','116.382','1.36824','3699:0 3701:0 '),\n+('3701','shmv1354','530','3520','3757','67','70','0','-3324.03','371.217','120.458','5.9746','3700:0 3702:0 '),\n+('3702','shmv1355','530','3520','3757','67','70','0','-3231.77','337.352','127.504','4.49021','3701:0 3703:0 '),\n+('3703','shmv1356','530','3520','3757','67','70','0','-3239.92','279.443','137.131','4.57267','3702:0 '),\n+('3704','shmv1357','530','3520','3757','67','70','0','-3416.2','459.709','103.935','5.91964','3696:0 3698:0 '),\n+('3705','shmv1358','530','3520','3756','67','70','0','-3685.39','550.038','35.0742','2.93905','3625:0 3706:0 '),\n+('3706','shmv1359','530','3520','3756','67','70','0','-3813.8','565.02','71.7251','4.91432','3705:0 3707:0 '),\n+('3707','shmv1360','530','3520','3756','67','70','0','-3802.41','461.803','99.9172','4.68655','3706:0 3708:0 3716:0 '),\n+('3708','shmv1361','530','3520','3756','67','70','0','-3896.83','442.087','104.97','6.26668','3707:0 3709:0 '),\n+('3709','shmv1362','530','3520','3756','67','70','0','-3719.39','417.216','104.061','2.6833','3708:0 3710:0 3716:0 '),\n+('3710','shmv1363','530','3520','3756','67','70','0','-3732.23','295.716','104.066','3.10939','3709:0 3711:0 '),\n+('3711','shmv1364','530','3520','3756','67','70','0','-3786.92','297.908','116.455','3.10153','3710:0 3712:0 '),\n+('3712','shmv1365','530','3520','3756','67','70','0','-3812.37','248.065','120.604','1.80405','3711:0 3713:0 '),\n+('3713','shmv1366','530','3520','3756','67','70','0','-3838.38','357.549','120.582','1.80405','3712:0 3714:0 '),\n+('3714','shmv1367','530','3520','3756','67','70','0','-3904.87','343.016','127.62','4.76657','3713:0 3715:0 '),\n+('3715','shmv1368','530','3520','3756','67','70','0','-3890.45','282.542','137.239','3.8665','3714:0 '),\n+('3716','shmv1369','530','3520','3756','67','70','0','-3719.66','475.869','104.038','4.2914','3709:0 3707:0 '),\n+('3717','shmv1370','530','3520','3754','67','70','0','-3124.49','886.832','-14.3889','1.56135','3629:0 3630:0 3718:0 '),\n+('3718','shmv1371','530','3520','3754','67','70','1','-3061.33','830.398','-10.215','4.92836','3717:0 3719:0 '),\n+('3719','shmv1372','530','3520','3520','67','70','0','-3030.95','544.921','-1.12904','0.00390148','3718:0 3720:0 '),\n+('3720','shmv1373','530','3520','3520','67','70','0','-2881.37','547.854','-13.197','0.0196085','3719:0 3721:0 '),\n+('3721','shmv1374','530','3520','3520','67','70','0','-2744.62','677.917','-16.4588','1.42468','3720:0 3722:0 '),\n+('3722','shmv1375','530','3520','3520','67','70','0','-2720.25','857.215','-3.3875','4.54664','3721:0 3723:0 '),\n+('3723','shmv1376','530','3520','3520','67','70','0','-2768.24','985.559','-2.57223','2.06085','3722:0 3724:0 '),\n+('3724','shmv1377','530','3520','3520','67','70','0','-2871.08','1130.08','8.92665','3.16433','3723:0 3725:0 '),\n+('3725','shmv1378','530','3520','3520','67','70','0','-2984.92','1134.44','-3.92959','2.62712','3724:0 3631:0 '),\n+('3726','shmv1379','530','3520','3753','67','70','0','-3245.6','1189.8','59.4774','4.33927','3631:0 3727:0 3731:0 '),\n+('3727','shmv1380','530','3520','3753','67','70','0','-3222.89','1092.48','64.7857','6.14175','3726:0 3728:0 3731:0 3732:0 '),\n+('3728','shmv1381','530','3520','3753','67','70','0','-3292.57','985.163','40.7467','5.15608','3727:0 3730:0 '),\n+('3729','shmv1382','530','3520','3753','67','70','0','-3344.18','870.1','-14.6762','4.80342','3627:0 3730:0 '),\n+('3730','shmv1383','530','3520','3753','67','70','0','-3205.87','897.037','49.1172','0.192352','3729:0 3728:0 '),\n+('3731','shmv1384','530','3520','3753','67','70','0','-3399.1','1175.31','50.0129','3.15252','3726:0 3727:0 3732:0 '),\n+('3732','shmv1385','530','3520','3753','67','70','0','-3335.34','1043.32','47.1116','0.383668','3727:0 3731:0 3772:0 '),\n+('3733','shmv1386','530','3520','3749','67','70','0','-2929.04','1324.33','7.92349','5.43769','3632:0 3734:0 '),\n+('3734','shmv1387','530','3520','3749','67','70','0','-2845.89','1301.54','6.02801','3.20519','3733:0 3735:0 '),\n+('3735','shmv1388','530','3520','3749','67','70','0','-2847.46','1231.33','6.78906','1.62065','3734:0 3736:0 '),\n+('3736','shmv1390','530','3520','3749','67','70','0','-2732.51','1138.3','2.89233','2.40802','3735:0 3737:0 '),\n+('3737','shmv1391','530','3520','3749','67','70','0','-2634.08','1230.04','11.146','1.86804','3738:0 3736:0 '),\n+('3738','shmv1392','530','3520','3749','67','70','0','-2651.9','1282.45','26.4813','3.01869','3737:0 3739:0 '),\n+('3739','shmv1393','530','3520','3749','67','70','0','-2710.39','1300.75','33.7332','1.28218','3738:0 3740:0 '),\n+('3740','shmv1394','530','3520','3749','67','70','0','-2690.89','1361.98','35.0836','6.28124','3739:0 3741:0 '),\n+('3741','shmv1395','530','3520','3749','67','70','0','-2617.04','1355.97','37.2382','0.18183','3740:0 3742:0 '),\n+('3742','shmv1396','530','3520','3749','67','70','0','-2769.22','1301.12','33.2111','3.48993','3741:0 3743:0 3745:0 '),\n+('3743','shmv1397','530','3520','3749','67','70','0','-2721.9','1224.71','33.0771','5.26886','3742:0 3744:0 '),\n+('3744','shmv1398','530','3520','3749','67','70','0','-2817.63','1365.79','38.5145','5.53669','3743:0 3745:0 '),\n+('3745','shmv1399','530','3520','3749','67','70','0','-2766.14','1383.17','37.6732','0.325571','3744:0 3742:0 '),\n+('3746','shmv1400','530','3520','3743','67','70','0','-3280.76','3002.45','141.658','1.22092','3586:0 3747:0 '),\n+('3747','shmv1401','530','3520','3743','67','70','0','-3273.62','3077.71','139.787','0.31771','3746:0 3748:0 '),\n+('3748','shmv1402','530','3520','3743','67','70','0','-3211.67','3079.46','126.239','5.52566','3747:0 3749:0 '),\n+('3749','shmv1403','530','3520','3743','67','70','0','-3143.09','3024.9','104.296','5.41086','3584:0 3748:0 '),\n+('3750','shmv1405','530','3520','3752','67','70','0','-3656.3','2553.97','77.5087','0.0120506','3601:0 3605:0 '),\n+('3751','shmv1406','530','3520','3750','67','70','0','-2941.74','1589.4','40.8211','2.08903','3634:0 3752:0 '),\n+('3752','shmv1407','530','3520','3750','67','70','0','-2978.15','1677.35','67.3118','2.1715','3751:0 3753:0 '),\n+('3753','shmv1408','530','3520','3750','67','70','0','-3032.93','1672.83','67.4735','3.60878','3752:0 3754:0 3757:0 '),\n+('3754','shmv1409','530','3520','3750','67','70','0','-3131.22','1754.16','79.6664','2.79589','3753:0 3755:0 '),\n+('3755','shmv1410','530','3520','3750','67','70','0','-3191.61','1765.69','88.3304','2.95297','3754:0 3756:0 '),\n+('3756','shmv1411','530','3520','3520','67','70','0','-3345.81','1700.42','95.7466','5.65474','3755:0 3757:0 '),\n+('3757','shmv1412','530','3520','3520','67','70','0','-3188.39','1586.02','63.3792','0.565352','3756:0 3753:0 3758:0 3760:0 '),\n+('3758','shmv1413','530','3520','3520','67','70','0','-3052.53','1476.53','17.9049','2.50057','3757:0 3759:0 '),\n+('3759','shmv1414','530','3520','3520','67','70','0','-3107.69','1379.15','12.0022','4.19702','3758:0 '),\n+('3760','shmv1415','530','3520','3750','67','70','0','-3103.19','1550.28','39.5694','2.77978','3757:0 3761:0 '),\n+('3761','shmv1416','530','3520','3520','67','70','0','-3196.31','1501.96','57.1479','2.95256','3760:0 3762:0 '),\n+('3762','shmv1417','530','3520','3747','67','70','0','-3282.99','1527.47','52.2295','5.92921','3761:0 3763:0 '),\n+('3763','shmv1418','530','3520','3747','67','70','0','-3394.49','1550.46','48.1579','2.93214','3762:0 3764:0 '),\n+('3764','shmv1419','530','3520','3747','67','70','0','-3500.47','1622.81','43.8418','3.38295','3763:0 3765:0 '),\n+('3765','shmv1420','530','3520','3747','67','70','0','-3693.06','1558.48','46.9758','1.02649','3764:0 3766:0 '),\n+('3766','shmv1421','530','3520','3747','67','70','0','-3828.74','1475.85','43.1674','4.10996','3765:0 3767:0 '),\n+('3767','shmv1422','530','3520','3747','67','70','0','-3888.12','1398.74','43.6642','4.04478','3766:0 3768:0 '),\n+('3768','shmv1423','530','3520','3747','67','70','0','-3858.68','1336.7','42.2274','4.47911','3767:0 3769:0 '),\n+('3769','shmv1424','530','3520','3747','67','70','0','-3883.95','1244.97','42.1164','4.44376','3768:0 3770:0 3771:0 '),\n+('3770','shmv1425','530','3520','3520','67','70','0','-3774.38','1225.16','84.9138','6.04598','3769:0 '),\n+('3771','shmv1426','530','3520','3520','67','70','0','-3969.44','1164.97','46.6673','5.0878','3769:0 3621:0 '),\n+('3772','shmv1427','530','3520','3753','67','70','0','-3423.61','1074.97','42.8376','3.2539','3732:0 3773:0 '),\n+('3773','shmv1428','530','3520','3520','67','70','0','-3574.75','1067.86','40.499','3.19107','3772:0 3774:0 '),\n+('3774','shmv1429','530','3520','3821','67','70','0','-3680.33','1058.59','68.153','2.90833','3773:0 3775:0 3776:0 '),\n+('3775','shmv1430','530','3520','3821','67','70','0','-3760.76','1068.11','70.1361','6.14809','3774:0 '),\n+('3776','shmv1431','530','3520','3520','67','70','0','-3642.27','894.441','45.4124','5.92247','3774:0 3777:0 '),\n+('3777','shmv1432','530','3520','3520','67','70','0','-3522.57','841.492','-2.90146','4.68834','3776:0 3778:0 '),\n+('3778','shmv1433','530','3520','3520','67','70','0','-3522.09','776.814','-14.2281','4.71976','3777:0 3624:0 '),\n+('3779','bt001','571','3537','4129','68','73','5','2817.61','6168.46','85.5727','3.94245','3780:0 '),\n+('3780','bt002','571','3537','4020','68','73','5','2726.11','6082.88','72.3512','3.45943','3779:0 3781:0 '),\n+('3781','bt003','571','3537','4020','68','73','0','2604.99','6083.81','53.2961','2.26563','3780:0 3782:0 3832:0 '),\n+('3782','bt004','571','3537','4020','68','73','0','2505.63','6178.07','53.1691','5.59574','3781:0 3783:0 3839:0 '),\n+('3783','bt005','571','3537','4130','68','73','0','2589.16','6313.74','86.8706','0.137219','3782:0 3784:0 3832:0 '),\n+('3784','bt006','571','3537','3537','68','73','0','2818.32','6342.97','101.266','3.15078','3783:0 3785:0 3791:0 '),\n+('3785','bt007','571','3537','3537','68','73','0','2823.08','6550.12','55.029','4.6077','3784:0 3786:0 3790:0 '),\n+('3786','bt008','571','3537','4106','68','73','0','2946.88','6730.38','13.9226','0.998791','3785:0 3787:0 3788:0 '),\n+('3787','bt009','571','3537','4106','68','73','0','3100','6716.93','0.818624','2.88374','3786:0 '),\n+('3788','bt010','571','3537','4106','68','73','0','2769.6','6817.13','0.382068','5.63656','3786:0 3789:0 '),\n+('3789','bt011','571','3537','4031','68','73','0','2511.71','6709.76','8.65944','0.559735','3788:0 3790:0 '),\n+('3790','bt012','571','3537','4130','68','73','0','2598.94','6513.07','41.9513','4.98704','3789:0 3785:0 '),\n+('3791','bt013','571','3537','3537','68','73','0','2977.63','6387.87','96.0276','3.55919','3784:0 3792:0 '),\n+('3792','bt014','571','3537','3537','68','73','0','3117.74','6401.57','85.8869','4.84331','3791:0 3793:0 '),\n+('3793','bt015','571','3537','3537','68','73','0','3146.95','6242.85','96.6515','5.78972','3792:0 3794:0 '),\n+('3794','bt016','571','3537','4105','68','73','0','3332.48','6165.54','75.7667','2.87983','3793:0 '),\n+('3795','bt017','571','3537','3537','68','73','0','3270.88','5961.4','84.9677','4.81845','3796:0 3797:0 3826:0 '),\n+('3796','bt018','571','3537','3537','68','73','1','3624.25','5933.39','136.215','3.44596','3797:0 3795:0 '),\n+('3797','bt019','571','3537','4109','68','73','0','3297.83','5691.4','59.3737','4.58728','3796:0 3798:0 3795:0 '),\n+('3798','bt020','571','3537','3537','68','73','0','3304.79','5470.21','55.3479','4.73257','3797:0 3799:0 3852:0 '),\n+('3799','bt021','571','3537','3537','68','73','0','3482.47','5425.21','50.7507','1.49045','3798:0 3800:0 '),\n+('3800','bt022','571','3537','3537','68','73','0','3532.8','5540.21','65.5113','4.20635','3799:0 3801:0 3937:0 '),\n+('3801','bt023','571','3537','3537','68','73','0','3504.09','5638.44','63.5206','1.09146','3800:0 3802:0 3937:0 '),\n+('3802','bt024','571','3537','3537','68','73','0','3651.69','5686.01','66.2432','0.569961','3801:0 3803:0 3937:0 '),\n+('3803','bt025','571','3537','3537','68','73','0','3809.81','5773.85','68.3307','0.134065','3802:0 3804:0 3937:0 '),\n+('3804','bt026','571','3537','4127','68','73','0','3969.32','5781.55','74.0472','0.432523','3803:0 3805:0 3896:0 '),\n+('3805','bt027','571','3537','3537','68','73','0','4170.05','5855.36','62.8346','0.137999','3804:0 3806:0 3816:0 3819:0 '),\n+('3806','bt028','571','3537','3537','68','73','0','4324.68','6015.4','25.5474','1.07655','3805:0 3807:0 '),\n+('3807','bt029','571','3537','4099','68','73','0','4401.85','6148.33','0.553693','4.54723','3806:0 3808:0 '),\n+('3808','bt030','571','3537','4033','68','73','0','4287.27','6236.78','0.383892','3.29845','3807:0 3809:0 '),\n+('3809','bt031','571','3537','4033','68','73','0','4184.73','6193.42','9.12228','1.7952','3808:0 3810:0 '),\n+('3810','bt032','571','3537','4033','68','73','0','4149.36','6252.75','30.8789','2.52797','3809:0 3811:0 3812:0 '),\n+('3811','bt033','571','3537','4097','68','73','0','4056.14','6303.43','25.1363','1.18887','3810:0 '),\n+('3812','bt034','571','3537','4097','68','73','0','4052.65','6367.67','27.4251','1.08833','3810:0 3813:0 3815:0 '),\n+('3813','bt035','571','3537','4097','68','73','0','3991.71','6304.02','8.08314','0.901407','3812:0 '),\n+('3814','bt036','571','3537','4097','68','73','0','3854.4','6397.67','24.5748','5.34115','3815:0 '),\n+('3815','bt037','571','3537','4097','68','73','0','3960.88','6426.15','11.3447','0.519589','3812:0 3814:0 '),\n+('3816','bt038','571','3537','4134','68','73','0','4404.37','5906.55','55.8142','0.126085','3805:0 3817:0 3818:0 '),\n+('3817','bt039','571','3537','4132','68','73','0','4547.19','6017.64','76.7052','4.37901','3816:0 '),\n+('3818','bt040','571','3537','4122','68','73','5','4484.77','5763.64','79.4306','1.41963','3816:0 3819:0 '),\n+('3819','bt041','571','3537','4133','68','73','0','4321.96','5776.59','72.5697','2.66048','3818:0 3805:0 '),\n+('3820','bt042','571','3537','4032','68','73','3','2227.28','5312.07','10.5729','1.23497','3821:0 3851:0 '),\n+('3821','bt043','571','3537','4101','68','73','0','2273.96','5439.49','1.81269','1.1525','3820:0 3822:0 3833:0 3916:0 '),\n+('3822','bt044','571','3537','4101','68','73','0','2418.25','5390.85','3.76168','0.12363','3821:0 3823:0 '),\n+('3823','bt045','571','3537','3537','68','73','0','2601.94','5522.47','38.0963','6.28036','3822:0 3824:0 3833:0 3840:0 3848:0 '),\n+('3824','bt046','571','3537','3537','68','73','0','2887.65','5415.26','58.4905','5.60492','3823:0 3852:0 3859:0 '),\n+('3825','bt047','571','3537','4021','68','73','0','2976.39','5660.32','52.2738','1.38733','3826:0 '),\n+('3826','bt048','571','3537','4021','68','73','0','3019.96','5816.72','88.3166','0.8297','3825:0 3827:0 3795:0 '),\n+('3827','bt049','571','3537','4020','68','73','0','2993.07','5973.66','112.995','5.04023','3826:0 3828:0 '),\n+('3828','bt050','571','3537','4129','68','73','0','2915.6','6074.59','78.0969','1.4863','3827:0 3829:0 3844:0 '),\n+('3829','bt051','571','3537','4020','68','73','0','2970.01','6149.83','61.7495','2.0298','3828:0 3830:0 '),\n+('3830','bt052','571','3537','4020','68','73','0','2899.1','6282.26','61.4057','2.97228','3829:0 3831:0 '),\n+('3831','bt053','571','3537','4020','68','73','0','2773.74','6303.56','77.083','3.07674','3830:0 3832:0 '),\n+('3832','bt054','571','3537','4020','68','73','0','2654.28','6218.95','38.8344','4.55721','3831:0 3781:0 3783:0 '),\n+('3833','bt055','571','3537','3537','68','73','0','2316.99','5624.68','36.408','5.33239','3823:0 3821:0 3834:0 '),\n+('3834','bt056','571','3537','3537','68','73','0','2143.16','5781.38','58.7998','1.77058','3833:0 3837:0 '),\n+('3835','bt057','571','3537','4028','68','73','0','1868.5','5774.99','0.860459','1.34802','3917:0 '),\n+('3836','bt058','571','3537','4028','68','73','0','1923.91','6030.9','10.7946','1.48154','3837:0 3918:0 '),\n+('3837','bt059','571','3537','3537','68','73','0','2116.07','6079.06','52.9292','3.89037','3836:0 3834:0 3838:0 3846:0 '),\n+('3838','bt060','571','3537','4021','68','73','0','2104.14','6314.43','60.0072','0.106311','3837:0 3839:0 '),\n+('3839','bt061','571','3537','4021','68','73','0','2357.04','6208.05','40.7146','2.64945','3838:0 3782:0 '),\n+('3840','bt062','571','3537','4022','68','73','0','2647.51','5693.12','46.7099','1.50275','3823:0 3841:0 '),\n+('3841','bt063','571','3537','4022','68','73','0','2631.68','5852.04','45.3245','5.86957','3840:0 3842:0 '),\n+('3842','bt064','571','3537','4022','68','73','0','2763.87','5811.38','59.8902','6.23478','3841:0 3843:0 '),\n+('3843','bt065','571','3537','4021','68','73','0','2848.66','5818.04','101.625','5.91276','3842:0 3844:0 3845:0 '),\n+('3844','bt066','571','3537','4020','68','73','0','2837.49','5974.58','114.197','5.01191','3843:0 3828:0 '),\n+('3845','bt067','571','3537','4021','68','73','0','2607.08','5956.42','94.4153','5.56483','3843:0 3846:0 3847:0 '),\n+('3846','bt068','571','3537','4022','68','73','0','2327.62','5973.77','98.5945','4.36317','3837:0 3845:0 '),\n+('3847','bt069','571','3537','4022','68','73','0','2489.14','5813.21','139.945','0.867364','3845:0 '),\n+('3848','bt070','571','3537','4111','68','73','0','2684.66','5308.92','31.1745','1.9606','3823:0 3849:0 '),\n+('3849','bt071','571','3537','4111','68','73','0','2495.15','5199.97','32.4263','0.802134','3848:0 3850:0 '),\n+('3850','bt072','571','3537','4032','68','73','0','2416.87','5247.86','1.88448','3.32877','3849:0 3851:0 '),\n+('3851','bt073','571','3537','4032','68','73','3','2334.99','5249.7','9.01216','2.3698','3820:0 3850:0 '),\n+('3852','bt074','571','3537','3537','68','73','0','3128.49','5378.84','58.5466','0.00337601','3824:0 3798:0 3853:0 3859:0 '),\n+('3853','bt075','571','3537','3537','68','73','0','3264.11','5285.37','39.4799','3.97355','3852:0 3854:0 3891:0 '),\n+('3854','bt076','571','3537','4043','68','73','0','3152.24','5121.1','38.3072','4.18325','3853:0 3855:0 3860:0 3891:0 '),\n+('3855','bt077','571','3537','4043','68','73','0','2949.22','5102.38','35.483','3.44497','3856:0 3859:0 3854:0 '),\n+('3856','bt078','571','3537','4043','68','73','0','2736.6','5010.38','28.1472','3.12924','3855:0 3857:0 '),\n+('3857','bt079','571','3537','4115','68','73','0','2737.31','5202.71','29.0469','0.938766','3856:0 3858:0 3859:0 '),\n+('3858','bt080','571','3537','4115','68','73','0','2535.47','5082.9','7.68824','3.5887','3857:0 '),\n+('3859','bt081','571','3537','3537','68','73','0','2918.19','5295.64','60.2339','1.05579','3824:0 3855:0 3857:0 3852:0 '),\n+('3860','bt082','571','3537','4041','68','73','0','3128.73','4853.66','2.08073','1.16652','3854:0 3861:0 '),\n+('3861','bt083','571','3537','4041','68','73','0','3050.52','4655.31','2.27362','4.47304','3860:0 3862:0 '),\n+('3862','bt084','571','3537','4043','68','73','0','3249.06','4558.38','29.5811','5.62916','3861:0 3863:0 '),\n+('3863','bt085','571','3537','4043','68','73','0','3284.24','4264.38','24.2109','5.22075','3862:0 3864:0 3938:0 '),\n+('3864','bt086','571','3537','4037','68','73','4','3412.42','4072.4','16.8945','0.69685','3863:0 3865:0 3866:0 3873:0 3939:0 '),\n+('3865','bt087','571','3537','4037','68','73','5','3463.15','4158.38','17.1932','1.45869','3864:0 '),\n+('3866','bt088','571','3537','4043','68','73','0','3662.21','3965.65','26.4976','5.18541','3864:0 3867:0 3878:0 '),\n+('3867','bt089','571','3537','4125','68','73','0','3676.8','3741.97','49.5236','5.32678','3866:0 3868:0 3878:0 '),\n+('3868','bt090','571','3537','4125','68','73','0','3823.07','3647','46.2292','5.63701','3867:0 3869:0 3871:0 3872:0 '),\n+('3869','bt091','571','3537','4135','68','73','0','4026.86','3532.95','104.358','5.75874','3868:0 3870:0 3872:0 '),\n+('3870','bt092','571','3537','4125','68','73','0','3935.56','3404.04','80.8418','5.58987','3869:0 3871:0 '),\n+('3871','bt093','571','3537','4125','68','73','0','3825.9','3505.46','64.8278','1.04239','3868:0 3870:0 '),\n+('3872','bt094','571','3537','4125','68','73','0','3966.88','3721.48','61.9247','4.14707','3868:0 3869:0 '),\n+('3873','bt095','571','3537','4042','68','73','0','3416.97','3883.04','26.1293','5.22225','3864:0 3874:0 3939:0 '),\n+('3874','bt096','571','3537','4042','68','73','0','3450.42','3652.26','27.974','2.1592','3873:0 3875:0 3940:0 '),\n+('3875','bt097','571','3537','4042','68','73','0','3456.33','3430.49','17.996','4.9827','3874:0 3876:0 '),\n+('3876','bt098','571','3537','4042','68','73','0','3518.4','3187.54','25.0806','4.80206','3875:0 3877:0 '),\n+('3877','bt099','571','65','4478','68','73','0','3572.51','3037.08','26.2165','3.86352','3876:0 4109:0 '),\n+('3878','bt100','571','3537','3537','68','73','0','3907.42','4000.44','45.1941','4.47613','3866:0 3867:0 3879:0 '),\n+('3879','bt101','571','3537','3537','68','73','0','4042.02','4199.98','49.6907','0.696007','3878:0 3880:0 '),\n+('3880','bt102','571','3537','3537','68','73','0','4186.94','4464.21','27.3466','1.05336','3879:0 3881:0 '),\n+('3881','bt103','571','3537','4119','68','73','0','4191.29','4697.78','12.0312','2.68463','3880:0 3882:0 3883:0 3884:0 3908:0 '),\n+('3882','bt104','571','3537','4118','68','73','0','4358.92','4576.58','16.3385','5.84976','3881:0 '),\n+('3883','bt105','571','3537','4036','68','73','0','3992.84','4812.66','11.7213','5.55524','3881:0 '),\n+('3884','bt106','571','3537','4119','68','73','0','3978.85','4564.24','-2.51875','3.44252','3881:0 3885:0 3914:0 '),\n+('3885','bt107','571','3537','4117','68','73','0','3699.55','4487.54','-0.818554','2.97836','3884:0 3886:0 '),\n+('3886','bt108','571','3537','4117','68','73','0','3443.04','4422.46','-0.530089','0.645731','3885:0 3887:0 '),\n+('3887','bt109','571','3537','4035','68','73','0','3568.75','4584.96','-13.5973','0.527922','3886:0 3888:0 '),\n+('3888','bt110','571','3537','4035','68','73','0','3686.72','4734.84','-12.073','1.14839','3887:0 3889:0 3915:0 '),\n+('3889','bt111','571','3537','4035','68','73','0','3703.7','4927.72','-12.9951','2.73489','3888:0 3890:0 3912:0 '),\n+('3890','bt112','571','3537','4116','68','73','0','3479.66','5024.98','-1.50934','2.71133','3889:0 3891:0 '),\n+('3891','bt113','571','3537','4116','68','73','0','3344.22','5119.48','13.0385','2.55424','3890:0 3853:0 3854:0 3892:0 '),\n+('3892','bt114','571','3537','4116','68','73','0','3589.81','5076.79','13.0073','6.10424','3891:0 3893:0 '),\n+('3893','bt115','571','3537','3537','68','73','0','3668.09','5254.47','34.8015','1.05413','3892:0 3894:0 3911:0 '),\n+('3894','bt116','571','3537','3537','68','73','0','3717.74','5416.1','41.956','1.99268','3893:0 3895:0 3937:0 '),\n+('3895','bt117','571','3537','3537','68','73','0','3919.2','5534.82','36.9202','0.89312','3894:0 3896:0 '),\n+('3896','bt118','571','3537','3537','68','73','0','4101.61','5617.94','41.1963','5.88275','3895:0 3804:0 3897:0 '),\n+('3897','bt119','571','3537','3537','68','73','0','4252.89','5577.24','46.4033','5.33689','3896:0 3898:0 3903:0 '),\n+('3898','bt120','571','3537','4123','68','73','0','4429.17','5431.27','38.6653','5.43664','3897:0 3899:0 '),\n+('3899','bt121','571','3537','4123','68','73','0','4389.18','5365.34','1.39626','5.27172','3898:0 3900:0 '),\n+('3900','bt122','571','3537','4123','68','73','0','4489.75','5395.86','-16.0358','0.830292','3899:0 3901:0 '),\n+('3901','bt123','571','3537','4123','68','73','0','4444.7','5327.16','-22.3982','5.89611','3900:0 3902:0 '),\n+('3902','bt124','571','3537','4123','68','73','0','4542.22','5322.8','-31.8246','3.56034','3901:0 '),\n+('3903','bt125','571','3537','4123','68','73','0','4522.99','5561.63','52.4235','6.06731','3897:0 3904:0 4644:0 '),\n+('3904','bt126','571','3537','4123','68','73','0','4530.95','5430.29','84.8166','1.59052','3903:0 3905:0 '),\n+('3905','bt127','571','3537','4123','68','73','0','4525.48','5247.8','73.7381','4.37083','3904:0 3906:0 '),\n+('3906','bt128','571','3537','4123','68','73','0','4475.24','5066.41','51.9566','0.934718','3905:0 3907:0 '),\n+('3907','bt129','571','3537','4123','68','73','0','4378.74','5017.74','24.8345','2.46704','3906:0 3908:0 3909:0 '),\n+('3908','bt130','571','3537','3537','68','73','0','4344.7','4804.82','24.8231','4.24124','3907:0 3881:0 '),\n+('3909','bt131','571','3537','4116','68','73','0','4205.12','5146.23','13.0876','5.95813','3907:0 3910:0 '),\n+('3910','bt132','571','3537','4108','68','73','3','4060.38','5267.77','24.7438','5.56545','3909:0 3911:0 '),\n+('3911','bt133','571','3537','4116','68','73','0','3893.4','5186.84','13.0414','3.37026','3910:0 3893:0 3912:0 '),\n+('3912','bt134','571','3537','4116','68','73','0','3840.13','5037.99','-1.50988','0.413233','3911:0 3889:0 3913:0 '),\n+('3913','bt135','571','3537','4035','68','73','0','3925.28','4915.39','-12.887','4.60333','3912:0 3914:0 '),\n+('3914','bt136','571','3537','4035','68','73','0','3887.73','4693.73','-12.995','4.14386','3913:0 3884:0 3915:0 '),\n+('3915','bt137','571','3537','4035','68','73','0','3732.85','4647.89','-12.6525','0.821628','3914:0 3888:0 '),\n+('3916','bt138','571','3537','4101','68','73','0','2084.44','5480.67','0.253263','0.428928','3821:0 3917:0 '),\n+('3917','bt139','571','3537','3537','68','73','0','1935.03','5589.92','0.355845','5.97934','3916:0 3835:0 '),\n+('3918','bt140','571','3537','4029','68','73','0','1494.92','5829.11','1.38787','4.0072','3836:0 3919:0 '),\n+('3919','bt141','571','3537','4029','68','73','0','1384.5','5858.44','15.4001','4.19177','3918:0 3920:0 '),\n+('3920','bt142','571','3537','4029','68','73','0','1449.43','5734.18','1.3254','1.10514','3919:0 3921:0 '),\n+('3921','bt143','571','3537','4029','68','73','0','1402.52','5714.94','23.5628','4.00326','3920:0 3922:0 '),\n+('3922','bt144','571','3537','4029','68','73','0','1316.7','5605.69','5.52566','5.40127','3921:0 '),\n+('3923','bt145','571','3537','4024','68','73','0','4152.49','7034.79','165.636','2.43875','3924:0 3936:0 '),\n+('3924','bt146','571','3537','4024','68','73','0','3999','7159.1','167.793','0.0786215','3923:0 3925:0 '),\n+('3925','bt147','571','3537','4024','68','73','0','3840.49','7254.47','172.045','3.52653','3924:0 3926:0 3928:0 '),\n+('3926','bt148','571','3537','4024','68','73','0','3676.61','7110.41','160.171','4.50434','3925:0 3927:0 3929:0 '),\n+('3927','bt149','571','3537','4024','68','73','0','3597.15','7199.39','221.934','1.51276','3926:0 3928:0 3929:0 '),\n+('3928','bt150','571','3537','4024','68','73','0','3751.72','7333.67','208.956','0.378648','3927:0 3925:0 '),\n+('3929','bt151','571','3537','4024','68','73','0','3611.29','6969.11','170.734','1.15225','3926:0 3927:0 3930:0 '),\n+('3930','bt152','571','3537','4024','68','73','0','3644.46','6805.44','166.924','3.99932','3929:0 3931:0 '),\n+('3931','bt153','571','3537','4121','68','73','1','3587.41','6661.1','195.429','4.60014','3930:0 3932:0 '),\n+('3932','bt154','571','3537','4024','68','73','0','3749.63','6602.97','169.446','3.8658','3931:0 3933:0 3935:0 '),\n+('3933','bt155','571','3537','4024','68','73','0','3912.17','6596.2','168.227','0.700643','3932:0 3934:0 '),\n+('3934','bt156','571','3537','4024','68','73','0','3971.08','6785.73','156.758','4.88682','3933:0 3935:0 3936:0 '),\n+('3935','bt157','571','3537','4024','68','73','0','3826.86','6694.29','152.782','4.14698','3934:0 3932:0 '),\n+('3936','bt158','571','3537','4024','68','73','0','4074.45','6887.11','166.976','1.01716','3923:0 3934:0 '),\n+('3937','bt159','571','3537','4039','68','73','0','3663.21','5603.77','32.8151','3.07099','3800:0 3801:0 3802:0 3803:0 3894:0 '),\n+('3938','bt160','571','3537','4113','68','73','1','2913.96','4067.33','1.63263','0.498753','3863:0 3939:0 '),\n+('3939','bt161','571','3537','4138','68','73','3','3111.58','3838.69','22.5558','0.795238','3864:0 3873:0 3940:0 3938:0 '),\n+('3940','bt162','571','3537','4138','68','73','0','3323.93','3770.67','24.5945','5.57327','3939:0 3874:0 '),\n+('3941','hf163','571','495','3998','68','73','3','1418.1','-3190.73','162.344','4.57189','3942:0 '),\n+('3942','hf164','571','495','3998','68','73','2','1365.12','-3385.23','185.736','4.52084','3941:0 3943:0 '),\n+('3943','hf165','571','495','4048','68','73','0','1219.72','-3550.97','164.966','4.23495','3942:0 3944:0 '),\n+('3944','hf166','571','495','4048','68','73','0','1121.91','-3657.07','156.248','4.07787','3943:0 3945:0 3985:0 '),\n+('3945','hf167','571','495','4048','68','73','0','1046.11','-3833.51','162.833','4.6512','3944:0 3946:0 3958:0 3985:0 '),\n+('3946','hf168','571','495','4048','68','73','0','920.447','-4015.29','170.279','3.21786','3945:0 3947:0 3958:0 '),\n+('3947','hf169','571','495','3992','68','73','0','694.778','-3872.94','246.328','2.73877','3946:0 3948:0 '),\n+('3948','hf170','571','495','495','68','73','0','507.763','-4025.28','259.283','4.81221','3947:0 3949:0 '),\n+('3949','hf171','571','495','4260','68','73','0','397.137','-4223.42','249.354','3.78334','3948:0 3950:0 3979:0 '),\n+('3950','hf172','571','495','495','68','73','0','222.582','-4391.88','248.592','4.40773','3949:0 3951:0 4086:0 '),\n+('3951','hf173','571','495','3991','68','73','0','253.033','-4572.61','240.212','5.55441','3950:0 3952:0 4082:0 '),\n+('3952','hf174','571','495','3991','68','73','5','371.97','-4633.54','245.156','2.78588','3951:0 3953:0 3957:0 4085:0 '),\n+('3953','hf175','571','495','3991','68','73','4','407.209','-4712.58','228.909','5.83714','3952:0 3954:0 '),\n+('3954','hf176','571','495','3991','68','73','0','510.661','-4763.01','208.318','0.924468','3953:0 3955:0 4082:0 '),\n+('3955','hf177','571','495','495','68','73','0','628.585','-4581.53','203.482','0.904833','3954:0 3956:0 '),\n+('3956','hf178','571','495','3991','68','73','0','460.455','-4423.52','211.022','2.64078','3955:0 3957:0 3979:0 '),\n+('3957','hf179','571','495','3991','68','73','4','383.884','-4495.8','236.504','4.36866','3956:0 3952:0 '),\n+('3958','hf180','571','495','495','68','73','0','1081.71','-4036.81','154.348','4.76135','3945:0 3946:0 3985:0 '),\n+('3959','hf181','571','495','495','68','73','0','1215.66','-4263.51','149.864','5.26401','3960:0 '),\n+('3960','hf182','571','495','495','68','73','0','1258.74','-4522.15','173.24','3.83852','3959:0 3961:0 '),\n+('3961','hf183','571','495','495','68','73','0','1124.26','-4644.36','183.694','3.62646','3960:0 3962:0 '),\n+('3962','hf184','571','495','495','68','73','0','857.223','-4730.31','113.82','0.273598','3961:0 3963:0 '),\n+('3963','hf185','571','495','495','68','73','0','706.968','-4825.12','79.1984','4.0553','3962:0 3964:0 '),\n+('3964','hf186','571','495','3981','68','73','2','634.301','-4890.02','28.6664','4.92709','3963:0 3965:0 3978:0 '),\n+('3965','hf187','571','495','3981','68','73','2','682.36','-4963','6.24529','0.414974','3964:0 3966:0 3978:0 '),\n+('3966','hf188','571','495','3982','68','73','0','854.979','-4933.54','4.27721','0.230407','3965:0 3967:0 '),\n+('3967','hf189','571','495','3982','68','73','0','1039.98','-4925.08','9.42985','0.387488','3966:0 3968:0 '),\n+('3968','hf190','571','495','3982','68','73','0','945.95','-4873.37','4.59329','0.540618','3967:0 3969:0 '),\n+('3969','hf191','571','495','3982','68','73','0','1068.1','-4819.17','26.6749','3.6728','3968:0 3970:0 '),\n+('3970','hf192','571','495','3983','68','73','0','1158.2','-4813.94','28.9399','0.405537','3969:0 3971:0 '),\n+('3971','hf193','571','495','3983','68','73','0','1104.87','-4804.91','-6.8197','0.572031','3970:0 3972:0 '),\n+('3972','hf194','571','495','3983','1','60','0','980.459','-4819.09','-72.4413','0.31677','3971:0 3973:0 '),\n+('3973','hf195','571','495','3983','68','73','0','841.596','-4863.98','-72.4161','5.00561','3972:0 3974:0 3975:0 '),\n+('3974','hf196','571','495','3983','68','73','0','875.874','-4966.04','-72.4404','1.87186','3973:0 '),\n+('3975','hf197','571','495','495','68','73','0','795.673','-4726.51','-96.2356','1.47131','3973:0 3976:0 '),\n+('3976','hf198','571','495','3983','68','73','0','835.937','-4866.89','-115.736','2.10747','3975:0 3977:0 '),\n+('3977','hf199','571','495','3983','68','73','0','945.547','-4827.44','-116.158','0.281421','3976:0 '),\n+('3978','hf200','571','495','3981','68','73','3','554.553','-4986.67','10.1867','0.251579','3964:0 3965:0 '),\n+('3979','hf201','571','495','495','68','73','0','628.213','-4255.8','210.916','3.49527','3949:0 3956:0 3980:0 '),\n+('3980','hf202','571','495','3994','68','73','0','765.99','-4299.85','185.031','3.00833','3979:0 3981:0 '),\n+('3981','hf203','571','495','3994','68','73','0','798.758','-4362.47','161.294','4.9679','3980:0 3982:0 '),\n+('3982','hf204','571','495','3994','68','73','0','902.1','-4478.73','144.331','5.55301','3981:0 3983:0 3984:0 '),\n+('3983','hf205','571','495','3994','68','73','0','1004.65','-4395.88','150.922','4.0804','3982:0 3984:0 '),\n+('3984','hf206','571','495','3994','68','73','0','909.858','-4395.54','139.649','4.34665','3983:0 3982:0 '),\n+('3985','hf207','571','495','4048','68','73','0','1203.65','-3825.84','142.684','1.05976','3944:0 3945:0 3958:0 3986:0 '),\n+('3986','hf208','571','495','495','68','73','0','1408.56','-3737.55','135.962','1.67629','3985:0 3987:0 '),\n+('3987','hf209','571','495','495','68','73','0','1558.28','-3740.43','144.691','0.00336027','3986:0 3988:0 '),\n+('3988','hf210','571','495','495','68','73','1','1706.02','-3730.74','148.901','3.19209','3987:0 3989:0 4027:0 '),\n+('3989','hf211','571','495','495','68','73','0','1803.26','-3895.57','170.472','0.273537','3988:0 3990:0 '),\n+('3990','hf212','571','495','495','68','73','0','1949.63','-3842.81','173.777','1.70846','3989:0 3991:0 '),\n+('3991','hf213','571','495','4068','68','73','0','2008.1','-3689.61','173.671','1.9378','3990:0 3992:0 '),\n+('3992','hf214','571','495','4068','68','73','0','1967.39','-3604.53','158.109','5.18071','3991:0 3993:0 4031:0 '),\n+('3993','hf215','571','495','495','68','73','0','2096.74','-3545.48','153.897','6.17032','3992:0 3994:0 '),\n+('3994','hf216','571','495','495','68','73','0','2318.6','-3583.13','165.228','0.334813','3993:0 3995:0 '),\n+('3995','hf217','571','495','4006','68','73','0','2535.68','-3475.65','183.975','0.49582','3994:0 3996:0 3999:0 '),\n+('3996','hf218','571','495','4006','68','73','0','2624.04','-3562.9','205.26','5.49331','3995:0 3997:0 3999:0 '),\n+('3997','hf219','571','495','4006','68','73','0','2727.06','-3698.08','221.722','5.46582','3996:0 3998:0 '),\n+('3998','hf220','571','495','4065','68','73','0','2838.83','-3844.63','244.563','5.37','3997:0 '),\n+('3999','hf221','571','495','4006','68','73','0','2613.9','-3384.95','183','4.543','3995:0 3996:0 4000:0 4001:0 '),\n+('4000','hf222','571','495','4006','68','73','0','2724.44','-3424.92','224.685','0.694536','3999:0 '),\n+('4001','hf223','571','495','4054','68','73','0','2578.54','-3191.48','141.337','1.90327','3999:0 4002:0 '),\n+('4002','hf224','571','495','495','68','73','0','2515.29','-2957.64','111.213','1.93861','4001:0 4003:0 4011:0 4318:0 '),\n+('4003','hf225','571','495','4054','68','73','0','2301.09','-3135.29','143.7','3.73482','4002:0 4004:0 4010:0 '),\n+('4004','hf226','571','495','4054','68','73','0','2243.04','-3261.92','151.734','2.70201','4003:0 4005:0 '),\n+('4005','hf227','571','495','3999','68','73','0','2145.39','-3331.7','144.475','1.2019','4004:0 4006:0 '),\n+('4006','hf228','571','495','3999','68','73','0','2086.44','-3330','104.792','3.06722','4005:0 4007:0 '),\n+('4007','hf229','571','495','3999','68','73','0','1983.23','-3286.99','111.741','1.78624','4006:0 4008:0 '),\n+('4008','hf230','571','495','3999','68','73','0','2045.23','-3172.46','139.784','4.15736','4007:0 4009:0 '),\n+('4009','hf231','571','495','4062','68','73','5','2094.18','-2981.02','144.898','4.45895','4008:0 4010:0 '),\n+('4010','hf232','571','495','495','68','73','0','2264.88','-3015.48','135.084','5.19722','4009:0 4003:0 '),\n+('4011','hf233','571','495','495','68','73','0','2606.41','-2825.71','69.3506','1.32522','4002:0 4012:0 4318:0 '),\n+('4012','hf234','571','495','4070','68','73','0','2558.46','-2678.02','3.25504','5.60171','4011:0 4013:0 4322:0 '),\n+('4013','hf235','571','495','4070','68','73','0','2430.12','-2758.92','5.62901','3.37275','4012:0 4014:0 '),\n+('4014','hf236','571','495','4070','68','73','0','2281.27','-2774.11','4.91082','0.329327','4013:0 4015:0 '),\n+('4015','hf237','571','495','4070','68','73','0','2153.11','-2770.66','4.86218','3.08765','4014:0 4016:0 '),\n+('4016','hf238','571','495','4070','68','73','0','1967.15','-2762.53','3.5219','3.17561','4015:0 4017:0 '),\n+('4017','hf239','571','495','4070','68','73','0','1835.91','-2814.57','3.48005','3.54396','4016:0 4018:0 '),\n+('4018','hf240','571','495','4070','68','73','0','1677.38','-2975.29','3.95501','4.155','4017:0 4019:0 '),\n+('4019','hf241','571','495','4071','68','73','0','1576.78','-3123.46','2.99581','4.44402','4018:0 4020:0 4029:0 '),\n+('4020','hf242','571','495','4071','68','73','0','1609.87','-3258.66','3.34169','4.86186','4019:0 4021:0 '),\n+('4021','hf243','571','495','4071','68','73','0','1629.47','-3440.1','29.9326','3.35783','4020:0 4022:0 4030:0 '),\n+('4022','hf244','571','495','4071','68','73','0','1490.07','-3428.63','88.8301','0.0332379','4021:0 4023:0 '),\n+('4023','hf245','571','495','4071','68','73','0','1554.39','-3419.81','97.6795','4.70636','4022:0 4024:0 4026:0 4028:0 '),\n+('4024','hf246','571','495','4071','68','73','0','1638.14','-3283.78','76.0526','5.23256','4023:0 4025:0 '),\n+('4025','hf247','571','495','4071','68','73','0','1772.14','-3327.31','81.7587','4.30737','4024:0 '),\n+('4026','hf248','571','495','4071','68','73','0','1641.48','-3512.7','92.7675','1.7077','4023:0 4027:0 '),\n+('4027','hf249','571','495','495','68','73','0','1670.45','-3682.65','149.579','1.75245','4026:0 3988:0 4028:0 '),\n+('4028','hf250','571','495','4071','68','73','0','1565.95','-3550.52','112.177','1.48387','4027:0 4023:0 '),\n+('4029','hf251','571','495','495','68','73','0','1489.29','-3099.07','39.9696','5.34802','4019:0 4030:0 '),\n+('4030','hf252','571','495','4071','68','73','0','1511.33','-3269.6','74.5615','0.545315','4029:0 4021:0 '),\n+('4031','hf253','571','495','495','68','73','0','2104.47','-3840.68','209.54','2.27867','3992:0 4032:0 '),\n+('4032','hf254','571','495','4002','68','73','0','2068.75','-4073.32','236.821','4.87048','4031:0 4033:0 4039:0 '),\n+('4033','hf255','571','495','4002','68','73','0','1987.13','-4141.88','216.964','3.23293','4032:0 4034:0 '),\n+('4034','hf256','571','495','4002','68','73','0','1838.02','-4120.86','223.042','2.70435','4033:0 4035:0 4038:0 '),\n+('4035','hf257','571','495','4002','68','73','0','1672.75','-4022.82','249.031','3.18894','4034:0 4036:0 '),\n+('4036','hf258','571','495','4002','68','73','0','1693.59','-4091.47','270.671','4.86183','4035:0 4037:0 '),\n+('4037','hf259','571','495','4002','68','73','0','1644.9','-4213.64','258.417','6.27555','4036:0 4038:0 '),\n+('4038','hf260','571','495','4002','68','73','0','1773.12','-4215.36','238.947','0.851593','4037:0 4034:0 '),\n+('4039','hf261','571','495','495','68','73','0','2130.43','-4316.44','219.989','1.40137','4032:0 4040:0 '),\n+('4040','hf262','571','495','495','68','73','0','2183.63','-4535.73','216.514','4.86106','4039:0 4041:0 '),\n+('4041','hf263','571','495','495','68','73','0','2377.58','-4396.75','228.263','0.804472','4040:0 4042:0 '),\n+('4042','hf264','571','495','495','68','73','0','2551.09','-4320.92','279.902','6.10198','4041:0 4043:0 '),\n+('4043','hf265','571','495','4018','68','73','5','2613.73','-4366.35','276.555','2.42318','4042:0 4044:0 '),\n+('4044','hf266','571','495','4018','68','73','4','2716.59','-4368.81','272.672','5.25063','4043:0 4045:0 '),\n+('4045','hf267','571','495','495','68','73','0','2797.23','-4621.23','277.95','5.09748','4044:0 4046:0 4352:0 '),\n+('4046','hf268','571','495','495','68','73','0','2607.42','-4744.93','256.769','3.77173','4045:0 4047:0 '),\n+('4047','hf269','571','495','495','68','73','0','2455.43','-4885.82','260.773','3.54789','4046:0 4048:0 4051:0 '),\n+('4048','hf270','571','495','495','68','73','3','2431.15','-4962.71','273.723','1.34484','4047:0 4049:0 '),\n+('4049','hf271','571','495','4003','68','73','2','2510.75','-4994.59','283.35','2.79784','4048:0 4050:0 '),\n+('4050','hf272','571','495','4003','68','73','2','2456.13','-5113.98','277.313','4.08197','4049:0 '),\n+('4051','hf273','571','495','495','68','73','0','2232.27','-4879.42','237.068','0.178543','4047:0 4052:0 '),\n+('4052','hf274','571','495','495','68','73','0','2035.15','-4874.68','210.788','3.93982','4051:0 4053:0 4056:0 '),\n+('4053','hf275','571','495','495','68','73','0','1888.77','-4884.63','168.445','3.11672','4052:0 4054:0 '),\n+('4054','hf276','571','495','4059','68','73','0','1712.12','-4879.28','126.121','3.13635','4053:0 4055:0 '),\n+('4055','hf277','571','495','4059','68','73','0','1563','-4951.92','143.133','4.04662','4054:0 '),\n+('4056','hf278','571','495','495','68','73','0','1915.43','-5076.01','179.861','4.59721','4052:0 4057:0 '),\n+('4057','hf279','571','495','495','68','73','0','1824.95','-5278.57','182.601','4.39143','4056:0 4058:0 4064:0 '),\n+('4058','hf280','571','495','4061','68','73','0','1965.2','-5427.02','202.866','6.04468','4057:0 4059:0 '),\n+('4059','hf281','571','495','4061','68','73','0','2137.38','-5461.32','239.114','6.25123','4058:0 4060:0 '),\n+('4060','hf282','571','495','4061','68','73','0','2177.05','-5614.25','226.937','4.76369','4059:0 4061:0 4397:0 '),\n+('4061','hf283','571','495','4061','68','73','0','2173.72','-5813.08','225.029','3.53925','4060:0 4062:0 4397:0 '),\n+('4062','hf284','571','495','4061','68','73','0','1978.82','-5763.87','223.278','2.62034','4061:0 4063:0 '),\n+('4063','hf285','571','495','4061','68','73','0','1834.38','-5629.13','215.972','1.48308','4062:0 4064:0 '),\n+('4064','hf286','571','495','495','68','73','1','1667.21','-5453.46','197.385','2.72951','4063:0 4057:0 4065:0 4068:0 '),\n+('4065','hf287','571','495','4001','68','73','0','1532.35','-5419.75','189.418','2.63761','4064:0 4066:0 '),\n+('4066','hf288','571','495','4001','68','73','0','1486.1','-5319.6','195.08','1.17912','4065:0 4067:0 '),\n+('4067','hf289','571','495','4001','68','73','0','1504.6','-5264.18','206.615','0.745568','4066:0 '),\n+('4068','hf290','571','495','495','68','73','0','1492.09','-5524.43','200.456','3.74892','4064:0 4069:0 4072:0 '),\n+('4069','hf291','571','495','4403','68','73','0','1532.33','-5613.29','226.19','4.85477','4068:0 4070:0 '),\n+('4070','hf292','571','495','4402','68','73','4','1541.33','-5689.58','248.356','1.64643','4069:0 4071:0 '),\n+('4071','hf293','571','495','495','68','73','5','1631.27','-5779.62','258.389','2.51272','4070:0 '),\n+('4072','hf294','571','495','495','68','73','0','1394.07','-5574.59','205.361','0.236628','4068:0 4073:0 '),\n+('4073','hf295','571','495','495','68','73','0','1234.61','-5679.7','225.93','3.5408','4072:0 4074:0 4104:0 '),\n+('4074','hf296','571','495','3984','68','73','0','1037.41','-5697.06','228.706','3.34052','4073:0 4075:0 4108:0 '),\n+('4075','hf297','571','495','495','68','73','0','877.228','-5789.41','249.962','3.77328','4074:0 4076:0 '),\n+('4076','hf298','571','495','495','68','73','0','739.705','-5863.89','287.056','4.11336','4075:0 4077:0 '),\n+('4077','hf299','571','495','495','68','73','3','483.188','-5922.44','308.68','1.33265','4076:0 4078:0 '),\n+('4078','hf300','571','495','495','68','73','0','513.926','-5588.33','281.883','2.6321','4077:0 4079:0 '),\n+('4079','hf301','571','495','495','68','73','0','342.715','-5438.85','298.648','2.30775','4078:0 4080:0 '),\n+('4080','hf302','571','495','495','68','73','0','221.35','-5242.73','299.653','1.84436','4079:0 4081:0 '),\n+('4081','hf303','571','495','4057','68','73','0','161.173','-4925.94','298.444','1.79331','4080:0 4082:0 4083:0 4085:0 '),\n+('4082','hf304','571','495','495','68','73','0','285.533','-4807.39','248.989','1.63624','4081:0 3951:0 3954:0 '),\n+('4083','hf305','571','495','4057','68','73','0','-28.8267','-4914.36','302.775','3.12851','4081:0 4084:0 '),\n+('4084','hf306','571','495','4057','68','73','0','-143.121','-5118.6','323.883','1.16107','4083:0 '),\n+('4085','hf307','571','495','495','68','73','0','115.019','-4716.56','289.321','1.68335','4081:0 3952:0 4086:0 '),\n+('4086','hf308','571','495','495','68','73','0','156.917','-4507.79','256.612','1.23411','4085:0 3950:0 '),\n+('4087','hf309','571','495','3988','68','73','1','778.297','-2898.22','7.01161','4.8391','4088:0 '),\n+('4088','hf310','571','495','3987','68','73','0','741.908','-3049.69','25.2093','3.79609','4087:0 4089:0 4092:0 4093:0 4094:0 4095:0 '),\n+('4089','hf311','571','495','3987','68','73','0','590.131','-3156.57','40.1902','3.94689','4088:0 4090:0 4099:0 '),\n+('4090','hf312','571','495','3987','68','73','0','471.48','-3318.84','48.7074','3.51255','4089:0 4091:0 '),\n+('4091','hf313','571','495','3987','68','73','0','386.081','-3089.98','71.2014','1.81688','4090:0 4092:0 '),\n+('4092','hf314','571','495','3987','68','73','0','508.887','-3028.15','24.4901','2.16561','4091:0 4088:0 '),\n+('4093','hf315','571','495','3987','68','73','0','986.117','-3034.77','57.92','0.46364','4088:0 4094:0 '),\n+('4094','hf316','571','495','3987','68','73','0','749.692','-3240.83','24.9581','2.15066','4088:0 4093:0 4097:0 '),\n+('4095','hf317','571','495','3987','68','73','0','675.991','-3161.57','61.349','1.00634','4088:0 4096:0 '),\n+('4096','hf318','571','495','3987','68','73','0','677.454','-3393.96','67.7866','4.88621','4095:0 '),\n+('4097','hf319','571','495','3987','68','73','0','566.586','-3287.72','26.0315','4.65294','4094:0 4098:0 '),\n+('4098','hf320','571','495','4226','68','73','0','551.1','-3494.05','3.24654','4.58853','4097:0 '),\n+('4099','hf321','571','495','3987','68','73','0','370.473','-3216.41','23.421','3.95629','4089:0 4100:0 '),\n+('4100','hf322','571','495','4474','68','73','0','223.035','-3291.75','0.0638989','3.59893','4099:0 4101:0 '),\n+('4101','hf323','571','495','4474','68','73','0','114.305','-3330.69','0.616794','0.370948','4100:0 4102:0 '),\n+('4102','hf324','571','495','3989','68','73','0','-16.534','-3453.36','32.7157','1.36763','4101:0 4103:0 '),\n+('4103','hf325','571','495','3990','68','73','0','-130.721','-3573.93','3.18551','1.92133','4102:0 '),\n+('4104','hf326','571','495','495','68','73','0','1337.07','-5914.2','292.65','4.10948','4073:0 4105:0 '),\n+('4105','hf327','571','495','4005','68','73','0','1323.93','-6111.92','266.982','3.40577','4104:0 4106:0 '),\n+('4106','hf328','571','495','4005','68','73','0','1181.44','-6169.63','232.169','2.26694','4105:0 4107:0 '),\n+('4107','hf329','571','495','4005','68','73','0','1118.44','-6156.85','260.616','1.64883','4106:0 4108:0 '),\n+('4108','hf330','571','495','495','68','73','0','1131.33','-5884.77','271.705','2.04153','4107:0 4074:0 '),\n+('4109','db331','571','65','4478','70','74','0','3509.64','2944.69','24.9497','4.10306','3877:0 '),\n+('4110','db332','571','65','65','70','74','0','3526.72','2777.23','49.7018','4.66854','4111:0 4267:0 4274:0 '),\n+('4111','db333','571','65','4157','70','74','0','3369.46','2655.03','38.9276','4.90416','4110:0 4112:0 '),\n+('4112','db334','571','65','4157','70','74','0','3440.83','2477.55','45.9125','4.61748','4111:0 4113:0 '),\n+('4113','db335','571','65','4157','70','74','0','3395.92','2379.05','36.7537','2.28876','4112:0 4114:0 '),\n+('4114','db336','571','65','4157','70','74','0','3343.5','2223.35','29.9841','5.39185','4113:0 4116:0 4115:0 '),\n+('4115','db337','571','65','65','70','74','3','3489.08','1998.02','64.8654','1.46526','4114:0 4116:0 4260:0 '),\n+('4116','db338','571','65','4160','70','74','0','3228.78','1905.36','132.824','3.97029','4117:0 4114:0 4115:0 '),\n+('4117','db339','571','65','4160','70','74','0','2981.37','1896.75','127.972','2.94456','4116:0 4118:0 '),\n+('4118','db340','571','65','4160','70','74','0','2800.15','1812.41','147.093','5.30074','4117:0 4119:0 '),\n+('4119','db341','571','65','4160','70','74','0','2944.01','1641.57','152.165','4.64493','4118:0 4120:0 '),\n+('4120','db342','571','65','4153','70','74','0','2869.62','1469.27','157.603','5.17349','4119:0 4121:0 '),\n+('4121','db343','571','65','4153','70','74','0','2927.17','1282.72','151.277','5.62666','4120:0 4122:0 '),\n+('4122','db344','571','65','4153','70','74','0','3121.27','1266.58','158.478','3.9082','4121:0 4123:0 4128:0 '),\n+('4123','db345','571','65','4154','70','74','0','3098.59','1055.28','114.785','4.75643','4122:0 4124:0 4127:0 '),\n+('4124','db346','571','65','4152','70','74','0','3015.6','886.551','57.0023','3.13067','4123:0 4125:0 4127:0 '),\n+('4125','db347','571','65','4152','70','74','0','2864.53','878.189','19.1406','2.82436','4124:0 4126:0 '),\n+('4126','db348','571','65','4152','70','74','1','2657.93','892.145','4.37495','3.30424','4125:0 '),\n+('4127','db349','571','65','4154','70','74','0','3216.12','884.158','119.499','2.58873','4123:0 4124:0 4128:0 '),\n+('4128','db350','571','65','4154','70','74','0','3342.09','1163.09','140.364','0.88363','4122:0 4127:0 4129:0 '),\n+('4129','db351','571','65','4154','70','74','0','3499.57','1159.74','129.579','0.224683','4128:0 4130:0 4254:0 '),\n+('4130','db352','571','65','4254','70','74','0','3512.34','930.529','67.6824','4.436','4129:0 4131:0 '),\n+('4131','db353','571','65','4254','70','74','0','3439.05','725.86','74.9159','3.52022','4130:0 4132:0 '),\n+('4132','db354','571','65','4254','70','74','0','3383.4','548.065','79.6602','4.13597','4131:0 4133:0 '),\n+('4133','db355','571','65','4254','70','74','0','3284.71','349.551','72.0866','4.38102','4132:0 4134:0 '),\n+('4134','db356','571','65','4254','70','74','0','3258.62','161.424','74.762','4.63863','4133:0 4135:0 '),\n+('4135','db357','571','65','4254','70','74','0','3199.28','-65.6434','75.8214','5.73582','4134:0 4136:0 '),\n+('4136','db358','571','65','4254','70','74','0','3396.24','-138.385','72.6226','6.16308','4135:0 4137:0 4222:0 '),\n+('4137','db359','571','65','4176','70','74','0','3614.83','-219.548','59.6726','5.91567','4136:0 4138:0 '),\n+('4138','db360','571','65','4254','70','74','0','3790.53','-250.696','72.8378','0.182258','4137:0 4221:0 '),\n+('4139','db361','571','65','4254','70','74','0','3996.13','-105.238','55.0057','0.538831','4140:0 '),\n+('4140','db362','571','65','4254','70','74','0','4209.42','-149.468','68.6085','5.25672','4139:0 4141:0 '),\n+('4141','db363','571','65','4254','70','74','0','4346.6','-340.238','86.1907','5.65727','4140:0 4185:0 '),\n+('4142','db364','571','65','4254','70','74','0','4531.54','-157.776','94.5998','0.726543','4143:0 '),\n+('4143','db365','571','65','4253','70','74','0','4529.69','-5.32293','72.4325','1.1538','4142:0 4144:0 '),\n+('4144','db366','571','65','4187','70','74','0','4719.33','26.5065','64.7658','0.68649','4143:0 4145:0 '),\n+('4145','db367','571','65','4187','70','74','0','4857.73','152.013','95.1974','0.64722','4144:0 4146:0 4148:0 '),\n+('4146','db368','571','65','4187','70','74','0','5023.32','291.159','160.107','0.61659','4145:0 4147:0 '),\n+('4147','db369','571','65','4187','70','74','0','5185.63','203.224','194.36','2.54081','4146:0 4631:0 '),\n+('4148','db370','571','65','4187','70','74','0','4916.98','373.751','114.702','2.28006','4145:0 4149:0 '),\n+('4149','db371','571','65','4396','70','74','0','4715.84','582.426','121.086','2.36646','4148:0 4150:0 4182:0 '),\n+('4150','db372','571','65','4254','70','74','0','4669.25','828.097','110.706','2.44265','4151:0 4179:0 4149:0 '),\n+('4151','db373','571','65','4254','70','74','0','4441.38','887.155','84.3941','2.82121','4150:0 4152:0 4153:0 '),\n+('4152','db374','571','65','4254','70','74','0','4443.49','662.985','67.5233','2.64843','4151:0 4153:0 '),\n+('4153','db375','571','65','4254','70','74','0','4350.16','761.448','67.5378','5.48843','4152:0 4151:0 4154:0 '),\n+('4154','db376','571','65','4173','70','74','0','4171.02','645.93','64.3628','5.72325','4153:0 4155:0 '),\n+('4155','db377','571','65','4173','70','74','0','4234.66','525','11.3008','1.28578','4154:0 4156:0 '),\n+('4156','db378','571','65','4173','70','74','0','4325.75','527.107','-8.31338','5.11853','4155:0 4157:0 '),\n+('4157','db379','571','65','4173','70','74','0','4340.91','393.399','-6.35666','0.319745','4156:0 4158:0 '),\n+('4158','db380','571','65','4173','70','74','0','4445.71','448.569','48.7618','3.60429','4157:0 4159:0 '),\n+('4159','db381','571','65','4254','70','74','0','4396.23','306.166','44.9454','3.30034','4158:0 4160:0 '),\n+('4160','db382','571','65','4254','70','74','0','4238.24','300.479','69.4901','3.54617','4159:0 4161:0 '),\n+('4161','db383','571','65','4254','70','74','0','4069.57','365.886','52.151','2.76941','4160:0 4162:0 '),\n+('4162','db384','571','65','4254','70','74','0','3905.43','429.963','42.0653','2.76941','4161:0 4163:0 '),\n+('4163','db385','571','65','4254','70','74','0','3784.72','555.764','65.4753','2.52593','4162:0 4164:0 '),\n+('4164','db386','571','65','4254','70','74','0','3856.57','647.11','62.7715','2.10102','4163:0 4165:0 '),\n+('4165','db387','571','65','4254','70','74','0','3750.11','814.498','76.6706','1.69811','4164:0 4166:0 4169:0 '),\n+('4166','db388','571','65','4168','70','74','0','3669.68','935.971','55.9559','1.74995','4165:0 4167:0 '),\n+('4167','db389','571','65','4168','70','74','0','3656.82','1058.49','58.5011','5.83088','4166:0 4168:0 '),\n+('4168','db390','571','65','4168','70','74','0','3822.88','1076.68','57.7067','4.99837','4167:0 4169:0 '),\n+('4169','db391','571','65','4168','70','74','0','3851.01','940.099','56.0659','4.66535','4168:0 4165:0 4170:0 '),\n+('4170','db392','571','65','4254','70','74','0','4005.33','1003','53.2598','6.17489','4169:0 4171:0 '),\n+('4171','db393','571','65','4254','70','74','0','4142.41','981.525','78.4202','0.463487','4170:0 4172:0 '),\n+('4172','db394','571','65','4254','70','74','0','4305.2','1039.06','63.1545','6.25972','4171:0 4173:0 '),\n+('4173','db395','571','65','65','70','74','0','4276.99','1183.3','141.02','6.17961','4172:0 4174:0 '),\n+('4174','db396','571','65','65','70','74','0','4489.67','1187.53','136.792','1.18448','4173:0 4175:0 4179:0 '),\n+('4175','db397','571','65','4169','70','74','2','4570.48','1377.12','189.542','1.18173','4174:0 4176:0 '),\n+('4176','db398','571','65','4169','70','74','3','4589.48','1435.55','189.222','0.103772','4175:0 4177:0 4178:0 '),\n+('4177','db399','571','65','4169','70','74','2','4621.53','1507.35','204.751','1.03447','4176:0 '),\n+('4178','db400','571','65','4171','70','74','2','4711.55','1446.21','175.428','5.44841','4176:0 '),\n+('4179','db401','571','65','65','70','74','0','4690.88','1098.68','123.008','2.0861','4180:0 4174:0 4150:0 '),\n+('4180','db402','571','65','4170','70','74','4','4841.36','1140.74','171.495','1.04781','4181:0 4179:0 '),\n+('4181','db403','571','65','4170','70','74','5','4947.98','1224.66','225.705','1.29599','4180:0 '),\n+('4182','db404','571','65','4230','70','74','0','4857.56','636.316','157.933','3.35764','4183:0 4149:0 '),\n+('4183','db405','571','65','4230','70','74','0','4919.39','858.686','179.409','4.72424','4182:0 4184:0 '),\n+('4184','db406','571','65','4230','70','74','0','5115.8','1070.31','223.911','0.494084','4183:0 '),\n+('4185','db407','571','65','65','70','74','0','4361.47','-666.576','126.529','4.95513','4141:0 4186:0 4190:0 '),\n+('4186','db408','571','65','4193','70','74','0','4506.23','-611.765','138.674','0.191691','4185:0 4187:0 '),\n+('4187','db409','571','65','4193','70','74','0','4635.8','-532.061','166.561','4.05115','4186:0 4188:0 '),\n+('4188','db410','571','65','4193','70','74','0','4701.77','-386.751','178.452','4.03308','4187:0 4189:0 '),\n+('4189','db411','571','65','65','70','74','0','4744.71','-265.341','170.449','0.542767','4188:0 '),\n+('4190','db412','571','65','65','70','74','0','4381.74','-907.37','164.196','4.73833','4185:0 4191:0 '),\n+('4191','db413','571','65','65','70','74','0','4453.65','-1048.77','166.994','5.44283','4190:0 4192:0 4193:0 '),\n+('4192','db414','571','65','4191','70','74','1','4598.46','-1084.15','165.481','5.41142','4191:0 4197:0 '),\n+('4193','db415','571','65','65','70','74','0','4459.56','-1263.85','163.284','4.29694','4191:0 4194:0 4198:0 4199:0 '),\n+('4194','db416','571','65','4194','70','74','0','4561.66','-1361.99','156.723','5.94234','4193:0 4195:0 '),\n+('4195','db417','571','65','4194','70','74','0','4677.53','-1359.08','162.34','2.13944','4194:0 4196:0 4451:0 '),\n+('4196','db418','571','65','4194','70','74','0','4810.96','-1263.2','168.051','2.83451','4195:0 4197:0 '),\n+('4197','db419','571','65','65','70','74','0','4682.42','-1190.97','164.492','2.29651','4196:0 4192:0 '),\n+('4198','db420','571','65','65','70','74','0','4426.84','-1508.64','159.241','4.50584','4193:0 4276:0 '),\n+('4199','db421','571','65','65','70','74','0','4306.11','-1358.64','159.518','2.56747','4193:0 4200:0 '),\n+('4200','db422','571','65','4189','70','74','0','4174.24','-1186.41','145.827','2.02005','4199:0 4201:0 '),\n+('4201','db423','571','65','4189','70','74','0','4007.83','-1254.48','133.053','2.98923','4200:0 4202:0 '),\n+('4202','db424','571','65','65','70','74','0','3870.4','-1277.63','147.246','3.74243','4201:0 4203:0 4211:0 '),\n+('4203','db425','571','65','4188','70','74','0','3760.87','-1379.1','135.314','4.06287','4202:0 4204:0 '),\n+('4204','db426','571','65','4188','70','74','0','3749.27','-1504.65','141.102','2.59496','4203:0 4205:0 '),\n+('4205','db427','571','65','4188','70','74','0','3628.59','-1546.14','118.335','2.62324','4204:0 4206:0 '),\n+('4206','db428','571','65','4188','70','74','0','3581.08','-1357.67','107.693','1.20402','4205:0 4207:0 '),\n+('4207','db429','571','65','4188','70','74','0','3627.72','-1237','112.462','1.20323','4206:0 4208:0 '),\n+('4208','db430','571','65','4188','70','74','0','3662.83','-1064.27','125.377','1.29591','4207:0 4209:0 '),\n+('4209','db431','571','65','4188','70','74','0','3755.72','-1010.08','121.509','5.72713','4208:0 4210:0 4212:0 '),\n+('4210','db432','571','65','4188','70','74','0','3850.53','-1132.6','122.334','6.27534','4209:0 4211:0 '),\n+('4211','db433','571','65','65','70','74','0','3942.27','-1148.57','140.166','4.29771','4210:0 4202:0 '),\n+('4212','db434','571','65','4177','70','74','0','3746.15','-891.172','162.614','2.06089','4209:0 4213:0 4216:0 '),\n+('4213','db435','571','65','4177','70','74','0','3650.12','-879.646','162.72','3.17459','4212:0 4214:0 '),\n+('4214','db436','571','65','4177','70','74','2','3590.79','-835.238','172.37','1.65563','4213:0 4215:0 4240:0 '),\n+('4215','db437','571','65','4243','70','74','0','3599.65','-781.467','147.621','0.0926948','4214:0 '),\n+('4216','db438','571','65','4177','70','74','3','3768.81','-779.501','195.937','4.02283','4212:0 4217:0 '),\n+('4217','db439','571','65','4177','70','74','2','3925.37','-698.927','241.206','0.865546','4216:0 4218:0 '),\n+('4218','db440','571','65','4175','70','74','0','3986.58','-553.999','216.076','2.58635','4217:0 4219:0 '),\n+('4219','db441','571','65','4254','70','74','0','3809.46','-473.161','169.556','2.73087','4218:0 4220:0 '),\n+('4220','db442','571','65','65','70','74','0','3724.29','-439.939','157.058','3.21388','4219:0 4221:0 '),\n+('4221','db443','571','65','4254','70','74','0','3784.04','-368.672','97.0346','1.91644','4220:0 4138:0 '),\n+('4222','db444','571','65','4254','70','74','0','3263.75','-275.159','91.4928','3.40319','4136:0 4223:0 '),\n+('4223','db445','571','65','65','70','74','0','3244.55','-472.809','140.618','1.83632','4222:0 4224:0 4234:0 '),\n+('4224','db446','571','65','65','70','74','0','3148.48','-604.869','113.192','1.5842','4223:0 4225:0 4237:0 '),\n+('4225','db447','571','65','4180','70','74','0','2993.93','-429.733','123.402','2.59501','4224:0 4226:0 '),\n+('4226','db448','571','65','4180','70','74','0','2867.29','-384.503','112.462','2.7623','4225:0 4227:0 4233:0 '),\n+('4227','db449','571','65','4180','70','74','0','2773.28','-465.739','116.162','4.48387','4226:0 4228:0 '),\n+('4228','db450','571','65','4180','70','74','0','2687.72','-431.283','71.3279','2.92957','4227:0 4229:0 '),\n+('4229','db451','571','65','4181','70','74','0','2536.4','-415.378','2.90773','1.58496','4228:0 4230:0 4253:0 '),\n+('4230','db452','571','65','4181','70','74','0','2612.51','-244.345','1.72779','6.26044','4229:0 4231:0 '),\n+('4231','db453','571','65','4180','70','74','0','2656.87','-171.598','62.2241','1.32029','4230:0 4232:0 '),\n+('4232','db454','571','65','4180','70','74','0','2737.23','-100.56','114.159','4.23648','4231:0 4233:0 '),\n+('4233','db455','571','65','4180','70','74','0','2792.04','-264.842','132.149','5.26534','4232:0 4226:0 '),\n+('4234','db456','571','65','4186','70','74','5','3231.05','-661.255','166.734','1.42239','4223:0 4235:0 '),\n+('4235','db457','571','65','4186','70','74','4','3272.19','-751.348','168.143','4.40298','4234:0 4236:0 '),\n+('4236','db458','571','65','65','70','74','0','3325.52','-1005.39','123.604','2.0507','4235:0 4237:0 4238:0 4249:0 '),\n+('4237','db459','571','65','65','70','74','0','3207.68','-802.517','112.975','2.23134','4236:0 4224:0 '),\n+('4238','db460','571','65','65','70','74','0','3400.63','-1169.43','112.122','5.78762','4236:0 4239:0 4241:0 '),\n+('4239','db461','571','65','65','70','74','0','3494.11','-1049.52','124.775','0.832553','4238:0 4240:0 '),\n+('4240','db462','571','65','4177','70','74','2','3600.71','-914.48','156.552','1.53549','4239:0 4214:0 '),\n+('4241','db463','571','65','65','70','74','0','3235.06','-1355.04','70.8979','3.83276','4238:0 4242:0 '),\n+('4242','db464','571','65','4257','70','74','0','3180.86','-1542.39','40.4347','4.7124','4241:0 4243:0 4277:0 '),\n+('4243','db465','571','65','4241','70','74','0','3051.36','-1392.98','57.3848','2.94133','4242:0 4244:0 '),\n+('4244','db466','571','65','4241','70','74','0','2889.8','-1432.73','58.3338','3.04186','4243:0 4245:0 '),\n+('4245','db467','571','65','4241','70','74','0','2772.55','-1373.06','40.6788','6.18974','4244:0 4246:0 '),\n+('4246','db468','571','65','4185','70','74','0','2882.77','-1303.94','6.48389','1.04459','4245:0 4247:0 '),\n+('4247','db469','571','65','4185','70','74','0','2938.22','-1169.74','6.81704','5.99025','4246:0 4248:0 4250:0 '),\n+('4248','db470','571','65','4185','70','74','0','3085.09','-1193.85','12.4717','5.4876','4247:0 4249:0 '),\n+('4249','db471','571','65','4185','70','74','0','3180.57','-1059.52','44.9918','0.29769','4248:0 4236:0 '),\n+('4250','db472','571','65','4185','70','74','0','2929.48','-986.506','4.6099','1.77817','4247:0 4251:0 '),\n+('4251','db473','571','65','4185','70','74','0','2865.52','-836.167','15.7438','2.35701','4250:0 4252:0 '),\n+('4252','db474','571','65','4185','70','74','0','2691.63','-707.31','8.95638','2.62875','4251:0 4253:0 '),\n+('4253','db475','571','65','4181','70','74','0','2662.91','-565.045','4.97671','2.87851','4252:0 4229:0 '),\n+('4254','db476','571','65','65','70','74','0','3597.9','1391.95','92.2854','0.792481','4129:0 4255:0 '),\n+('4255','db477','571','65','4165','70','74','4','3768.55','1529.38','86.92','0.415486','4254:0 4256:0 '),\n+('4256','db478','571','65','4165','70','74','5','3841.3','1533.41','89.7247','1.82685','4255:0 4257:0 '),\n+('4257','db479','571','65','4165','70','74','4','3890.52','1637.61','96.2566','0.644815','4256:0 4258:0 '),\n+('4258','db480','571','65','65','70','74','0','4003.51','1741.08','142.414','3.8728','4257:0 4259:0 '),\n+('4259','db481','571','65','65','70','74','0','3800.66','1801.11','107.946','0.35893','4258:0 4260:0 4273:0 '),\n+('4260','db482','571','65','65','70','74','0','3642.7','1910.26','75.9736','1.69646','4259:0 4261:0 4115:0 '),\n+('4261','db483','571','65','65','70','74','0','3615.88','2050.78','74.6297','1.7962','4260:0 4262:0 4265:0 '),\n+('4262','db484','571','65','4164','70','74','0','3709.48','2144.81','53.4192','3.56571','4261:0 4263:0 4264:0 '),\n+('4263','db485','571','65','4164','70','74','0','3706.64','2076.92','21.8594','1.15533','4262:0 4264:0 '),\n+('4264','db486','571','65','4164','70','74','0','3772.34','2169.36','27.3597','4.8828','4263:0 4262:0 '),\n+('4265','db487','571','65','65','70','74','0','3638.81','2223.64','76.3879','1.34851','4261:0 4266:0 '),\n+('4266','db488','571','65','65','70','74','0','3608.56','2424.79','84.7521','0.47515','4265:0 4267:0 '),\n+('4267','db489','571','65','65','70','74','0','3667.57','2606.35','104.934','2.34754','4266:0 4110:0 4268:0 '),\n+('4268','db490','571','65','65','70','74','0','3821.64','2594.47','138.086','5.63442','4267:0 4269:0 '),\n+('4269','db491','571','65','4163','70','74','0','3877.75','2397.8','152.255','5.33596','4268:0 4270:0 '),\n+('4270','db492','571','65','4163','70','74','0','4003.82','2286.07','153.425','6.19125','4269:0 4271:0 '),\n+('4271','db493','571','65','4163','70','74','0','4084.73','2159.31','153.682','4.48536','4270:0 4272:0 '),\n+('4272','db494','571','65','4163','70','74','0','3961.11','2124.54','131.41','3.85941','4271:0 4273:0 '),\n+('4273','db495','571','65','65','70','74','0','3825.91','1954.77','104.913','4.14765','4272:0 4259:0 '),\n+('4274','db496','571','65','4151','70','74','4','3706.43','2835.58','88.7151','0.419359','4110:0 4275:0 '),\n+('4275','db497','571','65','4151','70','74','5','3828.74','2884','90.3388','0.171959','4274:0 '),\n+('4276','gh498','571','394','394','72','76','0','4412.91','-1618.03','162.125','4.64085','4198:0 4289:0 '),\n+('4277','gh499','571','394','394','72','76','0','3182.34','-1659.02','38.7919','4.89218','4242:0 4278:0 '),\n+('4278','gh500','571','394','394','72','76','0','3170.1','-1849.63','70.0118','5.13957','4277:0 4279:0 '),\n+('4279','gh501','571','394','4236','72','76','0','3193.69','-1991.71','85.0008','6.13546','4278:0 4280:0 4306:0 '),\n+('4280','gh502','571','394','394','72','76','0','3351.7','-1957.7','116.26','3.20042','4279:0 4281:0 4302:0 '),\n+('4281','gh503','571','394','394','72','76','0','3506.14','-1975.54','165.694','5.76004','4280:0 4282:0 4301:0 '),\n+('4282','gh504','571','394','394','72','76','0','3654.24','-2134.59','147.89','4.94165','4281:0 4283:0 4331:0 '),\n+('4283','gh505','571','394','394','72','76','0','3768.13','-2266.2','173.421','6.00979','4282:0 4284:0 4297:0 4331:0 '),\n+('4284','gh506','571','394','394','72','76','0','3965.13','-2347.84','213.634','6.13467','4283:0 4285:0 4446:0 '),\n+('4285','gh507','571','394','394','72','76','0','4179.57','-2348.21','225.457','0.204908','4284:0 4286:0 4435:0 '),\n+('4286','gh508','571','394','394','72','76','0','4360.95','-2316.79','201.282','0.15857','4285:0 4287:0 4296:0 '),\n+('4287','gh509','571','394','394','72','76','0','4456.7','-2146.34','174.126','1.54558','4286:0 4288:0 '),\n+('4288','gh510','571','394','394','72','76','0','4445.16','-1972.91','158.144','1.95792','4287:0 4289:0 '),\n+('4289','gh511','571','394','394','72','76','0','4441.13','-1782.37','162.404','1.80319','4288:0 4276:0 4290:0 '),\n+('4290','gh512','571','394','394','72','76','0','4395.14','-1892.04','161.168','3.62925','4289:0 4291:0 '),\n+('4291','gh513','571','394','4209','72','76','0','4294.12','-1906.66','197.755','3.31587','4290:0 4292:0 4293:0 4294:0 '),\n+('4292','gh514','571','394','4209','72','76','0','4245.43','-2019.66','235.391','1.60371','4291:0 '),\n+('4293','gh515','571','394','4209','72','76','0','4219.61','-1824.36','202.548','2.41267','4291:0 '),\n+('4294','gh516','571','394','4209','72','76','0','4141.35','-1993.19','212.874','4.66597','4291:0 4295:0 '),\n+('4295','gh517','571','394','4209','72','76','0','4200.73','-2152.09','218.191','0.0124693','4294:0 4296:0 '),\n+('4296','gh518','571','394','394','72','76','0','4337.91','-2212.2','191.313','5.10972','4295:0 4286:0 '),\n+('4297','gh519','571','394','394','72','76','0','3919.84','-2211.56','210.955','0.375331','4283:0 4298:0 '),\n+('4298','gh520','571','394','394','72','76','0','3841.19','-2055.11','210.168','1.65396','4297:0 4299:0 '),\n+('4299','gh521','571','394','394','72','76','0','3817.14','-1865.71','214.679','1.96419','4298:0 4300:0 '),\n+('4300','gh522','571','394','394','72','76','0','3654.79','-1866.78','173.387','2.8674','4299:0 4301:0 '),\n+('4301','gh523','571','394','394','72','76','0','3559.72','-1897.37','155.876','3.47686','4300:0 4281:0 '),\n+('4302','gh524','571','394','394','72','76','0','3387.84','-2133.26','124.553','5.44191','4280:0 4303:0 '),\n+('4303','gh525','571','394','4206','72','76','4','3345.18','-2217.45','119.375','3.61665','4302:0 4304:0 '),\n+('4304','gh526','571','394','4206','72','76','5','3256.98','-2231.76','116.09','1.0425','4303:0 4305:0 '),\n+('4305','gh527','571','394','394','72','76','0','3086.49','-2267.46','94.942','1.73561','4304:0 4306:0 4314:0 '),\n+('4306','gh528','571','394','394','72','76','0','3084.66','-2084.36','87.6685','1.27615','4305:0 4279:0 4307:0 '),\n+('4307','gh529','571','394','394','72','76','0','2953.2','-1963.36','51.3225','2.81396','4306:0 4308:0 '),\n+('4308','gh530','571','394','4242','72','76','0','2828.38','-1917.21','9.14124','2.88465','4307:0 4309:0 4310:0 '),\n+('4309','gh531','571','394','4242','72','76','0','2698.31','-2040.99','3.89624','0.465604','4308:0 4313:0 '),\n+('4310','gh532','571','394','4242','72','76','0','2755.77','-1781.45','5.41989','5.167','4308:0 4311:0 '),\n+('4311','gh533','571','394','4242','72','76','0','2565.61','-1807.96','9.92644','3.51374','4310:0 4312:0 '),\n+('4312','gh534','571','394','4242','72','76','0','2542.58','-1990.88','8.43344','5.20077','4311:0 4313:0 '),\n+('4313','gh535','571','394','4242','72','76','0','2617','-2122.41','7.0106','0.525292','4312:0 4309:0 '),\n+('4314','gh536','571','394','394','72','76','0','3111.6','-2469.39','60.839','4.64079','4305:0 4315:0 '),\n+('4315','gh537','571','394','394','72','76','0','3050.93','-2690.26','65.2339','4.32742','4314:0 4316:0 '),\n+('4316','gh538','571','394','394','72','76','0','2996.43','-2911.54','99.7541','3.55929','4315:0 4317:0 4323:0 '),\n+('4317','gh539','571','394','394','72','76','0','2806.9','-2891.38','64.0493','3.18937','4316:0 4318:0 '),\n+('4318','gh540','571','394','394','72','76','0','2688.1','-2877.41','68.4325','1.86676','4319:0 4317:0 4011:0 4002:0 '),\n+('4319','gh541','571','394','4207','72','76','0','2863.15','-2691.55','84.6612','0.692585','4320:0 4318:0 '),\n+('4320','gh542','571','394','4207','72','76','0','2913.28','-2523.08','77.2727','2.2516','4319:0 4321:0 '),\n+('4321','gh543','571','394','4207','72','76','0','2759.62','-2433.25','39.5256','4.18681','4320:0 4322:0 '),\n+('4322','gh544','571','394','394','72','76','0','2655.99','-2570.44','12.8707','0.715349','4321:0 4012:0 '),\n+('4323','gh545','571','394','4240','72','76','0','3159.97','-2966.67','125.976','5.16462','4316:0 4324:0 '),\n+('4324','gh546','571','394','394','72','76','0','3229.99','-3097.97','155.647','5.16069','4323:0 4325:0 4333:0 '),\n+('4325','gh547','571','394','394','72','76','0','3347.86','-2939.95','194.535','0.886556','4324:0 4326:0 '),\n+('4326','gh548','571','394','4204','72','76','3','3409.22','-2819.78','200.664','5.07272','4325:0 4327:0 '),\n+('4327','gh549','571','394','394','72','76','0','3563.32','-2837.92','196.693','3.21211','4326:0 4328:0 '),\n+('4328','gh550','571','394','394','72','76','0','3639.37','-2888.65','220.844','1.05698','4327:0 4329:0 4332:0 4432:0 '),\n+('4329','gh551','571','394','394','72','76','0','3750.73','-2701.59','175.222','0.808005','4328:0 4330:0 4448:0 '),\n+('4330','gh552','571','394','394','72','76','0','3701.9','-2499.94','160.171','2.01988','4329:0 4331:0 '),\n+('4331','gh553','571','394','394','72','76','0','3667.41','-2329.55','156.4','0.83785','4330:0 4283:0 4282:0 '),\n+('4332','gh554','571','394','394','72','76','0','3567.56','-3072.84','238.573','4.01871','4328:0 4333:0 4334:0 '),\n+('4333','gh555','571','394','394','72','76','0','3355.89','-3183.89','200.874','2.94663','4332:0 4324:0 '),\n+('4334','gh556','571','394','394','72','76','0','3543.08','-3277.22','242.517','4.88658','4332:0 4335:0 '),\n+('4335','gh557','571','394','394','72','76','0','3676.96','-3469.09','242.035','5.54866','4334:0 4336:0 4429:0 '),\n+('4336','gh558','571','394','394','72','76','0','3696.59','-3688.31','209.189','4.55906','4335:0 4337:0 '),\n+('4337','gh559','571','394','394','72','76','0','3728.04','-3862.81','183.316','0.164743','4336:0 4338:0 4340:0 4347:0 '),\n+('4338','gh560','571','394','4215','72','76','0','3590.62','-3901.08','196.64','2.77227','4337:0 4339:0 '),\n+('4339','gh561','571','394','4215','72','76','0','3525.9','-3755.42','228.317','2.26176','4338:0 '),\n+('4340','gh562','571','394','395','72','76','0','3841.06','-3743.21','175.461','6.13141','4337:0 4341:0 '),\n+('4341','gh563','571','394','395','72','76','0','3974.14','-3774.46','151.082','6.17382','4340:0 4342:0 '),\n+('4342','gh564','571','394','395','72','76','0','4052.02','-3740.14','220.288','4.50485','4341:0 4343:0 '),\n+('4343','gh565','571','394','395','72','76','0','4135.39','-3710.81','180.991','2.0819','4342:0 4344:0 '),\n+('4344','gh566','571','394','395','72','76','0','4194.15','-3814.05','181.668','4.59518','4343:0 4345:0 '),\n+('4345','gh567','571','394','395','72','76','0','4181.7','-3982.87','170.498','4.5402','4344:0 4346:0 4409:0 '),\n+('4346','gh568','571','394','394','72','76','0','4024.2','-4043.93','176.713','3.04794','4345:0 4347:0 4409:0 '),\n+('4347','gh569','571','394','394','72','76','0','3787.44','-3987.74','181.678','2.65995','4346:0 4337:0 4348:0 '),\n+('4348','gh570','571','394','394','72','76','0','3718.3','-4188.38','192.248','4.50249','4347:0 4349:0 4356:0 '),\n+('4349','gh571','571','394','394','72','76','0','3545.36','-4300.26','227.855','3.59221','4348:0 4350:0 '),\n+('4350','gh572','571','394','394','72','76','0','3375.07','-4408.72','245.826','4.29907','4349:0 4351:0 4353:0 '),\n+('4351','gh573','571','394','4480','72','76','0','3261.77','-4590.54','305.739','3.95742','4350:0 4352:0 '),\n+('4352','gh574','571','394','4480','72','76','0','3089.14','-4641.2','316.308','3.35188','4351:0 4045:0 '),\n+('4353','gh575','571','394','4218','72','76','0','3502.07','-4548.51','221.433','3.38171','4350:0 4354:0 '),\n+('4354','gh576','571','394','394','72','76','0','3656.98','-4455.52','184.363','5.84315','4353:0 4355:0 '),\n+('4355','gh577','571','394','394','72','76','0','3731.98','-4511.53','193.763','0.757702','4354:0 4356:0 '),\n+('4356','gh578','571','394','394','72','76','5','3851.11','-4369.54','192.918','1.37424','4355:0 4348:0 4357:0 '),\n+('4357','gh579','571','394','4205','72','76','0','3939.37','-4409.34','238.255','4.98392','4356:0 4358:0 '),\n+('4358','gh580','571','394','4205','72','76','0','4062.37','-4401.54','260.429','0.235388','4357:0 4359:0 4408:0 4410:0 '),\n+('4359','gh581','571','394','394','72','76','0','4171.31','-4502.24','219.959','1.1284','4358:0 4360:0 '),\n+('4360','gh582','571','394','4205','72','76','0','4003.62','-4566.46','195.348','3.13431','4359:0 4361:0 '),\n+('4361','gh583','571','394','394','72','76','0','4008.13','-4692.66','141.153','5.45436','4360:0 4362:0 '),\n+('4362','gh584','571','394','4231','72','76','0','4082.28','-4754.21','96.3716','4.76714','4361:0 4363:0 '),\n+('4363','gh585','571','394','4249','72','76','0','4193.08','-4880.87','42.4572','3.89614','4362:0 4364:0 4374:0 4382:0 '),\n+('4364','gh586','571','394','4249','72','76','0','4317.27','-4702.62','75.8335','0.62967','4363:0 4365:0 '),\n+('4365','gh587','571','394','4249','72','76','0','4444.07','-4566.46','104.898','1.65462','4364:0 4366:0 '),\n+('4366','gh588','571','394','4249','72','76','0','4428.45','-4387.5','151.381','1.08913','4365:0 4367:0 '),\n+('4367','gh589','571','394','4159','72','76','0','4438.72','-4286.42','161.56','6.09212','4366:0 4368:0 4420:0 '),\n+('4368','gh590','571','394','4249','72','76','0','4621.51','-4357.67','181.183','5.95781','4367:0 4369:0 '),\n+('4369','gh591','571','394','4221','72','76','0','4732.05','-4454.6','194.355','5.45673','4368:0 4370:0 '),\n+('4370','gh592','571','394','4221','72','76','0','4820.92','-4522.91','200.404','5.83294','4369:0 4371:0 '),\n+('4371','gh593','571','394','4221','72','76','0','4909.98','-4586.39','219.616','4.43492','4370:0 4372:0 '),\n+('4372','gh594','571','394','4221','72','76','0','4984.98','-4692.79','219.491','5.1245','4371:0 4373:0 '),\n+('4373','gh595','571','394','4221','72','76','0','5041.25','-4817','219.501','2.53662','4372:0 '),\n+('4374','gh596','571','394','4212','72','76','0','4339.89','-4870.51','34.7802','0.17335','4363:0 4375:0 '),\n+('4375','gh597','571','394','4216','72','76','0','4474.49','-4921.22','14.201','5.96566','4374:0 4376:0 4377:0 '),\n+('4376','gh598','571','394','4212','72','76','0','4518.04','-5017.36','3.25924','5.12764','4375:0 '),\n+('4377','gh599','571','394','4216','72','76','0','4569.4','-4865.21','47.9919','0.149002','4375:0 4378:0 4379:0 4380:0 '),\n+('4378','gh600','571','394','4216','72','76','0','4707.48','-4794.55','47.992','5.06167','4377:0 4379:0 '),\n+('4379','gh601','571','394','4216','72','76','0','4708.25','-4910.12','47.9928','1.36166','4377:0 4378:0 '),\n+('4380','gh602','571','394','4216','72','76','0','4744.53','-4859.91','26.2962','0.387759','4377:0 4381:0 '),\n+('4381','gh603','571','394','4216','72','76','0','4816.99','-4789.4','25.4718','0.872349','4380:0 '),\n+('4382','gh604','571','394','4249','72','76','0','4022.33','-4997.21','41.214','3.78223','4363:0 4383:0 4391:0 '),\n+('4383','gh605','571','394','4249','72','76','0','3816.35','-5011.96','106.526','3.31727','4382:0 4384:0 4392:0 '),\n+('4384','gh606','571','394','4220','72','76','0','3646.81','-5000.53','175.852','4.1867','4383:0 4385:0 '),\n+('4385','gh607','571','394','4220','72','76','0','3524.22','-5120.65','233.744','2.61591','4384:0 4386:0 4389:0 '),\n+('4386','gh608','571','394','4220','72','76','0','3419.01','-4995.77','285.739','2.5845','4385:0 4387:0 '),\n+('4387','gh609','571','394','4220','72','76','0','3356.74','-5082.19','325.289','3.94009','4386:0 4388:0 '),\n+('4388','gh610','571','394','4220','72','76','0','3310.99','-5122.5','340.978','1.36004','4387:0 '),\n+('4389','gh611','571','394','4220','72','76','0','3433.34','-5250.17','269.339','1.01289','4385:0 4390:0 '),\n+('4390','gh612','571','394','4220','72','76','0','3407.12','-5388.15','267.856','1.78573','4389:0 '),\n+('4391','gh613','571','394','4212','72','76','0','4006.9','-5232.47','7.75033','1.18098','4382:0 4402:0 '),\n+('4392','gh614','571','394','394','72','76','0','3757.96','-5153.08','119.324','4.14823','4383:0 4393:0 '),\n+('4393','gh615','571','394','394','72','76','0','3598.76','-5357.93','139.869','4.05555','4392:0 4394:0 '),\n+('4394','gh616','571','394','4213','72','76','0','3443.06','-5490.97','198.431','3.26623','4393:0 4395:0 '),\n+('4395','gh617','571','394','4213','72','76','0','3274.45','-5572.3','213.641','3.71783','4394:0 4396:0 '),\n+('4396','gh618','571','394','4213','72','76','0','3100.03','-5709.35','220.326','3.74532','4395:0 4401:0 '),\n+('4397','hf619','571','495','4061','68','73','0','2323.35','-5813.06','251.394','3.16805','4060:0 4061:0 4398:0 '),\n+('4398','hf620','571','495','495','68','73','0','2519.29','-5851.8','276.256','4.73492','4397:0 4399:0 '),\n+('4399','hf621','571','495','495','68','73','0','2703.09','-5953.52','271.511','6.11722','4398:0 4400:0 '),\n+('4400','hf622','571','495','4252','68','73','0','2849.67','-5840.96','273.44','0.629637','4399:0 4401:0 '),\n+('4401','hf623','571','495','4252','68','73','0','3003.04','-5779.08','254.433','0.523608','4400:0 4396:0 '),\n+('4402','gh624','571','394','4212','72','76','0','4153.59','-5224.2','7.42476','6.08423','4391:0 4403:0 '),\n+('4403','gh625','571','394','4212','72','76','0','4327.94','-5342.7','4.49671','5.82112','4402:0 4404:0 '),\n+('4404','gh626','571','394','4244','72','76','0','4543.08','-5485.22','2.18391','5.50775','4403:0 4405:0 '),\n+('4405','gh627','571','394','4244','72','76','0','4695.42','-5635.74','77.5219','4.55742','4404:0 4406:0 '),\n+('4406','gh628','571','394','4245','72','76','0','4616.66','-5660.81','114.593','4.22877','4405:0 4407:0 '),\n+('4407','gh629','571','394','4245','72','76','0','4593.57','-5707.41','184.506','1.02041','4406:0 '),\n+('4408','gh630','571','394','394','72','76','0','4113.47','-4233.27','243.732','1.89258','4358:0 4409:0 '),\n+('4409','gh631','571','394','394','72','76','1','4125.58','-4095.14','182.823','2.77224','4408:0 4346:0 4345:0 '),\n+('4410','gh632','571','394','394','72','76','0','4172.63','-4310.2','238.733','2.85314','4358:0 4411:0 '),\n+('4411','gh633','571','394','394','72','76','0','4326.78','-4119.6','193.825','0.547988','4410:0 4412:0 '),\n+('4412','gh634','571','394','394','72','76','0','4486.09','-3977.4','186.997','5.61774','4411:0 4413:0 4422:0 '),\n+('4413','gh635','571','394','394','72','76','0','4625.2','-4092.13','199.11','2.30728','4412:0 4414:0 '),\n+('4414','gh636','571','394','394','72','76','0','4734.83','-4181.86','231.297','2.31358','4413:0 4415:0 '),\n+('4415','gh637','571','394','394','72','76','0','4906.69','-4306.46','257.585','0.692519','4414:0 4416:0 4449:0 '),\n+('4416','gh638','571','394','4214','72','76','0','5016.3','-4437.54','278.117','5.31851','4415:0 4417:0 '),\n+('4417','gh639','571','394','4214','72','76','0','5101.89','-4569.13','283.736','5.11902','4416:0 4418:0 '),\n+('4418','gh640','571','394','4214','72','76','0','5193.65','-4729.96','293.156','5.98138','4417:0 4419:0 '),\n+('4419','gh641','571','394','4214','72','76','0','5380.16','-4761.41','305.589','6.26491','4418:0 '),\n+('4420','gh642','571','394','4159','72','76','2','4508.01','-4224.81','167.488','4.05322','4367:0 4421:0 '),\n+('4421','gh643','571','394','4159','72','76','3','4593.24','-4223.94','178.654','3.05419','4420:0 '),\n+('4422','gh644','571','394','394','72','76','0','4397.58','-3823.41','207.663','1.98605','4412:0 4423:0 '),\n+('4423','gh645','571','394','4235','72','76','0','4363.62','-3661.89','253.292','1.03572','4422:0 4424:0 4426:0 '),\n+('4424','gh646','571','394','4270','72','76','0','4464.25','-3523.69','231.349','0.662651','4423:0 4425:0 '),\n+('4425','gh647','571','394','4270','72','76','0','4540.35','-3448.14','226.932','0.666578','4424:0 4450:0 '),\n+('4426','gh648','571','394','394','72','76','0','4254.62','-3537.34','262.169','3.11545','4423:0 4427:0 '),\n+('4427','gh649','571','394','394','72','76','0','4082.82','-3452.53','279.273','2.96073','4426:0 4428:0 '),\n+('4428','gh650','571','394','4267','72','76','0','4017.93','-3398.46','291.406','1.89652','4427:0 4429:0 4430:0 '),\n+('4429','gh651','571','394','394','72','76','0','3805.22','-3452.83','276.397','3.26311','4428:0 4335:0 '),\n+('4430','gh652','571','394','394','72','76','0','3927.34','-3218.24','296.696','2.32848','4428:0 4431:0 4438:0 '),\n+('4431','gh653','571','394','394','72','76','0','3809.69','-3057.95','274.256','2.59945','4430:0 4432:0 4445:0 '),\n+('4432','gh654','571','394','394','72','76','0','3727.35','-2986.21','236.602','2.62301','4431:0 4328:0 4433:0 '),\n+('4433','gh655','571','394','4203','72','76','0','3799.13','-2875.46','222.297','0.855862','4432:0 4434:0 '),\n+('4434','gh656','571','394','394','72','76','0','3912.6','-2792.74','176.353','3.96212','4433:0 '),\n+('4435','gh657','571','394','4199','72','76','0','4204.22','-2467.24','229.848','5.58004','4285:0 4436:0 4437:0 '),\n+('4436','gh658','571','394','4199','72','76','1','4355.92','-2485.04','242.225','3.56707','4435:0 4437:0 '),\n+('4437','gh659','571','394','4199','72','76','0','4320.51','-2585.42','246.459','1.97429','4436:0 4435:0 '),\n+('4438','gh660','571','394','4222','72','76','0','4055.91','-3147.98','278.056','5.70496','4430:0 4439:0 '),\n+('4439','gh661','571','394','4222','72','76','0','4250.54','-3177.85','307.936','0.898319','4438:0 4440:0 '),\n+('4440','gh662','571','394','4222','72','76','0','4326.86','-3320.66','310.551','0.546446','4439:0 4441:0 '),\n+('4441','gh663','571','394','4222','72','76','0','4447.75','-3199.73','313.463','2.16044','4440:0 4442:0 '),\n+('4442','gh664','571','394','4222','72','76','0','4418.84','-2984.71','309.349','1.76303','4441:0 4443:0 '),\n+('4443','gh665','571','394','4222','72','76','0','4226.67','-2862.19','281.474','3.5718','4442:0 4444:0 '),\n+('4444','gh666','571','394','4222','72','76','0','4035.13','-2946.41','276.096','3.8946','4443:0 4445:0 '),\n+('4445','gh667','571','394','4222','72','76','0','3928.19','-3008.94','275.401','3.52703','4444:0 4431:0 '),\n+('4446','gh668','571','394','394','72','76','0','3974.25','-2486.57','216.336','4.66038','4284:0 4447:0 '),\n+('4447','gh669','571','394','4202','72','76','0','3933.08','-2603.19','206.74','5.22586','4446:0 4448:0 '),\n+('4448','gh670','571','394','394','72','76','0','3783','-2602.59','191.183','4.81351','4447:0 4329:0 '),\n+('4449','zd671','571','66','66','73','77','0','5075.22','-4157.1','351.671','0.704319','4415:0 4576:0 4577:0 '),\n+('4450','zd672','571','66','66','73','77','0','4642.75','-3362.88','292.419','0.845695','4425:0 4516:0 '),\n+('4451','zd673','571','66','66','73','77','0','4845.51','-1504.94','248.946','5.30284','4195:0 4452:0 '),\n+('4452','zd674','571','66','66','73','77','0','4915.37','-1688.61','248.309','4.74834','4451:0 4453:0 '),\n+('4453','zd675','571','66','66','73','77','0','4913.71','-1902.76','248.309','4.71615','4452:0 4454:0 4456:0 '),\n+('4454','zd676','571','66','66','73','77','0','4907.24','-2149.46','248.308','4.51509','4453:0 4455:0 4456:0 '),\n+('4455','zd677','571','66','4316','73','77','0','4935.58','-2282.22','243.077','5.02638','4454:0 4492:0 '),\n+('4456','zd678','571','66','66','73','77','0','4948.85','-2047.71','248.309','0.0634512','4454:0 4453:0 4457:0 '),\n+('4457','zd679','571','66','66','73','77','0','5154.72','-2050.3','248.297','1.1198','4456:0 4458:0 4488:0 4489:0 '),\n+('4458','zd680','571','66','66','73','77','0','5198.14','-1908','243.765','1.97824','4457:0 4459:0 '),\n+('4459','zd681','571','66','4311','73','77','0','5168.01','-1763.65','243.57','1.69157','4458:0 4460:0 '),\n+('4460','zd682','571','66','4311','73','77','0','5227.64','-1629.23','235.86','1.70729','4459:0 4461:0 '),\n+('4461','zd683','571','66','66','73','77','0','5202.17','-1444.6','235.3','1.67195','4460:0 4462:0 4463:0 '),\n+('4462','zd684','571','66','4312','73','77','1','5228.85','-1333.15','242.312','5.2078','4461:0 4463:0 '),\n+('4463','zd685','571','66','66','73','77','0','5369.86','-1421.32','236.955','3.0236','4462:0 4461:0 4464:0 '),\n+('4464','zd686','571','66','66','73','77','0','5446.59','-1338.52','239.221','4.34385','4463:0 4465:0 4466:0 4486:0 '),\n+('4465','zd687','571','66','66','73','77','0','5443.61','-1214.88','247.443','1.55882','4464:0 4607:0 '),\n+('4466','zd688','571','66','4313','73','77','0','5555.66','-1397.11','239.86','2.99374','4464:0 4467:0 '),\n+('4467','zd689','571','66','4313','73','77','0','5695.79','-1400.51','234.446','5.54941','4466:0 4468:0 4481:0 '),\n+('4468','zd690','571','66','4313','73','77','0','5775.25','-1545.64','229.906','6.10312','4467:0 4469:0 4481:0 '),\n+('4469','zd691','571','66','4469','73','77','0','5886.45','-1638.86','237.734','5.61617','4468:0 4470:0 4482:0 '),\n+('4470','zd692','571','66','4469','73','77','0','5972.87','-1716.32','231.167','5.38055','4469:0 4471:0 '),\n+('4471','zd693','571','66','4469','73','77','0','6050.18','-1854.06','239.866','4.90932','4470:0 4472:0 '),\n+('4472','zd694','571','66','4315','73','77','0','6083.8','-1956.71','235.309','5.74812','4471:0 4473:0 4475:0 '),\n+('4473','zd695','571','66','4315','73','77','0','6239.25','-1977.17','235.732','4.86297','4472:0 4474:0 '),\n+('4474','zd696','571','66','4315','73','77','0','6209.7','-2182.71','236.212','3.31259','4473:0 4475:0 '),\n+('4475','zd697','571','66','4315','73','77','0','6062.56','-2208.12','234.275','1.69703','4474:0 4472:0 4476:0 '),\n+('4476','zd698','571','66','4315','73','77','0','5846.96','-2232.9','236.499','3.12253','4475:0 4477:0 '),\n+('4477','zd699','571','66','4468','73','77','0','5680.87','-2213.84','239.83','3.10525','4476:0 4478:0 4483:0 '),\n+('4478','zd700','571','66','4468','73','77','0','5565.53','-2198.52','235.496','1.86432','4477:0 4479:0 '),\n+('4479','zd701','571','66','4468','73','77','0','5571.97','-1996.67','237.88','1.26977','4478:0 4480:0 4483:0 4484:0 '),\n+('4480','zd702','571','66','4468','73','77','0','5653.64','-1810.94','236.435','1.32868','4479:0 4481:0 4482:0 '),\n+('4481','zd703','571','66','4313','73','77','0','5609.8','-1610.43','237.022','0.732563','4480:0 4468:0 4467:0 '),\n+('4482','zd704','571','66','4468','73','77','0','5833.14','-1759.05','233.346','1.1936','4480:0 4469:0 4483:0 '),\n+('4483','zd705','571','66','4468','73','77','0','5766.32','-1991.79','235.993','4.71376','4482:0 4477:0 4479:0 '),\n+('4484','zd706','571','66','66','73','77','0','5444.04','-1955.64','248.222','4.72161','4479:0 4485:0 4487:0 4488:0 '),\n+('4485','zd707','571','66','66','73','77','0','5446.88','-1747.93','248.337','1.71275','4484:0 4486:0 '),\n+('4486','zd708','571','66','66','73','77','0','5445.34','-1527.93','248.26','1.56823','4485:0 4464:0 '),\n+('4487','zd709','571','66','66','73','77','0','5449.03','-2186.49','248.309','4.69804','4484:0 4493:0 '),\n+('4488','zd710','571','66','66','73','77','0','5286.44','-2043.61','246.138','3.10918','4484:0 4457:0 '),\n+('4489','zd711','571','66','4317','73','77','1','5168.98','-2192.3','236.538','5.78582','4457:0 4490:0 '),\n+('4490','zd712','571','66','66','73','77','0','5057.15','-2200.22','244.382','3.79877','4489:0 4491:0 '),\n+('4491','zd713','571','66','66','73','77','0','5039.31','-2353.08','242.172','3.30084','4490:0 4492:0 '),\n+('4492','zd714','571','66','4316','73','77','0','4870.93','-2382.92','234.006','2.40312','4491:0 4455:0 '),\n+('4493','zd715','571','66','4275','73','77','0','5451.23','-2302.91','297.236','1.61772','4487:0 4494:0 4495:0 4522:0 '),\n+('4494','zd716','571','66','4275','73','77','0','5448.61','-2517.18','292.419','4.61951','4493:0 4495:0 4511:0 4522:0 '),\n+('4495','zd717','571','66','4275','73','77','0','5555.82','-2440.17','290.942','2.83587','4494:0 4493:0 4496:0 4522:0 '),\n+('4496','zd718','571','66','4318','73','77','0','5688.46','-2430.58','287.55','3.11862','4495:0 4497:0 '),\n+('4497','zd719','571','66','4294','73','77','0','5806.54','-2342.64','290.484','5.7662','4496:0 4498:0 '),\n+('4498','zd720','571','66','4294','73','77','0','5929.41','-2434.64','292.384','5.92563','4497:0 4499:0 '),\n+('4499','zd721','571','66','4294','73','77','0','6095.28','-2375.23','290.191','0.345376','4498:0 4500:0 '),\n+('4500','zd722','571','66','4276','73','77','0','6180.98','-2386.29','307.72','4.9046','4499:0 4501:0 '),\n+('4501','zd723','571','66','4276','73','77','0','6189.69','-2520.06','304.709','4.73102','4500:0 4502:0 4507:0 '),\n+('4502','zd724','571','66','4276','73','77','0','6265.08','-2506.2','302.978','4.68313','4501:0 4503:0 '),\n+('4503','zd725','571','66','4276','73','77','0','6245.94','-2735.34','302.749','3.45398','4502:0 4504:0 4505:0 '),\n+('4504','zd726','571','66','4276','73','77','0','6057.61','-2737.89','302.8','1.51562','4503:0 4506:0 '),\n+('4505','zd727','571','66','66','73','77','0','6297.01','-2862.98','293.934','2.17613','4503:0 '),\n+('4506','zd728','571','66','66','73','77','0','6048.63','-2898.7','296.891','3.34009','4504:0 '),\n+('4507','zd729','571','66','4276','73','77','0','6198.47','-2622.9','293.162','1.74809','4501:0 4508:0 '),\n+('4508','zd730','571','66','4276','73','77','0','6057.09','-2616.09','302.748','3.26077','4507:0 4509:0 '),\n+('4509','zd731','571','66','66','73','77','0','5884.73','-2617.57','292.418','3.15396','4508:0 4510:0 '),\n+('4510','zd732','571','66','66','73','77','0','5672.49','-2619.11','292.418','3.13825','4509:0 4511:0 4523:0 '),\n+('4511','zd733','571','66','4275','73','77','1','5457.16','-2620.72','306.551','1.83449','4510:0 4494:0 4512:0 '),\n+('4512','zd734','571','66','66','73','77','0','5332.55','-2708.7','292.419','3.89224','4511:0 4513:0 4520:0 '),\n+('4513','zd735','571','66','66','73','77','0','5189.96','-2843.82','292.419','5.47639','4512:0 4514:0 4517:0 4519:0 4520:0 '),\n+('4514','zd736','571','66','66','73','77','0','5035.14','-2975.52','292.29','3.86318','4513:0 4515:0 4519:0 4529:0 '),\n+('4515','zd737','571','66','66','73','77','0','4891.99','-3121.16','292.419','3.92601','4514:0 4516:0 4532:0 '),\n+('4516','zd738','571','66','66','73','77','0','4770.68','-3237.29','292.419','3.91659','4515:0 4450:0 4533:0 '),\n+('4517','zd739','571','66','66','73','77','0','5358.22','-3018.37','292.42','5.50546','4513:0 4518:0 4529:0 '),\n+('4518','zd740','571','66','66','73','77','0','5504.36','-3161.64','327.623','5.5251','4517:0 4528:0 4537:0 '),\n+('4519','zd741','571','66','4278','73','77','0','4997.42','-2791.64','287.647','5.40334','4514:0 4513:0 4520:0 '),\n+('4520','zd742','571','66','4278','73','77','0','5158.28','-2673.27','288.27','0.638333','4519:0 4512:0 4513:0 4521:0 '),\n+('4521','zd743','571','66','66','73','77','0','5256.37','-2555.92','288.451','1.56824','4520:0 4522:0 '),\n+('4522','zd744','571','66','4275','73','77','0','5338.16','-2432.94','289.035','0.00530624','4521:0 4494:0 4493:0 4495:0 '),\n+('4523','zd745','571','66','4280','73','77','0','5779.01','-2690.72','276.583','2.21778','4510:0 4524:0 '),\n+('4524','zd746','571','66','4320','73','77','0','5721.5','-2843.26','274.479','3.99436','4523:0 4525:0 4527:0 '),\n+('4525','zd747','571','66','4320','73','77','1','5795.09','-3017.85','286.307','5.12926','4524:0 4526:0 '),\n+('4526','zd748','571','66','4320','73','77','0','5829.57','-3089.62','343.078','5.24393','4525:0 4542:0 '),\n+('4527','zd749','571','66','4280','73','77','0','5611.83','-2947.53','274.379','3.44223','4524:0 4528:0 '),\n+('4528','zd750','571','66','4280','73','77','0','5467.65','-3021.98','288.17','4.29281','4527:0 4518:0 '),\n+('4529','zd751','571','66','4279','73','77','0','5183.53','-3158.14','271.373','0.983891','4517:0 4514:0 4530:0 '),\n+('4530','zd752','571','66','4279','73','77','0','5277.96','-3280.48','281.073','4.24508','4529:0 4531:0 '),\n+('4531','zd753','571','66','4279','73','77','0','5170.84','-3397.25','289.096','2.18261','4530:0 4532:0 4534:0 '),\n+('4532','zd754','571','66','4279','73','77','0','5037.17','-3252.81','278.555','2.42609','4531:0 4515:0 '),\n+('4533','zd755','571','66','4299','73','77','0','4868.35','-3381.36','292.891','5.68473','4516:0 4534:0 '),\n+('4534','zd756','571','66','4299','73','77','0','5062.51','-3481.16','289.586','4.38568','4533:0 4531:0 4535:0 '),\n+('4535','zd757','571','66','4299','73','77','0','5037.37','-3645.39','298.622','4.61344','4534:0 4536:0 '),\n+('4536','zd758','571','66','4299','73','77','0','5087.62','-3673.69','368.159','1.40275','4535:0 '),\n+('4537','zd759','571','66','66','73','77','0','5653.1','-3291.77','372.841','5.39966','4518:0 4538:0 4542:0 4573:0 '),\n+('4538','zd760','571','66','4323','73','77','0','5760.12','-3480.35','382.038','4.42027','4537:0 4539:0 4542:0 4573:0 '),\n+('4539','zd761','571','66','4323','73','77','1','5763.21','-3592.34','386.495','5.18723','4538:0 4540:0 '),\n+('4540','zd762','571','66','66','73','77','0','5805.54','-3730.07','371.987','2.07548','4539:0 4541:0 4558:0 4568:0 '),\n+('4541','zd763','571','66','66','73','77','0','5926.35','-3596.12','371.987','2.21685','4540:0 4542:0 4559:0 '),\n+('4542','zd764','571','66','66','73','77','0','5852.16','-3456.19','373.499','0.462273','4537:0 4541:0 4538:0 4543:0 4526:0 '),\n+('4543','zd765','571','66','4327','73','77','0','6015.43','-3354.83','351.334','0.898171','4542:0 4544:0 4546:0 '),\n+('4544','zd766','571','66','4327','73','77','0','6064.66','-3220.41','351.084','5.24378','4543:0 4545:0 '),\n+('4545','zd767','571','66','4327','73','77','0','6170.15','-3269.78','354.099','4.83851','4544:0 4546:0 4550:0 '),\n+('4546','zd768','571','66','4327','73','77','0','6123.58','-3376.38','350.427','3.6502','4545:0 4543:0 4547:0 '),\n+('4547','zd769','571','66','4328','73','77','0','6121.57','-3498.34','384.702','6.11321','4546:0 4549:0 4548:0 '),\n+('4548','zd770','571','66','4328','73','77','0','6262.56','-3570.42','383.729','4.01857','4547:0 4549:0 4556:0 '),\n+('4549','zd771','571','66','4328','73','77','0','6183.8','-3653.66','384.553','1.57362','4547:0 4548:0 4559:0 '),\n+('4550','zd772','571','66','4321','73','77','0','6322.87','-3285.06','388.539','6.26715','4545:0 4551:0 4555:0 4556:0 '),\n+('4551','zd773','571','66','4321','73','77','0','6411.23','-3132.08','389.357','0.676679','4550:0 4552:0 '),\n+('4552','zd774','571','66','4321','73','77','0','6573.73','-3100.58','392.875','3.25828','4551:0 4553:0 '),\n+('4553','zd775','571','66','4321','73','77','0','6591.66','-3194.21','412.812','2.18937','4552:0 4554:0 '),\n+('4554','zd776','571','66','4321','73','77','0','6440.64','-3192.66','402.475','4.61546','4553:0 4555:0 '),\n+('4555','zd777','571','66','4321','73','77','0','6464.24','-3278.19','402.912','0.40965','4554:0 4550:0 '),\n+('4556','zd778','571','66','4321','73','77','0','6447.03','-3450.35','388.772','5.0215','4550:0 4557:0 4548:0 '),\n+('4557','zd779','571','66','66','73','77','0','6351.61','-3625.18','379.474','1.56496','4556:0 '),\n+('4558','zd780','571','66','4326','73','77','0','5890.65','-3784.26','361.962','2.65353','4540:0 4559:0 4560:0 '),\n+('4559','zd781','571','66','66','73','77','0','6002.17','-3684.49','371.988','2.91507','4558:0 4541:0 4549:0 4581:0 '),\n+('4560','zd782','571','66','66','73','77','0','5871.01','-3998.48','364.264','5.0278','4558:0 4561:0 '),\n+('4561','zd783','571','66','4371','73','77','0','5936.71','-4166.52','353.36','6.12894','4560:0 4562:0 4564:0 4565:0 '),\n+('4562','zd784','571','66','4371','73','77','0','6121.47','-4241.02','320.493','2.98578','4561:0 4563:0 '),\n+('4563','zd785','571','66','4371','73','77','0','6077.47','-4432.62','362.867','1.61132','4562:0 4564:0 '),\n+('4564','zd786','571','66','4371','73','77','0','5913.09','-4334','361.983','1.57991','4561:0 4563:0 '),\n+('4565','zd787','571','66','4325','73','77','0','5789.33','-4263.74','371.348','4.26205','4561:0 4566:0 '),\n+('4566','zd788','571','66','4325','73','77','0','5716.79','-4325.83','373.993','4.5605','4565:0 4567:0 4580:0 '),\n+('4567','zd789','571','66','4325','73','77','0','5716.89','-4120.29','353.305','1.62547','4566:0 4568:0 4580:0 '),\n+('4568','zd790','571','66','66','73','77','0','5706.28','-3833.4','371.987','0.940598','4567:0 4540:0 4569:0 '),\n+('4569','zd791','571','66','66','73','77','0','5537.84','-3840.96','372.119','2.47998','4568:0 4570:0 4571:0 '),\n+('4570','zd792','571','66','4322','73','77','0','5351.53','-3648.35','361.961','2.27578','4569:0 4571:0 4572:0 4574:0 '),\n+('4571','zd793','571','66','4322','73','77','0','5343.06','-3764.54','373.087','0.190553','4569:0 4570:0 '),\n+('4572','zd794','571','66','66','73','77','0','5524.4','-3572.01','365.432','0.730907','4570:0 4573:0 '),\n+('4573','zd795','571','66','4324','73','77','0','5626.9','-3422.21','363.833','0.990089','4572:0 4537:0 4538:0 '),\n+('4574','zd796','571','66','4322','73','77','0','5153.32','-3723.32','360.396','4.07514','4570:0 4575:0 '),\n+('4575','zd797','571','66','4322','73','77','0','5076.21','-3849.59','356.664','4.99406','4574:0 4576:0 '),\n+('4576','zd798','571','66','66','73','77','0','5136.04','-4040.57','355.425','5.10401','4575:0 4449:0 4577:0 '),\n+('4577','zd799','571','66','66','73','77','0','5278.78','-4177.66','363.104','2.86954','4576:0 4449:0 4578:0 '),\n+('4578','zd800','571','66','66','73','77','0','5437.96','-4288.78','363.086','5.803','4577:0 4579:0 4580:0 '),\n+('4579','zd801','571','66','66','73','77','0','5440.87','-4452.18','379.545','5.85562','4578:0 '),\n+('4580','zd802','571','66','4325','73','77','0','5627.9','-4207.17','364.009','5.93258','4578:0 4567:0 4566:0 '),\n+('4581','zd803','571','66','66','73','77','0','6164.11','-3834.22','436.687','5.57209','4559:0 4582:0 '),\n+('4582','zd804','571','66','66','73','77','0','6297.28','-3979.47','456.92','5.47784','4581:0 4583:0 '),\n+('4583','zd805','571','66','66','73','77','0','6443.44','-4126.1','462.301','5.40087','4582:0 4584:0 4594:0 '),\n+('4584','zd806','571','66','4329','73','77','0','6406.23','-4295.64','457.247','4.84558','4583:0 4585:0 4593:0 '),\n+('4585','zd807','571','66','66','73','77','0','6273.9','-4442.23','450.834','3.83242','4584:0 4586:0 4589:0 '),\n+('4586','zd808','571','66','4329','73','77','0','6178.17','-4399.01','456.879','1.41967','4585:0 4587:0 '),\n+('4587','zd809','571','66','4329','73','77','0','6227.62','-4232.4','436.632','4.94847','4586:0 4588:0 '),\n+('4588','zd810','571','66','4329','73','77','0','6214.01','-4138.28','447.456','5.0066','4587:0 '),\n+('4589','zd811','571','66','4373','73','77','0','6412.14','-4626.89','453.335','2.16502','4585:0 4590:0 '),\n+('4590','zd812','571','66','4375','73','77','0','6602.74','-4663.95','450.613','0.474835','4589:0 4591:0 4605:0 '),\n+('4591','zd813','571','66','4375','73','77','0','6698.48','-4568.11','450.518','2.11632','4590:0 4592:0 '),\n+('4592','zd814','571','66','4375','73','77','0','6638.09','-4503.12','485.547','2.39985','4591:0 4593:0 '),\n+('4593','zd815','571','66','4373','73','77','0','6532.06','-4368.66','450.654','5.95377','4592:0 4584:0 4594:0 '),\n+('4594','zd816','571','66','66','73','77','0','6586.21','-4259.92','452.582','2.52315','4593:0 4583:0 4595:0 '),\n+('4595','zd817','571','66','66','73','77','0','6681.53','-4181.26','455.784','5.78336','4594:0 4596:0 4603:0 '),\n+('4596','zd818','571','66','66','73','77','0','6821.02','-4227.92','452.785','0.387671','4595:0 4597:0 4603:0 '),\n+('4597','zd819','571','66','4579','73','77','1','6899.77','-4113.21','467.355','4.92777','4596:0 4598:0 '),\n+('4598','zd820','571','66','66','73','77','0','7055.14','-4222.88','450.363','3.95496','4597:0 4599:0 '),\n+('4599','zd821','571','66','66','73','77','0','7139.88','-4413.45','457.062','4.921','4598:0 4600:0 '),\n+('4600','zd822','571','66','4375','73','77','0','7003.8','-4522.32','450.519','3.23161','4599:0 4601:0 '),\n+('4601','zd823','571','66','4375','73','77','0','6879.7','-4603.96','452.922','4.36494','4600:0 4602:0 4604:0 '),\n+('4602','zd824','571','66','4375','73','77','0','6779.05','-4455.52','441.057','2.48784','4601:0 4603:0 '),\n+('4603','zd825','571','66','4375','73','77','0','6738.67','-4314.66','450.026','0.835357','4602:0 4596:0 4595:0 '),\n+('4604','zd826','571','66','4375','73','77','0','6817.32','-4743.11','450.661','4.44034','4601:0 4605:0 '),\n+('4605','zd827','571','66','66','73','77','0','6680.31','-4847.44','452.584','2.08415','4604:0 4590:0 4606:0 '),\n+('4606','zd828','571','66','4375','73','77','0','6841.86','-4987.38','451.036','5.56582','4605:0 '),\n+('4607','cs829','571','2817','4557','74','78','0','5438.42','-1075.94','181.63','1.64666','4465:0 4608:0 4611:0 4613:0 '),\n+('4608','cs830','571','2817','4554','74','78','0','5414.79','-913.179','165.857','1.65453','4607:0 4609:0 '),\n+('4609','cs831','571','2817','4557','74','78','0','5529.65','-840.32','161.565','0.178767','4608:0 4610:0 4612:0 4624:0 '),\n+('4610','cs832','571','2817','4557','74','78','0','5646.92','-907.293','186.362','5.31056','4609:0 4611:0 '),\n+('4611','cs833','571','2817','4557','74','78','0','5531.5','-987.127','191.383','0.576966','4607:0 4610:0 '),\n+('4612','cs834','571','2817','4558','74','78','5','5605.93','-749.995','199.49','1.05213','4609:0 '),\n+('4613','cs835','571','2817','4554','74','78','0','5331.06','-914.795','170.103','1.60977','4607:0 4614:0 '),\n+('4614','cs836','571','2817','4554','74','78','0','5307.84','-750.937','162.904','2.08886','4613:0 4615:0 '),\n+('4615','cs837','571','2817','4557','74','78','0','5179.88','-711.115','164.986','1.15816','4614:0 4616:0 4618:0 '),\n+('4616','cs838','571','2817','2817','74','78','2','5082.9','-704.384','186.517','6.16508','4615:0 4617:0 '),\n+('4617','cs839','571','2817','4559','74','78','3','5062.59','-611.621','218.683','5.43466','4616:0 '),\n+('4618','cs840','571','2817','4557','74','78','0','5185.33','-555.375','158.496','1.08748','4615:0 4619:0 '),\n+('4619','cs841','571','2817','4557','74','78','0','5212.12','-335.385','163.451','1.20529','4618:0 4620:0 '),\n+('4620','cs842','571','2817','4557','74','78','0','5329.19','-218.838','166.128','0.232181','4619:0 4621:0 4629:0 '),\n+('4621','cs843','571','2817','4557','74','78','0','5520.69','-188.647','157.616','0.0751006','4620:0 4622:0 4629:0 '),\n+('4622','cs844','571','2817','4557','74','78','0','5672.16','-264.918','167.932','5.74096','4621:0 4623:0 4625:0 4720:0 '),\n+('4623','cs845','571','2817','4557','74','78','0','5583.23','-439.368','154.644','4.20158','4622:0 4624:0 '),\n+('4624','cs846','571','2817','4554','74','78','0','5498.08','-612.708','152.463','4.75686','4623:0 4609:0 '),\n+('4625','cs847','571','2817','4553','74','78','0','5679.51','-108.805','178.045','1.46212','4622:0 4626:0 4855:0 '),\n+('4626','cs848','571','2817','4553','74','78','0','5720.75','54.3693','171.054','1.38122','4625:0 4627:0 4628:0 4643:0 '),\n+('4627','cs849','571','2817','4553','74','78','0','5765.22','181.998','182.874','0.613098','4626:0 '),\n+('4628','cs850','571','2817','4553','74','78','0','5544.73','121.881','150.263','4.18823','4626:0 4629:0 '),\n+('4629','cs851','571','2817','4553','74','78','0','5414.2','-47.7746','149.795','3.91334','4628:0 4621:0 4620:0 4630:0 '),\n+('4630','cs852','571','2817','2817','74','78','0','5354.31','126.368','161.642','2.27029','4629:0 4631:0 4632:0 '),\n+('4631','cs853','571','2817','2817','74','78','0','5257.75','154.168','191.769','2.73995','4630:0 4147:0 '),\n+('4632','cs854','571','2817','2817','74','78','0','5423.58','292.611','156.85','1.48646','4630:0 4633:0 '),\n+('4633','cs855','571','2817','2817','74','78','0','5436.65','406.464','167.948','1.52965','4632:0 4634:0 4642:0 '),\n+('4634','cs856','571','2817','4555','74','78','0','5332.71','578.052','182.7','1.3333','4633:0 4635:0 '),\n+('4635','cs857','571','2817','4555','74','78','0','5471.03','710.798','171.741','0.739547','4634:0 4636:0 '),\n+('4636','cs858','571','2817','2817','74','78','0','5519.14','908.014','167.988','1.35608','4635:0 4637:0 4638:0 '),\n+('4637','cs859','571','2817','4556','74','78','1','5706.15','1006.05','174.48','3.67458','4636:0 '),\n+('4638','cs860','571','2817','2817','74','78','0','5682.36','825.06','156.036','5.32233','4636:0 4639:0 '),\n+('4639','cs861','571','2817','2817','74','78','0','5849.61','885.831','160.066','0.393957','4638:0 4640:0 '),\n+('4640','cs862','571','2817','4553','74','78','0','5854.17','706.025','164.715','4.73956','4639:0 4641:0 '),\n+('4641','cs863','571','2817','4553','74','78','0','5740.73','555.099','158.091','4.03271','4640:0 4642:0 '),\n+('4642','cs864','571','2817','4553','74','78','0','5615.21','410.65','156.222','3.51042','4641:0 4633:0 4643:0 '),\n+('4643','cs865','571','2817','4553','74','78','0','5676.64','245.015','166.802','4.93592','4642:0 4626:0 '),\n+('4644','sb866','571','3711','4483','74','78','0','4671.5','5526.35','34.4275','0.54946','3903:0 4645:0 '),\n+('4645','sb867','571','3711','3711','74','78','0','4892.01','5531.93','-71.5606','0.0389507','4644:0 4646:0 4674:0 '),\n+('4646','sb868','571','3711','4289','74','78','0','4952.39','5739.79','-75.5644','1.2249','4645:0 4647:0 '),\n+('4647','sb869','571','3711','4289','74','78','0','5130.17','5883.3','-75.7286','0.492126','4646:0 4648:0 '),\n+('4648','sb870','571','3711','4289','74','78','0','5325.13','5886.98','-68.7967','0.00281286','4647:0 4649:0 4675:0 '),\n+('4649','sb871','571','3711','4285','74','78','0','5507.19','5934.35','-51.6289','6.11243','4648:0 4650:0 '),\n+('4650','sb872','571','3711','3711','74','78','0','5713','5871.42','-60.4173','5.97499','4649:0 4651:0 4714:0 '),\n+('4651','sb873','571','3711','4289','74','78','0','5882.95','5730.44','-63.8448','5.56737','4650:0 4652:0 '),\n+('4652','sb874','571','3711','4289','74','78','0','6018.42','5571.93','-74.0181','5.18095','4651:0 4653:0 4703:0 '),\n+('4653','sb875','571','3711','4385','74','78','0','6082.5','5353.27','-92.7974','4.70422','4652:0 4654:0 4702:0 '),\n+('4654','sb876','571','3711','3711','74','78','0','6268.69','5300.48','-100.197','0.380579','4653:0 4655:0 '),\n+('4655','sb877','571','3711','3711','74','78','0','6450.25','5197.28','-64.1861','5.49824','4654:0 4656:0 '),\n+('4656','sb878','571','3711','4376','74','78','0','6507.21','4992.87','-60.1724','4.97202','4655:0 4657:0 4696:0 '),\n+('4657','sb879','571','3711','3711','74','78','0','6524.26','4794.34','-58.974','4.36726','4656:0 4658:0 '),\n+('4658','sb880','571','3711','4368','74','78','0','6443.53','4602.81','-66.2857','4.55104','4657:0 4659:0 4695:0 4697:0 '),\n+('4659','sb881','571','3711','4368','74','78','0','6405.01','4366.1','-47.8041','3.90309','4658:0 4660:0 4694:0 4695:0 '),\n+('4660','sb882','571','3711','3711','74','78','0','6226.59','4265.96','-45.1729','3.55594','4659:0 4661:0 4694:0 '),\n+('4661','sb883','571','3711','4283','74','78','0','6111.71','4134.4','-48.7024','4.20861','4660:0 4662:0 '),\n+('4662','sb884','571','3711','4283','74','78','0','6038.48','4009.63','-42.6825','4.13556','4661:0 4663:0 '),\n+('4663','sb885','571','3711','4283','74','78','0','5938.28','3889.47','-35.5353','3.47426','4662:0 4664:0 4692:0 '),\n+('4664','sb886','571','3711','4283','74','78','0','5785.88','3776.91','-41.0442','3.94','4663:0 4665:0 4692:0 4693:0 '),\n+('4665','sb887','571','3711','3711','74','78','0','5624.29','3606.52','-21.7442','3.13811','4664:0 4666:0 4693:0 '),\n+('4666','sb888','571','3711','4283','74','78','0','5488.8','3794.13','-58.7714','2.25061','4665:0 4667:0 '),\n+('4667','sb889','571','3711','4387','74','78','0','5337.73','3917.13','-70.8363','2.57655','4666:0 4668:0 4688:0 4689:0 '),\n+('4668','sb890','571','3711','3711','74','78','0','5220.59','4104.15','-78.9241','2.09588','4667:0 4669:0 4687:0 '),\n+('4669','sb891','571','3711','3711','74','78','0','5146.69','4294.33','-99.9765','1.80057','4668:0 4670:0 4686:0 '),\n+('4670','sb892','571','3711','3711','74','78','1','5110.31','4494.04','-98.6996','1.66941','4669:0 4671:0 '),\n+('4671','sb893','571','3711','3711','74','78','0','5098.19','4704.21','-133.607','2.04248','4670:0 4672:0 4681:0 '),\n+('4672','sb894','571','3711','3711','74','78','0','4975.85','4879.83','-101.866','1.73853','4671:0 4673:0 4682:0 '),\n+('4673','sb895','571','3711','3711','74','78','0','4881.56','5059.86','-91.1009','1.00104','4672:0 4674:0 '),\n+('4674','sb896','571','3711','3711','74','78','0','4917.13','5259.43','-92.7846','1.6058','4673:0 4645:0 4718:0 '),\n+('4675','sb897','571','3711','3711','74','78','0','5325.03','5694.77','-87.1296','4.35079','4648:0 4676:0 '),\n+('4676','sb898','571','3711','4288','74','78','0','5283.58','5529.21','-98.5324','4.62568','4675:0 4677:0 '),\n+('4677','sb899','571','3711','3711','74','78','0','5296.26','5368.21','-119.485','5.45035','4676:0 4678:0 4715:0 '),\n+('4678','sb900','571','3711','4293','74','78','0','5334.1','5156.57','-135.744','4.8503','4677:0 4679:0 '),\n+('4679','sb901','571','3711','4293','74','78','0','5316.24','4983.73','-135.985','4.21805','4678:0 4680:0 4719:0 '),\n+('4680','sb902','571','3711','4293','74','78','0','5263.3','4836.68','-132.956','4.22984','4679:0 4681:0 '),\n+('4681','sb903','571','3711','4293','74','78','0','5171.92','4761.28','-134.094','3.64315','4680:0 4671:0 '),\n+('4682','sb904','571','3711','3711','74','78','0','4906.61','4752.07','-80.9517','3.99658','4672:0 4683:0 '),\n+('4683','sb905','571','3711','4388','74','78','0','4784.59','4651.45','-67.3646','4.27774','4682:0 4684:0 '),\n+('4684','sb906','571','3711','4388','74','78','0','4776.89','4461.82','-65.79','0.115909','4683:0 4685:0 '),\n+('4685','sb907','571','3711','3711','74','78','0','4858.79','4312.13','-51.668','4.56127','4684:0 4686:0 '),\n+('4686','sb908','571','3711','4304','74','78','0','5008.15','4265.85','-85.0377','2.88757','4685:0 4669:0 '),\n+('4687','sb909','571','3711','4303','74','78','0','5141.4','4002.05','-61.6423','4.65002','4668:0 4688:0 '),\n+('4688','sb910','571','3711','3711','74','78','0','5236.32','3820.55','-29.2583','0.629582','4687:0 4667:0 '),\n+('4689','sb911','571','3711','4283','74','78','0','5426.13','4100.88','-86.7674','1.1935','4667:0 4690:0 '),\n+('4690','sb912','571','3711','4283','74','78','0','5555.95','4256','-102.563','0.234915','4689:0 4691:0 4710:0 '),\n+('4691','sb913','571','3711','4283','74','78','0','5713.23','4134.64','-89.7735','5.05333','4690:0 4692:0 '),\n+('4692','sb914','571','3711','4283','74','78','0','5757.78','3962.65','-74.4666','5.33842','4691:0 4663:0 4664:0 '),\n+('4693','sb915','571','3711','4297','74','78','0','5782.35','3632.67','-13.2643','3.22964','4664:0 4665:0 '),\n+('4694','sb916','571','3711','3711','74','78','0','6360.37','4223.67','-44.0521','1.79237','4659:0 4660:0 '),\n+('4695','sb917','571','3711','4368','74','78','0','6543.56','4456.6','-47.1567','2.3712','4659:0 4658:0 '),\n+('4696','sb918','571','3711','4376','74','78','0','6354.19','4873.76','-84.2341','5.19234','4656:0 4697:0 '),\n+('4697','sb919','571','3711','3711','74','78','0','6357.09','4685.34','-78.5111','5.19313','4696:0 4658:0 4698:0 '),\n+('4698','sb920','571','3711','3711','74','78','0','6208.52','4590.1','-92.1573','3.70988','4697:0 4699:0 '),\n+('4699','sb921','571','3711','3711','74','78','0','6025.9','4686.81','-95.5438','1.9176','4698:0 4700:0 '),\n+('4700','sb922','571','3711','3711','74','78','0','5994.9','4894.76','-99.8287','1.31128','4699:0 4701:0 '),\n+('4701','sb923','571','3711','4385','74','78','0','5981.34','5089.26','-100.986','1.44401','4700:0 4702:0 '),\n+('4702','sb924','571','3711','4391','74','78','0','5939.08','5277.6','-99.1834','0.521168','4701:0 4653:0 4703:0 4704:0 '),\n+('4703','sb925','571','3711','4391','74','78','0','5903.46','5420.52','-94.3184','1.13064','4702:0 4652:0 '),\n+('4704','sb926','571','3711','4293','74','78','0','5830.14','5100.16','-132.628','3.78921','4702:0 4705:0 '),\n+('4705','sb927','571','3711','4293','74','78','0','5680.53','5002.31','-134.988','3.89916','4704:0 4706:0 '),\n+('4706','sb928','571','3711','4293','74','78','0','5699.45','4825.48','-137.014','5.40319','4705:0 4707:0 '),\n+('4707','sb929','571','3711','4293','74','78','0','5769.89','4694.83','-130.521','4.6445','4706:0 4708:0 '),\n+('4708','sb930','571','3711','4293','74','78','0','5768.78','4519.94','-133.978','4.9029','4707:0 4709:0 '),\n+('4709','sb931','571','3711','4293','74','78','0','5638.21','4442.49','-138.205','3.53632','4708:0 4710:0 4711:0 '),\n+('4710','sb932','571','3711','4293','74','78','0','5520.96','4384.34','-134.132','5.02072','4709:0 4690:0 '),\n+('4711','sb933','571','3711','4293','74','78','1','5647.9','4579.12','-137.584','3.59247','4709:0 4712:0 '),\n+('4712','sb934','571','3711','4293','74','78','0','5559.82','4670.56','-135.523','1.45736','4711:0 4713:0 '),\n+('4713','sb935','571','3711','4383','74','78','5','5497.21','4748.71','-193.716','5.27047','4712:0 '),\n+('4714','sb936','571','3711','4284','74','78','1','5575.69','5751.97','-74.7038','0.766207','4650:0 4717:0 '),\n+('4715','sb937','571','3711','4285','74','78','0','5456.52','5353.98','-134.279','6.15248','4677:0 4716:0 '),\n+('4716','sb938','571','3711','3711','74','78','0','5648.23','5302.27','-121.201','1.53199','4715:0 4717:0 '),\n+('4717','sb939','571','3711','3711','74','78','0','5580.86','5590.13','-92.6294','1.61445','4716:0 4714:0 '),\n+('4718','sb940','571','3711','3711','74','78','0','5041.36','5069.92','-110.999','5.98282','4674:0 4719:0 '),\n+('4719','sb941','571','3711','4293','74','78','0','5202.57','5018.06','-134.206','5.92392','4718:0 4679:0 '),\n+('4720','sp942','571','67','67','76','80','0','5752.46','-354.53','205.676','5.2249','4622:0 4721:0 '),\n+('4721','sp943','571','67','4419','76','80','0','5903.83','-485.757','296.6','6.0849','4720:0 4722:0 '),\n+('4722','sp944','571','67','4419','76','80','0','6079.55','-564.659','370.689','5.9286','4721:0 4723:0 4735:0 4736:0 '),\n+('4723','sp945','571','67','4419','76','80','0','6182.6','-758.333','400.203','4.95','4722:0 4724:0 4734:0 '),\n+('4724','sp946','571','67','4419','76','80','0','6143.85','-967.832','398.945','4.41828','4723:0 4725:0 4726:0 '),\n+('4725','sp947','571','67','4418','76','80','1','6122.51','-1083.62','402.604','1.60263','4724:0 '),\n+('4726','sp948','571','67','4419','76','80','0','6273.81','-1034.37','412.299','5.98122','4724:0 4727:0 4737:0 '),\n+('4727','sp949','571','67','4462','76','80','0','6444.88','-1034.29','429.644','6.27654','4726:0 4728:0 '),\n+('4728','sp950','571','67','4462','76','80','0','6611.36','-1016.67','427.636','0.199126','4727:0 4729:0 4730:0 '),\n+('4729','sp951','571','67','4462','76','80','0','6639.97','-1111.4','427.1','3.18364','4728:0 '),\n+('4730','sp952','571','67','4462','76','80','0','6673.93','-1219.13','398.841','5.0403','4728:0 4731:0 4732:0 '),\n+('4731','sp953','571','67','4462','76','80','0','6592.21','-1275.82','392.991','5.05994','4730:0 '),\n+('4732','sp954','571','67','4462','76','80','0','6697.35','-1426.2','388.747','4.94449','4730:0 4733:0 '),\n+('4733','sp955','571','67','4462','76','80','0','6795.01','-1512.06','359.911','5.79979','4732:0 '),\n+('4734','sp956','571','67','4419','76','80','0','6324.13','-838.805','407.569','0.335772','4723:0 '),\n+('4735','sp957','571','67','4419','76','80','0','6232.08','-626.646','414.707','2.81842','4722:0 '),\n+('4736','sp958','571','67','4419','76','80','0','6146.68','-346.08','436.33','4.09626','4722:0 '),\n+('4737','sp959','571','67','4419','76','80','0','6257','-1198.57','428.281','5.0293','4726:0 4738:0 4739:0 '),\n+('4738','sp960','571','67','4460','76','80','0','6297.61','-1350.75','426.332','4.79525','4737:0 4745:0 '),\n+('4739','sp961','571','67','4460','76','80','0','6393.21','-1222.32','429.226','4.92092','4737:0 4740:0 '),\n+('4740','sp962','571','67','4419','76','80','0','6471.87','-1383.27','479.473','4.04521','4739:0 4741:0 '),\n+('4741','sp963','571','67','4421','76','80','0','6345.12','-1517.97','434.126','3.78838','4740:0 4742:0 '),\n+('4742','sp964','571','67','4421','76','80','0','6349.58','-1586.52','428.04','5.62228','4741:0 4743:0 4745:0 '),\n+('4743','sp965','571','67','4421','76','80','0','6455.08','-1685.64','435.366','5.95606','4742:0 4744:0 '),\n+('4744','sp966','571','67','4421','76','80','0','6462.41','-1739.78','484.912','2.47281','4743:0 '),\n+('4745','sp967','571','67','4421','76','80','0','6232.83','-1499.78','419.118','0.960144','4742:0 4738:0 '),\n+('4746','sp968','571','67','4484','76','80','1','8455.31','-325.265','906.979','2.46809','4747:0 '),\n+('4747','sp969','571','67','4484','76','80','0','8485.73','-279.992','850.711','1.97722','4746:0 4748:0 '),\n+('4748','sp970','571','67','4436','76','80','0','8483.73','-136.842','797.392','1.57038','4747:0 4749:0 4752:0 '),\n+('4749','sp971','571','67','4436','76','80','0','8481.05','57.8398','786.425','1.56174','4748:0 4750:0 '),\n+('4750','sp972','571','67','4436','76','80','0','8468.58','226.668','788.805','1.98979','4749:0 4751:0 '),\n+('4751','sp973','571','67','4436','76','80','0','8317.77','105.355','824.229','4.03339','4750:0 4752:0 '),\n+('4752','sp974','571','67','4436','76','80','0','8313.08','-91.3043','827.379','4.66407','4751:0 4748:0 4753:0 4765:0 '),\n+('4753','sp975','571','67','4435','76','80','0','8202.06','-202.29','871.634','4.01769','4752:0 4754:0 4756:0 '),\n+('4754','sp976','571','67','4435','76','80','0','8237.33','-247.278','952.88','3.24408','4753:0 4755:0 '),\n+('4755','sp977','571','67','4435','76','80','0','8092.31','-403.116','964.773','0.843118','4754:0 '),\n+('4756','sp978','571','67','4435','76','80','0','8040.6','-222.79','846.911','3.84806','4753:0 4757:0 '),\n+('4757','sp979','571','67','4435','76','80','0','7945.56','-368.7','884.037','5.26884','4756:0 4758:0 4759:0 4761:0 '),\n+('4758','sp980','571','67','4435','76','80','0','7953.58','-524.527','913.45','5.63719','4757:0 4783:0 '),\n+('4759','sp981','571','67','4435','76','80','0','8056.94','-415.927','981.568','4.73712','4757:0 4760:0 '),\n+('4760','sp982','571','67','4435','76','80','0','8116.43','-385.365','981.611','0.510895','4759:0 '),\n+('4761','sp983','571','67','4436','76','80','0','7847.85','-252.132','885.258','1.43374','4757:0 4762:0 4770:0 '),\n+('4762','sp984','571','67','4436','76','80','0','7851.3','-120.4','880.754','2.3126','4761:0 4763:0 '),\n+('4763','sp985','571','67','4486','76','80','0','7796.32','-44.5017','882.083','4.37664','4762:0 4764:0 '),\n+('4764','sp986','571','67','4486','76','80','0','7737.47','-4.97132','866.565','4.27297','4763:0 '),\n+('4765','sp987','571','67','4434','76','80','0','8078.57','-32.5271','869.499','2.49247','4752:0 4766:0 '),\n+('4766','sp988','571','67','4434','76','80','0','8168.23','99.4058','898.859','1.3183','4765:0 4767:0 '),\n+('4767','sp989','571','67','4434','76','80','0','7974.07','-6.90656','961.657','1.27039','4766:0 4768:0 '),\n+('4768','sp990','571','67','4434','76','80','0','7950.02','93.3063','1028.03','0.358544','4767:0 4769:0 '),\n+('4769','sp991','571','67','4434','76','80','0','7756.08','70.5513','1009.34','2.07228','4768:0 '),\n+('4770','sp992','571','67','4436','76','80','0','7731.17','-155.37','873.081','2.5828','4761:0 4771:0 '),\n+('4771','sp993','571','67','67','76','80','0','7531.71','-82.1077','837.076','3.3682','4770:0 4772:0 '),\n+('4772','sp994','571','67','4424','76','80','0','7365.61','-62.5754','778.928','3.05011','4771:0 4773:0 4777:0 '),\n+('4773','sp995','571','67','4424','76','80','0','7426.39','97.7694','770.976','6.19485','4772:0 4774:0 '),\n+('4774','sp996','571','67','4499','76','80','0','7491.52','288.222','774.525','2.91503','4773:0 4775:0 '),\n+('4775','sp997','571','67','4424','76','80','0','7352.12','248.002','774.191','5.46442','4774:0 4776:0 '),\n+('4776','sp998','571','67','4424','76','80','0','7358.47','144.777','783.476','4.25726','4775:0 4777:0 '),\n+('4777','sp999','571','67','4424','76','80','0','7260.89','6.23937','773.777','4.18657','4776:0 4772:0 4778:0 '),\n+('4778','sp1000','571','67','4424','76','80','0','7178.24','-109.916','772.616','4.20384','4777:0 4779:0 4782:0 '),\n+('4779','sp1001','571','67','4452','76','80','0','7066.53','-147.905','785.381','3.57396','4778:0 4780:0 '),\n+('4780','sp1002','571','67','4453','76','80','0','6959.39','-173.873','763.88','2.97313','4779:0 4781:0 '),\n+('4781','sp1003','571','67','4453','76','80','0','6782.97','-67.7557','738.941','2.11233','4780:0 '),\n+('4782','sp1004','571','67','4452','76','80','0','7090.4','-308.701','774.099','4.51251','4778:0 '),\n+('4783','sp1005','571','67','67','76','80','0','8123.18','-622.333','945.418','5.51782','4758:0 4784:0 '),\n+('4784','sp1006','571','67','4446','76','80','0','8249.28','-737.261','923.975','5.57986','4783:0 4785:0 '),\n+('4785','sp1007','571','67','4446','76','80','0','8264.89','-900.437','923.875','2.77599','4784:0 4786:0 4788:0 '),\n+('4786','sp1008','571','67','4485','76','80','0','8140.52','-817.38','956.118','4.95861','4785:0 4787:0 '),\n+('4787','sp1009','571','67','4485','76','80','0','8148.76','-940.656','956.955','0.816413','4786:0 '),\n+('4788','sp1010','571','67','4446','76','80','0','8178.94','-1015.84','926.187','5.46676','4785:0 4789:0 '),\n+('4789','sp1011','571','67','4446','76','80','0','8330.55','-1186.57','924.477','5.49032','4788:0 '),\n+('4790','sp1012','571','67','4441','76','80','4','7798.27','-2842.24','1219.51','2.4704','4791:0 4792:0 '),\n+('4791','sp1013','571','67','4441','76','80','5','7804.98','-2945.31','1256.79','1.43524','4790:0 '),\n+('4792','sp1014','571','67','4441','76','80','0','7866.14','-2800.43','1136.14','2.6746','4790:0 4793:0 4808:0 '),\n+('4793','sp1015','571','67','4444','76','80','0','7974.26','-2941.67','1137.82','0.286989','4792:0 4794:0 '),\n+('4794','sp1016','571','67','4444','76','80','0','8053.32','-2899.02','1136.35','5.48632','4793:0 4795:0 4799:0 '),\n+('4795','sp1017','571','67','67','76','80','0','8303.1','-2938.59','1067.71','2.65574','4794:0 4796:0 '),\n+('4796','sp1018','571','67','4488','76','80','0','8126.19','-2813.7','1044.76','1.21375','4795:0 4797:0 4798:0 '),\n+('4797','sp1019','571','67','4488','76','80','0','8235.54','-2730.69','1035.47','6.08244','4796:0 4798:0 '),\n+('4798','sp1020','571','67','4488','76','80','0','8268.8','-2840.55','1051.57','2.98168','4797:0 4796:0 '),\n+('4799','sp1021','571','67','4444','76','80','0','8178.4','-2765.96','1137.8','1.58369','4794:0 4800:0 '),\n+('4800','sp1022','571','67','4444','76','80','0','8192.81','-2569.46','1145.92','1.28524','4799:0 4801:0 4807:0 '),\n+('4801','sp1023','571','67','4446','76','80','0','8213.34','-2399.15','1136.06','1.39441','4800:0 4802:0 '),\n+('4802','sp1024','571','67','4446','76','80','0','8146.87','-2304.3','1157.9','3.14664','4801:0 4803:0 4804:0 '),\n+('4803','sp1025','571','67','4446','76','80','0','8041.79','-2401.8','1157.91','1.83659','4802:0 4804:0 4805:0 '),\n+('4804','sp1026','571','67','4446','76','80','0','7981.22','-2241.64','1157.87','2.17589','4803:0 4802:0 '),\n+('4805','sp1027','571','67','4446','76','80','0','7920.25','-2449.09','1137.97','1.81145','4803:0 4806:0 4809:0 '),\n+('4806','sp1028','571','67','4444','76','80','0','7924.11','-2571.76','1159.29','2.58976','4805:0 4807:0 '),\n+('4807','sp1029','571','67','4444','76','80','0','8046.59','-2635.79','1135.01','6.18452','4806:0 4800:0 4808:0 '),\n+('4808','sp1030','571','67','4463','76','80','0','7915.54','-2719.76','1135.12','3.80869','4807:0 4792:0 '),\n+('4809','sp1031','571','67','4446','76','80','0','7902.91','-2332.91','1153.05','3.63118','4805:0 4810:0 '),\n+('4810','sp1032','571','67','4442','76','80','0','7759.44','-2386.38','1077.61','2.84264','4809:0 4811:0 '),\n+('4811','sp1033','571','67','4442','76','80','0','7670.97','-2282.57','1010.94','2.45387','4810:0 4812:0 '),\n+('4812','sp1034','571','67','4442','76','80','0','7541.71','-2363.06','867.728','2.12164','4811:0 4813:0 '),\n+('4813','sp1035','571','67','4442','76','80','0','7465.67','-2485.65','760.441','0.00970542','4812:0 4814:0 4827:0 '),\n+('4814','sp1036','571','67','4438','76','80','0','7327.84','-2537.89','748.903','4.00974','4813:0 4815:0 4827:0 '),\n+('4815','sp1037','571','67','4438','76','80','0','7348.8','-2768.24','766.138','4.91922','4814:0 4816:0 '),\n+('4816','sp1038','571','67','4438','76','80','0','7348.82','-2958.97','838.738','4.70872','4815:0 4817:0 4826:0 '),\n+('4817','sp1039','571','67','4439','76','80','0','7229.61','-3136.68','837.486','4.08826','4816:0 4818:0 4826:0 '),\n+('4818','sp1040','571','67','4495','76','80','0','7202.51','-3334.74','843.826','4.6883','4817:0 4819:0 '),\n+('4819','sp1041','571','67','4439','76','80','0','7368.35','-3244.03','851.789','5.98892','4818:0 4820:0 '),\n+('4820','sp1042','571','67','4439','76','80','0','7555.15','-3237.78','842.017','0.160478','4819:0 4821:0 '),\n+('4821','sp1043','571','67','4440','76','80','0','7723.64','-3278.88','863.372','5.73209','4820:0 4822:0 '),\n+('4822','sp1044','571','67','4440','76','80','0','7843.39','-3412.02','865.974','6.25831','4821:0 4823:0 '),\n+('4823','sp1045','571','67','4440','76','80','0','8007.01','-3282.63','865.574','2.51589','4822:0 4824:0 '),\n+('4824','sp1046','571','67','4440','76','80','0','7854.16','-3160.4','864.749','3.02718','4823:0 4825:0 '),\n+('4825','sp1047','571','67','4440','76','80','0','7635.61','-3117.6','867.091','3.3971','4824:0 4826:0 '),\n+('4826','sp1048','571','67','4439','76','80','0','7437.01','-3083.87','837.452','2.68239','4825:0 4816:0 4817:0 '),\n+('4827','sp1049','571','67','4437','76','80','0','7293.97','-2399.5','753.5','6.25517','4814:0 4813:0 4828:0 '),\n+('4828','sp1050','571','67','4437','76','80','0','7210.78','-2258.23','756.519','2.1766','4827:0 4829:0 '),\n+('4829','sp1051','571','67','4437','76','80','0','7094.38','-2114.84','759.283','2.32896','4828:0 4830:0 '),\n+('4830','sp1052','571','67','4437','76','80','0','7071.57','-1957.32','769.29','1.71086','4829:0 4831:0 '),\n+('4831','sp1053','571','67','4422','76','80','0','7047.94','-1819.05','822.822','1.51843','4830:0 4832:0 '),\n+('4832','sp1054','571','67','4422','76','80','0','7016.16','-1682.12','819.647','1.56948','4831:0 4833:0 4834:0 4841:0 '),\n+('4833','sp1055','571','67','4422','76','80','0','6952.92','-1523.53','837.796','1.58755','4832:0 4834:0 4835:0 '),\n+('4834','sp1056','571','67','4422','76','80','0','6876.88','-1688.13','820.475','5.87424','4833:0 4832:0 '),\n+('4835','sp1057','571','67','4425','76','80','0','6933.96','-1355.59','831.143','1.62444','4833:0 4836:0 '),\n+('4836','sp1058','571','67','4425','76','80','0','6927.88','-1275.08','819.873','1.80979','4835:0 4837:0 '),\n+('4837','sp1059','571','67','4423','76','80','0','6891.54','-1120.83','801.801','2.04934','4836:0 4838:0 4840:0 '),\n+('4838','sp1060','571','67','4423','76','80','0','6874.8','-994.702','800.05','1.94645','4837:0 4839:0 '),\n+('4839','sp1061','571','67','4423','76','80','0','6713.98','-1032.73','766.307','5.25848','4838:0 4840:0 '),\n+('4840','sp1062','571','67','4423','76','80','0','6823.44','-1136.74','794.362','1.42024','4839:0 4837:0 '),\n+('4841','sp1063','571','67','4422','76','80','0','7059.17','-1565.01','830.127','1.02674','4832:0 4842:0 '),\n+('4842','sp1064','571','67','4432','76','80','1','7107.06','-1444.92','924.841','0.0175042','4841:0 4843:0 4854:0 '),\n+('4843','sp1065','571','67','4432','76','80','0','7224.43','-1369.92','917.332','1.04952','4842:0 4844:0 '),\n+('4844','sp1066','571','67','4432','76','80','0','7304.81','-1229.95','912.257','1.04952','4843:0 4845:0 '),\n+('4845','sp1067','571','67','4473','76','80','0','7277.74','-1094.09','938.898','4.08901','4844:0 4846:0 4847:0 '),\n+('4846','sp1068','571','67','4473','76','80','0','7159.16','-1203.13','929.255','3.39314','4845:0 '),\n+('4847','sp1069','571','67','4432','76','80','0','7276.68','-952.788','919.235','1.31654','4845:0 4848:0 '),\n+('4848','sp1070','571','67','4432','76','80','0','7442.11','-871.692','910.159','0.46203','4847:0 4849:0 '),\n+('4849','sp1071','571','67','4432','76','80','0','7617.15','-899.183','911.902','5.67158','4848:0 4850:0 '),\n+('4850','sp1072','571','67','4432','76','80','0','7731.32','-1040.44','920.428','5.0087','4849:0 4851:0 '),\n+('4851','sp1073','571','67','4432','76','80','0','7620.47','-1211.71','928.587','4.24765','4850:0 4852:0 '),\n+('4852','sp1074','571','67','4432','76','80','0','7523.4','-1365.25','935.317','3.55807','4851:0 4853:0 '),\n+('4853','sp1075','571','67','4432','76','80','0','7392.6','-1463.43','928.011','4.00967','4852:0 4854:0 '),\n+('4854','sp1076','571','67','4536','76','80','0','7307.54','-1573.81','942.399','2.34934','4853:0 4842:0 '),\n+('4855','cs1077','571','2817','2817','76','80','0','5850.58','-134.972','227.342','6.13811','4625:0 4856:0 '),\n+('4856','ic1078','571','210','4501','77','80','0','5971.83','-162.754','303.817','0.106256','4855:0 4857:0 '),\n+('4857','ic1079','571','210','4501','77','80','1','6141.12','-52.066','381.591','0.738502','4856:0 4858:0 '),\n+('4858','ic1080','571','210','4501','77','80','0','6194.51','34.1853','380.232','0.656035','4857:0 4859:0 4861:0 '),\n+('4859','ic1081','571','210','4504','77','80','0','6172.36','156.629','374.276','0.907363','4858:0 4860:0 '),\n+('4860','ic1082','571','210','4504','77','80','0','6379.33','179.484','392.956','0.48639','4859:0 4861:0 4862:0 '),\n+('4861','ic1083','571','210','4501','77','80','0','6302.14','95.8391','390.823','3.94214','4860:0 4858:0 '),\n+('4862','ic1084','571','210','4505','77','80','0','6510.94','285.541','400.181','0.224064','4860:0 4863:0 '),\n+('4863','ic1085','571','210','4505','77','80','0','6561.12','378.976','420.028','1.01575','4862:0 4864:0 4865:0 '),\n+('4864','ic1086','571','210','4506','77','80','0','6586.56','556.561','402.946','1.2011','4863:0 4865:0 4866:0 '),\n+('4865','ic1087','571','210','4506','77','80','0','6708.22','403.424','412.114','3.63504','4864:0 4863:0 4870:0 '),\n+('4866','ic1088','571','210','4506','77','80','0','6723.06','690.867','407.835','0.367783','4864:0 4867:0 4897:0 '),\n+('4867','ic1089','571','210','4506','77','80','0','6907.33','730.085','420.328','0.313591','4866:0 4868:0 4892:0 '),\n+('4868','ic1090','571','210','4506','77','80','0','6968.03','622.605','462.269','4.11884','4867:0 4869:0 4871:0 '),\n+('4869','ic1091','571','210','4506','77','80','0','6892.8','465.906','471.697','4.29869','4868:0 '),\n+('4870','ic1092','571','210','4506','77','80','0','6802.58','551.703','425.103','0.960751','4865:0 '),\n+('4871','ic1093','571','210','4506','77','80','0','7175.08','588.447','498.301','5.6747','4868:0 4872:0 4873:0 '),\n+('4872','ic1094','571','210','4506','77','80','0','7078.72','503.754','527.049','0.380329','4871:0 '),\n+('4873','ic1095','571','210','4593','77','80','0','7262.77','707.458','487.068','0.969396','4871:0 4874:0 '),\n+('4874','ic1096','571','210','210','77','80','0','7380.79','847.639','456.611','1.04794','4873:0 4875:0 '),\n+('4875','ic1097','571','210','4533','77','80','0','7556.82','768.81','478.284','6.18915','4874:0 4876:0 4877:0 '),\n+('4876','ic1098','571','210','4533','77','80','0','7584.83','947.602','480.255','1.08485','4875:0 4877:0 '),\n+('4877','ic1099','571','210','4533','77','80','0','7712.14','808.936','478.443','2.68156','4876:0 4875:0 4878:0 '),\n+('4878','ic1100','571','210','4533','77','80','0','7860.07','894.491','452.788','0.0928901','4877:0 4879:0 4888:0 4891:0 '),\n+('4879','ic1101','571','210','4533','77','80','0','8034.56','793.581','473.244','0.0151296','4878:0 4880:0 '),\n+('4880','ic1102','571','210','4658','77','80','0','8220.62','796.211','504.283','0.00650024','4879:0 4881:0 '),\n+('4881','ic1103','571','210','4658','77','80','0','8374.24','796.938','547.919','6.10983','4880:0 4882:0 4887:0 '),\n+('4882','ic1104','571','210','4669','77','80','0','8423.03','930.654','544.674','1.16574','4881:0 4883:0 '),\n+('4883','ic1105','571','210','4658','77','80','1','8522.2','1039.69','548.104','0.757338','4882:0 4884:0 '),\n+('4884','ic1106','571','210','4658','77','80','0','8609.95','905.31','545.094','5.03776','4883:0 4885:0 '),\n+('4885','ic1107','571','210','4658','77','80','3','8585.78','716.794','547.469','4.14555','4884:0 4886:0 '),\n+('4886','ic1108','571','210','4658','77','80','0','8489.61','581.224','559.708','4.17226','4885:0 4887:0 '),\n+('4887','ic1109','571','210','4658','77','80','5','8440.59','706.692','547.293','2.35563','4886:0 4881:0 '),\n+('4888','ic1110','571','210','4533','77','80','0','7765.83','995.585','447.266','2.83001','4878:0 4889:0 '),\n+('4889','ic1111','571','210','4533','77','80','0','7711.5','1167.13','440.596','0.808391','4888:0 4890:0 '),\n+('4890','ic1112','571','210','4533','77','80','0','7859.21','1231.56','441.972','0.590053','4889:0 4891:0 4921:0 '),\n+('4891','ic1113','571','210','4533','77','80','0','7895.54','1042.03','450.717','4.64349','4890:0 4878:0 '),\n+('4892','ic1114','571','210','4508','77','80','0','6955.49','874.331','402.675','1.29769','4867:0 4893:0 '),\n+('4893','ic1115','571','210','4508','77','80','0','7020.59','1065.06','402.857','1.32832','4892:0 4894:0 '),\n+('4894','ic1116','571','210','4508','77','80','0','6957.22','1339.68','398.602','1.97863','4893:0 4895:0 '),\n+('4895','ic1117','571','210','4508','77','80','0','6833.49','1460.28','390.712','1.81761','4894:0 4896:0 '),\n+('4896','ic1118','571','210','210','77','80','0','6826.51','1619.37','389.033','4.69297','4895:0 '),\n+('4897','ic1119','571','210','4507','77','80','0','6666.86','830.852','365.983','2.48285','4866:0 4898:0 '),\n+('4898','ic1120','571','210','4507','77','80','0','6599.05','917.605','308.63','2.05873','4897:0 4899:0 '),\n+('4899','ic1121','571','210','4507','77','80','0','6597.42','1025.81','280.105','1.11625','4898:0 4900:0 4904:0 '),\n+('4900','ic1122','571','210','4507','77','80','0','6559.27','1194.84','276.689','2.19853','4899:0 4901:0 '),\n+('4901','ic1123','571','210','4507','77','80','0','6688.4','1234.6','276.432','6.14281','4900:0 4902:0 '),\n+('4902','ic1124','571','210','4507','77','80','0','6863.13','1227.79','282.996','5.66451','4901:0 4903:0 4905:0 '),\n+('4903','ic1125','571','210','4507','77','80','0','6896.72','1042.62','305.673','4.53274','4902:0 4904:0 4905:0 '),\n+('4904','ic1126','571','210','4507','77','80','0','6726.14','1037','288.797','3.31459','4903:0 4899:0 '),\n+('4905','ic1127','571','210','4508','77','80','0','7001.55','1212.52','307.249','0.331647','4903:0 4902:0 4906:0 4907:0 '),\n+('4906','ic1128','571','210','4537','77','80','0','7135.37','1189.66','298.703','5.1862','4905:0 4915:0 '),\n+('4907','ic1129','571','210','4508','77','80','0','7048.99','1354.24','304.707','4.93802','4905:0 4908:0 '),\n+('4908','ic1130','571','210','4537','77','80','0','7186.05','1411.54','315.97','0.428269','4907:0 4909:0 5003:0 '),\n+('4909','ic1131','571','210','4537','77','80','0','7349.91','1448.05','320.323','0.242915','4908:0 4910:0 5003:0 '),\n+('4910','ic1132','571','210','4537','77','80','0','7474.88','1490.17','330.932','0.611267','4909:0 4911:0 '),\n+('4911','ic1133','571','210','4537','77','80','0','7573.73','1609.11','345.106','1.19325','4910:0 4912:0 4916:0 '),\n+('4912','ic1134','571','210','4537','77','80','0','7721.75','1522.15','349.093','5.66688','4911:0 4913:0 4920:0 '),\n+('4913','ic1135','571','210','4537','77','80','0','7720.3','1336.02','354.115','4.43774','4912:0 4914:0 4922:0 '),\n+('4914','ic1136','571','210','4537','77','80','0','7534.59','1265.76','334.056','2.73578','4913:0 4915:0 '),\n+('4915','ic1137','571','210','4537','77','80','0','7314','1220.63','315.76','3.35624','4914:0 4906:0 '),\n+('4916','ic1138','571','210','4509','77','80','0','7577.1','1786.78','359.583','1.47521','4911:0 4917:0 '),\n+('4917','ic1139','571','210','4509','77','80','0','7669.29','1945.97','367.174','1.15084','4916:0 4918:0 4927:0 '),\n+('4918','ic1140','571','210','4509','77','80','0','7873.9','1929.78','365.964','6.20016','4917:0 4919:0 4923:0 '),\n+('4919','ic1141','571','210','4509','77','80','0','7887.76','1725.17','368.82','4.09059','4918:0 4920:0 '),\n+('4920','ic1142','571','210','4509','77','80','0','7765','1638.88','350.579','4.75974','4919:0 4912:0 '),\n+('4921','ic1143','571','210','210','77','80','0','7920.44','1374.41','452.53','1.61423','4890:0 4922:0 '),\n+('4922','ic1144','571','210','4537','77','80','0','7822.59','1365.97','388.481','3.40023','4921:0 4913:0 '),\n+('4923','ic1145','571','210','4510','77','80','0','7809.24','2060.92','392.033','1.58203','4918:0 4924:0 '),\n+('4924','ic1146','571','210','4540','77','80','0','7858.11','2248.57','376.618','1.4603','4923:0 4925:0 '),\n+('4925','ic1147','571','210','4540','77','80','0','7823.2','2412.9','388.323','1.80744','4924:0 4926:0 '),\n+('4926','ic1148','571','210','4540','77','80','0','7793.72','2597.47','402.105','1.67392','4925:0 4938:0 '),\n+('4927','ic1149','571','210','4510','77','80','0','7699.75','2069.29','391.653','1.65822','4917:0 4928:0 '),\n+('4928','ic1150','571','210','4540','77','80','0','7652.21','2249.08','368.676','2.35408','4927:0 4929:0 '),\n+('4929','ic1151','571','210','4540','77','80','0','7521.07','2342.93','375.359','2.52294','4928:0 4930:0 '),\n+('4930','ic1152','571','210','4523','77','80','0','7369.4','2442.13','391.045','2.44441','4929:0 4931:0 4939:0 '),\n+('4931','ic1153','571','210','4523','77','80','0','7198.45','2497.03','404.398','2.97341','4930:0 4932:0 4939:0 '),\n+('4932','ic1154','571','210','4523','77','80','0','7035.47','2497.06','410.594','3.37789','4931:0 4933:0 '),\n+('4933','ic1155','571','210','4523','77','80','0','7014.72','2665.38','400.29','1.87621','4932:0 4934:0 '),\n+('4934','ic1156','571','210','4523','77','80','0','7013.48','2866.37','424.885','1.59347','4933:0 4935:0 '),\n+('4935','ic1157','571','210','4523','77','80','0','7165.04','2990.37','441.491','6.14878','4934:0 4936:0 '),\n+('4936','ic1158','571','210','4523','77','80','0','7332.14','2917.95','423.697','5.78906','4935:0 4937:0 4939:0 4940:0 '),\n+('4937','ic1159','571','210','4540','77','80','0','7502.18','2817.76','419.764','5.68225','4936:0 4938:0 4939:0 '),\n+('4938','ic1160','571','210','4516','77','80','0','7710.23','2726.49','412.219','5.21495','4937:0 4926:0 5009:0 '),\n+('4939','ic1161','571','210','4523','77','80','0','7307.93','2711.18','396.859','4.63376','4937:0 4930:0 4931:0 4936:0 '),\n+('4940','ic1162','571','210','210','77','80','0','7358.64','3080.68','476.932','1.77884','4936:0 4941:0 '),\n+('4941','ic1163','571','210','210','77','80','0','7199','3207.31','545.531','1.97125','4940:0 4942:0 '),\n+('4942','ic1164','571','210','210','77','80','0','7139.56','3362.03','669.633','2.10878','4941:0 4943:0 '),\n+('4943','ic1165','571','210','4531','77','80','0','6985.22','3466.47','708.57','2.8337','4942:0 4944:0 4974:0 '),\n+('4944','ic1166','571','210','4531','77','80','0','6890.27','3530.05','708.606','5.39253','4943:0 4945:0 '),\n+('4945','ic1167','571','210','4531','77','80','0','6830.55','3590.9','740.056','5.22131','4944:0 4946:0 '),\n+('4946','ic1168','571','210','4496','77','80','0','6868.76','3731.57','755.294','4.54431','4945:0 4947:0 '),\n+('4947','ic1169','571','210','4496','77','80','0','7002.18','3880.5','610.484','1.63677','4946:0 4948:0 4949:0 4951:0 '),\n+('4948','ic1170','571','210','4496','77','80','0','6831.56','3987.86','615.968','2.45046','4947:0 4949:0 '),\n+('4949','ic1171','571','210','4496','77','80','0','6897.56','3919.65','615.975','4.57026','4948:0 4947:0 4950:0 '),\n+('4950','ic1172','571','210','4528','77','80','0','6814.18','3788.63','621.07','1.05954','4949:0 '),\n+('4951','ic1173','571','210','4496','77','80','0','7138.52','3955.81','581.785','5.65333','4947:0 4952:0 5020:0 5022:0 '),\n+('4952','ic1174','571','210','4498','77','80','0','7284.9','3836.51','604.369','5.59993','4951:0 4953:0 '),\n+('4953','ic1175','571','210','4498','77','80','0','7410.57','3732.09','627.678','5.65962','4952:0 4954:0 '),\n+('4954','ic1176','571','210','4526','77','80','0','7512.15','3660.34','623.332','6.01697','4953:0 4955:0 4973:0 '),\n+('4955','ic1177','571','210','4526','77','80','0','7593.36','3544.42','655.937','5.07214','4954:0 4956:0 '),\n+('4956','ic1178','571','210','4526','77','80','0','7671','3432.93','656.192','2.35151','4955:0 4957:0 '),\n+('4957','ic1179','571','210','4526','77','80','0','7795.77','3500.91','658.351','0.992774','4956:0 4958:0 4959:0 4971:0 '),\n+('4958','ic1180','571','210','4526','77','80','0','7883.18','3469.31','671.838','6.04917','4957:0 '),\n+('4959','ic1181','571','210','4526','77','80','0','7919.33','3582.64','631.477','0.58594','4957:0 4960:0 '),\n+('4960','ic1182','571','210','4524','77','80','0','8041.43','3526.53','654.716','6.08922','4959:0 4961:0 4968:0 '),\n+('4961','ic1183','571','210','4524','77','80','0','8187.82','3610.43','658.019','0.290628','4960:0 4962:0 '),\n+('4962','ic1184','571','210','4524','77','80','0','8317.43','3535.48','657.912','4.87265','4961:0 4963:0 '),\n+('4963','ic1185','571','210','4524','77','80','0','8248.7','3338.48','654.291','5.09882','4962:0 4964:0 4968:0 '),\n+('4964','ic1186','571','210','4496','77','80','0','8311.26','3170.17','618.951','5.16165','4963:0 4965:0 '),\n+('4965','ic1187','571','210','4497','77','80','0','8430.96','3102.38','588.141','4.91819','4964:0 4966:0 '),\n+('4966','ic1188','571','210','4492','77','80','0','8426.9','2947.18','602.293','4.77996','4965:0 4967:0 '),\n+('4967','ic1189','571','210','4492','77','80','0','8429.04','2879.47','606.259','1.76717','4966:0 '),\n+('4968','ic1190','571','210','4524','77','80','0','8105.02','3418.73','672.247','3.83984','4960:0 4963:0 4969:0 '),\n+('4969','ic1191','571','210','4525','77','80','0','7990.63','3300.15','676.112','3.81628','4968:0 4970:0 '),\n+('4970','ic1192','571','210','4525','77','80','0','7944.78','3251.88','632.818','3.79665','4969:0 '),\n+('4971','ic1193','571','210','4526','77','80','0','7848.54','3632.5','653.393','4.16107','4957:0 4972:0 '),\n+('4972','ic1194','571','210','4526','77','80','0','7717.96','3673.53','653.297','3.444','4971:0 4973:0 '),\n+('4973','ic1195','571','210','4526','77','80','0','7617.43','3670.12','634.89','3.02774','4972:0 4954:0 '),\n+('4974','ic1196','571','210','4531','77','80','0','6853.09','3478.09','692.779','3.04894','4943:0 4975:0 4976:0 4977:0 '),\n+('4975','ic1197','571','210','4531','77','80','0','6714.63','3539.45','668.964','2.71907','4974:0 4977:0 '),\n+('4976','ic1198','571','210','4531','77','80','0','6719.14','3429.9','682.197','3.43144','4974:0 4977:0 5024:0 '),\n+('4977','ic1199','571','210','4531','77','80','0','6774.33','3483.53','672.159','3.05053','4974:0 4976:0 4975:0 4978:0 '),\n+('4978','ic1200','571','210','4531','77','80','0','6549.04','3449.66','598.005','3.34505','4977:0 4979:0 '),\n+('4979','ic1201','571','210','4531','77','80','0','6461.08','3286.15','631.506','5.01716','4978:0 4980:0 '),\n+('4980','ic1202','571','210','4531','77','80','0','6452.51','3119.45','657.481','1.45066','4979:0 4981:0 '),\n+('4981','ic1203','571','210','4518','77','80','0','6526.9','3000.14','651.117','4.87342','4980:0 4982:0 '),\n+('4982','ic1204','571','210','4518','77','80','0','6547.7','2810.28','651.117','4.72026','4981:0 4983:0 '),\n+('4983','ic1205','571','210','4518','77','80','0','6524.74','2581.76','651.117','4.51292','4982:0 4984:0 '),\n+('4984','ic1206','571','210','4518','77','80','0','6630.74','2328.4','651.585','5.06506','4983:0 4985:0 '),\n+('4985','ic1207','571','210','4518','77','80','0','6619.16','2134.02','651.118','4.86635','4984:0 4986:0 '),\n+('4986','ic1208','571','210','4520','77','80','0','6609.61','1940.41','652.242','3.77073','4985:0 4987:0 4990:0 '),\n+('4987','ic1209','571','210','4520','77','80','0','6436.2','1960.49','631.376','3.19739','4986:0 4988:0 '),\n+('4988','ic1210','571','210','4520','77','80','0','6238.67','1930.65','631.948','3.56731','4987:0 4989:0 '),\n+('4989','ic1211','571','210','4520','77','80','0','6075.08','1919.83','632.648','3.19032','4988:0 '),\n+('4990','ic1212','571','210','4520','77','80','0','6546.79','1812.75','629.551','4.65274','4986:0 4991:0 4992:0 '),\n+('4991','ic1213','571','210','4520','77','80','0','6556.05','1624.57','633.228','4.76113','4990:0 4992:0 '),\n+('4992','ic1214','571','210','4520','77','80','0','6590.03','1684.23','628.876','3.70395','4991:0 4990:0 4993:0 '),\n+('4993','ic1215','571','210','4513','77','80','0','6728.5','1651.46','572.96','1.13099','4992:0 4994:0 '),\n+('4994','ic1216','571','210','4513','77','80','0','6809.4','1726.92','556.264','3.80763','4993:0 4995:0 4996:0 '),\n+('4995','ic1217','571','210','4513','77','80','0','6812.51','1821.36','578.354','4.77131','4994:0 '),\n+('4996','ic1218','571','210','4513','77','80','0','6952.4','1697.92','518.536','2.9209','4994:0 4997:0 '),\n+('4997','ic1219','571','210','4513','77','80','0','7031.52','1779.42','506.019','1.12469','4996:0 4998:0 5000:0 '),\n+('4998','ic1220','571','210','4514','77','80','0','7025.43','1902.07','528.077','5.0187','4997:0 4999:0 '),\n+('4999','ic1221','571','210','4514','77','80','0','6960.52','2014.43','520.864','4.66919','4998:0 '),\n+('5000','ic1222','571','210','4513','77','80','0','7201.98','1696.05','469.261','2.30668','4997:0 5001:0 5004:0 5005:0 '),\n+('5001','ic1223','571','210','210','77','80','0','7348.32','1642.76','429.984','1.78832','5000:0 5002:0 '),\n+('5002','ic1224','571','210','210','77','80','0','7214.66','1585.03','379.979','5.44591','5001:0 5003:0 '),\n+('5003','ic1225','571','210','4537','77','80','0','7281.16','1492.2','326.379','1.64772','5002:0 4909:0 4908:0 5004:0 '),\n+('5004','ic1226','571','210','210','77','80','0','7331.27','1765.54','456.844','3.80914','5003:0 5000:0 '),\n+('5005','ic1227','571','210','4513','77','80','0','7136.03','1876.5','532.96','4.77911','5000:0 5006:0 '),\n+('5006','ic1228','571','210','4513','77','80','0','7224.2','1973.83','570.931','1.27072','5005:0 5007:0 5008:0 '),\n+('5007','ic1229','571','210','4513','77','80','1','7242.67','2168.33','565.646','4.69493','5006:0 '),\n+('5008','ic1230','571','210','4513','77','80','0','7100.09','2122.12','621.203','4.3801','5006:0 '),\n+('5009','ic1231','571','210','4540','77','80','0','7682.15','2851.03','469.055','2.77003','4938:0 5010:0 '),\n+('5010','ic1232','571','210','4517','77','80','0','7685.31','3002.19','541.332','0.921987','5009:0 5011:0 '),\n+('5011','ic1233','571','210','4517','77','80','0','7702.82','3078.43','557.351','5.63045','5010:0 5012:0 5019:0 '),\n+('5012','ic1234','571','210','4517','77','80','0','7843.82','2935.68','517.933','0.541764','5011:0 5013:0 '),\n+('5013','ic1235','571','210','4517','77','80','0','7934.47','2994.97','541.057','3.56948','5012:0 5014:0 '),\n+('5014','ic1236','571','210','4517','77','80','0','8021.28','2971.58','563.405','2.3317','5013:0 5015:0 '),\n+('5015','ic1237','571','210','4517','77','80','0','8106.95','2852.61','559.292','5.73169','5014:0 5016:0 5025:0 '),\n+('5016','ic1238','571','210','4477','77','80','0','8243','2776.54','640.775','6.08434','5015:0 5017:0 '),\n+('5017','ic1239','571','210','4477','77','80','0','8383.84','2730.79','655.094','5.79375','5016:0 5018:0 '),\n+('5018','ic1240','571','210','4477','77','80','1','8508.77','2673.5','652.354','5.83302','5017:0 '),\n+('5019','ic1241','571','210','4517','77','80','0','7575.23','3170.11','577.394','5.58719','5011:0 '),\n+('5020','ic1242','571','210','4496','77','80','0','6971.39','3981.75','552.612','5.94612','4951:0 5021:0 '),\n+('5021','ic1243','571','210','4496','77','80','0','6934.59','4194.33','535.202','1.79686','5020:0 '),\n+('5022','ic1244','571','210','4496','77','80','0','7162.84','4153.53','633.939','2.91213','4951:0 5023:0 '),\n+('5023','ic1245','571','210','4496','77','80','0','7019.95','4225.08','665.892','2.06625','5022:0 '),\n+('5024','ic1246','571','210','4531','77','80','0','6545.08','3321.6','665.004','4.0596','4976:0 '),\n+('5025','ic1247','571','210','210','77','80','0','8061.74','2755.35','542.008','4.48453','5015:0 5026:0 '),\n+('5026','ic1248','571','210','210','77','80','0','8077.07','2597.13','519.549','4.54375','5025:0 5027:0 '),\n+('5027','ic1249','571','210','4510','77','80','0','8103.98','2410.6','490.587','4.97494','5026:0 5028:0 '),\n+('5028','ic1250','571','210','4510','77','80','0','8060.18','2339.25','484.62','3.25413','5027:0 5029:0 '),\n+('5029','ic1251','571','210','4510','77','80','0','7982.84','2214.78','500.312','4.5092','5028:0 5030:0 5031:0 '),\n+('5030','ic1252','571','210','4510','77','80','0','8163.01','2189.09','499.737','3.33032','5029:0 '),\n+('5031','ic1253','571','210','4510','77','80','0','7986.6','2067','499.729','3.00752','5029:0 5032:0 5035:0 '),\n+('5032','ic1254','571','210','4510','77','80','0','8120.19','1962.29','501.671','5.88521','5031:0 5033:0 '),\n+('5033','ic1255','571','210','4510','77','80','0','8204.78','1874.81','514.771','1.36602','5032:0 5034:0 '),\n+('5034','ic1256','571','210','4510','77','80','0','8179.12','2049.72','550.596','2.65329','5033:0 '),\n+('5035','ic1257','571','210','4510','77','80','0','7751.59','2060.95','499.864','3.22507','5031:0 5036:0 '),\n+('5036','ic1258','571','210','4510','77','80','0','7549.16','2067.17','500.312','3.28947','5035:0 5037:0 5038:0 '),\n+('5037','ic1259','571','210','4510','77','80','0','7438.58','2146.13','500.312','2.65644','5036:0 '),\n+('5038','ic1260','571','210','4510','77','80','0','7492.17','1991.36','500.301','0.996881','5036:0 ');\ndiff --git a/data/sql/custom/db_world/2023_06_16_00_creature_template_npcbot_wander_nodes.sql b/data/sql/custom/db_world/2023_06_16_00_creature_template_npcbot_wander_nodes.sql\nnew file mode 100644\nindex 0000000000..10d6ae33bd\n--- /dev/null\n+++ b/data/sql/custom/db_world/2023_06_16_00_creature_template_npcbot_wander_nodes.sql\n@@ -0,0 +1,9 @@\n+--\n+UPDATE `creature_template_npcbot_wander_nodes` SET `flags`='4' WHERE (`id`='28'); -- Razor Hill: make Horde-only\n+-- Durotar canyon (Drygulch Ravine)\n+UPDATE `creature_template_npcbot_wander_nodes` SET `flags`='0' WHERE `id` IN ('66','1372','1373','1374','1375','1376','1377','1378','1380','1381','1382','1383','1384','1385','1401');\n+UPDATE `creature_template_npcbot_wander_nodes` SET `flags`='1' WHERE (`id`='419'); -- RefugePointeExitS: allow neutral spawns\n+UPDATE `creature_template_npcbot_wander_nodes` SET `flags`='1' WHERE (`id`='505'); -- LochS: allow neutral spawns\n+UPDATE `creature_template_npcbot_wander_nodes` SET `flags`='1' WHERE (`id`='1071'); -- AshenvaleC_hub11: allow neutral spawns\n+UPDATE `creature_template_npcbot_wander_nodes` SET `flags`='1' WHERE (`id`='1379'); -- DurotarCanyon1: allow neutral spawns\n+UPDATE `creature_template_npcbot_wander_nodes` SET `flags`='1' WHERE (`id`='1739'); -- DesolaceN34: allow neutral spawns\ndiff --git a/data/sql/custom/db_world/2023_06_18_01_creature_template_npcbot_disabled_items.sql b/data/sql/custom/db_world/2023_06_18_01_creature_template_npcbot_disabled_items.sql\nnew file mode 100644\nindex 0000000000..84347a56e6\n--- /dev/null\n+++ b/data/sql/custom/db_world/2023_06_18_01_creature_template_npcbot_disabled_items.sql\n@@ -0,0 +1,6 @@\n+--\n+DROP TABLE IF EXISTS `creature_template_npcbot_disabled_items`;\n+CREATE TABLE `creature_template_npcbot_disabled_items` (\n+  `id` int(10) unsigned NOT NULL DEFAULT '0',\n+  PRIMARY KEY (`id`)\n+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\ndiff --git a/data/sql/custom/db_world/2023_06_19_00_creature_template_npcbot_disabled_items.sql b/data/sql/custom/db_world/2023_06_19_00_creature_template_npcbot_disabled_items.sql\nnew file mode 100644\nindex 0000000000..5c4f4dcefe\n--- /dev/null\n+++ b/data/sql/custom/db_world/2023_06_19_00_creature_template_npcbot_disabled_items.sql\n@@ -0,0 +1,53 @@\n+--\n+INSERT IGNORE INTO `creature_template_npcbot_disabled_items` (`id`) VALUES\n+('77'),\n+('1046'),\n+('1047'),\n+('1170'),\n+('1174'),\n+('1354'),\n+('1719'),\n+('2811'),\n+('2812'),\n+('2814'),\n+('3068'),\n+('3271'),\n+('3333'),\n+('3436'),\n+('3883'),\n+('3885'),\n+('3886'),\n+('3887'),\n+('3888'),\n+('3933'),\n+('3935'),\n+('4193'),\n+('4616'),\n+('4657'),\n+('4664'),\n+('4667'),\n+('4670'),\n+('4673'),\n+('4902'),\n+('4934'),\n+('4950'),\n+('4955'),\n+('4956'),\n+('5040'),\n+('5294'),\n+('5295'),\n+('5296'),\n+('5297'),\n+('5298'),\n+('5607'),\n+('12755'),\n+('13242'),\n+('14363'),\n+('14597'),\n+('14609'),\n+('14691'),\n+('14696'),\n+('15888'),\n+('15889'),\n+('22391'),\n+('23553');\ndiff --git a/data/sql/custom/db_world/2023_06_19_01_creature_template.sql b/data/sql/custom/db_world/2023_06_19_01_creature_template.sql\nnew file mode 100644\nindex 0000000000..c174021efd\n--- /dev/null\n+++ b/data/sql/custom/db_world/2023_06_19_01_creature_template.sql\n@@ -0,0 +1,2 @@\n+--\n+UPDATE `creature_template` SET `speed_walk` = 1.0, `speed_run` = 1.0 WHERE `entry` > 70000 AND (`flags_extra`&0x8E000000) = 0x8E000000 AND `speed_run` > 1.0;\ndiff --git a/data/sql/custom/db_world/2023_06_24_00_creature_template_npcbot_wander_nodes.sql b/data/sql/custom/db_world/2023_06_24_00_creature_template_npcbot_wander_nodes.sql\nnew file mode 100644\nindex 0000000000..263d7e5ed7\n--- /dev/null\n+++ b/data/sql/custom/db_world/2023_06_24_00_creature_template_npcbot_wander_nodes.sql\n@@ -0,0 +1,55 @@\n+--\n+SET @WP_START = 5039;\n+SET @WP_END   = 5087;\n+\n+DELETE FROM `creature_template_npcbot_wander_nodes` WHERE `id` BETWEEN @WP_START AND @WP_END;\n+INSERT INTO `creature_template_npcbot_wander_nodes`(`id`,`name`,`mapid`,`zoneid`,`areaid`,`minlevel`,`maxlevel`,`flags`,`x`,`y`,`z`,`o`,`links`) VALUES\n+('5039', 'AlteracValleySpawnA', '30', '2597', '2597', '50', '80', '3', '801.027', '-493.883', '99.6917', '3.08066', '5040:0 '),\n+('5040', 'AlteracValleyStartA1', '30', '2597', '3299', '50', '80', '2', '717.929', '-475.351', '75.1276', '2.10478', '5041:0 5079:0 '),\n+('5041', 'AlteracValleyStartA2', '30', '2597', '3299', '50', '80', '34', '664.972', '-400.377', '68.7491', '2.43269', '5042:0 5077:0 '),\n+('5042', 'AlteracValleyStartA3', '30', '2597', '3299', '50', '80', '2', '610.827', '-388.879', '66.5562', '3.30843', '5043:0 '),\n+('5043', 'AlteracValleyStartA4', '30', '2597', '2597', '50', '80', '2', '463.128', '-438.201', '33.0107', '2.75865', '5044:0 '),\n+('5044', 'AlteracValleyHubA1', '30', '2597', '2597', '50', '80', '0', '401.785', '-393.695', '-1.05733', '2.60355', '5045:0 5084:0 '),\n+('5045', 'AlteracValleyBunker2', '30', '2597', '3304', '50', '80', '0', '221.727', '-412.006', '41.1425', '2.14206', '5046:0 5047:0 5044:0 '),\n+('5046', 'AlteracValleyBunker2Inside', '30', '2597', '3304', '50', '80', '146', '204.453', '-359.47', '56.3831', '2.20687', '5045:0 '),\n+('5047', 'AlteracValleyGYA1', '30', '2597', '3302', '50', '80', '128', '76.8322', '-399.172', '45.7006', '1.69996', '5045:0 5048:0 5049:0 5050:0 '),\n+('5048', 'AlteracValleyBelinda', '30', '2597', '2958', '50', '80', '0', '-36.1268', '-290.741', '15.0786', '3.0354', '5047:0 '),\n+('5049', 'AlteracValleyCN', '30', '2597', '2597', '50', '80', '0', '-133.7', '-368.866', '8.47712', '6.00431', '5047:0 5052:0 5087:0 '),\n+('5050', 'AlteracValleyBunker1Inside', '30', '2597', '3305', '50', '80', '146', '-151.384', '-442.049', '40.3942', '1.08956', '5047:0 '),\n+('5051', 'AlteracValleyGYC', '30', '2597', '3301', '50', '80', '128', '-200.494', '-109.396', '78.5207', '4.95373', '5087:0 5086:0 '),\n+('5052', 'AlteracValleyCS1', '30', '2597', '3057', '50', '80', '0', '-262.759', '-292.49', '6.80088', '5.73925', '5049:0 5053:0 '),\n+('5053', 'AlteracValleyCS2', '30', '2597', '3057', '50', '80', '0', '-473.131', '-273.873', '24.7318', '3.74628', '5052:0 5054:0 5086:0 '),\n+('5054', 'AlteracValleyCS3', '30', '2597', '2597', '50', '80', '32', '-525.235', '-353.849', '37.0353', '4.37461', '5055:0 5053:0 '),\n+('5055', 'AlteracValleyCS4', '30', '2597', '2597', '50', '80', '0', '-601.467', '-320.914', '51.7167', '6.08664', '5054:0 5056:0 '),\n+('5056', 'AlteracValleyGYH1', '30', '2597', '2597', '50', '80', '128', '-615.967', '-397.593', '60.6924', '0.333583', '5055:0 5057:0 5058:0 5059:0 '),\n+('5057', 'AlteracValleyTower1Inside', '30', '2597', '2977', '50', '80', '148', '-569.205', '-264.746', '75.0088', '2.58769', '5056:0 '),\n+('5058', 'AlteracValleyGalvangar', '30', '2597', '2977', '50', '80', '0', '-536.858', '-168.875', '57.0098', '2.75262', '5056:0 '),\n+('5059', 'AlteracValleyTower2', '30', '2597', '2962', '50', '80', '0', '-715.985', '-350.671', '66.8321', '2.63482', '5056:0 5060:0 5061:0 '),\n+('5060', 'AlteracValleyTower2Inside', '30', '2597', '2962', '50', '80', '148', '-767.615', '-361.296', '90.8949', '4.27041', '5059:0 '),\n+('5061', 'AlteracValleyGYH2', '30', '2597', '2597', '50', '80', '128', '-1083.95', '-341.705', '55.3047', '0.111719', '5059:0 5064:0 5082:0 '),\n+('5062', 'AlteracValleyStartH1', '30', '2597', '2597', '50', '80', '4', '-1144.38', '-442.064', '56.7427', '0.904973', '5061:0 '),\n+('5063', 'AlteracValleySpawnH', '30', '2597', '2597', '50', '80', '5', '-1386.53', '-549.064', '55.0284', '0.628112', '5062:0 '),\n+('5064', 'AlteracValleyBaseH1', '30', '2597', '2961', '50', '80', '0', '-1241.61', '-363.466', '59.6773', '2.10074', '5061:0 5065:0 '),\n+('5065', 'AlteracValleyBaseH2', '30', '2597', '2961', '50', '80', '0', '-1210.4', '-252.908', '72.7007', '3.07856', '5064:0 5066:0 '),\n+('5066', 'AlteracValleyBaseH3', '30', '2597', '2978', '50', '80', '0', '-1286.08', '-289.551', '89.091', '3.10996', '5065:0 5067:0 '),\n+('5067', 'AlteracValleyGYH3', '30', '2597', '2978', '50', '80', '128', '-1404.13', '-312.526', '89.4075', '1.4783', '5066:0 5068:0 5069:0 5070:0 '),\n+('5068', 'AlteracValleyTower3Inside', '30', '2597', '2978', '50', '80', '148', '-1301.34', '-267.703', '114.151', '0.219693', '5067:0 '),\n+('5069', 'AlteracValleyTower4Inside', '30', '2597', '2978', '50', '80', '148', '-1304.35', '-313.854', '113.867', '5.07738', '5067:0 '),\n+('5070', 'AlteracValleyDrekthar', '30', '2597', '4407', '50', '80', '276', '-1367.71', '-227.007', '98.4255', '2.09366', '5067:0 '),\n+('5071', 'AlteracValleyGYA2', '30', '2597', '3303', '50', '80', '128', '664.375', '-295.432', '30.2906', '1.6334', '5072:0 5080:0 5084:0 '),\n+('5072', 'AlteracValleyBaseA1', '30', '2597', '2959', '50', '80', '0', '628.165', '-209.132', '39.032', '1.71587', '5073:0 5071:0 '),\n+('5073', 'AlteracValleyGYA3', '30', '2597', '2959', '50', '80', '128', '635.165', '-28.286', '46.6157', '4.25874', '5072:0 5074:0 5075:0 5076:0 '),\n+('5074', 'AlteracValleyBunker3Inside', '30', '2597', '2959', '50', '80', '146', '672.521', '-142.475', '63.6551', '4.09365', '5073:0 '),\n+('5075', 'AlteracValleyBunker4Inside', '30', '2597', '2959', '50', '80', '146', '555.611', '-77.7777', '51.9336', '1.81992', '5073:0 '),\n+('5076', 'AlteracValleyVanndar', '30', '2597', '4408', '50', '80', '274', '712.208', '-13.5129', '50.1354', '0.288398', '5073:0 '),\n+('5077', 'AlteracValleyShortcutA1', '30', '2597', '3303', '50', '80', '34', '668.321', '-376.13', '30.4499', '1.65697', '5071:0 '),\n+('5078', 'AlteracValleyShortcutH1', '30', '2597', '2597', '50', '80', '36', '-550.621', '-356.862', '50.2404', '5.33475', '5054:0 '),\n+('5079', 'AlteracValleyMineA1', '30', '2597', '2957', '50', '80', '34', '774.881', '-363.728', '78.8805', '1.75712', '5080:0 '),\n+('5080', 'AlteracValleyMineA2', '30', '2597', '2957', '50', '80', '32', '776.68', '-313.432', '54.4907', '0.0135369', '5081:0 5071:0 '),\n+('5081', 'AlteracValleyMineA3', '30', '2597', '2957', '50', '80', '512', '870.508', '-436.928', '51.1438', '5.59377', '5080:0 '),\n+('5082', 'AlteracValleyMineH1', '30', '2597', '2963', '50', '80', '0', '-964.106', '-216.1', '69.4372', '0.822477', '5061:0 5083:0 '),\n+('5083', 'AlteracValleyMineH2', '30', '2597', '2963', '50', '80', '512', '-857.468', '-102.82', '65.0282', '0.681106', '5082:0 '),\n+('5084', 'AlteracValleyAuxA1', '30', '2597', '2597', '50', '80', '0', '517.454', '-327.563', '-1.03301', '0.235552', '5044:0 5071:0 '),\n+('5085', 'AlteracValleyIcebloodGY', '30', '2597', '3300', '50', '80', '0', '-531.167', '-405.06', '49.5441', '2.83719', '5056:0 5078:0 '),\n+('5086', 'AlteracValleyGYCS', '30', '2597', '3057', '50', '80', '0', '-296.163', '-118.723', '18.4795', '0.58704', '5051:0 5053:0 '),\n+('5087', 'AlteracValleyGYCN', '30', '2597', '2597', '50', '80', '0', '-154.952', '-231.949', '10.0454', '1.75925', '5049:0 5051:0 ');\ndiff --git a/data/sql/custom/db_world/2023_06_26_00_creature_template_npcbot_wander_nodes.sql b/data/sql/custom/db_world/2023_06_26_00_creature_template_npcbot_wander_nodes.sql\nnew file mode 100644\nindex 0000000000..172d35860c\n--- /dev/null\n+++ b/data/sql/custom/db_world/2023_06_26_00_creature_template_npcbot_wander_nodes.sql\n@@ -0,0 +1,5 @@\n+--\n+DELETE FROM `creature_template_npcbot_wander_nodes` WHERE `id` IN (2396,2406);\n+INSERT INTO `creature_template_npcbot_wander_nodes`(`id`,`name`,`mapid`,`zoneid`,`areaid`,`minlevel`,`maxlevel`,`flags`,`x`,`y`,`z`,`o`,`links`) VALUES\n+('2396','ArathiBasinSpawnA','529','3358','3417','20','80','3','1289.51','1286.41','-14.466','3.89804','2397:0 '),\n+('2406','ArathiBasinSpawnH','529','3358','3418','20','80','5','704.074','704.457','-16.4305','0.79572','2407:0 ');\ndiff --git a/data/sql/custom/db_world/2023_07_01_00_creature_template_npcbot_disabled_items.sql b/data/sql/custom/db_world/2023_07_01_00_creature_template_npcbot_disabled_items.sql\nnew file mode 100644\nindex 0000000000..d7a4b39966\n--- /dev/null\n+++ b/data/sql/custom/db_world/2023_07_01_00_creature_template_npcbot_disabled_items.sql\n@@ -0,0 +1,11 @@\n+-- Test items: 'LK ARENA ...', 'LK Arena ...', 'LK Honor ...' (SELECT entry,name FROM item_template WHERE name LIKE 'LK %';)\n+INSERT IGNORE INTO `creature_template_npcbot_disabled_items` (`id`) VALUES\n+('42000'),\n+('42019'),\n+('41995'),\n+('42007'),\n+('42013'),\n+('40650'),\n+('41900'),\n+('41911'),\n+('42083');\ndiff --git a/data/sql/custom/db_world/2023_08_13_00_creature_template_npcbot_appearance.sql b/data/sql/custom/db_world/2023_08_13_00_creature_template_npcbot_appearance.sql\nnew file mode 100644\nindex 0000000000..b50d728b36\n--- /dev/null\n+++ b/data/sql/custom/db_world/2023_08_13_00_creature_template_npcbot_appearance.sql\n@@ -0,0 +1,2 @@\n+--\n+ALTER TABLE `creature_template_npcbot_appearance` MODIFY COLUMN `name*` char(100) DEFAULT 'unk' COMMENT 'unused', CHARSET=utf8mb4;\ndiff --git a/data/sql/custom/db_world/2024_03_12_00_npc_text.sql b/data/sql/custom/db_world/2024_03_12_00_npc_text.sql\nnew file mode 100644\nindex 0000000000..beac65429c\n--- /dev/null\n+++ b/data/sql/custom/db_world/2024_03_12_00_npc_text.sql\n@@ -0,0 +1,7 @@\n+--\n+SET @LOCALIZED_STRINGS_START = 70673;\n+SET @LOCALIZED_STRINGS_END   = 70673;\n+\n+DELETE FROM `npc_text` WHERE ID BETWEEN @LOCALIZED_STRINGS_START and @LOCALIZED_STRINGS_END;\n+INSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n+(70673,'Heal target health threshold','-1');\ndiff --git a/data/sql/custom/db_world/2024_03_18_00_npc_text.sql b/data/sql/custom/db_world/2024_03_18_00_npc_text.sql\nnew file mode 100644\nindex 0000000000..ad440f8312\n--- /dev/null\n+++ b/data/sql/custom/db_world/2024_03_18_00_npc_text.sql\n@@ -0,0 +1,2 @@\n+--\n+UPDATE `npc_text` SET `text0_0`='You exceed max npcbots for your level (%u)' WHERE (`ID`='70532');\ndiff --git a/data/sql/custom/db_world/2024_03_19_00_npc_text.sql b/data/sql/custom/db_world/2024_03_19_00_npc_text.sql\nnew file mode 100644\nindex 0000000000..c0904d4f71\n--- /dev/null\n+++ b/data/sql/custom/db_world/2024_03_19_00_npc_text.sql\n@@ -0,0 +1,17 @@\n+--\n+SET @LOCALIZED_STRINGS_START = 70674;\n+SET @LOCALIZED_STRINGS_END   = 70684;\n+\n+DELETE FROM `npc_text` WHERE ID BETWEEN @LOCALIZED_STRINGS_START and @LOCALIZED_STRINGS_END;\n+INSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n+(70674,'I need a portal','-1'),\n+(70675,'Stormwind','-1'),\n+(70676,'Ironforge','-1'),\n+(70677,'Darnassus','-1'),\n+(70678,'Exodar','-1'),\n+(70679,'Orgrimmar','-1'),\n+(70680,'Undercity','-1'),\n+(70681,'Thunder Bluff','-1'),\n+(70682,'Silvermoon','-1'),\n+(70683,'Shattrath','-1'),\n+(70684,'Dalaran','-1');\ndiff --git a/data/sql/custom/db_world/2024_05_21_00_command.sql b/data/sql/custom/db_world/2024_05_21_00_command.sql\nnew file mode 100644\nindex 0000000000..241129d78e\n--- /dev/null\n+++ b/data/sql/custom/db_world/2024_05_21_00_command.sql\n@@ -0,0 +1,73 @@\n+DELETE FROM `command` WHERE ISNULL(`help`) AND `name` IN ('npcbot add','npcbot command','npcbot command follow','npcbot command follow only','npcbot command nocast','npcbot command nogossip','npcbot command nolongcast','npcbot command rebind','npcbot command standstill','npcbot command stopfully','npcbot command unbind','npcbot command walk','npcbot createnew','npcbot delete','npcbot delete free','npcbot delete id','npcbot distance','npcbot distance attack','npcbot distance attack long','npcbot distance attack short','npcbot dump','npcbot dump load','npcbot dump write','npcbot go','npcbot gs','npcbot hide','npcbot info','npcbot kill','npcbot list spawned','npcbot list spawned free','npcbot lookup','npcbot move','npcbot order','npcbot order cast','npcbot recall','npcbot recall spawns','npcbot recall teleport','npcbot reloadconfig','npcbot remove','npcbot revive','npcbot sendto','npcbot sendto last','npcbot sendto point','npcbot sendto point set','npcbot set','npcbot set faction','npcbot set owner','npcbot set spec','npcbot show','npcbot spawn','npcbot suicide','npcbot unhide','npcbot useonbot item','npcbot useonbot spell','npcbot vehicle','npcbot vehicle eject','npcbot wp add','npcbot wp del','npcbot wp go','npcbot wp info','npcbot wp links','npcbot wp list','npcbot wp list all','npcbot wp move','npcbot wp setflags','npcbot wp setflags z','npcbot wp setlevels','npcbot wp setlevels z','npcbot wp setlinks','npcbot wp setname','npcbot wp spawnall');\n+INSERT IGNORE INTO `command` (`name`,`security`,`help`) VALUES\n+('npcbot add', '2', NULL),\n+('npcbot command', '0', NULL),\n+('npcbot command follow', '0', NULL),\n+('npcbot command follow only', '0', NULL),\n+('npcbot command nocast', '0', NULL),\n+('npcbot command nogossip', '0', NULL),\n+('npcbot command nolongcast', '0', NULL),\n+('npcbot command rebind', '0', NULL),\n+('npcbot command standstill', '0', NULL),\n+('npcbot command stopfully', '0', NULL),\n+('npcbot command unbind', '0', NULL),\n+('npcbot command walk', '0', NULL),\n+('npcbot createnew', '3', NULL),\n+('npcbot delete', '2', NULL),\n+('npcbot delete free', '2', NULL),\n+('npcbot delete id', '2', NULL),\n+('npcbot distance', '0', NULL),\n+('npcbot distance attack', '0', NULL),\n+('npcbot distance attack long', '0', NULL),\n+('npcbot distance attack short', '0', NULL),\n+('npcbot dump', '0', NULL),\n+('npcbot dump load', '3', NULL),\n+('npcbot dump write', '3', NULL),\n+('npcbot go', '2', NULL),\n+('npcbot gs', '0', NULL),\n+('npcbot hide', '0', NULL),\n+('npcbot info', '0', NULL),\n+('npcbot kill', '0', NULL),\n+('npcbot list spawned', '2', NULL),\n+('npcbot list spawned free', '2', NULL),\n+('npcbot lookup', '2', NULL),\n+('npcbot move', '2', NULL),\n+('npcbot order', '0', NULL),\n+('npcbot order cast', '0', NULL),\n+('npcbot recall', '0', NULL),\n+('npcbot recall spawns', '0', NULL),\n+('npcbot recall teleport', '0', NULL),\n+('npcbot reloadconfig', '2', NULL),\n+('npcbot remove', '2', NULL),\n+('npcbot revive', '2', NULL),\n+('npcbot sendto', '0', NULL),\n+('npcbot sendto last', '0', NULL),\n+('npcbot sendto point', '0', NULL),\n+('npcbot sendto point set', '0', NULL),\n+('npcbot set', '0', NULL),\n+('npcbot set faction', '2', NULL),\n+('npcbot set owner', '2', NULL),\n+('npcbot set spec', '2', NULL),\n+('npcbot show', '0', NULL),\n+('npcbot spawn', '2', NULL),\n+('npcbot suicide', '0', NULL),\n+('npcbot unhide', '0', NULL),\n+('npcbot useonbot item', '0', NULL),\n+('npcbot useonbot spell', '0', NULL),\n+('npcbot vehicle', '0', NULL),\n+('npcbot vehicle eject', '0', NULL),\n+('npcbot wp add', '2', NULL),\n+('npcbot wp del', '2', NULL),\n+('npcbot wp go', '2', NULL),\n+('npcbot wp info', '2', NULL),\n+('npcbot wp links', '2', NULL),\n+('npcbot wp list', '2', NULL),\n+('npcbot wp list all', '2', NULL),\n+('npcbot wp move', '2', NULL),\n+('npcbot wp setflags', '2', NULL),\n+('npcbot wp setflags z', '2', NULL),\n+('npcbot wp setlevels', '2', NULL),\n+('npcbot wp setlevels z', '2', NULL),\n+('npcbot wp setlinks', '2', NULL),\n+('npcbot wp setname', '2', NULL),\n+('npcbot wp spawnall', '2', NULL);\ndiff --git a/data/sql/custom/db_world/2024_05_29_00_command.sql b/data/sql/custom/db_world/2024_05_29_00_command.sql\nnew file mode 100644\nindex 0000000000..9d6649c447\n--- /dev/null\n+++ b/data/sql/custom/db_world/2024_05_29_00_command.sql\n@@ -0,0 +1,3 @@\n+--\n+INSERT IGNORE INTO `command` (`name`,`security`,`help`) VALUES\n+('npcbot log clear', '3', NULL);\ndiff --git a/data/sql/custom/db_world/2024_08_14_00_npc_text.sql b/data/sql/custom/db_world/2024_08_14_00_npc_text.sql\nnew file mode 100644\nindex 0000000000..31b1faf7f9\n--- /dev/null\n+++ b/data/sql/custom/db_world/2024_08_14_00_npc_text.sql\n@@ -0,0 +1,7 @@\n+--\n+SET @LOCALIZED_STRINGS_START = 70685;\n+SET @LOCALIZED_STRINGS_END   = 70685;\n+\n+DELETE FROM `npc_text` WHERE ID BETWEEN @LOCALIZED_STRINGS_START and @LOCALIZED_STRINGS_END;\n+INSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n+(@LOCALIZED_STRINGS_START,'You exceed max npcbots for your account (%u >= %u)','-1');\ndiff --git a/data/sql/custom/db_world/2024_08_14_01_npc_text.sql b/data/sql/custom/db_world/2024_08_14_01_npc_text.sql\nnew file mode 100644\nindex 0000000000..8c6da261a2\n--- /dev/null\n+++ b/data/sql/custom/db_world/2024_08_14_01_npc_text.sql\n@@ -0,0 +1,3 @@\n+--\n+UPDATE `npc_text` SET `text0_0` = REPLACE(`text0_0`, '%s', '{}') WHERE ID IN (70438,70527,70528,70529,70530,70531,70535,70543,70552,70553);\n+UPDATE `npc_text` SET `text0_0` = REPLACE(`text0_0`, '%u', '{}') WHERE ID IN (70532,70534,70535,70685);\ndiff --git a/data/sql/custom/db_world/2024_08_15_00_command.sql b/data/sql/custom/db_world/2024_08_15_00_command.sql\nnew file mode 100644\nindex 0000000000..89439eb75d\n--- /dev/null\n+++ b/data/sql/custom/db_world/2024_08_15_00_command.sql\n@@ -0,0 +1,3 @@\n+--\n+INSERT IGNORE INTO `command` (`name`,`security`,`help`) VALUES\n+('npcbot free', '2', NULL);\ndiff --git a/data/sql/custom/db_world/2024_08_31_00_command.sql b/data/sql/custom/db_world/2024_08_31_00_command.sql\nnew file mode 100644\nindex 0000000000..80d4f88d8c\n--- /dev/null\n+++ b/data/sql/custom/db_world/2024_08_31_00_command.sql\n@@ -0,0 +1,3 @@\n+--\n+INSERT IGNORE INTO `command` (`name`,`security`,`help`) VALUES\n+('npcbot order pull', '0', NULL);\ndiff --git a/data/sql/custom/db_world/2024_10_21_00_npc_text.sql b/data/sql/custom/db_world/2024_10_21_00_npc_text.sql\nnew file mode 100644\nindex 0000000000..bb236b5975\n--- /dev/null\n+++ b/data/sql/custom/db_world/2024_10_21_00_npc_text.sql\n@@ -0,0 +1,7 @@\n+--\n+SET @LOCALIZED_STRINGS_START = 70686;\n+SET @LOCALIZED_STRINGS_END   = 70686;\n+\n+DELETE FROM `npc_text` WHERE ID BETWEEN @LOCALIZED_STRINGS_START and @LOCALIZED_STRINGS_END;\n+INSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n+(@LOCALIZED_STRINGS_START,'<Set for all bots>','-1');\ndiff --git a/data/sql/custom/db_world/2024_10_27_00_command.sql b/data/sql/custom/db_world/2024_10_27_00_command.sql\nnew file mode 100644\nindex 0000000000..bd4cf2cac0\n--- /dev/null\n+++ b/data/sql/custom/db_world/2024_10_27_00_command.sql\n@@ -0,0 +1,3 @@\n+--\n+INSERT IGNORE INTO `command` (`name`,`security`,`help`) VALUES\n+('npcbot wp setweights', '2', NULL);\ndiff --git a/data/sql/custom/db_world/2024_10_31_creature_template_wander_nodes.sql b/data/sql/custom/db_world/2024_10_31_creature_template_wander_nodes.sql\nnew file mode 100644\nindex 0000000000..ec5b450495\n--- /dev/null\n+++ b/data/sql/custom/db_world/2024_10_31_creature_template_wander_nodes.sql\n@@ -0,0 +1,2727 @@\n+--\n+DELETE FROM `creature_template_npcbot_wander_nodes` WHERE `id` BETWEEN 2372 AND 5095;\n+INSERT INTO `creature_template_npcbot_wander_nodes` (`id`,`name`,`mapid`,`zoneid`,`areaid`,`minlevel`,`maxlevel`,`flags`,`x`,`y`,`z`,`o`,`links`) VALUES\n+('2372', 'hellfire001', '530', '3483', '3804', '60', '63', '0', '-88.1661', '1757.73', '61.4158', '2.30551', '2373:0 2376:0 '),\n+('2373', 'hellfire002', '530', '3483', '3804', '60', '63', '0', '-130.83', '1837.76', '78.4899', '5.22012', '2372:0 2374:0 2376:0 '),\n+('2374', 'hellfire003', '530', '3483', '3542', '60', '63', '0', '-228.144', '1920.56', '96.8968', '1.90495', '2373:0 2375:0 2376:0 '),\n+('2375', 'hellfire004', '530', '3483', '3542', '60', '63', '1', '-207.846', '2150.92', '80.3185', '1.58606', '2374:0 2396:0 2407:0 '),\n+('2376', 'hellfire005', '530', '3483', '3804', '60', '63', '0', '-320.252', '1725.48', '60.1535', '0.383608', '2372:0 2373:0 2374:0 2377:0 '),\n+('2377', 'hellfire006', '530', '3483', '3804', '60', '63', '0', '-443.68', '1809.38', '64.2507', '6.17593', '2376:0 2378:0 '),\n+('2378', 'hellfire007', '530', '3483', '3815', '60', '63', '0', '-614.482', '1855.41', '72.3221', '2.91339', '2377:0 2379:0 '),\n+('2379', 'hellfire008', '530', '3483', '3483', '60', '63', '0', '-772.087', '1924.89', '51.3142', '3.69486', '2378:0 2380:0 2381:0 '),\n+('2380', 'hellfire009', '530', '3483', '3582', '60', '63', '0', '-890.066', '1889.54', '71.6232', '2.99193', '2379:0 '),\n+('2381', 'hellfire010', '530', '3483', '3483', '60', '63', '0', '-665.15', '2133.08', '41.0304', '6.09818', '2379:0 2382:0 '),\n+('2382', 'hellfire011', '530', '3483', '3483', '60', '63', '0', '-830.651', '2170.3', '10.6442', '6.00392', '2381:0 2383:0 '),\n+('2383', 'hellfire012', '530', '3483', '3582', '60', '63', '0', '-1044.48', '2221.12', '18.1881', '2.68955', '2382:0 2384:0 2386:0 '),\n+('2384', 'hellfire013', '530', '3483', '3582', '60', '63', '0', '-1060.21', '2075.54', '65.7492', '1.53579', '2383:0 2385:0 '),\n+('2385', 'hellfire014', '530', '3483', '3582', '60', '63', '0', '-1136.98', '1968.35', '74.7199', '4.3593', '2384:0 '),\n+('2386', 'hellfire015', '530', '3483', '3483', '60', '63', '0', '-1116.71', '2366.85', '26.2', '1.55936', '2383:0 2387:0 '),\n+('2387', 'hellfire016', '530', '3483', '3483', '60', '63', '0', '-1209.75', '2517.59', '48.9283', '1.97249', '2386:0 '),\n+('2388', 'hellfire017', '530', '3483', '3483', '60', '63', '0', '-927.061', '2680.73', '24.4655', '4.225', '2389:0 2392:0 '),\n+('2389', 'hellfire018', '530', '3483', '3483', '60', '63', '0', '-991.176', '2930.18', '4.1955', '4.89571', '2388:0 2412:0 2413:0 '),\n+('2390', 'hellfire019', '530', '3483', '3483', '60', '63', '0', '-652.576', '2459.81', '56.8494', '0.00658825', '2391:0 2392:0 '),\n+('2391', 'hellfire020', '530', '3483', '3483', '60', '63', '0', '-382.816', '2594.23', '50.224', '3.72781', '2390:0 '),\n+('2392', 'hellfire021', '530', '3483', '3538', '60', '63', '3', '-721.67', '2675.81', '95.7509', '0.770785', '2388:0 2390:0 '),\n+('2393', 'hellfire022', '530', '3483', '3483', '60', '63', '0', '-449.715', '2925.64', '21.2132', '0.32312', '2394:0 '),\n+('2394', 'hellfire023', '530', '3483', '3483', '60', '63', '0', '-593.071', '2998.53', '15.8438', '0.017592', '2393:0 2395:0 '),\n+('2395', 'hellfire024', '530', '3483', '3483', '60', '63', '0', '-749.912', '3117.85', '4.88152', '5.75179', '2394:0 2412:0 2453:0 '),\n+('2396', 'hellfire025', '530', '3483', '3483', '60', '63', '0', '-80.7943', '2320.17', '65.6333', '4.50299', '2375:0 2397:0 2400:0 2407:0 '),\n+('2397', 'hellfire026', '530', '3483', '3483', '60', '63', '0', '18.4377', '2469.36', '53.639', '4.22811', '2396:0 2398:0 2400:0 '),\n+('2398', 'hellfire027', '530', '3483', '3536', '60', '63', '4', '33.0662', '2661.07', '75.7738', '3.89274', '2397:0 2399:0 '),\n+('2399', 'hellfire028', '530', '3483', '3536', '60', '63', '5', '221.743', '2789.93', '121.175', '3.98307', '2398:0 2450:0 '),\n+('2400', 'hellfire029', '530', '3483', '3793', '60', '63', '0', '158.425', '2334.4', '54.1841', '5.04414', '2396:0 2397:0 2401:0 '),\n+('2401', 'hellfire030', '530', '3483', '3793', '60', '63', '0', '270.62', '2240.47', '56.9978', '2.96989', '2400:0 2402:0 '),\n+('2402', 'hellfire031', '530', '3483', '3793', '60', '63', '0', '255.635', '2040.2', '31.817', '2.78925', '2401:0 2403:0 '),\n+('2403', 'hellfire032', '530', '3483', '3483', '60', '63', '0', '446.912', '2049.26', '99.1622', '3.3783', '2402:0 2404:0 '),\n+('2404', 'hellfire033', '530', '3483', '3483', '60', '63', '0', '442.066', '2351.62', '123.026', '4.69385', '2403:0 2405:0 '),\n+('2405', 'hellfire034', '530', '3483', '3483', '60', '63', '0', '438.394', '2661.09', '177.718', '4.90591', '2404:0 2406:0 '),\n+('2406', 'hellfire035', '530', '3483', '3549', '60', '63', '0', '549.636', '2796.65', '217.8', '4.31374', '2405:0 '),\n+('2407', 'hellfire036', '530', '3483', '3542', '60', '63', '0', '-220.959', '2363', '37.4537', '1.6049', '2375:0 2396:0 2408:0 '),\n+('2408', 'hellfire037', '530', '3483', '3542', '60', '63', '0', '-248.594', '2648.76', '-11.9763', '4.88786', '2407:0 2409:0 '),\n+('2409', 'hellfire038', '530', '3483', '3542', '60', '63', '0', '-270.052', '2895.86', '-55.0992', '4.86824', '2408:0 2410:0 2411:0 '),\n+('2410', 'hellfire039', '530', '3483', '3545', '60', '63', '0', '-371.638', '3039.8', '-63.8946', '5.60259', '2409:0 '),\n+('2411', 'hellfire040', '530', '3483', '3545', '60', '63', '0', '-243.298', '3044.75', '-65.4235', '4.48185', '2409:0 '),\n+('2412', 'hellfire041', '530', '3483', '3483', '60', '63', '0', '-930.007', '3088.24', '16.9479', '0.133084', '2389:0 2395:0 2413:0 2420:0 '),\n+('2413', 'hellfire042', '530', '3483', '3483', '60', '63', '0', '-1233.86', '3071.59', '29.2379', '5.81622', '2412:0 2389:0 2414:0 2416:0 '),\n+('2414', 'hellfire043', '530', '3483', '3796', '60', '63', '0', '-1370.5', '2890.29', '-26.0325', '3.35557', '2413:0 2415:0 '),\n+('2415', 'hellfire044', '530', '3483', '3546', '60', '63', '0', '-1257.98', '2677.11', '1.84108', '2.88824', '2414:0 '),\n+('2416', 'hellfire045', '530', '3483', '3483', '60', '63', '0', '-1343.14', '3305.78', '47.482', '2.24265', '2413:0 2417:0 '),\n+('2417', 'hellfire046', '530', '3483', '3765', '60', '63', '0', '-1519.57', '3487.42', '30.3847', '2.18217', '2416:0 2418:0 '),\n+('2418', 'hellfire047', '530', '3483', '3765', '60', '63', '0', '-1621.55', '3645.56', '31.4811', '1.74235', '2417:0 2419:0 '),\n+('2419', 'hellfire048', '530', '3483', '3765', '60', '63', '0', '-1680.38', '3854.3', '36.4441', '1.97326', '2418:0 2738:0 '),\n+('2420', 'hellfire049', '530', '3483', '3483', '60', '63', '0', '-1003.35', '3339.19', '79.143', '4.83211', '2412:0 2421:0 '),\n+('2421', 'hellfire050', '530', '3483', '3483', '60', '63', '0', '-866.12', '3482.05', '93.6018', '3.97209', '2420:0 2422:0 '),\n+('2422', 'hellfire051', '530', '3483', '3543', '60', '63', '0', '-842.626', '3645.6', '31.4407', '5.28056', '2421:0 2423:0 '),\n+('2423', 'hellfire052', '530', '3483', '3543', '60', '63', '0', '-578.854', '3725.85', '28.9962', '3.4176', '2422:0 2424:0 '),\n+('2424', 'hellfire053', '530', '3483', '3543', '60', '63', '0', '-629.058', '3954.17', '28.9952', '4.88236', '2423:0 2425:0 2426:0 2428:0 '),\n+('2425', 'hellfire054', '530', '3483', '3483', '60', '63', '0', '-503.474', '4084.93', '51.2172', '4.03729', '2424:0 2428:0 2435:0 '),\n+('2426', 'hellfire055', '530', '3483', '3543', '60', '63', '0', '-841.235', '4095.51', '32.9704', '5.79579', '2424:0 2427:0 2428:0 2431:0 '),\n+('2427', 'hellfire056', '530', '3483', '3483', '60', '63', '0', '-950.497', '4184.92', '29.5337', '3.20635', '2426:0 2429:0 2431:0 '),\n+('2428', 'hellfire057', '530', '3483', '3554', '60', '63', '5', '-659.228', '4167.05', '67.8382', '3.41684', '2424:0 2425:0 2426:0 2435:0 '),\n+('2429', 'hellfire058', '530', '3483', '3556', '60', '63', '0', '-1174.94', '4209.88', '20.9412', '0.188851', '2427:0 2430:0 '),\n+('2430', 'hellfire059', '530', '3483', '3798', '60', '63', '0', '-1287.84', '4075.76', '93.8567', '5.93954', '2429:0 '),\n+('2431', 'hellfire060', '530', '3483', '3483', '60', '63', '0', '-1036.95', '4000.75', '83.0333', '2.90005', '2426:0 2427:0 2432:0 '),\n+('2432', 'hellfire061', '530', '3483', '3483', '60', '63', '0', '-891.162', '4017.27', '84.496', '3.16788', '2431:0 2433:0 '),\n+('2433', 'hellfire062', '530', '3483', '3543', '60', '63', '0', '-799.397', '3955.75', '91.0415', '2.42568', '2432:0 2434:0 '),\n+('2434', 'hellfire063', '530', '3483', '3483', '60', '63', '0', '-766.496', '3789.21', '113.362', '1.77223', '2433:0 '),\n+('2435', 'hellfire064', '530', '3483', '3483', '60', '63', '0', '-593.759', '4335.47', '52.0515', '4.60437', '2428:0 2425:0 2436:0 '),\n+('2436', 'hellfire065', '530', '3483', '3483', '60', '63', '0', '-336.014', '4367.15', '59.658', '3.93679', '2435:0 2437:0 2463:0 '),\n+('2437', 'hellfire066', '530', '3483', '3483', '60', '63', '0', '-202.4', '4447.51', '42.6762', '3.81506', '2436:0 2438:0 2460:0 2463:0 '),\n+('2438', 'hellfire067', '530', '3483', '3483', '60', '63', '0', '-100.749', '4241.25', '83.9687', '2.24269', '2437:0 2439:0 2441:0 2443:0 2459:0 '),\n+('2439', 'hellfire068', '530', '3483', '3552', '60', '63', '2', '63.0268', '4335.15', '96.8814', '6.21365', '2438:0 2440:0 2441:0 '),\n+('2440', 'hellfire069', '530', '3483', '3552', '60', '63', '3', '215.545', '4332.38', '119.241', '2.95661', '2439:0 '),\n+('2441', 'hellfire070', '530', '3483', '3483', '60', '63', '0', '39.4389', '4153.06', '71.524', '1.85939', '2438:0 2439:0 2442:0 2443:0 2459:0 '),\n+('2442', 'hellfire071', '530', '3483', '3483', '60', '63', '0', '150.282', '3945.51', '79.661', '2.2835', '2441:0 2443:0 2469:0 '),\n+('2443', 'hellfire072', '530', '3483', '3483', '60', '63', '0', '-96.2588', '3960.84', '99.7364', '0.521852', '2438:0 2442:0 2441:0 2444:0 2459:0 '),\n+('2444', 'hellfire073', '530', '3483', '3669', '60', '63', '0', '-120.509', '3779.67', '72.1233', '1.75885', '2443:0 2445:0 '),\n+('2445', 'hellfire074', '530', '3483', '3553', '60', '63', '0', '-61.6848', '3514.21', '73.5858', '5.1667', '2444:0 2446:0 2448:0 2452:0 '),\n+('2446', 'hellfire075', '530', '3483', '3553', '60', '63', '0', '318.42', '3476.5', '61.5198', '2.95581', '2445:0 2447:0 '),\n+('2447', 'hellfire076', '530', '3483', '3553', '60', '63', '0', '383.974', '3310.89', '74.522', '1.91516', '2446:0 '),\n+('2448', 'hellfire077', '530', '3483', '3483', '60', '63', '0', '-44.2798', '3288.99', '27.2629', '1.47534', '2445:0 2449:0 2452:0 '),\n+('2449', 'hellfire078', '530', '3483', '3483', '60', '63', '0', '-43.1353', '3087.28', '-1.55873', '1.59942', '2448:0 2450:0 '),\n+('2450', 'hellfire079', '530', '3483', '3483', '60', '63', '0', '312.814', '2983.21', '19.5651', '2.81914', '2399:0 2449:0 2451:0 '),\n+('2451', 'hellfire080', '530', '3483', '3799', '60', '63', '0', '459.167', '3040.66', '17.0606', '3.687', '2450:0 '),\n+('2452', 'hellfire081', '530', '3483', '3670', '60', '63', '0', '-182.907', '3456.14', '39.4587', '0.671851', '2445:0 2448:0 '),\n+('2453', 'hellfire082', '530', '3483', '3671', '60', '63', '0', '-567.836', '3269.14', '15.2208', '4.86979', '2395:0 2454:0 '),\n+('2454', 'hellfire083', '530', '3483', '3671', '60', '63', '0', '-549.666', '3476.52', '45.226', '4.64597', '2453:0 2455:0 2456:0 '),\n+('2455', 'hellfire084', '530', '3483', '3671', '60', '63', '0', '-445.867', '3462.18', '37.6671', '2.82071', '2454:0 '),\n+('2456', 'hellfire085', '530', '3483', '3669', '60', '63', '0', '-452.212', '3658.72', '45.9024', '0.816375', '2454:0 2457:0 '),\n+('2457', 'hellfire086', '530', '3483', '3483', '60', '63', '0', '-378.049', '3871.34', '62.3491', '4.48419', '2456:0 2458:0 '),\n+('2458', 'hellfire087', '530', '3483', '3669', '60', '63', '0', '-294.007', '3742.96', '51.9568', '2.11386', '2457:0 2459:0 '),\n+('2459', 'hellfire088', '530', '3483', '3483', '60', '63', '0', '-203.95', '4100.77', '98.2207', '5.35677', '2438:0 2441:0 2443:0 2458:0 '),\n+('2460', 'hellfire089', '530', '3483', '3483', '60', '63', '1', '-249.051', '4768.73', '14.6773', '1.56722', '2437:0 2461:0 2462:0 2463:0 2466:0 2467:0 '),\n+('2461', 'hellfire090', '530', '3483', '3797', '60', '63', '0', '13.8026', '4691.45', '41.6534', '6.21284', '2460:0 2467:0 '),\n+('2462', 'hellfire091', '530', '3483', '3551', '60', '63', '0', '-556.09', '4800.17', '34.169', '3.11602', '2460:0 2463:0 2466:0 '),\n+('2463', 'hellfire092', '530', '3483', '3483', '60', '63', '0', '-412.14', '4578.53', '39.0585', '2.37774', '2460:0 2436:0 2437:0 2462:0 2466:0 '),\n+('2464', 'hellfire093', '530', '3483', '3800', '60', '63', '0', '-259.551', '5042.36', '65.21', '1.36455', '2465:0 2471:0 '),\n+('2465', 'hellfire094', '530', '3483', '3795', '60', '63', '0', '-403.556', '4975.22', '40.4154', '0.508468', '2464:0 2466:0 '),\n+('2466', 'hellfire095', '530', '3483', '3795', '60', '63', '0', '-417.252', '4788.73', '19.9639', '2.94399', '2463:0 2460:0 2462:0 2465:0 '),\n+('2467', 'hellfire096', '530', '3483', '3797', '60', '63', '0', '-68.76', '4846.8', '50.753', '4.86823', '2460:0 2461:0 2468:0 '),\n+('2468', 'hellfire097', '530', '3483', '3797', '60', '63', '0', '173.831', '4854.22', '77.6594', '3.44272', '2467:0 '),\n+('2469', 'hellfire098', '530', '3483', '3483', '60', '63', '0', '335.776', '4014.33', '100.063', '3.83622', '2442:0 2470:0 '),\n+('2470', 'hellfire099', '530', '3483', '3483', '60', '63', '0', '353.816', '3871.24', '144.979', '1.47611', '2469:0 '),\n+('2471', 'hellfire100', '530', '3483', '3800', '60', '63', '0', '-234.311', '5165.64', '83.9852', '4.49598', '2464:0 2472:0 '),\n+('2472', 'zangar101', '530', '3521', '3521', '61', '64', '0', '-271.021', '5303.67', '41.8812', '4.77871', '2471:0 2473:0 '),\n+('2473', 'zangar102', '530', '3521', '3565', '61', '64', '1', '-220.592', '5436.56', '21.669', '5.30379', '2472:0 2474:0 2475:0 '),\n+('2474', 'zangar103', '530', '3521', '3521', '61', '64', '0', '-84.4992', '5395.31', '22.3401', '3.21027', '2473:0 2613:0 '),\n+('2475', 'zangar104', '530', '3521', '3521', '61', '64', '0', '-395.049', '5385.52', '18.5881', '6.06676', '2473:0 2476:0 '),\n+('2476', 'zangar105', '530', '3521', '3521', '61', '64', '0', '-535.462', '5435.61', '20.9825', '5.81938', '2475:0 2477:0 '),\n+('2477', 'zangar106', '530', '3521', '3521', '61', '64', '0', '-672.658', '5367.99', '22.9724', '0.237551', '2476:0 2478:0 '),\n+('2478', 'zangar107', '530', '3521', '3641', '61', '64', '0', '-758.891', '5282.57', '17.6121', '1.72588', '2477:0 2479:0 '),\n+('2479', 'zangar108', '530', '3521', '3641', '61', '64', '0', '-813.122', '5198.88', '19.1746', '1.05202', '2478:0 2480:0 '),\n+('2480', 'zangar109', '530', '3521', '3641', '61', '64', '0', '-976.189', '5260.97', '19.0927', '6.05108', '2479:0 2481:0 2626:0 '),\n+('2481', 'zangar110', '530', '3521', '3521', '61', '64', '0', '-934.208', '5419.78', '22.8095', '4.46851', '2480:0 2482:0 2626:0 '),\n+('2482', 'zangar111', '530', '3521', '3521', '61', '64', '0', '-966.5', '5606.91', '22.0137', '4.97508', '2481:0 2483:0 '),\n+('2483', 'zangar112', '530', '3521', '3521', '61', '64', '0', '-912.293', '5682.09', '21.6937', '5.08504', '2482:0 2484:0 '),\n+('2484', 'zangar113', '530', '3521', '3521', '61', '64', '0', '-913.195', '5896.44', '20.1725', '4.59652', '2483:0 2485:0 2488:0 '),\n+('2485', 'zangar114', '530', '3521', '3521', '61', '64', '0', '-909.682', '6045.49', '19.7314', '4.59651', '2484:0 2486:0 2488:0 2489:0 '),\n+('2486', 'zangar115', '530', '3521', '3521', '61', '64', '0', '-1037.12', '6091.11', '19.5931', '5.89242', '2485:0 2487:0 '),\n+('2487', 'zangar116', '530', '3521', '3521', '61', '64', '0', '-1163.58', '6201.43', '53.0219', '5.61282', '2486:0 2625:0 '),\n+('2488', 'zangar117', '530', '3521', '3841', '61', '64', '0', '-796.58', '5918.23', '22.3409', '2.31415', '2484:0 2485:0 2489:0 '),\n+('2489', 'zangar118', '530', '3521', '3521', '61', '64', '0', '-701.347', '6013.97', '22.3146', '3.22521', '2488:0 2485:0 2490:0 2491:0 '),\n+('2490', 'zangar119', '530', '3521', '3841', '61', '64', '0', '-592.408', '5933.75', '20.813', '5.51464', '2489:0 2491:0 '),\n+('2491', 'zangar120', '530', '3521', '3521', '61', '64', '0', '-504.59', '6048.64', '23.1686', '4.20775', '2490:0 2489:0 2492:0 '),\n+('2492', 'zangar121', '530', '3521', '3841', '61', '64', '0', '-495.325', '5854.59', '20.3458', '2.52376', '2491:0 2493:0 '),\n+('2493', 'zangar122', '530', '3521', '3521', '61', '64', '0', '-318.55', '6013.33', '23.3657', '3.50315', '2492:0 2494:0 2608:0 '),\n+('2494', 'zangar123', '530', '3521', '3819', '61', '64', '0', '-352.699', '6158.62', '21.7844', '4.91293', '2493:0 2495:0 2608:0 '),\n+('2495', 'zangar124', '530', '3521', '3819', '61', '64', '0', '-338.739', '6298.09', '21.04', '4.63411', '2494:0 2496:0 '),\n+('2496', 'zangar125', '530', '3521', '3819', '61', '64', '0', '-409.277', '6401.64', '21.9404', '0.801373', '2495:0 2497:0 2500:0 '),\n+('2497', 'zangar126', '530', '3521', '3819', '61', '64', '0', '-230.832', '6354.36', '21.7058', '3.81024', '2496:0 2498:0 '),\n+('2498', 'zangar127', '530', '3521', '3659', '61', '64', '0', '-139.857', '6456.59', '20.0973', '3.85658', '2497:0 2499:0 2607:0 '),\n+('2499', 'zangar128', '530', '3521', '3659', '61', '64', '0', '-269.671', '6613.48', '23.0533', '4.34353', '2498:0 2500:0 '),\n+('2500', 'zangar129', '530', '3521', '3659', '61', '64', '0', '-383.175', '6598.68', '22.9642', '4.52024', '2496:0 2499:0 2501:0 '),\n+('2501', 'zangar130', '530', '3521', '3659', '61', '64', '0', '-215.725', '6703.55', '20.6145', '4.19588', '2500:0 2502:0 2503:0 '),\n+('2502', 'zangar131', '530', '3521', '3659', '61', '64', '0', '-63.9463', '6759.2', '20.4434', '3.22986', '2501:0 2503:0 2509:0 '),\n+('2503', 'zangar132', '530', '3521', '3659', '61', '64', '0', '-261.475', '6823.98', '21.6241', '5.85702', '2501:0 2502:0 2504:0 '),\n+('2504', 'zangar133', '530', '3521', '3642', '61', '64', '0', '-208.234', '6950.07', '20.1839', '0.893301', '2503:0 2505:0 '),\n+('2505', 'zangar134', '530', '3521', '3642', '61', '64', '0', '-126.36', '7041.34', '18.9083', '3.86997', '2504:0 2506:0 '),\n+('2506', 'zangar135', '530', '3521', '3642', '61', '64', '0', '-50.056', '7132.44', '19.2134', '4.60817', '2505:0 2507:0 '),\n+('2507', 'zangar136', '530', '3521', '3521', '61', '64', '0', '64.7648', '7212.88', '22.0782', '0.46519', '2506:0 2508:0 2516:0 2517:0 2528:0 '),\n+('2508', 'zangar137', '530', '3521', '3521', '61', '64', '0', '44.854', '7014.88', '23.4767', '1.78543', '2507:0 2509:0 '),\n+('2509', 'zangar138', '530', '3521', '3521', '61', '64', '0', '43.5835', '6871.99', '22.3894', '4.7567', '2508:0 2502:0 2510:0 2511:0 '),\n+('2510', 'zangar139', '530', '3521', '3521', '61', '64', '0', '157.048', '6719.99', '20.4444', '2.3259', '2509:0 2511:0 2595:0 '),\n+('2511', 'zangar140', '530', '3521', '3720', '61', '64', '0', '223.784', '6824.17', '25.6438', '3.74197', '2509:0 2510:0 2512:0 2595:0 '),\n+('2512', 'zangar141', '530', '3521', '3720', '61', '64', '0', '234.681', '6926.14', '23.7418', '4.49203', '2511:0 2513:0 '),\n+('2513', 'zangar142', '530', '3521', '3720', '61', '64', '0', '212.404', '7079.58', '35.2277', '4.69231', '2512:0 2514:0 '),\n+('2514', 'zangar143', '530', '3521', '3720', '61', '64', '0', '220.362', '7208.94', '25.1738', '4.71196', '2513:0 2515:0 '),\n+('2515', 'zangar144', '530', '3521', '3720', '61', '64', '0', '336.506', '7340.86', '41.5461', '4.13471', '2514:0 2516:0 2587:0 '),\n+('2516', 'zangar145', '530', '3521', '3720', '61', '64', '0', '157.889', '7365.75', '22.1067', '6.02358', '2507:0 2515:0 2517:0 '),\n+('2517', 'zangar146', '530', '3521', '3521', '61', '64', '0', '63.1597', '7443.51', '22.1993', '5.2932', '2507:0 2516:0 2518:0 2528:0 '),\n+('2518', 'zangar147', '530', '3521', '3521', '61', '64', '0', '115.528', '7547.02', '21.6598', '4.53135', '2517:0 2519:0 2523:0 '),\n+('2519', 'zangar148', '530', '3521', '3521', '61', '64', '0', '118.141', '7658.13', '21.5634', '4.72141', '2518:0 2520:0 2523:0 2529:0 2587:0 '),\n+('2520', 'zangar149', '530', '3521', '3521', '61', '64', '4', '246.937', '7753.08', '23.1428', '3.93445', '2519:0 2521:0 2523:0 2529:0 2587:0 '),\n+('2521', 'zangar150', '530', '3521', '3645', '61', '64', '5', '264.306', '7863.47', '23.7956', '4.64131', '2520:0 2522:0 2523:0 2529:0 '),\n+('2522', 'zangar151', '530', '3521', '3521', '61', '64', '4', '449.39', '7844.62', '22.0319', '3.04694', '2521:0 2569:0 '),\n+('2523', 'zangar152', '530', '3521', '3521', '61', '64', '0', '81.5617', '7740.29', '21.6356', '3.14119', '2518:0 2519:0 2520:0 2521:0 2524:0 2529:0 '),\n+('2524', 'zangar153', '530', '3521', '3521', '61', '64', '0', '-28.0868', '7736.24', '20.5893', '6.25922', '2523:0 2525:0 2529:0 2536:0 '),\n+('2525', 'zangar154', '530', '3521', '3521', '61', '64', '0', '-170.551', '7601.35', '23.3202', '0.757515', '2524:0 2526:0 2535:0 '),\n+('2526', 'zangar155', '530', '3521', '3521', '61', '64', '0', '-174.825', '7443.51', '21.9702', '1.57433', '2525:0 2527:0 2528:0 '),\n+('2527', 'zangar156', '530', '3521', '3642', '61', '64', '0', '-120.981', '7305.7', '23.422', '1.77461', '2526:0 2528:0 '),\n+('2528', 'zangar157', '530', '3521', '3521', '61', '64', '0', '-20.2426', '7327.37', '23.7348', '2.19481', '2527:0 2526:0 2517:0 2507:0 '),\n+('2529', 'zangar158', '530', '3521', '3521', '61', '64', '0', '84.0333', '7841.91', '22.0373', '4.55886', '2519:0 2520:0 2521:0 2523:0 2524:0 2530:0 '),\n+('2530', 'zangar159', '530', '3521', '3521', '61', '64', '0', '65.13', '7971.37', '21.6779', '4.89266', '2529:0 2531:0 '),\n+('2531', 'zangar160', '530', '3521', '3521', '61', '64', '0', '43.5829', '8117.3', '22.3841', '4.94372', '2530:0 2532:0 2552:0 '),\n+('2532', 'zangar161', '530', '3521', '3521', '61', '64', '0', '-49.1017', '8195.83', '23.1999', '5.71343', '2531:0 2533:0 2537:0 2541:0 '),\n+('2533', 'zangar162', '530', '3521', '3646', '61', '64', '0', '-209.87', '8126.35', '19.9595', '0.261968', '2532:0 2534:0 2536:0 2537:0 '),\n+('2534', 'zangar163', '530', '3521', '3646', '61', '64', '0', '-261.772', '7885.5', '18.5845', '1.41258', '2533:0 2535:0 2536:0 '),\n+('2535', 'zangar164', '530', '3521', '3521', '61', '64', '0', '-259.719', '7720.02', '20.8878', '1.65605', '2525:0 2534:0 '),\n+('2536', 'zangar165', '530', '3521', '3646', '61', '64', '0', '-98.2706', '7905.01', '21.2267', '4.92567', '2524:0 2533:0 2534:0 '),\n+('2537', 'zangar166', '530', '3521', '3521', '61', '64', '0', '-180.804', '8271.58', '22.3452', '2.13749', '2532:0 2533:0 2538:0 2541:0 '),\n+('2538', 'zangar167', '530', '3521', '3521', '61', '64', '0', '-280.916', '8401.01', '22.613', '5.34193', '2537:0 2539:0 '),\n+('2539', 'zangar168', '530', '3521', '3521', '61', '64', '0', '-414.115', '8416.71', '22.9544', '6.2098', '2538:0 2540:0 2903:0 '),\n+('2540', 'zangar169', '530', '3521', '3521', '61', '64', '0', '-208.705', '8507.09', '22.1101', '4.05625', '2539:0 2541:0 '),\n+('2541', 'zangar170', '530', '3521', '3521', '61', '64', '0', '-76.6423', '8339.54', '20.5708', '1.28772', '2537:0 2532:0 2540:0 2542:0 '),\n+('2542', 'zangar171', '530', '3521', '3521', '61', '64', '0', '2.14825', '8447.62', '24.0799', '1.18326', '2541:0 2543:0 2550:0 '),\n+('2543', 'zangar172', '530', '3521', '3647', '61', '64', '0', '-67.5414', '8574.38', '21.4033', '5.22493', '2542:0 2544:0 2550:0 '),\n+('2544', 'zangar173', '530', '3521', '3647', '61', '64', '0', '-131.783', '8711.6', '20.1378', '5.16367', '2543:0 2545:0 '),\n+('2545', 'zangar174', '530', '3521', '3647', '61', '64', '0', '-58.2395', '8845.13', '19.6236', '4.45683', '2544:0 2546:0 '),\n+('2546', 'zangar175', '530', '3521', '3647', '61', '64', '0', '-158.14', '8998.32', '22.6743', '5.39853', '2545:0 2547:0 '),\n+('2547', 'zangar176', '530', '3521', '3521', '61', '64', '0', '49.2289', '8919.95', '22.8353', '4.08298', '2546:0 2548:0 2566:0 '),\n+('2548', 'zangar177', '530', '3521', '3658', '61', '64', '0', '191.332', '8791.02', '22.5064', '3.15621', '2547:0 2549:0 '),\n+('2549', 'zangar178', '530', '3521', '3658', '61', '64', '0', '100.838', '8633.77', '22.3518', '1.01992', '2548:0 2550:0 '),\n+('2550', 'zangar179', '530', '3521', '3521', '61', '64', '0', '46.3545', '8528.92', '21.3211', '3.67772', '2542:0 2543:0 2549:0 2551:0 '),\n+('2551', 'zangar180', '530', '3521', '3521', '61', '64', '1', '201.143', '8506.92', '24.4625', '4.24664', '2550:0 2552:0 '),\n+('2552', 'zangar181', '530', '3521', '3656', '61', '64', '0', '176.313', '8271.1', '19.3723', '2.275', '2531:0 2551:0 2553:0 '),\n+('2553', 'zangar182', '530', '3521', '3656', '61', '64', '0', '285.943', '8219.3', '20.2926', '3.15229', '2552:0 2554:0 '),\n+('2554', 'zangar183', '530', '3521', '3656', '61', '64', '0', '386.339', '8346.33', '22.789', '4.31625', '2553:0 2555:0 '),\n+('2555', 'zangar184', '530', '3521', '3656', '61', '64', '0', '494.267', '8437.25', '21.4802', '4.07671', '2554:0 2556:0 2563:0 2567:0 '),\n+('2556', 'zangar185', '530', '3521', '3656', '61', '64', '0', '608.933', '8508.26', '22.3504', '3.55914', '2555:0 2557:0 2563:0 '),\n+('2557', 'zangar186', '530', '3521', '3521', '61', '64', '0', '742.61', '8532.55', '22.4318', '3.26227', '2556:0 2558:0 2562:0 2563:0 '),\n+('2558', 'zangar187', '530', '3521', '3521', '61', '64', '0', '895.923', '8416.01', '24.0337', '2.57898', '2557:0 2559:0 '),\n+('2559', 'zangar188', '530', '3521', '3650', '61', '64', '0', '1075.84', '8407.67', '22.4904', '3.12875', '2558:0 2560:0 2561:0 2574:0 '),\n+('2560', 'zangar189', '530', '3521', '3650', '61', '64', '0', '1227.41', '8505.09', '22.644', '3.70367', '2559:0 2561:0 2575:0 '),\n+('2561', 'zangar190', '530', '3521', '3650', '61', '64', '0', '1037.11', '8556.71', '23.1526', '5.52971', '2559:0 2560:0 2562:0 '),\n+('2562', 'zangar191', '530', '3521', '3521', '61', '64', '0', '838.679', '8631.92', '21.121', '3.9', '2561:0 2557:0 '),\n+('2563', 'zangar192', '530', '3521', '3657', '61', '64', '0', '532.243', '8648.7', '20.2148', '1.72209', '2555:0 2556:0 2557:0 2564:0 '),\n+('2564', 'zangar193', '530', '3521', '3521', '61', '64', '0', '500.585', '8831.78', '29.9762', '3.31252', '2563:0 2565:0 '),\n+('2565', 'zangar194', '530', '3521', '3521', '61', '64', '0', '312.939', '8988.81', '29.3602', '2.17448', '2564:0 2566:0 '),\n+('2566', 'zangar195', '530', '3521', '3521', '61', '64', '0', '153.844', '9001.52', '20.6373', '4.20787', '2547:0 2565:0 '),\n+('2567', 'zangar196', '530', '3521', '3643', '61', '64', '0', '634.189', '8249.73', '20.9802', '4.23537', '2555:0 2568:0 '),\n+('2568', 'zangar197', '530', '3521', '3643', '61', '64', '0', '610.771', '8068.12', '19.5665', '1.60114', '2567:0 2569:0 2571:0 '),\n+('2569', 'zangar198', '530', '3521', '3667', '61', '64', '0', '579.736', '7860.06', '21.923', '1.46997', '2522:0 2568:0 2570:0 '),\n+('2570', 'zangar199', '530', '3521', '3667', '61', '64', '0', '737.751', '7895.31', '21.9665', '6.19807', '2569:0 2571:0 '),\n+('2571', 'zangar200', '530', '3521', '3521', '61', '64', '0', '787.048', '8075.83', '19.8301', '1.19115', '2568:0 2570:0 2572:0 '),\n+('2572', 'zangar201', '530', '3521', '3667', '61', '64', '0', '940.179', '8075.93', '22.3322', '3.07219', '2571:0 2573:0 2579:0 '),\n+('2573', 'zangar202', '530', '3521', '3667', '61', '64', '0', '1079.94', '8078.99', '22.0839', '3.44134', '2572:0 2574:0 2578:0 '),\n+('2574', 'zangar203', '530', '3521', '3640', '61', '64', '0', '1142.01', '8208.94', '18.3815', '1.68911', '2559:0 2573:0 2578:0 '),\n+('2575', 'zangar204', '530', '3521', '3650', '61', '64', '0', '1365.27', '8597.28', '20.4376', '3.62905', '2560:0 2576:0 '),\n+('2576', 'zangar205', '530', '3521', '3650', '61', '64', '0', '1473.46', '8617.75', '-19.2604', '3.20336', '2575:0 2577:0 '),\n+('2577', 'zangar206', '530', '3521', '3651', '61', '64', '0', '1617.83', '8604.6', '-25.7602', '3.11932', '2576:0 '),\n+('2578', 'zangar207', '530', '3521', '3521', '61', '64', '0', '1204.46', '7994.66', '23.5559', '2.79496', '2573:0 2574:0 2579:0 '),\n+('2579', 'zangar208', '530', '3521', '3667', '61', '64', '0', '985.581', '7906.61', '21.9749', '1.94279', '2572:0 2578:0 2580:0 '),\n+('2580', 'zangar209', '530', '3521', '3667', '61', '64', '0', '924.71', '7759.51', '22.2632', '4.47963', '2579:0 2581:0 '),\n+('2581', 'zangar210', '530', '3521', '3667', '61', '64', '0', '972.886', '7540.98', '20.6745', '5.06474', '2580:0 2582:0 '),\n+('2582', 'zangar211', '530', '3521', '3766', '61', '64', '3', '1008.04', '7381.67', '36.2454', '2.67557', '2581:0 2583:0 3077:0 '),\n+('2583', 'zangar212', '530', '3521', '3521', '61', '64', '2', '888.478', '7369.16', '20.9021', '3.3785', '2582:0 2584:0 2588:0 '),\n+('2584', 'zangar213', '530', '3521', '3521', '61', '64', '0', '749.898', '7401.62', '22.0246', '0.295815', '2583:0 2585:0 2588:0 '),\n+('2585', 'zangar214', '530', '3521', '3653', '61', '64', '0', '578.096', '7540.84', '19.4559', '5.3043', '2584:0 2586:0 '),\n+('2586', 'zangar215', '530', '3521', '3653', '61', '64', '0', '453.399', '7459.1', '23.6644', '2.9591', '2585:0 2587:0 '),\n+('2587', 'zangar216', '530', '3521', '3521', '61', '64', '0', '301.56', '7502.53', '18.7007', '4.88489', '2515:0 2586:0 2520:0 2519:0 '),\n+('2588', 'zangar217', '530', '3521', '3653', '61', '64', '0', '723.766', '7219.4', '18.4476', '1.52104', '2583:0 2584:0 2589:0 '),\n+('2589', 'zangar218', '530', '3521', '3653', '61', '64', '0', '828.704', '7046.99', '21.9746', '5.47316', '2588:0 2590:0 '),\n+('2590', 'zangar219', '530', '3521', '3521', '61', '64', '0', '813.291', '6859.8', '21.1175', '4.5346', '2589:0 2591:0 '),\n+('2591', 'zangar220', '530', '3521', '3521', '61', '64', '0', '786.813', '6686.79', '19.6235', '4.77415', '2590:0 2592:0 '),\n+('2592', 'zangar221', '530', '3521', '3521', '61', '64', '0', '739.145', '6548.18', '21.4284', '2.68185', '2591:0 2593:0 2600:0 '),\n+('2593', 'zangar222', '530', '3521', '3653', '61', '64', '0', '533.697', '6616.1', '23.4617', '5.98523', '2592:0 2594:0 2600:0 '),\n+('2594', 'zangar223', '530', '3521', '3521', '61', '64', '0', '392.669', '6497.59', '21.0234', '1.88546', '2593:0 2595:0 2596:0 2600:0 '),\n+('2595', 'zangar224', '530', '3521', '3521', '61', '64', '0', '309.995', '6655.73', '21.2137', '5.01134', '2510:0 2594:0 2511:0 '),\n+('2596', 'zangar225', '530', '3521', '3521', '61', '64', '0', '377.938', '6282.83', '22.023', '4.47492', '2594:0 2597:0 '),\n+('2597', 'zangar226', '530', '3521', '3521', '61', '64', '0', '413.817', '6144.54', '22.2423', '1.89569', '2596:0 2598:0 2603:0 '),\n+('2598', 'zangar227', '530', '3521', '3521', '61', '64', '0', '588.059', '6075.05', '22.5742', '2.63553', '2597:0 2599:0 2601:0 2624:0 '),\n+('2599', 'zangar228', '530', '3521', '3818', '61', '64', '0', '603.408', '6285.69', '21.8038', '4.64065', '2598:0 2600:0 2601:0 '),\n+('2600', 'zangar229', '530', '3521', '3653', '61', '64', '0', '621.81', '6442.18', '20.5988', '2.00643', '2592:0 2593:0 2594:0 2599:0 '),\n+('2601', 'zangar230', '530', '3521', '3521', '61', '64', '0', '691.526', '6136.65', '24.626', '4.02491', '2598:0 2599:0 2602:0 2972:0 '),\n+('2602', 'zangar231', '530', '3521', '3521', '61', '64', '0', '718.677', '6010.01', '23.0266', '4.85273', '2601:0 2624:0 2972:0 '),\n+('2603', 'zangar232', '530', '3521', '3644', '61', '64', '3', '284.699', '5949', '26.4296', '1.71192', '2597:0 2604:0 2611:0 '),\n+('2604', 'zangar233', '530', '3521', '3521', '61', '64', '2', '171.4', '6095.69', '21.4396', '5.75672', '2603:0 2605:0 2608:0 2611:0 '),\n+('2605', 'zangar234', '530', '3521', '3521', '61', '64', '0', '220.592', '6179.94', '22.7879', '2.4926', '2604:0 2606:0 '),\n+('2606', 'zangar235', '530', '3521', '3521', '61', '64', '0', '109.112', '6307.6', '20.5752', '2.47375', '2605:0 2607:0 2608:0 '),\n+('2607', 'zangar236', '530', '3521', '3659', '61', '64', '0', '-2.05183', '6372.4', '21.196', '6.01275', '2498:0 2606:0 '),\n+('2608', 'zangar237', '530', '3521', '3521', '61', '64', '0', '-101.637', '6148.49', '20.9712', '3.74609', '2493:0 2494:0 2606:0 2604:0 2609:0 '),\n+('2609', 'zangar238', '530', '3521', '3521', '61', '64', '0', '-95.8529', '5919.89', '21.912', '1.45665', '2608:0 2610:0 '),\n+('2610', 'zangar239', '530', '3521', '3521', '61', '64', '0', '13.2803', '5837.85', '22.8222', '2.53657', '2609:0 2611:0 '),\n+('2611', 'zangar240', '530', '3521', '3521', '61', '64', '0', '151.585', '5801.02', '22.4062', '1.73938', '2603:0 2604:0 2610:0 2612:0 '),\n+('2612', 'zangar241', '530', '3521', '3521', '61', '64', '0', '12.867', '5638.72', '21.5024', '0.850312', '2611:0 2613:0 '),\n+('2613', 'zangar242', '530', '3521', '3521', '61', '64', '0', '48.9274', '5481.91', '21.872', '2.08181', '2474:0 2612:0 2614:0 2616:0 '),\n+('2614', 'zangar243', '530', '3521', '3521', '61', '64', '4', '71.9609', '5332.54', '21.9147', '5.20377', '2613:0 2615:0 2616:0 '),\n+('2615', 'zangar244', '530', '3521', '3718', '61', '64', '5', '85.2911', '5223.84', '22.6669', '1.80693', '2614:0 '),\n+('2616', 'zangar245', '530', '3521', '3648', '61', '64', '0', '158.923', '5429.39', '21.7352', '4.09636', '2614:0 2613:0 2617:0 '),\n+('2617', 'zangar246', '530', '3521', '3648', '61', '64', '0', '315.219', '5408.5', '20.9134', '6.16588', '2616:0 2618:0 2619:0 '),\n+('2618', 'zangar247', '530', '3521', '3648', '61', '64', '0', '377.232', '5291.67', '16.6948', '0.491381', '2617:0 2619:0 '),\n+('2619', 'zangar248', '530', '3521', '3648', '61', '64', '0', '610.457', '5425.64', '-14.6579', '4.20083', '2617:0 2618:0 2620:0 2621:0 2622:0 '),\n+('2620', 'zangar249', '530', '3521', '3648', '61', '64', '0', '820.719', '5482.54', '9.38793', '3.43975', '2619:0 2621:0 '),\n+('2621', 'zangar250', '530', '3521', '3648', '61', '64', '0', '675.579', '5207.73', '-0.430108', '1.71187', '2619:0 2620:0 '),\n+('2622', 'zangar251', '530', '3521', '3648', '61', '64', '0', '581.932', '5617.72', '21.5502', '1.58306', '2619:0 2623:0 '),\n+('2623', 'zangar252', '530', '3521', '3521', '61', '64', '0', '549.492', '5772.45', '23.2954', '1.1668', '2622:0 2624:0 '),\n+('2624', 'zangar253', '530', '3521', '3521', '61', '64', '0', '569.447', '5936.2', '20.4341', '1.13146', '2623:0 2602:0 2598:0 2972:0 '),\n+('2625', 'nagrand254', '530', '3521', '3521', '61', '64', '0', '-1293.68', '6268.96', '47.863', '5.30897', '2487:0 2927:0 '),\n+('2626', 'zangar255', '530', '3521', '3521', '61', '64', '0', '-1072.75', '5374.44', '23.0643', '3.2316', '2480:0 2481:0 2627:0 '),\n+('2627', 'tero256', '530', '3519', '3519', '61', '64', '0', '-1193.26', '5326.41', '32.1568', '3.76253', '2626:0 2628:0 '),\n+('2628', 'tero257', '530', '3519', '3519', '61', '64', '0', '-1352.86', '5166.19', '60.3214', '0.730896', '2627:0 2629:0 '),\n+('2629', 'tero258', '530', '3519', '3519', '61', '64', '0', '-1481.09', '5196.68', '44.2804', '2.26164', '2628:0 2630:0 '),\n+('2630', 'tero259', '530', '3703', '3703', '61', '64', '0', '-1562.26', '5219.05', '26.8104', '5.79513', '2629:0 2631:0 '),\n+('2631', 'tero260', '530', '3703', '3703', '61', '64', '0', '-1646.24', '5089.63', '9.06231', '3.96908', '2630:0 2632:0 2633:0 '),\n+('2632', 'tero261', '530', '3519', '3519', '62', '65', '0', '-1504.23', '5007.75', '-5.38562', '2.6182', '2631:0 '),\n+('2633', 'tero262', '530', '3703', '3703', '62', '65', '0', '-1767.61', '5061.37', '7.70519', '3.4303', '2631:0 2634:0 '),\n+('2634', 'tero263', '530', '3703', '3703', '62', '65', '0', '-1923.14', '5054.44', '19.4908', '2.72737', '2633:0 2635:0 2636:0 2741:0 '),\n+('2635', 'tero264', '530', '3519', '3519', '62', '65', '0', '-1970.49', '4974.82', '28.2638', '4.09397', '2634:0 2724:0 2741:0 '),\n+('2636', 'tero265', '530', '3703', '3703', '62', '65', '0', '-2043.23', '5134.06', '8.27497', '5.68597', '2634:0 2637:0 2741:0 '),\n+('2637', 'tero266', '530', '3519', '3519', '62', '65', '0', '-2181.58', '5096.17', '-21.1362', '0.23923', '2636:0 2638:0 2639:0 2640:0 2741:0 '),\n+('2638', 'tero267', '530', '3519', '3519', '62', '65', '0', '-2216.99', '4909.63', '1.39859', '1.40554', '2637:0 2741:0 '),\n+('2639', 'tero268', '530', '3519', '3519', '62', '65', '0', '-2303.98', '5268.43', '-9.97572', '5.28148', '2637:0 2640:0 2641:0 2644:0 '),\n+('2640', 'tero269', '530', '3519', '3682', '62', '65', '0', '-2344.61', '5051.57', '-2.04758', '0.266708', '2639:0 2637:0 2644:0 '),\n+('2641', 'tero270', '530', '3519', '3677', '62', '65', '0', '-2431.44', '5399.92', '1.64547', '5.51947', '2639:0 2642:0 '),\n+('2642', 'tero271', '530', '3519', '3519', '62', '65', '0', '-2521.64', '5210.06', '1.76945', '1.04896', '2641:0 2643:0 2645:0 '),\n+('2643', 'tero272', '530', '3519', '3682', '62', '65', '0', '-2502.78', '5113.56', '7.96009', '6.26007', '2642:0 2644:0 2645:0 '),\n+('2644', 'tero273', '530', '3519', '3519', '62', '65', '0', '-2359.81', '5159.68', '-3.26821', '3.01403', '2643:0 2639:0 2640:0 '),\n+('2645', 'tero274', '530', '3519', '3519', '62', '65', '0', '-2640.66', '5114.54', '-2.29', '3.12004', '2642:0 2643:0 2646:0 '),\n+('2646', 'tero275', '530', '3519', '3887', '62', '65', '1', '-2764.32', '5083.04', '-6.61069', '4.7576', '2645:0 2647:0 2648:0 '),\n+('2647', 'tero276', '530', '3519', '3697', '62', '65', '0', '-2753.24', '4900.43', '-9.77721', '1.5139', '2646:0 2648:0 2650:0 '),\n+('2648', 'tero277', '530', '3519', '3697', '62', '65', '0', '-2924.05', '5077.7', '-21.4831', '6.27734', '2647:0 2646:0 2649:0 2650:0 '),\n+('2649', 'tero278', '530', '3519', '3697', '62', '65', '0', '-2988.38', '5242.11', '-18.2224', '5.09376', '2648:0 2691:0 2693:0 '),\n+('2650', 'tero279', '530', '3519', '3697', '62', '65', '0', '-2927.67', '4884.87', '-20.3937', '1.65765', '2647:0 2648:0 2651:0 '),\n+('2651', 'tero280', '530', '3519', '3891', '62', '65', '0', '-2833.33', '4763.19', '-3.82034', '2.17758', '2650:0 2652:0 '),\n+('2652', 'tero281', '530', '3519', '3891', '62', '65', '0', '-2735.66', '4761.53', '-7.97762', '3.14205', '2651:0 2653:0 '),\n+('2653', 'tero282', '530', '3519', '3697', '62', '65', '0', '-2927.04', '4629.03', '-20.1141', '1.04898', '2652:0 2654:0 2655:0 2657:0 '),\n+('2654', 'tero283', '530', '3519', '3697', '62', '65', '0', '-2792.58', '4548.65', '-5.17792', '2.36688', '2653:0 '),\n+('2655', 'tero284', '530', '3519', '3697', '62', '65', '0', '-3098.66', '4626.88', '-20.2418', '0.186611', '2653:0 2656:0 2661:0 '),\n+('2656', 'tero285', '530', '3519', '3697', '62', '65', '0', '-3111.3', '4451.66', '-21.8624', '1.72364', '2655:0 2657:0 '),\n+('2657', 'tero286', '530', '3519', '3697', '62', '65', '0', '-2978.71', '4453.52', '-19.1914', '1.37334', '2656:0 2653:0 2658:0 2716:0 '),\n+('2658', 'tero287', '530', '3519', '3697', '62', '65', '0', '-3124.74', '4312.73', '-13.4977', '1.36941', '2657:0 2659:0 2698:0 '),\n+('2659', 'tero288', '530', '3519', '3697', '62', '65', '0', '-3343.1', '4318.47', '-21.2101', '0.0703571', '2658:0 2660:0 2662:0 2698:0 '),\n+('2660', 'tero289', '530', '3519', '3697', '62', '65', '0', '-3251.81', '4540.47', '-21.009', '4.41204', '2659:0 2661:0 2663:0 '),\n+('2661', 'tero290', '530', '3519', '3688', '62', '65', '0', '-3251.45', '4665.87', '-22.0178', '5.15817', '2660:0 2655:0 '),\n+('2662', 'tero291', '530', '3519', '3892', '62', '65', '0', '-3461.56', '4373.44', '-11.6911', '5.77627', '2659:0 2663:0 2664:0 '),\n+('2663', 'tero292', '530', '3519', '3697', '62', '65', '0', '-3412.64', '4543.05', '-19.8323', '4.37513', '2662:0 2660:0 2664:0 '),\n+('2664', 'tero293', '530', '3519', '3697', '62', '65', '0', '-3615.55', '4423.5', '-15.264', '6.23338', '2662:0 2663:0 2665:0 2666:0 '),\n+('2665', 'tero294', '530', '3519', '3885', '62', '65', '0', '-3737.19', '4335.92', '3.0303', '0.715952', '2664:0 2666:0 '),\n+('2666', 'tero295', '530', '3519', '3697', '62', '65', '0', '-3717.12', '4553.09', '-15.395', '5.41343', '2664:0 2665:0 2667:0 '),\n+('2667', 'tero296', '530', '3519', '3886', '62', '65', '0', '-3751.58', '4692.08', '-17.1029', '5.18959', '2666:0 2668:0 2671:0 '),\n+('2668', 'tero297', '530', '3519', '3688', '62', '65', '0', '-3628.23', '4736.46', '-22.1214', '3.39967', '2667:0 2669:0 '),\n+('2669', 'tero298', '530', '3519', '3688', '62', '65', '0', '-3683.64', '4880.37', '-22.2453', '4.85659', '2668:0 2670:0 '),\n+('2670', 'tero299', '530', '3519', '3697', '62', '65', '0', '-3787.46', '5013.52', '-20.1657', '5.31998', '2669:0 2671:0 2672:0 '),\n+('2671', 'tero300', '530', '3519', '3697', '62', '65', '0', '-3875.72', '4882.7', '-35.8103', '0.180317', '2670:0 2667:0 '),\n+('2672', 'tero301', '530', '3519', '3697', '62', '65', '0', '-3756.44', '5163.25', '-22.4721', '4.73093', '2670:0 2674:0 2673:0 '),\n+('2673', 'tero302', '530', '3519', '3697', '62', '65', '1', '-3750.45', '5404.46', '-3.33481', '1.38198', '2672:0 2674:0 2675:0 '),\n+('2674', 'tero303', '530', '3519', '3894', '62', '65', '0', '-3634.78', '5300.46', '-21.1377', '3.63217', '2672:0 2675:0 2695:0 2673:0 '),\n+('2675', 'tero304', '530', '3519', '3697', '62', '65', '0', '-3670.35', '5445.73', '-4.16488', '5.0239', '2674:0 2676:0 2695:0 2673:0 '),\n+('2676', 'tero305', '530', '3519', '3697', '62', '65', '0', '-3645.73', '5559.5', '-2.14497', '4.56524', '2675:0 2677:0 '),\n+('2677', 'tero306', '530', '3519', '3686', '62', '65', '0', '-3642.69', '5710.06', '-2.77685', '4.68385', '2676:0 2678:0 2679:0 '),\n+('2678', 'tero307', '530', '3519', '3519', '62', '65', '0', '-3501.7', '5745.82', '0.234953', '3.52538', '2677:0 2684:0 '),\n+('2679', 'tero308', '530', '3519', '3519', '62', '65', '0', '-3733.98', '5830.74', '-2.74856', '5.14723', '2677:0 2680:0 '),\n+('2680', 'tero309', '530', '3519', '3519', '62', '65', '0', '-3787.12', '5986.43', '-1.72887', '4.96659', '2679:0 2681:0 '),\n+('2681', 'tero310', '530', '3519', '3519', '62', '65', '0', '-3628.51', '6056.29', '-3.33948', '3.46806', '2680:0 2682:0 '),\n+('2682', 'tero311', '530', '3519', '3519', '62', '65', '0', '-3508.49', '6174.6', '4.08676', '3.93145', '2681:0 2683:0 '),\n+('2683', 'tero312', '530', '3519', '3519', '62', '65', '0', '-3378.56', '5998.98', '-6.51004', '2.27505', '2682:0 2684:0 2685:0 2696:0 '),\n+('2684', 'tero313', '530', '3519', '3519', '62', '65', '0', '-3476.42', '5902.44', '-30.7079', '0.739594', '2683:0 2678:0 2685:0 '),\n+('2685', 'tero314', '530', '3519', '3519', '62', '65', '0', '-3285.32', '5879.96', '-19.0985', '2.70702', '2684:0 2683:0 2686:0 2696:0 '),\n+('2686', 'tero315', '530', '3519', '3519', '62', '65', '0', '-3364.14', '5789.3', '-1.76223', '1.10479', '2685:0 2687:0 2696:0 '),\n+('2687', 'tero316', '530', '3519', '3697', '62', '65', '0', '-3305.33', '5740.49', '0.884062', '4.92025', '2686:0 2688:0 2696:0 '),\n+('2688', 'tero317', '530', '3519', '3697', '62', '65', '0', '-3286.23', '5602.34', '-6.97428', '4.90454', '2687:0 2689:0 '),\n+('2689', 'tero318', '530', '3519', '3697', '62', '65', '0', '-3117.93', '5582.45', '-7.6733', '6.23185', '2688:0 2690:0 2693:0 '),\n+('2690', 'tero319', '530', '3519', '3697', '62', '65', '0', '-2973.64', '5517.8', '-7.12772', '5.62318', '2689:0 2691:0 2693:0 '),\n+('2691', 'tero320', '530', '3519', '3697', '62', '65', '0', '-2940.15', '5358.09', '-13.875', '4.96972', '2690:0 2649:0 2692:0 2693:0 '),\n+('2692', 'tero321', '530', '3519', '3697', '62', '65', '0', '-2795.19', '5341.13', '-2.81699', '5.23676', '2691:0 '),\n+('2693', 'tero322', '530', '3519', '3697', '62', '65', '0', '-3141.55', '5381.37', '-22.1389', '0.524372', '2649:0 2689:0 2690:0 2691:0 2694:0 '),\n+('2694', 'tero323', '530', '3519', '3697', '62', '65', '0', '-3327.94', '5329.47', '-18.7903', '0.115962', '2693:0 2695:0 '),\n+('2695', 'tero324', '530', '3519', '3697', '62', '65', '0', '-3499.7', '5387.05', '-17.1808', '2.91198', '2694:0 2674:0 2675:0 '),\n+('2696', 'tero325', '530', '3519', '3519', '62', '65', '0', '-3184.45', '5888', '2.6866', '3.28897', '2683:0 2685:0 2686:0 2687:0 2697:0 2777:0 '),\n+('2697', 'tero326', '530', '3519', '3519', '62', '65', '0', '-3032.12', '5978.81', '4.34466', '3.72093', '2696:0 2777:0 '),\n+('2698', 'tero327', '530', '3519', '3697', '62', '65', '0', '-3134.88', '4193.43', '-7.28336', '1.29796', '2658:0 2659:0 2699:0 '),\n+('2699', 'tero328', '530', '3519', '3697', '62', '65', '0', '-3028.19', '4178.94', '-0.0653765', '2.95906', '2698:0 2700:0 '),\n+('2700', 'tero329', '530', '3519', '3519', '62', '65', '0', '-2977.23', '4157.96', '8.11812', '3.04232', '2699:0 2701:0 '),\n+('2701', 'tero330', '530', '3519', '3684', '62', '65', '3', '-2960.39', '4073.83', '2.27582', '5.22886', '2700:0 2702:0 '),\n+('2702', 'tero331', '530', '3519', '3684', '62', '65', '3', '-2931.59', '3983.95', '-0.908721', '4.85187', '2701:0 2703:0 '),\n+('2703', 'tero332', '530', '3519', '3519', '62', '65', '2', '-2826.95', '3982.66', '1.7483', '3.08078', '2702:0 2704:0 '),\n+('2704', 'tero333', '530', '3519', '3519', '62', '65', '0', '-2775.95', '3939.94', '2.93918', '0.30046', '2703:0 2705:0 '),\n+('2705', 'tero334', '530', '3519', '3519', '62', '65', '0', '-2653.89', '3959.73', '4.49025', '3.42242', '2704:0 2706:0 2745:0 '),\n+('2706', 'tero335', '530', '3519', '3519', '62', '65', '0', '-2556.49', '4106.29', '1.74147', '4.38846', '2705:0 2707:0 2744:0 '),\n+('2707', 'tero336', '530', '3519', '3519', '62', '65', '0', '-2371.13', '4150.23', '2.76251', '3.40672', '2706:0 2708:0 2717:0 '),\n+('2708', 'tero337', '530', '3519', '3519', '62', '65', '0', '-2284.4', '4192.35', '1.1876', '3.57951', '2707:0 2709:0 2717:0 '),\n+('2709', 'tero338', '530', '3519', '3675', '62', '65', '0', '-2258.83', '4242.98', '1.82659', '4.04289', '2708:0 2710:0 2717:0 '),\n+('2710', 'tero339', '530', '3519', '3519', '62', '65', '0', '-2454.44', '4246.04', '1.04828', '6.28128', '2709:0 2711:0 '),\n+('2711', 'tero340', '530', '3519', '3519', '62', '65', '4', '-2553.08', '4300.19', '21.2595', '5.70952', '2710:0 2712:0 '),\n+('2712', 'tero341', '530', '3519', '3683', '62', '65', '5', '-2594.46', '4387.9', '29.7655', '5.39144', '2711:0 2713:0 '),\n+('2713', 'tero342', '530', '3519', '3683', '62', '65', '5', '-2656.03', '4422.89', '36.1553', '5.66241', '2712:0 2714:0 '),\n+('2714', 'tero343', '530', '3519', '3683', '62', '65', '4', '-2719.28', '4376.75', '22.1052', '0.28636', '2713:0 2715:0 '),\n+('2715', 'tero344', '530', '3519', '3697', '62', '65', '0', '-2834.82', '4335.44', '5.95973', '3.39654', '2714:0 2716:0 '),\n+('2716', 'tero345', '530', '3519', '3697', '62', '65', '0', '-2909.54', '4349.69', '0.308415', '2.08492', '2715:0 2657:0 '),\n+('2717', 'tero346', '530', '3519', '3675', '62', '65', '0', '-2170.52', '4243.01', '5.56803', '3.39654', '2707:0 2708:0 2709:0 2718:0 2776:0 '),\n+('2718', 'tero347', '530', '3519', '3675', '62', '65', '0', '-2148.84', '4189.65', '7.46099', '4.90842', '2717:0 2719:0 2720:0 2776:0 '),\n+('2719', 'tero348', '530', '3519', '3519', '62', '65', '0', '-2169.46', '4024.43', '0.27975', '4.58248', '2718:0 2742:0 2747:0 '),\n+('2720', 'tero349', '530', '3519', '3675', '62', '65', '0', '-2043.89', '4276.14', '4.85305', '3.85599', '2718:0 2721:0 2734:0 2776:0 '),\n+('2721', 'tero350', '530', '3519', '3519', '62', '65', '0', '-2003.56', '4443.33', '7.66134', '1.22491', '2720:0 2722:0 2734:0 2739:0 2776:0 '),\n+('2722', 'tero351', '530', '3519', '3674', '62', '65', '0', '-1957.79', '4600.09', '4.55853', '1.42126', '2721:0 2723:0 2731:0 2734:0 2739:0 '),\n+('2723', 'tero352', '530', '3519', '3674', '62', '65', '0', '-1958.96', '4765.62', '-1.86355', '1.51943', '2722:0 2724:0 2739:0 2741:0 '),\n+('2724', 'tero353', '530', '3519', '3519', '62', '65', '0', '-1920.31', '4893.8', '2.58999', '4.29189', '2723:0 2635:0 2725:0 2741:0 '),\n+('2725', 'tero354', '530', '3519', '3674', '62', '65', '0', '-1767.42', '4808.53', '10.9381', '2.60326', '2724:0 2726:0 '),\n+('2726', 'tero355', '530', '3519', '3519', '62', '65', '0', '-1610.9', '4687.94', '-0.462587', '3.37452', '2725:0 2727:0 '),\n+('2727', 'tero356', '530', '3519', '3519', '62', '65', '0', '-1438.54', '4646.53', '23.7191', '3.09413', '2726:0 2728:0 '),\n+('2728', 'tero357', '530', '3519', '3689', '62', '65', '0', '-1505.3', '4470.55', '41.7643', '1.30342', '2727:0 2729:0 2733:0 '),\n+('2729', 'tero358', '530', '3519', '3674', '62', '65', '0', '-1652.18', '4568.13', '2.67411', '5.85088', '2728:0 2730:0 '),\n+('2730', 'tero359', '530', '3519', '3674', '62', '65', '0', '-1796.78', '4588.16', '10.9079', '6.12577', '2729:0 2731:0 2732:0 2734:0 '),\n+('2731', 'tero360', '530', '3519', '3674', '62', '65', '0', '-1895.32', '4551.89', '11.162', '0.506242', '2730:0 2722:0 2732:0 2734:0 2739:0 '),\n+('2732', 'tero361', '530', '3519', '3689', '62', '65', '0', '-1732.56', '4448.64', '2.34425', '5.26889', '2731:0 2730:0 2733:0 2734:0 '),\n+('2733', 'tero362', '530', '3519', '3689', '62', '65', '0', '-1608.22', '4353.23', '36.5945', '1.16519', '2732:0 2728:0 '),\n+('2734', 'tero363', '530', '3519', '3519', '62', '65', '0', '-1921.27', '4373.25', '1.92765', '2.16501', '2720:0 2721:0 2722:0 2730:0 2731:0 2732:0 2735:0 2776:0 '),\n+('2735', 'tero364', '530', '3519', '3519', '62', '65', '0', '-1840.29', '4219.11', '25.1803', '2.004', '2734:0 2736:0 2776:0 '),\n+('2736', 'tero365', '530', '3519', '3519', '62', '65', '0', '-1752.97', '4184.94', '57.0737', '5.13381', '2735:0 2737:0 2776:0 '),\n+('2737', 'tero366', '530', '3519', '3858', '62', '65', '0', '-1716.88', '4074.81', '63.5817', '4.67042', '2736:0 2738:0 '),\n+('2738', 'tero367', '530', '3519', '3858', '62', '65', '0', '-1691.82', '3935.7', '48.2267', '4.84636', '2737:0 2419:0 '),\n+('2739', 'tero368', '530', '3519', '3519', '62', '65', '0', '-2102.76', '4635.13', '-7.65692', '2.95747', '2721:0 2722:0 2723:0 2731:0 2740:0 '),\n+('2740', 'tero369', '530', '3519', '3519', '62', '65', '0', '-2257.36', '4704.28', '-0.0780256', '1.2021', '2739:0 '),\n+('2741', 'tero370', '530', '3519', '3519', '62', '65', '0', '-2070.88', '4924.17', '13.5597', '3.10277', '2634:0 2635:0 2636:0 2637:0 2638:0 2723:0 2724:0 '),\n+('2742', 'tero371', '530', '3519', '3519', '62', '65', '0', '-2246.8', '3880.41', '2.21742', '1.23746', '2719:0 2743:0 2747:0 '),\n+('2743', 'tero372', '530', '3519', '3519', '62', '65', '0', '-2340.28', '3972.87', '-13.2572', '5.73387', '2742:0 2744:0 2747:0 '),\n+('2744', 'tero373', '530', '3519', '3519', '62', '65', '0', '-2488.61', '4019.54', '0.242718', '5.94199', '2743:0 2706:0 2746:0 '),\n+('2745', 'tero374', '530', '3519', '3860', '62', '65', '0', '-2554.91', '3912.09', '9.61175', '2.80825', '2705:0 2746:0 '),\n+('2746', 'tero375', '530', '3519', '3860', '62', '65', '0', '-2485.03', '3909.12', '5.70774', '1.75582', '2745:0 2744:0 '),\n+('2747', 'tero376', '530', '3519', '3519', '62', '65', '0', '-2259.61', '3793.94', '0.912792', '1.33958', '2719:0 2742:0 2743:0 2748:0 2771:0 '),\n+('2748', 'tero377', '530', '3519', '3519', '62', '65', '0', '-2386.92', '3640.31', '1.09836', '4.00208', '2747:0 2749:0 2758:0 '),\n+('2749', 'tero378', '530', '3519', '3519', '62', '65', '0', '-2479.53', '3552.42', '1.40969', '5.89488', '2748:0 2750:0 2759:0 '),\n+('2750', 'tero379', '530', '3519', '3519', '62', '65', '0', '-2345.97', '3468.35', '-9.89249', '2.70223', '2749:0 2751:0 2759:0 '),\n+('2751', 'tero380', '530', '3519', '3519', '62', '65', '0', '-2312.38', '3409.64', '-11.2993', '4.48901', '2750:0 2752:0 '),\n+('2752', 'tero381', '530', '3519', '3681', '62', '65', '0', '-2354.51', '3272.69', '-1.60544', '1.28851', '2751:0 2753:0 '),\n+('2753', 'tero382', '530', '3519', '3681', '62', '65', '0', '-2370.38', '3203.41', '-1.58182', '4.34763', '2752:0 2754:0 2762:0 '),\n+('2754', 'tero383', '530', '3519', '3681', '62', '65', '0', '-2266.46', '3160.45', '-5.07597', '2.81611', '2753:0 2755:0 '),\n+('2755', 'tero384', '530', '3519', '3519', '62', '65', '0', '-2151', '3259.96', '-30.9173', '0.993986', '2754:0 2756:0 '),\n+('2756', 'tero385', '530', '3519', '3519', '62', '65', '0', '-2122.05', '3416.4', '-46.8967', '4.54007', '2755:0 2757:0 2771:0 '),\n+('2757', 'tero386', '530', '3519', '3519', '62', '65', '0', '-2185.17', '3533.98', '-39.5174', '5.06236', '2756:0 2758:0 2771:0 '),\n+('2758', 'tero387', '530', '3519', '3519', '62', '65', '0', '-2281.3', '3632.39', '-12.7757', '5.10555', '2757:0 2748:0 2771:0 '),\n+('2759', 'tero388', '530', '3519', '3519', '62', '65', '0', '-2591.73', '3492.79', '0.37378', '0.569874', '2749:0 2750:0 2760:0 '),\n+('2760', 'tero389', '530', '3519', '3519', '62', '65', '0', '-2706.59', '3361.89', '-0.445352', '4.0649', '2759:0 2761:0 2763:0 2764:0 '),\n+('2761', 'tero390', '530', '3519', '3519', '62', '65', '0', '-2599.6', '3260.29', '1.92252', '2.39202', '2760:0 2762:0 2763:0 '),\n+('2762', 'tero391', '530', '3519', '3519', '62', '65', '0', '-2474.91', '3212.52', '3.71098', '0.644506', '2761:0 2753:0 '),\n+('2763', 'tero392', '530', '3519', '3519', '62', '65', '0', '-2789.26', '3261.1', '5.82088', '0.813367', '2760:0 2761:0 3534:0 '),\n+('2764', 'tero393', '530', '3519', '3685', '62', '65', '0', '-2834.79', '3413.38', '-40.4077', '5.88312', '2760:0 2765:0 2770:0 '),\n+('2765', 'tero394', '530', '3519', '3519', '62', '65', '0', '-2792.39', '3494.53', '-29.9885', '3.12636', '2764:0 2766:0 '),\n+('2766', 'tero395', '530', '3519', '3685', '62', '65', '0', '-2893.22', '3498.45', '-28.8532', '2.48233', '2765:0 2767:0 '),\n+('2767', 'tero396', '530', '3519', '3685', '62', '65', '0', '-2966.27', '3553.99', '-6.76611', '5.48021', '2766:0 2768:0 '),\n+('2768', 'tero397', '530', '3519', '3685', '62', '65', '0', '-2986.16', '3462.38', '0.040144', '1.25475', '2767:0 2769:0 '),\n+('2769', 'tero398', '530', '3519', '3685', '62', '65', '0', '-2966.04', '3366.93', '-1.18287', '0.0020256', '2768:0 2770:0 '),\n+('2770', 'tero399', '530', '3519', '3519', '62', '65', '0', '-2877.47', '3356.32', '-19.7096', '2.96298', '2769:0 2764:0 '),\n+('2771', 'tero400', '530', '3519', '3519', '62', '65', '0', '-2096.95', '3654.03', '-54.8181', '4.15287', '2747:0 2756:0 2757:0 2758:0 2772:0 '),\n+('2772', 'tero401', '530', '3519', '3519', '62', '65', '0', '-2064.06', '3807.53', '1.04682', '4.11754', '2771:0 2773:0 '),\n+('2773', 'tero402', '530', '3519', '3676', '62', '65', '0', '-1908.63', '3920.4', '-2.85436', '0.610731', '2772:0 2774:0 2775:0 '),\n+('2774', 'tero403', '530', '3519', '3519', '62', '65', '0', '-1975.78', '4077.99', '-0.0257859', '4.60841', '2773:0 2775:0 2776:0 '),\n+('2775', 'tero404', '530', '3519', '3676', '62', '65', '0', '-2060.38', '3925.05', '-0.749629', '0.524347', '2774:0 2773:0 '),\n+('2776', 'tero405', '530', '3519', '3519', '62', '65', '0', '-1932.67', '4229.67', '0.0246133', '4.45526', '2717:0 2718:0 2720:0 2721:0 2734:0 2735:0 2736:0 2774:0 '),\n+('2777', 'nag406', '530', '3518', '3788', '62', '65', '0', '-2979.16', '5983.95', '6.75645', '5.87684', '2696:0 2697:0 2778:0 '),\n+('2778', 'nag407', '530', '3518', '3788', '64', '67', '0', '-2903.9', '5958.93', '14.5613', '0.547909', '2777:0 2779:0 '),\n+('2779', 'nag408', '530', '3518', '3788', '64', '67', '0', '-2695.32', '6074.17', '39.2839', '0.398684', '2778:0 2780:0 '),\n+('2780', 'nag409', '530', '3518', '3518', '64', '67', '0', '-2642.01', '6196.52', '35.4889', '4.38459', '2779:0 2781:0 2784:0 '),\n+('2781', 'nag410', '530', '3518', '3610', '64', '67', '0', '-2584.26', '6153', '22.5432', '1.45591', '2780:0 2782:0 2832:0 '),\n+('2782', 'nag411', '530', '3518', '3518', '64', '67', '0', '-2469.6', '6354.46', '29.3999', '3.93692', '2781:0 2783:0 2802:0 2822:0 '),\n+('2783', 'nag412', '530', '3518', '3518', '64', '67', '0', '-2598.81', '6353.52', '38.4982', '4.67519', '2782:0 2784:0 2802:0 '),\n+('2784', 'nag413', '530', '3518', '3518', '64', '67', '0', '-2647.16', '6298.81', '39.1645', '4.36889', '2783:0 2780:0 2785:0 '),\n+('2785', 'nag414', '530', '3518', '3518', '64', '67', '0', '-2698.48', '6403.1', '37.6375', '5.24131', '2784:0 2786:0 '),\n+('2786', 'nag416', '530', '3518', '3637', '64', '67', '0', '-2811.55', '6437.45', '63.1489', '2.87099', '2787:0 2788:0 2792:0 2785:0 '),\n+('2787', 'nag417', '530', '3518', '3637', '64', '67', '0', '-2883.12', '6557.15', '51.9561', '5.05205', '2786:0 2790:0 2793:0 '),\n+('2788', 'nag418', '530', '3518', '3637', '64', '67', '0', '-2866.92', '6391.89', '80.9253', '0.732363', '2786:0 2789:0 '),\n+('2789', 'nag419', '530', '3518', '3637', '64', '67', '0', '-2947.68', '6377.55', '94.6931', '0.234009', '2788:0 2790:0 2791:0 '),\n+('2790', 'nag420', '530', '3518', '3637', '64', '67', '0', '-2933.99', '6526.24', '74.3112', '5.85317', '2787:0 2789:0 '),\n+('2791', 'nag421', '530', '3518', '3637', '64', '67', '0', '-2858.26', '6300.73', '73.5168', '2.16181', '2789:0 2792:0 '),\n+('2792', 'nag422', '530', '3518', '3637', '64', '67', '0', '-2800.78', '6320.06', '63.9422', '1.52171', '2791:0 2786:0 '),\n+('2793', 'nag423', '530', '3518', '3518', '64', '67', '0', '-2813.58', '6624.23', '27.952', '0.826629', '2787:0 2794:0 2797:0 '),\n+('2794', 'nag424', '530', '3518', '3518', '64', '67', '0', '-2876.27', '6701.94', '18.9403', '5.46206', '2793:0 2795:0 '),\n+('2795', 'nag425', '530', '3518', '3518', '64', '67', '0', '-2695.5', '6579.52', '23.3102', '2.71395', '2794:0 2796:0 '),\n+('2796', 'nag426', '530', '3518', '3518', '64', '67', '0', '-2618.02', '6729.9', '-1.1338', '4.0884', '2795:0 2797:0 '),\n+('2797', 'nag427', '530', '3518', '3518', '64', '67', '0', '-2762.9', '6813.59', '-4.67732', '4.5989', '2793:0 2796:0 2798:0 2933:0 '),\n+('2798', 'nag428', '530', '3518', '3518', '64', '67', '0', '-2754.65', '6993.51', '-7.49834', '4.92564', '2797:0 2799:0 2933:0 2934:0 '),\n+('2799', 'nag429', '530', '3518', '3518', '64', '67', '0', '-2554.45', '7061.91', '-8.95898', '0.31535', '2798:0 2800:0 2803:0 '),\n+('2800', 'nag430', '530', '3518', '3518', '64', '67', '0', '-2401.18', '6918.47', '-1.9365', '5.18482', '2799:0 2801:0 2803:0 2814:0 2825:0 '),\n+('2801', 'nag431', '530', '3518', '3518', '64', '67', '0', '-2443.4', '6718.82', '0.5495', '4.75286', '2800:0 2802:0 2824:0 '),\n+('2802', 'nag432', '530', '3518', '3518', '64', '67', '0', '-2465.96', '6485.46', '18.388', '4.48583', '2801:0 2782:0 2783:0 '),\n+('2803', 'nag433', '530', '3518', '3518', '64', '67', '0', '-2495.17', '7067.29', '-6.61379', '5.16519', '2799:0 2800:0 2804:0 2814:0 '),\n+('2804', 'nag434', '530', '3518', '3518', '64', '67', '2', '-2545.1', '7142.88', '17.2089', '5.26259', '2803:0 2805:0 '),\n+('2805', 'nag435', '530', '3518', '3626', '64', '67', '3', '-2587.61', '7240.05', '13.2805', '5.09373', '2804:0 2806:0 2807:0 '),\n+('2806', 'nag436', '530', '3518', '3626', '64', '67', '2', '-2552.46', '7299.13', '13.4929', '4.96416', '2805:0 2809:0 '),\n+('2807', 'nag437', '530', '3518', '3626', '64', '67', '2', '-2670.89', '7210.11', '23.8723', '0.310654', '2805:0 2808:0 '),\n+('2808', 'nag438', '530', '3518', '3626', '64', '67', '3', '-2655.58', '7280.08', '30.7964', '4.57931', '2807:0 '),\n+('2809', 'nag439', '530', '3518', '3626', '64', '67', '2', '-2487.77', '7333.59', '-15.1601', '0.389211', '2806:0 2810:0 '),\n+('2810', 'nag440', '530', '3518', '3518', '64', '67', '2', '-2287.49', '7419.75', '-15.9035', '3.46169', '2809:0 2811:0 2867:0 '),\n+('2811', 'nag441', '530', '3518', '3518', '64', '67', '0', '-2167.73', '7320.37', '-34.5989', '5.71198', '2810:0 2866:0 2812:0 '),\n+('2812', 'nag443', '530', '3518', '3705', '64', '67', '0', '-2271.92', '7267.29', '-57.0529', '4.8127', '2813:0 2811:0 '),\n+('2813', 'nag444', '530', '3518', '3705', '64', '67', '0', '-2261.19', '7161.5', '-56.5907', '4.81663', '2814:0 2815:0 2812:0 '),\n+('2814', 'nag445', '530', '3518', '3518', '64', '67', '0', '-2347.48', '7041.26', '-12.5344', '2.817', '2813:0 2800:0 2803:0 '),\n+('2815', 'nag447', '530', '3518', '3705', '64', '67', '0', '-2116.24', '7209.42', '-112.779', '5.97431', '2813:0 2816:0 '),\n+('2816', 'nag448', '530', '3518', '3705', '64', '67', '0', '-1904.26', '7175.34', '-92.9691', '3.12725', '2817:0 2815:0 '),\n+('2817', 'nag449', '530', '3518', '3705', '64', '67', '0', '-1985.26', '6900.65', '-85.609', '5.34993', '2816:0 2818:0 '),\n+('2818', 'nag450', '530', '3518', '3518', '64', '67', '0', '-1848.57', '6696.54', '-53.151', '5.40883', '2817:0 2819:0 2826:0 '),\n+('2819', 'nag451', '530', '3518', '3518', '64', '67', '0', '-1730.63', '6547.09', '19.5667', '5.00434', '2818:0 2820:0 2826:0 2839:0 2843:0 '),\n+('2820', 'nag452', '530', '3518', '3518', '64', '67', '0', '-1929.46', '6510.46', '16.1863', '2.96231', '2819:0 2821:0 2839:0 2928:0 '),\n+('2821', 'nag453', '530', '3518', '3638', '64', '67', '0', '-2134.61', '6517.76', '14.0285', '6.16673', '2820:0 2822:0 2823:0 2839:0 '),\n+('2822', 'nag454', '530', '3518', '3518', '64', '67', '0', '-2312.35', '6407.62', '22.8307', '0.6603', '2821:0 2782:0 2823:0 '),\n+('2823', 'nag455', '530', '3518', '3518', '64', '67', '0', '-2275.72', '6586.73', '3.55526', '5.16535', '2822:0 2821:0 2824:0 2831:0 '),\n+('2824', 'nag456', '530', '3518', '3518', '64', '67', '0', '-2337.25', '6706.87', '-0.736603', '5.08052', '2823:0 2801:0 '),\n+('2825', 'nag457', '530', '3518', '3518', '64', '67', '0', '-2230.6', '6874.1', '-6.45156', '5.78973', '2800:0 '),\n+('2826', 'nag458', '530', '3518', '3518', '64', '67', '0', '-1596.41', '6719.35', '6.94102', '2.95446', '2819:0 2818:0 2827:0 2843:0 '),\n+('2827', 'nag459', '530', '3518', '3518', '64', '67', '0', '-1749.49', '6887.02', '-31.8672', '3.0919', '2826:0 2828:0 2856:0 '),\n+('2828', 'nag460', '530', '3518', '3705', '64', '67', '0', '-2033.22', '6893.42', '-39.0869', '0.112087', '2827:0 2829:0 '),\n+('2829', 'nag461', '530', '3518', '3638', '64', '67', '0', '-2099.87', '6812.26', '-29.9742', '0.936751', '2828:0 2830:0 '),\n+('2830', 'nag462', '530', '3518', '3638', '64', '67', '0', '-2097.69', '6747.79', '-3.22856', '3.89457', '2829:0 2831:0 '),\n+('2831', 'nag463', '530', '3518', '3638', '64', '67', '0', '-2181.79', '6690.97', '-0.800369', '0.623385', '2830:0 2823:0 '),\n+('2832', 'nag464', '530', '3518', '3610', '64', '67', '0', '-2569.73', '6270.11', '18.4891', '5.91894', '2781:0 2833:0 '),\n+('2833', 'nag465', '530', '3518', '3610', '64', '67', '0', '-2480.31', '6262.64', '30.7263', '5.11194', '2832:0 2834:0 '),\n+('2834', 'nag466', '530', '3518', '3610', '64', '67', '0', '-2447.6', '6170.75', '50.9756', '3.42333', '2833:0 2835:0 '),\n+('2835', 'nag467', '530', '3518', '3610', '64', '67', '0', '-2505.35', '6175.86', '59.938', '5.6892', '2834:0 2836:0 '),\n+('2836', 'nag468', '530', '3518', '3610', '64', '67', '0', '-2439.68', '6122.93', '84.0967', '2.43372', '2835:0 2837:0 '),\n+('2837', 'nag469', '530', '3518', '3610', '64', '67', '0', '-2332.91', '6161.97', '53.5534', '0.177271', '2836:0 2838:0 '),\n+('2838', 'nag470', '530', '3518', '3610', '64', '67', '0', '-2259.12', '6100.84', '76.839', '2.48242', '2837:0 '),\n+('2839', 'nag471', '530', '3518', '3518', '64', '67', '0', '-1938.01', '6408.13', '38.4565', '3.95504', '2819:0 2820:0 2821:0 2840:0 2928:0 '),\n+('2840', 'nag472', '530', '3518', '3518', '64', '67', '0', '-2080.87', '6349.27', '43.0054', '5.9188', '2839:0 2841:0 2928:0 '),\n+('2841', 'nag473', '530', '3518', '3634', '64', '67', '0', '-1853.87', '6319.73', '46.4678', '2.96543', '2840:0 2842:0 2928:0 '),\n+('2842', 'nag474', '530', '3518', '3518', '64', '67', '0', '-1699.25', '6393.14', '40.5718', '0.499271', '2841:0 2843:0 2927:0 '),\n+('2843', 'nag475', '530', '3518', '3518', '64', '67', '0', '-1534.13', '6557.83', '19.5951', '2.01038', '2826:0 2842:0 2819:0 2844:0 2927:0 '),\n+('2844', 'nag476', '530', '3518', '3518', '64', '67', '0', '-1482.81', '6727.6', '24.7441', '1.27603', '2843:0 2845:0 '),\n+('2845', 'nag477', '530', '3518', '3518', '64', '67', '0', '-1390.93', '6854.77', '28.5326', '0.624149', '2844:0 2856:0 2853:0 '),\n+('2846', 'nag480', '530', '3518', '3613', '64', '67', '4', '-1409.34', '7112.02', '33.814', '1.09183', '2847:0 2853:0 '),\n+('2847', 'nag481', '530', '3518', '3613', '64', '67', '5', '-1329.62', '7212.68', '33.1588', '0.853479', '2846:0 2848:0 2855:0 '),\n+('2848', 'nag482', '530', '3518', '3613', '64', '67', '4', '-1270.74', '7314.59', '33.6816', '4.21027', '2847:0 2849:0 '),\n+('2849', 'nag483', '530', '3518', '3613', '64', '67', '4', '-1220.36', '7373.07', '33.23', '4.20635', '2848:0 2850:0 2851:0 '),\n+('2850', 'nag484', '530', '3518', '3518', '64', '67', '0', '-1212.08', '7477.88', '22.0868', '1.54857', '2849:0 2862:0 2926:0 '),\n+('2851', 'nag485', '530', '3518', '3613', '64', '67', '4', '-1182.14', '7317.1', '34.1095', '4.44589', '2849:0 2852:0 '),\n+('2852', 'nag486', '530', '3518', '3613', '64', '67', '4', '-1195.71', '7212.96', '50.7515', '1.47708', '2851:0 2854:0 '),\n+('2853', 'nag487', '530', '3518', '3613', '64', '67', '4', '-1266.65', '6971.73', '37.8915', '2.73527', '2845:0 2846:0 2854:0 '),\n+('2854', 'nag488', '530', '3518', '3613', '64', '67', '5', '-1222.4', '7167.59', '57.2656', '4.44744', '2852:0 2855:0 2853:0 '),\n+('2855', 'nag489', '530', '3518', '3613', '64', '67', '4', '-1276.87', '7200.65', '48.3758', '5.06006', '2847:0 2854:0 '),\n+('2856', 'nag491', '530', '3518', '3518', '64', '67', '0', '-1550.75', '6994.79', '2.3684', '5.6216', '2845:0 2827:0 2857:0 '),\n+('2857', 'nag492', '530', '3518', '3518', '64', '67', '0', '-1663.57', '7019.01', '0.239528', '1.55716', '2856:0 2858:0 2864:0 '),\n+('2858', 'nag493', '530', '3518', '3518', '64', '67', '0', '-1624.79', '7247.01', '1.99533', '4.52597', '2857:0 2859:0 2864:0 '),\n+('2859', 'nag494', '530', '3518', '3518', '64', '67', '0', '-1561.04', '7386.09', '1.02012', '0.650024', '2858:0 2860:0 2863:0 '),\n+('2860', 'nag495', '530', '3518', '3518', '64', '67', '0', '-1369.87', '7525.98', '8.40119', '6.06534', '2859:0 2861:0 2968:0 '),\n+('2861', 'nag496', '530', '3518', '3628', '64', '67', '0', '-1342.35', '7749.72', '-4.85434', '4.51025', '2860:0 2862:0 2959:0 '),\n+('2862', 'nag497', '530', '3518', '3518', '64', '67', '0', '-1244.21', '7675', '9.34848', '4.90297', '2861:0 2850:0 2919:0 '),\n+('2863', 'nag498', '530', '3518', '3518', '64', '67', '0', '-1822.25', '7460.83', '-6.36199', '6.02215', '2859:0 2864:0 2971:0 '),\n+('2864', 'nag499', '530', '3518', '3518', '64', '67', '0', '-1788.32', '7255.55', '-7.10964', '1.73702', '2863:0 2858:0 2857:0 2865:0 '),\n+('2865', 'nag500', '530', '3518', '3518', '64', '67', '0', '-1876.28', '7247.82', '-15.0226', '2.58134', '2864:0 2866:0 '),\n+('2866', 'nag501', '530', '3518', '3518', '64', '67', '0', '-2010.2', '7318.56', '-33.8028', '5.83525', '2865:0 2811:0 '),\n+('2867', 'nag502', '530', '3518', '3518', '64', '67', '0', '-2284.88', '7613.96', '-8.38883', '4.91632', '2810:0 2868:0 2869:0 2882:0 '),\n+('2868', 'nag503', '530', '3518', '3518', '64', '67', '0', '-2110.77', '7507.01', '-30.9661', '2.75255', '2867:0 '),\n+('2869', 'nag504', '530', '3518', '3518', '64', '67', '0', '-2280.53', '7760.34', '-25.2768', '3.08634', '2867:0 2870:0 2882:0 2953:0 '),\n+('2870', 'nag505', '530', '3518', '3631', '64', '67', '0', '-2202.48', '7982.31', '-19.9501', '4.31156', '2869:0 2871:0 2884:0 2953:0 '),\n+('2871', 'nag506', '530', '3518', '3518', '64', '67', '0', '-2164.5', '8163.38', '-23.2432', '1.37024', '2870:0 2872:0 2884:0 2949:0 '),\n+('2872', 'nag507', '530', '3518', '3518', '64', '67', '0', '-2186.27', '8355.19', '-20.7293', '1.74723', '2871:0 2873:0 2885:0 2949:0 '),\n+('2873', 'nag508', '530', '3518', '3518', '64', '67', '0', '-2261.53', '8552.19', '-18.4527', '1.93573', '2872:0 2874:0 2885:0 2886:0 2887:0 '),\n+('2874', 'nag509', '530', '3518', '3631', '64', '67', '0', '-2454.9', '8618.3', '-25.5244', '2.80359', '2873:0 2875:0 2886:0 '),\n+('2875', 'nag510', '530', '3518', '3518', '64', '67', '0', '-2638.28', '8663.06', '-21.4046', '2.94104', '2874:0 2876:0 2886:0 '),\n+('2876', 'nag511', '530', '3518', '3631', '64', '67', '0', '-2824.97', '8623.37', '-27.21', '4.0995', '2875:0 2877:0 '),\n+('2877', 'nag512', '530', '3518', '3518', '64', '67', '0', '-2867.65', '8450.08', '-30.1391', '4.44507', '2876:0 2878:0 '),\n+('2878', 'nag513', '530', '3518', '3631', '64', '67', '0', '-2899.04', '8250.79', '-34.7269', '4.57858', '2877:0 2879:0 '),\n+('2879', 'nag514', '530', '3518', '3518', '64', '67', '0', '-2888.4', '8048.68', '-26.7216', '5.47001', '2878:0 2880:0 '),\n+('2880', 'nag515', '530', '3518', '3518', '64', '67', '0', '-2777.53', '7867.47', '-33.0086', '5.33648', '2879:0 2881:0 2938:0 '),\n+('2881', 'nag516', '530', '3518', '3518', '64', '67', '0', '-2646.42', '7719.28', '-30.5333', '5.53675', '2880:0 2882:0 2883:0 2938:0 '),\n+('2882', 'nag517', '530', '3518', '3518', '64', '67', '0', '-2469.37', '7698.03', '-17.5014', '0.0114679', '2869:0 2881:0 2867:0 2883:0 '),\n+('2883', 'nag518', '530', '3518', '3631', '64', '67', '0', '-2548.6', '7872.59', '-53.4948', '1.39927', '2882:0 2881:0 2884:0 '),\n+('2884', 'nag519', '530', '3518', '3631', '64', '67', '0', '-2377.16', '8119.54', '-42.3084', '5.94673', '2883:0 2870:0 2871:0 2885:0 '),\n+('2885', 'nag520', '530', '3518', '3631', '64', '67', '0', '-2383.8', '8337.19', '-39.2254', '0.68063', '2884:0 2872:0 2873:0 2886:0 '),\n+('2886', 'nag521', '530', '3518', '3631', '64', '67', '0', '-2489.29', '8499.84', '-36.8544', '3.07375', '2885:0 2874:0 2873:0 2875:0 '),\n+('2887', 'nag522', '530', '3518', '3518', '64', '67', '0', '-2206.87', '8693.03', '-3.10935', '4.27148', '2873:0 2888:0 2939:0 '),\n+('2888', 'nag523', '530', '3518', '3518', '64', '67', '1', '-2042.46', '8705.35', '18.0019', '0.174061', '2887:0 2889:0 '),\n+('2889', 'nag524', '530', '3518', '3518', '64', '67', '0', '-1841.7', '8722.11', '25.2892', '5.96245', '2888:0 2890:0 '),\n+('2890', 'nag525', '530', '3518', '3518', '64', '67', '0', '-1640.31', '8750.19', '32.1406', '6.19414', '2889:0 2891:0 2913:0 2941:0 '),\n+('2891', 'nag526', '530', '3518', '3518', '64', '67', '0', '-1515.41', '8730.96', '27.2727', '5.36163', '2890:0 2892:0 2913:0 2894:0 '),\n+('2892', 'nag527', '530', '3518', '3518', '64', '67', '0', '-1371.92', '8548.95', '11.8041', '3.728', '2891:0 2893:0 2898:0 2904:0 '),\n+('2893', 'nag528', '530', '3518', '3622', '64', '67', '0', '-1460.34', '8490.57', '4.09139', '0.714427', '2892:0 2897:0 2965:0 '),\n+('2894', 'nag530', '530', '3518', '3622', '64', '67', '0', '-1570.36', '8600.16', '4.98091', '3.67147', '2891:0 2895:0 2897:0 '),\n+('2895', 'nag531', '530', '3518', '3622', '64', '67', '0', '-1642.07', '8541.56', '-12.6482', '5.37185', '2896:0 2894:0 '),\n+('2896', 'nag532', '530', '3518', '3622', '64', '67', '0', '-1595.85', '8476.21', '-11.7076', '0.541643', '2895:0 2897:0 '),\n+('2897', 'nag533', '530', '3518', '3622', '64', '67', '0', '-1526.1', '8519.38', '1.01318', '3.57721', '2896:0 2893:0 2894:0 '),\n+('2898', 'nag534', '530', '3518', '3518', '64', '67', '0', '-1207.6', '8431.13', '20.2568', '5.9334', '2892:0 2899:0 2904:0 '),\n+('2899', 'nag535', '530', '3518', '3518', '64', '67', '0', '-1095.6', '8405.41', '20.4451', '5.79204', '2898:0 2900:0 2904:0 '),\n+('2900', 'nag536', '530', '3518', '3518', '64', '67', '0', '-953.793', '8333.32', '22.8678', '0.0193606', '2899:0 2901:0 2916:0 '),\n+('2901', 'nag537', '530', '3518', '3518', '64', '67', '0', '-745.188', '8393.11', '33.9484', '0.313885', '2900:0 2902:0 '),\n+('2902', 'nag538', '530', '3518', '3763', '64', '67', '0', '-588.034', '8447.14', '64.625', '6.12976', '2901:0 2903:0 '),\n+('2903', 'nag539', '530', '3518', '3763', '64', '67', '0', '-494.831', '8433.32', '38.1295', '6.07479', '2902:0 2539:0 '),\n+('2904', 'nag540', '530', '3518', '3518', '64', '67', '0', '-1168.9', '8591.89', '36.759', '1.21709', '2892:0 2898:0 2899:0 2905:0 2915:0 '),\n+('2905', 'nag541', '530', '3518', '3617', '64', '67', '0', '-1067.77', '8749.39', '84.4276', '1.60586', '2904:0 2906:0 '),\n+('2906', 'nag542', '530', '3518', '3617', '64', '67', '0', '-1080.66', '8823.02', '100.874', '1.41736', '2905:0 2907:0 '),\n+('2907', 'nag543', '530', '3518', '3617', '64', '67', '0', '-1090.98', '8945.42', '103.447', '0.588767', '2906:0 2908:0 '),\n+('2908', 'nag544', '530', '3518', '3617', '64', '67', '0', '-963.69', '8887.28', '146.6', '3.44055', '2907:0 2909:0 '),\n+('2909', 'nag545', '530', '3518', '3617', '64', '67', '0', '-868.709', '8940.17', '156.257', '5.74571', '2908:0 2910:0 '),\n+('2910', 'nag546', '530', '3518', '3617', '64', '67', '0', '-752.326', '8861.16', '182.978', '4.2134', '2909:0 2911:0 2912:0 '),\n+('2911', 'nag547', '530', '3518', '3617', '64', '67', '0', '-651.777', '8791', '201.252', '0.180777', '2910:0 '),\n+('2912', 'nag553', '530', '3518', '3617', '64', '67', '0', '-902.893', '8685.38', '170.054', '1.29602', '2910:0 '),\n+('2913', 'nag554', '530', '3518', '3625', '64', '67', '0', '-1431.81', '8885.86', '36.9729', '1.07333', '2890:0 2891:0 2914:0 2948:0 '),\n+('2914', 'nag555', '530', '3518', '3625', '64', '67', '0', '-1305.49', '8958.42', '58.5828', '5.24728', '2913:0 2915:0 '),\n+('2915', 'nag556', '530', '3518', '3518', '64', '67', '0', '-1225.12', '8803.57', '39.6271', '4.88207', '2914:0 2904:0 '),\n+('2916', 'nag557', '530', '3518', '3518', '64', '67', '0', '-968.504', '8169.97', '14.3663', '5.25514', '2900:0 2917:0 '),\n+('2917', 'nag558', '530', '3518', '3518', '64', '67', '0', '-917.128', '8072.21', '21.4411', '5.19624', '2916:0 2918:0 2920:0 '),\n+('2918', 'nag559', '530', '3518', '3518', '64', '67', '0', '-1020.93', '7945.51', '22.9619', '4.026', '2917:0 2919:0 2920:0 '),\n+('2919', 'nag560', '530', '3518', '3518', '64', '67', '0', '-1146.56', '7828.51', '14.0417', '4.1548', '2918:0 2862:0 '),\n+('2920', 'nag561', '530', '3518', '3616', '64', '67', '0', '-852.563', '7887.28', '40.6401', '4.6339', '2917:0 2918:0 2921:0 '),\n+('2921', 'nag562', '530', '3518', '3616', '64', '67', '0', '-830.358', '7797.91', '38.3027', '4.69279', '2920:0 2922:0 '),\n+('2922', 'nag563', '530', '3518', '3616', '64', '67', '0', '-829.954', '7695.84', '37.7371', '5.2465', '2921:0 2923:0 '),\n+('2923', 'nag564', '530', '3518', '3616', '64', '67', '0', '-783.358', '7540.05', '60.9113', '5.00303', '2922:0 2924:0 '),\n+('2924', 'nag565', '530', '3518', '3518', '64', '67', '0', '-763.166', '7451.73', '58.8323', '4.56714', '2923:0 2925:0 '),\n+('2925', 'nag566', '530', '3518', '3518', '64', '67', '0', '-933.691', '7394.83', '34.4282', '3.14949', '2924:0 2926:0 '),\n+('2926', 'nag567', '530', '3518', '3518', '64', '67', '0', '-1090.44', '7395.57', '33.0234', '2.48583', '2925:0 2850:0 '),\n+('2927', 'nag568', '530', '3518', '3518', '64', '67', '1', '-1409.72', '6385.4', '38.2999', '5.37255', '2625:0 2842:0 2843:0 '),\n+('2928', 'nag569', '530', '3518', '3634', '64', '67', '0', '-2075.76', '6274.62', '62.3128', '0.289453', '2820:0 2839:0 2840:0 2841:0 2929:0 '),\n+('2929', 'nag571', '530', '3518', '3518', '64', '67', '0', '-2094.97', '6179.79', '87.9183', '1.00219', '2928:0 2930:0 '),\n+('2930', 'nag572', '530', '3518', '3761', '64', '67', '0', '-2030.06', '6071.21', '119.672', '4.93705', '2931:0 2929:0 '),\n+('2931', 'nag573', '530', '3518', '3761', '64', '67', '0', '-2001.22', '5972.22', '151.597', '6.26043', '2930:0 2932:0 '),\n+('2932', 'nag574', '530', '3518', '3761', '64', '67', '0', '-1946.52', '5928.39', '150.948', '1.91915', '2931:0 '),\n+('2933', 'nag575', '530', '3518', '3518', '64', '67', '0', '-2897.91', '6988.92', '-35.6052', '0.23407', '2797:0 2798:0 2934:0 '),\n+('2934', 'nag576', '530', '3518', '3518', '64', '67', '0', '-2847.89', '7102.5', '-8.05767', '2.77876', '2933:0 2798:0 2935:0 '),\n+('2935', 'nag577', '530', '3518', '3518', '64', '67', '0', '-2912.74', '7175.13', '-2.27885', '1.70277', '2934:0 2936:0 '),\n+('2936', 'nag578', '530', '3518', '3518', '64', '67', '0', '-2935.1', '7301.43', '3.27707', '1.53784', '2935:0 2937:0 '),\n+('2937', 'nag579', '530', '3518', '3518', '64', '67', '0', '-2902.48', '7467.17', '2.79586', '1.43181', '2936:0 2938:0 '),\n+('2938', 'nag580', '530', '3518', '3518', '64', '67', '0', '-2802.19', '7645.35', '-6.45531', '0.870248', '2937:0 2880:0 2881:0 '),\n+('2939', 'nag581', '530', '3518', '3633', '64', '67', '0', '-2196.09', '8827.81', '16.1506', '4.59461', '2887:0 2940:0 '),\n+('2940', 'nag582', '530', '3518', '3633', '64', '67', '0', '-2071.65', '8894.1', '28.0157', '0.506613', '2939:0 2941:0 '),\n+('2941', 'nag583', '530', '3518', '3518', '64', '67', '0', '-1884.01', '8889.41', '36.2099', '5.7138', '2890:0 2940:0 2942:0 '),\n+('2942', 'nag584', '530', '3518', '3518', '64', '67', '0', '-1916.54', '9091.13', '52.9111', '1.74753', '2941:0 2943:0 '),\n+('2943', 'nag585', '530', '3518', '3624', '64', '67', '0', '-1849.22', '9237.75', '70.9999', '5.57243', '2942:0 2944:0 '),\n+('2944', 'nag586', '530', '3518', '3624', '64', '67', '0', '-1755.41', '9160.76', '79.5049', '5.59599', '2943:0 2945:0 '),\n+('2945', 'nag587', '530', '3518', '3518', '64', '67', '0', '-1651.3', '9137.62', '86.3008', '5.99261', '2944:0 2946:0 '),\n+('2946', 'nag588', '530', '3518', '3518', '64', '67', '0', '-1545.69', '9099.13', '82.8122', '5.48996', '2945:0 2947:0 '),\n+('2947', 'nag589', '530', '3518', '3625', '64', '67', '0', '-1448.69', '9002.9', '57.299', '5.25434', '2946:0 2948:0 '),\n+('2948', 'nag590', '530', '3518', '3625', '64', '67', '0', '-1419.87', '8948.03', '58.9144', '6.12613', '2947:0 2913:0 '),\n+('2949', 'nag591', '530', '3518', '3518', '64', '67', '0', '-2052.37', '8225.22', '-6.54776', '2.94922', '2871:0 2872:0 2950:0 '),\n+('2950', 'nag592', '530', '3518', '3518', '64', '67', '0', '-1986.35', '8210.53', '0.797534', '4.84989', '2949:0 2951:0 2954:0 '),\n+('2951', 'nag593', '530', '3518', '3518', '64', '67', '0', '-2024.61', '8154.98', '1.25254', '4.1077', '2950:0 2952:0 '),\n+('2952', 'nag594', '530', '3518', '3518', '64', '67', '0', '-2103.83', '8063.36', '2.18912', '4.10771', '2951:0 2953:0 '),\n+('2953', 'nag595', '530', '3518', '3518', '64', '67', '0', '-2156.48', '7911.49', '-11.2008', '4.37866', '2952:0 2870:0 2869:0 '),\n+('2954', 'nag596', '530', '3518', '3628', '64', '67', '0', '-1840.26', '7999.74', '-24.7446', '2.3484', '2950:0 2955:0 '),\n+('2955', 'nag597', '530', '3518', '3628', '64', '67', '0', '-1746.01', '7996.18', '-27.0075', '3.06865', '2954:0 2956:0 '),\n+('2956', 'nag598', '530', '3518', '3628', '64', '67', '0', '-1653.08', '7993.42', '-26.6535', '6.25344', '2955:0 2960:0 '),\n+('2957', 'nag600', '530', '3518', '3628', '64', '67', '0', '-1550.22', '7929.2', '-21.6393', '6.03352', '2958:0 2960:0 '),\n+('2958', 'nag601', '530', '3518', '3628', '64', '67', '0', '-1483.84', '7905.42', '-19.2864', '5.65261', '2957:0 2959:0 '),\n+('2959', 'nag602', '530', '3518', '3628', '64', '67', '0', '-1404.2', '7842.35', '-18.1886', '5.40914', '2958:0 2861:0 '),\n+('2960', 'nag603', '530', '3518', '3628', '64', '67', '0', '-1554.58', '7990.68', '-21.1856', '3.99937', '2956:0 2957:0 2961:0 2962:0 '),\n+('2961', 'nag604', '530', '3518', '3628', '64', '67', '0', '-1601.1', '7865.59', '-22.0744', '4.70386', '2966:0 2960:0 '),\n+('2962', 'nag605', '530', '3518', '3628', '64', '67', '0', '-1478.18', '8079.45', '-21.4921', '0.88839', '2963:0 2960:0 '),\n+('2963', 'nag606', '530', '3518', '3518', '64', '67', '0', '-1517.43', '8229.34', '-15.3084', '1.82694', '2962:0 2964:0 '),\n+('2964', 'nag607', '530', '3518', '3622', '64', '67', '0', '-1508.91', '8347.15', '-12.1475', '1.98089', '2963:0 2965:0 '),\n+('2965', 'nag608', '530', '3518', '3622', '64', '67', '0', '-1502.91', '8432.5', '-0.939562', '0.853047', '2964:0 2893:0 '),\n+('2966', 'nag609', '530', '3518', '3628', '64', '67', '0', '-1604.12', '7762.81', '-21.7436', '1.48608', '2961:0 2967:0 2969:0 '),\n+('2967', 'nag610', '530', '3518', '3518', '64', '67', '0', '-1587.52', '7621.15', '-10.2326', '4.91826', '2966:0 2968:0 2969:0 '),\n+('2968', 'nag611', '530', '3518', '3518', '64', '67', '0', '-1475.29', '7596.72', '-5.21911', '5.69972', '2967:0 2860:0 2969:0 '),\n+('2969', 'nag612', '530', '3518', '3628', '64', '67', '0', '-1647.6', '7686.9', '-14.3996', '0.653543', '2967:0 2968:0 2966:0 2970:0 '),\n+('2970', 'nag613', '530', '3518', '3518', '64', '67', '0', '-1703.41', '7669.14', '-14.3192', '3.85013', '2969:0 2971:0 '),\n+('2971', 'nag614', '530', '3518', '3518', '64', '67', '0', '-1781.28', '7605.53', '-8.7957', '3.82657', '2970:0 2863:0 '),\n+('2972', 'zang615', '530', '3521', '3521', '64', '67', '0', '794.211', '5932.33', '57.6977', '1.47191', '2601:0 2602:0 2624:0 2973:0 '),\n+('2973', 'zang616', '530', '3521', '3521', '64', '67', '0', '820.771', '6049.46', '79.8283', '4.84129', '2972:0 2974:0 '),\n+('2974', 'bedg617', '530', '3522', '3767', '65', '70', '0', '882.952', '5919.73', '115.632', '0.505885', '2973:0 2975:0 '),\n+('2975', 'bedg618', '530', '3522', '3767', '65', '70', '0', '942.091', '5960.21', '121.279', '0.600133', '2974:0 2976:0 '),\n+('2976', 'bedg619', '530', '3522', '3522', '65', '70', '0', '1067.62', '6060.89', '132.716', '0.256129', '2975:0 2977:0 '),\n+('2977', 'bedg620', '530', '3522', '3522', '65', '70', '0', '1132.44', '6081.19', '153.605', '5.97461', '2976:0 2978:0 '),\n+('2978', 'bedg621', '530', '3522', '3522', '65', '70', '0', '1202.41', '6057.05', '164.269', '5.95105', '2977:0 2979:0 '),\n+('2979', 'bedg622', '530', '3522', '3522', '65', '70', '0', '1278.35', '5993.43', '168.127', '5.58584', '2978:0 2980:0 '),\n+('2980', 'bedg623', '530', '3522', '3522', '65', '70', '0', '1406.14', '6036.86', '152.292', '0.476827', '2979:0 2981:0 '),\n+('2981', 'bedg624', '530', '3522', '3522', '65', '70', '0', '1466.01', '6069.6', '133.93', '6.17882', '2980:0 2982:0 '),\n+('2982', 'bedg625', '530', '3522', '3522', '65', '70', '0', '1591.09', '6047.48', '128.651', '6.21023', '2981:0 2983:0 '),\n+('2983', 'bedg626', '530', '3522', '3768', '65', '70', '0', '1713.44', '6043.35', '143.923', '6.2495', '2982:0 2984:0 3003:0 '),\n+('2984', 'bedg627', '530', '3522', '3768', '65', '70', '0', '1762.72', '5869.71', '155.631', '4.98895', '2983:0 2985:0 3003:0 '),\n+('2985', 'bedg628', '530', '3522', '3833', '65', '70', '0', '1802.41', '5792.15', '188.129', '6.12384', '2984:0 2986:0 '),\n+('2986', 'bedg629', '530', '3522', '3833', '65', '70', '0', '1865.39', '5786.05', '215.307', '4.78866', '2985:0 2987:0 '),\n+('2987', 'bedg631', '530', '3522', '3833', '65', '70', '0', '1882.59', '5668.18', '256.167', '1.82379', '2988:0 2991:0 2986:0 '),\n+('2988', 'bedg632', '530', '3522', '3833', '65', '70', '0', '2046.5', '5630.87', '263.828', '6.03743', '2987:0 2989:0 2990:0 2991:0 2994:0 '),\n+('2989', 'bedg633', '530', '3522', '3922', '65', '70', '0', '2186.78', '5679.45', '267.903', '1.53317', '2988:0 3190:0 '),\n+('2990', 'bedg634', '530', '3522', '3833', '65', '70', '0', '2078.91', '5730.76', '265.935', '3.74408', '2988:0 2991:0 '),\n+('2991', 'bedg635', '530', '3522', '3833', '65', '70', '0', '1986.76', '5663.91', '265.451', '5.29919', '2990:0 2988:0 2987:0 2992:0 '),\n+('2992', 'bedg636', '530', '3522', '3918', '65', '70', '0', '1882.53', '5595.86', '256.211', '0.429695', '2991:0 2993:0 '),\n+('2993', 'bedg637', '530', '3522', '3918', '65', '70', '3', '1913.85', '5539.89', '265.641', '4.76903', '2992:0 2994:0 '),\n+('2994', 'bedg638', '530', '3522', '3918', '65', '70', '3', '1980.47', '5572.14', '258.131', '2.97243', '2993:0 2988:0 2995:0 '),\n+('2995', 'bedg639', '530', '3522', '3833', '65', '70', '0', '1818.29', '5603', '261.471', '3.82655', '2994:0 2996:0 3002:0 '),\n+('2996', 'bedg640', '530', '3522', '3918', '65', '70', '0', '1800.72', '5550.99', '267.48', '2.61311', '2995:0 2997:0 3001:0 '),\n+('2997', 'bedg641', '530', '3522', '3919', '65', '70', '0', '1708.89', '5566.11', '265.641', '3.36316', '2996:0 3001:0 3189:0 '),\n+('2998', 'bedg643', '530', '3522', '3919', '65', '70', '0', '1564.28', '5423.88', '265.088', '1.83317', '2999:0 3189:0 '),\n+('2999', 'bedg644', '530', '3522', '3919', '65', '70', '0', '1534.04', '5541.59', '258.021', '1.3761', '2998:0 3000:0 '),\n+('3000', 'bedg645', '530', '3522', '3919', '65', '70', '0', '1599.86', '5605.47', '266.783', '0.413989', '2999:0 3001:0 '),\n+('3001', 'bedg646', '530', '3522', '3919', '65', '70', '0', '1692.34', '5649.63', '265.597', '5.29918', '3000:0 2997:0 2996:0 3002:0 '),\n+('3002', 'bedg647', '530', '3522', '3919', '65', '70', '0', '1775.77', '5678.9', '267.502', '5.25597', '2995:0 3001:0 '),\n+('3003', 'bedg648', '530', '3522', '3768', '65', '70', '0', '1827.31', '6004.38', '138.57', '2.3814', '2983:0 2984:0 3004:0 '),\n+('3004', 'bedg649', '530', '3522', '3768', '65', '70', '0', '1934.89', '5992.25', '140.661', '0.472881', '3003:0 3005:0 3041:0 '),\n+('3005', 'bedg650', '530', '3522', '3768', '65', '70', '0', '2035.37', '6038.3', '145.555', '3.92079', '3004:0 3006:0 3041:0 '),\n+('3006', 'bedg651', '530', '3522', '3768', '65', '70', '0', '2098.1', '5939.59', '137.134', '5.31486', '3005:0 3007:0 3041:0 '),\n+('3007', 'bedg652', '530', '3522', '3831', '65', '70', '0', '2140.78', '5883.29', '138.074', '5.36983', '3006:0 3008:0 '),\n+('3008', 'bedg653', '530', '3522', '3831', '65', '70', '0', '2169.87', '5811.41', '120.231', '1.97692', '3007:0 3009:0 '),\n+('3009', 'bedg654', '530', '3522', '3831', '65', '70', '0', '2156.44', '5731.77', '120.753', '4.55303', '3008:0 3010:0 '),\n+('3010', 'bedg655', '530', '3522', '3831', '65', '70', '0', '2209.5', '5671.79', '127.813', '5.09887', '3009:0 3011:0 '),\n+('3011', 'bedg656', '530', '3522', '3831', '65', '70', '0', '2242.52', '5586.84', '144.63', '4.98106', '3010:0 3012:0 '),\n+('3012', 'bedg657', '530', '3522', '3831', '65', '70', '0', '2242.64', '5516.54', '161.969', '4.74938', '3011:0 3013:0 '),\n+('3013', 'bedg658', '530', '3522', '3831', '65', '70', '0', '2266.32', '5460.89', '147.107', '3.73228', '3012:0 3014:0 3015:0 '),\n+('3014', 'bedg659', '530', '3522', '3831', '65', '70', '0', '2243.22', '5409.52', '144.241', '3.16286', '3015:0 3013:0 '),\n+('3015', 'bedg660', '530', '3522', '3831', '65', '70', '0', '2184.26', '5427.04', '144.314', '3.26496', '3014:0 3016:0 3013:0 '),\n+('3016', 'bedg661', '530', '3522', '3831', '65', '70', '0', '2056.91', '5452.67', '144.871', '3.87757', '3015:0 3017:0 '),\n+('3017', 'bedg662', '530', '3522', '3831', '65', '70', '0', '1986.16', '5372.79', '148.912', '3.58305', '3016:0 3018:0 '),\n+('3018', 'bedg663', '530', '3522', '3831', '65', '70', '0', '1869.19', '5342.55', '144.553', '3.39455', '3017:0 3019:0 '),\n+('3019', 'bedg664', '530', '3522', '3831', '65', '70', '0', '1844.86', '5256.68', '138.071', '1.36038', '3018:0 3020:0 '),\n+('3020', 'bedg666', '530', '3522', '3831', '65', '70', '0', '1882.44', '5202', '150.044', '6.2809', '3019:0 3021:0 '),\n+('3021', 'bedg668', '530', '3522', '3831', '65', '70', '0', '1942.47', '5157.81', '163.104', '1.47426', '3020:0 3022:0 '),\n+('3022', 'bedg670', '530', '3522', '3831', '65', '70', '0', '1859.25', '5091.18', '146.37', '4.69048', '3021:0 3023:0 '),\n+('3023', 'bedg672', '530', '3522', '3831', '65', '70', '0', '1892.19', '4998.98', '146.563', '5.3777', '3024:0 3022:0 '),\n+('3024', 'bedg673', '530', '3522', '3827', '65', '70', '0', '1882.75', '4918.05', '144.661', '4.59623', '3023:0 3025:0 3033:0 '),\n+('3025', 'bedg674', '530', '3522', '3827', '65', '70', '0', '1970.05', '4876.31', '143.046', '5.83716', '3024:0 3026:0 3032:0 '),\n+('3026', 'bedg675', '530', '3522', '3844', '65', '70', '0', '2066.28', '4886.71', '148.962', '0.107673', '3025:0 3027:0 '),\n+('3027', 'bedg676', '530', '3522', '3844', '65', '70', '0', '2113.18', '4914.06', '149.085', '6.14739', '3026:0 3028:0 '),\n+('3028', 'bedg677', '530', '3522', '3827', '65', '70', '0', '2197.61', '4955.01', '153.824', '2.65786', '3027:0 3029:0 3186:0 '),\n+('3029', 'bedg678', '530', '3522', '3844', '65', '70', '5', '2122.42', '4767.11', '145.442', '4.39595', '3028:0 3030:0 3031:0 '),\n+('3030', 'bedg679', '530', '3522', '3844', '65', '70', '5', '2051.79', '4712.94', '149.377', '4.14775', '3029:0 '),\n+('3031', 'bedg680', '530', '3522', '3844', '65', '70', '4', '2045.43', '4756.7', '142.832', '3.24454', '3029:0 3032:0 '),\n+('3032', 'bedg681', '530', '3522', '3827', '65', '70', '0', '1924.25', '4753.97', '143.374', '3.15815', '3031:0 3025:0 3033:0 '),\n+('3033', 'bedg682', '530', '3522', '3827', '65', '70', '0', '1818.76', '4741.32', '143.599', '3.17386', '3032:0 3034:0 3035:0 3024:0 '),\n+('3034', 'bedg683', '530', '3522', '3783', '65', '70', '0', '1763.5', '4636.75', '148.572', '2.17246', '3035:0 3033:0 '),\n+('3035', 'bedg684', '530', '3522', '3827', '65', '70', '0', '1721.08', '4751.46', '141.246', '2.47877', '3034:0 3036:0 3033:0 '),\n+('3036', 'bedg685', '530', '3522', '3827', '65', '70', '0', '1671.81', '4805.51', '144.067', '1.15537', '3035:0 3037:0 '),\n+('3037', 'bedg686', '530', '3522', '3827', '65', '70', '0', '1716.64', '4889.56', '168.716', '1.08076', '3036:0 3038:0 '),\n+('3038', 'bedg690', '530', '3522', '3779', '65', '70', '0', '1764.57', '5020.59', '169.786', '2.98533', '3037:0 3039:0 '),\n+('3039', 'bedg691', '530', '3522', '3779', '65', '70', '0', '1689.52', '5029.67', '171.17', '6.17405', '3040:0 3038:0 '),\n+('3040', 'bedg692', '530', '3522', '3779', '65', '70', '0', '1644.1', '5086.59', '174.824', '5.08627', '3039:0 '),\n+('3041', 'bedg693', '530', '3522', '3768', '65', '70', '0', '2051.36', '6085.99', '147.268', '1.58417', '3004:0 3005:0 3006:0 3042:0 3048:0 '),\n+('3042', 'bedg694', '530', '3522', '3768', '65', '70', '0', '2163.29', '6091.67', '144.685', '6.16931', '3041:0 3043:0 3047:0 '),\n+('3043', 'bedg695', '530', '3522', '3769', '65', '70', '5', '2276.18', '6049.52', '143.141', '5.80411', '3042:0 3044:0 '),\n+('3044', 'bedg696', '530', '3522', '3769', '65', '70', '4', '2338.36', '6031.21', '142.438', '2.8196', '3043:0 3045:0 '),\n+('3045', 'bedg697', '530', '3522', '3769', '65', '70', '5', '2384.95', '6054.49', '138.162', '1.60222', '3044:0 3046:0 '),\n+('3046', 'bedg698', '530', '3522', '3768', '65', '70', '0', '2372.13', '6149.95', '128.725', '3.20443', '3045:0 3047:0 3114:0 '),\n+('3047', 'bedg699', '530', '3522', '3768', '65', '70', '0', '2265.65', '6155.81', '138.179', '3.41256', '3046:0 3042:0 '),\n+('3048', 'bedg700', '530', '3522', '3768', '65', '70', '0', '2028.28', '6216.03', '134.538', '4.67706', '3041:0 3049:0 '),\n+('3049', 'bedg701', '530', '3522', '3771', '65', '70', '0', '2041.4', '6592.18', '135.807', '3.54607', '3048:0 3050:0 3056:0 '),\n+('3050', 'bedg702', '530', '3522', '3772', '65', '70', '3', '2066.72', '6735.02', '154.854', '4.59066', '3049:0 3051:0 3055:0 '),\n+('3051', 'bedg703', '530', '3522', '3772', '65', '70', '2', '1972.28', '6779.92', '162.128', '1.46478', '3050:0 3052:0 '),\n+('3052', 'bedg704', '530', '3522', '3772', '65', '70', '2', '1959.55', '6842.15', '158.876', '3.29476', '3051:0 3053:0 3059:0 '),\n+('3053', 'bedg705', '530', '3522', '3772', '65', '70', '3', '2065.72', '6849.09', '172.562', '0.0589211', '3052:0 3054:0 '),\n+('3054', 'bedg706', '530', '3522', '3772', '65', '70', '2', '2135.82', '6829.36', '173.431', '4.65351', '3053:0 3055:0 '),\n+('3055', 'bedg707', '530', '3522', '3772', '65', '70', '2', '2140.28', '6753.83', '165.006', '3.40472', '3054:0 3050:0 '),\n+('3056', 'bedg708', '530', '3522', '3771', '65', '70', '0', '1952.24', '6615.86', '143.542', '5.85751', '3049:0 3057:0 3058:0 '),\n+('3057', 'bedg709', '530', '3522', '3771', '65', '70', '0', '1869.68', '6608.28', '143.783', '2.00906', '3056:0 3058:0 '),\n+('3058', 'bedg710', '530', '3522', '3771', '65', '70', '0', '1867.3', '6714.18', '142.554', '2.81017', '3056:0 3057:0 3059:0 '),\n+('3059', 'bedg711', '530', '3522', '3771', '65', '70', '0', '1794.79', '6806.46', '137.334', '0.147653', '3058:0 3052:0 3060:0 3079:0 '),\n+('3060', 'bedg712', '530', '3522', '3782', '65', '70', '0', '1698.35', '6823.85', '136.031', '2.50777', '3059:0 3061:0 3066:0 3067:0 '),\n+('3061', 'bedg713', '530', '3522', '3782', '65', '70', '0', '1660.38', '6861.71', '142.107', '2.01886', '3060:0 3062:0 '),\n+('3062', 'bedg714', '530', '3522', '3782', '65', '70', '0', '1628.86', '6909.46', '152.556', '2.54312', '3061:0 3063:0 '),\n+('3063', 'bedg715', '530', '3522', '3782', '65', '70', '0', '1565.97', '6934.47', '157.679', '0.579622', '3062:0 3064:0 '),\n+('3064', 'bedg716', '530', '3522', '3782', '65', '70', '0', '1642.57', '6995.64', '157.952', '6.01458', '3063:0 3065:0 '),\n+('3065', 'bedg717', '530', '3522', '3782', '65', '70', '0', '1706.57', '6967.44', '152.552', '5.15456', '3064:0 3066:0 '),\n+('3066', 'bedg718', '530', '3522', '3782', '65', '70', '0', '1749.11', '6892.32', '140.635', '4.05192', '3065:0 3060:0 '),\n+('3067', 'bedg719', '530', '3522', '3782', '65', '70', '0', '1636.12', '6812.12', '131.714', '0.187751', '3060:0 3068:0 3078:0 '),\n+('3068', 'bedg720', '530', '3522', '3782', '65', '70', '0', '1569.95', '6826.69', '128.23', '3.23117', '3067:0 3069:0 '),\n+('3069', 'bedg721', '530', '3522', '3522', '65', '70', '0', '1487.42', '6820.82', '107.218', '2.83454', '3068:0 3070:0 '),\n+('3070', 'bedg722', '530', '3522', '3522', '65', '70', '0', '1418.63', '6847.18', '110.541', '2.77564', '3069:0 3071:0 '),\n+('3071', 'bedg723', '530', '3522', '3522', '65', '70', '0', '1357.84', '6881.95', '95.233', '5.88189', '3070:0 3072:0 '),\n+('3072', 'bedg724', '530', '3522', '3522', '65', '70', '0', '1305.01', '6962.51', '93.0961', '3.03875', '3071:0 3073:0 '),\n+('3073', 'bedg725', '530', '3522', '3522', '65', '70', '0', '1224.71', '6978.54', '90.3881', '2.59893', '3072:0 3074:0 '),\n+('3074', 'bedg726', '530', '3522', '3522', '65', '70', '0', '1145.67', '7048.89', '113.579', '2.41436', '3073:0 3075:0 '),\n+('3075', 'bedg727', '530', '3522', '3522', '65', '70', '2', '1107.87', '7095.02', '122.35', '3.18012', '3074:0 3076:0 '),\n+('3076', 'bedg728', '530', '3522', '3770', '65', '70', '2', '1053.11', '7098.72', '116.217', '0.376251', '3075:0 3077:0 '),\n+('3077', 'bedg729', '530', '3522', '3770', '65', '70', '2', '1020.4', '7173.65', '86.2439', '1.66823', '3076:0 2582:0 '),\n+('3078', 'bedg730', '530', '3522', '3824', '65', '70', '0', '1647.1', '6732.39', '116.704', '4.75248', '3067:0 3079:0 '),\n+('3079', 'bedg731', '530', '3522', '3771', '65', '70', '0', '1740.86', '6736.89', '134.249', '0.774434', '3078:0 3059:0 3080:0 '),\n+('3080', 'bedg732', '530', '3522', '3824', '65', '70', '0', '1628.32', '6690.04', '108.29', '6.13869', '3079:0 3081:0 '),\n+('3081', 'bedg733', '530', '3522', '3824', '65', '70', '0', '1723.61', '6678.08', '87.8644', '5.8481', '3080:0 3082:0 '),\n+('3082', 'bedg734', '530', '3522', '3824', '65', '70', '0', '1772.91', '6642.19', '74.5483', '2.51408', '3081:0 3083:0 '),\n+('3083', 'bedg735', '530', '3522', '3824', '65', '70', '0', '1619.66', '6621.4', '33.3376', '3.64899', '3082:0 3084:0 '),\n+('3084', 'bedg736', '530', '3522', '3824', '65', '70', '0', '1761.7', '6532.98', '4.13407', '5.72636', '3083:0 3085:0 3217:0 '),\n+('3085', 'bedg737', '530', '3522', '3824', '65', '70', '0', '1936.85', '6455.82', '1.98027', '5.87558', '3084:0 3086:0 3215:0 '),\n+('3086', 'bedg738', '530', '3522', '3824', '65', '70', '0', '2158.79', '6394.21', '-10.3376', '6.01302', '3085:0 3087:0 '),\n+('3087', 'bedg739', '530', '3522', '3931', '65', '70', '0', '2352.32', '6410.86', '-10.3378', '0.246553', '3086:0 3088:0 3090:0 '),\n+('3088', 'bedg740', '530', '3522', '3773', '65', '70', '0', '2401.13', '6465.38', '3.57212', '0.140524', '3087:0 3089:0 '),\n+('3089', 'bedg741', '530', '3522', '3773', '65', '70', '0', '2489.83', '6479', '-6.94094', '0.898433', '3088:0 3090:0 3091:0 '),\n+('3090', 'bedg742', '530', '3522', '3931', '65', '70', '0', '2486.13', '6407.7', '-10.338', '3.05435', '3089:0 3087:0 3097:0 '),\n+('3091', 'bedg743', '530', '3522', '3773', '65', '70', '0', '2546.35', '6560.09', '1.844', '4.13898', '3089:0 3092:0 3093:0 3094:0 3096:0 '),\n+('3092', 'bedg744', '530', '3522', '3773', '65', '70', '0', '2667.31', '6519.19', '0.94932', '5.95717', '3091:0 '),\n+('3093', 'bedg745', '530', '3522', '3773', '65', '70', '0', '2613.6', '6682.32', '23.1547', '1.02881', '3091:0 3096:0 '),\n+('3094', 'bedg746', '530', '3522', '3773', '65', '70', '0', '2376.02', '6637.4', '10.9828', '6.02394', '3091:0 3095:0 '),\n+('3095', 'bedg747', '530', '3522', '3773', '65', '70', '0', '2482.22', '6684.55', '0.72676', '5.48987', '3094:0 3096:0 '),\n+('3096', 'bedg748', '530', '3522', '3773', '65', '70', '0', '2570.07', '6610.1', '7.6561', '4.0683', '3095:0 3091:0 3093:0 '),\n+('3097', 'bedg749', '530', '3522', '3931', '65', '70', '0', '2625.59', '6357.13', '-10.3379', '0.0313585', '3090:0 3098:0 3104:0 '),\n+('3098', 'bedg750', '530', '3522', '3862', '65', '70', '0', '2747.24', '6390.91', '2.251', '5.27782', '3097:0 3099:0 '),\n+('3099', 'bedg751', '530', '3522', '3862', '65', '70', '0', '2871.51', '6233.27', '11.692', '5.37992', '3098:0 3100:0 3104:0 '),\n+('3100', 'bedg752', '530', '3522', '3862', '65', '70', '0', '2980.33', '6146.77', '4.99801', '5.25426', '3099:0 3101:0 '),\n+('3101', 'bedg753', '530', '3522', '3826', '65', '70', '0', '3036.46', '6073.22', '0.772358', '5.36224', '3100:0 3102:0 '),\n+('3102', 'bedg754', '530', '3522', '3826', '65', '70', '0', '3098.88', '6022.32', '1.18446', '4.5042', '3101:0 3103:0 '),\n+('3103', 'bedg755', '530', '3522', '3826', '65', '70', '0', '3081.27', '5967.39', '-10.3385', '2.55249', '3102:0 3104:0 3108:0 '),\n+('3104', 'bedg756', '530', '3522', '3825', '65', '70', '0', '2759.83', '6108.29', '-10.3396', '6.08285', '3099:0 3103:0 3097:0 3105:0 3111:0 '),\n+('3105', 'bedg757', '530', '3522', '3825', '65', '70', '1', '2685.12', '5895.26', '-16.1123', '4.71862', '3104:0 3106:0 '),\n+('3106', 'bedg758', '530', '3522', '3825', '65', '70', '0', '2687.78', '5785.12', '-16.8636', '4.73433', '3105:0 3107:0 '),\n+('3107', 'bedg759', '530', '3522', '3904', '65', '70', '0', '2695.75', '5583.37', '-10.6374', '4.75001', '3106:0 '),\n+('3108', 'bedg760', '530', '3522', '3826', '65', '70', '0', '3126.83', '5854.78', '-10.3341', '5.52444', '3103:0 3109:0 3110:0 '),\n+('3109', 'bedg761', '530', '3522', '3826', '65', '70', '0', '3287.4', '5738.99', '-10.3325', '5.79933', '3108:0 3110:0 3115:0 '),\n+('3110', 'bedg762', '530', '3522', '3826', '65', '70', '0', '3281.88', '5854.49', '-1.4584', '3.21929', '3109:0 3108:0 3115:0 '),\n+('3111', 'bedg763', '530', '3522', '3825', '65', '70', '0', '2582.1', '6136.86', '24.0804', '4.49162', '3104:0 3112:0 '),\n+('3112', 'bedg765', '530', '3522', '3825', '65', '70', '0', '2521.32', '6015.69', '84.9349', '2.22967', '3111:0 3113:0 '),\n+('3113', 'bedg767', '530', '3522', '3768', '65', '70', '0', '2494.15', '6124.82', '111.3', '1.62492', '3114:0 3112:0 '),\n+('3114', 'bedg768', '530', '3522', '3768', '65', '70', '0', '2427.5', '6152.5', '122.621', '2.74804', '3113:0 3046:0 '),\n+('3115', 'bedg769', '530', '3522', '3826', '65', '70', '0', '3383.33', '5729.17', '-10.3389', '3.41014', '3109:0 3110:0 3116:0 3117:0 3126:0 '),\n+('3116', 'bedg770', '530', '3522', '3777', '65', '70', '0', '3452.63', '5809.98', '1.12407', '0.865436', '3115:0 3118:0 '),\n+('3117', 'bedg771', '530', '3522', '3826', '65', '70', '0', '3520', '5691.54', '-10.3386', '6.05377', '3115:0 3118:0 '),\n+('3118', 'bedg772', '530', '3522', '3777', '65', '70', '0', '3523.18', '5795.46', '1.6669', '1.53041', '3117:0 3116:0 3119:0 '),\n+('3119', 'bedg773', '530', '3522', '3826', '65', '70', '0', '3589.57', '5684.17', '-10.2714', '6.25066', '3118:0 3120:0 '),\n+('3120', 'bedg774', '530', '3522', '3774', '65', '70', '0', '3660.48', '5491.29', '-20.7025', '5.0647', '3119:0 3125:0 '),\n+('3121', 'bedg775', '530', '3522', '3774', '65', '70', '0', '3641.58', '5308.33', '-20.5148', '5.3867', '3122:0 3125:0 '),\n+('3122', 'bedg776', '530', '3522', '3774', '65', '70', '0', '3587.11', '5221.49', '14.2925', '1.80371', '3123:0 3121:0 '),\n+('3123', 'bedg777', '530', '3522', '3774', '65', '70', '0', '3438.2', '5241.29', '-6.61032', '0.307527', '3122:0 '),\n+('3124', 'bedg779', '530', '3522', '3774', '65', '70', '0', '3593.15', '5382.62', '-9.51038', '0.0970404', '3125:0 '),\n+('3125', 'bedg780', '530', '3522', '3774', '65', '70', '0', '3651.06', '5374.99', '-20.2357', '1.49502', '3124:0 3120:0 3121:0 '),\n+('3126', 'bedg781', '530', '3522', '3826', '65', '70', '0', '3233.27', '5636.21', '38.3515', '5.69295', '3115:0 3127:0 '),\n+('3127', 'bedg782', '530', '3522', '3826', '65', '70', '0', '3303.69', '5597.03', '55.3332', '6.0071', '3126:0 3128:0 '),\n+('3128', 'bedg783', '530', '3522', '3826', '65', '70', '0', '3374.58', '5579.62', '85.0975', '4.19284', '3127:0 3129:0 '),\n+('3129', 'bedg784', '530', '3522', '3828', '65', '70', '0', '3306.73', '5468.57', '141.818', '6.03852', '3128:0 3130:0 3133:0 '),\n+('3130', 'bedg785', '530', '3522', '3828', '65', '70', '0', '3389.48', '5461.86', '145.745', '4.75047', '3129:0 3131:0 '),\n+('3131', 'bedg786', '530', '3522', '3829', '65', '70', '0', '3363.88', '5342.13', '147.792', '3.91795', '3130:0 3132:0 '),\n+('3132', 'bedg787', '530', '3522', '3829', '65', '70', '0', '3286', '5287.73', '147.247', '2.3825', '3131:0 3133:0 3136:0 '),\n+('3133', 'bedg788', '530', '3522', '3828', '65', '70', '0', '3187.06', '5468.2', '146.95', '2.07226', '3132:0 3129:0 3134:0 '),\n+('3134', 'bedg789', '530', '3522', '3828', '65', '70', '0', '3116.13', '5482.01', '145.293', '4.71905', '3133:0 3135:0 3137:0 '),\n+('3135', 'bedg790', '530', '3522', '3829', '65', '70', '0', '3130.15', '5332.98', '148.604', '4.94682', '3134:0 3136:0 '),\n+('3136', 'bedg791', '530', '3522', '3829', '65', '70', '0', '3215.6', '5360.26', '142.29', '5.42984', '3135:0 3132:0 '),\n+('3137', 'bedg792', '530', '3522', '3828', '65', '70', '0', '2956.95', '5583.27', '146.351', '5.04498', '3134:0 3138:0 3140:0 '),\n+('3138', 'bedg793', '530', '3522', '3952', '65', '70', '0', '2952.85', '5779.65', '134.692', '1.27116', '3137:0 3139:0 '),\n+('3139', 'bedg794', '530', '3522', '3952', '65', '70', '0', '3050.1', '5991.54', '130.725', '1.20636', '3138:0 3192:0 '),\n+('3140', 'bedg795', '530', '3522', '3951', '65', '70', '1', '2949.59', '5525.69', '144.16', '2.62095', '3137:0 3141:0 '),\n+('3141', 'bedg796', '530', '3522', '3828', '65', '70', '0', '2915.37', '5365.92', '147.713', '1.64902', '3140:0 3142:0 '),\n+('3142', 'bedg797', '530', '3522', '3867', '65', '70', '0', '2973.41', '5294.89', '183.643', '6.14688', '3141:0 3143:0 '),\n+('3143', 'bedg798', '530', '3522', '3867', '65', '70', '0', '3038.23', '5281.8', '219.214', '4.54468', '3142:0 3144:0 '),\n+('3144', 'bedg799', '530', '3522', '3867', '65', '70', '0', '3021.8', '5214.18', '250.296', '5.00414', '3143:0 3145:0 '),\n+('3145', 'bedg800', '530', '3522', '3867', '65', '70', '0', '3082.54', '5063.01', '264.326', '4.87847', '3144:0 3146:0 3165:0 3166:0 '),\n+('3146', 'bedg801', '530', '3522', '3867', '65', '70', '0', '3099.95', '4980.23', '265.505', '6.22935', '3145:0 3147:0 3172:0 3175:0 '),\n+('3147', 'bedg802', '530', '3522', '3867', '65', '70', '0', '3304.97', '4970.79', '264.838', '5.68742', '3146:0 3148:0 3164:0 '),\n+('3148', 'bedg803', '530', '3522', '3867', '65', '70', '0', '3434.24', '4937.21', '262.546', '5.47143', '3147:0 3149:0 3163:0 3164:0 '),\n+('3149', 'bedg804', '530', '3522', '3867', '65', '70', '0', '3574.68', '4758.04', '240.131', '5.37718', '3148:0 3150:0 3156:0 '),\n+('3150', 'bedg805', '530', '3522', '3863', '65', '70', '0', '3564.29', '4641.89', '228.617', '3.77105', '3149:0 3151:0 '),\n+('3151', 'bedg806', '530', '3522', '3863', '65', '70', '0', '3459.92', '4594.26', '206.487', '3.08147', '3150:0 3152:0 3153:0 '),\n+('3152', 'bedg807', '530', '3522', '3962', '65', '70', '0', '3346.24', '4594.8', '221.66', '2.70055', '3151:0 '),\n+('3153', 'bedg808', '530', '3522', '3863', '65', '70', '0', '3393.49', '4543.75', '179.957', '4.49519', '3151:0 3154:0 '),\n+('3154', 'bedg809', '530', '3522', '3863', '65', '70', '0', '3360.85', '4462.38', '157.372', '4.73472', '3153:0 3155:0 3223:0 '),\n+('3155', 'bedg810', '530', '3522', '3863', '65', '70', '0', '3368.28', '4367.62', '122.375', '1.75021', '3154:0 3223:0 '),\n+('3156', 'bedg811', '530', '3522', '3866', '65', '70', '0', '3701.21', '4770.37', '244.343', '1.75806', '3149:0 3157:0 '),\n+('3157', 'bedg812', '530', '3522', '3866', '65', '70', '0', '3761.47', '4802.74', '254.61', '1.73842', '3156:0 3158:0 '),\n+('3158', 'bedg813', '530', '3522', '3866', '65', '70', '0', '3738.29', '4879.52', '256.491', '2.75944', '3157:0 3159:0 '),\n+('3159', 'bedg814', '530', '3522', '3866', '65', '70', '0', '3668.47', '4898.18', '260.046', '1.56956', '3158:0 3160:0 '),\n+('3160', 'bedg815', '530', '3522', '3866', '65', '70', '0', '3668.33', '5008.48', '266.738', '4.7465', '3159:0 3161:0 3162:0 '),\n+('3161', 'bedg816', '530', '3522', '3866', '65', '70', '0', '3732.68', '5010.06', '273.797', '4.86824', '3160:0 '),\n+('3162', 'bedg817', '530', '3522', '3866', '65', '70', '0', '3581.65', '5022.38', '265.138', '6.01885', '3160:0 3163:0 '),\n+('3163', 'bedg818', '530', '3522', '3866', '65', '70', '0', '3523.16', '4984.99', '269.146', '3.77261', '3162:0 3148:0 '),\n+('3164', 'bedg819', '530', '3522', '3867', '65', '70', '0', '3312.28', '5066.6', '254.195', '4.73865', '3147:0 3148:0 3165:0 '),\n+('3165', 'bedg820', '530', '3522', '3867', '65', '70', '0', '3243.07', '5149.71', '260.466', '2.97621', '3164:0 3145:0 '),\n+('3166', 'bedg821', '530', '3522', '3942', '65', '70', '0', '2961.39', '5151.76', '265.026', '5.66383', '3145:0 3167:0 3171:0 '),\n+('3167', 'bedg822', '530', '3522', '3942', '65', '70', '0', '2940.58', '5217.19', '264.835', '2.79713', '3166:0 3168:0 '),\n+('3168', 'bedg823', '530', '3522', '3942', '65', '70', '0', '2844.64', '5234.99', '267.298', '3.70426', '3167:0 3169:0 '),\n+('3169', 'bedg824', '530', '3522', '3942', '65', '70', '0', '2724.25', '5157.06', '265.076', '3.71605', '3168:0 3170:0 3176:0 '),\n+('3170', 'bedg825', '530', '3522', '3867', '65', '70', '0', '2816.5', '5099.67', '265.683', '5.72666', '3169:0 3171:0 '),\n+('3171', 'bedg826', '530', '3522', '3867', '65', '70', '0', '2900.18', '5096.37', '265.127', '0.775502', '3166:0 3170:0 3172:0 3175:0 '),\n+('3172', 'bedg827', '530', '3522', '3787', '65', '70', '0', '2929.12', '4947.5', '266.731', '4.91062', '3146:0 3171:0 3173:0 3175:0 '),\n+('3173', 'bedg828', '530', '3522', '3787', '65', '70', '0', '2898.72', '4782.92', '277.957', '4.52971', '3172:0 3174:0 '),\n+('3174', 'bedg829', '530', '3522', '3787', '65', '70', '0', '2984.26', '4824.35', '278.892', '1.56875', '3173:0 3175:0 '),\n+('3175', 'bedg830', '530', '3522', '3787', '65', '70', '0', '2852.35', '4933.54', '267.974', '6.12327', '3174:0 3172:0 3146:0 3171:0 '),\n+('3176', 'bedg831', '530', '3522', '3833', '65', '70', '0', '2545.57', '5293.37', '266.598', '6.1005', '3169:0 3177:0 3191:0 '),\n+('3177', 'bedg832', '530', '3522', '3833', '65', '70', '0', '2456.71', '5321.66', '264.923', '2.73899', '3176:0 3178:0 3184:0 3191:0 '),\n+('3178', 'bedg833', '530', '3522', '3833', '65', '70', '0', '2282.88', '5171.44', '264.676', '3.69325', '3177:0 3179:0 3184:0 '),\n+('3179', 'bedg834', '530', '3522', '3953', '65', '70', '0', '2194.7', '5122.32', '258.602', '4.28623', '3178:0 3180:0 '),\n+('3180', 'bedg835', '530', '3522', '3953', '65', '70', '0', '2189.16', '5051.76', '252.603', '2.1395', '3179:0 3181:0 '),\n+('3181', 'bedg836', '530', '3522', '3953', '65', '70', '0', '2116.51', '5085.08', '256.974', '5.94279', '3180:0 3182:0 3185:0 '),\n+('3182', 'bedg837', '530', '3522', '3953', '65', '70', '0', '2090.4', '5162.61', '265.04', '2.37496', '3181:0 3183:0 3187:0 '),\n+('3183', 'bedg838', '530', '3522', '3953', '65', '70', '0', '2063.34', '5235.11', '265.179', '0.122197', '3182:0 3184:0 '),\n+('3184', 'bedg839', '530', '3522', '3833', '65', '70', '0', '2316.24', '5243.18', '261.206', '0.031876', '3183:0 3178:0 3177:0 '),\n+('3185', 'bedg840', '530', '3522', '3953', '65', '70', '0', '2089.3', '5022.57', '223.769', '0.835746', '3181:0 3186:0 '),\n+('3186', 'bedg841', '530', '3522', '3953', '65', '70', '0', '2164.72', '5005.6', '178.623', '5.23199', '3185:0 3028:0 '),\n+('3187', 'bedg842', '530', '3522', '3953', '65', '70', '0', '1740.09', '5133.27', '265.058', '3.33132', '3182:0 3188:0 '),\n+('3188', 'bedg843', '530', '3522', '3919', '65', '70', '0', '1674.61', '5254.04', '265.321', '1.92546', '3187:0 3189:0 '),\n+('3189', 'bedg844', '530', '3522', '3919', '65', '70', '0', '1612.29', '5464.5', '265.941', '1.8587', '3188:0 2998:0 2997:0 '),\n+('3190', 'bedg845', '530', '3522', '3833', '65', '70', '0', '2395.42', '5588.73', '267.895', '5.88623', '2989:0 3191:0 '),\n+('3191', 'bedg846', '530', '3522', '3833', '65', '70', '0', '2397.69', '5390.93', '264.287', '4.72385', '3190:0 3177:0 3176:0 '),\n+('3192', 'bedg847', '530', '3522', '3954', '65', '70', '0', '3094.62', '6101.88', '130.589', '1.3065', '3139:0 3193:0 '),\n+('3193', 'bedg848', '530', '3522', '3954', '65', '70', '0', '3120.37', '6181.58', '137.697', '1.30738', '3192:0 3194:0 '),\n+('3194', 'bedg849', '530', '3522', '3954', '65', '70', '0', '3147.57', '6248.67', '124.212', '0.486635', '3193:0 3195:0 '),\n+('3195', 'bedg850', '530', '3522', '3954', '65', '70', '0', '3217.19', '6289.41', '124.654', '1.62939', '3194:0 3196:0 '),\n+('3196', 'bedg851', '530', '3522', '3954', '65', '70', '0', '3215.71', '6365.94', '119.805', '1.02856', '3195:0 3197:0 '),\n+('3197', 'bedg852', '530', '3522', '3954', '65', '70', '0', '3279.94', '6464.48', '149.929', '0.887189', '3196:0 3198:0 '),\n+('3198', 'bedg853', '530', '3522', '3830', '65', '70', '0', '3323.9', '6505.86', '159.443', '0.796868', '3197:0 3199:0 3214:0 '),\n+('3199', 'bedg854', '530', '3522', '3781', '65', '70', '0', '3488.68', '6673.14', '148.361', '0.895043', '3198:0 3200:0 3214:0 '),\n+('3200', 'bedg855', '530', '3522', '3781', '65', '70', '0', '3566.67', '6807.32', '137.289', '2.01031', '3199:0 3201:0 3210:0 '),\n+('3201', 'bedg856', '530', '3522', '3830', '65', '70', '0', '3446.01', '7089.42', '152.831', '1.97497', '3200:0 3202:0 3204:0 3205:0 '),\n+('3202', 'bedg857', '530', '3522', '3830', '65', '70', '0', '3286.14', '7143.51', '168.873', '3.41617', '3201:0 3203:0 '),\n+('3203', 'bedg858', '530', '3522', '3830', '65', '70', '0', '3303.87', '6962.97', '164.125', '0.482707', '3202:0 3204:0 '),\n+('3204', 'bedg859', '530', '3522', '3830', '65', '70', '0', '3360.25', '6980.78', '163.409', '0.305992', '3203:0 3201:0 '),\n+('3205', 'bedg860', '530', '3522', '3903', '65', '70', '0', '3481.37', '7222.76', '141.365', '1.30345', '3201:0 3206:0 '),\n+('3206', 'bedg861', '530', '3522', '3903', '65', '70', '0', '3590.93', '7211.94', '137.85', '5.43858', '3205:0 3207:0 '),\n+('3207', 'bedg862', '530', '3522', '3903', '65', '70', '0', '3641.59', '7154.45', '142.814', '5.19904', '3206:0 3208:0 '),\n+('3208', 'bedg863', '530', '3522', '3903', '65', '70', '0', '3697.31', '7047.11', '149.054', '4.94771', '3207:0 3209:0 '),\n+('3209', 'bedg864', '530', '3522', '3830', '65', '70', '0', '3765.97', '6838.37', '141.277', '4.82598', '3208:0 3210:0 '),\n+('3210', 'bedg865', '530', '3522', '3781', '65', '70', '0', '3736.74', '6702.81', '136.262', '4.17018', '3200:0 3209:0 3211:0 '),\n+('3211', 'bedg866', '530', '3522', '3781', '65', '70', '0', '3630.09', '6582.49', '134.163', '3.31724', '3210:0 3212:0 '),\n+('3212', 'bedg867', '530', '3522', '3781', '65', '70', '0', '3502.63', '6555.2', '131.654', '3.74921', '3211:0 3213:0 '),\n+('3213', 'bedg868', '530', '3522', '3830', '65', '70', '0', '3447.34', '6507.7', '134.998', '3.17979', '3212:0 3214:0 '),\n+('3214', 'bedg869', '530', '3522', '3830', '65', '70', '0', '3367.73', '6538.54', '150.282', '2.78317', '3198:0 3213:0 3199:0 '),\n+('3215', 'bedg870', '530', '3522', '3824', '65', '70', '0', '1832.55', '6314.24', '0.000980531', '2.39439', '3085:0 3216:0 '),\n+('3216', 'bedg871', '530', '3522', '3824', '65', '70', '0', '1739.41', '6384.91', '-10.3385', '3.01878', '3215:0 3217:0 '),\n+('3217', 'bedg872', '530', '3522', '3776', '65', '70', '0', '1654.93', '6407.76', '-10.1815', '2.87741', '3216:0 3084:0 3218:0 '),\n+('3218', 'bedg873', '530', '3522', '3776', '65', '70', '0', '1604.99', '6316.74', '1.22794', '4.18509', '3217:0 3219:0 '),\n+('3219', 'bedg874', '530', '3522', '3824', '65', '70', '0', '1475.3', '6532.8', '-10.3385', '5.60273', '3218:0 3220:0 '),\n+('3220', 'bedg876', '530', '3522', '3778', '65', '70', '0', '1361.1', '6534.43', '6.43101', '6.15055', '3219:0 3221:0 '),\n+('3221', 'bedg877', '530', '3522', '3778', '65', '70', '0', '1339.54', '6590.17', '-8.16829', '2.78314', '3222:0 3220:0 '),\n+('3222', 'bedg878', '530', '3522', '3778', '65', '70', '0', '1355.69', '6688.28', '-22.7054', '2.60447', '3221:0 '),\n+('3223', 'net880', '530', '3523', '3868', '67', '70', '0', '3385.12', '4257.44', '122.681', '4.84713', '3154:0 3155:0 3224:0 '),\n+('3224', 'net881', '530', '3523', '3523', '67', '70', '0', '3394.02', '4139.94', '151.096', '1.574', '3223:0 3225:0 '),\n+('3225', 'net883', '530', '3523', '3523', '67', '70', '0', '3433.77', '4036.61', '177.446', '4.57617', '3226:0 3224:0 '),\n+('3226', 'net884', '530', '3523', '3523', '67', '70', '0', '3443.07', '3946.93', '166.449', '4.15205', '3225:0 3227:0 '),\n+('3227', 'net885', '530', '3523', '3523', '67', '70', '0', '3403.88', '3894.6', '153.082', '3.72008', '3226:0 3228:0 '),\n+('3228', 'net886', '530', '3523', '3523', '67', '70', '0', '3356.69', '3870.95', '144.623', '4.91389', '3227:0 3229:0 3238:0 3239:0 '),\n+('3229', 'net887', '530', '3523', '3523', '67', '70', '0', '3379', '3814.14', '142.822', '4.46228', '3228:0 3230:0 '),\n+('3230', 'net888', '530', '3523', '3725', '67', '70', '0', '3356.46', '3730.03', '141.12', '5.51863', '3229:0 3231:0 '),\n+('3231', 'net889', '530', '3523', '3725', '67', '70', '0', '3395.58', '3698.26', '144.989', '5.91132', '3230:0 3232:0 '),\n+('3232', 'net890', '530', '3523', '3725', '67', '70', '0', '3463.55', '3674.25', '150.706', '4.98848', '3231:0 3233:0 '),\n+('3233', 'net891', '530', '3523', '3725', '67', '70', '0', '3489.72', '3601.83', '158.293', '4.35231', '3232:0 3234:0 '),\n+('3234', 'net892', '530', '3523', '3725', '67', '70', '0', '3537.5', '3575.94', '135.389', '2.48697', '3233:0 3235:0 '),\n+('3235', 'net893', '530', '3523', '3725', '67', '70', '0', '3582.4', '3548.11', '124.35', '1.42276', '3234:0 3236:0 '),\n+('3236', 'net894', '530', '3523', '3721', '67', '70', '0', '3601.15', '3625.27', '127.148', '2.16889', '3235:0 3237:0 '),\n+('3237', 'net895', '530', '3523', '3725', '67', '70', '0', '3506.7', '3744.78', '141.004', '1.82724', '3236:0 3238:0 '),\n+('3238', 'net896', '530', '3523', '3523', '67', '70', '0', '3492.41', '3820.83', '138.898', '2.78542', '3237:0 3228:0 '),\n+('3239', 'net897', '530', '3523', '3523', '67', '70', '0', '3288.33', '3814.38', '139.103', '3.2089', '3228:0 3240:0 '),\n+('3240', 'net898', '530', '3523', '3523', '67', '70', '0', '3228.8', '3802.26', '137.833', '3.34242', '3239:0 3241:0 3272:0 3273:0 '),\n+('3241', 'net899', '530', '3523', '3712', '67', '70', '0', '3127.16', '3690.44', '142.929', '3.42881', '3240:0 3272:0 3273:0 3278:0 '),\n+('3242', 'net903', '530', '3523', '3712', '67', '70', '0', '2999.35', '3698.08', '144.031', '2.76314', '3243:0 3269:0 3277:0 3270:0 '),\n+('3243', 'net904', '530', '3523', '3712', '67', '70', '0', '2922.84', '3722.08', '143.833', '1.69299', '3244:0 3242:0 '),\n+('3244', 'net905', '530', '3523', '3523', '67', '70', '0', '2885.06', '3679.8', '140.256', '0.687686', '3243:0 3245:0 '),\n+('3245', 'net906', '530', '3523', '3523', '67', '70', '0', '2816.99', '3697.81', '120.765', '3.2795', '3244:0 3246:0 '),\n+('3246', 'net907', '530', '3523', '3523', '67', '70', '0', '2757.67', '3673.48', '134.526', '2.26241', '3245:0 3247:0 3290:0 '),\n+('3247', 'net908', '530', '3523', '3729', '67', '70', '0', '2719.32', '3721.32', '139.083', '3.091', '3246:0 3248:0 '),\n+('3248', 'net909', '530', '3523', '3729', '67', '70', '0', '2639.32', '3732.64', '144.622', '2.23884', '3247:0 3249:0 '),\n+('3249', 'net910', '530', '3523', '3729', '67', '70', '0', '2585.42', '3776.42', '143.482', '2.4509', '3248:0 3250:0 3293:0 '),\n+('3250', 'net911', '530', '3523', '3729', '67', '70', '0', '2514.06', '3815.49', '129.888', '2.12889', '3249:0 3251:0 '),\n+('3251', 'net912', '530', '3523', '3729', '67', '70', '0', '2508.94', '3883.67', '132.691', '1.6655', '3250:0 3252:0 '),\n+('3252', 'net913', '530', '3523', '3729', '67', '70', '0', '2477.31', '4067.17', '130.201', '5.03879', '3251:0 3253:0 '),\n+('3253', 'net914', '530', '3523', '3523', '67', '70', '0', '2545.65', '4202.77', '136.176', '0.542382', '3252:0 3254:0 '),\n+('3254', 'net915', '530', '3523', '3523', '67', '70', '0', '2609.03', '4303.08', '140.386', '0.000453472', '3253:0 3255:0 '),\n+('3255', 'net916', '530', '3523', '3726', '67', '70', '0', '2747.27', '4290.97', '151.997', '6.19723', '3254:0 3256:0 '),\n+('3256', 'net917', '530', '3523', '3726', '67', '70', '0', '2895.85', '4349.05', '157.653', '4.53219', '3255:0 3257:0 '),\n+('3257', 'net918', '530', '3523', '3726', '67', '70', '0', '2865.03', '4280.18', '159.366', '5.10554', '3256:0 3258:0 '),\n+('3258', 'net919', '530', '3523', '3726', '67', '70', '0', '2890.62', '4215.62', '164.008', '5.09376', '3257:0 3259:0 3266:0 '),\n+('3259', 'net920', '530', '3523', '3726', '67', '70', '0', '2940.62', '4199.62', '164.007', '0.322464', '3258:0 3260:0 3265:0 '),\n+('3260', 'net921', '530', '3523', '3726', '67', '70', '0', '2999.27', '4224.49', '160.851', '0.401004', '3259:0 3261:0 '),\n+('3261', 'net922', '530', '3523', '3726', '67', '70', '0', '3026.75', '4163.73', '153.291', '4.74035', '3260:0 3262:0 '),\n+('3262', 'net923', '530', '3523', '3726', '67', '70', '0', '3010.04', '4106.05', '150.967', '4.08455', '3261:0 3263:0 '),\n+('3263', 'net924', '530', '3523', '3726', '67', '70', '0', '2977.7', '4033.08', '148.218', '1.89329', '3262:0 3264:0 3267:0 '),\n+('3264', 'net925', '530', '3523', '3726', '67', '70', '0', '2939.58', '4099.08', '162.599', '2.04252', '3263:0 3265:0 '),\n+('3265', 'net926', '530', '3523', '3726', '67', '70', '0', '2918.39', '4149.56', '164.008', '1.96398', '3264:0 3259:0 3266:0 '),\n+('3266', 'net927', '530', '3523', '3726', '67', '70', '0', '2870.91', '4167.67', '164.007', '1.92863', '3265:0 3258:0 '),\n+('3267', 'net928', '530', '3523', '3523', '67', '70', '0', '2982.92', '3921.89', '146.316', '1.62627', '3263:0 3268:0 '),\n+('3268', 'net929', '530', '3523', '3523', '67', '70', '0', '3051.56', '3890.86', '143.683', '5.83993', '3267:0 3269:0 '),\n+('3269', 'net930', '530', '3523', '3712', '67', '70', '0', '3039.6', '3790.04', '145.363', '4.28485', '3268:0 3271:0 3242:0 '),\n+('3270', 'net931', '530', '3523', '3712', '67', '70', '0', '3064.35', '3704.05', '142.478', '3.15387', '3242:0 3278:0 '),\n+('3271', 'net932', '530', '3523', '3523', '67', '70', '0', '3092.9', '3822.62', '142.74', '5.9106', '3269:0 3272:0 '),\n+('3272', 'net933', '530', '3523', '3523', '67', '70', '0', '3125.95', '3779.17', '142.072', '0.118293', '3271:0 3241:0 3240:0 '),\n+('3273', 'net934', '530', '3523', '3523', '67', '70', '0', '3196.76', '3711.71', '129.813', '5.90669', '3241:0 3240:0 3274:0 '),\n+('3274', 'net935', '530', '3523', '3523', '67', '70', '0', '3253.35', '3630.84', '126.607', '3.66438', '3273:0 3275:0 '),\n+('3275', 'net936', '530', '3523', '3523', '67', '70', '0', '3139.27', '3579.06', '142.77', '3.24419', '3274:0 3276:0 '),\n+('3276', 'net937', '530', '3523', '3712', '67', '70', '0', '3046.95', '3595.34', '143.235', '1.59486', '3275:0 3279:0 3278:0 '),\n+('3277', 'net938', '530', '3523', '3712', '1', '60', '0', '2935.94', '3648.71', '132.577', '0.379446', '3242:0 3278:0 '),\n+('3278', 'net939', '530', '3523', '3712', '67', '70', '1', '3062.95', '3645.68', '144.33', '5.51596', '3241:0 3276:0 3277:0 3270:0 '),\n+('3279', 'net940', '530', '3523', '3523', '67', '70', '0', '3016.58', '3539.17', '143.581', '3.54657', '3276:0 3280:0 3294:0 '),\n+('3280', 'net941', '530', '3523', '3523', '67', '70', '0', '2859.55', '3471.67', '136.322', '0.389269', '3279:0 3281:0 3288:0 '),\n+('3281', 'net942', '530', '3523', '3723', '67', '70', '0', '2805.81', '3360.76', '144.743', '4.68931', '3280:0 3282:0 '),\n+('3282', 'net944', '530', '3523', '3723', '67', '70', '0', '2802.57', '3251.58', '147.597', '1.60466', '3281:0 3283:0 '),\n+('3283', 'net945', '530', '3523', '3723', '67', '70', '0', '2769.35', '3153.34', '149.314', '2.61194', '3284:0 3282:0 '),\n+('3284', 'net946', '530', '3523', '3723', '67', '70', '0', '2713.25', '3168.67', '147.073', '4.21416', '3283:0 3285:0 '),\n+('3285', 'net947', '530', '3523', '3721', '67', '70', '0', '2645.59', '3055.71', '123.459', '0.911553', '3284:0 3286:0 3301:0 3302:0 '),\n+('3286', 'net948', '530', '3523', '3723', '67', '70', '0', '2635.1', '3154.85', '135.257', '1.35923', '3285:0 3287:0 '),\n+('3287', 'net949', '530', '3523', '3523', '67', '70', '0', '2617.24', '3347.94', '142.696', '1.66554', '3286:0 3288:0 3291:0 '),\n+('3288', 'net950', '530', '3523', '3523', '67', '70', '0', '2742.84', '3444.31', '140.23', '4.12776', '3287:0 3280:0 3289:0 '),\n+('3289', 'net951', '530', '3523', '3523', '67', '70', '0', '2704.66', '3571.67', '134.738', '5.57132', '3288:0 3290:0 '),\n+('3290', 'net952', '530', '3523', '3523', '67', '70', '0', '2828.97', '3612.56', '157.278', '2.2157', '3289:0 3246:0 '),\n+('3291', 'net953', '530', '3523', '3721', '67', '70', '0', '2522.14', '3469.45', '130.706', '1.47151', '3287:0 3292:0 '),\n+('3292', 'net954', '530', '3523', '3523', '67', '70', '0', '2544.17', '3592.01', '138.626', '1.39297', '3291:0 3293:0 '),\n+('3293', 'net955', '530', '3523', '3721', '67', '70', '0', '2528.36', '3697.54', '134.608', '0.964924', '3292:0 3249:0 '),\n+('3294', 'net956', '530', '3523', '3523', '67', '70', '0', '3051.39', '3455.12', '118.577', '4.822', '3279:0 3295:0 '),\n+('3295', 'net957', '530', '3523', '3523', '67', '70', '0', '3057.51', '3309.81', '106.678', '5.00264', '3294:0 3296:0 '),\n+('3296', 'net958', '530', '3523', '3721', '67', '70', '0', '3103.15', '3197.03', '101.208', '5.67416', '3295:0 3297:0 3298:0 '),\n+('3297', 'net959', '530', '3523', '3721', '67', '70', '0', '3221.06', '3114.67', '102.79', '5.68986', '3296:0 3339:0 3340:0 '),\n+('3298', 'net960', '530', '3523', '3921', '67', '70', '0', '2987.27', '3194.73', '134.342', '4.05624', '3296:0 3299:0 '),\n+('3299', 'net961', '530', '3523', '3921', '67', '70', '0', '2929.07', '3149.43', '147.291', '1.12512', '3298:0 3300:0 '),\n+('3300', 'net962', '530', '3523', '3721', '67', '70', '0', '2829.63', '2992.81', '120.478', '2.75876', '3299:0 3301:0 '),\n+('3301', 'net963', '530', '3523', '3721', '67', '70', '0', '2726.18', '3015.49', '121.825', '2.99045', '3300:0 3285:0 '),\n+('3302', 'net964', '530', '3523', '3721', '67', '70', '0', '2519.49', '2940.34', '119.757', '3.88108', '3285:0 3303:0 '),\n+('3303', 'net965', '530', '3523', '3730', '67', '70', '0', '2455.26', '2867.95', '131.925', '4.34839', '3302:0 3304:0 3308:0 '),\n+('3304', 'net966', '530', '3523', '3730', '67', '70', '0', '2531.85', '2827', '126.995', '4.61936', '3305:0 3303:0 '),\n+('3305', 'net967', '530', '3523', '3730', '67', '70', '0', '2555.92', '2738.68', '119.45', '1.55822', '3304:0 3306:0 3330:0 '),\n+('3306', 'net970', '530', '3523', '3730', '67', '70', '0', '2501.34', '2718.83', '131.657', '2.74617', '3307:0 3305:0 3329:0 '),\n+('3307', 'net971', '530', '3523', '3730', '67', '70', '0', '2440.85', '2747.78', '134.493', '2.69511', '3308:0 3310:0 3306:0 '),\n+('3308', 'net972', '530', '3523', '3730', '67', '70', '0', '2424.83', '2798.75', '134.493', '1.0929', '3307:0 3309:0 3303:0 '),\n+('3309', 'net973', '530', '3523', '3730', '67', '70', '0', '2364.39', '2781.17', '133.656', '5.81904', '3308:0 3310:0 '),\n+('3310', 'net974', '530', '3523', '3730', '67', '70', '0', '2392.65', '2726.98', '134.491', '5.0199', '3307:0 3309:0 3311:0 '),\n+('3311', 'net975', '530', '3523', '3730', '67', '70', '0', '2364.76', '2665.91', '130.977', '1.12433', '3310:0 3312:0 '),\n+('3312', 'net976', '530', '3523', '3523', '67', '70', '0', '2326', '2600.19', '126.548', '4.98456', '3311:0 3313:0 '),\n+('3313', 'net977', '530', '3523', '3523', '67', '70', '0', '2287.03', '2439.79', '104.053', '4.47406', '3312:0 3314:0 '),\n+('3314', 'net978', '530', '3523', '3523', '67', '70', '0', '2336.37', '2367.16', '115.816', '5.18877', '3313:0 3327:0 3315:0 '),\n+('3315', 'net979', '530', '3523', '3523', '67', '70', '0', '2310.67', '2271.59', '98.2741', '5.2673', '3314:0 3316:0 3321:0 '),\n+('3316', 'net981', '530', '3523', '3935', '67', '70', '0', '2246.67', '2310.26', '89.8977', '3.71223', '3317:0 3326:0 3315:0 '),\n+('3317', 'net982', '530', '3523', '3934', '67', '70', '0', '2176.86', '2262.3', '76.0387', '4.01068', '3316:0 3318:0 3326:0 '),\n+('3318', 'net983', '530', '3523', '3934', '67', '70', '0', '2119.56', '2206.31', '71.3039', '6.1607', '3317:0 3319:0 '),\n+('3319', 'net984', '530', '3523', '3934', '67', '70', '0', '2180.34', '2173.31', '71.6002', '5.61288', '3318:0 3320:0 '),\n+('3320', 'net985', '530', '3523', '3934', '67', '70', '0', '2233.52', '2115.22', '71.2016', '2.29655', '3319:0 3321:0 '),\n+('3321', 'net987', '530', '3523', '3934', '67', '70', '0', '2294.17', '2189.49', '93.5883', '6.28047', '3322:0 3315:0 3320:0 '),\n+('3322', 'net990', '530', '3523', '3934', '67', '70', '0', '2353.3', '2183.05', '89.3993', '6.15874', '3321:0 3323:0 '),\n+('3323', 'net991', '530', '3523', '3879', '67', '70', '0', '2411.12', '2183.37', '89.9985', '4.94529', '3322:0 3324:0 '),\n+('3324', 'net992', '530', '3523', '3879', '67', '70', '0', '2523.75', '2185.83', '102.693', '5.98201', '3323:0 3325:0 '),\n+('3325', 'net993', '530', '3523', '3879', '67', '70', '0', '2484.6', '2033.27', '88.1469', '4.36606', '3324:0 '),\n+('3326', 'net997', '530', '3523', '3935', '67', '70', '0', '2183.73', '2382.64', '98.0661', '5.72675', '3316:0 3317:0 '),\n+('3327', 'net999', '530', '3523', '3837', '67', '70', '0', '2400.24', '2395.93', '142.613', '3.9737', '3328:0 3314:0 '),\n+('3328', 'net1000', '530', '3523', '3837', '67', '70', '0', '2482.84', '2424.13', '134.571', '3.45533', '3327:0 3329:0 '),\n+('3329', 'net1001', '530', '3523', '3523', '67', '70', '0', '2516.55', '2638.79', '129.583', '6.18383', '3328:0 3306:0 3330:0 '),\n+('3330', 'net1003', '530', '3523', '3523', '67', '70', '0', '2599.94', '2630.3', '129.384', '5.99453', '3305:0 3329:0 3331:0 '),\n+('3331', 'net1004', '530', '3523', '3721', '67', '70', '0', '2697.9', '2608.37', '102.479', '0.0883238', '3332:0 3330:0 '),\n+('3332', 'net1005', '530', '3523', '3721', '67', '70', '0', '2824.9', '2626.19', '104.537', '0.139375', '3331:0 3333:0 '),\n+('3333', 'net1006', '530', '3523', '3523', '67', '70', '0', '2944.38', '2624.27', '115.88', '6.27726', '3332:0 3334:0 '),\n+('3334', 'net1007', '530', '3523', '3523', '67', '70', '0', '3044.31', '2606.49', '109.94', '6.10839', '3333:0 3335:0 3364:0 '),\n+('3335', 'net1008', '530', '3523', '3523', '67', '70', '0', '3088.57', '2759.93', '115.588', '1.28997', '3334:0 3336:0 '),\n+('3336', 'net1009', '530', '3523', '3523', '67', '70', '0', '3181.15', '2839.31', '132.63', '0.00191784', '3335:0 3337:0 '),\n+('3337', 'net1010', '530', '3523', '3877', '67', '70', '0', '3314.68', '2857.1', '140.864', '0.174705', '3336:0 3338:0 3348:0 '),\n+('3338', 'net1011', '530', '3523', '3523', '67', '70', '0', '3251.04', '2889.15', '139.525', '5.61752', '3337:0 3339:0 '),\n+('3339', 'net1012', '530', '3523', '3523', '67', '70', '0', '3260.45', '2979.53', '133.71', '1.72431', '3338:0 3297:0 '),\n+('3340', 'net1013', '530', '3523', '3721', '67', '70', '0', '3328.19', '3109.33', '123.938', '0.003479', '3297:0 3341:0 '),\n+('3341', 'net1014', '530', '3523', '3721', '67', '70', '0', '3467.09', '3253.66', '100.83', '0.804579', '3340:0 3342:0 '),\n+('3342', 'net1015', '530', '3523', '3523', '67', '70', '0', '3558.21', '3192.19', '105.717', '5.68976', '3341:0 3343:0 '),\n+('3343', 'net1016', '530', '3523', '3877', '67', '70', '0', '3523.96', '3113.12', '130.592', '4.30353', '3342:0 3344:0 '),\n+('3344', 'net1017', '530', '3523', '3877', '67', '70', '0', '3511.13', '3048.77', '142.826', '5.09678', '3343:0 3345:0 '),\n+('3345', 'net1018', '530', '3523', '3877', '67', '70', '0', '3536.43', '3000.68', '143.097', '5.20281', '3344:0 3349:0 3346:0 '),\n+('3346', 'net1020', '530', '3523', '3877', '67', '70', '0', '3646.43', '3045.04', '123.609', '0.195882', '3345:0 3347:0 '),\n+('3347', 'net1021', '530', '3523', '3523', '67', '70', '0', '3924.41', '3119.4', '115.634', '0.278359', '3480:0 3346:0 '),\n+('3348', 'net1022', '530', '3523', '3877', '67', '70', '1', '3410.82', '2878.14', '142.972', '0.18804', '3337:0 3349:0 3350:0 '),\n+('3349', 'net1023', '530', '3523', '3877', '67', '70', '0', '3473.27', '2973.11', '143.266', '0.989146', '3348:0 3345:0 '),\n+('3350', 'net1024', '530', '3523', '3877', '67', '70', '0', '3472.55', '2819.87', '145.201', '4.69465', '3348:0 3351:0 '),\n+('3351', 'net1025', '530', '3523', '3523', '67', '70', '0', '3576.26', '2719.73', '151.525', '3.15525', '3350:0 3352:0 '),\n+('3352', 'net1026', '530', '3523', '3523', '67', '70', '0', '3439.56', '2608.19', '150.833', '0.802981', '3351:0 3353:0 '),\n+('3353', 'net1027', '530', '3523', '3523', '67', '70', '0', '3372.76', '2617.96', '145.564', '2.25596', '3352:0 3354:0 3357:0 '),\n+('3354', 'net1028', '530', '3523', '3727', '67', '70', '0', '3328.76', '2674.02', '157.504', '3.71287', '3353:0 3355:0 '),\n+('3355', 'net1029', '530', '3523', '3727', '67', '70', '0', '3250.52', '2628.38', '139.888', '2.91962', '3354:0 3356:0 '),\n+('3356', 'net1030', '530', '3523', '3523', '67', '70', '0', '3285.42', '2563.6', '113.658', '4.09772', '3355:0 3357:0 '),\n+('3357', 'net1031', '530', '3523', '3523', '67', '70', '0', '3352.87', '2536.5', '95.7401', '1.21138', '3353:0 3356:0 3358:0 '),\n+('3358', 'net1033', '530', '3523', '3728', '67', '70', '0', '3246.86', '2379.03', '91.5897', '4.38044', '3357:0 3359:0 '),\n+('3359', 'net1035', '530', '3523', '3728', '67', '70', '0', '3241.13', '2272.31', '99.5301', '4.56501', '3358:0 3360:0 '),\n+('3360', 'net1037', '530', '3523', '3728', '67', '70', '0', '3202.86', '2140.94', '138.867', '1.63547', '3377:0 3359:0 3361:0 '),\n+('3361', 'net1039', '530', '3523', '3728', '67', '70', '0', '3162.82', '2326.75', '134.887', '1.78864', '3360:0 3362:0 '),\n+('3362', 'net1040', '530', '3523', '3728', '67', '70', '0', '3160.48', '2406.47', '131.04', '1.60014', '3363:0 3361:0 '),\n+('3363', 'net1041', '530', '3523', '3728', '67', '70', '0', '3113.17', '2449.04', '120.183', '2.1774', '3362:0 3364:0 '),\n+('3364', 'net1042', '530', '3523', '3728', '67', '70', '0', '3069.26', '2504.52', '114.18', '1.78077', '3363:0 3334:0 3365:0 '),\n+('3365', 'net1043', '530', '3523', '3734', '67', '70', '0', '3083.75', '2363.04', '144.526', '4.81242', '3364:0 3366:0 '),\n+('3366', 'net1044', '530', '3523', '3734', '67', '70', '0', '3085.33', '2294.83', '150.494', '4.74173', '3365:0 3367:0 3373:0 '),\n+('3367', 'net1045', '530', '3523', '3734', '67', '70', '0', '3125.61', '2238.22', '150.562', '3.67359', '3366:0 3368:0 '),\n+('3368', 'net1046', '530', '3523', '3734', '67', '70', '0', '3074.15', '2209.78', '161.33', '3.55578', '3367:0 3369:0 '),\n+('3369', 'net1047', '530', '3523', '3734', '67', '70', '0', '3017.03', '2183.87', '165.329', '3.55578', '3368:0 3370:0 3372:0 '),\n+('3370', 'net1048', '530', '3523', '3734', '67', '70', '0', '2998.08', '2133.47', '165.328', '4.35295', '3369:0 3371:0 3374:0 '),\n+('3371', 'net1049', '530', '3523', '3734', '67', '70', '0', '2946.6', '2153.28', '165.328', '2.77429', '3370:0 3372:0 '),\n+('3372', 'net1050', '530', '3523', '3734', '67', '70', '0', '2965.73', '2206.06', '165.328', '1.22313', '3371:0 3369:0 3373:0 '),\n+('3373', 'net1051', '530', '3523', '3734', '67', '70', '0', '2936.31', '2281.19', '161.738', '6.1684', '3366:0 3372:0 '),\n+('3374', 'net1054', '530', '3523', '3734', '67', '70', '0', '3024.32', '2073.46', '161.904', '5.51533', '3370:0 3375:0 '),\n+('3375', 'net1055', '530', '3523', '3728', '67', '70', '0', '3109.36', '1996.97', '143.897', '5.55067', '3374:0 3376:0 '),\n+('3376', 'net1056', '530', '3523', '3728', '67', '70', '0', '3166.19', '1968.36', '143.636', '5.79022', '3375:0 3377:0 3378:0 '),\n+('3377', 'net1057', '530', '3523', '3728', '67', '70', '0', '3200.13', '2051.68', '140.786', '4.08789', '3376:0 3360:0 '),\n+('3378', 'net1058', '530', '3523', '3728', '67', '70', '0', '3152.12', '1897.92', '143.899', '6.07689', '3376:0 3379:0 3381:0 '),\n+('3379', 'net1059', '530', '3523', '3728', '67', '70', '0', '3101.78', '1824.2', '144.391', '4.03094', '3380:0 3378:0 '),\n+('3380', 'net1060', '530', '3523', '3728', '67', '70', '1', '3001.93', '1820.1', '139.674', '3.72463', '3379:0 '),\n+('3381', 'net1061', '530', '3523', '3728', '67', '70', '0', '3242.1', '1874.48', '139.223', '3.2581', '3378:0 3382:0 '),\n+('3382', 'net1062', '530', '3523', '3721', '67', '70', '0', '3356.3', '1846.42', '102.117', '6.15621', '3381:0 3383:0 '),\n+('3383', 'net1063', '530', '3523', '3721', '67', '70', '0', '3493.95', '1840.83', '95.7573', '0.214661', '3382:0 3384:0 '),\n+('3384', 'net1064', '530', '3523', '3735', '67', '70', '0', '3613.29', '1892.38', '114.291', '3.62722', '3383:0 3413:0 3414:0 '),\n+('3385', 'net1066', '530', '3523', '3736', '67', '70', '0', '3865.27', '1760.4', '212.947', '0.885387', '3386:0 3410:0 '),\n+('3386', 'net1067', '530', '3523', '3736', '67', '70', '0', '3913.4', '1809.95', '227.674', '2.24413', '3385:0 3396:0 3387:0 '),\n+('3387', 'net1070', '530', '3523', '3736', '67', '70', '0', '3881.31', '1918.58', '254.223', '0.97178', '3386:0 3388:0 '),\n+('3388', 'net1071', '530', '3523', '3736', '67', '70', '0', '3915.93', '1973.35', '257.813', '1.00712', '3389:0 3391:0 3387:0 '),\n+('3389', 'net1072', '530', '3523', '3736', '67', '70', '0', '3903.14', '2024.48', '257.813', '1.77289', '3388:0 3390:0 '),\n+('3390', 'net1073', '530', '3523', '3736', '67', '70', '0', '3959.61', '2037.62', '257.813', '0.233506', '3389:0 3391:0 3392:0 '),\n+('3391', 'net1074', '530', '3523', '3736', '67', '70', '0', '3969.45', '1982.24', '257.813', '4.86736', '3390:0 3388:0 '),\n+('3392', 'net1075', '530', '3523', '3736', '67', '70', '0', '3996.64', '2094.06', '254.332', '0.975711', '3390:0 3393:0 '),\n+('3393', 'net1077', '530', '3523', '3736', '67', '70', '0', '4094.87', '2029.53', '236.513', '5.17366', '3392:0 3394:0 '),\n+('3394', 'net1078', '530', '3523', '3736', '67', '70', '0', '4145.6', '1950.14', '225.805', '2.1106', '3397:0 3395:0 3393:0 '),\n+('3395', 'net1079', '530', '3523', '3736', '67', '70', '0', '4106.82', '1883.96', '228.654', '3.273', '3394:0 3396:0 '),\n+('3396', 'net1081', '530', '3523', '3736', '67', '70', '0', '3993.09', '1800.64', '228.295', '3.01381', '3386:0 3395:0 '),\n+('3397', 'net1082', '530', '3523', '3736', '67', '70', '0', '4192.46', '2017.97', '187.695', '1.85243', '3394:0 3398:0 '),\n+('3398', 'net1083', '530', '3523', '3736', '67', '70', '0', '4174.2', '2071.5', '164.367', '1.33406', '3397:0 3399:0 '),\n+('3399', 'net1084', '530', '3523', '3735', '67', '70', '0', '4198.79', '2173.44', '151.336', '1.33406', '3398:0 3400:0 3401:0 3431:0 '),\n+('3400', 'net1085', '530', '3523', '3735', '67', '70', '0', '4292.53', '2293.49', '122.367', '0.595787', '3399:0 3432:0 '),\n+('3401', 'net1086', '530', '3523', '3854', '67', '70', '0', '4247.96', '2110.73', '144.575', '4.7741', '3399:0 3402:0 '),\n+('3402', 'net1087', '530', '3523', '3735', '67', '70', '0', '4252.18', '1989.35', '136.107', '4.82514', '3401:0 3403:0 '),\n+('3403', 'net1088', '530', '3523', '3735', '67', '70', '0', '4268.67', '1894.47', '138.946', '4.87226', '3402:0 3404:0 3407:0 '),\n+('3404', 'net1089', '530', '3523', '3735', '67', '70', '0', '4299.75', '1730.52', '113.615', '4.18507', '3403:0 3405:0 '),\n+('3405', 'net1090', '530', '3523', '3735', '67', '70', '0', '4113.8', '1674.62', '130.483', '2.68103', '3404:0 3406:0 '),\n+('3406', 'net1091', '530', '3523', '3735', '67', '70', '0', '4046.36', '1742.75', '145.812', '2.35116', '3405:0 3407:0 3408:0 '),\n+('3407', 'net1092', '530', '3523', '3735', '67', '70', '0', '4181.61', '1781.88', '136.718', '0.423012', '3406:0 3403:0 '),\n+('3408', 'net1093', '530', '3523', '3735', '67', '70', '0', '3930.55', '1683.62', '139.355', '3.27165', '3406:0 3409:0 '),\n+('3409', 'net1094', '530', '3523', '3735', '67', '70', '0', '3819.95', '1651.37', '133.174', '2.01794', '3408:0 3411:0 3410:0 '),\n+('3410', 'net1095', '530', '3523', '3735', '67', '70', '0', '3785.44', '1751.5', '175.377', '2.55396', '3385:0 3409:0 3413:0 '),\n+('3411', 'net1097', '530', '3523', '3735', '67', '70', '0', '3779.17', '1581.07', '120.895', '1.36998', '3409:0 3412:0 '),\n+('3412', 'net1098', '530', '3523', '3735', '67', '70', '0', '3710.46', '1647.45', '128.67', '1.14614', '3411:0 3413:0 '),\n+('3413', 'net1099', '530', '3523', '3735', '67', '70', '0', '3682.83', '1822.97', '129.53', '5.05546', '3412:0 3384:0 3410:0 '),\n+('3414', 'net1100', '530', '3523', '3735', '67', '70', '0', '3551.83', '1960.87', '89.9501', '1.23472', '3384:0 3415:0 3416:0 '),\n+('3415', 'net1101', '530', '3523', '3735', '67', '70', '0', '3582.85', '2061.58', '97.1173', '1.30541', '3414:0 '),\n+('3416', 'net1102', '530', '3523', '3735', '67', '70', '0', '3654.98', '2151.19', '121.699', '1.26065', '3414:0 3417:0 '),\n+('3417', 'net1103', '530', '3523', '3735', '67', '70', '0', '3647.05', '2320.07', '95.0628', '1.67298', '3416:0 3418:0 '),\n+('3418', 'net1104', '530', '3523', '3735', '67', '70', '0', '3753.6', '2270.39', '127.706', '5.84031', '3417:0 3419:0 '),\n+('3419', 'net1105', '530', '3523', '3735', '67', '70', '0', '3743.54', '2216.22', '132.261', '5.08632', '3418:0 3420:0 '),\n+('3420', 'net1106', '530', '3523', '3880', '67', '70', '0', '3752.43', '2164.28', '140.754', '4.1949', '3419:0 3421:0 3427:0 '),\n+('3421', 'net1107', '530', '3523', '3880', '67', '70', '0', '3712.58', '2091.74', '151.686', '5.93062', '3420:0 3422:0 '),\n+('3422', 'net1108', '530', '3523', '3880', '67', '70', '0', '3791.21', '2078.46', '153.464', '0.004788', '3421:0 3423:0 '),\n+('3423', 'net1109', '530', '3523', '3880', '67', '70', '0', '3833.37', '2045.96', '145.651', '5.41226', '3422:0 3424:0 '),\n+('3424', 'net1110', '530', '3523', '3880', '67', '70', '0', '3890.34', '2027.56', '147.129', '1.10633', '3423:0 3425:0 '),\n+('3425', 'net1112', '530', '3523', '3880', '67', '70', '0', '3911.03', '2086.24', '156.158', '1.07294', '3424:0 3426:0 '),\n+('3426', 'net1113', '530', '3523', '3880', '67', '70', '0', '3942.19', '2139.62', '160.422', '6.24086', '3425:0 '),\n+('3427', 'net1114', '530', '3523', '3735', '67', '70', '0', '3790.48', '2245.91', '149.586', '4.56011', '3420:0 3428:0 '),\n+('3428', 'net1115', '530', '3523', '3735', '67', '70', '0', '3843.92', '2279.21', '153.861', '2.84204', '3427:0 3429:0 '),\n+('3429', 'net1116', '530', '3523', '3735', '67', '70', '0', '3944.34', '2283.35', '158.599', '6.04059', '3428:0 3430:0 '),\n+('3430', 'net1117', '530', '3523', '3735', '67', '70', '0', '4063.98', '2226.19', '164.346', '5.41228', '3429:0 3431:0 '),\n+('3431', 'net1119', '530', '3523', '3735', '67', '70', '0', '4123.87', '2142.65', '157.701', '2.91076', '3399:0 3430:0 '),\n+('3432', 'net1121', '530', '3523', '3741', '67', '70', '0', '4466.87', '2397.83', '122.968', '0.527102', '3400:0 3433:0 '),\n+('3433', 'net1122', '530', '3523', '3741', '67', '70', '0', '4530.13', '2410.14', '141.874', '5.42799', '3432:0 3434:0 3438:0 '),\n+('3434', 'net1123', '530', '3523', '3741', '67', '70', '0', '4566.37', '2316.31', '146.43', '5.07457', '3433:0 3435:0 '),\n+('3435', 'net1124', '530', '3523', '3741', '67', '70', '0', '4632.34', '2295.23', '162.104', '1.47351', '3434:0 3436:0 '),\n+('3436', 'net1125', '530', '3523', '3741', '67', '70', '0', '4622.3', '2365.33', '187.361', '1.96046', '3435:0 3437:0 '),\n+('3437', 'net1126', '530', '3523', '3741', '67', '70', '0', '4729.92', '2383.24', '198.355', '3.24458', '3436:0 '),\n+('3438', 'net1127', '530', '3523', '3741', '67', '70', '0', '4575.52', '2543.12', '194.543', '0.915856', '3433:0 3439:0 '),\n+('3439', 'net1128', '530', '3523', '3741', '67', '70', '0', '4579.8', '2608.07', '196.971', '1.06115', '3438:0 3440:0 '),\n+('3440', 'net1129', '530', '3523', '3741', '67', '70', '0', '4616.02', '2682.15', '187.718', '1.52847', '3439:0 3441:0 '),\n+('3441', 'net1130', '530', '3523', '3523', '67', '70', '0', '4613.1', '2774.93', '159.097', '0.786306', '3440:0 3442:0 3461:0 '),\n+('3442', 'net1131', '530', '3523', '3523', '67', '70', '0', '4581.46', '2841.92', '146.738', '1.62271', '3441:0 3443:0 3462:0 '),\n+('3443', 'net1132', '530', '3523', '3523', '67', '70', '0', '4623.84', '2957.12', '144.621', '1.21823', '3442:0 3444:0 3463:0 '),\n+('3444', 'net1133', '530', '3523', '3850', '67', '70', '0', '4760.8', '2985.3', '129.535', '0.205073', '3443:0 3445:0 '),\n+('3445', 'net1134', '530', '3523', '3850', '67', '70', '0', '4849.32', '2917.43', '146.288', '5.62826', '3444:0 3446:0 '),\n+('3446', 'net1135', '530', '3523', '3874', '67', '70', '0', '4916.97', '2942.46', '157.256', '0.212934', '3445:0 3447:0 '),\n+('3447', 'net1136', '530', '3523', '3850', '67', '70', '0', '4803.44', '3004.17', '134.11', '2.64374', '3446:0 3448:0 '),\n+('3448', 'net1137', '530', '3523', '3523', '67', '70', '0', '4689.74', '3022.54', '131.238', '0.00480604', '3447:0 3449:0 '),\n+('3449', 'net1138', '530', '3523', '3523', '67', '70', '0', '4770.95', '3072.84', '120.927', '0.216864', '3448:0 3450:0 '),\n+('3450', 'net1139', '530', '3523', '3523', '67', '70', '0', '4841.73', '3077.92', '111.914', '5.77749', '3449:0 3451:0 3533:0 '),\n+('3451', 'net1140', '530', '3523', '3874', '67', '70', '0', '4921.37', '3026.16', '99.5096', '5.7068', '3450:0 3452:0 '),\n+('3452', 'net1141', '530', '3523', '3874', '67', '70', '0', '5030.73', '3015.92', '91.2729', '6.18983', '3451:0 3453:0 '),\n+('3453', 'net1142', '530', '3523', '3874', '67', '70', '0', '5047.36', '2928.45', '88.8179', '4.9057', '3452:0 3454:0 '),\n+('3454', 'net1143', '530', '3523', '3874', '67', '70', '0', '4988.68', '2838.26', '81.9239', '3.64121', '3453:0 3455:0 '),\n+('3455', 'net1144', '530', '3523', '3850', '67', '70', '0', '4907.06', '2817.68', '91.5802', '3.63336', '3454:0 3456:0 '),\n+('3456', 'net1145', '530', '3523', '3850', '67', '70', '0', '4903.41', '2721.51', '83.4709', '4.33629', '3455:0 3457:0 '),\n+('3457', 'net1146', '530', '3523', '3850', '67', '70', '0', '4844.82', '2634.49', '94.0377', '2.49061', '3456:0 3458:0 '),\n+('3458', 'net1147', '530', '3523', '3850', '67', '70', '0', '4803.14', '2703.36', '87.3788', '2.22751', '3457:0 3459:0 '),\n+('3459', 'net1148', '530', '3523', '3850', '67', '70', '0', '4741.03', '2771.78', '92.6406', '2.30998', '3458:0 3460:0 '),\n+('3460', 'net1149', '530', '3523', '3850', '67', '70', '0', '4719.31', '2848.51', '113.113', '1.8623', '3459:0 3461:0 '),\n+('3461', 'net1150', '530', '3523', '3850', '67', '70', '0', '4656.43', '2805.22', '134.562', '3.22497', '3460:0 3441:0 '),\n+('3462', 'net1151', '530', '3523', '3876', '67', '70', '0', '4484.96', '2804.2', '139.481', '1.71701', '3442:0 3484:0 '),\n+('3463', 'net1152', '530', '3523', '3740', '67', '70', '0', '4590.85', '3169.73', '146.93', '4.87431', '3443:0 3464:0 3465:0 3470:0 3523:0 '),\n+('3464', 'net1153', '530', '3523', '3740', '67', '70', '0', '4693.85', '3149.86', '170.153', '5.31804', '3463:0 3465:0 '),\n+('3465', 'net1154', '530', '3523', '3740', '1', '60', '0', '4655.8', '3065', '169.231', '2.59665', '3464:0 3463:0 3466:0 '),\n+('3466', 'net1155', '530', '3523', '3740', '67', '70', '0', '4685.7', '3259.51', '173.132', '2.39442', '3465:0 3467:0 3469:0 '),\n+('3467', 'net1156', '530', '3523', '3740', '67', '70', '0', '4776.31', '3293.39', '196.421', '1.55207', '3466:0 3468:0 '),\n+('3468', 'net1157', '530', '3523', '3740', '67', '70', '0', '4732.45', '3359.96', '201.252', '3.83758', '3467:0 3469:0 '),\n+('3469', 'net1158', '530', '3523', '3740', '67', '70', '0', '4630.74', '3310.08', '170.694', '5.45551', '3468:0 3466:0 '),\n+('3470', 'net1159', '530', '3523', '3523', '67', '70', '0', '4397.77', '3265.13', '143.404', '2.67128', '3463:0 3471:0 3475:0 3476:0 3523:0 3487:0 '),\n+('3471', 'net1160', '530', '3523', '3739', '67', '70', '0', '4463.52', '3434.86', '167.212', '1.19866', '3470:0 3472:0 3475:0 '),\n+('3472', 'net1161', '530', '3523', '3739', '67', '70', '0', '4387.49', '3412.69', '167.78', '2.42782', '3471:0 3473:0 '),\n+('3473', 'net1162', '530', '3523', '3739', '67', '70', '0', '4350.61', '3471.82', '175.837', '4.81542', '3472:0 3474:0 '),\n+('3474', 'net1163', '530', '3523', '3739', '67', '70', '0', '4364.97', '3377.13', '154.103', '0.876653', '3473:0 3475:0 '),\n+('3475', 'net1164', '530', '3523', '3739', '67', '70', '0', '4427.16', '3339.99', '152.658', '0.896303', '3474:0 3470:0 3471:0 '),\n+('3476', 'net1165', '530', '3523', '3738', '67', '70', '0', '4313.76', '3185.04', '161.274', '0.774559', '3470:0 3477:0 '),\n+('3477', 'net1166', '530', '3523', '3738', '67', '70', '1', '4231.39', '3159.2', '178.712', '0.566429', '3476:0 3478:0 '),\n+('3478', 'net1167', '530', '3523', '3738', '67', '70', '0', '4178.63', '3151.63', '175.35', '3.55094', '3477:0 3479:0 '),\n+('3479', 'net1168', '530', '3523', '3738', '67', '70', '0', '4098.18', '3118.59', '159.275', '3.31924', '3478:0 3480:0 '),\n+('3480', 'net1169', '530', '3523', '3738', '67', '70', '0', '4000.86', '3107.64', '138.035', '3.24856', '3479:0 3347:0 3481:0 '),\n+('3481', 'net1170', '530', '3523', '3875', '67', '70', '0', '4031.23', '3259.48', '139.947', '1.37536', '3480:0 3482:0 '),\n+('3482', 'net1171', '530', '3523', '3875', '67', '70', '0', '4071.98', '3372.71', '141.877', '5.11779', '3481:0 3483:0 3489:0 '),\n+('3483', 'net1172', '530', '3523', '3875', '67', '70', '0', '4151.5', '3229.24', '196.056', '3.95933', '3482:0 '),\n+('3484', 'net1173', '530', '3523', '3876', '67', '70', '0', '4466.66', '2879.42', '140.619', '2.91867', '3462:0 3485:0 '),\n+('3485', 'net1174', '530', '3523', '3876', '67', '70', '0', '4370.42', '2904.8', '148.304', '2.95794', '3484:0 3486:0 '),\n+('3486', 'net1175', '530', '3523', '3876', '67', '70', '0', '4330.52', '2945.08', '132.085', '5.41232', '3485:0 '),\n+('3487', 'net1176', '530', '3523', '3523', '67', '70', '0', '4301.84', '3317.13', '147.441', '2.74981', '3470:0 3488:0 '),\n+('3488', 'net1178', '530', '3523', '3523', '67', '70', '0', '4181.61', '3456.1', '144.034', '2.38458', '3489:0 3487:0 '),\n+('3489', 'net1179', '530', '3523', '3875', '67', '70', '0', '4137.43', '3393.24', '142.177', '3.93968', '3488:0 3482:0 3490:0 '),\n+('3490', 'net1180', '530', '3523', '3523', '67', '70', '0', '4138.78', '3496.33', '135.37', '2.48591', '3489:0 3491:0 3517:0 '),\n+('3491', 'net1181', '530', '3523', '3852', '67', '70', '0', '4091.57', '3538.26', '117.689', '1.98718', '3490:0 3492:0 '),\n+('3492', 'net1182', '530', '3523', '3852', '67', '70', '0', '4069.39', '3591.81', '114.31', '2.34453', '3491:0 3493:0 '),\n+('3493', 'net1183', '530', '3523', '3722', '67', '70', '0', '3910.13', '3724.58', '112.828', '2.44664', '3492:0 3494:0 '),\n+('3494', 'net1184', '530', '3523', '3722', '67', '70', '0', '3891.58', '3773.08', '119.636', '1.37064', '3493:0 3495:0 3510:0 '),\n+('3495', 'net1185', '530', '3523', '3722', '67', '70', '0', '3908.92', '3833.69', '129.749', '1.2921', '3494:0 3496:0 '),\n+('3496', 'net1186', '530', '3523', '3722', '67', '70', '0', '3990.07', '3844.3', '168.636', '3.74058', '3495:0 3497:0 '),\n+('3497', 'net1188', '530', '3523', '3722', '67', '70', '0', '3883.22', '3936.25', '179.58', '1.96754', '3496:0 3498:0 '),\n+('3498', 'net1189', '530', '3523', '3722', '67', '70', '0', '3884.07', '3990.71', '182.988', '1.21356', '3499:0 3509:0 3497:0 '),\n+('3499', 'net1190', '530', '3523', '3722', '67', '70', '0', '3912.9', '4038.34', '190.499', '6.07518', '3498:0 3500:0 '),\n+('3500', 'net1191', '530', '3523', '3722', '67', '70', '0', '3973.04', '4023.83', '194.227', '6.0634', '3499:0 3501:0 3503:0 '),\n+('3501', 'net1192', '530', '3523', '3722', '67', '70', '0', '4018.79', '4051.87', '194.227', '0.549902', '3500:0 3502:0 3506:0 '),\n+('3502', 'net1193', '530', '3523', '3722', '67', '70', '0', '4047.95', '4004.82', '194.226', '3.89178', '3501:0 3503:0 '),\n+('3503', 'net1194', '530', '3523', '3722', '67', '70', '0', '4001.04', '3975.21', '194.226', '3.74256', '3502:0 3500:0 3504:0 '),\n+('3504', 'net1195', '530', '3523', '3722', '67', '70', '0', '3987.35', '3916.16', '191.701', '4.48476', '3503:0 3505:0 '),\n+('3505', 'net1196', '530', '3523', '3722', '67', '70', '0', '4046.25', '3890.47', '189.426', '0.432092', '3504:0 '),\n+('3506', 'net1197', '530', '3523', '3722', '67', '70', '0', '4034.82', '4111.42', '191.69', '4.44076', '3501:0 3507:0 '),\n+('3507', 'net1198', '530', '3523', '3722', '67', '70', '0', '4009.09', '4170.41', '196.566', '3.6907', '3506:0 3508:0 '),\n+('3508', 'net1199', '530', '3523', '3722', '67', '70', '0', '3913.64', '4108.63', '193.142', '4.23262', '3507:0 3509:0 '),\n+('3509', 'net1200', '530', '3523', '3722', '67', '70', '0', '3881.18', '4041.13', '183.645', '4.80596', '3508:0 3498:0 '),\n+('3510', 'net1202', '530', '3523', '3722', '67', '70', '0', '3793.14', '3905.54', '108.811', '1.48529', '3494:0 3511:0 '),\n+('3511', 'net1203', '530', '3523', '3881', '67', '70', '0', '3802.78', '4013.52', '122.041', '4.63866', '3512:0 3510:0 '),\n+('3512', 'net1204', '530', '3523', '3881', '67', '70', '0', '3873.36', '4009.36', '122.335', '5.89452', '3511:0 3513:0 '),\n+('3513', 'net1205', '530', '3523', '3881', '67', '70', '0', '3925.68', '3980.18', '123.291', '0.96222', '3512:0 3514:0 '),\n+('3514', 'net1206', '530', '3523', '3881', '67', '70', '0', '3946.32', '4028.85', '115.31', '5.07772', '3513:0 3515:0 '),\n+('3515', 'net1207', '530', '3523', '3881', '67', '70', '0', '4034.51', '3981.16', '124.954', '0.0315266', '3514:0 3516:0 '),\n+('3516', 'net1208', '530', '3523', '3881', '67', '70', '0', '4093.15', '3979.78', '116.913', '6.25973', '3515:0 '),\n+('3517', 'net1209', '530', '3523', '3523', '67', '70', '0', '4192.46', '3560.85', '141.75', '3.80144', '3490:0 3518:0 '),\n+('3518', 'net1210', '530', '3523', '3721', '67', '70', '0', '4226.42', '3607.77', '132.686', '0.593084', '3517:0 3519:0 '),\n+('3519', 'net1212', '530', '3523', '3721', '67', '70', '0', '4313.98', '3676.81', '118.894', '5.57251', '3518:0 3520:0 '),\n+('3520', 'net1213', '530', '3523', '3523', '67', '70', '0', '4402.34', '3609.63', '125.622', '5.65104', '3521:0 3519:0 '),\n+('3521', 'net1214', '530', '3523', '3523', '67', '70', '0', '4488.77', '3626.57', '104.723', '0.252208', '3520:0 3522:0 '),\n+('3522', 'net1215', '530', '3523', '3721', '67', '70', '0', '4533.39', '3589.74', '117.794', '5.57721', '3521:0 '),\n+('3523', 'net1216', '530', '3523', '3740', '67', '70', '0', '4515.18', '3245.18', '144.362', '1.06117', '3463:0 3470:0 3524:0 '),\n+('3524', 'net1217', '530', '3523', '3740', '67', '70', '0', '4540.26', '3296.59', '134.776', '0.813774', '3523:0 3525:0 '),\n+('3525', 'net1218', '530', '3523', '3523', '67', '70', '0', '4586.71', '3342.4', '125.714', '0.566373', '3524:0 3526:0 '),\n+('3526', 'net1219', '530', '3523', '3523', '67', '70', '0', '4668.88', '3392.34', '110.519', '0.444637', '3525:0 3527:0 '),\n+('3527', 'net1220', '530', '3523', '3900', '67', '70', '0', '4744.11', '3423.26', '102.517', '0.629205', '3526:0 3528:0 '),\n+('3528', 'net1221', '530', '3523', '3900', '67', '70', '0', '4791.18', '3452.42', '102.703', '5.32589', '3527:0 3529:0 '),\n+('3529', 'net1222', '530', '3523', '3523', '67', '70', '0', '4831.57', '3384.27', '122', '4.79967', '3528:0 3530:0 '),\n+('3530', 'net1223', '530', '3523', '3523', '67', '70', '0', '4850.84', '3313.75', '131.13', '3.99465', '3529:0 3531:0 '),\n+('3531', 'net1224', '530', '3523', '3523', '67', '70', '0', '4816.07', '3269.64', '149.703', '0.982658', '3530:0 3532:0 '),\n+('3532', 'net1225', '530', '3523', '3523', '67', '70', '0', '4832.65', '3173.12', '139.44', '1.878', '3531:0 3533:0 '),\n+('3533', 'net1226', '530', '3523', '3523', '67', '70', '0', '4806.1', '3117.37', '139.757', '4.67009', '3532:0 3450:0 '),\n+('3534', 'shmv1227', '530', '3520', '3520', '67', '70', '0', '-2866.67', '3174.8', '12.0966', '4.03472', '2763:0 3535:0 '),\n+('3535', 'shmv1228', '530', '3520', '3520', '67', '70', '0', '-2919.41', '3080.6', '39.7651', '0.776879', '3534:0 3536:0 '),\n+('3536', 'shmv1229', '530', '3520', '3520', '67', '70', '0', '-2912.13', '3021.5', '54.1235', '3.61375', '3535:0 3537:0 '),\n+('3537', 'shmv1230', '530', '3520', '3520', '67', '70', '0', '-3025.35', '2947.82', '86.1102', '3.93969', '3536:0 3538:0 '),\n+('3538', 'shmv1231', '530', '3520', '3743', '67', '70', '0', '-3075.55', '2877.97', '82.0334', '3.71192', '3537:0 3539:0 3546:0 3703:0 '),\n+('3539', 'shmv1232', '530', '3520', '3743', '67', '70', '0', '-3179.64', '2866.95', '94.9902', '2.90296', '3538:0 3540:0 '),\n+('3540', 'shmv1233', '530', '3520', '3743', '67', '70', '0', '-3236.04', '2882.68', '114.136', '3.1857', '3539:0 3541:0 3700:0 '),\n+('3541', 'shmv1234', '530', '3520', '3743', '67', '70', '0', '-3367.61', '2868.56', '158.738', '3.24853', '3540:0 3542:0 3545:0 '),\n+('3542', 'shmv1235', '530', '3520', '3743', '67', '70', '0', '-3404.24', '2930.17', '169.88', '0.354339', '3541:0 3543:0 '),\n+('3543', 'shmv1236', '530', '3520', '3743', '67', '70', '0', '-3346.8', '2955.36', '169.88', '0.413244', '3542:0 3544:0 '),\n+('3544', 'shmv1237', '530', '3520', '3743', '67', '70', '0', '-3375.43', '3001.18', '170.817', '2.12933', '3543:0 3545:0 '),\n+('3545', 'shmv1238', '530', '3520', '3743', '67', '70', '0', '-3444.14', '2938.58', '172.959', '3.88077', '3544:0 3541:0 '),\n+('3546', 'shmv1239', '530', '3520', '3520', '67', '70', '0', '-3181.96', '2718.28', '68.7275', '4.12424', '3538:0 3547:0 3556:0 '),\n+('3547', 'shmv1240', '530', '3520', '3744', '67', '70', '0', '-3176.94', '2562.78', '61.0113', '0.102998', '3546:0 3548:0 3557:0 '),\n+('3548', 'shmv1241', '530', '3520', '3744', '67', '70', '5', '-3111.48', '2564.12', '61.7347', '0.0205314', '3547:0 3549:0 '),\n+('3549', 'shmv1242', '530', '3520', '3744', '67', '70', '5', '-3059.25', '2507.74', '62.9718', '4.55621', '3548:0 3550:0 '),\n+('3550', 'shmv1243', '530', '3520', '3744', '67', '70', '4', '-3069.01', '2436.27', '63.7223', '4.4227', '3549:0 3551:0 '),\n+('3551', 'shmv1244', '530', '3520', '3520', '67', '70', '0', '-3123.06', '2321.13', '59.93', '3.60981', '3550:0 3552:0 3558:0 '),\n+('3552', 'shmv1245', '530', '3520', '3520', '67', '70', '0', '-3231.28', '2289.35', '59.5698', '4.92143', '3551:0 3553:0 3606:0 '),\n+('3553', 'shmv1246', '530', '3520', '3520', '67', '70', '0', '-3462.86', '2282.37', '63.8282', '3.30352', '3552:0 3554:0 3559:0 '),\n+('3554', 'shmv1247', '530', '3520', '3949', '67', '70', '0', '-3455.95', '2462.16', '58.5579', '1.65025', '3553:0 3555:0 3606:0 '),\n+('3555', 'shmv1248', '530', '3520', '3520', '67', '70', '0', '-3483.53', '2605.88', '62.0554', '4.92536', '3554:0 3556:0 3704:0 '),\n+('3556', 'shmv1249', '530', '3520', '3520', '67', '70', '0', '-3301.81', '2669.56', '57.3856', '0.154061', '3555:0 3546:0 3557:0 '),\n+('3557', 'shmv1250', '530', '3520', '3744', '67', '70', '0', '-3199.36', '2470.72', '62.1645', '2.00446', '3556:0 3547:0 3558:0 '),\n+('3558', 'shmv1251', '530', '3520', '3520', '67', '70', '0', '-3210.03', '2392.06', '61.8107', '5.34555', '3551:0 3557:0 '),\n+('3559', 'shmv1252', '530', '3520', '3520', '67', '70', '0', '-3690.32', '2310.79', '78.5618', '6.17099', '3553:0 3560:0 3566:0 3704:0 '),\n+('3560', 'shmv1253', '530', '3520', '3752', '67', '70', '0', '-3792.84', '2478.03', '79.8242', '1.51751', '3559:0 3561:0 3565:0 '),\n+('3561', 'shmv1254', '530', '3520', '3752', '67', '70', '0', '-3790.89', '2565.75', '91.2376', '1.68244', '3560:0 3562:0 3563:0 '),\n+('3562', 'shmv1255', '530', '3520', '3752', '67', '70', '0', '-3793.32', '2666.77', '101.912', '1.6471', '3561:0 '),\n+('3563', 'shmv1256', '530', '3520', '3752', '67', '70', '0', '-4020.54', '2670.54', '126.986', '4.24676', '3561:0 3564:0 '),\n+('3564', 'shmv1257', '530', '3520', '3752', '67', '70', '0', '-4064.49', '2549.64', '134.278', '5.45704', '3563:0 3565:0 '),\n+('3565', 'shmv1258', '530', '3520', '3752', '67', '70', '0', '-3950.4', '2473.76', '116.781', '0.0024457', '3564:0 3560:0 '),\n+('3566', 'shmv1259', '530', '3520', '3745', '67', '70', '0', '-3762.45', '2127.89', '76.7131', '3.78807', '3559:0 3567:0 3570:0 '),\n+('3567', 'shmv1260', '530', '3520', '3745', '67', '70', '2', '-3882.03', '2033.78', '96.002', '2.18978', '3566:0 3568:0 3570:0 '),\n+('3568', 'shmv1261', '530', '3520', '3745', '67', '70', '3', '-3952.84', '2136.12', '98.2022', '2.21727', '3567:0 3569:0 '),\n+('3569', 'shmv1262', '530', '3520', '3745', '67', '70', '3', '-3972.41', '2203.81', '101.676', '5.04862', '3568:0 '),\n+('3570', 'shmv1263', '530', '3520', '3520', '67', '70', '0', '-3769.55', '1947.31', '94.6509', '4.07473', '3566:0 3567:0 3571:0 '),\n+('3571', 'shmv1264', '530', '3520', '3520', '67', '70', '0', '-3890.57', '1771.31', '96.9587', '3.89017', '3570:0 3572:0 3607:0 '),\n+('3572', 'shmv1265', '530', '3520', '3520', '67', '70', '0', '-4052.33', '1643.87', '94.7068', '4.5499', '3571:0 3573:0 '),\n+('3573', 'shmv1266', '530', '3520', '3520', '67', '70', '0', '-4057.55', '1395.83', '83.9803', '4.95438', '3572:0 3574:0 3618:0 3633:0 '),\n+('3574', 'shmv1267', '530', '3520', '3520', '67', '70', '0', '-4028.73', '1253.84', '79.0241', '1.89525', '3573:0 3575:0 '),\n+('3575', 'shmv1268', '530', '3520', '3520', '67', '70', '0', '-3956.14', '1083.59', '27.6555', '5.11538', '3574:0 3576:0 3638:0 3725:0 '),\n+('3576', 'shmv1269', '530', '3520', '3520', '67', '70', '0', '-3882.17', '883.51', '18.5293', '4.46743', '3575:0 3577:0 3639:0 '),\n+('3577', 'shmv1270', '530', '3520', '3520', '67', '70', '0', '-3840.27', '741.517', '11.8649', '0.0181477', '3576:0 3578:0 3639:0 '),\n+('3578', 'shmv1271', '530', '3520', '3520', '67', '70', '0', '-3586.49', '737.497', '-11.4566', '0.0534906', '3577:0 3579:0 3581:0 3732:0 '),\n+('3579', 'shmv1272', '530', '3520', '3520', '67', '70', '0', '-3561.52', '586.272', '10.6201', '4.78552', '3578:0 3580:0 3647:0 3659:0 '),\n+('3580', 'shmv1273', '530', '3520', '3520', '67', '70', '0', '-3569.67', '423.902', '28.3305', '4.75019', '3579:0 '),\n+('3581', 'shmv1274', '530', '3520', '3520', '67', '70', '0', '-3346.71', '753.909', '-26.6716', '0.0849111', '3578:0 3582:0 3683:0 '),\n+('3582', 'shmv1275', '530', '3520', '3520', '67', '70', '0', '-3232.2', '784.314', '-19.8198', '0.00243998', '3581:0 3583:0 '),\n+('3583', 'shmv1276', '530', '3520', '3754', '67', '70', '0', '-3120.7', '799.898', '-22.5484', '1.24337', '3582:0 3584:0 3671:0 '),\n+('3584', 'shmv1277', '530', '3520', '3520', '67', '70', '0', '-3121.46', '1102.68', '20.44', '1.2473', '3583:0 3585:0 3671:0 '),\n+('3585', 'shmv1278', '530', '3520', '3753', '67', '70', '0', '-3106.91', '1197.3', '22.976', '1.40439', '3584:0 3586:0 3679:0 3680:0 '),\n+('3586', 'shmv1279', '530', '3520', '3520', '67', '70', '0', '-3026.37', '1314.44', '8.68562', '0.968488', '3585:0 3587:0 3687:0 '),\n+('3587', 'shmv1280', '530', '3520', '3520', '67', '70', '0', '-2904.03', '1491.38', '14.8027', '0.960634', '3586:0 3588:0 '),\n+('3588', 'shmv1281', '530', '3520', '3750', '67', '70', '0', '-2867.58', '1577.53', '15.2282', '2.85737', '3587:0 3589:0 3705:0 '),\n+('3589', 'shmv1282', '530', '3520', '3750', '67', '70', '0', '-2824.65', '1682.74', '22.3429', '1.17662', '3588:0 3590:0 '),\n+('3590', 'shmv1283', '530', '3520', '3750', '67', '70', '0', '-2886.26', '1742.5', '43.8502', '2.40576', '3589:0 3591:0 '),\n+('3591', 'shmv1284', '530', '3520', '3520', '67', '70', '0', '-2975.68', '1908', '104.519', '2.08612', '3590:0 3592:0 '),\n+('3592', 'shmv1285', '530', '3520', '3520', '67', '70', '0', '-3102.48', '1972.24', '105.605', '0.868752', '3591:0 3593:0 3596:0 '),\n+('3593', 'shmv1286', '530', '3520', '3520', '67', '70', '0', '-3180.63', '2099.72', '75.4619', '0.291484', '3592:0 3594:0 3597:0 '),\n+('3594', 'shmv1287', '530', '3520', '3933', '67', '70', '0', '-3042.81', '2156.41', '79.2338', '0.393586', '3593:0 3595:0 '),\n+('3595', 'shmv1288', '530', '3520', '3933', '67', '70', '0', '-3015.9', '2104.22', '90.4026', '4.71721', '3594:0 3596:0 '),\n+('3596', 'shmv1289', '530', '3520', '3933', '67', '70', '0', '-3017.6', '2046.19', '96.9335', '3.75903', '3595:0 3592:0 '),\n+('3597', 'shmv1290', '530', '3520', '3748', '67', '70', '0', '-3265.68', '2066.96', '73.9146', '4.35987', '3593:0 3606:0 3598:0 '),\n+('3598', 'shmv1291', '530', '3520', '3748', '67', '70', '0', '-3287.9', '1978.44', '52.6152', '2.07043', '3597:0 3602:0 '),\n+('3599', 'shmv1294', '530', '3520', '3748', '67', '70', '0', '-3389.68', '1984.65', '24.8931', '1.53832', '3600:0 3602:0 '),\n+('3600', 'shmv1295', '530', '3520', '3748', '67', '70', '0', '-3405.52', '2054.01', '15.1476', '3.06395', '3601:0 3599:0 '),\n+('3601', 'shmv1296', '530', '3520', '3748', '67', '70', '0', '-3321.42', '2125.97', '3.08638', '2.40814', '3600:0 '),\n+('3602', 'shmv1297', '530', '3520', '3748', '67', '70', '0', '-3343.59', '2008.19', '32.1771', '2.00758', '3603:0 3599:0 3598:0 '),\n+('3603', 'shmv1298', '530', '3520', '3748', '67', '70', '0', '-3419.14', '2114.58', '34.4588', '2.18822', '3602:0 3604:0 '),\n+('3604', 'shmv1299', '530', '3520', '3748', '67', '70', '0', '-3495.43', '2186.55', '33.5276', '5.96992', '3603:0 3605:0 '),\n+('3605', 'shmv1301', '530', '3520', '3748', '67', '70', '0', '-3410.98', '2272.59', '33.8565', '1.54813', '3604:0 '),\n+('3606', 'shmv1302', '530', '3520', '3949', '67', '70', '0', '-3336.88', '2207.97', '74.9806', '2.06645', '3597:0 3552:0 3554:0 '),\n+('3607', 'shmv1303', '530', '3520', '3932', '67', '70', '0', '-4003.29', '1878.34', '76.5277', '5.50491', '3571:0 3608:0 '),\n+('3608', 'shmv1304', '530', '3520', '3932', '67', '70', '0', '-4085.04', '1923.15', '77.0726', '5.10829', '3607:0 3609:0 '),\n+('3609', 'shmv1305', '530', '3520', '3932', '67', '70', '0', '-4058.27', '1821.93', '84.9857', '4.00088', '3608:0 3610:0 '),\n+('3610', 'shmv1306', '530', '3520', '3932', '67', '70', '0', '-4103.15', '1784.26', '103.457', '4.80985', '3609:0 3611:0 '),\n+('3611', 'shmv1307', '530', '3520', '3932', '67', '70', '0', '-4195.07', '1861.58', '109.916', '5.5167', '3610:0 3612:0 '),\n+('3612', 'shmv1308', '530', '3520', '3822', '67', '70', '0', '-4334.08', '1789.5', '144.816', '3.61996', '3611:0 3613:0 '),\n+('3613', 'shmv1309', '530', '3520', '3822', '67', '70', '0', '-4420.11', '1797.35', '157.396', '4.44855', '3612:0 3614:0 3622:0 '),\n+('3614', 'shmv1310', '530', '3520', '3822', '67', '70', '0', '-4448.82', '1724.98', '158.876', '4.33467', '3613:0 3615:0 3620:0 '),\n+('3615', 'shmv1311', '530', '3520', '3822', '67', '70', '0', '-4383.86', '1707.44', '156.573', '5.0533', '3614:0 3616:0 '),\n+('3616', 'shmv1312', '530', '3520', '3822', '67', '70', '0', '-4361', '1640.49', '156.748', '5.04152', '3615:0 3617:0 3619:0 '),\n+('3617', 'shmv1313', '530', '3520', '3822', '67', '70', '0', '-4252.69', '1521.47', '129.453', '5.45072', '3616:0 3618:0 3626:0 '),\n+('3618', 'shmv1314', '530', '3520', '3822', '67', '70', '0', '-4141.51', '1512.19', '103.518', '6.20863', '3617:0 3573:0 '),\n+('3619', 'shmv1315', '530', '3520', '3822', '67', '70', '0', '-4423.22', '1575.75', '164.241', '3.96398', '3616:0 3620:0 '),\n+('3620', 'shmv1316', '530', '3520', '3822', '67', '70', '0', '-4491.12', '1668.12', '165.043', '2.20469', '3619:0 3614:0 3621:0 '),\n+('3621', 'shmv1317', '530', '3520', '3822', '67', '70', '0', '-4564.8', '1670.31', '174.579', '3.11182', '3620:0 '),\n+('3622', 'shmv1318', '530', '3520', '3520', '67', '70', '0', '-4426.81', '1860.99', '159.258', '2.50232', '3613:0 3623:0 '),\n+('3623', 'shmv1319', '530', '3520', '3930', '67', '70', '0', '-4488.03', '1934.26', '144.075', '1.12787', '3622:0 3624:0 '),\n+('3624', 'shmv1320', '530', '3520', '3930', '67', '70', '0', '-4450.04', '1988.33', '105.344', '2.32482', '3623:0 3625:0 '),\n+('3625', 'shmv1321', '530', '3520', '3930', '67', '70', '0', '-4500.91', '2022.31', '100.196', '4.19013', '3624:0 '),\n+('3626', 'shmv1323', '530', '3520', '3929', '67', '70', '0', '-4234.47', '1405.21', '129.348', '4.72107', '3617:0 3627:0 '),\n+('3627', 'shmv1324', '530', '3520', '3929', '67', '70', '0', '-4309.54', '1384.96', '143.997', '3.08352', '3626:0 3628:0 '),\n+('3628', 'shmv1325', '530', '3520', '3950', '67', '70', '0', '-4558.9', '1328.47', '135.392', '6.27616', '3627:0 3629:0 '),\n+('3629', 'shmv1326', '530', '3520', '3929', '67', '70', '0', '-4452.67', '1313.79', '113.624', '0.000826359', '3628:0 3630:0 '),\n+('3630', 'shmv1327', '530', '3520', '3929', '67', '70', '0', '-4318.73', '1322.33', '73.5928', '6.21333', '3629:0 3631:0 3634:0 '),\n+('3631', 'shmv1328', '530', '3520', '3929', '67', '70', '0', '-4226.21', '1305.14', '56.0568', '6.20155', '3630:0 3632:0 '),\n+('3632', 'shmv1329', '530', '3520', '3929', '67', '70', '0', '-4117.45', '1299.67', '52.606', '1.29281', '3631:0 3633:0 '),\n+('3633', 'shmv1330', '530', '3520', '3520', '67', '70', '0', '-4096.52', '1451.91', '87.6478', '5.2198', '3632:0 3573:0 '),\n+('3634', 'shmv1331', '530', '3520', '3929', '67', '70', '0', '-4403.59', '1300.45', '84.0575', '3.42125', '3630:0 3635:0 '),\n+('3635', 'shmv1332', '530', '3520', '3520', '67', '70', '0', '-4511.47', '1203.3', '34.9082', '3.43695', '3634:0 3636:0 '),\n+('3636', 'shmv1333', '530', '3520', '3945', '67', '70', '0', '-4641.99', '1163.55', '-14.0182', '0.205018', '3635:0 3637:0 '),\n+('3637', 'shmv1334', '530', '3520', '3945', '67', '70', '0', '-4660.62', '1088.53', '0.90432', '5.98162', '3636:0 '),\n+('3638', 'shmv1335', '530', '3520', '3938', '67', '70', '1', '-4090.85', '1104.54', '41.0582', '5.28662', '3575:0 3639:0 '),\n+('3639', 'shmv1336', '530', '3520', '3758', '67', '70', '0', '-4110.45', '861.06', '9.26995', '4.56397', '3638:0 3576:0 3577:0 3640:0 '),\n+('3640', 'shmv1337', '530', '3520', '3939', '67', '70', '0', '-4149.68', '586.65', '8.64057', '4.66214', '3639:0 3641:0 '),\n+('3641', 'shmv1338', '530', '3520', '3939', '67', '70', '0', '-4184.61', '489.528', '29.5585', '1.24958', '3642:0 3643:0 3640:0 '),\n+('3642', 'shmv1339', '530', '3520', '3939', '67', '70', '0', '-4114.39', '424.914', '34.9882', '2.74575', '3641:0 '),\n+('3643', 'shmv1341', '530', '3520', '3939', '67', '70', '0', '-4224.07', '420.493', '51.1341', '1.46947', '3641:0 3644:0 '),\n+('3644', 'shmv1342', '530', '3520', '3939', '67', '70', '0', '-4299.45', '334.074', '109.437', '3.99453', '3643:0 3645:0 '),\n+('3645', 'shmv1344', '530', '3520', '3939', '67', '70', '0', '-4202.19', '250.869', '124.805', '2.69862', '3644:0 3646:0 '),\n+('3646', 'shmv1345', '530', '3520', '3939', '67', '70', '0', '-4203.68', '345.854', '115.285', '1.493', '3645:0 '),\n+('3647', 'shmv1346', '530', '3520', '3520', '67', '70', '0', '-3501.72', '557.894', '16.7235', '0.323666', '3579:0 3648:0 '),\n+('3648', 'shmv1347', '530', '3520', '3757', '67', '70', '0', '-3426.99', '580.376', '42.2179', '5.95105', '3647:0 3649:0 '),\n+('3649', 'shmv1348', '530', '3520', '3757', '67', '70', '0', '-3327.45', '544.282', '74.5225', '4.63944', '3648:0 3650:0 '),\n+('3650', 'shmv1349', '530', '3520', '3757', '67', '70', '0', '-3333.62', '454.382', '99.8124', '6.05315', '3649:0 3651:0 3658:0 '),\n+('3651', 'shmv1350', '530', '3520', '3757', '67', '70', '0', '-3228.24', '439.514', '104.731', '3.31604', '3650:0 3652:0 '),\n+('3652', 'shmv1351', '530', '3520', '3757', '67', '70', '0', '-3392.06', '415.921', '103.96', '4.61195', '3651:0 3653:0 3658:0 '),\n+('3653', 'shmv1352', '530', '3520', '3757', '67', '70', '0', '-3390.43', '293.527', '103.961', '4.72583', '3652:0 3654:0 '),\n+('3654', 'shmv1353', '530', '3520', '3757', '67', '70', '0', '-3337.54', '294.86', '116.382', '1.36824', '3653:0 3655:0 '),\n+('3655', 'shmv1354', '530', '3520', '3757', '67', '70', '0', '-3324.03', '371.217', '120.458', '5.9746', '3654:0 3656:0 '),\n+('3656', 'shmv1355', '530', '3520', '3757', '67', '70', '0', '-3231.77', '337.352', '127.504', '4.49021', '3655:0 3657:0 '),\n+('3657', 'shmv1356', '530', '3520', '3757', '67', '70', '0', '-3239.92', '279.443', '137.131', '4.57267', '3656:0 '),\n+('3658', 'shmv1357', '530', '3520', '3757', '67', '70', '0', '-3416.2', '459.709', '103.935', '5.91964', '3650:0 3652:0 '),\n+('3659', 'shmv1358', '530', '3520', '3756', '67', '70', '0', '-3685.39', '550.038', '35.0742', '2.93905', '3579:0 3660:0 '),\n+('3660', 'shmv1359', '530', '3520', '3756', '67', '70', '0', '-3813.8', '565.02', '71.7251', '4.91432', '3659:0 3661:0 '),\n+('3661', 'shmv1360', '530', '3520', '3756', '67', '70', '0', '-3802.41', '461.803', '99.9172', '4.68655', '3660:0 3662:0 3670:0 '),\n+('3662', 'shmv1361', '530', '3520', '3756', '67', '70', '0', '-3896.83', '442.087', '104.97', '6.26668', '3661:0 3663:0 '),\n+('3663', 'shmv1362', '530', '3520', '3756', '67', '70', '0', '-3719.39', '417.216', '104.061', '2.6833', '3662:0 3664:0 3670:0 '),\n+('3664', 'shmv1363', '530', '3520', '3756', '67', '70', '0', '-3732.23', '295.716', '104.066', '3.10939', '3663:0 3665:0 '),\n+('3665', 'shmv1364', '530', '3520', '3756', '67', '70', '0', '-3786.92', '297.908', '116.455', '3.10153', '3664:0 3666:0 '),\n+('3666', 'shmv1365', '530', '3520', '3756', '67', '70', '0', '-3812.37', '248.065', '120.604', '1.80405', '3665:0 3667:0 '),\n+('3667', 'shmv1366', '530', '3520', '3756', '67', '70', '0', '-3838.38', '357.549', '120.582', '1.80405', '3666:0 3668:0 '),\n+('3668', 'shmv1367', '530', '3520', '3756', '67', '70', '0', '-3904.87', '343.016', '127.62', '4.76657', '3667:0 3669:0 '),\n+('3669', 'shmv1368', '530', '3520', '3756', '67', '70', '0', '-3890.45', '282.542', '137.239', '3.8665', '3668:0 '),\n+('3670', 'shmv1369', '530', '3520', '3756', '67', '70', '0', '-3719.66', '475.869', '104.038', '4.2914', '3663:0 3661:0 '),\n+('3671', 'shmv1370', '530', '3520', '3754', '67', '70', '0', '-3124.49', '886.832', '-14.3889', '1.56135', '3583:0 3584:0 3672:0 '),\n+('3672', 'shmv1371', '530', '3520', '3754', '67', '70', '1', '-3061.33', '830.398', '-10.215', '4.92836', '3671:0 3673:0 '),\n+('3673', 'shmv1372', '530', '3520', '3520', '67', '70', '0', '-3030.95', '544.921', '-1.12904', '0.00390148', '3672:0 3674:0 '),\n+('3674', 'shmv1373', '530', '3520', '3520', '67', '70', '0', '-2881.37', '547.854', '-13.197', '0.0196085', '3673:0 3675:0 '),\n+('3675', 'shmv1374', '530', '3520', '3520', '67', '70', '0', '-2744.62', '677.917', '-16.4588', '1.42468', '3674:0 3676:0 '),\n+('3676', 'shmv1375', '530', '3520', '3520', '67', '70', '0', '-2720.25', '857.215', '-3.3875', '4.54664', '3675:0 3677:0 '),\n+('3677', 'shmv1376', '530', '3520', '3520', '67', '70', '0', '-2768.24', '985.559', '-2.57223', '2.06085', '3676:0 3678:0 '),\n+('3678', 'shmv1377', '530', '3520', '3520', '67', '70', '0', '-2871.08', '1130.08', '8.92665', '3.16433', '3677:0 3679:0 '),\n+('3679', 'shmv1378', '530', '3520', '3520', '67', '70', '0', '-2984.92', '1134.44', '-3.92959', '2.62712', '3678:0 3585:0 '),\n+('3680', 'shmv1379', '530', '3520', '3753', '67', '70', '0', '-3245.6', '1189.8', '59.4774', '4.33927', '3585:0 3681:0 3685:0 '),\n+('3681', 'shmv1380', '530', '3520', '3753', '67', '70', '0', '-3222.89', '1092.48', '64.7857', '6.14175', '3680:0 3682:0 3685:0 3686:0 '),\n+('3682', 'shmv1381', '530', '3520', '3753', '67', '70', '0', '-3292.57', '985.163', '40.7467', '5.15608', '3681:0 3684:0 '),\n+('3683', 'shmv1382', '530', '3520', '3753', '67', '70', '0', '-3344.18', '870.1', '-14.6762', '4.80342', '3581:0 3684:0 '),\n+('3684', 'shmv1383', '530', '3520', '3753', '67', '70', '0', '-3205.87', '897.037', '49.1172', '0.192352', '3683:0 3682:0 '),\n+('3685', 'shmv1384', '530', '3520', '3753', '67', '70', '0', '-3399.1', '1175.31', '50.0129', '3.15252', '3680:0 3681:0 3686:0 '),\n+('3686', 'shmv1385', '530', '3520', '3753', '67', '70', '0', '-3335.34', '1043.32', '47.1116', '0.383668', '3681:0 3685:0 3726:0 '),\n+('3687', 'shmv1386', '530', '3520', '3749', '67', '70', '0', '-2929.04', '1324.33', '7.92349', '5.43769', '3586:0 3688:0 '),\n+('3688', 'shmv1387', '530', '3520', '3749', '67', '70', '0', '-2845.89', '1301.54', '6.02801', '3.20519', '3687:0 3689:0 '),\n+('3689', 'shmv1388', '530', '3520', '3749', '67', '70', '0', '-2847.46', '1231.33', '6.78906', '1.62065', '3688:0 3690:0 '),\n+('3690', 'shmv1390', '530', '3520', '3749', '67', '70', '0', '-2732.51', '1138.3', '2.89233', '2.40802', '3689:0 3691:0 '),\n+('3691', 'shmv1391', '530', '3520', '3749', '67', '70', '0', '-2634.08', '1230.04', '11.146', '1.86804', '3692:0 3690:0 '),\n+('3692', 'shmv1392', '530', '3520', '3749', '67', '70', '0', '-2651.9', '1282.45', '26.4813', '3.01869', '3691:0 3693:0 '),\n+('3693', 'shmv1393', '530', '3520', '3749', '67', '70', '0', '-2710.39', '1300.75', '33.7332', '1.28218', '3692:0 3694:0 '),\n+('3694', 'shmv1394', '530', '3520', '3749', '67', '70', '0', '-2690.89', '1361.98', '35.0836', '6.28124', '3693:0 3695:0 '),\n+('3695', 'shmv1395', '530', '3520', '3749', '67', '70', '0', '-2617.04', '1355.97', '37.2382', '0.18183', '3694:0 3696:0 '),\n+('3696', 'shmv1396', '530', '3520', '3749', '67', '70', '0', '-2769.22', '1301.12', '33.2111', '3.48993', '3695:0 3697:0 3699:0 '),\n+('3697', 'shmv1397', '530', '3520', '3749', '67', '70', '0', '-2721.9', '1224.71', '33.0771', '5.26886', '3696:0 3698:0 '),\n+('3698', 'shmv1398', '530', '3520', '3749', '67', '70', '0', '-2817.63', '1365.79', '38.5145', '5.53669', '3697:0 3699:0 '),\n+('3699', 'shmv1399', '530', '3520', '3749', '67', '70', '0', '-2766.14', '1383.17', '37.6732', '0.325571', '3698:0 3696:0 '),\n+('3700', 'shmv1400', '530', '3520', '3743', '67', '70', '0', '-3280.76', '3002.45', '141.658', '1.22092', '3540:0 3701:0 '),\n+('3701', 'shmv1401', '530', '3520', '3743', '67', '70', '0', '-3273.62', '3077.71', '139.787', '0.31771', '3700:0 3702:0 '),\n+('3702', 'shmv1402', '530', '3520', '3743', '67', '70', '0', '-3211.67', '3079.46', '126.239', '5.52566', '3701:0 3703:0 '),\n+('3703', 'shmv1403', '530', '3520', '3743', '67', '70', '0', '-3143.09', '3024.9', '104.296', '5.41086', '3538:0 3702:0 '),\n+('3704', 'shmv1405', '530', '3520', '3752', '67', '70', '0', '-3656.3', '2553.97', '77.5087', '0.0120506', '3555:0 3559:0 '),\n+('3705', 'shmv1406', '530', '3520', '3750', '67', '70', '0', '-2941.74', '1589.4', '40.8211', '2.08903', '3588:0 3706:0 '),\n+('3706', 'shmv1407', '530', '3520', '3750', '67', '70', '0', '-2978.15', '1677.35', '67.3118', '2.1715', '3705:0 3707:0 '),\n+('3707', 'shmv1408', '530', '3520', '3750', '67', '70', '0', '-3032.93', '1672.83', '67.4735', '3.60878', '3706:0 3708:0 3711:0 '),\n+('3708', 'shmv1409', '530', '3520', '3750', '67', '70', '0', '-3131.22', '1754.16', '79.6664', '2.79589', '3707:0 3709:0 '),\n+('3709', 'shmv1410', '530', '3520', '3750', '67', '70', '0', '-3191.61', '1765.69', '88.3304', '2.95297', '3708:0 3710:0 '),\n+('3710', 'shmv1411', '530', '3520', '3520', '67', '70', '0', '-3345.81', '1700.42', '95.7466', '5.65474', '3709:0 3711:0 '),\n+('3711', 'shmv1412', '530', '3520', '3520', '67', '70', '0', '-3188.39', '1586.02', '63.3792', '0.565352', '3710:0 3707:0 3712:0 3714:0 '),\n+('3712', 'shmv1413', '530', '3520', '3520', '67', '70', '0', '-3052.53', '1476.53', '17.9049', '2.50057', '3711:0 3713:0 '),\n+('3713', 'shmv1414', '530', '3520', '3520', '67', '70', '0', '-3107.69', '1379.15', '12.0022', '4.19702', '3712:0 '),\n+('3714', 'shmv1415', '530', '3520', '3750', '67', '70', '0', '-3103.19', '1550.28', '39.5694', '2.77978', '3711:0 3715:0 '),\n+('3715', 'shmv1416', '530', '3520', '3520', '67', '70', '0', '-3196.31', '1501.96', '57.1479', '2.95256', '3714:0 3716:0 '),\n+('3716', 'shmv1417', '530', '3520', '3747', '67', '70', '0', '-3282.99', '1527.47', '52.2295', '5.92921', '3715:0 3717:0 '),\n+('3717', 'shmv1418', '530', '3520', '3747', '67', '70', '0', '-3394.49', '1550.46', '48.1579', '2.93214', '3716:0 3718:0 '),\n+('3718', 'shmv1419', '530', '3520', '3747', '67', '70', '0', '-3500.47', '1622.81', '43.8418', '3.38295', '3717:0 3719:0 '),\n+('3719', 'shmv1420', '530', '3520', '3747', '67', '70', '0', '-3693.06', '1558.48', '46.9758', '1.02649', '3718:0 3720:0 '),\n+('3720', 'shmv1421', '530', '3520', '3747', '67', '70', '0', '-3828.74', '1475.85', '43.1674', '4.10996', '3719:0 3721:0 '),\n+('3721', 'shmv1422', '530', '3520', '3747', '67', '70', '0', '-3888.12', '1398.74', '43.6642', '4.04478', '3720:0 3722:0 '),\n+('3722', 'shmv1423', '530', '3520', '3747', '67', '70', '0', '-3858.68', '1336.7', '42.2274', '4.47911', '3721:0 3723:0 '),\n+('3723', 'shmv1424', '530', '3520', '3747', '67', '70', '0', '-3883.95', '1244.97', '42.1164', '4.44376', '3722:0 3724:0 3725:0 '),\n+('3724', 'shmv1425', '530', '3520', '3520', '67', '70', '0', '-3774.38', '1225.16', '84.9138', '6.04598', '3723:0 '),\n+('3725', 'shmv1426', '530', '3520', '3520', '67', '70', '0', '-3969.44', '1164.97', '46.6673', '5.0878', '3723:0 3575:0 '),\n+('3726', 'shmv1427', '530', '3520', '3753', '67', '70', '0', '-3423.61', '1074.97', '42.8376', '3.2539', '3686:0 3727:0 '),\n+('3727', 'shmv1428', '530', '3520', '3520', '67', '70', '0', '-3574.75', '1067.86', '40.499', '3.19107', '3726:0 3728:0 '),\n+('3728', 'shmv1429', '530', '3520', '3821', '67', '70', '0', '-3680.33', '1058.59', '68.153', '2.90833', '3727:0 3729:0 3730:0 '),\n+('3729', 'shmv1430', '530', '3520', '3821', '67', '70', '0', '-3760.76', '1068.11', '70.1361', '6.14809', '3728:0 '),\n+('3730', 'shmv1431', '530', '3520', '3520', '67', '70', '0', '-3642.27', '894.441', '45.4124', '5.92247', '3728:0 3731:0 '),\n+('3731', 'shmv1432', '530', '3520', '3520', '67', '70', '0', '-3522.57', '841.492', '-2.90146', '4.68834', '3730:0 3732:0 '),\n+('3732', 'shmv1433', '530', '3520', '3520', '67', '70', '0', '-3522.09', '776.814', '-14.2281', '4.71976', '3731:0 3578:0 '),\n+('3733', 'bt001', '571', '3537', '4129', '68', '73', '5', '2817.61', '6168.46', '85.5727', '3.94245', '3734:0 '),\n+('3734', 'bt002', '571', '3537', '4020', '68', '73', '5', '2726.11', '6082.88', '72.3512', '3.45943', '3733:0 3735:0 '),\n+('3735', 'bt003', '571', '3537', '4020', '68', '73', '0', '2604.99', '6083.81', '53.2961', '2.26563', '3734:0 3736:0 3786:0 '),\n+('3736', 'bt004', '571', '3537', '4020', '68', '73', '0', '2505.63', '6178.07', '53.1691', '5.59574', '3735:0 3737:0 3793:0 '),\n+('3737', 'bt005', '571', '3537', '4130', '68', '73', '0', '2589.16', '6313.74', '86.8706', '0.137219', '3736:0 3738:0 3786:0 '),\n+('3738', 'bt006', '571', '3537', '3537', '68', '73', '0', '2818.32', '6342.97', '101.266', '3.15078', '3737:0 3739:0 3745:0 '),\n+('3739', 'bt007', '571', '3537', '3537', '68', '73', '0', '2823.08', '6550.12', '55.029', '4.6077', '3738:0 3740:0 3744:0 '),\n+('3740', 'bt008', '571', '3537', '4106', '68', '73', '0', '2946.88', '6730.38', '13.9226', '0.998791', '3739:0 3741:0 3742:0 '),\n+('3741', 'bt009', '571', '3537', '4106', '68', '73', '0', '3100', '6716.93', '0.818624', '2.88374', '3740:0 '),\n+('3742', 'bt010', '571', '3537', '4106', '68', '73', '0', '2769.6', '6817.13', '0.382068', '5.63656', '3740:0 3743:0 '),\n+('3743', 'bt011', '571', '3537', '4031', '68', '73', '0', '2511.71', '6709.76', '8.65944', '0.559735', '3742:0 3744:0 '),\n+('3744', 'bt012', '571', '3537', '4130', '68', '73', '0', '2598.94', '6513.07', '41.9513', '4.98704', '3743:0 3739:0 '),\n+('3745', 'bt013', '571', '3537', '3537', '68', '73', '0', '2977.63', '6387.87', '96.0276', '3.55919', '3738:0 3746:0 '),\n+('3746', 'bt014', '571', '3537', '3537', '68', '73', '0', '3117.74', '6401.57', '85.8869', '4.84331', '3745:0 3747:0 '),\n+('3747', 'bt015', '571', '3537', '3537', '68', '73', '0', '3146.95', '6242.85', '96.6515', '5.78972', '3746:0 3748:0 '),\n+('3748', 'bt016', '571', '3537', '4105', '68', '73', '0', '3332.48', '6165.54', '75.7667', '2.87983', '3747:0 '),\n+('3749', 'bt017', '571', '3537', '3537', '68', '73', '0', '3270.88', '5961.4', '84.9677', '4.81845', '3750:0 3751:0 3780:0 '),\n+('3750', 'bt018', '571', '3537', '3537', '68', '73', '1', '3624.25', '5933.39', '136.215', '3.44596', '3751:0 3749:0 '),\n+('3751', 'bt019', '571', '3537', '4109', '68', '73', '0', '3297.83', '5691.4', '59.3737', '4.58728', '3750:0 3752:0 3749:0 '),\n+('3752', 'bt020', '571', '3537', '3537', '68', '73', '0', '3304.79', '5470.21', '55.3479', '4.73257', '3751:0 3753:0 3806:0 '),\n+('3753', 'bt021', '571', '3537', '3537', '68', '73', '0', '3482.47', '5425.21', '50.7507', '1.49045', '3752:0 3754:0 '),\n+('3754', 'bt022', '571', '3537', '3537', '68', '73', '0', '3532.8', '5540.21', '65.5113', '4.20635', '3753:0 3755:0 3891:0 '),\n+('3755', 'bt023', '571', '3537', '3537', '68', '73', '0', '3504.09', '5638.44', '63.5206', '1.09146', '3754:0 3756:0 3891:0 '),\n+('3756', 'bt024', '571', '3537', '3537', '68', '73', '0', '3651.69', '5686.01', '66.2432', '0.569961', '3755:0 3757:0 3891:0 '),\n+('3757', 'bt025', '571', '3537', '3537', '68', '73', '0', '3809.81', '5773.85', '68.3307', '0.134065', '3756:0 3758:0 3891:0 '),\n+('3758', 'bt026', '571', '3537', '4127', '68', '73', '0', '3969.32', '5781.55', '74.0472', '0.432523', '3757:0 3759:0 3850:0 '),\n+('3759', 'bt027', '571', '3537', '3537', '68', '73', '0', '4170.05', '5855.36', '62.8346', '0.137999', '3758:0 3760:0 3770:0 3773:0 '),\n+('3760', 'bt028', '571', '3537', '3537', '68', '73', '0', '4324.68', '6015.4', '25.5474', '1.07655', '3759:0 3761:0 '),\n+('3761', 'bt029', '571', '3537', '4099', '68', '73', '0', '4401.85', '6148.33', '0.553693', '4.54723', '3760:0 3762:0 '),\n+('3762', 'bt030', '571', '3537', '4033', '68', '73', '0', '4287.27', '6236.78', '0.383892', '3.29845', '3761:0 3763:0 '),\n+('3763', 'bt031', '571', '3537', '4033', '68', '73', '0', '4184.73', '6193.42', '9.12228', '1.7952', '3762:0 3764:0 '),\n+('3764', 'bt032', '571', '3537', '4033', '68', '73', '0', '4149.36', '6252.75', '30.8789', '2.52797', '3763:0 3765:0 3766:0 '),\n+('3765', 'bt033', '571', '3537', '4097', '68', '73', '0', '4056.14', '6303.43', '25.1363', '1.18887', '3764:0 '),\n+('3766', 'bt034', '571', '3537', '4097', '68', '73', '0', '4052.65', '6367.67', '27.4251', '1.08833', '3764:0 3767:0 3769:0 '),\n+('3767', 'bt035', '571', '3537', '4097', '68', '73', '0', '3991.71', '6304.02', '8.08314', '0.901407', '3766:0 '),\n+('3768', 'bt036', '571', '3537', '4097', '68', '73', '0', '3854.4', '6397.67', '24.5748', '5.34115', '3769:0 '),\n+('3769', 'bt037', '571', '3537', '4097', '68', '73', '0', '3960.88', '6426.15', '11.3447', '0.519589', '3766:0 3768:0 '),\n+('3770', 'bt038', '571', '3537', '4134', '68', '73', '0', '4404.37', '5906.55', '55.8142', '0.126085', '3759:0 3771:0 3772:0 '),\n+('3771', 'bt039', '571', '3537', '4132', '68', '73', '0', '4547.19', '6017.64', '76.7052', '4.37901', '3770:0 '),\n+('3772', 'bt040', '571', '3537', '4122', '68', '73', '5', '4484.77', '5763.64', '79.4306', '1.41963', '3770:0 3773:0 '),\n+('3773', 'bt041', '571', '3537', '4133', '68', '73', '0', '4321.96', '5776.59', '72.5697', '2.66048', '3772:0 3759:0 '),\n+('3774', 'bt042', '571', '3537', '4032', '68', '73', '3', '2227.28', '5312.07', '10.5729', '1.23497', '3775:0 3805:0 '),\n+('3775', 'bt043', '571', '3537', '4101', '68', '73', '0', '2273.96', '5439.49', '1.81269', '1.1525', '3774:0 3776:0 3787:0 3870:0 '),\n+('3776', 'bt044', '571', '3537', '4101', '68', '73', '0', '2418.25', '5390.85', '3.76168', '0.12363', '3775:0 3777:0 '),\n+('3777', 'bt045', '571', '3537', '3537', '68', '73', '0', '2601.94', '5522.47', '38.0963', '6.28036', '3776:0 3778:0 3787:0 3794:0 3802:0 '),\n+('3778', 'bt046', '571', '3537', '3537', '68', '73', '0', '2887.65', '5415.26', '58.4905', '5.60492', '3777:0 3806:0 3813:0 '),\n+('3779', 'bt047', '571', '3537', '4021', '68', '73', '0', '2976.39', '5660.32', '52.2738', '1.38733', '3780:0 '),\n+('3780', 'bt048', '571', '3537', '4021', '68', '73', '0', '3019.96', '5816.72', '88.3166', '0.8297', '3779:0 3781:0 3749:0 '),\n+('3781', 'bt049', '571', '3537', '4020', '68', '73', '0', '2993.07', '5973.66', '112.995', '5.04023', '3780:0 3782:0 '),\n+('3782', 'bt050', '571', '3537', '4129', '68', '73', '0', '2915.6', '6074.59', '78.0969', '1.4863', '3781:0 3783:0 3798:0 '),\n+('3783', 'bt051', '571', '3537', '4020', '68', '73', '0', '2970.01', '6149.83', '61.7495', '2.0298', '3782:0 3784:0 '),\n+('3784', 'bt052', '571', '3537', '4020', '68', '73', '0', '2899.1', '6282.26', '61.4057', '2.97228', '3783:0 3785:0 '),\n+('3785', 'bt053', '571', '3537', '4020', '68', '73', '0', '2773.74', '6303.56', '77.083', '3.07674', '3784:0 3786:0 '),\n+('3786', 'bt054', '571', '3537', '4020', '68', '73', '0', '2654.28', '6218.95', '38.8344', '4.55721', '3785:0 3735:0 3737:0 '),\n+('3787', 'bt055', '571', '3537', '3537', '68', '73', '0', '2316.99', '5624.68', '36.408', '5.33239', '3777:0 3775:0 3788:0 '),\n+('3788', 'bt056', '571', '3537', '3537', '68', '73', '0', '2143.16', '5781.38', '58.7998', '1.77058', '3787:0 3791:0 '),\n+('3789', 'bt057', '571', '3537', '4028', '68', '73', '0', '1868.5', '5774.99', '0.860459', '1.34802', '3871:0 '),\n+('3790', 'bt058', '571', '3537', '4028', '68', '73', '0', '1923.91', '6030.9', '10.7946', '1.48154', '3791:0 3872:0 '),\n+('3791', 'bt059', '571', '3537', '3537', '68', '73', '0', '2116.07', '6079.06', '52.9292', '3.89037', '3790:0 3788:0 3792:0 3800:0 '),\n+('3792', 'bt060', '571', '3537', '4021', '68', '73', '0', '2104.14', '6314.43', '60.0072', '0.106311', '3791:0 3793:0 '),\n+('3793', 'bt061', '571', '3537', '4021', '68', '73', '0', '2357.04', '6208.05', '40.7146', '2.64945', '3792:0 3736:0 '),\n+('3794', 'bt062', '571', '3537', '4022', '68', '73', '0', '2647.51', '5693.12', '46.7099', '1.50275', '3777:0 3795:0 '),\n+('3795', 'bt063', '571', '3537', '4022', '68', '73', '0', '2631.68', '5852.04', '45.3245', '5.86957', '3794:0 3796:0 '),\n+('3796', 'bt064', '571', '3537', '4022', '68', '73', '0', '2763.87', '5811.38', '59.8902', '6.23478', '3795:0 3797:0 '),\n+('3797', 'bt065', '571', '3537', '4021', '68', '73', '0', '2848.66', '5818.04', '101.625', '5.91276', '3796:0 3798:0 3799:0 '),\n+('3798', 'bt066', '571', '3537', '4020', '68', '73', '0', '2837.49', '5974.58', '114.197', '5.01191', '3797:0 3782:0 '),\n+('3799', 'bt067', '571', '3537', '4021', '68', '73', '0', '2607.08', '5956.42', '94.4153', '5.56483', '3797:0 3800:0 3801:0 '),\n+('3800', 'bt068', '571', '3537', '4022', '68', '73', '0', '2327.62', '5973.77', '98.5945', '4.36317', '3791:0 3799:0 '),\n+('3801', 'bt069', '571', '3537', '4022', '68', '73', '0', '2489.14', '5813.21', '139.945', '0.867364', '3799:0 '),\n+('3802', 'bt070', '571', '3537', '4111', '68', '73', '0', '2684.66', '5308.92', '31.1745', '1.9606', '3777:0 3803:0 '),\n+('3803', 'bt071', '571', '3537', '4111', '68', '73', '0', '2495.15', '5199.97', '32.4263', '0.802134', '3802:0 3804:0 '),\n+('3804', 'bt072', '571', '3537', '4032', '68', '73', '0', '2416.87', '5247.86', '1.88448', '3.32877', '3803:0 3805:0 '),\n+('3805', 'bt073', '571', '3537', '4032', '68', '73', '3', '2334.99', '5249.7', '9.01216', '2.3698', '3774:0 3804:0 '),\n+('3806', 'bt074', '571', '3537', '3537', '68', '73', '0', '3128.49', '5378.84', '58.5466', '0.00337601', '3778:0 3752:0 3807:0 3813:0 '),\n+('3807', 'bt075', '571', '3537', '3537', '68', '73', '0', '3264.11', '5285.37', '39.4799', '3.97355', '3806:0 3808:0 3845:0 '),\n+('3808', 'bt076', '571', '3537', '4043', '68', '73', '0', '3152.24', '5121.1', '38.3072', '4.18325', '3807:0 3809:0 3814:0 3845:0 '),\n+('3809', 'bt077', '571', '3537', '4043', '68', '73', '0', '2949.22', '5102.38', '35.483', '3.44497', '3810:0 3813:0 3808:0 '),\n+('3810', 'bt078', '571', '3537', '4043', '68', '73', '0', '2736.6', '5010.38', '28.1472', '3.12924', '3809:0 3811:0 '),\n+('3811', 'bt079', '571', '3537', '4115', '68', '73', '0', '2737.31', '5202.71', '29.0469', '0.938766', '3810:0 3812:0 3813:0 '),\n+('3812', 'bt080', '571', '3537', '4115', '68', '73', '0', '2535.47', '5082.9', '7.68824', '3.5887', '3811:0 '),\n+('3813', 'bt081', '571', '3537', '3537', '68', '73', '0', '2918.19', '5295.64', '60.2339', '1.05579', '3778:0 3809:0 3811:0 3806:0 '),\n+('3814', 'bt082', '571', '3537', '4041', '68', '73', '0', '3128.73', '4853.66', '2.08073', '1.16652', '3808:0 3815:0 '),\n+('3815', 'bt083', '571', '3537', '4041', '68', '73', '0', '3050.52', '4655.31', '2.27362', '4.47304', '3814:0 3816:0 '),\n+('3816', 'bt084', '571', '3537', '4043', '68', '73', '0', '3249.06', '4558.38', '29.5811', '5.62916', '3815:0 3817:0 '),\n+('3817', 'bt085', '571', '3537', '4043', '68', '73', '0', '3284.24', '4264.38', '24.2109', '5.22075', '3816:0 3818:0 3892:0 '),\n+('3818', 'bt086', '571', '3537', '4037', '68', '73', '4', '3412.42', '4072.4', '16.8945', '0.69685', '3817:0 3819:0 3820:0 3827:0 3893:0 '),\n+('3819', 'bt087', '571', '3537', '4037', '68', '73', '5', '3463.15', '4158.38', '17.1932', '1.45869', '3818:0 '),\n+('3820', 'bt088', '571', '3537', '4043', '68', '73', '0', '3662.21', '3965.65', '26.4976', '5.18541', '3818:0 3821:0 3832:0 '),\n+('3821', 'bt089', '571', '3537', '4125', '68', '73', '0', '3676.8', '3741.97', '49.5236', '5.32678', '3820:0 3822:0 3832:0 '),\n+('3822', 'bt090', '571', '3537', '4125', '68', '73', '0', '3823.07', '3647', '46.2292', '5.63701', '3821:0 3823:0 3825:0 3826:0 '),\n+('3823', 'bt091', '571', '3537', '4135', '68', '73', '0', '4026.86', '3532.95', '104.358', '5.75874', '3822:0 3824:0 3826:0 '),\n+('3824', 'bt092', '571', '3537', '4125', '68', '73', '0', '3935.56', '3404.04', '80.8418', '5.58987', '3823:0 3825:0 '),\n+('3825', 'bt093', '571', '3537', '4125', '68', '73', '0', '3825.9', '3505.46', '64.8278', '1.04239', '3822:0 3824:0 '),\n+('3826', 'bt094', '571', '3537', '4125', '68', '73', '0', '3966.88', '3721.48', '61.9247', '4.14707', '3822:0 3823:0 '),\n+('3827', 'bt095', '571', '3537', '4042', '68', '73', '0', '3416.97', '3883.04', '26.1293', '5.22225', '3818:0 3828:0 3893:0 '),\n+('3828', 'bt096', '571', '3537', '4042', '68', '73', '0', '3450.42', '3652.26', '27.974', '2.1592', '3827:0 3829:0 3894:0 '),\n+('3829', 'bt097', '571', '3537', '4042', '68', '73', '0', '3456.33', '3430.49', '17.996', '4.9827', '3828:0 3830:0 '),\n+('3830', 'bt098', '571', '3537', '4042', '68', '73', '0', '3518.4', '3187.54', '25.0806', '4.80206', '3829:0 3831:0 '),\n+('3831', 'bt099', '571', '65', '4478', '68', '73', '0', '3572.51', '3037.08', '26.2165', '3.86352', '3830:0 4063:0 '),\n+('3832', 'bt100', '571', '3537', '3537', '68', '73', '0', '3907.42', '4000.44', '45.1941', '4.47613', '3820:0 3821:0 3833:0 '),\n+('3833', 'bt101', '571', '3537', '3537', '68', '73', '0', '4042.02', '4199.98', '49.6907', '0.696007', '3832:0 3834:0 '),\n+('3834', 'bt102', '571', '3537', '3537', '68', '73', '0', '4186.94', '4464.21', '27.3466', '1.05336', '3833:0 3835:0 '),\n+('3835', 'bt103', '571', '3537', '4119', '68', '73', '0', '4191.29', '4697.78', '12.0312', '2.68463', '3834:0 3836:0 3837:0 3838:0 3862:0 '),\n+('3836', 'bt104', '571', '3537', '4118', '68', '73', '0', '4358.92', '4576.58', '16.3385', '5.84976', '3835:0 '),\n+('3837', 'bt105', '571', '3537', '4036', '68', '73', '0', '3992.84', '4812.66', '11.7213', '5.55524', '3835:0 '),\n+('3838', 'bt106', '571', '3537', '4119', '68', '73', '0', '3978.85', '4564.24', '-2.51875', '3.44252', '3835:0 3839:0 3868:0 '),\n+('3839', 'bt107', '571', '3537', '4117', '68', '73', '0', '3699.55', '4487.54', '-0.818554', '2.97836', '3838:0 3840:0 '),\n+('3840', 'bt108', '571', '3537', '4117', '68', '73', '0', '3443.04', '4422.46', '-0.530089', '0.645731', '3839:0 3841:0 '),\n+('3841', 'bt109', '571', '3537', '4035', '68', '73', '0', '3568.75', '4584.96', '-13.5973', '0.527922', '3840:0 3842:0 '),\n+('3842', 'bt110', '571', '3537', '4035', '68', '73', '0', '3686.72', '4734.84', '-12.073', '1.14839', '3841:0 3843:0 3869:0 '),\n+('3843', 'bt111', '571', '3537', '4035', '68', '73', '0', '3703.7', '4927.72', '-12.9951', '2.73489', '3842:0 3844:0 3866:0 '),\n+('3844', 'bt112', '571', '3537', '4116', '68', '73', '0', '3479.66', '5024.98', '-1.50934', '2.71133', '3843:0 3845:0 '),\n+('3845', 'bt113', '571', '3537', '4116', '68', '73', '0', '3344.22', '5119.48', '13.0385', '2.55424', '3844:0 3807:0 3808:0 3846:0 '),\n+('3846', 'bt114', '571', '3537', '4116', '68', '73', '0', '3589.81', '5076.79', '13.0073', '6.10424', '3845:0 3847:0 '),\n+('3847', 'bt115', '571', '3537', '3537', '68', '73', '0', '3668.09', '5254.47', '34.8015', '1.05413', '3846:0 3848:0 3865:0 '),\n+('3848', 'bt116', '571', '3537', '3537', '68', '73', '0', '3717.74', '5416.1', '41.956', '1.99268', '3847:0 3849:0 3891:0 '),\n+('3849', 'bt117', '571', '3537', '3537', '68', '73', '0', '3919.2', '5534.82', '36.9202', '0.89312', '3848:0 3850:0 '),\n+('3850', 'bt118', '571', '3537', '3537', '68', '73', '0', '4101.61', '5617.94', '41.1963', '5.88275', '3849:0 3758:0 3851:0 '),\n+('3851', 'bt119', '571', '3537', '3537', '68', '73', '0', '4252.89', '5577.24', '46.4033', '5.33689', '3850:0 3852:0 3857:0 '),\n+('3852', 'bt120', '571', '3537', '4123', '68', '73', '0', '4429.17', '5431.27', '38.6653', '5.43664', '3851:0 3853:0 '),\n+('3853', 'bt121', '571', '3537', '4123', '68', '73', '0', '4389.18', '5365.34', '1.39626', '5.27172', '3852:0 3854:0 '),\n+('3854', 'bt122', '571', '3537', '4123', '68', '73', '0', '4489.75', '5395.86', '-16.0358', '0.830292', '3853:0 3855:0 '),\n+('3855', 'bt123', '571', '3537', '4123', '68', '73', '0', '4444.7', '5327.16', '-22.3982', '5.89611', '3854:0 3856:0 '),\n+('3856', 'bt124', '571', '3537', '4123', '68', '73', '0', '4542.22', '5322.8', '-31.8246', '3.56034', '3855:0 '),\n+('3857', 'bt125', '571', '3537', '4123', '68', '73', '0', '4522.99', '5561.63', '52.4235', '6.06731', '3851:0 3858:0 4598:0 '),\n+('3858', 'bt126', '571', '3537', '4123', '68', '73', '0', '4530.95', '5430.29', '84.8166', '1.59052', '3857:0 3859:0 '),\n+('3859', 'bt127', '571', '3537', '4123', '68', '73', '0', '4525.48', '5247.8', '73.7381', '4.37083', '3858:0 3860:0 '),\n+('3860', 'bt128', '571', '3537', '4123', '68', '73', '0', '4475.24', '5066.41', '51.9566', '0.934718', '3859:0 3861:0 '),\n+('3861', 'bt129', '571', '3537', '4123', '68', '73', '0', '4378.74', '5017.74', '24.8345', '2.46704', '3860:0 3862:0 3863:0 '),\n+('3862', 'bt130', '571', '3537', '3537', '68', '73', '0', '4344.7', '4804.82', '24.8231', '4.24124', '3861:0 3835:0 '),\n+('3863', 'bt131', '571', '3537', '4116', '68', '73', '0', '4205.12', '5146.23', '13.0876', '5.95813', '3861:0 3864:0 '),\n+('3864', 'bt132', '571', '3537', '4108', '68', '73', '3', '4060.38', '5267.77', '24.7438', '5.56545', '3863:0 3865:0 '),\n+('3865', 'bt133', '571', '3537', '4116', '68', '73', '0', '3893.4', '5186.84', '13.0414', '3.37026', '3864:0 3847:0 3866:0 '),\n+('3866', 'bt134', '571', '3537', '4116', '68', '73', '0', '3840.13', '5037.99', '-1.50988', '0.413233', '3865:0 3843:0 3867:0 '),\n+('3867', 'bt135', '571', '3537', '4035', '68', '73', '0', '3925.28', '4915.39', '-12.887', '4.60333', '3866:0 3868:0 '),\n+('3868', 'bt136', '571', '3537', '4035', '68', '73', '0', '3887.73', '4693.73', '-12.995', '4.14386', '3867:0 3838:0 3869:0 '),\n+('3869', 'bt137', '571', '3537', '4035', '68', '73', '0', '3732.85', '4647.89', '-12.6525', '0.821628', '3868:0 3842:0 '),\n+('3870', 'bt138', '571', '3537', '4101', '68', '73', '0', '2084.44', '5480.67', '0.253263', '0.428928', '3775:0 3871:0 '),\n+('3871', 'bt139', '571', '3537', '3537', '68', '73', '0', '1935.03', '5589.92', '0.355845', '5.97934', '3870:0 3789:0 '),\n+('3872', 'bt140', '571', '3537', '4029', '68', '73', '0', '1494.92', '5829.11', '1.38787', '4.0072', '3790:0 3873:0 '),\n+('3873', 'bt141', '571', '3537', '4029', '68', '73', '0', '1384.5', '5858.44', '15.4001', '4.19177', '3872:0 3874:0 '),\n+('3874', 'bt142', '571', '3537', '4029', '68', '73', '0', '1449.43', '5734.18', '1.3254', '1.10514', '3873:0 3875:0 '),\n+('3875', 'bt143', '571', '3537', '4029', '68', '73', '0', '1402.52', '5714.94', '23.5628', '4.00326', '3874:0 3876:0 '),\n+('3876', 'bt144', '571', '3537', '4029', '68', '73', '0', '1316.7', '5605.69', '5.52566', '5.40127', '3875:0 '),\n+('3877', 'bt145', '571', '3537', '4024', '68', '73', '0', '4152.49', '7034.79', '165.636', '2.43875', '3878:0 3890:0 '),\n+('3878', 'bt146', '571', '3537', '4024', '68', '73', '0', '3999', '7159.1', '167.793', '0.0786215', '3877:0 3879:0 '),\n+('3879', 'bt147', '571', '3537', '4024', '68', '73', '0', '3840.49', '7254.47', '172.045', '3.52653', '3878:0 3880:0 3882:0 '),\n+('3880', 'bt148', '571', '3537', '4024', '68', '73', '0', '3676.61', '7110.41', '160.171', '4.50434', '3879:0 3881:0 3883:0 '),\n+('3881', 'bt149', '571', '3537', '4024', '68', '73', '0', '3597.15', '7199.39', '221.934', '1.51276', '3880:0 3882:0 3883:0 '),\n+('3882', 'bt150', '571', '3537', '4024', '68', '73', '0', '3751.72', '7333.67', '208.956', '0.378648', '3881:0 3879:0 '),\n+('3883', 'bt151', '571', '3537', '4024', '68', '73', '0', '3611.29', '6969.11', '170.734', '1.15225', '3880:0 3881:0 3884:0 '),\n+('3884', 'bt152', '571', '3537', '4024', '68', '73', '0', '3644.46', '6805.44', '166.924', '3.99932', '3883:0 3885:0 '),\n+('3885', 'bt153', '571', '3537', '4121', '68', '73', '1', '3587.41', '6661.1', '195.429', '4.60014', '3884:0 3886:0 '),\n+('3886', 'bt154', '571', '3537', '4024', '68', '73', '0', '3749.63', '6602.97', '169.446', '3.8658', '3885:0 3887:0 3889:0 '),\n+('3887', 'bt155', '571', '3537', '4024', '68', '73', '0', '3912.17', '6596.2', '168.227', '0.700643', '3886:0 3888:0 '),\n+('3888', 'bt156', '571', '3537', '4024', '68', '73', '0', '3971.08', '6785.73', '156.758', '4.88682', '3887:0 3889:0 3890:0 '),\n+('3889', 'bt157', '571', '3537', '4024', '68', '73', '0', '3826.86', '6694.29', '152.782', '4.14698', '3888:0 3886:0 '),\n+('3890', 'bt158', '571', '3537', '4024', '68', '73', '0', '4074.45', '6887.11', '166.976', '1.01716', '3877:0 3888:0 '),\n+('3891', 'bt159', '571', '3537', '4039', '68', '73', '0', '3663.21', '5603.77', '32.8151', '3.07099', '3754:0 3755:0 3756:0 3757:0 3848:0 '),\n+('3892', 'bt160', '571', '3537', '4113', '68', '73', '1', '2913.96', '4067.33', '1.63263', '0.498753', '3817:0 3893:0 '),\n+('3893', 'bt161', '571', '3537', '4138', '68', '73', '3', '3111.58', '3838.69', '22.5558', '0.795238', '3818:0 3827:0 3894:0 3892:0 '),\n+('3894', 'bt162', '571', '3537', '4138', '68', '73', '0', '3323.93', '3770.67', '24.5945', '5.57327', '3893:0 3828:0 '),\n+('3895', 'hf163', '571', '495', '3998', '68', '73', '3', '1418.1', '-3190.73', '162.344', '4.57189', '3896:0 '),\n+('3896', 'hf164', '571', '495', '3998', '68', '73', '2', '1365.12', '-3385.23', '185.736', '4.52084', '3895:0 3897:0 '),\n+('3897', 'hf165', '571', '495', '4048', '68', '73', '0', '1219.72', '-3550.97', '164.966', '4.23495', '3896:0 3898:0 '),\n+('3898', 'hf166', '571', '495', '4048', '68', '73', '0', '1121.91', '-3657.07', '156.248', '4.07787', '3897:0 3899:0 3939:0 '),\n+('3899', 'hf167', '571', '495', '4048', '68', '73', '0', '1046.11', '-3833.51', '162.833', '4.6512', '3898:0 3900:0 3912:0 3939:0 '),\n+('3900', 'hf168', '571', '495', '4048', '68', '73', '0', '920.447', '-4015.29', '170.279', '3.21786', '3899:0 3901:0 3912:0 '),\n+('3901', 'hf169', '571', '495', '3992', '68', '73', '0', '694.778', '-3872.94', '246.328', '2.73877', '3900:0 3902:0 '),\n+('3902', 'hf170', '571', '495', '495', '68', '73', '0', '507.763', '-4025.28', '259.283', '4.81221', '3901:0 3903:0 '),\n+('3903', 'hf171', '571', '495', '4260', '68', '73', '0', '397.137', '-4223.42', '249.354', '3.78334', '3902:0 3904:0 3933:0 '),\n+('3904', 'hf172', '571', '495', '495', '68', '73', '0', '222.582', '-4391.88', '248.592', '4.40773', '3903:0 3905:0 4040:0 '),\n+('3905', 'hf173', '571', '495', '3991', '68', '73', '0', '253.033', '-4572.61', '240.212', '5.55441', '3904:0 3906:0 4036:0 '),\n+('3906', 'hf174', '571', '495', '3991', '68', '73', '5', '371.97', '-4633.54', '245.156', '2.78588', '3905:0 3907:0 3911:0 4039:0 '),\n+('3907', 'hf175', '571', '495', '3991', '68', '73', '4', '407.209', '-4712.58', '228.909', '5.83714', '3906:0 3908:0 '),\n+('3908', 'hf176', '571', '495', '3991', '68', '73', '0', '510.661', '-4763.01', '208.318', '0.924468', '3907:0 3909:0 4036:0 '),\n+('3909', 'hf177', '571', '495', '495', '68', '73', '0', '628.585', '-4581.53', '203.482', '0.904833', '3908:0 3910:0 '),\n+('3910', 'hf178', '571', '495', '3991', '68', '73', '0', '460.455', '-4423.52', '211.022', '2.64078', '3909:0 3911:0 3933:0 '),\n+('3911', 'hf179', '571', '495', '3991', '68', '73', '4', '383.884', '-4495.8', '236.504', '4.36866', '3910:0 3906:0 '),\n+('3912', 'hf180', '571', '495', '495', '68', '73', '0', '1081.71', '-4036.81', '154.348', '4.76135', '3899:0 3900:0 3939:0 '),\n+('3913', 'hf181', '571', '495', '495', '68', '73', '0', '1215.66', '-4263.51', '149.864', '5.26401', '3914:0 '),\n+('3914', 'hf182', '571', '495', '495', '68', '73', '0', '1258.74', '-4522.15', '173.24', '3.83852', '3913:0 3915:0 '),\n+('3915', 'hf183', '571', '495', '495', '68', '73', '0', '1124.26', '-4644.36', '183.694', '3.62646', '3914:0 3916:0 '),\n+('3916', 'hf184', '571', '495', '495', '68', '73', '0', '857.223', '-4730.31', '113.82', '0.273598', '3915:0 3917:0 '),\n+('3917', 'hf185', '571', '495', '495', '68', '73', '0', '706.968', '-4825.12', '79.1984', '4.0553', '3916:0 3918:0 '),\n+('3918', 'hf186', '571', '495', '3981', '68', '73', '2', '634.301', '-4890.02', '28.6664', '4.92709', '3917:0 3919:0 3932:0 '),\n+('3919', 'hf187', '571', '495', '3981', '68', '73', '2', '682.36', '-4963', '6.24529', '0.414974', '3918:0 3920:0 3932:0 '),\n+('3920', 'hf188', '571', '495', '3982', '68', '73', '0', '854.979', '-4933.54', '4.27721', '0.230407', '3919:0 3921:0 '),\n+('3921', 'hf189', '571', '495', '3982', '68', '73', '0', '1039.98', '-4925.08', '9.42985', '0.387488', '3920:0 3922:0 '),\n+('3922', 'hf190', '571', '495', '3982', '68', '73', '0', '945.95', '-4873.37', '4.59329', '0.540618', '3921:0 3923:0 '),\n+('3923', 'hf191', '571', '495', '3982', '68', '73', '0', '1068.1', '-4819.17', '26.6749', '3.6728', '3922:0 3924:0 '),\n+('3924', 'hf192', '571', '495', '3983', '68', '73', '0', '1158.2', '-4813.94', '28.9399', '0.405537', '3923:0 3925:0 '),\n+('3925', 'hf193', '571', '495', '3983', '68', '73', '0', '1104.87', '-4804.91', '-6.8197', '0.572031', '3924:0 3926:0 '),\n+('3926', 'hf194', '571', '495', '3983', '1', '60', '0', '980.459', '-4819.09', '-72.4413', '0.31677', '3925:0 3927:0 '),\n+('3927', 'hf195', '571', '495', '3983', '68', '73', '0', '841.596', '-4863.98', '-72.4161', '5.00561', '3926:0 3928:0 3929:0 '),\n+('3928', 'hf196', '571', '495', '3983', '68', '73', '0', '875.874', '-4966.04', '-72.4404', '1.87186', '3927:0 '),\n+('3929', 'hf197', '571', '495', '495', '68', '73', '0', '795.673', '-4726.51', '-96.2356', '1.47131', '3927:0 3930:0 '),\n+('3930', 'hf198', '571', '495', '3983', '68', '73', '0', '835.937', '-4866.89', '-115.736', '2.10747', '3929:0 3931:0 '),\n+('3931', 'hf199', '571', '495', '3983', '68', '73', '0', '945.547', '-4827.44', '-116.158', '0.281421', '3930:0 '),\n+('3932', 'hf200', '571', '495', '3981', '68', '73', '3', '554.553', '-4986.67', '10.1867', '0.251579', '3918:0 3919:0 '),\n+('3933', 'hf201', '571', '495', '495', '68', '73', '0', '628.213', '-4255.8', '210.916', '3.49527', '3903:0 3910:0 3934:0 '),\n+('3934', 'hf202', '571', '495', '3994', '68', '73', '0', '765.99', '-4299.85', '185.031', '3.00833', '3933:0 3935:0 '),\n+('3935', 'hf203', '571', '495', '3994', '68', '73', '0', '798.758', '-4362.47', '161.294', '4.9679', '3934:0 3936:0 '),\n+('3936', 'hf204', '571', '495', '3994', '68', '73', '0', '902.1', '-4478.73', '144.331', '5.55301', '3935:0 3937:0 3938:0 '),\n+('3937', 'hf205', '571', '495', '3994', '68', '73', '0', '1004.65', '-4395.88', '150.922', '4.0804', '3936:0 3938:0 '),\n+('3938', 'hf206', '571', '495', '3994', '68', '73', '0', '909.858', '-4395.54', '139.649', '4.34665', '3937:0 3936:0 '),\n+('3939', 'hf207', '571', '495', '4048', '68', '73', '0', '1203.65', '-3825.84', '142.684', '1.05976', '3898:0 3899:0 3912:0 3940:0 '),\n+('3940', 'hf208', '571', '495', '495', '68', '73', '0', '1408.56', '-3737.55', '135.962', '1.67629', '3939:0 3941:0 '),\n+('3941', 'hf209', '571', '495', '495', '68', '73', '0', '1558.28', '-3740.43', '144.691', '0.00336027', '3940:0 3942:0 '),\n+('3942', 'hf210', '571', '495', '495', '68', '73', '1', '1706.02', '-3730.74', '148.901', '3.19209', '3941:0 3943:0 3981:0 '),\n+('3943', 'hf211', '571', '495', '495', '68', '73', '0', '1803.26', '-3895.57', '170.472', '0.273537', '3942:0 3944:0 '),\n+('3944', 'hf212', '571', '495', '495', '68', '73', '0', '1949.63', '-3842.81', '173.777', '1.70846', '3943:0 3945:0 '),\n+('3945', 'hf213', '571', '495', '4068', '68', '73', '0', '2008.1', '-3689.61', '173.671', '1.9378', '3944:0 3946:0 '),\n+('3946', 'hf214', '571', '495', '4068', '68', '73', '0', '1967.39', '-3604.53', '158.109', '5.18071', '3945:0 3947:0 3985:0 '),\n+('3947', 'hf215', '571', '495', '495', '68', '73', '0', '2096.74', '-3545.48', '153.897', '6.17032', '3946:0 3948:0 '),\n+('3948', 'hf216', '571', '495', '495', '68', '73', '0', '2318.6', '-3583.13', '165.228', '0.334813', '3947:0 3949:0 '),\n+('3949', 'hf217', '571', '495', '4006', '68', '73', '0', '2535.68', '-3475.65', '183.975', '0.49582', '3948:0 3950:0 3953:0 '),\n+('3950', 'hf218', '571', '495', '4006', '68', '73', '0', '2624.04', '-3562.9', '205.26', '5.49331', '3949:0 3951:0 3953:0 '),\n+('3951', 'hf219', '571', '495', '4006', '68', '73', '0', '2727.06', '-3698.08', '221.722', '5.46582', '3950:0 3952:0 '),\n+('3952', 'hf220', '571', '495', '4065', '68', '73', '0', '2838.83', '-3844.63', '244.563', '5.37', '3951:0 '),\n+('3953', 'hf221', '571', '495', '4006', '68', '73', '0', '2613.9', '-3384.95', '183', '4.543', '3949:0 3950:0 3954:0 3955:0 '),\n+('3954', 'hf222', '571', '495', '4006', '68', '73', '0', '2724.44', '-3424.92', '224.685', '0.694536', '3953:0 '),\n+('3955', 'hf223', '571', '495', '4054', '68', '73', '0', '2578.54', '-3191.48', '141.337', '1.90327', '3953:0 3956:0 '),\n+('3956', 'hf224', '571', '495', '495', '68', '73', '0', '2515.29', '-2957.64', '111.213', '1.93861', '3955:0 3957:0 3965:0 4272:0 '),\n+('3957', 'hf225', '571', '495', '4054', '68', '73', '0', '2301.09', '-3135.29', '143.7', '3.73482', '3956:0 3958:0 3964:0 '),\n+('3958', 'hf226', '571', '495', '4054', '68', '73', '0', '2243.04', '-3261.92', '151.734', '2.70201', '3957:0 3959:0 '),\n+('3959', 'hf227', '571', '495', '3999', '68', '73', '0', '2145.39', '-3331.7', '144.475', '1.2019', '3958:0 3960:0 '),\n+('3960', 'hf228', '571', '495', '3999', '68', '73', '0', '2086.44', '-3330', '104.792', '3.06722', '3959:0 3961:0 '),\n+('3961', 'hf229', '571', '495', '3999', '68', '73', '0', '1983.23', '-3286.99', '111.741', '1.78624', '3960:0 3962:0 '),\n+('3962', 'hf230', '571', '495', '3999', '68', '73', '0', '2045.23', '-3172.46', '139.784', '4.15736', '3961:0 3963:0 '),\n+('3963', 'hf231', '571', '495', '4062', '68', '73', '5', '2094.18', '-2981.02', '144.898', '4.45895', '3962:0 3964:0 '),\n+('3964', 'hf232', '571', '495', '495', '68', '73', '0', '2264.88', '-3015.48', '135.084', '5.19722', '3963:0 3957:0 '),\n+('3965', 'hf233', '571', '495', '495', '68', '73', '0', '2606.41', '-2825.71', '69.3506', '1.32522', '3956:0 3966:0 4272:0 '),\n+('3966', 'hf234', '571', '495', '4070', '68', '73', '0', '2558.46', '-2678.02', '3.25504', '5.60171', '3965:0 3967:0 4276:0 '),\n+('3967', 'hf235', '571', '495', '4070', '68', '73', '0', '2430.12', '-2758.92', '5.62901', '3.37275', '3966:0 3968:0 '),\n+('3968', 'hf236', '571', '495', '4070', '68', '73', '0', '2281.27', '-2774.11', '4.91082', '0.329327', '3967:0 3969:0 '),\n+('3969', 'hf237', '571', '495', '4070', '68', '73', '0', '2153.11', '-2770.66', '4.86218', '3.08765', '3968:0 3970:0 '),\n+('3970', 'hf238', '571', '495', '4070', '68', '73', '0', '1967.15', '-2762.53', '3.5219', '3.17561', '3969:0 3971:0 '),\n+('3971', 'hf239', '571', '495', '4070', '68', '73', '0', '1835.91', '-2814.57', '3.48005', '3.54396', '3970:0 3972:0 '),\n+('3972', 'hf240', '571', '495', '4070', '68', '73', '0', '1677.38', '-2975.29', '3.95501', '4.155', '3971:0 3973:0 '),\n+('3973', 'hf241', '571', '495', '4071', '68', '73', '0', '1576.78', '-3123.46', '2.99581', '4.44402', '3972:0 3974:0 3983:0 '),\n+('3974', 'hf242', '571', '495', '4071', '68', '73', '0', '1609.87', '-3258.66', '3.34169', '4.86186', '3973:0 3975:0 '),\n+('3975', 'hf243', '571', '495', '4071', '68', '73', '0', '1629.47', '-3440.1', '29.9326', '3.35783', '3974:0 3976:0 3984:0 '),\n+('3976', 'hf244', '571', '495', '4071', '68', '73', '0', '1490.07', '-3428.63', '88.8301', '0.0332379', '3975:0 3977:0 '),\n+('3977', 'hf245', '571', '495', '4071', '68', '73', '0', '1554.39', '-3419.81', '97.6795', '4.70636', '3976:0 3978:0 3980:0 3982:0 '),\n+('3978', 'hf246', '571', '495', '4071', '68', '73', '0', '1638.14', '-3283.78', '76.0526', '5.23256', '3977:0 3979:0 '),\n+('3979', 'hf247', '571', '495', '4071', '68', '73', '0', '1772.14', '-3327.31', '81.7587', '4.30737', '3978:0 '),\n+('3980', 'hf248', '571', '495', '4071', '68', '73', '0', '1641.48', '-3512.7', '92.7675', '1.7077', '3977:0 3981:0 '),\n+('3981', 'hf249', '571', '495', '495', '68', '73', '0', '1670.45', '-3682.65', '149.579', '1.75245', '3980:0 3942:0 3982:0 '),\n+('3982', 'hf250', '571', '495', '4071', '68', '73', '0', '1565.95', '-3550.52', '112.177', '1.48387', '3981:0 3977:0 '),\n+('3983', 'hf251', '571', '495', '495', '68', '73', '0', '1489.29', '-3099.07', '39.9696', '5.34802', '3973:0 3984:0 '),\n+('3984', 'hf252', '571', '495', '4071', '68', '73', '0', '1511.33', '-3269.6', '74.5615', '0.545315', '3983:0 3975:0 '),\n+('3985', 'hf253', '571', '495', '495', '68', '73', '0', '2104.47', '-3840.68', '209.54', '2.27867', '3946:0 3986:0 '),\n+('3986', 'hf254', '571', '495', '4002', '68', '73', '0', '2068.75', '-4073.32', '236.821', '4.87048', '3985:0 3987:0 3993:0 '),\n+('3987', 'hf255', '571', '495', '4002', '68', '73', '0', '1987.13', '-4141.88', '216.964', '3.23293', '3986:0 3988:0 '),\n+('3988', 'hf256', '571', '495', '4002', '68', '73', '0', '1838.02', '-4120.86', '223.042', '2.70435', '3987:0 3989:0 3992:0 '),\n+('3989', 'hf257', '571', '495', '4002', '68', '73', '0', '1672.75', '-4022.82', '249.031', '3.18894', '3988:0 3990:0 '),\n+('3990', 'hf258', '571', '495', '4002', '68', '73', '0', '1693.59', '-4091.47', '270.671', '4.86183', '3989:0 3991:0 '),\n+('3991', 'hf259', '571', '495', '4002', '68', '73', '0', '1644.9', '-4213.64', '258.417', '6.27555', '3990:0 3992:0 '),\n+('3992', 'hf260', '571', '495', '4002', '68', '73', '0', '1773.12', '-4215.36', '238.947', '0.851593', '3991:0 3988:0 '),\n+('3993', 'hf261', '571', '495', '495', '68', '73', '0', '2130.43', '-4316.44', '219.989', '1.40137', '3986:0 3994:0 '),\n+('3994', 'hf262', '571', '495', '495', '68', '73', '0', '2183.63', '-4535.73', '216.514', '4.86106', '3993:0 3995:0 '),\n+('3995', 'hf263', '571', '495', '495', '68', '73', '0', '2377.58', '-4396.75', '228.263', '0.804472', '3994:0 3996:0 '),\n+('3996', 'hf264', '571', '495', '495', '68', '73', '0', '2551.09', '-4320.92', '279.902', '6.10198', '3995:0 3997:0 '),\n+('3997', 'hf265', '571', '495', '4018', '68', '73', '5', '2613.73', '-4366.35', '276.555', '2.42318', '3996:0 3998:0 '),\n+('3998', 'hf266', '571', '495', '4018', '68', '73', '4', '2716.59', '-4368.81', '272.672', '5.25063', '3997:0 3999:0 '),\n+('3999', 'hf267', '571', '495', '495', '68', '73', '0', '2797.23', '-4621.23', '277.95', '5.09748', '3998:0 4000:0 4306:0 '),\n+('4000', 'hf268', '571', '495', '495', '68', '73', '0', '2607.42', '-4744.93', '256.769', '3.77173', '3999:0 4001:0 '),\n+('4001', 'hf269', '571', '495', '495', '68', '73', '0', '2455.43', '-4885.82', '260.773', '3.54789', '4000:0 4002:0 4005:0 '),\n+('4002', 'hf270', '571', '495', '495', '68', '73', '3', '2431.15', '-4962.71', '273.723', '1.34484', '4001:0 4003:0 '),\n+('4003', 'hf271', '571', '495', '4003', '68', '73', '2', '2510.75', '-4994.59', '283.35', '2.79784', '4002:0 4004:0 '),\n+('4004', 'hf272', '571', '495', '4003', '68', '73', '2', '2456.13', '-5113.98', '277.313', '4.08197', '4003:0 '),\n+('4005', 'hf273', '571', '495', '495', '68', '73', '0', '2232.27', '-4879.42', '237.068', '0.178543', '4001:0 4006:0 '),\n+('4006', 'hf274', '571', '495', '495', '68', '73', '0', '2035.15', '-4874.68', '210.788', '3.93982', '4005:0 4007:0 4010:0 '),\n+('4007', 'hf275', '571', '495', '495', '68', '73', '0', '1888.77', '-4884.63', '168.445', '3.11672', '4006:0 4008:0 '),\n+('4008', 'hf276', '571', '495', '4059', '68', '73', '0', '1712.12', '-4879.28', '126.121', '3.13635', '4007:0 4009:0 '),\n+('4009', 'hf277', '571', '495', '4059', '68', '73', '0', '1563', '-4951.92', '143.133', '4.04662', '4008:0 '),\n+('4010', 'hf278', '571', '495', '495', '68', '73', '0', '1915.43', '-5076.01', '179.861', '4.59721', '4006:0 4011:0 '),\n+('4011', 'hf279', '571', '495', '495', '68', '73', '0', '1824.95', '-5278.57', '182.601', '4.39143', '4010:0 4012:0 4018:0 '),\n+('4012', 'hf280', '571', '495', '4061', '68', '73', '0', '1965.2', '-5427.02', '202.866', '6.04468', '4011:0 4013:0 '),\n+('4013', 'hf281', '571', '495', '4061', '68', '73', '0', '2137.38', '-5461.32', '239.114', '6.25123', '4012:0 4014:0 '),\n+('4014', 'hf282', '571', '495', '4061', '68', '73', '0', '2177.05', '-5614.25', '226.937', '4.76369', '4013:0 4015:0 4351:0 '),\n+('4015', 'hf283', '571', '495', '4061', '68', '73', '0', '2173.72', '-5813.08', '225.029', '3.53925', '4014:0 4016:0 4351:0 '),\n+('4016', 'hf284', '571', '495', '4061', '68', '73', '0', '1978.82', '-5763.87', '223.278', '2.62034', '4015:0 4017:0 '),\n+('4017', 'hf285', '571', '495', '4061', '68', '73', '0', '1834.38', '-5629.13', '215.972', '1.48308', '4016:0 4018:0 '),\n+('4018', 'hf286', '571', '495', '495', '68', '73', '1', '1667.21', '-5453.46', '197.385', '2.72951', '4017:0 4011:0 4019:0 4022:0 '),\n+('4019', 'hf287', '571', '495', '4001', '68', '73', '0', '1532.35', '-5419.75', '189.418', '2.63761', '4018:0 4020:0 '),\n+('4020', 'hf288', '571', '495', '4001', '68', '73', '0', '1486.1', '-5319.6', '195.08', '1.17912', '4019:0 4021:0 '),\n+('4021', 'hf289', '571', '495', '4001', '68', '73', '0', '1504.6', '-5264.18', '206.615', '0.745568', '4020:0 '),\n+('4022', 'hf290', '571', '495', '495', '68', '73', '0', '1492.09', '-5524.43', '200.456', '3.74892', '4018:0 4023:0 4026:0 '),\n+('4023', 'hf291', '571', '495', '4403', '68', '73', '0', '1532.33', '-5613.29', '226.19', '4.85477', '4022:0 4024:0 '),\n+('4024', 'hf292', '571', '495', '4402', '68', '73', '4', '1541.33', '-5689.58', '248.356', '1.64643', '4023:0 4025:0 '),\n+('4025', 'hf293', '571', '495', '495', '68', '73', '5', '1631.27', '-5779.62', '258.389', '2.51272', '4024:0 '),\n+('4026', 'hf294', '571', '495', '495', '68', '73', '0', '1394.07', '-5574.59', '205.361', '0.236628', '4022:0 4027:0 '),\n+('4027', 'hf295', '571', '495', '495', '68', '73', '0', '1234.61', '-5679.7', '225.93', '3.5408', '4026:0 4028:0 4058:0 '),\n+('4028', 'hf296', '571', '495', '3984', '68', '73', '0', '1037.41', '-5697.06', '228.706', '3.34052', '4027:0 4029:0 4062:0 '),\n+('4029', 'hf297', '571', '495', '495', '68', '73', '0', '877.228', '-5789.41', '249.962', '3.77328', '4028:0 4030:0 '),\n+('4030', 'hf298', '571', '495', '495', '68', '73', '0', '739.705', '-5863.89', '287.056', '4.11336', '4029:0 4031:0 '),\n+('4031', 'hf299', '571', '495', '495', '68', '73', '3', '483.188', '-5922.44', '308.68', '1.33265', '4030:0 4032:0 '),\n+('4032', 'hf300', '571', '495', '495', '68', '73', '0', '513.926', '-5588.33', '281.883', '2.6321', '4031:0 4033:0 '),\n+('4033', 'hf301', '571', '495', '495', '68', '73', '0', '342.715', '-5438.85', '298.648', '2.30775', '4032:0 4034:0 '),\n+('4034', 'hf302', '571', '495', '495', '68', '73', '0', '221.35', '-5242.73', '299.653', '1.84436', '4033:0 4035:0 '),\n+('4035', 'hf303', '571', '495', '4057', '68', '73', '0', '161.173', '-4925.94', '298.444', '1.79331', '4034:0 4036:0 4037:0 4039:0 '),\n+('4036', 'hf304', '571', '495', '495', '68', '73', '0', '285.533', '-4807.39', '248.989', '1.63624', '4035:0 3905:0 3908:0 '),\n+('4037', 'hf305', '571', '495', '4057', '68', '73', '0', '-28.8267', '-4914.36', '302.775', '3.12851', '4035:0 4038:0 '),\n+('4038', 'hf306', '571', '495', '4057', '68', '73', '0', '-143.121', '-5118.6', '323.883', '1.16107', '4037:0 '),\n+('4039', 'hf307', '571', '495', '495', '68', '73', '0', '115.019', '-4716.56', '289.321', '1.68335', '4035:0 3906:0 4040:0 '),\n+('4040', 'hf308', '571', '495', '495', '68', '73', '0', '156.917', '-4507.79', '256.612', '1.23411', '4039:0 3904:0 '),\n+('4041', 'hf309', '571', '495', '3988', '68', '73', '1', '778.297', '-2898.22', '7.01161', '4.8391', '4042:0 '),\n+('4042', 'hf310', '571', '495', '3987', '68', '73', '0', '741.908', '-3049.69', '25.2093', '3.79609', '4041:0 4043:0 4046:0 4047:0 4048:0 4049:0 '),\n+('4043', 'hf311', '571', '495', '3987', '68', '73', '0', '590.131', '-3156.57', '40.1902', '3.94689', '4042:0 4044:0 4053:0 '),\n+('4044', 'hf312', '571', '495', '3987', '68', '73', '0', '471.48', '-3318.84', '48.7074', '3.51255', '4043:0 4045:0 '),\n+('4045', 'hf313', '571', '495', '3987', '68', '73', '0', '386.081', '-3089.98', '71.2014', '1.81688', '4044:0 4046:0 '),\n+('4046', 'hf314', '571', '495', '3987', '68', '73', '0', '508.887', '-3028.15', '24.4901', '2.16561', '4045:0 4042:0 '),\n+('4047', 'hf315', '571', '495', '3987', '68', '73', '0', '986.117', '-3034.77', '57.92', '0.46364', '4042:0 4048:0 '),\n+('4048', 'hf316', '571', '495', '3987', '68', '73', '0', '749.692', '-3240.83', '24.9581', '2.15066', '4042:0 4047:0 4051:0 '),\n+('4049', 'hf317', '571', '495', '3987', '68', '73', '0', '675.991', '-3161.57', '61.349', '1.00634', '4042:0 4050:0 '),\n+('4050', 'hf318', '571', '495', '3987', '68', '73', '0', '677.454', '-3393.96', '67.7866', '4.88621', '4049:0 '),\n+('4051', 'hf319', '571', '495', '3987', '68', '73', '0', '566.586', '-3287.72', '26.0315', '4.65294', '4048:0 4052:0 '),\n+('4052', 'hf320', '571', '495', '4226', '68', '73', '0', '551.1', '-3494.05', '3.24654', '4.58853', '4051:0 '),\n+('4053', 'hf321', '571', '495', '3987', '68', '73', '0', '370.473', '-3216.41', '23.421', '3.95629', '4043:0 4054:0 '),\n+('4054', 'hf322', '571', '495', '4474', '68', '73', '0', '223.035', '-3291.75', '0.0638989', '3.59893', '4053:0 4055:0 '),\n+('4055', 'hf323', '571', '495', '4474', '68', '73', '0', '114.305', '-3330.69', '0.616794', '0.370948', '4054:0 4056:0 '),\n+('4056', 'hf324', '571', '495', '3989', '68', '73', '0', '-16.534', '-3453.36', '32.7157', '1.36763', '4055:0 4057:0 '),\n+('4057', 'hf325', '571', '495', '3990', '68', '73', '0', '-130.721', '-3573.93', '3.18551', '1.92133', '4056:0 '),\n+('4058', 'hf326', '571', '495', '495', '68', '73', '0', '1337.07', '-5914.2', '292.65', '4.10948', '4027:0 4059:0 '),\n+('4059', 'hf327', '571', '495', '4005', '68', '73', '0', '1323.93', '-6111.92', '266.982', '3.40577', '4058:0 4060:0 '),\n+('4060', 'hf328', '571', '495', '4005', '68', '73', '0', '1181.44', '-6169.63', '232.169', '2.26694', '4059:0 4061:0 '),\n+('4061', 'hf329', '571', '495', '4005', '68', '73', '0', '1118.44', '-6156.85', '260.616', '1.64883', '4060:0 4062:0 '),\n+('4062', 'hf330', '571', '495', '495', '68', '73', '0', '1131.33', '-5884.77', '271.705', '2.04153', '4061:0 4028:0 '),\n+('4063', 'db331', '571', '65', '4478', '70', '74', '0', '3509.64', '2944.69', '24.9497', '4.10306', '3831:0 '),\n+('4064', 'db332', '571', '65', '65', '70', '74', '0', '3526.72', '2777.23', '49.7018', '4.66854', '4065:0 4221:0 4228:0 '),\n+('4065', 'db333', '571', '65', '4157', '70', '74', '0', '3369.46', '2655.03', '38.9276', '4.90416', '4064:0 4066:0 '),\n+('4066', 'db334', '571', '65', '4157', '70', '74', '0', '3440.83', '2477.55', '45.9125', '4.61748', '4065:0 4067:0 '),\n+('4067', 'db335', '571', '65', '4157', '70', '74', '0', '3395.92', '2379.05', '36.7537', '2.28876', '4066:0 4068:0 '),\n+('4068', 'db336', '571', '65', '4157', '70', '74', '0', '3343.5', '2223.35', '29.9841', '5.39185', '4067:0 4070:0 4069:0 '),\n+('4069', 'db337', '571', '65', '65', '70', '74', '3', '3489.08', '1998.02', '64.8654', '1.46526', '4068:0 4070:0 4214:0 '),\n+('4070', 'db338', '571', '65', '4160', '70', '74', '0', '3228.78', '1905.36', '132.824', '3.97029', '4071:0 4068:0 4069:0 '),\n+('4071', 'db339', '571', '65', '4160', '70', '74', '0', '2981.37', '1896.75', '127.972', '2.94456', '4070:0 4072:0 '),\n+('4072', 'db340', '571', '65', '4160', '70', '74', '0', '2800.15', '1812.41', '147.093', '5.30074', '4071:0 4073:0 '),\n+('4073', 'db341', '571', '65', '4160', '70', '74', '0', '2944.01', '1641.57', '152.165', '4.64493', '4072:0 4074:0 '),\n+('4074', 'db342', '571', '65', '4153', '70', '74', '0', '2869.62', '1469.27', '157.603', '5.17349', '4073:0 4075:0 '),\n+('4075', 'db343', '571', '65', '4153', '70', '74', '0', '2927.17', '1282.72', '151.277', '5.62666', '4074:0 4076:0 '),\n+('4076', 'db344', '571', '65', '4153', '70', '74', '0', '3121.27', '1266.58', '158.478', '3.9082', '4075:0 4077:0 4082:0 '),\n+('4077', 'db345', '571', '65', '4154', '70', '74', '0', '3098.59', '1055.28', '114.785', '4.75643', '4076:0 4078:0 4081:0 '),\n+('4078', 'db346', '571', '65', '4152', '70', '74', '0', '3015.6', '886.551', '57.0023', '3.13067', '4077:0 4079:0 4081:0 '),\n+('4079', 'db347', '571', '65', '4152', '70', '74', '0', '2864.53', '878.189', '19.1406', '2.82436', '4078:0 4080:0 '),\n+('4080', 'db348', '571', '65', '4152', '70', '74', '1', '2657.93', '892.145', '4.37495', '3.30424', '4079:0 '),\n+('4081', 'db349', '571', '65', '4154', '70', '74', '0', '3216.12', '884.158', '119.499', '2.58873', '4077:0 4078:0 4082:0 '),\n+('4082', 'db350', '571', '65', '4154', '70', '74', '0', '3342.09', '1163.09', '140.364', '0.88363', '4076:0 4081:0 4083:0 '),\n+('4083', 'db351', '571', '65', '4154', '70', '74', '0', '3499.57', '1159.74', '129.579', '0.224683', '4082:0 4084:0 4208:0 '),\n+('4084', 'db352', '571', '65', '4254', '70', '74', '0', '3512.34', '930.529', '67.6824', '4.436', '4083:0 4085:0 '),\n+('4085', 'db353', '571', '65', '4254', '70', '74', '0', '3439.05', '725.86', '74.9159', '3.52022', '4084:0 4086:0 '),\n+('4086', 'db354', '571', '65', '4254', '70', '74', '0', '3383.4', '548.065', '79.6602', '4.13597', '4085:0 4087:0 '),\n+('4087', 'db355', '571', '65', '4254', '70', '74', '0', '3284.71', '349.551', '72.0866', '4.38102', '4086:0 4088:0 '),\n+('4088', 'db356', '571', '65', '4254', '70', '74', '0', '3258.62', '161.424', '74.762', '4.63863', '4087:0 4089:0 '),\n+('4089', 'db357', '571', '65', '4254', '70', '74', '0', '3199.28', '-65.6434', '75.8214', '5.73582', '4088:0 4090:0 '),\n+('4090', 'db358', '571', '65', '4254', '70', '74', '0', '3396.24', '-138.385', '72.6226', '6.16308', '4089:0 4091:0 4176:0 '),\n+('4091', 'db359', '571', '65', '4176', '70', '74', '0', '3614.83', '-219.548', '59.6726', '5.91567', '4090:0 4092:0 '),\n+('4092', 'db360', '571', '65', '4254', '70', '74', '0', '3790.53', '-250.696', '72.8378', '0.182258', '4091:0 4175:0 '),\n+('4093', 'db361', '571', '65', '4254', '70', '74', '0', '3996.13', '-105.238', '55.0057', '0.538831', '4094:0 '),\n+('4094', 'db362', '571', '65', '4254', '70', '74', '0', '4209.42', '-149.468', '68.6085', '5.25672', '4093:0 4095:0 '),\n+('4095', 'db363', '571', '65', '4254', '70', '74', '0', '4346.6', '-340.238', '86.1907', '5.65727', '4094:0 4139:0 '),\n+('4096', 'db364', '571', '65', '4254', '70', '74', '0', '4531.54', '-157.776', '94.5998', '0.726543', '4097:0 '),\n+('4097', 'db365', '571', '65', '4253', '70', '74', '0', '4529.69', '-5.32293', '72.4325', '1.1538', '4096:0 4098:0 '),\n+('4098', 'db366', '571', '65', '4187', '70', '74', '0', '4719.33', '26.5065', '64.7658', '0.68649', '4097:0 4099:0 '),\n+('4099', 'db367', '571', '65', '4187', '70', '74', '0', '4857.73', '152.013', '95.1974', '0.64722', '4098:0 4100:0 4102:0 '),\n+('4100', 'db368', '571', '65', '4187', '70', '74', '0', '5023.32', '291.159', '160.107', '0.61659', '4099:0 4101:0 '),\n+('4101', 'db369', '571', '65', '4187', '70', '74', '0', '5185.63', '203.224', '194.36', '2.54081', '4100:0 4585:0 '),\n+('4102', 'db370', '571', '65', '4187', '70', '74', '0', '4916.98', '373.751', '114.702', '2.28006', '4099:0 4103:0 '),\n+('4103', 'db371', '571', '65', '4396', '70', '74', '0', '4715.84', '582.426', '121.086', '2.36646', '4102:0 4104:0 4136:0 '),\n+('4104', 'db372', '571', '65', '4254', '70', '74', '0', '4669.25', '828.097', '110.706', '2.44265', '4105:0 4133:0 4103:0 '),\n+('4105', 'db373', '571', '65', '4254', '70', '74', '0', '4441.38', '887.155', '84.3941', '2.82121', '4104:0 4106:0 4107:0 '),\n+('4106', 'db374', '571', '65', '4254', '70', '74', '0', '4443.49', '662.985', '67.5233', '2.64843', '4105:0 4107:0 '),\n+('4107', 'db375', '571', '65', '4254', '70', '74', '0', '4350.16', '761.448', '67.5378', '5.48843', '4106:0 4105:0 4108:0 '),\n+('4108', 'db376', '571', '65', '4173', '70', '74', '0', '4171.02', '645.93', '64.3628', '5.72325', '4107:0 4109:0 '),\n+('4109', 'db377', '571', '65', '4173', '70', '74', '0', '4234.66', '525', '11.3008', '1.28578', '4108:0 4110:0 '),\n+('4110', 'db378', '571', '65', '4173', '70', '74', '0', '4325.75', '527.107', '-8.31338', '5.11853', '4109:0 4111:0 '),\n+('4111', 'db379', '571', '65', '4173', '70', '74', '0', '4340.91', '393.399', '-6.35666', '0.319745', '4110:0 4112:0 '),\n+('4112', 'db380', '571', '65', '4173', '70', '74', '0', '4445.71', '448.569', '48.7618', '3.60429', '4111:0 4113:0 '),\n+('4113', 'db381', '571', '65', '4254', '70', '74', '0', '4396.23', '306.166', '44.9454', '3.30034', '4112:0 4114:0 '),\n+('4114', 'db382', '571', '65', '4254', '70', '74', '0', '4238.24', '300.479', '69.4901', '3.54617', '4113:0 4115:0 '),\n+('4115', 'db383', '571', '65', '4254', '70', '74', '0', '4069.57', '365.886', '52.151', '2.76941', '4114:0 4116:0 '),\n+('4116', 'db384', '571', '65', '4254', '70', '74', '0', '3905.43', '429.963', '42.0653', '2.76941', '4115:0 4117:0 '),\n+('4117', 'db385', '571', '65', '4254', '70', '74', '0', '3784.72', '555.764', '65.4753', '2.52593', '4116:0 4118:0 '),\n+('4118', 'db386', '571', '65', '4254', '70', '74', '0', '3856.57', '647.11', '62.7715', '2.10102', '4117:0 4119:0 '),\n+('4119', 'db387', '571', '65', '4254', '70', '74', '0', '3750.11', '814.498', '76.6706', '1.69811', '4118:0 4120:0 4123:0 '),\n+('4120', 'db388', '571', '65', '4168', '70', '74', '0', '3669.68', '935.971', '55.9559', '1.74995', '4119:0 4121:0 '),\n+('4121', 'db389', '571', '65', '4168', '70', '74', '0', '3656.82', '1058.49', '58.5011', '5.83088', '4120:0 4122:0 '),\n+('4122', 'db390', '571', '65', '4168', '70', '74', '0', '3822.88', '1076.68', '57.7067', '4.99837', '4121:0 4123:0 '),\n+('4123', 'db391', '571', '65', '4168', '70', '74', '0', '3851.01', '940.099', '56.0659', '4.66535', '4122:0 4119:0 4124:0 '),\n+('4124', 'db392', '571', '65', '4254', '70', '74', '0', '4005.33', '1003', '53.2598', '6.17489', '4123:0 4125:0 '),\n+('4125', 'db393', '571', '65', '4254', '70', '74', '0', '4142.41', '981.525', '78.4202', '0.463487', '4124:0 4126:0 '),\n+('4126', 'db394', '571', '65', '4254', '70', '74', '0', '4305.2', '1039.06', '63.1545', '6.25972', '4125:0 4127:0 '),\n+('4127', 'db395', '571', '65', '65', '70', '74', '0', '4276.99', '1183.3', '141.02', '6.17961', '4126:0 4128:0 '),\n+('4128', 'db396', '571', '65', '65', '70', '74', '0', '4489.67', '1187.53', '136.792', '1.18448', '4127:0 4129:0 4133:0 '),\n+('4129', 'db397', '571', '65', '4169', '70', '74', '2', '4570.48', '1377.12', '189.542', '1.18173', '4128:0 4130:0 '),\n+('4130', 'db398', '571', '65', '4169', '70', '74', '3', '4589.48', '1435.55', '189.222', '0.103772', '4129:0 4131:0 4132:0 '),\n+('4131', 'db399', '571', '65', '4169', '70', '74', '2', '4621.53', '1507.35', '204.751', '1.03447', '4130:0 '),\n+('4132', 'db400', '571', '65', '4171', '70', '74', '2', '4711.55', '1446.21', '175.428', '5.44841', '4130:0 '),\n+('4133', 'db401', '571', '65', '65', '70', '74', '0', '4690.88', '1098.68', '123.008', '2.0861', '4134:0 4128:0 4104:0 '),\n+('4134', 'db402', '571', '65', '4170', '70', '74', '4', '4841.36', '1140.74', '171.495', '1.04781', '4135:0 4133:0 '),\n+('4135', 'db403', '571', '65', '4170', '70', '74', '5', '4947.98', '1224.66', '225.705', '1.29599', '4134:0 '),\n+('4136', 'db404', '571', '65', '4230', '70', '74', '0', '4857.56', '636.316', '157.933', '3.35764', '4137:0 4103:0 '),\n+('4137', 'db405', '571', '65', '4230', '70', '74', '0', '4919.39', '858.686', '179.409', '4.72424', '4136:0 4138:0 '),\n+('4138', 'db406', '571', '65', '4230', '70', '74', '0', '5115.8', '1070.31', '223.911', '0.494084', '4137:0 '),\n+('4139', 'db407', '571', '65', '65', '70', '74', '0', '4361.47', '-666.576', '126.529', '4.95513', '4095:0 4140:0 4144:0 '),\n+('4140', 'db408', '571', '65', '4193', '70', '74', '0', '4506.23', '-611.765', '138.674', '0.191691', '4139:0 4141:0 '),\n+('4141', 'db409', '571', '65', '4193', '70', '74', '0', '4635.8', '-532.061', '166.561', '4.05115', '4140:0 4142:0 '),\n+('4142', 'db410', '571', '65', '4193', '70', '74', '0', '4701.77', '-386.751', '178.452', '4.03308', '4141:0 4143:0 '),\n+('4143', 'db411', '571', '65', '65', '70', '74', '0', '4744.71', '-265.341', '170.449', '0.542767', '4142:0 '),\n+('4144', 'db412', '571', '65', '65', '70', '74', '0', '4381.74', '-907.37', '164.196', '4.73833', '4139:0 4145:0 '),\n+('4145', 'db413', '571', '65', '65', '70', '74', '0', '4453.65', '-1048.77', '166.994', '5.44283', '4144:0 4146:0 4147:0 '),\n+('4146', 'db414', '571', '65', '4191', '70', '74', '1', '4598.46', '-1084.15', '165.481', '5.41142', '4145:0 4151:0 '),\n+('4147', 'db415', '571', '65', '65', '70', '74', '0', '4459.56', '-1263.85', '163.284', '4.29694', '4145:0 4148:0 4152:0 4153:0 '),\n+('4148', 'db416', '571', '65', '4194', '70', '74', '0', '4561.66', '-1361.99', '156.723', '5.94234', '4147:0 4149:0 '),\n+('4149', 'db417', '571', '65', '4194', '70', '74', '0', '4677.53', '-1359.08', '162.34', '2.13944', '4148:0 4150:0 4405:0 '),\n+('4150', 'db418', '571', '65', '4194', '70', '74', '0', '4810.96', '-1263.2', '168.051', '2.83451', '4149:0 4151:0 '),\n+('4151', 'db419', '571', '65', '65', '70', '74', '0', '4682.42', '-1190.97', '164.492', '2.29651', '4150:0 4146:0 '),\n+('4152', 'db420', '571', '65', '65', '70', '74', '0', '4426.84', '-1508.64', '159.241', '4.50584', '4147:0 4230:0 '),\n+('4153', 'db421', '571', '65', '65', '70', '74', '0', '4306.11', '-1358.64', '159.518', '2.56747', '4147:0 4154:0 '),\n+('4154', 'db422', '571', '65', '4189', '70', '74', '0', '4174.24', '-1186.41', '145.827', '2.02005', '4153:0 4155:0 '),\n+('4155', 'db423', '571', '65', '4189', '70', '74', '0', '4007.83', '-1254.48', '133.053', '2.98923', '4154:0 4156:0 '),\n+('4156', 'db424', '571', '65', '65', '70', '74', '0', '3870.4', '-1277.63', '147.246', '3.74243', '4155:0 4157:0 4165:0 '),\n+('4157', 'db425', '571', '65', '4188', '70', '74', '0', '3760.87', '-1379.1', '135.314', '4.06287', '4156:0 4158:0 '),\n+('4158', 'db426', '571', '65', '4188', '70', '74', '0', '3749.27', '-1504.65', '141.102', '2.59496', '4157:0 4159:0 '),\n+('4159', 'db427', '571', '65', '4188', '70', '74', '0', '3628.59', '-1546.14', '118.335', '2.62324', '4158:0 4160:0 '),\n+('4160', 'db428', '571', '65', '4188', '70', '74', '0', '3581.08', '-1357.67', '107.693', '1.20402', '4159:0 4161:0 '),\n+('4161', 'db429', '571', '65', '4188', '70', '74', '0', '3627.72', '-1237', '112.462', '1.20323', '4160:0 4162:0 '),\n+('4162', 'db430', '571', '65', '4188', '70', '74', '0', '3662.83', '-1064.27', '125.377', '1.29591', '4161:0 4163:0 '),\n+('4163', 'db431', '571', '65', '4188', '70', '74', '0', '3755.72', '-1010.08', '121.509', '5.72713', '4162:0 4164:0 4166:0 '),\n+('4164', 'db432', '571', '65', '4188', '70', '74', '0', '3850.53', '-1132.6', '122.334', '6.27534', '4163:0 4165:0 '),\n+('4165', 'db433', '571', '65', '65', '70', '74', '0', '3942.27', '-1148.57', '140.166', '4.29771', '4164:0 4156:0 '),\n+('4166', 'db434', '571', '65', '4177', '70', '74', '0', '3746.15', '-891.172', '162.614', '2.06089', '4163:0 4167:0 4170:0 '),\n+('4167', 'db435', '571', '65', '4177', '70', '74', '0', '3650.12', '-879.646', '162.72', '3.17459', '4166:0 4168:0 '),\n+('4168', 'db436', '571', '65', '4177', '70', '74', '2', '3590.79', '-835.238', '172.37', '1.65563', '4167:0 4169:0 4194:0 '),\n+('4169', 'db437', '571', '65', '4243', '70', '74', '0', '3599.65', '-781.467', '147.621', '0.0926948', '4168:0 '),\n+('4170', 'db438', '571', '65', '4177', '70', '74', '3', '3768.81', '-779.501', '195.937', '4.02283', '4166:0 4171:0 '),\n+('4171', 'db439', '571', '65', '4177', '70', '74', '2', '3925.37', '-698.927', '241.206', '0.865546', '4170:0 4172:0 '),\n+('4172', 'db440', '571', '65', '4175', '70', '74', '0', '3986.58', '-553.999', '216.076', '2.58635', '4171:0 4173:0 '),\n+('4173', 'db441', '571', '65', '4254', '70', '74', '0', '3809.46', '-473.161', '169.556', '2.73087', '4172:0 4174:0 '),\n+('4174', 'db442', '571', '65', '65', '70', '74', '0', '3724.29', '-439.939', '157.058', '3.21388', '4173:0 4175:0 '),\n+('4175', 'db443', '571', '65', '4254', '70', '74', '0', '3784.04', '-368.672', '97.0346', '1.91644', '4174:0 4092:0 '),\n+('4176', 'db444', '571', '65', '4254', '70', '74', '0', '3263.75', '-275.159', '91.4928', '3.40319', '4090:0 4177:0 '),\n+('4177', 'db445', '571', '65', '65', '70', '74', '0', '3244.55', '-472.809', '140.618', '1.83632', '4176:0 4178:0 4188:0 '),\n+('4178', 'db446', '571', '65', '65', '70', '74', '0', '3148.48', '-604.869', '113.192', '1.5842', '4177:0 4179:0 4191:0 '),\n+('4179', 'db447', '571', '65', '4180', '70', '74', '0', '2993.93', '-429.733', '123.402', '2.59501', '4178:0 4180:0 '),\n+('4180', 'db448', '571', '65', '4180', '70', '74', '0', '2867.29', '-384.503', '112.462', '2.7623', '4179:0 4181:0 4187:0 '),\n+('4181', 'db449', '571', '65', '4180', '70', '74', '0', '2773.28', '-465.739', '116.162', '4.48387', '4180:0 4182:0 '),\n+('4182', 'db450', '571', '65', '4180', '70', '74', '0', '2687.72', '-431.283', '71.3279', '2.92957', '4181:0 4183:0 '),\n+('4183', 'db451', '571', '65', '4181', '70', '74', '0', '2536.4', '-415.378', '2.90773', '1.58496', '4182:0 4184:0 4207:0 '),\n+('4184', 'db452', '571', '65', '4181', '70', '74', '0', '2612.51', '-244.345', '1.72779', '6.26044', '4183:0 4185:0 '),\n+('4185', 'db453', '571', '65', '4180', '70', '74', '0', '2656.87', '-171.598', '62.2241', '1.32029', '4184:0 4186:0 '),\n+('4186', 'db454', '571', '65', '4180', '70', '74', '0', '2737.23', '-100.56', '114.159', '4.23648', '4185:0 4187:0 '),\n+('4187', 'db455', '571', '65', '4180', '70', '74', '0', '2792.04', '-264.842', '132.149', '5.26534', '4186:0 4180:0 '),\n+('4188', 'db456', '571', '65', '4186', '70', '74', '5', '3231.05', '-661.255', '166.734', '1.42239', '4177:0 4189:0 '),\n+('4189', 'db457', '571', '65', '4186', '70', '74', '4', '3272.19', '-751.348', '168.143', '4.40298', '4188:0 4190:0 '),\n+('4190', 'db458', '571', '65', '65', '70', '74', '0', '3325.52', '-1005.39', '123.604', '2.0507', '4189:0 4191:0 4192:0 4203:0 '),\n+('4191', 'db459', '571', '65', '65', '70', '74', '0', '3207.68', '-802.517', '112.975', '2.23134', '4190:0 4178:0 '),\n+('4192', 'db460', '571', '65', '65', '70', '74', '0', '3400.63', '-1169.43', '112.122', '5.78762', '4190:0 4193:0 4195:0 '),\n+('4193', 'db461', '571', '65', '65', '70', '74', '0', '3494.11', '-1049.52', '124.775', '0.832553', '4192:0 4194:0 '),\n+('4194', 'db462', '571', '65', '4177', '70', '74', '2', '3600.71', '-914.48', '156.552', '1.53549', '4193:0 4168:0 '),\n+('4195', 'db463', '571', '65', '65', '70', '74', '0', '3235.06', '-1355.04', '70.8979', '3.83276', '4192:0 4196:0 '),\n+('4196', 'db464', '571', '65', '4257', '70', '74', '0', '3180.86', '-1542.39', '40.4347', '4.7124', '4195:0 4197:0 4231:0 '),\n+('4197', 'db465', '571', '65', '4241', '70', '74', '0', '3051.36', '-1392.98', '57.3848', '2.94133', '4196:0 4198:0 '),\n+('4198', 'db466', '571', '65', '4241', '70', '74', '0', '2889.8', '-1432.73', '58.3338', '3.04186', '4197:0 4199:0 '),\n+('4199', 'db467', '571', '65', '4241', '70', '74', '0', '2772.55', '-1373.06', '40.6788', '6.18974', '4198:0 4200:0 '),\n+('4200', 'db468', '571', '65', '4185', '70', '74', '0', '2882.77', '-1303.94', '6.48389', '1.04459', '4199:0 4201:0 '),\n+('4201', 'db469', '571', '65', '4185', '70', '74', '0', '2938.22', '-1169.74', '6.81704', '5.99025', '4200:0 4202:0 4204:0 '),\n+('4202', 'db470', '571', '65', '4185', '70', '74', '0', '3085.09', '-1193.85', '12.4717', '5.4876', '4201:0 4203:0 '),\n+('4203', 'db471', '571', '65', '4185', '70', '74', '0', '3180.57', '-1059.52', '44.9918', '0.29769', '4202:0 4190:0 '),\n+('4204', 'db472', '571', '65', '4185', '70', '74', '0', '2929.48', '-986.506', '4.6099', '1.77817', '4201:0 4205:0 '),\n+('4205', 'db473', '571', '65', '4185', '70', '74', '0', '2865.52', '-836.167', '15.7438', '2.35701', '4204:0 4206:0 '),\n+('4206', 'db474', '571', '65', '4185', '70', '74', '0', '2691.63', '-707.31', '8.95638', '2.62875', '4205:0 4207:0 '),\n+('4207', 'db475', '571', '65', '4181', '70', '74', '0', '2662.91', '-565.045', '4.97671', '2.87851', '4206:0 4183:0 '),\n+('4208', 'db476', '571', '65', '65', '70', '74', '0', '3597.9', '1391.95', '92.2854', '0.792481', '4083:0 4209:0 '),\n+('4209', 'db477', '571', '65', '4165', '70', '74', '4', '3768.55', '1529.38', '86.92', '0.415486', '4208:0 4210:0 '),\n+('4210', 'db478', '571', '65', '4165', '70', '74', '5', '3841.3', '1533.41', '89.7247', '1.82685', '4209:0 4211:0 '),\n+('4211', 'db479', '571', '65', '4165', '70', '74', '4', '3890.52', '1637.61', '96.2566', '0.644815', '4210:0 4212:0 '),\n+('4212', 'db480', '571', '65', '65', '70', '74', '0', '4003.51', '1741.08', '142.414', '3.8728', '4211:0 4213:0 '),\n+('4213', 'db481', '571', '65', '65', '70', '74', '0', '3800.66', '1801.11', '107.946', '0.35893', '4212:0 4214:0 4227:0 '),\n+('4214', 'db482', '571', '65', '65', '70', '74', '0', '3642.7', '1910.26', '75.9736', '1.69646', '4213:0 4215:0 4069:0 '),\n+('4215', 'db483', '571', '65', '65', '70', '74', '0', '3615.88', '2050.78', '74.6297', '1.7962', '4214:0 4216:0 4219:0 '),\n+('4216', 'db484', '571', '65', '4164', '70', '74', '0', '3709.48', '2144.81', '53.4192', '3.56571', '4215:0 4217:0 4218:0 '),\n+('4217', 'db485', '571', '65', '4164', '70', '74', '0', '3706.64', '2076.92', '21.8594', '1.15533', '4216:0 4218:0 '),\n+('4218', 'db486', '571', '65', '4164', '70', '74', '0', '3772.34', '2169.36', '27.3597', '4.8828', '4217:0 4216:0 '),\n+('4219', 'db487', '571', '65', '65', '70', '74', '0', '3638.81', '2223.64', '76.3879', '1.34851', '4215:0 4220:0 '),\n+('4220', 'db488', '571', '65', '65', '70', '74', '0', '3608.56', '2424.79', '84.7521', '0.47515', '4219:0 4221:0 '),\n+('4221', 'db489', '571', '65', '65', '70', '74', '0', '3667.57', '2606.35', '104.934', '2.34754', '4220:0 4064:0 4222:0 '),\n+('4222', 'db490', '571', '65', '65', '70', '74', '0', '3821.64', '2594.47', '138.086', '5.63442', '4221:0 4223:0 '),\n+('4223', 'db491', '571', '65', '4163', '70', '74', '0', '3877.75', '2397.8', '152.255', '5.33596', '4222:0 4224:0 '),\n+('4224', 'db492', '571', '65', '4163', '70', '74', '0', '4003.82', '2286.07', '153.425', '6.19125', '4223:0 4225:0 '),\n+('4225', 'db493', '571', '65', '4163', '70', '74', '0', '4084.73', '2159.31', '153.682', '4.48536', '4224:0 4226:0 '),\n+('4226', 'db494', '571', '65', '4163', '70', '74', '0', '3961.11', '2124.54', '131.41', '3.85941', '4225:0 4227:0 '),\n+('4227', 'db495', '571', '65', '65', '70', '74', '0', '3825.91', '1954.77', '104.913', '4.14765', '4226:0 4213:0 '),\n+('4228', 'db496', '571', '65', '4151', '70', '74', '4', '3706.43', '2835.58', '88.7151', '0.419359', '4064:0 4229:0 '),\n+('4229', 'db497', '571', '65', '4151', '70', '74', '5', '3828.74', '2884', '90.3388', '0.171959', '4228:0 '),\n+('4230', 'gh498', '571', '394', '394', '72', '76', '0', '4412.91', '-1618.03', '162.125', '4.64085', '4152:0 4243:0 '),\n+('4231', 'gh499', '571', '394', '394', '72', '76', '0', '3182.34', '-1659.02', '38.7919', '4.89218', '4196:0 4232:0 '),\n+('4232', 'gh500', '571', '394', '394', '72', '76', '0', '3170.1', '-1849.63', '70.0118', '5.13957', '4231:0 4233:0 '),\n+('4233', 'gh501', '571', '394', '4236', '72', '76', '0', '3193.69', '-1991.71', '85.0008', '6.13546', '4232:0 4234:0 4260:0 '),\n+('4234', 'gh502', '571', '394', '394', '72', '76', '0', '3351.7', '-1957.7', '116.26', '3.20042', '4233:0 4235:0 4256:0 '),\n+('4235', 'gh503', '571', '394', '394', '72', '76', '0', '3506.14', '-1975.54', '165.694', '5.76004', '4234:0 4236:0 4255:0 '),\n+('4236', 'gh504', '571', '394', '394', '72', '76', '0', '3654.24', '-2134.59', '147.89', '4.94165', '4235:0 4237:0 4285:0 '),\n+('4237', 'gh505', '571', '394', '394', '72', '76', '0', '3768.13', '-2266.2', '173.421', '6.00979', '4236:0 4238:0 4251:0 4285:0 '),\n+('4238', 'gh506', '571', '394', '394', '72', '76', '0', '3965.13', '-2347.84', '213.634', '6.13467', '4237:0 4239:0 4400:0 '),\n+('4239', 'gh507', '571', '394', '394', '72', '76', '0', '4179.57', '-2348.21', '225.457', '0.204908', '4238:0 4240:0 4389:0 '),\n+('4240', 'gh508', '571', '394', '394', '72', '76', '0', '4360.95', '-2316.79', '201.282', '0.15857', '4239:0 4241:0 4250:0 '),\n+('4241', 'gh509', '571', '394', '394', '72', '76', '0', '4456.7', '-2146.34', '174.126', '1.54558', '4240:0 4242:0 '),\n+('4242', 'gh510', '571', '394', '394', '72', '76', '0', '4445.16', '-1972.91', '158.144', '1.95792', '4241:0 4243:0 '),\n+('4243', 'gh511', '571', '394', '394', '72', '76', '0', '4441.13', '-1782.37', '162.404', '1.80319', '4242:0 4230:0 4244:0 '),\n+('4244', 'gh512', '571', '394', '394', '72', '76', '0', '4395.14', '-1892.04', '161.168', '3.62925', '4243:0 4245:0 '),\n+('4245', 'gh513', '571', '394', '4209', '72', '76', '0', '4294.12', '-1906.66', '197.755', '3.31587', '4244:0 4246:0 4247:0 4248:0 '),\n+('4246', 'gh514', '571', '394', '4209', '72', '76', '0', '4245.43', '-2019.66', '235.391', '1.60371', '4245:0 '),\n+('4247', 'gh515', '571', '394', '4209', '72', '76', '0', '4219.61', '-1824.36', '202.548', '2.41267', '4245:0 '),\n+('4248', 'gh516', '571', '394', '4209', '72', '76', '0', '4141.35', '-1993.19', '212.874', '4.66597', '4245:0 4249:0 '),\n+('4249', 'gh517', '571', '394', '4209', '72', '76', '0', '4200.73', '-2152.09', '218.191', '0.0124693', '4248:0 4250:0 '),\n+('4250', 'gh518', '571', '394', '394', '72', '76', '0', '4337.91', '-2212.2', '191.313', '5.10972', '4249:0 4240:0 '),\n+('4251', 'gh519', '571', '394', '394', '72', '76', '0', '3919.84', '-2211.56', '210.955', '0.375331', '4237:0 4252:0 '),\n+('4252', 'gh520', '571', '394', '394', '72', '76', '0', '3841.19', '-2055.11', '210.168', '1.65396', '4251:0 4253:0 '),\n+('4253', 'gh521', '571', '394', '394', '72', '76', '0', '3817.14', '-1865.71', '214.679', '1.96419', '4252:0 4254:0 '),\n+('4254', 'gh522', '571', '394', '394', '72', '76', '0', '3654.79', '-1866.78', '173.387', '2.8674', '4253:0 4255:0 '),\n+('4255', 'gh523', '571', '394', '394', '72', '76', '0', '3559.72', '-1897.37', '155.876', '3.47686', '4254:0 4235:0 '),\n+('4256', 'gh524', '571', '394', '394', '72', '76', '0', '3387.84', '-2133.26', '124.553', '5.44191', '4234:0 4257:0 '),\n+('4257', 'gh525', '571', '394', '4206', '72', '76', '4', '3345.18', '-2217.45', '119.375', '3.61665', '4256:0 4258:0 '),\n+('4258', 'gh526', '571', '394', '4206', '72', '76', '5', '3256.98', '-2231.76', '116.09', '1.0425', '4257:0 4259:0 '),\n+('4259', 'gh527', '571', '394', '394', '72', '76', '0', '3086.49', '-2267.46', '94.942', '1.73561', '4258:0 4260:0 4268:0 '),\n+('4260', 'gh528', '571', '394', '394', '72', '76', '0', '3084.66', '-2084.36', '87.6685', '1.27615', '4259:0 4233:0 4261:0 '),\n+('4261', 'gh529', '571', '394', '394', '72', '76', '0', '2953.2', '-1963.36', '51.3225', '2.81396', '4260:0 4262:0 '),\n+('4262', 'gh530', '571', '394', '4242', '72', '76', '0', '2828.38', '-1917.21', '9.14124', '2.88465', '4261:0 4263:0 4264:0 '),\n+('4263', 'gh531', '571', '394', '4242', '72', '76', '0', '2698.31', '-2040.99', '3.89624', '0.465604', '4262:0 4267:0 '),\n+('4264', 'gh532', '571', '394', '4242', '72', '76', '0', '2755.77', '-1781.45', '5.41989', '5.167', '4262:0 4265:0 '),\n+('4265', 'gh533', '571', '394', '4242', '72', '76', '0', '2565.61', '-1807.96', '9.92644', '3.51374', '4264:0 4266:0 '),\n+('4266', 'gh534', '571', '394', '4242', '72', '76', '0', '2542.58', '-1990.88', '8.43344', '5.20077', '4265:0 4267:0 '),\n+('4267', 'gh535', '571', '394', '4242', '72', '76', '0', '2617', '-2122.41', '7.0106', '0.525292', '4266:0 4263:0 '),\n+('4268', 'gh536', '571', '394', '394', '72', '76', '0', '3111.6', '-2469.39', '60.839', '4.64079', '4259:0 4269:0 '),\n+('4269', 'gh537', '571', '394', '394', '72', '76', '0', '3050.93', '-2690.26', '65.2339', '4.32742', '4268:0 4270:0 '),\n+('4270', 'gh538', '571', '394', '394', '72', '76', '0', '2996.43', '-2911.54', '99.7541', '3.55929', '4269:0 4271:0 4277:0 '),\n+('4271', 'gh539', '571', '394', '394', '72', '76', '0', '2806.9', '-2891.38', '64.0493', '3.18937', '4270:0 4272:0 '),\n+('4272', 'gh540', '571', '394', '394', '72', '76', '0', '2688.1', '-2877.41', '68.4325', '1.86676', '4273:0 4271:0 3965:0 3956:0 '),\n+('4273', 'gh541', '571', '394', '4207', '72', '76', '0', '2863.15', '-2691.55', '84.6612', '0.692585', '4274:0 4272:0 '),\n+('4274', 'gh542', '571', '394', '4207', '72', '76', '0', '2913.28', '-2523.08', '77.2727', '2.2516', '4273:0 4275:0 '),\n+('4275', 'gh543', '571', '394', '4207', '72', '76', '0', '2759.62', '-2433.25', '39.5256', '4.18681', '4274:0 4276:0 '),\n+('4276', 'gh544', '571', '394', '394', '72', '76', '0', '2655.99', '-2570.44', '12.8707', '0.715349', '4275:0 3966:0 '),\n+('4277', 'gh545', '571', '394', '4240', '72', '76', '0', '3159.97', '-2966.67', '125.976', '5.16462', '4270:0 4278:0 '),\n+('4278', 'gh546', '571', '394', '394', '72', '76', '0', '3229.99', '-3097.97', '155.647', '5.16069', '4277:0 4279:0 4287:0 '),\n+('4279', 'gh547', '571', '394', '394', '72', '76', '0', '3347.86', '-2939.95', '194.535', '0.886556', '4278:0 4280:0 '),\n+('4280', 'gh548', '571', '394', '4204', '72', '76', '3', '3409.22', '-2819.78', '200.664', '5.07272', '4279:0 4281:0 '),\n+('4281', 'gh549', '571', '394', '394', '72', '76', '0', '3563.32', '-2837.92', '196.693', '3.21211', '4280:0 4282:0 '),\n+('4282', 'gh550', '571', '394', '394', '72', '76', '0', '3639.37', '-2888.65', '220.844', '1.05698', '4281:0 4283:0 4286:0 4386:0 '),\n+('4283', 'gh551', '571', '394', '394', '72', '76', '0', '3750.73', '-2701.59', '175.222', '0.808005', '4282:0 4284:0 4402:0 '),\n+('4284', 'gh552', '571', '394', '394', '72', '76', '0', '3701.9', '-2499.94', '160.171', '2.01988', '4283:0 4285:0 '),\n+('4285', 'gh553', '571', '394', '394', '72', '76', '0', '3667.41', '-2329.55', '156.4', '0.83785', '4284:0 4237:0 4236:0 '),\n+('4286', 'gh554', '571', '394', '394', '72', '76', '0', '3567.56', '-3072.84', '238.573', '4.01871', '4282:0 4287:0 4288:0 '),\n+('4287', 'gh555', '571', '394', '394', '72', '76', '0', '3355.89', '-3183.89', '200.874', '2.94663', '4286:0 4278:0 '),\n+('4288', 'gh556', '571', '394', '394', '72', '76', '0', '3543.08', '-3277.22', '242.517', '4.88658', '4286:0 4289:0 '),\n+('4289', 'gh557', '571', '394', '394', '72', '76', '0', '3676.96', '-3469.09', '242.035', '5.54866', '4288:0 4290:0 4383:0 '),\n+('4290', 'gh558', '571', '394', '394', '72', '76', '0', '3696.59', '-3688.31', '209.189', '4.55906', '4289:0 4291:0 '),\n+('4291', 'gh559', '571', '394', '394', '72', '76', '0', '3728.04', '-3862.81', '183.316', '0.164743', '4290:0 4292:0 4294:0 4301:0 '),\n+('4292', 'gh560', '571', '394', '4215', '72', '76', '0', '3590.62', '-3901.08', '196.64', '2.77227', '4291:0 4293:0 '),\n+('4293', 'gh561', '571', '394', '4215', '72', '76', '0', '3525.9', '-3755.42', '228.317', '2.26176', '4292:0 '),\n+('4294', 'gh562', '571', '394', '395', '72', '76', '0', '3841.06', '-3743.21', '175.461', '6.13141', '4291:0 4295:0 '),\n+('4295', 'gh563', '571', '394', '395', '72', '76', '0', '3974.14', '-3774.46', '151.082', '6.17382', '4294:0 4296:0 '),\n+('4296', 'gh564', '571', '394', '395', '72', '76', '0', '4052.02', '-3740.14', '220.288', '4.50485', '4295:0 4297:0 '),\n+('4297', 'gh565', '571', '394', '395', '72', '76', '0', '4135.39', '-3710.81', '180.991', '2.0819', '4296:0 4298:0 '),\n+('4298', 'gh566', '571', '394', '395', '72', '76', '0', '4194.15', '-3814.05', '181.668', '4.59518', '4297:0 4299:0 '),\n+('4299', 'gh567', '571', '394', '395', '72', '76', '0', '4181.7', '-3982.87', '170.498', '4.5402', '4298:0 4300:0 4363:0 '),\n+('4300', 'gh568', '571', '394', '394', '72', '76', '0', '4024.2', '-4043.93', '176.713', '3.04794', '4299:0 4301:0 4363:0 '),\n+('4301', 'gh569', '571', '394', '394', '72', '76', '0', '3787.44', '-3987.74', '181.678', '2.65995', '4300:0 4291:0 4302:0 '),\n+('4302', 'gh570', '571', '394', '394', '72', '76', '0', '3718.3', '-4188.38', '192.248', '4.50249', '4301:0 4303:0 4310:0 '),\n+('4303', 'gh571', '571', '394', '394', '72', '76', '0', '3545.36', '-4300.26', '227.855', '3.59221', '4302:0 4304:0 '),\n+('4304', 'gh572', '571', '394', '394', '72', '76', '0', '3375.07', '-4408.72', '245.826', '4.29907', '4303:0 4305:0 4307:0 '),\n+('4305', 'gh573', '571', '394', '4480', '72', '76', '0', '3261.77', '-4590.54', '305.739', '3.95742', '4304:0 4306:0 '),\n+('4306', 'gh574', '571', '394', '4480', '72', '76', '0', '3089.14', '-4641.2', '316.308', '3.35188', '4305:0 3999:0 '),\n+('4307', 'gh575', '571', '394', '4218', '72', '76', '0', '3502.07', '-4548.51', '221.433', '3.38171', '4304:0 4308:0 '),\n+('4308', 'gh576', '571', '394', '394', '72', '76', '0', '3656.98', '-4455.52', '184.363', '5.84315', '4307:0 4309:0 '),\n+('4309', 'gh577', '571', '394', '394', '72', '76', '0', '3731.98', '-4511.53', '193.763', '0.757702', '4308:0 4310:0 '),\n+('4310', 'gh578', '571', '394', '394', '72', '76', '5', '3851.11', '-4369.54', '192.918', '1.37424', '4309:0 4302:0 4311:0 '),\n+('4311', 'gh579', '571', '394', '4205', '72', '76', '0', '3939.37', '-4409.34', '238.255', '4.98392', '4310:0 4312:0 '),\n+('4312', 'gh580', '571', '394', '4205', '72', '76', '0', '4062.37', '-4401.54', '260.429', '0.235388', '4311:0 4313:0 4362:0 4364:0 '),\n+('4313', 'gh581', '571', '394', '394', '72', '76', '0', '4171.31', '-4502.24', '219.959', '1.1284', '4312:0 4314:0 '),\n+('4314', 'gh582', '571', '394', '4205', '72', '76', '0', '4003.62', '-4566.46', '195.348', '3.13431', '4313:0 4315:0 '),\n+('4315', 'gh583', '571', '394', '394', '72', '76', '0', '4008.13', '-4692.66', '141.153', '5.45436', '4314:0 4316:0 '),\n+('4316', 'gh584', '571', '394', '4231', '72', '76', '0', '4082.28', '-4754.21', '96.3716', '4.76714', '4315:0 4317:0 '),\n+('4317', 'gh585', '571', '394', '4249', '72', '76', '0', '4193.08', '-4880.87', '42.4572', '3.89614', '4316:0 4318:0 4328:0 4336:0 '),\n+('4318', 'gh586', '571', '394', '4249', '72', '76', '0', '4317.27', '-4702.62', '75.8335', '0.62967', '4317:0 4319:0 '),\n+('4319', 'gh587', '571', '394', '4249', '72', '76', '0', '4444.07', '-4566.46', '104.898', '1.65462', '4318:0 4320:0 '),\n+('4320', 'gh588', '571', '394', '4249', '72', '76', '0', '4428.45', '-4387.5', '151.381', '1.08913', '4319:0 4321:0 '),\n+('4321', 'gh589', '571', '394', '4159', '72', '76', '0', '4438.72', '-4286.42', '161.56', '6.09212', '4320:0 4322:0 4374:0 '),\n+('4322', 'gh590', '571', '394', '4249', '72', '76', '0', '4621.51', '-4357.67', '181.183', '5.95781', '4321:0 4323:0 '),\n+('4323', 'gh591', '571', '394', '4221', '72', '76', '0', '4732.05', '-4454.6', '194.355', '5.45673', '4322:0 4324:0 '),\n+('4324', 'gh592', '571', '394', '4221', '72', '76', '0', '4820.92', '-4522.91', '200.404', '5.83294', '4323:0 4325:0 '),\n+('4325', 'gh593', '571', '394', '4221', '72', '76', '0', '4909.98', '-4586.39', '219.616', '4.43492', '4324:0 4326:0 '),\n+('4326', 'gh594', '571', '394', '4221', '72', '76', '0', '4984.98', '-4692.79', '219.491', '5.1245', '4325:0 4327:0 '),\n+('4327', 'gh595', '571', '394', '4221', '72', '76', '0', '5041.25', '-4817', '219.501', '2.53662', '4326:0 '),\n+('4328', 'gh596', '571', '394', '4212', '72', '76', '0', '4339.89', '-4870.51', '34.7802', '0.17335', '4317:0 4329:0 '),\n+('4329', 'gh597', '571', '394', '4216', '72', '76', '0', '4474.49', '-4921.22', '14.201', '5.96566', '4328:0 4330:0 4331:0 '),\n+('4330', 'gh598', '571', '394', '4212', '72', '76', '0', '4518.04', '-5017.36', '3.25924', '5.12764', '4329:0 '),\n+('4331', 'gh599', '571', '394', '4216', '72', '76', '0', '4569.4', '-4865.21', '47.9919', '0.149002', '4329:0 4332:0 4333:0 4334:0 '),\n+('4332', 'gh600', '571', '394', '4216', '72', '76', '0', '4707.48', '-4794.55', '47.992', '5.06167', '4331:0 4333:0 '),\n+('4333', 'gh601', '571', '394', '4216', '72', '76', '0', '4708.25', '-4910.12', '47.9928', '1.36166', '4331:0 4332:0 '),\n+('4334', 'gh602', '571', '394', '4216', '72', '76', '0', '4744.53', '-4859.91', '26.2962', '0.387759', '4331:0 4335:0 '),\n+('4335', 'gh603', '571', '394', '4216', '72', '76', '0', '4816.99', '-4789.4', '25.4718', '0.872349', '4334:0 '),\n+('4336', 'gh604', '571', '394', '4249', '72', '76', '0', '4022.33', '-4997.21', '41.214', '3.78223', '4317:0 4337:0 4345:0 '),\n+('4337', 'gh605', '571', '394', '4249', '72', '76', '0', '3816.35', '-5011.96', '106.526', '3.31727', '4336:0 4338:0 4346:0 '),\n+('4338', 'gh606', '571', '394', '4220', '72', '76', '0', '3646.81', '-5000.53', '175.852', '4.1867', '4337:0 4339:0 '),\n+('4339', 'gh607', '571', '394', '4220', '72', '76', '0', '3524.22', '-5120.65', '233.744', '2.61591', '4338:0 4340:0 4343:0 '),\n+('4340', 'gh608', '571', '394', '4220', '72', '76', '0', '3419.01', '-4995.77', '285.739', '2.5845', '4339:0 4341:0 '),\n+('4341', 'gh609', '571', '394', '4220', '72', '76', '0', '3356.74', '-5082.19', '325.289', '3.94009', '4340:0 4342:0 '),\n+('4342', 'gh610', '571', '394', '4220', '72', '76', '0', '3310.99', '-5122.5', '340.978', '1.36004', '4341:0 '),\n+('4343', 'gh611', '571', '394', '4220', '72', '76', '0', '3433.34', '-5250.17', '269.339', '1.01289', '4339:0 4344:0 '),\n+('4344', 'gh612', '571', '394', '4220', '72', '76', '0', '3407.12', '-5388.15', '267.856', '1.78573', '4343:0 '),\n+('4345', 'gh613', '571', '394', '4212', '72', '76', '0', '4006.9', '-5232.47', '7.75033', '1.18098', '4336:0 4356:0 '),\n+('4346', 'gh614', '571', '394', '394', '72', '76', '0', '3757.96', '-5153.08', '119.324', '4.14823', '4337:0 4347:0 '),\n+('4347', 'gh615', '571', '394', '394', '72', '76', '0', '3598.76', '-5357.93', '139.869', '4.05555', '4346:0 4348:0 '),\n+('4348', 'gh616', '571', '394', '4213', '72', '76', '0', '3443.06', '-5490.97', '198.431', '3.26623', '4347:0 4349:0 '),\n+('4349', 'gh617', '571', '394', '4213', '72', '76', '0', '3274.45', '-5572.3', '213.641', '3.71783', '4348:0 4350:0 '),\n+('4350', 'gh618', '571', '394', '4213', '72', '76', '0', '3100.03', '-5709.35', '220.326', '3.74532', '4349:0 4355:0 '),\n+('4351', 'hf619', '571', '495', '4061', '68', '73', '0', '2323.35', '-5813.06', '251.394', '3.16805', '4014:0 4015:0 4352:0 '),\n+('4352', 'hf620', '571', '495', '495', '68', '73', '0', '2519.29', '-5851.8', '276.256', '4.73492', '4351:0 4353:0 '),\n+('4353', 'hf621', '571', '495', '495', '68', '73', '0', '2703.09', '-5953.52', '271.511', '6.11722', '4352:0 4354:0 '),\n+('4354', 'hf622', '571', '495', '4252', '68', '73', '0', '2849.67', '-5840.96', '273.44', '0.629637', '4353:0 4355:0 '),\n+('4355', 'hf623', '571', '495', '4252', '68', '73', '0', '3003.04', '-5779.08', '254.433', '0.523608', '4354:0 4350:0 '),\n+('4356', 'gh624', '571', '394', '4212', '72', '76', '0', '4153.59', '-5224.2', '7.42476', '6.08423', '4345:0 4357:0 '),\n+('4357', 'gh625', '571', '394', '4212', '72', '76', '0', '4327.94', '-5342.7', '4.49671', '5.82112', '4356:0 4358:0 '),\n+('4358', 'gh626', '571', '394', '4244', '72', '76', '0', '4543.08', '-5485.22', '2.18391', '5.50775', '4357:0 4359:0 '),\n+('4359', 'gh627', '571', '394', '4244', '72', '76', '0', '4695.42', '-5635.74', '77.5219', '4.55742', '4358:0 4360:0 '),\n+('4360', 'gh628', '571', '394', '4245', '72', '76', '0', '4616.66', '-5660.81', '114.593', '4.22877', '4359:0 4361:0 '),\n+('4361', 'gh629', '571', '394', '4245', '72', '76', '0', '4593.57', '-5707.41', '184.506', '1.02041', '4360:0 '),\n+('4362', 'gh630', '571', '394', '394', '72', '76', '0', '4113.47', '-4233.27', '243.732', '1.89258', '4312:0 4363:0 '),\n+('4363', 'gh631', '571', '394', '394', '72', '76', '1', '4125.58', '-4095.14', '182.823', '2.77224', '4362:0 4300:0 4299:0 '),\n+('4364', 'gh632', '571', '394', '394', '72', '76', '0', '4172.63', '-4310.2', '238.733', '2.85314', '4312:0 4365:0 '),\n+('4365', 'gh633', '571', '394', '394', '72', '76', '0', '4326.78', '-4119.6', '193.825', '0.547988', '4364:0 4366:0 '),\n+('4366', 'gh634', '571', '394', '394', '72', '76', '0', '4486.09', '-3977.4', '186.997', '5.61774', '4365:0 4367:0 4376:0 '),\n+('4367', 'gh635', '571', '394', '394', '72', '76', '0', '4625.2', '-4092.13', '199.11', '2.30728', '4366:0 4368:0 '),\n+('4368', 'gh636', '571', '394', '394', '72', '76', '0', '4734.83', '-4181.86', '231.297', '2.31358', '4367:0 4369:0 '),\n+('4369', 'gh637', '571', '394', '394', '72', '76', '0', '4906.69', '-4306.46', '257.585', '0.692519', '4368:0 4370:0 4403:0 '),\n+('4370', 'gh638', '571', '394', '4214', '72', '76', '0', '5016.3', '-4437.54', '278.117', '5.31851', '4369:0 4371:0 '),\n+('4371', 'gh639', '571', '394', '4214', '72', '76', '0', '5101.89', '-4569.13', '283.736', '5.11902', '4370:0 4372:0 '),\n+('4372', 'gh640', '571', '394', '4214', '72', '76', '0', '5193.65', '-4729.96', '293.156', '5.98138', '4371:0 4373:0 '),\n+('4373', 'gh641', '571', '394', '4214', '72', '76', '0', '5380.16', '-4761.41', '305.589', '6.26491', '4372:0 '),\n+('4374', 'gh642', '571', '394', '4159', '72', '76', '2', '4508.01', '-4224.81', '167.488', '4.05322', '4321:0 4375:0 '),\n+('4375', 'gh643', '571', '394', '4159', '72', '76', '3', '4593.24', '-4223.94', '178.654', '3.05419', '4374:0 '),\n+('4376', 'gh644', '571', '394', '394', '72', '76', '0', '4397.58', '-3823.41', '207.663', '1.98605', '4366:0 4377:0 '),\n+('4377', 'gh645', '571', '394', '4235', '72', '76', '0', '4363.62', '-3661.89', '253.292', '1.03572', '4376:0 4378:0 4380:0 '),\n+('4378', 'gh646', '571', '394', '4270', '72', '76', '0', '4464.25', '-3523.69', '231.349', '0.662651', '4377:0 4379:0 '),\n+('4379', 'gh647', '571', '394', '4270', '72', '76', '0', '4540.35', '-3448.14', '226.932', '0.666578', '4378:0 4404:0 '),\n+('4380', 'gh648', '571', '394', '394', '72', '76', '0', '4254.62', '-3537.34', '262.169', '3.11545', '4377:0 4381:0 '),\n+('4381', 'gh649', '571', '394', '394', '72', '76', '0', '4082.82', '-3452.53', '279.273', '2.96073', '4380:0 4382:0 '),\n+('4382', 'gh650', '571', '394', '4267', '72', '76', '0', '4017.93', '-3398.46', '291.406', '1.89652', '4381:0 4383:0 4384:0 '),\n+('4383', 'gh651', '571', '394', '394', '72', '76', '0', '3805.22', '-3452.83', '276.397', '3.26311', '4382:0 4289:0 '),\n+('4384', 'gh652', '571', '394', '394', '72', '76', '0', '3927.34', '-3218.24', '296.696', '2.32848', '4382:0 4385:0 4392:0 '),\n+('4385', 'gh653', '571', '394', '394', '72', '76', '0', '3809.69', '-3057.95', '274.256', '2.59945', '4384:0 4386:0 4399:0 '),\n+('4386', 'gh654', '571', '394', '394', '72', '76', '0', '3727.35', '-2986.21', '236.602', '2.62301', '4385:0 4282:0 4387:0 '),\n+('4387', 'gh655', '571', '394', '4203', '72', '76', '0', '3799.13', '-2875.46', '222.297', '0.855862', '4386:0 4388:0 '),\n+('4388', 'gh656', '571', '394', '394', '72', '76', '0', '3912.6', '-2792.74', '176.353', '3.96212', '4387:0 '),\n+('4389', 'gh657', '571', '394', '4199', '72', '76', '0', '4204.22', '-2467.24', '229.848', '5.58004', '4239:0 4390:0 4391:0 '),\n+('4390', 'gh658', '571', '394', '4199', '72', '76', '1', '4355.92', '-2485.04', '242.225', '3.56707', '4389:0 4391:0 '),\n+('4391', 'gh659', '571', '394', '4199', '72', '76', '0', '4320.51', '-2585.42', '246.459', '1.97429', '4390:0 4389:0 '),\n+('4392', 'gh660', '571', '394', '4222', '72', '76', '0', '4055.91', '-3147.98', '278.056', '5.70496', '4384:0 4393:0 '),\n+('4393', 'gh661', '571', '394', '4222', '72', '76', '0', '4250.54', '-3177.85', '307.936', '0.898319', '4392:0 4394:0 '),\n+('4394', 'gh662', '571', '394', '4222', '72', '76', '0', '4326.86', '-3320.66', '310.551', '0.546446', '4393:0 4395:0 '),\n+('4395', 'gh663', '571', '394', '4222', '72', '76', '0', '4447.75', '-3199.73', '313.463', '2.16044', '4394:0 4396:0 '),\n+('4396', 'gh664', '571', '394', '4222', '72', '76', '0', '4418.84', '-2984.71', '309.349', '1.76303', '4395:0 4397:0 '),\n+('4397', 'gh665', '571', '394', '4222', '72', '76', '0', '4226.67', '-2862.19', '281.474', '3.5718', '4396:0 4398:0 '),\n+('4398', 'gh666', '571', '394', '4222', '72', '76', '0', '4035.13', '-2946.41', '276.096', '3.8946', '4397:0 4399:0 '),\n+('4399', 'gh667', '571', '394', '4222', '72', '76', '0', '3928.19', '-3008.94', '275.401', '3.52703', '4398:0 4385:0 '),\n+('4400', 'gh668', '571', '394', '394', '72', '76', '0', '3974.25', '-2486.57', '216.336', '4.66038', '4238:0 4401:0 '),\n+('4401', 'gh669', '571', '394', '4202', '72', '76', '0', '3933.08', '-2603.19', '206.74', '5.22586', '4400:0 4402:0 '),\n+('4402', 'gh670', '571', '394', '394', '72', '76', '0', '3783', '-2602.59', '191.183', '4.81351', '4401:0 4283:0 '),\n+('4403', 'zd671', '571', '66', '66', '73', '77', '0', '5075.22', '-4157.1', '351.671', '0.704319', '4369:0 4530:0 4531:0 '),\n+('4404', 'zd672', '571', '66', '66', '73', '77', '0', '4642.75', '-3362.88', '292.419', '0.845695', '4379:0 4470:0 '),\n+('4405', 'zd673', '571', '66', '66', '73', '77', '0', '4845.51', '-1504.94', '248.946', '5.30284', '4149:0 4406:0 '),\n+('4406', 'zd674', '571', '66', '66', '73', '77', '0', '4915.37', '-1688.61', '248.309', '4.74834', '4405:0 4407:0 '),\n+('4407', 'zd675', '571', '66', '66', '73', '77', '0', '4913.71', '-1902.76', '248.309', '4.71615', '4406:0 4408:0 4410:0 '),\n+('4408', 'zd676', '571', '66', '66', '73', '77', '0', '4907.24', '-2149.46', '248.308', '4.51509', '4407:0 4409:0 4410:0 '),\n+('4409', 'zd677', '571', '66', '4316', '73', '77', '0', '4935.58', '-2282.22', '243.077', '5.02638', '4408:0 4446:0 '),\n+('4410', 'zd678', '571', '66', '66', '73', '77', '0', '4948.85', '-2047.71', '248.309', '0.0634512', '4408:0 4407:0 4411:0 '),\n+('4411', 'zd679', '571', '66', '66', '73', '77', '0', '5154.72', '-2050.3', '248.297', '1.1198', '4410:0 4412:0 4442:0 4443:0 '),\n+('4412', 'zd680', '571', '66', '66', '73', '77', '0', '5198.14', '-1908', '243.765', '1.97824', '4411:0 4413:0 '),\n+('4413', 'zd681', '571', '66', '4311', '73', '77', '0', '5168.01', '-1763.65', '243.57', '1.69157', '4412:0 4414:0 '),\n+('4414', 'zd682', '571', '66', '4311', '73', '77', '0', '5227.64', '-1629.23', '235.86', '1.70729', '4413:0 4415:0 '),\n+('4415', 'zd683', '571', '66', '66', '73', '77', '0', '5202.17', '-1444.6', '235.3', '1.67195', '4414:0 4416:0 4417:0 '),\n+('4416', 'zd684', '571', '66', '4312', '73', '77', '1', '5228.85', '-1333.15', '242.312', '5.2078', '4415:0 4417:0 '),\n+('4417', 'zd685', '571', '66', '66', '73', '77', '0', '5369.86', '-1421.32', '236.955', '3.0236', '4416:0 4415:0 4418:0 '),\n+('4418', 'zd686', '571', '66', '66', '73', '77', '0', '5446.59', '-1338.52', '239.221', '4.34385', '4417:0 4419:0 4420:0 4440:0 '),\n+('4419', 'zd687', '571', '66', '66', '73', '77', '0', '5443.61', '-1214.88', '247.443', '1.55882', '4418:0 4561:0 '),\n+('4420', 'zd688', '571', '66', '4313', '73', '77', '0', '5555.66', '-1397.11', '239.86', '2.99374', '4418:0 4421:0 '),\n+('4421', 'zd689', '571', '66', '4313', '73', '77', '0', '5695.79', '-1400.51', '234.446', '5.54941', '4420:0 4422:0 4435:0 '),\n+('4422', 'zd690', '571', '66', '4313', '73', '77', '0', '5775.25', '-1545.64', '229.906', '6.10312', '4421:0 4423:0 4435:0 '),\n+('4423', 'zd691', '571', '66', '4469', '73', '77', '0', '5886.45', '-1638.86', '237.734', '5.61617', '4422:0 4424:0 4436:0 '),\n+('4424', 'zd692', '571', '66', '4469', '73', '77', '0', '5972.87', '-1716.32', '231.167', '5.38055', '4423:0 4425:0 '),\n+('4425', 'zd693', '571', '66', '4469', '73', '77', '0', '6050.18', '-1854.06', '239.866', '4.90932', '4424:0 4426:0 '),\n+('4426', 'zd694', '571', '66', '4315', '73', '77', '0', '6083.8', '-1956.71', '235.309', '5.74812', '4425:0 4427:0 4429:0 '),\n+('4427', 'zd695', '571', '66', '4315', '73', '77', '0', '6239.25', '-1977.17', '235.732', '4.86297', '4426:0 4428:0 '),\n+('4428', 'zd696', '571', '66', '4315', '73', '77', '0', '6209.7', '-2182.71', '236.212', '3.31259', '4427:0 4429:0 '),\n+('4429', 'zd697', '571', '66', '4315', '73', '77', '0', '6062.56', '-2208.12', '234.275', '1.69703', '4428:0 4426:0 4430:0 '),\n+('4430', 'zd698', '571', '66', '4315', '73', '77', '0', '5846.96', '-2232.9', '236.499', '3.12253', '4429:0 4431:0 '),\n+('4431', 'zd699', '571', '66', '4468', '73', '77', '0', '5680.87', '-2213.84', '239.83', '3.10525', '4430:0 4432:0 4437:0 '),\n+('4432', 'zd700', '571', '66', '4468', '73', '77', '0', '5565.53', '-2198.52', '235.496', '1.86432', '4431:0 4433:0 '),\n+('4433', 'zd701', '571', '66', '4468', '73', '77', '0', '5571.97', '-1996.67', '237.88', '1.26977', '4432:0 4434:0 4437:0 4438:0 '),\n+('4434', 'zd702', '571', '66', '4468', '73', '77', '0', '5653.64', '-1810.94', '236.435', '1.32868', '4433:0 4435:0 4436:0 '),\n+('4435', 'zd703', '571', '66', '4313', '73', '77', '0', '5609.8', '-1610.43', '237.022', '0.732563', '4434:0 4422:0 4421:0 '),\n+('4436', 'zd704', '571', '66', '4468', '73', '77', '0', '5833.14', '-1759.05', '233.346', '1.1936', '4434:0 4423:0 4437:0 '),\n+('4437', 'zd705', '571', '66', '4468', '73', '77', '0', '5766.32', '-1991.79', '235.993', '4.71376', '4436:0 4431:0 4433:0 '),\n+('4438', 'zd706', '571', '66', '66', '73', '77', '0', '5444.04', '-1955.64', '248.222', '4.72161', '4433:0 4439:0 4441:0 4442:0 '),\n+('4439', 'zd707', '571', '66', '66', '73', '77', '0', '5446.88', '-1747.93', '248.337', '1.71275', '4438:0 4440:0 '),\n+('4440', 'zd708', '571', '66', '66', '73', '77', '0', '5445.34', '-1527.93', '248.26', '1.56823', '4439:0 4418:0 '),\n+('4441', 'zd709', '571', '66', '66', '73', '77', '0', '5449.03', '-2186.49', '248.309', '4.69804', '4438:0 4447:0 '),\n+('4442', 'zd710', '571', '66', '66', '73', '77', '0', '5286.44', '-2043.61', '246.138', '3.10918', '4438:0 4411:0 '),\n+('4443', 'zd711', '571', '66', '4317', '73', '77', '1', '5168.98', '-2192.3', '236.538', '5.78582', '4411:0 4444:0 '),\n+('4444', 'zd712', '571', '66', '66', '73', '77', '0', '5057.15', '-2200.22', '244.382', '3.79877', '4443:0 4445:0 '),\n+('4445', 'zd713', '571', '66', '66', '73', '77', '0', '5039.31', '-2353.08', '242.172', '3.30084', '4444:0 4446:0 '),\n+('4446', 'zd714', '571', '66', '4316', '73', '77', '0', '4870.93', '-2382.92', '234.006', '2.40312', '4445:0 4409:0 '),\n+('4447', 'zd715', '571', '66', '4275', '73', '77', '0', '5451.23', '-2302.91', '297.236', '1.61772', '4441:0 4448:0 4449:0 4476:0 '),\n+('4448', 'zd716', '571', '66', '4275', '73', '77', '0', '5448.61', '-2517.18', '292.419', '4.61951', '4447:0 4449:0 4465:0 4476:0 '),\n+('4449', 'zd717', '571', '66', '4275', '73', '77', '0', '5555.82', '-2440.17', '290.942', '2.83587', '4448:0 4447:0 4450:0 4476:0 '),\n+('4450', 'zd718', '571', '66', '4318', '73', '77', '0', '5688.46', '-2430.58', '287.55', '3.11862', '4449:0 4451:0 '),\n+('4451', 'zd719', '571', '66', '4294', '73', '77', '0', '5806.54', '-2342.64', '290.484', '5.7662', '4450:0 4452:0 '),\n+('4452', 'zd720', '571', '66', '4294', '73', '77', '0', '5929.41', '-2434.64', '292.384', '5.92563', '4451:0 4453:0 '),\n+('4453', 'zd721', '571', '66', '4294', '73', '77', '0', '6095.28', '-2375.23', '290.191', '0.345376', '4452:0 4454:0 '),\n+('4454', 'zd722', '571', '66', '4276', '73', '77', '0', '6180.98', '-2386.29', '307.72', '4.9046', '4453:0 4455:0 '),\n+('4455', 'zd723', '571', '66', '4276', '73', '77', '0', '6189.69', '-2520.06', '304.709', '4.73102', '4454:0 4456:0 4461:0 '),\n+('4456', 'zd724', '571', '66', '4276', '73', '77', '0', '6265.08', '-2506.2', '302.978', '4.68313', '4455:0 4457:0 '),\n+('4457', 'zd725', '571', '66', '4276', '73', '77', '0', '6245.94', '-2735.34', '302.749', '3.45398', '4456:0 4458:0 4459:0 '),\n+('4458', 'zd726', '571', '66', '4276', '73', '77', '0', '6057.61', '-2737.89', '302.8', '1.51562', '4457:0 4460:0 '),\n+('4459', 'zd727', '571', '66', '66', '73', '77', '0', '6297.01', '-2862.98', '293.934', '2.17613', '4457:0 '),\n+('4460', 'zd728', '571', '66', '66', '73', '77', '0', '6048.63', '-2898.7', '296.891', '3.34009', '4458:0 '),\n+('4461', 'zd729', '571', '66', '4276', '73', '77', '0', '6198.47', '-2622.9', '293.162', '1.74809', '4455:0 4462:0 '),\n+('4462', 'zd730', '571', '66', '4276', '73', '77', '0', '6057.09', '-2616.09', '302.748', '3.26077', '4461:0 4463:0 '),\n+('4463', 'zd731', '571', '66', '66', '73', '77', '0', '5884.73', '-2617.57', '292.418', '3.15396', '4462:0 4464:0 '),\n+('4464', 'zd732', '571', '66', '66', '73', '77', '0', '5672.49', '-2619.11', '292.418', '3.13825', '4463:0 4465:0 4477:0 '),\n+('4465', 'zd733', '571', '66', '4275', '73', '77', '1', '5457.16', '-2620.72', '306.551', '1.83449', '4464:0 4448:0 4466:0 '),\n+('4466', 'zd734', '571', '66', '66', '73', '77', '0', '5332.55', '-2708.7', '292.419', '3.89224', '4465:0 4467:0 4474:0 '),\n+('4467', 'zd735', '571', '66', '66', '73', '77', '0', '5189.96', '-2843.82', '292.419', '5.47639', '4466:0 4468:0 4471:0 4473:0 4474:0 '),\n+('4468', 'zd736', '571', '66', '66', '73', '77', '0', '5035.14', '-2975.52', '292.29', '3.86318', '4467:0 4469:0 4473:0 4483:0 '),\n+('4469', 'zd737', '571', '66', '66', '73', '77', '0', '4891.99', '-3121.16', '292.419', '3.92601', '4468:0 4470:0 4486:0 '),\n+('4470', 'zd738', '571', '66', '66', '73', '77', '0', '4770.68', '-3237.29', '292.419', '3.91659', '4469:0 4404:0 4487:0 '),\n+('4471', 'zd739', '571', '66', '66', '73', '77', '0', '5358.22', '-3018.37', '292.42', '5.50546', '4467:0 4472:0 4483:0 '),\n+('4472', 'zd740', '571', '66', '66', '73', '77', '0', '5504.36', '-3161.64', '327.623', '5.5251', '4471:0 4482:0 4491:0 '),\n+('4473', 'zd741', '571', '66', '4278', '73', '77', '0', '4997.42', '-2791.64', '287.647', '5.40334', '4468:0 4467:0 4474:0 '),\n+('4474', 'zd742', '571', '66', '4278', '73', '77', '0', '5158.28', '-2673.27', '288.27', '0.638333', '4473:0 4466:0 4467:0 4475:0 '),\n+('4475', 'zd743', '571', '66', '66', '73', '77', '0', '5256.37', '-2555.92', '288.451', '1.56824', '4474:0 4476:0 '),\n+('4476', 'zd744', '571', '66', '4275', '73', '77', '0', '5338.16', '-2432.94', '289.035', '0.00530624', '4475:0 4448:0 4447:0 4449:0 '),\n+('4477', 'zd745', '571', '66', '4280', '73', '77', '0', '5779.01', '-2690.72', '276.583', '2.21778', '4464:0 4478:0 '),\n+('4478', 'zd746', '571', '66', '4320', '73', '77', '0', '5721.5', '-2843.26', '274.479', '3.99436', '4477:0 4479:0 4481:0 '),\n+('4479', 'zd747', '571', '66', '4320', '73', '77', '1', '5795.09', '-3017.85', '286.307', '5.12926', '4478:0 4480:0 '),\n+('4480', 'zd748', '571', '66', '4320', '73', '77', '0', '5829.57', '-3089.62', '343.078', '5.24393', '4479:0 4496:0 '),\n+('4481', 'zd749', '571', '66', '4280', '73', '77', '0', '5611.83', '-2947.53', '274.379', '3.44223', '4478:0 4482:0 '),\n+('4482', 'zd750', '571', '66', '4280', '73', '77', '0', '5467.65', '-3021.98', '288.17', '4.29281', '4481:0 4472:0 '),\n+('4483', 'zd751', '571', '66', '4279', '73', '77', '0', '5183.53', '-3158.14', '271.373', '0.983891', '4471:0 4468:0 4484:0 '),\n+('4484', 'zd752', '571', '66', '4279', '73', '77', '0', '5277.96', '-3280.48', '281.073', '4.24508', '4483:0 4485:0 '),\n+('4485', 'zd753', '571', '66', '4279', '73', '77', '0', '5170.84', '-3397.25', '289.096', '2.18261', '4484:0 4486:0 4488:0 '),\n+('4486', 'zd754', '571', '66', '4279', '73', '77', '0', '5037.17', '-3252.81', '278.555', '2.42609', '4485:0 4469:0 '),\n+('4487', 'zd755', '571', '66', '4299', '73', '77', '0', '4868.35', '-3381.36', '292.891', '5.68473', '4470:0 4488:0 '),\n+('4488', 'zd756', '571', '66', '4299', '73', '77', '0', '5062.51', '-3481.16', '289.586', '4.38568', '4487:0 4485:0 4489:0 '),\n+('4489', 'zd757', '571', '66', '4299', '73', '77', '0', '5037.37', '-3645.39', '298.622', '4.61344', '4488:0 4490:0 '),\n+('4490', 'zd758', '571', '66', '4299', '73', '77', '0', '5087.62', '-3673.69', '368.159', '1.40275', '4489:0 '),\n+('4491', 'zd759', '571', '66', '66', '73', '77', '0', '5653.1', '-3291.77', '372.841', '5.39966', '4472:0 4492:0 4496:0 4527:0 '),\n+('4492', 'zd760', '571', '66', '4323', '73', '77', '0', '5760.12', '-3480.35', '382.038', '4.42027', '4491:0 4493:0 4496:0 4527:0 '),\n+('4493', 'zd761', '571', '66', '4323', '73', '77', '1', '5763.21', '-3592.34', '386.495', '5.18723', '4492:0 4494:0 '),\n+('4494', 'zd762', '571', '66', '66', '73', '77', '0', '5805.54', '-3730.07', '371.987', '2.07548', '4493:0 4495:0 4512:0 4522:0 '),\n+('4495', 'zd763', '571', '66', '66', '73', '77', '0', '5926.35', '-3596.12', '371.987', '2.21685', '4494:0 4496:0 4513:0 '),\n+('4496', 'zd764', '571', '66', '66', '73', '77', '0', '5852.16', '-3456.19', '373.499', '0.462273', '4491:0 4495:0 4492:0 4497:0 4480:0 '),\n+('4497', 'zd765', '571', '66', '4327', '73', '77', '0', '6015.43', '-3354.83', '351.334', '0.898171', '4496:0 4498:0 4500:0 '),\n+('4498', 'zd766', '571', '66', '4327', '73', '77', '0', '6064.66', '-3220.41', '351.084', '5.24378', '4497:0 4499:0 '),\n+('4499', 'zd767', '571', '66', '4327', '73', '77', '0', '6170.15', '-3269.78', '354.099', '4.83851', '4498:0 4500:0 4504:0 '),\n+('4500', 'zd768', '571', '66', '4327', '73', '77', '0', '6123.58', '-3376.38', '350.427', '3.6502', '4499:0 4497:0 4501:0 '),\n+('4501', 'zd769', '571', '66', '4328', '73', '77', '0', '6121.57', '-3498.34', '384.702', '6.11321', '4500:0 4503:0 4502:0 '),\n+('4502', 'zd770', '571', '66', '4328', '73', '77', '0', '6262.56', '-3570.42', '383.729', '4.01857', '4501:0 4503:0 4510:0 '),\n+('4503', 'zd771', '571', '66', '4328', '73', '77', '0', '6183.8', '-3653.66', '384.553', '1.57362', '4501:0 4502:0 4513:0 '),\n+('4504', 'zd772', '571', '66', '4321', '73', '77', '0', '6322.87', '-3285.06', '388.539', '6.26715', '4499:0 4505:0 4509:0 4510:0 '),\n+('4505', 'zd773', '571', '66', '4321', '73', '77', '0', '6411.23', '-3132.08', '389.357', '0.676679', '4504:0 4506:0 '),\n+('4506', 'zd774', '571', '66', '4321', '73', '77', '0', '6573.73', '-3100.58', '392.875', '3.25828', '4505:0 4507:0 '),\n+('4507', 'zd775', '571', '66', '4321', '73', '77', '0', '6591.66', '-3194.21', '412.812', '2.18937', '4506:0 4508:0 '),\n+('4508', 'zd776', '571', '66', '4321', '73', '77', '0', '6440.64', '-3192.66', '402.475', '4.61546', '4507:0 4509:0 '),\n+('4509', 'zd777', '571', '66', '4321', '73', '77', '0', '6464.24', '-3278.19', '402.912', '0.40965', '4508:0 4504:0 '),\n+('4510', 'zd778', '571', '66', '4321', '73', '77', '0', '6447.03', '-3450.35', '388.772', '5.0215', '4504:0 4511:0 4502:0 '),\n+('4511', 'zd779', '571', '66', '66', '73', '77', '0', '6351.61', '-3625.18', '379.474', '1.56496', '4510:0 '),\n+('4512', 'zd780', '571', '66', '4326', '73', '77', '0', '5890.65', '-3784.26', '361.962', '2.65353', '4494:0 4513:0 4514:0 '),\n+('4513', 'zd781', '571', '66', '66', '73', '77', '0', '6002.17', '-3684.49', '371.988', '2.91507', '4512:0 4495:0 4503:0 4535:0 '),\n+('4514', 'zd782', '571', '66', '66', '73', '77', '0', '5871.01', '-3998.48', '364.264', '5.0278', '4512:0 4515:0 '),\n+('4515', 'zd783', '571', '66', '4371', '73', '77', '0', '5936.71', '-4166.52', '353.36', '6.12894', '4514:0 4516:0 4518:0 4519:0 '),\n+('4516', 'zd784', '571', '66', '4371', '73', '77', '0', '6121.47', '-4241.02', '320.493', '2.98578', '4515:0 4517:0 '),\n+('4517', 'zd785', '571', '66', '4371', '73', '77', '0', '6077.47', '-4432.62', '362.867', '1.61132', '4516:0 4518:0 '),\n+('4518', 'zd786', '571', '66', '4371', '73', '77', '0', '5913.09', '-4334', '361.983', '1.57991', '4515:0 4517:0 '),\n+('4519', 'zd787', '571', '66', '4325', '73', '77', '0', '5789.33', '-4263.74', '371.348', '4.26205', '4515:0 4520:0 '),\n+('4520', 'zd788', '571', '66', '4325', '73', '77', '0', '5716.79', '-4325.83', '373.993', '4.5605', '4519:0 4521:0 4534:0 '),\n+('4521', 'zd789', '571', '66', '4325', '73', '77', '0', '5716.89', '-4120.29', '353.305', '1.62547', '4520:0 4522:0 4534:0 '),\n+('4522', 'zd790', '571', '66', '66', '73', '77', '0', '5706.28', '-3833.4', '371.987', '0.940598', '4521:0 4494:0 4523:0 '),\n+('4523', 'zd791', '571', '66', '66', '73', '77', '0', '5537.84', '-3840.96', '372.119', '2.47998', '4522:0 4524:0 4525:0 '),\n+('4524', 'zd792', '571', '66', '4322', '73', '77', '0', '5351.53', '-3648.35', '361.961', '2.27578', '4523:0 4525:0 4526:0 4528:0 '),\n+('4525', 'zd793', '571', '66', '4322', '73', '77', '0', '5343.06', '-3764.54', '373.087', '0.190553', '4523:0 4524:0 '),\n+('4526', 'zd794', '571', '66', '66', '73', '77', '0', '5524.4', '-3572.01', '365.432', '0.730907', '4524:0 4527:0 '),\n+('4527', 'zd795', '571', '66', '4324', '73', '77', '0', '5626.9', '-3422.21', '363.833', '0.990089', '4526:0 4491:0 4492:0 '),\n+('4528', 'zd796', '571', '66', '4322', '73', '77', '0', '5153.32', '-3723.32', '360.396', '4.07514', '4524:0 4529:0 '),\n+('4529', 'zd797', '571', '66', '4322', '73', '77', '0', '5076.21', '-3849.59', '356.664', '4.99406', '4528:0 4530:0 '),\n+('4530', 'zd798', '571', '66', '66', '73', '77', '0', '5136.04', '-4040.57', '355.425', '5.10401', '4529:0 4403:0 4531:0 '),\n+('4531', 'zd799', '571', '66', '66', '73', '77', '0', '5278.78', '-4177.66', '363.104', '2.86954', '4530:0 4403:0 4532:0 '),\n+('4532', 'zd800', '571', '66', '66', '73', '77', '0', '5437.96', '-4288.78', '363.086', '5.803', '4531:0 4533:0 4534:0 '),\n+('4533', 'zd801', '571', '66', '66', '73', '77', '0', '5440.87', '-4452.18', '379.545', '5.85562', '4532:0 '),\n+('4534', 'zd802', '571', '66', '4325', '73', '77', '0', '5627.9', '-4207.17', '364.009', '5.93258', '4532:0 4521:0 4520:0 '),\n+('4535', 'zd803', '571', '66', '66', '73', '77', '0', '6164.11', '-3834.22', '436.687', '5.57209', '4513:0 4536:0 '),\n+('4536', 'zd804', '571', '66', '66', '73', '77', '0', '6297.28', '-3979.47', '456.92', '5.47784', '4535:0 4537:0 '),\n+('4537', 'zd805', '571', '66', '66', '73', '77', '0', '6443.44', '-4126.1', '462.301', '5.40087', '4536:0 4538:0 4548:0 '),\n+('4538', 'zd806', '571', '66', '4329', '73', '77', '0', '6406.23', '-4295.64', '457.247', '4.84558', '4537:0 4539:0 4547:0 '),\n+('4539', 'zd807', '571', '66', '66', '73', '77', '0', '6273.9', '-4442.23', '450.834', '3.83242', '4538:0 4540:0 4543:0 '),\n+('4540', 'zd808', '571', '66', '4329', '73', '77', '0', '6178.17', '-4399.01', '456.879', '1.41967', '4539:0 4541:0 '),\n+('4541', 'zd809', '571', '66', '4329', '73', '77', '0', '6227.62', '-4232.4', '436.632', '4.94847', '4540:0 4542:0 '),\n+('4542', 'zd810', '571', '66', '4329', '73', '77', '0', '6214.01', '-4138.28', '447.456', '5.0066', '4541:0 '),\n+('4543', 'zd811', '571', '66', '4373', '73', '77', '0', '6412.14', '-4626.89', '453.335', '2.16502', '4539:0 4544:0 '),\n+('4544', 'zd812', '571', '66', '4375', '73', '77', '0', '6602.74', '-4663.95', '450.613', '0.474835', '4543:0 4545:0 4559:0 '),\n+('4545', 'zd813', '571', '66', '4375', '73', '77', '0', '6698.48', '-4568.11', '450.518', '2.11632', '4544:0 4546:0 '),\n+('4546', 'zd814', '571', '66', '4375', '73', '77', '0', '6638.09', '-4503.12', '485.547', '2.39985', '4545:0 4547:0 '),\n+('4547', 'zd815', '571', '66', '4373', '73', '77', '0', '6532.06', '-4368.66', '450.654', '5.95377', '4546:0 4538:0 4548:0 '),\n+('4548', 'zd816', '571', '66', '66', '73', '77', '0', '6586.21', '-4259.92', '452.582', '2.52315', '4547:0 4537:0 4549:0 '),\n+('4549', 'zd817', '571', '66', '66', '73', '77', '0', '6681.53', '-4181.26', '455.784', '5.78336', '4548:0 4550:0 4557:0 '),\n+('4550', 'zd818', '571', '66', '66', '73', '77', '0', '6821.02', '-4227.92', '452.785', '0.387671', '4549:0 4551:0 4557:0 '),\n+('4551', 'zd819', '571', '66', '4579', '73', '77', '1', '6899.77', '-4113.21', '467.355', '4.92777', '4550:0 4552:0 '),\n+('4552', 'zd820', '571', '66', '66', '73', '77', '0', '7055.14', '-4222.88', '450.363', '3.95496', '4551:0 4553:0 '),\n+('4553', 'zd821', '571', '66', '66', '73', '77', '0', '7139.88', '-4413.45', '457.062', '4.921', '4552:0 4554:0 '),\n+('4554', 'zd822', '571', '66', '4375', '73', '77', '0', '7003.8', '-4522.32', '450.519', '3.23161', '4553:0 4555:0 '),\n+('4555', 'zd823', '571', '66', '4375', '73', '77', '0', '6879.7', '-4603.96', '452.922', '4.36494', '4554:0 4556:0 4558:0 '),\n+('4556', 'zd824', '571', '66', '4375', '73', '77', '0', '6779.05', '-4455.52', '441.057', '2.48784', '4555:0 4557:0 '),\n+('4557', 'zd825', '571', '66', '4375', '73', '77', '0', '6738.67', '-4314.66', '450.026', '0.835357', '4556:0 4550:0 4549:0 '),\n+('4558', 'zd826', '571', '66', '4375', '73', '77', '0', '6817.32', '-4743.11', '450.661', '4.44034', '4555:0 4559:0 '),\n+('4559', 'zd827', '571', '66', '66', '73', '77', '0', '6680.31', '-4847.44', '452.584', '2.08415', '4558:0 4544:0 4560:0 '),\n+('4560', 'zd828', '571', '66', '4375', '73', '77', '0', '6841.86', '-4987.38', '451.036', '5.56582', '4559:0 '),\n+('4561', 'cs829', '571', '2817', '4557', '74', '78', '0', '5438.42', '-1075.94', '181.63', '1.64666', '4419:0 4562:0 4565:0 4567:0 '),\n+('4562', 'cs830', '571', '2817', '4554', '74', '78', '0', '5414.79', '-913.179', '165.857', '1.65453', '4561:0 4563:0 '),\n+('4563', 'cs831', '571', '2817', '4557', '74', '78', '0', '5529.65', '-840.32', '161.565', '0.178767', '4562:0 4564:0 4566:0 4578:0 '),\n+('4564', 'cs832', '571', '2817', '4557', '74', '78', '0', '5646.92', '-907.293', '186.362', '5.31056', '4563:0 4565:0 '),\n+('4565', 'cs833', '571', '2817', '4557', '74', '78', '0', '5531.5', '-987.127', '191.383', '0.576966', '4561:0 4564:0 '),\n+('4566', 'cs834', '571', '2817', '4558', '74', '78', '5', '5605.93', '-749.995', '199.49', '1.05213', '4563:0 '),\n+('4567', 'cs835', '571', '2817', '4554', '74', '78', '0', '5331.06', '-914.795', '170.103', '1.60977', '4561:0 4568:0 '),\n+('4568', 'cs836', '571', '2817', '4554', '74', '78', '0', '5307.84', '-750.937', '162.904', '2.08886', '4567:0 4569:0 '),\n+('4569', 'cs837', '571', '2817', '4557', '74', '78', '0', '5179.88', '-711.115', '164.986', '1.15816', '4568:0 4570:0 4572:0 '),\n+('4570', 'cs838', '571', '2817', '2817', '74', '78', '2', '5082.9', '-704.384', '186.517', '6.16508', '4569:0 4571:0 '),\n+('4571', 'cs839', '571', '2817', '4559', '74', '78', '3', '5062.59', '-611.621', '218.683', '5.43466', '4570:0 '),\n+('4572', 'cs840', '571', '2817', '4557', '74', '78', '0', '5185.33', '-555.375', '158.496', '1.08748', '4569:0 4573:0 '),\n+('4573', 'cs841', '571', '2817', '4557', '74', '78', '0', '5212.12', '-335.385', '163.451', '1.20529', '4572:0 4574:0 '),\n+('4574', 'cs842', '571', '2817', '4557', '74', '78', '0', '5329.19', '-218.838', '166.128', '0.232181', '4573:0 4575:0 4583:0 '),\n+('4575', 'cs843', '571', '2817', '4557', '74', '78', '0', '5520.69', '-188.647', '157.616', '0.0751006', '4574:0 4576:0 4583:0 '),\n+('4576', 'cs844', '571', '2817', '4557', '74', '78', '0', '5672.16', '-264.918', '167.932', '5.74096', '4575:0 4577:0 4579:0 4674:0 '),\n+('4577', 'cs845', '571', '2817', '4557', '74', '78', '0', '5583.23', '-439.368', '154.644', '4.20158', '4576:0 4578:0 '),\n+('4578', 'cs846', '571', '2817', '4554', '74', '78', '0', '5498.08', '-612.708', '152.463', '4.75686', '4577:0 4563:0 '),\n+('4579', 'cs847', '571', '2817', '4553', '74', '78', '0', '5679.51', '-108.805', '178.045', '1.46212', '4576:0 4580:0 4809:0 '),\n+('4580', 'cs848', '571', '2817', '4553', '74', '78', '0', '5720.75', '54.3693', '171.054', '1.38122', '4579:0 4581:0 4582:0 4597:0 '),\n+('4581', 'cs849', '571', '2817', '4553', '74', '78', '0', '5765.22', '181.998', '182.874', '0.613098', '4580:0 '),\n+('4582', 'cs850', '571', '2817', '4553', '74', '78', '0', '5544.73', '121.881', '150.263', '4.18823', '4580:0 4583:0 '),\n+('4583', 'cs851', '571', '2817', '4553', '74', '78', '0', '5414.2', '-47.7746', '149.795', '3.91334', '4582:0 4575:0 4574:0 4584:0 '),\n+('4584', 'cs852', '571', '2817', '2817', '74', '78', '0', '5354.31', '126.368', '161.642', '2.27029', '4583:0 4585:0 4586:0 '),\n+('4585', 'cs853', '571', '2817', '2817', '74', '78', '0', '5257.75', '154.168', '191.769', '2.73995', '4584:0 4101:0 '),\n+('4586', 'cs854', '571', '2817', '2817', '74', '78', '0', '5423.58', '292.611', '156.85', '1.48646', '4584:0 4587:0 '),\n+('4587', 'cs855', '571', '2817', '2817', '74', '78', '0', '5436.65', '406.464', '167.948', '1.52965', '4586:0 4588:0 4596:0 '),\n+('4588', 'cs856', '571', '2817', '4555', '74', '78', '0', '5332.71', '578.052', '182.7', '1.3333', '4587:0 4589:0 '),\n+('4589', 'cs857', '571', '2817', '4555', '74', '78', '0', '5471.03', '710.798', '171.741', '0.739547', '4588:0 4590:0 '),\n+('4590', 'cs858', '571', '2817', '2817', '74', '78', '0', '5519.14', '908.014', '167.988', '1.35608', '4589:0 4591:0 4592:0 '),\n+('4591', 'cs859', '571', '2817', '4556', '74', '78', '1', '5706.15', '1006.05', '174.48', '3.67458', '4590:0 '),\n+('4592', 'cs860', '571', '2817', '2817', '74', '78', '0', '5682.36', '825.06', '156.036', '5.32233', '4590:0 4593:0 '),\n+('4593', 'cs861', '571', '2817', '2817', '74', '78', '0', '5849.61', '885.831', '160.066', '0.393957', '4592:0 4594:0 '),\n+('4594', 'cs862', '571', '2817', '4553', '74', '78', '0', '5854.17', '706.025', '164.715', '4.73956', '4593:0 4595:0 '),\n+('4595', 'cs863', '571', '2817', '4553', '74', '78', '0', '5740.73', '555.099', '158.091', '4.03271', '4594:0 4596:0 '),\n+('4596', 'cs864', '571', '2817', '4553', '74', '78', '0', '5615.21', '410.65', '156.222', '3.51042', '4595:0 4587:0 4597:0 '),\n+('4597', 'cs865', '571', '2817', '4553', '74', '78', '0', '5676.64', '245.015', '166.802', '4.93592', '4596:0 4580:0 '),\n+('4598', 'sb866', '571', '3711', '4483', '74', '78', '0', '4671.5', '5526.35', '34.4275', '0.54946', '3857:0 4599:0 '),\n+('4599', 'sb867', '571', '3711', '3711', '74', '78', '0', '4892.01', '5531.93', '-71.5606', '0.0389507', '4598:0 4600:0 4628:0 '),\n+('4600', 'sb868', '571', '3711', '4289', '74', '78', '0', '4952.39', '5739.79', '-75.5644', '1.2249', '4599:0 4601:0 '),\n+('4601', 'sb869', '571', '3711', '4289', '74', '78', '0', '5130.17', '5883.3', '-75.7286', '0.492126', '4600:0 4602:0 '),\n+('4602', 'sb870', '571', '3711', '4289', '74', '78', '0', '5325.13', '5886.98', '-68.7967', '0.00281286', '4601:0 4603:0 4629:0 '),\n+('4603', 'sb871', '571', '3711', '4285', '74', '78', '0', '5507.19', '5934.35', '-51.6289', '6.11243', '4602:0 4604:0 '),\n+('4604', 'sb872', '571', '3711', '3711', '74', '78', '0', '5713', '5871.42', '-60.4173', '5.97499', '4603:0 4605:0 4668:0 '),\n+('4605', 'sb873', '571', '3711', '4289', '74', '78', '0', '5882.95', '5730.44', '-63.8448', '5.56737', '4604:0 4606:0 '),\n+('4606', 'sb874', '571', '3711', '4289', '74', '78', '0', '6018.42', '5571.93', '-74.0181', '5.18095', '4605:0 4607:0 4657:0 '),\n+('4607', 'sb875', '571', '3711', '4385', '74', '78', '0', '6082.5', '5353.27', '-92.7974', '4.70422', '4606:0 4608:0 4656:0 '),\n+('4608', 'sb876', '571', '3711', '3711', '74', '78', '0', '6268.69', '5300.48', '-100.197', '0.380579', '4607:0 4609:0 '),\n+('4609', 'sb877', '571', '3711', '3711', '74', '78', '0', '6450.25', '5197.28', '-64.1861', '5.49824', '4608:0 4610:0 '),\n+('4610', 'sb878', '571', '3711', '4376', '74', '78', '0', '6507.21', '4992.87', '-60.1724', '4.97202', '4609:0 4611:0 4650:0 '),\n+('4611', 'sb879', '571', '3711', '3711', '74', '78', '0', '6524.26', '4794.34', '-58.974', '4.36726', '4610:0 4612:0 '),\n+('4612', 'sb880', '571', '3711', '4368', '74', '78', '0', '6443.53', '4602.81', '-66.2857', '4.55104', '4611:0 4613:0 4649:0 4651:0 '),\n+('4613', 'sb881', '571', '3711', '4368', '74', '78', '0', '6405.01', '4366.1', '-47.8041', '3.90309', '4612:0 4614:0 4648:0 4649:0 '),\n+('4614', 'sb882', '571', '3711', '3711', '74', '78', '0', '6226.59', '4265.96', '-45.1729', '3.55594', '4613:0 4615:0 4648:0 '),\n+('4615', 'sb883', '571', '3711', '4283', '74', '78', '0', '6111.71', '4134.4', '-48.7024', '4.20861', '4614:0 4616:0 '),\n+('4616', 'sb884', '571', '3711', '4283', '74', '78', '0', '6038.48', '4009.63', '-42.6825', '4.13556', '4615:0 4617:0 '),\n+('4617', 'sb885', '571', '3711', '4283', '74', '78', '0', '5938.28', '3889.47', '-35.5353', '3.47426', '4616:0 4618:0 4646:0 '),\n+('4618', 'sb886', '571', '3711', '4283', '74', '78', '0', '5785.88', '3776.91', '-41.0442', '3.94', '4617:0 4619:0 4646:0 4647:0 '),\n+('4619', 'sb887', '571', '3711', '3711', '74', '78', '0', '5624.29', '3606.52', '-21.7442', '3.13811', '4618:0 4620:0 4647:0 '),\n+('4620', 'sb888', '571', '3711', '4283', '74', '78', '0', '5488.8', '3794.13', '-58.7714', '2.25061', '4619:0 4621:0 '),\n+('4621', 'sb889', '571', '3711', '4387', '74', '78', '0', '5337.73', '3917.13', '-70.8363', '2.57655', '4620:0 4622:0 4642:0 4643:0 '),\n+('4622', 'sb890', '571', '3711', '3711', '74', '78', '0', '5220.59', '4104.15', '-78.9241', '2.09588', '4621:0 4623:0 4641:0 '),\n+('4623', 'sb891', '571', '3711', '3711', '74', '78', '0', '5146.69', '4294.33', '-99.9765', '1.80057', '4622:0 4624:0 4640:0 '),\n+('4624', 'sb892', '571', '3711', '3711', '74', '78', '1', '5110.31', '4494.04', '-98.6996', '1.66941', '4623:0 4625:0 '),\n+('4625', 'sb893', '571', '3711', '3711', '74', '78', '0', '5098.19', '4704.21', '-133.607', '2.04248', '4624:0 4626:0 4635:0 '),\n+('4626', 'sb894', '571', '3711', '3711', '74', '78', '0', '4975.85', '4879.83', '-101.866', '1.73853', '4625:0 4627:0 4636:0 '),\n+('4627', 'sb895', '571', '3711', '3711', '74', '78', '0', '4881.56', '5059.86', '-91.1009', '1.00104', '4626:0 4628:0 '),\n+('4628', 'sb896', '571', '3711', '3711', '74', '78', '0', '4917.13', '5259.43', '-92.7846', '1.6058', '4627:0 4599:0 4672:0 '),\n+('4629', 'sb897', '571', '3711', '3711', '74', '78', '0', '5325.03', '5694.77', '-87.1296', '4.35079', '4602:0 4630:0 '),\n+('4630', 'sb898', '571', '3711', '4288', '74', '78', '0', '5283.58', '5529.21', '-98.5324', '4.62568', '4629:0 4631:0 '),\n+('4631', 'sb899', '571', '3711', '3711', '74', '78', '0', '5296.26', '5368.21', '-119.485', '5.45035', '4630:0 4632:0 4669:0 '),\n+('4632', 'sb900', '571', '3711', '4293', '74', '78', '0', '5334.1', '5156.57', '-135.744', '4.8503', '4631:0 4633:0 '),\n+('4633', 'sb901', '571', '3711', '4293', '74', '78', '0', '5316.24', '4983.73', '-135.985', '4.21805', '4632:0 4634:0 4673:0 '),\n+('4634', 'sb902', '571', '3711', '4293', '74', '78', '0', '5263.3', '4836.68', '-132.956', '4.22984', '4633:0 4635:0 '),\n+('4635', 'sb903', '571', '3711', '4293', '74', '78', '0', '5171.92', '4761.28', '-134.094', '3.64315', '4634:0 4625:0 '),\n+('4636', 'sb904', '571', '3711', '3711', '74', '78', '0', '4906.61', '4752.07', '-80.9517', '3.99658', '4626:0 4637:0 '),\n+('4637', 'sb905', '571', '3711', '4388', '74', '78', '0', '4784.59', '4651.45', '-67.3646', '4.27774', '4636:0 4638:0 '),\n+('4638', 'sb906', '571', '3711', '4388', '74', '78', '0', '4776.89', '4461.82', '-65.79', '0.115909', '4637:0 4639:0 '),\n+('4639', 'sb907', '571', '3711', '3711', '74', '78', '0', '4858.79', '4312.13', '-51.668', '4.56127', '4638:0 4640:0 '),\n+('4640', 'sb908', '571', '3711', '4304', '74', '78', '0', '5008.15', '4265.85', '-85.0377', '2.88757', '4639:0 4623:0 '),\n+('4641', 'sb909', '571', '3711', '4303', '74', '78', '0', '5141.4', '4002.05', '-61.6423', '4.65002', '4622:0 4642:0 '),\n+('4642', 'sb910', '571', '3711', '3711', '74', '78', '0', '5236.32', '3820.55', '-29.2583', '0.629582', '4641:0 4621:0 '),\n+('4643', 'sb911', '571', '3711', '4283', '74', '78', '0', '5426.13', '4100.88', '-86.7674', '1.1935', '4621:0 4644:0 '),\n+('4644', 'sb912', '571', '3711', '4283', '74', '78', '0', '5555.95', '4256', '-102.563', '0.234915', '4643:0 4645:0 4664:0 '),\n+('4645', 'sb913', '571', '3711', '4283', '74', '78', '0', '5713.23', '4134.64', '-89.7735', '5.05333', '4644:0 4646:0 '),\n+('4646', 'sb914', '571', '3711', '4283', '74', '78', '0', '5757.78', '3962.65', '-74.4666', '5.33842', '4645:0 4617:0 4618:0 '),\n+('4647', 'sb915', '571', '3711', '4297', '74', '78', '0', '5782.35', '3632.67', '-13.2643', '3.22964', '4618:0 4619:0 '),\n+('4648', 'sb916', '571', '3711', '3711', '74', '78', '0', '6360.37', '4223.67', '-44.0521', '1.79237', '4613:0 4614:0 '),\n+('4649', 'sb917', '571', '3711', '4368', '74', '78', '0', '6543.56', '4456.6', '-47.1567', '2.3712', '4613:0 4612:0 '),\n+('4650', 'sb918', '571', '3711', '4376', '74', '78', '0', '6354.19', '4873.76', '-84.2341', '5.19234', '4610:0 4651:0 '),\n+('4651', 'sb919', '571', '3711', '3711', '74', '78', '0', '6357.09', '4685.34', '-78.5111', '5.19313', '4650:0 4612:0 4652:0 '),\n+('4652', 'sb920', '571', '3711', '3711', '74', '78', '0', '6208.52', '4590.1', '-92.1573', '3.70988', '4651:0 4653:0 '),\n+('4653', 'sb921', '571', '3711', '3711', '74', '78', '0', '6025.9', '4686.81', '-95.5438', '1.9176', '4652:0 4654:0 '),\n+('4654', 'sb922', '571', '3711', '3711', '74', '78', '0', '5994.9', '4894.76', '-99.8287', '1.31128', '4653:0 4655:0 '),\n+('4655', 'sb923', '571', '3711', '4385', '74', '78', '0', '5981.34', '5089.26', '-100.986', '1.44401', '4654:0 4656:0 '),\n+('4656', 'sb924', '571', '3711', '4391', '74', '78', '0', '5939.08', '5277.6', '-99.1834', '0.521168', '4655:0 4607:0 4657:0 4658:0 '),\n+('4657', 'sb925', '571', '3711', '4391', '74', '78', '0', '5903.46', '5420.52', '-94.3184', '1.13064', '4656:0 4606:0 '),\n+('4658', 'sb926', '571', '3711', '4293', '74', '78', '0', '5830.14', '5100.16', '-132.628', '3.78921', '4656:0 4659:0 '),\n+('4659', 'sb927', '571', '3711', '4293', '74', '78', '0', '5680.53', '5002.31', '-134.988', '3.89916', '4658:0 4660:0 '),\n+('4660', 'sb928', '571', '3711', '4293', '74', '78', '0', '5699.45', '4825.48', '-137.014', '5.40319', '4659:0 4661:0 '),\n+('4661', 'sb929', '571', '3711', '4293', '74', '78', '0', '5769.89', '4694.83', '-130.521', '4.6445', '4660:0 4662:0 '),\n+('4662', 'sb930', '571', '3711', '4293', '74', '78', '0', '5768.78', '4519.94', '-133.978', '4.9029', '4661:0 4663:0 '),\n+('4663', 'sb931', '571', '3711', '4293', '74', '78', '0', '5638.21', '4442.49', '-138.205', '3.53632', '4662:0 4664:0 4665:0 '),\n+('4664', 'sb932', '571', '3711', '4293', '74', '78', '0', '5520.96', '4384.34', '-134.132', '5.02072', '4663:0 4644:0 '),\n+('4665', 'sb933', '571', '3711', '4293', '74', '78', '1', '5647.9', '4579.12', '-137.584', '3.59247', '4663:0 4666:0 '),\n+('4666', 'sb934', '571', '3711', '4293', '74', '78', '0', '5559.82', '4670.56', '-135.523', '1.45736', '4665:0 4667:0 '),\n+('4667', 'sb935', '571', '3711', '4383', '74', '78', '5', '5497.21', '4748.71', '-193.716', '5.27047', '4666:0 '),\n+('4668', 'sb936', '571', '3711', '4284', '74', '78', '1', '5575.69', '5751.97', '-74.7038', '0.766207', '4604:0 4671:0 '),\n+('4669', 'sb937', '571', '3711', '4285', '74', '78', '0', '5456.52', '5353.98', '-134.279', '6.15248', '4631:0 4670:0 '),\n+('4670', 'sb938', '571', '3711', '3711', '74', '78', '0', '5648.23', '5302.27', '-121.201', '1.53199', '4669:0 4671:0 '),\n+('4671', 'sb939', '571', '3711', '3711', '74', '78', '0', '5580.86', '5590.13', '-92.6294', '1.61445', '4670:0 4668:0 '),\n+('4672', 'sb940', '571', '3711', '3711', '74', '78', '0', '5041.36', '5069.92', '-110.999', '5.98282', '4628:0 4673:0 '),\n+('4673', 'sb941', '571', '3711', '4293', '74', '78', '0', '5202.57', '5018.06', '-134.206', '5.92392', '4672:0 4633:0 '),\n+('4674', 'sp942', '571', '67', '67', '76', '80', '0', '5752.46', '-354.53', '205.676', '5.2249', '4576:0 4675:0 '),\n+('4675', 'sp943', '571', '67', '4419', '76', '80', '0', '5903.83', '-485.757', '296.6', '6.0849', '4674:0 4676:0 '),\n+('4676', 'sp944', '571', '67', '4419', '76', '80', '0', '6079.55', '-564.659', '370.689', '5.9286', '4675:0 4677:0 4689:0 4690:0 '),\n+('4677', 'sp945', '571', '67', '4419', '76', '80', '0', '6182.6', '-758.333', '400.203', '4.95', '4676:0 4678:0 4688:0 '),\n+('4678', 'sp946', '571', '67', '4419', '76', '80', '0', '6143.85', '-967.832', '398.945', '4.41828', '4677:0 4679:0 4680:0 '),\n+('4679', 'sp947', '571', '67', '4418', '76', '80', '1', '6122.51', '-1083.62', '402.604', '1.60263', '4678:0 '),\n+('4680', 'sp948', '571', '67', '4419', '76', '80', '0', '6273.81', '-1034.37', '412.299', '5.98122', '4678:0 4681:0 4691:0 '),\n+('4681', 'sp949', '571', '67', '4462', '76', '80', '0', '6444.88', '-1034.29', '429.644', '6.27654', '4680:0 4682:0 '),\n+('4682', 'sp950', '571', '67', '4462', '76', '80', '0', '6611.36', '-1016.67', '427.636', '0.199126', '4681:0 4683:0 4684:0 '),\n+('4683', 'sp951', '571', '67', '4462', '76', '80', '0', '6639.97', '-1111.4', '427.1', '3.18364', '4682:0 '),\n+('4684', 'sp952', '571', '67', '4462', '76', '80', '0', '6673.93', '-1219.13', '398.841', '5.0403', '4682:0 4685:0 4686:0 '),\n+('4685', 'sp953', '571', '67', '4462', '76', '80', '0', '6592.21', '-1275.82', '392.991', '5.05994', '4684:0 '),\n+('4686', 'sp954', '571', '67', '4462', '76', '80', '0', '6697.35', '-1426.2', '388.747', '4.94449', '4684:0 4687:0 '),\n+('4687', 'sp955', '571', '67', '4462', '76', '80', '0', '6795.01', '-1512.06', '359.911', '5.79979', '4686:0 '),\n+('4688', 'sp956', '571', '67', '4419', '76', '80', '0', '6324.13', '-838.805', '407.569', '0.335772', '4677:0 '),\n+('4689', 'sp957', '571', '67', '4419', '76', '80', '0', '6232.08', '-626.646', '414.707', '2.81842', '4676:0 '),\n+('4690', 'sp958', '571', '67', '4419', '76', '80', '0', '6146.68', '-346.08', '436.33', '4.09626', '4676:0 '),\n+('4691', 'sp959', '571', '67', '4419', '76', '80', '0', '6257', '-1198.57', '428.281', '5.0293', '4680:0 4692:0 4693:0 '),\n+('4692', 'sp960', '571', '67', '4460', '76', '80', '0', '6297.61', '-1350.75', '426.332', '4.79525', '4691:0 4699:0 '),\n+('4693', 'sp961', '571', '67', '4460', '76', '80', '0', '6393.21', '-1222.32', '429.226', '4.92092', '4691:0 4694:0 '),\n+('4694', 'sp962', '571', '67', '4419', '76', '80', '0', '6471.87', '-1383.27', '479.473', '4.04521', '4693:0 4695:0 '),\n+('4695', 'sp963', '571', '67', '4421', '76', '80', '0', '6345.12', '-1517.97', '434.126', '3.78838', '4694:0 4696:0 '),\n+('4696', 'sp964', '571', '67', '4421', '76', '80', '0', '6349.58', '-1586.52', '428.04', '5.62228', '4695:0 4697:0 4699:0 '),\n+('4697', 'sp965', '571', '67', '4421', '76', '80', '0', '6455.08', '-1685.64', '435.366', '5.95606', '4696:0 4698:0 '),\n+('4698', 'sp966', '571', '67', '4421', '76', '80', '0', '6462.41', '-1739.78', '484.912', '2.47281', '4697:0 '),\n+('4699', 'sp967', '571', '67', '4421', '76', '80', '0', '6232.83', '-1499.78', '419.118', '0.960144', '4696:0 4692:0 '),\n+('4700', 'sp968', '571', '67', '4484', '76', '80', '1', '8455.31', '-325.265', '906.979', '2.46809', '4701:0 '),\n+('4701', 'sp969', '571', '67', '4484', '76', '80', '0', '8485.73', '-279.992', '850.711', '1.97722', '4700:0 4702:0 '),\n+('4702', 'sp970', '571', '67', '4436', '76', '80', '0', '8483.73', '-136.842', '797.392', '1.57038', '4701:0 4703:0 4706:0 '),\n+('4703', 'sp971', '571', '67', '4436', '76', '80', '0', '8481.05', '57.8398', '786.425', '1.56174', '4702:0 4704:0 '),\n+('4704', 'sp972', '571', '67', '4436', '76', '80', '0', '8468.58', '226.668', '788.805', '1.98979', '4703:0 4705:0 '),\n+('4705', 'sp973', '571', '67', '4436', '76', '80', '0', '8317.77', '105.355', '824.229', '4.03339', '4704:0 4706:0 '),\n+('4706', 'sp974', '571', '67', '4436', '76', '80', '0', '8313.08', '-91.3043', '827.379', '4.66407', '4705:0 4702:0 4707:0 4719:0 '),\n+('4707', 'sp975', '571', '67', '4435', '76', '80', '0', '8202.06', '-202.29', '871.634', '4.01769', '4706:0 4708:0 4710:0 '),\n+('4708', 'sp976', '571', '67', '4435', '76', '80', '0', '8237.33', '-247.278', '952.88', '3.24408', '4707:0 4709:0 '),\n+('4709', 'sp977', '571', '67', '4435', '76', '80', '0', '8092.31', '-403.116', '964.773', '0.843118', '4708:0 '),\n+('4710', 'sp978', '571', '67', '4435', '76', '80', '0', '8040.6', '-222.79', '846.911', '3.84806', '4707:0 4711:0 '),\n+('4711', 'sp979', '571', '67', '4435', '76', '80', '0', '7945.56', '-368.7', '884.037', '5.26884', '4710:0 4712:0 4713:0 4715:0 '),\n+('4712', 'sp980', '571', '67', '4435', '76', '80', '0', '7953.58', '-524.527', '913.45', '5.63719', '4711:0 4737:0 '),\n+('4713', 'sp981', '571', '67', '4435', '76', '80', '0', '8056.94', '-415.927', '981.568', '4.73712', '4711:0 4714:0 '),\n+('4714', 'sp982', '571', '67', '4435', '76', '80', '0', '8116.43', '-385.365', '981.611', '0.510895', '4713:0 '),\n+('4715', 'sp983', '571', '67', '4436', '76', '80', '0', '7847.85', '-252.132', '885.258', '1.43374', '4711:0 4716:0 4724:0 '),\n+('4716', 'sp984', '571', '67', '4436', '76', '80', '0', '7851.3', '-120.4', '880.754', '2.3126', '4715:0 4717:0 '),\n+('4717', 'sp985', '571', '67', '4486', '76', '80', '0', '7796.32', '-44.5017', '882.083', '4.37664', '4716:0 4718:0 '),\n+('4718', 'sp986', '571', '67', '4486', '76', '80', '0', '7737.47', '-4.97132', '866.565', '4.27297', '4717:0 '),\n+('4719', 'sp987', '571', '67', '4434', '76', '80', '0', '8078.57', '-32.5271', '869.499', '2.49247', '4706:0 4720:0 '),\n+('4720', 'sp988', '571', '67', '4434', '76', '80', '0', '8168.23', '99.4058', '898.859', '1.3183', '4719:0 4721:0 '),\n+('4721', 'sp989', '571', '67', '4434', '76', '80', '0', '7974.07', '-6.90656', '961.657', '1.27039', '4720:0 4722:0 '),\n+('4722', 'sp990', '571', '67', '4434', '76', '80', '0', '7950.02', '93.3063', '1028.03', '0.358544', '4721:0 4723:0 '),\n+('4723', 'sp991', '571', '67', '4434', '76', '80', '0', '7756.08', '70.5513', '1009.34', '2.07228', '4722:0 '),\n+('4724', 'sp992', '571', '67', '4436', '76', '80', '0', '7731.17', '-155.37', '873.081', '2.5828', '4715:0 4725:0 '),\n+('4725', 'sp993', '571', '67', '67', '76', '80', '0', '7531.71', '-82.1077', '837.076', '3.3682', '4724:0 4726:0 '),\n+('4726', 'sp994', '571', '67', '4424', '76', '80', '0', '7365.61', '-62.5754', '778.928', '3.05011', '4725:0 4727:0 4731:0 '),\n+('4727', 'sp995', '571', '67', '4424', '76', '80', '0', '7426.39', '97.7694', '770.976', '6.19485', '4726:0 4728:0 '),\n+('4728', 'sp996', '571', '67', '4499', '76', '80', '0', '7491.52', '288.222', '774.525', '2.91503', '4727:0 4729:0 '),\n+('4729', 'sp997', '571', '67', '4424', '76', '80', '0', '7352.12', '248.002', '774.191', '5.46442', '4728:0 4730:0 '),\n+('4730', 'sp998', '571', '67', '4424', '76', '80', '0', '7358.47', '144.777', '783.476', '4.25726', '4729:0 4731:0 '),\n+('4731', 'sp999', '571', '67', '4424', '76', '80', '0', '7260.89', '6.23937', '773.777', '4.18657', '4730:0 4726:0 4732:0 '),\n+('4732', 'sp1000', '571', '67', '4424', '76', '80', '0', '7178.24', '-109.916', '772.616', '4.20384', '4731:0 4733:0 4736:0 '),\n+('4733', 'sp1001', '571', '67', '4452', '76', '80', '0', '7066.53', '-147.905', '785.381', '3.57396', '4732:0 4734:0 '),\n+('4734', 'sp1002', '571', '67', '4453', '76', '80', '0', '6959.39', '-173.873', '763.88', '2.97313', '4733:0 4735:0 '),\n+('4735', 'sp1003', '571', '67', '4453', '76', '80', '0', '6782.97', '-67.7557', '738.941', '2.11233', '4734:0 '),\n+('4736', 'sp1004', '571', '67', '4452', '76', '80', '0', '7090.4', '-308.701', '774.099', '4.51251', '4732:0 '),\n+('4737', 'sp1005', '571', '67', '67', '76', '80', '0', '8123.18', '-622.333', '945.418', '5.51782', '4712:0 4738:0 '),\n+('4738', 'sp1006', '571', '67', '4446', '76', '80', '0', '8249.28', '-737.261', '923.975', '5.57986', '4737:0 4739:0 '),\n+('4739', 'sp1007', '571', '67', '4446', '76', '80', '0', '8264.89', '-900.437', '923.875', '2.77599', '4738:0 4740:0 4742:0 '),\n+('4740', 'sp1008', '571', '67', '4485', '76', '80', '0', '8140.52', '-817.38', '956.118', '4.95861', '4739:0 4741:0 '),\n+('4741', 'sp1009', '571', '67', '4485', '76', '80', '0', '8148.76', '-940.656', '956.955', '0.816413', '4740:0 '),\n+('4742', 'sp1010', '571', '67', '4446', '76', '80', '0', '8178.94', '-1015.84', '926.187', '5.46676', '4739:0 4743:0 '),\n+('4743', 'sp1011', '571', '67', '4446', '76', '80', '0', '8330.55', '-1186.57', '924.477', '5.49032', '4742:0 '),\n+('4744', 'sp1012', '571', '67', '4441', '76', '80', '4', '7798.27', '-2842.24', '1219.51', '2.4704', '4745:0 4746:0 '),\n+('4745', 'sp1013', '571', '67', '4441', '76', '80', '5', '7804.98', '-2945.31', '1256.79', '1.43524', '4744:0 '),\n+('4746', 'sp1014', '571', '67', '4441', '76', '80', '0', '7866.14', '-2800.43', '1136.14', '2.6746', '4744:0 4747:0 4762:0 '),\n+('4747', 'sp1015', '571', '67', '4444', '76', '80', '0', '7974.26', '-2941.67', '1137.82', '0.286989', '4746:0 4748:0 '),\n+('4748', 'sp1016', '571', '67', '4444', '76', '80', '0', '8053.32', '-2899.02', '1136.35', '5.48632', '4747:0 4749:0 4753:0 '),\n+('4749', 'sp1017', '571', '67', '67', '76', '80', '0', '8303.1', '-2938.59', '1067.71', '2.65574', '4748:0 4750:0 '),\n+('4750', 'sp1018', '571', '67', '4488', '76', '80', '0', '8126.19', '-2813.7', '1044.76', '1.21375', '4749:0 4751:0 4752:0 '),\n+('4751', 'sp1019', '571', '67', '4488', '76', '80', '0', '8235.54', '-2730.69', '1035.47', '6.08244', '4750:0 4752:0 '),\n+('4752', 'sp1020', '571', '67', '4488', '76', '80', '0', '8268.8', '-2840.55', '1051.57', '2.98168', '4751:0 4750:0 '),\n+('4753', 'sp1021', '571', '67', '4444', '76', '80', '0', '8178.4', '-2765.96', '1137.8', '1.58369', '4748:0 4754:0 '),\n+('4754', 'sp1022', '571', '67', '4444', '76', '80', '0', '8192.81', '-2569.46', '1145.92', '1.28524', '4753:0 4755:0 4761:0 '),\n+('4755', 'sp1023', '571', '67', '4446', '76', '80', '0', '8213.34', '-2399.15', '1136.06', '1.39441', '4754:0 4756:0 '),\n+('4756', 'sp1024', '571', '67', '4446', '76', '80', '0', '8146.87', '-2304.3', '1157.9', '3.14664', '4755:0 4757:0 4758:0 '),\n+('4757', 'sp1025', '571', '67', '4446', '76', '80', '0', '8041.79', '-2401.8', '1157.91', '1.83659', '4756:0 4758:0 4759:0 '),\n+('4758', 'sp1026', '571', '67', '4446', '76', '80', '0', '7981.22', '-2241.64', '1157.87', '2.17589', '4757:0 4756:0 '),\n+('4759', 'sp1027', '571', '67', '4446', '76', '80', '0', '7920.25', '-2449.09', '1137.97', '1.81145', '4757:0 4760:0 4763:0 '),\n+('4760', 'sp1028', '571', '67', '4444', '76', '80', '0', '7924.11', '-2571.76', '1159.29', '2.58976', '4759:0 4761:0 '),\n+('4761', 'sp1029', '571', '67', '4444', '76', '80', '0', '8046.59', '-2635.79', '1135.01', '6.18452', '4760:0 4754:0 4762:0 '),\n+('4762', 'sp1030', '571', '67', '4463', '76', '80', '0', '7915.54', '-2719.76', '1135.12', '3.80869', '4761:0 4746:0 '),\n+('4763', 'sp1031', '571', '67', '4446', '76', '80', '0', '7902.91', '-2332.91', '1153.05', '3.63118', '4759:0 4764:0 '),\n+('4764', 'sp1032', '571', '67', '4442', '76', '80', '0', '7759.44', '-2386.38', '1077.61', '2.84264', '4763:0 4765:0 '),\n+('4765', 'sp1033', '571', '67', '4442', '76', '80', '0', '7670.97', '-2282.57', '1010.94', '2.45387', '4764:0 4766:0 '),\n+('4766', 'sp1034', '571', '67', '4442', '76', '80', '0', '7541.71', '-2363.06', '867.728', '2.12164', '4765:0 4767:0 '),\n+('4767', 'sp1035', '571', '67', '4442', '76', '80', '0', '7465.67', '-2485.65', '760.441', '0.00970542', '4766:0 4768:0 4781:0 '),\n+('4768', 'sp1036', '571', '67', '4438', '76', '80', '0', '7327.84', '-2537.89', '748.903', '4.00974', '4767:0 4769:0 4781:0 '),\n+('4769', 'sp1037', '571', '67', '4438', '76', '80', '0', '7348.8', '-2768.24', '766.138', '4.91922', '4768:0 4770:0 '),\n+('4770', 'sp1038', '571', '67', '4438', '76', '80', '0', '7348.82', '-2958.97', '838.738', '4.70872', '4769:0 4771:0 4780:0 '),\n+('4771', 'sp1039', '571', '67', '4439', '76', '80', '0', '7229.61', '-3136.68', '837.486', '4.08826', '4770:0 4772:0 4780:0 '),\n+('4772', 'sp1040', '571', '67', '4495', '76', '80', '0', '7202.51', '-3334.74', '843.826', '4.6883', '4771:0 4773:0 '),\n+('4773', 'sp1041', '571', '67', '4439', '76', '80', '0', '7368.35', '-3244.03', '851.789', '5.98892', '4772:0 4774:0 '),\n+('4774', 'sp1042', '571', '67', '4439', '76', '80', '0', '7555.15', '-3237.78', '842.017', '0.160478', '4773:0 4775:0 '),\n+('4775', 'sp1043', '571', '67', '4440', '76', '80', '0', '7723.64', '-3278.88', '863.372', '5.73209', '4774:0 4776:0 '),\n+('4776', 'sp1044', '571', '67', '4440', '76', '80', '0', '7843.39', '-3412.02', '865.974', '6.25831', '4775:0 4777:0 '),\n+('4777', 'sp1045', '571', '67', '4440', '76', '80', '0', '8007.01', '-3282.63', '865.574', '2.51589', '4776:0 4778:0 '),\n+('4778', 'sp1046', '571', '67', '4440', '76', '80', '0', '7854.16', '-3160.4', '864.749', '3.02718', '4777:0 4779:0 '),\n+('4779', 'sp1047', '571', '67', '4440', '76', '80', '0', '7635.61', '-3117.6', '867.091', '3.3971', '4778:0 4780:0 '),\n+('4780', 'sp1048', '571', '67', '4439', '76', '80', '0', '7437.01', '-3083.87', '837.452', '2.68239', '4779:0 4770:0 4771:0 '),\n+('4781', 'sp1049', '571', '67', '4437', '76', '80', '0', '7293.97', '-2399.5', '753.5', '6.25517', '4768:0 4767:0 4782:0 '),\n+('4782', 'sp1050', '571', '67', '4437', '76', '80', '0', '7210.78', '-2258.23', '756.519', '2.1766', '4781:0 4783:0 '),\n+('4783', 'sp1051', '571', '67', '4437', '76', '80', '0', '7094.38', '-2114.84', '759.283', '2.32896', '4782:0 4784:0 '),\n+('4784', 'sp1052', '571', '67', '4437', '76', '80', '0', '7071.57', '-1957.32', '769.29', '1.71086', '4783:0 4785:0 '),\n+('4785', 'sp1053', '571', '67', '4422', '76', '80', '0', '7047.94', '-1819.05', '822.822', '1.51843', '4784:0 4786:0 '),\n+('4786', 'sp1054', '571', '67', '4422', '76', '80', '0', '7016.16', '-1682.12', '819.647', '1.56948', '4785:0 4787:0 4788:0 4795:0 '),\n+('4787', 'sp1055', '571', '67', '4422', '76', '80', '0', '6952.92', '-1523.53', '837.796', '1.58755', '4786:0 4788:0 4789:0 '),\n+('4788', 'sp1056', '571', '67', '4422', '76', '80', '0', '6876.88', '-1688.13', '820.475', '5.87424', '4787:0 4786:0 '),\n+('4789', 'sp1057', '571', '67', '4425', '76', '80', '0', '6933.96', '-1355.59', '831.143', '1.62444', '4787:0 4790:0 '),\n+('4790', 'sp1058', '571', '67', '4425', '76', '80', '0', '6927.88', '-1275.08', '819.873', '1.80979', '4789:0 4791:0 '),\n+('4791', 'sp1059', '571', '67', '4423', '76', '80', '0', '6891.54', '-1120.83', '801.801', '2.04934', '4790:0 4792:0 4794:0 '),\n+('4792', 'sp1060', '571', '67', '4423', '76', '80', '0', '6874.8', '-994.702', '800.05', '1.94645', '4791:0 4793:0 '),\n+('4793', 'sp1061', '571', '67', '4423', '76', '80', '0', '6713.98', '-1032.73', '766.307', '5.25848', '4792:0 4794:0 '),\n+('4794', 'sp1062', '571', '67', '4423', '76', '80', '0', '6823.44', '-1136.74', '794.362', '1.42024', '4793:0 4791:0 '),\n+('4795', 'sp1063', '571', '67', '4422', '76', '80', '0', '7059.17', '-1565.01', '830.127', '1.02674', '4786:0 4796:0 '),\n+('4796', 'sp1064', '571', '67', '4432', '76', '80', '1', '7107.06', '-1444.92', '924.841', '0.0175042', '4795:0 4797:0 4808:0 '),\n+('4797', 'sp1065', '571', '67', '4432', '76', '80', '0', '7224.43', '-1369.92', '917.332', '1.04952', '4796:0 4798:0 '),\n+('4798', 'sp1066', '571', '67', '4432', '76', '80', '0', '7304.81', '-1229.95', '912.257', '1.04952', '4797:0 4799:0 '),\n+('4799', 'sp1067', '571', '67', '4473', '76', '80', '0', '7277.74', '-1094.09', '938.898', '4.08901', '4798:0 4800:0 4801:0 '),\n+('4800', 'sp1068', '571', '67', '4473', '76', '80', '0', '7159.16', '-1203.13', '929.255', '3.39314', '4799:0 '),\n+('4801', 'sp1069', '571', '67', '4432', '76', '80', '0', '7276.68', '-952.788', '919.235', '1.31654', '4799:0 4802:0 '),\n+('4802', 'sp1070', '571', '67', '4432', '76', '80', '0', '7442.11', '-871.692', '910.159', '0.46203', '4801:0 4803:0 '),\n+('4803', 'sp1071', '571', '67', '4432', '76', '80', '0', '7617.15', '-899.183', '911.902', '5.67158', '4802:0 4804:0 '),\n+('4804', 'sp1072', '571', '67', '4432', '76', '80', '0', '7731.32', '-1040.44', '920.428', '5.0087', '4803:0 4805:0 '),\n+('4805', 'sp1073', '571', '67', '4432', '76', '80', '0', '7620.47', '-1211.71', '928.587', '4.24765', '4804:0 4806:0 '),\n+('4806', 'sp1074', '571', '67', '4432', '76', '80', '0', '7523.4', '-1365.25', '935.317', '3.55807', '4805:0 4807:0 '),\n+('4807', 'sp1075', '571', '67', '4432', '76', '80', '0', '7392.6', '-1463.43', '928.011', '4.00967', '4806:0 4808:0 '),\n+('4808', 'sp1076', '571', '67', '4536', '76', '80', '0', '7307.54', '-1573.81', '942.399', '2.34934', '4807:0 4796:0 '),\n+('4809', 'cs1077', '571', '2817', '2817', '76', '80', '0', '5850.58', '-134.972', '227.342', '6.13811', '4579:0 4810:0 '),\n+('4810', 'ic1078', '571', '210', '4501', '77', '80', '0', '5971.83', '-162.754', '303.817', '0.106256', '4809:0 4811:0 '),\n+('4811', 'ic1079', '571', '210', '4501', '77', '80', '1', '6141.12', '-52.066', '381.591', '0.738502', '4810:0 4812:0 '),\n+('4812', 'ic1080', '571', '210', '4501', '77', '80', '0', '6194.51', '34.1853', '380.232', '0.656035', '4811:0 4813:0 4815:0 '),\n+('4813', 'ic1081', '571', '210', '4504', '77', '80', '0', '6172.36', '156.629', '374.276', '0.907363', '4812:0 4814:0 '),\n+('4814', 'ic1082', '571', '210', '4504', '77', '80', '0', '6379.33', '179.484', '392.956', '0.48639', '4813:0 4815:0 4816:0 '),\n+('4815', 'ic1083', '571', '210', '4501', '77', '80', '0', '6302.14', '95.8391', '390.823', '3.94214', '4814:0 4812:0 '),\n+('4816', 'ic1084', '571', '210', '4505', '77', '80', '0', '6510.94', '285.541', '400.181', '0.224064', '4814:0 4817:0 '),\n+('4817', 'ic1085', '571', '210', '4505', '77', '80', '0', '6561.12', '378.976', '420.028', '1.01575', '4816:0 4818:0 4819:0 '),\n+('4818', 'ic1086', '571', '210', '4506', '77', '80', '0', '6586.56', '556.561', '402.946', '1.2011', '4817:0 4819:0 4820:0 '),\n+('4819', 'ic1087', '571', '210', '4506', '77', '80', '0', '6708.22', '403.424', '412.114', '3.63504', '4818:0 4817:0 4824:0 '),\n+('4820', 'ic1088', '571', '210', '4506', '77', '80', '0', '6723.06', '690.867', '407.835', '0.367783', '4818:0 4821:0 4851:0 '),\n+('4821', 'ic1089', '571', '210', '4506', '77', '80', '0', '6907.33', '730.085', '420.328', '0.313591', '4820:0 4822:0 4846:0 '),\n+('4822', 'ic1090', '571', '210', '4506', '77', '80', '0', '6968.03', '622.605', '462.269', '4.11884', '4821:0 4823:0 4825:0 '),\n+('4823', 'ic1091', '571', '210', '4506', '77', '80', '0', '6892.8', '465.906', '471.697', '4.29869', '4822:0 '),\n+('4824', 'ic1092', '571', '210', '4506', '77', '80', '0', '6802.58', '551.703', '425.103', '0.960751', '4819:0 '),\n+('4825', 'ic1093', '571', '210', '4506', '77', '80', '0', '7175.08', '588.447', '498.301', '5.6747', '4822:0 4826:0 4827:0 '),\n+('4826', 'ic1094', '571', '210', '4506', '77', '80', '0', '7078.72', '503.754', '527.049', '0.380329', '4825:0 '),\n+('4827', 'ic1095', '571', '210', '4593', '77', '80', '0', '7262.77', '707.458', '487.068', '0.969396', '4825:0 4828:0 '),\n+('4828', 'ic1096', '571', '210', '210', '77', '80', '0', '7380.79', '847.639', '456.611', '1.04794', '4827:0 4829:0 '),\n+('4829', 'ic1097', '571', '210', '4533', '77', '80', '0', '7556.82', '768.81', '478.284', '6.18915', '4828:0 4830:0 4831:0 '),\n+('4830', 'ic1098', '571', '210', '4533', '77', '80', '0', '7584.83', '947.602', '480.255', '1.08485', '4829:0 4831:0 '),\n+('4831', 'ic1099', '571', '210', '4533', '77', '80', '0', '7712.14', '808.936', '478.443', '2.68156', '4830:0 4829:0 4832:0 '),\n+('4832', 'ic1100', '571', '210', '4533', '77', '80', '0', '7860.07', '894.491', '452.788', '0.0928901', '4831:0 4833:0 4842:0 4845:0 '),\n+('4833', 'ic1101', '571', '210', '4533', '77', '80', '0', '8034.56', '793.581', '473.244', '0.0151296', '4832:0 4834:0 '),\n+('4834', 'ic1102', '571', '210', '4658', '77', '80', '0', '8220.62', '796.211', '504.283', '0.00650024', '4833:0 4835:0 '),\n+('4835', 'ic1103', '571', '210', '4658', '77', '80', '0', '8374.24', '796.938', '547.919', '6.10983', '4834:0 4836:0 4841:0 '),\n+('4836', 'ic1104', '571', '210', '4669', '77', '80', '0', '8423.03', '930.654', '544.674', '1.16574', '4835:0 4837:0 '),\n+('4837', 'ic1105', '571', '210', '4658', '77', '80', '1', '8522.2', '1039.69', '548.104', '0.757338', '4836:0 4838:0 '),\n+('4838', 'ic1106', '571', '210', '4658', '77', '80', '0', '8609.95', '905.31', '545.094', '5.03776', '4837:0 4839:0 '),\n+('4839', 'ic1107', '571', '210', '4658', '77', '80', '3', '8585.78', '716.794', '547.469', '4.14555', '4838:0 4840:0 '),\n+('4840', 'ic1108', '571', '210', '4658', '77', '80', '0', '8489.61', '581.224', '559.708', '4.17226', '4839:0 4841:0 '),\n+('4841', 'ic1109', '571', '210', '4658', '77', '80', '5', '8440.59', '706.692', '547.293', '2.35563', '4840:0 4835:0 '),\n+('4842', 'ic1110', '571', '210', '4533', '77', '80', '0', '7765.83', '995.585', '447.266', '2.83001', '4832:0 4843:0 '),\n+('4843', 'ic1111', '571', '210', '4533', '77', '80', '0', '7711.5', '1167.13', '440.596', '0.808391', '4842:0 4844:0 '),\n+('4844', 'ic1112', '571', '210', '4533', '77', '80', '0', '7859.21', '1231.56', '441.972', '0.590053', '4843:0 4845:0 4875:0 '),\n+('4845', 'ic1113', '571', '210', '4533', '77', '80', '0', '7895.54', '1042.03', '450.717', '4.64349', '4844:0 4832:0 '),\n+('4846', 'ic1114', '571', '210', '4508', '77', '80', '0', '6955.49', '874.331', '402.675', '1.29769', '4821:0 4847:0 '),\n+('4847', 'ic1115', '571', '210', '4508', '77', '80', '0', '7020.59', '1065.06', '402.857', '1.32832', '4846:0 4848:0 '),\n+('4848', 'ic1116', '571', '210', '4508', '77', '80', '0', '6957.22', '1339.68', '398.602', '1.97863', '4847:0 4849:0 '),\n+('4849', 'ic1117', '571', '210', '4508', '77', '80', '0', '6833.49', '1460.28', '390.712', '1.81761', '4848:0 4850:0 '),\n+('4850', 'ic1118', '571', '210', '210', '77', '80', '0', '6826.51', '1619.37', '389.033', '4.69297', '4849:0 '),\n+('4851', 'ic1119', '571', '210', '4507', '77', '80', '0', '6666.86', '830.852', '365.983', '2.48285', '4820:0 4852:0 '),\n+('4852', 'ic1120', '571', '210', '4507', '77', '80', '0', '6599.05', '917.605', '308.63', '2.05873', '4851:0 4853:0 '),\n+('4853', 'ic1121', '571', '210', '4507', '77', '80', '0', '6597.42', '1025.81', '280.105', '1.11625', '4852:0 4854:0 4858:0 '),\n+('4854', 'ic1122', '571', '210', '4507', '77', '80', '0', '6559.27', '1194.84', '276.689', '2.19853', '4853:0 4855:0 '),\n+('4855', 'ic1123', '571', '210', '4507', '77', '80', '0', '6688.4', '1234.6', '276.432', '6.14281', '4854:0 4856:0 '),\n+('4856', 'ic1124', '571', '210', '4507', '77', '80', '0', '6863.13', '1227.79', '282.996', '5.66451', '4855:0 4857:0 4859:0 '),\n+('4857', 'ic1125', '571', '210', '4507', '77', '80', '0', '6896.72', '1042.62', '305.673', '4.53274', '4856:0 4858:0 4859:0 '),\n+('4858', 'ic1126', '571', '210', '4507', '77', '80', '0', '6726.14', '1037', '288.797', '3.31459', '4857:0 4853:0 '),\n+('4859', 'ic1127', '571', '210', '4508', '77', '80', '0', '7001.55', '1212.52', '307.249', '0.331647', '4857:0 4856:0 4860:0 4861:0 '),\n+('4860', 'ic1128', '571', '210', '4537', '77', '80', '0', '7135.37', '1189.66', '298.703', '5.1862', '4859:0 4869:0 '),\n+('4861', 'ic1129', '571', '210', '4508', '77', '80', '0', '7048.99', '1354.24', '304.707', '4.93802', '4859:0 4862:0 '),\n+('4862', 'ic1130', '571', '210', '4537', '77', '80', '0', '7186.05', '1411.54', '315.97', '0.428269', '4861:0 4863:0 4957:0 '),\n+('4863', 'ic1131', '571', '210', '4537', '77', '80', '0', '7349.91', '1448.05', '320.323', '0.242915', '4862:0 4864:0 4957:0 '),\n+('4864', 'ic1132', '571', '210', '4537', '77', '80', '0', '7474.88', '1490.17', '330.932', '0.611267', '4863:0 4865:0 '),\n+('4865', 'ic1133', '571', '210', '4537', '77', '80', '0', '7573.73', '1609.11', '345.106', '1.19325', '4864:0 4866:0 4870:0 '),\n+('4866', 'ic1134', '571', '210', '4537', '77', '80', '0', '7721.75', '1522.15', '349.093', '5.66688', '4865:0 4867:0 4874:0 '),\n+('4867', 'ic1135', '571', '210', '4537', '77', '80', '0', '7720.3', '1336.02', '354.115', '4.43774', '4866:0 4868:0 4876:0 '),\n+('4868', 'ic1136', '571', '210', '4537', '77', '80', '0', '7534.59', '1265.76', '334.056', '2.73578', '4867:0 4869:0 '),\n+('4869', 'ic1137', '571', '210', '4537', '77', '80', '0', '7314', '1220.63', '315.76', '3.35624', '4868:0 4860:0 '),\n+('4870', 'ic1138', '571', '210', '4509', '77', '80', '0', '7577.1', '1786.78', '359.583', '1.47521', '4865:0 4871:0 '),\n+('4871', 'ic1139', '571', '210', '4509', '77', '80', '0', '7669.29', '1945.97', '367.174', '1.15084', '4870:0 4872:0 4881:0 '),\n+('4872', 'ic1140', '571', '210', '4509', '77', '80', '0', '7873.9', '1929.78', '365.964', '6.20016', '4871:0 4873:0 4877:0 '),\n+('4873', 'ic1141', '571', '210', '4509', '77', '80', '0', '7887.76', '1725.17', '368.82', '4.09059', '4872:0 4874:0 '),\n+('4874', 'ic1142', '571', '210', '4509', '77', '80', '0', '7765', '1638.88', '350.579', '4.75974', '4873:0 4866:0 '),\n+('4875', 'ic1143', '571', '210', '210', '77', '80', '0', '7920.44', '1374.41', '452.53', '1.61423', '4844:0 4876:0 '),\n+('4876', 'ic1144', '571', '210', '4537', '77', '80', '0', '7822.59', '1365.97', '388.481', '3.40023', '4875:0 4867:0 '),\n+('4877', 'ic1145', '571', '210', '4510', '77', '80', '0', '7809.24', '2060.92', '392.033', '1.58203', '4872:0 4878:0 '),\n+('4878', 'ic1146', '571', '210', '4540', '77', '80', '0', '7858.11', '2248.57', '376.618', '1.4603', '4877:0 4879:0 '),\n+('4879', 'ic1147', '571', '210', '4540', '77', '80', '0', '7823.2', '2412.9', '388.323', '1.80744', '4878:0 4880:0 '),\n+('4880', 'ic1148', '571', '210', '4540', '77', '80', '0', '7793.72', '2597.47', '402.105', '1.67392', '4879:0 4892:0 '),\n+('4881', 'ic1149', '571', '210', '4510', '77', '80', '0', '7699.75', '2069.29', '391.653', '1.65822', '4871:0 4882:0 '),\n+('4882', 'ic1150', '571', '210', '4540', '77', '80', '0', '7652.21', '2249.08', '368.676', '2.35408', '4881:0 4883:0 '),\n+('4883', 'ic1151', '571', '210', '4540', '77', '80', '0', '7521.07', '2342.93', '375.359', '2.52294', '4882:0 4884:0 '),\n+('4884', 'ic1152', '571', '210', '4523', '77', '80', '0', '7369.4', '2442.13', '391.045', '2.44441', '4883:0 4885:0 4893:0 '),\n+('4885', 'ic1153', '571', '210', '4523', '77', '80', '0', '7198.45', '2497.03', '404.398', '2.97341', '4884:0 4886:0 4893:0 '),\n+('4886', 'ic1154', '571', '210', '4523', '77', '80', '0', '7035.47', '2497.06', '410.594', '3.37789', '4885:0 4887:0 '),\n+('4887', 'ic1155', '571', '210', '4523', '77', '80', '0', '7014.72', '2665.38', '400.29', '1.87621', '4886:0 4888:0 '),\n+('4888', 'ic1156', '571', '210', '4523', '77', '80', '0', '7013.48', '2866.37', '424.885', '1.59347', '4887:0 4889:0 '),\n+('4889', 'ic1157', '571', '210', '4523', '77', '80', '0', '7165.04', '2990.37', '441.491', '6.14878', '4888:0 4890:0 '),\n+('4890', 'ic1158', '571', '210', '4523', '77', '80', '0', '7332.14', '2917.95', '423.697', '5.78906', '4889:0 4891:0 4893:0 4894:0 '),\n+('4891', 'ic1159', '571', '210', '4540', '77', '80', '0', '7502.18', '2817.76', '419.764', '5.68225', '4890:0 4892:0 4893:0 '),\n+('4892', 'ic1160', '571', '210', '4516', '77', '80', '0', '7710.23', '2726.49', '412.219', '5.21495', '4891:0 4880:0 4963:0 '),\n+('4893', 'ic1161', '571', '210', '4523', '77', '80', '0', '7307.93', '2711.18', '396.859', '4.63376', '4891:0 4884:0 4885:0 4890:0 '),\n+('4894', 'ic1162', '571', '210', '210', '77', '80', '0', '7358.64', '3080.68', '476.932', '1.77884', '4890:0 4895:0 '),\n+('4895', 'ic1163', '571', '210', '210', '77', '80', '0', '7199', '3207.31', '545.531', '1.97125', '4894:0 4896:0 '),\n+('4896', 'ic1164', '571', '210', '210', '77', '80', '0', '7139.56', '3362.03', '669.633', '2.10878', '4895:0 4897:0 '),\n+('4897', 'ic1165', '571', '210', '4531', '77', '80', '0', '6985.22', '3466.47', '708.57', '2.8337', '4896:0 4898:0 4928:0 '),\n+('4898', 'ic1166', '571', '210', '4531', '77', '80', '0', '6890.27', '3530.05', '708.606', '5.39253', '4897:0 4899:0 '),\n+('4899', 'ic1167', '571', '210', '4531', '77', '80', '0', '6830.55', '3590.9', '740.056', '5.22131', '4898:0 4900:0 '),\n+('4900', 'ic1168', '571', '210', '4496', '77', '80', '0', '6868.76', '3731.57', '755.294', '4.54431', '4899:0 4901:0 '),\n+('4901', 'ic1169', '571', '210', '4496', '77', '80', '0', '7002.18', '3880.5', '610.484', '1.63677', '4900:0 4902:0 4903:0 4905:0 '),\n+('4902', 'ic1170', '571', '210', '4496', '77', '80', '0', '6831.56', '3987.86', '615.968', '2.45046', '4901:0 4903:0 '),\n+('4903', 'ic1171', '571', '210', '4496', '77', '80', '0', '6897.56', '3919.65', '615.975', '4.57026', '4902:0 4901:0 4904:0 '),\n+('4904', 'ic1172', '571', '210', '4528', '77', '80', '0', '6814.18', '3788.63', '621.07', '1.05954', '4903:0 '),\n+('4905', 'ic1173', '571', '210', '4496', '77', '80', '0', '7138.52', '3955.81', '581.785', '5.65333', '4901:0 4906:0 4974:0 4976:0 '),\n+('4906', 'ic1174', '571', '210', '4498', '77', '80', '0', '7284.9', '3836.51', '604.369', '5.59993', '4905:0 4907:0 '),\n+('4907', 'ic1175', '571', '210', '4498', '77', '80', '0', '7410.57', '3732.09', '627.678', '5.65962', '4906:0 4908:0 '),\n+('4908', 'ic1176', '571', '210', '4526', '77', '80', '0', '7512.15', '3660.34', '623.332', '6.01697', '4907:0 4909:0 4927:0 '),\n+('4909', 'ic1177', '571', '210', '4526', '77', '80', '0', '7593.36', '3544.42', '655.937', '5.07214', '4908:0 4910:0 '),\n+('4910', 'ic1178', '571', '210', '4526', '77', '80', '0', '7671', '3432.93', '656.192', '2.35151', '4909:0 4911:0 '),\n+('4911', 'ic1179', '571', '210', '4526', '77', '80', '0', '7795.77', '3500.91', '658.351', '0.992774', '4910:0 4912:0 4913:0 4925:0 '),\n+('4912', 'ic1180', '571', '210', '4526', '77', '80', '0', '7883.18', '3469.31', '671.838', '6.04917', '4911:0 '),\n+('4913', 'ic1181', '571', '210', '4526', '77', '80', '0', '7919.33', '3582.64', '631.477', '0.58594', '4911:0 4914:0 '),\n+('4914', 'ic1182', '571', '210', '4524', '77', '80', '0', '8041.43', '3526.53', '654.716', '6.08922', '4913:0 4915:0 4922:0 '),\n+('4915', 'ic1183', '571', '210', '4524', '77', '80', '0', '8187.82', '3610.43', '658.019', '0.290628', '4914:0 4916:0 '),\n+('4916', 'ic1184', '571', '210', '4524', '77', '80', '0', '8317.43', '3535.48', '657.912', '4.87265', '4915:0 4917:0 '),\n+('4917', 'ic1185', '571', '210', '4524', '77', '80', '0', '8248.7', '3338.48', '654.291', '5.09882', '4916:0 4918:0 4922:0 '),\n+('4918', 'ic1186', '571', '210', '4496', '77', '80', '0', '8311.26', '3170.17', '618.951', '5.16165', '4917:0 4919:0 '),\n+('4919', 'ic1187', '571', '210', '4497', '77', '80', '0', '8430.96', '3102.38', '588.141', '4.91819', '4918:0 4920:0 '),\n+('4920', 'ic1188', '571', '210', '4492', '77', '80', '0', '8426.9', '2947.18', '602.293', '4.77996', '4919:0 4921:0 '),\n+('4921', 'ic1189', '571', '210', '4492', '77', '80', '0', '8429.04', '2879.47', '606.259', '1.76717', '4920:0 '),\n+('4922', 'ic1190', '571', '210', '4524', '77', '80', '0', '8105.02', '3418.73', '672.247', '3.83984', '4914:0 4917:0 4923:0 '),\n+('4923', 'ic1191', '571', '210', '4525', '77', '80', '0', '7990.63', '3300.15', '676.112', '3.81628', '4922:0 4924:0 '),\n+('4924', 'ic1192', '571', '210', '4525', '77', '80', '0', '7944.78', '3251.88', '632.818', '3.79665', '4923:0 '),\n+('4925', 'ic1193', '571', '210', '4526', '77', '80', '0', '7848.54', '3632.5', '653.393', '4.16107', '4911:0 4926:0 '),\n+('4926', 'ic1194', '571', '210', '4526', '77', '80', '0', '7717.96', '3673.53', '653.297', '3.444', '4925:0 4927:0 '),\n+('4927', 'ic1195', '571', '210', '4526', '77', '80', '0', '7617.43', '3670.12', '634.89', '3.02774', '4926:0 4908:0 '),\n+('4928', 'ic1196', '571', '210', '4531', '77', '80', '0', '6853.09', '3478.09', '692.779', '3.04894', '4897:0 4929:0 4930:0 4931:0 '),\n+('4929', 'ic1197', '571', '210', '4531', '77', '80', '0', '6714.63', '3539.45', '668.964', '2.71907', '4928:0 4931:0 '),\n+('4930', 'ic1198', '571', '210', '4531', '77', '80', '0', '6719.14', '3429.9', '682.197', '3.43144', '4928:0 4931:0 4978:0 '),\n+('4931', 'ic1199', '571', '210', '4531', '77', '80', '0', '6774.33', '3483.53', '672.159', '3.05053', '4928:0 4930:0 4929:0 4932:0 '),\n+('4932', 'ic1200', '571', '210', '4531', '77', '80', '0', '6549.04', '3449.66', '598.005', '3.34505', '4931:0 4933:0 '),\n+('4933', 'ic1201', '571', '210', '4531', '77', '80', '0', '6461.08', '3286.15', '631.506', '5.01716', '4932:0 4934:0 '),\n+('4934', 'ic1202', '571', '210', '4531', '77', '80', '0', '6452.51', '3119.45', '657.481', '1.45066', '4933:0 4935:0 '),\n+('4935', 'ic1203', '571', '210', '4518', '77', '80', '0', '6526.9', '3000.14', '651.117', '4.87342', '4934:0 4936:0 '),\n+('4936', 'ic1204', '571', '210', '4518', '77', '80', '0', '6547.7', '2810.28', '651.117', '4.72026', '4935:0 4937:0 '),\n+('4937', 'ic1205', '571', '210', '4518', '77', '80', '0', '6524.74', '2581.76', '651.117', '4.51292', '4936:0 4938:0 '),\n+('4938', 'ic1206', '571', '210', '4518', '77', '80', '0', '6630.74', '2328.4', '651.585', '5.06506', '4937:0 4939:0 '),\n+('4939', 'ic1207', '571', '210', '4518', '77', '80', '0', '6619.16', '2134.02', '651.118', '4.86635', '4938:0 4940:0 '),\n+('4940', 'ic1208', '571', '210', '4520', '77', '80', '0', '6609.61', '1940.41', '652.242', '3.77073', '4939:0 4941:0 4944:0 '),\n+('4941', 'ic1209', '571', '210', '4520', '77', '80', '0', '6436.2', '1960.49', '631.376', '3.19739', '4940:0 4942:0 '),\n+('4942', 'ic1210', '571', '210', '4520', '77', '80', '0', '6238.67', '1930.65', '631.948', '3.56731', '4941:0 4943:0 '),\n+('4943', 'ic1211', '571', '210', '4520', '77', '80', '0', '6075.08', '1919.83', '632.648', '3.19032', '4942:0 '),\n+('4944', 'ic1212', '571', '210', '4520', '77', '80', '0', '6546.79', '1812.75', '629.551', '4.65274', '4940:0 4945:0 4946:0 '),\n+('4945', 'ic1213', '571', '210', '4520', '77', '80', '0', '6556.05', '1624.57', '633.228', '4.76113', '4944:0 4946:0 '),\n+('4946', 'ic1214', '571', '210', '4520', '77', '80', '0', '6590.03', '1684.23', '628.876', '3.70395', '4945:0 4944:0 4947:0 '),\n+('4947', 'ic1215', '571', '210', '4513', '77', '80', '0', '6728.5', '1651.46', '572.96', '1.13099', '4946:0 4948:0 '),\n+('4948', 'ic1216', '571', '210', '4513', '77', '80', '0', '6809.4', '1726.92', '556.264', '3.80763', '4947:0 4949:0 4950:0 '),\n+('4949', 'ic1217', '571', '210', '4513', '77', '80', '0', '6812.51', '1821.36', '578.354', '4.77131', '4948:0 '),\n+('4950', 'ic1218', '571', '210', '4513', '77', '80', '0', '6952.4', '1697.92', '518.536', '2.9209', '4948:0 4951:0 '),\n+('4951', 'ic1219', '571', '210', '4513', '77', '80', '0', '7031.52', '1779.42', '506.019', '1.12469', '4950:0 4952:0 4954:0 '),\n+('4952', 'ic1220', '571', '210', '4514', '77', '80', '0', '7025.43', '1902.07', '528.077', '5.0187', '4951:0 4953:0 '),\n+('4953', 'ic1221', '571', '210', '4514', '77', '80', '0', '6960.52', '2014.43', '520.864', '4.66919', '4952:0 '),\n+('4954', 'ic1222', '571', '210', '4513', '77', '80', '0', '7201.98', '1696.05', '469.261', '2.30668', '4951:0 4955:0 4958:0 4959:0 '),\n+('4955', 'ic1223', '571', '210', '210', '77', '80', '0', '7348.32', '1642.76', '429.984', '1.78832', '4954:0 4956:0 '),\n+('4956', 'ic1224', '571', '210', '210', '77', '80', '0', '7214.66', '1585.03', '379.979', '5.44591', '4955:0 4957:0 '),\n+('4957', 'ic1225', '571', '210', '4537', '77', '80', '0', '7281.16', '1492.2', '326.379', '1.64772', '4956:0 4863:0 4862:0 4958:0 '),\n+('4958', 'ic1226', '571', '210', '210', '77', '80', '0', '7331.27', '1765.54', '456.844', '3.80914', '4957:0 4954:0 '),\n+('4959', 'ic1227', '571', '210', '4513', '77', '80', '0', '7136.03', '1876.5', '532.96', '4.77911', '4954:0 4960:0 '),\n+('4960', 'ic1228', '571', '210', '4513', '77', '80', '0', '7224.2', '1973.83', '570.931', '1.27072', '4959:0 4961:0 4962:0 '),\n+('4961', 'ic1229', '571', '210', '4513', '77', '80', '1', '7242.67', '2168.33', '565.646', '4.69493', '4960:0 '),\n+('4962', 'ic1230', '571', '210', '4513', '77', '80', '0', '7100.09', '2122.12', '621.203', '4.3801', '4960:0 '),\n+('4963', 'ic1231', '571', '210', '4540', '77', '80', '0', '7682.15', '2851.03', '469.055', '2.77003', '4892:0 4964:0 '),\n+('4964', 'ic1232', '571', '210', '4517', '77', '80', '0', '7685.31', '3002.19', '541.332', '0.921987', '4963:0 4965:0 '),\n+('4965', 'ic1233', '571', '210', '4517', '77', '80', '0', '7702.82', '3078.43', '557.351', '5.63045', '4964:0 4966:0 4973:0 '),\n+('4966', 'ic1234', '571', '210', '4517', '77', '80', '0', '7843.82', '2935.68', '517.933', '0.541764', '4965:0 4967:0 '),\n+('4967', 'ic1235', '571', '210', '4517', '77', '80', '0', '7934.47', '2994.97', '541.057', '3.56948', '4966:0 4968:0 '),\n+('4968', 'ic1236', '571', '210', '4517', '77', '80', '0', '8021.28', '2971.58', '563.405', '2.3317', '4967:0 4969:0 '),\n+('4969', 'ic1237', '571', '210', '4517', '77', '80', '0', '8106.95', '2852.61', '559.292', '5.73169', '4968:0 4970:0 4979:0 '),\n+('4970', 'ic1238', '571', '210', '4477', '77', '80', '0', '8243', '2776.54', '640.775', '6.08434', '4969:0 4971:0 '),\n+('4971', 'ic1239', '571', '210', '4477', '77', '80', '0', '8383.84', '2730.79', '655.094', '5.79375', '4970:0 4972:0 '),\n+('4972', 'ic1240', '571', '210', '4477', '77', '80', '1', '8508.77', '2673.5', '652.354', '5.83302', '4971:0 '),\n+('4973', 'ic1241', '571', '210', '4517', '77', '80', '0', '7575.23', '3170.11', '577.394', '5.58719', '4965:0 '),\n+('4974', 'ic1242', '571', '210', '4496', '77', '80', '0', '6971.39', '3981.75', '552.612', '5.94612', '4905:0 4975:0 '),\n+('4975', 'ic1243', '571', '210', '4496', '77', '80', '0', '6934.59', '4194.33', '535.202', '1.79686', '4974:0 '),\n+('4976', 'ic1244', '571', '210', '4496', '77', '80', '0', '7162.84', '4153.53', '633.939', '2.91213', '4905:0 4977:0 '),\n+('4977', 'ic1245', '571', '210', '4496', '77', '80', '0', '7019.95', '4225.08', '665.892', '2.06625', '4976:0 '),\n+('4978', 'ic1246', '571', '210', '4531', '77', '80', '0', '6545.08', '3321.6', '665.004', '4.0596', '4930:0 '),\n+('4979', 'ic1247', '571', '210', '210', '77', '80', '0', '8061.74', '2755.35', '542.008', '4.48453', '4969:0 4980:0 '),\n+('4980', 'ic1248', '571', '210', '210', '77', '80', '0', '8077.07', '2597.13', '519.549', '4.54375', '4979:0 4981:0 '),\n+('4981', 'ic1249', '571', '210', '4510', '77', '80', '0', '8103.98', '2410.6', '490.587', '4.97494', '4980:0 4982:0 '),\n+('4982', 'ic1250', '571', '210', '4510', '77', '80', '0', '8060.18', '2339.25', '484.62', '3.25413', '4981:0 4983:0 '),\n+('4983', 'ic1251', '571', '210', '4510', '77', '80', '0', '7982.84', '2214.78', '500.312', '4.5092', '4982:0 4984:0 4985:0 '),\n+('4984', 'ic1252', '571', '210', '4510', '77', '80', '0', '8163.01', '2189.09', '499.737', '3.33032', '4983:0 '),\n+('4985', 'ic1253', '571', '210', '4510', '77', '80', '0', '7986.6', '2067', '499.729', '3.00752', '4983:0 4986:0 4989:0 '),\n+('4986', 'ic1254', '571', '210', '4510', '77', '80', '0', '8120.19', '1962.29', '501.671', '5.88521', '4985:0 4987:0 '),\n+('4987', 'ic1255', '571', '210', '4510', '77', '80', '0', '8204.78', '1874.81', '514.771', '1.36602', '4986:0 4988:0 '),\n+('4988', 'ic1256', '571', '210', '4510', '77', '80', '0', '8179.12', '2049.72', '550.596', '2.65329', '4987:0 '),\n+('4989', 'ic1257', '571', '210', '4510', '77', '80', '0', '7751.59', '2060.95', '499.864', '3.22507', '4985:0 4990:0 '),\n+('4990', 'ic1258', '571', '210', '4510', '77', '80', '0', '7549.16', '2067.17', '500.312', '3.28947', '4989:0 4991:0 4992:0 '),\n+('4991', 'ic1259', '571', '210', '4510', '77', '80', '0', '7438.58', '2146.13', '500.312', '2.65644', '4990:0 '),\n+('4992', 'ic1260', '571', '210', '4510', '77', '80', '0', '7492.17', '1991.36', '500.301', '0.996881', '4990:0 '),\n+('4993', 'WarsongGulchSpawnA1', '489', '3277', '4571', '10', '80', '251', '1535.77', '1481.37', '352.109', '0.188495', '4996:0 5020:0 '),\n+('4994', 'WarsongGulchAInside1', '489', '3277', '3321', '10', '80', '0', '1479.77', '1456.5', '362.546', '6.24394', '4995:0 5020:0 5000:0 '),\n+('4995', 'WarsongGulchAInside2', '489', '3277', '4571', '10', '80', '32', '1530.85', '1468.31', '362.665', '3.14825', '4993:0 '),\n+('4996', 'WarsongGulchAInside3', '489', '3277', '3321', '10', '80', '0', '1471.13', '1454.77', '342.795', '6.27608', '4997:0 5001:0 4993:0 '),\n+('4997', 'WarsongGulchAInside4', '489', '3277', '3321', '10', '80', '36', '1522.96', '1457.18', '373.688', '1.69647', '4995:0 '),\n+('4998', 'WarsongGulchAInside5', '489', '3277', '3321', '10', '80', '34', '1397.56', '1566.08', '343.126', '4.09978', '5018:0 '),\n+('4999', 'WarsongGulchAInside6', '489', '3277', '3321', '10', '80', '34', '1422.41', '1527.05', '342.47', '3.08073', '5017:0 '),\n+('5000', 'WarsongGulchAInside7', '489', '3277', '3321', '10', '80', '0', '1398.06', '1394.26', '337.292', '3.63638', '5012:0 4994:0 5011:0 5013:0 5014:0 5022:0 '),\n+('5001', 'WarsongGulchAInside8', '489', '3277', '3321', '10', '80', '0', '1350.63', '1462.19', '323.48', '6.23998', '4996:0 5011:0 5012:0 5013:0 5014:0 5022:0 '),\n+('5002', 'WarsongGulchSpawnH1', '489', '3277', '4572', '10', '80', '253', '919.418', '1434.62', '345.695', '3.13216', '5005:0 5019:0 '),\n+('5003', 'WarsongGulchHInside1', '489', '3277', '3320', '10', '80', '0', '974.016', '1460.64', '356.184', '6.0456', '5004:0 5009:0 5019:0 '),\n+('5004', 'WarsongGulchHInside2', '489', '3277', '4572', '10', '80', '32', '925.907', '1451.62', '355.856', '5.79629', '5002:0 '),\n+('5005', 'WarsongGulchHInside3', '489', '3277', '3320', '10', '80', '0', '983.244', '1461.02', '336.019', '0.412332', '5006:0 5002:0 5010:0 '),\n+('5006', 'WarsongGulchHInside4', '489', '3277', '3320', '10', '80', '34', '931.587', '1460.23', '367.604', '1.31163', '5004:0 '),\n+('5007', 'WarsongGulchHInside5', '489', '3277', '3320', '10', '80', '36', '1071.48', '1375.61', '339.77', '5.94986', '5016:0 '),\n+('5008', 'WarsongGulchHInside6', '489', '3277', '3320', '10', '80', '36', '1056.79', '1399.58', '338.281', '6.09319', '5015:0 '),\n+('5009', 'WarsongGulchHInside7', '489', '3277', '3320', '10', '80', '0', '1047.02', '1538', '333.504', '0.447699', '5013:0 5003:0 5011:0 5012:0 5014:0 5023:0 '),\n+('5010', 'WarsongGulchHInside8', '489', '3277', '3320', '10', '80', '0', '1124.69', '1463.21', '315.869', '3.32571', '5005:0 5011:0 5012:0 5013:0 5014:0 5023:0 '),\n+('5011', 'WarsongGulchMid1', '489', '3277', '3277', '10', '80', '0', '1236.54', '1542.18', '306.233', '4.86553', '5001:0 5010:0 5023:0 5009:0 '),\n+('5012', 'WarsongGulchMid2', '489', '3277', '3277', '10', '80', '0', '1226.74', '1479.78', '307.286', '3.2221', '5001:0 5022:0 5010:0 5023:0 5009:0 '),\n+('5013', 'WarsongGulchMid3', '489', '3277', '3277', '10', '80', '0', '1263.56', '1400.5', '310.369', '3.07681', '5000:0 5001:0 5022:0 5010:0 5023:0 '),\n+('5014', 'WarsongGulchMid4', '489', '3277', '3277', '10', '80', '0', '1225.87', '1335.88', '312.589', '0.771655', '5000:0 5001:0 5022:0 5010:0 '),\n+('5015', 'WarsongGulchCliffH1', '489', '3277', '3320', '10', '80', '36', '1069.83', '1398.92', '324.032', '3.19735', '5010:0 5012:0 5013:0 5014:0 5024:0 '),\n+('5016', 'WarsongGulchCliffH2', '489', '3277', '3320', '10', '80', '36', '1081.68', '1369.7', '321.199', '2.78226', '5010:0 5012:0 5013:0 5014:0 5024:0 '),\n+('5017', 'WarsongGulchCliffA1', '489', '3277', '3321', '10', '80', '34', '1406.26', '1532.45', '324.559', '6.09621', '5001:0 5011:0 5012:0 5013:0 5021:0 '),\n+('5018', 'WarsongGulchCliffA2', '489', '3277', '3321', '10', '80', '34', '1385.08', '1571.34', '321.478', '5.74278', '5001:0 5011:0 5012:0 5013:0 5021:0 '),\n+('5019', 'WarsongGulchHInside9', '489', '3277', '3320', '10', '80', '0', '956.507', '1421.77', '345.527', '2.11349', '5007:0 5008:0 5002:0 5003:0 '),\n+('5020', 'WarsongGulchAInside9', '489', '3277', '3321', '10', '80', '0', '1500.52', '1493.83', '352.198', '4.62677', '4998:0 4999:0 4993:0 4994:0 '),\n+('5021', 'WarsongGulchBuffNW', '489', '3277', '3277', '10', '80', '2048', '1318.7', '1550.35', '313.235', '2.83923', '5011:0 5012:0 5013:0 '),\n+('5022', 'WarsongGulchBuffNE', '489', '3277', '3277', '10', '80', '4096', '1320.61', '1380.27', '314.891', '4.10568', '5000:0 5001:0 5012:0 5013:0 5014:0 '),\n+('5023', 'WarsongGulchBuffSW', '489', '3277', '3277', '10', '80', '16384', '1138.3', '1558.94', '306.906', '0.653861', '5010:0 5011:0 5012:0 5013:0 5009:0 '),\n+('5024', 'WarsongGulchBuffSE', '489', '3277', '3277', '10', '80', '8192', '1111.58', '1352.73', '316.565', '2.66841', '5012:0 5013:0 5014:0 '),\n+('5025', 'ArathiBasinSpawnA', '529', '3358', '3417', '20', '80', '3', '1289.51', '1286.41', '-14.466', '3.89804', '5026:0 '),\n+('5026', 'ArathiBasinStartA', '529', '3358', '3358', '20', '80', '0', '1241.32', '1228.52', '-40.2271', '4.12149', '5040:0 5027:0 '),\n+('5027', 'ArathiBasinStables', '529', '3358', '3424', '20', '80', '128', '1168.45', '1204.15', '-56.582', '6.24992', '5026:0 5028:0 '),\n+('5028', 'ArathiBasinStablesBridge', '529', '3358', '3358', '20', '80', '0', '1088.6', '1223.56', '-53.4783', '0.143443', '5029:0 5027:0 5032:0 '),\n+('5029', 'ArathiBasinMillLow1', '529', '3358', '3358', '20', '80', '0', '988.277', '1179.75', '-50.2717', '5.04236', '5028:0 5030:0 5045:0 '),\n+('5030', 'ArathiBasinMillLow2', '529', '3358', '3358', '20', '80', '0', '890.451', '1109.94', '-56.335', '4.04097', '5029:0 5031:0 '),\n+('5031', 'ArathiBasinMillLow3', '529', '3358', '3358', '20', '80', '0', '845.513', '978.663', '-60.2139', '0.977914', '5030:0 5037:0 5044:0 '),\n+('5032', 'ArathiBasinMillUp1', '529', '3358', '3358', '20', '80', '0', '939.139', '1227.33', '-23.8137', '3.6404', '5028:0 5033:0 '),\n+('5033', 'ArathiBasinMill', '529', '3358', '3422', '20', '80', '136', '852.619', '1151.8', '11.5342', '0.752077', '5034:0 5032:0 '),\n+('5034', 'ArathiBasinMillUp2', '529', '3358', '3422', '20', '80', '0', '783.565', '1047.78', '-26.1072', '1.57478', '5033:0 5037:0 '),\n+('5035', 'ArathiBasinSpawnH', '529', '3358', '3418', '20', '80', '5', '704.074', '704.457', '-16.4305', '0.79572', '5036:0 '),\n+('5036', 'ArathiBasinStartH', '529', '3358', '3358', '20', '80', '0', '748.646', '759.099', '-41.5104', '0.818832', '5038:0 5037:0 '),\n+('5037', 'ArathiBasinFarm', '529', '3358', '3420', '20', '80', '128', '809.5', '872.547', '-56.7509', '1.20759', '5034:0 5036:0 5031:0 '),\n+('5038', 'ArathiBasinFarmBridge', '529', '3358', '3420', '20', '80', '0', '864.499', '771.902', '-51.7236', '0.695112', '5036:0 5039:0 '),\n+('5039', 'ArathiBasinMineForkSE', '529', '3358', '3358', '20', '80', '0', '956.739', '804.522', '-61.6094', '0.524283', '5038:0 5041:0 5043:0 '),\n+('5040', 'ArathiBasinMineForkNW', '529', '3358', '3358', '20', '80', '0', '1221.3', '1088.37', '-59.7666', '4.47091', '5041:0 5026:0 5042:0 '),\n+('5041', 'ArathiBasinMine', '529', '3358', '3423', '20', '80', '136', '1151.72', '846.381', '-110.525', '2.55257', '5040:0 5039:0 '),\n+('5042', 'ArathiBasinMineUp1', '529', '3358', '3358', '20', '80', '0', '1156.61', '991.63', '-63.6154', '2.3307', '5040:0 5043:0 5045:0 '),\n+('5043', 'ArathiBasinMineUp2', '529', '3358', '3358', '20', '80', '0', '1040.93', '882.871', '-61.8051', '2.33458', '5039:0 5044:0 5042:0 '),\n+('5044', 'ArathiBasinBlacksmithForkS', '529', '3358', '3421', '20', '80', '0', '922.673', '999.161', '-55.5623', '5.49188', '5031:0 5043:0 5046:0 5045:0 '),\n+('5045', 'ArathiBasinBlacksmithForkN', '529', '3358', '3421', '20', '80', '0', '1050.68', '999.89', '-50.4064', '5.62341', '5029:0 5042:0 5044:0 5046:0 '),\n+('5046', 'ArathiBasinBlacksmith', '529', '3358', '3421', '20', '80', '136', '979.258', '1043.34', '-44.3749', '0.106003', '5044:0 5045:0 '),\n+('5047', 'AlteracValleySpawnA', '30', '2597', '2597', '50', '80', '3', '801.027', '-493.883', '99.6917', '3.08066', '5048:0 '),\n+('5048', 'AlteracValleyStartA1', '30', '2597', '3299', '50', '80', '2', '717.929', '-475.351', '75.1276', '2.10478', '5049:0 5087:0 '),\n+('5049', 'AlteracValleyStartA2', '30', '2597', '3299', '50', '80', '34', '664.972', '-400.377', '68.7491', '2.43269', '5050:0 5085:0 '),\n+('5050', 'AlteracValleyStartA3', '30', '2597', '3299', '50', '80', '2', '610.827', '-388.879', '66.5562', '3.30843', '5051:0 '),\n+('5051', 'AlteracValleyStartA4', '30', '2597', '2597', '50', '80', '2', '463.128', '-438.201', '33.0107', '2.75865', '5052:0 '),\n+('5052', 'AlteracValleyHubA1', '30', '2597', '2597', '50', '80', '0', '401.785', '-393.695', '-1.05733', '2.60355', '5053:0 5092:0 '),\n+('5053', 'AlteracValleyBunker2', '30', '2597', '3304', '50', '80', '0', '221.727', '-412.006', '41.1425', '2.14206', '5054:0 5055:0 5052:0 '),\n+('5054', 'AlteracValleyBunker2Inside', '30', '2597', '3304', '50', '80', '146', '204.453', '-359.47', '56.3831', '2.20687', '5053:0 '),\n+('5055', 'AlteracValleyGYA1', '30', '2597', '3302', '50', '80', '128', '76.8322', '-399.172', '45.7006', '1.69996', '5053:0 5056:0 5057:0 5058:0 '),\n+('5056', 'AlteracValleyBelinda', '30', '2597', '2958', '50', '80', '0', '-36.1268', '-290.741', '15.0786', '3.0354', '5055:0 '),\n+('5057', 'AlteracValleyCN', '30', '2597', '2597', '50', '80', '0', '-133.7', '-368.866', '8.47712', '6.00431', '5055:0 5060:0 5095:0 '),\n+('5058', 'AlteracValleyBunker1Inside', '30', '2597', '3305', '50', '80', '146', '-151.384', '-442.049', '40.3942', '1.08956', '5055:0 '),\n+('5059', 'AlteracValleyGYC', '30', '2597', '3301', '50', '80', '128', '-200.494', '-109.396', '78.5207', '4.95373', '5095:0 5094:0 '),\n+('5060', 'AlteracValleyCS1', '30', '2597', '3057', '50', '80', '0', '-262.759', '-292.49', '6.80088', '5.73925', '5057:0 5061:0 '),\n+('5061', 'AlteracValleyCS2', '30', '2597', '3057', '50', '80', '0', '-473.131', '-273.873', '24.7318', '3.74628', '5060:0 5062:0 5094:0 '),\n+('5062', 'AlteracValleyCS3', '30', '2597', '2597', '50', '80', '32', '-525.235', '-353.849', '37.0353', '4.37461', '5063:0 5061:0 '),\n+('5063', 'AlteracValleyCS4', '30', '2597', '2597', '50', '80', '0', '-601.467', '-320.914', '51.7167', '6.08664', '5062:0 5064:0 '),\n+('5064', 'AlteracValleyGYH1', '30', '2597', '2597', '50', '80', '128', '-615.967', '-397.593', '60.6924', '0.333583', '5063:0 5065:0 5066:0 5067:0 '),\n+('5065', 'AlteracValleyTower1Inside', '30', '2597', '2977', '50', '80', '148', '-569.205', '-264.746', '75.0088', '2.58769', '5064:0 '),\n+('5066', 'AlteracValleyGalvangar', '30', '2597', '2977', '50', '80', '0', '-536.858', '-168.875', '57.0098', '2.75262', '5064:0 '),\n+('5067', 'AlteracValleyTower2', '30', '2597', '2962', '50', '80', '0', '-715.985', '-350.671', '66.8321', '2.63482', '5064:0 5068:0 5069:0 '),\n+('5068', 'AlteracValleyTower2Inside', '30', '2597', '2962', '50', '80', '148', '-767.615', '-361.296', '90.8949', '4.27041', '5067:0 '),\n+('5069', 'AlteracValleyGYH2', '30', '2597', '2597', '50', '80', '128', '-1083.95', '-341.705', '55.3047', '0.111719', '5067:0 5072:0 5090:0 '),\n+('5070', 'AlteracValleyStartH1', '30', '2597', '2597', '50', '80', '4', '-1144.38', '-442.064', '56.7427', '0.904973', '5069:0 '),\n+('5071', 'AlteracValleySpawnH', '30', '2597', '2597', '50', '80', '5', '-1386.53', '-549.064', '55.0284', '0.628112', '5070:0 '),\n+('5072', 'AlteracValleyBaseH1', '30', '2597', '2961', '50', '80', '0', '-1241.61', '-363.466', '59.6773', '2.10074', '5069:0 5073:0 '),\n+('5073', 'AlteracValleyBaseH2', '30', '2597', '2961', '50', '80', '0', '-1210.4', '-252.908', '72.7007', '3.07856', '5072:0 5074:0 '),\n+('5074', 'AlteracValleyBaseH3', '30', '2597', '2978', '50', '80', '0', '-1286.08', '-289.551', '89.091', '3.10996', '5073:0 5075:0 '),\n+('5075', 'AlteracValleyGYH3', '30', '2597', '2978', '50', '80', '128', '-1404.13', '-312.526', '89.4075', '1.4783', '5074:0 5076:0 5077:0 5078:0 '),\n+('5076', 'AlteracValleyTower3Inside', '30', '2597', '2978', '50', '80', '148', '-1301.34', '-267.703', '114.151', '0.219693', '5075:0 '),\n+('5077', 'AlteracValleyTower4Inside', '30', '2597', '2978', '50', '80', '148', '-1304.35', '-313.854', '113.867', '5.07738', '5075:0 '),\n+('5078', 'AlteracValleyDrekthar', '30', '2597', '4407', '50', '80', '276', '-1367.71', '-227.007', '98.4255', '2.09366', '5075:0 '),\n+('5079', 'AlteracValleyGYA2', '30', '2597', '3303', '50', '80', '128', '664.375', '-295.432', '30.2906', '1.6334', '5080:0 5088:0 5092:0 '),\n+('5080', 'AlteracValleyBaseA1', '30', '2597', '2959', '50', '80', '0', '628.165', '-209.132', '39.032', '1.71587', '5081:0 5079:0 '),\n+('5081', 'AlteracValleyGYA3', '30', '2597', '2959', '50', '80', '128', '635.165', '-28.286', '46.6157', '4.25874', '5080:0 5082:0 5083:0 5084:0 '),\n+('5082', 'AlteracValleyBunker3Inside', '30', '2597', '2959', '50', '80', '146', '672.521', '-142.475', '63.6551', '4.09365', '5081:0 '),\n+('5083', 'AlteracValleyBunker4Inside', '30', '2597', '2959', '50', '80', '146', '555.611', '-77.7777', '51.9336', '1.81992', '5081:0 '),\n+('5084', 'AlteracValleyVanndar', '30', '2597', '4408', '50', '80', '274', '712.208', '-13.5129', '50.1354', '0.288398', '5081:0 '),\n+('5085', 'AlteracValleyShortcutA1', '30', '2597', '3303', '50', '80', '34', '668.321', '-376.13', '30.4499', '1.65697', '5079:0 '),\n+('5086', 'AlteracValleyShortcutH1', '30', '2597', '2597', '50', '80', '36', '-550.621', '-356.862', '50.2404', '5.33475', '5062:0 '),\n+('5087', 'AlteracValleyMineA1', '30', '2597', '2957', '50', '80', '34', '774.881', '-363.728', '78.8805', '1.75712', '5088:0 '),\n+('5088', 'AlteracValleyMineA2', '30', '2597', '2957', '50', '80', '32', '776.68', '-313.432', '54.4907', '0.0135369', '5089:0 5079:0 '),\n+('5089', 'AlteracValleyMineA3', '30', '2597', '2957', '50', '80', '512', '870.508', '-436.928', '51.1438', '5.59377', '5088:0 '),\n+('5090', 'AlteracValleyMineH1', '30', '2597', '2963', '50', '80', '0', '-964.106', '-216.1', '69.4372', '0.822477', '5069:0 5091:0 '),\n+('5091', 'AlteracValleyMineH2', '30', '2597', '2963', '50', '80', '512', '-857.468', '-102.82', '65.0282', '0.681106', '5090:0 '),\n+('5092', 'AlteracValleyAuxA1', '30', '2597', '2597', '50', '80', '0', '517.454', '-327.563', '-1.03301', '0.235552', '5052:0 5079:0 '),\n+('5093', 'AlteracValleyIcebloodGY', '30', '2597', '3300', '50', '80', '0', '-531.167', '-405.06', '49.5441', '2.83719', '5064:0 5086:0 '),\n+('5094', 'AlteracValleyGYCS', '30', '2597', '3057', '50', '80', '0', '-296.163', '-118.723', '18.4795', '0.58704', '5059:0 5061:0 '),\n+('5095', 'AlteracValleyGYCN', '30', '2597', '2597', '50', '80', '0', '-154.952', '-231.949', '10.0454', '1.75925', '5057:0 5059:0 ');\ndiff --git a/data/sql/custom/db_world/2024_11_01_creature_template_wander_nodes.sql b/data/sql/custom/db_world/2024_11_01_creature_template_wander_nodes.sql\nnew file mode 100644\nindex 0000000000..8b5a349e9d\n--- /dev/null\n+++ b/data/sql/custom/db_world/2024_11_01_creature_template_wander_nodes.sql\n@@ -0,0 +1,85 @@\n+--\n+DELETE FROM `creature_template_npcbot_wander_nodes` WHERE `id` BETWEEN 5025 AND 5106;\n+INSERT INTO `creature_template_npcbot_wander_nodes` (`id`,`name`,`mapid`,`zoneid`,`areaid`,`minlevel`,`maxlevel`,`flags`,`x`,`y`,`z`,`o`,`links`) VALUES\n+('5025', 'ArathiBasinSpawnA', '529', '3358', '3417', '20', '80', '19', '1289.51', '1286.41', '-14.466', '3.89804', '5026:0 '),\n+('5026', 'ArathiBasinStartA', '529', '3358', '3358', '20', '80', '0', '1241.32', '1228.52', '-40.2271', '4.12149', '5025:0 5027:0 5028:0 5040:0 '),\n+('5027', 'ArathiBasinStables', '529', '3358', '3424', '20', '80', '128', '1168.45', '1204.15', '-56.582', '6.24992', '5028:0 5040:0 5054:0 5026:0 '),\n+('5028', 'ArathiBasinStablesBridge', '529', '3358', '3358', '20', '80', '0', '1088.6', '1223.56', '-53.4783', '0.143443', '5029:0 5032:0 5027:0 5026:0 '),\n+('5029', 'ArathiBasinMillLow1', '529', '3358', '3358', '20', '80', '0', '988.277', '1179.75', '-50.2717', '5.04236', '5028:0 5030:0 5045:0 5032:0 '),\n+('5030', 'ArathiBasinMillLow2', '529', '3358', '3358', '20', '80', '0', '894.665', '1107.2', '-57.5224', '0.784845', '5029:0 5031:0 '),\n+('5031', 'ArathiBasinMillLow3', '529', '3358', '3358', '20', '80', '0', '827.933', '976.767', '-54.503', '0.786809', '5030:0 5034:0 5037:0 5044:0 '),\n+('5032', 'ArathiBasinMillUp1', '529', '3358', '3358', '20', '80', '0', '945.567', '1228.54', '-27.3493', '5.38137', '5028:0 5029:0 5056:0 '),\n+('5033', 'ArathiBasinMill', '529', '3358', '3422', '20', '80', '128', '859.442', '1146.07', '11.648', '2.38114', '5057:0 5056:0 5053:0 '),\n+('5034', 'ArathiBasinMillUp2', '529', '3358', '3422', '20', '80', '0', '782.036', '1026.34', '-36.027', '5.5934', '5037:0 5031:0 5057:0 '),\n+('5035', 'ArathiBasinSpawnH', '529', '3358', '3418', '20', '80', '21', '704.074', '704.457', '-16.4305', '0.79572', '5036:0 '),\n+('5036', 'ArathiBasinStartH', '529', '3358', '3358', '20', '80', '0', '758.421', '762.987', '-43.2233', '0.712183', '5037:0 5035:0 5038:0 '),\n+('5037', 'ArathiBasinFarm', '529', '3358', '3420', '20', '80', '128', '809.518', '872.639', '-56.7354', '0.10154', '5034:0 5036:0 5038:0 5052:0 5039:0 5031:0 '),\n+('5038', 'ArathiBasinFarmBridge', '529', '3358', '3420', '20', '80', '0', '864.632', '772.771', '-51.793', '3.98729', '5036:0 5037:0 5039:0 '),\n+('5039', 'ArathiBasinMineForkSE', '529', '3358', '3358', '20', '80', '0', '956.739', '804.522', '-61.6094', '0.524283', '5037:0 5038:0 5043:0 5050:0 '),\n+('5040', 'ArathiBasinMineForkNW', '529', '3358', '3358', '20', '80', '0', '1221.3', '1088.37', '-59.7666', '4.47091', '5042:0 5027:0 5048:0 5026:0 '),\n+('5041', 'ArathiBasinMine', '529', '3358', '3423', '20', '80', '128', '1151.72', '846.381', '-110.525', '2.55257', '5051:0 5048:0 5050:0 '),\n+('5042', 'ArathiBasinMineUp1', '529', '3358', '3358', '20', '80', '0', '1147.72', '998.593', '-63.7325', '3.58672', '5040:0 5043:0 5045:0 5047:0 '),\n+('5043', 'ArathiBasinMineUp2', '529', '3358', '3358', '20', '80', '0', '1040.93', '882.871', '-61.8051', '2.33458', '5044:0 5042:0 5049:0 5039:0 '),\n+('5044', 'ArathiBasinBlacksmithForkS', '529', '3358', '3421', '20', '80', '0', '947.881', '1005.66', '-48.5412', '3.2392', '5043:0 5046:0 5045:0 5031:0 '),\n+('5045', 'ArathiBasinBlacksmithForkN', '529', '3358', '3421', '20', '80', '0', '1025.4', '999.605', '-46.1926', '2.74243', '5029:0 5042:0 5044:0 5046:0 '),\n+('5046', 'ArathiBasinBlacksmith', '529', '3358', '3421', '20', '80', '128', '979.258', '1043.34', '-44.3749', '0.106003', '5044:0 5045:0 5055:0 '),\n+('5047', 'ArathiBasinMineCliff1', '529', '3358', '3358', '20', '80', '65544', '1164', '966.548', '-66.2884', '2.12191', '5048:0 5042:0 '),\n+('5048', 'ArathiBasinMineDrop1', '529', '3358', '3358', '20', '80', '131072', '1180.76', '949.456', '-97.1403', '2.75853', '5040:0 5041:0 5050:0 '),\n+('5049', 'ArathiBasinMineCliff2', '529', '3358', '3358', '20', '80', '65544', '1075.94', '851.303', '-65.9095', '2.44001', '5050:0 5043:0 '),\n+('5050', 'ArathiBasinMineDrop2', '529', '3358', '3358', '20', '80', '131072', '1089.48', '842.85', '-102.208', '2.56371', '5039:0 5041:0 5048:0 '),\n+('5051', 'ArathiBasinMineBuff', '529', '3358', '3423', '20', '80', '16392', '1148.7', '816.306', '-98.4955', '1.60396', '5041:0 '),\n+('5052', 'ArathiBasinFarmBuff', '529', '3358', '3420', '20', '80', '4104', '815.759', '842.924', '-56.5402', '5.98651', '5037:0 '),\n+('5053', 'ArathiBasinMillBuff', '529', '3358', '3422', '20', '80', '8200', '810.493', '1184', '11.9217', '5.57811', '5033:0 '),\n+('5054', 'ArathiBasinStablesBuff', '529', '3358', '3424', '20', '80', '2056', '1184.4', '1185.75', '-56.3632', '5.47167', '5027:0 '),\n+('5055', 'ArathiBasinBlacksmithBuff', '529', '3358', '3421', '20', '80', '32776', '989.914', '1008.62', '-42.6033', '2.21464', '5046:0 '),\n+('5056', 'ArathiBasinMillUp3', '529', '3358', '3422', '20', '80', '0', '874.487', '1198.33', '8.83505', '3.90873', '5032:0 5033:0 5057:0 '),\n+('5057', 'ArathiBasinMillUp4', '529', '3358', '3422', '20', '80', '0', '797.429', '1127.41', '9.63979', '0.623809', '5033:0 5034:0 5056:0 '),\n+('5058', 'AlteracValleySpawnA', '30', '2597', '2597', '50', '80', '3', '801.027', '-493.883', '99.6917', '3.08066', '5059:0 '),\n+('5059', 'AlteracValleyStartA1', '30', '2597', '3299', '50', '80', '2', '717.929', '-475.351', '75.1276', '2.10478', '5060:0 5098:0 '),\n+('5060', 'AlteracValleyStartA2', '30', '2597', '3299', '50', '80', '34', '664.972', '-400.377', '68.7491', '2.43269', '5061:0 5096:0 '),\n+('5061', 'AlteracValleyStartA3', '30', '2597', '3299', '50', '80', '2', '610.827', '-388.879', '66.5562', '3.30843', '5062:0 '),\n+('5062', 'AlteracValleyStartA4', '30', '2597', '2597', '50', '80', '2', '463.128', '-438.201', '33.0107', '2.75865', '5063:0 '),\n+('5063', 'AlteracValleyHubA1', '30', '2597', '2597', '50', '80', '0', '401.785', '-393.695', '-1.05733', '2.60355', '5064:0 5103:0 '),\n+('5064', 'AlteracValleyBunker2', '30', '2597', '3304', '50', '80', '0', '221.727', '-412.006', '41.1425', '2.14206', '5065:0 5066:0 5063:0 '),\n+('5065', 'AlteracValleyBunker2Inside', '30', '2597', '3304', '50', '80', '146', '204.453', '-359.47', '56.3831', '2.20687', '5064:0 '),\n+('5066', 'AlteracValleyGYA1', '30', '2597', '3302', '50', '80', '128', '76.8322', '-399.172', '45.7006', '1.69996', '5064:0 5067:0 5068:0 5069:0 '),\n+('5067', 'AlteracValleyBelinda', '30', '2597', '2958', '50', '80', '0', '-36.1268', '-290.741', '15.0786', '3.0354', '5066:0 '),\n+('5068', 'AlteracValleyCN', '30', '2597', '2597', '50', '80', '0', '-133.7', '-368.866', '8.47712', '6.00431', '5066:0 5071:0 5106:0 '),\n+('5069', 'AlteracValleyBunker1Inside', '30', '2597', '3305', '50', '80', '146', '-151.384', '-442.049', '40.3942', '1.08956', '5066:0 '),\n+('5070', 'AlteracValleyGYC', '30', '2597', '3301', '50', '80', '128', '-200.494', '-109.396', '78.5207', '4.95373', '5106:0 5105:0 '),\n+('5071', 'AlteracValleyCS1', '30', '2597', '3057', '50', '80', '0', '-262.759', '-292.49', '6.80088', '5.73925', '5068:0 5072:0 '),\n+('5072', 'AlteracValleyCS2', '30', '2597', '3057', '50', '80', '0', '-473.131', '-273.873', '24.7318', '3.74628', '5071:0 5073:0 5105:0 '),\n+('5073', 'AlteracValleyCS3', '30', '2597', '2597', '50', '80', '32', '-525.235', '-353.849', '37.0353', '4.37461', '5074:0 5072:0 '),\n+('5074', 'AlteracValleyCS4', '30', '2597', '2597', '50', '80', '0', '-601.467', '-320.914', '51.7167', '6.08664', '5073:0 5075:0 '),\n+('5075', 'AlteracValleyGYH1', '30', '2597', '2597', '50', '80', '128', '-615.967', '-397.593', '60.6924', '0.333583', '5074:0 5076:0 5077:0 5078:0 '),\n+('5076', 'AlteracValleyTower1Inside', '30', '2597', '2977', '50', '80', '148', '-569.205', '-264.746', '75.0088', '2.58769', '5075:0 '),\n+('5077', 'AlteracValleyGalvangar', '30', '2597', '2977', '50', '80', '0', '-536.858', '-168.875', '57.0098', '2.75262', '5075:0 '),\n+('5078', 'AlteracValleyTower2', '30', '2597', '2962', '50', '80', '0', '-715.985', '-350.671', '66.8321', '2.63482', '5075:0 5079:0 5080:0 '),\n+('5079', 'AlteracValleyTower2Inside', '30', '2597', '2962', '50', '80', '148', '-767.615', '-361.296', '90.8949', '4.27041', '5078:0 '),\n+('5080', 'AlteracValleyGYH2', '30', '2597', '2597', '50', '80', '128', '-1083.95', '-341.705', '55.3047', '0.111719', '5078:0 5083:0 5101:0 '),\n+('5081', 'AlteracValleyStartH1', '30', '2597', '2597', '50', '80', '4', '-1144.38', '-442.064', '56.7427', '0.904973', '5080:0 '),\n+('5082', 'AlteracValleySpawnH', '30', '2597', '2597', '50', '80', '5', '-1386.53', '-549.064', '55.0284', '0.628112', '5081:0 '),\n+('5083', 'AlteracValleyBaseH1', '30', '2597', '2961', '50', '80', '0', '-1241.61', '-363.466', '59.6773', '2.10074', '5080:0 5084:0 '),\n+('5084', 'AlteracValleyBaseH2', '30', '2597', '2961', '50', '80', '0', '-1210.4', '-252.908', '72.7007', '3.07856', '5083:0 5085:0 '),\n+('5085', 'AlteracValleyBaseH3', '30', '2597', '2978', '50', '80', '0', '-1286.08', '-289.551', '89.091', '3.10996', '5084:0 5086:0 '),\n+('5086', 'AlteracValleyGYH3', '30', '2597', '2978', '50', '80', '128', '-1404.13', '-312.526', '89.4075', '1.4783', '5085:0 5087:0 5088:0 5089:0 '),\n+('5087', 'AlteracValleyTower3Inside', '30', '2597', '2978', '50', '80', '148', '-1301.34', '-267.703', '114.151', '0.219693', '5086:0 '),\n+('5088', 'AlteracValleyTower4Inside', '30', '2597', '2978', '50', '80', '148', '-1304.35', '-313.854', '113.867', '5.07738', '5086:0 '),\n+('5089', 'AlteracValleyDrekthar', '30', '2597', '4407', '50', '80', '276', '-1367.71', '-227.007', '98.4255', '2.09366', '5086:0 '),\n+('5090', 'AlteracValleyGYA2', '30', '2597', '3303', '50', '80', '128', '664.375', '-295.432', '30.2906', '1.6334', '5091:0 5099:0 5103:0 '),\n+('5091', 'AlteracValleyBaseA1', '30', '2597', '2959', '50', '80', '0', '628.165', '-209.132', '39.032', '1.71587', '5092:0 5090:0 '),\n+('5092', 'AlteracValleyGYA3', '30', '2597', '2959', '50', '80', '128', '635.165', '-28.286', '46.6157', '4.25874', '5091:0 5093:0 5094:0 5095:0 '),\n+('5093', 'AlteracValleyBunker3Inside', '30', '2597', '2959', '50', '80', '146', '672.521', '-142.475', '63.6551', '4.09365', '5092:0 '),\n+('5094', 'AlteracValleyBunker4Inside', '30', '2597', '2959', '50', '80', '146', '555.611', '-77.7777', '51.9336', '1.81992', '5092:0 '),\n+('5095', 'AlteracValleyVanndar', '30', '2597', '4408', '50', '80', '274', '712.208', '-13.5129', '50.1354', '0.288398', '5092:0 '),\n+('5096', 'AlteracValleyShortcutA1', '30', '2597', '3303', '50', '80', '34', '668.321', '-376.13', '30.4499', '1.65697', '5090:0 '),\n+('5097', 'AlteracValleyShortcutH1', '30', '2597', '2597', '50', '80', '36', '-550.621', '-356.862', '50.2404', '5.33475', '5073:0 '),\n+('5098', 'AlteracValleyMineA1', '30', '2597', '2957', '50', '80', '34', '774.881', '-363.728', '78.8805', '1.75712', '5099:0 '),\n+('5099', 'AlteracValleyMineA2', '30', '2597', '2957', '50', '80', '32', '776.68', '-313.432', '54.4907', '0.0135369', '5100:0 5090:0 '),\n+('5100', 'AlteracValleyMineA3', '30', '2597', '2957', '50', '80', '512', '870.508', '-436.928', '51.1438', '5.59377', '5099:0 '),\n+('5101', 'AlteracValleyMineH1', '30', '2597', '2963', '50', '80', '0', '-964.106', '-216.1', '69.4372', '0.822477', '5080:0 5102:0 '),\n+('5102', 'AlteracValleyMineH2', '30', '2597', '2963', '50', '80', '512', '-857.468', '-102.82', '65.0282', '0.681106', '5101:0 '),\n+('5103', 'AlteracValleyAuxA1', '30', '2597', '2597', '50', '80', '0', '517.454', '-327.563', '-1.03301', '0.235552', '5063:0 5090:0 '),\n+('5104', 'AlteracValleyIcebloodGY', '30', '2597', '3300', '50', '80', '0', '-531.167', '-405.06', '49.5441', '2.83719', '5075:0 5097:0 '),\n+('5105', 'AlteracValleyGYCS', '30', '2597', '3057', '50', '80', '0', '-296.163', '-118.723', '18.4795', '0.58704', '5070:0 5072:0 '),\n+('5106', 'AlteracValleyGYCN', '30', '2597', '2597', '50', '80', '0', '-154.952', '-231.949', '10.0454', '1.75925', '5068:0 5070:0 ');\ndiff --git a/data/sql/custom/db_world/2024_11_04_creature_template_wander_nodes.sql b/data/sql/custom/db_world/2024_11_04_creature_template_wander_nodes.sql\nnew file mode 100644\nindex 0000000000..80b2efeabe\n--- /dev/null\n+++ b/data/sql/custom/db_world/2024_11_04_creature_template_wander_nodes.sql\n@@ -0,0 +1,56 @@\n+--\n+DELETE FROM `creature_template_npcbot_wander_nodes` WHERE `id` BETWEEN 5058 AND 5110;\n+INSERT INTO `creature_template_npcbot_wander_nodes` (`id`,`name`,`mapid`,`zoneid`,`areaid`,`minlevel`,`maxlevel`,`flags`,`x`,`y`,`z`,`o`,`links`) VALUES\n+('5058', 'AlteracValleySpawnA', '30', '2597', '2597', '50', '80', '3', '801.027', '-493.883', '99.6917', '3.08066', '5059:0 '),\n+('5059', 'AlteracValleyStartA1', '30', '2597', '3299', '50', '80', '2', '717.929', '-475.351', '75.1276', '2.10478', '5060:0 5098:0 '),\n+('5060', 'AlteracValleyStartA2', '30', '2597', '3299', '50', '80', '65538', '664.972', '-400.377', '68.7491', '2.43269', '5061:0 5098:0 '),\n+('5061', 'AlteracValleyStartA3', '30', '2597', '3299', '50', '80', '10', '610.827', '-388.879', '66.5562', '3.30843', '5062:0 5060:0 '),\n+('5062', 'AlteracValleyStartA4', '30', '2597', '2597', '50', '80', '10', '463.128', '-438.201', '33.0107', '2.75865', '5063:0 '),\n+('5063', 'AlteracValleyHubA1', '30', '2597', '2597', '50', '80', '8', '401.785', '-393.695', '-1.05733', '2.60355', '5064:0 5103:0 '),\n+('5064', 'AlteracValleyBunker2', '30', '2597', '3304', '50', '80', '8', '221.727', '-412.006', '41.1425', '2.14206', '5065:0 5066:0 5063:0 '),\n+('5065', 'AlteracValleyBunker2Inside', '30', '2597', '3304', '50', '80', '146', '204.453', '-359.47', '56.3831', '2.20687', '5064:0 '),\n+('5066', 'AlteracValleyGYA1', '30', '2597', '3302', '50', '80', '136', '76.8322', '-399.172', '45.7006', '1.69996', '5064:0 5067:0 5068:0 5069:0 5109:0 '),\n+('5067', 'AlteracValleyBelinda', '30', '2597', '2958', '50', '80', '1042', '-36.1268', '-290.741', '15.0786', '3.0354', '5066:0 '),\n+('5068', 'AlteracValleyCN', '30', '2597', '2597', '50', '80', '8', '-63.4528', '-374.738', '13.4643', '2.01653', '5066:0 5071:0 5106:0 5107:0 '),\n+('5069', 'AlteracValleyBunker1Inside', '30', '2597', '3305', '50', '80', '146', '-151.384', '-442.049', '40.3942', '1.08956', '5066:0 '),\n+('5070', 'AlteracValleyGYC', '30', '2597', '3301', '50', '80', '136', '-200.494', '-109.396', '78.5207', '4.95373', '5106:0 5105:0 '),\n+('5071', 'AlteracValleyCS1', '30', '2597', '3057', '50', '80', '8', '-255.035', '-296.856', '6.68142', '5.07206', '5068:0 5072:0 '),\n+('5072', 'AlteracValleyCS2', '30', '2597', '3057', '50', '80', '8', '-473.131', '-273.873', '24.7318', '3.74628', '5071:0 5105:0 5107:0 5108:0 5073:0 '),\n+('5073', 'AlteracValleyCS3', '30', '2597', '2597', '50', '80', '32', '-525.235', '-353.849', '37.0353', '4.37461', '5072:0 5074:0 5110:0 '),\n+('5074', 'AlteracValleyCS4', '30', '2597', '2597', '50', '80', '8', '-601.467', '-320.914', '51.7167', '6.08664', '5075:0 5073:0 '),\n+('5075', 'AlteracValleyGYH1', '30', '2597', '2597', '50', '80', '136', '-615.967', '-397.593', '60.6924', '0.333583', '5074:0 5076:0 5077:0 5078:0 '),\n+('5076', 'AlteracValleyTower1Inside', '30', '2597', '2977', '50', '80', '148', '-569.205', '-264.746', '75.0088', '2.58769', '5075:0 '),\n+('5077', 'AlteracValleyGalvangar', '30', '2597', '2977', '50', '80', '1044', '-536.858', '-168.875', '57.0098', '2.75262', '5075:0 '),\n+('5078', 'AlteracValleyTower2', '30', '2597', '2962', '50', '80', '8', '-715.985', '-350.671', '66.8321', '2.63482', '5075:0 5079:0 5080:0 '),\n+('5079', 'AlteracValleyTower2Inside', '30', '2597', '2962', '50', '80', '148', '-767.615', '-361.296', '90.8949', '4.27041', '5078:0 '),\n+('5080', 'AlteracValleyGYH2', '30', '2597', '2597', '50', '80', '136', '-1083.95', '-341.705', '55.3047', '0.111719', '5078:0 5083:0 5101:0 '),\n+('5081', 'AlteracValleyStartH1', '30', '2597', '2597', '50', '80', '4', '-1144.38', '-442.064', '56.7427', '0.904973', '5080:0 '),\n+('5082', 'AlteracValleySpawnH', '30', '2597', '2597', '50', '80', '5', '-1386.53', '-549.064', '55.0284', '0.628112', '5081:0 '),\n+('5083', 'AlteracValleyBaseH1', '30', '2597', '2961', '50', '80', '8', '-1241.61', '-363.466', '59.6773', '2.10074', '5080:0 5084:0 '),\n+('5084', 'AlteracValleyBaseH2', '30', '2597', '2961', '50', '80', '8', '-1210.4', '-252.908', '72.7007', '3.07856', '5083:0 5085:0 '),\n+('5085', 'AlteracValleyBaseH3', '30', '2597', '2978', '50', '80', '8', '-1286.08', '-289.551', '89.091', '3.10996', '5084:0 5086:0 '),\n+('5086', 'AlteracValleyGYH3', '30', '2597', '2978', '50', '80', '136', '-1404.13', '-312.526', '89.4075', '1.4783', '5085:0 5087:0 5088:0 5089:0 '),\n+('5087', 'AlteracValleyTower3Inside', '30', '2597', '2978', '50', '80', '148', '-1301.34', '-267.703', '114.151', '0.219693', '5086:0 '),\n+('5088', 'AlteracValleyTower4Inside', '30', '2597', '2978', '50', '80', '148', '-1304.35', '-313.854', '113.867', '5.07738', '5086:0 '),\n+('5089', 'AlteracValleyDrekthar', '30', '2597', '4407', '50', '80', '276', '-1367.71', '-227.007', '98.4255', '2.09366', '5086:0 '),\n+('5090', 'AlteracValleyGYA2', '30', '2597', '3303', '50', '80', '136', '664.375', '-295.432', '30.2906', '1.6334', '5091:0 5099:0 5103:0 '),\n+('5091', 'AlteracValleyBaseA1', '30', '2597', '2959', '50', '80', '8', '628.165', '-209.132', '39.032', '1.71587', '5092:0 5090:0 '),\n+('5092', 'AlteracValleyGYA3', '30', '2597', '2959', '50', '80', '136', '635.165', '-28.286', '46.6157', '4.25874', '5091:0 5093:0 5094:0 5095:0 '),\n+('5093', 'AlteracValleyBunker3Inside', '30', '2597', '2959', '50', '80', '146', '672.521', '-142.475', '63.6551', '4.09365', '5092:0 '),\n+('5094', 'AlteracValleyBunker4Inside', '30', '2597', '2959', '50', '80', '146', '555.611', '-77.7777', '51.9336', '1.81992', '5092:0 '),\n+('5095', 'AlteracValleyVanndar', '30', '2597', '4408', '50', '80', '274', '712.208', '-13.5129', '50.1354', '0.288398', '5092:0 '),\n+('5096', 'AlteracValleyShortcutA1', '30', '2597', '3303', '50', '80', '131074', '668.321', '-376.13', '30.4499', '1.65697', '5090:0 '),\n+('5097', 'AlteracValleyShortcutH1', '30', '2597', '2597', '50', '80', '32', '-550.621', '-356.862', '50.2404', '5.33475', '5073:0 '),\n+('5098', 'AlteracValleyMineA1', '30', '2597', '2957', '50', '80', '65538', '774.881', '-363.728', '78.8805', '1.75712', '5099:0 5060:0 '),\n+('5099', 'AlteracValleyMineA2', '30', '2597', '2957', '50', '80', '131072', '776.68', '-313.432', '54.4907', '0.0135369', '5100:0 5090:0 '),\n+('5100', 'AlteracValleyMineA3', '30', '2597', '2957', '50', '80', '512', '870.508', '-436.928', '51.1438', '5.59377', '5099:0 '),\n+('5101', 'AlteracValleyMineH1', '30', '2597', '2963', '50', '80', '8', '-964.106', '-216.1', '69.4372', '0.822477', '5080:0 5102:0 '),\n+('5102', 'AlteracValleyMineH2', '30', '2597', '2963', '50', '80', '512', '-853.987', '-98.7783', '67.5444', '6.16727', '5101:0 '),\n+('5103', 'AlteracValleyAuxA1', '30', '2597', '2597', '50', '80', '8', '517.454', '-327.563', '-1.03301', '0.235552', '5063:0 5090:0 '),\n+('5104', 'AlteracValleyIcebloodGY', '30', '2597', '3300', '50', '80', '0', '-531.167', '-405.06', '49.5441', '2.83719', '5075:0 5097:0 '),\n+('5105', 'AlteracValleyGYCS', '30', '2597', '3057', '50', '80', '8', '-311.905', '-130.479', '14.734', '0.412742', '5070:0 5106:0 5072:0 '),\n+('5106', 'AlteracValleyGYCN', '30', '2597', '2597', '50', '80', '8', '-143.447', '-249.084', '6.68667', '1.83233', '5068:0 5070:0 5105:0 5108:0 5109:0 '),\n+('5107', 'AlteracValleyCS5', '30', '2597', '3057', '50', '80', '8', '-228.16', '-372.069', '9.52872', '3.05359', '5068:0 5110:0 5072:0 '),\n+('5108', 'AlteracValleyCS6', '30', '2597', '3057', '50', '80', '8', '-276.653', '-212.64', '7.9686', '3.4754', '5106:0 5072:0 '),\n+('5109', 'AlteracValleyCNE', '30', '2597', '2958', '50', '80', '0', '72.783', '-254.66', '17.9217', '3.41296', '5066:0 5106:0 '),\n+('5110', 'AlteracValleyCS7', '30', '2597', '3057', '1', '60', '8', '-336.807', '-401.764', '10.041', '0.0278354', '5107:0 5073:0 ');\ndiff --git a/data/sql/custom/db_world/2024_11_05_creature_template_wander_nodes.sql b/data/sql/custom/db_world/2024_11_05_creature_template_wander_nodes.sql\nnew file mode 100644\nindex 0000000000..232a7f0162\n--- /dev/null\n+++ b/data/sql/custom/db_world/2024_11_05_creature_template_wander_nodes.sql\n@@ -0,0 +1,2 @@\n+--\n+UPDATE `creature_template_npcbot_wander_nodes` SET `minlevel`='50', `maxlevel`='80' WHERE `id`='5110';\ndiff --git a/data/sql/custom/db_world/2024_11_07_creature_template_wander_nodes.sql b/data/sql/custom/db_world/2024_11_07_creature_template_wander_nodes.sql\nnew file mode 100644\nindex 0000000000..8abfbc05e4\n--- /dev/null\n+++ b/data/sql/custom/db_world/2024_11_07_creature_template_wander_nodes.sql\n@@ -0,0 +1,39 @@\n+--\n+DELETE FROM `creature_template_npcbot_wander_nodes` WHERE `id` BETWEEN 5111 AND 5146;\n+INSERT INTO `creature_template_npcbot_wander_nodes` (`id`,`name`,`mapid`,`zoneid`,`areaid`,`minlevel`,`maxlevel`,`flags`,`x`,`y`,`z`,`o`,`links`) VALUES\n+('5111', 'EyeOfTheStormSpawnA', '566', '3820', '3820', '60', '80', '3', '2523.45', '1596.62', '1269.24', '3.03123', '5112:0 5113:0 '),\n+('5112', 'EyeOfTheStormSpawnA1', '566', '3820', '3820', '60', '80', '65538', '2496.81', '1612.95', '1255.15', '2.81918', '5114:0 '),\n+('5113', 'EyeOfTheStormSpawnA2', '566', '3820', '3820', '60', '80', '65538', '2499.13', '1579.21', '1257.44', '3.44945', '5115:0 '),\n+('5114', 'EyeOfTheStormStartA1', '566', '3820', '3820', '60', '80', '131074', '2471.65', '1621.06', '1215.96', '2.97233', '5116:0 '),\n+('5115', 'EyeOfTheStormStartA2', '566', '3820', '3820', '60', '80', '131074', '2473.83', '1571', '1213.66', '3.45534', '5117:0 '),\n+('5116', 'EyeOfTheStormStartA3', '566', '3820', '3820', '60', '80', '2', '2425.5', '1615.75', '1187.87', '0.156239', '5118:0 5119:0 '),\n+('5117', 'EyeOfTheStormStartA4', '566', '3820', '3820', '60', '80', '2', '2417.92', '1560.53', '1185.04', '0.233193', '5119:0 5120:0 '),\n+('5118', 'EyeOfTheStormForkNW', '566', '3820', '3869', '60', '80', '8', '2279.22', '1660.34', '1165.68', '0.589394', '5119:0 5121:0 5136:0 '),\n+('5119', 'EyeOfTheStormForkN', '566', '3820', '3820', '60', '80', '8', '2275.68', '1577.95', '1165.37', '2.88866', '5120:0 5135:0 5144:0 5118:0 5145:0 '),\n+('5120', 'EyeOfTheStormForkNE', '566', '3820', '3871', '60', '80', '8', '2285.71', '1469.1', '1181.66', '5.18595', '5119:0 5122:0 5137:0 '),\n+('5121', 'EyeOfTheStormBridgeWN', '566', '3820', '3869', '60', '80', '8', '2220.37', '1754.67', '1152.16', '4.67543', '5133:0 5136:0 5118:0 '),\n+('5122', 'EyeOfTheStormBridgeEN', '566', '3820', '3871', '60', '80', '8', '2234.95', '1402.23', '1177.94', '3.26368', '5134:0 5120:0 5137:0 '),\n+('5123', 'EyeOfTheStormSpawnH', '566', '3820', '3820', '60', '80', '5', '1807.99', '1539.31', '1267.53', '0.120124', '5124:0 5125:0 '),\n+('5124', 'EyeOfTheStormSpawnH1', '566', '3820', '3820', '60', '80', '65540', '1831.62', '1557.48', '1255.46', '0.46766', '5127:0 '),\n+('5125', 'EyeOfTheStormSpawnH2', '566', '3820', '3820', '60', '80', '65540', '1833.06', '1524.15', '1255.31', '5.93795', '5126:0 '),\n+('5126', 'EyeOfTheStormStartH1', '566', '3820', '3820', '60', '80', '131076', '1856.01', '1515.9', '1219.47', '5.93795', '5128:0 '),\n+('5127', 'EyeOfTheStormStartH2', '566', '3820', '3820', '60', '80', '131076', '1855.89', '1566.34', '1214.69', '0.34985', '5129:0 '),\n+('5128', 'EyeOfTheStormStartH3', '566', '3820', '3820', '60', '80', '4', '1925.07', '1519.35', '1181.58', '0.00431252', '5130:0 5131:0 '),\n+('5129', 'EyeOfTheStormStartH4', '566', '3820', '3820', '60', '80', '4', '1937.55', '1593.16', '1178.75', '3.0124', '5131:0 5132:0 '),\n+('5130', 'EyeOfTheStormForkSE', '566', '3820', '3870', '60', '80', '8', '2059.13', '1468.67', '1165.76', '4.64205', '5131:0 5134:0 5139:0 '),\n+('5131', 'EyeOfTheStormForkSC', '566', '3820', '3820', '60', '80', '8', '2075.02', '1548.37', '1160.58', '0.138568', '5132:0 5135:0 5144:0 5130:0 5146:0 '),\n+('5132', 'EyeOfTheStormForkSW', '566', '3820', '3820', '60', '80', '8', '2047.2', '1663.97', '1173.93', '1.64971', '5131:0 5133:0 5138:0 '),\n+('5133', 'EyeOfTheStormBridgeWS', '566', '3820', '3872', '60', '80', '8', '2099.21', '1735.01', '1170.54', '0.0965541', '5121:0 5132:0 5138:0 '),\n+('5134', 'EyeOfTheStormBridgeES', '566', '3820', '3870', '60', '80', '8', '2110.22', '1381.67', '1162.48', '0.00426722', '5122:0 5139:0 5130:0 '),\n+('5135', 'EyeOfTheStormFlagC', '566', '3820', '3820', '60', '80', '262280', '2174.59', '1568.74', '1159.96', '0.248524', '5119:0 5131:0 '),\n+('5136', 'EyeOfTheStormFlagNW', '566', '3820', '3869', '60', '80', '72', '2284.84', '1731', '1189.89', '1.72509', '5121:0 5140:0 5118:0 '),\n+('5137', 'EyeOfTheStormFlagNE', '566', '3820', '3871', '60', '80', '72', '2286.49', '1402.29', '1197.1', '4.74102', '5120:0 5122:0 5141:0 '),\n+('5138', 'EyeOfTheStormFlagSW', '566', '3820', '3872', '60', '80', '72', '2044.01', '1729.74', '1189.86', '1.56605', '5132:0 5133:0 5142:0 '),\n+('5139', 'EyeOfTheStormFlagSE', '566', '3820', '3870', '60', '80', '72', '2048.47', '1393.69', '1194.36', '4.79796', '5134:0 5143:0 5130:0 '),\n+('5140', 'EyeOfTheStormBuffNW', '566', '3820', '3820', '60', '80', '2056', '2283.56', '1748.26', '1189.71', '3.13137', '5136:0 '),\n+('5141', 'EyeOfTheStormBuffNE', '566', '3820', '3820', '60', '80', '4104', '2302.56', '1391.69', '1197.79', '5.33441', '5137:0 '),\n+('5142', 'EyeOfTheStormBuffSW', '566', '3820', '3820', '60', '80', '8200', '2046.47', '1749.34', '1190.02', '1.65874', '5138:0 '),\n+('5143', 'EyeOfTheStormBuffSE', '566', '3820', '3870', '60', '80', '16392', '2050.3', '1372.75', '1194.56', '4.89851', '5139:0 '),\n+('5144', 'EyeOfTheStormFlagCBottom', '566', '3820', '3820', '60', '80', '8', '2178.98', '1538.52', '1129.18', '1.72942', '5119:0 5131:0 '),\n+('5145', 'EyeOfTheStormLockA', '566', '3820', '3820', '60', '80', '524', '2423.64', '1588.87', '1188.15', '0.101702', '5119:0 '),\n+('5146', 'EyeOfTheStormLockH', '566', '3820', '3820', '60', '80', '522', '1908.01', '1542.98', '1188.84', '3.26882', '5131:0 ');\ndiff --git a/data/sql/custom/db_world/2024_11_11_00_npc_text.sql b/data/sql/custom/db_world/2024_11_11_00_npc_text.sql\nnew file mode 100644\nindex 0000000000..edb2e556c0\n--- /dev/null\n+++ b/data/sql/custom/db_world/2024_11_11_00_npc_text.sql\n@@ -0,0 +1,7 @@\n+--\n+SET @LOCALIZED_STRINGS_START = 70553;\n+SET @LOCALIZED_STRINGS_END   = 70553;\n+\n+DELETE FROM `npc_text` WHERE ID BETWEEN @LOCALIZED_STRINGS_START and @LOCALIZED_STRINGS_END;\n+INSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n+(@LOCALIZED_STRINGS_START,'Bank is full','-1');\ndiff --git a/data/sql/custom/db_world/2024_11_11_01_npc_text.sql b/data/sql/custom/db_world/2024_11_11_01_npc_text.sql\nnew file mode 100644\nindex 0000000000..64bb40dd32\n--- /dev/null\n+++ b/data/sql/custom/db_world/2024_11_11_01_npc_text.sql\n@@ -0,0 +1,8 @@\n+--\n+SET @LOCALIZED_STRINGS_START = 70687;\n+SET @LOCALIZED_STRINGS_END   = 70688;\n+\n+DELETE FROM `npc_text` WHERE ID BETWEEN @LOCALIZED_STRINGS_START and @LOCALIZED_STRINGS_END;\n+INSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n+(@LOCALIZED_STRINGS_START+0,' (gear bank)','-1'),\n+(@LOCALIZED_STRINGS_START+1,'Not enough gear bank space to store %u item(s) (%u / %u)!','-1');\ndiff --git a/data/sql/custom/db_world/2024_11_13_00_npc_text.sql b/data/sql/custom/db_world/2024_11_13_00_npc_text.sql\nnew file mode 100644\nindex 0000000000..5aa2ba6067\n--- /dev/null\n+++ b/data/sql/custom/db_world/2024_11_13_00_npc_text.sql\n@@ -0,0 +1,11 @@\n+--\n+SET @LOCALIZED_STRINGS_START = 70689;\n+SET @LOCALIZED_STRINGS_END   = 70693;\n+\n+DELETE FROM `npc_text` WHERE ID BETWEEN @LOCALIZED_STRINGS_START and @LOCALIZED_STRINGS_END;\n+INSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n+(@LOCALIZED_STRINGS_START+0,'Equipment sets','-1'),\n+(@LOCALIZED_STRINGS_START+1,'Create','-1'),\n+(@LOCALIZED_STRINGS_START+2,'Delete','-1'),\n+(@LOCALIZED_STRINGS_START+3,'Equip','-1'),\n+(@LOCALIZED_STRINGS_START+4,'missing','-1');\ndiff --git a/data/sql/custom/db_world/2026_01_07_creature_template_wander_nodes.sql b/data/sql/custom/db_world/2026_01_07_creature_template_wander_nodes.sql\nnew file mode 100644\nindex 0000000000..6e2cb5d013\n--- /dev/null\n+++ b/data/sql/custom/db_world/2026_01_07_creature_template_wander_nodes.sql\n@@ -0,0 +1,24 @@\n+DELIMITER $$\n+CREATE PROCEDURE tmpAddColumnIfNotExists( IN p_column_name    VARCHAR(64), IN p_add_statement  TEXT )\n+BEGIN\n+    IF NOT EXISTS (\n+        SELECT 1\n+        FROM INFORMATION_SCHEMA.COLUMNS\n+        WHERE TABLE_SCHEMA = DATABASE()\n+          AND TABLE_NAME = 'creature_template_npcbot_wander_nodes'\n+          AND COLUMN_NAME = p_column_name\n+    ) THEN\n+        SET @sql = CONCAT( 'ALTER TABLE `creature_template_npcbot_wander_nodes` ', p_add_statement );\n+\n+        PREPARE stmt FROM @sql;\n+        EXECUTE stmt;\n+        DEALLOCATE PREPARE stmt;\n+    END IF;\n+END$$\n+DELIMITER ;\n+\n+CALL tmpAddColumnIfNotExists( 'minwaittime', 'ADD `minwaittime` INT UNSIGNED NOT NULL DEFAULT 3000 AFTER `maxlevel`' );\n+CALL tmpAddColumnIfNotExists( 'maxwaittime', 'ADD `maxwaittime` INT UNSIGNED NOT NULL DEFAULT 7000 AFTER `minwaittime`' );\n+CALL tmpAddColumnIfNotExists( 'proximity', 'ADD `proximity` FLOAT NOT NULL DEFAULT 0 AFTER `maxwaittime`' );\n+\n+DROP PROCEDURE tmpAddColumnIfNotExists;\ndiff --git a/data/sql/custom/db_world/2026_01_15_00_npc_text.sql b/data/sql/custom/db_world/2026_01_15_00_npc_text.sql\nnew file mode 100644\nindex 0000000000..97d6744974\n--- /dev/null\n+++ b/data/sql/custom/db_world/2026_01_15_00_npc_text.sql\n@@ -0,0 +1,13 @@\n+--\n+SET @LOCALIZED_STRINGS_START = 70694;\n+SET @LOCALIZED_STRINGS_END   = 70700;\n+\n+DELETE FROM `npc_text` WHERE ID BETWEEN @LOCALIZED_STRINGS_START and @LOCALIZED_STRINGS_END;\n+INSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n+(@LOCALIZED_STRINGS_START+0,'Manage ownership...','-1'),\n+(@LOCALIZED_STRINGS_START+1,'<Add owner>','-1'),\n+(@LOCALIZED_STRINGS_START+2,'WARNING: by sharing ownership over your bot you give another player FULL control over their inventory, roles and all other settings (including sharing them with others)','-1'),\n+(@LOCALIZED_STRINGS_START+3,'<Remove owner>','-1'),\n+(@LOCALIZED_STRINGS_START+4,'Owners limit exceeded','-1'),\n+(@LOCALIZED_STRINGS_START+5,'Shared with','-1'),\n+(@LOCALIZED_STRINGS_START+6,'Owner','-1');\ndiff --git a/data/sql/custom/db_world/2026_03_12_creature_template_wander_nodes.sql b/data/sql/custom/db_world/2026_03_12_creature_template_wander_nodes.sql\nnew file mode 100644\nindex 0000000000..ce1425061c\n--- /dev/null\n+++ b/data/sql/custom/db_world/2026_03_12_creature_template_wander_nodes.sql\n@@ -0,0 +1,5 @@\n+--\n+-- NorthCoastC: make horde-only\n+UPDATE `creature_template_npcbot_wander_nodes` SET `flags`=`flags`|4 WHERE (`id`='283');\n+-- DurotarCanyon1_8: make horde-only\n+UPDATE `creature_template_npcbot_wander_nodes` SET `flags`=`flags`|4 WHERE (`id`='1379');\ndiff --git a/data/sql/custom/db_world/2026_03_28_00_command.sql b/data/sql/custom/db_world/2026_03_28_00_command.sql\nnew file mode 100644\nindex 0000000000..a72457e6e7\n--- /dev/null\n+++ b/data/sql/custom/db_world/2026_03_28_00_command.sql\n@@ -0,0 +1,2 @@\n+--\n+DELETE FROM `command` WHERE (`name`='npcbot reloadconfig');\ndiff --git a/src/common/Common.h b/src/common/Common.h\nindex 1a2c0a3902..41dbfb38da 100644\n--- a/src/common/Common.h\n+++ b/src/common/Common.h\n@@ -113,7 +113,7 @@ constexpr uint32 ACCOUNT_FLAGS_ALL =\n     ACCOUNT_FLAG_OVERMIND_LINKED | ACCOUNT_FLAG_DEMOS | ACCOUNT_FLAG_DEATH_KNIGHT_OK |\n     ACCOUNT_FLAG_S2_REQUIRE_IGR | ACCOUNT_FLAG_S2_TRIAL;\n \n-enum LocaleConstant\n+enum LocaleConstant: uint8\n {\n     LOCALE_enUS = 0,\n     LOCALE_koKR = 1,\ndiff --git a/src/common/Utilities/EventProcessor.h b/src/common/Utilities/EventProcessor.h\nindex 644c2b643b..78e85624c1 100644\n--- a/src/common/Utilities/EventProcessor.h\n+++ b/src/common/Utilities/EventProcessor.h\n@@ -55,6 +55,7 @@ class BasicEvent\n \n         // Aborts the event at the next update tick\n         void ScheduleAbort();\n+        bool IsActive() const { return m_abortState == AbortState::STATE_RUNNING; }\n \n     private:\n         void SetAborted();\ndiff --git a/src/server/apps/worldserver/worldserver.conf.dist b/src/server/apps/worldserver/worldserver.conf.dist\nindex 0990fb4e6b..604b287998 100644\n--- a/src/server/apps/worldserver/worldserver.conf.dist\n+++ b/src/server/apps/worldserver/worldserver.conf.dist\n@@ -692,6 +692,7 @@ Appender.Server=2,5,0,Server.log,w\n Appender.Errors=2,2,0,Errors.log,w\n # Appender.DB=3,5,0\n # Appender.Dev=2,5,0,Dev.log,a\n+Appender.NpcBots=1,2,0\n \n #  Logger config values: Given a logger \"name\"\n #    Logger.name\n@@ -820,6 +821,7 @@ Logger.spells.scripts=2,Console Errors\n #Logger.vehicles=4,Console Server\n #Logger.warden=4,Console Server\n #Logger.weather=4,Console Server\n+Logger.npcbots=2,NpcBots Server\n \n #\n #    Log.Async.Enable\n@@ -4754,6 +4756,769 @@ Respawn.DynamicMinimumGameObject = 10\n #\n ###################################################################################################\n \n+###################################################################################################\n+# NPCBOT CONFIGURATION\n+#\n+#    NpcBot.Enable\n+#        Description: Enables NpcBot system.\n+#        Default:     1 - enable\n+#                     0 - disable\n+\n+NpcBot.Enable = 1\n+\n+#\n+#    NpcBot.LogToDB\n+#        Description: Log bot events debug info to DB. Records will be kept up to 30 days\n+#        Default:     1 - (Enable)\n+#                     0 - (Disable)\n+\n+NpcBot.LogToDB = 1\n+\n+#\n+#    NpcBot.MaxBots\n+#        Description: Maximum number of bots allowed for players per level bracket:\n+#                     0-9, 10-19, 20,29, ... , 70-79, 80+.\n+#        Default:     1,1,1,1,1,1,1,1,1 - (1 for all levels)\n+#                     0,1,2,3,4,5,6,7,8 - (1 per 10 levels)\n+#        Max:         39\n+\n+NpcBot.MaxBots = 39,39,39,39,39,39,39,39,39\n+\n+#\n+#    NpcBot.MaxBotsPerClass\n+#        Description: Maximum bots of each class allowed for players.\n+#        Default:     0 - no limit\n+\n+NpcBot.MaxBotsPerClass = 0\n+\n+#\n+#    NpcBot.MaxBotsPerAccount\n+#        Description: Maximum total number of bots players can hire per account.\n+#        Default:     0 - no limit\n+#                     9 - up to 9 bots total per account\n+\n+NpcBot.MaxBotsPerAccount = 0\n+\n+#\n+#    NpcBot.Botgiver.FilterRaces\n+#        Description: Make botgiver only offer bots of player faction (normal classes).\n+#        Default:     0 - disable\n+\n+NpcBot.Botgiver.FilterRaces = 0\n+\n+#\n+#    NpcBot.SharedOwnership.Options\n+#        Description: Bitmask describing enabled shared ownership options.\n+#        Note:        WARNING! SHARED BOT OWNERSHIP ENABLES EXPLOITS! USE ON YOUR OWN RISK!\n+#        Note2:       Term 'share' below refers to a player whom ownership is being shared with\n+#        Values:\n+#                     0 - Disable completely (default)\n+#                     1 - Enable (allows bot owner to share their bots)\n+#                     2 - Shared equipment management (including soulbound items)\n+#                     4 - Shared ownership extension (allow shares to share the bot further)\n+#                     8 - Shared ownership removal (allows shares to remove other shares)\n+#        Notes:\n+#                     Initially only bot owner can add new shares\n+#                     Shares cannot remove bot owner from shared owneship list (or add to it)\n+#                     Shares cannot dismiss the bot. If bot ownership expires due to bot expiry\n+#                       timer equipment is always returned to the original owner. If share's bot\n+#                       ownership expires due to rent cost the bot becomes unbound instead.\n+#                     Bots will accept any player from total ownership list as current master,\n+#                       whoever is logged in currently and will not switch until they log out,\n+#                       original owner takes priority but only if bot has no master currently.\n+\n+NpcBot.SharedOwnership.Options = 0\n+\n+#\n+#    NpcBot.SharedOwnership.MaxOwners\n+#        Description: Maximum number of players a bot can be shared with (NOT counting the owner)\n+#        Note:        WARNING! SHARED BOT OWNERSHIP ENABLES EXPLOITS! USE ON YOUR OWN RISK!\n+#        Default:     0\n+#        Max:         39\n+\n+NpcBot.SharedOwnership.MaxOwners = 0\n+\n+#\n+#    NpcBot.BaseFollowDistance\n+#        Description: Default bot follow distance.\n+#        Note:        This parameter determines bots' formation size, distance at which bots\n+#                     will chase and attack enemies.\n+#        Note2:       This parameter is set for each player at login.\n+#        Default:     30\n+\n+NpcBot.BaseFollowDistance = 30\n+\n+#\n+#    NpcBot.XpReduction.Enable\n+#    NpcBot.XpReduction.GroupOnly\n+#    NpcBot.XpReduction.Extra.Amount\n+#    NpcBot.XpReduction.Extra.StartingNumber\n+#        Description: Enable Blizzlike XP penalty for using bots counting\n+#                     either all participating bots or in <GroupOnly>.\n+#                     Additional XP reduction <Amount> applies on top of that,\n+#                     starting with <StartingNumber>'th bot\n+#        Example:     Group of 4, 3 bots, reduction is 20, start is 2:\n+#                     (100% - ((3-(2-1))*20)) * 1.3 / 4 = 19.5% exp gained\n+#        Note:        Maximum extra xp reduction factor is 90%.\n+#        Default:     0 - (NpcBot.XpReduction.Enable)\n+#                     0 - (NpcBot.XpReduction.GroupOnly)\n+#                     0 - (NpcBot.XpReduction.Extra.Amount)\n+#                     2 - (NpcBot.XpReduction.Extra.StartingNumber)\n+\n+NpcBot.XpReduction.Enable               = 0\n+NpcBot.XpReduction.GroupOnly            = 0\n+NpcBot.XpReduction.Extra.Amount         = 0\n+NpcBot.XpReduction.Extra.StartingNumber = 2\n+\n+#\n+#    NpcBot.HonorReduction.Enable\n+#    NpcBot.HonorReduction.GroupOnly\n+#        Description: Enable Blizzlike honor gain reduction when using bots counting\n+#                     either all participating bots or in <GroupOnly>.\n+#        Default:     0 - (NpcBot.HonorReduction.Enable)\n+#                     0 - (NpcBot.HonorReduction.GroupOnly)\n+\n+NpcBot.HonorReduction.Enable    = 0\n+NpcBot.HonorReduction.GroupOnly = 0\n+\n+#\n+#    NpcBot.MoneyShare.Enable\n+#    NpcBot.MoneyShare.GroupOnly\n+#        Description: Share money loot with bots, effectively reducing money amount players receive.\n+#        Example:     Group of 5, 3 bots, looting 100 copper, players receive 20 copper each.\n+#        Default:     0 - (NpcBot.MoneyShare.Enable)\n+#                     0 - (NpcBot.MoneyShare.GroupOnly)\n+\n+NpcBot.MoneyShare.Enable    = 0\n+NpcBot.MoneyShare.GroupOnly = 0\n+\n+#\n+#    NpcBot.MountLevel.60\n+#    NpcBot.MountLevel.100\n+#        Description: Minimum level for bots to be able to use ground mounts\n+#        Default:     20 - (NpcBot.MountLevel.60)\n+#                     40 - (NpcBot.MountLevel.100)\n+\n+NpcBot.MountLevel.60  = 20\n+NpcBot.MountLevel.100 = 40\n+\n+#\n+#    NpcBot.HealTargetIconMask\n+#    NpcBot.TankTargetIconMask\n+#    NpcBot.OffTankTargetIconMask\n+#    NpcBot.DPSTargetIconMask\n+#    NpcBot.RangedDPSTargetIconMask\n+#    NpcBot.NoDPSTargetIconMask\n+#        Description: Icon number bitmask which bots use to search for primary attack\n+#                     target, (off-)tanking target, target to heal and protect (out of party),\n+#                     or target to try to not damage.\n+#        Note:        Many creatures cannot accept heal.\n+#        Note2:       While icon is active NPCBot ddealers/tanks will ignore any other targets\n+#                     and will not break from combat to follow you.\n+#        Note3:       If you set multiple targets only one target at a time will be used.\n+#        Example:     To check Star, Triangle and Square we need 1 + 8 + 32 = 41.\n+#        Default:     0 (Disable)\n+#                     1 - Star\n+#                     2 - Circle\n+#                     4 - Diamond\n+#                     8 - Triangle\n+#                     16 - Moon\n+#                     32 - Square\n+#                     64 - Cross\n+#                     128 - Skull\n+\n+NpcBot.HealTargetIconMask = 0\n+NpcBot.TankTargetIconMask = 0\n+NpcBot.OffTankTargetIconMask = 0\n+NpcBot.DPSTargetIconMask = 0\n+NpcBot.RangedDPSTargetIconMask = 0\n+NpcBot.NoDPSTargetIconMask = 0\n+\n+#\n+#    NpcBot.Mult.Damage.Physical\n+#    NpcBot.Mult.Damage.Spell\n+#    NpcBot.Mult.Healing\n+#    NpcBot.Mult.HP\n+#        Description: Multipliers for bots' damage, healing, etc. Allows to balance bots vs players.\n+#                     Only affects normal spawned bots and generated wandering bot in BGs.\n+#        Default:     1.0\n+#        Minimum:     0.1\n+#        Maximum:    10.0\n+\n+NpcBot.Mult.Damage.Physical = 1.0\n+NpcBot.Mult.Damage.Spell    = 1.0\n+NpcBot.Mult.Healing         = 1.0\n+NpcBot.Mult.HP              = 1.0\n+\n+#\n+#    NpcBot.Mult.Wanderer.Damage\n+#    NpcBot.Mult.Wanderer.Healing\n+#    NpcBot.Mult.Wanderer.HP\n+#    NpcBot.Mult.Wanderer.Speed\n+#        Description: Multipliers for wandering bots' damage, healing, hp and speed.\n+#                     Only affects wandering bots in open world.\n+#        Default:     1.0\n+#        Minimum:     0.1\n+#        Maximum:    10.0\n+\n+NpcBot.Mult.Wanderer.Damage  = 1.0\n+NpcBot.Mult.Wanderer.Healing = 1.0\n+NpcBot.Mult.Wanderer.HP      = 1.0\n+NpcBot.Mult.Wanderer.Speed   = 1.0\n+\n+#\n+#    NpcBot.Mult.Damage.<Class>\n+#        Description: Multipliers for bots' damage by class. Allows to balance dps between bot classes.\n+#        Default:     1.0\n+#        Minimum:     0.1\n+#        Maximum:    10.0\n+\n+NpcBot.Mult.Damage.Warrior           = 1.0\n+NpcBot.Mult.Damage.Paladin           = 1.0\n+NpcBot.Mult.Damage.Hunter            = 1.0\n+NpcBot.Mult.Damage.Rogue             = 1.0\n+NpcBot.Mult.Damage.Priest            = 1.0\n+NpcBot.Mult.Damage.DeathKnight       = 1.0\n+NpcBot.Mult.Damage.Shaman            = 1.0\n+NpcBot.Mult.Damage.Mage              = 1.0\n+NpcBot.Mult.Damage.Warlock           = 1.0\n+NpcBot.Mult.Damage.Druid             = 1.0\n+NpcBot.Mult.Damage.Blademaster       = 1.0\n+NpcBot.Mult.Damage.ObsidianDestroyer = 1.0\n+NpcBot.Mult.Damage.Archmage          = 1.0\n+NpcBot.Mult.Damage.Dreadlord         = 1.0\n+NpcBot.Mult.Damage.SpellBreaker      = 1.0\n+NpcBot.Mult.Damage.DarkRanger        = 1.0\n+NpcBot.Mult.Damage.Necromancer       = 1.0\n+NpcBot.Mult.Damage.SeaWitch          = 1.0\n+NpcBot.Mult.Damage.CryptLord         = 1.0\n+\n+#\n+#    NpcBot.Mult.Damage.Levels\n+#    NpcBot.Mult.Healing.Levels\n+#    NpcBot.Mult.HP.Levels\n+#    NpcBot.Mult.MP.Levels\n+#        Description: Multipliers for bots' damage/healing/hp/mp by level: 0-9,10-19,...,70-79,80+\n+#                     At least 9 values required each.\n+#        Default:     1.0\n+#        Minimum:     0.1\n+#        Maximum:    10.0\n+\n+NpcBot.Mult.Damage.Levels  = 1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0\n+NpcBot.Mult.Healing.Levels = 1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0\n+NpcBot.Mult.HP.Levels      = 1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0\n+NpcBot.Mult.MP.Levels      = 1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0\n+\n+#\n+#    NpcBot.Enable.Dungeon\n+#    NpcBot.Enable.Raid\n+#    NpcBot.Enable.BG\n+#    NpcBot.Enable.Arena\n+#    NpcBot.Enable.DungeonFinder\n+#        Description: Allow bots to enter PvE/PvP areas and Dungeon Finder query.\n+#        Default:     1 - (NpcBot.Enable.Dungeon)\n+#                     0 - (NpcBot.Enable.Raid)\n+#                     0 - (NpcBot.Enable.BG)\n+#                     0 - (NpcBot.Enable.Arena)\n+#                     1 - (NpcBot.Enable.DungeonFinder)\n+\n+NpcBot.Enable.Dungeon       = 1\n+NpcBot.Enable.Raid          = 0\n+NpcBot.Enable.BG            = 0\n+NpcBot.Enable.Arena         = 0\n+NpcBot.Enable.DungeonFinder = 1\n+\n+#\n+#    NpcBot.DisableInstances\n+#        Description: When NpcBot.Enable.Dungeon or/and NpcBot.Enable.Raid options are set to 1\n+#                     excludes certain instance map ids, preventing bots from entering those maps\n+#        Default:     \"\" - (None)\n+#                     \"509,531\" - (Disable AQ20 and AQ40)\n+\n+NpcBot.DisableInstances = \"\"\n+\n+#\n+#    NpcBot.Limit.Dungeon\n+#    NpcBot.Limit.Raid\n+#        Description: Enable/Disable instance players limitation rules for bots.\n+#        Default:     1 - (NpcBot.Limit.Dungeon)\n+#                     1 - (NpcBot.Limit.Raid)\n+\n+NpcBot.Limit.Dungeon = 1\n+NpcBot.Limit.Raid    = 1\n+\n+#\n+#    NpcBot.HideSpawns\n+#        Description: Prevent inactive bots from entering world\n+#        Note:        Botgiver npc will become the only way to hire bots\n+#        Note2:       Only GM's presense will reveal bot's spawn location (temporarily)\n+#        Default:     1 - (Enabled)\n+#                     0 - (Disabled, keep all spawned bots in world)\n+\n+NpcBot.HideSpawns = 1\n+\n+#\n+#    NpcBot.Cost.Hire\n+#    NpcBot.Cost.Rent\n+#        Description: Bot recruitment cost (in copper). Hire cost is the amount player has to pay\n+#                     to recruit a bot. Rent cost is the amount player has to pay per 1 hour\n+#                     to keep a bot with them, bot is automatically removed if player doesn't have\n+#                     enough money to pay the rent cost.\n+#        Note1:       Hire cost is for level 80 characters, for lower levels cost is reduced greatly\n+#        Note2:       Rent is collected every 10 minutes so at least 6 copper per hour is taken\n+#        Default:     1000000 - (NpcBot.Cost.Hire, 100 gold)\n+#                     0       - (NpcBot.Cost.Rent)\n+\n+NpcBot.Cost.Hire = 1000000\n+NpcBot.Cost.Rent = 0\n+\n+#\n+#    NpcBot.UpdateDelay.Base\n+#        Description: Base delay between bot AI update cycles (in milliseconds).\n+#        Note:        This parameter allows you to increase reaction time and slow down bots\n+#                     in general. This may be useful if you want to balance bots in PvP.\n+#        Note2:       This value is added on top of existing semi-randomized delay.\n+#        Default:     0 (No additional delay)\n+\n+NpcBot.UpdateDelay.Base = 0\n+\n+#\n+#    NpcBot.EngageDelay.DPS\n+#    NpcBot.EngageDelay.Heal\n+#        Description: Delay for first healing / non-tank damage after target was engaged\n+#                     by tank (in milliseconds).\n+#        Note:        This does not affect only bosses - all combat except PvP will be affected.\n+#        Note2:       This value affects all owned bots and is set for every player at login.\n+#        Default:     0 - (No delay)\n+#                     1000 - (1 second)\n+\n+NpcBot.EngageDelay.DPS  = 0\n+NpcBot.EngageDelay.Heal = 0\n+\n+#\n+#    NpcBot.PvP\n+#        Description: Allow bots to attack player-controlled units (players, pets, bots, etc.).\n+#        Note:        This rule only applies to player-controlled bots.\n+#        Default:     1\n+\n+NpcBot.PvP = 1\n+\n+#\n+#    NpcBot.Movements.InterruptFood\n+#        Description: Remove food and drink auras when starting to move.\n+#        Note:        Bots don't use food or drink if not standing still.\n+#        Default:     0 - (Do not interrupt)\n+#                     1 - (Interrupt food and drink)\n+\n+NpcBot.Movements.InterruptFood = 0\n+\n+#\n+#    NpcBot.EquipmentDisplay.Enable\n+#        Description: Enable displaying equipment changes other than weapons on bot models.\n+#        Note:        Client limits equipment updates to\n+#                     1) relog\n+#                     2) taking a taxi flight\n+#                     3) teleporting between maps\n+#                     4) not seeing this bot for 3 minutes\n+#                     5) bot changing displayId (polymorph, shapeshift, etc.)\n+#        Note2:       If client registers (5) of a single bot 3+ times\n+#                     said client may crash at exiting game (Error #132) unless (4) happens.\n+#        Note3:       Changing this setting requires server restart.\n+#        Note4:       Bots having no equipment will not appear naked.\n+#        Default:     1 - (Enabled)\n+#                     0 - (Disabled)\n+\n+NpcBot.EquipmentDisplay.Enable = 1\n+\n+#\n+#    NpcBot.EquipmentDisplay.ShowCloak\n+#    NpcBot.EquipmentDisplay.ShowHelm\n+#        Description: Equipment display rules.\n+#        Default:     1 - (NpcBot.EquipmentDisplay.ShowCloak)\n+#                     1 - (NpcBot.EquipmentDisplay.ShowHelm)\n+\n+NpcBot.EquipmentDisplay.ShowCloak = 1\n+NpcBot.EquipmentDisplay.ShowHelm  = 1\n+\n+#\n+#    NpcBot.Transmog.Enable\n+#        Description: Enable transmogrification of bots' equipment.\n+#        Default:     0 - (Disabled)\n+#                     1 - (Enabled)\n+\n+NpcBot.Transmog.Enable = 0\n+\n+#\n+#    NpcBot.Transmog.MixArmorClasses\n+#    NpcBot.Transmog.MixWeaponClasses\n+#    NpcBot.Transmog.MixWeaponInventoryTypes\n+#    NpcBot.Transmog.UseEquipmentSlots\n+#        Description: Enable different armor/weapon types to be transmogrified from one to another\n+#                     (i.e. plate to leather, axe to mace, dagger to polearm).\n+#                     'NpcBot.Transmog.UseEquipmentSlots' makes transmog affect equipment slots\n+#                     instead of item IDs and forces all other options.\n+#        Default:     0 - (NpcBot.Transmog.MixArmorClasses)\n+#                     0 - (NpcBot.Transmog.MixWeaponClasses)\n+#                     0 - (NpcBot.Transmog.MixWeaponInventoryTypes)\n+#                     0 - (NpcBot.Transmog.UseEquipmentSlots)\n+\n+NpcBot.Transmog.MixArmorClasses = 0\n+NpcBot.Transmog.MixWeaponClasses = 0\n+NpcBot.Transmog.MixWeaponInventoryTypes = 0\n+NpcBot.Transmog.UseEquipmentSlots = 0\n+\n+#\n+#    NpcBot.Gossip.ShowEquipmentListItems\n+#        Description: Send whisper message with clickable items list in equipment gossip menu.\n+#        Default:     0 - (Disable)\n+#                     1 - (Enable)\n+\n+NpcBot.Gossip.ShowEquipmentListItems = 0\n+\n+#\n+#    NpcBot.GearBank.Enable\n+#        Description: Enable extra bot gear storage, accessed through gossip menu (per player).\n+#        Default:     1 - (Enabled)\n+#                     0 - (Disabled)\n+\n+NpcBot.GearBank.Enable = 1\n+\n+#\n+#    NpcBot.GearBank.Capacity\n+#        Description: Maximum number of items player can keep in bot gear storage.\n+#        Note:        This parameter only affects player's ability to *deposit* items.\n+#        Default:     40 - (Maximum 40 items)\n+#                     0  - (Unlimited capacity)\n+\n+NpcBot.GearBank.Capacity = 40\n+\n+#\n+#    NpcBot.GearBank.EquipmentSets\n+#        Description: Enable players to create bot equipment sets from items currently equipped\n+#                     on a bot, allowing to quickly swap bot equipment using gear bank as storage.\n+#        Default:     0  - (Disabled)\n+#                     10 - (Enabled, allow to keep up to 10 equipment sets per player)\n+#                     30 - (Absolute maximum to fit on a single page, this is a hard limit)\n+\n+NpcBot.GearBank.EquipmentSets = 0\n+\n+#\n+#    NpcBot.Classes.<Class>.Enable\n+#        Description: Allow players to hire bots of certain classes.\n+#        Note:        Some non-standard class abilities may be unbalanced or game breaking.\n+#        Default:     1 - (NpcBot.Classes.Warrior.Enable)\n+#                     1 - (NpcBot.Classes.Paladin.Enable)\n+#                     1 - (NpcBot.Classes.Hunter.Enable)\n+#                     1 - (NpcBot.Classes.Rogue.Enable)\n+#                     1 - (NpcBot.Classes.Priest.Enable)\n+#                     1 - (NpcBot.Classes.DeathKnight.Enable)\n+#                     1 - (NpcBot.Classes.Shaman.Enable)\n+#                     1 - (NpcBot.Classes.Mage.Enable)\n+#                     1 - (NpcBot.Classes.Warlock.Enable)\n+#                     1 - (NpcBot.Classes.Druid.Enable)\n+#                     1 - (NpcBot.Classes.Blademaster.Enable)\n+#                     1 - (NpcBot.Classes.ObsidianDestroyer.Enable)\n+#                     1 - (NpcBot.Classes.Archmage.Enable)\n+#                     1 - (NpcBot.Classes.Dreadlord.Enable)\n+#                     1 - (NpcBot.Classes.SpellBreaker.Enable)\n+#                     1 - (NpcBot.Classes.DarkRanger.Enable)\n+#                     1 - (NpcBot.Classes.Necromancer.Enable)\n+#                     1 - (NpcBot.Classes.SeaWitch.Enable)\n+#                     1 - (NpcBot.Classes.CryptLord.Enable)\n+\n+NpcBot.Classes.Warrior.Enable           = 1\n+NpcBot.Classes.Paladin.Enable           = 1\n+NpcBot.Classes.Hunter.Enable            = 1\n+NpcBot.Classes.Rogue.Enable             = 1\n+NpcBot.Classes.Priest.Enable            = 1\n+NpcBot.Classes.DeathKnight.Enable       = 1\n+NpcBot.Classes.Shaman.Enable            = 1\n+NpcBot.Classes.Mage.Enable              = 1\n+NpcBot.Classes.Warlock.Enable           = 1\n+NpcBot.Classes.Druid.Enable             = 1\n+NpcBot.Classes.Blademaster.Enable       = 1\n+NpcBot.Classes.ObsidianDestroyer.Enable = 1\n+NpcBot.Classes.Archmage.Enable          = 1\n+NpcBot.Classes.Dreadlord.Enable         = 1\n+NpcBot.Classes.SpellBreaker.Enable      = 1\n+NpcBot.Classes.DarkRanger.Enable        = 1\n+NpcBot.Classes.Necromancer.Enable       = 1\n+NpcBot.Classes.SeaWitch.Enable          = 1\n+NpcBot.Classes.CryptLord.Enable         = 1\n+\n+#\n+#    NpcBot.Stats.Limits.Enable\n+#        Description: Enable or disable stats limits for bots.\n+#        Default:     0 - Disabled\n+\n+NpcBot.Stats.Limits.Enable = 0\n+\n+#\n+#    NpcBot.Stats.Limits.<Stat>\n+#        Description: Set dodge, parry, block and crit chance percentage limit for bots.\n+#        Note:        Some bot classes may ignore some of these values.\n+#        Note2:       Auras can still increase these stats above limit.\n+#        Default:     95.0 (95%)\n+\n+NpcBot.Stats.Limits.Dodge = 95.0\n+NpcBot.Stats.Limits.Parry = 95.0\n+NpcBot.Stats.Limits.Block = 95.0\n+NpcBot.Stats.Limits.Crit  = 95.0\n+\n+#\n+#    NpcBot.InfoPacketsLimit\n+#        Description: This is a workaround for known issue #5.\n+#                     If more than 100 bots are spawned in a single spot players trying\n+#                     to approach them will be kicked by AntiDOS protection due to\n+#                     'flooding' CMSG_GET_MIRRORIMAGE_DATA packets. This setting\n+#                     overrides packets limit per tick for that request type.\n+#        Note:        If you care about your server stability at all, use this only as a\n+#                     temporary solution and spread your bots spawn points properly.\n+#        Default:     -1  - (use default limit set by TC devs)\n+#                     500 - (500 bots in one spot won't get you kicked)\n+\n+NpcBot.InfoPacketsLimit = -1\n+\n+#\n+#    NpcBot.OwnershipExpireTime\n+#        Description: Time (in seconds) before bot ownership is automatically cancelled.\n+#        Note:        NPCBot ownership may only expire after player goes offline.\n+#        Note2:       All items will be mailed back to player as usual.\n+#        Default:     0 - (Disabled)\n+#                     604800 - (7 Days)\n+\n+NpcBot.OwnershipExpireTime = 0\n+\n+#\n+#    NpcBot.OwnershipExpireMode\n+#        Description: Ownership expiration mode. Determines when the timer starts.\n+#        Default:     0 - (Player goes offline, timer resets if player logs back in)\n+#                     1 - (Player hires the bot, timer never resets)\n+\n+NpcBot.OwnershipExpireMode = 0\n+\n+#\n+#    NpcBot.EnrageOnDismiss\n+#        Description: Enable Berserk buff when bot is dismissed and related hostile reaction.\n+#        Default:     1 - (Enabled)\n+#                     0 - (Disabled)\n+\n+NpcBot.EnrageOnDismiss = 1\n+ \n+#\n+#    NpcBot.WanderingBots.Continents.Count\n+#        Description: Desired number of free wandering bots to generate. Wandering bots roam\n+#                     around the map looking for trouble. Names and visuals are cloned from\n+#                     existing non-spawned bots. Wandering bots aren't saved in DB.\n+#        Note:        Wandering bots keep grids loaded, increasing CPU and memory usage.\n+#        Note2:       You must have at least this number of non-spawned bots in creature_template.\n+#        Default:     0 - (Disabled)\n+\n+NpcBot.WanderingBots.Continents.Count = 0\n+\n+#\n+#    NpcBot.WanderingBots.Continents.Levels\n+#        Description: Percentage of wandering bots to spawn per level bracket:\n+#                     0-9, 10-19, 20,29, ... , 70-79, 80+.\n+#        Note:        Total percentage must be exactly 100.\n+#        Note2:       Classes with minimum level requirement may ignore this parameter.\n+#        Default:     25,15,15,10,5,10,20,0,0\n+\n+NpcBot.WanderingBots.Continents.Levels = 25,15,15,10,5,10,20,0,0\n+\n+#\n+#    NpcBot.WanderingBots.Continents.Maps\n+#        Description: Continent map IDs where wandering bots are allowed to spawn.\n+#        Note:        Wandering bots will never outlevel the map they are in.\n+#        Default:     0,1,530,571 - (Eastern Kingdoms, Kalimdor, Outland, Northrend)\n+\n+NpcBot.WanderingBots.Continents.Maps = 0,1,530,571\n+\n+#\n+#    NpcBot.WanderingBots.Continents.XPGain\n+#        Description: XP gained by wandering bots mutiplier. Directly affects bot leveling rate.\n+#        Default:     1.0 - (100% XP gained)\n+#                     0.1 - (10% XP gained)\n+#        Minimum:     0.0\n+#        Maximum:   100.0\n+\n+NpcBot.WanderingBots.Continents.XPGain = 1.0\n+\n+#\n+#    NpcBot.WanderingBots.KillReward.Money\n+#    NpcBot.WanderingBots.KillReward.ItemCount\n+#    NpcBot.WanderingBots.KillReward.ItemQuality\n+#        Description: Wandering bot kill loot reward. World maps only.\n+#                     Money: Amount of money (in copper) to drop at level 80,\n+#                       before level and kill count vs death count normalization.\n+#                     ItemCount: Maximum number of items to drop, item ids are taken from\n+#                       bot equipment. Range: 0..18.\n+#                     ItemQuality: Maximum quality of dropped items. Most bots are equipped\n+#                       with 2/3/4 (uncommon/rare/epic) Range: 0..7.\n+#        Default:     0 - (NpcBot.WanderingBots.KillReward.Money)\n+#                     0 - (NpcBot.WanderingBots.KillReward.ItemCount)\n+#                     0 - (NpcBot.WanderingBots.KillReward.ItemQuality)\n+\n+NpcBot.WanderingBots.KillReward.Money       = 0\n+NpcBot.WanderingBots.KillReward.ItemCount   = 0\n+NpcBot.WanderingBots.KillReward.ItemQuality = 0\n+\n+#\n+#    NpcBot.WanderingBots.MaxItemLevel.Levels\n+#        Description: Maximum item ilevel to generate for wandering bots per level bracket:\n+#                     0-9, 10-19, 20,29, ... , 70-79, 80+.\n+#        Note:        If item generation attempt fails becuse of item ilevel restriction\n+#                     the item will be generated again with this restriction ignored\n+#        Example:     0,0,0,0,0,0,0,0,200 makes level 80+ wandering bots only generate\n+#                     items of ilevel 200 or less\n+#        Default:     0,0,0,0,0,0,0,0,0\n+\n+NpcBot.WanderingBots.MaxItemLevel.Levels = 0,0,0,0,0,0,0,0,0\n+\n+#\n+#    NpcBot.WanderingBots.BG.Enable\n+#        Description: Allow wandering bots generation for Battlegrounds.\n+#        Note:        Bots are temporarily borrowed from non-spawned bots pool.\n+#        Default:     0 - (Disabled)\n+#                     1 - (Enable)\n+\n+NpcBot.WanderingBots.BG.Enable = 0\n+\n+#\n+#    NpcBot.WanderingBots.BG.CapLevel\n+#        Description: Enforce BG bot maximum level limit set by Expansion and MaxPlayerLevel\n+#                     config paramter values.\n+#        Default:     0 - (Disabled)\n+#                     1 - (Enable)\n+\n+NpcBot.WanderingBots.BG.CapLevel = 0\n+\n+#\n+#    NpcBot.WanderingBots.BG.CapLevelByFirstPlayer\n+#        Description: Prevent setting BG bot level higher than player triggering its generation\n+#        Default:     0 - (Disabled)\n+#                     1 - (Enable)\n+\n+NpcBot.WanderingBots.BG.CapLevelByFirstPlayer = 0\n+\n+#\n+#    NpcBot.WanderingBots.BG.TargetTeamPlayersCount.<BGTYPE>\n+#        Description: Target BG players count per team to aim for when generating BG bots.\n+#        Note:        These values can't go beyond BG minimum / maximum players per team bounds.\n+#        Default:     30 - (NpcBot.WanderingBots.BG.TargetTeamPlayersCount.AV)\n+#                     8  - (NpcBot.WanderingBots.BG.TargetTeamPlayersCount.WS)\n+#                     12 - (NpcBot.WanderingBots.BG.TargetTeamPlayersCount.AB)\n+#                     12 - (NpcBot.WanderingBots.BG.TargetTeamPlayersCount.EY)\n+#                     0  - (NpcBot.WanderingBots.BG.TargetTeamPlayersCount.SA) (NYI, Disabled)\n+#                     0  - (NpcBot.WanderingBots.BG.TargetTeamPlayersCount.IC) (NYI, Disabled)\n+\n+NpcBot.WanderingBots.BG.TargetTeamPlayersCount.AV = 30\n+NpcBot.WanderingBots.BG.TargetTeamPlayersCount.WS = 8\n+NpcBot.WanderingBots.BG.TargetTeamPlayersCount.AB = 12\n+NpcBot.WanderingBots.BG.TargetTeamPlayersCount.EY = 12\n+NpcBot.WanderingBots.BG.TargetTeamPlayersCount.SA = 0\n+NpcBot.WanderingBots.BG.TargetTeamPlayersCount.IC = 0\n+\n+#\n+#    NpcBot.WanderingBots.Classes.<Class>.Enable\n+#        Description: Allow players to hire bots of certain classes.\n+#        Note:        Some non-standard class abilities may be unbalanced or game breaking.\n+#        Default:     1 - (NpcBot.Classes.Warrior.Enable)\n+#                     1 - (NpcBot.Classes.Paladin.Enable)\n+#                     1 - (NpcBot.Classes.Hunter.Enable)\n+#                     1 - (NpcBot.Classes.Rogue.Enable)\n+#                     1 - (NpcBot.Classes.Priest.Enable)\n+#                     1 - (NpcBot.Classes.DeathKnight.Enable)\n+#                     1 - (NpcBot.Classes.Shaman.Enable)\n+#                     1 - (NpcBot.Classes.Mage.Enable)\n+#                     1 - (NpcBot.Classes.Warlock.Enable)\n+#                     1 - (NpcBot.Classes.Druid.Enable)\n+#                     1 - (NpcBot.Classes.Blademaster.Enable)\n+#                     1 - (NpcBot.Classes.ObsidianDestroyer.Enable)\n+#                     1 - (NpcBot.Classes.Archmage.Enable)\n+#                     1 - (NpcBot.Classes.Dreadlord.Enable)\n+#                     1 - (NpcBot.Classes.SpellBreaker.Enable)\n+#                     1 - (NpcBot.Classes.DarkRanger.Enable)\n+#                     1 - (NpcBot.Classes.Necromancer.Enable)\n+#                     1 - (NpcBot.Classes.SeaWitch.Enable)\n+#                     1 - (NpcBot.Classes.CryptLord.Enable)\n+\n+NpcBot.WanderingBots.Classes.Warrior.Enable           = 1\n+NpcBot.WanderingBots.Classes.Paladin.Enable           = 1\n+NpcBot.WanderingBots.Classes.Hunter.Enable            = 1\n+NpcBot.WanderingBots.Classes.Rogue.Enable             = 1\n+NpcBot.WanderingBots.Classes.Priest.Enable            = 1\n+NpcBot.WanderingBots.Classes.DeathKnight.Enable       = 1\n+NpcBot.WanderingBots.Classes.Shaman.Enable            = 1\n+NpcBot.WanderingBots.Classes.Mage.Enable              = 1\n+NpcBot.WanderingBots.Classes.Warlock.Enable           = 1\n+NpcBot.WanderingBots.Classes.Druid.Enable             = 1\n+NpcBot.WanderingBots.Classes.Blademaster.Enable       = 1\n+NpcBot.WanderingBots.Classes.ObsidianDestroyer.Enable = 1\n+NpcBot.WanderingBots.Classes.Archmage.Enable          = 1\n+NpcBot.WanderingBots.Classes.Dreadlord.Enable         = 1\n+NpcBot.WanderingBots.Classes.SpellBreaker.Enable      = 1\n+NpcBot.WanderingBots.Classes.DarkRanger.Enable        = 1\n+NpcBot.WanderingBots.Classes.Necromancer.Enable       = 1\n+NpcBot.WanderingBots.Classes.SeaWitch.Enable          = 1\n+NpcBot.WanderingBots.Classes.CryptLord.Enable         = 1\n+\n+#\n+#    NpcBot.WanderingBots.SkipTarget.Questgiver\n+#    NpcBot.WanderingBots.SkipTarget.Flightmaster\n+#        Description: Make wandering bots skip certain npc types when selecting attack target.\n+#        Note:        This option does not apply to npcs engaging the bot on their own accord.\n+#        Default:     0 - (NpcBot.WanderingBots.SkipTarget.Questgiver)\n+#                     0 - (NpcBot.WanderingBots.SkipTarget.Flightmaster)\n+\n+NpcBot.WanderingBots.SkipTarget.Questgiver   = 0\n+NpcBot.WanderingBots.SkipTarget.Flightmaster = 0\n+\n+#\n+#    NpcBot.HK.Enable\n+#        Description: Count NPCBot kill at honor kill.\n+#        Default:     1 - (Enabled)\n+#                     0 - (Disabled)\n+\n+NpcBot.HK.Enable = 1\n+\n+#\n+#    NpcBot.HK.Message.Enable\n+#        Description: Show 'HK: <rank>' message for NPCBot honor kills.\n+#        Default:     0 - (Disabled)\n+#                     1 - (Enabled)\n+\n+NpcBot.HK.Message.Enable = 0\n+\n+#\n+#    NpcBot.HK.Achievements.Enable\n+#        Description: Count NPCBot honor kills towards PvP achievements.\n+#        Default:     0 - (Disabled)\n+#                     1 - (Enabled)\n+\n+NpcBot.HK.Achievements.Enable = 0\n+\n+#\n+#    NpcBot.HK.Rate.Honor\n+#        Description: Honor gained multiplier for NPCBot honor kills.\n+#        Default:     1.0\n+#        Minimum:     0.1\n+#        Maximum:    10.0\n+\n+NpcBot.HK.Rate.Honor = 1.0\n+\n+#\n+#    NpcBot.Premade.Enable\n+#        Description: Enable joining BG as premade group while having NPCBots in group.\n+#        Note:        Queued premade groups do not trigger BG bots generation.\n+#        Default:     0 - (Disabled)\n+#                     1 - (Enabled)\n+\n+NpcBot.Premade.Enable = 0\n+\n+#\n+###################################################################################################\n+\n ###################################################################################################\n #                                                                                                 #\n # GAME SETTINGS END                                                                               #\ndiff --git a/src/server/database/Database/Implementation/CharacterDatabase.cpp b/src/server/database/Database/Implementation/CharacterDatabase.cpp\nindex 31664d06bf..8952e55e8e 100644\n--- a/src/server/database/Database/Implementation/CharacterDatabase.cpp\n+++ b/src/server/database/Database/Implementation/CharacterDatabase.cpp\n@@ -623,6 +623,38 @@ void CharacterDatabaseConnection::DoPrepareStatements()\n     // world_state\n     PrepareStatement(CHAR_SEL_WORLD_STATE, \"SELECT Id, Data FROM world_state\", CONNECTION_SYNCH);\n     PrepareStatement(CHAR_REP_WORLD_STATE, \"REPLACE INTO world_state (Id, Data) VALUES(?, ?)\", CONNECTION_ASYNC);\n+\n+    // NPCBots\n+    PrepareStatement(CHAR_UPD_NPCBOT_OWNER, \"UPDATE characters_npcbot SET owner = ?, hire_time = FROM_UNIXTIME(?) WHERE entry = ?\", CONNECTION_ASYNC);\n+    PrepareStatement(CHAR_UPD_NPCBOT_OWNER_ALL, \"UPDATE characters_npcbot SET owner = ?, hire_time = FROM_UNIXTIME(?) WHERE owner = ?\", CONNECTION_ASYNC);\n+    PrepareStatement(CHAR_UPD_NPCBOT_ROLES, \"UPDATE characters_npcbot SET roles = ? WHERE entry = ?\", CONNECTION_ASYNC);\n+    PrepareStatement(CHAR_SEL_NPCBOT_EQUIP_BY_ITEM_INSTANCE, \"SELECT creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomPropertyId, durability, playedTime, text, guid, itemEntry, owner_guid \"\n+        \"FROM item_instance WHERE guid IN (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\", CONNECTION_SYNCH);\n+    PrepareStatement(CHAR_UPD_NPCBOT_EQUIP, \"UPDATE characters_npcbot SET equipMhEx = ?, equipOhEx = ?, equipRhEx = ?, \"\n+        \"equipHead = ?, equipShoulders = ?, equipChest = ?, equipWaist = ?, equipLegs = ?, equipFeet = ?, equipWrist = ?, equipHands = ?, equipBack = ?, equipBody = ?, equipFinger1 = ?, equipFinger2 = ?, equipTrinket1 = ?, equipTrinket2 = ?, equipNeck = ? WHERE entry = ?\", CONNECTION_ASYNC);\n+    PrepareStatement(CHAR_UPD_NPCBOT_EQUIP_RESET_ALL, \"UPDATE characters_npcbot SET equipMhEx = 0, equipOhEx = 0, equipRhEx = 0, \"\n+        \"equipHead = 0, equipShoulders = 0, equipChest = 0, equipWaist = 0, equipLegs = 0, equipFeet = 0, equipWrist = 0, equipHands = 0, equipBack = 0, equipBody = 0, equipFinger1 = 0, equipFinger2 = 0, equipTrinket1 = 0, equipTrinket2 = 0, equipNeck = 0 WHERE owner = ?\", CONNECTION_ASYNC);\n+    PrepareStatement(CHAR_DEL_NPCBOT, \"DELETE FROM characters_npcbot WHERE entry = ?\", CONNECTION_ASYNC);\n+    PrepareStatement(CHAR_INS_NPCBOT, \"INSERT INTO characters_npcbot (entry, roles, spec, faction) VALUES (?, ?, ?, ?)\", CONNECTION_ASYNC);\n+    PrepareStatement(CHAR_UPD_NPCBOT_FACTION, \"UPDATE characters_npcbot SET faction = ? WHERE entry = ?\", CONNECTION_ASYNC);\n+    PrepareStatement(CHAR_UPD_NPCBOT_SPEC, \"UPDATE characters_npcbot SET spec = ? WHERE entry = ?\", CONNECTION_ASYNC);\n+    PrepareStatement(CHAR_UPD_NPCBOT_SHARED_OWNERS, \"UPDATE characters_npcbot SET shared_owners = ? WHERE entry = ?\", CONNECTION_ASYNC);\n+    PrepareStatement(CHAR_UPD_NPCBOT_SHARED_OWNERS_ALL, \"UPDATE characters_npcbot SET shared_owners = NULL WHERE owner = ?\", CONNECTION_ASYNC);\n+    PrepareStatement(CHAR_UPD_NPCBOT_DISABLED_SPELLS, \"UPDATE characters_npcbot SET spells_disabled = ? WHERE entry = ?\", CONNECTION_ASYNC);\n+    PrepareStatement(CHAR_UPD_NPCBOT_MISCVALUES, \"UPDATE characters_npcbot SET miscvalues = ? WHERE entry = ?\", CONNECTION_ASYNC);\n+    PrepareStatement(CHAR_REP_NPCBOT_STATS, \"REPLACE INTO characters_npcbot_stats \"\n+        \"(entry, maxhealth, maxpower, strength, agility, stamina, intellect, spirit, armor, defense, resHoly, resFire, resNature, resFrost, resShadow, resArcane, blockPct, dodgePct, parryPct, critPct, attackPower, spellPower, spellPen, hastePct, hitBonusPct, expertise, armorPenPct) VALUES \"\n+        \"(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\", CONNECTION_ASYNC);\n+    PrepareStatement(CHAR_REP_NPCBOT_TRANSMOG, \"REPLACE INTO characters_npcbot_transmog (entry, slot, item_id, fake_id) VALUES (?, ?, ?, ?)\", CONNECTION_ASYNC);\n+    PrepareStatement(CHAR_DEL_NPCBOT_TRANSMOG, \"DELETE FROM characters_npcbot_transmog WHERE entry = ?\", CONNECTION_ASYNC);\n+    PrepareStatement(CHAR_DEL_NPCBOT_TRANSMOG_ALL, \"DELETE FROM characters_npcbot_transmog WHERE entry IN (SELECT entry FROM characters_npcbot WHERE owner = ?)\", CONNECTION_ASYNC);\n+    PrepareStatement(CHAR_REP_NPCBOT_GROUP_MEMBER, \"REPLACE INTO characters_npcbot_group_member (guid, entry, memberFlags, subgroup, roles) VALUES(?, ?, ?, ?, ?)\", CONNECTION_ASYNC);\n+    PrepareStatement(CHAR_DEL_NPCBOT_GROUP_MEMBER, \"DELETE FROM characters_npcbot_group_member WHERE entry = ?\", CONNECTION_ASYNC);\n+    PrepareStatement(CHAR_DEL_NPCBOT_GROUP_MEMBER_ALL, \"DELETE FROM characters_npcbot_group_member WHERE guid = ?\", CONNECTION_ASYNC);\n+    PrepareStatement(CHAR_UPD_NPCBOT_GROUP_MEMBER_FLAG, \"UPDATE characters_npcbot_group_member SET memberFlags = ? WHERE entry = ?\", CONNECTION_ASYNC);\n+    PrepareStatement(CHAR_INS_NPCBOT_LOG, \"INSERT INTO characters_npcbot_logs (entry, owner, mapid, inmap, inworld, type, param1, param2, param3, param4, param5) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\", CONNECTION_ASYNC);\n+    PrepareStatement(CHAR_SEL_NPCBOT_ACC_BOT_COUNT, \"SELECT COUNT(entry) FROM characters_npcbot WHERE owner IN (SELECT guid FROM characters WHERE account = ?);\", CONNECTION_SYNCH);\n+    // End NPCBots\n }\n \n CharacterDatabaseConnection::CharacterDatabaseConnection(MySQLConnectionInfo& connInfo) : MySQLConnection(connInfo)\ndiff --git a/src/server/database/Database/Implementation/CharacterDatabase.h b/src/server/database/Database/Implementation/CharacterDatabase.h\nindex 968bafa698..b5eeab05f9 100644\n--- a/src/server/database/Database/Implementation/CharacterDatabase.h\n+++ b/src/server/database/Database/Implementation/CharacterDatabase.h\n@@ -534,6 +534,33 @@ enum CharacterDatabaseStatements : uint32\n     CHAR_SEL_WORLD_STATE,\n     CHAR_REP_WORLD_STATE,\n \n+    // NPCBot\n+    CHAR_UPD_NPCBOT_OWNER,\n+    CHAR_UPD_NPCBOT_OWNER_ALL,\n+    CHAR_UPD_NPCBOT_ROLES,\n+    CHAR_SEL_NPCBOT_EQUIP_BY_ITEM_INSTANCE,\n+    CHAR_UPD_NPCBOT_EQUIP,\n+    CHAR_UPD_NPCBOT_EQUIP_RESET_ALL,\n+    CHAR_DEL_NPCBOT,\n+    CHAR_INS_NPCBOT,\n+    CHAR_UPD_NPCBOT_FACTION,\n+    CHAR_UPD_NPCBOT_SPEC,\n+    CHAR_UPD_NPCBOT_SHARED_OWNERS,\n+    CHAR_UPD_NPCBOT_SHARED_OWNERS_ALL,\n+    CHAR_UPD_NPCBOT_DISABLED_SPELLS,\n+    CHAR_UPD_NPCBOT_MISCVALUES,\n+    CHAR_REP_NPCBOT_STATS,\n+    CHAR_REP_NPCBOT_TRANSMOG,\n+    CHAR_DEL_NPCBOT_TRANSMOG,\n+    CHAR_DEL_NPCBOT_TRANSMOG_ALL,\n+    CHAR_REP_NPCBOT_GROUP_MEMBER,\n+    CHAR_DEL_NPCBOT_GROUP_MEMBER,\n+    CHAR_DEL_NPCBOT_GROUP_MEMBER_ALL,\n+    CHAR_UPD_NPCBOT_GROUP_MEMBER_FLAG,\n+    CHAR_INS_NPCBOT_LOG,\n+    CHAR_SEL_NPCBOT_ACC_BOT_COUNT,\n+    // End NPCBot\n+\n     MAX_CHARACTERDATABASE_STATEMENTS\n };\n \ndiff --git a/src/server/database/Database/Implementation/WorldDatabase.cpp b/src/server/database/Database/Implementation/WorldDatabase.cpp\nindex 128c0c7c07..0d2136781e 100644\n--- a/src/server/database/Database/Implementation/WorldDatabase.cpp\n+++ b/src/server/database/Database/Implementation/WorldDatabase.cpp\n@@ -111,6 +111,11 @@ void WorldDatabaseConnection::DoPrepareStatements()\n     // 0: uint8\n     PrepareStatement(WORLD_SEL_REQ_XP, \"SELECT Experience FROM player_xp_for_level WHERE Level = ?\", CONNECTION_SYNCH);\n     PrepareStatement(WORLD_UPD_VERSION, \"UPDATE version SET core_version = ?, core_revision = ?\", CONNECTION_ASYNC);\n+\n+    //npcbot\n+    PrepareStatement(WORLD_UPD_NPCBOT_NAME, \"UPDATE creature_template SET name = ? WHERE entry = ?\", CONNECTION_SYNCH);\n+    PrepareStatement(WORLD_REP_NPCBOT_APPEARANCE, \"REPLACE INTO creature_template_npcbot_appearance VALUES (?, ?, ?, ?, ?, ?, ?, ?)\", CONNECTION_SYNCH);\n+    //end npcbot\n }\n \n WorldDatabaseConnection::WorldDatabaseConnection(MySQLConnectionInfo& connInfo) : MySQLConnection(connInfo)\ndiff --git a/src/server/database/Database/Implementation/WorldDatabase.h b/src/server/database/Database/Implementation/WorldDatabase.h\nindex d80c854ead..79a12d7d24 100644\n--- a/src/server/database/Database/Implementation/WorldDatabase.h\n+++ b/src/server/database/Database/Implementation/WorldDatabase.h\n@@ -117,6 +117,11 @@ enum WorldDatabaseStatements : uint32\n     WORLD_INS_GAMEOBJECT_ADDON,\n     WORLD_UPD_VERSION,\n \n+    //npcbot\n+    WORLD_UPD_NPCBOT_NAME,\n+    WORLD_REP_NPCBOT_APPEARANCE,\n+    //end npcbot\n+\n     MAX_WORLDDATABASE_STATEMENTS\n };\n \ndiff --git a/src/server/game/AI/CoreAI/UnitAI.h b/src/server/game/AI/CoreAI/UnitAI.h\nindex af3f4c9075..3fbb2ef877 100644\n--- a/src/server/game/AI/CoreAI/UnitAI.h\n+++ b/src/server/game/AI/CoreAI/UnitAI.h\n@@ -77,6 +77,9 @@ struct DefaultTargetSelector : public Acore::unary_function<Unit*, bool>\n             return false;\n \n         if (m_playerOnly && (!target->IsPlayer()))\n+            //npcbot: allow to target bots\n+            //if (!(target->IsNPCBot()))\n+            //end npcbot\n             return false;\n \n         if (m_dist > 0.0f && !me->IsWithinCombatRange(target, m_dist))\ndiff --git a/src/server/game/AI/NpcBots/bot_Events.h b/src/server/game/AI/NpcBots/bot_Events.h\nnew file mode 100644\nindex 0000000000..779e5a6a3c\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bot_Events.h\n@@ -0,0 +1,80 @@\n+#ifndef BOT_EVENTS_H_\n+#define BOT_EVENTS_H_\n+\n+#include \"EventProcessor.h\"\n+\n+/*\n+Name: bot_Events\n+%Complete: ???\n+Comment: Custom event types for NPCBot system by Trickerer (onlysuffering@gmail.com)\n+Category: creature_cripts/custom/bots/events\n+\n+Notes:\n+All events must be executed through botAI\n+*/\n+\n+//Teleport home: near or far, only used for free bots\n+class TeleportHomeEvent : public BasicEvent\n+{\n+    friend class bot_ai;\n+protected:\n+    TeleportHomeEvent(bot_ai* ai, bool reset) : _ai(ai), _reset(reset) {}\n+    ~TeleportHomeEvent() {}\n+\n+    TeleportHomeEvent(TeleportHomeEvent const&) = delete;\n+\n+    bool Execute(uint64 /*e_time*/, uint32 /*p_time*/) override\n+    {\n+        _ai->TeleportHome(_reset);\n+        return true;\n+    }\n+\n+private:\n+    bot_ai* _ai;\n+    bool _reset;\n+};\n+//Delayed teleport finish: adds bot back to world on new location\n+class TeleportFinishEvent : public BasicEvent\n+{\n+    friend class bot_ai;\n+    friend class BotMgr;\n+protected:\n+    TeleportFinishEvent(bot_ai* ai, bool reset) : _ai(ai), _reset(reset) {}\n+    ~TeleportFinishEvent() {}\n+\n+    TeleportFinishEvent(TeleportFinishEvent const&) = delete;\n+\n+    //Execute is always called while creature is out of world so ai is never deleted\n+    bool Execute(uint64 /*e_time*/, uint32 /*p_time*/) override\n+    {\n+        _ai->FinishTeleport(_reset);\n+        return true;\n+    }\n+\n+private:\n+    bot_ai* _ai;\n+    bool _reset;\n+};\n+//Await state removal\n+class AwaitStateRemovalEvent : public BasicEvent\n+{\n+    friend class bot_ai;\n+protected:\n+    AwaitStateRemovalEvent(bot_ai* ai, uint8 state) : _ai(ai), _state(state) {}\n+    ~AwaitStateRemovalEvent() = default;\n+\n+    AwaitStateRemovalEvent(AwaitStateRemovalEvent const&) = delete;\n+\n+    //Execute is always called while creature is out of world so ai is never deleted\n+    bool Execute(uint64 /*e_time*/, uint32 /*p_time*/) override\n+    {\n+        _ai->EventRemoveBotAwaitState(_state);\n+        return true;\n+    }\n+\n+private:\n+    bot_ai* _ai;\n+    const uint8 _state;\n+};\n+\n+#endif\ndiff --git a/src/server/game/AI/NpcBots/bot_GridNotifiers.h b/src/server/game/AI/NpcBots/bot_GridNotifiers.h\nnew file mode 100644\nindex 0000000000..12010f4ab9\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bot_GridNotifiers.h\n@@ -0,0 +1,1386 @@\n+#ifndef BOT_GRIDNOTIFIERS_H\n+#define BOT_GRIDNOTIFIERS_H\n+\n+#include \"bot_ai.h\"\n+#include \"botspell.h\"\n+#include \"Corpse.h\"\n+#include \"Creature.h\"\n+#include \"DBCStores.h\"\n+#include \"DynamicObject.h\"\n+#include \"GameObject.h\"\n+#include \"Group.h\"\n+#include \"ObjectAccessor.h\"\n+#include \"Player.h\"\n+#include \"Spell.h\"\n+#include \"SpellAuras.h\"\n+#include \"SpellMgr.h\"\n+#include \"Vehicle.h\"\n+/*\n+Name: bot_GridNotifiers\n+%Complete: 99+\n+Comment: Custom grid notifiers for Bot system by Trickerer (onlysuffering@gmail.com)\n+Category: creature_cripts/custom/bots/grids\n+*/\n+\n+extern bool _botPvP;\n+\n+template<class Check>\n+struct Unit2LastSearcher\n+{\n+    Unit* &i_result1;\n+    Unit* &i_result2;\n+    Check& i_check;\n+\n+    Unit2LastSearcher(Unit* &result1, Unit* &result2, Check& check)\n+        : i_result1(result1), i_result2(result2), i_check(check) { }\n+\n+    void Visit(CreatureMapType &m)\n+    {\n+        for (auto const& d : m)\n+        {\n+            switch (static_cast<uint32>(i_check(d.GetSource())))\n+            {\n+                case 1: i_result1 = d.GetSource(); break;\n+                case 2: i_result2 = d.GetSource(); break;\n+                default:                           break;\n+            }\n+        }\n+    }\n+\n+    void Visit(PlayerMapType &m)\n+    {\n+        for (auto const& d : m)\n+        {\n+            switch (static_cast<uint32>(i_check(d.GetSource())))\n+            {\n+                case 1: i_result1 = d.GetSource(); break;\n+                case 2: i_result2 = d.GetSource(); break;\n+                default:                           break;\n+            }\n+        }\n+    }\n+\n+    template<class NOT_INTERESTED> void Visit(GridRefMgr<NOT_INTERESTED> &) { }\n+};\n+\n+class ImmunityShieldDispelTargetCheck\n+{\n+    public:\n+        explicit ImmunityShieldDispelTargetCheck(Unit const* unit, float dist, bot_ai const* m_ai) :\n+        me(unit), range(dist), ai(m_ai) { }\n+        bool operator()(Unit const* u)\n+        {\n+            if (!_botPvP && me->IsPvP() && u->IsControlledByPlayer())\n+                return false;\n+            if (!u->IsInCombat())\n+                return false;\n+            if (!u->InSamePhase(me))\n+                return false;\n+            if (!me->IsWithinDistInMap(u, range))\n+                return false;\n+            if (!u->isTargetableForAttack())\n+                return false;\n+            //if (ai->InDuel(u))\n+            //    return false;\n+            if (!ai->IsInBotParty(u->GetVictim()))\n+                return false;\n+            if (!u->HasAuraWithMechanic(1u<<MECHANIC_IMMUNE_SHIELD))\n+                return false;\n+\n+            if (!u->IsWithinLOSInMap(me, VMAP::ModelIgnoreFlags::M2, LINEOFSIGHT_ALL_CHECKS))\n+                return false;\n+\n+            return true;\n+        }\n+    private:\n+        Unit const* me;\n+        float range;\n+        bot_ai const* ai;\n+};\n+\n+class NearestHostileUnitCheck\n+{\n+    enum : uint32 {\n+        INVALID         = 0,\n+        VALID_PRIMARY   = 1,\n+        VALID_SECONDARY = 2\n+    };\n+\n+    public:\n+        NearestHostileUnitCheck(NearestHostileUnitCheck const&) = delete;\n+        explicit NearestHostileUnitCheck(Unit const* unit, float dist, bool magic, bot_ai const* m_ai, bool targetCCed, bool withSecondary) :\n+        me(unit), m_range(dist), byspell(magic), ai(m_ai), AttackCCed(targetCCed), checkSecondary(withSecondary)\n+        { free = ai->IAmFree(); berserk = free && (ai->IsWanderer() || unit->GetFaction() == FACTION_TEMPLATE_NEUTRAL_HOSTILE); }\n+        explicit NearestHostileUnitCheck(Unit const* unit, float dist, bool magic, bot_ai const* m_ai) :\n+        NearestHostileUnitCheck(unit, dist, magic, m_ai, true, false)\n+        {}\n+        uint32 operator()(Unit const* u)\n+        {\n+            if (u == me)\n+                return INVALID;\n+            if (!me->IsWithinDistInMap(u, m_range, !berserk))\n+                return INVALID;\n+            if (berserk && std::fabs(me->GetPositionZ() - u->GetPositionZ()) > (m_range * 0.25f + 5.0f))\n+                return INVALID;\n+            if (me->HasUnitState(UNIT_STATE_ROOT) && (ai->HasRole(BOT_ROLE_RANGED) == me->IsWithinDistInMap(u, 8.f)))\n+                return INVALID;\n+            if (!berserk && !u->IsInCombat())\n+                return INVALID;\n+            //if (ai->InDuel(u))\n+            //    return false;\n+            if (!AttackCCed && (u->HasUnitState(UNIT_STATE_CONFUSED | UNIT_STATE_STUNNED | UNIT_STATE_FLEEING | UNIT_STATE_DISTRACTED | UNIT_STATE_CONFUSED_MOVE | UNIT_STATE_FLEEING_MOVE)))\n+                return INVALID;//do not allow CCed units if checked\n+            //if (u->HasUnitState(UNIT_STATE_CASTING) && (u->IsPlayer() || u->IsPet()))\n+            //    for (uint8 i = 0; i != CURRENT_MAX_SPELL; ++i)\n+            //        if (Spell* spell = u->GetCurrentSpell(i))\n+            //            if (ai->IsInBotParty(spell->m_targets.GetUnitTarget()))\n+            //                return true;\n+            if (!berserk && !ai->IsInBotParty(u->GetVictim()))\n+                return INVALID;\n+\n+            if (free && !berserk && u->IsControlledByPlayer() && !u->IsInCombat())\n+                return INVALID;\n+\n+            if (!u->IsWithinLOSInMap(me, VMAP::ModelIgnoreFlags::Nothing, LINEOFSIGHT_ALL_CHECKS))\n+                return INVALID;\n+\n+            uint32 res = VALID_PRIMARY;\n+            if (!ai->CanBotAttack(u, byspell))\n+            {\n+                if (checkSecondary && ai->CanBotAttack(u, byspell, checkSecondary))\n+                    res = VALID_SECONDARY;\n+                else\n+                    return INVALID;\n+            }\n+\n+            m_range = me->GetDistance(u);   // use found unit range as new range limit for next check\n+            return res;\n+        }\n+    private:\n+        Unit const* me;\n+        float m_range;\n+        bool byspell;\n+        bot_ai const* ai;\n+        bool AttackCCed;\n+        bool checkSecondary;\n+        bool free;\n+        bool berserk;\n+};\n+\n+class NearbyHostileVehicleTargetCheck\n+{\n+    public:\n+        explicit NearbyHostileVehicleTargetCheck(Unit const* unit, float dist, bot_ai const* m_ai) : veh(unit), m_range(dist), ai(m_ai) { }\n+        bool operator()(Unit const* u)\n+        {\n+            if (u == veh)\n+                return false;\n+            if (!veh->IsWithinDistInMap(u, m_range))\n+                return false;\n+            if (!u->IsInCombat())\n+                return false;\n+            if (!_botPvP && veh->IsPvP() && u->IsControlledByPlayer())\n+                return false;\n+            //if (!veh->IsValidAttackTarget(u))\n+            //    return false;\n+            //if (!u->isTargetableForAttack(false))\n+            //    return false;\n+            //if (ai->IsInBotParty(u))\n+            //    return false;\n+            if (!ai->IsInBotParty(u->GetVictim()))\n+                return false;\n+            if (u->GetReactionTo(veh) >= REP_NEUTRAL)\n+                return false;\n+            //if (!u->IsWithinLOSInMap(veh))\n+            //    return false;\n+\n+            return true;\n+        }\n+    private:\n+        Unit const* veh;\n+        float m_range;\n+        bot_ai const* ai;\n+};\n+\n+class HostileDispelTargetCheck\n+{\n+    public:\n+        explicit HostileDispelTargetCheck(Unit const* unit, float dist = 30, bool stealable = false, bot_ai const* m_ai = nullptr) :\n+        me(unit), m_range(dist), checksteal(stealable), ai(m_ai) { }\n+        bool operator()(Unit const* u) const\n+        {\n+            if (!_botPvP && me->IsPvP() && u->IsControlledByPlayer())\n+                return false;\n+            if (u->IsInCombat() &&\n+                u->InSamePhase(me) &&\n+                u->IsWithinDistInMap(me, m_range) &&\n+                u->isTargetableForAttack() &&\n+                //!ai->InDuel(u) &&\n+                (!ai->IsInBotParty(u) || ai->IsInHeroicOrRaid()) &&\n+                (ai->IsInBotParty(u->GetVictim()) || me->GetVictim() == u))\n+            {\n+                if (!checksteal && u->GetEntry() == 25744 && !u->GetOwnedAuras().empty()) // Sunwell - Dark Fiend\n+                    return true;\n+\n+                if (checksteal)\n+                {\n+                    if (u->IsImmunedToSpell(sSpellMgr->GetSpellInfo(30449)))\n+                        return false; //immune to steal\n+                }\n+                else if (ai->GetBotClass() == BOT_CLASS_SHAMAN)\n+                {\n+                    if (u->IsImmunedToSpell(sSpellMgr->GetSpellInfo(370)))\n+                        return false; //immune to purge\n+                }\n+                //else if (ai->GetBotClass() == BOT_CLASS_PRIEST)\n+                //{\n+                //    if (me->GetLevel() < 70 && u->IsImmunedToSpell(sSpellMgr->GetSpellInfo(527)))\n+                //        return false; //immune to dispel magic\n+                //}\n+\n+                for (auto const& [_, auraApp] : u->GetAppliedAuras())\n+                {\n+                   SpellInfo const*  Info = auraApp->GetBase()->GetSpellInfo();\n+                    if (auraApp->IsPositive() && Info->Dispel == DISPEL_MAGIC &&\n+                        !(Info->Attributes & (SPELL_ATTR0_PASSIVE | SPELL_ATTR0_DO_NOT_DISPLAY)) &&\n+                        !(checksteal && (Info->AttributesEx4 & SPELL_ATTR4_CANNOT_BE_STOLEN)))\n+                    {\n+                        uint32 id = Info->Id;\n+                        if (id != 20050 && id != 20052 && id != 20053 && //Vengeance\n+                            id != 50447 && id != 50448 && id != 50449) //Bloody Vengeance\n+                            return true;\n+                    }\n+                }\n+\n+                //Unit::AuraMap const &Auras = u->GetOwnedAuras();\n+                //SpellInfo const* Info;\n+                //uint32 id;\n+                //for (Unit::AuraMap::const_iterator itr = Auras.begin(); itr != Auras.end(); ++itr)\n+                //{\n+                //    Aura* aura = itr->second;\n+                //    Info = aura->GetSpellInfo();\n+                //    if (Info->Dispel != DISPEL_MAGIC) continue;\n+                //    id = Info->Id;\n+                //    if (id == 20050 || id == 20052 || id == 20053 || //Vengeance\n+                //        id == 50447 || id == 50448 || id == 50449) //Bloody Vengeance\n+                //        continue;\n+                //    if (Info->Attributes & (SPELL_ATTR0_PASSIVE | SPELL_ATTR0_DO_NOT_DISPLAY)) continue;\n+                //    //if (Info->AttributesEx & SPELL_ATTR1_NO_AURA_ICON) continue;\n+                //    if (checksteal && (Info->AttributesEx4 & SPELL_ATTR4_CANNOT_BE_STOLEN)) continue;\n+                //    AuraApplication const* aurApp = aura->GetApplicationOfTarget(u->GetGUID());\n+                //    if (aurApp && aurApp->IsPositive())\n+                //        return true;\n+                //}\n+            }\n+            return false;\n+        }\n+    private:\n+        Unit const* me;\n+        float m_range;\n+        bool checksteal;\n+        bot_ai const* ai;\n+};\n+\n+class AffectedTargetCheck\n+{\n+    public:\n+        explicit AffectedTargetCheck(ObjectGuid casterguid, float dist, uint32 spellId, Player const* groupCheck = 0, uint8 hostileCheckType = 0) :\n+        caster(casterguid), m_range(dist), spell(spellId), checker(groupCheck), needhostile(hostileCheckType) { }\n+        bool operator()(Unit const* u) const\n+        {\n+            if (!u->IsAlive())\n+                return false;\n+            if (caster && u->HasUnitFlag(UNIT_FLAG_NOT_SELECTABLE))\n+                return false;\n+            if (!checker->IsWithinDistInMap(u, m_range))\n+                return false;\n+            if (needhostile == 0 && !u->IsHostileTo(checker)) return false;\n+            //else if (needhostile == 1 && !(gr && gr->IsMember(u->GetGUID()) && u->IsPlayer())) return false;\n+            //else if (needhostile == 2 && !(gr && gr->IsMember(u->GetGUID()))) return false;\n+            else if (needhostile == 3 && !u->IsFriendlyTo(checker)) return false;\n+            else if (needhostile == 4 && !(u->IsPlayer() && u->IsFriendlyTo(checker))) return false;\n+\n+            //if (u->HasAura(spell, caster)\n+            //    return true;\n+\n+            for (auto const& [spell_id, auraApp] : u->GetAppliedAuras())\n+            {\n+                if (spell_id == spell)\n+                    if (caster.IsEmpty() || auraApp->GetBase()->GetCasterGUID() == caster)\n+                        return true;\n+            }\n+            return false;\n+        }\n+    private:\n+        ObjectGuid const caster;\n+        float m_range;\n+        uint32 const spell;\n+        Player const* checker;\n+        uint8 needhostile;\n+};\n+\n+class PolyUnitCheck\n+{\n+    public:\n+        explicit PolyUnitCheck(Unit const* unit, float dist) : me(unit), m_range(dist) {}\n+        bool operator()(Unit const* u) const\n+        {\n+            if (!_botPvP && me->IsPvP() && u->IsControlledByPlayer())\n+                return false;\n+            if (!me->GetVictim() || u == me->GetVictim())\n+                return false;\n+            if (!me->IsWithinDistInMap(u, m_range))\n+                return false;\n+            if (!u->IsInCombat() || !u->IsAlive() || !u->GetVictim())\n+                return false;\n+            if (u->GetCreatureType() != CREATURE_TYPE_HUMANOID &&\n+                u->GetCreatureType() != CREATURE_TYPE_BEAST)\n+                return false;\n+            if (me->GetDistance(u) < 6 || me->GetVictim()->GetDistance(u) < 5 ||\n+                (me->ToCreature()->GetBotClass() == BOT_CLASS_MAGE && u->GetHealthPct() < 70))\n+                return false;\n+            if (!u->InSamePhase(me))\n+                return false;\n+            if (!u->isTargetableForAttack())\n+                return false;\n+            if (!u->IsVisible() || u->IsTotem())\n+                return false;\n+            if (me->ToCreature()->GetBotClass() == BOT_CLASS_MAGE ? !u->getAttackers().empty() : u->getAttackers().size() > 1)\n+                return false;\n+            if (!u->IsHostileTo(me))\n+                return false;\n+            if (u->IsPolymorphed() ||\n+                u->isFrozen() ||\n+                u->HasRootAura() ||\n+                u->HasAuraType(SPELL_AURA_PERIODIC_DAMAGE) ||\n+                u->HasAuraType(SPELL_AURA_MOD_PACIFY) ||\n+                u->HasAuraType(SPELL_AURA_MOD_PACIFY_SILENCE) ||\n+                u->HasAuraTypeWithFamilyFlags(SPELL_AURA_MOD_STUN, SPELLFAMILY_PALADIN, 0x4))\n+                return false;\n+\n+            if (me->ToCreature()->GetBotClass() == BOT_CLASS_MAGE && !u->IsImmunedToSpell(sSpellMgr->GetSpellInfo(118)))//Polymorph\n+                return true;\n+            if (me->ToCreature()->GetBotClass() == BOT_CLASS_SHAMAN && !u->IsImmunedToSpell(sSpellMgr->GetSpellInfo(51514)))//Hex\n+                return true;\n+\n+            return false;\n+        }\n+    private:\n+        Unit const* me;\n+        float m_range;\n+};\n+\n+class FearUnitCheck\n+{\n+    public:\n+        explicit FearUnitCheck(Unit const* unit, float dist, bot_ai const* ai) : me(unit), m_range(dist), m_ai(ai) {}\n+        bool operator()(Unit const* u) const\n+        {\n+            if (!_botPvP && me->IsPvP() && u->IsControlledByPlayer())\n+                return false;\n+            if (!u->IsAlive())\n+                return false;\n+            if (!u->IsInCombat())\n+                return false;\n+            if (!u->InSamePhase(me))\n+                return false;\n+            if (u->HasUnitState(UNIT_STATE_CONFUSED | UNIT_STATE_STUNNED | UNIT_STATE_FLEEING | UNIT_STATE_DISTRACTED | UNIT_STATE_CONFUSED_MOVE | UNIT_STATE_FLEEING_MOVE))\n+                return false;\n+            if (u->HasFearAura())\n+                return false;\n+            if (u->HasAuraType(SPELL_AURA_MOD_PACIFY) || u->HasAuraType(SPELL_AURA_MOD_PACIFY_SILENCE))\n+                return false;\n+            if (!me->IsWithinDistInMap(u, m_range))\n+                return false;\n+            if (!u->IsVisible() || u->IsTotem())\n+                return false;\n+            if (u->GetCreatureType() == CREATURE_TYPE_UNDEAD)\n+                return false;\n+            if (u->GetCreatureType() != CREATURE_TYPE_BEAST &&\n+                me->ToCreature()->GetBotClass() == BOT_CLASS_HUNTER)\n+                return false;\n+            if (!u->isTargetableForAttack())\n+                return false;\n+            if (u->getAttackers().size() > 2)\n+                return false;\n+            if (!m_ai->IsInBotParty(u->GetVictim()))\n+                return false;\n+            //Unit::GetDiminishing() should be const but it isn't\n+            if (const_cast<Unit*>(u)->GetDiminishing(DIMINISHING_FEAR) > DIMINISHING_LEVEL_3)\n+                return false;\n+            if (u->GetReactionTo(me) > REP_NEUTRAL)\n+                return false;\n+\n+            if (me->ToCreature()->GetBotClass() == BOT_CLASS_WARLOCK &&\n+                !u->IsImmunedToSpell(sSpellMgr->GetSpellInfo(5782)))//fear rank1\n+                return true;\n+            if (me->ToCreature()->GetBotClass() == BOT_CLASS_HUNTER &&\n+                !u->IsImmunedToSpell(sSpellMgr->GetSpellInfo(1513)))//scare beast rank1\n+                return true;\n+\n+            return false;\n+        }\n+    private:\n+        Unit const* me;\n+        float m_range;\n+        bot_ai const* m_ai;\n+};\n+\n+class StunUnitCheck\n+{\n+    public:\n+        explicit StunUnitCheck(Unit const* unit, float dist = 20) : me(unit), m_range(dist) {}\n+        bool operator()(Unit const* u) const\n+        {\n+            if (!_botPvP && me->IsPvP() && u->IsControlledByPlayer())\n+                return false;\n+            if (!u->IsAlive())\n+                return false;\n+            if (!u->IsInCombat())\n+                return false;\n+            if (!u->InSamePhase(me))\n+                return false;\n+            if (u->HasUnitState(UNIT_STATE_CONFUSED | UNIT_STATE_STUNNED | UNIT_STATE_FLEEING | UNIT_STATE_DISTRACTED | UNIT_STATE_CONFUSED_MOVE | UNIT_STATE_FLEEING_MOVE))\n+                return false;\n+            if (u->HasAuraType(SPELL_AURA_MOD_PACIFY) || u->HasAuraType(SPELL_AURA_MOD_PACIFY_SILENCE))\n+                return false;\n+            if (!me->IsWithinDistInMap(u, m_range))\n+                return false;\n+            if (!u->IsVisible() || u->IsTotem())\n+                return false;\n+            if (!u->isTargetableForAttack())\n+                return false;\n+            if (!u->getAttackers().empty())\n+                return false;\n+            if (me->ToCreature()->GetBotClass() != BOT_CLASS_DREADLORD && u->HasAuraType(SPELL_AURA_PERIODIC_DAMAGE))\n+                return false;\n+            if (me->ToCreature()->GetBotClass() == BOT_CLASS_HUNTER && me->GetTarget() == u->GetGUID())//auto shot\n+                return false;\n+            if (u->GetReactionTo(me) > REP_NEUTRAL)\n+                return false;\n+            if (me->ToCreature()->GetBotClass() == BOT_CLASS_PALADIN &&\n+                !(u->GetCreatureType() == CREATURE_TYPE_HUMANOID ||\n+                u->GetCreatureType() == CREATURE_TYPE_DEMON ||\n+                u->GetCreatureType() == CREATURE_TYPE_DRAGONKIN ||\n+                u->GetCreatureType() == CREATURE_TYPE_GIANT ||\n+                u->GetCreatureType() == CREATURE_TYPE_UNDEAD))\n+                return false;\n+            if (me->ToCreature()->GetBotClass() == BOT_CLASS_DRUID &&\n+                !(u->GetCreatureType() == CREATURE_TYPE_BEAST ||\n+                u->GetCreatureType() == CREATURE_TYPE_DRAGONKIN))\n+                return false;\n+            if (me->ToCreature()->GetBotClass() == BOT_CLASS_PALADIN && me->GetDistance(u) < 10)//prevent break due to AOE damage\n+                return false;\n+            if (me->ToCreature()->GetBotClass() == BOT_CLASS_PALADIN &&\n+                !u->IsImmunedToSpell(sSpellMgr->GetSpellInfo(20066)))//repentance\n+                return true;\n+            if (me->ToCreature()->GetBotClass() == BOT_CLASS_HUNTER &&\n+                !u->IsImmunedToSpell(sSpellMgr->GetSpellInfo(60210)))//freezing arrow effect\n+                return true;\n+            if (me->ToCreature()->GetBotClass() == BOT_CLASS_HUNTER &&\n+                !u->IsImmunedToSpell(sSpellMgr->GetSpellInfo(19386)))//wyvern sting rank 1\n+                return true;\n+            if (me->ToCreature()->GetBotClass() == BOT_CLASS_HUNTER &&\n+                !u->IsImmunedToSpell(sSpellMgr->GetSpellInfo(1991)))//scatter shot\n+                return true;\n+            if (me->ToCreature()->GetBotClass() == BOT_CLASS_ROGUE &&\n+                !u->IsImmunedToSpell(sSpellMgr->GetSpellInfo(2094)))//blind\n+                return true;\n+            if (me->ToCreature()->GetBotClass() == BOT_CLASS_WARLOCK &&\n+                u->GetCreatureType() == CREATURE_TYPE_HUMANOID &&\n+                (u->GetVictim() || u->IsControlledByPlayer()) &&\n+                !u->IsImmunedToSpell(sSpellMgr->GetSpellInfo(6358)))//seduction\n+                return true;\n+            if (me->ToCreature()->GetBotClass() == BOT_CLASS_DREADLORD &&\n+                u->GetCreatureType() != CREATURE_TYPE_UNDEAD &&\n+                !u->IsImmunedToSpell(sSpellMgr->GetSpellInfo(SPELL_SLEEP)))\n+                return true;\n+\n+            return false;\n+        }\n+    private:\n+        Unit const* me;\n+        float m_range;\n+};\n+\n+class UndeadCCUnitCheck\n+{\n+    public:\n+        explicit UndeadCCUnitCheck(Unit const* unit, float dist, bot_ai const* ai, uint32 spell, bool unattacked) :\n+        me(unit), m_range(dist), m_ai(ai), m_spellId(spell), _unattacked(unattacked) { }\n+        bool operator()(Unit const* u) const\n+        {\n+            if (!_botPvP && me->IsPvP() && u->IsControlledByPlayer())\n+                return false;\n+            if (!me->IsWithinDistInMap(u, m_range))\n+                return false;\n+            if (!u->InSamePhase(me))\n+                return false;\n+            if (!u->IsInCombat())\n+                return false;\n+            if (!u->IsAlive())\n+                return false;\n+            if (!u->isTargetableForAttack())\n+                return false;\n+            if (!u->IsVisible())\n+                return false;\n+            if (_unattacked && !u->getAttackers().empty())\n+                return false;\n+            if (u->HasUnitState(UNIT_STATE_CONFUSED | UNIT_STATE_STUNNED | UNIT_STATE_FLEEING | UNIT_STATE_DISTRACTED | UNIT_STATE_CONFUSED_MOVE | UNIT_STATE_FLEEING_MOVE))\n+                return false;\n+            if (u->HasAuraType(SPELL_AURA_MOD_PACIFY) || u->HasAuraType(SPELL_AURA_MOD_PACIFY_SILENCE))\n+                return false;\n+            if (me->ToCreature()->GetBotClass() == BOT_CLASS_PRIEST &&\n+                !(u->GetCreatureType() == CREATURE_TYPE_UNDEAD && !u->HasAuraType(SPELL_AURA_PERIODIC_DAMAGE)))\n+                return false;\n+            if (me->ToCreature()->GetBotClass() == BOT_CLASS_PALADIN &&\n+                u->GetCreatureType() != CREATURE_TYPE_UNDEAD && u->GetCreatureType() != CREATURE_TYPE_DEMON)\n+                return false;\n+            if (me->ToCreature()->GetBotClass() == BOT_CLASS_WARLOCK &&\n+                ((u->GetCreatureType() != CREATURE_TYPE_DEMON && u->GetCreatureType() != CREATURE_TYPE_ELEMENTAL) ||\n+                m_ai->IsPointedAnyAttackTarget(u)))\n+                return false;\n+            if (u->GetVictim() && !m_ai->IsInBotParty(u->GetVictim()))\n+                return false;\n+            if (u->GetReactionTo(me) > REP_NEUTRAL)\n+                return false;\n+            if (u->IsImmunedToSpell(sSpellMgr->GetSpellInfo(m_spellId)->TryGetSpellInfoOverride(me)))\n+                return false;\n+            if (m_ai->IsPointedNoDPSTarget(u) && bot_ai::IsDamagingSpell(sSpellMgr->GetSpellInfo(m_spellId)->TryGetSpellInfoOverride(me)))\n+                return false;\n+\n+            return true;\n+        }\n+    private:\n+        Unit const* me;\n+        float m_range;\n+        bot_ai const* m_ai;\n+        uint32 m_spellId;\n+        bool _unattacked;\n+};\n+\n+class RootUnitCheck\n+{\n+    public:\n+        explicit RootUnitCheck(Unit const* unit, float dist, bot_ai const* ai, uint32 spell = 0) :\n+        me(unit), m_range(dist), m_ai(ai), m_spellId(spell) { if (!spell) return; }\n+        bool operator()(Unit const* u) const\n+        {\n+            if (!_botPvP && me->IsPvP() && u->IsControlledByPlayer())\n+                return false;\n+            if (u == me->GetVictim())\n+                return false;\n+            if (!u->IsAlive())\n+                return false;\n+            if (!u->IsInCombat())\n+                return false;\n+            if (!me->IsWithinDistInMap(u, m_range))\n+                return false;\n+            if (me->GetDistance(u) < 8)\n+                return false;\n+            if (!u->InSamePhase(me))\n+                return false;\n+            if (!u->IsVisible())\n+                return false;\n+            if (!u->isTargetableForAttack(false))\n+                return false;\n+            if (u->isFrozen() || u->HasRootAura())\n+                return false;\n+            if (!u->getAttackers().empty())\n+                return false;\n+            if (u->GetVictim() && !m_ai->IsInBotParty(u->GetVictim()))\n+                return false;\n+            if (u->GetReactionTo(me) > REP_NEUTRAL)\n+                return false;\n+            if (u->IsPolymorphed() ||\n+                u->HasAuraType(SPELL_AURA_MOD_PACIFY) ||\n+                u->HasAuraType(SPELL_AURA_MOD_PACIFY_SILENCE)/*hex*/ ||\n+                u->HasAuraTypeWithFamilyFlags(SPELL_AURA_MOD_STUN, SPELLFAMILY_PALADIN, 0x4)/*repentance*/ ||\n+                u->HasAuraTypeWithFamilyFlags(SPELL_AURA_MOD_STUN, SPELLFAMILY_PRIEST, 0x40000000)/*shackle undead*/)\n+                return false;\n+            if (m_ai->IsPointedNoDPSTarget(u) && bot_ai::IsDamagingSpell(sSpellMgr->GetSpellInfo(m_spellId)->TryGetSpellInfoOverride(me)))\n+                return false;\n+            if (!u->IsImmunedToSpell(sSpellMgr->GetSpellInfo(m_spellId)->TryGetSpellInfoOverride(me)))\n+                return true;\n+\n+            return false;\n+        }\n+    private:\n+        Unit const* me;\n+        float m_range;\n+        bot_ai const* m_ai;\n+        uint32 m_spellId;\n+};\n+\n+class CastingUnitCheck\n+{\n+    public:\n+        explicit CastingUnitCheck(Unit const* unit, float mindist = 0.f, float maxdist = 30, uint32 spell = 0, uint8 minHpPct = 0) :\n+        me(unit), min_range(mindist), max_range(maxdist), m_spell(spell), m_minHpPct(minHpPct) {}\n+        bool operator()(Unit const* u) const\n+        {\n+            if (!u->IsAlive())\n+                return false;\n+            if (!u->InSamePhase(me))\n+                return false;\n+            if (!u->IsVisible() || u->IsTotem())\n+                return false;\n+            if (!u->GetTarget() && !u->IsInCombat())\n+                return false;\n+            if (!_botPvP && me->IsPvP() && u->IsControlledByPlayer())\n+                return false;\n+            if (u->HealthBelowPct(m_minHpPct))\n+                return false;\n+            if (min_range > 0.1f && me->GetDistance(u) < min_range)\n+                return false;\n+            if (!u->isTargetableForAttack(false))\n+                return false;\n+            //if (!m_friend && u->HasUnitFlag(UNIT_FLAG_SILENCED))//prevent double silence\n+            //    return false;\n+            if (!u->IsNonMeleeSpellCast(false,false,true))\n+                return false;\n+            if (!me->IsWithinDistInMap(u, max_range))\n+                return false;\n+            if (u->GetReactionTo(me) >= REP_FRIENDLY)\n+                return false;\n+            if (m_spell)\n+            {\n+                if ((m_spell == 5782 || //fear (warlock)\n+                    m_spell == 64044 || //fear (priest)\n+                    m_spell == SPELL_SLEEP) &&\n+                    u->GetCreatureType() == CREATURE_TYPE_UNDEAD)\n+                    return false;\n+                if (m_spell == 10326 && //turn evil\n+                    !(u->GetCreatureType() == CREATURE_TYPE_UNDEAD ||\n+                    u->GetCreatureType() == CREATURE_TYPE_DEMON))\n+                    return false;\n+                if (m_spell == 20066 && //repentance\n+                    !(u->GetCreatureType() == CREATURE_TYPE_HUMANOID ||\n+                    u->GetCreatureType() == CREATURE_TYPE_DEMON ||\n+                    u->GetCreatureType() == CREATURE_TYPE_DRAGONKIN ||\n+                    u->GetCreatureType() == CREATURE_TYPE_GIANT ||\n+                    u->GetCreatureType() == CREATURE_TYPE_UNDEAD))\n+                    return false;\n+                if (m_spell == 2637 && //hibernate\n+                    !(u->GetCreatureType() == CREATURE_TYPE_BEAST ||\n+                    u->GetCreatureType() == CREATURE_TYPE_DRAGONKIN))\n+                    return false;\n+                if (m_spell == 9484 && //shackle undead (priest)\n+                    u->GetCreatureType() != CREATURE_TYPE_UNDEAD)\n+                    return false;\n+\n+                SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(m_spell)->TryGetSpellInfoOverride(me);\n+                if (u->IsImmunedToSpell(spellInfo))\n+                    return false;\n+\n+                if (me->IsCreature() && me->ToCreature()->GetBotAI() && me->ToCreature()->GetBotAI()->IsPointedNoDPSTarget(u) &&\n+                    bot_ai::IsDamagingSpell(spellInfo))\n+                    return false;\n+\n+                if (!CastInterruptionCheck(u, spellInfo))\n+                    return false;\n+            }\n+\n+            return true;\n+        }\n+\n+        static bool CastInterruptionCheck(Unit const* u, SpellInfo const* spellInfo)\n+        {\n+            if (spellInfo->HasEffect(SPELL_EFFECT_INTERRUPT_CAST) && spellInfo->GetFirstRankSpell()->Id != 853) //hammer of justice\n+            {\n+                if (u->IsCreature() &&\n+                    (u->ToCreature()->HasMechanicTemplateImmunity(1u << (MECHANIC_INTERRUPT - 1))))\n+                    return false;\n+\n+                for (uint8 i = CURRENT_FIRST_NON_MELEE_SPELL; i != CURRENT_AUTOREPEAT_SPELL; ++i)\n+                {\n+                    Spell const* curSpell = u->GetCurrentSpell(i);\n+                    if (!curSpell)\n+                        continue;\n+\n+                    //copied conditions from Spell::EffectInterruptCast\n+                    if (!((curSpell->getState() == SPELL_STATE_CASTING ||\n+                        (curSpell->getState() == SPELL_STATE_PREPARING && curSpell->GetCastTime() > 0.0f)) &&\n+                        curSpell->GetSpellInfo()->PreventionType == SPELL_PREVENTION_TYPE_SILENCE &&\n+                        ((i == CURRENT_GENERIC_SPELL && curSpell->GetSpellInfo()->InterruptFlags & SPELL_INTERRUPT_FLAG_INTERRUPT) ||\n+                        (i == CURRENT_CHANNELED_SPELL && curSpell->GetSpellInfo()->ChannelInterruptFlags & CHANNEL_INTERRUPT_FLAG_INTERRUPT))))\n+                        return false;\n+                }\n+            }\n+            bool silenceSpell = false;\n+            for (uint8 i = 0; i != MAX_SPELL_EFFECTS; ++i)\n+            {\n+                if (spellInfo->Effects[i].Effect == SPELL_EFFECT_APPLY_AURA &&\n+                    spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_MOD_SILENCE)\n+                {\n+                    silenceSpell = true;\n+                    break;\n+                }\n+            }\n+            if (silenceSpell)\n+            {\n+                if (u->IsCreature() &&\n+                    (u->ToCreature()->HasMechanicTemplateImmunity(1u << (MECHANIC_SILENCE - 1))))\n+                    return false;\n+\n+                for (uint8 i = CURRENT_FIRST_NON_MELEE_SPELL; i != CURRENT_AUTOREPEAT_SPELL; ++i)\n+                {\n+                    Spell const* curSpell = u->GetCurrentSpell(i);\n+                    if (curSpell && curSpell->GetSpellInfo()->PreventionType != SPELL_PREVENTION_TYPE_SILENCE)\n+                        return false;\n+                }\n+            }\n+\n+            return true; //do not check players and non-interrupt non-silence spells\n+        }\n+\n+    private:\n+        Unit const* me;\n+        float min_range, max_range;\n+        uint32 m_spell;\n+        uint8 m_minHpPct;\n+};\n+\n+class SecondEnemyCheck\n+{\n+    public:\n+        explicit SecondEnemyCheck(Unit const* unit, float dist, float splashdist, Unit const* currtarget, bot_ai const* m_ai) :\n+        me(unit), m_range(dist), m_splashrange(splashdist), mytar(currtarget), ai(m_ai) {}\n+        bool operator()(Unit const* u) const\n+        {\n+            if (!u->IsAlive())\n+                return false;\n+            if (!u->IsInCombat())\n+                return false;\n+            if (u == mytar)\n+                return false;//We need to find SECONDARY target\n+            if (u->isMoving() != mytar->isMoving())//only when both targets idle or both moving\n+                return false;\n+            if (!_botPvP && me->IsPvP() && u->IsControlledByPlayer())\n+                return false;\n+            if (!me->IsWithinDistInMap(u, m_range))//distance check\n+                return false;\n+            if (mytar->GetDistance(u) > m_splashrange)//not close enough to each other\n+                return false;\n+\n+            if (ai->CanBotAttack(u))\n+                return true;\n+\n+            return false;\n+        }\n+    private:\n+        Unit const* me;\n+        float m_range, m_splashrange;\n+        Unit const* mytar;\n+        bot_ai const* ai;\n+};\n+\n+class TranquilTargetCheck\n+{\n+    public:\n+        explicit TranquilTargetCheck(Unit const* unit, float mindist, float maxdist, bot_ai const* m_ai) :\n+        me(unit), min_range(mindist), max_range(maxdist), ai(m_ai) { }\n+        bool operator()(Unit const* u) const\n+        {\n+            if (!_botPvP && me->IsPvP() && u->IsControlledByPlayer())\n+                return false;\n+            if (u != me->GetVictim() &&//check hunter_bot::hunter_botAI::CheckTranquil(uint32)\n+                u->IsWithinDistInMap(me, max_range) &&\n+                u->GetDistance(me) > min_range &&\n+                u->IsAlive() &&\n+                u->InSamePhase(me) &&\n+                u->IsInCombat() &&\n+                u->isTargetableForAttack(false) &&\n+                u->IsVisible() &&\n+                ai->IsInBotParty(u->GetVictim()) &&\n+                u->GetReactionTo(me) <= REP_NEUTRAL)\n+            {\n+                if (u->IsImmunedToSpell(sSpellMgr->GetSpellInfo(19801)))\n+                    return false;//immune to tranquilizing shot\n+                for (auto const& [_, aura] : u->GetOwnedAuras())\n+                {\n+                    SpellInfo const* Info = aura->GetSpellInfo();\n+                    if (Info->Dispel != DISPEL_MAGIC && Info->Dispel != DISPEL_ENRAGE) continue;\n+                    if (Info->Attributes & (SPELL_ATTR0_PASSIVE | SPELL_ATTR0_DO_NOT_DISPLAY)) continue;\n+                    //if (Info->AttributesEx & SPELL_ATTR1_NO_AURA_ICON) continue;\n+                    AuraApplication const* aurApp = aura->GetApplicationOfTarget(u->GetGUID());\n+                    if (aurApp && aurApp->IsPositive())\n+                        return true;\n+                }\n+            }\n+\n+            return false;\n+        }\n+    private:\n+        Unit const* me;\n+        float min_range, max_range;\n+        bot_ai const* ai;\n+};\n+\n+class NearbyHostileUnitCheck\n+{\n+    public:\n+        explicit NearbyHostileUnitCheck(Unit const* unit, float maxdist, bot_ai const* m_ai, uint8 CCoption, WorldObject const* source) :\n+        me(unit), max_range(maxdist), ai(m_ai), m_CCoption(CCoption), _source(source)\n+        {\n+            free = ai->IAmFree();\n+        }\n+        bool operator()(Unit const* u) const\n+        {\n+            if (u == me || u == _source)\n+                return false;\n+            if (/*!free && */!u->IsInCombat())\n+                return false;\n+            if (!u->InSamePhase(_source))\n+                return false;\n+            if ((m_CCoption & 1) && u->HasUnitState(UNIT_STATE_CONFUSED|UNIT_STATE_STUNNED|UNIT_STATE_FLEEING|UNIT_STATE_DISTRACTED|UNIT_STATE_CONFUSED_MOVE))\n+                return false;\n+            if ((m_CCoption & 2) && u->HasAuraType(SPELL_AURA_PERIODIC_DAMAGE))\n+                return false;\n+            if (me->HasUnitState(UNIT_STATE_ROOT) && (ai->HasRole(BOT_ROLE_RANGED) == me->IsWithinDistInMap(u, 8.f)))\n+                return false;\n+            if (!_botPvP && me->IsPvP() && u->IsControlledByPlayer())\n+                return false;\n+            if (u->GetCreatureType() == CREATURE_TYPE_CRITTER)\n+                return false;\n+            if (!_source->IsWithinDistInMap(u, max_range))\n+                return false;\n+            if (!free && !ai->CanBotAttack(u))\n+                return false;\n+            //if (ai->InDuel(u))\n+            //    return false;\n+\n+            if (!ai->IsInBotParty(u->GetVictim()))\n+                return false;\n+\n+            if (free)\n+            {\n+                if (u->IsControlledByPlayer())\n+                    return false;\n+                if (!me->IsValidAttackTarget(u) || !u->isTargetableForAttack(false))\n+                    return false;\n+            }\n+\n+            return true;\n+        }\n+    private:\n+        Unit const* me;\n+        float max_range;\n+        bot_ai const* ai;\n+        uint8 m_CCoption;\n+        bool free;\n+        WorldObject const* _source;\n+};\n+\n+class NearbyHostileUnitInConeCheck\n+{\n+    public:\n+        explicit NearbyHostileUnitInConeCheck(Unit const* unit, float maxdist, bot_ai const* m_ai) :\n+        me(unit), max_range(maxdist), ai(m_ai), cone(float(M_PI)/2)\n+        {\n+            free = ai->IAmFree();\n+        }\n+        bool operator()(Unit const* u) const\n+        {\n+            if (u == me)\n+                return false;\n+            //if (me->HasUnitState(UNIT_STATE_ROOT) && (ai->HasRole(BOT_ROLE_RANGED) == me->IsWithinDistInMap(u, 8.f)))\n+            //    return false;\n+            if (/*!free && */!u->IsInCombat())\n+                return false;\n+            if (!u->InSamePhase(me))\n+                return false;\n+            if (u->HasUnitState(UNIT_STATE_CONFUSED|UNIT_STATE_STUNNED|UNIT_STATE_FLEEING|UNIT_STATE_DISTRACTED|UNIT_STATE_CONFUSED_MOVE))\n+                return false;\n+            if (!free && !ai->CanBotAttack(u))\n+                return false;\n+            if (!_botPvP && me->IsPvP() && u->IsControlledByPlayer())\n+                return false;\n+            if (!me->IsWithinDistInMap(u, max_range))\n+                return false;\n+            if (!me->HasInArc(cone, u))\n+                return false;\n+            //if (ai->InDuel(u))\n+            //    return false;\n+\n+            if (!ai->IsInBotParty(u->GetVictim()))\n+                return false;\n+\n+            if (free)\n+            {\n+                if (u->IsControlledByPlayer())\n+                    return false;\n+                if (!me->IsValidAttackTarget(u) || !u->isTargetableForAttack(false))\n+                    return false;\n+            }\n+\n+            return true;\n+        }\n+    private:\n+        Unit const* me;\n+        float max_range;\n+        bot_ai const* ai;\n+        float cone;\n+        bool free;\n+};\n+\n+class NearbyFriendlyUnitCheck\n+{\n+    public:\n+        explicit NearbyFriendlyUnitCheck(Unit const* unit, float maxdist, bot_ai const* m_ai) : me(unit), max_range(maxdist), ai(m_ai) { }\n+        bool operator()(Unit const* u) const\n+        {\n+            if (u == me)\n+                return false;\n+            //if (!u->IsInCombat())\n+            //    return false;\n+            if (!u->IsAlive())\n+                return false;\n+            if (u->HasUnitState(UNIT_STATE_ISOLATED))\n+                return false;\n+            //if (u->IsTotem() || u->IsSummon())\n+            //    return false;\n+            if (!u->InSamePhase(me))\n+                return false;\n+            if (!me->IsWithinDistInMap(u, max_range))\n+                return false;\n+            //if (ai->InDuel(u))\n+            //    return false;\n+            if (!ai->IsInBotParty(u))\n+                return false;\n+            if (!me->CanSeeOrDetect(u))\n+                return false;\n+            if (!me->IsValidAssistTarget(u))\n+                return false;\n+\n+            return true;\n+        }\n+    private:\n+        Unit const* me;\n+        float max_range;\n+        bot_ai const* ai;\n+};\n+\n+class FarTauntUnitCheck\n+{\n+    public:\n+        explicit FarTauntUnitCheck(Unit const* unit, float maxdist, bool ally, bot_ai const* m_ai) :\n+        me(unit), max_range(maxdist), targetAlly(ally), ai(m_ai) { }\n+        bool operator()(Unit const* u) const\n+        {\n+            if (u == me)\n+                return false;\n+            if (!u->IsAlive())\n+                return false;\n+            if (!u->IsInCombat())\n+                return false;\n+            if (!u->InSamePhase(me))\n+                return false;\n+            if (u->HasUnitState(UNIT_STATE_CONFUSED|UNIT_STATE_STUNNED|UNIT_STATE_FLEEING|UNIT_STATE_DISTRACTED|UNIT_STATE_CONFUSED_MOVE))\n+                return false;\n+            if (u->HasAuraType(SPELL_AURA_MOD_PACIFY_SILENCE))\n+                return false;\n+            if (!u->GetVictim() || u->GetVictim() == me)\n+                return false;\n+            if (!u->CanHaveThreatList())\n+                return false;\n+            if (u->HasAuraType(SPELL_AURA_MOD_TAUNT))\n+                return false;\n+            if (!ai->IsInBotParty(u->GetVictim()))\n+                return false;\n+            if (ai->GetBotClass() == BOT_CLASS_WARRIOR && u->IsImmunedToSpell(sSpellMgr->GetSpellInfo(355)))\n+                return false; //taunt\n+            else if (ai->GetBotClass() == BOT_CLASS_PALADIN && u->IsImmunedToSpell(sSpellMgr->GetSpellInfo(62124)))\n+                return false; //HoR\n+            else if (ai->GetBotClass() == BOT_CLASS_DRUID && u->IsImmunedToSpell(sSpellMgr->GetSpellInfo(6795)))\n+                return false; //Growl\n+\n+            if (!me->IsValidAttackTarget(u) || !u->isTargetableForAttack(false))\n+                return false;\n+\n+            if (me->GetDistance(targetAlly ? u->GetVictim() : u) > max_range)\n+                return false;\n+\n+            if (ai->IsTank(u->GetVictim()))\n+            {\n+                if (!ai->IsTank(me))\n+                    return false;\n+\n+                const bool isofftank = ai->IsOffTank(me);\n+                const bool vofftank = ai->IsOffTank(u->GetVictim());\n+                if (isofftank && (vofftank || !ai->IsPointedOffTankingTarget(u)))\n+                    return false;\n+                else if (!isofftank && vofftank && !ai->IsPointedTankingTarget(u))\n+                    return false;\n+            }\n+\n+            return true;\n+        }\n+    private:\n+        const Unit* const me;\n+        const float max_range;\n+        const bool targetAlly;\n+        const bot_ai* const ai;\n+};\n+\n+class ManaDrainUnitCheck\n+{\n+    public:\n+        explicit ManaDrainUnitCheck(Unit const* unit, float maxdist, bot_ai const* ai) : me(unit), max_range(maxdist), ai(ai)\n+        { maxPool = me->GetMaxPower(POWER_MANA) * 3 / 2; free = ai->IAmFree(); }\n+        bool operator()(Unit const* u)\n+        {\n+            if (!_botPvP && me->IsPvP() && u->IsControlledByPlayer())\n+                return false;\n+            if (u == me)\n+                return false;\n+            if (!u->IsAlive())\n+                return false;\n+            if (!u->IsInCombat())\n+                return false;\n+            if (!u->InSamePhase(me))\n+                return false;\n+            if (u->IsPlayer() && !u->HasUnitState(UNIT_STATE_CONFUSED|UNIT_STATE_STUNNED|UNIT_STATE_FLEEING|UNIT_STATE_DISTRACTED|UNIT_STATE_CONFUSED_MOVE))\n+                return false;\n+            //if (u->IsControlledByPlayer())\n+            //    return false;\n+            if (free)\n+            {\n+                if (!me->IsValidAttackTarget(u) || !u->isTargetableForAttack())\n+                    return false;\n+                if (ai->IsInBotParty(u))\n+                    return false;\n+            }\n+            //if (ai->InDuel(u))\n+            //    return false;\n+            if (u->GetPowerType() != POWER_MANA)\n+                return false;\n+            if (u->GetMaxPower(POWER_MANA) < maxPool)\n+                return false;\n+            if (u->GetPower(POWER_MANA)*10/(u->GetMaxPower(POWER_MANA)/10) < 15)\n+                return false;\n+            if (!me->HasInArc(float(M_PI)*0.5f, u))\n+                return false;\n+            if (me->GetDistance(u) > max_range)\n+                return false;\n+\n+            maxPool = u->GetMaxPower(POWER_MANA);\n+            return true;\n+        }\n+    private:\n+        Unit const* me;\n+        float max_range;\n+        bot_ai const* ai;\n+        uint32 maxPool;\n+        bool free;\n+};\n+\n+class NearbyRezTargetCheck\n+{\n+    public:\n+        explicit NearbyRezTargetCheck(Unit const* unit, float maxdist, bot_ai const* m_ai) : me(unit), max_range(maxdist), ai(m_ai) { }\n+        bool operator()(WorldObject const* u) const\n+        {\n+            if (u == me)\n+                return false;\n+            if (!u->IsPlayer() && !u->IsCorpse())\n+                return false;\n+            if (!u->InSamePhase(me))\n+                return false;\n+            if (!me->IsWithinDistInMap(u, max_range))\n+                return false;\n+            if (!me->CanSeeOrDetect(u))\n+                return false;\n+            if (Player const* p = u->IsPlayer() ? u->ToPlayer() : ObjectAccessor::FindPlayer(u->ToCorpse()->GetOwnerGUID()))\n+            {\n+                if (p->IsAlive())\n+                    return false;\n+                if (p->isResurrectRequested())\n+                    return false;\n+                if (p->GetUInt32Value(PLAYER_SELF_RES_SPELL))\n+                    return false;\n+                if (!ai->IsInBotParty(p))\n+                    return false;\n+            }\n+            else\n+                return false;\n+\n+            return true;\n+        }\n+    private:\n+        Unit const* me;\n+        float max_range;\n+        bot_ai const* ai;\n+};\n+\n+class NearestLockedGameObjectInRangeCheck\n+{\n+public:\n+    NearestLockedGameObjectInRangeCheck(WorldObject const* unit, float range) : _unit(unit), _range(range) { }\n+    bool operator()(GameObject* go)\n+    {\n+        if (go->GetGOInfo()->GetLockId() &&\n+            !go->HasGameObjectFlag(GO_FLAG_IN_USE) &&\n+            //go->getLootState() == GO_READY &&\n+            _unit->IsWithinDistInMap(go, _range))\n+        {\n+            _range = _unit->GetExactDist(go);\n+            return true;\n+        }\n+        return false;\n+    }\n+private:\n+    WorldObject const* _unit;\n+    float _range;\n+};\n+\n+class NearestVehicleWithEmptySeatInRangeCheck\n+{\n+public:\n+    NearestVehicleWithEmptySeatInRangeCheck(WorldObject const* unit, float range, Unit const* exveh) : _unit(unit), _range(range), _exveh(exveh)\n+    { ASSERT(_unit->isType(TYPEMASK_UNIT)); }\n+    bool operator()(Unit* u)\n+    {\n+        if (u->IsCreature() && u->IsVehicle() && u->IsAlive() && u != _exveh &&\n+            u->GetVehicleKit()->GetAvailableSeatCount() > 0 && _unit->IsWithinDistInMap(u, _range))\n+        {\n+            _range = _unit->GetExactDist(u);\n+            return true;\n+        }\n+        return false;\n+    }\n+private:\n+    WorldObject const* _unit;\n+    float _range;\n+    Unit const* _exveh; //only compare, may be NULL\n+};\n+\n+//Professions\n+class NearbyObjectBySkillCheck\n+{\n+public:\n+    NearbyObjectBySkillCheck(WorldObject const* checker, float const range, uint32 skillMask) :\n+      _checker(checker), _range(range), _skillMask(skillMask) { ASSERT(_checker->IsPlayer()); }\n+\n+    bool operator()(WorldObject const* ob)\n+    {\n+        if (!_checker->IsWithinDistInMap(ob, _range))\n+            return false;\n+\n+        if (GameObject const* go = ob->ToGameObject())\n+        {\n+            if (/*go->getLootState() == GO_READY && */go->isSpawned() && go->GetGOInfo()->GetLockId() &&\n+                go->IsLootAllowedFor(_checker->ToPlayer()) && _checker->CanSeeOrDetect(go) && _checker->ToPlayer()->HaveAtClient(ob))\n+            {\n+                if (LockEntry const* lockInfo = sLockStore.LookupEntry(go->GetGOInfo()->GetLockId()))\n+                {\n+                    for (uint8 i = 0; i != MAX_LOCK_CASE; ++i)\n+                    {\n+                        if (lockInfo->Type[i] == LOCK_KEY_SKILL &&\n+                            CheckSkill(SkillByLockType(LockType(lockInfo->Index[i]))) &&\n+                            lockInfo->Skill[i] <= MaxSkillForLevel(_checker->ToUnit()->GetLevel()))\n+                            return true;\n+                    }\n+                }\n+            }\n+        }\n+        else if (Creature const* cre = ob->ToCreature())\n+        {\n+            if (cre->IsVisible() && cre->getDeathState() == DeathState::Corpse && cre->HasUnitFlag(UNIT_FLAG_SKINNABLE) && cre->loot.isLooted() &&\n+                cre->isTappedBy(_checker->ToPlayer()) && CheckSkill(cre->GetCreatureTemplate()->GetRequiredLootSkill()))\n+            {\n+                if (int32(cre->GetLevel() < 20 ? (cre->GetLevel() - 10) * 10 : cre->GetLevel() * 5) <= int32(MaxSkillForLevel(_checker->ToUnit()->GetLevel())))\n+                    return true;\n+            }\n+        }\n+        return false;\n+    }\n+private:\n+    WorldObject const* _checker;\n+    float const _range;\n+    uint32 const _skillMask;\n+\n+    inline bool CheckSkill(SkillType const skill) const\n+    {\n+        switch (skill)\n+        {\n+            case SKILL_MINING:\n+                return (_skillMask & BOT_ROLE_GATHERING_MINING);\n+            case SKILL_HERBALISM:\n+                return (_skillMask & BOT_ROLE_GATHERING_HERBALISM);\n+            case SKILL_SKINNING:\n+                return (_skillMask & BOT_ROLE_GATHERING_SKINNING);\n+            case SKILL_ENGINEERING:\n+                return (_skillMask & BOT_ROLE_GATHERING_ENGINEERING);\n+            default:\n+                return false;\n+        }\n+    }\n+\n+    inline uint32 MaxSkillForLevel(uint8 const level) const\n+    {\n+        return\n+            level <= 20 ? 150 :\n+            level <= 40 ? 225 :\n+            level <= 60 ? 300 :\n+            level <= 70 ? 375 : 450;\n+\n+        //return level <= 60 ? level * 5 : 300 + (((level - 60) * 15) / 2);\n+    }\n+};\n+\n+//Autolooting\n+class NearbyLootableCreatureCheck\n+{\n+public:\n+    NearbyLootableCreatureCheck(WorldObject* checker, float const range) : _checker(checker), _range(range)\n+    { ASSERT(_checker->IsPlayer()); }\n+\n+    bool operator()(Unit const* unit)\n+    {\n+        if (Creature const* cre = unit->ToCreature())\n+            if (_checker->IsWithinDistInMap(cre, _range))\n+                return cre->IsVisible() && cre->getDeathState() == DeathState::Corpse &&\n+                    cre->HasDynamicFlag(UNIT_DYNFLAG_LOOTABLE) &&\n+                    _checker->ToPlayer()->isAllowedToLoot(cre);\n+        return false;\n+    }\n+private:\n+    WorldObject* _checker;\n+    float const _range;\n+};\n+\n+//AoE caster dynobject\n+class NearbyHostileAoEDynobjectCheck\n+{\n+    public:\n+        explicit NearbyHostileAoEDynobjectCheck(Unit const* unit, float maxdist) : _me(unit), _range(maxdist) { }\n+        bool operator()(WorldObject const* u) const\n+        {\n+            DynamicObject const* dObj = u->ToDynObject();\n+            if (!dObj || !dObj->GetSpellId() || !dObj->GetCaster())\n+                return false;\n+            if (dObj->GetByteValue(DYNAMICOBJECT_BYTES, 0) != DYNAMIC_OBJECT_AREA_SPELL)\n+                return false;\n+            if (!dObj->InSamePhase(_me))\n+                return false;\n+            if (!dObj->GetRadius())\n+                return false;\n+            if (!dObj->IsWithinDistInMap(_me, _range))\n+                return false;\n+            if (!dObj->GetCaster()->IsValidAttackTarget(_me))\n+                return false;\n+\n+            return true;\n+        }\n+    private:\n+        Unit const* _me;\n+        float _range;\n+};\n+\n+namespace BOTAI_PRED\n+{\n+    class HealTargetExclude\n+    {\n+        public:\n+            bool operator()(Unit const* target)\n+            {\n+                return target->IsSummon() || target->IsTotem() || (target->GetHealthPct() > 90 && target->GetMaxHealth() - target->GetHealth() < 500);\n+            }\n+    };\n+    class BuffTargetExclude\n+    {\n+        public:\n+            bool operator()(Unit const* target)\n+            {\n+                return target->IsSummon() || target->IsTotem();\n+            }\n+    };\n+    class DrainTargetExclude\n+    {\n+        public:\n+            bool operator()(Unit const* target)\n+            {\n+                return target->IsTotem() || target->GetPowerType() != POWER_MANA || target->GetPower(POWER_MANA) < 1000;\n+            }\n+    };\n+    class UnitExclude\n+    {\n+        public:\n+            UnitExclude(Unit const* unit) { _unit = unit; }\n+            bool operator()(Unit const* target)\n+            {\n+                return target == _unit;\n+            }\n+        private:\n+            Unit const* _unit;\n+    };\n+\n+    class AuraedTargetExclude\n+    {\n+        public:\n+            AuraedTargetExclude(uint32 spellId, uint8 minstacks = 0) : _spellId(spellId), _minstacks(minstacks) {}\n+            bool operator()(Unit const* target)\n+            {\n+                AuraApplication const* aurApp = target->GetAuraApplicationOfRankedSpell(_spellId);\n+                return aurApp && (!_minstacks || aurApp->GetBase()->GetStackAmount() >= _minstacks);\n+            }\n+        private:\n+            uint32 _spellId;\n+            uint8 _minstacks;\n+    };\n+\n+    class AuraedTargetExcludeByCaster\n+    {\n+        public:\n+            AuraedTargetExcludeByCaster(uint32 spellId, ObjectGuid caster, uint8 minstacks = 0) :\n+                _spellId(spellId), _caster(caster), _minstacks(minstacks) {}\n+            bool operator()(Unit const* target)\n+            {\n+                AuraApplication const* aurApp = target->GetAuraApplicationOfRankedSpell(_spellId, _caster);\n+                return aurApp && (!_minstacks || aurApp->GetBase()->GetStackAmount() >= _minstacks);\n+            }\n+        private:\n+            uint32 _spellId;\n+            ObjectGuid _caster;\n+            uint8 _minstacks;\n+    };\n+\n+    class HpPctAboveExclude\n+    {\n+        public:\n+        HpPctAboveExclude(float pct) : _pct(pct) {}\n+            bool operator()(Unit const* target)\n+            {\n+                return target->GetHealthPct() > _pct;\n+            }\n+        private:\n+            float _pct;\n+    };\n+\n+    class UnitCombatStateExclude\n+    {\n+        public:\n+        UnitCombatStateExclude(bool combat) : _combat(combat) {}\n+            bool operator()(Unit const* target)\n+            {\n+                return target->IsInCombat() == _combat;\n+            }\n+        private:\n+            bool _combat;\n+    };\n+\n+    class UnitLivingStateExclude\n+    {\n+        public:\n+        UnitLivingStateExclude(bool living) : _living(living) {}\n+            bool operator()(Unit const* target)\n+            {\n+                return target->IsAlive() == _living;\n+            }\n+        private:\n+            bool _living;\n+    };\n+};\n+\n+#endif\ndiff --git a/src/server/game/AI/NpcBots/bot_InstanceEvents.h b/src/server/game/AI/NpcBots/bot_InstanceEvents.h\nnew file mode 100644\nindex 0000000000..f3f49474a4\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bot_InstanceEvents.h\n@@ -0,0 +1,53 @@\n+#ifndef BOT_INSTANCE_EVENTS_H_\n+#define BOT_INSTANCE_EVENTS_H_\n+\n+#include \"EventProcessor.h\"\n+#include \"Position.h\"\n+\n+/*\n+Name: bot_InstanceEvents\n+%Complete: ???\n+Comment: Custom event types for NPCBot system by Trickerer (onlysuffering@gmail.com)\n+Category: creature_cripts/custom/bots/events\n+\n+Notes:\n+All events must be executed through botAI\n+*/\n+class InstanceScript;\n+\n+//Base for instance event -based events\n+class NpcBotInstanceEventBase : public BasicEvent\n+{\n+public:\n+    InstanceScript* GetScript() const { return _instance; }\n+    bool Execute(uint64 /*e_time*/, uint32 /*p_time*/) override { return true; }\n+    bool operator()() { return Execute(0, 0); }\n+\n+protected:\n+    NpcBotInstanceEventBase(InstanceScript* instance) : _instance(instance) {}\n+    ~NpcBotInstanceEventBase() = default;\n+    NpcBotInstanceEventBase(NpcBotInstanceEventBase const&) = delete;\n+\n+private:\n+    InstanceScript* _instance;\n+};\n+class FrozenThronePlatformDestructionEvent : public NpcBotInstanceEventBase\n+{\n+    friend class bot_ai;\n+    friend class instance_icecrown_citadel;\n+    friend struct instance_icecrown_citadel_InstanceMapScript;\n+    friend class script_bot_commands;\n+\n+public:\n+    bool Execute(uint64 /*e_time*/, uint32 /*p_time*/) override;\n+\n+protected:\n+    FrozenThronePlatformDestructionEvent(InstanceScript* instance, Position&& platformPos) : NpcBotInstanceEventBase(instance), _platform_pos(std::move(platformPos)) {}\n+    ~FrozenThronePlatformDestructionEvent() = default;\n+    FrozenThronePlatformDestructionEvent(FrozenThronePlatformDestructionEvent const&) = delete;\n+\n+private:\n+    Position _platform_pos;\n+};\n+\n+#endif\ndiff --git a/src/server/game/AI/NpcBots/bot_ai.cpp b/src/server/game/AI/NpcBots/bot_ai.cpp\nnew file mode 100644\nindex 0000000000..9949cee329\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bot_ai.cpp\n@@ -0,0 +1,21574 @@\n+#include \"Battleground.h\"\n+#include \"BattlegroundAB.h\"\n+#include \"BattlegroundAV.h\"\n+#include \"BattlegroundEY.h\"\n+#include \"BattlegroundWS.h\"\n+#include \"bot_ai.h\"\n+#include \"bot_Events.h\"\n+#include \"bot_InstanceEvents.h\"\n+#include \"bot_GridNotifiers.h\"\n+#include \"botconfig.h\"\n+#include \"botdatamgr.h\"\n+#include \"botlog.h\"\n+#include \"botmgr.h\"\n+#include \"botgearscore.h\"\n+#include \"botgossip.h\"\n+#include \"botspell.h\"\n+#include \"bottext.h\"\n+#include \"botwanderful.h\"\n+#include \"bpet_ai.h\"\n+#include \"Bag.h\"\n+#include \"BattlegroundMgr.h\"\n+#include \"CellImpl.h\"\n+#include \"CharacterCache.h\"\n+#include \"CharacterDatabase.h\"\n+#include \"Chat.h\"\n+#include \"DatabaseEnv.h\"\n+#include \"DBCStores.h\"\n+#include \"GameEventMgr.h\"\n+#include \"GameGraveyard.h\"\n+#include \"GameObjectAI.h\"\n+#include \"GossipDef.h\"\n+#include \"GridNotifiersImpl.h\"\n+#include \"InstanceScript.h\"\n+#include \"Item.h\"\n+#include \"LFGMgr.h\"\n+#include \"Log.h\"\n+#include \"LootMgr.h\"\n+#include \"Mail.h\"\n+#include \"MapMgr.h\"\n+#include \"MotionMaster.h\"\n+#include \"ObjectMgr.h\"\n+#include \"PathGenerator.h\"\n+#include \"PointMovementGenerator.h\"\n+#include \"RaceMgr.h\"\n+#include \"ScriptedGossip.h\"\n+#include \"ScriptMgr.h\"\n+#include \"SpellAuraEffects.h\"\n+#include \"TemporarySummon.h\"\n+#include \"Transport.h\"\n+#include \"World.h\"\n+/*\n+NpcBot System by Trickerer (https://github.com/trickerer/Trinity-Bots; onlysuffering@gmail.com)\n+Version 5.2.77a\n+Original idea: https://bitbucket.org/lordpsyan/trinitycore-patches/src/3b8b9072280e/Individual/11185-BOTS-NPCBots.patch\n+Notes:\n+Methods may have null arg1 (Unit*):\n+DamageTaken(Unit*, ), JustDied(Unit*, ), OwnerAttackedBy(Unit*, ), HealReceived(Unit*, )\n+Possibly others\n+Performance impact factors:\n+ - Containers for selection\n+ - GetDistance() instead of IsWithinDist() (extra sqrt)\n+ - std::ostringstream::str() instead of std::ostringstream::view()\n+*/\n+\n+#ifdef _MSC_VER\n+# pragma warning(push, 4)\n+#endif\n+\n+static constexpr GossipOptionIcon BOT_ICON_ON = GOSSIP_ICON_BATTLE;\n+static constexpr GossipOptionIcon BOT_ICON_OFF = GOSSIP_ICON_CHAT;\n+\n+static constexpr uint32 MAX_AMMO_LEVEL = 13;\n+static constexpr uint8 AmmoDPSForLevel[MAX_AMMO_LEVEL][2] =\n+{\n+    { 80, 91 },\n+    { 72, 67 },\n+    { 62, 43 },\n+    { 57, 26 },\n+    { 52, 17 },\n+    { 44, 15 },\n+    { 37, 12 },\n+    { 30,  8 },\n+    { 25,  7 },\n+    { 15,  4 },\n+    { 10,  3 },\n+    {  5,  2 },\n+    {  1,  1 }\n+};\n+static constexpr uint32 MAX_POTION_SPELLS = 8;\n+static constexpr uint32 MAX_FEAST_SPELLS = 11;\n+static constexpr uint32 ManaPotionSpells[MAX_POTION_SPELLS][2] =\n+{\n+    { 70, 43186 },\n+    { 55, 28499 },\n+    { 49, 17531 },\n+    { 41, 17530 },\n+    { 31, 11903 },\n+    { 22,  2023 },\n+    { 14,   438 },\n+    {  5,   437 }\n+};\n+static constexpr uint32 HealingPotionSpells[MAX_POTION_SPELLS][2] =\n+{\n+    { 70, 43185 },\n+    { 55, 28495 },\n+    { 45, 17534 },\n+    { 35,  4042 },\n+    { 21,  2024 },\n+    { 12,   441 },\n+    {  3,   440 },\n+    {  1,   439 }\n+};\n+static constexpr uint32 DrinkSpells[MAX_FEAST_SPELLS][2] =\n+{\n+    { 80, 57073 },\n+    { 75, 43183 },\n+    { 70, 43182 },\n+    { 65, 27089 },\n+    { 60, 34291 },\n+    { 45,  1137 },\n+    { 35,  1135 },\n+    { 25,  1133 },\n+    { 15,   432 },\n+    {  5,   431 },\n+    {  1,   430 }\n+};\n+static constexpr uint32 EatSpells[MAX_FEAST_SPELLS][2] =\n+{\n+    { 80, 45548 },\n+    { 75, 45548 },\n+    { 70, 43180 }, //req 65 but\n+    { 65, 35270 },\n+    { 55, 27094 },\n+    { 45,  1131 },\n+    { 35,  1129 },\n+    { 25,  1127 },\n+    { 15,   435 },\n+    {  5,   434 },\n+    {  1,   433 }\n+};\n+\n+struct TSpellSummary\n+{\n+    uint8 Targets; // set of enum SelectTarget\n+    uint8 Effects; // set of enum SelectEffect\n+};\n+extern TSpellSummary* SpellSummary;\n+\n+static void ApplyBotPercentModFloatVar(float &var, float val, bool apply)\n+{\n+    var *= (apply ? ((100.f + val) / 100.f) : (100.f / (100.f + val)));\n+}\n+\n+bot_ai::bot_ai(Creature* creature) : CreatureAI(creature),\n+    _botData(const_cast<NpcBotData*>(BotDataMgr::SelectNpcBotData(IsTempBot() ? creature->ToTempSummon()->GetSummonerGUID().GetEntry() : creature->GetEntry()))),\n+    _botExtras(BotDataMgr::SelectNpcBotExtras(creature->GetEntry()))\n+{\n+    _checkMasterTimer = urand(5000, 15000);\n+    _updateTimerLong = urand(15000, 25000);\n+    _updateTimerEx1 = urand(12000, 15000);\n+    _updateTimerEx2 = urand(8000, 12000);\n+\n+    ResetBotAI(BOTAI_RESET_INIT);\n+\n+    if (!IsTempBot())\n+        BotDataMgr::RegisterBot(me);\n+}\n+bot_ai::~bot_ai()\n+{\n+    BOT_LOG_INFO(\"npcbots\", \"bot_ai destructor call for {} ({})\", me->GetName(), me->GetEntry());\n+\n+    for (Item* item : _equips)\n+        delete item;\n+\n+    if (!IsTempBot())\n+        BotDataMgr::UnregisterBot(me);\n+}\n+\n+ObjectGuid::LowType bot_ai::GetBotOwnerGuid() const\n+{\n+    return _botData->owner;\n+}\n+bool bot_ai::HasSharedOwner(ObjectGuid::LowType guid_low) const\n+{\n+    return _botData->shared_owners.contains(guid_low);\n+}\n+bool bot_ai::HasOwner(ObjectGuid::LowType guid_low) const\n+{\n+    if (guid_low == _botData->owner)\n+        return true;\n+    if (HasSharedOwner(guid_low))\n+        return true;\n+    return false;\n+}\n+bool bot_ai::IsSharedBot() const\n+{\n+    return !IAmFree() && master->GetGUID().GetCounter() != _botData->owner && HasSharedOwner(master->GetGUID().GetCounter());\n+}\n+\n+//0-178\n+void bot_ai::GenerateRand()\n+{\n+    _rand = urand(0, IAmFree() ? 100 : 100 + (master->GetNpcBotsCount() - 1) * 2);\n+}\n+\n+const std::string& bot_ai::LocalizedNpcText(Player const* forPlayer, uint32 textId)\n+{\n+    LocaleConstant loc = forPlayer ? forPlayer->GetSession()->GetSessionDbLocaleIndex() : sWorld->GetDefaultDbcLocale();\n+\n+    if (GossipText const* nt = sObjectMgr->GetGossipText(textId))\n+    {\n+        std::wstring wnamepart;\n+        NpcTextLocale const* ntl = sObjectMgr->GetNpcTextLocale(textId);\n+        if (loc != DEFAULT_LOCALE && ntl && ntl->Text_0[0].size() > size_t(loc) && !ntl->Text_0[0][loc].empty() && Utf8FitTo(ntl->Text_0[0][loc], wnamepart))\n+            return ntl->Text_0[0][loc];\n+        else\n+            return nt->Options[0].Text_0;\n+    }\n+\n+    {\n+        static std::map<uint32, std::string> unk_botstrings;\n+\n+        if (!unk_botstrings.contains(textId))\n+        {\n+            BOT_LOG_ERROR(\"entities.player\", \"NPCBots: bot text string #{} is not localized, at least for {}\", textId, localeNames[loc]);\n+\n+            std::ostringstream msg;\n+            msg << (loc == DEFAULT_LOCALE ? \"<undefined string \" : \"<unlocalized string \") << textId << \">\";\n+            unk_botstrings[textId] = msg.str();\n+        }\n+\n+        return unk_botstrings[textId];\n+    }\n+}\n+\n+void bot_ai::InitializeAI()\n+{\n+    if (!me->GetSpawnId() && !IsTempBot())\n+        SetWanderer();\n+\n+    Reset();\n+}\n+\n+void bot_ai::BotSay(std::string_view text, Player const* target) const\n+{\n+    if (!target && master->IsPlayer())\n+        target = master;\n+    if (!target)\n+        return;\n+\n+    me->Say(text, LANG_UNIVERSAL, target);\n+}\n+void bot_ai::BotWhisper(std::string_view text, Player const* target) const\n+{\n+    if (!target && master->IsPlayer())\n+        target = master;\n+    if (!target)\n+        return;\n+\n+    //Problem : Unit::Whisper target argument is non-const for no reason\n+    me->Whisper(text, LANG_UNIVERSAL, const_cast<Player*>(target));\n+}\n+void bot_ai::BotYell(std::string_view text, Player const* /*target*/) const\n+{\n+    me->Yell(text, LANG_UNIVERSAL);\n+}\n+\n+void bot_ai::ReportSpellCast(uint32 spellId, const std::string& followedByString, Player const* target) const\n+{\n+    std::string spellName;\n+    _LocalizeSpell(target, spellName, spellId);\n+    BotWhisper(spellName + followedByString, target);\n+}\n+\n+bool bot_ai::SetBotOwner(Player* newowner)\n+{\n+    ASSERT(newowner, \"Trying to set NULL owner!!!\");\n+    ASSERT(newowner->GetGUID().IsPlayer(), \"Trying to set a non-player as owner!!!\");\n+\n+    //have master already\n+    if (master->GetGUID() != me->GetGUID())\n+    {\n+        BOT_LOG_ERROR(\"entities.player\", \"bot_ai::SetBotOwner(): bot {} (id: {}) has master {} while trying to set to {}...\",\n+            me->GetName().c_str(), me->GetEntry(), master->GetName().c_str(), newowner->GetName().c_str());\n+        return false;\n+    }\n+    if (!IAmFree())\n+    {\n+        BOT_LOG_ERROR(\"entities.player\", \"bot_ai::SetBotOwner(): minion bot {} (id: {}) IS NOT FREE (has master {}) while trying to set to {}\",\n+            me->GetName().c_str(), me->GetEntry(), master->GetName().c_str(), newowner->GetName().c_str());\n+        return false;\n+    }\n+\n+    if (newowner->GetBotMgr()->AddBot(me) & BOT_ADD_FATAL)\n+    {\n+        _checkMasterTimer += 30000;\n+        return false;\n+    }\n+\n+    spawned = false;\n+\n+    (const_cast<CreatureTemplate*>(me->GetCreatureTemplate()))->unit_flags2 &= ~(UNIT_FLAG2_ALLOW_ENEMY_INTERACT);\n+    me->ReplaceAllUnitFlags2(UnitFlags2(me->GetCreatureTemplate()->unit_flags2));\n+\n+    //recursive\n+    if (master->GetGUID() == newowner->GetGUID())\n+        return true;\n+\n+    master = newowner;\n+    _checkOwershipTimer = BotCfg::GetOwnershipExpireTime() ? CalculateOwnershipCheckTime() : 0;\n+\n+    return true;\n+}\n+//Check if should totally unlink from owner\n+void bot_ai::CheckOwnerExpiry()\n+{\n+    if (!BotCfg::GetOwnershipExpireTime())\n+        return; //disabled\n+\n+    if (IsTempBot() || !IAmFree())\n+        return;\n+\n+    if (_botData->owner == 0)\n+        return;\n+\n+    ObjectGuid ownerGuid = ObjectGuid(HighGuid::Player, 0, _botData->owner);\n+    time_t timeNow = time(0);\n+    time_t expireTime = time_t(BotCfg::GetOwnershipExpireTime());\n+    time_t baseTimeStamp;\n+\n+    if (BotCfg::GetOwnershipExpireMode() == BOT_OWNERSHIP_EXPIRE_OFFLINE)\n+    {\n+        uint32 accId = sCharacterCache->GetCharacterAccountIdByGuid(ownerGuid);\n+        QueryResult result = accId ? CharacterDatabase.Query(\"SELECT MAX(logout_time) FROM characters WHERE account = {}\", accId) : nullptr;\n+\n+        Field* fields = result ? result->Fetch() : nullptr;\n+        time_t lastLoginTime = fields ? time_t(fields[0].Get<uint32>()) : timeNow;\n+        baseTimeStamp = lastLoginTime;\n+    }\n+    else //if (BotCfg::GetOwnershipExpireMode() == BOT_OWNERSHIP_EXPIRE_HIRE)\n+    {\n+        baseTimeStamp = time_t(_botData->hire_time);\n+    }\n+\n+    //either expired or owner does not exist\n+    if (timeNow >= baseTimeStamp + expireTime)\n+    {\n+        std::string name = \"unknown\";\n+        sCharacterCache->GetCharacterNameByGuid(ownerGuid, name);\n+        BOT_LOG_DEBUG(\"npcbots\", \"{}'s (guid: {}) ownership over bot {} ({}) has expired!\", name, _botData->owner, me->GetName(), me->GetEntry());\n+\n+        //send all items back\n+        CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_NPCBOT_EQUIP_BY_ITEM_INSTANCE);\n+        //        0            1                2      3         4        5      6             7                 8           9           10    11    12         13\n+        //\"SELECT creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomPropertyId, durability, playedTime, text, guid, itemEntry, owner_guid \"\n+        //  \"FROM item_instance WHERE guid IN (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\", CONNECTION_SYNCH\n+\n+        for (auto i : NPCBots::index_array<uint8, BOT_INVENTORY_SIZE>)\n+            stmt->SetData(i, _botData->equips[i] ? _botData->equips[i] : std::numeric_limits<uint32>::max());\n+\n+        PreparedQueryResult iiresult = CharacterDatabase.Query(stmt);\n+        if (iiresult)\n+        {\n+            std::vector<Item*> items;\n+\n+            do\n+            {\n+                Field* fields2 = iiresult->Fetch();\n+                uint32 itemGuidLow = fields2[11].Get<uint32>();\n+                uint32 itemId = fields2[12].Get<uint32>();\n+                uint8 item_idx = std::numeric_limits<uint8>::max();\n+\n+                for (auto i : NPCBots::index_array<uint8, BOT_INVENTORY_SIZE>)\n+                {\n+                    if (_equips[i] && _equips[i]->GetEntry() == itemId)\n+                    {\n+                        item_idx = i;\n+                        break;\n+                    }\n+                }\n+                if (item_idx >= BOT_INVENTORY_SIZE)\n+                {\n+                    BOT_LOG_ERROR(\"npcbots\", \"bot_ai::CheckOwnerExpiry(): item id {} guid {} not found in bot's inventory!\\n{}\", itemId, itemGuidLow, me->GetGUID().ToString());\n+                    continue;\n+                }\n+\n+                items.push_back(_equips[item_idx]);\n+                _removeEquipment(item_idx);\n+\n+            } while (iiresult->NextRow());\n+\n+            CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();\n+            while (!items.empty())\n+            {\n+                static const std::string subject = LocalizedNpcText(nullptr, BOT_TEXT_OWNERSHIP_EXPIRED);\n+                MailDraft draft(subject, \"\");\n+                for (uint8 i = 0; !items.empty() && i < MAX_MAIL_ITEMS; ++i)\n+                {\n+                    Item* item = items.back();\n+                    items.pop_back();\n+                    item->SetOwnerGUID(ownerGuid);\n+                    item->FSetState(ITEM_CHANGED);\n+                    item->SaveToDB(trans);\n+                    draft.AddItem(item);\n+                }\n+                draft.SendMailTo(trans, MailReceiver(_botData->owner), MailSender(me, MAIL_STATIONERY_GM));\n+            }\n+            CharacterDatabase.CommitTransaction(trans);\n+\n+            for (auto slot : NPCBots::index_array<uint8, BOT_FIRST_NON_WEAPON_SLOT>)\n+                if (_resetEquipment(slot, ObjectGuid::Empty, false) != BotEquipResult::BOT_EQUIP_RESULT_OK) {}\n+\n+            BotDataMgr::UpdateNpcBotData(me->GetEntry(), NPCBOT_UPDATE_EQUIPS, _equips.data());\n+        }\n+\n+        //hard reset owner\n+        uint32 newOwner = 0;\n+        BotDataMgr::UpdateNpcBotData(me->GetEntry(), NPCBOT_UPDATE_OWNER, &newOwner);\n+        //...shared owners\n+        NpcBotData::SharedOwnersContainer sharedOwners{};\n+        BotDataMgr::UpdateNpcBotData(me->GetEntry(), NPCBOT_UPDATE_SHARED_OWNERS, &sharedOwners);\n+        //...spec\n+        uint8 spec = SelectSpecForClass(_botExtras->bclass);\n+        BotDataMgr::UpdateNpcBotData(me->GetEntry(), NPCBOT_UPDATE_SPEC, &spec);\n+        //...and roles\n+        uint32 roleMask = DefaultRolesForClass(_botExtras->bclass, spec);\n+        BotDataMgr::UpdateNpcBotData(me->GetEntry(), NPCBOT_UPDATE_ROLES, &roleMask);\n+\n+        if (Group* gr = GetGroup())\n+            gr->RemoveMember(me->GetGUID());\n+    }\n+}\n+\n+void bot_ai::InitUnitFlags()\n+{\n+    if (BotCfg::DisplayEquipment() && CanDisplayNonWeaponEquipmentChanges())\n+    {\n+        (const_cast<CreatureTemplate*>(me->GetCreatureTemplate()))->unit_flags2 |= UNIT_FLAG2_MIRROR_IMAGE;\n+        me->ReplaceAllUnitFlags2(UnitFlags2(me->GetCreatureTemplate()->unit_flags2));\n+    }\n+    (const_cast<CreatureMovementData&>(me->GetMovementTemplate())).Chase = CreatureChaseMovementType::CanWalk;\n+}\n+\n+void bot_ai::ResetBotAI(uint8 resetType)\n+{\n+    _botCommandState = 0;\n+    _botAwaitState = BOT_AWAIT_NONE;\n+    _reviveTimer = 0;\n+\n+    if (resetType & BOTAI_RESET_MASK_RESET_MASTER)\n+        master = reinterpret_cast<Player*>(me);\n+    if (resetType & BOTAI_RESET_MASK_ABANDON_MASTER)\n+        _rentTimer = 0;\n+    if (resetType == BOTAI_RESET_INIT || resetType == BOTAI_RESET_LOGOUT)\n+    {\n+        _checkOwershipTimer = (BotCfg::GetOwnershipExpireTime() && _botData->owner) ? (resetType == BOTAI_RESET_INIT) ? 1000 : CalculateOwnershipCheckTime() : 0;\n+        if (resetType == BOTAI_RESET_INIT)\n+            homepos.Relocate(me);\n+        else //if (resetType == BOTAI_RESET_LOGOUT)\n+            _saveStats();\n+    }\n+\n+    if (!IsWanderer() || BotMgr::IsWanderingWorldBot(me))\n+    {\n+        (const_cast<CreatureTemplate*>(me->GetCreatureTemplate()))->unit_flags2 |= (UNIT_FLAG2_ALLOW_ENEMY_INTERACT);\n+        me->ReplaceAllUnitFlags2(UnitFlags2(me->GetCreatureTemplate()->unit_flags2));\n+    }\n+\n+    if ((resetType == BOTAI_RESET_DISMISS || resetType == BOTAI_RESET_LOGOUT) && !IsTempBot())\n+    {\n+        if (resetType == BOTAI_RESET_DISMISS)\n+            ResetAllMiscValues();\n+        EnableAllSpells(resetType == BOTAI_RESET_DISMISS);\n+        InitRoles();\n+    }\n+\n+    //me->IsAIEnabled = true;\n+    canUpdate = true;\n+\n+    if (spawned)\n+        ReturnHome();\n+\n+    if (!me->IsInWorld() || resetType == BOTAI_RESET_FORCERECALL)\n+    {\n+        TeleportHomeStart(resetType != BOTAI_RESET_UNBIND);\n+    }\n+    else\n+    {\n+        _atHome = false;\n+        spawned = false;\n+        ResetContestedPvP();\n+    }\n+}\n+\n+bool bot_ai::_checkImmunities(Unit const* target, SpellInfo const* spellInfo) const\n+{\n+    return target && spellInfo && !target->IsImmunedToDamage(me, spellInfo);\n+}\n+\n+SpellCastResult bot_ai::CheckBotCast(Unit const* victim, uint32 spellId) const\n+{\n+    if (spellId == 0)\n+        return SPELL_FAILED_DONT_REPORT;\n+\n+    if (HasBotCommandState(BOT_COMMAND_NO_CAST | BOT_COMMAND_INACTION))\n+        return SPELL_FAILED_DONT_REPORT;\n+\n+    if (victim->IsPlayer() && victim->ToPlayer()->IsGameMaster())\n+        return SPELL_FAILED_BAD_TARGETS;\n+\n+    SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);\n+    if (!spellInfo)\n+        return SPELL_FAILED_DONT_REPORT;\n+\n+    spellInfo = spellInfo->TryGetSpellInfoOverride(me);\n+\n+    if (me->IsMounted() && !(spellInfo->Attributes & SPELL_ATTR0_ALLOW_WHILE_MOUNTED))\n+        return SPELL_FAILED_NOT_MOUNTED;\n+\n+    if (spellInfo->IsChanneled() && HasBotCommandState(BOT_COMMAND_NO_CAST_LONG))\n+        return SPELL_FAILED_NOT_IDLE;\n+\n+    if (spellInfo->CastTimeEntry)\n+    {\n+        int32 castTime = spellInfo->CastTimeEntry->CastTime;\n+        if (castTime > 0)\n+            ApplyClassSpellCastTimeMods(spellInfo, castTime);\n+\n+        if (castTime > 0)\n+        {\n+            if (HasBotCommandState(BOT_COMMAND_NO_CAST_LONG) || (me->GetMap()->IsDungeon() && !CCed(me, true) && IsWithinAoERadius(*me)))\n+                return SPELL_FAILED_NOT_IDLE;\n+        }\n+    }\n+\n+    if (int32(me->GetPower(Powers(spellInfo->PowerType))) < spellInfo->CalcPowerCost(me, spellInfo->GetSchoolMask()))\n+        return SPELL_FAILED_NO_POWER;\n+\n+    if (!IsSpellReady(spellInfo->GetFirstRankSpell()->Id, lastdiff, false))\n+        return SPELL_FAILED_NOT_READY;\n+\n+    //if (victim->isType(TYPEMASK_UNIT) && InDuel(victim))\n+    //    return SPELL_FAILED_BAD_TARGETS;\n+\n+    if (!CanBotAttackOnVehicle())\n+        return SPELL_FAILED_CASTER_AURASTATE;\n+\n+    //forced to follow but not close enough to master\n+    if (!IAmFree() && !master->GetBotMgr()->GetBotAllowCombatPositioning())\n+    {\n+        Position mpos;\n+        _calculatePos(master, mpos);\n+\n+        if (me->GetDistance(mpos) > float(std::max<uint8>(5, master->GetBotMgr()->GetBotFollowDist() / 8)))\n+            return SPELL_FAILED_NOT_IDLE;\n+    }\n+\n+    //scaling aura\n+    if (victim->isType(TYPEMASK_UNIT) && victim != me &&\n+        !spellInfo->IsPassive() && spellInfo->SpellLevel && !spellInfo->IsChanneled() &&\n+        (victim->GetLevel() + 10) < int32(spellInfo->GetFirstRankSpell()->SpellLevel))\n+    {\n+        for (auto i : NPCBots::index_array<uint8, MAX_SPELL_EFFECTS>)\n+        {\n+            if (spellInfo->Effects[i].Effect == SPELL_EFFECT_APPLY_AURA && spellInfo->IsPositiveEffect(i))\n+            {\n+                //BOT_LOG_ERROR(\"scripts\", \"CheckBotCast(): deny cast of %s by %s on low-level target %s (lvl %u)\",\n+                //    spellInfo->SpellName[0], me->GetName().c_str(), victim->GetName().c_str(), victim->GetLevel());\n+                return SPELL_FAILED_LOWLEVEL;\n+            }\n+        }\n+    }\n+\n+    //disarmed\n+    if (spellInfo->EquippedItemClass == ITEM_CLASS_WEAPON)\n+    {\n+        if (spellInfo->EquippedItemInventoryTypeMask != 0)\n+        {\n+            if ((spellInfo->EquippedItemInventoryTypeMask & (1u<<INVTYPE_WEAPONMAINHAND)) &&\n+                !me->CanUseAttackType(BASE_ATTACK))\n+                return SPELL_FAILED_EQUIPPED_ITEM_CLASS_MAINHAND;\n+            if ((spellInfo->EquippedItemInventoryTypeMask & (1u<<INVTYPE_WEAPONOFFHAND)) &&\n+                !me->CanUseAttackType(OFF_ATTACK))\n+                return SPELL_FAILED_EQUIPPED_ITEM_CLASS_OFFHAND;\n+            if ((spellInfo->EquippedItemInventoryTypeMask & ((1u<<INVTYPE_RANGED)|(1u<<INVTYPE_RANGEDRIGHT)|(1u<<INVTYPE_THROWN))) &&\n+                !me->CanUseAttackType(RANGED_ATTACK))\n+                return SPELL_FAILED_EQUIPPED_ITEM_CLASS;\n+        }\n+        else if (!me->CanUseAttackType(BASE_ATTACK))\n+            return SPELL_FAILED_EQUIPPED_ITEM_CLASS_MAINHAND;\n+    }\n+\n+    //immunities\n+    if (victim->isType(TYPEMASK_UNIT))\n+    {\n+        if (spellInfo->HasEffect(SPELL_EFFECT_HEAL) || spellInfo->HasAura(SPELL_AURA_PERIODIC_HEAL))\n+        {\n+            //banish or something\n+            Unit::AuraEffectList const& healPctEffects = victim->GetAuraEffectsByType(SPELL_AURA_MOD_HEALING_PCT);\n+            if (!healPctEffects.empty())\n+            {\n+                int32 castTime = spellInfo->CastTimeEntry ? spellInfo->CastTimeEntry->CastTime : 0;\n+                if (castTime)\n+                    ApplyClassSpellCastTimeMods(spellInfo, castTime);\n+                for (AuraEffect const* aeff : healPctEffects)\n+                    if (aeff->GetAmount() <= -100 && (!castTime || aeff->GetBase()->GetDuration() >= castTime))\n+                        return SPELL_FAILED_BAD_TARGETS;\n+            }\n+        }\n+        else if (//spells that ignore immunities\n+            spellId != 64382 && //shattering throw\n+            spellId != 32375 && //mass dispel\n+            (spellInfo->HasEffect(SPELL_EFFECT_SCHOOL_DAMAGE) ||\n+            spellInfo->HasEffect(SPELL_EFFECT_WEAPON_PERCENT_DAMAGE) ||\n+            spellInfo->HasEffect(SPELL_EFFECT_WEAPON_DAMAGE) ||\n+            spellInfo->HasEffect(SPELL_EFFECT_POWER_BURN) ||\n+            spellInfo->HasEffect(SPELL_EFFECT_NORMALIZED_WEAPON_DMG)) &&\n+            !_checkImmunities(victim, spellInfo))\n+            return SPELL_FAILED_BAD_TARGETS;\n+    }\n+\n+    switch (_botclass)\n+    {\n+        case BOT_CLASS_PALADIN:\n+        case BOT_CLASS_MAGE:\n+        case BOT_CLASS_PRIEST:\n+        case BOT_CLASS_DRUID:\n+        case BOT_CLASS_WARLOCK:\n+        case BOT_CLASS_SHAMAN:\n+            if (Feasting() && !master->IsInCombat() && !master->HasAuraType(SPELL_AURA_PERIODIC_DAMAGE))\n+                return SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW;\n+            break;\n+        case BOT_CLASS_WARRIOR: //BladeStorm\n+        case BOT_CLASS_BM: //BladeStorm PLACEHOLDER\n+        case BOT_CLASS_ROGUE: //Killing Spree\n+            if (me->HasAuraType(SPELL_AURA_ALLOW_ONLY_ABILITY))\n+                return SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW;\n+            break;\n+        case BOT_CLASS_HUNTER:\n+        case BOT_CLASS_DEATH_KNIGHT:\n+        case BOT_CLASS_SPHYNX:\n+        case BOT_CLASS_ARCHMAGE:\n+        case BOT_CLASS_DREADLORD:\n+        case BOT_CLASS_SPELLBREAKER:\n+        case BOT_CLASS_DARK_RANGER:\n+        case BOT_CLASS_NECROMANCER:\n+        case BOT_CLASS_SEA_WITCH:\n+        case BOT_CLASS_CRYPT_LORD:\n+            break;\n+        default:\n+            BOT_LOG_ERROR(\"entities.player\", \"CheckBotCast(): Unknown bot class {}\", _botclass);\n+            break;\n+    }\n+\n+    return SPELL_CAST_OK;\n+}\n+\n+bool bot_ai::doCast(Unit* victim, uint32 spellId, bool triggered)\n+{\n+    return doCast(victim, spellId, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE);\n+}\n+\n+bool bot_ai::doCast(Unit* victim, uint32 spellId, TriggerCastFlags flags)\n+{\n+    if (spellId == 0) return false;\n+    if (!victim || !victim->IsInWorld() || me->GetMap() != victim->FindMap()) return false;\n+    if (IsCasting()) return false;\n+\n+    m_botSpellInfo = sSpellMgr->GetSpellInfo(spellId);\n+    if (!m_botSpellInfo)\n+        return false;\n+\n+    m_botSpellInfo = m_botSpellInfo->TryGetSpellInfoOverride(me);\n+\n+    //select aura level\n+    if (victim->isType(TYPEMASK_UNIT))\n+    {\n+        if (SpellInfo const* actualSpellInfo = m_botSpellInfo->GetAuraRankForLevel(victim->GetLevel()))\n+            m_botSpellInfo = actualSpellInfo;\n+\n+        if (!m_botSpellInfo->IsTargetingArea())\n+        {\n+            uint8 approximateAuraEffectMask = 0;\n+            uint8 nonAuraEffectMask = 0;\n+            for (auto i: NPCBots::index_array<uint8, MAX_SPELL_EFFECTS>)\n+            {\n+                if (m_botSpellInfo->Effects[i].IsAura())\n+                    approximateAuraEffectMask |= 1u << i;\n+                else if (m_botSpellInfo->Effects[i].IsEffect())\n+                    nonAuraEffectMask |= 1u << i;\n+            }\n+\n+            for (auto i: NPCBots::index_array<uint8, MAX_SPELL_EFFECTS>)\n+            {\n+                // check if target already has the same type, but more powerful aura\n+                if (!nonAuraEffectMask && (approximateAuraEffectMask & (1u << i)))\n+                    if (!victim->IsHighestExclusiveAuraEffect(m_botSpellInfo, AuraType(m_botSpellInfo->Effects[i].ApplyAuraName),\n+                        m_botSpellInfo->Effects[i].CalcValue(me, &m_botSpellInfo->Effects[i].BasePoints), approximateAuraEffectMask, false))\n+                        return false;\n+            }\n+        }\n+\n+        if ((flags & TRIGGERED_FULL_MASK) != TRIGGERED_FULL_MASK &&\n+            !(m_botSpellInfo->AttributesEx2 & SPELL_ATTR2_IGNORE_LINE_OF_SIGHT) &&\n+            !IsInBotParty(victim) && !me->IsWithinLOSInMap(victim, VMAP::ModelIgnoreFlags::M2, LINEOFSIGHT_ALL_CHECKS))\n+            return false;\n+    }\n+\n+    //check wrong spell interruption attempts\n+    if (/*victim->isType(TYPEMASK_UNIT) && */!HasBotCommandState(BOT_COMMAND_ISSUED_ORDER) &&\n+        !CastingUnitCheck::CastInterruptionCheck(victim, m_botSpellInfo))\n+        return false;\n+\n+    //for debug only\n+    if (victim->isType(TYPEMASK_UNIT) && victim->isDead())\n+    {\n+        if (victim->getDeathState() == DeathState::Dead)\n+            BOT_LOG_DEBUG(\"npcbots\", \"bot_ai::doCast(): {} (bot class {}) tried to cast spell {} on a DEAD target {}\", me->GetName(), _botclass, spellId, victim->GetName());\n+        else if (!(m_botSpellInfo->AttributesEx2 & SPELL_ATTR2_ALLOW_DEAD_TARGET) &&\n+            !m_botSpellInfo->HasEffect(SPELL_EFFECT_RESURRECT) &&\n+            !m_botSpellInfo->HasEffect(SPELL_EFFECT_RESURRECT_NEW) &&\n+            !m_botSpellInfo->HasEffect(SPELL_EFFECT_SELF_RESURRECT))\n+            BOT_LOG_DEBUG(\"npcbots\", \"bot_ai::doCast(): {} (bot class {}) tried to cast spell {} on a CORPSE target {}\", me->GetName(), _botclass, spellId, victim->GetName());\n+        //return false;\n+    }\n+\n+    //spells with cast time\n+    if (me->isMoving() && !(flags & TRIGGERED_CAST_DIRECTLY) && !m_botSpellInfo->IsAutoRepeatRangedSpell() && (m_botSpellInfo->InterruptFlags & SPELL_INTERRUPT_FLAG_MOVEMENT) &&\n+        !m_botSpellInfo->HasAttribute(SPELL_ATTR0_ON_NEXT_SWING))\n+    {\n+        int32 cast_time;\n+        if (m_botSpellInfo->IsChanneled())\n+            cast_time = m_botSpellInfo->GetDuration();\n+        else\n+        {\n+            cast_time = int32(m_botSpellInfo->CalcCastTime());\n+            me->ModSpellCastTime(m_botSpellInfo, cast_time);\n+        }\n+\n+        if (cast_time > 0)\n+        {\n+            if (!HasBotCommandState(BOT_COMMAND_ISSUED_ORDER))\n+            {\n+                if (JumpingOrFalling() || HasBotCommandState(BOT_COMMAND_STAY))\n+                    return false;\n+                if (!me->GetVictim() && me->IsInWorld() && (me->GetMap()->IsRaid() || me->GetMap()->IsHeroic()) &&\n+                    !m_botSpellInfo->HasAura(SPELL_AURA_MOUNTED))\n+                    return false;\n+                if (!m_botSpellInfo->HasEffect(SPELL_EFFECT_HEAL) && Rand() > (IAmFree() ? 80 : 50))\n+                    return false;\n+            }\n+\n+            me->BotStopMovement();\n+        }\n+    }\n+\n+    if ((!victim->isType(TYPEMASK_UNIT) || IsInBotParty(victim)) && !victim->IsWithinLOSInMap(me, VMAP::ModelIgnoreFlags::M2, LINEOFSIGHT_ALL_CHECKS) &&\n+        !HasBotCommandState(BOT_COMMAND_STAY) && !me->GetVehicle())\n+    {\n+        if (!IAmFree())\n+        {\n+            if (me->GetDistance(victim) > 10.f)\n+            {\n+                Position pos = victim->GetPosition();\n+                //victim->GetPosition(&pos);\n+                BotMovement(BOT_MOVE_POINT, &pos);\n+                //me->GetMotionMaster()->MovePoint(me->GetMapId(), pos);\n+            }\n+            else\n+                me->Relocate(victim);\n+        }\n+        else\n+            return false;\n+    }\n+\n+    //remove shapeshifts manually to restore powers/stats\n+    if (me->GetShapeshiftForm() != FORM_NONE)\n+    {\n+        if (m_botSpellInfo->CheckShapeshift(me->GetShapeshiftForm()) != SPELL_CAST_OK)\n+            if (!removeShapeshiftForm())\n+                return false;\n+    }\n+\n+    //CHECKS PASSED, NOW DO IT\n+\n+    if (me->GetStandState() == UNIT_STAND_STATE_SIT && !(m_botSpellInfo->Attributes & SPELL_ATTR0_ALLOW_WHILE_SITTING))\n+    {\n+        if (!doMana && (me->GetInterruptMask() & AURA_INTERRUPT_FLAG_NOT_SEATED))\n+            UpdateMana();\n+\n+        feast_health = false;\n+        feast_mana = false;\n+        me->SetStandState(UNIT_STAND_STATE_STAND);\n+    }\n+\n+    //debug\n+    //BOT_LOG_ERROR(\"entities.player\", \"CheckBotCast(): %s (%u) by %s on %s\", m_botSpellInfo->SpellName[0], spellId, me->GetName().c_str(), victim->GetName().c_str());\n+\n+    bool triggered = !!(flags & TRIGGERED_CAST_DIRECTLY);\n+    SpellCastTargets targets;\n+    targets.SetUnitTarget(victim);\n+    Spell* spell = new Spell(me, m_botSpellInfo, flags);\n+    spell->prepare(&targets); //sets current spell if succeed\n+/*\n+    SpellCastResult result = spell->CheckCast(true);\n+    if (result != SPELL_CAST_OK)\n+        BOT_LOG_ERROR(\"entities.player\", \"doCast(): %s (%u) by %s on %s failed with %u\",\n+        m_botSpellInfo->SpellName[0], spellId, me->GetName().c_str(), victim->GetName().c_str(), uint32(result));\n+*/\n+    bool casted = triggered; //triggered casts are casted immediately\n+    for (auto i: NPCBots::index_array<uint8, CURRENT_MAX_SPELL>)\n+    {\n+        if (me->GetCurrentSpell(i) == spell)\n+        {\n+            casted = true;\n+            break;\n+        }\n+    }\n+\n+    if (!casted)\n+    {\n+        //failed to cast\n+        if (HasBotCommandState(BOT_COMMAND_ISSUED_ORDER) &&\n+            !_orders.empty() && _orders.front()._type == BOT_ORDER_SPELLCAST &&\n+            _orders.front().params.spellCastParams.baseSpell == m_botSpellInfo->GetFirstRankSpell()->Id)\n+        {\n+            if (DEBUG_BOT_ORDERS)\n+                BOT_LOG_ERROR(\"entities.player\", \"doCast(): ordered spell {} is not casted!\", m_botSpellInfo->Id);\n+            CancelOrder(_orders.front());\n+        }\n+\n+        return false;\n+    }\n+\n+    if (triggered)\n+        return true;\n+    if (m_botSpellInfo->IsPassive() || m_botSpellInfo->IsCooldownStartedOnEvent())\n+        return true;\n+    if (!m_botSpellInfo->StartRecoveryCategory || !m_botSpellInfo->StartRecoveryTime)\n+        return true;\n+\n+    float gcd = float(m_botSpellInfo->StartRecoveryTime);\n+\n+    ApplyBotSpellGlobalCooldownMods(m_botSpellInfo, gcd);\n+    //Apply haste to cooldown\n+    if (haste && m_botSpellInfo->StartRecoveryCategory == 133 && m_botSpellInfo->StartRecoveryTime == 1500 &&\n+        m_botSpellInfo->DmgClass != SPELL_DAMAGE_CLASS_MELEE && m_botSpellInfo->DmgClass != SPELL_DAMAGE_CLASS_RANGED &&\n+        !(m_botSpellInfo->Attributes & (SPELL_ATTR0_USES_RANGED_SLOT|SPELL_ATTR0_IS_ABILITY)))\n+        ApplyBotPercentModFloatVar(gcd, float(haste), false);\n+\n+    //if cast time is lower than 1.5 sec it also reduces gcd but only if not instant\n+    if (m_botSpellInfo->CastTimeEntry)\n+    {\n+        if (int32 castTime = m_botSpellInfo->CastTimeEntry->CastTime)\n+        {\n+            if (castTime > 0)\n+            {\n+                ApplyClassSpellCastTimeMods(m_botSpellInfo, castTime);\n+                if (castTime < gcd)\n+                    gcd = float(castTime);\n+            }\n+        }\n+    }\n+\n+    GC_Timer = uint32(gcd);\n+    //global cd cannot be less than 1000 ms\n+    GC_Timer = std::max<uint32>(GC_Timer, 1000);\n+    //global cd cannot be greater than 1500 ms\n+    GC_Timer = std::min<uint32>(GC_Timer, 1500);\n+\n+    return true;\n+}\n+//Follow point calculation\n+void bot_ai::_calculatePos(Unit const* followUnit, Position& pos, float* speed/* = nullptr*/) const\n+{\n+    Player const* player = followUnit->ToPlayer();\n+    uint8 followdist = !player ? BotMgr::GetBotFollowDistMax() / 2 : player->GetBotMgr()->GetBotFollowDist();\n+    float mydist, angle;\n+\n+    if (HasRole(BOT_ROLE_TANK) && !IsTank(followUnit))\n+    {\n+        uint8 tanks = player != master ? 10 : std::max<uint8>(1, player->GetBotMgr()->GetNpcBotsCountByRole(BOT_ROLE_TANK));\n+        uint8 slot = player != master ? urand(0, 9) : player->GetBotMgr()->GetNpcBotSlotByRole(BOT_ROLE_TANK, me);\n+        angle = float(M_PI) / 6.0f; //max bias (left of right) //total arc is angle * 2\n+        angle = (angle / tanks) * (slot - (slot % 2)); //bias\n+        if (slot % 2) angle *= -1.f; //bias interchange\n+        mydist = 3.5f;\n+    }\n+    else if (HasRole(BOT_ROLE_RANGED))\n+    {\n+        uint8 rangeds = player != master ? 20 : std::max<uint8>(1, player->GetBotMgr()->GetNpcBotsCountByRole(BOT_ROLE_RANGED));\n+        uint8 slot = player != master ? urand(0, 19) : player->GetBotMgr()->GetNpcBotSlotByRole(BOT_ROLE_RANGED, me);\n+        angle = float(M_PI) / 3.5f; //max bias (left of right) //total arc is angle * 2\n+        angle = (angle / rangeds) * (slot - (slot % 2)); //bias\n+        if (slot % 2) angle *= -1.f; //bias interchange\n+        angle += float(M_PI); //behind\n+        mydist = 1.0f;\n+    }\n+    else if (HasRole(BOT_ROLE_DPS))\n+    {\n+        uint8 dpss = player != master ? 20 : std::max<uint8>(1, player->GetBotMgr()->GetNpcBotsCountByRole(BOT_ROLE_DPS));\n+        uint8 slot = player != master ? urand(0, 19) : player->GetBotMgr()->GetNpcBotSlotByRole(BOT_ROLE_DPS, me);\n+        angle = float(M_PI) / 7.5f; //max bias (left of right) //total arc is angle * 2\n+        angle = (angle / dpss) * (slot); //bias\n+        if (slot % 2) angle *= -1.f; //bias interchange\n+        angle += float(((slot % 4) < 2) ? (M_PI/2.f) : -(M_PI/2.f)); //sides\n+        mydist = 2.0f;\n+    }\n+    else\n+    {\n+        angle = float((me->GetEntry() % 2) ? (M_PI/2.f) : -(M_PI/2.f));\n+        mydist = 0.5f;\n+    }\n+\n+    mydist += std::max<int32>(int32(followdist) - 30, 5) / 7.f; //1.f-10.f\n+    mydist = std::max<float>(mydist - 2.f, 0.0f); //get bots closer\n+\n+    if (me->GetVehicle())\n+        mydist *= 2.f;\n+\n+    Position mpos;\n+    Unit const* bmover = me->GetVehicle() ? me->GetVehicleBase() : me;\n+    Unit const* mmover = followUnit->GetVehicle() ? followUnit->GetVehicleBase() : followUnit;\n+    uint32 movFlags = mmover->m_movementInfo.GetMovementFlags();\n+    float size = bmover->GetCombatReach() * 2;\n+    if (bmover->CanFly())\n+    {\n+        angle += mmover->GetOrientation();\n+        float &x = mpos.m_positionX, &y = mpos.m_positionY, &z = mpos.m_positionZ;\n+        bool over = false;\n+        for (uint8 i = 0; i != 5 + over; ++i)\n+        {\n+            if (over)\n+            {\n+                mydist *= 0.2f;\n+                break;\n+            }\n+            mmover->GetNearPoint(bmover, x, y, z, 0.f, mydist, angle);\n+            if (!followUnit->IsWithinLOS(x,y,z)) //try to get much closer to follow unit\n+            {\n+                mydist *= 0.4f - float(i*0.07f);\n+                size *= 0.1f;\n+                if (size < 0.1)\n+                    size = 0.f;\n+            }\n+            else\n+                over = true;\n+        }\n+    }\n+    else\n+        mpos = mmover->GetFirstCollisionPosition(mydist+size, angle);\n+\n+    if ((movFlags & MOVEMENTFLAG_FORWARD) && !(movFlags & MOVEMENTFLAG_FALLING_FAR))\n+    {\n+        float const aheadDist = std::max<float>(followdist * 0.08f, 6.f);\n+        float tx = mpos.m_positionX + aheadDist * std::cos(mmover->GetOrientation());\n+        float ty = mpos.m_positionY + aheadDist * std::sin(mmover->GetOrientation());\n+        float tz = mpos.m_positionZ;\n+        if (!bmover->CanFly())\n+            bmover->UpdateAllowedPositionZ(tx, ty, tz);\n+        if (mmover->IsWithinLOS(tx, ty, tz))\n+            mpos.Relocate(tx, ty, tz);\n+    }\n+\n+    if (me->GetPositionZ() < mpos.GetPositionZ())\n+        mpos.m_positionZ += 0.5f; //prevent going underground while moving\n+\n+    if (speed && !IAmFree() && player == master)\n+    {\n+        const float posdist = bmover->GetDistance(mpos);\n+        if (mmover->IsWalking() || HasBotCommandState(BOT_COMMAND_WALK))\n+        {\n+            const float basewalkspeed = bmover->GetSpeed(MOVE_WALK);\n+            *speed = basewalkspeed;\n+            if (!HasBotCommandState(BOT_COMMAND_WALK) && posdist > 10.0f && bmover->GetDistance(mmover) > 10.0f)\n+                *speed = bmover->GetSpeed(MOVE_RUN);\n+            else if (posdist > 7.5f)\n+                *speed = basewalkspeed * 1.15f;\n+        }\n+        else\n+        {\n+            const float baserunspeed = bmover->GetSpeed(MOVE_RUN);\n+            if (posdist > 50.0f)\n+                *speed = baserunspeed * 2.0f;\n+            else if (posdist > 30.0f)\n+                *speed = baserunspeed * 1.5f;\n+            else if (posdist > 10.0f)\n+                *speed = baserunspeed * 1.25f;\n+        }\n+    }\n+\n+    pos.Relocate(mpos);\n+\n+    //         TTT\n+    //      m       m\n+    //     m    M    m\n+    //      m       m\n+    //        rrrrr\n+    //\n+    //M - master (followUnit)\n+    //T - bot tank (ROLE_TANK)\n+    //r - ranged (ROLE_RANGED)\n+    //m - melee (ROLE_DPS)\n+}\n+// Movement set\n+// Uses MovePoint() for following instead of MoveFollow()\n+// This helps bots overcome a bug with fanthom walls on grid borders blocking pathing\n+void bot_ai::BotMovement(BotMovementType type, Position const* pos, Unit* target, bool generatePath, float speed) const\n+{\n+    Vehicle* veh = me->GetVehicle();\n+    VehicleSeatEntry const* seat = veh ? veh->GetSeatForPassenger(me) : nullptr;\n+    bool canControl = seat ? (seat->m_flags & VEHICLE_SEAT_FLAG_CAN_CONTROL) : false;\n+    Unit* mover = canControl ? veh->GetBase() : !veh ? me : nullptr;\n+    if (!mover)\n+        return;\n+\n+    switch (type)\n+    {\n+        case BOT_MOVE_CHASE:\n+            ASSERT(target);\n+            mover->GetMotionMaster()->MoveChase(target, {}, ChaseAngle(target->GetRelativeAngle(me), float(target->IsPlayer() ? M_PI * 2.0 : M_PI / 8.0)));\n+            break;\n+        case BOT_MOVE_POINT:\n+            mover->GetMotionMaster()->Add(new PointMovementGenerator<Creature>(1, pos->m_positionX, pos->m_positionY, pos->m_positionZ, FORCED_MOVEMENT_NONE, speed, 0.0f, nullptr, generatePath));\n+            break;\n+        case BOT_MOVE_JUMP:\n+            mover->GetMotionMaster()->MoveJump(pos->m_positionX, pos->m_positionY, pos->m_positionZ,\n+                22.0f, mover->GetExactDist2d(pos) * Movement::gravity / (22.0f * 2.0f), 1, nullptr);\n+            break;\n+        default:\n+            BOT_LOG_ERROR(\"scripts\", \"BotMovement: unhandled bot movement type {}\", uint32(type));\n+            return;\n+    }\n+}\n+bool bot_ai::CanBotMoveVehicle() const\n+{\n+    if (VehicleSeatEntry const* seat = me->GetVehicle() ? me->GetVehicle()->GetSeatForPassenger(me) : nullptr)\n+        return seat->m_flags & VEHICLE_SEAT_FLAG_CAN_CONTROL;\n+\n+    return false;\n+}\n+void bot_ai::MoveToSendPosition(Position const& mpos)\n+{\n+    EventRemoveBotAwaitState(BOT_AWAIT_SEND);\n+    if (me->GetExactDist(mpos) <= 70.0f && !CCed(me, true))\n+    {\n+        SetBotCommandState(BOT_COMMAND_STAY);\n+        me->InterruptNonMeleeSpells(true);\n+        BotMovement(BOT_MOVE_POINT, &mpos, nullptr, false);\n+        if (botPet && !CCed(botPet, true))\n+        {\n+            botPet->GetBotPetAI()->SetBotCommandState(BOT_COMMAND_STAY);\n+            botPet->InterruptNonMeleeSpells(true);\n+            botPet->GetMotionMaster()->MovePoint(me->GetMapId(), mpos, FORCED_MOVEMENT_NONE, 0.0f, false);\n+        }\n+        sendlastpos.Relocate(me);\n+        BotWhisper(\"Moving to position!\");\n+    }\n+    else\n+        BotWhisper(\"Position is too far away!\");\n+}\n+void bot_ai::MoveToSendPosition(uint32 point_id)\n+{\n+    MoveToSendPosition(sendpos[point_id]);\n+}\n+void bot_ai::MarkSendPosition(uint32 point_id)\n+{\n+    sendpos[point_id].Relocate(me);\n+}\n+\n+void bot_ai::SetBotAwaitState(uint8 state)\n+{\n+    if (HasBotAwaitState(state))\n+        return;\n+\n+    if (!me->IsAlive())\n+        return;\n+\n+    _botAwaitState |= state;\n+\n+    AbortAwaitStateRemoval();\n+    awaitStateRemEvent = new AwaitStateRemovalEvent(this, state);\n+    Events.AddEvent(awaitStateRemEvent, Events.CalculateTime(30000));\n+}\n+\n+void bot_ai::EventRemoveBotAwaitState(uint8 state)\n+{\n+    AbortAwaitStateRemoval();\n+    RemoveBotAwaitState(state);\n+}\n+\n+void bot_ai::AbortAwaitStateRemoval()\n+{\n+    if (awaitStateRemEvent)\n+    {\n+        if (awaitStateRemEvent->IsActive())\n+            awaitStateRemEvent->ScheduleAbort();\n+        awaitStateRemEvent = nullptr;\n+    }\n+}\n+\n+void bot_ai::SetBotCommandState(uint32 st, bool force, Position* newpos, float* speed/* = nullptr*/)\n+{\n+    if (!(st & (BOT_COMMAND_UNBIND | BOT_COMMAND_INACTION)))\n+    {\n+        if (!me->IsAlive() || JumpingOrFalling())\n+            return;\n+    }\n+\n+    Vehicle const* veh = me->GetVehicle();\n+    VehicleSeatEntry const* seat = veh ? veh->GetSeatForPassenger(me) : nullptr;\n+    bool canControl = seat ? (seat->m_flags & VEHICLE_SEAT_FLAG_CAN_CONTROL) : false;\n+    Unit* mover = canControl ? veh->GetBase() : !veh ? me : nullptr;\n+    if (mover)\n+    {\n+        if ((st & BOT_COMMAND_FOLLOW) && !IsChanneling() &&\n+            (force || (!mover->isMoving() && !IsCasting() && master->IsAlive() && !Feasting())))\n+        {\n+            if (!me->IsInMap(master)) return;\n+            if (CCed(mover, true)/* || master->HasUnitState(UNIT_STATE_FLEEING)*/) return;\n+            float myspeed = 0.0f;\n+            if (!newpos)\n+            {\n+                ASSERT(!IAmFree());\n+                _calculatePos(master, movepos, &myspeed);\n+            }\n+            else\n+            {\n+                movepos.m_positionX = newpos->m_positionX;\n+                movepos.m_positionY = newpos->m_positionY;\n+                movepos.m_positionZ = newpos->m_positionZ;\n+            }\n+            if (me->GetStandState() == UNIT_STAND_STATE_SIT && !Feasting())\n+                me->SetStandState(UNIT_STAND_STATE_STAND);\n+            if (IsShootingWand())\n+                me->InterruptSpell(CURRENT_AUTOREPEAT_SPELL);\n+            BotMovement(BOT_MOVE_POINT, &movepos, nullptr, true, speed ? *speed : myspeed);\n+            //me->GetMotionMaster()->MovePoint(master->GetMapId(), pos);\n+            //me->GetMotionMaster()->MoveFollow(master, mydist, angle);\n+            RemoveBotCommandState(BOT_COMMAND_STAY | BOT_COMMAND_FULLSTOP | BOT_COMMAND_ATTACK | BOT_COMMAND_COMBATRESET);\n+        }\n+        else if (st & BOT_COMMAND_MASK_NOCAST_ANY)\n+        {\n+            uint32 removeMask = BOT_COMMAND_MASK_NOCAST_ANY & GetBotCommandState();\n+            st &= ~removeMask;\n+            RemoveBotCommandState(removeMask);\n+            me->InterruptNonMeleeSpells(false);\n+            if (mover != me->ToUnit())\n+                mover->InterruptNonMeleeSpells(false);\n+        }\n+        else if (st & BOT_COMMAND_INACTION)\n+        {\n+            uint32 removeMask = BOT_COMMAND_INACTION & GetBotCommandState();\n+            st &= ~removeMask;\n+            RemoveBotCommandState(removeMask | BOT_COMMAND_MASK_NOCAST_ANY | BOT_COMMAND_STAY | BOT_COMMAND_FULLSTOP | BOT_COMMAND_ATTACK | BOT_COMMAND_COMBATRESET);\n+            me->AttackStop();\n+            me->InterruptNonMeleeSpells(true);\n+            if (mover != me->ToUnit())\n+            {\n+                mover->AttackStop();\n+                mover->InterruptNonMeleeSpells(true);\n+            }\n+            opponent = nullptr;\n+        }\n+        else if (st & BOT_COMMAND_FULLSTOP)\n+        {\n+            RemoveBotCommandState(BOT_COMMAND_FOLLOW | BOT_COMMAND_STAY | BOT_COMMAND_ATTACK);\n+            me->AttackStop();\n+            me->InterruptNonMeleeSpells(true);\n+            if (mover != me->ToUnit())\n+            {\n+                mover->AttackStop();\n+                mover->InterruptNonMeleeSpells(true);\n+            }\n+            opponent = nullptr;\n+            if (mover->isMoving())\n+                mover->ToCreature()->BotStopMovement();\n+        }\n+        else if (st & BOT_COMMAND_STAY)\n+        {\n+            RemoveBotCommandState(BOT_COMMAND_FOLLOW | BOT_COMMAND_FULLSTOP);\n+            if (mover->isMoving())\n+                mover->ToCreature()->BotStopMovement();\n+        }\n+        else if (st & BOT_COMMAND_ATTACK)\n+        {\n+            RemoveBotCommandState(BOT_COMMAND_FOLLOW);\n+        }\n+        else if (st & BOT_COMMAND_COMBATRESET)\n+        {\n+            RemoveBotCommandState(BOT_COMMAND_ATTACK);\n+        }\n+    }\n+\n+    _botCommandState |= st;\n+}\n+\n+void bot_ai::RemoveBotCommandState(uint32 st)\n+{\n+    _botCommandState &= ~st;\n+}\n+\n+bool bot_ai::IsPointedTarget(Unit const* target, uint8 targetFlags) const\n+{\n+    if (Group const* gr = (IAmFree() ? nullptr : master->GetGroup()))\n+        if (targetFlags)\n+            for (auto i: NPCBots::index_array<uint8, TARGET_ICONS_COUNT>)\n+                if (targetFlags & GroupIconsFlags[i])\n+                    if (target->GetGUID() == gr->GetTargetIcons()[i])\n+                        return true;\n+\n+    return false;\n+}\n+bool bot_ai::IsPointedHealTarget(Unit const* target) const\n+{\n+    return IsPointedTarget(target, BotCfg::GetHealTargetIconFlags());\n+}\n+bool bot_ai::IsPointedTankingTarget(Unit const* target) const\n+{\n+    return IsPointedTarget(target, BotCfg::GetTankTargetIconFlags());\n+}\n+bool bot_ai::IsPointedOffTankingTarget(Unit const* target) const\n+{\n+    return IsPointedTarget(target, BotCfg::GetOffTankTargetIconFlags());\n+}\n+//unused\n+bool bot_ai::IsPointedDPSTarget(Unit const* target) const\n+{\n+    return IsPointedTarget(target, BotCfg::GetDPSTargetIconFlags());\n+}\n+//unused\n+bool bot_ai::IsPointedRangedDPSTarget(Unit const* target) const\n+{\n+    return IsPointedTarget(target, BotCfg::GetRangedDPSTargetIconFlags());\n+}\n+bool bot_ai::IsPointedNoDPSTarget(Unit const* target) const\n+{\n+    return IsPointedTarget(target, BotCfg::GetNoDPSTargetIconFlags());\n+}\n+bool bot_ai::IsPointedAnyAttackTarget(Unit const* target) const\n+{\n+    return IsPointedTarget(target, BotCfg::GetOffTankTargetIconFlags() | BotCfg::GetDPSTargetIconFlags() | BotCfg::GetRangedDPSTargetIconFlags());\n+}\n+// Buffs And Heal (really)\n+// Priority as follows: 1) heal players 2) buff players 3) heal bots 4) buff bots\n+// Priority adjustments to be considered\n+void bot_ai::BuffAndHealGroup(uint32 diff)\n+{\n+    if (GC_Timer > diff) return;\n+    if (me->IsMounted() && !IsWanderer()) return;\n+    if (IsCasting() || Feasting()) return;\n+\n+    if (IAmFree())\n+    {\n+        if (BuffTarget(me, diff))\n+            return;\n+\n+        if (HealTarget(me, diff))\n+            return;\n+\n+        if (me->GetFaction() == FACTION_TEMPLATE_NEUTRAL_HOSTILE || me->HasAura(BERSERK))\n+            return;\n+\n+        std::list<Unit*> targets2;\n+        GetNearbyFriendlyTargetsList(targets2, 30);\n+        std::erase_if(targets2, BOTAI_PRED::BuffTargetExclude());\n+        std::erase_if(targets2, [this](Unit const* unit) {\n+            return !unit->IsPlayer() && !(IsWanderer() && unit->IsNPCBot() && unit->ToCreature()->GetBotAI()->IsWanderer());\n+        });\n+        if (!targets2.empty() && BuffTarget(targets2.size() == 1 ? targets2.front() : Bcore::Containers::SelectRandomContainerElement(targets2), diff))\n+            return;\n+        for (Unit* heal_target : targets2)\n+            if (GetHealthPCT(heal_target) < 95 && urand(1, 100) <= (30 + 30*uint32(!!GetBG())) && HealTarget(heal_target, diff))\n+                break;\n+\n+        return;\n+    }\n+\n+    Group const* pGroup = master->GetGroup();\n+    uint8 hppctthreshold = GetHealHpPctThreshold();\n+    if (!pGroup)\n+    {\n+        //heals\n+        if (HasRole(BOT_ROLE_HEAL))\n+        {\n+            std::list<Unit*> targets3;\n+            if (master->IsAlive() && !master->HasUnitState(UNIT_STATE_ISOLATED) && GetHealthPCT(master) <= hppctthreshold && me->GetDistance(master) < 40)\n+                targets3.push_back(master);\n+            if (master->GetVehicleBase() && !(master->GetVehicleBase()->IsCreature() &&\n+                master->GetVehicleCreatureBase()->GetCreatureTemplate()->type == CREATURE_TYPE_MECHANICAL) &&\n+                !master->GetVehicleBase()->HasUnitState(UNIT_STATE_ISOLATED) && GetHealthPCT(master->GetVehicleBase()) <= hppctthreshold &&\n+                me->GetDistance(master->GetVehicleBase()) < 40)\n+                targets3.push_back(master->GetVehicleBase());\n+            for (auto const& [_, bot] : *master->GetBotMgr()->GetBotMap())\n+            {\n+                if (!(!bot->IsInWorld() || me->GetMap() != bot->FindMap() || !bot->IsAlive() || bot->HasUnitState(UNIT_STATE_ISOLATED) ||\n+                    bot->ToCreature()->IsTempBot() || me->GetDistance(bot) > 40 ||\n+                    (GetHealthPCT(bot) > hppctthreshold && !IsTank(bot))))\n+                    targets3.push_back(bot);\n+\n+                Unit* bpet = bot->GetBotsPet();\n+\n+                if (!(!bpet || !bpet->IsAlive() || bpet->HasUnitState(UNIT_STATE_ISOLATED) || me->GetDistance(bpet) > 40 || GetHealthPCT(bpet) > hppctthreshold))\n+                    targets3.push_back(bpet);\n+\n+                Unit* veh = bot->GetVehicleBase();\n+                if (veh && !(veh->IsCreature() && veh->ToCreature()->GetCreatureTemplate()->type == CREATURE_TYPE_MECHANICAL) &&\n+                    !veh->HasUnitState(UNIT_STATE_ISOLATED) && GetHealthPCT(veh) <= hppctthreshold && me->GetDistance(veh) < 40)\n+                    targets3.push_back(veh);\n+            }\n+            for (Unit* c : master->m_Controlled)\n+            {\n+                if (!c->IsInWorld() || me->GetMap() != c->FindMap() || !c->IsAlive() || c->HasUnitState(UNIT_STATE_ISOLATED) ||\n+                    c->IsTotem() || c->GetEntry() == SHAMAN_EARTH_ELEMENTAL || me->GetDistance(c) > 40 ||\n+                    (GetHealthPCT(c) > hppctthreshold && !IsTank(c)))\n+                    continue;\n+\n+                targets3.push_back(c);\n+            }\n+\n+            if (!targets3.empty() && HealTarget(Bcore::Containers::SelectRandomContainerElement(targets3), diff))\n+                return;\n+        }\n+        //buffs\n+        std::list<Unit*> targets4;\n+        if (master->IsAlive() && me->GetDistance(master) < 30)\n+            targets4.push_back(master);\n+        for (auto const& [_, bot] : *master->GetBotMgr()->GetBotMap())\n+        {\n+            if (!(!bot->IsInWorld() || me->GetMap() != bot->FindMap() || !bot->IsAlive() || bot->HasUnitState(UNIT_STATE_ISOLATED) ||\n+                bot->IsTotem() || me->GetDistance(bot) > 30))\n+                targets4.push_back(bot);\n+\n+            //u = itr->second->GetBotsPet();\n+\n+            //if (!(!u || !u->IsAlive() || u->HasUnitState(UNIT_STATE_ISOLATED) || me->GetDistance(u) > 30))\n+            //    targets4.push_back(u);\n+        }\n+        for (Unit* c : master->m_Controlled)\n+        {\n+            if (!c || !c->IsPet() || me->GetMap() != c->FindMap() || !c->IsAlive() || c->HasUnitState(UNIT_STATE_ISOLATED) ||\n+                c->IsTotem() || me->GetDistance(c) > 30) continue;\n+\n+            targets4.push_back(c);\n+        }\n+\n+        if (!targets4.empty() && BuffTarget(Bcore::Containers::SelectRandomContainerElement(targets4), diff))\n+            return;\n+\n+        return;\n+    }\n+    bool Bots = false;\n+    //heals\n+    if (HasRole(BOT_ROLE_HEAL))\n+    {\n+        std::list<Unit*> targets5;\n+        for (GroupReference const* itr = pGroup->GetFirstMember(); itr != nullptr; itr = itr->next())\n+        {\n+            Player* tPlayer = itr->GetSource();\n+            if (tPlayer == nullptr) continue;\n+            if (me->GetMap() != tPlayer->FindMap()) continue;\n+            if (tPlayer->HaveBot() && !Bots)\n+                Bots = true;\n+            if (!tPlayer->IsAlive() || tPlayer->HasUnitState(UNIT_STATE_ISOLATED)) continue;\n+            if (me->GetDistance(tPlayer) > 40) continue;\n+            if (GetHealthPCT(tPlayer) <= hppctthreshold || IsTank(tPlayer))\n+                targets5.push_back(tPlayer);\n+            if (tPlayer->GetVehicleBase() && !(tPlayer->GetVehicleBase()->IsCreature() &&\n+                tPlayer->GetVehicleCreatureBase()->GetCreatureTemplate()->type == CREATURE_TYPE_MECHANICAL) &&\n+                !tPlayer->GetVehicleBase()->HasUnitState(UNIT_STATE_ISOLATED) && GetHealthPCT(tPlayer->GetVehicleBase()) <= hppctthreshold &&\n+                me->GetDistance(tPlayer->GetVehicleBase()) < 40)\n+                targets5.push_back(tPlayer->GetVehicleBase());\n+        }\n+        if (Bots)\n+        {\n+            for (GroupReference const* itr = pGroup->GetFirstMember(); itr != nullptr; itr = itr->next())\n+            {\n+                Player const* tPlayer = itr->GetSource();\n+                if (tPlayer == nullptr) continue;\n+                if (me->GetMap() != tPlayer->FindMap()) continue;\n+\n+                if (tPlayer->HaveBot())\n+                {\n+                    for (auto const& [_, bot] : *tPlayer->GetBotMgr()->GetBotMap())\n+                    {\n+                        if (!(!bot->IsInWorld() || me->GetMap() != bot->FindMap() || !bot->IsAlive() || bot->HasUnitState(UNIT_STATE_ISOLATED) ||\n+                            bot->ToCreature()->IsTempBot() || me->GetDistance(bot) > 40 ||\n+                            (GetHealthPCT(bot) > hppctthreshold && !IsTank(bot))))\n+                            targets5.push_back(bot);\n+\n+                        Unit* bpet = bot->GetBotsPet();\n+\n+                        if (!(!bpet || !bpet->IsAlive() || bpet->HasUnitState(UNIT_STATE_ISOLATED) || me->GetDistance(bpet) > 40 || GetHealthPCT(bpet) > hppctthreshold))\n+                            targets5.push_back(bpet);\n+\n+                        Unit* veh = bot->GetVehicleBase();\n+                        if (veh && !(veh->IsCreature() && veh->ToCreature()->GetCreatureTemplate()->type == CREATURE_TYPE_MECHANICAL) &&\n+                            !veh->HasUnitState(UNIT_STATE_ISOLATED) && GetHealthPCT(veh) <= hppctthreshold && me->GetDistance(veh) < 40)\n+                            targets5.push_back(veh);\n+                    }\n+                }\n+                for (Unit* c : tPlayer->m_Controlled)\n+                {\n+                    if (!c || !c->IsInWorld() || me->GetMap() != c->FindMap() || !c->IsAlive() || c->HasUnitState(UNIT_STATE_ISOLATED) ||\n+                        c->IsTotem() || c->GetEntry() == SHAMAN_EARTH_ELEMENTAL || me->GetDistance(c) > 40 ||\n+                        (GetHealthPCT(c) > hppctthreshold && !IsTank(c)))\n+                        continue;\n+\n+                    targets5.push_back(c);\n+                }\n+            }\n+        }\n+\n+        //check if we have pointed heal target\n+        for (auto i : NPCBots::index_array<uint8, TARGET_ICONS_COUNT>)\n+        {\n+            if (BotCfg::GetHealTargetIconFlags() & GroupIconsFlags[i])\n+            {\n+                if (ObjectGuid guid = pGroup->GetTargetIcons()[i])\n+                {\n+                    if (Unit* unit = ObjectAccessor::GetUnit(*me, guid))\n+                    {\n+                        if (unit->IsAlive() && !unit->HasUnitState(UNIT_STATE_ISOLATED) && me->GetMap() == unit->FindMap() && me->GetDistance(unit) < 40 &&\n+                            !unit->IsFullHealth() && master->GetVictim() != unit && !IsInBotParty(unit->GetVictim()) &&\n+                            unit->GetEntry() != SHAMAN_EARTH_ELEMENTAL &&\n+                            !(unit->IsCreature() && unit->ToCreature()->GetCreatureTemplate()->type == CREATURE_TYPE_MECHANICAL) &&\n+                            unit->GetReactionTo(master) >= REP_NEUTRAL)\n+                        {\n+                            targets5.push_back(unit);\n+                        }\n+                    }\n+                }\n+            }\n+        }\n+        if (!targets5.empty() && HealTarget(Bcore::Containers::SelectRandomContainerElement(targets5), diff))\n+            return;\n+    }\n+    //buffs\n+    std::list<Unit*> targets6;\n+    for (GroupReference const* itr = pGroup->GetFirstMember(); itr != nullptr; itr = itr->next())\n+    {\n+        Player* tPlayer = itr->GetSource();\n+        if (tPlayer == nullptr) continue;\n+        if (me->GetMap() != tPlayer->FindMap()) continue;\n+        if (tPlayer->HaveBot() && !Bots)\n+            Bots = true;\n+        if (!tPlayer->IsAlive() || tPlayer->HasUnitState(UNIT_STATE_ISOLATED)) continue;\n+        if (me->GetDistance(tPlayer) > 30) continue;\n+        targets6.push_back(tPlayer);\n+    }\n+    if (Bots)\n+    {\n+        for (GroupReference const* itr = pGroup->GetFirstMember(); itr != nullptr; itr = itr->next())\n+        {\n+            Player const* tPlayer = itr->GetSource();\n+            if (tPlayer == nullptr) continue;\n+            if (me->GetMap() != tPlayer->FindMap()) continue;\n+\n+            if (tPlayer->HaveBot())\n+            {\n+                for (auto const& [_, bot] : *tPlayer->GetBotMgr()->GetBotMap())\n+                {\n+                    if (!(!bot->IsInWorld() || me->GetMap() != bot->FindMap() || !bot->IsAlive() || bot->HasUnitState(UNIT_STATE_ISOLATED) ||\n+                        bot->IsTotem() || me->GetDistance(bot) > 30))\n+                        targets6.push_back(bot);\n+\n+                    //u = bitr->second->GetBotsPet();\n+\n+                    //if (!(!u || !u->IsAlive() || u->HasUnitState(UNIT_STATE_ISOLATED) || me->GetDistance(u) > 30))\n+                    //    targets6.push_back(u);\n+                }\n+            }\n+            for (Unit* c : tPlayer->m_Controlled)\n+            {\n+                if (!c || !c->IsPet() || me->GetMap() != c->FindMap() || !c->IsAlive() || c->HasUnitState(UNIT_STATE_ISOLATED) ||\n+                    c->IsTotem() || me->GetDistance(c) > 30) continue;\n+\n+                targets6.push_back(c);\n+            }\n+        }\n+    }\n+\n+    if (!targets6.empty() && BuffTarget(Bcore::Containers::SelectRandomContainerElement(targets6), diff))\n+        return;\n+}\n+// Attempt to resurrect dead players and bots\n+// Target is either bot, player or player corpse\n+// no need to check global cooldown\n+void bot_ai::ResurrectGroup(uint32 spell_id)\n+{\n+    if (!spell_id || Rand() > 10)\n+        return;\n+\n+    SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spell_id);\n+    ASSERT(spellInfo);\n+    spellInfo = spellInfo->TryGetSpellInfoOverride(me);\n+    if (int32(me->GetPower(Powers(spellInfo->PowerType))) < spellInfo->CalcPowerCost(me, spellInfo->GetSchoolMask()))\n+        return;\n+\n+    //BOT_LOG_ERROR(\"entities.player\", \"ResurrectGroup by %s\", me->GetName().c_str());\n+\n+    if (IAmFree())\n+    {\n+        if (me->GetFaction() == FACTION_TEMPLATE_NEUTRAL_HOSTILE || me->HasAura(BERSERK))\n+            return;\n+\n+        WorldObject* playerOrCorpse = GetNearbyRezTarget();\n+        if (!playerOrCorpse)\n+            return;\n+\n+        if (!playerOrCorpse->IsWithinLOSInMap(me, VMAP::ModelIgnoreFlags::M2, LINEOFSIGHT_ALL_CHECKS))\n+            me->Relocate(*playerOrCorpse);\n+\n+        Unit* target = playerOrCorpse->IsPlayer() ? playerOrCorpse->ToUnit() : (Unit*)playerOrCorpse->ToCorpse();\n+        if (doCast(target, spell_id)) //rezzing it\n+        {\n+            if (Player const* player = playerOrCorpse->IsPlayer() ? playerOrCorpse->ToPlayer() : ObjectAccessor::FindPlayer(playerOrCorpse->ToCorpse()->GetOwnerGUID()))\n+                BotWhisper(LocalizedNpcText(player, BOT_TEXT_REZZING_YOU), player);\n+        }\n+\n+        return;\n+    }\n+\n+    Group const* group = master->GetGroup();\n+    std::vector<Creature*> bottargets;\n+    if (!group)\n+    {\n+        Player* player = master;\n+        if (!player->IsAlive() && !player->isResurrectRequested() && !player->GetUInt32Value(PLAYER_SELF_RES_SPELL))\n+        {\n+            Unit* target = player->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_GHOST) ? player->ToUnit() : (Unit*)player->GetCorpse();\n+            if (target && target->IsInWorld() && me->GetMap() == target->FindMap() &&\n+                !player->GetBotMgr()->IsBeingResurrected(target))\n+            {\n+                if (me->GetDistance(target) > 30 && !HasBotCommandState(BOT_COMMAND_STAY) && !me->GetVehicle())\n+                {\n+                    BotMovement(BOT_MOVE_POINT, target);\n+                    //me->GetMotionMaster()->MovePoint(master->GetMapId(), *target);\n+                    return;\n+                }\n+                else if (me->GetDistance(target) < 15 && !target->IsWithinLOSInMap(me, VMAP::ModelIgnoreFlags::M2, LINEOFSIGHT_ALL_CHECKS))\n+                    me->Relocate(*target);\n+\n+                if (doCast(target, spell_id))//rezzing it\n+                {\n+                    BotWhisper(LocalizedNpcText(player, BOT_TEXT_REZZING_YOU));\n+                    return;\n+                }\n+            }\n+        }\n+\n+        for (auto const& [_, bot] : *player->GetBotMgr()->GetBotMap())\n+        {\n+            if (!bot || !bot->IsInWorld() || bot->IsAlive()) continue;\n+            if (bot->GetBotAI()->GetReviveTimer() < 15000 || bot->GetBotAI()->GetSelfRezSpell()) continue;\n+            if (me->GetDistance(bot) < 30 && bot->IsWithinLOSInMap(me, VMAP::ModelIgnoreFlags::M2, LINEOFSIGHT_ALL_CHECKS) &&\n+                !player->GetBotMgr()->IsBeingResurrected(bot))\n+                bottargets.push_back(bot);\n+        }\n+    }\n+    else\n+    {\n+        bool Bots = false;\n+        for (GroupReference const* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())\n+        {\n+            Player* player = itr->GetSource();\n+            if (!player || player->FindMap() != me->GetMap()) continue;\n+            if (!Bots && player->HaveBot())\n+                Bots = true;\n+            if (player->IsAlive() || player->isResurrectRequested() || player->GetUInt32Value(PLAYER_SELF_RES_SPELL)) continue;\n+\n+            Unit* target = player->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_GHOST) ? player->ToUnit() : (Unit*)player->GetCorpse();\n+\n+            if (!target || !target->IsInWorld()) continue;\n+            if (target->GetTypeId() != player->GetTypeId() && me->GetMap() != target->FindMap()) continue;\n+            if (master->GetBotMgr()->IsBeingResurrected(target)) return;\n+            if (me->GetDistance(target) > 30 && !HasBotCommandState(BOT_COMMAND_STAY) && !me->GetVehicle())\n+            {\n+                if (player == master)\n+                {\n+                    BotMovement(BOT_MOVE_POINT, target);\n+                    //me->GetMotionMaster()->MovePoint(me->GetMapId(), *target);\n+                    return;\n+                }\n+                continue;\n+            }\n+            else if (me->GetDistance(target) < 15 && !target->IsWithinLOSInMap(me, VMAP::ModelIgnoreFlags::M2, LINEOFSIGHT_ALL_CHECKS))\n+                me->Relocate(*target);\n+\n+            if (doCast(target, spell_id))//rezzing it\n+            {\n+                BotWhisper(LocalizedNpcText(player, BOT_TEXT_REZZING_YOU), player);\n+                if (player != master)\n+                    BotWhisper(LocalizedNpcText(master, BOT_TEXT_REZZING_) + player->GetName());\n+                return;\n+            }\n+        }\n+\n+        if (!Bots)\n+            return;\n+\n+        for (GroupReference const* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())\n+        {\n+            Player const* player = itr->GetSource();\n+            if (!player || player->FindMap() != me->GetMap() || !player->HaveBot()) continue;\n+\n+            for (auto const& [_, bot] : *player->GetBotMgr()->GetBotMap())\n+            {\n+                if (!bot || !bot->IsInWorld() || bot->IsAlive()) continue;\n+                if (bot->GetBotAI()->GetReviveTimer() < 15000 || bot->GetBotAI()->GetSelfRezSpell()) continue;\n+                if (me->GetDistance(bot) < 30 && bot->IsWithinLOSInMap(me, VMAP::ModelIgnoreFlags::M2, LINEOFSIGHT_ALL_CHECKS) &&\n+                    !player->GetBotMgr()->IsBeingResurrected(bot))\n+                    bottargets.push_back(bot);\n+            }\n+        }\n+    }\n+\n+    //BOT_LOG_ERROR(\"entities.unit\", \"ResurrectGroup: %s found %u targets\", me->GetName().c_str(), uint32(bottargets.size()));\n+\n+    if (bottargets.empty())\n+        return;\n+\n+    Unit* target = bottargets.size() < 2u ? bottargets.front() : Bcore::Containers::SelectRandomContainerElement(bottargets);\n+\n+    if (doCast(target, spell_id))\n+    {\n+        Player const* targetOwner = target->ToCreature()->GetBotOwner();\n+        if (targetOwner != master)\n+        {\n+            std::ostringstream rezstr;\n+            rezstr << LocalizedNpcText(targetOwner, BOT_TEXT_REZZING_) << target->GetName() << \" (\" << LocalizedNpcText(targetOwner, BOT_TEXT_YOUR_BOT) << \")\";\n+            BotWhisper(rezstr.view(), targetOwner);\n+            rezstr.str(\"\");\n+            rezstr << LocalizedNpcText(master, BOT_TEXT_REZZING_) << target->GetName() << \" (\" << targetOwner->GetName() << LocalizedNpcText(master, BOT_TEXT__S_BOT) << \")\";\n+            BotWhisper(rezstr.view());\n+        }\n+        else\n+            BotWhisper(LocalizedNpcText(master, BOT_TEXT_REZZING_) + target->GetName());\n+\n+        return;\n+    }\n+}\n+// CURES\n+//cycle through the group sending members for cure\n+void bot_ai::CureGroup(uint32 cureSpell, uint32 diff)\n+{\n+    if (!cureSpell) return;\n+    if (GC_Timer > diff) return;\n+    if (me->IsMounted()) return;\n+    if (IsTank() && me->GetVictim() && me->GetMap()->IsRaid()) return;\n+    if (IsCasting()) return;\n+\n+    Group const* pGroup = !IAmFree() ? master->GetGroup() : me->GetBotGroup();\n+    std::list<Unit*> targets;\n+    if (IAmFree() && (!IsWanderer() || !pGroup || me->IsInCombat()))\n+    {\n+        if (_canCureTarget(me, cureSpell))\n+            targets.push_back(me);\n+        if (botPet && !me->IsInCombat() && _canCureTarget(botPet, cureSpell))\n+            targets.push_back(botPet);\n+\n+        if (!(me->GetFaction() == FACTION_TEMPLATE_NEUTRAL_HOSTILE || me->HasAura(BERSERK)))\n+        {\n+            std::list<Unit*> targets1;\n+            GetNearbyFriendlyTargetsList(targets1, 30);\n+            for (Unit* target : targets1)\n+                if ((target->IsPlayer() || target->ToPet()) && _canCureTarget(target, cureSpell))\n+                    targets.push_back(target);\n+        }\n+\n+        if (!targets.empty())\n+        {\n+            if (doCast(Bcore::Containers::SelectRandomContainerElement(targets), cureSpell))\n+                return;\n+        }\n+\n+        return;\n+    }\n+\n+    if (!me->GetMap()->IsRaid() && Rand() > 35)\n+        return;\n+\n+    //BOT_LOG_ERROR(\"entities.player\", \"%s: CureGroup() on %s\", me->GetName().c_str(), pTarget->GetName().c_str());\n+    if (!pGroup)\n+    {\n+        if (_canCureTarget(master, cureSpell))\n+            targets.push_back(master);\n+\n+        for (auto const& [_, bot] : *master->GetBotMgr()->GetBotMap())\n+        {\n+            if (!bot || !bot->IsInWorld() || me->GetMap() != bot->FindMap() || !bot->IsAlive()) continue;\n+            if (_canCureTarget(bot, cureSpell))\n+                targets.push_back(bot);\n+        }\n+\n+        for (Unit* c : master->m_Controlled)\n+        {\n+            if (!c || !c->IsPet() || !c->IsAlive() || me->GetDistance(c) > 30) continue;\n+\n+            if (_canCureTarget(c, cureSpell))\n+                targets.push_back(c);\n+        }\n+    }\n+    else\n+    {\n+        bool Bots = false;\n+        for (GroupReference const* itr = pGroup->GetFirstMember(); itr != nullptr; itr = itr->next())\n+        {\n+            Player* tPlayer = itr->GetSource();\n+            if (!tPlayer || (!tPlayer->IsAlive() && !tPlayer->HaveBot())) continue;\n+            if (!tPlayer->IsInWorld() || tPlayer->IsBeingTeleported()) continue;\n+            if (me->GetMap() != tPlayer->FindMap()) continue;\n+            if (!Bots && tPlayer->HaveBot())\n+                Bots = true;\n+            if (_canCureTarget(tPlayer, cureSpell))\n+                targets.push_back(tPlayer);\n+        }\n+        if (!Bots) return;\n+        for (GroupReference const* itr = pGroup->GetFirstMember(); itr != nullptr; itr = itr->next())\n+        {\n+            Player* tPlayer = itr->GetSource();\n+            if (tPlayer == nullptr) continue;\n+            if (!tPlayer->IsInWorld() || tPlayer->IsBeingTeleported()) continue;\n+            if (me->GetMap() != tPlayer->FindMap()) continue;\n+\n+            if (tPlayer->HaveBot())\n+            {\n+                for (auto const& [_, bot] : *tPlayer->GetBotMgr()->GetBotMap())\n+                {\n+                    if (!bot || !bot->IsInWorld() || me->GetMap() != bot->FindMap() || !bot->IsAlive()) continue;\n+                    if (_canCureTarget(bot, cureSpell))\n+                        targets.push_back(bot);\n+                }\n+            }\n+\n+            if (!me->IsInCombat())\n+            {\n+                for (Unit* c : tPlayer->m_Controlled)\n+                {\n+                    if (!c || !c->IsPet() || !c->IsAlive() || me->GetDistance(c) > 30) continue;\n+\n+                    if (_canCureTarget(c, cureSpell))\n+                        targets.push_back(c);\n+                }\n+            }\n+        }\n+    }\n+\n+    if (!targets.empty())\n+    {\n+        if (doCast(Bcore::Containers::SelectRandomContainerElement(targets), cureSpell))\n+            return;\n+    }\n+}\n+\n+// determines if unit has something to cure\n+bool bot_ai::_canCureTarget(Unit const* target, uint32 cureSpell) const\n+{\n+    if (me->GetLevel() < 10 || target->GetLevel() < 10) return false;\n+    if (target->HasUnitState(UNIT_STATE_ISOLATED)) return false;\n+    if (target->IsCreature() && target->ToCreature()->IsTempBot()) return false;\n+    if (target->HasAuraType(SPELL_AURA_MOD_POSSESS) && !IsInBotParty(target)) return false;\n+\n+    SpellInfo const* info = sSpellMgr->GetSpellInfo(cureSpell);\n+    if (!info)\n+        return false;\n+    info = info->TryGetSpellInfoOverride(me);\n+\n+    if (me->GetDistance(target) > CalcSpellMaxRange(cureSpell, false))\n+        return false;\n+\n+    uint32 dispelMask = 0;\n+    for (auto i : NPCBots::index_array<uint8, MAX_SPELL_EFFECTS>)\n+        if (info->Effects[i].Effect == SPELL_EFFECT_DISPEL)\n+            dispelMask |= SpellInfo::GetDispelMask(DispelType(info->Effects[i].MiscValue));\n+\n+    //SpellBreaker addins\n+    if (cureSpell == SPELL_STEAL_MAGIC)\n+        dispelMask |= (1u<<DISPEL_MAGIC) | (1u<<DISPEL_CURSE);\n+\n+    if (dispelMask == 0)\n+        return false;\n+\n+    std::list<Aura const*> dispel_list;\n+    _getBotDispellableAuraList(target, dispelMask, dispel_list);\n+\n+    return !(dispel_list.empty());\n+}\n+\n+void bot_ai::_getBotDispellableAuraList(Unit const* target, uint32 dispelMask, std::list<Aura const*> &dispelList) const\n+{\n+    //Unholy Blight prevents diseases from being dispelled\n+    if ((dispelMask & (1u<<DISPEL_DISEASE)) &&\n+        target->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DEATHKNIGHT, 1494, 0))\n+        dispelMask &= ~(1u<<DISPEL_DISEASE);\n+\n+    for (auto const& [_, aura] : target->GetOwnedAuras())\n+    {\n+        if (aura->IsPassive())\n+            continue;\n+\n+        AuraApplication const* aurApp = aura->GetApplicationOfTarget(target->GetGUID());\n+        if (!aurApp)\n+            continue;\n+\n+        if (aura->GetSpellInfo()->GetDispelMask() & dispelMask)\n+        {\n+            //do not dispel positive auras from enemies and negative ones from friends\n+            if (aurApp->IsPositive() == target->IsFriendlyTo(me))\n+                continue;\n+\n+            //skip Vampiric Touch to prevent being CCed just heal it out\n+            if (HasRole(BOT_ROLE_HEAL) && aura->GetSpellInfo()->IsRankOf(sSpellMgr->GetSpellInfo(34914)))\n+                continue;\n+\n+            if (((aura->GetSpellInfo()->AttributesEx7 & SPELL_ATTR7_DISPEL_REMOVES_CHARGES) ? aura->GetCharges() : aura->GetStackAmount()) > 0)\n+                dispelList.push_back(aura);\n+        }\n+    }\n+}\n+// Check if can cast some spell out of main rotation to use up target's spell reflection charges\n+// Supposed to check instant non-damaging spells but these checks are not performed (Shaman, Priest)\n+bool bot_ai::CanRemoveReflectSpells(Unit const* target, uint32 spellId) const\n+{\n+    if (!target || !spellId)\n+        return false;\n+\n+    if (!target->HasAuraType(SPELL_AURA_REFLECT_SPELLS) && !target->HasAuraType(SPELL_AURA_REFLECT_SPELLS_SCHOOL))\n+        return false;\n+\n+    SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);\n+    if (!spellInfo)\n+        return false;\n+    spellInfo = spellInfo->TryGetSpellInfoOverride(me);\n+\n+    if (!spellInfo->IsPositive() && spellInfo->DmgClass == SPELL_DAMAGE_CLASS_MAGIC &&\n+        !(spellInfo->Attributes & SPELL_ATTR0_IS_ABILITY) && !(spellInfo->AttributesEx & SPELL_ATTR1_NO_REFLECTION) &&\n+        !(spellInfo->Attributes & SPELL_ATTR0_NO_IMMUNITIES))\n+    {\n+        //bool directDamage = false;\n+        //for (uint8 i = 0; i != MAX_SPELL_EFFECTS; ++i)\n+        //{\n+        //    if (spellInfo->Effects[i].TargetA.GetTarget() == TARGET_UNIT_TARGET_ENEMY)\n+        //    {\n+        //        if (spellInfo->Effects[i].IsEffect(SPELL_EFFECT_SCHOOL_DAMAGE) ||\n+        //            spellInfo->Effects[i].IsAura(SPELL_AURA_PERIODIC_DAMAGE) ||\n+        //            spellInfo->Effects[i].IsAura(SPELL_AURA_PERIODIC_LEECH) ||\n+        //            spellInfo->Effects[i].IsAura(SPELL_AURA_MOD_SPEED_SLOW_ALL) ||//Icy Touch\n+        //            spellInfo->Effects[i].IsAura(SPELL_AURA_HASTE_SPELLS))//Slow\n+        //        {\n+        //            directDamage = true;\n+        //            break;\n+        //        }\n+        //    }\n+        //}\n+        //if (directDamage)\n+        //{\n+            for (AuraEffect const* aeff : target->GetAuraEffectsByType(SPELL_AURA_REFLECT_SPELLS))\n+            {\n+                //All existing SPELL_AURA_REFLECT_SPELLS spells have at least amount 50\n+                if (aeff->GetBase()->IsUsingCharges() &&\n+                    aeff->GetBase()->GetCharges() <= target->getAttackers().size() * (aeff->GetBase()->GetDuration() / 1000) / 4)\n+                    return true;\n+            }\n+\n+            for (AuraEffect const* aeff : target->GetAuraEffectsByType(SPELL_AURA_REFLECT_SPELLS_SCHOOL))\n+            {\n+                if (aeff->GetBase()->IsUsingCharges() &&\n+                    aeff->GetAmount() >= 50 && (aeff->GetMiscValue() & spellInfo->GetSchoolMask()) &&\n+                    aeff->GetBase()->GetCharges() <= (aeff->GetBase()->GetDuration() / 1000) / 4)\n+                    return true;\n+            }\n+        //}\n+    }\n+\n+    return false;\n+}\n+//LIST AURAS\n+// Debug: Returns bot's info to called player\n+void bot_ai::_listAuras(Player const* player, Unit const* unit) const\n+{\n+    //if (player->GetSession()->GetSecurity() == SEC_PLAYER) return;\n+    if (!player->IsGameMaster() && (IAmFree() || !IsInBotParty(player))) return;\n+    if (!IsInBotParty(unit)) return;\n+    ChatHandler ch(player->GetSession());\n+    std::ostringstream botstring;\n+    botstring.setf(std::ios_base::fixed);\n+    uint32 const bot_pet_player_class = unit->IsPlayer() ? unit->GetClass() : unit->ToCreature()->GetBotAI()->GetBotClass();\n+    botstring << unit->GetName() << \" (\" << LocalizedNpcText(player, BOT_TEXT_CLASS) << \": \" << uint32(bot_pet_player_class) << \"), \";\n+    if (unit->IsPlayer())\n+        botstring << LocalizedNpcText(player, BOT_TEXT_PLAYER);\n+    else if (unit->IsNPCBot())\n+    {\n+        bot_ai const* ai = unit->ToCreature()->GetBotAI();\n+        botstring << LocalizedNpcText(player, BOT_TEXT_MASTER) << \": \";\n+        Player const* owner = ai->GetBotOwner();\n+        botstring << (owner != unit ? owner->GetName() : LocalizedNpcText(player, BOT_TEXT_NONE));\n+    }\n+    uint8 locale = player->GetSession()->GetSessionDbcLocale();\n+    for (auto const& [_, aura] : unit->GetOwnedAuras())\n+    {\n+        SpellInfo const* spellInfo = aura->GetSpellInfo();\n+        if (!spellInfo)\n+            continue;\n+        spellInfo = spellInfo->TryGetSpellInfoOverride(me);\n+        uint32 id = spellInfo->Id;\n+        SpellInfo const* learnSpellInfo = sSpellMgr->GetSpellInfo(spellInfo->Effects[0].TriggerSpell);\n+        std::string_view name{ spellInfo->SpellName[locale] };\n+        botstring << \"\\n\" << id << \" - |cffffffff|Hspell:\" << id << \"|h[\" << name;\n+        botstring << ' ' << localeNames[locale] << \"]|h|r\";\n+        uint32 talentcost = GetTalentSpellCost(id);\n+        uint32 rank = 0;\n+        if (talentcost > 0 && (spellInfo->GetNextRankSpell() || spellInfo->GetPrevRankSpell()))\n+            rank = talentcost;\n+        else if (learnSpellInfo && (spellInfo->GetNextRankSpell() || spellInfo->GetPrevRankSpell()))\n+            rank = spellInfo->GetRank();\n+        else if (spellInfo->GetNextRankSpell() || spellInfo->GetPrevRankSpell())\n+            rank = spellInfo->GetRank();\n+        if (rank > 0)\n+            botstring << \" \" << LocalizedNpcText(player, BOT_TEXT_RANK) << \" \" << rank;\n+        if (talentcost > 0)\n+            botstring << \" [\" << LocalizedNpcText(player, BOT_TEXT_TALENT) << \"]\";\n+        if (spellInfo->IsPassive())\n+            botstring << \" [\" << LocalizedNpcText(player, BOT_TEXT_PASSIVE) << \"]\";\n+        if ((spellInfo->Attributes & SPELL_ATTR0_DO_NOT_DISPLAY) ||\n+            (spellInfo->AttributesEx & SPELL_ATTR1_NO_AURA_ICON))\n+            botstring << \" [\" << LocalizedNpcText(player, BOT_TEXT_HIDDEN) << \"]\";\n+        if (unit->IsPlayer() && unit->ToPlayer()->HasSpell(id))\n+            botstring << \" [\" << LocalizedNpcText(player, BOT_TEXT_KNOWN) << \"]\";\n+        else if (unit == me && GetSpell(spellInfo->GetFirstRankSpell()->Id))\n+            botstring << \" [\" << LocalizedNpcText(player, BOT_TEXT_ABILITY) << \"]\";\n+    }\n+    botstring.precision(1);\n+    for (auto i : NPCBots::index_array<uint8, MAX_STATS>)\n+    {\n+        std::string mystat;\n+        switch (i)\n+        {\n+            case STAT_STRENGTH: mystat = LocalizedNpcText(player, BOT_TEXT_STAT_STR); break;\n+            case STAT_AGILITY: mystat = LocalizedNpcText(player, BOT_TEXT_STAT_AGI); break;\n+            case STAT_STAMINA: mystat = LocalizedNpcText(player, BOT_TEXT_STAT_STA); break;\n+            case STAT_INTELLECT: mystat = LocalizedNpcText(player, BOT_TEXT_STAT_INT); break;\n+            case STAT_SPIRIT: mystat = LocalizedNpcText(player, BOT_TEXT_STAT_SPI); break;\n+            default: mystat = LocalizedNpcText(player, BOT_TEXT_STAT_UNK); break;\n+        }\n+        //ch.PSendSysMessage(\"base {}: {:.1f}\", mystat, unit->GetCreateStat(Stats(i));\n+        float totalstat = unit->GetTotalStatValue(Stats(i));\n+        //ch.PSendSysMessage(\"base total {}: {:.1f}\", mystat, totalstat);\n+        if (unit == me)\n+        {\n+            BotStatMods t = MAX_BOT_ITEM_MOD;\n+            switch (i)\n+            {\n+                case STAT_STRENGTH:     t = BOT_STAT_MOD_STRENGTH;  break;\n+                case STAT_AGILITY:      t = BOT_STAT_MOD_AGILITY;   break;\n+                case STAT_STAMINA:      t = BOT_STAT_MOD_STAMINA;   break;\n+                case STAT_INTELLECT:    t = BOT_STAT_MOD_INTELLECT; break;\n+                case STAT_SPIRIT:       t = BOT_STAT_MOD_SPIRIT;    break;\n+                default:                                            break;\n+            }\n+\n+            if (t < MAX_BOT_ITEM_MOD)\n+                totalstat = GetTotalBotStat(t);\n+        }\n+        botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_TOTAL) << \" \" << mystat << \": \" << float(totalstat);\n+    }\n+    botstring.precision(2);\n+    botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_MELEE_AP) << \": \" << int32(unit->GetTotalAttackPowerValue(BASE_ATTACK));\n+    botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_RANGED_AP) << \": \" << int32(unit->GetTotalAttackPowerValue(RANGED_ATTACK));\n+    botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_ARMOR) << \": \" << uint32(unit->GetArmor());\n+    botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_CRIT) << \": \" << float(unit->GetUnitCriticalChance(BASE_ATTACK, me));\n+    botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_DEFENSE) << \": \" << uint32(unit->GetDefenseSkillValue());\n+    botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_MISS) << \": \" << float(unit->GetUnitMissChance(BASE_ATTACK));\n+    botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_DODGE) << \": \" << float(unit->GetUnitDodgeChance());\n+    botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_PARRY) << \": \" << float(unit->GetUnitParryChance());\n+    botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_BLOCK) << \": \" << float(unit->GetUnitBlockChance());\n+    botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_BLOCKVALUE) << \": \" << uint32(unit->GetShieldBlockValue());\n+    botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_DMG_TAKEN_MELEE) << \": \" << float(dmg_taken_phy * unit->GetTotalAuraMultiplierByMiscMask(SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, SPELL_SCHOOL_MASK_NORMAL));\n+    botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_DMG_TAKEN_SPELL) << \": \" << float(dmg_taken_mag * unit->GetTotalAuraMultiplierByMiscMask(SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, SPELL_SCHOOL_MASK_MAGIC));\n+\n+    //float resilience_base = unit->GetMeleeCritChanceReduction();\n+    //botstring << \"\\n\" << \"Resilience pct\" << \": -\" << resilience_base << \" / -\" << float(resilience_base * 2.2f) << \" / -\" << float(resilience_base * 2.0f);\n+\n+    WeaponAttackType type = BASE_ATTACK;\n+    float attSpeed = (unit->GetAttackTime(type) * unit->m_modAttackSpeedPct[type])/1000.f;\n+    botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_DMG_RANGE_MAINHAND) << \": \" << LocalizedNpcText(player, BOT_TEXT_MIN) << \": \" << int32(unit->GetFloatValue(UNIT_FIELD_MINDAMAGE)) << \", \" << LocalizedNpcText(player, BOT_TEXT_MAX) << \": \" << int32(unit->GetFloatValue(UNIT_FIELD_MAXDAMAGE) + 1.f);\n+    botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_DMG_MULT_MAINHAND) << \": \" << float(unit->GetPctModifierValue(UNIT_MOD_DAMAGE_MAINHAND, BASE_PCT)*unit->GetPctModifierValue(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_PCT));\n+    botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_ATTACK_TIME_MAINHAND) << \": \" << float(attSpeed)\n+        << \" (\" << float(((unit->GetFloatValue(UNIT_FIELD_MINDAMAGE) + unit->GetFloatValue(UNIT_FIELD_MAXDAMAGE)) / 2) / attSpeed) << \" \" << LocalizedNpcText(player, BOT_TEXT_DPS) << \")\";\n+    if (unit->haveOffhandWeapon())\n+    {\n+        type = OFF_ATTACK;\n+        attSpeed = (unit->GetAttackTime(type) * unit->m_modAttackSpeedPct[type])/1000.f;\n+        botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_DMG_RANGE_OFFHAND) << \": \" << LocalizedNpcText(player, BOT_TEXT_MIN) << \": \" << int32(unit->GetFloatValue(UNIT_FIELD_MINOFFHANDDAMAGE)) << \", \" << LocalizedNpcText(player, BOT_TEXT_MAX) << \": \" << int32(unit->GetFloatValue(UNIT_FIELD_MAXOFFHANDDAMAGE) + 1.f);\n+        botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_DMG_MULT_OFFHAND) << \": \" << float(unit->GetPctModifierValue(UNIT_MOD_DAMAGE_OFFHAND, BASE_PCT)*unit->GetPctModifierValue(UNIT_MOD_DAMAGE_OFFHAND, TOTAL_PCT));\n+        botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_ATTACK_TIME_OFFHAND) << \": \" << float(attSpeed)\n+            << \" (\" << float(((unit->GetFloatValue(UNIT_FIELD_MINOFFHANDDAMAGE) + unit->GetFloatValue(UNIT_FIELD_MAXOFFHANDDAMAGE)) / 2) / attSpeed) << \" \" << LocalizedNpcText(player, BOT_TEXT_DPS) << \")\";\n+    }\n+    if (unit != me ||\n+        (me->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + uint32(BOT_SLOT_RANGED)) &&\n+        _botclass != BOT_CLASS_PALADIN &&\n+        _botclass != BOT_CLASS_DEATH_KNIGHT &&\n+        _botclass != BOT_CLASS_DRUID &&\n+        _botclass != BOT_CLASS_SHAMAN))\n+    {\n+        type = RANGED_ATTACK;\n+        attSpeed = (unit->GetAttackTime(type) * unit->m_modAttackSpeedPct[type])/1000.f;\n+        botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_DMG_RANGE_RANGED) << \": \" << LocalizedNpcText(player, BOT_TEXT_MIN) << \": \" << int32(unit->GetFloatValue(UNIT_FIELD_MINRANGEDDAMAGE)) << \", \" << LocalizedNpcText(player, BOT_TEXT_MAX) << \": \" << int32(unit->GetFloatValue(UNIT_FIELD_MAXRANGEDDAMAGE) + 1.f);\n+        botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_DMG_MULT_RANGED) << \": \" << float(unit->GetPctModifierValue(UNIT_MOD_DAMAGE_RANGED, BASE_PCT)*unit->GetPctModifierValue(UNIT_MOD_DAMAGE_RANGED, TOTAL_PCT));\n+        botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_ATTACK_TIME_RANGED) << \": \" << float(attSpeed)\n+            << \" (\" << float(((unit->GetFloatValue(UNIT_FIELD_MINRANGEDDAMAGE) + unit->GetFloatValue(UNIT_FIELD_MAXRANGEDDAMAGE)) / 2) / attSpeed) << \" \" << LocalizedNpcText(player, BOT_TEXT_DPS) << \")\";\n+    }\n+    botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_BASE_HP) << \": \" << int32(unit->GetCreateHealth());\n+    botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_TOTAL_HP) << \": \" << int32(unit->GetMaxHealth());\n+    botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_BASE_MP) << \": \" << int32(unit->GetCreateMana());\n+    botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_TOTAL_MP) << \": \" << int32(unit->GetMaxPower(POWER_MANA));\n+    if (unit->GetMaxPower(POWER_MANA) > 1 && unit->GetPowerType() != POWER_MANA)\n+        botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_CURR_MP) << \": \" << int32(unit->GetPower(POWER_MANA));\n+\n+    if (unit == me)\n+    {\n+        botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_SPELLPOWER) << \": \" << int32(me->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_MAGIC));\n+        botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_REGEN_HP) << \": \" << int32(_getTotalBotStat(BOT_STAT_MOD_HEALTH_REGEN));\n+        if (me->GetMaxPower(POWER_MANA) > 1)\n+        {\n+            botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_REGEN_MP_CAST) << \": \" << float((_botclass == BOT_CLASS_SPHYNX ? -1.f : 1.f) * me->GetFloatValue(UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER) * sWorld->getRate(RATE_POWER_MANA) * 5.0f);\n+            botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_REGEN_MP_NOCAST) << \": \" << float((_botclass == BOT_CLASS_SPHYNX ? -1.f : 1.f) * me->GetFloatValue(UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER) * sWorld->getRate(RATE_POWER_MANA) * 5.0f);\n+        }\n+        int32 bot_expertise = expertise + me->GetTotalAuraModifier(SPELL_AURA_MOD_EXPERTISE);\n+        botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_HASTE) << \": \" << (haste >= 0 ? \"+\" : \"-\") << float(haste) << \" \" << LocalizedNpcText(player, BOT_TEXT_PCT);\n+        botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_HIT) << \": +\" << float(hit) << \" \" << LocalizedNpcText(player, BOT_TEXT_PCT);\n+        botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_EXPERTISE) << \": \" << int32(bot_expertise) << \" (-\" << float(float(bot_expertise) * 0.25f) << \" \" << LocalizedNpcText(player, BOT_TEXT_PCT) << \")\";\n+        botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_ARMOR_PEN) << \": \" << float(me->GetCreatureArmorPenetrationCoef()) << \" \" << LocalizedNpcText(player, BOT_TEXT_PCT);\n+        botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_SPELL_PEN) << \": \" << uint32(spellpen) + uint32(std::abs(me->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_TARGET_RESISTANCE, SPELL_SCHOOL_MASK_MAGIC)));\n+\n+        for (uint8 i = SPELL_SCHOOL_HOLY; i != MAX_SPELL_SCHOOL; ++i)\n+        {\n+            uint32 curresist = me->GetResistance(SpellSchools(i)) + resistbonus[i-1];\n+\n+            std::string resist;\n+            switch (i)\n+            {\n+                case 1: resist = LocalizedNpcText(player, BOT_TEXT_HOLY);   break;\n+                case 2: resist = LocalizedNpcText(player, BOT_TEXT_FIRE);   break;\n+                case 3: resist = LocalizedNpcText(player, BOT_TEXT_NATURE); break;\n+                case 4: resist = LocalizedNpcText(player, BOT_TEXT_FROST);  break;\n+                case 5: resist = LocalizedNpcText(player, BOT_TEXT_SHADOW); break;\n+                case 6: resist = LocalizedNpcText(player, BOT_TEXT_ARCANE); break;\n+            }\n+            botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_RESISTANCE) << \": \" << resist << \": \" << uint32(curresist);\n+        }\n+\n+        auto scores = GetBotGearScores();\n+        botstring << \"\\nGear score total: \" << scores.first << \", avg: \" << scores.second;\n+\n+        botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_COMMAND_STATES) << \"(\" << GetBotCommandState() << \"):\";\n+        if (HasBotCommandState(BOT_COMMAND_FOLLOW))\n+            botstring << \" \" << LocalizedNpcText(player, BOT_TEXT_COMMAND_FOLLOW);\n+        if (HasBotCommandState(BOT_COMMAND_ATTACK))\n+            botstring << \" \" << LocalizedNpcText(player, BOT_TEXT_COMMAND_ATTACK);\n+        if (HasBotCommandState(BOT_COMMAND_STAY))\n+            botstring << \" \" << LocalizedNpcText(player, BOT_TEXT_COMMAND_STAY);\n+        if (HasBotCommandState(BOT_COMMAND_COMBATRESET))\n+            botstring << \" \" << LocalizedNpcText(player, BOT_TEXT_COMMAND_RESET);\n+        if (HasBotCommandState(BOT_COMMAND_FULLSTOP))\n+            botstring << \" \" << LocalizedNpcText(player, BOT_TEXT_COMMAND_FULLSTOP);\n+        if (!IAmFree())\n+            botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_FOLLOW_DISTANCE) << \": \" << uint32(master->GetBotMgr()->GetBotFollowDist());\n+\n+        if (_botclass < BOT_CLASS_EX_START)\n+            botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_SPEC) << \": \" << uint32(_spec);\n+\n+        if (IsWanderer())\n+            botstring << \"\\n_baseLevel: \" << uint32(_baseLevel);\n+\n+        botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_BOT_ROLEMASK_MAIN) << \": \" << uint32(_roleMask & BOT_ROLE_MASK_MAIN);\n+        botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_BOT_ROLEMASK_GATHERING) << \": \" << uint32(_roleMask & BOT_ROLE_MASK_GATHERING);\n+\n+        botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_PVP_KILLS) << \": \" << uint32(_pvpKillsCount) << \", \" << LocalizedNpcText(player, BOT_TEXT_PLAYERS) << \": \" << uint32(_playerKillsCount) << \", \" << LocalizedNpcText(player, BOT_TEXT_TOTAL) << \": \" << uint32(_killsCount);\n+        botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_DIED_) << uint32(_deathsCount) << LocalizedNpcText(player, BOT_TEXT__TIMES);\n+\n+        //debug\n+        botstring << \"\\n_lastWMOAreaId: \" << uint32(_lastWMOAreaId);\n+        botstring << \"\\nGCD: \" << uint32(GC_Timer);\n+        //botstring << \"\\nPotion CD: \" << uint32(_potionTimer);\n+        //botstring << \"\\ncurrent Engage timer: \" << GetEngageTimer();\n+        //for (uint32 i = 0; i != 148; ++i)\n+        //{\n+        //    float val = me->GetFloatValue(i);\n+        //    ch.PSendSysMessage(\"Float value at {}: {:.9f}\", i, val);\n+        //}\n+\n+        //ch.PSendSysMessage(\"healTargetIconFlags: {}\", healTargetIconFlags);\n+\n+        //ch.PSendSysMessage(\"Roles:\");\n+        //for (uint32 i = BOT_MAX_ROLE; i != BOT_ROLE_NONE; i >>= 1)\n+        //{\n+        //    if (_roleMask & i)\n+        //    {\n+        //        switch (i)\n+        //        {\n+        //            case BOT_ROLE_TANK:\n+        //                ch.PSendSysMessage(\"BOT_ROLE_TANK\");\n+        //                break;\n+        //            case BOT_ROLE_DPS:\n+        //                ch.PSendSysMessage(\"BOT_ROLE_DPS\");\n+        //                break;\n+        //            case BOT_ROLE_HEAL:\n+        //                ch.PSendSysMessage(\"BOT_ROLE_HEAL\");\n+        //                break;\n+        //            //case BOT_ROLE_MELEE:\n+        //            //    ch.PSendSysMessage(\"BOT_ROLE_MELEE\");\n+        //            //    break;\n+        //            case BOT_ROLE_RANGED:\n+        //                ch.PSendSysMessage(\"BOT_ROLE_RANGED\");\n+        //                break;\n+        //        }\n+        //    }\n+        //}\n+\n+        //ch.PSendSysMessage(\"Stat bonuses:\");\n+        //for (uint8 i = 0; i != MAX_BOT_ITEM_MOD; ++i)\n+        //{\n+        //    int32 val = 0;\n+        //    uint32 const a = i;\n+        //    for (uint8 j = 0; j != BOT_INVENTORY_SIZE; ++j)\n+        //        val += static_cast<BotStat>(_stats[j])[a];\n+\n+        //    if (val != 0)\n+        //        ch.PSendSysMessage(\"Item mod {}: bonus = {}\", i, val);\n+        //}\n+    }\n+\n+    ch.SendSysMessage(botstring.view());\n+}\n+//SetStats\n+// Health, Armor, Powers, Combat Ratings, and global update setup\n+void bot_ai::SetStats(bool force)\n+{\n+    if (IsTempBot() && !force)\n+        return;\n+\n+    shouldUpdateStats = false;\n+\n+    uint8 myclass = _botclass;\n+    if (myclass == BOT_CLASS_DRUID && GetBotStance() != BOT_STANCE_NONE)\n+        myclass = GetBotStance();\n+\n+    uint8 mylevel = std::min<uint8>(master->GetLevel(), DEFAULT_MAX_LEVEL);\n+    if (IsWanderer())\n+    {\n+        if (_baseLevel == 0) //this only happens once\n+        {\n+            mylevel = urand(me->GetCreatureTemplate()->minlevel, me->GetCreatureTemplate()->maxlevel);\n+            mylevel += BotDataMgr::GetLevelBonusForBotRank(me->GetCreatureTemplate()->rank);\n+            _baseLevel = std::max<uint8>(mylevel, BotDataMgr::GetMinLevelForBotClass(_botclass));\n+            if (me->GetMap()->IsBattlegroundOrArena())\n+                BOT_LOG_DEBUG(\"npcbots\", \"BG bot {} id {} selected level {}...\", me->GetName().c_str(), me->GetEntry(), uint32(_baseLevel));\n+            else\n+                BOT_LOG_DEBUG(\"npcbots\", \"Wandering bot {} id {} selected level {}...\", me->GetName().c_str(), me->GetEntry(), uint32(_baseLevel));\n+        }\n+        else if (me->GetMap()->GetEntry()->IsContinent())\n+        {\n+            uint8 mapmaxlevel = BotDataMgr::GetMaxLevelForMapId(me->GetMap()->GetEntry()->MapID);\n+            mapmaxlevel += BotDataMgr::GetLevelBonusForBotRank(me->GetCreatureTemplate()->rank);\n+            //TODO: experience system for levelups\n+            mylevel = std::max<uint8>(mylevel, std::min<uint8>(_baseLevel + uint8(uint32(float(_killsCount) * BotCfg::GetBotWandererXPGainMod()) / (mylevel * 20)), mapmaxlevel));\n+        }\n+    }\n+    else\n+        mylevel += BotDataMgr::GetLevelBonusForBotRank(me->GetCreatureTemplate()->rank);\n+\n+    mylevel = std::min<uint8>(mylevel, DEFAULT_MAX_LEVEL + 3);\n+\n+    //Do not remove this code\n+    mylevel = std::max<uint8>(mylevel, BotDataMgr::GetMinLevelForBotClass(_botclass));\n+\n+    //LEVEL\n+    if (me->GetLevel() != mylevel)\n+    {\n+        if (me->GetLevel() > mylevel)\n+            UnsummonAll(false);\n+\n+        me->SetLevel(mylevel);\n+        force = true; //reinit spells/passives/other\n+    }\n+    if (force)\n+    {\n+        InitPowers();\n+        InitSpells(); //this must stay before class passives\n+        ApplyClassPassives();\n+\n+        PlayerLevelInfo info;\n+        sObjectMgr->GetPlayerLevelInfo(GetPlayerRace(), GetPlayerClass(), std::min<uint8>(mylevel, DEFAULT_MAX_LEVEL), &info);\n+        for (auto i : NPCBots::index_array<uint8, MAX_STATS>)\n+            me->SetCreateStat(Stats(i), info.stats[i]);\n+    }\n+\n+    switch (myclass)\n+    {\n+        case BOT_CLASS_WARRIOR:\n+        case BOT_CLASS_DEATH_KNIGHT:\n+        case BOT_CLASS_PALADIN:\n+        case BOT_CLASS_ROGUE:\n+        case BOT_CLASS_HUNTER:\n+        case BOT_CLASS_SHAMAN:\n+        case BOT_CLASS_DRUID:\n+        case BOT_CLASS_MAGE:\n+        case BOT_CLASS_PRIEST:\n+        case BOT_CLASS_WARLOCK:\n+        case DRUID_BEAR_FORM:\n+        case DRUID_CAT_FORM:\n+        case DRUID_MOONKIN_FORM:\n+        case DRUID_TREE_FORM:\n+        case DRUID_TRAVEL_FORM:\n+        case DRUID_AQUATIC_FORM:\n+        case DRUID_FLIGHT_FORM:\n+        case BOT_CLASS_BM:\n+        case BOT_CLASS_SPHYNX:\n+        case BOT_CLASS_ARCHMAGE:\n+        case BOT_CLASS_DREADLORD:\n+        case BOT_CLASS_SPELLBREAKER:\n+        case BOT_CLASS_DARK_RANGER:\n+        case BOT_CLASS_NECROMANCER:\n+        case BOT_CLASS_SEA_WITCH:\n+        case BOT_CLASS_CRYPT_LORD:\n+            break;\n+\n+        default:\n+            BOT_LOG_ERROR(\"entities.player\", \"minion_ai: *etStats():Init - unknown bot class {}, real class: {}, _botclass: {}\", myclass, GetPlayerClass(), _botclass);\n+            break;\n+    }\n+\n+    float value;\n+    float tempval;\n+    float ap_mod = 1.0f, armor_mod = 1.0f;\n+\n+    //DAMAGE PHYSICAL\n+    for (auto i : NPCBots::index_array<uint8, MAX_EQUIPMENT_ITEMS>)\n+    {\n+        float weap_damage_base_min = _getBotStat(i, BOT_STAT_MOD_DAMAGE_MIN);\n+        float weap_damage_base_max = _getBotStat(i, BOT_STAT_MOD_DAMAGE_MAX);\n+        me->SetBaseWeaponDamage(WeaponAttackType(BASE_ATTACK + i), MINDAMAGE, std::max<float>(weap_damage_base_min, 1.f));\n+        me->SetBaseWeaponDamage(WeaponAttackType(BASE_ATTACK + i), MAXDAMAGE, std::max<float>(weap_damage_base_max, 1.f));\n+    }\n+\n+    //Update Attack Time on main hand for shapeshifters\n+    //do not add me->GetShapeshiftForm() check here, need to change attack time after shapeshift removal too\n+    if (_botclass == BOT_CLASS_DRUID && RespectEquipsAttackTime())\n+    {\n+        uint32 delay;\n+        SpellShapeshiftFormEntry const* ssEntry = sSpellShapeshiftFormStore.LookupEntry(me->GetShapeshiftForm());\n+        if (!ssEntry || !ssEntry->attackSpeed)\n+            delay = _equips[BOT_SLOT_MAINHAND] ? _equips[BOT_SLOT_MAINHAND]->GetTemplate()->Delay : me->GetCreatureTemplate()->BaseAttackTime;\n+        else\n+            delay = ssEntry->attackSpeed;\n+\n+        me->SetAttackTime(BASE_ATTACK, delay);\n+    }\n+\n+    float atpower = float(me->GetLevel() * (/*IAmFree() ? 100 : */3)); //+8000/+240(legit) base ap at 80\n+    atpower += _getTotalBotStat(BOT_STAT_MOD_ATTACK_POWER);\n+\n+    float strmult, agimult;\n+    switch (myclass)\n+    {\n+        case BOT_CLASS_WARRIOR:\n+        case BOT_CLASS_PALADIN:\n+        case BOT_CLASS_DEATH_KNIGHT:\n+        case BOT_CLASS_DRUID:\n+            strmult = 2.f; agimult = 0.f; break;\n+        case BOT_CLASS_ROGUE:\n+        case BOT_CLASS_SHAMAN:\n+            strmult = 1.f; agimult = 1.f; break;\n+        case BOT_CLASS_HUNTER:\n+            strmult = 0.5f; agimult = 1.f;break; //until attack power is separated\n+        case BOT_CLASS_PRIEST:\n+        case BOT_CLASS_MAGE:\n+        case BOT_CLASS_WARLOCK:\n+            strmult = 1.f; agimult = 0.f; break;\n+        case DRUID_CAT_FORM:\n+            strmult = 2.f; agimult = 1.f; break;\n+        case DRUID_BEAR_FORM:\n+        case DRUID_MOONKIN_FORM:\n+        case DRUID_TREE_FORM:\n+        case DRUID_TRAVEL_FORM:\n+        case DRUID_AQUATIC_FORM:\n+        case DRUID_FLIGHT_FORM:\n+            strmult = 2.f; agimult = 0.f; break;\n+        case BOT_CLASS_BM:\n+            strmult = 0.f; agimult = 9.f; break;\n+        case BOT_CLASS_SPHYNX:\n+            strmult = 2.f; agimult = 0.f; break;\n+        case BOT_CLASS_ARCHMAGE:\n+            strmult = 0.f; agimult = 0.f; break;\n+        case BOT_CLASS_DREADLORD:\n+            strmult = 8.f; agimult = 0.f; break;\n+        case BOT_CLASS_SPELLBREAKER:\n+            strmult = 5.f; agimult = 0.f; break;\n+        case BOT_CLASS_DARK_RANGER:\n+            strmult = 0.f; agimult = 4.f; break;\n+        case BOT_CLASS_NECROMANCER:\n+            strmult = 0.f; agimult = 0.f; break;\n+        case BOT_CLASS_SEA_WITCH:\n+            strmult = 0.f; agimult = 2.f; break;\n+        case BOT_CLASS_CRYPT_LORD:\n+            strmult = 9.f; agimult = 0.f; break;\n+        default:\n+            BOT_LOG_ERROR(\"entities.player\", \"_MeleeDamageUpdate(): NIY myclass {}!\", uint32(myclass));\n+            strmult = 0.f; agimult = 0.f; break;\n+    }\n+\n+    atpower += (strmult != 0x0) ? strmult * _getTotalBotStat(BOT_STAT_MOD_STRENGTH) : 0.f;\n+    atpower += (agimult != 0x0) ? agimult * _getTotalBotStat(BOT_STAT_MOD_AGILITY) : 0.f;\n+\n+    //hunter Expose Weakness checked\n+    for (AuraEffect const* aeff : me->GetAuraEffectsByType(SPELL_AURA_MOD_ATTACK_POWER_OF_STAT_PERCENT))\n+        atpower += CalculatePct(me->GetStat(Stats(aeff->GetMiscValue())), aeff->GetAmount());\n+\n+    atpower += me->GetTotalAuraModifier(SPELL_AURA_MOD_ATTACK_POWER_OF_ARMOR);\n+\n+    //Unit::AuraEffectList const& mAPbyArmor = me->GetAuraEffectsByType(SPELL_AURA_MOD_ATTACK_POWER_OF_ARMOR);\n+    //for (Unit::AuraEffectList::const_iterator iter = mAPbyArmor.begin(); iter != mAPbyArmor.end(); ++iter)\n+    //    atpower += int32(me->GetArmor() / (*iter)->GetAmount());\n+\n+    //Handle mods\n+    if (_botclass == BOT_CLASS_DRUID)\n+    {\n+        //Heart of the Wild part 3\n+        if (mylevel >= 35 && myclass == DRUID_CAT_FORM && GetSpec() == BOT_SPEC_DRUID_FERAL)\n+            ap_mod *= 1.1f;\n+        //Protector of the Pack part 2\n+        if (mylevel >= 45 && myclass == DRUID_BEAR_FORM && GetSpec() == BOT_SPEC_DRUID_FERAL)\n+            ap_mod *= 1.06f;\n+    }\n+    if (_botclass == BOT_CLASS_ROGUE)\n+    {\n+        //Deadliness\n+        if (mylevel >= 35 && GetSpec() == BOT_SPEC_ROGUE_SUBTLETY)\n+            ap_mod *= 1.1f;\n+        //Savage Combat\n+        if (mylevel >= 50 && GetSpec() == BOT_SPEC_ROGUE_COMBAT)\n+            ap_mod *= 1.04f;\n+    }\n+    //from stats mods\n+    if (myclass == DRUID_BEAR_FORM || myclass == DRUID_CAT_FORM)\n+    {\n+        atpower += _getTotalBotStat(BOT_STAT_MOD_FERAL_ATTACK_POWER);\n+        //Predatory Strikes\n+        if (me->GetLevel() >= 25)\n+        {\n+            uint8 slot = BOT_SLOT_MAINHAND;\n+            atpower += 1.5f * me->GetLevel();\n+            atpower += 0.2f * (\n+                _getBotStat(slot, BOT_STAT_MOD_FERAL_ATTACK_POWER)\n+                + _getBotStat(slot, BOT_STAT_MOD_ATTACK_POWER)\n+                //+ _getBotStat(slot, BOT_STAT_MOD_RANGED_ATTACK_POWER)\n+                );\n+        }\n+    }\n+    if (_botclass == BOT_CLASS_HUNTER)\n+    {\n+        //Careful Aim\n+        if (me->GetLevel() >= 15)\n+            atpower += _getTotalBotStat(BOT_STAT_MOD_INTELLECT);\n+        //Hunter vs. Wild\n+        if (me->GetLevel() >= 30 && GetSpec() == BOT_SPEC_HUNTER_SURVIVAL)\n+            atpower += 0.3f * _getTotalBotStat(BOT_STAT_MOD_STAMINA);\n+    }\n+    if (_botclass == BOT_CLASS_SHAMAN)\n+    {\n+        //Mental Dexterity\n+        if (me->GetLevel() >= 30 && GetSpec() == BOT_SPEC_SHAMAN_ENHANCEMENT)\n+            atpower += _getTotalBotStat(BOT_STAT_MOD_INTELLECT);\n+    }\n+    if (_botclass == BOT_CLASS_DARK_RANGER)\n+    {\n+        atpower += 2.f * _getTotalBotStat(BOT_STAT_MOD_INTELLECT);\n+        if (me->GetLevel() >= 60)\n+            ap_mod *= 1.15f;\n+    }\n+    if (_botclass == BOT_CLASS_SEA_WITCH)\n+    {\n+        if (me->GetLevel() >= 20)\n+            atpower += 2.f * _getTotalBotStat(BOT_STAT_MOD_INTELLECT);\n+        else if (me->GetLevel() >= 10)\n+            atpower += 1.f * _getTotalBotStat(BOT_STAT_MOD_INTELLECT);\n+    }\n+\n+    atpower *= ap_mod;\n+    me->SetStatFlatModifier(UNIT_MOD_ATTACK_POWER, BASE_VALUE, atpower);\n+\n+    me->UpdateAttackPowerAndDamage();\n+    if (_botclass == BOT_CLASS_WARRIOR || _botclass == BOT_CLASS_HUNTER || _botclass == BOT_CLASS_ROGUE ||\n+        _botclass == BOT_CLASS_MAGE || _botclass == BOT_CLASS_PRIEST || _botclass == BOT_CLASS_WARLOCK ||\n+        _botclass == BOT_CLASS_DARK_RANGER || _botclass == BOT_CLASS_SEA_WITCH)\n+    {\n+        atpower += _getTotalBotStat(BOT_STAT_MOD_RANGED_ATTACK_POWER) * ap_mod;\n+        me->SetStatFlatModifier(UNIT_MOD_ATTACK_POWER_RANGED, BASE_VALUE, atpower);\n+        me->UpdateAttackPowerAndDamage(true);\n+    }\n+\n+    //ARMOR\n+    //value = IAmFree() ? 0 : me->GetLevel() * 10; //0/800 at 80\n+    value = 2.f * _getTotalBotStat(BOT_STAT_MOD_AGILITY);\n+    value += _getTotalBotStat(BOT_STAT_MOD_ARMOR);\n+\n+    if (mylevel >= 10)\n+    {\n+        //Toughness\n+        if (mylevel >= 20 && (_botclass == BOT_CLASS_WARRIOR || _botclass == BOT_CLASS_PALADIN || _botclass == BOT_CLASS_DEATH_KNIGHT))\n+            armor_mod += 0.1f;\n+        //Frost Presence\n+        //if (GetBotStance() == DEATH_KNIGHT_FROST_PRESENCE)\n+        //    armor_mod += 0.6f;\n+        if (_botclass == BOT_CLASS_DRUID)\n+        {\n+            //Thick Hide\n+            if (mylevel >= 15)\n+                armor_mod += 0.1f;\n+            ////Survival of the Fittest\n+            //if (myclass == DRUID_BEAR_FORM)\n+            //    armor_mod += (GetSpec() == BOT_SPEC_DRUID_FERAL ? 0.33f : 0.0f) + (me->GetShapeshiftForm() == FORM_BEAR ? 1.8f : 3.7f);\n+            ////Moonkin Form innate\n+            //else if (myclass == DRUID_MOONKIN_FORM)\n+            //    armor_mod += 3.7f;\n+            ////Improved Tree Form\n+            //else if (myclass == DRUID_TREE_FORM)\n+            //    armor_mod += 2.0f;\n+            //Improved Barkskin\n+            //else if (myclass == DRUID_TRAVEL_FORM || GetBotStance() == BOT_STANCE_NONE)\n+            //    armor_mod += 1.6f;\n+        }\n+        if (_botclass == BOT_CLASS_HUNTER)\n+        {\n+            //Thick Hide\n+            if (mylevel >= 15)\n+                armor_mod += 0.1f;\n+        }\n+        if (_botclass == BOT_CLASS_MAGE)\n+        {\n+            //Arcane Fortitude\n+            if (mylevel >= 15)\n+                value += 1.5f * _getTotalBotStat(BOT_STAT_MOD_INTELLECT);\n+        }\n+        if (_botclass == BOT_CLASS_SPHYNX)\n+        {\n+            value += 5.f * _getTotalBotStat(BOT_STAT_MOD_INTELLECT);\n+            armor_mod += 0.5f;\n+        }\n+        if (_botclass == BOT_CLASS_ARCHMAGE)\n+        {\n+            value += 5.f * _getTotalBotStat(BOT_STAT_MOD_INTELLECT);\n+        }\n+        if (_botclass == BOT_CLASS_DREADLORD)\n+        {\n+            armor_mod += 0.5f;\n+        }\n+        if (_botclass == BOT_CLASS_SPELLBREAKER)\n+        {\n+            armor_mod += -0.3f; // reduce armor so cannot really tank\n+        }\n+        if (_botclass == BOT_CLASS_NECROMANCER)\n+        {\n+            value += 5.f * _getTotalBotStat(BOT_STAT_MOD_INTELLECT);\n+        }\n+        if (_botclass == BOT_CLASS_CRYPT_LORD)\n+        {\n+            armor_mod += mylevel >= 60 ? 1.0f : mylevel >= 40 ? 0.5f : mylevel >= 20 ? 0.25f : 0.125f;\n+        }\n+    }\n+\n+    value *= armor_mod;\n+    //Druid armor mods should not affect armor from weapons\n+    if (_botclass == BOT_CLASS_DRUID && _stats[BOT_SLOT_MAINHAND][BOT_STAT_MOD_ARMOR] != 0 && armor_mod > 1.f)\n+        value -= _stats[BOT_SLOT_MAINHAND][BOT_STAT_MOD_ARMOR] * (armor_mod - 1.f);\n+    me->SetStatFlatModifier(UNIT_MOD_ARMOR, BASE_VALUE, value);\n+    me->UpdateArmor(); //buffs will be processed here\n+\n+    //RESISTANCES\n+    //Do not store resistance bonuses directly lest we want calcs screwed up\n+    for (uint8 i = SPELL_SCHOOL_HOLY; i != MAX_SPELL_SCHOOL; ++i)\n+    {\n+        value = IAmFree() ? 0 : (GetBG() && GetBG()->isArena()) ? 0 : mylevel;\n+        value += _getTotalBotStat(BotStatMods(BOT_STAT_MOD_RESIST_HOLY + (i - 1)));\n+\n+        //res bonuses\n+        if (_botclass == BOT_CLASS_SPHYNX)\n+            value += mylevel * 5; //total 498 at 83\n+        if (_botclass == BOT_CLASS_DREADLORD)\n+            value += mylevel * 3; //total 332 at 83\n+        if (_botclass == BOT_CLASS_DARK_RANGER || _botclass == BOT_CLASS_SEA_WITCH || _botclass == BOT_CLASS_CRYPT_LORD)\n+            value += mylevel * 2; //total 249 at 83\n+\n+        resistbonus[i-1] = int32(value);\n+        //me->UpdateResistances(i);\n+    }\n+\n+    //DAMAGE TAKEN\n+    value = 1.0f;\n+    tempval = 1.0f;\n+\n+    //class-specified\n+    //Protector of the Pack part 1\n+    if (myclass == DRUID_BEAR_FORM && mylevel >= 45)\n+    {\n+        value -= 0.12f;\n+        tempval -= 0.12f;\n+    }\n+    //Deadened Nerves\n+    if (_botclass == BOT_CLASS_ROGUE && mylevel >= 45 && GetSpec() == BOT_SPEC_ROGUE_ASSASINATION)\n+    {\n+        value -= 0.06f;\n+        tempval -= 0.06f;\n+    }\n+    //Survival Instincts\n+    if (_botclass == BOT_CLASS_HUNTER && mylevel >= 15)\n+    {\n+        value -= 0.04f;\n+        tempval -= 0.04f;\n+    }\n+    //Spell Warding\n+    if (_botclass == BOT_CLASS_PRIEST && mylevel >= 15)\n+        tempval -= 0.1f;\n+    //Elemental Warding\n+    if (_botclass == BOT_CLASS_SHAMAN && mylevel >= 15)\n+    {\n+        value -= 0.06f;\n+        tempval -= 0.06f;\n+    }\n+    if (_botclass == BOT_CLASS_DEATH_KNIGHT)\n+    {\n+        //Magic Suppression (everything)\n+        if (mylevel >= 60 && GetSpec() == BOT_SPEC_DK_UNHOLY)\n+            tempval -= 0.06f;\n+        //Improved Frost Presence\n+        if (mylevel >= 61 && GetBotStance() == DEATH_KNIGHT_FROST_PRESENCE && GetSpec() == BOT_SPEC_DK_FROST)\n+        {\n+            value -= 0.02f;\n+            tempval -= 0.02f;\n+        }\n+    }\n+    if (_botclass == BOT_CLASS_WARLOCK)\n+    {\n+        //Molten Skin\n+        if (mylevel >= 15)\n+        {\n+            value -= 0.06f;\n+            tempval -= 0.06f;\n+        }\n+        //Master Demonologist part 2, Master Demonologist part 4\n+        if (mylevel >= 35 && GetSpec() == BOT_SPEC_WARLOCK_DEMONOLOGY && botPet && botPet->IsAlive())\n+        {\n+            if (GetAIMiscValue(BOTAI_MISC_PET_TYPE) == BOT_PET_VOIDWALKER)\n+                value -= 0.1f;\n+            else if (GetAIMiscValue(BOTAI_MISC_PET_TYPE) == BOT_PET_FELHUNTER)\n+                tempval -= 0.1f;\n+        }\n+    }\n+    //Frozen Core (everything), Prismatic Cloak part 1\n+    if (_botclass == BOT_CLASS_MAGE)\n+    {\n+        if (mylevel >= 30 && GetSpec() == BOT_SPEC_MAGE_FROST)\n+            tempval -= 0.06f;\n+        else if (mylevel >= 35 && GetSpec() == BOT_SPEC_MAGE_ARCANE)\n+        {\n+            value -= 0.06f;\n+            tempval -= 0.06f;\n+        }\n+    }\n+    if (_botclass == BOT_CLASS_SPHYNX)\n+    {\n+        value -= 0.33f;\n+        tempval -= 0.33f;\n+    }\n+    if (_botclass == BOT_CLASS_ARCHMAGE)\n+    {\n+        value -= 0.1f;\n+        tempval -= 0.35f;\n+    }\n+    if (_botclass == BOT_CLASS_DREADLORD)\n+    {\n+        value -= 0.15f;\n+        tempval -= 0.2f;\n+    }\n+    if (_botclass == BOT_CLASS_SPELLBREAKER)\n+    {\n+        value -= 0.2f;\n+        tempval -= 0.75f;\n+    }\n+    if (_botclass == BOT_CLASS_DARK_RANGER)\n+    {\n+        tempval -= 0.35f;\n+    }\n+    if (_botclass == BOT_CLASS_NECROMANCER)\n+    {\n+        tempval -= 0.2f;\n+    }\n+    if (_botclass == BOT_CLASS_SEA_WITCH)\n+    {\n+        tempval -= 0.3f;\n+    }\n+    if (_botclass == BOT_CLASS_CRYPT_LORD)\n+    {\n+        value -= 0.3f;\n+        tempval -= 0.15f;\n+    }\n+\n+    dmg_taken_phy = value;\n+    dmg_taken_mag = tempval;\n+\n+    //RESILIENCE\n+    value = 0.f;\n+\n+    tempval = std::max<float>(_getTotalBotStat(BOT_STAT_MOD_CRIT_TAKEN_MELEE_RATING), std::max<float>(_getTotalBotStat(BOT_STAT_MOD_CRIT_TAKEN_RANGED_RATING), _getTotalBotStat(BOT_STAT_MOD_CRIT_TAKEN_SPELL_RATING)));\n+    tempval += me->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_RATING, (1u << CR_CRIT_TAKEN_MELEE) | (1u << CR_CRIT_TAKEN_RANGED) | (1u << CR_CRIT_TAKEN_SPELL));\n+    value += tempval * std::max<float>(_getRatingMultiplier(CR_CRIT_TAKEN_MELEE), std::max<float>(_getRatingMultiplier(CR_CRIT_TAKEN_RANGED), _getRatingMultiplier(CR_CRIT_TAKEN_SPELL)));\n+\n+    resilience = value;\n+\n+    //HEALTH\n+    _OnHealthUpdate();\n+\n+    //HASTE\n+    if (haste)\n+    {\n+        //unapply old haste\n+        for (auto att : NPCBots::index_array<uint8, MAX_ATTACK>)\n+            me->ApplyAttackTimePercentMod(WeaponAttackType(att), float(haste), false);\n+        me->ApplyCastTimePercentMod(float(haste), false);\n+    }\n+\n+    value = IAmFree() ? std::max<int32>(int32(mylevel) - 50, 0) : 0; // +30%/+0% haste at 80\n+\n+    //25.5 HR = 1% haste at 80\n+    tempval = _getTotalBotStat(BOT_STAT_MOD_HASTE_MELEE_RATING) + _getTotalBotStat(BOT_STAT_MOD_HASTE_RANGED_RATING) + _getTotalBotStat(BOT_STAT_MOD_HASTE_SPELL_RATING) + _getTotalBotStat(BOT_STAT_MOD_HASTE_RATING);\n+    tempval += me->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_RATING, (1u << CR_HASTE_MELEE) | (1u << CR_HASTE_RANGED) | (1u << CR_HASTE_SPELL));\n+\n+    if (_botclass == BOT_CLASS_WARLOCK)\n+    {\n+        //Spellstone: just emulate the rating bonus\n+        uint8 ratingBonus;\n+        if      (mylevel >= 78) ratingBonus = 60;\n+        else if (mylevel >= 72) ratingBonus = 50;\n+        else if (mylevel >= 66) ratingBonus = 40;\n+        else if (mylevel >= 60) ratingBonus = 30;\n+        else if (mylevel >= 48) ratingBonus = 20;\n+        else if (mylevel >= 36) ratingBonus = 10;\n+        else                    ratingBonus = 0;\n+\n+        //Master Conjuror\n+        if (mylevel >= 30 && GetSpec() == BOT_SPEC_WARLOCK_DEMONOLOGY)\n+            ratingBonus *= 4;\n+\n+        tempval += (float)ratingBonus;\n+    }\n+\n+    value += tempval * ((_botclass == BOT_CLASS_HUNTER || _botclass == BOT_CLASS_DARK_RANGER || _botclass == BOT_CLASS_SEA_WITCH) ?\n+        _getRatingMultiplier(CR_HASTE_RANGED) :\n+        std::max<float>(_getRatingMultiplier(CR_HASTE_MELEE), _getRatingMultiplier(CR_HASTE_SPELL)));\n+\n+    //class-specific\n+    if (_botclass == BOT_CLASS_HUNTER)\n+    {\n+        value += 15.f; //innate ranged haste bonus 15% for hunters (still applies to all haste types)\n+        //Serpent's Swiftness\n+        if (mylevel >= 45 && GetSpec() == BOT_SPEC_HUNTER_BEASTMASTERY)\n+            value += 20.f;\n+    }\n+    if (_botclass == BOT_CLASS_ROGUE)\n+    {\n+        //Lightning Reflexes part 2\n+        if (mylevel >= 25 && GetSpec() == BOT_SPEC_ROGUE_COMBAT)\n+            value += 10.f;\n+    }\n+    if (_botclass == BOT_CLASS_PRIEST)\n+    {\n+        //Enlightenment part 2\n+        if (mylevel >= 35 && GetSpec() == BOT_SPEC_PRIEST_DISCIPLINE)\n+            value += 6.f;\n+    }\n+    if (_botclass == BOT_CLASS_MAGE)\n+    {\n+        //Netherwind Presence\n+        if (mylevel >= 55 && GetSpec() == BOT_SPEC_MAGE_ARCANE)\n+            value += 6.f;\n+    }\n+    if (_botclass >= BOT_CLASS_EX_START)\n+    {\n+        float haste_per_lvl;\n+        switch (_botclass)\n+        {\n+            case BOT_CLASS_BM:\n+            case BOT_CLASS_DREADLORD:\n+                haste_per_lvl = 0.875f;\n+                break;\n+            case BOT_CLASS_ARCHMAGE:\n+            case BOT_CLASS_DARK_RANGER:\n+            case BOT_CLASS_SEA_WITCH:\n+                haste_per_lvl = 0.5f;\n+                break;\n+            case BOT_CLASS_CRYPT_LORD:\n+                haste_per_lvl = 0.35f;\n+                break;\n+            default:\n+                haste_per_lvl = 0.25f;\n+                break;\n+        }\n+        value += mylevel * haste_per_lvl;\n+    }\n+\n+    haste = int32(value);\n+\n+    if (haste)\n+    {\n+        //apply new haste (using truncated value - gonna need it for unapply on next SetStats)\n+        for (auto att : NPCBots::index_array<uint8, MAX_ATTACK>)\n+            me->ApplyAttackTimePercentMod(WeaponAttackType(att), float(haste), true);\n+        me->ApplyCastTimePercentMod(float(haste), true);\n+    }\n+\n+    //HIT\n+    if (CanMiss())\n+    {\n+        value = float(IAmFree() ? mylevel / 8 : 0); // +10%/+0% at 80\n+        //32.5 HR = 1% hit at 80\n+        tempval = _getTotalBotStat(BOT_STAT_MOD_HIT_MELEE_RATING) + _getTotalBotStat(BOT_STAT_MOD_HIT_RANGED_RATING) + _getTotalBotStat(BOT_STAT_MOD_HIT_SPELL_RATING) + _getTotalBotStat(BOT_STAT_MOD_HIT_RATING);\n+        tempval += me->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_RATING, (1u << CR_HIT_MELEE) | (1u << CR_HIT_RANGED) | (1u << CR_HIT_SPELL));\n+        value += tempval * (_botclass == BOT_CLASS_HUNTER ? _getRatingMultiplier(CR_HIT_RANGED) : std::max<float>(_getRatingMultiplier(CR_HIT_MELEE), _getRatingMultiplier(CR_HIT_SPELL)));\n+\n+        //class-specific\n+        //Precision\n+        if (_botclass == BOT_CLASS_ROGUE && mylevel >= 15)\n+            value += 5.f;\n+        //Enlightened Judgements part 2,3\n+        if (_botclass == BOT_CLASS_PALADIN && GetSpec() == BOT_SPEC_PALADIN_HOLY && mylevel >= 55)\n+            value += 4.f;\n+        //Virulence part 1, Nerves of Cold Steel part 1\n+        if (_botclass == BOT_CLASS_DEATH_KNIGHT)\n+            value += 3.f;\n+        //Dual Wield Specialization\n+        if (_botclass == BOT_CLASS_SHAMAN && mylevel >= 40 && me->haveOffhandWeapon())\n+            value += 6.f;\n+        //Precision\n+        if (_botclass == BOT_CLASS_WARRIOR && mylevel >= 30 && GetSpec() == BOT_SPEC_WARRIOR_FURY)\n+            value += 3.f;\n+        //Focused Aim\n+        if (_botclass == BOT_CLASS_HUNTER && mylevel >= 10)\n+            value += 3.f;\n+        //Shadow Focus part 1\n+        if (_botclass == BOT_CLASS_PRIEST && mylevel >= 15)\n+            value += 3.f;\n+        //Arcane Focus part 1, Precision part 2\n+        if (_botclass == BOT_CLASS_MAGE && mylevel >= 10)\n+            value += mylevel >= 15 ? 6.f : 3.f;\n+        //Suppression\n+        if (_botclass == BOT_CLASS_WARLOCK && mylevel >= 10)\n+            value += 3.f;\n+\n+        hit = value;\n+    }\n+    else\n+        hit = 100.0f;\n+\n+    //ARMOR PENETRATION\n+    value = float(IAmFree() ? 5 + mylevel / 4 : 0); // 25%/0% at 80\n+    //? APR = 1% armor ignored at 80\n+    tempval = _getTotalBotStat(BOT_STAT_MOD_ARMOR_PENETRATION_RATING);\n+    tempval += me->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_RATING, (1u << CR_ARMOR_PENETRATION));\n+    value += tempval * _getRatingMultiplier(CR_ARMOR_PENETRATION);\n+\n+    //class-specific\n+    //Blood Gorged\n+    if (_botclass == BOT_CLASS_DEATH_KNIGHT && mylevel >= 64 && GetSpec() == BOT_SPEC_DK_BLOOD)\n+        value += 10.f;\n+\n+    if (_botclass == BOT_CLASS_DARK_RANGER)\n+        value += 50.f;\n+\n+    armor_pen = value;\n+\n+    //EXPERTISE\n+    value = float(IAmFree() ? mylevel / 2 : 0); // -10%/-0% at 80\n+    //~8.0 ER = 1 expertise at 80\n+    tempval = _getTotalBotStat(BOT_STAT_MOD_EXPERTISE_RATING);\n+    tempval += me->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_RATING, (1u << CR_EXPERTISE));\n+    value += tempval * _getRatingMultiplier(CR_EXPERTISE);\n+\n+    //class-specific\n+    //Weapon Expertise\n+    if (mylevel >= 35 && _botclass == BOT_CLASS_ROGUE && GetSpec() == BOT_SPEC_ROGUE_COMBAT)\n+        value += 10.f;\n+    //Combat Expertise\n+    if (mylevel >= 45 && _botclass == BOT_CLASS_PALADIN && GetSpec() == BOT_SPEC_PALADIN_PROTECTION)\n+        value += 6.f;\n+    if (_botclass == BOT_CLASS_WARRIOR)\n+    {\n+        //Vitality: 6, Strength of Arms: 4\n+        if (mylevel >= 45 && GetSpec() == BOT_SPEC_WARRIOR_PROTECTION)\n+            value += 10.f;\n+        else if (mylevel >= 40 && GetSpec() == BOT_SPEC_WARRIOR_ARMS)\n+            value += 4.f;\n+    }\n+    if (_botclass == BOT_CLASS_DEATH_KNIGHT)\n+    {\n+        //Tundra Stalker, Rage of Rivendare: 5\n+        //Veteral of the Third War part 3: 6\n+        if (mylevel >= 64 && GetSpec() == BOT_SPEC_DK_FROST)\n+            value += 5.f;\n+        else if (mylevel >= 64 && GetSpec() == BOT_SPEC_DK_UNHOLY)\n+            value += 5.f;\n+        else if (mylevel >= 59 && GetSpec() == BOT_SPEC_DK_BLOOD)\n+            value += 6.f;\n+    }\n+    if (_botclass == BOT_CLASS_DREADLORD)\n+    {\n+        value += 40.f;\n+    }\n+    if (_botclass == BOT_CLASS_CRYPT_LORD)\n+    {\n+        value += 20.f;\n+    }\n+\n+    expertise = value;\n+\n+    //CRIT\n+    if (CanCrit())\n+    {\n+        value = float(IAmFree() ? mylevel / 4 : 0); // +20%/+0% at 80\n+        tempval = value;\n+\n+        GtChanceToMeleeCritBaseEntry const* critBaseMelee  = sGtChanceToMeleeCritBaseStore.LookupEntry(GetPlayerClass()-1);\n+        GtChanceToMeleeCritEntry const* critRatioMelee = sGtChanceToMeleeCritStore.LookupEntry((GetPlayerClass()-1)*GT_MAX_LEVEL + mylevel-1);\n+        if (critBaseMelee && critRatioMelee)\n+            value += (critBaseMelee->base + _getTotalBotStat(BOT_STAT_MOD_AGILITY) * critRatioMelee->ratio) * 100.0f;\n+\n+        //crit from intellect\n+        GtChanceToSpellCritBaseEntry const* critBaseSpell  = sGtChanceToSpellCritBaseStore.LookupEntry(GetPlayerClass()-1);\n+        GtChanceToSpellCritEntry const* critRatioSpell = sGtChanceToSpellCritStore.LookupEntry((GetPlayerClass()-1)*GT_MAX_LEVEL + mylevel-1);\n+        if (critBaseSpell && critRatioSpell)\n+            tempval += (critBaseSpell->base + _getTotalBotStat(BOT_STAT_MOD_INTELLECT) * critRatioSpell->ratio) * 100.f;\n+\n+        value = std::max<float>(value, tempval);\n+\n+        //45 CR = 1% crit at 80\n+        tempval = _getTotalBotStat(BOT_STAT_MOD_CRIT_MELEE_RATING) + _getTotalBotStat(BOT_STAT_MOD_CRIT_RANGED_RATING) + _getTotalBotStat(BOT_STAT_MOD_CRIT_SPELL_RATING) + _getTotalBotStat(BOT_STAT_MOD_CRIT_RATING);\n+        tempval += me->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_RATING, (1u << CR_CRIT_MELEE) | (1u << CR_CRIT_RANGED) | (1u << CR_CRIT_SPELL));\n+\n+        //Molten Armor: 35% spirit to crit rating (+40% double-glyphed + 15% T9P2 bonus)\n+        if (_botclass == BOT_CLASS_MAGE && me->HasAuraTypeWithFamilyFlags(SPELL_AURA_MOD_RATING_FROM_STAT, SPELLFAMILY_MAGE, 0x40000))\n+            tempval += _getTotalBotStat(BOT_STAT_MOD_SPIRIT) * (mylevel >= 80 ? 0.9f : mylevel >= 70 ? 0.75f : 0.55f);\n+        //Firestone: just emulate the rating bonus\n+        if (_botclass == BOT_CLASS_WARLOCK)\n+        {\n+            uint8 ratingBonus;\n+            if      (mylevel >= 80) ratingBonus = 49;\n+            else if (mylevel >= 74) ratingBonus = 42;\n+            else if (mylevel >= 66) ratingBonus = 35;\n+            else if (mylevel >= 56) ratingBonus = 28;\n+            else if (mylevel >= 46) ratingBonus = 21;\n+            else if (mylevel >= 36) ratingBonus = 14;\n+            else if (mylevel >= 28) ratingBonus = 7;\n+            else                    ratingBonus = 0;\n+\n+            //Master Conjuror\n+            if (mylevel >= 30 && GetSpec() == BOT_SPEC_WARLOCK_DEMONOLOGY)\n+                ratingBonus *= 4;\n+\n+            tempval += (float)ratingBonus;\n+        }\n+\n+        value += tempval * (_botclass == BOT_CLASS_HUNTER ? _getRatingMultiplier(CR_CRIT_RANGED) : std::max<float>(_getRatingMultiplier(CR_CRIT_MELEE), _getRatingMultiplier(CR_CRIT_SPELL)));\n+\n+        //common crit talents\n+        if (mylevel >= 10 &&\n+            (_botclass != BOT_CLASS_MAGE && _botclass != BOT_CLASS_PRIEST &&\n+            _botclass != BOT_CLASS_DRUID && _botclass != BOT_CLASS_WARLOCK))\n+            value += 5.f;\n+\n+        //class-specific\n+        if (_botclass == BOT_CLASS_DRUID)\n+        {\n+            //Sharpened Claws\n+            if (mylevel >= 20 && (myclass == DRUID_CAT_FORM || myclass == DRUID_BEAR_FORM))\n+                value += 6.f;\n+        }\n+        if (_botclass == BOT_CLASS_ROGUE)\n+        {\n+            //Close Quarters Combat\n+            if (mylevel >= 20)\n+            {\n+                if (Item const* mainhand = _equips[BOT_SLOT_MAINHAND])\n+                {\n+                    if (mainhand->GetTemplate()->Class == ITEM_CLASS_WEAPON &&\n+                        (mainhand->GetTemplate()->SubClass == ITEM_SUBCLASS_WEAPON_DAGGER ||\n+                        mainhand->GetTemplate()->SubClass == ITEM_SUBCLASS_WEAPON_FIST))\n+                        value += 5.f;\n+                }\n+            }\n+        }\n+        if (_botclass == BOT_CLASS_PALADIN)\n+        {\n+            //Sanctity of Battle part 1\n+            if (mylevel >= 25 && GetSpec() == BOT_SPEC_PALADIN_RETRIBUTION)\n+                value += 3.f;\n+            //Combat Expertise\n+            if (mylevel >= 45 && GetSpec() == BOT_SPEC_PALADIN_PROTECTION)\n+                value += 6.f;\n+        }\n+        if (_botclass == BOT_CLASS_HUNTER)\n+        {\n+            //Killer Instinct\n+            if (mylevel >= 30 && GetSpec() == BOT_SPEC_HUNTER_BEASTMASTERY)\n+                value += 3.f;\n+            //Master Marksman\n+            if (mylevel >= 45 && GetSpec() == BOT_SPEC_HUNTER_MARKSMANSHIP)\n+                value += 5.f;\n+        }\n+        if (_botclass == BOT_CLASS_PRIEST)\n+        {\n+            //Focused Will part 1\n+            if (mylevel >= 40 && GetSpec() == BOT_SPEC_PRIEST_DISCIPLINE)\n+                value += 3.f;\n+        }\n+        if (_botclass == BOT_CLASS_DEATH_KNIGHT)\n+        {\n+            //Annihilation part 1\n+            if (mylevel >= 57)\n+                value += 3.f;\n+        }\n+        if (_botclass == BOT_CLASS_WARLOCK)\n+        {\n+            //Backlash\n+            if (mylevel >= 30)\n+                value += 3.f;\n+            //Demonic Tactics part 1, part 2 (me)\n+            if (mylevel >= 45 && GetSpec() == BOT_SPEC_WARLOCK_DEMONOLOGY)\n+                value += 10.f;\n+        }\n+        if (_botclass == BOT_CLASS_MAGE)\n+        {\n+            //Arcane Instability part 2\n+            if (mylevel >= 35 && GetSpec() == BOT_SPEC_MAGE_ARCANE)\n+                value += 3.f;\n+        }\n+        if (_botclass == BOT_CLASS_DREADLORD)\n+        {\n+            value = value * 2.f;\n+        }\n+        if (_botclass == BOT_CLASS_DARK_RANGER)\n+        {\n+            value += 20.f;\n+        }\n+\n+        if (BotCfg::IsBotStatsLimitsEnabled())\n+            crit = std::min<float>(value, BotCfg::GetBotStatLimitCrit());\n+        else\n+            crit = value;\n+\n+        if (crit < 0.0f)\n+            crit = 0.0f;\n+    }\n+    else\n+        crit = 0.0f;\n+\n+    //DEFENSE\n+    value = 0.f;\n+    tempval = _getTotalBotStat(BOT_STAT_MOD_DEFENSE_SKILL_RATING);\n+    tempval += me->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_RATING, (1u << CR_DEFENSE_SKILL));\n+    value += tempval * _getRatingMultiplier(CR_DEFENSE_SKILL);\n+    value += me->GetTotalAuraModifierByMiscValue(SPELL_AURA_MOD_SKILL, SKILL_DEFENSE);\n+    defense = mylevel * 5 + uint32(value); //truncate\n+\n+    float defbonus = defense - mylevel * 5; //difference\n+\n+    //PARRY\n+    if (CanParry())\n+    {\n+        value = 5.0f + float(IAmFree() ? mylevel / 8 : 0); // +10%/+0% at 80\n+\n+        if (mylevel >= 10)\n+        {\n+            //67 PR = 1% parry at 80\n+            tempval = _getTotalBotStat(BOT_STAT_MOD_PARRY_RATING);\n+            tempval += me->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_RATING, (1u << CR_PARRY));\n+\n+            //Forceful Deflection: 25% of strength goes to parry rating\n+            if (_botclass == BOT_CLASS_DEATH_KNIGHT/* && mylevel >= 55*/)\n+                tempval += _getTotalBotStat(BOT_STAT_MOD_STRENGTH) * 0.25f;\n+\n+            value += tempval * _getRatingMultiplier(CR_PARRY);\n+            //125 DR = 1% block/parry/dodge at 80\n+            value += defbonus * 0.04f;\n+        }\n+\n+        //Deflection (general)\n+        if ((_botclass == BOT_CLASS_WARRIOR || _botclass == BOT_CLASS_ROGUE || _botclass == BOT_CLASS_PALADIN) && mylevel >= 10)\n+            value += 5.0f;\n+        if (_botclass == BOT_CLASS_HUNTER && mylevel >= 20)\n+            value += 3.f;\n+\n+        if (_botclass == BOT_CLASS_SEA_WITCH)\n+            value += 25.f;\n+\n+        if (BotCfg::IsBotStatsLimitsEnabled())\n+            parry = std::min<float>(value, BotCfg::GetBotStatLimitParry());\n+        else\n+            parry = value;\n+\n+        if (parry < 0.0f)\n+            parry = 0.0f;\n+    }\n+    else\n+        parry = 0.0f;\n+\n+    //DODGE\n+    if (CanDodge())\n+    {\n+        value = 5.0f + float(IAmFree() ? mylevel / 8 : 0); // +10%/+0% at 80\n+\n+        if (GtChanceToMeleeCritEntry  const* dodgeRatio = sGtChanceToMeleeCritStore.LookupEntry((GetPlayerClass()-1)*GT_MAX_LEVEL + mylevel-1))\n+            value += _getTotalBotStat(BOT_STAT_MOD_AGILITY) * dodgeRatio->ratio * 100.0f;\n+\n+        if (mylevel >= 10)\n+        {\n+            //53 DR = 1% dodge at 80\n+            tempval = _getTotalBotStat(BOT_STAT_MOD_DODGE_RATING);\n+            tempval += me->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_RATING, (1u << CR_DODGE));\n+            value += tempval * _getRatingMultiplier(CR_DODGE);\n+            //125 DR = 1% block/parry/dodge at 80\n+            value += defbonus * 0.04f;\n+        }\n+\n+        //evasion, anticipation (general)\n+        if ((_botclass == BOT_CLASS_WARRIOR || _botclass == BOT_CLASS_ROGUE || _botclass == BOT_CLASS_PALADIN ||\n+            _botclass == BOT_CLASS_DEATH_KNIGHT || _botclass == BOT_CLASS_SHAMAN) && mylevel >= 15)\n+            value += 5.0f;\n+\n+        //class-specific\n+        if (_botclass == BOT_CLASS_DRUID)\n+        {\n+            //Feral Swiftness\n+            if (mylevel >= 20 && (myclass == DRUID_CAT_FORM || myclass == DRUID_BEAR_FORM))\n+                value += 4.f;\n+        }\n+\n+        if (_botclass == BOT_CLASS_DARK_RANGER)\n+        {\n+            //base dodge 30%\n+            value += 30.f;\n+        }\n+\n+        if (_botclass == BOT_CLASS_SEA_WITCH && IsInContactWithWater())\n+        {\n+            //BOT_LOG_ERROR(\"scripts\", \"BOT_CLASS_SEA_WITCH dodge: %s now in water\", me->GetName().c_str());\n+            value += 50.f;\n+        }\n+\n+        if (BotCfg::IsBotStatsLimitsEnabled())\n+            dodge = std::min<float>(value, BotCfg::GetBotStatLimitDodge());\n+        else\n+            dodge = value;\n+\n+        if (dodge < 0.0f)\n+            dodge = 0.0f;\n+    }\n+    else\n+        dodge = 0.0f;\n+\n+    //BLOCK\n+    if (IsBlockingClass(_botclass))\n+    {\n+        value = 5.0f + float(IAmFree() ? mylevel / 4 : 0); // +20%/+0% at 80\n+\n+        //16.5 BR = 1% block at 80\n+        tempval = _getTotalBotStat(BOT_STAT_MOD_BLOCK_RATING);\n+        tempval += me->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_RATING, (1u << CR_BLOCK));\n+        value += tempval * _getRatingMultiplier(CR_BLOCK);\n+        //125 DR = 1% block/parry/dodge at 80\n+        value += defbonus * 0.04f;\n+\n+        //base block chance is capped at 75%\n+        if (BotCfg::IsBotStatsLimitsEnabled())\n+            block = std::min<float>(value, BotCfg::GetBotStatLimitBlock());\n+        else\n+            block = std::min<float>(value, 75.0f);\n+\n+        if (block < 0.0f)\n+            block = 0.0f;\n+\n+        //Spellbreaker wears tall shield so should always block\n+        if (_botclass == BOT_CLASS_SPELLBREAKER)\n+            block += 90.f;\n+\n+        //BLOCK VALUE\n+        //2 str = 1 block value\n+        value = 0.5f * _getTotalBotStat(BOT_STAT_MOD_STRENGTH) - 10.f;\n+        value += _getTotalBotStat(BOT_STAT_MOD_BLOCK_VALUE);\n+\n+        //Shield Mastery part 1\n+        if (_botclass == BOT_CLASS_WARRIOR && mylevel >= 20 && GetSpec() == BOT_SPEC_WARRIOR_PROTECTION)\n+            value *= 1.3f;\n+        //Redoubt handled in passives\n+        //if (mylevel >= 45 && _botclass == BOT_CLASS_PALADIN)\n+        //    value *= 1.3f;\n+\n+        blockvalue = std::max<float>(int32(value), 1.f);\n+    }\n+    //else\n+    //{\n+    //    block = 0.0f;\n+    //    blockvalue = 0;\n+    //}\n+\n+    //MANA\n+    _OnManaUpdate();\n+\n+    if (IsCastingClass(_botclass))\n+    {\n+        //SPELL PENETRATION\n+        value = IAmFree() ? mylevel : 0; // 80/0 at 80\n+        //~1 SPPR = 1 spell penetration\n+        value += _getTotalBotStat(BOT_STAT_MOD_SPELL_PENETRATION);\n+        spellpen = uint32(value);\n+\n+        //SPELL POWER\n+        value = /*IAmFree() ? std::max<int32>((int8(mylevel) - 30) * 40, 0) : */0; // +2000/+0 spp at 80\n+        value += _getTotalBotStat(BOT_STAT_MOD_SPELL_POWER);\n+\n+        //class-specified mods\n+        if (_botclass == BOT_CLASS_PALADIN && mylevel >= 50)\n+        {\n+            //Touched by the Light - 60% of strength to spell power\n+            if (GetSpec() == BOT_SPEC_PALADIN_PROTECTION)\n+                value += 0.6f * _getTotalBotStat(BOT_STAT_MOD_STRENGTH);\n+            //Sheath of Light - 30% attack power to spell power\n+            if (GetSpec() == BOT_SPEC_PALADIN_RETRIBUTION)\n+                value += 0.3f * me->GetTotalAttackPowerValue(BASE_ATTACK);\n+            //Holy Guidance - 20% Intellect to spell power\n+            if (GetSpec() == BOT_SPEC_PALADIN_HOLY)\n+                value += 0.2f * _getTotalBotStat(BOT_STAT_MOD_INTELLECT);\n+        }\n+        if (_botclass == BOT_CLASS_PRIEST && mylevel >= 30)\n+        {\n+            float totalSpi = _getTotalBotStat(BOT_STAT_MOD_SPIRIT);\n+            //Spiritual Guidance - 25% Spirit to spell power\n+            if (GetSpec() == BOT_SPEC_PRIEST_HOLY)\n+                value += 0.25f * totalSpi;\n+            //Twisted Faith - 20% Spirit to spell power\n+            else if (mylevel >= 55 && GetSpec() == BOT_SPEC_PRIEST_SHADOW)\n+                value += 0.2f * totalSpi;\n+            //Shadowy Insight (Glyph of Shadow)\n+            if (me->GetAuraEffect(SPELL_AURA_MOD_SPELL_DAMAGE_OF_STAT_PERCENT, SPELLFAMILY_GENERIC, 1499, 0))\n+                value += 0.3f * totalSpi;\n+        }\n+        if (_botclass == BOT_CLASS_SHAMAN && mylevel >= 50 && GetSpec() == BOT_SPEC_SHAMAN_ENHANCEMENT)\n+        {\n+            //Mental Quickness - 30% attack power to spell power (only enhancement)\n+            value += 0.3f * me->GetTotalAttackPowerValue(BASE_ATTACK);\n+        }\n+        if (_botclass == BOT_CLASS_DRUID && mylevel >= 30)\n+        {\n+            //Nurturing Instinct - 70% Agility to spell power\n+            value += 0.7f * _getTotalBotStat(BOT_STAT_MOD_AGILITY);\n+            //Lunar Guidance - 12% Intellect to spell power\n+            value += 0.12f * _getTotalBotStat(BOT_STAT_MOD_INTELLECT);\n+            //Improved Moonkin Form - 30% Spirit to spell power\n+            if (mylevel >= 40 && myclass == DRUID_MOONKIN_FORM)\n+                value += 0.3f * _getTotalBotStat(BOT_STAT_MOD_SPIRIT);\n+            //Improved Tree (of Life) Form - 15% Spirit to spell power\n+            if (mylevel >= 50 && myclass == DRUID_TREE_FORM)\n+                value += 0.15f * _getTotalBotStat(BOT_STAT_MOD_SPIRIT);\n+        }\n+        if (_botclass == BOT_CLASS_MAGE && mylevel >= 45 && GetSpec() == BOT_SPEC_MAGE_ARCANE)\n+        {\n+            //Mind Mastery - 15% Intellect to spell power\n+            value += 0.15f * _getTotalBotStat(BOT_STAT_MOD_INTELLECT);\n+        }\n+        if (_botclass == BOT_CLASS_WARLOCK)\n+        {\n+            if (me->GetAuraEffect(SPELL_AURA_MOD_SPELL_DAMAGE_OF_STAT_PERCENT, SPELLFAMILY_WARLOCK, 0x0, 0x20000000, 0x0))\n+            {\n+                //Fel Armor + Demonic Aegis - 39% Spirit to spell power\n+                value += 0.39f * _getTotalBotStat(BOT_STAT_MOD_SPIRIT);\n+            }\n+            //Demonic Knowledge\n+            if (botPet && botPet->IsAlive() && mylevel >= 40 && GetSpec() == BOT_SPEC_WARLOCK_DEMONOLOGY)\n+                value += 0.12f * botPet->GetStat(STAT_STAMINA) + botPet->GetStat(STAT_INTELLECT);\n+            //Glyph of Life Tap: 20% of spirit to spellpower\n+            if (me->GetAuraEffect(SPELL_AURA_MOD_SPELL_DAMAGE_OF_STAT_PERCENT, SPELLFAMILY_WARLOCK, 208, 0))\n+                value += 0.2f * _getTotalBotStat(BOT_STAT_MOD_SPIRIT);\n+        }\n+        if (_botclass == BOT_CLASS_SPHYNX)\n+        {\n+            //bonus from attack power (for tank) or intellect (ranged)\n+            value += 2.0f *_getTotalBotStat(BOT_STAT_MOD_INTELLECT);\n+            value += 0.5f * me->GetTotalAttackPowerValue(BASE_ATTACK);\n+            //from wands\n+            for (auto i : NPCBots::index_array<uint8, BOT_FIRST_NON_MELEE_SLOT>)\n+                if (ItemTemplate const* proto = _equips[i] ? _equips[i]->GetTemplate() : nullptr)\n+                    value += proto->getDPS() * 1.35f;\n+        }\n+        if (_botclass == BOT_CLASS_ARCHMAGE)\n+        {\n+            //bonus from intellect\n+            value += _getTotalBotStat(BOT_STAT_MOD_INTELLECT);\n+        }\n+        if (_botclass == BOT_CLASS_DREADLORD)\n+        {\n+            //bonus from strength\n+            value += 2.f * _getTotalBotStat(BOT_STAT_MOD_STRENGTH);\n+        }\n+        if (_botclass == BOT_CLASS_SPELLBREAKER)\n+        {\n+            //bonus from strength\n+            value += 2.f * _getTotalBotStat(BOT_STAT_MOD_STRENGTH);\n+        }\n+        if (_botclass == BOT_CLASS_DARK_RANGER)\n+        {\n+            //bonus from intellect\n+            value += 0.5f * _getTotalBotStat(BOT_STAT_MOD_INTELLECT);\n+        }\n+        if (_botclass == BOT_CLASS_NECROMANCER)\n+        {\n+            //bonus from intellect\n+            value += _getTotalBotStat(BOT_STAT_MOD_INTELLECT);\n+        }\n+        if (_botclass == BOT_CLASS_SEA_WITCH)\n+        {\n+            //bonus from intellect\n+            value += 2.f * _getTotalBotStat(BOT_STAT_MOD_INTELLECT);\n+        }\n+        if (_botclass == BOT_CLASS_CRYPT_LORD)\n+        {\n+            //bonus from strength\n+            value += 2.f * _getTotalBotStat(BOT_STAT_MOD_STRENGTH);\n+        }\n+\n+        spellpower = uint32(value);\n+    }\n+    //else\n+    //{\n+    //    spellpower = 0;\n+    //}\n+\n+    //if init or levelup\n+    if (force)\n+    {\n+        InitHeals();\n+        me->SetFullHealth();\n+        if (_botclass != BOT_CLASS_SPHYNX)\n+            me->SetPower(POWER_MANA, me->GetMaxPower(POWER_MANA));\n+\n+        if (BotMgr::IsWanderingWorldBot(me))\n+            me->ResetPlayerDamageReq();\n+    }\n+\n+    if (botPet)\n+        botPet->GetBotPetAI()->SetShouldUpdateStats();\n+}\n+\n+//Emotion-based action\n+void bot_ai::ReceiveEmote(Player* player, uint32 emote)\n+{\n+    switch (emote)\n+    {\n+        case TEXT_EMOTE_BONK:\n+            _listAuras(player, me);\n+            break;\n+        case TEXT_EMOTE_SALUTE:\n+            _listAuras(player, player);\n+            break;\n+        case TEXT_EMOTE_STAND:\n+            if (master != player)\n+            {\n+                me->HandleEmoteCommand(EMOTE_ONESHOT_RUDE);\n+                break;\n+            }\n+            SetBotCommandState(BOT_COMMAND_STAY);\n+            //BotWhisper(\"Standing Still.\", player);\n+            break;\n+        case TEXT_EMOTE_WAVE:\n+            if (master != player)\n+            {\n+                me->HandleEmoteCommand(EMOTE_ONESHOT_RUDE);\n+                break;\n+            }\n+            if (me->IsNonMeleeSpellCast(true))\n+                me->InterruptNonMeleeSpells(true);\n+            SetBotCommandState(BOT_COMMAND_FOLLOW, true);\n+            //BotWhisper(\"Following!\", player);\n+            break;\n+        case TEXT_EMOTE_TICKLE:\n+        {\n+            if (!player->IsGameMaster())\n+                break;\n+\n+            std::ostringstream report;\n+            report << \"Bot \" << me->GetName() << \" (\" << me->GetEntry() << \"), \"\n+                << \"owner: \" << _botData->owner << \", master guid: \" << master->GetGUID().ToString() << \", \"\n+                << \"command states: \" << _botCommandState << \", await states: \" << uint32(_botAwaitState);\n+\n+            report << \"\\nunit flags:\";\n+            for (UnitFlags uf : EnumUtils::Iterate<UnitFlags>())\n+                if (me->HasUnitFlag(uf))\n+                    report << \"\\n  \" << EnumUtils::ToString(uf).Title;\n+            report << \"\\nunit states:\";\n+            uint32 counter = 1;\n+            for (uint32 st = UNIT_STATE_DIED; st <= UNIT_STATE_NO_ENVIRONMENT_UPD; st <<= 1u, ++counter)\n+                if (me->HasUnitState(st))\n+                    report << \"\\n  UNIT_STATE_\" << counter << \" (\" << st << \")\";\n+            report << \"\\nmovement flags:\";\n+            counter = 1;\n+            for (uint32 st = MOVEMENTFLAG_FORWARD; st <= MOVEMENTFLAG_HOVER; st <<= 1u, ++counter)\n+                if (me->HasUnitState(st))\n+                    report << \"\\n  MOVEMENTFLAG_\" << counter << \" (\" << st << \")\";\n+\n+            report << \"\\nProblems:\";\n+\n+            if (!me->IsNPCBot())\n+            {\n+                CreatureTemplate* ct = const_cast<CreatureTemplate*>(me->GetCreatureTemplate());\n+                report << \"\\n  npcbot flags missing (current: \" << ct->flags_extra << \", missing: \" << (CREATURE_FLAG_EXTRA_NPCBOT & ~ct->flags_extra) << \")! Forcing flags...\";\n+                ct->flags_extra |= CREATURE_FLAG_EXTRA_NPCBOT;\n+            }\n+            if (_botData->owner)\n+            {\n+                if (HasBotCommandState(BOT_COMMAND_UNBIND))\n+                {\n+                    report << \"\\n  unbound, re-binding...\";\n+                    RemoveBotCommandState(BOT_COMMAND_UNBIND);\n+                }\n+                bool invalid_master = false;\n+                if (master->GetGUID() == me->GetGUID())\n+                {\n+                    report << \"\\n  master->GetGUID() == me->GetGUID()\";\n+                    invalid_master = true;\n+                }\n+                if (master->GetGUID() == me->GetGUID())\n+                {\n+                    report << \"\\n  _botData->owner != master->GetGUID().GetRawValue()\";\n+                    invalid_master = true;\n+                }\n+                if (invalid_master)\n+                {\n+                    if (Player* real_owner = ObjectAccessor::FindPlayerByLowGUID(_botData->owner))\n+                    {\n+                        report << \"\\n  owner is in world by bot isn't owned by it\";\n+                        if (!SetBotOwner(real_owner))\n+                            report << \"\\n    (failed to set owner to '\" << real_owner->GetName() << \"'!)\";\n+                    }\n+                    else\n+                    {\n+                        ObjectGuid owner_guid = ObjectGuid::Create<HighGuid::Player>(_botData->owner);\n+                        real_owner = ObjectAccessor::FindConnectedPlayer(owner_guid);\n+                        if (real_owner)\n+                            report << \"\\n  owner is found (connected) but not in world!\";\n+                        else if (sCharacterCache->HasCharacterCacheEntry(owner_guid))\n+                            report << \"\\n  owner is found (logged out) but not in world!\";\n+                        else\n+                            report << \"\\n  owner is not found!!!\";\n+                    }\n+                }\n+            }\n+            if (!_atHome)\n+            {\n+                report << \"\\n  _atHome == false\";\n+                _atHome = true;\n+            }\n+            if (_evadeMode)\n+            {\n+                report << \"\\n  _evadeMode == true\";\n+                _evadeMode = false;\n+            }\n+            if ((me->HasUnitFlag(UNIT_FLAG_STUNNED) || me->HasUnitState(UNIT_STATE_STUNNED)) &&\n+                !me->HasAuraType(SPELL_AURA_MOD_STUN))\n+            {\n+                report << \"\\n  stunned but no aura\";\n+                me->ClearUnitState(UNIT_STATE_STUNNED);\n+                me->RemoveUnitFlag(UNIT_FLAG_STUNNED);\n+            }\n+            if ((me->HasUnitFlag(UNIT_FLAG_CONFUSED) || me->HasUnitState(UNIT_STATE_CONFUSED)) &&\n+                !me->HasAuraType(SPELL_AURA_MOD_CONFUSE))\n+            {\n+                report << \"\\n  confused but no aura\";\n+                me->ClearUnitState(UNIT_STATE_CONFUSED);\n+                me->RemoveUnitFlag(UNIT_FLAG_CONFUSED);\n+            }\n+            if ((me->HasUnitFlag(UNIT_FLAG_FLEEING) || me->HasUnitState(UNIT_STATE_FLEEING)) &&\n+                !me->HasAuraType(SPELL_AURA_MOD_FEAR))\n+            {\n+                report << \"\\n  feared but no aura\";\n+                me->ClearUnitState(UNIT_STATE_FLEEING);\n+                me->RemoveUnitFlag(UNIT_FLAG_FLEEING);\n+            }\n+            if (me->IsInCombat() && !me->GetVictim())\n+            {\n+                report << \"\\n  in combat but no target: attackers=\" << uint32(me->getAttackers().size());\n+                me->CombatStop(true);\n+            }\n+            if (IsDuringTeleport() && me->IsInWorld() && me->FindMap())\n+            {\n+                report << \"\\n  being teleported but in world & in map: home=\" << uint32(!!teleHomeEvent) << \", finish=\" << uint32(!!teleFinishEvent);\n+                AbortTeleport();\n+            }\n+            if (HasBotCommandState(BOT_COMMAND_ISSUED_ORDER))\n+            {\n+                report << \"\\n  pending orders that may have got stuck\";\n+                CancelAllOrders();\n+            }\n+            if (HasBotCommandState(BOT_COMMAND_NOGOSSIP))\n+            {\n+                report << \"\\n  forgotten NOGOSSIP command state\";\n+                RemoveBotCommandState(BOT_COMMAND_NOGOSSIP);\n+            }\n+            if (waitTimer > 10000)\n+            {\n+                report << \"\\n  wait timer overflow: \" << waitTimer;\n+                waitTimer = 0;\n+            }\n+\n+            me->BotStopMovement();\n+            me->TextEmote(LocalizedNpcText(player, BOT_TEXT_BOT_TICKLED));\n+            ChatHandler(player->GetSession()).SendSysMessage(report.view());\n+            break;\n+        }\n+        default:\n+            break;\n+    }\n+}\n+\n+//ISINBOTPARTY\n+//Returns group members (and their npcbots too)\n+//For now all your puppets are in your group automatically\n+bool bot_ai::IsInBotParty(Unit const* unit) const\n+{\n+    if (!unit)\n+        return false;\n+    if (unit == master || unit == me || unit == botPet)\n+        return true;\n+\n+    if (IAmFree())\n+    {\n+        if (me->GetFaction() == FACTION_TEMPLATE_NEUTRAL_HOSTILE || unit->GetFaction() == FACTION_TEMPLATE_NEUTRAL_HOSTILE)\n+            return false;\n+\n+        if (me->HasByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_FFA_PVP) ||\n+            unit->HasByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_FFA_PVP))\n+            return false;\n+\n+        return\n+            (unit->IsPlayer() || unit->ToCreature()->IsPet() || unit->ToCreature()->IsNPCBotOrPet()) &&\n+            (unit->GetFaction() == me->GetFaction() || (me->GetBotGroup() && me->GetBotGroup()->IsMember(unit->GetGUID())) ||\n+            (me->GetReactionTo(unit) >= REP_FRIENDLY && unit->GetReactionTo(me) >= REP_FRIENDLY));\n+    }\n+\n+    //cheap check\n+    if (Group const* gr = master->GetGroup())\n+    {\n+        //group member case\n+        if (gr->IsMember(unit->GetGUID()))\n+            return true;\n+        //pointed target case\n+        for (auto i : NPCBots::index_array<uint8, TARGET_ICONS_COUNT>)\n+            if ((BotCfg::GetHealTargetIconFlags() & GroupIconsFlags[i]) &&\n+                !((BotCfg::GetOffTankTargetIconFlags() | BotCfg::GetDPSTargetIconFlags() | BotCfg::GetRangedDPSTargetIconFlags()) & GroupIconsFlags[i]))\n+                if (ObjectGuid guid = gr->GetTargetIcons()[i])\n+                    if (guid == unit->GetGUID())\n+                        return true;\n+    }\n+\n+    //Player-controlled creature case\n+    if (Creature const* cre = unit->ToCreature())\n+    {\n+        ObjectGuid ownerGuid = unit->GetOwnerGUID() ? unit->GetOwnerGUID() : unit->GetCreator() ? unit->GetCreator()->GetGUID() : ObjectGuid::Empty;\n+        if (!ownerGuid && unit->IsVehicle())\n+            ownerGuid = unit->GetCharmerGUID();\n+        //controlled by master\n+        if (ownerGuid == master->GetGUID())\n+            return true;\n+        //npcbot/npcbot's pet case\n+        if (cre->GetBotOwner() == master)\n+            return true;\n+        if (ownerGuid && master->GetBotMgr()->GetBot(ownerGuid))\n+            return true;\n+        //controlled by group member\n+        //pets, minions, guardians etc.\n+        //bot pets too\n+        if (ownerGuid)\n+            if (Group const* gr = master->GetGroup())\n+                if (gr->IsMember(ownerGuid))\n+                    return true;\n+    }\n+\n+    return false;\n+}\n+\n+bool bot_ai::IsInBotParty(ObjectGuid guid) const\n+{\n+    if (!guid) return false;\n+    if (guid == master->GetGUID() || guid == me->GetGUID()) return true;\n+    if (master->GetVehicle() && guid == master->GetCharmGUID()) return true;\n+    if (me->GetVehicle() && guid == me->GetCharmGUID()) return true;\n+\n+    if (IAmFree())\n+    {\n+        if (me->HasByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_FFA_PVP))\n+            return false;\n+\n+        return !(me->GetVictim() && me->GetVictim()->GetGUID() == guid);\n+    }\n+\n+    //cheap check\n+    if (Group const* gr = master->GetGroup())\n+    {\n+        //group member case\n+        if (gr->IsMember(guid))\n+            return true;\n+        //pointed target case\n+        for (auto i : NPCBots::index_array<uint8, TARGET_ICONS_COUNT>)\n+            if ((BotCfg::GetHealTargetIconFlags() & GroupIconsFlags[i]) &&\n+                !((BotCfg::GetOffTankTargetIconFlags() | BotCfg::GetDPSTargetIconFlags()) & GroupIconsFlags[i]))\n+                if (ObjectGuid gguid = gr->GetTargetIcons()[i])\n+                    if (gguid == guid)\n+                        return true;\n+\n+        for (GroupReference const* ref = gr->GetFirstMember(); ref != nullptr; ref = ref->next())\n+        {\n+            Player const* p = ref->GetSource();\n+            if (p && (p->GetPetGUID() == guid || (p->GetVehicle() && p->GetCharmGUID() == guid)))\n+                return true;\n+            if (p && p->HaveBot())\n+            {\n+                if (Creature const* bot = p->GetBotMgr()->GetBot(guid))\n+                    if (bot->GetGUID() == guid || (bot->GetBotsPet() && bot->GetBotsPet()->GetGUID() == guid) ||\n+                        (bot->GetVehicle() && bot->GetCharmGUID() == guid))\n+                        return true;\n+            }\n+        }\n+    }\n+    else\n+    {\n+        if (master->GetPetGUID() == guid || (master->GetVehicle() && master->GetCharmGUID() == guid))\n+            return true;\n+        if (Creature const* bot = master->GetBotMgr()->GetBot(guid))\n+            if (bot->GetGUID() == guid || (bot->GetBotsPet() && bot->GetBotsPet()->GetGUID() == guid) ||\n+                (bot->GetVehicle() && bot->GetCharmGUID() == guid))\n+                return true;\n+    }\n+\n+    return false;\n+}\n+\n+//REFRESHAURA\n+//Applies/removes/reapplies aura\n+void bot_ai::RefreshAura(uint32 spellId, int8 count, Unit* target) const\n+{\n+    if (count < 0 || count > 1)\n+    {\n+        BOT_LOG_ERROR(\"entities.player\", \"bot_ai::RefreshAura(): count is out of bounds ({}) for bot {} (botclass: {}, entry: {})\",\n+            int32(count), me->GetName().c_str(), uint32(_botclass), me->GetEntry());\n+        return;\n+    }\n+\n+    if (!spellId)\n+    {\n+        BOT_LOG_ERROR(\"entities.player\", \"bot_ai::RefreshAura(): spellId is 0 for bot {} (botclass: {}, entry: {})\",\n+            me->GetName().c_str(), uint32(_botclass), me->GetEntry());\n+        return;\n+    }\n+\n+    SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);\n+    if (!spellInfo)\n+    {\n+        BOT_LOG_ERROR(\"entities.player\", \"bot_ai::RefreshAura(): Invalid spellInfo for spell {}! Bot - {} (botclass: {}, entry: {})\",\n+            spellId, me->GetName().c_str(), uint32(_botclass), me->GetEntry());\n+        return;\n+    }\n+    spellInfo = spellInfo->TryGetSpellInfoOverride(me);\n+\n+    if (!target)\n+        target = me;\n+\n+    target->RemoveAurasDueToSpell(spellId);\n+\n+    //for (int8 i = 0; i < count; ++i)\n+    if (count)\n+        target->AddAura(spellInfo, MAX_EFFECT_MASK, target);\n+}\n+\n+bool bot_ai::CanBotAttack(Unit const* target, int8 byspell, bool secondary) const\n+{\n+    if (!target)\n+        return false;\n+    if (HasBotCommandState(BOT_COMMAND_FULLSTOP | BOT_COMMAND_INACTION))\n+        return false;\n+    if (target->HasUnitState(UNIT_STATE_EVADE | UNIT_STATE_IN_FLIGHT))\n+        return false;\n+    //if (target->IsCombatDisallowed())\n+    //    return false;\n+    if (!target->IsVisible())\n+        return false;\n+    if (!target->isTargetableForAttack(false))\n+        return false;\n+    if (!target->InSamePhase(me) && !CanSeeEveryone())\n+        return false;\n+    if (byspell != -1 && target->IsTotem())\n+        return false;\n+    if (target->CanHaveThreatList() && GetEngageTimer() > lastdiff)\n+        return false;\n+    if (!BotCfg::IsPvPEnabled() && me->IsPvP() && target->IsControlledByPlayer())\n+        return false;\n+    if (me->GetFaction() == 35 && IAmFree() && target->IsCreature() && target->GetVictim() != me)\n+        return false;\n+    if ((target->GetFaction() == 35 || target->GetFaction() == me->GetFaction()) && me->GetFaction() != FACTION_TEMPLATE_NEUTRAL_HOSTILE)\n+        return false;\n+    if (!CanBotAttackOnVehicle())\n+        return false;\n+    if (IsPointedNoDPSTarget(target))\n+        return false;\n+\n+    if (IsWanderer() && target->IsCreature() && target->GetVictim() != me)\n+    {\n+        if (BotCfg::EnableWanderingUntargetNpcQuestgiver() && target->IsQuestGiver())\n+            return false;\n+        if (BotCfg::EnableWanderingUntargetNpcFlightmaster() && target->IsTaxi())\n+            return false;\n+        //do not attack friendly targets in FFAPvP mode\n+        if (me->IsFFAPvP() && me->GetFaction() == FACTION_TEMPLATE_NEUTRAL_HOSTILE)\n+        {\n+            uint32 base_faction = BotDataMgr::GetDefaultFactionForBotRaceClass(GetBotClass(), me->GetRace());\n+            if (me->GetFaction() != base_faction && me->GetFactionReactionTo(sFactionTemplateStore.LookupEntry(base_faction), target) >= REP_FRIENDLY)\n+                return false;\n+        }\n+    }\n+\n+    if (IAmFree())\n+    {\n+        switch (target->GetEntry())\n+        {\n+            case 33229: case 33243: case 33272: // AT Training dummy targets\n+            case 4952: case 17578: case 24792: case 30527: case 31143: case 31144: case 31146: // training dummy\n+            case 32541: case 32542: case 32543: case 32545: case 32546: case 32547: case 32666: case 32667: // training dummy\n+            case 7668: case 7669: case 7670: case 7671: // Blasted Lands servants\n+                return false;\n+            case 21416: case 21709: case 21710: case 21711: // Shadowmoon Valley Broken element corruptors\n+                if (target->HasAuraTypeWithMiscvalue(SPELL_AURA_SCHOOL_IMMUNITY, 127))\n+                    return false;\n+                break;\n+            default:\n+                break;\n+        }\n+    }\n+\n+    bool pulling = IsLastOrder(BOT_ORDER_PULL, 0, target->GetGUID());\n+    uint8 followdist = IAmFree() ? BotMgr::GetBotFollowDistMax() : master->GetBotMgr()->GetBotFollowDist();\n+    float foldist = _getAttackDistance(float(followdist));\n+    if (!IAmFree() && IsRanged() && me->IsWithinLOSInMap(target, VMAP::ModelIgnoreFlags::M2, LINEOFSIGHT_ALL_CHECKS))\n+        _extendAttackRange(foldist);\n+\n+    uint32 mainMask;\n+    if (!byspell)\n+        mainMask = SPELL_SCHOOL_MASK_NORMAL;\n+    else\n+    {\n+        switch (_botclass)\n+        {\n+            case BOT_CLASS_PRIEST:      mainMask = SPELL_SCHOOL_MASK_SHADOW;                                                                break;\n+            case BOT_CLASS_SHAMAN:      mainMask = IsMelee() ? SPELL_SCHOOL_MASK_NORMAL : (SPELL_SCHOOL_MASK_FIRE|SPELL_SCHOOL_MASK_NATURE);break;\n+            case BOT_CLASS_MAGE:        mainMask = Rand() > 50 ? SPELL_SCHOOL_MASK_FIRE : SPELL_SCHOOL_MASK_FROST;                          break;\n+            case BOT_CLASS_WARLOCK:     mainMask = Rand() > 50 ? SPELL_SCHOOL_MASK_SHADOW : SPELL_SCHOOL_MASK_FIRE;                         break;\n+            case BOT_CLASS_DRUID:       mainMask = Rand() > 50 ? SPELL_SCHOOL_MASK_ARCANE : SPELL_SCHOOL_MASK_NATURE;                       break;\n+            case BOT_CLASS_SPHYNX:      mainMask = SPELL_SCHOOL_MASK_NONE;                                                                  break;\n+            case BOT_CLASS_ARCHMAGE:    mainMask = SPELL_SCHOOL_MASK_NONE;                                                                  break;\n+            case BOT_CLASS_DREADLORD:   mainMask = SPELL_SCHOOL_MASK_NONE;                                                                  break;\n+            case BOT_CLASS_SPELLBREAKER:mainMask = SPELL_SCHOOL_MASK_NONE;                                                                  break;\n+            case BOT_CLASS_DARK_RANGER: mainMask = SPELL_SCHOOL_MASK_NONE;                                                                  break;\n+            case BOT_CLASS_NECROMANCER: mainMask = SPELL_SCHOOL_MASK_NONE;                                                                  break;\n+            case BOT_CLASS_SEA_WITCH:   mainMask = SPELL_SCHOOL_MASK_NONE;                                                                  break;\n+            default:                    mainMask = SPELL_SCHOOL_MASK_NORMAL;                                                                break;\n+        }\n+    }\n+\n+    if (master->IsInCombat() || target->IsInCombat() || IsWanderer() || (IAmFree() && me->GetFaction() == FACTION_TEMPLATE_NEUTRAL_HOSTILE) || pulling)\n+    {\n+        //if master is killed pursue to the end)\n+        if (!master->IsAlive() || target->IsControlledByPlayer() || pulling || (followdist > 0 && (master->GetDistance(target) <= foldist || HasBotCommandState(BOT_COMMAND_STAY))))\n+        {\n+            //if stationery check own distance\n+            if (!HasBotCommandState(BOT_COMMAND_STAY) || ((!IsRanged() && !secondary) ? me->IsWithinMeleeRange(target) : me->GetDistance(target) <= foldist))\n+            {\n+                if (byspell == -1 || !mainMask || !target->IsImmunedToDamage(SpellSchoolMask(mainMask)))\n+                {\n+                    if (me->IsValidAttackTarget(target))\n+                    {\n+                        if (!IsInBotParty(target))\n+                            return true;\n+\n+                        //some friends need to be attacked when charmed\n+                        switch (target->HasAuraType(SPELL_AURA_MOD_CHARM) ? target->GetAuraEffectsByType(SPELL_AURA_MOD_CHARM).front()->GetId() : 0)\n+                        {\n+                            case 17244:\n+                            case 17246: //Possess (Baroness Anastari, Stratholme, 17244 -> 17246)\n+                                return true;\n+                            default:\n+                                break;\n+                        }\n+                    }\n+                }\n+            }\n+        }\n+    }\n+\n+    return false;\n+}\n+bool bot_ai::CanBotAttackOnVehicle() const\n+{\n+    if (VehicleSeatEntry const* seat = me->GetVehicle() ? me->GetVehicle()->GetSeatForPassenger(me) : nullptr)\n+        return seat->m_flags & VEHICLE_SEAT_FLAG_CAN_ATTACK;\n+\n+    return true;\n+}\n+//GETVEHICLETARGET\n+//Returns attack target or 'no target'\n+//All code above 'x = _getVehicleTarget() call must not dereference opponent since it can be invalid\n+Unit* bot_ai::_getVehicleTarget(BotVehicleStrats /*strat*/) const\n+{\n+    ASSERT(!IAmFree());\n+    Creature* veh = me->GetVehicleCreatureBase();\n+    Creature* masterVeh = master->GetVehicleCreatureBase();\n+    ASSERT(veh);\n+    Unit* mmover = masterVeh ? masterVeh->ToUnit() : master->ToUnit();\n+    ObjectGuid curTarget = veh->GetTarget();\n+\n+    Unit* mytar = !curTarget.IsEmpty() ? ObjectAccessor::GetUnit(*veh, curTarget) : nullptr;\n+\n+    if (mytar && veh->HasAuraType(SPELL_AURA_MOD_TAUNT))\n+        return mytar;\n+\n+    Group const* gr = !IAmFree() ? master->GetGroup() : nullptr;\n+\n+    if (gr && IsOffTank())\n+    {\n+        Unit* tankTar = nullptr;\n+        for (auto i : NPCBots::index_array_rev<uint8, TARGET_ICONS_COUNT>)\n+        {\n+            if (BotCfg::GetOffTankTargetIconFlags() & GroupIconsFlags[i])\n+            {\n+                if (ObjectGuid guid = gr->GetTargetIcons()[i])\n+                {\n+                    if (mytar && mytar->GetGUID() == guid && mytar->GetVictim() == veh)\n+                        return mytar;\n+\n+                    if (Unit* unit = ObjectAccessor::GetUnit(*veh, guid))\n+                    {\n+                        if (unit->IsVisible() && unit->isTargetableForAttack(false) && veh->IsValidAttackTarget(unit) &&\n+                            unit->IsInCombat() && (CanSeeEveryone() || (veh->CanSeeOrDetect(unit) && unit->InSamePhase(veh))))\n+                        {\n+                            Unit* tempTar = tankTar ? tankTar : unit;\n+                            tankTar = unit;\n+                            Unit* tVic = unit->GetVictim();\n+                            if (!tVic || (tVic != veh && tVic->GetVictim() == unit && IsTank(tVic) && IsInBotParty(tVic)))\n+                            {\n+                                tankTar = tempTar;\n+                                continue;\n+                            }\n+                        }\n+                    }\n+                }\n+            }\n+        }\n+        if (tankTar)\n+            return tankTar;\n+    }\n+    if (gr)\n+    {\n+        for (auto i : NPCBots::index_array_rev<uint8, TARGET_ICONS_COUNT>)\n+        {\n+            if (ObjectGuid guid = gr->GetTargetIcons()[i])\n+            {\n+                if ((HasRole(BOT_ROLE_RANGED)|| HasVehicleRoleOverride(BOT_ROLE_RANGED)) &&\n+                    (BotCfg::GetRangedDPSTargetIconFlags() & GroupIconsFlags[i]))\n+                {\n+                    if (mytar && mytar->GetGUID() == guid)\n+                        return mytar;\n+\n+                    if (Unit* unit = ObjectAccessor::GetUnit(*me, guid))\n+                    {\n+                        if (unit->IsVisible() && unit->isTargetableForAttack(false) && me->IsValidAttackTarget(unit) &&\n+                            unit->IsInCombat() && (CanSeeEveryone() || (me->CanSeeOrDetect(unit) && unit->InSamePhase(me))))\n+                        {\n+                            //BOT_LOG_ERROR(\"entities.unit\", \"_getTarget: found dps icon target %s\", unit->GetName().c_str());\n+                            return unit;\n+                        }\n+                    }\n+                }\n+                if (BotCfg::GetDPSTargetIconFlags() & GroupIconsFlags[i])\n+                {\n+                    if (mytar && mytar->GetGUID() == guid)\n+                        return mytar;\n+\n+                    if (Unit* unit = ObjectAccessor::GetUnit(*veh, guid))\n+                    {\n+                        if (unit->IsVisible() && unit->isTargetableForAttack(false) && veh->IsValidAttackTarget(unit) &&\n+                            unit->IsInCombat() && (CanSeeEveryone() || (veh->CanSeeOrDetect(unit) && unit->InSamePhase(veh))))\n+                            return unit;\n+                    }\n+                }\n+            }\n+        }\n+    }\n+\n+    float followdist = float (master->GetBotMgr()->GetBotFollowDist() * 2);\n+    if (float distOverride = GetVehicleAttackDistanceOverride())\n+        followdist = distOverride * 2.f;\n+    if (mytar && mytar->IsCreature() && mytar->ToCreature()->GetCreatureTemplate()->rank == CREATURE_ELITE_WORLDBOSS)\n+        followdist *= 1.5f;\n+    else if (mmover->isMoving() && veh->GetMapId() == 578) //oculus\n+        followdist *= 0.5f;\n+\n+    if (mytar && (veh->IsInCombat() || mytar->IsInCombat()) &&\n+        (!masterVeh || !mmover->IsAlive() || mmover->GetDistance(mytar) < followdist) && veh->IsValidAttackTarget(mytar))\n+        return mytar;\n+\n+    if (mmover->IsAlive())\n+    {\n+        if (followdist == 0 || (mytar &&\n+            (mmover->GetDistance(mytar) > followdist || (mmover->GetDistance(mytar) > followdist * 0.75f && !mytar->IsWithinLOSInMap(veh)))))\n+        {\n+            //if (mytar)\n+            //{\n+            //    BOT_LOG_ERROR(\"scripts\", \"_getVehicleTarget %s's veh is too far from master - lost target (%.2f > %.2f)\",\n+            //        me->GetName().c_str(), veh->GetDistance(mmover), followdist);\n+            //}\n+            return nullptr;\n+        }\n+    }\n+\n+    //check targets around\n+    float maxdist = InitAttackRange(followdist, IsRanged());\n+    Unit* t = nullptr;\n+    NearbyHostileVehicleTargetCheck check(veh, maxdist, this);\n+    Bcore::UnitSearcher <NearbyHostileVehicleTargetCheck> searcher(veh, t, check);\n+    Cell::VisitObjects(veh, searcher, maxdist);\n+    //veh->VisitNearbyObject(maxdist, searcher);\n+\n+    return t;\n+}\n+//GETTARGET\n+//Returns attack target or 'no target' and distant check target or 'no target'\n+//All code above 'x = _getTarget() call must not dereference opponent or disttarget since it can be invalid\n+std::tuple<Unit*, Unit*> bot_ai::_getTargets(bool byspell, bool ranged, bool &reset) const\n+{\n+    //if (_evadeMode) //IAmFree() case only\n+    //    return { nullptr, nullptr };\n+\n+    if (!CanBotAttackOnVehicle())\n+        return { nullptr, nullptr };\n+\n+    Unit* mytar = me->GetVictim();\n+\n+    //check if no need to change target\n+    //BOT_LOG_ERROR(\"entities.player\", \"bot_ai::getTarget(): bot: %s\", me->GetName().c_str());\n+\n+    if (mytar && me->HasAuraType(SPELL_AURA_MOD_TAUNT))\n+        return { mytar, mytar };\n+\n+    //Immediate targets\n+    //orders\n+    if (!IAmFree() && HasOrders() && HasRole(BOT_ROLE_DPS) && !me->IsInCombat() && me->getAttackers().empty())\n+    {\n+        if (_orders.front()._type == BOT_ORDER_PULL)\n+        {\n+            ObjectGuid orderTargetGuid = ObjectGuid(_orders.front().params.pullParams.targetGuid);\n+            if (Unit* orderTarget = mytar && mytar->GetGUID() == orderTargetGuid ? mytar : ObjectAccessor::GetUnit(*me, orderTargetGuid))\n+            {\n+                if (CanBotAttack(orderTarget))\n+                    return { orderTarget, nullptr };\n+            }\n+        }\n+    }\n+\n+    //check charmed master\n+    if (!IAmFree() && master->HasAuraType(SPELL_AURA_MOD_CHARM))\n+    {\n+        switch (master->GetAuraEffectsByType(SPELL_AURA_MOD_CHARM).front()->GetId())\n+        {\n+            case 17244:\n+            case 17246: //Possess (Baroness Anastari, Stratholme, 17244 -> 17246)\n+                return { master, master };\n+            default:\n+                break;\n+        }\n+    }\n+\n+    //maps\n+    if (!IAmFree() && me->GetMap()->GetEntry() && !me->GetMap()->GetEntry()->IsWorldMap())\n+    {\n+        static const std::array WMOAreaGroupLashlayer = { 29476u }; // Halls of Strife\n+        static const std::array WMOAreaGroupMarrowgar = { 47833u }; // The Spire\n+        static const std::array WMOAreaGroupSindragosa = { 48066u }; // Frost Queen's Lair\n+        static const std::array WMOAreaGroupLichKing = { 50038u, 50040u }; // The Frozen Throne\n+\n+        static auto isInWMOArea = [this](auto const& ids) {\n+            for (auto wmoId : ids) {\n+                if (wmoId == _lastWMOAreaId)\n+                    return true;\n+            }\n+            return false;\n+        };\n+\n+        // Blackwing Lair\n+        if (me->GetMapId() == 469 && GetBotClass() == BOT_CLASS_ROGUE && !HasRole(BOT_ROLE_DPS) && me->HasStealthAura() && isInWMOArea(WMOAreaGroupLashlayer)) // BWL - Bloodlord Lashlayer\n+            return { nullptr, nullptr };\n+\n+        // Icecrown Citadel - Lord Marrowgar\n+        if (me->GetMapId() == 631 && isInWMOArea(WMOAreaGroupMarrowgar) && me->IsInCombat() && HasRole(BOT_ROLE_DPS) && !IsTank())\n+        {\n+            static const std::array BoneSpikeIds = { CREATURE_ICC_BONE_SPIKE1, CREATURE_ICC_BONE_SPIKE2, CREATURE_ICC_BONE_SPIKE3 };\n+\n+            auto boneSpikeCheck = [this, mydist = 50.f](Unit const* unit) mutable {\n+                if (!unit->IsAlive())\n+                    return false;\n+                for (uint32 bsId : BoneSpikeIds) {\n+                    if (unit->GetEntry() == bsId)  {\n+                        if (HasRole(BOT_ROLE_RANGED))\n+                            return true;\n+                        float dist = me->GetDistance2d(unit);\n+                        if (dist < mydist) {\n+                            mydist = dist;\n+                            return true;\n+                        }\n+                    }\n+                }\n+                return false;\n+            };\n+\n+            std::list<Creature*> cList;\n+            Bcore::CreatureListSearcher searcher(me, cList, boneSpikeCheck);\n+            Cell::VisitObjects(me, searcher, 50.f);\n+\n+            if (Creature* spike = cList.empty() ? nullptr : cList.size() == 1 ? cList.front() :\n+                Bcore::Containers::SelectRandomContainerElement(cList))\n+            {\n+                // Bone Spike is always attackable - no additional checks needed\n+                return { spike, nullptr };\n+            }\n+        }\n+\n+        // Icecrown Citadel - Sindragosa\n+        if (me->GetMapId() == 631 && isInWMOArea(WMOAreaGroupSindragosa)/* &&\n+            (!mytar || (mytar->GetEntry() != CREATURE_ICC_ICE_TOMB1 && mytar->GetEntry() != CREATURE_ICC_ICE_TOMB2 &&\n+            mytar->GetEntry() != CREATURE_ICC_ICE_TOMB3 && mytar->GetEntry() != CREATURE_ICC_ICE_TOMB4))*/)\n+        {\n+            static const std::array IceTombIds = { CREATURE_ICC_ICE_TOMB1, CREATURE_ICC_ICE_TOMB2, CREATURE_ICC_ICE_TOMB3, CREATURE_ICC_ICE_TOMB4 };\n+            static const std::array SindragosaIds = { CREATURE_ICC_SINDRAGOSA1, CREATURE_ICC_SINDRAGOSA2, CREATURE_ICC_SINDRAGOSA3, CREATURE_ICC_SINDRAGOSA4 };\n+\n+            static auto SiItCheck = [=](Unit const* unit) {\n+                if (unit->IsAlive())\n+                {\n+                    for (uint32 itId : IceTombIds)\n+                        if (unit->GetEntry() == itId)\n+                            return true;\n+                    for (uint32 siId : SindragosaIds)\n+                        if (unit->GetEntry() == siId)\n+                            return true;\n+                }\n+                return false;\n+            };\n+\n+            std::list<Creature*> cList;\n+            Bcore::CreatureListSearcher searcher(master, cList, SiItCheck);\n+            Cell::VisitObjects(me, searcher, 200.f);\n+\n+            if (!cList.empty())\n+            {\n+                Creature* sindragosa = nullptr;\n+                Creature* icetomb = nullptr;\n+                for (Creature* siit : cList)\n+                {\n+                    if (!icetomb)\n+                    {\n+                        for (uint32 itId : IceTombIds)\n+                        {\n+                            if (siit->GetEntry() == itId)\n+                            {\n+                                icetomb = siit;\n+                                break;\n+                            }\n+                        }\n+                    }\n+                    if (!sindragosa)\n+                    {\n+                        for (uint32 siId : SindragosaIds)\n+                        {\n+                            if (siit->GetEntry() == siId)\n+                            {\n+                                sindragosa = siit;\n+                                break;\n+                            }\n+                        }\n+                    }\n+                    else\n+                        break;\n+                }\n+\n+                if (icetomb)\n+                {\n+                    bool air_phase = sindragosa && sindragosa->GetReactState() == REACT_PASSIVE;\n+                    uint8 pct = GetHealthPCT(icetomb);\n+                    if (!air_phase || pct > 50)\n+                    {\n+                        if (air_phase || !IsTank())\n+                            return { icetomb, nullptr };\n+                    }\n+                    else if (mytar == icetomb || !master->GetVictim())\n+                    {\n+                        if (IsCasting())\n+                            me->InterruptNonMeleeSpells(false);\n+                        if (botPet && botPet->GetVictim())\n+                            botPet->AttackStop();\n+                        return { nullptr, nullptr };\n+                    }\n+                }\n+            }\n+        }\n+\n+        // Icecrown Citadel - The Lich King\n+        if (me->GetMapId() == 631 && isInWMOArea(WMOAreaGroupLichKing) && me->IsInCombat() && HasRole(BOT_ROLE_DPS) && HasRole(BOT_ROLE_RANGED) && !IsTank())\n+        {\n+            static const std::array IceSphereIds = { CREATURE_ICC_ICE_SPHERE1, CREATURE_ICC_ICE_SPHERE2, CREATURE_ICC_ICE_SPHERE3, CREATURE_ICC_ICE_SPHERE4 };\n+            static const std::array ValkyrShadowguardIds = { CREATURE_ICC_VALKYR_LK1, CREATURE_ICC_VALKYR_LK2, CREATURE_ICC_VALKYR_LK3, CREATURE_ICC_VALKYR_LK4 };\n+\n+            static auto valkyrCheck = [=](Unit const* unit) {\n+                for (uint32 vsId : ValkyrShadowguardIds) {\n+                    if (unit->IsAlive() && unit->GetEntry() == vsId && !unit->HasUnitFlag(UNIT_FLAG_NOT_SELECTABLE))\n+                        return true;\n+                }\n+                return false;\n+            };\n+\n+            Creature* valkyr = nullptr;\n+            Bcore::CreatureSearcher searcher(me, valkyr, valkyrCheck);\n+            Cell::VisitObjects(me, searcher, 50.f);\n+\n+            if (valkyr)\n+                return { valkyr, nullptr };\n+\n+            Unit const* usearcher = master->IsAlive() ? master->ToUnit() : me->ToUnit();\n+            auto iceSphereCheck = [this, usearcher = usearcher, mydist = 30.f](Unit const* unit) mutable {\n+                for (uint32 isId : IceSphereIds) {\n+                    if (unit->IsAlive() && unit->GetEntry() == isId) {\n+                        float dist = usearcher->GetDistance2d(unit);\n+                        if (dist < mydist && (HasRole(BOT_ROLE_RANGED) || dist < 7.f)) {\n+                            mydist = dist;\n+                            return true;\n+                        }\n+                    }\n+                }\n+                return false;\n+            };\n+\n+            Creature* sphere = nullptr;\n+            Bcore::CreatureLastSearcher searcher2(usearcher, sphere, iceSphereCheck);\n+            Cell::VisitObjects(usearcher, searcher2, 30.f);\n+\n+            if (sphere)\n+                return { sphere, nullptr };\n+        }\n+    }\n+\n+    Group const* gr = !IAmFree() ? master->GetGroup() : nullptr;\n+\n+    if (gr && IsOffTank())\n+    {\n+        if (_primaryIconTank >= 0 && BotCfg::GetOffTankTargetIconFlags() & (1u << _primaryIconTank))\n+        {\n+            if (ObjectGuid guid = gr->GetTargetIcons()[_primaryIconTank])\n+            {\n+                if (mytar && mytar->GetGUID() == guid)\n+                    return { mytar, mytar };\n+\n+                if (Unit* unit = ObjectAccessor::GetUnit(*me, guid))\n+                {\n+                    if (unit->IsVisible() && unit->isTargetableForAttack(false) && me->IsValidAttackTarget(unit) &&\n+                        (unit->IsInCombat() || me->IsInCombat() || master->IsInCombat()) && (CanSeeEveryone() || (me->CanSeeOrDetect(unit) && unit->InSamePhase(me))))\n+                    {\n+                        return { unit, unit };\n+                    }\n+                }\n+            }\n+        }\n+\n+        Unit* tankTar = nullptr;\n+        for (auto i : NPCBots::index_array_rev<uint8, TARGET_ICONS_COUNT>)\n+        {\n+            if (i == _primaryIconTank)\n+                continue;\n+\n+            if (BotCfg::GetOffTankTargetIconFlags() & GroupIconsFlags[i])\n+            {\n+                if (ObjectGuid guid = gr->GetTargetIcons()[i])\n+                {\n+                    if (mytar && mytar->GetGUID() == guid && mytar->GetVictim() == me)\n+                    {\n+                        //BOT_LOG_ERROR(\"entities.unit\", \"_getTarget: %s continues %s\", me->GetName().c_str(), mytar->GetName().c_str());\n+                        return { mytar, mytar };\n+                    }\n+\n+                    if (Unit* unit = ObjectAccessor::GetUnit(*me, guid))\n+                    {\n+                        if (unit->IsVisible() && unit->isTargetableForAttack(false) && me->IsValidAttackTarget(unit) &&\n+                            unit->IsInCombat() && (CanSeeEveryone() || (me->CanSeeOrDetect(unit) && unit->InSamePhase(me))))\n+                        {\n+                            //BOT_LOG_ERROR(\"entities.unit\", \"_getTarget: %s found new offtanking icon target %s\", me->GetName().c_str(), unit->GetName().c_str());\n+                            Unit* tempTar = tankTar ? tankTar : unit;\n+                            tankTar = unit;\n+                            Unit* tVic = unit->GetVictim();\n+                            if (!tVic || (tVic != me && tVic->GetVictim() == unit && IsTank(tVic) && IsInBotParty(tVic)))\n+                            {\n+                                //BOT_LOG_ERROR(\"entities.unit\", \"_getTarget: %s skipped %s (%s)\", me->GetName().c_str(), unit->GetName().c_str(), tVic->GetName().c_str());\n+                                tankTar = tempTar;\n+                                continue;\n+                            }\n+                        }\n+                    }\n+                }\n+            }\n+        }\n+        if (tankTar)\n+        {\n+            //BOT_LOG_ERROR(\"entities.unit\", \"_getTarget: %s returning %s\", me->GetName().c_str(), tankTar->GetName().c_str());\n+            return { tankTar, tankTar };\n+        }\n+    }\n+    if (gr && IsTank())\n+    {\n+        if (_primaryIconTank >= 0 && BotCfg::GetTankTargetIconFlags() & (1u << _primaryIconTank))\n+        {\n+            if (ObjectGuid guid = gr->GetTargetIcons()[_primaryIconTank])\n+            {\n+                if (mytar && mytar->GetGUID() == guid)\n+                    return { mytar, mytar };\n+\n+                if (Unit* unit = ObjectAccessor::GetUnit(*me, guid))\n+                {\n+                    if (unit->IsVisible() && unit->isTargetableForAttack(false) && me->IsValidAttackTarget(unit) &&\n+                        (unit->IsInCombat() || me->IsInCombat() || master->IsInCombat()) && (CanSeeEveryone() || (me->CanSeeOrDetect(unit) && unit->InSamePhase(me))))\n+                    {\n+                        return { unit, unit };\n+                    }\n+                }\n+            }\n+        }\n+\n+        Unit* tankTar = nullptr;\n+        for (auto i : NPCBots::index_array_rev<uint8, TARGET_ICONS_COUNT>)\n+        {\n+            if (i == _primaryIconTank)\n+                continue;\n+\n+            if (BotCfg::GetTankTargetIconFlags() & GroupIconsFlags[i])\n+            {\n+                if (ObjectGuid guid = gr->GetTargetIcons()[i])\n+                {\n+                    if (mytar && mytar->GetGUID() == guid && mytar->GetVictim() == me)\n+                    {\n+                        //BOT_LOG_ERROR(\"entities.unit\", \"_getTarget: %s continues %s\", me->GetName().c_str(), mytar->GetName().c_str());\n+                        return { mytar, mytar };\n+                    }\n+\n+                    if (Unit* unit = ObjectAccessor::GetUnit(*me, guid))\n+                    {\n+                        if (unit->IsVisible() && unit->isTargetableForAttack(false) && me->IsValidAttackTarget(unit) &&\n+                            unit->IsInCombat() && (CanSeeEveryone() || (me->CanSeeOrDetect(unit) && unit->InSamePhase(me))))\n+                        {\n+                            //BOT_LOG_ERROR(\"entities.unit\", \"_getTarget: %s found new mtanking icon target %s\", me->GetName().c_str(), unit->GetName().c_str());\n+                            Unit* tempTar = tankTar ? tankTar : unit;\n+                            tankTar = unit;\n+                            Unit* tVic = unit->GetVictim();\n+                            if (!tVic || (tVic != me && tVic->GetVictim() == unit && IsTank(tVic) && IsInBotParty(tVic)))\n+                            {\n+                                //BOT_LOG_ERROR(\"entities.unit\", \"_getTarget: %s skipped %s (%s)\", me->GetName().c_str(), unit->GetName().c_str(), tVic->GetName().c_str());\n+                                tankTar = tempTar;\n+                                continue;\n+                            }\n+                        }\n+                    }\n+                }\n+            }\n+        }\n+        if (tankTar)\n+        {\n+            //BOT_LOG_ERROR(\"entities.unit\", \"_getTarget: %s returning %s\", me->GetName().c_str(), tankTar->GetName().c_str());\n+            return { tankTar, tankTar };\n+        }\n+    }\n+    if (gr)\n+    {\n+        if (_primaryIconDamage >= 0)\n+        {\n+            uint32 iconMask = BotCfg::GetDPSTargetIconFlags();\n+            if (HasRole(BOT_ROLE_RANGED))\n+                iconMask |= BotCfg::GetRangedDPSTargetIconFlags();\n+            if (iconMask & (1u << _primaryIconDamage))\n+            {\n+                if (ObjectGuid guid = gr->GetTargetIcons()[_primaryIconDamage])\n+                {\n+                    if (mytar && mytar->GetGUID() == guid)\n+                        return { mytar, mytar };\n+\n+                    if (Unit* unit = ObjectAccessor::GetUnit(*me, guid))\n+                    {\n+                        if (unit->IsVisible() && unit->isTargetableForAttack(false) && me->IsValidAttackTarget(unit) &&\n+                            (unit->IsInCombat() || me->IsInCombat() || master->IsInCombat()) && (CanSeeEveryone() || (me->CanSeeOrDetect(unit) && unit->InSamePhase(me))))\n+                        {\n+                            return { unit, unit };\n+                        }\n+                    }\n+                }\n+            }\n+        }\n+\n+        for (auto i : NPCBots::index_array_rev<uint8, TARGET_ICONS_COUNT>)\n+        {\n+            if (i == _primaryIconDamage)\n+                continue;\n+\n+            if (ObjectGuid guid = gr->GetTargetIcons()[i])\n+            {\n+                if (HasRole(BOT_ROLE_RANGED) && (BotCfg::GetRangedDPSTargetIconFlags() & GroupIconsFlags[i]))\n+                {\n+                    if (mytar && mytar->GetGUID() == guid)\n+                        return { mytar, mytar };\n+\n+                    if (Unit* unit = ObjectAccessor::GetUnit(*me, guid))\n+                    {\n+                        if (unit->IsVisible() && unit->isTargetableForAttack(false) && me->IsValidAttackTarget(unit) &&\n+                            unit->IsInCombat() && (CanSeeEveryone() || (me->CanSeeOrDetect(unit) && unit->InSamePhase(me))))\n+                        {\n+                            //BOT_LOG_ERROR(\"entities.unit\", \"_getTarget: found rdps icon target %s\", unit->GetName().c_str());\n+                            return { unit, unit };\n+                        }\n+                    }\n+                }\n+                if (BotCfg::GetDPSTargetIconFlags() & GroupIconsFlags[i])\n+                {\n+                    if (mytar && mytar->GetGUID() == guid)\n+                        return { mytar, mytar };\n+\n+                    if (Unit* unit = ObjectAccessor::GetUnit(*me, guid))\n+                    {\n+                        if (unit->IsVisible() && unit->isTargetableForAttack(false) && me->IsValidAttackTarget(unit) &&\n+                            unit->IsInCombat() && (CanSeeEveryone() || (me->CanSeeOrDetect(unit) && unit->InSamePhase(me))))\n+                        {\n+                            //BOT_LOG_ERROR(\"entities.unit\", \"_getTarget: found dps icon target %s\", unit->GetName().c_str());\n+                            return { unit, unit };\n+                        }\n+                    }\n+                }\n+            }\n+        }\n+    }\n+\n+    Unit* u = master->GetVictim();\n+//Disabled due to a bug:\n+//when spell cast is finished target is immideately put in combat which makes bots attack immediately\n+//caster must be put in combat at spell launch\n+//but target must be put in combat at spell hit\n+/*\n+    if (!u && !IAmFree() && master->IsInCombat() && Rand() < 15)\n+    {\n+        for (uint8 i = CURRENT_FIRST_NON_MELEE_SPELL; i != CURRENT_MAX_SPELL; ++i)\n+        {\n+            if (Spell const* spell = master->GetCurrentSpell(CurrentSpellTypes(i)))\n+            {\n+                //if (spell->getState() == SPELL_STATE_FINISHED)\n+                //    continue;\n+\n+                if (mytar && spell->m_targets.GetUnitTargetGUID() == mytar->GetGUID())\n+                {\n+                    u = mytar;\n+                    break;\n+                }\n+\n+                //direct damaging spells\n+                if (!spell->GetSpellInfo()->IsPositive() &&\n+                    (spell->GetSpellInfo()->HasEffect(SPELL_EFFECT_WEAPON_DAMAGE) ||\n+                    spell->GetSpellInfo()->HasEffect(SPELL_EFFECT_SCHOOL_DAMAGE) ||\n+                    spell->GetSpellInfo()->HasEffect(SPELL_EFFECT_WEAPON_DAMAGE_NOSCHOOL)))\n+                {\n+                    Unit* victim = ObjectAccessor::GetUnit(*me, spell->m_targets.GetUnitTargetGUID());\n+                    if (victim && victim->IsInCombat())\n+                    {\n+                        u = victim;\n+                        break;\n+                    }\n+                }\n+            }\n+        }\n+    }\n+*/\n+    if (u && u == mytar && !IAmFree() && u->IsPlayer() && CanBotAttack(u, byspell))\n+    {\n+        //BOT_LOG_ERROR(\"entities.player\", \"bot %s continues attack common target %s\", me->GetName().c_str(), u->GetName().c_str());\n+        return { u, u };//forced\n+    }\n+    //Follow if...\n+    uint8 followdist = IAmFree() ? BotMgr::GetBotFollowDistMax() / 2 : master->GetBotMgr()->GetBotFollowDist();\n+    if (IsWanderer() && me->GetMap()->GetEntry()->IsBattlegroundOrArena())\n+        followdist += 30;\n+    float foldist = _getAttackDistance(float(followdist));\n+    if (!IAmFree() && IsRanged())\n+    {\n+        _extendAttackRange(foldist);\n+        //BOT_LOG_ERROR(\"entities.player\", \"bot %s ranged foldist %.2f spelldist %.2f\", me->GetName().c_str(), foldist, spelldist);\n+    }\n+    bool dropTarget = followdist == 0 && master->IsAlive();\n+    if (!dropTarget && (!u || IAmFree()) && master->IsAlive() && mytar && mytar == opponent)\n+    {\n+        dropTarget = !me->CanSeeOrDetect(mytar) || (IAmFree() ?\n+            me->GetDistance(mytar) > (IsWanderer() ? float(followdist + 10) : foldist) :\n+            HasBotCommandState(BOT_COMMAND_STAY) ?\n+            (!IsRanged() ? !me->IsWithinMeleeRange(mytar) : me->GetDistance(mytar) > foldist) :\n+            (master->GetDistance(mytar) > foldist || (master->GetDistance(mytar) > foldist * 0.75f && !mytar->IsWithinLOSInMap(me, VMAP::ModelIgnoreFlags::M2, LINEOFSIGHT_ALL_CHECKS))));\n+    }\n+    if (dropTarget)\n+    {\n+        //BOT_LOG_ERROR(\"entities.player\", \"bot %s cannot attack target %s, too far away or not in LoS\", me->GetName().c_str(), mytar ? mytar->GetName().c_str() : \"unk\");\n+        mytar = nullptr;\n+    }\n+\n+    if (u && !IAmFree() && (master->IsInCombat() || u->IsInCombat())/* && !InDuel(u)*/ && !IsInBotParty(u) && (BotCfg::IsPvPEnabled() || !u->IsControlledByPlayer()) &&\n+        (!HasBotCommandState(BOT_COMMAND_STAY) || (!IsRanged() ? me->IsWithinMeleeRange(u) : me->GetDistance(u) < foldist)))\n+    {\n+        //BOT_LOG_ERROR(\"entities.player\", \"bot %s starts attack master's target %s\", me->GetName().c_str(), u->GetName().c_str());\n+        return { u, u };\n+    }\n+\n+    bool canAttack = mytar && CanBotAttack(mytar, byspell);\n+    if (canAttack && (!IAmFree() || me->GetDistance(mytar) < float(BOT_MAX_CHASE_RANGE)) &&/* !InDuel(mytar) &&*/\n+        !(mytar->GetVictim() != nullptr && IsTank() && IsTank(mytar->GetVictim())))\n+    {\n+        //BOT_LOG_ERROR(\"entities.player\", \"bot %s continues attack its target %s\", me->GetName().c_str(), mytar->GetName().c_str());\n+        if (me->GetDistance(mytar) > (ranged ? 20.f : 5.f) && !HasBotCommandState(BOT_COMMAND_MASK_UNCHASE))\n+            reset = true;\n+        return { mytar, mytar };\n+    }\n+\n+    //check group\n+    if (!IAmFree())\n+    {\n+        if (!gr)\n+        {\n+            for (auto const& [_, bot] : *master->GetBotMgr()->GetBotMap())\n+            {\n+                if (!bot || bot == me || !bot->InSamePhase(me)) continue;\n+                if (IsTank() && IsTank(bot)) continue;\n+                u = bot->GetVictim();\n+                if (u && (bot->IsInCombat() || u->IsInCombat()) && CanBotAttack(u, byspell))\n+                {\n+                    //BOT_LOG_ERROR(\"entities.player\", \"bot %s hooked %s's victim %s\", me->GetName().c_str(), bot->GetName().c_str(), u->GetName().c_str());\n+                    return { u, u };\n+                }\n+            }\n+        }\n+        else\n+        {\n+            for (GroupReference const* ref = gr->GetFirstMember(); ref != nullptr; ref = ref->next())\n+            {\n+                Player const* pl = ref->GetSource();\n+                if (!pl || !pl->IsInWorld() || pl->IsBeingTeleported()) continue;\n+                if (me->GetMap() != pl->FindMap() || !pl->InSamePhase(me)) continue;\n+                if (IsTank() && IsTank(pl)) continue;\n+                u = pl->GetVictim();\n+                if (u && pl != master && (pl->IsInCombat() || u->IsInCombat()) && CanBotAttack(u, byspell))\n+                {\n+                    //BOT_LOG_ERROR(\"entities.player\", \"bot %s hooked %s's victim %s\", me->GetName().c_str(), pl->GetName().c_str(), u->GetName().c_str());\n+                    return { u, u };\n+                }\n+                if (!pl->HaveBot()) continue;\n+                for (auto const& [_, bot] : *pl->GetBotMgr()->GetBotMap())\n+                {\n+                    if (!bot || bot == me || !bot->InSamePhase(me)) continue;\n+                    if (!bot->IsInWorld()) continue;\n+                    if (me->GetMap() != bot->FindMap()) continue;\n+                    if (IsTank() && IsTank(bot)) continue;\n+                    u = bot->GetVictim();\n+                    if (u && (bot->IsInCombat() || u->IsInCombat()) && CanBotAttack(u, byspell))\n+                    {\n+                        //BOT_LOG_ERROR(\"entities.player\", \"bot %s hooked %s's victim %s\", me->GetName().c_str(), bot->GetName().c_str(), u->GetName().c_str());\n+                        return { u, u };\n+                    }\n+                }\n+            }\n+        }\n+    }\n+    else if (!canAttack)\n+    {\n+        //check attackers\n+        u = nullptr;\n+        for (Unit* att : me->getAttackers())\n+            if (_canSwitchToTarget(u, att, byspell))\n+                u = att;\n+        if (!u && botPet)\n+            for (Unit* att : botPet->getAttackers())\n+                if (_canSwitchToTarget(u, att, byspell))\n+                    u = att;\n+        if (u)\n+            return { u, u };\n+    }\n+\n+    if (IAmFree() && IsWanderer() && !me->IsInCombat() && me->getAttackers().empty() && (evadeDelayTimer > 7500 || Feasting() || me->GetHealthPct() < 85.f))\n+        return { nullptr, nullptr };\n+\n+    //check targets around\n+    float maxdist = InitAttackRange(float(followdist + 10), ranged);\n+    std::array<std::pair<Unit*, float>, 2u> ts{};\n+    std::list<Unit*> unitList;\n+    NearestHostileUnitCheck check(me, maxdist, byspell, this);\n+    Bcore::UnitListSearcher searcher(master->ToUnit(), unitList, check);\n+    Cell::VisitObjects(HasBotCommandState(BOT_COMMAND_STAY) ? me->ToUnit() : master->ToUnit(), searcher, maxdist);\n+\n+    if (IAmFree())\n+    {\n+        decltype(unitList) closeList;\n+        if (IsWanderer())\n+        {\n+            //Try to prioritize flag carrier\n+            if (me->GetMap()->IsBattlegroundOrArena())\n+            {\n+                std::ranges::copy_if(unitList, std::back_inserter(closeList), [=, this](Unit const* fc) {\n+                    return IsFlagCarrier(fc) && CanBotAttack(fc, byspell);\n+                });\n+            }\n+\n+            std::erase_if(unitList, [this](Unit const* unit) {\n+                if (!unit->IsInCombatWith(me) && !(unit->IsNPCBot() && unit->ToCreature()->IsWandererBot()))\n+                {\n+                    if (unit->IsPlayer())\n+                    {\n+                        if (me->GetLevel() + 12 < unit->GetLevel())\n+                            return true;\n+                        if (unit->GetLevel() + 9 < me->GetLevel())\n+                            return true;\n+                    }\n+                    else\n+                    {\n+                        if (me->GetLevel() + (unit->ToCreature()->isElite() ? 3 : 6) < unit->GetLevel())\n+                            return true;\n+                        if (unit->GetLevel() + (unit->ToCreature()->isElite() ? 8 : 4) < me->GetLevel())\n+                            return true;\n+                        if (unit->IsCritter())\n+                            return true;\n+                    }\n+                }\n+                return false;\n+            });\n+        }\n+\n+        for (decltype(unitList)::iterator it = unitList.begin(); it != unitList.end();)\n+        {\n+            if (!CanBotAttack(*it, byspell))\n+                it = unitList.erase(it);\n+            else if (me->GetDistance(*it) < 15.f)\n+            {\n+                closeList.push_back(*it);\n+                it = unitList.erase(it);\n+            }\n+            else\n+                ++it;\n+        }\n+\n+        if (!closeList.empty())\n+        {\n+            ts[0].first = closeList.size() == 1 ? closeList.front() : Bcore::Containers::SelectRandomContainerElement(closeList);\n+            ts[0].second = me->GetDistance(ts[0].first);\n+        }\n+        else if (!unitList.empty())\n+        {\n+            ts[0].first = unitList.size() == 1 ? unitList.front() : Bcore::Containers::SelectRandomContainerElement(unitList);\n+            ts[0].second = me->GetDistance(ts[0].first);\n+        }\n+    }\n+    else\n+    {\n+        bool checkSecondary = !IsRanged() && HasBotCommandState(BOT_COMMAND_STAY);\n+        for (Unit* un : unitList)\n+        {\n+            std::size_t res = !CanBotAttack(un, byspell) ? (checkSecondary && CanBotAttack(un, byspell, checkSecondary)) ? 2 : 0 : 1;\n+            switch (res)\n+            {\n+                case 1: case 2:\n+                    if (!ts[res - 1].first || me->GetDistance(un) < ts[res - 1].second)\n+                        ts[res - 1] = { un, me->GetDistance(un) };\n+                    break;\n+                default:\n+                    break;\n+            }\n+        }\n+    }\n+    Unit* t1 = ts[0].first;\n+    Unit* t2 = ts[1].first;\n+\n+    Unit const* curtar = opponent ? opponent : disttarget ? disttarget : nullptr;\n+    if (t1 && curtar && t1 != curtar)\n+        reset = true;\n+\n+    //Allow free bots to ignore temp invulnerabilities if no other target is present\n+    if (IAmFree() && t1 == nullptr)\n+        t1 = mytar;\n+\n+    //if (t)\n+    //    BOT_LOG_ERROR(\"entities.player\", \"bot %s has found new target %s\", me->GetName().c_str(), t->GetName().c_str());\n+\n+    return { t1, t2 };\n+}\n+//'CanAttack' function\n+//Only called in class ai UpdateAI function\n+//Side effects: opponent, disttarget\n+bool bot_ai::CheckAttackTarget()\n+{\n+    if (IsDuringTeleport()/* || _evadeMode*/)\n+    {\n+        //me->AttackStop(); //already in CombatStop()\n+        me->CombatStop(true);\n+        return false;\n+    }\n+\n+    if (IAmFree() && Feasting())\n+        return false;\n+\n+    bool ranged = HasRole(BOT_ROLE_RANGED);\n+    bool byspell = false;\n+    bool reset = false;\n+\n+    switch (_botclass)\n+    {\n+        case BOT_CLASS_DRUID:\n+            switch (GetBotStance())\n+            {\n+                case DRUID_CAT_FORM:\n+                case DRUID_BEAR_FORM:\n+                    break;\n+                case DRUID_TREE_FORM:\n+                case DRUID_TRAVEL_FORM:\n+                case DRUID_AQUATIC_FORM:\n+                case DRUID_FLIGHT_FORM:\n+                    ranged = true;\n+                    break;\n+                case DRUID_MOONKIN_FORM:\n+                    byspell = true;\n+                    break;\n+                case BOT_STANCE_NONE:\n+                    byspell = ranged && HasRole(BOT_ROLE_DPS);\n+                    break;\n+                default:\n+                    BOT_LOG_ERROR(\"entities.player\", \"bot_ai::CheckAttackTarget(): druid has NYI bot stance {}\", uint32(GetBotStance()));\n+                    break;\n+            }\n+            break;\n+        case BOT_CLASS_PRIEST:\n+        case BOT_CLASS_MAGE:\n+        case BOT_CLASS_WARLOCK:\n+        case BOT_CLASS_SHAMAN:\n+            byspell = ranged && HasRole(BOT_ROLE_DPS);\n+            break;\n+        case BOT_CLASS_SPHYNX:\n+        case BOT_CLASS_ARCHMAGE:\n+        case BOT_CLASS_NECROMANCER:\n+            byspell = HasRole(BOT_ROLE_DPS);\n+            break;\n+        case BOT_CLASS_HUNTER:\n+        case BOT_CLASS_DEATH_KNIGHT:\n+        case BOT_CLASS_PALADIN:\n+        case BOT_CLASS_WARRIOR:\n+        case BOT_CLASS_ROGUE:\n+        case BOT_CLASS_BM:\n+        case BOT_CLASS_DREADLORD:\n+        case BOT_CLASS_SPELLBREAKER:\n+        case BOT_CLASS_DARK_RANGER:\n+        case BOT_CLASS_SEA_WITCH:\n+        case BOT_CLASS_CRYPT_LORD:\n+            break;\n+        default:\n+            BOT_LOG_ERROR(\"entities.player\", \"bot_ai: CheckAttackTarget() - unknown bot class {}\", _botclass);\n+            return false;\n+    }\n+\n+    std::tie(opponent, disttarget) = _getTargets(byspell, ranged, reset);\n+\n+    if (!opponent && !disttarget)\n+    {\n+        //BOT_LOG_ERROR(\"entities.player\", \"bot_ai: CheckAttackTarget() - bot %s lost target\", me->GetName().c_str());\n+        if (me->GetVictim() || me->IsInCombat()/* || !me->GetThreatManager().isThreatListEmpty()*/)\n+        {\n+            //BOT_LOG_ERROR(\"entities.player\", \"bot_ai: CheckAttackTarget() - bot %s Evades\", me->GetName().c_str());\n+            if (me->GetVictim())\n+                me->AttackStop();\n+            else if (me->IsInCombat())\n+                Evade();\n+        }\n+\n+        _lastTargetGuid = ObjectGuid::Empty;\n+        return false;\n+    }\n+\n+    Unit* mytar = opponent ? opponent : disttarget;\n+    //boss engage phase // CanHaveThreatList checks for typeid == UNIT\n+    if (GetEngageTimer() > lastdiff)\n+        return false;\n+    else if (!IsTank() && mytar != me->GetVictim() && mytar->GetVictim() && mytar->CanHaveThreatList() &&\n+        mytar->ToCreature()->GetCreatureTemplate()->rank == CREATURE_ELITE_WORLDBOSS && me->GetMap()->IsRaid())\n+    {\n+        uint32 threat = uint32(mytar->ToCreature()->GetThreatMgr().GetThreat(mytar->GetVictim()));\n+        if (threat < std::min<uint32>(50000, mytar->GetVictim()->GetMaxHealth() / 2))\n+            return false;\n+    }\n+\n+    if (reset)\n+        SetBotCommandState(BOT_COMMAND_COMBATRESET);//reset AttackStart()\n+\n+    if (mytar != me->GetVictim())\n+        me->Attack(mytar, !ranged);\n+\n+    return true;\n+}\n+//IMMEDIATE TARGETS\n+bool bot_ai::ProcessImmediateNonAttackTarget()\n+{\n+    if ((me->GetMap()->GetEntry() && me->GetMap()->GetEntry()->IsWorldMap()) || IAmFree() || IsCasting())\n+        return false;\n+\n+    static constexpr std::array<uint32, 1> WMOAreaGroupLashlayer = { 29476 }; // Halls of Strife\n+    static constexpr std::array<uint32, 2> WMOAreaGroupMuru = { 41736, 42759 }; // Shrine of the Eclipse\n+    static constexpr std::array<uint32, 2> WMOAreaGroupNajentus = { 41129, 41130 }; // Karabor Sewers\n+    static constexpr std::array<uint32, 1> WMOAreaGroupVashj = { 37594 }; // Serpentshrine Cavern\n+    static constexpr std::array<uint32, 2> WMOAreaGroupSvalna = { 48061, 48335 }; // The Frostwing Halls\n+\n+    static auto isInWMOArea = [](auto lastWMO, auto const& ids) {\n+        for (auto wmoId : ids) {\n+            if (wmoId == lastWMO)\n+                return true;\n+        }\n+        return false;\n+    };\n+\n+    if (me->GetMapId() == 469 && GetBotClass() == BOT_CLASS_ROGUE && isInWMOArea(_lastWMOAreaId, WMOAreaGroupLashlayer)) // BWL - Bloodlord Lashlayer\n+    {\n+        static const uint32 SPELL_DISARM_TRAP_1 = 1842u;\n+\n+        if (!IsCasting() && IsSpellReady(SPELL_DISARM_TRAP_1, lastdiff, false) && (me->HasAuraType(SPELL_AURA_MOD_STEALTH) || IsSpellReady(1784, lastdiff, false)) && Rand() < 20) // Stealth\n+        {\n+            SpellInfo const* disarmTrapSpellInfo = sSpellMgr->AssertSpellInfo(SPELL_DISARM_TRAP_1);\n+            float max_range = disarmTrapSpellInfo->GetMaxRange();\n+            ApplyBotSpellRangeMods(disarmTrapSpellInfo, max_range);\n+\n+            std::list<GameObject*> goList;\n+            Bcore::AllGameObjectsWithEntryInRange check(me, 179784, max_range); // Suppression Device\n+            Bcore::GameObjectListSearcher<Bcore::AllGameObjectsWithEntryInRange> searcher(me, goList, check);\n+            Cell::VisitObjects(me, searcher, max_range);\n+\n+            std::erase_if(goList, [](GameObject const* gobject) { return gobject->HasGameObjectFlag(GO_FLAG_NOT_SELECTABLE); });\n+\n+            if (GameObject* device = goList.empty() ? nullptr : goList.size() == 1u ? goList.front() : Bcore::Containers::SelectRandomContainerElement(goList))\n+            {\n+                if (me->HasAuraType(SPELL_AURA_MOD_STEALTH) || doCast(me, GetSpell(1784)))\n+                me->CastSpell(device, SPELL_DISARM_TRAP_1, false);\n+                return true;\n+            }\n+        }\n+    }\n+\n+    if (me->GetMapId() == 580 && isInWMOArea(_lastWMOAreaId, WMOAreaGroupMuru)) // Sunwell - M'uru\n+    {\n+        static const uint32 SPELL_PURGE_1 = 370u;\n+        static const uint32 SPELL_DISPEL_MAGIC_1 = 527u;\n+        uint32 dspell = 0;\n+        if (_botclass == BOT_CLASS_SHAMAN)\n+            dspell = SPELL_PURGE_1;\n+        else if (_botclass == BOT_CLASS_PRIEST)\n+            dspell = SPELL_DISPEL_MAGIC_1;\n+\n+        if (dspell && IsSpellReady(dspell, lastdiff))\n+        {\n+            std::list<Creature*> cList;\n+            Bcore::AllCreaturesOfEntryInRange check(me, 25744, 30.f); // Dark Fiend\n+            Bcore::CreatureListSearcher<Bcore::AllCreaturesOfEntryInRange> searcher(me, cList, check);\n+            Cell::VisitObjects(me, searcher, 30.f);\n+\n+            //Dark Fiends do not die instantly, remove purged ones\n+            std::erase_if(cList, Bcore::UnitAuraCheck(false, 45934)); // \"Dark Fiend\"\n+\n+            if (Unit* fiend = cList.empty() ? nullptr : cList.size() == 1u ? cList.front() :\n+                Bcore::Containers::SelectRandomContainerElement(cList))\n+            {\n+                if (CheckBotCast(fiend, GetSpell(dspell)) == SPELL_CAST_OK)\n+                    if (doCast(fiend, GetSpell(dspell)))\n+                        return true;\n+            }\n+        }\n+    }\n+    if (me->GetMapId() == 564 && isInWMOArea(_lastWMOAreaId, WMOAreaGroupNajentus) && Rand() < 10) // Black Temple - High Warlord Naj'entus\n+    {\n+        if (Group const* gr = master->GetGroup())\n+        {\n+            if (Rand() < 4)\n+            {\n+                InstanceScript* iscript = me->GetMap()->ToInstanceMap()->GetInstanceScript();\n+                Creature* najentus = iscript ? iscript->GetCreature(0) : nullptr; // boss_warlord_najentus.cpp::DATA_HIGH_WARLORD_NAJENTUS\n+                if (!najentus)\n+                {\n+                    static const uint32 CREATURE_HIGH_WARLORD_NAJENTUS = 22887u;\n+                    Bcore::AllCreaturesOfEntryInRange check(master, CREATURE_HIGH_WARLORD_NAJENTUS, 60.f);\n+                    Bcore::CreatureSearcher<Bcore::AllCreaturesOfEntryInRange> searcher(master, najentus, check);\n+                    Cell::VisitObjects(master, searcher, 60.f);\n+                }\n+\n+                if (najentus && najentus->HasAuraTypeWithMiscvalue(SPELL_AURA_SCHOOL_IMMUNITY, 127)) // Tidal Shield\n+                {\n+                    //Try to grab spines from corpses of dead players\n+                    std::vector<Player*> spiners;\n+                    for (GroupReference const* itr = gr->GetFirstMember(); itr != nullptr; itr = itr->next())\n+                    {\n+                        Player* pl = itr->GetSource();\n+                        if (pl && pl->IsInWorld() && me->GetMap() == pl->FindMap() && !pl->IsAlive() &&\n+                            me->GetDistance(pl) < 25.f && pl->HasItemCount(32408)) // Naj'entus Spine\n+                            spiners.push_back(pl);\n+                    }\n+\n+                    if (Player* pl = spiners.empty() ? nullptr : spiners.size() == 1u ? spiners.front() :\n+                        Bcore::Containers::SelectRandomContainerElement(spiners))\n+                    {\n+                        BotWhisper(\"Taking 1 Naj'entus Spine from you\");\n+                        me->CastSpell(najentus, 39948, true); // Hurl Spine\n+                        pl->DestroyItemCount(32408, 1, true); // Naj'entus Spine\n+                    }\n+                }\n+            }\n+\n+            std::vector<Unit*> spines;\n+            //Find and free impaled player (player gets the spine)\n+            for (GroupReference const* itr = gr->GetFirstMember(); itr != nullptr; itr = itr->next())\n+            {\n+                Player* pl = itr->GetSource();\n+                //We don't make bots run to player to \"click\" the spine, so range is rather big\n+                if (pl && pl->IsInWorld() && me->GetMap() == pl->FindMap())\n+                {\n+                    auto is_impaled = [this](Unit const* unit) -> bool {\n+                        return unit->IsAlive() && unit->HasUnitState(UNIT_STATE_STUNNED) &&\n+                            me->GetDistance(unit) < 25.f && unit->HasAura(39837); // \"Impaling Spine\"\n+                    };\n+\n+                    if (is_impaled(pl))\n+                        spines.push_back(pl->ToUnit());\n+                    if (pl->HaveBot())\n+                    {\n+                        for (auto const& [_, bot] : *pl->GetBotMgr()->GetBotMap())\n+                        {\n+                            if (bot && is_impaled(bot))\n+                                spines.push_back(bot->ToUnit());\n+                        }\n+                    }\n+                }\n+            }\n+\n+            if (Unit* u = spines.empty() ? nullptr : spines.size() == 1u ? spines.front() :\n+                Bcore::Containers::SelectRandomContainerElement(spines))\n+            {\n+                GameObject* spine = u->GetFirstGameObjectById(185584); // Naj'entus Spine\n+                if (!spine)\n+                {\n+                    Bcore::GameObjectInRangeCheck check(u->GetPositionX(), u->GetPositionY(), u->GetPositionZ(), 5.f, 185584);\n+                    Bcore::GameObjectLastSearcher<Bcore::GameObjectInRangeCheck> searcher(u, spine, check);\n+                    Cell::VisitObjects(u, searcher, 5.f);\n+                }\n+                if (spine && spine->getLootState() != GO_JUST_DEACTIVATED)\n+                {\n+                    Player* receiver = u->GetTypeId() == TYPEID_PLAYER ? u->ToPlayer() : master;\n+                    u->RemoveAurasDueToSpell(39837); // Remove Impaling Spine aura since it doesn't work at all right now\n+                    spine->SetLootState(GO_JUST_DEACTIVATED);\n+                    receiver->AddItem(32408, 1); // Naj'entus Spine\n+                    return true;\n+                }\n+            }\n+        }\n+    }\n+\n+    if (me->GetMapId() == 548 && isInWMOArea(_lastWMOAreaId, WMOAreaGroupVashj) && Rand() < 15) // Serpentshrine Cavern - Lady Vashj\n+    {\n+        uint32 alive_players = 0;\n+        std::vector<Player*> taintPlayers;\n+        for (MapReference const& ref : me->GetMap()->GetPlayers())\n+        {\n+            if (Player* player = ref.GetSource())\n+            {\n+                if (player->IsAlive())\n+                    ++alive_players;\n+                if (player->HasAuraType(SPELL_AURA_MOD_ROOT) && me->IsWithinDistInMap(player, 20.0f) &&\n+                    player->HasItemCount(31088, 1)) // Tainted Core\n+                    taintPlayers.push_back(player);\n+            }\n+        }\n+\n+        if (!taintPlayers.empty() && alive_players <= 1)\n+        {\n+#if defined(TRINITY_COMPILER)\n+            static const uint32 ShieldGeneratorTriggerNPC = 19870;\n+#elif defined(AC_COMPILER)\n+            static const uint32 ShieldGeneratorTriggerNPC = WORLD_TRIGGER;\n+#endif\n+            std::list<Creature*> cList;\n+            Bcore::AllCreaturesOfEntryInRange check(me, ShieldGeneratorTriggerNPC, 100.f); // Invis KV Shield Generator\n+            Bcore::CreatureListSearcher<Bcore::AllCreaturesOfEntryInRange> csearcher(me, cList, check);\n+            Cell::VisitObjects(me, csearcher, 100.f);\n+\n+            std::list<GameObject*> gList;\n+            auto is_shield_go = [](GameObject const* gobject) {\n+                switch (gobject->GetEntry())\n+                {\n+                    case 185051:\n+                    case 185052:\n+                    case 185053:\n+                    case 185054:\n+                        return true;\n+                    default:\n+                        return false;\n+                }\n+            };\n+            Bcore::GameObjectListSearcher gsearcher(me, gList, is_shield_go);\n+            Cell::VisitObjects(me, gsearcher, 100.f);\n+\n+            static const auto get_shield_creature = [](GameObject const* gobject, std::list<Creature*> const& clist) {\n+                Creature* c = nullptr;\n+                float mindist = 10.0f;\n+                for (Creature* creature : clist)\n+                {\n+                    float dist = gobject->GetDistance(creature);\n+                    if (dist < mindist)\n+                    {\n+                        c = creature;\n+                        mindist = dist;\n+                    }\n+                }\n+                return c;\n+            };\n+\n+            std::erase_if(gList, [&cList](GameObject const* gobject) {\n+                Creature const* c = get_shield_creature(gobject, cList);\n+                return !c || c->GetCurrentSpell(CURRENT_CHANNELED_SPELL) == nullptr;\n+            });\n+            std::erase_if(cList, [](Creature const* creature) {\n+                return creature->GetCurrentSpell(CURRENT_CHANNELED_SPELL) == nullptr;\n+            });\n+\n+            ASSERT(cList.size() == gList.size());\n+\n+            if (!gList.empty())\n+            {\n+                Player* player = taintPlayers.size() == 1u ? taintPlayers.front() : Bcore::Containers::SelectRandomContainerElement(taintPlayers);\n+                BotWhisper(\"Taking Tainted Core from you\");\n+                GameObject* go = gList.size() == 1u ? gList.front() : Bcore::Containers::SelectRandomContainerElement(gList);\n+#if defined(TRINITY_COMPILER)\n+                Item* item = player->GetItemByEntry(31088); // Tainted Core\n+                SpellCastTargets targets;\n+                targets.SetGOTarget(go);\n+                sScriptMgr->OnItemUse(player, item, targets);\n+#elif defined(AC_COMPILER)\n+                Creature* cre = get_shield_creature(go, cList);\n+                ASSERT(cre);\n+                cre->DespawnOrUnsummon(1ms);\n+                player->DestroyItemCount(31088, 1, true); // Tainted Core\n+#endif\n+                return true;\n+            }\n+        }\n+    }\n+\n+    if (me->GetMapId() == 631 && isInWMOArea(_lastWMOAreaId, WMOAreaGroupSvalna) && Rand() < 10) // Icecrown Citadel - Sister Svalna\n+    {\n+        if (Group const* gr = master->GetGroup())\n+        {\n+            if (Rand() < 4)\n+            {\n+                InstanceScript* iscript = me->GetMap()->ToInstanceMap()->GetInstanceScript();\n+                Creature* svalna = iscript ? iscript->GetCreature(9) : nullptr; // icecrown_citadel.h::DATA_SISTER_SVALNA\n+                if (!svalna)\n+                {\n+                    static const uint32 CREATURE_SISTER_SVALNA_N = 37126;\n+                    static const uint32 CREATURE_SISTER_SVALNA_H = 37126; //Acore - same id is used\n+                    Bcore::AllCreaturesOfEntryInRange check(master, me->GetMap()->IsHeroic() ? CREATURE_SISTER_SVALNA_H : CREATURE_SISTER_SVALNA_N, 60.f);\n+                    Bcore::CreatureSearcher<Bcore::AllCreaturesOfEntryInRange> searcher(master, svalna, check);\n+                    Cell::VisitObjects(master, searcher, 60.f);\n+                }\n+\n+                if (svalna && svalna->HasAuraTypeWithMiscvalue(SPELL_AURA_SCHOOL_IMMUNITY, 127)) // Aether Shield\n+                {\n+                    //Try to grab spears from corpses of dead players\n+                    std::vector<Player*> spearers;\n+                    for (GroupReference const* itr = gr->GetFirstMember(); itr != nullptr; itr = itr->next())\n+                    {\n+                        Player* pl = itr->GetSource();\n+                        if (pl && pl->IsInWorld() && me->GetMap() == pl->FindMap() && !pl->IsAlive() &&\n+                            me->GetDistance(pl) < 25.f && pl->HasItemCount(50307)) // Infernal Spear\n+                            spearers.push_back(pl);\n+                    }\n+\n+                    if (Player* pl = spearers.empty() ? nullptr : spearers.size() == 1u ? spearers.front() :\n+                        Bcore::Containers::SelectRandomContainerElement(spearers))\n+                    {\n+                        BotWhisper(\"Taking 1 Infernal Spear from you\");\n+                        me->CastSpell(svalna, 71466, true); // Hurl Spear\n+                        pl->DestroyItemCount(50307, 1, true); // Infernal Spear\n+                    }\n+                }\n+            }\n+\n+            auto is_impaled = [this](Unit const* unit) -> bool {\n+                return unit->IsAlive() && unit->HasUnitState(UNIT_STATE_STUNNED) &&\n+                    me->GetDistance(unit) < 25.f && unit->HasAura(71443); // \"Impaling Spear\"\n+            };\n+\n+            std::vector<Unit*> spears;\n+            //Find and free impaled player (player gets the spear)\n+            for (GroupReference const* itr = gr->GetFirstMember(); itr != nullptr; itr = itr->next())\n+            {\n+                Player* pl = itr->GetSource();\n+                //We don't make bots run to player to \"click\" the spine, so range is rather big\n+                if (pl && pl->IsInWorld() && me->GetMap() == pl->FindMap())\n+                {\n+\n+                    if (is_impaled(pl))\n+                        spears.push_back(pl->ToUnit());\n+                    if (pl->HaveBot())\n+                    {\n+                        for (auto const& [_, bot] : *pl->GetBotMgr()->GetBotMap())\n+                        {\n+                            if (bot && is_impaled(bot))\n+                                spears.push_back(bot->ToUnit());\n+                        }\n+                    }\n+                }\n+            }\n+\n+            if (Unit* u = spears.empty() ? nullptr : spears.size() == 1u ? spears.front() :\n+                Bcore::Containers::SelectRandomContainerElement(spears))\n+            {\n+                Creature* spear = nullptr;\n+                Bcore::NearestCreatureEntryWithLiveStateInObjectRangeCheck check(*u, 38248, true, 5.f);\n+                Bcore::CreatureSearcher<Bcore::NearestCreatureEntryWithLiveStateInObjectRangeCheck> searcher(u, spear, check);\n+                Cell::VisitObjects(u, searcher, 5.f);\n+\n+                if (spear)\n+                {\n+                    Player* receiver = u->IsPlayer() ? u->ToPlayer() : master;\n+                    me->CastSpell(spear, 71462, true); // \"Remove Spear\"\n+                    receiver->AddItem(50307, 1); // Infernal Spear\n+                    return true;\n+                }\n+            }\n+        }\n+    }\n+\n+    return false;\n+}\n+//POSITION\n+AoeSpotsVec const& bot_ai::GetAoeSpots() const\n+{\n+    return IAmFree() ? _aoeSpots : master->GetBotMgr()->GetAoeSpots();\n+}\n+\n+void bot_ai::CalculateAoeSpots(Unit const* unit, AoeSpotsVec& spots)\n+{\n+    spots.clear();\n+\n+    std::list<WorldObject*> doList;\n+    NearbyHostileAoEDynobjectCheck check(unit, 60.f);\n+    Bcore::WorldObjectListSearcher searcher(unit, doList, check, GRID_MAP_TYPE_MASK_DYNAMICOBJECT);\n+    Cell::VisitObjects(unit, searcher, 60.f);\n+\n+    //filter and add to list\n+    SpellInfo const* spellInfo;\n+    for (WorldObject const* wObj : doList)\n+    {\n+        DynamicObject const* dObj = wObj->ToDynObject();\n+        ASSERT_NODEBUGINFO(dObj);\n+        ASSERT_NODEBUGINFO(dObj->GetSpellId());\n+        spellInfo = sSpellMgr->GetSpellInfo(dObj->GetSpellId());\n+        if (IsPeriodicDynObjAOEDamage(spellInfo))\n+        {\n+            float radius = dObj->GetRadius() + DEFAULT_WORLD_OBJECT_SIZE;\n+            radius += (unit->GetVehicle() ? unit->GetVehicleBase()->GetCombatReach() : DEFAULT_COMBAT_REACH) * 1.2f;\n+            spots.emplace_back(*dObj, radius);\n+        }\n+    }\n+\n+    if (unit->IsNPCBot() && unit->ToCreature()->IsFreeBot())\n+        return;\n+\n+    //Additional: aoe coming from spawned npcs\n+\n+    //Molten Core\n+    if (unit->GetMapId() == 409)\n+    {\n+        std::list<GameObject*> gListMC;\n+        Bcore::AllGameObjectsWithEntryInRange checkMC(unit, GAMEOBJECT_HOT_COAL, 60.f);\n+        Bcore::GameObjectListSearcher searcherMC(unit, gListMC, checkMC);\n+        Cell::VisitObjects(unit, searcherMC, 60.f);\n+\n+        if (!gListMC.empty())\n+        {\n+            float radius = 15.0f + DEFAULT_COMBAT_REACH;\n+            for (GameObject const* go : gListMC)\n+                spots.emplace_back(*go, radius);\n+        }\n+    }\n+    // Ruins of Ahn'Qiraj (AQ20) — Sand Trap avoidance\n+    else if (unit->GetMapId() == 509)\n+    {\n+        std::list<GameObject*> sandTrapList;\n+        Bcore::AllGameObjectsWithEntryInRange trapCheck(unit, GAMEOBJECT_SAND_TRAP, 60.f);\n+        Bcore::GameObjectListSearcher trapSearcher(unit, sandTrapList, trapCheck);\n+        Cell::VisitObjects(unit, trapSearcher, 40.f);\n+\n+        if (!sandTrapList.empty())\n+        {\n+            float radius = 12.0f + DEFAULT_COMBAT_REACH * 1.2f;\n+            for (GameObject const* go : sandTrapList)\n+                spots.emplace_back(*go, radius);\n+        }\n+    }\n+    //Temple of Ahn'Qiraj (AQ40) — Mutating bugs exploding\n+    else if (unit->GetMapId() == 531)\n+    {\n+        static const uint32 AURA_EXPLODE = 804;\n+        static const std::array<uint32, 2> MutatingBugIds = { CREATURE_MUTATING_BUG_1, CREATURE_MUTATING_BUG_2 };\n+        std::list<Creature*> cList;\n+        auto bug_check = [](Creature const* c) {\n+            return c && c->IsAlive() && std::ranges::find(MutatingBugIds, c->GetEntry()) != MutatingBugIds.cend() && c->HasAura(AURA_EXPLODE);\n+        };\n+        Bcore::CreatureListSearcher bugSearcher(unit, cList, bug_check);\n+        Cell::VisitObjects(unit, bugSearcher, 60.f);\n+\n+        if (!cList.empty())\n+        {\n+            float explodeRadius = sSpellMgr->AssertSpellInfo(AURA_EXPLODE)->Effects[0].CalcRadius();\n+            float radius = explodeRadius + DEFAULT_COMBAT_REACH * 1.5f;\n+            for (Creature const* c : cList)\n+                spots.emplace_back(*c, radius);\n+        }\n+    }\n+    // The Blood Furnace — Proximity Bombs\n+    else if (unit->GetMapId() == 542)\n+    {\n+        std::list<GameObject*> proximityBombList;\n+        static const std::array<uint32, 2> ProximityBombIds = { GAMEOBJECT_PROXIMITY_BOMB_N, GAMEOBJECT_PROXIMITY_BOMB_N };\n+        auto bomb_check = [](GameObject const* go) { return go && std::ranges::find(ProximityBombIds, go->GetEntry()) != ProximityBombIds.cend(); };\n+        Bcore::GameObjectListSearcher bombSearcher(unit, proximityBombList, bomb_check);\n+        Cell::VisitObjects(unit, bombSearcher, 40.f);\n+\n+        if (!proximityBombList.empty())\n+        {\n+            for (GameObject const* go : proximityBombList)\n+            {\n+                float radius = 10.0f + go->GetObjectSize() + DEFAULT_COMBAT_REACH * 1.5f;\n+                spots.emplace_back(*go, radius);\n+            }\n+        }\n+    }\n+    // Hellfire Ramparts — Liquid Fire puddles\n+    if (unit->GetMapId() == 543) // Hellfire Ramparts\n+    {\n+        std::list<GameObject*> liquidFireList;\n+        static const std::array<uint32, 3> LiquidFireIds = { GAMEOBJECT_LIQUID_FIRE_1, GAMEOBJECT_LIQUID_FIRE_2, GAMEOBJECT_LIQUID_FIRE_3 };\n+        auto fire_check = [](GameObject const* go) { return go && std::ranges::find(LiquidFireIds, go->GetEntry()) != LiquidFireIds.cend(); };\n+        Bcore::GameObjectListSearcher fireSearcher(unit, liquidFireList, fire_check);\n+        Cell::VisitObjects(unit, fireSearcher, 40.f);\n+\n+        if (!liquidFireList.empty())\n+        {\n+            for (GameObject const* go : liquidFireList)\n+            {\n+                float radius = 10.0f + go->GetObjectSize() + DEFAULT_COMBAT_REACH * 1.5f;\n+                spots.emplace_back(*go, radius);\n+            }\n+        }\n+    }\n+    //Aucheai Crypts\n+    else if (unit->GetMapId() == 558)\n+    {\n+        Creature* creature = nullptr;\n+        static const auto focus_fire_check = [](Creature const* c) {\n+            return (c->GetEntry() == CREATURE_FOCUS_FIRE_N || c->GetEntry() == CREATURE_FOCUS_FIRE_H);\n+        };\n+        Bcore::CreatureSearcher searcher2(unit, creature, focus_fire_check);\n+        Cell::VisitObjects(unit, searcher2, 50.f);\n+\n+        if (creature)\n+        {\n+            spellInfo = sSpellMgr->GetSpellInfo(32302); //Fiery Blast\n+            float radius = spellInfo->Effects[0].CalcRadius() + DEFAULT_COMBAT_REACH * 2.0f;\n+            spots.emplace_back(*creature, radius);\n+        }\n+    }\n+    //The Eye of Eternity\n+    else if (unit->GetMapId() == 616 && unit->GetVehicle())\n+    {\n+        std::list<Creature*> cList;\n+        Bcore::AllCreaturesOfEntryInRange check2(unit->GetVehicleBase(), CREATURE_EOE_STATIC_FIELD, 60.f);\n+        Bcore::CreatureListSearcher<Bcore::AllCreaturesOfEntryInRange> searcher2(unit->GetVehicleBase(), cList, check2);\n+        //unit->GetVehicleBase()->VisitNearbyObject(60.f, searcher2);\n+        Cell::VisitObjects(unit->GetVehicleBase(), searcher2, 60.f);\n+\n+        spellInfo = sSpellMgr->GetSpellInfo(57429); //Static Field damage\n+        float radius = spellInfo->GetEffect(EFFECT_0).CalcRadius() + unit->GetVehicleBase()->GetCombatReach() * 1.2f;\n+        for (Creature const* c : cList)\n+            spots.emplace_back(*c, radius);\n+    }\n+    //Magister's Terrace\n+    else if (unit->GetMapId() == 585)\n+    {\n+        std::list<Creature*> cList;\n+        static const auto kael_aoe_check = [](Creature const* c) {\n+            return (c->GetEntry() == CREATURE_MT_PHOENIX || c->GetEntry() == CREATURE_MT_ARCANE_SPHERE_N || c->GetEntry() == CREATURE_MT_ARCANE_SPHERE_H);\n+        };\n+        Bcore::CreatureListSearcher searcher3(unit, cList, kael_aoe_check);\n+        Cell::VisitObjects(unit, searcher3, 40.f);\n+\n+        if (!cList.empty())\n+        {\n+            spellInfo = sSpellMgr->GetSpellInfo(44198); //Burn damage (44197 -> 44198)\n+            float radius = spellInfo->Effects[0].CalcRadius() + DEFAULT_COMBAT_REACH * 3.0f;\n+            for (Creature const* c : cList)\n+                spots.emplace_back(*c, radius);\n+        }\n+    }\n+    //Zul'Aman\n+    else if (unit->GetMapId() == 568)\n+    {\n+        std::list<Creature*> cList;\n+        Bcore::AllCreaturesOfEntryInRange check2(unit, CREATURE_ZA_FIRE_BOMB, 40.f);\n+        Bcore::CreatureListSearcher searcher2(unit, cList, check2);\n+        Cell::VisitObjects(unit, searcher2, 40.f);\n+\n+        if (!cList.empty())\n+        {\n+            spellInfo = sSpellMgr->GetSpellInfo(42630); //Fire Bomb\n+            float radius = spellInfo->Effects[0].CalcRadius() + DEFAULT_COMBAT_REACH * 1.2f;\n+            for (Creature const* c : cList)\n+                spots.emplace_back(*c, radius);\n+        }\n+    }\n+    //Uthgarde Keep\n+    else if (unit->GetMapId() == 574)\n+    {\n+        Creature* creature = nullptr;\n+        static const auto shadow_axe_check = [](Creature const* c) {\n+            return (c->GetEntry() == CREATURE_UK_SHADOW_AXE_N || c->GetEntry() == CREATURE_UK_SHADOW_AXE_H);\n+        };\n+        Bcore::CreatureSearcher searcher2(unit, creature, shadow_axe_check);\n+        Cell::VisitObjects(unit, searcher2, 40.f);\n+\n+        if (creature)\n+        {\n+            spellInfo = sSpellMgr->GetSpellInfo(42751); //Shadow Axe\n+            float radius = spellInfo->Effects[0].CalcRadius() + DEFAULT_COMBAT_REACH * 2.0f;\n+            spots.emplace_back(*creature, radius);\n+        }\n+    }\n+    //Icecrown Citadel\n+    else if (unit->GetMapId() == 631)\n+    {\n+        std::list<Creature*> cList;\n+        Bcore::AllCreaturesOfEntryInRange check2(unit, CREATURE_ICC_OOZE_PUDDLE, 50.f);\n+        Bcore::CreatureListSearcher searcher2(unit, cList, check2);\n+        Cell::VisitObjects(unit, searcher2, 50.f);\n+\n+        for (Creature const* c : cList)\n+        {\n+            float radius = c->GetObjectScale() * 2.5f + DEFAULT_COMBAT_REACH * 3.f; //grows\n+            spots.emplace_back(*c, radius);\n+        }\n+    }\n+\n+    //STUB\n+    //if (!unit->IsPlayer() || !unit->ToPlayer()->HaveBot())\n+    //    return;\n+\n+    //switch (unit->GetMapId())\n+    //{\n+    //    case 409: //Molten Core\n+    //        break;\n+    //    default:\n+    //        return;\n+    //}\n+\n+    //BotMap const* bmap = unit->ToPlayer()->GetBotMgr()->GetBotMap();\n+    //for (BotMap::const_iterator itr = bmap->begin(); itr != bmap->end(); ++itr)\n+    //{\n+    //    if (itr->second && itr->second->IsInWorld() && itr->second->IsAlive())\n+    //    {\n+    //        // Living Bomb\n+    //        if (unit->GetMapId() == 409 && !!itr->second->GetAuraEffect(SPELL_AURA_PERIODIC_TRIGGER_SPELL, SPELLFAMILY_GENERIC, 1646, 0))\n+    //            spots.push_back(AoeSpotsVec::value_type(itr->second->GetPosition(), 18.0));\n+    //    }\n+    //}\n+}\n+\n+AoeSafeSpotsVec bot_ai::CalculateAoeSafeSpots(Unit* target, float maxdist) const\n+{\n+    AoeSafeSpotsVec safespots;\n+    if (!GetAoeSpots().empty())\n+    {\n+        //find 200 safe spots\n+        const float distdelta = maxdist / 200.f;\n+        const float angledelta = float(M_PI) / 12.5f;\n+        float aoedist = 0.f;\n+        for ([[maybe_unused]] auto i : NPCBots::index_array<uint8, 8>)\n+        {\n+            float aoeangle = 0.0f;\n+            for ([[maybe_unused]] auto j : NPCBots::index_array<uint8, 25>)\n+            {\n+                aoedist += distdelta;\n+                aoeangle += angledelta;\n+\n+                Position ppos = target->GetFirstCollisionPosition(aoedist, Position::NormalizeOrientation(aoeangle - target->GetOrientation()));\n+                bool toofaraway = master->GetDistance(ppos) > maxdist;\n+\n+                if (!toofaraway && !IsWithinAoERadius(ppos))\n+                    safespots.push_back(ppos);\n+            }\n+        }\n+    }\n+    return safespots;\n+}\n+\n+bool bot_ai::IsPeriodicDynObjAOEDamage(SpellInfo const* spellInfo)\n+{\n+    if (!spellInfo->IsPositive())\n+    {\n+        for (auto i : NPCBots::index_array<uint8, MAX_SPELL_EFFECTS>)\n+        {\n+            if (spellInfo->Effects[i].Effect == SPELL_EFFECT_PERSISTENT_AREA_AURA &&\n+                spellInfo->Effects[i].ApplyAuraName != 0)\n+            {\n+                switch (spellInfo->Effects[i].ApplyAuraName)\n+                {\n+                    case SPELL_AURA_PERIODIC_DAMAGE:\n+                    case SPELL_AURA_PERIODIC_DAMAGE_PERCENT:\n+                    case SPELL_AURA_POWER_BURN:\n+                    case SPELL_AURA_PERIODIC_LEECH:\n+                    //Most of these are damaging spells\n+                    case SPELL_AURA_PERIODIC_TRIGGER_SPELL:\n+                    case SPELL_AURA_PERIODIC_TRIGGER_SPELL_WITH_VALUE:\n+                    //Scripted spells (mostly, some of these are wrong or not periodic damage)\n+                    case SPELL_AURA_PERIODIC_DUMMY:\n+                    //Channeled spells with SPELL_AURA_PERIODIC_TRIGGER_SPELL -> damage on TARGET_DEST_CHANNEL_TARGET (mostly)\n+                    case SPELL_AURA_DUMMY:\n+                        return true;\n+                    default:\n+                        break;\n+                }\n+            }\n+        }\n+    }\n+    return false;\n+}\n+bool bot_ai::IsWithinAoERadius(Position const& pos) const\n+{\n+    AoeSpotsVec const& spots = GetAoeSpots();\n+    if (!spots.empty())\n+    {\n+        Unit const* mover = me->GetVehicle() ? me->GetVehicleBase() : me;\n+        float cr_diff = mover->GetCombatReach() - DEFAULT_COMBAT_REACH;\n+        for (auto const& [apos, aradius] : spots)\n+            if (pos.GetExactDist(apos) - cr_diff < aradius)\n+                return true;\n+    }\n+\n+    return false;\n+}\n+//Returns attack range based on given range\n+//If mounted: 20%\n+//If ranged: 125%\n+//If master is dead: max range\n+//If wanderer: 65% max range\n+float bot_ai::InitAttackRange(float origRange, bool ranged) const\n+{\n+    if (IsWanderer())\n+    {\n+        origRange = World::GetMaxVisibleDistanceOnContinents() * 0.65f;\n+        if (IsFlagCarrier(me))\n+            origRange *= 0.67f;\n+    }\n+    else if (!master->IsAlive())\n+        origRange = World::GetMaxVisibleDistanceOnContinents();\n+    else if (me->HasAuraType(SPELL_AURA_MOUNTED))\n+        origRange *= 0.2f;\n+    else if (ranged)\n+        origRange *= 1.25f;\n+\n+    return origRange;\n+}\n+void bot_ai::_extendAttackRange(float& dist) const\n+{\n+    ASSERT(!IAmFree());\n+\n+    uint8 rangeMode = master->GetBotMgr()->GetBotAttackRangeMode();\n+    if (master->GetBotMgr()->GetBotFollowDist() > 0)\n+    {\n+        float spelldist;\n+        if (rangeMode == BOT_ATTACK_RANGE_EXACT)\n+            spelldist = master->GetBotMgr()->GetBotExactAttackRange();\n+        else\n+            spelldist = GetSpellAttackRange(rangeMode == BOT_ATTACK_RANGE_LONG);\n+        dist = std::max<float>(dist, spelldist * 0.5f + 4.f);\n+    }\n+}\n+bool bot_ai::_canSwitchToTarget(Unit const* from, Unit const* newTarget, int8 byspell) const\n+{\n+    if (newTarget && newTarget != me->GetVictim())\n+    {\n+        if (IAmFree())\n+        {\n+            if ((!from || me->GetDistance(newTarget) < me->GetDistance(from) - 10.0f || newTarget->GetHealth() < from->GetHealth()) &&\n+                CanBotAttack(newTarget, byspell))\n+                return true;\n+        }\n+        else if (!from && me->GetDistance(newTarget) < 0.75f * _getAttackDistance(float(master->GetBotMgr()->GetBotFollowDist())) &&\n+            CanBotAttack(newTarget, byspell))\n+            return true;\n+    }\n+\n+    return false;\n+}\n+//Ranged attack position\n+void bot_ai::CalculateAttackPos(Unit* target, Position& pos, bool& force) const\n+{\n+    uint8 followdist = IAmFree() ? BotMgr::GetBotFollowDistMax() : master->GetBotMgr()->GetBotFollowDist();\n+    uint8 rangeMode = IAmFree() ? uint8(BOT_ATTACK_RANGE_LONG) : master->GetBotMgr()->GetBotAttackRangeMode();\n+    uint8 exactRange = rangeMode != BOT_ATTACK_RANGE_EXACT || IAmFree() ? 255 : master->GetBotMgr()->GetBotExactAttackRange();\n+    uint8 angleMode = IAmFree() ? uint8(BOT_ATTACK_ANGLE_NORMAL) : master->GetBotMgr()->GetBotAttackAngleMode();\n+    float dist = (rangeMode == BOT_ATTACK_RANGE_EXACT) ? exactRange : GetSpellAttackRange(rangeMode == BOT_ATTACK_RANGE_LONG) - 5.f;\n+    float angle = target->GetAbsoluteAngle(me);\n+    if (_botclass == BOT_CLASS_SPHYNX && target->GetVictim() == me && me->GetExactDist(target) < 30.0f)\n+        dist = me->GetExactDist(target);\n+    if ((target->m_movementInfo.GetMovementFlags() & MOVEMENTFLAG_FORWARD) && target->HasInArc(float(M_PI)/1.5f, me))\n+        dist = std::min<float>(dist + 4.f, 30.f);\n+\n+    //if ranged try to acquire a position in the back (will be ignored if too far away from master)\n+    if (angleMode == BOT_ATTACK_ANGLE_AVOID_FRONTAL_AOE)\n+    {\n+        static const float rangedAngleDelta = float(M_PI) * 0.62f;\n+        if (HasRole(BOT_ROLE_RANGED) && !IAmFree() && !target->IsControlledByPlayer() && target->HasInArc(float(M_PI), me) &&\n+            (IsTank(master) || master->GetDistance(target) < 2.5f || !target->HasInArc(float(M_PI), master)))\n+            angle += (target->GetRelativeAngle(master) > 0.f) ? rangedAngleDelta : -rangedAngleDelta;\n+    }\n+\n+    float clockwise = (me->GetEntry() % 2) ? 1.f : -1.f;\n+    float angleDelta1 = ((IsTank(master) && !IsTank(me)) ? frand(float(M_PI)*0.40f, float(M_PI)*0.60f) : frand(0.0f, float(M_PI)*0.15f)) * clockwise;\n+    float angleDelta2 = frand(0.0f, float(M_PI)*0.08f) * clockwise;\n+\n+    Position ppos;\n+\n+    if (me->GetVehicle())\n+    {\n+        ASSERT(!IAmFree());\n+\n+        if (float vehdist = GetVehicleAttackDistanceOverride())\n+            dist = vehdist + 5.f;\n+\n+        uint8 posSlot = master->GetBotMgr()->GetNpcBotSlot(me);\n+        clockwise = (posSlot % 2) ? 1.f : -1.f;\n+\n+        Unit* angunit = target->GetVictim() ? target->GetVictim() : master->GetVehicle() ? master->GetVehicleBase() : master;\n+        if (angunit == me->GetVehicleBase() || angunit == me)\n+            angle = target->GetAbsoluteAngle(me->GetVehicleBase());\n+        else\n+            angle = target->GetAbsoluteAngle(angunit) + 0.5f * M_PI / master->GetNpcBotsCount() * posSlot * clockwise;\n+\n+        for (auto i : NPCBots::index_array<uint8, 4>)\n+        {\n+            if (me->GetVehicleBase()->CanFly())\n+            {\n+                //collision point bug, distance shinked to 0, so use GetNearPoint\n+                float &tx = ppos.m_positionX, &ty = ppos.m_positionY, &tz = ppos.m_positionZ;\n+                target->GetNearPoint(me->GetVehicleBase(), tx, ty, tz, 0.f, dist, Position::NormalizeOrientation(angle));\n+                if (!target->IsWithinLOS(tx, ty, tz))\n+                    dist *= i >= 3 ? 0.2f : i >= 2 ? 0.5f : 0.75f;\n+            }\n+            else\n+                ppos = target->GetFirstCollisionPosition(dist, Position::NormalizeOrientation(angle - target->GetOrientation()));\n+            //target->GetNearPoint(me->GetVehicleBase(), x, y, z, 0.f, dist, Position::NormalizeOrientation(angle));\n+\n+            bool toofar = master->GetDistance(ppos) > (followdist > 30.f ? 60.f : followdist < 10 ? 20.f : float(followdist*2));\n+            bool isinaoe = (i == 0 && me->GetVehicleBase()->GetDistance(ppos) < 4.f && IsWithinAoERadius(*me->GetVehicleBase())) || IsWithinAoERadius(ppos);\n+            if (!toofar && !isinaoe)\n+                break;\n+\n+            if (toofar)\n+            {\n+                if (i >= 1)\n+                    angle += -(clockwise) * angleDelta1/* * i*/;\n+                if (i >= 2)\n+                    dist = std::max(0.f, dist - 5.f);\n+            }\n+            if (isinaoe)\n+            {\n+                //BOT_LOG_ERROR(\"scripts\", \"CalculateAttackPos %s veh skipped aoe pos\", me->GetName().c_str());\n+                if (me->GetVehicleBase()->CanFly())\n+                    ppos.m_positionZ += (master->GetPositionZ() < target->GetPositionZ()) ? -8.f : 8.f;\n+                else\n+                    angle += angleDelta2 * 2.f;\n+            }\n+        }\n+\n+        pos.Relocate(ppos);\n+        //pos.m_positionX = x;\n+        //pos.m_positionY = y;\n+        //pos.m_positionZ = z;\n+\n+        return;\n+    }\n+\n+    AoeSpotsVec const& aoespots = GetAoeSpots();\n+\n+    bool toofaraway;\n+\n+    if (!aoespots.empty())\n+    {\n+        ppos.Relocate(me);\n+        toofaraway = master->GetDistance(ppos) > (followdist > 38 ? 38.f : followdist < 20 ? 20.f : float(followdist));\n+        bool outoflos = !target->IsWithinLOS(ppos.m_positionX, ppos.m_positionY, ppos.m_positionZ);\n+        bool isinaoe = IsWithinAoERadius(ppos);\n+        bool canattack = HasRole(BOT_ROLE_RANGED) || me->IsWithinMeleeRangeAt(ppos, target);\n+        if (!toofaraway && !outoflos && !isinaoe && canattack)\n+        {\n+            //if (!aoespots.empty())\n+            //    BOT_LOG_ERROR(\"scripts\", \"CalculateAttackPos %s spot is still safe\", me->GetName().c_str());\n+\n+            pos.Relocate(ppos);\n+            return;\n+        }\n+    }\n+\n+    AoeSafeSpotsVec safespots = CalculateAoeSafeSpots(target, float(followdist));\n+\n+    bool angle_reset_to_master = false;\n+    uint8 collision_dist_max = IAmFree() ? 30 : 38;\n+    for (auto i : NPCBots::index_array<uint8, 5>)\n+    {\n+        ppos = target->GetFirstCollisionPosition(dist, Position::NormalizeOrientation(angle - target->GetOrientation()));\n+        toofaraway = master->GetDistance(ppos) > (followdist > collision_dist_max ? float(collision_dist_max) : followdist < 20 ? 20.f : float(followdist));\n+        if (!toofaraway)\n+            break;\n+\n+        if (!angle_reset_to_master)\n+        {\n+            angle_reset_to_master = true;\n+            angle = target->GetAbsoluteAngle(master);\n+        }\n+        else\n+            angle += angleDelta1;\n+\n+        if (i >= 1 && i <= 3)\n+            dist = std::max<float>(0.f, dist - 5.f);\n+    }\n+\n+    if (!safespots.empty())\n+    {\n+        //find closest safe spot\n+        Position const* closestPos = nullptr;\n+        Position const* closestAttackPos = nullptr;\n+        float minposdist = 100.f;\n+        float minattackposdist = 100.f;\n+        for (Position const& safepos : safespots)\n+        {\n+            float curdist = me->GetExactDist2d(safepos);\n+            if (curdist < minposdist)\n+            {\n+                closestPos = &safepos;\n+                minposdist = curdist;\n+            }\n+            if (curdist < minattackposdist &&\n+                (HasRole(BOT_ROLE_RANGED) ? (target->GetDistance(safepos) - me->GetCombatReach() < dist) : me->IsWithinMeleeRangeAt(safepos, target)))\n+            {\n+                closestAttackPos = &safepos;\n+                minattackposdist = curdist;\n+            }\n+        }\n+\n+        //BOT_LOG_ERROR(\"scripts\", \"CalculateAttackPos %u safe spots, chosen at dist %.2f\", uint32(safespots.size()), mindist);\n+        pos.Relocate(closestAttackPos ? closestAttackPos : closestPos ? closestPos : me);\n+        force = true;\n+        return;\n+    }\n+    else if (!aoespots.empty() && !IAmFree())\n+    {\n+        pos.Relocate(master);\n+        force = true;\n+        return;\n+    }\n+\n+    // Ranged bots that are being targeted should move towards a tank bot or towards the player\n+    if (!IAmFree() && !IsTank(me) && HasRole(BOT_ROLE_RANGED) && target->GetVictim() == me && !CCed(target))\n+    {\n+        std::vector<Unit const*> safetyTargets;\n+        if (Group const* gr = master->GetGroup())\n+        {\n+            for (GroupReference const* itr = gr->GetFirstMember(); itr != nullptr; itr = itr->next())\n+            {\n+                Player const* pl = itr->GetSource();\n+                if (!pl || !pl->IsInMap(me) || pl->GetDistance(me) > VISIBILITY_DISTANCE_NORMAL)\n+                    continue;\n+                if (pl->IsAlive() && !pl->HasUnitState(UNIT_STATE_ISOLATED) && IsTank(pl))\n+                    safetyTargets.push_back(pl);\n+                if (!pl->HaveBot())\n+                    continue;\n+                for (auto const& [_, c] : *pl->GetBotMgr()->GetBotMap())\n+                {\n+                    if (c && c->IsInWorld() && me->GetMap() == c->FindMap() && c->IsAlive() && !c->HasUnitState(UNIT_STATE_ISOLATED) && IsTank(c) && c->GetBotAI()->HasRole(BOT_ROLE_DPS))\n+                        safetyTargets.push_back(c);\n+                }\n+            }\n+        }\n+        else\n+        {\n+            for (auto const& [_, c] : *master->GetBotMgr()->GetBotMap())\n+            {\n+                if (c && c->IsInWorld() && me->GetMap() == c->FindMap() && c->IsAlive() && !c->HasUnitState(UNIT_STATE_ISOLATED) && IsTank(c) && c->GetBotAI()->HasRole(BOT_ROLE_DPS))\n+                    safetyTargets.push_back(c);\n+            }\n+        }\n+        if (safetyTargets.empty() && master->IsAlive())\n+            safetyTargets.push_back(master);\n+\n+        if (!safetyTargets.empty())\n+        {\n+            static const float ThresholdDistance = 1.5f;\n+            Unit const* moveTarget = safetyTargets.size() == 1u ? safetyTargets.front() : safetyTargets[me->GetEntry() % safetyTargets.size()];\n+            if (moveTarget->GetDistance(target) > ThresholdDistance && me->GetDistance(moveTarget) > ThresholdDistance * 2.0f)\n+            {\n+                float distanceMod = moveTarget->HasInArc(float(M_PI), target) ? 0.5f : -1.5f;\n+                pos.Relocate(moveTarget->GetFirstCollisionPosition(ThresholdDistance * distanceMod, Position::NormalizeOrientation(moveTarget->GetAbsoluteAngle(target) - moveTarget->GetOrientation())));\n+                force = true;\n+                return;\n+            }\n+        }\n+    }\n+\n+    pos.Relocate(ppos);\n+    if (!me->IsWithinLOSInMap(target, VMAP::ModelIgnoreFlags::M2, LINEOFSIGHT_ALL_CHECKS))\n+        force = true;\n+}\n+// Forces bot to chase opponent (if ranged then distance depends on follow distance)\n+void bot_ai::GetInPosition(bool force, Unit* newtarget, Position* mypos)\n+{\n+    Unit* mover = me->GetVehicle() ? me->GetVehicleBase() : me;\n+    if (HasBotCommandState(BOT_COMMAND_STAY))\n+        return;\n+    if (!IAmFree() && !master->GetBotMgr()->GetBotAllowCombatPositioning())\n+        return;\n+    if (CCed(mover, true) || (mover == me && JumpingOrFalling()))\n+        return;\n+    if (!newtarget)\n+        newtarget = me->GetVictim();\n+    if (!newtarget)\n+        return;\n+    if ((!newtarget->IsInCombat() || (mover->isMoving()/* && Rand() > 50*/)) && !force && !(_atHome && _evadeMode))\n+        return;\n+    if (IsCasting(mover))\n+        return;\n+    if (IsShootingWand(mover) && newtarget->GetVictim() == mover)\n+        return;\n+    if (UpdateImpossibleChase(newtarget))\n+        return;\n+    if (AdjustTankingPosition(newtarget))\n+        return;\n+\n+    if (!IAmFree() && master->GetBotMgr()->GetBotAttackRangeMode() == BOT_ATTACK_RANGE_EXACT &&\n+        master->GetBotMgr()->GetBotExactAttackRange() == 0)\n+    {\n+        attackpos.m_positionX = newtarget->GetPositionX() - frand(0.5f, 1.5f) * std::cos(me->GetAbsoluteAngle(newtarget));\n+        attackpos.m_positionY = newtarget->GetPositionY() - frand(0.5f, 1.5f) * std::sin(me->GetAbsoluteAngle(newtarget));\n+        attackpos.m_positionZ = newtarget->GetPositionZ();\n+        if (me->GetExactDist2d(&attackpos) > 3.5f)\n+            BotMovement(BOT_MOVE_POINT, &attackpos);\n+            //me->GetMotionMaster()->MovePoint(newtarget->GetMapId(), attackpos);\n+        return;\n+    }\n+\n+    uint8 followdist = IAmFree() ? BotMgr::GetBotFollowDistMax() : master->GetBotMgr()->GetBotFollowDist();\n+    if (IsRanged() || (!IAmFree() && !GetAoeSpots().empty()))\n+    {\n+        //do not allow constant runaway from player\n+        if (!force && newtarget->IsPlayer() &&\n+            me->GetDistance(newtarget) < float(6 + urand(followdist/4, followdist/3)))\n+            return;\n+\n+        if (!mypos)\n+            CalculateAttackPos(newtarget, attackpos, force);\n+        else\n+        {\n+            attackpos.m_positionX = mypos->m_positionX;\n+            attackpos.m_positionY = mypos->m_positionY;\n+            attackpos.m_positionZ = mypos->m_positionZ;\n+        }\n+        //BOT_LOG_ERROR(\"scripts\", \"GetInPosition %s to %s dist %.2f, to pos %.2f\", me->GetName().c_str(),\n+        //    newtarget->GetName().c_str(), me->GetExactDist2d(newtarget), me->GetExactDist2d(&attackpos));\n+        if (mover->GetExactDist2d(&attackpos) > (force ? 0.1f : 4.f))\n+        {\n+            BotMovement(BOT_MOVE_POINT, &attackpos);\n+            //me->GetMotionMaster()->MovePoint(newtarget->GetMapId(), attackpos);\n+            if (mover == me && !me->HasUnitState(UNIT_STATE_MELEE_ATTACKING) && CanBotAttackOnVehicle())\n+                me->SetInFront(newtarget);\n+            else if (!mover->HasUnitState(UNIT_STATE_MELEE_ATTACKING))\n+                mover->SetInFront(newtarget);\n+        }\n+    }\n+    else\n+    {\n+        if (!JumpingOrFalling() && ((!mover->HasUnitState(UNIT_STATE_CHASE) && !mover->isMoving()) || (!mover->HasUnitState(UNIT_STATE_CHASE_MOVE) && mover->GetDistance(newtarget) > 1.5f)))\n+            BotMovement(BOT_MOVE_CHASE, nullptr, newtarget);\n+            //me->GetMotionMaster()->MoveChase(newtarget);\n+    }\n+\n+    if (newtarget != me->GetVictim() && (mover == me || CanBotAttackOnVehicle()))\n+    {\n+        if (!me->Attack(newtarget, !HasRole(BOT_ROLE_RANGED)))\n+            me->SetInFront(newtarget);\n+    }\n+}\n+//Bots cannot dodge/parry from behind so try to condense enemies at front\n+//opponent is always valid\n+bool bot_ai::AdjustTankingPosition(Unit const* mytarget) const\n+{\n+    //problem: chasing unit is constantly moving. Whoever the hell did that\n+//    if (/*!IsTank() || */!me->IsInCombat() || me->isMoving() || IsCasting() ||\n+//        JumpingOrFalling() || CCed(me, true) || Rand() > 10 + 20*me->GetMap()->IsDungeon())\n+//        return;\n+    if (/*!IsTank() || */!me->IsInCombat() || IsCasting() || me->GetVehicle() ||\n+        JumpingOrFalling() || CCed(me, true) || Rand() > 10 + 20*me->GetMap()->IsDungeon() ||\n+        HasBotCommandState(BOT_COMMAND_MASK_UNMOVING))\n+        return false;\n+\n+    Unit::AttackerSet const& myattackers = me->getAttackers();\n+    if (myattackers.size() < 2)\n+        return false;\n+\n+    if (IsMelee())\n+    {\n+        if (!me->IsWithinMeleeRange(mytarget))\n+            return false;\n+    }\n+    else\n+    {\n+        uint8 rangeMode = IAmFree() ? uint8(BOT_ATTACK_RANGE_LONG) : master->GetBotMgr()->GetBotAttackRangeMode();\n+        uint8 exactRange = rangeMode != BOT_ATTACK_RANGE_EXACT || IAmFree() ? 255 : master->GetBotMgr()->GetBotExactAttackRange();\n+        float dist = (rangeMode == BOT_ATTACK_RANGE_EXACT) ? exactRange : GetSpellAttackRange(rangeMode == BOT_ATTACK_RANGE_LONG);\n+\n+        if (me->GetDistance(mytarget) > dist)\n+            return false;\n+    }\n+\n+    //BOT_LOG_ERROR(\"entities.player\", \"AdjustTankPosition() by %s\", me->GetName().c_str());\n+\n+    uint32 bCount = 0;\n+    for (Unit const* u : myattackers)\n+    {\n+        if (/*!CCed(u) && */u->IsWithinMeleeRange(me) && !me->HasInArc(float(M_PI), u))\n+            ++bCount;\n+            //if (++bCount)\n+            //    break;\n+    }\n+\n+    if (bCount == 0)\n+        return false;\n+\n+    //BOT_LOG_ERROR(\"entities.player\", \"AdjustTankPosition(): atts %u, behind %u\", uint32(myattackers.size()), bCount);\n+\n+    //calculate new position\n+    float x = me->GetPositionX();\n+    float y = me->GetPositionY();\n+    float z = me->GetPositionZ();\n+    float ori = CCed(mytarget, true) ? me->GetOrientation() + 0.75f * M_PI : me->GetOrientation();\n+    float const moveDist = -1.f * std::max<float>(mytarget->GetCombatReach(), 3.f);\n+    float moveX;\n+    float moveY;\n+    //bool move = false;\n+    for (auto i : NPCBots::index_array<uint32, 6>)\n+    {\n+        if (i)\n+        {\n+            ori = Position::NormalizeOrientation(ori + (i+1)*(M_PI*0.31f));\n+        }\n+\n+        //move back\n+        moveX = moveDist * std::cos(ori);\n+        moveY = moveDist * std::sin(ori);\n+\n+        Position ppos;\n+        ppos.Relocate(x+moveX, y+moveY, z);\n+        if (me->IsWithinLOS(x+moveX, y+moveY, z) && !IsWithinAoERadius(ppos))\n+            break;\n+\n+        if (i == 2u)\n+        {\n+            moveX *= 0.2f;\n+            moveY *= 0.2f;\n+        }\n+    }\n+\n+    x+= moveX;\n+    y+= moveY;\n+\n+    me->UpdateAllowedPositionZ(x, y, z);\n+    if (me->GetPositionZ() < z)\n+        z += 0.75f; //prevent going underground\n+\n+    //if (CCed(mytarget, true))\n+    //    me->AttackStop();\n+    //me->SetOrientation(ori);\n+    Position position;\n+    position.Relocate(x, y, z);\n+    BotMovement(BOT_MOVE_POINT, &position);\n+    //me->GetMotionMaster()->MovePoint(me->GetMapId(), x, y, z, false);\n+    return true;\n+}\n+\n+void bot_ai::CheckAttackState()\n+{\n+    if (me->GetVictim() && me->GetVictim()->IsAlive())\n+    {\n+        if (HasRole(BOT_ROLE_DPS) && !me->HasAuraType(SPELL_AURA_MOD_STEALTH) && !me->HasAuraType(SPELL_AURA_MOD_INVISIBILITY) &&\n+            !IsShootingWand())\n+            DoMeleeAttackIfReady();\n+    }\n+}\n+//Move behind current target if needed (avoid cleaves and dodges/parries, also rogues/ferals)\n+void bot_ai::MoveBehind(Unit const* target) const\n+{\n+    if (_moveBehindTimer > lastdiff || HasBotCommandState(BOT_COMMAND_MASK_UNMOVING) || HasRole(BOT_ROLE_RANGED) || JumpingOrFalling() ||\n+        /*(me->isMoving() && !target->IsPlayer()) ||*/\n+        me->GetVehicle() || (IsTank() && target->GetVictim() == me) || CCed(me, true) ||\n+        !target->IsWithinCombatRange(me, ATTACK_DISTANCE) || !target->HasInArc(float(M_PI), me))\n+        return;\n+\n+    const bool targetMe = target->GetVictim() == me;\n+    const bool cced = CCed(target);\n+    const bool isPlayer = target->IsPlayer();\n+\n+    if ((_botclass == BOT_CLASS_ROGUE || GetBotStance() == DRUID_CAT_FORM) ? (!targetMe || cced || isPlayer) : (!targetMe && (!cced || isPlayer)))\n+    {\n+        float myangle = Position::NormalizeOrientation(target->GetAbsoluteAngle(me) + float(M_PI));\n+        float mydist = me->GetCombatReach();\n+        Position position;\n+        target->GetNearPoint(me, position.m_positionX, position.m_positionY, position.m_positionZ, 0.f, mydist, myangle);\n+\n+        if (IsWithinAoERadius(position))\n+            return;\n+\n+        BotMovement(BOT_MOVE_POINT, &position);\n+        const_cast<bot_ai*>(this)->_moveBehindTimer = urand(1000, (_botclass == BOT_CLASS_ROGUE || GetBotStance() == DRUID_CAT_FORM) ? 2000 : 4000);\n+    }\n+}\n+//MOUNT SUPPORT\n+uint32 bot_ai::_selectMountSpell() const\n+{\n+    uint8 minLevel60 = BotCfg::GetNpcBotMountLevel60();\n+    uint8 minLevel100 = BotCfg::GetNpcBotMountLevel100();\n+\n+    if (me->GetLevel() < minLevel60)\n+        return 0;\n+\n+    uint32 myMountSpellId = 0;\n+    uint32 masterMountSpellId = 0;\n+\n+    InstanceTemplate const* instt = sObjectMgr->GetInstanceTemplate(me->GetMap()->GetId());\n+    bool map_allows_mount = (!me->GetMap()->IsDungeon() || me->GetMap()->IsBattlegroundOrArena()) && (!instt || instt->AllowMount);\n+    if (!IAmFree() ? !master->IsMounted() : !(map_allows_mount && evadeDelayTimer < lastdiff * 2))\n+        return 0;\n+\n+    Unit::AuraEffectList const& mounts = master->GetAuraEffectsByType(SPELL_AURA_MOUNTED);\n+    int32 maxMountSpeed = !IAmFree() ? 0 : 999;\n+    const bool master_can_fly = master->CanFly() || master->IsFreeFlying();\n+    if (!IAmFree())\n+    {\n+        Aura const* mountAura = nullptr;\n+        for (AuraEffect const* meff : mounts)\n+        {\n+            for (auto i : NPCBots::index_array<uint8, MAX_SPELL_EFFECTS>)\n+            {\n+                AuraEffect const* maeff = meff->GetBase()->GetEffect(i);\n+                if (maeff && (maeff->GetSpellInfo()->Effects[i].IsAura(master_can_fly ? SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED : SPELL_AURA_MOD_INCREASE_MOUNTED_SPEED)) &&\n+                    maeff->GetAmount() > maxMountSpeed)\n+                {\n+                    maxMountSpeed = maeff->GetAmount();\n+                    mountAura = meff->GetBase();\n+                }\n+            }\n+        }\n+\n+        if (maxMountSpeed < 20)\n+            return 0;\n+\n+        masterMountSpellId = mountAura ? mountAura->GetId() : 0;\n+    }\n+\n+    //Winter Veil addition\n+    if (sGameEventMgr->IsActiveEvent(GAME_EVENT_WINTER_VEIL))\n+        myMountSpellId = master_can_fly ? REINDEER_FLY : REINDEER;\n+    if (!myMountSpellId && me->GetMapId() == 531) //Ahn'Qiraj\n+    {\n+        //Select AQ40 mount\n+        static const std::array<uint32, 4> QirajiMountSpellIds = { QIRAJI_BATTLE_TANK_1, QIRAJI_BATTLE_TANK_2, QIRAJI_BATTLE_TANK_3, QIRAJI_BATTLE_TANK_4 };\n+        //Count Black Qiraji Battle Tank too\n+        if (masterMountSpellId == 26656 || std::ranges::find(QirajiMountSpellIds, masterMountSpellId) != QirajiMountSpellIds.cend())\n+            myMountSpellId = QirajiMountSpellIds[me->GetEntry() % QirajiMountSpellIds.size()];\n+    }\n+\n+    if (!myMountSpellId)\n+    {\n+        using MountArray = std::array<uint32, NUM_MOUNTS_PER_SPEED>;\n+\n+        bool can_fly = !IAmFree() && master_can_fly; //(!instt && me->GetMap()->GetEntry()->addon > 0);\n+        bool useSlowMount = can_fly ? (me->GetLevel() < 70 || maxMountSpeed < 220) : (me->GetLevel() < minLevel100 || maxMountSpeed < 80);\n+\n+        if (!can_fly)\n+        {\n+            //Select by class\n+            switch (_botclass)\n+            {\n+                case BOT_CLASS_DARK_RANGER:\n+                    myMountSpellId = BOT_DARK_RANGER_MOUNT;\n+                    break;\n+                case BOT_CLASS_WARLOCK:\n+                    myMountSpellId = useSlowMount ? BOT_WARLOCK_MOUNT : BOT_WARLOCK_FAST_MOUNT;\n+                    break;\n+                case BOT_CLASS_PALADIN:\n+                    if (me->GetRace() == RACE_BLOODELF)\n+                        myMountSpellId = useSlowMount ? BOT_BE_PALLY_MOUNT : BOT_BE_PALLY_FAST_MOUNT;\n+                    else\n+                        myMountSpellId = useSlowMount ? BOT_ALLI_PALLY_MOUNT : BOT_ALLI_PALLY_FAST_MOUNT;\n+                    break;\n+                case BOT_CLASS_DEATH_KNIGHT:\n+                    myMountSpellId = BOT_DEATH_KNIGHT_MOUNT;\n+                    break;\n+                default:\n+                    break;\n+            }\n+            //Select by race\n+            if (!myMountSpellId)\n+            {\n+                static const MountArray MOUNTS_60_HUMAN = { BOT_MOUNT_HUMAN_60_1, BOT_MOUNT_HUMAN_60_2, BOT_MOUNT_HUMAN_60_3 };\n+                static const MountArray MOUNTS_60_ORC = { BOT_MOUNT_ORC_60_1, BOT_MOUNT_ORC_60_2, BOT_MOUNT_ORC_60_3 };\n+                static const MountArray MOUNTS_60_DWARF = { BOT_MOUNT_DWARF_60_1, BOT_MOUNT_DWARF_60_2, BOT_MOUNT_DWARF_60_3 };\n+                static const MountArray MOUNTS_60_NIGHTELF = { BOT_MOUNT_NIGHTELF_60_1, BOT_MOUNT_NIGHTELF_60_2, BOT_MOUNT_NIGHTELF_60_3 };\n+                static const MountArray MOUNTS_60_FORSAKEN = { BOT_MOUNT_FORSAKEN_60_1, BOT_MOUNT_FORSAKEN_60_2, BOT_MOUNT_FORSAKEN_60_3 };\n+                static const MountArray MOUNTS_60_TAUREN = { BOT_MOUNT_TAUREN_60_1, BOT_MOUNT_TAUREN_60_2, BOT_MOUNT_TAUREN_60_3 };\n+                static const MountArray MOUNTS_60_GNOME = { BOT_MOUNT_GNOME_60_1, BOT_MOUNT_GNOME_60_2, BOT_MOUNT_GNOME_60_3 };\n+                static const MountArray MOUNTS_60_TROLL = { BOT_MOUNT_TROLL_60_1, BOT_MOUNT_TROLL_60_2, BOT_MOUNT_TROLL_60_3 };\n+                static const MountArray MOUNTS_60_BLOODELF = { BOT_MOUNT_BLOODELF_60_1, BOT_MOUNT_BLOODELF_60_2, BOT_MOUNT_BLOODELF_60_3 };\n+                static const MountArray MOUNTS_60_DRAENEI = { BOT_MOUNT_DRAENEI_60_1, BOT_MOUNT_DRAENEI_60_2, BOT_MOUNT_DRAENEI_60_3 };\n+\n+                static const MountArray MOUNTS_100_HUMAN = { BOT_MOUNT_HUMAN_100_1, BOT_MOUNT_HUMAN_100_2, BOT_MOUNT_HUMAN_100_3 };\n+                static const MountArray MOUNTS_100_ORC = { BOT_MOUNT_ORC_100_1, BOT_MOUNT_ORC_100_2, BOT_MOUNT_ORC_100_3 };\n+                static const MountArray MOUNTS_100_DWARF = { BOT_MOUNT_DWARF_100_1, BOT_MOUNT_DWARF_100_2, BOT_MOUNT_DWARF_100_3 };\n+                static const MountArray MOUNTS_100_NIGHTELF = { BOT_MOUNT_NIGHTELF_100_1, BOT_MOUNT_NIGHTELF_100_2, BOT_MOUNT_NIGHTELF_100_3 };\n+                static const MountArray MOUNTS_100_FORSAKEN = { BOT_MOUNT_FORSAKEN_100_1, BOT_MOUNT_FORSAKEN_100_2, BOT_MOUNT_FORSAKEN_100_3 };\n+                static const MountArray MOUNTS_100_TAUREN = { BOT_MOUNT_TAUREN_100_1, BOT_MOUNT_TAUREN_100_2, BOT_MOUNT_TAUREN_100_3 };\n+                static const MountArray MOUNTS_100_GNOME = { BOT_MOUNT_GNOME_100_1, BOT_MOUNT_GNOME_100_2, BOT_MOUNT_GNOME_100_3 };\n+                static const MountArray MOUNTS_100_TROLL = { BOT_MOUNT_TROLL_100_1, BOT_MOUNT_TROLL_100_2, BOT_MOUNT_TROLL_100_3 };\n+                static const MountArray MOUNTS_100_BLOODELF = { BOT_MOUNT_BLOODELF_100_1, BOT_MOUNT_BLOODELF_100_2, BOT_MOUNT_BLOODELF_100_3 };\n+                static const MountArray MOUNTS_100_DRAENEI = { BOT_MOUNT_DRAENEI_100_1, BOT_MOUNT_DRAENEI_100_2, BOT_MOUNT_DRAENEI_100_3 };\n+\n+                Optional<MountArray> myMounts;\n+                switch (me->GetRace())\n+                {\n+                    case RACE_HUMAN:         myMounts = useSlowMount ? MOUNTS_60_HUMAN : MOUNTS_100_HUMAN;       break;\n+                    case RACE_ORC:           myMounts = useSlowMount ? MOUNTS_60_ORC : MOUNTS_100_ORC;           break;\n+                    case RACE_DWARF:         myMounts = useSlowMount ? MOUNTS_60_DWARF : MOUNTS_100_DWARF;       break;\n+                    case RACE_NIGHTELF:      myMounts = useSlowMount ? MOUNTS_60_NIGHTELF : MOUNTS_100_NIGHTELF; break;\n+                    case RACE_UNDEAD_PLAYER: myMounts = useSlowMount ? MOUNTS_60_FORSAKEN : MOUNTS_100_FORSAKEN; break;\n+                    case RACE_TAUREN:        myMounts = useSlowMount ? MOUNTS_60_TAUREN : MOUNTS_100_TAUREN;     break;\n+                    case RACE_GNOME:         myMounts = useSlowMount ? MOUNTS_60_GNOME : MOUNTS_100_GNOME;       break;\n+                    case RACE_TROLL:         myMounts = useSlowMount ? MOUNTS_60_TROLL : MOUNTS_100_TROLL;       break;\n+                    case RACE_BLOODELF:      myMounts = useSlowMount ? MOUNTS_60_BLOODELF : MOUNTS_100_BLOODELF; break;\n+                    case RACE_DRAENEI:       myMounts = useSlowMount ? MOUNTS_60_DRAENEI : MOUNTS_100_DRAENEI;   break;\n+                    default:                                                                                     break;\n+                }\n+\n+                if (myMounts)\n+                    myMountSpellId = (*myMounts)[me->GetEntry() % myMounts->size()];\n+            }\n+        }\n+        else //if (can_fly)\n+        {\n+            if (GetBotClass() == BOT_CLASS_DRUID && GetSpell(33943))\n+                myMountSpellId = useSlowMount ? 33943 : GetSpell(33943);\n+            else\n+            {\n+                static const MountArray MOUNTS_150_ALLIANCE = { BOT_MOUNT_FLY_ALLIANCE_150_1, BOT_MOUNT_FLY_ALLIANCE_150_2, BOT_MOUNT_FLY_ALLIANCE_150_3 };\n+                static const MountArray MOUNTS_150_HORDE = { BOT_MOUNT_FLY_HORDE_150_1, BOT_MOUNT_FLY_HORDE_150_2, BOT_MOUNT_FLY_HORDE_150_3 };\n+                static const MountArray MOUNTS_280_ALLIANCE = { BOT_MOUNT_FLY_ALLIANCE_280_1, BOT_MOUNT_FLY_ALLIANCE_280_2, BOT_MOUNT_FLY_ALLIANCE_280_3 };\n+                static const MountArray MOUNTS_280_HORDE = { BOT_MOUNT_FLY_HORDE_280_1, BOT_MOUNT_FLY_HORDE_280_2, BOT_MOUNT_FLY_HORDE_280_3 };\n+\n+                Optional<MountArray> myMounts;\n+                if (me->GetRaceMask() & sRaceMgr->GetAllianceRaceMask())\n+                    myMounts = useSlowMount ? MOUNTS_150_ALLIANCE : MOUNTS_280_ALLIANCE;\n+                else if (me->GetRaceMask() & sRaceMgr->GetHordeRaceMask())\n+                    myMounts = useSlowMount ? MOUNTS_150_HORDE : MOUNTS_280_HORDE;\n+\n+                if (myMounts)\n+                    myMountSpellId = (*myMounts)[me->GetEntry() % myMounts->size()];\n+            }\n+        }\n+    }\n+\n+    if (!myMountSpellId) // shouldn't happen normally\n+    {\n+        if (masterMountSpellId)\n+            myMountSpellId = masterMountSpellId;\n+        else if (!mounts.empty())\n+            myMountSpellId = mounts.front()->GetId();\n+    }\n+\n+    return myMountSpellId;\n+}\n+void bot_ai::_updateMountedState()\n+{\n+    bool aura = me->HasAuraType(SPELL_AURA_MOUNTED);\n+    bool mounted = me->IsMounted() && (_botclass != BOT_CLASS_ARCHMAGE || aura);\n+    bool template_fly = me->GetCreatureTemplate()->Movement.Flight != CreatureFlightMovementType::None;\n+    bool druid_fly = GetBotStance() == DRUID_FLIGHT_FORM;\n+    Unit const* victim = me->GetVictim();\n+\n+    //allow dismount\n+    if (!CanMount() && !aura && !mounted && !druid_fly)\n+        return;\n+\n+    if ((aura || mounted || template_fly || druid_fly) &&\n+        (!master->IsMounted() || aura != mounted || (!mounted && !druid_fly && template_fly) ||\n+            (me->IsInCombat() && (opponent || disttarget)) ||\n+            (IAmFree() && victim && me->IsWithinDist(victim, IsMelee() ? 5.0f : GetSpellAttackRange(true), false))))\n+    {\n+        if (druid_fly)\n+            removeShapeshiftForm();\n+        else\n+            DismountBot();\n+        return;\n+    }\n+\n+    if (druid_fly || me->IsMounted() || me->GetVehicle() || me->HasUnitMovementFlag(MOVEMENTFLAG_SWIMMING) || !IsOutdoors() ||\n+        master->IsInCombat() || me->IsInCombat() || me->GetVictim() || IsCasting() || IsFlagCarrier(me) ||\n+        (HasBotCommandState(BOT_COMMAND_STAY) && GetBG() && GetBG()->GetStatus() != STATUS_IN_PROGRESS))\n+        return;\n+\n+    if (IAmFree())\n+    {\n+        if (!IsWanderer() || me->GetLevel() < BotCfg::GetNpcBotMountLevel60() || me->HasAuraType(SPELL_AURA_PERIODIC_DAMAGE) ||\n+            Feasting() || GetHealthPCT(me) < 80 || (CanDrink() && me->GetMaxPower(POWER_MANA) > 1 && GetManaPCT(me) < 70))\n+            return;\n+    }\n+\n+    if (uint32 mount_spell_id = _selectMountSpell())\n+    {\n+        if (me->HasAuraType(SPELL_AURA_MOUNTED))\n+            me->RemoveAurasByType(SPELL_AURA_MOUNTED);\n+\n+        if (!((_botclass == BOT_CLASS_DRUID || _botclass == BOT_CLASS_SHAMAN) && me->GetShapeshiftForm() != FORM_NONE) || removeShapeshiftForm())\n+            doCast(me, mount_spell_id);\n+    }\n+}\n+//STANDSTATE\n+void bot_ai::_updateStandState() const\n+{\n+    if (IAmFree())\n+    {\n+        if (CanSit() && !IsWanderer())\n+        {\n+            if (_atHome && !_evadeMode && !me->IsInCombat() && !me->isMoving() &&\n+                me->IsStandState() && Rand() < 15)\n+            {\n+                uint16 mapid;\n+                Position pos;\n+                GetHomePosition(mapid, &pos);\n+                if (me->GetExactDist(&pos) < 5 && me->GetOrientation() == pos.GetOrientation())\n+                {\n+                    if (_botclass == BOT_CLASS_DRUID && me->GetShapeshiftForm() != FORM_NONE)\n+                        const_cast<bot_ai*>(this)->removeShapeshiftForm();\n+\n+                    me->SetStandState(UNIT_STAND_STATE_SIT);\n+                }\n+            }\n+        }\n+        else if (me->IsSitState() && !(me->GetInterruptMask() & AURA_INTERRUPT_FLAG_NOT_SEATED))\n+            me->SetStandState(UNIT_STAND_STATE_STAND);\n+\n+        return;\n+    }\n+\n+    if (me->GetVehicle())\n+        return;\n+\n+    if ((master->getStandState() == UNIT_STAND_STATE_STAND || !CanSit()) &&\n+        me->GetStandState() == UNIT_STAND_STATE_SIT &&\n+        !(me->GetInterruptMask() & AURA_INTERRUPT_FLAG_NOT_SEATED))\n+        me->SetStandState(UNIT_STAND_STATE_STAND);\n+    if (CanSit() && !me->IsInCombat() && !me->isMoving() &&\n+        (master->GetStandState() == UNIT_STAND_STATE_SIT || (me->GetInterruptMask() & AURA_INTERRUPT_FLAG_NOT_SEATED)) &&\n+        me->GetStandState() == UNIT_STAND_STATE_STAND)\n+        me->SetStandState(UNIT_STAND_STATE_SIT);\n+}\n+//RATIONS\n+void bot_ai::_updateRations()\n+{\n+    bool noFeast = me->IsInCombat() || (BotCfg::IsFoodInterruptedByMovement() && me->isMoving()) || me->GetVictim() || CCed(me) || IsFlagCarrier(me);\n+\n+    //check\n+    if (IAmFree() || !master->IsSitState())\n+    {\n+        if (feast_mana)\n+        {\n+            if (noFeast || me->IsStandState() || me->GetMaxPower(POWER_MANA) <= 1 || me->GetPower(POWER_MANA) >= me->GetMaxPower(POWER_MANA))\n+            {\n+                std::vector<uint32> spellIds;\n+                spellIds.reserve(4);\n+                for (auto const& [spellId, auraApp] : me->GetAppliedAuras())\n+                    if (auraApp->GetBase()->GetSpellInfo()->GetSpellSpecific() == SPELL_SPECIFIC_DRINK &&\n+                        !auraApp->GetBase()->GetSpellInfo()->HasAura(SPELL_AURA_PERIODIC_TRIGGER_SPELL)) //skip buffing food\n+                        spellIds.push_back(spellId);\n+                for (uint32 spellId : spellIds)\n+                    me->RemoveAurasDueToSpell(spellId);\n+                feast_mana = false;\n+                UpdateMana();\n+            }\n+        }\n+        if (feast_health)\n+        {\n+            if (noFeast || me->IsStandState() || me->GetHealth() >= me->GetMaxHealth())\n+            {\n+                std::vector<uint32> spellIds;\n+                spellIds.reserve(4);\n+                for (auto const& [spellId, auraApp] : me->GetAppliedAuras())\n+                    if (auraApp->GetBase()->GetSpellInfo()->GetSpellSpecific() == SPELL_SPECIFIC_FOOD &&\n+                        !auraApp->GetBase()->GetSpellInfo()->HasAura(SPELL_AURA_PERIODIC_TRIGGER_SPELL)) //skip buffing food\n+                        spellIds.push_back(spellId);\n+                for (uint32 spellId : spellIds)\n+                    me->RemoveAurasDueToSpell(spellId);\n+                feast_health = false;\n+            }\n+        }\n+    }\n+\n+    if (noFeast)\n+        return;\n+\n+    //drink\n+    if (!feast_mana && me->GetMaxPower(POWER_MANA) > 1 && !me->HasAuraType(SPELL_AURA_MOUNTED) && !me->isMoving() && CanDrink() &&\n+        !me->IsInCombat() && !me->GetVehicle() && !IsCasting() && GetManaPCT(me) < 75 && urand(0, 100) < 20)\n+    {\n+        me->CastSpell(me, GetRation(true), true);\n+    }\n+\n+    //eat\n+    if (!feast_health && !me->HasAuraType(SPELL_AURA_MOUNTED) && !me->isMoving() && CanEat() &&\n+        !me->IsInCombat() && !me->GetVehicle() && !IsCasting() && GetHealthPCT(me) < 80 && urand(0, 100) < 20)\n+    {\n+        me->CastSpell(me, GetRation(false), true);\n+    }\n+}\n+//Health and Powers regeneration\n+//Rage regen is handled inside class AI UpdateAI()\n+void bot_ai::Regenerate()\n+{\n+    regenTimer += lastdiff;\n+\n+    //every tick\n+    if (me->GetPowerType() == POWER_ENERGY)\n+        RegenerateEnergy();\n+\n+    if (regenTimer >= REGEN_CD)\n+    {\n+        regenTimer -= REGEN_CD;\n+        // Regen Health\n+        int32 baseRegen = int32(_getTotalBotStat(BOT_STAT_MOD_HEALTH_REGEN));\n+        if ((!me->IsInCombat() || me->IsPolymorphed() || CanRegenInCombat() || baseRegen > 0 ||\n+            me->HasAuraType(SPELL_AURA_MOD_REGEN_DURING_COMBAT) || me->HasAuraType(SPELL_AURA_MOD_HEALTH_REGEN_IN_COMBAT)) &&\n+            me->GetHealth() < me->GetMaxHealth())\n+        {\n+            int32 add = me->IsInCombat() ? 0 : IAmFree() && !me->GetVictim() ? me->GetMaxHealth() / 64 : 5 + me->GetCreateHealth() / 256;\n+            if (baseRegen > 0)\n+                add += std::max<int32>(baseRegen / 5, 1);\n+\n+            //cannot eat\n+            if (_botclass == BOT_CLASS_SPHYNX)\n+                add += me->GetMaxHealth() / 100; //1%\n+\n+            if (me->IsPolymorphed())\n+                add += me->GetMaxHealth() / 6;\n+            else if (!me->IsInCombat() || me->HasAuraType(SPELL_AURA_MOD_REGEN_DURING_COMBAT))\n+            {\n+                if (!me->IsInCombat())\n+                {\n+                    for (AuraEffect const* aeff : me->GetAuraEffectsByType(SPELL_AURA_MOD_HEALTH_REGEN_PERCENT))\n+                        AddPct(add, aeff->GetAmount());\n+\n+                    add += me->GetTotalAuraModifier(SPELL_AURA_MOD_REGEN) * REGEN_CD / 5000;\n+                }\n+                else if (me->HasAuraType(SPELL_AURA_MOD_REGEN_DURING_COMBAT))\n+                    ApplyPct(add, me->GetTotalAuraModifier(SPELL_AURA_MOD_REGEN_DURING_COMBAT));\n+            }\n+\n+            add += me->GetTotalAuraModifier(SPELL_AURA_MOD_HEALTH_REGEN_IN_COMBAT);\n+\n+            if (add < 0)\n+                add = 0;\n+\n+            me->ModifyHealth(add);\n+        }\n+\n+        // Regen Mana\n+        if (me->GetMaxPower(POWER_MANA) > 1 &&\n+            (me->GetPower(POWER_MANA) < me->GetMaxPower(POWER_MANA) || _botclass == BOT_CLASS_SPHYNX))\n+        {\n+            float addvalue;\n+            if (me->IsUnderLastManaUseEffect())\n+                addvalue = me->GetFloatValue(UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER);\n+            else\n+                addvalue = me->GetFloatValue(UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER);\n+\n+            addvalue *= sWorld->getRate(RATE_POWER_MANA) * float(REGEN_CD) * 0.001f; //regenTimer threshold / 1000\n+\n+            if (addvalue < 0.0f)\n+                addvalue = 0.0f;\n+\n+            if (_botclass == BOT_CLASS_SPHYNX)\n+                addvalue *= -1.f;\n+\n+            me->ModifyPower(POWER_MANA, int32(addvalue));\n+        }\n+    }\n+}\n+\n+void bot_ai::RegenerateEnergy()\n+{\n+    uint32 curValue = me->GetPower(POWER_ENERGY);\n+    uint32 maxValue = me->GetMaxPower(POWER_ENERGY);\n+\n+    if (curValue < maxValue)\n+    {\n+        float addvalue = 0.01f * lastdiff * sWorld->getRate(RATE_POWER_ENERGY); //10 per sec\n+        for (AuraEffect const* aeff : me->GetAuraEffectsByType(SPELL_AURA_MOD_POWER_REGEN_PERCENT))\n+            if (Powers(aeff->GetMiscValue()) == POWER_ENERGY)\n+                AddPct(addvalue, aeff->GetAmount());\n+\n+        //not present in db\n+        //addvalue += me->GetTotalAuraModifierByMiscValue(SPELL_AURA_MOD_POWER_REGEN, POWER_ENERGY) * lastdiff / 5000;\n+        //me->ModifyPower(POWER_ENERGY, int32(addvalue));\n+\n+        addvalue += _energyFraction;\n+\n+        if (addvalue == 0x0) //only if world rate for enegy is 0\n+            return;\n+\n+        uint32 integerValue = uint32(fabs(addvalue));\n+\n+        curValue += integerValue;\n+\n+        if (curValue > maxValue)\n+        {\n+            curValue = maxValue;\n+            _energyFraction = 0.f;\n+        }\n+        else\n+            _energyFraction = addvalue - float(integerValue);\n+\n+        if (curValue == maxValue || regenTimer >= REGEN_CD)\n+            me->SetPower(POWER_ENERGY, curValue);\n+        else\n+            me->UpdateUInt32Value(uint16(UNIT_FIELD_POWER1) + uint16(POWER_ENERGY), curValue);\n+    }\n+}\n+\n+bool bot_ai::Feasting() const\n+{\n+    if (!(me->GetInterruptMask() & AURA_INTERRUPT_FLAG_NOT_SEATED))\n+        return false;\n+\n+    return\n+        me->IsSitState() &&\n+        (me->HasAuraType(SPELL_AURA_MOD_REGEN)       || me->HasAuraType(SPELL_AURA_OBS_MOD_HEALTH) ||\n+         me->HasAuraType(SPELL_AURA_MOD_POWER_REGEN) || me->HasAuraType(SPELL_AURA_OBS_MOD_POWER));\n+}\n+uint32 bot_ai::GetRation(bool drink) const\n+{\n+    for (auto i : NPCBots::index_array<uint8, MAX_FEAST_SPELLS>)\n+        if (me->GetLevel() >= (drink ? DrinkSpells[i][0] : EatSpells[i][0]))\n+            return (drink ? DrinkSpells[i][1] : EatSpells[i][1]);\n+\n+    return (drink ? DrinkSpells[0][1] : EatSpells[0][1]);\n+}\n+\n+void bot_ai::DrinkPotion(bool mana)\n+{\n+    if (IsCasting())\n+        return;\n+\n+    me->CastSpell(me, GetPotion(mana));\n+}\n+bool bot_ai::IsPotionReady() const\n+{\n+    return _potionTimer <= lastdiff;\n+}\n+uint32 bot_ai::GetPotion(bool mana) const\n+{\n+    for (auto i : NPCBots::index_array<uint8, MAX_POTION_SPELLS>)\n+        if (me->GetLevel() >= (mana ? ManaPotionSpells[i][0] : HealingPotionSpells[i][0]))\n+            return (mana ? ManaPotionSpells[i][1] : HealingPotionSpells[i][1]);\n+\n+    return (mana ? ManaPotionSpells[0][1] : HealingPotionSpells[0][1]);\n+}\n+bool bot_ai::IsPotionSpell(uint32 spellId) const\n+{\n+    return spellId == GetPotion(true) || spellId == GetPotion(false);\n+}\n+\n+static BotItemUseSpellTargeting SelectTargeTypetForItemSpell(uint32 spellId, Unit const* caster)\n+{\n+    SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);\n+    if (!spellInfo || spellInfo->CalcCastTime() > 1500)\n+        return BOT_ITEM_USE_SPELL_TARGET_NONE;\n+\n+    TSpellSummary const& sum = SpellSummary[spellId];\n+    if (sum.Effects & (1u << (SELECT_EFFECT_DAMAGE-1)))\n+    {\n+        if (sum.Targets & ((1u << (SELECT_TARGET_SINGLE_ENEMY-1)) | (1u << (SELECT_TARGET_ANY_ENEMY-1))))\n+            return BOT_ITEM_USE_SPELL_TARGET_ATTACKTARGET;\n+        else if (sum.Targets & (1u << (SELECT_TARGET_AOE_ENEMY-1)))\n+            return BOT_ITEM_USE_SPELL_TARGET_SELF;\n+    }\n+    else if (sum.Effects & (1u << (SELECT_EFFECT_HEALING-1)))\n+    {\n+        if (sum.Targets & ((1u << (SELECT_TARGET_SELF-1)) | (1u << (SELECT_TARGET_SINGLE_FRIEND-1)) | (1u << (SELECT_TARGET_AOE_FRIEND-1)) | (1u << (SELECT_TARGET_ANY_FRIEND-1))))\n+            if (caster->GetHealthPct() < 75.f)\n+                return BOT_ITEM_USE_SPELL_TARGET_SELF;\n+    }\n+    else if (sum.Effects & (1u << (SELECT_EFFECT_AURA-1)))\n+    {\n+        if (sum.Targets & ((1u << (SELECT_TARGET_SELF-1)) | (1u << (SELECT_TARGET_AOE_FRIEND-1)) | (1u << (SELECT_TARGET_AOE_ENEMY-1))))\n+            return BOT_ITEM_USE_SPELL_TARGET_SELF;\n+        else if (sum.Targets & ((1u << (SELECT_TARGET_SINGLE_FRIEND-1)) | (1u << (SELECT_TARGET_ANY_FRIEND-1))))\n+            return BOT_ITEM_USE_SPELL_TARGET_ALLY;\n+        else if (sum.Targets & ((1u << (SELECT_TARGET_SINGLE_ENEMY-1)) | (1u << (SELECT_TARGET_ANY_ENEMY-1))))\n+            return BOT_ITEM_USE_SPELL_TARGET_ATTACKTARGET;\n+    }\n+    else // if (sum.Effects == 0)\n+    {\n+        if (sum.Targets & ((1u << (SELECT_TARGET_SINGLE_ENEMY-1)) | (1u << (SELECT_TARGET_ANY_ENEMY-1))))\n+            return BOT_ITEM_USE_SPELL_TARGET_ATTACKTARGET;\n+        else if (sum.Targets & ((1u << (SELECT_TARGET_AOE_ENEMY-1)) | (1u << (SELECT_TARGET_SELF-1)) | (1u << (SELECT_TARGET_SINGLE_FRIEND-1)) | (1u << (SELECT_TARGET_AOE_FRIEND-1)) | (1u << (SELECT_TARGET_ANY_FRIEND-1))))\n+            return BOT_ITEM_USE_SPELL_TARGET_SELF;\n+        else // if (sum.Targets == 0)\n+            return BOT_ITEM_USE_SPELL_TARGET_SELF;\n+    }\n+\n+    return BOT_ITEM_USE_SPELL_TARGET_NONE;\n+}\n+bool bot_ai::IsUsableItem(Item const* item)\n+{\n+    if (ItemTemplate const* proto = item->GetTemplate())\n+    {\n+        for (auto const& itemSpell : proto->Spells)\n+        {\n+            if (itemSpell.SpellId != 0 && itemSpell.SpellTrigger == ITEM_SPELLTRIGGER_ON_USE)\n+                return true;\n+        }\n+    }\n+\n+    return false;\n+}\n+uint32 bot_ai::GetItemSpellCooldown(uint32 spellId) const\n+{\n+    for (Item const* item : _equips)\n+    {\n+        if (item && IsUsableItem(item))\n+        {\n+            ItemTemplate const* proto = item->GetTemplate();\n+            for (auto const& itemSpell : proto->Spells)\n+            {\n+                if (itemSpell.SpellId == decltype(itemSpell.SpellId)(spellId))\n+                    return itemSpell.SpellCooldown;\n+            }\n+        }\n+    }\n+\n+    return 0;\n+}\n+void bot_ai::CheckUsableItems(uint32 diff)\n+{\n+    if (!_usableItemSlotsMask || itemsAutouseTimer > diff || !me->IsInCombat() || IsCasting() || (!me->GetVictim() && me->getAttackers().empty()))\n+        return;\n+\n+    itemsAutouseTimer = urand(2500, 5500);\n+\n+    for (auto slot : NPCBots::index_array<uint8, BOT_INVENTORY_SIZE>)\n+    {\n+        if (_usableItemSlotsMask & (1ul << slot))\n+        {\n+            if (Item const* item = _equips[slot])\n+            {\n+                bool is_spell_ready = false;\n+                uint32 firstItemSpellId = 0;\n+                for (auto const& itemSpell : item->GetTemplate()->Spells)\n+                {\n+                    if (itemSpell.SpellId > 0 && itemSpell.SpellTrigger == ITEM_SPELLTRIGGER_ON_USE)\n+                    {\n+                        if (firstItemSpellId == 0)\n+                            firstItemSpellId = itemSpell.SpellId;\n+\n+                        if (IsSpellReady(itemSpell.SpellId, diff, false))\n+                            is_spell_ready = true;\n+                        else\n+                        {\n+                            is_spell_ready = false;\n+                            break;\n+                        }\n+                    }\n+                }\n+                if (!is_spell_ready)\n+                    continue;\n+\n+                uint32 targetType = SelectTargeTypetForItemSpell(firstItemSpellId, me);\n+                Unit* castTarget = nullptr;\n+                switch (targetType)\n+                {\n+                    case BOT_ITEM_USE_SPELL_TARGET_SELF:\n+                        castTarget = me;\n+                        break;\n+                    case BOT_ITEM_USE_SPELL_TARGET_ATTACKTARGET:\n+                        castTarget = me->GetVictim();\n+                        break;\n+                    case BOT_ITEM_USE_SPELL_TARGET_ALLY:\n+                        castTarget = me->GetNextRandomRaidMemberOrPet(10.f);\n+                        if (!castTarget)\n+                            castTarget = me;\n+                        break;\n+                    case BOT_ITEM_USE_SPELL_TARGET_NONE:\n+                    default:\n+                        break;\n+                }\n+\n+                //BOT_LOG_ERROR(\"scripts\", \"bot_ai::CheckUsableItems(): bot {}, slot {}, spell {}, target {}\",\n+                //    me->GetName().c_str(), uint32(slot), firstItemSpellId, targetType);\n+\n+                if (!castTarget)\n+                    continue;\n+\n+                SpellCastTargets targets;\n+                targets.SetUnitTarget(castTarget);\n+                _castBotItemUseSpell(item, targets);\n+\n+                // do not delay next check unless all items were checked\n+                if (slot < BOT_SLOT_TRINKET2)\n+                    itemsAutouseTimer = 0;\n+\n+                break;\n+            }\n+            else\n+                BOT_LOG_ERROR(\"scripts\", \"bot_ai::CheckUsableItems(): slot {} is in mask but no item exists in that slot!\", uint32(slot));\n+        }\n+    }\n+}\n+//check if our party players are in duel. if so - ignore them, their opponents and any bots they have\n+//Deprecated after 4c26c85\n+//bool bot_ai::InDuel(Unit const* target) const\n+//{\n+//    if (!target) return false;\n+//    bool isbot = target->IsCreature() && target->ToCreature()->IsNPCBot();\n+//    Player const* player = target->IsPlayer() ? target->ToPlayer() : isbot ? target->ToCreature()->GetBotOwner()->ToPlayer() : nullptr;\n+//    if (!player)\n+//    {\n+//        if (!target->IsControlledByPlayer())\n+//            return false;\n+//        player = target->GetCharmerOrOwnerPlayerOrPlayerItself();\n+//    }\n+//\n+//    return (player && player->duel && (IsInBotParty(player) || IsInBotParty(player->duel->opponent)));\n+//}\n+////////////////\n+//GRID SEARCHERS\n+////////////////\n+//Finds player or it's corpse for resurrection returned as WorldObject*\n+WorldObject* bot_ai::GetNearbyRezTarget(float dist) const\n+{\n+    std::list<WorldObject*> list;\n+\n+    NearbyRezTargetCheck check(me, dist, this);\n+    Bcore::WorldObjectListSearcher <NearbyRezTargetCheck> searcher(me, list, check);\n+    Cell::VisitObjects(me, searcher, dist);\n+\n+    if (list.empty())\n+        return nullptr;\n+    if (list.size() == 1)\n+        return *list.begin();\n+\n+    return Bcore::Containers::SelectRandomContainerElement(list);\n+}\n+//Finds target for warrior's Shattering Throw\n+Unit* bot_ai::FindImmunityShieldDispelTarget(float dist) const\n+{\n+    //not checking range\n+    if (me->GetVictim() && me->GetVictim()->HasAuraWithMechanic(1ull<<MECHANIC_IMMUNE_SHIELD))\n+        return me->GetVictim();\n+\n+    Unit* unit = nullptr;\n+\n+    ImmunityShieldDispelTargetCheck check(me, dist, this);\n+    Bcore::UnitSearcher <ImmunityShieldDispelTargetCheck> searcher(me, unit, check);\n+    Cell::VisitObjects(me, searcher, dist);\n+    //me->VisitNearbyObject(dist, searcher);\n+\n+    return unit;\n+}\n+//Used to find target for priest's dispels, mage's spellsteal and shaman's purge\n+//Returns dispellable/stealable 'Any Hostile Unit Attacking BotParty'\n+Unit* bot_ai::FindHostileDispelTarget(float dist, bool stealable) const\n+{\n+    std::list<Unit*> unitList;\n+\n+    HostileDispelTargetCheck check(me, dist, stealable, this);\n+    Bcore::UnitListSearcher <HostileDispelTargetCheck> searcher(me, unitList, check);\n+    Cell::VisitObjects(me, searcher, dist);\n+    //me->VisitNearbyObject(dist, searcher);\n+\n+    if (unitList.empty())\n+        return nullptr;\n+    if (unitList.size() == 1)\n+        return *unitList.begin();\n+\n+    return Bcore::Containers::SelectRandomContainerElement(unitList);\n+}\n+//Finds single target affected by given spell (and given caster if is)\n+//Can check:\n+//    hostile targets  (hostile = 0) <default>\n+// DEPRECATED our party players (hostile = 1)\n+// DEPRECATED our party members  (hostile = 2)\n+//    any friendly target (hostile = 3)\n+//    any friendly player (hostile = 4)\n+//    any target in range  (hostile = any other value)\n+Unit* bot_ai::FindAffectedTarget(uint32 spellId, ObjectGuid caster, float dist, uint8 hostile) const\n+{\n+    if (!spellId)\n+        return nullptr;\n+    if ((hostile == 2 || hostile == 1)/* && IAmFree()*/)\n+    {\n+        BOT_LOG_ERROR(\"entities.player\", \"bot_ai::FindAffectedTarget(): hostile = {} Setting to ALL...\", hostile);\n+        hostile = 255;\n+    }\n+    if (master->GetMap()->Instanceable())\n+        dist = DEFAULT_VISIBILITY_INSTANCE;\n+\n+    Unit* unit = nullptr;\n+\n+    AffectedTargetCheck check(caster, dist, spellId, master, hostile);\n+    Bcore::UnitSearcher <AffectedTargetCheck> searcher(master, unit, check);\n+    Cell::VisitObjects(me, searcher, dist);\n+    //me->VisitNearbyObject(dist, searcher);\n+\n+    return unit;\n+}\n+//Finds target for mage's polymorph or shaman's hex\n+Unit* bot_ai::FindPolyTarget(float dist) const\n+{\n+    std::list<Unit*> unitList;\n+\n+    PolyUnitCheck check(me, dist);\n+    Bcore::UnitListSearcher <PolyUnitCheck> searcher(me, unitList, check);\n+    Cell::VisitObjects(me, searcher, dist);\n+    //me->VisitNearbyObject(dist, searcher);\n+\n+    if (unitList.empty())\n+        return nullptr;\n+    if (unitList.size() == 1)\n+        return *unitList.begin();\n+    decltype(unitList)::const_iterator it = std::ranges::find_if(unitList, [this](Unit const* u) { return IsPointedNoDPSTarget(u); });\n+    if (it != unitList.cend())\n+        return *it;\n+\n+    return Bcore::Containers::SelectRandomContainerElement(unitList);\n+}\n+//Finds target for direct fear (warlock, hunter)\n+Unit* bot_ai::FindFearTarget(float dist) const\n+{\n+    std::list<Unit*> unitList;\n+\n+    FearUnitCheck check(me, dist, this);\n+    Bcore::UnitListSearcher <FearUnitCheck> searcher(me, unitList, check);\n+    Cell::VisitObjects(me, searcher, dist);\n+    //me->VisitNearbyObject(dist, searcher);\n+\n+    if (unitList.empty())\n+        return nullptr;\n+    if (unitList.size() == 1)\n+        return *unitList.begin();\n+    decltype(unitList)::const_iterator it = std::ranges::find_if(unitList, [this](Unit const* u) { return IsPointedNoDPSTarget(u); });\n+    if (it != unitList.cend())\n+        return *it;\n+\n+    return Bcore::Containers::SelectRandomContainerElement(unitList);\n+}\n+//Finds target for CC spells with MECHANIC_STUN\n+Unit* bot_ai::FindStunTarget(float dist) const\n+{\n+    std::list<Unit*> unitList;\n+\n+    StunUnitCheck check(me, dist);\n+    Bcore::UnitListSearcher <StunUnitCheck> searcher(me, unitList, check);\n+    Cell::VisitObjects(me, searcher, dist);\n+    //me->VisitNearbyObject(dist, searcher);\n+\n+    if (unitList.empty())\n+        return nullptr;\n+    if (unitList.size() == 1)\n+        return *unitList.begin();\n+    decltype(unitList)::const_iterator it = std::ranges::find_if(unitList, [this](Unit const* u) { return IsPointedNoDPSTarget(u); });\n+    if (it != unitList.cend())\n+        return *it;\n+\n+    return Bcore::Containers::SelectRandomContainerElement(unitList);\n+}\n+//Finds target for priest's shackles\n+Unit* bot_ai::FindUndeadCCTarget(float dist, uint32 spellId, bool unattacked) const\n+{\n+    if (!spellId)\n+        return nullptr;\n+\n+    std::list<Unit*> unitList;\n+\n+    UndeadCCUnitCheck check(me, dist, this, spellId, unattacked);\n+    Bcore::UnitListSearcher <UndeadCCUnitCheck> searcher(me, unitList, check);\n+    Cell::VisitObjects(me, searcher, dist);\n+    //me->VisitNearbyObject(dist, searcher);\n+\n+    if (unitList.empty())\n+        return nullptr;\n+    if (unitList.size() == 1)\n+        return *unitList.begin();\n+    decltype(unitList)::const_iterator it = std::ranges::find_if(unitList, [this](Unit const* u) { return IsPointedNoDPSTarget(u); });\n+    if (it != unitList.cend())\n+        return *it;\n+\n+    return Bcore::Containers::SelectRandomContainerElement(unitList);\n+}\n+//Finds target for druid's Entangling Roots\n+Unit* bot_ai::FindRootTarget(float dist, uint32 spellId) const\n+{\n+    if (!spellId)\n+        return nullptr;\n+\n+    std::list<Unit*> unitList;\n+\n+    RootUnitCheck check(me, dist, this, spellId);\n+    Bcore::UnitListSearcher <RootUnitCheck> searcher(me, unitList, check);\n+    Cell::VisitObjects(me, searcher, dist);\n+    //me->VisitNearbyObject(dist, searcher);\n+\n+    if (unitList.empty())\n+        return nullptr;\n+    if (unitList.size() == 1)\n+        return *unitList.begin();\n+    decltype(unitList)::const_iterator it = std::ranges::find_if(unitList, [this](Unit const* u) { return IsPointedNoDPSTarget(u); });\n+    if (it != unitList.cend())\n+        return *it;\n+\n+    return Bcore::Containers::SelectRandomContainerElement(unitList);\n+}\n+//Finds casting target (neutral or enemy)\n+//Can be used to get silence/interruption/reflect/grounding check\n+Unit* bot_ai::FindCastingTarget(float maxdist, float mindist, uint32 spellId, uint8 minHpPct) const\n+{\n+    std::list<Unit*> unitList;\n+\n+    CastingUnitCheck check(me, mindist, maxdist, spellId, minHpPct);\n+    Bcore::UnitListSearcher <CastingUnitCheck> searcher(me, unitList, check);\n+    Cell::VisitObjects(me, searcher, maxdist);\n+    //me->VisitNearbyObject(maxdist, searcher);\n+\n+    if (unitList.empty())\n+        return nullptr;\n+    if (unitList.size() == 1)\n+        return *unitList.begin();\n+    decltype(unitList)::const_iterator it = std::ranges::find_if(unitList, [this](Unit const* u) { return IsPointedNoDPSTarget(u); });\n+    if (it != unitList.cend())\n+        return *it;\n+\n+    return Bcore::Containers::SelectRandomContainerElement(unitList);\n+}\n+// Returns target for dest AOE spell (blizzard, hurricane, etc.) based on crowd size, movement state and direction\n+Unit* bot_ai::FindAOETarget(float dist, WorldObject const* src) const\n+{\n+    if (!src)\n+        src = me;\n+\n+    std::list<Unit*> unitList;\n+    GetNearbyTargetsList(unitList, dist, 0);\n+\n+    if (unitList.size() < 3)\n+        return nullptr;\n+\n+    Unit* unit = nullptr;\n+    float mydist = dist;\n+    for (Unit* u : unitList)\n+    {\n+        if (u->isMoving() && u->GetVictim() &&\n+            (u->GetDistance2d(u->GetVictim()->GetPositionX(), u->GetVictim()->GetPositionY()) > 7.5f ||\n+            !u->HasInArc(float(M_PI)*0.75f, u->GetVictim())))\n+            continue;\n+\n+        if (!unit && u->GetVictim() && u->GetDistance(u->GetVictim()) < dist * 0.334f)\n+        {\n+            unit = u;\n+            continue;\n+        }\n+        if (!unit)\n+        {\n+            float destDist = src->GetDistance(u->GetPositionX(), u->GetPositionY(), u->GetPositionZ());\n+            if (destDist < mydist)\n+            {\n+                mydist = destDist;\n+                unit = u;\n+            }\n+        }\n+        if (unit)\n+        {\n+            uint8 count = 0;\n+            for (Unit* u2 : unitList)\n+            {\n+                if (u2 != unit && u2->GetDistance2d(unit->GetPositionX(), unit->GetPositionY()) < 5.f)\n+                {\n+                    if (++count > 2)\n+                    {\n+                        if (src->GetDistance(u2) < src->GetDistance(unit) && unit->HasInArc(float(M_PI)/2, src))\n+                            unit = u2;\n+                        break;\n+                    }\n+                }\n+            }\n+            if (count > 2)\n+                break;\n+\n+            unit = nullptr;\n+        }\n+    }\n+\n+    return unit;\n+}\n+// Finds secondary target for spells like Cleave, Swipe, etc.\n+Unit* bot_ai::FindSplashTarget(float dist, Unit* To, float splashdist) const\n+{\n+    if (!To)\n+        To = me->GetVictim();\n+    if (!To)\n+        return nullptr;\n+\n+    if (me->GetDistance(To) > dist)\n+        return nullptr;\n+\n+    Unit* unit = nullptr;\n+\n+    SecondEnemyCheck check(me, dist, splashdist, To, this);\n+    Bcore::UnitSearcher <SecondEnemyCheck> searcher(me, unit, check);\n+    Cell::VisitObjects(me, searcher, dist);\n+    //me->VisitNearbyObject(dist, searcher);\n+\n+    return unit;\n+}\n+// Finds secondary target for AoE spells like Mind Sear (not damaging primary target)\n+Unit* bot_ai::FindSplashTarget(float dist, Unit* To, float splashdist, uint8 minTargets) const\n+{\n+    if (!To || minTargets < 1)\n+        return nullptr;\n+\n+    if (me->GetDistance(To) > dist)\n+        return nullptr;\n+\n+    std::list<Unit*> unitList;\n+\n+    SecondEnemyCheck check(me, dist, splashdist, To, this);\n+    Bcore::UnitListSearcher <SecondEnemyCheck> searcher(me, unitList, check);\n+    Cell::VisitObjects(me, searcher, dist);\n+    //me->VisitNearbyObject(dist, searcher);\n+\n+    if (uint8(unitList.size()) < minTargets)\n+        return nullptr;\n+    if (unitList.size() == 1)\n+        return *unitList.begin();\n+\n+    return Bcore::Containers::SelectRandomContainerElement(unitList);\n+}\n+//Finds target for hunter's Tranquilizing Shot (has dispellable magic or enrage effect)\n+Unit* bot_ai::FindTranquilTarget(float mindist, float maxdist) const\n+{\n+    Unit* unit = nullptr;\n+\n+    TranquilTargetCheck check(me, mindist, maxdist, this);\n+    Bcore::UnitSearcher <TranquilTargetCheck> searcher(me, unit, check);\n+    Cell::VisitObjects(me, searcher, maxdist);\n+    //me->VisitNearbyObject(maxdist, searcher);\n+\n+    return unit;\n+}\n+//Find target to cast taunt on\n+//In case of paladin's Righetoous Defense returns IsInBotParty() unit\n+Unit* bot_ai::FindDistantTauntTarget(float maxdist, bool ally) const\n+{\n+    std::list<Unit*> unitList;\n+\n+    FarTauntUnitCheck check(me, maxdist, ally, this);\n+    Bcore::UnitListSearcher <FarTauntUnitCheck> searcher(me, unitList, check);\n+    Cell::VisitObjects(me, searcher, maxdist);\n+    //me->VisitNearbyObject(maxdist, searcher);\n+\n+    if (unitList.empty())\n+        return nullptr;\n+\n+    Unit* unit = unitList.size() == 1 ? *unitList.begin() : Bcore::Containers::SelectRandomContainerElement(unitList);\n+    return ally ? unit->GetVictim() : unit;\n+}\n+//Finds target for Warlock's Mana Drain\n+//Returns nearby CCed unit with most mana\n+Unit* bot_ai::FindDrainTarget(float maxdist) const\n+{\n+    Unit* unit = nullptr;\n+\n+    ManaDrainUnitCheck check(me, maxdist, this);\n+    Bcore::UnitLastSearcher <ManaDrainUnitCheck> searcher(me, unit, check);\n+    Cell::VisitObjects(me, searcher, maxdist);\n+    //me->VisitNearbyObject(maxdist, searcher);\n+\n+    return unit;\n+}\n+//Finds all targets within given range\n+//used for finding targets for spells which need reasonable amount of targets (ex. Death Knight AOE spells)\n+//CCoption:= mask\n+//1 - not CCed\n+//2 - has no periodic damage auras (can be safely CCed)\n+void bot_ai::GetNearbyTargetsList(std::list<Unit*> &targets, float maxdist, uint8 CCoption, WorldObject const* source) const\n+{\n+    if (!source)\n+        source = me;\n+\n+    NearbyHostileUnitCheck check(me, maxdist, this, CCoption, source);\n+    Bcore::UnitListSearcher <NearbyHostileUnitCheck> searcher(me, targets, check);\n+    Cell::VisitObjects(me, searcher, maxdist);\n+    //me->VisitNearbyObject(maxdist, searcher);\n+}\n+//Find all targets within given range in cone in front of caster; angle is PI/2 (TC confirmed)\n+//used by mage Dragon's Breath and Cone of Cold spells\n+//also Swipe (Bear) and Swipe (Cat)\n+void bot_ai::GetNearbyTargetsInConeList(std::list<Unit*> &targets, float maxdist) const\n+{\n+    NearbyHostileUnitInConeCheck check(me, maxdist, this);\n+    Bcore::UnitListSearcher <NearbyHostileUnitInConeCheck> searcher(me, targets, check);\n+    Cell::VisitObjects(me, searcher, maxdist);\n+    //me->VisitNearbyObject(maxdist, searcher);\n+}\n+//Finds all friendly targets within given range\n+//used for finding targets to heal/buff for uncontrolled bots\n+void bot_ai::GetNearbyFriendlyTargetsList(std::list<Unit*> &targets, float maxdist) const\n+{\n+    NearbyFriendlyUnitCheck check(me, maxdist, this);\n+    Bcore::UnitListSearcher <NearbyFriendlyUnitCheck> searcher(me, targets, check);\n+    Cell::VisitObjects(me, searcher, maxdist);\n+    //me->VisitNearbyObject(maxdist, searcher);\n+}\n+//////////\n+//SPELLMAP\n+//////////\n+//Using first-rank spell as source, returns spellId of max rank allowed for given caster\n+//If you want bot to use this spell through doCast() go InitSpellMap(uint32) instead\n+uint32 bot_ai::InitSpell(Unit const* caster, uint32 spell)\n+{\n+    SpellInfo const* info = sSpellMgr->GetSpellInfo(spell);\n+    if (!info)\n+    {\n+        BOT_LOG_ERROR(\"entities.player\", \"InitSpell(): No SpellInfo found for spell {}\", spell);\n+        return 0; //weird spell with no info, disable it\n+    }\n+\n+    uint8 lvl = caster->GetLevel();\n+    if (lvl < info->BaseLevel) //only 1st rank spells check\n+        return 0; //cannot use this spell\n+\n+    if (SpellInfo const* spInfo = info->GetNextRankSpell())\n+    {\n+        if (lvl < spInfo->BaseLevel)\n+            return spell; //cannot use next rank, use this one\n+        else\n+            return InitSpell(caster, spInfo->Id); //can use next rank, forward check\n+    }\n+\n+    return spell; //max rank, use this\n+}\n+//Using first-rank spell as source, puts spell of max rank allowed for given caster in spellmap\n+void bot_ai::InitSpellMap(uint32 basespell, bool forceadd, bool forwardRank)\n+{\n+    SpellInfo const* info = sSpellMgr->GetSpellInfo(basespell);\n+    if (!info)\n+    {\n+        BOT_LOG_ERROR(\"entities.player\", \"bot_ai::InitSpellMap(): No SpellInfo found for base spell {}\", basespell);\n+        return; //invalid spell id\n+    }\n+    info = info->TryGetSpellInfoOverride(me);\n+\n+    uint8 lvl = me->GetLevel();\n+    uint32 spellId = forceadd ? basespell : 0;\n+\n+    while (info != nullptr && forwardRank && (forceadd || lvl >= info->BaseLevel))\n+    {\n+        spellId = info->Id; //can use this spell\n+        info = info->GetNextRankSpell(); //check next rank\n+    }\n+\n+    BotSpell& newSpell = _spells.try_emplace(basespell).first->second;\n+    newSpell.spellId = spellId;\n+\n+    if (_botData->disabled_spells.contains(basespell))\n+    {\n+        newSpell.enabled = false;\n+        //BOT_LOG_ERROR(\"entities.player\", \"bot_ai::InitSpellMap(): %s (%u -> %u) is disabled for %s!\",\n+        //    sSpellMgr->GetSpellInfo(basespell)->SpellName[0], basespell, spellId, me->GetName().c_str());\n+    }\n+}\n+//Using first-rank spell as source, return true if spell is inited\n+bool bot_ai::HasSpell(uint32 basespell) const\n+{\n+    decltype(_spells)::const_iterator itr = _spells.find(basespell);\n+    return itr != _spells.end() && (itr->second.spellId != 0);\n+}\n+//Using spell name as source, return first-rank spell if spell is inited\n+uint32 bot_ai::GetBaseSpell(std::string_view spell_name, LocaleConstant locale) const\n+{\n+    uint32 basespell = 0;\n+    std::wstring wname;\n+    if (Utf8toWStr(spell_name, wname))\n+    {\n+        wstrToLower(wname);\n+        for (auto const& [rank1_id, spell] : _spells)\n+        {\n+            //we ignore enabled state since this is exactly what we want\n+            if (spell.spellId == 0) //not init'ed\n+                continue;\n+            spell_name = sSpellMgr->GetSpellInfo(rank1_id)->SpellName[locale];\n+            std::wstring wcname;\n+            if (!Utf8toWStr(spell_name, wcname))\n+                continue;\n+            wstrToLower(wcname);\n+            if (wcname == wname)\n+            {\n+                basespell = rank1_id;\n+                break;\n+            }\n+        }\n+    }\n+\n+    return basespell;\n+}\n+//Using first-rank spell as source, return current spell id if inited and enabled\n+uint32 bot_ai::GetSpell(uint32 basespell) const\n+{\n+    decltype(_spells)::const_iterator itr = _spells.find(basespell);\n+    return itr != _spells.end() && (itr->second.enabled == true || IAmFree()) ? itr->second.spellId : 0;\n+}\n+//Using first-rank spell as source, returns cooldown on current spell\n+uint32 bot_ai::GetSpellCooldown(uint32 basespell) const\n+{\n+    decltype(_spells)::const_iterator itr = _spells.find(basespell);\n+    return itr != _spells.end() ? itr->second.cooldown : 0;\n+}\n+bool bot_ai::IsSpellReady(uint32 basespell, uint32 diff, bool checkGCD) const\n+{\n+    if (checkGCD && GC_Timer > diff)\n+        return false;\n+\n+    decltype(_spells)::const_iterator itr = _spells.find(basespell);\n+    return itr == _spells.end() ? true :\n+        ((itr->second.enabled == true || IAmFree() || IsLastOrder(BOT_ORDER_SPELLCAST, basespell)) &&\n+            itr->second.spellId != 0 && itr->second.cooldown <= diff);\n+}\n+//Using first-rank spell as source, sets cooldown for current spell\n+void bot_ai::SetSpellCooldown(uint32 basespell, uint32 msCooldown)\n+{\n+    //if (!msCooldown)\n+    //    return;\n+\n+    BotSpell& newSpell = _spells.try_emplace(basespell).first->second;\n+    newSpell.cooldown = msCooldown;\n+}\n+//Using first-rank spell as source, sets cooldown for spells of that category\n+void bot_ai::SetSpellCategoryCooldown(SpellInfo const* spellInfo, uint32 msCooldown)\n+{\n+    if (!msCooldown)\n+        return;\n+\n+    uint32 category = spellInfo->GetCategory();\n+    if (!category)\n+        category = spellInfo->StartRecoveryCategory;\n+    if (!category)\n+        return;\n+\n+    SpellInfo const* info;\n+    for (auto& [rank1_id, spell] : _spells)\n+    {\n+        //skip spell which has triggered this category cooldown\n+        if (rank1_id == spellInfo->Id && spell.cooldown >= msCooldown)\n+            continue;\n+\n+        info = sSpellMgr->GetSpellInfo(spell.spellId);\n+        info = info ? info->TryGetSpellInfoOverride(me) : info;\n+        if (info && rank1_id == spellInfo->Id && info->GetCategory() != category && info->StartRecoveryCategory != category)\n+        {\n+            //if (itr->first != 7814) // Lash of Pain\n+            {\n+                BOT_LOG_ERROR(\"scripts\", \"Warning: SetSpellCategoryCooldown: {} has baseId {} but category {}, not {}!\",\n+                    info->Id, rank1_id, info->GetCategory(), category);\n+            }\n+        }\n+        if (info && (info->GetCategory() == category || info->StartRecoveryCategory == category || rank1_id == spellInfo->Id) && spell.cooldown < msCooldown)\n+            spell.cooldown = msCooldown;\n+    }\n+}\n+//Handles spell cooldowns for spell with IsCooldownStartedOnEvent() == true\n+void bot_ai::ReleaseSpellCooldown(uint32 basespell)\n+{\n+    SpellInfo const* baseInfo = sSpellMgr->GetSpellInfo(basespell);\n+\n+    baseInfo = baseInfo->TryGetSpellInfoOverride(me);\n+\n+    if (!baseInfo->IsCooldownStartedOnEvent())\n+    {\n+        BOT_LOG_ERROR(\"spells\", \"bot_ai::ReleaseSpellCooldown is called for wrong spell {}!\", basespell);\n+        return;\n+    }\n+\n+    uint32 rec = baseInfo->RecoveryTime;\n+    uint32 catrec = baseInfo->CategoryRecoveryTime;\n+\n+    ApplyBotSpellCooldownMods(baseInfo, rec);\n+    ApplyBotSpellCategoryCooldownMods(baseInfo, catrec);\n+\n+    SetSpellCooldown(baseInfo->Id, rec > 0 ? rec : 0);\n+    SetSpellCategoryCooldown(baseInfo, catrec > 0 && !(baseInfo->AttributesEx6 & SPELL_ATTR6_NO_CATEGORY_COOLDOWN_MODS) ? catrec : 0);\n+}\n+//Using first-rank spell as source, disables certain spell for this bot\n+void bot_ai::RemoveSpell(uint32 basespell)\n+{\n+    BotSpell& newSpell = _spells.try_emplace(basespell).first->second;\n+    newSpell.spellId = 0;\n+    newSpell.cooldown = 0;\n+}\n+//\n+//void bot_ai::RemoveAllSpells()\n+//{\n+//    for (BotSpellMap::const_iterator itr = _spells.begin(); itr != _spells.end(); ++itr)\n+//        itr->second->spellId = 0;\n+//}\n+void bot_ai::EnableAllSpells(bool save)\n+{\n+    if (save)\n+    {\n+        _botData->disabled_spells.clear();\n+        _saveDisabledSpells = true;\n+    }\n+\n+    for (auto& [rank1_id, spell] : _spells)\n+        spell.enabled = true;\n+}\n+//See CommonTimers(uint32)\n+void bot_ai::SpellTimers(uint32 diff)\n+{\n+    // spell must be initialized!!!\n+    for (auto& [rank1_id, spell] : _spells)\n+    {\n+        if (spell.cooldown >= diff)\n+            spell.cooldown -= diff;\n+        else if (spell.cooldown > 0)\n+            spell.cooldown = 0;\n+    }\n+}\n+uint32 bot_ai::RaceSpellForClass(uint8 myrace, uint8 myclass)\n+{\n+    switch (myrace)\n+    {\n+        case RACE_ORC:\n+            switch (myclass)\n+            {\n+                case BOT_CLASS_WARLOCK:\n+                    return RACIAL_BLOOD_FURY_WARLOCK;\n+                case BOT_CLASS_SHAMAN:\n+                    return RACIAL_BLOOD_FURY_SHAMAN;\n+                default:\n+                    return RACIAL_BLOOD_FURY_OTHERS;\n+            }\n+            break;\n+        case RACE_BLOODELF:\n+            switch (myclass)\n+            {\n+                case BOT_CLASS_DEATH_KNIGHT:\n+                    return RACIAL_ARCANE_TORRENT_DEATHKNIGHT;\n+                case BOT_CLASS_ROGUE:\n+                    return RACIAL_ARCANE_TORRENT_ROGUE;\n+                default:\n+                    return RACIAL_ARCANE_TORRENT_OTHERS;\n+            }\n+            break;\n+        case RACE_DRAENEI:\n+            switch (myclass)\n+            {\n+                case BOT_CLASS_WARRIOR:\n+                    return RACIAL_GIFT_OF_NAARU_WARRIOR;\n+                case BOT_CLASS_PALADIN:\n+                    return RACIAL_GIFT_OF_NAARU_PALADIN;\n+                case BOT_CLASS_HUNTER:\n+                    return RACIAL_GIFT_OF_NAARU_HUNTER;\n+                case BOT_CLASS_PRIEST:\n+                    return RACIAL_GIFT_OF_NAARU_PRIEST;\n+                case BOT_CLASS_DEATH_KNIGHT:\n+                    return RACIAL_GIFT_OF_NAARU_DEATHKNIGHT;\n+                case BOT_CLASS_SHAMAN:\n+                    return RACIAL_GIFT_OF_NAARU_SHAMAN;\n+                case BOT_CLASS_MAGE:\n+                    return RACIAL_GIFT_OF_NAARU_MAGE;\n+                default:\n+                    BOT_LOG_ERROR(\"entities.player\", \"RaceSpellForClass(): unknows race:class combo {}, {}\", uint32(myrace), uint32(myclass));\n+                    return 0;\n+            }\n+            break;\n+        default:\n+            BOT_LOG_ERROR(\"entities.player\", \"RaceSpellForClass(): unknows race:class combo {}, {}\", uint32(myrace), uint32(myclass));\n+            return 0;\n+    }\n+}\n+//Health magement for minions\n+//Including health calcs, set\n+void bot_ai::_OnHealthUpdate() const\n+{\n+    uint8 mylevel = master->GetLevel();\n+    PlayerClassLevelInfo classinfo;\n+    sObjectMgr->GetPlayerClassLevelInfo(GetPlayerClass(), std::min<uint8>(mylevel, DEFAULT_MAX_LEVEL), &classinfo);\n+\n+    //BOT_LOG_ERROR(\"entities.player\", \"_OnHealthUpdate(): updating bot {}\", me->GetName());\n+    bool fullhp = me->GetHealth() == me->GetMaxHealth();\n+    float pct = fullhp ? 100.f : me->GetHealthPct(); // needs for regeneration\n+    uint32 m_basehp = uint32(classinfo.basehealth * (BotMgr::IsWanderingWorldBot(me) ? BotCfg::GetBotWandererHPMod() : BotCfg::GetBotHPMod()));\n+    //BOT_LOG_ERROR(\"entities.player\", \"class base health: %u\", m_basehp);\n+    me->SetCreateHealth(m_basehp);\n+\n+    float stamValue = _getTotalBotStat(BOT_STAT_MOD_STAMINA);\n+\n+    stamValue -= std::min<float>(me->GetCreateStat(STAT_STAMINA), 20.f); //not a mistake\n+    stamValue = std::max<float>(stamValue, 0.f);\n+\n+    //BOT_LOG_ERROR(\"entities.player\", \"bot's stats to health add: Stamina (%f), value: %f\", stamValue, stamValue * 10.f);\n+    float hp_add = stamValue * 10.f + 20; //20 is not a mistake;\n+    //hp_add += IAmFree() ? mylevel * 375.f : 0; //+30000/+0 hp at 80\n+    hp_add += _getTotalBotStat(BOT_STAT_MOD_HEALTH);\n+    //BOT_LOG_ERROR(\"entities.player\", \"health to add after stam mod: %i\", hp_add);\n+    uint32 m_totalhp = m_basehp + int32(hp_add * (BotMgr::IsWanderingWorldBot(me) ? BotCfg::GetBotWandererHPMod() : BotCfg::GetBotHPMod()));\n+    //BOT_LOG_ERROR(\"entities.player\", \"total base health: %u\", m_totalhp);\n+\n+    //hp bonuses\n+    uint8 bonuspct = 0;\n+    //Endurance Training\n+    if (_botclass == BOT_CLASS_HUNTER && mylevel >= 10)\n+        bonuspct += 5;\n+    //Fel Vitality\n+    if (_botclass == BOT_CLASS_WARLOCK && mylevel >= 15)\n+        bonuspct += 3;\n+    //Sphynx bonus (some equip slots unavailable)\n+    if (_botclass == BOT_CLASS_SPHYNX)\n+        bonuspct += 50;\n+    //Dreadlord's / Crypt Lord's vitality\n+    if (_botclass == BOT_CLASS_DREADLORD || _botclass == BOT_CLASS_CRYPT_LORD)\n+        bonuspct += 20;\n+    if (bonuspct)\n+        m_totalhp = (m_totalhp * (100 + bonuspct)) / 100;\n+\n+    //m_totalhp = float(uint32(m_totalhp) - (uint32(m_totalhp) % 10));\n+    me->SetStatFlatModifier(UNIT_MOD_HEALTH, BASE_VALUE, float(m_totalhp) * BotCfg::GetBotHPModByLevel(me->GetLevel())); //replaces base hp at max lvl\n+    me->UpdateMaxHealth(); //will use our values we just set (update base health and buffs)\n+    //BOT_LOG_ERROR(\"entities.player\", \"overall hp: %u\", me->GetMaxHealth());\n+    me->SetHealth(fullhp ? me->GetMaxHealth() : uint32(0.5f + float(me->GetMaxHealth()) * pct / 100.f)); //restore pct\n+}\n+//Mana management for minions\n+//Including calcs and set\n+void bot_ai::_OnManaUpdate() const\n+{\n+    if (me->GetMaxPower(POWER_MANA) <= 1)\n+        return;\n+\n+    uint8 mylevel = master->GetLevel();\n+    PlayerClassLevelInfo classinfo;\n+    sObjectMgr->GetPlayerClassLevelInfo(GetPlayerClass(), std::min<uint8>(mylevel, DEFAULT_MAX_LEVEL), &classinfo);\n+\n+    //BOT_LOG_ERROR(\"entities.player\", \"_OnManaUpdate(): updating bot %s\", me->GetName().c_str());\n+    bool fullmana = me->GetPower(POWER_MANA) == me->GetMaxPower(POWER_MANA);\n+    float pct = fullmana ? 100.f : (float(me->GetPower(POWER_MANA)) * 100.f) / float(me->GetMaxPower(POWER_MANA));\n+    float m_basemana = classinfo.basemana;\n+    if (_botclass == BOT_CLASS_BM)\n+        m_basemana = float(BASE_MANA_1_BM) + float(BASE_MANA_10_BM - BASE_MANA_1_BM) * (mylevel/81.f);\n+    if (_botclass == BOT_CLASS_SPHYNX)\n+        m_basemana = BASE_MANA_SPHYNX;\n+    if (_botclass == BOT_CLASS_ARCHMAGE)\n+        m_basemana = float(BASE_MANA_1_ARCHMAGE) + float(BASE_MANA_10_ARCHMAGE - BASE_MANA_1_ARCHMAGE) * ((mylevel - 20)/81.f);\n+    if (_botclass == BOT_CLASS_DREADLORD)\n+        m_basemana = float(BASE_MANA_1_DREADLORD) + float(BASE_MANA_10_DREADLORD - BASE_MANA_1_DREADLORD) * ((mylevel - 60)/83.f);\n+    if (_botclass == BOT_CLASS_SPELLBREAKER)\n+        m_basemana = BASE_MANA_SPELLBREAKER;\n+    if (_botclass == BOT_CLASS_DARK_RANGER)\n+        m_basemana = float(BASE_MANA_1_DARK_RANGER) + float(BASE_MANA_10_DARK_RANGER - BASE_MANA_1_DARK_RANGER) * ((mylevel - 40)/82.f);\n+    if (_botclass == BOT_CLASS_NECROMANCER)\n+        m_basemana = BASE_MANA_NECROMANCER;\n+    if (_botclass == BOT_CLASS_SEA_WITCH)\n+        m_basemana = float(BASE_MANA_1_SEA_WITCH) + float(BASE_MANA_10_SEA_WITCH - BASE_MANA_1_SEA_WITCH) * (mylevel/83.f);\n+    if (_botclass == BOT_CLASS_CRYPT_LORD)\n+        m_basemana = float(BASE_MANA_1_CRYPT_LORD) + float(BASE_MANA_10_CRYPT_LORD - BASE_MANA_1_CRYPT_LORD) * (mylevel/83.f);\n+    //BOT_LOG_ERROR(\"entities.player\", \"classinfo base mana = %f\", m_basemana);\n+\n+    me->SetCreateMana(uint32(m_basemana));\n+\n+    float intValue = _getTotalBotStat(BOT_STAT_MOD_INTELLECT);\n+\n+    intValue -= std::min<float>(me->GetCreateStat(STAT_INTELLECT), 20.f); //not a mistake\n+    intValue = std::max<float>(intValue, 0.f);\n+\n+    float intMult = _botclass < BOT_CLASS_EX_START ? 15.f : IsHeroExClass(_botclass) ? 5.f : 1.5f;\n+\n+    m_basemana = intValue * intMult + 20.f; //20.f is not a mistake\n+    //m_basemana += IAmFree() ? mylevel * 50.f : 0; //+4000/+0 mana at 80\n+    m_basemana += _getTotalBotStat(BOT_STAT_MOD_MANA);\n+\n+    //mana bonuses\n+    uint8 bonuspct = 0;\n+    //Fel Vitality\n+    if (_botclass == BOT_CLASS_WARLOCK && mylevel >= 15)\n+        bonuspct += 3;\n+    if (bonuspct)\n+        m_basemana = (m_basemana * (100 + bonuspct)) / 100;\n+\n+    //m_basemana = float(uint32(m_basemana) - (uint32(m_basemana) % 5));\n+    me->SetStatFlatModifier(UNIT_MOD_MANA, BASE_VALUE, m_basemana * BotCfg::GetBotMPModByLevel(me->GetLevel()));\n+    me->UpdateMaxPower(POWER_MANA);\n+    me->SetPower(POWER_MANA, fullmana ? me->GetMaxPower(POWER_MANA) :\n+        uint32(0.5f + float(me->GetMaxPower(POWER_MANA)) * pct / 100.f)); //restore pct\n+\n+    _OnManaRegenUpdate();\n+}\n+//Mana regen for minions\n+void bot_ai::_OnManaRegenUpdate() const\n+{\n+    //regen_normal\n+    uint8 mylevel = me->GetLevel();\n+    float value = float((IAmFree() && _botclass != BOT_CLASS_SPHYNX) ? mylevel / 2 : 0); //200/0 mp5 at 80\n+\n+    float power_regen_mp5;\n+    int32 modManaRegenInterrupt;\n+    if (_botclass < BOT_CLASS_EX_START)\n+    {\n+        // Mana regen from spirit and intellect\n+        float spiregen = 0.001f;\n+        if (GtRegenMPPerSptEntry const* moreRatio = sGtRegenMPPerSptStore.LookupEntry((_botclass-1)*GT_MAX_LEVEL + mylevel-1))\n+            spiregen = moreRatio->ratio * _getTotalBotStat(BOT_STAT_MOD_SPIRIT);\n+\n+        // PCT bonus from SPELL_AURA_MOD_POWER_REGEN_PERCENT aura on spirit base regen\n+        value += sqrt(_getTotalBotStat(BOT_STAT_MOD_INTELLECT)) * spiregen * me->GetTotalAuraMultiplierByMiscValue(SPELL_AURA_MOD_POWER_REGEN_PERCENT, POWER_MANA);\n+        // regen from SPELL_AURA_MOD_POWER_REGEN aura (per second)\n+        power_regen_mp5 = 0.2f * (me->GetTotalAuraModifierByMiscValue(SPELL_AURA_MOD_POWER_REGEN, POWER_MANA) + _getTotalBotStat(BOT_STAT_MOD_MANA_REGENERATION));\n+\n+        // bonus from SPELL_AURA_MOD_MANA_REGEN_FROM_STAT aura\n+        for (AuraEffect const* aeff : me->GetAuraEffectsByType(SPELL_AURA_MOD_MANA_REGEN_FROM_STAT))\n+            power_regen_mp5 += me->GetStat(Stats(aeff->GetMiscValue())) * aeff->GetAmount() * 0.002f; //per second\n+\n+        //bot also receive bonus from SPELL_AURA_MOD_POWER_REGEN_PERCENT for mp5 regen\n+        power_regen_mp5 *= me->GetTotalAuraMultiplierByMiscValue(SPELL_AURA_MOD_POWER_REGEN_PERCENT, POWER_MANA);\n+\n+        // Set regen rate in cast state apply only on spirit based regen\n+        modManaRegenInterrupt = std::min<int32>(100, me->GetTotalAuraModifier(SPELL_AURA_MOD_MANA_REGEN_INTERRUPT));\n+    }\n+    else\n+    {\n+        modManaRegenInterrupt = 100;\n+        power_regen_mp5 = 0.0f;\n+\n+        if (IsHeroExClass(_botclass))\n+        {\n+            float basemana;\n+            if (_botclass == BOT_CLASS_BM)\n+                basemana = BASE_MANA_1_BM;\n+            else if (_botclass == BOT_CLASS_ARCHMAGE)\n+                basemana = BASE_MANA_1_ARCHMAGE;\n+            else if (_botclass == BOT_CLASS_DREADLORD)\n+                basemana = BASE_MANA_1_DREADLORD;\n+            else if (_botclass == BOT_CLASS_DARK_RANGER)\n+                basemana = BASE_MANA_1_DARK_RANGER;\n+            else if (_botclass == BOT_CLASS_SEA_WITCH)\n+                basemana = BASE_MANA_1_SEA_WITCH;\n+            else if (_botclass == BOT_CLASS_CRYPT_LORD)\n+                basemana = BASE_MANA_1_CRYPT_LORD;\n+            else\n+                basemana = 0.f;\n+\n+            value = basemana * 0.0087f + 0.08f * GetTotalBotStat(BOT_STAT_MOD_INTELLECT);\n+            value += 0.2f * (me->GetTotalAuraModifierByMiscValue(SPELL_AURA_MOD_POWER_REGEN, POWER_MANA) + _getTotalBotStat(BOT_STAT_MOD_MANA_REGENERATION));\n+            value *= me->GetTotalAuraMultiplierByMiscValue(SPELL_AURA_MOD_POWER_REGEN_PERCENT, POWER_MANA);\n+\n+            //if (_botclass == BOT_CLASS_SEA_WITCH && me->HasAuraType(SPELL_AURA_MANA_SHIELD))\n+            //    modManaRegenInterrupt *= 0.25f;\n+        }\n+        else if (_botclass == BOT_CLASS_SPHYNX)\n+        {\n+            value = CalculatePct(me->GetCreateMana(), 2); //-2% basemana/sec\n+        }\n+        else if (_botclass == BOT_CLASS_SPELLBREAKER)\n+        {\n+            value = 4.f; //base 0.8/sec\n+            value += 0.2f * (me->GetTotalAuraModifierByMiscValue(SPELL_AURA_MOD_POWER_REGEN, POWER_MANA) + _getTotalBotStat(BOT_STAT_MOD_MANA_REGENERATION));\n+            value *= me->GetTotalAuraMultiplierByMiscValue(SPELL_AURA_MOD_POWER_REGEN_PERCENT, POWER_MANA);\n+        }\n+        else if (_botclass == BOT_CLASS_NECROMANCER)\n+        {\n+            value = 7.5f; //base 1.5/sec\n+            value += 0.2f * (me->GetTotalAuraModifierByMiscValue(SPELL_AURA_MOD_POWER_REGEN, POWER_MANA) + _getTotalBotStat(BOT_STAT_MOD_MANA_REGENERATION));\n+            value *= me->GetTotalAuraMultiplierByMiscValue(SPELL_AURA_MOD_POWER_REGEN_PERCENT, POWER_MANA);\n+        }\n+        else\n+            value = 0;\n+    }\n+\n+    //Unrelenting Storm, Dreamstate: 12% of intellect as mana regen always (divided by 5)\n+    if ((_botclass == BOT_CLASS_SHAMAN && GetSpec() == BOT_SPEC_SHAMAN_ELEMENTAL) ||\n+        (_botclass == BOT_CLASS_DRUID && GetSpec() == BOT_SPEC_DRUID_BALANCE))\n+        power_regen_mp5 += 0.024f * _getTotalBotStat(BOT_STAT_MOD_INTELLECT);\n+\n+    me->SetStatFloatValue(UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER, power_regen_mp5 + CalculatePct(value, modManaRegenInterrupt));\n+    me->SetStatFloatValue(UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER, power_regen_mp5 + value);\n+}\n+\n+void bot_ai::_UpdateWMOArea()\n+{\n+    _wmoAreaUpdateTimer = urand(7000, 9000);\n+\n+    uint32 mogpFlags;\n+    int32 adtId, rootId, groupId;\n+    if (!me->GetMap()->GetAreaInfo(me->GetPhaseMask(), me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(),\n+        mogpFlags, adtId, rootId, groupId))\n+        return;\n+\n+    if (WMOAreaTableEntry const* wmoEntry = GetWMOAreaTableEntryByTripple(rootId, adtId, groupId))\n+    {\n+        _lastWMOAreaId = wmoEntry->Id;\n+        //BOT_LOG_ERROR(\"scripts\", \"_UpdateWMOArea(): bot %s: area %u, wmoarea %u\", me->GetName().c_str(), _lastAreaId, _lastWMOAreaId);\n+    }\n+}\n+\n+void bot_ai::_OnZoneUpdate(uint32 zoneId, uint32 areaId)\n+{\n+    ASSERT(me->IsInWorld());\n+\n+    _lastZoneId = zoneId;\n+\n+    SetGroupUpdateFlag(GROUP_UPDATE_FULL);\n+\n+    _OnAreaUpdate(areaId);\n+\n+    if (!IAmFree())\n+    {\n+        SpellAreaForAreaMapBounds saBounds = sSpellMgr->GetSpellAreaForAreaMapBounds(zoneId);\n+        for (SpellAreaForAreaMap::const_iterator itr = saBounds.first; itr != saBounds.second; ++itr)\n+        {\n+            if (itr->second->autocast && itr->second->IsFitToRequirements(master, zoneId, 0))\n+            {\n+                if (!me->HasAura(itr->second->spellId))\n+                    me->CastSpell(me, itr->second->spellId, true);\n+                if (botPet && !botPet->HasAura(itr->second->spellId))\n+                    botPet->CastSpell(botPet, itr->second->spellId, true);\n+            }\n+        }\n+    }\n+}\n+\n+void bot_ai::_OnAreaUpdate(uint32 areaId)\n+{\n+    ASSERT(me->IsInWorld());\n+\n+    _lastAreaId = areaId;\n+\n+    if (!IAmFree())\n+    {\n+        for (auto const& [spellId, aura] : me->GetOwnedAuras())\n+        {\n+            if (aura->GetSpellInfo()->HasAura(SPELL_AURA_MOUNTED))\n+                continue;\n+\n+            if (aura->GetSpellInfo()->CheckLocation(me->GetMapId(), _lastZoneId, areaId, master, false) != SPELL_CAST_OK)\n+            {\n+                //me->RemoveOwnedAura(iter);\n+                //we assume 1 aura at a time at most for area (once per 1.5 sec)\n+                me->RemoveAurasDueToSpell(spellId);\n+                if (botPet)\n+                    botPet->RemoveAurasDueToSpell(spellId);\n+                break;\n+            }\n+        }\n+\n+        SpellAreaForAreaMapBounds saBounds = sSpellMgr->GetSpellAreaForAreaMapBounds(areaId);\n+        for (SpellAreaForAreaMap::const_iterator itr = saBounds.first; itr != saBounds.second; ++itr)\n+        {\n+            if (itr->second->autocast && itr->second->IsFitToRequirements(master, _lastZoneId, 0))\n+            {\n+                if (!me->HasAura(itr->second->spellId))\n+                    me->CastSpell(me, itr->second->spellId, true);\n+                if (botPet && !botPet->HasAura(itr->second->spellId))\n+                    botPet->CastSpell(botPet, itr->second->spellId, true);\n+            }\n+        }\n+\n+        for (auto slot : NPCBots::index_array<uint8, BOT_FIRST_NON_WEAPON_SLOT>)\n+        {\n+            if (Item const* item = _equips[slot])\n+                if (item->IsLimitedToAnotherMapOrZone(me->GetMapId(), areaId))\n+                    if (_resetEquipment(slot, ObjectGuid::Empty, false) == BotEquipResult::BOT_EQUIP_RESULT_OK)\n+                        continue;\n+        }\n+    }\n+\n+    AreaTableEntry const* area = sAreaTableStore.LookupEntry(areaId);\n+    if (area && area->IsSanctuary())\n+    {\n+        if (!me->HasByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_SANCTUARY))\n+        {\n+            me->SetByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_SANCTUARY);\n+            me->CombatStop();\n+            if (botPet)\n+                botPet->CombatStop();\n+        }\n+    }\n+    else if (me->HasByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_SANCTUARY))\n+        me->RemoveByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_SANCTUARY);\n+}\n+\n+bool bot_ai::IsInHeroicOrRaid() const\n+{\n+    return me->FindMap() && (me->GetMap()->IsHeroic() || me->GetMap()->IsRaid());\n+}\n+\n+//SpellHit()... OnSpellHit()\n+void bot_ai::OnSpellHit(Unit* caster, SpellInfo const* spell)\n+{\n+    //uint32 const spellId = spell->Id;\n+\n+    if (!spell->IsPositive() && spell->GetMaxDuration() > 1000 && caster->IsControlledByPlayer() &&\n+        _botclass >= BOT_CLASS_EX_START)\n+    {\n+        //bots of W3 classes will not be easily CCed\n+        if (spell->HasAura(SPELL_AURA_MOD_STUN) || spell->HasAura(SPELL_AURA_MOD_CONFUSE) ||\n+            spell->HasAura(SPELL_AURA_MOD_PACIFY) || spell->HasAura(SPELL_AURA_MOD_ROOT))\n+        {\n+            if (Aura* cont = me->GetAura(spell->Id, caster->GetGUID()))\n+            {\n+                if (AuraApplication const* aurApp = cont->GetApplicationOfTarget(me->GetGUID()))\n+                {\n+                    if (!aurApp->IsPositive())\n+                    {\n+                        int32 dur = std::max<int32>(cont->GetMaxDuration() / 3, 1000);\n+                        cont->SetDuration(dur);\n+                        cont->SetMaxDuration(dur);\n+                    }\n+                }\n+            }\n+        }\n+    }\n+\n+    if (!HasBotCommandState(BOT_COMMAND_FULLSTOP | BOT_COMMAND_INACTION))\n+    {\n+        if (spell->HasAura(SPELL_AURA_MOD_TAUNT) || spell->HasEffect(SPELL_EFFECT_ATTACK_ME))\n+            if (caster && me->Attack(caster, !HasRole(BOT_ROLE_RANGED)))\n+            {}//me->GetMotionMaster()->MoveChase(caster);\n+    }\n+\n+    if (spell->GetSpellSpecific() == SPELL_SPECIFIC_DRINK)\n+    {\n+        feast_mana = true;\n+        UpdateMana();\n+        regenTimer = 0;\n+    }\n+    else if (spell->GetSpellSpecific() == SPELL_SPECIFIC_FOOD)\n+    {\n+        feast_health = true;\n+        regenTimer = 0;\n+    }\n+\n+    switch (spell->Id)\n+    {\n+        case WANDERER_HEARTHSTONE:\n+            if (IsWanderer())\n+            {\n+                Map* targetMap = (me->GetMap()->GetEntry()->IsContinent() && _travel_node_cur->GetMapId() != me->GetMap()->GetId()) ?\n+                    sMapMgr->CreateBaseMap(_travel_node_cur->GetMapId()) : me->GetMap();\n+                BotMgr::TeleportBot(me, targetMap, _travel_node_cur, true);\n+                _evadeCount = 0;\n+            }\n+            return;\n+        default:\n+            break;\n+    }\n+\n+    for (auto i : NPCBots::index_array<uint8, MAX_SPELL_EFFECTS>)\n+    {\n+        const auto auraname = spell->Effects[i].ApplyAuraName;\n+        //remove pet on mount\n+        if (auraname == SPELL_AURA_MOUNTED || (!spell->HasAura(SPELL_AURA_MOUNTED) && auraname == SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED))\n+        {\n+            //BOT_LOG_ERROR(\"entities.unit\", \"OnSpellHit: mount on %s\", me->GetName().c_str());\n+            if (master->HasAuraType(SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED) ||\n+                master->HasAuraType(SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED))\n+            {\n+                //BOT_LOG_ERROR(\"entities.unit\", \"OnSpellHit: modding flight speed\");\n+                UnsummonAll(false);\n+                const_cast<CreatureTemplate*>(me->GetCreatureTemplate())->Movement.Flight = CreatureFlightMovementType::DisableGravity;\n+                me->SetCanFly(true);\n+                me->SetDisableGravity(true);\n+                if (Aura* mount = me->GetAura(spell->Id))\n+                {\n+                    //BOT_LOG_ERROR(\"entities.unit\", \"OnSpellHit: found aura\");\n+                    for (uint8 j = 0; j != MAX_SPELL_EFFECTS; ++j)\n+                    {\n+                        if (spell->Effects[j].ApplyAuraName != SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED &&\n+                            spell->Effects[j].ApplyAuraName != SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED &&\n+                            spell->Effects[j].ApplyAuraName != SPELL_AURA_MOD_INCREASE_MOUNTED_SPEED &&\n+                            !(GetBotStance() == DRUID_FLIGHT_FORM && spell->Effects[j].ApplyAuraName == SPELL_AURA_MOD_INCREASE_SPEED))\n+                            continue;\n+                        if (AuraEffect* meff = mount->GetEffect(j))\n+                        {\n+                            meff->ChangeAmount(meff->GetAmount() * 3);\n+                        }\n+                    }\n+                }\n+                me->SetSpeedRate(MOVE_FLIGHT, master->GetSpeedRate(MOVE_FLIGHT) * 1.17f);\n+                me->SetSpeedRate(MOVE_RUN, master->GetSpeedRate(MOVE_FLIGHT) * 1.17f);\n+            }\n+            else\n+                me->SetSpeedRate(MOVE_RUN, master->GetSpeedRate(MOVE_RUN) * 1.1f);\n+        }\n+\n+        //update stats\n+        if (auraname == SPELL_AURA_MOD_STAT || auraname == SPELL_AURA_MOD_PERCENT_STAT ||\n+            auraname == SPELL_AURA_MOD_TOTAL_STAT_PERCENTAGE || auraname == SPELL_AURA_MOD_SKILL ||\n+            auraname == SPELL_AURA_MOD_ATTACK_POWER || auraname == SPELL_AURA_MOD_ATTACK_POWER_PCT ||\n+            auraname == SPELL_AURA_MOD_ATTACK_POWER_OF_STAT_PERCENT || auraname == SPELL_AURA_MOD_ATTACK_POWER_OF_ARMOR ||\n+            auraname == SPELL_AURA_MOD_SPELL_DAMAGE_OF_STAT_PERCENT ||\n+            auraname == SPELL_AURA_MOD_RATING || auraname == SPELL_AURA_MOD_RATING_FROM_STAT)\n+            shouldUpdateStats = true;\n+        else if (auraname == SPELL_AURA_MOD_INCREASE_HEALTH ||\n+            auraname == SPELL_AURA_MOD_INCREASE_HEALTH_2 ||\n+            auraname == SPELL_AURA_230 ||//SPELL_AURA_MOD_INCREASE_HEALTH_2 blood pact, commanding shout\n+            auraname == SPELL_AURA_MOD_INCREASE_HEALTH_PERCENT)\n+            UpdateHealth();\n+        else if (auraname == SPELL_AURA_MOD_INCREASE_ENERGY || auraname == SPELL_AURA_MOD_INCREASE_ENERGY_PERCENT)\n+            UpdateMana(); //Divine Hymn - max mana increase\n+\n+        uint32 const effect = spell->Effects[i].Effect;\n+        if (effect == SPELL_EFFECT_RESURRECT || effect == SPELL_EFFECT_RESURRECT_NEW || effect == SPELL_EFFECT_SELF_RESURRECT)\n+        {\n+            //resurrect effects are not handled for creatures\n+            if (!me->IsAlive())\n+            {\n+                uint32 health = 0;\n+                uint32 mana = 0;\n+                int32 damage = spell->Effects[i].BasePoints;\n+\n+                if (effect == SPELL_EFFECT_RESURRECT_NEW)\n+                {\n+                    //Glyph of Rebirth: resurrect with 100% health\n+                    if (spell->IsRankOf(sSpellMgr->GetSpellInfo(20484)))\n+                        health = me->GetMaxHealth();\n+                    else\n+                        health = damage;\n+                    mana = spell->Effects[i].MiscValue;\n+                }\n+                else if (damage < 0)\n+                {\n+                    health = uint32(-damage);\n+                    mana = spell->Effects[i].MiscValue;\n+                }\n+                else\n+                {\n+                    health = me->CountPctFromMaxHealth(damage);\n+                    if (me->GetMaxPower(POWER_MANA) > 1)\n+                        mana = CalculatePct(me->GetMaxPower(POWER_MANA), damage);\n+                }\n+\n+                BotMgr::ReviveBot(me, caster);\n+                _selfrez_spell_id = 0;\n+\n+                me->SetHealth(health);\n+                if (me->GetMaxPower(POWER_MANA) > 1)\n+                    me->SetPower(POWER_MANA, mana);\n+            }\n+        }\n+        //ravasaur poison (EffectEnchantHeldItem) for mh and oh\n+        if (effect == SPELL_EFFECT_ENCHANT_HELD_ITEM)\n+        {\n+            uint32 enchant_id = spell->Effects[i].MiscValue;\n+            if (!enchant_id)\n+                continue;\n+\n+            EnchantmentSlot slot = TEMP_ENCHANTMENT_SLOT;\n+            Item* weap = _equips[BOT_SLOT_MAINHAND];\n+            if (!weap || weap->GetEnchantmentId(slot))\n+                weap = _equips[BOT_SLOT_OFFHAND];\n+            if (!weap || weap->GetTemplate()->Class != ITEM_CLASS_WEAPON || weap->GetEnchantmentId(slot))\n+                continue;\n+\n+            int32 duration = spell->GetDuration();\n+            if (!duration)\n+                duration = 10; //10 sec default\n+\n+            if (!IAmFree())\n+                master->GetSession()->SendEnchantmentLog(me->GetGUID(), caster->GetGUID(), weap->GetEntry(), enchant_id);\n+\n+            weap->SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_ID_OFFSET, enchant_id);\n+            weap->SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_DURATION_OFFSET, duration * IN_MILLISECONDS);\n+            weap->SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_CHARGES_OFFSET, 0);\n+            ApplyItemBonuses(weap == _equips[BOT_SLOT_MAINHAND] ? BOT_SLOT_MAINHAND : BOT_SLOT_OFFHAND);\n+        }\n+    }\n+\n+    //TODO:\n+    if (/*!(spell->AttributesEx & SPELL_ATTR1_NO_THREAT) &&\n+        !(spell->AttributesEx3 & SPELL_ATTR3_SUPRESS_TARGET_PROCS) && !CCed(me) && */\n+        !me->GetVictim() &&\n+        (me->IsHostileTo(caster) || caster->IsHostileTo(me)))\n+    {\n+        //_atHome = false;\n+        if (!me->CanSeeOrDetect(caster))\n+        {\n+            if (_evadeMode)\n+                me->BotStopMovement();\n+        }\n+        else if (caster->IsInCombat() || me->IsInCombat())\n+            this->OwnerAttackedBy(caster);\n+        //if (_evadeMode == true && me->isMoving() && IAmFree())\n+    }\n+}\n+void bot_ai::OnSpellHitTarget(Unit* /*target*/, SpellInfo const* spell)\n+{\n+    if (me->GetVehicle())\n+    {\n+        uint32 spellId = spell->Id;\n+\n+        //Flame Spike, Revivify\n+        if (spellId == 56091 || spellId == 57090)\n+        {\n+            _vehcomboPoints = std::min(_vehcomboPoints + 1, 5);\n+            //BOT_LOG_ERROR(\"scripts\", \"OnBotSpellGo(): veh cp spell {} now cp {}\", curInfo->Id, uint32(_vehcomboPoints));\n+        }\n+        //Engulf in Flames, Life Burst, Flame Shield   moved to globalupdate\n+        if (spellId == 56092 || spellId == 57143 || spellId == 57108)\n+        {\n+            _vehcomboPoints = 0;\n+            //BOT_LOG_ERROR(\"scripts\", \"OnSpellHitTarget(): veh cp waster %u\", curInfo->Id);\n+        }\n+    }\n+}\n+//Update delay\n+//Skip UpdateAI cycles for randomization of bots' reaction and performance adjustments\n+bool bot_ai::Wait()\n+{\n+    if (waitTimer > lastdiff || !master->IsInWorld())\n+        return true;\n+\n+    if (IAmFree())\n+        waitTimer = (me->IsInCombat() || me->GetVictim() || IsCasting() || me->GetMap()->IsBattlegroundOrArena()) ? 500 : ((_rand + 100) * 20);\n+    else if (master->GetMap()->GetEntry()->IsWorldMap() && !me->IsInCombat() && !IsCasting())\n+        waitTimer = std::min<uint32>(uint32(50 * (master->GetNpcBotsCount() - 1) + _rand), 500);\n+    else\n+        waitTimer = _rand;\n+\n+    waitTimer += BotCfg::GetBaseUpdateDelay();\n+\n+    return false;\n+}\n+//Spell Mod Hooks\n+void bot_ai::ApplyBotDamageMultiplierMelee(uint32& damage, CalcDamageInfo& damageinfo) const\n+{\n+    //WHITE ATTACKS damage bonus\n+    damage *= BotCfg::GetBotDamageModByClass(GetBotClass());\n+    damage *= BotCfg::GetBotDamageModByLevel(me->GetLevel());\n+    ApplyClassDamageMultiplierMelee(damage, damageinfo);\n+}\n+void bot_ai::ApplyBotDamageMultiplierMelee(int32& damage, SpellNonMeleeDamage& damageinfo, SpellInfo const* spellInfo, WeaponAttackType attackType, bool iscrit) const\n+{\n+    //MELEE ABILITIES damage bonus (DMG_CLASS != DMG_CLASS_MAGIC)\n+    damage *= BotCfg::GetBotDamageModByClass(GetBotClass());\n+    damage *= BotCfg::GetBotDamageModByLevel(me->GetLevel());\n+    ApplyClassDamageMultiplierMeleeSpell(damage, damageinfo, spellInfo, attackType, iscrit);\n+}\n+void bot_ai::ApplyBotDamageMultiplierSpell(int32& damage, SpellNonMeleeDamage& damageinfo, SpellInfo const* spellInfo, WeaponAttackType attackType, bool iscrit) const\n+{\n+    //DAMAGE SPELLS damage bonus (DMG_CLASS_MAGIC)\n+    damage *= BotCfg::GetBotDamageModByClass(GetBotClass());\n+    damage *= BotCfg::GetBotDamageModByLevel(me->GetLevel());\n+    ApplyClassDamageMultiplierSpell(damage, damageinfo, spellInfo, attackType, iscrit);\n+}\n+void bot_ai::ApplyBotDamageMultiplierHeal(Unit const* victim, float& heal, SpellInfo const* spellInfo, DamageEffectType damagetype, uint32 stack) const\n+{\n+    //HEALING SPELLS amount bonus\n+    heal *= BotCfg::GetBotHealingModByLevel(me->GetLevel());\n+    ApplyClassDamageMultiplierHeal(victim, heal, spellInfo, damagetype, stack);\n+    heal = (heal * (BotMgr::IsWanderingWorldBot(me) ? BotCfg::GetBotWandererHealingMod() : BotCfg::GetBotHealingMod()));\n+}\n+void bot_ai::ApplyBotCritMultiplierAll(Unit const* victim, float& crit_chance, SpellInfo const* spellInfo, SpellSchoolMask schoolMask, WeaponAttackType attackType) const\n+{\n+    //ALL SPELLS crit bonus + base\n+    ApplyClassSpellCritMultiplierAll(victim, crit_chance, spellInfo, schoolMask, attackType);\n+    crit_chance += crit;\n+}\n+void bot_ai::ApplyBotSpellCostMods(SpellInfo const* spellInfo, int32& cost) const\n+{\n+    //ALL SPELLS power cost bonus\n+    ApplyClassSpellCostMods(spellInfo, cost);\n+}\n+void bot_ai::ApplyBotSpellCastTimeMods(SpellInfo const* spellInfo, int32& casttime) const\n+{\n+    //ALL SPELLS cast time bonus\n+    ApplyClassSpellCastTimeMods(spellInfo, casttime);\n+}\n+void bot_ai::ApplyBotSpellNotLoseCastTimeMods(SpellInfo const* spellInfo, int32& delayReduce) const\n+{\n+    //ALL SPELLS pushback reduce bonus\n+    ApplyClassSpellNotLoseCastTimeMods(spellInfo, delayReduce);\n+}\n+void bot_ai::ApplyBotSpellCooldownMods(SpellInfo const* spellInfo, uint32& cooldown) const\n+{\n+    //ALL SPELLS cooldown bonus\n+    ApplyClassSpellCooldownMods(spellInfo, cooldown);\n+}\n+void bot_ai::ApplyBotSpellCategoryCooldownMods(SpellInfo const* spellInfo, uint32& cooldown) const\n+{\n+    //ALL SPELLS category cooldown bonus\n+    ApplyClassSpellCategoryCooldownMods(spellInfo, cooldown);\n+}\n+void bot_ai::ApplyBotSpellGlobalCooldownMods(SpellInfo const* spellInfo, float& cooldown) const\n+{\n+    //ALL SPELLS global cooldown bonus\n+    ApplyClassSpellGlobalCooldownMods(spellInfo, cooldown);\n+}\n+void bot_ai::ApplyBotSpellRadiusMods(SpellInfo const* spellInfo, float& radius) const\n+{\n+    //ALL SPELLS radius bonus (not range)\n+    ApplyClassSpellRadiusMods(spellInfo, radius);\n+}\n+void bot_ai::ApplyBotSpellRangeMods(SpellInfo const* spellInfo, float& maxrange) const\n+{\n+    //ALL SPELLS range bonus\n+    ApplyClassSpellRangeMods(spellInfo, maxrange);\n+}\n+void bot_ai::ApplyBotSpellMaxTargetsMods(SpellInfo const* spellInfo, uint32& targets) const\n+{\n+    //ALL SPELLS max targets bonus\n+    ApplyClassSpellMaxTargetsMods(spellInfo, targets);\n+}\n+void bot_ai::ApplyBotSpellChanceOfSuccessMods(SpellInfo const* spellInfo, float& chance) const\n+{\n+    //ALL CLASS PROC_TRIGGER_SPELL SPELLS chance of success bonus\n+    ApplyClassSpellChanceOfSuccessMods(spellInfo, chance);\n+}\n+void bot_ai::ApplyBotEffectMods(SpellInfo const* spellInfo, uint8 effIndex, float& value) const\n+{\n+    //ALL SPELLS SPELLMOD_EFFECT_X bonus\n+    ApplyClassEffectMods(spellInfo, effIndex, value);\n+}\n+void bot_ai::ApplyBotThreatMods(SpellInfo const* spellInfo, float& threat) const\n+{\n+    //ALL threat mods\n+    ApplyClassThreatMods(spellInfo, threat);\n+}\n+void bot_ai::ApplyBotEffectValueMultiplierMods(SpellInfo const* spellInfo, SpellEffIndex effIndex, float& multiplier) const\n+{\n+    //ALL SPELLMOD_VALUE_MULTIPLIER mods\n+    ApplyClassEffectValueMultiplierMods(spellInfo, effIndex, multiplier);\n+}\n+//Spell Mod Utilities\n+float bot_ai::CalcSpellMaxRange(uint32 spellId, bool enemy) const\n+{\n+    SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);\n+    spellInfo = spellInfo->TryGetSpellInfoOverride(me);\n+\n+    float maxRange = spellInfo->GetMaxRange(!enemy);\n+    if (maxRange == 0x0)\n+        return maxRange;\n+\n+    ApplyClassSpellRangeMods(spellInfo, maxRange);\n+    return maxRange;\n+}\n+//////////\n+//GOSSIP//\n+//////////\n+//GossipHello\n+bool bot_ai::OnGossipHello(Player* player, uint32 /*option*/)\n+{\n+    if (!BotCfg::IsNpcBotModEnabled() || !(IsWanderer() ? BotCfg::IsWanderingClassEnabled(_botclass) : BotCfg::IsClassEnabled(_botclass)) ||\n+        IsTempBot() || me->IsInCombat() || CCed(me) || IsCasting() || IsDuringTeleport() ||\n+        HasBotCommandState(BOT_COMMAND_ISSUED_ORDER | BOT_COMMAND_NOGOSSIP) ||\n+        (me->GetVehicle() && me->GetVehicle()->GetBase()->IsInCombat()) ||\n+        (!player->IsGameMaster() && IsWanderer()))\n+    {\n+        player->PlayerTalkClass->SendCloseGossip();\n+        return true;\n+    }\n+\n+    if (me->isMoving())\n+        me->BotStopMovement();\n+\n+    evadeDelayTimer = std::max<decltype(evadeDelayTimer)>(evadeDelayTimer, 10000);\n+\n+    uint32 gossipTextId;\n+    if (!IAmFree())\n+    {\n+        if (_botclass == BOT_CLASS_SPHYNX)\n+            gossipTextId = GOSSIP_NORMAL_CUSTOM_SPHYNX;\n+        else if (_botclass == BOT_CLASS_DREADLORD)\n+            gossipTextId = GOSSIP_NORMAL_CUSTOM_DREADLORD;\n+        else if (_botclass == BOT_CLASS_DARK_RANGER)\n+            gossipTextId = GOSSIP_NORMAL_CUSTOM_DARKRANGER;\n+        else if (_botclass == BOT_CLASS_SEA_WITCH)\n+            gossipTextId = GOSSIP_NORMAL_CUSTOM_SEAWITCH;\n+        else if (_botclass == BOT_CLASS_CRYPT_LORD)\n+            gossipTextId = GOSSIP_NORMAL_CUSTOM_CRYPTLORD;\n+        else\n+            gossipTextId = GOSSIP_NORMAL_SERVE_MASTER;\n+    }\n+    else\n+    {\n+        if (_botclass == BOT_CLASS_SPHYNX)\n+            gossipTextId = GOSSIP_GREET_CUSTOM_SPHYNX;\n+        else if (_botclass == BOT_CLASS_DREADLORD)\n+            gossipTextId = GOSSIP_GREET_CUSTOM_DREADLORD;\n+        else if (_botclass == BOT_CLASS_DARK_RANGER)\n+            gossipTextId = GOSSIP_GREET_CUSTOM_DARKRANGER;\n+        else if (_botclass == BOT_CLASS_SEA_WITCH)\n+            gossipTextId = GOSSIP_GREET_CUSTOM_SEAWITCH;\n+        else if (_botclass == BOT_CLASS_CRYPT_LORD)\n+            gossipTextId = GOSSIP_GREET_CUSTOM_CRYPTLORD;\n+        else\n+            gossipTextId = GOSSIP_GREET_NEED_SMTH;\n+    }\n+\n+    bool menus = false;\n+\n+    const uint32 player_guidlow = player->GetGUID().GetCounter();\n+    const bool shared_owner = _botData->owner != player_guidlow && HasSharedOwner(player_guidlow);\n+\n+    if (player->IsGameMaster())\n+    {\n+        AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_DEBUG), GOSSIP_SENDER_DEBUG, GOSSIP_ACTION_INFO_DEF + 1);\n+        menus = true;\n+    }\n+\n+    if (player_guidlow != _botData->owner && IAmFree() && !IsWanderer())\n+    {\n+        uint32 cost = BotCfg::GetNpcBotCostHire(player->GetLevel(), _botclass);\n+\n+        int8 reason = 0;\n+        if (me->HasAura(BERSERK))\n+            reason = -1;\n+        if (!reason && _botData->owner)\n+            reason = 1;\n+        if (!reason && BotDataMgr::GetOwnedBotsCount(player->GetGUID()) >= BotCfg::GetMaxNpcBots(player->GetLevel()))\n+            reason = 2;\n+        if (!reason && !player->HasEnoughMoney(cost))\n+            reason = 3;\n+        if (!reason && BotCfg::GetMaxClassBots() && BotDataMgr::GetOwnedBotsCount(player->GetGUID(), me->GetClassMask()) >= BotCfg::GetMaxClassBots())\n+            reason = 4;\n+\n+        std::ostringstream message1;\n+        std::ostringstream message2;\n+        if (_botclass == BOT_CLASS_SPHYNX)\n+        {\n+            message1 << LocalizedNpcText(player, BOT_TEXT_HIREWARN_SPHYNX_1) << me->GetName() << LocalizedNpcText(player, BOT_TEXT_HIREWARN_SPHYNX_2);\n+            message2 << LocalizedNpcText(player, BOT_TEXT_HIREOPTION_SPHYNX);\n+        }\n+        else if (_botclass == BOT_CLASS_DREADLORD)\n+        {\n+            message1 << LocalizedNpcText(player, BOT_TEXT_HIREWARN_DREADLORD) << me->GetName() << '?';\n+            message2 << LocalizedNpcText(player, BOT_TEXT_HIREOPTION_DREADLORD);\n+        }\n+        else if (_botclass == BOT_CLASS_SEA_WITCH)\n+        {\n+            message1 << LocalizedNpcText(player, BOT_TEXT_HIREWARN_SEAWITCH);\n+            message2 << LocalizedNpcText(player, BOT_TEXT_HIREOPTION_SEAWITCH);\n+        }\n+        else if (_botclass == BOT_CLASS_CRYPT_LORD)\n+        {\n+            message1 << LocalizedNpcText(player, BOT_TEXT_HIREWARN_CRYPTLORD);\n+            message2 << LocalizedNpcText(player, BOT_TEXT_HIREOPTION_CRYPTLORD);\n+        }\n+        else\n+        {\n+            message1 << LocalizedNpcText(player, BOT_TEXT_HIREWARN_DEFAULT) << me->GetName() << '?';\n+            message2 << LocalizedNpcText(player, BOT_TEXT_HIREOPTION_DEFAULT);\n+        }\n+\n+        if (BotCfg::GetNpcBotCostRent(player->GetLevel(), _botclass))\n+            message1 << \"\\n(\" << BotCfg::GetNpcBotCostStr(player->GetLevel(), _botclass) << \")\";\n+\n+        if (!reason)\n+            player->PlayerTalkClass->GetGossipMenu().AddMenuItem(-1, GOSSIP_ICON_TAXI, message2.str(), GOSSIP_SENDER_HIRE, GOSSIP_ACTION_INFO_DEF + 0, message1.str(), cost, false);\n+        else\n+            AddGossipItemFor(player, GOSSIP_ICON_TAXI, message2.str(), GOSSIP_SENDER_HIRE, GOSSIP_ACTION_INFO_DEF + reason);\n+\n+        menus = true;\n+    }\n+\n+    if (_botData->owner)\n+    {\n+        Group const* gr = player->GetGroup();\n+\n+        if (player == master)\n+        {\n+            menus = true;\n+\n+            //general: equips, roles, distance, abilities, comsumables, group\n+            AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_MANAGE_EQUIPMENT), GOSSIP_SENDER_EQUIPMENT, GOSSIP_ACTION_INFO_DEF + 1);\n+            AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_MANAGE_ROLES), GOSSIP_SENDER_ROLES_MAIN, GOSSIP_ACTION_INFO_DEF + 1);\n+            AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_MANAGE_FORMATION), GOSSIP_SENDER_FORMATION, GOSSIP_ACTION_INFO_DEF + 1);\n+            AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_MANAGE_ABILITIES), GOSSIP_SENDER_ABILITIES, GOSSIP_ACTION_INFO_DEF + 1);\n+            if (_botclass < BOT_CLASS_EX_START)\n+            {\n+                if (me->GetLevel() >= 10)\n+                    AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_MANAGE_TALENTS), GOSSIP_SENDER_SPEC, GOSSIP_ACTION_INFO_DEF + 1);\n+                AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_GIVE_CONSUMABLE), GOSSIP_SENDER_USEITEM, GOSSIP_ACTION_INFO_DEF + 1);\n+            }\n+\n+            if (!gr)\n+            {\n+                AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_CREATE_GROUP), GOSSIP_SENDER_JOIN_GROUP, GOSSIP_ACTION_INFO_DEF + 1);\n+                if (player->GetNpcBotsCount() > 1)\n+                    AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_CREATE_GROUP_ALL), GOSSIP_SENDER_JOIN_GROUP, GOSSIP_ACTION_INFO_DEF + 2);\n+            }\n+            else if (!gr->IsMember(me->GetGUID()))\n+            {\n+                AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_ADD_TO_GROUP), GOSSIP_SENDER_JOIN_GROUP, GOSSIP_ACTION_INFO_DEF + 1);\n+                AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_ADD_TO_GROUP_ALL), GOSSIP_SENDER_JOIN_GROUP, GOSSIP_ACTION_INFO_DEF + 2);\n+            }\n+            else\n+                AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_REMOVE_FROM_GROUP), GOSSIP_SENDER_LEAVE_GROUP, GOSSIP_ACTION_INFO_DEF + 1);\n+\n+            //movement toggle\n+            if (HasBotCommandState(BOT_COMMAND_MASK_UNMOVING))\n+                AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_FOLLOW_ME), GOSSIP_SENDER_FOLLOWME, GOSSIP_ACTION_INFO_DEF + 1);\n+            if (!HasBotCommandState(BOT_COMMAND_STAY))\n+                AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_HOLD_POSITION), GOSSIP_SENDER_HOLDPOSITION, GOSSIP_ACTION_INFO_DEF + 1);\n+            if (!HasBotCommandState(BOT_COMMAND_FULLSTOP))\n+                AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_STAY_HERE), GOSSIP_SENDER_DONOTHING, GOSSIP_ACTION_INFO_DEF + 1);\n+        }\n+        if (player == master || (gr && gr->IsMember(master->GetGUID())))\n+        {\n+            //class-specific for party: mage rations, rogue lockpicking etc.\n+            //TODO: priest lightwell (manual only) maybe move into abilities\n+            switch (_botclass)\n+            {\n+                case BOT_CLASS_MAGE:\n+                {\n+                    AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_MAGE_FOOD), GOSSIP_SENDER_CLASS, GOSSIP_ACTION_INFO_DEF + 1);\n+                    AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_MAGE_DRINK), GOSSIP_SENDER_CLASS, GOSSIP_ACTION_INFO_DEF + 2);\n+                    if (me->GetLevel() >= 70)\n+                        AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_MAGE_TABLE), GOSSIP_SENDER_CLASS, GOSSIP_ACTION_INFO_DEF + 3);\n+                    menus = true;\n+                    break;\n+                }\n+                case BOT_CLASS_ROGUE:\n+                {\n+                    //Learned at 16\n+                    //Allow rogues to gain skill with bot's help\n+                    if (me->GetLevel() >= 16/* && !player->HasSkill(SKILL_LOCKPICKING)*/)\n+                    {\n+                        std::ostringstream msg;\n+                        msg << LocalizedNpcText(player, BOT_TEXT_ROGUE_PICKLOCK) << \" (\" << uint32(me->GetLevel() * 5) << \")\";\n+                        AddGossipItemFor(player, GOSSIP_ICON_CHAT, msg.str(), GOSSIP_SENDER_CLASS, GOSSIP_ACTION_INFO_DEF + 1);\n+                        menus = true;\n+                    }\n+                    break;\n+                }\n+                case BOT_CLASS_WARLOCK:\n+                {\n+                    AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_WARLOCK_HEALTHSTONE), GOSSIP_SENDER_CLASS, GOSSIP_ACTION_INFO_DEF + 1);\n+                    if (me->GetLevel() >= 68)\n+                        AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_WARLOCK_SOULWELL), GOSSIP_SENDER_CLASS, GOSSIP_ACTION_INFO_DEF + 3);\n+                    menus = true;\n+                    break;\n+                }\n+                default:\n+                    break;\n+            }\n+        }\n+        if (player == master)\n+        {\n+            //class-specific for owner: poisons, enchants, etc.\n+            switch (_botclass)\n+            {\n+                case BOT_CLASS_MAGE:\n+                {\n+                    if (me->GetLevel() >= 40)\n+                        AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_I_NEED_A_PORTAL), GOSSIP_SENDER_CLASS, GOSSIP_ACTION_INFO_DEF + 4);\n+                    break;\n+                }\n+                case BOT_CLASS_ROGUE:\n+                {\n+                    if (me->GetLevel() >= 20)\n+                    {\n+                        AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_ROGUE_POISON_REFRESH), GOSSIP_SENDER_CLASS, GOSSIP_ACTION_INFO_DEF + 2);\n+                        AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_ROGUE_POISON_MH), GOSSIP_SENDER_CLASS, GOSSIP_ACTION_INFO_DEF + 3);\n+                        Item const* oweap = _equips[BOT_SLOT_OFFHAND];\n+                        if (oweap && oweap->GetTemplate()->Class == ITEM_CLASS_WEAPON)\n+                            AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_ROGUE_POISON_OH), GOSSIP_SENDER_CLASS, GOSSIP_ACTION_INFO_DEF + 4);\n+                    }\n+                    break;\n+                }\n+                case BOT_CLASS_SHAMAN:\n+                {\n+                    if (me->GetLevel() >= 10)\n+                    {\n+                        AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_SHAMAN_ENCH_REFRESH), GOSSIP_SENDER_CLASS, GOSSIP_ACTION_INFO_DEF + 2);\n+                        AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_SHAMAN_ENCH_MH), GOSSIP_SENDER_CLASS, GOSSIP_ACTION_INFO_DEF + 3);\n+                        Item const* oweap = _equips[BOT_SLOT_OFFHAND];\n+                        if (oweap && oweap->GetTemplate()->Class == ITEM_CLASS_WEAPON)\n+                            AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_SHAMAN_ENCH_OH), GOSSIP_SENDER_CLASS, GOSSIP_ACTION_INFO_DEF + 4);\n+                    }\n+                    if (me->GetShapeshiftForm() != FORM_NONE)\n+                        AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_REMOVE_SHAPESHIFT), GOSSIP_SENDER_CLASS, GOSSIP_ACTION_INFO_DEF + 5);\n+                    break;\n+                }\n+                case BOT_CLASS_DRUID:\n+                {\n+                    if (me->GetShapeshiftForm() != FORM_NONE)\n+                        AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_REMOVE_SHAPESHIFT), GOSSIP_SENDER_CLASS, GOSSIP_ACTION_INFO_DEF + 1);\n+                    break;\n+                }\n+                case BOT_CLASS_HUNTER:\n+                {\n+                    if (me->GetLevel() >= 10)\n+                        AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_CHOOSE_PET_TYPE), GOSSIP_SENDER_CLASS, GOSSIP_ACTION_INFO_DEF + 2);\n+\n+                    break;\n+                }\n+                case BOT_CLASS_WARLOCK:\n+                {\n+                    AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_CHOOSE_PET_TYPE), GOSSIP_SENDER_CLASS, GOSSIP_ACTION_INFO_DEF + 2);\n+                    break;\n+                }\n+                default:\n+                    break;\n+            }\n+\n+            if (!shared_owner)\n+            {\n+                std::ostringstream astr;\n+                astr << LocalizedNpcText(player, BOT_TEXT_ABANDON_WARN_1) << me->GetName() << \"? \" << (BotCfg::IsEnrageOnDimissEnabled() ? LocalizedNpcText(player, BOT_TEXT_ABANDON_WARN_2) : \"\");\n+                player->PlayerTalkClass->GetGossipMenu().AddMenuItem(-1, GOSSIP_ICON_TAXI, LocalizedNpcText(player, BOT_TEXT_UR_DISMISSED),\n+                    GOSSIP_SENDER_DISMISS, GOSSIP_ACTION_INFO_DEF + 1, astr.str(), 0, false);\n+            }\n+\n+            if (BotCfg::IsSharedOwnerOptionEnabled(SharedOwnerOptionMask::SHARED_OWNER_OPTION_MASK_ENABLE))\n+                if (!shared_owner || BotCfg::IsSharedOwnerOptionEnabled(SharedOwnerOptionMask::SHARED_OWNER_OPTION_MASK_MANAGE_OWNERS))\n+                    AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_MANAGE_OWNERSHIP), GOSSIP_SENDER_OWNERSHIP, GOSSIP_ACTION_INFO_DEF + 1);\n+\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_PULL_URSELF), GOSSIP_SENDER_TROUBLESHOOTING, GOSSIP_ACTION_INFO_DEF + 1);\n+        }\n+    }\n+\n+    if (_botclass >= BOT_CLASS_EX_START)\n+    {\n+        menus = true;\n+        AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_STUDY_CREATURE), GOSSIP_SENDER_SCAN, GOSSIP_ACTION_INFO_DEF + 1);\n+    }\n+\n+    if (!menus)\n+    {\n+        player->PlayerTalkClass->SendCloseGossip();\n+        return true;\n+    }\n+\n+    AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_NEVERMIND), 0, GOSSIP_ACTION_INFO_DEF + 1);\n+    player->PlayerTalkClass->SendGossipMenu(gossipTextId, me->GetGUID());\n+    return true;\n+}\n+\n+//GossipSelect\n+bool bot_ai::OnGossipSelect(Player* player, Creature* creature/* == me*/, uint32 sender, uint32 action)\n+{\n+    if (!BotCfg::IsNpcBotModEnabled() || me->HasUnitState(UNIT_STATE_CASTING) || CCed(me) || HasBotCommandState(BOT_COMMAND_ISSUED_ORDER) ||\n+        (me->GetVehicle() && me->GetVehicle()->GetBase()->IsInCombat()))\n+    {\n+        player->PlayerTalkClass->SendCloseGossip();\n+        return true;\n+    }\n+\n+    if (me->isMoving())\n+        me->BotStopMovement();\n+\n+    evadeDelayTimer = std::max<decltype(evadeDelayTimer)>(evadeDelayTimer, 10000);\n+\n+    uint32 gossipTextId;\n+    if (!IAmFree())\n+    {\n+        if (_botclass == BOT_CLASS_SPHYNX)\n+            gossipTextId = GOSSIP_NORMAL_CUSTOM_SPHYNX;\n+        else if (_botclass == BOT_CLASS_DREADLORD)\n+            gossipTextId = GOSSIP_NORMAL_CUSTOM_DREADLORD;\n+        else if (_botclass == BOT_CLASS_DARK_RANGER)\n+            gossipTextId = GOSSIP_NORMAL_CUSTOM_DARKRANGER;\n+        else if (_botclass == BOT_CLASS_SEA_WITCH)\n+            gossipTextId = GOSSIP_NORMAL_CUSTOM_SEAWITCH;\n+        else if (_botclass == BOT_CLASS_CRYPT_LORD)\n+            gossipTextId = GOSSIP_NORMAL_CUSTOM_CRYPTLORD;\n+        else\n+            gossipTextId = GOSSIP_NORMAL_SERVE_MASTER;\n+    }\n+    else\n+    {\n+        if (_botclass == BOT_CLASS_SPHYNX)\n+            gossipTextId = GOSSIP_GREET_CUSTOM_SPHYNX;\n+        else if (_botclass == BOT_CLASS_DREADLORD)\n+            gossipTextId = GOSSIP_GREET_CUSTOM_DREADLORD;\n+        else if (_botclass == BOT_CLASS_DARK_RANGER)\n+            gossipTextId = GOSSIP_GREET_CUSTOM_DARKRANGER;\n+        else if (_botclass == BOT_CLASS_SEA_WITCH)\n+            gossipTextId = GOSSIP_GREET_CUSTOM_SEAWITCH;\n+        else if (_botclass == BOT_CLASS_CRYPT_LORD)\n+            gossipTextId = GOSSIP_GREET_CUSTOM_CRYPTLORD;\n+        else\n+            gossipTextId = GOSSIP_GREET_NEED_SMTH;\n+    }\n+\n+    player->PlayerTalkClass->ClearMenus();\n+    bool subMenu = false;\n+\n+    const ObjectGuid::LowType player_guidlow = player->GetGUID().GetCounter();\n+    const bool shared_owner = _botData->owner != player_guidlow && HasSharedOwner(player_guidlow);\n+\n+    switch (sender)\n+    {\n+        case 0: //any kind of fail\n+        {\n+            BotSay(\"...\", player);\n+            break;\n+        }\n+        case 1: //BACK: return to main menu\n+        {\n+            return bot_ai::OnGossipHello(player, 0);\n+        }\n+        case GOSSIP_SENDER_CLASS:\n+        {\n+            switch (_botclass)\n+            {\n+                case BOT_CLASS_MAGE:\n+                {\n+                    if (IsCasting())\n+                    {\n+                        player->SendEquipError(EQUIP_ERR_OBJECT_IS_BUSY, nullptr);\n+                        break;\n+                    }\n+\n+                    uint32 option = action - GOSSIP_ACTION_INFO_DEF;\n+                    if (option == 1 || option == 2) //food, water\n+                    {\n+                        //Prevent high-leveled consumables for low-level characters\n+                        Unit* checker;\n+                        if (player->GetLevel() < me->GetLevel())\n+                            checker = player;\n+                        else\n+                            checker = me;\n+\n+                        // Conjure Refreshment rank 1\n+                        uint32 food = InitSpell(checker, 42955);\n+                        bool iswater = (option == 2);\n+                        if (!food)\n+                        {\n+                            if (!iswater)// Conjure Food rank 1\n+                                food = InitSpell(checker, 587);\n+                            else// Conjure Water rank 1\n+                                food = InitSpell(checker, 5504);\n+                        }\n+                        if (!food)\n+                        {\n+                            BotWhisper(LocalizedNpcText(player, iswater ? BOT_TEXT_CANT_CONJURE_WATER_YET : BOT_TEXT_CANT_CONJURE_FOOD_YET), player);\n+                            break;\n+                        }\n+                        SpellInfo const* Info = sSpellMgr->GetSpellInfo(food);\n+                        Spell* foodspell = new Spell(me, Info, TRIGGERED_NONE, player->GetGUID());\n+                        SpellCastTargets targets;\n+                        targets.SetUnitTarget(player);\n+                        SpellCastResult result = me->IsMounted() || CCed(me) ? SPELL_FAILED_CUSTOM_ERROR : foodspell->CheckPetCast(player);\n+                        if (result != SPELL_CAST_OK)\n+                        {\n+                            foodspell->finish(false);\n+                            delete foodspell;\n+                            BotWhisper(LocalizedNpcText(player, BOT_TEXT_CANT_RIGHT_NOW), player);\n+                        }\n+                        else\n+                        {\n+                            aftercastTargetGuid = player->GetGUID();\n+                            foodspell->prepare(&targets);\n+                            BotWhisper(LocalizedNpcText(player, BOT_TEXT_HERE_YOU_GO), player);\n+                        }\n+                        break;\n+                    }\n+                    else if (option == 3) //refreshment table\n+                    {\n+                        uint32 tableSpellId = GetSpell(43987); //Ritual of Refreshment\n+                        if (!tableSpellId)\n+                        {\n+                            BotWhisper(LocalizedNpcText(player, BOT_TEXT_DISABLED), player);\n+                            break;\n+                        }\n+                        if (!IsSpellReady(43987, GetLastDiff(), false))\n+                        {\n+                            BotWhisper(LocalizedNpcText(player, BOT_TEXT_NOT_READY_YET), player);\n+                            break;\n+                        }\n+                        uint32 tableGOForSpell = (tableSpellId == 43987 ? GO_REFRESHMENT_TABLE_1 : GO_REFRESHMENT_TABLE_2);\n+                        GameObjectTemplate const* goInfo = sObjectMgr->GetGameObjectTemplate(tableGOForSpell);\n+                        if (!goInfo)\n+                        {\n+                            BotWhisper(LocalizedNpcText(player, BOT_TEXT_INVALID_OBJECT_TYPE), player);\n+                            break;\n+                        }\n+                        float x,y,z;\n+                        me->GetClosePoint(x, y, z, me->GetCombatReach(), 0.f, 0.f);\n+                        G3D::Quat rot = G3D::Matrix3::fromEulerAnglesZYX(me->GetOrientation(), 0.f, 0.f);\n+\n+                        GameObject* table = new GameObject;\n+                        if (!table->Create(me->GetMap()->GenerateLowGuid<HighGuid::GameObject>(), tableGOForSpell, me->GetMap(),\n+                            me->GetPhaseMask(), x,y,z, me->GetOrientation(), rot, 255, GO_STATE_READY))\n+                        {\n+                            delete table;\n+                            BotWhisper(LocalizedNpcText(player, BOT_TEXT_FAILED), player);\n+                            break;\n+                        }\n+\n+                        SetSpellCooldown(43987, 300000);\n+\n+                        table->SetRespawnTime(180);\n+                        //table->SetOwnerGUID(master->GetGUID());\n+                        master->AddGameObject(table);\n+                        table->SetSpellId(tableSpellId);\n+                        me->GetMap()->AddToMap(table);\n+\n+                        BotWhisper(LocalizedNpcText(player, BOT_TEXT_DONE), player);\n+                        break;\n+                    }\n+                    else if (option == 4) // portal\n+                    {\n+                        subMenu = true;\n+\n+                        if (player->GetTeamId() == TEAM_ALLIANCE)\n+                        {\n+                            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_STORMWIND), GOSSIP_SENDER_CLASS_ACTION1, GOSSIP_ACTION_INFO_DEF + uint32(PORTAL_STORMWIND));\n+                            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_IRONFORGE), GOSSIP_SENDER_CLASS_ACTION1, GOSSIP_ACTION_INFO_DEF + uint32(PORTAL_IRONFORGE));\n+                            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_DARNASSUS), GOSSIP_SENDER_CLASS_ACTION1, GOSSIP_ACTION_INFO_DEF + uint32(PORTAL_DARNASSUS));\n+                            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_EXORDAR), GOSSIP_SENDER_CLASS_ACTION1, GOSSIP_ACTION_INFO_DEF + uint32(PORTAL_EXODAR));\n+                            if (me->GetLevel() >= 65)\n+                                AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_SHATTRATH), GOSSIP_SENDER_CLASS_ACTION1, GOSSIP_ACTION_INFO_DEF + uint32(PORTAL_SHATTRATH_A));\n+                        }\n+                        else\n+                        {\n+                            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_ORGRIMMAR), GOSSIP_SENDER_CLASS_ACTION1, GOSSIP_ACTION_INFO_DEF + uint32(PORTAL_ORGRIMMAR));\n+                            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_UNDERCITY), GOSSIP_SENDER_CLASS_ACTION1, GOSSIP_ACTION_INFO_DEF + uint32(PORTAL_UNDERCITY));\n+                            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_THUNDER_BLUFF), GOSSIP_SENDER_CLASS_ACTION1, GOSSIP_ACTION_INFO_DEF + uint32(PORTAL_THUNDERBLUFF));\n+                            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_SILVERMOON), GOSSIP_SENDER_CLASS_ACTION1, GOSSIP_ACTION_INFO_DEF + uint32(PORTAL_SILVERMOON));\n+                            if (me->GetLevel() >= 65)\n+                                AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_SHATTRATH), GOSSIP_SENDER_CLASS_ACTION1, GOSSIP_ACTION_INFO_DEF + uint32(PORTAL_SHATTRATH_H));\n+                        }\n+                        if (me->GetLevel() >= 74)\n+                            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_DALARAN), GOSSIP_SENDER_CLASS_ACTION1, GOSSIP_ACTION_INFO_DEF + uint32(PORTAL_DALARAN));\n+                        AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_BACK), 1, GOSSIP_ACTION_INFO_DEF + 7);\n+                    }\n+                    break;\n+                }\n+                case BOT_CLASS_ROGUE:\n+                {\n+                    action -= GOSSIP_ACTION_INFO_DEF;\n+\n+                    if (action == 1)\n+                    {\n+                        // Pick Lock\n+                        subMenu = true;\n+\n+                        uint32 count = 0;\n+                        uint32 maxcounter = BOT_GOSSIP_MAX_ITEMS - 1; //BACK\n+\n+                        //1 Nearest gameobject\n+                        GameObject* obj = nullptr;\n+                        NearestLockedGameObjectInRangeCheck check(player, 4.f);\n+                        Bcore::GameObjectLastSearcher<NearestLockedGameObjectInRangeCheck> searcher(player, obj, check);\n+                        Cell::VisitObjects(player, searcher, 4.f);\n+                        //player->VisitNearbyGridObject(4.f, searcher);\n+                        if (obj)\n+                        {\n+                            std::ostringstream msg;\n+                            msg << obj->GetGOInfo()->name << \" (\" << LocalizedNpcText(player, BOT_TEXT_DISTANCE_SHORT) << \" = \" << player->GetExactDist(obj) << \")\";\n+                            AddGossipItemFor(player, GOSSIP_ICON_CHAT, msg.str(), GOSSIP_SENDER_CLASS_ACTION1, GOSSIP_ACTION_INFO_DEF + ++count);\n+                        }\n+\n+                        //2 Inventory\n+                        Item* item = nullptr;\n+                        LockEntry const* lockInfo;\n+\n+                        //backpack\n+                        for (uint8 i = INVENTORY_SLOT_ITEM_START; i != INVENTORY_SLOT_ITEM_END && count < maxcounter; ++i)\n+                        {\n+                            item = player->GetItemByPos(INVENTORY_SLOT_BAG_0, i);\n+                            if (item && item->IsLocked() && item->GetTemplate()->LockID)\n+                            {\n+                                lockInfo = sLockStore.LookupEntry(item->GetTemplate()->LockID);\n+                                if (!lockInfo)\n+                                    continue;\n+\n+                                for (auto j : NPCBots::index_array<uint8, MAX_LOCK_CASE>)\n+                                {\n+                                    if (lockInfo->Type[j] == LOCK_KEY_SKILL && lockInfo->Index[j] == LOCKTYPE_PICKLOCK &&\n+                                        lockInfo->Skill[j] <= uint32(15 + creature->GetLevel() * 5))\n+                                    {\n+                                        std::ostringstream name;\n+                                        _AddItemLink(player, item, name, false);\n+                                        AddGossipItemFor(player, GOSSIP_ICON_CHAT, name.str(), GOSSIP_SENDER_CLASS_ACTION1, GOSSIP_ACTION_INFO_DEF + item->GetGUID().GetCounter());\n+                                        ++count;\n+                                        break;\n+                                    }\n+                                }\n+                            }\n+                        }\n+                        //bags\n+                        for (uint8 i = INVENTORY_SLOT_BAG_START; i != INVENTORY_SLOT_BAG_END; ++i)\n+                        {\n+                            if (Bag const* bag = player->GetBagByPos(i))\n+                            {\n+                                for (uint32 j = 0; j != bag->GetBagSize() && count < maxcounter; ++j)\n+                                {\n+                                    item = player->GetItemByPos(i, j);\n+                                    if (item && item->IsLocked() && item->GetTemplate()->LockID)\n+                                    {\n+                                        lockInfo = sLockStore.LookupEntry(item->GetTemplate()->LockID);\n+                                        if (!lockInfo)\n+                                            continue;\n+\n+                                        for (auto k : NPCBots::index_array<uint8, MAX_LOCK_CASE>)\n+                                        {\n+                                            if (lockInfo->Type[k] == LOCK_KEY_SKILL && lockInfo->Index[k] == LOCKTYPE_PICKLOCK &&\n+                                                lockInfo->Skill[k] <= uint32(15 + creature->GetLevel() * 5))\n+                                            {\n+                                                std::ostringstream name;\n+                                                _AddItemLink(player, item, name, false);\n+                                                AddGossipItemFor(player, GOSSIP_ICON_CHAT, name.str(), GOSSIP_SENDER_CLASS_ACTION1, GOSSIP_ACTION_INFO_DEF + item->GetGUID().GetCounter());\n+                                                ++count;\n+                                                break;\n+                                            }\n+                                        }\n+                                    }\n+                                }\n+                            }\n+                        }\n+\n+                        AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_BACK), 1, GOSSIP_ACTION_INFO_DEF + ++count);\n+                    }\n+                    else if (action == 2)\n+                    {\n+                        //Clear poisons (autorefresh is in class ai DoNonCombatActions\n+                        RemoveItemClassEnchantments();\n+                    }\n+                    else if (action == 3)\n+                    {\n+                        subMenu = true;\n+                        bool isauto = GetAIMiscValue(BOTAI_MISC_ENCHANT_IS_AUTO_MH);\n+                        //Send list of available poisons on MH\n+                        for (uint32 i = BOTAI_MISC_ENCHANT_AVAILABLE_1; i <= BOTAI_MISC_ENCHANT_AVAILABLE_6; ++i)\n+                        {\n+                            uint32 possiblePoison = GetAIMiscValue(i);\n+                            if (uint32 possiblePoisonMaxRank = GetSpell(possiblePoison))\n+                            {\n+                                SpellInfo const* availableInfo = sSpellMgr->GetSpellInfo(possiblePoisonMaxRank);\n+                                uint32 curMHId = GetAIMiscValue(BOTAI_MISC_ENCHANT_CURRENT_MH);\n+                                bool same = possiblePoison == curMHId;\n+                                std::string spellName;\n+                                _LocalizeSpell(player, spellName, availableInfo->Id);\n+                                AddGossipItemFor(player, same ? GOSSIP_ICON_BATTLE : GOSSIP_ICON_CHAT, spellName, GOSSIP_SENDER_CLASS_ACTION2, GOSSIP_ACTION_INFO_DEF + possiblePoison);\n+                            }\n+                        }\n+                        AddGossipItemFor(player, isauto ? GOSSIP_ICON_BATTLE : GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_AUTO), GOSSIP_SENDER_CLASS_ACTION2, GOSSIP_ACTION_INFO_DEF + 0);\n+                        AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_BACK), 1, GOSSIP_ACTION_INFO_DEF + 1);\n+                    }\n+                    else if (action == 4)\n+                    {\n+                        subMenu = true;\n+                        bool isauto = GetAIMiscValue(BOTAI_MISC_ENCHANT_IS_AUTO_OH);\n+                        //Send list of available poisons on OH\n+                        for (uint32 i = BOTAI_MISC_ENCHANT_AVAILABLE_1; i <= BOTAI_MISC_ENCHANT_AVAILABLE_6; ++i)\n+                        {\n+                            uint32 possiblePoison = GetAIMiscValue(i);\n+                            if (uint32 possiblePoisonMaxRank = GetSpell(possiblePoison))\n+                            {\n+                                SpellInfo const* availableInfo = sSpellMgr->GetSpellInfo(possiblePoisonMaxRank);\n+                                uint32 curOHId = GetAIMiscValue(BOTAI_MISC_ENCHANT_CURRENT_OH);\n+                                bool same = possiblePoison == curOHId;\n+                                std::string spellName;\n+                                _LocalizeSpell(player, spellName, availableInfo->Id);\n+                                AddGossipItemFor(player, same ? GOSSIP_ICON_BATTLE : GOSSIP_ICON_CHAT, spellName, GOSSIP_SENDER_CLASS_ACTION3, GOSSIP_ACTION_INFO_DEF + possiblePoison);\n+                            }\n+                        }\n+                        AddGossipItemFor(player, isauto ? GOSSIP_ICON_BATTLE : GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_AUTO), GOSSIP_SENDER_CLASS_ACTION3, GOSSIP_ACTION_INFO_DEF + 0);\n+                        AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_BACK), 1, GOSSIP_ACTION_INFO_DEF + 1);\n+                    }\n+\n+                    break;\n+                }\n+                case BOT_CLASS_SHAMAN:\n+                {\n+                    action -= GOSSIP_ACTION_INFO_DEF;\n+\n+                    if (action == 2)\n+                    {\n+                        //Clear enchants (autorefresh is in class ai DoNonCombatActions\n+                        RemoveItemClassEnchantments();\n+                    }\n+                    else if (action == 3)\n+                    {\n+                        subMenu = true;\n+                        bool isauto = GetAIMiscValue(BOTAI_MISC_ENCHANT_IS_AUTO_MH);\n+                        //Send list of available enchants on MH\n+                        for (uint32 i = BOTAI_MISC_ENCHANT_AVAILABLE_1; i <= BOTAI_MISC_ENCHANT_AVAILABLE_5; ++i)\n+                        {\n+                            uint32 possibleEnchant = GetAIMiscValue(i);\n+                            if (uint32 possibleEcnhantMaxRank = GetSpell(possibleEnchant))\n+                            {\n+                                SpellInfo const* availableInfo = sSpellMgr->GetSpellInfo(possibleEcnhantMaxRank);\n+                                uint32 curMHId = GetAIMiscValue(BOTAI_MISC_ENCHANT_CURRENT_MH);\n+                                bool same = possibleEnchant == curMHId;\n+                                std::string spellName;\n+                                _LocalizeSpell(player, spellName, availableInfo->Id);\n+                                AddGossipItemFor(player, same ? GOSSIP_ICON_BATTLE : GOSSIP_ICON_CHAT, spellName, GOSSIP_SENDER_CLASS_ACTION2, GOSSIP_ACTION_INFO_DEF + possibleEnchant);\n+                            }\n+                        }\n+                        AddGossipItemFor(player, isauto ? GOSSIP_ICON_BATTLE : GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_AUTO), GOSSIP_SENDER_CLASS_ACTION2, GOSSIP_ACTION_INFO_DEF + 0);\n+                        AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_BACK), 1, GOSSIP_ACTION_INFO_DEF + 1);\n+                    }\n+                    else if (action == 4)\n+                    {\n+                        subMenu = true;\n+                        bool isauto = GetAIMiscValue(BOTAI_MISC_ENCHANT_IS_AUTO_OH);\n+                        //Send list of available enchants on OH\n+                        for (uint32 i = BOTAI_MISC_ENCHANT_AVAILABLE_1; i <= BOTAI_MISC_ENCHANT_AVAILABLE_5; ++i)\n+                        {\n+                            uint32 possibleEnchant = GetAIMiscValue(i);\n+                            if (uint32 possibleEcnhantMaxRank = GetSpell(possibleEnchant))\n+                            {\n+                                SpellInfo const* availableInfo = sSpellMgr->GetSpellInfo(possibleEcnhantMaxRank);\n+                                uint32 curOHId = GetAIMiscValue(BOTAI_MISC_ENCHANT_CURRENT_OH);\n+                                bool same = possibleEnchant == curOHId;\n+                                std::string spellName;\n+                                _LocalizeSpell(player, spellName, availableInfo->Id);\n+                                AddGossipItemFor(player, same ? GOSSIP_ICON_BATTLE : GOSSIP_ICON_CHAT, spellName, GOSSIP_SENDER_CLASS_ACTION3, GOSSIP_ACTION_INFO_DEF + possibleEnchant);\n+                            }\n+                        }\n+                        AddGossipItemFor(player, isauto ? GOSSIP_ICON_BATTLE : GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_AUTO), GOSSIP_SENDER_CLASS_ACTION3, GOSSIP_ACTION_INFO_DEF + 0);\n+                        AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_BACK), 1, GOSSIP_ACTION_INFO_DEF + 1);\n+                    }\n+                    else if (action == 5)\n+                    {\n+                        if (me->GetShapeshiftForm() == FORM_NONE)\n+                        {\n+                            BotWhisper(LocalizedNpcText(player, BOT_TEXT_NOT_SHAPESHIFTED), player);\n+                            break;\n+                        }\n+                        removeShapeshiftForm();\n+                    }\n+\n+                    break;\n+                }\n+                case BOT_CLASS_HUNTER:\n+                {\n+                    if (IsCasting())\n+                    {\n+                        player->SendEquipError(EQUIP_ERR_OBJECT_IS_BUSY, nullptr);\n+                        break;\n+                    }\n+\n+                    action -= GOSSIP_ACTION_INFO_DEF;\n+\n+                    if (action == 2)\n+                    {\n+                        subMenu = true;\n+                        uint32 curType = GetAIMiscValue(BOTAI_MISC_PET_TYPE);\n+                        for (uint32 i = BOTAI_MISC_PET_AVAILABLE_1; i <= BOTAI_MISC_PET_AVAILABLE_11; ++i)\n+                        {\n+                            if (uint32 possibleType = GetAIMiscValue(i))\n+                            {\n+                                std::string name;\n+                                if (possibleType == BOT_PET_CUNNING_START)\n+                                {\n+                                    name = LocalizedNpcText(player, BOT_TEXT_RANDOMPET_CUNNING);\n+                                    possibleType = urand(BOT_PET_CUNNING_START, BOT_PET_CUNNING_END);\n+                                }\n+                                else if (possibleType == BOT_PET_FEROCITY_START)\n+                                {\n+                                    name = LocalizedNpcText(player, BOT_TEXT_RANDOMPET_FEROCITY);\n+                                    possibleType = urand(BOT_PET_FEROCITY_START, BOT_PET_FEROCITY_END);\n+                                }\n+                                else if (possibleType == BOT_PET_TENACITY_START)\n+                                {\n+                                    name = LocalizedNpcText(player, BOT_TEXT_RANDOMPET_TENACITY);\n+                                    possibleType = urand(BOT_PET_TENACITY_START, BOT_PET_TENACITY_END);\n+                                }\n+                                else\n+                                {\n+                                    CreatureTemplate const* cinfo = sObjectMgr->GetCreatureTemplate(possibleType);\n+                                    ASSERT(cinfo);\n+                                    name = cinfo->Name;\n+                                }\n+                                bool same = possibleType == curType;\n+                                AddGossipItemFor(player, same ? GOSSIP_ICON_BATTLE : GOSSIP_ICON_CHAT, name, GOSSIP_SENDER_CLASS_ACTION4, GOSSIP_ACTION_INFO_DEF + possibleType);\n+                            }\n+                        }\n+                        bool noPet = curType == BOT_PET_INVALID;\n+                        AddGossipItemFor(player, noPet ? GOSSIP_ICON_BATTLE : GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_NONE2), GOSSIP_SENDER_CLASS_ACTION4, GOSSIP_ACTION_INFO_DEF + uint32(BOT_PET_INVALID));\n+                        AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_AUTO), GOSSIP_SENDER_CLASS_ACTION4, GOSSIP_ACTION_INFO_DEF + 0);\n+                        AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_BACK), 1, GOSSIP_ACTION_INFO_DEF + 1);\n+                    }\n+                    break;\n+                }\n+                case BOT_CLASS_WARLOCK:\n+                {\n+                    if (IsCasting())\n+                    {\n+                        player->SendEquipError(EQUIP_ERR_OBJECT_IS_BUSY, nullptr);\n+                        break;\n+                    }\n+\n+                    action -= GOSSIP_ACTION_INFO_DEF;\n+\n+                    if (action == 2)\n+                    {\n+                        subMenu = true;\n+                        uint32 curType = GetAIMiscValue(BOTAI_MISC_PET_TYPE);\n+                        for (uint32 i = BOTAI_MISC_PET_AVAILABLE_1; i <= BOTAI_MISC_PET_AVAILABLE_5; ++i)\n+                        {\n+                            if (uint32 possibleType = GetAIMiscValue(i))\n+                            {\n+                                CreatureTemplate const* cinfo = sObjectMgr->GetCreatureTemplate(possibleType);\n+                                ASSERT(cinfo);\n+                                bool same = possibleType == curType;\n+                                AddGossipItemFor(player, same ? GOSSIP_ICON_BATTLE : GOSSIP_ICON_CHAT, cinfo->Name, GOSSIP_SENDER_CLASS_ACTION4, GOSSIP_ACTION_INFO_DEF + possibleType);\n+                            }\n+                        }\n+                        bool noPet = curType == BOT_PET_INVALID;\n+                        AddGossipItemFor(player, noPet ? GOSSIP_ICON_BATTLE : GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_NONE2), GOSSIP_SENDER_CLASS_ACTION4, GOSSIP_ACTION_INFO_DEF + uint32(BOT_PET_INVALID));\n+                        AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_AUTO), GOSSIP_SENDER_CLASS_ACTION4, GOSSIP_ACTION_INFO_DEF + 0);\n+                        AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_BACK), 1, GOSSIP_ACTION_INFO_DEF + 1);\n+                    }\n+                    else if (action == 1)\n+                    {\n+                        if (GetAIMiscValue(6201) == 0)\n+                        {\n+                            BotWhisper(LocalizedNpcText(player, BOT_TEXT_NO_HEALTHSTONE), player);\n+                            break;\n+                        }\n+\n+                        //Prevent high-leveled healthstone for low-level characters\n+                        Unit* checker;\n+                        if (player->GetLevel() < me->GetLevel())\n+                            checker = player;\n+                        else\n+                            checker = me;\n+\n+                        static uint32 HealthStones[8] = { 19005,19007,19009,19011,19013,22105,36891,36894 };\n+                        uint32 spellId = InitSpell(me, 6201); //Create Healthstone Rank 1\n+                        SpellInfo const* spellInfo = spellId ? sSpellMgr->GetSpellInfo(spellId) : nullptr;\n+                        if (!spellInfo)\n+                        {\n+                            BotWhisper(LocalizedNpcText(player, BOT_TEXT_CANT_CREATE_HEALTHSTONE), player);\n+                            break;\n+                        }\n+\n+                        int8 i = spellInfo->GetRank() - 1;\n+                        for (; i != 0; --i)\n+                            if (ItemTemplate const* stone = sObjectMgr->GetItemTemplate(HealthStones[i]))\n+                                if (stone->RequiredLevel <= checker->GetLevel())\n+                                    break;\n+\n+                        //at least rank 1 (even if player is level 1)\n+                        ItemPosCountVec dest;\n+                        InventoryResult msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, HealthStones[i], 1);\n+                        if (msg != EQUIP_ERR_OK)\n+                        {\n+                            player->SendEquipError(msg, nullptr, nullptr, HealthStones[i]);\n+                            break;\n+                        }\n+                        Item* item = player->StoreNewItem(dest, HealthStones[i], true, 0);\n+                        if (!item)\n+                        {\n+                            player->SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND, nullptr, nullptr);\n+                            break;\n+                        }\n+\n+                        //remove healthstone\n+                        SetAIMiscValue(6201, 0);\n+\n+                        player->SendNewItem(item, 1, true, false, true);\n+                    }\n+                    else if (action == 3) //soulwell\n+                    {\n+                        uint32 wellSpellId = GetSpell(29893); //Ritual of Souls\n+                        if (!wellSpellId)\n+                        {\n+                            BotWhisper(LocalizedNpcText(player, BOT_TEXT_DISABLED), player);\n+                            break;\n+                        }\n+                        if (!IsSpellReady(29893, GetLastDiff(), false))\n+                        {\n+                            BotWhisper(LocalizedNpcText(player, BOT_TEXT_NOT_READY_YET), player);\n+                            break;\n+                        }\n+                        uint32 wellGOForSpell = (wellSpellId == 29893 ? GO_SOULWELL_1 : GO_SOULWELL_2);\n+                        GameObjectTemplate const* goInfo = sObjectMgr->GetGameObjectTemplate(wellGOForSpell);\n+                        if (!goInfo)\n+                        {\n+                            BotWhisper(LocalizedNpcText(player, BOT_TEXT_INVALID_OBJECT_TYPE), player);\n+                            break;\n+                        }\n+                        float x,y,z;\n+                        me->GetClosePoint(x, y, z, me->GetCombatReach(), 0.f, 0.f);\n+                        G3D::Quat rot = G3D::Matrix3::fromEulerAnglesZYX(me->GetOrientation(), 0.f, 0.f);\n+\n+                        GameObject* soulwell = new GameObject;\n+                        if (!soulwell->Create(me->GetMap()->GenerateLowGuid<HighGuid::GameObject>(), wellGOForSpell, me->GetMap(),\n+                            me->GetPhaseMask(), x,y,z, me->GetOrientation(), rot, 255, GO_STATE_READY))\n+                        {\n+                            delete soulwell;\n+                            BotWhisper(LocalizedNpcText(player, BOT_TEXT_FAILED), player);\n+                            break;\n+                        }\n+\n+                        SetSpellCooldown(29893, 300000);\n+\n+                        soulwell->SetRespawnTime(180);\n+                        //soulwell->SetOwnerGUID(master->GetGUID());\n+                        master->AddGameObject(soulwell);\n+                        soulwell->SetSpellId(wellSpellId);\n+                        me->GetMap()->AddToMap(soulwell);\n+\n+                        BotWhisper(LocalizedNpcText(player, BOT_TEXT_DONE), player);\n+                        break;\n+                    }\n+                    break;\n+                }\n+                case BOT_CLASS_DRUID:\n+                {\n+                    if (IsCasting())\n+                    {\n+                        player->SendEquipError(EQUIP_ERR_OBJECT_IS_BUSY, nullptr);\n+                        break;\n+                    }\n+                    if (me->GetShapeshiftForm() == FORM_NONE)\n+                    {\n+                        BotWhisper(LocalizedNpcText(player, BOT_TEXT_NOT_SHAPESHIFTED), player);\n+                        break;\n+                    }\n+\n+                    removeShapeshiftForm();\n+                    break;\n+                }\n+\n+                default:\n+                    break;\n+            }\n+            break;\n+        }\n+        case GOSSIP_SENDER_CLASS_ACTION1:\n+        {\n+            switch (_botclass)\n+            {\n+                case BOT_CLASS_MAGE:\n+                {\n+                    if (!IsCasting())\n+                    {\n+                        uint32 portal_spell_id = action - GOSSIP_ACTION_INFO_DEF;\n+                        if (!portal_spell_id)\n+                            break;\n+\n+                        if (!IsSpellReady(portal_spell_id, lastdiff, false))\n+                        {\n+                            BotWhisper(LocalizedNpcText(player, BOT_TEXT_NOT_READY_YET), player);\n+                            return OnGossipSelect(player, creature, GOSSIP_SENDER_CLASS, GOSSIP_ACTION_INFO_DEF + 4);\n+                        }\n+\n+                        //CastSpellExtraArgs args;\n+                        //args.SetOriginalCaster(player->GetGUID());\n+                        me->CastCustomSpell(me, portal_spell_id, nullptr, nullptr, nullptr, false, nullptr, nullptr, player->GetGUID());\n+                    }\n+                    break;\n+                }\n+                case BOT_CLASS_ROGUE:\n+                {\n+                    if (!IsCasting())\n+                    {\n+                        // Pick Lock\n+                        uint32 picklock = InitSpell(me, 1804);\n+                        if (!picklock)\n+                        {\n+                            BotWhisper(LocalizedNpcText(player, BOT_TEXT_NO_LOCKPICKING), player);\n+                            break;\n+                        }\n+\n+                        SpellInfo const* Info = sSpellMgr->GetSpellInfo(picklock);\n+                        Spell* lockpickspell = new Spell(player, Info, TRIGGERED_NONE, me->GetGUID());\n+                        SpellCastTargets targets;\n+\n+                        if (action == GOSSIP_ACTION_INFO_DEF + 1)\n+                        {\n+                            //1 Nearest gameobject\n+                            GameObject* obj = nullptr;\n+                            NearestLockedGameObjectInRangeCheck check(player, 4.f);\n+                            Bcore::GameObjectLastSearcher<NearestLockedGameObjectInRangeCheck> searcher(player, obj, check);\n+                            Cell::VisitObjects(player, searcher, 4.f);\n+                            //player->VisitNearbyGridObject(4.f, searcher);\n+                            if (obj)\n+                            {\n+                                targets.SetGOTarget(obj);\n+                                lockpickspell->m_targets.SetGOTarget(obj); //for checkCast only\n+                            }\n+                        }\n+                        else\n+                        {\n+                            //2 Inventory\n+                            Item* item = nullptr;\n+                            uint32 guidLow = action - GOSSIP_ACTION_INFO_DEF;\n+\n+                            bool found = false;\n+                            //backpack\n+                            for (uint8 i = INVENTORY_SLOT_ITEM_START; i != INVENTORY_SLOT_ITEM_END; ++i)\n+                            {\n+                                item = player->GetItemByPos(INVENTORY_SLOT_BAG_0, i);\n+                                if (item && item->GetGUID().GetCounter() == guidLow)\n+                                {\n+                                    targets.SetItemTarget(item);\n+                                    lockpickspell->m_targets.SetItemTarget(item); //for checkCast only\n+                                    found = true;\n+                                    break;\n+                                }\n+                            }\n+                            //bags\n+                            if (!found)\n+                            {\n+                                for (uint8 i = INVENTORY_SLOT_BAG_START; i != INVENTORY_SLOT_BAG_END; ++i)\n+                                {\n+                                    if (Bag const* bag = player->GetBagByPos(i))\n+                                    {\n+                                        for (uint32 j = 0; j != bag->GetBagSize(); ++j)\n+                                        {\n+                                            item = player->GetItemByPos(i, j);\n+                                            if (item && item->GetGUID().GetCounter() == guidLow)\n+                                            {\n+                                                targets.SetItemTarget(item);\n+                                                lockpickspell->m_targets.SetItemTarget(item); //for checkCast only\n+                                                found = true;\n+                                                break;\n+                                            }\n+                                        }\n+                                    }\n+\n+                                    if (found)\n+                                        break;\n+                                }\n+                            }\n+                        }\n+\n+                        SpellCastResult result = me->IsMounted() || CCed(me) ? SPELL_FAILED_CUSTOM_ERROR : lockpickspell->CheckCast(false);\n+                        if (result != SPELL_CAST_OK)\n+                        {\n+                            lockpickspell->finish(false);\n+                            delete lockpickspell;\n+                            if (result == SPELL_FAILED_LOW_CASTLEVEL)\n+                                BotWhisper(LocalizedNpcText(player, BOT_TEXT_SKILL_LEVEL_TOO_LOW), player);\n+                            else\n+                                BotWhisper(LocalizedNpcText(player, BOT_TEXT_FAILED), player);\n+                        }\n+                        else\n+                        {\n+                            lockpickspell->prepare(&targets);\n+                            //BotWhisper(\"Here...\", player);\n+                        }\n+                    }\n+                    return OnGossipSelect(player, creature, GOSSIP_SENDER_CLASS, GOSSIP_ACTION_INFO_DEF + 1);\n+                    //break;\n+                }\n+                default:\n+                    break;\n+            }\n+            break;\n+        }\n+        case GOSSIP_SENDER_CLASS_ACTION2: //set cur MH enchant\n+        {\n+            switch (_botclass)\n+            {\n+                case BOT_CLASS_ROGUE:\n+                {\n+                    uint32 baseId = action - GOSSIP_ACTION_INFO_DEF;\n+                    SetAIMiscValue(BOTAI_MISC_ENCHANT_CURRENT_MH, baseId);\n+                    break;\n+                }\n+                case BOT_CLASS_SHAMAN:\n+                {\n+                    uint32 baseId = action - GOSSIP_ACTION_INFO_DEF;\n+                    SetAIMiscValue(BOTAI_MISC_ENCHANT_CURRENT_MH, baseId);\n+                    break;\n+                }\n+            }\n+            return OnGossipHello(player, 0);\n+        }\n+        case GOSSIP_SENDER_CLASS_ACTION3: //set cur OH enchant\n+        {\n+            switch (_botclass)\n+            {\n+                case BOT_CLASS_ROGUE:\n+                {\n+                    uint32 baseId = action - GOSSIP_ACTION_INFO_DEF;\n+                    SetAIMiscValue(BOTAI_MISC_ENCHANT_CURRENT_OH, baseId);\n+                    break;\n+                }\n+                case BOT_CLASS_SHAMAN:\n+                {\n+                    uint32 baseId = action - GOSSIP_ACTION_INFO_DEF;\n+                    SetAIMiscValue(BOTAI_MISC_ENCHANT_CURRENT_OH, baseId);\n+                    break;\n+                }\n+            }\n+            return OnGossipHello(player, 0);\n+        }\n+        case GOSSIP_SENDER_CLASS_ACTION4: //set pet type\n+        {\n+            switch (_botclass)\n+            {\n+                case BOT_CLASS_HUNTER:\n+                {\n+                    uint32 petType = action - GOSSIP_ACTION_INFO_DEF;\n+                    SetAIMiscValue(BOTAI_MISC_PET_TYPE, petType);\n+                    break;\n+                }\n+                case BOT_CLASS_WARLOCK:\n+                {\n+                    uint32 petType = action - GOSSIP_ACTION_INFO_DEF;\n+                    SetAIMiscValue(BOTAI_MISC_PET_TYPE, petType);\n+                    break;\n+                }\n+            }\n+            return OnGossipHello(player, 0);\n+        }\n+        case GOSSIP_SENDER_MODEL_UPDATE:\n+        {\n+            if (Aura* trans = me->AddAura(MODEL_TRANSITION, me))\n+            {\n+                me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + uint32(BOT_SLOT_OFFHAND), 0); //debug: remove offhand visuals\n+                trans->SetDuration(500);\n+                trans->SetMaxDuration(500);\n+            }\n+            break;\n+        }\n+        case GOSSIP_SENDER_EQUIPMENT: //equips change s1: send what slots we can use\n+        {\n+            subMenu = true;\n+\n+            const bool can_change_equips = !shared_owner || BotCfg::IsSharedOwnerOptionEnabled(SharedOwnerOptionMask::SHARED_OWNER_OPTION_MASK_EQUIPMENT);\n+\n+            //show inventory\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_SHOW_INVENTORY), GOSSIP_SENDER_EQUIPMENT_LIST, GOSSIP_ACTION_INFO_DEF + 1);\n+\n+            //gear bank\n+            if (BotCfg::IsGearBankEnabled() && can_change_equips)\n+                AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_BOT_GEAR_BANK), GOSSIP_SENDER_EQUIPMENT_BANK_MENU, GOSSIP_ACTION_INFO_DEF + 1);\n+\n+            //auto-equip\n+            if (can_change_equips)\n+                AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_AUTOEQUIP) + \"...\", GOSSIP_SENDER_EQUIP_AUTOEQUIP, GOSSIP_ACTION_INFO_DEF + 1);\n+\n+            //weapons\n+            AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_SLOT_MH) + \"...\", GOSSIP_SENDER_EQUIPMENT_SHOW, GOSSIP_ACTION_INFO_DEF + uint32(BOT_SLOT_MAINHAND));\n+            if (_canUseOffHand())\n+                AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_SLOT_OH) + \"...\", GOSSIP_SENDER_EQUIPMENT_SHOW, GOSSIP_ACTION_INFO_DEF + uint32(BOT_SLOT_OFFHAND));\n+            if (_canUseRanged())\n+                AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_SLOT_RH) + \"...\", GOSSIP_SENDER_EQUIPMENT_SHOW, GOSSIP_ACTION_INFO_DEF + uint32(BOT_SLOT_RANGED));\n+            if (_canUseRelic())\n+                AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_SLOT_RELIC) + \"...\", GOSSIP_SENDER_EQUIPMENT_SHOW, GOSSIP_ACTION_INFO_DEF + uint32(BOT_SLOT_RANGED));\n+\n+            //armor\n+            AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_SLOT_HEAD) + \"...\", GOSSIP_SENDER_EQUIPMENT_SHOW, GOSSIP_ACTION_INFO_DEF + uint32(BOT_SLOT_HEAD));\n+            AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_SLOT_SHOULDERS) + \"...\", GOSSIP_SENDER_EQUIPMENT_SHOW, GOSSIP_ACTION_INFO_DEF + uint32(BOT_SLOT_SHOULDERS));\n+            AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_SLOT_CHEST) + \"...\", GOSSIP_SENDER_EQUIPMENT_SHOW, GOSSIP_ACTION_INFO_DEF + uint32(BOT_SLOT_CHEST));\n+            AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_SLOT_WAIST) + \"...\", GOSSIP_SENDER_EQUIPMENT_SHOW, GOSSIP_ACTION_INFO_DEF + uint32(BOT_SLOT_WAIST));\n+            AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_SLOT_LEGS) + \"...\", GOSSIP_SENDER_EQUIPMENT_SHOW, GOSSIP_ACTION_INFO_DEF + uint32(BOT_SLOT_LEGS));\n+            AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_SLOT_FEET) + \"...\", GOSSIP_SENDER_EQUIPMENT_SHOW, GOSSIP_ACTION_INFO_DEF + uint32(BOT_SLOT_FEET));\n+            AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_SLOT_WRIST) + \"...\", GOSSIP_SENDER_EQUIPMENT_SHOW, GOSSIP_ACTION_INFO_DEF + uint32(BOT_SLOT_WRIST));\n+            AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_SLOT_HANDS) + \"...\", GOSSIP_SENDER_EQUIPMENT_SHOW, GOSSIP_ACTION_INFO_DEF + uint32(BOT_SLOT_HANDS));\n+\n+            if (IsHumanoidClass(_botclass))\n+            {\n+                AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_SLOT_BACK) + \"...\", GOSSIP_SENDER_EQUIPMENT_SHOW, GOSSIP_ACTION_INFO_DEF + uint32(BOT_SLOT_BACK));\n+                AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_SLOT_SHIRT) + \"...\", GOSSIP_SENDER_EQUIPMENT_SHOW, GOSSIP_ACTION_INFO_DEF + uint32(BOT_SLOT_BODY));\n+                AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_SLOT_FINGER1) + \"...\", GOSSIP_SENDER_EQUIPMENT_SHOW, GOSSIP_ACTION_INFO_DEF + uint32(BOT_SLOT_FINGER1));\n+                AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_SLOT_FINGER2) + \"...\", GOSSIP_SENDER_EQUIPMENT_SHOW, GOSSIP_ACTION_INFO_DEF + uint32(BOT_SLOT_FINGER2));\n+                AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_SLOT_TRINKET1) + \"...\", GOSSIP_SENDER_EQUIPMENT_SHOW, GOSSIP_ACTION_INFO_DEF + uint32(BOT_SLOT_TRINKET1));\n+                AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_SLOT_TRINKET2) + \"...\", GOSSIP_SENDER_EQUIPMENT_SHOW, GOSSIP_ACTION_INFO_DEF + uint32(BOT_SLOT_TRINKET2));\n+                AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_SLOT_NECK) + \"...\", GOSSIP_SENDER_EQUIPMENT_SHOW, GOSSIP_ACTION_INFO_DEF + uint32(BOT_SLOT_NECK));\n+            }\n+\n+            if (can_change_equips)\n+            {\n+                AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_UNEQUIP_ALL), GOSSIP_SENDER_UNEQUIP_ALL,\n+                    GOSSIP_ACTION_INFO_DEF + 1, LocalizedNpcText(player, BOT_TEXT_UNEQUIP_ALL) + \"?\", 0, false);\n+\n+                if (BotCfg::IsGearBankEnabled())\n+                {\n+                    AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_UNEQUIP_ALL) + LocalizedNpcText(player, BOT_TEXT___GEAR_BANK_),\n+                        GOSSIP_SENDER_UNEQUIP_ALL_TO_GEARBANK, GOSSIP_ACTION_INFO_DEF + 1, LocalizedNpcText(player, BOT_TEXT_UNEQUIP_ALL) + LocalizedNpcText(player, BOT_TEXT___GEAR_BANK_) + \"?\", 0, false);\n+                }\n+\n+                if (creature->GetCreatureTemplate()->unit_flags2 & UNIT_FLAG2_MIRROR_IMAGE)\n+                    AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_UPDATE_VISUAL), GOSSIP_SENDER_MODEL_UPDATE, GOSSIP_ACTION_INFO_DEF + 1);\n+            }\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_BACK), 1, GOSSIP_ACTION_INFO_DEF + 1);\n+\n+            break;\n+        }\n+        case GOSSIP_SENDER_EQUIPMENT_LIST: //list inventory\n+        {\n+            //if (action - GOSSIP_ACTION_INFO_DEF != BOT_SLOT_NONE)\n+            //    break;\n+\n+            EquipmentInfo const* einfo = BotDataMgr::GetBotEquipmentInfo(me->GetEntry());\n+            for (auto slot : NPCBots::index_array<uint8, BOT_INVENTORY_SIZE>)\n+            {\n+                Item const* item = _equips[slot];\n+                if (!item) continue;\n+                std::ostringstream msg;\n+                _AddItemLink(player, item, msg/*, false*/);\n+                //uncomment if needed\n+                //msg << \" in slot \" << uint32(i) << \" (\" << _getNameForSlot(i + 1) << ')';\n+                if (slot <= BOT_SLOT_RANGED && einfo->ItemEntry[slot] == item->GetEntry())\n+                    msg << \" |cffe6cc80|h[!\" << LocalizedNpcText(player, BOT_TEXT_VISUALONLY) << \"!]|h|r\";\n+                BotWhisper(msg.view(), player);\n+            }\n+\n+            std::ostringstream msg2;\n+            msg2 << \"GS: \" << uint32(GetBotGearScores().first);\n+            BotWhisper(msg2.view(), player);\n+\n+            break;\n+        }\n+        case GOSSIP_SENDER_EQUIP_TRANSMOGRIFY_MHAND:     //0 - 1 main hand\n+        case GOSSIP_SENDER_EQUIP_TRANSMOGRIFY_OHAND:     //1 - 1 off hand\n+        case GOSSIP_SENDER_EQUIP_TRANSMOGRIFY_RANGED:    //2 - 1 ranged\n+        case GOSSIP_SENDER_EQUIP_TRANSMOGRIFY_HEAD:      //3 - 1 head\n+        case GOSSIP_SENDER_EQUIP_TRANSMOGRIFY_SHOULDERS: //4 - 1 shoulders\n+        case GOSSIP_SENDER_EQUIP_TRANSMOGRIFY_CHEST:     //5 - 1 chest\n+        case GOSSIP_SENDER_EQUIP_TRANSMOGRIFY_WAIST:     //6 - 1 waist\n+        case GOSSIP_SENDER_EQUIP_TRANSMOGRIFY_LEGS:      //7 - 1 legs\n+        case GOSSIP_SENDER_EQUIP_TRANSMOGRIFY_FEET:      //8 - 1 feet\n+        case GOSSIP_SENDER_EQUIP_TRANSMOGRIFY_WRIST:     //9 - 1 wrist\n+        case GOSSIP_SENDER_EQUIP_TRANSMOGRIFY_HANDS:     //10 - 1 hands\n+        case GOSSIP_SENDER_EQUIP_TRANSMOGRIFY_BACK:      //11 - 1 back\n+        case GOSSIP_SENDER_EQUIP_TRANSMOGRIFY_BODY:      //12 - 1 body\n+        {\n+            uint8 slot = sender - GOSSIP_SENDER_EQUIP_TRANSMOGRIFY;\n+            int32 itemId = (action == std::numeric_limits<uint32>::max()) ? -1 : int32(action);\n+            uint32 itemId_u = uint32(std::max<int32>(itemId, 0));\n+\n+            Item const* item = _equips[slot];\n+            ASSERT(item);\n+\n+            BotDataMgr::UpdateNpcBotTransmogData(me->GetEntry(), slot, item->GetEntry(), itemId);\n+\n+            if (slot <= BOT_SLOT_RANGED)\n+                me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + slot, itemId_u ? itemId_u : item->GetEntry());\n+\n+            return OnGossipSelect(player, creature, GOSSIP_SENDER_EQUIPMENT, GOSSIP_ACTION_INFO_DEF + 1);\n+        }\n+        case GOSSIP_SENDER_EQUIP_TRANSMOG_INFO:\n+        {\n+            uint8 slot = action - GOSSIP_ACTION_INFO_DEF;\n+\n+            NpcBotTransmogData const* tramsmogData = BotDataMgr::SelectNpcBotTransmogs(me->GetEntry());\n+            ASSERT(tramsmogData);\n+            ASSERT(tramsmogData->transmogs[slot].second >= 0);\n+\n+            uint32 item_id = uint32(tramsmogData->transmogs[slot].second);\n+            ItemTemplate const* proto = item_id ? sObjectMgr->GetItemTemplate(item_id) : nullptr;\n+            if (proto)\n+            {\n+                std::ostringstream msg;\n+                _AddItemTemplateLink(player, proto, msg);\n+                BotWhisper(msg.view(), player);\n+            }\n+\n+            //break; //no break here - return to menu\n+        }\n+        [[fallthrough]];\n+        case GOSSIP_SENDER_EQUIP_TRANSMOGS:\n+        {\n+            subMenu = true;\n+\n+            uint8 slot = action - GOSSIP_ACTION_INFO_DEF;\n+            Item const* item = _equips[slot];\n+            ASSERT(item);\n+\n+            std::set<uint32> itemList, idsList;\n+\n+            auto try_put_item = [player, slot, &itemList, &idsList, this](uint8 bag, uint8 bag_slot) {\n+                if (Item const* pItem = player->GetItemByPos(bag, bag_slot))\n+                {\n+                    if (IsValidTransmog(slot, pItem->GetTemplate()) && !idsList.contains(pItem->GetEntry()))\n+                    {\n+                        itemList.insert(pItem->GetGUID().GetCounter());\n+                        idsList.insert(pItem->GetEntry());\n+                    }\n+                }\n+            };\n+\n+            //s5.1: build list\n+            //s5.1.1: backpack\n+            for (uint8 i = INVENTORY_SLOT_ITEM_START; i != INVENTORY_SLOT_ITEM_END; ++i)\n+                try_put_item(INVENTORY_SLOT_BAG_0, i);\n+\n+            //s5.1.2: other bags\n+            for (uint8 i = INVENTORY_SLOT_BAG_START; i != INVENTORY_SLOT_BAG_END; ++i)\n+                if (Bag const* pBag = player->GetBagByPos(i))\n+                    for (uint32 j = 0; j != pBag->GetBagSize(); ++j)\n+                        try_put_item(i, j);\n+\n+            //s5.1.3: inventory\n+            for (uint8 i = EQUIPMENT_SLOT_START; i != EQUIPMENT_SLOT_END; ++i)\n+                try_put_item(INVENTORY_SLOT_BAG_0, i);\n+\n+            //s5.2: add gossips\n+            NpcBotTransmogData const* tramsmogData = BotDataMgr::SelectNpcBotTransmogs(me->GetEntry());\n+            if (tramsmogData && tramsmogData->transmogs[slot].first)\n+            {\n+                int32 item_id = tramsmogData->transmogs[slot].second;\n+                if (item_id >= 0)\n+                {\n+                    //s5.2.1.1: current\n+                    std::ostringstream msg;\n+                    if (item_id == 0)\n+                        msg << LocalizedNpcText(player, BOT_TEXT_HIDDEN);\n+                    else if (ItemTemplate const* proto = sObjectMgr->GetItemTemplate(uint32(item_id)))\n+                        _AddItemTemplateLink(player, proto, msg);\n+                    else\n+                        msg << '<' << LocalizedNpcText(player, BOT_TEXT_UNKNOWN) << \"(\" << item_id << \")>\";\n+\n+                    AddGossipItemFor(player, GOSSIP_ICON_BATTLE, msg.str(), GOSSIP_SENDER_EQUIP_TRANSMOG_INFO, GOSSIP_ACTION_INFO_DEF + slot);\n+\n+                    //s5.2.1.2a: reset\n+                    AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_NONE), GOSSIP_SENDER_EQUIP_TRANSMOGRIFY + slot, std::numeric_limits<uint32>::max());\n+                }\n+                else\n+                {\n+                    //s5.2.1.2b: None\n+                    AddGossipItemFor(player, GOSSIP_ICON_BATTLE, LocalizedNpcText(player, BOT_TEXT_NONE), GOSSIP_SENDER_EQUIP_TRANSMOGS, action);\n+                }\n+            }\n+\n+            //s5.2.1.2c: hide\n+            if (slot > BOT_SLOT_RANGED &&\n+                !(tramsmogData && tramsmogData->transmogs[slot].first && tramsmogData->transmogs[slot].second == 0))\n+                AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_HIDDEN), GOSSIP_SENDER_EQUIP_TRANSMOGRIFY + slot, 0);\n+\n+            if (!itemList.empty())\n+            {\n+                uint32 counter = 0;\n+                std::ostringstream name;\n+                const uint32 maxcounter = BOT_GOSSIP_MAX_ITEMS - 3; //current, reset, back\n+\n+                auto try_add_gossip = [player, slot, &counter, &name, this](uint8 bag, uint8 bag_slot, uint32 guidlow) {\n+                    Item const* pitem = player->GetItemByPos(bag, bag_slot);\n+                    if (pitem && pitem->GetGUID().GetCounter() == guidlow)\n+                    {\n+                        _AddItemLink(player, pitem, name);\n+                        AddGossipItemFor(player, GOSSIP_ICON_CHAT, name.str(), GOSSIP_SENDER_EQUIP_TRANSMOGRIFY + slot, pitem->GetEntry());\n+                        name.str(\"\");\n+                        ++counter;\n+                        return true;\n+                    }\n+                    return false;\n+                };\n+\n+                //s5.2.2: add items as gossip options\n+                for (std::set<uint32>::const_iterator itr = itemList.begin(); itr != itemList.end() && counter < maxcounter; ++itr)\n+                {\n+                    bool found = false;\n+                    for (uint8 i = INVENTORY_SLOT_ITEM_START; i != INVENTORY_SLOT_ITEM_END; ++i)\n+                    {\n+                        if (try_add_gossip(INVENTORY_SLOT_BAG_0, i, *itr))\n+                        {\n+                            found = true;\n+                            break;\n+                        }\n+                    }\n+\n+                    if (found)\n+                        continue;\n+\n+                    for (uint8 i = EQUIPMENT_SLOT_START; i != EQUIPMENT_SLOT_END; ++i)\n+                    {\n+                        if (try_add_gossip(INVENTORY_SLOT_BAG_0, i, *itr))\n+                        {\n+                            found = true;\n+                            break;\n+                        }\n+                    }\n+\n+                    if (found)\n+                        continue;\n+\n+                    for (uint8 i = INVENTORY_SLOT_BAG_START; i != INVENTORY_SLOT_BAG_END; ++i)\n+                    {\n+                        if (Bag const* pBag = player->GetBagByPos(i))\n+                        {\n+                            for (uint32 j = 0; j != pBag->GetBagSize(); ++j)\n+                            {\n+                                if (try_add_gossip(i, j, *itr))\n+                                {\n+                                    found = true;\n+                                    break;\n+                                }\n+                            }\n+                        }\n+\n+                        if (found)\n+                            break;\n+                    }\n+\n+                    if (found)\n+                        continue;\n+                }\n+            }\n+\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_BACK), GOSSIP_SENDER_EQUIPMENT, GOSSIP_ACTION_INFO_DEF + 2);\n+\n+            break;\n+        }\n+        case GOSSIP_SENDER_EQUIPMENT_INFO: //request equip item info\n+        {\n+            //GOSSIP ITEMS RESTRICTED\n+            //subMenu = true; //needed for return\n+\n+            EquipmentInfo const* einfo = BotDataMgr::GetBotEquipmentInfo(me->GetEntry());\n+            uint8 slot = action - GOSSIP_ACTION_INFO_DEF;\n+            Item const* item = _equips[slot];\n+            ASSERT(item);\n+\n+            std::ostringstream msg;\n+            _AddItemLink(player, item, msg, false);\n+\n+            if (slot <= BOT_SLOT_RANGED && einfo->ItemEntry[slot] == item->GetEntry())\n+                msg << \" |cffe6cc80|h[!\" << LocalizedNpcText(player, BOT_TEXT_VISUALONLY) << \"!]|h|r\";\n+\n+            msg << \" GS: \" << uint32(CalculateItemGearScore(item->GetTemplate(), me->GetEntry(), me->GetLevel(), GetBotClass(), GetSpec(), slot));\n+\n+            BotWhisper(msg.view(), player);\n+\n+            //break; //no break here - return to menu\n+        }\n+        [[fallthrough]];\n+        case GOSSIP_SENDER_EQUIPMENT_SHOW: //equips change s2: send list of equippable items\n+        {\n+            subMenu = true;\n+            const uint8 slot = action - GOSSIP_ACTION_INFO_DEF;\n+\n+            const bool can_change_equips = !shared_owner || BotCfg::IsSharedOwnerOptionEnabled(SharedOwnerOptionMask::SHARED_OWNER_OPTION_MASK_EQUIPMENT);\n+\n+            EquipmentInfo const* einfo = BotDataMgr::GetBotEquipmentInfo(me->GetEntry());\n+            std::set<uint32> itemList, idsList;\n+\n+            //s2.1: build list\n+            //s2.1.1: backpack\n+            if (can_change_equips)\n+            {\n+                auto try_put_item = [player, slot, einfo, &itemList, &idsList, this](uint8 bag, uint8 bag_slot) {\n+                    if (Item const* pItem = player->GetItemByPos(bag, bag_slot))\n+                    {\n+                        if (!std::ranges::any_of(einfo->ItemEntry, [=](uint32 eeid) { return eeid == pItem->GetEntry(); }) &&\n+                            _canEquip(pItem->GetTemplate(), slot, true, pItem) &&\n+                            (pItem->GetItemRandomPropertyId() == 0 || !idsList.contains(pItem->GetEntry())))\n+                        {\n+                            itemList.insert(pItem->GetGUID().GetCounter());\n+                            idsList.insert(pItem->GetEntry());\n+                        }\n+                    }\n+                };\n+\n+                for (uint8 i = INVENTORY_SLOT_ITEM_START; i != INVENTORY_SLOT_ITEM_END; ++i)\n+                    try_put_item(INVENTORY_SLOT_BAG_0, i);\n+\n+                //s2.1.2: other bags\n+                for (uint8 i = INVENTORY_SLOT_BAG_START; i != INVENTORY_SLOT_BAG_END; ++i)\n+                    if (Bag const* pBag = player->GetBagByPos(i))\n+                        for (uint32 j = 0; j != pBag->GetBagSize(); ++j)\n+                           try_put_item(i, j);\n+            }\n+\n+            //s2.2: add gossips\n+\n+            //s2.2.0 add current item (with return)\n+            std::ostringstream str;\n+            str << LocalizedNpcText(player, BOT_TEXT_EQUIPPED) << \": \";\n+            if (Item const* item = _equips[slot])\n+            {\n+                bool visual_only = slot <= BOT_SLOT_RANGED && einfo->ItemEntry[slot] == item->GetEntry();\n+\n+                _AddItemLink(player, item, str);\n+                if (visual_only)\n+                    str << \" |cffe6cc80|h[!\" << LocalizedNpcText(player, BOT_TEXT_VISUALONLY) << \"!]|h|r\";\n+\n+                str << \" GS: \" << uint32(CalculateItemGearScore(item->GetTemplate(), me->GetEntry(), me->GetLevel(), GetBotClass(), GetSpec(), slot));\n+\n+                AddGossipItemFor(player, GOSSIP_ICON_CHAT, str.str(), GOSSIP_SENDER_EQUIPMENT_INFO, action);\n+\n+                if (can_change_equips && !visual_only && BotCfg::DisplayEquipment() && BotCfg::IsTransmogEnabled() && slot < BOT_TRANSMOG_INVENTORY_SIZE && CanDisplayNonWeaponEquipmentChanges())\n+                    AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_TRANSMOGRIFICATION), GOSSIP_SENDER_EQUIP_TRANSMOGS, action);\n+            }\n+            else\n+            {\n+                str << LocalizedNpcText(player, BOT_TEXT_NOTHING);\n+                AddGossipItemFor(player, GOSSIP_ICON_CHAT, str.str(), GOSSIP_SENDER_EQUIPMENT_SHOW, action);\n+            }\n+\n+            if (can_change_equips && _equips[slot])\n+            {\n+                //s2.2.1 add unequip option if have weapon (GMs only)\n+                if (slot <= BOT_SLOT_RANGED)\n+                {\n+                    if (einfo->ItemEntry[slot] != 0)\n+                    {\n+                        AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_USE_OLD_EQUIPMENT), GOSSIP_SENDER_EQUIP_RESET, action);\n+                        if (BotCfg::IsGearBankEnabled())\n+                            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_USE_OLD_EQUIPMENT) + LocalizedNpcText(player, BOT_TEXT___GEAR_BANK_),\n+                                GOSSIP_SENDER_EQUIP_RESET_TO_GEARBANK, action);\n+                    }\n+                    else\n+                    {\n+                        AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_UNEQUIP), GOSSIP_SENDER_UNEQUIP, action);\n+                        if (BotCfg::IsGearBankEnabled())\n+                            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_UNEQUIP) + LocalizedNpcText(player, BOT_TEXT___GEAR_BANK_),\n+                                GOSSIP_SENDER_UNEQUIP_TO_GEARBANK, action);\n+                    }\n+                }\n+\n+                //s2.2.2 add unequip option for non-weapons\n+                if (slot > BOT_SLOT_RANGED)\n+                {\n+                    AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_UNEQUIP), GOSSIP_SENDER_UNEQUIP, action);\n+                    if (BotCfg::IsGearBankEnabled())\n+                        AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_UNEQUIP) + LocalizedNpcText(player, BOT_TEXT___GEAR_BANK_),\n+                            GOSSIP_SENDER_UNEQUIP_TO_GEARBANK, action);\n+                }\n+            }\n+\n+            //s2.2.3a: add an empty submenu with info if no items are found\n+            if (can_change_equips)\n+            {\n+                if (itemList.empty())\n+                {\n+                    AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_NOTHING_TO_GIVE), 0, GOSSIP_ACTION_INFO_DEF + 1);\n+                }\n+                else\n+                {\n+                    uint32 counter = 0;\n+                    const uint32 maxcounter = BOT_GOSSIP_MAX_ITEMS - 6; //unequip, unequip (gear bank), reset, current, transmog, back\n+                    std::ostringstream name;\n+\n+                    auto try_put_gossip = [player, slot, &name, &counter, this](uint8 bag, uint8 bag_slot, uint32 guidlow) {\n+                        if (Item const* pItem = player->GetItemByPos(bag, bag_slot); pItem && pItem->GetGUID().GetCounter() == guidlow)\n+                        {\n+                            _AddItemLink(player, pItem, name);\n+                            name << \" GS: \" << uint32(CalculateItemGearScore(pItem->GetTemplate(), me->GetEntry(), me->GetLevel(), GetBotClass(), GetSpec(), slot));\n+                            if (BotCfg::SendEquipListItems())\n+                                BotWhisper(name.view(), player);\n+                            AddGossipItemFor(player, GOSSIP_ICON_CHAT, name.str(), GOSSIP_SENDER_EQUIP + slot, GOSSIP_ACTION_INFO_DEF + pItem->GetGUID().GetCounter());\n+                            ++counter;\n+                            return true;\n+                        }\n+                        return false;\n+                    };\n+\n+                    //s2.2.3b: add items as gossip options\n+                    for (std::set<uint32>::const_iterator itr = itemList.begin(); itr != itemList.end() && counter < maxcounter; ++itr)\n+                    {\n+                        bool found = false;\n+                        for (uint8 i = INVENTORY_SLOT_ITEM_START; i != INVENTORY_SLOT_ITEM_END; ++i)\n+                        {\n+                            if (try_put_gossip(INVENTORY_SLOT_BAG_0, i, *itr))\n+                            {\n+                                found = true;\n+                                break;\n+                            }\n+                        }\n+\n+                        if (found)\n+                            continue;\n+\n+                        for (uint8 i = INVENTORY_SLOT_BAG_START; i != INVENTORY_SLOT_BAG_END; ++i)\n+                        {\n+                            if (Bag const* pBag = player->GetBagByPos(i))\n+                            {\n+                                for (uint32 j = 0; j != pBag->GetBagSize(); ++j)\n+                                {\n+                                    if (try_put_gossip(i, j, *itr))\n+                                    {\n+                                        found = true;\n+                                        break;\n+                                    }\n+                                }\n+                            }\n+\n+                            if (found)\n+                                break;\n+                        }\n+\n+                        if (found)\n+                            continue;\n+                    }\n+                }\n+            }\n+\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_BACK), GOSSIP_SENDER_EQUIPMENT, GOSSIP_ACTION_INFO_DEF + 2);\n+\n+            //BOT_LOG_ERROR(\"entities.player\", \"OnGossipSelect(bot): added %u item(s) to list of %s (requester: %s)\",\n+            //    counter, me->GetName().c_str(), player->GetName().c_str());\n+\n+            break;\n+        }\n+        case GOSSIP_SENDER_UNEQUIP: //equips change s3: Unequip DEPRECATED\n+        {\n+            if (_unequip(action - GOSSIP_ACTION_INFO_DEF, player->GetGUID(), false) != BotEquipResult::BOT_EQUIP_RESULT_OK)\n+            {} //BotWhisper(\"Impossible...\", player);\n+            return OnGossipSelect(player, creature, GOSSIP_SENDER_EQUIPMENT, GOSSIP_ACTION_INFO_DEF + 1);\n+        }\n+        case GOSSIP_SENDER_UNEQUIP_TO_GEARBANK:\n+        {\n+            BotEquipResult unequip_result = _unequip(action - GOSSIP_ACTION_INFO_DEF, player->GetGUID(), true);\n+            if (unequip_result != BotEquipResult::BOT_EQUIP_RESULT_OK)\n+            {\n+                if (unequip_result == BotEquipResult::BOT_EQUIP_RESULT_FAIL_NO_BANK_SPACE)\n+                {\n+                    uint32 max_size = BotCfg::GetGearBankCapacity();\n+                    uint32 gb_size = BotDataMgr::GetBotBankItemsCount(player->GetGUID());\n+                    ChatHandler ch(player->GetSession());\n+                    ch.PSendSysMessage(bot_ai::LocalizedNpcText(player, BOT_TEXT_NOT_ENOUGH_GEAR_BANK_SPACE).c_str(), uint32(1), gb_size, max_size);\n+                }\n+                else\n+                    BotWhisper(LocalizedNpcText(player, BOT_TEXT_FAILED), player);\n+            }\n+            return OnGossipSelect(player, creature, GOSSIP_SENDER_EQUIPMENT, GOSSIP_ACTION_INFO_DEF + 1);\n+        }\n+        case GOSSIP_SENDER_UNEQUIP_ALL:\n+        {\n+            BotEquipResult unequip_all_result = UnEquipAll(player->GetGUID(), false);\n+            if (unequip_all_result != BotEquipResult::BOT_EQUIP_RESULT_OK)\n+                BotWhisper(LocalizedNpcText(player, BOT_TEXT_FAILED), player);\n+            else\n+                me->HandleEmoteCommand(EMOTE_ONESHOT_CRY);\n+            break;\n+        }\n+        case GOSSIP_SENDER_UNEQUIP_ALL_TO_GEARBANK:\n+        {\n+            BotEquipResult unequip_all_result = UnEquipAll(player->GetGUID(), true);\n+            if (unequip_all_result != BotEquipResult::BOT_EQUIP_RESULT_OK)\n+            {\n+                if (unequip_all_result == BotEquipResult::BOT_EQUIP_RESULT_FAIL_NO_BANK_SPACE)\n+                {\n+                    uint32 max_size = BotCfg::GetGearBankCapacity();\n+                    uint32 gb_size = BotDataMgr::GetBotBankItemsCount(player->GetGUID());\n+                    uint32 need_count = GetRealEquippedItemsCount();\n+                    ChatHandler ch(player->GetSession());\n+                    ch.PSendSysMessage(bot_ai::LocalizedNpcText(player, BOT_TEXT_NOT_ENOUGH_GEAR_BANK_SPACE).c_str(), need_count, gb_size, max_size);\n+                }\n+                else\n+                    BotWhisper(LocalizedNpcText(player, BOT_TEXT_FAILED), player);\n+            }\n+            else\n+                me->HandleEmoteCommand(EMOTE_ONESHOT_CRY);\n+            break;\n+        }\n+        //autoequips change s5b: AtoEquip item\n+        //base is GOSSIP_SENDER_EQUIP_AUTOEQUIP + 0...1...2... etc.\n+        case GOSSIP_SENDER_EQUIP_AUTOEQUIP_MHAND:     //0 - 1 main hand\n+        case GOSSIP_SENDER_EQUIP_AUTOEQUIP_OHAND:     //1 - 1 off hand\n+        case GOSSIP_SENDER_EQUIP_AUTOEQUIP_RANGED:    //2 - 1 ranged\n+        case GOSSIP_SENDER_EQUIP_AUTOEQUIP_HEAD:      //3 - 1 head\n+        case GOSSIP_SENDER_EQUIP_AUTOEQUIP_SHOULDERS: //4 - 1 shoulders\n+        case GOSSIP_SENDER_EQUIP_AUTOEQUIP_CHEST:     //5 - 1 chest\n+        case GOSSIP_SENDER_EQUIP_AUTOEQUIP_WAIST:     //6 - 1 waist\n+        case GOSSIP_SENDER_EQUIP_AUTOEQUIP_LEGS:      //7 - 1 legs\n+        case GOSSIP_SENDER_EQUIP_AUTOEQUIP_FEET:      //8 - 1 feet\n+        case GOSSIP_SENDER_EQUIP_AUTOEQUIP_WRIST:     //9 - 1 wrist\n+        case GOSSIP_SENDER_EQUIP_AUTOEQUIP_HANDS:     //10 - 1 hands\n+        case GOSSIP_SENDER_EQUIP_AUTOEQUIP_BACK:      //11 - 1 back\n+        case GOSSIP_SENDER_EQUIP_AUTOEQUIP_BODY:      //12 - 1 body\n+        case GOSSIP_SENDER_EQUIP_AUTOEQUIP_FINGER1:   //13 - 1 finger\n+        case GOSSIP_SENDER_EQUIP_AUTOEQUIP_FINGER2:   //14 - 2 finger\n+        case GOSSIP_SENDER_EQUIP_AUTOEQUIP_TRINKET1:  //15 - 1 trinket\n+        case GOSSIP_SENDER_EQUIP_AUTOEQUIP_TRINKET2:  //16 - 2 trinket\n+        case GOSSIP_SENDER_EQUIP_AUTOEQUIP_NECK:      //17 - 1 neck\n+        {\n+            Item* item = nullptr;\n+            uint32 guidLow = action - GOSSIP_ACTION_INFO_DEF;\n+\n+            bool found = false;\n+            for (uint8 i = INVENTORY_SLOT_ITEM_START; i != INVENTORY_SLOT_ITEM_END; ++i)\n+            {\n+                item = player->GetItemByPos(INVENTORY_SLOT_BAG_0, i);\n+                if (item && item->GetGUID().GetCounter() == guidLow)\n+                {\n+                    found = true;\n+                    break;\n+                }\n+            }\n+\n+            if (!found)\n+            {\n+                for (uint8 i = INVENTORY_SLOT_BAG_START; i != INVENTORY_SLOT_BAG_END; ++i)\n+                {\n+                    if (Bag const* pBag = player->GetBagByPos(i))\n+                    {\n+                        for (uint32 j = 0; j != pBag->GetBagSize(); ++j)\n+                        {\n+                            item = player->GetItemByPos(i, j);\n+                            if (item && item->GetGUID().GetCounter() == guidLow)\n+                            {\n+                                found = true;\n+                                break;\n+                            }\n+                        }\n+                    }\n+\n+                    if (found)\n+                        break;\n+                }\n+            }\n+\n+            if (found && _equip(sender - GOSSIP_SENDER_EQUIP_AUTOEQUIP_EQUIP, item, player->GetGUID(), false) == BotEquipResult::BOT_EQUIP_RESULT_OK){}\n+\n+            //break; //no break: update list\n+        }\n+        [[fallthrough]];\n+        case GOSSIP_SENDER_EQUIP_AUTOEQUIP:\n+        {\n+            subMenu = true;\n+\n+            EquipmentInfo const* einfo = BotDataMgr::GetBotEquipmentInfo(me->GetEntry());\n+            std::set<uint32> itemList, idsList;\n+\n+            auto can_equip = [this](Item const* item) {\n+                return std::ranges::any_of(NPCBots::index_array<uint8, BOT_INVENTORY_SIZE>, [=, this](uint8 slot) {\n+                    return _canEquip(item->GetTemplate(), slot, false, item);\n+                });\n+            };\n+\n+            auto try_put_item = [=, &itemList, &idsList](uint8 bag, uint8 bag_slot) {\n+                if (Item const* pItem = player->GetItemByPos(bag, bag_slot))\n+                {\n+                    if (!std::ranges::any_of(einfo->ItemEntry, [=](uint32 eeid) { return eeid == pItem->GetEntry(); }) &&\n+                        can_equip(pItem) && (pItem->GetItemRandomPropertyId() == 0 || !idsList.contains(pItem->GetEntry())))\n+                    {\n+                        itemList.insert(pItem->GetGUID().GetCounter());\n+                        idsList.insert(pItem->GetEntry());\n+                    }\n+                }\n+            };\n+\n+            //1: build list\n+            //1.1: backpack\n+            for (uint8 i = INVENTORY_SLOT_ITEM_START; i != INVENTORY_SLOT_ITEM_END; ++i)\n+                try_put_item(INVENTORY_SLOT_BAG_0, i);\n+\n+            //1.2: other bags\n+            for (uint8 i = INVENTORY_SLOT_BAG_START; i != INVENTORY_SLOT_BAG_END; ++i)\n+                if (Bag const* pBag = player->GetBagByPos(i))\n+                    for (uint32 j = 0; j != pBag->GetBagSize(); ++j)\n+                        try_put_item(i, j);\n+\n+            //2: add gossips\n+            if (itemList.empty())\n+            {\n+                AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_NOTHING_TO_GIVE), 0, GOSSIP_ACTION_INFO_DEF + 1);\n+            }\n+            else\n+            {\n+                uint32 counter = 0;\n+                const uint32 maxcounter = BOT_GOSSIP_MAX_ITEMS - 1; // back\n+                std::ostringstream name;\n+\n+                auto try_put_gossip = [=, &name, &counter, this](uint8 bag, uint8 bag_slot, uint32 guidlow) {\n+                    if (Item const* pItem = player->GetItemByPos(bag, bag_slot); pItem && pItem->GetGUID().GetCounter() == guidlow)\n+                        for (auto slot : NPCBots::index_array<uint8, BOT_INVENTORY_SIZE>)\n+                            if (_canEquip(pItem->GetTemplate(), slot, false, pItem))\n+                            {\n+                                //workaround for double slots\n+                                //if first slot is occupied and second slot is vacant use second slot\n+                                if ((1u << slot) & BOT_SLOT_MASK_FINGER1_OR_TRINKET1)\n+                                    if (_equips[slot] && _canEquip(pItem->GetTemplate(), slot + 1, false, pItem))\n+                                        ++slot;\n+                                _AddItemLink(player, pItem, name);\n+                                if (BotCfg::SendEquipListItems())\n+                                    BotWhisper(name.view(), player);\n+                                AddGossipItemFor(player, GOSSIP_ICON_CHAT, name.str(), GOSSIP_SENDER_EQUIP_AUTOEQUIP_EQUIP + slot, GOSSIP_ACTION_INFO_DEF + guidlow);\n+                                ++counter;\n+                                return true;\n+                            }\n+                    return false;\n+                };\n+\n+                //add items as gossip options\n+                for (std::set<uint32>::const_iterator itr = itemList.begin(); itr != itemList.end() && counter < maxcounter; ++itr)\n+                {\n+                    bool found = false;\n+                    for (uint8 i = INVENTORY_SLOT_ITEM_START; i != INVENTORY_SLOT_ITEM_END; ++i)\n+                    {\n+                        if (try_put_gossip(INVENTORY_SLOT_BAG_0, i, *itr))\n+                        {\n+                            found = true;\n+                            break;\n+                        }\n+                    }\n+\n+                    if (found)\n+                        continue;\n+\n+                    for (uint8 i = INVENTORY_SLOT_BAG_START; i != INVENTORY_SLOT_BAG_END; ++i)\n+                    {\n+                        if (Bag const* pBag = player->GetBagByPos(i))\n+                        {\n+                            for (uint32 j = 0; j != pBag->GetBagSize(); ++j)\n+                            {\n+                                if (try_put_gossip(i, j, *itr))\n+                                {\n+                                    found = true;\n+                                    break;\n+                                }\n+                            }\n+                        }\n+\n+                        if (found)\n+                            break;\n+                    }\n+\n+                    if (found)\n+                        continue;\n+                }\n+            }\n+\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_BACK), GOSSIP_SENDER_EQUIPMENT, GOSSIP_ACTION_INFO_DEF + 2);\n+            break;\n+        }\n+        case GOSSIP_SENDER_EQUIP_RESET: //equips change s4a: reset equipment\n+        {\n+            if (_resetEquipment(action - GOSSIP_ACTION_INFO_DEF, player->GetGUID(), false) != BotEquipResult::BOT_EQUIP_RESULT_OK)\n+                BotWhisper(LocalizedNpcText(player, BOT_TEXT_FAILED), player);\n+            return OnGossipSelect(player, creature, GOSSIP_SENDER_EQUIPMENT, GOSSIP_ACTION_INFO_DEF + 1);\n+        }\n+        case GOSSIP_SENDER_EQUIP_RESET_TO_GEARBANK: //equips change s4a: reset equipment\n+        {\n+            BotEquipResult reset_result = _resetEquipment(action - GOSSIP_ACTION_INFO_DEF, player->GetGUID(), true);\n+            if (reset_result != BotEquipResult::BOT_EQUIP_RESULT_OK)\n+            {\n+                if (reset_result == BotEquipResult::BOT_EQUIP_RESULT_FAIL_NO_BANK_SPACE)\n+                {\n+                    uint32 max_size = BotCfg::GetGearBankCapacity();\n+                    uint32 gb_size = BotDataMgr::GetBotBankItemsCount(player->GetGUID());\n+                    ChatHandler ch(player->GetSession());\n+                    ch.PSendSysMessage(bot_ai::LocalizedNpcText(player, BOT_TEXT_NOT_ENOUGH_GEAR_BANK_SPACE).c_str(), uint32(1), gb_size, max_size);\n+                }\n+                else\n+                    BotWhisper(LocalizedNpcText(player, BOT_TEXT_FAILED), player);\n+            }\n+            return OnGossipSelect(player, creature, GOSSIP_SENDER_EQUIPMENT, GOSSIP_ACTION_INFO_DEF + 1);\n+        }\n+        //equips change s4b: Equip item\n+        //base is GOSSIP_SENDER_EQUIP + 0...1...2... etc.\n+        case GOSSIP_SENDER_EQUIP_MHAND:     //0 - 1 main hand\n+        case GOSSIP_SENDER_EQUIP_OHAND:     //1 - 1 off hand\n+        case GOSSIP_SENDER_EQUIP_RANGED:    //2 - 1 ranged\n+        case GOSSIP_SENDER_EQUIP_HEAD:      //3 - 1 head\n+        case GOSSIP_SENDER_EQUIP_SHOULDERS: //4 - 1 shoulders\n+        case GOSSIP_SENDER_EQUIP_CHEST:     //5 - 1 chest\n+        case GOSSIP_SENDER_EQUIP_WAIST:     //6 - 1 waist\n+        case GOSSIP_SENDER_EQUIP_LEGS:      //7 - 1 legs\n+        case GOSSIP_SENDER_EQUIP_FEET:      //8 - 1 feet\n+        case GOSSIP_SENDER_EQUIP_WRIST:     //9 - 1 wrist\n+        case GOSSIP_SENDER_EQUIP_HANDS:     //10 - 1 hands\n+        case GOSSIP_SENDER_EQUIP_BACK:      //11 - 1 back\n+        case GOSSIP_SENDER_EQUIP_BODY:      //12 - 1 body\n+        case GOSSIP_SENDER_EQUIP_FINGER1:   //13 - 1 finger\n+        case GOSSIP_SENDER_EQUIP_FINGER2:   //14 - 1 finger\n+        case GOSSIP_SENDER_EQUIP_TRINKET1:  //15 - 1 trinket\n+        case GOSSIP_SENDER_EQUIP_TRINKET2:  //16 - 1 trinket\n+        case GOSSIP_SENDER_EQUIP_NECK:      //17 - 1 neck\n+        {\n+            Item* item = nullptr;\n+            uint32 guidLow = action - GOSSIP_ACTION_INFO_DEF;\n+\n+            bool found = false;\n+            for (uint8 i = INVENTORY_SLOT_ITEM_START; i != INVENTORY_SLOT_ITEM_END; ++i)\n+            {\n+                item = player->GetItemByPos(INVENTORY_SLOT_BAG_0, i);\n+                if (item && item->GetGUID().GetCounter() == guidLow)\n+                {\n+                    found = true;\n+                    break;\n+                }\n+            }\n+\n+            if (!found)\n+            {\n+                for (uint8 i = INVENTORY_SLOT_BAG_START; i != INVENTORY_SLOT_BAG_END; ++i)\n+                {\n+                    if (Bag const* pBag = player->GetBagByPos(i))\n+                    {\n+                        for (uint32 j = 0; j != pBag->GetBagSize(); ++j)\n+                        {\n+                            item = player->GetItemByPos(i, j);\n+                            if (item && item->GetGUID().GetCounter() == guidLow)\n+                            {\n+                                found = true;\n+                                break;\n+                            }\n+                        }\n+                    }\n+\n+                    if (found)\n+                        break;\n+                }\n+            }\n+\n+            if (found && _equip(sender - GOSSIP_SENDER_EQUIP, item, player->GetGUID(), false) == BotEquipResult::BOT_EQUIP_RESULT_OK){}\n+            return OnGossipSelect(player, creature, GOSSIP_SENDER_EQUIPMENT, GOSSIP_ACTION_INFO_DEF + 1);\n+        }\n+        case GOSSIP_SENDER_EQUIPMENT_BANK_DEPOSIT_ITEM:\n+        {\n+            ObjectGuid::LowType itemGuidLow = action - GOSSIP_ACTION_INFO_DEF;\n+            Item* item = player->GetItemByGuid(ObjectGuid::Create<HighGuid::Item>(itemGuidLow));\n+            if (!item)\n+            {\n+                BOT_LOG_ERROR(\"npcbots\", \"GOSSIP_SENDER_EQUIPMENT_BANK_DEPOSIT_ITEM: item {} not found on player {}! Cheater?\",\n+                    itemGuidLow, player->GetName().c_str());\n+                break;\n+            }\n+\n+            if (!BotDataMgr::CanDepositBotBankItemsCount(player->GetGUID(), 1))\n+            {\n+                BotWhisper(LocalizedNpcText(player, BOT_TEXT_BANK_IS_FULL), player);\n+                return OnGossipSelect(player, me, GOSSIP_SENDER_EQUIPMENT_BANK_MENU, action);\n+            }\n+\n+            BotDataMgr::DepositBotBankItem(player->GetGUID(), item);\n+            player->MoveItemFromInventory(item->GetBagSlot(), item->GetSlot(), true);\n+\n+            action = GOSSIP_ACTION_INFO_DEF; //return to page 0\n+            //break;\n+            [[fallthrough]];\n+        }\n+        case GOSSIP_SENDER_EQUIPMENT_BANK_DEPOSIT:\n+        {\n+            if (!BotDataMgr::CanDepositBotBankItemsCount(player->GetGUID(), 1))\n+            {\n+                BotWhisper(LocalizedNpcText(player, BOT_TEXT_BANK_IS_FULL), player);\n+                return OnGossipSelect(player, me, GOSSIP_SENDER_EQUIPMENT_BANK_MENU, action);\n+            }\n+\n+            subMenu = true;\n+            uint32 page = action - GOSSIP_ACTION_INFO_DEF;\n+            uint32 items_per_page = BOT_GOSSIP_MAX_ITEMS - 3; // prev page, back, next page\n+            uint32 counter = 0;\n+            uint32 can_add_count = 0;\n+            uint32 k = 0;\n+\n+            static const auto is_bot_equippable_item = [](ItemTemplate const* proto) {\n+                switch (proto->InventoryType)\n+                {\n+                    case INVTYPE_NON_EQUIP: case INVTYPE_BAG: case INVTYPE_TABARD: case INVTYPE_AMMO: case INVTYPE_QUIVER:\n+                        return false;\n+                    default:\n+                        return true;\n+                }\n+            };\n+\n+            //backpack\n+            for (uint8 i = INVENTORY_SLOT_ITEM_START; i != INVENTORY_SLOT_ITEM_END && can_add_count <= items_per_page; ++i)\n+            {\n+                if (Item const* pItem = player->GetItemByPos(INVENTORY_SLOT_BAG_0, i))\n+                {\n+                    if (is_bot_equippable_item(pItem->GetTemplate()))\n+                    {\n+                        ++k;\n+                        if (k <= page * items_per_page)\n+                            continue;\n+                        ++can_add_count;\n+                        if (counter >= items_per_page)\n+                            continue;\n+                        ++counter;\n+                        std::ostringstream name;\n+                        _AddItemLink(player, pItem, name);\n+                        AddGossipItemFor(player, GOSSIP_ICON_CHAT, name.str(), GOSSIP_SENDER_EQUIPMENT_BANK_DEPOSIT_ITEM, GOSSIP_ACTION_INFO_DEF + pItem->GetGUID().GetCounter());\n+                    }\n+                }\n+            }\n+\n+            //other bags\n+            for (uint8 i = INVENTORY_SLOT_BAG_START; i != INVENTORY_SLOT_BAG_END && can_add_count <= items_per_page; ++i)\n+            {\n+                Bag const* pBag = player->GetBagByPos(i);\n+                if (!pBag)\n+                    continue;\n+                for (uint32 j = 0; j != pBag->GetBagSize() && can_add_count <= items_per_page; ++j)\n+                {\n+                    Item const* pItem = player->GetItemByPos(i, j);\n+                    if (!pItem)\n+                        continue;\n+                    if (is_bot_equippable_item(pItem->GetTemplate()))\n+                    {\n+                        ++k;\n+                        if (k <= page * items_per_page)\n+                            continue;\n+                        ++can_add_count;\n+                        if (counter >= items_per_page)\n+                            continue;\n+                        ++counter;\n+                        std::ostringstream name;\n+                        _AddItemLink(player, pItem, name);\n+                        AddGossipItemFor(player, GOSSIP_ICON_CHAT, name.str(), GOSSIP_SENDER_EQUIPMENT_BANK_DEPOSIT_ITEM, GOSSIP_ACTION_INFO_DEF + pItem->GetGUID().GetCounter());\n+                    }\n+                }\n+            }\n+\n+            if (page > 0)\n+                AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_PREVIOUS_PAGE), GOSSIP_SENDER_EQUIPMENT_BANK_DEPOSIT, action - 1);\n+            if (can_add_count > items_per_page)\n+                AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_NEXT_PAGE), GOSSIP_SENDER_EQUIPMENT_BANK_DEPOSIT, action + 1);\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_BACK), GOSSIP_SENDER_EQUIPMENT_BANK_MENU, GOSSIP_ACTION_INFO_DEF + 1);\n+            break;\n+        }\n+        case GOSSIP_SENDER_EQUIPMENT_BANK_WITHDRAW_ITEM:\n+        {\n+            ObjectGuid::LowType itemGuidLow = action - GOSSIP_ACTION_INFO_DEF;\n+\n+            //BotBankItemContainer const& botBankItems = BotDataMgr::GetBotBankItems(player->GetGUID());\n+            //Item const* item = std::ranges::find_if(botBankItems, [guidLow = itemGuidLow](Item const* item) {\n+            //    return item->GetGUID().GetCounter() == guidLow;\n+            //});\n+            Item* item = BotDataMgr::WithdrawBotBankItem(player->GetGUID(), itemGuidLow);\n+            if (!item)\n+            {\n+                BOT_LOG_ERROR(\"npcbots\", \"GOSSIP_SENDER_EQUIPMENT_BANK_WITHDRAW_ITEM: item {} not found on player {}! Cheater?\",\n+                    itemGuidLow, player->GetName().c_str());\n+                break;\n+            }\n+\n+            ItemPosCountVec dest;\n+            uint32 no_space = 0;\n+            InventoryResult msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, item->GetEntry(), 1, &no_space);\n+            if (msg != EQUIP_ERR_OK)\n+            {\n+                std::ostringstream istr;\n+                _AddItemLink(player, item, istr, false);\n+                ChatHandler ch(player->GetSession());\n+                ch.PSendSysMessage(LocalizedNpcText(player, BOT_TEXT_CANT_UNEQUIP_MAILING).c_str(), istr.view().data());\n+\n+                item->SetOwnerGUID(player->GetGUID());\n+\n+                CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();\n+                item->FSetState(ITEM_CHANGED);\n+                item->SaveToDB(trans);\n+                MailDraft(istr.str(), \"\").AddItem(item).SendMailTo(trans, MailReceiver(player), MailSender(me));\n+                CharacterDatabase.CommitTransaction(trans);\n+\n+                player->SendEquipError(msg, nullptr, nullptr, item->GetEntry());\n+            }\n+            else\n+            {\n+                Item* pItem = player->StoreItem(dest, item, true);\n+                player->SendNewItem(pItem, 1, true, false, false);\n+            }\n+\n+            action = GOSSIP_ACTION_INFO_DEF; //return to page 0\n+            //break;\n+            [[fallthrough]];\n+        }\n+        case GOSSIP_SENDER_EQUIPMENT_BANK_WITHDRAW:\n+        {\n+            uint32 page = action - GOSSIP_ACTION_INFO_DEF;\n+            uint32 items_per_page = BOT_GOSSIP_MAX_ITEMS - 3; // page prev, page next, back\n+            uint32 counter = 0;\n+\n+            BotBankItemContainer const* botBankItems = BotDataMgr::GetBotBankItems(player->GetGUID());\n+            if (!botBankItems || botBankItems->empty())\n+            {\n+                BotWhisper(LocalizedNpcText(player, BOT_TEXT_BANK_IS_EMPTY), player);\n+                return OnGossipSelect(player, me, GOSSIP_SENDER_EQUIPMENT_BANK_MENU, action);\n+            }\n+\n+            subMenu = true;\n+\n+            BotBankItemContainer::const_iterator bcit = botBankItems->cbegin();\n+            size_t i = 0;\n+            for (; i < size_t(page * items_per_page) && i < botBankItems->size(); ++i, ++bcit); //advance to selected page\n+            for (; i < botBankItems->size() && counter < items_per_page; ++i, ++bcit)\n+            {\n+                Item const* item = *bcit;\n+                ++counter;\n+                std::ostringstream name;\n+                _AddItemLink(player, item, name);\n+                ItemTemplate const* proto = item->GetTemplate();\n+                uint8 slot = BOT_SLOT_BODY;\n+                if (GetBotClass() == BOT_CLASS_HUNTER)\n+                {\n+                    if (_canEquip(proto, BOT_SLOT_RANGED, true))\n+                        slot = BOT_SLOT_RANGED;\n+                    else if (_canEquip(proto, BOT_SLOT_MAINHAND, true))\n+                        slot = BOT_SLOT_MAINHAND;\n+                    else if (_canEquip(proto, BOT_SLOT_OFFHAND, true))\n+                        slot = BOT_SLOT_OFFHAND;\n+                }\n+                else if (GetBotClass() == BOT_CLASS_WARRIOR && _canEquip(proto, BOT_SLOT_MAINHAND, true))\n+                    slot = BOT_SLOT_MAINHAND;\n+\n+                name << \" GS: \" << uint32(CalculateItemGearScore(proto, me->GetEntry(), me->GetLevel(), GetBotClass(), GetSpec(), slot));\n+                AddGossipItemFor(player, GOSSIP_ICON_CHAT, name.str(), GOSSIP_SENDER_EQUIPMENT_BANK_WITHDRAW_ITEM, GOSSIP_ACTION_INFO_DEF + item->GetGUID().GetCounter());\n+            }\n+\n+            if (page > 0)\n+                AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_PREVIOUS_PAGE), GOSSIP_SENDER_EQUIPMENT_BANK_WITHDRAW, action - 1);\n+            if (uint32(botBankItems->size()) > (page + 1) * items_per_page)\n+                AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_NEXT_PAGE), GOSSIP_SENDER_EQUIPMENT_BANK_WITHDRAW, action + 1);\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_BACK), GOSSIP_SENDER_EQUIPMENT_BANK_MENU, GOSSIP_ACTION_INFO_DEF + 1);\n+            break;\n+        }\n+        case GOSSIP_SENDER_EQUIPMENT_BANK_SET_EQUIP:\n+        {\n+            uint32 set_id = uint8(action - GOSSIP_ACTION_INFO_DEF);\n+            NpcBotItemSet const* item_set = BotDataMgr::GetBotItemSet(player->GetGUID(), set_id);\n+            EquipmentInfo const* einfo = BotDataMgr::GetBotEquipmentInfo(me->GetEntry());\n+            BotBankItemContainer const* botBankItems = BotDataMgr::GetBotBankItems(player->GetGUID());\n+            auto const& itemset_items = item_set->items;\n+            uint8 unequip_count = GetRealEquippedItemsCount();\n+            uint8 equip_count = item_set->items_count();\n+\n+            std::array<Item*, BOT_INVENTORY_SIZE> items_to_equip{};\n+            std::array<Item*, BOT_INVENTORY_SIZE> items_to_unequip{};\n+\n+            bool all_same = true;\n+            std::array<bool, BOT_INVENTORY_SIZE> same_item_id{};\n+            for (uint8 i : NPCBots::index_array<uint8, BOT_INVENTORY_SIZE>)\n+            {\n+                Item const* item = _equips[i];\n+                same_item_id[i] = (item && (i > BOT_SLOT_RANGED || einfo->ItemEntry[i] != item->GetEntry())) ? (item->GetEntry() == itemset_items[i]) : !itemset_items[i];\n+                if (!same_item_id[i])\n+                    all_same = false;\n+            }\n+\n+            BotEquipResult check_res;\n+\n+            if (all_same)\n+                check_res = BotEquipResult::BOT_EQUIP_RESULT_OK;\n+            else if (!botBankItems)\n+                check_res = BotEquipResult::BOT_EQUIP_RESULT_FAIL_NO_ITEM;\n+            else if (BotCfg::GetGearBankCapacity() && int32(unequip_count - equip_count) > int32(BotCfg::GetGearBankCapacity() - botBankItems->size()))\n+                check_res = BotEquipResult::BOT_EQUIP_RESULT_FAIL_NO_BANK_SPACE;\n+            else\n+            {\n+                check_res = BotEquipResult::BOT_EQUIP_RESULT_OK;\n+                std::map<uint32 /*item_id*/, std::set<Item*>> available_items;\n+                for (Item* bitem : *botBankItems)\n+                    available_items[bitem->GetEntry()].insert(bitem);\n+\n+                bool weapons_checked = false;\n+                for (uint8 i : NPCBots::index_array<uint8, BOT_INVENTORY_SIZE>)\n+                {\n+                    if (check_res != BotEquipResult::BOT_EQUIP_RESULT_OK)\n+                        break;\n+\n+                    Item* item = _equips[i];\n+                    if (!same_item_id[i])\n+                    {\n+                        if (itemset_items[i])\n+                        {\n+                            ItemTemplate const* set_item_proto = sObjectMgr->GetItemTemplate(itemset_items[i]); // validated at load\n+                            if (!available_items.contains(itemset_items[i]) || available_items.at(itemset_items[i]).empty())\n+                                check_res = BotEquipResult::BOT_EQUIP_RESULT_FAIL_NO_ITEM;\n+                            else if (!_canEquip(set_item_proto, i, true, *available_items.at(itemset_items[i]).cbegin(), true))\n+                                check_res = BotEquipResult::BOT_EQUIP_RESULT_FAIL_CANT_EQUIP;\n+                            else\n+                            {\n+                                if (!weapons_checked && i <= BOT_SLOT_OFFHAND && itemset_items[BOT_SLOT_MAINHAND] && itemset_items[BOT_SLOT_OFFHAND])\n+                                {\n+                                    weapons_checked = true;\n+                                    ItemTemplate const* mh_proto = (i == BOT_SLOT_MAINHAND) ? set_item_proto : sObjectMgr->GetItemTemplate(itemset_items[BOT_SLOT_MAINHAND]);\n+                                    ItemTemplate const* oh_proto = (i == BOT_SLOT_OFFHAND) ? set_item_proto : sObjectMgr->GetItemTemplate(itemset_items[BOT_SLOT_OFFHAND]);\n+                                    if (!_canCombineWeapons(mh_proto, oh_proto))\n+                                        check_res = BotEquipResult::BOT_EQUIP_RESULT_FAIL_ITEM_CONFLICT;\n+                                }\n+                                auto ait = available_items.at(itemset_items[i]).begin();\n+                                items_to_equip[i] = *ait;\n+                                available_items.at(itemset_items[i]).erase(ait);\n+                            }\n+                        }\n+                        if (item && !items_to_equip[i])\n+                            items_to_unequip[i] = item;\n+                    }\n+                }\n+            }\n+\n+            if (all_same)\n+                me->HandleEmoteCommand(EMOTE_ONESHOT_CHICKEN);\n+            else if (check_res != BotEquipResult::BOT_EQUIP_RESULT_OK)\n+            {\n+                std::string err_code = Bcore::ToString(uint32(AsUnderlyingType(check_res)));\n+                BotWhisper(LocalizedNpcText(player, BOT_TEXT_FAILED) + \" (\" + err_code + \")\");\n+            }\n+            else\n+            {\n+                BotEquipResult all_res = BotEquipResult::BOT_EQUIP_RESULT_OK;\n+                for (uint8 i : NPCBots::index_array<uint8, BOT_INVENTORY_SIZE>)\n+                {\n+                    if (Item* item = items_to_equip[i])\n+                    {\n+                        BotEquipResult res = _equip(i, item, player->GetGUID(), true, true);\n+                        if (res != BotEquipResult::BOT_EQUIP_RESULT_OK)\n+                        {\n+                            all_res = res;\n+                            std::string err_code = Bcore::ToString(uint32(AsUnderlyingType(res)));\n+                            BotWhisper(LocalizedNpcText(player, BOT_TEXT_FAILED) + \" +\" + Bcore::ToString(uint32(i)) + \" (\" + err_code + \")\");\n+                            break;\n+                        }\n+                    }\n+                    if (items_to_unequip[i])\n+                    {\n+                        BotEquipResult res = _unequip(i, player->GetGUID(), true);\n+                        if (res != BotEquipResult::BOT_EQUIP_RESULT_OK)\n+                        {\n+                            std::string err_code = Bcore::ToString(uint32(AsUnderlyingType(res)));\n+                            BotWhisper(LocalizedNpcText(player, BOT_TEXT_FAILED) + \" -\" + Bcore::ToString(uint32(i)) + \" (\" + err_code + \")\");\n+                            break;\n+                        }\n+                    }\n+                }\n+                if (all_res == BotEquipResult::BOT_EQUIP_RESULT_OK)\n+                    BotWhisper(LocalizedNpcText(player, BOT_TEXT_EQUIPPED) + \" '\" + item_set->name + \"'!\");\n+            }\n+\n+            return OnGossipSelect(player, creature, GOSSIP_SENDER_EQUIPMENT_BANK_SETS_MENU, action);\n+        }\n+        case GOSSIP_SENDER_EQUIPMENT_BANK_SET_DELETE:\n+        {\n+            uint32 set_id = uint8(action - GOSSIP_ACTION_INFO_DEF);\n+\n+            BotDataMgr::DeleteBotItemSet(player->GetGUID(), static_cast<uint8>(set_id));\n+\n+            return OnGossipSelect(player, creature, GOSSIP_SENDER_EQUIPMENT_BANK_SETS_MENU, action);\n+        }\n+        case GOSSIP_SENDER_EQUIPMENT_BANK_MENU:\n+        {\n+            subMenu = true;\n+\n+            AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_DEPOSIT_ITEMS), GOSSIP_SENDER_EQUIPMENT_BANK_DEPOSIT, GOSSIP_ACTION_INFO_DEF + 0);\n+            AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_WITHDRAW_ITEMS), GOSSIP_SENDER_EQUIPMENT_BANK_WITHDRAW, GOSSIP_ACTION_INFO_DEF + 0);\n+            if (BotCfg::GetGearBankEquipmentSetsCount() > 0)\n+                AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_EQUIPMENT_SETS) + \"...\", GOSSIP_SENDER_EQUIPMENT_BANK_SETS_MENU, GOSSIP_ACTION_INFO_DEF + 0);\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_BACK), GOSSIP_SENDER_EQUIPMENT, GOSSIP_ACTION_INFO_DEF + 1);\n+            break;\n+        }\n+        case GOSSIP_SENDER_EQUIPMENT_BANK_SET_MENU_ITEM:\n+        {\n+            uint32 set_slot_packed = action - GOSSIP_ACTION_INFO_DEF;\n+            uint8 set_id = PAIR32_HIPART(set_slot_packed);\n+            uint8 slot = PAIR32_LOPART(set_slot_packed);\n+\n+            NpcBotItemSet const* itemSet = BotDataMgr::GetBotItemSet(player->GetGUID(), set_id);\n+            BotBankItemContainer const* botBankItems = BotDataMgr::GetBotBankItems(player->GetGUID());\n+\n+            uint32 item_id = itemSet->items[slot];\n+\n+            std::ostringstream msg;\n+            Item const* item = (_equips[slot] && _equips[slot]->GetEntry() == item_id) ? _equips[slot] : nullptr;\n+            if (!item && botBankItems)\n+            {\n+                BotBankItemContainer::const_iterator cit = std::ranges::find_if(*botBankItems, [=](Item const* item) { return item->GetEntry() == item_id; });\n+                if (cit != botBankItems->cend())\n+                    item = *cit;\n+            }\n+            if (item)\n+                _AddItemLink(player, item, msg);\n+            else\n+            {\n+                ItemTemplate const* proto = sObjectMgr->GetItemTemplate(item_id);\n+                _AddItemTemplateLink(player, proto, msg);\n+                msg << \" (\" << LocalizedNpcText(player, BOT_TEXT_MISSING) << ')';\n+            }\n+\n+            BotWhisper(msg.view(), player);\n+            //break;\n+            action = GOSSIP_ACTION_INFO_DEF + set_id;\n+        }\n+        [[fallthrough]];\n+        case GOSSIP_SENDER_EQUIPMENT_BANK_SET_MENU:\n+        {\n+            subMenu = true;\n+\n+            uint32 set_id = action - GOSSIP_ACTION_INFO_DEF;\n+            NpcBotItemSet const* itemSet = BotDataMgr::GetBotItemSet(player->GetGUID(), (uint8)set_id);\n+            BotBankItemContainer const* botBankItems = BotDataMgr::GetBotBankItems(player->GetGUID());\n+\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, \"<\" + LocalizedNpcText(player, BOT_TEXT_EQUIP) + \">\", GOSSIP_SENDER_EQUIPMENT_BANK_SET_EQUIP,\n+                GOSSIP_ACTION_INFO_DEF + set_id, LocalizedNpcText(player, BOT_TEXT_EQUIP) + \" '\" + itemSet->name + \"'?\", 0, false);\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, \"<\" + LocalizedNpcText(player, BOT_TEXT_DELETE) + \">\", GOSSIP_SENDER_EQUIPMENT_BANK_SET_DELETE,\n+                GOSSIP_ACTION_INFO_DEF + set_id, LocalizedNpcText(player, BOT_TEXT_DELETE) + \" '\" + itemSet->name + \"'?\", 0, false);\n+\n+            //list items\n+            float gs_total = 0.f;\n+            std::ostringstream ss;\n+            for (uint8 i : NPCBots::index_array<uint8, BOT_INVENTORY_SIZE>)\n+            {\n+                uint32 item_id = itemSet->items[i];\n+                if (item_id)\n+                {\n+                    ItemTemplate const* proto = sObjectMgr->GetItemTemplate(item_id);\n+                    GossipOptionIcon si_icon = GOSSIP_ICON_CHAT;\n+                    Item const* item = (_equips[i] && _equips[i]->GetEntry() == item_id) ? _equips[i] : nullptr;\n+                    if (!item && botBankItems)\n+                    {\n+                        BotBankItemContainer::const_iterator cit = std::ranges::find_if(*botBankItems, [=](Item const* item) { return item->GetEntry() == item_id; });\n+                        if (cit != botBankItems->cend())\n+                            item = *cit;\n+                    }\n+                    if (item)\n+                    {\n+                        _AddItemLink(player, item, ss);\n+                        float item_gs = CalculateItemGearScore(proto, me->GetEntry(), me->GetLevel(), GetBotClass(), GetSpec(), i);\n+                        gs_total += item_gs;\n+                        ss << \" GS: \" << uint32(item_gs);\n+                    }\n+                    else\n+                    {\n+                        si_icon = GOSSIP_ICON_BATTLE;\n+                        _AddItemTemplateLink(player, proto, ss);\n+                        ss << \" (\" << LocalizedNpcText(player, BOT_TEXT_MISSING) << ')';\n+                    }\n+                    uint32 set_slot_packed = MAKE_PAIR32(i, set_id);\n+                    AddGossipItemFor(player, si_icon, ss.str(), GOSSIP_SENDER_EQUIPMENT_BANK_SET_MENU_ITEM, GOSSIP_ACTION_INFO_DEF + set_slot_packed);\n+                    ss.str(\"\");\n+                }\n+            }\n+\n+            ss << \"GS: \" << uint32(gs_total);\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, ss.str(), GOSSIP_SENDER_EQUIPMENT_BANK_SET_MENU, action);\n+\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_BACK), GOSSIP_SENDER_EQUIPMENT_BANK_SETS_MENU, GOSSIP_ACTION_INFO_DEF + 1);\n+            break;\n+        }\n+        case GOSSIP_SENDER_EQUIPMENT_BANK_SETS_MENU:\n+        {\n+            subMenu = true;\n+\n+            if (BotDataMgr::GetBotItemSetsCount(player->GetGUID()) < BotCfg::GetGearBankEquipmentSetsCount())\n+                AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_CREATE) + \"...\", GOSSIP_SENDER_EQUIPMENT_BANK_SET_CREATE, GOSSIP_ACTION_INFO_DEF + 0, \"\", 0, true);\n+\n+            //list existing sets\n+            if (BotItemSetsArray const* itemSets = BotDataMgr::GetBotItemSets(player->GetGUID()))\n+            {\n+                for (uint8 i : NPCBots::index_array<uint8, MAX_BOT_EQUIPMENT_SETS>)\n+                {\n+                    NpcBotItemSet const& itemSet = itemSets->at(i);\n+                    if (!!itemSet)\n+                        AddGossipItemFor(player, GOSSIP_ICON_TALK, itemSet.name, GOSSIP_SENDER_EQUIPMENT_BANK_SET_MENU, GOSSIP_ACTION_INFO_DEF + uint32(i));\n+                }\n+            }\n+\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_BACK), GOSSIP_SENDER_EQUIPMENT_BANK_MENU, GOSSIP_ACTION_INFO_DEF + 1);\n+            break;\n+        }\n+        case GOSSIP_SENDER_ROLES_MAIN_TOGGLE: //ROLES 2: set/unset\n+        {\n+            ToggleRole(action - GOSSIP_ACTION_INFO_DEF, false);\n+\n+            [[fallthrough]];\n+            //break;\n+        }\n+        case GOSSIP_SENDER_ROLES_MAIN: //ROLES 1: list\n+        {\n+            subMenu = true;\n+\n+            if (IsHumanoidClass(_botclass))\n+                AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_GATHERING) + \"...\", GOSSIP_SENDER_ROLES_GATHERING, GOSSIP_ACTION_INFO_DEF + 1);\n+            AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_LOOTING) + \"...\", GOSSIP_SENDER_ROLES_LOOTING, GOSSIP_ACTION_INFO_DEF + 2);\n+\n+            uint32 role = BOT_ROLE_TANK;\n+            for (; role != BOT_MAX_ROLE; role <<= 1)\n+            {\n+                if (!(role & BOT_ROLE_MASK_MAIN)) //hidden\n+                    continue;\n+                if (role == BOT_ROLE_HEAL && !IsHealingClass(_botclass))\n+                    continue;\n+\n+                AddGossipItemFor(player, GetRoleIcon(role), LocalizedNpcText(player, GetRoleString(role)), GOSSIP_SENDER_ROLES_MAIN_TOGGLE, GOSSIP_ACTION_INFO_DEF + role);\n+            }\n+\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_BACK), 1, GOSSIP_ACTION_INFO_DEF + 1);\n+\n+            break;\n+        }\n+        case GOSSIP_SENDER_ROLES_GATHERING_TOGGLE:\n+        {\n+            ToggleRole(action - GOSSIP_ACTION_INFO_DEF, false);\n+\n+            [[fallthrough]];\n+            //break;\n+        }\n+        case GOSSIP_SENDER_ROLES_GATHERING:\n+        {\n+            subMenu = true;\n+\n+            uint32 role = BOT_ROLE_GATHERING_MINING;\n+            for (; role != BOT_MAX_ROLE; role <<= 1)\n+            {\n+                if (!(role & BOT_ROLE_MASK_GATHERING)) //hidden\n+                    continue;\n+\n+                AddGossipItemFor(player, GetRoleIcon(role), LocalizedNpcText(player, GetRoleString(role)), GOSSIP_SENDER_ROLES_GATHERING_TOGGLE, GOSSIP_ACTION_INFO_DEF + role);\n+            }\n+\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_BACK), GOSSIP_SENDER_ROLES_MAIN, GOSSIP_ACTION_INFO_DEF + 1);\n+\n+            break;\n+        }\n+        case GOSSIP_SENDER_ROLES_LOOTING_TOGGLE:\n+        {\n+            ToggleRole(action - GOSSIP_ACTION_INFO_DEF, false);\n+\n+            [[fallthrough]];\n+            //break;\n+        }\n+        case GOSSIP_SENDER_ROLES_LOOTING:\n+        {\n+            subMenu = true;\n+\n+            uint32 role = BOT_ROLE_AUTOLOOT;\n+            for (; role != BOT_MAX_ROLE; role <<= 1)\n+            {\n+                if (!(role & (BOT_ROLE_AUTOLOOT | BOT_ROLE_MASK_LOOTING)))\n+                    continue;\n+\n+                AddGossipItemFor(player, GetRoleIcon(role), LocalizedNpcText(player, GetRoleString(role)), GOSSIP_SENDER_ROLES_LOOTING_TOGGLE, GOSSIP_ACTION_INFO_DEF + role);\n+            }\n+\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_BACK), GOSSIP_SENDER_ROLES_MAIN, GOSSIP_ACTION_INFO_DEF + 1);\n+\n+            break;\n+        }\n+        case GOSSIP_SENDER_ABILITIES_USE:\n+        {\n+            if (uint32 basespell = action - GOSSIP_ACTION_INFO_DEF)\n+                //if (CheckBotCast(me, basespell, me->GetBotClass()) == SPELL_CAST_OK)\n+                    if (IsSpellReady(basespell, lastdiff, true))\n+                        doCast(player, GetSpell(basespell));\n+\n+            //break;\n+            action = GOSSIP_ACTION_INFO_DEF;\n+            [[fallthrough]];\n+        }\n+        case GOSSIP_SENDER_ABILITIES:\n+        {\n+            subMenu = true;\n+\n+            if (HasAbilitiesSpecifics())\n+                AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_ABILITIES_STATUS) + \"...\", GOSSIP_SENDER_ABILITIES_SPECIFICS_LIST, GOSSIP_ACTION_INFO_DEF + 1);\n+            AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_ALLOWED_ABILITIES) + \"...\", GOSSIP_SENDER_ABILITIES_USAGE_LIST, GOSSIP_ACTION_INFO_DEF + 2);\n+\n+            for (auto const& [rank1_id, spell] : _spells)\n+            {\n+                if (!CanUseManually(rank1_id)) continue;\n+                if (!IsSpellReady(rank1_id, lastdiff, false)) continue;\n+\n+                std::ostringstream name;\n+                name << LocalizedNpcText(player, BOT_TEXT_USE_);\n+                _AddSpellLink(player, sSpellMgr->AssertSpellInfo(rank1_id), name);\n+                AddGossipItemFor(player, GOSSIP_ICON_TRAINER, name.str(), GOSSIP_SENDER_ABILITIES_USE, GOSSIP_ACTION_INFO_DEF + rank1_id);\n+            }\n+\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_UPDATE), sender, action);\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_BACK), 1, GOSSIP_ACTION_INFO_DEF + 2);\n+\n+            break;\n+        }\n+        case GOSSIP_SENDER_ABILITIES_SPECIFICS_LIST:\n+        {\n+            subMenu = true;\n+\n+            std::list<std::string> specList;\n+            FillAbilitiesSpecifics(player, specList);\n+            for (std::string const& spec : specList)\n+                AddGossipItemFor(player, GOSSIP_ICON_CHAT, spec, GOSSIP_SENDER_ABILITIES, GOSSIP_ACTION_INFO_DEF);\n+\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_BACK), GOSSIP_SENDER_ABILITIES, GOSSIP_ACTION_INFO_DEF + 1);\n+\n+            break;\n+        }\n+        case GOSSIP_SENDER_ABILITIES_USAGE_TOGGLE_DAMAGE:\n+        case GOSSIP_SENDER_ABILITIES_USAGE_TOGGLE_CC:\n+        case GOSSIP_SENDER_ABILITIES_USAGE_TOGGLE_HEAL:\n+        case GOSSIP_SENDER_ABILITIES_USAGE_TOGGLE_SUPPORT:\n+        {\n+            uint32 basespell = action - GOSSIP_ACTION_INFO_DEF;\n+            for (auto& [rank1_id, spell] : _spells)\n+            {\n+                if (rank1_id == basespell)\n+                {\n+                    spell.enabled = !spell.enabled;\n+                    if (spell.enabled)\n+                        _botData->disabled_spells.erase(basespell);\n+                    else\n+                        _botData->disabled_spells.insert(basespell);\n+\n+                    _saveDisabledSpells = true;\n+                    break;\n+                }\n+            }\n+\n+            uint32 newSender;\n+            switch (sender)\n+            {\n+                case GOSSIP_SENDER_ABILITIES_USAGE_TOGGLE_DAMAGE:\n+                    newSender = GOSSIP_SENDER_ABILITIES_USAGE_LIST_DAMAGE;  break;\n+                case GOSSIP_SENDER_ABILITIES_USAGE_TOGGLE_CC:\n+                    newSender = GOSSIP_SENDER_ABILITIES_USAGE_LIST_CC;      break;\n+                case GOSSIP_SENDER_ABILITIES_USAGE_TOGGLE_HEAL:\n+                    newSender = GOSSIP_SENDER_ABILITIES_USAGE_LIST_HEAL;    break;\n+                case GOSSIP_SENDER_ABILITIES_USAGE_TOGGLE_SUPPORT:\n+                    newSender = GOSSIP_SENDER_ABILITIES_USAGE_LIST_SUPPORT; break;\n+                default:\n+                    ABORT();\n+            }\n+            sender = newSender;\n+        }\n+        [[fallthrough]];\n+        case GOSSIP_SENDER_ABILITIES_USAGE_LIST_DAMAGE:\n+        case GOSSIP_SENDER_ABILITIES_USAGE_LIST_CC:\n+        case GOSSIP_SENDER_ABILITIES_USAGE_LIST_HEAL:\n+        case GOSSIP_SENDER_ABILITIES_USAGE_LIST_SUPPORT:\n+        {\n+            subMenu = true;\n+\n+            uint32 toggleSender;\n+            std::vector<uint32> const* myspells;\n+            switch (sender)\n+            {\n+                case GOSSIP_SENDER_ABILITIES_USAGE_LIST_DAMAGE:\n+                    toggleSender = GOSSIP_SENDER_ABILITIES_USAGE_TOGGLE_DAMAGE;\n+                    myspells = GetDamagingSpellsList();\n+                    break;\n+                case GOSSIP_SENDER_ABILITIES_USAGE_LIST_CC:\n+                    toggleSender = GOSSIP_SENDER_ABILITIES_USAGE_TOGGLE_CC;\n+                    myspells = GetCCSpellsList();\n+                    break;\n+                case GOSSIP_SENDER_ABILITIES_USAGE_LIST_HEAL:\n+                    toggleSender = GOSSIP_SENDER_ABILITIES_USAGE_TOGGLE_HEAL;\n+                    myspells = GetHealingSpellsList();\n+                    break;\n+                case GOSSIP_SENDER_ABILITIES_USAGE_LIST_SUPPORT:\n+                    toggleSender = GOSSIP_SENDER_ABILITIES_USAGE_TOGGLE_SUPPORT;\n+                    myspells = GetSupportSpellsList();\n+                    break;\n+                default:\n+                    ABORT();\n+            }\n+\n+            ASSERT(myspells);\n+\n+            uint32 counter = 0;\n+            for (uint32 spellId : *myspells)\n+            {\n+                if (!HasSpell(spellId)) //not init'ed (cannot be used)\n+                    continue;\n+\n+                SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId); //always valid\n+                std::ostringstream name;\n+                _AddSpellLink(player, spellInfo, name);\n+\n+                GossipOptionIcon icon = (GetSpell(spellId) != 0) ? BOT_ICON_ON : BOT_ICON_OFF;\n+                AddGossipItemFor(player, icon, name.str(), toggleSender, GOSSIP_ACTION_INFO_DEF + spellId);\n+                if (++counter >= BOT_GOSSIP_MAX_ITEMS - 1) //back\n+                {\n+                    BOT_LOG_ERROR(\"scripts\", \"bot_ai: gossip abilities list overflow with sender {} for bot class {}!\",\n+                        sender, uint32(_botclass));\n+                    break;\n+                }\n+            }\n+\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_BACK), GOSSIP_SENDER_ABILITIES_USAGE_LIST, GOSSIP_ACTION_INFO_DEF + 2);\n+            break;\n+        }\n+        case GOSSIP_SENDER_ABILITIES_USAGE_LIST:\n+        {\n+            subMenu = true;\n+\n+            if (GetDamagingSpellsList())\n+                AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_DAMAGE) + \"...\", GOSSIP_SENDER_ABILITIES_USAGE_LIST_DAMAGE, GOSSIP_ACTION_INFO_DEF + 1);\n+            if (GetCCSpellsList())\n+                AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_CONTROL) + \"...\", GOSSIP_SENDER_ABILITIES_USAGE_LIST_CC, GOSSIP_ACTION_INFO_DEF + 2);\n+            if (GetHealingSpellsList())\n+                AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_HEAL) + \"...\", GOSSIP_SENDER_ABILITIES_USAGE_LIST_HEAL, GOSSIP_ACTION_INFO_DEF + 3);\n+            if (GetSupportSpellsList())\n+                AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_OTHER) + \"...\", GOSSIP_SENDER_ABILITIES_USAGE_LIST_SUPPORT, GOSSIP_ACTION_INFO_DEF + 4);\n+\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_BACK), GOSSIP_SENDER_ABILITIES, GOSSIP_ACTION_INFO_DEF + 5);\n+            break;\n+        }\n+        case GOSSIP_SENDER_SPEC_SET:\n+        {\n+            uint8 newSpec = action - GOSSIP_ACTION_INFO_DEF;\n+\n+            if (newSpec != _spec && newSpec >= BOT_SPEC_BEGIN && newSpec <= BOT_SPEC_END)\n+            {\n+                _newspec = newSpec;\n+                me->CastSpell(me, ACTIVATE_SPEC, false);\n+                BotWhisper(LocalizedNpcText(player, BOT_TEXT_CHANGING_MY_SPEC_TO_) + LocalizedNpcText(player, TextForSpec(_newspec)));\n+                break;\n+            }\n+        }\n+        [[fallthrough]];\n+        case GOSSIP_SENDER_SPEC:\n+        {\n+            subMenu = true;\n+\n+            uint8 specIndex;\n+            switch (_botclass)\n+            {\n+                case BOT_CLASS_WARRIOR:         specIndex = BOT_SPEC_WARRIOR_ARMS;          break;\n+                case BOT_CLASS_PALADIN:         specIndex = BOT_SPEC_PALADIN_HOLY;          break;\n+                case BOT_CLASS_HUNTER:          specIndex = BOT_SPEC_HUNTER_BEASTMASTERY;   break;\n+                case BOT_CLASS_ROGUE:           specIndex = BOT_SPEC_ROGUE_ASSASINATION;    break;\n+                case BOT_CLASS_PRIEST:          specIndex = BOT_SPEC_PRIEST_DISCIPLINE;     break;\n+                case BOT_CLASS_DEATH_KNIGHT:    specIndex = BOT_SPEC_DK_BLOOD;              break;\n+                case BOT_CLASS_SHAMAN:          specIndex = BOT_SPEC_SHAMAN_ELEMENTAL;      break;\n+                case BOT_CLASS_MAGE:            specIndex = BOT_SPEC_MAGE_ARCANE;           break;\n+                case BOT_CLASS_WARLOCK:         specIndex = BOT_SPEC_WARLOCK_AFFLICTION;    break;\n+                case BOT_CLASS_DRUID:           specIndex = BOT_SPEC_DRUID_BALANCE;         break;\n+                default:\n+                    BOT_LOG_ERROR(\"entities.unit\", \"bot_ai:GOSSIP_SENDER_SPEC called for class {} with no specs!\", uint32(_botclass));\n+                    return true;\n+            }\n+\n+            for (uint8 i = specIndex; i < specIndex + 3; ++i)\n+            {\n+                GossipOptionIcon icon = (GetSpec() == i) ? BOT_ICON_ON : BOT_ICON_OFF;\n+                AddGossipItemFor(player, icon, LocalizedNpcText(player, TextForSpec(i)), GOSSIP_SENDER_SPEC_SET, GOSSIP_ACTION_INFO_DEF + i);\n+            }\n+\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_BACK), 1, GOSSIP_ACTION_INFO_DEF + 2);\n+            break;\n+        }\n+        case GOSSIP_SENDER_USEITEM_USE:\n+        {\n+            if (uint32 guidLow = action - GOSSIP_ACTION_INFO_DEF)\n+            {\n+                Item const* item = nullptr;\n+                bool found = false;\n+                for (uint8 i = INVENTORY_SLOT_ITEM_START; i != INVENTORY_SLOT_ITEM_END; ++i)\n+                {\n+                    item = player->GetItemByPos(INVENTORY_SLOT_BAG_0, i);\n+                    if (item && item->GetGUID().GetCounter() == guidLow)\n+                    {\n+                        found = true;\n+                        break;\n+                    }\n+                }\n+\n+                if (!found)\n+                {\n+                    for (uint8 i = INVENTORY_SLOT_BAG_START; i != INVENTORY_SLOT_BAG_END; ++i)\n+                    {\n+                        if (Bag const* pBag = player->GetBagByPos(i))\n+                        {\n+                            for (uint32 j = 0; j != pBag->GetBagSize(); ++j)\n+                            {\n+                                item = player->GetItemByPos(i, j);\n+                                if (item && item->GetGUID().GetCounter() == guidLow)\n+                                {\n+                                    found = true;\n+                                    break;\n+                                }\n+                            }\n+                        }\n+\n+                        if (found)\n+                            break;\n+                    }\n+                }\n+\n+                if (found)\n+                {\n+                    ItemTemplate const* proto = item->GetTemplate();\n+                    // Learning (483 / 55884)\n+                    if (proto->Spells[0].SpellId == 483 || proto->Spells[0].SpellId == 55884)\n+                        break;\n+\n+                    // cast item spell\n+                    SpellCastTargets targets;\n+                    targets.SetUnitTarget(me);\n+                    _castBotItemUseSpell(item, targets);\n+                }\n+            }\n+\n+            //break;\n+            action = GOSSIP_ACTION_INFO_DEF;\n+            [[fallthrough]];\n+        }\n+        case GOSSIP_SENDER_USEITEM:\n+        {\n+            subMenu = true;\n+\n+            uint32 counter = 0;\n+            uint32 maxcounter = BOT_GOSSIP_MAX_ITEMS - 2; //update, back\n+\n+            static const auto is_consumable_item = [](Item const* item, Creature const* bot) {\n+                if (ItemTemplate const* proto = item ? item->GetTemplate() : nullptr)\n+                {\n+                    if (!(proto->Class != ITEM_CLASS_WEAPON && proto->Class != ITEM_CLASS_ARMOR &&\n+                        (proto->AllowableClass == 0 || (proto->AllowableClass & (1u << (bot->GetBotClass() - 1)))) &&\n+                        proto->RequiredSkill == 0 && proto->RequiredSpell == 0 && bot->GetLevel() >= proto->RequiredLevel))\n+                        return false;\n+                    bool has_spell = false;\n+                    for (auto const& ispell: proto->Spells)\n+                    {\n+                        if (ispell.SpellId != 0)\n+                        {\n+                            if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(ispell.SpellId))\n+                            {\n+                                if (spellInfo->IsPassive())\n+                                    continue;\n+                                bool valid_effect = true;\n+                                for (auto i : NPCBots::index_array<uint8, MAX_SPELL_EFFECTS>)\n+                                {\n+                                    SpellEffectInfo const& effect = spellInfo->GetEffect(SpellEffIndex(i));\n+                                    if (!effect.IsEffect())\n+                                        continue;\n+                                    if (effect.TargetA.GetTarget() != TARGET_UNIT_CASTER || effect.TargetB.GetTarget() != 0)\n+                                        valid_effect = false;\n+                                    else\n+                                    {\n+                                        switch (effect.Effect)\n+                                        {\n+                                            case SPELL_EFFECT_SUMMON:\n+                                            case SPELL_EFFECT_CREATE_ITEM:\n+                                                valid_effect = false;\n+                                                break;\n+                                            default:\n+                                                break;\n+                                        }\n+                                    }\n+                                }\n+                                if (!valid_effect)\n+                                    continue;\n+                                has_spell = true;\n+                            }\n+                        }\n+                    }\n+                    return has_spell;\n+                }\n+                return false;\n+            };\n+\n+            for (uint8 i = INVENTORY_SLOT_ITEM_START; i != INVENTORY_SLOT_ITEM_END; ++i)\n+            {\n+                Item const* item = player->GetItemByPos(INVENTORY_SLOT_BAG_0, i);\n+                if (is_consumable_item(item, me))\n+                {\n+                    std::ostringstream name;\n+                    _AddItemLink(player, item, name);\n+                    AddGossipItemFor(player, GOSSIP_ICON_CHAT, name.str(), GOSSIP_SENDER_USEITEM_USE, GOSSIP_ACTION_INFO_DEF + item->GetGUID().GetCounter());\n+                    ++counter; //no need to check max counter here\n+                }\n+            }\n+\n+            for (uint8 i = INVENTORY_SLOT_BAG_START; i != INVENTORY_SLOT_BAG_END; ++i)\n+            {\n+                if (Bag const* pBag = player->GetBagByPos(i))\n+                {\n+                    for (uint32 j = 0; j != pBag->GetBagSize() && counter < maxcounter; ++j)\n+                    {\n+                        Item const* item = player->GetItemByPos(i, j);\n+                        if (is_consumable_item(item, me))\n+                        {\n+                            std::ostringstream name;\n+                            _AddItemLink(player, item, name);\n+                            AddGossipItemFor(player, GOSSIP_ICON_CHAT, name.str(), GOSSIP_SENDER_USEITEM_USE, GOSSIP_ACTION_INFO_DEF + item->GetGUID().GetCounter());\n+                            ++counter;\n+                        }\n+                    }\n+                }\n+            }\n+\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_UPDATE), sender, action);\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_BACK), 1, GOSSIP_ACTION_INFO_DEF + 1);\n+\n+            break;\n+        }\n+        case GOSSIP_SENDER_HIRE:\n+        {\n+            int32 reason = action - GOSSIP_ACTION_INFO_DEF;\n+            if (!reason)\n+            {\n+                if (_botData->owner)\n+                {\n+                    //std::ostringstream ostr;\n+                    //std::string name;\n+                    //ostr << \"Go away. I serve my master \";\n+                    //if (sCharacterCache->GetCharacterNameByGuid(ObjectGuid(HighGuid::Player, _botData->owner), name))\n+                    //    ostr << name;\n+                    //else\n+                    //    ostr << \"unknown (\" << _botData->owner << ')';\n+                    //BotWhisper(ostr.view(), player);\n+                    ChatHandler ch(player->GetSession());\n+                    ch.PSendSysMessage(LocalizedNpcText(player, BOT_TEXT_HIREFAIL_OWNED).c_str(), me->GetName());\n+                    break;\n+                }\n+\n+                uint8 minlvl = BotDataMgr::GetMinLevelForBotClass(_botclass);\n+                if (player->GetLevel() < minlvl)\n+                {\n+                    ChatHandler ch(player->GetSession());\n+                    uint32 locStringId;\n+                    switch (minlvl)\n+                    {\n+                        case 55: locStringId = BOT_TEXT_HIREFAIL_LVL55; break;\n+                        case 20: locStringId = BOT_TEXT_HIREFAIL_LVL20; break;\n+                        case 40: locStringId = BOT_TEXT_HIREFAIL_LVL40; break;\n+                        case 60: locStringId = BOT_TEXT_HIREFAIL_LVL60; break;\n+                        default:\n+                            BOT_LOG_ERROR(\"scripts\", \"No message exists for min class level {}!\", uint32(minlvl));\n+                            locStringId = BOT_TEXT_HIREFAIL_LVL60;\n+                            break;\n+                    }\n+                    switch (_botclass)\n+                    {\n+                        case BOT_CLASS_DEATH_KNIGHT:\n+                            BotWhisper(LocalizedNpcText(player, BOT_TEXT_HIREDENY_DK), player);\n+                            break;\n+                        case BOT_CLASS_SPHYNX:\n+                            me->TextEmote(me->GetName() + LocalizedNpcText(player, BOT_TEXT_HIREDENY_SPHYNX));\n+                            break;\n+                        case BOT_CLASS_ARCHMAGE:\n+                            BotWhisper(LocalizedNpcText(player, BOT_TEXT_HIREDENY_ARCHMAGE), player);\n+                            break;\n+                    }\n+                    ch.PSendSysMessage(LocalizedNpcText(player, locStringId).c_str(), me->GetName());\n+                    break;\n+                }\n+\n+                if (uint32 maxBotsPerAccount = BotCfg::GetMaxAccountBots())\n+                {\n+                    uint32 accountBotsCount = BotDataMgr::GetAccountBotsCount(player->GetSession()->GetAccountId());\n+                    if (accountBotsCount >= maxBotsPerAccount)\n+                    {\n+                        ChatHandler ch(player->GetSession());\n+                        ch.PSendSysMessage(LocalizedNpcText(player, BOT_TEXT_HIREFAIL_MAXBOTS_ACCOUNT).c_str(), accountBotsCount, maxBotsPerAccount);\n+                        break;\n+                    }\n+                }\n+\n+                if (SetBotOwner(player))\n+                {\n+                    if (_botclass == BOT_CLASS_SPHYNX)\n+                        me->TextEmote(me->GetName() + LocalizedNpcText(player, BOT_TEXT_HIRE_EMOTE_SPHYNX) + player->GetName());\n+                    else\n+                        BotWhisper(LocalizedNpcText(player, BOT_TEXT_HIRE_SUCCESS), player);\n+                }\n+                else\n+                    BotSay(\"...\", player);\n+            }\n+            else if (reason == -1)\n+            {\n+                me->SetFaction(FACTION_TEMPLATE_NEUTRAL_HOSTILE);\n+                if (botPet)\n+                    botPet->SetFaction(FACTION_TEMPLATE_NEUTRAL_HOSTILE);\n+                BotYell(LocalizedNpcText(player, BOT_TEXT_DIE), player);\n+                me->Attack(player, true);\n+                break;\n+            }\n+            else\n+            {\n+                ChatHandler ch(player->GetSession());\n+                switch (reason)\n+                {\n+                    case 1: //has owner\n+                    {\n+                        std::ostringstream ostr;\n+                        std::string name;\n+                        ostr << LocalizedNpcText(player, BOT_TEXT_HIREDENY_MY_MASTER_IS_);\n+                        if (sCharacterCache->GetCharacterNameByGuid(ObjectGuid::Create<HighGuid::Player>(_botData->owner), name))\n+                            ostr << name;\n+                        else\n+                            ostr << LocalizedNpcText(player, BOT_TEXT_UNKNOWN) + \" (\" << _botData->owner << ')';\n+                        BotWhisper(ostr.view(), player);\n+                        ch.PSendSysMessage(LocalizedNpcText(player, BOT_TEXT_HIREFAIL_OWNED).c_str(), me->GetName());\n+                        break;\n+                    }\n+                    case 2: //max npcbots exceed\n+                        ch.PSendSysMessage(LocalizedNpcText(player, BOT_TEXT_HIREFAIL_MAXBOTS).c_str(), BotCfg::GetMaxNpcBots(player->GetLevel()));\n+                        BotSay(\"...\", player);\n+                        break;\n+                    case 3: //not enough money\n+                    {\n+                        std::ostringstream ostr;\n+                        ostr << LocalizedNpcText(player, BOT_TEXT_HIREFAIL_COST) << \" (\"\n+                            << BotCfg::GetNpcBotCostStr(player->GetLevel(), _botclass) << \")!\";\n+                        ch.SendSysMessage(ostr.view());\n+                        player->SendBuyError(BUY_ERR_NOT_ENOUGHT_MONEY, 0, 0, 0);\n+                        BotSay(\"...\", player);\n+                        break;\n+                    }\n+                    case 4: //class bots exceed\n+                    {\n+                        uint8 count = std::ranges::count_if(*player->GetBotMgr()->GetBotMap(), [botclass = GetBotClass()](BotMap::value_type const& kv) {\n+                            return kv.second->GetBotClass() == botclass;\n+                        });\n+\n+                        ch.PSendSysMessage(LocalizedNpcText(player, BOT_TEXT_HIREFAIL_MAXCLASSBOTS).c_str(), count, BotCfg::GetMaxClassBots());\n+                        BotSay(\"...\", player);\n+                        break;\n+                    }\n+                    default:\n+                        break;\n+                }\n+            }\n+            break;\n+        }\n+        case GOSSIP_SENDER_DISMISS:\n+        {\n+            BotMgr* mgr = player->GetBotMgr();\n+            //send items to owner -- Unequip all\n+            bool abort = false;\n+            for (auto i : NPCBots::index_array<uint8, BOT_INVENTORY_SIZE>)\n+            {\n+                BotEquipResult slot_result = i <= BOT_SLOT_RANGED ? _resetEquipment(i, player->GetGUID(), false) : _unequip(i, player->GetGUID(), false);\n+                if (slot_result != BotEquipResult::BOT_EQUIP_RESULT_OK)\n+                {\n+                    ChatHandler ch(player->GetSession());\n+                    ch.PSendSysMessage(LocalizedNpcText(player, BOT_TEXT_CANT_DISMISS_EQUIPMENT).c_str(), uint32(i), LocalizedNpcText(player, BOT_TEXT_SLOT_MH + i));\n+                    abort = true;\n+                    break;\n+                }\n+            }\n+\n+            if (abort)\n+                break;\n+\n+            mgr->RemoveBot(me->GetGUID(), BOT_REMOVE_DISMISS);\n+            if (BotCfg::IsEnrageOnDimissEnabled())\n+            {\n+                if (Aura* bers = me->AddAura(BERSERK, me))\n+                {\n+                    uint32 dur = 5 * MINUTE * IN_MILLISECONDS;\n+                    bers->SetDuration(dur);\n+                    bers->SetMaxDuration(dur);\n+                }\n+            }\n+            //if (urand(1,100) <= 25)\n+            //{\n+            //    me->SetFaction(FACTION_TEMPLATE_HATES_EVERYTHING_1);\n+            //    if (Creature* pet = GetBotsPet())\n+            //        pet->SetFaction(FACTION_TEMPLATE_HATES_EVERYTHING_1);\n+            //    BotSay(\"Fool...\", player);\n+            //    me->Attack(player, true);\n+            //}\n+            //else\n+                BotSay(\"...\", player);\n+\n+            break;\n+        }\n+        case GOSSIP_SENDER_OWNERSHIP:\n+        {\n+            subMenu = true;\n+            const uint8 MAX_SHARED_OWNERS_TO_SHOW = BOT_GOSSIP_MAX_ITEMS - 5; // add, remove, count, owner, \"...\"\n+            uint8 counter = 0;\n+\n+            if (!shared_owner || BotCfg::IsSharedOwnerOptionEnabled(SharedOwnerOptionMask::SHARED_OWNER_OPTION_MASK_ADD_OWNERS))\n+                player->PlayerTalkClass->GetGossipMenu().AddMenuItem(-1, GOSSIP_ICON_TABARD, LocalizedNpcText(player, BOT_TEXT_ADD_OWNER),\n+                    GOSSIP_SENDER_OWNERSHIP_ADD_PRE, GOSSIP_ACTION_INFO_DEF + 1, Bcore::StringFormat(\"{}{}\", LocalizedNpcText(player, BOT_TEXT_SHARED_BOT_WARN_ADD), \"!\"), 0, false);\n+            if (!shared_owner || BotCfg::IsSharedOwnerOptionEnabled(SharedOwnerOptionMask::SHARED_OWNER_OPTION_MASK_REMOVE_OWNERS))\n+                player->PlayerTalkClass->GetGossipMenu().AddMenuItem(-1, GOSSIP_ICON_TAXI, LocalizedNpcText(player, BOT_TEXT_REMOVE_OWNER),\n+                    GOSSIP_SENDER_OWNERSHIP_REMOVE, GOSSIP_ACTION_INFO_DEF + 1, {}, 0, true);\n+\n+\n+            CharacterCacheEntry const* char_entry = sCharacterCache->GetCharacterCacheByGuid(ObjectGuid::Create<HighGuid::Player>(_botData->owner));\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, Bcore::StringFormat(\"{}: {} ({})\",\n+                LocalizedNpcText(player, BOT_TEXT_OWNER), char_entry ? char_entry->Name : LocalizedNpcText(player, BOT_TEXT_UNKNOWN), _botData->owner), sender, action);\n+\n+            if (!_botData->shared_owners.empty())\n+            {\n+                AddGossipItemFor(player, GOSSIP_ICON_CHAT, Bcore::StringFormat(\"{} {} {}:\",\n+                    LocalizedNpcText(player, BOT_TEXT_SHARED_WITH), _botData->shared_owners.size(), LocalizedNpcText(player, BOT_TEXT_PLAYERS)), sender, action);\n+                for (uint32 guidlow : _botData->shared_owners)\n+                {\n+                    if (++counter > MAX_SHARED_OWNERS_TO_SHOW)\n+                    {\n+                        AddGossipItemFor(player, GOSSIP_ICON_CHAT, \"...\", sender, action);\n+                        break;\n+                    }\n+                    char_entry = sCharacterCache->GetCharacterCacheByGuid(ObjectGuid::Create<HighGuid::Player>(guidlow));\n+                    std::string showner_str = Bcore::StringFormat(\"{} ({})\", char_entry ? char_entry->Name : LocalizedNpcText(player, BOT_TEXT_UNKNOWN), guidlow);\n+                    AddGossipItemFor(player, GOSSIP_ICON_CHAT, showner_str, sender, action);\n+                }\n+            }\n+            break;\n+        }\n+        case GOSSIP_SENDER_OWNERSHIP_ADD_PRE:\n+        {\n+            subMenu = true;\n+            player->PlayerTalkClass->GetGossipMenu().AddMenuItem(-1, GOSSIP_ICON_TABARD, LocalizedNpcText(player, BOT_TEXT_ADD_OWNER),\n+                GOSSIP_SENDER_OWNERSHIP_ADD, GOSSIP_ACTION_INFO_DEF + 1, {}, 0, true);\n+            break;\n+        }\n+        case GOSSIP_SENDER_JOIN_GROUP:\n+        {\n+            uint32 option = action - GOSSIP_ACTION_INFO_DEF;\n+            switch (option)\n+            {\n+                case 1: //single bot\n+                    player->GetBotMgr()->AddBotToGroup(me);\n+                    break;\n+                case 2: //all bots\n+                {\n+                    for (auto const& [_, bot] : *player->GetBotMgr()->GetBotMap())\n+                        if (bot)\n+                            player->GetBotMgr()->AddBotToGroup(bot);\n+                    break;\n+                }\n+            }\n+            break;\n+        }\n+        case GOSSIP_SENDER_LEAVE_GROUP:\n+        {\n+            player->GetBotMgr()->RemoveBotFromGroup(me);\n+            break;\n+        }\n+        case GOSSIP_SENDER_HOLDPOSITION:\n+        {\n+            SetBotCommandState(BOT_COMMAND_STAY);\n+            //BotWhisper(\"Standing still\");\n+            break;\n+        }\n+        case GOSSIP_SENDER_DONOTHING:\n+        {\n+            SetBotCommandState(BOT_COMMAND_FULLSTOP);\n+            //BotWhisper(\"As you wish\");\n+            break;\n+        }\n+        case GOSSIP_SENDER_FOLLOWME:\n+        {\n+            SetBotCommandState(BOT_COMMAND_FOLLOW, true);\n+            //BotWhisper(\"Following\");\n+            break;\n+        }\n+        case GOSSIP_SENDER_FORMATION_TOGGLE_COMBAT_POSITIONING:\n+        {\n+            player->GetBotMgr()->SetBotAllowCombatPositioning(!player->GetBotMgr()->GetBotAllowCombatPositioning());\n+\n+            //break; //return to menu\n+        }\n+        [[fallthrough]];\n+        case GOSSIP_SENDER_FORMATION:\n+        {\n+            subMenu = true;\n+            std::ostringstream diststr;\n+            diststr << LocalizedNpcText(player, BOT_TEXT_FOLLOW_DISTANCE) << \" (\" << LocalizedNpcText(player, BOT_TEXT_CURRENT) << \": \" << uint32(master->GetBotMgr()->GetBotFollowDist()) << ')';\n+            player->PlayerTalkClass->GetGossipMenu().AddMenuItem(-1, GOSSIP_ICON_CHAT, diststr.str(),\n+                GOSSIP_SENDER_FORMATION_FOLLOW_DISTANCE_SET, GOSSIP_ACTION_INFO_DEF + 1, \"\", 0, true);\n+\n+            if (HasRole(BOT_ROLE_RANGED))\n+            {\n+                AddGossipItemFor(player, !player->GetBotMgr()->GetBotAllowCombatPositioning() ? GOSSIP_ICON_BATTLE : GOSSIP_ICON_CHAT,\n+                    LocalizedNpcText(player, BOT_TEXT_DISABLE_COMBAT_POSITIONING), GOSSIP_SENDER_FORMATION_TOGGLE_COMBAT_POSITIONING, GOSSIP_ACTION_INFO_DEF + 2);\n+                AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_ATTACK_DISTANCE) + \"...\", GOSSIP_SENDER_FORMATION_ATTACK_DISTANCE, GOSSIP_ACTION_INFO_DEF + 3);\n+                AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_ATTACK_ANGLE) + \"...\", GOSSIP_SENDER_FORMATION_ATTACK_ANGLE, GOSSIP_ACTION_INFO_DEF + 4);\n+            }\n+\n+            if (!HasRole(BOT_ROLE_TANK) && HasRole(BOT_ROLE_DPS | BOT_ROLE_HEAL))\n+                AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_ENGAGE_BEHAVIOR) + \"...\", GOSSIP_SENDER_ENGAGE_BEHAVIOR, GOSSIP_ACTION_INFO_DEF + 5);\n+\n+            if (player->GetGroup())\n+            {\n+                for (uint32 role = BOT_ROLE_TANK; !!(role & BOT_ROLE_MASK_MAIN); role <<= 1)\n+                {\n+                    if (role & (BOT_ROLE_TANK | BOT_ROLE_DPS) && HasRole(role))\n+                        AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_PRIORITY_TARGET) + \" (\" + LocalizedNpcText(player, GetRoleString(role)) + \")...\", GOSSIP_SENDER_PRIORITY_TARGET, uint32(GOSSIP_ACTION_INFO_DEF) + role);\n+                }\n+            }\n+\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_BACK), 1, GOSSIP_ACTION_INFO_DEF + 6);\n+            break;\n+        }\n+        case GOSSIP_SENDER_FORMATION_ATTACK_DISTANCE_SET:\n+        {\n+            uint32 choice = action - GOSSIP_ACTION_INFO_DEF;\n+            if (choice == 1) //short\n+            {\n+                player->GetBotMgr()->SetBotAttackRangeMode(BOT_ATTACK_RANGE_SHORT);\n+            }\n+            else if (choice == 2) //long\n+            {\n+                player->GetBotMgr()->SetBotAttackRangeMode(BOT_ATTACK_RANGE_LONG);\n+            }\n+\n+            //break; //return to menu\n+        }\n+        [[fallthrough]];\n+        case GOSSIP_SENDER_FORMATION_ATTACK_DISTANCE:\n+        {\n+            subMenu = true;\n+\n+            uint8 mode = master->GetBotMgr()->GetBotAttackRangeMode();\n+            AddGossipItemFor(player, mode == BOT_ATTACK_RANGE_SHORT ? GOSSIP_ICON_BATTLE : GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_SHORT_RANGE_ATTACKS), GOSSIP_SENDER_FORMATION_ATTACK_DISTANCE_SET, GOSSIP_ACTION_INFO_DEF + 1);\n+            AddGossipItemFor(player, mode == BOT_ATTACK_RANGE_LONG ? GOSSIP_ICON_BATTLE : GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_LONG_RANGE_ATTACKS), GOSSIP_SENDER_FORMATION_ATTACK_DISTANCE_SET, GOSSIP_ACTION_INFO_DEF + 2);\n+\n+            std::ostringstream diststr;\n+            if (mode == BOT_ATTACK_RANGE_EXACT)\n+                diststr << LocalizedNpcText(player, BOT_TEXT_EXACT) << \" (\" << LocalizedNpcText(player, BOT_TEXT_CURRENT) << \": \" << uint32(master->GetBotMgr()->GetBotExactAttackRange()) << ')';\n+            else\n+                diststr << LocalizedNpcText(player, BOT_TEXT_EXACT) << \" (0-50)\";\n+            player->PlayerTalkClass->GetGossipMenu().AddMenuItem(-1, mode == BOT_ATTACK_RANGE_EXACT ? GOSSIP_ICON_BATTLE : GOSSIP_ICON_CHAT,\n+                diststr.str(), GOSSIP_SENDER_FORMATION_ATTACK_DISTANCE_SET, GOSSIP_ACTION_INFO_DEF + 3, \"\", 0, true);\n+\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_BACK), 1, GOSSIP_ACTION_INFO_DEF + 4);\n+            break;\n+        }\n+        case GOSSIP_SENDER_FORMATION_ATTACK_ANGLE_SET:\n+        {\n+            uint32 choice = action - GOSSIP_ACTION_INFO_DEF;\n+            if (choice == 1) //normal\n+            {\n+                player->GetBotMgr()->SetBotAttackAngleMode(BOT_ATTACK_ANGLE_NORMAL);\n+            }\n+            if (choice == 2) //avoid frontal aoe\n+            {\n+                player->GetBotMgr()->SetBotAttackAngleMode(BOT_ATTACK_ANGLE_AVOID_FRONTAL_AOE);\n+            }\n+\n+            //break; //return to menu\n+        }\n+        [[fallthrough]];\n+        case GOSSIP_SENDER_FORMATION_ATTACK_ANGLE:\n+        {\n+            subMenu = true;\n+\n+            uint8 mode = master->GetBotMgr()->GetBotAttackAngleMode();\n+            AddGossipItemFor(player, mode == BOT_ATTACK_ANGLE_NORMAL ? GOSSIP_ICON_BATTLE : GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_NORMAL), GOSSIP_SENDER_FORMATION_ATTACK_ANGLE_SET, GOSSIP_ACTION_INFO_DEF + 1);\n+            AddGossipItemFor(player, mode == BOT_ATTACK_ANGLE_AVOID_FRONTAL_AOE ? GOSSIP_ICON_BATTLE : GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_AVOID_FRONTAL_AOE), GOSSIP_SENDER_FORMATION_ATTACK_ANGLE_SET, GOSSIP_ACTION_INFO_DEF + 2);\n+\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_BACK), 1, GOSSIP_ACTION_INFO_DEF + 3);\n+            break;\n+        }\n+        case GOSSIP_SENDER_ENGAGE_BEHAVIOR:\n+        {\n+            subMenu = true;\n+\n+            if (HasRole(BOT_ROLE_DPS))\n+            {\n+                std::ostringstream delaystr;\n+                delaystr.setf(std::ios_base::fixed);\n+                delaystr.precision(2);\n+                delaystr << LocalizedNpcText(player, BOT_TEXT_DELAY_ATTACK_BY) << \": \" << float(player->GetBotMgr()->GetEngageDelayDPS() / 1000.f) << LocalizedNpcText(player, BOT_TEXT_SECOND_SHORT);\n+                player->PlayerTalkClass->GetGossipMenu().AddMenuItem(-1, GOSSIP_ICON_CHAT, delaystr.str(),\n+                    GOSSIP_SENDER_ENGAGE_DELAY_SET_ATTACK, GOSSIP_ACTION_INFO_DEF + 1, \"\", 0, true);\n+            }\n+            if (HasRole(BOT_ROLE_HEAL))\n+            {\n+                std::ostringstream delaystr;\n+                delaystr.setf(std::ios_base::fixed);\n+                delaystr.precision(2);\n+                delaystr << LocalizedNpcText(player, BOT_TEXT_DELAY_HEALING_BY) << \": \" << float(player->GetBotMgr()->GetEngageDelayHeal() / 1000.f) << LocalizedNpcText(player, BOT_TEXT_SECOND_SHORT);\n+                player->PlayerTalkClass->GetGossipMenu().AddMenuItem(-1, GOSSIP_ICON_CHAT, delaystr.str(), GOSSIP_SENDER_ENGAGE_DELAY_SET_HEALING, GOSSIP_ACTION_INFO_DEF + 2, \"\", 0, true);\n+                if (GetBotClass() != BOT_CLASS_SPHYNX)\n+                {\n+                    std::ostringstream thresholdstr;\n+                    thresholdstr << LocalizedNpcText(player, BOT_TEXT_HEAL_TARGET_HEALTH_THRESHOLD) << \": \" << uint32(GetHealHpPctThreshold()) << \"%\";\n+                    player->PlayerTalkClass->GetGossipMenu().AddMenuItem(-1, GOSSIP_ICON_TALK, thresholdstr.str(), GOSSIP_SENDER_HEAL_HEALTH_THRESHOLD_SET, GOSSIP_ACTION_INFO_DEF + 3, \"\", 0, true);\n+                }\n+            }\n+\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_BACK), 1, GOSSIP_ACTION_INFO_DEF + 4);\n+            break;\n+        }\n+        case GOSSIP_SENDER_HEAL_HEALTH_THRESHOLD_PROPAGATE:\n+        {\n+            uint8 threshold = GetHealHpPctThreshold();\n+            for (auto const& [_, bot] : *player->GetBotMgr()->GetBotMap()) // player === master\n+            {\n+                if (bot && bot != me && bot->GetBotAI() && bot->GetBotAI()->HasRole(BOT_ROLE_HEAL))\n+                    bot->GetBotAI()->SetHealHpPctThreshold(threshold);\n+            }\n+\n+            return OnGossipSelect(player, creature, GOSSIP_SENDER_ENGAGE_BEHAVIOR, action);\n+        }\n+        case GOSSIP_SENDER_PRIORITY_TARGET_SET_TANK:\n+        case GOSSIP_SENDER_PRIORITY_TARGET_SET_DPS:\n+        {\n+            Group const* gr = player->GetGroup();\n+            if (!gr)\n+                break;\n+\n+            uint32 role = sender - GOSSIP_SENDER_PRIORITY_TARGET;\n+            int8 icon = decltype(icon)(action - GOSSIP_ACTION_INFO_DEF);\n+\n+            switch (role)\n+            {\n+                case BOT_ROLE_TANK:\n+                    _primaryIconTank = icon;\n+                    break;\n+                case BOT_ROLE_DPS:\n+                    _primaryIconDamage = icon;\n+                    break;\n+                default:\n+                    break;\n+            }\n+\n+            //break;\n+            action = uint32(GOSSIP_ACTION_INFO_DEF) + role; //restore role value and return to the menu\n+        }\n+        [[fallthrough]];\n+        case GOSSIP_SENDER_PRIORITY_TARGET:\n+        {\n+            Group const* gr = player->GetGroup();\n+            if (!gr)\n+                break;\n+\n+            subMenu = true;\n+\n+            uint32 role = action - GOSSIP_ACTION_INFO_DEF;\n+            switch (role)\n+            {\n+                case BOT_ROLE_TANK:\n+                    for (auto i : NPCBots::index_array_rev<uint8, TARGET_ICONS_COUNT>)\n+                    {\n+                        bool prio = i == _primaryIconTank;\n+                        ObjectGuid guid = gr->GetTargetIcons()[i];\n+                        if (guid && BotCfg::GetTankTargetIconFlags() & GroupIconsFlags[i])\n+                            AddGossipItemFor(player, prio ? GOSSIP_ICON_BATTLE : GOSSIP_ICON_CHAT, player->GetBotMgr()->GetTargetIconString(uint8(i)), GOSSIP_SENDER_PRIORITY_TARGET_SET_TANK, uint32(GOSSIP_ACTION_INFO_DEF) + uint32(i));\n+                    }\n+                    AddGossipItemFor(player, (_primaryIconTank == -1) ? GOSSIP_ICON_BATTLE : GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_NONE2), GOSSIP_SENDER_PRIORITY_TARGET_SET_TANK, uint32(GOSSIP_ACTION_INFO_DEF - 1));\n+                    break;\n+                case BOT_ROLE_DPS:\n+                    for (auto i : NPCBots::index_array_rev<uint8, TARGET_ICONS_COUNT>)\n+                    {\n+                        bool prio = i == _primaryIconDamage;\n+                        ObjectGuid guid = gr->GetTargetIcons()[i];\n+                        uint32 iconMask = BotCfg::GetDPSTargetIconFlags();\n+                        if (HasRole(BOT_ROLE_RANGED))\n+                            iconMask |= BotCfg::GetRangedDPSTargetIconFlags();\n+                        if (guid && iconMask & GroupIconsFlags[i])\n+                            AddGossipItemFor(player, prio ? GOSSIP_ICON_BATTLE : GOSSIP_ICON_CHAT, player->GetBotMgr()->GetTargetIconString(uint8(i)), GOSSIP_SENDER_PRIORITY_TARGET_SET_DPS, uint32(GOSSIP_ACTION_INFO_DEF) + uint32(i));\n+                    }\n+                    AddGossipItemFor(player, (_primaryIconDamage == -1) ? GOSSIP_ICON_BATTLE : GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_NONE2), GOSSIP_SENDER_PRIORITY_TARGET_SET_DPS, uint32(GOSSIP_ACTION_INFO_DEF - 1));\n+                    break;\n+                default:\n+                    BotWhisper(\"unknown role \" + std::to_string(role));\n+                    break;\n+            }\n+\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_BACK), 1, GOSSIP_ACTION_INFO_DEF + 3);\n+            break;\n+        }\n+        case GOSSIP_SENDER_TROUBLESHOOTING_AURA:\n+        {\n+            uint32 spellId = action - GOSSIP_ACTION_INFO_DEF;\n+            for (auto const& [spell_id, aura] : me->GetOwnedAuras())\n+            {\n+                if (spell_id == spellId && aura->GetSpellInfo()->IsChanneled())\n+                    if (Spell const* curSpell = me->GetCurrentSpell(CURRENT_CHANNELED_SPELL))\n+                        if (curSpell->m_spellInfo->Id == spellId)\n+                            me->InterruptSpell(CURRENT_CHANNELED_SPELL);\n+\n+                //Debug\n+                //std::ostringstream msg;\n+                //msg << \"Removing \";\n+                //_AddSpellLink(player, info, msg);\n+                //msg << \" by \";\n+                //ObjectGuid casterGuid = itr->second->GetCasterGUID();\n+                //Unit* caster = casterGuid ? ObjectAccessor::GetUnit(*me, casterGuid) : nullptr;\n+                //if (caster)\n+                //{\n+                //    if (casterGuid == me->GetGUID())\n+                //        msg << \"me\";\n+                //    else\n+                //        msg << caster->GetName();\n+                //}\n+                //else\n+                //    msg << \"Unknown unit\";\n+                //BotWhisper(msg.view());\n+\n+                me->RemoveOwnedAura(spellId, ObjectGuid::Empty, 0, AURA_REMOVE_BY_CANCEL);\n+                break;\n+            }\n+\n+            //break;\n+            action = GOSSIP_ACTION_INFO_DEF + 2; //return to the list and update\n+        }\n+        [[fallthrough]];\n+        case GOSSIP_SENDER_TROUBLESHOOTING_FIX:\n+        {\n+            uint32 option = action - GOSSIP_ACTION_INFO_DEF;\n+            switch (option)\n+            {\n+                //MOVED TO RECEIVEEMOTE\n+                //case 1: //Bot is not mounting, not following while player is mounted\n+                //{\n+                //    //Reason: creature can sometimes retain UNIT_FLAG_X and UNIT_STATE_X\n+                //    //rare occasion, even for bots, you can still talk to them so yeah, stange\n+                //    if (me->HasUnitState(UNIT_STATE_STUNNED) && !me->HasAuraType(SPELL_AURA_MOD_STUN))\n+                //    {\n+                //        me->ClearUnitState(UNIT_STATE_STUNNED);\n+                //        me->RemoveUnitFlag(UNIT_FLAG_STUNNED);\n+                //    }\n+                //    if (me->HasUnitState(UNIT_STATE_CONFUSED) && !me->HasAuraType(SPELL_AURA_MOD_CONFUSE))\n+                //    {\n+                //        me->ClearUnitState(UNIT_STATE_CONFUSED);\n+                //        me->RemoveUnitFlag(UNIT_FLAG_CONFUSED);\n+                //    }\n+                //    break;\n+                //}\n+                case 2: //Remove a visible buff\n+                {\n+                    subMenu = true;\n+                    uint32 count = 0;\n+                    for (auto const& [spell_id, aura] : me->GetOwnedAuras())\n+                    {\n+                        SpellInfo const* info = aura->GetSpellInfo();\n+                        //spells we cannot remove\n+                        //1 passive, negative spells, hidden, locked, shapeshift / mount spells (no hook for that)\n+                        if (info->IsPassive() || !info->IsPositive())\n+                            continue;\n+                        if ((info->Attributes & (SPELL_ATTR0_NO_AURA_CANCEL | SPELL_ATTR0_DO_NOT_DISPLAY)) ||\n+                            (info->AttributesEx & SPELL_ATTR1_NO_AURA_ICON))\n+                            continue;\n+                        if (info->HasAura(SPELL_AURA_MOD_SHAPESHIFT))\n+                            continue;\n+                        if (info->HasAura(SPELL_AURA_MOUNTED) && player->HasAura(info->Id))\n+                            continue;\n+                        //2 custom list\n+                        //2.1 Leader of the Pack AOE (supposed to be passive)\n+                        if (info->Id == 24932)\n+                            continue;\n+                        //2.2 Tree of Life AOE (supposed to be passive)\n+                        if (info->Id == 34123)\n+                            continue;\n+                        //2.3 Moonkin Aura AOE (supposed to be passive)\n+                        if (info->Id == 24907)\n+                            continue;\n+                        //2.4 Blood Pact AOE (supposed to be passive)\n+                        if (info->GetFirstRankSpell()->Id == 6307)\n+                            continue;\n+                        //2.5 Fel Intelligence AOE (supposed to be passive)\n+                        if (info->GetFirstRankSpell()->Id == 54424)\n+                            continue;\n+\n+                        std::ostringstream msg;\n+                        _AddSpellLink(player, info, msg);\n+                        AddGossipItemFor(player, GOSSIP_ICON_CHAT, msg.str(), GOSSIP_SENDER_TROUBLESHOOTING_AURA, GOSSIP_ACTION_INFO_DEF + spell_id);\n+\n+                        if (++count >= BOT_GOSSIP_MAX_ITEMS - 2) //update, back\n+                            break;\n+                    }\n+\n+                    AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_UPDATE), sender, action);\n+                    AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_BACK), 1, GOSSIP_ACTION_INFO_DEF + 1);\n+                    break;\n+                }\n+                case 3: //Fix Powers\n+                {\n+                    InitPowers();\n+                    break;\n+                }\n+                default:\n+                    //BotWhisper(\"Unknown action in GOSSIP_SENDER_TROUBLESHOOTING_FIX\", player);\n+                    break;\n+            }\n+            break;\n+        }\n+        case GOSSIP_SENDER_TROUBLESHOOTING:\n+        {\n+            subMenu = true;\n+            //AddGossipItemFor(player, GOSSIP_ICON_CHAT, \"Fix not mounting/following\", GOSSIP_SENDER_TROUBLESHOOTING_FIX, GOSSIP_ACTION_INFO_DEF + 1);\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_REMOVE_BUFF) + \"...\", GOSSIP_SENDER_TROUBLESHOOTING_FIX, GOSSIP_ACTION_INFO_DEF + 2);\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_FIX_POWER), GOSSIP_SENDER_TROUBLESHOOTING_FIX, GOSSIP_ACTION_INFO_DEF + 3);\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_BACK), 1, GOSSIP_ACTION_INFO_DEF + 4);\n+            break;\n+        }\n+        case GOSSIP_SENDER_DEBUG_ACTION:\n+        {\n+            //!!! player != owner !!!\n+            //DEBUG ACTIONS ARE NOT LOCALIZED\n+            bool close = true;\n+            switch (action - GOSSIP_ACTION_INFO_DEF)\n+            {\n+                case 1: //reset owner\n+                    if (!IAmFree())\n+                        master->GetBotMgr()->RemoveBot(me->GetGUID(), BOT_REMOVE_DISMISS);\n+                    else\n+                    {\n+                        uint32 newOwner = 0;\n+                        BotDataMgr::UpdateNpcBotData(me->GetEntry(), NPCBOT_UPDATE_OWNER, &newOwner);\n+                        NpcBotData::SharedOwnersContainer sharedOwners{};\n+                        BotDataMgr::UpdateNpcBotData(me->GetEntry(), NPCBOT_UPDATE_SHARED_OWNERS, &sharedOwners);\n+                        ResetBotAI(BOTAI_RESET_DISMISS);\n+                    }\n+                    break;\n+                case 2: //reset stats\n+                    spawned = false;\n+                    DefaultInit();\n+                    break;\n+                case 3: //list stats\n+                    close = false;\n+                    ReceiveEmote(player, TEXT_EMOTE_BONK);\n+                    break;\n+                case 4: //list roles\n+                {\n+                    close = false;\n+                    ChatHandler ch(player->GetSession());\n+                    ch.PSendSysMessage(\"{}'s Roles:\", me->GetName());\n+                    for (uint32 i = BOT_MAX_ROLE; i != BOT_ROLE_NONE; i >>= 1)\n+                    {\n+                        if (_roleMask & i)\n+                        {\n+                            switch (i)\n+                            {\n+                                case BOT_ROLE_TANK:\n+                                    ch.SendSysMessage(\"BOT_ROLE_TANK\");\n+                                    break;\n+                                case BOT_ROLE_TANK_OFF:\n+                                    ch.SendSysMessage(\"BOT_ROLE_TANK_OFF\");\n+                                    break;\n+                                case BOT_ROLE_DPS:\n+                                    ch.SendSysMessage(\"BOT_ROLE_DPS\");\n+                                    break;\n+                                case BOT_ROLE_HEAL:\n+                                    ch.SendSysMessage(\"BOT_ROLE_HEAL\");\n+                                    break;\n+                                //case BOT_ROLE_MELEE:\n+                                //    ch.SendSysMessage(\"BOT_ROLE_MELEE\");\n+                                //    break;\n+                                case BOT_ROLE_RANGED:\n+                                    ch.SendSysMessage(\"BOT_ROLE_RANGED\");\n+                                    break;\n+                                case BOT_ROLE_PARTY:\n+                                    ch.SendSysMessage(\"BOT_ROLE_PARTY\");\n+                                    break;\n+                                default:\n+                                    ch.PSendSysMessage(\"BOT_ROLE_{}\", i);\n+                                    break;\n+                            }\n+                        }\n+                    }\n+                    break;\n+                }\n+                case 5: //list spells\n+                {\n+                    close = false;\n+                    ChatHandler ch(player->GetSession());\n+                    ch.PSendSysMessage(\"{}'s Spells:\", me->GetName());\n+                    uint32 counter = 0;\n+                    for (auto const& [rank1_id, spell] : _spells)\n+                    {\n+                        //if (itr->second->spellId == 0)\n+                        //    continue;\n+\n+                        ++counter;\n+                        std::ostringstream sstr;\n+                        SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(rank1_id); //always valid\n+                        _AddSpellLink(player, spellInfo, sstr);\n+                        sstr << \" id: \" << spell.spellId << \", base: \" << rank1_id\n+                            << \", cd: \" << spell.cooldown << \", base: \" << std::max<uint32>(spellInfo->RecoveryTime, spellInfo->CategoryRecoveryTime);\n+                        if (spell.enabled == false)\n+                            sstr << \" (disabled)\";\n+                        ch.PSendSysMessage(\"{}) {}\", counter, sstr.view().data());\n+                    }\n+                    break;\n+                }\n+                case 6: //list owners\n+                {\n+                    close = false;\n+                    ChatHandler ch(player->GetSession());\n+                    ch.PSendSysMessage(\"%s's Owners:\", me->GetName());\n+                    uint32 counter = 0;\n+                    uint32 real_owner_guid = _botData->owner;\n+                    CharacterCacheEntry const* owner_entry = sCharacterCache->GetCharacterCacheByGuid(ObjectGuid::Create<HighGuid::Player>(real_owner_guid));\n+                    ch.PSendSysMessage(\"%u) %s (%u, main)\", ++counter, owner_entry ? owner_entry->Name : LocalizedNpcText(player, BOT_TEXT_UNKNOWN), real_owner_guid);\n+                    std::vector showners(_botData->shared_owners.cbegin(), _botData->shared_owners.cend());\n+                    std::ranges::sort(showners);\n+                    for (uint32 showner_guid : showners)\n+                    {\n+                        owner_entry = sCharacterCache->GetCharacterCacheByGuid(ObjectGuid::Create<HighGuid::Player>(showner_guid));\n+                        ch.PSendSysMessage(\"%u) %s (%u)\", ++counter, owner_entry ? owner_entry->Name : LocalizedNpcText(player, BOT_TEXT_UNKNOWN), showner_guid);\n+                    }\n+                    break;\n+                }\n+                case 7: // Show Waypoint Data\n+                {\n+                    ChatHandler ch(player->GetSession());\n+                    if (_travel_node_last && _travel_node_cur)\n+                    {\n+                        ch.PSendSysMessage(\"Waypoint node data:\");\n+                        ch.PSendSysMessage(\"Current: name:{}, id:{}, x:{}, y:{}, z:{}, proximity:{}\", _travel_node_last->GetName(), _travel_node_last->GetWPId(), _travel_node_last->GetPositionX(), _travel_node_last->GetPositionY(), _travel_node_last->GetPositionZ(), _travel_node_last->GetProximity());\n+                        ch.PSendSysMessage(\"Next: name:{}, id:{}, x:{}, y:{}, z:{}, proximity:{}\", _travel_node_cur->GetName(), _travel_node_cur->GetWPId(), _travel_node_cur->GetPositionX(), _travel_node_cur->GetPositionY(), _travel_node_cur->GetPositionZ(), _travel_node_cur->GetProximity());\n+                        ch.PSendSysMessage(\"Actual: x:{}, y:{}, z:{}, distance:{}\", me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetDistance(_travel_node_last->GetPosition()));\n+                    }\n+                    else\n+                        ch.PSendSysMessage(\"Waypoint data hasn't been created yet\");\n+                    break;\n+                }\n+                case 9: //reload config\n+                {\n+                    close = false;\n+                    BotCfg::ReloadConfig();\n+                    break;\n+                }\n+                default:\n+                    close = false;\n+                    break;\n+            }\n+            if (close)\n+                break;\n+        }\n+        [[fallthrough]];\n+        case GOSSIP_SENDER_DEBUG:\n+        {\n+            //!!! player != owner !!!\n+            subMenu = true;\n+\n+            std::ostringstream ostr;\n+            std::string name;\n+            ostr << \"Bot: \" << me->GetName()\n+                << \" (Id: \" << me->GetEntry()\n+                << \", guidlow: \" << me->GetGUID().GetCounter()\n+                << \", spec: \" << uint32(_spec) << '(' << LocalizedNpcText(player, TextForSpec(_spec)) << ')'\n+                << \", faction: \" << me->GetFaction()\n+                << \"). owner: \";\n+            if (_botData->owner && sCharacterCache->GetCharacterNameByGuid(ObjectGuid::Create<HighGuid::Player>(_botData->owner), name))\n+                ostr << name << \" (\" << _botData->owner << ')';\n+            else\n+                ostr << \"none\";\n+\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, ostr.str(), GOSSIP_SENDER_DEBUG_ACTION, GOSSIP_ACTION_INFO_DEF + 0);\n+\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, \"<Reset Owner>\", GOSSIP_SENDER_DEBUG_ACTION, GOSSIP_ACTION_INFO_DEF + 1);\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, \"<Reset Stats>\", GOSSIP_SENDER_DEBUG_ACTION, GOSSIP_ACTION_INFO_DEF + 2);\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, \"<List Stats>\", GOSSIP_SENDER_DEBUG_ACTION, GOSSIP_ACTION_INFO_DEF + 3);\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, \"<List Roles>\", GOSSIP_SENDER_DEBUG_ACTION, GOSSIP_ACTION_INFO_DEF + 4);\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, \"<List Spells>\", GOSSIP_SENDER_DEBUG_ACTION, GOSSIP_ACTION_INFO_DEF + 5);\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, \"<List Owners>\", GOSSIP_SENDER_DEBUG_ACTION, GOSSIP_ACTION_INFO_DEF + 6);\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, \"<Waypoint Data>\", GOSSIP_SENDER_DEBUG_ACTION, GOSSIP_ACTION_INFO_DEF + 7);\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, \"<List Items>\", GOSSIP_SENDER_EQUIPMENT_LIST, GOSSIP_ACTION_INFO_DEF + 1);\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, \"<Reload Config>\", GOSSIP_SENDER_DEBUG_ACTION, GOSSIP_ACTION_INFO_DEF + 9);\n+\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_BACK), 1, GOSSIP_ACTION_INFO_DEF + 1);\n+            break;\n+        }\n+        case GOSSIP_SENDER_SCAN:\n+        {\n+            subMenu = true;\n+\n+            switch (_botclass)\n+            {\n+                case BOT_CLASS_BM:\n+                    gossipTextId = GOSSIP_CLASSDESC_BM;\n+                    break;\n+                case BOT_CLASS_SPHYNX:\n+                    gossipTextId = GOSSIP_CLASSDESC_SPHYNX;\n+                    break;\n+                case BOT_CLASS_ARCHMAGE:\n+                    gossipTextId = GOSSIP_CLASSDESC_ARCHMAGE;\n+                    break;\n+                case BOT_CLASS_DREADLORD:\n+                    gossipTextId = GOSSIP_CLASSDESC_DREADLORD;\n+                    break;\n+                case BOT_CLASS_SPELLBREAKER:\n+                    gossipTextId = GOSSIP_CLASSDESC_SPELLBREAKER;\n+                    break;\n+                case BOT_CLASS_DARK_RANGER:\n+                    gossipTextId = GOSSIP_CLASSDESC_DARKRANGER;\n+                    break;\n+                case BOT_CLASS_NECROMANCER:\n+                    gossipTextId = GOSSIP_CLASSDESC_NECROMANCER;\n+                    break;\n+                case BOT_CLASS_SEA_WITCH:\n+                    gossipTextId = GOSSIP_CLASSDESC_SEAWITCH;\n+                    break;\n+                case BOT_CLASS_CRYPT_LORD:\n+                    gossipTextId = GOSSIP_CLASSDESC_CRYPTLORD;\n+                    break;\n+                default:\n+                    break;\n+            }\n+\n+            //AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_BACK), 1, GOSSIP_ACTION_INFO_DEF + 1);\n+\n+            break;\n+        }\n+        default:\n+            break;\n+    }\n+\n+    //if we add submenus send them else we should return\n+    if (subMenu)\n+        player->PlayerTalkClass->SendGossipMenu(gossipTextId, me->GetGUID());\n+    else\n+        player->PlayerTalkClass->SendCloseGossip();\n+\n+    return true;\n+}\n+\n+//GossipSelectCode\n+bool bot_ai::OnGossipSelectCode(Player* player, Creature* creature/* == me*/, uint32 sender, uint32 action, char const* code)\n+{\n+    if (!*code)\n+        return true;\n+\n+    if (!BotCfg::IsNpcBotModEnabled() || me->HasUnitState(UNIT_STATE_CASTING) || CCed(me) || IsDuringTeleport() ||\n+        HasBotCommandState(BOT_COMMAND_ISSUED_ORDER) ||\n+        (me->GetVehicle() && me->GetVehicle()->GetBase()->IsInCombat()))\n+    {\n+        player->PlayerTalkClass->SendCloseGossip();\n+        return true;\n+    }\n+\n+    uint32 gossipTextId;\n+    if (player->GetGUID().GetCounter() == _botData->owner || !IAmFree())\n+    {\n+        if (_botclass == BOT_CLASS_SPHYNX)\n+            gossipTextId = GOSSIP_NORMAL_CUSTOM_SPHYNX;\n+        else if (_botclass == BOT_CLASS_DREADLORD)\n+            gossipTextId = GOSSIP_NORMAL_CUSTOM_DREADLORD;\n+        else if (_botclass == BOT_CLASS_DARK_RANGER)\n+            gossipTextId = GOSSIP_NORMAL_CUSTOM_DARKRANGER;\n+        else if (_botclass == BOT_CLASS_SEA_WITCH)\n+            gossipTextId = GOSSIP_NORMAL_CUSTOM_SEAWITCH;\n+        else if (_botclass == BOT_CLASS_CRYPT_LORD)\n+            gossipTextId = GOSSIP_NORMAL_CUSTOM_CRYPTLORD;\n+        else\n+            gossipTextId = GOSSIP_NORMAL_SERVE_MASTER;\n+    }\n+    else\n+    {\n+        if (_botclass == BOT_CLASS_SPHYNX)\n+            gossipTextId = GOSSIP_GREET_CUSTOM_SPHYNX;\n+        else if (_botclass == BOT_CLASS_DREADLORD)\n+            gossipTextId = GOSSIP_GREET_CUSTOM_DREADLORD;\n+        else if (_botclass == BOT_CLASS_DARK_RANGER)\n+            gossipTextId = GOSSIP_GREET_CUSTOM_DARKRANGER;\n+        else if (_botclass == BOT_CLASS_SEA_WITCH)\n+            gossipTextId = GOSSIP_GREET_CUSTOM_SEAWITCH;\n+        else if (_botclass == BOT_CLASS_CRYPT_LORD)\n+            gossipTextId = GOSSIP_GREET_CUSTOM_CRYPTLORD;\n+        else\n+            gossipTextId = GOSSIP_GREET_NEED_SMTH;\n+    }\n+\n+    player->PlayerTalkClass->ClearMenus();\n+\n+    bool subMenu = false;\n+\n+    switch (sender)\n+    {\n+        case GOSSIP_SENDER_FORMATION_FOLLOW_DISTANCE_SET:\n+        {\n+            char* dist = strtok((char*)code, \"\");\n+            uint8 distance = (uint8)std::min<int32>(std::max<int32>(atoi(dist), 0), 100);\n+\n+            player->GetBotMgr()->SetBotFollowDist(distance);\n+\n+            player->PlayerTalkClass->SendCloseGossip();\n+            return OnGossipSelect(player, creature, GOSSIP_SENDER_FORMATION, action);\n+        }\n+        case GOSSIP_SENDER_FORMATION_ATTACK_DISTANCE_SET:\n+        {\n+            uint32 choice = action - GOSSIP_ACTION_INFO_DEF;\n+            if (choice == 3) //exact\n+            {\n+                char* dist = strtok((char*)code, \"\");\n+                uint8 distance = (uint8)std::min<int32>(std::max<int32>(atoi(dist), 0), 50);\n+\n+                player->GetBotMgr()->SetBotAttackRangeMode(BOT_ATTACK_RANGE_EXACT, distance);\n+            }\n+\n+            player->PlayerTalkClass->SendCloseGossip();\n+            return OnGossipSelect(player, creature, GOSSIP_SENDER_FORMATION_ATTACK_DISTANCE, action);\n+        }\n+        case GOSSIP_SENDER_ENGAGE_DELAY_SET_ATTACK:\n+        {\n+            char* dist = strtok((char*)code, \"\");\n+            float delay = std::min<float>(std::max<float>(atof(dist), 0.f), 10.f);\n+\n+            player->GetBotMgr()->SetEngageDelayDPS(uint32(delay * 1000));\n+\n+            player->PlayerTalkClass->SendCloseGossip();\n+            return OnGossipSelect(player, creature, GOSSIP_SENDER_ENGAGE_BEHAVIOR, action);\n+        }\n+        case GOSSIP_SENDER_ENGAGE_DELAY_SET_HEALING:\n+        {\n+            char* dist = strtok((char*)code, \"\");\n+            float delay = std::min<float>(std::max<float>(atof(dist), 0.f), 10.f);\n+\n+            player->GetBotMgr()->SetEngageDelayHeal(uint32(delay * 1000));\n+\n+            player->PlayerTalkClass->SendCloseGossip();\n+            return OnGossipSelect(player, creature, GOSSIP_SENDER_ENGAGE_BEHAVIOR, action);\n+        }\n+        case GOSSIP_SENDER_HEAL_HEALTH_THRESHOLD_SET:\n+        {\n+            subMenu = true;\n+\n+            char* dist = strtok((char*)code, \"\");\n+            float threshold = std::min<float>(std::max<float>(atof(dist), 0.f), 99.f);\n+\n+            SetHealHpPctThreshold(uint8(threshold));\n+\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_SET_FOR_ALL_EVERYONE), GOSSIP_SENDER_HEAL_HEALTH_THRESHOLD_PROPAGATE, GOSSIP_ACTION_INFO_DEF + 1);\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_BACK), GOSSIP_SENDER_ENGAGE_BEHAVIOR, GOSSIP_ACTION_INFO_DEF + 2);\n+            break;\n+        }\n+        case GOSSIP_SENDER_EQUIPMENT_BANK_SET_CREATE:\n+        {\n+            std::string set_name(code);\n+\n+            if (!set_name.empty() && set_name.size() <= MAX_BOT_ITEM_SET_NAME_LENGTH && GetRealEquippedItemsCount() != 0)\n+            {\n+                EquipmentInfo const* einfo = BotDataMgr::GetBotEquipmentInfo(me->GetEntry());\n+                NpcBotItemSet& item_set = BotDataMgr::CreateNewBotItemSet(player->GetGUID());\n+\n+                item_set.name = std::move(set_name);\n+                for (uint8 i : NPCBots::index_array<uint8, BOT_INVENTORY_SIZE>)\n+                    if (Item const* item = _equips[i])\n+                        if (i > BOT_SLOT_RANGED || einfo->ItemEntry[i] != item->GetEntry())\n+                            item_set.items[i] = item->GetEntry();\n+            }\n+            else\n+                BotWhisper(LocalizedNpcText(player, BOT_TEXT_FAILED));\n+\n+            return OnGossipSelect(player, creature, GOSSIP_SENDER_EQUIPMENT_BANK_SETS_MENU, action);\n+        }\n+        case GOSSIP_SENDER_OWNERSHIP_ADD:\n+        {\n+            std::string name_or_guid{ code };\n+            ObjectGuid::LowType lowguid{};\n+\n+            if (Optional<decltype(lowguid)> lguid = Bcore::StringTo<decltype(lowguid)>(name_or_guid))\n+                lowguid = *lguid;\n+            else if (auto lg = normalizePlayerName(name_or_guid) ? sCharacterCache->GetCharacterGuidByName(name_or_guid) : ObjectGuid::Empty; lg != ObjectGuid::Empty)\n+                lowguid = lg.GetCounter();\n+\n+            if (!lowguid)\n+                BotWhisper(Bcore::StringFormat(\"{} ({} {} '{}')\", LocalizedNpcText(player, BOT_TEXT_FAILED), LocalizedNpcText(player, BOT_TEXT_UNKNOWN), LocalizedNpcText(player, BOT_TEXT_PLAYER), lowguid));\n+            else if (lowguid == _botData->owner)\n+                BotWhisper(LocalizedNpcText(player, BOT_TEXT_FAILED));\n+            else if (lowguid == player->GetGUID().GetCounter())\n+                BotWhisper(Bcore::StringFormat(\"{} ({} {})\", LocalizedNpcText(player, BOT_TEXT_FAILED), LocalizedNpcText(player, BOT_TEXT_CURRENT), LocalizedNpcText(player, BOT_TEXT_PLAYER)));\n+            else if (HasSharedOwner(lowguid))\n+                BotWhisper(LocalizedNpcText(player, BOT_TEXT_FAILED));\n+            else if (_botData->shared_owners.size() >= BotCfg::GetMaxSharedOwners())\n+                BotWhisper(Bcore::StringFormat(\"{} ({} >= {})!\", LocalizedNpcText(player, BOT_TEXT_OWNERS_LIMIT_EXCEEDED), _botData->shared_owners.size(), BotCfg::GetMaxSharedOwners()));\n+            else\n+            {\n+                _botData->shared_owners.insert(lowguid);\n+                BotDataMgr::UpdateNpcBotData(me->GetEntry(), NPCBOT_UPDATE_SHARED_OWNERS, &_botData->shared_owners);\n+            }\n+\n+            player->PlayerTalkClass->SendCloseGossip();\n+            return OnGossipSelect(player, creature, GOSSIP_SENDER_OWNERSHIP, action);\n+        }\n+        case GOSSIP_SENDER_OWNERSHIP_REMOVE:\n+        {\n+            std::string name_or_guid{ code };\n+            ObjectGuid::LowType lowguid{};\n+\n+            if (Optional<decltype(lowguid)> lguid = Bcore::StringTo<decltype(lowguid)>(name_or_guid))\n+                lowguid = *lguid;\n+            else if (auto lg = normalizePlayerName(name_or_guid) ? sCharacterCache->GetCharacterGuidByName(name_or_guid) : ObjectGuid::Empty; lg != ObjectGuid::Empty)\n+                lowguid = lg.GetCounter();\n+\n+            if (!lowguid)\n+                BotWhisper(Bcore::StringFormat(\"{} ({} {} '{}')\", LocalizedNpcText(player, BOT_TEXT_FAILED), LocalizedNpcText(player, BOT_TEXT_UNKNOWN), LocalizedNpcText(player, BOT_TEXT_PLAYER), lowguid));\n+            else if (!HasSharedOwner(lowguid))\n+                BotWhisper(LocalizedNpcText(player, BOT_TEXT_FAILED));\n+            else\n+            {\n+                const bool removing_self = lowguid == player->GetGUID().GetCounter();\n+                if (removing_self)\n+                    player->GetBotMgr()->RemoveBot(me->GetGUID(), BOT_REMOVE_BY_DEFAULT);\n+\n+                _botData->shared_owners.erase(lowguid);\n+                BotDataMgr::UpdateNpcBotData(me->GetEntry(), NPCBOT_UPDATE_SHARED_OWNERS, &_botData->shared_owners);\n+\n+                if (removing_self)\n+                    break;\n+            }\n+\n+            player->PlayerTalkClass->SendCloseGossip();\n+            return OnGossipSelect(player, creature, GOSSIP_SENDER_OWNERSHIP, action);\n+        }\n+        default:\n+            break;\n+    }\n+\n+    if (subMenu)\n+        player->PlayerTalkClass->SendGossipMenu(gossipTextId, me->GetGUID());\n+    else\n+        player->PlayerTalkClass->SendCloseGossip();\n+\n+    return true;\n+}\n+//PvP trinket for minions\n+void bot_ai::BreakCC(uint32 diff)\n+{\n+    if (_botclass < BOT_CLASS_EX_START && me->GetLevel() >= 60 && IsSpellReady(PVPTRINKET, diff, false) &&\n+        CCed(me, true) && (me->GetVictim() || !me->getAttackers().empty()) && Rand() < 20)\n+    {\n+        if (doCast(me, PVPTRINKET))\n+            return;\n+    }\n+\n+    uint8 myrace = me->GetRace();\n+\n+    //Racial 6) Every Man for Himself\n+    if (myrace == RACE_HUMAN && IsSpellReady(RACIAL_EVERY_MAN_FOR_HIMSELF, diff, false) && CCed(me, true) &&\n+        !me->HasAuraType(SPELL_AURA_MOD_STEALTH) &&\n+        (me->IsInCombat() || !me->getAttackers().empty()) && Rand() < 40 && !IsCasting() &&\n+        (me->GetLevel() < 60 || !IsSpellReady(PVPTRINKET, diff, false)))\n+    {\n+        if (doCast(me, RACIAL_EVERY_MAN_FOR_HIMSELF))\n+            return;\n+    }\n+    //Racial 5) Forsaken (Will of the Forsaken)\n+    if (myrace == RACE_UNDEAD_PLAYER && IsSpellReady(RACIAL_WILL_OF_THE_FORSAKEN, diff, false) &&\n+        (me->IsInCombat() || !me->getAttackers().empty()) && CCed(me) &&\n+        Rand() < 10 && !me->HasAuraType(SPELL_AURA_MOD_STEALTH) && !IsCasting() &&\n+        (me->GetLevel() < 60 || !IsSpellReady(PVPTRINKET, diff, false)) &&\n+        me->HasAuraWithMechanic((1u<<MECHANIC_CHARM)|(1u<<MECHANIC_FEAR)|(1u<<MECHANIC_SLEEP)))\n+    {\n+        if (doCast(me, RACIAL_WILL_OF_THE_FORSAKEN))\n+            return;\n+    }\n+    //Racial 7) Escape Artist\n+    if (me->GetRace() == RACE_GNOME && IsSpellReady(RACIAL_ESCAPE_ARTIST, diff, false) && CCed(me, true) &&\n+        !me->HasAuraType(SPELL_AURA_MOD_STEALTH) &&\n+        (me->IsInCombat() || !me->getAttackers().empty()) && Rand() < 40 && !IsCasting() &&\n+        (me->GetLevel() < 60 || !IsSpellReady(PVPTRINKET, diff, false)) &&\n+        me->HasAuraWithMechanic((1u<<MECHANIC_SNARE)|(1u<<MECHANIC_ROOT)))\n+    {\n+        if (doCast(me, RACIAL_ESCAPE_ARTIST))\n+            return;\n+    }\n+}\n+//Racial abilities\n+void bot_ai::CheckRacials(uint32 diff)\n+{\n+    //At this point checked CCed and pots\n+    uint8 myrace = me->GetRace();\n+    //Racial 1) Tauren (War Stomp)\n+    if (myrace == RACE_TAUREN && IsSpellReady(RACIAL_WARSTOMP, diff, false) &&\n+        (!IsTank() || me->GetShapeshiftForm() == FORM_NONE) &&\n+        Rand() < 20 && !me->HasAuraType(SPELL_AURA_MOD_STEALTH) && !IsCasting())\n+    {\n+        Unit const* u = me->SelectNearestTarget(7);\n+        if (u && u->IsInCombat() && !CCed(u) && u->isTargetableForAttack(false) && IsInBotParty(u->GetVictim()) && me->IsWithinLOSInMap(u))\n+        {\n+            if (doCast(me, RACIAL_WARSTOMP))\n+                return;\n+        }\n+    }\n+    //Racial 2) Orc (Blood Fury)\n+    if (myrace == RACE_ORC)\n+    {\n+        uint32 bloodFury = RaceSpellForClass(myrace, _botclass);\n+        if (IsSpellReady(bloodFury, diff, false) && me->GetVictim() && GetHealthPCT(me) > 35 && !CCed(me, true) &&\n+            (me->GetVictim()->GetHealth() > me->GetMaxHealth() / 2 || me->getAttackers().size() > 1) &&\n+            Rand() < 20 && !me->HasAuraType(SPELL_AURA_MOD_STEALTH) && !IsCasting())\n+        {\n+            if (doCast(me, bloodFury))\n+                return;\n+        }\n+    }\n+    //Racial 3) Dwarf (Stoneform)\n+    if (myrace == RACE_DWARF && IsSpellReady(RACIAL_STONEFORM, diff, false) && GetHealthPCT(me) < 80 &&\n+        Rand() < 10 && !me->HasAuraType(SPELL_AURA_MOD_STEALTH) && !IsCasting())\n+    {\n+        //Unholy Blight prevents diseases from being dispelled\n+        uint32 const dispelMask = me->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DEATHKNIGHT, 1494, 0) ?\n+            (1u<<DISPEL_POISON) : (1u<<DISPEL_DISEASE)|(1u<<DISPEL_POISON);\n+        uint8 count = 0;\n+        for (auto const& [spell_id, aura] : me->GetOwnedAuras())\n+        {\n+            if (aura->IsPassive())\n+                continue;\n+\n+            AuraApplication const* aurApp = aura->GetApplicationOfTarget(me->GetGUID());\n+            if (!aurApp)\n+                continue;\n+            if (aurApp->IsPositive())\n+                continue;\n+\n+            if ((aura->GetSpellInfo()->GetDispelMask() & dispelMask) ||\n+                aura->GetSpellInfo()->Mechanic == MECHANIC_BLEED)\n+                if (++count > 1)\n+                    break;\n+        }\n+\n+        if (count > 1 - 1*(me->IsInCombat()) && doCast(me, RACIAL_STONEFORM))\n+            return;\n+    }\n+    //Racial 4) Night Elf (Shadowmeld)\n+    if (myrace == RACE_NIGHTELF && IsSpellReady(RACIAL_SHADOWMELD, diff, false) && !me->IsInCombat() && me->GetVictim() &&\n+        me->GetVictim()->IsPlayer() && Rand() < 50 &&\n+        !me->HasAuraType(SPELL_AURA_MOD_STEALTH) && !IsCasting())\n+    {\n+        if (Spell const* spell = me->GetVictim()->GetCurrentSpell(CURRENT_GENERIC_SPELL))\n+        {\n+            if (spell->m_targets.GetUnitTarget() == me && spell->GetTimer() < 500 &&\n+                spell->GetSpellInfo()->HasEffect(SPELL_EFFECT_SCHOOL_DAMAGE))\n+                if (doCast(me, RACIAL_SHADOWMELD))\n+                    return;\n+        }\n+    }\n+    //Racial 8) Troll (Berserking)\n+    if (myrace == RACE_TROLL && IsSpellReady(RACIAL_BERSERKING, diff, false) && me->GetVictim() &&\n+        GetHealthPCT(me) > 35 && !CCed(me, true) &&\n+        (me->GetVictim()->GetHealth() > me->GetMaxHealth() / 2 || me->getAttackers().size() > 1) &&\n+        Rand() < 20 && !me->HasAuraType(SPELL_AURA_MOD_STEALTH) && !IsCasting())\n+    {\n+        if (doCast(me, RACIAL_BERSERKING))\n+            return;\n+    }\n+    //Racial 9) Blood Elf (Arcane Torrent)\n+    if (myrace == RACE_BLOODELF)\n+    {\n+        uint32 arcaneTorrent = RaceSpellForClass(myrace, _botclass);\n+        if (IsSpellReady(arcaneTorrent, diff, false) && !IsCasting() && !Feasting())\n+        {\n+            Unit const* victim = me->GetVictim();\n+            if (victim && victim->IsNonMeleeSpellCast(false, false, true) &&\n+                (me->GetVictim()->GetHealth() > me->GetHealth() / 4 || me->getAttackers().size() > 1) &&\n+                me->GetDistance(victim) < 7 && Rand() < 30 && !me->HasAuraType(SPELL_AURA_MOD_STEALTH))\n+            {\n+                if (Spell const* spell = victim->GetCurrentSpell(CURRENT_GENERIC_SPELL))\n+                {\n+                    if (IsInBotParty(spell->m_targets.GetUnitTargetGUID()) && spell->GetTimer() < 1000)\n+                        if (doCast(me, arcaneTorrent))\n+                            return;\n+                }\n+            }\n+            else if (GetManaPCT(me) < 25)\n+                if (doCast(me, arcaneTorrent))\n+                    return;\n+        }\n+    }\n+    //Racial 10) Draenei (Gift of The Naaru) - self only\n+    if (myrace == RACE_DRAENEI)\n+    {\n+        uint32 giftOfNaaru = RaceSpellForClass(myrace, _botclass);\n+        if (IsSpellReady(giftOfNaaru, diff, false) && (me->IsInCombat() || !me->getAttackers().empty()) &&\n+            GetHealthPCT(me) < 60 - 10*me->HasAuraType(SPELL_AURA_PERIODIC_HEAL) &&\n+            Rand() < 50 && !IsCasting())\n+        {\n+            if (doCast(me, giftOfNaaru))\n+                return;\n+        }\n+    }\n+}\n+//Force bots to start attack anyone who tries to DAMAGE me or master\n+//This means that anyone who attacks party will be attacked by whole bot party (see GetTarget())\n+void bot_ai::OnOwnerDamagedBy(Unit* attacker)\n+{\n+    if (HasBotCommandState(BOT_COMMAND_FULLSTOP | BOT_COMMAND_INACTION))\n+        return;\n+\n+    bool byspell = false;\n+    switch (_botclass)\n+    {\n+        case BOT_CLASS_DRUID:\n+            byspell = GetBotStance() == BOT_STANCE_NONE || GetBotStance() == DRUID_MOONKIN_FORM;\n+            break;\n+        case BOT_CLASS_PRIEST:\n+        case BOT_CLASS_MAGE:\n+        case BOT_CLASS_WARLOCK:\n+        case BOT_CLASS_SHAMAN:\n+        case BOT_CLASS_SPHYNX:\n+        case BOT_CLASS_ARCHMAGE:\n+            byspell = true;\n+            break;\n+        default:\n+            //BOT_LOG_ERROR(\"entities.player\", \"minion_ai: OnOwnerDamagedBy() - unknown bot class %u\", uint8(_botclass));\n+            break;\n+    }\n+\n+    if (!_canSwitchToTarget(me->GetVictim(), attacker, byspell))\n+        return;\n+\n+    SetBotCommandState(BOT_COMMAND_COMBATRESET); //reset AttackStart()\n+    me->Attack(attacker, !HasRole(BOT_ROLE_RANGED));\n+}\n+//force vehicle targeting and attack if vehicle is damaged\n+void bot_ai::OnOwnerVehicleDamagedBy(Unit* attacker)\n+{\n+    if (HasBotCommandState(BOT_COMMAND_FULLSTOP | BOT_COMMAND_INACTION))\n+        return;\n+\n+    Creature* veh = me->GetVehicleCreatureBase();\n+    if (!veh || (veh->GetTarget() && HasBotCommandState(BOT_COMMAND_ATTACK)) || !veh->IsValidAttackTarget(attacker))\n+        return;\n+\n+    veh->SetTarget(attacker->GetGUID());\n+    SetBotCommandState(BOT_COMMAND_ATTACK);\n+    me->GetVehicleBase()->Attack(attacker, false);\n+}\n+void bot_ai::OnAttackStop(Unit const* target)\n+{\n+    if (opponent == target)\n+        opponent = nullptr;\n+    if (disttarget == target)\n+        disttarget = nullptr;\n+}\n+//////////\n+///LOOT///\n+//////////\n+void bot_ai::SpawnKillReward(Player* looter) const\n+{\n+    if (!BotCfg::GetBotWandererKillRewardMoney() && !BotCfg::GetBotWandererKillRewardItemMaxCount())\n+        return;\n+\n+    if (!me->GetMap()->GetEntry()->IsContinent())\n+        return;\n+\n+    GameObject* moneyBag = looter->SummonGameObject(GO_BOT_MONEY_BAG, me->m_positionX, me->m_positionY, me->m_positionZ, me->GetOrientation(), 0, 0, 0, 0, REVIVE_TIMER_DEFAULT);\n+    moneyBag->SetSpellId(GO_BOT_MONEY_BAG + me->GetEntry());\n+}\n+void bot_ai::FillKillReward(GameObject* go) const\n+{\n+    go->SetObjectScale(0.875f);\n+\n+    Loot& loot = go->loot;\n+\n+    loot.clear();\n+    loot.loot_type = LOOT_CORPSE;\n+\n+    uint32 basegold = BotCfg::GetBotWandererKillRewardMoney();\n+    uint32 maxitems = BotCfg::GetBotWandererKillRewardItemMaxCount();\n+    uint32 maxquality = BotCfg::GetBotWandererKillRewardItemMaxQuality();\n+\n+    if (!basegold && !maxitems)\n+        return;\n+\n+    if (basegold)\n+    {\n+        float lvl = float(std::min<uint8>(me->GetLevel(), DEFAULT_MAX_LEVEL));\n+        float gold = basegold;\n+        switch (me->GetLevel() / 10)\n+        {\n+            case 0: gold *= 0.100f; break;\n+            case 1: gold *= 0.125f; break;\n+            case 2: gold *= 0.175f; break;\n+            case 3: gold *= 0.225f; break;\n+            case 4: gold *= 0.300f; break;\n+            case 5: gold *= 0.400f; break;\n+            case 6: gold *= 0.550f; break;\n+            case 7: gold *= 0.750f; break;\n+            default:                break;\n+        }\n+        loot.gold = std::min<float>(std::max<float>(gold + _killsCount * gold * 0.04f - _deathsCount * gold * 0.4f, gold), gold * 10.0f) / float(DEFAULT_MAX_LEVEL) * lvl;\n+    }\n+\n+    if (maxitems)\n+    {\n+        std::vector<uint32> random_items;\n+        random_items.reserve(std::size(_equips));\n+        for (Item const* item : _equips)\n+        {\n+            if (item && item->GetTemplate()->Quality <= maxquality)\n+                random_items.push_back(item->GetEntry());\n+        }\n+        if (!random_items.empty())\n+        {\n+            Bcore::Containers::RandomResize(random_items, maxitems);\n+            for (uint32 itemd_id : random_items)\n+                loot.AddItem(LootStoreItem(itemd_id, 0, 100.0f, false, 0, 0, 1, 1));\n+        }\n+    }\n+}\n+uint32 bot_ai::_getLootQualityMask() const\n+{\n+    uint32 lootRoleMask = (_roleMask & BOT_ROLE_MASK_LOOTING);\n+    uint32 lootMask = 0;\n+\n+    if (lootRoleMask & BOT_ROLE_AUTOLOOT_POOR)\n+        lootMask |= (1u << ITEM_QUALITY_POOR);\n+    if (lootRoleMask & BOT_ROLE_AUTOLOOT_COMMON)\n+        lootMask |= (1u << ITEM_QUALITY_NORMAL);\n+    if (lootRoleMask & BOT_ROLE_AUTOLOOT_UNCOMMON)\n+        lootMask |= (1u << ITEM_QUALITY_UNCOMMON);\n+    if (lootRoleMask & BOT_ROLE_AUTOLOOT_RARE)\n+        lootMask |= (1u << ITEM_QUALITY_RARE);\n+    if (lootRoleMask & BOT_ROLE_AUTOLOOT_EPIC)\n+        lootMask |= (1u << ITEM_QUALITY_EPIC);\n+    if (lootRoleMask & BOT_ROLE_AUTOLOOT_LEGENDARY)\n+        lootMask |= (1u << ITEM_QUALITY_LEGENDARY);\n+\n+    return lootMask;\n+}\n+uint32 bot_ai::_getLootQualityThreshold() const\n+{\n+    uint32 lootThreshold;\n+    Group const* gr = master->GetGroup();\n+    if (!gr || gr->GetFirstMember()->next() == nullptr)\n+        lootThreshold = uint32(MAX_ITEM_QUALITY);\n+    else\n+    {\n+        switch (gr->GetLootMethod())\n+        {\n+            case GROUP_LOOT: case NEED_BEFORE_GREED: case MASTER_LOOT:\n+                lootThreshold = uint32(gr->GetLootThreshold()); break;\n+            default:\n+                lootThreshold = uint32(MAX_ITEM_QUALITY);       break;\n+        }\n+    }\n+\n+    return lootThreshold;\n+}\n+bool bot_ai::_canLootItemForPlayer(Player* player, Creature* creature, uint8 slot) const\n+{\n+    QuestItem* qitem = nullptr;\n+    QuestItem* ffaitem = nullptr;\n+    QuestItem* conditem = nullptr;\n+\n+    LootItem const* item = creature->loot.LootItemInSlot(slot, player, &qitem, &ffaitem, &conditem);\n+    if (!item || item->is_looted)\n+    {\n+        //BOT_LOG_ERROR(\"scripts\", \"can't loot item %u, no item\", slot);\n+        return false;\n+    }\n+\n+    if (!qitem && item->is_blocked)\n+    {\n+        //BOT_LOG_ERROR(\"scripts\", \"can't loot item %u (%u), blocked\", slot, item->itemid);\n+        return false;\n+    }\n+\n+    if (!item->rollWinnerGUID.IsEmpty() && item->rollWinnerGUID != player->GetGUID())\n+    {\n+        //BOT_LOG_ERROR(\"scripts\", \"can't loot item %u (%u), roll won\", slot, item->itemid);\n+        return false;\n+    }\n+\n+    ItemPosCountVec dest;\n+    if (player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, item->itemid, item->count) == EQUIP_ERR_OK)\n+        return true;\n+\n+    //BOT_LOG_ERROR(\"scripts\", \"can't loot item %u (%u), can't store\", slot, item->itemid);\n+    return false;\n+}\n+bool bot_ai::_canLootCreatureForPlayer(Player* player, Creature* creature, uint32 lootQualityMask, uint32 lootThreshold) const\n+{\n+    if (!player || master->GetMap() != player->FindMap()/* || !player->IsAlive() || !p->IsAtGroupRewardDistance(creature)*/)\n+        return false;\n+\n+    bool canLoot = false;\n+    uint8 slot = 0;\n+    for (LootItem const& loot_item : creature->loot.items)\n+    {\n+        ++slot;\n+\n+        if (loot_item.is_blocked || loot_item.is_looted)\n+        {\n+            //BOT_LOG_ERROR(\"scripts\", \"item %u is blocked\", i->itemid);\n+            continue;\n+        }\n+\n+        if (!loot_item.rollWinnerGUID.IsEmpty() && loot_item.rollWinnerGUID != player->GetGUID())\n+        {\n+            //BOT_LOG_ERROR(\"scripts\", \"can't loot item %u (%u), roll won\", slot, i->itemid);\n+            continue;\n+        }\n+\n+        ItemTemplate const* itemProto = sObjectMgr->GetItemTemplate(loot_item.itemid);\n+        if (!itemProto)\n+        {\n+            //BOT_LOG_ERROR(\"scripts\", \"no item proto for itemId %u\", i->itemid);\n+            return false;\n+        }\n+\n+        if (itemProto->Quality >= lootThreshold)\n+        {\n+            //BOT_LOG_ERROR(\"scripts\", \"item %u group quality threshold mismatch\", i->itemid);\n+            continue;\n+        }\n+\n+        if (!((1u << itemProto->Quality) & lootQualityMask))\n+        {\n+            //BOT_LOG_ERROR(\"scripts\", \"item %u lootQualityMask mismatch\", i->itemid);\n+            continue;\n+        }\n+\n+        if (_canLootItemForPlayer(player, creature, slot - 1) && loot_item.AllowedForPlayer(player, creature->GetGUID()))\n+        {\n+            canLoot = true;\n+            break;\n+        }\n+    }\n+    if (!canLoot)\n+    {\n+        QuestItemMap const& lootPlayerQuestItems = creature->loot.GetPlayerQuestItems();\n+        QuestItemMap::const_iterator q_itr = lootPlayerQuestItems.find(player->GetGUID());\n+        if (q_itr != lootPlayerQuestItems.end())\n+        {\n+            QuestItemList* q_list = q_itr->second;\n+            for (QuestItemList::const_iterator qi = q_list->begin(); qi != q_list->end(); ++qi)\n+            {\n+                LootItem* i = &creature->loot.quest_items[qi->index];\n+                if (i->is_looted || qi->is_looted)\n+                {\n+                    //BOT_LOG_ERROR(\"scripts\", \"item %u is looted\", i->itemid);\n+                    continue;\n+                }\n+\n+                if (!i->rollWinnerGUID.IsEmpty() && i->rollWinnerGUID != player->GetGUID())\n+                {\n+                    //BOT_LOG_ERROR(\"scripts\", \"can't loot item %u (%u), roll won\", slot, i->itemid);\n+                    continue;\n+                }\n+\n+                ItemTemplate const* itemProto = sObjectMgr->GetItemTemplate(i->itemid);\n+\n+                if (itemProto->Quality >= lootThreshold)\n+                {\n+                    //BOT_LOG_ERROR(\"scripts\", \"item %u group quality threshold mismatch\", i->itemid);\n+                    continue;\n+                }\n+\n+                if (!((1u << itemProto->Quality) & lootQualityMask))\n+                {\n+                    //BOT_LOG_ERROR(\"scripts\", \"item %u lootQualityMask mismatch\", i->itemid);\n+                    continue;\n+                }\n+\n+                uint8 qslot = uint8(creature->loot.items.size() + (qi - q_list->begin()));\n+\n+                if (_canLootItemForPlayer(player, creature, qslot) && i->AllowedForPlayer(player, creature->GetGUID()))\n+                {\n+                    canLoot = true;\n+                    break;\n+                }\n+            }\n+        }\n+    }\n+\n+    return canLoot;\n+}\n+bool bot_ai::_canLootCreature(Creature* creature) const\n+{\n+    if (creature->loot.gold)\n+        return true;\n+\n+    uint32 lootQualityMask = _getLootQualityMask();\n+    uint32 lootThreshold = _getLootQualityThreshold();\n+    //BOT_LOG_ERROR(\"scripts\", \"lootQualityMask %u, lootThreshold %u\", lootQualityMask, lootThreshold);\n+    bool canLootQuality = false;\n+\n+    //std::vector<LootItem> const& lootItems = loot->quest_items;\n+    for (LootItem const& qloot_item : creature->loot.quest_items)\n+    {\n+        ItemTemplate const* itemProto = sObjectMgr->GetItemTemplate(qloot_item.itemid);\n+        if (!itemProto)\n+        {\n+            //BOT_LOG_ERROR(\"scripts\", \"no item proto for itemId %u\", ci->itemid);\n+            return false;\n+        }\n+\n+        if (itemProto->Quality >= lootThreshold)\n+        {\n+            //BOT_LOG_ERROR(\"scripts\", \"item %u group quality threshold mismatch\", i->itemid);\n+            continue;\n+        }\n+\n+        if ((1u << itemProto->Quality) & lootQualityMask)\n+        {\n+            canLootQuality = true;\n+            break;\n+        }\n+    }\n+    if (!canLootQuality)\n+    {\n+        for (LootItem const& loot_item : creature->loot.items)\n+        {\n+            ItemTemplate const* itemProto = sObjectMgr->GetItemTemplate(loot_item.itemid);\n+            if (!itemProto)\n+            {\n+                //BOT_LOG_ERROR(\"scripts\", \"no item proto for itemId %u\", ci->itemid);\n+                return false;\n+            }\n+\n+            if (itemProto->Quality >= lootThreshold)\n+            {\n+                //BOT_LOG_ERROR(\"scripts\", \"item %u group quality threshold mismatch\", i->itemid);\n+                continue;\n+            }\n+\n+            if ((1u << itemProto->Quality) & lootQualityMask)\n+            {\n+                canLootQuality = true;\n+                break;\n+            }\n+        }\n+    }\n+\n+    if (!canLootQuality)\n+    {\n+        //BOT_LOG_ERROR(\"scripts\", \"can't loot by quality\");\n+        return false;\n+    }\n+\n+    bool canLootPlayers = false;\n+\n+    Group const* gr = master->GetGroup();\n+    if (!gr)\n+        canLootPlayers = _canLootCreatureForPlayer(master, creature, lootQualityMask, lootThreshold);\n+    else\n+    {\n+        for (GroupReference const* itr = gr->GetFirstMember(); itr != nullptr; itr = itr->next())\n+        {\n+            if (_canLootCreatureForPlayer(itr->GetSource(), creature, lootQualityMask, lootThreshold))\n+            {\n+                canLootPlayers = true;\n+                break;\n+            }\n+        }\n+    }\n+\n+    if (!canLootPlayers)\n+    {\n+        //BOT_LOG_ERROR(\"scripts\", \"can't loot by canLootPlayers\");\n+        return false;\n+    }\n+\n+    return true;\n+}\n+void bot_ai::_autoLootCreatureGold(Creature* creature) const\n+{\n+    Loot* loot = &creature->loot;\n+\n+    sScriptMgr->OnPlayerBeforeLootMoney(master, loot);\n+    loot->NotifyMoneyRemoved();\n+    Group const* gr = master->GetGroup();\n+    if (!gr)\n+    {\n+        master->ModifyMoney(loot->gold);\n+        master->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LOOT_MONEY, loot->gold);\n+\n+        WorldPacket data(SMSG_LOOT_MONEY_NOTIFY, 4 + 1);\n+        data << uint32(loot->gold);\n+        data << uint8(1);   // \"You loot...\"\n+        master->GetSession()->SendPacket(&data);\n+    }\n+    else\n+    {\n+        std::vector<Player*> players;\n+        players.reserve(gr->GetMembersCount());\n+        for (GroupReference const* itr = gr->GetFirstMember(); itr != nullptr; itr = itr->next())\n+        {\n+            Player* p = itr->GetSource();\n+            if (p && p->IsAtGroupRewardDistance(creature))\n+                players.push_back(p);\n+        }\n+\n+        uint32 bots_count = 0;\n+        if (BotCfg::GetNpcBotMoneyShareEnabled())\n+        {\n+            for (GroupReference const* itr = gr->GetFirstMember(); itr != nullptr; itr = itr->next())\n+            {\n+                Player const* member = itr->GetSource();\n+                if (!member || !member->IsInMap(creature) || !member->HaveBot())\n+                    continue;\n+\n+                for (auto const& [guid, bot] : *member->GetBotMgr()->GetBotMap())\n+                {\n+                    if (bot && bot->IsAlive() && bot->IsInMap(creature) && (gr->IsMember(guid) || !BotCfg::GetNpcBotMoneyShareGroupOnly()) &&\n+                        (member->GetMap()->IsDungeon() || creature->GetDistance(bot) <= sWorld->getFloatConfig(CONFIG_GROUP_XP_DISTANCE)))\n+                        ++bots_count;\n+                }\n+            }\n+        }\n+\n+        uint32 sharers_count = uint32(players.size()) + bots_count;\n+        uint32 goldPerPlayer = uint32(loot->gold / sharers_count);\n+\n+        for (Player* player : players)\n+        {\n+            player->ModifyMoney(goldPerPlayer);\n+            player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LOOT_MONEY, goldPerPlayer);\n+\n+            WorldPacket data(SMSG_LOOT_MONEY_NOTIFY, 4 + 1);\n+            data << uint32(goldPerPlayer);\n+            data << uint8(sharers_count <= 1); // Controls the text displayed in chat. 0 is \"Your share is...\" and 1 is \"You loot...\"\n+            player->SendDirectMessage(&data);\n+        }\n+    }\n+\n+    loot->gold = 0;\n+\n+    if (loot->isLooted())\n+    {\n+        //BOT_LOG_ERROR(\"scripts\", \"creature gold is looted, releasing\");\n+        creature->AllLootRemovedFromCorpse();\n+        creature->RemoveDynamicFlag(UNIT_DYNFLAG_LOOTABLE);\n+        loot->clear();\n+    }\n+}\n+void bot_ai::_autoLootCreatureItems(Player* receiver, Creature* creature, uint32 lootQualityMask, uint32 lootThreshold) const\n+{\n+    uint8 slot = 0;\n+    for (LootItem const& loot_item : creature->loot.items)\n+    {\n+        ++slot;\n+\n+        if (loot_item.is_blocked || loot_item.is_looted)\n+        {\n+            //BOT_LOG_ERROR(\"scripts\", \"item {} is blocked\", loot_item.itemid);\n+            continue;\n+        }\n+\n+        if (!loot_item.rollWinnerGUID.IsEmpty() && loot_item.rollWinnerGUID != receiver->GetGUID())\n+        {\n+            //BOT_LOG_ERROR(\"scripts\", \"can't loot item {} ({}), roll won\", slot, loot_item.itemid);\n+            continue;\n+        }\n+\n+        ItemTemplate const* itemProto = sObjectMgr->GetItemTemplate(loot_item.itemid);\n+\n+        if (itemProto->Quality >= lootThreshold)\n+            continue;\n+        if (!((1u << itemProto->Quality) & lootQualityMask))\n+            continue;\n+\n+        if (_canLootItemForPlayer(receiver, creature, slot - 1) && loot_item.AllowedForPlayer(receiver, creature->GetGUID()))\n+        {\n+            //BOT_LOG_ERROR(\"scripts\", \"looting %s (%u), quality %u, threshold %u\",\n+            //    itemProto->Name1.c_str(), itemProto->ItemId, itemProto->Quality, lootThreshold);\n+            InventoryResult msg;\n+            receiver->StoreLootItem(slot - 1, &creature->loot, msg);\n+        }\n+    }\n+\n+    QuestItemMap const& lootPlayerQuestItems = creature->loot.GetPlayerQuestItems();\n+    QuestItemMap::const_iterator q_itr = lootPlayerQuestItems.find(receiver->GetGUID());\n+    if (q_itr != lootPlayerQuestItems.end())\n+    {\n+        QuestItemList* q_list = q_itr->second;\n+        for (QuestItemList::const_iterator qi = q_list->begin(); qi != q_list->end(); ++qi)\n+        {\n+            LootItem const& i = creature->loot.quest_items[qi->index];\n+            if (i.is_looted || qi->is_looted)\n+            {\n+                //BOT_LOG_ERROR(\"scripts\", \"item %u is looted\", i->itemid);\n+                continue;\n+            }\n+\n+            if (!i.rollWinnerGUID.IsEmpty() && i.rollWinnerGUID != receiver->GetGUID())\n+            {\n+                //BOT_LOG_ERROR(\"scripts\", \"can't loot item %u (%u), roll won\", slot, i->itemid);\n+                continue;\n+            }\n+\n+            ItemTemplate const* itemProto = sObjectMgr->GetItemTemplate(i.itemid);\n+\n+            if (itemProto->Quality >= lootThreshold)\n+                continue;\n+            if (!((1u << itemProto->Quality) & lootQualityMask))\n+                continue;\n+\n+            //if (!receiver->HasQuestForItem(i->itemid))\n+            //    continue;\n+\n+            uint8 qslot = uint8(creature->loot.items.size() + (qi - q_list->begin()));\n+\n+            if (_canLootItemForPlayer(receiver, creature, qslot) && i.AllowedForPlayer(receiver, creature->GetGUID()))\n+            {\n+                InventoryResult msg;\n+                receiver->StoreLootItem(qslot, &creature->loot, msg);\n+            }\n+        }\n+    }\n+    if (creature->loot.isLooted())\n+    {\n+        //BOT_LOG_ERROR(\"scripts\", \"creature items is looted, releasing\");\n+        creature->AllLootRemovedFromCorpse();\n+        creature->RemoveDynamicFlag(UNIT_DYNFLAG_LOOTABLE);\n+        creature->loot.clear();\n+    }\n+}\n+void bot_ai::_autoLootCreature(Creature* creature)\n+{\n+    //money\n+    if (creature->loot.gold)\n+    {\n+        _autoLootCreatureGold(creature);\n+\n+        //nothing but gold was there\n+        if (creature->loot.empty())\n+            return;\n+    }\n+\n+    //items\n+    uint32 lootQualityMask = _getLootQualityMask();\n+    uint32 lootThreshold = _getLootQualityThreshold();\n+\n+    std::set<Player*> pLooters;\n+    Group* gr = master->GetGroup();\n+    if (!gr)\n+    {\n+        if (_canLootCreatureForPlayer(master, creature, lootQualityMask, lootThreshold))\n+            pLooters.insert(master);\n+    }\n+    else\n+    {\n+        for (GroupReference const* itr = gr->GetFirstMember(); itr != nullptr; itr = itr->next())\n+        {\n+            if (_canLootCreatureForPlayer(itr->GetSource(), creature, lootQualityMask, lootThreshold))\n+                pLooters.insert(itr->GetSource());\n+        }\n+    }\n+\n+    //creature->lootForBody = true;\n+\n+    if (gr && creature->loot.loot_type == LOOT_NONE)\n+    {\n+        switch (gr->GetLootMethod())\n+        {\n+            case GROUP_LOOT:        gr->GroupLoot(&creature->loot, creature);       break;\n+            case NEED_BEFORE_GREED: gr->NeedBeforeGreed(&creature->loot, creature); break;\n+            case MASTER_LOOT:       gr->MasterLoot(&creature->loot, creature);      break;\n+            default:                                                                break;\n+        }\n+    }\n+\n+    if (creature->loot.loot_type != LOOT_SKINNING)\n+        creature->loot.loot_type = LOOT_CORPSE;\n+\n+    Player* receiver = pLooters.size() == 1 ? *pLooters.begin() :\n+        creature->loot.roundRobinPlayer ? ObjectAccessor::GetPlayer(*creature, creature->loot.roundRobinPlayer) : nullptr;\n+\n+    if (!receiver)\n+    {\n+        if (pLooters.empty())\n+            return;\n+\n+        ASSERT(pLooters.size() >= 2);\n+\n+        do\n+        {\n+            receiver = Bcore::Containers::SelectRandomContainerElement(pLooters);\n+        } while (receiver == _prevRRobin);\n+    }\n+\n+    _prevRRobin = receiver;\n+\n+    _autoLootCreatureItems(receiver, creature, lootQualityMask, lootThreshold);\n+}\n+//////////\n+//EQUIPS//\n+//////////\n+bool bot_ai::_canUseOffHand(ItemTemplate const* with/* = nullptr*/, bool ignore_mh/* = false*/) const\n+{\n+    //bm can on only equip in main hand\n+    if (_botclass == BOT_CLASS_BM)\n+        return false;\n+    //sphynx can grab anything\n+    if (_botclass == BOT_CLASS_SPHYNX)\n+        return true;\n+    //dreadlord / cryptlord can on only equip in main hand\n+    if (_botclass == BOT_CLASS_DREADLORD || _botclass == BOT_CLASS_CRYPT_LORD)\n+        return false;\n+    //staff-only classes\n+    if (_botclass == BOT_CLASS_ARCHMAGE || _botclass == BOT_CLASS_NECROMANCER)\n+        return false;\n+\n+    //warrior can wield any offhand with titan's grip\n+    if (_botclass == BOT_CLASS_WARRIOR && me->GetLevel() >= 60 && GetSpec() == BOT_SPEC_WARRIOR_FURY)\n+        return true;\n+\n+    if (ignore_mh)\n+        return true;\n+\n+    ItemTemplate const* protoMH = with ? with : _equips[BOT_SLOT_MAINHAND] ? _equips[BOT_SLOT_MAINHAND]->GetTemplate() : nullptr;\n+\n+    //no mainhand weapon OR\n+    //mainhand is an one-hand weapon\n+    if (!protoMH)\n+        return true;\n+\n+    if (protoMH->Class == ITEM_CLASS_WEAPON &&\n+        (protoMH->InventoryType == INVTYPE_WEAPON || protoMH->InventoryType == INVTYPE_WEAPONMAINHAND) &&\n+        (protoMH->SubClass == ITEM_SUBCLASS_WEAPON_AXE || protoMH->SubClass == ITEM_SUBCLASS_WEAPON_DAGGER ||\n+        protoMH->SubClass == ITEM_SUBCLASS_WEAPON_FIST || protoMH->SubClass == ITEM_SUBCLASS_WEAPON_MACE ||\n+        protoMH->SubClass == ITEM_SUBCLASS_WEAPON_SWORD))\n+        return true;\n+\n+    //NO\n+    return false;\n+}\n+\n+bool bot_ai::_canUseRanged() const\n+{\n+    return (_botclass == BOT_CLASS_HUNTER || _botclass == BOT_CLASS_ROGUE ||\n+        _botclass == BOT_CLASS_WARRIOR || _botclass == BOT_CLASS_PRIEST ||\n+        _botclass == BOT_CLASS_MAGE || _botclass == BOT_CLASS_WARLOCK ||\n+        _botclass == BOT_CLASS_DARK_RANGER || _botclass == BOT_CLASS_SEA_WITCH);\n+}\n+\n+bool bot_ai::_canUseRelic() const\n+{\n+    return (_botclass == BOT_CLASS_PALADIN || _botclass == BOT_CLASS_SHAMAN ||\n+        _botclass == BOT_CLASS_DRUID || _botclass == BOT_CLASS_DEATH_KNIGHT);\n+}\n+\n+bool bot_ai::_canCombineWeapons(ItemTemplate const* mh, ItemTemplate const* oh) const\n+{\n+    return _canEquip(mh, BOT_SLOT_MAINHAND, true, nullptr, true) && _canEquip(oh, BOT_SLOT_OFFHAND, true, nullptr, true) && _canUseOffHand(mh);\n+}\n+\n+bool bot_ai::_canEquip(ItemTemplate const* newProto, uint8 slot, bool ignoreItemLevel, Item const* newItem/* = nullptr*/, bool ignore_combine/* = false*/) const\n+{\n+    EquipmentInfo const* einfo = BotDataMgr::GetBotEquipmentInfo(me->GetEntry());\n+\n+    if (Item const* oldItem = _equips[slot])\n+    {\n+        ItemTemplate const* oldProto = oldItem->GetTemplate();\n+        //prevent reequipping same items\n+        if (newProto->ItemId == oldProto->ItemId && (!newItem || !newItem->GetItemRandomPropertyId()))\n+            return false;\n+        //prevent equipping worse items (only standard or not)\n+        if (!ignoreItemLevel)\n+            if (slot > BOT_SLOT_RANGED || einfo->ItemEntry[slot] != oldProto->ItemId)\n+                if (IAmFree() || !master->IsGameMaster())\n+                    if (_getItemGearStatScore(oldProto, slot, oldItem) > _getItemGearStatScore(newProto, slot, newItem))\n+                        return false;\n+    }\n+\n+    if (slot == BOT_SLOT_OFFHAND && !_canUseOffHand(nullptr, ignore_combine))\n+        return false;\n+\n+    //level requirements\n+    if (me->GetLevel() < newProto->RequiredLevel)\n+        return false;\n+\n+    //class requirements\n+    if (_botclass < BOT_CLASS_EX_START && !(newProto->AllowableClass & (1u<<(_botclass-1))))\n+        return false;\n+\n+    //skip race requirements\n+\n+    //inventory related conditions\n+    if (newProto->Class == ITEM_CLASS_WEAPON)\n+    {\n+        switch (slot)\n+        {\n+            case BOT_SLOT_MAINHAND:\n+                switch (_botclass)\n+                {\n+                    case BOT_CLASS_BM:\n+                        if (newProto->SubClass != ITEM_SUBCLASS_WEAPON_POLEARM &&\n+                            newProto->SubClass != ITEM_SUBCLASS_WEAPON_AXE2 &&\n+                            newProto->SubClass != ITEM_SUBCLASS_WEAPON_SWORD2)\n+                            return false;\n+                        break;\n+                    case BOT_CLASS_ARCHMAGE:\n+                    case BOT_CLASS_NECROMANCER:\n+                        if (newProto->SubClass != ITEM_SUBCLASS_WEAPON_STAFF)\n+                            return false;\n+                        break;\n+                    default:\n+                        break;\n+                }\n+                break;\n+            case BOT_SLOT_OFFHAND:\n+                if (newProto->SubClass == ITEM_SUBCLASS_WEAPON_POLEARM || newProto->SubClass == ITEM_SUBCLASS_WEAPON_STAFF)\n+                    return false;\n+                switch (_botclass)\n+                {\n+                    case BOT_CLASS_DEATH_KNIGHT:\n+                    case BOT_CLASS_ROGUE:\n+                        break;\n+                    case BOT_CLASS_WARRIOR:\n+                    case BOT_CLASS_HUNTER:\n+                        if (me->GetLevel() < 20)\n+                            return false;\n+                        break;\n+                    case BOT_CLASS_SHAMAN:\n+                        if (me->GetLevel() < 40 || _spec != BOT_SPEC_SHAMAN_ENHANCEMENT)\n+                            return false;\n+                        break;\n+                    case BOT_CLASS_SPHYNX:\n+                        break;\n+                    case BOT_CLASS_DARK_RANGER:\n+                        break;\n+                    case BOT_CLASS_SEA_WITCH:\n+                        break;\n+                    default:\n+                        return false;\n+                }\n+                break;\n+            case BOT_SLOT_RANGED:\n+                if (!_canUseRanged())\n+                    return false;\n+                break;\n+            default:\n+                return false;\n+        }\n+\n+        switch (newProto->InventoryType)\n+        {\n+            case INVTYPE_WEAPONMAINHAND:\n+                if (slot != BOT_SLOT_MAINHAND)\n+                    return false;\n+                break;\n+            case INVTYPE_WEAPONOFFHAND:\n+                if (slot != BOT_SLOT_OFFHAND)\n+                    return false;\n+                break;\n+            case INVTYPE_2HWEAPON:\n+                switch (_botclass)\n+                {\n+                    case BOT_CLASS_WARRIOR:\n+                        switch (slot)\n+                        {\n+                            case BOT_SLOT_OFFHAND:\n+                                if (me->GetLevel() < 60)\n+                                    return false;\n+                                break;\n+                            case BOT_SLOT_RANGED:\n+                                return false;\n+                            default:\n+                                break;\n+                        }\n+                        break;\n+                    case BOT_CLASS_SPHYNX:\n+                        break;\n+                    default:\n+                        if (slot != BOT_SLOT_MAINHAND)\n+                            return false;\n+                        break;\n+                }\n+                break;\n+            case INVTYPE_WEAPON:\n+                if (slot != BOT_SLOT_MAINHAND && slot != BOT_SLOT_OFFHAND)\n+                    return false;\n+                break;\n+            case INVTYPE_THROWN:\n+            case INVTYPE_RANGED:\n+                if (slot != BOT_SLOT_RANGED)\n+                    return false;\n+                break;\n+            case INVTYPE_RANGEDRIGHT:\n+                switch (_botclass)\n+                {\n+                    case BOT_CLASS_SPHYNX:\n+                        if (slot != BOT_SLOT_MAINHAND && slot != BOT_SLOT_OFFHAND)\n+                            return false;\n+                        break;\n+                    default:\n+                        if (slot != BOT_SLOT_RANGED)\n+                            return false;\n+                        break;\n+                }\n+                break;\n+            default:\n+                return false;\n+        }\n+\n+        switch (_botclass)\n+        {\n+            case BOT_CLASS_WARRIOR:\n+                switch (newProto->SubClass)\n+                {\n+                    case ITEM_SUBCLASS_WEAPON_AXE:\n+                    case ITEM_SUBCLASS_WEAPON_AXE2:\n+                    case ITEM_SUBCLASS_WEAPON_MACE:\n+                    case ITEM_SUBCLASS_WEAPON_MACE2:\n+                    case ITEM_SUBCLASS_WEAPON_SWORD:\n+                    case ITEM_SUBCLASS_WEAPON_SWORD2:\n+                    case ITEM_SUBCLASS_WEAPON_POLEARM:\n+                    case ITEM_SUBCLASS_WEAPON_STAFF:\n+                    case ITEM_SUBCLASS_WEAPON_FIST:\n+                    case ITEM_SUBCLASS_WEAPON_DAGGER:\n+                    case ITEM_SUBCLASS_WEAPON_BOW:\n+                    case ITEM_SUBCLASS_WEAPON_CROSSBOW:\n+                    case ITEM_SUBCLASS_WEAPON_GUN:\n+                    case ITEM_SUBCLASS_WEAPON_THROWN:\n+                    //case ITEM_SUBCLASS_WEAPON_WAND:\n+                        break;\n+                    default:\n+                        return false;\n+                }\n+                break;\n+            case BOT_CLASS_PALADIN:\n+            case BOT_CLASS_DEATH_KNIGHT:\n+                switch (newProto->SubClass)\n+                {\n+                    case ITEM_SUBCLASS_WEAPON_AXE:\n+                    case ITEM_SUBCLASS_WEAPON_AXE2:\n+                    case ITEM_SUBCLASS_WEAPON_MACE:\n+                    case ITEM_SUBCLASS_WEAPON_MACE2:\n+                    case ITEM_SUBCLASS_WEAPON_SWORD:\n+                    case ITEM_SUBCLASS_WEAPON_SWORD2:\n+                    case ITEM_SUBCLASS_WEAPON_POLEARM:\n+                        break;\n+                    default:\n+                        return false;\n+                }\n+                break;\n+            case BOT_CLASS_HUNTER:\n+                switch (newProto->SubClass)\n+                {\n+                    case ITEM_SUBCLASS_WEAPON_AXE:\n+                    case ITEM_SUBCLASS_WEAPON_AXE2:\n+                    //case ITEM_SUBCLASS_WEAPON_MACE:\n+                    //case ITEM_SUBCLASS_WEAPON_MACE2:\n+                    case ITEM_SUBCLASS_WEAPON_SWORD:\n+                    case ITEM_SUBCLASS_WEAPON_SWORD2:\n+                    case ITEM_SUBCLASS_WEAPON_POLEARM:\n+                    case ITEM_SUBCLASS_WEAPON_STAFF:\n+                    case ITEM_SUBCLASS_WEAPON_FIST:\n+                    case ITEM_SUBCLASS_WEAPON_DAGGER:\n+                    case ITEM_SUBCLASS_WEAPON_BOW:\n+                    case ITEM_SUBCLASS_WEAPON_CROSSBOW:\n+                    case ITEM_SUBCLASS_WEAPON_GUN:\n+                    //case ITEM_SUBCLASS_WEAPON_THROWN: //hunters can use thrown but bots can't, also pointless\n+                        break;\n+                    default:\n+                        return false;\n+                }\n+                break;\n+            case BOT_CLASS_ROGUE:\n+                switch (newProto->SubClass)\n+                {\n+                    case ITEM_SUBCLASS_WEAPON_AXE:\n+                    case ITEM_SUBCLASS_WEAPON_MACE:\n+                    case ITEM_SUBCLASS_WEAPON_SWORD:\n+                    case ITEM_SUBCLASS_WEAPON_FIST:\n+                    case ITEM_SUBCLASS_WEAPON_DAGGER:\n+                    case ITEM_SUBCLASS_WEAPON_BOW:\n+                    case ITEM_SUBCLASS_WEAPON_CROSSBOW:\n+                    case ITEM_SUBCLASS_WEAPON_GUN:\n+                    case ITEM_SUBCLASS_WEAPON_THROWN:\n+                        break;\n+                    default:\n+                        return false;\n+                }\n+                break;\n+            case BOT_CLASS_PRIEST:\n+                switch (newProto->SubClass)\n+                {\n+                    case ITEM_SUBCLASS_WEAPON_MACE:\n+                    case ITEM_SUBCLASS_WEAPON_STAFF:\n+                    case ITEM_SUBCLASS_WEAPON_DAGGER:\n+                    case ITEM_SUBCLASS_WEAPON_WAND:\n+                        break;\n+                    default:\n+                        return false;\n+                }\n+                break;\n+            case BOT_CLASS_MAGE:\n+            case BOT_CLASS_WARLOCK:\n+                switch (newProto->SubClass)\n+                {\n+                    case ITEM_SUBCLASS_WEAPON_SWORD:\n+                    case ITEM_SUBCLASS_WEAPON_STAFF:\n+                    case ITEM_SUBCLASS_WEAPON_DAGGER:\n+                    case ITEM_SUBCLASS_WEAPON_WAND:\n+                        break;\n+                    default:\n+                        return false;\n+                }\n+                break;\n+            case BOT_CLASS_DRUID:\n+                switch (newProto->SubClass)\n+                {\n+                    case ITEM_SUBCLASS_WEAPON_MACE:\n+                    case ITEM_SUBCLASS_WEAPON_MACE2:\n+                    case ITEM_SUBCLASS_WEAPON_POLEARM:\n+                    case ITEM_SUBCLASS_WEAPON_STAFF:\n+                    case ITEM_SUBCLASS_WEAPON_FIST:\n+                    case ITEM_SUBCLASS_WEAPON_DAGGER:\n+                        break;\n+                    default:\n+                        return false;\n+                }\n+                break;\n+            case BOT_CLASS_SHAMAN:\n+                switch (newProto->SubClass)\n+                {\n+                    case ITEM_SUBCLASS_WEAPON_AXE:\n+                    case ITEM_SUBCLASS_WEAPON_AXE2:\n+                    case ITEM_SUBCLASS_WEAPON_MACE:\n+                    case ITEM_SUBCLASS_WEAPON_MACE2:\n+                    case ITEM_SUBCLASS_WEAPON_STAFF:\n+                    case ITEM_SUBCLASS_WEAPON_FIST:\n+                    case ITEM_SUBCLASS_WEAPON_DAGGER:\n+                        break;\n+                    default:\n+                        return false;\n+                }\n+                break;\n+            case BOT_CLASS_BM:\n+                switch (newProto->SubClass)\n+                {\n+                    case ITEM_SUBCLASS_WEAPON_AXE2:\n+                    case ITEM_SUBCLASS_WEAPON_SWORD2:\n+                    case ITEM_SUBCLASS_WEAPON_POLEARM:\n+                        break;\n+                    default:\n+                        return false;\n+                }\n+                break;\n+            case BOT_CLASS_SPHYNX:\n+                switch (newProto->SubClass)\n+                {\n+                    case ITEM_SUBCLASS_WEAPON_WAND:\n+                        break;\n+                    default:\n+                        return false;\n+                }\n+                break;\n+            case BOT_CLASS_ARCHMAGE:\n+            case BOT_CLASS_NECROMANCER:\n+                switch (newProto->SubClass)\n+                {\n+                    case ITEM_SUBCLASS_WEAPON_STAFF:\n+                        break;\n+                    default:\n+                        return false;\n+                }\n+                break;\n+            case BOT_CLASS_DREADLORD:\n+            case BOT_CLASS_CRYPT_LORD:\n+                switch (newProto->SubClass)\n+                {\n+                    case ITEM_SUBCLASS_WEAPON_AXE:\n+                    case ITEM_SUBCLASS_WEAPON_AXE2:\n+                    case ITEM_SUBCLASS_WEAPON_MACE:\n+                    case ITEM_SUBCLASS_WEAPON_MACE2:\n+                    case ITEM_SUBCLASS_WEAPON_SWORD:\n+                    case ITEM_SUBCLASS_WEAPON_SWORD2:\n+                    case ITEM_SUBCLASS_WEAPON_POLEARM:\n+                    case ITEM_SUBCLASS_WEAPON_STAFF:\n+                    case ITEM_SUBCLASS_WEAPON_FIST:\n+                    case ITEM_SUBCLASS_WEAPON_DAGGER:\n+                        break;\n+                    default:\n+                        return false;\n+                }\n+                break;\n+            case BOT_CLASS_SPELLBREAKER:\n+                switch (newProto->SubClass)\n+                {\n+                    case ITEM_SUBCLASS_WEAPON_AXE:\n+                    case ITEM_SUBCLASS_WEAPON_MACE:\n+                    case ITEM_SUBCLASS_WEAPON_SWORD:\n+                    case ITEM_SUBCLASS_WEAPON_FIST:\n+                    case ITEM_SUBCLASS_WEAPON_DAGGER:\n+                        break;\n+                    default:\n+                        return false;\n+                }\n+                break;\n+            case BOT_CLASS_DARK_RANGER:\n+                switch (newProto->SubClass)\n+                {\n+                    case ITEM_SUBCLASS_WEAPON_SWORD:\n+                    case ITEM_SUBCLASS_WEAPON_DAGGER:\n+                    case ITEM_SUBCLASS_WEAPON_BOW:\n+                        break;\n+                    default:\n+                        return false;\n+                }\n+                break;\n+            case BOT_CLASS_SEA_WITCH:\n+                switch (newProto->SubClass)\n+                {\n+                    case ITEM_SUBCLASS_WEAPON_DAGGER:\n+                    case ITEM_SUBCLASS_WEAPON_BOW:\n+                        break;\n+                    default:\n+                        return false;\n+                }\n+                break;\n+            default:\n+                return false;\n+        }\n+\n+        return true;\n+    }\n+    else if (newProto->Class == ITEM_CLASS_ARMOR/* || newProto->Class == ITEM_CLASS_QUEST*/)\n+    {\n+        switch (newProto->InventoryType)\n+        {\n+            case INVTYPE_HEAD:\n+                if (slot != BOT_SLOT_HEAD)\n+                    return false;\n+                break;\n+            case INVTYPE_SHOULDERS:\n+                if (slot != BOT_SLOT_SHOULDERS)\n+                    return false;\n+                break;\n+            case INVTYPE_BODY:\n+                if (slot != BOT_SLOT_BODY)\n+                    return false;\n+                switch (_botclass)\n+                {\n+                    case BOT_CLASS_SPHYNX:\n+                        return false;\n+                    default:\n+                        break;\n+                }\n+                break;\n+            case INVTYPE_CHEST:\n+            case INVTYPE_ROBE:\n+                if (slot != BOT_SLOT_CHEST)\n+                    return false;\n+                break;\n+            case INVTYPE_WAIST:\n+                if (slot != BOT_SLOT_WAIST)\n+                    return false;\n+                break;\n+            case INVTYPE_LEGS:\n+                if (slot != BOT_SLOT_LEGS)\n+                    return false;\n+                break;\n+            case INVTYPE_FEET:\n+                if (slot != BOT_SLOT_FEET)\n+                    return false;\n+                break;\n+            case INVTYPE_WRISTS:\n+                if (slot != BOT_SLOT_WRIST)\n+                    return false;\n+                break;\n+            case INVTYPE_HANDS:\n+                if (slot != BOT_SLOT_HANDS)\n+                    return false;\n+                break;\n+            case INVTYPE_FINGER:\n+                if (slot != BOT_SLOT_FINGER1 && slot != BOT_SLOT_FINGER2)\n+                    return false;\n+                switch (_botclass)\n+                {\n+                    case BOT_CLASS_SPHYNX:\n+                        return false;\n+                    default:\n+                        break;\n+                }\n+                break;\n+            case INVTYPE_TRINKET:\n+                if (slot != BOT_SLOT_TRINKET1 && slot != BOT_SLOT_TRINKET2)\n+                    return false;\n+                switch (_botclass)\n+                {\n+                    case BOT_CLASS_SPHYNX:\n+                        return false;\n+                    default:\n+                        break;\n+                }\n+                break;\n+            case INVTYPE_NECK:\n+                if (slot != BOT_SLOT_NECK)\n+                    return false;\n+                switch (_botclass)\n+                {\n+                    case BOT_CLASS_SPHYNX:\n+                        return false;\n+                    default:\n+                        break;\n+                }\n+                break;\n+            case INVTYPE_CLOAK:\n+                if (slot != BOT_SLOT_BACK)\n+                    return false;\n+                switch (_botclass)\n+                {\n+                    case BOT_CLASS_SPHYNX:\n+                        return false;\n+                    default:\n+                        break;\n+                }\n+                break;\n+            case INVTYPE_HOLDABLE:\n+            case INVTYPE_SHIELD:\n+                if (slot != BOT_SLOT_OFFHAND)\n+                    return false;\n+                switch (_botclass)\n+                {\n+                    case BOT_CLASS_SPHYNX:\n+                        return false;\n+                    default:\n+                        break;\n+                }\n+                break;\n+            case INVTYPE_RELIC:\n+                if (slot != BOT_SLOT_RANGED)\n+                    return false;\n+                break;\n+            default:\n+                return false;\n+        }\n+\n+        switch (newProto->SubClass)\n+        {\n+            case ITEM_SUBCLASS_ARMOR_SHIELD:\n+                if (slot != BOT_SLOT_OFFHAND)\n+                    return false;\n+                switch (_botclass)\n+                {\n+                    case BOT_CLASS_SPELLBREAKER:\n+                        break;\n+                    case BOT_CLASS_WARRIOR:\n+                    case BOT_CLASS_PALADIN:\n+                    case BOT_CLASS_SHAMAN:\n+                        break;\n+                    default:\n+                        return false;\n+                }\n+                break;\n+            case ITEM_SUBCLASS_ARMOR_PLATE:\n+                switch (_botclass)\n+                {\n+                    case BOT_CLASS_BM:\n+                    case BOT_CLASS_SPHYNX:\n+                    case BOT_CLASS_DREADLORD:\n+                    case BOT_CLASS_SPELLBREAKER:\n+                    case BOT_CLASS_CRYPT_LORD:\n+                        break;\n+                    case BOT_CLASS_WARRIOR:\n+                    case BOT_CLASS_PALADIN:\n+                    case BOT_CLASS_DEATH_KNIGHT:\n+                        if (me->GetLevel() >= 40 || newProto->Quality == ITEM_QUALITY_HEIRLOOM)\n+                            break;\n+                        return false;\n+                    default:\n+                        return false;\n+                }\n+                break;\n+            case ITEM_SUBCLASS_ARMOR_MAIL:\n+                switch (_botclass)\n+                {\n+                    case BOT_CLASS_BM:\n+                    case BOT_CLASS_SPHYNX:\n+                    case BOT_CLASS_SPELLBREAKER:\n+                    case BOT_CLASS_CRYPT_LORD:\n+                        break;\n+                    case BOT_CLASS_WARRIOR:\n+                    case BOT_CLASS_PALADIN:\n+                    case BOT_CLASS_DEATH_KNIGHT:\n+                        break;\n+                    case BOT_CLASS_SHAMAN:\n+                    case BOT_CLASS_HUNTER:\n+                        if (me->GetLevel() >= 40 || newProto->Quality == ITEM_QUALITY_HEIRLOOM)\n+                            break;\n+                        return false;\n+                    default:\n+                        return false;\n+                }\n+                break;\n+            case ITEM_SUBCLASS_ARMOR_LEATHER:\n+                switch (_botclass)\n+                {\n+                    case BOT_CLASS_DARK_RANGER:\n+                        break;\n+                    case BOT_CLASS_WARRIOR:\n+                    case BOT_CLASS_PALADIN:\n+                    case BOT_CLASS_DEATH_KNIGHT:\n+                    case BOT_CLASS_BM:\n+                    case BOT_CLASS_SHAMAN:\n+                    case BOT_CLASS_HUNTER:\n+                    case BOT_CLASS_ROGUE:\n+                    case BOT_CLASS_DRUID:\n+                        break;\n+                    default:\n+                        return false;\n+                }\n+                break;\n+            case ITEM_SUBCLASS_ARMOR_CLOTH:\n+                switch (_botclass)\n+                {\n+                    case BOT_CLASS_SPHYNX:\n+                        return false;\n+                    case BOT_CLASS_DREADLORD:\n+                    case BOT_CLASS_SPELLBREAKER:\n+                    case BOT_CLASS_CRYPT_LORD:\n+                        if (newProto->InventoryType != INVTYPE_CLOAK)\n+                            return false;\n+                        break;\n+                    default:\n+                        break;\n+                }\n+                break;\n+            case ITEM_SUBCLASS_ARMOR_MISC:\n+                switch (_botclass)\n+                {\n+                    case BOT_CLASS_SPHYNX:\n+                        return false;\n+                    default:\n+                        break;\n+                }\n+                break;\n+            case ITEM_SUBCLASS_ARMOR_LIBRAM:\n+                switch (_botclass)\n+                {\n+                    case BOT_CLASS_PALADIN:\n+                        break;\n+                    default:\n+                        return false;\n+                }\n+                break;\n+            case ITEM_SUBCLASS_ARMOR_IDOL:\n+                switch (_botclass)\n+                {\n+                    case BOT_CLASS_DRUID:\n+                        break;\n+                    default:\n+                        return false;\n+                }\n+                break;\n+            case ITEM_SUBCLASS_ARMOR_TOTEM:\n+                switch (_botclass)\n+                {\n+                    case BOT_CLASS_SHAMAN:\n+                        break;\n+                    default:\n+                        return false;\n+                }\n+                break;\n+            case ITEM_SUBCLASS_ARMOR_SIGIL:\n+                switch (_botclass)\n+                {\n+                    case BOT_CLASS_DEATH_KNIGHT:\n+                        break;\n+                    default:\n+                        return false;\n+                }\n+                break;\n+            default:\n+                return false;\n+        }\n+\n+        return true;\n+    }\n+\n+    return false;\n+}\n+\n+bool bot_ai::_isItemFitForWanderingBot(uint8 slot, ItemTemplate const* proto) const\n+{\n+    if (!_canEquip(proto, slot, true))\n+        return false;\n+\n+    auto item_stat_check = [](_ItemStat const& stat, uint32 wanted_stat) { return stat.ItemStatType == wanted_stat && stat.ItemStatValue > 0; };\n+    auto item_has_stat = [&item_stat_check](ItemTemplate const* itemProto, uint32 wanted_stat) {\n+        return std::ranges::any_of(itemProto->ItemStat, [=, &item_stat_check](_ItemStat const& stat) { return item_stat_check(stat, wanted_stat); });\n+    };\n+\n+    if (me->GetLevel() >= DEFAULT_MAX_LEVEL && me->GetMap()->IsBattlegroundOrArena() && Rand() < 50)\n+    {\n+        if (Rand() < 20 && proto->ItemLevel < 245)\n+            return false;\n+        if (Rand() < 10 && proto->ItemLevel < 264)\n+            return false;\n+\n+        switch (slot)\n+        {\n+            case BOT_SLOT_HEAD:\n+            case BOT_SLOT_SHOULDERS:\n+            case BOT_SLOT_CHEST:\n+            case BOT_SLOT_WAIST:\n+            case BOT_SLOT_LEGS:\n+            case BOT_SLOT_FEET:\n+            case BOT_SLOT_WRIST:\n+            case BOT_SLOT_HANDS:\n+                if (!item_has_stat(proto, ITEM_MOD_RESILIENCE_RATING))\n+                    return false;\n+                break;\n+            default:\n+                break;\n+        }\n+    }\n+\n+    switch (GetSpec())\n+    {\n+        case BOT_SPEC_WARRIOR_ARMS:\n+            switch (slot)\n+            {\n+                case BOT_SLOT_MAINHAND:\n+                    return proto->InventoryType == INVTYPE_2HWEAPON;\n+                default:\n+                    break;\n+            }\n+            break;\n+        case BOT_SPEC_WARRIOR_FURY:\n+            switch (slot)\n+            {\n+                case BOT_SLOT_MAINHAND:\n+                    return (me->GetLevel() < 60) ? (proto->InventoryType == INVTYPE_WEAPON || proto->InventoryType == INVTYPE_WEAPONMAINHAND) :\n+                        (proto->InventoryType == INVTYPE_2HWEAPON);\n+                case BOT_SLOT_OFFHAND:\n+                    return (me->GetLevel() < 60) ? (proto->InventoryType == INVTYPE_WEAPON || proto->InventoryType == INVTYPE_WEAPONOFFHAND) :\n+                        (proto->InventoryType == INVTYPE_2HWEAPON);\n+                default:\n+                    break;\n+            }\n+            break;\n+        case BOT_SPEC_WARRIOR_PROTECTION:\n+            switch (slot)\n+            {\n+                case BOT_SLOT_MAINHAND:\n+                    return proto->InventoryType == INVTYPE_WEAPON || proto->InventoryType == INVTYPE_WEAPONMAINHAND;\n+                case BOT_SLOT_OFFHAND:\n+                    return proto->InventoryType == INVTYPE_SHIELD;\n+                default:\n+                    break;\n+            }\n+            break;\n+        case BOT_SPEC_PALADIN_PROTECTION:\n+            switch (slot)\n+            {\n+                case BOT_SLOT_MAINHAND:\n+                    if (!(proto->InventoryType == INVTYPE_WEAPON || proto->InventoryType == INVTYPE_WEAPONMAINHAND))\n+                        return false;\n+                    if (me->GetLevel() < 70)\n+                        break;\n+                    return !item_has_stat(proto, ITEM_MOD_INTELLECT);\n+                case BOT_SLOT_OFFHAND:\n+                    if (!(proto->InventoryType == INVTYPE_SHIELD))\n+                        return false;\n+                    if (me->GetLevel() < 70)\n+                        break;\n+                    return !item_has_stat(proto, ITEM_MOD_INTELLECT);\n+                default:\n+                    break;\n+            }\n+            break;\n+        case BOT_SPEC_PALADIN_HOLY:\n+        case BOT_SPEC_SHAMAN_ELEMENTAL:\n+        case BOT_SPEC_SHAMAN_RESTORATION:\n+            switch (slot)\n+            {\n+                case BOT_SLOT_MAINHAND:\n+                    if (!(proto->InventoryType == INVTYPE_WEAPON || proto->InventoryType == INVTYPE_WEAPONMAINHAND))\n+                        return false;\n+                    if (me->GetLevel() < 70)\n+                        break;\n+                    return item_has_stat(proto, ITEM_MOD_INTELLECT);\n+                case BOT_SLOT_OFFHAND:\n+                    if (!(proto->InventoryType == INVTYPE_SHIELD))\n+                        return false;\n+                    if (me->GetLevel() < 70)\n+                        break;\n+                    return item_has_stat(proto, ITEM_MOD_INTELLECT);\n+                default:\n+                    if (me->GetLevel() < 70)\n+                        break;\n+                    return item_has_stat(proto, ITEM_MOD_INTELLECT);\n+            }\n+            break;\n+        case BOT_SPEC_PALADIN_RETRIBUTION:\n+            switch (slot)\n+            {\n+                case BOT_SLOT_MAINHAND:\n+                    return proto->InventoryType == INVTYPE_2HWEAPON;\n+                default:\n+                    break;\n+            }\n+            break;\n+        case BOT_SPEC_HUNTER_BEASTMASTERY:\n+        case BOT_SPEC_HUNTER_MARKSMANSHIP:\n+        case BOT_SPEC_HUNTER_SURVIVAL:\n+            switch (slot)\n+            {\n+                case BOT_SLOT_TRINKET1: case BOT_SLOT_TRINKET2:\n+                    break;\n+                default:\n+                    if (me->GetLevel() < 70)\n+                        break;\n+                    return item_has_stat(proto, ITEM_MOD_AGILITY);\n+                    break;\n+            }\n+            break;\n+        case BOT_SPEC_ROGUE_ASSASINATION:\n+            switch (slot)\n+            {\n+                case BOT_SLOT_MAINHAND: case BOT_SLOT_OFFHAND:\n+                    return proto->SubClass == ITEM_SUBCLASS_WEAPON_DAGGER;\n+                case BOT_SLOT_RANGED:\n+                    return me->GetLevel() < 64 || proto->SubClass == ITEM_SUBCLASS_WEAPON_THROWN;\n+                default:\n+                    break;\n+            }\n+            break;\n+        case BOT_SPEC_ROGUE_COMBAT:\n+            switch (slot)\n+            {\n+                case BOT_SLOT_MAINHAND: case BOT_SLOT_OFFHAND:\n+                    return proto->SubClass == ITEM_SUBCLASS_WEAPON_SWORD || proto->SubClass == ITEM_SUBCLASS_WEAPON_AXE;\n+                case BOT_SLOT_RANGED:\n+                    return me->GetLevel() < 64 || proto->SubClass == ITEM_SUBCLASS_WEAPON_THROWN;\n+                default:\n+                    break;\n+            }\n+            break;\n+        case BOT_SPEC_ROGUE_SUBTLETY:\n+            switch (slot)\n+            {\n+                case BOT_SLOT_MAINHAND: case BOT_SLOT_OFFHAND:\n+                    return proto->SubClass == ITEM_SUBCLASS_WEAPON_MACE;\n+                case BOT_SLOT_RANGED:\n+                    return me->GetLevel() < 64 || proto->SubClass == ITEM_SUBCLASS_WEAPON_THROWN;\n+                default:\n+                    break;\n+            }\n+            break;\n+        case BOT_SPEC_DK_FROST:\n+            switch (slot)\n+            {\n+                case BOT_SLOT_MAINHAND:\n+                    return me->GetLevel() < 61 || proto->InventoryType == INVTYPE_2HWEAPON;\n+                default:\n+                    break;\n+            }\n+            break;\n+        case BOT_SPEC_SHAMAN_ENHANCEMENT:\n+            switch (slot)\n+            {\n+                case BOT_SLOT_OFFHAND:\n+                    return proto->InventoryType == INVTYPE_WEAPON || proto->InventoryType == INVTYPE_WEAPONOFFHAND;\n+                case BOT_SLOT_TRINKET1: case BOT_SLOT_TRINKET2:\n+                    break;\n+                default:\n+                    if (me->GetLevel() < 70)\n+                        break;\n+                    return item_has_stat(proto, ITEM_MOD_AGILITY);\n+            }\n+            break;\n+        case BOT_SPEC_DRUID_FERAL:\n+            switch (slot)\n+            {\n+                case BOT_SLOT_TRINKET1: case BOT_SLOT_TRINKET2:\n+                    break;\n+                case BOT_SLOT_MAINHAND:\n+                    if (proto->InventoryType != INVTYPE_2HWEAPON)\n+                        return false;\n+                [[fallthrough]];\n+                default:\n+                    if (me->GetLevel() < 70)\n+                        break;\n+                    return item_has_stat(proto, ITEM_MOD_AGILITY);\n+            }\n+            break;\n+        case BOT_SPEC_DRUID_BALANCE:\n+            switch (slot)\n+            {\n+                case BOT_SLOT_TRINKET1: case BOT_SLOT_TRINKET2:\n+                    break;\n+                default:\n+                    if (me->GetLevel() < 70)\n+                        break;\n+                    return item_has_stat(proto, ITEM_MOD_INTELLECT);\n+            }\n+            break;\n+        default:\n+            break;\n+    }\n+\n+    return true;\n+}\n+\n+\n+void bot_ai::_removeEquipment(uint8 slot)\n+{\n+    Item* item = _equips[slot];\n+    if (!item)\n+        return; //already unequipped\n+\n+    _usableItemSlotsMask &= ~(1ul << slot);\n+\n+    RemoveItemBonuses(slot);\n+    ApplyItemSetBonuses(item, false);\n+\n+    if (slot == BOT_SLOT_OFFHAND)\n+    {\n+        if (me->CanDualWield())\n+            me->SetCanDualWield(false);\n+        if (!(me->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_NO_BLOCK))\n+            const_cast<CreatureTemplate*>(me->GetCreatureTemplate())->flags_extra |= CREATURE_FLAG_EXTRA_NO_BLOCK;\n+    }\n+\n+    _equips[slot] = nullptr;\n+}\n+\n+BotEquipResult bot_ai::_unequip(uint8 slot, ObjectGuid receiver, bool store_to_bank, bool on_equip_from_bank/* = false*/)\n+{\n+    EquipmentInfo const* einfo = BotDataMgr::GetBotEquipmentInfo(me->GetEntry());\n+\n+    Item* item = _equips[slot];\n+    if (!item)\n+        return BotEquipResult::BOT_EQUIP_RESULT_OK; //already unequipped\n+\n+    if (store_to_bank)\n+    {\n+        if (!receiver || IAmFree())\n+            return BotEquipResult::BOT_EQUIP_RESULT_FAIL_NO_RECEIVER;\n+        if (receiver != master->GetGUID())\n+            return BotEquipResult::BOT_EQUIP_RESULT_FAIL_INVALID_RECEIVER;\n+        if (!BotDataMgr::CanDepositBotBankItemsCount(receiver, on_equip_from_bank ? 0 : 1))\n+            return BotEquipResult::BOT_EQUIP_RESULT_FAIL_NO_BANK_SPACE;\n+    }\n+\n+    uint32 itemId = item->GetEntry();\n+\n+    BotLogger::Log(NPCBOT_LOG_UNEQUIP, me, uint32(slot), uint32(item->GetGUID().GetCounter()), uint32(itemId), uint32(receiver.GetCounter()));\n+\n+    // !! All errors must be returned BEFORE we remove equipment, we have to store dangling item somewhere and only return BOT_EQUIP_RESULT_OK !!\n+\n+    _removeEquipment(slot);\n+\n+    //hand old weapon to master\n+    if (receiver && (slot > BOT_SLOT_RANGED || einfo->ItemEntry[slot] != itemId))\n+    {\n+        if (receiver == master->GetGUID())\n+        {\n+            ItemPosCountVec dest;\n+            uint32 no_space = 0;\n+\n+            if (store_to_bank)\n+            {\n+                BotDataMgr::DepositBotBankItem(receiver, item);\n+            }\n+            else if (master->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, itemId, 1, &no_space) != EQUIP_ERR_OK)\n+            {\n+                std::ostringstream istr;\n+                _AddItemLink(master, item, istr, false);\n+                ChatHandler ch(master->GetSession());\n+                ch.PSendSysMessage(LocalizedNpcText(master, BOT_TEXT_CANT_UNEQUIP_MAILING).c_str(), istr.view().data());\n+\n+                item->SetOwnerGUID(master->GetGUID());\n+\n+                CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();\n+                item->FSetState(ITEM_CHANGED);\n+                item->SaveToDB(trans);\n+                MailDraft(istr.str(), \"\").AddItem(item).SendMailTo(trans, MailReceiver(master), MailSender(me));\n+                CharacterDatabase.CommitTransaction(trans);\n+            }\n+            else\n+            {\n+                Item* pItem = master->StoreItem(dest, item, true);\n+                master->SendNewItem(pItem, 1, true, false, false);\n+            }\n+        }\n+        else\n+        {\n+            item->SetOwnerGUID(receiver);\n+\n+            CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();\n+            item->FSetState(ITEM_CHANGED);\n+            item->SaveToDB(trans);\n+            const std::string& subject = LocalizedNpcText(nullptr, BOT_TEXT_OWNERSHIP_EXPIRED);\n+            MailDraft(subject, \"\").AddItem(item).SendMailTo(trans, MailReceiver(receiver.GetCounter()), MailSender(me));\n+            CharacterDatabase.CommitTransaction(trans);\n+        }\n+    }\n+    else\n+    {\n+        //slot < BOT_SLOT_RANGED && einfo->ItemEntry[slot] == itemId\n+        //we have our standard weapon which we should get rid of\n+        //item->SetState(ITEM_REMOVED, master); //delete Item object\n+        delete item; //!Invalidated!\n+        //item = nullptr; //already in \"_updateEquips(slot, nullptr);\"\n+    }\n+\n+    if (slot <= BOT_SLOT_RANGED && CanChangeEquip(slot)) //weapons\n+    {\n+        me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + slot, 0);\n+        me->SetAttackTime(WeaponAttackType(slot), BASE_ATTACK_TIME); //without weapon\n+    }\n+\n+    _updateEquips(slot, nullptr);\n+\n+    return BotEquipResult::BOT_EQUIP_RESULT_OK;\n+}\n+\n+BotEquipResult bot_ai::_equip(uint8 slot, Item* newItem, ObjectGuid receiver, bool store_to_bank, bool from_bank/* = false*/)\n+{\n+    ASSERT(newItem);\n+\n+    EquipmentInfo const* einfo = BotDataMgr::GetBotEquipmentInfo(me->GetEntry());\n+    ItemTemplate const* proto = newItem->GetTemplate();\n+\n+    if (newItem->GetState() == ITEM_REMOVED)\n+    {\n+        BOT_LOG_ERROR(\"entities.player\",\n+            \"minion_ai::_equip(): player {} ({}) is trying to make bot {} (id: {}) equip item: {} (id: {}, {}) which has state ITEM_REMOVED!\",\n+            master->GetName().c_str(), master->GetGUID().ToString().c_str(), me->GetName().c_str(), me->GetEntry(), proto->Name1.c_str(), proto->ItemId, newItem->GetGUID().ToString().c_str());\n+        return BotEquipResult::BOT_EQUIP_RESULT_FAIL_NO_ITEM;\n+    }\n+\n+    uint32 newItemId = newItem->GetEntry();\n+\n+    if (Item const* oldItem = _equips[slot])\n+    {\n+        //same id\n+        if (oldItem->GetEntry() == newItemId && !newItem->GetItemRandomPropertyId())\n+            return BotEquipResult::BOT_EQUIP_RESULT_FAIL_SAME_ID;\n+    }\n+\n+    BotEquipResult unequip_result = _unequip(slot, receiver, store_to_bank, from_bank);\n+    if (unequip_result != BotEquipResult::BOT_EQUIP_RESULT_OK)\n+        return unequip_result;\n+\n+    ObjectGuid itemGuid = newItem->GetGUID();\n+\n+    BotLogger::Log(NPCBOT_LOG_EQUIP, me, uint32(slot), uint32(itemGuid.GetCounter()), uint32(newItemId), uint32(receiver.GetCounter()));\n+\n+    if (receiver && (slot > BOT_SLOT_RANGED || einfo->ItemEntry[slot] != newItemId))\n+    {\n+        ASSERT(receiver == master->GetGUID());\n+\n+        //cheating\n+        if ((newItem->GetOwnerGUID() && newItem->GetOwnerGUID() != master->GetGUID()) ||\n+            (from_bank ? !BotDataMgr::WithdrawBotBankItem(receiver, itemGuid.GetCounter()) : !master->HasItemCount(newItemId, 1)))\n+        {\n+            BOT_LOG_ERROR(\"entities.player\",\n+                \"bot_ai::_equip(): player {} ({}) is trying to make bot {} (id: {}) equip item: {} (id: {}, {}) but either does not have this item or does not own it (bank: {})\",\n+                master->GetName(), master->GetGUID().ToString(), me->GetName(), me->GetEntry(), proto->Name1, proto->ItemId, itemGuid.ToString(), uint32(from_bank));\n+            return BotEquipResult::BOT_EQUIP_RESULT_FAIL_NO_ITEM;\n+        }\n+\n+        if (!from_bank)\n+            master->MoveItemFromInventory(newItem->GetBagSlot(), newItem->GetSlot(), true);\n+    }\n+\n+    if (slot <= BOT_SLOT_RANGED)\n+    {\n+        if (CanChangeEquip(slot))\n+        {\n+            NpcBotTransmogData const* transmogData = BotDataMgr::SelectNpcBotTransmogs(me->GetEntry());\n+            if (einfo->ItemEntry[slot] != newItemId && transmogData && BotCfg::IsTransmogEnabled() && (transmogData->transmogs[slot].first == newItemId ||BotCfg::TransmogUseEquipmentSlots()) &&\n+                transmogData->transmogs[slot].second >= 0)\n+                me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + slot, uint32(transmogData->transmogs[slot].second));\n+            else\n+                me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + slot, newItemId);\n+        }\n+        uint32 delay =\n+            /*einfo->ItemEntry[slot] != newItemId || */RespectEquipsAttackTime() || slot == BOT_SLOT_OFFHAND ? proto->Delay :\n+            slot == BOT_SLOT_RANGED ? me->GetCreatureTemplate()->RangeAttackTime : me->GetCreatureTemplate()->BaseAttackTime;\n+        //attack time will be updated in SetStats() -> OnMeleeDamageUpdate()\n+        if (!me->IsInFeralForm())\n+            me->SetAttackTime(WeaponAttackType(slot), delay); //set attack speed\n+    }\n+\n+    if (IsUsableItem(newItem))\n+    {\n+        uint32 slotMask = 1ul << slot;\n+        ASSERT(!(_usableItemSlotsMask & slotMask));\n+        _usableItemSlotsMask |= slotMask;\n+    }\n+\n+    _updateEquips(slot, newItem);\n+\n+    //only for non-standard items\n+    if (slot > BOT_SLOT_RANGED || einfo->ItemEntry[slot] != newItemId)\n+        ApplyItemBonuses(slot);\n+    ApplyItemSetBonuses(newItem, true);\n+\n+    if (slot == BOT_SLOT_OFFHAND)\n+    {\n+        if (proto->Class == ITEM_CLASS_WEAPON)\n+        {\n+            if (!me->CanDualWield())\n+                me->SetCanDualWield(true);\n+        }\n+        else if (proto->Class == ITEM_CLASS_ARMOR && proto->SubClass == ITEM_SUBCLASS_ARMOR_SHIELD)\n+        {\n+            if (me->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_NO_BLOCK)\n+                const_cast<CreatureTemplate*>(me->GetCreatureTemplate())->flags_extra &= ~CREATURE_FLAG_EXTRA_NO_BLOCK;\n+        }\n+    }\n+    else if (slot == BOT_SLOT_MAINHAND)\n+    {\n+        if (proto->InventoryType == INVTYPE_2HWEAPON && !(_botclass == BOT_CLASS_WARRIOR && me->GetLevel() >= 60 && GetSpec() == BOT_SPEC_WARRIOR_FURY))\n+        {\n+            //if have incompatible offhand unequip it\n+            if (_equips[BOT_SLOT_OFFHAND] != nullptr)\n+                if (_unequip(BOT_SLOT_OFFHAND, receiver, store_to_bank) != BotEquipResult::BOT_EQUIP_RESULT_OK)\n+                    return BotEquipResult::BOT_EQUIP_RESULT_FAIL_LINKED_UNEQUIP_FAILED;\n+        }\n+        else if (_equips[BOT_SLOT_OFFHAND] == nullptr && einfo->ItemEntry[BOT_SLOT_OFFHAND])\n+            if (_resetEquipment(BOT_SLOT_OFFHAND, receiver, store_to_bank) != BotEquipResult::BOT_EQUIP_RESULT_OK)\n+                return BotEquipResult::BOT_EQUIP_RESULT_FAIL_LINKED_RESET_FAILED;\n+    }\n+\n+    //send info to class ai\n+    if (proto->Class == ITEM_CLASS_WEAPON)\n+    {\n+        if (slot == BOT_SLOT_MAINHAND)\n+        {\n+            SetAIMiscValue(BOTAI_MISC_DAGGER_MAINHAND, proto->SubClass == ITEM_SUBCLASS_WEAPON_DAGGER);\n+            SetAIMiscValue(BOTAI_MISC_ENCHANT_TIMER_MH, uint32(newItem->GetEnchantmentId(TEMP_ENCHANTMENT_SLOT) ? 0 : 1));\n+            SetAIMiscValue(BOTAI_MISC_WEAPON_SPEC, proto->SubClass);\n+        }\n+        if (slot == BOT_SLOT_OFFHAND)\n+        {\n+            SetAIMiscValue(BOTAI_MISC_DAGGER_OFFHAND, proto->SubClass == ITEM_SUBCLASS_WEAPON_DAGGER);\n+            SetAIMiscValue(BOTAI_MISC_ENCHANT_TIMER_OH, uint32(newItem->GetEnchantmentId(TEMP_ENCHANTMENT_SLOT) ? 0 : 1));\n+        }\n+    }\n+\n+    return BotEquipResult::BOT_EQUIP_RESULT_OK;\n+}\n+\n+void bot_ai::_updateEquips(uint8 slot, Item* item)\n+{\n+    _equips[slot] = item;\n+    BotDataMgr::UpdateNpcBotData(me->GetEntry(), NPCBOT_UPDATE_EQUIPS, _equips.data());\n+}\n+//Called from gossip menu only (applies only to weapons)\n+BotEquipResult bot_ai::_resetEquipment(uint8 slot, ObjectGuid receiver, bool store_to_bank)\n+{\n+    if (IsWanderer())\n+    {\n+        BOT_LOG_ERROR(\"scripts\", \"bot_ai::_resetEquipment() is called for wanderer bot {} ({}), slot {}!\",\n+            me->GetName().c_str(), me->GetEntry(), uint32(slot));\n+        return BotEquipResult::BOT_EQUIP_RESULT_FAIL_WANDERER;\n+    }\n+\n+    ASSERT(slot <= BOT_SLOT_RANGED);\n+\n+    EquipmentInfo const* einfo = BotDataMgr::GetBotEquipmentInfo(me->GetEntry());\n+    uint32 itemId = einfo->ItemEntry[slot];\n+    Item const* oldItem = _equips[slot];\n+\n+    BotLogger::Log(NPCBOT_LOG_EQUIP_RESET, me, uint32(slot), uint32(oldItem ? oldItem->GetGUID().GetCounter() : 0), uint32(oldItem ? oldItem->GetEntry() : 0), uint32(receiver.GetCounter()), uint32(itemId));\n+\n+    if (!itemId)\n+        return _unequip(slot, receiver, store_to_bank);\n+    else if (oldItem)\n+        if (oldItem->GetEntry() == itemId)\n+            return BotEquipResult::BOT_EQUIP_RESULT_OK;\n+\n+    if (slot == BOT_SLOT_MAINHAND && !(_botclass == BOT_CLASS_WARRIOR && me->GetLevel() >= 60 && GetSpec() == BOT_SPEC_WARRIOR_FURY))\n+    {\n+        if (ItemTemplate const* proto = sObjectMgr->GetItemTemplate(itemId))\n+        {\n+            if (proto->Class == ITEM_CLASS_WEAPON &&\n+                (proto->SubClass == ITEM_SUBCLASS_WEAPON_AXE2 || proto->SubClass == ITEM_SUBCLASS_WEAPON_MACE2 ||\n+                proto->SubClass == ITEM_SUBCLASS_WEAPON_SWORD2 || proto->SubClass == ITEM_SUBCLASS_WEAPON_POLEARM ||\n+                proto->SubClass == ITEM_SUBCLASS_WEAPON_STAFF || proto->SubClass == ITEM_SUBCLASS_WEAPON_SPEAR))\n+            {\n+                BotEquipResult unequip_offhand_result = _unequip(BOT_SLOT_OFFHAND, receiver, store_to_bank);\n+                if (unequip_offhand_result != BotEquipResult::BOT_EQUIP_RESULT_OK)\n+                    return BotEquipResult::BOT_EQUIP_RESULT_FAIL_LINKED_UNEQUIP_FAILED;\n+            }\n+        }\n+    }\n+\n+    //we have our standard weapon itemId which we should use to create new item\n+    Item* stItem = Item::CreateItem(itemId, 1, nullptr);\n+    ASSERT(stItem, \"Failed to create standard Item for bot!\");\n+\n+    BotEquipResult equip_result = _equip(slot, stItem, receiver, store_to_bank);\n+    if (equip_result != BotEquipResult::BOT_EQUIP_RESULT_OK)\n+    {\n+        BOT_LOG_ERROR(\"entities.player\", \"minion_ai::_resetEquipment(): player {} ({}) failed to reset equipment for bot {} (id: {}) in slot {}\",\n+            master->GetName().c_str(), master->GetGUID().ToString().c_str(), me->GetName().c_str(), me->GetEntry(), slot);\n+        return equip_result;\n+    }\n+    return BotEquipResult::BOT_EQUIP_RESULT_OK;\n+}\n+\n+void bot_ai::ApplyItemBonuses(uint8 slot)\n+{\n+    //ensurance to set zeros\n+    RemoveItemBonuses(slot);\n+\n+    Item* item = _equips[slot];\n+    if (!item)\n+        return;\n+\n+    ItemTemplate const* proto = sObjectMgr->GetItemTemplate(item->GetEntry());\n+    if (!proto)\n+        return;\n+\n+    ScalingStatDistributionEntry const* ssd = proto->ScalingStatDistribution ? sScalingStatDistributionStore.LookupEntry(proto->ScalingStatDistribution) : nullptr;\n+\n+    uint32 ssd_level = me->GetLevel();\n+    if (ssd && ssd_level > ssd->MaxLevel)\n+        ssd_level = ssd->MaxLevel;\n+\n+    ScalingStatValuesEntry const* ssv = proto->ScalingStatValue ? sScalingStatValuesStore.LookupEntry(ssd_level) : nullptr;\n+\n+    for (auto i : NPCBots::index_array<uint8, MAX_ITEM_PROTO_STATS>)\n+    {\n+        uint32 statType = 0;\n+        int32  val      = 0;\n+        if (ssd && ssv)\n+        {\n+            if (ssd->StatMod[i] < 0)\n+                continue;\n+            statType = ssd->StatMod[i];\n+            val = (ssv->getssdMultiplier(proto->ScalingStatValue) * ssd->Modifier[i]) / 10000;\n+        }\n+        else\n+        {\n+            if (i >= proto->StatsCount)\n+                continue;\n+            statType = proto->ItemStat[i].ItemStatType;\n+            val = proto->ItemStat[i].ItemStatValue;\n+        }\n+\n+        if (val == 0)\n+            continue;\n+\n+        _stats[slot][statType] += val;\n+    }\n+\n+    _stats[slot][BOT_STAT_MOD_RESIST_HOLY] += proto->HolyRes;\n+    _stats[slot][BOT_STAT_MOD_RESIST_FIRE] += proto->FireRes;\n+    _stats[slot][BOT_STAT_MOD_RESIST_NATURE] += proto->NatureRes;\n+    _stats[slot][BOT_STAT_MOD_RESIST_FROST] += proto->FrostRes;\n+    _stats[slot][BOT_STAT_MOD_RESIST_SHADOW] += proto->ShadowRes;\n+    _stats[slot][BOT_STAT_MOD_RESIST_ARCANE] += proto->ArcaneRes;\n+\n+    _stats[slot][BOT_STAT_MOD_ARMOR] += proto->Armor;\n+    _stats[slot][BOT_STAT_MOD_BLOCK_VALUE] += proto->Block;\n+\n+    EquipmentInfo const* einfo = BotDataMgr::GetBotEquipmentInfo(me->GetEntry());\n+    if (slot > BOT_SLOT_RANGED || item->GetEntry() != einfo->ItemEntry[slot])\n+    {\n+        if (ssv)\n+        {\n+            int32 extraDPS = ssv->getDPSMod(proto->ScalingStatValue);\n+            if (extraDPS)\n+            {\n+                float average = extraDPS * proto->Delay / 1000.0f;\n+                float mod = ssv->IsTwoHand(proto->ScalingStatValue) ? 0.2f : 0.3f;\n+\n+                _stats[slot][BOT_STAT_MOD_DAMAGE_MIN] += (1.0f - mod) * average;\n+                _stats[slot][BOT_STAT_MOD_DAMAGE_MAX] += (1.0f + mod) * average;\n+            }\n+        }\n+        else\n+        {\n+            _stats[slot][BOT_STAT_MOD_DAMAGE_MIN] += proto->Damage[0].DamageMin + proto->Damage[1].DamageMin;\n+            _stats[slot][BOT_STAT_MOD_DAMAGE_MAX] += proto->Damage[0].DamageMax + proto->Damage[1].DamageMax;\n+        }\n+\n+        if (_botclass == BOT_CLASS_DRUID)\n+        {\n+            int32 dpsMod = 0;\n+            int32 feral_bonus = 0;\n+\n+            if (ssv)\n+            {\n+                dpsMod = ssv->getDPSMod(proto->ScalingStatValue);\n+                feral_bonus += ssv->getFeralBonus(proto->ScalingStatValue);\n+            }\n+\n+            feral_bonus += proto->getFeralBonus(dpsMod);\n+            if (feral_bonus)\n+                _stats[slot][BOT_STAT_MOD_FERAL_ATTACK_POWER] += feral_bonus;\n+                //ApplyFeralAPBonus(feral_bonus, apply);\n+        }\n+    }\n+\n+    ApplyItemEnchantments(item, slot);\n+    ApplyItemEquipSpells(item, true);\n+\n+    shouldUpdateStats = true;\n+}\n+\n+void bot_ai::RemoveItemBonuses(uint8 slot)\n+{\n+    Item* item = _equips[slot];\n+    if (!item)\n+        return;\n+\n+    ItemTemplate const* proto = sObjectMgr->GetItemTemplate(item->GetEntry());\n+    if (!proto)\n+        return;\n+\n+    for (auto i : NPCBots::index_array<uint8, MAX_BOT_ITEM_MOD>)\n+        _stats[slot][i] = 0;\n+\n+    RemoveItemEnchantments(item); //remove spells\n+    ApplyItemEquipSpells(item, false);\n+\n+    shouldUpdateStats = true;\n+}\n+\n+void bot_ai::ApplyItemEnchantments(Item* item, uint8 slot)\n+{\n+    for (auto i : NPCBots::index_array<uint8, MAX_ENCHANTMENT_SLOT>)\n+        ApplyItemEnchantment(item, EnchantmentSlot(i), slot);\n+}\n+\n+void bot_ai::ApplyItemEnchantment(Item* item, EnchantmentSlot eslot, uint8 slot)\n+{\n+    uint32 enchant_id = item->GetEnchantmentId(eslot);\n+    if (!enchant_id)\n+        return;\n+\n+    SpellItemEnchantmentEntry const* pEnchant = sSpellItemEnchantmentStore.LookupEntry(enchant_id);\n+    if (!pEnchant)\n+        return;\n+\n+    if (pEnchant->requiredLevel > me->GetLevel())\n+        return;\n+\n+    uint32 enchant_display_type;\n+    uint32 enchant_amount;\n+    uint32 enchant_spell_id;\n+\n+    for (auto s : NPCBots::index_array<uint8, MAX_SPELL_ITEM_ENCHANTMENT_EFFECTS>)\n+    {\n+        enchant_display_type = pEnchant->type[s];\n+        enchant_amount = pEnchant->amount[s];\n+        enchant_spell_id = pEnchant->spellid[s];\n+\n+        switch (enchant_display_type)\n+        {\n+            case ITEM_ENCHANTMENT_TYPE_DAMAGE:\n+                _stats[slot][BOT_STAT_MOD_DAMAGE_MIN] += enchant_amount;\n+                _stats[slot][BOT_STAT_MOD_DAMAGE_MAX] += enchant_amount;\n+                break;\n+            case ITEM_ENCHANTMENT_TYPE_EQUIP_SPELL:\n+                if (enchant_spell_id)\n+                {\n+                    int32 basepoints = 0;\n+                    // Random Property Exist - try found basepoints for spell (basepoints depends from item suffix factor)\n+                    if (item->GetItemRandomPropertyId())\n+                    {\n+                        ItemRandomSuffixEntry const* item_rand = sItemRandomSuffixStore.LookupEntry(abs(item->GetItemRandomPropertyId()));\n+                        if (item_rand)\n+                        {\n+                            // Search enchant_amount\n+                            for (auto k : NPCBots::index_array<uint8, MAX_ITEM_ENCHANTMENT_EFFECTS>)\n+                            {\n+                                if (item_rand->Enchantment[k] == enchant_id)\n+                                {\n+                                    basepoints = int32((item_rand->AllocationPct[k] * item->GetItemSuffixFactor()) / 10000);\n+                                    break;\n+                                }\n+                            }\n+                        }\n+                    }\n+                    // Cast custom spell vs all equal basepoints got from enchant_amount\n+                    if (basepoints)\n+                        me->CastCustomSpell(me, enchant_spell_id, &basepoints, &basepoints, &basepoints, false, item);\n+                    else\n+                        me->CastSpell(me, enchant_spell_id, false, item);\n+                }\n+                break;\n+            case ITEM_ENCHANTMENT_TYPE_RESISTANCE:\n+                if (!enchant_amount)\n+                {\n+                    ItemRandomSuffixEntry const* item_rand = sItemRandomSuffixStore.LookupEntry(abs(item->GetItemRandomPropertyId()));\n+                    if (item_rand)\n+                    {\n+                        for (auto k : NPCBots::index_array<uint8, MAX_ITEM_ENCHANTMENT_EFFECTS>)\n+                        {\n+                            if (item_rand->Enchantment[k] == enchant_id)\n+                            {\n+                                enchant_amount = uint32((item_rand->AllocationPct[k] * item->GetItemSuffixFactor()) / 10000);\n+                                break;\n+                            }\n+                        }\n+                    }\n+                }\n+                _stats[slot][BOT_STAT_MOD_RESISTANCE_START + enchant_spell_id] += enchant_amount;\n+                break;\n+            case ITEM_ENCHANTMENT_TYPE_STAT:\n+            {\n+                if (!enchant_amount)\n+                {\n+                    ItemRandomSuffixEntry const* item_rand_suffix = sItemRandomSuffixStore.LookupEntry(abs(item->GetItemRandomPropertyId()));\n+                    if (item_rand_suffix)\n+                    {\n+                        for (auto k : NPCBots::index_array<uint8, MAX_ITEM_ENCHANTMENT_EFFECTS>)\n+                        {\n+                            if (item_rand_suffix->Enchantment[k] == enchant_id)\n+                            {\n+                                enchant_amount = uint32((item_rand_suffix->AllocationPct[k] * item->GetItemSuffixFactor()) / 10000);\n+                                break;\n+                            }\n+                        }\n+                    }\n+                }\n+\n+                switch (enchant_spell_id)\n+                {\n+                    case ITEM_MOD_MANA:\n+                    case ITEM_MOD_HEALTH:\n+                    case ITEM_MOD_AGILITY:\n+                    case ITEM_MOD_STRENGTH:\n+                    case ITEM_MOD_INTELLECT:\n+                    case ITEM_MOD_SPIRIT:\n+                    case ITEM_MOD_STAMINA:\n+                    case ITEM_MOD_DEFENSE_SKILL_RATING:\n+                    case ITEM_MOD_DODGE_RATING:\n+                    case ITEM_MOD_PARRY_RATING:\n+                    case ITEM_MOD_BLOCK_RATING:\n+                    case ITEM_MOD_HIT_MELEE_RATING:\n+                    case ITEM_MOD_HIT_RANGED_RATING:\n+                    case ITEM_MOD_HIT_SPELL_RATING:\n+                    case ITEM_MOD_CRIT_MELEE_RATING:\n+                    case ITEM_MOD_CRIT_RANGED_RATING:\n+                    case ITEM_MOD_CRIT_SPELL_RATING:\n+                    //case ITEM_MOD_HIT_TAKEN_MELEE_RATING:\n+                    //case ITEM_MOD_HIT_TAKEN_RANGED_RATING:\n+                    //case ITEM_MOD_HIT_TAKEN_SPELL_RATING:\n+                    //case ITEM_MOD_CRIT_TAKEN_MELEE_RATING:\n+                    //case ITEM_MOD_CRIT_TAKEN_RANGED_RATING:\n+                    //case ITEM_MOD_CRIT_TAKEN_SPELL_RATING:\n+                    case ITEM_MOD_HASTE_MELEE_RATING:\n+                    case ITEM_MOD_HASTE_RANGED_RATING:\n+                    case ITEM_MOD_HASTE_SPELL_RATING:\n+                    case ITEM_MOD_HIT_RATING:\n+                    case ITEM_MOD_CRIT_RATING:\n+                    case ITEM_MOD_HASTE_RATING:\n+                    case ITEM_MOD_RESILIENCE_RATING:\n+                    case ITEM_MOD_EXPERTISE_RATING:\n+                    case ITEM_MOD_ATTACK_POWER:\n+                    case ITEM_MOD_RANGED_ATTACK_POWER:\n+                    case ITEM_MOD_MANA_REGENERATION:\n+                    case ITEM_MOD_ARMOR_PENETRATION_RATING:\n+                    case ITEM_MOD_SPELL_POWER:\n+                    case ITEM_MOD_HEALTH_REGEN:\n+                    case ITEM_MOD_SPELL_PENETRATION:\n+                    case ITEM_MOD_BLOCK_VALUE:\n+                    case ITEM_MOD_SPELL_HEALING_DONE:   // deprecated\n+                    case ITEM_MOD_SPELL_DAMAGE_DONE:    // deprecated\n+                        _stats[slot][enchant_spell_id] += enchant_amount;\n+                        break;\n+                    default:\n+                        break;\n+                }\n+                break;\n+            }\n+            case ITEM_ENCHANTMENT_TYPE_TOTEM:           // Shaman Rockbiter Weapon\n+            case ITEM_ENCHANTMENT_TYPE_USE_SPELL:\n+            case ITEM_ENCHANTMENT_TYPE_PRISMATIC_SOCKET:\n+                break;\n+            default:\n+                break;\n+        }\n+    }\n+}\n+\n+void bot_ai::RemoveItemEnchantments(Item const* item)\n+{\n+    for (auto i : NPCBots::index_array<uint8, MAX_ENCHANTMENT_SLOT>)\n+        RemoveItemEnchantment(item, EnchantmentSlot(i));\n+}\n+\n+void bot_ai::RemoveItemEnchantment(Item const* item, EnchantmentSlot eslot)\n+{\n+    uint32 enchant_id = item->GetEnchantmentId(eslot);\n+    if (!enchant_id)\n+        return;\n+\n+    SpellItemEnchantmentEntry const* pEnchant = sSpellItemEnchantmentStore.LookupEntry(enchant_id);\n+    if (!pEnchant)\n+        return;\n+\n+    ////skip level reqs\n+    //if (pEnchant->MinLevel > me->GetLevel())\n+    //    return;\n+\n+    uint32 enchant_display_type;\n+    //uint32 enchant_amount;\n+    uint32 enchant_spell_id;\n+\n+    for (auto s : NPCBots::index_array<uint8, MAX_SPELL_ITEM_ENCHANTMENT_EFFECTS>)\n+    {\n+        enchant_display_type = pEnchant->type[s];\n+        //enchant_amount = pEnchant->EffectPointsMin[s];\n+        enchant_spell_id = pEnchant->spellid[s];\n+\n+        switch (enchant_display_type)\n+        {\n+            case ITEM_ENCHANTMENT_TYPE_DAMAGE:\n+                //Already removed in RemoveItemBonuses()\n+                break;\n+            case ITEM_ENCHANTMENT_TYPE_EQUIP_SPELL:\n+                if (enchant_spell_id)\n+                    me->RemoveAurasDueToItemSpell(enchant_spell_id, item->GetGUID());\n+                break;\n+            case ITEM_ENCHANTMENT_TYPE_RESISTANCE:\n+                //Already removed in RemoveItemBonuses()\n+                break;\n+            case ITEM_ENCHANTMENT_TYPE_STAT:\n+                //Already removed in RemoveItemBonuses()\n+                break;\n+            case ITEM_ENCHANTMENT_TYPE_TOTEM:           // Shaman Rockbiter Weapon\n+            case ITEM_ENCHANTMENT_TYPE_USE_SPELL:\n+            case ITEM_ENCHANTMENT_TYPE_PRISMATIC_SOCKET:\n+                break;\n+            default:\n+                break;\n+        }\n+    }\n+}\n+\n+void bot_ai::RemoveItemClassEnchantment(uint8 slot)\n+{\n+    uint8 eslot = TEMP_ENCHANTMENT_SLOT;\n+\n+    if (!GetAIMiscValue(slot == BOT_SLOT_MAINHAND ? BOTAI_MISC_ENCHANT_TIMER_MH : BOTAI_MISC_ENCHANT_TIMER_OH))\n+        return;\n+\n+    Item* weap = _equips[slot];\n+    if (!weap || !weap->GetEnchantmentId(EnchantmentSlot(eslot)))\n+        return;\n+\n+    RemoveItemEnchantment(weap, EnchantmentSlot(eslot));\n+\n+    for (auto s : NPCBots::index_array<uint8, MAX_SPELL_ITEM_ENCHANTMENT_EFFECTS>)\n+        weap->SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + eslot*MAX_ENCHANTMENT_OFFSET + s, 0);\n+}\n+\n+void bot_ai::RemoveItemClassEnchantments()\n+{\n+    for (auto slot : NPCBots::index_array<uint8, BOT_FIRST_NON_MELEE_SLOT>)\n+        RemoveItemClassEnchantment(slot);\n+}\n+\n+void bot_ai::ApplyItemEquipSpells(Item* item, bool apply)\n+{\n+    if (!item)\n+        return;\n+\n+    ItemTemplate const* proto = item->GetTemplate();\n+    if (!proto)\n+        return;\n+\n+    for (auto i : NPCBots::index_array<uint8, MAX_ITEM_PROTO_SPELLS>)\n+    {\n+        _Spell const& spellData = proto->Spells[i];\n+\n+        if (!spellData.SpellId)\n+            continue;\n+\n+        // wrong triggering type\n+        if (apply && spellData.SpellTrigger != ITEM_SPELLTRIGGER_ON_EQUIP)\n+            continue;\n+\n+        // check if it is valid spell\n+        SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellData.SpellId);\n+        if (!spellInfo)\n+            continue;\n+\n+        //ApplyEquipSpell(spellproto, item, apply);\n+\n+        //if (apply)\n+        //    me->AddAura(spellInfo->Id, me);\n+        //else\n+        //    me->RemoveAura(spellInfo->Id);\n+\n+        //CastSpellExtraArgs args(item);\n+        if (apply)\n+            //me->CastSpell(me, spellInfo->Id, args);\n+            me->CastSpell(me, spellInfo, false, item);\n+        else\n+            me->RemoveAurasDueToItemSpell(spellInfo->Id, item->GetGUID());  // un-apply all spells, not only at-equipped\n+    }\n+}\n+\n+void bot_ai::ApplyItemEquipEnchantmentSpells(Item* item)\n+{\n+    for (auto e_slot : NPCBots::index_array<uint8, MAX_ENCHANTMENT_SLOT>)\n+    {\n+        uint32 enchant_id = item->GetEnchantmentId(EnchantmentSlot(e_slot));\n+        if (!enchant_id)\n+            continue;\n+        SpellItemEnchantmentEntry const* pEnchant = sSpellItemEnchantmentStore.LookupEntry(enchant_id);\n+        if (!pEnchant)\n+            continue;\n+        if (pEnchant->requiredLevel > me->GetLevel())\n+            continue;\n+\n+        uint32 enchant_display_type;\n+        //uint32 enchant_amount;\n+        uint32 enchant_spell_id;\n+\n+        for (auto s : NPCBots::index_array<uint8, MAX_SPELL_ITEM_ENCHANTMENT_EFFECTS>)\n+        {\n+            enchant_display_type = pEnchant->type[s];\n+            //enchant_amount = pEnchant->EffectPointsMin[s];\n+            enchant_spell_id = pEnchant->spellid[s];\n+\n+            switch (enchant_display_type)\n+            {\n+                case ITEM_ENCHANTMENT_TYPE_EQUIP_SPELL:\n+                {\n+                    if (!enchant_spell_id)\n+                        break;\n+                    int32 basepoints = 0;\n+                    // Random Property Exist - try found basepoints for spell (basepoints depends from item suffix factor)\n+                    if (item->GetItemRandomPropertyId())\n+                    {\n+                        ItemRandomSuffixEntry const* item_rand = sItemRandomSuffixStore.LookupEntry(abs(item->GetItemRandomPropertyId()));\n+                        if (item_rand)\n+                        {\n+                            // Search enchant_amount\n+                            for (auto k : NPCBots::index_array<uint8, MAX_ITEM_ENCHANTMENT_EFFECTS>)\n+                            {\n+                                if (item_rand->Enchantment[k] == enchant_id)\n+                                {\n+                                    basepoints = int32((item_rand->AllocationPct[k] * item->GetItemSuffixFactor()) / 10000);\n+                                    break;\n+                                }\n+                            }\n+                        }\n+                    }\n+                    // Cast custom spell vs all equal basepoints got from enchant_amount\n+                    if (basepoints)\n+                        me->CastCustomSpell(me, enchant_spell_id, &basepoints, &basepoints, &basepoints, false, item);\n+                    else\n+                        me->CastSpell(me, enchant_spell_id, false, item);\n+                    break;\n+                }\n+                default:\n+                    break;\n+            }\n+        }\n+    }\n+}\n+\n+void bot_ai::ApplyItemSetBonuses(Item* item, bool apply)\n+{\n+    if (item) //(un)equip, NOT from loops\n+    {\n+        ItemTemplate const* proto = item->GetTemplate();\n+        if (!proto)\n+            return;\n+\n+        uint32 setId = proto->ItemSet;\n+        if (!setId)\n+            return;\n+\n+        ItemSetEntry const* itemSet = sItemSetStore.LookupEntry(setId);\n+        if (!itemSet)\n+            return;\n+\n+        uint8 setItemCount = 0;\n+        for (auto slot : NPCBots::index_array<uint8, BOT_INVENTORY_SIZE>)\n+            if (_equips[slot] && _equips[slot]->GetTemplate()->ItemSet == setId)\n+                ++setItemCount; //same at equip and unequip\n+\n+        for (auto i : NPCBots::index_array<uint8, MAX_ITEM_SET_SPELLS>)\n+        {\n+            if (!itemSet->spells[i])\n+                continue;\n+            if (itemSet->items_to_triggerspell[i] != setItemCount)\n+                continue;\n+\n+            SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(itemSet->spells[i]);\n+            if (!spellInfo)\n+                continue;\n+\n+            //BOT_LOG_ERROR(\"entities.player\", \"ApplyItemSetBonusesB: %s's %s, %s (%u), %s (%u), icount %u\",\n+            //    me->GetName().c_str(), apply ? \"apply\" : \"remove\", itemSet->name[0], setId, spellInfo->SpellName[0], spellInfo->Id, uint32(setItemCount));\n+\n+            if (apply)\n+            {\n+                //CastSpellExtraArgs args(item);\n+                //me->CastSpell(me, spellInfo->Id, args);\n+                me->CastSpell(me, spellInfo, false, item);\n+            }\n+            else\n+                me->RemoveAurasDueToSpell(spellInfo->Id);           // un-apply spell (item set case)\n+        }\n+        return;\n+    }\n+\n+    //no item means all (init, reset, reset (lvl change))\n+    std::set<uint32> itemSets;\n+    for (auto slot : NPCBots::index_array<uint8, BOT_INVENTORY_SIZE>)\n+    {\n+        item = _equips[slot]; //intended: oveeride function argument value\n+        if (!item)\n+            continue;\n+\n+        ItemTemplate const* proto = item->GetTemplate();\n+        if (!proto)\n+            continue;\n+\n+        uint32 setId = proto->ItemSet;\n+        if (!setId)\n+            continue;\n+\n+        ItemSetEntry const* itemSet = sItemSetStore.LookupEntry(setId);\n+        if (!itemSet)\n+            continue;\n+\n+        itemSets.emplace(setId);\n+    }\n+\n+    for (uint32 item_set_id : itemSets)\n+    {\n+        ItemSetEntry const* itemSet = sItemSetStore.LookupEntry(item_set_id);\n+        uint8 setItemCount = std::ranges::count_if(_equips, [=](Item const* item) {\n+            return item && item->GetTemplate()->ItemSet == item_set_id;\n+        });\n+\n+        for (auto i : NPCBots::index_array<uint8, MAX_ITEM_SET_SPELLS>)\n+        {\n+            if (!itemSet->spells[i])\n+                continue;\n+            if (itemSet->items_to_triggerspell[i] > setItemCount)\n+                continue;\n+\n+            SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(itemSet->spells[i]);\n+            if (!spellInfo)\n+                continue;\n+\n+            //BOT_LOG_ERROR(\"entities.player\", \"ApplyItemSetBonusesB (all): %s's %s, %s (%u), %s (%u), c %u, req %u\",\n+            //    me->GetName().c_str(), apply ? \"apply\" : \"remove\", itemSet->name[0], *itr, spellInfo->SpellName[0], spellInfo->Id, uint32(setItemCount), itemSet->SetThreshold[j]);\n+\n+            if (apply)\n+            {\n+                //CastSpellExtraArgs args(item);\n+                //me->CastSpell(me, spellInfo->Id, args);\n+                me->CastSpell(me, spellInfo, false, item);\n+\n+            }\n+            else\n+                me->RemoveAurasDueToSpell(spellInfo->Id);           // un-apply spell (item set case)\n+        }\n+    }\n+}\n+\n+void bot_ai::ApplyItemsSpells()\n+{\n+    for (auto slot : NPCBots::index_array<uint8, BOT_INVENTORY_SIZE>)\n+    {\n+        if (Item* item = _equips[slot])\n+        {\n+            ApplyItemEquipSpells(item, true); //item template spells\n+            ApplyItemEquipEnchantmentSpells(item); //item enchants\n+        }\n+    }\n+\n+    ApplyItemSetBonuses(nullptr, true); //item set bonuses\n+}\n+//stats bonuses from equipment\n+inline float bot_ai::_getBotStat(uint8 slot, BotStatMods stat) const\n+{\n+    return static_cast<float>(_stats[slot][stat]);\n+}\n+\n+float bot_ai::_getTotalBotStat(BotStatMods stat) const\n+{\n+    int32 value = 0;\n+    for (auto slot : NPCBots::index_array<uint8, BOT_INVENTORY_SIZE>)\n+        value += _stats[slot][stat];\n+\n+    uint8 lvl = me->GetLevel();\n+    Stats fstat = STAT_STRENGTH;\n+    UnitMods fmod = UNIT_MOD_END;\n+    float fpct = 0.0f;\n+    float fval = static_cast<float>(value);\n+\n+    switch (stat)\n+    {\n+        case BOT_STAT_MOD_STRENGTH:\n+            fstat = STAT_STRENGTH;\n+            fmod = UNIT_MOD_STAT_STRENGTH;\n+            switch (_botclass)\n+            {\n+                case BOT_CLASS_WARRIOR:\n+                    //Vitality, Strength of Arms\n+                    if (lvl >= 45 && GetSpec() == BOT_SPEC_WARRIOR_PROTECTION)\n+                        fpct += 0.06f;\n+                    if (lvl >= 40 && GetSpec() == BOT_SPEC_WARRIOR_ARMS)\n+                        fpct += 0.04f;\n+                    //Improved Berserker Stance part 1 (all stances)\n+                    if (lvl >= 45 && GetSpec() == BOT_SPEC_WARRIOR_FURY/* && GetBotStance() == WARRIOR_BERSERKER_STANCE*/)\n+                        fpct += 0.2f;\n+                    break;\n+                case BOT_CLASS_PALADIN:\n+                    //Divine Strength\n+                    if (lvl >= 10)\n+                        fpct += 0.15f;\n+                    break;\n+                case BOT_CLASS_DEATH_KNIGHT:\n+                    //Ravenous Dead part 1\n+                    //Endless Winter part 1\n+                    //Veteran of the Third War part 1\n+                    //Abomination's might part 2\n+                    if (lvl >= 56)\n+                        fpct += 0.03f;\n+                    if (lvl >= 58)\n+                        fpct += 0.04f;\n+                    if (lvl >= 59 && GetSpec() == BOT_SPEC_DK_BLOOD)\n+                        fpct += 0.06f;\n+                    if (lvl >= 60 && GetSpec() == BOT_SPEC_DK_BLOOD)\n+                        fpct += 0.02f;\n+                    //Frost Presence passive / Improved Frost Presence\n+                    if (lvl >= 61 && GetBotStance() == DEATH_KNIGHT_FROST_PRESENCE && GetSpec() == BOT_SPEC_DK_FROST)\n+                        fpct += 0.08f;\n+                    break;\n+                case BOT_CLASS_DRUID:\n+                    //Survival of the Fittest, Improved Mark of the Wild\n+                    if (lvl >= 35 && GetSpec() == BOT_SPEC_DRUID_FERAL)\n+                        fpct += 0.08f;\n+                    else if (lvl >= 10)\n+                        fpct += 0.02f;\n+                    break;\n+                default:\n+                    break;\n+            }\n+            break;\n+        case BOT_STAT_MOD_AGILITY:\n+            fstat = STAT_AGILITY;\n+            fmod = UNIT_MOD_STAT_AGILITY;\n+            switch (_botclass)\n+            {\n+                case BOT_CLASS_HUNTER:\n+                    //Combat Experience, Lightning Reflexes\n+                    if (lvl >= 35 && GetSpec() == BOT_SPEC_HUNTER_MARKSMANSHIP)\n+                        fpct += 0.04f;\n+                    if (lvl >= 35 && GetSpec() == BOT_SPEC_HUNTER_SURVIVAL)\n+                        fpct += 0.15f;\n+                    //Hunting Party\n+                    if (lvl >= 35 && GetSpec() == BOT_SPEC_HUNTER_SURVIVAL)\n+                        fpct += 0.03f;\n+                    break;\n+                case BOT_CLASS_ROGUE:\n+                    //Sinister Calling\n+                    if (lvl >= 45 && GetSpec() == BOT_SPEC_ROGUE_SUBTLETY)\n+                        fpct += 0.15f;\n+                    break;\n+                case BOT_CLASS_DRUID:\n+                    //Survival of the Fittest, Improved Mark of the Wild\n+                    if (lvl >= 35 && GetSpec() == BOT_SPEC_DRUID_FERAL)\n+                        fpct += 0.08f;\n+                    else if (lvl >= 10)\n+                        fpct += 0.02f;\n+                    break;\n+                default:\n+                    break;\n+            }\n+            break;\n+        case BOT_STAT_MOD_STAMINA:\n+            fstat = STAT_STAMINA;\n+            fmod = UNIT_MOD_STAT_STAMINA;\n+            switch (_botclass)\n+            {\n+                case BOT_CLASS_WARRIOR:\n+                    //Vitality, Strength of Arms\n+                    if (lvl >= 45 && GetSpec() == BOT_SPEC_WARRIOR_PROTECTION)\n+                        fpct += 0.09f;\n+                    if (lvl >= 40 && GetSpec() == BOT_SPEC_WARRIOR_ARMS)\n+                        fpct += 0.04f;\n+                    break;\n+                case BOT_CLASS_PALADIN:\n+                    //Combat Expertise, Sacred Duty\n+                    if (lvl >= 45 && GetSpec() == BOT_SPEC_PALADIN_PROTECTION)\n+                        fpct += 0.06f;\n+                    if (lvl >= 35 && GetSpec() == BOT_SPEC_PALADIN_PROTECTION)\n+                        fpct += 0.04f;\n+                    break;\n+                case BOT_CLASS_HUNTER:\n+                    //Survivalist\n+                    if (lvl >= 20)\n+                        fpct += 0.1f;\n+                    break;\n+                case BOT_CLASS_ROGUE:\n+                    //Lightning Reflexes part 2\n+                    if (lvl >= 25 && GetSpec() == BOT_SPEC_ROGUE_COMBAT)\n+                        fpct += 0.04f;\n+                    break;\n+                case BOT_CLASS_PRIEST:\n+                    //Improved Power Word: Fortitude\n+                    if (lvl >= 15)\n+                        fpct += 0.04f;\n+                    break;\n+                case BOT_CLASS_DEATH_KNIGHT:\n+                    //Veteran of the Third War part 2\n+                    if (lvl >= 59 && GetSpec() == BOT_SPEC_DK_BLOOD)\n+                        fpct += 0.03f;\n+                    break;\n+                case BOT_CLASS_WARLOCK:\n+                    //Demonic Embrace: 10% stam bonus\n+                    if (lvl >= 10)\n+                        fpct += 0.1f;\n+                    break;\n+                case BOT_CLASS_DRUID:\n+                    if (GetBotStance() == DRUID_BEAR_FORM)\n+                    {\n+                        //Bear form: stamina bonus base 25%\n+                        //Heart of the Wild: 10% stam bonus for bear\n+                        fpct += 0.25f;\n+                        if (lvl >= 35 && GetSpec() == BOT_SPEC_DRUID_FERAL)\n+                            fpct += 0.1f;\n+                    }\n+                    //Survival of the Fittest, Improved Mark of the Wild\n+                    if (lvl >= 35 && GetSpec() == BOT_SPEC_DRUID_FERAL)\n+                        fpct += 0.06f;\n+                    if (lvl >= 10)\n+                        fpct += 0.02f;\n+                    break;\n+                default:\n+                    break;\n+            }\n+            break;\n+        case BOT_STAT_MOD_INTELLECT:\n+            fstat = STAT_INTELLECT;\n+            fmod = UNIT_MOD_STAT_INTELLECT;\n+            switch (_botclass)\n+            {\n+                case BOT_CLASS_PALADIN:\n+                    //Divine Intellect\n+                    if (lvl >= 15)\n+                        fpct += 0.1f;\n+                    break;\n+                case BOT_CLASS_HUNTER:\n+                    //Combat Experience\n+                    if (lvl >= 35 && GetSpec() == BOT_SPEC_HUNTER_MARKSMANSHIP)\n+                        fpct += 0.04f;\n+                    break;\n+                case BOT_CLASS_MAGE:\n+                    //Arcane Mind\n+                    if (lvl >= 30 && GetSpec() == BOT_SPEC_MAGE_ARCANE)\n+                        fpct += 0.15f;\n+                    break;\n+                case BOT_CLASS_PRIEST:\n+                    //Mental Strength\n+                    if (lvl >= 30 && GetSpec() == BOT_SPEC_PRIEST_DISCIPLINE)\n+                        fpct += 0.15f;\n+                    break;\n+                case BOT_CLASS_SHAMAN:\n+                    //Ancestral Knowledge\n+                    if (lvl >= 10)\n+                        fpct += 0.1f;\n+                    break;\n+                case BOT_CLASS_DRUID:\n+                    //Survival of the Fittest, Improved Mark of the Wild\n+                    if (lvl >= 35 && GetSpec() == BOT_SPEC_DRUID_FERAL)\n+                        fpct += 0.08f;\n+                    else if (lvl >= 10)\n+                        fpct += 0.02f;\n+                    //Furor (Moonkin Form)\n+                    if (GetBotStance() == DRUID_MOONKIN_FORM)\n+                        fpct += 0.1f;\n+                    //Heart of the Wild: ferals only (tanks included)\n+                    if (lvl >= 35 && GetSpec() == BOT_SPEC_DRUID_FERAL)\n+                        fpct += 0.2f;\n+                    break;\n+                default:\n+                    break;\n+            }\n+            break;\n+        case BOT_STAT_MOD_SPIRIT:\n+            fstat = STAT_SPIRIT;\n+            fmod = UNIT_MOD_STAT_SPIRIT;\n+            switch (_botclass)\n+            {\n+                case BOT_CLASS_PRIEST:\n+                    //Spirit of Redemption part 1\n+                    if (lvl >= 30 && GetSpec() == BOT_SPEC_PRIEST_HOLY)\n+                        fpct += 0.05f;\n+                    //Enlightenment part 1\n+                    if (lvl >= 35 && GetSpec() == BOT_SPEC_PRIEST_DISCIPLINE)\n+                        fpct += 0.06f;\n+                    break;\n+                case BOT_CLASS_MAGE:\n+                    //Student of the Mind\n+                    if (lvl >= 20)\n+                        fpct += 0.1f;\n+                    break;\n+                case BOT_CLASS_DRUID:\n+                    //Survival of the Fittest, Improved Mark of the Wild\n+                    if (lvl >= 35 && GetSpec() == BOT_SPEC_DRUID_FERAL)\n+                        fpct += 0.08f;\n+                    else if (lvl >= 10)\n+                        fpct += 0.02f;\n+                    //Living Spirit\n+                    if (lvl >= 40 && GetSpec() == BOT_SPEC_DRUID_RESTORATION)\n+                        fpct += 0.15f;\n+                    break;\n+                default:\n+                    break;\n+            }\n+            break;\n+        default:\n+            break;\n+    }\n+\n+    if (fmod != UNIT_MOD_END)\n+    {\n+        fpct += me->GetPctModifierValue(fmod, TOTAL_PCT);\n+        fval *= fpct;\n+        fval += me->GetTotalStatValue(fstat);\n+    }\n+    return fval;\n+}\n+\n+float bot_ai::_getRatingMultiplier(CombatRating cr) const\n+{\n+    GtCombatRatingsEntry const* Rating = sGtCombatRatingsStore.LookupEntry(cr*GT_MAX_LEVEL + (me->GetLevel()-1));\n+    GtOCTClassCombatRatingScalarEntry const* classRating = sGtOCTClassCombatRatingScalarStore.LookupEntry((GetPlayerClass()-1)*GT_MAX_RATING + cr + 1);\n+    if (!Rating || !classRating)\n+        return 1.0f;\n+\n+    return classRating->ratio / Rating->ratio;\n+}\n+\n+float bot_ai::_getStatScore(uint8 stat) const\n+{\n+    static const float fone = 1.0f;\n+    static const float fzero = 0.0f;\n+\n+    float tankMod = IsTank() ? fone : fzero;\n+    float healMod = HasRole(BOT_ROLE_HEAL) ? fone : fzero;\n+    float castMod = IsCastingClass(_botclass) ? fone : fzero;\n+    float spiritMod = (_botclass == BOT_CLASS_PRIEST || _botclass == BOT_CLASS_MAGE || _botclass == BOT_CLASS_WARLOCK || (_botclass == BOT_CLASS_DRUID && _spec != BOT_SPEC_DRUID_FERAL)) ? fone : fzero;\n+    float dpsMod = HasRole(BOT_ROLE_DPS) ? fone : fzero;\n+    float meleeMod = !HasRole(BOT_ROLE_RANGED) ? fone : fzero;\n+    float manaMod = (_botclass == BOT_CLASS_DRUID || me->GetPowerType() == POWER_MANA) ? fone : fzero;\n+\n+    switch (stat)\n+    {\n+        case BOT_STAT_MOD_MANA:\n+            return 0.1f * manaMod;\n+        case BOT_STAT_MOD_HEALTH:\n+            return 0.1f;\n+        case BOT_STAT_MOD_AGILITY:\n+            return _botclass == BOT_CLASS_ROGUE ? 1.2f * dpsMod * meleeMod : (_botclass == BOT_CLASS_HUNTER ? 1.0f : 0.5f) * dpsMod;\n+        case BOT_STAT_MOD_STRENGTH:\n+            return (IsMeleeClass(_botclass) ? 1.0f : 0.5f) * dpsMod * meleeMod;\n+        case BOT_STAT_MOD_INTELLECT:\n+            return 1.0f * castMod;\n+        case BOT_STAT_MOD_SPIRIT:\n+            return 1.0f * spiritMod;\n+        case BOT_STAT_MOD_STAMINA:\n+            return IsTank() ? 2.0f : 1.0f;\n+        case BOT_STAT_MOD_DEFENSE_SKILL_RATING:\n+            return 2.0f * tankMod;\n+        case BOT_STAT_MOD_DODGE_RATING:\n+        case BOT_STAT_MOD_PARRY_RATING:\n+            return 2.0f * tankMod;\n+        case BOT_STAT_MOD_BLOCK_RATING:\n+            return CanBlock() ? 2.0f : 0.0f * tankMod;\n+        case BOT_STAT_MOD_BLOCK_VALUE:\n+            return CanBlock() ? 0.67f : 0.0f * tankMod;\n+        case BOT_STAT_MOD_HIT_TAKEN_RATING:\n+        case BOT_STAT_MOD_CRIT_TAKEN_RATING:\n+            return 1.0f * tankMod;\n+        case BOT_STAT_MOD_HIT_TAKEN_MELEE_RATING:\n+        case BOT_STAT_MOD_HIT_TAKEN_RANGED_RATING:\n+        case BOT_STAT_MOD_HIT_TAKEN_SPELL_RATING:\n+        case BOT_STAT_MOD_CRIT_TAKEN_MELEE_RATING:\n+        case BOT_STAT_MOD_CRIT_TAKEN_RANGED_RATING:\n+        case BOT_STAT_MOD_CRIT_TAKEN_SPELL_RATING:\n+            return 0.4f * tankMod;\n+        case BOT_STAT_MOD_ARMOR:\n+            return 0.05f * tankMod;\n+        case BOT_STAT_MOD_HIT_MELEE_RATING:\n+        case BOT_STAT_MOD_HIT_RANGED_RATING:\n+        case BOT_STAT_MOD_HIT_SPELL_RATING:\n+            return 1.0f * dpsMod;\n+        case BOT_STAT_MOD_CRIT_MELEE_RATING:\n+        case BOT_STAT_MOD_CRIT_RANGED_RATING:\n+        case BOT_STAT_MOD_CRIT_SPELL_RATING:\n+        case BOT_STAT_MOD_HASTE_MELEE_RATING:\n+        case BOT_STAT_MOD_HASTE_RANGED_RATING:\n+        case BOT_STAT_MOD_HASTE_SPELL_RATING:\n+        case BOT_STAT_MOD_HIT_RATING:\n+        case BOT_STAT_MOD_CRIT_RATING:\n+        case BOT_STAT_MOD_HASTE_RATING:\n+            return HasRole(BOT_ROLE_DPS|BOT_ROLE_HEAL) ? 1.0f : 0.0f;\n+        case BOT_STAT_MOD_EXPERTISE_RATING:\n+            return 2.0f * dpsMod * meleeMod;\n+        case BOT_STAT_MOD_ATTACK_POWER:\n+            return ((IsMeleeClass(_botclass) || _botclass == BOT_CLASS_HUNTER) ? 0.43f : 0.1f) * dpsMod;\n+        case BOT_STAT_MOD_RANGED_ATTACK_POWER:\n+            switch (_botclass)\n+            {\n+                case BOT_CLASS_HUNTER: case BOT_CLASS_DARK_RANGER: case BOT_CLASS_SEA_WITCH:    return 0.43f * dpsMod;\n+                case BOT_CLASS_PRIEST: case BOT_CLASS_MAGE: case BOT_CLASS_WARLOCK:             return 0.15f * dpsMod;\n+                default:                                                                        return 0.0f;\n+            }\n+        case BOT_STAT_MOD_FERAL_ATTACK_POWER:\n+            return GetSpec() == BOT_SPEC_DRUID_FERAL ? 0.43f : 0.0f;\n+        case BOT_STAT_MOD_SPELL_HEALING_DONE:\n+            return 1.25f * healMod;\n+        case BOT_STAT_MOD_SPELL_DAMAGE_DONE:\n+            return 1.25f * dpsMod * castMod;\n+        case BOT_STAT_MOD_MANA_REGENERATION:\n+            return _botclass == BOT_CLASS_SPHYNX ? 0.0f : 1.2f * manaMod;\n+        case BOT_STAT_MOD_ARMOR_PENETRATION_RATING:\n+            return 2.0f * dpsMod * meleeMod;\n+        case BOT_STAT_MOD_SPELL_POWER:\n+            return 1.25f * castMod;\n+        case BOT_STAT_MOD_HEALTH_REGEN:\n+            return 0.33f * tankMod;\n+        case BOT_STAT_MOD_SPELL_PENETRATION:\n+            return 1.2f * castMod * dpsMod;\n+        case BOT_STAT_MOD_DAMAGE_MIN:\n+        case BOT_STAT_MOD_DAMAGE_MAX:\n+            return ((IsMeleeClass(_botclass) || _botclass == BOT_CLASS_HUNTER) ? 0.33f : 0.0f) * dpsMod;\n+        case BOT_STAT_MOD_RESIST_HOLY:\n+        case BOT_STAT_MOD_RESIST_FIRE:\n+        case BOT_STAT_MOD_RESIST_NATURE:\n+        case BOT_STAT_MOD_RESIST_FROST:\n+        case BOT_STAT_MOD_RESIST_SHADOW:\n+        case BOT_STAT_MOD_RESIST_ARCANE:\n+            return IsTank() ? 1.25f : 0.25f;\n+        default:\n+            return 0.0f;\n+    }\n+}\n+\n+float bot_ai::_getItemGearStatScore(ItemTemplate const* iproto, uint8 forslot, Item const* item) const\n+{\n+    ItemTemplate const* proto = item ? sObjectMgr->GetItemTemplate(item->GetEntry()) : iproto;\n+    if (!proto)\n+        return 0.0f;\n+\n+    //BOT_LOG_ERROR(\"scripts\", \"_getItemGearScore for %u - %s\", proto->ItemId, proto->Name1.c_str());\n+\n+    std::remove_cvref_t<decltype(*std::cbegin(_stats))> istats{};\n+    //for (uint8 i = 0; i != MAX_BOT_ITEM_MOD; ++i)\n+    //    BOT_LOG_ERROR(\"scripts\", \"_getItemGearScore at %u %i\", uint32(i), istats[i]);\n+\n+    ScalingStatDistributionEntry const* ssd = proto->ScalingStatDistribution ? sScalingStatDistributionStore.LookupEntry(proto->ScalingStatDistribution) : NULL;\n+\n+    uint32 ssd_level = me->GetLevel();\n+    if (ssd && ssd_level > ssd->MaxLevel)\n+        ssd_level = ssd->MaxLevel;\n+\n+    ScalingStatValuesEntry const* ssv = proto->ScalingStatValue ? sScalingStatValuesStore.LookupEntry(ssd_level) : NULL;\n+\n+    for (auto i : NPCBots::index_array<uint8, MAX_ITEM_PROTO_STATS>)\n+    {\n+        uint32 statType = 0;\n+        int32  val      = 0;\n+        if (ssd && ssv)\n+        {\n+            if (ssd->StatMod[i] < 0)\n+                continue;\n+            statType = ssd->StatMod[i];\n+            val = (ssv->getssdMultiplier(proto->ScalingStatValue) * ssd->Modifier[i]) / 10000;\n+        }\n+        else\n+        {\n+            if (i >= proto->StatsCount)\n+                continue;\n+            statType = proto->ItemStat[i].ItemStatType;\n+            val = proto->ItemStat[i].ItemStatValue;\n+        }\n+\n+        if (val == 0)\n+            continue;\n+\n+        istats[statType] += val;\n+    }\n+\n+    istats[BOT_STAT_MOD_RESIST_HOLY] += proto->HolyRes;\n+    istats[BOT_STAT_MOD_RESIST_FIRE] += proto->FireRes;\n+    istats[BOT_STAT_MOD_RESIST_NATURE] += proto->NatureRes;\n+    istats[BOT_STAT_MOD_RESIST_FROST] += proto->FrostRes;\n+    istats[BOT_STAT_MOD_RESIST_SHADOW] += proto->ShadowRes;\n+    istats[BOT_STAT_MOD_RESIST_ARCANE] += proto->ArcaneRes;\n+\n+    istats[BOT_STAT_MOD_ARMOR] += proto->Armor;\n+    istats[BOT_STAT_MOD_BLOCK_VALUE] += proto->Block;\n+\n+    EquipmentInfo const* einfo = BotDataMgr::GetBotEquipmentInfo(me->GetEntry());\n+    if (forslot > BOT_SLOT_RANGED || proto->ItemId != einfo->ItemEntry[forslot])\n+    {\n+        if (ssv)\n+        {\n+            int32 extraDPS = ssv->getDPSMod(proto->ScalingStatValue);\n+            if (extraDPS)\n+            {\n+                float average = extraDPS * proto->Delay / 1000.0f;\n+                float mod = ssv->IsTwoHand(proto->ScalingStatValue) ? 0.2f : 0.3f;\n+\n+                istats[BOT_STAT_MOD_DAMAGE_MIN] += (1.0f - mod) * average;\n+                istats[BOT_STAT_MOD_DAMAGE_MAX] += (1.0f + mod) * average;\n+            }\n+        }\n+        else\n+        {\n+            istats[BOT_STAT_MOD_DAMAGE_MIN] += proto->Damage[0].DamageMin + proto->Damage[1].DamageMin;\n+            istats[BOT_STAT_MOD_DAMAGE_MAX] += proto->Damage[0].DamageMax + proto->Damage[1].DamageMax;\n+        }\n+\n+        if (_botclass == BOT_CLASS_DRUID)\n+        {\n+            int32 dpsMod = 0;\n+            int32 feral_bonus = 0;\n+\n+            if (ssv)\n+            {\n+                dpsMod = ssv->getDPSMod(proto->ScalingStatValue);\n+                feral_bonus += ssv->getFeralBonus(proto->ScalingStatValue);\n+            }\n+\n+            feral_bonus += proto->getFeralBonus(dpsMod);\n+            if (feral_bonus)\n+                istats[BOT_STAT_MOD_FERAL_ATTACK_POWER] += feral_bonus;\n+        }\n+    }\n+\n+    if (item)\n+    {\n+        for (auto e_slot : NPCBots::index_array<uint8, MAX_ENCHANTMENT_SLOT>)\n+        {\n+            uint32 enchant_id = item->GetEnchantmentId(EnchantmentSlot(e_slot));\n+            if (!enchant_id)\n+                continue;\n+\n+            SpellItemEnchantmentEntry const* pEnchant = sSpellItemEnchantmentStore.LookupEntry(enchant_id);\n+            if (!pEnchant)\n+                continue;\n+\n+            for (auto s : NPCBots::index_array<uint8, MAX_SPELL_ITEM_ENCHANTMENT_EFFECTS>)\n+            {\n+                uint32 enchant_display_type = pEnchant->type[s];\n+                uint32 enchant_amount = pEnchant->amount[s];\n+                uint32 enchant_spell_id = pEnchant->spellid[s];\n+\n+                switch (enchant_display_type)\n+                {\n+                    case ITEM_ENCHANTMENT_TYPE_DAMAGE:\n+                        istats[BOT_STAT_MOD_DAMAGE_MIN] += enchant_amount;\n+                        istats[BOT_STAT_MOD_DAMAGE_MAX] += enchant_amount;\n+                        break;\n+                    case ITEM_ENCHANTMENT_TYPE_RESISTANCE:\n+                        if (!enchant_amount)\n+                        {\n+                            ItemRandomSuffixEntry const* item_rand = sItemRandomSuffixStore.LookupEntry(abs(item->GetItemRandomPropertyId()));\n+                            if (item_rand)\n+                            {\n+                                for (auto k : NPCBots::index_array<uint8, MAX_ITEM_ENCHANTMENT_EFFECTS>)\n+                                {\n+                                    if (item_rand->Enchantment[k] == enchant_id)\n+                                    {\n+                                        enchant_amount = uint32((item_rand->AllocationPct[k] * item->GetItemSuffixFactor()) / 10000);\n+                                        break;\n+                                    }\n+                                }\n+                            }\n+                        }\n+                        istats[BOT_STAT_MOD_RESISTANCE_START + enchant_spell_id] += enchant_amount;\n+                        break;\n+                    case ITEM_ENCHANTMENT_TYPE_STAT:\n+                    {\n+                        if (!enchant_amount)\n+                        {\n+                            ItemRandomSuffixEntry const* item_rand_suffix = sItemRandomSuffixStore.LookupEntry(abs(item->GetItemRandomPropertyId()));\n+                            if (item_rand_suffix)\n+                            {\n+                                for (auto k : NPCBots::index_array<uint8, MAX_ITEM_ENCHANTMENT_EFFECTS>)\n+                                {\n+                                    if (item_rand_suffix->Enchantment[k] == enchant_id)\n+                                    {\n+                                        enchant_amount = uint32((item_rand_suffix->AllocationPct[k] * item->GetItemSuffixFactor()) / 10000);\n+                                        break;\n+                                    }\n+                                }\n+                            }\n+                        }\n+\n+                        switch (enchant_spell_id)\n+                        {\n+                            case ITEM_MOD_MANA:\n+                            case ITEM_MOD_HEALTH:\n+                            case ITEM_MOD_AGILITY:\n+                            case ITEM_MOD_STRENGTH:\n+                            case ITEM_MOD_INTELLECT:\n+                            case ITEM_MOD_SPIRIT:\n+                            case ITEM_MOD_STAMINA:\n+                            case ITEM_MOD_DEFENSE_SKILL_RATING:\n+                            case ITEM_MOD_DODGE_RATING:\n+                            case ITEM_MOD_PARRY_RATING:\n+                            case ITEM_MOD_BLOCK_RATING:\n+                            case ITEM_MOD_HIT_MELEE_RATING:\n+                            case ITEM_MOD_HIT_RANGED_RATING:\n+                            case ITEM_MOD_HIT_SPELL_RATING:\n+                            case ITEM_MOD_CRIT_MELEE_RATING:\n+                            case ITEM_MOD_CRIT_RANGED_RATING:\n+                            case ITEM_MOD_CRIT_SPELL_RATING:\n+                            case ITEM_MOD_HASTE_MELEE_RATING:\n+                            case ITEM_MOD_HASTE_RANGED_RATING:\n+                            case ITEM_MOD_HASTE_SPELL_RATING:\n+                            case ITEM_MOD_HIT_RATING:\n+                            case ITEM_MOD_CRIT_RATING:\n+                            case ITEM_MOD_HASTE_RATING:\n+                            case ITEM_MOD_RESILIENCE_RATING:\n+                            case ITEM_MOD_EXPERTISE_RATING:\n+                            case ITEM_MOD_ATTACK_POWER:\n+                            case ITEM_MOD_RANGED_ATTACK_POWER:\n+                            case ITEM_MOD_MANA_REGENERATION:\n+                            case ITEM_MOD_ARMOR_PENETRATION_RATING:\n+                            case ITEM_MOD_SPELL_POWER:\n+                            case ITEM_MOD_HEALTH_REGEN:\n+                            case ITEM_MOD_SPELL_PENETRATION:\n+                            case ITEM_MOD_BLOCK_VALUE:\n+                                istats[enchant_spell_id] += enchant_amount;\n+                                break;\n+                            default:\n+                                break;\n+                        }\n+                        break;\n+                    }\n+                }\n+            }\n+        }\n+    }\n+\n+    //for (uint8 i = 0; i != MAX_BOT_ITEM_MOD; ++i)\n+    //    BOT_LOG_ERROR(\"scripts\", \"_getItemGearScore total %u %i\", uint32(i), istats[i]);\n+\n+    //stats are fetched, not calculate\n+    float itemScore = 0.0f;\n+\n+    for (auto i : NPCBots::index_array<uint8, MAX_BOT_ITEM_MOD>)\n+        itemScore += istats[i] * _getStatScore(i);\n+\n+    float itemGearScore = CalculateItemGearScore(iproto, me->GetEntry(), me->GetLevel(), GetBotClass(), GetSpec(), forslot);\n+    itemScore += itemGearScore;\n+\n+    //BOT_LOG_ERROR(\"scripts\", \"_getItemGearScore total score %.3f\", itemScore);\n+    return itemScore;\n+}\n+\n+void bot_ai::_saveStats()\n+{\n+    NpcBotStats stats{\n+        .entry = me->GetEntry(),\n+        .maxhealth = me->GetMaxHealth(),\n+        .maxpower = me->GetMaxPower(_botclass == BOT_CLASS_DRUID ? POWER_MANA : me->GetPowerType()),\n+        .strength = static_cast<uint32>(0.5f + GetTotalBotStat(BOT_STAT_MOD_STRENGTH)),\n+        .agility = static_cast<uint32>(0.5f + GetTotalBotStat(BOT_STAT_MOD_AGILITY)),\n+        .stamina = static_cast<uint32>(0.5f + GetTotalBotStat(BOT_STAT_MOD_STAMINA)),\n+        .intellect = static_cast<uint32>(0.5f + GetTotalBotStat(BOT_STAT_MOD_INTELLECT)),\n+        .spirit = static_cast<uint32>(0.5f + GetTotalBotStat(BOT_STAT_MOD_SPIRIT)),\n+        .armor = me->GetArmor(),\n+        .defense = me->GetDefenseSkillValue(),\n+        .resHoly = static_cast<uint32>(std::max<int32>(0, me->GetResistance(SPELL_SCHOOL_HOLY) + resistbonus[SPELL_SCHOOL_HOLY-1])),\n+        .resFire = static_cast<uint32>(std::max<int32>(0, me->GetResistance(SPELL_SCHOOL_FIRE) + resistbonus[SPELL_SCHOOL_FIRE-1])),\n+        .resNature = static_cast<uint32>(std::max<int32>(0, me->GetResistance(SPELL_SCHOOL_NATURE) + resistbonus[SPELL_SCHOOL_NATURE-1])),\n+        .resFrost = static_cast<uint32>(std::max<int32>(0, me->GetResistance(SPELL_SCHOOL_FROST) + resistbonus[SPELL_SCHOOL_FROST-1])),\n+        .resShadow = static_cast<uint32>(std::max<int32>(0, me->GetResistance(SPELL_SCHOOL_SHADOW) + resistbonus[SPELL_SCHOOL_SHADOW-1])),\n+        .resArcane = static_cast<uint32>(std::max<int32>(0, me->GetResistance(SPELL_SCHOOL_ARCANE) + resistbonus[SPELL_SCHOOL_ARCANE-1])),\n+        .blockPct = me->GetUnitBlockChance(),\n+        .dodgePct = me->GetUnitDodgeChance(),\n+        .parryPct = me->GetUnitParryChance(),\n+        .critPct = crit + me->GetTotalAuraModifier(SPELL_AURA_MOD_WEAPON_CRIT_PERCENT) + me->GetTotalAuraModifier(SPELL_AURA_MOD_CRIT_PCT),\n+        .attackPower = static_cast<uint32>(0.5f + me->GetTotalAttackPowerValue(BASE_ATTACK)),\n+        .spellPower = static_cast<uint32>(std::max<int32>(0, me->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_MAGIC))),\n+        .spellPen = spellpen,\n+        .hastePct = std::max<float>(haste, 0.f),\n+        .hitBonusPct = std::max<float>(hit, 0.f),\n+        .expertise = expertise,\n+        .armorPenPct = me->GetCreatureArmorPenetrationCoef()\n+    };\n+\n+    BotDataMgr::SaveNpcBotStats(stats);\n+}\n+\n+//!Copied from Player::CastItemUseSpell\n+void bot_ai::_castBotItemUseSpell(Item const* item, SpellCastTargets const& targets/*, uint8 cast_count, uint32 glyphIndex*/)\n+{\n+    ItemTemplate const* proto = item->GetTemplate();\n+\n+    // use triggered flag only for items with many spell casts and for not first cast\n+    uint8 count = 0;\n+\n+    // item spells casted at use\n+    SpellInfo const* spellInfo;\n+    for (auto i : NPCBots::index_array<uint8, MAX_ITEM_PROTO_SPELLS>)\n+    {\n+        _Spell const& spellData = proto->Spells[i];\n+        if (!spellData.SpellId || spellData.SpellTrigger != ITEM_SPELLTRIGGER_ON_USE)\n+            continue;\n+\n+        spellInfo = sSpellMgr->GetSpellInfo(spellData.SpellId);\n+        if (!spellInfo)\n+            continue;\n+\n+        Spell* spell = new Spell(me, spellInfo, (count > 0) ? TRIGGERED_FULL_MASK : TRIGGERED_NONE);\n+        //spell->m_CastItem = item; // DO NOT TAKE ITEM\n+        //spell->m_cast_count = cast_count;                   // set count of casts\n+        //spell->m_glyphIndex = glyphIndex;                   // glyph index\n+        spell->prepare(&targets);\n+        ++count;\n+    }\n+\n+    // Item enchantments spells casted at use\n+    for (auto e_slot : NPCBots::index_array<uint8, MAX_ENCHANTMENT_SLOT>)\n+    {\n+        uint32 enchant_id = item->GetEnchantmentId(EnchantmentSlot(e_slot));\n+        SpellItemEnchantmentEntry const* pEnchant = sSpellItemEnchantmentStore.LookupEntry(enchant_id);\n+        if (!pEnchant)\n+            continue;\n+\n+        for (auto s : NPCBots::index_array<uint8, MAX_SPELL_ITEM_ENCHANTMENT_EFFECTS>)\n+        {\n+            if (pEnchant->type[s] != ITEM_ENCHANTMENT_TYPE_USE_SPELL)\n+                continue;\n+\n+            spellInfo = sSpellMgr->GetSpellInfo(pEnchant->spellid[s]);\n+            if (!spellInfo)\n+                continue;\n+\n+            Spell* spell = new Spell(me, spellInfo, (count > 0) ? TRIGGERED_FULL_MASK : TRIGGERED_NONE);\n+            //spell->m_CastItem = item; // DO NOT TAKE ITEM\n+            //spell->m_cast_count = cast_count;               // set count of casts\n+            //spell->m_glyphIndex = glyphIndex;               // glyph index\n+            spell->prepare(&targets);\n+            ++count;\n+        }\n+    }\n+}\n+\n+Item* bot_ai::GetEquipsByGuid(ObjectGuid itemGuid) const\n+{\n+    auto ci = std::ranges::find_if(_equips, [itemGuid](Item const* item) {\n+        return item && item->GetGUID() == itemGuid;\n+    });\n+\n+    return ci != std::cend(_equips) ? *ci : nullptr;\n+}\n+\n+uint32 bot_ai::GetEquipDisplayId(uint8 slot) const\n+{\n+    int32 displayId = -1;\n+    if (_equips[slot])\n+    {\n+        NpcBotTransmogData const* transmogData = BotDataMgr::SelectNpcBotTransmogs(me->GetEntry());\n+        if (transmogData && BotCfg::IsTransmogEnabled() &&\n+            (_equips[slot]->GetTemplate()->ItemId == transmogData->transmogs[slot].first || BotCfg::TransmogUseEquipmentSlots()))\n+        {\n+            int32 item_id = transmogData->transmogs[slot].second;\n+            if (item_id > 0)\n+            {\n+                if (ItemTemplate const* proto = sObjectMgr->GetItemTemplate(uint32(item_id)))\n+                {\n+                    displayId = proto->DisplayInfoID;\n+                }\n+                else\n+                {\n+                BOT_LOG_ERROR(\"scripts\", \"bot_ai::GetEquipDisplayId(): ivalid item Id {} for bot {} {} slot {}\",\n+                        item_id, me->GetEntry(), me->GetName().c_str(), uint32(slot));\n+                }\n+            }\n+            else\n+                displayId = item_id;\n+        }\n+        if (displayId == -1)\n+            displayId = int32(_equips[slot]->GetTemplate()->DisplayInfoID);\n+    }\n+\n+    return uint32(std::max<int32>(displayId, 0));\n+}\n+\n+BotEquipResult bot_ai::UnEquipAll(ObjectGuid receiver, bool store_to_bank)\n+{\n+    uint8 items_to_store_count = GetRealEquippedItemsCount();\n+    if (!items_to_store_count)\n+        return BotEquipResult::BOT_EQUIP_RESULT_OK;\n+\n+    if (store_to_bank)\n+    {\n+        if (!receiver || IAmFree())\n+            return BotEquipResult::BOT_EQUIP_RESULT_FAIL_NO_RECEIVER;\n+        if (!receiver.IsPlayer())\n+            return BotEquipResult::BOT_EQUIP_RESULT_FAIL_INVALID_RECEIVER;\n+        if (receiver.GetCounter() != _botData->owner)\n+            return BotEquipResult::BOT_EQUIP_RESULT_FAIL_INVALID_RECEIVER;\n+        if (!BotDataMgr::CanDepositBotBankItemsCount(receiver, items_to_store_count))\n+            return BotEquipResult::BOT_EQUIP_RESULT_FAIL_NO_BANK_SPACE;\n+    }\n+\n+    BotEquipResult suc = BotEquipResult::BOT_EQUIP_RESULT_OK;\n+    for (auto i : NPCBots::index_array<uint8, BOT_INVENTORY_SIZE>)\n+    {\n+        BotEquipResult slot_result = i <= BOT_SLOT_RANGED ? _resetEquipment(i, receiver, store_to_bank) : _unequip(i, receiver, store_to_bank);\n+        if (slot_result != BotEquipResult::BOT_EQUIP_RESULT_OK)\n+        {\n+            suc = slot_result;\n+            break;\n+        }\n+    }\n+\n+    return suc;\n+}\n+\n+uint8 bot_ai::GetRealEquippedItemsCount() const\n+{\n+    EquipmentInfo const* einfo = BotDataMgr::GetBotEquipmentInfo(me->GetEntry());\n+    return std::ranges::count_if(NPCBots::index_array<uint8, BOT_INVENTORY_SIZE>, [=, this](uint8 i) {\n+        return GetEquips(i) && (i > BOT_SLOT_RANGED || einfo->ItemEntry[i] != GetEquips(i)->GetEntry());\n+    });\n+}\n+\n+float bot_ai::GetAverageItemLevel() const\n+{\n+    float sum = 0.f;\n+    uint32 count = 0;\n+    for (auto i : NPCBots::index_array<uint8, BOT_INVENTORY_SIZE>)\n+    {\n+        if (_equips[i] && !(/*i == BOT_SLOT_TABARD || */i == BOT_SLOT_OFFHAND || i == BOT_SLOT_RANGED || i == BOT_SLOT_BODY))\n+        {\n+            if (ItemTemplate const* itemProto = _equips[i]->GetTemplate())\n+            {\n+                ++count;\n+                sum += itemProto->GetItemLevelIncludingQuality(me->GetLevel());\n+            }\n+        }\n+    }\n+\n+    return !count ? 0.f : (sum / float(count));\n+}\n+std::pair<float, float> bot_ai::GetBotGearScores() const\n+{\n+    return CalculateBotGearScore(me->GetEntry(), me->GetLevel(), GetBotClass(), GetSpec(), _equips.data());\n+}\n+/////////\n+//ROLES//\n+/////////\n+GossipOptionIcon bot_ai::GetRoleIcon(uint32 role) const\n+{\n+    return HasRole(role) ? BOT_ICON_ON : BOT_ICON_OFF;\n+}\n+\n+uint32 bot_ai::GetRoleString(uint32 role)\n+{\n+    switch (role)\n+    {\n+        case BOT_ROLE_TANK:                 return BOT_TEXT_TANK;\n+        case BOT_ROLE_TANK_OFF:             return BOT_TEXT_TANK_OFF;\n+        case BOT_ROLE_DPS:                  return BOT_TEXT_DPS;\n+        case BOT_ROLE_HEAL:                 return BOT_TEXT_HEAL;\n+        case BOT_ROLE_RANGED:               return BOT_TEXT_RANGED;\n+        case BOT_ROLE_GATHERING_MINING:     return BOT_TEXT_MINER;\n+        case BOT_ROLE_GATHERING_HERBALISM:  return BOT_TEXT_HERBALIST;\n+        case BOT_ROLE_GATHERING_SKINNING:   return BOT_TEXT_SKINNER;\n+        case BOT_ROLE_GATHERING_ENGINEERING:return BOT_TEXT_ENGINEER;\n+        case BOT_ROLE_AUTOLOOT:             return BOT_TEXT_LOOTING;\n+        case BOT_ROLE_AUTOLOOT_POOR:        return BOT_TEXT_POOR;\n+        case BOT_ROLE_AUTOLOOT_COMMON:      return BOT_TEXT_COMMON;\n+        case BOT_ROLE_AUTOLOOT_UNCOMMON:    return BOT_TEXT_UNCOMMON;\n+        case BOT_ROLE_AUTOLOOT_RARE:        return BOT_TEXT_RARE;\n+        case BOT_ROLE_AUTOLOOT_EPIC:        return BOT_TEXT_EPIC;\n+        case BOT_ROLE_AUTOLOOT_LEGENDARY:   return BOT_TEXT_LEGENDARY;\n+        default:                            return BOT_TEXT_UNKNOWN;\n+    }\n+}\n+\n+void bot_ai::ToggleRole(uint32 role, bool force)\n+{\n+    if (!force && roleTimer > lastdiff)\n+        return;\n+\n+    roleTimer = 350; //delay next attempt (prevent abuse)\n+\n+    if (HasRole(role))\n+    {\n+        //linked roles\n+        if (role & BOT_ROLE_TANK)\n+            role |= BOT_ROLE_TANK_OFF;\n+\n+        _roleMask &= ~role;\n+    }\n+    else\n+    {\n+        //linked roles\n+        if (role & BOT_ROLE_TANK_OFF)\n+            role |= BOT_ROLE_TANK;\n+\n+        _roleMask |= role;\n+    }\n+\n+    BotDataMgr::UpdateNpcBotData(me->GetEntry(), NPCBOT_UPDATE_ROLES, &_roleMask);\n+\n+    //Update passives\n+    shouldUpdateStats = true;\n+}\n+\n+uint32 bot_ai::DefaultRolesForClass(uint8 m_class, uint8 spec)\n+{\n+    uint32 roleMask = BOT_ROLE_DPS;\n+\n+    //if (bot_ai::IsHealingClass(m_class))\n+    //    roleMask |= BOT_ROLE_HEAL;\n+\n+    if (!bot_ai::IsMeleeClass(m_class))\n+    {\n+        switch (spec)\n+        {\n+            case BOT_SPEC_SHAMAN_ENHANCEMENT:\n+            case BOT_SPEC_DRUID_FERAL:\n+                break;\n+            default:\n+                roleMask |= BOT_ROLE_RANGED;\n+                break;\n+        }\n+    }\n+\n+    return roleMask;\n+}\n+\n+bool bot_ai::IsTank(Unit const* unit) const\n+{\n+    if (!unit || unit == me)\n+        return HasRole(BOT_ROLE_TANK);\n+\n+    if (Creature const* bot = unit->ToCreature())\n+        return bot->GetBotAI() && bot->GetBotAI()->HasRole(BOT_ROLE_TANK);\n+\n+    if (Player const* player = unit->ToPlayer())\n+    {\n+        if (Group const* gr = player->GetGroup())\n+        {\n+            Group::MemberSlotList const& slots = gr->GetMemberSlots();\n+            for (Group::member_citerator itr = slots.begin(); itr != slots.end(); ++itr)\n+                if (itr->guid == unit->GetGUID())\n+                    return itr->flags & (MEMBER_FLAG_MAINTANK | MEMBER_FLAG_MAINASSIST);\n+            if (gr->isLFGGroup() && sLFGMgr->GetRoles(unit->GetGUID()) & lfg::PLAYER_ROLE_TANK)\n+                return true;\n+        }\n+        switch (player->GetClass())\n+        {\n+            case CLASS_WARRIOR:\n+                if (player->GetShield() && const_cast<Player*>(player)->GetSpec(player->GetActiveSpec()) == TALENT_TREE_WARRIOR_PROTECTION)\n+                    return true;\n+                break;\n+            case CLASS_PALADIN:\n+                if (player->GetShield() && const_cast<Player*>(player)->GetSpec(player->GetActiveSpec()) == TALENT_TREE_PALADIN_PROTECTION)\n+                    return true;\n+                break;\n+            case CLASS_DRUID:\n+                if ((player->GetShapeshiftForm() == FORM_BEAR || player->GetShapeshiftForm() == FORM_DIREBEAR) &&\n+                    const_cast<Player*>(player)->GetSpec(player->GetActiveSpec()) == TALENT_TREE_DRUID_FERAL_COMBAT)\n+                    return true;\n+                break;\n+            case CLASS_DEATH_KNIGHT:\n+                if (player->GetAuraEffect(SPELL_AURA_MOD_THREAT, SPELLFAMILY_DEATHKNIGHT, 0x8000, 0x0, 0x0) && player->GetRatingBonusValue(CR_DEFENSE_SKILL) > 0.0f)\n+                    return true;\n+                break;\n+            default:\n+                break;\n+        }\n+    }\n+\n+    return false;\n+}\n+\n+bool bot_ai::IsOffTank(Unit const* unit) const\n+{\n+    if (!unit || unit == me)\n+        return HasRole(BOT_ROLE_TANK_OFF);\n+\n+    if (Creature const* bot = unit->ToCreature())\n+        return bot->GetBotAI() && bot->GetBotAI()->HasRole(BOT_ROLE_TANK_OFF);\n+\n+    if (Player const* player = unit->ToPlayer())\n+    {\n+        if (Group const* gr = player->GetGroup())\n+        {\n+            if (gr->isRaidGroup())\n+            {\n+                Group::MemberSlotList const& slots = gr->GetMemberSlots();\n+                for (Group::member_citerator itr = slots.begin(); itr != slots.end(); ++itr)\n+                    if (itr->guid == unit->GetGUID())\n+                        return itr->flags & MEMBER_FLAG_MAINASSIST;\n+            }\n+        }\n+        switch (player->GetClass())\n+        {\n+            case CLASS_WARRIOR:\n+                if (player->GetShield() && const_cast<Player*>(player)->GetSpec(player->GetActiveSpec()) == TALENT_TREE_WARRIOR_PROTECTION)\n+                    return true;\n+                break;\n+            case CLASS_PALADIN:\n+                if (player->GetShield() && const_cast<Player*>(player)->GetSpec(player->GetActiveSpec()) == TALENT_TREE_PALADIN_PROTECTION)\n+                    return true;\n+                break;\n+            case CLASS_DRUID:\n+                if ((player->GetShapeshiftForm() == FORM_BEAR || player->GetShapeshiftForm() == FORM_DIREBEAR) &&\n+                    const_cast<Player*>(player)->GetSpec(player->GetActiveSpec()) == TALENT_TREE_DRUID_FERAL_COMBAT)\n+                    return true;\n+                break;\n+            case CLASS_DEATH_KNIGHT:\n+                if (player->GetAuraEffect(SPELL_AURA_MOD_THREAT, SPELLFAMILY_DEATHKNIGHT, 0x8000, 0x0, 0x0) && player->GetRatingBonusValue(CR_DEFENSE_SKILL) > 0.0f)\n+                    return true;\n+                break;\n+            default:\n+                break;\n+        }\n+    }\n+\n+    return false;\n+}\n+\n+bool bot_ai::CCed(Unit const* target, bool root)\n+{\n+    return target ? target->HasUnitState(UNIT_STATE_CONFUSED | UNIT_STATE_STUNNED | UNIT_STATE_FLEEING | UNIT_STATE_DISTRACTED | UNIT_STATE_CONFUSED_MOVE | UNIT_STATE_FLEEING_MOVE) || (root && (target->HasUnitState(UNIT_STATE_ROOT) || target->isFrozen() || target->HasRootAura())) : true;\n+}\n+//AI initialization common\n+//Called at ai reset, level change (spawned = true)\n+void bot_ai::DefaultInit()\n+{\n+    //only once\n+    if (spawned)\n+        return;\n+\n+    spawned = true;\n+\n+    if (!firstspawn)\n+    {\n+        me->RemoveAllAurasExceptType(SPELL_AURA_CONTROL_VEHICLE);\n+        RemoveItemClassEnchantments(); //clear rogue poisons / shaman ecnhants\n+        ApplyItemsSpells(); //restore item equip spells\n+    }\n+    else\n+    {\n+        InitRace();\n+        ASSERT(!me->GetBotAI());\n+        ASSERT(!me->GetBotPetAI());\n+        me->SetBotAI(this);\n+        BotLogger::Log(NPCBOT_LOG_SPAWN, me);\n+    }\n+\n+    me->SetPvP(master->IsPvP() || IsWanderer());\n+    if (sWorld->IsFFAPvPRealm())\n+        me->SetByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_FFA_PVP);\n+    else if (IAmFree())\n+        me->SetByteFlag(UNIT_FIELD_BYTES_2, 1, 0);\n+\n+    InitSpec();\n+    InitRoles();\n+\n+    if (IsWanderer())\n+    {\n+        _travel_node_cur = ASSERT_NOTNULL(GetClosestWanderNode());\n+        if (firstspawn && BotMgr::IsWanderingWorldBot(me))\n+            StartPotionTimer();\n+    }\n+\n+    SetStats(true); // Class passives included\n+\n+    if (!IsTempBot())\n+        ApplyRacials();\n+\n+    if (firstspawn)\n+    {\n+        if (!IsTempBot())\n+        {\n+            InitFaction();\n+            InitEquips();\n+            InitMiscValues();\n+        }\n+\n+        firstspawn = false;\n+    }\n+}\n+\n+void bot_ai::ApplyRacials()\n+{\n+    uint8 myrace = me->GetRace();\n+    switch (myrace)\n+    {\n+        case RACE_HUMAN:\n+            RefreshAura(20598); //Human Spirit\n+            RefreshAura(20864); //Mace Specialization\n+            RefreshAura(20597); //Sword Specialization\n+            //RefreshAura(58985); //Perception pointless\n+            if (firstspawn)\n+                InitSpellMap(RACIAL_EVERY_MAN_FOR_HIMSELF, true, false);\n+            break;\n+        case RACE_ORC:\n+            RefreshAura(20573); //Hardiness\n+            RefreshAura(20574); //Axe Specialization\n+            //Blood Fury\n+            if (firstspawn)\n+                InitSpellMap(RaceSpellForClass(myrace, _botclass), true, false);\n+            break;\n+        case RACE_DWARF:\n+            RefreshAura(20595); //Gun Specialization\n+            RefreshAura(59224); //Mace Specialization\n+            RefreshAura(20596); //Frost Resistance\n+            if (firstspawn)\n+                InitSpellMap(RACIAL_STONEFORM, true, false);\n+            break;\n+        case RACE_NIGHTELF:\n+            RefreshAura(20583); //Nature Resistance\n+            RefreshAura(20582); //Quickness\n+            InitSpellMap(RACIAL_SHADOWMELD, true, false);\n+            break;\n+        case RACE_UNDEAD_PLAYER:\n+            RefreshAura(20579); //Shadow Resistance\n+            if (firstspawn)\n+                InitSpellMap(RACIAL_WILL_OF_THE_FORSAKEN, true, false);\n+            //cannibalize is skipped\n+            break;\n+        case RACE_TAUREN:\n+            RefreshAura(20550); //Endurance\n+            RefreshAura(20551); //Nature Resistance\n+            if (firstspawn)\n+                InitSpellMap(RACIAL_WARSTOMP, true, false);\n+            break;\n+        case RACE_GNOME:\n+            RefreshAura(20592); //Arcane Resistance\n+            RefreshAura(20591); //Expansive Mind\n+            if (firstspawn)\n+                InitSpellMap(RACIAL_ESCAPE_ARTIST, true, false);\n+            break;\n+        case RACE_TROLL:\n+            RefreshAura(20557); //Beast Slaying\n+            RefreshAura(20558); //Thrown Specialization\n+            RefreshAura(26290); //Bow Specialization\n+            RefreshAura(58943); //Da Voodoo Shuffle\n+            RefreshAura(20555); //Regeneration\n+            if (firstspawn)\n+                InitSpellMap(RACIAL_BERSERKING, true, false);\n+            break;\n+        case RACE_BLOODELF:\n+            RefreshAura(822); //Magic Resistance\n+            if (firstspawn)\n+                InitSpellMap(RaceSpellForClass(myrace, _botclass), true, false);\n+            break;\n+        case RACE_DRAENEI:\n+            RefreshAura(6562, uint8(!IAmFree())); //Heroic Presence (28878 is not present)\n+            RefreshAura(20579); //Shadow Resistance (universal since creatures do not lose cast time on damage anyways)\n+            if (firstspawn)\n+                InitSpellMap(RaceSpellForClass(myrace, _botclass), true, false);\n+            break;\n+        default:\n+            //BOT_LOG_ERROR(\"entities.player\", \"bot_ai::ApplyRacePassives(): unknown race %u for bot %s (%u)\", uint32(me->GetRace()), me->GetName().c_str(), me->GetEntry());\n+            return;\n+    }\n+}\n+\n+void bot_ai::InitFaction()\n+{\n+    uint32 faction = _botData->faction;\n+\n+    //if (faction == FACTION_TEMPLATE_HATES_EVERYTHING_1)\n+    //    faction = 35;\n+\n+    me->SetFaction(faction);\n+    if (botPet)\n+        botPet->SetFaction(faction);\n+    const_cast<CreatureTemplate*>(me->GetCreatureTemplate())->faction = faction;\n+}\n+\n+void bot_ai::InitRace()\n+{\n+    me->SetByteValue(UNIT_FIELD_BYTES_0, 0, _botExtras->race); //set race\n+}\n+\n+void bot_ai::InitRoles()\n+{\n+    if (IsTempBot())\n+    {\n+        _roleMask = BOT_ROLE_DPS;\n+        return;\n+    }\n+    else if (IAmFree())\n+    {\n+        //default roles\n+        _roleMask = DefaultRolesForClass(_botclass, GetSpec());\n+        return;\n+    }\n+\n+    _roleMask = _botData->roles;\n+}\n+\n+void bot_ai::InitSpec()\n+{\n+    uint8 spec;\n+    if (IAmFree())\n+        spec = SelectSpecForClass(_botclass);\n+    else\n+    {\n+        spec = _botData->spec;\n+    }\n+\n+    //BOT_LOG_ERROR(\"entities.unit\", \"bot_ai::InitSpec(): bot %u class %u spec: %u\", me->GetEntry(), uint32(_botclass), uint32(spec));\n+\n+    if (spec < BOT_SPEC_BEGIN || spec > BOT_SPEC_END)\n+    {\n+        BOT_LOG_ERROR(\"entities.unit\", \"bot_ai::InitSpec(): spec ({}) is out of range for bot {}! Falling to default (1)...\",\n+            uint32(spec), me->GetEntry());\n+\n+        spec = BOT_SPEC_DEFAULT;\n+    }\n+\n+    SetSpec(spec, false);\n+}\n+\n+void bot_ai::SetSpec(uint8 spec, bool activate)\n+{\n+    ASSERT(spec >= BOT_SPEC_BEGIN && spec <= BOT_SPEC_END);\n+\n+    _spec = spec;\n+\n+    if (activate)\n+    {\n+        BotDataMgr::UpdateNpcBotData(me->GetEntry(), NPCBOT_UPDATE_SPEC, &spec);\n+\n+        UnsummonAll(false);\n+        removeShapeshiftForm();\n+        //from DefaultInit\n+        me->RemoveAllAurasExceptType(SPELL_AURA_CONTROL_VEHICLE);\n+        //RemoveItemClassEnchants();\n+        ApplyItemsSpells();\n+        ApplyRacials();\n+        //from SetStats\n+        //InitPowers();\n+        InitSpells();\n+        ApplyClassPassives();\n+        InitHeals();\n+\n+        me->SetPower(POWER_MANA, 0);\n+        me->SetPower(POWER_RAGE, 0);\n+        me->SetPower(POWER_ENERGY, 0);\n+    }\n+}\n+\n+uint8 bot_ai::GetSpec() const\n+{\n+    return me->GetLevel() < 10 ? uint8(BOT_SPEC_DEFAULT) : _spec;\n+}\n+\n+uint8 bot_ai::SelectSpecForClass(uint8 m_class)\n+{\n+    std::vector<uint8> specs;\n+    specs.reserve(3);\n+    switch (m_class)\n+    {\n+        case BOT_CLASS_WARRIOR: //any\n+            specs.push_back(BOT_SPEC_WARRIOR_ARMS);\n+            specs.push_back(BOT_SPEC_WARRIOR_FURY);\n+            specs.push_back(BOT_SPEC_WARRIOR_PROTECTION);\n+            break;\n+        case BOT_CLASS_PALADIN: //retri\n+            specs.push_back(BOT_SPEC_PALADIN_RETRIBUTION);\n+            break;\n+        case BOT_CLASS_HUNTER: //any\n+            specs.push_back(BOT_SPEC_HUNTER_BEASTMASTERY);\n+            specs.push_back(BOT_SPEC_HUNTER_MARKSMANSHIP);\n+            specs.push_back(BOT_SPEC_HUNTER_SURVIVAL);\n+            break;\n+        case BOT_CLASS_ROGUE: //any\n+            specs.push_back(BOT_SPEC_ROGUE_ASSASINATION);\n+            specs.push_back(BOT_SPEC_ROGUE_COMBAT);\n+            specs.push_back(BOT_SPEC_ROGUE_SUBTLETY);\n+            break;\n+        case BOT_CLASS_PRIEST: //discipline, shadow\n+            specs.push_back(BOT_SPEC_PRIEST_DISCIPLINE);\n+            specs.push_back(BOT_SPEC_PRIEST_SHADOW);\n+            break;\n+        case BOT_CLASS_DEATH_KNIGHT: //any\n+            specs.push_back(BOT_SPEC_DK_BLOOD);\n+            specs.push_back(BOT_SPEC_DK_FROST);\n+            specs.push_back(BOT_SPEC_DK_UNHOLY);\n+            break;\n+        case BOT_CLASS_SHAMAN: //elem, enh\n+            specs.push_back(BOT_SPEC_SHAMAN_ELEMENTAL);\n+            specs.push_back(BOT_SPEC_SHAMAN_ENHANCEMENT);\n+            break;\n+        case BOT_CLASS_MAGE: //fire, frost\n+            specs.push_back(BOT_SPEC_MAGE_FIRE);\n+            specs.push_back(BOT_SPEC_MAGE_FROST);\n+            break;\n+        case BOT_CLASS_WARLOCK: //affli, destr\n+            specs.push_back(BOT_SPEC_WARLOCK_AFFLICTION);\n+            specs.push_back(BOT_SPEC_WARLOCK_DESTRUCTION);\n+            break;\n+        case BOT_CLASS_DRUID: //balance, feral\n+            specs.push_back(BOT_SPEC_DRUID_BALANCE);\n+            specs.push_back(BOT_SPEC_DRUID_FERAL);\n+            break;\n+        default:\n+            specs.push_back(BOT_SPEC_DEFAULT);\n+            break;\n+    }\n+\n+    return specs.size() == 1 ? specs.front() : Bcore::Containers::SelectRandomContainerElement(specs);\n+}\n+\n+uint32 bot_ai::TextForSpec(uint8 spec)\n+{\n+    switch (spec)\n+    {\n+        case BOT_SPEC_WARRIOR_ARMS:         return BOT_TEXT_SPEC_ARMS;\n+        case BOT_SPEC_WARRIOR_FURY:         return BOT_TEXT_SPEC_FURY;\n+        case BOT_SPEC_WARRIOR_PROTECTION:   return BOT_TEXT_SPEC_PROTECTION;\n+        case BOT_SPEC_PALADIN_HOLY:         return BOT_TEXT_SPEC_HOLY;\n+        case BOT_SPEC_PALADIN_PROTECTION:   return BOT_TEXT_SPEC_PROTECTION;\n+        case BOT_SPEC_PALADIN_RETRIBUTION:  return BOT_TEXT_SPEC_RETRIBUTION;\n+        case BOT_SPEC_HUNTER_BEASTMASTERY:  return BOT_TEXT_SPEC_BEASTMASTERY;\n+        case BOT_SPEC_HUNTER_MARKSMANSHIP:  return BOT_TEXT_SPEC_MARKSMANSHIP;\n+        case BOT_SPEC_HUNTER_SURVIVAL:      return BOT_TEXT_SPEC_SURVIVAL;\n+        case BOT_SPEC_ROGUE_ASSASINATION:   return BOT_TEXT_SPEC_ASSASINATION;\n+        case BOT_SPEC_ROGUE_COMBAT:         return BOT_TEXT_SPEC_COMBAT;\n+        case BOT_SPEC_ROGUE_SUBTLETY:       return BOT_TEXT_SPEC_SUBTLETY;\n+        case BOT_SPEC_PRIEST_DISCIPLINE:    return BOT_TEXT_SPEC_DISCIPLINE;\n+        case BOT_SPEC_PRIEST_HOLY:          return BOT_TEXT_SPEC_HOLY;\n+        case BOT_SPEC_PRIEST_SHADOW:        return BOT_TEXT_SPEC_SHADOW;\n+        case BOT_SPEC_DK_BLOOD:             return BOT_TEXT_SPEC_BLOOD;\n+        case BOT_SPEC_DK_FROST:             return BOT_TEXT_SPEC_FROST;\n+        case BOT_SPEC_DK_UNHOLY:            return BOT_TEXT_SPEC_UNHOLY;\n+        case BOT_SPEC_SHAMAN_ELEMENTAL:     return BOT_TEXT_SPEC_ELEMENTAL;\n+        case BOT_SPEC_SHAMAN_ENHANCEMENT:   return BOT_TEXT_SPEC_ENHANCEMENT;\n+        case BOT_SPEC_SHAMAN_RESTORATION:   return BOT_TEXT_SPEC_RESTORATION;\n+        case BOT_SPEC_MAGE_ARCANE:          return BOT_TEXT_SPEC_ARCANE;\n+        case BOT_SPEC_MAGE_FIRE:            return BOT_TEXT_SPEC_FIRE;\n+        case BOT_SPEC_MAGE_FROST:           return BOT_TEXT_SPEC_FROST;\n+        case BOT_SPEC_WARLOCK_AFFLICTION:   return BOT_TEXT_SPEC_AFFLICTION;\n+        case BOT_SPEC_WARLOCK_DEMONOLOGY:   return BOT_TEXT_SPEC_DEMONOLOGY;\n+        case BOT_SPEC_WARLOCK_DESTRUCTION:  return BOT_TEXT_SPEC_DESTRUCTION;\n+        case BOT_SPEC_DRUID_BALANCE:        return BOT_TEXT_SPEC_BALANCE;\n+        case BOT_SPEC_DRUID_FERAL:          return BOT_TEXT_SPEC_FERAL;\n+        case BOT_SPEC_DRUID_RESTORATION:    return BOT_TEXT_SPEC_RESTORATION;\n+        case BOT_SPEC_DEFAULT: default:     return BOT_TEXT_SPEC_UNKNOWN;\n+    }\n+}\n+\n+bool bot_ai::IsValidSpecForClass(uint8 m_class, uint8 spec)\n+{\n+    switch (m_class)\n+    {\n+        case BOT_CLASS_WARRIOR:\n+            switch (spec)\n+            {\n+                case BOT_SPEC_WARRIOR_ARMS:\n+                case BOT_SPEC_WARRIOR_FURY:\n+                case BOT_SPEC_WARRIOR_PROTECTION:\n+                    return true;\n+                default:\n+                    break;\n+            }\n+            break;\n+        case BOT_CLASS_PALADIN:\n+            switch (spec)\n+            {\n+                case BOT_SPEC_PALADIN_HOLY:\n+                case BOT_SPEC_PALADIN_PROTECTION:\n+                case BOT_SPEC_PALADIN_RETRIBUTION:\n+                    return true;\n+                default:\n+                    break;\n+            }\n+            break;\n+        case BOT_CLASS_HUNTER:\n+            switch (spec)\n+            {\n+                case BOT_SPEC_HUNTER_BEASTMASTERY:\n+                case BOT_SPEC_HUNTER_MARKSMANSHIP:\n+                case BOT_SPEC_HUNTER_SURVIVAL:\n+                    return true;\n+                default:\n+                    break;\n+            }\n+            break;\n+        case BOT_CLASS_ROGUE:\n+            switch (spec)\n+            {\n+                case BOT_SPEC_ROGUE_ASSASINATION:\n+                case BOT_SPEC_ROGUE_COMBAT:\n+                case BOT_SPEC_ROGUE_SUBTLETY:\n+                    return true;\n+                default:\n+                    break;\n+            }\n+            break;\n+        case BOT_CLASS_PRIEST:\n+            switch (spec)\n+            {\n+                case BOT_SPEC_PRIEST_DISCIPLINE:\n+                case BOT_SPEC_PRIEST_HOLY:\n+                case BOT_SPEC_PRIEST_SHADOW:\n+                    return true;\n+                default:\n+                    break;\n+            }\n+            break;\n+        case BOT_CLASS_DEATH_KNIGHT:\n+            switch (spec)\n+            {\n+                case BOT_SPEC_DK_BLOOD:\n+                case BOT_SPEC_DK_FROST:\n+                case BOT_SPEC_DK_UNHOLY:\n+                    return true;\n+                default:\n+                    break;\n+            }\n+            break;\n+        case BOT_CLASS_SHAMAN:\n+            switch (spec)\n+            {\n+                case BOT_SPEC_SHAMAN_ELEMENTAL:\n+                case BOT_SPEC_SHAMAN_ENHANCEMENT:\n+                case BOT_SPEC_SHAMAN_RESTORATION:\n+                    return true;\n+                default:\n+                    break;\n+            }\n+            break;\n+        case BOT_CLASS_MAGE:\n+            switch (spec)\n+            {\n+                case BOT_SPEC_MAGE_ARCANE:\n+                case BOT_SPEC_MAGE_FIRE:\n+                case BOT_SPEC_MAGE_FROST:\n+                    return true;\n+                default:\n+                    break;\n+            }\n+            break;\n+        case BOT_CLASS_WARLOCK:\n+            switch (spec)\n+            {\n+                case BOT_SPEC_WARLOCK_AFFLICTION:\n+                case BOT_SPEC_WARLOCK_DEMONOLOGY:\n+                case BOT_SPEC_WARLOCK_DESTRUCTION:\n+                    return true;\n+                default:\n+                    break;\n+            }\n+            break;\n+        case BOT_CLASS_DRUID:\n+            switch (spec)\n+            {\n+                case BOT_SPEC_DRUID_BALANCE:\n+                case BOT_SPEC_DRUID_FERAL:\n+                case BOT_SPEC_DRUID_RESTORATION:\n+                    return true;\n+                default:\n+                    break;\n+            }\n+            break;\n+        case BOT_CLASS_BM:\n+        case BOT_CLASS_SPHYNX:\n+        case BOT_CLASS_ARCHMAGE:\n+        case BOT_CLASS_DREADLORD:\n+        case BOT_CLASS_SPELLBREAKER:\n+        case BOT_CLASS_DARK_RANGER:\n+        case BOT_CLASS_NECROMANCER:\n+        case BOT_CLASS_SEA_WITCH:\n+        case BOT_CLASS_CRYPT_LORD:\n+            return spec == BOT_SPEC_DEFAULT;\n+        default:\n+            break;\n+    }\n+    return false;\n+}\n+\n+void bot_ai::InitEquips()\n+{\n+    EquipmentInfo const* einfo = BotDataMgr::GetBotEquipmentInfo(me->GetEntry());\n+    ASSERT(einfo, \"Trying to spawn bot with no equip info!\");\n+\n+    if (IsWanderer())\n+    {\n+        auto fit_check = [this](uint8 slot, ItemTemplate const* proto) { return _isItemFitForWanderingBot(slot, proto); };\n+\n+        GenerateRand();\n+        uint8 lvl = me->GetLevel();\n+        std::ostringstream gss;\n+        gss << \"bot_ai::InitEquips(): Wanderer bot \" << me->GetName() << \" id \" << me->GetEntry() << ' ' << \"level \" << uint32(lvl) << \" generated gear:\";\n+        for (auto i : NPCBots::index_array<uint8, BOT_INVENTORY_SIZE>)\n+        {\n+            if (i == BOT_SLOT_OFFHAND && (!_canUseOffHand() || (lvl < 10 && IsCastingClass(_botclass))))\n+                continue;\n+            if ((i == BOT_SLOT_FINGER1 || i == BOT_SLOT_FINGER2 || i == BOT_SLOT_NECK || i == BOT_SLOT_SHOULDERS) && lvl < 20)\n+                continue;\n+            if ((i == BOT_SLOT_TRINKET1 || i == BOT_SLOT_TRINKET2 || i == BOT_SLOT_HEAD) && lvl < 30)\n+                continue;\n+\n+            Item* item = BotDataMgr::GenerateWanderingBotItem(i, _botclass, lvl, fit_check);\n+            if (!item)\n+            {\n+                if (i <= BOT_SLOT_RANGED && einfo->ItemEntry[i] != 0)\n+                {\n+                    BOT_LOG_WARN(\"npcbots\", \"Wanderer bot {} id {} level {} can't generate req gear in slot {}, generating standard item!\",\n+                        me->GetName().c_str(), me->GetEntry(), uint32(me->GetLevel()), uint32(i));\n+\n+                    item = Item::CreateItem(einfo->ItemEntry[i], 1);\n+                    ASSERT(item, \"Failed to init standard Item for wandering bot!\");\n+                    _equips[i] = item;\n+                }\n+            }\n+            else\n+            {\n+                _equips[i] = item;\n+                if (GetSpec() != BOT_SPEC_DEFAULT && BotDataMgr::GenerateWanderingBotItemEnchants(item, i, GetSpec())) {}\n+\n+                gss << \" [\" << uint32(i) << \"] \" << _equips[i]->GetTemplate()->Name1 << \" (\" << _equips[i]->GetEntry() << ')';\n+            }\n+        }\n+        BOT_LOG_TRACE(\"npcbots\", \"{}\", gss.str());\n+    }\n+    else\n+    {\n+        CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_NPCBOT_EQUIP_BY_ITEM_INSTANCE);\n+        //        0            1                2      3         4        5      6             7                 8           9           10    11    12         13\n+        //\"SELECT creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomPropertyId, durability, playedTime, text, guid, itemEntry, owner_guid \"\n+        //  \"FROM item_instance WHERE guid IN (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\", CONNECTION_SYNCH\n+\n+        std::array<uint32, BOT_INVENTORY_SIZE> assigned_item_guids{};\n+        for (auto i : NPCBots::index_array<uint8, BOT_INVENTORY_SIZE>)\n+        {\n+            stmt->SetData(i, _botData->equips[i]);\n+            assigned_item_guids[i] = _botData->equips[i];\n+        }\n+\n+        PreparedQueryResult iiresult = CharacterDatabase.Query(stmt);\n+\n+        if (!iiresult) //blank bot - fill with standard items\n+        {\n+            for (auto i : NPCBots::index_array<uint8, MAX_EQUIPMENT_ITEMS>)\n+            {\n+                uint32 itemId = einfo->ItemEntry[i];\n+                if (!itemId)\n+                    continue;\n+\n+                Item* item = Item::CreateItem(itemId, 1, nullptr);\n+                ASSERT(item, \"Failed to init standard Item for bot!\");\n+                _equips[i] = item;\n+            }\n+        }\n+        else\n+        {\n+            Field* fields2;\n+            do\n+            {\n+                fields2 = iiresult->Fetch();\n+                uint32 itemGuidLow = fields2[11].Get<uint32>();\n+                uint32 itemId = fields2[12].Get<uint32>();\n+                Item* item = new Item;\n+                ASSERT(item->LoadFromDB(itemGuidLow, ObjectGuid::Empty, fields2, itemId));\n+                //gonna find where to store our new item\n+                bool found = false;\n+                for (auto i : NPCBots::index_array<uint8, BOT_INVENTORY_SIZE>)\n+                {\n+                    if (_botData->equips[i] == itemGuidLow && !_equips[i])\n+                    {\n+                        _equips[i] = item;\n+                        found = true;\n+                        BotLogger::Log(NPCBOT_LOG_INIT_EQUIP, me, uint32(i), uint32(itemGuidLow), uint32(itemId));\n+                        break;\n+                    }\n+                }\n+                ASSERT(found);\n+                for (auto i : NPCBots::index_array<uint8, BOT_INVENTORY_SIZE>)\n+                {\n+                    if (assigned_item_guids[i] == itemGuidLow)\n+                        assigned_item_guids[i] = 0;\n+                }\n+\n+            } while (iiresult->NextRow());\n+        }\n+\n+        for (auto i : NPCBots::index_array<uint8, BOT_INVENTORY_SIZE>)\n+        {\n+            if (assigned_item_guids[i] != 0)\n+                BOT_LOG_ERROR(\"npcbots\", \"InitEquips: bot {} {} owner {} has item guid {} assigned to slot {} which doesn't exist in DB!\",\n+                    me->GetEntry(), me->GetName(), _botData->owner, assigned_item_guids[i], uint32(i));\n+        }\n+    }\n+\n+    //visualize\n+    for (auto i : NPCBots::index_array<uint8, BOT_FIRST_NON_WEAPON_SLOT>)\n+    {\n+        if (CanChangeEquip(i) && _equips[i])\n+        {\n+            NpcBotTransmogData const* transmogData = BotDataMgr::SelectNpcBotTransmogs(me->GetEntry());\n+            if (einfo->ItemEntry[i] != _equips[i]->GetEntry() && transmogData && BotCfg::IsTransmogEnabled() && (transmogData->transmogs[i].first == _equips[i]->GetEntry() || BotCfg::TransmogUseEquipmentSlots()))\n+                me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + i, uint32(std::max<int32>(transmogData->transmogs[i].second, 0)));\n+            else\n+                me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + i, _equips[i]->GetEntry());\n+        }\n+        else if (einfo->ItemEntry[i])\n+            me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + i, einfo->ItemEntry[i]);\n+    }\n+\n+    //apply weapons' parameters\n+    if (Item const* MH = _equips[BOT_SLOT_MAINHAND])\n+    {\n+        uint32 itemId = MH->GetEntry();\n+        if (einfo->ItemEntry[0] != itemId)\n+        {\n+            if (ItemTemplate const* proto = sObjectMgr->GetItemTemplate(itemId))\n+            {\n+                if (RespectEquipsAttackTime())\n+                    me->SetAttackTime(BASE_ATTACK, proto->Delay);\n+                ApplyItemBonuses(BOT_SLOT_MAINHAND);\n+            }\n+        }\n+    }\n+    if (Item const* OH = _equips[BOT_SLOT_OFFHAND])\n+    {\n+        uint32 itemId = OH->GetEntry();\n+        if (ItemTemplate const* proto = sObjectMgr->GetItemTemplate(itemId))\n+        {\n+            if (einfo->ItemEntry[1] != itemId)\n+                ApplyItemBonuses(BOT_SLOT_OFFHAND);\n+\n+            if (proto->Class == ITEM_CLASS_WEAPON)\n+            {\n+                if (RespectEquipsAttackTime())\n+                    me->SetAttackTime(OFF_ATTACK, proto->Delay);\n+                me->SetCanDualWield(true);\n+            }\n+            else if (proto->Class == ITEM_CLASS_ARMOR && proto->SubClass == ITEM_SUBCLASS_ARMOR_SHIELD)\n+            {\n+                if (me->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_NO_BLOCK)\n+                    const_cast<CreatureTemplate*>(me->GetCreatureTemplate())->flags_extra &= ~CREATURE_FLAG_EXTRA_NO_BLOCK;\n+            }\n+        }\n+    }\n+    if (Item const* RH = _equips[BOT_SLOT_RANGED])\n+    {\n+        uint32 itemId = RH->GetEntry();\n+        if (einfo->ItemEntry[2] != itemId)\n+        {\n+            if (ItemTemplate const* proto = sObjectMgr->GetItemTemplate(itemId))\n+            {\n+                if (proto->Class == ITEM_CLASS_WEAPON)\n+                    if (RespectEquipsAttackTime())\n+                        me->SetAttackTime(RANGED_ATTACK, proto->Delay);\n+\n+                ApplyItemBonuses(BOT_SLOT_RANGED);\n+            }\n+        }\n+    }\n+\n+    for (uint8 i = BOT_SLOT_RANGED + 1; i != BOT_INVENTORY_SIZE; ++i)\n+        ApplyItemBonuses(i);\n+\n+    ApplyItemSetBonuses(nullptr, true);\n+\n+    for (auto i : NPCBots::index_array<uint8, MAX_EQUIPMENT_ITEMS>)\n+    {\n+        if (_equips[i] == nullptr && einfo->ItemEntry[i] != 0)\n+        {\n+            if (i == BOT_SLOT_OFFHAND && !_canUseOffHand())\n+            {\n+                me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + i, uint32(0));\n+                continue;\n+            }\n+\n+            //if bot has no equips but equip template then use those\n+            Item* item = Item::CreateItem(einfo->ItemEntry[i], 1, nullptr);\n+            ASSERT(item, \"Failed to init standard Item for bot point 2!\");\n+            _equips[i] = item;\n+\n+            me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + i, einfo->ItemEntry[i]);\n+            if (i == BOT_SLOT_OFFHAND)\n+            {\n+                if (ItemTemplate const* proto = sObjectMgr->GetItemTemplate(einfo->ItemEntry[i]))\n+                {\n+                    if (proto->Class == ITEM_CLASS_WEAPON)\n+                    {\n+                        me->SetAttackTime(OFF_ATTACK, _botclass == BOT_CLASS_ROGUE ? 1400 : 1800);\n+                        me->SetCanDualWield(true);\n+                    }\n+                    else if (proto->Class == ITEM_CLASS_ARMOR && proto->SubClass == ITEM_SUBCLASS_ARMOR_SHIELD)\n+                    {\n+                        if (me->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_NO_BLOCK)\n+                            const_cast<CreatureTemplate*>(me->GetCreatureTemplate())->flags_extra &= ~CREATURE_FLAG_EXTRA_NO_BLOCK;\n+                    }\n+                }\n+            }\n+        }\n+    }\n+\n+    for (auto slot : NPCBots::index_array<uint8, BOT_INVENTORY_SIZE>)\n+    {\n+        if (_equips[slot] && IsUsableItem(_equips[slot]))\n+        {\n+            uint32 slotMask = 1ul << slot;\n+            ASSERT(!(_usableItemSlotsMask & slotMask));\n+            _usableItemSlotsMask |= slotMask;\n+        }\n+    }\n+}\n+\n+void bot_ai::FindMaster()\n+{\n+    //totally free\n+    if (!_botData->owner)\n+        return;\n+    if (me->IsInWorld() && (!_atHome || _evadeMode))\n+        return;\n+    if (!BotCfg::IsClassEnabled(_botclass))\n+        return;\n+\n+    //delay\n+    if (_checkMasterTimer > lastdiff)\n+        return;\n+\n+    _checkMasterTimer = urand(1000, 3000);\n+\n+    //already have master\n+    if (!IAmFree())\n+        return;\n+    if (HasBotCommandState(BOT_COMMAND_UNBIND))\n+        return;\n+\n+    for (auto const& container : { {_botData->owner}, _botData->shared_owners })\n+    {\n+        for (uint32 guid_low : container)\n+        {\n+            if (Player* player = ObjectAccessor::FindPlayerByLowGUID(guid_low))\n+            {\n+                if (player->IsGameMaster() || player->GetSession()->isLogingOut() || player->GetSession()->PlayerLogout())\n+                    return;\n+\n+                if (SetBotOwner(player))\n+                    return;\n+            }\n+        }\n+    }\n+}\n+\n+uint32 bot_ai::CalculateOwnershipCheckTime()\n+{\n+    if (!_botData->owner)\n+        return 0;\n+\n+    if (!IAmFree() || BotCfg::GetOwnershipExpireMode() == BOT_OWNERSHIP_EXPIRE_OFFLINE)\n+        return static_cast<uint32>(std::min<uint32>(BotCfg::GetOwnershipExpireTime(), urand(3 * MINUTE, 7 * MINUTE)) * IN_MILLISECONDS);\n+\n+    return static_cast<uint32>(std::max<time_t>(time_t(_botData->hire_time + BotCfg::GetOwnershipExpireTime() + 1) - time(0), 5) * IN_MILLISECONDS);\n+}\n+\n+bool bot_ai::IAmFree() const\n+{\n+    if (!_botData->owner)\n+        return true;\n+    if (_botData->owner != master->GetGUID().GetRawValue() && !(master->GetGUID().IsPlayer() && _botData->shared_owners.contains(master->GetGUID().GetCounter())))\n+        return true;\n+    return false;\n+}\n+\n+//UTILITIES\n+void bot_ai::_AddItemTemplateLink(Player const* forPlayer, ItemTemplate const* item, std::ostringstream &str) const\n+{\n+    //color\n+    str << \"|c\";\n+    switch (item->Quality)\n+    {\n+        case ITEM_QUALITY_POOR:     str << \"ff9d9d9d\"; break;  //GREY\n+        case ITEM_QUALITY_NORMAL:   str << \"ffffffff\"; break;  //WHITE\n+        case ITEM_QUALITY_UNCOMMON: str << \"ff1eff00\"; break;  //GREEN\n+        case ITEM_QUALITY_RARE:     str << \"ff0070dd\"; break;  //BLUE\n+        case ITEM_QUALITY_EPIC:     str << \"ffa335ee\"; break;  //PURPLE\n+        case ITEM_QUALITY_LEGENDARY:str << \"ffff8000\"; break;  //ORANGE\n+        case ITEM_QUALITY_ARTIFACT: str << \"ffe6cc80\"; break;  //LIGHT YELLOW\n+        case ITEM_QUALITY_HEIRLOOM: str << \"ffe6cc80\"; break;  //LIGHT YELLOW\n+        default:                    str << \"ff000000\"; break;  //UNK BLACK\n+    }\n+    str << \"|Hitem:\" << uint32(item->ItemId) << ':';\n+\n+    //permanent enchantment, 3 gems, 4 unknowns, reporter_level (9)\n+    str << \"0:0:0:0:0:0:0:0:0\";\n+\n+    //name\n+    std::string name = item->Name1;\n+    _LocalizeItem(forPlayer, name, item->ItemId);\n+    str << \"|h[\" << name << \"]|h|r\";\n+\n+    //max in stack\n+    if (item->BuyCount > 1)\n+        str<< \"|cff009900x\" << item->BuyCount << \"|r\";\n+    else\n+        str << \"|cff009900|r\";\n+}\n+// |TInterface\\\\Icons\\\\INV_<iconName>:<iconSize>|t|color|Hitem:item_id:perm_ench_id:gem1:gem2:gem3:0:random_property:suffix_factor:reporter_level|h[name]|h|r\n+// |TInterface\\\\Icons\\\\INV_Misc_Staff_01:16|t|cffa335ee|Hitem:812:0:0:0:0:0:0:0:70|h[Glowing Brightwood Staff]|h|r\n+void bot_ai::_AddItemLink(Player const* forPlayer, Item const* item, std::ostringstream &str, bool addIcon) const\n+{\n+    ItemTemplate const* proto = item->GetTemplate();\n+    //ItemRandomSuffixEntry const* item_rand = sItemRandomSuffixStore.LookupEntry(abs(item->GetItemRandomPropertyId()));\n+    uint32 g1 = 0, g2 = 0, g3 = 0;\n+    //uint32 bpoints = 0;\n+    std::string name = proto->Name1;\n+    std::string suffix{};\n+\n+    //icon\n+    if (addIcon)\n+    {\n+        ItemDisplayInfoEntry const* itemDisplayEntry = sItemDisplayInfoStore.LookupEntry(item->GetTemplate()->DisplayInfoID);\n+        if (itemDisplayEntry)\n+            str << \"|TInterface\\\\Icons\\\\\" << itemDisplayEntry->inventoryIcon << \":16|t\";\n+    }\n+\n+    //color\n+    str << \"|c\";\n+    switch (proto->Quality)\n+    {\n+        case ITEM_QUALITY_POOR:     str << \"ff9d9d9d\"; break;  //GREY\n+        case ITEM_QUALITY_NORMAL:   str << \"ffffffff\"; break;  //WHITE\n+        case ITEM_QUALITY_UNCOMMON: str << \"ff1eff00\"; break;  //GREEN\n+        case ITEM_QUALITY_RARE:     str << \"ff0070dd\"; break;  //BLUE\n+        case ITEM_QUALITY_EPIC:     str << \"ffa335ee\"; break;  //PURPLE\n+        case ITEM_QUALITY_LEGENDARY:str << \"ffff8000\"; break;  //ORANGE\n+        case ITEM_QUALITY_ARTIFACT: str << \"ffe6cc80\"; break;  //LIGHT YELLOW\n+        case ITEM_QUALITY_HEIRLOOM: str << \"ffe6cc80\"; break;  //LIGHT YELLOW\n+        default:                    str << \"ff000000\"; break;  //UNK BLACK\n+    }\n+    str << \"|Hitem:\" << proto->ItemId << ':';\n+\n+    //permanent enchantment\n+    str << item->GetEnchantmentId(PERM_ENCHANTMENT_SLOT) << ':';\n+    //gems 3\n+    for (uint32 slot = SOCK_ENCHANTMENT_SLOT; slot != SOCK_ENCHANTMENT_SLOT + MAX_ITEM_PROTO_SOCKETS; ++slot)\n+    {\n+        uint32 eId = item->GetEnchantmentId(EnchantmentSlot(slot));\n+\n+        switch (slot - SOCK_ENCHANTMENT_SLOT)\n+        {\n+            case 0: g1 = eId;   break;\n+            case 1: g2 = eId;   break;\n+            case 2: g3 = eId;   break;\n+        }\n+    }\n+    str << g1 << ':' << g2 << ':' << g3 << ':';\n+    //always zero\n+    str << 0 << ':';\n+    //random property\n+    str << item->GetItemRandomPropertyId() << ':';\n+    str << item->GetItemSuffixFactor() << ':';\n+\n+    //reporter level\n+    str << uint32(me->GetLevel());\n+\n+    //name\n+    _LocalizeItem(forPlayer, name, suffix, item);\n+\n+    str << \"|h[\" << name;\n+    if (suffix.length() > 0)\n+        str << ' ' << suffix;\n+    str <<\"]|h|r\";\n+\n+    //quantity\n+    if (item->GetCount() > 1)\n+        str << \"x\" << item->GetCount() << ' ';\n+\n+    //BOT_LOG_ERROR(\"entities.player\", \"bot_ai::_AddItemLink(): %s\", str.str().c_str());\n+}\n+//Unused\n+void bot_ai::_AddQuestLink(Player const* forPlayer, Quest const* quest, std::ostringstream &str) const\n+{\n+    std::string questTitle = quest->GetTitle();\n+    _LocalizeQuest(forPlayer, questTitle, quest->GetQuestId());\n+    str << \"|cFFEFFD00|Hquest:\" << quest->GetQuestId() << ':' << quest->GetQuestLevel() << \"|h[\" << questTitle << \"]|h|r\";\n+}\n+//Unsused\n+void bot_ai::_AddWeaponSkillLink(Player const* forPlayer, SpellInfo const* spellInfo, std::ostringstream &str, uint32 skillid) const\n+{\n+    uint32 loc = forPlayer->GetSession()->GetSessionDbcLocale();\n+    str << \"|cff00ffff|Hspell:\" << spellInfo->Id << \"|h[\" << spellInfo->SpellName[loc] << \" : \" << master->GetSkillValue(skillid) << \" /\" << master->GetMaxSkillValue(skillid) << \"]|h|r\";\n+}\n+//|cff71d5ff|Hspell:21563|h[Command]|h|r\n+void bot_ai::_AddSpellLink(Player const* forPlayer, SpellInfo const* spellInfo, std::ostringstream &str, bool color/* = true*/) const\n+{\n+    uint32 loc = forPlayer->GetSession()->GetSessionDbcLocale();\n+    str << \"|c\";\n+\n+    if (color)\n+    {\n+        switch (GetFirstSchoolInMask(spellInfo->GetSchoolMask()))\n+        {\n+            case SPELL_SCHOOL_NORMAL:       str << \"ffffff00\"; break; //YELLOW\n+            case SPELL_SCHOOL_HOLY:         str << \"ffffe680\"; break; //LIGHT YELLOW\n+            case SPELL_SCHOOL_FIRE:         str << \"ffff8000\"; break; //ORANGE\n+            case SPELL_SCHOOL_NATURE:       str << \"ff4dff4d\"; break; //GREEN\n+            case SPELL_SCHOOL_FROST:        str << \"ff80ffff\"; break; //LIGHT BLUE\n+            case SPELL_SCHOOL_SHADOW:       str << \"ff8080ff\"; break; //DARK BLUE\n+            case SPELL_SCHOOL_ARCANE:       str << \"ffff80ff\"; break; //LIGHT PURPLE\n+            default:                        str << \"ffffffff\"; break; //UNK WHITE\n+        }\n+    }\n+    else\n+        str << \"ffffffff\"; //default white\n+\n+    str << \"|Hspell:\" << spellInfo->Id << \"|h[\" << spellInfo->SpellName[loc] << \"]|h|r\";\n+}\n+//Unused\n+void bot_ai::_AddProfessionLink(Player const* forPlayer, SpellInfo const* spellInfo, std::ostringstream &str, uint32 skillId) const\n+{\n+    ASSERT(master->HasSkill(skillId));\n+    // |cffffd000|Htrade:4037:1:150:1:6AAAAAAAAAAAAAAAAAAAAAAOAADAAAAAAAAAAAAAAAAIAAAAAAAAA|h[Engineering]|h|r\n+    uint32 loc = forPlayer->GetSession()->GetSessionDbcLocale();\n+    SkillLineEntry const* skillInfo = sSkillLineStore.LookupEntry(skillId);\n+    if (skillInfo)\n+    {\n+        uint32 curValue = master->GetPureSkillValue(skillId);\n+        uint32 maxValue  = master->GetPureMaxSkillValue(skillId);\n+        str << \"|cffffd000|Htrade:\" << spellInfo->Id << ':' << curValue << ':' << maxValue << ':' << master->GetGUID().GetCounter() << \":6AAAAAAAAAAAAAAAAAAAAAAOAADAAAAAAAAAAAAAAAAIAAAAAAAAA\" << \"|h[\" << skillInfo->name[loc] << \"]|h|r\";\n+    }\n+}\n+//Localization\n+void bot_ai::_LocalizeItem(Player const* forPlayer, std::string &itemName, uint32 entry) const\n+{\n+    uint32 loc = forPlayer->GetSession()->GetSessionDbLocaleIndex();\n+    std::wstring wnamepart;\n+\n+    ItemLocale const* itemInfo = sObjectMgr->GetItemLocale(entry);\n+    if (!itemInfo)\n+        return;\n+\n+    if (itemInfo->Name.size() > loc && !itemInfo->Name[loc].empty())\n+    {\n+        std::string name = itemInfo->Name[loc];\n+        if (Utf8FitTo(name, wnamepart))\n+            itemName = std::move(name);\n+    }\n+}\n+\n+void bot_ai::_LocalizeItem(Player const* forPlayer, std::string &itemName, std::string &suffix, Item const* item) const\n+{\n+    uint32 loc = forPlayer->GetSession()->GetSessionDbLocaleIndex();\n+    std::wstring wnamepart;\n+\n+    ItemLocale const* itemInfo = sObjectMgr->GetItemLocale(item->GetEntry());\n+    if (loc > 0 && itemInfo && itemInfo->Name.size() > loc && !itemInfo->Name[loc].empty())\n+    {\n+        const std::string name = itemInfo->Name[loc];\n+        if (Utf8FitTo(name, wnamepart))\n+            itemName = name;\n+    }\n+\n+    int32 randomPropId = item->GetItemRandomPropertyId();\n+    //BOT_LOG_ERROR(\"entities.player\", \"bot_ai::_LocalizeItem(): randomPropId = %i\", randomPropId);\n+    if (!randomPropId)\n+        return;\n+\n+    if (randomPropId > 0)\n+    {\n+        if (ItemRandomPropertiesEntry const* item_rand = sItemRandomPropertiesStore.LookupEntry(randomPropId))\n+        {\n+            std::array<char const*, 16> const& suffs = item_rand->Name;\n+            //if (suffs)\n+            {\n+                //for (uint8 i = 0; i != MAX_LOCALES; ++i)\n+                //    BOT_LOG_ERROR(\"entities.player\", \"bot_ai::_LocalizeItem(): rand prop suffix for loc %u = %s\", i, suffs[i]);\n+                suffix = suffs[loc];\n+            }\n+        }\n+    }\n+    else\n+    {\n+        if (ItemRandomSuffixEntry const* item_rand = sItemRandomSuffixStore.LookupEntry(-randomPropId))\n+        {\n+            std::array<char const*, 16> const& suffs = item_rand->Name;\n+            //if (suffs)\n+            {\n+                //for (uint8 i = 0; i != MAX_LOCALES; ++i)\n+                //    BOT_LOG_ERROR(\"entities.player\", \"bot_ai::_LocalizeItem(): rand suff suffix for loc %u = %s\", i, suffs[i]);\n+                suffix = suffs[loc];\n+            }\n+        }\n+    }\n+}\n+\n+void bot_ai::_LocalizeQuest(Player const* forPlayer, std::string &questTitle, uint32 entry) const\n+{\n+    uint32 loc = forPlayer->GetSession()->GetSessionDbLocaleIndex();\n+    std::wstring wnamepart;\n+\n+    QuestLocale const* questInfo = sObjectMgr->GetQuestLocale(entry);\n+    if (!questInfo)\n+        return;\n+\n+    if (questInfo->Title.size() > loc && !questInfo->Title[loc].empty())\n+    {\n+        const std::string title = questInfo->Title[loc];\n+        if (Utf8FitTo(title, wnamepart))\n+            questTitle = title;\n+    }\n+}\n+\n+void bot_ai::_LocalizeCreature(Player const* forPlayer, std::string &creatureName, uint32 entry) const\n+{\n+    uint32 loc = forPlayer->GetSession()->GetSessionDbLocaleIndex();\n+    std::wstring wnamepart;\n+\n+    CreatureLocale const* creatureInfo = sObjectMgr->GetCreatureLocale(entry);\n+    if (!creatureInfo)\n+        return;\n+\n+    if (creatureInfo->Name.size() > loc && !creatureInfo->Name[loc].empty())\n+    {\n+        std::string title = creatureInfo->Name[loc];\n+        if (Utf8FitTo(title, wnamepart))\n+            creatureName = std::move(title);\n+    }\n+}\n+\n+void bot_ai::_LocalizeGameObject(Player const* forPlayer, std::string &gameobjectName, uint32 entry) const\n+{\n+    uint32 loc = forPlayer->GetSession()->GetSessionDbLocaleIndex();\n+    std::wstring wnamepart;\n+\n+    GameObjectLocale const* gameObjectInfo = sObjectMgr->GetGameObjectLocale(entry);\n+    if (!gameObjectInfo)\n+        return;\n+\n+    if (gameObjectInfo->Name.size() > loc && !gameObjectInfo->Name[loc].empty())\n+    {\n+        std::string title = gameObjectInfo->Name[loc];\n+        if (Utf8FitTo(title, wnamepart))\n+            gameobjectName = std::move(title);\n+    }\n+}\n+\n+void bot_ai::_LocalizeSpell(Player const* forPlayer, std::string &spellName, uint32 entry) const\n+{\n+    uint32 loc = forPlayer->GetSession()->GetSessionDbcLocale();\n+    std::wstring wnamepart;\n+\n+    SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(entry);\n+    if (!spellInfo)\n+    {\n+        spellName = LocalizedNpcText(forPlayer, BOT_TEXT_UNKNOWN);\n+        return;\n+    }\n+\n+    std::string title = spellInfo->SpellName[loc];\n+    if (Utf8FitTo(title, wnamepart))\n+        spellName = std::move(title);\n+    else\n+        spellName = spellInfo->SpellName[sWorld->GetDefaultDbcLocale()];\n+}\n+\n+void bot_ai::BotJump(Position const* pos, bool count)\n+{\n+    if (count)\n+        ++_jumpCount;\n+\n+    me->BotStopMovement();\n+    me->GetMotionMaster()->MoveJump(*pos, me->GetExactDist2d(pos->m_positionX, pos->m_positionY), 10.0f);\n+}\n+\n+bool bot_ai::UpdateImpossibleChase(Unit const* target)\n+{\n+    if (_chaseTimer > lastdiff || me->isMoving() || !IAmFree())\n+        return false;\n+\n+    if (JumpingOrFalling())\n+        return false;\n+\n+    if (_jumpCount >= 3)\n+    {\n+        me->AttackStop();\n+        Evade();\n+        return true;\n+    }\n+\n+    if (_unreachableCount < 5)\n+    {\n+        if ((IsRanged() ? me->GetDistance(target) > 40.0f : !me->IsWithinMeleeRange(target)) ||\n+            (target->IsCreature() && !me->IsWithinLOSInMap(target, VMAP::ModelIgnoreFlags::M2, LINEOFSIGHT_ALL_CHECKS)))\n+        {\n+            ++_unreachableCount;\n+            ResetChaseTimer(target);\n+            BotMovement(BOT_MOVE_POINT, target, nullptr, false);\n+        }\n+        else\n+            _unreachableCount = 0;\n+\n+        return true;\n+    }\n+\n+    if (target->IsPlayer() && (!me->IsWithinDist(target, HasRole(BOT_ROLE_RANGED) ? 65 : 40) || me->IsWithinDist(target, HasRole(BOT_ROLE_RANGED) ? 35 : 10)))\n+        return false;\n+\n+    _unreachableCount = 0;\n+\n+    ResetChaseTimer(target);\n+\n+    BotJump(target);\n+    return true;\n+}\n+\n+void bot_ai::ResetChaseTimer(Position const* /*pos*/)\n+{\n+    _chaseTimer = IsWanderer() ? 5000 : 20000;\n+}\n+\n+void bot_ai::ResetChase(Position const* pos)\n+{\n+    if (!IAmFree())\n+        return;\n+\n+    ResetChaseTimer(pos);\n+    _unreachableCount = 0;\n+    _jumpCount = 0;\n+}\n+\n+void bot_ai::ResetEngageTimer(uint32 delay)\n+{\n+    _engageTimer = delay;\n+}\n+\n+void bot_ai::OnStartAttack(Unit const* u)\n+{\n+    if (u->GetGUID() != _lastTargetGuid)\n+    {\n+        ResetChase(u);\n+        _lastTargetGuid = u->GetGUID();\n+    }\n+}\n+\n+bool bot_ai::StartAttack(Unit const* u, bool force)\n+{\n+    if (HasBotCommandState(BOT_COMMAND_ATTACK) && !force)\n+        return false;\n+\n+    SetBotCommandState(BOT_COMMAND_ATTACK);\n+    OnStartAttack(u);\n+    return true;\n+}\n+\n+void bot_ai::JustEngagedWith(Unit* u)\n+{\n+    _atHome = false;\n+\n+    //clear gossip during combat. See CheckAuras() for restore\n+    if (me->HasNpcFlag(UNIT_NPC_FLAG_GOSSIP))\n+        me->RemoveNpcFlag(UNIT_NPC_FLAG_GOSSIP);\n+\n+    _evadeMode = false;\n+    _evadeCount = 0;\n+    evadeDelayTimer = 0;\n+    AbortTeleport();\n+\n+    ResetChase(u);\n+\n+    me->RefreshSwimmingFlag();\n+\n+    if (IsLastOrder(BOT_ORDER_PULL, 0, u->GetGUID()))\n+        CompleteOrder(_orders.front());\n+\n+    if (IAmFree() && me->GetVictim() && me->GetVictim() != u &&\n+        (me->getAttackers().empty() || (me->getAttackers().size() == 1u && *me->getAttackers().begin() == u)) &&\n+        me->GetVictim()->GetVictim() != me && !(me->GetVictim()->IsInCombat() || me->GetVictim()->IsInCombatWith(me)))\n+    {\n+        bool byspell = false;\n+        switch (_botclass)\n+        {\n+            case BOT_CLASS_DRUID:\n+                byspell = GetBotStance() == BOT_STANCE_NONE || GetBotStance() == DRUID_MOONKIN_FORM;\n+                break;\n+            case BOT_CLASS_PRIEST:\n+            case BOT_CLASS_MAGE:\n+            case BOT_CLASS_WARLOCK:\n+            case BOT_CLASS_SHAMAN:\n+            case BOT_CLASS_SPHYNX:\n+            case BOT_CLASS_ARCHMAGE:\n+                byspell = true;\n+                break;\n+            default:\n+                break;\n+        }\n+\n+        if (CanBotAttack(u, byspell))\n+        {\n+            me->AttackStop();\n+            me->BotStopMovement();\n+            SetBotCommandState(BOT_COMMAND_COMBATRESET); //reset AttackStart()\n+            me->Attack(u, !HasRole(BOT_ROLE_RANGED));\n+        }\n+    }\n+}\n+//killer may be NULL\n+void bot_ai::JustDied(Unit* u)\n+{\n+    AbortTeleport();\n+    AbortAwaitStateRemoval();\n+    KillEvents(false);\n+    CancelAllOrders();\n+\n+    if (me->GetVehicle())\n+        me->ExitVehicle();\n+\n+    if (me->GetTransport())\n+    {\n+        me->ClearUnitState(UNIT_STATE_IGNORE_PATHFINDING);\n+        me->GetTransport()->RemovePassenger(me, true);\n+    }\n+\n+    if (IsTempBot())\n+    {\n+        //BOT_LOG_ERROR(\"entities.player\", \"Unsummoning temp bot %s (%s), owner: %s (%s)...\",\n+        //    me->GetName().c_str(), me->GetGUID().ToString().c_str(), master->GetName().c_str(), master->GetGUID().ToString().c_str());\n+\n+        if (!IAmFree())\n+            master->GetBotMgr()->RemoveBot(me->GetGUID(), BOT_REMOVE_UNSUMMON);\n+\n+        me->AddObjectToRemoveList();\n+        return;\n+    }\n+    else if (!IAmFree())\n+    {\n+        if (Group* gr = master->GetGroup())\n+            if (gr->IsMember(me->GetGUID()))\n+                gr->SendUpdate();\n+    }\n+\n+    if (IsWanderer() && me->GetMap()->IsBattlegroundOrArena())\n+    {\n+        if (Battleground const* bg = GetBG())\n+        {\n+            if (GraveyardStruct const* gy = bg->GetClosestGraveyardForBot(me))\n+            {\n+                Position pos(gy->x, gy->y, gy->z, me->GetOrientation());\n+                Events.AddEventAtOffset([me = me, pos = pos]() { BotMgr::TeleportBot(me, me->GetMap(), &pos, true); }, 5s);\n+            }\n+        }\n+    }\n+    else if (u && (u->IsPvP() || u->IsControlledByPlayer() || u->IsNPCBotOrPet()))\n+    {\n+        BOT_LOG_DEBUG(\"npcbots\", \"{} {} id {} class {} level {} WAS KILLED BY {} {} id {} class {} level {} on their way to {}!\",\n+            IsWanderer() ? \"Wandering bot\" : \"Bot\", me->GetName().c_str(), me->GetEntry(), uint32(_botclass), uint32(me->GetLevel()),\n+            (u->IsPlayer() ? \"player\" : u->IsNPCBot() ? u->ToCreature()->GetBotAI()->IsWanderer() ? \"wandering bot\" : \"bot\" : u->IsNPCBotPet() ? \"botpet\" : \"creature\"),\n+            u->GetName().c_str(), u->GetEntry(), uint32(u->GetClass()), uint32(u->GetLevel()),\n+            IsWanderer() ? _travel_node_cur->GetName().c_str() : \"''\");\n+    }\n+\n+    _reviveTimer = (IsWanderer() && !(u && u->IsControlledByPlayer())) ? REVIVE_TIMER_MEDIUM :\n+        IAmFree() ? REVIVE_TIMER_DEFAULT : master->InBattleground() ? REVIVE_TIMER_SHORT / 2 : REVIVE_TIMER_SHORT;\n+    _atHome = false;\n+    _evadeMode = false;\n+    spawned = false;\n+    _botAwaitState = BOT_AWAIT_NONE;\n+\n+    ++_deathsCount;\n+}\n+//This is triggered before SetDeathState(JUST_DIED) call\n+//attacker may be NULL\n+void bot_ai::OnDeath([[maybe_unused]] Unit* attacker/* = nullptr*/)\n+{\n+    if (AuraEffect const* sstone = me->GetDummyAuraEffect(SPELLFAMILY_GENERIC, 92, 0))\n+    {\n+        uint32 spell_id;\n+        switch (sstone->GetBase()->GetId())\n+        {\n+            case 20707: spell_id = 3026;  break;        // rank 1\n+            case 20762: spell_id = 20758; break;        // rank 2\n+            case 20763: spell_id = 20759; break;        // rank 3\n+            case 20764: spell_id = 20760; break;        // rank 4\n+            case 20765: spell_id = 20761; break;        // rank 5\n+            case 27239: spell_id = 27240; break;        // rank 6\n+            case 47883: spell_id = 47882; break;        // rank 7\n+            default:    spell_id = 0;     break;\n+        }\n+        _selfrez_spell_id = spell_id;\n+    }\n+    else\n+        _selfrez_spell_id = 0;\n+}\n+\n+void bot_ai::KilledUnit(Unit* u)\n+{\n+    if (u->GetOwnerGUID() == me->GetGUID() || u->GetGUID() == me->GetGUID())\n+        return;\n+\n+    ++_killsCount;\n+    if (u->IsControlledByPlayer() || u->IsPvP() || u->IsNPCBotOrPet())\n+    {\n+        ++_pvpKillsCount;\n+        if (!me->GetMap()->IsBattlegroundOrArena())\n+        {\n+            if (IsWanderer())\n+            {\n+                BOT_LOG_DEBUG(\"npcbots\", \"Wandering bot {} id {} class {} level {} KILLED {} {} id {} class {} level {} on their way to {}!\",\n+                    me->GetName().c_str(), me->GetEntry(), uint32(_botclass), uint32(me->GetLevel()),\n+                    (u->IsPlayer() ? \"player\" : u->IsNPCBot() ? u->ToCreature()->GetBotAI()->IsWanderer() ? \"wandering bot\" : \"bot\" : u->IsNPCBotPet() ? \"botpet\" : \"creature\"),\n+                    u->GetName().c_str(), u->GetEntry(), uint32(u->GetClass()), uint32(u->GetLevel()),\n+                    _travel_node_cur->GetName().c_str());\n+            }\n+            else if (u->IsNPCBot() && u->ToCreature()->GetBotAI()->IsWanderer())\n+            {\n+                BOT_LOG_DEBUG(\"npcbots\", \"Bot {} id {} class {} level {} KILLED wandering bot {} id {} class {} level {} on their way to {}!\",\n+                    me->GetName().c_str(), me->GetEntry(), uint32(_botclass), uint32(me->GetLevel()),\n+                    u->GetName().c_str(), u->GetEntry(), uint32(u->GetClass()), uint32(u->GetLevel()),\n+                    IsWanderer() ? _travel_node_cur->GetName().c_str() : \"''\");\n+            }\n+        }\n+    }\n+\n+    //handle BG kill BvP, BvB, BvC\n+    if (me->GetMap()->IsBattleground())\n+    {\n+        Battleground* bg = GetBG();\n+        //could be removed from BG\n+        if (bg && bg->GetBots().contains(me->GetGUID()) &&\n+            (u->IsNPCBot() ? bg->GetBots().contains(u->GetGUID()) : bg->GetPlayers().contains(u->GetGUID())))\n+        {\n+            if (u->IsPlayer())\n+                bg->HandleBotKillPlayer(me, u->ToPlayer());\n+            else if (u->IsNPCBot())\n+                bg->HandleBotKillBot(me, u->ToCreature());\n+        }\n+        else if (bg && u->IsCreature() && !u->IsNPCBotOrPet())\n+            bg->HandleBotKillUnit(me, u->ToCreature());\n+\n+        outdoorsTimer = 0;\n+    }\n+\n+    if (u->isType(TYPEMASK_PLAYER))\n+        ++_playerKillsCount;\n+\n+    if (IsWanderer())\n+    {\n+        shouldUpdateStats = true;\n+\n+        if (me->GetMap()->GetEntry()->IsContinent())\n+            evadeDelayTimer = 3000;\n+    }\n+}\n+\n+void bot_ai::UnsummonCreature(Creature* creature, bool /*save*/)\n+{\n+    if (creature)\n+    {\n+        if (bot_pet_ai* petai = creature->GetBotPetAI())\n+        {\n+            petai->KillEvents(true);\n+            petai->canUpdate = false;\n+        }\n+\n+        ASSERT_NOTNULL(creature->ToTempSummon())->UnSummon();\n+    }\n+}\n+void bot_ai::UnsummonPet(bool save)\n+{\n+    UnsummonCreature(botPet, save);\n+}\n+\n+void bot_ai::MoveInLineOfSight(Unit* /*u*/)\n+{\n+}\n+\n+void bot_ai::AttackStart(Unit* /*u*/)\n+{\n+}\n+\n+void bot_ai::DamageDealt(Unit* victim, uint32& damage, DamageEffectType /*damageType*/, SpellSchoolMask /*damageSchoolMask*/)\n+{\n+    if (victim == me)\n+        return;\n+\n+    if (damage)\n+    {\n+        if (Creature* cre = victim->ToCreature())\n+        {\n+            if (!cre->hasLootRecipient())\n+                cre->SetLootRecipient(master);\n+\n+            //controlled case is handled in Unit::DealDamage\n+            if (IAmFree())\n+                cre->LowerPlayerDamageReq(std::min<uint32>(cre->GetHealth(), damage) / (BotMgr::IsWanderingWorldBot(me) ? 4 : 2));\n+        }\n+    }\n+\n+    if (victim->IsPlayer())\n+        ResetChase(victim);\n+}\n+void bot_ai::OnBotSpellStart(SpellInfo const* spellInfo)\n+{\n+    OnClassSpellStart(spellInfo);\n+}\n+//This function is called after Spell::SendSpellCooldown() and Spell::DoAllEffects...() call\n+void bot_ai::OnBotSpellGo(Spell const* spell, bool ok)\n+{\n+    SpellInfo const* curInfo = spell->GetSpellInfo();\n+\n+    if (ok)\n+    {\n+        if (CanBotAttackOnVehicle())\n+        {\n+            //Set cooldown\n+            if (!curInfo->IsCooldownStartedOnEvent() && !curInfo->IsPassive())\n+            {\n+                uint32 rec = curInfo->RecoveryTime ? curInfo->GetRecoveryTime() : GetItemSpellCooldown(curInfo->Id);\n+                uint32 catrec = curInfo->CategoryRecoveryTime;\n+                if (!catrec && curInfo->StartRecoveryCategory == 133 && !curInfo->CalcCastTime())\n+                    catrec = curInfo->StartRecoveryTime;\n+\n+                if (rec || (!spell->GetCastTime() && curInfo->CalcCastTime()))\n+                    ApplyBotSpellCooldownMods(curInfo, rec);\n+                if (catrec && !(curInfo->AttributesEx6 & SPELL_ATTR6_NO_CATEGORY_COOLDOWN_MODS))\n+                    ApplyBotSpellCategoryCooldownMods(curInfo, catrec);\n+\n+                if (rec || catrec)\n+                    SetSpellCooldown(curInfo->GetFirstRankSpell()->Id, rec);\n+                SetSpellCategoryCooldown(curInfo->GetFirstRankSpell(), catrec);\n+\n+                if (!IAmFree())\n+                {\n+                    //allow next cast to be immediate\n+                    if (GC_Timer < lastdiff)\n+                        waitTimer = 0;\n+                    else\n+                        waitTimer = std::min<uint32>(waitTimer, GC_Timer - lastdiff);\n+                }\n+            }\n+\n+            if (curInfo->Id == PVPTRINKET)\n+                SetSpellCooldown(PVPTRINKET, 120000);\n+            if (IsPotionSpell(curInfo->Id))\n+                StartPotionTimer();\n+            if (curInfo->Id == ACTIVATE_SPEC)\n+                SetSpec(_newspec);\n+            if (curInfo->Id == GetSelfRezSpell())\n+                OnSpellHit(me, curInfo);\n+\n+            OnClassSpellGo(curInfo);\n+        }\n+\n+        if (me->GetVehicleCreatureBase() && me->GetVehicleCreatureBase()->HasSpell(curInfo->Id))\n+        {\n+            //delay next cast to allow cp to proc\n+            if (curInfo->AttributesEx & (SPELL_ATTR1_FINISHING_MOVE_DAMAGE | SPELL_ATTR1_FINISHING_MOVE_DURATION))\n+                GC_Timer = std::max<uint32>(2000, curInfo->StartRecoveryTime);\n+            else if (curInfo->Speed > 0.0f)\n+                GC_Timer = std::max<uint32>(1500, curInfo->StartRecoveryTime);\n+            else\n+                GC_Timer = curInfo->StartRecoveryTime;\n+        }\n+    }\n+    else\n+        GC_Timer = 0;\n+\n+    if (HasBotCommandState(BOT_COMMAND_ISSUED_ORDER) &&\n+        !_orders.empty() && _orders.front()._type == BOT_ORDER_SPELLCAST &&\n+        _orders.front().params.spellCastParams.baseSpell == curInfo->GetFirstRankSpell()->Id)\n+    {\n+        if (DEBUG_BOT_ORDERS)\n+            BOT_LOG_ERROR(\"entities.player\", \"doCast(): ordered spell {} by {} was {}!\",\n+                curInfo->Id, me->GetName().c_str(), ok ? \"successful\" : \"unsuccessful\");\n+        CompleteOrder(_orders.front());\n+    }\n+}\n+\n+void bot_ai::OnBotOwnerSpellGo(Spell const* spell, bool ok)\n+{\n+    if (!ok)\n+        return;\n+\n+    SpellInfo const* spellInfo = spell->GetSpellInfo();\n+\n+    if (spellInfo->IsPassive())\n+        return;\n+\n+    //BOT_LOG_ERROR(\"entities.player\", \"OnBotOwnerSpellGo(): %u by %s\", spellInfo->Id, master->GetName().c_str());\n+\n+    if (spell->m_targets.HasDst() && HasBotAwaitState(BOT_AWAIT_SEND) && (me->GetTransport() == master->GetTransport()))\n+    {\n+        Position const* spell_dest = spell->m_targets.GetDstPos();\n+        MoveToSendPosition(*spell_dest);\n+    }\n+\n+    if (master->GetVehicle() && me->GetVehicle() && !master->HasSpell(spellInfo->Id) && !spell->m_targets.GetGOTargetGUID())\n+    {\n+        //if (((spellInfo->AttributesCu & SPELL_ATTR0_CU_DIRECT_DAMAGE) || spellInfo->HasAura(SPELL_AURA_PERIODIC_DAMAGE)) &&\n+        //    (spell->m_targets.GetTargetMask() & TARGET_FLAG_UNIT) && spell->m_targets.GetUnitTargetGUID() && !me->GetVehicleBase()->GetTarget() &&\n+        //    spell->m_targets.GetUnitTargetGUID() != master->GetVehicleBase()->GetGUID())\n+        //{\n+        //    //master->GetVehicleBase()->SetTarget(spell->m_targets.GetUnitTargetGUID());\n+        //    me->GetVehicleBase()->SetTarget(spell->m_targets.GetUnitTargetGUID());\n+        //    SetBotCommandState(BOT_COMMAND_ATTACK);\n+        //    //hack\n+        //    if (!me->GetVehicleBase()->GetVictim())\n+        //    {\n+        //        if (Unit* target = ObjectAccessor::GetUnit(*me->GetVehicleBase(), spell->m_targets.GetUnitTargetGUID()))\n+        //            me->GetVehicleBase()->Attack(target, false);\n+        //    }\n+        //}\n+\n+        Vehicle const* veh = me->GetVehicle();\n+        if (veh && veh->GetBase()->IsCreature() && _curVehStrat == BOT_VEH_STRAT_GENERIC &&\n+            veh->GetBase()->ToCreature()->HasSpell(spellInfo->Id))\n+        {\n+            SpellCastTargets targets;\n+            if (spell->m_targets.HasDst())\n+            {\n+                targets.SetDst(spell->m_targets);\n+                veh->GetBase()->ToCreature()->BotStopMovement();\n+                float destangle = veh->GetBase()->GetAbsoluteAngle(spell->m_targets.GetDstPos());\n+                if (veh->GetBase()->GetTransport())\n+                    destangle = Position::NormalizeOrientation(destangle - veh->GetBase()->GetTransport()->GetOrientation());\n+                veh->GetBase()->SetFacingTo(destangle);\n+                //force orientation (inconsistent with SetFacingTo)\n+                veh->GetBase()->SetOrientation(destangle);\n+            }\n+            if (spell->m_targets.GetSpeed() != 0)\n+                targets.SetSpeed(spell->m_targets.GetSpeed());\n+            if (spell->m_targets.GetElevation() != 0)\n+                targets.SetElevation(spell->m_targets.GetElevation());\n+            if (spell->m_targets.GetUnitTargetGUID())\n+            {\n+                if (Unit* target = ObjectAccessor::GetUnit(*veh->GetBase(), spell->m_targets.GetUnitTargetGUID()))\n+                {\n+                    targets.SetUnitTarget(target);\n+                    veh->GetBase()->SetFacingTo(me->GetAbsoluteAngle(target));\n+                }\n+            }\n+\n+            //bug: gameobject damage is not sent to players (not visible in log)\n+            //tempfix: set bot as original caster\n+            Spell* vehspell = new Spell(veh->GetBase(), spellInfo, TRIGGERED_NONE/*, me->GetGUID()*/);\n+            vehspell->prepare(&targets);\n+        }\n+    }\n+}\n+\n+void bot_ai::OnBotChannelFinish(Spell const* spell)\n+{\n+    OnClassChannelFinish(spell);\n+}\n+\n+void bot_ai::OnBotSpellInterrupted(SpellSchoolMask schoolMask, uint32 unTimeMs)\n+{\n+    for (auto& [rank1_id, spell] : _spells)\n+    {\n+        SpellInfo const* info = sSpellMgr->GetSpellInfo(spell.spellId);\n+        if (!info || !(info->GetSchoolMask() & schoolMask)) continue;\n+        if (info->IsCooldownStartedOnEvent()) continue;\n+        if (info->PreventionType != SPELL_PREVENTION_TYPE_SILENCE) continue;\n+\n+        if (HasBotCommandState(BOT_COMMAND_ISSUED_ORDER) &&\n+            !_orders.empty() && _orders.front()._type == BOT_ORDER_SPELLCAST &&\n+            _orders.front().params.spellCastParams.baseSpell == rank1_id)\n+        {\n+            if (DEBUG_BOT_ORDERS)\n+                BOT_LOG_ERROR(\"entities.player\", \"doCast(): ordered spell {} was interrupted!\", info->Id);\n+            CompleteOrder(_orders.front());\n+        }\n+\n+        spell.cooldown += unTimeMs;\n+        //BOT_LOG_ERROR(\"entities.player\", \"OnBotSpellInterrupted(): Adding cooldown (%u, new: %u) to spell %s (id: %u, schoolmask: %u), reqSchoolMask = %u\",\n+        //    unTimeMs, itr->second.second, info->SpellName[0], info->Id, info->SchoolMask, schoolMask);\n+    }\n+\n+    GC_Timer = 0; //reset global cooldown since cast is canceled\n+}\n+\n+void bot_ai::CastBotItemCombatSpell(DamageInfo const& damageInfo)\n+{\n+    Unit* target = damageInfo.GetVictim();\n+    if (!target || !target->IsAlive() || target == me)\n+        return;\n+\n+    if (!me->CanUseAttackType(damageInfo.GetAttackType()))\n+        return;\n+\n+    Item* item;\n+    ItemTemplate const* proto;\n+    int8 slot;\n+\n+    for (auto i : NPCBots::index_array<uint8, BOT_INVENTORY_SIZE>)\n+    {\n+        item = _equips[i];\n+        if (!item)\n+            continue;\n+\n+        //skip standard items\n+        //if (i < BOT_SLOT_RANGED && einfo->ItemEntry[i] == item->GetEntry())\n+        //    continue;\n+\n+        proto = item->GetTemplate();\n+        if (!proto)\n+            continue;\n+\n+        // Additional check for weapons\n+        if (proto->Class == ITEM_CLASS_WEAPON)\n+        {\n+            // offhand item cannot proc from main hand hit etc\n+            switch (damageInfo.GetAttackType())\n+            {\n+                case BASE_ATTACK:   slot = BOT_SLOT_MAINHAND;   break;\n+                case OFF_ATTACK:    slot = BOT_SLOT_OFFHAND;    break;\n+                case RANGED_ATTACK: slot = BOT_SLOT_RANGED;     break;\n+                default:            slot = -1;                  break;\n+            }\n+            if (slot != i)\n+                continue;\n+        }\n+\n+        CastBotItemCombatSpell(damageInfo, item, proto);\n+    }\n+}\n+\n+void bot_ai::CastBotItemCombatSpell(DamageInfo const& damageInfo, Item* item, ItemTemplate const* proto)\n+{\n+    //TODO: custom spell triggers maybe?\n+\n+    // Can do effect if any damage done to target\n+    bool canTrigger = (damageInfo.GetHitMask() & (PROC_HIT_NORMAL | PROC_HIT_CRITICAL | PROC_HIT_ABSORB)) != 0;\n+    if (canTrigger)\n+    {\n+        for (auto i : NPCBots::index_array<uint8, MAX_ITEM_PROTO_SPELLS>)\n+        {\n+            _Spell const& spellData = proto->Spells[i];\n+\n+            // no spell\n+            if (!spellData.SpellId)\n+                continue;\n+\n+            // wrong triggering type\n+            if (spellData.SpellTrigger != ITEM_SPELLTRIGGER_CHANCE_ON_HIT)\n+                continue;\n+\n+            SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellData.SpellId);\n+            if (!spellInfo)\n+            {\n+                //BOT_LOG_ERROR(\"entities.player.items\", \"WORLD: unknown Item spellid %i\", spellData.SpellId);\n+                continue;\n+            }\n+\n+            float chance = static_cast<float>(spellInfo->ProcChance);\n+\n+            if (spellData.SpellPPMRate)\n+            {\n+                uint32 WeaponSpeed = me->GetAttackTime(damageInfo.GetAttackType());\n+                chance = me->GetPPMProcChance(WeaponSpeed, spellData.SpellPPMRate, spellInfo);\n+            }\n+            else if (chance > 100.0f)\n+                chance = me->GetWeaponProcChance();\n+\n+            if (roll_chance_f(chance))\n+                me->CastSpell(damageInfo.GetVictim(), spellInfo, TriggerCastFlags(TRIGGERED_FULL_MASK & ~TRIGGERED_IGNORE_SPELL_AND_CATEGORY_CD), item);\n+        }\n+    }\n+\n+    // item combat enchantments\n+    for (auto e_slot : NPCBots::index_array<uint8, MAX_ENCHANTMENT_SLOT>)\n+    {\n+        uint32 enchant_id = item->GetEnchantmentId(EnchantmentSlot(e_slot));\n+        SpellItemEnchantmentEntry const* pEnchant = sSpellItemEnchantmentStore.LookupEntry(enchant_id);\n+        if (!pEnchant)\n+            continue;\n+\n+        for (auto s : NPCBots::index_array<uint8, MAX_SPELL_ITEM_ENCHANTMENT_EFFECTS>)\n+        {\n+            if (pEnchant->type[s] != ITEM_ENCHANTMENT_TYPE_COMBAT_SPELL)\n+                continue;\n+\n+            SpellEnchantProcEntry const* entry = sSpellMgr->GetSpellEnchantProcEvent(enchant_id);\n+            if (entry && entry->procEx)\n+            {\n+                // Check hit/crit/dodge/parry requirement\n+                if ((entry->procEx & damageInfo.GetHitMask()) == 0)\n+                    continue;\n+            }\n+            else\n+            {\n+                // Can do effect if any damage done to target\n+                if (!canTrigger)\n+                    continue;\n+            }\n+\n+            // check if enchant procs only on white hits\n+            //if (entry && (entry->AttributesMask & ENCHANT_PROC_ATTR_WHITE_HIT) && damageInfo.GetSpellInfo())\n+            //    continue;\n+\n+            SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(pEnchant->spellid[s]);\n+            if (!spellInfo)\n+                continue;\n+\n+            float chance = pEnchant->amount[s] != 0 ? float(pEnchant->amount[s]) : me->GetWeaponProcChance();\n+            if (entry)\n+            {\n+                if (entry->PPMChance)\n+                {\n+                    chance = entry->PPMChance;\n+                    //handle SPELLMOD_PROC_PER_MINUTE spellmods\n+                    //Envenom\n+                    if (GetSpec() == BOT_SPEC_ROGUE_ASSASINATION && me->HasAuraTypeWithFamilyFlags(SPELL_AURA_ADD_FLAT_MODIFIER, SPELLFAMILY_ROGUE, 0x800000))\n+                        chance *= 1.75f;\n+                    //Improved Poisons\n+                    if (GetSpec() == BOT_SPEC_ROGUE_ASSASINATION && me->GetLevel() >= 25 && (spellInfo->SpellFamilyFlags[0] & 0x2000))\n+                        chance *= 1.5f;\n+\n+                    chance = me->GetPPMProcChance(proto->Delay, chance, spellInfo);\n+                }\n+                else if (entry->customChance)\n+                    chance = (float)entry->customChance;\n+            }\n+\n+            // Apply SPELLMOD_CHANCE_OF_SUCCESS spell mods\n+            //Envenom\n+            if (GetSpec() == BOT_SPEC_ROGUE_ASSASINATION && me->HasAuraTypeWithFamilyFlags(SPELL_AURA_ADD_FLAT_MODIFIER, SPELLFAMILY_ROGUE, 0x800000))\n+                chance += 15.f;\n+            //Improved Poisons\n+            if (GetSpec() == BOT_SPEC_ROGUE_ASSASINATION && me->GetLevel() >= 25 && (spellInfo->SpellFamilyFlags[0] & 0x10000))\n+                chance += 20.f;\n+\n+            // Shiv has 100% chance to apply the poison\n+            if (me->FindCurrentSpellBySpellId(5938) && e_slot == TEMP_ENCHANTMENT_SLOT)\n+                chance = 100.0f;\n+\n+            if (roll_chance_f(chance))\n+                me->CastSpell(spellInfo->IsPositive() ? me : damageInfo.GetVictim(), spellInfo, TriggerCastFlags(TRIGGERED_FULL_MASK & ~TRIGGERED_IGNORE_SPELL_AND_CATEGORY_CD), item);\n+        }\n+    }\n+}\n+//ORDERS\n+bool bot_ai::AddOrder(BotOrder&& order)\n+{\n+    if (_orders.size() >= MAX_BOT_ORDERS_QUEUE_SIZE)\n+    {\n+        BOT_LOG_ERROR(\"scripts\", \"bot_ai::AddOrder: orders limit reached for {} ({})!\", me->GetName().c_str(), uint32(_orders.size()));\n+        return false;\n+    }\n+\n+    _orders.push(std::move(order));\n+    return true;\n+}\n+void bot_ai::CancelOrder(BotOrder const& order)\n+{\n+    if (_orders.empty())\n+    {\n+        BOT_LOG_ERROR(\"scripts\", \"bot_ai::CancelOrder: {} orders are empty while trying to remove order type {}!\",\n+            me->GetName().c_str(), uint32(order._type));\n+        return;\n+    }\n+    if (_orders.front()._type != order._type)\n+    {\n+        BOT_LOG_ERROR(\"scripts\", \"bot_ai::CancelOrder: {} front order (type {}) is different from cur order (type {})!\",\n+            me->GetName().c_str(), uint32(_orders.front()._type), uint32(order._type));\n+        return;\n+    }\n+\n+    RemoveBotCommandState(BOT_COMMAND_ISSUED_ORDER);\n+    _orders.pop();\n+}\n+void bot_ai::CompleteOrder(BotOrder const& order)\n+{\n+    if (_orders.empty())\n+    {\n+        BOT_LOG_ERROR(\"scripts\", \"bot_ai::CompleteOrder: {} orders are empty while trying to remove order type {}!\",\n+            me->GetName().c_str(), uint32(order._type));\n+        return;\n+    }\n+    if (_orders.front()._type != order._type)\n+    {\n+        BOT_LOG_ERROR(\"scripts\", \"bot_ai::CompleteOrder: {} front order (type {}) is different from cur order (type {})!\",\n+            me->GetName().c_str(), uint32(_orders.front()._type), uint32(order._type));\n+        return;\n+    }\n+\n+    RemoveBotCommandState(BOT_COMMAND_ISSUED_ORDER);\n+    _orders.pop();\n+}\n+void bot_ai::CancelAllOrders()\n+{\n+    RemoveBotCommandState(BOT_COMMAND_ISSUED_ORDER);\n+    while (!_orders.empty())\n+        _orders.pop();\n+}\n+void bot_ai::_ProcessOrders()\n+{\n+    ordersTimer = 500;\n+\n+    while (!_orders.empty())\n+    {\n+        BotOrder const& order = _orders.front();\n+        if (order._timeout <= time(0))\n+        {\n+            if (DEBUG_BOT_ORDERS)\n+                BOT_LOG_DEBUG(\"npcbots\", \"bot_ai::_ProcessOrders: {} front order (type {}) expired...\", me->GetName(), uint32(order._type));\n+            CancelOrder(order);\n+        }\n+        else if (order._type == BOT_ORDER_PULL && (!HasRole(BOT_ROLE_DPS) || me->IsInCombat() || !me->getAttackers().empty()))\n+            CompleteOrder(order);\n+        else\n+            break;\n+    }\n+\n+    if (_orders.empty())\n+        return;\n+\n+    if (HasBotCommandState(BOT_COMMAND_ISSUED_ORDER))\n+        return;\n+\n+    if (JumpingOrFalling())\n+        return;\n+\n+    BotOrder const& order = _orders.front();\n+    Unit* target = nullptr;\n+    switch (order._type)\n+    {\n+        case BOT_ORDER_SPELLCAST:\n+        {\n+            if (CCed(me))\n+                break;\n+\n+            SetBotCommandState(BOT_COMMAND_ISSUED_ORDER);\n+\n+            ObjectGuid guid = order.params.spellCastParams.targetGuid;\n+            if (guid == me->GetGUID())\n+                target = me;\n+            else if (guid == master->GetGUID())\n+                target = master;\n+            else if (!guid.IsEmpty())\n+            {\n+                if (!IAmFree())\n+                    target = master->GetBotMgr()->GetBot(guid);\n+                if (!target)\n+                    target = ObjectAccessor::GetUnit(*me, guid);\n+            }\n+            else\n+            {\n+                BOT_LOG_ERROR(\"scripts\", \"bot_ai:_ProcessOrders: invalid spellCastParams.targetGuid {}!\", order.params.spellCastParams.targetGuid.ToString());\n+                CancelOrder(order);\n+                return;\n+            }\n+\n+            if (!target || !target->IsInWorld())\n+            {\n+                BOT_LOG_ERROR(\"scripts\", \"bot_ai:_ProcessOrders: target {} not found!\",  order.params.spellCastParams.targetGuid.ToString());\n+                CancelOrder(order);\n+                return;\n+            }\n+\n+            if (IsCasting())\n+                me->InterruptNonMeleeSpells(false);\n+\n+            doCast(target, _spells.at(order.params.spellCastParams.baseSpell).spellId);\n+            break;\n+        }\n+        case BOT_ORDER_PULL:\n+        {\n+            if (me->GetVictim())\n+                break;\n+            if (CCed(me))\n+                break;\n+\n+            SetBotCommandState(BOT_COMMAND_ISSUED_ORDER);\n+\n+            if (order.params.pullParams.targetGuid)\n+                target = ObjectAccessor::GetUnit(*me, order.params.pullParams.targetGuid);\n+            else\n+            {\n+                BOT_LOG_ERROR(\"scripts\", \"bot_ai:_ProcessOrders: invalid pullParams.targetGuid {}!\", order.params.pullParams.targetGuid.ToString());\n+                CancelOrder(order);\n+                return;\n+            }\n+\n+            if (!target || !target->IsInWorld())\n+            {\n+                BOT_LOG_ERROR(\"scripts\", \"bot_ai:_ProcessOrders: target {} not found!\", order.params.pullParams.targetGuid.ToString());\n+                CancelOrder(order);\n+                return;\n+            }\n+            if (!target->IsAlive() || target->IsInCombat() || !CanBotAttack(target))\n+            {\n+                BOT_LOG_ERROR(\"scripts\", \"bot_ai:_ProcessOrders: target {} cannot be pulled!\", order.params.pullParams.targetGuid.ToString());\n+                CancelOrder(order);\n+                return;\n+            }\n+            break;\n+        }\n+        default:\n+            BOT_LOG_ERROR(\"scripts\", \"bot_ai:_ProcessOrders: invalid order type {}!\", uint32(order._type));\n+            CancelOrder(order);\n+            return;\n+    }\n+}\n+bool bot_ai::IsLastOrder(BotOrderTypes order_type, uint32 param1, ObjectGuid guidparam1) const\n+{\n+    if (!_orders.empty())\n+    {\n+        BotOrder const& order = _orders.front();\n+        if (order_type == order._type)\n+        {\n+            switch (order_type)\n+            {\n+                case BOT_ORDER_SPELLCAST:\n+                    if (!param1 || order.params.spellCastParams.baseSpell == param1)\n+                        return true;\n+                    break;\n+                case BOT_ORDER_PULL:\n+                    if (!guidparam1 || order.params.pullParams.targetGuid == guidparam1)\n+                        return true;\n+                    break;\n+                default:\n+                    BOT_LOG_ERROR(\"scripts\", \"bot_ai:IsLastOrder: invalid order type {}!\", uint32(order_type));\n+                    break;\n+            }\n+        }\n+    }\n+\n+    return false;\n+}\n+//VEHICLES\n+//helpers\n+bool bot_ai::HasAuraTypeWithValueAtLeast(AuraType auratype, int32 minvalue, Unit const* unit) const\n+{\n+    if (!unit)\n+        unit = me;\n+\n+    Unit::AuraEffectList const& mTotalAuraList = unit->GetAuraEffectsByType(auratype);\n+    for (Unit::AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)\n+        if ((*i)->GetAmount() >= minvalue)\n+            return true;\n+\n+    return false;\n+}\n+//strats - opponent is always valid\n+void bot_ai::DoSkytalonVehicleStrats(uint32 diff)\n+{\n+    if (GC_Timer > diff)\n+        return;\n+\n+    GC_Timer = 350; //at least this delay\n+\n+    if (!CheckVehicleAttackTarget(_curVehStrat))\n+        return;\n+\n+    Creature* drake = me->GetVehicleCreatureBase();\n+    Unit* target = nullptr;\n+    uint32 drakespell = 0;\n+    uint32 drakePower = drake->GetPower(POWER_ENERGY);\n+\n+    //finishers\n+    uint8 finishComboPoints;\n+    uint32 finishPower;\n+    if (GetHealthPCT(drake) <= (40 + 40*drake->HasAuraType(SPELL_AURA_PERIODIC_DAMAGE)) ||\n+        HasAuraTypeWithValueAtLeast(SPELL_AURA_PERIODIC_DAMAGE, drake->GetMaxHealth() / 16, drake))\n+    {\n+        finishComboPoints = 3;\n+        finishPower = 25;\n+    }\n+    //if (HasRole(BOT_ROLE_HEAL))\n+    //{\n+    //    finishComboPoints = 4;\n+    //    finishPower = 50;\n+    //}\n+    else\n+    {\n+        finishComboPoints = 4;\n+        finishPower = 50;\n+    }\n+\n+    if (_vehcomboPoints >= finishComboPoints && (Rand() < 75 + 40*(_vehcomboPoints >= 5 || drakePower < finishPower)))\n+    {\n+        if (drakePower >= finishPower)\n+        {\n+            if (GetHealthPCT(drake) < 60 && !drake->HasAuraEffect(drake->m_spells[4], EFFECT_0))\n+            {\n+                drakespell = drake->m_spells[4]; //flame shield\n+                target = drake;\n+            }\n+            else if (HasRole(BOT_ROLE_HEAL))\n+            {\n+                drakespell = drake->m_spells[3]; //life burst\n+                bool cast = false;\n+                //find damaged target\n+                if (master->GetVehicle() && GetHealthPCT(master->GetVehicleBase()) < 90 && master->GetVehicleBase()->GetDistance(drake) < 60)\n+                    cast = true;\n+                else if (GetHealthPCT(drake) < 90)\n+                    cast = true;\n+                else\n+                {\n+                    std::vector<Unit*> vec = BotMgr::GetAllGroupMembers(master);\n+                    cast = std::ranges::any_of(vec, [drake = drake](Unit const* member) {\n+                        return drake->GetMap() == member->FindMap() && member->GetVehicle() &&\n+                            member->GetVehicleBase()->GetHealthPct() < 90.0f && member->GetVehicleBase()->GetDistance(drake) < 60;\n+                    });\n+                }\n+                if (cast)\n+                    target = drake;\n+            }\n+            else\n+            {\n+                drakespell = drake->m_spells[1]; //engulf in flames\n+                target = opponent;\n+            }\n+        }\n+    }\n+    else if (drakePower >= 35)\n+    {\n+        if (HasRole(BOT_ROLE_DPS))\n+        {\n+            drakespell = drake->m_spells[0]; //flame spike\n+            target = opponent;\n+        }\n+        else if (HasRole(BOT_ROLE_HEAL))\n+        {\n+            drakespell = drake->m_spells[2]; //revivify\n+            //bots won't care about target they have cp on so choose randomly\n+            std::list<Unit*> targets1;\n+            if (Group const* gr = master->GetGroup())\n+            {\n+                bool Bots = false;\n+                for (GroupReference const* itr = gr->GetFirstMember(); itr != nullptr; itr = itr->next())\n+                {\n+                    Player const* p = itr->GetSource();\n+                    if (!p || me->GetMap() != p->FindMap()) continue;\n+                    if (p->HaveBot() && !Bots)\n+                        Bots = true;\n+                    Unit* u = p->GetVehicleBase();\n+                    if (u && u->IsAlive() && !u->HasUnitState(UNIT_STATE_ISOLATED) && drake->GetDistance(u) < 60.f &&\n+                        !(GetHealthPCT(u) > 95 && !IsTank(p)) &&\n+                        (GetHealthPCT(u) < 95 || (u->IsInCombat() && !u->getAttackers().empty())))\n+                        targets1.push_back(u);\n+                }\n+                if (Bots)\n+                {\n+                    for (GroupReference const* itr = gr->GetFirstMember(); itr != nullptr; itr = itr->next())\n+                    {\n+                        Player const* p = itr->GetSource();\n+                        if (!p || me->GetMap() != p->FindMap() || !p->HaveBot()) continue;\n+\n+                         for (auto const& [_, bot] : *p->GetBotMgr()->GetBotMap())\n+                        {\n+                            Unit* u = bot ? bot->GetVehicleBase() : nullptr;\n+                            if (u && u->IsAlive() && !u->HasUnitState(UNIT_STATE_ISOLATED) && drake->GetDistance(u) < 60.f &&\n+                                !(GetHealthPCT(u) > 95 && !IsTank(bot)) &&\n+                                (GetHealthPCT(u) < 95 || (u->IsInCombat() && !u->getAttackers().empty())))\n+                                targets1.push_back(u);\n+                        }\n+                    }\n+                }\n+            }\n+            else\n+            {\n+                for (auto const& [_, bot] : *master->GetBotMgr()->GetBotMap())\n+                {\n+                    Unit* u = bot ? bot->GetVehicleBase() : nullptr;\n+                    if (u && u->IsAlive() && !u->HasUnitState(UNIT_STATE_ISOLATED) && drake->GetDistance(u) < 60.f &&\n+                        !(GetHealthPCT(u) > 95 && !IsTank(bot)) &&\n+                        (GetHealthPCT(u) < 95 || (u->IsInCombat() && !u->getAttackers().empty())))\n+                        targets1.push_back(u);\n+                }\n+            }\n+\n+            uint8 minhppct = 0;\n+            for (Unit const* u : targets1)\n+                if (uint8 hppct = GetHealthPCT(u))\n+                    if (minhppct == 0 || minhppct > hppct)\n+                        minhppct = hppct;\n+\n+            if (minhppct <= 75)\n+                std::erase_if(targets1, BOTAI_PRED::HpPctAboveExclude(static_cast<float>(minhppct + 10)));\n+\n+            if (!targets1.empty())\n+                target = Bcore::Containers::SelectRandomContainerElement(targets1);\n+\n+            if (target && drakePower < 80)\n+                if (Aura const* revi = target->GetAura(57090, drake->GetGUID())) //revivify\n+                    if (revi->GetStackAmount() >= 5 && revi->GetDuration() >= 4000)\n+                        target = nullptr;\n+        }\n+    }\n+\n+    //if (!HasRole(BOT_ROLE_TANK|BOT_ROLE_HEAL) && drake->GetMap()->IsRaid() && target && target->GetVictim() == drake)\n+    //    target = nullptr;\n+\n+    if (!target)\n+        return;\n+\n+    if (!drakespell)\n+    {\n+        BOT_LOG_ERROR(\"scripts\", \"DoSkytalonVehicleStrats no spell for role mask {} cp {}, power {}, target {}\",\n+            GetBotRoles(), uint32(_vehcomboPoints), drakePower, target->GetName());\n+        return;\n+    }\n+\n+    //BOT_LOG_ERROR(\"scripts\", \"DoSkytalonVehicleStrats %u on %s\", drakespell, target->GetName().c_str());\n+\n+    SetBotCommandState(BOT_COMMAND_ATTACK);\n+    drake->BotStopMovement();\n+    drake->SetInFront(target);\n+    drake->CastSpell(target, drakespell);\n+}\n+void bot_ai::DoRubyDrakeVehicleStrats(uint32 diff)\n+{\n+    if (GC_Timer > diff)\n+        return;\n+\n+    GC_Timer = 350; //at least this delay\n+\n+    if (!CheckVehicleAttackTarget(_curVehStrat))\n+        return;\n+\n+    Creature* drake = me->GetVehicleCreatureBase();\n+    ASSERT(drake);\n+    Unit* target = nullptr;\n+    uint32 drakespell = 0;\n+\n+    //IS TANK\n+    //50232 Searing Wrath\n+    //50241 Evasive Charges\n+    //50240 Evasive Maneuvers\n+    //50253 Martyr\n+\n+    Aura const* evas = drake->GetAura(50241); //Evasive Charges\n+    uint8 vehicles = LivingVehiclesCount();\n+    //bool eregos = opponent->GetEntry() == CREATURE_BOSS_EREGOS_N || opponent->GetEntry() == CREATURE_BOSS_EREGOS_H;\n+\n+    bool finalEncounter = master->GetInstanceScript() && master->GetInstanceScript()->GetBossState(2) == DONE; //DATA_UROM\n+\n+    if (vehicles > 1 && evas)\n+    {\n+        bool canManeuver = !drake->HasAuraType(SPELL_AURA_MOD_ATTACKER_SPELL_HIT_CHANCE) && evas->GetStackAmount() >= 5 &&\n+            !drake->HasSpellCooldown(50240);\n+        bool canMartyr = !drake->HasAuraType(SPELL_AURA_SPELL_MAGNET) &&\n+            !drake->HasSpellCooldown(50253);\n+\n+        if ((!finalEncounter || canMartyr) && canManeuver)\n+        {\n+            drakespell = drake->m_spells[1]; //Evasive Maneuvers\n+            target = drake;\n+        }\n+        else if (finalEncounter && canMartyr)\n+        {\n+            drakespell = drake->m_spells[2]; //Martyr\n+            target = drake;\n+        }\n+    }\n+    if (!target)\n+    {\n+        drakespell = drake->m_spells[0]; //Searing Wrath\n+        target = opponent;\n+    }\n+\n+    if (!target)\n+        return;\n+\n+    if (!drakespell)\n+    {\n+        BOT_LOG_ERROR(\"scripts\", \"DoRubyDrakeVehicleStrats no spell for target {}\", target->GetName().c_str());\n+        return;\n+    }\n+\n+    SetBotCommandState(BOT_COMMAND_ATTACK);\n+    drake->BotStopMovement();\n+    drake->SetInFront(target);\n+    drake->CastSpell(target, drakespell);\n+}\n+void bot_ai::DoEmeraldDrakeVehicleStrats(uint32 diff)\n+{\n+    if (GC_Timer > diff)\n+        return;\n+\n+    GC_Timer = 350; //at least this delay\n+\n+    Creature* drake = me->GetVehicleCreatureBase();\n+    Unit const* mmover = master->GetVehicle() ? master->GetVehicleBase() : master;\n+    Unit* target = nullptr;\n+    uint32 drakespell = 0;\n+\n+    //IS HEALER\n+    //50328 Leeching Poison\n+    //50341 Touch the Nightmare\n+    //50344 Dream Funnel\n+\n+    uint8 drakeHpPct = GetHealthPCT(drake);\n+\n+    //canceling channel\n+    if (IsCasting(drake))\n+    {\n+        bool interrupt = false;\n+        if (drakeHpPct <= 30)\n+            interrupt = true;\n+        else if (mmover->isMoving() && drake->GetDistance(mmover) >= 75.f && !mmover->HasInArc(float(M_PI) / 2, drake))\n+            interrupt = true;\n+        else if (Spell const* funnel = drake->GetCurrentSpell(CURRENT_CHANNELED_SPELL))\n+            if (ObjectGuid guid = funnel->m_targets.GetUnitTargetGUID())\n+                if (Unit const* tar = ObjectAccessor::GetUnit(*drake, guid))\n+                    if (GetHealthPCT(tar) > 95)\n+                        interrupt = true;\n+\n+        if (interrupt)\n+            drake->InterruptNonMeleeSpells(false);\n+        else\n+            return;\n+    }\n+\n+    if (!CheckVehicleAttackTarget(_curVehStrat))\n+        return;\n+\n+    Aura const* pois = opponent->GetAura(50328, drake->GetGUID()); //Leeching Poison\n+    Aura const* rift = opponent->GetAura(49592); //Temporal Rift\n+    uint8 vehicles = LivingVehiclesCount();\n+    bool eregos = opponent->GetEntry() == CREATURE_BOSS_EREGOS_N || opponent->GetEntry() == CREATURE_BOSS_EREGOS_H;\n+\n+    bool finalEncounter = master->GetInstanceScript() && master->GetInstanceScript()->GetBossState(2) == DONE; //DATA_UROM\n+    bool canheal = finalEncounter && vehicles > 1 && (!eregos || drake->GetDistance(mmover) < 30.f) &&\n+        drakeHpPct >= (eregos ? 70 : 50) - (pois ? 5 * pois->GetStackAmount() : 0);\n+\n+    if (canheal && Rand() < 90)\n+    {\n+        drakespell = drake->m_spells[2]; //Dream Funnel\n+        std::list<Unit*> targets1;\n+        if (Group const* gr = master->GetGroup())\n+        {\n+            bool Bots = false;\n+            for (GroupReference const* itr = gr->GetFirstMember(); itr != nullptr; itr = itr->next())\n+            {\n+                Player const* p = itr->GetSource();\n+                if (!p || me->GetMap() != p->FindMap()) continue;\n+                if (p->HaveBot() && !Bots)\n+                    Bots = true;\n+                Unit* u = p->GetVehicleBase();\n+                if (u && u->IsAlive() && !u->HasUnitState(UNIT_STATE_ISOLATED) && drake->GetDistance(u) < 60.f &&\n+                    GetHealthPCT(u) <= (IsTank(p) ? 50 : 35) + (rift ? 15 : 0))\n+                    targets1.push_back(u);\n+            }\n+            if (Bots)\n+            {\n+                for (GroupReference const* itr = gr->GetFirstMember(); itr != nullptr; itr = itr->next())\n+                {\n+                    Player const* p = itr->GetSource();\n+                    if (!p || me->GetMap() != p->FindMap() || !p->HaveBot()) continue;\n+\n+                    for (auto const& [_, bot] : *p->GetBotMgr()->GetBotMap())\n+                    {\n+                        Unit* u = bot ? bot->GetVehicleBase() : nullptr;\n+                        if (u && u != drake && u->IsAlive() && !u->HasUnitState(UNIT_STATE_ISOLATED) && drake->GetDistance(u) < 60.f &&\n+                            GetHealthPCT(u) <= (IsTank(bot) ? 50 : 35) + (rift ? 15 : 0))\n+                            targets1.push_back(u);\n+                    }\n+                }\n+            }\n+        }\n+        else\n+        {\n+            for (auto const& [_, bot] : *master->GetBotMgr()->GetBotMap())\n+            {\n+                Unit* u = bot ? bot->GetVehicleBase() : nullptr;\n+                if (u && u != drake && u->IsAlive() && !u->HasUnitState(UNIT_STATE_ISOLATED) && drake->GetDistance(u) < 60.f &&\n+                    GetHealthPCT(u) <= (IsTank(bot) ? 50 : 35) + (rift ? 15 : 0))\n+                    targets1.push_back(u);\n+            }\n+        }\n+\n+        uint8 minhppct = 0;\n+        for (Unit const* u : targets1)\n+            if (uint8 hppct = GetHealthPCT(u))\n+                if (minhppct == 0 || minhppct > hppct)\n+                    minhppct = hppct;\n+\n+        if (minhppct <= 50)\n+            std::erase_if(targets1, BOTAI_PRED::HpPctAboveExclude(static_cast<float>(minhppct + 20)));\n+\n+        if (!targets1.empty())\n+            target = Bcore::Containers::SelectRandomContainerElement(targets1);\n+    }\n+    if (!target)\n+    {\n+        drakespell = drake->m_spells[1]; //Touch the Nightmare\n+        if (!drake->HasSpellCooldown(drakespell))\n+        {\n+            if ((eregos && drakeHpPct >= ((opponent->GetHealth() < (rift ? 50000u : 25000u)) ? 31 : 80)) ||\n+                (drakeHpPct >= 90 && Rand() < 50 && !opponent->HasAura(drakespell)))\n+                target = opponent;\n+        }\n+    }\n+    if (!target)\n+    {\n+        drakespell = drake->m_spells[0]; //Leeching Poison\n+        if (!pois || pois->GetStackAmount() < 3 || pois->GetDuration() < 4000)\n+            target = opponent;\n+        else\n+        {\n+            //random target\n+            std::list<Unit*> targets;\n+            Bcore::AnyUnfriendlyUnitInObjectRangeCheck check(drake, drake, 60.f);\n+            Bcore::UnitListSearcher <Bcore::AnyUnfriendlyUnitInObjectRangeCheck> searcher(drake, targets, check);\n+            //drake->VisitNearbyObject(60.f, searcher);\n+            Cell::VisitObjects(drake, searcher, 60.f);\n+            std::erase_if(targets, BOTAI_PRED::UnitExclude(opponent));\n+            std::erase_if(targets, BOTAI_PRED::UnitCombatStateExclude(false));\n+            std::erase_if(targets, BOTAI_PRED::AuraedTargetExcludeByCaster(drakespell, drake->GetGUID(), 3));\n+            std::erase_if(targets, BOTAI_PRED::AuraedTargetExclude(49836, 5)); //Shock Charge 1-shots\n+\n+            if (!targets.empty())\n+                target = Bcore::Containers::SelectRandomContainerElement(targets);\n+        }\n+    }\n+\n+    if (!target)\n+        return;\n+\n+    if (!drakespell)\n+    {\n+        BOT_LOG_ERROR(\"scripts\", \"DoEmeraldDrakeVehicleStrats no spell for target {}\", target->GetName().c_str());\n+        return;\n+    }\n+\n+    SetBotCommandState(BOT_COMMAND_ATTACK);\n+    drake->BotStopMovement();\n+    drake->SetInFront(target);\n+    drake->CastSpell(target, drakespell);\n+}\n+void bot_ai::DoAmberDrakeVehicleStrats(uint32 diff)\n+{\n+    if (GC_Timer > diff)\n+        return;\n+\n+    GC_Timer = 350; //at least this delay\n+\n+    if (!CheckVehicleAttackTarget(_curVehStrat))\n+        return;\n+\n+    Creature* drake = me->GetVehicleCreatureBase();\n+    ASSERT(drake);\n+    Unit const* mmover = master->GetVehicle() ? master->GetVehicleBase() : master;\n+    Unit* target = nullptr;\n+    uint32 drakespell = 0;\n+\n+    //IS DPS\n+    //49840 Shock Lance\n+    //49838 Stop Time\n+    //49592 Temporal Rift\n+    //49836 Shock Charge\n+\n+    Aura const* shoc = opponent->GetAura(49836, drake->GetGUID()); //Shock Charge\n+\n+    //canceling channel\n+    if (IsCasting(drake))\n+    {\n+        bool interrupt = false;\n+\n+        if (mmover->isMoving() && drake->GetDistance(mmover) >= 60.f && !mmover->HasInArc(float(M_PI) / 2, drake))\n+            interrupt = true;\n+        else if (shoc && shoc->GetStackAmount() >= 10)\n+            interrupt = true;\n+\n+        if (interrupt)\n+            drake->InterruptNonMeleeSpells(false);\n+        else\n+            return;\n+    }\n+\n+    Aura const* rift = opponent->GetAura(49592); //Temporal Rift\n+    uint8 vehicles = LivingVehiclesCount();\n+    bool eregos = opponent->GetEntry() == CREATURE_BOSS_EREGOS_N || opponent->GetEntry() == CREATURE_BOSS_EREGOS_H;\n+\n+    bool finalEncounter = master->GetInstanceScript() && master->GetInstanceScript()->GetBossState(2) == DONE; //DATA_UROM\n+\n+    if (eregos && !drake->HasSpellCooldown(drake->m_spells[1]) && IsCasting(opponent) &&\n+        opponent->HasAuraType(SPELL_AURA_MOD_CASTING_SPEED_NOT_STACK) && opponent->GetDiminishing(DIMINISHING_STUN) <= DIMINISHING_LEVEL_2)\n+    {\n+        drakespell = drake->m_spells[1]; //Stop Time\n+        target = drake;\n+    }\n+    if (!target && shoc && shoc->GetStackAmount() >= 5)\n+    {\n+        drakespell = drake->m_spells[0]; //Shock Lance\n+        if (eregos && shoc->GetStackAmount() >= 10 && (rift || shoc->GetDuration() < 25000 || Rand() < 30))\n+            target = opponent;\n+        else\n+        {\n+            //random 1-shot target\n+            std::list<Unit*> targets;\n+            Bcore::AnyUnfriendlyUnitInObjectRangeCheck check(drake, drake, 60.f);\n+            Bcore::UnitListSearcher <Bcore::AnyUnfriendlyUnitInObjectRangeCheck> searcher(drake, targets, check);\n+            //drake->VisitNearbyObject(60.f, searcher);\n+            Cell::VisitObjects(drake, searcher, 60.f);\n+            std::erase_if(targets, BOTAI_PRED::UnitExclude(opponent));\n+\n+            if (!targets.empty())\n+                target = Bcore::Containers::SelectRandomContainerElement(targets);\n+        }\n+    }\n+    if (!target)\n+    {\n+        if (finalEncounter && vehicles > 1)\n+        {\n+            drakespell = drake->m_spells[2]; //Temporal Rift\n+            target = opponent;\n+        }\n+        else\n+        {\n+            drakespell = drake->m_spells[0]; //Shock Lance\n+            target = opponent;\n+        }\n+    }\n+\n+    if (!target)\n+        return;\n+\n+    if (!drakespell)\n+    {\n+        BOT_LOG_ERROR(\"scripts\", \"DoAmberDrakeVehicleStrats no spell for target {}\", target->GetName().c_str());\n+        return;\n+    }\n+\n+    SetBotCommandState(BOT_COMMAND_ATTACK);\n+    drake->BotStopMovement();\n+    drake->SetInFront(target);\n+    drake->CastSpell(target, drakespell);\n+}\n+void bot_ai::DoArgentMountVehicleStrats(uint32 diff)\n+{\n+    if (GC_Timer > diff)\n+        return;\n+\n+    GC_Timer = 200; //at least this delay\n+\n+    Creature* mount = me->GetVehicleCreatureBase();\n+\n+    //Tounament spells\n+    //62544 Thrust\n+    //62575 Shield-Breaker\n+    //62960 Charge\n+    //62552 Defend\n+    //64077 Refresh Mount\n+\n+    //ToC5 spells\n+    //68505 Thrust\n+    //62575 Shield-Breaker\n+    //68282 Charge\n+    //62552 Defend\n+\n+    if (!mount->HasSpellCooldown(mount->m_spells[3])) //Defend\n+    {\n+        Aura const* myde = mount->GetAura(mount->m_spells[3]);\n+        if (!myde || myde->GetStackAmount() < myde->GetSpellInfo()->StackAmount || myde->GetDuration() <= 8000)\n+        {\n+            mount->CastSpell(mount, mount->m_spells[3]);\n+            return;\n+        }\n+    }\n+\n+    if (!CheckVehicleAttackTarget(_curVehStrat))\n+        return;\n+\n+    //Unit const* mmover = master->GetVehicle() ? master->GetVehicleBase() : master;\n+    Unit* target = nullptr;\n+    uint32 mountspell = 0;\n+\n+    if (mount->GetDistance(opponent) > 5.f)\n+    {\n+        //Defend\n+        AuraEffect const* def = opponent->GetAuraEffect(SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN,SPELLFAMILY_GENERIC, 2007, EFFECT_0);\n+        if (!def)\n+            def = opponent->GetAuraEffect(SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN,SPELLFAMILY_GENERIC, 2007, EFFECT_2);\n+        if ((!def || def->GetBase()->GetStackAmount() < 2) && !mount->HasSpellCooldown(mount->m_spells[2]))\n+        {\n+            mountspell = mount->m_spells[2]; //Charge\n+            target = opponent;\n+        }\n+        else\n+        {\n+            mountspell = mount->m_spells[1]; //Shield-Breaker\n+            target = opponent;\n+        }\n+    }\n+    else\n+    {\n+        mountspell = mount->m_spells[0]; //Thrust\n+        target = opponent;\n+    }\n+\n+    if (!target)\n+        return;\n+\n+    if (!mountspell)\n+    {\n+        BOT_LOG_ERROR(\"scripts\", \"DoArgentMountVehicleStrats no spell for target {}\", target->GetName().c_str());\n+        return;\n+    }\n+\n+    SetBotCommandState(BOT_COMMAND_ATTACK);\n+    mount->BotStopMovement();\n+    mount->SetInFront(target);\n+    mount->CastSpell(target, mountspell);\n+}\n+void bot_ai::DoDemolisherVehicleStrats(uint32 diff)\n+{\n+    if (GC_Timer > diff)\n+        return;\n+\n+    GC_Timer = 350; //at least this delay\n+\n+    if (!CheckVehicleAttackTarget(_curVehStrat))\n+        return;\n+}\n+void bot_ai::DoSiegeEngineVehicleStrats(uint32 diff)\n+{\n+    if (GC_Timer > diff)\n+        return;\n+\n+    GC_Timer = 350; //at least this delay\n+\n+    if (!CheckVehicleAttackTarget(_curVehStrat))\n+        return;\n+}\n+void bot_ai::DoChopperVehicleStrats(uint32 diff)\n+{\n+    if (GC_Timer > diff)\n+        return;\n+\n+    GC_Timer = 350; //at least this delay\n+\n+    if (!CheckVehicleAttackTarget(_curVehStrat))\n+        return;\n+}\n+void bot_ai::DoGenericVehicleStrats(uint32 diff)\n+{\n+    if (GC_Timer > diff)\n+        return;\n+\n+    GC_Timer = 350; //at least this delay\n+\n+    if (!CheckVehicleAttackTarget(_curVehStrat))\n+        return;\n+}\n+void bot_ai::DoVehicleStrats(BotVehicleStrats strat, uint32 diff)\n+{\n+    if (_curVehStrat != strat)\n+    {\n+        //BOT_LOG_ERROR(\"scripts\", \"DoVehicleStrats doing strat %u\", uint32(strat));\n+        _curVehStrat = strat;\n+    }\n+\n+    //if (!master->GetVehicle() || me->GetVehicle()->GetCreatureEntry() != master->GetVehicle()->GetCreatureEntry())\n+    //{\n+    //    BOT_LOG_ERROR(\"scripts\", \"DoVehicleStrats cannot do strats: master not on vehicle or on different one\");\n+    //    return;\n+    //}\n+\n+    switch (strat)\n+    {\n+        case BOT_VEH_STRAT_WYRMREST_SKYTALON:\n+            DoSkytalonVehicleStrats(diff);\n+            break;\n+        case BOT_VEH_STRAT_RUBY_DRAKE:\n+            DoRubyDrakeVehicleStrats(diff);\n+            break;\n+        case BOT_VEH_STRAT_EMERALD_DRAKE:\n+            DoEmeraldDrakeVehicleStrats(diff);\n+            break;\n+        case BOT_VEH_STRAT_AMBER_DRAKE:\n+            DoAmberDrakeVehicleStrats(diff);\n+            break;\n+        case BOT_VEH_STRAT_TOC5_MOUNT:\n+            DoArgentMountVehicleStrats(diff);\n+            break;\n+        case BOT_VEH_STRAT_ULDUAR_DEMOLISHER:\n+            DoDemolisherVehicleStrats(diff);\n+            break;\n+        case BOT_VEH_STRAT_ULDUAR_SIEGEENGINE:\n+            DoSiegeEngineVehicleStrats(diff);\n+            break;\n+        case BOT_VEH_STRAT_ULDUAR_CHOPPER:\n+            DoChopperVehicleStrats(diff);\n+            break;\n+        case BOT_VEH_STRAT_GENERIC:\n+            DoGenericVehicleStrats(diff);\n+            break;\n+        default:\n+            BOT_LOG_ERROR(\"scripts\", \"Unhandled vehicle strat {}\", uint32(strat));\n+            break;\n+    }\n+}\n+void bot_ai::DoVehicleActions(uint32 diff)\n+{\n+    if (!me->GetVehicle())\n+        return;\n+\n+    //choose strat\n+    BotVehicleStrats strat;\n+    switch (me->GetVehicleBase()->GetEntry())\n+    {\n+        case CREATURE_NEXUS_SKYTALON_1:\n+        case CREATURE_EOE_SKYTALON_N:\n+        case CREATURE_EOE_SKYTALON_H:\n+            strat = BOT_VEH_STRAT_WYRMREST_SKYTALON;\n+            break;\n+        case CREATURE_OCULUS_DRAKE_RUBY:\n+            strat = BOT_VEH_STRAT_RUBY_DRAKE;\n+            break;\n+        case CREATURE_OCULUS_DRAKE_EMERALD:\n+            strat = BOT_VEH_STRAT_EMERALD_DRAKE;\n+            break;\n+        case CREATURE_OCULUS_DRAKE_AMBER:\n+            strat = BOT_VEH_STRAT_AMBER_DRAKE;\n+            break;\n+        //case CREATURE_TOC_STEED_QUELDOREI:\n+        //case CREATURE_TOC_NIGHTSABER:\n+        //case CREATURE_TOC_STEED_STORMWIND:\n+        //case CREATURE_TOC_MECHANOSTRIDER:\n+        //case CREATURE_TOC_RAM:\n+        //case CREATURE_TOC_ELEKK:\n+        //case CREATURE_TOC_HAWKSTRIDER_SUNREAVER:\n+        //case CREATURE_TOC_RAPTOR:\n+        //case CREATURE_TOC_WARHORSE:\n+        //case CREATURE_TOC_WOLF:\n+        //case CREATURE_TOC_HAWKSTRIDER_SILVERMOON:\n+        //case CREATURE_TOC_KODO:\n+        case CREATURE_TOC5_WARHORSE:\n+        case CREATURE_TOC5_BATTLEWORG:\n+            strat = BOT_VEH_STRAT_TOC5_MOUNT;\n+            break;\n+        /*\n+        case CREATURE_ULDUAR_DEMOLISHER:\n+            strat = BOT_VEH_STRAT_ULDUAR_DEMOLISHER;\n+            break;\n+        case CREATURE_ULDUAR_SIEGE_ENGINE:\n+            strat = BOT_VEH_STRAT_ULDUAR_SIEGEENGINE;\n+            break;\n+        case CREATURE_ULDUAR_CHOPPER:\n+        case CREATURE_ULDUAR_CHOPPER1:\n+            strat = BOT_VEH_STRAT_ULDUAR_CHOPPER;\n+            break;\n+        */\n+        default:\n+            strat = BOT_VEH_STRAT_GENERIC;\n+            if (_curVehStrat != strat)\n+                BOT_LOG_DEBUG(\"scripts\", \"bot_ai DoVehicleActions: {} has to use generic strat for vehicle creature {} ({})\",\n+                me->GetName().c_str(), me->GetVehicleBase()->GetName().c_str(), me->GetVehicleBase()->GetEntry());\n+            break;\n+    }\n+\n+    DoVehicleStrats(strat, diff);\n+}\n+bool bot_ai::CheckVehicleAttackTarget(BotVehicleStrats strat)\n+{\n+    opponent = _getVehicleTarget(strat);\n+\n+    if (!opponent)\n+    {\n+        if (me->GetVehicleBase()->GetTarget())\n+        {\n+            me->GetVehicleBase()->AttackStop();\n+            me->GetVehicleBase()->SetTarget(ObjectGuid::Empty);\n+        }\n+        else if (!master->GetVehicle() && me->GetVehicleBase()->GetDistance(master) < ((Rand() < 25) ? 35 : 15))\n+        {\n+            //if (VehicleSeatEntry const* seat = me->GetVehicle()->GetSeatForPassenger(me))\n+            //{\n+                //if (seat->CanEnterOrExit())\n+                    me->ExitVehicle();\n+                    //me->BotStopMovement();\n+            //}\n+        }\n+\n+        return false;\n+    }\n+\n+    if (opponent->GetGUID() != me->GetVehicleBase()->GetTarget())\n+    {\n+        me->GetVehicleBase()->SetTarget(opponent->GetGUID());\n+        SetBotCommandState(BOT_COMMAND_ATTACK);\n+        me->GetVehicleBase()->Attack(opponent, false);\n+    }\n+\n+    return true;\n+}\n+\n+bool bot_ai::HasVehicleRoleOverride(uint32 role) const\n+{\n+    if (Creature const* veh = me->GetVehicleCreatureBase())\n+    {\n+        switch (veh->GetEntry())\n+        {\n+            case CREATURE_NEXUS_SKYTALON_1:\n+            case CREATURE_EOE_SKYTALON_N:\n+            case CREATURE_EOE_SKYTALON_H:\n+            case CREATURE_OCULUS_DRAKE_RUBY:\n+            case CREATURE_OCULUS_DRAKE_EMERALD:\n+            case CREATURE_OCULUS_DRAKE_AMBER:\n+            //case CREATURE_TOC_STEED_QUELDOREI:\n+            //case CREATURE_TOC_NIGHTSABER:\n+            //case CREATURE_TOC_STEED_STORMWIND:\n+            //case CREATURE_TOC_MECHANOSTRIDER:\n+            //case CREATURE_TOC_RAM:\n+            //case CREATURE_TOC_ELEKK:\n+            //case CREATURE_TOC_HAWKSTRIDER_SUNREAVER:\n+            //case CREATURE_TOC_RAPTOR:\n+            //case CREATURE_TOC_WARHORSE:\n+            //case CREATURE_TOC_WOLF:\n+            //case CREATURE_TOC_HAWKSTRIDER_SILVERMOON:\n+            //case CREATURE_TOC_KODO:\n+            case CREATURE_TOC5_WARHORSE:\n+            case CREATURE_TOC5_BATTLEWORG:\n+            case CREATURE_ULDUAR_DEMOLISHER:\n+                switch (role)\n+                {\n+                    case BOT_ROLE_RANGED:\n+                        return true;\n+                    default:\n+                        break;\n+                }\n+                break;\n+            default:\n+                break;\n+        }\n+    }\n+\n+    return false;\n+}\n+float bot_ai::GetVehicleAttackDistanceOverride() const\n+{\n+    if (Creature const* veh = me->GetVehicleCreatureBase())\n+    {\n+        switch (veh->GetEntry())\n+        {\n+            case CREATURE_NEXUS_SKYTALON_1:\n+            case CREATURE_EOE_SKYTALON_N:\n+            case CREATURE_EOE_SKYTALON_H:\n+            case CREATURE_OCULUS_DRAKE_RUBY:\n+            case CREATURE_OCULUS_DRAKE_EMERALD:\n+            case CREATURE_OCULUS_DRAKE_AMBER:\n+                return 30.f;\n+            //case CREATURE_TOC_STEED_QUELDOREI:\n+            //case CREATURE_TOC_NIGHTSABER:\n+            //case CREATURE_TOC_STEED_STORMWIND:\n+            //case CREATURE_TOC_MECHANOSTRIDER:\n+            //case CREATURE_TOC_RAM:\n+            //case CREATURE_TOC_ELEKK:\n+            //case CREATURE_TOC_HAWKSTRIDER_SUNREAVER:\n+            //case CREATURE_TOC_RAPTOR:\n+            //case CREATURE_TOC_WARHORSE:\n+            //case CREATURE_TOC_WOLF:\n+            //case CREATURE_TOC_HAWKSTRIDER_SILVERMOON:\n+            //case CREATURE_TOC_KODO:\n+            case CREATURE_TOC5_WARHORSE:\n+            case CREATURE_TOC5_BATTLEWORG:\n+                return 15.f;\n+            case CREATURE_ULDUAR_DEMOLISHER:\n+                return 40.f;\n+            default:\n+                break;\n+        }\n+    }\n+\n+    return 0.0f;\n+}\n+uint8 bot_ai::LivingVehiclesCount(uint32 entry) const\n+{\n+    uint8 count = 0;\n+    if (!IAmFree())\n+    {\n+        if (master->GetVehicle())\n+            ++count;\n+        for (auto const& [_, bot] : *master->GetBotMgr()->GetBotMap())\n+            if (bot && bot->GetVehicle() && (!entry || entry == bot->GetVehicleBase()->GetEntry()))\n+                ++count;\n+    }\n+\n+    return count;\n+}\n+//GLOBAL UPDATE\n+void bot_ai::UpdateDeadAI(uint32 diff)\n+{\n+    // group update\n+    if (_groupUpdateTimer <= diff)\n+        SendUpdateToOutOfRangeBotGroupMembers();\n+\n+    // soulstone\n+    if (GetSelfRezSpell() && !GetBG() && (IAmFree() || !master->GetBotMgr()->IsPartyInCombat(false)) && Rand() < 15)\n+        me->CastSpell(me, GetSelfRezSpell());\n+}\n+//opponent unsafe\n+bool bot_ai::GlobalUpdate(uint32 diff)\n+{\n+    if (!BotCfg::IsNpcBotModEnabled() || !BotDataMgr::AllBotsLoaded())\n+        return false;\n+\n+    if (IsWanderer())\n+    {\n+        if (Battleground* bg = GetBG())\n+        {\n+            if (bg->GetStatus() == STATUS_WAIT_LEAVE)\n+            {\n+                if (std::ranges::find_if(bg->GetPlayers(), [](auto const& kv) { return kv.first.IsPlayer(); }) == bg->GetPlayers().cend())\n+                    bg->RemoveBotAtLeave(me->GetGUID());\n+                return false;\n+            }\n+        }\n+    }\n+    else\n+    {\n+        if (_checkOwershipTimer && _checkOwershipTimer <= diff)\n+        {\n+            if (IAmFree())\n+            {\n+                if (_botData->owner != 0)\n+                {\n+                    CheckOwnerExpiry();\n+                    if (_botData->owner == 0)\n+                    {\n+                        _checkOwershipTimer = 0;\n+                        return false;\n+                    }\n+                }\n+            }\n+            _checkOwershipTimer = CalculateOwnershipCheckTime();\n+        }\n+    }\n+\n+    //db saves with cd\n+    //  1) disabled spells\n+    if (_saveDisabledSpells && _saveDisabledSpellsTimer <= diff)\n+    {\n+        _saveDisabledSpells = false;\n+        _saveDisabledSpellsTimer = 5000;\n+\n+        if (!IsTempBot())\n+            BotDataMgr::UpdateNpcBotData(me->GetEntry(), NPCBOT_UPDATE_DISABLED_SPELLS, &_botData->disabled_spells);\n+    }\n+    //  2) miscavalues\n+    if (_saveMiscValues && _saveMiscValuesTimer <= diff)\n+    {\n+        _saveMiscValues = false;\n+        _saveMiscValuesTimer = 5000;\n+\n+        if (!IsTempBot())\n+            BotDataMgr::UpdateNpcBotData(me->GetEntry(), NPCBOT_UPDATE_MISCVALUES, &_botData->miscvalues);\n+    }\n+\n+    if (_updateTimerEx2 <= diff)\n+    {\n+        _updateTimerEx2 = urand(2000, 4000);\n+\n+        //Rent Collecting\n+        uint32 rent_cost = BotCfg::GetNpcBotCostRent(master->GetLevel(), GetBotClass());\n+        if (_rentTimer >= RENT_COLLECT_TIMER && rent_cost && !HasBotCommandState(BOT_COMMAND_UNBIND) && !IAmFree())\n+        {\n+            uint32 rent_money = 0;\n+            while (_rentTimer >= RENT_COLLECT_TIMER)\n+            {\n+                rent_money += uint32(uint64(rent_cost) * (RENT_COLLECT_TIMER / 1000) / (RENT_TIMER / 1000));\n+                _rentTimer -= RENT_COLLECT_TIMER;\n+            }\n+\n+            rent_money = std::max<uint32>(rent_money, 1);\n+            if (!master->HasEnoughMoney(rent_money))\n+            {\n+                ChatHandler(master->GetSession()).SendNotification(LocalizedNpcText(master, BOT_TEXT_HIREFAIL_COST).c_str());\n+                master->GetBotMgr()->RemoveBot(me->GetGUID(), BOT_REMOVE_UNAFFORD);\n+                return false;\n+            }\n+            master->ModifyMoney(-int32(rent_money));\n+        }\n+\n+        if (BotCfg::HideBotSpawns() && IAmFree() && !IsWanderer())\n+        {\n+            // !!bot may be out of world!!\n+            Map* mymap = me->FindMap();\n+            if (mymap)\n+            {\n+                std::list<Player*> plist;\n+                Bcore::AllWorldObjectsInExactRange pcheck(me, 15.0f, false);\n+                Bcore::PlayerListSearcher<decltype(pcheck)> searcher(me, plist, pcheck);\n+                Cell::VisitObjects(me, searcher, 20.f);\n+                _canAppearInWorld = std::ranges::any_of(plist, [](Player const* pl) { return pl->GetSession()->GetSecurity() > SEC_PLAYER; });\n+                if (!CanAppearInWorld() && !IsDuringTeleport())\n+                    BotMgr::TeleportBot(me, mymap, me, true);\n+            }\n+            else\n+            {\n+                _canAppearInWorld = false;\n+                BOT_LOG_ERROR(\"npcbots\", \"Bot {} tried to check hide status but doesn't have a valid map set\", me->GetEntry());\n+            }\n+        }\n+        else\n+            _canAppearInWorld = true;\n+    }\n+\n+    ReduceCD(diff);\n+\n+    UpdateContestedPvP();\n+\n+    lastdiff = diff;\n+\n+    FindMaster();\n+\n+    if (IsDuringTeleport())\n+        return false;\n+\n+    if (_updateTimerLong <= diff)\n+    {\n+        _updateTimerLong = urand(15000, 25000);\n+\n+        //Long-timed updates\n+\n+        if (me->IsInWorld() && me->IsAlive() && me->IsInCombat() && !me->GetMap()->IsDungeon() && (IAmFree() || !master->IsInCombat()))\n+            me->GetCombatManager().EndCombatBeyondRange(me->GetMap()->GetVisibilityRange(), true);\n+    }\n+\n+    if (_updateTimerMedium <= diff)\n+    {\n+        _updateTimerMedium = 500;\n+\n+        //Medium-timed updates\n+\n+        //send stats update for group frames\n+        if (me->IsInWorld() && !IAmFree())\n+        {\n+            //update pvp state\n+            if (me->GetByteValue(UNIT_FIELD_BYTES_2, 1) != master->GetByteValue(UNIT_FIELD_BYTES_2, 1))\n+                me->SetByteValue(UNIT_FIELD_BYTES_2, 1, master->GetByteValue(UNIT_FIELD_BYTES_2, 1));\n+\n+            //vehicle enter delayed\n+            if (shouldEnterVehicle && master->IsInWorld() && me->IsAlive() &&/* !HasBotCommandState(BOT_COMMAND_MASK_UNMOVING) &&*/\n+                !me->GetVehicle() && master->GetVehicle() && !CCed(me, true) && !IsCasting())\n+            {\n+                shouldEnterVehicle = false;\n+                AfterBotOwnerEnterVehicle();\n+            }\n+\n+            //gossip availability check\n+            if (HasBotCommandState(BOT_COMMAND_NOGOSSIP) && me->HasNpcFlag(UNIT_NPC_FLAG_GOSSIP))\n+                me->RemoveNpcFlag(UNIT_NPC_FLAG_GOSSIP);\n+        }\n+\n+        if (me->IsInWorld() && me->IsAlive() && IAmFree())\n+        {\n+            if (me->HasAuraType(SPELL_AURA_MOUNTED) && IsIndoors() && sWorld->getBoolConfig(CONFIG_VMAP_INDOOR_CHECK))\n+                me->RemoveAurasWithAttribute(SPELL_ATTR0_ONLY_OUTDOORS);\n+        }\n+    }\n+\n+    if (!me->IsAlive())\n+        return false;\n+\n+    if (!me->IsInWorld())\n+    {\n+        if (IAmFree())\n+            BOT_LOG_ERROR(\"scripts\", \"bot_ai::GlobalUpdate is called for free bot not in world: {} ({}) class {} level {}\",\n+                me->GetName().c_str(), me->GetEntry(), uint32(_botclass), uint32(me->GetLevel()));\n+        return false;\n+    }\n+\n+    if (doHealth)\n+    {\n+        doHealth = false;\n+        _OnHealthUpdate();\n+    }\n+    if (doMana)\n+    {\n+        doMana = false;\n+        _OnManaUpdate();\n+    }\n+\n+    // group update\n+    if (_groupUpdateTimer <= diff)\n+        SendUpdateToOutOfRangeBotGroupMembers();\n+\n+    if (ordersTimer <= diff)\n+        _ProcessOrders();\n+\n+    //if (me->HasInvisibilityAura() || me->HasStealthAura())\n+    //    return false;\n+\n+    //Check current cast state: interrupt casts that became pointless\n+    if (me->HasUnitState(UNIT_STATE_CASTING) && !HasBotCommandState(BOT_COMMAND_ISSUED_ORDER) && urand(1,100) <= 75)\n+    {\n+        for (uint8 i = CURRENT_FIRST_NON_MELEE_SPELL; i != CURRENT_MAX_SPELL; ++i)\n+        {\n+            bool interrupt = false;\n+            Unit const* target = nullptr;\n+            Spell* spell = me->GetCurrentSpell(CurrentSpellTypes(i));\n+            if (!spell)\n+                continue;\n+\n+            SpellInfo const* info = spell->GetSpellInfo();\n+            if (!info->CastTimeEntry)\n+                continue;\n+\n+            if (info->Id == SHOOT_WAND && me->isMoving())\n+                interrupt = true;\n+            else if (info->Id == 32783) //Arcane Channeling, not interrupted automatically\n+                interrupt = true;\n+            else\n+            {\n+                // not interrupted yet, next checks require target, ensure validity\n+                // kidna expensive but prevents invalid targets\n+                if (spell->m_targets.GetObjectTargetGUID().IsAnyTypeCreature())\n+                    spell->m_targets.Update(me);\n+                target = spell->m_targets.GetUnitTarget(); // can be nullptr\n+                if (!target)\n+                    continue;\n+            }\n+\n+            if (!interrupt && !info->IsPositive())\n+            {\n+                if (!target->IsAlive() && info->Id != SPELL_CORPSE_EXPLOSION && info->Id != SPELL_RAISE_DEAD)\n+                    interrupt = true;\n+                else if ((info->Mechanic == MECHANIC_POLYMORPH || info->Mechanic == MECHANIC_SHACKLE ||\n+                    info->Mechanic == MECHANIC_DISORIENTED || info->Mechanic == MECHANIC_SLEEP ||\n+                    info->Mechanic == MECHANIC_CHARM || info->Mechanic == MECHANIC_BANISH ||\n+                    info->Mechanic == MECHANIC_STUN || info->Mechanic == MECHANIC_FREEZE) &&\n+                    info->GetFirstRankSpell()->Id != 710 && info->GetFirstRankSpell()->Id != SPELL_SLEEP &&\n+                    !target->getAttackers().empty() && !IsCasting(target))\n+                    interrupt = true; //useless control (except banish, checked inside class ai)\n+                else if (target->HasAuraType(SPELL_AURA_PERIODIC_DAMAGE) && !IsCasting(target) &&\n+                    (info->AuraInterruptFlags & AURA_INTERRUPT_FLAG_TAKE_DAMAGE) && _botclass != BOT_CLASS_MAGE)\n+                    interrupt = true; //useless control breaks immediately (skip glyphed poly)\n+                else if (info->DmgClass == SPELL_DAMAGE_CLASS_MAGIC && !(info->Attributes & SPELL_ATTR0_IS_ABILITY) &&\n+                    !(info->AttributesEx & SPELL_ATTR1_NO_REFLECTION) &&\n+                    !(info->Attributes & SPELL_ATTR0_NO_IMMUNITIES) &&\n+                    (target->GetTotalAuraModifier(SPELL_AURA_REFLECT_SPELLS) > 60 ||\n+                    target->GetTotalAuraModifierByMiscMask(SPELL_AURA_REFLECT_SPELLS_SCHOOL, info->GetSchoolMask()) > 60))\n+                    interrupt = true; // reflect\n+                else if (\n+                    info->Id != 64382 && //shattering throw\n+                    info->Id != 32375 && //mass dispel\n+                    info->GetFirstRankSpell()->Id != 710 && //banish\n+                    target->IsImmunedToSpell(info))\n+                    interrupt = true; // immune\n+                else if (i != CURRENT_CHANNELED_SPELL && //channeled targeted spells will be interrupted in Spell::update()\n+                    spell->GetCastTime() < spell->GetTimer() * 3 && // >=33% cast time remains\n+                    !me->IsWithinLOSInMap(target, VMAP::ModelIgnoreFlags::M2, LINEOFSIGHT_ALL_CHECKS))\n+                    interrupt = true; //LoS\n+                else if (info->Id == 64382 && !target->HasAuraWithMechanic(1ull<<MECHANIC_IMMUNE_SHIELD))\n+                    interrupt = true; //Shattering Throw wasting\n+            }\n+            if (!interrupt && !(target == master && me->GetDistance(target) < INTERACTION_DISTANCE) &&\n+                info->HasEffect(SPELL_EFFECT_HEAL) && GetHealthPCT(target) > 90 && !IsPointedHealTarget(target))\n+            {\n+                bool isAreaSpell = false;\n+                for (uint8 j = 0; j != 3 && isAreaSpell == false; ++j)\n+                {\n+                    if (info->Effects[j].IsEffect() && info->Effects[j].TargetA.GetTarget())\n+                    {\n+                        if (info->Effects[j].TargetA.GetSelectionCategory() == TARGET_SELECT_CATEGORY_NEARBY ||\n+                            info->Effects[j].TargetA.GetSelectionCategory() == TARGET_SELECT_CATEGORY_AREA)\n+                            isAreaSpell = true;\n+                        if (!isAreaSpell)\n+                        {\n+                            switch (info->Effects[j].TargetA.GetTarget())\n+                            {\n+                            case TARGET_UNIT_CASTER_AREA_PARTY:\n+                            case TARGET_DEST_CHANNEL_TARGET:\n+                                isAreaSpell = true;\n+                                break;\n+                            case TARGET_UNIT_TARGET_CHAINHEAL_ALLY:\n+                                //Healing Wave falls under TARGET_UNIT_TARGET_CHAINHEAL_ALLY\n+                                if (info->GetFirstRankSpell()->Id == 331)\n+                                    break;\n+                                isAreaSpell = true;\n+                                break;\n+                            default:\n+                                break;\n+                            }\n+                        }\n+                        break;\n+                    }\n+                }\n+\n+                if (isAreaSpell == false)\n+                {\n+                    if (!IsTank(target) || target->getAttackers().empty() ||\n+                        spell->GetTimer() * 4 <= spell->GetCastTime()) //<=25% cast time remains\n+                        interrupt = true;\n+                }\n+            }\n+            if (!interrupt && (info->HasEffect(SPELL_EFFECT_RESURRECT) || info->HasEffect(SPELL_EFFECT_RESURRECT_NEW)) &&\n+                (target->IsAlive() || (target->IsPlayer() && target->ToPlayer()->isResurrectRequested())))\n+                interrupt = true;\n+            if (!interrupt && checkAurasTimer <= diff && me->GetMap()->IsDungeon() && !CCed(me, true) && IsWithinAoERadius(*me))\n+                interrupt = true;\n+\n+            if (interrupt)\n+            {\n+                me->InterruptSpell(CurrentSpellTypes(i));\n+                GC_Timer = 0;\n+                break;\n+            }\n+        }\n+    }\n+\n+    if (_updateTimerEx1 <= diff)\n+    {\n+        _updateTimerEx1 = urand(2000, 2500);\n+\n+        //Ex1-timed updates\n+\n+        //DEBUG\n+        /*\n+        Sometimes bots are affected by zone (instance) scripts\n+        Good example is CoT: Battle for Mount Hyjal\n+        */\n+        //Faction\n+        //ensure master is not controlled\n+        ChrRacesEntry const* rEntry = sChrRacesStore.LookupEntry(master->GetRace());\n+        uint32 fac_orig = rEntry ? rEntry->FactionID : 0;\n+        if (master->GetFaction() == fac_orig)\n+        {\n+            uint32 fac = (!IAmFree() && me->GetMap()->IsBattleArena()) ? uint32(FACTION_MONSTER) : fac_orig;\n+            if (me->GetFaction() != fac)\n+            {\n+                //std::ostringstream msg;\n+                //msg << \"Something changed my faction (now \" << me->GetFaction() << \"), changing back to \" << fac << \"!\";\n+                //BotWhisper(msg.view());\n+                me->SetFaction(fac);\n+            }\n+        }\n+        //Visibility\n+        if (!me->IsVisible() && master->IsVisible())\n+        {\n+            //BotWhisper(\"Something changed my visibility status! Making visible...\");\n+            me->SetVisible(true);\n+        }\n+        if (me->IsVisible() && !master->IsVisible())\n+        {\n+            //BotWhisper(\"Something changed my visibility status! Making invisible...\");\n+            me->SetVisible(false);\n+        }\n+        //Phase\n+        if (me->GetPhaseMask() != master->GetPhaseMask())\n+        {\n+            //BotWhisper(\"Somehow we are not is same phase! Fixing that...\");\n+            me->SetPhaseMask(master->GetPhaseMask(), true);\n+        }\n+        //Vehicle state\n+        //if (me->GetVehicle() && !master->GetVehicle())\n+        //{\n+        //    BotWhisper(\"Somehow i'm still in the vehicle! Exiting...\");\n+        //    OnBotOwnerExitVehicle(nullptr);\n+        //}\n+        ////Vehicle speed\n+        //if (me->GetVehicle() && master->GetVehicle() && me->GetVehicleBase()->IsCreature() &&\n+        //    (me->GetVehicleBase()->ToCreature()->GetCreatureTemplate()->InhabitType & INHABIT_AIR) &&\n+        //    me->GetVehicleBase()->GetSpeed(MOVE_FLIGHT) != master->GetVehicleBase()->GetSpeed(MOVE_FLIGHT))\n+        //{\n+        //    me->GetVehicleBase()->SetSpeed(MOVE_FLIGHT, master->GetVehicleBase()->GetSpeedRate(MOVE_FLIGHT) * 1.37f);\n+        //    me->GetVehicleBase()->SetSpeed(MOVE_RUN, master->GetVehicleBase()->GetSpeedRate(MOVE_FLIGHT) * 1.37f);\n+        //}\n+        //Transport state\n+        if (me->GetTransport() != master->GetTransport())\n+        {\n+            if (master->GetTransport())\n+            {\n+                if (me->GetDistance2d(master) < 20.f)\n+                {\n+                    master->GetTransport()->AddPassenger(me, true);\n+                    me->m_movementInfo.transport.pos.Relocate(master->GetTransOffset());\n+                    me->Relocate(GetAbsoluteTransportPosition(master));\n+                    me->AddUnitState(UNIT_STATE_IGNORE_PATHFINDING);\n+                }\n+            }\n+            else\n+            {\n+                me->ClearUnitState(UNIT_STATE_IGNORE_PATHFINDING);\n+                me->GetTransport()->RemovePassenger(me, true);\n+            }\n+        }\n+        //Model size / Combat reach\n+        if (me->GetDisplayId() == me->GetNativeDisplayId())\n+        {\n+            me->SetFloatValue(UNIT_FIELD_BOUNDINGRADIUS, DEFAULT_WORLD_OBJECT_SIZE * me->GetObjectScale());\n+            me->SetFloatValue(UNIT_FIELD_COMBATREACH,  DEFAULT_COMBAT_REACH * me->GetObjectScale());\n+\n+            //debug: restore offhand visual if needed\n+            if (me->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + uint32(BOT_SLOT_OFFHAND)) == 0 && _canUseOffHand())\n+            {\n+                EquipmentInfo const* einfo = BotDataMgr::GetBotEquipmentInfo(me->GetEntry());\n+                if (CanChangeEquip(BOT_SLOT_OFFHAND) && _equips[BOT_SLOT_OFFHAND])\n+                {\n+                    NpcBotTransmogData const* transmogData = BotDataMgr::SelectNpcBotTransmogs(me->GetEntry());\n+                    if (einfo->ItemEntry[BOT_SLOT_OFFHAND] != _equips[BOT_SLOT_OFFHAND]->GetEntry() &&\n+                        transmogData && BotCfg::IsTransmogEnabled() && (transmogData->transmogs[BOT_SLOT_OFFHAND].first == _equips[BOT_SLOT_OFFHAND]->GetEntry() || BotCfg::TransmogUseEquipmentSlots()) &&\n+                        transmogData->transmogs[BOT_SLOT_OFFHAND].second >= 0)\n+                        me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + uint32(BOT_SLOT_OFFHAND), uint32(transmogData->transmogs[BOT_SLOT_OFFHAND].second));\n+                    else\n+                        me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + uint32(BOT_SLOT_OFFHAND), _equips[BOT_SLOT_OFFHAND]->GetEntry());\n+                }\n+                else\n+                {\n+                    me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + uint32(BOT_SLOT_OFFHAND), einfo->ItemEntry[BOT_SLOT_OFFHAND]);\n+                }\n+            }\n+        }\n+        //end DEBUG\n+\n+        //Check if moving through air\n+        //if (me->IsInWorld() && !JumpingFlyingOrFalling() &&\n+        //    !me->HasUnitMovementFlag((MOVEMENTFLAG_ONTRANSPORT)|(MOVEMENTFLAG_DISABLE_GRAVITY)|(MOVEMENTFLAG_ROOT)|(MOVEMENTFLAG_SWIMMING)))\n+        //{\n+        //    //skip case such as moving back up from abyss (movement glitches)\n+        //    float x,y,z;\n+        //    if (!me->GetMotionMaster()->GetDestination(x,y,z) || z < me->GetPositionZ())\n+        //    {\n+        //        float groundz = me->GetMap()->GetHeight(me->GetPhaseMask(), me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), true, MAX_FALL_DISTANCE);\n+        //        if (groundz > INVALID_HEIGHT)\n+        //        {\n+        //            me->GetMotionMaster()->MoveFall();\n+        //        }\n+        //        else if (GetBotCommandState() != BOT_COMMAND_STAY && !me->isMoving())\n+        //        {\n+        //            SetBotCommandState(BOT_COMMAND_ABANDON); //reset movement after\n+        //        }\n+        //    }\n+        //}\n+\n+        //Zone / Area / WMOArea\n+        if (me->IsInWorld())\n+        {\n+            me->SetPositionDataUpdate();\n+\n+            uint32 newzone, newarea;\n+            me->GetZoneAndAreaId(newzone, newarea);\n+\n+            if (_lastZoneId != newzone)\n+                _OnZoneUpdate(newzone, newarea); // also updates area\n+            else// if (_lastAreaId != newarea)\n+                _OnAreaUpdate(newarea);\n+\n+            if (_wmoAreaUpdateTimer <= diff)\n+                _UpdateWMOArea();\n+        }\n+\n+        //Meeting Stone\n+        if (me->IsInWorld() && !IAmFree() && !me->IsInCombat() && !master->IsInCombat() && IsChanneling(master) && !CCed(me) && !IsCasting() && !me->GetVehicle())\n+        {\n+            if (Spell const* curMasterSpell = master->GetCurrentSpell(CURRENT_CHANNELED_SPELL))\n+            {\n+                if (curMasterSpell->m_spellInfo->Id == SUMMONING_STONE_EFFECT)\n+                {\n+                    if (GameObject* portal = master->GetGameObject(SUMMONING_STONE_EFFECT))\n+                    {\n+                        portal->Use(me);\n+                    }\n+                }\n+            }\n+        }\n+\n+        //Gathering\n+        if (me->IsInWorld() && !IAmFree() && HasRole(BOT_ROLE_MASK_GATHERING) && !me->IsInCombat() && !master->IsInCombat() && !master->IsMounted() && !CCed(me) &&\n+            master->GetLootGUID().IsEmpty() && !me->isMoving() && !master->isMoving() && master->IsStandState() && !Feasting() && !IsCasting() && !IsCasting(master) &&\n+            !HasBotCommandState(BOT_COMMAND_MASK_UNMOVING) && !me->GetVehicle())\n+        {\n+            //BOT_LOG_ERROR(\"spells\", \"bot_ai:UpdateEx by %s, found free master, my skills: %u:\", me->GetName().c_str(), uint32(_roleMask & BOT_ROLE_MASK_GATHERING));\n+            std::list<WorldObject*> woList;\n+            NearbyObjectBySkillCheck check(master, INTERACTION_DISTANCE - 1.0f, (_roleMask & BOT_ROLE_MASK_GATHERING));\n+            Bcore::WorldObjectListSearcher<NearbyObjectBySkillCheck> searcher(me, woList, check, GRID_MAP_TYPE_MASK_CREATURE|GRID_MAP_TYPE_MASK_GAMEOBJECT);\n+            Cell::VisitObjects(me, searcher, 20.f);\n+            //me->VisitNearbyObject(20.f, searcher);\n+            //BOT_LOG_ERROR(\"spells\", \"bot_ai:UpdateEx: list is %s\", woList.empty() ? \"empty\" : \"not empty\");\n+            if (!woList.empty())\n+            {\n+                WorldObject* wo = nullptr;\n+                float minangle = float(M_PI);\n+                for (WorldObject* wob : woList)\n+                {\n+                    float angle = me->GetAbsoluteAngle(wob);\n+                    if (me->GetDistance(wob) <= INTERACTION_DISTANCE * 0.5f && angle < minangle)\n+                    {\n+                        minangle = angle;\n+                        wo = wob;\n+                    }\n+                }\n+\n+                wo = wo ? wo : Bcore::Containers::SelectRandomContainerElement(woList);\n+                //BOT_LOG_ERROR(\"spells\", \"bot_ai:UpdateEx: processing %s\", wo->GetName().c_str());\n+                if (me->GetDistance(wo) <= INTERACTION_DISTANCE * 0.5f && me->HasInArc(float(M_PI), wo))\n+                {\n+                    //cosmetic\n+                    //CastSpellExtraArgs args(TRIGGERED_FULL_MASK);\n+                    me->CastSpell(wo->IsCreature() ? wo->ToUnit() : me, SPELL_COMBAT_SPECIAL_2H_ATTACK, true);\n+\n+                    if (wo->IsCreature())\n+                        wo->ToUnit()->SetDynamicFlag(UNIT_DYNFLAG_LOOTABLE);\n+\n+                    master->SendLoot(wo->GetGUID(), LOOT_SKINNING);\n+\n+                    if (wo->IsCreature())\n+                        wo->ToUnit()->RemoveUnitFlag(UNIT_FLAG_SKINNABLE);\n+\n+                    _updateTimerEx1 = urand(1500, 2100);\n+                }\n+                else\n+                {\n+                    std::ostringstream msg;\n+                    std::string name = wo->GetName();\n+                    if (wo->IsCreature())\n+                    {\n+                        _LocalizeCreature(master, name, wo->GetEntry());\n+                        msg << name << \"...\"; // TODO\n+                    }\n+                    else\n+                    {\n+                        _LocalizeGameObject(master, name, wo->GetEntry());\n+                        msg << name << \"!\";\n+                    }\n+                    BotWhisper(msg.view());\n+\n+                    if (me->GetDistance(wo) > INTERACTION_DISTANCE * 0.5f)\n+                    {\n+                        Position pos;\n+                        wo->GetNearPoint(me, pos.m_positionX, pos.m_positionY, pos.m_positionZ, 0.f, CONTACT_DISTANCE, wo->GetAbsoluteAngle(me));\n+                        BotMovement(BOT_MOVE_POINT, &pos, nullptr, false);\n+                        //me->GetMotionMaster()->MovePoint(me->GetMapId(), pos, false);\n+                    }\n+                    else\n+                    {\n+                        me->SetFacingTo(me->GetAbsoluteAngle(wo));\n+                        _updateTimerEx1 = urand(1500, 1800);\n+                    }\n+                }\n+            }\n+        }\n+\n+        //Looting\n+        if (me->IsInWorld() && !IAmFree() && HasRole(BOT_ROLE_AUTOLOOT) && HasRole(BOT_ROLE_MASK_LOOTING) &&\n+            !me->GetVictim() && !master->IsMounted() && !CCed(me) && !Feasting() && !IsCasting() &&\n+            !HasBotCommandState(BOT_COMMAND_MASK_UNMOVING))\n+        {\n+            //BOT_LOG_ERROR(\"scripts\", \"bot_ai Looting by %s, my mask: %u:\", me->GetName().c_str(), uint32(_roleMask & BOT_ROLE_MASK_LOOTING));\n+            std::list<Unit*> crList;\n+            NearbyLootableCreatureCheck check(master, std::min(30.f, std::max(5.f, sWorld->getFloatConfig(CONFIG_GROUP_XP_DISTANCE) - 10.f)));\n+            Bcore::UnitListSearcher<NearbyLootableCreatureCheck> searcher(me, crList, check);\n+            Cell::VisitObjects(me, searcher, 40.f);\n+            //me->VisitNearbyObject(40.f, searcher);\n+            for (std::list<Unit*>::iterator itr = crList.begin(); itr != crList.end();)\n+            {\n+                if (!_canLootCreature((*itr)->ToCreature()))\n+                {\n+                    //BOT_LOG_ERROR(\"scripts\", \"bot_ai Looting: cannot loot %s (%u)\", (*itr)->GetName().c_str(), (*itr)->GetGUIDLow());\n+                    crList.erase(itr++);\n+                    continue;\n+                }\n+                ++itr;\n+            }\n+\n+            if (!crList.empty())\n+            {\n+                Unit* un = Bcore::Containers::SelectRandomContainerElement(crList);\n+\n+                std::ostringstream msg;\n+                std::string name = un->GetName();\n+                _LocalizeCreature(master, name, un->GetEntry());\n+                msg << LocalizedNpcText(master, BOT_TEXT_LOOTING) << ' ' << name;\n+                BotWhisper(msg.view());\n+\n+                _autoLootCreature(un->ToCreature());\n+\n+                if (crList.size() > 1)\n+                    _updateTimerEx1 = urand(400, 600);\n+                /*//BOT_LOG_ERROR(\"scripts\", \"bot_ai Looting: processing %s\", un->GetName().c_str());\n+                if (me->GetDistance(un) < INTERACTION_DISTANCE + 2.f)\n+                {\n+                    //BOT_LOG_ERROR(\"scripts\", \"bot_ai Looting: looting %s\", un->GetName().c_str());\n+                    _autoLootCreature(un->ToCreature());\n+                    _updateTimerEx1 = urand(500, 1000);\n+                }\n+                else\n+                {\n+                    //BOT_LOG_ERROR(\"scripts\", \"bot_ai Looting: moving towards %s\", un->GetName().c_str());\n+                    Position pos;\n+                    un->GetNearPoint(me, pos.m_positionX, pos.m_positionY, pos.m_positionZ, 0.f, CONTACT_DISTANCE, un->GetAbsoluteAngle(me));\n+                    me->GetMotionMaster()->MovePoint(me->GetMapId(), pos, false);\n+                }*/\n+            }\n+        }\n+    }\n+\n+    if (!IsTempBot())\n+        Regenerate();\n+\n+    //update flags\n+    if (!me->IsInCombat() && ((!_evadeMode && _atHome) || IsWanderer()))\n+    {\n+        if (!me->HasNpcFlag(UNIT_NPC_FLAG_GOSSIP) && !HasBotCommandState(BOT_COMMAND_NOGOSSIP))\n+            me->SetNpcFlag(UNIT_NPC_FLAG_GOSSIP);\n+        if (me->HasUnitFlag(UNIT_FLAG_PET_IN_COMBAT))\n+            me->RemoveUnitFlag(UNIT_FLAG_PET_IN_COMBAT);\n+    }\n+\n+    if (!me->GetVictim())\n+        Evade();\n+\n+    if (HasBotCommandState(BOT_COMMAND_FULLSTOP))\n+        return false;\n+\n+    if (!IsTempBot())\n+        _updateRations(); //safe\n+\n+    if (checkAurasTimer <= lastdiff)\n+    {\n+        checkAurasTimer += uint32(_rand + _rand + (IAmFree() ? 1000 : 40 * (1 + master->GetNpcBotsCount())));\n+\n+        //group demand\n+        if (!IAmFree() && HasRole(BOT_ROLE_PARTY) && (!master->GetGroup() || !master->GetGroup()->IsMember(me->GetGUID())))\n+        {\n+            //BOT_LOG_ERROR(\"entities.player\", \"CheckAuras(): adding %s to group\", me->GetName().c_str());\n+            master->GetBotMgr()->AddBotToGroup(me);\n+        }\n+\n+        Unit* mover = me->GetVehicle() ? me->GetVehicleBase() : me;\n+        if (!HasBotCommandState(BOT_COMMAND_MASK_UNCHASE) && !CCed(mover, true) &&\n+            (IAmFree() || master->GetBotMgr()->GetBotAllowCombatPositioning()) &&\n+            (!mover->isMoving() || Rand() < 50) && !IsCasting(mover) && !IsShootingWand(mover))\n+        {\n+            if (Unit* victim = CanBotAttackOnVehicle() ? me->GetVictim() : mover->GetTarget() ? ObjectAccessor::GetUnit(*mover, mover->GetTarget()) : nullptr)\n+            {\n+                if (IAmFree())\n+                    CalculateAoeSpots(me, _aoeSpots);\n+\n+                //BOT_LOG_ERROR(\"scripts\", \"GetInPos prepare by %s\", me->GetName().c_str());\n+                if (!IAmFree() && master->GetBotMgr()->GetBotAttackRangeMode() == BOT_ATTACK_RANGE_EXACT &&\n+                    master->GetBotMgr()->GetBotExactAttackRange() == 0 && !GetVehicleAttackDistanceOverride() &&\n+                    !(!IAmFree() && !GetAoeSpots().empty()))\n+                {\n+                    GetInPosition(true, victim);\n+                }\n+                else if (!HasRole(BOT_ROLE_RANGED) && !HasVehicleRoleOverride(BOT_ROLE_RANGED) &&\n+                    !(!IAmFree() && !GetAoeSpots().empty()))\n+                {\n+                    if (me->GetDistance(victim) > 1.5f)\n+                        GetInPosition(true, victim);\n+                }\n+                else\n+                {\n+                    //BOT_LOG_ERROR(\"scripts\", \"%s calculates attack pos to attack %s\", me->GetName().c_str(), victim->GetName().c_str());\n+                    bool force = false;\n+                    CalculateAttackPos(victim, attackpos, force);\n+                    if (mover->GetExactDist2d(&attackpos) > (force ? 0.1f : 4.f) || (force && IsWanderer()))\n+                    {\n+                        //BOT_LOG_ERROR(\"scripts\", \"%s moving to x %.2f y %.2f z %.2f to attack %s\",\n+                        //    me->GetName().c_str(), attackpos.m_positionX, attackpos.m_positionY, attackpos.m_positionZ, victim->GetName().c_str());\n+                        GetInPosition(true, victim, &attackpos);\n+                    }\n+                }\n+            }\n+        }\n+        if (shouldUpdateStats && me->GetPhaseMask() == master->GetPhaseMask())\n+            SetStats(false);\n+        else if (_powersTimer <= lastdiff && !IsTempBot())\n+        {\n+            _powersTimer += REGEN_CD; //do not mistake for regen, this is only for updating max health/mana\n+            UpdateHealth();\n+            UpdateMana();\n+        }\n+    }\n+\n+    if (Wait())\n+        return false;\n+\n+    GenerateRand();\n+\n+    if (CanBotAttackOnVehicle())\n+        BreakCC(diff);\n+\n+    if (!me->GetVehicle() && CCed(me))\n+        return false;\n+\n+    //opponent unsafe\n+    if ((IsWanderer() || (!IAmFree() && (!_lastTargetGuid || !master->GetBotMgr()->GetBotAllowCombatPositioning()))) &&\n+        !HasBotCommandState(BOT_COMMAND_STAY) &&\n+        (!me->GetVehicle() || (!CCed(me->GetVehicleBase(), true) && !me->GetVehicleBase()->GetTarget())))\n+    {\n+        Unit const* mover = me->GetVehicle() ? me->GetVehicleBase() : me;\n+\n+        if (!master->IsAlive())\n+        {\n+            //If ghost move to corpse, else move to dead player\n+            if (master->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_GHOST))\n+            {\n+                Corpse const* corpse = master->GetCorpse();\n+                if (corpse && me->GetMap() == corpse->FindMap() && !me->IsInCombat() && !me->HasUnitState(UNIT_STATE_MOVING) &&\n+                    !IsCasting() && !IsShootingWand() && me->GetDistance(corpse) > 5)\n+                    BotMovement(BOT_MOVE_POINT, corpse);\n+                    //me->GetMotionMaster()->MovePoint(corpse->GetMapId(), *corpse);\n+            }\n+            else\n+            {\n+                if (!HasBotCommandState(BOT_COMMAND_FOLLOW) || me->GetDistance(master) > 30 - 20 * (!me->IsWithinLOSInMap(master)))\n+                    SetBotCommandState(BOT_COMMAND_FOLLOW, true);\n+            }\n+        }\n+        else if (!IsCasting(mover) && (!IsShootingWand(mover) || Rand() < 10))\n+        {\n+            Unit const* mmover = !IAmFree() ? master : nullptr;\n+            if (!mmover && me->GetMap()->IsBattleground() && GetBG())\n+            {\n+                Battleground* bg = GetBG();\n+                ObjectGuid flag_guid = ObjectGuid::Empty;\n+                if (!me->HasInvisibilityAura() && !me->HasStealthAura() && !me->HasAuraTypeWithMiscvalue(SPELL_AURA_FORCE_REACTION, 1059))\n+                {\n+                    switch (bg->GetBgTypeID())\n+                    {\n+                        case BATTLEGROUND_WS:\n+                            flag_guid = dynamic_cast<BattlegroundWS*>(bg)->GetDroppedFlagGUID(bg->GetBotTeamId(me->GetGUID()));\n+                            if (!flag_guid)\n+                                flag_guid = dynamic_cast<BattlegroundWS*>(bg)->GetDroppedFlagGUID(bg->GetOtherTeamId(bg->GetBotTeamId(me->GetGUID())));\n+                            break;\n+                        case BATTLEGROUND_EY:\n+                            flag_guid = dynamic_cast<BattlegroundEY*>(bg)->GetDroppedFlagGUID();\n+                            break;\n+                        default:\n+                            break;\n+                    }\n+                }\n+                if (GameObject* go = flag_guid ? bg->GetBgMap()->GetGameObject(flag_guid) : nullptr)\n+                {\n+                    float fdist = me->GetDistance(go);\n+                    if (fdist < 30.f)\n+                    {\n+                        if (fdist < INTERACTION_DISTANCE * 0.5f)\n+                        {\n+                            if (me->IsMounted())\n+                                DismountBot();\n+                            go->Use(me);\n+                        }\n+                        else\n+                        {\n+                            BotMovement(BOT_MOVE_POINT, go);\n+                            mmover = nullptr;\n+                        }\n+                    }\n+                }\n+                else if (!IsFlagCarrier(me))\n+                {\n+                    //GET BG FOLLOW UNIT\n+                    if (bg->GetBgTypeID() == BATTLEGROUND_WS)\n+                    {\n+                        static const std::function<bool(Unit const*)> flag_carrier_pred = [](Unit const* u) { return bot_ai::IsFlagCarrier(u); };\n+                        Unit* nmover = nullptr;\n+                        Bcore::UnitSearcher searcher(me, nmover, flag_carrier_pred);\n+                        Cell::VisitObjects(me, searcher, 80.0f);\n+                        if (nmover)\n+                            mmover = nmover;\n+                    }\n+                }\n+            }\n+\n+            if (mmover)\n+            {\n+                float speed = 0.0f;\n+                _calculatePos(mmover, movepos, &speed);\n+                float maxdist = std::max<float>((mmover->IsPlayer() ? float(mmover->ToPlayer()->GetBotMgr()->GetBotFollowDist()) : BotMgr::GetBotFollowDistMax() / 2.f) *\n+                    ((mmover->m_movementInfo.GetMovementFlags() & MOVEMENTFLAG_FORWARD) ? 0.125f : mmover->isMoving() ? 0.03125f : 0.25f), 3.f);\n+                Position destPos;\n+                if (me->isMoving())\n+                    me->GetMotionMaster()->GetDestination(destPos.m_positionX, destPos.m_positionY, destPos.m_positionZ);\n+                else\n+                    destPos = me->GetPosition();\n+\n+                if (!HasBotCommandState(BOT_COMMAND_FOLLOW) || destPos.GetExactDist(&movepos) > maxdist)\n+                    SetBotCommandState(BOT_COMMAND_FOLLOW, true, &movepos, &speed);\n+            }\n+            else\n+                RemoveBotCommandState(BOT_COMMAND_FOLLOW);\n+        }\n+    }\n+\n+    if (!IsCasting() && !IsShootingWand())\n+    {\n+        if ((me->IsInCombat() && !me->IsSitState() && CanBotAttackOnVehicle()) || !CanSheath())\n+        {\n+            if (_botclass == BOT_CLASS_HUNTER || _botclass == BOT_CLASS_DARK_RANGER || _botclass == BOT_CLASS_SEA_WITCH)\n+            {\n+                if (me->GetSheath() != SHEATH_STATE_RANGED)\n+                    me->SetSheath(SHEATH_STATE_RANGED);\n+            }\n+            else\n+            {\n+                //classes which don't display weapons\n+                if (_botclass == BOT_CLASS_DREADLORD || _botclass == BOT_CLASS_SPELLBREAKER || _botclass == BOT_CLASS_CRYPT_LORD)\n+                {\n+                    if (me->GetSheath() != SHEATH_STATE_UNARMED)\n+                        me->SetSheath(SHEATH_STATE_UNARMED);\n+                }\n+                else if (me->GetSheath() != SHEATH_STATE_MELEE)\n+                    me->SetSheath(SHEATH_STATE_MELEE);\n+            }\n+        }\n+        else if (me->IsStandState() && me->GetSheath() != SHEATH_STATE_UNARMED && Rand() < 50)\n+        {\n+            if (me->GetSheath() == SHEATH_STATE_RANGED)\n+                me->SetSheath(SHEATH_STATE_MELEE);\n+            else\n+                me->SetSheath(SHEATH_STATE_UNARMED);\n+        }\n+    }\n+\n+    _updateMountedState();\n+    _updateStandState();\n+\n+    if (HasBotCommandState(BOT_COMMAND_INACTION))\n+        return false;\n+\n+    return true;\n+}\n+\n+void bot_ai::CommonTimers(uint32 diff)\n+{\n+    Events.Update(diff);\n+    SpellTimers(diff);\n+\n+    if (GC_Timer > diff)            GC_Timer -= diff;\n+    if (checkAurasTimer > diff)     checkAurasTimer -= diff;\n+    if (waitTimer > diff)           waitTimer -= diff;\n+    if (_moveBehindTimer > diff)    _moveBehindTimer -= diff;\n+    if (itemsAutouseTimer > diff)   itemsAutouseTimer -= diff;\n+    if (evadeDelayTimer > diff)     evadeDelayTimer -= diff;\n+    if (roleTimer > diff)           roleTimer -= diff;\n+    if (ordersTimer > diff)         ordersTimer -= diff;\n+    if (_checkMasterTimer > diff)    _checkMasterTimer -= diff;\n+    if (_checkOwershipTimer > diff) _checkOwershipTimer -= diff;\n+\n+    if (_powersTimer > diff)        _powersTimer -= diff;\n+    if (_chaseTimer > diff)         _chaseTimer -= diff;\n+    if (_engageTimer > diff)        _engageTimer -= diff;\n+\n+    if (_potionTimer > diff && (_potionTimer < POTION_CD || !me->IsInCombat())) _potionTimer -= diff;\n+\n+    if (IAmFree())\n+        UpdateReviveTimer(diff);\n+    else\n+    {\n+        if (BotCfg::GetNpcBotCostRent(me->GetLevel(), GetBotClass()) && me->IsInWorld() && !HasBotCommandState(BOT_COMMAND_UNBIND))\n+            _rentTimer += diff;\n+    }\n+\n+    if (me->IsInWorld())\n+    {\n+        if (_wmoAreaUpdateTimer > diff) _wmoAreaUpdateTimer -= diff;\n+\n+        if (me->IsOutdoors())\n+        {\n+            outdoorsTimer += diff;\n+            if (indoorsTimer)\n+                indoorsTimer = 0;\n+        }\n+        else\n+        {\n+            indoorsTimer += diff;\n+            if (outdoorsTimer)\n+                outdoorsTimer = 0;\n+        }\n+    }\n+\n+    if (_contestedPvPTimer > diff)  _contestedPvPTimer -= diff;\n+\n+    if (_groupUpdateTimer > diff)   _groupUpdateTimer -= diff;\n+    else if (_groupUpdateTimer)     _groupUpdateTimer = 0;\n+\n+    if (_updateTimerMedium > diff)  _updateTimerMedium -= diff;\n+    if (_updateTimerLong > diff)    _updateTimerLong -= diff;\n+    if (_updateTimerEx1 > diff)     _updateTimerEx1 -= diff;\n+    if (_updateTimerEx2 > diff)     _updateTimerEx2 -= diff;\n+\n+    if (_saveDisabledSpellsTimer > diff) _saveDisabledSpellsTimer -= diff;\n+    if (_saveMiscValuesTimer > diff)     _saveMiscValuesTimer -= diff;\n+}\n+\n+void bot_ai::UpdateReviveTimer(uint32 diff)\n+{\n+    if (me->IsAlive())\n+        return;\n+\n+    if (_reviveTimer > diff)        _reviveTimer -= diff;\n+    else\n+    {\n+        if (IAmFree())\n+        {\n+            BotMgr::ReviveBot(me);\n+\n+            if (IsWanderer())\n+            {\n+                outdoorsTimer = 0;\n+                if (me->GetMap()->GetEntry()->IsContinent() || me->GetMap()->IsBattleground())\n+                {\n+                    Position safePos(*me);\n+                    WanderNode const* nextNode = GetNextTravelNode(&safePos, true);\n+                    if (!nextNode)\n+                    {\n+                        BOT_LOG_FATAL(\"scripts\", \"Bot {} ({}) is unable to get next travel node (1)! cur {}, last {}, position: {}. BOT WAS DISABLED\",\n+                            me->GetName().c_str(), me->GetEntry(), _travel_node_cur->GetWPId(), _travel_node_last ? _travel_node_last->GetWPId() : 0, me->GetPosition().ToString().c_str());\n+                        canUpdate = false;\n+                        return;\n+                    }\n+\n+                    homepos.Relocate(nextNode);\n+                    if (me->GetMap()->GetEntry()->IsContinent())\n+                        BotMgr::TeleportBot(me, sMapMgr->CreateBaseMap(nextNode->GetMapId()), nextNode, true);\n+\n+                    BOT_LOG_TRACE(\"npcbots\", \"Bot {} id {} class {} level {} died on the way from node {} to {} ('{}'), NEW {} ('{}'), {}, dist {} yd!\",\n+                        me->GetName().c_str(), me->GetEntry(), uint32(_botclass), uint32(me->GetLevel()), _travel_node_last ? _travel_node_last->GetWPId() : 0, _travel_node_cur->GetWPId(),\n+                        _travel_node_cur->GetName().c_str(), nextNode->GetWPId(), nextNode->GetName().c_str(), homepos.ToString().c_str(), safePos.GetExactDist(homepos));\n+\n+                    _travel_node_last = _travel_node_cur;\n+                    _travel_node_cur = nextNode;\n+                    return;\n+                }\n+            }\n+        }\n+        else\n+            if (_reviveTimer > 0)   _reviveTimer = 0;\n+    }\n+}\n+\n+void bot_ai::Evade()\n+{\n+    if (_atHome && !_evadeMode)\n+        return;\n+    if (evadeDelayTimer > lastdiff)\n+        return;\n+    if (me->GetVictim())\n+        return;\n+    if (IAmFree() && HasBotCommandState(BOT_COMMAND_FOLLOW))\n+        return;\n+    if (IsWanderer() && Feasting())\n+        return;\n+    if (JumpingOrFalling())\n+        return;\n+    if (IsCasting())\n+        return;\n+    if (CCed(me, true))\n+        return;\n+\n+    if (!IAmFree() || IsTempBot())\n+    {\n+        _atHome = true;\n+        _evadeMode = false;\n+        return;\n+    }\n+\n+    if (HasBotCommandState(BOT_COMMAND_MASK_UNMOVING))\n+        return;\n+\n+    //delay evade\n+    if (evadeDelayTimer == 0 && me->GetMap()->GetEntry()->IsContinent())\n+    {\n+        evadeDelayTimer = 5000;\n+        return;\n+    }\n+\n+    uint16 mapid;\n+    Position pos;\n+    GetHomePosition(mapid, &pos);\n+\n+    float dist = me->GetExactDist2d(pos);\n+\n+    if (IsWanderer())\n+    {\n+        if (mapid != me->GetMap()->GetId() || _evadeCount >= 50 || me->GetExactDist2d(pos) > MAX_WANDER_NODE_DISTANCE ||\n+            me->GetPositionZ() <= INVALID_HEIGHT || (me->GetExactDist2d(pos) < 20.0f && me->GetExactDist(pos) > 100.0f))\n+        {\n+            BOT_LOG_DEBUG(\"npcbots\", \"Bot {} id {} class {} level {} map {} TELEPORTING to node {} ('{}') map {}, {}, dist {} yd!\",\n+                me->GetName().c_str(), me->GetEntry(), uint32(_botclass), uint32(me->GetLevel()), me->GetMapId(), _travel_node_cur->GetWPId(),\n+                _travel_node_cur->GetName().c_str(), uint32(mapid), pos.ToString().c_str(), me->GetExactDist(pos));\n+\n+            evadeDelayTimer = 12000;\n+            me->CastSpell(me, WANDERER_HEARTHSTONE);\n+            return;\n+        }\n+    }\n+    else if (mapid != me->GetMapId() || _evadeCount >= 10 || me->GetDistance(pos) > float(SIZE_OF_GRIDS * 0.5f) || !CanAppearInWorld())\n+    {\n+        if (!teleHomeEvent || !teleHomeEvent->IsActive())\n+        {\n+            teleHomeEvent = new TeleportHomeEvent(this, false);\n+            Events.AddEvent(teleHomeEvent, Events.CalculateTime(5000));\n+\n+            //if bot has been removed manually and while in dungeon\n+            if (mapid != me->GetMapId())\n+            {\n+                teleHomeEvent->ScheduleAbort();\n+                teleHomeEvent->Execute(0,0);\n+            }\n+        }\n+        return;\n+    }\n+\n+    if (botPet && !me->IsWithinDist2d(botPet, 20.0f))\n+        return;\n+\n+    if (!IsWanderer())\n+        _atHome = true;\n+    else if (!me->IsInCombat() && me->GetMap()->GetEntry()->IsContinent() && GetHealthPCT(me) < 90)\n+        return;\n+\n+    if (dist > 1.5f || IsWanderer())\n+    {\n+        _evadeMode = true;\n+\n+        if (!me->isMoving())\n+        {\n+            ++_evadeCount;\n+\n+            if (dist > (me->GetMap()->GetEntry()->IsContinent() ? 15.0f : INTERACTION_DISTANCE))\n+            {\n+                if (_travel_node_last && _travel_node_last->HasFlag(BotWPFlags::BOTWP_FLAG_MOVEMENT_FORCE_JUMP_BEGIN) &&\n+                    _travel_node_cur && _travel_node_cur->HasFlag(BotWPFlags::BOTWP_FLAG_MOVEMENT_FORCE_JUMP_END) &&\n+                    me->GetDistance(*_travel_node_last) < 10.0f)\n+                {\n+                    //BOT_LOG_DEBUG(\"npcbots\", \"Bot wanderer {} id {} JUMPS from node {} to {} ('{}' -> '{}'), dist2d {} yd, zdiff {} yd!\",\n+                    //    me->GetName(), me->GetEntry(), _travel_node_last->GetWPId(), _travel_node_cur->GetWPId(), _travel_node_last->GetName(), _travel_node_cur->GetName(),\n+                    //    _travel_node_last->GetExactDist2d(_travel_node_cur), _travel_node_last->GetPositionZ() - _travel_node_cur->GetPositionZ());\n+                    BotMovement(BOT_MOVE_JUMP, &pos, nullptr, false);\n+                }\n+                else\n+                {\n+                    bool use_path =\n+                        !(_travel_node_cur && _travel_node_last &&\n+                            _travel_node_cur->HasFlag(BotWPFlags::BOTWP_FLAG_MOVEMENT_IGNORES_PATHING) &&\n+                            _travel_node_last->HasFlag(BotWPFlags::BOTWP_FLAG_MOVEMENT_IGNORES_PATHING));\n+                    GetNextEvadeMovePoint(pos, use_path);\n+                    if (pos.m_positionZ <= INVALID_HEIGHT)\n+                    {\n+                        BOT_LOG_ERROR(\"npcbots\", \"Bot {} '{}' class {} level {} evade move point has invalid height {} (usepath: {})!\\nWPs: cur {}, last {}\\nPositions:\\ncurrent: {}\\ntarget: {}\",\n+                            me->GetEntry(), me->GetName(), uint32(_botclass), uint32(me->GetLevel()), pos.m_positionZ, uint32(use_path),\n+                            _travel_node_cur->GetWPId(), _travel_node_last ? _travel_node_last->GetWPId() : 0, me->GetPosition().ToString(), pos.ToString());\n+                        _evadeCount = 100;\n+                        return;\n+                    }\n+\n+                    //if (TempSummon* wpc = me->GetMap()->SummonCreature(VISUAL_WAYPOINT, pos, nullptr, 20000))\n+                    //    wpc->SetTempSummonType(TEMPSUMMON_TIMED_DESPAWN);\n+\n+                    movepos.Relocate(me);\n+                    BotMovement(BOT_MOVE_POINT, &pos, nullptr, use_path);\n+                }\n+                return;\n+            }\n+            else if (IsWanderer())\n+            {\n+                OnWanderNodeReached();\n+\n+                WanderNode const* nextNode = GetNextTravelNode(&pos, false);\n+                if (!nextNode)\n+                {\n+                    BOT_LOG_FATAL(\"npcbots\", \"Bot {} ({}) is unable to get next travel node! cur {}, last {}, position: {}. BOT WAS DISABLED\",\n+                        me->GetName().c_str(), me->GetEntry(), _travel_node_cur->GetWPId(), _travel_node_last ? _travel_node_last->GetWPId() : 0, me->GetPosition().ToString().c_str());\n+                    canUpdate = false;\n+                    return;\n+                }\n+\n+                if (nextNode == _travel_node_cur)\n+                {\n+                    //same node: mill about\n+                    float cangle = Position::NormalizeOrientation(me->GetRelativeAngle(nextNode) + frand(float(-M_PI_2), float(M_PI_2)));\n+                    float cdist = nextNode->HasFlag(BotWPFlags::BOTWP_FLAG_INTERACTION_MILL_RADIUS) ? frand(INTERACTION_DISTANCE * 0.25f, INTERACTION_DISTANCE) : frand(8.0f, 15.0f);\n+                    Position cnpos = me->GetFirstCollisionPosition(cdist, cangle);\n+                    homepos.Relocate(cnpos);\n+                    evadeDelayTimer = urand(4000, 6000);\n+                }\n+                else\n+                {\n+                    float x = nextNode->GetPositionX();\n+                    float y = nextNode->GetPositionY();\n+                    float z = nextNode->GetPositionZ();\n+                    float o = nextNode->GetOrientation();\n+                    if (nextNode->GetProximity() > 0.5f)\n+                    {\n+                        float angle = frand(0.f, float(M_PI) * 2.f);\n+                        float pdist = frand(0.f, nextNode->GetProximity());\n+                        x = x + pdist * std::cos(angle);\n+                        y = y + pdist * std::sin(angle);\n+                        float ground = z;\n+                        me->UpdateGroundPositionZ(x, y, ground);\n+                        if (ground > INVALID_HEIGHT)\n+                            z = ground;\n+                        else\n+                            z += 2.f;\n+                    }\n+                    homepos.Relocate(x, y, z, o);\n+                    if (me->GetMap()->GetEntry()->IsContinent())\n+                        evadeDelayTimer = urand(_travel_node_cur->GetWaitTime().first, _travel_node_cur->GetWaitTime().second);\n+                    else\n+                    {\n+                        if (_travel_node_cur->HasFlag(BotWPFlags::BOTWP_FLAG_OPTIONAL_PICKUP) && !IsCasting())\n+                            evadeDelayTimer = 1000;\n+                        else\n+                            evadeDelayTimer = 0;\n+                        waitTimer = std::min<uint32>(waitTimer, evadeDelayTimer);\n+                    }\n+                }\n+\n+                BOT_LOG_TRACE(\"npcbots\", \"Bot {} id {} class {} level {} wandered from node {} to {}, next {} ('{}'), {}, dist {} yd!\",\n+                    me->GetName().c_str(), me->GetEntry(), uint32(_botclass), uint32(me->GetLevel()), _travel_node_last ? _travel_node_last->GetWPId() : 0, _travel_node_cur->GetWPId(),\n+                    nextNode->GetWPId(), nextNode->GetName().c_str(), homepos.ToString().c_str(), pos.GetExactDist(homepos));\n+\n+                _travel_node_last = _travel_node_cur;\n+                _travel_node_cur = nextNode;\n+                _evadeCount = 0;\n+                return;\n+            }\n+\n+            movepos.Relocate(me);\n+            BotMovement(BOT_MOVE_POINT, &pos);\n+        }\n+\n+        return;\n+    }\n+\n+    if (me->isMoving())\n+        return;\n+\n+    _evadeMode = false;\n+    _evadeCount = 0;\n+    evadeDelayTimer = 0;\n+\n+    me->SetFacingTo(pos.GetOrientation());\n+    me->SetFaction(me->GetCreatureTemplate()->faction);\n+}\n+void bot_ai::GetNextEvadeMovePoint(Position& pos, bool& use_path) const\n+{\n+    //const uint8 evade_jump_threshold = me->HasUnitMovementFlag(MOVEMENTFLAG_SWIMMING) ? 50 : 25;\n+    const float base_angle = me->GetRelativeAngle(&pos);\n+    const float orig_z = pos.m_positionZ;\n+    float ground, floor;\n+\n+    float fulldist = std::min<float>(me->GetExactDist2d(pos), float((MAX_POINT_PATH_LENGTH - 1) * SMOOTH_PATH_STEP_SIZE - 2.0f));\n+    PathGenerator path(me);\n+    while (path.GetPathType() == PATHFIND_BLANK || (path.GetPathType() & (PATHFIND_NOPATH | PATHFIND_SHORTCUT | PATHFIND_SHORT)))\n+    {\n+        if (std::fabs(fulldist - me->GetExactDist2d(pos)) > 15.0f)\n+        {\n+            pos.Relocate(me->m_positionX, me->m_positionY, me->m_positionZ);\n+            pos.m_positionX += fulldist * std::cos(me->ToAbsoluteAngle(base_angle));\n+            pos.m_positionY += fulldist * std::sin(me->ToAbsoluteAngle(base_angle));\n+\n+            Bcore::NormalizeMapCoord(pos.m_positionX);\n+            Bcore::NormalizeMapCoord(pos.m_positionY);\n+            ground = me->GetMapHeight(pos.m_positionX, pos.m_positionY, MAX_HEIGHT, true, MAX_FALL_DISTANCE);\n+            floor = me->GetMapHeight(pos.m_positionX, pos.m_positionY, pos.m_positionZ);\n+            pos.m_positionZ = std::fabs(ground - pos.m_positionZ) <= std::fabs(floor - pos.m_positionZ) ? ground : floor;\n+            if (pos.m_positionZ <= INVALID_HEIGHT)\n+            {\n+                me->UpdateGroundPositionZ(pos.m_positionX, pos.m_positionY, pos.m_positionZ);\n+                if (pos.m_positionZ <= INVALID_HEIGHT)\n+                    pos.m_positionZ = orig_z;\n+            }\n+        }\n+\n+        path.CalculatePath(pos.m_positionX, pos.m_positionY, pos.m_positionZ);\n+        if (path.GetPathType() == PATHFIND_BLANK ||\n+            (path.GetPathType() == PATHFIND_INCOMPLETE && path.GetPath().size() > 2) ||\n+            (path.GetPathType() & (PATHFIND_NORMAL | PATHFIND_NOT_USING_PATH | PATHFIND_FARFROMPOLY_START)))\n+            break;\n+\n+        fulldist *= 0.72f;\n+\n+        if (fulldist < 25.0f)\n+            break;\n+    }\n+\n+    if ((path.GetPathType() & (PATHFIND_NORMAL | PATHFIND_NOT_USING_PATH)) == (PATHFIND_NORMAL | PATHFIND_NOT_USING_PATH) &&\n+        path.GetPath().size() > 4)\n+        return;\n+\n+    if (me->IsInWater())\n+        BOT_LOG_TRACE(\"npcbots\", \"Bot {} id {} class {} level {} is pathing from water!\", me->GetName().c_str(), me->GetEntry(), uint32(_botclass), uint32(me->GetLevel()));\n+\n+    switch (path.GetPathType())\n+    {\n+        case PATHFIND_NOT_USING_PATH: //swimming\n+        case PATHFIND_NORMAL: //found path\n+            if (me->GetExactDist(path.GetEndPosition().x, path.GetEndPosition().y, path.GetEndPosition().z) > 15.0f)\n+                path.ShortenPathUntilDist(path.GetEndPosition(), frand(7.5f, 15.0f));\n+            return;\n+        case PATHFIND_BLANK: // invalid coords\n+        case PATHFIND_NOPATH:\n+        case PATHFIND_SHORTCUT:\n+        case PATHFIND_SHORT:\n+        case PATHFIND_INCOMPLETE:\n+        case PATHFIND_FARFROMPOLY: // invalid coords\n+        case PATHFIND_FARFROMPOLY_START: //invalid start coords\n+        case PATHFIND_FARFROMPOLY_END: //invalid end coords\n+            if (path.GetPath().size() > 4)\n+            {\n+                path.ShortenPathUntilDist(path.GetEndPosition(), frand(5.0f, 15.0f));\n+                return;\n+            }\n+            if (use_path)\n+            {\n+                //log error and use direct point movement\n+                BOT_LOG_DEBUG(\"npcbots\", \"Bot {} id {} class {} level {} can't find full path to node {} (res {}) from pos {}, falling back to default PF!\",\n+                    me->GetName().c_str(), me->GetEntry(), uint32(_botclass), uint32(me->GetLevel()), IsWanderer() ? _travel_node_cur->GetWPId() : 0, uint32(path.GetPathType()),\n+                    me->GetPosition().ToString().c_str());\n+            }\n+            break;\n+        default:\n+            break;\n+    }\n+\n+    use_path = false;\n+\n+    // No path: proceed to destination in small steps, maybe it's just a fluke... Move to surface if needed\n+    Position mypos = me->GetPosition();\n+    float movedist = std::min<float>(fulldist * 0.25f, 15.0f);\n+    mypos.m_positionX += movedist * std::cos(me->ToAbsoluteAngle(base_angle));\n+    mypos.m_positionY += movedist * std::sin(me->ToAbsoluteAngle(base_angle));\n+    Bcore::NormalizeMapCoord(mypos.m_positionX);\n+    Bcore::NormalizeMapCoord(mypos.m_positionY);\n+\n+    ground = me->GetMapHeight(mypos.m_positionX, mypos.m_positionY, MAX_HEIGHT, true, MAX_FALL_DISTANCE);\n+    floor = me->GetMapHeight(mypos.m_positionX, mypos.m_positionY, mypos.m_positionZ);\n+    mypos.m_positionZ = std::fabs(ground - mypos.m_positionZ) <= std::fabs(floor - mypos.m_positionZ) ? ground : floor;\n+    LiquidData ldata = me->GetMap()->GetLiquidData(\n+        me->GetPhaseMask(), mypos.m_positionX, mypos.m_positionY, mypos.m_positionZ, me->GetCollisionHeight(), MAP_ALL_LIQUIDS);\n+    LiquidStatus lstatus = ldata.Status;\n+    if (me->IsInWater() != !!(lstatus & MAP_LIQUID_STATUS_IN_CONTACT))\n+        mypos.m_positionZ = std::max<float>(ldata.Level, mypos.m_positionZ);\n+    if (mypos.m_positionZ <= INVALID_HEIGHT)\n+        mypos.m_positionZ = orig_z;\n+    pos.Relocate(mypos);\n+}\n+bool bot_ai::CanAppearInWorld() const\n+{\n+    return _canAppearInWorld;\n+}\n+void bot_ai::TeleportHomeStart(bool reset)\n+{\n+    AbortTeleport();\n+\n+    //if no master - will teleport to spawn position\n+    //otherwise - will teleport to master\n+    teleHomeEvent = new TeleportHomeEvent(this, reset);\n+    Events.AddEvent(teleHomeEvent, Events.CalculateTime(0)); //make sure event will be deleted\n+    if (teleHomeEvent->IsActive())\n+        teleHomeEvent->ScheduleAbort(); //make sure event will not be executed twice\n+    teleHomeEvent->Execute(0,0);\n+}\n+//TeleportHome() ONLY CALLED THROUGH EVENTPROCESSOR\n+void bot_ai::TeleportHome(bool reset)\n+{\n+    ASSERT(teleHomeEvent);\n+\n+    AbortTeleport();\n+\n+    uint16 mapid;\n+    Position pos;\n+    GetHomePosition(mapid, &pos);\n+\n+    Map* map = sMapMgr->CreateBaseMap(mapid);\n+    BotMgr::TeleportBot(me, map, &pos, false, reset, this);\n+\n+    spawned = false;\n+    _evadeCount = 0;\n+}\n+//FinishTeleport(uint32, float, float, float, float) ONLY CALLED THROUGH EVENTPROCESSOR\n+bool bot_ai::FinishTeleport(bool reset)\n+{\n+    ASSERT(teleFinishEvent);\n+    ASSERT(!me->IsInWorld());\n+\n+    AbortTeleport();\n+\n+    //1) Cannot teleport: master disappeared - return home\n+    if (IAmFree()/* || master->GetSession()->isLogingOut()*/)\n+    {\n+        uint16 mapid = uint16(me->GetMapId());\n+        Position pos;\n+        if (BotCfg::HideBotSpawns() && !CanAppearInWorld())\n+            GetHomePosition(mapid, &pos);\n+        if (BotCfg::HideBotSpawns() && !CanAppearInWorld() && me->GetMapId() == mapid && me->GetExactDist2d(pos) < 10.0f)\n+        {\n+            AbortTeleport();\n+            TeleportFinishEvent* delayedTeleportEvent = new TeleportFinishEvent(this, reset);\n+            Events.AddEvent(delayedTeleportEvent, Events.CalculateTime(urand(5000, 8000)));\n+            SetTeleportFinishEvent(delayedTeleportEvent);\n+        }\n+        else\n+            TeleportHomeStart(!BotCfg::HideBotSpawns());\n+\n+        _evadeMode = false;\n+        return false;\n+    }\n+\n+    BotLogger::Log(NPCBOT_LOG_TELEPORT_FINISH, me, me->IsInGrid(), me->IsWandererBot(), CanAppearInWorld());\n+\n+    BotMgr::AddDelayedTeleportCallback([this, reset]() {\n+        Map* map = master->FindMap();\n+        //2) Cannot teleport: map not found or forbidden - delay teleport\n+        if (!map || !master->IsAlive() || master->GetBotMgr()->RestrictBots(me, true))\n+        {\n+            //ChatHandler ch(master->GetSession());\n+            //ch.PSendSysMessage(\"Your bot {} cannot teleport to you. Restricted bot access on this map...\", me->GetName());\n+            teleFinishEvent = new TeleportFinishEvent(this, reset);\n+            Events.AddEvent(teleFinishEvent, Events.CalculateTime(5000));\n+            return;\n+        }\n+\n+        if (me->FindMap())\n+            me->ResetMap();\n+\n+        me->SetMap(map);\n+        if (master->GetTransport())\n+        {\n+            master->GetTransport()->AddPassenger(me, true);\n+            me->m_movementInfo.transport.pos.Relocate(master->GetTransOffset());\n+            me->Relocate(GetAbsoluteTransportPosition(master));\n+            me->AddUnitState(UNIT_STATE_IGNORE_PATHFINDING);\n+        }\n+        else\n+        {\n+            Position destpos;\n+            _calculatePos(master, destpos);\n+            me->Relocate(destpos);\n+        }\n+\n+        map->AddToMap(me);\n+        me->BotStopMovement();\n+        if (reset)\n+            this->Reset();\n+\n+        me->RefreshSwimmingFlag();\n+\n+        //bot->SetAI(oldAI);\n+        //me->IsAIEnabled = true;\n+        canUpdate = true;\n+        outdoorsTimer = 0;\n+\n+        //master->m_Controlled.insert(me);\n+        if (me->IsAlive())\n+        {\n+        //CastSpellExtraArgs args(TRIGGERED_FULL_MASK);\n+        //me->CastSpell(me, COSMETIC_TELEPORT_EFFECT, args);\n+            me->CastSpell(me, COSMETIC_TELEPORT_EFFECT, true);\n+        }\n+        //me->CastSpell(me, HONORLESS_TARGET, true);\n+\n+        //Arena flags\n+        Battleground const* bg = GetBG();\n+        if (bg && bg->isArena())\n+        {\n+            TeamId teamId = bg->GetBotTeamId(me->GetGUID());\n+            uint32 flag_spell = teamId == TEAM_ALLIANCE ? master->GetTeamId() == TEAM_HORDE ? ARENA_FLAG_TEAM_H_GOLD : ARENA_FLAG_TEAM_A_GOLD :\n+                master->GetTeamId() == TEAM_HORDE ? ARENA_FLAG_TEAM_H_GREEN : ARENA_FLAG_TEAM_A_GREEN;\n+            me->CastSpell(me, flag_spell, true);\n+        }\n+\n+        //update group member online state\n+        if (Group* gr = master->GetGroup())\n+            if (gr->IsMember(me->GetGUID()))\n+                gr->SendUpdate();\n+\n+        //map hooks\n+        if (InstanceScript* iscr = master->GetInstanceScript())\n+            iscr->OnNPCBotEnter(me);\n+\n+        SetIsDuringTeleport(false);\n+    });\n+\n+    return true;\n+}\n+\n+void bot_ai::AbortTeleport()\n+{\n+    if (teleHomeEvent)\n+    {\n+        if (teleHomeEvent->IsActive())\n+            teleHomeEvent->ScheduleAbort();\n+        teleHomeEvent = nullptr;\n+    }\n+\n+    if (teleFinishEvent)\n+    {\n+        if (teleFinishEvent->IsActive())\n+            teleFinishEvent->ScheduleAbort();\n+        teleFinishEvent = nullptr;\n+    }\n+}\n+\n+void bot_ai::GetHomePosition(uint16& mapid, Position* pos) const\n+{\n+    if (IsWanderer())\n+    {\n+        mapid = _travel_node_cur->GetMapId();\n+        pos->Relocate(homepos);\n+    }\n+    else\n+    {\n+        CreatureData const* data = me->GetCreatureData();\n+        mapid = data->mapid;\n+        pos->Relocate(data->posX, data->posY, data->posZ, data->orientation);\n+    }\n+}\n+\n+//WANDER NODES\n+/*static */bool bot_ai::IsWanderNodeAvailableForBotFaction(WanderNode const* wp, uint32 factionTemplateId, bool teleport, bool spawn)\n+{\n+    if (!teleport && !spawn && wp->HasFlag(BotWPFlags::BOTWP_FLAG_MOVEMENT_IGNORES_FACTION))\n+        return true;\n+\n+    MapEntry const* mapEntry = sMapStore.LookupEntry(wp->GetMapId());\n+    if (teleport && !mapEntry->IsContinent())\n+        return false;\n+\n+    if ((teleport || spawn) && (wp->GetLevels().second <= 10 || mapEntry->IsBattlegroundOrArena()))\n+    {\n+        switch (BotDataMgr::GetTeamIdForFaction(factionTemplateId))\n+        {\n+            case TEAM_ALLIANCE:\n+                return wp->HasFlag(BotWPFlags::BOTWP_FLAG_ALLIANCE_ONLY);\n+            case TEAM_HORDE:\n+                return wp->HasFlag(BotWPFlags::BOTWP_FLAG_HORDE_ONLY);\n+            case TEAM_NEUTRAL:\n+                return true;\n+            default:\n+                return true;\n+        }\n+    }\n+\n+    switch (BotDataMgr::GetTeamIdForFaction(factionTemplateId))\n+    {\n+        case TEAM_ALLIANCE:\n+            return !wp->HasFlag(BotWPFlags::BOTWP_FLAG_HORDE_ONLY);\n+        case TEAM_HORDE:\n+            return !wp->HasFlag(BotWPFlags::BOTWP_FLAG_ALLIANCE_ONLY);\n+        case TEAM_NEUTRAL:\n+            return !wp->HasFlag(BotWPFlags::BOTWP_FLAG_ALLIANCE_OR_HORDE_ONLY);\n+        default:\n+            return true;\n+    }\n+}\n+\n+WanderNode const* bot_ai::GetClosestWanderNode() const\n+{\n+    float mindist = 50000.0f;\n+    WanderNode const* closestNode = nullptr;\n+    WanderNode::DoForAllMapWPs(me->GetMapId(), [&mindist, &closestNode, loc = me](WanderNode const* wp) {\n+        float dist = wp->GetExactDist2d(loc);\n+        if (dist < mindist)\n+        {\n+            mindist = dist;\n+            closestNode = wp;\n+        }\n+    });\n+\n+    return closestNode;\n+}\n+\n+WanderNode const* bot_ai::GetNextWanderNode(Position const* fromPos, uint8 lvl, bool random) const\n+{\n+    using NodeList = std::list<WanderNode const*>;\n+    using WanderNodeLink = WanderNode::WanderNodeLink;\n+    using NodeLinkList = std::list<WanderNodeLink const*>;\n+    using LinkWeightExtractor = WanderNodeLink::WeightExtractor;\n+\n+    static auto node_viable = [](WanderNode const* wp, uint8 lvl) -> bool {\n+        return (lvl + 2 >= wp->GetLevels().first && lvl <= wp->GetLevels().second);\n+    };\n+\n+    uint32 faction = me->GetFaction();\n+    if (me->IsFFAPvP())\n+    {\n+        ChrRacesEntry const* rentry = sChrRacesStore.LookupEntry(me->GetRace());\n+        faction = (_botclass >= BOT_CLASS_EX_START) ? uint32(FACTION_TEMPLATE_NEUTRAL_HOSTILE) : rentry ? rentry->FactionID : uint32(FACTION_TEMPLATE_NEUTRAL_HOSTILE);\n+    }\n+\n+    //Node got deleted (or forced)! Select close point and go from there\n+    NodeList nlinks;\n+    if (_travel_node_cur->GetLinks().empty() || random)\n+    {\n+        if (me->IsInWorld() && !me->GetMap()->IsBattlegroundOrArena())\n+        {\n+            WanderNode::DoForAllMapWPs(_travel_node_cur->GetMapId(), [&nlinks, lvl = lvl, fac = faction, pos = fromPos](WanderNode const* wp) {\n+                if (pos->GetExactDist2d(wp) < MAX_WANDER_NODE_DISTANCE && IsWanderNodeAvailableForBotFaction(wp, fac, true) && node_viable(wp, lvl) && !wp->HasFlag(BotWPFlags::BOTWP_FLAG_NOT_A_START_POINT))\n+                    nlinks.push_back(wp);\n+            });\n+            if (!nlinks.empty())\n+                return nlinks.size() == 1u ? nlinks.front() : Bcore::Containers::SelectRandomContainerElement(nlinks);\n+        }\n+\n+        //Select closest\n+        WanderNode const* node_new = nullptr;\n+        float mindist = 50000.0f; // Anywhere\n+        WanderNode::DoForAllMapWPs(_travel_node_cur->GetMapId(), [&node_new, &mindist, lvl = lvl, fac = faction, pos = fromPos](WanderNode const* wp) {\n+            float dist = pos->GetExactDist2d(wp);\n+            if (dist < mindist && IsWanderNodeAvailableForBotFaction(wp, fac, false) && node_viable(wp, lvl) && !wp->HasFlag(BotWPFlags::BOTWP_FLAG_NOT_A_START_POINT))\n+            {\n+                mindist = dist;\n+                node_new = wp;\n+            }\n+        });\n+        return node_new;\n+    }\n+\n+    NodeLinkList llinks;\n+    for (auto const& wpl : _travel_node_cur->GetLinks())\n+    {\n+        if (IsWanderNodeAvailableForBotFaction(wpl.wp, faction, false) && node_viable(wpl.wp, lvl))\n+            llinks.push_back(&wpl);\n+    }\n+    if (llinks.size() > 1 && _travel_node_last && !_travel_node_cur->HasFlag(BotWPFlags::BOTWP_FLAG_CAN_BACKTRACK_FROM))\n+        std::erase_if(llinks, [this](WanderNodeLink const* wpl) { return wpl->wp == _travel_node_last; });\n+    if (!llinks.empty())\n+    {\n+        WanderNodeLink const* wpl = llinks.size() == 1u ? llinks.front() : *Bcore::Containers::SelectRandomWeightedContainerElement(llinks, LinkWeightExtractor());\n+        return wpl->wp;\n+    }\n+\n+    //Overleveled or died: no viable nodes in reach, find one for teleport\n+    WanderNode::DoForAllWPs([&nlinks, lvl = lvl, fac = faction](WanderNode const* wp) {\n+        if (IsWanderNodeAvailableForBotFaction(wp, fac, true) && wp->HasFlag(BotWPFlags::BOTWP_FLAG_SPAWN) && node_viable(wp, lvl) && !wp->HasFlag(BotWPFlags::BOTWP_FLAG_NOT_A_START_POINT))\n+            nlinks.push_back(wp);\n+    });\n+\n+    ASSERT(!nlinks.empty());\n+    return nlinks.size() == 1u ? nlinks.front() : Bcore::Containers::SelectRandomContainerElement(nlinks);\n+}\n+\n+WanderNode const* bot_ai::GetNextTravelNode(Position const* from, bool random) const\n+{\n+    if (!random)\n+    {\n+        if (WanderNode const* bgNode = GetNextBGTravelNode())\n+            return bgNode;\n+    }\n+\n+    int8 mylevelbonus = BotDataMgr::GetLevelBonusForBotRank(me->GetCreatureTemplate()->rank);\n+    uint8 mylevelbase = std::max<int8>(int8(me->GetLevel()) - mylevelbonus, int8(BotDataMgr::GetMinLevelForBotClass(_botclass)));\n+\n+    return GetNextWanderNode(from, mylevelbase, random);\n+}\n+\n+WanderNode const* bot_ai::GetNextBGTravelNode() const\n+{\n+    using WanderNodeLink = WanderNode::WanderNodeLink;\n+    using NodeList = std::list<WanderNode const*>;\n+    using NodeLinkList = std::list<WanderNodeLink>;\n+    using LinkWeightExtractor = WanderNodeLink::WeightExtractor;\n+\n+    if (!me->GetMap()->IsBattleground() || !GetBG() || !GetGroup() || _travel_node_cur->GetLinks().size() <= 1)\n+        return nullptr;\n+\n+    Battleground* bg = GetBG();\n+    TeamId myTeamId = bg->GetBotTeamId(me->GetGUID());\n+    //uint32 myTeam = myTeamId == TEAM_ALLIANCE ? ALLIANCE : HORDE;\n+    WanderNode const* curNode = _travel_node_cur;\n+    std::vector<Unit*> const team_members = BotMgr::GetAllGroupMembers(me);\n+    NodeLinkList links;\n+    for (WanderNodeLink const& wpl : curNode->GetLinks())\n+        if (bot_ai::IsWanderNodeAvailableForBotFaction(wpl.wp, me->GetFaction(), false))\n+            links.push_back(wpl);\n+    if (links.size() > 1 && _travel_node_last && !curNode->HasFlag(BotWPFlags::BOTWP_FLAG_CAN_BACKTRACK_FROM))\n+        std::erase_if(links, [this](WanderNodeLink const& wpl) { return wpl.Id() == _travel_node_last->GetWPId(); });\n+\n+    switch (bg->GetBgTypeID())\n+    {\n+        case BATTLEGROUND_AV:\n+        {\n+            const uint32 CRETYPE_CAPTAIN_A = AV_CPLACE_MAX + 61;\n+            const uint32 CRETYPE_CAPTAIN_H = AV_CPLACE_MAX + 59;\n+            const uint32 CRETYPE_BOSS_A = AV_CPLACE_MAX + 60;\n+            const uint32 CRETYPE_BOSS_H = AV_CPLACE_MAX + 122;\n+\n+            static const std::function boss_room_wp_pred_a = [](WanderNode const* wp) { return wp->HasAllFlags(BotWPFlags::BOTWP_FLAG_ALLIANCE_BOSS_ROOM); };\n+            static const std::function boss_room_wp_pred_h = [](WanderNode const* wp) { return wp->HasAllFlags(BotWPFlags::BOTWP_FLAG_HORDE_BOSS_ROOM); };\n+\n+            BattlegroundAV* av = dynamic_cast<BattlegroundAV*>(bg);\n+\n+            // 1) check conditions to rush final boss\n+            for (TeamId teamId : { TEAM_ALLIANCE, TEAM_HORDE })\n+            {\n+                if (myTeamId != teamId)\n+                    continue;\n+\n+                //Condition 1: at least half of bunkers/towers destroyed\n+                uint8 tb_down_count = 0;\n+                for (BG_AV_Nodes counter = BG_AV_NODES_DUNBALDAR_SOUTH; counter <= BG_AV_NODES_FROSTWOLF_WTOWER; ++counter)\n+                {\n+                    BG_AV_NodeInfo const& c = av->GetNodes()[counter];\n+                    switch (counter)\n+                    {\n+                        case BG_AV_NODES_DUNBALDAR_SOUTH:\n+                        case BG_AV_NODES_DUNBALDAR_NORTH:\n+                        case BG_AV_NODES_ICEWING_BUNKER:\n+                        case BG_AV_NODES_STONEHEART_BUNKER:\n+                            if (teamId == TEAM_HORDE && c.State == BG_AV_States::POINT_DESTROYED)\n+                                ++tb_down_count;\n+                            break;\n+                        case BG_AV_NODES_ICEBLOOD_TOWER:\n+                        case BG_AV_NODES_TOWER_POINT:\n+                        case BG_AV_NODES_FROSTWOLF_ETOWER:\n+                        case BG_AV_NODES_FROSTWOLF_WTOWER:\n+                            if (teamId == TEAM_ALLIANCE && c.State == BG_AV_States::POINT_DESTROYED)\n+                                ++tb_down_count;\n+                            break;\n+                        default:\n+                            break;\n+                    }\n+                }\n+                if (tb_down_count >= 2)\n+                {\n+                    //Condition 2: boss node is in reach\n+                    WanderNode const* bossWP = ASSERT_NOTNULL(WanderNode::FindInMapWPs(me->GetMapId(), teamId == TEAM_ALLIANCE ? boss_room_wp_pred_h : boss_room_wp_pred_a));\n+                    if (curNode->HasLink(bossWP))\n+                    {\n+                        Creature const* boss = ASSERT_NOTNULL(av->GetBGCreature(teamId == TEAM_ALLIANCE ? CRETYPE_BOSS_H : CRETYPE_BOSS_A));\n+                        //Condition 3: team is ready OR boss is already engaged\n+                        bool team_ready = boss->IsInCombat() && boss->GetThreatMgr().GetThreatListSize() >= team_members.size() / 8u;\n+                        if (!team_ready)\n+                        {\n+                            uint32 ready_count = 0;\n+                            for (Unit const* member : team_members)\n+                            {\n+                                if (!member->IsAlive())\n+                                    continue;\n+                                if (member->IsPlayer())\n+                                {\n+                                    if (member->IsWithinDist2d(me, 40.0f) || member->ToPlayer()->GetTarget() == boss->GetGUID())\n+                                        ++ready_count;\n+                                }\n+                                else if (member->ToCreature()->GetBotAI()->_travel_node_cur == bossWP || member->GetVictim() == boss ||\n+                                    (!member->GetVictim() && member->IsWithinDist2d(curNode, 25.0f)))\n+                                    ++ready_count;\n+                            }\n+                            team_ready = ready_count >= static_cast<uint32>(team_members.size() / 2u - 1u);\n+                        }\n+                        if (team_ready)\n+                            return bossWP;\n+                        else\n+                            return curNode;\n+                    }\n+                }\n+            }\n+            // 2) check a boss room to defend\n+            for (auto const& p : { std::pair{TEAM_ALLIANCE, CRETYPE_BOSS_A}, std::pair{TEAM_HORDE, CRETYPE_BOSS_H} })\n+            {\n+                if (myTeamId != p.first)\n+                    continue;\n+                Creature const* boss = ASSERT_NOTNULL(av->GetBGCreature(p.second));\n+                if (boss->IsInCombat() && boss->GetThreatMgr().GetThreatListSize() >= 6)\n+                {\n+                    auto const& pred = p.first == TEAM_ALLIANCE ? boss_room_wp_pred_a : boss_room_wp_pred_h;\n+                    WanderNode const* bossWP = ASSERT_NOTNULL(WanderNode::FindInMapWPs(boss->GetMapId(), pred));\n+                    NodeLinkList vlinks = curNode->GetShortestPathLinks(bossWP, links, BotWPLevel::BOTWP_LEVEL_ONE);\n+                    if (!vlinks.empty())\n+                        return vlinks.size() == 1u ? vlinks.front().wp : Bcore::Containers::SelectRandomWeightedContainerElement(vlinks, LinkWeightExtractor())->wp;\n+                }\n+            }\n+            // 3) check captain room to defend\n+            for (auto const& p : { std::pair{TEAM_ALLIANCE, CRETYPE_CAPTAIN_A}, std::pair{TEAM_HORDE, CRETYPE_CAPTAIN_H} })\n+            {\n+                if (myTeamId != p.first)\n+                    continue;\n+                Creature const* captain = ASSERT_NOTNULL(av->GetBGCreature(p.second));\n+                if (captain->IsAlive() && captain->IsInCombat())\n+                {\n+                    WanderNode const* cap_node = nullptr;\n+                    float mindist = 50000.0f;\n+                    WanderNode::DoForAllAreaWPs(captain->GetAreaId(), [&cap_node, &mindist, fac = me->GetFaction(), pos = captain](WanderNode const* wp) {\n+                        float dist = pos->GetExactDist2d(wp);\n+                        if (dist < mindist && bot_ai::IsWanderNodeAvailableForBotFaction(wp, fac, false))\n+                        {\n+                            mindist = dist;\n+                            cap_node = wp;\n+                        }\n+                    });\n+                    if (cap_node && curNode->HasLink(cap_node))\n+                        return cap_node;\n+                }\n+            }\n+            // 4) find next defend point\n+            // 5) find a mine nearby and try to capture\n+            // 6) find a currently assaulted point by our team and make sure someone defends it\n+            // Ex. some GYs to base on are beyound directly accessible tower/bunker or captain room\n+            // 7) find a GY/tower/bunker in non-assaulted state to assault\n+            for (TeamId teamId : { TEAM_ALLIANCE, TEAM_HORDE })\n+            {\n+                if (myTeamId != teamId)\n+                    continue;\n+\n+                constexpr std::array<uint8, BG_AV_NODES_MAX> defend_priority_a{ 9, 7, 6, 3, 4, 2, 1, 8, 8, 5, 5, 0, 0, 0, 0 };\n+                constexpr std::array<uint8, BG_AV_NODES_MAX> defend_priority_h{ 1, 2, 4, 3, 6, 7, 9, 0, 0, 0, 0, 5, 5, 8, 8 };\n+                const std::array<uint8, BG_AV_NODES_MAX> req_attackers_count{ uint8(team_members.size() / 2u), 4, 4, 4, 4, 4, uint8(team_members.size() / 2u), 4, 4, 4, 4, 4, 4, 4, 4 };\n+                const std::array<uint8, BG_AV_NODES_MAX> req_defenders_count{ uint8(team_members.size() / 2u), 4, 4, 4, 4, 4, uint8(team_members.size() / 2u), 0, 0, 0, 0, 0, 0, 0, 0 };\n+\n+                static const std::function flag_wp_pred = [](WanderNode const* wp) { return wp->HasFlag(BotWPFlags::BOTWP_FLAG_BG_FLAG_PICKUP_TARGET); };\n+                static const std::function flag_or_bunker_wp_pred = [](WanderNode const* wp) { return wp->HasFlag(BotWPFlags::BOTWP_FLAG_ALLIANCE_FLAG_PICKUP_TARGET); };\n+                static const std::function flag_or_tower_wp_pred = [](WanderNode const* wp) { return wp->HasFlag(BotWPFlags::BOTWP_FLAG_HORDE_FLAG_PICKUP_TARGET); };\n+                static const std::function mine_pred = [](WanderNode const* wp) { return wp->HasFlag(BotWPFlags::BOTWP_FLAG_BG_MISC_OBJECTIVE_1); };\n+                static const std::function captain_pred_a = [](WanderNode const* wp) { return wp->HasAllFlags(BotWPFlags::BOTWP_FLAG_ALLIANCE_DEMIBOSS_ROOM); };\n+                static const std::function captain_pred_h = [](WanderNode const* wp) { return wp->HasAllFlags(BotWPFlags::BOTWP_FLAG_HORDE_DEMIBOSS_ROOM); };\n+\n+                auto const& def_prio = teamId == TEAM_ALLIANCE ? defend_priority_a : defend_priority_h;\n+                auto const& defe_pred = teamId == TEAM_ALLIANCE ? flag_or_bunker_wp_pred : flag_or_tower_wp_pred;\n+                auto const& assa_pred = teamId == TEAM_ALLIANCE ? flag_or_tower_wp_pred : flag_or_bunker_wp_pred;\n+                auto const& assacap_pred = teamId == TEAM_ALLIANCE ? captain_pred_h : captain_pred_a;\n+\n+                std::pair<uint8, WanderNode const*> defNode{};\n+                NodeList assdlist;\n+                NodeList assalist;\n+                std::set<std::pair<uint8, BG_AV_NodeInfo const*>> defendable_nodes;\n+                std::set<std::pair<uint8, BG_AV_NodeInfo const*>> assaulted_nodes;\n+                std::set<std::pair<uint8, BG_AV_NodeInfo const*>> assaultable_nodes;\n+                for (BG_AV_Nodes counter = BG_AV_NODES_FIRSTAID_STATION; counter < BG_AV_NODES_MAX; ++counter)\n+                {\n+                    BG_AV_NodeInfo const& c = av->GetNodes()[counter];\n+                    if (c.State == BG_AV_States::POINT_ASSAULTED)\n+                    {\n+                        if (c.OwnerId != myTeamId && def_prio[counter] > 0)\n+                            defendable_nodes.emplace(uint8(counter), &c);\n+                        else if (c.OwnerId == myTeamId)\n+                            assaulted_nodes.emplace(uint8(counter), &c);\n+                    }\n+                    else if (c.State == BG_AV_States::POINT_NEUTRAL || (c.State == BG_AV_States::POINT_CONTROLLED && c.OwnerId != myTeamId))\n+                        assaultable_nodes.emplace(uint8(counter), &c);\n+                    else if (counter == (teamId == TEAM_ALLIANCE ? BG_AV_NODES_FROSTWOLF_HUT : BG_AV_NODES_FIRSTAID_STATION))\n+                        assaultable_nodes.emplace(uint8(counter), &c);\n+                }\n+                WanderNode::DoForAllMapWPs(av->GetMapId(), [&](WanderNode const* wp) {\n+                    if (defe_pred(wp))\n+                    {\n+                        for (auto const& vt : defendable_nodes)\n+                            if ((!defNode.second || def_prio[vt.first] > def_prio[defNode.first]) && wp->GetExactDist2d(BG_AV_ObjectPos[vt.first][0], BG_AV_ObjectPos[vt.first][1]) < INTERACTION_DISTANCE * 2.0f)\n+                                defNode = { vt.first, wp };\n+                    }\n+                });\n+                if (WanderNode const* dnode = defNode.second)\n+                {\n+                    NodeLinkList defLinks = curNode->GetShortestPathLinks(dnode, links);\n+                    if (!defLinks.empty())\n+                        return defLinks.size() == 1u ? defLinks.front().wp : Bcore::Containers::SelectRandomWeightedContainerElement(defLinks, LinkWeightExtractor())->wp;\n+                }\n+                for (uint8 mine_idx : { AV_NORTH_MINE, AV_SOUTH_MINE })\n+                {\n+                    if (av->GetMineOwner(mine_idx) == myTeamId)\n+                        continue;\n+                    uint32 cre_type = (mine_idx == AV_NORTH_MINE) ? AV_CPLACE_MINE_N_3 : AV_CPLACE_MINE_S_3;\n+                    WanderNode const* mineWP = nullptr;\n+                    WanderNode::DoForAllMapWPs(me->GetMapId(), [=, &mineWP, mindist = 50000.f](WanderNode const* mwp) mutable {\n+                        if (!mine_pred(mwp))\n+                            return;\n+                        float dist2d = mwp->GetExactDist2d(BG_AV_CreaturePos[cre_type][0], BG_AV_CreaturePos[cre_type][1]);\n+                        if (!mineWP || dist2d < mindist)\n+                        {\n+                            mindist = dist2d;\n+                            mineWP = mwp;\n+                        }\n+                    });\n+                    if (!mineWP)\n+                        continue;\n+                    WanderNode const* mineWPNext = mineWP->GetLinks().front().wp;\n+                    if (curNode->HasLink(mineWP) || curNode->HasLink(mineWPNext) || me->IsWithinDist2d(mineWP, SIZE_OF_GRIDS * 0.45f))\n+                    {\n+                        uint32 attackers_count = 0;\n+                        for (Unit const* member : team_members)\n+                        {\n+                            WanderNode const* mn = member->IsNPCBot() ? member->ToCreature()->GetBotAI()->_travel_node_cur : nullptr;\n+                            if (member != me && member->IsAlive() && (member->GetExactDist2d(mineWP) < me->GetExactDist2d(mineWP) || (mn && (mn == mineWP || mn == mineWPNext))))\n+                                ++attackers_count;\n+                        }\n+                        if (attackers_count < 2)\n+                        {\n+                            NodeLinkList mlinks = curNode->GetShortestPathLinks(mineWP, links);\n+                            if (!mlinks.empty())\n+                            {\n+                                BOT_LOG_DEBUG(\"npcbots\", \"Bot {} {} team {} goes for AV mine {}! Cur node: {} {}\",\n+                                    me->GetName(), me->GetEntry(), uint32(myTeamId), uint32(mine_idx), curNode->GetWPId(), curNode->GetName());\n+                                return mlinks.size() == 1u ? mlinks.front().wp : Bcore::Containers::SelectRandomWeightedContainerElement(mlinks, LinkWeightExtractor())->wp;\n+                            }\n+                        }\n+                    }\n+                }\n+                WanderNode const* enemy_captain_wp = ASSERT_NOTNULL(WanderNode::FindInMapWPs(me->GetMapId(), assacap_pred));\n+                if (curNode->HasLink(enemy_captain_wp))\n+                {\n+                    Creature const* captain = av->GetBGCreature(teamId == TEAM_ALLIANCE ? CRETYPE_CAPTAIN_H : CRETYPE_CAPTAIN_A);\n+                    if (captain && captain->IsAlive())\n+                    {\n+                        bool team_ready = captain->IsInCombat();\n+                        if (!team_ready)\n+                        {\n+                            uint32 attackers_count = 0;\n+                            for (Unit const* member : team_members)\n+                            {\n+                                WanderNode const* mn = member->IsNPCBot() ? member->ToCreature()->GetBotAI()->_travel_node_cur : nullptr;\n+                                if (member != me && member->IsAlive() && (member->GetExactDist2d(captain) < 40.0f || mn == enemy_captain_wp || mn == curNode))\n+                                    ++attackers_count;\n+                            }\n+                            team_ready = attackers_count >= team_members.size() / 4u;\n+                        }\n+                        return team_ready ? enemy_captain_wp : curNode;\n+                    }\n+                }\n+                WanderNode::DoForAllMapWPs(me->GetMapId(), [&](WanderNode const* wp) {\n+                    if (flag_wp_pred(wp))\n+                    {\n+                        for (auto const& vt : assaulted_nodes)\n+                        {\n+                            if (wp->GetExactDist2d(BG_AV_ObjectPos[vt.first][0], BG_AV_ObjectPos[vt.first][1]) < INTERACTION_DISTANCE * 2.0f)\n+                            {\n+                                uint32 defenders_count = 0;\n+                                for (Unit const* member : team_members)\n+                                {\n+                                    WanderNode const* mn = member->IsNPCBot() ? member->ToCreature()->GetBotAI()->_travel_node_cur : nullptr;\n+                                    if (member != me && member->IsAlive() && (member->GetExactDist2d(wp) < 60.0f || (mn && (mn == wp || mn->HasLink(wp)))))\n+                                        ++defenders_count;\n+                                }\n+                                if (defenders_count < req_defenders_count[vt.first])\n+                                    assdlist.push_back(wp);\n+                            }\n+                        }\n+                        if (assa_pred(wp))\n+                        {\n+                            for (auto const& vt : assaultable_nodes)\n+                            {\n+                            if (wp->GetExactDist2d(BG_AV_ObjectPos[vt.first][0], BG_AV_ObjectPos[vt.first][1]) < INTERACTION_DISTANCE * 2.0f)\n+                                {\n+                                    uint32 attackers_count = 0;\n+                                    for (Unit const* member : team_members)\n+                                    {\n+                                        WanderNode const* mn = member->IsNPCBot() ? member->ToCreature()->GetBotAI()->_travel_node_cur : nullptr;\n+                                        if (member != me && member->IsAlive() && (member->GetExactDist2d(wp) < 60.0f || (mn && (mn == wp || mn->HasLink(wp)))))\n+                                            ++attackers_count;\n+                                    }\n+                                    if (attackers_count < req_attackers_count[vt.first])\n+                                        assalist.push_back(wp);\n+                                }\n+                            }\n+                        }\n+                    }\n+                });\n+                if (!assdlist.empty())\n+                {\n+                    if (std::ranges::find(assdlist, curNode) != assdlist.cend())\n+                        return curNode;\n+                    //remove non-empty points\n+                    std::erase_if(assdlist, [&team_members, except_wp = curNode](WanderNode const* wp) {\n+                        if (wp != except_wp)\n+                            for (Unit const* member : team_members)\n+                                if (member->IsAlive() && (member->GetExactDist2d(wp) < 40.0f || (member->IsNPCBot() && member->ToCreature()->GetBotAI()->_travel_node_cur == wp)))\n+                                    return true;\n+                        return false;\n+                    });\n+                }\n+                NodeList const* myList = !assdlist.empty() ? &assdlist : &assalist;\n+                if (!myList->empty())\n+                {\n+                    WanderNode const* closestAWP = nullptr;\n+                    WanderNode::DoForContainerWPs(*myList, [=, &closestAWP, mindist = 50000.f](WanderNode const* mwp) mutable {\n+                        float dist2d = curNode->GetExactDist2d(mwp);\n+                        if (!closestAWP || dist2d < mindist)\n+                        {\n+                            mindist = dist2d;\n+                            closestAWP = mwp;\n+                        }\n+                    });\n+                    NodeLinkList alinks = curNode->GetShortestPathLinks(closestAWP, links);\n+                    if (!alinks.empty())\n+                        return alinks.size() == 1u ? alinks.front().wp : Bcore::Containers::SelectRandomWeightedContainerElement(alinks, LinkWeightExtractor())->wp;\n+                }\n+            }\n+            //No immediate target: find a point next to enemy boss and try going there\n+            for (TeamId teamId : { TEAM_ALLIANCE, TEAM_HORDE })\n+            {\n+                if (myTeamId != teamId)\n+                    continue;\n+                Creature const* boss = av->GetBGCreature(teamId == TEAM_ALLIANCE ? CRETYPE_BOSS_H : CRETYPE_BOSS_A);\n+                WanderNode const* bossWP = ASSERT_NOTNULL(WanderNode::FindInMapWPs(boss->GetMapId(), teamId == TEAM_ALLIANCE ? boss_room_wp_pred_h : boss_room_wp_pred_a));\n+                NodeLinkList vlinks = curNode->GetShortestPathLinks(bossWP->GetLinks().front().wp, links, BotWPLevel::BOTWP_LEVEL_ONE);\n+                if (!vlinks.empty())\n+                    return vlinks.size() == 1u ? vlinks.front().wp : Bcore::Containers::SelectRandomWeightedContainerElement(vlinks, LinkWeightExtractor())->wp;\n+            }\n+\n+            break;\n+        }\n+        case BATTLEGROUND_WS:\n+        {\n+            BattlegroundWS* ws = dynamic_cast<BattlegroundWS*>(bg);\n+\n+            //1) carrier - get next point towards drop point\n+            for (TeamId teamId : { TEAM_ALLIANCE, TEAM_HORDE })\n+            {\n+                if (myTeamId != teamId)\n+                    continue;\n+\n+                if (ws->GetFlagPickerGUID(bg->GetOtherTeamId(teamId)) == me->GetGUID())\n+                {\n+                    WanderNode const* dropPoint = WanderNode::FindInMapWPs(bg->GetMapId(), [=](WanderNode const* dwp) {\n+                        return dwp->HasAllFlags(teamId == TEAM_ALLIANCE ? BotWPFlags::BOTWP_FLAG_ALLIANCE_FLAG_DELIVER_TARGET : BotWPFlags::BOTWP_FLAG_HORDE_FLAG_DELIVER_TARGET);\n+                    });\n+                    if (dropPoint)\n+                    {\n+                        NodeLinkList dlinks = curNode->GetShortestPathLinks(dropPoint, links);\n+                        if (!dlinks.empty())\n+                            return dlinks.size() == 1u ? dlinks.front().wp : Bcore::Containers::SelectRandomWeightedContainerElement(dlinks, LinkWeightExtractor())->wp;\n+                    }\n+                }\n+            }\n+            //2) next to enemy base flag - go for it if can pick, mill otherwise\n+            for (TeamId teamId : { TEAM_ALLIANCE, TEAM_HORDE })\n+            {\n+                if (myTeamId != teamId)\n+                    continue;\n+\n+                NodeLinkList::const_iterator lit = std::ranges::find_if(links, [=](WanderNodeLink const& wpl) {\n+                    return wpl.wp->HasAllFlags(teamId == TEAM_ALLIANCE ? BotWPFlags::BOTWP_FLAG_HORDE_FLAG_PICKUP_TARGET : BotWPFlags::BOTWP_FLAG_ALLIANCE_FLAG_PICKUP_TARGET);\n+                });\n+                if (lit != links.cend())\n+                {\n+                    if (ws->GetFlagState(bg->GetOtherTeamId(myTeamId)) == BG_WS_FLAG_STATE_ON_BASE)\n+                        return lit->wp;\n+                    else if (links.size() == 1)\n+                        return curNode; //mill\n+                    else\n+                        links.erase(lit); //prevent going to flag point unless the flag is present\n+                }\n+            }\n+            //3) have a link with a power-up\n+            if (GetHealthPCT(me) < 60)\n+            {\n+                NodeLinkList::const_iterator lit = std::ranges::find_if(links, [=](WanderNodeLink const& wpl) {\n+                    return wpl.wp->HasFlag(BotWPFlags::BOTWP_FLAG_WS_PICKUP_RESTORATION);\n+                });\n+                if (lit != links.cend())\n+                {\n+                    GameObject const* buff = ws->GetBGObject(lit->wp->HasFlag(BotWPFlags::BOTWP_FLAG_BG_OPTIONAL_PICKUP_1) ? BG_WS_OBJECT_REGENBUFF_1 : BG_WS_OBJECT_REGENBUFF_2);\n+                    if (buff && buff->GetGoState() == GO_STATE_READY && buff->isSpawned())\n+                    {\n+                        bool has_picker = false;\n+                        for (Unit const* member : team_members)\n+                        {\n+                            if (member != me && member->IsAlive() && member->IsNPCBot() && member->ToCreature()->GetBotAI()->_travel_node_cur == lit->wp)\n+                            {\n+                                has_picker = true;\n+                                break;\n+                            }\n+                        }\n+                        if (!has_picker)\n+                        {\n+                            //BOT_LOG_DEBUG(\"npcbots\", \"Bot {} {} team {} goes for a REGEN buff! Cur node: {} {}\",\n+                            //    me->GetName(), me->GetEntry(), uint32(myTeamId), curNode->GetWPId(), curNode->GetName());\n+                            return lit->wp;\n+                        }\n+                    }\n+                }\n+            }\n+            if (!me->HasAuraTypeWithValue(SPELL_AURA_MOD_SCALE, 30) && ws->GetFlagPickerGUID(bg->GetOtherTeamId(myTeamId)) != me->GetGUID())\n+            {\n+                NodeLinkList::const_iterator lit = std::ranges::find_if(links, [=](WanderNodeLink const& wpl) {\n+                    return wpl.wp->HasFlag(BotWPFlags::BOTWP_FLAG_WS_PICKUP_BERSERKING);\n+                });\n+                if (lit != links.cend())\n+                {\n+                    GameObject const* buff = ws->GetBGObject(lit->wp->HasFlag(BotWPFlags::BOTWP_FLAG_BG_OPTIONAL_PICKUP_2) ? BG_WS_OBJECT_BERSERKBUFF_1 : BG_WS_OBJECT_BERSERKBUFF_2);\n+                    if (buff && buff->GetGoState() == GO_STATE_READY && buff->isSpawned())\n+                    {\n+                        bool has_picker = false;\n+                        for (Unit const* member : team_members)\n+                        {\n+                            if (member != me && member->IsAlive() && member->IsNPCBot() && member->ToCreature()->GetBotAI()->_travel_node_cur == lit->wp)\n+                            {\n+                                has_picker = true;\n+                                break;\n+                            }\n+                        }\n+                        if (!has_picker)\n+                        {\n+                            //BOT_LOG_DEBUG(\"npcbots\", \"Bot {} {} team {} goes for a BERSERKING buff! Cur node: {} {}\",\n+                            //    me->GetName(), me->GetEntry(), uint32(myTeamId), curNode->GetWPId(), curNode->GetName());\n+                            return lit->wp;\n+                        }\n+                    }\n+                }\n+            }\n+            //4) 70% attack, rest defend or go for enemy flag carrier, at least 1 defends base flag\n+            for (TeamId teamId : { TEAM_ALLIANCE, TEAM_HORDE })\n+            {\n+                if (myTeamId != teamId)\n+                    continue;\n+\n+                uint8 my_team_size = static_cast<uint8>(team_members.size());\n+                WanderNode const* attackNode = nullptr;\n+                WanderNode const* defendNode = nullptr;\n+                WanderNode::DoForAllMapWPs(bg->GetMapId(), [=, &attackNode, &defendNode](WanderNode const* mwp) {\n+                    if (mwp->HasFlag(BotWPFlags::BOTWP_FLAG_BG_FLAG_PICKUP_TARGET))\n+                    {\n+                        if ((mwp->HasAllFlags(BotWPFlags::BOTWP_FLAG_HORDE_FLAG_PICKUP_TARGET) && teamId == TEAM_ALLIANCE) ||\n+                            (mwp->HasAllFlags(BotWPFlags::BOTWP_FLAG_ALLIANCE_FLAG_PICKUP_TARGET) && teamId == TEAM_HORDE))\n+                            attackNode = mwp;\n+                        else if ((mwp->HasAllFlags(BotWPFlags::BOTWP_FLAG_ALLIANCE_FLAG_PICKUP_TARGET) && teamId == TEAM_ALLIANCE) ||\n+                            (mwp->HasAllFlags(BotWPFlags::BOTWP_FLAG_HORDE_FLAG_PICKUP_TARGET) && teamId == TEAM_HORDE))\n+                            defendNode = mwp;\n+                    }\n+                });\n+\n+                uint8 max_attackers = std::max<uint8>(my_team_size * 7 / 10, my_team_size / 2 + 2);\n+                uint8 max_defenders = my_team_size - max_attackers;\n+\n+                //attack?\n+                if (attackNode)\n+                {\n+                    std::set<Unit const*> attackers;\n+                    for (Unit const* m : team_members)\n+                    {\n+                        if (m != me && m->IsNPCBot())\n+                        {\n+                            WanderNode const* mCurNode = m->ToCreature()->GetBotAI()->_travel_node_cur;\n+                            if (mCurNode && (mCurNode == attackNode || mCurNode->HasLink(attackNode)))\n+                                attackers.insert(m);\n+                        }\n+                    }\n+                    if (attackers.size() < max_attackers)\n+                    {\n+                        float myDist = me->GetExactDist2d(attackNode);\n+                        for (Unit const* m : team_members)\n+                        {\n+                            if (m != me && (m->GetExactDist2d(attackNode) < myDist || m->HasAuraTypeWithValue(SPELL_AURA_MOD_SCALE, 30)) && !attackers.contains(m))\n+                                attackers.insert(m);\n+                        }\n+                    }\n+                    if (attackers.size() < max_attackers || !!ws->GetFlagPickerGUID(teamId) || me->HasAuraTypeWithValue(SPELL_AURA_MOD_SCALE, 30))\n+                    {\n+                        NodeLinkList alinks = curNode->GetShortestPathLinks(attackNode, links, BotWPLevel::BOTWP_LEVEL_ONE);\n+                        if (!alinks.empty())\n+                        {\n+                            //BOT_LOG_DEBUG(\"npcbots\", \"Bot {} {} team {} goes to ATTACK (attackers: {})! Cur node: {} {}\",\n+                            //    me->GetName(), me->GetEntry(), uint32(myTeamId), uint32(attackers.size()), curNode->GetWPId(), curNode->GetName());\n+                            return alinks.size() == 1u ? alinks.front().wp : Bcore::Containers::SelectRandomWeightedContainerElement(alinks, LinkWeightExtractor())->wp;\n+                        }\n+                    }\n+                }\n+\n+                //defend?\n+                if (defendNode && !ws->GetFlagPickerGUID(teamId) && !me->HasAuraTypeWithValue(SPELL_AURA_MOD_SCALE, 30))\n+                {\n+                    std::set<Unit const*> defenders;\n+                    for (Unit const* m : team_members)\n+                    {\n+                        if (m != me && m->IsNPCBot())\n+                        {\n+                            WanderNode const* mCurNode = m->ToCreature()->GetBotAI()->_travel_node_cur;\n+                            if (mCurNode && (mCurNode == defendNode || mCurNode->HasLink(defendNode)))\n+                                defenders.insert(m);\n+                        }\n+                    }\n+                    if (defenders.size() < max_defenders)\n+                    {\n+                        float myDist = me->GetExactDist2d(defendNode);\n+                        for (Unit const* m : team_members)\n+                        {\n+                            if (m != me && m->GetExactDist2d(defendNode) < myDist && !defenders.contains(m))\n+                                defenders.insert(m);\n+                        }\n+                    }\n+                    if (defenders.size() < max_defenders)\n+                    {\n+                        NodeLinkList dlinks = curNode->GetShortestPathLinks(defendNode, links);\n+                        if (!dlinks.empty())\n+                        {\n+                            //BOT_LOG_DEBUG(\"npcbots\", \"Bot {} {} team {} goes to DEFEND (defenders: {})! Cur node: {} {}\",\n+                            //    me->GetName(), me->GetEntry(), uint32(myTeamId), uint32(defenders.size()), curNode->GetWPId(), curNode->GetName());\n+                            return dlinks.size() == 1u ? dlinks.front().wp : Bcore::Containers::SelectRandomWeightedContainerElement(dlinks, LinkWeightExtractor())->wp;\n+                        }\n+                    }\n+                }\n+            }\n+\n+            break;\n+        }\n+        case BATTLEGROUND_AB:\n+        {\n+            BattlegroundAB* ab = dynamic_cast<BattlegroundAB*>(bg);\n+\n+            //1) have buff linked - try going there (buff spawned, noone goes there, need that buff (scratch that, get anyway, let respawn))\n+            for (TeamId teamId : { TEAM_ALLIANCE, TEAM_HORDE })\n+            {\n+                if (myTeamId != teamId)\n+                    continue;\n+\n+                NodeLinkList::const_iterator lit = std::ranges::find_if(links, [=](WanderNodeLink const& wpl) {\n+                    return wpl.wp->HasFlag(BotWPFlags::BOTWP_FLAG_OPTIONAL_PICKUP);\n+                });\n+                if (lit != links.cend())\n+                {\n+                    uint32 object_type;\n+                    switch (lit->wp->GetFlags() & AsUnderlyingType(BotWPFlags::BOTWP_FLAG_OPTIONAL_PICKUP))\n+                    {\n+                        case AsUnderlyingType(BotWPFlags::BOTWP_FLAG_BG_OPTIONAL_PICKUP_1): object_type = BG_AB_OBJECT_SPEEDBUFF_STABLES;     break;\n+                        case AsUnderlyingType(BotWPFlags::BOTWP_FLAG_BG_OPTIONAL_PICKUP_2): object_type = BG_AB_OBJECT_SPEEDBUFF_FARM;        break;\n+                        case AsUnderlyingType(BotWPFlags::BOTWP_FLAG_BG_OPTIONAL_PICKUP_3): object_type = BG_AB_OBJECT_SPEEDBUFF_LUMBER_MILL; break;\n+                        case AsUnderlyingType(BotWPFlags::BOTWP_FLAG_BG_OPTIONAL_PICKUP_4): object_type = BG_AB_OBJECT_SPEEDBUFF_GOLD_MINE;   break;\n+                        case AsUnderlyingType(BotWPFlags::BOTWP_FLAG_BG_OPTIONAL_PICKUP_5): object_type = BG_AB_OBJECT_SPEEDBUFF_BLACKSMITH;  break;\n+                        default:                                                            object_type = 0;                                  break;\n+                    }\n+                    if (object_type)\n+                    {\n+                        for (auto i : NPCBots::index_array<uint8, 3>)\n+                        {\n+                            GameObject const* go = ab->GetBGObject(object_type + i);\n+                            if (go && go->IsInWorld() && go->isSpawned() && go->GetGoState() == GO_STATE_READY)\n+                            {\n+                                bool has_picker = false;\n+                                for (Unit const* member : team_members)\n+                                {\n+                                    if (member != me && member->IsAlive() && member->IsNPCBot() && member->ToCreature()->GetBotAI()->_travel_node_cur == lit->wp)\n+                                    {\n+                                        has_picker = true;\n+                                        break;\n+                                    }\n+                                }\n+                                if (!has_picker)\n+                                {\n+                                    //BOT_LOG_DEBUG(\"npcbots\", \"Bot {} {} team {} goes for AB buff at {}! Cur node: {} {}\",\n+                                    //    me->GetName(), me->GetEntry(), uint32(myTeamId), lit->wp->GetName(), curNode->GetWPId(), curNode->GetName());\n+                                    return lit->wp;\n+                                }\n+                                break;\n+                            }\n+                        }\n+                    }\n+                    links.erase(lit);\n+                }\n+            }\n+            //2) all bases occupied or assaulted - lock enemy team on their base\n+            for (TeamId teamId : { TEAM_ALLIANCE, TEAM_HORDE })\n+            {\n+                if (myTeamId != teamId)\n+                    continue;\n+\n+                bool all_nodes_assaulted = std::ranges::all_of(NPCBots::index_array<uint8, 5>, [=](uint8 n) { return ab->IsNodeOccupied(n, teamId) || ab->IsNodeContested(n, teamId); });\n+                if (all_nodes_assaulted)\n+                {\n+                    WanderNode const* enemy_base = WanderNode::FindInMapWPs(me->GetMapId(), [=](WanderNode const* mwp) {\n+                        return (mwp->HasAllFlags(teamId == TEAM_ALLIANCE ? BotWPFlags::BOTWP_FLAG_HORDE_SPAWN_POINT : BotWPFlags::BOTWP_FLAG_ALLIANCE_SPAWN_POINT));\n+                    });\n+                    if (enemy_base)\n+                    {\n+                        NodeLinkList elinks = curNode->GetShortestPathLinks(enemy_base, links);\n+                        if (!elinks.empty())\n+                        {\n+                            //BOT_LOG_DEBUG(\"npcbots\", \"Bot {} {} team {} goes for AB PIN at {}! Cur node: {} {}\",\n+                            //    me->GetName(), me->GetEntry(), uint32(myTeamId), enemy_base->GetName(), curNode->GetWPId(), curNode->GetName());\n+                            return elinks.size() == 1u ? elinks.front().wp : Bcore::Containers::SelectRandomWeightedContainerElement(elinks, LinkWeightExtractor())->wp;\n+                        }\n+\n+                    }\n+                }\n+            }\n+            //3) closest (linked) base is not captured / not assaulted - go there, otherwise find all not captured / not assaulted bases and select farthest (max 2 per base)\n+            for (TeamId teamId : { TEAM_ALLIANCE, TEAM_HORDE })\n+            {\n+                if (myTeamId != teamId)\n+                    continue;\n+\n+                std::list<uint8> attackable_points;\n+                uint8 node = BG_AB_NODE_STABLES;\n+                do\n+                {\n+                    if (!ab->IsNodeOccupied(node, teamId) && !ab->IsNodeContested(node, teamId))\n+                        attackable_points.push_back(node);\n+                    ++node;\n+                } while (node < BG_AB_DYNAMIC_NODES_COUNT);\n+\n+                NodeList bgFlags;\n+                WanderNode::DoForAllMapWPs(me->GetMapId(), [&bgFlags, &attackable_points](WanderNode const* mwp) {\n+                    if (mwp->HasFlag(BotWPFlags::BOTWP_FLAG_BG_FLAG_PICKUP_TARGET) &&\n+                        std::ranges::any_of(attackable_points, [=](uint8 n) { return mwp->GetExactDist2d(BG_AB_NodePositions[n][0], BG_AB_NodePositions[n][1]) < 10.0f; }))\n+                        bgFlags.push_back(mwp);\n+                });\n+                NodeList attackableFlags;\n+                WanderNode::DoForContainerWPs(bgFlags, [this, &attackableFlags, &team_members](WanderNode const* mwp) {\n+                    uint8 advancing_members = 0;\n+                    for (Unit const* m : team_members)\n+                    {\n+                        if (m == me)\n+                            continue;\n+                        if (m->GetCurrentSpell(CURRENT_GENERIC_SPELL) && m->GetCurrentSpell(CURRENT_GENERIC_SPELL)->m_spellInfo->Id == OPEN_FLAG_BG && m->GetExactDist2d(mwp) < 10.0f)\n+                            ++advancing_members;\n+                        else if (m->IsNPCBot() && m->ToCreature()->GetBotAI()->_travel_node_cur == mwp)\n+                            ++advancing_members;\n+                        else if (m->GetExactDist2d(mwp) < 60.0f && m->GetExactDist2d(mwp) < me->GetExactDist2d(mwp))\n+                            ++advancing_members;\n+                        if (advancing_members >= 3)\n+                            break;\n+                    }\n+                    if (advancing_members < 3)\n+                        attackableFlags.push_back(mwp);\n+                });\n+                if (attackableFlags.empty())\n+                {\n+                    float maxdist = 0.0f;\n+                    WanderNode const* farthestAttackableFlag = nullptr;\n+                    for (WanderNode const* bgFlag : bgFlags)\n+                    {\n+                        float dist2d = me->GetExactDist2d(bgFlag);\n+                        if (dist2d > maxdist)\n+                        {\n+                            maxdist = dist2d;\n+                            farthestAttackableFlag = bgFlag;\n+                        }\n+                    }\n+                    if (farthestAttackableFlag)\n+                        attackableFlags.push_back(farthestAttackableFlag);\n+                }\n+                NodeLinkList olinks;\n+                for (WanderNodeLink const& wpl : links)\n+                    if (std::ranges::any_of(attackableFlags, [&wpl](WanderNode const* wp) { return wpl.wp == wp; }))\n+                        olinks.push_back(wpl);\n+                if (!olinks.empty())\n+                {\n+                    //BOT_LOG_DEBUG(\"npcbots\", \"Bot {} {} team {} goes for AB DIRECT ASSAULT! Cur node: {} {}\",\n+                    //    me->GetName(), me->GetEntry(), uint32(myTeamId), curNode->GetWPId(), curNode->GetName());\n+                    return olinks.size() == 1u ? olinks.front().wp : Bcore::Containers::SelectRandomWeightedContainerElement(olinks, LinkWeightExtractor())->wp;\n+                }\n+\n+                std::list<WanderNodeLink> dlinks;\n+                for (WanderNode const* fwp : attackableFlags)\n+                    dlinks.splice(dlinks.end(), curNode->GetShortestPathLinks(fwp, links, BotWPLevel::BOTWP_LEVEL_ONE));\n+                if (!dlinks.empty())\n+                {\n+                    //BOT_LOG_DEBUG(\"npcbots\", \"Bot {} {} team {} goes for AB ASSAULT! Cur node: {} {}\",\n+                    //    me->GetName(), me->GetEntry(), uint32(myTeamId), curNode->GetWPId(), curNode->GetName());\n+                    return dlinks.size() == 1u ? dlinks.begin()->wp : Bcore::Containers::SelectRandomWeightedContainerElement(dlinks, LinkWeightExtractor())->wp;\n+                }\n+            }\n+\n+            break;\n+        }\n+        case BATTLEGROUND_EY:\n+        {\n+            BattlegroundEY* ey = dynamic_cast<BattlegroundEY*>(bg);\n+\n+            //1) at the point near buff - grab the buff unconditionally\n+            for (TeamId teamId : { TEAM_ALLIANCE, TEAM_HORDE })\n+            {\n+                if (myTeamId != teamId)\n+                    continue;\n+\n+                NodeLinkList::const_iterator lit = std::ranges::find_if(links, [=](WanderNodeLink const& wpl) {\n+                    return wpl.wp->HasFlag(BotWPFlags::BOTWP_FLAG_OPTIONAL_PICKUP);\n+                });\n+                if (lit != links.cend())\n+                {\n+                    uint32 object_type;\n+                    switch (lit->wp->GetFlags() & AsUnderlyingType(BotWPFlags::BOTWP_FLAG_OPTIONAL_PICKUP))\n+                    {\n+                        case AsUnderlyingType(BotWPFlags::BOTWP_FLAG_BG_OPTIONAL_PICKUP_1): object_type = BG_EY_OBJECT_SPEEDBUFF_MAGE_TOWER;    break;\n+                        case AsUnderlyingType(BotWPFlags::BOTWP_FLAG_BG_OPTIONAL_PICKUP_2): object_type = BG_EY_OBJECT_SPEEDBUFF_DRAENEI_RUINS; break;\n+                        case AsUnderlyingType(BotWPFlags::BOTWP_FLAG_BG_OPTIONAL_PICKUP_3): object_type = BG_EY_OBJECT_SPEEDBUFF_FEL_REAVER;    break;\n+                        case AsUnderlyingType(BotWPFlags::BOTWP_FLAG_BG_OPTIONAL_PICKUP_4): object_type = BG_EY_OBJECT_SPEEDBUFF_BLOOD_ELF;     break;\n+                        default:                                                            object_type = 0;                                    break;\n+                    }\n+                    if (object_type)\n+                    {\n+                        for (auto i : NPCBots::index_array<uint8, 3>)\n+                        {\n+                            GameObject const* go = ey->GetBGObject(object_type + i);\n+                            if (go && go->IsInWorld() && go->isSpawned() && go->GetGoState() == GO_STATE_READY)\n+                            {\n+                                bool has_picker = false;\n+                                for (Unit const* member : team_members)\n+                                {\n+                                    if (member != me && member->IsAlive() && member->IsNPCBot() && member->ToCreature()->GetBotAI()->_travel_node_cur == lit->wp)\n+                                    {\n+                                        has_picker = true;\n+                                        break;\n+                                    }\n+                                }\n+                                if (!has_picker)\n+                                {\n+                                    //BOT_LOG_DEBUG(\"npcbots\", \"Bot {} {} team {} goes for EY BUFF at {}! Cur node: {} {}\",\n+                                    //    me->GetName(), me->GetEntry(), uint32(myTeamId), lit->wp->GetName(), curNode->GetWPId(), curNode->GetName());\n+                                    return lit->wp;\n+                                }\n+                                break;\n+                            }\n+                        }\n+                    }\n+                    links.erase(lit);\n+                }\n+            }\n+            //2) would be carrier - set to current point for the next move\n+            for (TeamId teamId : { TEAM_ALLIANCE, TEAM_HORDE })\n+            {\n+                if (myTeamId != teamId)\n+                    continue;\n+\n+                if (curNode->HasFlag(BotWPFlags::BOTWP_FLAG_BG_FLAG_PICKUP_TARGET))\n+                {\n+                    if (Spell const* curSpell = me->GetCurrentSpell(CURRENT_GENERIC_SPELL))\n+                    {\n+                        if (curSpell->GetSpellInfo()->Id == OPEN_FLAG_BG)\n+                        {\n+                            //BOT_LOG_DEBUG(\"npcbots\", \"Bot {} {} team {} is AT FLAG POINT and goes for same EY point {}!\", me->GetName(), me->GetEntry(), uint32(myTeamId), curNode->GetWPId());\n+                            return curNode;\n+                        }\n+                    }\n+                }\n+            }\n+            //3) carrier - get next point towards drop point (equal dist, get the one with most allies, random if none)\n+            for (TeamId teamId : { TEAM_ALLIANCE, TEAM_HORDE })\n+            {\n+                if (myTeamId != teamId)\n+                    continue;\n+\n+                if (ey->GetFlagPickerGUID() == me->GetGUID())\n+                {\n+                    WanderNode const* dropPoint = nullptr;\n+                    NodeList dropPoints;\n+                    WanderNode::DoForAllMapWPs(bg->GetMapId(), [&dropPoints](WanderNode const* dwp) {\n+                        if (dwp->HasFlag(BotWPFlags::BOTWP_FLAG_BG_FLAG_DELIVER_TARGET))\n+                            dropPoints.push_back(dwp);\n+                    });\n+                    std::vector<uint8> owned_points;\n+                    owned_points.reserve(EY_POINTS_MAX);\n+                    for (uint8 index : NPCBots::index_array<uint8, EY_POINTS_MAX>)\n+                        if (ey->GetPointOwner(index) == myTeamId)\n+                            owned_points.push_back(index);\n+                    uint8 targetPoint = EY_POINTS_MAX;\n+                    if (!owned_points.empty())\n+                    {\n+                        for (uint8 owned_point : owned_points)\n+                            for (WanderNode const* dwp : dropPoints)\n+                                if (dwp->GetExactDist2dSq(BG_EY_TriggerPositions[owned_point][0]) < std::pow(INTERACTION_DISTANCE, 2.f) && curNode->HasLink(dwp))\n+                                    return dwp;\n+                        targetPoint = owned_points.size() == 1u ? owned_points.front() : Bcore::Containers::SelectRandomContainerElement(owned_points);\n+                    }\n+                    if (targetPoint >= EY_POINTS_MAX)\n+                    {\n+                        int8 maxAllies = 0;\n+                        for (uint8 index : NPCBots::index_array<uint8, EY_POINTS_MAX>)\n+                        {\n+                            int8 alliesCount = ey->GetPlayersCountNearPoint(index, myTeamId);\n+                            if (maxAllies < alliesCount)\n+                            {\n+                                maxAllies = alliesCount;\n+                                targetPoint = index;\n+                            }\n+                        }\n+                    }\n+                    if (targetPoint < EY_POINTS_MAX)\n+                    {\n+                        for (WanderNode const* dwp : dropPoints)\n+                        {\n+                            if (dwp->GetExactDist2dSq(BG_EY_TriggerPositions[targetPoint][0]) < std::pow(INTERACTION_DISTANCE, 2.f))\n+                            {\n+                                dropPoint = dwp;\n+                                break;\n+                            }\n+                        }\n+                    }\n+                    if (!dropPoint)\n+                        dropPoint = Bcore::Containers::SelectRandomContainerElement(dropPoints);\n+                    NodeLinkList dlinks = curNode->GetShortestPathLinks(dropPoint, links);\n+                    if (!dlinks.empty())\n+                    {\n+                        //BOT_LOG_DEBUG(\"npcbots\", \"Bot {} {} team {} GOT A FLAG and goes for EY point {}! Cur node: {} {}\",\n+                        //    me->GetName(), me->GetEntry(), uint32(myTeamId), dropPoint->GetName(), curNode->GetWPId(), curNode->GetName());\n+                        return dlinks.size() == 1u ? dlinks.front().wp : Bcore::Containers::SelectRandomWeightedContainerElement(dlinks, LinkWeightExtractor())->wp;\n+                    }\n+                }\n+            }\n+            //4) at least one bot should camp the flag point for recapture\n+            for (TeamId teamId : { TEAM_ALLIANCE, TEAM_HORDE })\n+            {\n+                if (myTeamId != teamId)\n+                    continue;\n+\n+                WanderNode const* flagWP = WanderNode::FindInMapWPs(me->GetMapId(), [](WanderNode const* mwp) { return mwp->HasFlag(BotWPFlags::BOTWP_FLAG_BG_FLAG_PICKUP_TARGET); });\n+                if (flagWP)\n+                {\n+                    bool has_attacker = std::ranges::any_of(team_members, [=, this](Unit const* m) {\n+                        WanderNode const* mn = m->IsNPCBot() ? m->ToCreature()->GetBotAI()->_travel_node_cur : nullptr;\n+                        return (m != me && ((std::fabs(m->m_positionZ - flagWP->m_positionZ) < 15.f && m->GetExactDist2d(flagWP) < 35.f) ||\n+                            (mn && (mn == flagWP || (mn->HasLink(flagWP) && mn->GetExactDist2d(flagWP) < me->GetExactDist2d(flagWP))))));\n+                    });\n+                    if (!has_attacker)\n+                    {\n+                        NodeLinkList flinks = curNode->GetShortestPathLinks(flagWP, links);\n+                        if (!flinks.empty())\n+                        {\n+                            //BOT_LOG_DEBUG(\"npcbots\", \"Bot {} {} team {} goes for EY FLAG POINT at {}! Cur node: {} {}\",\n+                            //    me->GetName(), me->GetEntry(), uint32(myTeamId), flagWP->GetName(), curNode->GetWPId(), curNode->GetName());\n+                            return flinks.size() == 1u ? flinks.front().wp : Bcore::Containers::SelectRandomWeightedContainerElement(flinks, LinkWeightExtractor())->wp;\n+                        }\n+                    }\n+                }\n+            }\n+            //5) all bases controlled - lock enemy team on their spawn (go for interception wp)\n+            //6) closest (linked) point is not controlled - go there, otherwise find all non-captured bases and select one (max 2 per base), closest to me or farthest from spawn\n+            for (TeamId teamId : { TEAM_ALLIANCE, TEAM_HORDE })\n+            {\n+                if (myTeamId != teamId)\n+                    continue;\n+\n+                uint8 unowned_points_mask = 0;\n+                for (uint8 index : NPCBots::index_array<uint8, EY_POINTS_MAX>)\n+                    if (ey->GetPointOwner(index) != myTeamId)\n+                        unowned_points_mask |= static_cast<uint8>(1u << index);\n+                if (unowned_points_mask)\n+                {\n+                    WanderNode const* lockWP = WanderNode::FindInMapWPs(me->GetMapId(), [=](WanderNode const* mwp) {\n+                        return mwp->HasAllFlags(myTeamId == TEAM_ALLIANCE ? BotWPFlags::BOTWP_FLAG_SPAWN_INTERCEPT_ALLIANCE : BotWPFlags::BOTWP_FLAG_SPAWN_INTERCEPT_HORDE);\n+                    });\n+                    if (lockWP)\n+                    {\n+                        NodeLinkList llinks = curNode->GetShortestPathLinks(lockWP, links);\n+                        if (!llinks.empty())\n+                        {\n+                            //BOT_LOG_DEBUG(\"npcbots\", \"Bot {} {} team {} goes for EY PIN at {}! Cur node: {} {}\",\n+                            //    me->GetName(), me->GetEntry(), uint32(myTeamId), lockWP->GetName(), curNode->GetWPId(), curNode->GetName());\n+                            return llinks.size() == 1u ? llinks.front().wp : Bcore::Containers::SelectRandomWeightedContainerElement(llinks, LinkWeightExtractor())->wp;\n+                        }\n+                    }\n+                }\n+\n+                decltype(unowned_points_mask) attackable_points_mask = 0;\n+                for (uint8 index : NPCBots::index_array<uint8, EY_POINTS_MAX>)\n+                {\n+                    if (!((1u << index) & unowned_points_mask))\n+                        continue;\n+                    uint8 attackers_count = std::ranges::count_if(team_members, [=, this](Unit const* m) {\n+                        return (m != me && (m->GetExactDist2dSq(BG_EY_TriggerPositions[index][0], BG_EY_TriggerPositions[index][1]) < std::pow(static_cast<float>(BG_EY_POINT_RADIUS), 2.f) * 0.5f ||\n+                            (m->IsNPCBot() && m->GetExactDist2dSq(BG_EY_TriggerPositions[index][0], BG_EY_TriggerPositions[index][1]) < me->GetExactDist2d(BG_EY_TriggerPositions[index][0], BG_EY_TriggerPositions[index][1]))));\n+                    });\n+                    if (attackers_count < uint8(team_members.size() / 5u + 1u))\n+                        attackable_points_mask |= static_cast<uint8>(1u << index);\n+                }\n+                NodeList attackableWPs;\n+                WanderNode::DoForAllMapWPs(bg->GetMapId(), [&attackableWPs](WanderNode const* dwp) {\n+                    if (dwp->HasFlag(BotWPFlags::BOTWP_FLAG_BG_FLAG_DELIVER_TARGET))\n+                        attackableWPs.push_back(dwp);\n+                });\n+                Position const* fromPos;\n+                if (attackable_points_mask)\n+                {\n+                    for (uint8 index : NPCBots::index_array<uint8, EY_POINTS_MAX>)\n+                    {\n+                        if (!((1u << index) & attackable_points_mask))\n+                            continue;\n+                        for (WanderNode const* awp : attackableWPs)\n+                            if (awp->GetExactDist2dSq(BG_EY_TriggerPositions[index][0]) < std::pow(INTERACTION_DISTANCE, 2.f) && curNode->HasLink(awp))\n+                                return awp;\n+                    }\n+                    fromPos = me;\n+                }\n+                else\n+                    fromPos = WanderNode::FindInMapWPs(me->GetMapId(), [](WanderNode const* mwp) { return mwp->HasAllFlags(BotWPFlags::BOTWP_FLAG_ALLIANCE_SPAWN_POINT); });\n+                uint8 target_point = EY_POINTS_MAX;\n+                if (fromPos)\n+                {\n+                    float maxdist = 0.0f;\n+                    float dist2dsq;\n+                    for (uint8 index : NPCBots::index_array<uint8, EY_POINTS_MAX>)\n+                    {\n+                        if (!((1u << index) & attackable_points_mask))\n+                            continue;\n+                        dist2dsq = fromPos->GetExactDist2dSq(BG_EY_TriggerPositions[index][0], BG_EY_TriggerPositions[index][1]);\n+                        if (dist2dsq > maxdist)\n+                        {\n+                            maxdist = dist2dsq;\n+                            target_point = index;\n+                        }\n+                    }\n+                    if (target_point >= EY_POINTS_MAX)\n+                    {\n+                        maxdist = 0.0f;\n+                        for (uint8 index : NPCBots::index_array<uint8, EY_POINTS_MAX>)\n+                        {\n+                            if (!((1u << index) & unowned_points_mask))\n+                                continue;\n+                            dist2dsq = fromPos->GetExactDist2dSq(BG_EY_TriggerPositions[index][0], BG_EY_TriggerPositions[index][1]);\n+                            if (dist2dsq > maxdist)\n+                            {\n+                                maxdist = dist2dsq;\n+                                target_point = index;\n+                            }\n+                        }\n+                    }\n+                }\n+                if (target_point != EY_POINTS_MAX)\n+                {\n+                    for (WanderNode const* awp : attackableWPs)\n+                    {\n+                        if (awp->GetExactDist2dSq(BG_EY_TriggerPositions[target_point][0]) < std::pow(INTERACTION_DISTANCE, 2.f))\n+                        {\n+                            NodeLinkList alinks = curNode->GetShortestPathLinks(awp, links);\n+                            if (!alinks.empty())\n+                                return alinks.size() == 1u ? alinks.front().wp : Bcore::Containers::SelectRandomWeightedContainerElement(alinks, LinkWeightExtractor())->wp;\n+                        }\n+                    }\n+                }\n+            }\n+\n+            break;\n+        }\n+        default:\n+            break;\n+    }\n+\n+    //if (links.size() > 1)\n+    //{\n+    //    BOT_LOG_DEBUG(\"npcbots\", \"Bot {} {} team {} has no target point in BG_AB! Falling back to random ({} links)!. Cur node: {} {}\",\n+    //        me->GetName(), me->GetEntry(), uint32(myTeamId), uint32(curNode->GetLinks().size()), curNode->GetWPId(), curNode->GetName());\n+    //}\n+\n+    return nullptr;\n+}\n+\n+void bot_ai::OnWanderNodeReached()\n+{\n+    if (Battleground* bg = GetBG())\n+    {\n+        if (_travel_node_cur->HasFlag(BotWPFlags::BOTWP_FLAG_BG_FLAG_DELIVER_TARGET) && IsFlagCarrier(me, bg->GetBgTypeID()))\n+        {\n+            switch (bg->GetBgTypeID())\n+            {\n+                case BATTLEGROUND_WS:\n+                    if (bg->GetBotTeamId(me->GetGUID()) == TEAM_ALLIANCE && _travel_node_cur->HasFlag(BotWPFlags::BOTWP_FLAG_ALLIANCE_ONLY))\n+                        bg->HandleBotAreaTrigger(me, 3646);\n+                    if (bg->GetBotTeamId(me->GetGUID()) == TEAM_HORDE && _travel_node_cur->HasFlag(BotWPFlags::BOTWP_FLAG_HORDE_ONLY))\n+                        bg->HandleBotAreaTrigger(me, 3647);\n+                    break;\n+                case BATTLEGROUND_EY:\n+                {\n+                    const std::array dFlagTriggers{ AT_FEL_REAVER_POINT, AT_BLOOD_ELF_POINT, AT_DRAENEI_RUINS_POINT, AT_MAGE_TOWER_POINT };\n+                    const std::array index_range = NPCBots::index_array<uint8, EY_POINTS_MAX>;\n+                    auto cit = std::ranges::find_if(index_range, [this](uint8 index) { return me->GetExactDist2d(BG_EY_TriggerPositions[index][0], BG_EY_TriggerPositions[index][1]) < INTERACTION_DISTANCE; });\n+                    if (cit != index_range.cend())\n+                        bg->HandleBotAreaTrigger(me, dFlagTriggers[*cit]);\n+                    break;\n+                }\n+                default:\n+                    break;\n+            }\n+        }\n+        if (_travel_node_cur->HasFlag(BotWPFlags::BOTWP_FLAG_BG_FLAG_PICKUP_TARGET) && !IsFlagCarrier(me, bg->GetBgTypeID()))\n+        {\n+            switch (bg->GetBgTypeID())\n+            {\n+                case BATTLEGROUND_AV:\n+                {\n+                    GameObject* obj = nullptr;\n+\n+                    BattlegroundAV* av = dynamic_cast<BattlegroundAV*>(bg);\n+                    for (BG_AV_Nodes counter = BG_AV_NODES_FIRSTAID_STATION; counter < BG_AV_NODES_MAX; ++counter)\n+                    {\n+                        BG_AV_NodeInfo const& c = av->GetNodes()[counter];\n+                        if (c.State == BG_AV_States::POINT_DESTROYED)\n+                            continue;\n+                        if (c.State == BG_AV_States::POINT_NEUTRAL || c.OwnerId != bg->GetBotTeamId(me->GetGUID()))\n+                        {\n+                            uint32 node_type = av->GetObjectThroughNodeForBot(counter);\n+                            GameObject* go = bg->BgObjects[node_type] ? bg->GetBGObject(node_type) : nullptr;\n+                            if (go && me->IsWithinDistInMap(go, 10.0f))\n+                            {\n+                                obj = go;\n+                                break;\n+                            }\n+                        }\n+                    }\n+\n+                    if (!obj)\n+                        break;\n+\n+                    bool already_used = false;\n+                    for (Unit const* member : BotMgr::GetAllGroupMembers(me))\n+                    {\n+                        if (member->GetGUID() == me->GetGUID())\n+                            continue;\n+                        if (Spell const* curSpell = member->GetCurrentSpell(CURRENT_GENERIC_SPELL))\n+                        {\n+                            if (curSpell->m_spellInfo->Id == OPEN_FLAG_BG && curSpell->m_targets.GetGOTargetGUID() == obj->GetGUID())\n+                            {\n+                                already_used = true;\n+                                break;\n+                            }\n+                        }\n+                    }\n+                    if (already_used)\n+                        break;\n+\n+                    //BOT_LOG_ERROR(\"npcbots\", \"OnWanderNodeReached: [AV] Bot %s USES flag %s at node %u\", me->GetName().c_str(), obj->GetName().c_str(), node);\n+\n+                    if (me->IsMounted())\n+                        DismountBot();\n+                    me->CastSpell(obj, OPEN_FLAG_BG, false);\n+\n+                    break;\n+                }\n+                case BATTLEGROUND_WS:\n+                {\n+                    if (bg->GetBotTeamId(me->GetGUID()) == TEAM_ALLIANCE && _travel_node_cur->HasFlag(BotWPFlags::BOTWP_FLAG_HORDE_ONLY))\n+                    {\n+                        if (GameObject* go = bg->GetBGObject(BG_WS_OBJECT_H_FLAG))\n+                        {\n+                            //BOT_LOG_ERROR(\"npcbots\", \"OnWanderNodeReached: [WSG] Horde flag dist: %f\", me->GetExactDist(go));\n+                            if (me->IsMounted())\n+                                DismountBot();\n+                            bg->EventBotClickedOnFlag(me, go);\n+                        }\n+                    }\n+                    if (bg->GetBotTeamId(me->GetGUID()) == TEAM_HORDE && _travel_node_cur->HasFlag(BotWPFlags::BOTWP_FLAG_ALLIANCE_ONLY))\n+                    {\n+                        if (GameObject* go = bg->GetBGObject(BG_WS_OBJECT_A_FLAG))\n+                        {\n+                            //BOT_LOG_ERROR(\"npcbots\", \"OnWanderNodeReached: [WSG] Alliance flag dist: %f\", me->GetExactDist(go));\n+                            if (me->IsMounted())\n+                                DismountBot();\n+                            bg->EventBotClickedOnFlag(me, go);\n+                        }\n+                    }\n+                    break;\n+                }\n+                case BATTLEGROUND_AB:\n+                {\n+                    uint8 node = BG_AB_NODE_STABLES;\n+                    GameObject* obj = bg->GetBGObject(node*8+BG_AB_OBJECT_BANNER_NEUTRAL);\n+                    while (node < BG_AB_DYNAMIC_NODES_COUNT && (!obj || !me->IsWithinDistInMap(obj, 10.0f)))\n+                    {\n+                        ++node;\n+                        obj = bg->GetBGObject(node*8+BG_AB_OBJECT_BANNER_NEUTRAL);\n+                    }\n+                    if (node < BG_AB_DYNAMIC_NODES_COUNT)\n+                    {\n+                        TeamId teamId = bg->GetBotTeamId(me->GetGUID());\n+                        BattlegroundAB const* bgab = dynamic_cast<BattlegroundAB const*>(bg);\n+\n+                        if (bgab->IsNodeOccupied(node, teamId) || bgab->IsNodeContested(node, teamId))\n+                            break;\n+\n+                        //at this point node is either neutral or owned/contested by other team\n+                        uint8 new_bg_obj_type;\n+                        if (bgab->IsNodeOccupied(node, bg->GetOtherTeamId(teamId)))\n+                            new_bg_obj_type = BG_AB_OBJECT_BANNER_HORDE;\n+                        else if (bgab->IsNodeContested(node, bg->GetOtherTeamId(teamId)))\n+                            new_bg_obj_type = BG_AB_OBJECT_BANNER_CONT_H;\n+                        else\n+                            new_bg_obj_type = BG_AB_OBJECT_BANNER_NEUTRAL;\n+\n+                        obj = ASSERT_NOTNULL(bg->GetBGObject(node*8+new_bg_obj_type));\n+\n+                        bool already_used = false;\n+                        for (Unit const* member : BotMgr::GetAllGroupMembers(me))\n+                        {\n+                            if (member->GetGUID() == me->GetGUID())\n+                                continue;\n+                            if (Spell const* curSpell = member->GetCurrentSpell(CURRENT_GENERIC_SPELL))\n+                            {\n+                                if (curSpell->m_spellInfo->Id == OPEN_FLAG_BG && curSpell->m_targets.GetGOTargetGUID() == obj->GetGUID())\n+                                {\n+                                    already_used = true;\n+                                    break;\n+                                }\n+                            }\n+                        }\n+                        if (already_used)\n+                            break;\n+\n+                        //BOT_LOG_ERROR(\"npcbots\", \"OnWanderNodeReached: [AB] Bot {} USES flag {} at node {}\", me->GetName(), obj->GetName(), uint32(node));\n+                        if (me->IsMounted())\n+                            DismountBot();\n+                        me->CastSpell(obj, OPEN_FLAG_BG, false);\n+                    }\n+                    break;\n+                }\n+                case BATTLEGROUND_EY:\n+                {\n+                    GameObject* obj = bg->GetBGObject(BG_EY_OBJECT_FLAG_NETHERSTORM);\n+                    if (obj && obj->IsInWorld() && obj->isSpawned() && obj->GetGoState() == GO_STATE_READY)\n+                    {\n+                        bool already_used = std::ranges::any_of(BotMgr::GetAllGroupMembers(me), [=, this](Unit const* member) {\n+                            if (member == me)\n+                                return false;\n+                            Spell const* curSpell = member->GetCurrentSpell(CURRENT_GENERIC_SPELL);\n+                            return  curSpell && curSpell->m_spellInfo->Id == OPEN_FLAG_BG && curSpell->m_targets.GetGOTargetGUID() == obj->GetGUID();\n+                        });\n+                        if (already_used)\n+                            break;\n+                        //BOT_LOG_ERROR(\"npcbots\", \"OnWanderNodeReached: [EY] Bot {} USES flag {} at node {}\", me->GetName(), obj->GetName(), _travel_node_cur->GetWPId());\n+                        if (me->IsMounted())\n+                            DismountBot();\n+                        me->CastSpell(obj, OPEN_FLAG_BG, false);\n+                    }\n+                    break;\n+                }\n+                default:\n+                    break;\n+            }\n+        }\n+    }\n+}\n+\n+void bot_ai::OnBotEnterBattleground()\n+{\n+    Battleground* bg = ASSERT_NOTNULL(GetBG());\n+\n+    if (bg->GetStatus() != STATUS_IN_PROGRESS && IsWanderer())\n+    {\n+        BotWPFlags myTeamSpawnFlags;\n+        if (bg->isArena())\n+            myTeamSpawnFlags = BotWPFlags::BOTWP_FLAG_SPAWN;\n+        else\n+        {\n+            switch (bg->GetBotTeamId(me->GetGUID()))\n+            {\n+                case TEAM_ALLIANCE: myTeamSpawnFlags = BotWPFlags::BOTWP_FLAG_ALLIANCE_SPAWN_POINT; break;\n+                case TEAM_HORDE:    myTeamSpawnFlags = BotWPFlags::BOTWP_FLAG_HORDE_SPAWN_POINT;    break;\n+                default:            myTeamSpawnFlags = BotWPFlags::BOTWP_FLAG_SPAWN;                break;\n+            }\n+        }\n+\n+        uint32 mapId = bg->GetBgMap()->GetId();\n+        float mindist = 50000.0f;\n+        WanderNode const* startNode = nullptr;\n+        WanderNode::DoForAllMapWPs(mapId, [pos = me->GetPosition(), spawnFlags = myTeamSpawnFlags, &mindist, &startNode](WanderNode const* wp) {\n+            if (wp->HasAllFlags(spawnFlags))\n+            {\n+                float dist = pos.GetExactDist2d(wp);\n+                if (dist < mindist)\n+                {\n+                    startNode = wp;\n+                    mindist = dist;\n+                }\n+            }\n+        });\n+\n+        SetBotCommandState(BOT_COMMAND_STAY);\n+        if (startNode)\n+        {\n+            if (TempSummon* wpc = me->GetMap()->SummonCreature(VISUAL_WAYPOINT, *startNode, nullptr, 1000))\n+            {\n+                wpc->SetTempSummonType(TEMPSUMMON_TIMED_DESPAWN);\n+                float angle = bg->GetBgTypeID() == BATTLEGROUND_WS ? frand(float(M_PI * 0.75), float(M_PI * 1.25)) : frand(0.001f, float(M_PI * 1.995));\n+                Position myStartPos = wpc->GetFirstCollisionPosition(bg->GetBgTypeID() == BATTLEGROUND_EY ? frand(6.0f, 8.0f) : frand(5.0f, 20.0f), angle);\n+                BotMovement(BOT_MOVE_POINT, &myStartPos);\n+            }\n+        }\n+    }\n+}\n+\n+void bot_ai::SetWanderer()\n+{\n+    if (IAmFree())\n+    {\n+        _wanderer = true;\n+        if (botPet)\n+            botPet->GetBotPetAI()->SetWanderer();\n+    }\n+}\n+\n+void bot_ai::KillEvents(bool force)\n+{\n+    Events.KillAllEvents(force);\n+}\n+\n+void bot_ai::OnBotEnterVehicle(Vehicle const* vehicle)\n+{\n+    if (VehicleSeatEntry const* seat = vehicle->GetSeatForPassenger(me))\n+    {\n+        if (seat->m_flags & VEHICLE_SEAT_FLAG_CAN_CONTROL)\n+        {\n+            vehicle->GetBase()->SetFaction(master->GetFaction());\n+            //vehicle->GetBase()->SetOwnerGUID(master->GetGUID());\n+            vehicle->GetBase()->SetCreator(master);\n+            vehicle->GetBase()->SetUnitFlag(UNIT_FLAG_POSSESSED);\n+            vehicle->GetBase()->SetUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED);\n+            vehicle->GetBase()->SetByteValue(UNIT_FIELD_BYTES_2, 1, master->GetByteValue(UNIT_FIELD_BYTES_2, 1));\n+            ASSERT(vehicle->GetBase()->SetCharmedBy(me, CHARM_TYPE_VEHICLE));\n+            vehicle->GetBase()->SetControlledByPlayer(true);\n+\n+            _vehcomboPoints = 0;\n+            //flight mode\n+            switch (vehicle->GetBase()->GetEntry())\n+            {\n+                case CREATURE_NEXUS_SKYTALON_1:\n+                case CREATURE_EOE_SKYTALON_N:\n+                case CREATURE_EOE_SKYTALON_H:\n+                case CREATURE_OCULUS_DRAKE_RUBY:\n+                case CREATURE_OCULUS_DRAKE_EMERALD:\n+                case CREATURE_OCULUS_DRAKE_AMBER:\n+                    UnsummonAll(false);\n+                    vehicle->GetBase()->SetCanFly(true);\n+                    vehicle->GetBase()->SetDisableGravity(true);\n+                    break;\n+                default:\n+                    break;\n+            }\n+        }\n+\n+        if (Unit* oVeh = master->GetVehicleBase())\n+        {\n+            CreatureTemplate const* vehTemplate = vehicle->GetBase()->IsCreature() ? vehicle->GetBase()->ToCreature()->GetCreatureTemplate() : nullptr;\n+            ////Set hp and mana percent to avoid abuse\n+            //vehicle->GetBase()->SetHealth(vehicle->GetBase()->GetMaxHealth() * oVeh->GetHealthPct() / 100.f + 0.5f);\n+            //if (oVeh->GetPowerType() == POWER_MANA)\n+            //{\n+            //    float mpPct = oVeh->GetPower(POWER_MANA) * 100.f / oVeh->GetMaxPower(POWER_MANA);\n+            //    vehicle->GetBase()->SetPower(POWER_MANA, vehicle->GetBase()->GetMaxPower(POWER_MANA) * mpPct / 100.f + 0.5f);\n+            //}\n+            //speed\n+            if (vehTemplate &&\n+                (vehTemplate->Movement.Flight == CreatureFlightMovementType::CanFly ||\n+                vehTemplate->Movement.Flight == CreatureFlightMovementType::DisableGravity))\n+            {\n+                //hack to use vehicle speed\n+                vehicle->GetBase()->RemoveAurasByType(SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED);\n+                vehicle->GetBase()->RemoveAurasByType(SPELL_AURA_MOD_FLIGHT_SPEED_NOT_STACKING);\n+                vehicle->GetBase()->RemoveAurasByType(SPELL_AURA_MOD_FLIGHT_SPEED_MOUNTED_NOT_STACKING);\n+                vehicle->GetBase()->RemoveAurasByType(SPELL_AURA_MOD_MOUNTED_SPEED_NOT_STACK);\n+                vehicle->GetBase()->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED, true);\n+                vehicle->GetBase()->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_FLIGHT_SPEED_NOT_STACKING, true);\n+                vehicle->GetBase()->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_FLIGHT_SPEED_MOUNTED_NOT_STACKING, true);\n+                vehicle->GetBase()->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_MOUNTED_SPEED_NOT_STACK, true);\n+                vehicle->GetBase()->SetSpeedRate(MOVE_FLIGHT, oVeh->GetSpeedRate(MOVE_FLIGHT) * 1.17f);\n+                vehicle->GetBase()->SetSpeedRate(MOVE_RUN, oVeh->GetSpeedRate(MOVE_FLIGHT) * 1.17f);\n+                vehicle->GetBase()->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_DECREASE_SPEED, true);\n+                vehicle->GetBase()->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_SPEED_SLOW_ALL, true);\n+            }\n+        }\n+    }\n+}\n+\n+void bot_ai::OnBotExitVehicle(Vehicle const* vehicle)\n+{\n+    if (VehicleSeatEntry const* seat = vehicle->GetSeatForPassenger(me))\n+    {\n+        if (seat->m_flags & VEHICLE_SEAT_FLAG_CAN_CONTROL)\n+        {\n+            vehicle->GetBase()->SetControlledByPlayer(false);\n+            vehicle->GetBase()->RemoveCharmedBy(me);\n+            vehicle->GetBase()->RestoreFaction();\n+            //vehicle->GetBase()->SetOwnerGUID(ObjectGuid::Empty);\n+            vehicle->GetBase()->SetCreator(nullptr);\n+            vehicle->GetBase()->RemoveUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED);\n+            if (vehicle->GetBase()->IsCreature())\n+                vehicle->GetBase()->RemoveUnitFlag(UNIT_FLAG_POSSESSED);\n+            vehicle->GetBase()->SetByteValue(UNIT_FIELD_BYTES_2, 1, 0);\n+\n+            _curVehStrat = BOT_VEH_STRAT_NONE;\n+            if (vehicle->GetBase()->IsSummon())\n+                vehicle->GetBase()->ToCreature()->DespawnOrUnsummon(1ms);\n+        }\n+    }\n+}\n+\n+void bot_ai::AfterBotOwnerEnterVehicle()\n+{\n+    if (!me->GetVehicle() && master->GetVehicleCreatureBase() && master->GetVehicleCreatureBase()->m_spells[0] &&\n+        master->GetVehicleBase()->IsControlledByPlayer())\n+    {\n+        VehicleSeatEntry const* seat = master->GetVehicle()->GetSeatForPassenger(master);\n+        if (seat && seat->CanEnterOrExit())\n+        {\n+            uint32 creEntry = 0;\n+            uint32 vehEntry;\n+\n+            ChooseVehicleForEncounter(creEntry, vehEntry);\n+            if (!creEntry)\n+            {\n+                BOT_LOG_DEBUG(\"scripts\", \"OnBotOwnerEnterVehicle: no vehicle selected for bot master veh {}!\",\n+                    master->GetVehicleCreatureBase()->GetName().c_str());\n+                return;\n+            }\n+            Unit* veh = SpawnVehicle(creEntry, vehEntry);\n+            ASSERT(veh);\n+\n+            removeShapeshiftForm();\n+            //me->BotStopMovement();\n+\n+            //DO NOT use spellclick here, this is undefined behaviour if target selection is not explicit\n+            //veh->HandleSpellClick(me);\n+            switch (creEntry) //select vehicle ride spell\n+            {\n+                //TODO\n+            case CREATURE_EOE_SKYTALON_N:\n+            case CREATURE_EOE_SKYTALON_H:\n+                me->CastSpell(veh, 56071); //Ride Red Dragon Buddy\n+                break;\n+            case CREATURE_OCULUS_DRAKE_RUBY:\n+            case CREATURE_OCULUS_DRAKE_EMERALD:\n+            case CREATURE_OCULUS_DRAKE_AMBER:\n+            {\n+                me->EnterVehicle(veh); //cannot cast ride spell (49464, 49346, 49460) due to targeting (TARGET_UNIT_NEARBY_ENTRY)\n+                //CastSpellExtraArgs args(true);\n+                //args.SetOriginalCaster(me->GetGUID());\n+                //veh->CastSpell(veh, 66667, args); //Gear Scaling\n+                veh->CastSpell(veh, 66667, true, nullptr, nullptr, me->GetGUID()); //Gear Scaling\n+                break;\n+            }\n+            //case CREATURE_TOC_STEED_QUELDOREI:\n+            //case CREATURE_TOC_NIGHTSABER:\n+            //case CREATURE_TOC_STEED_STORMWIND:\n+            //case CREATURE_TOC_MECHANOSTRIDER:\n+            //case CREATURE_TOC_RAM:\n+            //case CREATURE_TOC_ELEKK:\n+            //case CREATURE_TOC_HAWKSTRIDER_SUNREAVER:\n+            //case CREATURE_TOC_RAPTOR:\n+            //case CREATURE_TOC_WARHORSE:\n+            //case CREATURE_TOC_WOLF:\n+            //case CREATURE_TOC_HAWKSTRIDER_SILVERMOON:\n+            //case CREATURE_TOC_KODO:\n+            //    me->CastSpell(veh, 63151); //Ride Vehicle\n+            //    break;\n+            case CREATURE_TOC5_WARHORSE:\n+            case CREATURE_TOC5_BATTLEWORG:\n+                //me->CastSpell(veh, 67830); //Ride Vehicle\n+                me->EnterVehicleUnattackable(veh);\n+                break;\n+            default:\n+                me->EnterVehicle(veh);\n+                break;\n+            }\n+            return;\n+        }\n+    }\n+\n+    //BOT_LOG_ERROR(\"scripts\", \"OnBotOwnerEnterVehicle: master not in vehicle or no veh found for bot %s!\", me->GetName().c_str());\n+}\n+\n+void bot_ai::OnBotOwnerEnterVehicle(Vehicle const* /*vehicle*/)\n+{\n+    shouldEnterVehicle = true;\n+}\n+\n+void bot_ai::OnBotOwnerExitVehicle(Vehicle const* /*vehicle*/)\n+{\n+    shouldEnterVehicle = false;\n+    if (me->GetVehicle())\n+    {\n+        if (me->GetMapId() == 631) // Icecrown Citadel\n+        {\n+            me->ExitVehicle();\n+            me->BotStopMovement();\n+        }\n+    }\n+}\n+\n+Unit* bot_ai::SpawnVehicle(uint32 creEntry, uint32 vehEntry)\n+{\n+    ASSERT(sObjectMgr->GetCreatureTemplate(creEntry));\n+    if (vehEntry != 0)\n+        ASSERT(sVehicleStore.LookupEntry(vehEntry));\n+\n+    Map* map = me->GetMap();\n+    float x, y, z, o;\n+    TempSummon* vc;\n+    if (!me->GetTransport())\n+    {\n+        o = master->GetOrientation();\n+        me->GetClosePoint(x, y, z, me->GetCombatReach());\n+        vc = new TempSummon(nullptr, me->GetGUID());\n+        ASSERT(vc->Create(map->GenerateLowGuid<HighGuid::Unit>(), map, master->GetPhaseMask(), creEntry, vehEntry, x,y,z,o));\n+        vc->ClearZoneScript();\n+        vc->SetTempSummonType(TEMPSUMMON_CORPSE_DESPAWN);\n+        vc->InitStats(0);\n+        ASSERT(map->AddToMap(vc->ToCreature()));\n+        vc->InitSummon(); //not needed really\n+    }\n+    else\n+    {\n+        if (master->GetVehicle())\n+            o = master->GetVehicleBase()->GetTransOffsetO();\n+        else\n+            o = master->GetTransOffsetO();\n+        x = me->GetTransOffsetX();\n+        y = me->GetTransOffsetY();\n+        z = me->GetTransOffsetZ();\n+        Position vehpos(x, y, z, o);\n+        me->GetTransport()->CalculatePassengerPosition(x, y, z, &o);\n+        vc = new TempSummon(nullptr, me->GetGUID());\n+        ASSERT(vc->Create(map->GenerateLowGuid<HighGuid::Unit>(), map, master->GetPhaseMask(), creEntry, vehEntry, x,y,z,o));\n+        vc->ClearZoneScript();\n+\n+        //vc->SetTransport(me->GetTransport());\n+        //vc->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT);\n+        //vc->m_movementInfo.transport.guid = GetGUID();\n+        me->GetTransport()->AddPassenger(vc, true);\n+\n+        vc->m_movementInfo.transport.pos.Relocate(vehpos);\n+        vc->Relocate(x, y, z, o);\n+        vc->SetHomePosition(x, y, z, o);\n+        vc->SetTransportHomePosition(vehpos);\n+\n+        vc->AddUnitState(UNIT_STATE_IGNORE_PATHFINDING);\n+        vc->InitStats(0);\n+        ASSERT(map->AddToMap(vc->ToCreature()));\n+        vc->InitSummon(); //not needed really\n+        vc->SetTempSummonType(TEMPSUMMON_CORPSE_DESPAWN);\n+        //vc = me->GetTransport()->SummonPassenger(creEntry, vehpos, TEMPSUMMON_CORPSE_DESPAWN);\n+    }\n+\n+    return vc;\n+}\n+\n+void bot_ai::ChooseVehicleForEncounter(uint32 &creEntry, uint32 &vehEntry) const\n+{\n+    Vehicle* mVeh = master->GetVehicle();\n+    ASSERT_NODEBUGINFO(mVeh);\n+    ASSERT_NODEBUGINFO(mVeh->GetBase()->IsCreature());\n+\n+    vehEntry = 0; // will be chosen at creature spawn\n+    switch (mVeh->GetBase()->GetEntry())\n+    {\n+        //TODO\n+        case CREATURE_NEXUS_SKYTALON_1:\n+        case CREATURE_EOE_SKYTALON_N:\n+        case CREATURE_EOE_SKYTALON_H:\n+        case CREATURE_ULDUAR_DEMOLISHER:\n+        case CREATURE_ULDUAR_SIEGE_ENGINE:\n+        case CREATURE_ULDUAR_CHOPPER:\n+        case CREATURE_ULDUAR_CHOPPER1:\n+        //case CREATURE_TOC_STEED_QUELDOREI:\n+        //case CREATURE_TOC_HAWKSTRIDER_SUNREAVER:\n+        case CREATURE_TOC5_WARHORSE:\n+        case CREATURE_TOC5_BATTLEWORG:\n+            creEntry = mVeh->GetBase()->GetEntry();\n+            break;\n+        case CREATURE_OCULUS_DRAKE_RUBY:\n+        case CREATURE_OCULUS_DRAKE_EMERALD:\n+        case CREATURE_OCULUS_DRAKE_AMBER:\n+            creEntry = (HasRole(BOT_ROLE_TANK)/* && mVeh->GetBase()->GetEntry() != CREATURE_OCULUS_DRAKE_RUBY*/) ? CREATURE_OCULUS_DRAKE_RUBY :\n+                (HasRole(BOT_ROLE_HEAL)/* && mVeh->GetBase()->GetEntry() != CREATURE_OCULUS_DRAKE_EMERALD*/) ? CREATURE_OCULUS_DRAKE_EMERALD :\n+                CREATURE_OCULUS_DRAKE_AMBER;\n+            break;\n+        //case CREATURE_TOC_NIGHTSABER:\n+        //case CREATURE_TOC_STEED_STORMWIND:\n+        //case CREATURE_TOC_MECHANOSTRIDER:\n+        //case CREATURE_TOC_RAM:\n+        //case CREATURE_TOC_ELEKK:\n+        //case CREATURE_TOC_RAPTOR:\n+        //case CREATURE_TOC_WARHORSE:\n+        //case CREATURE_TOC_WOLF:\n+        //case CREATURE_TOC_HAWKSTRIDER_SILVERMOON:\n+        //case CREATURE_TOC_KODO:\n+        //    switch (GetPlayerRace())\n+        //    {\n+        //        case RACE_HUMAN:         creEntry = CREATURE_TOC_STEED_STORMWIND;        break;\n+        //        case RACE_ORC:           creEntry = CREATURE_TOC_WOLF;                   break;\n+        //        case RACE_DWARF:         creEntry = CREATURE_TOC_RAM;                    break;\n+        //        case RACE_NIGHTELF:      creEntry = CREATURE_TOC_NIGHTSABER;             break;\n+        //        case RACE_UNDEAD_PLAYER: creEntry = CREATURE_TOC_WARHORSE;               break;\n+        //        case RACE_TAUREN:        creEntry = CREATURE_TOC_KODO;                   break;\n+        //        case RACE_GNOME:         creEntry = CREATURE_TOC_MECHANOSTRIDER;         break;\n+        //        case RACE_TROLL:         creEntry = CREATURE_TOC_RAPTOR;                 break;\n+        //        case RACE_BLOODELF:      creEntry = CREATURE_TOC_HAWKSTRIDER_SILVERMOON; break;\n+        //        case RACE_DRAENEI:       creEntry = CREATURE_TOC_ELEKK;                  break;\n+        //        default:                 creEntry = CREATURE_TOC_STEED_QUELDOREI;        break;\n+        //    }\n+        //    break;\n+        case CREATURE_ICC_GUNSHIPCANNON_ALLIANCE:\n+        case CREATURE_ICC_GUNSHIPCANNON_HORDE:\n+            //limited amount of cannons\n+            if (!IsTank() && HasRole(BOT_ROLE_DPS) &&\n+                master->GetBotMgr()->GetNpcBotsCountByVehicleEntry(mVeh->GetBase()->GetEntry()) <\n+                std::max<uint8>(master->GetBotMgr()->GetNpcBotsCount() / 2, 8))\n+                creEntry = mVeh->GetBase()->GetEntry();\n+            break;\n+        case CREATURE_ICC_MUTATED_ABOMINATION1:\n+        case CREATURE_ICC_MUTATED_ABOMINATION2:\n+        case CREATURE_ICC_MUTATED_ABOMINATION3:\n+        case CREATURE_ICC_MUTATED_ABOMINATION4:\n+        case CREATURE_ICC_MUTATED_ABOMINATION5:\n+        case CREATURE_ICC_MUTATED_ABOMINATION6:\n+        case CREATURE_ICC_MUTATED_ABOMINATION7:\n+        case CREATURE_ICC_MUTATED_ABOMINATION8:\n+            //no abomination bots\n+            break;\n+        case CREATURE_GEARGRINDERS_JUMPBOT:\n+            //no jumpbot bots\n+            break;\n+        default:\n+            if (VehicleSeatEntry const* seat = mVeh->GetSeatForPassenger(master))\n+            {\n+                if (seat->m_flags & VEHICLE_SEAT_FLAG_CAN_CONTROL)\n+                {\n+                    //can use generic strat for that\n+                    creEntry = mVeh->GetBase()->GetEntry();\n+                    break;\n+                }\n+            }\n+\n+            BOT_LOG_ERROR(\"scripts\", \"ChooseVehicleForEncounter: unhandled master vehicle creature {} ({})\",\n+                master->GetVehicleBase()->GetName().c_str(), master->GetVehicleBase()->GetEntry());\n+            return;\n+    }\n+\n+    if (creEntry && creEntry != mVeh->GetBase()->GetEntry())\n+    {\n+        CreatureTemplate const* cProto = sObjectMgr->GetCreatureTemplate(creEntry);\n+        ASSERT_NODEBUGINFO(cProto);\n+        vehEntry = cProto->VehicleId;\n+        ASSERT_NODEBUGINFO(sVehicleStore.LookupEntry(vehEntry));\n+    }\n+}\n+\n+Position bot_ai::GetAbsoluteTransportPosition(WorldObject const* object)\n+{\n+    if (!object->GetTransport())\n+        return object->GetPosition();\n+\n+    Position p = object->GetTransport()->GetPosition();\n+    Position t = object->GetTransOffset();\n+    t.m_positionX += p.m_positionX;\n+    t.m_positionY += p.m_positionY;\n+    t.m_positionZ += p.m_positionZ;\n+    t.SetOrientation(Position::NormalizeOrientation(t.GetOrientation() + p.GetOrientation()));\n+\n+    return t;\n+}\n+\n+int32 bot_ai::GetBotResistanceBonus(SpellSchoolMask mask) const\n+{\n+    int32 resist = 0;\n+    for (uint8 i = SPELL_SCHOOL_HOLY; i != MAX_SPELL_SCHOOL; ++i)\n+        if ((mask & (1u << i)) && (resist == 0 || resist > resistbonus[i-1]))\n+            resist = resistbonus[i-1];\n+\n+    return resist;\n+}\n+\n+MeleeHitOutcome bot_ai::BotRollCustomMeleeOutcomeAgainst(Unit const* victim, WeaponAttackType attType) const\n+{\n+    if (GetNextAttackMeleeOutCome() != MELEE_HIT_CRUSHING)\n+        return GetNextAttackMeleeOutCome();\n+    return me->RollMeleeOutcomeAgainst(victim, attType);\n+}\n+\n+void bot_ai::BotJumpInPlaceInFrontOf(Position const* pos, float speedXY, float maxHeight)\n+{\n+    float sign = (me->GetPositionX() < pos->GetPositionX()) ? 1.f : -1.f;\n+    float x = me->GetPositionX() + 0.14f * sign;\n+    sign = (me->GetPositionY() < pos->GetPositionY()) ? 1.f : -1.f;\n+    float y = me->GetPositionY() + 0.14f * sign;\n+    float z = me->GetPositionZ() - 0.01f;\n+    //float floorz = Map::GetHeight(x, y, z, true, 5.f);\n+    speedXY = std::max<float>(speedXY, speedXY / me->m_modAttackSpeedPct[BASE_ATTACK]);\n+\n+    //me->AttackStop();\n+    //me->BotStopMovement();\n+    me->GetMotionMaster()->MoveJump(x, y, z, me->GetOrientation(), speedXY, maxHeight);\n+}\n+\n+void bot_ai::DismountBot()\n+{\n+    const_cast<CreatureTemplate*>(me->GetCreatureTemplate())->Movement.Flight = CreatureFlightMovementType::None;\n+    me->SetCanFly(false);\n+    me->m_movementInfo.RemoveMovementFlag(MOVEMENTFLAG_HOVER | MOVEMENTFLAG_CAN_FLY);\n+    me->SetDisableGravity(false);\n+    me->RemoveAurasByType(SPELL_AURA_MOUNTED);\n+    me->Dismount();\n+    me->BotStopMovement();\n+}\n+\n+//DPS TRACKER\n+uint32 bot_ai::GetDPSTaken(Unit const* u) const\n+{\n+    return IAmFree() ? 0 : master->GetBotMgr()->GetDPSTaken(u);\n+}\n+int32 bot_ai::GetHPSTaken(Unit const* u) const\n+{\n+    return IAmFree() ? 0 : master->GetBotMgr()->GetHPSTaken(u);\n+}\n+//Health per second\n+int32 bot_ai::GetHPS(Unit const* u) const\n+{\n+    return IAmFree() ? 0 : GetHPSTaken(u) - GetDPSTaken(u);\n+}\n+//Health percent per second\n+int32 bot_ai::GetHPPCTPS(Unit const* u) const\n+{\n+    return int32(GetHPS(u) * 100.f / float(u->GetMaxHealth()));\n+}\n+//%health unit is going to have after x ms\n+//0-100\n+uint8 bot_ai::GetExpectedHPPCT(Unit const* u, uint32 mseconds) const\n+{\n+    if (IAmFree())\n+        return GetHealthPCT(u);\n+\n+    int32 pct = int32(GetHealthPCT(u)) + int32(GetHPPCTPS(u) * (mseconds * 0.001f));\n+\n+    if (pct > 100)\n+        pct = 100;\n+    else if (pct < 0)\n+        pct = 0;\n+\n+    return uint8(pct);\n+}\n+\n+//Moved from header\n+bool bot_ai::IsChanneling(Unit const* u/* = nullptr*/) const\n+{\n+    if (!u)\n+        u = me;\n+    return u->GetCurrentSpell(CURRENT_CHANNELED_SPELL);\n+}\n+bool bot_ai::IsCasting(Unit const* u/* = nullptr*/) const\n+{\n+    if (!u)\n+        u = me;\n+    return (u->HasUnitState(UNIT_STATE_CASTING) || IsChanneling(u) || u->IsNonMeleeSpellCast(false, false, true, false, false));\n+}\n+bool bot_ai::JumpingFlyingOrFalling() const\n+{\n+    return JumpingOrFalling() || me->HasUnitMovementFlag(MOVEMENTFLAG_SPLINE_ELEVATION);\n+}\n+bool bot_ai::JumpingOrFalling() const\n+{\n+    return Jumping() || me->IsFalling() || me->HasUnitMovementFlag(MOVEMENTFLAG_PITCH_UP|MOVEMENTFLAG_PITCH_DOWN);\n+}\n+bool bot_ai::Jumping() const\n+{\n+    return me->HasUnitState(UNIT_STATE_JUMPING);\n+}\n+bool bot_ai::IsIndoors() const\n+{\n+    return indoorsTimer >= INOUTDOORS_ENSURE_TIMER && outdoorsTimer == 0;\n+}\n+bool bot_ai::IsOutdoors() const\n+{\n+    return outdoorsTimer >= INOUTDOORS_ENSURE_TIMER && indoorsTimer == 0;\n+}\n+bool bot_ai::IsInContactWithWater() const\n+{\n+    return me->IsInWorld() &&\n+        (me->GetMap()->GetLiquidData(me->GetPhaseMask(), me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetCollisionHeight(), MAP_LIQUID_TYPE_WATER | MAP_LIQUID_TYPE_OCEAN)\n+            .Status & MAP_LIQUID_STATUS_IN_CONTACT);\n+}\n+\n+bool bot_ai::IsTempBot() const\n+{\n+    return me->GetOriginalEntry() == BOT_ENTRY_MIRROR_IMAGE_BM;\n+}\n+\n+uint32 bot_ai::GetLostHP(Unit const* unit)\n+{\n+    return unit->GetMaxHealth() - unit->GetHealth();\n+}\n+uint8 bot_ai::GetHealthPCT(Unit const* u)\n+{\n+    if (!u || !u->IsAlive() || u->GetMaxHealth() <= 1)\n+        return 100;\n+    return uint8(((float(u->GetHealth()))/u->GetMaxHealth()) * 100);\n+}\n+uint8 bot_ai::GetManaPCT(Unit const* u)\n+{\n+    if (!u || !u->IsAlive() || u->GetMaxPower(POWER_MANA) <= 1)\n+        return 100;\n+    return (u->GetPower(POWER_MANA)*10/(1 + u->GetMaxPower(POWER_MANA)/10));\n+}\n+\n+MeleeHitOutcome bot_ai::GetNextAttackMeleeOutCome() const\n+{\n+    return MELEE_HIT_CRUSHING;\n+}\n+\n+uint8 bot_ai::GetBotStance() const\n+{\n+    return BOT_STANCE_NONE;\n+}\n+\n+uint8 bot_ai::GetPlayerClass() const\n+{\n+    return BotMgr::GetBotPlayerClass(_botclass);\n+}\n+uint8 bot_ai::GetPlayerRace() const\n+{\n+    return BotMgr::GetBotPlayerRace(_botclass, me->GetRace());\n+}\n+\n+uint8 bot_ai::GetBotComboPoints() const\n+{\n+    return me->GetVehicle() ? _vehcomboPoints : uint8(GetAIMiscValue(BOTAI_MISC_COMBO_POINTS));\n+}\n+\n+void bot_ai::SetAIMiscValue(uint32 data, uint32 value)\n+{\n+    if (data >= BOT_MISCVALUE_SAVED_FIRST && data <= BOT_MISCVALUE_SAVED_LAST)\n+    {\n+        //only if value changes (or doesn't exist)\n+        if (auto it = _botData->miscvalues.find(data); it == _botData->miscvalues.cend() || it->second != value)\n+        {\n+            _botData->miscvalues.insert_or_assign(data, value);\n+            _saveMiscValues = true;\n+        }\n+    }\n+}\n+\n+void bot_ai::ResetAllMiscValues()\n+{\n+    for (uint32 miscval = BOT_MISCVALUE_SAVED_FIRST; miscval <= BOT_MISCVALUE_SAVED_LAST; ++miscval)\n+    {\n+        switch (miscval)\n+        {\n+            case BOTAI_MISC_ENCHANT_IS_AUTO_MH:\n+            case BOTAI_MISC_ENCHANT_IS_AUTO_OH:\n+                SetAIMiscValue(miscval, uint32(true));\n+                break;\n+            case BOTAI_MISC_ENCHANT_TIMER_MH:\n+            case BOTAI_MISC_ENCHANT_TIMER_OH:\n+                SetAIMiscValue(miscval, uint32(1));\n+                break;\n+            case BOTAI_MISC_ENCHANT_CURRENT_MH:\n+            case BOTAI_MISC_ENCHANT_CURRENT_OH:\n+            case BOTAI_MISC_PET_TYPE:\n+            case BOTAI_MISC_AURA_TYPE:\n+                SetAIMiscValue(miscval, uint32(0));\n+                break;\n+            default:\n+                BOT_LOG_ERROR(\"npcbots\", \"ResetMiscValues: unknown saved miscvalue {} reset for bot {} (current: {})!\", miscval, me->GetEntry(), GetAIMiscValue(miscval));\n+                SetAIMiscValue(miscval, uint32(0));\n+                break;\n+        }\n+    }\n+\n+    _botData->miscvalues.clear();\n+    _saveMiscValues = true;\n+}\n+\n+void bot_ai::InitMiscValues()\n+{\n+    for (auto const& p : _botData->miscvalues)\n+        SetAIMiscValue(p.first, p.second);\n+}\n+\n+float bot_ai::GetBotAmmoDPS() const\n+{\n+    if (CanUseAmmo())\n+    {\n+        for (auto i : NPCBots::index_array<uint8, MAX_AMMO_LEVEL>)\n+            if (me->GetLevel() >= AmmoDPSForLevel[i][0])\n+                return static_cast<float>(AmmoDPSForLevel[i][1]);\n+\n+        return static_cast<float>(AmmoDPSForLevel[0][1]);\n+    }\n+\n+    return 0.0f;\n+}\n+\n+uint32 bot_ai::GetPetOriginalEntry(uint32 entry)\n+{\n+    switch (entry)\n+    {\n+        case BOT_PET_IMP:\n+            return ORIGINAL_ENTRY_IMP;\n+        case BOT_PET_VOIDWALKER:\n+            return ORIGINAL_ENTRY_VOIDWALKER;\n+        case BOT_PET_SUCCUBUS:\n+            return ORIGINAL_ENTRY_SUCCUBUS;\n+        case BOT_PET_FELHUNTER:\n+            return ORIGINAL_ENTRY_FELHUNTER;\n+        case BOT_PET_FELGUARD:\n+            return ORIGINAL_ENTRY_FELGUARD;\n+        case BOT_PET_WATER_ELEMENTAL:\n+            return ORIGINAL_ENTRY_WATER_ELEMENTAL;\n+        case BOT_PET_GHOUL:\n+            //doesn't have pet template\n+            //return ORIGINAL_ENTRY_GHOUL;\n+        case BOT_PET_SHADOWFIEND:\n+            //return ORIGINAL_ENTRY_SHADOWFIEND;\n+        case BOT_PET_SPIRIT_WOLF:\n+            //return ORIGINAL_ENTRY_SPIRIT_WOLF;\n+        case BOT_PET_FORCE_OF_NATURE:\n+            //return ORIGINAL_ENTRY_FORCE_OF_NATURE;\n+        default:\n+            return ORIGINAL_ENTRY_HUNTER_PET;\n+    }\n+}\n+\n+bool bot_ai::IsPetMelee(uint32 entry)\n+{\n+    switch (entry)\n+    {\n+        case BOT_PET_IMP:\n+        case BOT_PET_WATER_ELEMENTAL:\n+        case BOT_PET_AWATER_ELEMENTAL:\n+            return false;\n+        default:\n+            return true;\n+    }\n+}\n+\n+bool bot_ai::IsMeleeClass(uint8 m_class)\n+{\n+    return IsBotClassMask(m_class, MELEE_BOT_CLASSES_MASK);\n+}\n+bool bot_ai::IsTankingClass(uint8 m_class)\n+{\n+    return IsBotClassMask(m_class, TANKING_BOT_CLASSES_MASK);\n+}\n+bool bot_ai::IsBlockingClass(uint8 m_class)\n+{\n+    return IsBotClassMask(m_class, BLOCKING_BOT_CLASSES_MASK);\n+}\n+bool bot_ai::IsCastingClass(uint8 m_class)\n+{\n+    //Class can benefit from spellpower\n+    return IsBotClassMask(m_class, CASTING_BOT_CLASSES_MASK);\n+}\n+bool bot_ai::IsHealingClass(uint8 m_class)\n+{\n+    return IsBotClassMask(m_class, HEALING_BOT_CLASSES_MASK);\n+}\n+bool bot_ai::IsHumanoidClass(uint8 m_class)\n+{\n+    return IsBotClassMask(m_class, HUMANOID_BOT_CLASSES_MASK);\n+}\n+bool bot_ai::IsHeroExClass(uint8 m_class)\n+{\n+    return IsBotClassMask(m_class, HERO_BOT_CLASSES_MASK);\n+}\n+bool bot_ai::IsMelee() const\n+{\n+    return !IsRanged() && HasRole(BOT_ROLE_DPS|BOT_ROLE_TANK);\n+}\n+bool bot_ai::IsRanged() const\n+{\n+    return HasRole(BOT_ROLE_RANGED) || HasVehicleRoleOverride(BOT_ROLE_RANGED);\n+}\n+\n+bool bot_ai::IsShootingWand(Unit const* u) const\n+{\n+    if (!u) u = me;\n+\n+    Spell const* spell = u->GetCurrentSpell(CURRENT_AUTOREPEAT_SPELL);\n+    return spell && spell->GetSpellInfo()->Id == SHOOT_WAND;\n+}\n+\n+void bot_ai::StartPotionTimer()\n+{\n+    _potionTimer = POTION_CD * (BotMgr::IsWanderingWorldBot(me) ? std::max<uint32>(uint32(Rand()) >> 3, 1u) : 1u);\n+}\n+\n+bool bot_ai::CanBlock() const\n+{\n+    return me->CanUseAttackType(OFF_ATTACK) &&\n+        (_botclass == BOT_CLASS_SPELLBREAKER || !(me->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_NO_BLOCK));\n+}\n+bool bot_ai::CanParry() const\n+{\n+    if (me->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID) && me->CanUseAttackType(BASE_ATTACK))\n+    {\n+        switch (_botclass)\n+        {\n+            case BOT_CLASS_SPHYNX:\n+            case BOT_CLASS_SPELLBREAKER:\n+            case BOT_CLASS_SEA_WITCH:\n+                return true;\n+            case BOT_CLASS_WARRIOR:\n+            case BOT_CLASS_PALADIN:\n+            case BOT_CLASS_ROGUE:\n+            case BOT_CLASS_HUNTER:\n+                return me->GetLevel() >= 10;\n+            case BOT_CLASS_SHAMAN:\n+                return me->GetLevel() >= 30;\n+            case BOT_CLASS_DEATH_KNIGHT:\n+                return me->GetLevel() >= 55;\n+            default:\n+                break;\n+        }\n+    }\n+    return false;\n+}\n+bool bot_ai::CanDodge() const\n+{\n+    return _botclass != BOT_CLASS_BM;\n+}\n+bool bot_ai::CanCrit() const\n+{\n+    return _botclass != BOT_CLASS_BM;\n+}\n+bool bot_ai::CanMiss() const\n+{\n+    return _botclass < BOT_CLASS_EX_START;\n+}\n+bool bot_ai::CanSheath() const\n+{\n+    return _botclass < BOT_CLASS_EX_START;\n+}\n+bool bot_ai::CanSit() const\n+{\n+    return _botclass < BOT_CLASS_EX_START || _botclass == BOT_CLASS_DARK_RANGER;\n+}\n+bool bot_ai::CanEat() const\n+{\n+    return _botclass != BOT_CLASS_SPHYNX;\n+}\n+bool bot_ai::CanDrink() const\n+{\n+    return _botclass < BOT_CLASS_EX_START;\n+}\n+bool bot_ai::CanRegenInCombat() const\n+{\n+    return _botclass == BOT_CLASS_SPHYNX;\n+}\n+bool bot_ai::CanMount() const\n+{\n+    switch (_botclass)\n+    {\n+        case BOT_CLASS_BM:\n+        case BOT_CLASS_SPELLBREAKER:\n+        case BOT_CLASS_DARK_RANGER:\n+        case BOT_CLASS_NECROMANCER:\n+            return true;\n+        default:\n+            return _botclass < BOT_CLASS_EX_START;\n+    }\n+}\n+bool bot_ai::CanUseAmmo() const\n+{\n+    if ((_botclass == BOT_CLASS_HUNTER || _botclass == BOT_CLASS_ROGUE ||\n+        _botclass == BOT_CLASS_WARRIOR || _botclass == BOT_CLASS_DARK_RANGER ||\n+        _botclass == BOT_CLASS_SEA_WITCH) &&\n+        _equips[BOT_SLOT_RANGED])\n+    {\n+        ItemTemplate const* ranged = _equips[BOT_SLOT_RANGED]->GetTemplate();\n+        if (ranged->Class == ITEM_CLASS_WEAPON &&\n+            (ranged->SubClass == ITEM_SUBCLASS_WEAPON_BOW ||\n+            ranged->SubClass == ITEM_SUBCLASS_WEAPON_CROSSBOW ||\n+            ranged->SubClass == ITEM_SUBCLASS_WEAPON_GUN))\n+            return true;\n+    }\n+    return false;\n+}\n+\n+bool bot_ai::RespectEquipsAttackTime() const\n+{\n+    return _botclass < BOT_CLASS_EX_START;\n+}\n+bool bot_ai::CanChangeEquip(uint8 slot) const\n+{\n+    return (_botclass != BOT_CLASS_BM && _botclass != BOT_CLASS_ARCHMAGE &&\n+        _botclass != BOT_CLASS_DREADLORD && _botclass != BOT_CLASS_SPELLBREAKER &&\n+        _botclass != BOT_CLASS_DARK_RANGER && _botclass != BOT_CLASS_NECROMANCER &&\n+        _botclass != BOT_CLASS_SEA_WITCH && _botclass != BOT_CLASS_CRYPT_LORD) ||\n+        slot > BOT_SLOT_RANGED;\n+}\n+bool bot_ai::CanDisplayNonWeaponEquipmentChanges() const\n+{\n+    return (_botclass < BOT_CLASS_EX_START || _botclass == BOT_CLASS_ARCHMAGE);\n+}\n+bool bot_ai::IsValidTransmog(uint8 slot, ItemTemplate const* source) const\n+{\n+    ASSERT(slot < BOT_TRANSMOG_INVENTORY_SIZE);\n+\n+    if (!CanChangeEquip(slot))\n+        return false;\n+\n+    Item const* item = _equips[slot];\n+    if (!item)\n+        return false;\n+\n+    ItemTemplate const* target = item->GetTemplate();\n+\n+    if (target->ItemId == source->ItemId)\n+        return false;\n+    if (target->Class != source->Class)\n+        return false;\n+\n+    switch (target->InventoryType)\n+    {\n+        case INVTYPE_RELIC:\n+        case INVTYPE_NECK:\n+        case INVTYPE_FINGER:\n+        case INVTYPE_TRINKET:\n+        case INVTYPE_THROWN:\n+            return false;\n+        default:\n+            break;\n+    }\n+    switch (source->InventoryType)\n+    {\n+        case INVTYPE_RELIC:\n+        case INVTYPE_NECK:\n+        case INVTYPE_FINGER:\n+        case INVTYPE_TRINKET:\n+        case INVTYPE_THROWN:\n+        case INVTYPE_BAG:\n+        case INVTYPE_AMMO:\n+        case INVTYPE_QUIVER:\n+        case INVTYPE_NON_EQUIP:\n+            return false;\n+        default:\n+            break;\n+    }\n+\n+    if (target->SubClass != source->SubClass)\n+    {\n+        if (target->Class == ITEM_CLASS_WEAPON && !BotCfg::MixWeaponClasses())\n+            return false;\n+        if (target->Class == ITEM_CLASS_ARMOR && !BotCfg::MixArmorClasses())\n+            return false;\n+    }\n+\n+    if (target->InventoryType != source->InventoryType)\n+    {\n+        if (target->Class == ITEM_CLASS_ARMOR)\n+        {\n+            if (!((target->InventoryType == INVTYPE_ROBE || target->InventoryType == INVTYPE_CHEST) &&\n+                (source->InventoryType == INVTYPE_ROBE || source->InventoryType == INVTYPE_CHEST)))\n+                return false;\n+        }\n+        if (target->Class == ITEM_CLASS_WEAPON && !BotCfg::MixWeaponInventoryTypes())\n+            return false;\n+    }\n+\n+    NpcBotTransmogData const* transmogData = BotDataMgr::SelectNpcBotTransmogs(me->GetEntry());\n+    if (transmogData && transmogData->transmogs[slot].second == int32(source->ItemId))\n+        return false;\n+\n+    return true;\n+}\n+\n+//bool bot_ai::OnGossipHello(Player* player)\n+//{\n+//    return OnGossipHello(player, 0);\n+//}\n+//bool bot_ai::OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId)\n+//{\n+//    uint32 sender = player->PlayerTalkClass->GetGossipOptionSender(gossipListId);\n+//    uint32 action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);\n+//    return OnGossipSelect(player, me, sender, action);\n+//}\n+//bool bot_ai::OnGossipSelectCode(Player* player, uint32 /*menuId*/, uint32 gossipListId, char const* code)\n+//{\n+//    uint32 sender = player->PlayerTalkClass->GetGossipOptionSender(gossipListId);\n+//    uint32 action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);\n+//    return OnGossipSelectCode(player, me, sender, action, code);\n+//}\n+\n+bool bot_ai::IsDamagingSpell(SpellInfo const* spellInfo)\n+{\n+    for (auto i : NPCBots::index_array<uint8, MAX_SPELL_EFFECTS>)\n+    {\n+        if (spellInfo->Effects[i].IsEffect())\n+        {\n+            switch (spellInfo->Effects[i].Effect)\n+            {\n+                case SPELL_EFFECT_WEAPON_DAMAGE:\n+                case SPELL_EFFECT_WEAPON_DAMAGE_NOSCHOOL:\n+                case SPELL_EFFECT_NORMALIZED_WEAPON_DMG:\n+                case SPELL_EFFECT_WEAPON_PERCENT_DAMAGE:\n+                case SPELL_EFFECT_SCHOOL_DAMAGE:\n+                case SPELL_EFFECT_ENVIRONMENTAL_DAMAGE:\n+                case SPELL_EFFECT_HEALTH_LEECH:\n+                    return true;\n+                default:\n+                    break;\n+            }\n+        }\n+    }\n+\n+    return false;\n+}\n+\n+bool bot_ai::IsImmunedToMySpellEffect(Unit const* unit, SpellInfo const* spellInfo, SpellEffIndex index) const\n+{\n+    return unit->IsImmunedToSpellEffect(spellInfo, index);\n+}\n+\n+//CONTESTED PVP\n+bool bot_ai::IsContestedPvP() const\n+{\n+    return me->HasUnitState(UNIT_STATE_ATTACK_PLAYER);\n+}\n+void bot_ai::SetContestedPvP()\n+{\n+    _contestedPvPTimer = 30000;\n+    if (!me->HasUnitState(UNIT_STATE_ATTACK_PLAYER))\n+    {\n+        me->AddUnitState(UNIT_STATE_ATTACK_PLAYER);\n+        Bcore::AIRelocationNotifier notifier(*me);\n+        Cell::VisitObjects(me, notifier, me->GetVisibilityRange());\n+    }\n+    if (botPet && !botPet->HasUnitState(UNIT_STATE_ATTACK_PLAYER))\n+    {\n+        botPet->AddUnitState(UNIT_STATE_ATTACK_PLAYER);\n+        Bcore::AIRelocationNotifier notifier(*botPet);\n+        Cell::VisitObjects(me, notifier, me->GetVisibilityRange());\n+    }\n+}\n+void bot_ai::ResetContestedPvP()\n+{\n+    _contestedPvPTimer = 0;\n+    me->ClearUnitState(UNIT_STATE_ATTACK_PLAYER);\n+    if (botPet && botPet->HasUnitState(UNIT_STATE_ATTACK_PLAYER))\n+        botPet->ClearUnitState(UNIT_STATE_ATTACK_PLAYER);\n+}\n+void bot_ai::UpdateContestedPvP()\n+{\n+    if (_contestedPvPTimer > 0 && _contestedPvPTimer <= lastdiff && !me->IsInCombat())\n+        ResetContestedPvP();\n+}\n+\n+void bot_ai::SetGroup(Group* group, int8 subgroup)\n+{\n+    if (group == nullptr)\n+        _group.unlink();\n+    else\n+    {\n+        // never use SetGroup without a subgroup unless you specify NULL for group\n+        _group.link(group, me);\n+        _group.setSubGroup((uint8)subgroup);\n+    }\n+\n+    me->UpdateObjectVisibility(false);\n+}\n+void bot_ai::SetBattlegroundOrBattlefieldRaid(Group* group, int8 subgroup)\n+{\n+    SetOriginalGroup(GetGroup(), GetSubGroup());\n+    _group.unlink();\n+    _group.link(group, me);\n+    _group.setSubGroup((uint8)subgroup);\n+}\n+void bot_ai::RemoveFromBattlegroundOrBattlefieldRaid()\n+{\n+    _group.unlink();\n+    if (Group* group = GetOriginalGroup())\n+    {\n+        _group.link(group, me);\n+        _group.setSubGroup(GetOriginalSubGroup());\n+    }\n+    SetOriginalGroup(nullptr, -1);\n+}\n+void bot_ai::SetOriginalGroup(Group* group, int8 subgroup)\n+{\n+    if (group == nullptr)\n+        _originalGroup.unlink();\n+    else\n+    {\n+        _originalGroup.link(group, me);\n+        _originalGroup.setSubGroup((uint8)subgroup);\n+    }\n+}\n+\n+void bot_ai::SendUpdateToOutOfRangeBotGroupMembers()\n+{\n+    _groupUpdateTimer = BOT_GROUP_UPDATE_TIMER;\n+\n+    if (_groupUpdateMask == GROUP_UPDATE_FLAG_NONE)\n+        return;\n+    if (Group* group = GetGroup())\n+        group->UpdateBotOutOfRange(me);\n+\n+    _groupUpdateMask = GROUP_UPDATE_FLAG_NONE;\n+    _auraRaidUpdateMask = 0;\n+    if (botPet)\n+        botPet->GetBotPetAI()->ResetAuraUpdateMaskForRaid();\n+}\n+\n+//BATTLEGROUNDS\n+bool bot_ai::IsFlagCarrier(Unit const* unit, BattlegroundTypeId bgTypeId)\n+{\n+    if (unit->IsInWorld() && unit->GetMap()->IsBattleground() && unit->HasAuraType(SPELL_AURA_EFFECT_IMMUNITY))\n+    {\n+        uint32 spellId = unit->GetAuraEffectsByType(SPELL_AURA_EFFECT_IMMUNITY).front()->GetBase()->GetId();\n+        switch (bgTypeId)\n+        {\n+            case BATTLEGROUND_TYPE_NONE: //must contain all possible checks\n+                switch (spellId)\n+                {\n+                    case 23333: // Warsong Flag (WSG)\n+                    case 23335: // Silverwing Flag (WSG)\n+                    case BG_EY_NETHERSTORM_FLAG_SPELL: // Nethersorm Flag (EY)\n+                        return true;\n+                    default:\n+                        break;\n+                }\n+                break;\n+            case BATTLEGROUND_AV:\n+                break;\n+            case BATTLEGROUND_WS:\n+                switch (spellId)\n+                {\n+                    case 23333: // Warsong Flag (WSG)\n+                    case 23335: // Silverwing Flag (WSG)\n+                        return true;\n+                    default:\n+                        break;\n+                }\n+                break;\n+            case BATTLEGROUND_AB:\n+                break;\n+            case BATTLEGROUND_EY:\n+                switch (spellId)\n+                {\n+                    case BG_EY_NETHERSTORM_FLAG_SPELL:\n+                        return true;\n+                    default:\n+                        break;\n+                }\n+                break;\n+            case BATTLEGROUND_SA:\n+            case BATTLEGROUND_IC:\n+            default:\n+                break;\n+        }\n+    }\n+\n+    return false;\n+}\n+\n+//DEDICATED EVENTS\n+//INSTANCES\n+bool FrozenThronePlatformDestructionEvent::Execute(uint64 /*e_time*/, uint32 /*p_time*/)\n+{\n+    std::vector<Creature*> bots_to_push;\n+    bots_to_push.reserve(MAXGROUPSIZE * 5);\n+    for (MapReference const& ref : GetScript()->instance->GetPlayers())\n+    {\n+        if (Player const* player = ref.GetSource())\n+        {\n+            if (player->HaveBot())\n+            {\n+                for (auto const& [_, bot] : *player->GetBotMgr()->GetBotMap())\n+                {\n+                    if (bot && bot->IsAlive() && bot->IsInMap(player) && bot->CanFreeMove())\n+                    {\n+                        float dist = bot->GetExactDist2d(_platform_pos);\n+                        if (dist > 46 && dist < 100 && bot->GetPositionZ() > _platform_pos.GetPositionZ() + 3.0f && bot->GetPositionZ() < _platform_pos.GetPositionZ() + 20.0f)\n+                            bots_to_push.push_back(bot);\n+                    }\n+                }\n+            }\n+        }\n+    }\n+\n+    if (!bots_to_push.empty())\n+    {\n+        float knock_src_dist = 10.0f;\n+        float speed_xy = 35.0f;\n+        float speed_z = 12.0f;\n+\n+        for (Creature* bot : bots_to_push)\n+        {\n+            float knockback_angle = Position::NormalizeOrientation(bot->GetAbsoluteAngle(_platform_pos) + float(M_PI));\n+            float knockback_x = bot->GetPositionX() + knock_src_dist * std::cos(knockback_angle);\n+            float knockback_y = bot->GetPositionY() + knock_src_dist * std::sin(knockback_angle);\n+            bot->GetMotionMaster()->MoveKnockbackFrom(knockback_x, knockback_y, speed_xy, speed_z);\n+            bot->m_Events.AddEventAtOffset([=]() { bot->CastSpell(bot, 6869, true); }, 1600ms); // Fall Down\n+        }\n+    }\n+\n+    return true;\n+}\n+\n+#ifdef _MSC_VER\n+# pragma warning(pop)\n+#endif\ndiff --git a/src/server/game/AI/NpcBots/bot_ai.h b/src/server/game/AI/NpcBots/bot_ai.h\nnew file mode 100644\nindex 0000000000..3bc6ad22a3\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bot_ai.h\n@@ -0,0 +1,859 @@\n+#ifndef BOT_AI_H\n+#define BOT_AI_H\n+\n+#include \"botcommon.h\"\n+\n+#include \"CreatureAI.h\"\n+#include \"EventProcessor.h\"\n+#include \"GroupReference.h\"\n+//#include \"ItemDefines.h\"\n+#include \"Position.h\"\n+\n+#include <tuple>\n+\n+/*\n+NpcBot System by Trickerer (onlysuffering@gmail.com)\n+*/\n+\n+class TeleportHomeEvent;\n+class TeleportFinishEvent;\n+class AwaitStateRemovalEvent;\n+\n+enum CombatRating : uint8;\n+enum EnchantmentSlot : uint8;\n+enum GossipOptionIcon : uint8;\n+enum MeleeHitOutcome : uint8;\n+enum WeaponAttackType : uint8;\n+\n+struct CleanDamage;\n+struct CalcDamageInfo;\n+struct ItemTemplate;\n+struct NpcBotData;\n+struct NpcBotExtras;\n+struct PlayerClassLevelInfo;\n+struct SpellNonMeleeDamage;\n+\n+class Aura;\n+class Battleground;\n+class DamageInfo;\n+class GameObject;\n+class Group;\n+class Item;\n+class Spell;\n+class SpellCastTargets;\n+class Unit;\n+class Vehicle;\n+class WanderNode;\n+\n+using AoeSafeSpotsVec = std::vector<Position>;\n+\n+class bot_ai : public CreatureAI\n+{\n+public:\n+    virtual ~bot_ai();\n+\n+    bool canUpdate{true};\n+\n+    void InitializeAI() override;\n+    //void Reset() override { }\n+\n+    NpcBotData const* GetBotData() const { return _botData; }\n+    NpcBotExtras const* GetBotExtras() const { return _botExtras; }\n+\n+    void JustDied(Unit*) override;\n+    void KilledUnit(Unit* u) override;\n+    void AttackStart(Unit* u) override;\n+    void JustEngagedWith(Unit* u) override;\n+    void MoveInLineOfSight(Unit* u) override;\n+    void DamageDealt(Unit* victim, uint32& damage, DamageEffectType damageType, SpellSchoolMask /*damageSchoolMask*/) override;\n+    //void DamageTaken(Unit* /*attacker*/, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo*/) override { }\n+    void ReceiveEmote(Player* player, uint32 emote) override;\n+    void EnterEvadeMode(EvadeReason/* why*/ = EVADE_REASON_OTHER) override { }\n+    //void LeavingWorld() override { }\n+    void OnSpellStart(SpellInfo const* spellInfo) override { OnBotSpellStart(spellInfo); }\n+    bool CanRespawn() override { return IAmFree(); }\n+    void OnDeath(Unit* attacker = nullptr);\n+\n+    virtual void OnBotSummon(Creature* /*summon*/) {}\n+    virtual void OnBotDespawn(Creature* /*summon*/) {}\n+\n+    virtual void UnsummonAll(bool /*savePets*/ = true) {}\n+    void UnsummonCreature(Creature* creature, bool save);\n+    void UnsummonPet(bool save);\n+    template<typename C>\n+    requires std::is_pointer_v<typename C::value_type>\n+    void UnsummonCreatures(C const& container, bool save)\n+    {\n+        C c2 = container; // copy; original container might get modified from within the loop\n+        for (auto c : c2)\n+            UnsummonCreature(c, save);\n+    }\n+\n+    virtual void OnBotDamageTaken(Unit* /*attacker*/, uint32 /*damage*/, CleanDamage const* /*cleanDamage*/, DamageEffectType /*damagetype*/, SpellInfo const* /*spellInfo*/) {}\n+    virtual void OnBotDamageDealt(Unit* /*victim*/, uint32 /*damage*/, CleanDamage const* /*cleanDamage*/, DamageEffectType /*damagetype*/, SpellInfo const* /*spellInfo*/) {}\n+    virtual void OnBotDispelDealt(Unit* /*dispelled*/, uint8 /*num*/) {}\n+\n+    //bool OnGossipHello(Player* player) override;\n+    //bool OnGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override;\n+    //bool OnGossipSelectCode(Player* player, uint32 menuId, uint32 gossipListId, char const* code) override;\n+\n+    virtual void OnBotEnterVehicle(Vehicle const* /*vehicle*/);\n+    virtual void OnBotExitVehicle(Vehicle const* /*vehicle*/);\n+    virtual void AfterBotOwnerEnterVehicle();\n+    virtual void OnBotOwnerEnterVehicle(Vehicle const* /*vehicle*/);\n+    virtual void OnBotOwnerExitVehicle(Vehicle const* /*vehicle*/);\n+\n+    Unit* SpawnVehicle(uint32 creEntry, uint32 vehEntry);\n+    void ChooseVehicleForEncounter(uint32 &creEntry, uint32 &vehEntry) const;\n+\n+    static Position GetAbsoluteTransportPosition(WorldObject const* object);\n+\n+    static const std::string& LocalizedNpcText(Player const* forPlayer, uint32 textId);\n+\n+    bool OnGossipHello(Player* player, uint32 option);\n+    bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action);\n+    bool OnGossipSelectCode(Player* player, Creature* creature, uint32 sender, uint32 action, char const* code);\n+\n+    Creature* GetBotsPet() const { return botPet; }\n+\n+    void Evade();\n+    void GetNextEvadeMovePoint(Position& pos, bool& use_path) const;\n+\n+    EventProcessor* GetEvents() { return &Events; }\n+    ObjectGuid::LowType GetBotOwnerGuid() const;\n+    bool HasSharedOwner(ObjectGuid::LowType guid_low) const;\n+    bool HasOwner(ObjectGuid::LowType guid_low) const;\n+    Player* GetBotOwner() const { return master; }\n+    bool SetBotOwner(Player* newowner);\n+    void CheckOwnerExpiry();\n+    uint8 GetBotClass() const { return _botclass; }\n+    uint32 GetLastDiff() const { return lastdiff; }\n+    virtual void UpdateDeadAI(uint32 diff);\n+    void ReturnHome() { _atHome = false; }\n+    void CommonTimers(uint32 diff);\n+    void ResetBotAI(uint8 resetType);\n+    void KillEvents(bool force);\n+    void BotMovement(BotMovementType type, Position const* pos, Unit* target = nullptr, bool generatePath = true, float speed = 0.0f) const;\n+    bool CanBotMoveVehicle() const;\n+    void MoveToSendPosition(uint32 point_id);\n+    void MoveToSendPosition(Position const& mpos);\n+    void MoveToLastSendPosition() { MoveToSendPosition(sendlastpos); }\n+    void MarkSendPosition(uint32 point_id);\n+    void SetBotCommandState(uint32 st, bool force = false, Position* newpos = nullptr, float* speed = nullptr);\n+    void RemoveBotCommandState(uint32 st);\n+    bool HasBotCommandState(uint32 st) const { return (_botCommandState & st); }\n+    void SetBotAwaitState(uint8 state);\n+    inline void RemoveBotAwaitState(uint8 state) { _botAwaitState &= ~state; }\n+    inline bool HasBotAwaitState(uint8 state) const { return !!(_botAwaitState & state); }\n+    void EventRemoveBotAwaitState(uint8 state);\n+    void AbortAwaitStateRemoval();\n+    uint32 GetBotCommandState() const { return _botCommandState; }\n+    bool IsInBotParty(Unit const* unit) const;\n+    bool IsInBotParty(ObjectGuid guid) const;\n+    bool CanBotAttack(Unit const* target, int8 byspell = 0, bool secondary = false) const;\n+    bool CanBotAttackOnVehicle() const;\n+    void ApplyBotDamageMultiplierMelee(uint32& damage, CalcDamageInfo& damageinfo) const;\n+    void ApplyBotDamageMultiplierMelee(int32& damage, SpellNonMeleeDamage& damageinfo, SpellInfo const* spellInfo, WeaponAttackType attackType, bool iscrit) const;\n+    void ApplyBotDamageMultiplierSpell(int32& damage, SpellNonMeleeDamage& damageinfo, SpellInfo const* spellInfo, WeaponAttackType attackType, bool iscrit) const;\n+    void ApplyBotDamageMultiplierHeal(Unit const* victim, float& heal, SpellInfo const* spellInfo, DamageEffectType damagetype, uint32 stack) const;\n+    void ApplyBotCritMultiplierAll(Unit const* victim, float& crit_chance, SpellInfo const* spellInfo, SpellSchoolMask schoolMask, WeaponAttackType attackType) const;\n+    void ApplyBotSpellCostMods(SpellInfo const* spellInfo, int32& cost) const;\n+    void ApplyBotSpellCastTimeMods(SpellInfo const* spellInfo, int32& casttime) const;\n+    void ApplyBotSpellNotLoseCastTimeMods(SpellInfo const* spellInfo, int32& delayReduce) const;\n+    void ApplyBotSpellCooldownMods(SpellInfo const* spellInfo, uint32& cooldown) const;\n+    void ApplyBotSpellCategoryCooldownMods(SpellInfo const* spellInfo, uint32& cooldown) const;\n+    void ApplyBotSpellGlobalCooldownMods(SpellInfo const* spellInfo, float& cooldown) const;\n+    void ApplyBotSpellRadiusMods(SpellInfo const* spellInfo, float& radius) const;\n+    void ApplyBotSpellRangeMods(SpellInfo const* spellInfo, float& maxrange) const;\n+    void ApplyBotSpellMaxTargetsMods(SpellInfo const* spellInfo, uint32& targets) const;\n+    void ApplyBotSpellChanceOfSuccessMods(SpellInfo const* spellInfo, float& chance) const;\n+    void ApplyBotEffectMods(SpellInfo const* spellInfo, uint8 effIndex, float& value) const;\n+    void ApplyBotThreatMods(SpellInfo const* spellInfo, float& threat) const;\n+    void ApplyBotEffectValueMultiplierMods(SpellInfo const* spellInfo, SpellEffIndex effIndex, float& multiplier) const;\n+    virtual uint8 GetBotStance() const;\n+    uint32 GetBotRoles() const { return _roleMask; }\n+    bool HasRole(uint32 role) const { return _roleMask & role; }\n+    GossipOptionIcon GetRoleIcon(uint32 role) const;\n+    static uint32 GetRoleString(uint32 role);\n+    void ToggleRole(uint32 role, bool force);\n+    static uint32 DefaultRolesForClass(uint8 m_class, uint8 spec);\n+    bool IsTank(Unit const* unit = nullptr) const;\n+    bool IsOffTank(Unit const* unit = nullptr) const;\n+\n+    uint32 GetLastZoneId() const { return _lastZoneId; }\n+    bool IsInHeroicOrRaid() const;\n+\n+    bool IAmFree() const;\n+\n+    //wandering bots\n+    bool IsWanderer() const { return _wanderer; }\n+    void SetWanderer();\n+    static bool IsWanderNodeAvailableForBotFaction(WanderNode const* wp, uint32 factionTemplateId, bool teleport, bool spawn = false);\n+    WanderNode const* GetClosestWanderNode() const;\n+    WanderNode const* GetNextWanderNode(Position const* fromPos, uint8 lvl, bool random) const;\n+    WanderNode const* GetNextTravelNode(Position const* from, bool random) const;\n+    WanderNode const* GetNextBGTravelNode() const;\n+    void OnWanderNodeReached();\n+    void OnBotEnterBattleground();\n+\n+    Group* GetGroup() { return _group.getTarget(); }\n+    Group const* GetGroup() const { return _group.getTarget(); }\n+    void SetGroup(Group* group, int8 subgroup);\n+    uint8 GetSubGroup() const { return _group.getSubGroup(); }\n+    void SetSubGroup(uint8 subgroup) { _group.setSubGroup(subgroup); }\n+    void SetGroupUpdateFlag(uint32 flag) { _groupUpdateMask |= flag; }\n+    uint32 GetGroupUpdateFlag() const { return _groupUpdateMask; }\n+    uint64 GetAuraUpdateMaskForRaid() const { return _auraRaidUpdateMask; }\n+    void SetAuraUpdateMaskForRaid(uint8 slot) { _auraRaidUpdateMask |= (uint64(1) << slot); }\n+    void ResetAuraUpdateMaskForRaid() { _auraRaidUpdateMask = 0; }\n+    void SendUpdateToOutOfRangeBotGroupMembers();\n+    void SetBattlegroundOrBattlefieldRaid(Group* group, int8 subgroup);\n+    void RemoveFromBattlegroundOrBattlefieldRaid();\n+    Group* GetOriginalGroup() const { return _originalGroup.getTarget(); }\n+    void SetOriginalGroup(Group* group, int8 subgroup);\n+    uint8 GetOriginalSubGroup() const { return _originalGroup.getSubGroup(); }\n+    void SetOriginalSubGroup(uint8 subgroup) { _originalGroup.setSubGroup(subgroup); }\n+\n+    Battleground* GetBG() const { return _bg; }\n+    void SetBG(Battleground* bg) { _bg = bg; }\n+\n+    static bool CCed(Unit const* target, bool root = false);\n+\n+    void TeleportHomeStart(bool reset);\n+    void TeleportHome(bool reset);\n+    bool FinishTeleport(bool reset);\n+\n+    bool IsDuringTeleport() const { return teleFinishEvent || teleHomeEvent || _duringTeleport; }\n+    void SetTeleportFinishEvent(TeleportFinishEvent* tfevent) { ASSERT(!teleFinishEvent); teleFinishEvent = tfevent; }\n+    void AbortTeleport();\n+    void SetIsDuringTeleport(bool value) { _duringTeleport = value; }\n+\n+    uint8 GetPlayerClass() const;\n+    uint8 GetPlayerRace() const;\n+\n+    bool IsTempBot() const;\n+    bool IsSharedBot() const;\n+    bool CanAppearInWorld() const;\n+\n+    void SetShouldUpdateStats() { shouldUpdateStats = true; }\n+    void UpdateHealth() { doHealth = true; }\n+    void UpdateMana() { doMana = true; }\n+\n+    //float GetHitRating() const { return hit; }\n+    int32 GetHaste() const { return haste; }\n+    float GetBotParryChance() const { return parry; }\n+    float GetBotDodgeChance() const { return dodge; }\n+    float GetBotBlockChance() const { return block; }\n+    float GetBotCritChance() const { return crit; }\n+    float GetBotMissChance() const { return -hit; }\n+    float GetBotDamageTakenMod(bool magic) const { return magic ? dmg_taken_mag : dmg_taken_phy; }\n+    float GetBotResilience() const { return resilience; }\n+    uint32 GetBotExpertise() const { return expertise; }\n+    uint32 GetBotSpellPenetration() const { return spellpen; }\n+    uint32 GetBotSpellPower() const { return spellpower; }\n+    uint32 GetBotDefense() const { return defense; }\n+    uint32 GetShieldBlockValue() const { return blockvalue; }\n+    int32 GetBotResistanceBonus(SpellSchoolMask mask) const;\n+    int32 GetBotResistanceBonus(uint8 school) const { return (school > SPELL_SCHOOL_NORMAL && school < MAX_SPELL_SCHOOL) ? resistbonus[school-1] : 0; }\n+    bool CanBlock() const;\n+    bool CanParry() const;\n+    bool CanDodge() const;\n+    bool CanCrit() const;\n+    bool CanMiss() const;\n+    bool CanSheath() const;\n+    bool CanSit() const;\n+    virtual bool CanEat() const;\n+    bool CanDrink() const;\n+    bool CanRegenInCombat() const;\n+    bool CanMount() const;\n+    bool CanUseAmmo() const;\n+    bool RespectEquipsAttackTime() const;\n+    bool CanDisplayNonWeaponEquipmentChanges() const;\n+    bool IsValidTransmog(uint8 slot, ItemTemplate const* source) const;\n+    bool CanChangeEquip(uint8 slot) const;\n+    virtual bool CanSeeEveryone() const { return false; }\n+    virtual float GetBotArmorPenetrationCoef() const { return armor_pen; }\n+    void InitMiscValues();\n+    void ResetAllMiscValues();\n+    virtual uint32 GetAIMiscValue(uint32 /*data*/) const { return 0; }\n+    virtual void SetAIMiscValue(uint32 data, uint32 value);\n+    uint8 GetBotComboPoints() const;\n+    float GetBotAmmoDPS() const;\n+\n+    MeleeHitOutcome BotRollCustomMeleeOutcomeAgainst(Unit const* victim, WeaponAttackType attType) const;\n+\n+    float GetTotalBotStat(BotStatMods stat) const { return _getTotalBotStat(stat); }\n+\n+    Item* GetEquips(uint8 slot) const { return _equips[slot]; }\n+    Item* GetEquipsByGuid(ObjectGuid itemGuid) const;\n+    uint32 GetEquipDisplayId(uint8 slot) const;\n+    [[nodiscard]] BotEquipResult UnEquipAll(ObjectGuid receiver, bool store_to_bank);\n+    uint8 GetRealEquippedItemsCount() const;\n+    bool HasRealEquipment() const { return !!GetRealEquippedItemsCount(); }\n+    float GetAverageItemLevel() const;\n+    std::pair<float, float> GetBotGearScores() const;\n+\n+    void CastBotItemCombatSpell(DamageInfo const& damageInfo);\n+    void CastBotItemCombatSpell(DamageInfo const& damageInfo, Item* item, ItemTemplate const* proto);\n+    void OnBotSpellStart(SpellInfo const* spellInfo);\n+    void OnBotSpellInterrupted(SpellSchoolMask schoolMask, uint32 unTimeMs);\n+    void OnBotSpellGo(Spell const* spell, bool ok = true);\n+    void OnBotOwnerSpellGo(Spell const* spell, bool ok = true);\n+    void OnBotChannelFinish(Spell const* spell);\n+    void OnOwnerVehicleDamagedBy(Unit* attacker);\n+    void OnAttackStop(Unit const* target);\n+    virtual void OnClassSpellStart(SpellInfo const* /*spellInfo*/) {}\n+    virtual void OnClassSpellGo(SpellInfo const* /*spell*/) {}\n+    virtual void OnClassChannelFinish(Spell const* /*spell*/) {}\n+\n+    void SpawnKillReward(Player* looter) const;\n+    void FillKillReward(GameObject* go) const;\n+\n+    uint32 GetReviveTimer() const { return _reviveTimer; }\n+    void SetReviveTimer(uint32 newtime) { _reviveTimer = newtime; }\n+    void UpdateReviveTimer(uint32 diff);\n+    uint32 GetSelfRezSpell() const { return _selfrez_spell_id; }\n+\n+    uint32 GetEngageTimer() const { return _engageTimer; }\n+    void ResetEngageTimer(uint32 delay);\n+\n+    uint8 GetHealHpPctThreshold() const { return _healHpPctThreshold; }\n+    void SetHealHpPctThreshold(uint8 threshold) { _healHpPctThreshold = threshold; }\n+\n+    bool HasSpell(uint32 basespell) const;\n+    uint32 GetBaseSpell(std::string_view spell_name, LocaleConstant locale) const;\n+    uint32 GetSpellCooldown(uint32 basespell) const;\n+    bool IsSpellReady(uint32 basespell, uint32 diff, bool checkGCD = true) const;\n+    void SetSpellCooldown(uint32 basespell, uint32 msCooldown);\n+    void SetSpellCategoryCooldown(SpellInfo const* spellInfo, uint32 msCooldown);\n+    void ReleaseSpellCooldown(uint32 basespell);\n+\n+    virtual void SpendRunes(SpellInfo const* /*spellInfo*/, bool /*didHit*/) {}\n+\n+    void ReInitFaction() { InitFaction(); }\n+    void SetSpec(uint8 spec, bool activate = true);\n+    uint8 GetSpec() const;\n+    static uint8 SelectSpecForClass(uint8 m_class);\n+    static uint32 TextForSpec(uint8 spec);\n+    static bool IsValidSpecForClass(uint8 m_class, uint8 spec);\n+\n+    static bool IsBotClassMask(uint8 m_class, uint32 class_mask) { return !!((1ull << m_class) & class_mask); }\n+    static bool IsMeleeClass(uint8 m_class);\n+    static bool IsTankingClass(uint8 m_class);\n+    static bool IsBlockingClass(uint8 m_class);\n+    static bool IsCastingClass(uint8 m_class);\n+    static bool IsHealingClass(uint8 m_class);\n+    static bool IsHumanoidClass(uint8 m_class);\n+    static bool IsHeroExClass(uint8 m_class);\n+\n+    AoeSpotsVec const& GetAoeSpots() const;\n+    static void CalculateAoeSpots(Unit const* unit, AoeSpotsVec& spots);\n+    AoeSafeSpotsVec CalculateAoeSafeSpots(Unit* target, float maxdist) const;\n+\n+    //Pet stuff\n+    static uint32 GetPetOriginalEntry(uint32 entry);\n+    static bool IsPetMelee(uint32 entry);\n+    virtual uint8 GetPetPositionNumber(Creature const* /*summon*/) const { return 0; }\n+\n+    Unit* HelpFindStunTarget(float dist = 20) const { return FindStunTarget(dist); }\n+    Unit* HelpFindCastingTarget(float maxdist = 10, float mindist = 0, uint32 spellId = 0, uint8 minHpPct = 0) const { return FindCastingTarget(maxdist, mindist, spellId, minHpPct); }\n+    Unit* HelpFindAOETarget(float dist, WorldObject const* src) const { return FindAOETarget(dist, src); }\n+    void HelpGetNearbyTargetsList(std::list<Unit*> &targets, float maxdist, uint8 CCoption, WorldObject const* source = nullptr) const { GetNearbyTargetsList(targets, maxdist, CCoption, source); }\n+\n+    bool IsPointedTarget(Unit const* target, uint8 targetFlags) const;\n+    bool IsPointedHealTarget(Unit const* target) const;\n+    bool IsPointedTankingTarget(Unit const* target) const;\n+    bool IsPointedOffTankingTarget(Unit const* target) const;\n+    bool IsPointedDPSTarget(Unit const* target) const;\n+    bool IsPointedRangedDPSTarget(Unit const* target) const;\n+    bool IsPointedNoDPSTarget(Unit const* target) const;\n+    bool IsPointedAnyAttackTarget(Unit const* target) const;\n+\n+    static bool IsDamagingSpell(SpellInfo const* spellInfo);\n+\n+    bool IsImmunedToMySpellEffect(Unit const* unit, SpellInfo const* spellInfo, SpellEffIndex index) const;\n+\n+    bool IsContestedPvP() const;\n+    void SetContestedPvP();\n+    void ResetContestedPvP();\n+    void UpdateContestedPvP();\n+\n+    static bool IsFlagCarrier(Unit const* unit, BattlegroundTypeId bgTypeId = BATTLEGROUND_TYPE_NONE);\n+\n+protected:\n+    explicit bot_ai(Creature* creature);\n+\n+    virtual void ReduceCD(uint32 /*diff*/) {}\n+    bool GlobalUpdate(uint32 diff);\n+\n+    virtual bool HealTarget(Unit* /*target*/, uint32 /*diff*/) { return false; }\n+    virtual bool BuffTarget(Unit* /*target*/, uint32 /*diff*/) { return false; }\n+\n+    void BuffAndHealGroup(uint32 diff);\n+    void ResurrectGroup(uint32 REZZ);\n+    void CureGroup(uint32 cureSpell, uint32 diff);\n+    void SetStats(bool force);\n+    void DefaultInit();\n+    void InitUnitFlags(); // call only in constructor\n+\n+    void OnOwnerDamagedBy(Unit* attacker);\n+\n+    static uint32 InitSpell(Unit const* caster, uint32 spell);\n+    void InitSpellMap(uint32 basespell, bool forceadd = false, bool forwardRank = true);\n+    uint32 GetSpell(uint32 basespell) const;\n+    void ResetSpellCooldown(uint32 basespell) { SetSpellCooldown(basespell, 0); }\n+    void RemoveSpell(uint32 basespell);\n+    //void RemoveAllSpells();\n+    void EnableAllSpells(bool save);\n+    void SpellTimers(uint32 diff);\n+    static uint32 RaceSpellForClass(uint8 myrace, uint8 myclass);\n+\n+    virtual bool CanUseManually(uint32 /*basespell*/) const { return false; }\n+    virtual bool HasAbilitiesSpecifics() const { return false; }\n+    virtual void FillAbilitiesSpecifics(Player const* /*player*/, std::list<std::string> &/*specList*/) {}\n+\n+    virtual std::vector<uint32> const* GetDamagingSpellsList() const { return nullptr; }\n+    virtual std::vector<uint32> const* GetCCSpellsList() const       { return nullptr; }\n+    virtual std::vector<uint32> const* GetHealingSpellsList() const  { return nullptr; }\n+    virtual std::vector<uint32> const* GetSupportSpellsList() const  { return nullptr; }\n+\n+    uint32 GetDPSTaken(Unit const* u) const;\n+    int32 GetHPSTaken(Unit const* u) const;\n+    int32 GetHPS(Unit const* u) const;\n+    int32 GetHPPCTPS(Unit const* u) const;\n+    uint8 GetExpectedHPPCT(Unit const* u, uint32 mseconds) const;\n+\n+    void RefreshAura(uint32 spellId, int8 count = 1, Unit* target = nullptr) const;\n+    bool CheckAttackTarget();\n+    void MoveBehind(Unit const* target) const;\n+\n+    void OnStartAttack(Unit const* u);\n+    bool StartAttack(Unit const* u, bool force = false);\n+\n+    virtual void BreakCC(uint32 diff);\n+    void CheckRacials(uint32 diff);\n+\n+    void DrinkPotion(bool mana);\n+    bool IsPotionReady() const;\n+    uint32 GetPotion(bool mana) const;\n+\n+    //everything cast-related\n+    bool doCast(Unit* victim, uint32 spellId, bool triggered = false);\n+    bool doCast(Unit* victim, uint32 spellId, TriggerCastFlags flags);\n+    SpellCastResult CheckBotCast(Unit const* victim, uint32 spellId) const;\n+    virtual bool removeShapeshiftForm() { return true; }\n+\n+    bool CanRemoveReflectSpells(Unit const* target, uint32 spellId) const;\n+\n+    bool IsMelee() const;\n+    bool IsRanged() const;\n+\n+    bool IsShootingWand(Unit const* u = nullptr) const;\n+\n+    bool IsChanneling(Unit const* u = nullptr) const;\n+    bool IsCasting(Unit const* u = nullptr) const;\n+    bool JumpingFlyingOrFalling() const;\n+    bool JumpingOrFalling() const;\n+    bool Jumping() const;\n+    bool IsIndoors() const;\n+    bool IsOutdoors() const;\n+    bool IsInContactWithWater() const;\n+\n+    float CalcSpellMaxRange(uint32 spellId, bool enemy = true) const;\n+\n+    static bool IsPeriodicDynObjAOEDamage(SpellInfo const* spellInfo);\n+    bool IsWithinAoERadius(Position const& pos) const;\n+\n+    float InitAttackRange(float origRange, bool ranged) const;\n+    void CalculateAttackPos(Unit* target, Position &pos, bool& force) const;\n+    void GetInPosition(bool force, Unit* newtarget, Position* pos = nullptr);\n+    bool AdjustTankingPosition(Unit const* mytarget) const;\n+    virtual float GetSpellAttackRange(bool longRange) const { return longRange ? 23.f : 15.f; }\n+    virtual void CheckAttackState();\n+    void OnSpellHit(Unit* caster, SpellInfo const* spell);\n+    void OnSpellHitTarget(Unit* /*target*/, SpellInfo const* spell);\n+\n+    //Searchers\n+    WorldObject* GetNearbyRezTarget(float dist = 30) const;\n+    Unit* FindImmunityShieldDispelTarget(float dist = 30) const;\n+    Unit* FindHostileDispelTarget(float dist = 30, bool stealable = false) const;\n+    Unit* FindAffectedTarget(uint32 spellId, ObjectGuid caster = ObjectGuid::Empty, float dist = DEFAULT_VISIBILITY_DISTANCE, uint8 hostile = 0) const;\n+    Unit* FindPolyTarget(float dist = 30) const;\n+    Unit* FindFearTarget(float dist = 30) const;\n+    Unit* FindStunTarget(float dist = 20) const;\n+    Unit* FindUndeadCCTarget(float dist, uint32 spellId, bool unattacked = true) const;\n+    Unit* FindRootTarget(float dist, uint32 spellId) const;\n+    Unit* FindCastingTarget(float maxdist = 10, float mindist = 0, uint32 spellId = 0, uint8 minHpPct = 0) const;\n+    Unit* FindAOETarget(float dist, WorldObject const* src = nullptr) const;\n+    Unit* FindSplashTarget(float dist = 5, Unit* To = nullptr, float splashdist = 4) const;\n+    Unit* FindSplashTarget(float dist, Unit* To, float splashdist, uint8 minTargets) const;\n+    Unit* FindTranquilTarget(float mindist = 5, float maxdist = 35) const;\n+    Unit* FindDistantTauntTarget(float maxdist = 30, bool ally = false) const;\n+    Unit* FindDrainTarget(float maxdist = 30) const;\n+    void GetNearbyTargetsList(std::list<Unit*> &targets, float maxdist, uint8 CCoption, WorldObject const* source = nullptr) const;\n+    void GetNearbyTargetsInConeList(std::list<Unit*> &targets, float maxdist = 10) const;\n+    void GetNearbyFriendlyTargetsList(std::list<Unit*> &targets, float maxdist = 30) const;\n+\n+    //Bot specific player-like mods hooks\n+    //todo remove &damage ApplyClassDamageMultiplierMelee (uint&, CalcDamageInfo&)\n+    virtual void ApplyClassDamageMultiplierMelee(uint32& /*damage*/, CalcDamageInfo& /*damageinfo*/) const {}\n+    virtual void ApplyClassDamageMultiplierMeleeSpell(int32& /*damage*/, SpellNonMeleeDamage& /*damageinfo*/, SpellInfo const* /*spellInfo*/, WeaponAttackType /*attackType*/, bool /*crit*/) const {}\n+    virtual void ApplyClassDamageMultiplierSpell(int32& /*damage*/, SpellNonMeleeDamage& /*damageinfo*/, SpellInfo const* /*spellInfo*/, WeaponAttackType /*attackType*/, bool /*crit*/) const {}\n+    virtual void ApplyClassDamageMultiplierHeal(Unit const* /*victim*/, float& /*heal*/, SpellInfo const* /*spellInfo*/, DamageEffectType /*damagetype*/, uint32 /*stack*/) const {}\n+    virtual void ApplyClassSpellCritMultiplierAll(Unit const* /*victim*/, float& /*crit_chance*/, SpellInfo const* /*spellInfo*/, SpellSchoolMask /*schoolMask*/, WeaponAttackType /*attackType*/) const {}\n+    virtual void ApplyClassSpellCostMods(SpellInfo const* /*spellInfo*/, int32& /*cost*/) const {}\n+    virtual void ApplyClassSpellCastTimeMods(SpellInfo const* /*spellInfo*/, int32& /*casttime*/) const {}\n+    virtual void ApplyClassSpellNotLoseCastTimeMods(SpellInfo const* /*spellInfo*/, int32& /*delayReduce*/) const {}\n+    virtual void ApplyClassSpellCooldownMods(SpellInfo const* /*spellInfo*/, uint32& /*cooldown*/) const {}\n+    virtual void ApplyClassSpellCategoryCooldownMods(SpellInfo const* /*spellInfo*/, uint32& /*cooldown*/) const {}\n+    virtual void ApplyClassSpellGlobalCooldownMods(SpellInfo const* /*spellInfo*/, float& /*cooldown*/) const {}\n+    virtual void ApplyClassSpellRadiusMods(SpellInfo const* /*spellInfo*/, float& /*radius*/) const {}\n+    virtual void ApplyClassSpellRangeMods(SpellInfo const* /*spellInfo*/, float& /*maxrange*/) const {}\n+    virtual void ApplyClassSpellMaxTargetsMods(SpellInfo const* /*spellInfo*/, uint32& /*targets*/) const {}\n+    virtual void ApplyClassSpellChanceOfSuccessMods(SpellInfo const* /*spellInfo*/, float& /*chance*/) const {}\n+    virtual void ApplyClassEffectMods(SpellInfo const* /*spellInfo*/, uint8 /*effIndex*/, float& /*value*/) const {}\n+    virtual void ApplyClassThreatMods(SpellInfo const* /*spellInfo*/, float& /*threat*/) const {}\n+    virtual void ApplyClassEffectValueMultiplierMods(SpellInfo const* /*spellInfo*/, SpellEffIndex /*effIndex*/, float& /*multiplier*/) const {}\n+\n+    virtual void InitPowers() {}\n+    virtual void InitSpells() = 0;\n+    virtual void ApplyClassPassives() const = 0;\n+    virtual void InitHeals() {}\n+\n+    void Regenerate();\n+    void RegenerateEnergy();\n+    bool Feasting() const;\n+    uint32 GetRation(bool drink) const;\n+\n+    bool Wait();\n+    uint16 Rand() const { return _rand; }\n+    void GenerateRand();\n+\n+    static uint32 GetLostHP(Unit const* unit);\n+    static uint8 GetHealthPCT(Unit const* u);\n+    static uint8 GetManaPCT(Unit const* u);\n+\n+    virtual MeleeHitOutcome GetNextAttackMeleeOutCome() const;\n+\n+    //event helpers\n+    void BotJumpInPlaceInFrontOf(Position const* pos, float speedXY, float maxHeight);\n+    void DismountBot();\n+\n+    void BotSay(std::string_view text, Player const* target = nullptr) const;\n+    void BotWhisper(std::string_view text, Player const* target = nullptr) const;\n+    void BotYell(std::string_view text, Player const* target = nullptr) const;\n+\n+    void ReportSpellCast(uint32 spellId, const std::string& followedByString, Player const* target) const;\n+\n+    void ApplyItemEnchantment(Item* item, EnchantmentSlot eslot, uint8 slot);\n+    void RemoveItemClassEnchantment(uint8 slot);\n+\n+    bool HasAuraTypeWithValueAtLeast(AuraType auratype, int32 minvalue, Unit const* unit = nullptr) const;\n+\n+    void DoSkytalonVehicleStrats(uint32 diff);\n+    void DoRubyDrakeVehicleStrats(uint32 diff);\n+    void DoEmeraldDrakeVehicleStrats(uint32 diff);\n+    void DoAmberDrakeVehicleStrats(uint32 diff);\n+    void DoArgentMountVehicleStrats(uint32 diff);\n+    void DoDemolisherVehicleStrats(uint32 diff);\n+    void DoSiegeEngineVehicleStrats(uint32 diff);\n+    void DoChopperVehicleStrats(uint32 diff);\n+    void DoGenericVehicleStrats(uint32 diff);\n+    void DoVehicleStrats(BotVehicleStrats strat, uint32 diff);\n+    void DoVehicleActions(uint32 diff);\n+    bool CheckVehicleAttackTarget(BotVehicleStrats /*strat*/);\n+    bool HasVehicleRoleOverride(uint32 role) const;\n+    float GetVehicleAttackDistanceOverride() const;\n+    uint8 LivingVehiclesCount(uint32 entry = 0) const;\n+\n+    bool ProcessImmediateNonAttackTarget();\n+\n+    static bool IsUsableItem(Item const* item);\n+    uint32 GetItemSpellCooldown(uint32 spellid) const;\n+    void CheckUsableItems(uint32 diff);\n+\n+    uint32 GetLastWMOArea() const { return _lastWMOAreaId; }\n+\n+    uint8 _botclass{};\n+    uint8 _spec{};\n+    uint8 _newspec{};\n+    int8 _primaryIconTank{-1};\n+    int8 _primaryIconDamage{-1};\n+\n+    Player* master{};\n+    Player* _prevRRobin{};\n+    Unit* opponent{};\n+    Unit* disttarget{};\n+    Creature* botPet{};\n+    EventProcessor Events;\n+    ObjectGuid aftercastTargetGuid;\n+    uint32 GC_Timer{};\n+\n+private:\n+    void FindMaster();\n+    uint32 CalculateOwnershipCheckTime();\n+\n+    void _OnHealthUpdate() const;\n+    void _OnManaUpdate() const;\n+    void _OnManaRegenUpdate() const;\n+\n+    void _UpdateWMOArea();\n+    void _OnZoneUpdate(uint32 zoneId, uint32 areaId);\n+    void _OnAreaUpdate(uint32 areaId);\n+\n+    void RemoveItemBonuses(uint8 slot);\n+    void RemoveItemEnchantments(Item const* item);\n+    void RemoveItemEnchantment(Item const* item, EnchantmentSlot eslot);\n+    void RemoveItemClassEnchantments();\n+    void ApplyItemBonuses(uint8 slot);\n+    void ApplyItemEnchantments(Item* item, uint8 slot);\n+    void ApplyItemEquipSpells(Item* item, bool apply);\n+    void ApplyItemEquipEnchantmentSpells(Item* item);\n+    void ApplyItemSetBonuses(Item* item, bool apply);\n+    void ApplyItemsSpells();\n+\n+    bool IsPotionSpell(uint32 spellId) const;\n+    void StartPotionTimer();\n+\n+    void BotJump(Position const* pos, bool count = true);\n+    bool UpdateImpossibleChase(Unit const* target);\n+    void ResetChaseTimer(Position const* pos);\n+    void ResetChase(Position const* pos);\n+\n+    void ApplyRacials();\n+    void InitRoles();\n+    void InitSpec();\n+    void InitEquips();\n+    void InitFaction();\n+    void InitRace();\n+\n+    bool _canCureTarget(Unit const* target, uint32 cureSpell) const;\n+    void _getBotDispellableAuraList(Unit const* target, uint32 dispelMask, std::list<Aura const*> &dispelList) const;\n+    void _calculatePos(Unit const* followUnit, Position& pos, float* speed = nullptr) const;\n+    uint32 _selectMountSpell() const;\n+    void _updateMountedState();\n+    void _updateStandState() const;\n+    void _updateRations();\n+    void _updateEquips(uint8 slot, Item* item);\n+\n+    uint32 _getLootQualityMask() const;\n+    uint32 _getLootQualityThreshold() const;\n+    bool _canLootItemForPlayer(Player* player, Creature* creature, uint8 slot) const;\n+    bool _canLootCreatureForPlayer(Player* player, Creature* creature, uint32 lootQualityMask, uint32 lootThreshold) const;\n+    bool _canLootCreature(Creature* creature) const;\n+    void _autoLootCreatureGold(Creature* creature) const;\n+    void _autoLootCreatureItems(Player* receiver, Creature* creature, uint32 lootQualityMask, uint32 lootThreshold) const;\n+    void _autoLootCreature(Creature* creature);\n+\n+    bool _canUseOffHand(ItemTemplate const* with = nullptr, bool ignore_mh = false) const;\n+    bool _canUseRanged() const;\n+    bool _canUseRelic() const;\n+    bool _canCombineWeapons(ItemTemplate const* mh, ItemTemplate const* oh) const;\n+    bool _canEquip(ItemTemplate const* newProto, uint8 slot, bool ignoreItemLevel, Item const* newItem = nullptr, bool ignore_combine = false) const;\n+    void _removeEquipment(uint8 slot);\n+    bool _isItemFitForWanderingBot(uint8 slot, ItemTemplate const* proto) const;\n+    [[nodiscard]] BotEquipResult _unequip(uint8 slot, ObjectGuid receiver, bool store_to_bank, bool on_equip_from_bank = false);\n+    [[nodiscard]] BotEquipResult _equip(uint8 slot, Item* newItem, ObjectGuid receiver, bool store_to_bank, bool from_bank = false);\n+    [[nodiscard]] BotEquipResult _resetEquipment(uint8 slot, ObjectGuid receiver, bool store_to_bank);\n+\n+    void _castBotItemUseSpell(Item const* item, SpellCastTargets const& targets/*, uint8 cast_count = 0, uint32 glyphIndex = 0*/);\n+\n+    std::tuple<Unit*, Unit*> _getTargets(bool byspell, bool ranged, bool &reset) const;\n+    Unit* _getVehicleTarget(BotVehicleStrats strat) const;\n+    void _listAuras(Player const* player, Unit const* unit) const;\n+    bool _checkImmunities(Unit const* target, SpellInfo const* spellInfo) const;\n+    static float _getAttackDistance(float distance) { return distance*0.72f; }\n+    void _extendAttackRange(float& dist) const;\n+    bool _canSwitchToTarget(Unit const* from, Unit const* newTarget, int8 byspell) const;\n+\n+    //for moved\n+    void GetHomePosition(uint16& mapid, Position* pos) const;\n+\n+    //utilities\n+    void _AddItemTemplateLink(Player const* forPlayer, ItemTemplate const* item, std::ostringstream &str) const;\n+    void _AddItemLink(Player const* forPlayer, Item const* item, std::ostringstream &str, bool addIcon = true) const;\n+    void _AddQuestLink(Player const* forPlayer, Quest const* quest, std::ostringstream &str) const;\n+    void _AddWeaponSkillLink(Player const* forPlayer, SpellInfo const* spellInfo, std::ostringstream &str, uint32 skillid) const;\n+    void _AddSpellLink(Player const* forPlayer, SpellInfo const* spellInfo, std::ostringstream &str, bool color = true) const;\n+    void _AddProfessionLink(Player const* forPlayer, SpellInfo const* spellInfo, std::ostringstream &str, uint32 skillId) const;\n+    void _LocalizeItem(Player const* forPlayer, std::string &itemName, uint32 entry) const;\n+    void _LocalizeItem(Player const* forPlayer, std::string &itemName, std::string &suffix, Item const* item) const;\n+    void _LocalizeQuest(Player const* forPlayer, std::string &questTitle, uint32 entry) const;\n+    void _LocalizeCreature(Player const* forPlayer, std::string &creatureName, uint32 entry) const;\n+    void _LocalizeGameObject(Player const* forPlayer, std::string &gameobjectName, uint32 entry) const;\n+    void _LocalizeSpell(Player const* forPlayer, std::string &spellName, uint32 entry) const;\n+\n+    float _getBotStat(uint8 slot, BotStatMods stat) const;\n+    float _getTotalBotStat(BotStatMods stat) const;\n+    float _getRatingMultiplier(CombatRating cr) const;\n+\n+    float _getStatScore(uint8 stat) const;\n+    float _getItemGearStatScore(ItemTemplate const* iproto, uint8 forslot, Item const* item) const;\n+\n+    void _saveStats();\n+\n+    NpcBotData* const _botData;\n+    NpcBotExtras const* const _botExtras;\n+\n+    SpellInfo const* m_botSpellInfo{};\n+    Position homepos{}, movepos{}, attackpos{}, sendlastpos{};\n+    Position sendpos[MAX_SEND_POINTS]{};\n+    AoeSpotsVec _aoeSpots;\n+\n+    uint32 _botCommandState{};\n+    uint8 _botAwaitState{};\n+\n+    uint16 _rand{};\n+\n+    //stats\n+    float hit{}, parry{}, dodge{}, block{}, crit{}, armor_pen{}, resilience{};\n+    float dmg_taken_phy{1.f}, dmg_taken_mag{1.f};\n+    uint32 expertise{}, spellpower{}, spellpen{}, defense{};\n+    uint32 blockvalue{1};\n+    int32 haste{};\n+    int32 resistbonus[MAX_SPELL_SCHOOL - 1]{};\n+\n+    //timers\n+    uint32 _reviveTimer{}, _powersTimer{}, _chaseTimer{}, _engageTimer{}, _potionTimer{};\n+    uint32 lastdiff{}, checkAurasTimer{}, roleTimer{}, ordersTimer{}, regenTimer{}, _updateTimerLong{}, _updateTimerMedium{}, _updateTimerEx1{}, _updateTimerEx2{};\n+    uint32 _checkOwershipTimer{}, _checkMasterTimer{};\n+    uint32 _moveBehindTimer{};\n+    uint32 _rentTimer{};\n+    uint32 _wmoAreaUpdateTimer{};\n+    uint32 waitTimer{};\n+    uint32 itemsAutouseTimer{};\n+    uint32 evadeDelayTimer{};\n+    uint32 indoorsTimer{};\n+    uint32 outdoorsTimer{};\n+    uint32 _contestedPvPTimer{};\n+    uint32 _groupUpdateTimer{BOT_GROUP_UPDATE_TIMER};\n+    //save timers\n+    uint32 _saveDisabledSpellsTimer{};\n+    uint32 _saveMiscValuesTimer{};\n+\n+    uint32 _lastZoneId{}, _lastAreaId{}, _lastWMOAreaId{};\n+    uint32 _selfrez_spell_id{};\n+\n+    uint8 _unreachableCount{};\n+    uint8 _jumpCount{};\n+    uint8 _evadeCount{};\n+    uint8 _healHpPctThreshold{95u};\n+    uint32 _roleMask{};\n+    uint32 _usableItemSlotsMask{};\n+    ObjectGuid _lastTargetGuid;\n+\n+    BotVehicleStrats _curVehStrat{};\n+    uint8 _vehcomboPoints{};\n+    bool shouldEnterVehicle{};\n+\n+    bool doHealth{}, doMana{}, shouldUpdateStats{};\n+    bool feast_health{}, feast_mana{};\n+    bool spawned{};\n+    bool firstspawn{true};\n+    bool _evadeMode{};\n+    bool _atHome{true};\n+    bool _duringTeleport{};\n+    bool _canAppearInWorld{};\n+\n+    //save flags\n+    bool _saveDisabledSpells{};\n+    bool _saveMiscValues{};\n+\n+    //wandering bots\n+    bool _wanderer{};\n+    uint8 _baseLevel{};\n+    WanderNode const* _travel_node_last{};\n+    WanderNode const* _travel_node_cur{};\n+\n+    uint32 _groupUpdateMask{};\n+    uint64 _auraRaidUpdateMask{};\n+    GroupBotReference _group;\n+    GroupBotReference _originalGroup;\n+    Battleground* _bg{};\n+\n+    float _energyFraction{};\n+\n+    //counters (this session)\n+    uint16 _deathsCount{};\n+    uint16 _killsCount{};\n+    uint16 _pvpKillsCount{};\n+    uint16 _playerKillsCount{};\n+\n+    TeleportHomeEvent* teleHomeEvent{};\n+    TeleportFinishEvent* teleFinishEvent{};\n+    AwaitStateRemovalEvent* awaitStateRemEvent{};\n+\n+    struct BotSpell\n+    {\n+        BotSpell() = default;\n+        BotSpell(BotSpell const&) = delete;\n+        BotSpell(BotSpell&&) = delete;\n+        BotSpell& operator=(BotSpell const&) = delete;\n+        BotSpell& operator=(BotSpell&&) = delete;\n+        uint32 spellId = 0;\n+        uint32 cooldown = 0;\n+        bool enabled = true;\n+    };\n+\n+    int32 _stats[BOT_INVENTORY_SIZE][MAX_BOT_ITEM_MOD]{};\n+    std::array<Item*, BOT_INVENTORY_SIZE> _equips{};\n+\n+public:\n+    using BotSpellMap = std::unordered_map<uint32 /*firstrankspellid*/, BotSpell /*spell*/>;\n+    BotSpellMap const& GetSpellMap() const { return _spells; }\n+\n+protected:\n+    BotSpellMap& GetSpellMap() { return _spells; }\n+\n+private:\n+    BotSpellMap _spells;\n+\n+public:\n+    //much simplier than SmartAI I guess...\n+    struct BotOrder\n+    {\n+        friend class bot_ai;\n+\n+        union\n+        {\n+            struct\n+            {\n+                ObjectGuid targetGuid;\n+                uint32 baseSpell;\n+            } spellCastParams;\n+\n+            struct\n+            {\n+                ObjectGuid targetGuid;\n+            } pullParams;\n+\n+        } params;\n+\n+        explicit BotOrder(BotOrderTypes order_type, uint32 timeout_sec = 10) : params{}, _type(order_type), _timeout(time(0) + timeout_sec) {}\n+        BotOrder(BotOrder&&) noexcept = default;\n+\n+        BotOrder(BotOrder const&) = delete;\n+        BotOrder& operator=(BotOrder const&) = delete;\n+        BotOrder& operator=(BotOrder&&) = delete;\n+\n+    private:\n+        BotOrderTypes _type;\n+        time_t _timeout;\n+    };\n+\n+    bool HasOrders() const { return !_orders.empty(); }\n+    bool IsLastOrder(BotOrderTypes order_type, uint32 param1 = 0, ObjectGuid guidparam1 = ObjectGuid::Empty) const;\n+    std::size_t GetOrdersCount() const { return _orders.size(); }\n+    bool AddOrder(BotOrder&& order);\n+    void CancelOrder(BotOrder const& order);\n+    void CompleteOrder(BotOrder const& order);\n+    void CancelAllOrders();\n+\n+private:\n+    void _ProcessOrders();\n+\n+    using OrdersQueue = std::queue<BotOrder>;\n+    OrdersQueue _orders;\n+};\n+\n+#endif\ndiff --git a/src/server/game/AI/NpcBots/bot_archmage_ai.cpp b/src/server/game/AI/NpcBots/bot_archmage_ai.cpp\nnew file mode 100644\nindex 0000000000..1f75d87cdf\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bot_archmage_ai.cpp\n@@ -0,0 +1,410 @@\n+#include \"bot_ai.h\"\n+#include \"botspell.h\"\n+#include \"bottraits.h\"\n+#include \"MotionMaster.h\"\n+#include \"Player.h\"\n+#include \"ScriptMgr.h\"\n+#include \"Spell.h\"\n+#include \"SpellAuras.h\"\n+#include \"TemporarySummon.h\"\n+#include \"World.h\"\n+/*\n+Archmage NpcBot (by Trickerer onlysuffering@gmail.com)\n+Description:\n+Archmage (Warcraft III tribute)\n+Abilities:\n+1) Fireball: main attack, single target, no mana cost\n+2) Blizzard: typical blizzard\n+3) Summon Water Elemental: summons a water elemental to attack archmage's enemies\n+Complete - 75%\n+TODO: mass tele\n+*/\n+\n+enum ArchmageBaseSpells\n+{\n+    MAIN_ATTACK_1           = SPELL_FIREBALL,\n+    BLIZZARD_1              = SPELL_BLIZZARD,\n+    SUMMON_WATER_ELEMENTAL_1= SPELL_SUMMON_WATER_ELEMENTAL\n+};\n+enum ArchmagePassives\n+{\n+    BRILLIANCE_AURA         = SPELL_BRILLIANCE_AURA\n+};\n+enum ArchmageSpecial\n+{\n+    MH_ATTACK_ANIM          = SPELL_ATTACK_MELEE_1H,\n+\n+    SUMMON_ELEM_COST        = 125 * 5,\n+\n+    ARCHMAGE_MOUNTID        = 2402\n+};\n+\n+static const std::vector<uint32> Archmage_spells_damage{ MAIN_ATTACK_1, BLIZZARD_1 };\n+static const std::vector<uint32> Archmage_spells_support{ SUMMON_WATER_ELEMENTAL_1 };\n+\n+class archmage_bot : public CreatureScript\n+{\n+public:\n+    archmage_bot() : CreatureScript(\"archmage_bot\") { }\n+\n+    CreatureAI* GetAI(Creature* creature) const override\n+    {\n+        return new archmage_botAI(creature);\n+    }\n+\n+    bool OnGossipHello(Player* player, Creature* creature) override\n+    {\n+        return creature->GetBotAI()->OnGossipHello(player, 0);\n+    }\n+\n+    bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action) override\n+    {\n+        if (bot_ai* ai = creature->GetBotAI())\n+            return ai->OnGossipSelect(player, creature, sender, action);\n+        return true;\n+    }\n+\n+    bool OnGossipSelectCode(Player* player, Creature* creature, uint32 sender, uint32 action, char const* code) override\n+    {\n+        if (bot_ai* ai = creature->GetBotAI())\n+            return ai->OnGossipSelectCode(player, creature, sender, action, code);\n+        return true;\n+    }\n+\n+    struct archmage_botAI : public bot_ai\n+    {\n+        archmage_botAI(Creature* creature) : bot_ai(creature)\n+        {\n+            _botclass = BOT_CLASS_ARCHMAGE;\n+\n+            InitUnitFlags();\n+\n+            //archmage immunities\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_POSSESS, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_CHARM, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_SILENCE, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_SHAPESHIFT, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_TRANSFORM, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_BLOCK_SPELL_FAMILY, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_POLYMORPH, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_INTERRUPT, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SILENCE, true);\n+        }\n+\n+        bool doCast(Unit* victim, uint32 spellId)\n+        {\n+            if (CheckBotCast(victim, spellId) != SPELL_CAST_OK)\n+                return false;\n+            return bot_ai::doCast(victim, spellId);\n+        }\n+\n+        void StartAttack(Unit* u, bool force = false)\n+        {\n+            if (!bot_ai::StartAttack(u, force))\n+                return;\n+            GetInPosition(force, u);\n+        }\n+\n+        void JustEngagedWith(Unit* u) override { bot_ai::JustEngagedWith(u); }\n+        void AttackStart(Unit*) override { }\n+        void KilledUnit(Unit* u) override { bot_ai::KilledUnit(u); }\n+        void EnterEvadeMode(EvadeReason why = EVADE_REASON_OTHER) override { bot_ai::EnterEvadeMode(why); }\n+        void MoveInLineOfSight(Unit* u) override { bot_ai::MoveInLineOfSight(u); }\n+        void JustDied(Unit* u) override { UnsummonAll(false); bot_ai::JustDied(u); }\n+        void DoNonCombatActions(uint32 /*diff*/) { }\n+\n+        void CheckAura(uint32 diff)\n+        {\n+            if (checkAuraTimer > diff || GC_Timer > diff || IsCasting())\n+                return;\n+\n+            checkAuraTimer = 10000;\n+\n+            if (!IAmFree() && !me->HasAura(BRILLIANCE_AURA, me->GetGUID()))\n+                RefreshAura(BRILLIANCE_AURA);\n+        }\n+\n+        void UpdateAI(uint32 diff) override\n+        {\n+            if (!me->IsMounted() && !me->GetVehicle())\n+                me->Mount(ARCHMAGE_MOUNTID);\n+\n+            if (!GlobalUpdate(diff))\n+                return;\n+\n+            DoVehicleActions(diff);\n+            if (!CanBotAttackOnVehicle())\n+                return;\n+\n+            CheckAura(diff);\n+\n+            if (IsPotionReady())\n+            {\n+                if (me->GetPower(POWER_MANA) < SUMMON_ELEM_COST)\n+                    DrinkPotion(true);\n+                else if (GetHealthPCT(me) < 50)\n+                    DrinkPotion(false);\n+            }\n+\n+            //pet is killed or unreachable\n+            if (IsSpellReady(SUMMON_WATER_ELEMENTAL_1, diff, false) && me->GetPower(POWER_MANA) >= SUMMON_ELEM_COST && !IsCasting() &&\n+                (IAmFree() || master->IsInCombat()/* || !master->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_RESTING)*/) &&\n+                (!botPet || me->GetDistance2d(botPet) > World::GetMaxVisibleDistanceOnContinents()))\n+            {\n+                me->CastSpell(me, GetSpell(SUMMON_WATER_ELEMENTAL_1), false);\n+                return;\n+            }\n+\n+            if (ProcessImmediateNonAttackTarget())\n+                return;\n+\n+            if (!CheckAttackTarget())\n+                return;\n+\n+            if (IsCasting())\n+                return;\n+\n+            CheckUsableItems(diff);\n+\n+            Attack(diff);\n+        }\n+\n+        void Attack(uint32 diff)\n+        {\n+            Unit* mytar = opponent ? opponent : disttarget ? disttarget : nullptr;\n+            if (!mytar)\n+                return;\n+\n+            StartAttack(mytar, IsMelee());\n+\n+            CheckAttackState();\n+            if (!me->IsAlive() || !mytar->IsAlive())\n+                return;\n+\n+            MoveBehind(mytar);\n+\n+            if (!HasRole(BOT_ROLE_DPS))\n+                return;\n+\n+            if (GC_Timer > diff)\n+                return;\n+\n+            //Blizzard\n+            if (IsSpellReady(BLIZZARD_1, diff) && !JumpingOrFalling() && Rand() < 50)\n+            {\n+                if (Unit* blizztarget = FindAOETarget(CalcSpellMaxRange(BLIZZARD_1)))\n+                {\n+                    if (doCast(blizztarget, GetSpell(BLIZZARD_1)))\n+                        return;\n+                }\n+\n+                SetSpellCooldown(BLIZZARD_1, 1000); //fail\n+            }\n+\n+            if (IsSpellReady(MAIN_ATTACK_1, diff) && CanAffectVictimAny(mytar, SPELL_SCHOOL_FIRE, SPELL_SCHOOL_ARCANE))\n+            {\n+                if (doCast(mytar, GetSpell(MAIN_ATTACK_1)))\n+                    return;\n+            }\n+        }\n+\n+        void ApplyClassDamageMultiplierSpell(int32& damage, SpellNonMeleeDamage& /*damageinfo*/, SpellInfo const* spellInfo, WeaponAttackType /*attackType*/, bool iscrit) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //uint8 lvl = me->GetLevel();\n+            float fdamage = float(damage);\n+\n+            //apply bonus damage mods\n+            float pctbonus = 1.0f;\n+            if (iscrit)\n+                pctbonus *= 1.333f;\n+\n+            if (baseId == MAIN_ATTACK_1 || baseId == BLIZZARD_1)\n+                fdamage += me->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_MAGIC) * (spellInfo->Effects[0].BonusMultiplier - 1.f) * me->CalculateDefaultCoefficient(spellInfo, SPELL_DIRECT_DAMAGE) * me->CalculateLevelPenalty(spellInfo);\n+\n+            damage = int32(fdamage * pctbonus);\n+        }\n+\n+        void OnClassSpellGo(SpellInfo const* spellInfo) override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+\n+            if (baseId == MAIN_ATTACK_1 || baseId == BLIZZARD_1)\n+                GC_Timer = uint32(me->GetAttackTime(BASE_ATTACK) * me->m_modAttackSpeedPct[BASE_ATTACK]);\n+\n+            if (baseId == MAIN_ATTACK_1)\n+                me->CastSpell(me, MH_ATTACK_ANIM, true);\n+\n+            if (baseId == SUMMON_WATER_ELEMENTAL_1)\n+                SummonBotPet();\n+        }\n+\n+        void SpellHitTarget(Unit* wtarget, SpellInfo const* spell) override\n+        {\n+            Unit* target = wtarget->ToUnit();\n+            if (!target)\n+                return;\n+\n+            OnSpellHitTarget(target, spell);\n+        }\n+\n+        void SpellHit(Unit* wcaster, SpellInfo const* spell) override\n+        {\n+            Unit* caster = wcaster->ToUnit();\n+            if (!caster)\n+                return;\n+\n+            OnSpellHit(caster, spell);\n+        }\n+\n+        void DamageDealt(Unit* victim, uint32& damage, DamageEffectType damageType, SpellSchoolMask damageSchoolMask) override\n+        {\n+            bot_ai::DamageDealt(victim, damage, damageType, damageSchoolMask);\n+        }\n+\n+        void DamageTaken(Unit* u, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellSchoolMask /*schoolMask*/) override\n+        {\n+            if (!u)\n+                return;\n+            if (!u->IsInCombat() && !me->IsInCombat())\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void OwnerAttackedBy(Unit* u) override\n+        {\n+            if (!u)\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void SummonBotPet()\n+        {\n+            if (botPet)\n+                UnsummonAll(false);\n+\n+            uint32 entry = BOT_PET_AWATER_ELEMENTAL;\n+\n+            Position pos;\n+\n+            //water elemetal 1 minute duration\n+            Creature* myPet = me->SummonCreature(entry, *me, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5000);\n+            me->GetNearPoint(myPet, pos.m_positionX, pos.m_positionY, pos.m_positionZ, 0.f, 2, me->GetOrientation());\n+            myPet->GetMotionMaster()->MovePoint(me->GetMapId(), pos);\n+            myPet->SetCreator(master);\n+            myPet->SetOwnerGUID(me->GetGUID());\n+            myPet->SetFaction(master->GetFaction());\n+            myPet->SetControlledByPlayer(!IAmFree());\n+            myPet->SetPvP(me->IsPvP());\n+            myPet->SetByteValue(UNIT_FIELD_BYTES_2, 1, master->GetByteValue(UNIT_FIELD_BYTES_2, 1));\n+            myPet->SetUInt32Value(UNIT_CREATED_BY_SPELL, SUMMON_WATER_ELEMENTAL_1);\n+\n+            botPet = myPet;\n+        }\n+\n+        void UnsummonAll(bool savePets = true) override\n+        {\n+            UnsummonPet(savePets);\n+        }\n+\n+        void SummonedCreatureDies(Creature* /*summon*/, Unit* /*killer*/) override\n+        {\n+        }\n+\n+        void SummonedCreatureDespawn(Creature* summon) override\n+        {\n+            //BOT_LOG_ERROR(\"entities.unit\", \"SummonedCreatureDespawn: %s's %s\", me->GetName().c_str(), summon->GetName().c_str());\n+            if (summon == botPet)\n+                botPet = nullptr;\n+        }\n+\n+        uint32 GetAIMiscValue(uint32 data) const override\n+        {\n+            switch (data)\n+            {\n+                case BOTAI_MISC_PET_TYPE:\n+                    return BOT_PET_AWATER_ELEMENTAL;\n+                default:\n+                    return 0;\n+            }\n+        }\n+\n+        void CheckAttackState() override\n+        {\n+        }\n+\n+        void OnBotEnterVehicle(Vehicle const* vehicle) override\n+        {\n+            me->Dismount();\n+            bot_ai::OnBotEnterVehicle(vehicle);\n+        }\n+\n+        void Reset() override\n+        {\n+            UnsummonAll(false);\n+\n+            checkAuraTimer = 0;\n+\n+            DefaultInit();\n+        }\n+\n+        void ReduceCD(uint32 diff) override\n+        {\n+            if (checkAuraTimer > diff)              checkAuraTimer -= diff;\n+        }\n+\n+        void InitPowers() override\n+        {\n+            me->SetPowerType(POWER_MANA);\n+        }\n+\n+        void InitSpells() override\n+        {\n+            InitSpellMap(MAIN_ATTACK_1, true, false);\n+            InitSpellMap(BLIZZARD_1, true, false);\n+            InitSpellMap(SUMMON_WATER_ELEMENTAL_1, true, false);\n+        }\n+\n+        void ApplyClassPassives() const override\n+        {\n+        }\n+\n+        bool CanUseManually(uint32 basespell) const override\n+        {\n+            switch (basespell)\n+            {\n+                case BLIZZARD_1:\n+                case SUMMON_WATER_ELEMENTAL_1:\n+                    return true;\n+                default:\n+                    return false;\n+            }\n+        }\n+\n+        std::vector<uint32> const* GetDamagingSpellsList() const override\n+        {\n+            return &Archmage_spells_damage;\n+        }\n+        //std::vector<uint32> const* GetCCSpellsList() const override\n+        //{\n+        //    return &Archmage_spells_cc;\n+        //}\n+        //std::vector<uint32> const* GetHealingSpellsList() const override\n+        //{\n+        //    return &Archmage_spells_heal;\n+        //}\n+        std::vector<uint32> const* GetSupportSpellsList() const override\n+        {\n+            return &Archmage_spells_support;\n+        }\n+\n+    private:\n+\n+        uint32 checkAuraTimer;\n+    };\n+};\n+\n+void AddSC_archmage_bot()\n+{\n+    new archmage_bot();\n+}\ndiff --git a/src/server/game/AI/NpcBots/bot_bm_ai.cpp b/src/server/game/AI/NpcBots/bot_bm_ai.cpp\nnew file mode 100644\nindex 0000000000..a4ad161d5d\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bot_bm_ai.cpp\n@@ -0,0 +1,961 @@\n+#include \"bot_ai.h\"\n+#include \"botlogtraits.h\"\n+#include \"botmgr.h\"\n+#include \"botspell.h\"\n+#include \"Log.h\"\n+#include \"MotionMaster.h\"\n+#include \"ObjectAccessor.h\"\n+#include \"Player.h\"\n+#include \"ScriptMgr.h\"\n+#include \"SpellAuras.h\"\n+#include \"SpellMgr.h\"\n+#include \"TemporarySummon.h\"\n+/*\n+Blademaster NpcBot (by Trickerer onlysuffering@gmail.com)\n+DISABLED: movement mechanics incompatibility\n+Complete - 75%\n+TODO: BLADESTORM, Convert illusions to bot_pet_ai\n+*/\n+\n+#define MAX_ILLUSION_POSITIONS 4\n+#define MIRROR_IMAGE_DURATION 90000\n+\n+enum BlademasterBaseSpells\n+{\n+    WINDWALK_1                              = SPELL_NETHERWALK,\n+    MIRROR_IMAGE_1                          = SPELL_MIRROR_IMAGE_BM,\n+    CRITICAL_STRIKE_1                       = SPELL_CRITICAL_STRIKE\n+};\n+enum BlademasterPassives\n+{\n+//Talents\n+//other\n+};\n+enum BlademasterSpecial\n+{\n+    NPC_MIRROR_IMAGE_BM                     = 70552,\n+    TRANSPARENCY                            = SPELL_TRANSPARENCY_50,\n+    BLACK_COLOR                             = SPELL_VERTEX_COLOR_BLACK,\n+    STUN_FREEZE                             = SPELL_STUN_FREEZE_ANIM,\n+\n+    MIRROR_COST                             = 125 * 5\n+};\n+\n+static const std::vector<uint32> Blademaster_spells_support{ MIRROR_IMAGE_1, WINDWALK_1 };\n+\n+class blademaster_bot : public CreatureScript\n+{\n+public:\n+    blademaster_bot() : CreatureScript(\"blademaster_bot\") { }\n+\n+    CreatureAI* GetAI(Creature* creature) const override\n+    {\n+        return new blademaster_botAI(creature);\n+    }\n+\n+    bool OnGossipHello(Player* player, Creature* creature) override\n+    {\n+        return creature->GetBotAI()->OnGossipHello(player, 0);\n+    }\n+\n+    bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action) override\n+    {\n+        if (bot_ai* ai = creature->GetBotAI())\n+            return ai->OnGossipSelect(player, creature, sender, action);\n+        return true;\n+    }\n+\n+    bool OnGossipSelectCode(Player* player, Creature* creature, uint32 sender, uint32 action, char const* code) override\n+    {\n+        if (bot_ai* ai = creature->GetBotAI())\n+            return ai->OnGossipSelectCode(player, creature, sender, action, code);\n+        return true;\n+    }\n+\n+    struct blademaster_botAI : public bot_ai\n+    {\n+    private:\n+        //DelayedMeleeDamageEvent - Blademaster\n+        //deals critical damage, resets attack timer and sends fake log\n+        class DelayedMeleeDamageEvent : public BasicEvent\n+        {\n+            public:\n+                DelayedMeleeDamageEvent(Creature* bot, ObjectGuid targetGuid, bool windwalk) :\n+                  _bot(bot), _targetGuid(targetGuid), _windwalk(windwalk), _dinfo(nullptr) { }\n+\n+                void SetDamageInfo(CalcDamageInfo* dinfo)\n+                {\n+                    _dinfo = dinfo;\n+                }\n+\n+            protected:\n+                bool Execute(uint64 /*e_time*/, uint32 /*p_time*/)\n+                {\n+                    (static_cast<blademaster_botAI*>(_bot->GetAI()))->CriticalStrikeFinish(_targetGuid, _dinfo, _windwalk);\n+\n+                    if (_dinfo)\n+                        delete _dinfo;\n+                    return true;\n+                }\n+\n+            private:\n+                Creature* _bot;\n+                ObjectGuid _targetGuid;\n+                bool _windwalk;\n+                CalcDamageInfo* _dinfo;\n+        };\n+\n+        class EventTerminateEvent : public BasicEvent\n+        {\n+            public:\n+                EventTerminateEvent(Creature* bot) : _bot(bot) { }\n+\n+            protected:\n+                bool Execute(uint64 /*e_time*/, uint32 /*p_time*/)\n+                {\n+                    (static_cast<blademaster_botAI*>(_bot->GetAI()))->TerminateEvent();\n+                    return true;\n+                }\n+\n+            private:\n+                Creature* _bot;\n+        };\n+\n+        class IllusionUnsummonEvent : public BasicEvent\n+        {\n+            public:\n+                IllusionUnsummonEvent(Creature* bot) : _bot(bot) { }\n+\n+            protected:\n+                bool Execute(uint64 /*e_time*/, uint32 /*p_time*/)\n+                {\n+                    (static_cast<blademaster_botAI*>(_bot->GetAI()))->UnsummonAll(false);\n+\n+                    return true;\n+                }\n+\n+            private:\n+                Creature* _bot;\n+        };\n+\n+        class DelayedIllusionSummonEvent : public BasicEvent\n+        {\n+            public:\n+                DelayedIllusionSummonEvent(Creature* bot) : _bot(bot) { }\n+\n+            protected:\n+                bool Execute(uint64 /*e_time*/, uint32 /*p_time*/)\n+                {\n+                    (static_cast<blademaster_botAI*>(_bot->GetAI()))->MirrorImageFinish();\n+\n+                    return true;\n+                }\n+\n+            private:\n+                Creature* _bot;\n+        };\n+\n+        class DisappearEvent : public BasicEvent\n+        {\n+            public:\n+                DisappearEvent(Creature* bot) : _bot(bot) { }\n+\n+            protected:\n+                bool Execute(uint64 /*e_time*/, uint32 /*p_time*/)\n+                {\n+                    (static_cast<blademaster_botAI*>(_bot->GetAI()))->MirrorImageMid();\n+\n+                    return true;\n+                }\n+\n+            private:\n+                Creature* _bot;\n+        };\n+\n+        void _calcIllusionPositions()\n+        {\n+            float x = me->m_positionX;\n+            float y = me->m_positionY;\n+            float z = me->m_positionZ;\n+            float o = me->GetOrientation();\n+\n+            //X     X\n+            //   C\n+            //X     X\n+            //\n+            //C - caster (Blademaster)\n+            //X - new positions (1-3 illusions + blademaster)\n+\n+            float dist = 3.f; //not too far - 3 for x and y seems to be way to go\n+            for (auto i : NPCBots::index_array<uint8, MAX_ILLUSION_POSITIONS>)\n+            {\n+                _illusPos[i].m_positionX = x + ((i <= 1) ? +dist : -dist); // +2+2-2-2\n+                _illusPos[i].m_positionY = y + (!(i & 1) ? +dist : -dist); // +2-2+2-2\n+                _illusPos[i].m_positionZ = z;\n+                me->UpdateAllowedPositionZ(_illusPos[i].m_positionX, _illusPos[i].m_positionY, _illusPos[i].m_positionZ);\n+                _illusPos[i].SetOrientation(o);\n+            }\n+        }\n+\n+    public:\n+        blademaster_botAI(Creature* creature) : bot_ai(creature)\n+        {\n+            _botclass = BOT_CLASS_BM;\n+\n+            InitUnitFlags();\n+\n+            //Blademaster cannot be disarmed\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_DISARM, true);\n+        }\n+\n+        void IllusionsCheck(uint32 diff)\n+        {\n+            if (!me->IsAlive())\n+                return;\n+            if (Illusions_Check_Timer > diff)\n+                return;\n+\n+            Illusions_Check_Timer = 250;\n+\n+            if (_minions.empty())\n+                return;\n+\n+            for (Creature* ill : _minions)\n+            {\n+                if (!ill)\n+                {\n+                    BOT_LOG_ERROR(\"entities.player\", \"bm_bot::IllusionsCheck(): illusion is not found in world!\");\n+                    continue;\n+                }\n+\n+                ill->SetCanModifyStats(false);\n+                float hpct = ill->GetHealthPct();\n+                float mpct = (float(ill->GetPower(POWER_MANA)) * 100.f) / float(ill->GetMaxPower(POWER_MANA));\n+\n+                ill->SetMaxHealth(me->GetMaxHealth());\n+                ill->SetHealth(uint32(0.5f + float(ill->GetMaxHealth()) * hpct / 100.f));\n+                ill->SetMaxPower(POWER_MANA, me->GetMaxPower(POWER_MANA));\n+                ill->SetPower(POWER_MANA, uint32(0.5f + float(ill->GetMaxPower(POWER_MANA)) * mpct / 100.f));\n+                ill->SetFloatValue(UNIT_FIELD_MINDAMAGE, me->GetFloatValue(UNIT_FIELD_MINDAMAGE));\n+                ill->SetFloatValue(UNIT_FIELD_MAXDAMAGE, me->GetFloatValue(UNIT_FIELD_MAXDAMAGE));\n+                ill->m_modAttackSpeedPct[BASE_ATTACK] = me->m_modAttackSpeedPct[BASE_ATTACK];\n+            }\n+        }\n+\n+        bool doCast(Unit* victim, uint32 spellId)\n+        {\n+            //custom\n+            if (_dmdevent)\n+                return false;\n+            if (IsTempBot()) //Illusion etc.\n+                return false;\n+\n+            if (CheckBotCast(victim, spellId) != SPELL_CAST_OK)\n+                return false;\n+\n+            return bot_ai::doCast(victim, spellId);\n+        }\n+\n+        void UpdateAI(uint32 diff) override\n+        {\n+            IllusionsCheck(diff);\n+\n+            if (!GlobalUpdate(diff))\n+                return;\n+\n+            DoVehicleActions(diff);\n+            if (!CanBotAttackOnVehicle())\n+                return;\n+\n+            if (IsPotionReady() && !IsTempBot())\n+            {\n+                if (me->GetPower(POWER_MANA) < MIRROR_COST)\n+                    DrinkPotion(true);\n+                else if (GetHealthPCT(me) < 50)\n+                    DrinkPotion(false);\n+            }\n+\n+            //CheckRacials(diff);\n+\n+            CheckWindWalk(diff);\n+            CheckMirrorImage(diff);\n+\n+            if (!me->IsInCombat())\n+                DoNonCombatActions(diff);\n+\n+            if (IsCasting())\n+                return;\n+\n+            if (ProcessImmediateNonAttackTarget())\n+                return;\n+\n+            if (!CheckAttackTarget())\n+                return;\n+\n+            CheckUsableItems(diff);\n+\n+            Attack(diff);\n+        }\n+\n+        void StartAttack(Unit* u, bool force = false)\n+        {\n+            if (!bot_ai::StartAttack(u, force))\n+                return;\n+\n+            GetInPosition(force, u);\n+        }\n+\n+        void JustEngagedWith(Unit* u) override { bot_ai::JustEngagedWith(u); }\n+        void AttackStart(Unit*) override { }\n+        void KilledUnit(Unit* u) override { bot_ai::KilledUnit(u); }\n+        void EnterEvadeMode(EvadeReason why = EVADE_REASON_OTHER) override { bot_ai::EnterEvadeMode(why); }\n+        void MoveInLineOfSight(Unit* u) override { bot_ai::MoveInLineOfSight(u); }\n+        void DoNonCombatActions(uint32 /*diff*/) { }\n+\n+        bool CanEat() const override { return Windwalk_Timer <= GetLastDiff() && !illusion_Fade; }\n+        bool CanSeeEveryone() const override { return Windwalk_Timer > GetLastDiff(); }\n+\n+        void BreakCC(uint32 diff) override\n+        {\n+            if (me->HasAuraWithMechanic((1u<<MECHANIC_SNARE)|(1u<<MECHANIC_ROOT)))\n+            {\n+                if (IsSpellReady(WINDWALK_1, diff) && !IsTank(me) && Rand() < 30 &&\n+                    doCast(me, GetSpell(WINDWALK_1)))\n+                    return;\n+            }\n+            bot_ai::BreakCC(diff);\n+        }\n+\n+        void Attack(uint32 /*diff*/)\n+        {\n+            Unit* mytar = opponent ? opponent : disttarget ? disttarget : nullptr;\n+            if (!mytar)\n+                return;\n+\n+            StartAttack(mytar, IsMelee());\n+\n+            CheckAttackState();\n+            if (!me->IsAlive() || !mytar->IsAlive())\n+                return;\n+\n+            MoveBehind(mytar);\n+        }\n+\n+        void DoBMMeleeAttackIfReady()\n+        {\n+            //Copied from UnitAI::DoMeleeAttackIfReady() with modifications\n+            //cannot attack while casting or jumping\n+            if (me->HasUnitState(UNIT_STATE_CASTING) || _dmdevent)\n+                return;\n+\n+            Unit* victim = me->GetVictim();\n+            //Make sure our attack is ready and we aren't currently casting before checking distance\n+            if (me->isAttackReady() && me->IsWithinMeleeRange(victim))\n+            {\n+                if (!CCed(me, true) && !JumpingFlyingOrFalling())\n+                {\n+                    //Windwalk strike\n+                    if (Windwalk_Timer > GetLastDiff())\n+                    {\n+                        CriticalStrike(victim, true);\n+                        return;\n+                    }\n+                    //Critical Strike: 15% to deal x2,x3, etc... damage\n+                    else if (criticalStikeMult >= 2 && !CCed(me, true) && roll_chance_f(15.f))\n+                    {\n+                        CriticalStrike(victim);\n+                        return;\n+                    }\n+                }\n+\n+                DoMeleeAttackIfReady();\n+                return;\n+            }\n+        }\n+\n+        void CheckAttackState() override\n+        {\n+            if (me->GetVictim())\n+            {\n+                if (HasRole(BOT_ROLE_DPS))\n+                    DoBMMeleeAttackIfReady();\n+            }\n+        }\n+\n+        void CheckWindWalk(uint32 diff)\n+        {\n+            if (!IsSpellReady(WINDWALK_1, diff) || Windwalk_Timer > GetLastDiff() || illusion_Fade || IsCasting() ||\n+                Rand() > (10 + 20 * (me->IsInCombat() || master->IsInCombat())))\n+                return;\n+\n+            if (!IAmFree() && master->isMoving())\n+            {\n+                if (me->GetDistance(master) > 30 &&\n+                    doCast(me, GetSpell(WINDWALK_1)))\n+                    return;\n+\n+                return;\n+            }\n+\n+            if (!IsTank(me))\n+            {\n+                //unit to strike\n+                Unit* u = IsMelee() ? me->GetVictim() : nullptr;\n+\n+                if ((u && u->isMoving() && me->GetDistance(u) > 18 &&\n+                    (u->GetVictim() != me || u->getAttackers().size() > uint8(u->IsControlledByPlayer() ? 0 : 1))) ||\n+                    me->getAttackers().size() > 2)\n+                {\n+                    if (doCast(me, GetSpell(WINDWALK_1)))\n+                        return;\n+                }\n+            }\n+        }\n+\n+        void CheckMirrorImage(uint32 diff)\n+        {\n+            //only for controlled bot\n+            //if (IAmFree())\n+            //    return;\n+            if (!IsSpellReady(MIRROR_IMAGE_1, diff) || !me->IsInCombat() || !illusionsCount || illusion_Fade ||\n+                !HasRole(BOT_ROLE_DPS) || IsCasting() || Rand() > 20)\n+                return;\n+\n+            uint8 pct = GetHealthPCT(me);\n+            uint8 size = uint8(me->getAttackers().size());\n+            if (!size)\n+                return;\n+\n+            if (pct > 25 && (size > 3 || pct < (80 + size * 5)))\n+                if (doCast(me, GetSpell(MIRROR_IMAGE_1)))\n+                    return;\n+        }\n+\n+        void MirrorImageStart()\n+        {\n+            if (!illusionsCount)\n+                return;\n+\n+            ASSERT(!illusion_Fade);\n+            illusion_Fade = true;\n+\n+            //OKAY\n+\n+            //destroy existing illusions if any\n+            UnsummonAll(false);\n+            //mirror image renders BM invulnerable for a short period of time,\n+            //removing all but passive auras\n+            Unit::AuraMap const auras = me->GetOwnedAuras(); //copy\n+            for (auto const& [_, aura] : auras)\n+            {\n+                if (aura->GetSpellInfo()->Attributes & SPELL_ATTR0_PASSIVE)\n+                    continue;\n+                if (aura->GetId() == SPELL_BURNING_BLADE_BLADEMASTER)\n+                    continue;\n+                AuraApplication* aurApp = aura->GetApplicationOfTarget(me->GetGUID());\n+                if (!aurApp)\n+                    continue;\n+                me->RemoveAura(aurApp, AURA_REMOVE_BY_DEFAULT);\n+            }\n+\n+            me->BotStopMovement();\n+            me->AttackStop();\n+            me->HandleEmoteCommand(EMOTE_ONESHOT_NONE);\n+            me->AddAura(BLACK_COLOR, me);//color\n+            me->AddAura(STUN_FREEZE, me);//stop/immunity\n+\n+            //prepare to disappear\n+            DisappearEvent* devent = new DisappearEvent(me);\n+            Events.AddEvent(devent, Events.CalculateTime(300)); //immediatelly (almost)\n+        }\n+\n+        void MirrorImageMid()\n+        {\n+            if (!me->IsInWorld() ||\n+                !me->IsAlive()/* || CCed(me)*/) //this is just ensurance\n+            {\n+                me->RemoveAura(BLACK_COLOR);\n+                me->RemoveAura(STUN_FREEZE);\n+                illusion_Fade = false;\n+                return;\n+            }\n+            //disappear\n+            me->SetPhaseMask(0, true);\n+\n+            //INVISIBLE!\n+            //EVENT\n+            DelayedIllusionSummonEvent* disevent = new DelayedIllusionSummonEvent(me);\n+            Events.AddEvent(disevent, Events.CalculateTime(1250)); //1000 ms disappear time + 250 ms buffer\n+        }\n+\n+        void MirrorImageFinish()\n+        {\n+            illusion_Fade = false;\n+            me->RemoveAura(BLACK_COLOR);\n+            me->RemoveAura(STUN_FREEZE);\n+            if (!me->IsInWorld() ||\n+                !me->IsAlive()/* || CCed(me)*/) //this is just ensurance\n+                return;\n+\n+            _calcIllusionPositions();\n+\n+            uint8 usedpos_mask = 0;\n+\n+            for (uint8 i = 0; i != illusionsCount; ++i)\n+            {\n+                Creature* illusion = me->SummonCreature(NPC_MIRROR_IMAGE_BM, *me, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 50);\n+                if (!illusion)\n+                    continue;\n+\n+                if (!IAmFree())\n+                    ASSERT(master->GetBotMgr()->AddBot(illusion));\n+\n+                illusion->SetCreator(master); //TempSummon* Map::SummonCreature()\n+                (static_cast<blademaster_botAI*>(illusion->GetAI()))->SetGUID(me->GetGUID());\n+\n+                //copy visuals\n+                //illusion->SetEntry(me->GetEntry());\n+                illusion->UpdateEntry(me->GetEntry());\n+                illusion->SetFaction(me->GetFaction());\n+                illusion->SetLevel(me->GetLevel());\n+                illusion->SetDisplayId(me->GetDisplayId());\n+                illusion->SetNativeDisplayId(me->GetDisplayId());\n+                illusion->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, me->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0));\n+\n+                //copy stats\n+                illusion->SetCanModifyStats(false);\n+                illusion->SetMaxHealth(me->GetMaxHealth());\n+                illusion->SetHealth(me->GetHealth());\n+                illusion->SetMaxPower(POWER_MANA, me->GetMaxPower(POWER_MANA));\n+                illusion->SetPower(POWER_MANA, me->GetPower(POWER_MANA));\n+                illusion->SetFloatValue(UNIT_FIELD_MINDAMAGE, me->GetFloatValue(UNIT_FIELD_MINDAMAGE));\n+                illusion->SetFloatValue(UNIT_FIELD_MAXDAMAGE, me->GetFloatValue(UNIT_FIELD_MAXDAMAGE));\n+                illusion->m_modAttackSpeedPct[BASE_ATTACK] = me->m_modAttackSpeedPct[BASE_ATTACK];\n+\n+                illusion->BotStopMovement();\n+                while (true)\n+                {\n+                    //move illusion to a random corner\n+                    uint8 j = urand(0, MAX_ILLUSION_POSITIONS - 1);\n+                    uint8 pos_mask = 1u << j;\n+                    if (!(usedpos_mask & pos_mask))\n+                    {\n+                        illusion->GetMotionMaster()->MovePoint(me->GetMapId(), _illusPos[j]);\n+                        //illusion->Relocate(_illusPos[j]);\n+                        usedpos_mask |= pos_mask;\n+                        break;\n+                    }\n+                }\n+\n+                illusion->GetBotAI()->SetBotCommandState(BOT_COMMAND_COMBATRESET);\n+\n+                _minions.insert(illusion);\n+            }\n+\n+            SetBotCommandState(BOT_COMMAND_COMBATRESET);\n+\n+            for (auto i : NPCBots::index_array<uint8, MAX_ILLUSION_POSITIONS>)\n+            {\n+                if (!(usedpos_mask & (1u << i)))\n+                {\n+                    //me->BotStopMovement();\n+                    me->GetMotionMaster()->MovePoint(me->GetMapId(), _illusPos[i]);\n+                    //me->Relocate(_illusPos[i]);\n+                    //usedposs.insert(i);\n+                    break;\n+                }\n+            }\n+\n+            uint8 counter = 0;\n+            uint8 r = urand(0, uint8(_minions.size() - 1));\n+            uint32 phaseMask = IAmFree() ? PHASEMASK_NORMAL : master->GetPhaseMask();\n+\n+            for (Creature* illusion : _minions)\n+            {\n+                illusion->SetPhaseMask(phaseMask, true);\n+\n+                if (counter == r)\n+                    me->SetPhaseMask(phaseMask, true);\n+                else\n+                    ++counter;\n+            }\n+\n+            me->GetCombatManager().EndAllPvECombat();\n+\n+            if (me->GetPhaseMask() != phaseMask)\n+                me->SetPhaseMask(phaseMask, true);\n+\n+            //me->setAttackTimer(BASE_ATTACK, 3000);\n+            //waitTimer += 800;\n+            SetSpellCooldown(MIRROR_IMAGE_1, 8000);\n+\n+            //EVENT\n+            IllusionUnsummonEvent* unsevent = new IllusionUnsummonEvent(me);\n+            Events.AddEvent(unsevent, Events.CalculateTime(MIRROR_IMAGE_DURATION));\n+        }\n+\n+        void CriticalStrike(Unit* target, bool windwalk = false)\n+        {\n+            //Okay critical strike must have jump and strike animation, doing delayed damage\n+            _dmdevent = new DelayedMeleeDamageEvent(me, target->GetGUID(), windwalk);\n+\n+            //hack temp attack damage calc\n+            float mindam = me->GetFloatValue(UNIT_FIELD_MINDAMAGE);\n+            float maxdam = me->GetFloatValue(UNIT_FIELD_MAXDAMAGE);\n+\n+            if (windwalk)\n+            {\n+                me->SetFloatValue(UNIT_FIELD_MINDAMAGE, mindam * 1.5f);\n+                me->SetFloatValue(UNIT_FIELD_MAXDAMAGE, maxdam * 1.5f);\n+                me->RemoveAura(GetSpell(WINDWALK_1));\n+                me->RemoveAura(TRANSPARENCY);\n+            }\n+            else\n+            {\n+                me->SetFloatValue(UNIT_FIELD_MINDAMAGE, mindam * criticalStikeMult);\n+                me->SetFloatValue(UNIT_FIELD_MAXDAMAGE, maxdam * criticalStikeMult);\n+            }\n+\n+            CalcDamageInfo* dinfo = new CalcDamageInfo();\n+            me->CalculateMeleeDamage(target, dinfo, BASE_ATTACK);\n+\n+            me->SetFloatValue(UNIT_FIELD_MINDAMAGE, mindam);\n+            me->SetFloatValue(UNIT_FIELD_MAXDAMAGE, maxdam);\n+\n+            _dmdevent->SetDamageInfo(dinfo);\n+            Events.AddEvent(_dmdevent, Events.CalculateTime(250));\n+\n+            BotJumpInPlaceInFrontOf(target, 0.25f, 4.1f); //jump - DO NOT CHANGE\n+            me->CastSpell(target, SPELL_COMBAT_SPECIAL_2H_ATTACK, true); //strike anim\n+            me->resetAttackTimer(BASE_ATTACK);\n+        }\n+\n+        void CriticalStrikeFinish(ObjectGuid targetGuid, CalcDamageInfo* calcdinfo, bool /*windwalk*/)\n+        {\n+            EventTerminateEvent* etevent = new EventTerminateEvent(me);\n+            Events.AddEvent(etevent, Events.CalculateTime(750));\n+\n+            if (!me->IsInWorld() || !me->IsAlive() || CCed(me))\n+            {\n+                Windwalk_Timer = 0;\n+                return;\n+            }\n+\n+            Unit* target = ObjectAccessor::GetUnit(*me, targetGuid);\n+            if (!target || !target->IsAlive())\n+            {\n+                me->PlayDistanceSound(SOUND_MISS_WHOOSH_2H);\n+                Windwalk_Timer = 0;\n+                return;\n+            }\n+\n+            if (target->IsImmunedToDamage(SPELL_SCHOOL_MASK_NORMAL))\n+            {\n+                //target became immune\n+                me->SendSpellMiss(target, CRITICAL_STRIKE_1, SPELL_MISS_IMMUNE);\n+                target->PlayDistanceSound(SOUND_ABSORB_GET_HIT);\n+                Windwalk_Timer = 0;\n+                return;\n+            }\n+            else if (!CanSeeEveryone() && !me->CanSeeOrDetect(target, false, false))\n+            {\n+                //target disappeared\n+                me->SendSpellMiss(target, CRITICAL_STRIKE_1, SPELL_MISS_MISS/*SPELL_MISS_EVADE*/);\n+                me->PlayDistanceSound(SOUND_MISS_WHOOSH_2H);\n+                Windwalk_Timer = 0;\n+                return;\n+            }\n+\n+            target->PlayDistanceSound(SOUND_AXE_2H_IMPACT_FLESH_CRIT);\n+\n+            DamageInfo dinfo(*calcdinfo, 0);\n+\n+            me->SendSpellNonMeleeDamageLog(target, sSpellMgr->GetSpellInfo(CRITICAL_STRIKE_1),\n+                dinfo.GetDamage() + dinfo.GetAbsorb() + dinfo.GetResist() + dinfo.GetBlock(),\n+                SPELL_SCHOOL_MASK_NORMAL, dinfo.GetAbsorb(), dinfo.GetResist(), false, dinfo.GetBlock(), true);\n+            CleanDamage cl(0, 0, BASE_ATTACK, MELEE_HIT_CRIT);\n+            Unit::DealDamage(me, target, dinfo.GetDamage(), &cl);\n+            Unit::ProcSkillsAndAuras((Unit*)me, calcdinfo->target, calcdinfo->procAttacker, calcdinfo->procVictim, dinfo.GetHitMask(), dinfo.GetDamage(), BASE_ATTACK, nullptr, nullptr, -1, nullptr, &dinfo, nullptr);\n+            me->AtTargetAttacked(target, false);\n+\n+            me->resetAttackTimer(BASE_ATTACK);\n+            Windwalk_Timer = 0;\n+        }\n+\n+        void TerminateEvent()\n+        { _dmdevent = nullptr; }\n+\n+        MeleeHitOutcome GetNextAttackMeleeOutCome() const override\n+        {\n+            return _dmdevent ? MELEE_HIT_NORMAL : bot_ai::GetNextAttackMeleeOutCome();\n+        }\n+\n+        float GetBotArmorPenetrationCoef() const override\n+        {\n+            return 80.0f + bot_ai::GetBotArmorPenetrationCoef();\n+        }\n+\n+        void SpellHit(Unit* wcaster, SpellInfo const* spell) override\n+        {\n+            Unit* caster = wcaster->ToUnit();\n+            if (!caster)\n+                return;\n+\n+            uint32 spellId = spell->Id;\n+\n+            if (spellId == GetSpell(WINDWALK_1))\n+            {\n+                Windwalk_Timer = 30000; //TODO:\n+                me->RemoveMovementImpairingAuras(true);\n+                me->PlayDistanceSound(SOUND_FREEZE_IMPACT_WINDWALK, !IAmFree() ? master : nullptr);\n+\n+                uint32 dur = 30000;\n+                if (Aura* aura = me->GetAura(spellId))\n+                {\n+                    aura->SetDuration(dur);\n+                    aura->SetMaxDuration(dur);\n+                }\n+                if (Aura* aura = me->GetAura(TRANSPARENCY))\n+                {\n+                    aura->SetDuration(dur);\n+                    aura->SetMaxDuration(dur);\n+                }\n+\n+                if (GetHealthPCT(me) < 25 || !HasRole(BOT_ROLE_DPS))\n+                    me->AttackStop();\n+\n+                //SpellEffectSanctuary\n+                me->GetCombatManager().SuppressPvPCombat();\n+                Unit::AttackerSet const& attackers = me->getAttackers();\n+                for (Unit::AttackerSet::const_iterator itr = attackers.begin(); itr != attackers.end();)\n+                {\n+                    if (!(*itr)->CanSeeOrDetect(me))\n+                        (*(itr++))->AttackStop();\n+                    else\n+                        ++itr;\n+                }\n+\n+                me->m_lastSanctuaryTime = getMSTime();\n+            }\n+\n+            if (spellId == GetSpell(MIRROR_IMAGE_1))\n+            {\n+                MirrorImageStart();\n+            }\n+\n+            OnSpellHit(caster, spell);\n+        }\n+\n+        void SpellHitTarget(Unit* wtarget, SpellInfo const* spell) override\n+        {\n+            Unit* target = wtarget->ToUnit();\n+            if (!target)\n+                return;\n+\n+            OnSpellHitTarget(target, spell);\n+        }\n+\n+        void DamageDealt(Unit* victim, uint32& damage, DamageEffectType damageType, SpellSchoolMask damageSchoolMask) override\n+        {\n+            //Illusions deal no damage\n+            if (IsTempBot())\n+            {\n+                //manually add threat as if damage was done\n+                if (victim->IsCreature())\n+                    victim->GetThreatMgr().AddThreat(me, float(damage + damage));\n+\n+                damage = 0;\n+            }\n+\n+            bot_ai::DamageDealt(victim, damage, damageType, damageSchoolMask);\n+        }\n+\n+        void DamageTaken(Unit* u, uint32& damage, DamageEffectType /*damageType*/, SpellSchoolMask /*schoolMask*/) override\n+        {\n+            //illusions take twice as much damage\n+            if (IsTempBot())\n+            {\n+                damage *= 2;\n+                //return;\n+            }\n+            if (illusion_Fade)\n+            {\n+                damage = 0;\n+                return;\n+            }\n+            if (!u)\n+                return;\n+            if (!u->IsInCombat() && !me->IsInCombat())\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void OwnerAttackedBy(Unit* u) override\n+        {\n+            if (!u)\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void JustDied(Unit* u) override\n+        {\n+            TerminateEvent();\n+\n+            if (IsTempBot() && _summonerGUID)\n+                if (Unit* bot = ObjectAccessor::GetUnit(*me, _summonerGUID))\n+                    if (bot->IsNPCBot())\n+                        bot->ToCreature()->OnBotDespawn(me);\n+\n+            UnsummonAll(false);\n+\n+            bot_ai::JustDied(u);\n+        }\n+\n+        void OnBotDespawn(Creature* summon) override\n+        {\n+            if (!summon)\n+                return;\n+\n+            for (auto citr = _minions.cbegin(); citr != _minions.cend(); ++citr)\n+            {\n+                if (*citr == summon)\n+                {\n+                    _minions.erase(citr);\n+                    return;\n+                }\n+            }\n+        }\n+\n+        void UnsummonAll(bool /*savePets*/ = true) override\n+        {\n+            while (!_minions.empty())\n+            {\n+                auto cit = _minions.cbegin();\n+                if (Creature* illusion = *cit)\n+                    illusion->AI()->JustDied(nullptr);\n+                else\n+                    _minions.erase(cit);\n+            }\n+        }\n+\n+        uint32 GetAIMiscValue(uint32 data) const override\n+        {\n+            switch (data)\n+            {\n+                case CRITICAL_STRIKE_1:\n+                    return criticalStikeMult;\n+                case MIRROR_IMAGE_1:\n+                    return illusionsCount;\n+                default:\n+                    return 0;\n+            }\n+        }\n+\n+        void SetGUID(ObjectGuid const& guid, int32 /*id*/ = 0) override\n+        {\n+            _summonerGUID = guid;\n+        }\n+\n+        void Reset() override\n+        {\n+            UnsummonAll(false);\n+\n+            _dmdevent = nullptr;\n+            _summonerGUID = ObjectGuid::Empty;\n+            Windwalk_Timer = 0;\n+            criticalStikeMult = 1;\n+            illusionsCount = 0;\n+            illusion_Fade = false;\n+\n+            DefaultInit();\n+        }\n+\n+        void ReduceCD(uint32 diff) override\n+        {\n+            if (Windwalk_Timer > diff)          Windwalk_Timer -= diff;\n+            if (Illusions_Check_Timer > diff)   Illusions_Check_Timer -= diff;\n+        }\n+\n+        void InitPowers() override\n+        {\n+            me->SetPowerType(POWER_MANA);\n+            me->SetMaxPower(POWER_MANA, 75);\n+        }\n+\n+        void InitSpells() override\n+        {\n+            uint8 lvl = me->GetLevel();\n+\n+            criticalStikeMult =\n+                lvl < 10 ? 1 :\n+                lvl < 30 ? 2 :\n+                lvl < 50 ? 3 :\n+                lvl < 82 ? 4 : 5;\n+\n+            if (IsTempBot())\n+                return;\n+\n+ /*Special*/lvl >= 10 ? InitSpellMap(WINDWALK_1) : RemoveSpell(WINDWALK_1);\n+ /*Special*/lvl >= 20 ? InitSpellMap(MIRROR_IMAGE_1) : RemoveSpell(MIRROR_IMAGE_1);\n+\n+            illusionsCount =\n+                lvl < 20 ? 0 :\n+                lvl < 40 ? 1 :\n+                lvl < 70 ? 2 : 3;\n+        }\n+\n+        void ApplyClassPassives() const override\n+        {\n+            RefreshAura(SPELL_BURNING_BLADE_BLADEMASTER);\n+        }\n+\n+        bool CanUseManually(uint32 basespell) const override\n+        {\n+            switch (basespell)\n+            {\n+                case WINDWALK_1:\n+                case MIRROR_IMAGE_1:\n+                    return true;\n+                default:\n+                    break;\n+            }\n+\n+            return false;\n+        }\n+\n+        //std::vector<uint32> const* GetDamagingSpellsList() const override\n+        //{\n+        //    return &Blademaster_spells_damage;\n+        //}\n+        //std::vector<uint32> const* GetCCSpellsList() const override\n+        //{\n+        //    return &Blademaster_spells_cc;\n+        //}\n+        //std::vector<uint32> const* GetHealingSpellsList() const override\n+        //{\n+        //    return &Blademaster_spells_heal;\n+        //}\n+        std::vector<uint32> const* GetSupportSpellsList() const override\n+        {\n+            return &Blademaster_spells_support;\n+        }\n+\n+    private:\n+        DelayedMeleeDamageEvent* _dmdevent;\n+        using Summons = std::set<Creature*>;\n+        Summons _minions;\n+        Position _illusPos[MAX_ILLUSION_POSITIONS];\n+        ObjectGuid _summonerGUID;\n+\n+        uint32 Windwalk_Timer;\n+        uint32 Illusions_Check_Timer;\n+        uint8 criticalStikeMult;\n+        uint8 illusionsCount;\n+        bool illusion_Fade;\n+    };\n+};\n+\n+void AddSC_blademaster_bot()\n+{\n+    new blademaster_bot();\n+}\ndiff --git a/src/server/game/AI/NpcBots/bot_crypt_lord_ai.cpp b/src/server/game/AI/NpcBots/bot_crypt_lord_ai.cpp\nnew file mode 100644\nindex 0000000000..fcc94c6442\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bot_crypt_lord_ai.cpp\n@@ -0,0 +1,824 @@\n+#include \"bot_ai.h\"\n+#include \"botdatamgr.h\"\n+#include \"botlogtraits.h\"\n+#include \"botspell.h\"\n+#include \"bottext.h\"\n+#include \"CellImpl.h\"\n+#include \"GridNotifiers.h\"\n+#include \"GridNotifiersImpl.h\"\n+#include \"MotionMaster.h\"\n+#include \"ObjectAccessor.h\"\n+#include \"Player.h\"\n+#include \"ScriptMgr.h\"\n+#include \"Spell.h\"\n+#include \"SpellAuras.h\"\n+#include \"SpellMgr.h\"\n+#include \"TemporarySummon.h\"\n+#include \"WorldPacket.h\"\n+/*\n+Crypt Lord NpcBot (by Trickerer onlysuffering@gmail.com)\n+Description:\n+Ancient behemoth, once one of the kings of Azjol-Nerub, now an undead monster within ranks of Lich King's mightiest warriors\n+Specifics:\n+Very high armor, increased resistances, partially immune to control effects, immune to poison-based effects, mail/plate armor,\n+deals melee/spellshadow damage, spell power bonus: 200% strength\n+Abilities:\n+1) Impale. Crypt Lord slams the ground with his massive claws, shooting spikes out in a frontal cone,\n+dealing damage and hurling enemy units into the air in their wake, stunning them. Unlocked at level 20.\n+2) Spiked Carapace. Crypt Lord's chitinous armor increases damage resistance and returns 15% to 50% damage to enemy melee attackers.\n+3) Carrion Beetles. Crypt Lord progenerates a Carrion Beetle from a fresh corpse of an enemy to attack his enemies.\n+Beetles are permanent but do not regenerate health and only 6 can be controlled at a time.\n+Higher levels allow Crypt Lord to summon more powerful beetles. Unlocked at level 10.\n+4) Locust Swarm. Crypt Lord releases a swarm of 20-40 (depends on Crypt Lord's level) angry locusts\n+that bite and tear at nearby enemy units, reducing their ability to move or attack. As they chew the enemy flesh,\n+they convert it into a substance that restores hit points to the Crypt Lord when they return. Unlocked at level 40.\n+Complete - 100%\n+TODO:\n+*/\n+\n+#ifdef _MSC_VER\n+# pragma warning(push, 4)\n+#endif\n+\n+static constexpr float IMPALE_DAMAGE_TIME_MS_FULL = 400.0f;\n+static constexpr float IMPALE_DAMAGE_DIST_MAX = 40.0f;\n+static constexpr float IMPALE_DAMAGE_DELAY_MS_PER_YD = IMPALE_DAMAGE_TIME_MS_FULL / IMPALE_DAMAGE_DIST_MAX;\n+\n+enum CryptLordBaseSpells\n+{\n+//28786\n+//54022\n+    IMPALE_1                = SPELL_IMPALE,\n+    CARRION_BEETLES_1       = SPELL_CARRION_BEETLES,\n+    LOCUST_SWARM_1          = SPELL_LOCUST_SWARM\n+};\n+enum CryptLordPassives\n+{\n+};\n+enum CryptLordSpecial\n+{\n+    MH_ATTACK_ANIM          = SPELL_ATTACK_MELEE_1H,\n+\n+    SPIKED_CARAPACE_DAMAGE  = SPELL_SPIKED_CARAPACE_DAMAGE,\n+    IMPALE_DAMAGE           = SPELL_IMPALE_DAMAGE,\n+    IMPALE_VISUAL           = SPELL_IMPALE_VISUAL,\n+    STUN_VISUAL             = 18970, // \"Self Stun - (Visual only)\"\n+\n+    IMPALE_COST             = 100 * 5,\n+    CARRION_BEETLES_COST    = 30 * 5,\n+    LOCUST_SWARM_COST       = 150 * 5,\n+\n+    MAX_MINIONS             = 6,\n+\n+    SPELL_BLOODY_EXPLOSION  = 36599,\n+\n+    MODEL_BLOODY_BONES      = 25538,\n+\n+    IMPALE_MIN_TARGETS      = 2,\n+\n+    LOCUST_SWARM_MIN_LEVEL  = 40,\n+\n+    MAX_LOCUSTS_BASE        = 20,\n+    MAX_LOCUSTS_70          = 30,\n+    MAX_LOCUSTS_MAXLEVEL    = 40\n+};\n+\n+static const std::vector<uint32> CryptLord_spells_damage{ IMPALE_1, LOCUST_SWARM_1 };\n+static const std::vector<uint32> CryptLord_spells_cc{ IMPALE_1, LOCUST_SWARM_1 };\n+static const std::vector<uint32> CryptLord_spells_support{ CARRION_BEETLES_1 };\n+\n+class crypt_lord_bot : public CreatureScript\n+{\n+public:\n+    crypt_lord_bot() : CreatureScript(\"crypt_lord_bot\") { }\n+\n+    CreatureAI* GetAI(Creature* creature) const override\n+    {\n+        return new crypt_lord_botAI(creature);\n+    }\n+\n+    bool OnGossipHello(Player* player, Creature* creature) override\n+    {\n+        return creature->GetBotAI()->OnGossipHello(player, 0);\n+    }\n+\n+    bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action) override\n+    {\n+        if (bot_ai* ai = creature->GetBotAI())\n+            return ai->OnGossipSelect(player, creature, sender, action);\n+        return true;\n+    }\n+\n+    bool OnGossipSelectCode(Player* player, Creature* creature, uint32 sender, uint32 action, char const* code) override\n+    {\n+        if (bot_ai* ai = creature->GetBotAI())\n+            return ai->OnGossipSelectCode(player, creature, sender, action, code);\n+        return true;\n+    }\n+\n+    struct crypt_lord_botAI : public bot_ai\n+    {\n+        crypt_lord_botAI(Creature* creature) : bot_ai(creature)\n+        {\n+            _botclass = BOT_CLASS_CRYPT_LORD;\n+\n+            InitUnitFlags();\n+\n+            //crypt_lord immunities\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_POSSESS, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_CHARM, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_SHAPESHIFT, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_TRANSFORM, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_DISARM, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_DISARM_OFFHAND, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_FEAR, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_DISARM, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_POLYMORPH, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_FEAR, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_HORROR, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_TURN, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SLEEP, true);\n+        }\n+\n+        bool doCast(Unit* victim, uint32 spellId)\n+        {\n+            if (CheckBotCast(victim, spellId) != SPELL_CAST_OK)\n+                return false;\n+            if (spellId == GetSpell(IMPALE_1))\n+            {\n+                me->AttackStop();\n+                me->BotStopMovement();\n+                me->SetInFront(victim);\n+            }\n+            else if (spellId == GetSpell(LOCUST_SWARM_1))\n+            {\n+                me->AttackStop();\n+                me->BotStopMovement();\n+            }\n+            return bot_ai::doCast(victim, spellId);\n+        }\n+\n+        void StartAttack(Unit* u, bool force = false)\n+        {\n+            if (!bot_ai::StartAttack(u, force))\n+                return;\n+            GetInPosition(force, u);\n+        }\n+\n+        void JustEnteredCombat(Unit* u) override { bot_ai::JustEnteredCombat(u); }\n+        void KilledUnit(Unit* u) override { bot_ai::KilledUnit(u); }\n+        void EnterEvadeMode(EvadeReason why = EVADE_REASON_OTHER) override { bot_ai::EnterEvadeMode(why); }\n+        void MoveInLineOfSight(Unit* u) override { bot_ai::MoveInLineOfSight(u); }\n+        void JustDied(Unit* u) override { UnsummonLocusts(true); UnsummonAll(false); bot_ai::JustDied(u); }\n+\n+        void DoNonCombatActions(uint32 diff)\n+        {\n+            CheckCarrionBeetles(diff);\n+        }\n+\n+        void CheckCarrionBeetles(uint32 diff)\n+        {\n+            if (!IsSpellReady(CARRION_BEETLES_1, diff) || _carrionBeetlesCheckTimer > diff || _minions.size() >= MAX_MINIONS ||\n+                me->GetPower(POWER_MANA) < CARRION_BEETLES_COST || Rand() > 50)\n+                return;\n+\n+            _carrionBeetlesCheckTimer = urand(2000, 3000);\n+\n+            auto corpse_pred = [this, mindist = 30.f](Creature const* c) mutable {\n+                if (_isUsableCorpse(c) && c->GetDistance(me) < mindist)\n+                {\n+                    mindist = c->GetDistance(me);\n+                    return true;\n+                }\n+                return false;\n+            };\n+            Creature* creature = nullptr;\n+            Bcore::CreatureSearcher searcher(me, creature, corpse_pred);\n+            Cell::VisitObjects(me, searcher, 30.f);\n+\n+            if (creature)\n+            {\n+                me->SetInFront(creature);\n+                if (doCast(creature, GetSpell(CARRION_BEETLES_1)))\n+                    return;\n+            }\n+        }\n+\n+        void CheckLocustSwarm(uint32 diff)\n+        {\n+            if (!IsSpellReady(LOCUST_SWARM_1, diff) || _locustSwarmCheckTimer > diff || me->GetPower(POWER_MANA) < LOCUST_SWARM_COST ||\n+                GetHealthPCT(me) > 40 || Rand() > 35)\n+                return;\n+\n+            _locustSwarmCheckTimer = urand(1500, 3500);\n+\n+            std::list<Unit*> targets;\n+            GetNearbyTargetsList(targets, 50.0f, 0);\n+\n+            if (targets.empty()) // impossible\n+                return;\n+\n+            if (targets.size() > 1u || targets.front()->IsControlledByPlayer())\n+            {\n+                if (doCast(me, GetSpell(LOCUST_SWARM_1)))\n+                    return;\n+            }\n+        }\n+\n+        void UpdateAI(uint32 diff) override\n+        {\n+            if (!GlobalUpdate(diff))\n+                return;\n+\n+            DoVehicleActions(diff);\n+            if (!CanBotAttackOnVehicle())\n+                return;\n+\n+            if (!me->IsInCombat())\n+                DoNonCombatActions(diff);\n+\n+            if (IsPotionReady())\n+            {\n+                if (me->GetPower(POWER_MANA) < 550)\n+                    DrinkPotion(true);\n+                else if (GetHealthPCT(me) < 50)\n+                    DrinkPotion(false);\n+            }\n+\n+            if (IsCasting())\n+                return;\n+\n+            //if (IsSpellReady(INFERNO_1, diff) && !botPet && me->IsInCombat() &&\n+            //    me->GetPower(POWER_MANA) >= INFERNAL_COST && Rand() < 60)\n+            //{\n+            //    Unit* target = FindAOETarget(CalcSpellMaxRange(INFERNO_1));\n+\n+            //    if (target)\n+            //        _infernoPos = target->GetPosition();\n+            //    else\n+            //        me->GetNearPoint(me, _infernoPos.m_positionX, _infernoPos.m_positionY, _infernoPos.m_positionZ, 5.f, 0.f);\n+\n+            //    me->CastSpell(_infernoPos, GetSpell(INFERNO_1), false);\n+            //    return;\n+            //}\n+\n+            if (ProcessImmediateNonAttackTarget())\n+                return;\n+\n+            if (!CheckAttackTarget())\n+                return;\n+\n+            CheckLocustSwarm(diff);\n+\n+            CheckUsableItems(diff);\n+\n+            Attack(diff);\n+        }\n+\n+        void Attack(uint32 diff)\n+        {\n+            Unit* mytar = opponent ? opponent : disttarget ? disttarget : nullptr;\n+            if (!mytar)\n+                return;\n+\n+            StartAttack(mytar, IsMelee());\n+\n+            MoveBehind(mytar);\n+\n+            if (!HasRole(BOT_ROLE_DPS))\n+                return;\n+\n+            if (IsSpellReady(IMPALE_1, diff) && _impaleCheckTimer <= diff && me->GetPower(POWER_MANA) >= IMPALE_COST &&\n+                me->isAttackReady() && Rand() < 75)\n+            {\n+                _impaleCheckTimer = urand(800, 1600);\n+\n+                SpellInfo const* impaleSpellInfo = sSpellMgr->AssertSpellInfo(GetSpell(IMPALE_1));\n+                impaleSpellInfo = impaleSpellInfo->TryGetSpellInfoOverride(me);\n+                if (me->GetExactDist(mytar) < IMPALE_DAMAGE_DIST_MAX &&\n+                    (mytar->IsNonMeleeSpellCast(false) || GetManaPCT(me) > 90 || mytar->GetHealth() < me->GetMaxHealth() / 4 ||\n+                        (mytar->IsControlledByPlayer() && mytar->GetHealth() > me->GetHealth())) &&\n+                    !(mytar->IsImmunedToSpellEffect(impaleSpellInfo, EFFECT_1) &&\n+                     mytar->IsImmunedToSpellEffect(impaleSpellInfo, EFFECT_2)))\n+                {\n+                    Spell const* tarSpell = mytar->GetCurrentSpell(CURRENT_GENERIC_SPELL);\n+                    tarSpell = tarSpell ? tarSpell : mytar->GetCurrentSpell(CURRENT_CHANNELED_SPELL);\n+                    if (!tarSpell || tarSpell->GetTimer() > 500)\n+                    {\n+                        if (doCast(mytar, GetSpell(IMPALE_1)))\n+                            return;\n+                    }\n+                }\n+\n+                static const std::array my_angles = { 0.0f, float(M_PI / 2), float(M_PI / 2) * 2.0f, float(M_PI / 2) * 3.0f };\n+\n+                std::list<Unit*> impale_targets;\n+                GetNearbyTargetsList(impale_targets, IMPALE_DAMAGE_DIST_MAX, 0);\n+\n+                std::array<decltype(impale_targets), std::size(my_angles)> direction_targets{};\n+                for (Unit* u : impale_targets)\n+                {\n+                    float angle = me->GetRelativeAngle(u);\n+                    for (auto i : NPCBots::index_array<size_t, std::size(my_angles)>)\n+                    {\n+                        float rborder = Position::NormalizeOrientation(my_angles[i] - float(M_PI) * 0.25f);\n+                        float lborder = Position::NormalizeOrientation(my_angles[i] + float(M_PI) * 0.25f);\n+                        if ((angle > rborder && angle < lborder) || u->IsWithinMeleeRange(me))\n+                        {\n+                            direction_targets[i].push_back(u);\n+                            break;\n+                        }\n+                    }\n+                }\n+\n+                std::add_pointer_t<std::add_const_t<decltype(impale_targets)>> chosen_targets = nullptr;\n+                size_t max_count = IMPALE_MIN_TARGETS;\n+                for (std::add_const_t<decltype(impale_targets)>& tlist : direction_targets)\n+                {\n+                    if (tlist.size() > max_count)\n+                    {\n+                        chosen_targets = &tlist;\n+                        max_count = tlist.size();\n+                    }\n+                }\n+\n+                if (chosen_targets)\n+                {\n+                    Unit* target = Bcore::Containers::SelectRandomContainerElement(*chosen_targets);\n+                    if (target && doCast(target, GetSpell(IMPALE_1)))\n+                        return;\n+                }\n+            }\n+\n+            CheckAttackState();\n+            //if (!me->IsAlive() || !mytar->IsAlive())\n+            //    return;\n+        }\n+\n+        void ApplyClassDamageMultiplierMeleeSpell(int32& damage, SpellNonMeleeDamage& /*damageinfo*/, SpellInfo const* spellInfo, WeaponAttackType /*attackType*/, bool /*iscrit*/) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+            float fdamage = float(damage);\n+\n+            // apply bonus damage mods\n+            float pctbonus = 1.0f;\n+\n+            //Impale Damage scaling from AP\n+            if (lvl >= 40 && baseId == IMPALE_DAMAGE)\n+            {\n+                float ap_factor = lvl >= 60 ? 0.125f : 0.0625f;\n+                float total_ap = me->GetTotalAttackPowerValue(BASE_ATTACK);\n+                fdamage += total_ap * ap_factor;\n+                if (lvl >= 70)\n+                    pctbonus *= 1.1f;\n+                if (lvl >= DEFAULT_MAX_LEVEL)\n+                    pctbonus *= 1.2f;\n+            }\n+\n+            damage = int32(fdamage * pctbonus);\n+        }\n+\n+        //void ApplyClassSpellRadiusMods(SpellInfo const* spellInfo, float& radius) const override\n+        //{\n+        //    uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+        //    float flatbonus = 0.0f;\n+        //    float pctbonus = 0.0f;\n+\n+        //    //100% mods\n+        //    if (baseId == IMPALE_DAMAGE)\n+        //        radius = 0.0f;\n+\n+        //    radius = radius * (1.0f + pctbonus) + flatbonus;\n+        //}\n+\n+        void OnClassSpellStart(SpellInfo const* spellInfo) override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            switch (baseId)\n+            {\n+                case IMPALE_1:\n+                case CARRION_BEETLES_1:\n+                    me->CastSpell(me, MH_ATTACK_ANIM, true);\n+                    break;\n+                case LOCUST_SWARM_1:\n+                    _handleLocustSwarm();\n+                    break;\n+                default:\n+                    break;\n+            }\n+        }\n+\n+        void OnClassSpellGo(SpellInfo const* /*spellInfo*/) override\n+        {\n+        }\n+\n+        void OnClassChannelFinish(Spell const* spell) override\n+        {\n+            SpellInfo const* spellInfo = spell->GetSpellInfo();\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+\n+            if (baseId == IMPALE_1 || baseId == CARRION_BEETLES_1 || baseId == LOCUST_SWARM_1)\n+            {\n+                if (baseId == CARRION_BEETLES_1)\n+                {\n+                    ObjectGuid target_guid = spell->m_targets.GetUnitTargetGUID();\n+                    if (Unit* spellTarget = ObjectAccessor::GetUnit(*me, target_guid))\n+                    {\n+                        ASSERT(!IsInBotParty(spellTarget));\n+                        spellTarget->CastSpell(spellTarget, SPELL_BLOODY_EXPLOSION, true);\n+                        spellTarget->SetDisplayId(MODEL_BLOODY_BONES);\n+\n+                        for (int32 i = 0; i < spellInfo->GetEffect(EFFECT_0).BasePoints; ++i)\n+                            SummonBotPet(spellTarget);\n+                    }\n+                }\n+\n+                me->CastSpell(me, SPELL_BRIEF_STUN, true);\n+            }\n+        }\n+\n+        void SpellHitTarget(Unit* wtarget, SpellInfo const* spell) override\n+        {\n+            Unit* target = wtarget->ToUnit();\n+            if (!target)\n+                return;\n+\n+            uint32 baseId = spell->GetFirstRankSpell()->Id;\n+\n+            if (baseId == IMPALE_1)\n+            {\n+                if (me->IsValidAttackTarget(target))\n+                {\n+                    uint32 base_delay = uint32(std::max<int32>(spell->GetDuration(), 0));\n+                    uint32 ms_delay = base_delay + uint32(IMPALE_DAMAGE_DELAY_MS_PER_YD * me->GetExactDist2d(target));\n+                    //BotWhisper(\"Impale hit \" + target->GetName() + \" (\" + std::to_string(target->GetGUID().GetCounter()) + \"), delay: \" + std::to_string(ms_delay));\n+                    //We use WO events container since bot ai events get cleaned at death, see JustDied()\n+                    me->m_Events.AddEventAtOffset([this, guid = target->GetGUID()]() {\n+                        if (Unit* u = ObjectAccessor::GetUnit(*me, guid))\n+                        {\n+                            if (u->GetDistance(me) < IMPALE_DAMAGE_DIST_MAX + 5.0f)\n+                                me->CastSpell(u, IMPALE_DAMAGE, true);\n+                        }\n+                    }, std::chrono::milliseconds(ms_delay));\n+                }\n+            }\n+            else if (baseId == IMPALE_DAMAGE)\n+            {\n+                //BotWhisper(\"Impale damage hit \" + target->GetName() + \" (\" + std::to_string(target->GetGUID().GetCounter()) + ')');\n+                me->CastSpell(target, IMPALE_VISUAL, true);\n+                if (Aura* stun = target->AddAura(STUN_VISUAL, target))\n+                {\n+                    int32 dur = std::max<int32>(spell->GetMaxDuration(), 6000);\n+                    stun->SetDuration(dur);\n+                    stun->SetMaxDuration(dur);\n+                }\n+            }\n+\n+            OnSpellHitTarget(target, spell);\n+        }\n+\n+        void SpellHit(Unit* wcaster, SpellInfo const* spell) override\n+        {\n+            Unit* caster = wcaster->ToUnit();\n+            if (!caster)\n+                return;\n+\n+            OnSpellHit(caster, spell);\n+        }\n+\n+        void DamageTaken(Unit* u, uint32& damage, DamageEffectType damageType, SpellSchoolMask /*schoolMask*/) override\n+        {\n+            if (u && damage && (damageType == DIRECT_DAMAGE || damageType == SPELL_DIRECT_DAMAGE) &&\n+                me->IsWithinMeleeRange(u) && me->IsValidAttackTarget(u))\n+            {\n+                SpellInfo const* damageSpellInfo = sSpellMgr->AssertSpellInfo(SPIKED_CARAPACE_DAMAGE);\n+                if (u->IsImmunedToDamage(me, damageSpellInfo))\n+                {\n+                    me->SendSpellDamageImmune(u, SPIKED_CARAPACE_DAMAGE);\n+                }\n+                else\n+                {\n+                    uint32 damage_returned_pct = _getSpikesDamageReflectPct();\n+                    uint32 damage_returned = CalculatePct(damage, damage_returned_pct);\n+                    if (damage_returned)\n+                    {\n+                        WorldPacket data(SMSG_SPELLDAMAGESHIELD, 8 + 8 + 4 + 4 + 4 + 4 + 4);\n+                        data << me->GetGUID();\n+                        data << u->GetGUID();\n+                        data << uint32(damageSpellInfo->Id);\n+                        data << uint32(damage_returned);\n+                        data << uint32(std::max<int32>(int32(damage_returned) - int32(u->GetHealth()), 0));\n+                        data << uint32(damageSpellInfo->SchoolMask);\n+                        me->SendMessageToSet(&data, true);\n+                        Unit::DealDamage(me, u, damage_returned, nullptr, SPELL_DIRECT_DAMAGE, damageSpellInfo->GetSchoolMask(), damageSpellInfo, true);\n+                    }\n+                }\n+            }\n+\n+            if (!u)\n+                return;\n+            if (!u->IsInCombat() && !me->IsInCombat())\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void OwnerAttackedBy(Unit* u) override\n+        {\n+            if (!u)\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        uint8 GetPetPositionNumber(Creature const* summon) const override\n+        {\n+            uint8 i = 0;\n+            for (Summons::const_iterator citr = _minions.begin(); citr != _minions.end(); ++citr)\n+            {\n+                if ((*citr)->GetGUID() == summon->GetGUID())\n+                    return i;\n+                ++i;\n+            }\n+            return 0;\n+        }\n+\n+        void SummonBotPet(Unit const* from)\n+        {\n+            if (_minions.size() >= MAX_MINIONS)\n+            {\n+                Unit* u = nullptr;\n+                //try 1: by minimal level\n+                uint8 minlevel = me->GetLevel();\n+                for (Unit* s : _minions)\n+                {\n+                    if (s->GetLevel() < minlevel)\n+                    {\n+                        minlevel = s->GetLevel();\n+                        u = s;\n+                    }\n+                }\n+                //try 2: last resort\n+                if (!u)\n+                    u = *(_minions.begin());\n+\n+                u->ToTempSummon()->UnSummon();\n+            }\n+\n+            uint32 entry = _getCarrionBeetleEntry();\n+            Position pos = from->GetPosition();\n+\n+            Creature* myPet = me->SummonCreature(entry, pos, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 2000);\n+            myPet->SetCreator(master);\n+            myPet->SetOwnerGUID(me->GetGUID());\n+            myPet->SetFaction(master->GetFaction());\n+            myPet->SetControlledByPlayer(!IAmFree());\n+            myPet->SetPvP(me->IsPvP());\n+            myPet->SetByteValue(UNIT_FIELD_BYTES_2, 1, master->GetByteValue(UNIT_FIELD_BYTES_2, 1));\n+\n+            myPet->SetUInt32Value(UNIT_CREATED_BY_SPELL, CARRION_BEETLES_1);\n+\n+            //myPet->SetMeleeDamageSchool(SPELL_SCHOOL_FIRE);\n+            if (Aura* stun = myPet->AddAura(SUMMONING_DISORIENTATION, myPet))\n+            {\n+                stun->SetDuration(1500);\n+                stun->SetMaxDuration(1500);\n+            }\n+\n+            myPet->GetAI()->SetData(BOTPETAI_MISC_MAXLEVEL, me->GetLevel());\n+            _minions.insert(myPet);\n+        }\n+\n+        void SummonLocust(uint32 offset)\n+        {\n+            ObjectGuid old_locust_guid = _locusts[offset];\n+            if (!old_locust_guid.IsEmpty())\n+            {\n+                if (Creature* old_locust = ObjectAccessor::GetCreature(*me, old_locust_guid))\n+                    old_locust->KillSelf();\n+            }\n+\n+            uint32 entry = BOT_PET_LOCUST_SWARM;\n+            Position pos = me->GetNearPosition(frand(5.0f, 15.0f), frand(float(M_PI * 0.75), float(M_PI * 1.25)));\n+\n+            Creature* locust = me->SummonCreature(entry, *me, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 1000);\n+            locust->SetCreator(master);\n+            locust->SetOwnerGUID(me->GetGUID());\n+            locust->SetFaction(master->GetFaction());\n+            locust->SetControlledByPlayer(!IAmFree());\n+            locust->SetPvP(me->IsPvP());\n+            locust->SetByteValue(UNIT_FIELD_BYTES_2, 1, master->GetByteValue(UNIT_FIELD_BYTES_2, 1));\n+\n+            locust->SetUInt32Value(UNIT_CREATED_BY_SPELL, LOCUST_SWARM_1);\n+\n+            locust->GetMotionMaster()->MovePoint(1, pos, FORCED_MOVEMENT_NONE, 0.0f, false);\n+\n+            locust->GetAI()->SetData(BOTPETAI_MISC_CAPACITY, CalculatePct(me->GetMaxHealth(), uint32(2)));\n+            locust->GetAI()->SetData(BOTPETAI_MISC_MAX_ATTACKERS, CalculatePct(me->GetMaxHealth(), (_getMaxLocusts() + 2) / 3));\n+            _locusts[offset] = locust->GetGUID();\n+        }\n+\n+        void UnsummonAll(bool savePets = true) override\n+        {\n+            UnsummonCreatures(_minions, savePets);\n+            UnsummonLocusts(false);\n+        }\n+\n+        void UnsummonLocusts(bool kill)\n+        {\n+            for (ObjectGuid locust_guid : _locusts)\n+            {\n+                if (!locust_guid.IsEmpty())\n+                {\n+                    if (Creature* locust = ObjectAccessor::GetCreature(*me, locust_guid))\n+                    {\n+                        if (kill)\n+                           locust->KillSelf(false);\n+                        else\n+                            locust->ToTempSummon()->UnSummon();\n+                    }\n+                }\n+            }\n+        }\n+\n+        void SummonedCreatureDies(Creature* /*summon*/, Unit* /*killer*/) override\n+        {\n+        }\n+\n+        void SummonedCreatureDespawn(Creature* summon) override\n+        {\n+            if (_minions.contains(summon))\n+                _minions.erase(summon);\n+            else if (auto it = std::ranges::find(_locusts, summon->GetGUID()); it != _locusts.end())\n+                *it = ObjectGuid::Empty;\n+        }\n+\n+        uint32 GetAIMiscValue(uint32 data) const override\n+        {\n+            switch (data)\n+            {\n+                case BOTAI_MISC_PET_TYPE:\n+                    return _getCarrionBeetleEntry();\n+                default:\n+                    return 0;\n+            }\n+        }\n+\n+        void Reset() override\n+        {\n+            _impaleCheckTimer = 0;\n+            _carrionBeetlesCheckTimer = 0;\n+            _locustSwarmCheckTimer = 0;\n+\n+            UnsummonAll(false);\n+\n+            DefaultInit();\n+        }\n+\n+        void ReduceCD(uint32 diff) override\n+        {\n+            if (_impaleCheckTimer > diff)                   _impaleCheckTimer -= diff;\n+            if (_carrionBeetlesCheckTimer > diff)           _carrionBeetlesCheckTimer -= diff;\n+            if (_locustSwarmCheckTimer > diff)              _locustSwarmCheckTimer -= diff;\n+        }\n+\n+        void InitPowers() override\n+        {\n+            me->SetPowerType(POWER_MANA);\n+            me->SetMaxPower(POWER_MANA, BASE_MANA_1_CRYPT_LORD);\n+        }\n+\n+        void InitSpells() override\n+        {\n+            InitSpellMap(IMPALE_1);\n+            InitSpellMap(CARRION_BEETLES_1);\n+            InitSpellMap(LOCUST_SWARM_1);\n+        }\n+\n+        void ApplyClassPassives() const override\n+        {\n+            RefreshAura(SPELL_NULLIFY_POISON);\n+        }\n+\n+        bool CanUseManually(uint32 basespell) const override\n+        {\n+            switch (basespell)\n+            {\n+                case IMPALE_1:\n+                //case CARRION_BEETLES_1:\n+                case LOCUST_SWARM_1:\n+                    return true;\n+                default:\n+                    return false;\n+            }\n+        }\n+\n+        bool HasAbilitiesSpecifics() const override { return true; }\n+        void FillAbilitiesSpecifics(Player const* player, std::list<std::string> &specList) override\n+        {\n+            specList.push_back(LocalizedNpcText(player, BOT_TEXT_REFLECT) + \": \" + std::to_string(_getSpikesDamageReflectPct()) + '%');\n+            if (me->GetLevel() >= LOCUST_SWARM_MIN_LEVEL)\n+                specList.push_back(LocalizedNpcText(player, BOT_TEXT_LOCUSTS) + \": \" + std::to_string(_getMaxLocusts()));\n+        }\n+\n+        std::vector<uint32> const* GetDamagingSpellsList() const override\n+        {\n+            return &CryptLord_spells_damage;\n+        }\n+        std::vector<uint32> const* GetCCSpellsList() const override\n+        {\n+            return &CryptLord_spells_cc;\n+        }\n+        //std::vector<uint32> const* GetHealingSpellsList() const override\n+        //{\n+        //    return &CryptLord_spells_heal;\n+        //}\n+        std::vector<uint32> const* GetSupportSpellsList() const override\n+        {\n+            return &CryptLord_spells_support;\n+        }\n+\n+    private:\n+        void _handleLocustSwarm()\n+        {\n+            static const uint32 LOCUSTS_RELEASE_TIME = 4000u;\n+            uint32 max_locusts = _getMaxLocusts();\n+            for (uint32 i = 0; i < max_locusts; ++i)\n+            {\n+                uint32 offset = LOCUSTS_RELEASE_TIME / max_locusts * (i + 1);\n+                Events.AddEventAtOffset([this, num = i]() {\n+                    SummonLocust(num);\n+                }, std::chrono::milliseconds(offset));\n+            }\n+        }\n+\n+        uint32 _getMaxLocusts() const\n+        {\n+            uint8 lvl = me->GetLevel();\n+            uint32 max_locusts;\n+            if (lvl >= DEFAULT_MAX_LEVEL + BotDataMgr::GetLevelBonusForBotRank(me->GetCreatureTemplate()->rank))\n+                max_locusts = MAX_LOCUSTS_MAXLEVEL;\n+            else if (lvl >= 70)\n+                max_locusts = MAX_LOCUSTS_70;\n+            else\n+                max_locusts = MAX_LOCUSTS_BASE;\n+\n+            return max_locusts;\n+        }\n+\n+        uint32 _getSpikesDamageReflectPct() const\n+        {\n+            uint8 lvl = me->GetLevel();\n+            uint32 damage_returned_pct;\n+            if (lvl >= 70)\n+                damage_returned_pct = 50;\n+            else if (lvl >= 60)\n+                damage_returned_pct = 35;\n+            else if (lvl >= 40)\n+                damage_returned_pct = 25;\n+            else if (lvl >= 20)\n+                damage_returned_pct = 20;\n+            else\n+                damage_returned_pct = 15;\n+            return damage_returned_pct;\n+        }\n+\n+        uint32 _getCarrionBeetleEntry() const\n+        {\n+            uint32 entry;\n+            uint8 lvl = me->GetLevel();\n+            if (lvl >= 60)\n+                entry = BOT_PET_CARRION_BEETLE3;\n+            else if (lvl >= 30)\n+                entry = BOT_PET_CARRION_BEETLE2;\n+            else\n+                entry = BOT_PET_CARRION_BEETLE1;\n+            return entry;\n+        }\n+\n+        bool _isUsableCorpse(Creature const* c) const\n+        {\n+            return c->getDeathState() == DeathState::Corpse && c->GetDisplayId() == c->GetNativeDisplayId() &&\n+                !c->IsVehicle() && !c->isWorldBoss() && !c->IsDungeonBoss() &&\n+                ((1u << (c->GetCreatureType()-1)) & USABLE_CORPSE_CREATURE_TYPE_MASK) &&\n+                !c->IsControlledByPlayer() && !c->IsNPCBot();\n+        }\n+\n+        uint32 _impaleCheckTimer;\n+        uint32 _carrionBeetlesCheckTimer;\n+        uint32 _locustSwarmCheckTimer;\n+\n+        using Summons = std::set<Creature*>;\n+        Summons _minions;\n+        using Swarm = std::array<ObjectGuid, MAX_LOCUSTS_MAXLEVEL>;\n+        Swarm _locusts{};\n+    };\n+};\n+\n+void AddSC_crypt_lord_bot()\n+{\n+    new crypt_lord_bot();\n+}\n+\n+#ifdef _MSC_VER\n+# pragma warning(pop)\n+#endif\ndiff --git a/src/server/game/AI/NpcBots/bot_dark_ranger_ai.cpp b/src/server/game/AI/NpcBots/bot_dark_ranger_ai.cpp\nnew file mode 100644\nindex 0000000000..559db09adb\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bot_dark_ranger_ai.cpp\n@@ -0,0 +1,617 @@\n+#include \"bot_ai.h\"\n+#include \"bot_GridNotifiers.h\"\n+#include \"botspell.h\"\n+#include \"ScriptMgr.h\"\n+#include \"SpellAuraEffects.h\"\n+#include \"TemporarySummon.h\"\n+/*\n+Dark Ranger NpcBot (by Trickerer onlysuffering@gmail.com)\n+Description:\n+A former ranger of Quel'thalas forcibly raised from the dead (Warcraft III tribute)\n+Specifics:\n+Spell damage taken reduced by 35%, partially immune to control effects, leather/cloth armor,\n+deals physical/spellshadow damage, spell power bonus: 50% intellect. Main attribute: Agility\n+Abilities:\n+1) Silence. Silences an enemy and up to 4 nearby targets for 8 seconds, 15 seconds cooldown\n+2) Black Arrow. Fires a cursed arrow dealing 150% weapon damage and additional spellshadow damage over time.\n+If affected target dies from Dark Ranger\\'s damage, a Dark Minion will spawn from the corpse\n+(maximum 5 Minions, 80 seconds duration, only works on humanoids, beasts and dragonkin),\n+skeleton level depends on level of the killed unit\n+Deals five times more damage if target is under 20% health\n+3) Drain Life. Drains health from an enemy every second for 5 seconds (6 ticks),\n+healing Dark Ranger for 200% of the drained amount\n+4) Charm NIY\n+5ex) Auto Shot. A hunter auto shot ability since dark ranger is purely ranged and only uses bows.\n+Complete - 75%\n+TODO: Charm\n+*/\n+\n+enum DarkRangerBaseSpells\n+{\n+    AUTO_SHOT_1                         = 75,\n+    BLACK_ARROW_1                       = SPELL_BLACK_ARROW,\n+    DRAIN_LIFE_1                        = SPELL_DRAIN_LIFE,\n+    SILENCE_1                           = SPELL_SILENCE\n+};\n+enum DarkRangerPassives\n+{\n+};\n+enum DarkRangerSpecial\n+{\n+    DRAINLIFE_COST                      = 75 * 5,\n+    MAX_MINIONS                         = 5,\n+\n+    SPELL_SPAWN_ANIM                    = 25035,\n+    SPELL_BLOODY_EXPLOSION              = 36599,\n+    SPELL_THREAT_MOD                    = 31745, //Salvation\n+\n+    MODEL_BLOODY_BONES                  = 25538\n+};\n+\n+static const std::vector<uint32> Darkranger_spells_damage{ BLACK_ARROW_1, DRAIN_LIFE_1 };\n+static const std::vector<uint32> Darkranger_spells_cc{ SILENCE_1 };\n+\n+class dark_ranger_bot : public CreatureScript\n+{\n+public:\n+    dark_ranger_bot() : CreatureScript(\"dark_ranger_bot\") { }\n+\n+    CreatureAI* GetAI(Creature* creature) const override\n+    {\n+        return new dark_ranger_botAI(creature);\n+    }\n+\n+    bool OnGossipHello(Player* player, Creature* creature) override\n+    {\n+        return creature->GetBotAI()->OnGossipHello(player, 0);\n+    }\n+\n+    bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action) override\n+    {\n+        if (bot_ai* ai = creature->GetBotAI())\n+            return ai->OnGossipSelect(player, creature, sender, action);\n+        return true;\n+    }\n+\n+    bool OnGossipSelectCode(Player* player, Creature* creature, uint32 sender, uint32 action, char const* code) override\n+    {\n+        if (bot_ai* ai = creature->GetBotAI())\n+            return ai->OnGossipSelectCode(player, creature, sender, action, code);\n+        return true;\n+    }\n+\n+    struct dark_ranger_botAI : public bot_ai\n+    {\n+        dark_ranger_botAI(Creature* creature) : bot_ai(creature)\n+        {\n+            _botclass = BOT_CLASS_DARK_RANGER;\n+\n+            InitUnitFlags();\n+\n+            //dark ranger immunities\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_POSSESS, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_CHARM, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_SHAPESHIFT, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_TRANSFORM, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_DISARM, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_DISARM_OFFHAND, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_DISARM_RANGED, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_FEAR, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_DISARM, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_POLYMORPH, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_FEAR, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_HORROR, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_TURN, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SLEEP, true);\n+        }\n+\n+        bool doCast(Unit* victim, uint32 spellId)\n+        {\n+            if (CheckBotCast(victim, spellId) != SPELL_CAST_OK)\n+                return false;\n+\n+            return bot_ai::doCast(victim, spellId);\n+        }\n+\n+        void StartAttack(Unit* u, bool force = false)\n+        {\n+            if (!bot_ai::StartAttack(u, force))\n+                return;\n+            GetInPosition(force, u);\n+        }\n+\n+        void JustEngagedWith(Unit* u) override { bot_ai::JustEngagedWith(u); }\n+        void EnterEvadeMode(EvadeReason why = EVADE_REASON_OTHER) override { bot_ai::EnterEvadeMode(why); }\n+        void MoveInLineOfSight(Unit* u) override { bot_ai::MoveInLineOfSight(u); }\n+        void JustDied(Unit* u) override { UnsummonAll(false); bot_ai::JustDied(u); }\n+        void DoNonCombatActions(uint32 /*diff*/) { }\n+\n+        void KilledUnit(Unit* u) override\n+        {\n+            bot_ai::KilledUnit(u);\n+\n+            if (u->GetGUID() == _blackArrowKillGUID)\n+            {\n+                //black arrow affection -> spawn skeleton (launch)\n+                SummonBotPet(u);\n+            }\n+        }\n+\n+        void Counter(uint32 diff)\n+        {\n+            if (Rand() > 55)\n+                return;\n+\n+            if (IsSpellReady(SILENCE_1, diff))\n+            {\n+                Unit* target = FindCastingTarget(CalcSpellMaxRange(SILENCE_1), 0, SILENCE_1);\n+                if (target && doCast(target, GetSpell(SILENCE_1)))\n+                    return;\n+            }\n+        }\n+\n+        void UpdateAI(uint32 diff) override\n+        {\n+            if (!GlobalUpdate(diff))\n+                return;\n+\n+            DoVehicleActions(diff);\n+            if (!CanBotAttackOnVehicle())\n+                return;\n+\n+            CheckDrainLife(diff);\n+\n+            if (IsPotionReady())\n+            {\n+                if (me->GetPower(POWER_MANA) < DRAINLIFE_COST)\n+                    DrinkPotion(true);\n+                else if (GetHealthPCT(me) < 30)\n+                    DrinkPotion(false);\n+            }\n+\n+            if (ProcessImmediateNonAttackTarget())\n+                return;\n+\n+            if (!CheckAttackTarget())\n+            {\n+                me->InterruptSpell(CURRENT_AUTOREPEAT_SPELL);\n+\n+                if (!IAmFree() && me->IsStandState() && !me->isMoving() && !master->isMoving() && !me->IsMounted() &&\n+                    !me->IsInCombat() && !master->IsInCombat() && !IsCasting() && Rand() < 10 && me->GetDistance(master) < 15 &&\n+                    !me->HasStealthAura() && !me->HasInvisibilityAura() && !me->HasAuraType(SPELL_AURA_PERIODIC_DAMAGE) &&\n+                    _minions.empty())\n+                {\n+                    me->CastSpell(me, RACIAL_SHADOWMELD, true);\n+                }\n+\n+                return;\n+            }\n+\n+            if (IsCasting())\n+                return;\n+\n+            CheckUsableItems(diff);\n+\n+            DoRangedAttack(diff);\n+        }\n+\n+        void DoRangedAttack(uint32 diff)\n+        {\n+            Unit* mytar = opponent ? opponent : disttarget ? disttarget : nullptr;\n+            if (!mytar)\n+                return;\n+\n+            StartAttack(mytar, IsMelee());\n+\n+            CheckAttackState();\n+            if (!me->IsAlive() || !mytar->IsAlive())\n+                return;\n+\n+            Counter(diff);\n+\n+            CheckBlackArrow(diff);\n+\n+            MoveBehind(mytar);\n+\n+            float dist = me->GetDistance(mytar);\n+            float maxRangeLong = 30.f;\n+\n+            bool inpostion = !mytar->HasAuraType(SPELL_AURA_MOD_CONFUSE) || dist > maxRangeLong - 15.f;\n+\n+            //Auto Shot\n+            if (Spell const* shot = me->GetCurrentSpell(CURRENT_AUTOREPEAT_SPELL))\n+            {\n+                if (shot->GetSpellInfo()->Id == AUTO_SHOT_1 && (shot->m_targets.GetUnitTarget() != mytar || !inpostion))\n+                    me->InterruptSpell(CURRENT_AUTOREPEAT_SPELL);\n+            }\n+            else if (HasRole(BOT_ROLE_DPS)/* && dist > 5*/ && dist < maxRangeLong)\n+            {\n+                if (doCast(mytar, AUTO_SHOT_1))\n+                {}\n+            }\n+\n+            //RANGED SECTION\n+            if (dist > maxRangeLong)\n+                return;\n+\n+            //Black Arrow\n+            if (IsSpellReady(BLACK_ARROW_1, diff) && HasRole(BOT_ROLE_DPS) &&\n+                (Rand() < 20 || !mytar->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_WARLOCK, 0x0, 0x4, 0x0, me->GetGUID())))\n+            {\n+                if (doCast(mytar, GetSpell(BLACK_ARROW_1)))\n+                    return;\n+            }\n+        }\n+\n+        void CheckDrainLife(uint32 diff)\n+        {\n+            if (!IsSpellReady(DRAIN_LIFE_1, diff) || !HasRole(BOT_ROLE_DPS) || GetHealthPCT(me) > 70 || Rand() > 80 ||\n+                IsCasting())\n+                return;\n+\n+            Unit* target = me->GetVictim();\n+            if (!target)\n+                target = FindAffectedTarget(GetSpell(BLACK_ARROW_1), me->GetGUID(), 30);\n+\n+            if (target && doCast(target, GetSpell(DRAIN_LIFE_1)))\n+                return;\n+        }\n+\n+        void CheckBlackArrow(uint32 diff)\n+        {\n+            if (!IsSpellReady(BLACK_ARROW_1, diff) || !HasRole(BOT_ROLE_DPS) || Rand() > 30)\n+                return;\n+\n+            std::list<Unit*> targets;\n+            GetNearbyTargetsList(targets, 50, 0);\n+            std::erase_if(targets, BOTAI_PRED::AuraedTargetExcludeByCaster(BLACK_ARROW_1, me->GetGUID()));\n+            if (Unit* target = !targets.empty() ? Bcore::Containers::SelectRandomContainerElement(targets) : nullptr)\n+            {\n+                if (doCast(target, GetSpell(BLACK_ARROW_1)))\n+                    return;\n+            }\n+        }\n+\n+        void ApplyClassSpellCritMultiplierAll(Unit const* /*victim*/, float& /*crit_chance*/, SpellInfo const* /*spellInfo*/, SpellSchoolMask /*schoolMask*/, WeaponAttackType /*attackType*/) const override\n+        {\n+        }\n+\n+        void ApplyClassDamageMultiplierMeleeSpell(int32& damage, SpellNonMeleeDamage& damageinfo, SpellInfo const* spellInfo, WeaponAttackType /*attackType*/, bool /*iscrit*/) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            float flat_mod = 0.f;\n+\n+            //2) apply bonus damage mods\n+            float pctbonus = 1.0f;\n+            //Black Arrow on targets < 20% hp (only direct damage)\n+            if (baseId == BLACK_ARROW_1 && damageinfo.target && damageinfo.target->HasAuraState(AURA_STATE_HEALTHLESS_20_PERCENT))\n+                pctbonus *= 5.f;\n+\n+            damage = int32(damage * pctbonus + flat_mod);\n+        }\n+\n+        void ApplyClassDamageMultiplierSpell(int32& damage, SpellNonMeleeDamage& /*damageinfo*/, SpellInfo const* /*spellInfo*/, WeaponAttackType /*attackType*/, bool /*iscrit*/) const override\n+        {\n+            //uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //uint8 lvl = me->GetLevel();\n+            float fdamage = float(damage);\n+            float flat_mod = 0.f;\n+\n+            //2) apply bonus damage mods\n+            float pctbonus = 1.0f;\n+            //if (iscrit)\n+            //{\n+            //    //!!!spell damage is not yet critical and will be multiplied by 1.5\n+            //    //so we should put here bonus damage mult /1.5\n+            //    //Lava Flows (part 1): 24% additional crit damage bonus for Lava Burst\n+            //    if (lvl >= 50 && spellId == GetSpell(LAVA_BURST_1))\n+            //        pctbonus *= 1.16f;\n+            //}\n+            ////Trap Mastery part 2: 30% bonus damage for Immolation Trap, Explosive Trap and Black Arrow\n+            //if (lvl >= 15 && (baseId == IMMOLATION_TRAP_AURA_1 || baseId == EXPLOSIVE_TRAP_AURA_1 || baseId == BLACK_ARROW_1))\n+            //    pctbonus *= 1.3f;\n+            //Black Arrow on targets < 20% hp (only direct damage)\n+            //if (baseId == BLACK_ARROW_1 && damageinfo.target && damageinfo.target->HasAuraState(AURA_STATE_HEALTHLESS_20_PERCENT))\n+            //    pctbonus *= 5.f;\n+\n+            damage = int32(fdamage * pctbonus + flat_mod);\n+        }\n+\n+        void ApplyClassEffectMods(SpellInfo const* spellInfo, uint8 effIndex, float& value) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //uint8 lvl = me->GetLevel();\n+            float pctbonus = 1.0f;\n+\n+            //Drain Life scaling from health pool: 2%\n+            if (baseId == DRAIN_LIFE_1 && effIndex == EFFECT_0)\n+                value += float(me->GetMaxHealth()) * 0.02f;\n+\n+            value = value * pctbonus;\n+        }\n+\n+        void OnClassSpellGo(SpellInfo const* /*spellInfo*/) override\n+        {\n+            //uint32 spellId = spellInfo->Id;\n+            //uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+\n+            //Rapid Killing: use up buff manually\n+            //if (baseId == AIMED_SHOT_1 || baseId == ARCANE_SHOT_1 || baseId == CHIMERA_SHOT_1)\n+            //{\n+            //    if (AuraEffect const* rapi = me->GetAuraEffect(RAPID_KILLING_BUFF, 0))\n+            //        if (rapi->IsAffectedOnSpell(spellInfo))\n+            //            me->RemoveAura(RAPID_KILLING_BUFF);\n+            //}\n+        }\n+\n+        void SpellHitTarget(Unit* wtarget, SpellInfo const* spell) override\n+        {\n+            Unit* target = wtarget->ToUnit();\n+            if (!target)\n+                return;\n+\n+            if (target == me)\n+                return;\n+\n+            //uint32 baseId = spell->GetFirstRankSpell()->Id;\n+            //uint8 lvl = me->GetLevel();\n+\n+            //if (baseId == HUNTERS_MARK_1)\n+            //{\n+            //    //DarkRanger's Mark helper\n+            //    if (AuraEffect* mark = target->GetAuraEffect(spell->Id, 1, me->GetGUID()))\n+            //    {\n+            //        //Glyph of DarkRanger's Mark: +20% effect\n+            //        //Improved DarkRanger's Mark: +30% effect\n+            //        if (lvl >= 15)\n+            //            mark->ChangeAmount(mark->GetAmount() + mark->GetAmount() / 2);\n+            //        else if (lvl >= 10)\n+            //            mark->ChangeAmount(mark->GetAmount() * 13 / 10);\n+            //    }\n+            //}\n+\n+            OnSpellHitTarget(target, spell);\n+        }\n+\n+        void SpellHit(Unit* wcaster, SpellInfo const* spell) override\n+        {\n+            Unit* caster = wcaster->ToUnit();\n+            if (!caster)\n+                return;\n+\n+            OnSpellHit(caster, spell);\n+        }\n+\n+        void OnBotDamageDealt(Unit* victim, uint32 damage, CleanDamage const* /*cleanDamage*/, DamageEffectType /*damagetype*/, SpellInfo const* spellInfo) override\n+        {\n+            //black arrow affection -> spawn skeleton (mark)\n+            if (damage && me->IsAlive() && victim->IsCreature() && damage >= victim->GetHealth() &&\n+                (victim->GetCreatureType() == CREATURE_TYPE_BEAST ||\n+                victim->GetCreatureType() == CREATURE_TYPE_DRAGONKIN ||\n+                victim->GetCreatureType() == CREATURE_TYPE_HUMANOID) &&\n+                ((spellInfo && spellInfo->GetFirstRankSpell()->Id == BLACK_ARROW_1) ||\n+                victim->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_WARLOCK, 0x0, 0x4, 0x0, me->GetGUID())))\n+                _blackArrowKillGUID = victim->GetGUID();\n+        }\n+\n+        void DamageDealt(Unit* victim, uint32& damage, DamageEffectType damageType, SpellSchoolMask damageSchoolMask) override\n+        {\n+            bot_ai::DamageDealt(victim, damage, damageType, damageSchoolMask);\n+        }\n+\n+        void DamageTaken(Unit* u, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellSchoolMask /*schoolMask*/) override\n+        {\n+            if (!u)\n+                return;\n+            if (!u->IsInCombat() && !me->IsInCombat())\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void OwnerAttackedBy(Unit* u) override\n+        {\n+            if (!u)\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        uint8 GetPetPositionNumber(Creature const* summon) const override\n+        {\n+            uint8 i = 0;\n+            for (Summons::const_iterator citr = _minions.begin(); citr != _minions.end(); ++citr)\n+            {\n+                if ((*citr)->GetGUID() == summon->GetGUID())\n+                    return i;\n+                ++i;\n+            }\n+            return 0;\n+        }\n+\n+        void SummonBotPet(Unit* from)\n+        {\n+            if (_minions.size() >= MAX_MINIONS)\n+            {\n+                //BOT_LOG_ERROR(\"entities.player\", \"bot_dranger_ai::SummonBotPet(): max minions\");\n+                Unit* u = nullptr;\n+                //try 1: by minimal level\n+                uint8 minlevel = me->GetLevel();\n+                for (Unit* s : _minions)\n+                {\n+                    if (s->GetLevel() < minlevel)\n+                    {\n+                        minlevel = s->GetLevel();\n+                        u = s;\n+                    }\n+                }\n+                //try 2: by minimal duration (if expiring already)\n+                if (!u)\n+                {\n+                    uint32 minduration = static_cast<uint32>((*_minions.begin())->GetAI()->GetData(BOTPETAI_MISC_DURATION_MAX) * 3 / 4);\n+                    for (Unit* s : _minions)\n+                    {\n+                        if (s->GetAI()->GetData(BOTPETAI_MISC_DURATION) > minduration)\n+                        {\n+                            minduration = s->GetAI()->GetData(BOTPETAI_MISC_DURATION);\n+                            u = s;\n+                        }\n+                    }\n+                }\n+\n+                if (!u)\n+                    return;\n+\n+                u->ToTempSummon()->UnSummon();\n+            }\n+\n+            //addition: change unit's modelid\n+            if (!from->IsPet() && !from->IsVehicle() &&\n+                !from->ToCreature()->isWorldBoss() &&\n+                !from->ToCreature()->IsDungeonBoss())\n+            {\n+                from->CastSpell(from, SPELL_BLOODY_EXPLOSION, true);\n+                from->SetDisplayId(MODEL_BLOODY_BONES);\n+            }\n+\n+            uint32 rank = from->ToCreature()->GetCreatureTemplate()->rank;\n+            uint32 entry = (rank == CREATURE_ELITE_NORMAL) ? BOT_PET_DARK_MINION : BOT_PET_DARK_MINION_ELITE;\n+\n+            uint8 maxLevel = std::min<uint8>(from->GetLevel(), me->GetLevel());\n+\n+            Position pos = from->GetPosition();\n+\n+            Creature* myPet = me->SummonCreature(entry, pos, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 1000);\n+            myPet->SetCreator(master);\n+            myPet->SetOwnerGUID(me->GetGUID());\n+            myPet->SetFaction(master->GetFaction());\n+            myPet->SetControlledByPlayer(!IAmFree());\n+            myPet->SetPvP(me->IsPvP());\n+            myPet->SetByteValue(UNIT_FIELD_BYTES_2, 1, master->GetByteValue(UNIT_FIELD_BYTES_2, 1));\n+            myPet->SetUInt32Value(UNIT_CREATED_BY_SPELL, BLACK_ARROW_1);\n+\n+            //dark minion immunities\n+            myPet->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_SHAPESHIFT, true);\n+            myPet->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_TRANSFORM, true);\n+            myPet->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_FEAR, true);\n+            myPet->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_POLYMORPH, true);\n+            myPet->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_FEAR, true);\n+            myPet->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_HORROR, true);\n+            myPet->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SLEEP, true);\n+            //heal\n+            myPet->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_HEAL, true);\n+            myPet->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_HEAL_PCT, true);\n+            myPet->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_PERIODIC_HEAL, true);\n+\n+            //myPet->CastSpell(myPet, SPELL_BLOODY_EXPLOSION, true);\n+            myPet->CastSpell(myPet, SPELL_SPAWN_ANIM, true);\n+            if (Aura* stun = myPet->AddAura(SUMMONING_DISORIENTATION, myPet))\n+            {\n+                stun->SetDuration(1500);\n+                stun->SetMaxDuration(1500);\n+            }\n+\n+            myPet->GetAI()->SetData(BOTPETAI_MISC_MAXLEVEL, maxLevel);\n+            _minions.insert(myPet);\n+        }\n+\n+        void UnsummonAll(bool savePets = true) override\n+        {\n+            UnsummonCreatures(_minions, savePets);\n+        }\n+\n+        void SummonedCreatureDies(Creature* /*summon*/, Unit* /*killer*/) override\n+        {\n+            //BOT_LOG_ERROR(\"entities.unit\", \"SummonedCreatureDies: %s's %s\", me->GetName().c_str(), summon->GetName().c_str());\n+            //if (summon == botPet)\n+            //    botPet = nullptr;\n+        }\n+\n+        void SummonedCreatureDespawn(Creature* summon) override\n+        {\n+            //all darkranger bot pets despawn at death or manually (gossip, teleport, etc.)\n+            //BOT_LOG_ERROR(\"entities.unit\", \"SummonedCreatureDespawn: %s's %s\", me->GetName().c_str(), summon->GetName().c_str());\n+            if (_minions.contains(summon))\n+                _minions.erase(summon);\n+        }\n+\n+        float GetSpellAttackRange(bool longRange) const override\n+        {\n+            return longRange ? CalcSpellMaxRange(BLACK_ARROW_1) - 5.f : 15.f;\n+        }\n+\n+        uint32 GetAIMiscValue(uint32 data) const override\n+        {\n+            switch (data)\n+            {\n+                case BOTAI_MISC_PET_TYPE:\n+                    return BOT_PET_DARK_MINION;\n+                default:\n+                    return 0;\n+            }\n+        }\n+\n+        void Reset() override\n+        {\n+            UnsummonAll(false);\n+\n+            //for (uint8 i = 0; i != MAX_SPELL_SCHOOL; ++i)\n+            //    me->m_threatModifier[1] = 0.0f;\n+\n+            _blackArrowKillGUID = ObjectGuid::Empty;\n+\n+            DefaultInit();\n+\n+            //threat mod\n+            if (Aura* threat = me->AddAura(SPELL_THREAT_MOD, me))\n+                threat->GetEffect(0)->ChangeAmount(-100);\n+        }\n+\n+        void ReduceCD(uint32 /*diff*/) override\n+        {\n+            //if (trapTimer > diff)                   trapTimer -= diff;\n+        }\n+\n+        void InitPowers() override\n+        {\n+            me->SetPowerType(POWER_MANA);\n+        }\n+\n+        void InitSpells() override\n+        {\n+            //uint8 lvl = me->GetLevel();\n+            InitSpellMap(AUTO_SHOT_1);\n+            InitSpellMap(BLACK_ARROW_1);\n+            InitSpellMap(DRAIN_LIFE_1);\n+            InitSpellMap(SILENCE_1);\n+        }\n+\n+        void ApplyClassPassives() const override\n+        {\n+        }\n+\n+        std::vector<uint32> const* GetDamagingSpellsList() const override\n+        {\n+            return &Darkranger_spells_damage;\n+        }\n+        std::vector<uint32> const* GetCCSpellsList() const override\n+        {\n+            return &Darkranger_spells_cc;\n+        }\n+        //std::vector<uint32> const* GetHealingSpellsList() const override\n+        //{\n+        //    return &Darkranger_spells_heal;\n+        //}\n+        //std::vector<uint32> const* GetSupportSpellsList() const override\n+        //{\n+        //    return &Darkranger_spells_support;\n+        //}\n+    private:\n+        ObjectGuid _blackArrowKillGUID;\n+        using Summons = std::set<Creature*>;\n+        Summons _minions;\n+    };\n+};\n+\n+void AddSC_dark_ranger_bot()\n+{\n+    new dark_ranger_bot();\n+}\ndiff --git a/src/server/game/AI/NpcBots/bot_death_knight_ai.cpp b/src/server/game/AI/NpcBots/bot_death_knight_ai.cpp\nnew file mode 100644\nindex 0000000000..0db68a01f3\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bot_death_knight_ai.cpp\n@@ -0,0 +1,2152 @@\n+#include \"bot_ai.h\"\n+#include \"botlogtraits.h\"\n+#include \"botmgr.h\"\n+#include \"bottext.h\"\n+#include \"bottraits.h\"\n+#include \"DBCStores.h\"\n+#include \"GameEventMgr.h\"\n+#include \"Group.h\"\n+#include \"Log.h\"\n+#include \"Map.h\"\n+#include \"MotionMaster.h\"\n+#include \"ObjectAccessor.h\"\n+#include \"Player.h\"\n+#include \"ScriptMgr.h\"\n+#include \"Spell.h\"\n+#include \"SpellAuraEffects.h\"\n+#include \"SpellMgr.h\"\n+#include \"TemporarySummon.h\"\n+#include \"World.h\"\n+/*\n+Death Knight NpcBot by Trickerer onlysuffering@gmail.com\n+Complete - around 92%\n+Note: Rune system adapted from TC\n+TODO: pet related\n+Notes: army of the dead is not working off the bat, need ai workaround\n+*/\n+\n+enum DeathKnightBaseSpells\n+{\n+    BLOOD_STRIKE_1                      = 45902,\n+    ICY_TOUCH_1                         = 45477,\n+    PLAGUE_STRIKE_1                     = 45462,\n+    DEATH_STRIKE_1                      = 49998,\n+    OBLITERATE_1                        = 49020,\n+    RUNE_STRIKE_1                       = 56815,\n+    HEART_STRIKE_1                      = 55050,\n+    FROST_STRIKE_1                      = 49143,\n+    SCOURGE_STRIKE_1                    = 55090,\n+\n+    BLOOD_BOIL_1                        = 48721,\n+    DEATH_AND_DECAY_1                   = 43265,\n+    HOWLING_BLAST_1                     = 49184,\n+\n+    DEATH_COIL_1                        = 47541,\n+    DEATH_GRIP_1                        = 49576,\n+    PESTILENCE_1                        = 50842,\n+    MIND_FREEZE_1                       = 47528,\n+    STRANGULATE_1                       = 47476,\n+    CHAINS_OF_ICE_1                     = 45524,\n+    ICEBOUND_FORTITUDE_1                = 48792,\n+    DARK_COMMAND_1                      = 56222,\n+    ANTI_MAGIC_SHELL_1                  = 48707,\n+    ARMY_OF_THE_DEAD_1                  = 42650,\n+\n+    PATH_OF_FROST_1                     = 3714,\n+    HORN_OF_WINTER_1                    = 57330,\n+    EMPOWER_RUNE_WEAPON_1               = 47568,\n+    BLOOD_TAP_1                         = 45529,\n+\n+    RUNE_TAP_1                          = 48982,\n+    LICHBORNE_1                         = 49039,\n+    //CE\n+    MARK_OF_BLOOD_1                     = 49005,\n+    DEATHCHILL_1                        = 49796,\n+    HYSTERIA_1                          = 49016,\n+    HUNGERING_COLD_1                    = 49203,\n+    ANTI_MAGIC_ZONE_1                   = 48707,\n+    VAMPIRIC_BLOOD_1                    = 55233,\n+    UNBREAKABLE_ARMOR_1                 = 51271,\n+    BONE_SHIELD_1                       = 49222,\n+\n+    DANCING_RUNE_DEAPON_1               = 49028,\n+    SUMMON_GARGOYLE_1                   = 49206,\n+\n+    BLOOD_PRESENCE_1                    = 48266,\n+    FROST_PRESENCE_1                    = 48263,\n+    UNHOLY_PRESENCE_1                   = 48265//unused\n+};\n+enum DeathKnightPassives\n+{\n+//Talents\n+    BUTCHERY                            = 49483,//rank 2\n+    TOUGHNESS                           = 49789,//rank 5\n+    BLADED_ARMOR                        = 49393,//rank 5\n+    SCENT_OF_BLOOD                      = 49509,//rank 3\n+    TWO_HANDED_WEAPON_SPECIALIZATION    = 55108,//rank 2\n+    ICY_TALONS                          = 50887,//rank 5\n+    ANNIHILATION                        = 51473,//rank 3\n+    NECROSIS1                           = 51459,\n+    NECROSIS2                           = 51462,\n+    NECROSIS3                           = 51463,\n+    NECROSIS4                           = 51464,\n+    NECROSIS5                           = 51465,\n+    SPELL_DEFLECTION                    = 49497,//rank 3\n+    VENDETTA                            = 55136,//rank 3\n+    KILLING_MACHINE                     = 51130,//rank 5\n+    CHILL_OF_THE_GRAVE                  = 50115,//rank 2\n+    ON_A_PALE_HORSE_A                   = 51970,//rank 2\n+    ON_A_PALE_HORSE_B                   = 51986,//rank 2\n+    BLOOD_CAKED_BLADE1                  = 49219,\n+    BLOOD_CAKED_BLADE2                  = 49627,\n+    BLOOD_CAKED_BLADE3                  = 49628,\n+    FRIGID_DREADPLATE                   = 51109,//rank 3\n+    UNHOLY_BLIGHT                       = 49194,\n+    DIRGE                               = 51206,//rank 2\n+    BLOODY_VENGEANCE1                   = 48988,\n+    BLOODY_VENGEANCE2                   = 49503,\n+    BLOODY_VENGEANCE3                   = 49504,\n+    ABOMINATIONS_MIGHT                  = 53138,//rank 2\n+    IMPROVED_ICY_TALONS                 = 55610,\n+    DESECRATION                         = 55667,//rank 2\n+    //BLOODWORMS                          = 49543,//rank 3\n+    IMPROVED_BLOOD_PRESENCE             = 50371,//rank 2\n+    DESOLATION                          = 66817,//rank 5\n+    IMPROVED_UNHOLY_PRESENCE            = 50392,//rank 2\n+    THREAT_OF_THASSARIAN                = 66192,//rank 3\n+    CRYPT_FEVER                         = 49632,//rank 3\n+    WILL_OF_THE_NECROPOLIS              = 52286,//rank 3\n+    ACCLIMATION                         = 50152,//rank 3\n+    WANDERING_PLAGUE                    = 49655,//rank 3\n+    EBON_PLAGUEBRINGER                  = 51161,//rank 3\n+\n+//Other\n+    GLYPH_DISEASE                       = 63334,\n+    GLYPH_CHAINS_OF_ICE                 = 58620,\n+    GLYPH_UNHOLY_BLIGHT                 = 63332,\n+    CHAINS_OF_ICE_FROST_RUNE_REFRESH    = 62459,//5 runic power gain\n+\n+    ITEM_DEATH_KNIGHT_T8_MELEE_4P       = 64736,\n+    ITEM_DEATH_KNIGHT_T9_MELEE_4P       = 67118,\n+\n+//Special\n+    FROST_FEVER                         = 59921,\n+    BLOOD_PLAGUE                        = 59879,\n+    RUNE_STRIKE_PASSIVE                 = 56816,//rune strike activation req aura\n+    RUNIC_POWER_MASTERY                 = 49455//rank 1\n+};\n+enum DeathKnightSpecial\n+{\n+    FROST_FEVER_AURA                    = 55095,\n+    BLOOD_PLAGUE_AURA                   = 55078,\n+    CRYPT_FEVER_AURA                    = 50510,//rank 3\n+    EBON_PLAGUE_AURA                    = 51735,//rank 3\n+\n+    BLADE_BARRIER_BUFF                  = 64859,//rank 5\n+    KILLING_MACHINE_BUFF                = 51124,\n+    RIME_BUFF                           = 59052,//Freezing Fog\n+    ITEM_DEATH_KNIGHT_T10_TANK_4P_BUFF  = 70654,//Blood Armor\n+    ITEM_DEATH_KNIGHT_T10_MELEE_4P_BUFF = 70657,//Advantage\n+\n+    CHILBLAINS_DEBUFF                   = 50436,//Icy Clutch rank 3\n+\n+    BLOOD_PRESENCE_HEAL_EFFECT          = 50475,\n+    //UNHOLY_BLIGHT_AURA                  = 50536,\n+\n+    DEATH_STRIKE_HEAL                   = 45470,\n+    DEATH_COIL_HEAL                     = 47633,\n+    DEATH_COIL_DAMAGE                   = 47632,\n+\n+    GLYPH_HEART_STRIKE_DEBUFF           = 58617, //50% move slow\n+    GLYPH_RUNE_TAP_HEAL                 = 59754,\n+    GLYPH_SCOURGE_STRIKE_EFFECT         = 69961,\n+\n+    //NPC_EBON_GARGOYLE                   = 27829,\n+    NPC_DANCING_RUNE_WEAPON             = 27893\n+};\n+\n+static const std::vector<uint32> Deathknight_spells_damage\n+{ BLOOD_BOIL_1, BLOOD_STRIKE_1, DEATH_AND_DECAY_1, DEATH_COIL_1,DEATH_STRIKE_1,\n+FROST_STRIKE_1, HEART_STRIKE_1, HOWLING_BLAST_1, HUNGERING_COLD_1, ICY_TOUCH_1,\n+OBLITERATE_1, PESTILENCE_1, PLAGUE_STRIKE_1, RUNE_STRIKE_1, SCOURGE_STRIKE_1 };\n+static const std::vector<uint32> Deathknight_spells_cc\n+{ DEATH_GRIP_1, CHAINS_OF_ICE_1, MIND_FREEZE_1, STRANGULATE_1 };\n+static const std::vector<uint32> Deathknight_spells_support\n+{ ANTI_MAGIC_SHELL_1, ANTI_MAGIC_ZONE_1, ARMY_OF_THE_DEAD_1, BLOOD_TAP_1, BONE_SHIELD_1,DARK_COMMAND_1, DEATHCHILL_1,\n+DEATH_COIL_1, EMPOWER_RUNE_WEAPON_1, HORN_OF_WINTER_1, HUNGERING_COLD_1,HYSTERIA_1, ICEBOUND_FORTITUDE_1,\n+LICHBORNE_1, MARK_OF_BLOOD_1, PATH_OF_FROST_1, PESTILENCE_1, RUNE_TAP_1,UNBREAKABLE_ARMOR_1, VAMPIRIC_BLOOD_1 };\n+\n+const RuneType runeSlotTypes[MAX_RUNES] =\n+{\n+    RUNE_BLOOD,\n+    RUNE_BLOOD,\n+    RUNE_UNHOLY,\n+    RUNE_UNHOLY,\n+    RUNE_FROST,\n+    RUNE_FROST\n+};\n+struct BotRuneInfo\n+{\n+    uint8 BaseRune;\n+    uint8 CurrentRune;\n+    int32 Cooldown;\n+};\n+class death_knight_bot : public CreatureScript\n+{\n+public:\n+    death_knight_bot() : CreatureScript(\"death_knight_bot\") { }\n+\n+    CreatureAI* GetAI(Creature* creature) const override\n+    {\n+        return new death_knight_botAI(creature);\n+    }\n+\n+    bool OnGossipHello(Player* player, Creature* creature) override\n+    {\n+        return creature->GetBotAI()->OnGossipHello(player, 0);\n+    }\n+\n+    bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action) override\n+    {\n+        if (bot_ai* ai = creature->GetBotAI())\n+            return ai->OnGossipSelect(player, creature, sender, action);\n+        return true;\n+    }\n+\n+    bool OnGossipSelectCode(Player* player, Creature* creature, uint32 sender, uint32 action, char const* code) override\n+    {\n+        if (bot_ai* ai = creature->GetBotAI())\n+            return ai->OnGossipSelectCode(player, creature, sender, action, code);\n+        return true;\n+    }\n+\n+    struct death_knight_botAI : public bot_ai\n+    {\n+        death_knight_botAI(Creature* creature) : bot_ai(creature)\n+        {\n+            _botclass = BOT_CLASS_DEATH_KNIGHT;\n+\n+            InitUnitFlags();\n+        }\n+\n+        bool doCast(Unit* victim, uint32 spellId)\n+        {\n+            if (CheckBotCast(victim, spellId) != SPELL_CAST_OK)\n+                return false;\n+\n+            if (!HaveRunes(spellId))\n+                return false;\n+\n+            return bot_ai::doCast(victim, spellId);\n+        }\n+\n+        void SpendRunes(SpellInfo const* spellInfo, bool didHit) override\n+        {\n+            SpellRuneCostEntry const* src = sSpellRuneCostStore.LookupEntry(spellInfo->RuneCostID);\n+            if (!src || (src->NoRuneCost() && src->NoRunicPowerGain()))\n+                return;\n+\n+            //Freezing Fog\n+            if (rimeProcTimer > GetLastDiff() && spellInfo->Id == HOWLING_BLAST_1)\n+            {\n+                for (auto i : NPCBots::index_array<uint8, RUNE_DEATH>)\n+                    runeCost[i] = 0;\n+            }\n+            else\n+            {\n+                for (auto i : NPCBots::index_array<uint8, RUNE_DEATH>)\n+                    runeCost[i] = src->RuneCost[i];\n+            }\n+\n+            runeCost[RUNE_DEATH] = 0;\n+\n+            //debug 1\n+            //std::ostringstream str;\n+            //str << \"Casted \" << spellInfo->SpellName[0] << \" cost\"\n+            //    << \" \" << runeCost[0] << \" \" << runeCost[1] << \" \" << runeCost[2] << \" \" << runeCost[3];\n+\n+                for (auto i : NPCBots::index_array<uint8, MAX_RUNES>)\n+            {\n+                uint8 rune = _runes[i].CurrentRune;\n+                if (runeCost[rune] > 0 && _runes[i].Cooldown <= 0)\n+                    if (SpendRune(rune, didHit))\n+                        runeCost[rune]--;\n+            }\n+\n+            runeCost[RUNE_DEATH] = runeCost[RUNE_BLOOD] + runeCost[RUNE_UNHOLY] + runeCost[RUNE_FROST];\n+\n+            if (runeCost[RUNE_DEATH] > 0)\n+            {\n+                for (uint8 i = 0; i != MAX_RUNES && runeCost[RUNE_DEATH] > 0; ++i)\n+                {\n+                    if (_runes[i].CurrentRune == RUNE_DEATH && _runes[i].Cooldown <= 0)\n+                        if (SpendRune(RUNE_DEATH, didHit))\n+                            runeCost[RUNE_DEATH]--;\n+                }\n+            }\n+\n+            //debug 2\n+            //uint32 runesLeft[NUM_RUNE_TYPES] = { 0,0,0,0 };\n+            //for (uint8 i = 0; i != NUM_RUNE_TYPES; ++i)\n+            //    for (uint8 j = 0; j != MAX_RUNES; ++j)\n+            //        if (_runes[j].CurrentRune == i && _runes[j].Cooldown <= 0)\n+            //            runesLeft[i]++;\n+            //str << \" left\" << \" \" << runesLeft[0] << \" \" << runesLeft[1] << \" \" << runesLeft[2] << \" \" << runesLeft[3];\n+            //BotWhisper(str.view());\n+\n+            me->ModifyPower(POWER_RUNIC_POWER, int32(src->runePowerGain * runicpowerIncomeMult));\n+\n+            //BladeBarrier\n+            if (/*src->RuneCost[RUNE_BLOOD] > 0 && */GetCooledRunesCount(RUNE_BLOOD) > 1)\n+                me->CastSpell(me, BLADE_BARRIER_BUFF, true);\n+\n+            //Item - Death Knight T10 Melee 4P Bonus\n+            if (me->GetLevel() >= 80 && GetCooledRunesCount() == MAX_RUNES)\n+                me->CastSpell(me, ITEM_DEATH_KNIGHT_T10_MELEE_4P_BUFF, true);\n+        }\n+\n+        void getpower()\n+        {\n+            runicpower = me->GetPower(POWER_RUNIC_POWER);\n+            if (me->FindCurrentSpellBySpellId(RUNE_STRIKE_1))\n+                runicpower = std::max<int32>(runicpower - 200, 0);\n+        }\n+\n+        int32 rcost(uint32 spellId) const\n+        {\n+            if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId))\n+                return spellInfo->CalcPowerCost(me, spellInfo->GetSchoolMask());\n+            return 0;\n+        }\n+\n+        uint8 GetBotStance() const override { return _presence; }\n+\n+        void StartAttack(Unit* u, bool force = false)\n+        {\n+            if (!bot_ai::StartAttack(u, force))\n+                return;\n+            GetInPosition(force, u);\n+        }\n+\n+        void JustEngagedWith(Unit* u) override { bot_ai::JustEngagedWith(u); }\n+        void EnterEvadeMode(EvadeReason why = EVADE_REASON_OTHER) override { bot_ai::EnterEvadeMode(why); }\n+        void MoveInLineOfSight(Unit* u) override { bot_ai::MoveInLineOfSight(u); }\n+        void JustDied(Unit* u) override { UnsummonAll(false); bot_ai::JustDied(u); }\n+        void KilledUnit(Unit* u) override { bot_ai::KilledUnit(u); }\n+\n+        void DoNonCombatActions(uint32 diff)\n+        {\n+            if (GC_Timer > diff || Rand() > 20 || IsCasting() || Feasting())\n+                return;\n+\n+            //PATH OF FROST\n+            if (GetSpell(PATH_OF_FROST_1) && HaveRunes(PATH_OF_FROST_1)/* && !me->IsMounted()*/) //works while mounted\n+            {\n+                if ((me->HasUnitMovementFlag(MOVEMENTFLAG_SWIMMING) && !me->HasAuraType(SPELL_AURA_WATER_WALK)) ||\n+                    (master->HasUnitMovementFlag(MOVEMENTFLAG_SWIMMING) && !master->HasAuraType(SPELL_AURA_WATER_WALK)))\n+                {\n+                    if (doCast(me, GetSpell(PATH_OF_FROST_1)))\n+                        return;\n+                }\n+            }\n+        }\n+\n+        void CheckHysteria(uint32 diff)\n+        {\n+            if (!IsSpellReady(HYSTERIA_1, diff) || Rand() > 35)\n+                return;\n+\n+            Unit* target = nullptr;\n+\n+            if (master->GetVictim() && master->IsInCombat() && IsMeleeClass(master->GetClass()) &&\n+                GetHealthPCT(master) > 60 && me->GetDistance(master) < 30 &&\n+                master->getAttackers().empty() && !CCed(master, true) &&\n+                !master->GetAuraEffect(SPELL_AURA_MOD_DAMAGE_PERCENT_DONE, SPELLFAMILY_DEATHKNIGHT, 0x20000000, 0x0, 0x0))\n+                target = master;\n+\n+            if (IAmFree())\n+                return;\n+\n+            if (!target)\n+            {\n+                Group const* gr = master->GetGroup();\n+                if (gr)\n+                {\n+                    for (GroupReference const* itr = gr->GetFirstMember(); itr != nullptr; itr = itr->next())\n+                    {\n+                        Player* player = itr->GetSource();\n+                        if (!player || player == master || player->IsBeingTeleported() ||\n+                            me->GetMap() != player->FindMap())\n+                            continue;\n+\n+                        if (IsMeleeClass(player->GetClass()) && player->GetVictim() && GetHealthPCT(player) > 60 &&\n+                            me->GetDistance(player) < 30 && player->getAttackers().empty() && !CCed(player, true) &&\n+                            !player->GetAuraEffect(SPELL_AURA_MOD_DAMAGE_PERCENT_DONE, SPELLFAMILY_DEATHKNIGHT, 0x20000000, 0x0, 0x0))\n+                        {\n+                            target = player;\n+                            break;\n+                        }\n+\n+                        if (!player->HaveBot())\n+                            continue;\n+\n+                        for (auto const& [_, bot] : *player->GetBotMgr()->GetBotMap())\n+                        {\n+                            if (IsMeleeClass(bot->GetBotClass()) && bot->GetVictim() &&\n+                                bot->GetBotAI()->HasRole(BOT_ROLE_DPS) && !bot->GetBotAI()->HasRole(BOT_ROLE_RANGED) &&\n+                                GetHealthPCT(bot) > 60 && me->GetDistance(bot) < 30 && !CCed(bot, true) &&\n+                                !bot->GetAuraEffect(SPELL_AURA_MOD_DAMAGE_PERCENT_DONE, SPELLFAMILY_DEATHKNIGHT, 0x20000000, 0x0, 0x0))\n+                            {\n+                                target = bot;\n+                                break;\n+                            }\n+                        }\n+\n+                        if (target)\n+                            break;\n+                    }\n+                }\n+            }\n+\n+            if (!target && me->GetVictim() && HasRole(BOT_ROLE_DPS) && !HasRole(BOT_ROLE_RANGED) &&\n+                GetHealthPCT(me) > 60 && me->getAttackers().empty() && !CCed(me, true) &&\n+                !me->GetAuraEffect(SPELL_AURA_MOD_DAMAGE_PERCENT_DONE, SPELLFAMILY_DEATHKNIGHT, 0x20000000, 0x0, 0x0))\n+                target = me;\n+\n+            if (target && doCast(target, GetSpell(HYSTERIA_1)))\n+            {\n+                if (target->IsPlayer())\n+                    ReportSpellCast(HYSTERIA_1, LocalizedNpcText(target->ToPlayer(), BOT_TEXT__ON_YOU), target->ToPlayer());\n+                //if (target != master)\n+                //{\n+                //    std::string hystmsg = \"Hysteria on \" + (target == me ? \"myself\" : target->GetName()) + \"!\";\n+                //    BotWhisper(hystmsg.c_str());\n+                //}\n+\n+                return;\n+            }\n+\n+            SetSpellCooldown(HYSTERIA_1, 1000); //fail\n+        }\n+\n+        void CheckAntiMagic(uint32 diff)\n+        {\n+            if (!me->GetVictim() || !me->GetVictim()->HasUnitState(UNIT_STATE_CASTING) || Rand() > 40)\n+                return;\n+\n+            Spell const* spell = me->GetVictim()->GetCurrentSpell(CURRENT_GENERIC_SPELL);\n+            if (!spell || spell->GetTimer() >= 1000 || !spell->GetSpellInfo()->HasEffect(SPELL_EFFECT_SCHOOL_DAMAGE))\n+                return;\n+\n+            Unit const* u = spell->m_targets.GetUnitTarget();\n+            if (!u || (IAmFree() ? (u != me) : !(master->GetGroup() && master->GetGroup()->IsMember(spell->m_targets.GetObjectTargetGUID()))))\n+                return;\n+\n+            if (u == me && IsSpellReady(ANTI_MAGIC_SHELL_1, diff, false) && runicpower >= rcost(ANTI_MAGIC_SHELL_1))\n+            {\n+                if (doCast(me, GetSpell(ANTI_MAGIC_SHELL_1)))\n+                {\n+                    getpower();\n+                    return;\n+                }\n+            }\n+\n+            if (Rand() > 20)\n+                return;\n+\n+            u = ObjectAccessor::GetUnit(*me, spell->m_targets.GetObjectTargetGUID());\n+            if (u && !u->isMoving() && me->GetDistance(u) < 4 && IsSpellReady(ANTI_MAGIC_ZONE_1, diff, false) &&\n+                HaveRunes(ANTI_MAGIC_ZONE_1) &&\n+                !u->GetAuraEffect(SPELL_AURA_SCHOOL_ABSORB, SPELLFAMILY_DEATHKNIGHT, 0x20000, 0x0, 0x0))\n+            {\n+                if (doCast(me, GetSpell(ANTI_MAGIC_ZONE_1)))\n+                    return;\n+            }\n+        }\n+\n+        void CheckPresence(uint32 diff)\n+        {\n+            if (presencetimer > diff || IAmFree() || IsCasting() || Rand() > 30)\n+                return;\n+\n+            uint8 newpresence = IsTank() ? DEATH_KNIGHT_FROST_PRESENCE : GetSpec() == BOT_SPEC_DK_UNHOLY ? DEATH_KNIGHT_UNHOLY_PRESENCE : DEATH_KNIGHT_BLOOD_PRESENCE;\n+            if (_presence == newpresence)\n+            {\n+                presencetimer = 5000;\n+                return;\n+            }\n+\n+            if (newpresence == DEATH_KNIGHT_FROST_PRESENCE && HaveRunes(FROST_PRESENCE_1))\n+            {\n+                if (doCast(me, FROST_PRESENCE_1))\n+                    return;\n+            }\n+            else if (newpresence == DEATH_KNIGHT_BLOOD_PRESENCE && HaveRunes(BLOOD_PRESENCE_1))\n+            {\n+                if (doCast(me, BLOOD_PRESENCE_1))\n+                    return;\n+            }\n+            else if (newpresence == DEATH_KNIGHT_UNHOLY_PRESENCE && HaveRunes(UNHOLY_PRESENCE_1))\n+            {\n+                if (doCast(me, UNHOLY_PRESENCE_1))\n+                    return;\n+            }\n+\n+            presencetimer = 1000; //fail\n+        }\n+\n+        void BreakCC(uint32 diff) override\n+        {\n+            if (IsSpellReady(LICHBORNE_1, diff, false) && Rand() < 45 &&\n+                me->HasAuraWithMechanic((1u<<MECHANIC_CHARM)|(1u<<MECHANIC_FEAR)|(1u<<MECHANIC_SLEEP)))\n+            {\n+                if (doCast(me, GetSpell(LICHBORNE_1)))\n+                    return;\n+            }\n+\n+            bot_ai::BreakCC(diff);\n+        }\n+\n+        void Counter(uint32 diff)\n+        {\n+            if (Rand() > 35)\n+                return;\n+\n+            if (IsSpellReady(STRANGULATE_1, diff) && me->IsInCombat() && HaveRunes(STRANGULATE_1))\n+            {\n+                Unit* u = FindCastingTarget(CalcSpellMaxRange(STRANGULATE_1), 0, STRANGULATE_1);\n+                if (u && doCast(u, GetSpell(STRANGULATE_1)))\n+                    return;\n+            }\n+\n+            Unit* target = me->GetVictim();\n+            if (IsSpellReady(MIND_FREEZE_1, diff, false) && target && me->GetDistance(target) < 5 &&\n+                runicpower >= rcost(MIND_FREEZE_1) && target->IsNonMeleeSpellCast(false,false,true))\n+            {\n+                if (doCast(me->GetVictim(), GetSpell(MIND_FREEZE_1)))\n+                    getpower();\n+            }\n+        }\n+\n+        void UpdateAI(uint32 diff) override\n+        {\n+            if (me->IsAlive())\n+            {\n+                if (runicpowertimer <= diff)\n+                {\n+                    if (!me->IsInCombat())\n+                    {\n+                        if (me->GetPower(POWER_RUNIC_POWER) > uint32(30.f * runicpowerLossMult))\n+                            me->SetPower(POWER_RUNIC_POWER, me->GetPower(POWER_RUNIC_POWER) - uint32(30.f * runicpowerLossMult)); //-3 runic power every 2 sec\n+                        else if (me->GetPower(POWER_RUNIC_POWER) > 0)\n+                            me->SetPower(POWER_RUNIC_POWER, 0);\n+                    }\n+                    runicpowertimer = 2000;\n+                }\n+                if (runicpowertimer2 <= diff)\n+                {\n+                    if (me->IsInCombat())\n+                    {\n+                        if (me->GetPower(POWER_RUNIC_POWER) < me->GetMaxPower(POWER_RUNIC_POWER))\n+                            me->SetPower(POWER_RUNIC_POWER, me->GetPower(POWER_RUNIC_POWER) + int32(20.f * runicpowerIncomeMult)); //+2 runic power every 5 sec\n+                        else if (me->GetPower(POWER_RUNIC_POWER) < me->GetMaxPower(POWER_RUNIC_POWER))\n+                            me->SetPower(POWER_RUNIC_POWER, me->GetMaxPower(POWER_RUNIC_POWER));\n+                    }\n+                    runicpowertimer2 = 5000;\n+                }\n+                getpower();\n+            }\n+\n+            if (!GlobalUpdate(diff))\n+                return;\n+\n+            DoVehicleActions(diff);\n+            if (!CanBotAttackOnVehicle())\n+                return;\n+\n+            //pet is killed or unreachable\n+            if (GC_Timer <= diff && petSummonTimer <= diff && !me->IsInCombat() && !me->IsMounted() && !me->GetVictim() && !IsCasting() && Rand() < 25 &&\n+                (!botPet || me->GetDistance2d(botPet) > World::GetMaxVisibleDistanceOnContinents()))\n+                SummonBotPet();\n+\n+            if (IsPotionReady())\n+            {\n+                if (GetHealthPCT(me) < 40)\n+                    DrinkPotion(false);\n+            }\n+\n+            CheckRacials(diff);\n+            CheckPresence(diff);\n+\n+            if (!me->IsInCombat())\n+                DoNonCombatActions(diff);\n+\n+            if (IsCasting())\n+                return;\n+\n+            Counter(diff);\n+\n+            //HORN OF WINTER\n+            if (IsSpellReady(HORN_OF_WINTER_1, diff) && !IAmFree() && Rand() < 25 &&\n+                ((me->IsInCombat() && runicpower <= 900) ||\n+                !me->GetAuraEffect(SPELL_AURA_MOD_STAT, SPELLFAMILY_DEATHKNIGHT, 0x0, 0x40000000, 0x0)))\n+            {\n+                if (doCast(me, GetSpell(HORN_OF_WINTER_1)))\n+                    return;\n+            }\n+            //BONE SHIELD\n+            if (IsSpellReady(BONE_SHIELD_1, diff) && HaveRunes(BONE_SHIELD_1) && Rand() < 25 + 65 * IsTank())\n+            {\n+                Aura* bone = me->GetAura(GetSpell(BONE_SHIELD_1));\n+                if (!bone || bone->GetCharges() < 2 || bone->GetDuration() < 10000)\n+                {\n+                    if (doCast(me, GetSpell(BONE_SHIELD_1)))\n+                        return;\n+                }\n+            }\n+\n+            CheckHysteria(diff);\n+            CheckAntiMagic(diff);\n+\n+            if (ProcessImmediateNonAttackTarget())\n+                return;\n+\n+            if (!CheckAttackTarget())\n+                return;\n+\n+            CheckUsableItems(diff);\n+\n+            DoNormalAttack(diff);\n+        }\n+\n+        void DoNormalAttack(uint32 diff)\n+        {\n+            Unit* mytar = opponent ? opponent : disttarget ? disttarget : nullptr;\n+            if (!mytar)\n+                return;\n+\n+            StartAttack(mytar, IsMelee());\n+\n+            CheckAttackState();\n+            if (!me->IsAlive() || !mytar->IsAlive())\n+                return;\n+\n+            //BLOOD TAP\n+            if (IsSpellReady(BLOOD_TAP_1, diff, false) && Rand() < 65)\n+            {\n+                if (doCast(me, GetSpell(BLOOD_TAP_1)))\n+                    getpower();\n+            }\n+\n+            //ICEBOUND FORTITUDE\n+            if (IsSpellReady(ICEBOUND_FORTITUDE_1, diff, false) && Rand() < 50 && runicpower >= rcost(ICEBOUND_FORTITUDE_1) &&\n+                GetHealthPCT(me) < std::min<uint32>(60, 35 + uint8(me->getAttackers().size()) * 5) + 20 * IsTank())\n+            {\n+                if (doCast(me, GetSpell(ICEBOUND_FORTITUDE_1)))\n+                {\n+                    if (!IAmFree())\n+                        ReportSpellCast(ICEBOUND_FORTITUDE_1, LocalizedNpcText(master, BOT_TEXT__USED), master);\n+\n+                    getpower();\n+                }\n+            }\n+\n+            //SELFHEAL\n+            //VAMPIRIC BLOOD\n+            if (IsSpellReady(VAMPIRIC_BLOOD_1, diff, false) && GetHealthPCT(me) < 50 && (IsTank() || Rand() < 75))\n+            {\n+                if (HaveRunes(VAMPIRIC_BLOOD_1) || (IsSpellReady(EMPOWER_RUNE_WEAPON_1, diff, false) && doCast(me, GetSpell(EMPOWER_RUNE_WEAPON_1))))\n+                {\n+                    if (doCast(me, GetSpell(VAMPIRIC_BLOOD_1)))\n+                    {\n+                        if (!IAmFree())\n+                            ReportSpellCast(VAMPIRIC_BLOOD_1, LocalizedNpcText(master, BOT_TEXT__USED), master);\n+\n+                        return;\n+                    }\n+                }\n+            }\n+            //RUNE TAP\n+            if (IsSpellReady(RUNE_TAP_1, diff, false) && GetHealthPCT(me) < 65 && Rand() < 50 && HaveRunes(RUNE_TAP_1))\n+            {\n+                if (doCast(me, GetSpell(RUNE_TAP_1)))\n+                    return;\n+            }\n+            //LICHBORNE + DEATH COIL\n+            if ((me->GetCreatureType() == CREATURE_TYPE_UNDEAD || IsSpellReady(LICHBORNE_1, diff, false)) &&\n+                (IAmFree() || IsTank() || master->GetBotMgr()->GetNpcBotsCountByRole(BOT_ROLE_HEAL) == 0) &&\n+                IsSpellReady(DEATH_COIL_1, diff) && Rand() < 45 && GetHealthPCT(me) < 80 && runicpower >= rcost(DEATH_COIL_1))\n+            {\n+                if (me->GetCreatureType() == CREATURE_TYPE_UNDEAD || doCast(me, GetSpell(LICHBORNE_1)))\n+                {\n+                    if (doCast(me, GetSpell(DEATH_COIL_1)))\n+                        return;\n+                }\n+            }\n+            //END SELFHEAL\n+\n+            //EMPOWER RUNE WEAPON\n+            if (IsSpellReady(EMPOWER_RUNE_WEAPON_1, diff, false) && Rand() < 50 &&\n+                GetCooledRunesCount() >= 5 && GetTotalRunesCooldown() >= (RUNE_BASE_COOLDOWN * 5) / 2)\n+            {\n+                if (doCast(me, GetSpell(EMPOWER_RUNE_WEAPON_1)))\n+                {\n+                    //BotWhisper(\"ERW used!\");\n+                }\n+            }\n+\n+            float dist = me->GetDistance(mytar);\n+            Unit const* u = mytar->GetVictim();\n+\n+            //MARK OF BLOOD\n+            if (IsSpellReady(MARK_OF_BLOOD_1, diff) && u && Rand() < 55 && dist < 30 && HaveRunes(MARK_OF_BLOOD_1) &&\n+                IsInBotParty(u) && GetHealthPCT(u) < 75 && u->GetDistance(mytar) < 10 &&\n+                mytar->GetHealth() > me->GetMaxHealth() / 4 * (1 + mytar->getAttackers().size()) &&\n+                (u == me || IsTank(u) || u->IsPlayer()) &&\n+                !mytar->GetDummyAuraEffect(SPELLFAMILY_DEATHKNIGHT, 2285, 0))\n+            {\n+                if (doCast(mytar, GetSpell(MARK_OF_BLOOD_1)))\n+                    return;\n+            }\n+\n+            //NON-DISEASE SECTION\n+\n+            //PLACEHOLDER: ARMY OF THE DEAD\n+\n+            //RANGED SECTION\n+\n+            //DARK COMMAND\n+            if (IsSpellReady(DARK_COMMAND_1, diff, false) && u && u != me && dist < 30 &&\n+                mytar->IsCreature() && !mytar->IsControlledByPlayer() && Rand() < 50 &&\n+                !CCed(mytar) && !mytar->HasAuraType(SPELL_AURA_MOD_TAUNT) &&\n+                (!IsTank(u) || (IsTank() && GetHealthPCT(me) > 67 &&\n+                (GetHealthPCT(u) < 30 || (IsOffTank() && !IsOffTank(u) && IsPointedOffTankingTarget(mytar)) ||\n+                (!IsOffTank() && IsOffTank(u) && IsPointedTankingTarget(mytar))))) &&\n+                ((!IsTankingClass(u->GetClass()) && GetHealthPCT(u) < 80) || IsTank()) &&\n+                IsInBotParty(u))\n+            {\n+                if (doCast(mytar, GetSpell(DARK_COMMAND_1)))\n+                    return;\n+            }\n+            //DARK COMMAND 2 (distant)\n+            if (IsSpellReady(DARK_COMMAND_1, diff, false) && !IAmFree() && u == me && Rand() < 30 && IsTank() &&\n+                (IsOffTank() || master->GetBotMgr()->GetNpcBotsCountByRole(BOT_ROLE_TANK_OFF) == 0) &&\n+                !(me->GetLevel() >= 40 && mytar->IsCreature() &&\n+                (mytar->ToCreature()->IsDungeonBoss() || mytar->ToCreature()->isWorldBoss())))\n+            {\n+                if (Unit* tUnit = FindDistantTauntTarget())\n+                {\n+                    if (doCast(tUnit, GetSpell(DARK_COMMAND_1)))\n+                        return;\n+                }\n+            }\n+\n+            ////DEATH GRIP - DISABLED\n+            //if (DEATH_GRIP && DeathGrip_cd <= diff && dist < 30 &&\n+            //    (tank == me && mytar->GetVictim() != me) ||\n+            //    (mytar->GetVictim() == me && mytar->ToPlayer() && mytar->IsNonMeleeSpellCast(false)) &&\n+            //    Rand() < 75)\n+            //{\n+            //    if (doCast(mytar, DEATH_GRIP))\n+            //    {\n+            //        DeathGrip_cd = 25000;\n+            //        return;\n+            //    }\n+\n+            //    DeathGrip_cd = 1000; //fail\n+            //}\n+\n+            //UNBREAKABLE ARMOR\n+            if (IsSpellReady(UNBREAKABLE_ARMOR_1, diff, false) && dist < 10 && HaveRunes(UNBREAKABLE_ARMOR_1) &&\n+                (IsTank() || !me->getAttackers().empty() || mytar->GetMaxHealth() > me->GetMaxHealth() || Rand() < 35))\n+            {\n+                if (doCast(me, GetSpell(UNBREAKABLE_ARMOR_1)))\n+                {}\n+            }\n+\n+            if (!HasRole(BOT_ROLE_DPS))\n+                return;\n+\n+            //CHAINS OF ICE\n+            if (IsSpellReady(CHAINS_OF_ICE_1, diff) && Rand() < 65 && dist < CalcSpellMaxRange(CHAINS_OF_ICE_1) && mytar->isMoving() &&\n+                !(mytar->IsCreature() && (mytar->ToCreature()->HasMechanicTemplateImmunity(1u<<(MECHANIC_SNARE-1)))) &&\n+                HaveRunes(CHAINS_OF_ICE_1) && !CCed(mytar, true) && (!u || (!IsTank(u) && IsInBotParty(u))) &&\n+                !mytar->HasAuraWithMechanic(1u<<MECHANIC_SNARE))\n+            {\n+                if (doCast(mytar, GetSpell(CHAINS_OF_ICE_1)))\n+                    return;\n+            }\n+\n+            //HUNGERING COLD\n+            if (IsSpellReady(HUNGERING_COLD_1, diff) && Rand() < 30 && runicpower >= rcost(HUNGERING_COLD_1))\n+            {\n+                std::list<Unit*> targets;\n+                GetNearbyTargetsList(targets, 9.f, 0);\n+                if (targets.size() >= 3)\n+                {\n+                    if (doCast(me, GetSpell(HUNGERING_COLD_1)))\n+                        return;\n+                }\n+            }\n+\n+            //Diseases in general\n+            bool noDiseases = mytar->IsCreature() && (mytar->ToCreature()->HasMechanicTemplateImmunity(1u<<(MECHANIC_INFECTED-1)));\n+            AuraEffect const* blop = noDiseases ? nullptr : mytar->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DEATHKNIGHT, 0x0, 0x2000000, 0x0, me->GetGUID());\n+            AuraEffect const* frof = noDiseases ? nullptr : mytar->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DEATHKNIGHT, 0x0, 0x4000000, 0x0, me->GetGUID());\n+            AuraEffect const* ebop = (noDiseases || GetSpec() != BOT_SPEC_DK_UNHOLY) ? nullptr : mytar->GetAuraEffect(SPELL_AURA_LINKED, SPELLFAMILY_DEATHKNIGHT, 0x0, 0x800, 0x0, me->GetGUID());\n+\n+            auto [can_do_nature, can_do_frost, can_do_shadow, can_do_physical] = CanAffectVictimBools(mytar, SPELL_SCHOOL_NATURE, SPELL_SCHOOL_FROST, SPELL_SCHOOL_SHADOW, SPELL_SCHOOL_NORMAL);\n+\n+            //DISEASE SECTION\n+\n+            //PESTILENCE\n+            if (IsSpellReady(PESTILENCE_1, diff) && can_do_shadow && blop && frof && dist < 5 && HaveRunes(PESTILENCE_1))\n+            {\n+                if (blop->GetBase()->GetDuration() < 5000 || frof->GetBase()->GetDuration() < 5000)\n+                {\n+                    if (doCast(mytar, GetSpell(PESTILENCE_1)))\n+                        return;\n+                }\n+\n+                if (Rand() < 35 + 65 * me->GetMap()->IsDungeon())\n+                {\n+                    std::list<Unit*> targets;\n+                    GetNearbyTargetsList(targets, 13.f, 0, mytar);\n+                    uint8 count = 0;\n+                    for (Unit const* u : targets)\n+                    {\n+                        //check existing blop and frof\n+                        if (!u->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DEATHKNIGHT, 0x0, 0x2000000, 0x0, me->GetGUID()) ||\n+                            !u->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DEATHKNIGHT, 0x0, 0x4000000, 0x0, me->GetGUID()))\n+                            if (++count > 1)\n+                                break;\n+                    }\n+                    if (count > 1 && doCast(mytar, GetSpell(PESTILENCE_1)))\n+                        return;\n+                }\n+            }\n+            //ICY TOUCH\n+            if (IsSpellReady(ICY_TOUCH_1, diff) && can_do_frost && !noDiseases && (!frof || frof->GetBase()->GetMaxDuration() < 3000) &&\n+                dist < CalcSpellMaxRange(ICY_TOUCH_1) && HaveRunes(ICY_TOUCH_1))\n+            {\n+                if (doCast(mytar, GetSpell(ICY_TOUCH_1)))\n+                    return;\n+            }\n+            //HOWLING BLAST\n+            if (IsSpellReady(HOWLING_BLAST_1, diff) && can_do_frost && (rimeProcTimer > diff || Rand() < 70) &&\n+                (!u || mytar->IsControlledByPlayer() || rimeProcTimer > diff ||\n+                (u && u != me && IsTank(u) && u->getAttackers().size() > 2)) &&\n+                dist < CalcSpellMaxRange(HOWLING_BLAST_1) && HaveRunes(HOWLING_BLAST_1))\n+            {\n+                if (u && u->getAttackers().size() > 4 &&\n+                    IsSpellReady(DEATHCHILL_1, diff, false) && doCast(me, GetSpell(DEATHCHILL_1)))\n+                {/* BotWhisper(\"Deathchill used!\"); */}\n+                if (doCast(mytar, GetSpell(HOWLING_BLAST_1)))\n+                    return;\n+            }\n+\n+            //END DISEASE SECTION\n+\n+            //COMBAT SUMMONS SECTION\n+\n+            //SUMMON GARGOYLE\n+            if (IsSpellReady(SUMMON_GARGOYLE_1, diff) && can_do_nature && Rand() < 60 && dist < 30 &&\n+                (IAmFree() || mytar->GetHealth() > me->GetMaxHealth() / 4) && runicpower >= rcost(SUMMON_GARGOYLE_1))\n+            {\n+                if (doCast(mytar, GetSpell(SUMMON_GARGOYLE_1)))\n+                    return;\n+            }\n+            //DANCING RUNE WEAPON\n+            if (IsSpellReady(DANCING_RUNE_DEAPON_1, diff) && can_do_physical && (noDiseases || (blop && frof)) && Rand() < 60 && dist < 15 &&\n+                (IAmFree() || mytar->GetHealth() > me->GetHealth() / 4) && runicpower >= rcost(DANCING_RUNE_DEAPON_1))\n+            {\n+                if (doCast(mytar, GetSpell(DANCING_RUNE_DEAPON_1)))\n+                    return;\n+            }\n+\n+            //MELEE SECTION\n+\n+            //FROST STRIKE\n+            if (IsSpellReady(FROST_STRIKE_1, diff) && can_do_frost && Rand() < 90 && dist < 5 &&\n+                runicpower >= rcost(FROST_STRIKE_1) &&\n+                (runicpower >= 1000 || !GetSpell(OBLITERATE_1) || !HaveRunes(OBLITERATE_1)))\n+            {\n+                if (doCast(mytar, GetSpell(FROST_STRIKE_1)))\n+                    return;\n+            }\n+            //BLOOD BOIL\n+            if (IsSpellReady(BLOOD_BOIL_1, diff) && can_do_shadow && IsTank() && Rand() < 25 && HaveRunes(BLOOD_BOIL_1))\n+            {\n+                std::list<Unit*> targets;\n+                GetNearbyTargetsList(targets, 9.f, 1);\n+                if (targets.size() >= 4)\n+                    if (doCast(me, GetSpell(BLOOD_BOIL_1)))\n+                        return;\n+            }\n+            //DEATH AND DECAY\n+            if (IsSpellReady(DEATH_AND_DECAY_1, diff) && can_do_shadow && Rand() < (10 + 30 * IsTank()) && dist < 8 &&\n+                HaveRunes(DEATH_AND_DECAY_1))\n+            {\n+                if (Unit* target = FindAOETarget(10))\n+                {\n+                    if (doCast(target, GetSpell(DEATH_AND_DECAY_1)))\n+                        return;\n+                }\n+            }\n+            //DEATH COIL\n+            if (IsSpellReady(DEATH_COIL_1, diff) && can_do_shadow && Rand() < 50 && (dist > 6 || !GetSpell(FROST_STRIKE_1)) &&\n+                (dist < (IAmFree() ? 30 : 15)) && runicpower > 2 * rcost(DEATH_COIL_1))\n+            {\n+                if (doCast(mytar, GetSpell(DEATH_COIL_1)))\n+                    return;\n+            }\n+\n+            MoveBehind(mytar);\n+\n+            if (!can_do_physical || dist > 5)\n+                return;\n+\n+            //PLAGUE STRIKE\n+            if (IsSpellReady(PLAGUE_STRIKE_1, diff) && !noDiseases && (!blop || blop->GetBase()->GetDuration() < 3000) &&\n+                HaveRunes(PLAGUE_STRIKE_1))\n+            {\n+                if (doCast(mytar, GetSpell(PLAGUE_STRIKE_1)))\n+                    return;\n+            }\n+\n+            //DISEASE SECTION\n+\n+            //DEATH STRIKE\n+            if (IsSpellReady(DEATH_STRIKE_1, diff) && blop && frof && Rand() < 60 &&\n+                GetHealthPCT(me) < (80 - (10*(blop != nullptr) + 10*(frof != nullptr))) &&\n+                (!me->GetMap()->IsDungeon() || mytar->IsControlledByPlayer()) && HaveRunes(DEATH_STRIKE_1))\n+            {\n+                if (doCast(mytar, GetSpell(DEATH_STRIKE_1)))\n+                    return;\n+            }\n+            //OBLITERATE\n+            if (IsSpellReady(OBLITERATE_1, diff) && GetSpec() == BOT_SPEC_DK_FROST && blop && frof && HaveRunes(OBLITERATE_1))\n+            {\n+                //DEATHCHILL\n+                if (IsSpellReady(DEATHCHILL_1, diff, false) && doCast(me, GetSpell(DEATHCHILL_1)))\n+                {/* BotWhisper(\"Deathchill used!\"); */}\n+                if (doCast(mytar, GetSpell(OBLITERATE_1)))\n+                    return;\n+            }\n+            //HEART STRIKE - splash\n+            if (IsSpellReady(HEART_STRIKE_1, diff) && (noDiseases || (blop && frof)) && (IsTank() || Rand() < 40) &&\n+                HaveRunes(HEART_STRIKE_1) && FindSplashTarget())\n+            {\n+                if (doCast(mytar, GetSpell(HEART_STRIKE_1)))\n+                    return;\n+            }\n+            //SCOURGE STRIKE unused\n+            if (IsSpellReady(SCOURGE_STRIKE_1, diff) && blop && frof && ebop && HaveRunes(SCOURGE_STRIKE_1))\n+            {\n+                if (doCast(mytar, GetSpell(SCOURGE_STRIKE_1)))\n+                    return;\n+            }\n+            //BLOOD STRIKE\n+            if (IsSpellReady(BLOOD_STRIKE_1, diff) && (noDiseases || (blop && frof)) && HaveRunes(BLOOD_STRIKE_1))\n+            {\n+                if (doCast(mytar, GetSpell(BLOOD_STRIKE_1)))\n+                    return;\n+            }\n+\n+            //END DISEASE SECTION\n+\n+            //RUNE STRIKE tank\n+            if (IsSpellReady(RUNE_STRIKE_1, diff, false) && (IsTank() || runicpower >= 800) &&\n+                me->HasAuraState(AURA_STATE_DEFENSE) && !me->GetCurrentSpell(CURRENT_MELEE_SPELL) &&\n+                runicpower >= rcost(RUNE_STRIKE_1))\n+            {\n+                if (doCast(mytar, GetSpell(RUNE_STRIKE_1)))\n+                    return;\n+            }\n+        }\n+\n+        void ApplyClassDamageMultiplierMelee(uint32& /*damage*/, CalcDamageInfo& damageinfo) const override\n+        {\n+            uint8 lvl = me->GetLevel();\n+            float fdamage = float(damageinfo.damages[0].damage);\n+            float pctbonus = 0.0f;\n+\n+            //Blood Gorged part 1 (white attacks): 10% bonus damage for all attacks\n+            if ((GetSpec() == BOT_SPEC_DK_BLOOD) && lvl >= 64 && me->HasAuraState(AURA_STATE_HEALTH_ABOVE_75_PERCENT))\n+                pctbonus += 0.1f;\n+\n+            damageinfo.damages[0].damage = uint32(fdamage * (1.0f + pctbonus));\n+        }\n+\n+        void ApplyClassSpellCritMultiplierAll(Unit const* /*victim*/, float& crit_chance, SpellInfo const* spellInfo, SpellSchoolMask /*schoolMask*/, WeaponAttackType /*attackType*/) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+\n+            //Increased Plague Strike Crit (id 60130): 10% additional critical chance for Plague Strike\n+            if (baseId == PLAGUE_STRIKE_1)\n+                crit_chance += 10.f;\n+            //Scourge / Oblit Crit Up (60134): 5% additional critical chance for Scourge Strike and Obliterate\n+            if (lvl >= 80 && (baseId == SCOURGE_STRIKE_1 || baseId == OBLITERATE_1))\n+                crit_chance += 5.f;\n+\n+            //Killing Machine\n+            if (AuraEffect const* mach = me->GetAuraEffect(KILLING_MACHINE_BUFF, 0))\n+                if (mach->IsAffectedOnSpell(spellInfo))\n+                    crit_chance += 100.f;\n+            //Deathchill\n+            if (AuraEffect const* chil = me->GetAuraEffect(DEATHCHILL_1, 0))\n+                if (chil->IsAffectedOnSpell(spellInfo))\n+                    crit_chance += 100.f;\n+\n+            //Subversion: 9% additional critical chance for Blood Strike, Scourge Strike, Heart Strike and Obliterate\n+            if (baseId == BLOOD_STRIKE_1 || baseId == HEART_STRIKE_1 || baseId == SCOURGE_STRIKE_1 || baseId == OBLITERATE_1)\n+                crit_chance += 9.f;\n+            //Vicious Strikes (part 1): 6% additional critical chance for Plague Strike and Scourge Strike\n+            if (baseId == PLAGUE_STRIKE_1 || baseId == SCOURGE_STRIKE_1)\n+                crit_chance += 6.f;\n+            //Rime (part 1): 15% additional critical chance for Icy Touch and Obliterate\n+            if ((GetSpec() == BOT_SPEC_DK_FROST) && lvl >= 60 && (baseId == ICY_TOUCH_1 || baseId == OBLITERATE_1))\n+                crit_chance += 15.f;\n+            //Improved Death Strike (part 2): 6% additional critical chance for Death Strike\n+            if ((GetSpec() == BOT_SPEC_DK_BLOOD) && lvl >= 62 && baseId == DEATH_STRIKE_1)\n+                crit_chance += 6.f;\n+\n+            //Glyph of Rune Strike: 10% additional critical chance for Rune Strike\n+            if (baseId == RUNE_STRIKE_1)\n+                crit_chance += 10.f;\n+\n+            //Item - Death Knight T8 Melee 2P Bonus: 8% additional critical chance for Death Coil and Frost Strike\n+            if (lvl >= 80 &&\n+                (baseId == DEATH_COIL_1 || baseId == DEATH_COIL_DAMAGE ||\n+                baseId == DEATH_COIL_HEAL || baseId == FROST_STRIKE_1))\n+                crit_chance += 8.f;\n+        }\n+\n+        void ApplyClassDamageMultiplierMeleeSpell(int32& damage, SpellNonMeleeDamage& damageinfo, SpellInfo const* spellInfo, WeaponAttackType /*attackType*/, bool iscrit) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+            float fdamage = float(damage);\n+\n+            //apply bonus damage mods\n+            float pctbonus = 0.0f;\n+            if (iscrit)\n+            {\n+                //!!!Melee spell damage is not yet critical, all reduced by half\n+\n+                //Might of Mograine: 45% crit damage bonus for Blood Boil, Blood Strike, Death Strike and Heart Strike\n+                if ((GetSpec() == BOT_SPEC_DK_BLOOD) && lvl >= 63 &&\n+                    (baseId == BLOOD_BOIL_1 || baseId == BLOOD_STRIKE_1 || baseId == DEATH_STRIKE_1 || baseId == HEART_STRIKE_1))\n+                    pctbonus += 0.45f / 2.f;\n+                //Guile of Gorefiend (part 1 melee): 45% crit damage bonus for Blood Strike, Frost Strike, Howling Blast and Obliterate\n+                if ((GetSpec() == BOT_SPEC_DK_FROST) && lvl >= 63 &&\n+                    (baseId == BLOOD_STRIKE_1 || baseId == FROST_STRIKE_1 ||\n+                    baseId == HOWLING_BLAST_1 || baseId == OBLITERATE_1))\n+                    pctbonus += 0.45f / 2.f;\n+                //Vicious Strikes (part 2): 30% crit damage bonus for Plague Strike and Scourge Strike\n+                if (baseId == PLAGUE_STRIKE_1 || baseId == SCOURGE_STRIKE_1)\n+                    pctbonus += 0.3f / 2.f;\n+            }\n+\n+            //Increased Blood Strike Damage (52394): 90 bonus damage for Blood Strike and Heart Strike\n+            if (lvl >= 70 && (baseId == BLOOD_STRIKE_1 || baseId == HEART_STRIKE_1))\n+                fdamage += 90.f;\n+            //Copy of Increased Blood Strike Damage (60825): 90 bonus damage for Blood Strike and Heart Strike\n+            if (lvl >= 80 && (baseId == BLOOD_STRIKE_1 || baseId == HEART_STRIKE_1))\n+                fdamage += 90.f;\n+            //Increased Scourge Strike Damage (54809): 91 bonus damage for Scourge Strike\n+            if (lvl >= 80 && baseId == SCOURGE_STRIKE_1)\n+                fdamage += 91.f;\n+\n+            //Outbreak: 30% bonus damage for Plague Strike and 20% for Scourge Strike\n+            if (lvl >= 57)\n+            {\n+                if (baseId == PLAGUE_STRIKE_1)\n+                    pctbonus += 0.3f;\n+                else if (baseId == SCOURGE_STRIKE_1)\n+                    pctbonus += 0.2f;\n+            }\n+            //Bloody Strikes: 15% bonus damage for Blood Strike, 45% for Heart Strike and 30% for Blood Boil\n+            if ((GetSpec() == BOT_SPEC_DK_BLOOD) && lvl >= 59)\n+            {\n+                if (baseId == BLOOD_STRIKE_1)\n+                    pctbonus += 0.15f;\n+                else if (baseId == HEART_STRIKE_1)\n+                    pctbonus += 0.45f;\n+                else if (baseId == BLOOD_BOIL_1)\n+                    pctbonus += 0.3f;\n+            }\n+            //Merciless Combat (melee): 12% bonus damage for Icy Touch, Howling Blast, Obliterate and Frost Strike on targets with less than 35% hp\n+            if ((GetSpec() == BOT_SPEC_DK_FROST) && lvl >= 60 &&\n+                (baseId == ICY_TOUCH_1 || baseId == HOWLING_BLAST_1 || baseId == OBLITERATE_1 || baseId == FROST_STRIKE_1) &&\n+                damageinfo.target->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT))\n+                pctbonus += 0.12f;\n+            //Improved Death Strike (part 1): 30% bonus damage for Death Strike\n+            if ((GetSpec() == BOT_SPEC_DK_BLOOD) && lvl >= 62 && baseId == DEATH_STRIKE_1)\n+                pctbonus += 0.3f;\n+            //Blood of the North (part 1): 10% bonus damage for Blood Strike and Frost Strike\n+            if ((GetSpec() == BOT_SPEC_DK_FROST) && lvl >= 62 && (baseId == BLOOD_STRIKE_1 || baseId == FROST_STRIKE_1))\n+                pctbonus += 0.1f;\n+            //Blood Gorged part 1 (melee): 10% bonus damage for all spells\n+            if ((GetSpec() == BOT_SPEC_DK_BLOOD) && lvl >= 64 && me->HasAuraState(AURA_STATE_HEALTH_ABOVE_75_PERCENT))\n+                pctbonus += 0.1f;\n+            //Tundra Stalker (melee): 15% damage bonus on targets affected with Frost Fever\n+            if ((GetSpec() == BOT_SPEC_DK_FROST) &&\n+                lvl >= 64 && damageinfo.target->GetAuraEffect(SPELL_AURA_MOD_RANGED_HASTE, SPELLFAMILY_DEATHKNIGHT, 0x0, 0x0, 0x2))\n+                pctbonus += 0.15f;\n+            //Rage of Rivendare (melee): 10% damage bonus on targets affected with Blood Plague\n+            if ((GetSpec() == BOT_SPEC_DK_UNHOLY) &&\n+                lvl >= 64 && damageinfo.target->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DEATHKNIGHT, 0x0, 0x2000000, 0x0))\n+                pctbonus += 0.1f;\n+\n+            //Glyph of Blood Strike: 20% bonus damage for Blood Strike on snared targets\n+            if (baseId == BLOOD_STRIKE_1 && damageinfo.target->HasAuraWithMechanic(1u<<MECHANIC_SNARE))\n+                pctbonus += 0.2f;\n+            //Glyph of Death Strike: 1% bonus damage for every runic power point (max 25) for Death Strike\n+            if (baseId == DEATH_STRIKE_1 && runicpower >= 10)\n+            {\n+                //10 to 250 * 0.001 = 10 to 250 / 1000 = 0.01 to 0.25\n+                pctbonus += float(std::min<int32>(runicpower, 250)) * 0.001f;\n+            }\n+            //Glyph of Obliterate: 25% bonus damage for Obliterate\n+            if (baseId == OBLITERATE_1)\n+                pctbonus += 0.25f;\n+            //Glyph of Plague Strike: 20% bonus damage for Plague Strike\n+            if (baseId == PLAGUE_STRIKE_1)\n+                pctbonus += 0.2f;\n+\n+            //Item - Death Knight T8 Tank 2P Bonus\n+            if (lvl >= 80 && baseId == RUNE_STRIKE_1)\n+                pctbonus += 0.1f;\n+            //Item - Death Knight T8 DPS Relic\n+            if (lvl >= 80 && baseId == FROST_STRIKE_1)\n+                fdamage += 380.f;\n+            //Item - Death Knight T9 Tank 2P Bonus\n+            if (lvl >= 80 && (baseId == BLOOD_STRIKE_1 || baseId == HEART_STRIKE_1))\n+                pctbonus += 0.05f;\n+            //Item - Death Knight T10 Melee 2P Bonus part 1\n+            if (lvl >= 80 && baseId == OBLITERATE_1)\n+                pctbonus += 0.1f;\n+            //Item - Death Knight T10 Melee 2P Bonus part 2\n+            if (lvl >= 80 && baseId == HEART_STRIKE_1)\n+                pctbonus += 0.07f;\n+\n+            damage = int32(fdamage * (1.0f + pctbonus));\n+        }\n+\n+        void ApplyClassDamageMultiplierSpell(int32& damage, SpellNonMeleeDamage& damageinfo, SpellInfo const* spellInfo, WeaponAttackType /*attackType*/, bool iscrit) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+            float fdamage = float(damage);\n+\n+            //apply bonus damage mods\n+            float pctbonus = 0.0f;\n+            if (iscrit)\n+            {\n+                //!!!spell damage is not yet critical and will be multiplied by 1.5\n+                //so we should put here bonus damage mult /1.5\n+\n+                //Runic Focus (class passive): 50% crit damage bonus for all spells\n+                pctbonus += 0.5f / 1.5f;\n+\n+                //Guile of Gorefiend (part 1 spell): 45% crit damage bonus for Blood Strike, Frost Strike, Howling Blast and Obliterate\n+                if ((GetSpec() == BOT_SPEC_DK_FROST) && lvl >= 63 &&\n+                    (baseId == BLOOD_STRIKE_1 || baseId == FROST_STRIKE_1 ||\n+                    baseId == HOWLING_BLAST_1 || baseId == OBLITERATE_1))\n+                    pctbonus += 0.45f / 1.5f;\n+            }\n+\n+            //Improved Icy Touch part 1: 15% bonus damage for Icy Touch\n+            if (baseId == ICY_TOUCH_1)\n+                pctbonus += 0.15f;\n+            //Black Ice: 10% bonus damage for Shadow and Frost spells\n+            if (spellInfo->GetSchoolMask() & (SPELL_SCHOOL_MASK_FROST|SPELL_SCHOOL_MASK_SHADOW))\n+                pctbonus += 0.1f;\n+            //Morbidity part 1: 15% damage bonus for Death Coil\n+            if (baseId == DEATH_COIL_1 || baseId == DEATH_COIL_DAMAGE)\n+                pctbonus += 0.15f;\n+            //Glacier Rot: 20% bonus damage for Icy Touch, Howling Blast and Frost Strike on diseased targets\n+            if ((GetSpec() == BOT_SPEC_DK_FROST) &&\n+                lvl >= 59 && (baseId == ICY_TOUCH_1 || baseId == HOWLING_BLAST_1 || baseId == FROST_STRIKE_1) &&\n+                IsDiseased(damageinfo.target))\n+                pctbonus += 0.2f;\n+            //Impurity: 20% bonus (from attack power) damage for all spells\n+            if ((GetSpec() == BOT_SPEC_DK_UNHOLY) && lvl >= 59)\n+                if (SpellBonusEntry const* bonus = sSpellMgr->GetSpellBonusData(spellInfo->Id))\n+                    if (bonus->ap_bonus > 0.f)\n+                        fdamage += bonus->ap_bonus * 0.2f * me->GetTotalAttackPowerValue(BASE_ATTACK);\n+            //Merciless Combat (spell): 12% bonus damage for Icy Touch, Howling Blast, Obliterate and Frost Strike on targets with less than 35% hp\n+            if ((GetSpec() == BOT_SPEC_DK_FROST) && lvl >= 60 &&\n+                (baseId == ICY_TOUCH_1 || baseId == HOWLING_BLAST_1 || baseId == OBLITERATE_1 || baseId == FROST_STRIKE_1) &&\n+                damageinfo.target->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT))\n+                pctbonus += 0.12f;\n+            //Blood Gorged part 1 (spell): 10% bonus damage for all spells\n+            if ((GetSpec() == BOT_SPEC_DK_BLOOD) && lvl >= 64 && me->HasAuraState(AURA_STATE_HEALTH_ABOVE_75_PERCENT))\n+                pctbonus += 0.1f;\n+            //Tundra Stalker (spell): 15% damage bonus on targets affected with Frost Fever\n+            if ((GetSpec() == BOT_SPEC_DK_FROST) &&\n+                lvl >= 64 && damageinfo.target->GetAuraEffect(SPELL_AURA_MOD_RANGED_HASTE, SPELLFAMILY_DEATHKNIGHT, 0x0, 0x0, 0x2))\n+                pctbonus += 0.15f;\n+            //Rage of Rivendare (spell): 10% damage bonus on targets affected with Blood Plague\n+            if ((GetSpec() == BOT_SPEC_DK_UNHOLY) &&\n+                lvl >= 64 && damageinfo.target->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DEATHKNIGHT, 0x0, 0x2000000, 0x0))\n+                pctbonus += 0.1f;\n+\n+            //Glyph of Dark Death part 1: 15% damage bonus for Death Coil\n+            if (baseId == DEATH_COIL_1 || baseId == DEATH_COIL_DAMAGE)\n+                pctbonus += 0.15f;\n+            //Glyph of Icy Touch: 20% damage bonus for Frost Fever\n+            if (baseId == FROST_FEVER || baseId == FROST_FEVER_AURA)\n+                pctbonus += 0.2f;\n+\n+            //Item - Death Knight T8 DPS Relic\n+            if (lvl >= 80 && baseId == DEATH_COIL_DAMAGE)\n+                fdamage += 113.f;\n+            //Increased Icy Touch Damage (id 54800): 111 bonus damage for Icy Touch\n+            if (baseId == ICY_TOUCH_1)\n+                fdamage += 111.f;\n+            //Increased Death Coil Damage (id 54807): 80 bonus damage for Death Coil\n+            if (baseId == DEATH_COIL_1 || baseId == DEATH_COIL_DAMAGE)\n+                fdamage += 80.f;\n+\n+            damage = int32(fdamage * (1.0f + pctbonus));\n+        }\n+\n+        void ApplyClassDamageMultiplierHeal(Unit const* /*victim*/, float& heal, SpellInfo const* spellInfo, DamageEffectType /*damagetype*/, uint32 /*stack*/) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+            float pctbonus = 0.0f;\n+            float flat_mod = 0.0f;\n+\n+            //pct mods\n+            //Morbidity part 2: 15% bonus healing for Death Coil\n+            if (baseId == DEATH_COIL_1 || baseId == DEATH_COIL_HEAL)\n+                pctbonus += 0.15f;\n+            //Improved Rune Tap part 1: 100% bonus healing for Rune Tap\n+            if (lvl >= 58 && baseId == RUNE_TAP_1)\n+                pctbonus += 1.f;\n+            //Improved Death Strike (part 3): 50% bonus healing for Death Strike\n+            if ((GetSpec() == BOT_SPEC_DK_BLOOD) && lvl >= 62 && baseId == DEATH_STRIKE_HEAL)\n+                pctbonus += 0.5f;\n+\n+            //Glyph of Dark Death part 2: 15% bonus healing for Death Coil\n+            if (baseId == DEATH_COIL_1 || baseId == DEATH_COIL_HEAL)\n+                pctbonus += 0.15f;\n+            //Glyph of Rune Tap part 1: 10% bonus healing for Rune Tap\n+            if (baseId == RUNE_TAP_1)\n+                pctbonus += 0.1f;\n+\n+            //flat mods\n+            //Improved Prayer of Mending: 100 additional heal for Prayer of Mending\n+            //if (baseId == PRAYER_OF_MENDING_HEAL)\n+            //    flat_mod += 100;\n+\n+            heal = heal * (1.0f + pctbonus) + flat_mod;\n+        }\n+\n+        void ApplyClassSpellCostMods(SpellInfo const* spellInfo, int32& cost) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            float fcost = float(cost);\n+            int32 flatbonus = 0;\n+            float pctbonus = 0.0f;\n+\n+            //percent mods\n+            //Endless Winter part 2 -100% Runic Power cost for Mind Freeze\n+            if (lvl >= 58 && baseId == MIND_FREEZE_1)\n+                pctbonus += 1.f;\n+\n+            //Glyph of Blood Tap: -100% Health cost for Blood Tap\n+            if (baseId == BLOOD_TAP_1)\n+                pctbonus += 1.f;\n+\n+            //flat mods\n+            //Glyph of Frost Strike: -8 Runic Power cost for Frost Strike\n+            if (baseId == FROST_STRIKE_1)\n+                flatbonus += 80;\n+            //Glyph of Hungering Cold: -40 Runic Power cost for Hungering Cold\n+            if (lvl >= 60 && baseId == HUNGERING_COLD_1)\n+                flatbonus += 400;\n+\n+            //cost can be < 0\n+            cost = int32(fcost * (1.0f - pctbonus)) - flatbonus;\n+        }\n+\n+        void ApplyClassSpellCooldownMods(SpellInfo const* spellInfo, uint32& cooldown) const override\n+        {\n+            //cooldown is in milliseconds\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            int32 timebonus = 0;\n+            float pctbonus = 0.0f;\n+\n+            //pct mods\n+            //Aspiration\n+            //if (lvl >= 45 && (baseId == INNER_FOCUS_1 || baseId == POWER_INFUSION_1 || baseId == PAIN_SUPPRESSION_1))\n+            //    pctbonus += 0.2f;\n+\n+            //flat mods\n+            //Unholy Command: -10 sec cooldown for Dark Command\n+            if (lvl >= 56 && baseId == DARK_COMMAND_1)\n+                timebonus += 10000;\n+            //Improved Rune Tap part 2: -30 sec cooldown for Rune Tap\n+            if (lvl >= 57 && baseId == RUNE_TAP_1)\n+                timebonus += 30000;\n+\n+            //Glyph of Strangulate: -20 sec cooldown for Strangulate\n+            if (baseId == STRANGULATE_1)\n+                timebonus += 20000;\n+\n+            //Item - Death Knight T9 Tank 2P Bonus\n+            if (lvl >= 80 && (baseId == UNBREAKABLE_ARMOR_1 || baseId == VAMPIRIC_BLOOD_1 || baseId == BONE_SHIELD_1))\n+                timebonus += 10000;\n+            //Strangulate Cooldown Reduction: -5 sec cooldown for Strangulate\n+            if (baseId == STRANGULATE_1)\n+                timebonus += 5000;\n+\n+            //Empower Rune Weapon Cooldown Reduction For Bot: -3 min\n+            if (baseId == EMPOWER_RUNE_WEAPON_1)\n+                timebonus += 180000;\n+\n+            cooldown = int32(std::max<float>((float(cooldown) * (1.0f - pctbonus)) - timebonus, 0.f));\n+        }\n+\n+        void ApplyClassSpellCategoryCooldownMods(SpellInfo const* spellInfo, uint32& cooldown) const override\n+        {\n+            //cooldown is in milliseconds\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            int32 timebonus = 0;\n+            float pctbonus = 0.0f;\n+\n+            //pct mods\n+            //Aspiration\n+            //if (lvl >= 45 && baseId == PENANCE_1)\n+            //    pctbonus += 0.2f;\n+\n+            //flat mods\n+            //Morbidity part 2\n+            if (baseId == DEATH_AND_DECAY_1)\n+                timebonus += 15000;\n+\n+            //Item - Death Knight T9 Tank 2P Bonus\n+            if (lvl >= 80 && baseId == DARK_COMMAND_1)\n+                timebonus += 2000;\n+\n+            cooldown = int32(std::max<float>((float(cooldown) * (1.0f - pctbonus)) - timebonus, 0.f));\n+        }\n+\n+        void ApplyClassSpellGlobalCooldownMods(SpellInfo const* spellInfo, float& cooldown) const override\n+        {\n+            //cooldown is in milliseconds\n+            //uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            //uint8 lvl = me->GetLevel();\n+            float timebonus = 0.0f;\n+            float pctbonus = 0.0f;\n+\n+            //Unholy Presence\n+            if (_presence == DEATH_KNIGHT_UNHOLY_PRESENCE &&\n+                ((spellInfo->SpellFamilyFlags[0] & 0xFFDFFE7F) ||\n+                (spellInfo->SpellFamilyFlags[0] & 0x480B11F7) ||\n+                (spellInfo->SpellFamilyFlags[0] & 0x20)))\n+                timebonus += 500.f;\n+\n+            cooldown = (cooldown * (1.0f - pctbonus)) - timebonus;\n+        }\n+\n+        void ApplyClassSpellRadiusMods(SpellInfo const* spellInfo, float& radius) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            //uint8 lvl = me->GetLevel();\n+            float flatbonus = 0.0f;\n+            float pctbonus = 0.0f;\n+\n+            //pct mods\n+            ////Holy Reach\n+            //if (lvl >= 25 && ((spellInfo->SpellFamilyFlags[0] & 0x18400200) || (spellInfo->SpellFamilyFlags[2] & 0x4)))\n+            //    pctbonus += 0.2f;\n+\n+            //flat mods\n+            //Glyph of Corpse Explosion\n+            if (spellInfo->SpellFamilyFlags[1] & 0x20)\n+                flatbonus += 5.f;\n+            //Glyph of Pestilence\n+            if (baseId == PESTILENCE_1)\n+                flatbonus += 5.f;\n+\n+            radius = radius * (1.0f + pctbonus) + flatbonus;\n+        }\n+\n+        void ApplyClassSpellRangeMods(SpellInfo const* spellInfo, float& maxrange) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            //uint8 lvl = me->GetLevel();\n+            float flatbonus = 0.0f;\n+            float pctbonus = 0.0f;\n+\n+            //pct mods\n+            //Holy Reach: +20% range for Holy Spells\n+            //if (lvl >= 25 && (spellInfo->SpellFamilyFlags[0] & 0x100080))\n+            //    pctbonus += 0.2f;\n+\n+            //flat mods\n+            //Icy Reach: +10 yd range for Icy Touch, Chains of Ice and Howling Blast\n+            if (baseId == ICY_TOUCH_1 || baseId == CHAINS_OF_ICE_1 || baseId == HOWLING_BLAST_1)\n+                flatbonus += 10.f;\n+\n+            maxrange = maxrange * (1.0f + pctbonus) + flatbonus;\n+        }\n+\n+        void OnClassSpellGo(SpellInfo const* spellInfo) override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+\n+            //Glyph of Rune Tap part 2\n+            if (baseId == RUNE_TAP_1)\n+                me->CastSpell(me, GLYPH_RUNE_TAP_HEAL, true);\n+\n+            //Empower Rune Weapon: rune activation helper\n+            if (baseId == EMPOWER_RUNE_WEAPON_1)\n+                ActivateAllRunes();\n+\n+            //Improved Chains of Ice (62142): convert frost rune into death rune\n+            if (lvl >= 80 && baseId == CHAINS_OF_ICE_1)\n+            {\n+                ConvertRune(RUNE_FROST);\n+            }\n+            //Death Rune Mastery: convert Unholy and Frost Runes into Death Runes\n+            if (lvl >= 57 && (baseId == DEATH_STRIKE_1 || baseId == OBLITERATE_1))\n+            {\n+                ConvertRune(RUNE_UNHOLY);\n+                ConvertRune(RUNE_FROST);\n+            }\n+            //Reaping: Blood Strike and Pestilence convert Blood Rune to Death Rune\n+            if ((GetSpec() == BOT_SPEC_DK_UNHOLY) && lvl >= 60 && (baseId == BLOOD_STRIKE_1 || baseId == PESTILENCE_1))\n+            {\n+                ConvertRune(RUNE_BLOOD);\n+                //Blood of the North (part 2): same effect\n+                if (lvl >= 62)\n+                    ConvertRune(RUNE_BLOOD);\n+            }\n+            //Rime: consume buff\n+            if (baseId == HOWLING_BLAST_1 && rimeProcTimer > GetLastDiff() && me->HasAura(RIME_BUFF))\n+                me->RemoveAurasDueToSpell(RIME_BUFF);\n+            //Blood Tap\n+            if (baseId == BLOOD_TAP_1)\n+            {\n+                ConvertRune(RUNE_BLOOD);\n+\n+                //Item - Death Knight T10 Tank 4P Bonus: Blood Armor (12% damage reduce)\n+                if (lvl >= 80)\n+                    me->CastSpell(me, ITEM_DEATH_KNIGHT_T10_TANK_4P_BUFF, true);\n+            }\n+\n+            //stances\n+            if (spellInfo->GetCategory() == 47)\n+            {\n+                presencetimer = 1000;\n+\n+                if (baseId == BLOOD_PRESENCE_1)\n+                    _presence = DEATH_KNIGHT_BLOOD_PRESENCE;\n+                else if (baseId == FROST_PRESENCE_1)\n+                    _presence = DEATH_KNIGHT_FROST_PRESENCE;\n+                else if (baseId == UNHOLY_PRESENCE_1)\n+                    _presence = DEATH_KNIGHT_UNHOLY_PRESENCE;\n+            }\n+        }\n+\n+        void SpellHitTarget(Unit* wtarget, SpellInfo const* spell) override\n+        {\n+            Unit* target = wtarget->ToUnit();\n+            if (!target)\n+                return;\n+\n+            uint32 spellId = spell->Id;\n+            uint32 baseId = spell->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+\n+            //consume buffs (not on spell go)\n+            //Killing Machine\n+            //Deathchill\n+            AuraEffect const* mach = me->GetAuraEffect(KILLING_MACHINE_BUFF, 0);\n+            AuraEffect const* chil = me->GetAuraEffect(DEATHCHILL_1, 0);\n+            if (mach && mach->IsAffectedOnSpell(spell))\n+                me->RemoveAurasDueToSpell(KILLING_MACHINE_BUFF);\n+            else if (chil && chil->IsAffectedOnSpell(spell))\n+                me->RemoveAurasDueToSpell(DEATHCHILL_1);\n+\n+            //Icy Touch tanking helper (TODO: remove this hack after threat mods implementation)\n+            //emulating passive mod +600% threat generated by Icy Touch while in Frost Presence\n+            if (baseId == ICY_TOUCH_1 && _presence == DEATH_KNIGHT_FROST_PRESENCE && target->CanHaveThreatList())\n+            {\n+                if (SpellThreatEntry const* threatEntry = sSpellMgr->GetSpellThreatEntry(spellId))\n+                {\n+                    int32 baseThreat = 0;\n+                    if (threatEntry->apPctMod != 0x0)\n+                        baseThreat += int32(threatEntry->apPctMod * me->GetTotalAttackPowerValue(BASE_ATTACK));\n+                    baseThreat += threatEntry->flatMod;\n+\n+                    if (baseThreat)\n+                        target->GetThreatMgr().AddThreat(me, baseThreat * 6.f, spell);\n+                }\n+            }\n+\n+            //Improved Icy Touch part 2: 6% increased effect (flat)\n+            if (baseId == FROST_FEVER_AURA)\n+            {\n+                if (Aura const* feve = target->GetAura(spellId, me->GetGUID()))\n+                {\n+                    if (AuraEffect* fev1 = feve->GetEffect(1))\n+                        fev1->ChangeAmount(fev1->GetAmount() - 6);\n+                    if (AuraEffect* fev2 = feve->GetEffect(2))\n+                        fev2->ChangeAmount(fev2->GetAmount() - 6);\n+                }\n+            }\n+            //Rime (part 2): Obliterate has 15% chance to reset Howling Blast cooldown\n+            if ((GetSpec() == BOT_SPEC_DK_FROST) && baseId == OBLITERATE_1 && urand(1,100) <= 15)\n+            {\n+                ResetSpellCooldown(HOWLING_BLAST_1);\n+                me->CastSpell(me, RIME_BUFF, true);\n+            }\n+\n+            //Glyph of Horn of Winter: 1 minute bonus duration (8 for bot)\n+            if (baseId == HORN_OF_WINTER_1)\n+            {\n+                if (Aura* horn = target->GetAura(spellId, me->GetGUID()))\n+                {\n+                    uint32 dur = horn->GetDuration() + 480000;\n+                    horn->SetDuration(dur);\n+                    horn->SetMaxDuration(dur);\n+                }\n+\n+                //Winter Veil addition\n+                if (sGameEventMgr->IsActiveEvent(GAME_EVENT_WINTER_VEIL))\n+                    target->AddAura(44755, target); //snowflakes\n+            }\n+            //Epidemic: 6 sec bonus duration for DK Diseases\n+            if (baseId == FROST_FEVER_AURA || baseId == BLOOD_PLAGUE_AURA ||\n+                baseId == CRYPT_FEVER_AURA || baseId == EBON_PLAGUE_AURA)\n+            {\n+                if (Aura* fever = target->GetAura(spellId, me->GetGUID()))\n+                {\n+                    uint32 dur = fever->GetDuration() + 6000;\n+                    fever->SetDuration(dur);\n+                    fever->SetMaxDuration(dur);\n+                }\n+            }\n+            //Chilblains: proc Icy Clutch\n+            if ((GetSpec() == BOT_SPEC_DK_FROST) && lvl >= 61 && baseId == FROST_FEVER_AURA)\n+                me->CastSpell(target, CHILBLAINS_DEBUFF, true);\n+            //Sudden Doom: 15% ctc Death Coil on Blood Strike or Heart Strike\n+            if ((GetSpec() == BOT_SPEC_DK_BLOOD) &&\n+                (baseId == BLOOD_STRIKE_1 || baseId == HEART_STRIKE_1) && GetSpell(DEATH_COIL_1) && urand(1,100) <= 15)\n+                me->CastSpell(target, GetSpell(DEATH_COIL_1), true);\n+            //Glyph of Heart Strike\n+            if (baseId == HEART_STRIKE_1)\n+                me->CastSpell(target, GLYPH_HEART_STRIKE_DEBUFF, true);\n+            //Glyph of Howling Blast\n+            if (lvl >= 60 && baseId == HOWLING_BLAST_1)\n+                me->CastSpell(target, FROST_FEVER_AURA, true);\n+            //Glyph of Scourge Strike\n+            if (baseId == SCOURGE_STRIKE_1)\n+                me->CastSpell(target, GLYPH_SCOURGE_STRIKE_EFFECT, true);\n+\n+            OnSpellHitTarget(target, spell);\n+        }\n+\n+        void SpellHit(Unit* wcaster, SpellInfo const* spell) override\n+        {\n+            Unit* caster = wcaster->ToUnit();\n+            if (!caster)\n+                return;\n+\n+            uint32 baseId = spell->GetFirstRankSpell()->Id;\n+            uint32 spellId = spell->Id;\n+            uint8 lvl = me->GetLevel();\n+\n+            //Rime helper (Freezing Fog)\n+            if (baseId == RIME_BUFF)\n+            {\n+                rimeProcTimer = 15000;\n+            }\n+\n+            //Improved Blood Presence\n+            if ((GetSpec() == BOT_SPEC_DK_BLOOD) && lvl >= 61 && baseId == BLOOD_PRESENCE_1)\n+            {\n+                if (AuraEffect* pres = me->GetAuraEffect(spellId, 1))\n+                    pres->ChangeAmount(pres->GetAmount() + 10);\n+            }\n+            if (baseId == ANTI_MAGIC_SHELL_1)\n+            {\n+                if (Aura* shell = me->GetAura(spellId))\n+                {\n+                    //Glyph of Anti-Magic Shell: 2 sec increased duration\n+                    uint32 dur = shell->GetDuration() + 2000;\n+                    shell->SetDuration(dur);\n+                    shell->SetMaxDuration(dur);\n+                    //Magic Suppression part 2\n+                    if (AuraEffect* shab = shell->GetEffect(0))\n+                        shab->ChangeAmount(int32(shab->GetAmount() * 1.25f));\n+                }\n+            }\n+            if (baseId == VAMPIRIC_BLOOD_1)\n+            {\n+                //Glyph of Vampiric Blood: 5 sec increased duration\n+                if (Aura* bloo = me->GetAura(spellId))\n+                {\n+                    uint32 dur = bloo->GetDuration() + 5000;\n+                    bloo->SetDuration(dur);\n+                    bloo->SetMaxDuration(dur);\n+                }\n+            }\n+            if (baseId == BONE_SHIELD_1)\n+            {\n+                //Glyph of Bone Shield: 1 bonus charge (1 for bot, 3 for tank)\n+                if (Aura* bone = me->GetAura(spellId))\n+                    bone->SetCharges(bone->GetCharges() + (IsTank() ? 3 : 1));\n+            }\n+            if (baseId == ICEBOUND_FORTITUDE_1)\n+            {\n+                if (Aura* fort = me->GetAura(spellId))\n+                {\n+                    //Icebound Duration Increase: + 3 sec duration\n+                    uint32 dur = fort->GetDuration() + 3000;\n+\n+                    //Guile of Gorefiend (part 2): Icebound Fortitude 6 sec increased duration\n+                    if ((GetSpec() == BOT_SPEC_DK_FROST) && lvl >= 63)\n+                        dur += 6000;\n+\n+                    fort->SetDuration(dur);\n+                    fort->SetMaxDuration(dur);\n+\n+                    if (AuraEffect* eff2 = fort->GetEffect(EFFECT_2))\n+                    {\n+                        //calc correct amount\n+                        int32 amount = eff2->GetAmount() - int32(0.15f * (std::max<int32>(0, GetBotDefense() - lvl*5)));\n+                        //Glyph of Icebound Fortitude\n+                        amount = std::min<int32>(amount, -40);\n+                        //Increased Icebound Fortitude Mitigation (54803)\n+                        if (lvl >= 70)\n+                            amount -= 2;\n+                        eff2->ChangeAmount(amount);\n+                    }\n+                }\n+            }\n+            if (baseId == UNBREAKABLE_ARMOR_1)\n+            {\n+                if (AuraEffect* armo = me->GetAuraEffect(spellId, 0))\n+                    armo->ChangeAmount(armo->GetAmount() + 5); //25 +20% = 30\n+            }\n+\n+            OnSpellHit(caster, spell);\n+        }\n+\n+        void DamageDealt(Unit* victim, uint32& damage, DamageEffectType damageType, SpellSchoolMask damageSchoolMask) override\n+        {\n+            if (victim == me)\n+                return;\n+\n+            if (damageType == DIRECT_DAMAGE || damageType == SPELL_DIRECT_DAMAGE)\n+            {\n+                //Blood Presence Heal\n+                if (_presence == DEATH_KNIGHT_FROST_PRESENCE || _presence == DEATH_KNIGHT_UNHOLY_PRESENCE)\n+                {\n+                    if (int32 bp0 = int32(damage / 25)) //4%\n+                    {\n+                        //CastSpellExtraArgs args(true);\n+                        //args.AddSpellBP0(bp0);\n+                        //me->CastSpell(me, BLOOD_PRESENCE_HEAL_EFFECT, args);\n+                        me->CastCustomSpell(me, BLOOD_PRESENCE_HEAL_EFFECT, &bp0, nullptr, nullptr, true);\n+                    }\n+                }\n+            }\n+\n+            bot_ai::DamageDealt(victim, damage, damageType, damageSchoolMask);\n+        }\n+\n+        void DamageTaken(Unit* u, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellSchoolMask /*schoolMask*/) override\n+        {\n+            if (!u)\n+                return;\n+            if (!u->IsInCombat() && !me->IsInCombat())\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void OwnerAttackedBy(Unit* u) override\n+        {\n+            if (!u)\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        uint8 GetPetPositionNumber(Creature const* /*summon*/) const override\n+        {\n+            //TODO: garg, aod, drw\n+            return 0;\n+        }\n+\n+        void SummonBotPet()\n+        {\n+            if (botPet)\n+                UnsummonAll(false);\n+\n+            uint32 entry = BOT_PET_GHOUL;\n+\n+            Position pos;\n+\n+            Creature* myPet = me->SummonCreature(entry, *me, TEMPSUMMON_CORPSE_DESPAWN);\n+            me->GetNearPoint(myPet, pos.m_positionX, pos.m_positionY, pos.m_positionZ, 0.f, 0.f, float(me->GetOrientation() + M_PI / 2.f));\n+            myPet->GetMotionMaster()->MovePoint(me->GetMapId(), pos);\n+            myPet->SetCreator(master);\n+            myPet->SetOwnerGUID(me->GetGUID());\n+            myPet->SetFaction(master->GetFaction());\n+            myPet->SetControlledByPlayer(!IAmFree());\n+            myPet->SetPvP(me->IsPvP());\n+            myPet->SetByteValue(UNIT_FIELD_BYTES_2, 1, master->GetByteValue(UNIT_FIELD_BYTES_2, 1));\n+\n+            botPet = myPet;\n+        }\n+\n+        void JustSummoned(Creature* summon) override\n+        {\n+            switch (summon->GetEntry())\n+            {\n+                case NPC_DANCING_RUNE_WEAPON:\n+                case NPC_EBON_GARGOYLE:\n+                    summon->SetCreator(me);\n+                    break;\n+                default:\n+                    break;\n+            }\n+        }\n+\n+        void SummonedCreatureDespawn(Creature* summon) override\n+        {\n+            //all hunter bot pets despawn at death or manually (gossip, teleport, etc.)\n+            //BOT_LOG_ERROR(\"entities.unit\", \"SummonedCreatureDespawn: %s's %s\", me->GetName().c_str(), summon->GetName().c_str());\n+            if (summon == botPet)\n+            {\n+                petSummonTimer = 30000;\n+                botPet = nullptr;\n+            }\n+        }\n+\n+        void UnsummonAll(bool savePets = true) override\n+        {\n+            UnsummonPet(savePets);\n+        }\n+\n+        uint32 GetAIMiscValue(uint32 data) const override\n+        {\n+            switch (data)\n+            {\n+                case BOTAI_MISC_PET_TYPE:\n+                    return BOT_PET_GHOUL;\n+                default:\n+                    return 0;\n+            }\n+        }\n+\n+        void Reset() override\n+        {\n+            UnsummonAll(false);\n+\n+            petSummonTimer = 5000;\n+\n+            presencetimer = 0;\n+            runicpowertimer = 2000;\n+            runicpowertimer2 = 5000;\n+\n+            rimeProcTimer = 0;\n+\n+            _presence = BOT_STANCE_NONE;\n+\n+            runicpowerIncomeMult = sWorld->getRate(RATE_POWER_RUNICPOWER_INCOME);\n+            runicpowerLossMult = sWorld->getRate(RATE_POWER_RUNICPOWER_LOSS);\n+\n+            DefaultInit();\n+            InitRunes();\n+        }\n+\n+        void ReduceCD(uint32 diff) override\n+        {\n+            RuneTimers(diff);\n+\n+            if (presencetimer > diff)               presencetimer -= diff;\n+            if (runicpowertimer > diff)             runicpowertimer -= diff;\n+            if (runicpowertimer2 > diff)            runicpowertimer2 -= diff;\n+\n+            if (rimeProcTimer > diff)               rimeProcTimer -= diff;\n+\n+            if (petSummonTimer > diff)              petSummonTimer -= diff;\n+        }\n+\n+        void InitPowers() override\n+        {\n+            me->SetPowerType(POWER_RUNIC_POWER);\n+            me->SetMaxPower(POWER_RUNIC_POWER, 1300);\n+            //RefreshAura(RUNIC_POWER_MASTERY);\n+            //if (AuraEffect* mast = me->GetAuraEffect(RUNIC_POWER_MASTERY, 0))\n+            //{\n+            //    //Runic Power Mastery rank 2\n+            //    mast->ChangeAmount(1300);\n+            //}\n+\n+            if (botPet && botPet->GetPowerType() != POWER_ENERGY)\n+                botPet->SetByteValue(UNIT_FIELD_BYTES_0, 3, POWER_ENERGY);\n+        }\n+\n+        void InitSpells() override\n+        {\n+            uint8 lvl = me->GetLevel();\n+            bool isBloo = GetSpec() == BOT_SPEC_DK_BLOOD;\n+            bool isFros = GetSpec() == BOT_SPEC_DK_FROST;\n+            bool isUnho = GetSpec() == BOT_SPEC_DK_UNHOLY;\n+\n+            InitSpellMap(ICY_TOUCH_1);\n+            InitSpellMap(PLAGUE_STRIKE_1);\n+            InitSpellMap(BLOOD_STRIKE_1);\n+            InitSpellMap(DEATH_STRIKE_1);\n+            InitSpellMap(OBLITERATE_1);\n+            InitSpellMap(RUNE_STRIKE_1);\n+            InitSpellMap(BLOOD_BOIL_1);\n+            InitSpellMap(DEATH_AND_DECAY_1);\n+            InitSpellMap(DEATH_COIL_1);\n+            InitSpellMap(DEATH_GRIP_1);\n+            InitSpellMap(PESTILENCE_1);\n+            InitSpellMap(MIND_FREEZE_1);\n+            InitSpellMap(STRANGULATE_1);\n+            InitSpellMap(CHAINS_OF_ICE_1);\n+            InitSpellMap(ICEBOUND_FORTITUDE_1);\n+            InitSpellMap(DARK_COMMAND_1);\n+            InitSpellMap(ANTI_MAGIC_SHELL_1);\n+            InitSpellMap(ARMY_OF_THE_DEAD_1);\n+            InitSpellMap(PATH_OF_FROST_1);\n+            InitSpellMap(HORN_OF_WINTER_1);\n+            InitSpellMap(EMPOWER_RUNE_WEAPON_1);\n+            InitSpellMap(BLOOD_TAP_1);\n+\n+  /*Talent*/lvl >= 57 ? InitSpellMap(RUNE_TAP_1) : RemoveSpell(RUNE_TAP_1);\n+  /*Talent*/lvl >= 59 && isBloo ? InitSpellMap(MARK_OF_BLOOD_1) : RemoveSpell(MARK_OF_BLOOD_1);\n+  /*Talent*/lvl >= 61 && isBloo ? InitSpellMap(HYSTERIA_1) : RemoveSpell(HYSTERIA_1);\n+  /*Talent*/lvl >= 62 && isBloo ? InitSpellMap(VAMPIRIC_BLOOD_1) : RemoveSpell(VAMPIRIC_BLOOD_1);\n+  /*Talent*/lvl >= 63 && isBloo ? InitSpellMap(HEART_STRIKE_1) : RemoveSpell(HEART_STRIKE_1);\n+  /*Talent*/lvl >= 65 && isBloo ? InitSpellMap(DANCING_RUNE_DEAPON_1) : RemoveSpell(DANCING_RUNE_DEAPON_1);\n+\n+  /*Talent*/lvl >= 57 ? InitSpellMap(LICHBORNE_1) : RemoveSpell(LICHBORNE_1);\n+  /*Talent*/lvl >= 59 && isFros ? InitSpellMap(DEATHCHILL_1) : RemoveSpell(DEATHCHILL_1);\n+  /*Talent*/lvl >= 61 && isFros ? InitSpellMap(HUNGERING_COLD_1) : RemoveSpell(HUNGERING_COLD_1);\n+  /*Talent*/lvl >= 62 && isFros ? InitSpellMap(UNBREAKABLE_ARMOR_1) : RemoveSpell(UNBREAKABLE_ARMOR_1);\n+  /*Talent*/lvl >= 63 && isFros ? InitSpellMap(FROST_STRIKE_1) : RemoveSpell(FROST_STRIKE_1);\n+  /*Talent*/lvl >= 65 && isFros ? InitSpellMap(HOWLING_BLAST_1) : RemoveSpell(HOWLING_BLAST_1);\n+\n+  /*Talent*/lvl >= 61 && isUnho ? InitSpellMap(ANTI_MAGIC_ZONE_1) : RemoveSpell(ANTI_MAGIC_ZONE_1);\n+  /*Talent*/lvl >= 62 && isUnho ? InitSpellMap(BONE_SHIELD_1) : RemoveSpell(BONE_SHIELD_1);\n+  /*Talent*/lvl >= 63 && isUnho ? InitSpellMap(SCOURGE_STRIKE_1) : RemoveSpell(SCOURGE_STRIKE_1);\n+  /*Talent*/lvl >= 65 && isUnho ? InitSpellMap(SUMMON_GARGOYLE_1) : RemoveSpell(SUMMON_GARGOYLE_1);\n+\n+            InitSpellMap(BLOOD_PRESENCE_1, true);\n+            InitSpellMap(FROST_PRESENCE_1, true);\n+            InitSpellMap(UNHOLY_PRESENCE_1, true);\n+        }\n+\n+        void ApplyClassPassives() const override\n+        {\n+            uint8 level = master->GetLevel();\n+            bool isBloo = GetSpec() == BOT_SPEC_DK_BLOOD;\n+            bool isFros = GetSpec() == BOT_SPEC_DK_FROST;\n+            bool isUnho = GetSpec() == BOT_SPEC_DK_UNHOLY;\n+\n+            RefreshAura(BUTCHERY, level >= 55 ? 1 : 0);\n+            RefreshAura(BLADED_ARMOR, level >= 56 ? 1 : 0);\n+            RefreshAura(SCENT_OF_BLOOD, level >= 56 ? 1 : 0);\n+            RefreshAura(TWO_HANDED_WEAPON_SPECIALIZATION, level >= 56 ? 1 : 0);\n+            RefreshAura(SPELL_DEFLECTION, isBloo && level >= 58 ? 1 : 0);\n+            RefreshAura(VENDETTA, isBloo && level >= 58 ? 1 : 0);\n+            RefreshAura(BLOODY_VENGEANCE3, isBloo && level >= 62 ? 1 : 0);\n+            RefreshAura(BLOODY_VENGEANCE2, isBloo && level >= 61 && level < 62 ? 1 : 0);\n+            RefreshAura(BLOODY_VENGEANCE1, isBloo && level >= 60 && level < 61 ? 1 : 0);\n+            RefreshAura(ABOMINATIONS_MIGHT, !IAmFree() && isBloo && level >= 60 ? 1 : 0);\n+            //RefreshAura(BLOODWORMS, isBloo && level >= 61 ? 1 : 0);\n+            RefreshAura(IMPROVED_BLOOD_PRESENCE, isBloo && level >= 61 ? 1 : 0);\n+            RefreshAura(WILL_OF_THE_NECROPOLIS, isBloo && level >= 63 ? 1 : 0);\n+\n+            RefreshAura(TOUGHNESS, level >= 55 ? 1 : 0);\n+            RefreshAura(ICY_TALONS, level >= 57 ? 1 : 0);\n+            RefreshAura(ANNIHILATION, level >= 57 ? 1 : 0);\n+            RefreshAura(KILLING_MACHINE, isFros && level >= 58 ? 1 : 0);\n+            RefreshAura(CHILL_OF_THE_GRAVE, isFros && level >= 58 ? 1 : 0);\n+            RefreshAura(FRIGID_DREADPLATE, isFros && level >= 59 ? 1 : 0);\n+            RefreshAura(IMPROVED_ICY_TALONS, !IAmFree() && isFros && level >= 60 ? 1 : 0);\n+            RefreshAura(THREAT_OF_THASSARIAN, isFros && level >= 62 ? 1 : 0);\n+            RefreshAura(ACCLIMATION, isFros && level >= 63 ? 1 : 0);\n+\n+            RefreshAura(NECROSIS5, isUnho && level >= 62 ? 1 : 0);\n+            RefreshAura(NECROSIS4, isUnho && level >= 60 && level < 61 ? 1 : 0);\n+            RefreshAura(NECROSIS3, isUnho && level >= 59 && level < 60 ? 1 : 0);\n+            RefreshAura(NECROSIS2, isUnho && level >= 58 && level < 59 ? 1 : 0);\n+            RefreshAura(NECROSIS1, isUnho && level >= 57 && level < 58 ? 1 : 0);\n+            RefreshAura(ON_A_PALE_HORSE_A, isUnho && level >= 58 ? 1 : 0);\n+            RefreshAura(ON_A_PALE_HORSE_B, isUnho && level >= 58 ? 1 : 0);\n+            RefreshAura(BLOOD_CAKED_BLADE3, isUnho && level >= 60 ? 1 : 0);\n+            RefreshAura(BLOOD_CAKED_BLADE2, isUnho && level >= 59 && level < 60 ? 1 : 0);\n+            RefreshAura(BLOOD_CAKED_BLADE1, isUnho && level >= 58 && level < 59 ? 1 : 0);\n+            RefreshAura(UNHOLY_BLIGHT, isUnho && level >= 59 ? 1 : 0);\n+            RefreshAura(DIRGE, isUnho && level >= 59 ? 1 : 0);\n+            RefreshAura(DESECRATION, isUnho && level >= 60 ? 1 : 0);\n+            RefreshAura(DESOLATION, isUnho && level >= 61 ? 1 : 0);\n+            RefreshAura(IMPROVED_UNHOLY_PRESENCE, isUnho && level >= 61 ? 1 : 0);\n+            RefreshAura(CRYPT_FEVER, isUnho && level >= 62 ? 1 : 0);\n+            RefreshAura(WANDERING_PLAGUE, isUnho && level >= 63 ? 1 : 0);\n+            RefreshAura(EBON_PLAGUEBRINGER, isUnho && level >= 63 ? 1 : 0);\n+\n+            RefreshAura(GLYPH_DISEASE);\n+            RefreshAura(GLYPH_CHAINS_OF_ICE);\n+            RefreshAura(GLYPH_UNHOLY_BLIGHT, level >= 60 ? 1 : 0);\n+\n+            RefreshAura(CHAINS_OF_ICE_FROST_RUNE_REFRESH);\n+            RefreshAura(ITEM_DEATH_KNIGHT_T8_MELEE_4P, level >= 80 ? 1 : 0);\n+            RefreshAura(ITEM_DEATH_KNIGHT_T9_MELEE_4P, level >= 80 ? 1 : 0);\n+\n+            RefreshAura(FROST_FEVER);\n+            RefreshAura(BLOOD_PLAGUE);\n+            RefreshAura(RUNE_STRIKE_PASSIVE);\n+        }\n+\n+        bool CanUseManually(uint32 basespell) const override\n+        {\n+            switch (basespell)\n+            {\n+                case LICHBORNE_1:\n+                case PATH_OF_FROST_1:\n+                case HORN_OF_WINTER_1:\n+                case BONE_SHIELD_1:\n+                case RUNE_TAP_1:\n+                case EMPOWER_RUNE_WEAPON_1:\n+                case VAMPIRIC_BLOOD_1:\n+                case HYSTERIA_1:\n+                    return true;\n+                case DEATH_COIL_1:\n+                    return master->GetCreatureType() == CREATURE_TYPE_UNDEAD;\n+                default:\n+                    return false;\n+            }\n+        }\n+\n+        std::vector<uint32> const* GetDamagingSpellsList() const override\n+        {\n+            return &Deathknight_spells_damage;\n+        }\n+        std::vector<uint32> const* GetCCSpellsList() const override\n+        {\n+            return &Deathknight_spells_cc;\n+        }\n+        //std::vector<uint32> const* GetHealingSpellsList() const override\n+        //{\n+        //    return &Deathknight_spells_heal;\n+        //}\n+        std::vector<uint32> const* GetSupportSpellsList() const override\n+        {\n+            return &Deathknight_spells_support;\n+        }\n+\n+    private:\n+        BotRuneInfo _runes[MAX_RUNES];\n+\n+/*tmrs*/uint32 presencetimer, runicpowertimer, runicpowertimer2;\n+        uint32 rimeProcTimer;\n+/*misc*/int32 runicpower;\n+/*misc*/int32 runeCost[NUM_RUNE_TYPES];\n+/*misc*/float runicpowerIncomeMult, runicpowerLossMult;\n+/*Chck*/uint8 _presence;\n+        //Pet\n+        uint32 petSummonTimer;\n+\n+        bool HaveRunes(uint32 spellId)\n+        {\n+            SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);\n+            return (spellInfo && HaveRunes(spellInfo));\n+        }\n+\n+        bool HaveRunes(SpellInfo const* spellInfo)\n+        {\n+            if (spellInfo->PowerType != POWER_RUNE || !spellInfo->RuneCostID)\n+                return true;\n+\n+            SpellRuneCostEntry const* src = sSpellRuneCostStore.LookupEntry(spellInfo->RuneCostID);\n+            if (!src || src->NoRuneCost())\n+                return true;\n+\n+            //Freezing Fog\n+            if (rimeProcTimer > GetLastDiff() && spellInfo->Id == HOWLING_BLAST_1)\n+                return true;\n+\n+            for (auto i : NPCBots::index_array<uint8, RUNE_DEATH>)\n+                runeCost[i] = src->RuneCost[i];\n+\n+            runeCost[RUNE_DEATH] = MAX_RUNES;\n+\n+            for (auto i : NPCBots::index_array<uint8, MAX_RUNES>)\n+            {\n+                uint8 rune = _runes[i].CurrentRune;\n+                if (runeCost[rune] > 0 && _runes[i].Cooldown <= 0)\n+                    runeCost[rune]--;\n+            }\n+\n+            for (auto i : NPCBots::index_array<uint8, RUNE_DEATH>)\n+                if (runeCost[i] > 0)\n+                    runeCost[RUNE_DEATH] += runeCost[i];\n+\n+            if (runeCost[RUNE_DEATH] > MAX_RUNES)\n+                return false;\n+\n+            return true;\n+        }\n+\n+        bool SpendRune(uint8 runetype, bool didHit)\n+        {\n+            for (auto i : NPCBots::index_array<uint8, MAX_RUNES>)\n+            {\n+                if (_runes[i].CurrentRune == runetype && _runes[i].Cooldown <= 0)\n+                {\n+                    _runes[i].CurrentRune = _runes[i].BaseRune;\n+                    uint32 cooldown = didHit ? RUNE_BASE_COOLDOWN : RUNE_MISS_COOLDOWN;\n+\n+                    //Improved Unholy Presence\n+                    if (_presence == DEATH_KNIGHT_UNHOLY_PRESENCE)\n+                        cooldown -= 1000;\n+\n+                    _runes[i].Cooldown += cooldown;\n+                    return true;\n+                }\n+            }\n+\n+            return false;\n+        }\n+\n+        uint8 GetCooledRunesCount(uint8 runetype) const\n+        {\n+            uint8 count = 0;\n+            for (auto i : NPCBots::index_array<uint8, MAX_RUNES>)\n+                if (_runes[i].BaseRune == runetype && _runes[i].Cooldown > 0)\n+                    ++count;\n+\n+            return count;\n+        }\n+\n+        uint8 GetCooledRunesCount() const\n+        {\n+            uint8 count = 0;\n+            for (auto i : NPCBots::index_array<uint8, MAX_RUNES>)\n+                if (_runes[i].Cooldown > 0)\n+                    ++count;\n+\n+            return count;\n+        }\n+\n+        uint32 GetTotalRunesCooldown() const\n+        {\n+            uint32 totalCd = 0;\n+            for (auto i : NPCBots::index_array<uint8, MAX_RUNES>)\n+                totalCd += std::max<int32>(_runes[i].Cooldown, 0);\n+\n+            return totalCd;\n+        }\n+\n+        void ConvertRune(uint8 runetype)\n+        {\n+            for (auto i : NPCBots::index_array<uint8, MAX_RUNES>)\n+            {\n+                if (_runes[i].CurrentRune == runetype)\n+                {\n+                    _runes[i].CurrentRune = RUNE_DEATH;\n+                    return;\n+                }\n+            }\n+        }\n+\n+        void ActivateAllRunes()\n+        {\n+            for (auto i : NPCBots::index_array<uint8, MAX_RUNES>)\n+                _runes[i].Cooldown = std::min<int32>(_runes[i].Cooldown, me->IsInCombat() ? -1 : 0);\n+        }\n+\n+        void InitRunes()\n+        {\n+            for (auto i : NPCBots::index_array<uint8, MAX_RUNES>)\n+            {\n+                _runes[i].BaseRune = runeSlotTypes[i];\n+                _runes[i].CurrentRune = _runes[i].BaseRune;\n+                _runes[i].Cooldown = 0;\n+            }\n+        }\n+\n+        void RuneTimers(uint32 diff)\n+        {\n+            for (auto i : NPCBots::index_array<uint8, MAX_RUNES>)\n+            {\n+                int32 &cd = _runes[i].Cooldown;\n+                if (me->IsInCombat())\n+                {\n+                    //RGP\n+                    if (cd != 0)\n+                    {\n+                        if (cd >= int32(-2500 + diff))\n+                            cd -= diff;\n+                        else if (cd != -2500)\n+                            cd = -2500;\n+                        //ensurance\n+                        if (!cd)\n+                            --cd;\n+                    }\n+                }\n+                else\n+                {\n+                    if (cd >= int32(diff))\n+                        cd -= diff;\n+                    else if (cd)\n+                        cd = 0;\n+                }\n+            }\n+        }\n+\n+        bool IsDiseased(Unit const* unit) const\n+        {\n+            static const AuraType botDiseaseAuraTypes[] =\n+            {\n+                SPELL_AURA_PERIODIC_DAMAGE, // Frost Fever and Blood Plague\n+                SPELL_AURA_LINKED,          // Crypt Fever and Ebon Plague\n+                SPELL_AURA_NONE\n+            };\n+\n+            for (AuraType const* itr = botDiseaseAuraTypes; *itr != SPELL_AURA_NONE; ++itr)\n+            {\n+                for (AuraEffect const* aeff : unit->GetAuraEffectsByType(*itr))\n+                {\n+                    // Get auras with disease dispel type by caster\n+                    if (aeff->GetSpellInfo()->Dispel == DISPEL_DISEASE)\n+                        return true;\n+                }\n+            }\n+\n+            return false;\n+        }\n+    };\n+};\n+\n+void AddSC_death_knight_bot()\n+{\n+    new death_knight_bot();\n+}\ndiff --git a/src/server/game/AI/NpcBots/bot_dreadlord_ai.cpp b/src/server/game/AI/NpcBots/bot_dreadlord_ai.cpp\nnew file mode 100644\nindex 0000000000..2dfe24759b\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bot_dreadlord_ai.cpp\n@@ -0,0 +1,536 @@\n+#include \"bot_ai.h\"\n+#include \"botspell.h\"\n+#include \"Player.h\"\n+#include \"ScriptMgr.h\"\n+#include \"SpellAuras.h\"\n+#include \"TemporarySummon.h\"\n+/*\n+Dreadlord NpcBot (by Trickerer onlysuffering@gmail.com)\n+Description:\n+Incredibly powerful demon who wields power of darkness and mental domination\n+Specifics:\n+High armor, high resistances, partially immune to control effects, damage taken speeds up spells recharge, plate armor,\n+deals melee/spellshadow damage, bonus damage to CCed units, spell power bonus: 200% strength.\n+Abilities:\n+1) Carrion Swarm. Sends a horde of bats combined with chaotic magic to damage enemies in frontal cone, 10 seconds cooldown.\n+2) Sleep. Puts the enemy target to sleep for 60 seconds (15 seconds on players) and allows next physical attack\n+on that target to bypass armor, removed by direct damage, 6 seconds cooldown.\n+3) Vampiric Aura. Increases physical critical damage by 5% and heals party and raid members within 40 yards for a\n+percentage (100% for Dreadlord and 25% for everyone else) of damage done by physical attacks and Carrion Swarm, no threat.\n+4) Summon Infernal Servant. Calls an infernal down from the sky dealing damage and stunning enemy units, lasts 180 seconds, 180 seconds cooldown.\n+Complete - 100%\n+TODO:\n+*/\n+\n+enum DreadlordBaseSpells\n+{\n+    CARRION_SWARM_1         = SPELL_CARRION_SWARM,\n+    SLEEP_1                 = SPELL_SLEEP,\n+    INFERNO_1               = SPELL_INFERNO\n+};\n+enum DreadlordPassives\n+{\n+    VAMPIRIC_AURA           = SPELL_VAMPIRIC_AURA,\n+};\n+enum DreadlordSpecial\n+{\n+    MH_ATTACK_ANIM          = SPELL_ATTACK_MELEE_1H,\n+\n+    CARRION_COST            = 110 * 5,\n+    SLEEP_COST              = 50 * 5,\n+    INFERNAL_COST           = 175 * 5,\n+\n+    DAMAGE_CD_REDUCTION     = 250,//ms\n+    INFERNO_SPAWN_DELAY     = 650,//ms\n+\n+    IMMOLATION              = 39007\n+};\n+\n+static const std::vector<uint32> Dreadlord_spells_damage{ CARRION_SWARM_1, INFERNO_1 };\n+static const std::vector<uint32> Dreadlord_spells_cc{ SLEEP_1 };\n+static const std::vector<uint32> Dreadlord_spells_support{ INFERNO_1 };\n+\n+class dreadlord_bot : public CreatureScript\n+{\n+public:\n+    dreadlord_bot() : CreatureScript(\"dreadlord_bot\") { }\n+\n+    CreatureAI* GetAI(Creature* creature) const override\n+    {\n+        return new dreadlord_botAI(creature);\n+    }\n+\n+    bool OnGossipHello(Player* player, Creature* creature) override\n+    {\n+        return creature->GetBotAI()->OnGossipHello(player, 0);\n+    }\n+\n+    bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action) override\n+    {\n+        if (bot_ai* ai = creature->GetBotAI())\n+            return ai->OnGossipSelect(player, creature, sender, action);\n+        return true;\n+    }\n+\n+    bool OnGossipSelectCode(Player* player, Creature* creature, uint32 sender, uint32 action, char const* code) override\n+    {\n+        if (bot_ai* ai = creature->GetBotAI())\n+            return ai->OnGossipSelectCode(player, creature, sender, action, code);\n+        return true;\n+    }\n+\n+    struct dreadlord_botAI : public bot_ai\n+    {\n+    private:\n+        //DelayedPetSpawnEvent - Dreadlord\n+        //Impact anim, spawn, linked effects\n+        class DelayedPetSpawnEvent : public BasicEvent\n+        {\n+            public:\n+                DelayedPetSpawnEvent(Creature const* bot, Position const* pos) : _bot(bot), _pos(pos) { }\n+\n+            protected:\n+                bool Execute(uint64 /*e_time*/, uint32 /*p_time*/)\n+                {\n+                    ((dreadlord_botAI*)_bot->AI())->SummonBotPet(_pos);\n+                    return true;\n+                }\n+\n+            private:\n+                Creature const* _bot;\n+                Position const* _pos;\n+        };\n+\n+    public:\n+        dreadlord_botAI(Creature* creature) : bot_ai(creature)\n+        {\n+            _botclass = BOT_CLASS_DREADLORD;\n+\n+            InitUnitFlags();\n+\n+            //dreadlord immunities\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_POSSESS, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_CHARM, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_SHAPESHIFT, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_TRANSFORM, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_DISARM, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_DISARM_OFFHAND, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_FEAR, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_DISARM, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_POLYMORPH, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_FEAR, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_HORROR, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_TURN, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SLEEP, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SILENCE, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SNARE, true);\n+        }\n+\n+        bool doCast(Unit* victim, uint32 spellId)\n+        {\n+            if (CheckBotCast(victim, spellId) != SPELL_CAST_OK)\n+                return false;\n+            return bot_ai::doCast(victim, spellId);\n+        }\n+\n+        void StartAttack(Unit* u, bool force = false)\n+        {\n+            if (!bot_ai::StartAttack(u, force))\n+                return;\n+            GetInPosition(force, u);\n+        }\n+\n+        void JustEngagedWith(Unit* u) override { bot_ai::JustEngagedWith(u); }\n+        void KilledUnit(Unit* u) override { bot_ai::KilledUnit(u); }\n+        void EnterEvadeMode(EvadeReason why = EVADE_REASON_OTHER) override { bot_ai::EnterEvadeMode(why); }\n+        void MoveInLineOfSight(Unit* u) override { bot_ai::MoveInLineOfSight(u); }\n+        void JustDied(Unit* u) override { UnsummonAll(false); bot_ai::JustDied(u); }\n+        void DoNonCombatActions(uint32 /*diff*/) { }\n+\n+        void CheckAura(uint32 diff)\n+        {\n+            if (checkAuraTimer > diff || GC_Timer > diff || IsCasting())\n+                return;\n+\n+            checkAuraTimer = 10000;\n+\n+            if (!me->HasAura(VAMPIRIC_AURA, me->GetGUID()))\n+                RefreshAura(VAMPIRIC_AURA);\n+        }\n+\n+        void UpdateAI(uint32 diff) override\n+        {\n+            if (!GlobalUpdate(diff))\n+                return;\n+\n+            DoVehicleActions(diff);\n+            if (!CanBotAttackOnVehicle())\n+                return;\n+\n+            //if (!me->IsInCombat())\n+            //    DoNonCombatActions(diff);\n+\n+            CheckAura(diff);\n+\n+            if (IsPotionReady())\n+            {\n+                if (me->GetPower(POWER_MANA) < CARRION_COST)\n+                    DrinkPotion(true);\n+                else if (GetHealthPCT(me) < 50)\n+                    DrinkPotion(false);\n+            }\n+\n+            if (IsCasting())\n+                return;\n+\n+            if (IsSpellReady(INFERNO_1, diff) && !botPet && me->IsInCombat() &&\n+                me->GetPower(POWER_MANA) >= INFERNAL_COST && Rand() < 60)\n+            {\n+                Unit* target = FindAOETarget(CalcSpellMaxRange(INFERNO_1));\n+\n+                if (target)\n+                    _infernoPos = target->GetPosition();\n+                else\n+                    me->GetNearPoint(me, _infernoPos.m_positionX, _infernoPos.m_positionY, _infernoPos.m_positionZ, 0.f, 5.f, 0.f);\n+\n+                me->CastSpell(_infernoPos.m_positionX, _infernoPos.m_positionY, _infernoPos.m_positionZ, GetSpell(INFERNO_1), false);\n+                return;\n+            }\n+\n+            if (ProcessImmediateNonAttackTarget())\n+                return;\n+\n+            if (!CheckAttackTarget())\n+                return;\n+\n+            CheckUsableItems(diff);\n+\n+            CheckSleep(diff);\n+\n+            Attack(diff);\n+        }\n+\n+        void Attack(uint32 diff)\n+        {\n+            Unit* mytar = opponent ? opponent : disttarget ? disttarget : nullptr;\n+            if (!mytar)\n+                return;\n+\n+            StartAttack(mytar, IsMelee());\n+\n+            CheckAttackState();\n+            if (!me->IsAlive() || !mytar->IsAlive())\n+                return;\n+\n+            MoveBehind(mytar);\n+\n+            if (!HasRole(BOT_ROLE_DPS))\n+                return;\n+\n+            if (IsSpellReady(CARRION_SWARM_1, diff) && me->GetPower(POWER_MANA) >= CARRION_COST && Rand() < 80)\n+            {\n+                bool cast = false;\n+                if (me->HasInArc(float(M_PI)/2, mytar) && me->GetDistance(mytar) < 25 &&\n+                    (IsTank() || GetManaPCT(me) > 60 || me->getAttackers().empty() || GetHealthPCT(me) < 50 ||\n+                    mytar->HasAura(SLEEP_1)))\n+                {\n+                    cast = true;\n+                }\n+\n+                if (!cast)\n+                {\n+                    std::list<Unit*> targets;\n+                    GetNearbyTargetsInConeList(targets, 25); //real radius is 30\n+                    if (targets.size() > 1)\n+                    {\n+                        cast = true;\n+                    }\n+                }\n+\n+                if (cast && doCast(me, GetSpell(CARRION_SWARM_1)))\n+                    return;\n+            }\n+        }\n+\n+        void CheckSleep(uint32 diff)\n+        {\n+            if (!IsSpellReady(SLEEP_1, diff) || IsCasting() || Rand() > 50)\n+                return;\n+\n+            //fleeing/casting/solo enemy\n+            Unit* u = me->GetVictim();\n+            if (u && IsSpellReady(CARRION_SWARM_1, diff, false) && !CCed(u) && me->GetDistance(u) < CalcSpellMaxRange(SLEEP_1) &&\n+                (u->IsNonMeleeSpellCast(false,false, true) || (u->IsInCombat() && u->getAttackers().size() == 1)))\n+            {\n+                if (doCast(u, GetSpell(SLEEP_1)))\n+                    return;\n+            }\n+\n+            if (Unit* target = FindCastingTarget(CalcSpellMaxRange(SLEEP_1), 0, SLEEP_1))\n+            {\n+                if (doCast(target, GetSpell(SLEEP_1)))\n+                    return;\n+            }\n+\n+            if (Unit* target = FindStunTarget(CalcSpellMaxRange(SLEEP_1)))\n+            {\n+                if (doCast(target, GetSpell(SLEEP_1)))\n+                    return;\n+            }\n+        }\n+\n+        void ApplyClassDamageMultiplierMelee(uint32& /*damage*/, CalcDamageInfo& damageinfo) const override\n+        {\n+            float pctbonus = 1.0f;\n+\n+            //150% damage on CCed units\n+            if (CCed(damageinfo.target))\n+                pctbonus *= 1.5f;\n+\n+            damageinfo.damages[0].damage = uint32(damageinfo.damages[0].damage * pctbonus);\n+        }\n+\n+        void ApplyClassDamageMultiplierSpell(int32& damage, SpellNonMeleeDamage& damageinfo, SpellInfo const* spellInfo, WeaponAttackType /*attackType*/, bool iscrit) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //uint8 lvl = me->GetLevel();\n+            float fdamage = float(damage);\n+\n+            //apply bonus damage mods\n+            float pctbonus = 1.0f;\n+            if (iscrit)\n+                pctbonus *= 1.333f;\n+\n+            //double damage on CCed units\n+            if (CCed(damageinfo.target))\n+                pctbonus *= 2.f;\n+\n+            if (baseId == CARRION_SWARM_1)\n+                fdamage += me->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_MAGIC) * (spellInfo->Effects[0].BonusMultiplier - 1.f) * me->CalculateDefaultCoefficient(spellInfo, SPELL_DIRECT_DAMAGE) * me->CalculateLevelPenalty(spellInfo);\n+\n+            damage = int32(fdamage * pctbonus);\n+        }\n+\n+        void OnClassSpellGo(SpellInfo const* spellInfo) override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+\n+            if (baseId == CARRION_SWARM_1)\n+            {\n+                me->resetAttackTimer();\n+                me->CastSpell(me, MH_ATTACK_ANIM, true);\n+            }\n+\n+            if (baseId == INFERNO_1)\n+            {\n+                me->CastSpell(_infernoPos.m_positionX, _infernoPos.m_positionY, _infernoPos.m_positionZ, SPELL_INFERNO_METEOR_VISUAL, true);\n+                DelayedPetSpawnEvent* spawnEvent = new DelayedPetSpawnEvent(me, &_infernoPos);\n+                Events.AddEvent(spawnEvent, Events.CalculateTime(INFERNO_SPAWN_DELAY));\n+            }\n+        }\n+\n+        void SpellHitTarget(Unit* wtarget, SpellInfo const* spell) override\n+        {\n+            Unit* target = wtarget->ToUnit();\n+            if (!target)\n+                return;\n+\n+            OnSpellHitTarget(target, spell);\n+        }\n+\n+        void SpellHit(Unit* wcaster, SpellInfo const* spell) override\n+        {\n+            Unit* caster = wcaster->ToUnit();\n+            if (!caster)\n+                return;\n+\n+            OnSpellHit(caster, spell);\n+        }\n+\n+        void OnBotDamageDealt(Unit* victim, uint32 damage, CleanDamage const* /*cleanDamage*/, DamageEffectType /*damagetype*/, SpellInfo const* spellInfo) override\n+        {\n+            //Carrion swarm heal\n+            if (damage && victim != me && spellInfo && spellInfo->GetFirstRankSpell()->Id == CARRION_SWARM_1)\n+            {\n+                int32 basepoints0 = std::min<uint32>(damage, victim->GetHealth());\n+                //BOT_LOG_ERROR(\"entities.unit\", \"OnBotDamageDealt(drl): %s on %s base val %i (%s),\",\n+                //    me->GetName().c_str(), victim->GetName().c_str(), int32(damage), spellInfo->SpellName[0]);\n+                //CastSpellExtraArgs args(true);\n+                //args.AddSpellBP0(basepoints0);\n+                //me->CastSpell(me, SPELL_TRIGGERED_HEAL, args);\n+                me->CastCustomSpell(me, SPELL_TRIGGERED_HEAL, &basepoints0, nullptr, nullptr, true);\n+            }\n+        }\n+\n+        void DamageDealt(Unit* victim, uint32& damage, DamageEffectType damageType, SpellSchoolMask damageSchoolMask) override\n+        {\n+            bot_ai::DamageDealt(victim, damage, damageType, damageSchoolMask);\n+        }\n+\n+        void DamageTaken(Unit* u, uint32& damage, DamageEffectType /*damageType*/, SpellSchoolMask /*schoolMask*/) override\n+        {\n+            if (damage)\n+            {\n+                for (auto& [rank1_id, spell] : GetSpellMap())\n+                {\n+                    //not affected if pet is alive\n+                    if (botPet && rank1_id == INFERNO_1)\n+                        continue;\n+\n+                    if (!spell.cooldown)\n+                        continue;\n+\n+                    spell.cooldown = spell.cooldown > DAMAGE_CD_REDUCTION ? spell.cooldown - DAMAGE_CD_REDUCTION : 0;\n+                }\n+            }\n+\n+            if (!u)\n+                return;\n+            if (!u->IsInCombat() && !me->IsInCombat())\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void OwnerAttackedBy(Unit* u) override\n+        {\n+            if (!u)\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void SummonBotPet(Position const* sPos)\n+        {\n+            if (botPet)\n+                UnsummonAll(false);\n+\n+            uint32 entry = BOT_PET_INFERNAL;\n+\n+            //Position pos;\n+\n+            Creature* myPet = me->SummonCreature(entry, *sPos, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 2000);\n+            //me->GetNearPoint(myPet, pos.m_positionX, pos.m_positionY, pos.m_positionZ, 0, 2, me->GetOrientation());\n+            //myPet->GetMotionMaster()->MovePoint(me->GetMapId(), pos);\n+            myPet->SetCreator(master);\n+            myPet->SetOwnerGUID(me->GetGUID());\n+            myPet->SetFaction(master->GetFaction());\n+            myPet->SetControlledByPlayer(!IAmFree());\n+            myPet->SetPvP(me->IsPvP());\n+            myPet->SetByteValue(UNIT_FIELD_BYTES_2, 1, master->GetByteValue(UNIT_FIELD_BYTES_2, 1));\n+\n+            //immune\n+            myPet->SetUInt32Value(UNIT_CREATED_BY_SPELL, INFERNO_1);\n+            //dreadlord immunities\n+            myPet->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_SHAPESHIFT, true);\n+            myPet->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_TRANSFORM, true);\n+            myPet->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_FEAR, true);\n+            myPet->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_POLYMORPH, true);\n+            myPet->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_FEAR, true);\n+            myPet->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_HORROR, true);\n+            myPet->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_TURN, true);\n+            myPet->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SLEEP, true);\n+            myPet->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SNARE, true);\n+\n+            //myPet->SetMeleeDamageSchool(SPELL_SCHOOL_FIRE);\n+\n+            //infernal is immune to magic\n+            //myPet->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_MAGIC, true);\n+            myPet->CastSpell(myPet, SPELL_INFERNO_EFFECT, true); //damage, stun\n+            //myPet->CastSpell(myPet, SPELL_INFERNO_IMPACT_EXPLOSION, true); //visual\n+            myPet->CastSpell(myPet, IMMOLATION, true);\n+\n+            botPet = myPet;\n+        }\n+\n+        void UnsummonAll(bool savePets = true) override\n+        {\n+            UnsummonPet(savePets);\n+        }\n+\n+        void SummonedCreatureDies(Creature* /*summon*/, Unit* /*killer*/) override\n+        {\n+        }\n+\n+        void SummonedCreatureDespawn(Creature* summon) override\n+        {\n+            //BOT_LOG_ERROR(\"entities.unit\", \"SummonedCreatureDespawn: %s's %s\", me->GetName().c_str(), summon->GetName().c_str());\n+            if (summon == botPet)\n+                botPet = nullptr;\n+        }\n+\n+        uint32 GetAIMiscValue(uint32 data) const override\n+        {\n+            switch (data)\n+            {\n+                case BOTAI_MISC_PET_TYPE:\n+                    return BOT_PET_INFERNAL;\n+                default:\n+                    return 0;\n+            }\n+        }\n+\n+        void Reset() override\n+        {\n+            checkAuraTimer = 0;\n+\n+            DefaultInit();\n+        }\n+\n+        void ReduceCD(uint32 diff) override\n+        {\n+            if (checkAuraTimer > diff)              checkAuraTimer -= diff;\n+        }\n+\n+        void InitPowers() override\n+        {\n+            me->SetPowerType(POWER_MANA);\n+        }\n+\n+        void InitSpells() override\n+        {\n+            InitSpellMap(CARRION_SWARM_1, true, false);\n+            InitSpellMap(SLEEP_1, true, false);\n+            InitSpellMap(INFERNO_1);\n+        }\n+\n+        void ApplyClassPassives() const override\n+        {\n+        }\n+\n+        bool CanUseManually(uint32 basespell) const override\n+        {\n+            switch (basespell)\n+            {\n+                case CARRION_SWARM_1:\n+                    return true;\n+                default:\n+                    return false;\n+            }\n+        }\n+\n+        std::vector<uint32> const* GetDamagingSpellsList() const override\n+        {\n+            return &Dreadlord_spells_damage;\n+        }\n+        std::vector<uint32> const* GetCCSpellsList() const override\n+        {\n+            return &Dreadlord_spells_cc;\n+        }\n+        //std::vector<uint32> const* GetHealingSpellsList() const override\n+        //{\n+        //    return &Dreadlord_spells_heal;\n+        //}\n+        std::vector<uint32> const* GetSupportSpellsList() const override\n+        {\n+            return &Dreadlord_spells_support;\n+        }\n+\n+    private:\n+        uint32 checkAuraTimer;\n+        Position _infernoPos;\n+    };\n+};\n+\n+void AddSC_dreadlord_bot()\n+{\n+    new dreadlord_bot();\n+}\ndiff --git a/src/server/game/AI/NpcBots/bot_druid_ai.cpp b/src/server/game/AI/NpcBots/bot_druid_ai.cpp\nnew file mode 100644\nindex 0000000000..51247c3383\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bot_druid_ai.cpp\n@@ -0,0 +1,2986 @@\n+#include \"bot_ai.h\"\n+#include \"botlogtraits.h\"\n+#include \"botmgr.h\"\n+#include \"bottext.h\"\n+#include \"bottraits.h\"\n+#include \"Group.h\"\n+#include \"Log.h\"\n+#include \"Map.h\"\n+#include \"MotionMaster.h\"\n+#include \"ObjectAccessor.h\"\n+#include \"Player.h\"\n+#include \"ScriptMgr.h\"\n+#include \"Spell.h\"\n+#include \"SpellAuraEffects.h\"\n+#include \"SpellMgr.h\"\n+#include \"TemporarySummon.h\"\n+#include \"World.h\"\n+/*\n+Druid NpcBot (reworked by Trickerer onlysuffering@gmail.com)\n+Complete - 85-90%\n+TODO: Resolve remaining bugs with wrong power type after death\n+TODO2: PvP behaviour revamp (again, it's like 5th time?)\n+*/\n+\n+static constexpr uint8 MAX_TREANTS = 3;\n+\n+enum DruidBaseSpells\n+{\n+    MARK_OF_THE_WILD_1                  = 1126,\n+    THORNS_1                            = 467,\n+    HEALING_TOUCH_1                     = 5185,\n+    REGROWTH_1                          = 8936,\n+    REJUVENATION_1                      = 774,\n+    LIFEBLOOM_1                         = 33763,\n+    NOURISH_1                           = 50464,\n+    WILD_GROWTH_1                       = 48438,\n+    SWIFTMEND_1                         = 18562,\n+    TRANQUILITY_1                       = 740,\n+    REVIVE_1                            = 50769,\n+    REBIRTH_1                           = 20484,\n+    BEAR_FORM_1                         = 5487,\n+    SWIPE_BEAR_1                        = 779,\n+    MANGLE_BEAR_1                       = 33878,\n+    BASH_1                              = 5211,\n+    MAUL_1                              = 6807,\n+    FERAL_CHARGE_BEAR_1                 = 16979,\n+    CHALLENGING_ROAR_1                  = 5209,\n+    ENRAGE_1                            = 5229,\n+    FRENZIED_REGENERATION_1             = 22842,\n+    GROWL_1                             = 6795,\n+    LACERATE_1                          = 33745,\n+    SURVIVAL_INSTINCTS_1                = 61336,\n+    FAERIE_FIRE_FERAL_1                 = 16857,//chains threat and damage spell regardless of bot feral form\n+    BERSERK_1                           = 50334,\n+    CAT_FORM_1                          = 768,\n+    CLAW_1                              = 1082,\n+    RAKE_1                              = 1822,\n+    SHRED_1                             = 5221,\n+    MANGLE_CAT_1                        = 33876,\n+    RIP_1                               = 1079,\n+    FEROCIOUS_BITE_1                    = 22568,\n+    POUNCE_1                            = 9005,\n+    RAVAGE_1                            = 6785,\n+    MAIM_1                              = 22570,\n+    SWIPE_CAT_1                         = 62078,\n+    SAVAGE_ROAR_1                       = 52610,\n+    FERAL_CHARGE_CAT_1                  = 49376,\n+    COWER_1                             = 8998,\n+    DASH_1                              = 1850,\n+    TIGERS_FURY_1                       = 5217,\n+    PROWL_1                             = 5215,\n+    MOONFIRE_1                          = 8921,\n+    STARFIRE_1                          = 2912,\n+    WRATH_1                             = 5176,\n+    HURRICANE_1                         = 16914,\n+    FAERIE_FIRE_NORMAL_1                = 770,\n+    INSECT_SWARM_1                      = 5570,\n+    TYPHOON_1                           = 50516,\n+    STARFALL_1                          = 48505,\n+    MOONKIN_FORM_1                      = 24858,\n+    TREE_OF_LIFE_FORM_1                 = 33891,\n+    TRAVEL_FORM_1                       = 783,\n+    AQUATIC_FORM_1                      = 1066,\n+    FLIGHT_FORM_1                       = 33943,\n+    ABOLISH_POISON_1                    = 2893,//manual use only\n+    CURE_POISON_1                       = 8946,\n+    REMOVE_CURSE_1                      = 2782,\n+    ENTANGLING_ROOTS_1                  = 339,\n+    CYCLONE_1                           = 33786,\n+    HIBERNATE_1                         = 2637,\n+    BARKSKIN_1                          = 22812,\n+    NATURES_GRASP_1                     = 16689,\n+    INNERVATE_1                         = 29166,\n+    NATURES_SWIFTNESS_1                 = 17116\n+};\n+enum DruidPassives\n+{\n+//Talents\n+    OMEN_OF_CLARITY                     = 16864,//clearcast\n+    NATURESGRACE                        = 61346,//rank 3\n+    NATURAL_PERFECTION1                 = 33881,\n+    NATURAL_PERFECTION2                 = 33882,\n+    NATURAL_PERFECTION3                 = 33883,\n+    LIVING_SEED1                        = 48496,\n+    LIVING_SEED2                        = 48499,\n+    LIVING_SEED3                        = 48500,\n+    REVITALIZE1                         = 48539,\n+    REVITALIZE2                         = 48544,\n+    REVITALIZE3                         = 48545,\n+    NATURALIST                          = 17073,//rank 5\n+    IMPROVED_MARK_OF_THE_WILD           = 17051,//rank 2\n+    FUROR                               = 17061,//rank 5\n+    INTENSITY                           = 17108,//rank 3\n+    LIVING_SPIRIT                       = 34153,//rank 3\n+    GIFT_OF_THE_EARTHMOTHER             = 51183,//rank 5\n+    ECLIPSE                             = 48525,//rank 3\n+    EARTH_AND_MOON                      = 48511,//rank 3\n+    SURVIVAL_OF_THE_FITTEST             = 33856,//rank 3\n+    DREAMSTATE                          = 33956,//rank 3\n+    BALANCE_OF_POWER                    = 33596,//rank 2\n+    IMPROVED_MOONKIN_FORM               = 48396,//rank 3\n+    OWLKIN_FRENZY                       = 48393,//rank 3 NOT REFRESHAURABLE\n+    FERAL_SWIFTNESS                     = 24866,//rank 2 NOT REFRESHAURABLE\n+    PRIMAL_PRECISION                    = 48410,//rank 2 expertise only, refund handled in Spell.cpp\n+    NATURAL_REACTION                    = 57881,//rank 3 NOT REFRESHAURABLE\n+    IMPROVED_LEADER_OF_THE_PACK         = 34300,//rank 2\n+    PRIMAL_TENACITY                     = 33957,//rank 3\n+    PREDATORY_INSTINCTS                 = 33867,//rank 3 NOT REFRESHAURABLE\n+    KING_OF_THE_JUNGLE                  = 48495,//rank 3\n+    PRIMAL_GORE                         = 63503,//rank 1\n+//Glyphs\n+    GLYPH_NOURISH                       = 62971,\n+    GLYPH_SWIFTMEND                     = 54824,//no consumption\n+    GLYPH_INNERVATE                     = 54832,//self regen\n+    GLYPH_RAPID_REJUVENATION            = 71013,\n+    GLYPH_REGROWTH                      = 54743,\n+    GLYPH_REJUVENATION                  = 54754,\n+    GLYPH_FRENZIED_REGENERATION         = 54810,\n+    GLYPH_BARKSKIN                      = 63057,\n+    GLYPH_RAKE                          = 54821,\n+    GLYPH_SHRED                         = 54815,\n+//other\n+    T10_RESTO_P4_BONUS                  = 70664,//rejuve jump\n+    T9_RESTO_P4_BONUS                   = 67128,//rejuve crits\n+    T8_RESTO_P4_BONUS                   = 64760,//rejuve init heal\n+\n+    T8_BALANCE_P4_BONUS                 = 64824,//insect swarm periodic starfire instacast trigger\n+    T9_BALANCE_P2_BONUS                 = 67125,//moonfire crits\n+    T10_BALANCE_P2_BONUS                = 70718,//omen of doom (15%)\n+    T10_BALANCE_P4_BONUS                = 70723,//Languish(DOT)\n+\n+    T10_FERAL_P4_BONUS                  = 70726,//rake crit, enraged defense\n+    T8_FERAL_P2_BONUS                   = 64752,//periodic clearcast trigger\n+};\n+enum DruidSpecial\n+{\n+    STARFALL_DAMAGE_AOE_4               = 53190,//for radius mods\n+    //STARFALL_DAMAGE_DIRECT_4            = 53195,\n+    STARFALL_DUMMY_AOE_4                = 53198,//for radius mods\n+\n+    HURRICANE_DAMAGE_1                  = 42231,\n+    //TRANQUILITY_HEAL_1                  = 44203,\n+    //TYPHOON_DAMAGE_1                    = 61391,\n+\n+    SAVAGE_ROAR_BUFF                    = 62071,//hidden buff\n+    PREDATORS_SWIFTNESS_BUFF            = 69369,\n+    LEADER_OF_THE_PACK_BUFF             = 24932,\n+    NURTURING_INSTINCT_BUFF             = 47180,//rank 2 hidden NOT REFRESHAURABLE\n+    SURVIVAL_OF_THE_FITTEST_BUFF        = 62069,//hidden buff\n+    SAVAGE_DEFENSE_PASSIVE              = 62600,//class passive lvl 40\n+    SAVAGE_DEFENSE_BUFF                 = 62606,\n+    MASTER_SHAPESHIFTER_BEAR_BUFF       = 48418,\n+    MASTER_SHAPESHIFTER_CAT_BUFF        = 48420,\n+    MASTER_SHAPESHIFTER_MOONKIN_BUFF    = 48421,\n+    MASTER_SHAPESHIFTER_TREE_BUFF       = 48422,\n+    //NATURESGRACEBUFF                    = 16886,\n+    ECLIPSE_SOLAR_BUFF                  = 48517,// from Starfire to Wrath\n+    ECLIPSE_LUNAR_BUFF                  = 48518,// from Wrath to Starfire\n+    ELUNES_WRATH_BUFF                   = 64823,//Starfire instacast\n+    OMEN_OF_CLARITY_BUFF                = 16870,\n+\n+    //FERAL_CHARGE_EFFECT_BEAR_ROOT       = 45334,\n+    //FERAL_CHARGE_EFFECT_CAT_DAZE        = 50259,\n+    INFECTED_WOUNDS_EFFECT              = 58181,//rank 3\n+    PRIMAL_FURY_EFFECT_ENERGIZE         = 16959,//5 rage\n+\n+    FORCE_OF_NATURE_1                   = 33831 //not casted\n+};\n+\n+static const std::vector<uint32> Druid_spells_damage\n+{ FAERIE_FIRE_FERAL_1, CLAW_1, FEROCIOUS_BITE_1, MAIM_1, MANGLE_CAT_1, POUNCE_1, RAKE_1, RAVAGE_1, RIP_1, SHRED_1,\n+SWIPE_CAT_1, LACERATE_1, MANGLE_BEAR_1, MAUL_1,SWIPE_BEAR_1, ENTANGLING_ROOTS_1, HURRICANE_1, INSECT_SWARM_1,\n+WRATH_1, MOONFIRE_1, STARFALL_1, STARFIRE_1, TYPHOON_1, THORNS_1 };\n+static const std::vector<uint32> Druid_spells_cc{ BASH_1, CYCLONE_1, ENTANGLING_ROOTS_1, FERAL_CHARGE_BEAR_1, HIBERNATE_1, MAIM_1, POUNCE_1, TYPHOON_1 };\n+static const std::vector<uint32> Druid_spells_heal{ HEALING_TOUCH_1, LIFEBLOOM_1, NOURISH_1, REGROWTH_1, REJUVENATION_1, SWIFTMEND_1, TRANQUILITY_1, WILD_GROWTH_1 };\n+static const std::vector<uint32> Druid_spells_support\n+{ ABOLISH_POISON_1, BARKSKIN_1, BERSERK_1, CHALLENGING_ROAR_1, COWER_1, CURE_POISON_1, DASH_1, ENRAGE_1,\n+FAERIE_FIRE_NORMAL_1, FAERIE_FIRE_FERAL_1, FERAL_CHARGE_BEAR_1, FERAL_CHARGE_CAT_1, FRENZIED_REGENERATION_1,\n+GROWL_1, INNERVATE_1, MARK_OF_THE_WILD_1, NATURES_GRASP_1, NATURES_SWIFTNESS_1, PROWL_1, REMOVE_CURSE_1,\n+REBIRTH_1, REVIVE_1, SAVAGE_ROAR_1, SURVIVAL_INSTINCTS_1, THORNS_1, TIGERS_FURY_1 };\n+\n+static float rageLossMult;\n+\n+class druid_bot : public CreatureScript\n+{\n+public:\n+    druid_bot() : CreatureScript(\"druid_bot\") { }\n+\n+    CreatureAI* GetAI(Creature* creature) const override\n+    {\n+        return new bot_druid_ai(creature);\n+    }\n+\n+    bool OnGossipHello(Player* player, Creature* creature) override\n+    {\n+        return creature->GetBotAI()->OnGossipHello(player, 0);\n+    }\n+\n+    bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action) override\n+    {\n+        if (bot_ai* ai = creature->GetBotAI())\n+            return ai->OnGossipSelect(player, creature, sender, action);\n+        return true;\n+    }\n+\n+    bool OnGossipSelectCode(Player* player, Creature* creature, uint32 sender, uint32 action, char const* code) override\n+    {\n+        if (bot_ai* ai = creature->GetBotAI())\n+            return ai->OnGossipSelectCode(player, creature, sender, action, code);\n+        return true;\n+    }\n+\n+    struct bot_druid_ai : public bot_ai\n+    {\n+        bot_druid_ai(Creature* creature) : bot_ai(creature)\n+        {\n+            _botclass = BOT_CLASS_DRUID;\n+\n+            InitUnitFlags();\n+        }\n+\n+        bool doCast(Unit* victim, uint32 spellId)\n+        {\n+            if (CheckBotCast(victim, spellId) != SPELL_CAST_OK)\n+                return false;\n+            return bot_ai::doCast(victim, spellId);\n+        }\n+\n+        void JustEngagedWith(Unit* u) override { bot_ai::JustEngagedWith(u); }\n+        void KilledUnit(Unit* u) override { bot_ai::KilledUnit(u); }\n+        void EnterEvadeMode(EvadeReason why = EVADE_REASON_OTHER) override { bot_ai::EnterEvadeMode(why); }\n+        void MoveInLineOfSight(Unit* u) override { bot_ai::MoveInLineOfSight(u); }\n+        void JustDied(Unit* u) override { removeShapeshiftForm(); UnsummonAll(false); bot_ai::JustDied(u); }\n+\n+        uint8 GetBotStance() const override\n+        {\n+            return _form;\n+        }\n+\n+        bool removeShapeshiftForm() override\n+        {\n+            BotStances myform = _form;\n+            _form = BOT_STANCE_NONE;\n+            //ShapeshiftForm form = me->GetShapeshiftForm();\n+            //if (form != FORM_NONE)\n+            {\n+                switch (myform/*form*/)\n+                {\n+                    //case FORM_DIREBEAR:\n+                    //case FORM_BEAR:\n+                    case DRUID_BEAR_FORM:\n+                        if (IsRegenActive())\n+                            return false;\n+                        me->RemoveAurasDueToSpell(GetSpell(BEAR_FORM_1));\n+                        me->RemoveAurasDueToSpell(MASTER_SHAPESHIFTER_BEAR_BUFF);\n+                        me->RemoveAurasDueToSpell(NATURAL_REACTION);\n+                        me->RemoveAurasDueToSpell(SURVIVAL_OF_THE_FITTEST_BUFF);\n+                        me->RemoveAurasDueToSpell(SAVAGE_DEFENSE_PASSIVE);\n+                        break;\n+                    //case FORM_CAT:\n+                    case DRUID_CAT_FORM:\n+                        me->RemoveAurasDueToSpell(GetSpell(CAT_FORM_1));\n+                        me->RemoveAurasDueToSpell(FERAL_SWIFTNESS);\n+                        me->RemoveAurasDueToSpell(MASTER_SHAPESHIFTER_CAT_BUFF);\n+                        me->RemoveAurasDueToSpell(NURTURING_INSTINCT_BUFF);\n+                        me->RemoveAurasDueToSpell(PREDATORY_INSTINCTS);\n+                        break;\n+                    //case FORM_MOONKIN:\n+                    case DRUID_MOONKIN_FORM:\n+                        me->RemoveAurasDueToSpell(GetSpell(MOONKIN_FORM_1));\n+                        me->RemoveAurasDueToSpell(GetSpell(OWLKIN_FRENZY));\n+                        me->RemoveAurasDueToSpell(MASTER_SHAPESHIFTER_MOONKIN_BUFF);\n+                        break;\n+                    //case FORM_TREE:\n+                    case DRUID_TREE_FORM:\n+                        me->RemoveAurasDueToSpell(GetSpell(TREE_OF_LIFE_FORM_1));\n+                        me->RemoveAurasDueToSpell(MASTER_SHAPESHIFTER_TREE_BUFF);\n+                        break;\n+                    //case FORM_TRAVEL:\n+                    case DRUID_TRAVEL_FORM:\n+                        me->RemoveAurasDueToSpell(GetSpell(TRAVEL_FORM_1));\n+                        break;\n+                    //case FORM_AQUA:\n+                    case DRUID_AQUATIC_FORM:\n+                        me->RemoveAurasDueToSpell(GetSpell(AQUATIC_FORM_1));\n+                        break;\n+                    //case FORM_FLIGHT:\n+                    //case FORM_FLIGHT_EPIC:\n+                    case DRUID_FLIGHT_FORM:\n+                        me->RemoveAurasDueToSpell(GetSpell(FLIGHT_FORM_1));\n+                        break;\n+                    default:\n+                        break;\n+                }\n+\n+                if (me->GetPowerType() != POWER_MANA)\n+                {\n+                    //BOT_LOG_ERROR(\"entities.player\", \"druid_bot::removeShapeshiftForm(): still has poweType %u!\", uint32(me->GetPowerType()));\n+                    me->SetPowerType(POWER_MANA);\n+                }\n+                if (me->GetShapeshiftForm() != FORM_NONE)\n+                {\n+                    //BOT_LOG_ERROR(\"entities.player\", \"druid_bot::removeShapeshiftForm(): still speshifted into %u!\", uint32(me->GetShapeshiftForm()));\n+                    me->RemoveAurasByType(SPELL_AURA_MOD_SHAPESHIFT, me->GetGUID(), nullptr, false);\n+                }\n+\n+                setStats(BOT_STANCE_NONE);\n+            }\n+            return true;\n+        }\n+\n+        //bool IsMelee() const\n+        //{\n+        //    return bot_ai::IsMelee() && (_form == DRUID_BEAR_FORM || _form == DRUID_CAT_FORM);\n+        //}\n+\n+        void StartAttack(Unit* u, bool force = false)\n+        {\n+            if (!bot_ai::StartAttack(u, force))\n+                return;\n+            if (_form == DRUID_BEAR_FORM && HasRole(BOT_ROLE_RANGED) && IsSpellReady(BASH_1, GetLastDiff(), false))\n+                return;\n+            GetInPosition(force, u);\n+        }\n+\n+        bool MassGroupHeal(Player* gPlayer, uint32 diff)\n+        {\n+            if (!HasRole(BOT_ROLE_HEAL)) return false;\n+            if (!gPlayer || GC_Timer > diff || IAmFree()) return false;\n+            if (IsCasting()) return false; // if I'm already casting\n+            if (Rand() > 30 + 50 * (me->GetMap()->IsRaid())) return false;\n+            if (!gPlayer->GetGroup()) return false;\n+\n+            bool tranq = IsSpellReady(TRANQUILITY_1, diff, false) && master->GetBotMgr()->IsPartyInCombat(false);\n+            bool growt = IsSpellReady(WILD_GROWTH_1, diff, false) && !HasRole(BOT_ROLE_DPS);\n+            if (!tranq && !growt)\n+                return false;\n+\n+            uint8 LHPcount = 0;\n+            uint8 pct = 100;\n+            Unit* healTarget = nullptr;\n+            std::vector<Unit*> members = BotMgr::GetAllGroupMembers(master);\n+            std::vector<Unit*> groupUnits;\n+            groupUnits.reserve(members.size());\n+\n+            for (Unit* member : members)\n+            {\n+                if (me->GetMap() != member->FindMap() || member->isPossessed() || member->IsCharmed() ||\n+                    !member->IsAlive() || me->GetDistance(member) > 40)\n+                    continue;\n+                if (growt)\n+                    groupUnits.push_back(member);\n+                if (tranq && GetHealthPCT(member) < 80)\n+                {\n+                    if (GetHealthPCT(member) < pct)\n+                    {\n+                        pct = GetHealthPCT(member);\n+                        healTarget = member;\n+                    }\n+                    ++LHPcount;\n+                    if (LHPcount > 2)\n+                        break;\n+                }\n+            }\n+\n+            if (LHPcount > 2 && tranq &&\n+                doCast(me, GetSpell(TRANQUILITY_1)))\n+                return true;\n+\n+            healTarget = nullptr;\n+            for (Unit* gUnit : groupUnits)\n+            {\n+                LHPcount = 0;\n+                for (Unit* member : members)\n+                {\n+                    if (me->GetMap() != member->FindMap() || member->isPossessed() || member->IsCharmed() ||\n+                        !member->IsAlive() || me->GetDistance(member) > 40)\n+                        continue;\n+                    if (gUnit->GetDistance(member) < 15 && (GetLostHP(member) > 2000 || GetHealthPCT(member) < 90))\n+                        if (++LHPcount >= 3)\n+                            break;\n+                }\n+\n+                if (LHPcount >= 3)\n+                {\n+                    healTarget = gUnit;\n+                    break;\n+                }\n+            }\n+\n+            if (LHPcount >= 3 && growt && healTarget &&\n+                doCast(healTarget, GetSpell(WILD_GROWTH_1)))\n+                return true;\n+\n+            return false;\n+        }\n+\n+        //Powers\n+        //rage\n+        void getrage()\n+        {\n+            rage = me->GetPower(POWER_RAGE);\n+            if (me->FindCurrentSpellBySpellId(GetSpell(MAUL_1)))\n+                rage = std::max<int32>(rage - 150, 0);\n+        }\n+\n+        //energy\n+        void getenergy()\n+        {\n+            energy = me->GetPower(POWER_ENERGY);\n+        }\n+\n+        //all\n+        int32 acost(uint32 spellId) const\n+        {\n+            if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId))\n+                return spellInfo->CalcPowerCost(me, spellInfo->GetSchoolMask());\n+            return 0;\n+        }\n+\n+        bool IsRegenActive() const\n+        {\n+            return me->IsAlive() && me->IsInCombat() && rage > 100 && GetHealthPCT(me) < 90 &&\n+                me->GetAuraEffect(SPELL_AURA_PERIODIC_DUMMY, SPELLFAMILY_DRUID, 0x0, 0x40000000, 0x0);\n+        }\n+\n+        void CheckBarkskin(uint32 diff)\n+        {\n+            if (!me->IsAlive())\n+                return;\n+            if (me->GetVehicle())\n+                return;\n+            //No GCD\n+            if (IsSpellReady(BARKSKIN_1, diff, false) && !IsCasting() && !me->getAttackers().empty() &&\n+                Rand() < (25 + 20 * me->getAttackers().size()) &&\n+                GetHealthPCT(me) < (IsTank() ? 67 : 70 + 25 * me->getAttackers().size()))\n+            {\n+                if (doCast(me, GetSpell(BARKSKIN_1)))\n+                {}\n+            }\n+        }\n+\n+        void CheckHibery(uint32 diff)\n+        {\n+            if (hiberyCheckTimer <= diff)\n+            {\n+                hibery = FindAffectedTarget(GetSpell(HIBERNATE_1), me->GetGUID());\n+                hiberyCheckTimer = 2000;\n+            }\n+        }\n+\n+        void CheckHibernate(uint32 diff)\n+        {\n+            if (!(_form == DRUID_MOONKIN_FORM || _form == BOT_STANCE_NONE))\n+                return;\n+            //Skip Tranquility, Hurricane\n+            if (GC_Timer > diff || IsCasting() || Rand() > 35)\n+                return;\n+\n+            if (hibery == false && IsSpellReady(HIBERNATE_1, diff))\n+            {\n+                if (Unit* target = FindStunTarget(30))\n+                {\n+                    if (doCast(target, GetSpell(HIBERNATE_1)))\n+                        return;\n+                }\n+            }\n+        }\n+\n+        void Counter(uint32 diff)\n+        {\n+            if (!(_form == DRUID_MOONKIN_FORM || _form == BOT_STANCE_NONE))\n+                return;\n+            //Skip Tranquility, Hurricane\n+            if (GC_Timer > diff || Rand() > 35 || IsChanneling() || (HasRole(BOT_ROLE_HEAL) && IsCasting()))\n+                return;\n+\n+            if (IsSpellReady(CYCLONE_1, diff))\n+            {\n+                if (Unit* target = FindCastingTarget(20, 0, CYCLONE_1))\n+                {\n+                    bool cast = false;\n+                    for (uint8 i = CURRENT_GENERIC_SPELL; i != CURRENT_AUTOREPEAT_SPELL; ++i)\n+                    {\n+                        Spell const* spell = target->GetCurrentSpell(CurrentSpellTypes(i));\n+                        if (spell && spell->GetTimer() > 1500 &&\n+                            (IAmFree() ? (spell->m_targets.GetUnitTarget() == me) : (master->GetGroup() && master->GetGroup()->IsMember(spell->m_targets.GetObjectTargetGUID()))))\n+                        {\n+                            cast = true;\n+                            break;\n+                        }\n+                    }\n+                    if (cast)\n+                    {\n+                        me->InterruptNonMeleeSpells(false);\n+                        if (doCast(target, GetSpell(CYCLONE_1)))\n+                            return;\n+                    }\n+                }\n+            }\n+        }\n+\n+        void UpdateAI(uint32 diff) override\n+        {\n+            if (me->GetPowerType() == POWER_RAGE && me->IsAlive())\n+            {\n+                if (ragetimer <= diff)\n+                {\n+                    if (!me->IsInCombat() &&\n+                        !me->HasAuraTypeWithFamilyFlags(SPELL_AURA_PERIODIC_ENERGIZE, SPELLFAMILY_DRUID, 0x00080000)\n+                    /*!HasAuraName(me, ENRAGE_1)*/)\n+                    {\n+                        if (me->GetPower(POWER_RAGE) > uint32(10.f * rageLossMult))\n+                            me->SetPower(POWER_RAGE, me->GetPower(POWER_RAGE) - uint32(10.f * rageLossMult)); //-1 rage per 1.5 sec\n+                        else\n+                            me->SetPower(POWER_RAGE, 0);\n+                    }\n+                    ragetimer = 1500;\n+                }\n+                getrage();\n+            }\n+            else if (me->GetPowerType() == POWER_ENERGY)\n+                getenergy();\n+\n+            if (!GlobalUpdate(diff))\n+                return;\n+\n+            DoVehicleActions(diff);\n+            if (!CanBotAttackOnVehicle())\n+                return;\n+\n+            CheckHibery(diff);\n+            CheckBarkskin(diff);\n+\n+            if (IsPotionReady())\n+            {\n+                if (me->GetPowerType() == POWER_MANA && GetManaPCT(me) < 33)\n+                    DrinkPotion(true);\n+                else if (GetHealthPCT(me) < 35)\n+                    DrinkPotion(false);\n+            }\n+\n+            CheckRacials(diff);\n+\n+            //Innervate\n+            doInnervate(diff);\n+\n+            MassGroupHeal(master, diff);\n+            if (me->IsInCombat())\n+                CheckBattleRez(diff);\n+            else\n+                DoNonCombatActions(diff);\n+\n+            if (HasRole(BOT_ROLE_RANGED) || !me->IsInCombat() || !me->GetVictim() ||\n+                (_form != DRUID_BEAR_FORM && (_form != DRUID_CAT_FORM || !me->GetMap()->IsRaid())))\n+                BuffAndHealGroup(diff);\n+            if (_form != DRUID_BEAR_FORM && _form != DRUID_CAT_FORM)\n+            {\n+                CureGroup(GetSpell(CURE_POISON_1), diff);\n+                CureGroup(GetSpell(REMOVE_CURSE_1), diff);\n+            }\n+\n+            if (ProcessImmediateNonAttackTarget())\n+                return;\n+\n+            CheckTravel(diff);\n+\n+            if (!CheckAttackTarget())\n+            {\n+                if (!me->IsInCombat() && Rand() < 5 && me->HasAuraType(SPELL_AURA_MOD_STEALTH))\n+                    me->RemoveAurasDueToSpell(PROWL_1);\n+                return;\n+            }\n+\n+            CheckHibernate(diff);\n+            Counter(diff);\n+\n+            if (IsCasting())\n+                return;\n+\n+            CheckUsableItems(diff);\n+\n+            Attack(diff);\n+        }\n+\n+        void Attack(uint32 diff)\n+        {\n+            Unit* mytar = opponent ? opponent : disttarget ? disttarget : nullptr;\n+            if (!mytar)\n+                return;\n+\n+            StartAttack(mytar, bot_ai::IsMelee());\n+\n+            CheckAttackState();\n+            if (!me->IsAlive() || !mytar->IsAlive())\n+                return;\n+\n+            //NOT all forms abilities (prioritized)\n+            //Cat Instaheal\n+            if (_form == DRUID_CAT_FORM && GC_Timer <= diff && Rand() < 60 &&\n+                HasRole(BOT_ROLE_HEAL) && GetHealthPCT(me) < 45 &&\n+                (me->GetAuraEffect(SPELL_AURA_ADD_PCT_MODIFIER, SPELLFAMILY_DRUID, 0x0, 0x80000, 0x0) ||/*me->HasAura(PREDATORS_SWIFTNESS_BUFF)*/\n+                (IsSpellReady(NATURES_SWIFTNESS_1, diff, false) && doCast(me, GetSpell(NATURES_SWIFTNESS_1)))))\n+            {\n+                //TODO maybe istant spells if clearcast?\n+                //heal myself with instant\n+                //Healing Touch has same reqs\n+                if ((GetSpell(REGROWTH_1) && !me->GetAuraEffect(SPELL_AURA_PERIODIC_HEAL, SPELLFAMILY_DRUID, 0x40, 0x0, 0x0) &&\n+                    doCast(me, GetSpell(REGROWTH_1))) || doCast(me, GetSpell(HEALING_TOUCH_1)))\n+                {\n+                    Position pos;\n+                    mytar->GetNearPoint(me, pos.m_positionX, pos.m_positionY, pos.m_positionZ, 0.f, 15.f, mytar->GetAbsoluteAngle(me));\n+                    GetInPosition(true, mytar, &pos);\n+                    return;\n+                }\n+            }\n+            //Roots\n+            if (_form != DRUID_BEAR_FORM && _form != DRUID_TREE_FORM && Rand() < 35 &&\n+                (HasRole(BOT_ROLE_DPS) || IAmFree()) && IsSpellReady(ENTANGLING_ROOTS_1, diff) &&\n+                (_form != DRUID_CAT_FORM || IAmFree() || me->GetAuraEffect(SPELL_AURA_ADD_PCT_MODIFIER, SPELLFAMILY_DRUID, 0x0, 0x80000, 0x0)\n+                /*me->HasAura(PREDATORS_SWIFTNESS_BUFF)*/))\n+                CheckRoots();\n+\n+            //ALL forms abilities\n+            //Nature's Grasp (no shapeshift)\n+            if (IsSpellReady(NATURES_GRASP_1, diff) && HasRole(BOT_ROLE_DPS) && HasRole(BOT_ROLE_RANGED) && Rand() < 70 &&\n+                !me->getAttackers().empty())\n+            {\n+                if (doCast(me, GetSpell(NATURES_GRASP_1)))\n+                    return;\n+            }\n+            //Survival Instincts\n+            //No GCD, bear is lvl 10, SI is lvl 20\n+            //Shapeshift into bear if needed\n+            if (IsSpellReady(SURVIVAL_INSTINCTS_1, diff, false) && Rand() < 75 &&\n+                (GetHealthPCT(me) < (30 + 20 * (me->getAttackers().size() > 1))) &&\n+                (_form == DRUID_BEAR_FORM || (GC_Timer <= diff && doCast(me, GetSpell(BEAR_FORM_1)))))\n+            {\n+                if (doCast(me, SURVIVAL_INSTINCTS_1))\n+                    if (!IAmFree())\n+                        ReportSpellCast(SURVIVAL_INSTINCTS_1, LocalizedNpcText(master, BOT_TEXT__USED), master);\n+            }\n+            //Bash\n+            //Assuming Furor is present which is lvl 10\n+            //Shapeshift into bear if needed\n+            //bear is lvl 10, bash is lvl 14\n+            //Retreat is triggered only if hit (SpellHitTarget)\n+            if (me->IsInCombat() && IsSpellReady(BASH_1, diff) && !CCed(mytar, !mytar->IsNonMeleeSpellCast(false,false,true)) && mytar->IsWithinMeleeRange(me))\n+            {\n+                if (_form == DRUID_BEAR_FORM || (IsSpellReady(BEAR_FORM_1, diff, false) && doCast(me, GetSpell(BEAR_FORM_1))))\n+                {\n+                    if (rage >= acost(BASH_1) && doCast(mytar, GetSpell(BASH_1)))\n+                        return;\n+                }\n+            }\n+\n+            BotStances need_form = _selectShapeshift();\n+            uint32 form_base_spellid = _baseSpellForShapeshift(need_form);\n+            if (_form == need_form || !form_base_spellid || (IsSpellReady(form_base_spellid, diff, false) && doCast(me, GetSpell(form_base_spellid))))\n+            {\n+                switch (need_form)\n+                {\n+                    case DRUID_BEAR_FORM:\n+                        doBearActions(mytar, diff);\n+                        break;\n+                    case DRUID_CAT_FORM:\n+                        doCatActions(mytar, diff);\n+                        break;\n+                    case DRUID_MOONKIN_FORM:\n+                    case BOT_STANCE_NONE:\n+                        if (HasRole(BOT_ROLE_DPS))\n+                            doBalanceActions(mytar, diff);\n+                        break;\n+                    default:\n+                        break;\n+                }\n+            }\n+        }\n+\n+        void doBearActions(Unit* mytar, uint32 diff)\n+        {\n+            //debug\n+            if (me->GetPowerType() != POWER_RAGE || (me->GetShapeshiftForm() != FORM_BEAR && me->GetShapeshiftForm() != FORM_DIREBEAR))\n+                return;\n+\n+            //Enrage\n+            if (IsSpellReady(ENRAGE_1, diff, false) && me->IsInCombat() && (rage < 400 || IsTank()) && Rand() < 40)\n+            {\n+                if (doCast(me, GetSpell(ENRAGE_1)))\n+                    getrage();\n+            }\n+            //Frenzied Regeneration\n+            if (IsSpellReady(FRENZIED_REGENERATION_1, diff) && rage > 700 && GetHealthPCT(me) < 70 && Rand() < 40)\n+            {\n+                if (doCast(me, GetSpell(FRENZIED_REGENERATION_1)))\n+                    return;\n+            }\n+\n+            float dist = me->GetDistance(mytar);\n+            //GROWL //No GCD\n+            Unit* u = mytar->GetVictim();\n+            if (IsSpellReady(GROWL_1, diff, false) && u && u != me && Rand() < 40 && dist < 30 &&\n+                mytar->IsCreature() && !mytar->IsControlledByPlayer() &&\n+                !CCed(mytar) && !mytar->HasAuraType(SPELL_AURA_MOD_TAUNT) &&\n+                (!IsTank(u) || (IsTank() && GetHealthPCT(me) > 67 &&\n+                (GetHealthPCT(u) < 30 || (IsOffTank() && !IsOffTank(u) && IsPointedOffTankingTarget(mytar)) ||\n+                (!IsOffTank() && IsOffTank(u) && IsPointedTankingTarget(mytar))))) &&\n+                ((!IsTankingClass(u->GetClass()) && GetHealthPCT(u) < 80) || IsTank()) &&\n+                IsInBotParty(u))\n+            {\n+                if (doCast(mytar, GetSpell(GROWL_1)))\n+                    return;\n+            }\n+            //GROWL 2 (distant)\n+            if (IsSpellReady(GROWL_1, diff, false) && !IAmFree() && u == me &&  Rand() < 20 && IsTank() &&\n+                (IsOffTank() || master->GetBotMgr()->GetNpcBotsCountByRole(BOT_ROLE_TANK_OFF) == 0) &&\n+                !(me->GetLevel() >= 40 && mytar->IsCreature() &&\n+                (mytar->ToCreature()->IsDungeonBoss() || mytar->ToCreature()->isWorldBoss())))\n+            {\n+                if (Unit* tUnit = FindDistantTauntTarget())\n+                {\n+                    if (doCast(tUnit, GetSpell(GROWL_1)))\n+                        return;\n+                }\n+            }\n+            //Challenging Roar\n+            if (IsSpellReady(CHALLENGING_ROAR_1, diff) &&\n+                !(u == me && me->GetLevel() >= 40 && mytar->IsCreature() &&\n+                (mytar->ToCreature()->IsDungeonBoss() || mytar->ToCreature()->isWorldBoss())) &&\n+                rage >= acost(CHALLENGING_ROAR_1))\n+            {\n+                u = mytar->GetVictim();\n+                if (u && u != me && !IsTank(u) && IsInBotParty(u) && !CCed(mytar) && dist <= 10 && Rand() < 25 &&\n+                    (!IsTankingClass(u->GetClass()) || IsTank()))\n+                {\n+                    if (doCast(me, GetSpell(CHALLENGING_ROAR_1)))\n+                        return;\n+                }\n+                if (IsTank() && Rand() < 20)\n+                {\n+                    std::list<Unit*> targets;\n+                    GetNearbyTargetsList(targets, 9.f, 1);\n+                    uint8 count = 0;\n+                    for (Unit const* u : targets)\n+                    {\n+                        if (!(u->GetVictim() && IsTank(u->GetVictim())))\n+                            if (++count > 1)\n+                                break;\n+                    }\n+                    if (count > 1 && doCast(me, GetSpell(CHALLENGING_ROAR_1)))\n+                        return;\n+                }\n+            }\n+\n+            if (!CanAffectVictimAny(mytar, SPELL_SCHOOL_NORMAL))\n+                return;\n+\n+            //Feral Charge\n+            if (IsSpellReady(FERAL_CHARGE_BEAR_1, diff, false) && rage >= acost(FERAL_CHARGE_BEAR_1) &&\n+                !HasBotCommandState(BOT_COMMAND_STAY) &&\n+                !CCed(mytar, true) && dist > 9 && dist < 25)\n+            {\n+                if (doCast(mytar, GetSpell(FERAL_CHARGE_BEAR_1)))\n+                    return;\n+            }\n+\n+            //Faerie Fire (Feral, Bear)\n+            if (IsSpellReady(FAERIE_FIRE_FERAL_1, diff) && me->IsInCombat() && Rand() < 35 && dist < CalcSpellMaxRange(FAERIE_FIRE_FERAL_1) &&\n+                !mytar->HasAuraTypeWithFamilyFlags(SPELL_AURA_MOD_RESISTANCE_PCT, SPELLFAMILY_DRUID, 0x400))\n+            {\n+                if (doCast(mytar, GetSpell(FAERIE_FIRE_FERAL_1)))\n+                    return;\n+            }\n+\n+            //range check (melee) to prevent fake casts\n+            if (dist > 5) return;\n+\n+            //Berserk (Bear)\n+            if (IsSpellReady(BERSERK_1, diff) && !HasRole(BOT_ROLE_HEAL) && rage > 400 && Rand() < 40 &&\n+                me->getAttackers().size() > 2)\n+            {\n+                if (doCast(me, GetSpell(BERSERK_1)))\n+                    return;\n+            }\n+\n+            //BOT_ROLE_DPS is checked in Attack(uin32)\n+            //if (!HasRole(BOT_ROLE_DPS)) return;\n+\n+            //frenzied regeneration check\n+            //we don't need to spend too much rage if regening\n+            bool isRegenActive = IsRegenActive();\n+\n+            //Mangle (Bear)\n+            if (IsSpellReady(MANGLE_BEAR_1, diff) && rage >= acost(MANGLE_BEAR_1) + 200*isRegenActive)\n+            {\n+                if (me->GetAuraEffect(SPELL_AURA_MECHANIC_IMMUNITY, SPELLFAMILY_DRUID, 0x0, 0x0, 0x40) ||\n+                    (Rand() < 30 && !mytar->GetAuraEffect(SPELL_AURA_MOD_MECHANIC_DAMAGE_TAKEN_PERCENT, SPELLFAMILY_DRUID, 0x0, 0x40, 0x0)))\n+                {\n+                    if (doCast(mytar, GetSpell(MANGLE_BEAR_1)))\n+                        return;\n+                }\n+            }\n+            //Swipe (Bear)\n+            if (IsSpellReady(SWIPE_BEAR_1, diff) && rage >= acost(SWIPE_BEAR_1) + 200*isRegenActive &&\n+                IsTank() && Rand() < 70)\n+            {\n+                std::list<Unit*> targets;\n+                GetNearbyTargetsInConeList(targets, 5);\n+                if (targets.size() > 2)\n+                    if (doCast(mytar, GetSpell(SWIPE_BEAR_1)))\n+                        return;\n+            }\n+            //Lacerate\n+            if (IsSpellReady(LACERATE_1, diff) && rage >= acost(LACERATE_1) + 200*isRegenActive &&\n+                mytar->GetHealth() > me->GetMaxHealth() * 2 && Rand() < 45)\n+            {\n+                bool cast = rage >= 600;\n+                if (!cast)\n+                {\n+                    AuraApplication const* lacera = mytar->GetAuraApplicationOfRankedSpell(LACERATE_1);\n+                    cast = (!lacera || lacera->GetBase()->GetStackAmount() < 5 || lacera->GetBase()->GetDuration() < 6000);\n+                }\n+\n+                if (cast && doCast(mytar, GetSpell(LACERATE_1)))\n+                    return;\n+            }\n+\n+            //skip if maul is active\n+            if (me->GetCurrentSpell(CURRENT_MELEE_SPELL))\n+                return;\n+\n+            //Maul //No GCD\n+            if (IsSpellReady(MAUL_1, diff, false) && rage >= acost(MAUL_1) + 200 + 200*isRegenActive)\n+            {\n+                if (doCast(mytar, GetSpell(MAUL_1)))\n+                    return;\n+            }\n+        }\n+\n+        void doCatActions(Unit* mytar, uint32 diff)\n+        {\n+            //debug\n+            if (me->GetPowerType() != POWER_ENERGY || me->GetShapeshiftForm() != FORM_CAT)\n+                return;\n+\n+            //Prowl (for Cooldown handling see bot_ai::ReleaseSpellCooldown)\n+            if (IsSpellReady(PROWL_1, diff, false) && !me->IsInCombat() && Rand() < 50 && me->GetDistance(mytar) < 28 && !IsFlagCarrier(me))\n+            {\n+                if (doCast(me, GetSpell(PROWL_1)))\n+                {}\n+            }\n+\n+            if (!CanAffectVictimAny(mytar, SPELL_SCHOOL_NORMAL))\n+                return;\n+\n+            //Faerie Fire (Feral, Cat)\n+            if (IsSpellReady(FAERIE_FIRE_FERAL_1, diff) && (mytar->IsControlledByPlayer() ? !mytar->IsInCombat() : me->IsInCombat()) && !me->HasAuraType(SPELL_AURA_MOD_STEALTH) &&\n+                Rand() < ((mytar->GetClass() == CLASS_ROGUE || mytar->GetShapeshiftForm() == FORM_CAT) ? 35 : 10) && me->GetDistance(mytar) < 30 &&\n+                !mytar->HasAuraTypeWithFamilyFlags(SPELL_AURA_MOD_RESISTANCE_PCT, SPELLFAMILY_DRUID, 0x400))\n+            {\n+                if (doCast(mytar, GetSpell(FAERIE_FIRE_FERAL_1)))\n+                    return;\n+            }\n+\n+            if (!JumpingOrFalling() && !CCed(me, true))\n+            {\n+                //leap here\n+                //Feral Charge (Cat)\n+                if (IsSpellReady(FERAL_CHARGE_CAT_1, diff, false) && energy >= acost(FERAL_CHARGE_CAT_1) && !me->GetMap()->IsDungeon() &&\n+                    !HasBotCommandState(BOT_COMMAND_STAY) &&\n+                    !me->HasAuraType(SPELL_AURA_MOD_STEALTH) && Rand() < 65 &&\n+                    !me->GetAuraEffect(SPELL_AURA_MOD_INCREASE_SPEED, SPELLFAMILY_DRUID, 0x0, 0x0, 0x8) &&//not dashing\n+                    me->GetDistance(mytar) > 10 && me->GetDistance(mytar) < 25)\n+                {\n+                    if (doCast(mytar, GetSpell(FERAL_CHARGE_CAT_1)))\n+                        return; //no gcd but jump time\n+                }\n+\n+                //Dash (no GCD)\n+                if (IsSpellReady(DASH_1, diff, false) &&\n+                    (me->HasAuraType(SPELL_AURA_MOD_STEALTH) || (me->IsInCombat() && !IsSpellReady(FERAL_CHARGE_CAT_1, diff, false))) &&\n+                    Rand() < 85 && me->GetDistance(mytar) > 15)\n+                {\n+                    if (doCast(me, GetSpell(DASH_1)))\n+                    {}\n+                }\n+                //Savage Roar\n+                if (IsSpellReady(SAVAGE_ROAR_1, diff) && comboPoints >= 1 && comboPoints <= 3 && (me->IsInCombat() || mytar->IsInCombat()) &&\n+                    !me->HasAuraType(SPELL_AURA_MOD_STEALTH) && energy >= acost(SAVAGE_ROAR_1) &&\n+                    !me->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_DRUID, 0, 0x10000000, 0))\n+                {\n+                    if (doCast(mytar, GetSpell(SAVAGE_ROAR_1)))\n+                        return;\n+                }\n+            }\n+\n+            MoveBehind(mytar);\n+\n+            //range check (melee) to prevent fake casts\n+            if (me->GetDistance(mytar) > 5)\n+                return;\n+\n+            //Cower\n+            if (mytar->CanHaveThreatList())\n+            {\n+                if (IsSpellReady(COWER_1, diff) && mytar->GetVictim() == me && energy >= acost(COWER_1) &&\n+                    int32(mytar->GetThreatMgr().GetThreatListSize()) > 1 &&\n+                    int32(mytar->getAttackers().size()) > 1 && Rand() < 45)\n+                {\n+                    if (doCast(mytar, GetSpell(COWER_1)))\n+                        return;\n+                }\n+            }\n+\n+            //Tiger's Fury (no GCD) cannot use while Berserk is active\n+            if (IsSpellReady(TIGERS_FURY_1, diff, false) && mytar->GetHealth() > me->GetHealth() / 4 && (me->GetLevel() < 55 || energy <= 40) && Rand() < 80 &&\n+                !me->GetAuraEffect(SPELL_AURA_ADD_PCT_MODIFIER, SPELLFAMILY_DRUID, 0x0, 0x200000, 0x0) &&\n+                !me->GetAuraEffect(SPELL_AURA_MECHANIC_IMMUNITY, SPELLFAMILY_DRUID, 0x0, 0x0, 0x40))\n+            {\n+                if (doCast(me, GetSpell(TIGERS_FURY_1)))\n+                    getenergy();\n+            }\n+            //Berserk can be used After Tiger's Fury without dispelling it\n+            //Berserk (Cat)\n+            if (IsSpellReady(BERSERK_1, diff) && Rand() < 80 && !IsSpellReady(TIGERS_FURY_1, diff, false) && (!HasRole(BOT_ROLE_HEAL) || me->HasAuraType(SPELL_AURA_MOD_FEAR)) &&\n+                (!me->HasAuraType(SPELL_AURA_MOD_STEALTH) || energy >= 40 || me->GetAuraEffect(SPELL_AURA_ADD_PCT_MODIFIER, SPELLFAMILY_DRUID, 0x0, 0x200000, 0x0)) &&\n+                (mytar->IsPlayer() || mytar->GetHealth() + 5000 > me->GetHealth()))\n+            {\n+                if (doCast(me, GetSpell(BERSERK_1)))\n+                    return;\n+            }\n+\n+            //Openers\n+            if (me->HasAuraType(SPELL_AURA_MOD_STEALTH))\n+            {\n+                uint32 opener =\n+                    GetSpell(POUNCE_1) &&\n+                    !mytar->HasAuraType(SPELL_AURA_MOD_STUN) &&\n+                    mytar->GetDiminishing(DIMINISHING_OPENING_STUN) < DIMINISHING_LEVEL_3 &&\n+                    (mytar->IsPlayer() || (!IAmFree() && master->GetNpcBotsCount() > 1)) ? POUNCE_1 :\n+                    GetSpell(RAVAGE_1) ? RAVAGE_1 :\n+                    GetSpell(SHRED_1) ? SHRED_1 : 0;\n+\n+                //all opener spells disabled\n+                if (!opener)\n+                {\n+                    me->RemoveAurasByType(SPELL_AURA_MOD_STEALTH);\n+                    return;\n+                }\n+\n+                if (opener != POUNCE_1 && mytar->HasInArc(float(M_PI), me))\n+                    return;\n+\n+                //We do not check combo points amount\n+                if (IsSpellReady(opener, diff) && energy >= acost(opener))\n+                {\n+                    if (doCast(mytar, GetSpell(opener)))\n+                        return;\n+                }\n+\n+                return;\n+            }\n+\n+            //Finishers\n+            if (comboPoints > 0)\n+            {\n+                //Maim\n+                if (IsSpellReady(MAIM_1, diff) && !CCed(mytar) && mytar->GetHealth() > me->GetMaxHealth() / 8 && energy >= acost(MAIM_1) &&\n+                    (comboPoints >= (mytar->IsNonMeleeSpellCast(false, false, true) ? 1 : (!!mytar->GetVictim() || mytar->IsControlledByPlayer()) ? 4 : 6)))\n+                {\n+                    if (doCast(mytar, GetSpell(MAIM_1)))\n+                        return;\n+                }\n+                //Ferocious Bite\n+                if (IsSpellReady(FEROCIOUS_BITE_1, diff) && Rand() < (50 + comboPoints * 20) &&\n+                    ((comboPoints >= 4 && mytar->IsControlledByPlayer()) || mytar->GetHealth() < me->GetMaxHealth() / std::max<int32>(1, 6 - comboPoints)) &&\n+                    energy >= acost(FEROCIOUS_BITE_1))\n+                {\n+                    if (doCast(mytar, GetSpell(FEROCIOUS_BITE_1)))\n+                        return;\n+                }\n+                //Rip\n+                if (IsSpellReady(RIP_1, diff) && comboPoints >= (mytar->IsControlledByPlayer() ? 4 : 5) && Rand() < 90 &&\n+                    mytar->GetHealth() > me->GetMaxHealth() / (mytar->IsControlledByPlayer() ? 4 : 2) && energy >= acost(RIP_1) &&\n+                    !mytar->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DRUID, 0x800000, 0x0, 0x0, me->GetGUID()))\n+                {\n+                    if (doCast(mytar, GetSpell(RIP_1)))\n+                        return;\n+                }\n+            }\n+\n+            //Combo points generating\n+            //Swipe (Cat)\n+            if (IsSpellReady(SWIPE_CAT_1, diff) && me->getAttackers().empty() && energy >= acost(SWIPE_CAT_1) && Rand() < (35 + 100 * (me->GetMap()->IsDungeon())))\n+            {\n+                std::list<Unit*> targets;\n+                GetNearbyTargetsInConeList(targets, 5);\n+                if (targets.size() > 2)\n+                    if (doCast(mytar, GetSpell(SWIPE_CAT_1)))\n+                        return;\n+            }\n+\n+            //Shred\n+            if (IsSpellReady(SHRED_1, diff) && ((Rand() < 70 && energy >= acost(SHRED_1)) || !!me->GetAuraEffect(SPELL_AURA_ADD_PCT_MODIFIER, SPELLFAMILY_DRUID, 0x0, 0x200000, 0x0)) &&\n+                /*comboPoints < 5 && */ !mytar->HasInArc(float(M_PI), me))\n+            {\n+                if (doCast(mytar, GetSpell(SHRED_1)))\n+                    return;\n+            }\n+            //Mangle (Cat)\n+            if (IsSpellReady(MANGLE_CAT_1, diff) && comboPoints < 5 && energy >= acost(MANGLE_CAT_1) &&\n+                !me->GetAuraEffect(SPELL_AURA_ADD_PCT_MODIFIER, SPELLFAMILY_DRUID, 0x0, 0x200000, 0x0) &&\n+                !mytar->GetAuraEffect(SPELL_AURA_MOD_MECHANIC_DAMAGE_TAKEN_PERCENT, SPELLFAMILY_DRUID, 0x0, 0x400, 0x0))\n+            {\n+                if (doCast(mytar, GetSpell(MANGLE_CAT_1)))\n+                    return;\n+            }\n+            //Rake\n+            if (IsSpellReady(RAKE_1, diff) && (comboPoints <= (mytar->IsControlledByPlayer() ? 4 : 5)) && Rand() < 100 && energy >= acost(RAKE_1) &&\n+                !mytar->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DRUID, 0x1000, 0x0, 0x0, me->GetGUID()))\n+            {\n+                if (doCast(mytar, GetSpell(RAKE_1)))\n+                    return;\n+            }\n+            //Claw\n+            if (IsSpellReady(CLAW_1, diff) && comboPoints < 5 && Rand() < 40 && energy >= acost(CLAW_1) && (!GetSpell(SHRED_1) || mytar->HasInArc(float(M_PI), me)))\n+            {\n+                if (doCast(mytar, GetSpell(CLAW_1)))\n+                    return;\n+            }\n+        }\n+\n+        void doBalanceActions(Unit* mytar, uint32 diff)\n+        {\n+            MoveBehind(mytar);\n+\n+            if (HasRole(BOT_ROLE_HEAL) && GetManaPCT(me) < 25)\n+                return;\n+\n+            //BOT_ROLE_DPS is checked in Attack(uint32)\n+\n+            float dist = me->GetDistance(mytar);\n+            if (dist > CalcSpellMaxRange(WRATH_1))\n+                return;\n+\n+            auto [can_do_nature, can_do_arcane] = CanAffectVictimBools(mytar, SPELL_SCHOOL_NATURE, SPELL_SCHOOL_ARCANE);\n+            if (!can_do_nature && !can_do_arcane)\n+                return;\n+\n+            //spell reflections\n+            if (IsSpellReady(FAERIE_FIRE_NORMAL_1, diff) && can_do_nature && CanRemoveReflectSpells(mytar, FAERIE_FIRE_NORMAL_1) &&\n+                doCast(mytar, FAERIE_FIRE_NORMAL_1))\n+                return;\n+\n+            //Starfall\n+            if (IsSpellReady(STARFALL_1, diff) && Rand() < 40)\n+            {\n+                bool cast = (mytar->IsPlayer() || me->getAttackers().size() > 1);\n+                if (!cast)\n+                {\n+                    std::list<Unit*> targets;\n+                    GetNearbyTargetsList(targets, 30.f, 0);\n+                    if (targets.size() > 3)\n+                        cast = true;\n+                }\n+\n+                if (cast && doCast(me, GetSpell(STARFALL_1)))\n+                    return;\n+\n+                SetSpellCooldown(STARFALL_1, 1500); //fail\n+            }\n+            //Hurricane\n+            if (IsSpellReady(HURRICANE_1, diff) && !JumpingOrFalling() && Rand() < 50)\n+            {\n+                if (Unit* target = FindAOETarget(CalcSpellMaxRange(HURRICANE_1)))\n+                {\n+                    if (doCast(target, GetSpell(HURRICANE_1)))\n+                        return;\n+                }\n+                SetSpellCooldown(HURRICANE_1, 1000); //fail\n+            }\n+            //Typhoon\n+            if (IsSpellReady(TYPHOON_1, diff) && Rand() < 75)\n+            {\n+                std::list<Unit*> targets;\n+                GetNearbyTargetsInConeList(targets, 25);\n+                if (targets.size() > 2)\n+                    if (doCast(me, GetSpell(TYPHOON_1)))\n+                        return;\n+\n+                SetSpellCooldown(TYPHOON_1, 1000); //fail\n+            }\n+\n+            if (IsSpellReady(FORCE_OF_NATURE_1, diff))\n+            {\n+                SummonBotPet(mytar);\n+                SetSpellCooldown(FORCE_OF_NATURE_1, 180000);\n+                return;\n+            }\n+\n+            //Faerie Fire (non-feral): moonkin or non-shapeshifted\n+            if (IsSpellReady(FAERIE_FIRE_NORMAL_1, diff) && can_do_nature && mytar->getAttackers().size() > 2 && Rand() < 50 &&\n+                dist < CalcSpellMaxRange(FAERIE_FIRE_NORMAL_1) &&\n+                !mytar->HasAuraTypeWithFamilyFlags(SPELL_AURA_MOD_RESISTANCE_PCT, SPELLFAMILY_DRUID, 0x400)\n+                /*!HasAuraName(mytar, FAERIE_FIRE_ANY)*/)\n+            {\n+                if (doCast(mytar, GetSpell(FAERIE_FIRE_NORMAL_1)))\n+                    return;\n+            }\n+\n+            Unit const* u = mytar->GetVictim();\n+            //Insect Swarm\n+            if (IsSpellReady(INSECT_SWARM_1, diff) && can_do_nature && u && mytar->GetDistance(u) < 8 && Rand() < 30 &&\n+                dist < CalcSpellMaxRange(INSECT_SWARM_1) &&\n+                !mytar->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DRUID, 0x200000, 0x0, 0x0, me->GetGUID())\n+                /*!HasAuraName(mytar, INSECT_SWARM_1, me->GetGUID())*/)\n+            {\n+                if (doCast(mytar, GetSpell(INSECT_SWARM_1)))\n+                    return;\n+            }\n+\n+            if (IsSpellReady(MOONFIRE_1, diff) && can_do_arcane && Rand() < 60 && dist < CalcSpellMaxRange(MOONFIRE_1) &&\n+                !mytar->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DRUID, 0x2, 0x0, 0x0, me->GetGUID())\n+                /*!HasAuraName(mytar, MOONFIRE_1, me->GetGUID())*/)\n+            {\n+                if (doCast(mytar, GetSpell(MOONFIRE_1)))\n+                    return;\n+            }\n+            //TODO: balance starfire/wrath frequency based on mana effeciency\n+            if (IsSpellReady(STARFIRE_1, diff) && can_do_arcane && dist < CalcSpellMaxRange(STARFIRE_1))\n+            {\n+                AuraEffect const* eclipeLunar = me->GetAuraEffect(SPELL_AURA_ADD_FLAT_MODIFIER, SPELLFAMILY_DRUID, 0x0, 0x0, 0x4000);\n+                int32 rand = 30 + 100 * (eclipeLunar && eclipeLunar->GetBase()->GetDuration() > 3000);\n+\n+                if (Rand() < rand && doCast(mytar, GetSpell(STARFIRE_1)))\n+                    return;\n+            }\n+            if (IsSpellReady(WRATH_1, diff) && can_do_nature)\n+            {\n+                if (doCast(mytar, GetSpell(WRATH_1)))\n+                    return;\n+            }\n+        }\n+\n+        void BreakCC(uint32 diff) override\n+        {\n+            if (GC_Timer <= diff && Rand() < 25 && GetManaPCT(me) > 15 &&\n+                (me->IsPolymorphed() || me->HasAuraWithMechanic((1u<<MECHANIC_SNARE)|(1u<<MECHANIC_ROOT))))\n+            {\n+                uint32 sshift;\n+                switch (_form)\n+                {\n+                    case DRUID_BEAR_FORM:\n+                        sshift = IsTank() && !me->getAttackers().empty() &&\n+                            (!me->GetVictim() || me->GetDistance(me->GetVictim()) < 5) ? 0 :\n+                            GetSpell(BEAR_FORM_1); break;\n+                    case DRUID_CAT_FORM:     sshift = GetSpell(CAT_FORM_1);         break;\n+                    case DRUID_MOONKIN_FORM: sshift = GetSpell(MOONKIN_FORM_1);     break;\n+                    case DRUID_TREE_FORM:    sshift = GetSpell(TREE_OF_LIFE_FORM_1);break;\n+                    case DRUID_TRAVEL_FORM:  sshift = GetSpell(TRAVEL_FORM_1);      break;\n+                    case DRUID_AQUATIC_FORM: sshift = GetSpell(AQUATIC_FORM_1);     break;\n+                    case DRUID_FLIGHT_FORM:  sshift = GetSpell(FLIGHT_FORM_1);      break;\n+                    case BOT_STANCE_NONE:    sshift = GetSpell(TRAVEL_FORM_1);      break;\n+                    default:                 sshift = 0;                            break;\n+                }\n+                if (sshift && doCast(me, sshift))\n+                {\n+                    GetInPosition(false, nullptr);\n+                    return;\n+                }\n+            }\n+            if (IsSpellReady(BERSERK_1, diff) && Rand() < 10 && me->HasAuraWithMechanic(1u<<MECHANIC_FEAR))\n+            {\n+                if (doCast(me, GetSpell(BERSERK_1)))\n+                    return;\n+            }\n+            bot_ai::BreakCC(diff);\n+        }\n+\n+        bool HealTarget(Unit* target, uint32 diff) override\n+        {\n+            if (!target || !target->IsAlive() || target->GetShapeshiftForm() == FORM_SPIRITOFREDEMPTION || me->GetDistance(target) > 40)\n+                return false;\n+            uint8 hp = GetHealthPCT(target);\n+            if (hp > GetHealHpPctThreshold())\n+                return false;\n+            bool pointed = IsPointedHealTarget(target);\n+            if (hp > 95 && !(pointed && me->GetMap()->IsRaid()) &&\n+                (!target->IsInCombat() || target->getAttackers().empty() || !IsTank(target) || !me->GetMap()->IsRaid()))\n+                return false;\n+\n+            int32 hps = GetHPS(target);\n+            int32 xphp = target->GetHealth() + hps * 2;\n+            int32 hppctps = int32(hps * 100.f / float(target->GetMaxHealth()));\n+            int32 xphploss = xphp > int32(target->GetMaxHealth()) ? 0 : abs(int32(xphp - target->GetMaxHealth()));\n+            int32 xppct = hp + hppctps * 2;\n+            if (xppct >= 95 && hp >= 25 && !pointed)\n+                return false;\n+\n+            if (IsTank() && xppct > 25)\n+                return false;\n+            if (hp > 50 && !IsTank(target) && (_form == DRUID_BEAR_FORM || _form == DRUID_CAT_FORM))\n+                return false; //do not waste heal if in feral or so\n+\n+            if (IsSpellReady(NATURES_SWIFTNESS_1, diff, false) && Rand() < 80 &&\n+                (me->IsInCombat() || target->IsInCombat()) &&//may just revive\n+                hp <= 20 && xppct <= 0 && xphploss > _heals[HEALING_TOUCH_1] / 2 &&\n+                (target->IsPlayer() || IsTank(target) || target->IsInCombat() || !target->getAttackers().empty()))\n+            {\n+                me->InterruptNonMeleeSpells(false);\n+                if (doCast(me, GetSpell(NATURES_SWIFTNESS_1)))\n+                {\n+                    if (doCast(target, GetSpell(HEALING_TOUCH_1)))\n+                        return true;\n+                }\n+            }\n+            if (IsSpellReady(NOURISH_1, diff) && xppct <= 65 && xphploss > _heals[REJUVENATION_1])\n+            {\n+                const uint8 minHots = 2;\n+                uint8 hots = 0;\n+                for (AuraEffect const* eff : target->GetAuraEffectsByType(SPELL_AURA_PERIODIC_HEAL))\n+                {\n+                    if (eff->GetCasterGUID() != me->GetGUID())\n+                        continue;\n+                    SpellInfo const* spellInfo = eff->GetSpellInfo();\n+                    if (spellInfo->SpellFamilyName != SPELLFAMILY_DRUID)\n+                        continue;\n+                    //rejuv,regro,lifeb,wildg\n+                    if (!((spellInfo->SpellFamilyFlags[0] & 0x50) || (spellInfo->SpellFamilyFlags[1] & 0x4000010)))\n+                        continue;\n+                    hots += eff->GetBase()->GetStackAmount();\n+                    if (hots >= minHots)\n+                        break;\n+                }\n+                if (hots >= minHots && doCast(target, GetSpell(NOURISH_1)))\n+                    return true;\n+            }\n+            if (IsSpellReady(SWIFTMEND_1, diff, false) && !HasRole(BOT_ROLE_DPS|BOT_ROLE_TANK) && hp < 60 &&\n+                (xppct <= 15 || int32(GetLostHP(target)) > _heals[REJUVENATION_1]) &&\n+                //rejuv,regro\n+                target->GetAuraEffect(SPELL_AURA_PERIODIC_HEAL, SPELLFAMILY_DRUID, 0x50, 0x0, 0x0, me->GetGUID())\n+                /*(HasAuraName(target, REGROWTH_1) || HasAuraName(target, REJUVENATION_1))*/)\n+            {\n+                if (doCast(target, GetSpell(SWIFTMEND_1)))\n+                    return true;\n+            }\n+            //maintain HoTs\n+            Unit const* u = target->GetVictim();\n+            bool tanking = u && IsTank(target) && u->ToCreature() && u->ToCreature()->isWorldBoss();\n+            if (IsSpellReady(REGROWTH_1, diff) && Rand() < 80 && (tanking || xphploss > _heals[REGROWTH_1]) &&\n+                (xppct <= 45 || !target->GetAuraEffect(SPELL_AURA_PERIODIC_HEAL, SPELLFAMILY_DRUID, 0x40, 0x0, 0x0, me->GetGUID()))\n+                /*!HasAuraName(target, REGROWTH_1, me->GetGUID())*/)\n+            {\n+                if (doCast(target, GetSpell(REGROWTH_1)))\n+                    return true;\n+            }\n+            if (IsSpellReady(LIFEBLOOM_1, diff) && xppct >= 40 && hp < 75 + 10 * tanking)\n+            {\n+                AuraEffect const* bloom = target->GetAuraEffect(SPELL_AURA_PERIODIC_HEAL, SPELLFAMILY_DRUID, 0x0, 0x10, 0x0, me->GetGUID());\n+                //Aura const* bloom = target->GetAura(GetSpell(LIFEBLOOM_1), me->GetGUID());\n+                if ((!bloom || bloom->GetBase()->GetStackAmount() < 3 ||\n+                    (bloom->GetBase()->GetDuration() < 2000 && !target->getAttackers().empty())) &&\n+                    doCast(target, GetSpell(LIFEBLOOM_1)))\n+                    return true;\n+            }\n+            if (IsSpellReady(HEALING_TOUCH_1, diff) && (xppct > 15 || !GetSpell(REGROWTH_1)) &&\n+                xphploss > _heals[HEALING_TOUCH_1] &&\n+                doCast(target, GetSpell(HEALING_TOUCH_1)))\n+                return true;\n+            if (IsSpellReady(REJUVENATION_1, diff) && xppct > 45 &&\n+                (tanking || xphploss > _heals[REJUVENATION_1]) &&\n+                !target->GetAuraEffect(SPELL_AURA_PERIODIC_HEAL, SPELLFAMILY_DRUID, 0x10, 0x0, 0x0, me->GetGUID())\n+                /*!HasAuraName(target, REJUVENATION_1, me->GetGUID())*/)\n+            {\n+                if (doCast(target, GetSpell(REJUVENATION_1)))\n+                    return true;\n+            }\n+            return false;\n+        }\n+\n+        bool BuffTarget(Unit* target, uint32 /*diff*/) override\n+        {\n+            if (me->IsInCombat() && !master->GetMap()->IsRaid()) return false;\n+\n+            if (uint32 MARK_OF_THE_WILD = GetSpell(MARK_OF_THE_WILD_1))\n+            {\n+                if (!target->HasAuraTypeWithFamilyFlags(SPELL_AURA_MOD_RESISTANCE, SPELLFAMILY_DRUID, 0x40000)\n+                    /*!HasAuraName(target, MARK_OF_THE_WILD_1)*/)\n+                    if (doCast(target, MARK_OF_THE_WILD))\n+                        return true;\n+            }\n+            if (uint32 THORNS = GetSpell(THORNS_1))\n+            {\n+                if (IsTank(target) &&\n+                    !target->HasAuraTypeWithFamilyFlags(SPELL_AURA_DAMAGE_SHIELD, SPELLFAMILY_DRUID, 0x100)\n+                    /*!HasAuraName(target, THORNS_1)*/)\n+                    if (doCast(target, THORNS))\n+                        return true;\n+            }\n+\n+            return false;\n+        }\n+\n+        void CheckTravel(uint32 diff)\n+        {\n+            if ((!IAmFree() && !HasBotCommandState(BOT_COMMAND_FOLLOW)) || Rand() > 35 || me->IsMounted() || IsCasting() ||\n+                me->HasUnitMovementFlag(MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_FLYING))\n+                return;\n+\n+            bool can_use_travel_form = IsSpellReady(TRAVEL_FORM_1, diff) && me->GetShapeshiftForm() == FORM_NONE && IsOutdoors();\n+\n+            if (IAmFree())\n+            {\n+                InstanceTemplate const* instt = sObjectMgr->GetInstanceTemplate(me->GetMap()->GetId());\n+                bool map_allows_mount = (!me->GetMap()->IsDungeon() || me->GetMap()->IsBattlegroundOrArena()) && (!instt || instt->AllowMount);\n+                if (me->HasUnitMovementFlag(MOVEMENTFLAG_FORWARD) &&\n+                    (!me->GetVictim() ?\n+                        (me->IsInCombat() || !map_allows_mount || IsFlagCarrier(me)) :\n+                        !me->IsWithinDist(me->GetVictim(), 8.0f + (IsMelee() ? 0.0f : GetSpellAttackRange(true)))))\n+                {\n+                    if (me->GetShapeshiftForm() == FORM_CAT && IsSpellReady(DASH_1, diff, false))\n+                    {\n+                        if (doCast(me, GetSpell(DASH_1)))\n+                            return;\n+                    }\n+                    else if (can_use_travel_form)\n+                    {\n+                        if (doCast(me, GetSpell(TRAVEL_FORM_1)))\n+                            return;\n+                    }\n+                }\n+\n+                return;\n+            }\n+\n+            if (me->GetExactDist2d(master) > std::max<uint8>(master->GetBotMgr()->GetBotFollowDist(), 30))\n+            {\n+                if (me->GetShapeshiftForm() == FORM_CAT && IsSpellReady(DASH_1, diff, false))\n+                {\n+                    if (doCast(me, GetSpell(DASH_1)))\n+                        return;\n+                }\n+                else if (can_use_travel_form)\n+                {\n+                    if (doCast(me, GetSpell(TRAVEL_FORM_1)))\n+                        return;\n+                }\n+            }\n+        }\n+\n+        void DoNonCombatActions(uint32 diff)\n+        {\n+            if (GC_Timer > diff || me->IsMounted() || IsCasting())\n+                return;\n+\n+            ResurrectGroup(GetSpell(REVIVE_1));\n+\n+            if (!IAmFree() && HasBotCommandState(BOT_COMMAND_FOLLOW) && !master->IsMounted() && Rand() < 35)\n+            {\n+                int32 dist = int32(me->GetDistance(master));\n+                if (me->HasUnitMovementFlag(MOVEMENTFLAG_SWIMMING))\n+                {\n+                    if (_form != DRUID_AQUATIC_FORM && dist > 30 && GetSpell(AQUATIC_FORM_1) &&\n+                        doCast(me, GetSpell(AQUATIC_FORM_1)))\n+                        return;\n+                }\n+                //if (me->HasUnitMovementFlag(MOVEMENTFLAG_FLYING))\n+                //{\n+                //    if (_form != DRUID_AQUATIC_FORM && dist > 30 && GetSpell(AQUATIC_FORM_1) &&\n+                //        doCast(me, GetSpell(AQUATIC_FORM_1)))\n+                //        return;\n+                //}\n+                else if (_form != DRUID_TRAVEL_FORM && dist > 30 && GetSpell(TRAVEL_FORM_1))\n+                {\n+                    if (doCast(me, GetSpell(TRAVEL_FORM_1)))\n+                        return;\n+                }\n+                else if (_form == DRUID_AQUATIC_FORM)\n+                    removeShapeshiftForm();\n+            }\n+        }\n+\n+        void doInnervate(uint32 diff)\n+        {\n+            if (!IsSpellReady(INNERVATE_1, diff) || Rand() > 25)\n+                return;\n+            if (_form != BOT_STANCE_NONE && _form != DRUID_MOONKIN_FORM && _form != DRUID_TREE_FORM && (IsTank() || me->getAttackers().size() > 3))\n+                return;\n+\n+            Unit* iTarget = nullptr;\n+\n+            if (_isValidInnervateTarget(master))\n+                iTarget = master;\n+            else if (_isValidInnervateTarget(me))\n+                iTarget = me;\n+\n+            if (!IAmFree())\n+            {\n+                Group const* group = master->GetGroup();\n+                if (!iTarget && !group) //first check master's bots\n+                {\n+                    for (auto const& [_, bot] : *master->GetBotMgr()->GetBotMap())\n+                    {\n+                        if (bot && !bot->IsTempBot() && _isValidInnervateTarget(bot))\n+                        {\n+                            iTarget = bot;\n+                            break;\n+                        }\n+                    }\n+                }\n+                if (!iTarget && group) //cycle through player members...\n+                {\n+                    std::vector<Unit*> members = BotMgr::GetAllGroupMembers(group);\n+                    for (auto i : NPCBots::index_array<uint8, 2>)\n+                    {\n+                        if (iTarget)\n+                            break;\n+                        for (Unit* member : members)\n+                        {\n+                            if (!(i == 0 ? member->IsPlayer() : member->IsNPCBot()) || !_isValidInnervateTarget(member))\n+                                continue;\n+                            if (i == 1 && member->ToCreature()->IsTempBot())\n+                                continue;\n+                            iTarget = member;\n+                            break;\n+                        }\n+                    }\n+                }\n+            }\n+\n+            if (iTarget && doCast(iTarget, INNERVATE_1))\n+            {\n+                if (iTarget->IsPlayer())\n+                    ReportSpellCast(INNERVATE_1, LocalizedNpcText(iTarget->ToPlayer(), BOT_TEXT__ON_YOU), iTarget->ToPlayer());\n+\n+                if (!IAmFree() && iTarget != master)\n+                {\n+                    std::string msg = iTarget == me ? LocalizedNpcText(master, BOT_TEXT__ON_MYSELF) : (LocalizedNpcText(master, BOT_TEXT__ON_) + iTarget->GetName() + '!');\n+                    ReportSpellCast(INNERVATE_1, msg, master);\n+                }\n+\n+                return;\n+            }\n+\n+            SetSpellCooldown(INNERVATE_1, 1500); //fail\n+        }\n+\n+        void CheckRoots()\n+        {\n+            if (uint32 ENTANGLING_ROOTS = GetSpell(ENTANGLING_ROOTS_1))\n+            {\n+                if (FindAffectedTarget(ENTANGLING_ROOTS, me->GetGUID(), 60))\n+                    return;\n+                if (Unit* target = FindRootTarget(30, ENTANGLING_ROOTS))\n+                    if (doCast(target, ENTANGLING_ROOTS))\n+                        return;\n+            }\n+        }\n+\n+        void CheckBattleRez(uint32 diff)\n+        {\n+            if (!IsSpellReady(REBIRTH_1, diff, false) || IAmFree() || me->IsMounted() ||\n+                IsTank() || IsCasting() || Rand() > 20) return;\n+\n+            Group const* gr = master->GetGroup();\n+            std::list<Unit*> targets;\n+            if (!gr)\n+            {\n+                Unit* target = master;\n+                if (master->IsAlive()) return;\n+                if (master->isResurrectRequested() || master->GetUInt32Value(PLAYER_SELF_RES_SPELL)) return; //resurrected\n+                if (master->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_GHOST))\n+                    target = (Unit*)master->GetCorpse();\n+                if (!target || !target->IsInWorld())\n+                    return;\n+                if (me->GetExactDist(target) > 30 && !HasBotCommandState(BOT_COMMAND_STAY))\n+                {\n+                    me->GetMotionMaster()->MovePoint(master->GetMapId(), *target);\n+                    SetSpellCooldown(REBIRTH_1, 1500);\n+                    return;\n+                }\n+                else if (!target->IsWithinLOSInMap(me, VMAP::ModelIgnoreFlags::M2, LINEOFSIGHT_ALL_CHECKS))\n+                    me->Relocate(*target);\n+\n+                if (doCast(target, GetSpell(REBIRTH_1))) //rezzing\n+                {\n+                    BotWhisper(LocalizedNpcText(master, BOT_TEXT_REZZING_YOU));\n+                    return;\n+                }\n+            }\n+            else\n+            {\n+                for (GroupReference const* itr = gr->GetFirstMember(); itr != nullptr; itr = itr->next())\n+                {\n+                    Player* tPlayer = itr->GetSource();\n+                    Unit* target = tPlayer;\n+                    if (!tPlayer || tPlayer->IsAlive()) continue;\n+                    if (tPlayer->isResurrectRequested() || tPlayer->GetUInt32Value(PLAYER_SELF_RES_SPELL)) continue; //resurrected\n+                    if (tPlayer->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_GHOST))\n+                        target = (Unit*)tPlayer->GetCorpse();\n+                    if (!target || !target->IsInWorld()) continue;\n+                    if (master->GetMap() != target->FindMap()) continue;\n+                    if (me->GetDistance(target) > 100) continue;\n+                    targets.push_back(target);\n+                }\n+            }\n+\n+            for (auto const& [_, bot] : *master->GetBotMgr()->GetBotMap())\n+            {\n+                if (bot && bot->IsInWorld() && !bot->IsAlive() && !bot->GetBotAI()->GetSelfRezSpell() && IsTank(bot) && me->GetDistance(bot) < 80)\n+                    targets.push_back(bot);\n+            }\n+\n+            if (Unit* targetOrCorpse = !targets.empty() ? Bcore::Containers::SelectRandomContainerElement(targets) : nullptr)\n+            {\n+                if (me->GetExactDist(targetOrCorpse) > 30 && !HasBotCommandState(BOT_COMMAND_STAY))\n+                {\n+                    me->GetMotionMaster()->MovePoint(targetOrCorpse->GetMapId(), *targetOrCorpse);\n+                    return;\n+                }\n+                else if (!targetOrCorpse->IsWithinLOSInMap(me, VMAP::ModelIgnoreFlags::M2, LINEOFSIGHT_ALL_CHECKS))\n+                    me->Relocate(*targetOrCorpse);\n+\n+                if (doCast(targetOrCorpse, GetSpell(REBIRTH_1))) //rezzing\n+                {\n+                    if (targetOrCorpse->IsPlayer())\n+                        BotWhisper(LocalizedNpcText(targetOrCorpse->ToPlayer(), BOT_TEXT_REZZING_YOU), targetOrCorpse->ToPlayer());\n+                    if (targetOrCorpse != master)\n+                    {\n+                        std::string rezstr = LocalizedNpcText(master, BOT_TEXT_REZZING_) + targetOrCorpse->GetName();\n+                        if (targetOrCorpse->IsCreature())\n+                            rezstr += \" (\" + LocalizedNpcText(master, BOT_TEXT_BOT_TANK) + ')';\n+                        BotWhisper(rezstr);\n+                    }\n+                    return;\n+                }\n+            }\n+        }\n+\n+        void setStats(BotStances form)\n+        {\n+            _form = form;\n+            switch (form)\n+            {\n+                case DRUID_BEAR_FORM:\n+                    if (me->GetPowerType() != POWER_RAGE)\n+                    {\n+                        //BOT_LOG_ERROR(\"entities.player\", \"druid_bot::setStats(): has to set powerType to POWER_RAGE\");\n+                        me->SetPowerType(POWER_RAGE);\n+                    }\n+                    RefreshAura(MASTER_SHAPESHIFTER_BEAR_BUFF, me->GetLevel() >= 20);\n+                    if (GetSpec() == BOT_SPEC_DRUID_FERAL)\n+                    {\n+                        RefreshAura(NATURAL_REACTION, me->GetLevel() >= 35);\n+                        RefreshAura(SURVIVAL_OF_THE_FITTEST_BUFF, me->GetLevel() >= 35);\n+                        RefreshAura(SAVAGE_DEFENSE_PASSIVE, me->GetLevel() >= 40);\n+                    }\n+                    break;\n+                case DRUID_CAT_FORM:\n+                    if (me->GetPowerType() != POWER_ENERGY)\n+                    {\n+                        //BOT_LOG_ERROR(\"entities.player\", \"druid_bot::setStats(): has to set powerType to POWER_ENERGY\");\n+                        me->SetPowerType(POWER_ENERGY);\n+                    }\n+                    RefreshAura(MASTER_SHAPESHIFTER_CAT_BUFF, me->GetLevel() >= 20);\n+                    RefreshAura(FERAL_SWIFTNESS, me->GetLevel() >= 20); //talents ignore forms for creatures so put that here\n+                    if (GetSpec() == BOT_SPEC_DRUID_FERAL)\n+                    {\n+                        RefreshAura(NURTURING_INSTINCT_BUFF, me->GetLevel() >= 30);\n+                        RefreshAura(PREDATORY_INSTINCTS, me->GetLevel() >= 45);\n+                    }\n+                    break;\n+                case DRUID_MOONKIN_FORM:\n+                    if (me->GetPowerType() != POWER_MANA)\n+                    {\n+                        //BOT_LOG_ERROR(\"entities.player\", \"druid_bot::setStats(): has to set powerType to POWER_MANA (moonkin)\");\n+                        me->SetPowerType(POWER_MANA);\n+                    }\n+                    RefreshAura(MASTER_SHAPESHIFTER_MOONKIN_BUFF, me->GetLevel() >= 20);\n+                    RefreshAura(OWLKIN_FRENZY, me->GetLevel() >= 45);\n+                    break;\n+                case DRUID_TREE_FORM:\n+                    if (me->GetPowerType() != POWER_MANA)\n+                    {\n+                        //BOT_LOG_ERROR(\"entities.player\", \"druid_bot::setStats(): has to set powerType to POWER_MANA (tree)\");\n+                        me->SetPowerType(POWER_MANA);\n+                    }\n+                    RefreshAura(MASTER_SHAPESHIFTER_TREE_BUFF, me->GetLevel() >= 20);\n+                    break;\n+                case DRUID_TRAVEL_FORM:\n+                    if (me->GetPowerType() != POWER_MANA)\n+                    {\n+                        //BOT_LOG_ERROR(\"entities.player\", \"druid_bot::setStats(): has to set powerType to POWER_MANA (travel)\");\n+                        me->SetPowerType(POWER_MANA);\n+                    }\n+                    break;\n+                case DRUID_AQUATIC_FORM:\n+                    if (me->GetPowerType() != POWER_MANA)\n+                    {\n+                        //BOT_LOG_ERROR(\"entities.player\", \"druid_bot::setStats(): has to set powerType to POWER_MANA (aquatic)\");\n+                        me->SetPowerType(POWER_MANA);\n+                    }\n+                    break;\n+                case DRUID_FLIGHT_FORM:\n+                    if (me->GetPowerType() != POWER_MANA)\n+                    {\n+                        //BOT_LOG_ERROR(\"entities.player\", \"druid_bot::setStats(): has to set powerType to POWER_MANA (flight)\");\n+                        me->SetPowerType(POWER_MANA);\n+                    }\n+                    break;\n+                case BOT_STANCE_NONE:\n+                    if (me->GetPowerType() != POWER_MANA)\n+                    {\n+                        //BOT_LOG_ERROR(\"entities.player\", \"druid_bot::setStats(): has to set powerType to POWER_MANA (deshape)\");\n+                        me->SetPowerType(POWER_MANA);\n+                    }\n+                    break;\n+                default:\n+                    BOT_LOG_ERROR(\"entities.player\", \"druid_bot::setStats(): NYI form {}\", uint32(form));\n+                    setStats(BOT_STANCE_NONE);\n+                    return;\n+            }\n+\n+            SetShouldUpdateStats();\n+            SetStats(false);\n+        }\n+\n+        void ApplyClassDamageMultiplierMelee(uint32& /*damage*/, CalcDamageInfo& damageinfo) const override\n+        {\n+            uint8 lvl = me->GetLevel();\n+            float pctbonus = 0.0f;\n+\n+            if (damageinfo.hitOutCome == MELEE_HIT_CRIT)\n+            {\n+                //!!!Melee spell damage is not yet critical, all reduced by half\n+                //Primal Fury (white attacks): 100% to gain 5 rage at crit in (Dire) Bear Form\n+                if ((GetSpec() == BOT_SPEC_DRUID_FERAL) && lvl >= 25 && _form == DRUID_BEAR_FORM)\n+                    me->CastSpell(me, PRIMAL_FURY_EFFECT_ENERGIZE, true);\n+                //Predatory Instincts (part 1): 10% additional crit damage bonus for melee attacks in Cat form\n+                if ((GetSpec() == BOT_SPEC_DRUID_FERAL) && lvl >= 45 && _form == DRUID_CAT_FORM)\n+                    pctbonus += 0.05f;\n+            }\n+\n+            damageinfo.damages[0].damage = uint32(damageinfo.damages[0].damage * (1.0f + pctbonus));\n+        }\n+\n+        void ApplyClassDamageMultiplierMeleeSpell(int32& damage, SpellNonMeleeDamage& damageinfo, SpellInfo const* spellInfo, WeaponAttackType /*attackType*/, bool iscrit) const override\n+        {\n+            //uint32 spellId = spellInfo->Id;\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+            float fdamage = float(damage);\n+\n+            //apply bonus damage mods\n+            float pctbonus = 0.0f;\n+            if (iscrit)\n+            {\n+                //!!!Melee spell damage is not yet critical, all reduced by half\n+                ////Elemental Fury (part 2): 50% additional crit damage bonus for Nature, Fire and Frost (all) spells\n+                //if (lvl >= 21)\n+                //    pctbonus += 0.25f;\n+            }\n+\n+            //Feral Aggression: 15% bonus damage for Ferocious Bite\n+            if (lvl >= 10 && baseId == FEROCIOUS_BITE_1)\n+                pctbonus += 0.15f;\n+            //Feral Instinct: 30% bonus damage for Swipe (Bear)\n+            if (lvl >= 15 && baseId == SWIPE_BEAR_1)\n+                pctbonus += 0.3f;\n+            //Savage Fury: 20% bonus damage for Claw, Rake, Mangle (Cat), Mangle (Bear) and Maul\n+            if (lvl >= 15 &&\n+                (baseId == CLAW_1 ||\n+                baseId == RAKE_1 ||\n+                baseId == MANGLE_CAT_1 ||\n+                baseId == MANGLE_BEAR_1 ||\n+                baseId == MAUL_1))\n+                pctbonus += 0.2f;\n+            //Rend and Tear: 20% bonus damage on bleeding targets for Maul and Shred\n+            if ((GetSpec() == BOT_SPEC_DRUID_FERAL) &&\n+                lvl >= 55 && damageinfo.target && damageinfo.target->HasAuraState(AURA_STATE_BLEEDING) &&\n+                (baseId == MAUL_1 || baseId == SHRED_1))\n+                pctbonus += 0.2f;\n+            //Glyph of Mangle: 10% bonus damage for Mangle (all)\n+            if (lvl >= 50 && (baseId == MANGLE_BEAR_1 || baseId == MANGLE_CAT_1))\n+                pctbonus += 0.1f;\n+\n+            //Primal Fury (yellow attacks): 100% to gain 5 rage at crit in (Dire) Bear Form\n+            //Primal Fury (yellow attacks): 100% to gain 1 combo point at crit in Cat Form\n+            if (_form == DRUID_BEAR_FORM && iscrit && lvl >= 25)\n+                me->CastSpell(me, PRIMAL_FURY_EFFECT_ENERGIZE, true);\n+            if (_form == DRUID_CAT_FORM &&\n+                (baseId == CLAW_1 || baseId == MANGLE_CAT_1 || baseId == POUNCE_1 ||\n+                baseId == RAKE_1 || baseId == RAVAGE_1 || baseId == SHRED_1))\n+                primalFuryProc = iscrit && lvl >= 25;\n+\n+            damage = int32(fdamage * (1.0f + pctbonus));\n+        }\n+\n+        void ApplyClassSpellCritMultiplierAll(Unit const* victim, float& crit_chance, SpellInfo const* spellInfo, SpellSchoolMask /*schoolMask*/, WeaponAttackType /*attackType*/) const override\n+        {\n+            //uint32 spellId = spellInfo->Id;\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+\n+            //Nature's bounty: 25% additional critical chance for Regrowth and Nourish\n+            if ((GetSpec() == BOT_SPEC_DRUID_RESTORATION) && lvl >= 35 && (baseId == REGROWTH_1 || baseId == NOURISH_1))\n+                crit_chance += 25.f;\n+            //Rend and Tear (part 2): 25% additional critical chance on bleeding targets for Ferocious Bite (handled in Unit.cpp)\n+            //if (lvl >= 55 && victim->HasAuraState(AURA_STATE_BLEEDING) && baseId == FEROCIOUS_BITE_1)\n+            //    crit_chance += 25.f;\n+            //Improved Moonfire\n+            if (lvl >= 15 && baseId == MOONFIRE_1)\n+                crit_chance += 10.f;\n+            //Nature's Majesty: 4% additional critical chance for Wrath, Starfire, Starfall, Nourish and Healing Touch\n+            if (lvl >= 15 && ((spellInfo->SpellFamilyFlags[0] & 0x25) || (spellInfo->SpellFamilyFlags[1] & 0x2800000)))\n+                crit_chance += 4.f;\n+            //Eclipse (Lunar): 40% additional critical chance for Starfire\n+            if (lvl >= 50 && baseId == STARFIRE_1 && me->HasAura(ECLIPSE_LUNAR_BUFF))\n+                crit_chance += 40.f;\n+            //Improved Faerie Fire (part 2): 3% additional critical chance for all spells on target affected by Faerie Fire\n+            if (GetSpec() == BOT_SPEC_DRUID_BALANCE && lvl >= 40 && victim && victim->HasAuraState(AURA_STATE_FAERIE_FIRE))\n+                crit_chance += 3.f;\n+            //Natural Perfection: 3% additional critical chance for all spells\n+            if (GetSpec() == BOT_SPEC_DRUID_RESTORATION && lvl >= 40)\n+                crit_chance += 3.f;\n+        }\n+\n+        void ApplyClassDamageMultiplierSpell(int32& damage, SpellNonMeleeDamage& /*damageinfo*/, SpellInfo const* spellInfo, WeaponAttackType /*attackType*/, bool iscrit) const override\n+        {\n+            //uint32 spellId = spellInfo->Id;\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+            float fdamage = float(damage);\n+\n+            //apply bonus damage mods\n+            float pctbonus = 0.0f;\n+            if (iscrit)\n+            {\n+                //!!!spell damage is not yet critical and will be multiplied by 1.5\n+                //so we should put here bonus damage mult /1.5\n+                //Vengeance: 100% additional crit damage bonus for Starfire, Starfall, Moonfire and Wrath\n+                if (lvl >= 25 && ((spellInfo->SpellFamilyFlags[0] & 0x7) || (spellInfo->SpellFamilyFlags[1] & 0x800000)))\n+                    pctbonus += 0.333f;\n+            }\n+            //Genesis: 5% bonus damage for Dots\n+            if (lvl >= 10 && ((spellInfo->SpellFamilyFlags[0] & 0x6002D2) || (spellInfo->SpellFamilyFlags[1] & 0x4000010)))\n+                pctbonus += 0.05f;\n+            //Improved Insect Swarm: SpellEffects.cpp, Unit.cpp\n+            //Brambles: 75% bonus damage for Throns and Entangling Roots (Thorns are handled in Unit.cpp)\n+            if (lvl >= 20 && (spellInfo->SpellFamilyFlags[0] & 0x200))\n+                pctbonus += 0.75f;\n+            //Moonfury: 10% bonus damage for Starfire, Moonfire and Wrath\n+            if (lvl >= 35 && (spellInfo->SpellFamilyFlags[0] & 0x7))\n+                pctbonus += 0.1f;\n+            //Glyph of Focus (part 1): 10% bonus damage for Starfall\n+            if (lvl >= 70 && (spellInfo->SpellFamilyFlags[1] & 0x800000))\n+                pctbonus += 0.1f;\n+            //Wrath of Cenarius: 20%/10% Increased spellpower bonus for Starfire/Wrath\n+            if ((GetSpec() == BOT_SPEC_DRUID_BALANCE) && lvl >= 45)\n+            {\n+                if (baseId == STARFIRE_1)\n+                    fdamage += me->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_MAGIC) * 0.2f * me->CalculateDefaultCoefficient(spellInfo, SPELL_DIRECT_DAMAGE) * me->CalculateLevelPenalty(spellInfo);\n+                if (baseId == WRATH_1)\n+                    fdamage += me->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_MAGIC) * 0.1f * me->CalculateDefaultCoefficient(spellInfo, SPELL_DIRECT_DAMAGE) * me->CalculateLevelPenalty(spellInfo);\n+            }\n+            //Eclipse (Solar): 40% bonus damage for Wrath\n+            if (lvl >= 50 && baseId == WRATH_1 && me->HasAura(ECLIPSE_SOLAR_BUFF))\n+                pctbonus += 0.4f;\n+            //Gale Winds: 30% bonus damage for Hurricane and Typhoon\n+            if ((GetSpec() == BOT_SPEC_DRUID_BALANCE) &&\n+                lvl >= 50 && ((spellInfo->SpellFamilyFlags[0] & 0x400000) || (spellInfo->SpellFamilyFlags[1] & 0x1000000)))\n+                pctbonus += 0.3f;\n+\n+            damage = int32(fdamage * (1.0f + pctbonus));\n+        }\n+\n+        void ApplyClassDamageMultiplierHeal(Unit const* /*victim*/, float& heal, SpellInfo const* spellInfo, DamageEffectType damagetype, uint32 stack) const override\n+        {\n+            //uint32 spellId = spellInfo->Id;\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+            float pctbonus = 0.0f;\n+            float flat_mod = 0.0f;\n+\n+            //Genesis: 5% bonus healing for Hots\n+            if (lvl >= 10 && ((spellInfo->SpellFamilyFlags[0] & 0x6002D2) || (spellInfo->SpellFamilyFlags[1] & 0x4000010)))\n+                pctbonus += 0.05f;\n+            //Improved Rejuvenation: 15% bonus healing for Rejuvenation\n+            if (lvl >= 25 && baseId == REJUVENATION_1)\n+                pctbonus += 0.15f;\n+            //Improved Rejuvenation (17114,17115): 27% bonus healing for Rejuvenation\n+            //if (baseId == REJUVENATION_1)\n+            //    pctbonus += 0.27f;\n+            //Gift of Nature: 10% bonus healing for all spells\n+            if ((GetSpec() == BOT_SPEC_DRUID_RESTORATION) && lvl >= 30)\n+                pctbonus += 0.1f;\n+            //Empowered Touch: 40% bonus (from spellpower) for Healing Touch and 20% bonus (from spellpower) for Nourish\n+            if ((GetSpec() == BOT_SPEC_DRUID_RESTORATION) && lvl >= 35)\n+            {\n+                if (baseId == HEALING_TOUCH_1)\n+                    flat_mod += me->SpellBaseHealingBonusDone(SPELL_SCHOOL_MASK_MAGIC) * 0.4f * me->CalculateDefaultCoefficient(spellInfo, damagetype) * 1.88f * me->CalculateLevelPenalty(spellInfo) * stack;\n+                else if (baseId == NOURISH_1)\n+                    flat_mod += me->SpellBaseHealingBonusDone(SPELL_SCHOOL_MASK_MAGIC) * 0.2f * me->CalculateDefaultCoefficient(spellInfo, damagetype) * 1.88f * me->CalculateLevelPenalty(spellInfo) * stack;\n+            }\n+            //Empowered Rejuvenation: 20% bonus healing for healing over time effects\n+            if ((GetSpec() == BOT_SPEC_DRUID_RESTORATION) &&\n+                lvl >= 45 && ((spellInfo->SpellFamilyFlags[0] & 0xD0) || (spellInfo->SpellFamilyFlags[1] & 0x4000010)))\n+                flat_mod += me->SpellBaseHealingBonusDone(SPELL_SCHOOL_MASK_MAGIC) * 0.2f * me->CalculateDefaultCoefficient(spellInfo, damagetype) * 1.88f * me->CalculateLevelPenalty(spellInfo) * stack;\n+\n+            heal = heal * (1.0f + pctbonus) + flat_mod;\n+        }\n+\n+        void ApplyClassSpellCostMods(SpellInfo const* spellInfo, int32& cost) const override\n+        {\n+            //uint32 spellId = spellInfo->Id;\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            float fcost = float(cost);\n+            int32 flatbonus = 0;\n+            float pctbonus = 0.0f;\n+\n+            //100% mods\n+            //Clearcasting: -100% mana/rage/energy cost for any spell\n+            if (AuraEffect const* eff = me->GetAuraEffect(SPELL_AURA_ADD_PCT_MODIFIER, SPELLFAMILY_DRUID, 0x0, 0x200000, 0x0))\n+                if (eff->IsAffectedOnSpell(spellInfo))\n+                    pctbonus += 1.0f;\n+\n+            //percent mods\n+            //Tree of Life Passive (5420) (activates when learned):\n+            if ((GetSpec() == BOT_SPEC_DRUID_RESTORATION) &&\n+                lvl >= 50 && ((spellInfo->SpellFamilyFlags[0] & 0x50) || (spellInfo->SpellFamilyFlags[1] & 0x4000010)))\n+                pctbonus += 0.5f;\n+            //Glyph of the Wild:\n+            if (lvl >= 15 && baseId == MARK_OF_THE_WILD_1)\n+                pctbonus += 0.5f;\n+            //Natural Shapeshifter:\n+            if (lvl >= 15 &&\n+                spellInfo->Effects[0].Effect == SPELL_EFFECT_APPLY_AURA &&\n+                spellInfo->Effects[0].ApplyAuraName == SPELL_AURA_MOD_SHAPESHIFT)\n+                pctbonus += 0.3f;\n+            //King of the Jungle part 3:\n+            if (lvl >= 15 && (spellInfo->SpellFamilyFlags[0] & 0xC0000000))\n+                pctbonus += 0.6f;\n+            //Tranquil Spirit:\n+            if (lvl >= 25 &&\n+                (baseId == HEALING_TOUCH_1 || baseId == NOURISH_1 || baseId == TRANQUILITY_1))\n+                pctbonus += 0.1f;\n+            //Moonglow:\n+            if (lvl >= 15 && ((spellInfo->SpellFamilyFlags[0] & 0x77) || (spellInfo->SpellFamilyFlags[1] & 0x2800000)))\n+                pctbonus += 0.09f;\n+            //Berserk part 2:\n+            if ((GetSpec() == BOT_SPEC_DRUID_FERAL) && lvl >= 60 && _form == DRUID_CAT_FORM &&\n+                //((spellInfo->SpellFamilyFlags[0] & 0x839000) ||\n+                //(spellInfo->SpellFamilyFlags[1] & 0x30000480) ||\n+                //(spellInfo->SpellFamilyFlags[2] & 0x40420)) &&\n+                me->GetAuraEffect(SPELL_AURA_MECHANIC_IMMUNITY, SPELLFAMILY_DRUID, 0x0, 0x0, 0x40))\n+                pctbonus += 0.5f;\n+\n+            //flat mods\n+            //Shredding Attacks:\n+            if (lvl >= 25)\n+            {\n+                if (spellInfo->SpellFamilyFlags[0] & 0x8000)\n+                    flatbonus += 18;\n+                else if (spellInfo->SpellFamilyFlags[1] & 0x100)\n+                    flatbonus += 20;\n+            }\n+            //Ferocity:\n+            if (lvl >= 10)\n+            {\n+                if ((spellInfo->SpellFamilyFlags[0] & 0x800) || (spellInfo->SpellFamilyFlags[1] & 0x100040))\n+                    flatbonus += 50;\n+                else if ((spellInfo->SpellFamilyFlags[0] & 0x1000) ||\n+                    (spellInfo->SpellFamilyFlags[1] & 0x400) ||\n+                    (spellInfo->SpellFamilyFlags[2] & 0x40400))\n+                    flatbonus += 5;\n+            }\n+            //Improved Mangle part 2:\n+            if ((GetSpec() == BOT_SPEC_DRUID_FERAL) && lvl >= 50 && (spellInfo->SpellFamilyFlags[1] & 0x400))\n+                flatbonus += 6;\n+\n+            //cost can be < 0\n+            cost = int32(fcost * (1.0f - pctbonus)) - flatbonus;\n+        }\n+\n+        void ApplyClassSpellCastTimeMods(SpellInfo const* spellInfo, int32& casttime) const override\n+        {\n+            //casttime is in milliseconds\n+            //uint32 spellId = spellInfo->Id;\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            int32 timebonus = 0;\n+            float pctbonus = 0.0f;\n+\n+            //100% mods\n+            //Elune's Wrath: -100% cast time for Starfire\n+            AuraEffect const* elun = me->GetAuraEffect(ELUNES_WRATH_BUFF, 0);\n+            //Predator's Swiftness: -100% cast time\n+            AuraEffect const* pred = me->GetAuraEffect(PREDATORS_SWIFTNESS_BUFF, 0);\n+            //Nature's Swiftness: -100% cast time\n+            AuraEffect const* natu = me->GetAuraEffect(NATURES_SWIFTNESS_1, 0);\n+            if ((elun && elun->IsAffectedOnSpell(spellInfo)) ||\n+                (pred && pred->IsAffectedOnSpell(spellInfo)) ||\n+                (natu && natu->IsAffectedOnSpell(spellInfo)))\n+                pctbonus += 1.0f;\n+\n+            //pct mods\n+            //Celestial Focus: 3% haste\n+            if (lvl >= 25)\n+                pctbonus += 0.03f;\n+\n+            //flat mods\n+            //Starlight Wrath: -0.5 sec cast time for Wrath and Starfire\n+            if (lvl >= 10 && (baseId == WRATH_1 || baseId == STARFIRE_1))\n+                timebonus += 500;\n+            //Naturalist: -0.5 sec cast time for Healing Touch\n+            if (lvl >= 15 && baseId == HEALING_TOUCH_1)\n+                timebonus += 500;\n+            //Regrowth bonus (ids:21872,46834): -0.2 x2 sec cast time for Regrowth\n+            if (lvl >= 68 && baseId == REGROWTH_1)\n+                timebonus += 400;\n+\n+            casttime = std::max<int32>(int32((float(casttime) * (1.0f - pctbonus)) - timebonus), 0);\n+        }\n+\n+        void ApplyClassSpellNotLoseCastTimeMods(SpellInfo const* spellInfo, int32& delayReduce) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchoolMask schools = spellInfo->GetSchoolMask();\n+            uint8 lvl = me->GetLevel();\n+            int32 reduceBonus = 0;\n+\n+            if (lvl >= 15 && baseId == WRATH_1)\n+                reduceBonus += 50;\n+\n+            if (GetSpec() == BOT_SPEC_DRUID_BALANCE && lvl >= 25)\n+            {\n+                if (AuraEffect const* ofre = me->GetAuraEffect(SPELL_AURA_PERIODIC_ENERGIZE, SPELLFAMILY_DRUID, 2853, EFFECT_2))\n+                    if (ofre->IsAffectedOnSpell(spellInfo))\n+                        reduceBonus += 100;\n+\n+                switch (baseId)\n+                {\n+                    case STARFIRE_1: case HIBERNATE_1: case HURRICANE_1:\n+                        reduceBonus += 70;\n+                        break;\n+                    default:\n+                        break;\n+                }\n+            }\n+\n+            delayReduce += reduceBonus;\n+        }\n+\n+        void ApplyClassSpellCooldownMods(SpellInfo const* spellInfo, uint32& cooldown) const override\n+        {\n+            //cooldown is in milliseconds\n+            //uint32 spellId = spellInfo->Id;\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            int32 timebonus = 0;\n+            float pctbonus = 0.0f;\n+\n+            //pct mods\n+            //Improved Tranquility: -60% cooldown for Tanquility\n+            if ((GetSpec() == BOT_SPEC_DRUID_RESTORATION) && lvl >= 30 && baseId == TRANQUILITY_1)\n+                pctbonus += 0.6f;\n+\n+            //flat mods\n+            //Glyph of Turn Evil: +8 sec cooldown for Turn Evil (3 sec for bots)\n+            //if (lvl >= 24 && spellId == GetSpell(TURN_EVIL_1))\n+            //    timebonus -= 3000;\n+\n+            cooldown = std::max<int32>(int32((float(cooldown) * (1.0f - pctbonus)) - timebonus), 0);\n+        }\n+\n+        void ApplyClassSpellCategoryCooldownMods(SpellInfo const* spellInfo, uint32& cooldown) const override\n+        {\n+            //cooldown is in milliseconds\n+            //uint32 spellId = spellInfo->Id;\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+            int32 timebonus = 0;\n+            float pctbonus = 0.0f;\n+\n+            //pct mods\n+            //Glyph of Dash: -20% cooldown for Dash\n+            if (lvl >= 16 && baseId == DASH_1)\n+                pctbonus += 0.2f;\n+            //Berserk part 1:\n+            if (lvl >= 60 && _form == DRUID_BEAR_FORM && (spellInfo->SpellFamilyFlags[1] & 0x40) &&\n+                me->GetAuraEffect(SPELL_AURA_MECHANIC_IMMUNITY, SPELLFAMILY_DRUID, 0x0, 0x0, 0x40))\n+                pctbonus += 1.0f;\n+\n+            //flat mods\n+            //Genesis Rebirth Bonus (26106): -5 min cooldown for Rebirth\n+            if (baseId == REBIRTH_1)\n+                timebonus += 300000;\n+            //Improved Mangle part 1: -1.5 sec cooldown for Mangle (Bear)\n+            if (lvl >= 50 && baseId == MANGLE_BEAR_1)\n+                timebonus += 1500;\n+            //Brutal Impact: -30 sec cooldown for Bash\n+            if ((GetSpec() == BOT_SPEC_DRUID_FERAL) && lvl >= 30 && baseId == BASH_1)\n+                timebonus += 30000;\n+            //Glyph of Typhoon: -3 sec cooldown for Typhoon\n+            if (lvl >= 70 && baseId == TYPHOON_1)\n+                timebonus += 3000;\n+            //Starfall: increase cooldown for bots\n+            if (baseId == STARFALL_1)\n+                timebonus -= 90000; //x2\n+\n+            cooldown = std::max<int32>(int32((float(cooldown) * (1.0f - pctbonus)) - timebonus), 0);\n+        }\n+\n+        void ApplyClassSpellGlobalCooldownMods(SpellInfo const* spellInfo, float& cooldown) const override\n+        {\n+            //cooldown is in milliseconds\n+            //uint32 spellId = spellInfo->Id;\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            float timebonus = 0.0f;\n+            float pctbonus = 0.0f;\n+\n+            //pct bonus\n+            //Gift of the Earthmother part 2:\n+            if (lvl >= 55 && baseId == LIFEBLOOM_1)\n+                pctbonus += 0.1f;\n+\n+            //flat bonus\n+            ////Unrelenting Assault (part 1, special): -0.5 sec global cooldown for Overpower and Revenge (not for tanks)\n+            //if (lvl >= 50 && !IsTank() && (spellId == GetSpell(OVERPOWER_1) || spellId == GetSpell(REVENGE_1)))\n+            //    timebonus += 500.f;\n+\n+            cooldown = (cooldown * (1.0f - pctbonus)) - timebonus;\n+        }\n+\n+        void ApplyClassSpellRadiusMods(SpellInfo const* spellInfo, float& radius) const override\n+        {\n+            uint32 spellId = spellInfo->Id;\n+            //uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            //uint8 lvl = me->GetLevel();\n+            float flatbonus = 0.0f;\n+            float pctbonus = 0.0f;\n+\n+            //pct mods\n+\n+            //flat mods\n+            //Starfall\n+            if (spellId == STARFALL_DUMMY_AOE_4)\n+                flatbonus -= 10.f; //20 = 36 talented - 18 glyphed + 2 custom\n+            if (spellId == STARFALL_DAMAGE_AOE_4)\n+                flatbonus += 4.f; //5 nominal + 4 custom\n+\n+            radius = radius * (1.0f + pctbonus) + flatbonus;\n+        }\n+\n+        void ApplyClassSpellRangeMods(SpellInfo const* spellInfo, float& maxrange) const override\n+        {\n+            //uint32 spellId = spellInfo->Id;\n+            //uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            float flatbonus = 0.0f;\n+            float pctbonus = 0.0f;\n+\n+            //pct mods\n+            //Nature's Reach: +20% range for Balance Spells and Faerie Fire (Feral)\n+            if (lvl >= 20 && ((spellInfo->SpellFamilyFlags[0] & 0x600707) || (spellInfo->SpellFamilyFlags[1] & 0x1821220)))\n+                pctbonus += 0.2f;\n+\n+            //flat mods\n+            //Glyph of Curse of Exhaustion: +5 yd range for Curse of Exhaustion\n+            //if (lvl >= 70 && baseId == CURSE_OF_EXHAUSTION_1)\n+            //    flatbonus += 5.f;\n+\n+            maxrange = maxrange * (1.0f + pctbonus) + flatbonus;\n+        }\n+\n+        void ApplyClassSpellMaxTargetsMods(SpellInfo const* spellInfo, uint32& targets) const override\n+        {\n+            uint32 bonusTargets = 0;\n+\n+            //Glyph of Maul: + 1 target\n+            if (spellInfo->SpellFamilyFlags[0] & 0x800)\n+                bonusTargets += 1;\n+            //Glyph of Wild Growth: + 1 target\n+            if (spellInfo->SpellFamilyFlags[1] & 0x4000000)\n+                bonusTargets += 1;\n+            //Berserk: + 2 Mangle (Bear) targets\n+            if ((spellInfo->SpellFamilyFlags[1] & 0x40) &&\n+                me->GetAuraEffect(SPELL_AURA_MECHANIC_IMMUNITY, SPELLFAMILY_DRUID, 0x0, 0x0, 0x40))\n+                bonusTargets += 2;\n+\n+            targets = targets + bonusTargets;\n+        }\n+\n+        void ApplyClassEffectMods(SpellInfo const* spellInfo, uint8 effIndex, float& value) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            float pctbonus = 1.0f;\n+\n+            //Improved Leader of the Pack: chance\n+            if (baseId == LEADER_OF_THE_PACK_BUFF && effIndex == EFFECT_1)\n+                value += 4.f;\n+\n+            value = value * pctbonus;\n+        }\n+\n+        void OnClassSpellGo(SpellInfo const* spellInfo) override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+\n+            //Nature's Swiftness: notify master\n+            if (baseId == NATURES_SWIFTNESS_1)\n+            {\n+                if (!IAmFree())\n+                    ReportSpellCast(NATURES_SWIFTNESS_1, LocalizedNpcText(master, BOT_TEXT__USED), master);\n+            }\n+\n+            //On next attack spells cooldown handle\n+            //if (baseId == MAUL_1)\n+            //    SetSpellCooldown(baseId, me->getAttackTimer(BASE_ATTACK) - 250);\n+\n+            //Handle clearcasting\n+            //Notes: bugged with hurricane (periodic)\n+            if (AuraEffect const* eff = me->GetAuraEffect(SPELL_AURA_ADD_PCT_MODIFIER, SPELLFAMILY_DRUID, 0x0, 0x200000, 0x0))\n+                if (eff->IsAffectedOnSpell(spellInfo) && !spellInfo->IsRankOf(sSpellMgr->GetSpellInfo(HURRICANE_DAMAGE_1)))\n+                    me->RemoveAurasDueToSpell(OMEN_OF_CLARITY_BUFF);\n+\n+            //Elune's Wrath: -100% takes priority since only Starfire\n+            AuraEffect const* elun = me->GetAuraEffect(ELUNES_WRATH_BUFF, 0);\n+            //Predator's Swiftness takes priority since duration\n+            AuraEffect const* pred = me->GetAuraEffect(PREDATORS_SWIFTNESS_BUFF, 0);\n+            //Nature's Swiftness\n+            AuraEffect const* natu = me->GetAuraEffect(NATURES_SWIFTNESS_1, 0);\n+            if (elun && elun->IsAffectedOnSpell(spellInfo))\n+                me->RemoveAurasDueToSpell(ELUNES_WRATH_BUFF);\n+            else if (pred && pred->IsAffectedOnSpell(spellInfo))\n+                me->RemoveAurasDueToSpell(PREDATORS_SWIFTNESS_BUFF);\n+            else if (natu && natu->IsAffectedOnSpell(spellInfo))\n+                me->RemoveAurasDueToSpell(NATURES_SWIFTNESS_1);\n+        }\n+\n+        void SpellHitTarget(Unit* wtarget, SpellInfo const* spell) override\n+        {\n+            Unit* target = wtarget->ToUnit();\n+            if (!target)\n+                return;\n+\n+            uint32 spellId = spell->Id;\n+            uint32 baseId = spell->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+\n+            if (_form == DRUID_CAT_FORM)\n+            {\n+                //Combo point generating\n+                if (baseId == CLAW_1 || baseId == MANGLE_CAT_1 || baseId == POUNCE_1 ||\n+                    baseId == RAKE_1 || baseId == RAVAGE_1 || baseId == SHRED_1)\n+                {\n+                    comboPoints++;\n+                    //debug\n+                    //BOT_LOG_ERROR(\"entities.player\", \"druid_bot CP GEN: %s adds 1, now %u\", spell->SpellName[0], uint32(comboPoints));\n+                    if (primalFuryProc)\n+                    {\n+                        comboPoints++;\n+                        //debug\n+                        //BOT_LOG_ERROR(\"entities.player\", \"druid_bot CP EX: now %u\", uint32(comboPoints));\n+                    }\n+                    if (comboPoints > 5)\n+                    {\n+                        comboPoints = 5;\n+                        //debug\n+                        //BOT_LOG_ERROR(\"entities.player\", \"druid_bot CP NOR: now %u\", uint32(comboPoints));\n+                    }\n+                }\n+                //Combo point spending\n+                //else if (baseId == FEROCIOUS_BITE_1 || baseId == MAIM_1 || baseId == RIP_1 || baseId == SAVAGE_ROAR_1)\n+                else if (spell->NeedsComboPoints())\n+                {\n+                    //debug\n+                    //BOT_LOG_ERROR(\"entities.player\", \"druid_bot CP SPEND1: %u to 0\", uint32(comboPoints));\n+                    if (lvl >= 25 && comboPoints > 0)\n+                    {\n+                        if (urand(1,100) <= uint32(comboPoints * 20))\n+                        {\n+                            me->CastSpell(me, PREDATORS_SWIFTNESS_BUFF, true);\n+                            //debug\n+                            //BOT_LOG_ERROR(\"entities.player\", \"druid_bot CP SPEND1: PS proc!\");\n+                        }\n+                    }\n+                    comboPoints = 0;\n+                }\n+\n+                //Maim helper\n+                if (baseId == MAIM_1)\n+                    MoveBehind(target);\n+            }\n+\n+            //Hibernate helper\n+            if (spellId == GetSpell(HIBERNATE_1))\n+            {\n+                hibery = true;\n+                hiberyCheckTimer = 2000;\n+            }\n+\n+            //Bash desperate use (ranged): retreat\n+            //Only if hit\n+            if (baseId == BASH_1 && HasRole(BOT_ROLE_RANGED) && !HasBotCommandState(BOT_COMMAND_MASK_UNMOVING))\n+            {\n+                //if (GC_Timer <= lastdiff && GetSpell(TRAVEL_FORM_1))\n+                //    doCast(me, GetSpell(TRAVEL_FORM_1));\n+                GetInPosition(true, target);\n+            }\n+\n+            //Infected Wound: handle proc\n+            if (baseId == SHRED_1 || baseId == MAUL_1 || baseId == MANGLE_BEAR_1 || baseId == MANGLE_CAT_1)\n+            {\n+                if ((GetSpec() == BOT_SPEC_DRUID_FERAL) && lvl >= 45)\n+                {\n+                    //CastSpellExtraArgs args(true);\n+                    //args.SetOriginalCaster(me->GetGUID());\n+                    //target->CastSpell(target, INFECTED_WOUNDS_EFFECT, args);\n+                    target->CastSpell(target, INFECTED_WOUNDS_EFFECT, true, nullptr, nullptr, me->GetGUID());\n+                }\n+            }\n+\n+            //Brutal Impact: +1 sec duration for Bash and Pounce stun\n+            if (baseId == BASH_1 || baseId == POUNCE_1)\n+            {\n+                if (Aura* stu = target->GetAura(spellId))\n+                {\n+                    //1 extra second on creatures\n+                    uint32 dur = stu->GetDuration() + (target->IsPlayer() ? 1000 : 2000);\n+                    stu->SetDuration(dur);\n+                    stu->SetMaxDuration(dur);\n+                }\n+            }\n+\n+            //Glyph of Starfire: Increase max duration of Moonfire and refresh\n+            if (baseId == STARFIRE_1 && GetSpell(MOONFIRE_1))\n+            {\n+                if (lvl >= 20)\n+                {\n+                    if (Aura* aur = target->GetAura(GetSpell(MOONFIRE_1), me->GetGUID()))\n+                    {\n+                        //extra 9 sec base + 3 sec Nature's Splendor\n+                        if (aur->GetMaxDuration() < spell->GetMaxDuration() + 12000)\n+                        {\n+                            aur->SetDuration(aur->GetDuration() + 3000);\n+                            aur->SetMaxDuration(aur->GetMaxDuration() + 3000);\n+                        }\n+                    }\n+                }\n+            }\n+            //Nature's Splendor: Increased duraion for\n+            //Moonfire (3 sec), Rejuvenation (3 sec, let 6), Regrowth (6 sec, let 9),\n+            //Insect Swarm (2 sec) and Lifebloom (2 sec)\n+            if (baseId == MOONFIRE_1 || baseId == REJUVENATION_1 || baseId == REGROWTH_1 ||\n+                baseId == INSECT_SWARM_1 || baseId == LIFEBLOOM_1)\n+            {\n+                if (lvl >= 20)\n+                {\n+                    if (Aura* aur = target->GetAura(spellId, me->GetGUID()))\n+                    {\n+                        uint32 dur = aur->GetDuration();\n+\n+                        switch (baseId)\n+                        {\n+                            case MOONFIRE_1:\n+                                dur += 3000;\n+                                break;\n+                            case REJUVENATION_1:\n+                                dur += 6000;\n+                                break;\n+                            case REGROWTH_1:\n+                                dur += 9000;\n+                                break;\n+                            case INSECT_SWARM_1:\n+                            case LIFEBLOOM_1:\n+                                dur += 2000;\n+                                break;\n+                            default:\n+                                break;\n+                        }\n+\n+                        aur->SetDuration(dur);\n+                        aur->SetMaxDuration(dur);\n+                    }\n+                }\n+            }\n+\n+            if (baseId == THORNS_1)\n+            {\n+                //30 min duration for Thorns\n+                if (Aura* thorn = target->GetAura(spellId, me->GetGUID()))\n+                {\n+                    uint32 dur = 30 * MINUTE * IN_MILLISECONDS;\n+                    thorn->SetDuration(dur);\n+                    thorn->SetMaxDuration(dur);\n+                }\n+            }\n+            if (baseId == MARK_OF_THE_WILD_1)\n+            {\n+                //1 hour duration for Mark of the Wild\n+                if (Aura* mark = target->GetAura(spellId, me->GetGUID()))\n+                {\n+                    uint32 dur = 1 * HOUR * IN_MILLISECONDS;\n+                    mark->SetDuration(dur);\n+                    mark->SetMaxDuration(dur);\n+\n+                    //Improved Mark of the Wild: +40% effect\n+                    for (auto i : NPCBots::index_array<uint8, MAX_SPELL_EFFECTS>)\n+                        if (AuraEffect* app = mark->GetEffect(i))\n+                            app->ChangeAmount((app->GetAmount() * 14) / 10);\n+                }\n+            }\n+            if ((baseId == FAERIE_FIRE_NORMAL_1 || baseId == FAERIE_FIRE_FERAL_1) && lvl >= 40)\n+            {\n+                //Improved Faerie Fire (part 1): incrase crit chance taken by 3% (effect2)\n+                if (AuraEffect* faf = target->GetAuraEffect(SPELL_AURA_MOD_ATTACKER_SPELL_HIT_CHANCE, SPELLFAMILY_DRUID, 0x400, 0x0, 0x0, me->GetGUID()))\n+                    faf->ChangeAmount(faf->GetAmount() + 3);\n+            }\n+\n+            OnSpellHitTarget(target, spell);\n+        }\n+\n+        void SpellHit(Unit* wcaster, SpellInfo const* spell) override\n+        {\n+            Unit* caster = wcaster->ToUnit();\n+            if (!caster)\n+                return;\n+\n+            uint32 spellId = spell->Id;\n+            uint32 baseId = spell->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+\n+            //Savage Roar duration\n+            if (spellId == SAVAGE_ROAR_BUFF || spellId == SAVAGE_ROAR_1)\n+            {\n+                if (Aura* sav = me->GetAura(spellId))\n+                {\n+                    uint32 dur = sav->GetDuration() + 6000;\n+                    sav->SetDuration(dur);\n+                    sav->SetMaxDuration(dur);\n+                }\n+                //Glyph of Savage Roar: 3% increase (20 for bot)\n+                if (spellId == SAVAGE_ROAR_BUFF)\n+                {\n+                    AuraEffect* sav = me->GetAuraEffect(spellId, EFFECT_0);\n+                    if (sav)\n+                        sav->ChangeAmount(sav->GetAmount() + 20);\n+                }\n+            }\n+\n+            //Glyph of Berserk: duration\n+            if (baseId == BERSERK_1)\n+            {\n+                if (Aura* ber = me->GetAura(spellId))\n+                {\n+                    uint32 dur = ber->GetDuration() + 5000;\n+                    ber->SetDuration(dur);\n+                    ber->SetMaxDuration(dur);\n+                }\n+            }\n+            //Glyph of Survival Instincts\n+            if (lvl >= 20 && spellId == SURVIVAL_INSTINCTS_1)\n+            {\n+                AuraEffect* sur = me->GetAuraEffect(spellId, EFFECT_0);\n+                if (sur)\n+                    sur->ChangeAmount(sur->GetAmount() + 15);\n+            }\n+            //Starfall: duration\n+            if (baseId == STARFALL_1)\n+            {\n+                if (Aura* sta = me->GetAura(spellId))\n+                {\n+                    uint32 dur = sta->GetDuration() * 3;\n+                    sta->SetDuration(dur);\n+                    sta->SetMaxDuration(dur);\n+                }\n+            }\n+            //Predatoe's Swiftness: duration\n+            if (spellId == PREDATORS_SWIFTNESS_BUFF)\n+            {\n+                if (Aura* swi = me->GetAura(spellId))\n+                {\n+                    swi->SetDuration(15000);\n+                    swi->SetMaxDuration(15000);\n+                }\n+            }\n+            //Eclipse (helper): cooldown\n+            if (spellId == ECLIPSE_SOLAR_BUFF || spellId == ECLIPSE_LUNAR_BUFF)\n+                SetSpellCooldown(spellId, 30000);\n+            //Improved Leader of the Pack: handle SPELLMOD_EFFECT_2 MOVED to effect mods\n+            /*\n+            if (spellId == LEADER_OF_THE_PACK_BUFF)\n+            {\n+                AuraEffect* lea = me->GetAuraEffect(spellId, EFFECT_1, me->GetGUID());\n+                if (lea)\n+                    lea->ChangeAmount(lea->GetAmount() + 4);\n+            }\n+            */\n+            //Improved Barkskin: 10% additional damage reduction\n+            if ((GetSpec() == BOT_SPEC_DRUID_RESTORATION) && baseId == BARKSKIN_1)\n+            {\n+                AuraEffect* bar = me->GetAuraEffect(spellId, EFFECT_1, me->GetGUID());\n+                if (bar)\n+                    bar->ChangeAmount(bar->GetAmount() - 10);\n+            }\n+\n+            //Forms helper\n+            if (baseId == BEAR_FORM_1)\n+                setStats(DRUID_BEAR_FORM);\n+            else if (baseId == CAT_FORM_1)\n+                setStats(DRUID_CAT_FORM);\n+            else if (baseId == MOONKIN_FORM_1)\n+                setStats(DRUID_MOONKIN_FORM);\n+            else if (baseId == TREE_OF_LIFE_FORM_1)\n+                setStats(DRUID_TREE_FORM);\n+            else if (baseId == TRAVEL_FORM_1)\n+                setStats(DRUID_TRAVEL_FORM);\n+            else if (baseId == AQUATIC_FORM_1)\n+                setStats(DRUID_AQUATIC_FORM);\n+            else if (baseId == FLIGHT_FORM_1)\n+                setStats(DRUID_FLIGHT_FORM);\n+\n+            //Cat Form: delay prowl just a little bit\n+            if (baseId == CAT_FORM_1 && GetSpell(PROWL_1) && GetSpellCooldown(PROWL_1) < 300)\n+                SetSpellCooldown(PROWL_1, 300);\n+\n+            //Leader of the Pack helper\n+            if (baseId == CAT_FORM_1 || baseId == BEAR_FORM_1)\n+            {\n+                if ((GetSpec() == BOT_SPEC_DRUID_FERAL) && lvl >= 40)\n+                    me->CastSpell(me, LEADER_OF_THE_PACK_BUFF, true);\n+            }\n+\n+            OnSpellHit(caster, spell);\n+        }\n+\n+        void DamageDealt(Unit* victim, uint32& damage, DamageEffectType damageType, SpellSchoolMask damageSchoolMask) override\n+        {\n+            bot_ai::DamageDealt(victim, damage, damageType, damageSchoolMask);\n+        }\n+\n+        void DamageTaken(Unit* u, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellSchoolMask /*schoolMask*/) override\n+        {\n+            if (!u)\n+                return;\n+            if (!u->IsInCombat() && !me->IsInCombat())\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void OwnerAttackedBy(Unit* u) override\n+        {\n+            if (!u)\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        float GetSpellAttackRange(bool longRange) const override\n+        {\n+            return longRange ? CalcSpellMaxRange(WRATH_1) : 20.f;\n+        }\n+\n+        uint8 GetPetPositionNumber(Creature const* summon) const override\n+        {\n+            for (auto i : NPCBots::index_array<uint8, MAX_TREANTS>)\n+                if (_treants[i] == summon->GetGUID())\n+                    return i;\n+\n+            return 0;\n+        }\n+\n+        void SummonBotPet(Unit* target)\n+        {\n+            UnsummonTreants();\n+\n+            const uint32 entry = BOT_PET_FORCE_OF_NATURE;\n+\n+            for ([[maybe_unused]] auto i : NPCBots::index_array<uint8, MAX_TREANTS>)\n+            {\n+                //Position pos;\n+\n+                //30 sec duration\n+                Creature* myPet = me->SummonCreature(entry, (me->GetDistance(target) < 36.f ? *target : *me), TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5000);\n+                //me->GetNearPoint(myPet, pos.m_positionX, pos.m_positionY, pos.m_positionZ, 0, 2, me->GetOrientation());\n+                //myPet->GetMotionMaster()->MovePoint(me->GetMapId(), pos);\n+                myPet->SetCreator(master);\n+                myPet->SetOwnerGUID(me->GetGUID());\n+                myPet->SetFaction(master->GetFaction());\n+                myPet->SetControlledByPlayer(!IAmFree());\n+                myPet->SetPvP(me->IsPvP());\n+                myPet->SetByteValue(UNIT_FIELD_BYTES_2, 1, master->GetByteValue(UNIT_FIELD_BYTES_2, 1));\n+                myPet->SetUInt32Value(UNIT_CREATED_BY_SPELL, FORCE_OF_NATURE_1);\n+                //botPet = myPet;\n+\n+                myPet->Attack(target, true);\n+                if (!HasBotCommandState(BOT_COMMAND_MASK_UNCHASE))\n+                    myPet->GetMotionMaster()->MoveChase(target);\n+            }\n+        }\n+\n+        void JustSummoned(Creature* summon) override\n+        {\n+            if (summon->GetEntry() == BOT_PET_FORCE_OF_NATURE)\n+            {\n+                bool found = false;\n+                for (auto i : NPCBots::index_array<uint8, MAX_TREANTS>)\n+                {\n+                    if (!_treants[i])\n+                    {\n+                        _treants[i] = summon->GetGUID();\n+                        found = true;\n+                        break;\n+                    }\n+                }\n+                if (!found)\n+                {\n+                    BOT_LOG_ERROR(\"entities.unit\", \"Druid_bot:JustSummoned() treants array is full\");\n+                    ASSERT(false);\n+                }\n+            }\n+        }\n+\n+        void SummonedCreatureDespawn(Creature* summon) override\n+        {\n+            //BOT_LOG_ERROR(\"entities.unit\", \"SummonedCreatureDespawn: %s's %s\", me->GetName().c_str(), summon->GetName().c_str());\n+            //if (summon == botPet)\n+            //    botPet = nullptr;\n+            if (summon->GetEntry() == BOT_PET_FORCE_OF_NATURE)\n+            {\n+                //bool found = false;\n+                for (auto i : NPCBots::index_array<uint8, MAX_TREANTS>)\n+                {\n+                    if (_treants[i] == summon->GetGUID())\n+                    {\n+                        _treants[i] = ObjectGuid::Empty;\n+                        //found = true;\n+                        break;\n+                    }\n+                }\n+                //if (!found)\n+                //{\n+                //    BOT_LOG_ERROR(\"entities.unit\", \"Druid_bot:SummonedCreatureDespawn() treant is not found in array\");\n+                //    ASSERT(false);\n+                //}\n+            }\n+        }\n+\n+        void UnsummonTreants()\n+        {\n+            for (auto i : NPCBots::index_array<uint8, MAX_TREANTS>)\n+            {\n+                if (_treants[i])\n+                {\n+                    if (Unit* tr = ObjectAccessor::GetUnit(*me, _treants[i]))\n+                        tr->ToTempSummon()->UnSummon();\n+                    else\n+                        _treants[i] = ObjectGuid::Empty;\n+                }\n+            }\n+        }\n+\n+        void UnsummonAll(bool /*savePets*/ = true) override\n+        {\n+            for (auto i : NPCBots::index_array<uint8, MAX_TREANTS>)\n+            {\n+                if (_treants[i])\n+                    if (Unit* tr = ObjectAccessor::GetUnit(*me, _treants[i]))\n+                        tr->ToTempSummon()->UnSummon();\n+            }\n+        }\n+\n+        uint32 GetAIMiscValue(uint32 data) const override\n+        {\n+            switch (data)\n+            {\n+                case BOTAI_MISC_COMBO_POINTS:\n+                    return comboPoints;\n+                case BOTAI_MISC_PET_TYPE:\n+                    return BOT_PET_FORCE_OF_NATURE;\n+                default:\n+                    return 0;\n+            }\n+        }\n+\n+        void Reset() override\n+        {\n+            UnsummonAll(false);\n+            for (auto i : NPCBots::index_array<uint8, MAX_TREANTS>)\n+                _treants[i] = ObjectGuid::Empty;\n+\n+            //_form = BOT_STANCE_NONE;\n+            rage = 0;\n+            removeShapeshiftForm();\n+\n+            energy = 0;\n+            comboPoints = 0;\n+            primalFuryProc = false;\n+\n+            hibery = false;\n+            hiberyCheckTimer = 0;\n+\n+            me->SetMaxPower(POWER_ENERGY, 100); //for regeneration\n+            rageLossMult = sWorld->getRate(RATE_POWER_RAGE_LOSS);\n+\n+            ragetimer = 0;\n+\n+            DefaultInit();\n+        }\n+\n+        void ReduceCD(uint32 diff) override\n+        {\n+            if (ragetimer > diff)                   ragetimer -= diff;\n+\n+            if (hiberyCheckTimer > diff)            hiberyCheckTimer -= diff;\n+        }\n+\n+        void InitPowers() override\n+        {\n+            switch (me->GetShapeshiftForm())\n+            {\n+                case FORM_BEAR:\n+                case FORM_DIREBEAR:\n+                    me->SetPowerType(POWER_RAGE);\n+                    break;\n+                case FORM_CAT:\n+                    me->SetPowerType(POWER_ENERGY);\n+                    break;\n+                default:\n+                    me->SetPowerType(POWER_MANA);\n+                    break;\n+            }\n+        }\n+\n+        void InitSpells() override\n+        {\n+            uint8 lvl = me->GetLevel();\n+            bool isBala = GetSpec() == BOT_SPEC_DRUID_BALANCE;\n+            bool isFera = GetSpec() == BOT_SPEC_DRUID_FERAL;\n+            bool isRest = GetSpec() == BOT_SPEC_DRUID_RESTORATION;\n+\n+            InitSpellMap(MARK_OF_THE_WILD_1);\n+            InitSpellMap(THORNS_1);\n+            InitSpellMap(HEALING_TOUCH_1);\n+            InitSpellMap(REGROWTH_1);\n+            InitSpellMap(REJUVENATION_1);\n+            InitSpellMap(LIFEBLOOM_1);\n+            InitSpellMap(NOURISH_1);\n+            InitSpellMap(TRANQUILITY_1);\n+            InitSpellMap(REVIVE_1);\n+            InitSpellMap(REBIRTH_1);\n+            InitSpellMap(BEAR_FORM_1);\n+            InitSpellMap(SWIPE_BEAR_1);\n+            InitSpellMap(BASH_1);\n+            InitSpellMap(MAUL_1);\n+            InitSpellMap(CHALLENGING_ROAR_1);\n+            InitSpellMap(ENRAGE_1);\n+            InitSpellMap(FRENZIED_REGENERATION_1);\n+            InitSpellMap(GROWL_1);\n+            InitSpellMap(LACERATE_1);\n+            InitSpellMap(SURVIVAL_INSTINCTS_1);\n+            InitSpellMap(FAERIE_FIRE_FERAL_1);\n+            InitSpellMap(CAT_FORM_1);\n+            InitSpellMap(CLAW_1);\n+            InitSpellMap(RAKE_1);\n+            InitSpellMap(SHRED_1);\n+            InitSpellMap(POUNCE_1);\n+            InitSpellMap(RAVAGE_1);\n+            InitSpellMap(RIP_1);\n+            InitSpellMap(FEROCIOUS_BITE_1);\n+            InitSpellMap(MAIM_1);\n+            InitSpellMap(SWIPE_CAT_1);\n+            InitSpellMap(SAVAGE_ROAR_1);\n+            InitSpellMap(TIGERS_FURY_1);\n+            InitSpellMap(COWER_1);\n+            InitSpellMap(DASH_1);\n+  /*custom*/lvl >= 22 ? InitSpellMap(PROWL_1) : RemoveSpell(PROWL_1); //base lvl 20\n+            InitSpellMap(MOONFIRE_1);\n+            InitSpellMap(STARFIRE_1);\n+            InitSpellMap(WRATH_1);\n+            InitSpellMap(HURRICANE_1);\n+            InitSpellMap(FAERIE_FIRE_NORMAL_1);\n+            InitSpellMap(TRAVEL_FORM_1);\n+            InitSpellMap(AQUATIC_FORM_1);\n+            InitSpellMap(FLIGHT_FORM_1);\n+            InitSpellMap(CURE_POISON_1);\n+            InitSpellMap(ABOLISH_POISON_1);\n+            InitSpellMap(REMOVE_CURSE_1);\n+            InitSpellMap(ENTANGLING_ROOTS_1);\n+            InitSpellMap(CYCLONE_1);\n+            InitSpellMap(HIBERNATE_1);\n+            InitSpellMap(BARKSKIN_1);\n+            InitSpellMap(NATURES_GRASP_1);\n+            InitSpellMap(INNERVATE_1);\n+\n+     /*tal*/lvl >= 30 && isBala ? InitSpellMap(INSECT_SWARM_1) : RemoveSpell(INSECT_SWARM_1);\n+     /*tal*/lvl >= 40 && isBala ? InitSpellMap(MOONKIN_FORM_1) : RemoveSpell(MOONKIN_FORM_1);\n+     /*tal*/lvl >= 50 && isBala ? InitSpellMap(TYPHOON_1) : RemoveSpell(TYPHOON_1);\n+     /*tal*/lvl >= 50 && isBala ? InitSpellMap(FORCE_OF_NATURE_1) : RemoveSpell(FORCE_OF_NATURE_1); //not casted\n+     /*tal*/lvl >= 60 && isBala ? InitSpellMap(STARFALL_1) : RemoveSpell(STARFALL_1);\n+\n+     /*tal*/lvl >= 30 && isFera ? InitSpellMap(FERAL_CHARGE_BEAR_1) : RemoveSpell(FERAL_CHARGE_BEAR_1);\n+     /*tal*/lvl >= 30 && isFera ? InitSpellMap(FERAL_CHARGE_CAT_1) : RemoveSpell(FERAL_CHARGE_CAT_1);\n+     /*tal*/lvl >= 50 && isFera ? InitSpellMap(MANGLE_BEAR_1) : RemoveSpell(MANGLE_BEAR_1);\n+     /*tal*/lvl >= 50 && isFera ? InitSpellMap(MANGLE_CAT_1) : RemoveSpell(MANGLE_CAT_1);\n+     /*tal*/lvl >= 60 && isFera ? InitSpellMap(BERSERK_1) : RemoveSpell(BERSERK_1);\n+\n+     /*tal*/lvl >= 30 && isRest ? InitSpellMap(NATURES_SWIFTNESS_1) : RemoveSpell(NATURES_SWIFTNESS_1);\n+     /*tal*/lvl >= 40 && isRest ? InitSpellMap(SWIFTMEND_1) : RemoveSpell(SWIFTMEND_1);\n+     /*tal*/lvl >= 50 && isRest ? InitSpellMap(TREE_OF_LIFE_FORM_1) : RemoveSpell(TREE_OF_LIFE_FORM_1);\n+     /*tal*/lvl >= 60 && isRest ? InitSpellMap(WILD_GROWTH_1) : RemoveSpell(WILD_GROWTH_1);\n+        }\n+\n+        void ApplyClassPassives() const override\n+        {\n+            uint8 level = master->GetLevel();\n+            bool isBala = GetSpec() == BOT_SPEC_DRUID_BALANCE;\n+            bool isFera = GetSpec() == BOT_SPEC_DRUID_FERAL;\n+            bool isRest = GetSpec() == BOT_SPEC_DRUID_RESTORATION;\n+\n+            RefreshAura(NATURESGRACE, level >= 20 ? 1 : 0);\n+            RefreshAura(DREAMSTATE, isBala && level >= 35 ? 1 : 0);\n+            RefreshAura(BALANCE_OF_POWER, isBala && level >= 35 ? 1 : 0);\n+            RefreshAura(IMPROVED_MOONKIN_FORM, !IAmFree() && isBala && level >= 40 ? 1 : 0);\n+            RefreshAura(ECLIPSE, isBala && level >= 50 ? 1 : 0);\n+            RefreshAura(EARTH_AND_MOON, isBala && level >= 55 ? 1 : 0);\n+\n+            RefreshAura(PRIMAL_PRECISION, isFera && level >= 25 ? 1 : 0);\n+            RefreshAura(SURVIVAL_OF_THE_FITTEST, isFera && level >= 35 ? 1 : 0);\n+            RefreshAura(IMPROVED_LEADER_OF_THE_PACK, isFera && level >= 40 ? 1 : 0);\n+            RefreshAura(PRIMAL_TENACITY, isFera && level >= 40 ? 1 : 0);\n+            RefreshAura(KING_OF_THE_JUNGLE, isFera && level >= 50 ? 1 : 0);\n+            RefreshAura(PRIMAL_GORE, isFera && level >= 55 ? 1 : 0);\n+\n+            RefreshAura(IMPROVED_MARK_OF_THE_WILD, level >= 10 ? 1 : 0);\n+            RefreshAura(FUROR, level >= 10 ? 1 : 0);\n+            RefreshAura(NATURALIST, level >= 15 ? 1 : 0);\n+            RefreshAura(INTENSITY, level >= 20 ? 1 : 0);\n+            RefreshAura(OMEN_OF_CLARITY, level >= 20 ? 1 : 0);\n+            RefreshAura(NATURAL_PERFECTION3, isRest && level >= 45 ? 1 : 0);\n+            RefreshAura(NATURAL_PERFECTION2, isRest && level >= 43 && level < 45 ? 1 : 0);\n+            RefreshAura(NATURAL_PERFECTION1, isRest && level >= 41 && level < 43 ? 1 : 0);\n+            RefreshAura(LIVING_SEED3, isRest && level >= 50 ? 1 : 0);\n+            RefreshAura(LIVING_SEED2, isRest && level >= 48 && level < 50 ? 1 : 0);\n+            RefreshAura(LIVING_SEED1, isRest && level >= 46 && level < 48 ? 1 : 0);\n+            RefreshAura(REVITALIZE3, isRest && level >= 55 ? 1 : 0);\n+            RefreshAura(REVITALIZE2, isRest && level >= 53 && level < 55 ? 1 : 0);\n+            RefreshAura(REVITALIZE1, isRest && level >= 51 && level < 53 ? 1 : 0);\n+            RefreshAura(GIFT_OF_THE_EARTHMOTHER, isRest && level >= 55 ? 1 : 0);\n+\n+            RefreshAura(GLYPH_NOURISH, level >= 80 ? 1 : 0);\n+            RefreshAura(GLYPH_SWIFTMEND, level >= 45 ? 1 : 0);\n+            RefreshAura(GLYPH_INNERVATE, level >= 40 ? 1 : 0);\n+            RefreshAura(GLYPH_RAPID_REJUVENATION, level >= 15 ? 1 : 0);\n+            RefreshAura(GLYPH_REGROWTH, level >= 15 ? 1 : 0);\n+            RefreshAura(GLYPH_REJUVENATION, level >= 15 ? 1 : 0);\n+            RefreshAura(GLYPH_FRENZIED_REGENERATION, level >= 36 ? 1 : 0);\n+            RefreshAura(GLYPH_BARKSKIN, level >= 44 ? 1 : 0);\n+            RefreshAura(GLYPH_RAKE, level >= 24 ? 1 : 0);\n+            RefreshAura(GLYPH_SHRED, level >= 22 ? 1 : 0);\n+            RefreshAura(T10_RESTO_P4_BONUS, level >= 80 ? 1 : 0);\n+            RefreshAura(T9_RESTO_P4_BONUS, level >= 80 ? 1 : 0);\n+            RefreshAura(T8_RESTO_P4_BONUS, level >= 78 ? 1 : 0);\n+            RefreshAura(T9_BALANCE_P2_BONUS, level >= 78 ? 1 : 0);\n+            RefreshAura(T10_BALANCE_P2_BONUS, level >= 78 ? 1 : 0);\n+            RefreshAura(T10_BALANCE_P4_BONUS, level >= 78 ? 1 : 0);\n+            RefreshAura(T8_FERAL_P2_BONUS, level >= 78 ? 1 : 0);\n+            RefreshAura(T10_FERAL_P4_BONUS, level >= 80 ? 1 : 0);\n+        }\n+\n+        bool CanUseManually(uint32 basespell) const override\n+        {\n+            switch (basespell)\n+            {\n+                case MARK_OF_THE_WILD_1:\n+                case THORNS_1:\n+                case HEALING_TOUCH_1:\n+                case REJUVENATION_1:\n+                case LIFEBLOOM_1:\n+                case REGROWTH_1:\n+                case NOURISH_1:\n+                case WILD_GROWTH_1:\n+                case SWIFTMEND_1:\n+                case TRANQUILITY_1:\n+                case HURRICANE_1:\n+                case INNERVATE_1:\n+                case ABOLISH_POISON_1:\n+                case NATURES_GRASP_1:\n+                case BARKSKIN_1:\n+                case BEAR_FORM_1:\n+                case CAT_FORM_1:\n+                case TRAVEL_FORM_1:\n+                    return true;\n+                case AQUATIC_FORM_1:\n+                    return me->HasUnitMovementFlag(MOVEMENTFLAG_SWIMMING) && me->IsUnderWater();\n+                case FLIGHT_FORM_1:\n+                    return master->IsMounted() && !me->HasUnitMovementFlag(MOVEMENTFLAG_SWIMMING) && !me->IsUnderWater();\n+                case TYPHOON_1:\n+                case STARFALL_1:\n+                case MOONKIN_FORM_1:\n+                    return (GetBotRoles() & BOT_ROLE_MASK_MAIN) == (BOT_ROLE_DPS|BOT_ROLE_RANGED);\n+                case TREE_OF_LIFE_FORM_1:\n+                    return ((GetBotRoles() & BOT_ROLE_MASK_MAIN) & ~BOT_ROLE_RANGED) == BOT_ROLE_HEAL;\n+                case SURVIVAL_INSTINCTS_1:\n+                case FRENZIED_REGENERATION_1:\n+                case ENRAGE_1:\n+                case CHALLENGING_ROAR_1:\n+                    return _form == DRUID_BEAR_FORM;\n+                case TIGERS_FURY_1:\n+                case DASH_1:\n+                case PROWL_1:\n+                    return _form == DRUID_CAT_FORM;\n+                case BERSERK_1:\n+                    return (_form == DRUID_BEAR_FORM || _form == DRUID_CAT_FORM) &&\n+                        (((GetBotRoles() & BOT_ROLE_MASK_MAIN) & BOT_ROLE_TANK) || (GetBotRoles() & BOT_ROLE_MASK_MAIN) == BOT_ROLE_DPS);\n+                default:\n+                    return false;\n+            }\n+        }\n+\n+        std::vector<uint32> const* GetDamagingSpellsList() const override\n+        {\n+            return &Druid_spells_damage;\n+        }\n+        std::vector<uint32> const* GetCCSpellsList() const override\n+        {\n+            return &Druid_spells_cc;\n+        }\n+        std::vector<uint32> const* GetHealingSpellsList() const override\n+        {\n+            return &Druid_spells_heal;\n+        }\n+        std::vector<uint32> const* GetSupportSpellsList() const override\n+        {\n+            return &Druid_spells_support;\n+        }\n+\n+        void InitHeals() override\n+        {\n+            SpellInfo const* spellInfo;\n+            if (InitSpell(me, NOURISH_1))\n+            {\n+                spellInfo = sSpellMgr->GetSpellInfo(InitSpell(me, NOURISH_1));\n+                _heals[NOURISH_1] = me->SpellHealingBonusDone(me, spellInfo, spellInfo->Effects[0].CalcValue(me), HEAL, 0);\n+            }\n+            else\n+                _heals[NOURISH_1] = 0;\n+\n+            if (InitSpell(me, REGROWTH_1))\n+            {\n+                spellInfo = sSpellMgr->GetSpellInfo(InitSpell(me, REGROWTH_1));\n+                _heals[REGROWTH_1] = me->SpellHealingBonusDone(me, spellInfo, spellInfo->Effects[0].CalcValue(me), HEAL, 0);\n+            }\n+            else\n+                _heals[REGROWTH_1] = 0;\n+\n+            if (InitSpell(me, HEALING_TOUCH_1))\n+            {\n+                spellInfo = sSpellMgr->GetSpellInfo(InitSpell(me, HEALING_TOUCH_1));\n+                _heals[HEALING_TOUCH_1] = me->SpellHealingBonusDone(me, spellInfo, spellInfo->Effects[0].CalcValue(me), HEAL, 0);\n+            }\n+            else\n+                _heals[HEALING_TOUCH_1] = 0;\n+\n+            if (InitSpell(me, REJUVENATION_1))\n+            {\n+                spellInfo = sSpellMgr->GetSpellInfo(InitSpell(me, REJUVENATION_1));\n+                _heals[REJUVENATION_1] = me->SpellHealingBonusDone(me, spellInfo, spellInfo->Effects[0].CalcValue(me), DOT, 0);\n+            }\n+            else\n+                _heals[REJUVENATION_1] = 0;\n+        }\n+\n+    private:\n+        bool _isValidInnervateTarget(Unit const* unit) const\n+        {\n+            if (!unit || unit->GetPowerType() != POWER_MANA || !unit->IsInCombat() || !unit->IsInMap(me) || me->GetExactDist(unit) > 30.f ||\n+                unit->GetAuraEffect(SPELL_AURA_PERIODIC_ENERGIZE, SPELLFAMILY_DRUID, 0x0, 0x1000, 0x0))\n+                return false;\n+\n+            if (unit->IsNPCBot())\n+            {\n+                switch (unit->ToCreature()->GetBotClass())\n+                {\n+                    case BOT_CLASS_HUNTER: case BOT_CLASS_WARLOCK: case BOT_CLASS_SPHYNX: case BOT_CLASS_SPELLBREAKER: case BOT_CLASS_NECROMANCER:\n+                        return false;\n+                    default:\n+                        break;\n+                }\n+            }\n+\n+            uint8 mpct = (unit->GetMaxPower(POWER_MANA) - unit->GetPower(POWER_MANA) > me->GetCreateMana() * 2) ? 15 : 3;\n+            if (GetManaPCT(unit) >= mpct)\n+                return false;\n+\n+            return true;\n+        }\n+        static uint32 _baseSpellForShapeshift(BotStances form)\n+        {\n+            switch (form)\n+            {\n+                case DRUID_BEAR_FORM:\n+                    return BEAR_FORM_1;\n+                case DRUID_CAT_FORM:\n+                    return CAT_FORM_1;\n+                case DRUID_MOONKIN_FORM:\n+                    return MOONKIN_FORM_1;\n+                case DRUID_TREE_FORM:\n+                    return TREE_OF_LIFE_FORM_1;\n+                case DRUID_TRAVEL_FORM:\n+                    return TRAVEL_FORM_1;\n+                case DRUID_AQUATIC_FORM:\n+                    return AQUATIC_FORM_1;\n+                case DRUID_FLIGHT_FORM:\n+                    return FLIGHT_FORM_1;\n+                default:\n+                    return 0;\n+            }\n+        }\n+        BotStances _selectShapeshift() const\n+        {\n+            BotStances form = BOT_STANCE_NONE;\n+            if (bot_ai::IsMelee())\n+            {\n+                bool has_cat_form_spell = !!GetSpell(_baseSpellForShapeshift(DRUID_CAT_FORM));\n+                bool has_bear_form_spell = !!GetSpell(_baseSpellForShapeshift(DRUID_BEAR_FORM));\n+                if ((IsTank() || (IsWanderer() && !has_cat_form_spell)) && has_bear_form_spell)\n+                    form = DRUID_BEAR_FORM;\n+                else if (HasRole(BOT_ROLE_DPS))\n+                    form = has_cat_form_spell ? DRUID_CAT_FORM : has_bear_form_spell ? DRUID_BEAR_FORM : BOT_STANCE_NONE;\n+            }\n+            if (form == BOT_STANCE_NONE && HasRole(BOT_ROLE_DPS))\n+                form = (!HasRole(BOT_ROLE_HEAL) && !!GetSpell(_baseSpellForShapeshift(DRUID_MOONKIN_FORM))) ? DRUID_MOONKIN_FORM : BOT_STANCE_NONE;\n+            if (form == BOT_STANCE_NONE && HasRole(BOT_ROLE_HEAL))\n+                form = (!HasRole(BOT_ROLE_DPS) && !!GetSpell(_baseSpellForShapeshift(DRUID_TREE_FORM))) ? DRUID_TREE_FORM : BOT_STANCE_NONE;\n+            return form;\n+        }\n+\n+        //Treants\n+        std::array<ObjectGuid, MAX_TREANTS> _treants;\n+        //Timers/other\n+/*Form*/BotStances _form;\n+/*Misc*/mutable bool primalFuryProc;\n+/*Misc*/uint8 comboPoints;\n+/*Misc*/uint32 ragetimer;\n+        bool hibery;\n+        uint32 hiberyCheckTimer;\n+/*Misc*/int32 rage, energy;\n+\n+        using HealMap = std::unordered_map<uint32 /*baseId*/, int32 /*amount*/>;\n+        HealMap _heals;\n+    };\n+};\n+\n+void AddSC_druid_bot()\n+{\n+    new druid_bot();\n+}\ndiff --git a/src/server/game/AI/NpcBots/bot_hunter_ai.cpp b/src/server/game/AI/NpcBots/bot_hunter_ai.cpp\nnew file mode 100644\nindex 0000000000..cca1a6ef23\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bot_hunter_ai.cpp\n@@ -0,0 +1,2238 @@\n+#include \"bot_ai.h\"\n+#include \"botmgr.h\"\n+#include \"botspell.h\"\n+#include \"bottext.h\"\n+#include \"bottraits.h\"\n+#include \"GridNotifiersImpl.h\"\n+#include \"Group.h\"\n+#include \"Map.h\"\n+#include \"MotionMaster.h\"\n+#include \"ObjectAccessor.h\"\n+#include \"Player.h\"\n+#include \"ScriptMgr.h\"\n+#include \"Spell.h\"\n+#include \"SpellAuraEffects.h\"\n+#include \"SpellMgr.h\"\n+#include \"TemporarySummon.h\"\n+#include \"World.h\"\n+/*\n+Hunter NpcBot (reworked by Trickerer onlysuffering@gmail.com)\n+Complete - around 95%\n+TODO: Master's Call\n+*/\n+\n+enum HunterBaseSpells\n+{\n+    AUTO_SHOT_1                         = 75,\n+    ARCANE_SHOT_1                       = 3044,\n+    TRANQ_SHOT_1                        = 19801,\n+    BLACK_ARROW_1                       = 3674,\n+    SILENCING_SHOT_1                    = 34490,\n+    CHIMERA_SHOT_1                      = 53209,\n+    AIMED_SHOT_1                        = 19434,\n+    STEADY_SHOT_1                       = 56641,\n+    EXPLOSIVE_SHOT_1                    = 53301,\n+    KILL_SHOT_1                         = 53351,\n+    MULTISHOT_1                         = 2643,\n+    VOLLEY_1                            = 1510,\n+    SCATTER_SHOT_1                      = 19503,\n+    CONCUSSIVE_SHOT_1                   = 5116,\n+    DISTRACTING_SHOT_1                  = 20736,\n+    SERPENT_STING_1                     = 1978,\n+    SCORPID_STING_1                     = 3043,\n+    VIPER_STING_1                       = 3034,\n+    RAPID_FIRE_1                        = 3045,\n+    FLARE_1                             = 1543,\n+    TRUESHOT_AURA_1                     = 19506,\n+    WYVERN_STING_1                      = 19386,\n+    WING_CLIP_1                         = 2974,\n+    RAPTOR_STRIKE_1                     = 2973,\n+    MONGOOSE_BITE_1                     = 1495,\n+    COUNTERATTACK_1                     = 19306,\n+    DISENGAGE_1                         = 781,\n+    IMMOLATION_TRAP_1                   = 13795,\n+    FREEZING_TRAP_1                     = 1499,\n+    FROST_TRAP_1                        = 13809,\n+    EXPLOSIVE_TRAP_1                    = 13813,\n+    FREEZING_ARROW_1                    = 60192,\n+    SNAKE_TRAP_1                        = 34600,//NIY\n+    HUNTERS_MARK_1                      = 1130,\n+    SCARE_BEAST_1                       = 1513,\n+    FEIGN_DEATH_1                       = 5384,\n+    READINESS_1                         = 23989,\n+    DETERRENCE_1                        = 19263,\n+    MISDIRECTION_1                      = 34477,\n+    MEND_PET_1                          = 136,\n+\n+    ASPECT_OF_THE_MONKEY_1              = 13163,\n+    ASPECT_OF_THE_HAWK_1                = 13165,\n+    ASPECT_OF_THE_CHEETAH_1             = 5118,\n+    ASPECT_OF_THE_VIPER_1               = 34074,\n+    ASPECT_OF_THE_BEAST_1               = 13161,//NIY\n+    ASPECT_OF_THE_PACK_1                = 13159,\n+    ASPECT_OF_THE_WILD_1                = 20043,\n+    ASPECT_OF_THE_DRAGONHAWK_1          = 61846\n+};\n+\n+enum HunterPassives\n+{\n+//Talents\n+    SUREFOOTED                          = 24283,//rank 3\n+    ENTRAPMENT                          = 19388,//rank 3\n+    RAPID_KILLING                       = 34949,//rank 2\n+    IMPROVED_MEND_PET                   = 19573,//rank 2\n+    LOCK_AND_LOAD                       = 56344,//rank 3\n+    CONCUSSIVE_BARRAGE                  = 35102,//rank 2\n+    PIERCING_SHOTS                      = 53238,//rank 3\n+    EXPOSE_WEAKNESS                     = 34503,//rank 3\n+    THRILL_OF_THE_HUNT                  = 34499,//rank 3\n+    MASTER_MARKSMAN                     = 34489,//rank 5\n+    MASTER_TACTICIAN1                   = 34506,\n+    MASTER_TACTICIAN2                   = 34507,\n+    MASTER_TACTICIAN3                   = 34508,\n+    MASTER_TACTICIAN4                   = 34838,\n+    MASTER_TACTICIAN5                   = 34839,\n+    NOXIOUS_STINGS                      = 53297,//rank 3\n+    WILD_QUIVER                         = 53217,//rank 3\n+    SNIPER_TRAINING                     = 53304,//rank 3\n+\n+    GLYPH_RAPTOR_STRIKE                 = 63086,\n+    GLYPH_ASPECT_OF_THE_VIPER           = 56851,\n+    GLYPH_FREEZING_TRAP                 = 56845,\n+    GLYPH_EXPLOSIVE_TRAP                = 63068,\n+\n+    HUNTER_T8_P2                        = 67150,//serpent sting crits\n+    HUNTER_T10_P2                       = 70727,//autoshot 15% dmg proc\n+    HUNTER_T10_P4                       = 70730 //sting 20% ap proc\n+};\n+\n+enum HunterSpecial\n+{\n+    SPECIFIC_ASPECT_MONKEY              = 0x001,\n+    SPECIFIC_ASPECT_HAWK                = 0x002,\n+    SPECIFIC_ASPECT_CHEETAH             = 0x004,\n+    SPECIFIC_ASPECT_VIPER               = 0x008,\n+    SPECIFIC_ASPECT_BEAST               = 0x010,\n+    SPECIFIC_ASPECT_PACK                = 0x020,\n+    SPECIFIC_ASPECT_WILD                = 0x040,\n+    SPECIFIC_ASPECT_DRAGONHAWK          = 0x080,\n+    SPECIFIC_ASPECT_MY_ASPECT           = 0x100,\n+    //SPECIFIC_ASPECT_ALL_AREA_AUTOUSE    = (SPECIFIC_ASPECT_PACK),\n+\n+    IMPROVED_CONCUSSION                 = 28445,\n+    IMPROVED_WING_CLIP_NORMAL           = 47168,\n+    IMPROVED_WING_CLIP_EX               = 35963,\n+\n+    VOLLEY_DAMAGE_1                     = 42243,//rank 1\n+    //EXPLOSIVE_TRAP_DAMAGE_1             = 13812,//same as EXPLOSIVE_TRAP_AURA_1\n+\n+    QUICK_SHOTS_BUFF                    = 6150,\n+    RAPID_KILLING_BUFF                  = 35099,//rank 2\n+    LOCK_AND_LOAD_BUFF                  = 56453,//rank 3\n+    SNIPER_TRAINING_BUFF                = 64420,//rank 3\n+    RAPID_RECUPERATION_BUFF             = 54227,//rank 2, rapid fire, hidden\n+    RAPID_RECUPERATION_BUFF2            = 58882,//rapid killing, 6 sec\n+    IMPROVED_STEADY_SHOT_BUFF           = 53220,\n+\n+    FROST_TRAP_AURA                     = 13810,\n+    FREEZING_TRAP_AURA_1                = 3355,\n+    IMMOLATION_TRAP_AURA_1              = 13797,\n+    EXPLOSIVE_TRAP_AURA_1               = 13812,//same as EXPLOSIVE_TRAP_DAMAGE_1\n+    WYVERN_STING_DOT_AURA_1             = 24131,\n+    FREEZING_ARROW_AURA                 = 60210,\n+    EXPLOSIVE_SHOT_PERIODIC_DUMMY_AURA  = 53352,\n+\n+    ASPECT_OF_THE_DRAGONHAWK_MONKEY     = 61848, //linked, hidden\n+\n+    GLYPH_OF_ARCANE_SHOT_ENERGIZE       = 61389,\n+    RAPID_RECUPERATION_ENERGIZE         = 58883,//rapid killing\n+    RAPID_RECUPERATION_ENERGIZE_PCT_1   = 64180,//rank 1, 2%\n+\n+    GIFT_OF_NAARU_HUNTER                = 59543,\n+\n+    SPIRIT_BOND_PET                     = 24529,\n+    KINDRED_SPIRITS_PET                 = 57475,\n+    //INTIMIDATION_1                      = 24394,\n+    BESTIAL_WRATH_1                     = 19574,\n+    //BEAST_WITHIN_1                      = 34471,\n+\n+    GO_FOR_THE_THROAT_ENERGIZE          = 34953,\n+    FRENZY_BUFF                         = 19615\n+};\n+//talent tiers 20-32-44-56-68-80\n+\n+static const std::vector<uint32> Hunter_spells_damage\n+{ AIMED_SHOT_1, ARCANE_SHOT_1, BLACK_ARROW_1, COUNTERATTACK_1, CHIMERA_SHOT_1, EXPLOSIVE_SHOT_1, EXPLOSIVE_TRAP_1,\n+IMMOLATION_TRAP_1, KILL_SHOT_1, MONGOOSE_BITE_1, MULTISHOT_1, RAPTOR_STRIKE_1, SCATTER_SHOT_1, SERPENT_STING_1,\n+STEADY_SHOT_1, VOLLEY_1, WYVERN_STING_1 };\n+static const std::vector<uint32> Hunter_spells_cc\n+{ CONCUSSIVE_SHOT_1, FREEZING_ARROW_1, FREEZING_TRAP_1, FROST_TRAP_1, SCARE_BEAST_1, SCATTER_SHOT_1,\n+SILENCING_SHOT_1, WING_CLIP_1, WYVERN_STING_1 };\n+static const std::vector<uint32> Hunter_spells_support\n+{ /*ASPECT_OF_THE_BEAST_1, */ASPECT_OF_THE_MONKEY_1, ASPECT_OF_THE_HAWK_1, ASPECT_OF_THE_DRAGONHAWK_1,\n+ASPECT_OF_THE_CHEETAH_1, ASPECT_OF_THE_PACK_1, ASPECT_OF_THE_VIPER_1, ASPECT_OF_THE_WILD_1,\n+DETERRENCE_1, DISENGAGE_1, DISTRACTING_SHOT_1, FEIGN_DEATH_1, FLARE_1, HUNTERS_MARK_1, MEND_PET_1,\n+MISDIRECTION_1, RAPID_FIRE_1, READINESS_1, SCORPID_STING_1, /*SNAKE_TRAP_1, */TRANQ_SHOT_1, VIPER_STING_1 };\n+\n+class hunter_bot : public CreatureScript\n+{\n+public:\n+    hunter_bot() : CreatureScript(\"hunter_bot\") { }\n+\n+    CreatureAI* GetAI(Creature* creature) const override\n+    {\n+        return new hunter_botAI(creature);\n+    }\n+\n+    bool OnGossipHello(Player* player, Creature* creature) override\n+    {\n+        return creature->GetBotAI()->OnGossipHello(player, 0);\n+    }\n+\n+    bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action) override\n+    {\n+        if (bot_ai* ai = creature->GetBotAI())\n+            return ai->OnGossipSelect(player, creature, sender, action);\n+        return true;\n+    }\n+\n+    bool OnGossipSelectCode(Player* player, Creature* creature, uint32 sender, uint32 action, char const* code) override\n+    {\n+        if (bot_ai* ai = creature->GetBotAI())\n+            return ai->OnGossipSelectCode(player, creature, sender, action, code);\n+        return true;\n+    }\n+\n+    struct hunter_botAI : public bot_ai\n+    {\n+        hunter_botAI(Creature* creature) : bot_ai(creature)\n+        {\n+            _botclass = BOT_CLASS_HUNTER;\n+\n+            myPetType = 0;\n+\n+            InitUnitFlags();\n+        }\n+\n+        bool doCast(Unit* victim, uint32 spellId)\n+        {\n+            if (CheckBotCast(victim, spellId) != SPELL_CAST_OK)\n+                return false;\n+\n+            return bot_ai::doCast(victim, spellId);\n+        }\n+\n+        void StartAttack(Unit* u, bool force = false)\n+        {\n+            if (!bot_ai::StartAttack(u, force))\n+                return;\n+            GetInPosition(force, u);\n+        }\n+\n+        void JustEngagedWith(Unit* u) override { aspectTimer = 0; bot_ai::JustEngagedWith(u); }\n+        void KilledUnit(Unit* u) override { bot_ai::KilledUnit(u); }\n+        void EnterEvadeMode(EvadeReason why = EVADE_REASON_OTHER) override { bot_ai::EnterEvadeMode(why); }\n+        void MoveInLineOfSight(Unit* u) override { bot_ai::MoveInLineOfSight(u); }\n+        void JustDied(Unit* u) override { _myaspect = 0; UnsummonAll(false); bot_ai::JustDied(u); }\n+        void DoNonCombatActions(uint32 /*diff*/) { }\n+\n+        void CheckAspects(uint32 diff)\n+        {\n+            if (aspectTimer > diff || me->IsMounted() || Feasting() || IsCasting() || Rand() > 55)\n+                return;\n+\n+            aspectTimer = urand(5000, 10000);\n+\n+            if (_myaspect == ASPECT_OF_THE_VIPER_1 && GetManaPCT(me) < 50)\n+                return;\n+\n+            uint32 ASPECT_OF_THE_MONKEY = GetSpell(ASPECT_OF_THE_MONKEY_1);\n+            uint32 ASPECT_OF_THE_HAWK = GetSpell(ASPECT_OF_THE_HAWK_1);\n+            uint32 ASPECT_OF_THE_CHEETAH = GetSpell(ASPECT_OF_THE_CHEETAH_1);\n+            uint32 ASPECT_OF_THE_VIPER = GetSpell(ASPECT_OF_THE_VIPER_1);\n+            //uint32 ASPECT_OF_THE_BEAST = GetSpell(ASPECT_OF_THE_BEAST_1);\n+            uint32 ASPECT_OF_THE_PACK = GetSpell(ASPECT_OF_THE_PACK_1);\n+            uint32 ASPECT_OF_THE_WILD = GetSpell(ASPECT_OF_THE_WILD_1);\n+            uint32 ASPECT_OF_THE_DRAGONHAWK = GetSpell(ASPECT_OF_THE_DRAGONHAWK_1);\n+\n+            std::map<uint32 /*baseid*/, uint32 /*curid*/> idMap;\n+            uint32 mask = _getAspectsMask(idMap);\n+\n+            if (_myaspect == ASPECT_OF_THE_WILD_1) //manual\n+            {\n+                if (idMap[ASPECT_OF_THE_WILD_1] != ASPECT_OF_THE_WILD)\n+                    if (doCast(me, ASPECT_OF_THE_WILD))\n+                        return;\n+                return;\n+            }\n+\n+            if (GetManaPCT(me) < 20)\n+            {\n+                if (ASPECT_OF_THE_VIPER)\n+                {\n+                    if (doCast(me, ASPECT_OF_THE_VIPER))\n+                        return;\n+                }\n+                return;\n+            }\n+            else if (_myaspect == ASPECT_OF_THE_VIPER_1 && GetManaPCT(me) > 50)\n+            {\n+                me->RemoveAurasDueToSpell(ASPECT_OF_THE_VIPER_1, me->GetGUID());\n+                _myaspect = 0;\n+            }\n+\n+            if (IAmFree())\n+            {\n+                InstanceTemplate const* instt = sObjectMgr->GetInstanceTemplate(me->GetMap()->GetId());\n+                bool map_allows_mount = (!me->GetMap()->IsDungeon() || me->GetMap()->IsBattlegroundOrArena()) && (!instt || instt->AllowMount);\n+                if (me->HasUnitMovementFlag(MOVEMENTFLAG_FORWARD) &&\n+                    (!me->GetVictim() ?\n+                        (me->IsInCombat() || !map_allows_mount || !IsOutdoors() || IsFlagCarrier(me)) :\n+                        !me->IsWithinDist(me->GetVictim(), 8.0f + GetSpellAttackRange(true))))\n+                {\n+                    if (ASPECT_OF_THE_CHEETAH && !(mask & (SPECIFIC_ASPECT_CHEETAH | SPECIFIC_ASPECT_PACK)) && _myaspect != ASPECT_OF_THE_CHEETAH_1)\n+                    {\n+                        if (doCast(me, ASPECT_OF_THE_CHEETAH))\n+                            return;\n+                    }\n+\n+                    return;\n+                }\n+                else if (_myaspect == ASPECT_OF_THE_CHEETAH_1)\n+                {\n+                    me->RemoveAurasDueToSpell(ASPECT_OF_THE_CHEETAH_1, me->GetGUID());\n+                    _myaspect = 0;\n+                }\n+            }\n+            else\n+            {\n+                //choose movement aspect first\n+                if (!master->GetBotMgr()->IsPartyInCombat(false))\n+                {\n+                    if (!(mask & SPECIFIC_ASPECT_PACK))\n+                    {\n+                        uint32 movFlags;\n+                        if (ASPECT_OF_THE_PACK)\n+                        {\n+                            movFlags = master->m_movementInfo.GetMovementFlags();\n+                            if ((movFlags & MOVEMENTFLAG_FORWARD) && !(movFlags & (MOVEMENTFLAG_FALLING_FAR)))\n+                            {\n+                                if (doCast(me, ASPECT_OF_THE_PACK))\n+                                    return;\n+                            }\n+                        }\n+                        if (ASPECT_OF_THE_CHEETAH && _myaspect != ASPECT_OF_THE_CHEETAH_1)\n+                        {\n+                            movFlags = me->m_movementInfo.GetMovementFlags();\n+                            if ((movFlags & MOVEMENTFLAG_FORWARD) && !(movFlags & (MOVEMENTFLAG_FALLING_FAR)) &&\n+                                me->GetDistance(master) > 20)\n+                            {\n+                                if (doCast(me, ASPECT_OF_THE_CHEETAH))\n+                                    return;\n+                            }\n+                        }\n+                    }\n+\n+                    return;\n+                }\n+                else if (_myaspect == ASPECT_OF_THE_PACK_1)\n+                {\n+                    me->RemoveAurasDueToSpell(ASPECT_OF_THE_PACK_1, me->GetGUID());\n+                    _myaspect = 0;\n+                }\n+            }\n+\n+            if ((_myaspect == ASPECT_OF_THE_DRAGONHAWK_1 && idMap[ASPECT_OF_THE_DRAGONHAWK_1] == ASPECT_OF_THE_DRAGONHAWK) ||\n+                (!ASPECT_OF_THE_DRAGONHAWK && ((_myaspect == ASPECT_OF_THE_HAWK_1 && idMap[ASPECT_OF_THE_HAWK_1] == ASPECT_OF_THE_HAWK) ||\n+                _myaspect == ASPECT_OF_THE_MONKEY_1)))\n+                return;\n+\n+            if (ASPECT_OF_THE_DRAGONHAWK &&\n+                (_myaspect != ASPECT_OF_THE_DRAGONHAWK_1 || idMap[ASPECT_OF_THE_DRAGONHAWK_1] != ASPECT_OF_THE_DRAGONHAWK))\n+            {\n+                if (doCast(me, ASPECT_OF_THE_DRAGONHAWK))\n+                    return;\n+                return;\n+            }\n+            if (ASPECT_OF_THE_HAWK && (!IsTank() || (!ASPECT_OF_THE_MONKEY && !ASPECT_OF_THE_DRAGONHAWK)) &&\n+                (_myaspect != ASPECT_OF_THE_HAWK_1 || idMap[ASPECT_OF_THE_HAWK_1] != ASPECT_OF_THE_HAWK))\n+            {\n+                if (doCast(me, ASPECT_OF_THE_HAWK))\n+                    return;\n+                return;\n+            }\n+            if (ASPECT_OF_THE_MONKEY && _myaspect != ASPECT_OF_THE_MONKEY_1)\n+            {\n+                if (doCast(me, ASPECT_OF_THE_MONKEY))\n+                    return;\n+                return;\n+            }\n+        }\n+\n+        void Counter(uint32 diff)\n+        {\n+            if (IsCasting() || Rand() > 35)\n+                return;\n+\n+            Unit* target = nullptr;\n+\n+            if (IsSpellReady(SCATTER_SHOT_1, diff) && HasRole(BOT_ROLE_DPS))\n+            {\n+                target = FindCastingTarget(CalcSpellMaxRange(SCATTER_SHOT_1), 0, SCATTER_SHOT_1);\n+                if (target && doCast(target, GetSpell(SCATTER_SHOT_1)))\n+                    return;\n+            }\n+            if (!target && IsSpellReady(WYVERN_STING_1, diff) && HasRole(BOT_ROLE_DPS))\n+            {\n+                target = FindCastingTarget(CalcSpellMaxRange(WYVERN_STING_1), 5, WYVERN_STING_1);\n+                if (target && doCast(target, GetSpell(WYVERN_STING_1)))\n+                    return;\n+            }\n+            //if (!target && IsSpellReady(FREEZING_ARROW_1, diff))\n+            //{\n+            //    target = FindCastingTarget(40, 0, false, FREEZING_ARROW_1);\n+            //    if (target && doCast(target, GetSpell(FREEZING_ARROW_1)))\n+            //        return;\n+            //}\n+            //if (!target && IsSpellReady(SCARE_BEAST_1, diff))\n+            //{\n+            //    target = FindCastingTarget(30, 0, SCARE_BEAST_1);\n+            //    if (target && doCast(target, GetSpell(SCARE_BEAST_1)))\n+            //        return;\n+            //}\n+            if (!target && IsSpellReady(SILENCING_SHOT_1, diff, false) && HasRole(BOT_ROLE_DPS))\n+            {\n+                target = FindCastingTarget(CalcSpellMaxRange(SILENCING_SHOT_1), 5, SILENCING_SHOT_1);\n+                if (target && doCast(target, GetSpell(SILENCING_SHOT_1)))\n+                    return;\n+            }\n+        }\n+\n+        void CheckScatter(uint32 diff)\n+        {\n+            if (!IsSpellReady(SCATTER_SHOT_1, diff) || !HasRole(BOT_ROLE_DPS) || Rand() > 50)\n+                return;\n+\n+            for (Unit* mtar : { opponent, disttarget })\n+            {\n+                if (mtar && mtar->GetVictim() == me && mtar->GetDistance(me) < 10 &&\n+                    !mtar->HasAuraType(SPELL_AURA_PERIODIC_DAMAGE) && mtar->getAttackers().size() <= 1)\n+                {\n+                    if (doCast(mtar, GetSpell(SCATTER_SHOT_1)))\n+                    {\n+                        GetInPosition(true, nullptr);\n+                        return;\n+                    }\n+                }\n+            }\n+            if (Unit* target = FindStunTarget(CalcSpellMaxRange(SCATTER_SHOT_1)))\n+            {\n+                if (doCast(target, GetSpell(SCATTER_SHOT_1)))\n+                    return;\n+            }\n+        }\n+\n+        void CheckWyvernSting(uint32 diff)\n+        {\n+            if (!IsSpellReady(WYVERN_STING_1, diff) || !HasRole(BOT_ROLE_DPS) || Rand() > 50)\n+                return;\n+\n+            if (Unit* target = FindStunTarget(CalcSpellMaxRange(WYVERN_STING_1)))\n+            {\n+                if (doCast(target, GetSpell(WYVERN_STING_1)))\n+                    return;\n+            }\n+        }\n+\n+        void CheckFreezingArrow(uint32 diff)\n+        {\n+            //Freezing Trap shares cooldown with frosty traps\n+            if (!IsSpellReady(FREEZING_ARROW_1, diff) || Rand() > 35)\n+                return;\n+\n+            if (Unit* target = FindStunTarget(25))\n+            {\n+                if (doCast(target, GetSpell(FREEZING_ARROW_1)))\n+                    return;\n+            }\n+        }\n+\n+        void CheckTraps(uint32 diff)\n+        {\n+            if (trapTimer > diff || IsCasting() || Rand() > 35)\n+                return;\n+\n+            trapTimer = urand(1000, 2000);\n+\n+            //trap summon spell is 2yd radius\n+            std::list<Unit*> targets;\n+            GetNearbyTargetsInConeList(targets, 4);\n+            if (targets.empty())\n+                return;\n+\n+            //frost trap, freezing trap, freezing arrow: cat 411\n+            if (IsSpellReady(FROST_TRAP_1, diff) && !IsTank())\n+            {\n+                //uint8 movingCount = 0;\n+                //for (std::list<Unit*>::const_iterator itr = targets.begin(); itr != targets.end(); ++itr)\n+                //{\n+                //    if ((*itr)->isMoving() || ((*itr)->GetVictim() && !IsTank((*itr)->GetVictim())))\n+                //    {\n+                //        if (++movingCount >= 2)\n+                        //if (targets.size() > 1)\n+                //        {\n+                            if (doCast(me, GetSpell(FROST_TRAP_1)))\n+                                return;\n+                //            break;\n+                //        }\n+                //    }\n+                //}\n+            }\n+            //only if taming beast (or manual)\n+            if (IsSpellReady(FREEZING_TRAP_1, diff) && !HasRole(BOT_ROLE_DPS) && !IAmFree() &&\n+                master->GetAuraEffect(SPELL_AURA_MOD_RESISTANCE_PCT, SPELLFAMILY_GENERIC, 255, 2))\n+            {\n+                if (doCast(me, GetSpell(FREEZING_TRAP_1)))\n+                    return;\n+            }\n+            //black arrow, immolation trap, explosive trap: cat 1250\n+            if (IsSpellReady(EXPLOSIVE_TRAP_1, diff) && HasRole(BOT_ROLE_DPS))\n+            {\n+                if (targets.size() > 1)\n+                {\n+                    if (doCast(me, GetSpell(EXPLOSIVE_TRAP_1)))\n+                        return;\n+                }\n+            }\n+            if (IsSpellReady(IMMOLATION_TRAP_1, diff) && HasRole(BOT_ROLE_DPS) && !(*targets.begin())->IsControlledByPlayer())\n+            {\n+                if (targets.size() > 1)\n+                {\n+                    if (doCast(me, GetSpell(IMMOLATION_TRAP_1)))\n+                        return;\n+                }\n+            }\n+            //snake trap: cat 1249\n+            //if (IsSpellReady(SNAKE_TRAP_1, diff) && HasRole(BOT_ROLE_DPS) && (*targets.begin())->IsControlledByPlayer())\n+            //{\n+            //    if (doCast(me, GetSpell(SNAKE_TRAP_1)))\n+            //        return;\n+            //}\n+        }\n+\n+        void CheckMendPet(uint32 diff)\n+        {\n+            if (!IsSpellReady(MEND_PET_1, diff) || checkMendTimer > diff || Rand() > 75 ||\n+                !botPet || !botPet->IsAlive() || GetHealthPCT(botPet) > 80 ||\n+                me->GetDistance(botPet) > CalcSpellMaxRange(MEND_PET_1, false) || IsCasting())\n+                return;\n+\n+            checkMendTimer = urand(2000, 4000);\n+\n+            Aura const* mend = botPet->GetAura(GetSpell(MEND_PET_1));\n+            if (!mend || mend->GetDuration() < 3000)\n+            {\n+                if (doCast(me, GetSpell(MEND_PET_1)))\n+                    return;\n+            }\n+        }\n+\n+        void CheckScare(uint32 diff)\n+        {\n+            if (!IsSpellReady(SCARE_BEAST_1, diff) || IsCasting() || Rand() > 25)\n+                return;\n+\n+            if (FindAffectedTarget(GetSpell(SCARE_BEAST_1), me->GetGUID(), 60))\n+            {\n+                SetSpellCooldown(SCARE_BEAST_1, 2000);\n+                return;\n+            }\n+\n+            if (Unit* scareTarget = FindFearTarget())\n+            {\n+                if (doCast(scareTarget, GetSpell(SCARE_BEAST_1)))\n+                    return;\n+            }\n+\n+            SetSpellCooldown(SCARE_BEAST_1, 1500); //fail\n+        }\n+\n+        void doDefend(uint32 diff)\n+        {\n+            if (IsTank() || Rand() > 55)\n+                return;\n+\n+            bool feignReady = IsSpellReady(FEIGN_DEATH_1, diff, false);\n+            bool deterReady = IsSpellReady(DETERRENCE_1, diff, false);\n+            if (!feignReady && !deterReady)\n+                return;\n+\n+            Unit::AttackerSet const& b_attackers = me->getAttackers();\n+            if (b_attackers.empty())\n+                return;\n+\n+            bool cast = false;\n+\n+            if (b_attackers.size() == 1)\n+            {\n+                if (Creature* cre = (*b_attackers.begin())->ToCreature())\n+                    if (cre->isWorldBoss() || cre->IsDungeonBoss() || cre->GetMaxHealth() > me->GetMaxHealth() * 10)\n+                        cast = true;\n+            }\n+            else\n+                cast = (uint8(b_attackers.size()) > (GetHealthPCT(me) > 20 ? 1 : 0));\n+\n+            if (!cast)\n+                return;\n+\n+            if (feignReady && (*b_attackers.begin())->getAttackers().size() > 1)\n+            {\n+                if (doCast(me, GetSpell(FEIGN_DEATH_1)))\n+                    return;\n+            }\n+\n+            if (deterReady)\n+            {\n+                if (doCast(me, GetSpell(DETERRENCE_1)))\n+                    return;\n+            }\n+        }\n+\n+        void CheckTranquil(uint32 diff)\n+        {\n+            if (!IsSpellReady(TRANQ_SHOT_1, diff) || Rand() > 20)\n+                return;\n+\n+            //First check current target\n+            for (Unit* mtar : { opponent, disttarget })\n+            {\n+                if (mtar && me->GetDistance(mtar) > 5 && me->GetDistance(mtar) < CalcSpellMaxRange(TRANQ_SHOT_1) &&\n+                    !mtar->IsImmunedToSpell(sSpellMgr->GetSpellInfo(TRANQ_SHOT_1)))\n+                {\n+                    for (auto const& [_, aura] : mtar->GetOwnedAuras())\n+                    {\n+                        SpellInfo const* spellInfo = aura->GetSpellInfo();\n+                        if (spellInfo->Dispel != DISPEL_MAGIC && spellInfo->Dispel != DISPEL_ENRAGE) continue;\n+                        if (spellInfo->Attributes & (SPELL_ATTR0_PASSIVE | SPELL_ATTR0_DO_NOT_DISPLAY)) continue;\n+                        //if (spellInfo->AttributesEx & SPELL_ATTR1_NO_AURA_ICON) continue;\n+                        AuraApplication const* aurApp = aura->GetApplicationOfTarget(mtar->GetGUID());\n+                        if (aurApp && aurApp->IsPositive())\n+                        {\n+                            if (doCast(mtar, GetSpell(TRANQ_SHOT_1)))\n+                                return;\n+                        }\n+                    }\n+                }\n+            }\n+\n+            Unit* target = FindTranquilTarget(5, CalcSpellMaxRange(TRANQ_SHOT_1));\n+            if (target && doCast(target, GetSpell(TRANQ_SHOT_1)))\n+                return;\n+        }\n+\n+        void CheckMisdirect(uint32 diff)\n+        {\n+            if (!IsSpellReady(MISDIRECTION_1, diff) || misdirectionTimer > diff || IAmFree() ||\n+                !master->GetGroup() || Rand() > 20)\n+                return;\n+\n+            misdirectionTimer = urand(3000, 6000);\n+\n+            //find tank\n+            //stacks\n+            std::list<Unit*> tanks;\n+            for (Unit* member : BotMgr::GetAllGroupMembers(master))\n+            {\n+                if (member->IsInWorld() && me->GetMap() == member->FindMap() && member->IsAlive() &&\n+                    member->GetVictim() && member->IsInCombat() && IsTank(member))\n+                {\n+                    tanks.push_back(member);\n+                }\n+            }\n+\n+            if (tanks.empty())\n+                return;\n+\n+            Unit* target = tanks.size() == 1 ? *tanks.begin() : Bcore::Containers::SelectRandomContainerElement(tanks);\n+            if (doCast(target, GetSpell(MISDIRECTION_1)))\n+                return;\n+        }\n+\n+        void UpdateAI(uint32 diff) override\n+        {\n+            if (!GlobalUpdate(diff))\n+                return;\n+\n+            DoVehicleActions(diff);\n+            if (!CanBotAttackOnVehicle())\n+                return;\n+\n+            //pet is killed or unreachable\n+            if (GC_Timer <= diff && !me->IsInCombat() && !me->IsMounted() && !me->GetVictim() && !IsCasting() && Rand() < 25 &&\n+                (!botPet || me->GetDistance2d(botPet) > World::GetMaxVisibleDistanceOnContinents()))\n+                SummonBotPet();\n+\n+            //Scare Beast interrupt\n+            Spell const* spell = me->GetCurrentSpell(CURRENT_GENERIC_SPELL);\n+            if (spell && spell->GetSpellInfo()->Id == GetSpell(SCARE_BEAST_1))\n+            {\n+                Unit const* target = ObjectAccessor::GetUnit(*me, spell->m_targets.GetObjectTargetGUID());\n+                if (target && target->HasAuraType(SPELL_AURA_MOD_FEAR))\n+                    me->InterruptSpell(CURRENT_GENERIC_SPELL);\n+            }\n+\n+            if (IsPotionReady())\n+            {\n+                if (GetManaPCT(me) < 10)\n+                    DrinkPotion(true);\n+                else if (GetHealthPCT(me) < 50)\n+                    DrinkPotion(false);\n+            }\n+\n+            CheckRacials(diff);\n+\n+            if (!me->IsInCombat())\n+                DoNonCombatActions(diff);\n+            else\n+                doDefend(diff);\n+\n+            CheckAspects(diff);\n+\n+            if (IsSpellReady(TRUESHOT_AURA_1, diff) && !IAmFree() && Rand() < 5 &&\n+                !me->GetAuraEffect(SPELL_AURA_MOD_RANGED_ATTACK_POWER_PCT, SPELLFAMILY_HUNTER, 0x0, 0x200000, 0x0, me->GetGUID()))\n+            {\n+                if (doCast(me, GetSpell(TRUESHOT_AURA_1)))\n+                    return;\n+            }\n+\n+            CheckMendPet(diff);\n+\n+            if (master->IsInCombat() || me->IsInCombat())\n+                CheckScare(diff);\n+\n+            //Deterrence check\n+            if (me->HasUnitFlag(UNIT_FLAG_PACIFIED) && !IsCasting())\n+            {\n+                if (!me->isMoving())\n+                    GetInPosition(true, nullptr);\n+                return;\n+            }\n+\n+            if (ProcessImmediateNonAttackTarget())\n+                return;\n+\n+            if (!CheckAttackTarget())\n+            {\n+                me->InterruptSpell(CURRENT_AUTOREPEAT_SPELL);\n+                return;\n+            }\n+\n+            if (IsCasting())\n+                return;\n+\n+            CheckFlare(diff);\n+            CheckReadiness(diff);\n+\n+            CheckUsableItems(diff);\n+\n+            DoRangedAttack(diff);\n+        }\n+\n+        void DoRangedAttack(uint32 diff)\n+        {\n+            Unit* mytar = opponent ? opponent : disttarget ? disttarget : nullptr;\n+            if (!mytar)\n+                return;\n+\n+            StartAttack(mytar, IsMelee());\n+\n+            CheckAttackState();\n+            if (!me->IsAlive() || !mytar->IsAlive())\n+                return;\n+\n+            Counter(diff);\n+            CheckTranquil(diff);\n+\n+            float dist = me->GetDistance(mytar);\n+            float maxRangeLong = me->GetLevel() >= 10 ? 51.f : 45.f;\n+            float maxRangeNormal = me->GetLevel() >= 10 ? 41.f : 35.f;\n+\n+            bool inposition = !mytar->HasAuraType(SPELL_AURA_MOD_CONFUSE) || dist > maxRangeNormal - 15.f;\n+\n+            //Auto Shot\n+            if (Spell const* shot = me->GetCurrentSpell(CURRENT_AUTOREPEAT_SPELL))\n+            {\n+                if (shot->GetSpellInfo()->Id == AUTO_SHOT_1 && (shot->m_targets.GetUnitTarget() != mytar || !inposition))\n+                    me->InterruptSpell(CURRENT_AUTOREPEAT_SPELL);\n+            }\n+            else if (HasRole(BOT_ROLE_DPS) && dist > 5 && dist < maxRangeNormal)\n+            {\n+                if (doCast(mytar, AUTO_SHOT_1))\n+                {}\n+            }\n+\n+            CheckScatter(diff);\n+            CheckFreezingArrow(diff);\n+            CheckWyvernSting(diff);\n+\n+            //TRAPS\n+            CheckTraps(diff);\n+\n+            auto [can_do_nature, can_do_fire, can_do_arcane, can_do_shadow, can_do_normal] =\n+                CanAffectVictimBools(mytar, SPELL_SCHOOL_NATURE, SPELL_SCHOOL_FIRE, SPELL_SCHOOL_ARCANE, SPELL_SCHOOL_SHADOW, SPELL_SCHOOL_NORMAL);\n+\n+            //scatter pvp\n+            if (IsSpellReady(SCATTER_SHOT_1, diff) && can_do_normal && HasRole(BOT_ROLE_DPS) &&\n+                mytar->IsPlayer() && dist < 10 && Rand() < 60)\n+            {\n+                if (doCast(mytar, GetSpell(SCATTER_SHOT_1)))\n+                {\n+                    me->InterruptSpell(CURRENT_AUTOREPEAT_SPELL);\n+                    me->AttackStop();\n+                    GetInPosition(true, mytar);\n+                    return;\n+                }\n+            }\n+\n+            //DISENGAGE\n+            if (IsSpellReady(DISENGAGE_1, diff, false) && me->IsInCombat() && !IsTank() && Rand() < 70 &&\n+                !HasBotCommandState(BOT_COMMAND_STAY) &&\n+                !me->getAttackers().empty() && me->GetDistance(*me->getAttackers().begin()) < 5 &&\n+                me->HasInArc(float(M_PI), *me->getAttackers().begin()))\n+            {\n+                if (doCast(me, GetSpell(DISENGAGE_1)))\n+                    return;\n+            }\n+\n+            MoveBehind(mytar);\n+\n+            //MELEE SECTION\n+            if (dist < 5)\n+            {\n+                if (!can_do_normal)\n+                    return;\n+\n+                //MONGOOSE BITE\n+                if (IsSpellReady(MONGOOSE_BITE_1, diff) && HasRole(BOT_ROLE_DPS) && Rand() < 50)\n+                {\n+                    if (doCast(mytar, GetSpell(MONGOOSE_BITE_1)))\n+                        return;\n+                }\n+                //COUNTERATTACK\n+                if (IsSpellReady(COUNTERATTACK_1, diff) && HasRole(BOT_ROLE_DPS) &&\n+                    me->HasReactive(REACTIVE_HUNTER_PARRY) && Rand() < 90)\n+                {\n+                    if (doCast(mytar, GetSpell(COUNTERATTACK_1)))\n+                        return;\n+                }\n+                //WING CLIP\n+                if (IsSpellReady(WING_CLIP_1, diff) && (!IsTank() || mytar->isMoving()) &&\n+                    Rand() < 80 && !CCed(mytar, true) && !mytar->HasAuraWithMechanic(1u<<MECHANIC_SNARE))\n+                {\n+                    if (doCast(mytar, GetSpell(WING_CLIP_1)))\n+                        return;\n+                }\n+                //RAPTOR STRIKE\n+                if (IsSpellReady(RAPTOR_STRIKE_1, diff, false) && HasRole(BOT_ROLE_DPS) && Rand() < 40 &&\n+                    !me->GetCurrentSpell(CURRENT_MELEE_SPELL))\n+                {\n+                    if (doCast(mytar, GetSpell(RAPTOR_STRIKE_1)))\n+                        return;\n+                }\n+\n+                return; //don't try to do anything else in melee\n+            }\n+\n+            //RANGED SECTION\n+\n+            //HUNTERS MARK //100 yd range so don't check it\n+            if (IsSpellReady(HUNTERS_MARK_1, diff) && can_do_arcane && Rand() < 65 &&\n+                !mytar->HasAuraTypeWithFamilyFlags(SPELL_AURA_MOD_STALKED, SPELLFAMILY_HUNTER, 0x400))\n+            {\n+                if (doCast(mytar, GetSpell(HUNTERS_MARK_1)))\n+                    return;\n+            }\n+\n+            CheckMisdirect(diff);\n+\n+            //attack range check 1\n+            if (dist > maxRangeLong)\n+                return;\n+\n+            //KILL SHOT\n+            if (IsSpellReady(KILL_SHOT_1, diff) && can_do_normal && HasRole(BOT_ROLE_DPS) &&\n+                mytar->HasAuraState(AURA_STATE_HEALTHLESS_20_PERCENT))\n+            {\n+                if (doCast(mytar, GetSpell(KILL_SHOT_1)))\n+                    return;\n+            }\n+\n+            //attack range check 2\n+            if (dist > maxRangeNormal)\n+                return;\n+\n+            if (!inposition && me->getAttackers().empty())\n+                return;\n+\n+            //CONCUSSIVE SHOT\n+            if (IsSpellReady(CONCUSSIVE_SHOT_1, diff) && can_do_arcane && Rand() < 35 &&\n+                !CCed(mytar, true) && !mytar->HasAuraWithMechanic(1u<<MECHANIC_SNARE))\n+            {\n+                if (doCast(mytar, GetSpell(CONCUSSIVE_SHOT_1)))\n+                    return;\n+            }\n+            //DISTRACTING SHOT\n+            Unit const* u = mytar->GetVictim();\n+            if (IsSpellReady(DISTRACTING_SHOT_1, diff) && can_do_arcane && u && u != me && IsTank() && !CCed(mytar) &&\n+                IsInBotParty(u) && Rand() < 75 && (!IsTank(u) || (dist > 25 && GetHealthPCT(u) < 25)))\n+            {\n+                if (doCast(mytar, GetSpell(DISTRACTING_SHOT_1)))\n+                    return;\n+            }\n+            //MULTI-SHOT shares cd with aimed shot\n+            if (IsSpellReady(MULTISHOT_1, diff) && HasRole(BOT_ROLE_DPS) && Rand() < 70)\n+            {\n+                if (Rand() < 30 || !GetSpell(STEADY_SHOT_1) || FindSplashTarget(maxRangeNormal))\n+                {\n+                    if (doCast(mytar, GetSpell(MULTISHOT_1)))\n+                        return;\n+                }\n+            }\n+            //VOLLEY\n+            if (IsSpellReady(VOLLEY_1, diff) && HasRole(BOT_ROLE_DPS) && !JumpingOrFalling() && Rand() < 75)\n+            {\n+                if (Unit* target = FindAOETarget(maxRangeNormal))\n+                {\n+                    if (doCast(target, GetSpell(VOLLEY_1)))\n+                        return;\n+                }\n+            }\n+            //RAPID FIRE\n+            if (IsSpellReady(RAPID_FIRE_1, diff, false) && can_do_normal && HasRole(BOT_ROLE_DPS) && !me->isMoving() && Rand() < 55 &&\n+                (mytar->GetHealth() > me->GetMaxHealth() * (1 + mytar->getAttackers().size()) || mytar->IsPlayer()) &&\n+                !me->HasAuraTypeWithFamilyFlags(SPELL_AURA_MOD_RANGED_HASTE, SPELLFAMILY_HUNTER, 0x20))\n+            {\n+                if (doCast(me, GetSpell(RAPID_FIRE_1)))\n+                {}\n+            }\n+            //BLACK ARROW\n+            //Black Arrow shares cooldown with fire traps\n+            if (IsSpellReady(BLACK_ARROW_1, diff) && can_do_shadow && HasRole(BOT_ROLE_DPS) &&\n+                mytar->GetHealth() > me->GetMaxHealth()/4 * (1 + mytar->getAttackers().size()))\n+            {\n+                if (doCast(mytar, GetSpell(BLACK_ARROW_1)))\n+                    return;\n+            }\n+            //CHIMERA SHOT: no viper\n+            if (IsSpellReady(CHIMERA_SHOT_1, diff) && can_do_nature && HasRole(BOT_ROLE_DPS))\n+            {\n+                //Serpent\n+                if (mytar->GetAuraEffect(SPELL_AURA_MOD_DAMAGE_FROM_CASTER, SPELLFAMILY_HUNTER, 0x4000, 0x0, 0x0, me->GetGUID()))\n+                {\n+                    if (doCast(mytar, GetSpell(CHIMERA_SHOT_1)))\n+                        return;\n+                }\n+                //Scorpid\n+                else if (mytar->GetAuraEffect(SPELL_AURA_MOD_HIT_CHANCE, SPELLFAMILY_HUNTER, 0x8000, 0x0, 0x0, me->GetGUID()))\n+                {\n+                    if (!mytar->HasAuraType(SPELL_AURA_MOD_DISARM) &&\n+                        (mytar->IsPlayer() || mytar->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID)))\n+                    {\n+                        if (doCast(mytar, GetSpell(CHIMERA_SHOT_1)))\n+                            return;\n+                    }\n+                }\n+\n+                SetSpellCooldown(CHIMERA_SHOT_1, 500); //fail\n+            }\n+            //STING\n+            if (GetSpellCooldown(SERPENT_STING_1) <= diff && can_do_nature && stingTimer <= diff && Rand() < 60)\n+            {\n+                uint32 STING = 0;\n+                AuraEffect const* sting = nullptr;\n+                if (GetSpell(SCORPID_STING_1) && mytar->IsCreature() &&\n+                    mytar->ToCreature()->GetCreatureTemplate()->rank != CREATURE_ELITE_NORMAL)\n+                {\n+                    sting = mytar->GetAuraEffect(SPELL_AURA_MOD_HIT_CHANCE, SPELLFAMILY_HUNTER, 0x8000, 0x0, 0x0);\n+                    if (!sting || sting->GetBase()->GetCasterGUID() == me->GetGUID())\n+                        STING = SCORPID_STING_1;\n+                }\n+                //VIPER STING: pvp only\n+                if (!STING && GetSpell(VIPER_STING_1) && mytar->IsPlayer() &&\n+                    mytar->GetPowerType() == POWER_MANA && mytar->GetHealth() > me->GetMaxHealth()/2 &&\n+                    mytar->GetMaxPower(POWER_MANA) > me->GetMaxPower(POWER_MANA))\n+                {\n+                    sting = mytar->GetAuraEffect(SPELL_AURA_PERIODIC_MANA_LEECH, SPELLFAMILY_HUNTER, 0x0, 0x80, 0x0, me->GetGUID());\n+                    if (!sting)\n+                        STING = VIPER_STING_1;\n+                }\n+                if (!STING && GetSpell(SERPENT_STING_1) && HasRole(BOT_ROLE_DPS) &&\n+                    mytar->GetHealth() > me->GetMaxHealth()/2 * (1 + mytar->getAttackers().size()))\n+                {\n+                    sting = mytar->GetAuraEffect(SPELL_AURA_MOD_DAMAGE_FROM_CASTER, SPELLFAMILY_HUNTER, 0x4000, 0x0, 0x0, me->GetGUID());\n+                    if (!sting)\n+                        STING = SERPENT_STING_1;\n+                }\n+\n+                if (sting && sting->GetBase()->GetCasterGUID() == me->GetGUID() &&\n+                    sting->GetBase()->GetDuration() >= 3000)\n+                {\n+                    stingTimer = 3000;\n+                }\n+                else\n+                {\n+                    if (STING && doCast(mytar, GetSpell(STING)))\n+                    {\n+                        stingTimer = 8000;\n+                        return;\n+                    }\n+                }\n+            }\n+            //EXPLOSIVE SHOT: replaces Arcane Shot at 60\n+            if (IsSpellReady(EXPLOSIVE_SHOT_1, diff) && can_do_fire && HasRole(BOT_ROLE_DPS))\n+            {\n+                if (doCast(mytar, GetSpell(EXPLOSIVE_SHOT_1)))\n+                    return;\n+            }\n+            //ARCANE SHOT: shares cd with Explosive Shot\n+            if (IsSpellReady(ARCANE_SHOT_1, diff) && can_do_arcane && HasRole(BOT_ROLE_DPS) && !GetSpell(EXPLOSIVE_SHOT_1))\n+            {\n+                if (doCast(mytar, GetSpell(ARCANE_SHOT_1)))\n+                    return;\n+            }\n+            //AIMED SHOT shares cd with multishot\n+            if (IsSpellReady(AIMED_SHOT_1, diff) && can_do_normal && HasRole(BOT_ROLE_DPS))\n+            {\n+                if (doCast(mytar, GetSpell(AIMED_SHOT_1)))\n+                    return;\n+            }\n+            //STEADY SHOT\n+            if (IsSpellReady(STEADY_SHOT_1, diff) && can_do_normal && HasRole(BOT_ROLE_DPS))\n+            {\n+                if (doCast(mytar, GetSpell(STEADY_SHOT_1)))\n+                    return;\n+            }\n+        }\n+\n+        void CheckFlare(uint32 diff)\n+        {\n+            if (!IsSpellReady(FLARE_1, diff) || flareTimer > diff || me->IsMounted() || Rand() > 25)\n+                return;\n+\n+            flareTimer = urand(2000, 4000);\n+\n+            std::set<Unit*> targets;\n+            if (Group const* gr = !IAmFree() ? master->GetGroup() : GetGroup())\n+            {\n+                for (Unit* member : BotMgr::GetAllGroupMembers(gr))\n+                {\n+                    if (me->GetMap() != member->FindMap() || !member->IsAlive())\n+                        continue;\n+                    for (Unit* attacker : member->getAttackers())\n+                    {\n+                        if (attacker->GetClass() == CLASS_ROGUE || attacker->HasInvisibilityAura() || attacker->HasStealthAura())\n+                        {\n+                            if (member->GetDistance(attacker) < 15)\n+                            {\n+                                targets.insert(member);\n+                                break;\n+                            }\n+                        }\n+                    }\n+                }\n+            }\n+            for (Unit* attacker : me->getAttackers())\n+            {\n+                if (attacker->GetClass() == CLASS_ROGUE || attacker->HasInvisibilityAura() || attacker->HasStealthAura())\n+                {\n+                    if (me->GetDistance(attacker) < 15)\n+                    {\n+                        targets.insert(me);\n+                        break;\n+                    }\n+                }\n+            }\n+\n+            if (targets.empty())\n+                return;\n+\n+            Unit* target = targets.size() == 1u ? *targets.begin() : Bcore::Containers::SelectRandomContainerElement(targets);\n+            if (doCast(target, GetSpell(FLARE_1)))\n+                return;\n+        }\n+\n+        void CheckReadiness(uint32 diff)\n+        {\n+            if (!IsSpellReady(READINESS_1, diff) || !me->IsInCombat() || me->IsMounted() || Rand() > 30)\n+                return;\n+\n+            //mainly used for rapid fire cd reset\n+            bool cast = me->GetVictim() && !IsSpellReady(RAPID_FIRE_1, diff, false);\n+\n+            if (cast && doCast(me, GetSpell(READINESS_1)))\n+                return;\n+        }\n+\n+        void ApplyClassSpellCritMultiplierAll(Unit const* victim, float& crit_chance, SpellInfo const* spellInfo, SpellSchoolMask /*schoolMask*/, WeaponAttackType /*attackType*/) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+\n+            //Glyph of Explosive Shot: 4% additional critical chance for Explosive Shot\n+            if (lvl >= 60 && (baseId == EXPLOSIVE_SHOT_1 || baseId == EXPLOSIVE_SHOT_PERIODIC_DUMMY_AURA))\n+                crit_chance += 4.f;\n+            //Point of No Escape: 6% additional critical chance on targets affected by frosty traps\n+            if ((GetSpec() == BOT_SPEC_HUNTER_SURVIVAL) && lvl >= 50)\n+            {\n+                if (victim->GetAuraEffect(SPELL_AURA_MOD_CRIT_CHANCE_FOR_CASTER, SPELLFAMILY_HUNTER, 0x18, 0x0, 0x0, me->GetGUID()))\n+                    crit_chance += 6.f;\n+            }\n+            //Sniper Training (part 1): 15% additional critical chance for Kill Shot\n+            if ((GetSpec() == BOT_SPEC_HUNTER_SURVIVAL) && lvl >= 50 && baseId == KILL_SHOT_1)\n+                crit_chance += 15.f;\n+            //Improved Steady Shot (37505): 5% additional critical chance for Steady Shot\n+            if (lvl >= 50 && baseId == STEADY_SHOT_1)\n+                crit_chance += 5.f;\n+            //Glyph of TrueShot Aura (req lvl 40): 10% additional critical chance for Aimed Shot\n+            if (lvl >= 40 && baseId == AIMED_SHOT_1)\n+                crit_chance += 10.f;\n+            //Improved Barrage: 12% additional critical chance for Multi-Shot and Aimed Shot\n+            if ((GetSpec() == BOT_SPEC_HUNTER_MARKSMANSHIP) && lvl >= 40 && (baseId == AIMED_SHOT_1 || baseId == MULTISHOT_1))\n+                crit_chance += 12.f;\n+            //Survival Instincts: 4% additional critical chance for Arcane Shot, Steady Shot and Explosive Shot\n+            if (lvl >= 15 && (baseId == ARCANE_SHOT_1 || baseId == STEADY_SHOT_1 || baseId == EXPLOSIVE_SHOT_1 ||\n+                baseId == EXPLOSIVE_SHOT_PERIODIC_DUMMY_AURA))\n+                crit_chance += 4.f;\n+            //Savage Strikes: 20% additional critical chance for Raptor Strike, Mongoose Bite and Counterattack\n+            if (lvl >= 10 && (baseId == RAPTOR_STRIKE_1 || baseId == MONGOOSE_BITE_1 || baseId == COUNTERATTACK_1))\n+                crit_chance += 20.f;\n+        }\n+\n+        void ApplyClassDamageMultiplierMeleeSpell(int32& damage, SpellNonMeleeDamage& damageinfo, SpellInfo const* spellInfo, WeaponAttackType /*attackType*/, bool iscrit) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+\n+            ////do nothing with autoshot\n+            //if (baseId == AUTO_SHOT_1)\n+            //    return;\n+\n+            uint8 lvl = me->GetLevel();\n+            float fdamage = float(damage);\n+\n+            //apply bonus damage mods\n+            float pctbonus = 0.0f;\n+            if (iscrit)\n+            {\n+                //!!!Melee spell damage is not yet critical, all reduced by half\n+                //Mortal Shots: 30% crit damage bonus for all ranged abilities\n+                if (lvl >= 15 && baseId != AUTO_SHOT_1)\n+                    pctbonus += 0.15f;\n+                //Marked for Death (part 2): 10% crit damage bonus for Aimed Shot, Arcane Shot, Steady Shot, Kill Shot and Chimera Shot\n+                if ((GetSpec() == BOT_SPEC_HUNTER_MARKSMANSHIP) && lvl >= 55 &&\n+                    (baseId == AIMED_SHOT_1 || baseId == ARCANE_SHOT_1 || baseId == STEADY_SHOT_1 ||\n+                    baseId == KILL_SHOT_1 || baseId == CHIMERA_SHOT_1))\n+                    pctbonus += 0.05f;\n+            }\n+\n+            //Improved Tracking: 5% bonus damage versus tracked types (all for bots)\n+            if (lvl >= 10)\n+                pctbonus += 0.05f;\n+            //Focused Fire: 2% bonus damage while pet is active\n+            if (lvl >= 15 && botPet)\n+                pctbonus += 0.02f;\n+            //Ranged Weapon Specialization: 5% bonus damage for ranged attacks\n+            if ((GetSpec() == BOT_SPEC_HUNTER_MARKSMANSHIP) && lvl >= 35)\n+                pctbonus += 0.05f;\n+            //Improved Arcane Shot: 15% bonus damage for Arcane Shot\n+            if (lvl >= 20 && baseId == ARCANE_SHOT_1)\n+                pctbonus += 0.15f;\n+            //Rapid Killing (buff): 20% bonus damage for Aimed Shot, Arcane Shot or Chimera Shot (removed in SpellHitTarget())\n+            if (lvl >= 20 && (baseId == AIMED_SHOT_1 || baseId == ARCANE_SHOT_1 || baseId == CHIMERA_SHOT_1))\n+            {\n+                if (AuraEffect const* rapi = me->GetAuraEffect(RAPID_KILLING_BUFF, 0))\n+                    if (rapi->IsAffectedOnSpell(spellInfo))\n+                        pctbonus += 0.2f;\n+            }\n+            //Barrage: 12% bonus damage for Aimed Shot, Multi-Shot or Volley\n+            if ((GetSpec() == BOT_SPEC_HUNTER_MARKSMANSHIP) && lvl >= 30 && (spellInfo->SpellFamilyFlags[0] & 0x23000))\n+                pctbonus += 0.12f;\n+            //Marked for Death (part 1): 5% bonus damage for all ranged shots on marked target\n+            if ((GetSpec() == BOT_SPEC_HUNTER_MARKSMANSHIP) && lvl >= 55 && damageinfo.target &&\n+                damageinfo.target->GetAuraEffect(SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS, SPELLFAMILY_HUNTER, 0x400, 0x0, 0x0/*, me->GetGUID()*/))\n+                pctbonus += 0.05f;\n+            //T.N.T: 6% bonus damage for Explosive Shot, Explosive Trap, Immolation Trap and Black Arrow\n+            if ((GetSpec() == BOT_SPEC_HUNTER_SURVIVAL) && lvl >= 25 &&\n+                (baseId == EXPLOSIVE_SHOT_1 || baseId == EXPLOSIVE_SHOT_PERIODIC_DUMMY_AURA ||\n+                baseId == EXPLOSIVE_TRAP_AURA_1 || baseId == IMMOLATION_TRAP_AURA_1 || baseId == BLACK_ARROW_1))\n+                pctbonus += 0.06f;\n+            //Ferocious Inspiration part 2: 9% bonus damage for Arcane Shot and Steady Shot\n+            if ((GetSpec() == BOT_SPEC_HUNTER_BEASTMASTERY) &&\n+                lvl >= 40 && (baseId == ARCANE_SHOT_1 || baseId == STEADY_SHOT_1))\n+                pctbonus += 0.09f;\n+            //Improved Steady Shot (38392): 10% bonus damage for Steady Shot\n+            if (lvl >= 50 && baseId == STEADY_SHOT_1)\n+                pctbonus += 0.1f;\n+            //Glyph of Steady Shot: 10% bonus damage for Steady Shot if affected by Serpent Sting\n+            if (lvl >= 62 && baseId == STEADY_SHOT_1 && damageinfo.target &&\n+                damageinfo.target->GetAuraEffect(SPELL_AURA_MOD_DAMAGE_FROM_CASTER, SPELLFAMILY_HUNTER, 0x4000, 0x0, 0x0/*, me->GetGUID()*/))\n+                pctbonus += 0.1f;\n+            //The Beast Within part 1: 10% bonus damage for all abilities\n+            if ((GetSpec() == BOT_SPEC_HUNTER_BEASTMASTERY) && lvl >= 50)\n+                pctbonus += 0.1f;\n+            //Sniper Training part 2: 6% bonus damage for Steady Shot, Aimed Shot, Black Arrow and Explosive Shot\n+            if ((GetSpec() == BOT_SPEC_HUNTER_SURVIVAL) && lvl >= 50 &&\n+                ((spellInfo->SpellFamilyFlags[0] & 0x20000) ||\n+                (spellInfo->SpellFamilyFlags[1] & 0x8000001) ||\n+                (spellInfo->SpellFamilyFlags[2] & 0x200)))\n+            {\n+                if (Aura const* snip = me->GetAura(SNIPER_TRAINING_BUFF))\n+                {\n+                    if (snip->GetEffect(0)->IsAffectedOnSpell(spellInfo) ||\n+                        snip->GetEffect(1)->IsAffectedOnSpell(spellInfo))\n+                        pctbonus += 0.06f;\n+                }\n+            }\n+            //Improved Steady Shot part 1: 15% bonus damage for Steady Shot, Aimed Shot, Arcane Arrow and Chimera Shot\n+            if (baseId == AIMED_SHOT_1 || baseId == ARCANE_SHOT_1 || baseId == CHIMERA_SHOT_1)\n+            {\n+                if (AuraEffect const* stea = me->GetAuraEffect(IMPROVED_STEADY_SHOT_BUFF, 0))\n+                    if (stea->IsAffectedOnSpell(spellInfo))\n+                        pctbonus += 0.15f;\n+            }\n+\n+            damage = int32(fdamage * (1.0f + pctbonus));\n+        }\n+\n+        void ApplyClassDamageMultiplierSpell(int32& damage, SpellNonMeleeDamage& /*damageinfo*/, SpellInfo const* spellInfo, WeaponAttackType /*attackType*/, bool /*iscrit*/) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+            float fdamage = float(damage);\n+            float flat_mod = 0.f;\n+\n+            //2) apply bonus damage mods\n+            float pctbonus = 0.0f;\n+            //if (iscrit)\n+            //{\n+            //    //!!!spell damage is not yet critical and will be multiplied by 1.5\n+            //    //so we should put here bonus damage mult /1.5\n+            //    //Lava Flows (part 1): 24% additional crit damage bonus for Lava Burst\n+            //    if (lvl >= 50 && spellId == GetSpell(LAVA_BURST_1))\n+            //        pctbonus += 0.16f;\n+            //}\n+            //Trap Mastery part 2: 30% bonus damage for Immolation Trap, Explosive Trap and Black Arrow\n+            if (lvl >= 15 && (baseId == IMMOLATION_TRAP_AURA_1 || baseId == EXPLOSIVE_TRAP_AURA_1 || baseId == BLACK_ARROW_1))\n+                pctbonus += 0.3f;\n+            //T.N.T: 6% bonus damage for Explosive Shot, Explosive Trap, Immolation Trap and Black Arrow\n+            if ((GetSpec() == BOT_SPEC_HUNTER_SURVIVAL) && lvl >= 25 &&\n+                (baseId == EXPLOSIVE_SHOT_1 || baseId == EXPLOSIVE_SHOT_PERIODIC_DUMMY_AURA ||\n+                baseId == EXPLOSIVE_TRAP_AURA_1 || baseId == IMMOLATION_TRAP_AURA_1 || baseId == BLACK_ARROW_1))\n+                pctbonus += 0.06f;\n+            //The Beast Within part 1: 10% bonus damage for all abilities\n+            if ((GetSpec() == BOT_SPEC_HUNTER_BEASTMASTERY) && lvl >= 50)\n+                pctbonus += 0.1f;\n+\n+            damage = int32(fdamage * (1.0f + pctbonus) + flat_mod);\n+        }\n+\n+        void ApplyClassSpellCostMods(SpellInfo const* spellInfo, int32& cost) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            float fcost = float(cost);\n+            int32 flatbonus = 0;\n+            float pctbonus = 0.0f;\n+\n+            //percent mods\n+            //100% mods\n+            //Improved Hunter's Mark: -100% mana cost for Hunter's Mark\n+            if (lvl >= 15 && baseId == HUNTERS_MARK_1)\n+                pctbonus += 1.0f;\n+            //Lock and Load: mana cost\n+            if (baseId == ARCANE_SHOT_1 || baseId == EXPLOSIVE_SHOT_1)\n+            {\n+                AuraEffect const* lock = me->GetAuraEffect(LOCK_AND_LOAD_BUFF, 0);\n+                if (lock && lock->IsAffectedOnSpell(spellInfo))\n+                    pctbonus += 1.0f;\n+            }\n+\n+            //Improved Mend Pet: -20% mana cost for Mend Pet\n+            //Improved Mend Pet (23560) part 3\n+            if (lvl >= 25 && baseId == MEND_PET_1)\n+                pctbonus += 0.5f;\n+            //Efficiency: -15% mana cost for Stings and Shots\n+            if ((GetSpec() == BOT_SPEC_HUNTER_MARKSMANSHIP) && lvl >= 25 &&\n+                ((spellInfo->SpellFamilyFlags[0] & 0x7FA00) ||\n+                (spellInfo->SpellFamilyFlags[1] & 0x88801081) ||\n+                (spellInfo->SpellFamilyFlags[2] & 0x1)))\n+                pctbonus += 0.15f;\n+            //Resourcefulness: -60% mana cost for Traps, melee spells and Black Arrow\n+            if ((GetSpec() == BOT_SPEC_HUNTER_SURVIVAL) && lvl >= 35 &&\n+                ((spellInfo->SpellFamilyFlags[0] & 0xDE) ||\n+                (spellInfo->SpellFamilyFlags[1] & 0x84000)))\n+                pctbonus += 0.6f;\n+            //Glyph of Volley: -20% mana cost for Volley\n+            if (lvl >= 40 && baseId == VOLLEY_1)\n+                pctbonus += 0.2f;\n+            //Master Marksman: -25% mana cost for Steady Shot, Aimed Shot and Chimera Shot\n+            if ((GetSpec() == BOT_SPEC_HUNTER_MARKSMANSHIP) &&\n+                lvl >= 45 && (baseId == STEADY_SHOT_1 || baseId == AIMED_SHOT_1 || baseId == CHIMERA_SHOT_1))\n+                pctbonus += 0.25f;\n+            //Improved Steady Shot part 2: -20% mana cost for Steady Shot, Aimed Shot, Arcane Arrow and Chimera Shot\n+            if (baseId == AIMED_SHOT_1 || baseId == ARCANE_SHOT_1 || baseId == CHIMERA_SHOT_1)\n+            {\n+                if (AuraEffect const* stea = me->GetAuraEffect(IMPROVED_STEADY_SHOT_BUFF, 1))\n+                    if (stea->IsAffectedOnSpell(spellInfo))\n+                        pctbonus += 0.2f;\n+            }\n+\n+            //flat mods\n+            //!1 rage = 10 pts!\n+            //Improved Heroic Strike: -3 rage cost for Heroic Strike\n+            //if (lvl >= 10 && baseId == HEROIC_STRIKE_1)\n+            //    flatbonus += 30;\n+\n+            //cost can be < 0\n+            cost = int32(fcost * (1.0f - pctbonus)) - flatbonus;\n+        }\n+\n+        void ApplyClassSpellNotLoseCastTimeMods(SpellInfo const* spellInfo, int32& delayReduce) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchoolMask schools = spellInfo->GetSchoolMask();\n+            uint8 lvl = me->GetLevel();\n+            int32 reduceBonus = 0;\n+\n+            if (lvl >= 10 && baseId == STEADY_SHOT_1)\n+                reduceBonus += 70;\n+\n+            if (lvl >= 15 && baseId == SCARE_BEAST_1)\n+                reduceBonus += 75;\n+\n+            if (GetSpec() == BOT_SPEC_HUNTER_MARKSMANSHIP && lvl >= 40 && baseId == VOLLEY_1)\n+                reduceBonus += 100;\n+\n+            delayReduce += reduceBonus;\n+        }\n+\n+        void ApplyClassSpellCooldownMods(SpellInfo const* spellInfo, uint32& cooldown) const override\n+        {\n+            //cooldown is in milliseconds\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            int32 timebonus = 0;\n+            float pctbonus = 0.0f;\n+\n+            //pct mods\n+            //Glyph of Rapid Charge: -7% cooldown for Charge\n+            //if (lvl >= 40 && spellId == GetSpell(CHARGE_1))\n+            //    pctbonus += 0.07f;\n+\n+            //flat mods\n+            //Survival Tactics: -4 sec cooldown for Disengage\n+            //Glyph of Disengage: -5 sec cooldown for Disengage\n+            if (lvl >= 20 && baseId == DISENGAGE_1)\n+                timebonus += (GetSpec() == BOT_SPEC_HUNTER_SURVIVAL) ? 9000 : 5000;\n+            //Glyph of Feign Death: -5 sec cooldown for Feign Death\n+            //Improved Feign Death (24432): -2 sec cooldown for Feign Death\n+            if (lvl >= 30 && baseId == FEIGN_DEATH_1)\n+                timebonus += 7000;\n+            //Tranquilizing Shot Cooldown reduction (61255): -2 sec cooldown for Tranquilizing Shot\n+            if (lvl >= 60 && baseId == TRANQ_SHOT_1)\n+                timebonus += 2000;\n+            //Glyph of Deterrence: -10 sec cooldown for Deterrence\n+            if (lvl >= 60 && baseId == DETERRENCE_1)\n+                timebonus += 10000;\n+            //Glyph of Chimera Shot: -1 sec cooldown for Chimera Shot\n+            if (lvl >= 60 && baseId == CHIMERA_SHOT_1)\n+                timebonus += 1000;\n+\n+            cooldown = std::max<int32>((float(cooldown) * (1.0f - pctbonus)) - timebonus, 0);\n+        }\n+\n+        void ApplyClassSpellCategoryCooldownMods(SpellInfo const* spellInfo, uint32& cooldown) const override\n+        {\n+            //cooldown is in milliseconds\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+            int32 timebonus = 0;\n+            float pctbonus = 0.0f;\n+\n+            //Lock and Load: cooldown\n+            if (baseId == ARCANE_SHOT_1 || baseId == EXPLOSIVE_SHOT_1)\n+            {\n+                AuraEffect const* lock = me->GetAuraEffect(LOCK_AND_LOAD_BUFF, 0);\n+                if (lock && lock->IsAffectedOnSpell(spellInfo))\n+                    pctbonus += 1.0f;\n+            }\n+\n+            //Rapid Killing part 1: -2 min cooldown for Rapid Fire\n+            if ((GetSpec() == BOT_SPEC_HUNTER_MARKSMANSHIP) && baseId == RAPID_FIRE_1)\n+                timebonus += 120000;\n+            //Glyph of Aimed Shot: -2 sec cooldown for Aimed Shot\n+            if (baseId == AIMED_SHOT_1)\n+                timebonus += 2000;\n+            //Glyph of Multi-Shot: -1 sec cooldown for Multi-Shot\n+            //Improved Multi-Shot (44292): -1 sec cooldown for Multi-Shot\n+            if (baseId == MULTISHOT_1)\n+                timebonus += 2000;\n+            //Trap Cooldown (37481): -4 sec cd for Traps\n+            //Trap Cooldown Reduction: -2 sec cd for Traps\n+            if (spellInfo->SpellFamilyFlags[0] & 0x80)\n+                timebonus += 6000;\n+            //Resourcefulness: -6 sec cd for Traps and Black Arrow\n+            if ((GetSpec() == BOT_SPEC_HUNTER_SURVIVAL) && lvl >= 35 && (spellInfo->SpellFamilyFlags[0] & 0x80))\n+                timebonus += 6000;\n+            //Catlike Reflexes part 3: -30 sec cd for Kill Command\n+            if ((GetSpec() == BOT_SPEC_HUNTER_BEASTMASTERY) && lvl >= 40 && (spellInfo->SpellFamilyFlags[1] & 0x800))\n+                timebonus += 30000;\n+            //Glyph of Kill Shot: -6 sec cooldown for Kill Shot\n+            if (lvl >= 40 && baseId == KILL_SHOT_1)\n+                timebonus += 6000;\n+\n+            cooldown = std::max<int32>((float(cooldown) * (1.0f - pctbonus)) - timebonus, 0);\n+        }\n+\n+        void ApplyClassSpellRadiusMods(SpellInfo const* spellInfo, float& radius) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            //uint8 lvl = me->GetLevel();\n+            float flatbonus = 0.0f;\n+            float pctbonus = 0.0f;\n+\n+            //pct mods\n+            ////Holy Reach\n+            //if (lvl >= 25 && ((spellInfo->SpellFamilyFlags[0] & 0x18400200) || (spellInfo->SpellFamilyFlags[2] & 0x4)))\n+            //    pctbonus += 0.2f;\n+\n+            //flat mods\n+            //Glyph of Frost Trap\n+            if (baseId == FROST_TRAP_AURA)\n+                flatbonus += 2.f;\n+            //Glyph of the Pack\n+            if (baseId == ASPECT_OF_THE_PACK_1)\n+                flatbonus += 15.f;\n+\n+            radius = radius * (1.0f + pctbonus) + flatbonus;\n+        }\n+\n+        void ApplyClassSpellRangeMods(SpellInfo const* spellInfo, float& maxrange) const override\n+        {\n+            //uint32 spellId = spellInfo->Id;\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            float flatbonus = 0.0f;\n+            float pctbonus = 0.0f;\n+\n+            //pct mods\n+            //Improved Mend Pet (23560) part 1\n+            if (lvl >= 25 && baseId == MEND_PET_1)\n+                pctbonus += 0.5f;\n+\n+            //flat mods\n+            //Hawk Eye: +6 yd range for Ranged Abilities\n+            if (lvl >= 10 &&\n+                ((spellInfo->SpellFamilyFlags[0] & 0x7FA01) ||\n+                (spellInfo->SpellFamilyFlags[1] & 0x88801081) ||\n+                (spellInfo->SpellFamilyFlags[2] & 0x401)))\n+                flatbonus += 6.f;\n+            //Glyph of Scatter Shot\n+            if (lvl >= 20 && baseId == SCATTER_SHOT_1)\n+                flatbonus += 3.f;\n+\n+            maxrange = maxrange * (1.0f + pctbonus) + flatbonus;\n+        }\n+\n+        void ApplyClassSpellChanceOfSuccessMods(SpellInfo const* spellInfo, float& chance) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+\n+            //Improved Aspect of the Hawk: 10% chance\n+            if (lvl >= 10 && (baseId == ASPECT_OF_THE_HAWK_1 || baseId == ASPECT_OF_THE_DRAGONHAWK_1))\n+                chance += 10.f;\n+        }\n+\n+        void ApplyClassEffectMods(SpellInfo const* spellInfo, uint8 effIndex, float& value) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            float pctbonus = 1.0f;\n+\n+            //Improved Mend Pet (23560) part 2\n+            if (baseId == MEND_PET_1 && effIndex == EFFECT_0)\n+                pctbonus *= 1.1f;\n+\n+            value = value * pctbonus;\n+        }\n+\n+        void OnClassSpellGo(SpellInfo const* spellInfo) override\n+        {\n+            //uint32 spellId = spellInfo->Id;\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+\n+            //Rapid Killing: use up buff manually\n+            if (baseId == AIMED_SHOT_1 || baseId == ARCANE_SHOT_1 || baseId == CHIMERA_SHOT_1)\n+            {\n+                if (AuraEffect const* rapi = me->GetAuraEffect(RAPID_KILLING_BUFF, 0))\n+                    if (rapi->IsAffectedOnSpell(spellInfo))\n+                        me->RemoveAura(RAPID_KILLING_BUFF);\n+            }\n+            //Glyph of Arcane Shot\n+            if (baseId == ARCANE_SHOT_1)\n+            {\n+                Unit const* victim = me->GetVictim();\n+                if (victim &&\n+                    (victim->GetAuraEffect(SPELL_AURA_MOD_DAMAGE_FROM_CASTER, SPELLFAMILY_HUNTER, 0x4000, 0x0, 0x0, me->GetGUID()) ||\n+                    victim->GetAuraEffect(SPELL_AURA_PERIODIC_MANA_LEECH, SPELLFAMILY_HUNTER, 0x0, 0x80, 0x0, me->GetGUID()) ||\n+                    victim->GetAuraEffect(SPELL_AURA_MOD_HIT_CHANCE, SPELLFAMILY_HUNTER, 0x8000, 0x0, 0x0, me->GetGUID()) ||\n+                    victim->GetAuraEffect(SPELL_AURA_MOD_STUN, SPELLFAMILY_HUNTER, 0x0, 0x1000, 0x0, me->GetGUID()) ||\n+                    victim->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_HUNTER, 0x0, 0x100, 0x0, me->GetGUID())))\n+                {\n+                    int32 cost = spellInfo->CalcPowerCost(me, spellInfo->GetSchoolMask());\n+                    //CastSpellExtraArgs args(true);\n+                    //args.AddSpellBP0(cost);\n+                    //me->CastSpell(me, GLYPH_OF_ARCANE_SHOT_ENERGIZE, args);\n+                    me->CastCustomSpell(me, GLYPH_OF_ARCANE_SHOT_ENERGIZE, &cost, nullptr, nullptr, true);\n+                }\n+            }\n+            //Lock and Load: consume charge\n+            if (baseId == ARCANE_SHOT_1 || baseId == EXPLOSIVE_SHOT_1)\n+            {\n+                AuraEffect const* lock = me->GetAuraEffect(LOCK_AND_LOAD_BUFF, 0);\n+                if (lock && lock->IsAffectedOnSpell(spellInfo))\n+                    lock->GetBase()->DropCharge();\n+            }\n+            if (baseId == READINESS_1)\n+            {\n+                for (auto& [rank1_id, spell] : GetSpellMap())\n+                {\n+                    if (rank1_id == spellInfo->Id || rank1_id == BESTIAL_WRATH_1 || rank1_id == GIFT_OF_NAARU_HUNTER)\n+                        continue;\n+                    if (spell.spellId != 0 && spell.cooldown > 0)\n+                    {\n+                        SpellInfo const* cdInfo = sSpellMgr->GetSpellInfo(rank1_id);\n+                        if (cdInfo && cdInfo->SpellFamilyName == SPELLFAMILY_HUNTER && cdInfo->GetRecoveryTime() > 0)\n+                            spell.cooldown = 0;\n+                    }\n+                }\n+            }\n+            //Improved Steady Shot: consume buff\n+            if (baseId == AIMED_SHOT_1 || baseId == ARCANE_SHOT_1 || baseId == CHIMERA_SHOT_1)\n+            {\n+                if (AuraEffect const* stea = me->GetAuraEffect(IMPROVED_STEADY_SHOT_BUFF, 0))\n+                    if (stea->IsAffectedOnSpell(spellInfo))\n+                        me->RemoveAurasDueToSpell(IMPROVED_STEADY_SHOT_BUFF);\n+            }\n+\n+            //Aspect helper\n+            switch (baseId)\n+            {\n+                case ASPECT_OF_THE_MONKEY_1:\n+                case ASPECT_OF_THE_HAWK_1:\n+                case ASPECT_OF_THE_CHEETAH_1:\n+                case ASPECT_OF_THE_VIPER_1:\n+                case ASPECT_OF_THE_BEAST_1:\n+                case ASPECT_OF_THE_PACK_1:\n+                case ASPECT_OF_THE_WILD_1:\n+                case ASPECT_OF_THE_DRAGONHAWK_1:\n+                    _myaspect = baseId;\n+                    break;\n+                default:\n+                    break;\n+            }\n+        }\n+\n+        void SpellHitTarget(Unit* wtarget, SpellInfo const* spell) override\n+        {\n+            Unit* target = wtarget->ToUnit();\n+            if (!target)\n+                return;\n+\n+            if (target == me)\n+                return;\n+\n+            uint32 baseId = spell->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+\n+            if (baseId == HUNTERS_MARK_1)\n+            {\n+                //Hunter's Mark helper\n+                if (AuraEffect* mark = target->GetAuraEffect(spell->Id, 1, me->GetGUID()))\n+                {\n+                    //Glyph of Hunter's Mark: +20% effect\n+                    //Improved Hunter's Mark: +30% effect\n+                    if (lvl >= 15)\n+                        mark->ChangeAmount(mark->GetAmount() + mark->GetAmount() / 2);\n+                    else if (lvl >= 10)\n+                        mark->ChangeAmount(mark->GetAmount() * 13 / 10);\n+                }\n+            }\n+            //Improved Stings part 1: +30% damage\n+            if ((GetSpec() == BOT_SPEC_HUNTER_MARKSMANSHIP) && lvl >= 25 && (baseId == SERPENT_STING_1 || baseId == WYVERN_STING_DOT_AURA_1))\n+            {\n+                if (AuraEffect* stin = target->GetAuraEffect(spell->Id, 0, me->GetGUID()))\n+                {\n+                    stin->ChangeAmount(stin->GetAmount() * 13 / 10);\n+                }\n+            }\n+            //Improved Stings part 2: +30% effect: not working?\n+            //Trap Mastery part 1\n+            if (lvl >= 15 && (baseId == FROST_TRAP_AURA || baseId == FREEZING_TRAP_AURA_1))\n+            {\n+                if (Aura* freez = target->GetAura(spell->Id, me->GetGUID()))\n+                {\n+                    int32 dur = freez->GetDuration() * 13 / 10;\n+                    freez->SetDuration(dur);\n+                    freez->SetMaxDuration(dur);\n+                }\n+            }\n+            if (lvl >= 16 && baseId == IMMOLATION_TRAP_AURA_1)\n+            {\n+                if (AuraEffect* immo = target->GetAuraEffect(spell->Id, 0, me->GetGUID()))\n+                {\n+                    //Glyph of Immolation Trap: -6 sec duration, +100% effect\n+                    immo->ChangeAmount(immo->GetAmount() * 2);\n+                    int32 dur = immo->GetBase()->GetDuration() - 6000;\n+                    immo->GetBase()->SetDuration(dur);\n+                    immo->GetBase()->SetMaxDuration(dur);\n+                }\n+            }\n+            if (lvl >= 15 && baseId == SERPENT_STING_1)\n+            {\n+                if (Aura* sting = target->GetAura(spell->Id, me->GetGUID()))\n+                {\n+                    //Glyph of Serpent Sting: +6 sec duration\n+                    //Improved Serpent Sting (24467): +3 sec duration\n+                    int32 dur = sting->GetDuration() + 6000;\n+                    if (lvl >= 60)\n+                        dur += 3000;\n+                    sting->SetDuration(dur);\n+                    sting->SetMaxDuration(dur);\n+                }\n+            }\n+            if (lvl >= 30 && baseId == WING_CLIP_1)\n+            {\n+                //zzzOLD Improved Wing Clip (only on creatures): 30% to root target with Wing Clip\n+                //normal creatures are rooted for 10 sec, elites+ for 6 sec\n+                if (target->IsCreature())\n+                {\n+                    if (urand(1,100) <= 30)\n+                    {\n+                        uint32 clip = target->ToCreature()->GetCreatureTemplate()->rank == CREATURE_ELITE_NORMAL ? IMPROVED_WING_CLIP_NORMAL : IMPROVED_WING_CLIP_EX;\n+                        me->CastSpell(target, clip, true);\n+                    }\n+                }\n+            }\n+            if (lvl >= 10 && baseId == CONCUSSIVE_SHOT_1)\n+            {\n+                //Improved Concussion Shot rank 2: 2 sec increased daze duration\n+                if (Aura* concus = target->GetAura(spell->Id, me->GetGUID()))\n+                {\n+                    int32 dur = concus->GetDuration() + 2000;\n+                    concus->SetDuration(dur);\n+                    concus->SetMaxDuration(dur);\n+                }\n+\n+                //zzzOLD Improved Concussion Shot: chance to stun target for 3 sec\n+                if (urand(1,100) <= 15)\n+                {\n+                    me->CastSpell(target, IMPROVED_CONCUSSION, true);\n+                }\n+            }\n+            if ((GetSpec() == BOT_SPEC_HUNTER_MARKSMANSHIP) && lvl >= 50 && baseId == STEADY_SHOT_1)\n+            {\n+                //Improved Steady Shot: 15% chance\n+                if (urand(1,100) <= 15)\n+                {\n+                    me->CastSpell(me, IMPROVED_STEADY_SHOT_BUFF, true);\n+                }\n+            }\n+\n+            OnSpellHitTarget(target, spell);\n+        }\n+\n+        void SpellHit(Unit* wcaster, SpellInfo const* spell) override\n+        {\n+            Unit* caster = wcaster->ToUnit();\n+            if (!caster)\n+                return;\n+\n+            uint32 baseId = spell->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+\n+            //Feign Death should always clear combat on bots\n+            if (baseId == FEIGN_DEATH_1 && me->GetMap()->IsDungeon())\n+                me->CombatStop(false);\n+\n+            //Rapid Recuperation (Rapid Killing) hackfix: trigger 2% energize\n+            if (baseId == RAPID_RECUPERATION_ENERGIZE)\n+            {\n+                me->CastSpell(me, RAPID_RECUPERATION_ENERGIZE_PCT_1, true);\n+            }\n+            //Rapid Recuperation (Rapid Fire): match duration\n+            if (baseId == RAPID_RECUPERATION_BUFF && GetSpell(RAPID_FIRE_1))\n+            {\n+                if (Aura const* rapi = me->GetAura(GetSpell(RAPID_FIRE_1)))\n+                {\n+                    if (Aura* recu = me->GetAura(spell->Id))\n+                    {\n+                        uint32 dur = rapi->GetDuration();\n+                        recu->SetDuration(dur);\n+                        recu->SetMaxDuration(dur);\n+                    }\n+                }\n+            }\n+            //Rapid Recuperation (Rapid Fire)\n+            if ((GetSpec() == BOT_SPEC_HUNTER_MARKSMANSHIP) && baseId == RAPID_FIRE_1 && me->GetLevel() >= 45)\n+            {\n+                me->CastSpell(me, RAPID_RECUPERATION_BUFF, true);\n+            }\n+            //Rapid Recuperation (Rapid Killing)\n+            if ((GetSpec() == BOT_SPEC_HUNTER_MARKSMANSHIP) && baseId == RAPID_KILLING_BUFF && me->GetLevel() >= 45)\n+            {\n+                me->CastSpell(me, RAPID_RECUPERATION_BUFF2, true);\n+            }\n+            if (baseId == RAPID_FIRE_1 && lvl >= 26)\n+            {\n+                //Rapid Fire (id 28755): 4 sec increased duration\n+                //Glyph of Rapid Fire: +8% haste\n+                if (AuraEffect* rapi = me->GetAuraEffect(spell->Id, 0, me->GetGUID()))\n+                {\n+                    rapi->ChangeAmount(rapi->GetAmount() + 8);\n+\n+                    uint32 dur = rapi->GetBase()->GetDuration() + 4000;\n+                    rapi->GetBase()->SetDuration(dur);\n+                    rapi->GetBase()->SetMaxDuration(dur);\n+                }\n+            }\n+            if (baseId == QUICK_SHOTS_BUFF)\n+            {\n+                if (AuraEffect* quic = me->GetAuraEffect(QUICK_SHOTS_BUFF, 0))\n+                {\n+                    //base 15% haste\n+                    int32 newAmount = quic->GetAmount() + 15;\n+                    //Glyph of the Hawk: +6% effect flat\n+                    if (lvl >= 15)\n+                        newAmount += 6;\n+\n+                    quic->ChangeAmount(newAmount);\n+                }\n+            }\n+            if ((baseId == ASPECT_OF_THE_CHEETAH_1 || baseId == ASPECT_OF_THE_PACK_1) && caster == me && lvl >= 20)\n+            {\n+                //Pathfinding: +8% increased effect\n+                if (AuraEffect* spee = me->GetAuraEffect(spell->Id, 0, me->GetGUID()))\n+                {\n+                    spee->ChangeAmount(spee->GetAmount() + 8);\n+                }\n+            }\n+            if ((baseId == ASPECT_OF_THE_MONKEY_1 || baseId == ASPECT_OF_THE_DRAGONHAWK_MONKEY) && lvl >= 15)\n+            {\n+                //Improved Aspect of The Monkey: +6% dodge chance\n+                if (AuraEffect* monk = me->GetAuraEffect(spell->Id, 0, me->GetGUID()))\n+                {\n+                    monk->ChangeAmount(monk->GetAmount() + 6);\n+                }\n+            }\n+            //Aspect Mastery\n+            if (lvl >= 20)\n+            {\n+                if (baseId == ASPECT_OF_THE_VIPER_1)\n+                {\n+                    if (AuraEffect* vipe = me->GetAuraEffect(spell->Id, 1, me->GetGUID()))\n+                    {\n+                        //part 1: 10% reduced damage penalty\n+                        vipe->ChangeAmount(vipe->GetAmount() + 10);\n+                    }\n+                }\n+                if (baseId == ASPECT_OF_THE_MONKEY_1 || baseId == ASPECT_OF_THE_DRAGONHAWK_MONKEY)\n+                {\n+                    if (AuraEffect* monk = me->GetAuraEffect(spell->Id, 1, me->GetGUID()))\n+                    {\n+                        //part 2: 5% reduced damage\n+                        monk->ChangeAmount(monk->GetAmount() - 5);\n+                    }\n+                }\n+                if (baseId == ASPECT_OF_THE_HAWK_1 || baseId == ASPECT_OF_THE_DRAGONHAWK_1)\n+                {\n+                    if (AuraEffect* hawk = me->GetAuraEffect(spell->Id, 0, me->GetGUID()))\n+                    {\n+                        //part 3: 30% attack power bonus\n+                        hawk->ChangeAmount(hawk->GetAmount() * 13 / 10);\n+                    }\n+                }\n+            }\n+\n+            OnSpellHit(caster, spell);\n+        }\n+\n+        void OnBotDamageDealt(Unit* victim, uint32 damage, CleanDamage const* cleanDamage, DamageEffectType damagetype, SpellInfo const* /*spellInfo*/) override\n+        {\n+            if (botPet && victim != me && victim != botPet && damage > 0 && cleanDamage && cleanDamage->hitOutCome == MELEE_HIT_CRIT &&\n+                (damagetype == DIRECT_DAMAGE || damagetype == SPELL_DIRECT_DAMAGE) && me->GetLevel() >= 20)\n+            {\n+                //Go for the Throat: energize pet\n+                me->EnergizeBySpell(botPet, GO_FOR_THE_THROAT_ENERGIZE, 50, POWER_FOCUS);\n+                //Frenzy hack: proc from hunter's crits\n+                if (me->GetLevel() >= 35)\n+                    botPet->CastSpell(botPet, FRENZY_BUFF, true);\n+            }\n+        }\n+\n+        void DamageDealt(Unit* victim, uint32& damage, DamageEffectType damageType, SpellSchoolMask damageSchoolMask) override\n+        {\n+            bot_ai::DamageDealt(victim, damage, damageType, damageSchoolMask);\n+        }\n+\n+        void DamageTaken(Unit* u, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellSchoolMask /*schoolMask*/) override\n+        {\n+            if (!u)\n+                return;\n+            if (!u->IsInCombat() && !me->IsInCombat())\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void OwnerAttackedBy(Unit* u) override\n+        {\n+            if (!u)\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void SummonBotPet()\n+        {\n+            if (botPet)\n+                UnsummonAll(false);\n+\n+            if (me->GetLevel() < 10)\n+                return;\n+\n+            if (myPetType == BOT_PET_INVALID) //disabled\n+                return;\n+\n+            if (petSummonTimer > GetLastDiff())\n+                return;\n+\n+            uint32 entry;\n+\n+            if (myPetType)\n+                entry = myPetType;\n+            else if (!IAmFree())\n+            {\n+                if ((master->GetGroup() && master->GetGroup()->isRaidGroup()) || master->GetNpcBotsCount() >= 10)\n+                    entry = BOT_PET_WOLF; //raid pet\n+                else if (!IsMeleeClass(master->GetClass()))\n+                    entry = urand(BOT_PET_TENACITY_START, BOT_PET_TENACITY_END);\n+                else if (sWorld->IsFFAPvPRealm() || sWorld->IsPvPRealm())\n+                    entry = urand(BOT_PET_CUNNING_START, BOT_PET_CUNNING_END);\n+                else\n+                    entry = urand(BOT_PET_HUNTER_START, BOT_PET_HUNTER_END_GENERAL);\n+            }\n+            else\n+                entry = urand(BOT_PET_HUNTER_START, BOT_PET_HUNTER_END_GENERAL);\n+\n+            //ensurance\n+            if (entry < BOT_PET_HUNTER_START || entry > BOT_PET_HUNTER_END_EXOTIC ||\n+                (entry >= BOT_PET_EXOTIC_START && _spec != BOT_SPEC_HUNTER_BEASTMASTERY))\n+                entry = 0;\n+\n+            myPetType = entry;\n+\n+            //try next time\n+            if (!myPetType)\n+                return;\n+\n+            petSummonTimer = 10000;\n+            ResetSpellCooldown(KINDRED_SPIRITS_PET);\n+            ResetSpellCooldown(SPIRIT_BOND_PET);\n+\n+            Position pos;\n+\n+            me->CastSpell(me, CALL_PET_VISUAL, true);\n+            Creature* myPet = me->SummonCreature(myPetType, *me, TEMPSUMMON_CORPSE_DESPAWN);\n+            me->GetNearPoint(myPet, pos.m_positionX, pos.m_positionY, pos.m_positionZ, 0.f, 0, me->GetOrientation() + M_PI / 2);\n+            myPet->GetMotionMaster()->MovePoint(me->GetMapId(), pos);\n+            myPet->SetCreator(master);\n+            myPet->SetOwnerGUID(me->GetGUID());\n+            myPet->SetFaction(master->GetFaction());\n+            myPet->SetControlledByPlayer(!IAmFree());\n+            myPet->SetPvP(me->IsPvP());\n+            myPet->SetByteValue(UNIT_FIELD_BYTES_2, 1, master->GetByteValue(UNIT_FIELD_BYTES_2, 1));\n+\n+            //fix scale\n+            switch (myPetType)\n+            {\n+                case BOT_PET_RAVAGER:\n+                case BOT_PET_WASP:\n+                case BOT_PET_TEROMOTH:\n+                case BOT_PET_SCORPID:\n+                case BOT_PET_TURTLE:\n+                case BOT_PET_BEAR:\n+                case BOT_PET_WARPSTALKER:\n+                case BOT_PET_COREHOUND:\n+                    myPet->SetObjectScale(0.75f);\n+                    break;\n+                case BOT_PET_CHIMAERA:\n+                    myPet->SetObjectScale(0.67f);\n+                    break;\n+                case BOT_PET_RAPTOR:\n+                case BOT_PET_DEVILSAUR:\n+                case BOT_PET_RHINO:\n+                    myPet->SetObjectScale(0.5f);\n+                    break;\n+                default:\n+                    break;\n+            }\n+\n+            botPet = myPet;\n+        }\n+\n+        void UnsummonAll(bool savePets = true) override\n+        {\n+            UnsummonPet(savePets);\n+        }\n+\n+        void SummonedCreatureDies(Creature* /*summon*/, Unit* /*killer*/) override\n+        {\n+            //BOT_LOG_ERROR(\"entities.unit\", \"SummonedCreatureDies: %s's %s\", me->GetName().c_str(), summon->GetName().c_str());\n+            //if (summon == botPet)\n+            //    botPet = nullptr;\n+        }\n+\n+        void SummonedCreatureDespawn(Creature* summon) override\n+        {\n+            //all hunter bot pets despawn at death or manually (gossip, teleport, etc.)\n+            //BOT_LOG_ERROR(\"entities.unit\", \"SummonedCreatureDespawn: %s's %s\", me->GetName().c_str(), summon->GetName().c_str());\n+            if (summon == botPet)\n+            {\n+                petSummonTimer = 10000;\n+                botPet = nullptr;\n+            }\n+        }\n+\n+        float GetSpellAttackRange(bool longRange) const override\n+        {\n+            return longRange ? CalcSpellMaxRange(AUTO_SHOT_1) : 25.f;\n+        }\n+\n+        uint32 GetAIMiscValue(uint32 data) const override\n+        {\n+            switch (data)\n+            {\n+                case BOTAI_MISC_PET_TYPE:\n+                    return myPetType;\n+                case BOTAI_MISC_PET_AVAILABLE_1:\n+                    return BOT_PET_WOLF;\n+                case BOTAI_MISC_PET_AVAILABLE_2:\n+                    return BOT_PET_CUNNING_START;\n+                case BOTAI_MISC_PET_AVAILABLE_3:\n+                    return BOT_PET_FEROCITY_START;\n+                case BOTAI_MISC_PET_AVAILABLE_4:\n+                    return BOT_PET_TENACITY_START;\n+                case BOTAI_MISC_PET_AVAILABLE_5:\n+                    return _spec == BOT_SPEC_HUNTER_BEASTMASTERY && me->GetLevel() >= 80 ? BOT_PET_SILITHID : 0;\n+                case BOTAI_MISC_PET_AVAILABLE_6:\n+                    return _spec == BOT_SPEC_HUNTER_BEASTMASTERY && me->GetLevel() >= 80 ? BOT_PET_CHIMAERA : 0;\n+                case BOTAI_MISC_PET_AVAILABLE_7:\n+                    return _spec == BOT_SPEC_HUNTER_BEASTMASTERY && me->GetLevel() >= 80 ? BOT_PET_SPIRITBEAST : 0;\n+                case BOTAI_MISC_PET_AVAILABLE_8:\n+                    return _spec == BOT_SPEC_HUNTER_BEASTMASTERY && me->GetLevel() >= 80 ? BOT_PET_COREHOUND : 0;\n+                case BOTAI_MISC_PET_AVAILABLE_9:\n+                    return _spec == BOT_SPEC_HUNTER_BEASTMASTERY && me->GetLevel() >= 80 ? BOT_PET_DEVILSAUR : 0;\n+                case BOTAI_MISC_PET_AVAILABLE_10:\n+                    return _spec == BOT_SPEC_HUNTER_BEASTMASTERY && me->GetLevel() >= 80 ? BOT_PET_RHINO : 0;\n+                case BOTAI_MISC_PET_AVAILABLE_11:\n+                    return _spec == BOT_SPEC_HUNTER_BEASTMASTERY && me->GetLevel() >= 80 ? BOT_PET_WORM : 0;\n+                case BOTAI_MISC_AURA_TYPE:\n+                    return _myaspect;\n+                    break;\n+                default:\n+                    return 0;\n+            }\n+        }\n+\n+        void SetAIMiscValue(uint32 data, uint32 value) override\n+        {\n+            switch (data)\n+            {\n+                case BOTAI_MISC_PET_TYPE:\n+                    myPetType = value;\n+                    UnsummonAll(false);\n+                    break;\n+                default:\n+                    break;\n+            }\n+\n+            bot_ai::SetAIMiscValue(data, value);\n+        }\n+\n+        void Reset() override\n+        {\n+            UnsummonAll(false);\n+\n+            trapTimer = 0;\n+            stingTimer = 0;\n+            aspectTimer = 0;\n+            flareTimer = 0;\n+            misdirectionTimer = 0;\n+            checkMendTimer = 0;\n+\n+            petSummonTimer = 5000;\n+\n+            _myaspect = 0;\n+\n+            DefaultInit();\n+        }\n+\n+        void ReduceCD(uint32 diff) override\n+        {\n+            if (trapTimer > diff)                   trapTimer -= diff;\n+            if (stingTimer > diff)                  stingTimer -= diff;\n+            if (aspectTimer > diff)                 aspectTimer -= diff;\n+            if (flareTimer > diff)                  flareTimer -= diff;\n+            if (misdirectionTimer > diff)           misdirectionTimer -= diff;\n+            if (checkMendTimer > diff)              checkMendTimer -= diff;\n+\n+            if (petSummonTimer > diff)              petSummonTimer -= diff;\n+        }\n+\n+        void InitPowers() override\n+        {\n+            me->SetPowerType(POWER_MANA);\n+\n+            if (botPet && botPet->GetPowerType() != POWER_FOCUS)\n+                botPet->SetByteValue(UNIT_FIELD_BYTES_0, 3, POWER_FOCUS);\n+        }\n+\n+        void InitSpells() override\n+        {\n+            uint8 lvl = me->GetLevel();\n+            //bool isBeas = GetSpec() == BOT_SPEC_HUNTER_BEASTMASTERY;\n+            bool isMark = GetSpec() == BOT_SPEC_HUNTER_MARKSMANSHIP;\n+            bool isSurv = GetSpec() == BOT_SPEC_HUNTER_SURVIVAL;\n+\n+            InitSpellMap(AUTO_SHOT_1);\n+            InitSpellMap(ARCANE_SHOT_1);\n+            InitSpellMap(TRANQ_SHOT_1);\n+            InitSpellMap(STEADY_SHOT_1);\n+            InitSpellMap(KILL_SHOT_1);\n+            InitSpellMap(MULTISHOT_1);\n+            InitSpellMap(VOLLEY_1);\n+            InitSpellMap(CONCUSSIVE_SHOT_1);\n+            InitSpellMap(DISTRACTING_SHOT_1);\n+            InitSpellMap(SERPENT_STING_1);\n+            InitSpellMap(SCORPID_STING_1);\n+            InitSpellMap(VIPER_STING_1);\n+            InitSpellMap(RAPID_FIRE_1);\n+            InitSpellMap(FLARE_1);\n+            InitSpellMap(WING_CLIP_1);\n+            InitSpellMap(RAPTOR_STRIKE_1);\n+            InitSpellMap(MONGOOSE_BITE_1);\n+            InitSpellMap(DISENGAGE_1);\n+            InitSpellMap(IMMOLATION_TRAP_1);\n+            InitSpellMap(FREEZING_TRAP_1);\n+            InitSpellMap(FROST_TRAP_1);\n+            InitSpellMap(EXPLOSIVE_TRAP_1);\n+            InitSpellMap(FREEZING_ARROW_1);\n+            InitSpellMap(HUNTERS_MARK_1);\n+            InitSpellMap(SCARE_BEAST_1);\n+            InitSpellMap(FEIGN_DEATH_1);\n+            InitSpellMap(DETERRENCE_1);\n+            InitSpellMap(MISDIRECTION_1);\n+            InitSpellMap(MEND_PET_1);\n+\n+            InitSpellMap(ASPECT_OF_THE_MONKEY_1);\n+            InitSpellMap(ASPECT_OF_THE_HAWK_1);\n+            InitSpellMap(ASPECT_OF_THE_CHEETAH_1);\n+            InitSpellMap(ASPECT_OF_THE_VIPER_1);\n+            //InitSpellMap(ASPECT_OF_THE_BEAST_1);\n+            InitSpellMap(ASPECT_OF_THE_PACK_1);\n+            InitSpellMap(ASPECT_OF_THE_WILD_1);\n+            InitSpellMap(ASPECT_OF_THE_DRAGONHAWK_1);\n+\n+  /*Talent*/lvl >= (isMark ? 20 : 70) ? InitSpellMap(AIMED_SHOT_1) : RemoveSpell(AIMED_SHOT_1);\n+  /*Talent*/lvl >= 30 && isMark ? InitSpellMap(READINESS_1) : RemoveSpell(READINESS_1);\n+  /*Talent*/lvl >= 40 && isMark ? InitSpellMap(TRUESHOT_AURA_1) : RemoveSpell(TRUESHOT_AURA_1);\n+  /*Talent*/lvl >= 50 && isMark ? InitSpellMap(SILENCING_SHOT_1) : RemoveSpell(SILENCING_SHOT_1);\n+  /*Talent*/lvl >= 60 && isMark ? InitSpellMap(CHIMERA_SHOT_1) : RemoveSpell(CHIMERA_SHOT_1);\n+\n+  /*Talent*/lvl >= (isSurv ? 20 : isMark ? 70 : 99) ? InitSpellMap(SCATTER_SHOT_1) : RemoveSpell(SCATTER_SHOT_1);\n+  /*Talent*/lvl >= 30 && isSurv ? InitSpellMap(COUNTERATTACK_1) : RemoveSpell(COUNTERATTACK_1);\n+  /*Talent*/lvl >= 40 && isSurv ? InitSpellMap(WYVERN_STING_1) : RemoveSpell(WYVERN_STING_1);\n+  /*Talent*/lvl >= 50 && isSurv ? InitSpellMap(BLACK_ARROW_1) : RemoveSpell(BLACK_ARROW_1);\n+  /*Talent*/lvl >= 60 && isSurv ? InitSpellMap(EXPLOSIVE_SHOT_1) : RemoveSpell(EXPLOSIVE_SHOT_1);\n+        }\n+\n+        void ApplyClassPassives() const override\n+        {\n+            uint8 level = master->GetLevel();\n+            bool isBeas = GetSpec() == BOT_SPEC_HUNTER_BEASTMASTERY;\n+            bool isMark = GetSpec() == BOT_SPEC_HUNTER_MARKSMANSHIP;\n+            bool isSurv = GetSpec() == BOT_SPEC_HUNTER_SURVIVAL;\n+\n+            RefreshAura(IMPROVED_MEND_PET, isBeas && level >= 25 ? 1 : 0);\n+\n+            RefreshAura(RAPID_KILLING, isMark && level >= 20 ? 1 : 0);\n+            RefreshAura(CONCUSSIVE_BARRAGE, isMark && level >= 30 ? 1 : 0);\n+            RefreshAura(PIERCING_SHOTS, isMark && level >= 40 ? 1 : 0);\n+            //RefreshAura(TRUESHOT_AURA, isMark && level >= 40 ? 1 : 0);\n+            RefreshAura(MASTER_MARKSMAN, isMark && level >= 45 ? 1 : 0);\n+            RefreshAura(WILD_QUIVER, isMark && level >= 50 ? 1 : 0);\n+\n+            RefreshAura(SUREFOOTED, level >= 15 ? 1 : 0);\n+            RefreshAura(ENTRAPMENT, isSurv && level >= 15 ? 1 : 0);\n+            RefreshAura(LOCK_AND_LOAD, isSurv && level >= 25 ? 1 : 0);\n+            RefreshAura(EXPOSE_WEAKNESS, isSurv && level >= 40 ? 1 : 0);\n+            RefreshAura(THRILL_OF_THE_HUNT, isSurv && level >= 40 ? 1 : 0);\n+            RefreshAura(MASTER_TACTICIAN5, isSurv && level >= 50 ? 1 : 0);\n+            RefreshAura(MASTER_TACTICIAN4, isSurv && level >= 49 && level < 50 ? 1 : 0);\n+            RefreshAura(MASTER_TACTICIAN3, isSurv && level >= 48 && level < 49 ? 1 : 0);\n+            RefreshAura(MASTER_TACTICIAN2, isSurv && level >= 47 && level < 48 ? 1 : 0);\n+            RefreshAura(MASTER_TACTICIAN1, isSurv && level >= 46 && level < 47 ? 1 : 0);\n+            RefreshAura(NOXIOUS_STINGS, isSurv && level >= 45 ? 1 : 0);\n+            RefreshAura(SNIPER_TRAINING, isSurv && level >= 50 ? 1 : 0);\n+\n+            RefreshAura(GLYPH_RAPTOR_STRIKE, level >= 15 ? 1 : 0);\n+            RefreshAura(GLYPH_ASPECT_OF_THE_VIPER, level >= 20 ? 1 : 0);\n+            RefreshAura(GLYPH_FREEZING_TRAP, level >= 20 ? 1 : 0);\n+            RefreshAura(GLYPH_EXPLOSIVE_TRAP, level >= 34 ? 1 : 0);\n+\n+            RefreshAura(HUNTER_T8_P2, level >= 70 ? 1 : 0);\n+            RefreshAura(HUNTER_T10_P2, level >= 75 ? 1 : 0);\n+            RefreshAura(HUNTER_T10_P4, level >= 80 ? 1 : 0);\n+        }\n+\n+        bool CanUseManually(uint32 basespell) const override\n+        {\n+            switch (basespell)\n+            {\n+                //case RAPID_FIRE_1:\n+                case FLARE_1:\n+                case MEND_PET_1:\n+                case IMMOLATION_TRAP_1:\n+                case FREEZING_TRAP_1:\n+                case FROST_TRAP_1:\n+                case EXPLOSIVE_TRAP_1:\n+                case VOLLEY_1:\n+                //case ASPECT_OF_THE_MONKEY_1:\n+                //case ASPECT_OF_THE_HAWK_1:\n+                //case ASPECT_OF_THE_CHEETAH_1:\n+                //case ASPECT_OF_THE_VIPER_1:\n+                //case ASPECT_OF_THE_BEAST_1:\n+                case ASPECT_OF_THE_PACK_1:\n+                case ASPECT_OF_THE_WILD_1:\n+                //case ASPECT_OF_THE_DRAGONHAWK_1:\n+                    return true;\n+                default:\n+                    return false;\n+            }\n+        }\n+\n+        bool HasAbilitiesSpecifics() const override { return true; }\n+        void FillAbilitiesSpecifics(Player const* player, std::list<std::string> &specList) override\n+        {\n+            uint32 textId;\n+            switch (_myaspect)\n+            {\n+                case ASPECT_OF_THE_MONKEY_1:     textId = BOT_TEXT_MONKEY;     break;\n+                case ASPECT_OF_THE_HAWK_1:       textId = BOT_TEXT_HAWK;       break;\n+                case ASPECT_OF_THE_CHEETAH_1:    textId = BOT_TEXT_CHEETAH;    break;\n+                case ASPECT_OF_THE_VIPER_1:      textId = BOT_TEXT_VIPER;      break;\n+                case ASPECT_OF_THE_BEAST_1:      textId = BOT_TEXT_BEAST;      break;\n+                case ASPECT_OF_THE_PACK_1:       textId = BOT_TEXT_PACK;       break;\n+                case ASPECT_OF_THE_WILD_1:       textId = BOT_TEXT_WILD;       break;\n+                case ASPECT_OF_THE_DRAGONHAWK_1: textId = BOT_TEXT_DRAGONHAWK; break;\n+                default:                         textId = BOT_TEXT_NOASPECT;   break;\n+            }\n+            specList.push_back(LocalizedNpcText(player, BOT_TEXT_ASPECT) + \": \" + LocalizedNpcText(player, textId));\n+        }\n+\n+        std::vector<uint32> const* GetDamagingSpellsList() const override\n+        {\n+            return &Hunter_spells_damage;\n+        }\n+        std::vector<uint32> const* GetCCSpellsList() const override\n+        {\n+            return &Hunter_spells_cc;\n+        }\n+        //std::vector<uint32> const* GetHealingSpellsList() const override\n+        //{\n+        //    return &Hunter_spells_heal;\n+        //}\n+        std::vector<uint32> const* GetSupportSpellsList() const override\n+        {\n+            return &Hunter_spells_support;\n+        }\n+\n+    private:\n+        uint32 trapTimer, stingTimer, aspectTimer, flareTimer, misdirectionTimer, checkMendTimer;\n+        uint32 _myaspect;\n+        //Pet\n+        uint32 myPetType;\n+        uint32 petSummonTimer;\n+\n+        //Scans target for hunter's aspects\n+        //returns applied aspects mask\n+        //used for finding out which aspects target lacks\n+        uint32 _getAspectsMask(std::map<uint32 /*type*/, uint32 /*curId*/>& idMap) const\n+        {\n+            uint32 mask = 0;\n+\n+            for (auto const& [spellId, auraApp] : me->GetAppliedAuras())\n+            {\n+                bool isAspect = true;\n+                uint32 baseId = auraApp->GetBase()->GetSpellInfo()->GetFirstRankSpell()->Id;\n+                switch (baseId)\n+                {\n+                    //case ASPECT_OF_THE_MONKEY_1:\n+                    //    mask |= SPECIFIC_ASPECT_MONKEY;\n+                    //    break;\n+                    case ASPECT_OF_THE_HAWK_1:\n+                        mask |= SPECIFIC_ASPECT_HAWK;\n+                        break;\n+                    case ASPECT_OF_THE_CHEETAH_1:\n+                        mask |= SPECIFIC_ASPECT_CHEETAH;\n+                        break;\n+                    //case ASPECT_OF_THE_VIPER_1:\n+                    //    mask |= SPECIFIC_ASPECT_VIPER;\n+                    //    break;\n+                    //case ASPECT_OF_THE_BEAST_1:\n+                    //    mask |= SPECIFIC_ASPECT_BEAST;\n+                    //    break;\n+                    case ASPECT_OF_THE_PACK_1:\n+                        mask |= SPECIFIC_ASPECT_PACK;\n+                        break;\n+                    case ASPECT_OF_THE_WILD_1:\n+                        mask |= SPECIFIC_ASPECT_WILD;\n+                        break;\n+                    case ASPECT_OF_THE_DRAGONHAWK_1:\n+                        mask |= SPECIFIC_ASPECT_DRAGONHAWK;\n+                        break;\n+                    default:\n+                        isAspect = false; //next aura\n+                        break;\n+                }\n+\n+                if (isAspect)\n+                {\n+                    idMap[baseId] = spellId;\n+                    if (auraApp->GetBase()->GetCasterGUID() == me->GetGUID())\n+                        mask |= SPECIFIC_ASPECT_MY_ASPECT;\n+                }\n+            }\n+\n+            return mask;\n+        }\n+    };\n+};\n+\n+void AddSC_hunter_bot()\n+{\n+    new hunter_bot();\n+}\ndiff --git a/src/server/game/AI/NpcBots/bot_mage_ai.cpp b/src/server/game/AI/NpcBots/bot_mage_ai.cpp\nnew file mode 100644\nindex 0000000000..7c1800c2ac\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bot_mage_ai.cpp\n@@ -0,0 +1,1851 @@\n+#include \"bot_ai.h\"\n+#include \"botlogtraits.h\"\n+#include \"botmgr.h\"\n+#include \"botspell.h\"\n+#include \"bottraits.h\"\n+#include \"GameEventMgr.h\"\n+#include \"Group.h\"\n+#include \"Item.h\"\n+#include \"Map.h\"\n+#include \"MotionMaster.h\"\n+#include \"ObjectAccessor.h\"\n+#include \"ObjectMgr.h\"\n+#include \"Player.h\"\n+#include \"ScriptMgr.h\"\n+#include \"Spell.h\"\n+#include \"SpellAuraEffects.h\"\n+#include \"SpellMgr.h\"\n+#include \"TemporarySummon.h\"\n+/*\n+Mage NpcBot (reworked by Trickerer onlysuffering@gmail.com)\n+Complete - 92-97%\n+TODO: slow (pvp), mana shield\n+*/\n+\n+enum MageBaseSpells\n+{\n+    DAMPENMAGIC_1                       = 604,\n+    AMPLIFYMAGIC_1                      = 1008,//manual use only\n+    ARCANEINTELLECT_1                   = 1459,\n+    ARCANEMISSILES_1                    = 5143,\n+    ARCANE_BLAST_1                      = 30451,\n+    POLYMORPH_1                         = 118,\n+    COUNTERSPELL_1                      = 2139,\n+    SPELLSTEAL_1                        = 30449,\n+    EVOCATION_1                         = 12051,\n+    BLINK_1                             = 1953,\n+    REMOVE_CURSE_1                      = 475,\n+    INVISIBILITY_1                      = 66,\n+    SCORCH_1                            = 2948,\n+    BLAST_WAVE_1                        = 11113,\n+    DRAGON_BREATH_1                     = 31661,\n+    FIRE_BLAST_1                        = 2136,\n+    PYROBLAST_1                         = 11366,\n+    LIVING_BOMB_1                       = 44457,\n+    FLAMESTRIKE_1                       = 2120,\n+    COMBUSTION_1                        = 11129,\n+    FROSTFIRE_BOLT_1                    = 44614,\n+    FIREBALL_1                          = 133,\n+    FROSTBOLT_1                         = 116,\n+    FROST_NOVA_1                        = 122,\n+    CONE_OF_COLD_1                      = 120,\n+    BLIZZARD_1                          = 10,\n+    FROST_ARMOR_1                       = 168,\n+    ICE_ARMOR_1                         = 7302,\n+    MOLTEN_ARMOR_1                      = 30482,\n+    ICE_BARRIER_1                       = 11426,\n+    ICE_BLOCK_1                         = 45438,\n+    FOCUS_MAGIC_1                       = 54646,\n+    PRESENCE_OF_MIND_1                  = 12043,\n+    ARCANE_POWER_1                      = 12042,\n+    SLOW_FALL_1                         = 130,\n+    ICE_LANCE_1                         = 30455,\n+    ICY_VEINS_1                         = 12472,\n+    COLD_SNAP_1                         = 11958,\n+    DEEP_FREEZE_1                       = 44572,\n+    FROST_WARD_1                        = 6143,\n+    FIRE_WARD_1                         = 543,\n+    MIRROR_IMAGE_1                      = 55342,\n+    //Special\n+    ARCANE_MISSILES_DAMAGE_1            = 7268,\n+    BLIZZARD_DAMAGE_1                   = 42208,\n+    LIVING_BOMB_DAMAGE_1                = 44461,\n+    CONJURE_MANA_GEM_1                  = 759,\n+    MANA_GEM_1                          = 5405,\n+    RITUAL_OF_REFRESHMENT_1             = 43987,\n+\n+    SUMMON_WATER_ELEMENTAL_1            = 31687\n+};\n+\n+enum MagePassives\n+{\n+//Talents\n+    FROSTBITE1                          = 11071,\n+    FROSTBITE2                          = 12496,\n+    FROSTBITE3                          = 12497,\n+    ARCANE_CONCENTRATION                = 12577,//rank 5, clearcast\n+    IGNITE                              = 12848,//rank 5\n+    BURNING_DETERMINATION               = 54749,//rank 2\n+    FROST_WARDING                       = 28332,//rank 2\n+    IMPROVED_COUNTERSPELL1              = 11255,\n+    IMPROVED_COUNTERSPELL2              = 12598,\n+    ARCANE_MEDITATION                   = 18464,//rank 3\n+    TORMENT_THE_WEAK                    = 55340,//rank 3\n+    IMPACT                              = 12358,//rank 3\n+    IMPROVED_BLIZZARD                   = 12488,//rank 3\n+    IMPROVED_SCORCH                     = 12873,//rank 3\n+    MOLTEN_SHIELDS                      = 13043,//rank 2\n+    MASTER_OF_ELEMENTS                  = 29076,//rank 3\n+    SHATTER1                            = 11170,\n+    SHATTER2                            = 12982,\n+    SHATTER3                            = 12983,\n+    ARCANE_POTENCY1                     = 31571,\n+    ARCANE_POTENCY2                     = 31572,\n+    BLAZING_SPEED                       = 31642,//rank 2\n+    WINTERS_CHILL1                      = 11180,\n+    WINTERS_CHILL2                      = 28592,\n+    WINTERS_CHILL3                      = 28593,\n+    ARCANE_EMPOWERMENT                  = 31583,//rank 3\n+    INCANTERS_ABSORPTION1               = 44394,\n+    INCANTERS_ABSORPTION2               = 44395,\n+    INCANTERS_ABSORPTION3               = 44396,\n+    MISSILE_BARRAGE                     = 54490,//rank 5\n+    PYROMANIAC                          = 34296,//rank 3\n+    SHATTERED_BARRIER                   = 54787,//rank 2\n+    //ARCTIC_WINDS                        = 31678,//rank 5\n+    FINGERS_OF_FROST                    = 44545,//rank 2\n+    FIRESTARTER1                        = 44442,\n+    FIRESTARTER2                        = 44443,\n+    HOT_STREAK                          = 44448,//rank 3\n+    BRAIN_FREEZE1                       = 44546,\n+    BRAIN_FREEZE2                       = 44548,\n+    BRAIN_FREEZE3                       = 44549,\n+\n+    GLYPH_POLYMORPH                     = 56375,\n+    GLYPG_REMOVE_CURSE                  = 56364,\n+    GLYPH_ICY_VEINS                     = 56374,\n+    GLYPH_LIVING_BOMB                   = 63091,\n+    GLYPH_ICE_LANCE                     = 56377\n+};\n+enum MageSpecial\n+{\n+    ARCANE_CONCENTRATION_BUFF           = 12536,\n+    IMPACT_BUFF                         = 64343,\n+    FIRESTARTER_BUFF                    = 54741,\n+    ARCANE_POTENCY_BUFF1                = 57529,\n+    ARCANE_POTENCY_BUFF2                = 57531,\n+    COMBUSTION_BUFF                     = 28682,\n+    BRAIN_FREEZE_BUFF                   = 57761,\n+    HOT_STREAK_BUFF                     = 48108,\n+    FINGERS_OF_FROST_BUFF               = 44544,\n+    ARCANE_BLAST_DEBUFF                 = 36032,\n+    MISSILE_BARRAGE_BUFF                = 44401,\n+    IMPROVED_BLIZZARD_CHILL             = 12486,//rank 3\n+    FROSTBITE_TRIGGERED                 = 12494,\n+    WINTERS_CHILL_TRIGGERED             = 12579,\n+    IGNITE_TRIGGERED                    = 12654\n+};\n+\n+static const std::vector<uint32> Mage_spells_damage\n+{ ARCANEMISSILES_1, ARCANE_BLAST_1, BLAST_WAVE_1, BLIZZARD_1, CONE_OF_COLD_1, DEEP_FREEZE_1, DRAGON_BREATH_1, FIREBALL_1,\n+FIRE_BLAST_1, FLAMESTRIKE_1, FROSTBOLT_1, FROSTFIRE_BOLT_1, FROST_NOVA_1, ICE_LANCE_1, LIVING_BOMB_1, PYROBLAST_1, SCORCH_1 };\n+static const std::vector<uint32> Mage_spells_cc{ COUNTERSPELL_1, DRAGON_BREATH_1, DEEP_FREEZE_1, FROST_NOVA_1, POLYMORPH_1 };\n+static const std::vector<uint32> Mage_spells_support\n+{ AMPLIFYMAGIC_1, ARCANEINTELLECT_1, BLINK_1, COMBUSTION_1, DAMPENMAGIC_1, EVOCATION_1, FIRE_WARD_1, FROST_WARD_1,\n+FROST_ARMOR_1, FOCUS_MAGIC_1, ICE_BARRIER_1, ICE_BLOCK_1, ICY_VEINS_1, INVISIBILITY_1, ICE_ARMOR_1, MOLTEN_ARMOR_1,\n+SLOW_FALL_1, SPELLSTEAL_1, REMOVE_CURSE_1, CONJURE_MANA_GEM_1, RITUAL_OF_REFRESHMENT_1, SUMMON_WATER_ELEMENTAL_1,\n+COLD_SNAP_1, PRESENCE_OF_MIND_1, ARCANE_POWER_1 };\n+\n+class mage_bot : public CreatureScript\n+{\n+public:\n+    mage_bot() : CreatureScript(\"mage_bot\") { }\n+\n+    CreatureAI* GetAI(Creature* creature) const override\n+    {\n+        return new mage_botAI(creature);\n+    }\n+\n+    bool OnGossipHello(Player* player, Creature* creature) override\n+    {\n+        return creature->GetBotAI()->OnGossipHello(player, 0);\n+    }\n+\n+    bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action) override\n+    {\n+        if (bot_ai* ai = creature->GetBotAI())\n+            return ai->OnGossipSelect(player, creature, sender, action);\n+        return true;\n+    }\n+\n+    bool OnGossipSelectCode(Player* player, Creature* creature, uint32 sender, uint32 action, char const* code) override\n+    {\n+        if (bot_ai* ai = creature->GetBotAI())\n+            return ai->OnGossipSelectCode(player, creature, sender, action, code);\n+        return true;\n+    }\n+\n+    struct mage_botAI : public bot_ai\n+    {\n+        mage_botAI(Creature* creature) : bot_ai(creature)\n+        {\n+            _botclass = BOT_CLASS_MAGE;\n+\n+            InitUnitFlags();\n+        }\n+\n+        bool doCast(Unit* victim, uint32 spellId)\n+        {\n+            if (CheckBotCast(victim, spellId) != SPELL_CAST_OK)\n+                return false;\n+            return bot_ai::doCast(victim, spellId);\n+        }\n+\n+        void JustEngagedWith(Unit* u) override { canFrostWard = false; canFireWard = false; bot_ai::JustEngagedWith(u); }\n+        void KilledUnit(Unit* u) override { bot_ai::KilledUnit(u); }\n+        void EnterEvadeMode(EvadeReason why = EVADE_REASON_OTHER) override { bot_ai::EnterEvadeMode(why); }\n+        void MoveInLineOfSight(Unit* u) override { bot_ai::MoveInLineOfSight(u); }\n+        void JustDied(Unit* u) override { UnsummonAll(false); bot_ai::JustDied(u); }\n+\n+        void StartAttack(Unit* u, bool force = false)\n+        {\n+            if (!bot_ai::StartAttack(u, force))\n+                return;\n+            GetInPosition(force, u);\n+        }\n+\n+        void Counter(uint32 diff)\n+        {\n+            //skip if evocation, blizzard\n+            if (IsChanneling() || Rand() > 30)\n+                return;\n+\n+            if (IsSpellReady(COUNTERSPELL_1, diff, false))\n+            {\n+                if (Unit* target = FindCastingTarget(CalcSpellMaxRange(COUNTERSPELL_1), 0, COUNTERSPELL_1))\n+                {\n+                    me->InterruptNonMeleeSpells(false);\n+                    if (doCast(target, GetSpell(COUNTERSPELL_1)))\n+                        return;\n+                }\n+            }\n+            if (IsSpellReady(DEEP_FREEZE_1, diff) && me->HasAuraType(SPELL_AURA_ABILITY_IGNORE_AURASTATE))\n+            {\n+                if (Unit* target = FindCastingTarget(CalcSpellMaxRange(DEEP_FREEZE_1), 0, DEEP_FREEZE_1))\n+                {\n+                    me->InterruptNonMeleeSpells(false);\n+                    if (doCast(target, GetSpell(DEEP_FREEZE_1)))\n+                        return;\n+                }\n+            }\n+            if (IsSpellReady(FIRE_BLAST_1, diff) && me->HasAura(IMPACT_BUFF))\n+            {\n+                if (Unit* target = FindCastingTarget(CalcSpellMaxRange(FIRE_BLAST_1), 0, FIRE_BLAST_1))\n+                {\n+                    me->InterruptNonMeleeSpells(false);\n+                    if (doCast(target, GetSpell(FIRE_BLAST_1)))\n+                        return;\n+                }\n+            }\n+            if (!IsCasting() && IsSpellReady(POLYMORPH_1, diff))\n+            {\n+                if (Unit* target = FindCastingTarget(CalcSpellMaxRange(POLYMORPH_1), 0, POLYMORPH_1, 75))\n+                {\n+                    if (doCast(target, GetSpell(POLYMORPH_1)))\n+                        return;\n+                }\n+            }\n+        }\n+\n+        void CheckSpellSteal(uint32 diff)\n+        {\n+            if (!IsSpellReady(SPELLSTEAL_1, diff) || IsCasting() || Rand() > 15)\n+                return;\n+\n+            Unit* target = FindHostileDispelTarget(CalcSpellMaxRange(SPELLSTEAL_1), true);\n+            if (target && doCast(target, GetSpell(SPELLSTEAL_1)))\n+                return;\n+        }\n+\n+        void DoNonCombatActions(uint32 diff)\n+        {\n+            if (GC_Timer > diff || me->IsMounted() || Feasting() || Rand() > 25)\n+                return;\n+\n+            //slow fall\n+            if (GetSpell(SLOW_FALL_1) && !IAmFree())\n+            {\n+                Player* fPlayer = nullptr;\n+                Group const* gr = master->GetGroup();\n+                if (gr)\n+                {\n+                    for (GroupReference const* ref = gr->GetFirstMember(); ref != nullptr; ref = ref->next())\n+                    {\n+                        Player* pl = ref->GetSource();\n+                        if (pl && pl->IsAlive() && pl->FindMap() == me->GetMap() && pl->GetDistance(me) < 30 &&\n+                            pl->IsFalling() && pl->m_movementInfo.fallTime > 1000 &&\n+                            !pl->HasAuraType(SPELL_AURA_FEATHER_FALL))\n+                        {\n+                            fPlayer = pl;\n+                            break;\n+                        }\n+                    }\n+                }\n+                else if (master->IsAlive() && master->GetDistance(me) < 30 && master->IsFalling() &&\n+                    master->m_movementInfo.fallTime > 1000 && !master->HasAuraType(SPELL_AURA_FEATHER_FALL))\n+                    fPlayer = master;\n+\n+                if (fPlayer && doCast(fPlayer, GetSpell(SLOW_FALL_1)))\n+                    return;\n+            }\n+\n+            //ARMOR\n+            uint32 MOLTENARMOR = HasRole(BOT_ROLE_DPS) ? GetSpell(MOLTEN_ARMOR_1) : GetSpell(ICE_ARMOR_1);\n+            uint32 ICEARMOR = GetSpell(ICE_ARMOR_1) ? GetSpell(ICE_ARMOR_1) : GetSpell(FROST_ARMOR_1);\n+            uint32 ARMOR = !MOLTENARMOR ? ICEARMOR : (me->GetMap()->IsDungeon() || !ICEARMOR) ? MOLTENARMOR : ICEARMOR;\n+            if (ARMOR && !me->HasAura(ARMOR))\n+            {\n+                if (doCast(me, ARMOR))\n+                    return;\n+            }\n+\n+            if (GetSpell(CONJURE_MANA_GEM_1))\n+            {\n+                if (manaGemCharges == 0 &&\n+                    doCast(me, GetSpell(CONJURE_MANA_GEM_1)))\n+                    return;\n+            }\n+            if (GetSpell(DAMPENMAGIC_1))\n+            {\n+                if (!me->HasAuraTypeWithFamilyFlags(SPELL_AURA_MOD_DAMAGE_TAKEN, SPELLFAMILY_MAGE, 0x2000)\n+                    /*!HasAuraName(me, DAMPENMAGIC_1)*/ &&\n+                    doCast(me, GetSpell(DAMPENMAGIC_1)))\n+                    return;\n+            }\n+        }\n+\n+        bool BuffTarget(Unit* target, uint32 /*diff*/) override\n+        {\n+            if (me->IsInCombat() && !master->GetMap()->IsRaid()) return false;\n+\n+            if (GetSpell(ARCANEINTELLECT_1) && target->GetMaxPower(POWER_MANA) > 1 &&\n+                !target->HasAuraTypeWithFamilyFlags(SPELL_AURA_MOD_STAT, SPELLFAMILY_MAGE, 0x400)\n+                /*!HasAuraName(target, ARCANEINTELLECT_1)*/)\n+            {\n+                if (doCast(target, GetSpell(ARCANEINTELLECT_1)))\n+                    return true;\n+            }\n+\n+            return false;\n+        }\n+\n+        void UpdateAI(uint32 diff) override\n+        {\n+            if (!GlobalUpdate(diff))\n+                return;\n+\n+            DoVehicleActions(diff);\n+            if (!CanBotAttackOnVehicle())\n+                return;\n+\n+            CheckPots(diff);\n+\n+            CheckPoly(diff);\n+            CheckBlink(diff);\n+            CheckIceBlock(diff);\n+\n+            CheckRacials(diff);\n+\n+            CheckShield(diff);\n+            CureGroup(GetSpell(REMOVE_CURSE_1), diff);\n+            CheckWard(diff);\n+\n+            CheckFocusMagic(diff);\n+            BuffAndHealGroup(diff);\n+\n+            if (!me->IsInCombat())\n+                DoNonCombatActions(diff);\n+\n+            //pet\n+            if ((!botPet || !botPet->IsAlive()) &&\n+                IsSpellReady(SUMMON_WATER_ELEMENTAL_1, diff) && !IsCasting() && (IAmFree() || master->IsInCombat()))\n+                if (doCast(me, GetSpell(SUMMON_WATER_ELEMENTAL_1)))\n+                    return;\n+\n+            if (ProcessImmediateNonAttackTarget())\n+                return;\n+\n+            if (!CheckAttackTarget())\n+                return;\n+\n+            CheckPolymorph(diff);//this should go AFTER getting target\n+\n+            Counter(diff);\n+            CheckSpellSteal(diff);\n+            CheckColdSnap(diff);\n+\n+            if (IsCasting())\n+                return;\n+\n+            if (me->HasInvisibilityAura())\n+                return;\n+\n+            CheckUsableItems(diff);\n+\n+            DoNormalAttack(diff);\n+        }\n+\n+        void DoNormalAttack(uint32 diff)\n+        {\n+            Unit* mytar = opponent ? opponent : disttarget ? disttarget : nullptr;\n+            if (!mytar)\n+                return;\n+\n+            StartAttack(mytar, IsMelee());\n+\n+            CheckAttackState();\n+            if (!me->IsAlive() || !mytar->IsAlive())\n+                return;\n+\n+            MoveBehind(mytar);\n+\n+            if (!HasRole(BOT_ROLE_DPS))\n+                return;\n+\n+            Unit::AttackerSet const& b_attackers = me->getAttackers();\n+\n+            float dist = me->GetDistance(mytar);\n+\n+            //COMBUSTION (no GCD)\n+            if (IsSpellReady(COMBUSTION_1, diff, false) && GetManaPCT(me) > 20 &&\n+                (mytar->GetMaxHealth() > master->GetMaxHealth() * 4 ||\n+                master->getAttackers().size() > 1 || b_attackers.size() > 1) &&\n+                Rand() < 45 &&\n+                !me->GetAuraEffect(SPELL_AURA_ADD_PCT_MODIFIER, SPELLFAMILY_MAGE, 0x0, 0x04000000, 0x0)\n+                /*!HasAuraName(me, COMBUSTION_1)*/)\n+            {\n+                if (doCast(me, GetSpell(COMBUSTION_1)))\n+                    return;\n+            }\n+            //ICY VEINS (no GCD)\n+            if (IsSpellReady(ICY_VEINS_1, diff, false) && me->IsInCombat() && GetManaPCT(me) > 20 &&\n+                (mytar->GetMaxHealth() > master->GetMaxHealth() * 2 ||\n+                (mytar->IsCreature() && mytar->ToCreature()->GetCreatureTemplate()->rank != CREATURE_ELITE_NORMAL)) &&\n+                Rand() < 45)\n+            {\n+                if (doCast(me, GetSpell(ICY_VEINS_1)))\n+                    return;\n+            }\n+            //ARCANE POWER (no GCD, not with PoM)\n+            if (IsSpellReady(ARCANE_POWER_1, diff, false) && me->IsInCombat() && GetManaPCT(me) > 50 &&\n+                (mytar->GetMaxHealth() > master->GetMaxHealth() * 2 ||\n+                (mytar->IsCreature() && mytar->ToCreature()->GetCreatureTemplate()->rank != CREATURE_ELITE_NORMAL)) &&\n+                Rand() < 75 && !me->GetAuraEffect(SPELL_AURA_ADD_PCT_MODIFIER, SPELLFAMILY_MAGE, 0x0, 0x20, 0x0))\n+            {\n+                if (doCast(me, GetSpell(ARCANE_POWER_1)))\n+                    return;\n+            }\n+            //PRESENCE OF MIND (no GCD, not with AP)\n+            if (IsSpellReady(PRESENCE_OF_MIND_1, diff, false) && me->IsInCombat() && GetManaPCT(me) > 10 && Rand() < 35 &&\n+                !me->GetAuraEffect(SPELL_AURA_ADD_PCT_MODIFIER, SPELLFAMILY_MAGE, 0x0, 0x80000, 0x0))\n+            {\n+                if (doCast(me, GetSpell(PRESENCE_OF_MIND_1)))\n+                    return;\n+            }\n+            //DAMAGE\n+            //Cheap check\n+            if (GC_Timer > diff) //!ensure none spells below ignore GCD!\n+                return;\n+            //NOVAS\n+            if ((IsSpellReady(FROST_NOVA_1, diff) || IsSpellReady(BLAST_WAVE_1, diff)) && Rand() < 85)\n+            {\n+                std::list<Unit*> targets;\n+                GetNearbyTargetsList(targets, 8.5f, 1); //both are radius 10 yd\n+                if (!targets.empty())\n+                {\n+                    bool oneOnOne = (*targets.begin()) == mytar;\n+                    //Frost Nova\n+                    if (IsSpellReady(FROST_NOVA_1, diff) && (targets.size() > 1 || oneOnOne))\n+                    {\n+                        if (doCast(me, GetSpell(FROST_NOVA_1)))\n+                        {\n+                            GetInPosition(true, mytar);\n+                            return;\n+                        }\n+                    }\n+                    //Blast Wave\n+                    else if (IsSpellReady(BLAST_WAVE_1, diff) && (targets.size() > 1 || oneOnOne))\n+                    {\n+                        if (doCast(me, GetSpell(BLAST_WAVE_1)))\n+                            return;\n+                    }\n+                }\n+            }\n+            //MIRROR IMAGE\n+            if (IsSpellReady(MIRROR_IMAGE_1, diff) &&\n+                (mytar->IsPlayer() ||\n+                (mytar->IsCreature() && mytar->ToCreature()->GetCreatureTemplate()->rank != CREATURE_ELITE_NORMAL)) &&\n+                Rand() < 25)\n+            {\n+                if (doCast(me, GetSpell(MIRROR_IMAGE_1)))\n+                    return;\n+            }\n+            //CONES\n+            if (/*fbCasted && */(IsSpellReady(CONE_OF_COLD_1, diff) || IsSpellReady(DRAGON_BREATH_1, diff)) && Rand() < 65)\n+            {\n+                std::list<Unit*> targets;\n+                GetNearbyTargetsInConeList(targets, 8); //both are radius 10 yd\n+                if (!targets.empty())\n+                {\n+                    //Cone of Cold\n+                    if (IsSpellReady(CONE_OF_COLD_1, diff))\n+                    {\n+                        if (doCast(me, GetSpell(CONE_OF_COLD_1)))\n+                            return;\n+                    }\n+                    //Dragon's Breath\n+                    else if (IsSpellReady(DRAGON_BREATH_1, diff))\n+                    {\n+                        if (doCast(me, GetSpell(DRAGON_BREATH_1)))\n+                            return;\n+                    }\n+                }\n+            }\n+\n+            const auto [can_do_frost, can_do_fire, can_do_arcane] = CanAffectVictimBools(mytar, SPELL_SCHOOL_FROST, SPELL_SCHOOL_FIRE, SPELL_SCHOOL_ARCANE);\n+            const auto can_do_frost_or_fire = can_do_frost || can_do_fire;\n+\n+            //spell reflections: Ice Lance instant / Frostbolt Rank 1\n+            if (IsSpellReady(ICE_LANCE_1, diff) && can_do_frost && dist < CalcSpellMaxRange(ICE_LANCE_1) && CanRemoveReflectSpells(mytar, ICE_LANCE_1) &&\n+                doCast(mytar, ICE_LANCE_1))\n+                return;\n+            else if (IsSpellReady(FROSTBOLT_1, diff) && can_do_frost && dist < CalcSpellMaxRange(FROSTBOLT_1) && CanRemoveReflectSpells(mytar, FROSTBOLT_1) &&\n+                doCast(mytar, FROSTBOLT_1))\n+                return;\n+\n+            //Pyroblast TODO: PoM\n+            if (IsSpellReady(PYROBLAST_1, diff) && can_do_fire && dist < CalcSpellMaxRange(PYROBLAST_1) &&\n+                ((mytar->IsPolymorphed() && (b_attackers.size() < 2 || (*b_attackers.begin()) == mytar)) ||\n+                me->HasAura(HOT_STREAK_BUFF) || (me->HasAura(PRESENCE_OF_MIND_1) && (GetSpec() != BOT_SPEC_MAGE_ARCANE || !GetSpell(ARCANE_BLAST_1)))))\n+            {\n+                if (doCast(mytar, GetSpell(PYROBLAST_1)))\n+                    return;\n+            }\n+            //Scorch\n+            if (IsSpellReady(SCORCH_1, diff) && can_do_fire && GetSpec() == BOT_SPEC_MAGE_FIRE && dist < CalcSpellMaxRange(SCORCH_1) && me->GetLevel() >= 25 &&\n+                !mytar->GetAuraEffect(SPELL_AURA_MOD_ATTACKER_SPELL_CRIT_CHANCE, SPELLFAMILY_MAGE, 0x0, 0x2000, 0x0))\n+            {\n+                if (doCast(mytar, GetSpell(SCORCH_1)))\n+                    return;\n+            }\n+            //Living Bomb\n+            if ((!mytar->IsControlledByPlayer() || fbCasted) && IsSpellReady(LIVING_BOMB_1, diff) && can_do_fire && dist < CalcSpellMaxRange(LIVING_BOMB_1) &&\n+                mytar->GetHealth() > me->GetHealth() / 2 * mytar->getAttackers().size() &&\n+                Rand() < 115 && !mytar->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_MAGE, 0x0, 0x20000, 0x0, me->GetGUID()))\n+            {\n+                if (doCast(mytar, GetSpell(LIVING_BOMB_1)))\n+                    return;\n+            }\n+            //Fire Blast (do not waste mana in raids)\n+            if (IsSpellReady(FIRE_BLAST_1, diff) && can_do_fire && dist < CalcSpellMaxRange(FIRE_BLAST_1) &&\n+                mytar->GetHealth() < me->GetMaxHealth()*4 && (fbCasted || mytar->GetHealth() < me->GetMaxHealth() / 4) &&\n+                Rand() < (30 + 40*fbCasted + 80*(!mytar->isFrozen() && !mytar->HasUnitState(UNIT_STATE_STUNNED) && me->HasAura(IMPACT_BUFF))))\n+            {\n+                if (doCast(mytar, GetSpell(FIRE_BLAST_1)))\n+                    return;\n+            }\n+            //Deep Freeze (damage only)\n+            if (fbCasted && IsSpellReady(DEEP_FREEZE_1, diff) && can_do_frost && dist < CalcSpellMaxRange(DEEP_FREEZE_1) && Rand() < 30 &&\n+                IsImmunedToMySpellEffect(mytar, sSpellMgr->GetSpellInfo(DEEP_FREEZE_1), EFFECT_0) && (mytar->isFrozen() || me->HasAuraType(SPELL_AURA_ABILITY_IGNORE_AURASTATE)))\n+            {\n+                if (doCast(mytar, GetSpell(DEEP_FREEZE_1)))\n+                    return;\n+            }\n+            //Flamestrike (instant cast only)\n+            if (/*fbCasted && */IsSpellReady(FLAMESTRIKE_1, diff) && can_do_fire && dist < CalcSpellMaxRange(FLAMESTRIKE_1) && Rand() < 80 &&\n+                me->HasAura(FIRESTARTER_BUFF))\n+            {\n+                if (doCast(mytar, GetSpell(FLAMESTRIKE_1)))\n+                    return;\n+            }\n+            //Blizzard\n+            if (IsSpellReady(BLIZZARD_1, diff) && !JumpingOrFalling() && Rand() < 50)\n+            {\n+                if (Unit* blizztarget = FindAOETarget(CalcSpellMaxRange(BLIZZARD_1)))\n+                {\n+                    if (doCast(blizztarget, GetSpell(BLIZZARD_1)))\n+                        return;\n+                }\n+\n+                SetSpellCooldown(BLIZZARD_1, 1500); //fail\n+            }\n+            //Ice Lance (no cd, only GCD)\n+            if (fbCasted && (!me->GetMap()->IsDungeon() || mytar->IsControlledByPlayer()) &&\n+                IsSpellReady(ICE_LANCE_1, diff) && can_do_frost && dist < CalcSpellMaxRange(ICE_LANCE_1) &&\n+                (mytar->isFrozen() || me->HasAuraType(SPELL_AURA_ABILITY_IGNORE_AURASTATE)))\n+            {\n+                if (doCast(mytar, GetSpell(ICE_LANCE_1)))\n+                    return;\n+            }\n+            //Fireball or Frostfire Bolt (instant cast or combustion use up)\n+            if (/*fbCasted && */IsSpellReady(FROSTFIREBOLT, diff) && can_do_frost_or_fire && dist < CalcSpellMaxRange(FROSTFIREBOLT) && Rand() < 150 &&\n+                ((((CCed(mytar, true) || b_attackers.empty()) && me->HasAura(COMBUSTION_BUFF)) || me->HasAura(BRAIN_FREEZE_BUFF)) ||\n+                !GetSpell(FROSTBOLT_1))) //level 1-3\n+            {\n+                if (doCast(mytar, GetSpell(FROSTFIREBOLT)))\n+                    return;\n+            }\n+            //Main rotation\n+            //Arcane Missiles (arcane spec only)\n+            if (IsSpellReady(ARCANEMISSILES_1, diff) && can_do_arcane && GetSpec() == BOT_SPEC_MAGE_ARCANE && dist < CalcSpellMaxRange(ARCANEMISSILES_1) &&\n+                (me->GetLevel() < 45 ||\n+                ((!GetSpell(ARCANE_BLAST_1) || arcaneBlastStack >= 3 || sSpellMgr->GetSpellInfo(ARCANE_BLAST_1)->CalcPowerCost(me, SPELL_SCHOOL_MASK_ARCANE) > int(me->GetPower(POWER_MANA))) &&\n+                me->GetAuraEffect(SPELL_AURA_ADD_FLAT_MODIFIER, SPELLFAMILY_MAGE, 0x0, 0x2, 0x0))))\n+            {\n+                if (doCast(mytar, GetSpell(ARCANEMISSILES_1)))\n+                    return;\n+            }\n+            if (IsSpellReady(ARCANE_BLAST_1, diff) && can_do_arcane && GetSpec() == BOT_SPEC_MAGE_ARCANE && dist < CalcSpellMaxRange(ARCANE_BLAST_1) &&\n+                (arcaneBlastStack < 4 || !me->GetAuraEffect(SPELL_AURA_ADD_FLAT_MODIFIER, SPELLFAMILY_MAGE, 0x0, 0x2, 0x0)))\n+            {\n+                if (doCast(mytar, GetSpell(ARCANE_BLAST_1)))\n+                    return;\n+            }\n+            if (GetSpec() != BOT_SPEC_MAGE_ARCANE || !GetSpell(ARCANE_BLAST_1))\n+            {\n+                if (IsSpellReady(FROSTFIREBOLT, diff) && can_do_frost_or_fire && (GetSpec() == BOT_SPEC_MAGE_FIRE ||\n+                    (GetSpec() == BOT_SPEC_MAGE_FROST && (FROSTFIREBOLT == FROSTFIRE_BOLT_1 || !GetSpell(FROSTBOLT_1)))) &&\n+                    dist < CalcSpellMaxRange(FROSTFIREBOLT))\n+                {\n+                    if (doCast(mytar, GetSpell(FROSTFIREBOLT)))\n+                        return;\n+                }\n+\n+                if (IsSpellReady(FROSTBOLT_1, diff) && can_do_frost && (GetSpec() != BOT_SPEC_MAGE_FIRE || !can_do_fire) && dist < CalcSpellMaxRange(FROSTBOLT_1))\n+                {\n+                    if (doCast(mytar, GetSpell(FROSTBOLT_1)))\n+                        return;\n+                }\n+                if (IsSpellReady(FIREBALL_1, diff) && can_do_fire && GetSpec() == BOT_SPEC_DEFAULT && dist < CalcSpellMaxRange(FIREBALL_1))\n+                {\n+                    if (doCast(mytar, GetSpell(FIREBALL_1)))\n+                        return;\n+                }\n+            }\n+\n+            if (Spell const* shot = me->GetCurrentSpell(CURRENT_AUTOREPEAT_SPELL))\n+            {\n+                if (shot->GetSpellInfo()->Id == SHOOT_WAND && shot->m_targets.GetUnitTarget() != mytar)\n+                    me->InterruptSpell(CURRENT_AUTOREPEAT_SPELL);\n+            }\n+            else if (IsSpellReady(SHOOT_WAND, diff) && !me->isMoving() && me->GetDistance(mytar) < 30 && GetEquips(BOT_SLOT_RANGED) &&\n+                doCast(mytar, SHOOT_WAND))\n+                return;\n+        }\n+\n+        void CheckPoly(uint32 diff)\n+        {\n+            if (polyCheckTimer <= diff)\n+            {\n+                poly = FindAffectedTarget(GetSpell(POLYMORPH_1), me->GetGUID());\n+                polyCheckTimer = 2000;\n+            }\n+        }\n+\n+        void CheckPolymorph(uint32 diff)\n+        {\n+            if (poly == false && IsSpellReady(POLYMORPH_1, diff) && !IsCasting())\n+            {\n+                if (Unit* target = FindPolyTarget(CalcSpellMaxRange(POLYMORPH_1)))\n+                {\n+                    if (doCast(target, GetSpell(POLYMORPH_1)))\n+                        return;\n+                }\n+            }\n+        }\n+\n+        void CheckPots(uint32 diff)\n+        {\n+            if (me->IsMounted() || IsCasting())\n+                return;\n+\n+            if (IsPotionReady())\n+            {\n+                if (GetHealthPCT(me) < 50)\n+                    DrinkPotion(false);\n+            }\n+            if (Rand() < 35)\n+            {\n+                if (IsSpellReady(EVOCATION_1, diff) && GetManaPCT(me) < 15 && uint8(me->getAttackers().size()) < (shielded ? 3 : 1))\n+                {\n+                    if (doCast(me, GetSpell(EVOCATION_1)))\n+                        return;\n+                }\n+                if (manaGemCharges > 0 && GetManaPCT(me) < 50 && IsSpellReady(MANA_GEM_1, diff, false))\n+                {\n+                    if (doCast(me, GetSpell(MANA_GEM_1)))\n+                        return;\n+                }\n+                if (IsPotionReady() && GetManaPCT(me) < 40)\n+                    DrinkPotion(true);\n+            }\n+        }\n+\n+        void CheckBlink(uint32 diff)\n+        {\n+            if (!me->IsAlive())\n+                return;\n+            if (me->GetVehicle())\n+                return;\n+            if (HasBotCommandState(BOT_COMMAND_STAY) || me->IsMounted())\n+                return;\n+            if (!IsSpellReady(BLINK_1, diff) || IsCasting() || Rand() > 70)\n+                return;\n+\n+            bool cast = false;\n+            Unit* u = nullptr;\n+            if (!IAmFree())\n+            {\n+                if (!me->IsInCombat() && me->GetExactDist2d(master) > std::max<uint8>(master->GetBotMgr()->GetBotFollowDist(), 35) &&\n+                    me->HasInArc(float(M_PI)*0.67f, master))\n+                {\n+                    cast = true;\n+                }\n+            }\n+            if (!cast && me->IsInCombat() && !me->getAttackers().empty() && HasRole(BOT_ROLE_RANGED))\n+            {\n+                cast = me->HasAuraWithMechanic((1u<<MECHANIC_STUN)|(1u<<MECHANIC_ROOT));\n+                if (!cast)\n+                {\n+                    u = me->SelectNearestTarget(7);\n+                    cast = (u && u->GetVictim() == me && u->IsWithinLOSInMap(me, VMAP::ModelIgnoreFlags::M2, LINEOFSIGHT_ALL_CHECKS));\n+                }\n+                if (!cast)\n+                {\n+                    u = (*me->getAttackers().begin());\n+                    cast = (u && (!CCed(u, true) || me->getAttackers().size() > 1) && u->GetDistance(me) < 5.f &&\n+                        u->IsWithinLOSInMap(me, VMAP::ModelIgnoreFlags::M2, LINEOFSIGHT_ALL_CHECKS));\n+                }\n+            }\n+            if (!cast && IsWanderer() && (me->HasUnitMovementFlag(MOVEMENTFLAG_FORWARD) || me->HasUnitState(UNIT_STATE_ROOT)))\n+            {\n+                u = nullptr;\n+                InstanceTemplate const* instt = sObjectMgr->GetInstanceTemplate(me->GetMap()->GetId());\n+                bool map_allows_mount = (!me->GetMap()->IsDungeon() || me->GetMap()->IsBattlegroundOrArena()) && (!instt || instt->AllowMount);\n+                if (!me->GetVictim() ?\n+                    (me->IsInCombat() || !map_allows_mount || !IsOutdoors() || IsFlagCarrier(me)) :\n+                    !me->IsWithinDist(me->GetVictim(), 15.0f + GetSpellAttackRange(true)))\n+                {\n+                    Position forwardPos = me->GetFirstCollisionPosition(30.0f, 0.0f);\n+                    cast = me->GetExactDist2d(forwardPos) > 15.0f;\n+                }\n+            }\n+            if (cast)\n+            {\n+                if (u)\n+                {\n+                    //turn away from target\n+                    me->AttackStop();\n+                    me->SetOrientation(me->GetAbsoluteAngle(u) + float(M_PI) * frand(0.85f, 1.15f));\n+                }\n+                if (doCast(me, GetSpell(BLINK_1)))\n+                    return;\n+            }\n+        }\n+\n+        void CheckFocusMagic(uint32 diff)\n+        {\n+            if (fmCheckTimer > diff || GC_Timer > diff || IAmFree() || me->GetLevel() < 20 || IsCasting() || Rand() > 50)\n+                return;\n+\n+            uint32 FOCUSMAGIC = GetSpell(FOCUS_MAGIC_1);\n+            if (!FOCUSMAGIC)\n+                return;\n+\n+            if (FindAffectedTarget(FOCUSMAGIC, me->GetGUID(), 70, 3))\n+            {\n+                fmCheckTimer = 15000;\n+                return;\n+            }\n+\n+            std::set<Unit*> targets;\n+            if (Group const* gr = master->GetGroup())\n+            {\n+                std::vector<Unit*> members = BotMgr::GetAllGroupMembers(gr);\n+                for (auto i : NPCBots::index_array<uint8, 3>)\n+                {\n+                    if (!targets.empty())\n+                        break;\n+                    for (Unit* member : members)\n+                    {\n+                        if (!(i == 0 ? member->IsPlayer() : member->IsNPCBot()) || me->GetMap() != member->FindMap() ||\n+                            !member->IsAlive() || member->GetPowerType() != POWER_MANA || me->GetExactDist(member) > 30 ||\n+                            member->HasAura(FOCUSMAGIC))\n+                            continue;\n+                        if (i > 0)\n+                        {\n+                            Creature const* bot = member->ToCreature();\n+                            if (bot->GetBotAI()->HasRole(BOT_ROLE_TANK) ||\n+                                bot->GetBotClass() == BOT_CLASS_BM || bot->GetBotClass() == BOT_CLASS_HUNTER ||\n+                                bot->GetBotClass() == BOT_CLASS_SPELLBREAKER || bot->GetBotClass() == BOT_CLASS_DARK_RANGER ||\n+                                bot->GetBotClass() == BOT_CLASS_SEA_WITCH)\n+                                continue;\n+                            if (i < 2 && bot->GetBotAI()->HasRole(BOT_ROLE_DPS))\n+                                continue;\n+                        }\n+                        targets.insert(member);\n+                    }\n+                }\n+            }\n+            else\n+            {\n+                if (master->GetPowerType() == POWER_MANA && me->GetExactDist(master) < 30 && !master->HasAura(FOCUSMAGIC))\n+                    targets.insert(master);\n+            }\n+\n+            if (!targets.empty())\n+            {\n+                Unit* target = targets.size() == 1u ? *targets.begin() : Bcore::Containers::SelectRandomContainerElement(targets);\n+                if (doCast(target, FOCUSMAGIC))\n+                {\n+                    fmCheckTimer = 30000;\n+                    return;\n+                }\n+            }\n+\n+            fmCheckTimer = 5000; //fail\n+        }\n+\n+        void CheckIceBlock(uint32 diff)\n+        {\n+            if (!me->IsAlive() || GC_Timer > diff || me->GetVehicle() || !GetSpell(ICE_BLOCK_1) || Rand() > 60 || IsTank() || IsFlagCarrier(me))\n+                return;\n+\n+            if (iceblockCheckTimer <= diff)\n+            {\n+                if (me->getAttackers().empty() && (!me->IsInCombat() || (GetManaPCT(me) > 45 && GetHealthPCT(me) > 80)))\n+                {\n+                    me->RemoveAurasDueToSpell(GetSpell(ICE_BLOCK_1));\n+                    return;\n+                }\n+                iceblockCheckTimer = std::numeric_limits<uint32>::max();\n+            }\n+\n+            if (!IsSpellReady(ICE_BLOCK_1, diff))\n+                return;\n+\n+            if (me->IsInCombat() && !me->getAttackers().empty() &&\n+                (CCed(me, true) || me->getAttackers().size() > 2 || GetHealthPCT(me) < 40))\n+            {\n+                if (doCast(me, GetSpell(ICE_BLOCK_1)))\n+                    return;\n+            }\n+        }\n+\n+        void CheckColdSnap(uint32 diff)\n+        {\n+            if (!IsSpellReady(COLD_SNAP_1, diff) || !me->IsInCombat() || me->IsMounted() || Rand() > 50)\n+                return;\n+\n+            //TODO: recheck priorities\n+            uint32 needFactor = 0;\n+            uint32 cooldown;\n+            cooldown = GetSpellCooldown(FROST_NOVA_1);\n+            needFactor += !cooldown ? 0 : 3 * cooldown / 220;  //0-100 x3\n+            cooldown = GetSpellCooldown(ICE_BLOCK_1);\n+            needFactor += !cooldown ? 0 : 3 * cooldown / 2400; //0-100 x3\n+            cooldown = shielded ? 0 : GetSpellCooldown(ICE_BARRIER_1);\n+            needFactor += !cooldown ? 0 : 3 * cooldown / 240;  //0-100 x3\n+            cooldown = GetSpellCooldown(FROST_WARD_1);\n+            needFactor += !cooldown ? 0 : 2 * cooldown / 300;  //0-100 x2\n+            cooldown = GetSpellCooldown(ICY_VEINS_1);\n+            needFactor += !cooldown ? 0 : 2 * cooldown / 1500; //0-100 x2\n+            cooldown = (botPet && botPet->IsAlive()) ? 0 : GetSpellCooldown(SUMMON_WATER_ELEMENTAL_1);\n+            needFactor += !cooldown ? 0 : 1 * cooldown / 1500; //0-100\n+            cooldown = GetSpellCooldown(DEEP_FREEZE_1);\n+            needFactor += !cooldown ? 0 : 1 * cooldown / 240;  //0-100\n+            cooldown = GetSpellCooldown(CONE_OF_COLD_1);\n+            needFactor += !cooldown ? 0 : 1 * cooldown / 80;   //0-100\n+            //0-1600\n+\n+            if (needFactor >= 700 && doCast(me, GetSpell(COLD_SNAP_1)))\n+                return;\n+        }\n+\n+        void CheckShield(uint32 diff)\n+        {\n+            //TODO: Mana Shield\n+            if (!GetSpell(ICE_BARRIER_1))\n+                return;\n+\n+            if (shieldCheckTimer <= diff)\n+            {\n+                shieldCheckTimer = 1500;\n+                shielded = me->GetTotalAuraModifierByMiscValue(SPELL_AURA_SCHOOL_ABSORB, 127) > 0;\n+                shielded = shielded ? shielded : me->HasAura(GetSpell(ICE_BARRIER_1));\n+            }\n+\n+            if (shielded || !IsSpellReady(ICE_BARRIER_1, diff) || IsCasting())\n+                return;\n+\n+            if ((me->IsInCombat() && me->GetMap()->Instanceable()) ||\n+                !me->getAttackers().empty() || GetHealthPCT(me) < 90)\n+            {\n+                if (doCast(me, GetSpell(ICE_BARRIER_1)))\n+                    return;\n+            }\n+        }\n+\n+        void CheckWard(uint32 diff)\n+        {\n+            if ((!me->IsInCombat() && !me->HasAuraType(SPELL_AURA_PERIODIC_DAMAGE)) || me->HasAuraType(SPELL_AURA_REFLECT_SPELLS_SCHOOL) ||\n+                !IsSpellReady(FROST_WARD_1, diff) || IsCasting())\n+                return;\n+\n+            uint32 FROSTWARD = canFrostWard ? GetSpell(FROST_WARD_1) : 0;\n+            uint32 FIREWARD = canFireWard ? GetSpell(FIRE_WARD_1) : 0;\n+\n+            if (FIREWARD && doCast(me, FIREWARD))\n+                return;\n+\n+            if (FROSTWARD && doCast(me, FROSTWARD))\n+                return;\n+        }\n+\n+        void ApplyClassSpellCritMultiplierAll(Unit const* /*victim*/, float& crit_chance, SpellInfo const* spellInfo, SpellSchoolMask /*schoolMask*/, WeaponAttackType /*attackType*/) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+\n+            //Shatter\n+            //SHATTER IS HANDLED IN Unit::isSpCrit()\n+\n+            //Arcane Potency: 15%/30% additional crit chance for All spells\n+            if (me->HasAura(ARCANE_POTENCY_BUFF2))\n+                crit_chance += 30.f;\n+            else if (me->HasAura(ARCANE_POTENCY_BUFF1))\n+                crit_chance += 15.f;\n+\n+            //Combustion: 10% additional critical chance for fire spells per stack\n+            if (SPELL_SCHOOL_MASK_FIRE & spellInfo->GetSchoolMask())\n+                if (Aura* combustion = me->GetAura(COMBUSTION_BUFF))\n+                    crit_chance += float(combustion->GetStackAmount() * 10);\n+\n+            //Incineration: 6% additional crit chance for Fire Blast, Scorch, Arcane Blast and Cone of Cold\n+            if (lvl >= 10 &&\n+                (baseId == FIRE_BLAST_1 || baseId == SCORCH_1 ||\n+                baseId == ARCANE_BLAST_1 || baseId == CONE_OF_COLD_1))\n+                crit_chance += 6.f;\n+            //World In Flames: 6% additional critical chance for Flamestrike, Pyroblast, Blast Wave, Dragon's Breath, Living Bomb, Blizzard and Arcane Explosion\n+            if (lvl >= 15 &&\n+                (baseId == FLAMESTRIKE_1 || baseId == PYROBLAST_1 ||\n+                baseId == BLAST_WAVE_1 || baseId == DRAGON_BREATH_1 ||\n+                baseId == BLIZZARD_DAMAGE_1/* || spellId == ARCANEXPLOSION*/ ||\n+                baseId == LIVING_BOMB_1 || baseId == LIVING_BOMB_DAMAGE_1))\n+                crit_chance += 6.f;\n+            //Improved Scorch part 1: 3% additional critical chance for Scorch, Fireball and Frostfire Bolt\n+            if (lvl >= 20 && (baseId == SCORCH_1 || baseId == FIREBALL_1 || baseId == FROSTFIRE_BOLT_1))\n+                crit_chance += 3.f;\n+            //Critical Mass: 6% additional critical chance for Fire spells\n+            if ((GetSpec() == BOT_SPEC_MAGE_FIRE) && lvl >= 30 && (SPELL_SCHOOL_MASK_FIRE & spellInfo->GetSchoolMask()))\n+                crit_chance += 6.f;\n+            //Winter's chill part 1: 3% additional crit chance for Frostbolt\n+            if ((GetSpec() == BOT_SPEC_MAGE_FROST) && lvl >= 35 && baseId == FROSTBOLT_1)\n+                crit_chance += 3.f;\n+\n+            //Glyph of Frostfire Bolt part 2: 2% additional critical chance for Frostfire Bolt\n+            if (/*lvl >= 75 && */baseId == FROSTFIRE_BOLT_1)\n+                crit_chance += 2.f;\n+        }\n+\n+        void ApplyClassDamageMultiplierSpell(int32& damage, SpellNonMeleeDamage& damageinfo, SpellInfo const* spellInfo, WeaponAttackType /*attackType*/, bool iscrit) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+            float fdamage = float(damage);\n+\n+            //apply bonus damage mods\n+            float pctbonus = 0.0f;\n+            if (iscrit)\n+            {\n+                //!!!spell damage is not yet critical and will be multiplied by 1.5\n+                //so we should put here bonus damage mult /1.5\n+                //Burnout: 50% additional crit damage bonus for All spells\n+                //well it's gonna be a little too much eh? skipped\n+                //Ice Shards: 50% additional crit damage bonus for Frost spells\n+                if (lvl >= 15 && (SPELL_SCHOOL_MASK_FROST & spellInfo->GetSchoolMask()))\n+                    pctbonus += 0.334f;\n+                //Spell Power: 50% additional crit damage bonus for All spells\n+                if ((GetSpec() == BOT_SPEC_MAGE_ARCANE) && lvl >= 55)\n+                    pctbonus += 0.334f;\n+                //Combustion: 50% additional crit damage bonus for Fire spells\n+                if ((SPELL_SCHOOL_MASK_FIRE & spellInfo->GetSchoolMask()) && me->HasAura(COMBUSTION_1))\n+                    pctbonus += 0.334f;\n+            }\n+\n+            //Spell Impact: 6% bonus damage for Arcne Explosion, Arcane Blast, Scorch, Fireball, Ice Lance and Cone of Cold\n+            if (lvl >= 20 &&\n+                (/*baseId == ARCANE_EXPLOSION_1 || */baseId == SCORCH_1 ||\n+                baseId == ARCANE_BLAST_1 || baseId == FIREBALL_1 ||\n+                baseId == ICE_LANCE_1 || baseId == CONE_OF_COLD_1))\n+                pctbonus += 0.06f;\n+            //Piercing Ice: 6% bonus damage for Frost spells\n+            if (lvl >= 20 && (SPELL_SCHOOL_MASK_FROST & spellInfo->GetSchoolMask()))\n+                pctbonus += 0.06f;\n+            //Playing with Fire part 1: 3% bonus damage for all spells\n+            if ((GetSpec() == BOT_SPEC_MAGE_FIRE) && lvl >= 30)\n+                pctbonus += 0.03f;\n+            //Improved Cone of Cold: 35% bonus damage for Cone of Cold\n+            if ((GetSpec() == BOT_SPEC_MAGE_FROST) && lvl >= 30 && baseId == CONE_OF_COLD_1)\n+                pctbonus += 0.35f;\n+            //Arcane Instability part 1: 3% bonus damage for all spells\n+            if ((GetSpec() == BOT_SPEC_MAGE_ARCANE) && lvl >= 35)\n+                pctbonus += 0.03f;\n+            //Fire Power: 10% bonus damage for Fire spells\n+            if ((GetSpec() == BOT_SPEC_MAGE_FIRE) && lvl >= 35 && (SPELL_SCHOOL_MASK_FIRE & spellInfo->GetSchoolMask()))\n+                pctbonus += 0.1f;\n+            //Arcane Empowerment part 1,2: 45% / 9% bonus damage (from spellpower) for Arcane Missiles / Arcane Blast\n+            if (GetSpec() == BOT_SPEC_MAGE_ARCANE && lvl >= 40)\n+            {\n+                if (baseId == ARCANE_MISSILES_DAMAGE_1)\n+                    fdamage += me->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_MAGIC) * 0.45f * me->CalculateDefaultCoefficient(spellInfo, SPELL_DIRECT_DAMAGE) * me->CalculateLevelPenalty(spellInfo);\n+                else if (baseId == ARCANE_BLAST_1)\n+                    fdamage += me->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_MAGIC) * 0.09f * me->CalculateDefaultCoefficient(spellInfo, SPELL_DIRECT_DAMAGE) * me->CalculateLevelPenalty(spellInfo);\n+            }\n+            //Arcane Power: +20% bonus damage\n+            if (AuraEffect const* pow = me->GetAuraEffect(SPELL_AURA_ADD_PCT_MODIFIER, SPELLFAMILY_MAGE, 0x0, 0x80000, 0x0))\n+                if (pow->IsAffectedOnSpell(spellInfo))\n+                    pctbonus += 0.2f;\n+            //Molten Fury: 12% bonus damage for All spells against target with less than 35% hp\n+            if ((GetSpec() == BOT_SPEC_MAGE_FIRE) &&\n+                lvl >= 40 && damageinfo.target->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT))\n+                pctbonus += 0.12f;\n+            //Arctic Winds part 1: 5% bonus damage for Frost spells\n+            if ((GetSpec() == BOT_SPEC_MAGE_FROST) && lvl >= 40 && (SPELL_SCHOOL_MASK_FROST & spellInfo->GetSchoolMask()))\n+                pctbonus += 0.05f;\n+            //Empowered Fire part 1: 15% bonus damage (from spellpower) for Fireball, Frostfire Bolt and Pyroblast\n+            if ((GetSpec() == BOT_SPEC_MAGE_FIRE) &&\n+                lvl >= 45 && (baseId == FIREBALL_1 || baseId == FROSTFIRE_BOLT_1 || baseId == PYROBLAST_1))\n+                fdamage += me->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_MAGIC) * 0.15f * me->CalculateDefaultCoefficient(spellInfo, SPELL_DIRECT_DAMAGE) * me->CalculateLevelPenalty(spellInfo);\n+            //Empowered Frostbolt part 1: 10% of spellpower to Frostbolt damage\n+            if ((GetSpec() == BOT_SPEC_MAGE_FROST) && lvl >= 45 && baseId == FROSTBOLT_1)\n+                fdamage += me->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_MAGIC) * 0.1f * me->CalculateDefaultCoefficient(spellInfo, SPELL_DIRECT_DAMAGE) * me->CalculateLevelPenalty(spellInfo);\n+            //Chilled to the Bone part 1: 5% bonus damage for Frostbolt, Frostfire Bolt and Ice Lance\n+            if ((GetSpec() == BOT_SPEC_MAGE_FROST) &&\n+                lvl >= 55 && (baseId == FROSTBOLT_1 || baseId == FROSTFIRE_BOLT_1 || baseId == ICE_LANCE_1))\n+                pctbonus += 0.05f;\n+\n+            //Glyph of Frostfire Bolt part 1: 2% bonus damage for Frostfire Bolt\n+            if (/*lvl >= 75 && */baseId == FROSTFIRE_BOLT_1)\n+                pctbonus += 0.02f;\n+\n+            damage = int32(fdamage * (1.0f + pctbonus));\n+        }\n+\n+        void ApplyClassSpellCostMods(SpellInfo const* spellInfo, int32& cost) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            float fcost = float(cost);\n+            int32 flatbonus = 0;\n+            float pctbonus = 0.0f;\n+\n+            //100% mods\n+            //Firestarter part 2: -100% mana cost for Flamestrike\n+            if (baseId == FLAMESTRIKE_1)\n+                if (me->HasAura(FIRESTARTER_BUFF))\n+                    pctbonus += 1.0f;\n+            //Brain Freeze buff: -100% mana cost for Fireball and Frostfire Bolt while active\n+            //we can check spellFamilyFlags or just use ids, going easy way here\n+            if (baseId == FROSTFIRE_BOLT_1 || baseId == FIREBALL_1)\n+                if (me->HasAura(BRAIN_FREEZE_BUFF))\n+                    pctbonus += 1.0f;\n+            //Clearcasting: -100% mana cost for damaging spells\n+            if (AuraEffect const* eff = me->GetAuraEffect(ARCANE_CONCENTRATION_BUFF, 0, me->GetGUID()))\n+                if (eff->IsAffectedOnSpell(spellInfo))\n+                    pctbonus += 1.0f;\n+            //Missile Barrage: -100% mana cost for Arcane Missiles\n+            if (baseId == ARCANEMISSILES_1)\n+                if (me->GetAuraEffect(SPELL_AURA_ADD_FLAT_MODIFIER, SPELLFAMILY_MAGE, 0x0, 0x2, 0x0))\n+                    pctbonus += 1.0f;\n+\n+            //pct mods\n+            //Precision part 1: -3% mana cost for All spells\n+            if (lvl >= 15)\n+                pctbonus += 0.03f;\n+            //Frost Channeling: -10% mana cost for all spells\n+            if (lvl >= 25)\n+                pctbonus += 0.1f;\n+            //Improved Blink part 1: -50% mana cost for Blink\n+            if ((GetSpec() == BOT_SPEC_MAGE_ARCANE) && lvl >= 30 && baseId == BLINK_1)\n+                pctbonus += 0.5f;\n+\n+            //Arcane Blast: +175% mana cost for Arcane Blast (per stack)\n+            if (baseId == ARCANE_BLAST_1)\n+                if (AuraEffect const* bla = me->GetAuraEffect(SPELL_AURA_MOD_DAMAGE_PERCENT_DONE, SPELLFAMILY_MAGE, 0x0, 0x0, 0xC))\n+                    pctbonus += -1.75f * bla->GetBase()->GetStackAmount();\n+            //Arcane Power: +20% mana cost\n+            if (AuraEffect const* pow = me->GetAuraEffect(SPELL_AURA_ADD_PCT_MODIFIER, SPELLFAMILY_MAGE, 0x0, 0x80000, 0x0))\n+                if (pow->IsAffectedOnSpell(spellInfo))\n+                    pctbonus += -0.2f;\n+\n+            //Glyph of Arcane Intellect: -50% mana cost for Arcane Intellect/Brilliance\n+            if (lvl >= 15 && baseId == ARCANEINTELLECT_1)\n+                pctbonus += 0.5f;\n+            //Glyph of Blast Wave part 1: -15% mana cost for Blast Wave\n+            if (lvl >= 70 && baseId == BLAST_WAVE_1)\n+                pctbonus += 0.15f;\n+\n+            //cost can be < 0\n+            cost = int32(fcost * (1.0f - pctbonus)) - flatbonus;\n+        }\n+\n+        void ApplyClassSpellCastTimeMods(SpellInfo const* spellInfo, int32& casttime) const override\n+        {\n+            //casttime is in milliseconds\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            int32 timebonus = 0;\n+            //float pctbonus = 0.0f;\n+\n+            //100% mods\n+            //Firestarter part 1: -100% cast time for Flamestrike\n+            if (baseId == FLAMESTRIKE_1)\n+                if (me->HasAura(FIRESTARTER_BUFF))\n+                    timebonus += casttime;\n+            //Brain Freeze: -100% cast time for Fireball and Frostfire Bolt\n+            //we can check spellFamilyFlags or just use ids, going easy way here\n+            if (baseId == FROSTFIRE_BOLT_1 || baseId == FIREBALL_1)\n+                if (me->HasAura(BRAIN_FREEZE_BUFF))\n+                    timebonus += casttime;\n+            //Hot Streak: -100% cast time for Pyroblast\n+            if (baseId == PYROBLAST_1)\n+                if (me->HasAura(HOT_STREAK_BUFF))\n+                    timebonus += casttime;\n+            //Presence of Mind: -100% cast time\n+            if (AuraEffect const* eff = me->GetAuraEffect(SPELL_AURA_ADD_PCT_MODIFIER, SPELLFAMILY_MAGE, 0x0, 0x20, 0x0))\n+                if (eff->IsAffectedOnSpell(spellInfo))\n+                    timebonus += casttime;\n+\n+            //flat mods\n+            //Improved Fireball: -0.5 sec cast time for Fireball (Frostfire too for bot)\n+            if (lvl >= 10 && (baseId == FIREBALL_1 || baseId == FROSTFIRE_BOLT_1))\n+                timebonus += 500;\n+            //Improved Frostbolt: -0.5 sec cast time for Frostbolt\n+            if (lvl >= 10 && baseId == FROSTBOLT_1)\n+                timebonus += 500;\n+            //Empowered Frostbolt part 2: -0.2 sec cast time for Frostbolt\n+            if (lvl >= 45 && baseId == FROSTBOLT_1)\n+                timebonus += 200;\n+\n+            //Missile Barrage: -2.5 sec channeling time, -0.5 sec for every tick\n+            if (baseId == ARCANEMISSILES_1 && me->GetAuraEffect(SPELL_AURA_ADD_FLAT_MODIFIER, SPELLFAMILY_MAGE, 0x0, 0x2, 0x0))\n+                timebonus += casttime / 2;\n+\n+            casttime = std::max<int32>(casttime - timebonus, 0);\n+        }\n+\n+        void ApplyClassSpellNotLoseCastTimeMods(SpellInfo const* spellInfo, int32& delayReduce) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            SpellSchoolMask schools = spellInfo->GetSchoolMask();\n+            uint8 lvl = me->GetLevel();\n+            int32 reduceBonus = 0;\n+\n+            if (AuraEffect const* vei = me->GetAuraEffect(SPELL_AURA_MOD_CASTING_SPEED_NOT_STACK, SPELLFAMILY_MAGE, 0x0, 0x4000, 0x0))\n+                if (vei->IsAffectedOnSpell(spellInfo))\n+                    reduceBonus += 100;\n+\n+            if (lvl >= 20 && (schools & SPELL_SCHOOL_MASK_FIRE))\n+                reduceBonus += 70;\n+\n+            if (GetSpec() == BOT_SPEC_MAGE_ARCANE && lvl >= 10 && (baseId == ARCANEMISSILES_1 || baseId == ARCANE_BLAST_1))\n+                reduceBonus += 100;\n+\n+            delayReduce += reduceBonus;\n+        }\n+\n+        void ApplyClassSpellCooldownMods(SpellInfo const* spellInfo, uint32& cooldown) const override\n+        {\n+            //cooldown is in milliseconds\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+            int32 timebonus = 0;\n+            float pctbonus = 0.0f;\n+\n+            //pct mods\n+            //Ice Floes: -20% cooldown for Frost Nova, Cone of Cold, Ice Block and Icy Veins\n+            if (lvl >= 10 &&\n+                (baseId == FROST_NOVA_1 || baseId == CONE_OF_COLD_1 || baseId == ICE_BLOCK_1 || baseId == ICY_VEINS_1))\n+                pctbonus += 0.2f;\n+            //Cold as Ice: -20% cooldown for Ice Barrier, Cold Snap and Summon Water Elemental\n+            if ((GetSpec() == BOT_SPEC_MAGE_FROST) && lvl >= 35 &&\n+                (baseId == ICE_BARRIER_1 || baseId == COLD_SNAP_1 || baseId == SUMMON_WATER_ELEMENTAL_1))\n+                pctbonus += 0.2f;\n+\n+            //flat mods\n+            //Improved Fire Blast: -2 sec cooldown for Fire Blast\n+            if (lvl >= 10 && baseId == FIRE_BLAST_1)\n+                timebonus += 2000;\n+            //Arcane Flows part 2: -2 min cooldown for Evocation\n+            if ((GetSpec() == BOT_SPEC_MAGE_ARCANE) && lvl >= 45 && baseId == EVOCATION_1)\n+                timebonus += 120000;\n+            //Glyph of Water Elemental: -30 sec cooldown for Summon Water Elemental\n+            if (lvl >= 50 && baseId == SUMMON_WATER_ELEMENTAL_1)\n+                timebonus += 30000;\n+\n+            ////Pyroblast (special): ensure no double pyroblast casts\n+            //if (baseId == PYROBLAST_1)\n+            //    timebonus -= 3000;\n+\n+            cooldown = std::max<int32>((float(cooldown) * (1.0f - pctbonus)) - timebonus, 0);\n+        }\n+\n+        void ApplyClassSpellRadiusMods(SpellInfo const* spellInfo, float& radius) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            float flatbonus = 0.0f;\n+            float pctbonus = 0.0f;\n+\n+            //pct mods\n+            //Increased Area (AhnQ set bonus?) 23549\n+            if (lvl >= 60 && (spellInfo->SpellFamilyFlags[0] & 0x1084))\n+                pctbonus += 0.25f;\n+            //Arctic Reach\n+            if (lvl >= 25 && (spellInfo->SpellFamilyFlags[0] & 0x240))\n+                pctbonus += 0.2f;\n+\n+            //flat mods\n+            //Glyph of Blink\n+            if (lvl >= 20 && baseId == BLINK_1)\n+                flatbonus += 5.f;\n+\n+            radius = radius * (1.0f + pctbonus) + flatbonus;\n+        }\n+\n+        void ApplyClassSpellRangeMods(SpellInfo const* spellInfo, float& maxrange) const override\n+        {\n+            //uint32 spellId = spellInfo->Id;\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            float flatbonus = 0.0f;\n+            float pctbonus = 0.0f;\n+\n+            //pct mods\n+            //Arctic Reach: +20% range for Frost Spells\n+            if (lvl >= 25 && ((spellInfo->SpellFamilyFlags[0] & 0x200A0) || (spellInfo->SpellFamilyFlags[1] & 0x100000)))\n+                pctbonus += 0.2f;\n+\n+            //flat mods\n+            //Magic Attunement: +6 yd range for Arcane Spells\n+            if (lvl >= 20 && ((spellInfo->SpellFamilyFlags[0] & 0xA1006C00) || (spellInfo->SpellFamilyFlags[1] & 0x8010)))\n+                flatbonus += 6.f;\n+            //Flame Throwing: +6 yd range for Fire Spells\n+            if (lvl >= 20 && ((spellInfo->SpellFamilyFlags[0] & 0x400017) || (spellInfo->SpellFamilyFlags[1] & 0x20000)))\n+                flatbonus += 6.f;\n+\n+            //Glyph of Deep Freeze\n+            if (lvl >= 60 && baseId == DEEP_FREEZE_1)\n+                flatbonus += 10.f;\n+\n+            //Mage Fire Blast Range Bonus (33066): +6 yd range for Fire Blast\n+            if (lvl >= 60 && baseId == FIRE_BLAST_1)\n+                flatbonus += 6.f;\n+\n+            maxrange = maxrange * (1.0f + pctbonus) + flatbonus;\n+        }\n+\n+        void OnClassSpellGo(SpellInfo const* spellInfo) override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+\n+            //DEBUG\n+            //if (!IAmFree())\n+            //{\n+            //    std::ostringstream msg;\n+            //    msg << \"OnClassSpellGo: \" << spellInfo->SpellName[0] << \" (\" << spellId << \")!\";\n+            //    BotWhisper(msg.view());\n+            //}\n+\n+            if (baseId == SUMMON_WATER_ELEMENTAL_1)\n+                SummonBotPet();\n+\n+            //Mana gem conjure and use\n+            if (baseId == CONJURE_MANA_GEM_1)\n+            {\n+                //ItemTemplate const* gem = sObjectMgr->GetItemTemplate(spellInfo->Effects[0].ItemType);\n+                //ASSERT(gem);\n+                //manaGemCharges = uint8(abs(gem->Spells[1].SpellCharges)); //at index 1\n+\n+                //Do not bother with this crap\n+                manaGemCharges = 3;\n+            }\n+            if (baseId == MANA_GEM_1)\n+            {\n+                //spell cd is 1 min, item cd is 2 min, correct here\n+                SetSpellCooldown(MANA_GEM_1, 120000);\n+                manaGemCharges -= 1;\n+            }\n+\n+            //special cases\n+            //Pyroblast (special): ensure no double pyroblast casts\n+            if (baseId == PYROBLAST_1)\n+                SetSpellCooldown(PYROBLAST_1, 3000);\n+\n+            if (baseId == ICE_BLOCK_1)\n+            {\n+                //Glyph of Ice Block: reset Frost Nova cd\n+                ResetSpellCooldown(FROST_NOVA_1);\n+                iceblockCheckTimer = 4000;\n+            }\n+\n+            //check for minor rotation thingy (skip common triggered on-hit spells\n+            /*if (spellId != FROSTBITE_TRIGGERED && spellId != WINTERS_CHILL_TRIGGERED && spellId != IGNITE_TRIGGERED &&\n+                spellId != ARCANE_CONCENTRATION_BUFF && spellId != ARCANE_POTENCY_BUFF1 && spellId != ARCANE_POTENCY_BUFF2 &&\n+                spellId != FIRESTARTER_BUFF && spellId != BRAIN_FREEZE_BUFF && spellId != HOT_STREAK_BUFF)*/\n+                fbCasted = (baseId == SCORCH_1 || baseId == FROSTBOLT_1 || baseId == FIREBALL_1 || baseId == FROSTFIRE_BOLT_1);\n+\n+            //Handle clearcasting\n+            if (AuraEffect const* eff = me->GetAuraEffect(ARCANE_CONCENTRATION_BUFF, 0, me->GetGUID()))\n+            {\n+                if (eff->IsAffectedOnSpell(spellInfo))\n+                {\n+                    //if (int32 cost = spellInfo->CalcPowerCost(me, spellInfo->GetSchoolMask()))\n+                    {\n+                        //me->ModifyPower(POWER_MANA, cost > 0 ? cost : 0);\n+                        me->RemoveAurasDueToSpell(ARCANE_CONCENTRATION_BUFF);\n+                    }\n+                    //arcane potency has the same affection (damaging spells only)\n+                    me->RemoveAurasDueToSpell(ARCANE_POTENCY_BUFF1);\n+                    me->RemoveAurasDueToSpell(ARCANE_POTENCY_BUFF2);\n+                }\n+            }\n+            //Handle Presence of Mind\n+            bool consumed_Pom = false;\n+            if (AuraEffect const* eff = me->GetAuraEffect(SPELL_AURA_ADD_PCT_MODIFIER, SPELLFAMILY_MAGE, 0x0, 0x20, 0x0))\n+            {\n+                if (eff->IsAffectedOnSpell(spellInfo))\n+                {\n+                    me->RemoveAurasDueToSpell(PRESENCE_OF_MIND_1);\n+                    consumed_Pom = true;\n+                }\n+            }\n+            if (!consumed_Pom)\n+            {\n+                //Firestarter\n+                if (baseId == FLAMESTRIKE_1)\n+                    me->RemoveAurasDueToSpell(FIRESTARTER_BUFF);\n+                //Brain Freeze (Fireball!)\n+                if (baseId == FROSTFIRE_BOLT_1 || baseId == FIREBALL_1)\n+                    me->RemoveAurasDueToSpell(BRAIN_FREEZE_BUFF);\n+                //Hot Streak\n+                if (baseId == PYROBLAST_1)\n+                    me->RemoveAurasDueToSpell(HOT_STREAK_BUFF);\n+            }\n+            //Handle Cold Snap\n+            if (baseId == COLD_SNAP_1)\n+            {\n+                for (auto& [rank1_id, spell] : GetSpellMap())\n+                {\n+                    if (rank1_id == baseId)\n+                        continue;\n+                    if (spell.spellId != 0 && spell.cooldown > 0)\n+                    {\n+                        SpellInfo const* cdInfo = sSpellMgr->GetSpellInfo(rank1_id);\n+                        if (cdInfo && cdInfo->SpellFamilyName == SPELLFAMILY_MAGE && cdInfo->GetRecoveryTime() > 0 &&\n+                            (cdInfo->GetSchoolMask() & SPELL_SCHOOL_MASK_FROST))\n+                            spell.cooldown = 0;\n+                    }\n+                }\n+            }\n+\n+            //Missile Barrage\n+            if (baseId == ARCANEMISSILES_1)\n+                me->RemoveAurasDueToSpell(MISSILE_BARRAGE_BUFF);\n+        }\n+\n+        void SpellHitTarget(Unit* wtarget, SpellInfo const* spell) override\n+        {\n+            Unit* target = wtarget->ToUnit();\n+            if (!target)\n+                return;\n+\n+            if (aftercastTargetGuid != ObjectGuid::Empty)\n+            {\n+                //only players for now\n+                if (!aftercastTargetGuid.IsPlayer())\n+                {\n+                    aftercastTargetGuid = ObjectGuid::Empty;\n+                    return;\n+                }\n+\n+                Player* pTarget = ObjectAccessor::GetPlayer(*me, aftercastTargetGuid);\n+                aftercastTargetGuid = ObjectGuid::Empty;\n+\n+                if (!pTarget/* || me->GetDistance(pTarget) > 15*/)\n+                    return;\n+\n+                //handle effects\n+                for (auto i : NPCBots::index_array<uint8, MAX_SPELL_EFFECTS>)\n+                {\n+                    switch (spell->Effects[i].Effect)\n+                    {\n+                        case SPELL_EFFECT_CREATE_ITEM:\n+                        case SPELL_EFFECT_CREATE_ITEM_2:\n+                        {\n+                            uint32 newitemid = spell->Effects[i].ItemType;\n+                            if (newitemid)\n+                            {\n+                                ItemPosCountVec dest;\n+                                ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(newitemid);\n+                                if (!pProto)\n+                                    return;\n+                                uint32 count = pProto->GetMaxStackSize();\n+                                uint32 no_space = 0;\n+                                InventoryResult msg = pTarget->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, newitemid, count, &no_space);\n+                                if (msg != EQUIP_ERR_OK)\n+                                {\n+                                    if (msg == EQUIP_ERR_INVENTORY_FULL || msg == EQUIP_ERR_CANT_CARRY_MORE_OF_THIS)\n+                                        count -= no_space;\n+                                    else\n+                                    {\n+                                        // if not created by another reason from full inventory or unique items amount limitation\n+                                        pTarget->SendEquipError(msg, nullptr, nullptr, newitemid);\n+                                        continue;\n+                                    }\n+                                }\n+                                if (count)\n+                                {\n+                                    Item* pItem = pTarget->StoreNewItem(dest, newitemid, true, 0);\n+                                    if (!pItem)\n+                                    {\n+                                        pTarget->SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND, nullptr, nullptr);\n+                                        continue;\n+                                    }\n+\n+                                    pTarget->SendNewItem(pItem, count, true, false, true);\n+                                }\n+                            }\n+                            break;\n+                        }\n+                        default:\n+                            break;\n+                    }\n+                }\n+\n+                return;\n+            }\n+\n+            uint32 spellId = spell->Id;\n+            uint32 baseId = spell->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+\n+            if (baseId == ARCANEINTELLECT_1)\n+            {\n+                if (Aura* arc = target->GetAura(spellId, me->GetGUID()))\n+                {\n+                    uint32 dur = HOUR * IN_MILLISECONDS;\n+                    arc->SetDuration(dur);\n+                    arc->SetMaxDuration(dur);\n+                }\n+            }\n+\n+            //Spells with chill effect\n+            //chill amount by spell family mask\n+            //00100000 00000000 00000000 chilled (blizzard)\n+            //00000200 00000000 00000000 conecold\n+            //00000020 00000000 00000000 frbolt\n+            //00000000 00001000 00000008 ffbolt\n+            //00100220 00001000 00000000 permafrst\n+            //00100220 00001000 00000000 cttbn\n+            if (spell->SpellFamilyName == SPELLFAMILY_MAGE &&\n+                ((spell->SpellFamilyFlags[0] & 0x100220) || (spell->SpellFamilyFlags[1] & 0x1000)))\n+            {\n+                //frostbolt, cone of cold, blizzard chill, frostfire bolt\n+                Aura* chill = target->GetAura(spellId, me->GetGUID());\n+                if (chill)\n+                {\n+                    //Permafrost: chill effects duration + 3 sec\n+                    if (lvl >= 15)\n+                    {\n+                        uint32 dur = chill->GetDuration() + 3000;\n+                        chill->SetDuration(dur);\n+                        chill->SetMaxDuration(dur);\n+                    }\n+                    //chill effect is at index 0\n+                    AuraEffect* chillEff = chill->GetEffect(0);\n+                    if (chillEff)\n+                    {\n+                        int32 amount = chillEff->GetAmount();\n+                        if (lvl >= 15)\n+                            amount -= 10; //permafrost\n+                        if ((GetSpec() == BOT_SPEC_MAGE_FROST) && lvl >= 55)\n+                            amount -= 10; //chilled to the bone\n+                        chillEff->ChangeAmount(amount);\n+                    }\n+                }\n+            }\n+\n+            //Glyph of Ice Barrier: 30% increased effect\n+            if (baseId == ICE_BARRIER_1)\n+            {\n+                shielded = true;\n+                if (lvl >= 46)\n+                {\n+                    AuraEffect* barr = me->GetAuraEffect(spellId, 0);\n+                    if (barr)\n+                        barr->ChangeAmount(barr->GetAmount() * 1.3f);\n+                }\n+            }\n+\n+            //Custom things\n+            if (baseId == POLYMORPH_1)\n+            {\n+                poly = true;\n+                polyCheckTimer = 2000;\n+            }\n+\n+            //Winter Veil addition\n+            if (sGameEventMgr->IsActiveEvent(GAME_EVENT_WINTER_VEIL))\n+            {\n+                if (SPELL_SCHOOL_MASK_FROST & spell->GetSchoolMask())\n+                    me->AddAura(44755, target); //snowflakes\n+\n+                //if (baseId == FROSTBOLT_1 && urand(1,100) <= 10)\n+                //    me->CastSpell(target, 25686, true); //10% super snowball\n+            }\n+\n+            OnSpellHitTarget(target, spell);\n+        }\n+\n+        void SpellHit(Unit* wcaster, SpellInfo const* spell) override\n+        {\n+            Unit* caster = wcaster->ToUnit();\n+            if (!caster)\n+                return;\n+\n+            uint32 baseId = spell->GetFirstRankSpell()->Id;\n+\n+            if (baseId == ARCANE_BLAST_DEBUFF)\n+                if (Aura* blas = me->GetAura(spell->Id))\n+                    arcaneBlastStack = blas->GetStackAmount();\n+\n+            //Ward helper\n+            if (spell->HasEffect(SPELL_EFFECT_SCHOOL_DAMAGE) || spell->HasAura(SPELL_AURA_PERIODIC_DAMAGE))\n+            {\n+                if (!canFrostWard && (spell->GetSchoolMask() & SPELL_SCHOOL_MASK_FROST))\n+                    canFrostWard = true;\n+                if (!canFireWard && (spell->GetSchoolMask() & SPELL_SCHOOL_MASK_FIRE))\n+                    canFireWard = true;\n+            }\n+\n+            OnSpellHit(caster, spell);\n+        }\n+\n+        void DamageDealt(Unit* victim, uint32& damage, DamageEffectType damageType, SpellSchoolMask damageSchoolMask) override\n+        {\n+            bot_ai::DamageDealt(victim, damage, damageType, damageSchoolMask);\n+        }\n+\n+        void DamageTaken(Unit* u, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellSchoolMask /*schoolMask*/) override\n+        {\n+            if (!u)\n+                return;\n+            if (!u->IsInCombat() && !me->IsInCombat())\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void OwnerAttackedBy(Unit* u) override\n+        {\n+            if (!u)\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void SummonBotPet()\n+        {\n+            if (botPet)\n+                UnsummonAll(false);\n+\n+            uint32 entry = BOT_PET_WATER_ELEMENTAL;\n+\n+            Position pos;\n+\n+            //glyphed: permanent\n+            Creature* myPet = me->SummonCreature(entry, *me, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 3000);\n+            me->GetNearPoint(myPet, pos.m_positionX, pos.m_positionY, pos.m_positionZ, 0.f, 2, me->GetOrientation());\n+            myPet->GetMotionMaster()->MovePoint(me->GetMapId(), pos);\n+            myPet->SetCreator(master);\n+            myPet->SetOwnerGUID(me->GetGUID());\n+            myPet->SetFaction(master->GetFaction());\n+            myPet->SetControlledByPlayer(!IAmFree());\n+            myPet->SetPvP(me->IsPvP());\n+            myPet->SetByteValue(UNIT_FIELD_BYTES_2, 1, master->GetByteValue(UNIT_FIELD_BYTES_2, 1));\n+            myPet->SetUInt32Value(UNIT_CREATED_BY_SPELL, SUMMON_WATER_ELEMENTAL_1);\n+\n+            botPet = myPet;\n+        }\n+\n+        void UnsummonAll(bool savePets = true) override\n+        {\n+            UnsummonPet(savePets);\n+        }\n+\n+        void SummonedCreatureDies(Creature* /*summon*/, Unit* /*killer*/) override\n+        {\n+        }\n+\n+        void SummonedCreatureDespawn(Creature* summon) override\n+        {\n+            //BOT_LOG_ERROR(\"entities.unit\", \"SummonedCreatureDespawn: %s's %s\", me->GetName().c_str(), summon->GetName().c_str());\n+            if (summon == botPet)\n+                botPet = nullptr;\n+        }\n+\n+        uint32 GetAIMiscValue(uint32 data) const override\n+        {\n+            switch (data)\n+            {\n+                case BOTAI_MISC_PET_TYPE:\n+                    return BOT_PET_WATER_ELEMENTAL;\n+                default:\n+                    return 0;\n+            }\n+        }\n+\n+        float GetSpellAttackRange(bool longRange) const override\n+        {\n+            return longRange ? CalcSpellMaxRange(FROSTBOLT_1) : 20.f;\n+        }\n+\n+        void Reset() override\n+        {\n+            UnsummonAll(false);\n+\n+            polyCheckTimer = 0;\n+            fmCheckTimer = 0;\n+            iceblockCheckTimer = 0;\n+            shieldCheckTimer = 0;\n+            arcaneBlastStack = 0;\n+            manaGemCharges = 0;\n+\n+            poly = false;\n+            shielded = false;\n+            fbCasted = false;\n+\n+            DefaultInit();\n+        }\n+\n+        void ReduceCD(uint32 diff) override\n+        {\n+            if (polyCheckTimer > diff)              polyCheckTimer -= diff;\n+            if (fmCheckTimer > diff)                fmCheckTimer -= diff;\n+            if (iceblockCheckTimer > diff)          iceblockCheckTimer -= diff;\n+            if (shieldCheckTimer > diff)            shieldCheckTimer -= diff;\n+        }\n+\n+        void InitPowers() override\n+        {\n+            me->SetPowerType(POWER_MANA);\n+        }\n+\n+        void InitSpells() override\n+        {\n+            uint8 lvl = me->GetLevel();\n+            bool isArca = GetSpec() == BOT_SPEC_MAGE_ARCANE;\n+            bool isFire = GetSpec() == BOT_SPEC_MAGE_FIRE;\n+            bool isFros = GetSpec() == BOT_SPEC_MAGE_FROST;\n+\n+            InitSpellMap(DAMPENMAGIC_1);\n+            InitSpellMap(AMPLIFYMAGIC_1);\n+            InitSpellMap(ARCANEINTELLECT_1);\n+            InitSpellMap(ARCANEMISSILES_1);\n+            InitSpellMap(ARCANE_BLAST_1);\n+            InitSpellMap(POLYMORPH_1);\n+            InitSpellMap(COUNTERSPELL_1);\n+            InitSpellMap(SPELLSTEAL_1);\n+            InitSpellMap(EVOCATION_1);\n+            InitSpellMap(BLINK_1);\n+            InitSpellMap(REMOVE_CURSE_1);\n+            InitSpellMap(INVISIBILITY_1);\n+            InitSpellMap(SCORCH_1);\n+            InitSpellMap(FIRE_BLAST_1);\n+            InitSpellMap(FLAMESTRIKE_1);\n+            InitSpellMap(DAMPENMAGIC_1);\n+            InitSpellMap(FROSTBOLT_1);\n+            InitSpellMap(FROST_NOVA_1);\n+            InitSpellMap(CONE_OF_COLD_1);\n+            InitSpellMap(BLIZZARD_1);\n+            InitSpellMap(FROST_ARMOR_1);\n+            InitSpellMap(ICE_ARMOR_1);\n+            InitSpellMap(MOLTEN_ARMOR_1);\n+            InitSpellMap(ICE_BLOCK_1);\n+ /*Special*/InitSpellMap(BLIZZARD_DAMAGE_1); //important\n+ /*Special*/InitSpellMap(LIVING_BOMB_DAMAGE_1); //important\n+            InitSpellMap(SLOW_FALL_1);\n+            InitSpellMap(ICE_LANCE_1);\n+            //InitSpellMap(FROST_WARD_1);\n+            //InitSpellMap(FIRE_WARD_1);\n+            InitSpellMap(MIRROR_IMAGE_1);\n+\n+ /*Special*/InitSpellMap(CONJURE_MANA_GEM_1);\n+ /*Special*/InitSpellMap(MANA_GEM_1);\n+\n+            InitSpellMap(RITUAL_OF_REFRESHMENT_1); //not casted\n+\n+  /*Talent*/lvl >= 20 ? InitSpellMap(FOCUS_MAGIC_1) : RemoveSpell(FOCUS_MAGIC_1);\n+  /*Talent*/lvl >= 30 && (isArca || isFire) ? InitSpellMap(PRESENCE_OF_MIND_1) : RemoveSpell(PRESENCE_OF_MIND_1);\n+  /*Talent*/lvl >= 40 && isArca ? InitSpellMap(ARCANE_POWER_1) : RemoveSpell(ARCANE_POWER_1);\n+\n+  /*Talent*/lvl >= 20 ? InitSpellMap(PYROBLAST_1) : RemoveSpell(PYROBLAST_1);\n+  /*Talent*/lvl >= 30 && isFire ? InitSpellMap(BLAST_WAVE_1) : RemoveSpell(BLAST_WAVE_1);\n+  /*Talent*/lvl >= 40 && isFire ? InitSpellMap(DRAGON_BREATH_1) : RemoveSpell(DRAGON_BREATH_1);\n+  /*Talent*/lvl >= 50 && isFire ? InitSpellMap(COMBUSTION_1) : RemoveSpell(COMBUSTION_1);\n+  /*Talent*/lvl >= 60 && isFire ? InitSpellMap(LIVING_BOMB_1) : RemoveSpell(LIVING_BOMB_1);\n+\n+  /*Talent*/lvl >= 20 ? InitSpellMap(ICY_VEINS_1) : RemoveSpell(ICY_VEINS_1);\n+  /*Talent*/lvl >= 30 && isFros ? InitSpellMap(COLD_SNAP_1) : RemoveSpell(COLD_SNAP_1);\n+  /*Talent*/lvl >= 40 && isFros ? InitSpellMap(ICE_BARRIER_1) : RemoveSpell(ICE_BARRIER_1);\n+  /*Talent*/lvl >= 50 && isFros ? InitSpellMap(SUMMON_WATER_ELEMENTAL_1) : RemoveSpell(SUMMON_WATER_ELEMENTAL_1);\n+  /*Talent*/lvl >= 60 && isFros ? InitSpellMap(DEEP_FREEZE_1) : RemoveSpell(DEEP_FREEZE_1);\n+\n+            InitSpellMap(FROSTFIRE_BOLT_1);\n+            InitSpellMap(FIREBALL_1);\n+            FROSTFIREBOLT = GetSpell(FROSTFIRE_BOLT_1) ? FROSTFIRE_BOLT_1 : FIREBALL_1;\n+        }\n+\n+        void ApplyClassPassives() const override\n+        {\n+            uint8 level = master->GetLevel();\n+            bool isArca = GetSpec() == BOT_SPEC_MAGE_ARCANE;\n+            bool isFire = GetSpec() == BOT_SPEC_MAGE_FIRE;\n+            bool isFros = GetSpec() == BOT_SPEC_MAGE_FROST;\n+\n+            RefreshAura(ARCANE_CONCENTRATION, level >= 15 ? 1 : 0);\n+            RefreshAura(ARCANE_MEDITATION, level >= 25 ? 1 : 0); //mana regen 1\n+            RefreshAura(TORMENT_THE_WEAK, level >= 25 ? 1 : 0);\n+            RefreshAura(IMPROVED_COUNTERSPELL2, isArca && level >= 26 ? 1 : 0);\n+            RefreshAura(IMPROVED_COUNTERSPELL1, isArca && level >= 25 && level < 26 ? 1 : 0);\n+            RefreshAura(ARCANE_POTENCY2, isArca && level >= 36 ? 1 : 0);\n+            RefreshAura(ARCANE_POTENCY1, isArca && level >= 35 && level < 36 ? 1 : 0);\n+            RefreshAura(ARCANE_EMPOWERMENT, isArca && level >= 40 ? 1 : 0);\n+            RefreshAura(INCANTERS_ABSORPTION3, isArca && level >= 42 ? 1 : 0);\n+            RefreshAura(INCANTERS_ABSORPTION2, isArca && level >= 41 && level < 42 ? 1 : 0);\n+            RefreshAura(INCANTERS_ABSORPTION1, isArca && level >= 40 && level < 41 ? 1 : 0);\n+            RefreshAura(MISSILE_BARRAGE, isArca && level >= 45 ? 1 : 0);\n+\n+            RefreshAura(IGNITE, level >= 15 ? 1 : 0);\n+            RefreshAura(BURNING_DETERMINATION, level >= 15 ? 1 : 0);\n+            RefreshAura(IMPACT, level >= 20 ? 1 : 0);\n+            RefreshAura(IMPROVED_SCORCH, level >= 25 ? 1 : 0);\n+            RefreshAura(MOLTEN_SHIELDS, level >= 25 ? 1 : 0);\n+            RefreshAura(MASTER_OF_ELEMENTS, level >= 25 ? 1 : 0);\n+            RefreshAura(BLAZING_SPEED, isFire && level >= 35 ? 1 : 0);\n+            RefreshAura(PYROMANIAC, isFire && level >= 40 ? 1 : 0); //mana regen 2\n+            RefreshAura(FIRESTARTER2, isFire && level >= 51 ? 1 : 0);\n+            RefreshAura(FIRESTARTER1, isFire && level >= 50 && level < 51 ? 1 : 0);\n+            RefreshAura(HOT_STREAK, isFire && level >= 50 ? 1 : 0);\n+\n+            RefreshAura(FROSTBITE3, level >= 12 ? 1 : 0);\n+            RefreshAura(FROSTBITE2, level >= 11 && level < 12 ? 1 : 0);\n+            RefreshAura(FROSTBITE1, level >= 10 && level < 11 ? 1 : 0);\n+            RefreshAura(FROST_WARDING, level >= 15 ? 1 : 0);\n+            RefreshAura(IMPROVED_BLIZZARD, level >= 20 ? 1 : 0);\n+            RefreshAura(SHATTER3, level >= 27 ? 1 : 0);\n+            RefreshAura(SHATTER2, level >= 26 && level < 27 ? 1 : 0);\n+            RefreshAura(SHATTER1, level >= 25 && level < 26 ? 1 : 0);\n+            RefreshAura(WINTERS_CHILL3, isFros && level >= 37 ? 1 : 0);\n+            RefreshAura(WINTERS_CHILL2, isFros && level >= 36 && level < 37 ? 1 : 0);\n+            RefreshAura(WINTERS_CHILL1, isFros && level >= 35 && level < 36 ? 1 : 0);\n+            RefreshAura(SHATTERED_BARRIER, isFros && level >= 45 ? 1 : 0);\n+            //RefreshAura(ARCTIC_WINDS, isFros && level >= 45 ? 1 : 0); //only miss chance\n+            RefreshAura(FINGERS_OF_FROST, isFros && level >= 45 ? 1 : 0);\n+            RefreshAura(BRAIN_FREEZE3, isFros && level >= 53 ? 1 : 0);\n+            RefreshAura(BRAIN_FREEZE2, isFros && level >= 51 && level < 52 ? 1 : 0);\n+            RefreshAura(BRAIN_FREEZE1, isFros && level >= 50 && level < 51 ? 1 : 0);\n+\n+            RefreshAura(GLYPH_POLYMORPH, level >= 15 ? 1 : 0);\n+            RefreshAura(GLYPG_REMOVE_CURSE, level >= 18 ? 1 : 0);\n+            RefreshAura(GLYPH_ICY_VEINS, level >= 20 ? 1 : 0);\n+            RefreshAura(GLYPH_LIVING_BOMB, level >= 60 ? 1 : 0);\n+            RefreshAura(GLYPH_ICE_LANCE, level >= 66 ? 1 : 0);\n+        }\n+\n+        bool CanUseManually(uint32 basespell) const override\n+        {\n+            switch (basespell)\n+            {\n+                case DAMPENMAGIC_1:\n+                case AMPLIFYMAGIC_1:\n+                case ARCANEINTELLECT_1:\n+                case EVOCATION_1:\n+                case REMOVE_CURSE_1:\n+                case FOCUS_MAGIC_1:\n+                case PRESENCE_OF_MIND_1:\n+                case ARCANE_POWER_1:\n+                case ICE_ARMOR_1:\n+                case ICE_BARRIER_1:\n+                case COMBUSTION_1:\n+                case ICY_VEINS_1:\n+                case BLAST_WAVE_1:\n+                case FLAMESTRIKE_1:\n+                case FROST_NOVA_1:\n+                case BLIZZARD_1:\n+                case ICE_BLOCK_1:\n+                case COLD_SNAP_1:\n+                case INVISIBILITY_1:\n+                case SLOW_FALL_1:\n+                case CONJURE_MANA_GEM_1:\n+                case SUMMON_WATER_ELEMENTAL_1:\n+                case MIRROR_IMAGE_1:\n+                    return true;\n+                case FROST_ARMOR_1:\n+                    return !GetSpell(ICE_ARMOR_1);\n+                //case MANA_GEM_1:\n+                //    return manaGemCharges > 0;\n+                default:\n+                    return false;\n+            }\n+        }\n+\n+        std::vector<uint32> const* GetDamagingSpellsList() const override\n+        {\n+            return &Mage_spells_damage;\n+        }\n+        std::vector<uint32> const* GetCCSpellsList() const override\n+        {\n+            return &Mage_spells_cc;\n+        }\n+        //std::vector<uint32> const* GetHealingSpellsList() const override\n+        //{\n+        //    return &Mage_spells_heal;\n+        //}\n+        std::vector<uint32> const* GetSupportSpellsList() const override\n+        {\n+            return &Mage_spells_support;\n+        }\n+\n+    private:\n+        //Spells\n+/*frst*/uint32 FROSTFIREBOLT;\n+        //Timers\n+/*exc.*/uint32 polyCheckTimer, fmCheckTimer, iceblockCheckTimer, shieldCheckTimer;\n+        //Counters\n+/*exc.*/uint8 arcaneBlastStack;\n+/*exc.*/uint8 manaGemCharges;\n+        //Check\n+/*exc.*/bool poly, shielded, fbCasted;\n+/*exc.*/bool canFrostWard, canFireWard;\n+    };\n+};\n+\n+void AddSC_mage_bot()\n+{\n+    new mage_bot();\n+}\ndiff --git a/src/server/game/AI/NpcBots/bot_necromancer_ai.cpp b/src/server/game/AI/NpcBots/bot_necromancer_ai.cpp\nnew file mode 100644\nindex 0000000000..4b44813356\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bot_necromancer_ai.cpp\n@@ -0,0 +1,770 @@\n+#include \"bot_ai.h\"\n+#include \"bot_GridNotifiers.h\"\n+#include \"botlogtraits.h\"\n+#include \"botmgr.h\"\n+#include \"botspell.h\"\n+#include \"bottext.h\"\n+#include \"bottraits.h\"\n+#include \"CellImpl.h\"\n+#include \"GridNotifiers.h\"\n+#include \"GridNotifiersImpl.h\"\n+#include \"Group.h\"\n+//#include \"MotionMaster.h\"\n+#include \"Player.h\"\n+#include \"ScriptMgr.h\"\n+#include \"Spell.h\"\n+#include \"SpellAuras.h\"\n+#include \"SpellMgr.h\"\n+#include \"TemporarySummon.h\"\n+//#include \"World.h\"\n+/*\n+Necromancer NpcBot (by Trickerer onlysuffering@gmail.com)\n+Description:\n+Necromancer (Warcraft III / Disablo II tribute)\n+Abilities:\n+1) Shadow Bolt: main attack, single target, no mana cost\n+Complete - 90%\n+TODO:\n+maximum skeletons for botparty\n+fine-tune corpse explosion conditions\n+*/\n+\n+enum NecromancerBaseSpells\n+{\n+    MAIN_ATTACK_1           = SPELL_SHADOW_BOLT2,\n+    RAISE_DEAD_1            = SPELL_RAISE_DEAD,\n+    UNHOLY_FRENZY_1         = SPELL_UNHOLY_FRENZY,\n+    CRIPPLE_1               = SPELL_CRIPPLE,\n+\n+    CORPSE_EXPLOSION_1      = SPELL_CORPSE_EXPLOSION,\n+    //ATTRACT_1               = SPELL_BLOOD_CURSE\n+};\n+enum NecromancerSpecial\n+{\n+    MH_ATTACK_ANIM          = SPELL_ATTACK_MELEE_1H,\n+\n+    RAISE_DEAD_COST         = 50 * 5, // 75 * 5, Reduced to match playstyle (1-2,3?) necromancers\n+    UNHOLY_FRENZY_COST      = 50 * 5,\n+    CRIPPLE_COST            = 175 * 5,\n+    CORPSE_EXPLOSION_COST   = 100 * 5,\n+    //ATTRACT_COST            = 200 * 5,\n+\n+    //get 80% mana back if casting on a skeleton\n+    UNHOLY_FRENZY_REFUND    = UNHOLY_FRENZY_COST / 10 * 8,\n+\n+    MAX_MINIONS             = 12,\n+\n+    SPELL_SPAWN_ANIM        = 25035,\n+    SPELL_BLOODY_EXPLOSION  = 36599,\n+\n+    MODEL_BLOODY_BONES      = 25538,\n+\n+    CORPSE_EXPLOSION_DAMAGE = 50444, //DK spell\n+\n+    CE_DAMAGE_PCT_BASE      = 35,\n+    CE_DAMAGE_PCT_PER_LEVEL = 1,\n+\n+    CE_MIN_TARGETS          = 3\n+};\n+\n+static const std::vector<uint32> Necromancer_spells_damage{ /*MAIN_ATTACK_1, */CORPSE_EXPLOSION_1/*, ATTRACT_1*/ };\n+static const std::vector<uint32> Necromancer_spells_support{ RAISE_DEAD_1, UNHOLY_FRENZY_1, CRIPPLE_1/*, ATTRACT_1*/ };\n+\n+class necromancer_bot : public CreatureScript\n+{\n+public:\n+    necromancer_bot() : CreatureScript(\"necromancer_bot\") { }\n+\n+    CreatureAI* GetAI(Creature* creature) const override\n+    {\n+        return new necromancer_botAI(creature);\n+    }\n+\n+    bool OnGossipHello(Player* player, Creature* creature) override\n+    {\n+        return creature->GetBotAI()->OnGossipHello(player, 0);\n+    }\n+\n+    bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action) override\n+    {\n+        if (bot_ai* ai = creature->GetBotAI())\n+            return ai->OnGossipSelect(player, creature, sender, action);\n+        return true;\n+    }\n+\n+    bool OnGossipSelectCode(Player* player, Creature* creature, uint32 sender, uint32 action, char const* code) override\n+    {\n+        if (bot_ai* ai = creature->GetBotAI())\n+            return ai->OnGossipSelectCode(player, creature, sender, action, code);\n+        return true;\n+    }\n+\n+    struct necromancer_botAI : public bot_ai\n+    {\n+        necromancer_botAI(Creature* creature) : bot_ai(creature)\n+        {\n+            _botclass = BOT_CLASS_NECROMANCER;\n+\n+            InitUnitFlags();\n+\n+            //necromancer immunities\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_POSSESS, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_CHARM, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_SILENCE, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_SHAPESHIFT, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_TRANSFORM, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_BLOCK_SPELL_FAMILY, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_POLYMORPH, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_INTERRUPT, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SILENCE, true);\n+        }\n+\n+        bool doCast(Unit* victim, uint32 spellId)\n+        {\n+            if (CheckBotCast(victim, spellId) != SPELL_CAST_OK)\n+                return false;\n+            return bot_ai::doCast(victim, spellId);\n+        }\n+\n+        void StartAttack(Unit* u, bool force = false)\n+        {\n+            if (!bot_ai::StartAttack(u, force))\n+                return;\n+            GetInPosition(force, u);\n+        }\n+\n+        void JustEngagedWith(Unit* u) override { bot_ai::JustEngagedWith(u); }\n+        void AttackStart(Unit*) override { }\n+        void KilledUnit(Unit* u) override { bot_ai::KilledUnit(u); }\n+        void EnterEvadeMode(EvadeReason why = EVADE_REASON_OTHER) override { bot_ai::EnterEvadeMode(why); }\n+        void MoveInLineOfSight(Unit* u) override { bot_ai::MoveInLineOfSight(u); }\n+        void JustDied(Unit* u) override { UnsummonAll(false); bot_ai::JustDied(u); }\n+        void DoNonCombatActions(uint32 /*diff*/) { }\n+\n+        void CheckCorpseExplosion(uint32 diff)\n+        {\n+            if (!IsSpellReady(CORPSE_EXPLOSION_1, diff) || _corpseExplosionCheckTimer > diff ||\n+                me->GetLevel() < 40 || me->GetPower(POWER_MANA) < CORPSE_EXPLOSION_COST ||  Rand() > 80)\n+                return;\n+\n+            _corpseExplosionCheckTimer = 500;\n+\n+            SpellInfo const* ceinfo = AssertBotSpellInfoOverride(GetSpell(CORPSE_EXPLOSION_1));\n+            float ceradius = ceinfo->GetEffect(EFFECT_0).RadiusEntry->RadiusMax;\n+            ApplyBotSpellRadiusMods(ceinfo, ceradius);\n+\n+            //1. Corpse near current target\n+            if ((IAmFree() || !master->GetGroup() || master->GetGroup()->GetMembersCount() <= 3) &&\n+                me->GetVictim() && me->GetVictim()->GetHealth() <= me->GetMaxHealth() * 3)\n+            {\n+                auto corpse_pred = [this, mindist = ceradius](Creature const* c) mutable {\n+                    if (_isUsableCorpse(c) && c->GetDistance(me->GetVictim()) < mindist)\n+                    {\n+                        mindist = c->GetDistance(me->GetVictim());\n+                        return true;\n+                    }\n+                    return false;\n+                };\n+                Creature* creature = nullptr;\n+                Bcore::CreatureLastSearcher searcher(me, creature, corpse_pred);\n+                Cell::VisitObjects(me, searcher, ceinfo->RangeEntry->RangeMax[0]);\n+\n+                if (creature)\n+                {\n+                    if (doCast(creature, GetSpell(CORPSE_EXPLOSION_1)))\n+                    {\n+                        me->CastSpell(me, MH_ATTACK_ANIM, true);\n+                        return;\n+                    }\n+                }\n+            }\n+\n+            //2. Find a corpse with enough idiots around it (this one in n^2 so open for reviews)\n+            {\n+                auto corpse_pred = [this, ceradius = ceradius, maxmob = std::size_t(CE_MIN_TARGETS-1)](Creature const* c) mutable {\n+                    if (_isUsableCorpse(c))\n+                    {\n+                        std::list<Unit*> units;\n+                        NearbyHostileUnitCheck check(me, ceradius, this, 0, c);\n+                        Bcore::UnitListSearcher searcher(c, units, check);\n+                        Cell::VisitObjects(c, searcher, ceradius);\n+                        if (units.size() > maxmob)\n+                        {\n+                            maxmob = units.size();\n+                            return true;\n+                        }\n+                        return false;\n+                    }\n+                    return false;\n+                };\n+                std::list<Creature*> corpses;\n+                Bcore::CreatureListSearcher searcher(me, corpses, corpse_pred);\n+                Cell::VisitObjects(me, searcher, ceinfo->RangeEntry->RangeMax[0]);\n+\n+                if (Creature* corpse = corpses.empty() ? nullptr : corpses.size() == 1 ? corpses.front() :\n+                    Bcore::Containers::SelectRandomContainerElement(corpses))\n+                {\n+                    if (doCast(corpse, GetSpell(CORPSE_EXPLOSION_1)))\n+                    {\n+                        me->CastSpell(me, MH_ATTACK_ANIM, true);\n+                        return;\n+                    }\n+                }\n+            }\n+        }\n+\n+        void CheckRaiseDead(uint32 diff)\n+        {\n+            if (!IsSpellReady(RAISE_DEAD_1, diff) || _raiseDeadCheckTimer > diff || _minions.size() + 2 > MAX_MINIONS ||\n+                me->GetPower(POWER_MANA) < RAISE_DEAD_COST || Rand() > 50)\n+                return;\n+\n+            _raiseDeadCheckTimer = 500;\n+\n+            auto corpse_pred = [this, mindist = 25.f](Creature const* c) mutable {\n+                if (_isUsableCorpse(c) && c->GetDistance(me) < mindist)\n+                {\n+                    mindist = c->GetDistance(me);\n+                    return true;\n+                }\n+                return false;\n+            };\n+            Creature* creature = nullptr;\n+            Bcore::CreatureLastSearcher searcher(me, creature, corpse_pred);\n+            Cell::VisitObjects(me, searcher, 25.f);\n+\n+            if (creature)\n+            {\n+                if (doCast(creature, GetSpell(RAISE_DEAD_1)))\n+                    return;\n+            }\n+        }\n+\n+        void CheckUnholyFrenzy(uint32 diff)\n+        {\n+            if (!IsSpellReady(UNHOLY_FRENZY_1, diff) || me->GetLevel() < 30 || me->GetPower(POWER_MANA) < UNHOLY_FRENZY_COST || Rand() > 35)\n+                return;\n+\n+            static const auto frenzy_pred_player = [](Player const* pl, Unit const* nec) -> bool {\n+                return (pl->GetVictim() && pl->IsInCombat() && IsMeleeClass(pl->GetClass()) && nec->GetDistance(pl) < 30 &&\n+                    pl->GetDistance(pl->GetVictim()) < 15 && pl->getAttackers().empty() && !CCed(pl, true) &&\n+                    !pl->HasAuraType(SPELL_AURA_PERIODIC_DAMAGE) && pl->GetHealth() >= nec->GetMaxHealth());\n+            };\n+\n+            static const auto frenzy_pred_bot = [](Creature const* bot, Unit const* nec) -> bool {\n+                return (IsMeleeClass(bot->GetBotClass()) && bot->GetVictim() && !bot->GetBotAI()->IsTank(bot) &&\n+                    bot->GetBotAI()->HasRole(BOT_ROLE_DPS) && !bot->GetBotAI()->HasRole(BOT_ROLE_RANGED) &&\n+                    nec->GetDistance(bot) < 30 && bot->GetDistance(bot->GetVictim()) < 15 &&\n+                    bot->getAttackers().empty() && !CCed(bot, true) &&\n+                    !bot->HasAuraType(SPELL_AURA_PERIODIC_DAMAGE) && bot->GetHealth() >= nec->GetMaxHealth());\n+            };\n+\n+            Unit* target = nullptr;\n+\n+            //master\n+            if (!IsTank(master) && frenzy_pred_player(master, me))\n+                target = master;\n+            //minions\n+            else if (HasRole(BOT_ROLE_DPS) && !_minions.empty())\n+            {\n+                for (Unit* minion : _minions)\n+                {\n+                    if (minion->GetVictim() && GetHealthPCT(minion) > 80 && me->GetDistance(minion) < 30 && !CCed(minion, true) &&\n+                        !minion->HasAuraType(SPELL_AURA_PERIODIC_DAMAGE))\n+                    {\n+                        target = minion;\n+                        break;\n+                    }\n+                }\n+            }\n+\n+            if (!target)\n+            {\n+                std::set<Unit*> targets;\n+                if (Group const* gr = !IAmFree() ? master->GetGroup() : GetGroup())\n+                {\n+                    std::vector<Unit*> members = BotMgr::GetAllGroupMembers(gr);\n+                    for (auto i : NPCBots::index_array<uint8, 2>)\n+                    {\n+                        if (!targets.empty())\n+                            break;\n+                        for (Unit* member : members)\n+                        {\n+                            if (!(i == 0 ? member->IsPlayer() : member->IsNPCBot()) || me->GetMap() != member->FindMap() ||\n+                                member->GetGUID() == master->GetGUID())\n+                                continue;\n+                            if (member->IsPlayer() ?\n+                                (!IsTank(member) && frenzy_pred_player(member->ToPlayer(), me)) :\n+                                frenzy_pred_bot(member->ToCreature(), me))\n+                                targets.insert(member);\n+                        }\n+                    }\n+                }\n+                if (!targets.empty())\n+                    target = targets.size() == 1u ? *targets.begin() : Bcore::Containers::SelectRandomContainerElement(targets);\n+            }\n+\n+            if (target && doCast(target, GetSpell(UNHOLY_FRENZY_1)))\n+            {\n+                if (target->IsPlayer())\n+                    ReportSpellCast(UNHOLY_FRENZY_1, LocalizedNpcText(target->ToPlayer(), BOT_TEXT__ON_YOU), target->ToPlayer());\n+                return;\n+            }\n+\n+            SetSpellCooldown(UNHOLY_FRENZY_1, 1000); //fail\n+        }\n+\n+        void UpdateAI(uint32 diff) override\n+        {\n+            if (!GlobalUpdate(diff))\n+                return;\n+\n+            //Interrupt corpse-usage spells if no longer usable\n+            if (Spell const* spell = me->GetCurrentSpell(CURRENT_GENERIC_SPELL))\n+            {\n+                if ((spell->GetSpellInfo()->GetFirstRankSpell()->Id == RAISE_DEAD_1 ||\n+                    spell->GetSpellInfo()->GetFirstRankSpell()->Id == CORPSE_EXPLOSION_1))\n+                {\n+                    Unit const* target = ObjectAccessor::GetUnit(*me, spell->m_targets.GetObjectTargetGUID());\n+                    if (target && target->GetDisplayId() != target->GetNativeDisplayId())\n+                        me->InterruptSpell(CURRENT_GENERIC_SPELL);\n+                }\n+            }\n+\n+            DoVehicleActions(diff);\n+            if (!CanBotAttackOnVehicle())\n+                return;\n+\n+            if (IsPotionReady())\n+            {\n+                if (me->GetPower(POWER_MANA) < CORPSE_EXPLOSION_COST)\n+                    DrinkPotion(true);\n+                else if (GetHealthPCT(me) < 50)\n+                    DrinkPotion(false);\n+            }\n+\n+            if (ProcessImmediateNonAttackTarget())\n+                return;\n+\n+            if (!CheckAttackTarget())\n+                return;\n+\n+            if (IsCasting())\n+                return;\n+\n+            CheckCorpseExplosion(diff);\n+            CheckRaiseDead(diff);\n+            CheckUnholyFrenzy(diff);\n+\n+            CheckUsableItems(diff);\n+\n+            Attack(diff);\n+        }\n+\n+        void Attack(uint32 diff)\n+        {\n+            Unit* mytar = opponent ? opponent : disttarget ? disttarget : nullptr;\n+            if (!mytar)\n+                return;\n+\n+            StartAttack(mytar, IsMelee());\n+\n+            CheckAttackState();\n+            if (!me->IsAlive() || !mytar->IsAlive())\n+                return;\n+\n+            MoveBehind(mytar);\n+\n+            if (!HasRole(BOT_ROLE_DPS))\n+                return;\n+\n+            if (GC_Timer > diff)\n+                return;\n+\n+            if (!CanAffectVictimAny(mytar, SPELL_SCHOOL_SHADOW, SPELL_SCHOOL_ARCANE))\n+                return;\n+\n+            //Cripple\n+            if (IsSpellReady(CRIPPLE_1, diff) && me->GetDistance(mytar) < 30 &&\n+                me->GetLevel() >= 50 && me->GetPower(POWER_MANA) >= CRIPPLE_COST &&\n+                mytar->GetMaxNegativeAuraModifier(SPELL_AURA_MOD_MELEE_HASTE) >= 0 &&\n+                (mytar->IsPlayer() || mytar->GetHealth() > me->GetMaxHealth() * 3))\n+            {\n+                if (doCast(mytar, GetSpell(CRIPPLE_1)))\n+                    return;\n+            }\n+\n+            if (IsSpellReady(MAIN_ATTACK_1, diff) && me->GetDistance(mytar) < 30)\n+            {\n+                if (doCast(mytar, GetSpell(MAIN_ATTACK_1)))\n+                    return;\n+            }\n+        }\n+\n+        //void ApplyClassDamageMultiplierSpell(int32& damage, SpellNonMeleeDamage& /*damageinfo*/, SpellInfo const* spellInfo, WeaponAttackType /*attackType*/, bool iscrit) const override\n+        //{\n+        //    uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+        //    //uint8 lvl = me->GetLevel();\n+        //    float fdamage = float(damage);\n+\n+        //    //apply bonus damage mods\n+        //    float pctbonus = 1.0f;\n+        //    if (iscrit)\n+        //        pctbonus *= 1.333f;\n+\n+        //    if (baseId == MAIN_ATTACK_1)\n+        //        fdamage += me->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_MAGIC) * (spellInfo->_effects[0].BonusMultiplier - 1.f) * me->CalculateDefaultCoefficient(spellInfo, SPELL_DIRECT_DAMAGE) * me->CalculateSpellpowerCoefficientLevelPenalty(spellInfo);\n+\n+        //    damage = int32(fdamage * pctbonus);\n+        //}\n+\n+        void ApplyClassSpellRadiusMods(SpellInfo const* spellInfo, float& radius) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+            float pctbonus = 1.0f;\n+\n+            //flat mods\n+            //Corpse Explosion radii per level\n+            if (lvl > 40 && (baseId == CORPSE_EXPLOSION_1 || baseId == CORPSE_EXPLOSION_DAMAGE))\n+                radius += 0.25f * (lvl - 40);\n+\n+            radius = radius * pctbonus;\n+        }\n+\n+        void ApplyClassEffectMods(SpellInfo const* spellInfo, uint8 effIndex, float& value) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //uint8 lvl = me->GetLevel();\n+            float pctbonus = 1.0f;\n+\n+            //Set damage for Unholy Frenzy: 45 sec, 15 ticks, total damage is 125% if Necromancer's max health\n+            if (baseId == UNHOLY_FRENZY_1 && effIndex == EFFECT_1)\n+                value += (me->GetMaxHealth() * 1.25f) / std::max<uint32>(1, spellInfo->GetMaxTicks());\n+\n+            value = value * pctbonus;\n+        }\n+\n+        void ApplyClassThreatMods(SpellInfo const* spellInfo, float& threat) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            float pctbonus = 1.0f;\n+\n+            if (baseId == CORPSE_EXPLOSION_DAMAGE)\n+                threat = 0.f;\n+\n+            threat = threat * pctbonus;\n+        }\n+\n+        void OnClassSpellGo(SpellInfo const* spellInfo) override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+\n+            if (baseId == MAIN_ATTACK_1 || baseId == RAISE_DEAD_1 || baseId == UNHOLY_FRENZY_1 ||\n+                baseId == CRIPPLE_1 || baseId == CORPSE_EXPLOSION_1/* || baseId == ATTRACT_1*/)\n+                GC_Timer = uint32(me->GetAttackTime(BASE_ATTACK) * me->m_modAttackSpeedPct[BASE_ATTACK]);\n+\n+            if (baseId == MAIN_ATTACK_1 || baseId == RAISE_DEAD_1 || baseId == UNHOLY_FRENZY_1 ||\n+                baseId == CRIPPLE_1/* || baseId == CORPSE_EXPLOSION_1*//* || baseId == ATTRACT_1*/)\n+                me->CastSpell(me, MH_ATTACK_ANIM, true);\n+        }\n+\n+        void SpellHitTarget(Unit* wtarget, SpellInfo const* spell) override\n+        {\n+            Unit* target = wtarget->ToUnit();\n+            if (!target)\n+                return;\n+\n+            uint32 baseId = spell->GetFirstRankSpell()->Id;\n+\n+            if (baseId != MAIN_ATTACK_1)\n+            {\n+                if (baseId == CORPSE_EXPLOSION_1)\n+                {\n+                    ASSERT(!IsInBotParty(target));\n+                    target->CastSpell(target, CORPSE_EXPLOSION_VISUAL, true);\n+                    target->CastSpell(target, SPELL_BLOODY_EXPLOSION, true);\n+                    target->SetDisplayId(MODEL_BLOODY_BONES);\n+\n+                    //Corpse Explosion damage: progress with level 35 to 75% (base level 40)\n+                    int32 fdamage = CalculatePct(target->GetMaxHealth(),\n+                        CE_DAMAGE_PCT_BASE + CE_DAMAGE_PCT_PER_LEVEL * (uint32(me->GetLevel()) - spell->BaseLevel));\n+\n+                    //CastSpellExtraArgs args(TRIGGERED_FULL_MASK);\n+                    //args.AddSpellBP0(fdamage);\n+                    //me->CastSpell(target, CORPSE_EXPLOSION_DAMAGE, args);\n+                    me->CastCustomSpell(target, CORPSE_EXPLOSION_DAMAGE, &fdamage, nullptr, nullptr, true);\n+                }\n+\n+                if (baseId == RAISE_DEAD_1)\n+                {\n+                    ASSERT(!IsInBotParty(target));\n+                    //Two skeletons\n+                    for ([[maybe_unused]] auto i : NPCBots::index_array<uint8, 2>)\n+                        SummonBotPet(target);\n+                    //visuals\n+                    if (!target->IsPet() && !target->IsVehicle() && !target->ToCreature()->isWorldBoss() && !target->ToCreature()->IsDungeonBoss())\n+                    {\n+                        target->CastSpell(target, SPELL_BLOODY_EXPLOSION, true);\n+                        target->SetDisplayId(MODEL_BLOODY_BONES);\n+                    }\n+                }\n+\n+                if (baseId == UNHOLY_FRENZY_1)\n+                {\n+                    if (target->GetEntry() == BOT_PET_NECROSKELETON && _minions.contains(target->ToCreature()))\n+                    {\n+                        //get 80% mana back if casting on a skeleton\n+                        me->EnergizeBySpell(me, UNHOLY_FRENZY_1, UNHOLY_FRENZY_REFUND, POWER_MANA);\n+                    }\n+                }\n+\n+                if (baseId == CRIPPLE_1)\n+                {\n+                    if (target->IsPlayer() || target->GetLevel() > 80)\n+                    {\n+                        if (Aura* crip = target->GetAura(spell->Id, me->GetGUID()))\n+                        {\n+                            int32 dur = std::min<int32>(crip->GetMaxDuration(), 10000);\n+                            crip->SetDuration(dur);\n+                            crip->SetMaxDuration(dur);\n+                        }\n+                    }\n+                }\n+            }\n+\n+            OnSpellHitTarget(target, spell);\n+        }\n+\n+        void SpellHit(Unit* wcaster, SpellInfo const* spell) override\n+        {\n+            Unit* caster = wcaster->ToUnit();\n+            if (!caster)\n+                return;\n+\n+            OnSpellHit(caster, spell);\n+        }\n+\n+        void DamageDealt(Unit* victim, uint32& damage, DamageEffectType damageType, SpellSchoolMask damageSchoolMask) override\n+        {\n+            bot_ai::DamageDealt(victim, damage, damageType, damageSchoolMask);\n+        }\n+\n+        void DamageTaken(Unit* u, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellSchoolMask /*schoolMask*/) override\n+        {\n+            if (!u)\n+                return;\n+            if (!u->IsInCombat() && !me->IsInCombat())\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void OwnerAttackedBy(Unit* u) override\n+        {\n+            if (!u)\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        uint8 GetPetPositionNumber(Creature const* summon) const override\n+        {\n+            uint8 i = 0;\n+            for (Unit const* s : _minions)\n+            {\n+                if (s->GetGUID() == summon->GetGUID())\n+                    return i;\n+                ++i;\n+            }\n+            return 0;\n+        }\n+\n+        void SummonBotPet(Unit* from)\n+        {\n+            if (_minions.size() >= MAX_MINIONS)\n+            {\n+                Unit* u = nullptr;\n+                //try 1: by minimal level\n+                uint8 minlevel = me->GetLevel();\n+                for (Unit* s : _minions)\n+                {\n+                    if (s->GetLevel() < minlevel)\n+                    {\n+                        minlevel = s->GetLevel();\n+                        u = s;\n+                    }\n+                }\n+                //try 2: by minimal duration (if expiring already)\n+                if (!u)\n+                {\n+                    uint32 minduration = static_cast<uint32>((*_minions.begin())->GetAI()->GetData(BOTPETAI_MISC_DURATION_MAX) * 3 / 4);\n+                    for (Unit* s : _minions)\n+                    {\n+                        if (s->GetAI()->GetData(BOTPETAI_MISC_DURATION) > minduration)\n+                        {\n+                            minduration = s->GetAI()->GetData(BOTPETAI_MISC_DURATION);\n+                            u = s;\n+                        }\n+                    }\n+                }\n+\n+                if (!u)\n+                    return;\n+\n+                u->ToTempSummon()->UnSummon();\n+            }\n+\n+            Position pos = from->GetPosition();\n+\n+            Creature* myPet = me->SummonCreature(BOT_PET_NECROSKELETON, pos, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 1000);\n+            myPet->SetCreator(master);\n+            myPet->SetOwnerGUID(me->GetGUID());\n+            myPet->SetFaction(master->GetFaction());\n+            myPet->SetControlledByPlayer(!IAmFree());\n+            myPet->SetPvP(me->IsPvP());\n+            myPet->SetByteValue(UNIT_FIELD_BYTES_2, 1, master->GetByteValue(UNIT_FIELD_BYTES_2, 1));\n+            myPet->SetUInt32Value(UNIT_CREATED_BY_SPELL, RAISE_DEAD_1);\n+\n+            //dark minion immunities\n+            myPet->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_SHAPESHIFT, true);\n+            myPet->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_TRANSFORM, true);\n+            myPet->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_FEAR, true);\n+            myPet->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_POLYMORPH, true);\n+            myPet->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_FEAR, true);\n+            myPet->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_HORROR, true);\n+            myPet->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SLEEP, true);\n+            //heal\n+            myPet->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_HEAL, true);\n+            myPet->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_HEAL_PCT, true);\n+            myPet->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_PERIODIC_HEAL, true);\n+\n+            myPet->CastSpell(myPet, SPELL_SPAWN_ANIM, true);\n+            if (Aura* stun = myPet->AddAura(SUMMONING_DISORIENTATION, myPet))\n+            {\n+                stun->SetDuration(1500);\n+                stun->SetMaxDuration(1500);\n+            }\n+\n+            myPet->GetAI()->SetData(BOTPETAI_MISC_MAXLEVEL, me->GetLevel());\n+            _minions.insert(myPet);\n+        }\n+\n+        void UnsummonAll(bool savePets = true) override\n+        {\n+            UnsummonCreatures(_minions, savePets);\n+        }\n+\n+        void SummonedCreatureDies(Creature* /*summon*/, Unit* /*killer*/) override\n+        {\n+        }\n+\n+        void SummonedCreatureDespawn(Creature* summon) override\n+        {\n+            if (_minions.contains(summon))\n+                _minions.erase(summon);\n+        }\n+\n+        uint32 GetAIMiscValue(uint32 data) const override\n+        {\n+            switch (data)\n+            {\n+                case BOTAI_MISC_PET_TYPE:\n+                    return BOT_PET_NECROSKELETON;\n+                default:\n+                    return 0;\n+            }\n+        }\n+\n+        void CheckAttackState() override\n+        {\n+        }\n+\n+        void OnBotEnterVehicle(Vehicle const* vehicle) override\n+        {\n+            me->Dismount();\n+            bot_ai::OnBotEnterVehicle(vehicle);\n+        }\n+\n+        void Reset() override\n+        {\n+            _corpseExplosionCheckTimer = 0;\n+            _raiseDeadCheckTimer = 0;\n+\n+            UnsummonAll(false);\n+\n+            DefaultInit();\n+        }\n+\n+        void ReduceCD(uint32 diff) override\n+        {\n+            if (_corpseExplosionCheckTimer > diff)          _corpseExplosionCheckTimer -= diff;\n+            if (_raiseDeadCheckTimer > diff)                _raiseDeadCheckTimer -= diff;\n+        }\n+\n+        void InitPowers() override\n+        {\n+            me->SetPowerType(POWER_MANA);\n+        }\n+\n+        void InitSpells() override\n+        {\n+            InitSpellMap(MAIN_ATTACK_1, true, false);\n+            InitSpellMap(RAISE_DEAD_1, true, false);\n+            InitSpellMap(UNHOLY_FRENZY_1, true, false);\n+            InitSpellMap(CRIPPLE_1, true, false);\n+            InitSpellMap(CORPSE_EXPLOSION_1, true, false);\n+            //InitSpellMap(ATTRACT_1, true, false);\n+        }\n+\n+        void ApplyClassPassives() const override\n+        {\n+        }\n+\n+        bool CanUseManually(uint32 basespell) const override\n+        {\n+            switch (basespell)\n+            {\n+                case UNHOLY_FRENZY_1:\n+                    return me->GetLevel() >= 30;\n+                default:\n+                    return false;\n+            }\n+        }\n+\n+        std::vector<uint32> const* GetDamagingSpellsList() const override\n+        {\n+            return &Necromancer_spells_damage;\n+        }\n+        //std::vector<uint32> const* GetCCSpellsList() const override\n+        //{\n+        //    return &Necromancer_spells_cc;\n+        //}\n+        //std::vector<uint32> const* GetHealingSpellsList() const override\n+        //{\n+        //    return &Necromancer_spells_heal;\n+        //}\n+        std::vector<uint32> const* GetSupportSpellsList() const override\n+        {\n+            return &Necromancer_spells_support;\n+        }\n+\n+    private:\n+        bool _isUsableCorpse(Creature const* c) const\n+        {\n+            return c->getDeathState() == DeathState::Corpse && c->GetDisplayId() == c->GetNativeDisplayId() &&\n+                !c->IsVehicle() && !c->isWorldBoss() && !c->IsDungeonBoss() &&\n+                ((1u << (c->GetCreatureType()-1)) & USABLE_CORPSE_CREATURE_TYPE_MASK) &&\n+                !c->IsControlledByPlayer() && !c->IsNPCBot() && c->GetMaxHealth() >= me->GetMaxHealth() / 4;\n+        }\n+\n+        uint32 _corpseExplosionCheckTimer;\n+        uint32 _raiseDeadCheckTimer;\n+\n+        using Summons = std::set<Creature*>;\n+        Summons _minions;\n+    };\n+};\n+\n+void AddSC_necromancer_bot()\n+{\n+    new necromancer_bot();\n+}\ndiff --git a/src/server/game/AI/NpcBots/bot_paladin_ai.cpp b/src/server/game/AI/NpcBots/bot_paladin_ai.cpp\nnew file mode 100644\nindex 0000000000..60acbb94a3\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bot_paladin_ai.cpp\n@@ -0,0 +1,2634 @@\n+#include \"bot_ai.h\"\n+#include \"botlogtraits.h\"\n+#include \"botmgr.h\"\n+#include \"bottext.h\"\n+#include \"bottraits.h\"\n+#include \"Creature.h\"\n+#include \"Group.h\"\n+#include \"Item.h\"\n+#include \"Map.h\"\n+#include \"Player.h\"\n+#include \"RaceMgr.h\"\n+#include \"ScriptMgr.h\"\n+#include \"SpellAuraEffects.h\"\n+#include \"SpellMgr.h\"\n+//#include \"WorldSession.h\"\n+/*\n+Paladin NpcBot (reworked by Trickerer onlysuffering@gmail.com)\n+Complete - Around 95%\n+TODO:\n+*/\n+\n+enum PaladinBaseSpells// all orignals\n+{\n+    FLASH_OF_LIGHT_1                    = 19750,\n+    HOLY_LIGHT_1                        = 635,\n+    LAY_ON_HANDS_1                      = 633,\n+    REDEMPTION_1                        = 7328,\n+    HAND_OF_FREEDOM_1                   = 1044,\n+    SACRED_SHIELD_1                     = 53601,\n+    HOLY_SHOCK_1                        = 20473,\n+    CLEANSE_1                           = 4987,\n+    HAND_OF_PROTECTION_1                = 1022,\n+    HAND_OF_SALVATION_1                 = 1038,\n+    HAND_OF_SACRIFICE_1                 = 6940,\n+    SEAL_OF_VENGEANCE_1                 = 31801,\n+    SEAL_OF_CORRUPTION_1                = 53736,\n+    SEAL_OF_COMMAND_1                   = 20375,\n+    SEAL_OF_LIGHT_1                     = 20165,\n+    SEAL_OF_RIGHTEOUSNESS_1             = 21084,\n+    SEAL_OF_WISDOM_1                    = 20166,\n+    SEAL_OF_JUSTICE_1                   = 20164,\n+    DIVINE_SACRIFICE_1                  = 64205,\n+    HAND_OF_RECKONING_1                 = 62124,\n+    RIGHTEOUS_DEFENSE_1                 = 31789,\n+    DIVINE_PLEA_1                       = 54428,\n+    REPENTANCE_1                        = 20066,\n+    TURN_EVIL_1                         = 10326,\n+    CRUSADER_STRIKE_1                   = 35395,\n+    JUDGEMENT_OF_LIGHT_1                = 20271,\n+    JUDGEMENT_OF_WISDOM_1               = 53408,\n+    JUDGEMENT_OF_JUSTICE_1              = 53407,\n+    CONSECRATION_1                      = 26573,\n+    HAMMER_OF_JUSTICE_1                 = 853,\n+    DIVINE_STORM_1                      = 53385,\n+    HAMMER_OF_WRATH_1                   = 24275,\n+    EXORCISM_1                          = 879,\n+    HOLY_WRATH_1                        = 2812,\n+    AVENGING_WRATH_1                    = 31884,\n+    RIGHTEOUS_FURY_1                    = 25780,\n+    HOLY_SHIELD_1                       = 20925,\n+    AVENGERS_SHIELD_1                   = 31935,\n+    HAMMER_OF_THE_RIGHTEOUS_1           = 53595,\n+    SHIELD_OF_RIGHTEOUSNESS_1           = 53600,\n+    BLESSING_OF_MIGHT_1                 = 19740,\n+    BLESSING_OF_WISDOM_1                = 19742,\n+    BLESSING_OF_KINGS_1                 = 20217,\n+    BLESSING_OF_SANCTUARY_1             = 20911,\n+    DEVOTION_AURA_1                     = 465,\n+    CONCENTRATION_AURA_1                = 19746,\n+    FIRE_RESISTANCE_AURA_1              = 19891,\n+    FROST_RESISTANCE_AURA_1             = 19888,\n+    SHADOW_RESISTANCE_AURA_1            = 19876,\n+    RETRIBUTION_AURA_1                  = 7294,\n+    CRUSADER_AURA_1                     = 32223,\n+\n+    DIVINE_INTERVENTION_1               = 19752,\n+    AURA_MASTERY_1                      = 31821,\n+    DIVINE_FAVOR_1                      = 20216,\n+    DIVINE_ILLUMINATION_1               = 31842,\n+    BEACON_OF_LIGHT_1                   = 53563,\n+\n+    DIVINE_PROTECTION_1                 = 498,\n+    DIVINE_SHIELD_1                     = 642,\n+\n+    PURIFY_1                            = 1152\n+};\n+enum PaladinPassives\n+{\n+//Talents\n+    DIVINE_PURPOSE                      = 31872,\n+    JUDGEMENTS_OF_THE_PURE              = 54155,\n+    JUDGEMENTS_OF_THE_WISE              = 31878,\n+    SACRED_CLEANSING                    = 53553,//rank 3\n+    RECKONING1                          = 20177,\n+    RECKONING2                          = 20179,\n+    RECKONING3                          = 20181,\n+    RECKONING4                          = 20180,\n+    RECKONING5                          = 20182,\n+    VINDICATION1                        = 9452,\n+    VINDICATION2                        = 26016,\n+    PURSUIT_OF_JUSTICE                  = 26023,//rank 2\n+    ART_OF_WAR                          = 53488,//rank 2\n+    IMPROVED_LAY_ON_HANDS               = 20235,//rank 2\n+    FANATICISM                          = 31881,//rank 3\n+    RIGHTEOUS_VENGEANCE1                = 53380,//rank 1\n+    RIGHTEOUS_VENGEANCE2                = 53381,//rank 2\n+    RIGHTEOUS_VENGEANCE3                = 53382,//rank 3\n+    VENGEANCE1                          = 20049,//rank 1\n+    VENGEANCE2                          = 20056,//rank 2\n+    VENGEANCE3                          = 20057,//rank 3\n+    SHEATH_OF_LIGHT1                    = 53501,//rank 1\n+    SHEATH_OF_LIGHT2                    = 53502,//rank 2\n+    SHEATH_OF_LIGHT3                    = 53503,//rank 3\n+    ARDENT_DEFENDER                     = 31852,//rank 3\n+    ILLUMINATION                        = 20215,//rank 5\n+    INFUSION_OF_LIGHT                   = 53576,//rank 2\n+    REDOUBT1                            = 20127,//rank 3\n+    REDOUBT2                            = 20130,//rank 3\n+    REDOUBT3                            = 20135,//rank 3\n+    IMPROVED_RIGHTEOUS_FURY             = 20470,//rank 3\n+    SHIELD_OF_THE_TEMPLAR               = 53711,//rank 3\n+    IMPROVED_DEVOTION_AURA              = 20140,//rank 3\n+    IMPROVED_CONCENTRATION_AURA         = 20256,//rank 3\n+    SANCTIFIED_RETRIBUTION              = 31869,\n+    SWIFT_RETRIBUTION                   = 53648,//rank 3\n+    LIGHTS_GRACE                        = 31836,//rank 3\n+    DIVINE_GUARDIAN                     = 53530,//rank 3\n+    //COMBAT_EXPERTISE                    = 31860,//rank 3\n+    CRUSADE                             = 31868,//rank 3\n+    ONE_HANDED_WEAPON_SPECIALIZATION    = 20198,//rank 3\n+    TWO_HANDED_WEAPON_SPECIALIZATION    = 20113,//rank 3\n+    //JUDGEMENTS_OF_THE_JUST              = 53696,//rank 2\n+    GUARDED_BY_THE_LIGHT                = 53585,//rank 2\n+    TOUCHED_BY_THE_LIGHT                = 53592,//rank 3\n+    HEART_OF_THE_CRUSADER               = 20337,//rank 3\n+//Glyphs\n+    GLYPH_HOLY_LIGHT                    = 54937,\n+    GLYPH_SALVATION                     = 63225,\n+//Innate\n+    JUDGEMENT_ANTI_PARRY_DODGE_PASSIVE  = 60091,\n+//other\n+    RECUCED_HOLY_LIGHT_CAST_TIME        = 37189,//not a typo\n+    //CLEANSE_HEAL_PASSIVE                = 28787\n+};\n+\n+enum PaladinSpecial\n+{\n+    SPECIFIC_BLESSING_WISDOM            = 0x01,\n+    SPECIFIC_BLESSING_KINGS             = 0x02,\n+    SPECIFIC_BLESSING_SANCTUARY         = 0x04,\n+    SPECIFIC_BLESSING_MIGHT             = 0x08,\n+    SPECIFIC_BLESSING_MY_BLESSING       = 0x10,\n+\n+    SPECIFIC_AURA_DEVOTION              = 0x01,\n+    SPECIFIC_AURA_CONCENTRATION         = 0x02,\n+    SPECIFIC_AURA_FIRE_RES              = 0x04,\n+    SPECIFIC_AURA_FROST_RES             = 0x08,\n+    SPECIFIC_AURA_SHADOW_RES            = 0x10,\n+    SPECIFIC_AURA_RETRIBUTION           = 0x20,\n+    SPECIFIC_AURA_CRUSADER              = 0x40,\n+    SPECIFIC_AURA_MY_AURA               = 0x80,\n+    SPECIFIC_AURA_ALL_AUTOUSE           = (SPECIFIC_AURA_DEVOTION | SPECIFIC_AURA_CONCENTRATION | SPECIFIC_AURA_RETRIBUTION | \\\n+                                            SPECIFIC_AURA_FIRE_RES | SPECIFIC_AURA_FROST_RES | SPECIFIC_AURA_SHADOW_RES),\n+\n+    FLASH_OF_LIGHT_HEAL_PERIODIC        = 66922,\n+\n+    ENLIGHTENMENT_BUFF                  = 43837,\n+    INFUSION_OF_LIGHT_BUFF              = 54149,//rank 2\n+    THE_ART_OF_WAR_BUFF                 = 59578,//rank 2\n+    //FORBEARANCE_AURA                    = 25771,\n+\n+    LIGHTS_GRACE_BUFF                   = 31834,\n+\n+    SEAL_OF_JUSTICE_STUN_AURA           = 20170,\n+    JUDGEMENTS_OF_THE_JUST_AURA         = 68055, //melee attack speed reduce\n+\n+    //JUDGEMENT_OF_LIGHT_AURA             = 20185,\n+    JUDGEMENT_OF_WISDOM_AURA            = 20186,\n+    //JUDGEMENT_OF_JUSTICE_AURA           = 20184,\n+\n+    GREATER_BLESSING_OF_MIGHT_1         = 25782,\n+    GREATER_BLESSING_OF_WISDOM_1        = 25894,\n+    GREATER_BLESSING_OF_KINGS_1         = 25898,\n+    GREATER_BLESSING_OF_SANCTUARY_1     = 25899,\n+    BATTLESHOUT_1                       = 6673,\n+\n+    HOLY_SHOCK_HEAL_1                   = 25914,\n+    ARDENT_DEFENDER_HEAL                = 66235,\n+    JUDGEMENT_OF_COMMAND_DAMAGE         = 20467,\n+    SPIRITUAL_ATTUNEMENT_ENERGIZE       = 31786,\n+    SACRED_SHIELD_AURA_TRIGGERED        = 58597,\n+\n+    AVENGING_WRATH_MARKER_SPELL         = 61987,\n+    IMMUNITY_SHIELD_MARKER_SPELL        = 61988,\n+\n+    IMPROVED_DEVOTION_AURA_SPELL        = 63514\n+};\n+\n+static const std::vector<uint32> Paladin_spells_damage\n+{ AVENGERS_SHIELD_1, CONSECRATION_1, CRUSADER_STRIKE_1, DIVINE_STORM_1, EXORCISM_1, JUDGEMENT_OF_LIGHT_1,\n+JUDGEMENT_OF_WISDOM_1, JUDGEMENT_OF_JUSTICE_1, HAMMER_OF_THE_RIGHTEOUS_1, HAMMER_OF_WRATH_1, HOLY_SHIELD_1,\n+HOLY_SHOCK_1, HOLY_WRATH_1, SHIELD_OF_RIGHTEOUSNESS_1, HAND_OF_RECKONING_1 };\n+static const std::vector<uint32> Paladin_spells_cc{ HAMMER_OF_JUSTICE_1, HOLY_WRATH_1, REPENTANCE_1, TURN_EVIL_1 };\n+static const std::vector<uint32> Paladin_spells_heal{ BEACON_OF_LIGHT_1, FLASH_OF_LIGHT_1, HOLY_LIGHT_1, HOLY_SHOCK_1, LAY_ON_HANDS_1 };\n+static const std::vector<uint32> Paladin_spells_support\n+{ /*DEVOTION_AURA_1, CONCENTRATION_AURA_1, FIRE_RESISTANCE_AURA_1, FROST_RESISTANCE_AURA_1, SHADOW_RESISTANCE_AURA_1,\n+RETRIBUTION_AURA_1, CRUSADER_AURA_1, */AURA_MASTERY_1, AVENGING_WRATH_1, BLESSING_OF_MIGHT_1, BLESSING_OF_WISDOM_1,\n+BLESSING_OF_KINGS_1, BLESSING_OF_SANCTUARY_1, CLEANSE_1, DIVINE_FAVOR_1, DIVINE_ILLUMINATION_1, DIVINE_INTERVENTION_1,\n+DIVINE_PLEA_1, DIVINE_PROTECTION_1, DIVINE_SACRIFICE_1, DIVINE_SHIELD_1, HAND_OF_FREEDOM_1, HAND_OF_PROTECTION_1,\n+HAND_OF_RECKONING_1, HAND_OF_SACRIFICE_1, HAND_OF_SALVATION_1, HOLY_SHIELD_1, PURIFY_1, REDEMPTION_1,\n+RIGHTEOUS_DEFENSE_1, RIGHTEOUS_FURY_1, SACRED_SHIELD_1, SEAL_OF_RIGHTEOUSNESS_1, SEAL_OF_JUSTICE_1, SEAL_OF_LIGHT_1,\n+SEAL_OF_WISDOM_1, SEAL_OF_COMMAND_1, SEAL_OF_VENGEANCE_1, SEAL_OF_CORRUPTION_1 };\n+\n+class paladin_bot : public CreatureScript\n+{\n+public:\n+    paladin_bot() : CreatureScript(\"paladin_bot\") { }\n+\n+    CreatureAI* GetAI(Creature* creature) const override\n+    {\n+        return new paladin_botAI(creature);\n+    }\n+\n+    bool OnGossipHello(Player* player, Creature* creature) override\n+    {\n+        return creature->GetBotAI()->OnGossipHello(player, 0);\n+    }\n+\n+    bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action) override\n+    {\n+        if (bot_ai* ai = creature->GetBotAI())\n+            return ai->OnGossipSelect(player, creature, sender, action);\n+        return true;\n+    }\n+\n+    bool OnGossipSelectCode(Player* player, Creature* creature, uint32 sender, uint32 action, char const* code) override\n+    {\n+        if (bot_ai* ai = creature->GetBotAI())\n+            return ai->OnGossipSelectCode(player, creature, sender, action, code);\n+        return true;\n+    }\n+\n+    struct paladin_botAI : public bot_ai\n+    {\n+        paladin_botAI(Creature* creature) : bot_ai(creature)\n+        {\n+            _botclass = BOT_CLASS_PALADIN;\n+\n+            _myaura = 0;\n+\n+            InitUnitFlags();\n+        }\n+\n+        bool doCast(Unit* victim, uint32 spellId)\n+        {\n+            if (CheckBotCast(victim, spellId) != SPELL_CAST_OK)\n+                return false;\n+            return bot_ai::doCast(victim, spellId);\n+        }\n+\n+        void CheckBeacon(uint32 diff)\n+        {\n+            if (checkBeaconTimer > diff || !IsSpellReady(BEACON_OF_LIGHT_1, diff) ||\n+                !HasRole(BOT_ROLE_HEAL|BOT_ROLE_RANGED) || IsCasting() || Rand() > 15)\n+                return;\n+\n+            checkBeaconTimer = urand(2000, 5000);\n+\n+            if (FindAffectedTarget(GetSpell(BEACON_OF_LIGHT_1), me->GetGUID(), 60, 3))\n+                return;\n+\n+            //find tank\n+            //stacks\n+            if (Group const* gr = !IAmFree() ? master->GetGroup() : GetGroup())\n+            {\n+                std::set<Unit*> tanks;\n+                for (Unit* member : BotMgr::GetAllGroupMembers(gr))\n+                {\n+                    if (me->GetMap() == member->FindMap() && member->IsAlive() && member->IsInCombat() && IsTank(member) &&\n+                        (!member->getAttackers().empty() || GetHealthPCT(member) < 90) &&\n+                        !member->GetAuraEffect(SPELL_AURA_PERIODIC_TRIGGER_SPELL, SPELLFAMILY_PALADIN, 0x0, 0x1000000, 0x0, me->GetGUID()))\n+                        tanks.insert(member);\n+                }\n+\n+                if (tanks.empty())\n+                    return;\n+\n+                Unit* target = tanks.size() == 1 ? *tanks.begin() : Bcore::Containers::SelectRandomContainerElement(tanks);\n+                if (doCast(target, GetSpell(BEACON_OF_LIGHT_1)))\n+                    return;\n+            }\n+        }\n+\n+        void CheckSacrifice(uint32 diff)\n+        {\n+            if (!IsSpellReady(DIVINE_SACRIFICE_1, diff) || IAmFree() || me->IsMounted() ||\n+                IsTank() || Feasting() || !CanBlock() || IsCasting() || Rand() > 25 || GetHealthPCT(me) < 60)\n+                return;\n+\n+            Group const* gr = master->GetGroup();\n+            if (!gr)\n+            {\n+                if (master->IsAlive() && GetHealthPCT(master) < 75 && me->GetDistance(master) < 30 && !master->getAttackers().empty() &&\n+                    !master->GetAuraEffect(SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, SPELLFAMILY_PALADIN, 3837, EFFECT_0))\n+                {\n+                    if (doCast(me, GetSpell(DIVINE_SACRIFICE_1)))\n+                        return;\n+                }\n+            }\n+            else\n+            {\n+                uint8 attacked = 0;\n+                for (Unit const* member : BotMgr::GetAllGroupMembers(gr))\n+                {\n+                    if (me->GetMap() == member->FindMap() && member->IsAlive() &&\n+                        !(member->IsNPCBot() && member->ToCreature()->IsTempBot()) &&\n+                        me->GetDistance(member) < 30 && !member->getAttackers().empty() &&\n+                        !member->GetAuraEffect(SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, SPELLFAMILY_PALADIN, 3837, EFFECT_0))\n+                    {\n+                        if (++attacked > 3)\n+                            break;\n+                    }\n+                }\n+                if (attacked > 3 && doCast(me, GetSpell(DIVINE_SACRIFICE_1)))\n+                    return;\n+            }\n+\n+            SetSpellCooldown(DIVINE_SACRIFICE_1, 1000); //fail\n+        }\n+\n+        void CheckHandOfSacrifice(uint32 diff)\n+        {\n+            if (!IsSpellReady(HAND_OF_SACRIFICE_1, diff) || IAmFree() || me->IsMounted() ||\n+                IsTank() || Feasting() || !CanBlock() || IsCasting() || Rand() > 25 || GetHealthPCT(me) < 50)\n+                return;\n+\n+            Group const* gr = master->GetGroup();\n+            if (!gr)\n+            {\n+                if (master->IsAlive() && me->GetDistance(master) < 30 && !master->getAttackers().empty() &&\n+                    (master->getAttackers().size() > 2 || GetHealthPCT(master) < 50) &&\n+                    !master->GetAuraEffect(SPELL_AURA_SPLIT_DAMAGE_PCT, SPELLFAMILY_PALADIN, 0x2000, 0x0, 0x0))\n+                {\n+                    if (doCast(master, GetSpell(HAND_OF_SACRIFICE_1)))\n+                        return;\n+                }\n+            }\n+            else\n+            {\n+                Unit* u = nullptr;\n+                for (Unit* member : BotMgr::GetAllGroupMembers(gr))\n+                {\n+                    if (me->GetMap() == member->FindMap() && member->IsAlive() && me->GetDistance(member) < 30 &&\n+                        !(member->IsNPCBot() && member->ToCreature()->IsTempBot()) &&\n+                        (member->getAttackers().size() > 2 || GetHealthPCT(member) < 50) &&\n+                        !member->GetAuraEffect(SPELL_AURA_SPLIT_DAMAGE_PCT, SPELLFAMILY_PALADIN, 0x2000, 0x0, 0x0))\n+                    {\n+                        u = member;\n+                        break;\n+                    }\n+                }\n+\n+                if (u && doCast(u, GetSpell(HAND_OF_SACRIFICE_1)))\n+                    return;\n+            }\n+\n+            SetSpellCooldown(HAND_OF_SACRIFICE_1, 2000); //fail\n+        }\n+\n+        void ShieldGroup(uint32 diff)\n+        {\n+            if (checkShieldTimer > diff || !IsSpellReady(SACRED_SHIELD_1, diff) || me->IsMounted() || Feasting() || IsCasting() || Rand() > 50)\n+                return;\n+\n+            checkShieldTimer = 3000;\n+\n+            if (IsTank())\n+            {\n+                if (Rand() > 25)\n+                    return;\n+            }\n+            else if (!HasRole(BOT_ROLE_HEAL) && Rand() > 35)\n+                return;\n+\n+            if (IAmFree() && (me->IsInCombat() || !me->getAttackers().empty()) && me->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_PALADIN, 0x0, 0x80000, 0x0, me->GetGUID()))\n+                return;\n+\n+            if (Unit const* shielded = FindAffectedTarget(GetSpell(SACRED_SHIELD_1), me->GetGUID(), 80, 3))\n+                if (shielded->IsInCombat() && !shielded->getAttackers().empty())\n+                    return;\n+\n+            Group const* gr = !IAmFree() ? master->GetGroup() : GetGroup();\n+            Unit* target = nullptr;\n+            if (!gr)\n+            {\n+                Unit* u = master;\n+                if (u->IsAlive() && u->IsInCombat() && (IAmFree() || IsTank(u)) && me->GetDistance(u) < 40 &&\n+                    !u->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_PALADIN, 0x0, 0x80000, 0x0))\n+                    target = u;\n+\n+                if (!target && IsWanderer())\n+                {\n+                    std::list<Unit*> targets;\n+                    GetNearbyFriendlyTargetsList(targets, 40.0f);\n+                    std::erase_if(targets, [](Unit const* unit) {\n+                        return (!unit->IsInCombat() && unit->getAttackers().empty()) || unit->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_PALADIN, 0x0, 0x80000, 0x0);\n+                    });\n+                    if (!targets.empty())\n+                        target = targets.size() == 1 ? targets.front() : Bcore::Containers::SelectRandomContainerElement(targets);\n+                }\n+\n+                if (!target && !IAmFree())\n+                {\n+                    if (IsTank() && me->IsInCombat() && !me->getAttackers().empty() && !me->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_PALADIN, 0x0, 0x80000, 0x0))\n+                        target = me;\n+                    else\n+                    {\n+                        for (auto const& [_, bot] : *master->GetBotMgr()->GetBotMap())\n+                        {\n+                            u = bot;\n+                            if (!u || !u->IsInWorld() || me->GetMap() != u->FindMap() || !u->IsAlive() || !u->IsInCombat() ||\n+                                u->getAttackers().empty() || u->ToCreature()->IsTempBot() || me->GetDistance(u) > 40 ||\n+                                u->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_PALADIN, 0x0, 0x80000, 0x0))\n+                                continue;\n+\n+                            target = u;\n+                            break;\n+                        }\n+                    }\n+                }\n+            }\n+            else\n+            {\n+                std::vector<Unit*> members = BotMgr::GetAllGroupMembers(gr);\n+                std::array<decltype(members), 3> member_sets{}; //tanks, players, npcbots\n+                for (auto i : NPCBots::index_array<size_t, std::size(member_sets)>)\n+                    member_sets[i].reserve(((members.size() >> 2) + 1) * (i + 1));\n+\n+                for (Unit* member : members)\n+                {\n+                    if (!member->IsInWorld() || me->GetMap() != member->FindMap() || !member->IsAlive() || !member->IsInCombat() ||\n+                        member->getAttackers().empty() || (member->IsNPCBot() && member->ToCreature()->IsTempBot()) || me->GetDistance(member) > 40 ||\n+                        member->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_PALADIN, 0x0, 0x80000, 0x0))\n+                        continue;\n+\n+                    if (IsTank(member))\n+                        member_sets[0].push_back(member);\n+                    else if (member->IsPlayer())\n+                        member_sets[1].push_back(member);\n+                    else\n+                        member_sets[2].push_back(member);\n+                }\n+\n+                for (auto const& container : member_sets)\n+                {\n+                    if (!container.empty())\n+                    {\n+                        target = container.size() == 1 ? container.front() : Bcore::Containers::SelectRandomContainerElement(container);\n+                        break;\n+                    }\n+                }\n+\n+                if (!target)\n+                {\n+                    uint8 hp_pct_min = 101;\n+                    for (auto const& container : member_sets)\n+                    {\n+                        for (Unit* member : container)\n+                        {\n+                            if (uint8 hp_pct = GetHealthPCT(member); hp_pct < hp_pct_min)\n+                            {\n+                                hp_pct_min = hp_pct;\n+                                target = member;\n+                            }\n+                        }\n+                        if (target)\n+                            break;\n+                    }\n+                }\n+\n+                if (!target)\n+                {\n+                    uint32 attackers_count_max = 0;\n+                    for (auto const& container : member_sets)\n+                    {\n+                        for (Unit* member : container)\n+                        {\n+                            if (uint32 attackers_count = member->getAttackers().size(); attackers_count > attackers_count_max)\n+                            {\n+                                attackers_count_max = attackers_count;\n+                                target = member;\n+                            }\n+                        }\n+                        if (target)\n+                            break;\n+                    }\n+                }\n+\n+                if (!target && master->IsInCombat() && !master->getAttackers().empty() && me->GetDistance(master) < 40 &&\n+                    !master->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_PALADIN, 0x0, 0x80000, 0x0))\n+                    target = master;\n+            }\n+\n+            if (target && doCast(target, GetSpell(SACRED_SHIELD_1)))\n+                return;\n+        }\n+\n+        void HOPGroup(uint32 diff)\n+        {\n+            if (!IsSpellReady(HAND_OF_PROTECTION_1, diff) || me->IsMounted() || Feasting() || IsCasting() || Rand() > 30)\n+                return;\n+\n+            Group const* gr = !IAmFree() ? master->GetGroup() : GetGroup();\n+            if (!gr)\n+            {\n+                if (me->GetMap() == master->FindMap())\n+                {\n+                    if (HOPTarget(master))\n+                    {}\n+                    if (!IAmFree() && HOPTarget(me))\n+                    {}\n+                }\n+            }\n+            else\n+            {\n+                std::vector<Unit*> members = BotMgr::GetAllGroupMembers(gr);\n+                for (auto i : NPCBots::index_array<uint8, 2>)\n+                {\n+                    for (Unit* member : members)\n+                    {\n+                        if (!(i == 0 ? member->IsPlayer() : member->IsNPCBot()) || me->GetMap() != member->FindMap() ||\n+                            !member->IsAlive() || !member->IsInCombat() || me->GetDistance(member) > 30 || IsTank(member) ||\n+                            (member->IsNPCBot() && member->ToCreature()->IsTempBot()) ||\n+                            member->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_PALADIN, 0x0, 0x80000, 0x0))\n+                            continue;\n+                        if (HOPTarget(member))\n+                            return;\n+                    }\n+                }\n+            }\n+        }\n+\n+        bool HOPTarget(Unit* target)\n+        {\n+            if ((target->IsPlayer() ? target->GetClass() : target->ToCreature()->GetBotClass()) == BOT_CLASS_PALADIN)\n+                return false; //paladins should use their own damn bubble\n+            if (target->HasAuraTypeWithMiscvalue(SPELL_AURA_SCHOOL_IMMUNITY, 1) || target->HasAuraTypeWithMiscvalue(SPELL_AURA_SCHOOL_IMMUNITY, 127))\n+                return false; //immune to physical (hop or smth is present)\n+            if (target->HasAuraTypeWithMiscvalue(SPELL_AURA_MECHANIC_IMMUNITY, 25))\n+                return false; //forbearance\n+            if (target->getAttackers().empty())\n+                return false; //HOP only saves from physical, these aoe are rare and on bosses they are ultimate anyway\n+\n+            if (GetHealthPCT(target) < 15 + 5*(uint32)target->getAttackers().size())\n+            {\n+                me->InterruptNonMeleeSpells(false);\n+                if (doCast(target, GetSpell(HAND_OF_PROTECTION_1)))\n+                {\n+                    if (target->IsPlayer())\n+                        ReportSpellCast(HAND_OF_PROTECTION_1, LocalizedNpcText(target->ToPlayer(), BOT_TEXT__ON_YOU), target->ToPlayer());\n+\n+                    if (!IAmFree() && target->GetGUID() != master->GetGUID())\n+                        ReportSpellCast(HAND_OF_PROTECTION_1, LocalizedNpcText(master, BOT_TEXT__ON_) + target->GetName() + '!', master);\n+                }\n+                return true;\n+            }\n+\n+            return false;\n+        }\n+\n+        void HOFGroup(uint32 diff)\n+        {\n+            if (!IsSpellReady(HAND_OF_FREEDOM_1, diff) || me->IsMounted() || Feasting() || IsCasting() || Rand() > 20)\n+                return;\n+\n+            Group const* gr = !IAmFree() ? master->GetGroup() : GetGroup();\n+            if (!gr)\n+            {\n+                if (me->GetMap() == master->FindMap())\n+                {\n+                    if (HOFTarget(master))\n+                    {}\n+                    if (!IAmFree() && HOFTarget(me))\n+                    {}\n+                }\n+            }\n+            else\n+            {\n+                std::vector<Unit*> members = BotMgr::GetAllGroupMembers(gr);\n+                for (auto i : NPCBots::index_array<uint8, 2>)\n+                {\n+                    for (Unit* member : members)\n+                    {\n+                        if (!(i == 0 ? member->IsPlayer() : member->IsNPCBot()) || me->GetMap() != member->FindMap() ||\n+                            !member->IsAlive() || me->GetDistance(member) > 30 || (member->IsNPCBot() && member->ToCreature()->IsTempBot()))\n+                            continue;\n+                        if (HOFTarget(member))\n+                            return;\n+                    }\n+                }\n+            }\n+        }\n+\n+        bool HOFTarget(Unit* target)\n+        {\n+            const bool canUnstun = me->GetLevel() >= 35 && GetSpec() == BOT_SPEC_PALADIN_RETRIBUTION;\n+            if (target->HasAuraType(SPELL_AURA_MECHANIC_IMMUNITY))\n+            {\n+                if (target->HasAuraTypeWithMiscvalue(SPELL_AURA_MECHANIC_IMMUNITY, 11) &&\n+                    target->HasAuraTypeWithMiscvalue(SPELL_AURA_MECHANIC_IMMUNITY, 7))\n+                    return false; //immune to root and snares\n+                if (canUnstun && target->HasAuraTypeWithMiscvalue(SPELL_AURA_MECHANIC_IMMUNITY, 12))\n+                    return false; //immune to stuns\n+            }\n+\n+            for (auto const& [_, app] : target->GetAppliedAuras())\n+            {\n+                if (!app || app->IsPositive() || app->GetBase()->IsPassive() || app->GetBase()->GetDuration() < 2000)\n+                    continue;\n+                SpellInfo const* spellInfo = app->GetBase()->GetSpellInfo();\n+                if (spellInfo->Attributes & SPELL_ATTR0_DO_NOT_DISPLAY) continue;\n+                //if (spellInfo->AttributesEx & SPELL_ATTR1_NO_AURA_ICON) continue;\n+                if (spellInfo->GetSpellMechanicMaskByEffectMask(app->GetEffectMask()) &\n+                    ((1u<<MECHANIC_SNARE) | (1u<<MECHANIC_ROOT) | (!canUnstun ? 0 : (1u<<MECHANIC_STUN))))\n+                {\n+                    uint32 dispel = spellInfo->Dispel;\n+                    uint32 spell;\n+                    //Hand of Freedom is level 12, Purify is 8, Cleanse is 42\n+                    if (!GetSpell(CLEANSE))\n+                        spell = (dispel == DISPEL_DISEASE || dispel == DISPEL_POISON) ?\n+                        GetSpell(PURIFY_1) : GetSpell(HAND_OF_FREEDOM_1);\n+                    else\n+                        spell = (dispel == DISPEL_MAGIC || dispel == DISPEL_DISEASE || dispel == DISPEL_POISON) ?\n+                        GetSpell(CLEANSE_1) : GetSpell(HAND_OF_FREEDOM_1);\n+\n+                    if (doCast(target, spell))\n+                        return true;\n+                }\n+            }\n+            return false;\n+        }\n+\n+        void HOSGroup(uint32 diff)\n+        {\n+            if (!IsSpellReady(HAND_OF_SALVATION_1, diff) || IsCasting() || Rand() > 40)\n+                return;\n+\n+            //Glyph of Salvation\n+            if (me->GetLevel() >= 26 && me->GetVictim() && (!me->GetVictim()->CanHaveThreatList() || me->GetVictim()->IsControlledByPlayer()))\n+            {\n+                if (!me->getAttackers().empty() && GetHealthPCT(me) < std::max<int32>(80 - 5 * me->getAttackers().size(), 25))\n+                    if (doCast(me, GetSpell(HAND_OF_SALVATION_1)))\n+                        return;\n+            }\n+\n+            if (IAmFree())\n+                return;\n+\n+            Group const* gr = master->GetGroup();\n+            if (!gr)\n+                 return;\n+\n+            std::vector<Unit*> members = BotMgr::GetAllGroupMembers(gr);\n+            for (auto i : NPCBots::index_array<uint8, 2>)\n+            {\n+                for (Unit* member : members)\n+                {\n+                    if (!(i == 0 ? member->IsPlayer() : member->IsNPCBot()) || me->GetMap() != member->FindMap() ||\n+                        !member->IsInCombat() || IsTank(member) || me->GetDistance(member) > 30 ||\n+                        (IsTankingClass(i == 0 ? member->GetClass() : member->ToCreature()->GetBotClass()) && !me->GetMap()->IsRaid()) ||\n+                        (member->IsNPCBot() && member->ToCreature()->IsTempBot()) ||\n+                        member->HasAuraTypeWithFamilyFlags(SPELL_AURA_PERIODIC_TRIGGER_SPELL_WITH_VALUE, SPELLFAMILY_PALADIN, 0x100))\n+                        continue;\n+                    if (HOSTarget(member))\n+                        return;\n+                }\n+            }\n+        }\n+\n+        bool HOSTarget(Unit* target)\n+        {\n+            for (Unit* attacker : target->getAttackers())\n+            {\n+                if (attacker->CanHaveThreatList() && attacker->GetThreatMgr().GetThreatListSize() >= 3 &&\n+                    attacker->GetThreatMgr().GetThreat(target) > target->GetMaxHealth() / 4.f && target->GetDistance(attacker) < 15)\n+                {\n+                    if (doCast(target, GetSpell(HAND_OF_SALVATION_1)))\n+                        return true;\n+                    break; //do not try more than once on the same target\n+                }\n+            }\n+            return false;\n+        }\n+\n+        bool HealTarget(Unit* target, uint32 diff) override\n+        {\n+            if (!target || !target->IsAlive() || target->GetShapeshiftForm() == FORM_SPIRITOFREDEMPTION || me->GetDistance(target) > 40)\n+                return false;\n+            uint8 hp = GetHealthPCT(target);\n+            if (hp > GetHealHpPctThreshold())\n+                return false;\n+            bool pointed = IsPointedHealTarget(target);\n+            if (hp > 90 && !(pointed && me->GetMap()->IsRaid()) &&\n+                (!target->IsInCombat() || target->getAttackers().empty() || !IsTank(target) || !me->GetMap()->IsRaid()))\n+                return false;\n+            //try to preserve heal if Divine Plea is active\n+            if (hp > 50 && me->GetAuraEffect(SPELL_AURA_OBS_MOD_POWER, SPELLFAMILY_PALADIN, 0x0, 0x0, 0x1))\n+                return false;\n+\n+            int32 hps = GetHPS(target);\n+            int32 xphp = target->GetHealth() + hps * 2.5f;\n+            int32 hppctps = int32(hps * 100.f / float(target->GetMaxHealth()));\n+            int32 xphploss = xphp > int32(target->GetMaxHealth()) ? 0 : abs(int32(xphp - target->GetMaxHealth()));\n+            int32 xppct = hp + hppctps * 2.5f;\n+            if (xppct >= 95 && hp >= 25 && !pointed)\n+                return false;\n+\n+            //Lay on Hands\n+            if (IsSpellReady(LAY_ON_HANDS_1, diff, false) && (target != me || shieldDelayTimer <= diff) &&\n+                (target->IsInCombat() || !target->getAttackers().empty()) && Rand() < 80 && hp <= 20 && xppct <=0 &&\n+                !target->HasAuraTypeWithMiscvalue(SPELL_AURA_SCHOOL_IMMUNITY, 127))\n+            {\n+                me->InterruptNonMeleeSpells(false);\n+                if (doCast(target, GetSpell(LAY_ON_HANDS_1)))\n+                {\n+                    if (target->IsPlayer())\n+                        ReportSpellCast(LAY_ON_HANDS_1, LocalizedNpcText(target->ToPlayer(), BOT_TEXT__ON_YOU), target->ToPlayer());\n+\n+                    if (!IAmFree() && target != master)\n+                    {\n+                        std::string msg = target == me ? LocalizedNpcText(master, BOT_TEXT__ON_MYSELF) : (LocalizedNpcText(master, BOT_TEXT__ON_) + target->GetName() + '!');\n+                        ReportSpellCast(LAY_ON_HANDS_1, msg, master);\n+                    }\n+                    return true;\n+                }\n+            }\n+\n+            //Holy Shock\n+            if (IsSpellReady(HOLY_SHOCK_1, diff, false) && !target->IsCharmed() && !target->isPossessed() &&\n+                xphploss > _heals[HOLY_SHOCK_1])\n+            {\n+                me->InterruptNonMeleeSpells(false);\n+                if (hp < 30 && IsSpellReady(DIVINE_FAVOR_1, diff, false) && !target->getAttackers().empty())\n+                    if (doCast(me, GetSpell(DIVINE_FAVOR_1)))\n+                    {}\n+                if (doCast(target, GetSpell(HOLY_SHOCK_1)))\n+                    return true;\n+            }\n+\n+            if (IsCasting()) return false;\n+\n+            Unit const* u = target->GetVictim();\n+            bool tanking = u && IsTank(target) && u->ToCreature() && u->ToCreature()->isWorldBoss();\n+\n+            if (IsSpellReady(DIVINE_ILLUMINATION_1, diff, false) && GetManaPCT(me) <= 50 && Rand() < 50 + 50*tanking)\n+                if (doCast(me, GetSpell(DIVINE_ILLUMINATION_1)))\n+                {}\n+\n+            //Holy Light\n+            if (IsSpellReady(HOLY_LIGHT_1, diff) && (xppct > 15 || !GetSpell(FLASH_OF_LIGHT_1)) &&\n+                xphploss > _heals[HOLY_LIGHT_1])\n+            {\n+                //Aura Mastery\n+                if (hp < 60 && _myaura == CONCENTRATION_AURA_1 && IsSpellReady(AURA_MASTERY_1, diff, false) && Rand() < 90 &&\n+                    ((!me->getAttackers().empty() && (*me->getAttackers().begin())->IsPlayer()) ||\n+                    me->GetMap()->Instanceable() || tanking))\n+                    if (doCast(me, GetSpell(AURA_MASTERY_1)))\n+                    {}\n+                if (doCast(target, GetSpell(HOLY_LIGHT_1)))\n+                    return true;\n+            }\n+            //Flash of Light\n+            if (IsSpellReady(FLASH_OF_LIGHT_1, diff) && (tanking || xphploss > _heals[FLASH_OF_LIGHT_1]))\n+            {\n+                if (doCast(target, GetSpell(FLASH_OF_LIGHT_1)))\n+                    return true;\n+            }\n+\n+            return false;\n+        }\n+\n+        void StartAttack(Unit* u, bool force = false)\n+        {\n+            if (!bot_ai::StartAttack(u, force))\n+                return;\n+            GetInPosition(force, u);\n+        }\n+\n+        void JustEngagedWith(Unit* u) override { bot_ai::JustEngagedWith(u); }\n+        void KilledUnit(Unit* u) override { bot_ai::KilledUnit(u); }\n+        void EnterEvadeMode(EvadeReason why = EVADE_REASON_OTHER) override { bot_ai::EnterEvadeMode(why); }\n+        void MoveInLineOfSight(Unit* u) override { bot_ai::MoveInLineOfSight(u); }\n+        void JustDied(Unit* u) override { bot_ai::JustDied(u); }\n+\n+        void BreakCC(uint32 diff) override\n+        {\n+            if (me->GetLevel() >= 35 && GetSpec() == BOT_SPEC_PALADIN_RETRIBUTION && IsSpellReady(HAND_OF_FREEDOM_1, diff) && Rand() < 30 && me->HasAuraWithMechanic(1u<<MECHANIC_STUN))\n+            {\n+                if (me->IsMounted())\n+                    me->RemoveAurasByType(SPELL_AURA_MOUNTED);\n+                if (doCast(me, GetSpell(HAND_OF_FREEDOM_1)))\n+                    return;\n+            }\n+            bot_ai::BreakCC(diff);\n+        }\n+\n+        void UpdateAI(uint32 diff) override\n+        {\n+            if (!GlobalUpdate(diff))\n+                return;\n+\n+            DoVehicleActions(diff);\n+            if (!CanBotAttackOnVehicle())\n+                return;\n+\n+            if (IsPotionReady())\n+            {\n+                if (GetManaPCT(me) < 30)\n+                    DrinkPotion(true);\n+                else if (GetHealthPCT(me) < 60)\n+                    DrinkPotion(false);\n+            }\n+            else if (GetManaPCT(me) < 40 && IsSpellReady(DIVINE_PLEA_1, diff) && Rand() < 30 &&\n+                !me->GetAuraEffect(SPELL_AURA_OBS_MOD_POWER, SPELLFAMILY_PALADIN, 0x0, 0x80004000, 0x1))\n+            {\n+                if (doCast(me, GetSpell(DIVINE_PLEA_1)))\n+                    return;\n+            }\n+\n+            CheckRacials(diff);\n+\n+            HOPGroup(diff);\n+            CheckBeacon(diff);\n+\n+            if (me->GetMap()->IsRaid())\n+            {\n+                CureGroup(GetSpell(CLEANSE), diff);\n+                BuffAndHealGroup(diff);\n+                CheckHandOfSacrifice(diff);\n+                ShieldGroup(diff);\n+            }\n+            else\n+            {\n+                BuffAndHealGroup(diff);\n+                CheckHandOfSacrifice(diff);\n+                ShieldGroup(diff);\n+                CureGroup(GetSpell(CLEANSE), diff);\n+            }\n+\n+            CheckSacrifice(diff);\n+            HOFGroup(diff);\n+            HOSGroup(diff);\n+\n+            if (!me->IsInCombat())\n+                DoNonCombatActions(diff);\n+\n+            CheckSeal(diff);\n+            CheckAura(diff);\n+\n+            if (ProcessImmediateNonAttackTarget())\n+                return;\n+\n+            if (!CheckAttackTarget())\n+                return;\n+\n+            Repentance(diff);\n+            Counter(diff);\n+            TurnEvil(diff);\n+\n+            CheckDivineIntervention(diff);\n+            if (!me->IsAlive())\n+                return;\n+\n+            if (IsCasting())\n+                return;\n+\n+            CheckUsableItems(diff);\n+\n+            DoNormalAttack(diff);\n+        }\n+\n+        void DoNonCombatActions(uint32 diff)\n+        {\n+            if (GC_Timer > diff || me->IsMounted() || IsCasting())\n+                return;\n+\n+            ResurrectGroup(GetSpell(REDEMPTION_1));\n+        }\n+\n+        void CheckSeal(uint32 diff)\n+        {\n+            if (checkSealTimer > diff || GC_Timer > diff || me->IsMounted() ||\n+                IsCasting() || Feasting() || Rand() > 30)\n+                return;\n+\n+            checkSealTimer = 10000;\n+\n+            Unit const* victim = me->GetVictim();\n+\n+            uint32 COMMAND = GetSpell(SEAL_OF_COMMAND_1);\n+            uint32 LIGHT = GetSpell(SEAL_OF_LIGHT_1);\n+            uint32 RIGHT = GetSpell(SEAL_OF_RIGHTEOUSNESS_1);\n+            uint32 WISDOM = GetSpell(SEAL_OF_WISDOM_1);\n+            uint32 JUSTICE = GetSpell(SEAL_OF_JUSTICE_1);\n+            uint32 VENGEANCE = (me->GetRaceMask() & sRaceMgr->GetAllianceRaceMask()) ? GetSpell(SEAL_OF_VENGEANCE_1) : GetSpell(SEAL_OF_CORRUPTION_1);\n+\n+            if (VENGEANCE && victim &&\n+                (victim->GetMaxHealth() > me->GetMaxHealth() * (2 + victim->getAttackers().size() / 2) ||\n+                victim->GetClass() == CLASS_ROGUE))\n+                COMMAND = VENGEANCE;\n+\n+            uint32 SEAL = 0;\n+\n+            if (IsMelee() && GetManaPCT(me) < 20 && WISDOM)\n+                SEAL = WISDOM;\n+            else if (IsTank())\n+            {\n+                if (JUSTICE && me->getAttackers().size() > 1)\n+                    JUSTICE = 0;\n+                if (JUSTICE && victim)\n+                {\n+                    Creature const* cre = victim->ToCreature();\n+                    if (cre && cre->GetCreatureTemplate()->rank != CREATURE_ELITE_NORMAL &&\n+                        (cre->HasMechanicTemplateImmunity(1u<<(MECHANIC_STUN-1))))\n+                        JUSTICE = 0;\n+                }\n+                SEAL = COMMAND ? COMMAND : JUSTICE ? JUSTICE : RIGHT;\n+            }\n+            else if (HasRole(BOT_ROLE_DPS))\n+            {\n+                SEAL = WISDOM && HasRole(BOT_ROLE_HEAL) ? WISDOM : COMMAND ? COMMAND : RIGHT;\n+            }\n+            else if (HasRole(BOT_ROLE_HEAL))\n+                SEAL = WISDOM ? WISDOM : LIGHT ? LIGHT : RIGHT;\n+\n+            if (SEAL && !me->HasAura(SEAL))\n+                if (doCast(me, SEAL))\n+                    return;\n+        }\n+\n+        void CheckAura(uint32 diff)\n+        {\n+            if (checkAuraTimer > diff || GC_Timer > diff || (IAmFree() && !GetBG()) || IsCasting() ||\n+                /*me->GetExactDist(master) > 40 || me->IsMounted() || Feasting() || */Rand() > 20)\n+                return;\n+\n+            checkAuraTimer = urand(3000, 6000);\n+\n+            //7 paladins in group?\n+            uint32 DEVOTION_AURA = GetSpell(DEVOTION_AURA_1);\n+            uint32 CONCENTRATION_AURA = GetSpell(CONCENTRATION_AURA_1);\n+            uint32 FIRE_RESISTANCE_AURA = GetSpell(FIRE_RESISTANCE_AURA_1);\n+            uint32 FROST_RESISTANCE_AURA = GetSpell(FROST_RESISTANCE_AURA_1);\n+            uint32 SHADOW_RESISTANCE_AURA = GetSpell(SHADOW_RESISTANCE_AURA_1);\n+            uint32 RETRIBUTION_AURA = GetSpell(RETRIBUTION_AURA_1);\n+            //uint32 CRUSADER_AURA = GetSpell(CRUSADER_AURA_1);\n+\n+            bool pureHealer = GetSpec() == BOT_SPEC_PALADIN_HOLY;\n+            bool isProt = GetSpec() == BOT_SPEC_PALADIN_PROTECTION;\n+\n+            std::map<uint32 /*baseid*/, uint32 /*curid*/> idMap;\n+            uint32 mask = _getAurasMask(idMap);\n+\n+            //for Aura Mastery allow every pure healer paladin to have their own C aura\n+            //SPECIFIC_AURA_MY_AURA check still works so no spam\n+            if (pureHealer)\n+                mask &= ~SPECIFIC_AURA_CONCENTRATION;\n+\n+            //if (CRUSADER_AURA && !(mask & SPECIFIC_AURA_CRUSADER) &&\n+            //    (master->IsMounted() || me->IsMounted()))\n+            //{\n+            //    if (doCast(me, CRUSADER_AURA))\n+            //        return;\n+            //}\n+\n+            //Has own aura or has all auras\n+            if (mask & SPECIFIC_AURA_MY_AURA)\n+                return;\n+            else if ((mask & SPECIFIC_AURA_ALL_AUTOUSE) == SPECIFIC_AURA_ALL_AUTOUSE)\n+                return;\n+\n+            //TODO: priority?\n+            if (_myaura && GetSpell(_myaura) && (!idMap.contains(_myaura) || idMap[_myaura] < GetSpell(_myaura)))\n+            {\n+                if (doCast(me, GetSpell(_myaura)))\n+                    return;\n+            }\n+            if (DEVOTION_AURA &&\n+                (!(mask & SPECIFIC_AURA_DEVOTION) || idMap[DEVOTION_AURA_1] < DEVOTION_AURA) &&\n+                (!RETRIBUTION_AURA || IsTank(master) || isProt))\n+            {\n+                if (doCast(me, DEVOTION_AURA))\n+                    return;\n+            }\n+            if (CONCENTRATION_AURA && !(mask & SPECIFIC_AURA_CONCENTRATION) &&\n+                (master->GetClass() == BOT_CLASS_MAGE || master->GetClass() == BOT_CLASS_PRIEST ||\n+                master->GetClass() == BOT_CLASS_WARLOCK || master->GetClass() == BOT_CLASS_DRUID ||\n+                (!IAmFree() && master->GetClass() == BOT_CLASS_PALADIN) || pureHealer))\n+            {\n+                if (doCast(me, CONCENTRATION_AURA))\n+                    return;\n+            }\n+            if (RETRIBUTION_AURA &&\n+                (!(mask & SPECIFIC_AURA_RETRIBUTION) || idMap[RETRIBUTION_AURA_1] < RETRIBUTION_AURA) &&\n+                (IsMeleeClass(master->GetClass()) || IsMelee()))\n+            {\n+                if (doCast(me, RETRIBUTION_AURA))\n+                    return;\n+            }\n+            if (FIRE_RESISTANCE_AURA &&\n+                (!(mask & SPECIFIC_AURA_FIRE_RES) || idMap[FIRE_RESISTANCE_AURA_1] < FIRE_RESISTANCE_AURA))\n+            {\n+                if (doCast(me, FIRE_RESISTANCE_AURA))\n+                    return;\n+            }\n+            if (SHADOW_RESISTANCE_AURA && GetBG() &&\n+                (!(mask & SPECIFIC_AURA_SHADOW_RES) || idMap[SHADOW_RESISTANCE_AURA_1] < SHADOW_RESISTANCE_AURA))\n+            {\n+                if (doCast(me, SHADOW_RESISTANCE_AURA))\n+                    return;\n+            }\n+            if (FROST_RESISTANCE_AURA &&\n+                (!(mask & SPECIFIC_AURA_FROST_RES) || idMap[FROST_RESISTANCE_AURA_1] < FROST_RESISTANCE_AURA))\n+            {\n+                if (doCast(me, FROST_RESISTANCE_AURA))\n+                    return;\n+            }\n+            if (SHADOW_RESISTANCE_AURA &&\n+                (!(mask & SPECIFIC_AURA_SHADOW_RES) || idMap[SHADOW_RESISTANCE_AURA_1] < SHADOW_RESISTANCE_AURA))\n+            {\n+                if (doCast(me, SHADOW_RESISTANCE_AURA))\n+                    return;\n+            }\n+        }\n+\n+        bool BuffTarget(Unit* target, uint32 /*diff*/) override\n+        {\n+            if (me->IsInCombat() && !master->GetMap()->IsRaid()) return false;\n+\n+            if (target == me)\n+            {\n+                if (uint32 rFury = GetSpell(RIGHTEOUS_FURY_1))\n+                {\n+                    if (IsTank())\n+                    {\n+                        if (!me->HasAura(rFury) && doCast(me, rFury))\n+                            return true;\n+                    }\n+                    else if (me->HasAura(rFury))\n+                        me->RemoveAurasDueToSpell(rFury);\n+                }\n+            }\n+\n+            uint32 mask = _getBlessingsMask(target);\n+\n+            //already has my blessing\n+            if (mask & SPECIFIC_BLESSING_MY_BLESSING)\n+                return false;\n+\n+            uint32 BLESSING_OF_WISDOM = GetSpell(BLESSING_OF_WISDOM_1);\n+            uint32 BLESSING_OF_KINGS = GetSpell(BLESSING_OF_KINGS_1);\n+            uint32 BLESSING_OF_SANCTUARY = GetSpell(BLESSING_OF_SANCTUARY_1);\n+            uint32 BLESSING_OF_MIGHT = GetSpell(BLESSING_OF_MIGHT_1);\n+\n+            bool wisdom = (mask & SPECIFIC_BLESSING_WISDOM);\n+            bool kings = (mask & SPECIFIC_BLESSING_KINGS);\n+            bool sanctuary = (mask & SPECIFIC_BLESSING_SANCTUARY);\n+            bool might = (mask & SPECIFIC_BLESSING_MIGHT);\n+\n+            if (IsTank(target))\n+            {\n+                if (BLESSING_OF_KINGS && !kings && doCast(target, BLESSING_OF_KINGS))\n+                    return true;\n+                else if (BLESSING_OF_SANCTUARY && !sanctuary && doCast(target, BLESSING_OF_SANCTUARY))\n+                    return true;\n+                else if (BLESSING_OF_WISDOM && !wisdom && target->GetMaxPower(POWER_MANA) > 1 && doCast(target, BLESSING_OF_WISDOM))\n+                    return true;\n+                else if (BLESSING_OF_MIGHT && !might && doCast(target, BLESSING_OF_MIGHT))\n+                    return true;\n+\n+                return false;\n+            }\n+\n+            uint8 Class = 0;\n+            if (target->IsPlayer())\n+                Class = target->GetClass();\n+            else if (Creature* cre = target->ToCreature())\n+                Class = cre->GetBotAI() ? cre->GetBotAI()->GetBotClass() : cre->GetClass();\n+\n+            switch (Class)\n+            {\n+                case BOT_CLASS_BM:\n+                case BOT_CLASS_SPHYNX:\n+                case BOT_CLASS_DREADLORD:\n+                case BOT_CLASS_SPELLBREAKER:\n+                case BOT_CLASS_DARK_RANGER:\n+                case BOT_CLASS_NECROMANCER:\n+                case BOT_CLASS_SEA_WITCH:\n+                case BOT_CLASS_CRYPT_LORD:\n+                    if (BLESSING_OF_KINGS && !kings && doCast(target, BLESSING_OF_KINGS))\n+                        return true;\n+                    else if (BLESSING_OF_MIGHT && !might && doCast(target, BLESSING_OF_MIGHT))\n+                        return true;\n+                    else if (BLESSING_OF_SANCTUARY && !sanctuary && doCast(target, BLESSING_OF_SANCTUARY))\n+                        return true;\n+                    break;\n+                case CLASS_PRIEST:\n+                case CLASS_MAGE:\n+                case CLASS_WARLOCK:\n+                    if (BLESSING_OF_KINGS && !kings && doCast(target, BLESSING_OF_KINGS))\n+                        return true;\n+                    else if (BLESSING_OF_WISDOM && !wisdom && doCast(target, BLESSING_OF_WISDOM))\n+                        return true;\n+                    else if (BLESSING_OF_SANCTUARY && !sanctuary && doCast(target, BLESSING_OF_SANCTUARY))\n+                        return true;\n+                    break;\n+                case CLASS_DEATH_KNIGHT:\n+                case CLASS_WARRIOR:\n+                case CLASS_PALADIN:\n+                case CLASS_ROGUE:\n+                case CLASS_HUNTER:\n+                case CLASS_SHAMAN:\n+                    if (BLESSING_OF_KINGS && !kings && doCast(target, BLESSING_OF_KINGS))\n+                        return true;\n+                    else if (BLESSING_OF_MIGHT && !might && doCast(target, BLESSING_OF_MIGHT))\n+                        return true;\n+                    else if (BLESSING_OF_SANCTUARY && !sanctuary && doCast(target, BLESSING_OF_SANCTUARY))\n+                        return true;\n+                    else if (BLESSING_OF_WISDOM && !wisdom && target->GetPowerType() == POWER_MANA && doCast(target, BLESSING_OF_WISDOM))\n+                        return true;\n+                    break;\n+                default:\n+                    if (BLESSING_OF_KINGS && !kings && doCast(target, BLESSING_OF_KINGS))\n+                        return true;\n+                    else if (BLESSING_OF_WISDOM && !wisdom && target->GetMaxPower(POWER_MANA) > 1 && doCast(target, BLESSING_OF_WISDOM))\n+                        return true;\n+                    else if (BLESSING_OF_SANCTUARY && !sanctuary && doCast(target, BLESSING_OF_SANCTUARY))\n+                        return true;\n+                    else if (BLESSING_OF_MIGHT && !might && doCast(target, BLESSING_OF_MIGHT))\n+                        return true;\n+                    break;\n+            }\n+            return false;\n+        }\n+\n+        void Repentance(uint32 diff, Unit* target = nullptr)\n+        {\n+            if (target)\n+            {\n+                if (IsSpellReady(REPENTANCE_1, diff) && doCast(target, GetSpell(REPENTANCE_1)))\n+                    return;\n+            }\n+            else if (IsSpellReady(REPENTANCE_1, diff))\n+            {\n+                Unit* u = FindStunTarget();\n+                if (u && u->GetVictim() != me && doCast(u, GetSpell(REPENTANCE_1)))\n+                    return;\n+            }\n+        }\n+\n+        void Counter(uint32 diff)\n+        {\n+            if (IsCasting())\n+                return;\n+            if (Rand() > 60)\n+                return;\n+\n+            Unit* target = IsSpellReady(REPENTANCE_1, diff) ? FindCastingTarget(20, 0, REPENTANCE_1) : nullptr;\n+            if (target)\n+                Repentance(diff, target); //first check repentance\n+            if (!target && IsSpellReady(TURN_EVIL_1, diff))\n+            {\n+                target = FindCastingTarget(20, 0, TURN_EVIL_1);\n+                if (target && doCast(target, GetSpell(TURN_EVIL_1)))\n+                    return;\n+            }\n+            if (!target && IsSpellReady(HOLY_WRATH_1, diff, false) && HasRole(BOT_ROLE_DPS))\n+            {\n+                target = FindCastingTarget(8, 0, TURN_EVIL_1); //here we check target as with turn evil cuz of same requirements\n+                if (target && doCast(me, GetSpell(HOLY_WRATH_1)))\n+                    return;\n+            }\n+            if (!target && IsSpellReady(HAMMER_OF_JUSTICE_1, diff, false))\n+            {\n+                target = FindCastingTarget(10, 0, HAMMER_OF_JUSTICE_1);\n+                if (target && doCast(target, GetSpell(HAMMER_OF_JUSTICE_1)))\n+                {}\n+            }\n+        }\n+\n+        void TurnEvil(uint32 diff)\n+        {\n+            if (!IsSpellReady(TURN_EVIL_1, diff) || IsCasting() || Rand() > 50 ||\n+                FindAffectedTarget(GetSpell(TURN_EVIL_1), me->GetGUID(), 50))\n+                return;\n+            Unit* target = FindUndeadCCTarget(20, TURN_EVIL_1);\n+            if (target &&\n+                (target != me->GetVictim() || GetHealthPCT(me) < 70 || target->GetVictim() == master) &&\n+                doCast(target, GetSpell(TURN_EVIL_1)))\n+                return;\n+            else\n+            {\n+                for (Unit* mtar : { opponent, disttarget })\n+                {\n+                    if (mtar && (mtar->GetCreatureTypeMask() & CREATURE_TYPEMASK_DEMON_OR_UNDEAD) && !CCed(mtar) &&\n+                        mtar->GetVictim() && !IsTank(mtar->GetVictim()) && mtar->GetVictim() != me &&\n+                        GetHealthPCT(me) < 90 &&\n+                        doCast(mtar, GetSpell(TURN_EVIL_1)))\n+                        return;\n+                }\n+            }\n+        }\n+\n+        void CheckDivineIntervention(uint32 diff)\n+        {\n+            if (!IsSpellReady(DIVINE_INTERVENTION_1, diff, !IsCasting()) || IAmFree() || IsTank() ||\n+                GetManaPCT(me) > 10 || Rand() > 20)\n+                return;\n+\n+            std::list<Unit*> players;\n+\n+            if (master->IsAlive() && !master->getAttackers().empty() && GetHealthPCT(master) < 15 &&\n+                !master->HasAuraTypeWithMiscvalue(SPELL_AURA_SCHOOL_IMMUNITY, 127))\n+                players.push_back(master);\n+            if (Group const* gr = master->GetGroup())\n+            {\n+                for (GroupReference const* itr = gr->GetFirstMember(); itr != nullptr; itr = itr->next())\n+                {\n+                    Player* pl = itr->GetSource();\n+                    if (!pl || pl == master || !pl->IsInWorld() || me->GetMap() != pl->FindMap() ||\n+                        !pl->IsAlive() || pl->getAttackers().empty() || GetHealthPCT(pl) > 15 ||\n+                        pl->HasAuraTypeWithMiscvalue(SPELL_AURA_SCHOOL_IMMUNITY, 127))\n+                        continue;\n+\n+                    players.push_back(pl);\n+                }\n+            }\n+\n+            if (players.empty())\n+                return;\n+\n+            Unit* target = players.size() == 1 ? players.front() : Bcore::Containers::SelectRandomContainerElement(players);\n+            if (doCast(target, GetSpell(DIVINE_INTERVENTION_1)))\n+                return;\n+        }\n+\n+        void DoNormalAttack(uint32 diff)\n+        {\n+            Unit* mytar = opponent ? opponent : disttarget ? disttarget : nullptr;\n+            if (!mytar)\n+                return;\n+\n+            StartAttack(mytar, IsMelee());\n+\n+            CheckAttackState();\n+            if (!me->IsAlive() || !mytar->IsAlive())\n+                return;\n+\n+            MoveBehind(mytar);\n+\n+            //Divine Shield\n+            if (IsSpellReady(DIVINE_SHIELD_1, diff) && shieldDelayTimer <= diff && (IAmFree() || !IsTank()) &&\n+                Rand() < 80 && !me->getAttackers().empty() && GetHealthPCT(me) < 25)\n+            {\n+                if (doCast(me, GetSpell(DIVINE_SHIELD_1)))\n+                    return;\n+            }\n+\n+            //Holy shield\n+            if (IsSpellReady(HOLY_SHIELD_1, diff) && HasRole(BOT_ROLE_DPS) && CanBlock() && !me->getAttackers().empty() && GetManaPCT(me) > 25 &&\n+                (GetManaPCT(me) > 80 || me->getAttackers().size() > 3 || ((*me->getAttackers().cbegin())->IsCreature() && (*me->getAttackers().cbegin())->ToCreature()->isWorldBoss())) &&\n+                !me->HasAuraTypeWithMiscvalue(SPELL_AURA_SCHOOL_IMMUNITY, 127))\n+            {\n+                if (doCast(me, GetSpell(HOLY_SHIELD_1)))\n+                    return;\n+            }\n+\n+            auto [can_do_holy, can_do_normal] = CanAffectVictimBools(mytar, SPELL_SCHOOL_HOLY, SPELL_SCHOOL_NORMAL);\n+\n+            float dist = me->GetDistance(mytar);\n+\n+            //HAMMER OF WRATH\n+            if (IsSpellReady(HAMMER_OF_WRATH_1, diff) && can_do_holy && HasRole(BOT_ROLE_DPS) && Rand() < 80 &&\n+                mytar->HasAuraState(AURA_STATE_HEALTHLESS_20_PERCENT) && dist < 30)\n+            {\n+                if (doCast(mytar, GetSpell(HAMMER_OF_WRATH_1)))\n+                    return;\n+            }\n+            //HAND OF RECKONING //No GCD\n+            Unit* u = mytar->GetVictim();\n+            if (IsSpellReady(HAND_OF_RECKONING_1, diff, false) && can_do_holy && u && u != me && Rand() < 50 && dist < 30 &&\n+                mytar->IsCreature() && !mytar->IsControlledByPlayer() &&\n+                !CCed(mytar) && HasRole(BOT_ROLE_DPS) && !mytar->HasAuraType(SPELL_AURA_MOD_TAUNT) &&\n+                (!IsTank(u) || (IsTank() && GetHealthPCT(me) > 67 &&\n+                (GetHealthPCT(u) < 30 || (IsOffTank() && !IsOffTank(u) && IsPointedOffTankingTarget(mytar)) ||\n+                (!IsOffTank() && IsOffTank(u) && IsPointedTankingTarget(mytar))))) &&\n+                ((!IsTankingClass(u->GetClass()) && GetHealthPCT(u) < 80) || IsTank()) &&\n+                IsInBotParty(u))\n+            {\n+                if (doCast(mytar, GetSpell(HAND_OF_RECKONING_1)))\n+                    return;\n+            }\n+            //HAND OF RECKONING 2 (distant)\n+            if (IsSpellReady(HAND_OF_RECKONING_1, diff, false) && !IAmFree() && u == me && Rand() < 30 && IsTank() && HasRole(BOT_ROLE_DPS) &&\n+                (IsOffTank() || master->GetBotMgr()->GetNpcBotsCountByRole(BOT_ROLE_TANK_OFF) == 0) &&\n+                !(me->GetLevel() >= 40 && mytar->IsCreature() &&\n+                (mytar->ToCreature()->IsDungeonBoss() || mytar->ToCreature()->isWorldBoss())))\n+            {\n+                Unit* tUnit = FindDistantTauntTarget();\n+                if (tUnit)\n+                {\n+                    if (doCast(tUnit, GetSpell(HAND_OF_RECKONING_1)))\n+                        return;\n+                }\n+            }\n+            //RIGHTEOUS DEFENSE //No GCD\n+            if (IsSpellReady(RIGHTEOUS_DEFENSE_1, diff, false) && !IAmFree() && u && u != me && IsTank() &&\n+                me->GetDistance(u) < 40 && mytar->IsCreature() && !mytar->IsControlledByPlayer() &&\n+                !IsTankingClass(u->GetClass()) && GetHealthPCT(u) < 80 &&\n+                !CCed(mytar) && !mytar->HasAuraType(SPELL_AURA_MOD_TAUNT) &&\n+                (!IsTank(u) || (GetHealthPCT(u) < 30 && GetHealthPCT(me) > 67)) &&\n+                IsInBotParty(u) && Rand() < 20 + 30 * u->getAttackers().size())\n+            {\n+                if (doCast(u, GetSpell(RIGHTEOUS_DEFENSE_1)))\n+                    return;\n+            }\n+            //RIGHTEOUS DEFENSE 2 (distant)\n+            if (IsSpellReady(RIGHTEOUS_DEFENSE_1, diff, false) && !IAmFree() && u == me && IsTank() && Rand() < 30 &&\n+                !(me->GetLevel() >= 40 && mytar->IsCreature() &&\n+                (mytar->ToCreature()->IsDungeonBoss() || mytar->ToCreature()->isWorldBoss())))\n+            {\n+                Unit* tUnit = FindDistantTauntTarget(40, true);\n+                if (tUnit)\n+                {\n+                    if (doCast(tUnit, GetSpell(RIGHTEOUS_DEFENSE_1)))\n+                        return;\n+                }\n+            }\n+            //Divine Plea\n+            if (IsSpellReady(DIVINE_PLEA_1, diff) && Rand() < 30 && GetManaPCT(me) < (IsTank() ? 90 : 7) &&\n+                !me->GetAuraEffect(SPELL_AURA_OBS_MOD_POWER, SPELLFAMILY_PALADIN, 0x0, 0x80004000, 0x1))\n+            {\n+                if (doCast(me, GetSpell(DIVINE_PLEA_1)))\n+                    return;\n+            }\n+            //Avenging Wrath (tank - big threat, dps - big hp, heal - divine plea counter)\n+            if (IsSpellReady(AVENGING_WRATH_1, diff, false) && can_do_holy && avDelayTimer <= diff &&\n+                HasRole(BOT_ROLE_HEAL|BOT_ROLE_DPS) && Rand() < 35 && dist < 30 &&\n+                IsTank() ? (mytar->IsCreature() && (mytar->ToCreature()->IsDungeonBoss() || mytar->ToCreature()->isWorldBoss())) :\n+                (!HasRole(BOT_ROLE_HEAL) || !HasRole(BOT_ROLE_RANGED)) ? (mytar->GetHealth() > me->GetMaxHealth()/4 * (1 + mytar->getAttackers().size())) :\n+                (me->GetAuraEffect(SPELL_AURA_OBS_MOD_POWER, SPELLFAMILY_PALADIN, 0x0, 0x80004000, 0x1) != nullptr))\n+            {\n+                if (doCast(me, GetSpell(AVENGING_WRATH_1)))\n+                {}\n+            }\n+            //Avenger's shield\n+            if (IsSpellReady(AVENGERS_SHIELD_1, diff) && can_do_holy && CanBlock() &&\n+                HasRole(BOT_ROLE_DPS) && dist < 30 && Rand() < 60)\n+            {\n+                if (doCast(mytar, GetSpell(AVENGERS_SHIELD_1)))\n+                    return;\n+            }\n+            //Divine Protection tanks only\n+            if (IsSpellReady(DIVINE_PROTECTION_1, diff, false) && shieldDelayTimer <= diff && IsTank() && Rand() < 80 &&\n+                !me->getAttackers().empty() && GetHealthPCT(me) < 67 - 20*me->HasAuraType(SPELL_AURA_PERIODIC_HEAL))\n+            {\n+                if (doCast(me, GetSpell(DIVINE_PROTECTION_1)))\n+                    return;\n+            }\n+            //Exorcism (have cast window or instant)\n+            if (IsSpellReady(EXORCISM_1, diff) && can_do_holy && HasRole(BOT_ROLE_DPS) && dist < 30 && Rand() < 70 &&\n+                ((IsTank() && dist > 12) || (HasRole(BOT_ROLE_RANGED) && !HasRole(BOT_ROLE_HEAL)) ||\n+                me->GetAuraEffect(SPELL_AURA_ADD_PCT_MODIFIER, SPELLFAMILY_PALADIN, 0x0, 0x0, 0x2)))\n+            {\n+                if (doCast(mytar, GetSpell(EXORCISM_1)))\n+                    return;\n+            }\n+            //Hammer of Justice\n+            if (IsSpellReady(HAMMER_OF_JUSTICE_1, diff) && !CCed(mytar) && dist < 10 && Rand() < 20 &&\n+                mytar->GetDiminishing(DIMINISHING_STUN) <= DIMINISHING_LEVEL_2 &&\n+                !IsImmunedToMySpellEffect(mytar, sSpellMgr->GetSpellInfo(HAMMER_OF_JUSTICE_1), EFFECT_0))\n+            {\n+                if (doCast(mytar, GetSpell(HAMMER_OF_JUSTICE_1)))\n+                    return;\n+            }\n+            //Judgement\n+            if (GetSpellCooldown(JUDGEMENT_OF_LIGHT_1) <= diff && can_do_holy && HasRole(BOT_ROLE_DPS) && Rand() < 120)\n+            {\n+                uint32 JUDGEMENT = 0;\n+\n+                if (GetSpell(JUDGEMENT_OF_JUSTICE_1) && mytar->HasAuraType(SPELL_AURA_MOD_INCREASE_SPEED) &&\n+                    dist < CalcSpellMaxRange(JUDGEMENT_OF_JUSTICE_1))\n+                {\n+                    //has joj from someone else\n+                    bool canCast = true;\n+                    for (AuraEffect const* aeff : mytar->GetAuraEffectsByType(SPELL_AURA_USE_NORMAL_MOVEMENT_SPEED))\n+                    {\n+                        if (aeff->GetCasterGUID() != me->GetGUID() && aeff->GetBase()->GetDuration() > 2000)\n+                        {\n+                            canCast = false;\n+                            break;\n+                        }\n+                    }\n+                    if (canCast)\n+                    {\n+                        //has sprint or something\n+                        for (AuraEffect const* aeff : mytar->GetAuraEffectsByType(SPELL_AURA_MOD_INCREASE_SPEED))\n+                        {\n+                            if (!aeff->GetBase()->IsPassive() && aeff->GetBase()->GetDuration() > 2000 && aeff->GetAmount() >= 30)\n+                            {\n+                                JUDGEMENT = JUDGEMENT_OF_JUSTICE_1;\n+                                break;\n+                            }\n+                        }\n+                    }\n+                }\n+                if (!JUDGEMENT && GetSpell(JUDGEMENT_OF_WISDOM_1) && dist < CalcSpellMaxRange(JUDGEMENT_OF_WISDOM_1))\n+                {\n+                    //from 35% to 50% mana\n+                    AuraEffect const* wisd = mytar->GetAuraEffect(JUDGEMENT_OF_WISDOM_AURA, 0);\n+                    //AuraEffect const* wisd = mytar->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_PALADIN, 3014, 0);\n+                    uint8 myManaPct = GetManaPCT(me);\n+                    if ((!wisd && myManaPct < 35) || (wisd && wisd->GetCasterGUID() == me->GetGUID() && myManaPct < 50))\n+                        JUDGEMENT = JUDGEMENT_OF_WISDOM_1;\n+                }\n+                if (!JUDGEMENT && GetSpell(JUDGEMENT_OF_LIGHT_1) && dist < CalcSpellMaxRange(JUDGEMENT_OF_LIGHT_1))\n+                {\n+                    JUDGEMENT = JUDGEMENT_OF_LIGHT_1;\n+                }\n+\n+                //Conditional spell unavailable, use any other\n+                if (!JUDGEMENT)\n+                {\n+                    if (GetSpell(JUDGEMENT_OF_WISDOM_1))\n+                        JUDGEMENT = JUDGEMENT_OF_WISDOM_1;\n+                    else if (GetSpell(JUDGEMENT_OF_LIGHT_1))\n+                        JUDGEMENT = JUDGEMENT_OF_LIGHT_1;\n+                    else if (GetSpell(JUDGEMENT_OF_JUSTICE_1))\n+                        JUDGEMENT = JUDGEMENT_OF_JUSTICE_1;\n+                }\n+\n+                if (JUDGEMENT && doCast(mytar, GetSpell(JUDGEMENT)))\n+                    return;\n+            }\n+            //Consecration\n+            if (IsSpellReady(CONSECRATION_1, diff) && can_do_holy && HasRole(BOT_ROLE_DPS) && dist < 5 && !mytar->isMoving() && Rand() < 20)\n+            {\n+                std::list<Unit*> targets;\n+                GetNearbyTargetsList(targets, 8.f, 0);\n+                if (targets.size() >= 2)\n+                {\n+                    if (doCast(me, GetSpell(CONSECRATION_1)))\n+                        return;\n+                }\n+            }\n+            //Hammer of the Righteous (1h only)\n+            if (IsSpellReady(HAMMER_OF_THE_RIGHTEOUS_1, diff) && can_do_holy && HasRole(BOT_ROLE_DPS) &&\n+                dist < 5 && Rand() < 80)\n+            {\n+                Item const* weapMH = GetEquips(BOT_SLOT_MAINHAND);\n+                if (weapMH &&\n+                    (weapMH->GetTemplate()->InventoryType == INVTYPE_WEAPON ||\n+                    weapMH->GetTemplate()->InventoryType == INVTYPE_WEAPONMAINHAND) &&\n+                    doCast(mytar, GetSpell(HAMMER_OF_THE_RIGHTEOUS_1)))\n+                    return;\n+            }\n+            //Shield of Righteousness\n+            if (IsSpellReady(SHIELD_OF_RIGHTEOUSNESS_1, diff) && can_do_holy && HasRole(BOT_ROLE_DPS) && CanBlock() &&\n+                (IsTank() || IAmFree()) && dist < 5 && Rand() < 90)\n+            {\n+                if (doCast(mytar, GetSpell(SHIELD_OF_RIGHTEOUSNESS_1)))\n+                    return;\n+            }\n+            //Crusader Strike\n+            if (IsSpellReady(CRUSADER_STRIKE_1, diff) && can_do_normal && HasRole(BOT_ROLE_DPS) && dist < 5 && Rand() < 90)\n+            {\n+                if (doCast(mytar, GetSpell(CRUSADER_STRIKE_1)))\n+                    return;\n+            }\n+            //Divine Storm\n+            if (IsSpellReady(DIVINE_STORM_1, diff) && can_do_normal && HasRole(BOT_ROLE_DPS) && dist < 7 && Rand() < 40)\n+            {\n+                if (doCast(me, GetSpell(DIVINE_STORM_1)))\n+                    return;\n+            }\n+            //Holy Wrath\n+            if (IsSpellReady(HOLY_WRATH_1, diff) && HasRole(BOT_ROLE_DPS) && Rand() < 50)\n+            {\n+                if ((mytar->GetCreatureType() == CREATURE_TYPE_UNDEAD || mytar->GetCreatureType() == CREATURE_TYPE_DEMON) &&\n+                    dist < 8.5f && doCast(me, GetSpell(HOLY_WRATH_1)))\n+                    return;\n+                else\n+                {\n+                    if (FindUndeadCCTarget(8.5f, HOLY_WRATH_1, false) &&\n+                        doCast(me, GetSpell(HOLY_WRATH_1)))\n+                        return;\n+                }\n+            }\n+        }\n+\n+        void ApplyClassSpellCritMultiplierAll(Unit const* /*victim*/, float& crit_chance, SpellInfo const* spellInfo, SpellSchoolMask schoolMask, WeaponAttackType /*attackType*/) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+\n+            //Sanctified Light: 6% additional critical chance for Holy Light and Holy Shock\n+            if ((GetSpec() == BOT_SPEC_PALADIN_HOLY) && lvl >= 30 && (baseId == HOLY_LIGHT_1 || baseId == HOLY_SHOCK_1))\n+                crit_chance += 6.f;\n+            //Holy Power: 5% additional critical chance for Holy spells\n+            if ((GetSpec() == BOT_SPEC_PALADIN_HOLY) && lvl >= 35 && (schoolMask & SPELL_SCHOOL_MASK_HOLY))\n+                crit_chance += 5.f;\n+            //Improved Flash of Light (id: 20251): 6% additional critical chance for Flash of Light\n+            if (lvl >= 70 && baseId == FLASH_OF_LIGHT_1)\n+                crit_chance += 6.f;\n+            //Glyph of Flash of Light: 5% additional critical chance for Flash of Light\n+            if (lvl >= 20 && baseId == FLASH_OF_LIGHT_1)\n+                crit_chance += 5.f;\n+            //Sanctified Wrath: 50% additional critical chance for Hammer of Wrath\n+            if ((GetSpec() == BOT_SPEC_PALADIN_RETRIBUTION) && lvl >= 45 && baseId == HAMMER_OF_WRATH_1)\n+                crit_chance += 50.f;\n+            //Fanaticism: 18% additional critical chance for all Judgements (not shure which check is right)\n+            if ((GetSpec() == BOT_SPEC_PALADIN_RETRIBUTION) && lvl >= 45 && spellInfo->GetCategory() == SPELLCATEGORY_JUDGEMENT)\n+                crit_chance += 18.f;\n+            //Infusion of Light\n+            if (baseId == HOLY_LIGHT_1)\n+            {\n+                if (AuraEffect const* infu = me->GetAuraEffect(INFUSION_OF_LIGHT_BUFF, 0))\n+                    if (infu->IsAffectedOnSpell(spellInfo))\n+                        crit_chance += 20.f;\n+            }\n+            if (baseId == HOLY_LIGHT_1 || baseId == FLASH_OF_LIGHT_1 || baseId == HOLY_SHOCK_1)\n+            {\n+                if (AuraEffect const* favo = me->GetAuraEffect(DIVINE_FAVOR_1, 0))\n+                    if (favo->IsAffectedOnSpell(spellInfo))\n+                        crit_chance += 100.f;\n+            }\n+        }\n+\n+        void ApplyClassDamageMultiplierMeleeSpell(int32& damage, SpellNonMeleeDamage& /*damageinfo*/, SpellInfo const* spellInfo, WeaponAttackType /*attackType*/, bool /*iscrit*/) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+            float fdamage = float(damage);\n+\n+            //apply bonus damage mods\n+            float pctbonus = 0.0f;\n+            //if (iscrit)\n+            //{\n+            //}\n+            //Sanctity of Battle: 15% bonus damage for Exorcism and Crusader Strike\n+            if ((GetSpec() == BOT_SPEC_PALADIN_RETRIBUTION) && lvl >= 25 && baseId == EXORCISM_1)\n+                pctbonus += 0.15f;\n+            //The Art of War (damage part): 10% bonus damage for Judgements, Crusader Strike and Divine Storm\n+            if ((GetSpec() == BOT_SPEC_PALADIN_RETRIBUTION) && lvl >= 40 &&\n+                (spellInfo->GetCategory() == SPELLCATEGORY_JUDGEMENT || baseId == CRUSADER_STRIKE_1 || baseId == DIVINE_STORM_1))\n+                pctbonus += 0.1f;\n+            //Judgements of the Pure (damage part): 25% bonus damage for Judgements and Seals\n+            if ((GetSpec() == BOT_SPEC_PALADIN_HOLY) && lvl >= 50 &&\n+                (spellInfo->GetCategory() == SPELLCATEGORY_JUDGEMENT ||\n+                spellInfo->GetSpellSpecific() == SPELL_SPECIFIC_SEAL ||\n+                baseId == JUDGEMENT_OF_COMMAND_DAMAGE))\n+                pctbonus += 0.25f;\n+            //Glyph of Exorcism: 20% bonus damage for Exorcism\n+            if (lvl >= 50 && baseId == EXORCISM_1)\n+                pctbonus += 0.2f;\n+\n+            damage = int32(fdamage * (1.0f + pctbonus));\n+        }\n+\n+        void ApplyClassDamageMultiplierSpell(int32& damage, SpellNonMeleeDamage& /*damageinfo*/, SpellInfo const* spellInfo, WeaponAttackType /*attackType*/, bool /*iscrit*/) const override\n+        {\n+            uint32 spellId = spellInfo->Id;\n+            uint8 lvl = me->GetLevel();\n+            float fdamage = float(damage);\n+\n+            //apply bonus damage mods\n+            float pctbonus = 0.0f;\n+            //if (iscrit)\n+            //{\n+            //}\n+\n+            //Judgements of the Pure (damage part): 25% bonus damage for Judgements and Seals\n+            if ((GetSpec() == BOT_SPEC_PALADIN_HOLY) && lvl >= 50 &&\n+                (spellInfo->GetCategory() == SPELLCATEGORY_JUDGEMENT ||\n+                spellInfo->GetSpellSpecific() == SPELL_SPECIFIC_SEAL ||\n+                spellId == JUDGEMENT_OF_COMMAND_DAMAGE))\n+                pctbonus += 0.25f;\n+            //Improved Consecration (id: 38422): 10% bonus damage for Consecration\n+            if (lvl >= 20 && spellId == GetSpell(CONSECRATION_1))\n+                pctbonus += 0.1f;\n+\n+            damage = int32(fdamage * (1.0f + pctbonus));\n+        }\n+\n+        void ApplyClassDamageMultiplierHeal(Unit const* /*victim*/, float& heal, SpellInfo const* spellInfo, DamageEffectType /*damagetype*/, uint32 /*stack*/) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+            float pctbonus = 0.0f;\n+            float flat_mod = 0.0f;\n+\n+            //Divine Plea: 50% reduced healing for all spells\n+            if (/*lvl >= 71 && */me->GetAuraEffect(SPELL_AURA_OBS_MOD_POWER, SPELLFAMILY_PALADIN, 0x0, 0x80004000, 0x1))\n+                pctbonus -= 0.5f;\n+\n+            //Healing Light: 12% bonus healing for Holy Light, Flash of Light and Holy Shock\n+            if ((GetSpec() == BOT_SPEC_PALADIN_HOLY) && lvl >= 15 && (baseId == HOLY_LIGHT_1 || baseId == FLASH_OF_LIGHT_1 || baseId == HOLY_SHOCK_1))\n+                pctbonus += 0.12f;\n+            //Glyph of Seal of Light: 5% bonus healing for all spells\n+            if (lvl >= 30 && me->GetAuraEffect(SPELL_AURA_ADD_PCT_MODIFIER, SPELLFAMILY_PALADIN, 0x0, 0x2000000, 0x0))\n+                pctbonus += 0.05f;\n+\n+            heal = heal * (1.0f + pctbonus) + flat_mod;\n+        }\n+\n+        void ApplyClassSpellCostMods(SpellInfo const* spellInfo, int32& cost) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            float fcost = float(cost);\n+            int32 flatbonus = 0;\n+            float pctbonus = 0.0f;\n+\n+            //percent mods\n+            //Benediction: -10% mana cost for Instant spells\n+            if (lvl >= 10 && !spellInfo->CalcCastTime())\n+                pctbonus += 0.1f;\n+            //Blessed Hands: -30% mana cost for Hand spells\n+            if ((GetSpec() == BOT_SPEC_PALADIN_HOLY) && lvl >= 25 && (spellInfo->SpellFamilyFlags[0] & 0x2110))\n+                pctbonus += 0.3f;\n+            //Holy Light Cost Reduction (id: 60148): -5% mana cost for Holy Light\n+            if (lvl >= 30 && baseId == HOLY_LIGHT_1)\n+                pctbonus += 0.05f;\n+            //Consecration Discount (id: 37180): -15% mana cost for Consecration\n+            if (lvl >= 30 && baseId == CONSECRATION_1)\n+                pctbonus += 0.15f;\n+            //Glyph of Seal of Wisdom: -5% mana cost for all healing spells (for bot it is all spells)\n+            if (lvl >= 15 && me->GetAuraEffect(SPELL_AURA_ADD_PCT_MODIFIER, SPELLFAMILY_PALADIN, 0x0, 0x4000000, 0x0))\n+                pctbonus += 0.05f;\n+            //Glyph of Shield of Righteous: -80% mana cost for Shield of Righteous\n+            if (lvl >= 75 && (spellInfo->SpellFamilyFlags[1] & 0x100000))\n+                pctbonus += 0.8f;\n+\n+            //flat mods\n+            //Cleanse Cost Reduced (id: 27847): -25 mana cost for Cleanse\n+            if (lvl >= 40 && baseId == CLEANSE_1)\n+                flatbonus += 25;\n+            //Reduced Holy Light Cost (id: 37739): -34 mana cost for Holy Light\n+            if (lvl >= 40 && baseId == HOLY_LIGHT_1)\n+                flatbonus += 34;\n+\n+            //cost can be < 0\n+            cost = int32(fcost * (1.0f - pctbonus)) - flatbonus;\n+        }\n+\n+        void ApplyClassSpellCastTimeMods(SpellInfo const* spellInfo, int32& casttime) const override\n+        {\n+            //casttime is in milliseconds\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            int32 timebonus = 0;\n+            //float pctbonus = 0.0f;\n+\n+            //100% mods\n+            //Glyph of Turn Evil: -100% cast time for Turn Evil\n+            if (lvl >= 24 && baseId == TURN_EVIL_1)\n+                timebonus += casttime;\n+            if (baseId == FLASH_OF_LIGHT_1 || baseId == EXORCISM_1)\n+            {\n+                //The Art of War\n+                AuraEffect const* arto = me->GetAuraEffect(THE_ART_OF_WAR_BUFF, 0);\n+                //Infusion of Light\n+                AuraEffect const* infu = me->GetAuraEffect(INFUSION_OF_LIGHT_BUFF, 1);\n+                if (arto && arto->IsAffectedOnSpell(spellInfo))\n+                    timebonus += casttime;\n+                else if (infu && infu->IsAffectedOnSpell(spellInfo))\n+                    timebonus += casttime;\n+            }\n+\n+            //flat mods\n+            //Improved Holy Light (id: 24457): -0.1 sec cast time for Holy Light\n+            if (lvl >= 40 && baseId == HOLY_LIGHT_1)\n+                timebonus += 100;\n+            //Recuced Holy Light Cast Time (id: 37189): -0.5 sec cast time for Holy Light (works only for healers)\n+            //Light's Grace: -0.5 sec cast time for Holy Light\n+            if (baseId == HOLY_LIGHT_1)\n+            {\n+                if (AuraEffect const* enli = me->GetAuraEffect(ENLIGHTENMENT_BUFF, 0))\n+                    if (enli->IsAffectedOnSpell(spellInfo))\n+                        timebonus += 500;\n+                if (AuraEffect const* grac = me->GetAuraEffect(LIGHTS_GRACE_BUFF, 0))\n+                    if (grac->IsAffectedOnSpell(spellInfo))\n+                        timebonus += 500;\n+            }\n+\n+            casttime = std::max<int32>(casttime - timebonus, 0);\n+        }\n+\n+        void ApplyClassSpellNotLoseCastTimeMods(SpellInfo const* spellInfo, int32& delayReduce) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchoolMask schools = spellInfo->GetSchoolMask();\n+            uint8 lvl = me->GetLevel();\n+            int32 reduceBonus = 0;\n+\n+            if (lvl >= 10 && (baseId == HOLY_LIGHT_1 || baseId == FLASH_OF_LIGHT_1))\n+                reduceBonus += 70;\n+\n+            delayReduce += reduceBonus;\n+        }\n+\n+        void ApplyClassSpellCooldownMods(SpellInfo const* spellInfo, uint32& cooldown) const override\n+        {\n+            //cooldown is in milliseconds\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            int32 timebonus = 0;\n+            float pctbonus = 0.0f;\n+\n+            //pct mods\n+\n+            //flat mods\n+            //Improved Judgements: -2 sec cooldown for judgements\n+            //Judgment Cooldown Reduction (60153): -1 sec cooldown for judgements\n+            //Judgement Cooldown Reduction (61776): -1 sec cooldown for judgements\n+            if (spellInfo->GetCategory() == SPELLCATEGORY_JUDGEMENT)\n+            {\n+                if (lvl >= 70)\n+                    timebonus += 4000;\n+                else if (lvl >= 60)\n+                    timebonus += 3000;\n+                else if (lvl >= 15)\n+                    timebonus += 2000;\n+            }\n+            //Sacred Duty: -60 sec cooldown for Divine Shield and Divine Protection\n+            if ((GetSpec() == BOT_SPEC_PALADIN_PROTECTION) && lvl >= 35 && (baseId == DIVINE_SHIELD_1 || baseId == DIVINE_PROTECTION_1))\n+                timebonus += 60000;\n+            //Reduced Righteous Defense Cooldown (37181): -2 sec cooldown for Righteous Defense\n+            if (lvl >= 60 && baseId == RIGHTEOUS_DEFENSE_1)\n+                timebonus += 2000;\n+            //Paladin T9 Tank 2P Bonus part 1: -2 sec cooldown for Hand of Reckoning\n+            if (lvl >= 78 && baseId == HAND_OF_RECKONING_1)\n+                timebonus += 2000;\n+            //Glyph of Turn Evil: +8 sec cooldown for Turn Evil\n+            if (lvl >= 24 && baseId == TURN_EVIL_1)\n+                timebonus -= 8000;\n+\n+            cooldown = std::max<int32>((float(cooldown) * (1.0f - pctbonus)) - timebonus, 0);\n+        }\n+\n+        void ApplyClassSpellCategoryCooldownMods(SpellInfo const* spellInfo, uint32& cooldown) const override\n+        {\n+            //cooldown is in milliseconds\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            int32 timebonus = 0;\n+            float pctbonus = 0.0f;\n+\n+            //pct mods\n+            //Purifying Power part 2: -33% cooldown for Exorcism and Holy Wrath\n+            if ((GetSpec() == BOT_SPEC_PALADIN_HOLY) && lvl >= 35 && (baseId == EXORCISM_1 || baseId == HOLY_WRATH_1))\n+                pctbonus += 0.333f;\n+            //Glyph of Avenging Wrath: -50% cooldown for Hammer of Wrath if Avenging Wrath is active\n+            if (lvl >= 70 && baseId == HAMMER_OF_WRATH_1 &&\n+                me->GetAuraEffect(SPELL_AURA_MOD_HEALING_DONE_PERCENT, SPELLFAMILY_PALADIN, 0x0, 0x2000, 0x0))\n+                pctbonus += 0.5f;\n+\n+            //flat mods\n+            //Improved Judgements: -2 sec cooldown for judgements\n+            //Judgment Cooldown Reduction (60153): -1 sec cooldown for judgements\n+            //Judgement Cooldown Reduction (61776): -1 sec cooldown for judgements\n+            if (spellInfo->GetCategory() == SPELLCATEGORY_JUDGEMENT)\n+            {\n+                if (lvl >= 70)\n+                    timebonus += 4000;\n+                else if (lvl >= 60)\n+                    timebonus += 3000;\n+                else if (lvl >= 15)\n+                    timebonus += 2000;\n+            }\n+            //Guardian's Favor part 1: -120 sec cooldown for Hand of Protection\n+            if (lvl >= 15 && baseId == HAND_OF_PROTECTION_1)\n+                timebonus += 120000;\n+            //Improved Hammer of Justice: -20 sec cooldown for Hammer of Justice\n+            if ((GetSpec() == BOT_SPEC_PALADIN_PROTECTION) && lvl >= 25 && baseId == HAMMER_OF_JUSTICE_1)\n+                timebonus += 20000;\n+            //Judgements of the Just: -10 sec cooldown for Hammer of Justice (tanks only)\n+            if ((GetSpec() == BOT_SPEC_PALADIN_PROTECTION) && lvl >= 55 && baseId == HAMMER_OF_JUSTICE_1)\n+                timebonus += 10000;\n+            //Glyph of Holy Shock: -1 sec cooldown for Holy Shock\n+            if (baseId == HOLY_SHOCK_1)\n+                timebonus += 1000;\n+            //Glyph of Consecration: +2 sec cooldown for Consecration\n+            if (lvl >= 20 && baseId == CONSECRATION_1)\n+                timebonus -= 2000;\n+            //Glyph of Holy Wrath: -15 sec cooldown for Holy Wrath\n+            if (lvl >= 50 && baseId == HOLY_WRATH_1)\n+                timebonus += 15000;\n+            //Improved Lay on Hands (part 2): -4 min cooldown for Lay on Hands\n+            if (lvl >= 20 && baseId == LAY_ON_HANDS_1)\n+                timebonus += 240000;\n+            //Glyph of Lay on Hands: -5 min cooldown for Lay on Hands (only healers)\n+            if (lvl >= 15 && HasRole(BOT_ROLE_HEAL) && baseId == LAY_ON_HANDS_1)\n+                timebonus += 300000;\n+            //Lay Hands (id: 28774): -4 min cooldown for Lay on Hands (only healers)\n+            if (lvl >= 60 && HasRole(BOT_ROLE_HEAL) && baseId == LAY_ON_HANDS_1)\n+                timebonus += 240000;\n+\n+            cooldown = std::max<int32>((float(cooldown) * (1.0f - pctbonus)) - timebonus, 0);\n+        }\n+\n+        void ApplyClassSpellGlobalCooldownMods(SpellInfo const* /*spellInfo*/, float& cooldown) const override\n+        {\n+            //cooldown is in milliseconds\n+            //uint32 spellId = spellInfo->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            //uint8 lvl = me->GetLevel();\n+            float timebonus = 0.0f;\n+            float pctbonus = 0.0f;\n+\n+            ////Unrelenting Assault (part 1, special): -0.5 sec global cooldown for Overpower and Revenge (not for tanks)\n+            //if (lvl >= 50 && !IsTank() && (spellId == GetSpell(OVERPOWER_1) || spellId == GetSpell(REVENGE_1)))\n+            //    timebonus += 500.f;\n+\n+            cooldown = (cooldown * (1.0f - pctbonus)) - timebonus;\n+        }\n+\n+        void ApplyClassSpellRadiusMods(SpellInfo const* spellInfo, float& radius) const override\n+        {\n+            //uint32 spellId = spellInfo->Id;\n+            //uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            float flatbonus = 0.0f;\n+            float pctbonus = 0.0f;\n+\n+            //pct mods\n+            ////Holy Reach\n+            //if (lvl >= 25 && ((spellInfo->SpellFamilyFlags[0] & 0x18400200) || (spellInfo->SpellFamilyFlags[2] & 0x4)))\n+            //    pctbonus += 0.2f;\n+\n+            //flat mods\n+            //Increased Aura Radii (23565)\n+            if (lvl >= 40 && (spellInfo->SpellFamilyFlags[0] & 0x4020048))\n+                flatbonus += 10.f;\n+\n+            radius = radius * (1.0f + pctbonus) + flatbonus;\n+        }\n+\n+        void ApplyClassSpellRangeMods(SpellInfo const* spellInfo, float& maxrange) const override\n+        {\n+            //uint32 spellId = spellInfo->Id;\n+            //uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            float flatbonus = 0.0f;\n+            float pctbonus = 0.0f;\n+\n+            //pct mods\n+            //Booming Voice\n+            //if (lvl >= 10 && ((spellInfo->SpellFamilyFlags[0] & 0x30000) || (spellInfo->SpellFamilyFlags[1] & 0x80)))\n+            //    pctbonus += 1.0f;\n+\n+            //flat mods\n+            //Enlightened Judgements: +30 yd range for Judgement of Light and Judgement of Wisdom (healers)\n+            if ((GetSpec() == BOT_SPEC_PALADIN_HOLY) && lvl >= 55 && (spellInfo->SpellFamilyFlags[0] & 0x800000))\n+                flatbonus += 30.f;\n+\n+            maxrange = maxrange * (1.0f + pctbonus) + flatbonus;\n+        }\n+\n+        void ApplyClassSpellMaxTargetsMods(SpellInfo const* spellInfo, uint32& targets) const override\n+        {\n+            uint32 bonusTargets = 0;\n+\n+            //Glyph of Hammer of the Righteous: +1 target\n+            if (spellInfo->SpellFamilyFlags[1] & 0x40000)\n+                bonusTargets += 1;\n+\n+            targets = targets + bonusTargets;\n+        }\n+\n+        void ApplyClassEffectMods(SpellInfo const* spellInfo, uint8 effIndex, float& value) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+            float pctbonus = 1.0f;\n+\n+            //Improved Devotion Aura: 50% increased effect\n+            if (baseId == DEVOTION_AURA_1 && effIndex == EFFECT_0 && GetSpec() == BOT_SPEC_PALADIN_PROTECTION && lvl >= 25)\n+                pctbonus *= 1.5f;\n+            //Improved Devotion Aura: 6% bonus healing\n+            if (baseId == IMPROVED_DEVOTION_AURA_SPELL && effIndex == EFFECT_1 && GetSpec() == BOT_SPEC_PALADIN_PROTECTION && lvl >= 25)\n+                value += 6.f;\n+\n+            value = value * pctbonus;\n+        }\n+\n+        void OnClassSpellGo(SpellInfo const* spellInfo) override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+\n+            if (baseId == HOLY_LIGHT_1 || baseId == FLASH_OF_LIGHT_1 || baseId == HOLY_SHOCK_1)\n+            {\n+                if (AuraEffect const* favo = me->GetAuraEffect(DIVINE_FAVOR_1, 0))\n+                    if (favo->IsAffectedOnSpell(spellInfo))\n+                        me->RemoveAurasDueToSpell(DIVINE_FAVOR_1);\n+            }\n+\n+            if (baseId == HOLY_LIGHT_1)\n+            {\n+                if (AuraEffect const* enli = me->GetAuraEffect(ENLIGHTENMENT_BUFF, 0))\n+                    if (enli->IsAffectedOnSpell(spellInfo))\n+                        me->RemoveAurasDueToSpell(ENLIGHTENMENT_BUFF);\n+                if (AuraEffect const* grac = me->GetAuraEffect(LIGHTS_GRACE_BUFF, 0))\n+                    if (grac->IsAffectedOnSpell(spellInfo))\n+                        me->RemoveAurasDueToSpell(LIGHTS_GRACE_BUFF);\n+                if (AuraEffect const* infu = me->GetAuraEffect(INFUSION_OF_LIGHT_BUFF, 0))\n+                    if (infu->IsAffectedOnSpell(spellInfo))\n+                        me->RemoveAurasDueToSpell(INFUSION_OF_LIGHT_BUFF);\n+            }\n+\n+            if (baseId == EXORCISM_1 || baseId == FLASH_OF_LIGHT_1)\n+            {\n+                //Infusion of Light takes priority since AoW affects Exorcism too\n+                AuraEffect const* infu = me->GetAuraEffect(INFUSION_OF_LIGHT_BUFF, 1);\n+                //The Art of War\n+                AuraEffect const* arto = me->GetAuraEffect(THE_ART_OF_WAR_BUFF, 0);\n+                if (arto && arto->IsAffectedOnSpell(spellInfo))\n+                    me->RemoveAurasDueToSpell(THE_ART_OF_WAR_BUFF);\n+                else if (infu && infu->IsAffectedOnSpell(spellInfo))\n+                    me->RemoveAurasDueToSpell(INFUSION_OF_LIGHT_BUFF);\n+            }\n+\n+            if (baseId == DIVINE_SACRIFICE_1)\n+            {\n+                _sacDamage = 0;\n+            }\n+        }\n+\n+        void SpellHitTarget(Unit* wtarget, SpellInfo const* spell) override\n+        {\n+            Unit* target = wtarget->ToUnit();\n+            if (!target)\n+                return;\n+\n+            uint32 spellId = spell->Id;\n+            uint32 baseId = spell->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+\n+            //Glyph of Beacon of Light: 30 sec increased duration\n+            if (baseId == BEACON_OF_LIGHT_1)\n+            {\n+                Aura* beac = target->GetAura(spellId, me->GetGUID());\n+                if (beac)\n+                {\n+                    uint32 dur = beac->GetDuration() + 30000;\n+                    beac->SetDuration(dur);\n+                    beac->SetMaxDuration(dur);\n+                }\n+            }\n+            //Judgements of the Just melee attack speed reduction part 1\n+            if ((GetSpec() == BOT_SPEC_PALADIN_PROTECTION) && lvl >= 55 && spell->GetCategory() == SPELLCATEGORY_JUDGEMENT)\n+            {\n+                me->CastSpell(target, JUDGEMENTS_OF_THE_JUST_AURA, true);\n+            }\n+            //Judgements of the Just melee attack speed reduction part 2\n+            if ((GetSpec() == BOT_SPEC_PALADIN_PROTECTION) && spellId == JUDGEMENTS_OF_THE_JUST_AURA)\n+            {\n+                AuraEffect* slow = target->GetAuraEffect(JUDGEMENTS_OF_THE_JUST_AURA, 1, me->GetGUID());\n+                if (slow)\n+                    slow->ChangeAmount(slow->GetAmount() - 20);\n+            }\n+\n+            if ((GetSpec() == BOT_SPEC_PALADIN_PROTECTION) && spellId == SEAL_OF_JUSTICE_STUN_AURA)\n+            {\n+                if (lvl >= 55)\n+                {\n+                    //Judgements of the Just: 1 sec increased duration\n+                    Aura* stun = target->GetAura(spellId, me->GetGUID());\n+                    if (stun)\n+                    {\n+                        uint32 dur = stun->GetDuration() + 1000;\n+                        stun->SetDuration(dur);\n+                        stun->SetMaxDuration(dur);\n+                    }\n+                }\n+            }\n+            if (baseId == CONSECRATION_1)\n+            {\n+                if (lvl >= 30)\n+                {\n+                    //Glyph of Consecration: 2 sec increased duration\n+                    Aura* cons = target->GetAura(spellId, me->GetGUID());\n+                    if (cons)\n+                    {\n+                        uint32 dur = cons->GetDuration() + 2000;\n+                        cons->SetDuration(dur);\n+                        cons->SetMaxDuration(dur);\n+                    }\n+                }\n+            }\n+            if ((GetSpec() == BOT_SPEC_PALADIN_RETRIBUTION) && baseId == RETRIBUTION_AURA_1)\n+            {\n+                if (lvl >= 30)\n+                {\n+                    //Sanctified Retribution: 50% increased effect\n+                    AuraEffect* eff = target->GetAuraEffect(spellId, EFFECT_0, me->GetGUID());\n+                    if (eff)\n+                        eff->ChangeAmount(eff->GetAmount() * 3 / 2);\n+                }\n+            }\n+            if ((GetSpec() == BOT_SPEC_PALADIN_HOLY) && baseId == CONCENTRATION_AURA_1)\n+            {\n+                if (lvl >= 25)\n+                {\n+                    //Improved Concentration Aura: 15% increased effect (flat)\n+                    AuraEffect* eff = target->GetAuraEffect(spellId, EFFECT_0, me->GetGUID());\n+                    if (eff)\n+                        eff->ChangeAmount(eff->GetAmount() + 15); //base = 35, bonus = 15\n+                }\n+            }\n+            if (baseId == FLASH_OF_LIGHT_HEAL_PERIODIC)\n+            {\n+                if ((GetSpec() == BOT_SPEC_PALADIN_HOLY) && lvl >= 78 && !HasRole(BOT_ROLE_TANK | BOT_ROLE_DPS))\n+                {\n+                    //Paldin T9 Holy 4P Bonus: 100% increased healing from Infusion of Light (pure healers only)\n+                    AuraEffect* eff = target->GetAuraEffect(spellId, EFFECT_0, me->GetGUID());\n+                    if (eff)\n+                        eff->ChangeAmount(eff->GetAmount() * 2);\n+                }\n+            }\n+            if (baseId == BLESSING_OF_WISDOM_1)\n+            {\n+                if (lvl >= 25)\n+                {\n+                    //Improved Blessing of Wisdom: 20% increased effect\n+                    AuraEffect* eff = target->GetAuraEffect(spellId, EFFECT_0, me->GetGUID());\n+                    if (eff)\n+                        eff->ChangeAmount(eff->GetAmount() * 6 / 5);\n+                }\n+            }\n+            if (baseId == BLESSING_OF_MIGHT_1)\n+            {\n+                if (lvl >= 15)\n+                {\n+                    //Improved Blessing of Might: 25% increased effect\n+                    if (Aura* migh = target->GetAura(spellId, me->GetGUID()))\n+                        for (auto i : NPCBots::index_array<uint8, EFFECT_2>) // 2 effects\n+                            if (AuraEffect* eff = migh->GetEffect(i))\n+                                eff->ChangeAmount((eff->GetAmount() * 125) / 100);\n+                }\n+            }\n+            if (baseId == HAND_OF_FREEDOM_1)\n+            {\n+                //Guardian's Favor part 2 (handled separately)\n+                if (Aura* hof = target->GetAura(spellId, me->GetGUID()))\n+                {\n+                    uint32 dur = hof->GetDuration() + 4000;\n+                    hof->SetDuration(dur);\n+                    hof->SetMaxDuration(dur);\n+                }\n+            }\n+            if ((GetSpec() == BOT_SPEC_PALADIN_HOLY) && baseId == HAND_OF_SALVATION_1 && !IsTank(target))\n+            {\n+                //Blessed Hands (part 2)\n+                if (AuraEffect* hos = target->GetAuraEffect(spellId, 0, me->GetGUID()))\n+                {\n+                    hos->ChangeAmount(hos->GetAmount() * 2);\n+                }\n+            }\n+            if ((GetSpec() == BOT_SPEC_PALADIN_HOLY) && baseId == HAND_OF_SACRIFICE_1)\n+            {\n+                //Blessed Hands (part 3)\n+                if (AuraEffect* hos = target->GetAuraEffect(spellId, 0, me->GetGUID()))\n+                {\n+                    hos->ChangeAmount(hos->GetAmount() + 10);\n+                }\n+            }\n+            if (baseId == BLESSING_OF_KINGS_1 || baseId == BLESSING_OF_MIGHT_1 ||\n+                baseId == BLESSING_OF_WISDOM_1 || baseId == BLESSING_OF_SANCTUARY_1)\n+            {\n+                //Blessings duration 1h\n+                if (Aura* bless = target->GetAura(spellId, me->GetGUID()))\n+                {\n+                    uint32 dur = HOUR * IN_MILLISECONDS;\n+                    bless->SetDuration(dur);\n+                    bless->SetMaxDuration(dur);\n+                }\n+            }\n+            if (baseId == SACRED_SHIELD_AURA_TRIGGERED || baseId == SACRED_SHIELD_1)\n+            {\n+                //Divine Guardian (part 2): 20% increased absorb, +100% duration\n+                Aura* shi = target->GetAura(spellId, me->GetGUID());\n+                if (shi)\n+                {\n+                    uint32 dur = shi->GetDuration() * 2;\n+                    shi->SetDuration(dur);\n+                    shi->SetMaxDuration(dur);\n+                    if (baseId == SACRED_SHIELD_AURA_TRIGGERED)\n+                    {\n+                        if (AuraEffect* eff = shi->GetEffect(EFFECT_0))\n+                            eff->ChangeAmount(eff->GetAmount() * 6 / 5);\n+                    }\n+                }\n+            }\n+\n+            OnSpellHitTarget(target, spell);\n+        }\n+\n+        void SpellHit(Unit* wcaster, SpellInfo const* spell) override\n+        {\n+            Unit* caster = wcaster->ToUnit();\n+            if (!caster)\n+                return;\n+\n+            uint32 baseId = spell->GetFirstRankSpell()->Id;\n+\n+            //Glyph of Seal of Vengeance\n+            if (baseId == SEAL_OF_VENGEANCE_1 || baseId == SEAL_OF_CORRUPTION_1)\n+            {\n+                AuraEffect* sea = me->GetAuraEffect(spell->Id, 1);\n+                if (sea)\n+                    sea->ChangeAmount(sea->GetAmount() + 10);\n+            }\n+\n+            //Aura Helper\n+            if (caster == me)\n+            {\n+                switch (baseId)\n+                {\n+                    case DEVOTION_AURA_1:\n+                    case CONCENTRATION_AURA_1:\n+                    case FIRE_RESISTANCE_AURA_1:\n+                    case FROST_RESISTANCE_AURA_1:\n+                    case SHADOW_RESISTANCE_AURA_1:\n+                    case RETRIBUTION_AURA_1:\n+                    case CRUSADER_AURA_1:\n+                        SetAIMiscValue(BOTAI_MISC_AURA_TYPE, baseId);\n+                        break;\n+                    default:\n+                        break;\n+                }\n+            }\n+\n+            //immunity markers\n+            if (baseId == AVENGING_WRATH_MARKER_SPELL)\n+                avDelayTimer = 30000;\n+            if (baseId == IMMUNITY_SHIELD_MARKER_SPELL)\n+                shieldDelayTimer = 30000;\n+\n+            OnSpellHit(caster, spell);\n+        }\n+\n+        void DamageDealt(Unit* victim, uint32& damage, DamageEffectType damageType, SpellSchoolMask damageSchoolMask) override\n+        {\n+            bot_ai::DamageDealt(victim, damage, damageType, damageSchoolMask);\n+        }\n+\n+        void OnBotDamageTaken(Unit* /*attacker*/, uint32 damage, CleanDamage const* /*cleanDamage*/, DamageEffectType /*damagetype*/, SpellInfo const* spellInfo) override\n+        {\n+            // Divine Sacrifice helper - calculate remaining damage amount and find if we can be one-shot'ed\n+            if (damage && _sacDamage < int32(me->GetMaxHealth() / 4))\n+            {\n+                if (spellInfo && spellInfo->Id == DIVINE_SACRIFICE_1)\n+                    _sacDamage -= int32(damage);\n+                else\n+                    _sacDamage += int32(damage);\n+\n+                if (me->GetHealth() - _sacDamage < me->GetMaxHealth() / 5)\n+                {\n+                    if (me->GetAuraEffect(SPELL_AURA_SPLIT_DAMAGE_PCT, SPELLFAMILY_PALADIN, 0x0, 0x0, 0x4, me->GetGUID()))\n+                    {\n+                        _sacDamage = me->GetMaxHealth();\n+                        me->RemoveAurasDueToSpell(DIVINE_SACRIFICE_1, me->GetGUID());\n+                    }\n+                }\n+            }\n+        }\n+\n+        void DamageTaken(Unit* u, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellSchoolMask /*schoolMask*/) override\n+        {\n+            if (!u)\n+                return;\n+            if (!u->IsInCombat() && !me->IsInCombat())\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        //healer may be nullptr\n+        void HealReceived(Unit* healer, uint32& heal) override\n+        {\n+            //Spiritual Attunement (double the effect on bots)\n+            if (heal && (GetSpec() == BOT_SPEC_PALADIN_PROTECTION) && me->GetLevel() >= 40 && healer != me && GetLostHP(me))\n+            {\n+                if (int32 basepoints = int32(CalculatePct(std::min<int32>(heal, GetLostHP(me)), 20)))\n+                {\n+                    //CastSpellExtraArgs args(true);\n+                    //args.AddSpellBP0(basepoints);\n+                    //me->CastSpell(me, SPIRITUAL_ATTUNEMENT_ENERGIZE, args);\n+                    me->CastCustomSpell(me, SPIRITUAL_ATTUNEMENT_ENERGIZE, &basepoints, nullptr, nullptr, true);\n+                }\n+            }\n+\n+            //bot_ai::HealReceived(healer, heal);\n+        }\n+\n+        void OwnerAttackedBy(Unit* u) override\n+        {\n+            if (!u)\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        float GetSpellAttackRange(bool longRange) const override\n+        {\n+            return longRange ? CalcSpellMaxRange(GetSpell(EXORCISM_1) ? EXORCISM_1 : JUDGEMENT_OF_LIGHT_1) : 10.f;\n+        }\n+\n+        uint32 GetAIMiscValue(uint32 data) const override\n+        {\n+            switch (data)\n+            {\n+                case BOTAI_MISC_AURA_TYPE:\n+                    return _myaura;\n+                default:\n+                    return 0;\n+            }\n+        }\n+\n+        void SetAIMiscValue(uint32 data, uint32 value) override\n+        {\n+            switch (data)\n+            {\n+                case BOTAI_MISC_AURA_TYPE:\n+                    _myaura = value;\n+                    break;\n+                default:\n+                    break;\n+            }\n+\n+            bot_ai::SetAIMiscValue(data, value);\n+        }\n+\n+        void Reset() override\n+        {\n+            checkAuraTimer = 0;\n+            checkSealTimer = 0;\n+            checkShieldTimer = 0;\n+            checkBeaconTimer = 0;\n+            avDelayTimer = 0;\n+            shieldDelayTimer = 0;\n+            _sacDamage = 0;\n+\n+            CLEANSE = 0;\n+\n+            DefaultInit();\n+        }\n+\n+        void ReduceCD(uint32 diff) override\n+        {\n+            if (checkAuraTimer > diff)              checkAuraTimer -= diff;\n+            if (checkSealTimer > diff)              checkSealTimer -= diff;\n+            if (checkShieldTimer > diff)            checkShieldTimer -= diff;\n+            if (checkBeaconTimer > diff)            checkBeaconTimer -= diff;\n+            if (avDelayTimer > diff)                avDelayTimer -= diff;\n+            if (shieldDelayTimer > diff)            shieldDelayTimer -= diff;\n+        }\n+\n+        void InitPowers() override\n+        {\n+            me->SetPowerType(POWER_MANA);\n+        }\n+\n+        void InitSpells() override\n+        {\n+            uint8 lvl = me->GetLevel();\n+            bool isHoly = GetSpec() == BOT_SPEC_PALADIN_HOLY;\n+            bool isProt = GetSpec() == BOT_SPEC_PALADIN_PROTECTION;\n+            bool isRetr = GetSpec() == BOT_SPEC_PALADIN_RETRIBUTION;\n+\n+            InitSpellMap(FLASH_OF_LIGHT_1);\n+            InitSpellMap(HOLY_LIGHT_1);\n+            InitSpellMap(LAY_ON_HANDS_1);\n+            InitSpellMap(SACRED_SHIELD_1);\n+            InitSpellMap(REDEMPTION_1);\n+            InitSpellMap(HAMMER_OF_JUSTICE_1);\n+            InitSpellMap(TURN_EVIL_1);\n+            InitSpellMap(HOLY_WRATH_1);\n+            InitSpellMap(EXORCISM_1);\n+            InitSpellMap(JUDGEMENT_OF_LIGHT_1);\n+            InitSpellMap(JUDGEMENT_OF_WISDOM_1);\n+            InitSpellMap(JUDGEMENT_OF_JUSTICE_1);\n+            InitSpellMap(CONSECRATION_1);\n+            InitSpellMap(HAMMER_OF_WRATH_1);\n+            InitSpellMap(AVENGING_WRATH_1);\n+            InitSpellMap(RIGHTEOUS_FURY_1);\n+            InitSpellMap(SHIELD_OF_RIGHTEOUSNESS_1);\n+            InitSpellMap(BLESSING_OF_MIGHT_1);\n+            InitSpellMap(BLESSING_OF_WISDOM_1);\n+            InitSpellMap(BLESSING_OF_KINGS_1);\n+            InitSpellMap(DEVOTION_AURA_1);\n+            InitSpellMap(CONCENTRATION_AURA_1);\n+            InitSpellMap(FIRE_RESISTANCE_AURA_1);\n+            InitSpellMap(FROST_RESISTANCE_AURA_1);\n+            InitSpellMap(SHADOW_RESISTANCE_AURA_1);\n+            InitSpellMap(RETRIBUTION_AURA_1);\n+            InitSpellMap(CRUSADER_AURA_1);\n+            InitSpellMap(DIVINE_PLEA_1);\n+            InitSpellMap(HAND_OF_PROTECTION_1);\n+            InitSpellMap(HAND_OF_FREEDOM_1);\n+            InitSpellMap(HAND_OF_SALVATION_1);\n+            InitSpellMap(HAND_OF_SACRIFICE_1);\n+            InitSpellMap(HAND_OF_RECKONING_1);\n+            InitSpellMap(RIGHTEOUS_DEFENSE_1);\n+            //InitSpellMap(PURIFY_1);\n+            //InitSpellMap(CLEANSE_1);\n+            InitSpellMap(SEAL_OF_LIGHT_1);\n+            InitSpellMap(SEAL_OF_RIGHTEOUSNESS_1);\n+            InitSpellMap(SEAL_OF_WISDOM_1);\n+            InitSpellMap(SEAL_OF_JUSTICE_1);\n+            InitSpellMap((me->GetRaceMask() & sRaceMgr->GetAllianceRaceMask()) ? SEAL_OF_VENGEANCE_1 : SEAL_OF_CORRUPTION_1);\n+            InitSpellMap(DIVINE_INTERVENTION_1);\n+            InitSpellMap(DIVINE_PROTECTION_1);\n+            InitSpellMap(DIVINE_SHIELD_1);\n+\n+  /*Talent*/lvl >= (isHoly ? 20 : 70) ? InitSpellMap(AURA_MASTERY_1) : RemoveSpell(AURA_MASTERY_1);\n+  /*Talent*/lvl >= 30 && isHoly ? InitSpellMap(DIVINE_FAVOR_1) : RemoveSpell(DIVINE_FAVOR_1);\n+  /*Talent*/lvl >= 40 && isHoly ? InitSpellMap(HOLY_SHOCK_1) : RemoveSpell(HOLY_SHOCK_1);\n+  /*Talent*/lvl >= 50 && isHoly ? InitSpellMap(DIVINE_ILLUMINATION_1) : RemoveSpell(DIVINE_ILLUMINATION_1);\n+  /*Talent*/lvl >= 60 && isHoly ? InitSpellMap(BEACON_OF_LIGHT_1) : RemoveSpell(BEACON_OF_LIGHT_1);\n+\n+  /*Talent*/lvl >= (isProt ? 20 : isHoly ? 70 : 99) ? InitSpellMap(DIVINE_SACRIFICE_1) : RemoveSpell(DIVINE_SACRIFICE_1);\n+  /*Talent*/lvl >= 30 && isProt ? InitSpellMap(BLESSING_OF_SANCTUARY_1) : RemoveSpell(BLESSING_OF_SANCTUARY_1);\n+  /*Talent*/lvl >= 40 && isProt ? InitSpellMap(HOLY_SHIELD_1) : RemoveSpell(HOLY_SHIELD_1);\n+  /*Talent*/lvl >= 50 && isProt ? InitSpellMap(AVENGERS_SHIELD_1) : RemoveSpell(AVENGERS_SHIELD_1);\n+  /*Talent*/lvl >= 60 && isProt ? InitSpellMap(HAMMER_OF_THE_RIGHTEOUS_1) : RemoveSpell(HAMMER_OF_THE_RIGHTEOUS_1);\n+\n+  /*Talent*/lvl >= 20 && isRetr ? InitSpellMap(SEAL_OF_COMMAND_1) : RemoveSpell(SEAL_OF_COMMAND_1);\n+  /*Talent*/lvl >= 40 && isRetr ? InitSpellMap(REPENTANCE_1) : RemoveSpell(REPENTANCE_1);\n+  /*Talent*/lvl >= 50 && isRetr ? InitSpellMap(CRUSADER_STRIKE_1) : RemoveSpell(CRUSADER_STRIKE_1);\n+  /*Talent*/lvl >= 60 && isRetr ? InitSpellMap(DIVINE_STORM_1) : RemoveSpell(DIVINE_STORM_1);\n+\n+            CLEANSE = InitSpell(me, CLEANSE_1) ? CLEANSE_1 : PURIFY_1;\n+            RemoveSpell(CLEANSE_1);\n+            RemoveSpell(PURIFY_1);\n+            InitSpellMap(CLEANSE);\n+        }\n+\n+        void ApplyClassPassives() const override\n+        {\n+            uint8 level = master->GetLevel();\n+            bool isHoly = GetSpec() == BOT_SPEC_PALADIN_HOLY;\n+            bool isProt = GetSpec() == BOT_SPEC_PALADIN_PROTECTION;\n+            bool isRetr = GetSpec() == BOT_SPEC_PALADIN_RETRIBUTION;\n+\n+            RefreshAura(ILLUMINATION, isHoly && level >= 20 ? 1 : 0);\n+            RefreshAura(IMPROVED_LAY_ON_HANDS, isHoly && level >= 20 ? 1 : 0);\n+            RefreshAura(IMPROVED_CONCENTRATION_AURA, isHoly && level >= 25 ? 1 : 0);\n+            RefreshAura(LIGHTS_GRACE, isHoly && level >= 40 ? 1 : 0);\n+            RefreshAura(SACRED_CLEANSING, isHoly && level >= 45 ? 1 : 0);\n+            RefreshAura(JUDGEMENTS_OF_THE_PURE, isHoly && level >= 50 ? 1 : 0);\n+            RefreshAura(INFUSION_OF_LIGHT, isHoly && level >= 55 ? 1 : 0);\n+            RefreshAura(RECUCED_HOLY_LIGHT_CAST_TIME, isHoly && level >= 60 ? 1 : 0); //\n+\n+            RefreshAura(IMPROVED_RIGHTEOUS_FURY, isProt && level >= 20 ? 1 : 0);\n+            RefreshAura(IMPROVED_DEVOTION_AURA, isProt && level >= 25 ? 1 : 0);\n+            RefreshAura(DIVINE_GUARDIAN, isProt && level >= 25 ? 1 : 0);\n+            RefreshAura(RECKONING5, isProt && level >= 50 ? 1 : 0);\n+            RefreshAura(RECKONING4, isProt && level >= 45 && level < 50 ? 1 : 0);\n+            RefreshAura(RECKONING3, isProt && level >= 40 && level < 45 ? 1 : 0);\n+            RefreshAura(RECKONING2, isProt && level >= 35 && level < 40 ? 1 : 0);\n+            RefreshAura(RECKONING1, isProt && level >= 30 && level < 35 ? 1 : 0);\n+            RefreshAura(ONE_HANDED_WEAPON_SPECIALIZATION, isProt && level >= 35 ? 1 : 0);\n+            RefreshAura(ARDENT_DEFENDER, isProt && level >= 40 ? 1 : 0);\n+            //RefreshAura(COMBAT_EXPERTISE, isProt && level >= 45 ? 1 : 0);\n+            RefreshAura(REDOUBT3, isProt && level >= 55 ? 1 : 0);\n+            RefreshAura(REDOUBT2, isProt && level >= 50 && level < 55 ? 1 : 0);\n+            RefreshAura(REDOUBT1, isProt && level >= 45 && level < 50 ? 1 : 0);\n+            RefreshAura(GUARDED_BY_THE_LIGHT, isProt && level >= 50 ? 1 : 0);\n+            RefreshAura(TOUCHED_BY_THE_LIGHT, isProt && level >= 50 ? 1 : 0);\n+            RefreshAura(SHIELD_OF_THE_TEMPLAR, isProt && level >= 55 ? 1 : 0);\n+            //RefreshAura(JUDGEMENTS_OF_THE_JUST, isProt && level >= 55 ? 1 : 0);\n+\n+            RefreshAura(HEART_OF_THE_CRUSADER, isRetr && level >= 15 ? 1 : 0);\n+            RefreshAura(PURSUIT_OF_JUSTICE, isRetr && level >= 20 ? 1 : 0);\n+            RefreshAura(FANATICISM, isRetr && level >= 20 ? 1 : 0);\n+            RefreshAura(VINDICATION2, isRetr && level >= 25 ? 1 : 0);\n+            RefreshAura(VINDICATION1, isRetr && level >= 20 && level < 25 ? 1 : 0);\n+            RefreshAura(CRUSADE, isRetr && level >= 25 ? 1 : 0);\n+            RefreshAura(TWO_HANDED_WEAPON_SPECIALIZATION, isRetr && level >= 30 ? 1 : 0);\n+            RefreshAura(SANCTIFIED_RETRIBUTION, !IAmFree() && isRetr && level >= 30 ? 1 : 0);\n+            RefreshAura(VENGEANCE3, isRetr && level >= 40 ? 1 : 0);\n+            RefreshAura(VENGEANCE2, isRetr && level >= 37 && level < 40 ? 1 : 0);\n+            RefreshAura(VENGEANCE1, isRetr && level >= 35 && level < 37 ? 1 : 0);\n+            RefreshAura(DIVINE_PURPOSE, isRetr && level >= 35 ? 1 : 0);\n+            RefreshAura(JUDGEMENTS_OF_THE_WISE, isRetr && level >= 40 ? 1 : 0);\n+            RefreshAura(ART_OF_WAR, isRetr && level >= 40 ? 1 : 0);\n+            RefreshAura(SWIFT_RETRIBUTION, !IAmFree() && isRetr && level >= 50 ? 1 : 0);\n+            RefreshAura(SHEATH_OF_LIGHT3, isRetr && level >= 60 ? 1 : 0);\n+            RefreshAura(SHEATH_OF_LIGHT2, isRetr && level >= 55 && level < 60 ? 1 : 0);\n+            RefreshAura(SHEATH_OF_LIGHT1, isRetr && level >= 50 && level < 55 ? 1 : 0);\n+            RefreshAura(RIGHTEOUS_VENGEANCE3, isRetr && level >= 60 ? 1 : 0);\n+            RefreshAura(RIGHTEOUS_VENGEANCE2, isRetr && level >= 57 && level < 60 ? 1 : 0);\n+            RefreshAura(RIGHTEOUS_VENGEANCE1, isRetr && level >= 55 && level < 57 ? 1 : 0);\n+\n+            RefreshAura(GLYPH_HOLY_LIGHT, level >= 15 ? 1 : 0);\n+            RefreshAura(GLYPH_SALVATION, level >= 26 ? 1 : 0);\n+\n+            RefreshAura(JUDGEMENT_ANTI_PARRY_DODGE_PASSIVE);\n+\n+            //RefreshAura(CLEANSE_HEAL_PASSIVE, level >= 58 ? 1 : 0);\n+        }\n+\n+        bool CanUseManually(uint32 basespell) const override\n+        {\n+            switch (basespell)\n+            {\n+                case FLASH_OF_LIGHT_1:\n+                case HOLY_LIGHT_1:\n+                case LAY_ON_HANDS_1:\n+                case HAND_OF_FREEDOM_1:\n+                case SACRED_SHIELD_1:\n+                case CLEANSE_1:\n+                case HAND_OF_PROTECTION_1:\n+                case HAND_OF_SALVATION_1:\n+                case HAND_OF_SACRIFICE_1:\n+                //case SEAL_OF_COMMAND_1:\n+                //case SEAL_OF_LIGHT_1:\n+                //case SEAL_OF_RIGHTEOUSNESS_1:\n+                //case SEAL_OF_WISDOM_1:\n+                //case SEAL_OF_JUSTICE_1:\n+                case DIVINE_PLEA_1:\n+                case AVENGING_WRATH_1:\n+                case BLESSING_OF_MIGHT_1:\n+                case BLESSING_OF_WISDOM_1:\n+                case BLESSING_OF_KINGS_1:\n+                case BLESSING_OF_SANCTUARY_1:\n+                    return true;\n+                case HOLY_SHOCK_1:\n+                    return HasRole(BOT_ROLE_HEAL);\n+                case DEVOTION_AURA_1:\n+                case CONCENTRATION_AURA_1:\n+                case FIRE_RESISTANCE_AURA_1:\n+                case FROST_RESISTANCE_AURA_1:\n+                case SHADOW_RESISTANCE_AURA_1:\n+                case RETRIBUTION_AURA_1:\n+                case CRUSADER_AURA_1:\n+                    return _myaura != basespell;\n+                case PURIFY_1:\n+                    return !GetSpell(CLEANSE_1);\n+                default:\n+                    return false;\n+            }\n+        }\n+\n+        bool HasAbilitiesSpecifics() const override { return true; }\n+        void FillAbilitiesSpecifics(Player const* player, std::list<std::string> &specList) override\n+        {\n+            uint32 textId;\n+            switch (_myaura)\n+            {\n+                case DEVOTION_AURA_1:          textId = BOT_TEXT_DEVOTION;         break;\n+                case CONCENTRATION_AURA_1:     textId = BOT_TEXT_CONCENTRATION;    break;\n+                case FIRE_RESISTANCE_AURA_1:   textId = BOT_TEXT_FIRERESISTANCE;   break;\n+                case FROST_RESISTANCE_AURA_1:  textId = BOT_TEXT_FROSTRESISTANCE;  break;\n+                case SHADOW_RESISTANCE_AURA_1: textId = BOT_TEXT_SHADOWRESISTANCE; break;\n+                case RETRIBUTION_AURA_1:       textId = BOT_TEXT_RETRIBUTION;      break;\n+                case CRUSADER_AURA_1:          textId = BOT_TEXT_CRUSADER;         break;\n+                default:                       textId = BOT_TEXT_NOAURA;           break;\n+            }\n+            specList.push_back(LocalizedNpcText(player, BOT_TEXT_AURA) + \": \" + LocalizedNpcText(player, textId));\n+        }\n+\n+        std::vector<uint32> const* GetDamagingSpellsList() const override\n+        {\n+            return &Paladin_spells_damage;\n+        }\n+        std::vector<uint32> const* GetCCSpellsList() const override\n+        {\n+            return &Paladin_spells_cc;\n+        }\n+        std::vector<uint32> const* GetHealingSpellsList() const override\n+        {\n+            return &Paladin_spells_heal;\n+        }\n+        std::vector<uint32> const* GetSupportSpellsList() const override\n+        {\n+            return &Paladin_spells_support;\n+        }\n+\n+        void InitHeals() override\n+        {\n+            SpellInfo const* spellInfo;\n+            if (InitSpell(me, HOLY_SHOCK_HEAL_1))\n+            {\n+                spellInfo = sSpellMgr->GetSpellInfo(InitSpell(me, HOLY_SHOCK_HEAL_1));\n+                _heals[HOLY_SHOCK_1] = me->SpellHealingBonusDone(me, spellInfo, spellInfo->Effects[0].CalcValue(me), HEAL, 0);\n+            }\n+            else\n+                _heals[HOLY_SHOCK_1] = 0;\n+\n+            if (InitSpell(me, HOLY_LIGHT_1))\n+            {\n+                spellInfo = sSpellMgr->GetSpellInfo(InitSpell(me, HOLY_LIGHT_1));\n+                _heals[HOLY_LIGHT_1] = me->SpellHealingBonusDone(me, spellInfo, spellInfo->Effects[0].CalcValue(me), HEAL, 0);\n+            }\n+            else\n+                _heals[HOLY_LIGHT_1] = 0;\n+\n+            if (InitSpell(me, FLASH_OF_LIGHT_1))\n+            {\n+                spellInfo = sSpellMgr->GetSpellInfo(InitSpell(me, FLASH_OF_LIGHT_1));\n+                _heals[FLASH_OF_LIGHT_1] = me->SpellHealingBonusDone(me, spellInfo, spellInfo->Effects[0].CalcValue(me), HEAL, 0);\n+            }\n+            else\n+                _heals[FLASH_OF_LIGHT_1] = 0;\n+        }\n+\n+    private:\n+        //Spells\n+        uint32 CLEANSE;\n+        //Timers\n+/*misc*/uint32 checkAuraTimer, checkSealTimer, checkShieldTimer, checkBeaconTimer, avDelayTimer, shieldDelayTimer;\n+        //Special\n+/*misc*/uint32 _myaura;\n+/*misc*/int32 _sacDamage;\n+\n+        using HealMap = std::unordered_map<uint32 /*baseId*/, int32 /*amount*/>;\n+        HealMap _heals;\n+\n+        //uint32 _getBlessingsMask(Unit const*) const\n+        //Scans target for auras which are related to paladin's blessings\n+        //(even if aura is just incompatible with one)\n+        //returns applied blessings mask\n+        //used for finding out which blessings target lacks\n+        uint32 _getBlessingsMask(Unit const* target) const\n+        {\n+            uint32 mask = 0;\n+\n+            for (auto const& [_, auraApp] : target->GetAppliedAuras())\n+            {\n+                bool blessing = true;\n+                switch (auraApp->GetBase()->GetSpellInfo()->GetFirstRankSpell()->Id)\n+                {\n+                    case BLESSING_OF_WISDOM_1:\n+                    case GREATER_BLESSING_OF_WISDOM_1:\n+                        mask |= SPECIFIC_BLESSING_WISDOM;\n+                        break;\n+                    case BLESSING_OF_KINGS_1:\n+                    case GREATER_BLESSING_OF_KINGS_1:\n+                        mask |= SPECIFIC_BLESSING_KINGS;\n+                        break;\n+                    case BLESSING_OF_SANCTUARY_1:\n+                    case GREATER_BLESSING_OF_SANCTUARY_1:\n+                        mask |= SPECIFIC_BLESSING_SANCTUARY;\n+                        break;\n+                    case BLESSING_OF_MIGHT_1:\n+                    case GREATER_BLESSING_OF_MIGHT_1:\n+                    case BATTLESHOUT_1:\n+                        mask |= SPECIFIC_BLESSING_MIGHT;\n+                        break;\n+                    default:\n+                        blessing = false; //next aura\n+                        break;\n+                }\n+\n+                if (blessing && auraApp->GetBase()->GetCasterGUID() == me->GetGUID())\n+                    mask |= SPECIFIC_BLESSING_MY_BLESSING;\n+            }\n+\n+            return mask;\n+        }\n+        //uint32 _getAurasMask(Unit const*) const\n+        //Scans target for paladin's auras\n+        //returns applied auras mask\n+        //used for finding out which auras target lacks\n+        uint32 _getAurasMask(std::map<uint32 /*type*/, uint32 /*curId*/>& idMap) const\n+        {\n+            uint32 mask = 0;\n+\n+            for (auto const& [spellId, auraApp] : me->GetAppliedAuras())\n+            {\n+                bool isAura = true;\n+                uint32 baseId = auraApp->GetBase()->GetSpellInfo()->GetFirstRankSpell()->Id;\n+                switch (baseId)\n+                {\n+                    case DEVOTION_AURA_1:\n+                        mask |= SPECIFIC_AURA_DEVOTION;\n+                        break;\n+                    case CONCENTRATION_AURA_1:\n+                        mask |= SPECIFIC_AURA_CONCENTRATION;\n+                        break;\n+                    case FIRE_RESISTANCE_AURA_1:\n+                        mask |= SPECIFIC_AURA_FIRE_RES;\n+                        break;\n+                    case FROST_RESISTANCE_AURA_1:\n+                        mask |= SPECIFIC_AURA_FROST_RES;\n+                        break;\n+                    case SHADOW_RESISTANCE_AURA_1:\n+                        mask |= SPECIFIC_AURA_SHADOW_RES;\n+                        break;\n+                    case RETRIBUTION_AURA_1:\n+                        mask |= SPECIFIC_AURA_RETRIBUTION;\n+                        break;\n+                    case CRUSADER_AURA_1:\n+                        mask |= SPECIFIC_AURA_CRUSADER;\n+                        break;\n+                    default:\n+                        isAura = false; //next aura\n+                        break;\n+                }\n+\n+                if (isAura)\n+                {\n+                    idMap[baseId] = spellId;\n+                    if (auraApp->GetBase()->GetCasterGUID() == me->GetGUID())\n+                        mask |= SPECIFIC_AURA_MY_AURA;\n+                }\n+            }\n+\n+            return mask;\n+        }\n+    };\n+};\n+\n+void AddSC_paladin_bot()\n+{\n+    new paladin_bot();\n+}\ndiff --git a/src/server/game/AI/NpcBots/bot_priest_ai.cpp b/src/server/game/AI/NpcBots/bot_priest_ai.cpp\nnew file mode 100644\nindex 0000000000..88214b68df\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bot_priest_ai.cpp\n@@ -0,0 +1,2018 @@\n+#include \"bot_ai.h\"\n+#include \"botlogtraits.h\"\n+#include \"botmgr.h\"\n+#include \"botspell.h\"\n+#include \"bottext.h\"\n+#include \"bottraits.h\"\n+#include \"Group.h\"\n+#include \"Map.h\"\n+#include \"MotionMaster.h\"\n+#include \"Player.h\"\n+#include \"ScriptMgr.h\"\n+#include \"Spell.h\"\n+#include \"SpellAuraEffects.h\"\n+#include \"SpellMgr.h\"\n+#include \"TemporarySummon.h\"\n+/*\n+Priest NpcBot (reworked by Trickerer onlysuffering@gmail.com)\n+Complete - Around 90%\n+TODO: Mana Burn, Binding Heal, Lightwell\n+*/\n+\n+enum PriestBaseSpells\n+{\n+    DISPEL_MAGIC_1                      = 527,\n+    MASS_DISPEL_1                       = 32375,\n+    CURE_DISEASE_1                      = 528,\n+    ABOLISH_DISEASE_1                   = 552,\n+    FEAR_WARD_1                         = 6346,\n+    PAIN_SUPPRESSION_1                  = 33206,\n+    PSYCHIC_SCREAM_1                    = 8122,\n+    FADE_1                              = 586,\n+    PSYCHIC_HORROR_1                    = 64044,\n+    SILENCE_1                           = 15487,\n+    PENANCE_1                           = 47540,\n+    VAMPIRIC_EMBRACE_1                  = 15286,\n+    DISPERSION_1                        = 47585,\n+    MIND_SEAR_1                         = 48045,\n+    GUARDIAN_SPIRIT_1                   = 47788,\n+    SHACKLE_UNDEAD_1                    = 9484,\n+    LESSER_HEAL_1                       = 2050,\n+    NORMAL_HEAL_1                       = 2054,\n+    GREATER_HEAL_1                      = 2060,\n+    RENEW_1                             = 139,\n+    FLASH_HEAL_1                        = 2061,\n+    PRAYER_OF_HEALING_1                 = 596,\n+    CIRCLE_OF_HEALING_1                 = 34861,\n+    DIVINE_HYMN_1                       = 64843,\n+    PRAYER_OF_MENDING_1                 = 33076,\n+    RESURRECTION_1                      = 2006,\n+    PW_SHIELD_1                         = 17,\n+    INNER_FIRE_1                        = 588,\n+    PW_FORTITUDE_1                      = 1243,\n+    SHADOW_PROTECTION_1                 = 976,\n+    DIVINE_SPIRIT_1                     = 14752,\n+    HOLY_FIRE_1                         = 14914,\n+    SMITE_1                             = 585,\n+    SW_PAIN_1                           = 589,\n+    MIND_BLAST_1                        = 8092,\n+    SW_DEATH_1                          = 32379,\n+    DEVOURING_PLAGUE_1                  = 2944,\n+    MIND_FLAY_1                         = 15407,\n+    VAMPIRIC_TOUCH_1                    = 34914,\n+    SHADOWFORM_1                        = 15473,\n+    INNER_FOCUS_1                       = 14751,\n+    DESPERATE_PRAYER_1                  = 19236,\n+    POWER_INFUSION_1                    = 10060,\n+    HYMN_OF_HOPE_1                      = 64901,\n+\n+    LEVITATE_1                          = 1706\n+};\n+enum PriestPassives\n+{\n+//Talents\n+    UNBREAKABLE_WILL                = 14791,//rank 5\n+    SPIRIT_TAP                      = 15336,//rank 3\n+    IMPROVED_SPIRIT_TAP             = 15338,//rank 2\n+    MEDITATION                      = 14777,//rank 3\n+    INSPIRATION1                    = 14892,\n+    INSPIRATION2                    = 15362,\n+    INSPIRATION3                    = 15363,\n+    SHADOW_WEAVING1                 = 15257,\n+    SHADOW_WEAVING2                 = 15331,\n+    SHADOW_WEAVING3                 = 15332,\n+    SURGE_OF_LIGHT                  = 33154,//rank 2\n+    IMPROVED_DEVOURING_PLAGUE       = 63627,//rank 3\n+    HOLY_CONCENTRATION              = 34860,//rank 3\n+    RENEWED_HOPE                    = 57472,//rank 3\n+    RAPTURE                         = 47537,//rank 3\n+    BODY_AND_SOUL1                  = 64127,\n+    SERENDIPITY                     = 63737,//rank 3\n+    IMPROVED_SHADOWFORM             = 47570,//rank 2\n+    MISERY1                         = 33191,\n+    MISERY2                         = 33192,\n+    MISERY3                         = 33193,\n+    DIVINE_AEGIS                    = 47515,//rank 3\n+    GRACE                           = 47517,//rank 2\n+    EMPOWERED_RENEW1                = 63534,\n+    EMPOWERED_RENEW2                = 63542,\n+    EMPOWERED_RENEW3                = 63543,\n+    BORROWED_TIME                   = 52800,//rank 5\n+//Glyphs\n+    //GLYPH_SW_PAIN                   = 55681,\n+    GLYPH_PW_SHIELD                 = 55672,\n+    GLYPH_DISPEL_MAGIC              = 55677,\n+    GLYPH_PRAYER_OF_HEALING         = 55680,\n+    GLYPH_SHADOW                    = 55689,\n+//other\n+    PRIEST_T10_2P_BONUS             = 70770 //33% renew\n+};\n+enum PriestSpecial\n+{\n+    SHADOW_WEAVING_BUFF             = 15258,\n+    MIND_FLAY_DAMAGE                = 58381,\n+    MIND_SEAR_DAMAGE_1              = 49821,\n+    SW_DEATH_BACKLASH               = 32409,\n+    WEAKENED_SOUL_DEBUFF            = 6788,\n+    SURGE_OF_LIGHT_BUFF             = 33151,\n+    SERENDIPITY_BUFF                = 63734,\n+    DIVINE_HYMN_HEAL                = 64844,\n+    PRAYER_OF_MENDING_AURA_1        = 41635,\n+    PRAYER_OF_MENDING_HEAL          = 33110,\n+    PENANCE_HEAL_1                  = 47750,\n+    IMPROVED_MIND_BLAST_DEBUFF      = 48301,//Mind Trauma\n+    HYMN_OF_HOPE_BUFF               = 64904,\n+\n+    SHADOWFIEND_1                   = 34433\n+};\n+\n+static const std::vector<uint32> Priest_spells_damage\n+{ DEVOURING_PLAGUE_1, HOLY_FIRE_1, MIND_BLAST_1, MIND_FLAY_1, MIND_SEAR_1, PENANCE_1, SMITE_1, SW_PAIN_1, SW_DEATH_1, VAMPIRIC_TOUCH_1 };\n+static const std::vector<uint32> Priest_spells_cc\n+{ PSYCHIC_HORROR_1, PSYCHIC_SCREAM_1, SHACKLE_UNDEAD_1, SILENCE_1 };\n+static const std::vector<uint32> Priest_spells_heal\n+{ RENEW_1, FLASH_HEAL_1, LESSER_HEAL_1, NORMAL_HEAL_1, GREATER_HEAL_1, PRAYER_OF_HEALING_1, PRAYER_OF_MENDING_1,\n+GUARDIAN_SPIRIT_1, PENANCE_1, DIVINE_HYMN_1, CIRCLE_OF_HEALING_1, DESPERATE_PRAYER_1 };\n+static const std::vector<uint32> Priest_spells_support\n+{ PW_FORTITUDE_1, DIVINE_SPIRIT_1, SHADOW_PROTECTION_1, ABOLISH_DISEASE_1, CURE_DISEASE_1,\n+DISPEL_MAGIC_1, MASS_DISPEL_1, DISPERSION_1, FADE_1, FEAR_WARD_1, HYMN_OF_HOPE_1, INNER_FIRE_1, INNER_FOCUS_1,\n+LEVITATE_1, PAIN_SUPPRESSION_1, POWER_INFUSION_1, PW_SHIELD_1, RESURRECTION_1, SHADOWFORM_1, VAMPIRIC_EMBRACE_1 };\n+\n+class priest_bot : public CreatureScript\n+{\n+public:\n+    priest_bot() : CreatureScript(\"priest_bot\") { }\n+\n+    CreatureAI* GetAI(Creature* creature) const override\n+    {\n+        return new priest_botAI(creature);\n+    }\n+\n+    bool OnGossipHello(Player* player, Creature* creature) override\n+    {\n+        return creature->GetBotAI()->OnGossipHello(player, 0);\n+    }\n+\n+    bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action) override\n+    {\n+        if (bot_ai* ai = creature->GetBotAI())\n+            return ai->OnGossipSelect(player, creature, sender, action);\n+        return true;\n+    }\n+\n+    bool OnGossipSelectCode(Player* player, Creature* creature, uint32 sender, uint32 action, char const* code) override\n+    {\n+        if (bot_ai* ai = creature->GetBotAI())\n+            return ai->OnGossipSelectCode(player, creature, sender, action, code);\n+        return true;\n+    }\n+\n+    struct priest_botAI : public bot_ai\n+    {\n+        priest_botAI(Creature* creature) : bot_ai(creature)\n+        {\n+            _botclass = BOT_CLASS_PRIEST;\n+\n+            InitUnitFlags();\n+        }\n+\n+        bool doCast(Unit* victim, uint32 spellId)\n+        {\n+            if (CheckBotCast(victim, spellId) != SPELL_CAST_OK)\n+                return false;\n+            return bot_ai::doCast(victim, spellId);\n+        }\n+\n+        void CheckHymnOfHope(uint32 diff)\n+        {\n+            if (!IsSpellReady(HYMN_OF_HOPE_1, diff) || Rand() > 45 || IsCasting() || IsTank())\n+                return;\n+\n+            Group const* gr = !IAmFree() ? master->GetGroup() : GetGroup();\n+            if (!gr)\n+                return;\n+\n+            uint8 LMPcount = 0;\n+            for (Unit const* member : BotMgr::GetAllGroupMembers(gr))\n+            {\n+                if (me->GetMap() != member->FindMap() || !member->IsAlive() || !member->IsInCombat() ||\n+                    me->GetDistance(member) > 40 || GetManaPCT(member) > (HasRole(BOT_ROLE_HEAL) ? 10 : 50) ||\n+                    (member->IsNPCBot() && member->ToCreature()->IsTempBot()) ||\n+                    member->GetAuraEffect(SPELL_AURA_MOD_INCREASE_ENERGY, SPELLFAMILY_PRIEST, 0x0, 0x0, 0x10))\n+                    continue;\n+                if (++LMPcount > 2)\n+                    break;\n+            }\n+\n+            if (LMPcount > 2 && doCast(me, GetSpell(HYMN_OF_HOPE_1)))\n+                return;\n+        }\n+\n+        bool MassGroupHeal(uint32 diff)\n+        {\n+            if (!HasRole(BOT_ROLE_HEAL) || IsCasting() || Rand() > (65 + 40 * me->GetMap()->IsRaid()))\n+                return false;\n+\n+            Group const* gr = !IAmFree() ? master->GetGroup() : GetGroup();\n+            if (!gr)\n+                return false;\n+\n+            bool canHymn = IsSpellReady(DIVINE_HYMN_1, diff, false);\n+            bool canPray = !!GetSpell(PRAYER_OF_HEALING_1);\n+            bool canCirc = IsSpellReady(CIRCLE_OF_HEALING_1, diff, false);\n+\n+            uint8 LHPcount1, LHPcount2, LHPcount3;\n+            LHPcount1 = LHPcount2 = LHPcount3 = 0;\n+            uint8 lowestPCT = 100;\n+            Unit* castTarget = nullptr;\n+\n+            for (Unit* member : BotMgr::GetAllGroupMembers(gr))\n+            {\n+                if (me->GetMap() != member->FindMap() || !member->IsAlive() || !member->IsInCombat() ||\n+                    member->isPossessed() || member->IsCharmed() || (member->IsNPCBot() && member->ToCreature()->IsTempBot()) ||\n+                    member->GetAuraEffect(SPELL_AURA_MOD_INCREASE_ENERGY, SPELLFAMILY_PRIEST, 0x0, 0x0, 0x10))\n+                    continue;\n+\n+                float dist = me->GetDistance(member);\n+                uint8 pct = GetHealthPCT(member);\n+                if (canHymn && pct < std::min<uint32>(80, 50 + member->getAttackers().size()*10) && GetLostHP(member) > 4000 && dist < 40)\n+                {\n+                    if (++LHPcount1 > 2)\n+                        break;\n+                }\n+                if (canPray && pct < 65 && dist < 36)\n+                {\n+                    if (++LHPcount2 > 3)\n+                        break;\n+                }\n+                if (canCirc && pct < 85 && dist < 40 && (!castTarget || castTarget->GetDistance(member) < 18))\n+                {\n+                    if (++LHPcount3 > 1)\n+                        break;\n+                    if (pct < lowestPCT)\n+                    {\n+                        lowestPCT = pct;\n+                        castTarget = member;\n+                    }\n+                }\n+            }\n+\n+            if (LHPcount1 > 2 && doCast(me, GetSpell(DIVINE_HYMN_1)))\n+                return true;\n+            if (LHPcount2 > 3)\n+            {\n+                if (me->IsInCombat() && IsSpellReady(INNER_FOCUS_1, diff) && GetManaPCT(me) < 70 &&\n+                    doCast(me, GetSpell(INNER_FOCUS_1)))\n+                {}\n+                if (doCast(me, GetSpell(PRAYER_OF_HEALING_1)))\n+                    return true;\n+            }\n+            if (LHPcount3 > 1 && castTarget && doCast(castTarget, GetSpell(CIRCLE_OF_HEALING_1)))\n+                return true;\n+\n+            return false;\n+        }\n+\n+        bool ShieldGroup(uint32 diff)\n+        {\n+            if (!IsSpellReady(PW_SHIELD_1, false, diff) || IsCasting() || Rand() > 65 + 100 * (me->GetMap()->IsRaid()))\n+                return false;\n+            if (!IAmFree() && !(me->GetLevel() >= 30 && _spec == BOT_SPEC_PRIEST_DISCIPLINE) &&\n+                master->GetBotMgr()->HasBotWithSpec(BOT_SPEC_PRIEST_DISCIPLINE))\n+                return false;\n+\n+            Group const* gr = !IAmFree() ? master->GetGroup() : GetGroup();\n+            if (!gr)\n+            {\n+                Unit* u = master;\n+                if (u->IsAlive() && !u->getAttackers().empty() && (IsTank(u) || GetHealthPCT(u) < 75) && me->GetDistance(u) < 40 &&\n+                    ShieldTarget(u, diff))\n+                    return true;\n+                if (!IAmFree())\n+                {\n+                    for (auto const& [_, bot] : *master->GetBotMgr()->GetBotMap())\n+                    {\n+                        u = bot;\n+                        if (u->IsAlive() && !u->getAttackers().empty() && !u->ToCreature()->IsTempBot() &&\n+                            (IsTank(u) || GetHealthPCT(u) < 75) && me->GetDistance(u) < 40 &&\n+                            ShieldTarget(u, diff))\n+                            return true;\n+                    }\n+                    for (Unit* m : master->m_Controlled)\n+                    {\n+                        u = m;\n+                        if (!u || !u->IsPet() || me->GetMap() != u->FindMap())\n+                            continue;\n+                        if (u->IsAlive() && !u->getAttackers().empty() && (IsTank(u) || GetHealthPCT(u) < 75) && me->GetDistance(u) < 40 &&\n+                            ShieldTarget(u, diff))\n+                            return true;\n+                    }\n+                }\n+            }\n+            else\n+            {\n+                std::vector<Unit*> members = BotMgr::GetAllGroupMembers(gr);\n+                for (auto i : NPCBots::index_array<uint8, 2>)\n+                {\n+                    for (Unit* member : members)\n+                    {\n+                        if (!(i == 0 ? member->IsPlayer() : member->IsNPCBot()) || me->GetMap() != member->FindMap() ||\n+                            !member->IsAlive() || me->GetDistance(member) > 40 || member->isPossessed() || member->IsCharmed() ||\n+                            member->getAttackers().empty() || (!IsTank(member) && !IsFlagCarrier(member) && GetHealthPCT(member) > 75) ||\n+                            (member->IsNPCBot() && member->ToCreature()->IsTempBot()) ||\n+                            member->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_PALADIN, 0x0, 0x80000, 0x0))\n+                            continue;\n+                        if (ShieldTarget(member, diff))\n+                            return true;\n+                    }\n+                }\n+            }\n+            return false;\n+        }\n+\n+        bool ShieldTarget(Unit* target, uint32 diff)\n+        {\n+            if (!IsSpellReady(PW_SHIELD_1, diff) || IsCasting())\n+                return false;\n+            if (target->HasAuraTypeWithFamilyFlags(SPELL_AURA_MECHANIC_IMMUNITY, SPELLFAMILY_PRIEST, 0x20000000) ||\n+                target->HasAuraTypeWithFamilyFlags(SPELL_AURA_SCHOOL_ABSORB, SPELLFAMILY_PRIEST, 0x1))\n+                return false;\n+\n+            if (doCast(target, GetSpell(PW_SHIELD_1)))\n+                return true;\n+\n+            return false;\n+        }\n+\n+        void StartAttack(Unit* u, bool force = false)\n+        {\n+            if (!bot_ai::StartAttack(u, force))\n+                return;\n+            GetInPosition(force, u);\n+        }\n+\n+        void JustEngagedWith(Unit* u) override { bot_ai::JustEngagedWith(u); }\n+        void KilledUnit(Unit* u) override { bot_ai::KilledUnit(u); }\n+        void EnterEvadeMode(EvadeReason why = EVADE_REASON_OTHER) override { bot_ai::EnterEvadeMode(why); }\n+        void MoveInLineOfSight(Unit* u) override { bot_ai::MoveInLineOfSight(u); }\n+        void JustDied(Unit* u) override { UnsummonAll(false); bot_ai::JustDied(u); }\n+\n+        bool removeShapeshiftForm() override\n+        {\n+            ShapeshiftForm form = me->GetShapeshiftForm();\n+            if (form != FORM_NONE)\n+            {\n+                switch (form)\n+                {\n+                    case FORM_SHADOW:\n+                        me->RemoveAurasDueToSpell(SHADOWFORM_1);\n+                        break;\n+                    default:\n+                        break;\n+                }\n+            }\n+\n+            return true;\n+        }\n+\n+        void BreakCC(uint32 diff) override\n+        {\n+            //Improved Shadowform: Fade\n+            if (IsSpellReady(FADE_1, diff) && me->GetShapeshiftForm() == FORM_SHADOW && me->GetLevel() >= 45 &&\n+                Rand() < 35 && me->HasAuraWithMechanic((1u<<MECHANIC_SNARE)|(1u<<MECHANIC_ROOT)))\n+            {\n+                if (doCast(me, GetSpell(FADE_1)))\n+                    return;\n+            }\n+            bot_ai::BreakCC(diff);\n+        }\n+\n+        void UpdateAI(uint32 diff) override\n+        {\n+            if (!GlobalUpdate(diff))\n+                return;\n+\n+            DoVehicleActions(diff);\n+            if (!CanBotAttackOnVehicle())\n+                return;\n+\n+            Disperse(diff);\n+\n+            DoDevCheck(diff);\n+            DoShackCheck(diff);\n+\n+            if (IsPotionReady())\n+            {\n+                if (GetManaPCT(me) < 33)\n+                    DrinkPotion(true);\n+                else if (GetHealthPCT(me) < 50 && (!HasRole(BOT_ROLE_HEAL) || me->HasAuraType(SPELL_AURA_MOD_SILENCE)))\n+                    DrinkPotion(false);\n+            }\n+\n+            CheckRacials(diff);\n+\n+            doDefend(diff);\n+\n+            if (me->GetMap()->IsRaid())\n+            {\n+                CureGroup(GetSpell(DISPEL_MAGIC_1), diff);\n+                CureGroup(GetSpell(ABOLISH_DISEASE_1) ? GetSpell(ABOLISH_DISEASE_1) : GetSpell(CURE_DISEASE_1), diff);\n+                MassGroupHeal(diff);\n+                ShieldGroup(diff);\n+                CheckMending(diff);\n+                BuffAndHealGroup(diff);\n+            }\n+            else\n+            {\n+                MassGroupHeal(diff);\n+                ShieldGroup(diff);\n+                CheckMending(diff);\n+                BuffAndHealGroup(diff);\n+                CureGroup(GetSpell(DISPEL_MAGIC_1), diff);\n+                CureGroup(GetSpell(CURE_DISEASE_1), diff);\n+            }\n+\n+            if (master->IsInCombat() || me->IsInCombat())\n+            {\n+                CheckSilence(diff);\n+                CheckDispel(diff);\n+                CheckHymnOfHope(diff);\n+            }\n+\n+            Counter(diff);\n+\n+            if (me->IsInCombat())\n+            {\n+                CheckShackles(diff);\n+                CheckPowerInfusion(diff);\n+            }\n+            else\n+                DoNonCombatActions(diff);\n+\n+            if (IsCasting())\n+                return;\n+\n+            if (IsSpellReady(SHADOWFORM_1, diff) && HasRole(BOT_ROLE_DPS) && !HasRole(BOT_ROLE_HEAL))\n+            {\n+                if (doCast(me, SHADOWFORM_1))\n+                    return;\n+            }\n+\n+            if (ProcessImmediateNonAttackTarget())\n+                return;\n+\n+            if (!CheckAttackTarget())\n+                return;\n+\n+            CheckUsableItems(diff);\n+\n+            Attack(diff);\n+        }\n+\n+        void Attack(uint32 diff)\n+        {\n+            Unit* mytar = opponent ? opponent : disttarget ? disttarget : nullptr;\n+            if (!mytar)\n+                return;\n+\n+            StartAttack(mytar, IsMelee());\n+\n+            CheckAttackState();\n+            if (!me->IsAlive() || !mytar->IsAlive())\n+                return;\n+\n+            MoveBehind(mytar);\n+\n+            if (GC_Timer > diff)\n+                return;\n+\n+            //shadow skills range\n+            if (me->GetDistance(mytar) > CalcSpellMaxRange(MIND_FLAY_1))\n+                return;\n+\n+            auto [can_do_shadow, can_do_holy] = CanAffectVictimBools(mytar, SPELL_SCHOOL_SHADOW, SPELL_SCHOOL_HOLY);\n+\n+            if (IsSpellReady(PSYCHIC_HORROR_1, diff) && can_do_shadow && Rand() < 20 &&\n+                mytar->GetHealth() > me->GetMaxHealth()/8 && !CCed(mytar) &&\n+                !mytar->HasAuraType(SPELL_AURA_MOD_DISARM) &&\n+                (mytar->IsPlayer() ?\n+                mytar->ToPlayer()->GetWeaponForAttack(BASE_ATTACK) && mytar->ToPlayer()->GetWeaponForAttack(WeaponAttackType(BASE_ATTACK), true) :\n+                mytar->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID) && mytar->CanUseAttackType(BASE_ATTACK)))\n+            {\n+                if (doCast(mytar, GetSpell(PSYCHIC_HORROR_1)))\n+                    return;\n+            }\n+\n+            //spell reflections\n+            if (IsSpellReady(SW_PAIN_1, diff) && can_do_shadow && CanRemoveReflectSpells(mytar, SW_PAIN_1) &&\n+                doCast(mytar, SW_PAIN_1)) //yes, using rank 1\n+                return;\n+\n+            if (!HasRole(BOT_ROLE_DPS))\n+                return;\n+\n+            if (IsSpellReady(SHADOWFIEND_1, diff) && GetManaPCT(me) < 50)\n+            {\n+                SummonBotPet(mytar);\n+                SetSpellCooldown(SHADOWFIEND_1, 180000); // (5 - 2) min with Veiled Shadows\n+            }\n+\n+            if (!HasRole(BOT_ROLE_HEAL) || GetManaPCT(me) > 35 || botPet)\n+            {\n+                if (IsSpellReady(SW_DEATH_1, diff) && can_do_shadow && Rand() < 90 && GetHealthPCT(me) > 50 &&\n+                    (me->GetMap()->IsRaid() || GetHealthPCT(mytar) < 15 || mytar->GetHealth() < me->GetMaxHealth()/8) &&\n+                    doCast(mytar, GetSpell(SW_DEATH_1)))\n+                    return;\n+                if (IsSpellReady(VAMPIRIC_TOUCH_1, diff) && can_do_shadow && Rand() < 80 &&\n+                    mytar->GetHealth() > me->GetMaxHealth()/4 * (1 + mytar->getAttackers().size()) &&\n+                    !mytar->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_PRIEST, 0x0, 0x400, 0x0, me->GetGUID()) &&\n+                    doCast(mytar, GetSpell(VAMPIRIC_TOUCH_1)))\n+                    return;\n+                if (IsSpellReady(SW_PAIN_1, diff) && can_do_shadow && Rand() < 100 &&\n+                    mytar->GetHealth() > me->GetMaxHealth()/2 * (1 + mytar->getAttackers().size()) &&\n+                    !mytar->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_PRIEST, 0x8000, 0x0, 0x0, me->GetGUID()))\n+                {\n+                    AuraEffect const* weav = me->GetAuraEffect(SPELL_AURA_MOD_DAMAGE_PERCENT_DONE, SPELLFAMILY_PRIEST, 0x0, 0x8, 0x0);\n+                    if (me->GetLevel() < 60 || (weav && weav->GetBase()->GetStackAmount() >= 4))\n+                        if (doCast(mytar, GetSpell(SW_PAIN_1)))\n+                            return;\n+                }\n+                if (IsSpellReady(DEVOURING_PLAGUE_1, diff) && can_do_shadow && !Devcheck && Rand() < 100 &&\n+                    (GetSpec() == BOT_SPEC_PRIEST_SHADOW || mytar->IsControlledByPlayer()) &&\n+                    mytar->GetHealth() > me->GetMaxHealth()/2 * (1 + mytar->getAttackers().size()) &&\n+                    !(mytar->IsCreature() && (mytar->ToCreature()->HasMechanicTemplateImmunity(1u<<(MECHANIC_INFECTED-1)))) &&\n+                    !mytar->GetAuraEffect(SPELL_AURA_PERIODIC_LEECH, SPELLFAMILY_PRIEST, 0x02000000, 0x0, 0x0, me->GetGUID()) &&\n+                    doCast(mytar, GetSpell(DEVOURING_PLAGUE_1)))\n+                    return;\n+                if (IsSpellReady(MIND_BLAST_1, diff) && can_do_shadow &&\n+                    doCast(mytar, GetSpell(MIND_BLAST_1)))\n+                    return;\n+                if (IsSpellReady(MIND_SEAR_1, diff) && can_do_shadow && (!me->isMoving() || Rand() < 80) &&\n+                    mytar->GetVictim() && mytar->GetVictim()->getAttackers().size() > 3)\n+                {\n+                    if (Unit* u = FindSplashTarget(CalcSpellMaxRange(MIND_SEAR_1), mytar, 14.f, 3)) //glyphed, cluster of 4\n+                        if (doCast(u, GetSpell(MIND_SEAR_1)))\n+                            return;\n+                }\n+                if (IsSpellReady(HOLY_FIRE_1, diff) && can_do_holy &&\n+                    (HasRole(BOT_ROLE_HEAL) || me->GetShapeshiftForm() != FORM_SHADOW) &&\n+                    doCast(mytar, GetSpell(HOLY_FIRE_1)))\n+                    return;\n+                if (IsSpellReady(MIND_FLAY_1, diff) && can_do_shadow &&\n+                    (!HasRole(BOT_ROLE_HEAL) || mytar->GetHealth() < me->GetMaxHealth()/2) &&\n+                    doCast(mytar, GetSpell(MIND_FLAY_1)))\n+                    return;\n+                if (IsSpellReady(SMITE_1, diff) && can_do_holy && me->GetLevel() < 20 &&//MF is lvl 20, MB is lvl 10\n+                    doCast(mytar, GetSpell(SMITE_1)))\n+                    return;\n+            }\n+\n+            if (Spell const* shot = me->GetCurrentSpell(CURRENT_AUTOREPEAT_SPELL))\n+            {\n+                if (shot->GetSpellInfo()->Id == SHOOT_WAND && shot->m_targets.GetUnitTarget() != mytar)\n+                    me->InterruptSpell(CURRENT_AUTOREPEAT_SPELL);\n+            }\n+            else if (IsSpellReady(SHOOT_WAND, diff) && !me->isMoving() && me->GetDistance(mytar) < 30 && GetEquips(BOT_SLOT_RANGED) &&\n+                doCast(mytar, SHOOT_WAND))\n+                return;\n+        }\n+\n+        bool HealTarget(Unit* target, uint32 diff) override\n+        {\n+            if (!target || !target->IsAlive() || target->GetShapeshiftForm() == FORM_SPIRITOFREDEMPTION || me->GetDistance(target) > 40)\n+                return false;\n+\n+            uint8 hp = GetHealthPCT(target);\n+            if (hp > GetHealHpPctThreshold())\n+                return false;\n+            bool pointed = IsPointedHealTarget(target);\n+            if (hp > 90 && !(pointed && me->GetMap()->IsRaid()) &&\n+                (!target->IsInCombat() || target->getAttackers().empty() || !IsTank(target) || !me->GetMap()->IsRaid()))\n+                return false;\n+\n+            int32 hps = GetHPS(target);\n+            int32 xphp = target->GetHealth() + hps * (me->GetLevel() < 60 ? 2.5f : 2.0f);\n+            int32 hppctps = int32(hps * 100.f / float(target->GetMaxHealth()));\n+            int32 xphploss = xphp > int32(target->GetMaxHealth()) ? 0 : abs(int32(xphp - target->GetMaxHealth()));\n+            int32 xppct = hp + hppctps * (me->GetLevel() < 60 ? 2.5f : 2.0f);\n+            //BOT_LOG_ERROR(\"entities.player\", \"priest_bot:HealTarget(): %s's pct %u, hppctps %i, epct %i\",\n+            //    target->GetName().c_str(), uint32(hp), int32(hppctps), int32(xppct));\n+            if (xppct >= 95 && hp >= 25 && !pointed)\n+                return false;\n+\n+            //GUARDIAN SPIRIT no GCD\n+            if (IsSpellReady(GUARDIAN_SPIRIT_1, diff, false) && !IAmFree() && target->IsInCombat() && !target->getAttackers().empty() &&\n+                (xppct <= 0 || (hp <= 50 && hppctps <= -15) ||\n+                (me->GetMap()->Instanceable() && target->GetMaxHealth() > me->GetMaxHealth() << 5)) &&\n+                !target->HasAuraTypeWithFamilyFlags(SPELL_AURA_MOD_HEALING_PCT, SPELLFAMILY_PRIEST, 0x40000000))\n+            {\n+                me->InterruptNonMeleeSpells(false);\n+                if (doCast(target, GetSpell(GUARDIAN_SPIRIT_1)))\n+                {\n+                    if (target->IsPlayer())\n+                        ReportSpellCast(GUARDIAN_SPIRIT_1, LocalizedNpcText(target->ToPlayer(), BOT_TEXT__ON_YOU), target->ToPlayer());\n+\n+                    if (!IAmFree() && target != master)\n+                    {\n+                        std::string msg = target == me ? LocalizedNpcText(master, BOT_TEXT__ON_MYSELF) : (LocalizedNpcText(master, BOT_TEXT__ON_) + target->GetName() + '!');\n+                        ReportSpellCast(GUARDIAN_SPIRIT_1, msg, master);\n+                    }\n+                    //return true;\n+                }\n+            }\n+\n+            //PAIN SUPPRESSION\n+            if (IsSpellReady(PAIN_SUPPRESSION_1, diff, false) && xppct >= 5 && hp >= 25 && hp <= 55 && hppctps <= -10 &&\n+                Rand() < 80 && !target->getAttackers().empty() &&\n+                !target->HasAuraTypeWithFamilyFlags(SPELL_AURA_MOD_DISPEL_RESIST, SPELLFAMILY_PRIEST, 0x80000000) &&\n+                !target->HasAuraTypeWithFamilyFlags(SPELL_AURA_MOD_HEALING_PCT, SPELLFAMILY_PRIEST, 0x40000000))\n+            {\n+                me->InterruptNonMeleeSpells(false);\n+                if (doCast(target, GetSpell(PAIN_SUPPRESSION_1)))\n+                {\n+                    if (target->IsPlayer())\n+                        ReportSpellCast(PAIN_SUPPRESSION_1, LocalizedNpcText(target->ToPlayer(), BOT_TEXT__ON_YOU), target->ToPlayer());\n+\n+                    if (!IAmFree() && target != master)\n+                    {\n+                        std::string msg = target == me ? LocalizedNpcText(master, BOT_TEXT__ON_MYSELF) : (LocalizedNpcText(master, BOT_TEXT__ON_) + target->GetName() + '!');\n+                        ReportSpellCast(PAIN_SUPPRESSION_1, msg, master);\n+                    }\n+                    return true;\n+                }\n+            }\n+\n+            if (target == me && IsSpellReady(DESPERATE_PRAYER_1, diff) && hp <= 50 && Rand() < 45 &&\n+                int32(GetLostHP(me)) > _heals[DESPERATE_PRAYER_1])\n+            {\n+                me->InterruptNonMeleeSpells(false);\n+                if (doCast(target, GetSpell(DESPERATE_PRAYER_1)))\n+                    return true;\n+            }\n+\n+            if (IsCasting())\n+                return false;\n+\n+            Unit const* u = target->GetVictim();\n+            bool tanking = u && IsTank(target) && u->IsCreature() && u->ToCreature()->isWorldBoss();\n+\n+            //Penance\n+            if (IsSpellReady(PENANCE_1, diff) && !target->IsCharmed() && !target->isPossessed() && hp <= 80 &&\n+                Rand() < 90 && xphploss > _heals[PENANCE_1])\n+            {\n+                if (doCast(target, GetSpell(PENANCE_1)))\n+                    return true;\n+            }\n+            //Big Heal\n+            if (IsSpellReady(HEAL, diff) && (xppct > 15 || !GetSpell(FLASH_HEAL_1)) && (tanking || xphploss > _heals[HEAL]))\n+            {\n+                if (me->IsInCombat() && IsSpellReady(INNER_FOCUS_1, diff) && GetManaPCT(me) < 70 &&\n+                    doCast(me, GetSpell(INNER_FOCUS_1)))\n+                {}\n+                if (doCast(target, GetSpell(HEAL)))\n+                    return true;\n+            }\n+            //Renew\n+            if (IsSpellReady(RENEW_1, diff) && (tanking || !target->getAttackers().empty() || me->GetMap()->IsDungeon()) &&\n+                !target->GetAuraEffect(SPELL_AURA_PERIODIC_HEAL, SPELLFAMILY_PRIEST, 0x40, 0x0, 0x0, me->GetGUID())\n+                /*!target->HasAura(GetSpell(RENEW_1), me->GetGUID())*/)\n+            {\n+                if (doCast(target, GetSpell(RENEW_1)))\n+                    return true;\n+            }\n+            //Flash Heal\n+            if (IsSpellReady(FLASH_HEAL_1, diff) && xphploss > _heals[FLASH_HEAL_1])\n+            {\n+                if (doCast(target, GetSpell(FLASH_HEAL_1)))\n+                    return true;\n+            }\n+\n+            return false;\n+        }\n+\n+        bool BuffTarget(Unit* target, uint32 diff) override\n+        {\n+            if (IsSpellReady(FEAR_WARD_1, diff) && (!IAmFree() || target == me) &&\n+                !target->HasAuraTypeWithMiscvalue(SPELL_AURA_MECHANIC_IMMUNITY, MECHANIC_FEAR) &&\n+                doCast(target, GetSpell(FEAR_WARD_1)))\n+                return true;\n+\n+            if (target == me)\n+            {\n+                if (GetSpell(INNER_FIRE_1) &&\n+                    !me->HasAuraTypeWithFamilyFlags(SPELL_AURA_MOD_RESISTANCE, SPELLFAMILY_PRIEST, 0x2) &&\n+                    doCast(me, GetSpell(INNER_FIRE_1)))\n+                    return true;\n+                if (HasRole(BOT_ROLE_DPS) && GetSpell(VAMPIRIC_EMBRACE_1) &&\n+                    !me->HasAuraTypeWithFamilyFlags(SPELL_AURA_DUMMY, SPELLFAMILY_PRIEST, 0x4) &&\n+                    doCast(me, GetSpell(VAMPIRIC_EMBRACE_1)))\n+                    return true;\n+            }\n+\n+            if (me->IsInCombat() && !master->GetMap()->IsRaid())\n+                return false;\n+\n+            if (uint32 PW_FORTITUDE = GetSpell(PW_FORTITUDE_1))\n+            {\n+                if (!target->HasAuraTypeWithFamilyFlags(SPELL_AURA_MOD_STAT, SPELLFAMILY_PRIEST, 0x8) &&\n+                    doCast(target, PW_FORTITUDE))\n+                    return true;\n+            }\n+            if (uint32 SHADOW_PROTECTION = GetSpell(SHADOW_PROTECTION_1))\n+            {\n+                if (!target->HasAuraTypeWithFamilyFlags(SPELL_AURA_MOD_RESISTANCE_EXCLUSIVE, SPELLFAMILY_PRIEST, 0x100) &&\n+                    doCast(target, SHADOW_PROTECTION))\n+                    return true;\n+            }\n+            if (uint32 DIVINE_SPIRIT = GetSpell(DIVINE_SPIRIT_1))\n+            {\n+                if ((target->GetMaxPower(POWER_MANA) > 1) &&\n+                    !target->HasAuraTypeWithFamilyFlags(SPELL_AURA_MOD_STAT, SPELLFAMILY_PRIEST, 0x20) &&\n+                    doCast(target, DIVINE_SPIRIT))\n+                    return true;\n+            }\n+\n+            return false;\n+        }\n+\n+        void DoNonCombatActions(uint32 diff)\n+        {\n+            if (GC_Timer > diff || me->IsMounted() || IsCasting())\n+                return;\n+\n+            ResurrectGroup(GetSpell(RESURRECTION_1));\n+\n+            if (GetSpell(LEVITATE_1) && !IAmFree() && Rand() < 30)\n+            {\n+                Group const* gr = master->GetGroup();\n+                if (gr)\n+                {\n+                    for (GroupReference const* ref = gr->GetFirstMember(); ref != nullptr; ref = ref->next())\n+                    {\n+                        Player* pl = ref->GetSource();\n+                        if (pl && pl->IsAlive() && pl->FindMap() == me->GetMap() && pl->GetDistance(me) < 30 &&\n+                            pl->IsFalling() && pl->m_movementInfo.fallTime > 1000 &&\n+                            !pl->HasAuraType(SPELL_AURA_HOVER))\n+                        {\n+                            if (doCast(pl, GetSpell(LEVITATE_1)))\n+                                return;\n+                        }\n+                    }\n+                }\n+                else if (master->IsAlive() && master->GetDistance(me) < 30 && master->IsFalling() &&\n+                    master->m_movementInfo.fallTime > 1000 && !master->HasAuraType(SPELL_AURA_HOVER))\n+                {\n+                    if (doCast(master, GetSpell(LEVITATE_1)))\n+                        return;\n+                }\n+            }\n+        }\n+\n+        void Counter(uint32 diff)\n+        {\n+            if (ShackcheckTimer > diff || !IsSpellReady(SHACKLE_UNDEAD_1, diff) || Shackcheck || Rand() > 65 ||\n+                (HasRole(BOT_ROLE_HEAL) && (IsCasting() || GetManaPCT(me) < 20)))\n+                return;\n+\n+            //always glyphed so <= 0.5 sec cast time\n+            if (Unit* target = FindCastingTarget(CalcSpellMaxRange(SHACKLE_UNDEAD_1), 0, SHACKLE_UNDEAD_1))\n+            {\n+                me->InterruptNonMeleeSpells(false);\n+                if (doCast(target, GetSpell(SHACKLE_UNDEAD_1)))\n+                    return;\n+            }\n+        }\n+\n+        void CheckDispel(uint32 diff)\n+        {\n+            if (HasRole(BOT_ROLE_HEAL) && !HasRole(BOT_ROLE_DPS))\n+                return;\n+\n+            if (DispelcheckTimer > diff || IsCasting() || Rand() > 35)\n+                return;\n+\n+            DispelcheckTimer = urand(750, 1000);\n+\n+            uint32 DM = GetSpell(DISPEL_MAGIC_1);\n+            uint32 MD = (GetSpec() == BOT_SPEC_PRIEST_DISCIPLINE) ? GetSpell(MASS_DISPEL_1) : 0;\n+\n+            if (!DM && !MD)\n+                return;\n+\n+            if (Unit* target = FindHostileDispelTarget(CalcSpellMaxRange(DISPEL_MAGIC_1)))\n+            {\n+                uint32 dm = DM && !target->HasAuraWithMechanic(1u<<MECHANIC_IMMUNE_SHIELD) ? DM : MD;\n+                if (dm && doCast(target, dm))\n+                    return;\n+            }\n+        }\n+\n+        void CheckMending(uint32 diff)\n+        {\n+            if (Mend_Timer > diff || !IsSpellReady(PRAYER_OF_MENDING_1, diff) || !HasRole(BOT_ROLE_HEAL) || IsCasting() || Rand() > 75)\n+                return;\n+\n+            Mend_Timer = urand(1000, 3000);\n+\n+            Group const* gr = !IAmFree() ? master->GetGroup() : GetGroup();\n+            if (!gr)\n+                return;\n+\n+            uint32 MENDING_AURA = InitSpell(me, PRAYER_OF_MENDING_AURA_1);\n+            if (FindAffectedTarget(MENDING_AURA, me->GetGUID(), 70, 4))\n+                return;\n+\n+            for (Unit* member : BotMgr::GetAllGroupMembers(gr))\n+            {\n+                if (me->GetMap() == member->FindMap() && member->IsAlive() && !member->getAttackers().empty() &&\n+                    (IsTank(member) || GetBG()) && GetHealthPCT(member) < 85 && me->IsWithinDistInMap(member, 40) &&\n+                    !member->HasAuraType(SPELL_AURA_RAID_PROC_FROM_CHARGE_WITH_VALUE))\n+                {\n+                    if (doCast(member, GetSpell(PRAYER_OF_MENDING_1)))\n+                        return;\n+                }\n+            }\n+        }\n+\n+        void CheckShackles(uint32 diff)\n+        {\n+            if (Shackle_Timer > diff || !IsSpellReady(SHACKLE_UNDEAD_1, diff) || IsCasting() || Rand() > 50)\n+                return;\n+\n+            Shackle_Timer = 500;\n+\n+            if (FindAffectedTarget(GetSpell(SHACKLE_UNDEAD_1), me->GetGUID(), 60, 255))\n+                return;\n+            Unit* target = FindUndeadCCTarget(CalcSpellMaxRange(SHACKLE_UNDEAD_1), SHACKLE_UNDEAD_1);\n+            if (target && doCast(target, GetSpell(SHACKLE_UNDEAD_1)))\n+            {}\n+        }\n+\n+        void CheckSilence(uint32 diff)\n+        {\n+            if (IsCasting() || Rand() > 40)\n+                return;\n+\n+            if (IsSpellReady(SILENCE_1, diff, false))\n+            {\n+                if (Unit* target = FindCastingTarget(CalcSpellMaxRange(SILENCE_1), 0, SILENCE_1))\n+                    if (doCast(target, GetSpell(SILENCE_1)))\n+                        return;\n+            }\n+            if (IsSpellReady(PSYCHIC_HORROR_1, diff))\n+            {\n+                if (Unit* target = FindCastingTarget(CalcSpellMaxRange(PSYCHIC_HORROR_1), 0, PSYCHIC_HORROR_1))\n+                    if (doCast(target, GetSpell(PSYCHIC_HORROR_1)))\n+                        return;\n+            }\n+        }\n+\n+        void CheckPowerInfusion(uint32 diff)\n+        {\n+            if (!IsSpellReady(POWER_INFUSION_1, diff, false) || IsCasting() || Rand() > 25)\n+                return;\n+\n+            if (IAmFree())\n+            {\n+                if (me->GetVictim() && GetManaPCT(me) < 95 &&\n+                    doCast(me, GetSpell(POWER_INFUSION_1)))\n+                    return;\n+\n+                return;\n+            }\n+\n+            Group const* gr = master->GetGroup();\n+            Unit* u = nullptr;\n+            if (!gr)\n+            {\n+                u = master;\n+                if (u->IsAlive() && u->IsInWorld() && u->GetPowerType() == POWER_MANA && u->GetVictim() && !IsTank(u) &&\n+                    GetManaPCT(u) < 70 && me->IsWithinDistInMap(u, 30) &&\n+                    !u->HasAuraTypeWithFamilyFlags(SPELL_AURA_MOD_CASTING_SPEED_NOT_STACK, SPELLFAMILY_PRIEST, 0x80000000) &&\n+                    doCast(u, GetSpell(POWER_INFUSION_1)))\n+                    return;\n+\n+                for (auto const& [_, bot] : *master->GetBotMgr()->GetBotMap())\n+                {\n+                    u = bot;\n+                    if (u->IsAlive() && u->IsInWorld() && u->ToCreature()->GetBotAI()->HasRole(BOT_ROLE_HEAL) &&\n+                        u->ToCreature()->GetBotClass() < BOT_CLASS_EX_START &&\n+                        GetManaPCT(u) < 70 && me->IsWithinDistInMap(u, 30) &&\n+                        !u->HasAuraTypeWithFamilyFlags(SPELL_AURA_MOD_CASTING_SPEED_NOT_STACK, SPELLFAMILY_PRIEST, 0x80000000) &&\n+                        doCast(u, GetSpell(POWER_INFUSION_1)))\n+                        return;\n+                }\n+                for (auto const& [_, bot] : *master->GetBotMgr()->GetBotMap())\n+                {\n+                    u = bot;\n+                    if (u->IsAlive() && u->IsInWorld() && u->GetPowerType() == POWER_MANA && u->GetVictim() && !IsTank(u) &&\n+                        u->ToCreature()->GetBotClass() < BOT_CLASS_EX_START &&\n+                        GetManaPCT(u) < 70 && me->IsWithinDistInMap(u, 30) &&\n+                        !u->HasAuraTypeWithFamilyFlags(SPELL_AURA_MOD_CASTING_SPEED_NOT_STACK, SPELLFAMILY_PRIEST, 0x80000000) &&\n+                        doCast(u, GetSpell(POWER_INFUSION_1)))\n+                        return;\n+                }\n+\n+                return;\n+            }\n+\n+            for (GroupReference const* itr = gr->GetFirstMember(); itr != nullptr; itr = itr->next())\n+            {\n+                u = itr->GetSource();\n+                if (u && u->IsAlive() && u->IsInWorld() && u->GetPowerType() == POWER_MANA && u->GetVictim() && !IsTank(u) &&\n+                    GetManaPCT(u) < 70 && me->IsWithinDistInMap(u, 30) &&\n+                    !u->HasAuraTypeWithFamilyFlags(SPELL_AURA_MOD_CASTING_SPEED_NOT_STACK, SPELLFAMILY_PRIEST, 0x80000000) &&\n+                    doCast(u, GetSpell(POWER_INFUSION_1)))\n+                    return;\n+            }\n+            for (GroupReference const* itr = gr->GetFirstMember(); itr != nullptr; itr = itr->next())\n+            {\n+                Player const* player = itr->GetSource();\n+                if (!player || !player->IsInWorld() || me->GetMap() != player->FindMap() || !player->HaveBot())\n+                    continue;\n+                for (auto const& [_, bot] : *player->GetBotMgr()->GetBotMap())\n+                {\n+                    u = bot;\n+                    if (u->IsAlive() && u->IsInWorld() && u->ToCreature()->GetBotAI()->HasRole(BOT_ROLE_HEAL) &&\n+                        !IsHeroExClass(u->ToCreature()->GetBotClass()) &&\n+                        GetManaPCT(u) < 70 && me->IsWithinDistInMap(u, 30) &&\n+                        !u->HasAuraTypeWithFamilyFlags(SPELL_AURA_MOD_CASTING_SPEED_NOT_STACK, SPELLFAMILY_PRIEST, 0x80000000) &&\n+                        doCast(u, GetSpell(POWER_INFUSION_1)))\n+                        return;\n+                }\n+            }\n+            for (GroupReference const* itr = gr->GetFirstMember(); itr != nullptr; itr = itr->next())\n+            {\n+                Player const* player = itr->GetSource();\n+                if (!player || !player->IsInWorld() || me->GetMap() != player->FindMap() || !player->HaveBot())\n+                    continue;\n+                for (auto const& [_, bot] : *player->GetBotMgr()->GetBotMap())\n+                {\n+                    u = bot;\n+                    if (u->IsAlive() && u->IsInWorld() && u->GetPowerType() == POWER_MANA && u->GetVictim() && !IsTank(u) &&\n+                        u->ToCreature()->GetBotClass() < BOT_CLASS_EX_START &&\n+                        GetManaPCT(u) < 70 && me->IsWithinDistInMap(u, 30) &&\n+                        !u->HasAuraTypeWithFamilyFlags(SPELL_AURA_MOD_CASTING_SPEED_NOT_STACK, SPELLFAMILY_PRIEST, 0x80000000) &&\n+                        doCast(u, GetSpell(POWER_INFUSION_1)))\n+                        return;\n+                }\n+            }\n+\n+            SetSpellCooldown(POWER_INFUSION_1, 1500); //fail\n+        }\n+\n+        void doDefend(uint32 diff)\n+        {\n+            if (Rand() > 50) return;\n+\n+            Unit::AttackerSet const& m_attackers = master->getAttackers();\n+            Unit::AttackerSet const& b_attackers = me->getAttackers();\n+\n+            //fear master's attackers\n+            if (IsSpellReady(PSYCHIC_SCREAM_1, diff))\n+            {\n+                if (!m_attackers.empty() && (!IsTank(master) || GetHealthPCT(master) < 75))\n+                {\n+                    uint8 tCount = 0;\n+                    for (Unit const* attacker : m_attackers)\n+                    {\n+                        if (!attacker) continue;\n+                        if (attacker->ToCreature() && attacker->GetCreatureType() == CREATURE_TYPE_UNDEAD) continue;\n+                        if (me->GetExactDistSq(attacker) > 7*7) continue;\n+                        if (CCed(attacker) && me->GetExactDistSq(attacker) > 5*5) continue;\n+                        if (me->IsValidAttackTarget(attacker))\n+                            ++tCount;\n+                    }\n+                    if (tCount > 1 && doCast(me, GetSpell(PSYCHIC_SCREAM_1)))\n+                        return;\n+                }\n+\n+                // Defend myself (psychic horror)\n+                if (!b_attackers.empty())\n+                {\n+                    uint8 tCount = 0;\n+                    for (Unit const* attacker : b_attackers)\n+                    {\n+                        if (!attacker) continue;\n+                        if (attacker->ToCreature() && attacker->GetCreatureType() == CREATURE_TYPE_UNDEAD) continue;\n+                        if (me->GetExactDistSq(attacker) > 7*7) continue;\n+                        if (CCed(attacker) && me->GetExactDistSq(attacker) > 5*5) continue;\n+                        if (me->IsValidAttackTarget(attacker))\n+                            ++tCount;\n+                    }\n+                    if (tCount > 0 && doCast(me, GetSpell(PSYCHIC_SCREAM_1)))\n+                        return;\n+                }\n+            }\n+            // Heal myself\n+            if ((GetHealthPCT(me) < 95 && !b_attackers.empty()) || (IsWanderer() && IsFlagCarrier(me)))\n+            {\n+                if (ShieldTarget(me, diff)) return;\n+\n+                if (IsSpellReady(FADE_1, diff) && me->IsInCombat() && !b_attackers.empty())\n+                {\n+                    uint8 Tattackers = 0;\n+                    for (Unit const* attacker : b_attackers)\n+                    {\n+                        if (!attacker) continue;\n+                        if (!attacker->IsAlive()) continue;\n+                        if (!(attacker)->CanHaveThreatList()) continue;\n+                        if (me->GetExactDistSq((attacker)) < 15*15)\n+                            Tattackers++;\n+                    }\n+                    if (Tattackers > 0)\n+                    {\n+                        if (doCast(me, GetSpell(FADE_1)))\n+                            return;\n+                    }\n+                }\n+            }\n+        }\n+\n+        void DoDevCheck(uint32 diff)\n+        {\n+            if (DevcheckTimer <= diff)\n+            {\n+                DevcheckTimer = 1000;\n+                Devcheck = GetSpell(DEVOURING_PLAGUE_1) && FindAffectedTarget(GetSpell(DEVOURING_PLAGUE_1), me->GetGUID(), 70);\n+            }\n+        }\n+\n+        void DoShackCheck(uint32 diff)\n+        {\n+            if (ShackcheckTimer <= diff)\n+            {\n+                ShackcheckTimer = 1000;\n+                Shackcheck = GetSpell(SHACKLE_UNDEAD_1) && FindAffectedTarget(GetSpell(SHACKLE_UNDEAD_1), me->GetGUID(), 70);\n+            }\n+        }\n+\n+        void Disperse(uint32 diff)\n+        {\n+            if (me->GetVehicle())\n+                return;\n+            if (!IsSpellReady(DISPERSION_1, diff) || !me->IsInCombat() || HasRole(BOT_ROLE_HEAL) || IsCasting() || Rand() > 60)\n+                return;\n+            if ((me->getAttackers().size() > 3 && !IsSpellReady(FADE_1, diff, false) && GetHealthPCT(me) < 90) ||\n+                (GetHealthPCT(me) < 20 && (me->HasAuraType(SPELL_AURA_PERIODIC_DAMAGE) || !me->getAttackers().empty())) ||\n+                (GetManaPCT(me) < 35 && !IsPotionReady()) ||\n+                (me->getAttackers().size() > 1 && (CCed(me, true) || me->HasAuraWithMechanic(1u<<MECHANIC_SNARE))))\n+            {\n+                if (doCast(me, GetSpell(DISPERSION_1)))\n+                    return;\n+            }\n+\n+            SetSpellCooldown(DISPERSION_1, 500); //fail\n+        }\n+\n+        void ApplyClassSpellCritMultiplierAll(Unit const* victim, float& crit_chance, SpellInfo const* spellInfo, SpellSchoolMask schoolMask, WeaponAttackType /*attackType*/) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+\n+            //Inner Focus\n+            if (AuraEffect const* focu = me->GetAuraEffect(INNER_FOCUS_1, 0))\n+                if (focu->IsAffectedOnSpell(spellInfo))\n+                    crit_chance += 25.f;\n+\n+            //Benediction (23236)\n+            if (lvl >= 60 && (schoolMask & SPELL_SCHOOL_MASK_HOLY))\n+                crit_chance += 2.f;\n+            //Increased Prayer of Healing Criticals (23550): 25% additional critical chance for Prayer of Healing\n+            if (lvl >= 60 && baseId == PRAYER_OF_HEALING_1)\n+                crit_chance += 25.f;\n+            //Item - Priest T9 Shadow 4P Bonus (67198)\n+            if (lvl >= 80 && baseId == MIND_FLAY_DAMAGE)\n+                crit_chance += 5.f;\n+\n+            //Holy Specialization: 5% additional critical chance for Holy spells\n+            if (lvl >= 10 && (schoolMask & SPELL_SCHOOL_MASK_HOLY))\n+                crit_chance += 5.f;\n+            //Mind Melt (part 1): 4% additional critical chance for Mind Blast, Mind Flay and Mind Sear\n+            if ((GetSpec() == BOT_SPEC_PRIEST_SHADOW) &&\n+                lvl >= 35 && ((spellInfo->SpellFamilyFlags[0] & 0x802000) || (spellInfo->SpellFamilyFlags[1] & 0x80000)))\n+                crit_chance += 4.f;\n+            //Mind Melt (part 2): 6% additional critical chance for Vampiric Touch, Devouring Plague and SW: Pain\n+            if ((GetSpec() == BOT_SPEC_PRIEST_SHADOW) &&\n+                lvl >= 35 && ((spellInfo->SpellFamilyFlags[0] & 0x2008000) || (spellInfo->SpellFamilyFlags[1] & 0x400)))\n+                crit_chance += 6.f;\n+            //Improved Flash Heal (part 2): 10% additional critical chance on targets at or below 50% hp for Flash Heal\n+            if ((GetSpec() == BOT_SPEC_PRIEST_DISCIPLINE) && lvl >= 40 && baseId == FLASH_HEAL_1 && GetHealthPCT(victim) <= 50)\n+                crit_chance += 10.f;\n+            //Renewed Hope part 1: 4% additional critical chance on targets affected by Weakened Soul for Flash Heal, Greater Heal and Penance (Heal)\n+            if ((GetSpec() == BOT_SPEC_PRIEST_DISCIPLINE) &&\n+                lvl >= 45 && (baseId == FLASH_HEAL_1 || baseId == HEAL || baseId == PENANCE_HEAL_1) &&\n+                victim->HasAuraTypeWithFamilyFlags(SPELL_AURA_MECHANIC_IMMUNITY, SPELLFAMILY_PRIEST, 0x20000000))\n+                crit_chance += 4.f;\n+        }\n+\n+        void ApplyClassDamageMultiplierSpell(int32& damage, SpellNonMeleeDamage& damageinfo, SpellInfo const* spellInfo, WeaponAttackType /*attackType*/, bool iscrit) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+            float fdamage = float(damage);\n+\n+            //apply bonus damage mods\n+            float pctbonus = 0.0f;\n+            if (iscrit)\n+            {\n+                //!!!spell damage is not yet critical and will be multiplied by 1.5\n+                //so we should put here bonus damage mult /1.5\n+                //Shadow Power: 50% additional crit damage bonus for Mind Blast, Mind Flay and SW:Death\n+                if (lvl >= 40 &&\n+                    (baseId == MIND_BLAST_1 || baseId == MIND_FLAY_DAMAGE || baseId == SW_DEATH_1))\n+                    pctbonus += 0.333f;\n+                //Shadowform crit damage increase\n+                if (me->GetShapeshiftForm() == FORM_SHADOW &&\n+                    (baseId == SW_PAIN_1 || baseId == DEVOURING_PLAGUE_1 || baseId == VAMPIRIC_TOUCH_1))\n+                    pctbonus += 0.333f;\n+            }\n+            //Improved Mind Flay and Smite (37571)\n+            if (lvl >= 10 && (baseId == MIND_FLAY_DAMAGE || baseId == SMITE_1))\n+                pctbonus += 0.05f;\n+            //Item - Priest T8 Shadow 2P Bonus (64906)\n+            if (lvl >= 80 && ((baseId == DEVOURING_PLAGUE_1) || (spellInfo->SpellFamilyFlags[2] & 0x8)))\n+                pctbonus += 0.15f;\n+\n+            //Twin Disciplines (damage part): 5% bonus damage for instant spells\n+            if (lvl >= 10 && !spellInfo->CastTimeEntry)\n+                pctbonus += 0.05f;\n+            //Darkness: 10% bonus damage for shadow spells\n+            if (lvl >= 10 && (spellInfo->GetSchoolMask() & SPELL_SCHOOL_MASK_SHADOW))\n+                pctbonus += 0.1f;\n+            //Improved Shadow Word: Pain: 6% bonus damage for Shadow Word: Pain\n+            if (lvl >= 15 && baseId == SW_PAIN_1)\n+                pctbonus += 0.06f;\n+            //Focused Power part 1: 4% bonus damage for all spells\n+            if ((GetSpec() == BOT_SPEC_PRIEST_DISCIPLINE) && lvl >= 35)\n+                pctbonus += 0.04f;\n+            //Improved Devouring Plague part 1: 15% bonus damage Devouring Plague\n+            if ((GetSpec() == BOT_SPEC_PRIEST_SHADOW) && lvl >= 35 && baseId == DEVOURING_PLAGUE_1)\n+                pctbonus += 0.15f;\n+            //Shadowform: 15% bonus damage for shadow spells (handled)\n+            //if (lvl >= 40 && (spellInfo->GetSchoolMask() & SPELL_SCHOOL_MASK_SHADOW) && me->GetShapeshiftForm() == FORM_SHADOW)\n+            //    pctbonus += 0.15f;\n+            //Misery part 3: 15% bonus damage (from spellpower) for Mind Blast, Mind Flay and Mind Sear\n+            if ((GetSpec() == BOT_SPEC_PRIEST_SHADOW) && lvl >= 45)\n+            {\n+                if (baseId == MIND_BLAST_1 || baseId == MIND_FLAY_DAMAGE || baseId == MIND_SEAR_DAMAGE_1)\n+                    fdamage += me->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_MAGIC) * 0.15f * me->CalculateDefaultCoefficient(spellInfo, DIRECT_DAMAGE) * me->CalculateLevelPenalty(spellInfo);\n+            }\n+\n+            //If target is affected BY SW: Pain\n+            if (lvl >= 20 && (baseId == MIND_BLAST_1 || baseId == MIND_FLAY_DAMAGE) && damageinfo.target &&\n+                damageinfo.target->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_PRIEST, 0x8000, 0x0, 0x0, me->GetGUID()))\n+            {\n+                //Glyph of Mind Flay: 10% damage bonus for Mind Flay\n+                if (baseId == MIND_FLAY_DAMAGE)\n+                    pctbonus += 0.1f;\n+                //Twisted Faith (part 1): 10% bonus damage for Mind Blast and Mind Flay\n+                if ((GetSpec() == BOT_SPEC_PRIEST_SHADOW) && lvl >= 55)\n+                    pctbonus += 0.1f;\n+            }\n+\n+            //Glyph of Shadow Word: Death: 10% bonus damage for Shadow Word: Death on targets below 35% health\n+            if (lvl >= 62 && baseId == SW_DEATH_1 && damageinfo.target->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT))\n+                pctbonus += 0.1f;\n+\n+            //other\n+            if (baseId == SW_DEATH_BACKLASH)\n+            {\n+                //not affected by +%talents\n+                pctbonus = 1.f;\n+                ////T13 Shadow 2P Bonus (Shadow Word: Death), part 2\n+                //if (lvl >= 60) //buffed\n+                //    pctbonus -= 0.95f;\n+                //Pain and Suffering (part 2): 30% reduced backlash damage\n+                if ((GetSpec() == BOT_SPEC_PRIEST_SHADOW) && lvl >= 50)\n+                    pctbonus -= 0.3f;\n+            }\n+\n+            damage = int32(fdamage * (1.0f + pctbonus));\n+        }\n+\n+        void ApplyClassDamageMultiplierHeal(Unit const* victim, float& heal, SpellInfo const* spellInfo, DamageEffectType damagetype, uint32 stack) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+            float pctbonus = 0.0f;\n+            float flat_mod = 0.0f;\n+\n+            //pct mods\n+            //Improved Greater Heal (38411): 5% bonus healing for Greater Heal\n+            if (lvl >= 60 && baseId == HEAL)\n+                pctbonus += 0.05f;\n+            //Priest T9 Healing 2P: 20% bonus healing for Prayer of Mending\n+            if (lvl >= 80 && baseId == PRAYER_OF_MENDING_HEAL)\n+                pctbonus += 0.2f;\n+\n+            //Twin Disciplines (healing part): 5% bonus healing for instant spells\n+            if (lvl >= 10 && !spellInfo->CastTimeEntry)\n+                pctbonus += 0.05f;\n+            //Improved Renew: 15% bonus healing for Renew\n+            if (lvl >= 10 && baseId == RENEW_1)\n+                pctbonus += 0.15f;\n+            //Focused Power part 2: 4% bonus heal for all spells\n+            if ((GetSpec() == BOT_SPEC_PRIEST_DISCIPLINE) && lvl >= 35)\n+                pctbonus += 0.04f;\n+            //Spiritual Healing: 10% bonus healing for all spells\n+            if ((GetSpec() == BOT_SPEC_PRIEST_HOLY) && lvl >= 35)\n+                pctbonus += 0.15f;\n+            //Blessend Resilience part 1: 3% bonus healing for all spells\n+            if ((GetSpec() == BOT_SPEC_PRIEST_HOLY) && lvl >= 40)\n+                pctbonus += 0.03f;\n+            //Empowered Healing: 40% bonus (from spellpower) for Greater Heal and 20% bonus (from spellpower) for Flash Heal and Binding Heal\n+            if ((GetSpec() == BOT_SPEC_PRIEST_HOLY) && lvl >= 45)\n+            {\n+                if (baseId == HEAL)\n+                    flat_mod += me->SpellBaseHealingBonusDone(SPELL_SCHOOL_MASK_MAGIC) * 0.4f * me->CalculateDefaultCoefficient(spellInfo, damagetype) * 1.88f * me->CalculateLevelPenalty(spellInfo) * stack;\n+                else if (baseId == FLASH_HEAL_1/* || baseId == BINDING_HEAL_1*/)\n+                    flat_mod += me->SpellBaseHealingBonusDone(SPELL_SCHOOL_MASK_MAGIC) * 0.2f * me->CalculateDefaultCoefficient(spellInfo, damagetype) * 1.88f * me->CalculateLevelPenalty(spellInfo) * stack;\n+            }\n+            //Empowered Renew (heal bonus part): 15% bonus healing (from spellpower) for Renew\n+            if ((GetSpec() == BOT_SPEC_PRIEST_HOLY) && lvl >= 50 && baseId == RENEW_1)\n+                flat_mod += me->SpellBaseHealingBonusDone(SPELL_SCHOOL_MASK_MAGIC) * 0.15f * me->CalculateDefaultCoefficient(spellInfo, damagetype) * 1.88f * me->CalculateLevelPenalty(spellInfo) * stack;\n+            //Test of Faith: 12% bonus healing on targets at or below 50% health\n+            if ((GetSpec() == BOT_SPEC_PRIEST_HOLY) && lvl >= 50 && GetHealthPCT(victim) <= 50)\n+                pctbonus += 0.12f;\n+            //Divine Providence: 10% bonus healing for Circle of Healing, Binding Heal, Holy Nova, Prayer of Healing, Divine Hymn and Prayer of Mending\n+            if ((GetSpec() == BOT_SPEC_PRIEST_HOLY) && lvl >= 55 &&\n+                ((spellInfo->SpellFamilyFlags[0] & 0x18000200) ||\n+                (spellInfo->SpellFamilyFlags[1] & 0x4) ||\n+                (spellInfo->SpellFamilyFlags[2] & 0x4)))\n+                pctbonus += 0.1f;\n+\n+            //flat mods\n+            //Improved Prayer of Mending: 100 additional heal for Prayer of Mending\n+            if (baseId == PRAYER_OF_MENDING_HEAL)\n+                flat_mod += 100;\n+\n+            heal = heal * (1.0f + pctbonus) + flat_mod;\n+        }\n+\n+        void ApplyClassSpellCostMods(SpellInfo const* spellInfo, int32& cost) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            float fcost = float(cost);\n+            int32 flatbonus = 0;\n+            float pctbonus = 0.0f;\n+\n+            //percent mods\n+            //Inner Focus\n+            if (AuraEffect const* focu = me->GetAuraEffect(INNER_FOCUS_1, 0))\n+                if (focu->IsAffectedOnSpell(spellInfo))\n+                    pctbonus += 1.f;\n+            //Surge of Light\n+            if (AuraEffect const* surg = me->GetAuraEffect(SURGE_OF_LIGHT_BUFF, 1))\n+                if (surg->IsAffectedOnSpell(spellInfo))\n+                    pctbonus += 1.f;\n+\n+            //Reduced Prayer of Healing Cost (38410):\n+            if (lvl >= 60 && baseId == PRAYER_OF_HEALING_1)\n+                pctbonus += 0.1f;\n+            //Greater Heal Cost Reduction (60155):\n+            if (lvl >= 60 && baseId == HEAL)\n+                pctbonus += 0.05f;\n+\n+            //Shadow Focus part 2\n+            if (lvl >= 15 && (spellInfo->GetSchoolMask() & SPELL_SCHOOL_MASK_SHADOW))\n+                pctbonus += 0.06f;\n+            //Absolution:\n+            if ((GetSpec() == BOT_SPEC_PRIEST_DISCIPLINE) && lvl >= 25 && (spellInfo->SpellFamilyFlags[1] & 0x81))\n+                pctbonus += 0.15f;\n+            //Mental Agility:\n+            if ((GetSpec() == BOT_SPEC_PRIEST_DISCIPLINE) && lvl >= 25 && !spellInfo->CastTimeEntry)\n+                pctbonus += 0.1f;\n+            //Improved Healing:\n+            if ((GetSpec() == BOT_SPEC_PRIEST_HOLY) &&\n+                lvl >= 25 && (baseId == HEAL || baseId == DIVINE_HYMN_1 || baseId == PENANCE_HEAL_1))\n+                pctbonus += 0.15f;\n+            //Soul Warding part 2\n+            if ((GetSpec() == BOT_SPEC_PRIEST_DISCIPLINE) && lvl >= 30 && baseId == PW_SHIELD_1)\n+                pctbonus += 0.15f;\n+            //Healing Prayers:\n+            if ((GetSpec() == BOT_SPEC_PRIEST_HOLY) &&\n+                lvl >= 30 && (baseId == PRAYER_OF_HEALING_1 || baseId == PRAYER_OF_MENDING_1))\n+                pctbonus += 0.2f;\n+            //Focused Mind\n+            if ((GetSpec() == BOT_SPEC_PRIEST_SHADOW) &&\n+                lvl >= 30 && (baseId == MIND_BLAST_1 || baseId == MIND_FLAY_1 ||\n+                baseId == MIND_SEAR_1/* || baseId == MIND_CONTROL_1*/))\n+                pctbonus += 0.15f;\n+            //Improved Flash Heal part 1\n+            if ((GetSpec() == BOT_SPEC_PRIEST_HOLY) && lvl >= 40 && baseId == FLASH_HEAL_1)\n+                pctbonus += 0.15f;\n+\n+            //Glyph of Fading\n+            if (lvl >= 15 && baseId == FADE_1)\n+                pctbonus += 0.3f;\n+            //Glyph of Fortitude\n+            if (lvl >= 15 && baseId == PW_FORTITUDE_1)\n+                pctbonus += 0.5f;\n+            //Glyph of Flash Heal\n+            if (lvl >= 20 && baseId == FLASH_HEAL_1)\n+                pctbonus += 0.1f;\n+            //Glyph of Mass Dispel\n+            if (lvl >= 70 && baseId == MASS_DISPEL_1)\n+                pctbonus += 0.35f;\n+\n+            //flat mods\n+            //Cleanse Cost Reduced (id: 27847): -25 mana cost for Cleanse\n+            //if (lvl >= 40 && spellId == GetSpell(CLEANSE_1))\n+            //    flatbonus += 25;\n+\n+            //cost can be < 0\n+            cost = int32(fcost * (1.0f - pctbonus)) - flatbonus;\n+        }\n+\n+        void ApplyClassSpellCastTimeMods(SpellInfo const* spellInfo, int32& casttime) const override\n+        {\n+            //casttime is in milliseconds\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            int32 timebonus = 0;\n+            float pctbonus = 0.0f;\n+\n+            //100% mods\n+            //Surge of Light\n+            if (AuraEffect const* surg = me->GetAuraEffect(SURGE_OF_LIGHT_BUFF, 1))\n+                if (surg->IsAffectedOnSpell(spellInfo))\n+                    pctbonus += 1.f;\n+\n+            //pct mods\n+            //Serendipity: -12% per stack cast time for Prayer of Healing or Greater Heal\n+            if (baseId == GREATER_HEAL_1 || baseId == PRAYER_OF_HEALING_1)\n+            {\n+                if (AuraEffect const* sere = me->GetAuraEffect(SERENDIPITY_BUFF, 0))\n+                    if (sere->IsAffectedOnSpell(spellInfo))\n+                        pctbonus += 0.12f * sere->GetBase()->GetStackAmount();\n+            }\n+\n+            //flat mods\n+            //Improved Prayer of Healing (21339)\n+            if (lvl >= 60 && baseId == PRAYER_OF_HEALING_1)\n+                timebonus += 100;\n+            //Master Healer (15027) rank 5\n+            if (lvl >= 60 && baseId == HEAL)\n+                timebonus += 500;\n+            //Prophesy Flash Heal Bonus (21973) part 1\n+            if (lvl >= 60 && baseId == FLASH_HEAL_1)\n+                timebonus += 100;\n+\n+            //Divine Fury\n+            if (lvl >= 15 && (baseId == HEAL || baseId == SMITE_1 || baseId == HOLY_FIRE_1))\n+                timebonus += 500;\n+            //Focused Power part 3\n+            if ((GetSpec() == BOT_SPEC_PRIEST_DISCIPLINE) && lvl >= 35 && baseId == MASS_DISPEL_1)\n+                timebonus += 1000;\n+            //Improved Mana Burn\n+            //if (lvl >= 35 && baseId == MANA_BURN_1)\n+            //    timebonus += 1000;\n+\n+            //Glyph of Scourge Imprisonment\n+            if (lvl >= 20 && baseId == SHACKLE_UNDEAD_1)\n+                timebonus += 1000;\n+\n+            casttime = std::max<int32>((float(casttime) * (1.0f - pctbonus)) - timebonus, 0);\n+        }\n+\n+        void ApplyClassSpellNotLoseCastTimeMods(SpellInfo const* spellInfo, int32& delayReduce) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchoolMask schools = spellInfo->GetSchoolMask();\n+            uint8 lvl = me->GetLevel();\n+            int32 reduceBonus = 0;\n+\n+            if (lvl >= 10)\n+            {\n+                switch (baseId)\n+                {\n+                    case FLASH_HEAL_1: case LESSER_HEAL_1: case NORMAL_HEAL_1: case GREATER_HEAL_1: case PRAYER_OF_HEALING_1: case PENANCE_1: case DIVINE_HYMN_1:\n+                        reduceBonus += 70;\n+                        break;\n+                    default:\n+                        break;\n+                }\n+            }\n+\n+            delayReduce += reduceBonus;\n+        }\n+\n+        void ApplyClassSpellCooldownMods(SpellInfo const* spellInfo, uint32& cooldown) const override\n+        {\n+            //cooldown is in milliseconds\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            int32 timebonus = 0;\n+            float pctbonus = 0.0f;\n+\n+            //pct mods\n+            //Aspiration\n+            if ((GetSpec() == BOT_SPEC_PRIEST_DISCIPLINE) &&\n+                lvl >= 45 && (baseId == INNER_FOCUS_1 || baseId == POWER_INFUSION_1 || baseId == PAIN_SUPPRESSION_1))\n+                pctbonus += 0.2f;\n+\n+            //flat mods\n+            //Veiled Shadows part 2\n+            //if (lvl >= 25 && baseId == SHADOWFIEND_1)\n+            //    timebonus += 120000;\n+            //Glyph of Dispersion:\n+            if (lvl >= 60 && baseId == DISPERSION_1)\n+                timebonus += 45000;\n+            //Glyph of Penance:\n+            if (lvl >= 60 && baseId == PENANCE_1)\n+                timebonus += 2000;\n+\n+            cooldown = std::max<int32>((float(cooldown) * (1.0f - pctbonus)) - timebonus, 0);\n+        }\n+\n+        void ApplyClassSpellCategoryCooldownMods(SpellInfo const* spellInfo, uint32& cooldown) const override\n+        {\n+            //cooldown is in milliseconds\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            int32 timebonus = 0;\n+            float pctbonus = 0.0f;\n+\n+            //pct mods\n+            //Aspiration\n+            if ((GetSpec() == BOT_SPEC_PRIEST_DISCIPLINE) && lvl >= 45 && baseId == PENANCE_1)\n+                pctbonus += 0.2f;\n+            //Divine Providence:\n+            if ((GetSpec() == BOT_SPEC_PRIEST_HOLY) && lvl >= 55 && baseId == PRAYER_OF_MENDING_1)\n+                pctbonus += 0.3f;\n+\n+            //flat mods\n+            //Quick Fade (18388)\n+            if (lvl >= 40 && baseId == FADE_1)\n+                timebonus += 2000;\n+\n+            //Improved Psychic Scream\n+            if (lvl >= 20 && baseId == PSYCHIC_SCREAM_1)\n+                timebonus += 4000;\n+            //Improved Mind Blast\n+            if (lvl >= 20 && baseId == MIND_BLAST_1)\n+                timebonus += 2500;\n+            //Veiled Shadows part 1\n+            if ((GetSpec() == BOT_SPEC_PRIEST_SHADOW) && lvl >= 25 && baseId == FADE_1)\n+                timebonus += 6000;\n+            //Soul Warding part 1\n+            if ((GetSpec() == BOT_SPEC_PRIEST_DISCIPLINE) && lvl >= 30 && baseId == PW_SHIELD_1)\n+                timebonus += 4000;\n+\n+            //Glyph of Fade\n+            if (lvl >= 15 && baseId == FADE_1)\n+                timebonus += 9000;\n+\n+            cooldown = std::max<int32>((float(cooldown) * (1.0f - pctbonus)) - timebonus, 0);\n+        }\n+\n+        void ApplyClassSpellGlobalCooldownMods(SpellInfo const* spellInfo, float& cooldown) const override\n+        {\n+            //cooldown is in milliseconds\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            float timebonus = 0.0f;\n+            float pctbonus = 0.0f;\n+\n+            //Prophesy Flash Heal Bonus (21973) part 2\n+            if (lvl >= 60 && baseId == FLASH_HEAL_1)\n+                timebonus += 100;\n+\n+            cooldown = (cooldown * (1.0f - pctbonus)) - timebonus;\n+        }\n+\n+        void ApplyClassSpellRadiusMods(SpellInfo const* spellInfo, float& radius) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            float flatbonus = 0.0f;\n+            float pctbonus = 0.0f;\n+\n+            //pct mods\n+            //Holy Reach\n+            if ((GetSpec() == BOT_SPEC_PRIEST_HOLY) &&\n+                lvl >= 25 && ((spellInfo->SpellFamilyFlags[0] & 0x18400200) || (spellInfo->SpellFamilyFlags[2] & 0x4)))\n+                pctbonus += 0.2f;\n+\n+            //flat mods\n+            //Glyph of Mind Sear\n+            if (lvl >= 75 && baseId == MIND_SEAR_DAMAGE_1)\n+                flatbonus += 5.f;\n+\n+            radius = radius * (1.0f + pctbonus) + flatbonus;\n+        }\n+\n+        void ApplyClassSpellRangeMods(SpellInfo const* spellInfo, float& maxrange) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            float flatbonus = 0.0f;\n+            float pctbonus = 0.0f;\n+\n+            //pct mods\n+            //Shadow Reach: +20% range for Shadow Spells\n+            if ((GetSpec() == BOT_SPEC_PRIEST_SHADOW) && lvl >= 25 &&\n+                ((spellInfo->SpellFamilyFlags[0] & 0x682A004) ||\n+                (spellInfo->SpellFamilyFlags[1] & 0x300502) ||\n+                (spellInfo->SpellFamilyFlags[2] & 0x2040)))\n+                pctbonus += 0.2f;\n+            //Holy Reach: +20% range for Holy Spells\n+            if ((GetSpec() == BOT_SPEC_PRIEST_HOLY) && lvl >= 25 && (spellInfo->SpellFamilyFlags[0] & 0x100080))\n+                pctbonus += 0.2f;\n+\n+            //flat mods\n+            //Glyph of Shackle Undead: +5 yd range for Shackle Undead\n+            if (lvl >= 20 && baseId == SHACKLE_UNDEAD_1)\n+                flatbonus += 5.f;\n+\n+            maxrange = maxrange * (1.0f + pctbonus) + flatbonus;\n+        }\n+\n+        void ApplyClassSpellMaxTargetsMods(SpellInfo const* spellInfo, uint32& targets) const override\n+        {\n+            uint32 bonusTargets = 0;\n+\n+            //Glyph of Circle of Healing: + 1 target\n+            if (spellInfo->SpellFamilyFlags[0] & 0x10000000)\n+                bonusTargets += 1;\n+\n+            targets = targets + bonusTargets;\n+        }\n+\n+        void ApplyClassEffectMods(SpellInfo const* spellInfo, uint8 effIndex, float& value) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+            float pctbonus = 1.0f;\n+\n+            //Improved Power Word: Fortitude\n+            if (lvl >= 15 && baseId == PW_FORTITUDE_1 && effIndex == EFFECT_0)\n+                pctbonus *= 1.3f;\n+            if (lvl >= 20 && baseId == PW_SHIELD_1 && effIndex == EFFECT_0)\n+            {\n+                //Improved PWSH: +15% effect\n+                pctbonus *= 1.15f;\n+                //Borrowed Time: +40% of spellpower\n+                if (GetSpec() == BOT_SPEC_PRIEST_DISCIPLINE && lvl >= 55)\n+                    value += me->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_MAGIC) * 0.4f;\n+            }\n+\n+            value = value * pctbonus;\n+        }\n+\n+        void OnClassSpellGo(SpellInfo const* spellInfo) override\n+        {\n+            //Surge of Light\n+            //Inner Focus\n+            AuraEffect const* surg = me->GetAuraEffect(SURGE_OF_LIGHT_BUFF, 1);\n+            AuraEffect const* focu = me->GetAuraEffect(INNER_FOCUS_1, 0);\n+            if (surg && surg->IsAffectedOnSpell(spellInfo))\n+                me->RemoveAurasDueToSpell(SURGE_OF_LIGHT_BUFF);\n+            else if (focu && focu->IsAffectedOnSpell(spellInfo))\n+                me->RemoveAurasDueToSpell(INNER_FOCUS_1);\n+\n+            //Serendipity\n+            if (AuraEffect const* sere = me->GetAuraEffect(SERENDIPITY_BUFF, 0))\n+                if (sere->IsAffectedOnSpell(spellInfo))\n+                    me->RemoveAurasDueToSpell(SERENDIPITY_BUFF);\n+        }\n+\n+        void SpellHitTarget(Unit* wtarget, SpellInfo const* spell) override\n+        {\n+            Unit* target = wtarget->ToUnit();\n+            if (!target)\n+                return;\n+\n+            uint32 spellId = spell->Id;\n+            uint32 baseId = spell->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+\n+            //Glyph of Hymn of Hope: +2 sec duration\n+            if (lvl >= 60 && (baseId == HYMN_OF_HOPE_1 || baseId == HYMN_OF_HOPE_BUFF))\n+            {\n+                if (Aura* hymn = target->GetAura(spellId))\n+                {\n+                    hymn->SetDuration(hymn->GetDuration() + 2000);\n+                    hymn->SetDuration(hymn->GetMaxDuration() + 2000);\n+                }\n+            }\n+            //Priest T9 Shadow 2P Bonus (67193)\n+            if (lvl >= 80 && baseId == VAMPIRIC_TOUCH_1)\n+            {\n+                if (Aura* touc = target->GetAura(spellId))\n+                {\n+                    uint32 dur = touc->GetMaxDuration() + 6000;\n+                    touc->SetDuration(dur);\n+                    touc->SetMaxDuration(dur);\n+                }\n+            }\n+\n+            //Improved Mind Blast part 2\n+            if ((GetSpec() == BOT_SPEC_PRIEST_SHADOW) && lvl >= 20 && baseId == MIND_BLAST_1)\n+                me->CastSpell(target, IMPROVED_MIND_BLAST_DEBUFF, true);\n+\n+            //Weakened Soul Reduction (id: 33333): -2 sec to Weakened Soul duration\n+            if (lvl >= 51 && baseId == WEAKENED_SOUL_DEBUFF)\n+            {\n+                if (Aura* soul = target->GetAura(spellId))\n+                {\n+                    uint32 dur = soul->GetMaxDuration() - 2000;\n+                    soul->SetDuration(dur);\n+                    soul->SetMaxDuration(dur);\n+                }\n+            }\n+            //Pain and Suffering (part 1): 100% to refresh Shadow Word: Pain on target hit by Mind Flay\n+            if ((GetSpec() == BOT_SPEC_PRIEST_SHADOW) && lvl >= 50 && baseId == MIND_FLAY_1 && GetSpell(SW_PAIN_1))\n+                if (Aura* pain = target->GetAura(GetSpell(SW_PAIN_1), me->GetGUID()))\n+                    pain->RefreshDuration();\n+            if (baseId == FEAR_WARD_1)\n+            {\n+                //2 minutes bonus duration for Fear Ward\n+                if (Aura* ward = target->GetAura(spellId, me->GetGUID()))\n+                {\n+                    uint32 dur = ward->GetDuration() + 120000;\n+                    ward->SetDuration(dur);\n+                    ward->SetMaxDuration(dur);\n+                }\n+            }\n+            //buffs duration\n+            if (baseId == INNER_FIRE_1 || baseId == VAMPIRIC_EMBRACE_1 || baseId == PW_FORTITUDE_1 ||\n+                baseId == SHADOW_PROTECTION_1 || baseId == DIVINE_SPIRIT_1)\n+            {\n+                //1 hour duration for all buffs\n+                if (Aura* buff = target->GetAura(spellId, me->GetGUID()))\n+                {\n+                    uint32 dur = HOUR * IN_MILLISECONDS;\n+                    buff->SetDuration(dur);\n+                    buff->SetMaxDuration(dur);\n+                }\n+            }\n+\n+            OnSpellHitTarget(target, spell);\n+        }\n+\n+        void SpellHit(Unit* wcaster, SpellInfo const* spell) override\n+        {\n+            Unit* caster = wcaster->ToUnit();\n+            if (!caster)\n+                return;\n+\n+            uint32 spellId = spell->Id;\n+            uint32 baseId = spell->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+\n+            //Glyph of Inner Fire + Improved Inner Fire:\n+            if (lvl >= 15 && baseId == INNER_FIRE_1)\n+            {\n+                if (Aura* fire = me->GetAura(spellId))\n+                {\n+                    fire->SetCharges(fire->GetCharges() + 12);\n+                    for (auto i : NPCBots::index_array<uint8, MAX_SPELL_EFFECTS>)\n+                        if (AuraEffect* eff = fire->GetEffect(i))\n+                            eff->ChangeAmount(int32(eff->GetAmount() * (i == 0 ? 1.45f*1.5f : 1.45f)));\n+                }\n+            }\n+            //Improved Vampiric Embrace\n+            if ((GetSpec() == BOT_SPEC_PRIEST_SHADOW) && lvl >= 30 && baseId == VAMPIRIC_EMBRACE_1)\n+            {\n+                if (AuraEffect* vamp = me->GetAuraEffect(spellId, 0))\n+                    vamp->ChangeAmount(vamp->GetAmount() + 10); //67% is essentially this\n+            }\n+\n+            OnSpellHit(caster, spell);\n+        }\n+\n+        void DamageDealt(Unit* victim, uint32& damage, DamageEffectType damageType, SpellSchoolMask damageSchoolMask) override\n+        {\n+            bot_ai::DamageDealt(victim, damage, damageType, damageSchoolMask);\n+        }\n+\n+        void DamageTaken(Unit* u, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellSchoolMask /*schoolMask*/) override\n+        {\n+            if (!u)\n+                return;\n+            if (!u->IsInCombat() && !me->IsInCombat())\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void OwnerAttackedBy(Unit* u) override\n+        {\n+            if (!u)\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        float GetSpellAttackRange(bool longRange) const override\n+        {\n+            return longRange ? CalcSpellMaxRange(MIND_FLAY_1) : 20.f;\n+        }\n+\n+        void SummonBotPet(Unit* target)\n+        {\n+            if (botPet)\n+                UnsummonAll(false);\n+\n+            uint32 entry = BOT_PET_SHADOWFIEND;\n+\n+            //Position pos;\n+\n+            //15 sec duration\n+            Creature* myPet = me->SummonCreature(entry, *me, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5000);\n+            //me->GetNearPoint(myPet, pos.m_positionX, pos.m_positionY, pos.m_positionZ, 0, 2, me->GetOrientation());\n+            //myPet->GetMotionMaster()->MovePoint(me->GetMapId(), pos);\n+            myPet->SetCreator(master);\n+            myPet->SetOwnerGUID(me->GetGUID());\n+            myPet->SetFaction(master->GetFaction());\n+            myPet->SetControlledByPlayer(!IAmFree());\n+            myPet->SetPvP(me->IsPvP());\n+            myPet->SetByteValue(UNIT_FIELD_BYTES_2, 1, master->GetByteValue(UNIT_FIELD_BYTES_2, 1));\n+            myPet->SetUInt32Value(UNIT_CREATED_BY_SPELL, SHADOWFIEND_1);\n+\n+            botPet = myPet;\n+\n+            myPet->Attack(target, true);\n+            if (!HasBotCommandState(BOT_COMMAND_MASK_UNCHASE))\n+                myPet->GetMotionMaster()->MoveChase(target);\n+        }\n+\n+        void UnsummonAll(bool savePets = true) override\n+        {\n+            UnsummonPet(savePets);\n+        }\n+\n+        void SummonedCreatureDies(Creature* /*summon*/, Unit* /*killer*/) override\n+        {\n+        }\n+\n+        void SummonedCreatureDespawn(Creature* summon) override\n+        {\n+            //BOT_LOG_ERROR(\"entities.unit\", \"SummonedCreatureDespawn: %s's %s\", me->GetName().c_str(), summon->GetName().c_str());\n+            if (summon == botPet)\n+                botPet = nullptr;\n+        }\n+\n+        uint32 GetAIMiscValue(uint32 data) const override\n+        {\n+            switch (data)\n+            {\n+                case BOTAI_MISC_PET_TYPE:\n+                    return BOT_PET_SHADOWFIEND;\n+                default:\n+                    return 0;\n+            }\n+        }\n+\n+        void Reset() override\n+        {\n+            UnsummonAll(false);\n+\n+            Shackle_Timer = 0;\n+            Mend_Timer = 0;\n+\n+            DispelcheckTimer = 0;\n+            DevcheckTimer = 0;\n+            ShackcheckTimer = 0;\n+\n+            Devcheck = false;\n+            Shackcheck = false;\n+\n+            DefaultInit();\n+        }\n+\n+        void ReduceCD(uint32 diff) override\n+        {\n+            if (Shackle_Timer > diff)               Shackle_Timer -= diff;\n+            if (Mend_Timer > diff)                  Mend_Timer -= diff;\n+\n+            if (DispelcheckTimer > diff)            DispelcheckTimer -= diff;\n+            if (DevcheckTimer > diff)               DevcheckTimer -= diff;\n+            if (ShackcheckTimer > diff)             ShackcheckTimer -= diff;\n+        }\n+\n+        void InitPowers() override\n+        {\n+            me->SetPowerType(POWER_MANA);\n+        }\n+\n+        void InitSpells() override\n+        {\n+            uint8 lvl = me->GetLevel();\n+            bool isDisc = GetSpec() == BOT_SPEC_PRIEST_DISCIPLINE;\n+            bool isHoly = GetSpec() == BOT_SPEC_PRIEST_HOLY;\n+            bool isShad = GetSpec() == BOT_SPEC_PRIEST_SHADOW;\n+\n+            InitSpellMap(DISPEL_MAGIC_1);\n+            InitSpellMap(MASS_DISPEL_1);\n+            InitSpellMap(CURE_DISEASE_1);\n+            InitSpellMap(ABOLISH_DISEASE_1);\n+            InitSpellMap(FEAR_WARD_1);\n+            InitSpellMap(PSYCHIC_SCREAM_1);\n+            InitSpellMap(FADE_1);\n+            InitSpellMap(MIND_SEAR_1);\n+            InitSpellMap(SHACKLE_UNDEAD_1);\n+            InitSpellMap(GREATER_HEAL_1);\n+            InitSpellMap(NORMAL_HEAL_1);\n+            InitSpellMap(LESSER_HEAL_1);\n+            InitSpellMap(RENEW_1);\n+            InitSpellMap(FLASH_HEAL_1);\n+            InitSpellMap(PRAYER_OF_HEALING_1);\n+            InitSpellMap(DIVINE_HYMN_1);\n+            InitSpellMap(PRAYER_OF_MENDING_1);\n+            InitSpellMap(RESURRECTION_1);\n+            InitSpellMap(PW_SHIELD_1);\n+            InitSpellMap(INNER_FIRE_1);\n+            InitSpellMap(PW_FORTITUDE_1);\n+            InitSpellMap(SHADOW_PROTECTION_1);\n+            InitSpellMap(DIVINE_SPIRIT_1);\n+            InitSpellMap(HOLY_FIRE_1);\n+            InitSpellMap(SMITE_1);\n+            InitSpellMap(SW_PAIN_1);\n+            InitSpellMap(MIND_BLAST_1);\n+            InitSpellMap(SW_DEATH_1);\n+            InitSpellMap(DEVOURING_PLAGUE_1);\n+            InitSpellMap(HYMN_OF_HOPE_1);\n+            InitSpellMap(LEVITATE_1);\n+            InitSpellMap(SHADOWFIEND_1); //not casted\n+\n+  /*Talent*/lvl >= 20 && isDisc ? InitSpellMap(INNER_FOCUS_1) : RemoveSpell(INNER_FOCUS_1);\n+  /*Talent*/lvl >= 40 && isDisc ? InitSpellMap(POWER_INFUSION_1) : RemoveSpell(POWER_INFUSION_1);\n+  /*Talent*/lvl >= 50 && isDisc ? InitSpellMap(PAIN_SUPPRESSION_1) : RemoveSpell(PAIN_SUPPRESSION_1);\n+  /*Talent*/lvl >= 60 && isDisc ? InitSpellMap(PENANCE_1) : RemoveSpell(PENANCE_1);\n+\n+  /*Talent*/lvl >= 20 && isHoly ? InitSpellMap(DESPERATE_PRAYER_1) : RemoveSpell(DESPERATE_PRAYER_1);\n+  /*Talent*/lvl >= 50 && isHoly ? InitSpellMap(CIRCLE_OF_HEALING_1) : RemoveSpell(CIRCLE_OF_HEALING_1);\n+  /*Talent*/lvl >= 60 && isHoly ? InitSpellMap(GUARDIAN_SPIRIT_1) : RemoveSpell(GUARDIAN_SPIRIT_1);\n+\n+  /*Talent*/lvl >= 20 && isShad ? InitSpellMap(MIND_FLAY_1) : RemoveSpell(MIND_FLAY_1);\n+  /*Talent*/lvl >= 30 && isShad ? InitSpellMap(SILENCE_1) : RemoveSpell(SILENCE_1);\n+  /*Talent*/lvl >= 30 && isShad ? InitSpellMap(VAMPIRIC_EMBRACE_1) : RemoveSpell(VAMPIRIC_EMBRACE_1);\n+  /*Talent*/lvl >= 40 && isShad ? InitSpellMap(SHADOWFORM_1) : RemoveSpell(SHADOWFORM_1);\n+  /*Talent*/lvl >= 50 && isShad ? InitSpellMap(VAMPIRIC_TOUCH_1) : RemoveSpell(VAMPIRIC_TOUCH_1);\n+  /*Talent*/lvl >= 50 && isShad ? InitSpellMap(PSYCHIC_HORROR_1) : RemoveSpell(PSYCHIC_HORROR_1);\n+  /*Talent*/lvl >= 60 && isShad ? InitSpellMap(DISPERSION_1) : RemoveSpell(DISPERSION_1);\n+\n+            HEAL = GetSpell(GREATER_HEAL_1) ? GREATER_HEAL_1 :\n+                GetSpell(NORMAL_HEAL_1) ? NORMAL_HEAL_1 :\n+                GetSpell(LESSER_HEAL_1) ? LESSER_HEAL_1 : 0;\n+        }\n+\n+        void ApplyClassPassives() const override\n+        {\n+            uint8 level = master->GetLevel();\n+            bool isDisc = GetSpec() == BOT_SPEC_PRIEST_DISCIPLINE;\n+            bool isHoly = GetSpec() == BOT_SPEC_PRIEST_HOLY;\n+            bool isShad = GetSpec() == BOT_SPEC_PRIEST_SHADOW;\n+\n+            RefreshAura(UNBREAKABLE_WILL, level >= 10 ? 1 : 0);\n+            RefreshAura(MEDITATION, level >= 20 ? 1 : 0);\n+            RefreshAura(RENEWED_HOPE, isDisc && level >= 45 ? 1 : 0);\n+            RefreshAura(RAPTURE, isDisc && level >= 45 ? 1 : 0);\n+            RefreshAura(DIVINE_AEGIS, isDisc && level >= 50 ? 1 : 0);\n+            RefreshAura(GRACE, isDisc && level >= 50 ? 1 : 0);\n+            RefreshAura(BORROWED_TIME, isDisc && level >= 55 ? 1 : 0);\n+\n+            RefreshAura(INSPIRATION3, isHoly && level >= 25 ? 1 : 0);\n+            RefreshAura(INSPIRATION2, isHoly && level >= 23 && level < 25 ? 1 : 0);\n+            RefreshAura(INSPIRATION1, isHoly && level >= 20 && level < 23 ? 1 : 0);\n+            RefreshAura(SURGE_OF_LIGHT, isHoly && level >= 35 ? 1 : 0);\n+            RefreshAura(HOLY_CONCENTRATION, isHoly && level >= 40 ? 1 : 0);\n+            RefreshAura(BODY_AND_SOUL1, isHoly && level >= 45 ? 1 : 0);\n+            RefreshAura(SERENDIPITY, isHoly && level >= 45 ? 1 : 0);\n+            RefreshAura(EMPOWERED_RENEW3, isHoly && level >= 55 ? 1 : 0);\n+            RefreshAura(EMPOWERED_RENEW2, isHoly && level >= 53 && level < 55 ? 1 : 0);\n+            RefreshAura(EMPOWERED_RENEW1, isHoly && level >= 50 && level < 53 ? 1 : 0);\n+\n+            RefreshAura(SPIRIT_TAP, isShad && level >= 10 ? 1 : 0);\n+            RefreshAura(IMPROVED_SPIRIT_TAP, isShad && level >= 10 ? 1 : 0);\n+            RefreshAura(SHADOW_WEAVING3, isShad && level >= 30 ? 1 : 0);\n+            RefreshAura(SHADOW_WEAVING2, isShad && level >= 28 && level < 30 ? 1 : 0);\n+            RefreshAura(SHADOW_WEAVING1, isShad && level >= 25 && level < 28 ? 1 : 0);\n+            RefreshAura(IMPROVED_DEVOURING_PLAGUE, isShad && level >= 35 ? 1 : 0);\n+            RefreshAura(IMPROVED_SHADOWFORM, isShad && level >= 45 ? 1 : 0);\n+            RefreshAura(MISERY3, isShad && level >= 50 ? 1 : 0);\n+            RefreshAura(MISERY2, isShad && level >= 48 && level < 50 ? 1 : 0);\n+            RefreshAura(MISERY1, isShad && level >= 45 && level < 48 ? 1 : 0);\n+\n+            //RefreshAura(GLYPH_SW_PAIN, level >= 15 ? 1 : 0);\n+            RefreshAura(GLYPH_PW_SHIELD, level >= 15 ? 1 : 0);\n+            RefreshAura(GLYPH_DISPEL_MAGIC, level >= 18 ? 1 : 0);\n+            RefreshAura(GLYPH_PRAYER_OF_HEALING, level >= 30 ? 1 : 0);\n+            RefreshAura(GLYPH_SHADOW, level >= 30 ? 1 : 0);\n+            RefreshAura(PRIEST_T10_2P_BONUS, level >= 70 ? 1 : 0);\n+        }\n+\n+        bool CanUseManually(uint32 basespell) const override\n+        {\n+            switch (basespell)\n+            {\n+                case MASS_DISPEL_1:\n+                case ABOLISH_DISEASE_1:\n+                case PAIN_SUPPRESSION_1:\n+                case FADE_1:\n+                case PENANCE_1:\n+                case VAMPIRIC_EMBRACE_1:\n+                case DISPERSION_1:\n+                case GUARDIAN_SPIRIT_1:\n+                case RENEW_1:\n+                case PRAYER_OF_HEALING_1:\n+                case CIRCLE_OF_HEALING_1:\n+                case DIVINE_HYMN_1:\n+                case PRAYER_OF_MENDING_1:\n+                case PW_SHIELD_1:\n+                case INNER_FIRE_1:\n+                case PW_FORTITUDE_1:\n+                case SHADOW_PROTECTION_1:\n+                case DIVINE_SPIRIT_1:\n+                case FEAR_WARD_1:\n+                case FLASH_HEAL_1:\n+                case GREATER_HEAL_1:\n+                case LEVITATE_1:\n+                    return true;\n+                case NORMAL_HEAL_1:\n+                    return !GetSpell(GREATER_HEAL_1);\n+                case LESSER_HEAL_1:\n+                    return !GetSpell(NORMAL_HEAL_1) && !GetSpell(GREATER_HEAL_1);\n+                case SHADOWFORM_1:\n+                    return me->GetShapeshiftForm() != FORM_SHADOW;\n+                default:\n+                    return false;\n+            }\n+        }\n+\n+        std::vector<uint32> const* GetDamagingSpellsList() const override\n+        {\n+            return &Priest_spells_damage;\n+        }\n+        std::vector<uint32> const* GetCCSpellsList() const override\n+        {\n+            return &Priest_spells_cc;\n+        }\n+        std::vector<uint32> const* GetHealingSpellsList() const override\n+        {\n+            return &Priest_spells_heal;\n+        }\n+        std::vector<uint32> const* GetSupportSpellsList() const override\n+        {\n+            return &Priest_spells_support;\n+        }\n+\n+        void InitHeals() override\n+        {\n+            SpellInfo const* spellInfo;\n+            if (InitSpell(me, HEAL))\n+            {\n+                spellInfo = sSpellMgr->GetSpellInfo(InitSpell(me, HEAL));\n+                _heals[HEAL] = me->SpellHealingBonusDone(me, spellInfo, spellInfo->Effects[0].CalcValue(me), DamageEffectType::HEAL, 0);\n+            }\n+            else\n+                _heals[HEAL] = 0;\n+\n+            if (InitSpell(me, FLASH_HEAL_1))\n+            {\n+                spellInfo = sSpellMgr->GetSpellInfo(InitSpell(me, FLASH_HEAL_1));\n+                _heals[FLASH_HEAL_1] = me->SpellHealingBonusDone(me, spellInfo, spellInfo->Effects[0].CalcValue(me), DamageEffectType::HEAL, 0);\n+            }\n+            else\n+                _heals[FLASH_HEAL_1] = 0;\n+\n+            if (InitSpell(me, PENANCE_HEAL_1))\n+            {\n+                spellInfo = sSpellMgr->GetSpellInfo(InitSpell(me, PENANCE_HEAL_1));\n+                _heals[PENANCE_1] = me->SpellHealingBonusDone(me, spellInfo, spellInfo->Effects[0].CalcValue(me), DamageEffectType::HEAL, 0);\n+            }\n+            else\n+                _heals[PENANCE_1] = 0;\n+\n+            if (InitSpell(me, DESPERATE_PRAYER_1))\n+            {\n+                spellInfo = sSpellMgr->GetSpellInfo(InitSpell(me, DESPERATE_PRAYER_1));\n+                _heals[DESPERATE_PRAYER_1] = me->SpellHealingBonusDone(me, spellInfo, spellInfo->Effects[0].CalcValue(me), DamageEffectType::HEAL, 0);\n+            }\n+            else\n+                _heals[DESPERATE_PRAYER_1] = 0;\n+        }\n+\n+    private:\n+        uint32 HEAL;\n+        uint32 Shackle_Timer, Mend_Timer, DispelcheckTimer, DevcheckTimer, ShackcheckTimer;\n+/*Misc*/bool Devcheck, Shackcheck;\n+\n+        using HealMap = std::unordered_map<uint32 /*baseId*/, int32 /*amount*/>;\n+        HealMap _heals;\n+    };\n+};\n+\n+void AddSC_priest_bot()\n+{\n+    new priest_bot();\n+}\ndiff --git a/src/server/game/AI/NpcBots/bot_rogue_ai.cpp b/src/server/game/AI/NpcBots/bot_rogue_ai.cpp\nnew file mode 100644\nindex 0000000000..42ef7f0454\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bot_rogue_ai.cpp\n@@ -0,0 +1,2053 @@\n+#include \"bot_ai.h\"\n+#include \"botmgr.h\"\n+#include \"bottext.h\"\n+#include \"bottraits.h\"\n+#include \"Creature.h\"\n+#include \"Group.h\"\n+#include \"Item.h\"\n+#include \"Map.h\"\n+#include \"MotionMaster.h\"\n+#include \"Player.h\"\n+#include \"ScriptMgr.h\"\n+#include \"SpellAuraEffects.h\"\n+#include \"Spell.h\"\n+#include \"SpellMgr.h\"\n+#include \"WorldSession.h\"\n+/*\n+Rogue NpcBot (reworked by Trickerer onlysuffering@gmail.com)\n+Complete - 90%\n+TODO:\n+*/\n+\n+enum RogueBaseSpells\n+{\n+    KICK_1                              = 1766,\n+    EXPOSE_ARMOR_1                      = 8647, //NYI\n+    FEINT_1                             = 1966,\n+    DISMANTLE_1                         = 51722,\n+\n+    BACKSTAB_1                          = 53,\n+    SINISTER_STRIKE_1                   = 1752,\n+    EVISCERATE_1                        = 2098,\n+    ENVENOM_1                           = 32645,\n+    RUPTURE_1                           = 1943,\n+    MUTILATE_1                          = 1329,\n+    HEMORRHAGE_1                        = 16511,\n+    GHOSTLY_STRIKE_1                    = 14278,\n+    RIPOSTE_1                           = 14251,\n+    DEADLY_THROW_1                      = 26679,\n+    FAN_OF_KNIVES_1                     = 51723,\n+\n+    SPRINT_1                            = 2983,\n+    EVASION_1                           = 5277,\n+    BLIND_1                             = 2094,\n+    VANISH_1                            = 1856,\n+    COLD_BLOOD_1                        = 14177,\n+    HUNGER_FOR_BLOOD_1                  = 51662,\n+    ADRENALINE_RUSH_1                   = 13750,\n+    KILLING_SPREE_1                     = 51690,\n+    PREPARATION_1                       = 14185,\n+    PREMEDITATION_1                     = 14183,\n+\n+    GOUGE_1                             = 1776,\n+\n+    KIDNEY_SHOT_1                       = 408,\n+    SLICE_DICE_1                        = 5171,\n+    BLADE_FLURRY_1                      = 13877,\n+    SHADOWSTEP_1                        = 36554,\n+    CLOAK_OF_SHADOWS_1                  = 31224,\n+    TRICKS_OF_THE_TRADE_1               = 57934,\n+    SHADOW_DANCE_1                      = 51713,\n+\n+    STEALTH_1                           = 1784,\n+    SAP_1                               = 6770, //NYI\n+    GARROTE_1                           = 703,\n+    CHEAP_SHOT_1                        = 1833,\n+    AMBUSH_1                            = 8676,\n+\n+    DISTRACT_1                          = 1725, //NYI\n+    DISARM_TRAP_1                       = 1842, //Unused, see bot_ai::ProcessImmediateNonAttackTarget()\n+\n+    //Poisons\n+    CRIPPLING_POISON_1                  = 3408,\n+    INSTANT_POISON_1                    = 8679,\n+    DEADLY_POISON_1                     = 2823,\n+    WOUND_POISON_1                      = 13219,\n+    MIND_NUMBING_POISON_1               = 5761, //manual use only\n+    ANESTHETIC_POISON_1                 = 26785,\n+\n+    PICK_LOCK_1                         = 1804\n+};\n+\n+enum RoguePassives\n+{\n+    //Talents\n+    SEAL_FATE1                          = 14189,\n+    SEAL_FATE2                          = 14190,\n+    SEAL_FATE3                          = 14193,\n+    SEAL_FATE4                          = 14194,\n+    SEAL_FATE5                          = 14195,\n+    COMBAT_POTENCY1                     = 35541,\n+    COMBAT_POTENCY2                     = 35550,\n+    COMBAT_POTENCY3                     = 35551,\n+    COMBAT_POTENCY4                     = 35552,\n+    COMBAT_POTENCY5                     = 35553,\n+    QUICK_RECOVERY1                     = 31244,\n+    QUICK_RECOVERY2                     = 31245,\n+    //BLADE_TWISTING1                     = 31124,\n+    //BLADE_TWISTING2                     = 31126,\n+    DEADLY_BREW                         = 51626,//rank 2\n+    IMPROVED_KIDNEY_SHOT                = 14176,//rank 3\n+    VIGOR                               = 14983,\n+    REMORSELESS_ATTACKS                 = 14148,//rank 2\n+    FLEET_FOOTED                        = 31209,//rank 2\n+    MURDER                              = 14159,//rank 2\n+    OVERKILL                            = 58426,\n+    FOCUSED_ATTACKS                     = 51636,//rank 3\n+    MASTER_POISONER                     = 58410,//rank 3\n+    DUAL_WIELD_SPECIALIZATION           = 13852,//rank 5\n+    IMPROVED_KICK                       = 13867,//rank 2\n+    IMPROVED_SPRINT                     = 13875,//rank 2\n+    HACK_AND_SLASH                      = 13964,//rank 5\n+    VITALITY                            = 61329,//rank 3\n+    NERVES_OF_STEEL                     = 31131,//rank 2\n+    THROWING_SPECIALIZATION             = 51679,//rank 2\n+    //SAVAGE_COMBAT                       = 58413,//rank 2\n+    UNFAIR_ADVANTAGE                    = 51674,//rank 2\n+    SURPRISE_ATTACKS                    = 32601,\n+    PREY_ON_THE_WEAK                    = 51689,//rank 5\n+    MASTER_OF_DECEPTION                 = 13971,//rank 3\n+    SETUP                               = 14071,//rank 3\n+    INITIATIVE                          = 13980,//rank 3\n+    DIRTY_DEEDS                         = 14083,//rank 2\n+    MASTER_OF_SUBTLETY                  = 31223,//rank 3\n+    CHEAT_DEATH                         = 31230,//rank 3\n+    ENVELOPING_SHADOWS                  = 31213,//rank 3\n+    TURN_THE_TABLES                     = 51629,//rank 3\n+    HONOR_AMONG_THIEVES                 = 51701,//rank 3\n+\n+    //Other\n+    VIGOR_GLADIATOR                     = 21975,\n+    GLYPH_BACKSTAB                      = 56800,\n+\n+    ROGUE_PASSIVE_DND                   = 21184 //from playercreateinfo_spell\n+};\n+\n+enum RogueSpecial\n+{\n+    MUTILATE_DAMAGE_MAINHAND_1          = 5374,\n+    MUTILATE_DAMAGE_OFFHAND_1           = 27576,\n+\n+    //TURN_THE_TABLES_BUFF                = 52910,//'rank 3'\n+    HUNGER_FOR_BLOOD_BUFF               = 63848,\n+    WAYLAY_DEBUFF                       = 51693,\n+    REMORSELESS_ATTACKS_BUFF            = 14149,\n+    CHEATING_DEATH_BUFF                 = 45182, //hidden\n+    TRICKS_OF_THE_TRADE_BUFF            = 57933,\n+\n+    RELENTLESS_STRIKES_EFFECT           = 14181,\n+    RUTHLESSNESS_EFFECT                 = 14157,\n+    SEAL_FATE_EFFECT                    = 14189,\n+    SETUP_EFFECT                        = 15250,\n+    INITIATIVE_EFFECT                   = 13977,\n+    HONOR_AMONG_THIEVES_EFFECT          = 51699,\n+\n+    VANISH_TRIGGERED_1                  = 11327,\n+    VANISH_TRIGGERED_2                  = 11329,\n+    VANISH_TRIGGERED_3                  = 26888,\n+\n+    //Poisons\n+    CRIPPLING_POISON_PROC_1             = 3409,\n+    //INSTANT_POISON_PROC_1               = 8680,\n+    DEADLY_POISON_PROC_1                = 2818,\n+    WOUND_POISON_PROC_1                 = 13218,\n+    MIND_NUMBING_POISON_PROC_1          = 5760,\n+    //ANESTHETIC_POISON_PROC_1            = 26688,\n+\n+    THISTLE_TEA                         = 9512 //'Restore Energy' 1 min cd\n+};\n+\n+static const std::vector<uint32> Rogue_spells_damage\n+{ AMBUSH_1, BACKSTAB_1, DEADLY_THROW_1, EVISCERATE_1, ENVENOM_1, FAN_OF_KNIVES_1, GARROTE_1, GHOSTLY_STRIKE_1, GOUGE_1,\n+HEMORRHAGE_1, KILLING_SPREE_1, MUTILATE_1, RIPOSTE_1, RUPTURE_1, SINISTER_STRIKE_1 };\n+static const std::vector<uint32> Rogue_spells_cc{ BLIND_1, CHEAP_SHOT_1, /*DEADLY_THROW_1, */DISMANTLE_1, GOUGE_1, KICK_1, KIDNEY_SHOT_1, /*SAP_1*/ };\n+static const std::vector<uint32> Rogue_spells_support\n+{ /*EXPOSE_ARMOR_1, DISTRACT_1, PICK_LOCK_1,*/ STEALTH_1, ADRENALINE_RUSH_1, BLADE_FLURRY_1, CLOAK_OF_SHADOWS_1,\n+COLD_BLOOD_1, DISMANTLE_1, EVASION_1, FEINT_1, HUNGER_FOR_BLOOD_1, PREMEDITATION_1, PREPARATION_1, SHADOW_DANCE_1,\n+SHADOWSTEP_1, SLICE_DICE_1, SPRINT_1, TRICKS_OF_THE_TRADE_1, VANISH_1, DISARM_TRAP_1, THISTLE_TEA,\n+/*CRIPPLING_POISON_1, INSTANT_POISON_1, DEADLY_POISON_1, WOUND_POISON_1, MIND_NUMBING_POISON_1, ANESTHETIC_POISON_1*/ };\n+\n+class rogue_bot : public CreatureScript\n+{\n+public:\n+    rogue_bot() : CreatureScript(\"rogue_bot\") { }\n+\n+    CreatureAI* GetAI(Creature* creature) const override\n+    {\n+        return new rogue_botAI(creature);\n+    }\n+\n+    bool OnGossipHello(Player* player, Creature* creature) override\n+    {\n+        return creature->GetBotAI()->OnGossipHello(player, 0);\n+    }\n+\n+    bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action) override\n+    {\n+        if (bot_ai* ai = creature->GetBotAI())\n+            return ai->OnGossipSelect(player, creature, sender, action);\n+        return true;\n+    }\n+\n+    bool OnGossipSelectCode(Player* player, Creature* creature, uint32 sender, uint32 action, char const* code) override\n+    {\n+        if (bot_ai* ai = creature->GetBotAI())\n+            return ai->OnGossipSelectCode(player, creature, sender, action, code);\n+        return true;\n+    }\n+\n+    struct rogue_botAI : public bot_ai\n+    {\n+        rogue_botAI(Creature* creature) : bot_ai(creature)\n+        {\n+            _botclass = BOT_CLASS_ROGUE;\n+\n+            mhEnchantExpireTimer = 1;\n+            ohEnchantExpireTimer = 1;\n+            mhEnchant = 0;\n+            ohEnchant = 0;\n+            needChooseMHEnchant = true;\n+            needChooseOHEnchant = true;\n+\n+            InitUnitFlags();\n+        }\n+\n+        bool doCast(Unit* victim, uint32 spellId)\n+        {\n+            if (CheckBotCast(victim, spellId) != SPELL_CAST_OK)\n+                return false;\n+            return bot_ai::doCast(victim, spellId);\n+        }\n+\n+        void StartAttack(Unit* u, bool force = false)\n+        {\n+            if (!bot_ai::StartAttack(u, force))\n+                return;\n+            GetInPosition(force, u);\n+        }\n+\n+        void JustEngagedWith(Unit* u) override { bot_ai::JustEngagedWith(u); }\n+        void KilledUnit(Unit* u) override { bot_ai::KilledUnit(u); }\n+        void EnterEvadeMode(EvadeReason why = EVADE_REASON_OTHER) override { bot_ai::EnterEvadeMode(why); }\n+        void MoveInLineOfSight(Unit* u) override { bot_ai::MoveInLineOfSight(u); }\n+        void JustDied(Unit* u) override { comboPoints = 0; bot_ai::JustDied(u); }\n+\n+        void getenergy()\n+        {\n+            energy = me->GetPower(POWER_ENERGY);\n+        }\n+\n+        int32 ecost(uint32 spellId) const\n+        {\n+            if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId))\n+                return spellInfo->CalcPowerCost(me, spellInfo->GetSchoolMask());\n+            return 0;\n+        }\n+\n+        void UpdateAI(uint32 diff) override\n+        {\n+            if (combopointsSpent)\n+            {\n+                combopointsSpent = false;\n+                comboPoints = 0;\n+            }\n+\n+            getenergy();\n+\n+            if (!GlobalUpdate(diff))\n+                return;\n+\n+            DoVehicleActions(diff);\n+            if (!CanBotAttackOnVehicle())\n+                return;\n+\n+            if (IsPotionReady())\n+            {\n+                if (GetHealthPCT(me) < 50)\n+                    DrinkPotion(false);\n+            }\n+\n+            CheckRacials(diff);\n+\n+            if (!me->IsInCombat())\n+                DoNonCombatActions(diff);\n+\n+            if (IsCasting())\n+                return;\n+\n+            if (ProcessImmediateNonAttackTarget())\n+                return;\n+\n+            CheckUsableItems(diff);\n+\n+            CheckSprint(diff);\n+            CheckCloakOfShadows(diff);\n+            CheckVanish(diff);\n+\n+            if (!CheckAttackTarget())\n+            {\n+                if (!me->IsInCombat() && Rand() < 5 && me->HasAuraType(SPELL_AURA_MOD_STEALTH) &&\n+                    !me->GetAuraEffect(SPELL_AURA_MOD_INCREASE_SPEED, SPELLFAMILY_ROGUE, 0x800, 0x0, 0x0) && //vanish\n+                    !(!HasRole(BOT_ROLE_DPS) && GetLastWMOArea() == 29476))\n+                    me->RemoveAurasDueToSpell(STEALTH_1);\n+                return;\n+            }\n+\n+            CheckBlind(diff);\n+            CheckPreparation(diff);\n+            CheckTricksOfTheTrade(diff);\n+\n+            Attack(diff);\n+        }\n+\n+        void Attack(uint32 diff)\n+        {\n+            Unit* mytar = opponent ? opponent : disttarget ? disttarget : nullptr;\n+            if (!mytar)\n+                return;\n+\n+            StartAttack(mytar, IsMelee());\n+\n+            CheckAttackState();\n+            if (!me->IsAlive() || !mytar->IsAlive())\n+                return;\n+\n+            float dist = me->GetDistance(mytar);\n+\n+            //Stealth (for Cooldown handling see bot_ai::ReleaseSpellCooldown)\n+            //we don't want rogue to swith into stealth for no purpose\n+            if (IsSpellReady(STEALTH_1, diff, false) && !me->IsInCombat() && !IsTank() && Rand() < 50 && dist < 28 &&\n+                (!me->HasAuraType(SPELL_AURA_PERIODIC_DAMAGE) || (mytar->IsPlayer() && dist < 6)) &&\n+                (me->GetLevel() >= 35 || (energy >= 40 && me->GetLevel() >= 30) || dist > 8) && !IsFlagCarrier(me))\n+            {\n+                if (doCast(me, GetSpell(STEALTH_1)))\n+                {}\n+            }\n+\n+            if (!CanAffectVictimAny(mytar, SPELL_SCHOOL_NORMAL))\n+                return;\n+\n+            bool stealthed = me->HasAuraType(SPELL_AURA_MOD_STEALTH);\n+            bool shadowdance = me->HasAuraType(SPELL_AURA_MOD_IGNORE_SHAPESHIFT);\n+\n+            //Hunger for Blood\n+            if (IsSpellReady(HUNGER_FOR_BLOOD_1, diff) && !shadowdance && HasRole(BOT_ROLE_DPS) && Rand() < 50 && dist < 30 &&\n+                mytar->HasAuraState(AURA_STATE_BLEEDING) && energy >= ecost(HUNGER_FOR_BLOOD_1) &&\n+                !me->GetAuraEffect(SPELL_AURA_MOD_DAMAGE_PERCENT_DONE, SPELLFAMILY_ROGUE, 0x0, 0x1000000, 0x0))\n+            {\n+                if (doCast(mytar, GetSpell(HUNGER_FOR_BLOOD_1)))\n+                    return;\n+            }\n+            //Premeditation\n+            if (IsSpellReady(PREMEDITATION_1, diff, false) && (stealthed || shadowdance) &&\n+                HasRole(BOT_ROLE_DPS) && comboPoints < 4 && dist < 15 &&\n+                (comboPoints == 0 || mytar->GetHealth() > me->GetMaxHealth() / 4))\n+            {\n+                if (doCast(mytar, GetSpell(PREMEDITATION_1)))\n+                {}\n+            }\n+            //Kick\n+            if (IsSpellReady(KICK_1, diff, false) && !stealthed && dist <= 5 && Rand() < 70 &&\n+                energy >= ecost(KICK_1) && mytar->IsNonMeleeSpellCast(false,false,true))\n+            {\n+                if (doCast(mytar, GetSpell(KICK_1)))\n+                    getenergy();\n+            }\n+            //Killing Spree\n+            if (IsSpellReady(KILLING_SPREE_1, diff) && !stealthed && !shadowdance && HasRole(BOT_ROLE_DPS) &&\n+                Rand() < (70 - energy) && dist < 10 && GetHealthPCT(me) > 25 && (!CCed(mytar) || dist > 5) &&\n+                (mytar->getAttackers().size() < 4 || mytar->GetMaxHealth() > me->GetMaxHealth() * 2) &&\n+                (mytar->GetHealth() > me->GetMaxHealth() / 2 || me->getAttackers().size() > 1))\n+            {\n+                if (doCast(mytar, GetSpell(KILLING_SPREE_1)))\n+                    return;\n+            }\n+             //Gouge: if mytar is trying to attack/cast on us he will always try to face us\n+            if (IsSpellReady(GOUGE_1, diff) && !stealthed && !shadowdance && HasRole(BOT_ROLE_DPS) && dist <= 5 &&\n+                Rand() < 30 && !CCed(mytar) && energy >= ecost(GOUGE_1) &&\n+                ((energy < 55 && mytar->getAttackers().size() <= 1 && !mytar->HasAuraType(SPELL_AURA_PERIODIC_DAMAGE)) ||\n+                mytar->IsNonMeleeSpellCast(false,false,true)) && mytar->HasInArc(float(M_PI), me))\n+            {\n+                if (doCast(mytar, GetSpell(GOUGE_1)))\n+                    return;\n+            }\n+            //Blind: in pvp only for restealth\n+            if (IsSpellReady(BLIND_1, diff) && !stealthed && !shadowdance && dist <= 15 && Rand() < 30 &&\n+                !CCed(mytar) && !mytar->IsTotem() && energy >= ecost(BLIND_1) &&\n+                ((energy <= 30 && mytar->GetTarget() == me->GetGUID() &&\n+                mytar->getAttackers().size() <= 1 &&\n+                !mytar->HasAuraType(SPELL_AURA_PERIODIC_DAMAGE) &&\n+                !me->HasAuraType(SPELL_AURA_PERIODIC_DAMAGE)) ||\n+                (mytar->IsCreature() && !IsSpellReady(KICK_1, diff) && !IsSpellReady(GOUGE_1, diff) &&\n+                mytar->IsNonMeleeSpellCast(false,false,true))))\n+            {\n+                if (doCast(mytar, GetSpell(BLIND_1)))\n+                    return;\n+            }\n+            //Blade Flurry\n+            if (IsSpellReady(BLADE_FLURRY_1, diff) && HasRole(BOT_ROLE_DPS) && !stealthed && !shadowdance &&\n+                dist <= 5 && Rand() < 50 && energy >= ecost(BLADE_FLURRY_1) && !CCed(mytar) &&\n+                !me->GetAuraEffect(SPELL_AURA_MOD_MELEE_HASTE, SPELLFAMILY_ROGUE, 0x40000000, 0x800, 0x0) &&\n+                (mytar->IsPlayer() || mytar->GetHealth() > me->GetHealth() || FindSplashTarget(7, mytar)))\n+            {\n+                if (doCast(me, GetSpell(BLADE_FLURRY_1)))\n+                    return;\n+            }\n+            //Slice and Dice\n+            if (IsSpellReady(SLICE_DICE_1, diff) && !shadowdance && HasRole(BOT_ROLE_DPS) && comboPoints > 0 &&\n+                Rand() < 110 && energy >= ecost(SLICE_DICE_1) && dist < 10 &&\n+                (me->getAttackers().size() <= 1 || !IsSpellReady(BLADE_FLURRY_1, diff)) &&\n+                !me->GetAuraEffect(SPELL_AURA_MOD_MELEE_HASTE, SPELLFAMILY_ROGUE, 0x40000, 0x0, 0x0))\n+            {\n+                if (doCast(mytar, GetSpell(SLICE_DICE_1)))\n+                    return;\n+            }\n+            //Dismantle\n+            if (IsSpellReady(DISMANTLE_1, diff) && !stealthed && !shadowdance &&\n+                mytar->GetHealth() >= me->GetHealth() / 2 && energy >= ecost(DISMANTLE_1) && dist <= 5 &&\n+                !CCed(mytar) && Rand() < (30 + 90*mytar->HasAuraType(SPELL_AURA_ALLOW_ONLY_ABILITY)) &&\n+                !mytar->HasAuraType(SPELL_AURA_MOD_DISARM) &&\n+                (mytar->IsPlayer() ?\n+                mytar->ToPlayer()->GetWeaponForAttack(BASE_ATTACK) && mytar->ToPlayer()->GetWeaponForAttack(WeaponAttackType(BASE_ATTACK), true) :\n+                mytar->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID) && mytar->CanUseAttackType(BASE_ATTACK)))\n+            {\n+                if (doCast(mytar, GetSpell(DISMANTLE_1)))\n+                    return;\n+            }\n+            //Shadowstep\n+            if (IsSpellReady(SHADOWSTEP_1, diff, false) && !IsTank() && HasRole(BOT_ROLE_DPS) &&\n+                Rand() < 50 && dist < 25 && energy >= ecost(SHADOWSTEP_1) &&\n+                (!mytar->IsPlayer() || dist > 12 || CCed(me, true)) &&\n+                (mytar->IsPlayer() || mytar->GetVictim() != me) &&\n+                ((!stealthed && !shadowdance) || me->HasAuraWithMechanic(1u<<MECHANIC_SNARE)))\n+            {\n+                if (doCast(mytar, GetSpell(SHADOWSTEP_1)))\n+                    getenergy();\n+            }\n+            //Sprint (no GCD)\n+            if (IsSpellReady(SPRINT_1, diff, false) && !HasBotCommandState(BOT_COMMAND_STAY) &&\n+                ((me->GetLevel() >= 20 && CCed(me, true) && Rand() < 35) ||\n+                (Rand() < (25 + 10*stealthed + 40*shadowdance) && dist > (20 - (5*stealthed + 10*shadowdance)))) &&\n+                !me->GetAuraEffect(SPELL_AURA_MOD_INCREASE_SPEED, SPELLFAMILY_ROGUE, 0x40, 0x0, 0x0))\n+            {\n+                if (doCast(me, GetSpell(SPRINT_1)))\n+                {}\n+            }\n+            //Evasion (no GCD)\n+            if (IsSpellReady(EVASION_1, diff, false) && !stealthed && Rand() < 65 && !me->getAttackers().empty() &&\n+                GetHealthPCT(me) < 65 + 10 * me->getAttackers().size() &&\n+                !me->GetAuraEffect(SPELL_AURA_MOD_DODGE_PERCENT, SPELLFAMILY_ROGUE, 0x20, 0x0, 0x0))\n+            {\n+                if (doCast(me, GetSpell(EVASION_1)))\n+                    return; //custom: do not skip animation\n+            }\n+            //Deadly Throw\n+            if (IsSpellReady(DEADLY_THROW_1, diff) && !stealthed && !shadowdance && HasRole(BOT_ROLE_DPS) &&\n+                comboPoints > 0 && Rand() < 55 && dist < 30 && dist > 5 && energy >= ecost(DEADLY_THROW_1) &&\n+                ((_spec != BOT_SPEC_ROGUE_COMBAT) || mytar->IsNonMeleeSpellCast(false,false,true)))\n+            {\n+                Item const* thrown = GetEquips(BOT_SLOT_RANGED);\n+                if (thrown && thrown->GetTemplate()->Class == ITEM_CLASS_WEAPON &&\n+                    thrown->GetTemplate()->SubClass == ITEM_SUBCLASS_WEAPON_THROWN &&\n+                    doCast(mytar, GetSpell(DEADLY_THROW_1)))\n+                    return;\n+            }\n+\n+            //if target is affected by gouge or blind just try to regen some energy\n+            bool hasnormalstun = false;\n+            int32 duration = 0;\n+            //sizes of theese are typically 1, sometimes maybe 2\n+            for (AuraEffect const* aeff : mytar->GetAuraEffectsByType(SPELL_AURA_MOD_STUN))\n+            {\n+                if (!(aeff->GetSpellInfo()->AuraInterruptFlags & AURA_INTERRUPT_FLAG_TAKE_DAMAGE) && \n+                    aeff->GetBase()->GetDuration() > 2000)\n+                {\n+                    hasnormalstun = true;\n+                    break;\n+                }\n+                if (aeff->GetBase()->GetDuration() > duration)\n+                    duration = aeff->GetBase()->GetDuration();\n+            }\n+            if (!hasnormalstun)\n+            {\n+                for (AuraEffect const* aeff : mytar->GetAuraEffectsByType(SPELL_AURA_MOD_CONFUSE))\n+                {\n+                    if (!(aeff->GetSpellInfo()->AuraInterruptFlags & AURA_INTERRUPT_FLAG_TAKE_DAMAGE) &&\n+                        aeff->GetBase()->GetDuration() > 2000)\n+                    {\n+                        hasnormalstun = true;\n+                        break;\n+                    }\n+                    if (aeff->GetBase()->GetDuration() > duration)\n+                        duration = aeff->GetBase()->GetDuration();\n+                }\n+            }\n+\n+            if (mytar->IsControlledByPlayer() || me->GetHealthPct() < 25.f)\n+            {\n+                //Vanish (no GCD)\n+                if (IsSpellReady(VANISH_1, diff, false) && !stealthed && !shadowdance && !IsTank() && Rand() < 45 && !me->HasAuraType(SPELL_AURA_PERIODIC_DAMAGE) && !IsFlagCarrier(me))\n+                {\n+                    bool cast = false;\n+                    //case 1: restealth for opener\n+                    if (!hasnormalstun && duration < 500 && me->IsInCombat() && dist <= 5)\n+                        cast = true;\n+                    //case 2: evade casted spell\n+                    if (!cast)\n+                    {\n+                        if (Spell const* spell = mytar->GetCurrentSpell(CURRENT_GENERIC_SPELL))\n+                        {\n+                            if (spell->m_targets.GetUnitTarget() == me && spell->GetTimer() < 500 &&\n+                                spell->GetSpellInfo()->HasEffect(SPELL_EFFECT_SCHOOL_DAMAGE))\n+                                cast = true;\n+                        }\n+                    }\n+                    //case 3: reset threat / evade in CheckVanish (regardless of mytar availability)\n+                    if (cast && doCast(me, GetSpell(VANISH_1)))\n+                        return; //custom: do not skip animation\n+                }\n+            }\n+\n+            if (dist > 5)\n+            {\n+                //if (mytar->IsPolymorphed())\n+                //    BOT_LOG_ERROR(\"entities.player\", \"rogue_bot: cannot attack target (dist)...\");\n+                return;\n+            }\n+\n+            MoveBehind(mytar);\n+\n+            if (IsSpellReady(THISTLE_TEA, diff, false) && !hasnormalstun && duration < 1000 &&\n+                energy <= std::max<int32>(me->GetMaxPower(POWER_ENERGY) - 110, 10))\n+            {\n+                if (doCast(me, THISTLE_TEA))\n+                    getenergy();\n+            }\n+\n+            //No IsSpellReady checks for spells with no cd below\n+            if (GC_Timer > diff)\n+                return;\n+\n+            //Feint\n+            if (mytar->CanHaveThreatList())\n+            {\n+                if (IsSpellReady(FEINT_1, diff) && !stealthed && !IsTank() && mytar->GetVictim() == me && Rand() < 35 &&\n+                    energy >= ecost(FEINT_1) && int32(mytar->GetThreatMgr().GetThreatListSize()) > 1 &&\n+                    int32(mytar->getAttackers().size()) > 1)\n+                {\n+                    if (doCast(mytar, GetSpell(FEINT_1)))\n+                        return;\n+                }\n+            }\n+\n+            //Adrenaline Rush\n+            if (GetSpell(ADRENALINE_RUSH_1) && !stealthed && !shadowdance && HasRole(BOT_ROLE_DPS) && (hasnormalstun || duration < 1300) && Rand() < 40 &&\n+                energy < 50 && GetHealthPCT(me) > 35 &&\n+                (mytar->getAttackers().size() < 3 || mytar->GetMaxHealth() > me->GetMaxHealth() * 2) &&\n+                (mytar->GetHealth() > me->GetMaxHealth() / 2 || me->getAttackers().size() > 1))\n+            {\n+                if (doCast(me, GetSpell(ADRENALINE_RUSH_1)))\n+                    return;\n+            }\n+\n+            DiminishingLevels const stunDivider = mytar->GetDiminishing(DIMINISHING_OPENING_STUN);\n+\n+            bool hasHunger = me->GetAuraEffect(SPELL_AURA_MOD_DAMAGE_PERCENT_DONE, SPELLFAMILY_ROGUE, 0x0, 0x1000000, 0x0);\n+\n+            //Rupture: little troll with applying rupture on target without breaking gouge (creatures only, pvp - restealth)\n+            if (GetSpell(RUPTURE_1) && !stealthed && !shadowdance && HasRole(BOT_ROLE_DPS) &&\n+                comboPoints > ((hasHunger || !GetSpell(HUNGER_FOR_BLOOD_1)) ? 1 : 0) &&\n+                !(hasHunger && GetSpec() == BOT_SPEC_ROGUE_ASSASINATION && GetSpell(ENVENOM_1)) &&\n+                (hasnormalstun || (mytar->CanHaveThreatList() && duration < 2000)) &&\n+                (comboPoints < 4 || !GetSpell(KIDNEY_SHOT_1) || stunDivider > DIMINISHING_LEVEL_2) &&\n+                energy >= ecost(RUPTURE_1) && mytar->GetHealth() > me->GetMaxHealth() / 4 * (1 + mytar->getAttackers().size()) &&\n+                Rand() < (40 + 40 * (mytar->IsPlayer() && IsMeleeClass(mytar->GetClass()))) &&\n+                !mytar->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_ROGUE, 0x100000, 0x0, 0x0, me->GetGUID()))\n+            {\n+                if (doCast(mytar, GetSpell(RUPTURE_1)))\n+                    return;\n+            }\n+\n+            if (!hasnormalstun && duration > 300 && uint32(energy) < me->GetMaxPower(POWER_ENERGY))\n+            {\n+                //BOT_LOG_ERROR(\"entities.player\", \"bot_rogue: delaying attacks on gouged or blinded target...\");\n+                return;\n+            }\n+\n+            //Finishers\n+            if (comboPoints > 0)\n+            {\n+                //Kidney Shot\n+                if (GetSpell(KIDNEY_SHOT_1) && !stealthed && stunDivider < DIMINISHING_LEVEL_4 &&\n+                    Rand() < 80 && !CCed(mytar) && !mytar->IsImmunedToSpell(sSpellMgr->GetSpellInfo(KIDNEY_SHOT_1)) &&\n+                    ((comboPoints >= 4 && stunDivider < DIMINISHING_LEVEL_3 &&\n+                    (mytar->GetHealth() > me->GetMaxHealth() / 2 || mytar->IsPlayer())) ||\n+                    mytar->IsNonMeleeSpellCast(false,false,true)) &&\n+                    energy >= ecost(KIDNEY_SHOT_1))\n+                {\n+                    if (doCast(mytar, GetSpell(KIDNEY_SHOT_1)))\n+                        return;\n+                }\n+                //Envenom / Eviscerate\n+                uint32 envescerate = (GetSpec() == BOT_SPEC_ROGUE_ASSASINATION && GetSpell(ENVENOM_1) &&\n+                    (mytar->GetHealth() > me->GetMaxHealth() / 5 || !GetSpell(EVISCERATE_1))) ? ENVENOM_1 : GetSpell(EVISCERATE_1) ? EVISCERATE_1 : 0;\n+                if (envescerate && IsSpellReady(envescerate, diff) && !stealthed && !shadowdance && HasRole(BOT_ROLE_DPS) &&\n+                    (comboPoints >= 4  || (envescerate == EVISCERATE_1 && mytar->GetHealth() < me->GetMaxHealth() / 4)) &&\n+                    (envescerate != ENVENOM_1 ||\n+                    (mytar->GetAuraEffect(SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE, SPELLFAMILY_ROGUE, 0x10000, 0x0, 0x0, me->GetGUID()) &&\n+                    (energy >= 110 || !me->HasAuraTypeWithFamilyFlags(SPELL_AURA_ADD_FLAT_MODIFIER, SPELLFAMILY_ROGUE, 0x800000)))) &&\n+                    energy >= ecost(envescerate) && Rand() < (70 + comboPoints * 20))\n+                {\n+                    //Cold Blood (no GCD)\n+                    if (IsSpellReady(COLD_BLOOD_1, diff, false) && comboPoints > 3 && Rand() > 50 + 100*(comboPoints == 5))\n+                        if (doCast(me, GetSpell(COLD_BLOOD_1)))\n+                        {}\n+                    if (doCast(mytar, GetSpell(envescerate)))\n+                        return;\n+                }\n+            }\n+\n+            //Shadow Dance: if have energy or under effect of Adrenaline Rush\n+            if (IsSpellReady(SHADOW_DANCE_1, diff, false) && !stealthed && HasRole(BOT_ROLE_DPS) && Rand() < 55 &&\n+                GetHealthPCT(me) > 40 && (stunDivider == DIMINISHING_LEVEL_1 || CCed(mytar)) &&\n+                (energy >= 60 || (energy >= 40 && me->GetAuraEffect(SPELL_AURA_MOD_POWER_REGEN_PERCENT, SPELLFAMILY_ROGUE, 0x0, 0x80, 0x0))) &&\n+                (mytar->IsPlayer() || mytar->GetHealth() > (me->GetMaxHealth() / 4) * mytar->getAttackers().size()))\n+            {\n+                if (doCast(me, GetSpell(SHADOW_DANCE_1)))\n+                {}\n+            }\n+\n+            //Openers\n+            if (stealthed || shadowdance)\n+            {\n+                uint32 opener =\n+                    GetSpell(CHEAP_SHOT_1) &&\n+                    !mytar->HasAuraType(SPELL_AURA_MOD_STUN) && stunDivider < DIMINISHING_LEVEL_3 &&\n+                    (mytar->IsPlayer() || (!IAmFree() && master->GetNpcBotsCount() > 1)) ? CHEAP_SHOT_1 :\n+                    GetSpell(GARROTE_1) && HasRole(BOT_ROLE_DPS) && mytar->GetHealth() > me->GetMaxHealth() / 4 &&\n+                    !IsImmunedToMySpellEffect(mytar, sSpellMgr->GetSpellInfo(GARROTE_1), EFFECT_0) &&\n+                    (!isdaggerMH || (mytar->IsPlayer() &&\n+                    (mytar->GetClass() == CLASS_MAGE || mytar->GetClass() == CLASS_PRIEST || mytar->GetClass() == CLASS_WARLOCK))) &&\n+                    !mytar->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_ROGUE, 0x100, 0x0, 0x0, me->GetGUID()) ? GARROTE_1 :\n+                    GetSpell(AMBUSH_1) && HasRole(BOT_ROLE_DPS) && isdaggerMH ? AMBUSH_1 :\n+                    GetSpell(BACKSTAB_1) && HasRole(BOT_ROLE_DPS) && isdaggerMH ? BACKSTAB_1 : 0;\n+\n+                //all opener spells disabled/unusable\n+                if (!opener)\n+                {\n+                    if (stealthed && HasRole(BOT_ROLE_DPS))\n+                        me->RemoveAurasByType(SPELL_AURA_MOD_STEALTH);\n+                    //if (shadowdance)\n+                    //    me->RemoveAurasByType(SPELL_AURA_MOD_IGNORE_SHAPESHIFT);\n+\n+                    return;\n+                }\n+                //openers from behind (backstab too)\n+                if (opener != CHEAP_SHOT_1 && mytar->HasInArc(float(M_PI), me))\n+                    return;\n+\n+                //We do not check combo points amount\n+                if (energy >= ecost(opener))\n+                {\n+                    if (doCast(mytar, GetSpell(opener)))\n+                        return;\n+                }\n+\n+                return;\n+            }\n+\n+            if (!HasRole(BOT_ROLE_DPS))\n+                return;\n+\n+            //Fan of Knives\n+            if (GetSpell(FAN_OF_KNIVES_1) && energy >= ecost(FAN_OF_KNIVES_1) &&\n+                Rand() < 35\n+                + 40*(me->GetAuraEffect(SPELL_AURA_MOD_POWER_REGEN_PERCENT, SPELLFAMILY_ROGUE, 0x0, 0x80, 0x0) != nullptr)\n+                + 50*(me->GetAuraEffect(SPELL_AURA_MOD_MELEE_HASTE, SPELLFAMILY_ROGUE, 0x40000000, 0x0, 0x0) != nullptr)\n+                /*Adrenaline Rush and Blade Flurry*/)\n+            {\n+                std::list<Unit*> targets;\n+                GetNearbyTargetsList(targets, 7.f, 1);\n+                if (targets.size() > 2 && doCast(me, GetSpell(FAN_OF_KNIVES_1)))\n+                    return;\n+            }\n+\n+            //Combo points generating\n+            //Riposte: only after parry\n+            if (IsSpellReady(RIPOSTE_1, diff) && comboPoints < 5 && me->HasReactive(REACTIVE_DEFENSE) &&\n+                energy >= ecost(RIPOSTE_1))\n+            {\n+                if (doCast(mytar, GetSpell(RIPOSTE_1)))\n+                    return;\n+            }\n+            //Ghostly Strike: tank mode only\n+            if (IsSpellReady(GHOSTLY_STRIKE_1, diff) && comboPoints < 5 && IsTank() && !me->getAttackers().empty() &&\n+                energy >= ecost(GHOSTLY_STRIKE_1))\n+            {\n+                if (doCast(mytar, GetSpell(GHOSTLY_STRIKE_1)))\n+                    return;\n+            }\n+            //Hemorrhage: does not stack from different casters\n+            if (GetSpell(HEMORRHAGE_1) && !isdaggerMH && comboPoints < 5 && !IsTank() && energy >= ecost(HEMORRHAGE_1) &&\n+                !mytar->GetAuraEffect(SPELL_AURA_MOD_DAMAGE_TAKEN, SPELLFAMILY_ROGUE, 0x800000, 0x0, 0x0))\n+            {\n+                if (doCast(mytar, GetSpell(HEMORRHAGE_1)))\n+                    return;\n+            }\n+            //Sinister Strike: tank mode\n+            if (GetSpell(SINISTER_STRIKE_1) && comboPoints < 5 &&\n+                (!isdaggerMH || IsTank() || (mytar->GetVictim() == me && energy >= 60 && mytar->HasInArc(float(M_PI), me)) || !GetSpell(BACKSTAB_1)) &&\n+                energy >= ecost(SINISTER_STRIKE_1))\n+            {\n+                if (doCast(mytar, GetSpell(SINISTER_STRIKE_1)))\n+                    return;\n+            }\n+            //Backstab/Mutilate\n+            uint32 mutistab =\n+                isdaggerMH && isdaggerOH && GetSpell(MUTILATE_1) ? MUTILATE_1 :\n+                isdaggerMH && GetSpell(BACKSTAB_1) ? BACKSTAB_1 : 0;\n+            if (mutistab && comboPoints < 4 && energy >= ecost(mutistab) && (mutistab == MUTILATE_1 || !mytar->HasInArc(float(M_PI), me)))\n+            {\n+                if (doCast(mytar, GetSpell(mutistab)))\n+                    return;\n+            }\n+        }\n+\n+        void BreakCC(uint32 diff) override\n+        {\n+            if (me->IsInCombat() && Rand() < 25)\n+            {\n+                bool canVanish = IsSpellReady(VANISH_1, diff, false) && !IsFlagCarrier(me);\n+                bool canSprint = (GetSpec() == BOT_SPEC_ROGUE_COMBAT) && me->GetLevel() >= 25 && !HasBotCommandState(BOT_COMMAND_STAY) && IsSpellReady(SPRINT_1, diff, false);\n+                if ((canVanish || canSprint) && me->HasAuraWithMechanic((1u<<MECHANIC_SNARE)|(1u<<MECHANIC_ROOT)))\n+                {\n+                    uint32 Spanish = canSprint ? SPRINT_1 : VANISH_1;\n+                    if (doCast(me, GetSpell(Spanish)))\n+                        return;\n+                }\n+            }\n+            bot_ai::BreakCC(diff);\n+        }\n+\n+        void DoNonCombatActions(uint32 diff)\n+        {\n+            if (GC_Timer > diff || me->IsMounted() || IsCasting() || Rand() > 25)\n+                return;\n+\n+            if (mhEnchantExpireTimer > 0 && mhEnchantExpireTimer <= diff)\n+                RemoveItemClassEnchantment(BOT_SLOT_MAINHAND);\n+            if (ohEnchantExpireTimer > 0 && ohEnchantExpireTimer <= diff)\n+                RemoveItemClassEnchantment(BOT_SLOT_OFFHAND);\n+\n+            // Weapon Enchants\n+            if (me->isMoving())\n+                return;\n+            uint8 lvl = me->GetLevel();\n+            if (lvl < 20)\n+                return;\n+\n+            Item* mhWeapon = GetEquips(BOT_SLOT_MAINHAND);\n+            Item* ohWeapon = GetEquips(BOT_SLOT_OFFHAND);\n+\n+            bool mhReady = mhWeapon && !mhWeapon->GetEnchantmentId(TEMP_ENCHANTMENT_SLOT);\n+            bool ohReady = ohWeapon && !ohWeapon->GetEnchantmentId(TEMP_ENCHANTMENT_SLOT);\n+            if (!mhReady && !ohReady)\n+                return; //no ecnhantable weapons\n+\n+            //OK choose the poisons\n+            //MH 20+ Instant, 32+ Wound, envenom Instant\n+            //OH 20+ Crippling, 40+ Instant (deadly brew inc), 68+ Anesthetic, envenom Deadly\n+            if (needChooseMHEnchant && mhReady)\n+                mhEnchant = (GetSpec() == BOT_SPEC_ROGUE_ASSASINATION && GetSpell(ENVENOM_1)) ? INSTANT_POISON_1 :\n+                    lvl >= 32 ? WOUND_POISON_1 :\n+                    lvl >= 20 ? INSTANT_POISON_1 : 0;\n+\n+            if (needChooseOHEnchant && ohReady)\n+                ohEnchant = (GetSpec() == BOT_SPEC_ROGUE_ASSASINATION && GetSpell(ENVENOM_1)) ? DEADLY_POISON_1 :\n+                    lvl >= 68 ? ANESTHETIC_POISON_1 :\n+                    lvl >= 40 ? INSTANT_POISON_1 :\n+                    lvl >= 20 ? CRIPPLING_POISON_1 : 0;\n+\n+            uint32 MhPoison = !mhReady ? 0 : GetSpell(mhEnchant);\n+            uint32 OhPoison = !ohReady ? 0 : GetSpell(ohEnchant);\n+\n+            SpellInfo const* MhPoisonInfo = mhReady && MhPoison ? sSpellMgr->GetSpellInfo(MhPoison) : nullptr;\n+            SpellInfo const* OhPoisonInfo = ohReady && OhPoison ? sSpellMgr->GetSpellInfo(OhPoison) : nullptr;\n+\n+            Item* targetWeapon = nullptr;\n+            SpellInfo const* targetInfo = nullptr;\n+\n+            if (mhReady && MhPoison && mhWeapon->IsFitToSpellRequirements(MhPoisonInfo))\n+            {\n+                targetWeapon = mhWeapon;\n+                targetInfo = MhPoisonInfo;\n+            }\n+            if (!targetWeapon && ohReady && OhPoison && ohWeapon->IsFitToSpellRequirements(OhPoisonInfo))\n+            {\n+                targetWeapon = ohWeapon;\n+                targetInfo = OhPoisonInfo;\n+            }\n+            if (targetWeapon)\n+            {\n+                Spell* spell = new Spell(me, targetInfo, TRIGGERED_NONE);\n+                SpellCastTargets targets;\n+                targets.SetItemTarget(targetWeapon);\n+                spell->prepare(&targets);\n+                return;\n+            }\n+        }\n+\n+        void CheckVanish(uint32 diff)\n+        {\n+            if (!IsSpellReady(VANISH_1, diff, false) || !me->IsInCombat() || me->IsMounted() || IsTank() || Rand() > 50 ||\n+                me->getAttackers().empty() || IsFlagCarrier(me) || me->HasAuraType(SPELL_AURA_MOD_STEALTH) ||\n+                me->HasAuraType(SPELL_AURA_ALLOW_ONLY_ABILITY) || me->HasAuraType(SPELL_AURA_PERIODIC_DAMAGE))\n+                return;\n+\n+            if (GetHealthPCT(me) < 30 + 20*me->getAttackers().size() ||\n+                (!IAmFree() && GetHealthPCT(me) < 70 && master->GetNpcBotsCount() > 1))\n+            {\n+                //Unit* victim = me->GetVictim();\n+                if (doCast(me, GetSpell(VANISH_1)))\n+                    return;\n+            }\n+        }\n+\n+        void CheckCloakOfShadows(uint32 diff)\n+        {\n+            if (!IsSpellReady(CLOAK_OF_SHADOWS_1, diff) || !me->IsInCombat() || me->IsMounted() ||\n+                Rand() > 40 + 60 * me->GetMap()->IsDungeon())\n+                return;\n+\n+            uint32 count = 0;\n+\n+            //dispel debuffs\n+            uint32 const dispelMask = DISPEL_ALL_MASK;\n+            for (auto const& [_, auraApp] : me->GetAppliedAuras())\n+            {\n+                // remove all harmful spells on you...\n+                SpellInfo const* spellInfo = auraApp->GetBase()->GetSpellInfo();\n+                if ((spellInfo->DmgClass == SPELL_DAMAGE_CLASS_MAGIC || (spellInfo->GetDispelMask() & dispelMask)) &&\n+                    !auraApp->IsPositive() && !auraApp->GetBase()->IsPassive())\n+                {\n+                    if (spellInfo->HasAura(SPELL_AURA_PERIODIC_DAMAGE) ||\n+                        spellInfo->HasAura(SPELL_AURA_MOD_SPEED_SLOW_ALL) ||\n+                        spellInfo->HasAura(SPELL_AURA_HASTE_SPELLS))\n+                        if (++count > 1)\n+                            break;\n+                }\n+            }\n+\n+            //defend from enemy cast cast\n+            if (Unit const* target = FindCastingTarget(50))\n+            {\n+                if (Spell const* spell = target->GetCurrentSpell(CURRENT_GENERIC_SPELL))\n+                {\n+                    if (spell->GetTimer() < 1000 && !spell->GetSpellInfo()->IsPassive() && !spell->GetSpellInfo()->IsPositive() &&\n+                        !(spell->GetSpellInfo()->Attributes & (SPELL_ATTR0_IS_ABILITY|SPELL_ATTR0_NO_IMMUNITIES)))\n+                    {\n+                        //direct spell\n+                        if (spell->m_targets.GetUnitTarget() == me &&\n+                            spell->GetSpellInfo()->DmgClass == SPELL_DAMAGE_CLASS_MAGIC &&\n+                            me->IsWithinLOSInMap(target, VMAP::ModelIgnoreFlags::M2, LINEOFSIGHT_ALL_CHECKS))\n+                        {\n+                            count += 2;\n+                        }\n+                        //area spell\n+                        if ((spell->GetSpellInfo()->Effects[0].IsEffect() &&\n+                            spell->GetSpellInfo()->Effects[0].TargetB.GetSelectionCategory() == TARGET_SELECT_CATEGORY_NEARBY) ||\n+                            (spell->GetSpellInfo()->Effects[1].IsEffect() &&\n+                            spell->GetSpellInfo()->Effects[1].TargetB.GetSelectionCategory() == TARGET_SELECT_CATEGORY_NEARBY))\n+                        {\n+                            count += 2;\n+                        }\n+                    }\n+                }\n+            }\n+\n+            if (!(count > 1))\n+                return;\n+\n+            if (doCast(me, GetSpell(CLOAK_OF_SHADOWS_1)))\n+                return;\n+        }\n+\n+        void CheckBlind(uint32 diff)\n+        {\n+            if (!IsSpellReady(BLIND_1, diff) || !me->IsInCombat() || me->IsMounted() || IsTank() || Rand() > 40 ||\n+                me->HasAuraType(SPELL_AURA_MOD_STEALTH) || me->HasAuraType(SPELL_AURA_ALLOW_ONLY_ABILITY) ||\n+                IsSpellReady(BLADE_FLURRY_1, diff, false) || IsSpellReady(EVASION_1, diff, false) ||\n+                me->GetAuraEffect(SPELL_AURA_MOD_DODGE_PERCENT, SPELLFAMILY_ROGUE, 0x20, 0x0, 0x0) ||//evasion\n+                me->GetAuraEffect(SPELL_AURA_MOD_MELEE_HASTE, SPELLFAMILY_ROGUE, 0x40000000, 0x800, 0x0))\n+                return;\n+\n+            Unit* u = FindStunTarget(15); //improved always (base 10, improved 15)\n+            if (!u)\n+                u = FindCastingTarget(15, 0, BLIND_1);\n+\n+            if (u && doCast(u, GetSpell(BLIND_1)))\n+                return;\n+        }\n+\n+        void CheckPreparation(uint32 diff)\n+        {\n+            if (!IsSpellReady(PREPARATION_1, diff) || !me->IsInCombat() || me->IsMounted() || Rand() > 30)\n+                return;\n+\n+            //TODO: recheck priorities\n+            uint32 needFactor = 0;\n+            uint32 cooldown;\n+            cooldown = GetSpellCooldown(EVASION_1);\n+            needFactor += !cooldown ? 0 : 3 * cooldown / 1200; //1-100 x3\n+            cooldown = GetSpellCooldown(SPRINT_1);\n+            needFactor += !cooldown ? 0 : 1 * cooldown / 1200; //1-100\n+            cooldown = GetSpellCooldown(VANISH_1);\n+            needFactor += !cooldown ? 0 : 3 * cooldown / 1200; //1-100 x3\n+            cooldown = GetSpellCooldown(COLD_BLOOD_1);\n+            needFactor += !cooldown ? 0 : 2 * cooldown / 1800; //1-100 x2\n+            cooldown = GetSpellCooldown(SHADOWSTEP_1);\n+            needFactor += !cooldown ? 0 : 2 * cooldown / 200;  //1-100 x2\n+            cooldown = GetSpellCooldown(BLADE_FLURRY_1);\n+            needFactor += !cooldown ? 0 : 1 * cooldown / 1200; //1-100\n+            cooldown = GetSpellCooldown(DISMANTLE_1);\n+            needFactor += !cooldown ? 0 : 1 * cooldown / 600;  //1-100\n+            //0-1300\n+            //ignore Kick\n+\n+            if (needFactor >= 800 && doCast(me, GetSpell(PREPARATION_1)))\n+                return;\n+        }\n+\n+        void CheckTricksOfTheTrade(uint32 diff)\n+        {\n+            if (!IsSpellReady(TRICKS_OF_THE_TRADE_1, diff) || !me->IsInCombat() || me->IsMounted() || IAmFree() ||\n+                IsTank() || Rand() > 30 || !me->GetMap()->IsDungeon() ||\n+                me->HasAuraType(SPELL_AURA_MOD_STEALTH) || me->HasAuraType(SPELL_AURA_ALLOW_ONLY_ABILITY))\n+                return;\n+\n+            Group const* group = master->GetGroup();\n+            if (!group)\n+                return;\n+            Unit* victim = me->GetVictim();\n+            if (!victim)\n+                return;\n+\n+            Unit* target = nullptr;\n+            for (GroupReference const* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())\n+            {\n+                Player* player = itr->GetSource();\n+                if (!player || !player->IsInWorld() || !player->IsAlive() || me->GetMap() != player->FindMap() ||\n+                    me->GetDistance(player) > 20)\n+                    continue;\n+\n+                if (IsTank(player) || player->GetVictim() == victim)\n+                {\n+                    if (!victim->CanHaveThreatList() ||\n+                        victim->GetThreatMgr().GetThreat(player) < victim->GetThreatMgr().GetThreat(me) * 0.75f)\n+                    {\n+                        target = player;\n+                        break;\n+                    }\n+                }\n+            }\n+\n+            if (target)\n+                if (doCast(target, GetSpell(TRICKS_OF_THE_TRADE_1)))\n+                    return;\n+        }\n+\n+        void CheckSprint(uint32 diff)\n+        {\n+            if (!IsSpellReady(SPRINT_1, diff) || (!IAmFree() && !HasBotCommandState(BOT_COMMAND_FOLLOW)) || Rand() > 35 || me->IsMounted())\n+                return;\n+\n+            if (IAmFree())\n+            {\n+                InstanceTemplate const* instt = sObjectMgr->GetInstanceTemplate(me->GetMap()->GetId());\n+                bool map_allows_mount = (!me->GetMap()->IsDungeon() || me->GetMap()->IsBattlegroundOrArena()) && (!instt || instt->AllowMount);\n+                if (me->HasUnitMovementFlag(MOVEMENTFLAG_FORWARD) &&\n+                    (!me->GetVictim() ? (!map_allows_mount || me->IsInCombat() || IsFlagCarrier(me)) : !me->IsWithinDist(me->GetVictim(), 8.0f)))\n+                {\n+                    if (doCast(me, GetSpell(SPRINT_1)))\n+                        return;\n+                }\n+\n+                return;\n+            }\n+\n+            if (me->GetExactDist2d(master) > std::max<uint8>(master->GetBotMgr()->GetBotFollowDist(), 45))\n+            {\n+                if (doCast(me, GetSpell(SPRINT_1)))\n+                    return;\n+            }\n+        }\n+\n+        void ApplyClassSpellCritMultiplierAll(Unit const* /*victim*/, float& crit_chance, SpellInfo const* spellInfo, SpellSchoolMask /*schoolMask*/, WeaponAttackType /*attackType*/) const override\n+        {\n+            if (spellInfo->DmgClass != SPELL_DAMAGE_CLASS_MELEE)\n+                return;\n+\n+            //uint32 spellId = spellInfo->Id;\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+\n+            //Cold Blood\n+            if (AuraEffect const* bloo = me->GetAuraEffect(COLD_BLOOD_1, 0, me->GetGUID()))\n+                if (bloo->IsAffectedOnSpell(spellInfo))\n+                    crit_chance += 100.f;\n+\n+            //Puncturing Wounds:\n+            if (lvl >= 15)\n+            {\n+                //30% additional critical chance for Backstab\n+                if (baseId == BACKSTAB_1)\n+                    crit_chance += 30.f;\n+                //Puncturing Wounds: 15% additional critical chance for Mutilate\n+                else if (baseId == MUTILATE_1 ||\n+                    baseId == MUTILATE_DAMAGE_MAINHAND_1 || baseId == MUTILATE_DAMAGE_OFFHAND_1)\n+                    crit_chance += 15.f;\n+            }\n+            //Glyph of Eviscerate: 10% additional critical chance for Eviscerate\n+            if (lvl >= 15 && baseId == EVISCERATE_1)\n+                crit_chance += 10.f;\n+            //Improved Ambush: 50% additional critical chance for Ambush\n+            if ((GetSpec() == BOT_SPEC_ROGUE_SUBTLETY) && lvl >= 25 && baseId == AMBUSH_1)\n+                crit_chance += 50.f;\n+            //Turn the Tables:\n+            if (lvl >= 50 &&\n+                ((spellInfo->SpellFamilyFlags[0] & 0x2600070E) || (spellInfo->SpellFamilyFlags[1] & 0x7900106)) &&\n+                me->GetAuraEffect(SPELL_AURA_ADD_FLAT_MODIFIER, SPELLFAMILY_ROGUE, 0x0, 0x200000, 0x0))\n+                crit_chance += 6.f;\n+            //Remorseless Attacks:\n+            if (AuraEffect const* remo = me->GetAuraEffect(REMORSELESS_ATTACKS_BUFF, 0, me->GetGUID()))\n+                if (remo->IsAffectedOnSpell(spellInfo))\n+                    crit_chance += 40.f;\n+        }\n+\n+        void ApplyClassDamageMultiplierMeleeSpell(int32& damage, SpellNonMeleeDamage& /*damageinfo*/, SpellInfo const* spellInfo, WeaponAttackType /*attackType*/, bool iscrit) const override\n+        {\n+            //uint32 spellId = spellInfo->Id;\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+            float fdamage = float(damage);\n+\n+            //apply bonus damage mods\n+            float pctbonus = 0.0f;\n+            if (iscrit)\n+            {\n+                //!!!Melee spell damage is not yet critical, all reduced by half\n+                //Lethality: 30% crit damage bonus for non-stealth combo-generating abilities (on 25 lvl)\n+                if (lvl >= 25 &&\n+                    (baseId == SINISTER_STRIKE_1 || baseId == BACKSTAB_1 || baseId == MUTILATE_1 || baseId == RIPOSTE_1 ||\n+                    baseId == GOUGE_1 || baseId == HEMORRHAGE_1 || baseId == GHOSTLY_STRIKE_1\n+                    /*|| baseId == SHIV_1*/ || baseId == MUTILATE_DAMAGE_MAINHAND_1 || baseId == MUTILATE_DAMAGE_OFFHAND_1))\n+                    pctbonus += 0.15f;\n+            }\n+\n+            //DeathDealer set bonus: 15% damage bonus for Eviscerate\n+            if (lvl >= 60 && baseId == EVISCERATE_1)\n+                pctbonus += 0.15f;\n+            //Find Weakness: 6% bonus damage to all abilities\n+            if ((GetSpec() == BOT_SPEC_ROGUE_ASSASINATION) && lvl >= 45)\n+                pctbonus += 0.06f;\n+            //Improved Eviscerate: 20% damage bonus for Eviscerate\n+            if (lvl >= 10 && baseId == EVISCERATE_1)\n+                pctbonus += 0.2f;\n+            //Opportunity: 20% damage bonus for Backstab, Mutilate, Garrote and Ambush\n+            if (lvl >= 10 &&\n+                (baseId == BACKSTAB_1 || baseId == MUTILATE_1 || baseId == MUTILATE_DAMAGE_MAINHAND_1 ||\n+                baseId == MUTILATE_DAMAGE_OFFHAND_1 || baseId == GARROTE_1 || baseId == AMBUSH_1))\n+                pctbonus += 0.2f;\n+            //Aggression: 15% damage bonus for Sinister Strike, Backstab and Eviscerate\n+            if ((GetSpec() == BOT_SPEC_ROGUE_COMBAT) &&\n+                lvl >= 25 && (baseId == SINISTER_STRIKE_1 || baseId == BACKSTAB_1 || baseId == EVISCERATE_1))\n+                pctbonus += 0.15f;\n+            //Blood Spatter: 30% bonus damage for Rupture and Garrote\n+            if (lvl >= 15 && (baseId == RUPTURE_1 || baseId == GARROTE_1))\n+                pctbonus += 0.3f;\n+            //Vile Poisons: 20% damage bonus for Poisons and Envenom\n+            if (lvl >= 25 && ((spellInfo->SpellFamilyFlags[0] & 0x10012000) || (spellInfo->SpellFamilyFlags[1] & 0x18)))\n+                pctbonus += 0.2f;\n+            //Serrated Blades part 2: 30% bonus damage for Rupture\n+            if (lvl >= 20 && baseId == RUPTURE_1)\n+                pctbonus += 0.3f;\n+            //Surprise Attacks: 10% bonus damage for Sinister Strike, Backstab, Shiv, Hemmorhage and Gouge\n+            if ((GetSpec() == BOT_SPEC_ROGUE_COMBAT) &&\n+                lvl >= 50 && (baseId == SINISTER_STRIKE_1 || baseId == BACKSTAB_1 ||\n+                /*baseId == SHIV_1 || */baseId == HEMORRHAGE_1 || baseId == GOUGE_1))\n+                pctbonus += 0.1f;\n+            //Blade Twisting: 10% bonus damage for Sinister Strike and Backstab\n+            if ((GetSpec() == BOT_SPEC_ROGUE_COMBAT) && lvl >= 35 && (baseId == SINISTER_STRIKE_1 || baseId == BACKSTAB_1))\n+                pctbonus += 0.1f;\n+            //Sinister Calling: 10% bonus percentage damage for Backstab and Hemorrhage\n+            //We add bonus damage pct because SpellMods are not handled\n+            if ((GetSpec() == BOT_SPEC_ROGUE_SUBTLETY) && lvl >= 45 && (baseId == BACKSTAB_1 || baseId == HEMORRHAGE_1))\n+                pctbonus += 0.1f;\n+            //Glyph of Fan of Knives: 20% bonus damage for Fan of Knives\n+            if (lvl >= 80 && baseId == FAN_OF_KNIVES_1)\n+                pctbonus += 0.2f;\n+\n+            //Glyph of Sinister Strike: 50% chance to add 1 cp on crit\n+            if (baseId == SINISTER_STRIKE_1)\n+                glyphSSProc = iscrit && lvl >= 15 && urand(1,100) <= 50;\n+\n+            damage = int32(fdamage * (1.0f + pctbonus));\n+        }\n+\n+        void ApplyClassSpellCostMods(SpellInfo const* spellInfo, int32& cost) const override\n+        {\n+            //uint32 spellId = spellInfo->Id;\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            float fcost = float(cost);\n+            int32 flatbonus = 0;\n+            float pctbonus = 0.0f;\n+\n+            //100% mods\n+            //Glyph of Blade Flurry: -100% cost for Blade Flurry\n+            if (lvl >= 30 && baseId == BLADE_FLURRY_1)\n+                pctbonus += 1.0f;\n+\n+            //percent mods\n+            //Dirty Tricks: -50% cost for Blind and Sap\n+            if (lvl >= 15 && (baseId == BLIND_1 || baseId == SAP_1))\n+                pctbonus += 0.5f;\n+\n+            //flat mods\n+            //Improved Expose Armor: -10 energy cost for Expose Armor\n+            if (lvl >= 20 && baseId == EXPOSE_ARMOR_1)\n+                flatbonus += 10;\n+            //Improved Sinister Strike: -5 energy cost for Sinister Strike\n+            if (lvl >= 10 && baseId == SINISTER_STRIKE_1)\n+                flatbonus += 5;\n+            //Dirty Deeds part 1: -20 energy cost for Cheap Shot and Garrote\n+            if ((GetSpec() == BOT_SPEC_ROGUE_SUBTLETY) && lvl >= 30 && (baseId == CHEAP_SHOT_1 || baseId == GARROTE_1))\n+                flatbonus += 20;\n+            //Filthy Tricks part 2: -10 energy cost for Tricks of the Trade, Distract and Shadowstep\n+            if ((GetSpec() == BOT_SPEC_ROGUE_SUBTLETY) &&\n+                lvl >= 50 && (baseId == TRICKS_OF_THE_TRADE_1 || baseId == DISTRACT_1 || baseId == SHADOWSTEP_1))\n+                flatbonus += 10;\n+            //Slaugher from the Shadows part 1: -20 energy cost for Backstab and Ambush\n+            if ((GetSpec() == BOT_SPEC_ROGUE_SUBTLETY) && lvl >= 55 && (baseId == BACKSTAB_1 || baseId == AMBUSH_1))\n+                flatbonus += 20;\n+            //Slaugher from the Shadows part 2: -5 energy cost for Hemorrhage\n+            if ((GetSpec() == BOT_SPEC_ROGUE_SUBTLETY) && lvl >= 55 && baseId == HEMORRHAGE_1)\n+                flatbonus += 5;\n+            //Glyph of Feint: -20 energy cost for Feint\n+            if (lvl >= 16 && baseId == FEINT_1)\n+                flatbonus += 20;\n+            //Glyph of Gouge: -15 energy cost for Gouge\n+            if (lvl >= 15 && baseId == GOUGE_1)\n+                flatbonus += 15;\n+            //Glyph of Mutilate: -5 energy cost for Mutilate\n+            if (lvl >= 50 && baseId == MUTILATE_1)\n+                flatbonus += 5;\n+\n+            //cost can be < 0\n+            cost = int32(fcost * (1.0f - pctbonus)) - flatbonus;\n+        }\n+\n+        void ApplyClassSpellCastTimeMods(SpellInfo const* spellInfo, int32& casttime) const override\n+        {\n+            //casttime is in milliseconds\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            int32 timebonus = 0;\n+            //float pctbonus = 0.0f;\n+\n+            //100% mods\n+            //Improved Slam: -100% cast time for Slam\n+            //if (lvl >= 40 && spellId == GetSpell(SLAM_1) && me->HasAura(BLOODSURGE_BUFF))\n+            //    timebonus += casttime;\n+\n+            //flat mods\n+            //Glyph of Pick Lock: 100% cast time for Pick Lock (reduced for bots)\n+            if (lvl >= 16 && baseId == PICK_LOCK_1)\n+                timebonus += 4000;\n+\n+            casttime = std::max<int32>(casttime - timebonus, 0);\n+        }\n+\n+        void ApplyClassSpellCooldownMods(SpellInfo const* spellInfo, uint32& cooldown) const override\n+        {\n+            //cooldown is in milliseconds\n+            //uint32 spellId = spellInfo->Id;\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            int32 timebonus = 0;\n+            float pctbonus = 0.0f;\n+\n+            //pct mods\n+            //Intensify Rage: -33% cooldown for Bloodrage, Berserker Rage, Recklessness and Death Wish\n+            //if (lvl >= 40 &&\n+            //    (spellId == GetSpell(BLOODRAGE_1) || spellId == GetSpell(BERSERKERRAGE_1) ||\n+            //    spellId == GetSpell(RECKLESSNESS_1) || spellId == GetSpell(DEATHWISH_1)))\n+            //    pctbonus += 0.33f;\n+\n+            //flat mods\n+            //Elusiveness part 2: -60 sec cooldown for Blind\n+            if (lvl >= 20 && baseId == BLIND_1)\n+                timebonus += 60000;\n+            //Elusiveness part 3: -30 sec cooldown for Cloak of Shadows\n+            if (lvl >= 20 && baseId == CLOAK_OF_SHADOWS_1)\n+                timebonus += 30000;\n+            //Filthy Tricks part 1: -10 sec cooldown for Tricks of the Trade, Distract and Shadowstep\n+            if ((GetSpec() == BOT_SPEC_ROGUE_SUBTLETY) &&\n+                lvl >= 50 && (baseId == TRICKS_OF_THE_TRADE_1 || baseId == DISTRACT_1 || baseId == SHADOWSTEP_1))\n+                timebonus += 10000;\n+            //Filthy Tricks part 3: -3 min cooldown for Preparation\n+            if ((GetSpec() == BOT_SPEC_ROGUE_SUBTLETY) && lvl >= 50 && baseId == PREPARATION_1)\n+                timebonus += 180000;\n+            //Glyph of Killing Spree: -45 sec cooldown for Killing Spree\n+            if (lvl >= 60 && baseId == KILLING_SPREE_1)\n+                timebonus += 45000;\n+\n+            cooldown = std::max<int32>((float(cooldown) * (1.0f - pctbonus)) - timebonus, 0);\n+        }\n+\n+        void ApplyClassSpellCategoryCooldownMods(SpellInfo const* spellInfo, uint32& cooldown) const override\n+        {\n+            //cooldown is in milliseconds\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            int32 timebonus = 0;\n+            float pctbonus = 0.0f;\n+\n+            //Endurance: -1 min cooldown for Sprint and Evasion\n+            if (lvl >= 20 && (baseId == SPRINT_1 || baseId == EVASION_1))\n+                timebonus += 60000;\n+            //Elusiveness part 1: -60 sec cooldown for Vanish\n+            if (lvl >= 20 && baseId == VANISH_1)\n+                timebonus += 60000;\n+            //Camouflage part 2: -6 sec cooldown for Stealth\n+            if (lvl >= 15 && baseId == STEALTH_1)\n+                timebonus += 6000;\n+\n+            cooldown = std::max<int32>((float(cooldown) * (1.0f - pctbonus)) - timebonus, 0);\n+        }\n+\n+        void ApplyClassSpellGlobalCooldownMods(SpellInfo const* /*spellInfo*/, float& cooldown) const override\n+        {\n+            //cooldown is in milliseconds\n+            //uint32 spellId = spellInfo->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            //uint8 lvl = me->GetLevel();\n+            float timebonus = 0.0f;\n+            float pctbonus = 0.0f;\n+\n+            //Unrelenting Assault (part 1, special): -0.5 sec global cooldown for Overpower and Revenge (not for tanks)\n+            //if (lvl >= 50 && !IsTank() && (spellId == GetSpell(OVERPOWER_1) || spellId == GetSpell(REVENGE_1)))\n+            //    timebonus += 500.f;\n+\n+            cooldown = (cooldown * (1.0f - pctbonus)) - timebonus;\n+        }\n+\n+        void ApplyClassSpellRadiusMods(SpellInfo const* /*spellInfo*/, float& radius) const override\n+        {\n+            //uint32 spellId = spellInfo->Id;\n+            //uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            //uint8 lvl = me->GetLevel();\n+            float flatbonus = 0.0f;\n+            float pctbonus = 0.0f;\n+\n+            //pct mods\n+            //Booming Voice\n+            //if (lvl >= 10 && ((spellInfo->SpellFamilyFlags[0] & 0x30000) || (spellInfo->SpellFamilyFlags[1] & 0x80)))\n+            //    pctbonus += 1.0f;\n+\n+            //flat mods\n+            //Glyph of Thunder Clap\n+            //if (spellInfo->SpellFamilyFlags[0] & 0x80)\n+            //    flatbonus += 4.f;\n+\n+            radius = radius * (1.0f + pctbonus) + flatbonus;\n+        }\n+\n+        void ApplyClassSpellRangeMods(SpellInfo const* spellInfo, float& maxrange) const override\n+        {\n+            //uint32 spellId = spellInfo->Id;\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            float flatbonus = 0.0f;\n+            float pctbonus = 0.0f;\n+\n+            //pct mods\n+            //Booming Voice\n+            //if (lvl >= 10 && ((spellInfo->SpellFamilyFlags[0] & 0x30000) || (spellInfo->SpellFamilyFlags[1] & 0x80)))\n+            //    pctbonus += 1.0f;\n+\n+            //flat mods\n+            //Throwing Specialization: + 4 yd range for Deadly Throw\n+            if ((GetSpec() == BOT_SPEC_ROGUE_COMBAT) && lvl >= 45 && baseId == DEADLY_THROW_1)\n+                flatbonus += 4.f;\n+            //Dirty Tricks: + 5 yd range for Blind and Sap\n+            if (lvl >= 15 && (baseId == BLIND_1 || baseId == SAP_1))\n+                flatbonus += 5.f;\n+            //Glyph of Ambush: + 5 yd range for Ambush\n+            if (/*lvl >= 18 && */baseId == AMBUSH_1)\n+                flatbonus += 5.f;\n+            if (baseId == DISARM_TRAP_1)\n+                flatbonus += 10.f;\n+\n+            maxrange = maxrange * (1.0f + pctbonus) + flatbonus;\n+        }\n+\n+        void ApplyClassSpellMaxTargetsMods(SpellInfo const* /*spellInfo*/, uint32& targets) const override\n+        {\n+            uint32 bonusTargets = 0;\n+\n+            //Improved Revenge: +1 target (actually 2 in dbc)\n+            //if (spellInfo->SpellFamilyFlags[0] & 0x400)\n+            //    bonusTargets += 1;\n+\n+            targets = targets + bonusTargets;\n+        }\n+\n+        void OnClassSpellGo(SpellInfo const* spellInfo) override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+\n+            //Thistle Tea: cooldown\n+            if (baseId == THISTLE_TEA)\n+                SetSpellCooldown(THISTLE_TEA, 300000); //5 min (item cd)\n+\n+            //Remorseless Attacks: proc consume buff\n+            if (AuraEffect const* remo = me->GetAuraEffect(REMORSELESS_ATTACKS_BUFF, 0, me->GetGUID()))\n+                if (remo->IsAffectedOnSpell(spellInfo))\n+                    me->RemoveAurasDueToSpell(REMORSELESS_ATTACKS_BUFF);\n+\n+            //Relentless Strikes\n+            if (spellInfo->NeedsComboPoints() && comboPoints)\n+            {\n+                if (lvl >= 10)\n+                {\n+                    if (irand(1,100) <= 20 * comboPoints)\n+                    {\n+                        me->CastSpell(me, RELENTLESS_STRIKES_EFFECT, true);\n+                        //BOT_LOG_ERROR(\"entities.player\", \"rogue_bot CP SPEND1: RS proc!\");\n+                    }\n+                }\n+            }\n+\n+            //Item enchant\n+            //We don't know which item is targeted\n+            //Actually it is mh, then oh\n+            if (baseId == CRIPPLING_POISON_1 || baseId == INSTANT_POISON_1 || baseId == DEADLY_POISON_1 ||\n+                baseId == WOUND_POISON_1 || baseId == ANESTHETIC_POISON_1 || baseId == MIND_NUMBING_POISON_1)\n+            {\n+                //We set duration to 2 seconds to prevent exploiting unequip mechanic\n+                //to get enchanted weapons for player (for non-shaman bots it won't work)\n+                uint32 slot = TEMP_ENCHANTMENT_SLOT;\n+                uint32 duration = 2 * IN_MILLISECONDS;\n+                uint32 charges = 0;\n+                uint32 enchant_id = spellInfo->Effects[0].MiscValue;\n+                //SpellItemEnchantmentEntry const* pEnchant = sSpellItemEnchantmentStore.LookupEntry(enchant_id);\n+                Item* mh = GetEquips(BOT_SLOT_MAINHAND);\n+                Item* oh = GetEquips(BOT_SLOT_OFFHAND);\n+                Item* item = nullptr;\n+                uint8 itemSlot = 0;\n+\n+                if (mh && !mh->GetEnchantmentId(TEMP_ENCHANTMENT_SLOT)/* && mh->IsFitToSpellRequirements(spellInfo)*/)\n+                {\n+                    item = mh;\n+                    itemSlot = BOT_SLOT_MAINHAND;\n+                }\n+                else if (oh && !oh->GetEnchantmentId(TEMP_ENCHANTMENT_SLOT)/* && oh->IsFitToSpellRequirements(spellInfo)*/)\n+                {\n+                    item = oh;\n+                    itemSlot = BOT_SLOT_OFFHAND;\n+                }\n+                else\n+                    ASSERT(false, \"rogue bot attempted to enchant his weapons but cannot find a weapon to apply it!\");\n+\n+                if (!IAmFree())\n+                    master->GetSession()->SendEnchantmentLog(me->GetGUID(), me->GetGUID(), item->GetEntry(), enchant_id);\n+\n+                item->SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_ID_OFFSET, enchant_id);\n+                item->SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_DURATION_OFFSET, duration);\n+                item->SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_CHARGES_OFFSET, charges);\n+                ApplyItemEnchantment(item, TEMP_ENCHANTMENT_SLOT, itemSlot);\n+                if (itemSlot == BOT_SLOT_MAINHAND)\n+                    mhEnchantExpireTimer = ITEM_ENCHANTMENT_EXPIRE_TIMER;\n+                else if (itemSlot == BOT_SLOT_OFFHAND)\n+                    ohEnchantExpireTimer = ITEM_ENCHANTMENT_EXPIRE_TIMER;\n+                //GC_Timer = 1500; //needed\n+            }\n+        }\n+\n+        void SpellHit(Unit* wcaster, SpellInfo const* spell) override\n+        {\n+            Unit* caster = wcaster->ToUnit();\n+            if (!caster)\n+                return;\n+\n+            uint32 baseId = spell->GetFirstRankSpell()->Id;\n+\n+            //Vanish: handle stealth add\n+            if (baseId == VANISH_TRIGGERED_1 || baseId == VANISH_TRIGGERED_2 || baseId == VANISH_TRIGGERED_3)\n+            {\n+                if (!me->GetAuraEffect(SPELL_AURA_MOD_SHAPESHIFT, SPELLFAMILY_ROGUE, 0x400000, 0x0, 0x0))\n+                {\n+                    //SetSpellCooldown(STEALTH_1, 0);\n+                    me->CastSpell(me, STEALTH_1, true);\n+                }\n+            }\n+            //Cheat Death: assume resilience bonus\n+            if (baseId == CHEATING_DEATH_BUFF)\n+            {\n+                if (AuraEffect* chea = me->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_GENERIC, 2109, 0))\n+                {\n+                    chea->ChangeAmount(-100);\n+                }\n+            }\n+            //Camouflage part 1: +15% speed while stealthed\n+            if (baseId == STEALTH_1 && me->GetLevel() >= 15)\n+            {\n+                if (AuraEffect* stea = me->GetAuraEffect(spell->Id, 2))\n+                {\n+                    stea->ChangeAmount(stea->GetAmount() + 15);\n+                }\n+            }\n+\n+            OnSpellHit(caster, spell);\n+        }\n+\n+        void SpellHitTarget(Unit* wtarget, SpellInfo const* spell) override\n+        {\n+            Unit* target = wtarget->ToUnit();\n+            if (!target)\n+                return;\n+\n+            uint32 spellId = spell->Id;\n+            uint32 baseId = spell->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+\n+            //Cold Blood: handle proc\n+            if (AuraEffect const* bloo = me->GetAuraEffect(COLD_BLOOD_1, 0, me->GetGUID()))\n+                if (bloo->IsAffectedOnSpell(spell))\n+                    me->RemoveAurasDueToSpell(COLD_BLOOD_1);\n+\n+            //Combo point generating from effects\n+            if (baseId == SEAL_FATE_EFFECT || baseId == RUTHLESSNESS_EFFECT ||\n+                baseId == SETUP_EFFECT || baseId == INITIATIVE_EFFECT || baseId == HONOR_AMONG_THIEVES_EFFECT)\n+            {\n+                ++comboPoints;\n+                //BOT_LOG_ERROR(\"entities.player\", \"rogue_bot CP GEN2: %s adds 1, now %u\", spell->SpellName[0], uint32(comboPoints));\n+                if (comboPoints > 5)\n+                {\n+                    comboPoints = 5;\n+                    //BOT_LOG_ERROR(\"entities.player\", \"rogue_bot CP NOR2: now %u\", uint32(comboPoints));\n+                }\n+            }\n+            //Combo point generating from spells\n+            if (baseId == SINISTER_STRIKE_1 || baseId == BACKSTAB_1 || baseId == MUTILATE_1 ||\n+                baseId == GOUGE_1 || baseId == HEMORRHAGE_1 || baseId == GHOSTLY_STRIKE_1 ||\n+                baseId == RIPOSTE_1 || baseId == PREMEDITATION_1 ||\n+                baseId == AMBUSH_1 || baseId == GARROTE_1 || baseId == CHEAP_SHOT_1/* || baseId == SHIV_1*/)\n+            {\n+                (baseId == MUTILATE_1 || baseId == PREMEDITATION_1 || baseId == CHEAP_SHOT_1) ?\n+                    comboPoints += 2 : ++comboPoints;\n+\n+                //BOT_LOG_ERROR(\"entities.player\", \"rogue_bot CP GEN1: %s adds %u, now %u\",\n+                //    spell->SpellName[0], (baseId == MUTILATE_1 || baseId == PREMEDITATION_1 || baseId == CHEAP_SHOT_1) ?\n+                //    2 : 1, uint32(comboPoints));\n+\n+                //Glyph of Sinister Strike: handle proc\n+                if (baseId == SINISTER_STRIKE_1 && glyphSSProc)\n+                {\n+                    ++comboPoints;\n+                    //BOT_LOG_ERROR(\"entities.player\", \"rogue_bot CP GEN1: glyphSS proc, now %u\", uint32(comboPoints));\n+                }\n+\n+                if (comboPoints > 5)\n+                {\n+                    comboPoints = 5;\n+                    //BOT_LOG_ERROR(\"entities.player\", \"rogue_bot CP NOR1: now %u\", uint32(comboPoints));\n+                }\n+            }\n+            //if (spellId == EVISCERATE || spellId == KIDNEY_SHOT || spellId == SLICE_DICE || spellId == RUPTURE || spellId == EXPOSE_ARMOR || spellId == ENVENOM)\n+            //some abilities like relentless strikes require combo points thus tries to proc itself\n+            else if (spell->NeedsComboPoints() && comboPoints)\n+            {\n+                //uint32 tempCP = comboPoints;\n+                //comboPoints = 0;\n+                combopointsSpent = true; //envenom problem - cps spent before aura application\n+\n+                //BOT_LOG_ERROR(\"entities.player\", \"rogue_bot CP SPEND1: %u to 0\", tempCP);\n+\n+                //Relentless Strikes: moved to OnClassSpellGo (triggered even without hitting the target)\n+\n+                //Ruthlessness\n+                if (lvl >= 15)\n+                {\n+                    if (urand(1,100) <= 60)\n+                    {\n+                        me->CastSpell(target, RUTHLESSNESS_EFFECT, true);\n+                        //BOT_LOG_ERROR(\"entities.player\", \"rogue_bot CP SPEND1: RU proc!\");\n+                    }\n+                }\n+            }\n+\n+            //Preparation: handle effect\n+            if (baseId == PREPARATION_1)\n+            {\n+                //BOT_LOG_ERROR(\"entities.player\", \"rogue_bot Preparation hit!\");\n+                if (GetSpell(EVASION_1))\n+                    SetSpellCooldown(EVASION_1, 0);\n+                if (GetSpell(SPRINT_1))\n+                    SetSpellCooldown(SPRINT_1, 0);\n+                if (GetSpell(VANISH_1))\n+                    SetSpellCooldown(VANISH_1, 0);\n+                if (GetSpell(COLD_BLOOD_1))\n+                    SetSpellCooldown(COLD_BLOOD_1, 0);\n+                if (GetSpell(SHADOWSTEP_1))\n+                    SetSpellCooldown(SHADOWSTEP_1, 0);\n+\n+                //Glyph of Preparation\n+                //if (lvl >= 30) // same level as spell itself\n+                {\n+                    if (GetSpell(BLADE_FLURRY_1))\n+                        SetSpellCooldown(BLADE_FLURRY_1, 0);\n+                    if (GetSpell(DISMANTLE_1))\n+                        SetSpellCooldown(DISMANTLE_1, 0);\n+                    if (GetSpell(KICK_1))\n+                        SetSpellCooldown(KICK_1, 0);\n+                }\n+            }\n+\n+            //Glyph of Garrote\n+            if (lvl >= 15 && baseId == GARROTE_1)\n+            {\n+                if (Aura* garr = target->GetAura(spellId, me->GetGUID()))\n+                {\n+                    uint32 dur = garr->GetMaxDuration() - 3000;\n+                    garr->SetDuration(dur);\n+                    garr->SetMaxDuration(dur);\n+                    if (AuraEffect* garrEff = garr->GetEffect(0))\n+                    {\n+                        garrEff->ChangeAmount(int32(garrEff->GetAmount() * 1.44f)); //not a mistake\n+                    }\n+                }\n+            }\n+            //Glyph of Deadly Throw\n+            if (lvl >= 64 && baseId == DEADLY_THROW_1)\n+            {\n+                if (AuraEffect* thro = target->GetAuraEffect(spellId, 1, me->GetGUID()))\n+                {\n+                    thro->ChangeAmount(thro->GetAmount() - 20);\n+                }\n+            }\n+            //Glyph of Hunger for Blood\n+            if (lvl >= 60 && baseId == HUNGER_FOR_BLOOD_BUFF)\n+            {\n+                if (AuraEffect* hung = me->GetAuraEffect(spellId, 0))\n+                {\n+                    hung->ChangeAmount(hung->GetAmount() + 3);\n+                }\n+            }\n+            //Glyph of Cloak of Shadows\n+            if (lvl >= 66 && baseId == CLOAK_OF_SHADOWS_1)\n+            {\n+                if (AuraEffect* cloa = me->GetAuraEffect(spellId, 2))\n+                {\n+                    cloa->ChangeAmount(cloa->GetAmount() - 40);\n+                }\n+            }\n+            //Glyph of Sprint\n+            if (lvl >= 15 && baseId == SPRINT_1)\n+            {\n+                if (AuraEffect* spri = me->GetAuraEffect(spellId, 0))\n+                {\n+                    spri->ChangeAmount(spri->GetAmount() + 30);\n+                }\n+            }\n+            //Glyph of Vanish\n+            if (lvl >= 22 && baseId == VANISH_1)\n+            {\n+                if (AuraEffect* vani = me->GetAuraEffect(spellId, 2))\n+                {\n+                    vani->ChangeAmount(vani->GetAmount() + 30);\n+                }\n+            }\n+            //Glyph of Adrenaline Rush\n+            if (lvl >= 40 && baseId == ADRENALINE_RUSH_1)\n+            {\n+                if (Aura* rush = me->GetAura(spellId))\n+                {\n+                    uint32 dur = rush->GetMaxDuration() + 5000;\n+                    rush->SetDuration(dur);\n+                    rush->SetMaxDuration(dur);\n+                }\n+            }\n+            //Glyph of Evasion\n+            if (lvl >= 15 && baseId == EVASION_1)\n+            {\n+                if (Aura* evas = me->GetAura(spellId))\n+                {\n+                    uint32 dur = evas->GetMaxDuration() + 5000;\n+                    evas->SetDuration(dur);\n+                    evas->SetMaxDuration(dur);\n+                }\n+            }\n+            //Glyph of Slice and Dice\n+            //Improved Slice and Dice\n+            if (lvl >= 15 && baseId == SLICE_DICE_1)\n+            {\n+                if (Aura* dice = me->GetAura(spellId))\n+                {\n+                    uint32 dur = dice->GetMaxDuration() + 3000;\n+                    dur = dur + dur / 2;\n+                    dice->SetDuration(dur);\n+                    dice->SetMaxDuration(dur);\n+                }\n+            }\n+            //Glyph of Shadow Dance: 4 sec for bots\n+            if (lvl >= 60 && baseId == SHADOW_DANCE_1)\n+            {\n+                if (Aura* danc = me->GetAura(spellId))\n+                {\n+                    uint32 dur = danc->GetMaxDuration() + 4000;\n+                    danc->SetDuration(dur);\n+                    danc->SetMaxDuration(dur);\n+                }\n+            }\n+            //Glyph of Rupture\n+            if (lvl >= 20 && baseId == RUPTURE_1)\n+            {\n+                if (Aura* rupt = target->GetAura(spellId, me->GetGUID()))\n+                {\n+                    uint32 dur = rupt->GetMaxDuration() + 4000;\n+                    rupt->SetDuration(dur);\n+                    rupt->SetMaxDuration(dur);\n+                }\n+            }\n+            //Glyph of Expose Armor\n+            if (lvl >= 15 && baseId == EXPOSE_ARMOR_1)\n+            {\n+                if (Aura* expo = target->GetAura(spellId, me->GetGUID()))\n+                {\n+                    uint32 dur = expo->GetMaxDuration() + 12000;\n+                    expo->SetDuration(dur);\n+                    expo->SetMaxDuration(dur);\n+                }\n+            }\n+            //Improved Gouge: Increased duration by 1.5 sec\n+            if (lvl >= 10 && baseId == GOUGE_1)\n+            {\n+                if (Aura* goug = target->GetAura(spellId, me->GetGUID()))\n+                {\n+                    int32 duration = goug->GetMaxDuration() + 1500;\n+                    goug->SetDuration(duration);\n+                    goug->SetMaxDuration(duration);\n+                }\n+            }\n+            //Glyph of Tricks of Trade\n+            if (lvl >= 75 && baseId == TRICKS_OF_THE_TRADE_BUFF)\n+            {\n+                if (Aura* tric = target->GetAura(spellId, me->GetGUID()))\n+                {\n+                    int32 duration = tric->GetMaxDuration() + 4000;\n+                    tric->SetDuration(duration);\n+                    tric->SetMaxDuration(duration);\n+                }\n+            }\n+            //Cut to the Chase: Eviscerate and Envenom will refresh Slice and Dice duration as for 5 points\n+            if (GetSpec() == BOT_SPEC_ROGUE_ASSASINATION && lvl >= 55 && (baseId == EVISCERATE_1 || baseId == ENVENOM_1) && GetSpell(SLICE_DICE_1))\n+            {\n+                if (Aura* dice = me->GetAura(GetSpell(SLICE_DICE_1)))\n+                {\n+                    int32 duration = 21000 + 3000 + 12000; //base + glyph + improved\n+                    dice->SetDuration(duration);\n+                    dice->SetMaxDuration(duration);\n+                }\n+            }\n+            //Waylay\n+            if ((GetSpec() == BOT_SPEC_ROGUE_SUBTLETY) && lvl >= 45 && (baseId == BACKSTAB_1 || baseId == AMBUSH_1))\n+                me->CastSpell(target, WAYLAY_DEBUFF, true);\n+\n+            //Stun: move behind\n+            if (baseId == CHEAP_SHOT_1 || baseId == KIDNEY_SHOT_1 || baseId == GOUGE_1)\n+                if (target == opponent)\n+                    MoveBehind(target);\n+\n+            OnSpellHitTarget(target, spell);\n+        }\n+\n+        void DamageDealt(Unit* victim, uint32& damage, DamageEffectType damageType, SpellSchoolMask damageSchoolMask) override\n+        {\n+            bot_ai::DamageDealt(victim, damage, damageType, damageSchoolMask);\n+        }\n+\n+        void DamageTaken(Unit* u, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellSchoolMask /*schoolMask*/) override\n+        {\n+            if (!u)\n+                return;\n+            if (!u->IsInCombat() && !me->IsInCombat())\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void OwnerAttackedBy(Unit* u) override\n+        {\n+            if (!u)\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void CheckAttackState() override\n+        {\n+            if (me->GetVictim() && HasRole(BOT_ROLE_DPS) && !me->HasAuraType(SPELL_AURA_MOD_STEALTH) &&\n+                (me->isAttackReady() || me->isAttackReady(OFF_ATTACK)) &&\n+                (!me->GetVictim()->GetAuraEffect(SPELL_AURA_MOD_STUN, SPELLFAMILY_ROGUE, 0x8, 0x0, 0x0) &&\n+                !me->GetVictim()->GetAuraEffect(SPELL_AURA_MOD_CONFUSE, SPELLFAMILY_ROGUE, 0x01000000, 0x0, 0x0)))\n+                DoMeleeAttackIfReady();\n+        }\n+\n+        uint32 GetAIMiscValue(uint32 data) const override\n+        {\n+            switch (data)\n+            {\n+                case BOTAI_MISC_COMBO_POINTS:\n+                    return comboPoints;\n+                case BOTAI_MISC_ENCHANT_IS_AUTO_MH:\n+                    return needChooseMHEnchant;\n+                case BOTAI_MISC_ENCHANT_IS_AUTO_OH:\n+                    return needChooseOHEnchant;\n+                case BOTAI_MISC_ENCHANT_TIMER_MH:\n+                    return mhEnchantExpireTimer;\n+                case BOTAI_MISC_ENCHANT_TIMER_OH:\n+                    return ohEnchantExpireTimer;\n+                case BOTAI_MISC_ENCHANT_CURRENT_MH:\n+                    return mhEnchant;\n+                case BOTAI_MISC_ENCHANT_CURRENT_OH:\n+                    return ohEnchant;\n+                case BOTAI_MISC_ENCHANT_AVAILABLE_1:\n+                    return GetSpell(CRIPPLING_POISON_1) ? CRIPPLING_POISON_1 : 0;\n+                case BOTAI_MISC_ENCHANT_AVAILABLE_2:\n+                    return GetSpell(INSTANT_POISON_1) ? INSTANT_POISON_1 : 0;\n+                case BOTAI_MISC_ENCHANT_AVAILABLE_3:\n+                    return GetSpell(MIND_NUMBING_POISON_1) ? MIND_NUMBING_POISON_1 : 0;\n+                case BOTAI_MISC_ENCHANT_AVAILABLE_4:\n+                    return GetSpell(DEADLY_POISON_1) ? DEADLY_POISON_1 : 0;\n+                case BOTAI_MISC_ENCHANT_AVAILABLE_5:\n+                    return GetSpell(WOUND_POISON_1) ? WOUND_POISON_1 : 0;\n+                case BOTAI_MISC_ENCHANT_AVAILABLE_6:\n+                    return GetSpell(ANESTHETIC_POISON_1) ? ANESTHETIC_POISON_1 : 0;\n+                default:\n+                    return 0;\n+            }\n+        }\n+\n+        void SetAIMiscValue(uint32 data, uint32 value) override\n+        {\n+            switch (data)\n+            {\n+                case BOTAI_MISC_DAGGER_MAINHAND:\n+                    isdaggerMH = bool(value);\n+                    break;\n+                case BOTAI_MISC_DAGGER_OFFHAND:\n+                    isdaggerOH = bool(value);\n+                    break;\n+                case BOTAI_MISC_ENCHANT_IS_AUTO_MH:\n+                    needChooseMHEnchant = bool(value);\n+                    break;\n+                case BOTAI_MISC_ENCHANT_IS_AUTO_OH:\n+                    needChooseOHEnchant = bool(value);\n+                    break;\n+                case BOTAI_MISC_ENCHANT_TIMER_MH:\n+                    if (value == 0)\n+                        mhEnchantExpireTimer = value;\n+                    break;\n+                case BOTAI_MISC_ENCHANT_TIMER_OH:\n+                    if (value == 0)\n+                        ohEnchantExpireTimer = value;\n+                    break;\n+                case BOTAI_MISC_ENCHANT_CURRENT_MH:\n+                    mhEnchant = value;\n+                    SetAIMiscValue(BOTAI_MISC_ENCHANT_IS_AUTO_MH, value ? false : true);\n+                    break;\n+                case BOTAI_MISC_ENCHANT_CURRENT_OH:\n+                    ohEnchant = value;\n+                    SetAIMiscValue(BOTAI_MISC_ENCHANT_IS_AUTO_OH, value ? false : true);\n+                    break;\n+                default:\n+                    break;\n+            }\n+\n+            bot_ai::SetAIMiscValue(data, value);\n+        }\n+\n+        void Reset() override\n+        {\n+            energy = 0;\n+            comboPoints = 0;\n+            combopointsSpent = false;\n+            glyphSSProc = false;\n+\n+            mhEnchantExpireTimer = std::min<uint32>(mhEnchantExpireTimer, 1);\n+            ohEnchantExpireTimer = std::min<uint32>(ohEnchantExpireTimer, 1);\n+\n+            DefaultInit();\n+\n+            //after InitEquips\n+            Item const* mh = GetEquips(BOT_SLOT_MAINHAND);\n+            Item const* oh = GetEquips(BOT_SLOT_OFFHAND);\n+            isdaggerMH = mh && mh->GetTemplate()->Class == ITEM_CLASS_WEAPON && mh->GetTemplate()->SubClass == ITEM_SUBCLASS_WEAPON_DAGGER;\n+            isdaggerOH = oh && oh->GetTemplate()->Class == ITEM_CLASS_WEAPON && oh->GetTemplate()->SubClass == ITEM_SUBCLASS_WEAPON_DAGGER;\n+        }\n+\n+        void ReduceCD(uint32 diff) override\n+        {\n+            if (mhEnchantExpireTimer > diff)            mhEnchantExpireTimer -= diff;\n+            if (ohEnchantExpireTimer > diff)            ohEnchantExpireTimer -= diff;\n+        }\n+\n+        void InitPowers() override\n+        {\n+            //Hack for power\n+            me->SetPowerType(POWER_ENERGY);\n+\n+            if (energy)\n+                me->SetPower(POWER_ENERGY, energy);\n+            else\n+                me->SetPower(POWER_ENERGY, me->GetMaxPower(POWER_ENERGY));\n+        }\n+\n+        void InitSpells() override\n+        {\n+            uint8 lvl = me->GetLevel();\n+            bool isAssa = GetSpec() == BOT_SPEC_ROGUE_ASSASINATION;\n+            bool isComb = GetSpec() == BOT_SPEC_ROGUE_COMBAT;\n+            bool isSubt = GetSpec() == BOT_SPEC_ROGUE_SUBTLETY;\n+\n+            InitSpellMap(KICK_1);\n+            //InitSpellMap(EXPOSE_ARMOR_1);\n+            InitSpellMap(DISMANTLE_1);\n+            InitSpellMap(FEINT_1);\n+            InitSpellMap(DISARM_TRAP_1);\n+\n+            InitSpellMap(BACKSTAB_1);\n+            InitSpellMap(SINISTER_STRIKE_1);\n+            InitSpellMap(EVISCERATE_1);\n+            InitSpellMap(ENVENOM_1);\n+            InitSpellMap(RUPTURE_1);\n+            InitSpellMap(DEADLY_THROW_1);\n+            InitSpellMap(FAN_OF_KNIVES_1);\n+\n+            InitSpellMap(SPRINT_1);\n+            InitSpellMap(EVASION_1);\n+            InitSpellMap(BLIND_1);\n+            InitSpellMap(VANISH_1);\n+\n+            InitSpellMap(GOUGE_1);\n+\n+            InitSpellMap(KIDNEY_SHOT_1);\n+            InitSpellMap(SLICE_DICE_1);\n+            InitSpellMap(CLOAK_OF_SHADOWS_1);\n+            InitSpellMap(TRICKS_OF_THE_TRADE_1);\n+\n+            InitSpellMap(STEALTH_1);\n+            //InitSpellMap(SAP_1);\n+            InitSpellMap(GARROTE_1);\n+            InitSpellMap(CHEAP_SHOT_1);\n+            InitSpellMap(AMBUSH_1);\n+\n+            lvl >= 30 && isAssa ? InitSpellMap(COLD_BLOOD_1) : RemoveSpell(COLD_BLOOD_1);\n+            lvl >= 50 && isAssa ? InitSpellMap(MUTILATE_1) : RemoveSpell(MUTILATE_1);\n+            lvl >= 60 && isAssa ? InitSpellMap(HUNGER_FOR_BLOOD_1) : RemoveSpell(HUNGER_FOR_BLOOD_1);\n+\n+            lvl >= 20 && isComb ? InitSpellMap(RIPOSTE_1) : RemoveSpell(RIPOSTE_1);\n+            lvl >= 30 && isComb ? InitSpellMap(BLADE_FLURRY_1) : RemoveSpell(BLADE_FLURRY_1);\n+            lvl >= 40 && isComb ? InitSpellMap(ADRENALINE_RUSH_1) : RemoveSpell(ADRENALINE_RUSH_1);\n+            lvl >= 60 && isComb ? InitSpellMap(KILLING_SPREE_1) : RemoveSpell(KILLING_SPREE_1);\n+\n+            lvl >= 20 && isSubt ? InitSpellMap(GHOSTLY_STRIKE_1) : RemoveSpell(GHOSTLY_STRIKE_1);\n+            lvl >= 30 && isSubt ? InitSpellMap(HEMORRHAGE_1) : RemoveSpell(HEMORRHAGE_1);\n+            lvl >= 30 && isSubt ? InitSpellMap(PREPARATION_1) : RemoveSpell(PREPARATION_1);\n+            lvl >= 40 && isSubt ? InitSpellMap(PREMEDITATION_1) : RemoveSpell(PREMEDITATION_1);\n+            lvl >= 50 && isSubt ? InitSpellMap(SHADOWSTEP_1) : RemoveSpell(SHADOWSTEP_1);\n+            lvl >= 60 && isSubt ? InitSpellMap(SHADOW_DANCE_1) : RemoveSpell(SHADOW_DANCE_1);\n+\n+            //InitSpellMap(DISTRACT_1);\n+\n+            InitSpellMap(CRIPPLING_POISON_1);\n+            InitSpellMap(INSTANT_POISON_1);\n+            InitSpellMap(DEADLY_POISON_1);\n+            InitSpellMap(WOUND_POISON_1);\n+            InitSpellMap(MIND_NUMBING_POISON_1);\n+            InitSpellMap(ANESTHETIC_POISON_1);\n+\n+            lvl >= 10 ? InitSpellMap(THISTLE_TEA) : RemoveSpell(THISTLE_TEA);\n+        }\n+\n+        void ApplyClassPassives() const override\n+        {\n+            uint8 level = master->GetLevel();\n+            bool isAssa = GetSpec() == BOT_SPEC_ROGUE_ASSASINATION;\n+            bool isComb = GetSpec() == BOT_SPEC_ROGUE_COMBAT;\n+            bool isSubt = GetSpec() == BOT_SPEC_ROGUE_SUBTLETY;\n+\n+            RefreshAura(REMORSELESS_ATTACKS, level >= 10 ? 1 : 0);\n+            RefreshAura(VIGOR, level >= 20 ? 1 : 0);\n+            RefreshAura(QUICK_RECOVERY2, isAssa && level >= 35 ? 1 : 0);\n+            RefreshAura(QUICK_RECOVERY1, isAssa && level >= 30 && level < 35 ? 1 : 0);\n+            RefreshAura(IMPROVED_KIDNEY_SHOT, isAssa && level >= 30 ? 1 : 0);\n+            RefreshAura(FLEET_FOOTED, isAssa && level >= 30 ? 1 : 0);\n+            RefreshAura(SEAL_FATE5, isAssa && level >= 45 ? 1 : 0);\n+            RefreshAura(SEAL_FATE4, isAssa && level >= 42 && level < 45 ? 1 : 0);\n+            RefreshAura(SEAL_FATE3, isAssa && level >= 39 && level < 42 ? 1 : 0);\n+            RefreshAura(SEAL_FATE2, isAssa && level >= 37 && level < 39 ? 1 : 0);\n+            RefreshAura(SEAL_FATE1, isAssa && level >= 35 && level < 37 ? 1 : 0);\n+            RefreshAura(MURDER, isAssa && level >= 35 ? 1 : 0);\n+            RefreshAura(DEADLY_BREW, isAssa && level >= 40 ? 1 : 0);\n+            RefreshAura(OVERKILL, isAssa && level >= 40 ? 1 : 0);\n+            //RefreshAura(FOCUSED_ATTACKS, isAssa && level >= 45 ? 1 : 0);\n+            RefreshAura(MASTER_POISONER, isAssa && level >= 50 ? 1 : 0);\n+\n+            RefreshAura(DUAL_WIELD_SPECIALIZATION, level >= 10 ? 1 : 0);\n+            RefreshAura(IMPROVED_KICK, isComb && level >= 25 ? 1 : 0);\n+            RefreshAura(IMPROVED_SPRINT, isComb && level >= 25 ? 1 : 0);\n+            RefreshAura(HACK_AND_SLASH, isComb && level >= 30 ? 1 : 0);\n+            //RefreshAura(BLADE_TWISTING1, isComb && level >= 35 ? 1 : 0);\n+            RefreshAura(VITALITY, isComb && level >= 40 ? 1 : 0);\n+            RefreshAura(NERVES_OF_STEEL, isComb && level >= 40 ? 1 : 0);\n+            RefreshAura(COMBAT_POTENCY5, isComb && level >= 55 ? 1 : 0);\n+            RefreshAura(COMBAT_POTENCY4, isComb && level >= 52 && level < 55 ? 1 : 0);\n+            RefreshAura(COMBAT_POTENCY3, isComb && level >= 49 && level < 52 ? 1 : 0);\n+            RefreshAura(COMBAT_POTENCY2, isComb && level >= 47 && level < 49 ? 1 : 0);\n+            RefreshAura(COMBAT_POTENCY1, isComb && level >= 45 && level < 47 ? 1 : 0);\n+            RefreshAura(THROWING_SPECIALIZATION, isComb && level >= 45 ? 1 : 0);\n+            //RefreshAura(SAVAGE_COMBAT, isComb && level >= 50 ? 1 : 0);\n+            RefreshAura(UNFAIR_ADVANTAGE, isComb && level >= 50 ? 1 : 0);\n+            RefreshAura(SURPRISE_ATTACKS, isComb && level >= 50 ? 1 : 0);\n+            RefreshAura(PREY_ON_THE_WEAK, isComb && level >= 55 ? 1 : 0);\n+\n+            RefreshAura(MASTER_OF_DECEPTION, level >= 10 ? 1 : 0);\n+            RefreshAura(SETUP, isSubt && level >= 25 ? 1 : 0);\n+            RefreshAura(INITIATIVE, isSubt && level >= 25 ? 1 : 0);\n+            RefreshAura(DIRTY_DEEDS, isSubt && level >= 30 ? 1 : 0);\n+            RefreshAura(MASTER_OF_SUBTLETY, isSubt && level >= 35 ? 1 : 0);\n+            RefreshAura(CHEAT_DEATH, isSubt && level >= 40 ? 1 : 0);\n+            RefreshAura(ENVELOPING_SHADOWS, isSubt && level >= 40 ? 1 : 0);\n+            RefreshAura(TURN_THE_TABLES, !IAmFree() && isSubt && level >= 55 ? 1 : 0);\n+            //RefreshAura(HONOR_AMONG_THIEVES, isSubt && level >= 55 ? 1 : 0);\n+\n+            RefreshAura(VIGOR_GLADIATOR, level >= 70 ? 1 : 0);\n+\n+            RefreshAura(GLYPH_BACKSTAB, level >= 15 ? 1 : 0);\n+\n+            RefreshAura(ROGUE_PASSIVE_DND);\n+        }\n+\n+        bool CanUseManually(uint32 basespell) const override\n+        {\n+            switch (basespell)\n+            {\n+                case STEALTH_1:\n+                case SPRINT_1:\n+                case VANISH_1:\n+                case BLADE_FLURRY_1:\n+                case FAN_OF_KNIVES_1:\n+                case TRICKS_OF_THE_TRADE_1:\n+                case PREPARATION_1:\n+                    return true;\n+                default:\n+                    return false;\n+            }\n+        }\n+\n+        float GetBotArmorPenetrationCoef() const override\n+        {\n+            float bonus = 0.0f;\n+\n+            //Serrated Blades part 1\n+            if (me->GetLevel() >= 20)\n+                bonus += 9.f;\n+\n+            //Mace Specialization: 15% armor penetration\n+            if (me->GetLevel() >= 30)\n+                if (Item const* weap = GetEquips(BOT_SLOT_MAINHAND))\n+                    if (weap->GetTemplate()->SubClass == ITEM_SUBCLASS_WEAPON_MACE)\n+                        bonus += 15.f;\n+\n+            return bonus + bot_ai::GetBotArmorPenetrationCoef();\n+        }\n+\n+        bool HasAbilitiesSpecifics() const override { return true; }\n+        void FillAbilitiesSpecifics(Player const* player, std::list<std::string> &specList) override\n+        {\n+            uint32 textId1, textId2;\n+            switch (mhEnchant)\n+            {\n+                case CRIPPLING_POISON_1:    textId1 = BOT_TEXT_CRIPPLING;   break;\n+                case INSTANT_POISON_1:      textId1 = BOT_TEXT_INSTANT;     break;\n+                case DEADLY_POISON_1:       textId1 = BOT_TEXT_DEADLY;      break;\n+                case WOUND_POISON_1:        textId1 = BOT_TEXT_WOUND;       break;\n+                case MIND_NUMBING_POISON_1: textId1 = BOT_TEXT_MINDNUMBING; break;\n+                case ANESTHETIC_POISON_1:   textId1 = BOT_TEXT_ANESTHETIC;  break;\n+                default:                    textId1 = BOT_TEXT_NOTHING_C;   break;\n+            }\n+            switch (ohEnchant)\n+            {\n+                case CRIPPLING_POISON_1:    textId2 = BOT_TEXT_CRIPPLING;   break;\n+                case INSTANT_POISON_1:      textId2 = BOT_TEXT_INSTANT;     break;\n+                case DEADLY_POISON_1:       textId2 = BOT_TEXT_DEADLY;      break;\n+                case WOUND_POISON_1:        textId2 = BOT_TEXT_WOUND;       break;\n+                case MIND_NUMBING_POISON_1: textId2 = BOT_TEXT_MINDNUMBING; break;\n+                case ANESTHETIC_POISON_1:   textId2 = BOT_TEXT_ANESTHETIC;  break;\n+                default:                    textId2 = BOT_TEXT_NOTHING_C;   break;\n+            }\n+            specList.push_back(LocalizedNpcText(player, BOT_TEXT_SLOT_MH) + \": \" + LocalizedNpcText(player, textId1));\n+            specList.push_back(LocalizedNpcText(player, BOT_TEXT_SLOT_OH) + \": \" + LocalizedNpcText(player, textId2));\n+        }\n+\n+        std::vector<uint32> const* GetDamagingSpellsList() const override\n+        {\n+            return &Rogue_spells_damage;\n+        }\n+        std::vector<uint32> const* GetCCSpellsList() const override\n+        {\n+            return &Rogue_spells_cc;\n+        }\n+        //std::vector<uint32> const* GetHealingSpellsList() const override\n+        //{\n+        //    return &Rogue_spells_heal;\n+        //}\n+        std::vector<uint32> const* GetSupportSpellsList() const override\n+        {\n+            return &Rogue_spells_support;\n+        }\n+\n+    private:\n+        mutable bool glyphSSProc;\n+        int32 energy;\n+        uint8 comboPoints;\n+        bool combopointsSpent;\n+        bool isdaggerMH, isdaggerOH;\n+        uint32 mhEnchantExpireTimer, ohEnchantExpireTimer;\n+        uint32 mhEnchant, ohEnchant;\n+        bool needChooseMHEnchant, needChooseOHEnchant;\n+    };\n+};\n+\n+void AddSC_rogue_bot()\n+{\n+    new rogue_bot();\n+}\ndiff --git a/src/server/game/AI/NpcBots/bot_sea_witch_ai.cpp b/src/server/game/AI/NpcBots/bot_sea_witch_ai.cpp\nnew file mode 100644\nindex 0000000000..87cd283820\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bot_sea_witch_ai.cpp\n@@ -0,0 +1,796 @@\n+#include \"bot_ai.h\"\n+#include \"bot_GridNotifiers.h\"\n+#include \"botspell.h\"\n+#include \"bottext.h\"\n+#include \"ScriptMgr.h\"\n+#include \"SpellAuraEffects.h\"\n+#include \"TemporarySummon.h\"\n+/*\n+Naga Sea Witch NpcBot (by Trickerer onlysuffering@gmail.com)\n+Description:\n+A vicious scaly denizen of ocean often associated with the coming of prodigious storms (Warcraft III tribute)\n+Specifics:\n+Spell damage taken reduced by 30%, partially immune to control effects, cloth armor,\n+deals physical/spellfrost/spellstorm damage, attack power bonus: agility x2, spell power bonus: 200% intellect. Main attribute: intellect\n+Abilities:\n+1) Forked Lightning. Calls forth a cone of lightning to damage enemies. Hits 2 to all targets (depending on hero level),\n+stunning them for 2 seconds. This damage generates no threat\n+2) Frost Arrows. Imbues arrow with spellfrost for extra damage, slowing target's\n+movement, attack and casting speed by up to 70% (depending on hero level)\n+3) Mana Shield. Creates a shield that absorbs 100% incoming (non-mitigated) damage by using Sea Witch's mana,\n+absorbs 2 to 10 damage per point of mana (depending on hero level)\n+4) Tornado. Summons a fierce tornado that damages and slows nearby enemy units, sometimes incapacitating them completely.\n+Tornado grows over time oudoors, increasing damage dealt and area of effect, but shrinks indoors, dissipating quickly\n+5ex) Shot. Normal shoot\n+6ex) Naga (passive). Swim speed increased by 200%. Damage and dodge chance are greatly increased while in water\n+Complete - 100%\n+*/\n+\n+enum SeaWitchBaseSpells\n+{\n+    //AUTO_SHOT_1                         = 75,\n+    SHOOT_BOW_1                         = SPELL_SHOOT_BOW,\n+    FORKED_LIGHTNING_1                  = SPELL_FORKED_LIGHTNING,\n+    FROST_ARROW_1                       = SPELL_FROST_ARROW,\n+    MANA_SHIELD_1                       = SPELL_MANA_SHIELD,\n+    TORNADO_1                           = SPELL_TORNADO\n+};\n+enum SeaWitchPassives\n+{\n+};\n+enum SeaWitchSpecial\n+{\n+    MH_ATTACK_ANIM                      = SPELL_ATTACK_MELEE_1H,\n+\n+    FORKEDLIGHTNING_COST                = 110 * 5,\n+    FROSTARROW_COST                     = 10 * 5,\n+    TORNADO_COST                        = 250 * 5,\n+\n+    FORKED_LIGHTNING_EFFECT             = SPELL_FORKED_LIGHTNING_EFFECT,\n+    FROST_ARROW_EFFECT                  = SPELL_FROST_ARROW_EFFECT,\n+\n+    NAGA_SWIM_PASSIVE                   = 40513,\n+    SPELL_THREAT_MOD                    = 31745, //Salvation\n+\n+    SPELL_PARALYTIC_POISON              = 35201\n+};\n+\n+static constexpr size_t TORNADO_MIN_TARGETS = 4u;\n+\n+static const std::vector<uint32> Seawitch_spells_damage{ FORKED_LIGHTNING_1, FROST_ARROW_1, TORNADO_1 };\n+static const std::vector<uint32> Seawitch_spells_cc{ FROST_ARROW_1, TORNADO_1 };\n+static const std::vector<uint32> Seawitch_spells_support{ MANA_SHIELD_1 };\n+\n+class sea_witch_bot : public CreatureScript\n+{\n+public:\n+    sea_witch_bot() : CreatureScript(\"sea_witch_bot\") { }\n+\n+    CreatureAI* GetAI(Creature* creature) const override\n+    {\n+        return new sea_witch_botAI(creature);\n+    }\n+\n+    bool OnGossipHello(Player* player, Creature* creature) override\n+    {\n+        return creature->GetBotAI()->OnGossipHello(player, 0);\n+    }\n+\n+    bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action) override\n+    {\n+        if (bot_ai* ai = creature->GetBotAI())\n+            return ai->OnGossipSelect(player, creature, sender, action);\n+        return true;\n+    }\n+\n+    bool OnGossipSelectCode(Player* player, Creature* creature, uint32 sender, uint32 action, char const* code) override\n+    {\n+        if (bot_ai* ai = creature->GetBotAI())\n+            return ai->OnGossipSelectCode(player, creature, sender, action, code);\n+        return true;\n+    }\n+\n+    struct sea_witch_botAI : public bot_ai\n+    {\n+        sea_witch_botAI(Creature* creature) : bot_ai(creature)\n+        {\n+            _botclass = BOT_CLASS_SEA_WITCH;\n+\n+            InitUnitFlags();\n+\n+            //sea witch immunities\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_POSSESS, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_CHARM, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_SHAPESHIFT, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_TRANSFORM, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_DISARM, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_DISARM_OFFHAND, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_DISARM_RANGED, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_FEAR, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_DISARM, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_POLYMORPH, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_FEAR, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_HORROR, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_TURN, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SLEEP, true);\n+            //Sea Witch is immune to poisons\n+            me->ApplySpellImmune(0, IMMUNITY_DISPEL, DISPEL_POISON, true);\n+        }\n+\n+        bool doCast(Unit* victim, uint32 spellId)\n+        {\n+            if (CheckBotCast(victim, spellId) != SPELL_CAST_OK)\n+                return false;\n+\n+            return bot_ai::doCast(victim, spellId);\n+        }\n+\n+        void StartAttack(Unit* u, bool force = false)\n+        {\n+            if (!bot_ai::StartAttack(u, force))\n+                return;\n+            GetInPosition(force, u);\n+        }\n+\n+        void JustEngagedWith(Unit* u) override { bot_ai::JustEngagedWith(u); }\n+        void EnterEvadeMode(EvadeReason why = EVADE_REASON_OTHER) override { bot_ai::EnterEvadeMode(why); }\n+        void MoveInLineOfSight(Unit* u) override { bot_ai::MoveInLineOfSight(u); }\n+        void JustDied(Unit* u) override { /*UnsummonAll(false);*/ bot_ai::JustDied(u); }\n+        void DoNonCombatActions(uint32 /*diff*/) { }\n+        void KilledUnit(Unit* u) override { bot_ai::KilledUnit(u); }\n+\n+        void CheckManaShield(uint32 diff)\n+        {\n+            if (me->HasAuraType(SPELL_AURA_MANA_SHIELD) || me->HasAuraType(SPELL_AURA_SCHOOL_ABSORB))\n+                return;\n+\n+            if (IsSpellReady(MANA_SHIELD_1, diff, false) && GetManaPCT(me) >= 25 && me->IsInCombat())\n+                if (doCast(me, GetSpell(MANA_SHIELD_1)))\n+                    return;\n+        }\n+\n+        void Counter(uint32 diff)\n+        {\n+            if (!IsSpellReady(FORKED_LIGHTNING_1, diff, false) || !HasRole(BOT_ROLE_DPS) || Rand() > 55)\n+                return;\n+\n+            if (Unit* target = FindCastingTarget(CalcSpellMaxRange(FORKED_LIGHTNING_1) - 5.f, 0, FORKED_LIGHTNING_1))\n+            {\n+                Spell const* spell = target->GetCurrentSpell(CURRENT_GENERIC_SPELL);\n+                if (!spell)\n+                    spell = target->GetCurrentSpell(CURRENT_CHANNELED_SPELL);\n+\n+                if (spell && spell->GetTimer() > int32(AssertBotSpellInfoOverride(GetSpell(FORKED_LIGHTNING_1))->CalcCastTime() + 250))\n+                {\n+                    me->SetFacingTo(me->GetAbsoluteAngle(target));\n+                    if (doCast(target, GetSpell(FORKED_LIGHTNING_1)))\n+                        return;\n+                }\n+            }\n+        }\n+\n+        void UpdateAI(uint32 diff) override\n+        {\n+            if (!GlobalUpdate(diff))\n+                return;\n+\n+            DoVehicleActions(diff);\n+            if (!CanBotAttackOnVehicle())\n+                return;\n+\n+            if (Spell const* spell = me->GetCurrentSpell(CURRENT_GENERIC_SPELL))\n+            {\n+                uint32 const baseId = spell->GetSpellInfo()->GetFirstRankSpell()->Id;\n+                //Tornado interrupt\n+                if (!me->IsInCombat() && baseId == TORNADO_1)\n+                    me->InterruptSpell(CURRENT_GENERIC_SPELL);\n+                else if (baseId == FORKED_LIGHTNING_1 && (!me->GetVictim() || !me->HasInArc(float(M_PI) / 2.f, me->GetVictim())))\n+                {\n+                    me->InterruptSpell(CURRENT_GENERIC_SPELL);\n+                    SetSpellCooldown(FORKED_LIGHTNING_1, 500);\n+                }\n+                else if (_spell_preact && spell->GetTimer() < 400)\n+                {\n+                    _spell_preact = false;\n+                    switch (baseId)\n+                    {\n+                        case TORNADO_1:\n+                        //    BotSay(\"REAP THE STORM!\");\n+                        //[[fallthrough]];\n+                        case FORKED_LIGHTNING_1:\n+                            me->CastSpell(me, MH_ATTACK_ANIM, true);\n+                            break;\n+                        default:\n+                            break;\n+                    }\n+                }\n+            }\n+\n+            if (IsPotionReady())\n+            {\n+                if (me->GetPower(POWER_MANA) < FORKEDLIGHTNING_COST)\n+                    DrinkPotion(true);\n+                else if (GetHealthPCT(me) < 30)\n+                    DrinkPotion(false);\n+            }\n+\n+            if (ProcessImmediateNonAttackTarget())\n+                return;\n+\n+            CheckManaShield(diff);\n+\n+            if (!CheckAttackTarget())\n+            {\n+                me->InterruptSpell(CURRENT_AUTOREPEAT_SPELL);\n+                return;\n+            }\n+\n+            Counter(diff);\n+\n+            if (IsCasting())\n+                return;\n+\n+            CheckUsableItems(diff);\n+\n+            DoRangedAttack(diff);\n+        }\n+\n+        void DoRangedAttack(uint32 diff)\n+        {\n+            Unit* mytar = opponent ? opponent : disttarget ? disttarget : nullptr;\n+            if (!mytar)\n+                return;\n+\n+            StartAttack(mytar, IsMelee());\n+\n+            CheckAttackState();\n+            if (!me->IsAlive() || !mytar->IsAlive())\n+                return;\n+\n+            MoveBehind(mytar);\n+\n+            float dist = me->GetDistance(mytar);\n+            static constexpr float maxRangeLong = 35.f;\n+\n+            //bool inpostion = !mytar->HasAuraType(SPELL_AURA_MOD_SPEED_SLOW_ALL) || dist > maxRangeLong - 20.f;\n+\n+            //Auto Shot\n+            //Spell const* shot = me->GetCurrentSpell(CURRENT_AUTOREPEAT_SPELL);\n+            //if (shot && shot->GetSpellInfo()->Id == AUTO_SHOT_1 && (shot->m_targets.GetUnitTarget() != mytar || !inpostion))\n+            //    me->InterruptSpell(CURRENT_AUTOREPEAT_SPELL);\n+\n+            if (!HasRole(BOT_ROLE_DPS))\n+                return;\n+\n+            //RANGED SECTION\n+            if (dist > maxRangeLong)\n+                return;\n+\n+            if (CheckForkedLightning(diff))\n+                return;\n+\n+            if (CheckTornado(diff))\n+                return;\n+\n+            if (/*inpostion && */!me->GetCurrentSpell(CURRENT_GENERIC_SPELL))\n+            {\n+                //Frost Arrow / Autoshot\n+                if (IsSpellReady(FROST_ARROW_1, diff) && me->GetPower(POWER_MANA) >= FROSTARROW_COST &&\n+                    !mytar->IsImmunedToDamage(me, AssertBotSpellInfoOverride(FROST_ARROW_1)))\n+                {\n+                    if (doCast(mytar, GetSpell(FROST_ARROW_1)))\n+                        return;\n+                }\n+                else if (IsSpellReady(SHOOT_BOW_1, diff))\n+                {\n+                    if (doCast(mytar, SHOOT_BOW_1))\n+                        return;\n+                }\n+            }\n+        }\n+\n+        bool CheckTornado(uint32 diff)\n+        {\n+            if (!IsSpellReady(TORNADO_1, diff, false) || !me->GetVictim() || me->GetPower(POWER_MANA) < TORNADO_COST || Rand() > 50)\n+                return false;\n+\n+            std::list<Unit*> targets;\n+            GetNearbyTargetsList(targets, 40.f, 0);\n+            std::erase_if(targets, [healthThreshold = uint32(me->GetMaxHealth() / 4 * 3)](Unit const* u) {\n+                return u->GetHealth() < healthThreshold;\n+            });\n+\n+            size_t targets_count = (IAmFree() || !master->GetGroup()) ? TORNADO_MIN_TARGETS : std::max<size_t>(master->GetGroup()->GetMemberSlots().size() / 3, TORNADO_MIN_TARGETS);\n+            if (targets.size() >= targets_count)\n+            {\n+                me->SetFacingTo(me->GetAbsoluteAngle(me->GetVictim()));\n+                if (doCast(me->GetVictim(), GetSpell(TORNADO_1)))\n+                    return true;\n+            }\n+\n+            return false;\n+        }\n+\n+        bool CheckForkedLightning(uint32 diff)\n+        {\n+            if (!IsSpellReady(FORKED_LIGHTNING_1, diff, false) || !me->GetVictim() || me->GetPower(POWER_MANA) < FORKEDLIGHTNING_COST ||\n+                Rand() > 90 || !me->HasInArc(float(M_PI), me->GetVictim()))\n+                return false;\n+\n+            std::list<Unit*> targets;\n+            GetNearbyTargetsInConeList(targets, CalcSpellMaxRange(FORKED_LIGHTNING_1) - 5.f);\n+            if (targets.size() > ((me->GetLevel() < 60) ? 1u : 0u))\n+            {\n+                me->SetFacingTo(me->GetAbsoluteAngle(me->GetVictim()));\n+                if (doCast(me->GetVictim(), GetSpell(FORKED_LIGHTNING_1)))\n+                    return true;\n+            }\n+\n+            return false;\n+        }\n+\n+        void ApplyClassDamageMultiplierMelee(uint32& damage, CalcDamageInfo& /*damageinfo*/) const override\n+        {\n+            if (IsInContactWithWater())\n+            {\n+                //BOT_LOG_ERROR(\"scripts\", \"ApplyClassDamageMultiplierMelee: %s now in water\", me->GetName().c_str());\n+                damage *= 3;\n+            }\n+        }\n+\n+        void ApplyClassDamageMultiplierMeleeSpell(int32& damage, SpellNonMeleeDamage& /*damageinfo*/, SpellInfo const* /*spellInfo*/, WeaponAttackType /*attackType*/, bool /*crit*/) const override\n+        {\n+            if (IsInContactWithWater())\n+            {\n+                //BOT_LOG_ERROR(\"scripts\", \"ApplyClassDamageMultiplierMelee: %s now in water\", me->GetName().c_str());\n+                damage *= 3;\n+            }\n+        }\n+\n+        void ApplyClassDamageMultiplierSpell(int32& damage, SpellNonMeleeDamage& /*damageinfo*/, SpellInfo const* spellInfo, WeaponAttackType /*attackType*/, bool iscrit) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+            float fdamage = float(damage);\n+            float flat_mod = 0.f;\n+\n+            if (IsInContactWithWater())\n+            {\n+                //BOT_LOG_ERROR(\"scripts\", \"ApplyClassDamageMultiplierSpell: %s now in water\", me->GetName().c_str());\n+                fdamage *= 3.f;\n+            }\n+\n+            //2) apply bonus damage mods\n+            float pctbonus = 1.0f;\n+            if (iscrit)\n+            {\n+                //!!!spell damage is not yet critical and will be multiplied by 1.5\n+                //so we should put here bonus damage mult /1.5\n+                if (/*baseId == FROST_ARROW_1 || */baseId == FORKED_LIGHTNING_1)\n+                    pctbonus *= 1.33f;\n+            }\n+\n+            if (baseId == FORKED_LIGHTNING_1)\n+            {\n+                constexpr float basecoef = 2.5f / 80.f;\n+                float coef = basecoef * (lvl - 3);\n+                fdamage += me->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_MAGIC) * coef * me->CalculateDefaultCoefficient(spellInfo, SPELL_DIRECT_DAMAGE) * me->CalculateLevelPenalty(spellInfo);\n+            }\n+\n+            damage = int32(fdamage * pctbonus + flat_mod);\n+        }\n+\n+        void ApplyClassSpellCastTimeMods(SpellInfo const* spellInfo, int32& casttime) const override\n+        {\n+            //uint32 spellId = spellInfo->Id;\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            //uint8 lvl = me->GetLevel();\n+            int32 timebonus = 0;\n+            float pctbonus = 0.0f;\n+\n+            //100% mods\n+            //if ()\n+            //    pctbonus += 1.0f;\n+\n+            //pct mods\n+            //Frost Arrow affect by attack speed\n+            if (baseId == FROST_ARROW_1)\n+                pctbonus += 1.0f - me->m_modAttackSpeedPct[RANGED_ATTACK];\n+\n+            //flat mods\n+            //Starlight Wrath: -0.5 sec cast time for Wrath and Starfire\n+            //if (lvl >= 10 && (baseId == WRATH_1 || baseId == STARFIRE_1))\n+            //    timebonus += 500;\n+\n+            casttime = std::max<int32>(int32((float(casttime) * (1.0f - pctbonus)) - timebonus), 0);\n+        }\n+\n+        void ApplyClassSpellMaxTargetsMods(SpellInfo const* spellInfo, uint32& targets) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+\n+            if (baseId == FORKED_LIGHTNING_1)\n+            {\n+                switch (lvl / 10)\n+                {\n+                    case 8: targets = 666; break;\n+                    case 7: targets =  10; break;\n+                    case 6: targets =   7; break;\n+                    case 5: targets =   6; break;\n+                    case 4: targets =   5; break;\n+                    case 3: targets =   4; break;\n+                    case 2: targets =   3; break;\n+                    case 1: targets =   3; break;\n+                    default:               break;\n+                }\n+            }\n+        }\n+\n+        void ApplyClassEffectMods(SpellInfo const* spellInfo, uint8 effIndex, float& value) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+            float pctbonus = 1.0f;\n+\n+            if (baseId == FROST_ARROW_EFFECT && (effIndex == EFFECT_0 || effIndex == EFFECT_1))\n+            {\n+                switch (lvl / 10)\n+                {\n+                    case 8: case 7: case 6: value = -70; break;\n+                    case 5: case 4:         value = -50; break;\n+                    default:                             break;\n+                }\n+            }\n+\n+            value = value * pctbonus;\n+        }\n+\n+        void ApplyClassEffectValueMultiplierMods(SpellInfo const* spellInfo, SpellEffIndex effIndex, float& multiplier) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //uint8 lvl = me->GetLevel();\n+            float pctbonus = 1.0f;\n+\n+            //Mana Shield absorption modifier\n+            //Base is 10.f\n+            if (baseId == MANA_SHIELD_1 && effIndex == EFFECT_0)\n+                pctbonus *= _manaPerDamageMult();\n+\n+            multiplier = multiplier * pctbonus;\n+        }\n+\n+        void OnClassSpellStart(SpellInfo const* spellInfo) override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            switch (baseId)\n+            {\n+                case FORKED_LIGHTNING_1:\n+                case TORNADO_1:\n+                    _spell_preact = true;\n+                    break;\n+                default:\n+                    break;\n+            }\n+        }\n+\n+        void OnClassSpellGo(SpellInfo const* spellInfo) override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+\n+            switch (baseId)\n+            {\n+                case FROST_ARROW_1:\n+                case FORKED_LIGHTNING_1:\n+                case TORNADO_1:\n+                {\n+                    uint32 attackTime = uint32(me->GetAttackTime(RANGED_ATTACK) * me->m_modAttackSpeedPct[RANGED_ATTACK]);\n+                    if (baseId == FROST_ARROW_1)\n+                    {\n+                        uint32 castTime = spellInfo->CalcCastTime();\n+                        GC_Timer = castTime >= attackTime ? 0 : attackTime - castTime;\n+                    }\n+                    if (baseId == FORKED_LIGHTNING_1 || baseId == TORNADO_1)\n+                    {\n+                        me->resetAttackTimer();\n+                        GC_Timer = attackTime;\n+                        //me->CastSpell(me, MH_ATTACK_ANIM, true);\n+                    }\n+                    break;\n+                }\n+                default:\n+                    break;\n+            }\n+\n+            if (baseId == TORNADO_1)\n+                SummonBotPet();\n+        }\n+\n+        void SpellHitTarget(Unit* wtarget, SpellInfo const* spell) override\n+        {\n+            Unit* target = wtarget->ToUnit();\n+            if (!target)\n+                return;\n+\n+            if (target == me)\n+                return;\n+\n+            uint32 baseId = spell->GetFirstRankSpell()->Id;\n+            //uint8 lvl = me->GetLevel();\n+\n+            if (baseId == FORKED_LIGHTNING_1)\n+            {\n+                //Forked Lightning stun\n+                me->CastSpell(target, FORKED_LIGHTNING_EFFECT, true);\n+            }\n+            if (baseId == FROST_ARROW_1)\n+            {\n+                if (AuraEffect* sarr = target->GetAuraEffect(SPELL_AURA_MOD_SPEED_SLOW_ALL, SPELLFAMILY_GENERIC, 0x0, 0x4, 0x0, me->GetGUID()))\n+                {\n+                    sarr->GetBase()->RefreshDuration();\n+                }\n+                else if (Aura* arro = me->AddAura(FROST_ARROW_EFFECT, target))\n+                {\n+                    int32 dur = target->IsPlayer() ? 2000 : 6000;\n+                    arro->SetDuration(dur);\n+                    arro->SetMaxDuration(dur);\n+                }\n+            }\n+            if (baseId == SPELL_PARALYTIC_POISON)\n+            {\n+                if (Aura* para = target->GetAura(SPELL_PARALYTIC_POISON, me->GetGUID()))\n+                {\n+                    static constexpr int32 duration_threshold = 6000;\n+                    if (para->GetMaxDuration() > duration_threshold)\n+                    {\n+                        para->SetDuration(duration_threshold);\n+                        para->SetMaxDuration(duration_threshold);\n+                    }\n+                    else\n+                        para->RefreshDuration();\n+                }\n+            }\n+\n+            OnSpellHitTarget(target, spell);\n+        }\n+\n+        void SpellHit(Unit* wcaster, SpellInfo const* spell) override\n+        {\n+            Unit* caster = wcaster->ToUnit();\n+            if (!caster)\n+                return;\n+\n+            OnSpellHit(caster, spell);\n+        }\n+\n+        void OnBotDamageDealt(Unit* victim, uint32 damage, CleanDamage const* cleanDamage, DamageEffectType /*damagetype*/, SpellInfo const* /*spellInfo*/) override\n+        {\n+            if (damage && victim && cleanDamage && (cleanDamage->attackType == BASE_ATTACK || cleanDamage->attackType == OFF_ATTACK) &&\n+                victim->IsWithinCombatRange(me, ATTACK_DISTANCE))\n+            {\n+                if (urand(0, 100) < 5)\n+                {\n+                    int32 baseAmount = 1;\n+                    if (AuraEffect* pois = victim->GetAuraEffect(SPELL_PARALYTIC_POISON, EFFECT_0, me->GetGUID()))\n+                        baseAmount = pois->GetAmount() * 2;\n+                    else\n+                        baseAmount = int32(me->GetFloatValue(UNIT_FIELD_MAXDAMAGE)) + 1;\n+                    //CastSpellExtraArgs args(true);\n+                    //args.AddSpellBP0(baseAmount);\n+                    //me->CastSpell(victim, SPELL_PARALYTIC_POISON, args);\n+                    me->CastCustomSpell(victim, SPELL_PARALYTIC_POISON, &baseAmount, nullptr, nullptr, true);\n+                }\n+            }\n+        }\n+\n+        void DamageDealt(Unit* victim, uint32& damage, DamageEffectType damageType, SpellSchoolMask damageSchoolMask) override\n+        {\n+            bot_ai::DamageDealt(victim, damage, damageType, damageSchoolMask);\n+        }\n+\n+        void DamageTaken(Unit* u, uint32& damage, DamageEffectType /*damageType*/, SpellSchoolMask /*schoolMask*/) override\n+        {\n+            if (damage && me->HasAuraType(SPELL_AURA_MANA_SHIELD))\n+                me->RemoveAurasDueToSpell(MANA_SHIELD_1);\n+\n+            if (!u)\n+                return;\n+            if (!u->IsInCombat() && !me->IsInCombat())\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void OwnerAttackedBy(Unit* u) override\n+        {\n+            if (!u)\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        uint8 GetPetPositionNumber(Creature const* /*summon*/) const override\n+        {\n+            return 0;\n+        }\n+\n+        void SummonBotPet()\n+        {\n+            if (!_minions.empty())\n+                UnsummonAll(false);\n+\n+            Position spos;\n+            if (Unit const* mytar = me->GetVictim())\n+                mytar->GetNearPoint(mytar, spos.m_positionX, spos.m_positionY, spos.m_positionZ, 0.f, me->GetDistance2d(mytar) * 0.25f, mytar->GetAbsoluteAngle(me));\n+            else\n+                me->GetNearPoint(me, spos.m_positionX, spos.m_positionY, spos.m_positionZ, 0.f, 10.f, 0.f);\n+\n+            Creature* myPet = me->SummonCreature(BOT_PET_TORNADO, spos, TEMPSUMMON_CORPSE_DESPAWN);\n+            myPet->SetCreator(master);\n+            myPet->SetOwnerGUID(me->GetGUID());\n+            myPet->SetFaction(master->GetFaction());\n+            myPet->SetControlledByPlayer(!IAmFree());\n+            myPet->SetPvP(me->IsPvP());\n+            myPet->SetByteValue(UNIT_FIELD_BYTES_2, 1, master->GetByteValue(UNIT_FIELD_BYTES_2, 1));\n+            myPet->SetUInt32Value(UNIT_CREATED_BY_SPELL, TORNADO_1);\n+\n+            CreatureMovementData& cmData = const_cast<CreatureMovementData&>(myPet->GetMovementTemplate());\n+            cmData.Swim = false;\n+            cmData.Ground = CreatureGroundMovementType::Run;\n+            cmData.Flight = CreatureFlightMovementType::None;\n+\n+            _minions.insert(myPet);\n+        }\n+\n+        void UnsummonAll(bool savePets = true) override\n+        {\n+            UnsummonCreatures(_minions, savePets);\n+        }\n+\n+        void SummonedCreatureDies(Creature* /*summon*/, Unit* /*killer*/) override\n+        {\n+            //BOT_LOG_ERROR(\"entities.unit\", \"SummonedCreatureDies: %s's %s\", me->GetName().c_str(), summon->GetName().c_str());\n+            //if (summon == botPet)\n+            //    botPet = nullptr;\n+        }\n+\n+        void SummonedCreatureDespawn(Creature* summon) override\n+        {\n+            //BOT_LOG_ERROR(\"entities.unit\", \"SummonedCreatureDespawn: %s's %s\", me->GetName().c_str(), summon->GetName().c_str());\n+            if (_minions.contains(summon))\n+                _minions.erase(summon);\n+        }\n+\n+        float GetSpellAttackRange(bool longRange) const override\n+        {\n+            return longRange ? CalcSpellMaxRange(FROST_ARROW_1) - 6.f : CalcSpellMaxRange(FROST_ARROW_1) - 15.f;\n+        }\n+\n+        uint32 GetAIMiscValue(uint32 data) const override\n+        {\n+            switch (data)\n+            {\n+                case BOTAI_MISC_PET_TYPE:\n+                    return BOT_PET_TORNADO;\n+                default:\n+                    return 0;\n+            }\n+        }\n+\n+        void Reset() override\n+        {\n+            UnsummonAll(false);\n+\n+            _spell_preact = false;\n+\n+            DefaultInit();\n+\n+            //swim mod\n+            if (Aura* swim = me->AddAura(NAGA_SWIM_PASSIVE, me))\n+                swim->GetEffect(0)->ChangeAmount(200);\n+\n+            //threat mod\n+            if (Aura* threat = me->AddAura(SPELL_THREAT_MOD, me))\n+                threat->GetEffect(0)->ChangeAmount(-50);\n+        }\n+\n+        void ReduceCD(uint32 /*diff*/) override\n+        {\n+            //if (trapTimer > diff)                   trapTimer -= diff;\n+        }\n+\n+        void InitPowers() override\n+        {\n+            me->SetPowerType(POWER_MANA);\n+        }\n+\n+        void InitSpells() override\n+        {\n+            //uint8 lvl = me->GetLevel();\n+            //InitSpellMap(AUTO_SHOT_1);\n+            InitSpellMap(SHOOT_BOW_1);\n+            InitSpellMap(FORKED_LIGHTNING_1);\n+            InitSpellMap(FROST_ARROW_1);\n+            InitSpellMap(MANA_SHIELD_1);\n+            InitSpellMap(TORNADO_1);\n+        }\n+\n+        void ApplyClassPassives() const override\n+        {\n+        }\n+\n+        //bool CanUseManually(uint32 basespell) const override\n+        //{\n+        //    switch (basespell)\n+        //    {\n+        //        case FORKED_LIGHTNING_1:\n+        //        case TORNADO_1:\n+        //            return true;\n+        //        default:\n+        //            return false;\n+        //    }\n+        //}\n+\n+        bool HasAbilitiesSpecifics() const override { return true; }\n+        void FillAbilitiesSpecifics(Player const* player, std::list<std::string> &specList) override\n+        {\n+            bool amount_is_mana = true;\n+            float amount = AssertBotSpellInfoOverride(MANA_SHIELD_1)->GetEffect(EFFECT_0).CalcValueMultiplier(me); //mana per damage\n+            if (amount < 1.0f)\n+            {\n+                amount_is_mana = false;\n+                amount = 1.f / amount;\n+            }\n+\n+            uint32 text_id = amount_is_mana ? BOT_TEXT_MANA_PER_DAMAGE : BOT_TEXT_DAMAGE_PER_MANA;\n+            std::ostringstream amount_sstr;\n+            amount_sstr.setf(std::ios_base::fixed);\n+            amount_sstr.precision(1);\n+            amount_sstr << LocalizedNpcText(player, text_id) << \": \" << amount;\n+\n+            specList.push_back(amount_sstr.str());\n+        }\n+\n+        std::vector<uint32> const* GetDamagingSpellsList() const override\n+        {\n+            return &Seawitch_spells_damage;\n+        }\n+        std::vector<uint32> const* GetCCSpellsList() const override\n+        {\n+            return &Seawitch_spells_cc;\n+        }\n+        //std::vector<uint32> const* GetHealingSpellsList() const override\n+        //{\n+        //    return &Seawitch_spells_heal;\n+        //}\n+        std::vector<uint32> const* GetSupportSpellsList() const override\n+        {\n+            return &Seawitch_spells_support;\n+        }\n+    private:\n+        using Summons = std::set<Creature*>;\n+        Summons _minions;\n+\n+        bool _spell_preact{};\n+\n+        float _manaPerDamageMult() const\n+        {\n+            switch (me->GetLevel() / 10)\n+            {\n+                case 8: return 1.f / 100.00f;\n+                case 7: return 1.f /  50.00f;\n+                case 6: return 1.f /  20.00f;\n+                case 5: return 1.f /  10.00f;\n+                case 4: return 1.f /   4.00f;\n+                case 3: return 1.f /   2.50f;\n+                case 2: return 1.f /   1.67f;\n+                case 1: return 1.f /   1.25f;\n+                default:return         1.00f;\n+            }\n+        }\n+    };\n+};\n+\n+void AddSC_sea_witch_bot()\n+{\n+    new sea_witch_bot();\n+}\ndiff --git a/src/server/game/AI/NpcBots/bot_shaman_ai.cpp b/src/server/game/AI/NpcBots/bot_shaman_ai.cpp\nnew file mode 100644\nindex 0000000000..1a49e0a275\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bot_shaman_ai.cpp\n@@ -0,0 +1,2875 @@\n+#include \"bot_ai.h\"\n+#include \"botlogtraits.h\"\n+#include \"botmgr.h\"\n+#include \"bottext.h\"\n+#include \"bottraits.h\"\n+#include \"Group.h\"\n+#include \"Item.h\"\n+#include \"Log.h\"\n+#include \"Map.h\"\n+#include \"MotionMaster.h\"\n+#include \"ObjectAccessor.h\"\n+#include \"ObjectMgr.h\"\n+#include \"Player.h\"\n+#include \"RaceMgr.h\"\n+#include \"ScriptMgr.h\"\n+#include \"SpellAuraEffects.h\"\n+#include \"Spell.h\"\n+#include \"SpellMgr.h\"\n+#include \"Totem.h\"\n+#include \"WorldSession.h\"\n+/*\n+Shaman NpcBot (reworked by Trickerer onlysuffering@gmail.com)\n+Complete - around 90%\n+TODO: Elemental mastery (exclusive cd with NatSw), Lava Lash\n+Problems:\n+Unsummon elemental totems if Elementals are killed\n+Aura application bug for bot in other subgroup, maybe caused by creatorGUID mismatch\n+*/\n+\n+static constexpr uint8 MAX_WOLVES = 2;\n+static constexpr uint8 MAX_TOTEMS = 4;\n+\n+enum ShamanBaseSpells\n+{\n+    HEALING_WAVE_1                      = 331,\n+    CHAIN_HEAL_1                        = 1064,\n+    LESSER_HEALING_WAVE_1               = 8004,\n+    RIPTIDE_1                           = 61295,\n+    ANCESTRAL_SPIRIT_1                  = 2008,\n+    CURE_TOXINS_1                       = 526,\n+    CLEANSE_SPIRIT_1                    = 51886,\n+    FLAME_SHOCK_1                       = 8050,\n+    EARTH_SHOCK_1                       = 8042,\n+    FROST_SHOCK_1                       = 8056,\n+    STORMSTRIKE_1                       = 17364,\n+    LIGHTNING_BOLT_1                    = 403,\n+    CHAIN_LIGHTNING_1                   = 421,\n+    LAVA_BURST_1                        = 51505,\n+    THUNDERSTORM_1                      = 51490,\n+    LIGHTNING_SHIELD_1                  = 324,\n+    EARTH_SHIELD_1                      = 974,\n+    WATER_SHIELD_1                      = 52127,\n+    WATER_BREATHING_1                   = 131,\n+    WATER_WALKING_1                     = 546,\n+    PURGE_1                             = 370,\n+    WIND_SHEAR_1                        = 57994,\n+    HEX_1                               = 51514,\n+    BLOODLUST_1                         = 2825,\n+    HEROISM_1                           = 32182,\n+    SHAMANISTIC_RAGE_1                  = 30823,\n+    NATURES_SWIFTNESS_1                 = 16188,//castegory = 1202\n+    //ELEMENTAL_MASTERY_1                 = 16166,//castegory = 1202 NYI\n+    TIDAL_FORCE_1                       = 55198,\n+\n+    GHOST_WOLF_1                        = 2645,\n+\n+    FIRE_NOVA_1                         = 1535,//shaman spell\n+    EARTHBIND_TOTEM_1                   = 2484,\n+    MAGMA_TOTEM_1                       = 8190,\n+    SEARING_TOTEM_1                     = 3599,\n+    STONECLAW_TOTEM_1                   = 5730,\n+    FIRE_ELEMENTAL_TOTEM_1              = 2894,\n+    EARTH_ELEMENTAL_TOTEM_1             = 2062,\n+    FIRE_RESISTANCE_TOTEM_1             = 8184,\n+    FROST_RESISTANCE_TOTEM_1            = 8181,\n+    NATURE_RESISTANCE_TOTEM_1           = 10595,\n+    FLAMETONGUE_TOTEM_1                 = 8227,\n+    GROUNDING_TOTEM_1                   = 8177,\n+    SENTRY_TOTEM_1                      = 6495,\n+    STONESKIN_TOTEM_1                   = 8071,\n+    STRENGTH_OF_EARTH_TOTEM_1           = 8075,\n+    WINDFURY_TOTEM_1                    = 8512,\n+    WRATH_OF_AIR_TOTEM_1                = 3738,\n+    CLEANSING_TOTEM_1                   = 8170,\n+    HEALING_STREAM_TOTEM_1              = 5394,\n+    MANA_SPRING_TOTEM_1                 = 5675,\n+    TOTEM_OF_WRATH_1                    = 30706,\n+    MANA_TIDE_TOTEM_1                   = 16190,\n+    TREMOR_TOTEM_1                      = 8143,\n+\n+    TOTEMIC_RECALL_1                    = 36936,\n+\n+    REINCARNATION_1                     = 21169,\n+\n+    FERAL_SPIRIT_1                      = 51533, //not casted\n+\n+    //ROCKBITER_WEAPON_1                  = 8017, //disabled due to bonus handling method\n+    FLAMETONGUE_WEAPON_1                = 8024,\n+    FROSTBRAND_WEAPON_1                 = 8033,\n+    WINDFURY_WEAPON_1                   = 8232,\n+    EARTHLIVING_WEAPON_1                = 51730\n+};\n+\n+enum ShamanPassives\n+{\n+    //Elemental\n+    ELEMENTAL_FOCUS                     = 16164,//clearcast\n+    ELEMENTAL_DEVASTATION1              = 30160,\n+    ELEMENTAL_DEVASTATION2              = 29179,\n+    ELEMENTAL_DEVASTATION3              = 29180,\n+    ELEMENTAL_OATH                      = 51470,//rank 2\n+    //STORM_EARTH_AND_FIRE                = 51486,//rank 3\n+    //Enchancement\n+    TOUGHNESS                           = 16309,//rank 5\n+    FLURRY1                             = 16256,\n+    FLURRY2                             = 16281,\n+    FLURRY3                             = 16282,\n+    FLURRY4                             = 16283,\n+    FLURRY5                             = 16284,\n+    WEAPON_MASTERY                      = 29086,//rank 3\n+    UNLEASHED_RAGE                      = 30809,//rank 3\n+    STATIC_SHOCK                        = 51527,//rank 3\n+    IMPROVED_STORMSTRIKE                = 51522,//rank 2\n+    MAELSTROM_WEAPON1                   = 51528,\n+    MAELSTROM_WEAPON2                   = 51529,\n+    MAELSTROM_WEAPON3                   = 51530,\n+    MAELSTROM_WEAPON4                   = 51531,\n+    MAELSTROM_WEAPON5                   = 51532,\n+    EARTHEN_POWER                       = 51524,//rank 2\n+    //Restoration\n+    ANCESTRAL_HEALING                   = 16240,//rank 3\n+    ANCESTRAL_AWAKENING                 = 51558,//rank 3\n+    IMPROVED_WATER_SHIELD               = 16198,//rank 3\n+    TIDAL_WAVES                         = 51566,//rank 5\n+    //Special\n+    GLYPH_THUNDERSTORM                  = 62132,\n+    GLYPH_TOTEM_OF_WRATH                = 63280,\n+    SHAMAN_T10_RESTO_4P                 = 70808 //Chain Heal HoT\n+};\n+\n+enum ShamanSpecial\n+{\n+    SHAMAN_FLAME_SHOCK_PASSIVE          = 75461,//flame shock damage can be critical in 3.3.5, innate\n+\n+    ELEMENTAL_FOCUS_BUFF                = 16246,\n+    TIDAL_FORCE_BUFF                    = 55166,//Unit::HandleAuraDummy(): case 55198:\n+\n+    MAELSTROM_WEAPON_BUFF               = 53817,\n+    TIDAL_WAVES_BUFF                    = 53390,\n+    STORMSTRIKE_DAMAGE                  = 32175,\n+    STORMSTRIKE_DAMAGE_OFFHAND          = 32176,\n+\n+    LIGHTNING_SHIELD_DAMAGE_1           = 26364,\n+    EARTH_SHIELD_HEAL                   = 379,\n+\n+    RESURRECTION_VISUAL_SPELL           = 21074, //Test NPC Resurrection\n+\n+    EXHAUSTION_AURA                     = 57723,\n+    SATED_AURA                          = 57724,\n+\n+    WINDFURY_ATTACK_MAINHAND            = 25504,\n+    WINDFURY_ATTACK_OFFHAND             = 33750,\n+\n+    STORMEARTHANDFIRE_EARTHGRAB         = 64695,\n+\n+    //TOTEM_AURA_WRATH_AURA1              = 57658,//100\n+    //TOTEM_AURA_WRATH_AURA2              = 57660,//120\n+    //TOTEM_AURA_WRATH_AURA3              = 57662,//140\n+    //TOTEM_AURA_WRATH_AURA4              = 57663,//280\n+    //TOTEM_AURA_RESISTANCE_FIRE_1        = 8185,\n+    //TOTEM_AURA_RESISTANCE_FROST_1       = 8182,\n+    //TOTEM_AURA_RESISTANCE_NATURE_1      = 10596,\n+    //TOTEM_AURA_FLAMETONGUE_1            = 52109,\n+    //TOTEM_AURA_GROUNDING                = 8178,\n+    //TOTEM_AURA_STONESKIN_1              = 8072,\n+    //TOTEM_AURA_STRENGTH_OF_EARTH_1      = 8076,\n+    //TOTEM_AURA_WINDFURY                 = 8515,\n+    //TOTEM_AURA_WRATH_OF_AIR             = 2895,\n+    //TOTEM_AURA_MANA_SPRING_1            = 5677\n+};\n+\n+enum TotemSlot\n+{\n+    T_FIRE  = 0,//m_SummonSlot[1]\n+    T_EARTH = 1,//m_SummonSlot[2]\n+    T_WATER = 2,//m_SummonSlot[3]\n+    T_AIR   = 3,//m_SummonSlot[4]\n+};\n+enum BotTotemType : uint32\n+{\n+    BOT_TOTEM_NONE                  = 0,\n+    BOT_TOTEM_STRENGTH_OF_EARTH     = 1, //main earth totem\n+    BOT_TOTEM_FLAMETONGUE           = 2, //main fire totem\n+    BOT_TOTEM_WRATH                 = 3, //main fire totem\n+    BOT_TOTEM_MANA_SPRING           = 4, //main water totem\n+    BOT_TOTEM_WINDFURY              = 5, //main air totem\n+    BOT_TOTEM_WRATH_OF_AIR          = 6, //main air totem\n+    BOT_TOTEM_STONESKIN             = 7, //secondary earth totem UNUSED\n+    BOT_TOTEM_HEALING_STREAM        = 8, //secondary water totem UNUSED\n+    BOT_TOTEM_TREMOR                = 9, //situative earth 1\n+    BOT_TOTEM_EARTHBIND             = 10, //situative earth 2\n+    BOT_TOTEM_MAGMA                 = 11, //situative fire 1\n+    BOT_TOTEM_MANA_TIDE             = 12, //situative water 1\n+    BOT_TOTEM_CLEANSING             = 13, //situative water 2 non-raid\n+    BOT_TOTEM_GROUNDING             = 14, //situative air 1\n+    BOT_TOTEM_RESISTANCE_FROST      = 15, //manual fire 1\n+    BOT_TOTEM_RESISTANCE_FIRE       = 16, //manual water 1\n+    BOT_TOTEM_RESISTANCE_NATURE     = 17, //manual air 1\n+    BOT_TOTEM_ELEMENTAL_EARTH       = 18, //manual earth 1\n+    BOT_TOTEM_ELEMENTAL_FIRE        = 19, //manual fire 2\n+    BOT_TOTEM_SENTRY                = 20, //UNUSED\n+    BOT_TOTEM_STONECLAW             = 21, //UNUSED\n+    BOT_TOTEM_SEARING               = 22, //UNUSED, annoying as hell too\n+    BOT_TOTEM_END,\n+\n+    BOT_TOTEM_FLAG_MY_TOTEM_FIRE,\n+    BOT_TOTEM_FLAG_MY_TOTEM_EARTH,\n+    BOT_TOTEM_FLAG_MY_TOTEM_WATER,\n+    BOT_TOTEM_FLAG_MY_TOTEM_AIR,\n+\n+    BOT_TOTEM_MASK_SUMMONS          = ((1<<BOT_TOTEM_ELEMENTAL_EARTH)|(1<<BOT_TOTEM_ELEMENTAL_FIRE)),\n+\n+    //BOT_TOTEM_MASK_MY_TOTEM         = (1<<BOT_TOTEM_NONE),\n+\n+    BOT_TOTEM_MASK_STRENGTH_OF_EARTH= (1<<BOT_TOTEM_STRENGTH_OF_EARTH),\n+    BOT_TOTEM_MASK_FLAMETONGUE      = (1<<BOT_TOTEM_FLAMETONGUE),\n+    BOT_TOTEM_MASK_WRATH            = (1<<BOT_TOTEM_WRATH),\n+    BOT_TOTEM_MASK_MANA_SPRING      = (1<<BOT_TOTEM_MANA_SPRING),\n+    BOT_TOTEM_MASK_WINDFURY         = (1<<BOT_TOTEM_WINDFURY),\n+    BOT_TOTEM_MASK_WRATH_OF_AIR     = (1<<BOT_TOTEM_WRATH_OF_AIR),\n+    //BOT_TOTEM_MASK_STONESKIN        = (1<<BOT_TOTEM_STONESKIN),\n+    BOT_TOTEM_MASK_MANA_TIDE        = (1<<BOT_TOTEM_MANA_TIDE),\n+    BOT_TOTEM_MASK_GROUNDING        = (1<<BOT_TOTEM_GROUNDING),\n+    BOT_TOTEM_MASK_RESISTANCE_FROST = (1<<BOT_TOTEM_RESISTANCE_FROST),\n+    BOT_TOTEM_MASK_RESISTANCE_FIRE  = (1<<BOT_TOTEM_RESISTANCE_FIRE),\n+    BOT_TOTEM_MASK_RESISTANCE_NATURE= (1<<BOT_TOTEM_RESISTANCE_NATURE),\n+\n+    BOT_TOTEM_MASK_PRIMARY_FIRE     = (BOT_TOTEM_MASK_FLAMETONGUE | BOT_TOTEM_MASK_WRATH),\n+\n+    BOT_TOTEM_MASK_MY_TOTEM_FIRE    = (1<<BOT_TOTEM_FLAG_MY_TOTEM_FIRE),\n+    BOT_TOTEM_MASK_MY_TOTEM_EARTH   = (1<<BOT_TOTEM_FLAG_MY_TOTEM_EARTH),\n+    BOT_TOTEM_MASK_MY_TOTEM_WATER   = (1<<BOT_TOTEM_FLAG_MY_TOTEM_WATER),\n+    BOT_TOTEM_MASK_MY_TOTEM_AIR     = (1<<BOT_TOTEM_FLAG_MY_TOTEM_AIR),\n+\n+    BOT_TOTEM_MASK_PRIMARY_USE      = (BOT_TOTEM_MASK_STRENGTH_OF_EARTH | BOT_TOTEM_MASK_FLAMETONGUE | \\\n+                                    BOT_TOTEM_MASK_WRATH | BOT_TOTEM_MASK_MANA_SPRING | \\\n+                                    BOT_TOTEM_WINDFURY | BOT_TOTEM_MASK_WRATH_OF_AIR),\n+\n+    BOT_TOTEM_MASK_MY_TOTEM_ALL     = (BOT_TOTEM_MASK_MY_TOTEM_FIRE | BOT_TOTEM_MASK_MY_TOTEM_EARTH | \\\n+                                    BOT_TOTEM_MASK_MY_TOTEM_WATER | BOT_TOTEM_MASK_MY_TOTEM_AIR)\n+};\n+\n+static const std::vector<uint32> Shaman_spells_damage\n+{ EARTH_SHOCK_1, FLAME_SHOCK_1, FROST_SHOCK_1, STORMSTRIKE_1, CHAIN_LIGHTNING_1, LAVA_BURST_1, LIGHTNING_BOLT_1,\n+FIRE_NOVA_1, MAGMA_TOTEM_1, SEARING_TOTEM_1, LIGHTNING_SHIELD_1, THUNDERSTORM_1, EARTH_ELEMENTAL_TOTEM_1, FIRE_ELEMENTAL_TOTEM_1 };\n+static const std::vector<uint32> Shaman_spells_cc{ EARTHBIND_TOTEM_1, FROST_SHOCK_1, HEX_1, WIND_SHEAR_1 };\n+static const std::vector<uint32> Shaman_spells_heal{ EARTH_SHIELD_1, CHAIN_HEAL_1, LESSER_HEALING_WAVE_1, HEALING_WAVE_1, RIPTIDE_1, HEALING_STREAM_TOTEM_1 };\n+static const std::vector<uint32> Shaman_spells_support\n+{ ANCESTRAL_SPIRIT_1, GHOST_WOLF_1, FERAL_SPIRIT_1, BLOODLUST_1, HEROISM_1, CURE_TOXINS_1, CLEANSE_SPIRIT_1,\n+LIGHTNING_SHIELD_1, NATURES_SWIFTNESS_1, PURGE_1, REINCARNATION_1, SHAMANISTIC_RAGE_1, TIDAL_FORCE_1,\n+/*WATER_BREATHING_1, */WATER_SHIELD_1, WATER_WALKING_1, /*ELEMENTAL_MASTERY_1, STONECLAW_TOTEM_1,*/\n+FIRE_RESISTANCE_TOTEM_1, FROST_RESISTANCE_TOTEM_1, NATURE_RESISTANCE_TOTEM_1, FLAMETONGUE_TOTEM_1, GROUNDING_TOTEM_1,\n+/*SENTRY_TOTEM_1, STONESKIN_TOTEM_1, */STRENGTH_OF_EARTH_TOTEM_1, WINDFURY_TOTEM_1, WRATH_OF_AIR_TOTEM_1,\n+CLEANSING_TOTEM_1, MANA_SPRING_TOTEM_1, TOTEM_OF_WRATH_1, MANA_TIDE_TOTEM_1, TREMOR_TOTEM_1/*, TOTEMIC_RECALL_1,\n+ROCKBITER_WEAPON_1, FLAMETONGUE_WEAPON_1, FROSTBRAND_WEAPON_1, WINDFURY_WEAPON_1, EARTHLIVING_WEAPON_1*/ };\n+\n+class shaman_bot : public CreatureScript\n+{\n+public:\n+    shaman_bot() : CreatureScript(\"shaman_bot\") { }\n+\n+    CreatureAI* GetAI(Creature* creature) const override\n+    {\n+        return new shaman_botAI(creature);\n+    }\n+\n+    bool OnGossipHello(Player* player, Creature* creature) override\n+    {\n+        return creature->GetBotAI()->OnGossipHello(player, 0);\n+    }\n+\n+    bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action) override\n+    {\n+        if (bot_ai* ai = creature->GetBotAI())\n+            return ai->OnGossipSelect(player, creature, sender, action);\n+        return true;\n+    }\n+\n+    bool OnGossipSelectCode(Player* player, Creature* creature, uint32 sender, uint32 action, char const* code) override\n+    {\n+        if (bot_ai* ai = creature->GetBotAI())\n+            return ai->OnGossipSelectCode(player, creature, sender, action, code);\n+        return true;\n+    }\n+\n+    struct shaman_botAI : public bot_ai\n+    {\n+        shaman_botAI(Creature* creature) : bot_ai(creature)\n+        {\n+            _botclass = BOT_CLASS_SHAMAN;\n+\n+            mhEnchantExpireTimer = 1;\n+            ohEnchantExpireTimer = 1;\n+            mhEnchant = 0;\n+            ohEnchant = 0;\n+            needChooseMHEnchant = true;\n+            needChooseOHEnchant = true;\n+\n+            InitUnitFlags();\n+        }\n+\n+        bool doCast(Unit* victim, uint32 spellId)\n+        {\n+            if (CheckBotCast(victim, spellId) != SPELL_CAST_OK)\n+                return false;\n+            return bot_ai::doCast(victim, spellId);\n+        }\n+\n+        //only for totems\n+        bool doCast(Unit* victim, uint32 spellId, TriggerCastFlags flags)\n+        {\n+            if (CheckBotCast(victim, spellId) != SPELL_CAST_OK)\n+                return false;\n+            if (bot_ai::doCast(victim, spellId, flags))\n+            {\n+                //Calls: 1.5 sec, totems: 1 sec\n+                GC_Timer = (flags & TRIGGERED_CAST_DIRECTLY) ? 1500 : 1000;\n+                return true;\n+            }\n+\n+            return false;\n+        }\n+\n+        void StartAttack(Unit* u, bool force = false)\n+        {\n+            if (!bot_ai::StartAttack(u, force))\n+                return;\n+            GetInPosition(force, u);\n+        }\n+\n+        void JustEngagedWith(Unit* u) override { TotemsCheckTimer = 0; canTremor = false; bot_ai::JustEngagedWith(u); }\n+        void KilledUnit(Unit* u) override { bot_ai::KilledUnit(u); }\n+        void EnterEvadeMode(EvadeReason why = EVADE_REASON_OTHER) override { bot_ai::EnterEvadeMode(why); }\n+        void MoveInLineOfSight(Unit* u) override { bot_ai::MoveInLineOfSight(u); }\n+        void JustDied(Unit* u) override { UnsummonAll(false); removeShapeshiftForm(); bot_ai::JustDied(u); }\n+\n+        bool removeShapeshiftForm() override\n+        {\n+            ShapeshiftForm form = me->GetShapeshiftForm();\n+            if (form != FORM_NONE)\n+            {\n+                switch (form)\n+                {\n+                    case FORM_GHOSTWOLF:\n+                        me->RemoveAurasDueToSpell(GHOST_WOLF_1);\n+                        break;\n+                    default:\n+                        break;\n+                }\n+            }\n+\n+            return true;\n+        }\n+\n+        void CheckBloodlust(uint32 diff)\n+        {\n+            if (BloodlustCheckTimer > diff || (!me->IsInCombat() && !master->IsInCombat()) ||\n+                me->GetDistance(master) > 18 || Rand() > 35)\n+                return;\n+\n+            BloodlustCheckTimer = 3000;\n+\n+            uint32 BLOODLUST = (me->GetRaceMask() & sRaceMgr->GetAllianceRaceMask()) ? HEROISM_1 : BLOODLUST_1;\n+            if (!IsSpellReady(BLOODLUST, diff))\n+                return;\n+\n+            //already rockin'\n+            if (me->GetAuraEffect(SPELL_AURA_MOD_MELEE_RANGED_HASTE, SPELLFAMILY_SHAMAN, 0x0, 0x40, 0x0) ||\n+                master->GetAuraEffect(SPELL_AURA_MOD_MELEE_RANGED_HASTE, SPELLFAMILY_SHAMAN, 0x0, 0x40, 0x0))\n+                return;\n+\n+            //environment conditions\n+            Unit const* u = me->GetVictim();\n+            Creature const* cre = u ? u->ToCreature() : nullptr;\n+            if (!(u && (u->GetHealth() > me->GetMaxHealth() * 10 || u->IsPlayer() ||\n+                (cre && (cre->IsDungeonBoss() || cre->isWorldBoss())) ||\n+                me->getAttackers().size() + master->getAttackers().size() >= 8)))\n+                return;\n+\n+            //BLOODLUST = GetSpell(BLOODLUST); //not ranked\n+\n+            uint32 sateSpell = (me->GetRaceMask() & sRaceMgr->GetAllianceRaceMask()) ? EXHAUSTION_AURA : SATED_AURA;\n+            for (AuraEffect const* aeff : me->GetAuraEffectsByType(SPELL_AURA_DUMMY))\n+            {\n+                if (aeff->GetEffIndex() != 0) continue;\n+                SpellInfo const* spellInfo = aeff->GetSpellInfo();\n+                if (spellInfo->SpellFamilyName != SPELLFAMILY_GENERIC || spellInfo->SpellIconID != 44) continue;\n+                if (spellInfo->Id == sateSpell)\n+                    return; //can't cast my type of bloodlust\n+            }\n+\n+            me->InterruptNonMeleeSpells(true);\n+            if (doCast(me, BLOODLUST))\n+                return;\n+        }\n+\n+        void CheckTotems(uint32 diff)\n+        {\n+            if (TotemsCheckTimer > diff)\n+                return;\n+\n+            TotemsCheckTimer = urand(1500, 2000) + (!IAmFree() ? 100 * master->GetNpcBotsCount() / 2 : 0);\n+\n+            //Unsummon\n+            for (auto i : NPCBots::index_array<uint8, MAX_TOTEMS>)\n+            {\n+                if (_totems[i].first != ObjectGuid::Empty &&\n+                    (!master->IsAlive() || master->GetDistance(_totems[i].second._pos) > _totems[i].second._effradius) &&\n+                    me->GetDistance(_totems[i].second._pos) > _totems[i].second._effradius)\n+                {\n+                    //Check if we can use totemic recall and regain some mana\n+                    if (!me->GetVictim()/* && GetManaPCT(me) < 90*/ && IsSpellReady(TOTEMIC_RECALL_1, diff))\n+                    {\n+                        uint8 count = 0;\n+                        for (auto j : NPCBots::index_array<uint8, MAX_TOTEMS>)\n+                        {\n+                            if (j == i || _totems[j].first == ObjectGuid::Empty) continue;\n+                            if (me->GetDistance(_totems[j].second._pos) > 20.f)\n+                                ++count;\n+                        }\n+                        if (count > 1)\n+                        {\n+                            if (doCast(me, GetSpell(TOTEMIC_RECALL_1)))\n+                                return;\n+                        }\n+                    }\n+                    Unit* to = ObjectAccessor::GetUnit(*me, _totems[i].first);\n+                    if (!to)\n+                    {\n+                        BOT_LOG_ERROR(\"entities.player\", \"{} has unexpectingly lost totem in slot {}!\", me->GetName().c_str(), i);\n+                        _totems[i].first = ObjectGuid::Empty;\n+                        continue;\n+                    }\n+                    to->ToTotem()->UnSummon();\n+                    //reset summon check timer;\n+                    _totemTimer[i] = 0;\n+                }\n+            }\n+            //global cooldown is not performed below, intead there is a special condition for Calls\n+            if (GC_Timer > diff || me->IsMounted() || Feasting() || IsCasting() ||\n+                (master->IsAlive() && me->GetDistance(master) > 15))\n+                return;\n+\n+            bool CotE = me->GetLevel() >= 30; //Call of the Elements is at level 30;\n+\n+            std::map<uint32, uint32> idMap;\n+            uint32 mask = _getTotemsMask(idMap);\n+            Group const* gr = GetGroup();\n+            std::vector<Unit*> members = BotMgr::GetAllGroupMembers(gr);\n+            uint8 subgr = GetSubGroup();\n+\n+            //EARTH\n+            //EARTHsituative1 : tremor\n+            if (_totemTimer[T_EARTH] <= diff && me->IsInCombat() && !IAmFree() &&\n+                IsSpellReady(TREMOR_TOTEM_1, diff, false) && _totems[T_EARTH].second._type != BOT_TOTEM_TREMOR)\n+            {\n+                //Tremor no cd\n+                if (Unit const* victim = me->GetVictim())\n+                {\n+                    if (Spell const* vspell = victim->GetCurrentSpell(CURRENT_GENERIC_SPELL))\n+                    {\n+                        if (vspell->m_targets.GetUnitTargetGUID() == me->GetGUID())\n+                        {\n+                            SpellInfo const* vspellInfo = vspell->GetSpellInfo();\n+                            static const std::array<uint32, 3> TremorMechanics = { MECHANIC_FEAR, MECHANIC_CHARM, MECHANIC_SLEEP };\n+                            static const auto is_tremor_effect = [](SpellEffectInfo const& effect) {  return effect.IsAura(SPELL_AURA_MOD_FEAR) || effect.IsAura(SPELL_AURA_MOD_CHARM); };\n+                            if (std::ranges::find(TremorMechanics, vspellInfo->Mechanic) != TremorMechanics.cend() ||\n+                                std::ranges::any_of(vspellInfo->Effects, is_tremor_effect))\n+                            {\n+                                canTremor = true;\n+                            }\n+                        }\n+                    }\n+                }\n+                if (!canTremor)\n+                {\n+                    uint8 count = 0;\n+                    for (Unit const* member : members)\n+                    {\n+                        if (me->GetMap() != member->FindMap() || !member->InSamePhase(me) ||\n+                            !member->IsAlive() || me->GetDistance(member) > 20 ||\n+                            (member->IsPlayer() ? member->ToPlayer()->GetSubGroup() : member->ToCreature()->GetSubGroup()) != subgr ||\n+                            (member->IsNPCBot() && member->ToCreature()->IsTempBot()) ||\n+                            !member->HasAuraWithMechanic((1u<<MECHANIC_CHARM)|(1u<<MECHANIC_FEAR)|(1u<<MECHANIC_SLEEP)))\n+                            continue;\n+                        ++count;\n+                    }\n+                    canTremor = count >= (1 + 1*(!!(mask & BOT_TOTEM_MASK_MY_TOTEM_EARTH)));\n+                }\n+                if (canTremor)\n+                {\n+                    if (doCast(me, GetSpell(TREMOR_TOTEM_1), CotE ? TRIGGERED_CAST_DIRECTLY : TRIGGERED_NONE))\n+                        if (!CotE)\n+                            return;\n+                }\n+                //check if casted\n+                if (_totems[T_EARTH].second._type != BOT_TOTEM_TREMOR)\n+                    SetSpellCooldown(TREMOR_TOTEM_1, 3000); //fail\n+            }\n+\n+            if (!(mask & BOT_TOTEM_MASK_MY_TOTEM_EARTH) && _totemTimer[T_EARTH] <= diff && me->IsInCombat())\n+            {\n+                //EARTHsituative2 : earthbind\n+                if (GetSpell(EARTHBIND_TOTEM_1)/* && _totems[T_EARTH].second.type != BOT_TOTEM_EARTHBIND*/)\n+                {\n+                    //15 sec cd, nearby enemies, instant effect\n+                    std::list<Unit*> targets;\n+                    GetNearbyTargetsList(targets, 15.f, 1);\n+                    for (std::list<Unit*>::iterator itr = targets.begin(); itr != targets.end();)\n+                    {\n+                        Unit* u = *itr;\n+                        bool erase = false;\n+                        if (u->HasAuraType(SPELL_AURA_MOD_DECREASE_SPEED) || u->HasAuraType(SPELL_AURA_MOD_SPEED_SLOW_ALL))\n+                            erase = true;\n+                        else if (u->isMoving())\n+                        {\n+                            if (me->GetDistance(u) > 10.f && !u->HasInArc(float(M_PI)/2, me))\n+                                erase = true;\n+                        }\n+                        else if (me->GetDistance(u) > 9.f)\n+                            erase = true;\n+\n+                        if (erase)\n+                        {\n+                            targets.erase(itr++);\n+                            continue;\n+                        }\n+                        ++itr;\n+                    }\n+\n+                    if (uint8(targets.size()) >= (1 + 2*((mask & BOT_TOTEM_MASK_MY_TOTEM_EARTH) != 0)))\n+                    {\n+                        if (doCast(me, GetSpell(EARTHBIND_TOTEM_1), CotE ? TRIGGERED_CAST_DIRECTLY : TRIGGERED_NONE))\n+                            if (!CotE)\n+                                return;\n+                    }\n+                }\n+            }\n+\n+            if (!(mask & BOT_TOTEM_MASK_MY_TOTEM_EARTH) && _totemTimer[T_EARTH] <= diff && me->IsInCombat())\n+            {\n+                //EARTHmain : strength of earth\n+                uint32 SoE = GetSpell(STRENGTH_OF_EARTH_TOTEM_1); //tripple check\n+                if (SoE &&\n+                    (!(mask & BOT_TOTEM_MASK_STRENGTH_OF_EARTH) || idMap[STRENGTH_OF_EARTH_TOTEM_1] < SoE))\n+                {\n+                    //no cd\n+                    if (doCast(me, SoE, CotE ? TRIGGERED_CAST_DIRECTLY : TRIGGERED_NONE))\n+                        if (!CotE)\n+                            return;\n+                }\n+\n+                //EARTHlast : earth elemental (for mass taunt)\n+                //uint32 earthElem = GetSpell(EARTH_ELEMENTAL_TOTEM_1);\n+                //if (earthElem && IsSpellReady(EARTH_ELEMENTAL_TOTEM_1, diff) && !me->GetMap()->IsDungeon() &&\n+                //    me->getAttackers().size() > 1)\n+                //{\n+                //    //no cd\n+                //    if (doCast(me, earthElem, CotE ? TRIGGERED_CAST_DIRECTLY : TRIGGERED_NONE))\n+                //        if (!CotE)\n+                //            return;\n+                //}\n+            }\n+\n+            //FIRE\n+            //FIREsituative1 : magma\n+            if (_totemTimer[T_FIRE] <= diff && me->IsInCombat() && !IAmFree() && HasRole(BOT_ROLE_DPS) &&\n+                GetSpell(MAGMA_TOTEM_1)/* && _totems[T_FIRE].second.type != BOT_TOTEM_MAGMA*/)\n+            {\n+                //magma no cd 8 yd, 2 sec delay before first tick\n+                std::list<Unit*> targets;\n+                GetNearbyTargetsList(targets, 13.f, 1);\n+                for (std::list<Unit*>::iterator itr = targets.begin(); itr != targets.end();)\n+                {\n+                    Unit* u = *itr;\n+                    bool erase = false;\n+                    if (u->isMoving())\n+                    {\n+                        if (me->GetDistance(u) > 10.f && !u->HasInArc(float(M_PI)/2, me))\n+                            erase = true;\n+                    }\n+                    else if (me->GetDistance(u) > 7.f)\n+                        erase = true;\n+\n+                    if (erase)\n+                    {\n+                        targets.erase(itr++);\n+                        continue;\n+                    }\n+                    ++itr;\n+                }\n+\n+                if (uint8(targets.size()) >= (3 + 3*((mask & BOT_TOTEM_MASK_MY_TOTEM_FIRE) != 0)))\n+                {\n+                    if (doCast(me, GetSpell(MAGMA_TOTEM_1), CotE ? TRIGGERED_CAST_DIRECTLY : TRIGGERED_NONE))\n+                        if (!CotE)\n+                            return;\n+                }\n+            }\n+\n+            if (!(mask & BOT_TOTEM_MASK_MY_TOTEM_FIRE) && me->IsInCombat() && _totemTimer[T_FIRE] <= diff)\n+            {\n+                //FIREMain : wrath or flametongue no cd\n+                //aura is exclusive so check mask\n+                uint32 base = TOTEM_OF_WRATH_1;\n+                uint32 wrathTotem = GetSpell(TOTEM_OF_WRATH_1);\n+                uint32 fMask = BOT_TOTEM_MASK_WRATH;\n+                if (!wrathTotem)\n+                {\n+                    base = FLAMETONGUE_TOTEM_1;\n+                    wrathTotem = GetSpell(FLAMETONGUE_TOTEM_1);\n+                    fMask = BOT_TOTEM_MASK_FLAMETONGUE;\n+                }\n+                if (wrathTotem &&\n+                    ((mask & BOT_TOTEM_MASK_PRIMARY_FIRE) < fMask ||\n+                    ((mask & BOT_TOTEM_MASK_PRIMARY_FIRE) == fMask && idMap[base] < wrathTotem)))\n+                {\n+                    if (doCast(me, wrathTotem, CotE ? TRIGGERED_CAST_DIRECTLY : TRIGGERED_NONE))\n+                        if (!CotE)\n+                            return;\n+                }\n+\n+                //FIREaddin : fire elemental\n+                //uint32 fireElem = GetSpell(FIRE_ELEMENTAL_TOTEM_1);\n+                //if (fireElem && IsSpellReady(FIRE_ELEMENTAL_TOTEM_1, diff) && !me->GetMap()->IsDungeon())\n+                //{\n+                //    if (doCast(me, fireElem, CotE ? TRIGGERED_CAST_DIRECTLY : TRIGGERED_NONE))\n+                //        if (!CotE)\n+                //            return;\n+                //}\n+            }\n+\n+            if (!(mask & BOT_TOTEM_MASK_MY_TOTEM_FIRE) && me->IsInCombat() && _totemTimer[T_FIRE] <= diff)\n+            {\n+                //FIRElastresort : frostres (3 shamans of same level req)\n+                uint32 frostRes = GetSpell(FROST_RESISTANCE_TOTEM_1);\n+                if (frostRes && !IAmFree() &&\n+                    (!(mask & BOT_TOTEM_MASK_RESISTANCE_FROST) || idMap[FROST_RESISTANCE_TOTEM_1] < frostRes))\n+                {\n+                    if (doCast(me, frostRes, CotE ? TRIGGERED_CAST_DIRECTLY : TRIGGERED_NONE))\n+                        if (!CotE)\n+                            return;\n+                }\n+            }\n+\n+            //WATER\n+            //WATERsituative1 : manatide\n+            if (_totemTimer[T_WATER] <= diff && me->IsInCombat() && !IAmFree() &&\n+                IsSpellReady(MANA_TIDE_TOTEM_1, diff, false))\n+            {\n+                //5 min cd, party members only, instant effect +4 ticks in 12 secs\n+                bool cast = false;\n+                if (master->IsInCombat() && master->GetPowerType() == POWER_MANA &&\n+                    GetManaPCT(master) < 35 && me->GetDistance(master) < 18)\n+                    cast = true;\n+                else if (me->IsInCombat() && GetManaPCT(me) < 35)\n+                    cast = true;\n+                else\n+                {\n+                    uint8 count = 0;\n+                    for (Unit const* member : members)\n+                    {\n+                        if (me->GetMap() != member->FindMap() || !member->InSamePhase(me) ||\n+                            !member->IsAlive() || !member->IsInCombat() || member->GetPowerType() != POWER_MANA ||\n+                            (member->IsPlayer() ? member->ToPlayer()->GetSubGroup() : member->ToCreature()->GetSubGroup()) != subgr ||\n+                            GetManaPCT(member) > 35 || me->GetDistance(member) > 20 ||\n+                            (member->IsNPCBot() && member->ToCreature()->IsTempBot()))\n+                            continue;\n+                        ++count;\n+                    }\n+                    cast = (count >= (3 + 1*(!!(mask & BOT_TOTEM_MASK_MY_TOTEM_WATER))));\n+                }\n+                if (cast)\n+                {\n+                    if (doCast(me, GetSpell(MANA_TIDE_TOTEM_1), CotE ? TRIGGERED_CAST_DIRECTLY : TRIGGERED_NONE))\n+                        if (!CotE)\n+                            return;\n+                }\n+                //check if casted\n+                if (_totems[T_WATER].second._type != BOT_TOTEM_MANA_TIDE)\n+                    SetSpellCooldown(MANA_TIDE_TOTEM_1, 3000); //fail\n+            }\n+\n+            //WATERsituative2 : cleansing\n+            //REMOVED CHECKS ARE TOO HEAVY\n+\n+            if (!(mask & BOT_TOTEM_MASK_MY_TOTEM_WATER) && _totemTimer[T_WATER] <= diff)\n+            {\n+                //WATERmain : manaspring\n+                uint32 MSpring = GetSpell(MANA_SPRING_TOTEM_1); //tripple check\n+                if (MSpring && (me->IsInCombat() || !master->isMoving()) && !(mask & BOT_TOTEM_MASK_MANA_SPRING))\n+                {\n+                    //no cd\n+                    bool cast = false;\n+                    if (!master->isMoving() && master->GetPowerType() == POWER_MANA && GetManaPCT(master) < 85)\n+                        cast = true;\n+                    else if (!me->isMoving() && GetManaPCT(me) < 95)\n+                        cast = true;\n+                    else\n+                    {\n+                        for (Unit const* member : members)\n+                        {\n+                            if (me->GetMap() != member->FindMap() || !member->InSamePhase(me) ||\n+                                !member->IsAlive() || member->GetPowerType() != POWER_MANA ||\n+                                GetManaPCT(member) > 85 || me->GetDistance(member) > 25 ||\n+                                (member->IsNPCBot() && member->ToCreature()->IsTempBot()))\n+                                continue;\n+                            cast = true;\n+                            break;\n+                        }\n+                    }\n+                    if (cast)\n+                    {\n+                        if (doCast(me, MSpring, CotE ? TRIGGERED_CAST_DIRECTLY : TRIGGERED_NONE))\n+                            if (!CotE)\n+                                return;\n+                    }\n+                }\n+            }\n+\n+            if (!(mask & BOT_TOTEM_MASK_MY_TOTEM_WATER) && _totemTimer[T_WATER] <= diff)\n+            {\n+                //WATERlastresort : fireres (2-3 shamans of same level req)\n+                uint32 fireRes = GetSpell(FIRE_RESISTANCE_TOTEM_1);\n+                if (fireRes && _totemTimer[T_WATER] <= diff && me->IsInCombat() && !IAmFree() &&\n+                    (!(mask & BOT_TOTEM_MASK_RESISTANCE_FIRE) || idMap[FIRE_RESISTANCE_TOTEM_1] < fireRes))\n+                {\n+                    if (doCast(me, fireRes, CotE ? TRIGGERED_CAST_DIRECTLY : TRIGGERED_NONE))\n+                        if (!CotE)\n+                            return;\n+                }\n+            }\n+\n+            //AIR\n+            //AIRsituative1 : grounding\n+            if (_totemTimer[T_AIR] <= diff && me->IsInCombat() &&/* !IAmFree() &&*/\n+                IsSpellReady(GROUNDING_TOTEM_1, diff, false))\n+            {\n+                //grounding 15 sec cd, party members only (and bot and master of course)\n+                bool cast = false;\n+                if (Unit const* u = FindCastingTarget(27)) //totem must be within cast distance\n+                {\n+                    if (Spell const* spell = u->GetCurrentSpell(CURRENT_GENERIC_SPELL))\n+                    {\n+                        ObjectGuid tGuid = spell->m_targets.GetUnitTargetGUID();\n+                        if (tGuid == me->GetGUID() || tGuid == master->GetGUID() || (gr && gr->IsMember(tGuid) && gr->SameSubGroup(tGuid, me->GetGUID())))\n+                        {\n+                            Unit const* t = ObjectAccessor::GetUnit(*me, tGuid);\n+                            if (t && t->GetDistance(me) < 27 && !t->HasAuraType(SPELL_AURA_SPELL_MAGNET))\n+                                cast = true;\n+                        }\n+                    }\n+                }\n+                if (cast)\n+                {\n+                    if (doCast(me, GetSpell(GROUNDING_TOTEM_1), CotE ? TRIGGERED_CAST_DIRECTLY : TRIGGERED_NONE))\n+                        if (!CotE)\n+                            return;\n+                }\n+            }\n+\n+            if (!(mask & BOT_TOTEM_MASK_MY_TOTEM_AIR) && _totemTimer[T_AIR] <= diff && me->IsInCombat())\n+            {\n+                //AIRmain1 : wrathofair - if windfury is disabled or me and master both casters\n+                if (!(mask & BOT_TOTEM_MASK_WRATH_OF_AIR) && GetSpell(WRATH_OF_AIR_TOTEM_1))\n+                {\n+                    bool cast = false;\n+\n+                    if (!IsMelee() && HasRole(BOT_ROLE_DPS|BOT_ROLE_HEAL) && !IsMeleeClass(master->GetClass()))\n+                        cast = true;\n+                    else if (!GetSpell(WINDFURY_TOTEM_1)) //disabled\n+                        cast = true;\n+                    else if (!(mask & BOT_TOTEM_MASK_MY_TOTEM_AIR))\n+                        if (mask & BOT_TOTEM_MASK_WINDFURY) //already have windfury from someone else\n+                            cast = true;\n+\n+                    if (cast)\n+                    {\n+                        if (doCast(me, GetSpell(WRATH_OF_AIR_TOTEM_1), CotE ? TRIGGERED_CAST_DIRECTLY : TRIGGERED_NONE))\n+                            //if (!CotE)\n+                                return;\n+                    }\n+                }\n+            }\n+\n+            if (!(mask & BOT_TOTEM_MASK_MY_TOTEM_AIR) && _totemTimer[T_AIR] <= diff && me->IsInCombat())\n+            {\n+                //AIRmain2 : windfury\n+                if (!(mask & BOT_TOTEM_MASK_WINDFURY) && GetSpell(WINDFURY_TOTEM_1))\n+                {\n+                    bool cast = false;\n+\n+                    if ((IsMelee() && HasRole(BOT_ROLE_DPS)) || (!IAmFree() && IsMeleeClass(master->GetClass())))\n+                        cast = true;\n+                    else if (!GetSpell(WRATH_OF_AIR_TOTEM_1)) //disabled or not available yet\n+                        cast = true;\n+                    else if (!(mask & BOT_TOTEM_MASK_MY_TOTEM_AIR))\n+                        if (mask & BOT_TOTEM_MASK_WRATH_OF_AIR) //already have wrath of air from someone else\n+                            cast = true;\n+\n+                    if (cast)\n+                    {\n+                        if (doCast(me, GetSpell(WINDFURY_TOTEM_1), CotE ? TRIGGERED_CAST_DIRECTLY : TRIGGERED_NONE))\n+                            //if (!CotE)\n+                                return;\n+                    }\n+                }\n+            }\n+\n+            if (!(mask & BOT_TOTEM_MASK_MY_TOTEM_AIR) && _totemTimer[T_AIR] <= diff && me->IsInCombat())\n+            {\n+                //AIRlastresort : natureres (3-4 shamans of same level req)\n+                uint32 natureRes = GetSpell(NATURE_RESISTANCE_TOTEM_1);\n+                if (natureRes && !IAmFree() &&\n+                    (!(mask & BOT_TOTEM_MASK_RESISTANCE_NATURE) || idMap[NATURE_RESISTANCE_TOTEM_1] < natureRes))\n+                {\n+                    if (doCast(me, natureRes, CotE ? TRIGGERED_CAST_DIRECTLY : TRIGGERED_NONE))\n+                        //if (!CotE)\n+                            return;\n+                }\n+            }\n+        }\n+\n+        void CheckShamanisticRage(uint32 diff)\n+        {\n+            if (!IsSpellReady(SHAMANISTIC_RAGE_1, diff) || !me->IsInCombat() || IsCasting() || Rand() > 35)\n+                return;\n+\n+            bool cast = false;\n+            //case 1: hp pressure\n+            if (GetHealthPCT(me) < (50 + 20 * me->HasAuraType(SPELL_AURA_PERIODIC_DAMAGE) + 5 * uint32(me->getAttackers().size())))\n+                cast = true;\n+            //case 2: low mana (melee)\n+            else if (me->GetVictim() && !CCed(me, true) && HasRole(BOT_ROLE_DPS) && IsMelee() && GetManaPCT(me) < 40)\n+                cast = true;\n+\n+            if (cast && doCast(me, GetSpell(SHAMANISTIC_RAGE_1)))\n+                return;\n+        }\n+\n+        void CheckThunderStorm(uint32 diff)\n+        {\n+            if (!IsSpellReady(THUNDERSTORM_1, diff) || !me->IsAlive() || !HasRole(BOT_ROLE_DPS) || IsCasting() || Rand() > 25)\n+                return;\n+\n+            //case 1: low mana\n+            if (GetManaPCT(me) < 25)\n+            {\n+                if (doCast(me, GetSpell(THUNDERSTORM_1)))\n+                    return;\n+            }\n+\n+            //case 2: AoE damage\n+            //AttackerSet m_attackers = master->getAttackers();\n+            Unit::AttackerSet const& b_attackers = me->getAttackers();\n+            if (b_attackers.empty())\n+                return;\n+\n+            uint8 tCount = 0;\n+            for (Unit const* attacker : b_attackers)\n+            {\n+                if (!attacker) continue;\n+                if (me->GetDistance(attacker) > 9) continue;\n+                if (me->IsValidAttackTarget(attacker))\n+                {\n+                    ++tCount;\n+                    break;\n+                }\n+            }\n+\n+            if (tCount > 1)\n+            {\n+                if (doCast(me, GetSpell(THUNDERSTORM_1)))\n+                    return;\n+            }\n+        }\n+\n+        void Counter(uint32 diff)\n+        {\n+            if (!IsSpellReady(WIND_SHEAR_1, diff, false) || (HasRole(BOT_ROLE_HEAL) && IsCasting()) || Rand() > 40)\n+                return;\n+\n+            if (Unit* target = FindCastingTarget(CalcSpellMaxRange(WIND_SHEAR_1), 0, WIND_SHEAR_1))\n+            {\n+                me->InterruptNonMeleeSpells(false);\n+                if (doCast(target, GetSpell(WIND_SHEAR_1)))\n+                    return;\n+            }\n+        }\n+\n+        void CheckShield(uint32 diff)\n+        {\n+            if (GC_Timer > diff || ShieldCheckTimer > diff || IsCasting() || Rand() > 15)\n+                return;\n+\n+            ShieldCheckTimer = 2000;\n+\n+            //Aura const* shield = nullptr;\n+            uint32 SHIELD =\n+                HasRole(BOT_ROLE_TANK)   ? GetSpell(EARTH_SHIELD_1) :\n+                HasRole(BOT_ROLE_HEAL)   ? GetSpell(WATER_SHIELD_1) :\n+                HasRole(BOT_ROLE_DPS)    ? GetSpell(LIGHTNING_SHIELD_1) :\n+                0;\n+            SHIELD =\n+                SHIELD ? SHIELD :\n+                GetSpell(WATER_SHIELD_1) ? GetSpell(WATER_SHIELD_1) :\n+                GetSpell(EARTH_SHIELD_1) ? GetSpell(EARTH_SHIELD_1) :\n+                0;\n+\n+            if (!SHIELD && HasRole(BOT_ROLE_DPS))\n+                SHIELD = GetSpell(LIGHTNING_SHIELD_1);\n+\n+            if (!SHIELD)\n+                return;\n+\n+            AuraApplication const* sh = me->GetAuraApplicationOfRankedSpell(SHIELD);\n+            if (!sh || sh->GetBase()->GetCharges() < 5 || sh->GetBase()->GetDuration() < 30000 ||\n+                sh->GetBase()->GetSpellInfo()->GetRank() < sSpellMgr->GetSpellInfo(SHIELD)->GetRank())\n+            {\n+                if (doCast(me, SHIELD))\n+                    return;\n+            }\n+        }\n+\n+        void UpdateDeadAI(uint32 diff) override\n+        {\n+            if (IsSpellReady(REINCARNATION_1, diff, false) && (IAmFree() || master->IsInCombat()) && Rand() < 20)\n+                if (doCast(me, GetSpell(REINCARNATION_1)))\n+                    return;\n+\n+            bot_ai::UpdateDeadAI(diff);\n+        }\n+\n+        void UpdateAI(uint32 diff) override\n+        {\n+            if (!GlobalUpdate(diff))\n+                return;\n+\n+            DoVehicleActions(diff);\n+            if (!CanBotAttackOnVehicle())\n+                return;\n+\n+            CheckShamanisticRage(diff);\n+            CheckThunderStorm(diff);\n+\n+            CheckHexy(diff);\n+            CheckEarthy(diff);\n+\n+            if (IsPotionReady())\n+            {\n+                if (GetManaPCT(me) < 33)\n+                    DrinkPotion(true);\n+                else if (GetHealthPCT(me) < 50 && (!HasRole(BOT_ROLE_HEAL) || me->HasAuraType(SPELL_AURA_MOD_SILENCE)))\n+                    DrinkPotion(false);\n+            }\n+\n+            CheckRacials(diff);\n+\n+            CheckBloodlust(diff);\n+            BuffAndHealGroup(diff);\n+            CheckEarthShield(diff);\n+            CureGroup(CURE_TOXINS, diff);\n+            CheckTotems(diff);\n+            CheckShield(diff);\n+\n+            if (master->IsInCombat() || me->IsInCombat())\n+            {\n+                CheckDispel(diff);\n+                CheckFireNova(diff);\n+            }\n+\n+            if (!me->IsInCombat())\n+                DoNonCombatActions(diff);\n+\n+            if (ProcessImmediateNonAttackTarget())\n+                return;\n+\n+            CheckGhostWolf(diff);\n+\n+            if (!CheckAttackTarget())\n+                return;\n+\n+            CheckHex(diff);\n+            Counter(diff);\n+\n+            if (IsCasting())\n+                return;\n+\n+            CheckUsableItems(diff);\n+\n+            DoNormalAttack(diff);\n+        }\n+\n+        void DoNormalAttack(uint32 diff)\n+        {\n+            Unit* mytar = opponent ? opponent : disttarget ? disttarget : nullptr;\n+            if (!mytar)\n+                return;\n+\n+            StartAttack(mytar, IsMelee());\n+\n+            CheckAttackState();\n+            if (!me->IsAlive() || !mytar->IsAlive())\n+                return;\n+\n+            auto [can_do_frost, can_do_fire, can_do_nature] = CanAffectVictimBools(mytar, SPELL_SCHOOL_FROST, SPELL_SCHOOL_FIRE, SPELL_SCHOOL_NATURE);\n+\n+            //AttackerSet m_attackers = master->getAttackers();\n+            //AttackerSet b_attackers = me->getAttackers();\n+            float dist = me->GetDistance(mytar);\n+\n+            //spell reflections\n+            if (IsSpellReady(EARTH_SHOCK_1, diff) && can_do_nature && HasRole(BOT_ROLE_DPS) && dist < 25 && CanRemoveReflectSpells(mytar, EARTH_SHOCK_1) &&\n+                doCast(mytar, EARTH_SHOCK_1))\n+                return;\n+\n+            MoveBehind(mytar);\n+\n+            //STORMSTRIKE\n+            if (IsSpellReady(STORMSTRIKE_1, diff) && can_do_nature && HasRole(BOT_ROLE_DPS) && IsMelee() && dist <= 5 && Rand() < 120)\n+            {\n+                if (doCast(mytar, GetSpell(STORMSTRIKE_1)))\n+                    return;\n+            }\n+            //SHOCKS\n+            if (GetSpellCooldown(EARTH_SHOCK_1) <= diff && HasRole(BOT_ROLE_DPS) &&\n+                (GetSpell(FLAME_SHOCK_1) || GetSpell(EARTH_SHOCK_1) || GetSpell(FROST_SHOCK_1)) &&\n+                dist < 25 && Rand() < 70)\n+            {\n+                if (GetSpell(FLAME_SHOCK_1) && can_do_fire)\n+                {\n+                    AuraEffect const* fsh = mytar->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_SHAMAN, 0x10000000, 0x0, 0x0, me->GetGUID());\n+                    if (!fsh || fsh->GetBase()->GetDuration() < 3000)\n+                    {\n+                        if (doCast(mytar, GetSpell(FLAME_SHOCK_1)))\n+                            return;\n+                    }\n+                }\n+\n+                uint32 SHOCK = can_do_frost ? GetSpell(FROST_SHOCK_1) : 0;\n+                if (!SHOCK && can_do_nature)\n+                    SHOCK = GetSpell(EARTH_SHOCK_1);\n+\n+                if (SHOCK)\n+                {\n+                    if (doCast(mytar, SHOCK))\n+                        return;\n+                }\n+            }\n+\n+            //Feral Spirit\n+            if (IsSpellReady(FERAL_SPIRIT_1, diff) && HasRole(BOT_ROLE_DPS) && Rand() < 40 && dist < 5)\n+            {\n+                SummonBotPet(mytar);\n+                SetSpellCooldown(FERAL_SPIRIT_1, 180000);\n+                return;\n+            }\n+\n+            //LAVA BURST\n+            if (IsSpellReady(LAVA_BURST_1, diff) && can_do_fire && HasRole(BOT_ROLE_DPS) &&\n+                (GetSpec() == BOT_SPEC_SHAMAN_ELEMENTAL || (IsRanged() && (!can_do_nature || !GetSpell(LIGHTNING_BOLT_1)))) &&\n+                dist < CalcSpellMaxRange(LAVA_BURST_1) && Rand() < 60 &&\n+                (me->getAttackers().empty() || dist > 10))\n+            {\n+                if (doCast(mytar, GetSpell(LAVA_BURST_1)))\n+                    return;\n+            }\n+\n+            if (((MaelstromCount < 5 || MaelstromTimer == 0 || me->GetLevel() < 55) && IsMelee()) ||\n+                (HasRole(BOT_ROLE_HEAL) && GetManaPCT(me) < 25))\n+                return;\n+\n+            //CHAIN LIGHTNING\n+            if (IsSpellReady(CHAIN_LIGHTNING_1, diff) && can_do_nature && HasRole(BOT_ROLE_DPS) && dist < CalcSpellMaxRange(CHAIN_LIGHTNING_1) && Rand() < 80)\n+            {\n+                Unit* u = FindSplashTarget(35.f, mytar, 5.f);\n+                if (u && doCast(mytar, GetSpell(CHAIN_LIGHTNING_1)))\n+                    return;\n+            }\n+            //LIGHTNING BOLT\n+            if (IsSpellReady(LIGHTNING_BOLT_1, diff) && can_do_nature && HasRole(BOT_ROLE_DPS) && dist < CalcSpellMaxRange(LIGHTNING_BOLT_1))\n+            {\n+                uint32 LIGHTNING_BOLT = GetSpell(LIGHTNING_BOLT_1);\n+                if (doCast(mytar, LIGHTNING_BOLT))\n+                    return;\n+            }\n+        }\n+\n+        void CheckHexy(uint32 diff)\n+        {\n+            if (HexyCheckTimer > diff)\n+                return;\n+\n+            HexyCheckTimer = 2000;\n+            Hexy = FindAffectedTarget(GetSpell(HEX_1), me->GetGUID());\n+        }\n+\n+        void CheckHex(uint32 diff)\n+        {\n+            if (Hexy || !IsSpellReady(HEX_1, diff))\n+                return;\n+\n+            if (Unit* target = FindPolyTarget(20))\n+            {\n+                if (doCast(target, GetSpell(HEX_1)))\n+                    return;\n+            }\n+        }\n+\n+        void CheckEarthy(uint32 diff)\n+        {\n+            if (EarthyCheckTimer > diff)\n+                return;\n+\n+            EarthyCheckTimer = 1000;\n+            Unit const* u = FindAffectedTarget(GetSpell(EARTH_SHIELD_1), me->GetGUID(), 90.f, 3);\n+            Earthy = (u && (IsTank(u) || u == master));\n+        }\n+\n+        void CheckGhostWolf(uint32 diff)\n+        {\n+            if (!IsSpellReady(GHOST_WOLF_1, diff) || (!IAmFree() && !HasBotCommandState(BOT_COMMAND_FOLLOW)) ||\n+                Rand() > 35 || me->GetShapeshiftForm() != FORM_NONE || me->IsMounted() || !IsOutdoors() || IsCasting())\n+                return;\n+\n+            if (IAmFree())\n+            {\n+                InstanceTemplate const* instt = sObjectMgr->GetInstanceTemplate(me->GetMap()->GetId());\n+                bool map_allows_mount = (!me->GetMap()->IsDungeon() || me->GetMap()->IsBattlegroundOrArena()) && (!instt || instt->AllowMount);\n+                if (me->HasUnitMovementFlag(MOVEMENTFLAG_FORWARD) &&\n+                    (!me->GetVictim() ?\n+                        (me->IsInCombat() || !map_allows_mount || IsFlagCarrier(me)) :\n+                        !me->IsWithinDist(me->GetVictim(), 8.0f + (IsMelee() ? 5.0f : GetSpellAttackRange(true)))))\n+                {\n+                    if (doCast(me, GetSpell(GHOST_WOLF_1)))\n+                        return;\n+                }\n+\n+                return;\n+            }\n+\n+            if (me->GetExactDist2d(master) > std::max<uint8>(master->GetBotMgr()->GetBotFollowDist(), 30))\n+            {\n+                if (doCast(me, GetSpell(GHOST_WOLF_1)))\n+                    return;\n+            }\n+        }\n+\n+        void DoNonCombatActions(uint32 diff)\n+        {\n+            if (GC_Timer > diff || me->IsMounted() || IsCasting() || Rand() > 25)\n+                return;\n+\n+            ResurrectGroup(GetSpell(ANCESTRAL_SPIRIT_1));\n+\n+            if (mhEnchantExpireTimer > 0 && mhEnchantExpireTimer <= diff)\n+                RemoveItemClassEnchantment(BOT_SLOT_MAINHAND);\n+            if (ohEnchantExpireTimer > 0 && ohEnchantExpireTimer <= diff)\n+                RemoveItemClassEnchantment(BOT_SLOT_OFFHAND);\n+\n+            // Weapon Enchants\n+            if (me->isMoving())\n+                return;\n+\n+            Item* mhWeapon = GetEquips(BOT_SLOT_MAINHAND);\n+            Item* ohWeapon = GetEquips(BOT_SLOT_OFFHAND);\n+            //item must be non-standard, otherwise combat spells won't be rolled anyway\n+            bool mhReady = mhWeapon && !mhWeapon->GetEnchantmentId(TEMP_ENCHANTMENT_SLOT);\n+            bool ohReady = ohWeapon && !ohWeapon->GetEnchantmentId(TEMP_ENCHANTMENT_SLOT);\n+\n+            if (!mhReady && !ohReady)\n+                return; //no ecnhantable weapons\n+\n+            //OK choose the enchants\n+            //MH 1+ Rockbiter, 10+ Flametongue, 30+ Windfury/Earthliving\n+            //OH 1+ Rockbiter, 10+ Flametongue, 20+ Frostbrand, 30+ Windfury/Earthliving\n+            if (needChooseMHEnchant && mhReady)\n+                mhEnchant = HasRole(BOT_ROLE_HEAL) ? (me->GetLevel() >= 30 ? EARTHLIVING_WEAPON_1 :\n+                    me->GetLevel() >= 10 ? FLAMETONGUE_WEAPON_1 :\n+                    0/*ROCKBITER_WEAPON_1*/) :\n+                    HasRole(BOT_ROLE_RANGED) ? (me->GetLevel() >= 10 ? FLAMETONGUE_WEAPON_1 :\n+                    0/*ROCKBITER_WEAPON_1*/) :\n+                    (me->GetLevel() >= 30 ? WINDFURY_WEAPON_1 :\n+                    //me->GetLevel() >= 20 ? FROSTBRAND_WEAPON_1 :\n+                    me->GetLevel() >= 10 ? FLAMETONGUE_WEAPON_1 :\n+                    0/*ROCKBITER_WEAPON_1*/);\n+\n+            if (needChooseOHEnchant && ohReady) //basically only lvl 40+\n+                ohEnchant = HasRole(BOT_ROLE_HEAL) ? (me->GetLevel() >= 30 ? EARTHLIVING_WEAPON_1 :\n+                    me->GetLevel() >= 10 ? FLAMETONGUE_WEAPON_1 :\n+                    0/*ROCKBITER_WEAPON_1*/) :\n+                    HasRole(BOT_ROLE_RANGED) ? (me->GetLevel() >= 10 ? FLAMETONGUE_WEAPON_1 :\n+                    0/*ROCKBITER_WEAPON_1*/) :\n+                    (me->GetLevel() >= 30 ? WINDFURY_WEAPON_1 :\n+                    me->GetLevel() >= 20 ? FROSTBRAND_WEAPON_1 :\n+                    me->GetLevel() >= 10 ? FLAMETONGUE_WEAPON_1 :\n+                    0/*ROCKBITER_WEAPON_1*/);\n+\n+            uint32 MhEnchant = !mhReady ? 0 : GetSpell(mhEnchant);\n+            uint32 OhEnchant = !ohReady ? 0 : GetSpell(ohEnchant);\n+\n+            SpellInfo const* MhEnchantInfo = mhReady && MhEnchant ? sSpellMgr->GetSpellInfo(MhEnchant) : nullptr;\n+            SpellInfo const* OhEnchantInfo = ohReady && OhEnchant ? sSpellMgr->GetSpellInfo(OhEnchant) : nullptr;\n+\n+            Item* targetWeapon = nullptr;\n+            SpellInfo const* targetInfo = nullptr;\n+\n+            if (mhReady && MhEnchant && mhWeapon->IsFitToSpellRequirements(MhEnchantInfo))\n+            {\n+                targetWeapon = mhWeapon;\n+                targetInfo = MhEnchantInfo;\n+            }\n+            if (!targetWeapon && ohReady && OhEnchant && ohWeapon->IsFitToSpellRequirements(OhEnchantInfo))\n+            {\n+                targetWeapon = ohWeapon;\n+                targetInfo = OhEnchantInfo;\n+            }\n+            if (targetWeapon)\n+            {\n+                Spell* spell = new Spell(me, targetInfo, TRIGGERED_NONE);\n+                SpellCastTargets targets;\n+                targets.SetItemTarget(targetWeapon);\n+                spell->prepare(&targets);\n+                return;\n+            }\n+        }\n+\n+        bool BuffTarget(Unit* target, uint32 /*diff*/) override\n+        {\n+            if (me->IsInCombat() && !master->GetMap()->IsRaid())\n+                return false;\n+\n+            if (target->HasUnitMovementFlag(MOVEMENTFLAG_SWIMMING))\n+            {\n+                //water walking breaks on any damage\n+                if (GetSpell(WATER_WALKING_1) && target->getAttackers().empty() &&\n+                    !target->HasAuraType(SPELL_AURA_PERIODIC_DAMAGE) && !target->HasAuraType(SPELL_AURA_WATER_WALK) &&\n+                    doCast(target, GetSpell(WATER_WALKING_1)))\n+                {\n+                    //GC_Timer = 1000;\n+                    return true;\n+                }\n+                //bots don't need water breathing\n+                if (GetSpell(WATER_BREATHING_1) && target->IsPlayer() &&\n+                    !target->HasAuraType(SPELL_AURA_WATER_BREATHING) &&\n+                    doCast(target, GetSpell(WATER_BREATHING_1)))\n+                {\n+                    //GC_Timer = 1000;\n+                    return true;\n+                }\n+            }\n+            return false;\n+        }\n+\n+        void CheckEarthShield(uint32 diff)\n+        {\n+            if (!IsSpellReady(EARTH_SHIELD_1, diff) || Earthy == true || Rand() > (65 - 45 * me->IsInCombat()))\n+                return;\n+\n+            static const auto can_affect = [](WorldObject const* o, Unit const* unit)\n+            {\n+                if (!unit->IsAlive())\n+                    return false;\n+                AuraEffect const* eShield = unit->GetAuraEffect(SPELL_AURA_REDUCE_PUSHBACK, SPELLFAMILY_SHAMAN, 0x0, 0x400, 0x0);\n+                return (!eShield || eShield->GetBase()->GetCharges() < 5 || eShield->GetBase()->GetDuration() < 30000) && o->GetDistance(unit) < 40 && (unit->IsInCombat() || !unit->isMoving());\n+            };\n+\n+            Group const* gr = !IAmFree() ? master->GetGroup() : GetGroup();\n+            if (!gr)\n+            {\n+                if (IsTank(master) && can_affect(me, master) && doCast(master, GetSpell(EARTH_SHIELD_1)))\n+                    return;\n+\n+                if (!IAmFree())\n+                {\n+                    for (auto const& [_, bot] : *master->GetBotMgr()->GetBotMap())\n+                    {\n+                        Unit* u = bot;\n+                        if (!u || !u->IsInWorld() || me->GetMap() != u->FindMap() || !u->InSamePhase(me))\n+                            continue;\n+                        if (IsTank(u) && can_affect(me, u) && doCast(u, GetSpell(EARTH_SHIELD_1)))\n+                            return;\n+                    }\n+                }\n+            }\n+            else\n+            {\n+                std::set<Unit*> tanks;\n+                for (Unit* member : BotMgr::GetAllGroupMembers(gr))\n+                {\n+                    if (me->GetMap() == member->FindMap() && member->IsAlive() && member->InSamePhase(me) && IsTank(member) && can_affect(me, member))\n+                        tanks.insert(member);\n+                }\n+\n+                if (!tanks.empty())\n+                {\n+                    Unit* target = tanks.size() == 1 ? *tanks.begin() : Bcore::Containers::SelectRandomContainerElement(tanks);\n+                    if (doCast(target, GetSpell(EARTH_SHIELD_1)))\n+                        return;\n+                }\n+            }\n+\n+            if (!IAmFree() && can_affect(me, master) && doCast(master, GetSpell(EARTH_SHIELD_1)))\n+                return;\n+        }\n+\n+        void CheckDispel(uint32 diff)\n+        {\n+            if (!IsSpellReady(PURGE_1, diff) || IsCasting())\n+                return;\n+\n+            Unit* target = FindHostileDispelTarget(CalcSpellMaxRange(PURGE_1));\n+            if (target && doCast(target, GetSpell(PURGE_1)))\n+                return;\n+\n+            SetSpellCooldown(PURGE_1, 500); //fail\n+        }\n+\n+        void CheckFireNova(uint32 diff)\n+        {\n+            if (!HasRole(BOT_ROLE_DPS) || _totems[T_FIRE].second._type == BOT_TOTEM_NONE ||\n+                !IsSpellReady(FIRE_NOVA_1, diff) || IsCasting() || Rand() > 25)\n+                return;\n+\n+            std::list<Unit*> targets;\n+            GetNearbyTargetsList(targets, 9.f, 0, ObjectAccessor::GetUnit(*me, _totems[T_FIRE].first));\n+            if (targets.size() > 1 || (!targets.empty() && *(targets.begin()) == me->GetVictim()))\n+            {\n+                if (doCast(me, GetSpell(FIRE_NOVA_1)))\n+                    return;\n+            }\n+        }\n+\n+        bool HealTarget(Unit* target, uint32 diff) override\n+        {\n+            if (!target || !target->IsAlive() || target->GetShapeshiftForm() == FORM_SPIRITOFREDEMPTION || me->GetDistance(target) > 40)\n+                return false;\n+            uint8 hp = GetHealthPCT(target);\n+            if (hp > GetHealHpPctThreshold())\n+                return false;\n+            bool pointed = IsPointedHealTarget(target);\n+            if (hp > 90 && !(pointed && me->GetMap()->IsRaid()) &&\n+                (!target->IsInCombat() || target->getAttackers().empty() || !IsTank(target) || !me->GetMap()->IsRaid()))\n+                return false;\n+\n+            int32 hps = GetHPS(target);\n+            int32 xphp = target->GetHealth() + hps * 2.5f;\n+            int32 hppctps = int32(hps * 100.f / float(target->GetMaxHealth()));\n+            int32 xphploss = xphp > int32(target->GetMaxHealth()) ? 0 : abs(int32(xphp - target->GetMaxHealth()));\n+            int32 xppct = hp + hppctps * 2.5f;\n+            if (xppct >= 95 && hp >= 25 && !pointed)\n+                return false;\n+\n+            if (IsSpellReady(NATURES_SWIFTNESS_1, diff, false) && Rand() < 80 &&\n+                (me->IsInCombat() || target->IsInCombat()) &&//may just revive\n+                hp <= 20 && xppct <= 0 && xphploss > _heals[HEALING_WAVE_1] / 2 &&\n+                (target->IsPlayer() || IsTank(target) || target->IsInCombat() || !target->getAttackers().empty()))\n+            {\n+                me->InterruptNonMeleeSpells(false);\n+                if (doCast(me, GetSpell(NATURES_SWIFTNESS_1)))\n+                {\n+                    if (doCast(target, GetSpell(HEALING_WAVE_1)))\n+                        return true;\n+                }\n+            }\n+\n+            if (IsCasting()) return false;\n+\n+            Unit const* u = target->GetVictim();\n+            bool tanking = u && IsTank(target) && u->ToCreature() && u->ToCreature()->isWorldBoss();\n+\n+            if (IsSpellReady(HEALING_WAVE_1, diff) &&\n+                (xppct >= 15 || !GetSpell(LESSER_HEALING_WAVE_1)) && xphploss > _heals[HEALING_WAVE_1])\n+            {\n+                if (doCast(target, GetSpell(HEALING_WAVE_1)))\n+                    return true;\n+            }\n+            //Riptide stacks from different casters\n+            if (IsSpellReady(RIPTIDE_1, diff) && hp <= 85 && (tanking || hps < 0 || xphploss > _heals[RIPTIDE_1]) &&\n+                !target->GetAuraEffect(SPELL_AURA_PERIODIC_HEAL, SPELLFAMILY_SHAMAN, 0x0, 0x0, 0x10, me->GetGUID())\n+                /*!target->HasAura(GetSpell(RIPTIDE_1), me->GetGUID())*/)\n+            {\n+                if (doCast(target, GetSpell(RIPTIDE_1)))\n+                    return true;\n+            }\n+            if (IsSpellReady(CHAIN_HEAL_1, diff) && !IAmFree() && xppct > 35 && xphploss > _heals[CHAIN_HEAL_1] &&\n+                (!tanking || Rand() < 60 || target->GetAuraEffect(SPELL_AURA_PERIODIC_HEAL, SPELLFAMILY_SHAMAN, 0x0, 0x0, 0x10, me->GetGUID())))\n+            {\n+                if (doCast(target, GetSpell(CHAIN_HEAL_1)))\n+                    return true;\n+            }\n+\n+            if (IsSpellReady(LESSER_HEALING_WAVE_1, diff) && xphploss > _heals[LESSER_HEALING_WAVE_1])\n+            {\n+                if (doCast(target, GetSpell(LESSER_HEALING_WAVE_1)))\n+                    return true;\n+            }\n+\n+            return false;\n+        }\n+\n+        void ApplyClassSpellCritMultiplierAll(Unit const* /*victim*/, float& crit_chance, SpellInfo const* spellInfo, SpellSchoolMask schoolMask, WeaponAttackType /*attackType*/) const override\n+        {\n+            //if (spellInfo->DmgClass != SPELL_DAMAGE_CLASS_MAGIC)\n+            //    return;\n+\n+            uint32 spellId = spellInfo->Id;\n+            uint8 lvl = me->GetLevel();\n+\n+            //Call of Thunder: 5% additional critical chance for Lightning Bolt, Chain Lightning and Thunderstorm\n+            if ((GetSpec() == BOT_SPEC_SHAMAN_ELEMENTAL) && lvl >= 30 &&\n+                (spellId == GetSpell(LIGHTNING_BOLT_1) ||\n+                spellId == GetSpell(CHAIN_LIGHTNING_1) ||\n+                spellId == GetSpell(THUNDERSTORM_1)))\n+                crit_chance += 5.f;\n+            //Tidal Mastery: 5% additional critical chance for lightning spells\n+            if (lvl >= 25 && (SPELL_SCHOOL_MASK_NATURE & schoolMask))\n+                crit_chance += 5.f;\n+            //Blessing of the Eternals: 4% additional critical chance for all spells\n+            if ((GetSpec() == BOT_SPEC_SHAMAN_RESTORATION) && lvl >= 45)\n+                crit_chance += 4.f;\n+            //Tidal Waves (Lesser Healing Wave crit)\n+            if (spellInfo->SpellFamilyFlags[0] & 0x80)\n+                if (AuraEffect const* eff = me->GetAuraEffect(TIDAL_WAVES_BUFF, 1, me->GetGUID()))\n+                    if (eff->IsAffectedOnSpell(spellInfo))\n+                        crit_chance += 25.f;\n+            //Tidal Force\n+            if (spellInfo->SpellFamilyFlags[0] & 0x1C0)\n+                if (AuraEffect const* eff = me->GetAuraEffect(TIDAL_FORCE_BUFF, 0, me->GetGUID()))\n+                    if (eff->IsAffectedOnSpell(spellInfo))\n+                        crit_chance += 20.f * eff->GetBase()->GetStackAmount();\n+        }\n+\n+        void ApplyClassDamageMultiplierMeleeSpell(int32& damage, SpellNonMeleeDamage& /*damageinfo*/, SpellInfo const* spellInfo, WeaponAttackType /*attackType*/, bool iscrit) const override\n+        {\n+            uint32 spellId = spellInfo->Id;\n+            uint8 lvl = me->GetLevel();\n+            float fdamage = float(damage);\n+\n+            //apply bonus damage mods\n+            float pctbonus = 0.0f;\n+            if (iscrit)\n+            {\n+                //!!!Melee spell damage is not yet critical, all reduced by half\n+                //Elemental Fury (part 2): 50% additional crit damage bonus for Nature, Fire and Frost (all) spells\n+                if (lvl >= 21)\n+                    pctbonus += 0.25f;\n+            }\n+\n+            //SHAMAN_T8_ENCHANCEMENT_2P_BONUS: 20% bonus damage for Lava Lash and Stormstrike\n+            if (lvl >= 60 &&\n+                (spellId == STORMSTRIKE_DAMAGE || spellId == STORMSTRIKE_DAMAGE_OFFHAND/* || spellId == LAVA_LASH*/))\n+                pctbonus += 0.2f;\n+\n+            //custom bonus to make stormstrike useful\n+            if (spellId == STORMSTRIKE_DAMAGE || spellId == STORMSTRIKE_DAMAGE_OFFHAND)\n+                pctbonus += 1.0f;\n+\n+            damage = int32(fdamage * (1.0f + pctbonus));\n+        }\n+\n+        void ApplyClassDamageMultiplierSpell(int32& damage, SpellNonMeleeDamage& /*damageinfo*/, SpellInfo const* spellInfo, WeaponAttackType /*attackType*/, bool iscrit) const override\n+        {\n+            uint32 spellId = spellInfo->Id;\n+            uint8 lvl = me->GetLevel();\n+            float fdamage = float(damage);\n+            float flat_mod = 0.f;\n+\n+            //2) apply bonus damage mods\n+            float pctbonus = 0.0f;\n+            if (iscrit)\n+            {\n+                //!!!spell damage is not yet critical and will be multiplied by 1.5\n+                //so we should put here bonus damage mult /1.5\n+                //Elemental Fury (part 2): 50% additional crit damage bonus for Nature, Fire and Frost spells\n+                if (lvl >= 21 &&\n+                    (spellInfo->GetSchoolMask() & (SPELL_SCHOOL_MASK_NATURE|SPELL_SCHOOL_MASK_FIRE|SPELL_SCHOOL_MASK_FROST)))\n+                    pctbonus += 0.333f;\n+                //Lava Flows (part 1): 24% additional crit damage bonus for Lava Burst\n+                if ((GetSpec() == BOT_SPEC_SHAMAN_ELEMENTAL) && lvl >= 50 && spellId == GetSpell(LAVA_BURST_1))\n+                    pctbonus += 0.16f;\n+            }\n+            //Concussion: 5% bonus damage for Lightning Bolt, Chain Lightning, Thunderstorm, Lava Burst and Shocks\n+            if (lvl >= 10 &&\n+                (spellId == GetSpell(LIGHTNING_BOLT_1) ||\n+                spellId == GetSpell(CHAIN_LIGHTNING_1) ||\n+                spellId == GetSpell(THUNDERSTORM_1) ||\n+                spellId == GetSpell(LAVA_BURST_1) ||\n+                spellId == GetSpell(EARTH_SHOCK_1) ||\n+                spellId == GetSpell(FROST_SHOCK_1) ||\n+                spellId == GetSpell(FLAME_SHOCK_1)))\n+                pctbonus += 0.05f;\n+            //Call of Flame (part 2): 6% bonus damage for Lava burst\n+            if (lvl >= 15 && spellId == GetSpell(LAVA_BURST_1))\n+                pctbonus += 0.06f;\n+            //Storm, Earth and fire (part 3): 60% bonus damage for Flame Shock (periodic damage in fact but who cares?)\n+            if ((GetSpec() == BOT_SPEC_SHAMAN_ELEMENTAL) && lvl >= 40 && spellId == GetSpell(FLAME_SHOCK_1))\n+                pctbonus += 0.6f;\n+            //Booming Echoes (part 2): 20% bonus damage for Flame Shock and Frost Shock (direct damage)\n+            if ((GetSpec() == BOT_SPEC_SHAMAN_ELEMENTAL) && lvl >= 45 &&\n+                (spellId == GetSpell(FLAME_SHOCK_1) ||\n+                spellId == GetSpell(FROST_SHOCK_1)))\n+                pctbonus += 0.2f;\n+            //Improved Shields (part 1): 15% bonus damage for Lightning Shield orbs\n+            if (lvl >= 15 && spellInfo->IsRankOf(sSpellMgr->GetSpellInfo(LIGHTNING_SHIELD_DAMAGE_1)))\n+                pctbonus += 0.15f;\n+            //Shamanism: +20/25% bonus from spp\n+            if ((GetSpec() == BOT_SPEC_SHAMAN_ELEMENTAL) && lvl >= 45)\n+            {\n+                if (spellId == GetSpell(CHAIN_LIGHTNING_1) || spellId == GetSpell(LIGHTNING_BOLT_1))\n+                    flat_mod += me->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_MAGIC) * 0.2f * me->CalculateDefaultCoefficient(spellInfo, SPELL_DIRECT_DAMAGE) * me->CalculateLevelPenalty(spellInfo);\n+                else if (spellId == GetSpell(LAVA_BURST_1))\n+                    flat_mod += me->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_MAGIC) * 0.25f * me->CalculateDefaultCoefficient(spellInfo, SPELL_DIRECT_DAMAGE) * me->CalculateLevelPenalty(spellInfo);\n+            }\n+            //Elemental Oath (part 1): 10% bonus damage\n+            if ((GetSpec() == BOT_SPEC_SHAMAN_ELEMENTAL) &&\n+                lvl >= 45 && me->GetAuraEffect(ELEMENTAL_FOCUS_BUFF, 0, me->GetGUID()))\n+                pctbonus += 0.1f;\n+            //Elemental Weapons (part 1): 40% bonus damage\n+            if (lvl >= 20 && (spellId == WINDFURY_ATTACK_MAINHAND || spellId == WINDFURY_ATTACK_OFFHAND))\n+                pctbonus += 0.4f;\n+\n+            //Totemic Recall: bots have reduced base mana so increase mana gain here\n+            //if (lvl >= 30 && spellId == GetSpell(TOTEMIC_RECALL_1))\n+            //    pctbonus += 0.5f;\n+\n+            damage = int32(fdamage * (1.0f + pctbonus) + flat_mod);\n+        }\n+\n+        void ApplyClassDamageMultiplierHeal(Unit const* /*victim*/, float& heal, SpellInfo const* spellInfo, DamageEffectType damagetype, uint32 stack) const override\n+        {\n+            uint32 spellId = spellInfo->Id;\n+            uint8 lvl = me->GetLevel();\n+            float pctbonus = 0.0f;\n+            float flat_mod = 0.0f;\n+\n+            //Healing Way: 25% bonus healing for Healing Wave\n+            if ((GetSpec() == BOT_SPEC_SHAMAN_RESTORATION) && lvl >= 30 && spellId == GetSpell(HEALING_WAVE_1))\n+                pctbonus += 0.25f;\n+            //Purification: 10% bonus healing for all spells\n+            if ((GetSpec() == BOT_SPEC_SHAMAN_RESTORATION) && lvl >= 35)\n+                pctbonus += 0.1f;\n+            //Nature's Blessing: 15% of Intellect to healing\n+            if ((GetSpec() == BOT_SPEC_SHAMAN_RESTORATION) && lvl >= 45)\n+                flat_mod += GetTotalBotStat(BOT_STAT_MOD_INTELLECT) * 0.15f * me->CalculateDefaultCoefficient(spellInfo, damagetype) * stack * 1.88f * me->CalculateLevelPenalty(spellInfo) * stack;\n+            //Improved Chain Heal: 20% bonus healing for Chain Heal\n+            if ((GetSpec() == BOT_SPEC_SHAMAN_RESTORATION) && lvl >= 45 && spellId == GetSpell(CHAIN_HEAL_1))\n+                pctbonus += 0.2f;\n+            //Improved Earth Shield: 10% bonus healing for Earth Shield\n+            //Glyph of Earth Shield: 20% bonus healing for Earth Shield\n+            if (lvl >= 50 && spellId == EARTH_SHIELD_HEAL)\n+                pctbonus += (GetSpec() == BOT_SPEC_SHAMAN_RESTORATION) ? 0.3f : 0.2f;\n+            //Improved Shields (part 3): 15% bonus healing for Earth Shield\n+            if (lvl >= 15 && spellId == EARTH_SHIELD_HEAL)\n+                pctbonus += 0.15f;\n+            //Tidal Waves (part 2): 20% bonus (from spellpower) for Healing Wave and 10% bonus (from spellpower) for Lesser Healing Wave\n+            if ((GetSpec() == BOT_SPEC_SHAMAN_RESTORATION) && lvl >= 55)\n+            {\n+                if (spellId == GetSpell(HEALING_WAVE_1))\n+                    flat_mod += me->SpellBaseHealingBonusDone(SPELL_SCHOOL_MASK_MAGIC) * 0.2f * me->CalculateDefaultCoefficient(spellInfo, damagetype) * 1.88f * me->CalculateLevelPenalty(spellInfo) * stack;\n+                else if (spellId == GetSpell(LESSER_HEALING_WAVE_1))\n+                    flat_mod += me->SpellBaseHealingBonusDone(SPELL_SCHOOL_MASK_MAGIC) * 0.1f * me->CalculateDefaultCoefficient(spellInfo, damagetype) * 1.88f * me->CalculateLevelPenalty(spellInfo) * stack;\n+            }\n+\n+            heal = heal * (1.0f + pctbonus) + flat_mod;\n+        }\n+\n+        void ApplyClassSpellCostMods(SpellInfo const* spellInfo, int32& cost) const override\n+        {\n+            //uint32 spellId = spellInfo->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            float fcost = float(cost);\n+            int32 flatbonus = 0;\n+            float pctbonus = 0.0f;\n+\n+            //percent mods\n+            //Clearcasting: -40% mana cost\n+            if (AuraEffect const* eff = me->GetAuraEffect(ELEMENTAL_FOCUS_BUFF, 0, me->GetGUID()))\n+                if (eff->IsAffectedOnSpell(spellInfo))\n+                    pctbonus += 0.4f;\n+            //Convection\n+            if (lvl >= 10 && ((spellInfo->SpellFamilyFlags[0] & 0x90100003) || (spellInfo->SpellFamilyFlags[1] & 0x8001000)))\n+                pctbonus += 0.1f;\n+            //Shamanistic Focus\n+            if (lvl >= 20 && (spellInfo->SpellFamilyFlags[0] & 0x90100000))\n+                pctbonus += 0.45f;\n+            //Mental Quickness:\n+            if ((GetSpec() == BOT_SPEC_SHAMAN_ENHANCEMENT) && lvl >= 50 && !spellInfo->CalcCastTime())\n+                pctbonus += 0.06f;\n+            //Totemic Focus:\n+            if (lvl >= 10 && (spellInfo->AttributesEx7 & SPELL_ATTR7_CAN_BE_MULTI_CAST))\n+                pctbonus += 0.25f;\n+            //Tidal Focus:\n+            if (lvl >= 15 &&\n+                ((spellInfo->SpellFamilyFlags[0] & 0x1C0) ||\n+                (spellInfo->SpellFamilyFlags[1] & 0x400) ||\n+                (spellInfo->SpellFamilyFlags[2] & 0x10)))\n+                pctbonus += 0.05f;\n+\n+            //flat mods\n+            //!1 rage = 10 pts!\n+            ////Improved Heroic Strike: -3 rage cost for Heroic Strike\n+            //if (lvl >= 10 && spellId == GetSpell(HEROIC_STRIKE_1))\n+            //    flatbonus += 30;\n+\n+            //cost can be < 0\n+            cost = int32(fcost * (1.0f - pctbonus)) - flatbonus;\n+        }\n+\n+        void ApplyClassSpellCastTimeMods(SpellInfo const* spellInfo, int32& casttime) const override\n+        {\n+            //casttime is in milliseconds\n+            uint32 spellId = spellInfo->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            int32 timebonus = 0;\n+            float pctbonus = 0.0f;\n+\n+            //100% mods\n+            //Nature's Swiftness: -100% cast time\n+            if (AuraEffect const* eff = me->GetAuraEffect(NATURES_SWIFTNESS_1, 0, me->GetGUID()))\n+                if (eff->IsAffectedOnSpell(spellInfo))\n+                    pctbonus += 1.0f;\n+\n+            //pct mods\n+            if (spellId == GetSpell(LIGHTNING_BOLT_1) || spellId == GetSpell(CHAIN_LIGHTNING_1) ||\n+                spellId == GetSpell(HEALING_WAVE_1) || spellId == GetSpell(LESSER_HEALING_WAVE_1) ||\n+                spellId == GetSpell(CHAIN_HEAL_1) || spellId == GetSpell(HEX_1))\n+            {\n+                Aura* maelstrom = me->GetAura(MAELSTROM_WEAPON_BUFF);\n+                if (maelstrom)\n+                {\n+                    pctbonus += 0.2f * maelstrom->GetStackAmount();\n+                    maelUseUp = true;\n+                }\n+            }\n+            //Tidal Waves (Healing Wave cast time)\n+            if (spellInfo->SpellFamilyFlags[0] & 0x40)\n+                if (AuraEffect const* eff = me->GetAuraEffect(TIDAL_WAVES_BUFF, 0, me->GetGUID()))\n+                    if (eff->IsAffectedOnSpell(spellInfo))\n+                        pctbonus += 0.3f;\n+\n+            //flat mods\n+            //Improved Ghost Wolf: -2 sec\n+            if (lvl >= 10 && spellId == GetSpell(GHOST_WOLF_1))\n+                timebonus += 2000;\n+            //Improved Healing Wave: -0.5 sec\n+            if (lvl >= 10 && spellId == GetSpell(HEALING_WAVE_1))\n+                timebonus += 500;\n+            //Lightning Mastery: -0.5 sec\n+            if ((GetSpec() == BOT_SPEC_SHAMAN_ELEMENTAL) &&\n+                lvl >= 35 && ((spellInfo->SpellFamilyFlags[0] & 0x3) || (spellInfo->SpellFamilyFlags[1] & 0x1000)))\n+                timebonus += 500;\n+            //Stormcaller Chain Heal Bonus (26122): -0.4 sec\n+            if (lvl >= 60 && spellId == GetSpell(CHAIN_HEAL_1))\n+                timebonus += 400;\n+\n+            casttime = std::max<int32>((float(casttime) * (1.0f - pctbonus)) - timebonus, 0);\n+        }\n+\n+        void ApplyClassSpellNotLoseCastTimeMods(SpellInfo const* spellInfo, int32& delayReduce) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchoolMask schools = spellInfo->GetSchoolMask();\n+            uint8 lvl = me->GetLevel();\n+            int32 reduceBonus = 0;\n+\n+            if (lvl >= 20 && (baseId == HEALING_WAVE_1 || baseId == LESSER_HEALING_WAVE_1 || baseId == CHAIN_HEAL_1))\n+                reduceBonus += 70;\n+\n+            if (GetSpec() == BOT_SPEC_SHAMAN_ELEMENTAL && lvl >= 25)\n+            {\n+                switch (baseId)\n+                {\n+                    case LIGHTNING_BOLT_1: case CHAIN_LIGHTNING_1: case LAVA_BURST_1: case HEX_1:\n+                        reduceBonus += 70;\n+                        break;\n+                    default:\n+                        break;\n+                }\n+            }\n+\n+            delayReduce += reduceBonus;\n+        }\n+\n+        void ApplyClassSpellCooldownMods(SpellInfo const* spellInfo, uint32& cooldown) const override\n+        {\n+            //cooldown is in milliseconds\n+            //uint32 spellId = spellInfo->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            int32 timebonus = 0;\n+            float pctbonus = 0.0f;\n+\n+            //pct mods\n+            //Glyph of Rapid Charge: -7% cooldown for Charge\n+            //if (lvl >= 40 && spellId == GetSpell(CHARGE_1))\n+            //    pctbonus += 0.07f;\n+\n+            //flat mods\n+            //Reverberation\n+            if (lvl >= 20 && ((spellInfo->SpellFamilyFlags[0] & 0x90100000) || (spellInfo->SpellFamilyFlags[1] & 0x8000000)))\n+                timebonus += 1000;\n+            //Booming Echoes (part 1)\n+            if ((GetSpec() == BOT_SPEC_SHAMAN_ELEMENTAL) && lvl >= 45 && (spellInfo->SpellFamilyFlags[0] & 0x90000000))\n+                timebonus += 2000;\n+            //Storm, Earth and Fire (part 1)\n+            if ((GetSpec() == BOT_SPEC_SHAMAN_ELEMENTAL) && lvl >= 40 && (spellInfo->SpellFamilyFlags[0] & 0x2))\n+                timebonus += 2500;\n+            //Improved Fire Nova (part 2)\n+            if ((GetSpec() == BOT_SPEC_SHAMAN_ELEMENTAL) && lvl >= 25 && (spellInfo->SpellFamilyFlags[0] & 0x8000000))\n+                timebonus += 4000;\n+\n+            cooldown = std::max<int32>((float(cooldown) * (1.0f - pctbonus)) - timebonus, 0);\n+        }\n+\n+        void ApplyClassSpellCategoryCooldownMods(SpellInfo const* spellInfo, uint32& cooldown) const override\n+        {\n+            //cooldown is in milliseconds\n+            uint32 spellId = spellInfo->Id;\n+            //uint8 lvl = me->GetLevel();\n+            int32 timebonus = 0;\n+            float pctbonus = 0.0f;\n+\n+            //Improved Reincarnation + Reduced Reincarnation Cooldown: -20 min cooldown for Reincarnation\n+            if (spellId == GetSpell(REINCARNATION_1))\n+                timebonus += 1200000;\n+\n+            cooldown = std::max<int32>((float(cooldown) * (1.0f - pctbonus)) - timebonus, 0);\n+        }\n+\n+        void ApplyClassSpellGlobalCooldownMods(SpellInfo const* spellInfo, float& cooldown) const override\n+        {\n+            //cooldown is in milliseconds\n+            //uint32 spellId = spellInfo->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            float timebonus = 0.0f;\n+            float pctbonus = 0.0f;\n+\n+            //Glyph of Shocking: -0.5 sec global cooldown for Shocks\n+            if (lvl >= 15 && ((spellInfo->SpellFamilyFlags[0] & 0x90100000) || (spellInfo->SpellFamilyFlags[1] & 0x8000000)))\n+                timebonus += 500.f;\n+\n+            cooldown = (cooldown * (1.0f - pctbonus)) - timebonus;\n+        }\n+\n+        void ApplyClassSpellRangeMods(SpellInfo const* spellInfo, float& maxrange) const override\n+        {\n+            //uint32 spellId = spellInfo->Id;\n+            //uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            float flatbonus = 0.0f;\n+            float pctbonus = 0.0f;\n+\n+            //pct mods\n+            //Grim Reach: +20% range for Affliction Spells\n+            //if (lvl >= 25 && ((spellInfo->SpellFamilyFlags[0] & 0x8048C41A) || (spellInfo->SpellFamilyFlags[1] & 0x40713)))\n+            //    pctbonus += 0.2f;\n+\n+            //flat mods\n+            //Elemental Reach part 1: +6 yd\n+            if ((GetSpec() == BOT_SPEC_SHAMAN_ELEMENTAL) &&\n+                lvl >= 30 && ((spellInfo->SpellFamilyFlags[0] & 0x8000003) || (spellInfo->SpellFamilyFlags[1] & 0x1000)))\n+                flatbonus += 6.f;\n+            //Elemental Reach part 2: +15 yd\n+            if ((GetSpec() == BOT_SPEC_SHAMAN_ELEMENTAL) &&\n+                lvl >= 30 && (spellInfo->SpellFamilyFlags[0] & 0x10000000))\n+                flatbonus += 15.f;\n+\n+            maxrange = maxrange * (1.0f + pctbonus) + flatbonus;\n+        }\n+\n+        void ApplyClassSpellMaxTargetsMods(SpellInfo const* spellInfo, uint32& targets) const override\n+        {\n+            uint32 bonusTargets = 0;\n+\n+            //Glyph of Chain Heal\n+            if (spellInfo->SpellFamilyFlags[0] & 0x100)\n+                bonusTargets += 1;\n+            //Glyph of Chain Lightning\n+            if (spellInfo->SpellFamilyFlags[0] & 0x2)\n+                bonusTargets += 1;\n+            //Chain Healing Wave (23573)\n+            if (me->GetLevel() >= 60 && spellInfo->SpellFamilyFlags[0] & 0x100)\n+                bonusTargets += 2;\n+\n+            targets = targets + bonusTargets;\n+        }\n+\n+        void OnClassSpellGo(SpellInfo const* spellInfo) override\n+        {\n+            //uint32 spellId = spellInfo->Id;\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+\n+            //reincarnation: notify master\n+            if (baseId == REINCARNATION_1 && !IAmFree())\n+            {\n+                ReportSpellCast(baseId, LocalizedNpcText(master, BOT_TEXT__USED), master);\n+\n+                //no spellHit trigger - do it here\n+                SpellHit(me, spellInfo);\n+                me->CastSpell(me, RESURRECTION_VISUAL_SPELL, true);\n+            }\n+            //manatide: notify\n+            if (baseId == MANA_TIDE_TOTEM_1 && !IAmFree())\n+            {\n+                ReportSpellCast(baseId, LocalizedNpcText(master, BOT_TEXT__USED), master);\n+            }\n+            //Nature's Swiftness: notify master\n+            if (baseId == NATURES_SWIFTNESS_1 && !IAmFree())\n+            {\n+                ReportSpellCast(baseId, LocalizedNpcText(master, BOT_TEXT__USED), master);\n+            }\n+\n+            //Handle Clearcasting\n+            if (AuraEffect* eff = me->GetAuraEffect(ELEMENTAL_FOCUS_BUFF, 0, me->GetGUID()))\n+                if (eff->IsAffectedOnSpell(spellInfo))\n+                    eff->GetBase()->DropCharge();\n+            //Handle Tidal Focus\n+            //Healing Wave (cast time): if full Maelstrom than don't use up charge\n+            if (MaelstromCount < 5 && (spellInfo->SpellFamilyFlags[0] & 0x40))\n+                if (AuraEffect* eff = me->GetAuraEffect(TIDAL_WAVES_BUFF, 0, me->GetGUID()))\n+                    if (eff->IsAffectedOnSpell(spellInfo))\n+                        eff->GetBase()->DropCharge();\n+            //Lesser Healing Wave (crit)\n+            if (spellInfo->SpellFamilyFlags[0] & 0x80)\n+                if (AuraEffect* eff = me->GetAuraEffect(TIDAL_WAVES_BUFF, 1, me->GetGUID()))\n+                    if (eff->IsAffectedOnSpell(spellInfo))\n+                        eff->GetBase()->DropCharge();\n+\n+            //Nature's Swiftness\n+            if (AuraEffect const* eff = me->GetAuraEffect(NATURES_SWIFTNESS_1, 0, me->GetGUID()))\n+            {\n+                if (eff->IsAffectedOnSpell(spellInfo))\n+                    me->RemoveAurasDueToSpell(NATURES_SWIFTNESS_1);\n+            }\n+\n+            //Tidal Force: Handled in Unit::HandleDummyAuraProc(): case 55166:\n+            //if (spellInfo->SpellFamilyFlags[0] & 0x1C0)\n+            //    if (AuraEffect const* eff = me->GetAuraEffect(TIDAL_FORCE_BUFF, 0, me->GetGUID()))\n+            //        if (eff->IsAffectedOnSpell(spellInfo))\n+            //            me->RemoveAuraFromStack(TIDAL_FORCE_BUFF);\n+\n+            //Shield cd\n+            if (baseId == LIGHTNING_SHIELD_DAMAGE_1)\n+                SetSpellCooldown(LIGHTNING_SHIELD_DAMAGE_1, 3000); //is that right? from spell_proc_event\n+\n+            //autouse totems\n+            if (baseId == EARTHBIND_TOTEM_1 || baseId == STRENGTH_OF_EARTH_TOTEM_1)\n+                _totemTimer[T_EARTH] = 5000;\n+            if (baseId == TREMOR_TOTEM_1)\n+                _totemTimer[T_EARTH] = 12000;\n+            if (baseId == MAGMA_TOTEM_1)\n+                _totemTimer[T_FIRE] = 12000;\n+            if (baseId == TOTEM_OF_WRATH_1 || baseId == FLAMETONGUE_TOTEM_1)\n+                _totemTimer[T_FIRE] = 5000;\n+            if (baseId == FROST_RESISTANCE_TOTEM_1)\n+                _totemTimer[T_FIRE] = 120000;\n+            if (baseId == MANA_TIDE_TOTEM_1)\n+                _totemTimer[T_WATER] = 12000;\n+            if (baseId == MANA_SPRING_TOTEM_1)\n+                _totemTimer[T_WATER] = 5000;\n+            if (baseId == FIRE_RESISTANCE_TOTEM_1)\n+                _totemTimer[T_WATER] = 120000;\n+            if (baseId == GROUNDING_TOTEM_1)\n+                _totemTimer[T_AIR] = me->GetLevel() >= 15 ? 13000 : 15000;\n+            if (baseId == WRATH_OF_AIR_TOTEM_1 || baseId == WINDFURY_TOTEM_1)\n+                _totemTimer[T_AIR] = 5000;\n+            if (baseId == NATURE_RESISTANCE_TOTEM_1)\n+                _totemTimer[T_AIR] = 120000;\n+            //other (manual use)\n+            if (baseId == STONECLAW_TOTEM_1)\n+                _totemTimer[T_EARTH] = 15000;\n+            if (baseId == STONESKIN_TOTEM_1)\n+                _totemTimer[T_EARTH] = 300000;\n+            if (baseId == EARTH_ELEMENTAL_TOTEM_1)\n+                _totemTimer[T_EARTH] = 120000;\n+            if (baseId == SEARING_TOTEM_1)\n+                _totemTimer[T_FIRE] = 60000;\n+            if (baseId == FIRE_ELEMENTAL_TOTEM_1)\n+                _totemTimer[T_FIRE] = 120000;\n+            if (baseId == CLEANSING_TOTEM_1)\n+                _totemTimer[T_WATER] = 300000;\n+            if (baseId == HEALING_STREAM_TOTEM_1)\n+                _totemTimer[T_WATER] = 300000;\n+\n+            //Totemic Recall totems resummon helper\n+            if (baseId == TOTEMIC_RECALL_1)\n+            {\n+                TotemsCheckTimer = GC_Timer;\n+                for (auto i : NPCBots::index_array<uint8, MAX_TOTEMS>)\n+                    _totemTimer[i] = 0;\n+            }\n+\n+            if (maelUseUp)\n+            {\n+                if (baseId == LIGHTNING_BOLT_1 || baseId == CHAIN_LIGHTNING_1 || baseId == HEALING_WAVE_1 ||\n+                    baseId == LESSER_HEALING_WAVE_1 || baseId == CHAIN_HEAL_1 || baseId == HEX_1)\n+                {\n+                    MaelstromCount = 0;\n+                    me->RemoveAurasDueToSpell(MAELSTROM_WEAPON_BUFF);\n+                }\n+            }\n+\n+            //Item enchant\n+            //We don't know which item is targeted\n+            //Actually it is mh, then oh\n+            if (/*baseId == ROCKBITER_WEAPON_1 || */baseId == FLAMETONGUE_WEAPON_1 || baseId == FROSTBRAND_WEAPON_1 ||\n+                baseId == WINDFURY_WEAPON_1 || baseId == EARTHLIVING_WEAPON_1)\n+            {\n+                //We set duration to 2 seconds to prevent exploiting unequip mechanic\n+                //to get enchanted weapons for player (for non-shaman bots it won't work)\n+                uint32 slot = TEMP_ENCHANTMENT_SLOT;\n+                uint32 duration = 2 * IN_MILLISECONDS;\n+                uint32 charges = 0;\n+                uint32 enchant_id = spellInfo->Effects[0].MiscValue;\n+                //SpellItemEnchantmentEntry const* pEnchant = sSpellItemEnchantmentStore.LookupEntry(enchant_id);\n+                Item* mh = GetEquips(BOT_SLOT_MAINHAND);\n+                Item* oh = GetEquips(BOT_SLOT_OFFHAND);\n+                Item* item = nullptr;\n+                uint8 itemSlot = 0;\n+\n+                if (mh && !mh->GetEnchantmentId(TEMP_ENCHANTMENT_SLOT)/* && mh->IsFitToSpellRequirements(spellInfo)*/)\n+                {\n+                    item = mh;\n+                    itemSlot = BOT_SLOT_MAINHAND;\n+                }\n+                else if (oh && !oh->GetEnchantmentId(TEMP_ENCHANTMENT_SLOT)/* && oh->IsFitToSpellRequirements(spellInfo)*/)\n+                {\n+                    item = oh;\n+                    itemSlot = BOT_SLOT_OFFHAND;\n+                }\n+                else\n+                    ASSERT(false, \"shaman bot attempted to enchant his weapons but cannot find a weapon to apply it!\");\n+\n+                if (!IAmFree())\n+                    master->GetSession()->SendEnchantmentLog(me->GetGUID(), me->GetGUID(), item->GetEntry(), enchant_id);\n+\n+                item->SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_ID_OFFSET, enchant_id);\n+                item->SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_DURATION_OFFSET, duration);\n+                item->SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_CHARGES_OFFSET, charges);\n+                ApplyItemEnchantment(item, TEMP_ENCHANTMENT_SLOT, itemSlot);\n+                if (itemSlot == BOT_SLOT_MAINHAND)\n+                    mhEnchantExpireTimer = ITEM_ENCHANTMENT_EXPIRE_TIMER;\n+                else if (itemSlot == BOT_SLOT_OFFHAND)\n+                    ohEnchantExpireTimer = ITEM_ENCHANTMENT_EXPIRE_TIMER;\n+                GC_Timer = 1500; //needed\n+            }\n+        }\n+\n+        void SpellHit(Unit* wcaster, SpellInfo const* spell) override\n+        {\n+            Unit* caster = wcaster->ToUnit();\n+            if (!caster)\n+                return;\n+\n+            uint32 spellId = spell->Id;\n+\n+            //Maelstrom Weapon helper\n+            if (spellId == MAELSTROM_WEAPON_BUFF)\n+            {\n+                if (Aura const* mwb = me->GetAura(MAELSTROM_WEAPON_BUFF))\n+                    MaelstromCount = mwb->GetStackAmount();\n+\n+                MaelstromTimer = 30000; //30 sec duration then reset\n+            }\n+\n+            OnSpellHit(caster, spell);\n+        }\n+\n+        void SpellHitTarget(Unit* wtarget, SpellInfo const* spell) override\n+        {\n+            Unit* target = wtarget->ToUnit();\n+            if (!target)\n+                return;\n+\n+            uint32 spellId = spell->Id;\n+            uint32 baseId = spell->GetFirstRankSpell()->Id;\n+\n+            if (baseId == EARTH_SHIELD_1)\n+                Earthy = true;\n+\n+            if (baseId == HEX_1)\n+            {\n+                Hexy = true;\n+                HexyCheckTimer += 2000;\n+            }\n+\n+            //Earthen Power part 2\n+            if ((GetSpec() == BOT_SPEC_SHAMAN_ENHANCEMENT) && me->GetLevel() >= 50 && baseId == EARTH_SHOCK_1)\n+            {\n+                if (AuraEffect* eff = target->GetAuraEffect(spellId, 0, me->GetGUID()))\n+                    eff->ChangeAmount(eff->GetAmount() * 2);\n+            }\n+\n+            //Lightning Overload\n+            if ((GetSpec() == BOT_SPEC_SHAMAN_ELEMENTAL) &&\n+                me->GetLevel() >= 45 && (baseId == LIGHTNING_BOLT_1 || baseId == CHAIN_LIGHTNING_1) &&\n+                urand(1,100) <= 33)\n+            {\n+                uint32 procId = 0;\n+                switch (spellId)\n+                {\n+                    // Lightning Bolt\n+                    case   403: procId = 45284; break; // Rank  1\n+                    case   529: procId = 45286; break; // Rank  2\n+                    case   548: procId = 45287; break; // Rank  3\n+                    case   915: procId = 45288; break; // Rank  4\n+                    case   943: procId = 45289; break; // Rank  5\n+                    case  6041: procId = 45290; break; // Rank  6\n+                    case 10391: procId = 45291; break; // Rank  7\n+                    case 10392: procId = 45292; break; // Rank  8\n+                    case 15207: procId = 45293; break; // Rank  9\n+                    case 15208: procId = 45294; break; // Rank 10\n+                    case 25448: procId = 45295; break; // Rank 11\n+                    case 25449: procId = 45296; break; // Rank 12\n+                    case 49237: procId = 49239; break; // Rank 13\n+                    case 49238: procId = 49240; break; // Rank 14\n+                    // Chain Lightning\n+                    case   421: procId = 45297; break; // Rank  1\n+                    case   930: procId = 45298; break; // Rank  2\n+                    case  2860: procId = 45299; break; // Rank  3\n+                    case 10605: procId = 45300; break; // Rank  4\n+                    case 25439: procId = 45301; break; // Rank  5\n+                    case 25442: procId = 45302; break; // Rank  6\n+                    case 49270: procId = 49268; break; // Rank  7\n+                    case 49271: procId = 49269; break; // Rank  8\n+                    default:                    break;\n+                }\n+\n+                if (procId)\n+                {\n+                    if (baseId == LIGHTNING_BOLT_1)\n+                        me->CastSpell(target, procId, true);\n+                    if (baseId == CHAIN_LIGHTNING_1)\n+                    {\n+                        //Normalize chance\n+                        if (urand(1,100) <= (100.f / spell->Effects[0].ChainTarget))\n+                            me->CastSpell(target, procId, true);\n+                    }\n+                }\n+            }\n+\n+            //Shields improvement, replaces Static Shock (part 2) and Improved Earth Shield (part 1)\n+            if (baseId == LIGHTNING_SHIELD_1 || baseId == EARTH_SHIELD_1 || baseId == WATER_SHIELD_1)\n+            {\n+                if (Aura* shield = target->GetAura(spellId, me->GetGUID()))\n+                {\n+                    shield->SetCharges(shield->GetCharges() + 6);\n+                }\n+            }\n+\n+            OnSpellHitTarget(target, spell);\n+        }\n+\n+        void DamageDealt(Unit* victim, uint32& damage, DamageEffectType damageType, SpellSchoolMask damageSchoolMask) override\n+        {\n+            bot_ai::DamageDealt(victim, damage, damageType, damageSchoolMask);\n+        }\n+\n+        void DamageTaken(Unit* u, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellSchoolMask /*schoolMask*/) override\n+        {\n+            if (!u)\n+                return;\n+            if (!u->IsInCombat() && !me->IsInCombat())\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void OwnerAttackedBy(Unit* u) override\n+        {\n+            if (!u)\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        uint8 GetPetPositionNumber(Creature const* summon) const override\n+        {\n+            for (auto i : NPCBots::index_array<uint8, MAX_WOLVES>)\n+                if (_wolves[i] == summon->GetGUID())\n+                    return i;\n+\n+            return 0;\n+        }\n+\n+        void SummonBotPet(Unit* target)\n+        {\n+            UnsummonWolves();\n+\n+            uint32 entry = BOT_PET_SPIRIT_WOLF;\n+\n+            for ([[maybe_unused]] auto i : NPCBots::index_array<uint8, MAX_WOLVES>)\n+            {\n+                //Position pos;\n+\n+                //45 sec duration\n+                Creature* myPet = me->SummonCreature(entry, *me, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5000);\n+                //me->GetNearPoint(myPet, pos.m_positionX, pos.m_positionY, pos.m_positionZ, 0, 2, me->GetOrientation());\n+                //myPet->GetMotionMaster()->MovePoint(me->GetMapId(), pos);\n+                myPet->SetCreator(master);\n+                myPet->SetOwnerGUID(me->GetGUID());\n+                myPet->SetFaction(master->GetFaction());\n+                myPet->SetControlledByPlayer(!IAmFree());\n+                myPet->SetPvP(me->IsPvP());\n+                myPet->SetByteValue(UNIT_FIELD_BYTES_2, 1, master->GetByteValue(UNIT_FIELD_BYTES_2, 1));\n+                myPet->SetUInt32Value(UNIT_CREATED_BY_SPELL, FERAL_SPIRIT_1);\n+\n+                //botPet = myPet;\n+\n+                myPet->Attack(target, true);\n+                if (!HasBotCommandState(BOT_COMMAND_MASK_UNCHASE))\n+                    myPet->GetMotionMaster()->MoveChase(target);\n+            }\n+        }\n+\n+        void JustSummoned(Creature* summon) override\n+        {\n+            if (summon->GetEntry() == BOT_PET_SPIRIT_WOLF)\n+            {\n+                bool found = false;\n+                for (auto i : NPCBots::index_array<uint8, MAX_WOLVES>)\n+                {\n+                    if (!_wolves[i])\n+                    {\n+                        _wolves[i] = summon->GetGUID();\n+                        found = true;\n+                        break;\n+                    }\n+                }\n+                if (!found)\n+                {\n+                    BOT_LOG_ERROR(\"entities.unit\", \"Shaman_bot:JustSummoned() wolves array is full\");\n+                    ASSERT(false);\n+                }\n+            }\n+        }\n+\n+        void SummonedCreatureDespawn(Creature* summon) override\n+        {\n+            //BOT_LOG_ERROR(\"entities.unit\", \"SummonedCreatureDespawn: %s's %s\", me->GetName().c_str(), summon->GetName().c_str());\n+            //if (summon == botPet)\n+            //    botPet = nullptr;\n+            if (summon->GetEntry() == BOT_PET_SPIRIT_WOLF)\n+            {\n+                //bool found = false;\n+                for (auto i : NPCBots::index_array<uint8, MAX_WOLVES>)\n+                {\n+                    if (_wolves[i] == summon->GetGUID())\n+                    {\n+                        _wolves[i] = ObjectGuid::Empty;\n+                        //found = true;\n+                        break;\n+                    }\n+                }\n+                //if (!found)\n+                //{\n+                //    BOT_LOG_ERROR(\"entities.unit\", \"Shaman_bot:SummonedCreatureDespawn() wolf is not found in array\");\n+                //    ASSERT(false);\n+                //}\n+            }\n+        }\n+\n+        void UnsummonWolves()\n+        {\n+            for (auto i : NPCBots::index_array<uint8, MAX_WOLVES>)\n+            {\n+                if (_wolves[i])\n+                {\n+                    if (Unit* wo = ObjectAccessor::GetUnit(*me, _wolves[i]))\n+                        wo->ToTempSummon()->UnSummon();\n+                    else\n+                        _wolves[i] = ObjectGuid::Empty;\n+                }\n+            }\n+        }\n+\n+        void UnsummonAll(bool /*savePets*/ = true) override\n+        {\n+            UnsummonWolves();\n+\n+            for (auto i : NPCBots::index_array<uint8, MAX_WOLVES>)\n+            {\n+                if (_totems[i].first != ObjectGuid::Empty)\n+                {\n+                    Unit* to = ObjectAccessor::GetUnit(*me, _totems[i].first);\n+                    if (!to)\n+                    {\n+                        //BOT_LOG_ERROR(\"entities.player\", \"%s has no totem in slot %u during remove!\", me->GetName().c_str(), i);\n+                        continue;\n+                    }\n+                    to->ToTotem()->UnSummon();\n+                }\n+            }\n+        }\n+\n+        void OnBotDespawn(Creature* summon) override\n+        {\n+            if (!summon)\n+            {\n+                BOT_LOG_ERROR(\"entities.player\", \"OnBotDespawn(): Shaman bot {} received NULL\", me->GetName().c_str());\n+                ASSERT(false);\n+                //UnsummonAll(false);\n+                return;\n+            }\n+\n+            TempSummon const* totem = summon->ToTempSummon();\n+            if (!totem || !totem->IsTotem())\n+            {\n+                //BOT_LOG_ERROR(\"entities.player\", \"OnBotDespawn(): Shaman bot %s has despawned summon %s which is not a temp summon or not a totem...\", me->GetName().c_str(), summon->GetName().c_str());\n+                return;\n+            }\n+\n+            int8 slot = -1;\n+            switch (totem->m_Properties->Slot)\n+            {\n+                case SUMMON_SLOT_TOTEM_FIRE:    slot = T_FIRE;  break;\n+                case SUMMON_SLOT_TOTEM_EARTH:   slot = T_EARTH; break;\n+                case SUMMON_SLOT_TOTEM_WATER:   slot = T_WATER; break;\n+                case SUMMON_SLOT_TOTEM_AIR:     slot = T_AIR;   break;\n+                default:\n+                    BOT_LOG_ERROR(\"entities.player\", \"OnBotDespawn(): Shaman bot {} has despawned totem {} in unknown slot {}\", me->GetName().c_str(), summon->GetName().c_str(), totem->m_Properties->Id);\n+                    return;\n+            }\n+\n+            if (_totems[slot].first == ObjectGuid::Empty)\n+                BOT_LOG_ERROR(\"entities.player\", \"OnBotDespawn(): Shaman bot {} has despawned totem {} while not having it registered!\", me->GetName().c_str(), summon->GetName().c_str());\n+            else if (_totems[slot].second._type == BOT_TOTEM_NONE || _totems[slot].second._type >= BOT_TOTEM_END)\n+                BOT_LOG_ERROR(\"entities.player\", \"OnBotDespawn(): Shaman bot {} has despawned totem {} with no type assigned!\", me->GetName().c_str(), summon->GetName().c_str());\n+\n+            //here we reset totem category cd (not totem spell cd) if totem is destroyed\n+            //BOT_LOG_ERROR(\"entities.player\", \"OnBotDespawn(): %s despawned (%s : %u)\", summon->GetName().c_str(), summon->IsAlive() ? \"alive\" : summon->isDying() ? \"justdied\" : \"unk\", (uint32)summon->getDeathState());\n+            if (!summon->IsAlive()) // alive here means totem is being replaced or unsummoned through other means\n+                _totemTimer[slot] = 0;\n+\n+            _totems[slot].first = ObjectGuid::Empty;\n+            _totems[slot].second._type = BOT_TOTEM_NONE;\n+            me->m_SummonSlot[slot+1] = ObjectGuid::Empty;\n+        }\n+\n+        void OnBotSummon(Creature* summon) override\n+        {\n+            TempSummon const* totem = summon->ToTempSummon();\n+            if (!totem || !totem->IsTotem())\n+            {\n+                //BOT_LOG_ERROR(\"entities.player\", \"OnBotSummon(): Shaman bot %s has summoned creature %s which is not a temp summon or not a totem...\", me->GetName().c_str(), summon->GetName().c_str());\n+                return;\n+            }\n+\n+            int8 slot = -1;\n+            switch (totem->m_Properties->Slot)\n+            {\n+                case SUMMON_SLOT_TOTEM_FIRE:    slot = T_FIRE;  break;\n+                case SUMMON_SLOT_TOTEM_EARTH:   slot = T_EARTH; break;\n+                case SUMMON_SLOT_TOTEM_WATER:   slot = T_WATER; break;\n+                case SUMMON_SLOT_TOTEM_AIR:     slot = T_AIR;   break;\n+                default:\n+                    BOT_LOG_ERROR(\"entities.player\", \"OnBotSummon(): Shaman bot {} has summoned totem {} with unknown type {}\", me->GetName().c_str(), summon->GetName().c_str(), totem->m_Properties->Id);\n+                    return;\n+            }\n+\n+            //Unsummon current totem\n+            ObjectGuid curTotemGUID = _totems[slot].first;\n+            if (curTotemGUID)\n+            {\n+                Unit* curTotem = ObjectAccessor::GetUnit(*me, curTotemGUID);\n+                if (curTotem)\n+                    curTotem->ToTotem()->UnSummon();\n+            }\n+\n+            float radius = 30.f;\n+            if (SpellInfo const* info = sSpellMgr->GetSpellInfo(summon->m_spells[0]))\n+                if (SpellRadiusEntry const* entry = info->Effects[0].RadiusEntry)\n+                    radius = std::max<float>(entry->RadiusMax, radius);\n+\n+            uint32 createSpell = summon->GetUInt32Value(UNIT_CREATED_BY_SPELL);\n+            if (createSpell)\n+                createSpell = sSpellMgr->GetSpellInfo(createSpell)->GetFirstRankSpell()->Id;\n+            //DEBUG\n+            //if (!IAmFree())\n+            //{\n+            //    std::ostringstream msg;\n+            //    msg << \"Summoned \" << summon->GetName() << \" by basespell: \" << createSpell;\n+            //    BotWhisper(msg.view());\n+            //}\n+            uint32 btype;\n+            switch (createSpell)\n+            {\n+                case SEARING_TOTEM_1:           btype = BOT_TOTEM_SEARING;              break;\n+                case STONECLAW_TOTEM_1:         btype = BOT_TOTEM_STONECLAW;            break;\n+                case SENTRY_TOTEM_1:            btype = BOT_TOTEM_SENTRY;               break;\n+                case STONESKIN_TOTEM_1:         btype = BOT_TOTEM_STONESKIN;            break;\n+                case HEALING_STREAM_TOTEM_1:    btype = BOT_TOTEM_HEALING_STREAM;       break;\n+                case EARTHBIND_TOTEM_1:         btype = BOT_TOTEM_EARTHBIND;            break;\n+                case EARTH_ELEMENTAL_TOTEM_1:   btype = BOT_TOTEM_ELEMENTAL_EARTH;      break;\n+                case FIRE_ELEMENTAL_TOTEM_1:    btype = BOT_TOTEM_ELEMENTAL_FIRE;       break;\n+                case MAGMA_TOTEM_1:             btype = BOT_TOTEM_MAGMA;                break;\n+                case FLAMETONGUE_TOTEM_1:       btype = BOT_TOTEM_FLAMETONGUE;          break;\n+                case FROST_RESISTANCE_TOTEM_1:  btype = BOT_TOTEM_RESISTANCE_FROST;     break;\n+                case FIRE_RESISTANCE_TOTEM_1:   btype = BOT_TOTEM_RESISTANCE_FIRE;      break;\n+                case NATURE_RESISTANCE_TOTEM_1: btype = BOT_TOTEM_RESISTANCE_NATURE;    break;\n+                case GROUNDING_TOTEM_1:         btype = BOT_TOTEM_GROUNDING;            break;\n+                case STRENGTH_OF_EARTH_TOTEM_1: btype = BOT_TOTEM_STRENGTH_OF_EARTH;    break;\n+                case WINDFURY_TOTEM_1:          btype = BOT_TOTEM_WINDFURY;             break;\n+                case WRATH_OF_AIR_TOTEM_1:      btype = BOT_TOTEM_WRATH_OF_AIR;         break;\n+                case CLEANSING_TOTEM_1:         btype = BOT_TOTEM_CLEANSING;            break;\n+                case MANA_SPRING_TOTEM_1:       btype = BOT_TOTEM_MANA_SPRING;          break;\n+                case MANA_TIDE_TOTEM_1:         btype = BOT_TOTEM_MANA_TIDE;            break;\n+                case TREMOR_TOTEM_1:            btype = BOT_TOTEM_TREMOR;               break;\n+                case TOTEM_OF_WRATH_1:          btype = BOT_TOTEM_WRATH;                break;\n+                default:\n+                {\n+                    BOT_LOG_ERROR(\"scripts\", \"Unknown totem create spell {}!\", createSpell);\n+                    btype = BOT_TOTEM_NONE;\n+                    break;\n+                }\n+            }\n+            _totems[slot].first = summon->GetGUID();\n+            _totems[slot].second._pos.Relocate(*summon);\n+            _totems[slot].second._effradius = !((1u<<btype) & BOT_TOTEM_MASK_SUMMONS) ? radius : SIZE_OF_GRIDS;\n+            _totems[slot].second._type = btype;\n+            me->m_SummonSlot[slot+1] = _totems[slot].first; //needed for scripts handlers\n+\n+            //BOT_LOG_ERROR(\"entities.player\", \"shaman bot: summoned %s (type %u) at x=%.2f, y=%.2f, z=%.2f\",\n+            //    summon->GetName().c_str(), slot + 1, _totems[slot].second.pos.GetPositionX(), _totems[slot].second.pos.GetPositionY(), _totems[slot].second.pos.GetPositionZ());\n+\n+            //TODO: gets overriden in Spell::EffectSummonType (end)\n+            //Without setting creator correctly it will be impossible to use summon X elemental totems\n+            summon->SetCreator(me);\n+            //summon->SetDisplayId(sObjectMgr->GetModelForTotem(SummonSlot(slot+1), Races(me->GetRace())));\n+            summon->SetDisplayId(sObjectMgr->GetModelForTotem(SummonSlot(totem->m_Properties->Slot), Races(me->GetRace())));\n+            summon->SetFaction(me->GetFaction());\n+            summon->SetPvP(me->IsPvP());\n+            summon->SetOwnerGUID(master->GetGUID());\n+            summon->SetControlledByPlayer(!IAmFree());\n+            //summon->SetUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED);\n+            // totem will claim master's summon slot\n+            // free it to avoid conflicts with other shaman bots and master\n+            // if master is a shaman his totem will despawn\n+            // fixed in summoning sequence\n+            //master->m_SummonSlot[++slot] = 0;\n+\n+            //After summon effects which are not handled for bot totems\n+            //check by btype\n+\n+            // Storm, Earth and Fire: Earthbind totem AoE root\n+            if ((GetSpec() == BOT_SPEC_SHAMAN_ELEMENTAL) && btype == BOT_TOTEM_EARTHBIND && me->GetLevel() >= 40)\n+            {\n+                //master's talent will be found so do not cast earthgrab twice, instead let spell script roll the chance\n+                //see spell_shaman.cpp\n+                if (!master->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_SHAMAN, 3063, EFFECT_1))\n+                    summon->CastSpell(summon, STORMEARTHANDFIRE_EARTHGRAB, false);\n+            }\n+        }\n+\n+        float GetSpellAttackRange(bool longRange) const override\n+        {\n+            return longRange ? CalcSpellMaxRange(LIGHTNING_BOLT_1) : 20.f;\n+        }\n+\n+        uint32 GetAIMiscValue(uint32 data) const override\n+        {\n+            switch (data)\n+            {\n+                case BOTAI_MISC_ENCHANT_IS_AUTO_MH:\n+                    return needChooseMHEnchant;\n+                case BOTAI_MISC_ENCHANT_IS_AUTO_OH:\n+                    return needChooseOHEnchant;\n+                case BOTAI_MISC_ENCHANT_TIMER_MH:\n+                    return mhEnchantExpireTimer;\n+                case BOTAI_MISC_ENCHANT_TIMER_OH:\n+                    return ohEnchantExpireTimer;\n+                case BOTAI_MISC_ENCHANT_CURRENT_MH:\n+                    return mhEnchant;\n+                case BOTAI_MISC_ENCHANT_CURRENT_OH:\n+                    return ohEnchant;\n+                case BOTAI_MISC_ENCHANT_AVAILABLE_1:\n+                    return /*GetSpell(ROCKBITER_WEAPON_1) ? ROCKBITER_WEAPON_1 : */0;\n+                case BOTAI_MISC_ENCHANT_AVAILABLE_2:\n+                    return GetSpell(FLAMETONGUE_WEAPON_1) ? FLAMETONGUE_WEAPON_1 : 0;\n+                case BOTAI_MISC_ENCHANT_AVAILABLE_3:\n+                    return GetSpell(FROSTBRAND_WEAPON_1) ? FROSTBRAND_WEAPON_1 : 0;\n+                case BOTAI_MISC_ENCHANT_AVAILABLE_4:\n+                    return GetSpell(WINDFURY_WEAPON_1) ? WINDFURY_WEAPON_1 : 0;\n+                case BOTAI_MISC_ENCHANT_AVAILABLE_5:\n+                    return GetSpell(EARTHLIVING_WEAPON_1) ? EARTHLIVING_WEAPON_1 : 0;\n+                case BOTAI_MISC_PET_TYPE:\n+                    return BOT_PET_SPIRIT_WOLF;\n+                default:\n+                    return 0;\n+            }\n+        }\n+\n+        void SetAIMiscValue(uint32 data, uint32 value) override\n+        {\n+            switch (data)\n+            {\n+                case BOTAI_MISC_ENCHANT_IS_AUTO_MH:\n+                    needChooseMHEnchant = bool(value);\n+                    break;\n+                case BOTAI_MISC_ENCHANT_IS_AUTO_OH:\n+                    needChooseOHEnchant = bool(value);\n+                    break;\n+                case BOTAI_MISC_ENCHANT_TIMER_MH:\n+                    if (value == 0)\n+                        mhEnchantExpireTimer = value;\n+                    break;\n+                case BOTAI_MISC_ENCHANT_TIMER_OH:\n+                    if (value == 0)\n+                        ohEnchantExpireTimer = value;\n+                    break;\n+                case BOTAI_MISC_ENCHANT_CURRENT_MH:\n+                    mhEnchant = value;\n+                    SetAIMiscValue(BOTAI_MISC_ENCHANT_IS_AUTO_MH, value ? false : true);\n+                    break;\n+                case BOTAI_MISC_ENCHANT_CURRENT_OH:\n+                    ohEnchant = value;\n+                    SetAIMiscValue(BOTAI_MISC_ENCHANT_IS_AUTO_OH, value ? false : true);\n+                    break;\n+                default:\n+                    break;\n+            }\n+\n+            bot_ai::SetAIMiscValue(data, value);\n+        }\n+\n+        void Reset() override\n+        {\n+            UnsummonAll(false);\n+\n+            _wolves = {};\n+            _totemTimer = {};\n+\n+            removeShapeshiftForm();\n+\n+            TotemsCheckTimer = 1500;\n+\n+            HexyCheckTimer = 3000;\n+            EarthyCheckTimer = 2000;\n+            ShieldCheckTimer = 2000;\n+            BloodlustCheckTimer = 5000;\n+            MaelstromTimer = 0;\n+\n+            MaelstromCount = 0;\n+\n+            Hexy = false;\n+            Earthy = false;\n+            maelUseUp = false;\n+\n+            mhEnchantExpireTimer = std::min<uint32>(mhEnchantExpireTimer, 1);\n+            ohEnchantExpireTimer = std::min<uint32>(ohEnchantExpireTimer, 1);\n+\n+            DefaultInit();\n+        }\n+\n+        void ReduceCD(uint32 diff) override\n+        {\n+            for (auto& ttimer : _totemTimer)\n+                if (ttimer > diff)\n+                    ttimer -= diff;\n+\n+            if (TotemsCheckTimer > diff)        TotemsCheckTimer -= diff;\n+\n+            if (HexyCheckTimer > diff)          HexyCheckTimer -= diff;\n+            if (EarthyCheckTimer > diff)        EarthyCheckTimer -= diff;\n+            if (ShieldCheckTimer > diff)        ShieldCheckTimer -= diff;\n+            if (BloodlustCheckTimer > diff)     BloodlustCheckTimer -= diff;\n+\n+            if (MaelstromTimer > diff)          MaelstromTimer -= diff;\n+            else if (MaelstromCount) { MaelstromCount = 0; maelUseUp = false; }\n+\n+            if (mhEnchantExpireTimer > diff)    mhEnchantExpireTimer -= diff;\n+            if (ohEnchantExpireTimer > diff)    ohEnchantExpireTimer -= diff;\n+        }\n+\n+        void InitPowers() override\n+        {\n+            me->SetPowerType(POWER_MANA);\n+        }\n+\n+        void InitSpells() override\n+        {\n+            uint8 lvl = me->GetLevel();\n+            bool isElem = GetSpec() == BOT_SPEC_SHAMAN_ELEMENTAL;\n+            bool isEnha = GetSpec() == BOT_SPEC_SHAMAN_ENHANCEMENT;\n+            bool isRest = GetSpec() == BOT_SPEC_SHAMAN_RESTORATION;\n+\n+            InitSpellMap(HEALING_WAVE_1);\n+            InitSpellMap(CHAIN_HEAL_1);\n+            InitSpellMap(LESSER_HEALING_WAVE_1);\n+            InitSpellMap(ANCESTRAL_SPIRIT_1);\n+            InitSpellMap(CURE_TOXINS_1);\n+            InitSpellMap(FLAME_SHOCK_1);\n+            InitSpellMap(EARTH_SHOCK_1);\n+            InitSpellMap(FROST_SHOCK_1);\n+            InitSpellMap(LIGHTNING_BOLT_1);\n+            InitSpellMap(CHAIN_LIGHTNING_1);\n+            InitSpellMap(LAVA_BURST_1);\n+            InitSpellMap(LIGHTNING_SHIELD_1);\n+            InitSpellMap(WATER_SHIELD_1);\n+            InitSpellMap(WATER_BREATHING_1);\n+            InitSpellMap(WATER_WALKING_1);\n+            InitSpellMap(PURGE_1);\n+            InitSpellMap(WIND_SHEAR_1);\n+            InitSpellMap(HEX_1);\n+            InitSpellMap((me->GetRaceMask() & sRaceMgr->GetAllianceRaceMask()) ? HEROISM_1 : BLOODLUST_1); //at least race is constant\n+\n+            InitSpellMap(GHOST_WOLF_1);\n+\n+            InitSpellMap(FIRE_NOVA_1);\n+            //totems\n+            InitSpellMap(EARTHBIND_TOTEM_1);\n+            InitSpellMap(MAGMA_TOTEM_1);\n+            //InitSpellMap(SEARING_TOTEM_1);\n+            //InitSpellMap(STONECLAW_TOTEM_1);\n+            InitSpellMap(FIRE_ELEMENTAL_TOTEM_1);\n+            InitSpellMap(EARTH_ELEMENTAL_TOTEM_1);\n+            InitSpellMap(FIRE_RESISTANCE_TOTEM_1);\n+            InitSpellMap(FROST_RESISTANCE_TOTEM_1);\n+            InitSpellMap(NATURE_RESISTANCE_TOTEM_1);\n+            InitSpellMap(FLAMETONGUE_TOTEM_1);\n+            InitSpellMap(GROUNDING_TOTEM_1);\n+            //InitSpellMap(SENTRY_TOTEM_1);\n+            //InitSpellMap(STONESKIN_TOTEM_1);\n+            InitSpellMap(STRENGTH_OF_EARTH_TOTEM_1);\n+            InitSpellMap(WINDFURY_TOTEM_1);\n+            InitSpellMap(WRATH_OF_AIR_TOTEM_1);\n+            InitSpellMap(CLEANSING_TOTEM_1);\n+            //InitSpellMap(HEALING_STREAM_TOTEM_1);\n+            InitSpellMap(MANA_SPRING_TOTEM_1);\n+            InitSpellMap(TREMOR_TOTEM_1);\n+\n+            InitSpellMap(TOTEMIC_RECALL_1);\n+\n+            InitSpellMap(REINCARNATION_1); //base lvl 30, 30 min cd\n+\n+  /*Talent*///lvl >= 40 && isElem ? InitSpellMap(ELEMENTAL_MASTERY_1) : RemoveSpell(ELEMENTAL_MASTERY_1);\n+  /*Talent*/lvl >= 60 && isElem ? InitSpellMap(THUNDERSTORM_1) : RemoveSpell(THUNDERSTORM_1);\n+\n+  /*Talent*/lvl >= 40 && isEnha ? InitSpellMap(STORMSTRIKE_1) : RemoveSpell(STORMSTRIKE_1);\n+  /*Talent*/lvl >= 50 && isEnha ? InitSpellMap(SHAMANISTIC_RAGE_1) : RemoveSpell(SHAMANISTIC_RAGE_1);\n+  /*Talent*/lvl >= 60 && isEnha ? InitSpellMap(FERAL_SPIRIT_1) : RemoveSpell(FERAL_SPIRIT_1); //not casted\n+\n+  /*Talent*/lvl >= 20 && isRest ? InitSpellMap(TIDAL_FORCE_1) : RemoveSpell(TIDAL_FORCE_1);\n+  /*Talent*/lvl >= 30 && isRest ? InitSpellMap(NATURES_SWIFTNESS_1) : RemoveSpell(NATURES_SWIFTNESS_1);\n+  /*Talent*/lvl >= 50 && isRest ? InitSpellMap(EARTH_SHIELD_1) : RemoveSpell(EARTH_SHIELD_1);\n+  /*Talent*/lvl >= 60 && isRest ? InitSpellMap(RIPTIDE_1) : RemoveSpell(RIPTIDE_1);\n+\n+  /*Talent*/lvl >= 50 && isElem ? InitSpellMap(TOTEM_OF_WRATH_1) : RemoveSpell(TOTEM_OF_WRATH_1);\n+\n+  /*Talent*/lvl >= 40 && isRest ? InitSpellMap(MANA_TIDE_TOTEM_1) : RemoveSpell(MANA_TIDE_TOTEM_1);\n+\n+            CURE_TOXINS = InitSpell(me, CLEANSE_SPIRIT_1) ? CLEANSE_SPIRIT_1 : CURE_TOXINS_1;\n+            RemoveSpell(CLEANSE_SPIRIT_1);\n+            RemoveSpell(CURE_TOXINS_1);\n+            InitSpellMap(CURE_TOXINS);\n+\n+            //InitSpellMap(ROCKBITER_WEAPON_1); //lvl 1\n+            InitSpellMap(FLAMETONGUE_WEAPON_1); //lvl 10\n+            InitSpellMap(FROSTBRAND_WEAPON_1); //lvl 20\n+            InitSpellMap(WINDFURY_WEAPON_1); //lvl 30\n+            InitSpellMap(EARTHLIVING_WEAPON_1); //lvl 30\n+        }\n+\n+        void ApplyClassPassives() const override\n+        {\n+            uint8 level = master->GetLevel();\n+            bool isElem = GetSpec() == BOT_SPEC_SHAMAN_ELEMENTAL;\n+            bool isEnha = GetSpec() == BOT_SPEC_SHAMAN_ENHANCEMENT;\n+            bool isRest = GetSpec() == BOT_SPEC_SHAMAN_RESTORATION;\n+\n+            RefreshAura(ELEMENTAL_DEVASTATION3, isEnha && level >= 18 ? 1 : 0);\n+            RefreshAura(ELEMENTAL_DEVASTATION2, isEnha && level >= 15 && level < 18 ? 1 : 0);\n+            RefreshAura(ELEMENTAL_DEVASTATION1, isEnha && level >= 12 && level < 15 ? 1 : 0);\n+            RefreshAura(ELEMENTAL_FOCUS, isElem && level >= 20 ? 1 : 0);\n+            RefreshAura(ELEMENTAL_OATH, !IAmFree() && isElem && level >= 40 ? 1 : 0);\n+            //RefreshAura(STORM_EARTH_AND_FIRE, isElem && level >= 45 ? 1 : 0);\n+\n+            RefreshAura(TOUGHNESS, level >= 25 ? 1 : 0);\n+            RefreshAura(FLURRY5, isEnha && level >= 29 ? 1 : 0);\n+            RefreshAura(FLURRY4, isEnha && level >= 28 && level < 29 ? 1 : 0);\n+            RefreshAura(FLURRY3, isEnha && level >= 27 && level < 28 ? 1 : 0);\n+            RefreshAura(FLURRY2, isEnha && level >= 26 && level < 27 ? 1 : 0);\n+            RefreshAura(FLURRY1, isEnha && level >= 25 && level < 26 ? 1 : 0);\n+            RefreshAura(WEAPON_MASTERY, isEnha && level >= 30 ? 1 : 0);\n+            RefreshAura(UNLEASHED_RAGE, !IAmFree() && isEnha && level >= 35 ? 1 : 0);\n+            RefreshAura(IMPROVED_STORMSTRIKE, isEnha && level >= 40 ? 1 : 0);\n+            RefreshAura(STATIC_SHOCK, isEnha && level >= 41 ? 1 : 0);\n+            RefreshAura(EARTHEN_POWER, isEnha && level >= 50 ? 1 : 0);\n+            RefreshAura(MAELSTROM_WEAPON5, isEnha && level >= 59 ? 1 : 0);\n+            RefreshAura(MAELSTROM_WEAPON4, isEnha && level >= 58 && level < 59 ? 1 : 0);\n+            RefreshAura(MAELSTROM_WEAPON3, isEnha && level >= 57 && level < 58 ? 1 : 0);\n+            RefreshAura(MAELSTROM_WEAPON2, isEnha && level >= 56 && level < 57 ? 1 : 0);\n+            RefreshAura(MAELSTROM_WEAPON1, isEnha && level >= 55 && level < 56 ? 1 : 0);\n+\n+            RefreshAura(IMPROVED_WATER_SHIELD, isRest && level >= 20 ? 1 : 0);\n+            RefreshAura(ANCESTRAL_HEALING, isRest && level >= 20 ? 1 : 0);\n+            RefreshAura(ANCESTRAL_AWAKENING, isRest && level >= 50 ? 1 : 0);\n+            RefreshAura(TIDAL_WAVES, isRest && level >= 55 ? 1 : 0);\n+\n+            RefreshAura(SHAMAN_FLAME_SHOCK_PASSIVE);\n+\n+            RefreshAura(SHAMAN_T10_RESTO_4P, level >= 70 ? 1 : 0);\n+\n+            RefreshAura(GLYPH_THUNDERSTORM, GetSpell(THUNDERSTORM_1) ? 1 : 0);\n+            RefreshAura(GLYPH_TOTEM_OF_WRATH, GetSpell(TOTEM_OF_WRATH_1) ? 1 : 0);\n+        }\n+\n+        bool CanUseManually(uint32 basespell) const override\n+        {\n+            switch (basespell)\n+            {\n+                case HEALING_WAVE_1:\n+                case CHAIN_HEAL_1:\n+                case LESSER_HEALING_WAVE_1:\n+                case RIPTIDE_1:\n+                case CLEANSE_SPIRIT_1:\n+                case WATER_WALKING_1:\n+                case WATER_BREATHING_1:\n+                case BLOODLUST_1:\n+                case HEROISM_1:\n+                case SHAMANISTIC_RAGE_1:\n+                //case ELEMENTAL_MASTERY_1:\n+                case TIDAL_FORCE_1:\n+                //Totems\n+                //case EARTHBIND_TOTEM_1:\n+                //case MAGMA_TOTEM_1:\n+                //case SEARING_TOTEM_1:\n+                //case STONECLAW_TOTEM_1:\n+                //case FIRE_ELEMENTAL_TOTEM_1:\n+                //case EARTH_ELEMENTAL_TOTEM_1:\n+                //case FIRE_RESISTANCE_TOTEM_1:\n+                //case FROST_RESISTANCE_TOTEM_1:\n+                //case NATURE_RESISTANCE_TOTEM_1:\n+                //case FLAMETONGUE_TOTEM_1:\n+                case GROUNDING_TOTEM_1:\n+                //case SENTRY_TOTEM_1:\n+                //case STONESKIN_TOTEM_1:\n+                //case STRENGTH_OF_EARTH_TOTEM_1:\n+                //case WINDFURY_TOTEM_1:\n+                //case WRATH_OF_AIR_TOTEM_1:\n+                case CLEANSING_TOTEM_1:\n+                //case HEALING_STREAM_TOTEM_1:\n+                //case MANA_SPRING_TOTEM_1:\n+                //case TOTEM_OF_WRATH_1:\n+                case MANA_TIDE_TOTEM_1:\n+                case TREMOR_TOTEM_1:\n+                case TOTEMIC_RECALL_1:\n+                    return true;\n+                case CURE_TOXINS_1:\n+                    return !GetSpell(CLEANSE_SPIRIT_1);\n+                case FIRE_NOVA_1:\n+                    return _totems[T_FIRE].second._type != BOT_TOTEM_NONE;\n+                default:\n+                    return false;\n+            }\n+        }\n+\n+        bool HasAbilitiesSpecifics() const override { return true; }\n+        void FillAbilitiesSpecifics(Player const* player, std::list<std::string> &specList) override\n+        {\n+            uint32 textId1, textId2;\n+            switch (mhEnchant)\n+            {\n+                //case ROCKBITER_WEAPON_1:   textId1 = BOT_TEXT_\"Rockbiter\";  break;\n+                case FLAMETONGUE_WEAPON_1: textId1 = BOT_TEXT_FLAMETONGUE;  break;\n+                case FROSTBRAND_WEAPON_1:  textId1 = BOT_TEXT_FROSTBRAND;   break;\n+                case WINDFURY_WEAPON_1:    textId1 = BOT_TEXT_WINDFURY;     break;\n+                case EARTHLIVING_WEAPON_1: textId1 = BOT_TEXT_EARTHLIVING;  break;\n+                default:                   textId1 = BOT_TEXT_NOTHING_C;    break;\n+            }\n+            switch (ohEnchant)\n+            {\n+                //case ROCKBITER_WEAPON_1:   textId2 = BOT_TEXT_\"Rockbiter\";  break;\n+                case FLAMETONGUE_WEAPON_1: textId2 = BOT_TEXT_FLAMETONGUE;  break;\n+                case FROSTBRAND_WEAPON_1:  textId2 = BOT_TEXT_FROSTBRAND;   break;\n+                case WINDFURY_WEAPON_1:    textId2 = BOT_TEXT_WINDFURY;     break;\n+                case EARTHLIVING_WEAPON_1: textId2 = BOT_TEXT_EARTHLIVING;  break;\n+                default:                   textId2 = BOT_TEXT_NOTHING_C;    break;\n+            }\n+            specList.push_back(LocalizedNpcText(player, BOT_TEXT_SLOT_MH) + \": \" + LocalizedNpcText(player, textId1));\n+            specList.push_back(LocalizedNpcText(player, BOT_TEXT_SLOT_OH) + \": \" + LocalizedNpcText(player, textId2));\n+        }\n+\n+        std::vector<uint32> const* GetDamagingSpellsList() const override\n+        {\n+            return &Shaman_spells_damage;\n+        }\n+        std::vector<uint32> const* GetCCSpellsList() const override\n+        {\n+            return &Shaman_spells_cc;\n+        }\n+        std::vector<uint32> const* GetHealingSpellsList() const override\n+        {\n+            return &Shaman_spells_heal;\n+        }\n+        std::vector<uint32> const* GetSupportSpellsList() const override\n+        {\n+            return &Shaman_spells_support;\n+        }\n+\n+        void InitHeals() override\n+        {\n+            SpellInfo const* spellInfo;\n+            if (InitSpell(me, HEALING_WAVE_1))\n+            {\n+                spellInfo = sSpellMgr->GetSpellInfo(InitSpell(me, HEALING_WAVE_1));\n+                _heals[HEALING_WAVE_1] = me->SpellHealingBonusDone(me, spellInfo, spellInfo->Effects[0].CalcValue(me), HEAL, 0);\n+            }\n+            else\n+                _heals[HEALING_WAVE_1] = 0;\n+\n+            if (InitSpell(me, LESSER_HEALING_WAVE_1))\n+            {\n+                spellInfo = sSpellMgr->GetSpellInfo(InitSpell(me, LESSER_HEALING_WAVE_1));\n+                _heals[LESSER_HEALING_WAVE_1] = me->SpellHealingBonusDone(me, spellInfo, spellInfo->Effects[0].CalcValue(me), HEAL, 0);\n+            }\n+            else\n+                _heals[LESSER_HEALING_WAVE_1] = 0;\n+\n+            if (InitSpell(me, RIPTIDE_1))\n+            {\n+                spellInfo = sSpellMgr->GetSpellInfo(InitSpell(me, RIPTIDE_1));\n+                _heals[RIPTIDE_1] = me->SpellHealingBonusDone(me, spellInfo, spellInfo->Effects[0].CalcValue(me), HEAL, 0);\n+            }\n+            else\n+                _heals[RIPTIDE_1] = 0;\n+\n+            if (InitSpell(me, CHAIN_HEAL_1))\n+            {\n+                spellInfo = sSpellMgr->GetSpellInfo(InitSpell(me, CHAIN_HEAL_1));\n+                _heals[CHAIN_HEAL_1] = me->SpellHealingBonusDone(me, spellInfo, spellInfo->Effects[0].CalcValue(me), HEAL, 0);\n+            }\n+            else\n+                _heals[CHAIN_HEAL_1] = 0;\n+        }\n+\n+    private:\n+        //Totem system\n+        struct BotTotemParam\n+        {\n+            BotTotemParam() : _effradius(0.f) {}\n+            uint32 _type;\n+            Position _pos;\n+            float _effradius;\n+        };\n+\n+        using BotTotem = std::pair<ObjectGuid /*guid*/, BotTotemParam /*param*/>;\n+        std::array<BotTotem, MAX_TOTEMS> _totems;\n+        std::array<uint32, MAX_TOTEMS> _totemTimer;\n+        //Wolves\n+        std::array<ObjectGuid, MAX_WOLVES> _wolves;\n+        //Spells\n+        uint32 CURE_TOXINS;\n+        //Timers\n+        uint32 TotemsCheckTimer;\n+        uint32 HexyCheckTimer, EarthyCheckTimer, ShieldCheckTimer, BloodlustCheckTimer, MaelstromTimer;\n+        uint8 MaelstromCount;\n+        bool Hexy, Earthy;\n+        mutable bool maelUseUp;\n+        uint32 mhEnchantExpireTimer, ohEnchantExpireTimer;\n+        uint32 mhEnchant, ohEnchant;\n+        bool needChooseMHEnchant, needChooseOHEnchant;\n+\n+        bool canTremor;\n+\n+        using HealMap = std::unordered_map<uint32 /*baseId*/, int32 /*amount*/>;\n+        HealMap _heals;\n+\n+        uint32 _getTotemsMask(std::map<uint32 /*type*/, uint32 /*curId*/>& idMap) const\n+        {\n+            uint32 mask = 0;\n+\n+            //Blessing of Wisdom doesn't stack with Mana Spring Totem\n+            if (me->GetAuraEffect(SPELL_AURA_MOD_POWER_REGEN, SPELLFAMILY_PALADIN, 0x10000, 0x0, 0x0))\n+                mask |= BOT_TOTEM_MASK_MANA_SPRING;\n+\n+            Unit* cre;\n+            uint32 sumonSpell;\n+            uint32 baseId;\n+            bool isTotem;\n+            int8 mytype = -1;\n+            for (auto const& [_, auraApp] : me->GetAppliedAuras())\n+            {\n+                //from totem aura extract base spell it could be summoned by\n+                if (auraApp->GetBase()->GetType() != UNIT_AURA_TYPE) continue;\n+                cre = auraApp->GetBase()->GetUnitOwner();\n+                //DEBUG\n+                //uint32 base = cre->GetUInt32Value(UNIT_CREATED_BY_SPELL);\n+                //if (base)\n+                //    baseId = sSpellMgr->GetSpellInfo(base)->GetFirstRankSpell()->Id;\n+                //if (target->GetEntry() == 70025 && cre->GetGUID() != me->GetGUID())\n+                //{\n+                //    BOT_LOG_ERROR(\"spells\",\"totemMask: unit %s, %s (%u), owner %s (crSp %u, base %u), istotem %u\", target->GetName().c_str(),\n+                //        itr->second->GetBase()->GetSpellInfo()->SpellName[0], itr->second->GetBase()->GetId(),\n+                //        cre ? cre->GetName().c_str() : \"unk\", base, baseId, uint32(cre->IsTotem()));\n+                //}\n+                sumonSpell = cre ? cre->GetUInt32Value(UNIT_CREATED_BY_SPELL) : 0;\n+                if (!sumonSpell || !cre->IsTotem())\n+                    continue;\n+\n+                isTotem = true;\n+                baseId = sSpellMgr->GetSpellInfo(sumonSpell)->GetFirstRankSpell()->Id;\n+                switch (baseId)\n+                {\n+                    case FIRE_RESISTANCE_TOTEM_1:\n+                        mask |= BOT_TOTEM_MASK_RESISTANCE_FIRE;     mytype = T_WATER;   break;\n+                    case FROST_RESISTANCE_TOTEM_1:\n+                        mask |= BOT_TOTEM_MASK_RESISTANCE_FROST;    mytype = T_FIRE;    break;\n+                    case NATURE_RESISTANCE_TOTEM_1:\n+                        mask |= BOT_TOTEM_MASK_RESISTANCE_NATURE;   mytype = T_AIR;     break;\n+                    case FLAMETONGUE_TOTEM_1:\n+                        mask |= BOT_TOTEM_MASK_FLAMETONGUE;         mytype = T_FIRE;    break;\n+                    case GROUNDING_TOTEM_1: //no ranking\n+                        mask |= BOT_TOTEM_MASK_GROUNDING;           mytype = T_AIR;     break;\n+                    //case STONESKIN_TOTEM_1:\n+                    //    mask |= BOT_TOTEM_MASK_STONESKIN;           mytype = T_EARTH;   break;\n+                    case STRENGTH_OF_EARTH_TOTEM_1:\n+                        mask |= BOT_TOTEM_MASK_STRENGTH_OF_EARTH;   mytype = T_EARTH;   break;\n+                    case WINDFURY_TOTEM_1: //no ranking\n+                        mask |= BOT_TOTEM_MASK_WINDFURY;            mytype = T_AIR;     break;\n+                    case WRATH_OF_AIR_TOTEM_1: //no ranking\n+                        mask |= BOT_TOTEM_MASK_WRATH_OF_AIR;        mytype = T_AIR;     break;\n+                    case MANA_SPRING_TOTEM_1:\n+                        mask |= BOT_TOTEM_MASK_MANA_SPRING;         mytype = T_WATER;   break;\n+                    case TOTEM_OF_WRATH_1:\n+                        mask |= BOT_TOTEM_MASK_WRATH;               mytype = T_FIRE;    break;\n+                    default:\n+                        isTotem = false; //next aura\n+                        break;\n+                }\n+\n+                if (isTotem)\n+                {\n+                    idMap[baseId] = sumonSpell;\n+                    for (auto i : NPCBots::index_array<uint8, MAX_TOTEMS>)\n+                    {\n+                        if (auraApp->GetBase()->GetCasterGUID() == me->m_SummonSlot[i+1])\n+                        {\n+                            //mask |= BOT_TOTEM_MASK_MY_TOTEM;\n+                            switch (mytype)\n+                            {\n+                                case T_FIRE:    mask |= BOT_TOTEM_MASK_MY_TOTEM_FIRE;   break;\n+                                case T_EARTH:   mask |= BOT_TOTEM_MASK_MY_TOTEM_EARTH;  break;\n+                                case T_WATER:   mask |= BOT_TOTEM_MASK_MY_TOTEM_WATER;  break;\n+                                case T_AIR:     mask |= BOT_TOTEM_MASK_MY_TOTEM_AIR;    break;\n+                                default:                                                break;\n+                            }\n+                            break;\n+                        }\n+                    }\n+                }\n+            }\n+\n+            return mask;\n+        }\n+    };\n+};\n+\n+void AddSC_shaman_bot()\n+{\n+    new shaman_bot();\n+}\ndiff --git a/src/server/game/AI/NpcBots/bot_spellbreaker_ai.cpp b/src/server/game/AI/NpcBots/bot_spellbreaker_ai.cpp\nnew file mode 100644\nindex 0000000000..c80c2141d2\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bot_spellbreaker_ai.cpp\n@@ -0,0 +1,626 @@\n+#include \"bot_ai.h\"\n+#include \"bot_GridNotifiers.h\"\n+#include \"botlogtraits.h\"\n+#include \"botspell.h\"\n+#include \"Creature.h\"\n+//#include \"GridNotifiers.h\"\n+#include \"ScriptMgr.h\"\n+#include \"SpellAuraEffects.h\"\n+/*\n+Spell Breaker NpcBot (by Trickerer onlysuffering@gmail.com)\n+Description:\n+Spellbreaker (Warcraft III tribute)\n+Abilities:\n+1) Steal Magic (Spellsteal). steals a benefical spell from an enemy and applies it to a nearby ally or removes a\n+negative spell from an ally and applies it to a nearby enemy, affects magic and curse effects, 3 seconds cooldown.\n+2) Control Magic NIY (no substitute for spell)\n+3) Feedback (passive). Successful melee attacks burn target's mana equal to damage caused, dealing arcane damage\n+Complete - 67%\n+TODO:\n+*/\n+\n+enum SpellbreakerBaseSpells\n+{\n+    SPELLSTEAL_1            = SPELL_STEAL_MAGIC\n+};\n+enum SpellbreakerPassives\n+{\n+};\n+enum SpellbreakerSpecial\n+{\n+    SPELLSTEAL_COST         = 75 * 5,\n+\n+    FEEDBACK_EFFECT         = SPELL_FEEDBACK,\n+\n+    MH_ATTACK_VISUAL        = SPELL_ATTACK_MELEE_1H,\n+    SPELLSTEAL_VISUAL_1     = 34396,// Zap selfcast\n+    SPELLSTEAL_VISUAL_2     = SPELL_STEAL_MAGIC_VISUAL,\n+    ENERGY_SYPHON_ENERGIZE  = 27287 // Only for combat log spell message\n+};\n+\n+static const std::vector<uint32> Spellbreaker_spells_support{ SPELLSTEAL_1 };\n+\n+class spellbreaker_bot : public CreatureScript\n+{\n+public:\n+    spellbreaker_bot() : CreatureScript(\"spellbreaker_bot\") { }\n+\n+    CreatureAI* GetAI(Creature* creature) const override\n+    {\n+        return new spellbreaker_botAI(creature);\n+    }\n+\n+    bool OnGossipHello(Player* player, Creature* creature) override\n+    {\n+        return creature->GetBotAI()->OnGossipHello(player, 0);\n+    }\n+\n+    bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action) override\n+    {\n+        if (bot_ai* ai = creature->GetBotAI())\n+            return ai->OnGossipSelect(player, creature, sender, action);\n+        return true;\n+    }\n+\n+    bool OnGossipSelectCode(Player* player, Creature* creature, uint32 sender, uint32 action, char const* code) override\n+    {\n+        if (bot_ai* ai = creature->GetBotAI())\n+            return ai->OnGossipSelectCode(player, creature, sender, action, code);\n+        return true;\n+    }\n+\n+    struct spellbreaker_botAI : public bot_ai\n+    {\n+        spellbreaker_botAI(Creature* creature) : bot_ai(creature)\n+        {\n+            _botclass = BOT_CLASS_SPELLBREAKER;\n+\n+            InitUnitFlags();\n+\n+            //spellbreaker immunities\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_POSSESS, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_CHARM, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_SHAPESHIFT, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_TRANSFORM, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_DISARM, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_DISARM_OFFHAND, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_FEAR, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_DISARM, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_POLYMORPH, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_FEAR, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_HORROR, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_TURN, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SLEEP, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SILENCE, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SNARE, true);\n+        }\n+\n+        bool doCast(Unit* victim, uint32 spellId)\n+        {\n+            if (CheckBotCast(victim, spellId) != SPELL_CAST_OK)\n+                return false;\n+            return bot_ai::doCast(victim, spellId);\n+        }\n+\n+        void StartAttack(Unit* u, bool force = false)\n+        {\n+            if (!bot_ai::StartAttack(u, force))\n+                return;\n+            GetInPosition(force, u);\n+        }\n+\n+        void JustEngagedWith(Unit* u) override { bot_ai::JustEngagedWith(u); }\n+        void KilledUnit(Unit* u) override { bot_ai::KilledUnit(u); }\n+        void EnterEvadeMode(EvadeReason why = EVADE_REASON_OTHER) override { bot_ai::EnterEvadeMode(why); }\n+        void MoveInLineOfSight(Unit* u) override { bot_ai::MoveInLineOfSight(u); }\n+        void JustDied(Unit* u) override { /*UnsummonAll(false);*/ bot_ai::JustDied(u); }\n+        void DoNonCombatActions(uint32 /*diff*/) { }\n+\n+        void UpdateAI(uint32 diff) override\n+        {\n+            if (!GlobalUpdate(diff))\n+                return;\n+\n+            DoVehicleActions(diff);\n+            if (!CanBotAttackOnVehicle())\n+                return;\n+\n+            if (IsPotionReady())\n+            {\n+                if (me->GetPower(POWER_MANA) < SPELLSTEAL_COST)\n+                    DrinkPotion(true);\n+                else if (GetHealthPCT(me) < 50)\n+                    DrinkPotion(false);\n+            }\n+\n+            if ((me->GetVictim() || Rand() < 15) && IsSpellReady(SPELLSTEAL_1, diff))\n+                CureGroup(GetSpell(SPELLSTEAL_1), diff);\n+\n+            if (master->IsInCombat() || me->IsInCombat())\n+                CheckDispel(diff);\n+\n+            if (ProcessImmediateNonAttackTarget())\n+                return;\n+\n+            if (!CheckAttackTarget())\n+                return;\n+\n+            if (IsCasting())\n+                return;\n+\n+            CheckUsableItems(diff);\n+\n+            Attack(diff);\n+        }\n+\n+        void Attack(uint32 /*diff*/)\n+        {\n+            Unit* mytar = opponent ? opponent : disttarget ? disttarget : nullptr;\n+            if (!mytar)\n+                return;\n+\n+            StartAttack(mytar, IsMelee());\n+\n+            CheckAttackState();\n+            if (!me->IsAlive() || !mytar->IsAlive())\n+                return;\n+\n+            MoveBehind(mytar);\n+        }\n+\n+        void CheckDispel(uint32 diff)\n+        {\n+            if (!IsSpellReady(SPELLSTEAL_1, diff) || IsCasting())\n+                return;\n+\n+            Unit* target = FindHostileDispelTarget(CalcSpellMaxRange(SPELLSTEAL_1));\n+            if (target && doCast(target, GetSpell(SPELLSTEAL_1)))\n+                return;\n+\n+            SetSpellCooldown(SPELLSTEAL_1, 500); //fail\n+        }\n+\n+        void ApplyClassDamageMultiplierMelee(uint32& /*damage*/, CalcDamageInfo& damageinfo) const override\n+        {\n+            float pctbonus = 1.0f;\n+\n+            if (damageinfo.target && damageinfo.target->GetPowerType() == POWER_MANA && damageinfo.target->GetMaxPower(POWER_MANA) > 1 &&\n+                damageinfo.target->GetPower(POWER_MANA) < me->GetWeaponDamageRange(BASE_ATTACK, MAXDAMAGE))\n+            {\n+                pctbonus *= 3.f;\n+                if (_doCrit == false && urand(1,100) < 2 * GetBotCritChance())\n+                    _doCrit = true;\n+            }\n+            else if (_doCrit == true)\n+                _doCrit = false;\n+\n+            damageinfo.damages[0].damage *= pctbonus;\n+        }\n+\n+        void ApplyClassEffectMods(SpellInfo const* spellInfo, uint8 effIndex, float& value) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            float pctbonus = 1.0f;\n+\n+            //Feedback scaling: 50%\n+            if (baseId == FEEDBACK_EFFECT && effIndex == EFFECT_0)\n+                value += me->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_MAGIC) * 0.5f * me->CalculateDefaultCoefficient(spellInfo, SPELL_DIRECT_DAMAGE) * me->CalculateLevelPenalty(spellInfo);\n+\n+            value = value * pctbonus;\n+        }\n+\n+        MeleeHitOutcome GetNextAttackMeleeOutCome() const override\n+        {\n+            return _doCrit ? MELEE_HIT_CRIT : bot_ai::GetNextAttackMeleeOutCome();\n+        }\n+\n+        void OnClassSpellGo(SpellInfo const* spellInfo) override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+\n+            if (baseId == FEEDBACK_EFFECT)\n+                me->CastSpell(me, MH_ATTACK_VISUAL, true);\n+        }\n+\n+        void SpellHitTarget(Unit* wtarget, SpellInfo const* spell) override\n+        {\n+            Unit* target = wtarget->ToUnit();\n+            if (!target)\n+                return;\n+\n+            uint32 baseId = spell->GetFirstRankSpell()->Id;\n+\n+            if (baseId == SPELLSTEAL_1)\n+                ProcessSpellsteal(target);\n+\n+            OnSpellHitTarget(target, spell);\n+        }\n+\n+        void SpellHit(Unit* wcaster, SpellInfo const* spell) override\n+        {\n+            Unit* caster = wcaster->ToUnit();\n+            if (!caster)\n+                return;\n+\n+            OnSpellHit(caster, spell);\n+        }\n+\n+        void DamageDealt(Unit* victim, uint32& damage, DamageEffectType damageType, SpellSchoolMask damageSchoolMask) override\n+        {\n+            //Feedback\n+            if (damage && victim != me && damageType == DIRECT_DAMAGE)\n+            {\n+                if (victim->GetPowerType() == POWER_MANA && victim->GetMaxPower(POWER_MANA) > 1)\n+                {\n+                    if (uint32 burned = std::min<uint32>(victim->GetPower(POWER_MANA), damage + me->GetLevel() * 2))\n+                    {\n+                        int32 basepoints = int32(burned);\n+                        //reduce amount againts ex bots\n+                        if (victim->IsCreature() && victim->ToCreature()->GetBotClass() >= BOT_CLASS_EX_START)\n+                            basepoints /= 10;\n+\n+                        //CastSpellExtraArgs args(true);\n+                        //args.AddSpellBP0(basepoints);\n+                        //me->CastSpell(victim, FEEDBACK_EFFECT, args);\n+                        me->CastCustomSpell(victim, FEEDBACK_EFFECT, &basepoints, nullptr, nullptr, true);\n+                    }\n+                }\n+                else\n+                {\n+                    me->EnergizeBySpell(me, ENERGY_SYPHON_ENERGIZE, int32(damage / 4), POWER_MANA);\n+                    me->SendPlaySpellVisual(524); //mana gain visual\n+                }\n+            }\n+\n+            bot_ai::DamageDealt(victim, damage, damageType, damageSchoolMask);\n+        }\n+\n+        void DamageTaken(Unit* u, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellSchoolMask /*schoolMask*/) override\n+        {\n+            if (!u)\n+                return;\n+            if (!u->IsInCombat() && !me->IsInCombat())\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void OwnerAttackedBy(Unit* u) override\n+        {\n+            if (!u)\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void Reset() override\n+        {\n+            _doCrit = false;\n+\n+            DefaultInit();\n+        }\n+\n+        void ReduceCD(uint32 /*diff*/) override\n+        {\n+        }\n+\n+        void InitPowers() override\n+        {\n+            me->SetPowerType(POWER_MANA);\n+        }\n+\n+        void InitSpells() override\n+        {\n+            InitSpellMap(SPELLSTEAL_1, true, false);\n+        }\n+\n+        void ApplyClassPassives() const override\n+        {\n+        }\n+\n+        bool CanUseManually(uint32 basespell) const override\n+        {\n+            switch (basespell)\n+            {\n+                case SPELLSTEAL_1:\n+                    return true;\n+                default:\n+                    return false;\n+            }\n+        }\n+\n+        //std::vector<uint32> const* GetDamagingSpellsList() const override\n+        //{\n+        //    return &Spellbreaker_spells_damage;\n+        //}\n+        //std::vector<uint32> const* GetCCSpellsList() const override\n+        //{\n+        //    return &Spellbreaker_spells_cc;\n+        //}\n+        //std::vector<uint32> const* GetHealingSpellsList() const override\n+        //{\n+        //    return &Spellbreaker_spells_heal;\n+        //}\n+        std::vector<uint32> const* GetSupportSpellsList() const override\n+        {\n+            return &Spellbreaker_spells_support;\n+        }\n+\n+    private:\n+\n+        mutable bool _doCrit{};\n+\n+        void ProcessSpellsteal(Unit* target)\n+        {\n+            DispelChargesList steal_list;\n+\n+            bool const isFriend = IsInBotParty(target) || target->IsFriendlyTo(me);\n+            static const uint32 sbDispelMask  = (1u<<DISPEL_MAGIC) | (1u<<DISPEL_CURSE);\n+            static const uint8 max_dispelled = 1;\n+\n+            //BOT_LOG_ERROR(\"entities.unit\", \"ProcessSpellsteal: on %s, fr=%u\", target->GetName().c_str(), uint32(isFriend));\n+\n+            for (auto const& [_, aura] : target->GetOwnedAuras())\n+            {\n+                if (aura->IsPassive() || !(aura->GetSpellInfo()->GetDispelMask() & sbDispelMask) ||\n+                    (aura->GetSpellInfo()->AttributesEx4 & SPELL_ATTR4_CANNOT_BE_STOLEN))\n+                    continue;\n+\n+                AuraApplication const* aurApp = aura->GetApplicationOfTarget(target->GetGUID());\n+                if (!aurApp)\n+                    continue;\n+\n+                //do not dispel positive auras from enemies and negative ones from friends\n+                if (aurApp->IsPositive() == isFriend)\n+                    continue;\n+\n+                int32 chance = aura->CalcDispelChance(target, !isFriend);\n+                if (!chance)\n+                    continue;\n+                //BOT_LOG_ERROR(\"entities.unit\", \"%s\", aura->GetSpellInfo()->SpellName[0]);\n+\n+                // The charges / stack amounts don't count towards the total number of auras that can be dispelled.\n+                // Ie: A dispel on a target with 5 stacks of Winters Chill and a Polymorph has 1 / (1 + 1) -> 50% chance to dispell\n+                // Polymorph instead of 1 / (5 + 1) -> 16%.\n+                bool dispel_charges = (aura->GetSpellInfo()->AttributesEx7 & SPELL_ATTR7_DISPEL_REMOVES_CHARGES);\n+                uint8 charges = dispel_charges ? aura->GetCharges() : aura->GetStackAmount();\n+                if (charges > 0)\n+                    steal_list.emplace_back(std::make_pair(aura, charges));\n+            }\n+\n+            if (steal_list.empty())\n+                return;\n+\n+            //BOT_LOG_ERROR(\"entities.unit\", \"failcount...\");\n+\n+            size_t remaining = steal_list.size();\n+            uint32 failCount = 0;\n+            DispelChargesList success_list;\n+            //success_list.reserve(max_dispelled);\n+            WorldPacket dataFail(SMSG_DISPEL_FAILED, 8+8+4+4+max_dispelled*4);\n+            // dispel N = damage buffs (or while exist buffs for dispel)\n+            for (uint8 count = 0; count < max_dispelled && remaining > 0;)\n+            {\n+                // Random select buff for dispel\n+                DispelChargesList::iterator itr = steal_list.begin();\n+                std::advance(itr, urand(0, steal_list.size() - 1));\n+\n+                //int32 chance = itr->RollDispel();//itr->first->CalcDispelChance(target, !isFriend);\n+                // 2.4.3 Patch Notes: \"Dispel effects will no longer attempt to remove effects that have 100% dispel resistance.\"\n+                //if (!chance)\n+                //{\n+                //    steal_list.erase(itr);\n+                //    continue;\n+                //}\n+                //else\n+                int32 chance = itr->first->CalcDispelChance(target, !target->IsFriendlyTo(me));\n+                if (!chance)\n+                {\n+                    steal_list.erase(itr);\n+                    continue;\n+                }\n+                else\n+                {\n+                    if (roll_chance_i(chance))\n+                    {\n+                        bool alreadyListed = false;\n+                        for (DispelChargesList::iterator successItr = success_list.begin(); successItr != success_list.end(); ++successItr)\n+                        {\n+                            if (successItr->first->GetId() == itr->first->GetId())\n+                            {\n+                                ++successItr->second;\n+                                alreadyListed = true;\n+                            }\n+                        }\n+                        if (!alreadyListed)\n+                            success_list.push_back(std::make_pair(itr->first, 1));\n+                        --itr->second;\n+                        if (itr->second <= 0)\n+                            steal_list.erase(itr);\n+                    }\n+                    else\n+                    {\n+                        if (!failCount)\n+                        {\n+                            // Failed to dispell\n+                            dataFail << me->GetGUID();                          // Caster GUID\n+                            dataFail << target->GetGUID();                      // Victim GUID\n+                            dataFail << uint32(SPELLSTEAL_1);                   // dispel spell id\n+                        }\n+                        ++failCount;\n+                        dataFail << uint32(itr->first->GetId());                // Spell Id\n+                    }\n+                    ++count;\n+                }\n+            }\n+\n+            if (failCount)\n+                me->SendMessageToSet(&dataFail, true);\n+\n+            if (success_list.empty())\n+                return;\n+\n+            //BOT_LOG_ERROR(\"entities.unit\", \"logs and auras\");\n+\n+            WorldPacket dataSuccess(SMSG_SPELLSTEALLOG, 8+8+4+1+4+max_dispelled*5);\n+            dataSuccess << target->GetPackGUID();           // Victim GUID\n+            dataSuccess << me->GetPackGUID();               // Caster GUID\n+            dataSuccess << uint32(SPELLSTEAL_1);            // dispel spell id\n+            dataSuccess << uint8(0);                        // not used\n+            dataSuccess << uint32(success_list.size());     // count\n+\n+            Unit* randomTarget = nullptr;\n+\n+            std::list<Unit*> targets;\n+\n+            if (isFriend) //negative spell from friend to enemy\n+            {\n+                GetNearbyTargetsList(targets, 50, 0);\n+                if (Unit* u = me->GetVictim())\n+                {\n+                    if (!u->GetVictim() && me->IsWithinDistInMap(u, 50) && !me->IsFriendlyTo(u) &&\n+                        me->IsValidAttackTarget(u) && u->GetCreatureType() != CREATURE_TYPE_CRITTER && !u->IsTotem() &&\n+                        me->CanSeeOrDetect(u))\n+                        targets.push_back(u);\n+                }\n+                //Bcore::AnyUnfriendlyAttackableVisibleUnitInObjectRangeCheck check(me, 50.f);\n+                //Bcore::UnitListSearcher<Bcore::AnyUnfriendlyAttackableVisibleUnitInObjectRangeCheck> searcher(me, targets, check);\n+                //me->VisitNearbyObject(50.f, searcher);\n+            }\n+            else\n+            {\n+                GetNearbyFriendlyTargetsList(targets, 50); //not self\n+                targets.push_back(me); //add self\n+            }\n+\n+            if (!targets.empty())\n+            {\n+                //if target has stealed aura we should skip him if possible\n+                std::list<Unit*> targetsCopy = targets;\n+                std::erase_if(targets, BOTAI_PRED::AuraedTargetExclude(success_list.front().first->GetId()));\n+\n+                randomTarget = Bcore::Containers::SelectRandomContainerElement(!targets.empty() ? targets : targetsCopy);\n+            }\n+\n+            for (auto const& [daura, _] : success_list)\n+            {\n+                Aura const* aura = daura;\n+                dataSuccess << uint32(aura->GetId());          // Spell Id\n+                dataSuccess << uint8(0);                    // 0 - steals !=0 transfers\n+\n+                if (randomTarget)\n+                {\n+                    //target->RemoveAurasDueToSpellBySteal(itr->first, itr->second, randomTarget);\n+                    TransferAura(aura->GetId(), aura->GetCasterGUID(), target, randomTarget);\n+                    randomTarget->CastSpell(randomTarget, SPELLSTEAL_VISUAL_1, true);\n+                }\n+                else\n+                    target->RemoveAurasDueToSpellByDispel(aura->GetId(), SPELLSTEAL_1, aura->GetCasterGUID(), me, uint8(-1));\n+            }\n+            me->CastSpell(target, SPELLSTEAL_VISUAL_2, true);\n+\n+            me->SendMessageToSet(&dataSuccess, true);\n+        }\n+\n+        void TransferAura(uint32 spellId, ObjectGuid casterGUID, Unit* target, Unit* newTarget)\n+        {\n+            //Copied from Unit::RemoveAurasDueToSpellBySteal with modifications\n+            Unit::AuraMapBoundsNonConst range = target->GetOwnedAuras().equal_range(spellId);\n+            for (Unit::AuraMap::iterator iter = range.first; iter != range.second;)\n+            {\n+                Aura* aura = iter->second;\n+                if (aura->GetCasterGUID() == casterGUID)\n+                {\n+                    int32 damage[MAX_SPELL_EFFECTS];\n+                    int32 baseDamage[MAX_SPELL_EFFECTS];\n+                    uint8 effMask = 0;\n+                    uint8 recalculateMask = 0;\n+                    Unit* caster = aura->GetCaster();\n+                    for (auto i : NPCBots::index_array<uint8, MAX_SPELL_EFFECTS>)\n+                    {\n+                        if (aura->GetEffect(i))\n+                        {\n+                            baseDamage[i] = aura->GetEffect(i)->GetBaseAmount();\n+                            damage[i] = aura->GetEffect(i)->GetAmount();\n+                            effMask |= (1u<<i);\n+                            if (aura->GetEffect(i)->CanBeRecalculated())\n+                                recalculateMask |= (1u<<i);\n+                        }\n+                        else\n+                        {\n+                            baseDamage[i] = 0;\n+                            damage[i] = 0;\n+                        }\n+                    }\n+\n+                    bool stealCharge = (aura->GetSpellInfo()->AttributesEx7 & SPELL_ATTR7_DISPEL_REMOVES_CHARGES);\n+                    // Limit max duration to 5 minutes\n+                    int32 dur = std::min<int32>(int32(5 * MINUTE * IN_MILLISECONDS), aura->GetDuration());\n+                    // But at least for 5 seconds\n+                    dur = std::max<int32>(dur, 5 * IN_MILLISECONDS);\n+\n+                    if (Aura* oldAura = newTarget->GetAura(aura->GetId(), aura->GetCasterGUID()))\n+                    {\n+                        if (stealCharge)\n+                            oldAura->ModCharges(aura->GetCharges());\n+                        else\n+                            oldAura->ModStackAmount(aura->GetStackAmount());\n+                        oldAura->SetDuration(dur);\n+                    }\n+                    else\n+                    {\n+                        // single target state must be removed before aura creation to preserve existing single target aura\n+                        if (aura->IsSingleTarget())\n+                            aura->UnregisterSingleTarget();\n+\n+                        //AuraCreateInfo createInfo(aura->GetSpellInfo(), effMask, newTarget);\n+                        //createInfo.SetCasterGUID(aura->GetCasterGUID());\n+                        //createInfo.SetBaseAmount(baseDamage);\n+                        ////Auras created by scripts may have no caster, prevent crash in Aura::TryRefreshStackOrCreate()\n+                        //if (!createInfo.CasterGUID)\n+                        //    createInfo.SetCasterGUID(me->GetGUID());\n+                        //if (Aura* newAura = Aura::TryRefreshStackOrCreate(createInfo))\n+                        //{\n+                        //    // created aura must not be single target aura,, so stealer won't loose it on recast\n+                        //    if (newAura->IsSingleTarget())\n+                        //    {\n+                        //        newAura->UnregisterSingleTarget();\n+                        //        aura->SetIsSingleTarget(true);\n+                        //        caster->GetSingleCastAuras().push_back(aura);\n+                        //    }\n+                        //    newAura->SetLoadedState(aura->GetMaxDuration(), dur, aura->GetCharges(), aura->GetStackAmount(), recalculateMask, aura->GetCritChance(), aura->CanApplyResilience(), &damage[0]);\n+                        //    newAura->ApplyForTargets();\n+                        //}\n+\n+                        Aura* curAura = newTarget->GetAura(aura->GetId());\n+                        if (!curAura || (!curAura->IsPermanent() && curAura->GetDuration() < (int32)dur))\n+                        {\n+                            if (Aura* newAura = Aura::TryRefreshStackOrCreate(aura->GetSpellInfo(), effMask, newTarget, nullptr, &baseDamage[0], nullptr, aura->GetCasterGUID()))\n+                            {\n+                                // created aura must not be single target aura,, so stealer won't loose it on recast\n+                                if (newAura->IsSingleTarget())\n+                                {\n+                                    newAura->UnregisterSingleTarget();\n+                                    // bring back single target aura status to the old aura\n+                                    aura->SetIsSingleTarget(true);\n+                                    caster->GetSingleCastAuras().push_back(aura);\n+                                }\n+                                // FIXME: using aura->GetMaxDuration() maybe not blizzlike but it fixes stealing of spells like Innervate\n+                                newAura->SetLoadedState(aura->GetMaxDuration(), int32(dur), stealCharge ? 1 : aura->GetCharges(), 1, recalculateMask, &damage[0]);\n+                                newAura->ApplyForTargets();\n+                            }\n+                        }\n+                    }\n+\n+                    aura->Remove(AURA_REMOVE_BY_ENEMY_SPELL);\n+                    return;\n+                }\n+                else\n+                    ++iter;\n+            }\n+        }\n+    };\n+};\n+\n+void AddSC_spellbreaker_bot()\n+{\n+    new spellbreaker_bot();\n+}\ndiff --git a/src/server/game/AI/NpcBots/bot_sphynx_ai.cpp b/src/server/game/AI/NpcBots/bot_sphynx_ai.cpp\nnew file mode 100644\nindex 0000000000..e1d10f1de9\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bot_sphynx_ai.cpp\n@@ -0,0 +1,559 @@\n+#include \"bot_ai.h\"\n+#include \"bot_GridNotifiers.h\"\n+#include \"botmgr.h\"\n+#include \"botspell.h\"\n+#include \"bottraits.h\"\n+#include \"Creature.h\"\n+#include \"ScriptMgr.h\"\n+/*\n+Obsidian Destroyer NpcBot (by Trickerer onlysuffering@gmail.com)\n+Description:\n+Obsidian winged monstrocity with unsatable hunger for magic (Warcraft III tribute)\n+Specifics:\n+High armor, very high resistances, partially immune to magic, negative mana regeneration (-2%/sec, cannot be changed),\n+any armor, dual-wielding wands, no physical attack, spellpower = 50% attack power + 200% intellect\n+Abilities:\n+1) Devour Magic: dispel up to 2 magic effects from enemies, up to 2 magic effects and up to 2 curses from allies\n+and damaging summoned units in 20 yards area, every dispelled effect restores 20% mana and 5% health, 7 seconds cooldown\n+2) Shadow Bolt: main attack, single target, no mana cost\n+3) Shadow Blast: 125 mana empowered attack, splash damage (6.25% of base mana)\n+4) Shadow Armor (passive, custom): restores mana equal to a percentage of damage taken\n+5) Drain Mana: leech all mana from a friendly target (up to 100% of od's max mana)\n+6) Replenish Mana: restores 2% of max mana to up to 10 surrounding allies within 25yds at cost of all mana\n+7) Replenish Life: restores 3% of max hp to up to 10 surrounding allies within 25yds at cost of all mana\n+Complete - 100%\n+TODO:\n+*/\n+\n+enum SphynxBaseSpells\n+{\n+    MAIN_ATTACK_1           = SPELL_SHADOW_BOLT1,\n+    SPLASH_ATTACK_1         = SPELL_SHADOW_BLAST,\n+    DEVOUR_MAGIC_1          = SPELL_DEVOUR_MAGIC,\n+    DRAIN_MANA_1            = SPELL_DRAIN_MANA,\n+\n+    REPLENISH_MANA_1        = SPELL_REPLENISH_MANA,\n+    REPLENISH_HEALTH_1      = SPELL_REPLENISH_HEALTH\n+};\n+enum SphynxPassives\n+{\n+};\n+enum SphynxSpecial\n+{\n+    MH_ATTACK_ANIM          = SPELL_ATTACK_MELEE_1H,\n+    MH_OH_ATTACK_ANIM       = SPELL_ATTACK_MELEE_RANDOM,\n+    SPELL_ENERGIZE          = 34424,//\"Shadow Armor\"\n+\n+    SPLASH_ATTACK_COST      = BASE_MANA_SPHYNX/16//6.25%\n+};\n+\n+static const std::vector<uint32> Sphynx_spells_damage{ /*MAIN_ATTACK_1, */SPLASH_ATTACK_1 };\n+static const std::vector<uint32> Sphynx_spells_heal{ REPLENISH_HEALTH_1 };\n+static const std::vector<uint32> Sphynx_spells_support{ DEVOUR_MAGIC_1, /*DRAIN_MANA_1, */REPLENISH_HEALTH_1, REPLENISH_MANA_1 };\n+\n+class sphynx_bot : public CreatureScript\n+{\n+public:\n+    sphynx_bot() : CreatureScript(\"sphynx_bot\") { }\n+\n+    CreatureAI* GetAI(Creature* creature) const override\n+    {\n+        return new sphynx_botAI(creature);\n+    }\n+\n+    bool OnGossipHello(Player* player, Creature* creature) override\n+    {\n+        return creature->GetBotAI()->OnGossipHello(player, 0);\n+    }\n+\n+    bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action) override\n+    {\n+        if (bot_ai* ai = creature->GetBotAI())\n+            return ai->OnGossipSelect(player, creature, sender, action);\n+        return true;\n+    }\n+\n+    bool OnGossipSelectCode(Player* player, Creature* creature, uint32 sender, uint32 action, char const* code) override\n+    {\n+        if (bot_ai* ai = creature->GetBotAI())\n+            return ai->OnGossipSelectCode(player, creature, sender, action, code);\n+        return true;\n+    }\n+\n+    struct sphynx_botAI : public bot_ai\n+    {\n+        sphynx_botAI(Creature* creature) : bot_ai(creature)\n+        {\n+            _botclass = BOT_CLASS_SPHYNX;\n+\n+            InitUnitFlags();\n+\n+            //sphynx immunities\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_POSSESS, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_CHARM, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_SILENCE, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_SHAPESHIFT, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_TRANSFORM, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_BLOCK_SPELL_FAMILY, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_DISARM, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_DISARM_OFFHAND, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_FEAR, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_DISARM, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_BLEED, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_POLYMORPH, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_INFECTED, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_INTERRUPT, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_FEAR, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_HORROR, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_TURN, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SLEEP, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SILENCE, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SNARE, true);\n+            me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK, true);\n+            me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK_DEST, true);\n+        }\n+\n+        bool doCast(Unit* victim, uint32 spellId, bool triggered = false)\n+        {\n+            if (CheckBotCast(victim, spellId) != SPELL_CAST_OK)\n+                return false;\n+            return bot_ai::doCast(victim, spellId, triggered);\n+        }\n+\n+        void StartAttack(Unit* u, bool force = false)\n+        {\n+            if (!bot_ai::StartAttack(u, force))\n+                return;\n+            GetInPosition(force, u);\n+        }\n+\n+        void JustEngagedWith(Unit* u) override { dmgReceived = 0; DraincheckTimer = 2000; bot_ai::JustEngagedWith(u); }\n+        void KilledUnit(Unit* u) override { bot_ai::KilledUnit(u); }\n+        void EnterEvadeMode(EvadeReason why = EVADE_REASON_OTHER) override { bot_ai::EnterEvadeMode(why); }\n+        void MoveInLineOfSight(Unit* u) override { bot_ai::MoveInLineOfSight(u); }\n+        void JustDied(Unit* u) override { dmgReceived = 0; bot_ai::JustDied(u); }\n+        void DoNonCombatActions(uint32 /*diff*/) { }\n+\n+        void UpdateAI(uint32 diff) override\n+        {\n+            if (!GlobalUpdate(diff))\n+                return;\n+\n+            DoVehicleActions(diff);\n+            if (!CanBotAttackOnVehicle())\n+                return;\n+\n+            CheckDevourMagic(diff);\n+\n+            if (IsSpellReady(DEVOUR_MAGIC_1, diff))\n+                CureGroup(DEVOUR_MAGIC_1, diff);\n+\n+            //if (!me->IsInCombat())\n+            //    DoNonCombatActions(diff);\n+\n+            if (IsCasting())\n+                return;\n+\n+            CheckReplenishHealth(diff);\n+            CheckReplenishMana(diff);\n+\n+            if (ProcessImmediateNonAttackTarget())\n+                return;\n+\n+            if (!CheckAttackTarget())\n+                return;\n+\n+            CheckUsableItems(diff);\n+\n+            Attack(diff);\n+        }\n+\n+        void Attack(uint32 diff)\n+        {\n+            Unit* mytar = opponent ? opponent : disttarget ? disttarget : nullptr;\n+            if (!mytar)\n+                return;\n+\n+            StartAttack(mytar, IsMelee());\n+\n+            CheckAttackState();\n+            if (!me->IsAlive() || !mytar->IsAlive())\n+                return;\n+\n+            CheckDrainMana(diff);\n+\n+            MoveBehind(mytar);\n+\n+            if (!HasRole(BOT_ROLE_DPS))\n+                return;\n+\n+            if (GC_Timer > diff)\n+                return;\n+\n+            if (me->GetDistance(mytar) > 30)\n+                return;\n+\n+            if (me->isMoving() && !me->HasInArc(float(M_PI)/2, mytar))\n+                return;\n+\n+            if (!CanAffectVictimAny(mytar, SPELL_SCHOOL_SHADOW, SPELL_SCHOOL_ARCANE))\n+                return;\n+\n+            if (me->GetPower(POWER_MANA) >= SPLASH_ATTACK_COST && IsSpellReady(SPLASH_ATTACK_1, diff))\n+            {\n+                if (doCast(mytar, GetSpell(SPLASH_ATTACK_1)))\n+                    return;\n+            }\n+            else if (IsSpellReady(MAIN_ATTACK_1, diff))\n+            {\n+                if (doCast(mytar, GetSpell(MAIN_ATTACK_1)))\n+                    return;\n+            }\n+        }\n+\n+        void CheckDevourMagic(uint32 diff)\n+        {\n+            if (DevourcheckTimer > diff || !IsSpellReady(DEVOUR_MAGIC_1, diff, false) || IsCasting() ||\n+                (GetHealthPCT(me) > 75 && Rand() > 15 &&\n+                (!HasRole(BOT_ROLE_DPS) || me->GetPower(POWER_MANA) >= SPLASH_ATTACK_COST * 6)))\n+                return;\n+\n+            DevourcheckTimer = urand(350, 700);\n+\n+            Unit* target = FindHostileDispelTarget(40);\n+            if (target && doCast(target, GetSpell(DEVOUR_MAGIC_1)))\n+                return;\n+        }\n+\n+        void CheckDrainMana(uint32 diff)\n+        {\n+            if (DraincheckTimer > diff || Rand() > 40 || IAmFree() || !HasRole(BOT_ROLE_DPS) || IsCasting() ||\n+                !IsSpellReady(DRAIN_MANA_1, diff, false) || me->GetPower(POWER_MANA) >= SPLASH_ATTACK_COST)\n+                return;\n+\n+            DraincheckTimer = urand(750, 1500);\n+\n+            std::list<Unit*> targets;\n+            GetNearbyFriendlyTargetsList(targets, 40);\n+            std::erase_if(targets, BOTAI_PRED::DrainTargetExclude());\n+\n+            if (targets.empty())\n+                return;\n+\n+            Unit* target = Bcore::Containers::SelectRandomContainerElement(targets);\n+            if (doCast(target, GetSpell(DRAIN_MANA_1)))\n+                return;\n+        }\n+\n+        void CheckReplenishHealth(uint32 diff)\n+        {\n+            if (ReplHealthcheckTimer > diff || !IsSpellReady(REPLENISH_HEALTH_1, diff) || IAmFree() ||\n+                !HasRole(BOT_ROLE_HEAL) || IsCasting() ||\n+                (HasRole(BOT_ROLE_DPS) && me->GetPower(POWER_MANA) > 0))\n+                return;\n+\n+            ReplHealthcheckTimer = 1000;\n+\n+            Group const* gr = master->GetGroup();\n+            if (!gr)\n+                return;\n+\n+            bool haveHp = false;\n+            uint8 partycombat = 0, partynocombat = 0;\n+            for (Unit const* member : BotMgr::GetAllGroupMembers(gr))\n+            {\n+                if (me->GetMap() == member->FindMap())\n+                {\n+                    if (member->IsInCombat())\n+                        partycombat++;\n+                    else if (member->IsAlive())\n+                        partynocombat++;\n+\n+                    if (!haveHp && member->IsAlive() && me->GetDistance(member) < 15 && GetHealthPCT(member) < 95)\n+                        haveHp = true;\n+                }\n+            }\n+\n+            if (haveHp && (!me->IsInCombat() || partycombat > partynocombat) &&\n+                doCast(me, GetSpell(REPLENISH_HEALTH_1)))\n+                return;\n+        }\n+\n+        void CheckReplenishMana(uint32 diff)\n+        {\n+            if (ReplManacheckTimer > diff || !IsSpellReady(REPLENISH_MANA_1, diff) || IAmFree() || IsCasting() ||\n+                (HasRole(BOT_ROLE_DPS) && me->GetPower(POWER_MANA) > 0))\n+                return;\n+\n+            ReplManacheckTimer = 1000;\n+\n+            Group const* gr = master->GetGroup();\n+            if (!gr)\n+                return;\n+\n+            bool haveMana = false;\n+            uint8 partycombat = 0, partynocombat = 0;\n+            for (Unit const* member : BotMgr::GetAllGroupMembers(gr))\n+            {\n+                if (me->GetMap() == member->FindMap())\n+                {\n+                    if (member->IsInCombat())\n+                        partycombat++;\n+                    else if (member->IsAlive())\n+                        partynocombat++;\n+\n+                    if (!haveMana && member->IsAlive() && me->GetDistance(member) < 15 && GetManaPCT(member) < 95 &&\n+                        !(member->IsNPCBot() && member->ToCreature()->GetBotClass() == BOT_CLASS_SPHYNX))\n+                        haveMana = true;\n+                }\n+            }\n+\n+            if (haveMana && (!me->IsInCombat() || partycombat > partynocombat) &&\n+                doCast(me, GetSpell(REPLENISH_MANA_1)))\n+                return;\n+        }\n+\n+        void ApplyClassDamageMultiplierSpell(int32& damage, SpellNonMeleeDamage& /*damageinfo*/, SpellInfo const* /*spellInfo*/, WeaponAttackType /*attackType*/, bool iscrit) const override\n+        {\n+            //uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //uint8 lvl = me->getLevel();\n+            float fdamage = float(damage);\n+\n+            //apply bonus damage mods\n+            float pctbonus = 1.0f;\n+            if (iscrit)\n+                pctbonus *= 1.333f;\n+\n+            damage = int32(fdamage * pctbonus);\n+        }\n+\n+        void OnClassSpellGo(SpellInfo const* spellInfo) override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+\n+            if (baseId == MAIN_ATTACK_1 || baseId == SPLASH_ATTACK_1 || baseId == DEVOUR_MAGIC_1 ||\n+                baseId == DRAIN_MANA_1 || baseId == REPLENISH_MANA_1 || baseId == REPLENISH_HEALTH_1)\n+                GC_Timer = uint32(me->GetAttackTime(BASE_ATTACK) * me->m_modAttackSpeedPct[BASE_ATTACK]);\n+\n+            if (baseId == SPLASH_ATTACK_1)\n+                me->CastSpell(me, MH_ATTACK_ANIM, true);\n+            else if (baseId == MAIN_ATTACK_1)\n+                me->CastSpell(me, MH_OH_ATTACK_ANIM, true);\n+\n+            if (baseId == DEVOUR_MAGIC_1)\n+            {\n+                me->CastSpell(me, MH_OH_ATTACK_ANIM, true);\n+\n+                if (dispelsDealt > 0)\n+                {\n+                    //gain 20% of max mana and 5% of max health for every dispel\n+                    int32 manaGain = me->GetMaxPower(POWER_MANA) / 5 * dispelsDealt;\n+                    uint32 healthGain = me->GetMaxHealth() / 20 * dispelsDealt;\n+\n+                    HealInfo hinfo(me, me, healthGain, spellInfo, spellInfo->GetSchoolMask());\n+\n+                    me->EnergizeBySpell(me, DEVOUR_MAGIC_1, manaGain, POWER_MANA);\n+                    me->HealBySpell(hinfo);\n+\n+                    me->CastSpell(me, SPELL_DEVOUR_MAGIC_CASTER_IMPACT, true);\n+                }\n+\n+                dispelsDealt = 0;\n+            }\n+\n+            if (baseId == DRAIN_MANA_1)\n+                me->CastSpell(me, MH_OH_ATTACK_ANIM, true);\n+\n+            if (baseId == REPLENISH_MANA_1)\n+                me->SendPlaySpellVisual(425); //arcane cast omni\n+            if (baseId == REPLENISH_HEALTH_1)\n+                me->SendPlaySpellVisual(21); //empty cast finish anim\n+\n+            if (baseId == REPLENISH_MANA_1 || baseId == REPLENISH_HEALTH_1)\n+                me->SetPower(POWER_MANA, 0);\n+        }\n+\n+        void SpellHitTarget(Unit* wtarget, SpellInfo const* spell) override\n+        {\n+            Unit* target = wtarget->ToUnit();\n+            if (!target)\n+                return;\n+\n+            uint32 spellId = spell->Id;\n+            if (blastVisualTimer < GetLastDiff() && spellId == SPLASH_ATTACK_1)\n+            {\n+                blastVisualTimer = 500;\n+                me->CastSpell(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), SHADOWFURY_VISUAL, true);\n+            }\n+            //Devour Magic: damage to summons\n+            if (spellId == DEVOUR_MAGIC_1 && target->IsSummon() && target->GetUInt32Value(UNIT_CREATED_BY_SPELL) &&\n+                !target->IsTotem() && me->GetReactionTo(target) <= REP_NEUTRAL)\n+            {\n+                SpellInfo const* devInfo = AssertBotSpellInfoOverride(spellId);\n+                uint32 damage = std::min<uint32>(target->GetMaxHealth() / 2, me->GetMaxHealth() / 5 + me->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_MAGIC));\n+                Unit::DealDamage(me, target, damage, nullptr, SPELL_DIRECT_DAMAGE, devInfo->GetSchoolMask(), devInfo);\n+                OnBotDispelDealt(target, 1);\n+            }\n+\n+            if (spellId == DRAIN_MANA_1)\n+            {\n+                me->CastSpell(target, SPELL_DEVOUR_MAGIC_BEAM, true);\n+                target->SendPlaySpellVisual(419); //drain impact visual\n+            }\n+            if (spellId == REPLENISH_MANA_1)\n+                if (target != me)\n+                    target->SendPlaySpellVisual(524/*436*/); //mana gain visual//heal bigger crimson ish\n+\n+            OnSpellHitTarget(target, spell);\n+        }\n+\n+        void SpellHit(Unit* wcaster, SpellInfo const* spell) override\n+        {\n+            Unit* caster = wcaster->ToUnit();\n+            if (!caster)\n+                return;\n+\n+            OnSpellHit(caster, spell);\n+        }\n+\n+        void OnBotDispelDealt(Unit* dispelled, uint8 num) override\n+        {\n+            //cast drain visual on dispelled\n+            if (me != dispelled)\n+            {\n+                me->CastSpell(dispelled, SPELL_DEVOUR_MAGIC_BEAM, true);\n+                dispelled->SendPlaySpellVisual(357/*317*/); //purge visual\n+            }\n+\n+            dispelsDealt += num;\n+        }\n+\n+        void DamageDealt(Unit* victim, uint32& damage, DamageEffectType damageType, SpellSchoolMask damageSchoolMask) override\n+        {\n+            bot_ai::DamageDealt(victim, damage, damageType, damageSchoolMask);\n+        }\n+\n+        void DamageTaken(Unit* u, uint32& damage, DamageEffectType /*damageType*/, SpellSchoolMask /*schoolMask*/) override\n+        {\n+            if (damage)\n+            {\n+                dmgReceived += damage / 10;\n+                uint32 energizeThreshold = me->GetMaxPower(POWER_MANA) / 10;\n+\n+                int32 manaGain = 0;\n+                while (dmgReceived >= energizeThreshold)\n+                {\n+                    manaGain += energizeThreshold;\n+                    dmgReceived -= energizeThreshold;\n+                }\n+                if (manaGain)\n+                    me->EnergizeBySpell(me, SPELL_ENERGIZE, manaGain, POWER_MANA);\n+            }\n+\n+            if (!u)\n+                return;\n+            if (!u->IsInCombat() && !me->IsInCombat())\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void OwnerAttackedBy(Unit* u) override\n+        {\n+            if (!u)\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void CheckAttackState() override\n+        {\n+        }\n+\n+        void Reset() override\n+        {\n+            blastVisualTimer = 0;\n+            DevourcheckTimer = 0;\n+            DraincheckTimer = 0;\n+            ReplManacheckTimer = 0;\n+            ReplHealthcheckTimer = 0;\n+\n+            dmgReceived = 0;\n+            dispelsDealt = 0;\n+\n+            DefaultInit();\n+\n+            me->SetPower(POWER_MANA, 0);\n+        }\n+\n+        void ReduceCD(uint32 diff) override\n+        {\n+            if (blastVisualTimer > diff)            blastVisualTimer -= diff;\n+            if (DevourcheckTimer > diff)            DevourcheckTimer -= diff;\n+            if (DraincheckTimer > diff)             DraincheckTimer -= diff;\n+            if (ReplManacheckTimer > diff)          ReplManacheckTimer -= diff;\n+            if (ReplHealthcheckTimer > diff)        ReplHealthcheckTimer -= diff;\n+        }\n+\n+        void InitPowers() override\n+        {\n+            me->SetPowerType(POWER_MANA);\n+        }\n+\n+        void InitSpells() override\n+        {\n+            InitSpellMap(MAIN_ATTACK_1, true, false);\n+            InitSpellMap(SPLASH_ATTACK_1, true, false);\n+            InitSpellMap(DEVOUR_MAGIC_1, true, false);\n+            InitSpellMap(DRAIN_MANA_1, true, false);\n+\n+            InitSpellMap(REPLENISH_MANA_1, true, false);\n+            InitSpellMap(REPLENISH_HEALTH_1, true, false);\n+        }\n+\n+        void ApplyClassPassives() const override\n+        {\n+        }\n+\n+        bool CanUseManually(uint32 basespell) const override\n+        {\n+            switch (basespell)\n+            {\n+                case DEVOUR_MAGIC_1:\n+                case DRAIN_MANA_1:\n+                case REPLENISH_MANA_1:\n+                case REPLENISH_HEALTH_1:\n+                    return true;\n+                default:\n+                    return false;\n+            }\n+        }\n+\n+        std::vector<uint32> const* GetDamagingSpellsList() const override\n+        {\n+            return &Sphynx_spells_damage;\n+        }\n+        //std::vector<uint32> const* GetCCSpellsList() const override\n+        //{\n+        //    return &Sphynx_spells_cc;\n+        //}\n+        std::vector<uint32> const* GetHealingSpellsList() const override\n+        {\n+            return &Sphynx_spells_heal;\n+        }\n+        std::vector<uint32> const* GetSupportSpellsList() const override\n+        {\n+            return &Sphynx_spells_support;\n+        }\n+\n+    private:\n+        uint32 blastVisualTimer;\n+        uint32 DevourcheckTimer, DraincheckTimer, ReplManacheckTimer, ReplHealthcheckTimer;\n+\n+        uint32 dmgReceived;\n+        uint8 dispelsDealt;\n+    };\n+};\n+\n+void AddSC_sphynx_bot()\n+{\n+    new sphynx_bot();\n+}\ndiff --git a/src/server/game/AI/NpcBots/bot_warlock_ai.cpp b/src/server/game/AI/NpcBots/bot_warlock_ai.cpp\nnew file mode 100644\nindex 0000000000..3f51d9576e\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bot_warlock_ai.cpp\n@@ -0,0 +1,2120 @@\n+#include \"bot_ai.h\"\n+#include \"botlogtraits.h\"\n+#include \"botmgr.h\"\n+#include \"botspell.h\"\n+#include \"bottraits.h\"\n+#include \"Group.h\"\n+#include \"Log.h\"\n+#include \"Map.h\"\n+#include \"MotionMaster.h\"\n+#include \"Player.h\"\n+#include \"ScriptMgr.h\"\n+#include \"Spell.h\"\n+#include \"SpellAuraEffects.h\"\n+#include \"SpellMgr.h\"\n+#include \"TemporarySummon.h\"\n+#include \"World.h\"\n+/*\n+Warlock NpcBot (reworked by Trickerer onlysuffering@gmail.com)\n+Complete - 85%\n+TODO: rituals (not directly feasable), demonic circle, demonic empowerment, demonic pact, health funnel, healthstones for bots, etc...\n+*/\n+\n+enum WarlockBaseSpells\n+{\n+    CURSE_OF_WEAKNESS_1                 = 702,\n+    CURSE_OF_AGONY_1                    = 980,\n+    CURSE_OF_TONGUES_1                  = 1714,\n+    CURSE_OF_EXHAUSTION_1               = 18223,\n+    CURSE_OF_THE_ELEMENTS_1             = 1490,\n+    CURSE_OF_DOOM_1                     = 603,//NI\n+    SHADOW_BOLT_1                       = 686,\n+    IMMOLATE_1                          = 348,\n+    CORRUPTION_1                        = 172,\n+    SEED_OF_CORRUPTION_1                = 27243,\n+    INCINERATE_1                        = 29722,\n+    SEARING_PAIN_1                      = 5676,\n+    SHADOWBURN_1                        = 17877,\n+    CONFLAGRATE_1                       = 17962,\n+    SOUL_FIRE_1                         = 6353,\n+    CHAOS_BOLT_1                        = 50796,\n+    RAIN_OF_FIRE_1                      = 5740,\n+    HELLFIRE_1                          = 1949,\n+    SHADOWFLAME_1                       = 47897,\n+    SHADOWFURY_1                        = 30283,\n+    HAUNT_1                             = 48181,\n+    UNSTABLE_AFFLICTION_1               = 30108,\n+    FEAR_1                              = 5782,\n+    HOWL_OF_TERROR_1                    = 5484,\n+    DEATH_COIL_1                        = 6789,\n+    SOULSHATTER_1                       = 29858,\n+\n+    DRAIN_SOUL_1                        = 1120,\n+    DRAIN_MANA_1                        = 5138,\n+    BANISH_1                            = 710,\n+\n+    DEMON_SKIN_1                        = 687,\n+    DEMON_ARMOR_1                       = 706,\n+    FEL_ARMOR_1                         = 28176,\n+    DETECT_INVISIBILITY_1               = 132,\n+    UNENDING_BREATH_1                   = 5697,\n+    SHADOW_WARD_1                       = 6229,\n+    LIFE_TAP_1                          = 1454,\n+    DARK_PACT_1                         = 18220,\n+\n+    CREATE_HEALTHSTONE_1                = 6201,\n+    CREATE_SOULSTONE_1                  = 693,\n+\n+    CHAOTIC_MIND                        = 61188, //8 sec duration, no cd\n+\n+    RITUAL_OF_SUMMONING_1               = 698,\n+    RITUAL_OF_SOULS_1                   = 29893\n+};\n+enum WarlockPassives\n+{\n+    IMPROVED_SHADOW_BOLT                = 17803,//rank 5\n+    IMPROVED_DRAIN_SOUL                 = 18372,//rank 2\n+    SOUL_SIPHON                         = 17805,//rank 2\n+    AFTERMATH                           = 18120,//rank 2\n+    IMPROVED_FEAR                       = 53759,//rank 2\n+    NIGHTFALL                           = 18095,//rank 2\n+    SHADOW_EMBRACE                      = 32394,//rank 5\n+    SIPHON_LIFE                         = 63108,\n+    BACKLASH                            = 34939,//rank 3\n+    MOLTEN_CORE                         = 47247,//rank 3\n+    NETHER_PROTECTION                   = 30302,//rank 3\n+    ERADICATION                         = 47197,//rank 3\n+    DEMONIC_RESILIENCE                  = 30321,//rank 3\n+    SOUL_LEECH                          = 30296,//rank 3\n+    PYROCLASM                           = 63245,//rank 3\n+    DECIMATION                          = 63158,//rank 2\n+    IMPROVED_SOUL_LEECH                 = 54118,//rank 2\n+    PANDEMIC                            = 58435,\n+    BACKDRAFT                           = 47260,//rank 3\n+    EVERLASTING_AFFLICTION              = 47205,//rank 5\n+\n+    //Special\n+    GLYPH_CORRUPTION                    = 56218,\n+    GLYPH_LIFE_TAP                      = 63320,\n+    GLYPH_FEAR                          = 56244,\n+    GLYPH_QUICK_DECAY                   = 70947,\n+    GLYPH_CONFLAGRATE                   = 56235,\n+    GLYPH_SHADOWFLAME                   = 63310\n+};\n+\n+enum WarlockSpecial\n+{\n+    CHAOS_BOLT_PASSIVE                  = 58284,\n+    DEMONIC_IMMOLATE_PASSIVE            = 75445,\n+\n+    BACKLASH_BUFF                       = 34936,\n+    BACKDRAFT_BUFF                      = 54277,//rank 3\n+    SHADOW_TRANCE_BUFF                  = 17941,\n+    MOLTEN_CORE_BUFF                    = 71165,//rank 3\n+    DECIMATION_BUFF                     = 63167,//rank 2\n+    CHAOTIC_MIND_BUFF                   = 61189,// \"Soul Fire!\" 6 sec duration Soul Fire instant cast\n+    GLYPH_LIFE_TAP_BUFF                 = 63321,//\"Life Tap\"\n+\n+    SHADOW_MASTERY_DEBUFF               = 17800,// Improved Shadow Bolt talent debuff\n+\n+    SIPHON_LIFE_HEAL                    = 63106,\n+    LIFE_TAP_ENERGIZE                   = 31818,\n+\n+    SEED_OF_CORRUPTION_FINAL_DAMAGE_1   = 27285,\n+\n+    SOULSTONE_RESURRECTION_1            = 20707,\n+    SOULSTONE_RESURRECTION_2            = 20762,\n+    SOULSTONE_RESURRECTION_3            = 20763,\n+    SOULSTONE_RESURRECTION_4            = 20764,\n+    SOULSTONE_RESURRECTION_5            = 20765,\n+    SOULSTONE_RESURRECTION_6            = 27239,\n+    SOULSTONE_RESURRECTION_7            = 47883,\n+\n+    BLOOD_PACT_1                        = 6307,\n+    FEL_INTELLIGENCE_1                  = 54424,\n+\n+    SOUL_LINK_PET                       = 25228,//split effect lvl 20 req\n+    FEL_SYNERGY_HEAL                    = 54181,\n+    LIFE_TAP_ENERGIZE_PET               = 32553\n+};\n+\n+enum CurseType : uint32\n+{\n+    CURSE_NONE                  = 0,\n+    CURSE_WEAKNESS              = 1,\n+    CURSE_AGONY                 = 2,\n+    CURSE_DOOM                  = 3,\n+    CURSE_ELEMENTS              = 4,\n+    CURSE_TONGUES               = 5,\n+    CURSE_EXHAUSTION            = 6,\n+\n+    CURSE_FLAG_MY_WEAKNESS,\n+    CURSE_FLAG_MY_AGONY,\n+    CURSE_FLAG_MY_DOOM,\n+    CURSE_FLAG_MY_ELEMENTS,\n+    CURSE_FLAG_MY_TONGUES,\n+    CURSE_FLAG_MY_EXHAUSTION,\n+\n+    CURSE_MASK_WEAKNESS         = (1 << CURSE_WEAKNESS),\n+    CURSE_MASK_AGONY            = (1 << CURSE_AGONY),\n+    CURSE_MASK_DOOM             = (1 << CURSE_DOOM),\n+    CURSE_MASK_ELEMENTS         = (1 << CURSE_ELEMENTS),\n+    CURSE_MASK_TONGUES          = (1 << CURSE_TONGUES),\n+    CURSE_MASK_EXHAUSTION       = (1 << CURSE_EXHAUSTION),\n+\n+    CURSE_MASK_MY_WEAKNESS      = (1 << CURSE_FLAG_MY_WEAKNESS),\n+    CURSE_MASK_MY_AGONY         = (1 << CURSE_FLAG_MY_AGONY),\n+    CURSE_MASK_MY_DOOM          = (1 << CURSE_FLAG_MY_DOOM),\n+    CURSE_MASK_MY_ELEMENTS      = (1 << CURSE_FLAG_MY_ELEMENTS),\n+    CURSE_MASK_MY_TONGUES       = (1 << CURSE_FLAG_MY_TONGUES),\n+    CURSE_MASK_MY_EXHAUSTION    = (1 << CURSE_FLAG_MY_EXHAUSTION),\n+\n+    CURSE_MASK_MY_CURSE_ANY     = (CURSE_MASK_MY_WEAKNESS | CURSE_MASK_MY_AGONY | CURSE_MASK_MY_DOOM | \\\n+                                CURSE_MASK_MY_ELEMENTS | CURSE_MASK_MY_TONGUES | CURSE_MASK_MY_EXHAUSTION)\n+};\n+\n+static const std::vector<uint32> Warlock_spells_damage\n+{ CHAOS_BOLT_1, CONFLAGRATE_1, CORRUPTION_1, CURSE_OF_AGONY_1, CURSE_OF_DOOM_1, DEATH_COIL_1, DRAIN_SOUL_1, HAUNT_1,\n+HELLFIRE_1, IMMOLATE_1, INCINERATE_1, RAIN_OF_FIRE_1, SEARING_PAIN_1, SEED_OF_CORRUPTION_1, SHADOW_BOLT_1,\n+SHADOWBURN_1, SHADOWFLAME_1, SHADOWFURY_1, SOUL_FIRE_1, UNSTABLE_AFFLICTION_1 };\n+static const std::vector<uint32> Warlock_spells_cc\n+{ BANISH_1, CURSE_OF_TONGUES_1, CURSE_OF_EXHAUSTION_1, DEATH_COIL_1, FEAR_1, HOWL_OF_TERROR_1, SHADOWFURY_1 };\n+static const std::vector<uint32> Warlock_spells_support\n+{ CURSE_OF_TONGUES_1, CURSE_OF_EXHAUSTION_1, CURSE_OF_THE_ELEMENTS_1, CURSE_OF_WEAKNESS_1, DARK_PACT_1, DRAIN_MANA_1,\n+DEMON_SKIN_1, DEMON_ARMOR_1, DETECT_INVISIBILITY_1, FEL_ARMOR_1, LIFE_TAP_1, SHADOW_WARD_1, SOULSHATTER_1,\n+UNENDING_BREATH_1/*, CREATE_HEALTHSTONE_1, CREATE_SOULSTONE_1, RITUAL_OF_SUMMONING_1, RITUAL_OF_SOULS_1*/ };\n+\n+class warlock_bot : public CreatureScript\n+{\n+public:\n+    warlock_bot() : CreatureScript(\"warlock_bot\") { }\n+\n+    CreatureAI* GetAI(Creature* creature) const override\n+    {\n+        return new warlock_botAI(creature);\n+    }\n+\n+    bool OnGossipHello(Player* player, Creature* creature) override\n+    {\n+        return creature->GetBotAI()->OnGossipHello(player, 0);\n+    }\n+\n+    bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action) override\n+    {\n+        if (bot_ai* ai = creature->GetBotAI())\n+            return ai->OnGossipSelect(player, creature, sender, action);\n+        return true;\n+    }\n+\n+    bool OnGossipSelectCode(Player* player, Creature* creature, uint32 sender, uint32 action, char const* code) override\n+    {\n+        if (bot_ai* ai = creature->GetBotAI())\n+            return ai->OnGossipSelectCode(player, creature, sender, action, code);\n+        return true;\n+    }\n+\n+    struct warlock_botAI : public bot_ai\n+    {\n+        //HealthstoneSpellIds (Improved Healthstone rank 2)\n+        static constexpr uint32 _healthStoneSpells[8/*createHealthstoneRank*/]\n+        {\n+            23469,// Minor\n+            23471,// Lesser\n+            23473,//\n+            23475,// Greater\n+            23477,// Major\n+            27237,// Master\n+            47872,// Demonic\n+            47877 // Fel\n+        };\n+\n+        warlock_botAI(Creature* creature) : bot_ai(creature)\n+        {\n+            _botclass = BOT_CLASS_WARLOCK;\n+\n+            myPetType = 0;\n+\n+            InitUnitFlags();\n+        }\n+\n+        bool doCast(Unit* victim, uint32 spellId)\n+        {\n+            if (CheckBotCast(victim, spellId) != SPELL_CAST_OK)\n+                return false;\n+            return bot_ai::doCast(victim, spellId);\n+        }\n+\n+        void JustEngagedWith(Unit* u) override { canShadowWard = false; bot_ai::JustEngagedWith(u); }\n+        void KilledUnit(Unit* u) override { bot_ai::KilledUnit(u); }\n+        void EnterEvadeMode(EvadeReason why = EVADE_REASON_OTHER) override { bot_ai::EnterEvadeMode(why); }\n+        void MoveInLineOfSight(Unit* u) override { bot_ai::MoveInLineOfSight(u); }\n+        void JustDied(Unit* u) override { UnsummonAll(false); bot_ai::JustDied(u); }\n+        void DoNonCombatActions(uint32 diff)\n+        {\n+            if (GC_Timer > diff || me->IsMounted() || IsCasting() || Feasting() || Rand() > 20)\n+                return;\n+\n+            if (GetSpell(FEL_ARMOR_1) && !IsTank())\n+            {\n+                if (!me->GetAuraEffect(SPELL_AURA_MOD_SPELL_DAMAGE_OF_STAT_PERCENT, SPELLFAMILY_WARLOCK, 0x0, 0x20000000, 0x0)\n+                    /*!HasAuraName(me, FEL_ARMOR_1)*/ &&\n+                    doCast(me, GetSpell(FEL_ARMOR_1)))\n+                    return;\n+            }\n+            else if (GetSpell(DEMON_ARMOR_1))\n+            {\n+                if (!me->GetAuraEffect(SPELL_AURA_MOD_RESISTANCE, SPELLFAMILY_WARLOCK, 0x0, 0x20, 0x0)\n+                    /*!HasAuraName(me, DEMON_ARMOR_1)*/ &&\n+                    doCast(me, GetSpell(DEMON_ARMOR_1)))\n+                    return;\n+            }\n+            else if (!GetSpell(FEL_ARMOR_1) && !GetSpell(DEMON_ARMOR_1) && GetSpell(DEMON_SKIN_1))\n+            {\n+                if (!me->GetAuraEffect(SPELL_AURA_MOD_RESISTANCE, SPELLFAMILY_WARLOCK, 0x0, 0x0, 0x10)\n+                    /*!HasAuraName(me, DEMON_SKIN_1)*/ &&\n+                    doCast(me, GetSpell(DEMON_SKIN_1)))\n+                    return;\n+            }\n+\n+            if (me->GetVictim())\n+                return;\n+\n+            if (!hasHealthstone && GetSpell(CREATE_HEALTHSTONE_1))\n+            {\n+                if (doCast(me, GetSpell(CREATE_HEALTHSTONE_1)))\n+                    return;\n+            }\n+\n+            if (!hasSoulstone && GetSpell(CREATE_SOULSTONE_1))\n+            {\n+                if (doCast(me, GetSpell(CREATE_SOULSTONE_1)))\n+                    return;\n+            }\n+\n+            if (GetSpell(DETECT_INVISIBILITY_1))\n+            {\n+                if (master->IsAlive() && !master->HasAuraType(SPELL_AURA_MOD_INVISIBILITY_DETECT) &&\n+                    doCast(master, GetSpell(DETECT_INVISIBILITY_1)))\n+                    return;\n+            }\n+\n+            //BUG: players cannot accept this buff if they are below lvl 20 (should be 8)\n+            if (hasSoulstone && soulstoneTimer <= diff && GetSpell(CREATE_SOULSTONE_1))\n+            {\n+                std::vector<Unit*> targets;\n+\n+                if (!IAmFree())\n+                {\n+                    std::vector<Unit*> all_members = BotMgr::GetAllGroupMembers(master->GetGroup());\n+                    for (auto i : NPCBots::index_array<uint8, 3>)\n+                    {\n+                        if (i > 0 && !targets.empty())\n+                            break;\n+                        for (Unit* member : all_members)\n+                        {\n+                            if ((i >= 2 || (i == 0 ? member->IsPlayer() : (member->IsNPCBot() && !GetBG()))) && me->GetMap() == member->FindMap() &&\n+                                member->IsAlive() && !member->isPossessed() && !member->IsCharmed() &&\n+                                !(member->IsNPCBot() && member->ToCreature()->IsTempBot()) &&\n+                                me->GetDistance(member) < 30 && !member->GetDummyAuraEffect(SPELLFAMILY_GENERIC, 92, 0))\n+                            {\n+                                if (i >= 2 || member->GetClass() == CLASS_PRIEST || member->GetClass() == CLASS_PALADIN ||\n+                                    member->GetClass() == CLASS_DRUID || member->GetClass() == CLASS_SHAMAN)\n+                                {\n+                                    targets.push_back(member);\n+                                }\n+                            }\n+                        }\n+                    }\n+                }\n+\n+                if (targets.empty() && master->IsAlive() && !master->isPossessed() && !master->IsCharmed() && !(GetBG() && IsWanderer()) &&\n+                    me->GetDistance(master) < 30 && !master->GetDummyAuraEffect(SPELLFAMILY_GENERIC, 92, 0))\n+                    targets.push_back(master);\n+\n+                if (!targets.empty())\n+                {\n+                    Unit* target = targets.size() == 1 ? targets.front() : Bcore::Containers::SelectRandomContainerElement(targets);\n+                    SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(CREATE_SOULSTONE_1);\n+                    uint32 rank = spellInfo->GetRank();\n+\n+                    while (rank < std::size(_healthStoneSpells) - 1 && target->GetLevel() > spellInfo->SpellLevel && spellInfo->GetNextRankSpell())\n+                    {\n+                        spellInfo = spellInfo->GetNextRankSpell();\n+                        rank = spellInfo->GetRank();\n+                    }\n+\n+                    uint32 spellId;\n+                    switch (spellInfo->Id)\n+                    {\n+                        case   693: spellId = SOULSTONE_RESURRECTION_1; break; //rank 1\n+                        case 20752: spellId = SOULSTONE_RESURRECTION_2; break; //rank 2\n+                        case 20755: spellId = SOULSTONE_RESURRECTION_3; break; //rank 3\n+                        case 20756: spellId = SOULSTONE_RESURRECTION_4; break; //rank 4\n+                        case 20757: spellId = SOULSTONE_RESURRECTION_5; break; //rank 5\n+                        case 27238: spellId = SOULSTONE_RESURRECTION_6; break; //rank 6\n+                        case 47884: spellId = SOULSTONE_RESURRECTION_7; break; //rank 7\n+                        default:\n+                            BOT_LOG_ERROR(\"entities.player\", \"bot_warlockAI: unknown soulstone Id {}\", spellInfo->Id);\n+                            spellId = SOULSTONE_RESURRECTION_1;\n+                            break;\n+                    }\n+                    me->CastSpell(target, spellId, false);\n+                }\n+            }\n+        }\n+\n+        void StartAttack(Unit* u, bool force = false)\n+        {\n+            if (!bot_ai::StartAttack(u, force))\n+                return;\n+            GetInPosition(force, u);\n+            fearTimer = std::max<uint32>(fearTimer, 1000);\n+        }\n+\n+        void CheckFear(uint32 diff)\n+        {\n+            if (fearTimer > diff || GC_Timer > diff || !me->IsInCombat() || IsTank() || IsCasting())\n+                return;\n+\n+            fearTimer = 1600;\n+\n+            uint32 FEAR = GetSpell(FEAR_1);\n+            if (!FEAR)\n+                return;\n+\n+            if (FindAffectedTarget(FEAR, me->GetGUID(), 70, 255))\n+                return;\n+\n+            Unit* feartarget = FindFearTarget(CalcSpellMaxRange(FEAR_1));\n+            if (feartarget && doCast(feartarget, FEAR))\n+                return;\n+        }\n+\n+        void CheckBanish(uint32 diff)\n+        {\n+            if (banishTimer > diff || GC_Timer > diff || !me->IsInCombat() || IsTank() || IsCasting() || Rand() > 50)\n+                return;\n+\n+            banishTimer = 1600;\n+\n+            uint32 BANISH = GetSpell(BANISH_1);\n+            if (!BANISH)\n+                return;\n+\n+            if (FindAffectedTarget(BANISH, me->GetGUID(), 70, 255))\n+                return;\n+\n+            Unit* banishTarget = FindUndeadCCTarget(CalcSpellMaxRange(BANISH_1), BANISH_1);\n+            if (banishTarget && doCast(banishTarget, BANISH))\n+                return;\n+        }\n+\n+        void CheckUnBanish(uint32 diff)\n+        {\n+            if (unbanishTimer > diff || GC_Timer > diff || me->GetVictim() || IsCasting() || Rand() > 30)\n+                return;\n+\n+            unbanishTimer = 2000;\n+\n+            //we check only our spell rank which is enough in 99% cases\n+            uint32 BANISH = GetSpell(BANISH_1);\n+            if (!BANISH)\n+                return;\n+\n+            //looks like you cannot dispel other people's banish\n+            Unit* unbanishTarget = FindAffectedTarget(BANISH, me->GetGUID(), CalcSpellMaxRange(BANISH_1));\n+            if (unbanishTarget && doCast(unbanishTarget, BANISH))\n+                return;\n+        }\n+\n+        void CheckDrainMana(uint32 diff)\n+        {\n+            if (drainManaTimer > diff || IsPotionReady() || !IsSpellReady(DRAIN_MANA_1, diff) ||\n+                !me->getAttackers().empty() || IsTank() || IsCasting() || GetManaPCT(me) > 25 || Rand() > 60)\n+                return;\n+\n+            drainManaTimer = 1000;\n+\n+            //1 case: feared mana pot running around\n+            Unit* drainTarget = FindDrainTarget(CalcSpellMaxRange(DRAIN_MANA_1));\n+\n+            if (!drainTarget)\n+            {\n+                Unit* u = me->GetVictim();\n+                if (u && u->GetPowerType() == POWER_MANA && u->GetMaxPower(POWER_MANA) >= me->GetMaxPower(POWER_MANA) &&\n+                    GetManaPCT(u) >= 15 && me->GetDistance(u) < CalcSpellMaxRange(DRAIN_MANA_1))\n+                    drainTarget = u;\n+            }\n+\n+            if (drainTarget && doCast(drainTarget, GetSpell(DRAIN_MANA_1)))\n+                return;\n+        }\n+\n+        void CheckWard(uint32 diff)\n+        {\n+            if (!canShadowWard || (!me->IsInCombat() && !me->HasAuraType(SPELL_AURA_PERIODIC_DAMAGE)) ||\n+                !IsSpellReady(SHADOW_WARD_1, diff) || IsCasting())\n+                return;\n+\n+            if (doCast(me, GetSpell(SHADOW_WARD_1)))\n+                return;\n+        }\n+\n+        void CheckSoulShatter(uint32 diff)\n+        {\n+            if (!IsSpellReady(SOULSHATTER_1, diff) || me->getAttackers().empty() || Rand() < 80)\n+                return;\n+\n+            Unit* u = *(me->getAttackers().begin());\n+            if (u->GetThreatMgr().GetThreatListSize() < 3 || u->GetThreatMgr().GetThreat(me) < 100.f)\n+                return;\n+\n+            if (doCast(me, GetSpell(SOULSHATTER_1)))\n+                return;\n+        }\n+\n+        void Counter(uint32 diff)\n+        {\n+            if (GC_Timer > diff || IsCasting() || Rand() > 25)\n+                return;\n+\n+            bool busyCasting = me->IsNonMeleeSpellCast(true,true,true);\n+\n+            //Fear\n+            if (!busyCasting && IsSpellReady(FEAR_1, diff))\n+            {\n+                Unit* u = FindCastingTarget(CalcSpellMaxRange(FEAR_1), 0, FEAR_1);\n+                if (u && doCast(u, GetSpell(FEAR_1)))\n+                    return;\n+            }\n+            //Howl of Terror (only instant cast)\n+            if ((GetSpec() == BOT_SPEC_WARLOCK_AFFLICTION) &&\n+                !busyCasting && me->GetLevel() >= 45 && IsSpellReady(HOWL_OF_TERROR_1, diff))\n+            {\n+                Unit* u = FindCastingTarget(8, 0, FEAR_1); //same immunity\n+                if (u && doCast(u, GetSpell(HOWL_OF_TERROR_1)))\n+                    return;\n+            }\n+            //Shadowfury\n+            if (HasRole(BOT_ROLE_DPS) && IsSpellReady(SHADOWFURY_1, diff))\n+            {\n+                if (Unit* u = FindCastingTarget(CalcSpellMaxRange(SHADOWFURY_1), 0, SHADOWFURY_1))\n+                {\n+                    if (busyCasting)\n+                        me->InterruptNonMeleeSpells(true);\n+                    if (doCast(u, GetSpell(SHADOWFURY_1)))\n+                        return;\n+                }\n+            }\n+             //Death Coil\n+            if (HasRole(BOT_ROLE_DPS) && IsSpellReady(DEATH_COIL_1, diff))\n+            {\n+                if (Unit* u = FindCastingTarget(CalcSpellMaxRange(DEATH_COIL_1), 0, DEATH_COIL_1))\n+                {\n+                    if (busyCasting)\n+                        me->InterruptNonMeleeSpells(true);\n+                    if (doCast(u, GetSpell(DEATH_COIL_1)))\n+                        return;\n+                }\n+            }\n+        }\n+\n+        void DoDefend(uint32 diff)\n+        {\n+            if (GC_Timer > diff || !me->IsInCombat() || Rand() > 120)\n+                return;\n+\n+            Unit::AttackerSet const& m_attackers = master->getAttackers();\n+            Unit::AttackerSet const& b_attackers = me->getAttackers();\n+            bool needFearM = !IAmFree() && !m_attackers.empty() && (!IsTank(master) || GetHealthPCT(master) < 75);\n+\n+            //HOWL\n+            //fear master's attackers\n+            if (IsSpellReady(HOWL_OF_TERROR_1, diff))\n+            {\n+                if (needFearM)\n+                {\n+                    uint8 tCount = 0;\n+                    for (Unit const* attacker : m_attackers)\n+                    {\n+                        if (!attacker) continue;\n+                        if (CCed(attacker, true)) continue;\n+                        if (attacker->ToCreature() && attacker->GetCreatureType() == CREATURE_TYPE_UNDEAD) continue;\n+                        if (me->GetDistance(attacker) > 9) continue;\n+                        if (me->IsValidAttackTarget(attacker))\n+                            ++tCount;\n+                    }\n+                    if (tCount > 1 && doCast(me, GetSpell(HOWL_OF_TERROR_1)))\n+                        return;\n+                }\n+                // Defend myself\n+                if (!b_attackers.empty())\n+                {\n+                    uint8 tCount = 0;\n+                    for (Unit const* attacker : b_attackers)\n+                    {\n+                        if (!attacker) continue;\n+                        if (CCed(attacker, true)) continue;\n+                        if (attacker->ToCreature() && attacker->GetCreatureType() == CREATURE_TYPE_UNDEAD) continue;\n+                        if (me->GetDistance(attacker) > 9) continue;\n+                        if (me->IsValidAttackTarget(attacker))\n+                            ++tCount;\n+                    }\n+                    if (tCount > 1 && doCast(me, GetSpell(HOWL_OF_TERROR_1)))\n+                        return;\n+                }\n+            }\n+            //COIL\n+            if (HasRole(BOT_ROLE_DPS) && IsSpellReady(DEATH_COIL_1, diff))\n+            {\n+                Unit* u = needFearM ? *(m_attackers.begin()) : nullptr;\n+                if (u && u->GetMaxHealth() > master->GetMaxHealth() * 2 &&\n+                    u->GetDistance(me) < 30)\n+                {\n+                    if (doCast(u, GetSpell(DEATH_COIL_1)))\n+                        return;\n+                }\n+                u = !b_attackers.empty() ? *(b_attackers.begin()) : nullptr;\n+                if (u && u->GetMaxHealth() > me->GetMaxHealth() * 2 && u->GetDistance(me) < 8)\n+                {\n+                    if (doCast(u, GetSpell(DEATH_COIL_1)))\n+                        return;\n+                }\n+            }\n+        }\n+\n+        bool BuffTarget(Unit* target, uint32 /*diff*/) override\n+        {\n+            if (!target->IsPlayer()) return false;\n+            if (me->IsInCombat() && !master->GetMap()->IsRaid()) return false;\n+\n+            if (GetSpell(UNENDING_BREATH_1) && target->HasUnitMovementFlag(MOVEMENTFLAG_SWIMMING) &&\n+                !target->HasAuraType(SPELL_AURA_WATER_BREATHING))\n+            {\n+                if (doCast(target, GetSpell(UNENDING_BREATH_1)))\n+                    return true;\n+            }\n+\n+            return false;\n+        }\n+\n+        void UpdateAI(uint32 diff) override\n+        {\n+            if (!GlobalUpdate(diff))\n+                return;\n+\n+            DoVehicleActions(diff);\n+            if (!CanBotAttackOnVehicle())\n+                return;\n+\n+            //pet is killed or unreachable\n+            if (GC_Timer <= diff && !me->IsInCombat() && !me->IsMounted() && !me->GetVictim() && !IsCasting() && Rand() < 25 &&\n+                (!botPet || me->GetDistance2d(botPet) > World::GetMaxVisibleDistanceOnContinents()))\n+                SummonBotPet();\n+\n+            //Hellfire interrupt\n+            Spell const* spell = me->GetCurrentSpell(CURRENT_CHANNELED_SPELL);\n+            if (spell && spell->GetSpellInfo()->GetFirstRankSpell()->Id == HELLFIRE_1 &&\n+                ((!IAmFree() && !master->GetBotMgr()->IsPartyInCombat(false)) || GetHealthPCT(me) < 25))\n+                me->InterruptSpell(CURRENT_CHANNELED_SPELL);\n+            else\n+            {\n+                spell = me->GetCurrentSpell(CURRENT_GENERIC_SPELL);\n+                SpellInfo const* baseSpellInfo = spell ? spell->GetSpellInfo()->GetFirstRankSpell() : nullptr;\n+                uint32 base_id = baseSpellInfo ? baseSpellInfo->Id : 0;\n+                if (baseSpellInfo && (base_id == FEAR_1 || base_id == BANISH_1 || baseSpellInfo->SpellVisual[0] == 99))\n+                {\n+                    if (Unit const* target = ObjectAccessor::GetUnit(*me, spell->m_targets.GetObjectTargetGUID()))\n+                    {\n+                        //Fear interrupt\n+                        if (base_id == FEAR_1 && target->HasAuraType(SPELL_AURA_MOD_FEAR))\n+                            me->InterruptSpell(CURRENT_GENERIC_SPELL);\n+                        //Banish interrupt\n+                        else if (base_id == BANISH_1)\n+                        {\n+                            if (AuraEffect const* bani = target->GetAuraEffect(SPELL_AURA_SCHOOL_IMMUNITY, SPELLFAMILY_WARLOCK, 0x0, 0x8000000, 0x0))\n+                            {\n+                                //Already banished\n+                                //check spell cast time\n+                                if (bani->GetBase()->GetDuration() > bani->GetBase()->GetMaxDuration() - 1500)\n+                                    me->InterruptSpell(CURRENT_GENERIC_SPELL);\n+                            }\n+                            else if (!target->getAttackers().empty())\n+                                me->InterruptSpell(CURRENT_GENERIC_SPELL);\n+                        }\n+                        //Soulstone resurrection interrupt\n+                        else if (spell->GetSpellInfo()->SpellVisual[0] == 99 && target->GetDummyAuraEffect(SPELLFAMILY_GENERIC, 92, 0))\n+                            me->InterruptSpell(CURRENT_GENERIC_SPELL);\n+                    }\n+                }\n+            }\n+\n+            if (hasHealthstone && healthstoneTimer <= diff &&\n+                /*GetSpell(CREATE_HEALTHSTONE_1) && */!IsCasting() && GetHealthPCT(me) < 65)\n+            {\n+                uint32 healthStone = InitSpell(me, CREATE_HEALTHSTONE_1);\n+                SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(healthStone);\n+                //ASSERT(spellInfo);\n+                uint32 rank = spellInfo ? spellInfo->GetRank() : 1;\n+                //ASSERT(rank >= 1 && rank <= 8);\n+                spellInfo = sSpellMgr->GetSpellInfo(_healthStoneSpells[rank - 1]);\n+                ASSERT(spellInfo);\n+                int32 healing = spellInfo->Effects[0].BasePoints;\n+                //Glyph of Healthstone\n+                if (me->GetLevel() >= 15)\n+                    healing = int32(float(healing) * 1.3f);\n+                //CastSpellExtraArgs args(true);\n+                //args.AddSpellBP0(healing);\n+                //me->CastSpell(me, _healthStoneSpells[rank - 1], args);\n+                me->CastCustomSpell(me, _healthStoneSpells[rank - 1], &healing, nullptr, nullptr, true);\n+                healthstoneTimer = 120000; //2 min\n+                hasHealthstone = false;\n+                return;\n+            }\n+            else if (IsPotionReady() && GetHealthPCT(me) < 50)\n+            {\n+                DrinkPotion(false);\n+            }\n+\n+            if (IsSpellReady(DARK_PACT_1, diff) && !IsCasting() && botPet && botPet->GetPower(POWER_MANA) >= 300 &&\n+                GetManaPCT(me) < 20)\n+            {\n+                if (doCast(me, GetSpell(DARK_PACT_1)))\n+                    return;\n+            }\n+            else if (IsSpellReady(LIFE_TAP_1, diff) && !IsCasting() && GetHealthPCT(me) > (me->IsInCombat() ? 30 : 15) &&\n+                GetManaPCT(me) < 15 && Rand() < 50)\n+            {\n+                //it is possible that CheckCast will return SPELL_FAILED_NO_POWER if not enough hp\n+                if (doCast(me, GetSpell(LIFE_TAP_1)))\n+                    return;\n+            }\n+            else if (IsPotionReady() && GetManaPCT(me) < 10)\n+            {\n+                DrinkPotion(true);\n+            }\n+\n+            CheckRacials(diff);\n+\n+            CheckSoulShatter(diff);\n+            DoDefend(diff);\n+            CheckFear(diff);\n+            CheckWard(diff);\n+\n+            BuffAndHealGroup(diff);\n+\n+            if (!me->IsInCombat())\n+                DoNonCombatActions(diff);\n+\n+            Counter(diff);\n+\n+            CheckBanish(diff);\n+            CheckUnBanish(diff);\n+\n+            CheckDrainMana(diff);\n+\n+            if (ProcessImmediateNonAttackTarget())\n+                return;\n+\n+            if (!CheckAttackTarget())\n+                return;\n+\n+            if (IsCasting())\n+                return;\n+\n+            CheckUsableItems(diff);\n+\n+            DoNormalAttack(diff);\n+        }\n+\n+        void DoNormalAttack(uint32 diff)\n+        {\n+            Unit* mytar = opponent ? opponent : disttarget ? disttarget : nullptr;\n+            if (!mytar)\n+                return;\n+\n+            StartAttack(mytar, IsMelee());\n+\n+            CheckAttackState();\n+            if (!me->IsAlive() || !mytar->IsAlive())\n+                return;\n+\n+            MoveBehind(mytar);\n+\n+            if (GC_Timer > diff)\n+                return;\n+\n+            auto [can_do_shadow, can_do_fire] = CanAffectVictimBools(mytar, SPELL_SCHOOL_SHADOW, SPELL_SCHOOL_FIRE);\n+\n+            float dist = me->GetDistance(mytar);\n+\n+            //spell reflections\n+            if (IsSpellReady(CURSE_OF_THE_ELEMENTS_1, diff)  && can_do_shadow&& dist < CalcSpellMaxRange(CURSE_OF_THE_ELEMENTS_1) &&\n+                CanRemoveReflectSpells(mytar, CURSE_OF_THE_ELEMENTS_1) &&\n+                doCast(mytar, CURSE_OF_THE_ELEMENTS_1))\n+                return;\n+            else if (IsSpellReady(CURSE_OF_WEAKNESS_1, diff) && can_do_shadow && dist < CalcSpellMaxRange(CURSE_OF_WEAKNESS_1) &&\n+                CanRemoveReflectSpells(mytar, CURSE_OF_WEAKNESS_1) &&\n+                doCast(mytar, CURSE_OF_WEAKNESS_1))\n+                return;\n+\n+            //Offensive heal (Death Coil)\n+            if (IsSpellReady(DEATH_COIL_1, diff) && can_do_shadow && HasRole(BOT_ROLE_DPS) && dist < CalcSpellMaxRange(DEATH_COIL_1) &&\n+                GetHealthPCT(me) < 35)\n+            {\n+                //if (me->IsNonMeleeSpellCast(true))\n+                //    me->InterruptNonMeleeSpells(true);\n+                if (doCast(mytar, GetSpell(DEATH_COIL_1)))\n+                    return;\n+            }\n+\n+            //Life Tap / Dark Pact for Glyph of Life Tap\n+            if (lifeTapCheckTimer <= diff && HasRole(BOT_ROLE_DPS) && Rand() < 75)\n+            {\n+                lifeTapCheckTimer = 10000;\n+                if (me->GetLevel() >= 15 && !me->GetAuraEffect(SPELL_AURA_MOD_SPELL_DAMAGE_OF_STAT_PERCENT, SPELLFAMILY_WARLOCK, 208, 0))\n+                {\n+                    //doesn't work: wrong spell proc entry 10.12.2020\n+                    //if (IsSpellReady(DARK_PACT_1, diff) && botPet && GetManaPCT(me) > 70)\n+                    //{\n+                    //    if (doCast(me, GetSpell(DARK_PACT_1)))\n+                    //        return;\n+                    //}\n+                    //else\n+                    if (IsSpellReady(LIFE_TAP_1, diff) && GetHealthPCT(me) > 30)\n+                    {\n+                        if (doCast(me, GetSpell(LIFE_TAP_1)))\n+                            return;\n+                    }\n+                }\n+            }\n+            //Shadowfury\n+            if (IsSpellReady(SHADOWFURY_1, diff) && can_do_shadow && HasRole(BOT_ROLE_DPS) && !CCed(mytar, true) && Rand() < 55)\n+            {\n+                if (FindSplashTarget(CalcSpellMaxRange(SHADOWFURY_1)) &&\n+                    doCast(mytar, GetSpell(SHADOWFURY_1)))\n+                    return;\n+            }\n+            //Hellfire\n+            if (IsSpellReady(HELLFIRE_1, diff) && HasRole(BOT_ROLE_DPS) && !IAmFree() && !JumpingOrFalling() &&\n+                GetHealthPCT(me) > 90 && Rand() < 25)\n+            {\n+                std::list<Unit*> targets;\n+                GetNearbyTargetsList(targets, 12.f, 0);\n+                for (std::list<Unit*>::iterator itr = targets.begin(); itr != targets.end();)\n+                {\n+                    Unit* u = *itr;\n+                    bool erase = false;\n+                    if (u->isMoving())\n+                    {\n+                        if (me->GetDistance(u) > 10.f && !u->HasInArc(float(M_PI)/2, me))\n+                            erase = true;\n+                    }\n+                    else if (me->GetDistance(u) > 9.5f)\n+                        erase = true;\n+\n+                    if (erase)\n+                    {\n+                        targets.erase(itr++);\n+                        continue;\n+                    }\n+                    ++itr;\n+                }\n+                if (targets.size() >= 4 && doCast(me, GetSpell(HELLFIRE_1)))\n+                    return;\n+            }\n+            //Rain of Fire\n+            if (IsSpellReady(RAIN_OF_FIRE_1, diff) && HasRole(BOT_ROLE_DPS) && !JumpingOrFalling() && Rand() < 45 &&\n+                (GetSpec() != BOT_SPEC_WARLOCK_AFFLICTION || !GetSpell(SEED_OF_CORRUPTION_1)))\n+            {\n+                if (Unit* raintarget = FindAOETarget(CalcSpellMaxRange(RAIN_OF_FIRE_1)))\n+                {\n+                    if (doCast(raintarget, GetSpell(RAIN_OF_FIRE_1)))\n+                        return;\n+                }\n+            }\n+            //Searing Pain (PvP)\n+            if (longCasted && IsSpellReady(SEARING_PAIN_1, diff) && can_do_fire && HasRole(BOT_ROLE_DPS) &&\n+                GetSpec() != BOT_SPEC_WARLOCK_AFFLICTION &&\n+                mytar->IsPlayer() && Rand() < 35 && dist < CalcSpellMaxRange(SEARING_PAIN_1))\n+            {\n+                if (doCast(mytar, GetSpell(SEARING_PAIN_1)))\n+                    return;\n+            }\n+            //Shadowflame\n+            if (longCasted && IsSpellReady(SHADOWFLAME_1, diff) && can_do_shadow && HasRole(BOT_ROLE_DPS) && Rand() < 65)\n+            {\n+                std::list<Unit*> targets;\n+                GetNearbyTargetsInConeList(targets, 8); //radius 10 yd\n+                if (!targets.empty() && doCast(me, GetSpell(SHADOWFLAME_1)))\n+                    return;\n+            }\n+            //Curse, checking affliction range\n+            if (curseCheckTimer <= diff && can_do_shadow && GetSpellCooldown(CURSE_OF_WEAKNESS_1) <= diff && Rand() < 85 &&\n+                dist < CalcSpellMaxRange(CURSE_OF_WEAKNESS_1) && mytar->GetHealth() > me->GetMaxHealth() / 4)\n+            {\n+                curseCheckTimer = 2500;\n+                uint32 curses = _getCursesMask(mytar);\n+                if (!(curses & CURSE_MASK_MY_CURSE_ANY))\n+                {\n+                    if (!(curses & CURSE_MASK_ELEMENTS) && GetSpell(CURSE_OF_THE_ELEMENTS_1) && !IAmFree() &&\n+                        (GetSpec() != BOT_SPEC_WARLOCK_AFFLICTION || Rand() < 33) &&\n+                        master->GetGroup() && master->GetGroup()->GetMembersCount() > 2)\n+                    {\n+                        if (doCast(mytar, GetSpell(CURSE_OF_THE_ELEMENTS_1)))\n+                            return;\n+                    }\n+                    if (!(curses & CURSE_MASK_MY_AGONY) && GetSpell(CURSE_OF_AGONY_1) && HasRole(BOT_ROLE_DPS) &&\n+                        mytar->GetHealth() > me->GetMaxHealth() / 4 * (1 + mytar->getAttackers().size()))\n+                    {\n+                        if (doCast(mytar, GetSpell(CURSE_OF_AGONY_1)))\n+                            return;\n+                    }\n+                    if (!(curses & CURSE_MASK_TONGUES) && GetSpell(CURSE_OF_TONGUES_1) && mytar->GetHealth() > me->GetMaxHealth() / 2 &&\n+                        mytar->IsNonMeleeSpellCast(false, false, true))\n+                    {\n+                        if (doCast(mytar, GetSpell(CURSE_OF_TONGUES_1)))\n+                            return;\n+                    }\n+                    if (!(curses & CURSE_MASK_EXHAUSTION) && GetSpell(CURSE_OF_EXHAUSTION_1) && !CCed(mytar, true) &&\n+                        mytar->IsControlledByPlayer() && !mytar->HasAuraWithMechanic(1u<<MECHANIC_SNARE))\n+                    {\n+                        if (doCast(mytar, GetSpell(CURSE_OF_EXHAUSTION_1)))\n+                            return;\n+                    }\n+                    if (!(curses & CURSE_MASK_WEAKNESS) && GetSpell(CURSE_OF_WEAKNESS_1) && me->GetMap()->IsDungeon() &&\n+                        mytar->GetMaxHealth() > me->GetMaxHealth() * 2)\n+                    {\n+                        if (doCast(mytar, GetSpell(CURSE_OF_WEAKNESS_1)))\n+                            return;\n+                    }\n+                }\n+            }\n+\n+            if (!HasRole(BOT_ROLE_DPS))\n+                return;\n+\n+            //Chaos Bolt\n+            if (IsSpellReady(CHAOS_BOLT_1, diff) && can_do_fire && dist < CalcSpellMaxRange(CHAOS_BOLT_1))\n+            {\n+                if (doCast(mytar, GetSpell(CHAOS_BOLT_1)))\n+                    return;\n+            }\n+            //Soul Fire 1\n+            if (IsSpellReady(SOUL_FIRE_1, diff) && can_do_fire && Rand() < 150 && dist < CalcSpellMaxRange(SOUL_FIRE_1) &&\n+                (mytar->IsPolymorphed() || me->HasAuraTypeWithAffectMask(SPELL_AURA_NO_REAGENT_USE, sSpellMgr->GetSpellInfo(SOUL_FIRE_1))))\n+            {\n+                if (doCast(mytar, GetSpell(SOUL_FIRE_1)))\n+                    return;\n+            }\n+            //Conflagrate (always glyphed, does not consume dot)\n+            if (longCasted && IsSpellReady(CONFLAGRATE_1, diff) && can_do_fire && dist < CalcSpellMaxRange(CONFLAGRATE_1) &&\n+                mytar->HasAuraState(AURA_STATE_CONFLAGRATE) &&\n+                mytar->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_WARLOCK, 0x4, 0x0, 0x0, me->GetGUID()))\n+            {\n+                if (doCast(mytar, GetSpell(CONFLAGRATE_1)))\n+                    return;\n+            }\n+            //Shadowburn\n+            if (longCasted && IsSpellReady(SHADOWBURN_1, diff) && can_do_shadow && dist < CalcSpellMaxRange(SHADOWBURN_1) &&\n+                mytar->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT))\n+            {\n+                if (doCast(mytar, GetSpell(SHADOWBURN_1)))\n+                    return;\n+            }\n+            //Immolate\n+            if (IsSpellReady(IMMOLATE_1, diff) && can_do_fire && Rand() < 85 && dist < CalcSpellMaxRange(IMMOLATE_1) &&\n+                (GetSpec() != BOT_SPEC_WARLOCK_AFFLICTION || !GetSpell(UNSTABLE_AFFLICTION_1)) &&\n+                (GetSpell(CONFLAGRATE_1) || mytar->GetHealth() > me->GetMaxHealth()/4 * (1 + mytar->getAttackers().size())) &&\n+                !mytar->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_WARLOCK, 0x4, 0x0, 0x0, me->GetGUID()))\n+            {\n+                if (doCast(mytar, GetSpell(IMMOLATE_1)))\n+                    return;\n+            }\n+            //Haunt\n+            if (IsSpellReady(HAUNT_1, diff) && can_do_shadow && Rand() < 125 && dist < CalcSpellMaxRange(HAUNT_1) &&\n+                mytar->GetHealth() > me->GetMaxHealth()/4 * (1 + mytar->getAttackers().size()) &&\n+                !mytar->GetAuraEffect(SPELL_AURA_MOD_DAMAGE_FROM_CASTER, SPELLFAMILY_WARLOCK, 0x0, 0x40000, 0x0, me->GetGUID()))\n+            {\n+                if (doCast(mytar, GetSpell(HAUNT_1)))\n+                    return;\n+            }\n+            //Unstable Affliction\n+            if (IsSpellReady(UNSTABLE_AFFLICTION_1, diff) && can_do_shadow && Rand() < 115 && dist < CalcSpellMaxRange(UNSTABLE_AFFLICTION_1) &&\n+                mytar->GetHealth() > me->GetMaxHealth()/4 * (1 + mytar->getAttackers().size()) &&\n+                !mytar->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_WARLOCK, 0x0, 0x100, 0x0, me->GetGUID()))\n+            {\n+                if (doCast(mytar, GetSpell(UNSTABLE_AFFLICTION_1)))\n+                    return;\n+            }\n+            //Seed of Corruption\n+            if (IsSpellReady(SEED_OF_CORRUPTION_1, diff) && Rand() < 85)\n+            {\n+                Unit* target = FindAOETarget(CalcSpellMaxRange(SEED_OF_CORRUPTION_1));\n+                if (target && !target->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_WARLOCK, 0x0, 0x10, 0x0, me->GetGUID()))\n+                {\n+                    if (doCast(target, GetSpell(SEED_OF_CORRUPTION_1)))\n+                        return;\n+                }\n+\n+                SetSpellCooldown(SEED_OF_CORRUPTION_1, 1000); //fail\n+            }\n+            //Corruption\n+            if (IsSpellReady(CORRUPTION_1, diff) && can_do_shadow && Rand() < 90 && dist < CalcSpellMaxRange(CORRUPTION_1) &&\n+                mytar->GetHealth() > me->GetMaxHealth()/4 * (1 + mytar->getAttackers().size()) &&\n+                !mytar->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_WARLOCK, 0x2, 0x0, 0x0, me->GetGUID()) &&//corruption\n+                !mytar->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_WARLOCK, 0x0, 0x10, 0x0, me->GetGUID()))//seed of corruption\n+            {\n+                if (doCast(mytar, GetSpell(CORRUPTION_1)))\n+                    return;\n+            }\n+            //Drain Soul: only if can quad damage\n+            if (IsSpellReady(DRAIN_SOUL_1, diff) && can_do_shadow && mytar->IsCreature() &&\n+                Rand() < (50 + 85 * me->GetMap()->IsDungeon()) && GetHealthPCT(mytar) < 25 &&\n+                mytar->GetHealth() > me->GetMaxHealth() / 2 && dist < CalcSpellMaxRange(DRAIN_SOUL_1))\n+            {\n+                if (doCast(mytar, GetSpell(DRAIN_SOUL_1)))\n+                    return;\n+            }\n+            //Soul Fire (conditional)\n+            if (IsSpellReady(SOUL_FIRE_1, diff) && can_do_fire && Rand() < 90 && dist < CalcSpellMaxRange(SOUL_FIRE_1) &&\n+                mytar->GetHealth() > me->GetMaxHealth()/8 * (1 + mytar->getAttackers().size()) && me->HasAura(BACKDRAFT_BUFF))\n+            {\n+                if (doCast(mytar, GetSpell(SOUL_FIRE_1)))\n+                    return;\n+            }\n+            //Main: Shadow Bolt, Incinerate, Searing Pain (tank), checking destruction range\n+            if (dist < CalcSpellMaxRange(SHADOW_BOLT_1))\n+            {\n+                uint32 boltinerate =\n+                    IsTank() && GetSpell(SEARING_PAIN_1) ? SEARING_PAIN_1 :\n+                    GetSpell(SHADOW_BOLT_1) && GetSpec() == BOT_SPEC_WARLOCK_AFFLICTION ? SHADOW_BOLT_1 :\n+                    GetSpell(INCINERATE_1) && mytar->HasAuraState(AURA_STATE_CONFLAGRATE) ?\n+                    //mytar->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_WARLOCK, 0x4, 0x0, 0x0) &&\n+                    //mytar->GetAuraEffect(SPELL_AURA_MOD_ATTACKER_SPELL_CRIT_CHANCE, SPELLFAMILY_WARLOCK, 213, 0) &&\n+                    //(me->GetMap()->IsRaid() || !me->HasAura(SHADOW_TRANCE_BUFF)) ?\n+                    INCINERATE_1 : SHADOW_BOLT_1;\n+\n+                bool can_cast_boltinerate;\n+                switch (boltinerate)\n+                {\n+                    case SEARING_PAIN_1: case INCINERATE_1:\n+                        can_cast_boltinerate = can_do_fire;\n+                        break;\n+                    case SHADOW_BOLT_1:\n+                        can_cast_boltinerate = can_do_shadow;\n+                        break;\n+                    default:\n+                        can_cast_boltinerate = true;\n+                        break;\n+                }\n+\n+                if (boltinerate && can_cast_boltinerate && doCast(mytar, GetSpell(boltinerate)))\n+                    return;\n+            }\n+\n+            if (Spell const* shot = me->GetCurrentSpell(CURRENT_AUTOREPEAT_SPELL))\n+            {\n+                if (shot->GetSpellInfo()->Id == SHOOT_WAND && shot->m_targets.GetUnitTarget() != mytar)\n+                    me->InterruptSpell(CURRENT_AUTOREPEAT_SPELL);\n+            }\n+            else if (IsSpellReady(SHOOT_WAND, diff) && !me->isMoving() && me->GetDistance(mytar) < 30 && GetEquips(BOT_SLOT_RANGED) &&\n+                doCast(mytar, SHOOT_WAND))\n+                return;\n+        }\n+\n+        void ApplyClassSpellCritMultiplierAll(Unit const* victim, float& crit_chance, SpellInfo const* spellInfo, SpellSchoolMask /*schoolMask*/, WeaponAttackType /*attackType*/) const override\n+        {\n+            //victim can be NULL\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+\n+            //Molten Core part 2.2: 15% additional critical chance for Soul Fire\n+            if (lvl >= 35 && baseId == SOUL_FIRE_1)\n+            {\n+                moltencore = me->HasAura(MOLTEN_CORE_BUFF);\n+                if (moltencore)\n+                    crit_chance += 15.f;\n+            }\n+\n+            //Devastation: 5% additional critical chance for Destruction spells\n+            if ((GetSpec() == BOT_SPEC_WARLOCK_DESTRUCTION) &&\n+                lvl >= 30 && spellInfo->SpellFamilyName == SPELLFAMILY_WARLOCK &&\n+                ((spellInfo->SpellFamilyFlags[0] & 0x3E5) || (spellInfo->SpellFamilyFlags[1] & 0x8310C0)))\n+                crit_chance += 5.f;\n+            //Fire and Brimstone part 2: 25% additional critical chance for Conflagrate\n+            if ((GetSpec() == BOT_SPEC_WARLOCK_DESTRUCTION) && lvl >= 55 && baseId == CONFLAGRATE_1)\n+                crit_chance += 25.f;\n+            //Malediction part 2: 9% additional critical chance for Corruption and Unstable Affliction\n+            if ((GetSpec() == BOT_SPEC_WARLOCK_AFFLICTION) &&\n+                lvl >= 45 && (baseId == CORRUPTION_1 || baseId == UNSTABLE_AFFLICTION_1))\n+                crit_chance += 9.f;\n+            //Glyph of Shadowburn: 20% additional critical chance for Shadowburn on targets 35% hp and below\n+            if (lvl >= 20 && baseId == SHADOWBURN_1 && victim && victim->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT))\n+                crit_chance += 20.f;\n+            //Improved Corruption part 2: 5% additional critical chance for Seed of Corruption\n+            if (lvl >= 10 && (baseId == SEED_OF_CORRUPTION_1 || baseId == SEED_OF_CORRUPTION_FINAL_DAMAGE_1))\n+                crit_chance += 5.f;\n+            //Improved Searing Pain: 10% additional critical chance for Searing Pain\n+            if ((GetSpec() == BOT_SPEC_WARLOCK_DESTRUCTION) && lvl >= 25 && baseId == SEARING_PAIN_1)\n+                crit_chance += 10.f;\n+\n+            //Master Demonologist part 1.2 (me): 5% additional critical chance for Fire spells\n+            if ((GetSpec() == BOT_SPEC_WARLOCK_DEMONOLOGY) &&\n+                lvl >= 35 && botPet && myPetType == BOT_PET_IMP && (spellInfo->GetSchoolMask() & SPELL_SCHOOL_MASK_FIRE))\n+                crit_chance += 5.f;\n+            //Master Demonologist part 3.2 (me): 5% additional critical chance for Shadow spells\n+            if ((GetSpec() == BOT_SPEC_WARLOCK_DEMONOLOGY) &&\n+                lvl >= 35 && botPet && myPetType == BOT_PET_SUCCUBUS && (spellInfo->GetSchoolMask() & SPELL_SCHOOL_MASK_SHADOW))\n+                crit_chance += 5.f;\n+\n+            //Warlock T84P Bonus (64932): 5% additional critical chance for Shadow Bolt and Incinerate\n+            if (lvl >= 80 && (baseId == SHADOW_BOLT_1 || baseId == INCINERATE_1))\n+                crit_chance += 5.f;\n+        }\n+\n+        void ApplyClassDamageMultiplierSpell(int32& damage, SpellNonMeleeDamage& damageinfo, SpellInfo const* spellInfo, WeaponAttackType /*attackType*/, bool iscrit) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+            float fdamage = float(damage);\n+\n+            //2) apply bonus damage mods\n+            float pctbonus = 1.0f; //Special condition\n+            if (iscrit)\n+            {\n+                //!!!spell damage is not yet critical and will be multiplied by 1.5\n+                //so we should put here bonus damage mult /1.5\n+                //Ruin: 50% additional crit damage bonus for Destruction spells\n+                if (lvl >= 20 && spellInfo->SpellFamilyName == SPELLFAMILY_WARLOCK &&\n+                    ((spellInfo->SpellFamilyFlags[0] & 0x13E5) || (spellInfo->SpellFamilyFlags[1] & 0xC310C0)))\n+                    pctbonus += 0.333f;\n+                //Pandemic part 2,3: crit damage for periodics and haunt\n+                if ((GetSpec() == BOT_SPEC_WARLOCK_AFFLICTION) &&\n+                    lvl >= 50 && spellInfo->SpellFamilyName == SPELLFAMILY_WARLOCK &&\n+                    ((spellInfo->SpellFamilyFlags[0] & 0x2) || (spellInfo->SpellFamilyFlags[1] & 0x40100)))\n+                    pctbonus += 0.333f;\n+                //Glyph of Searing Pain: 20% additional crit damage bonus for Searing Pain\n+                if (lvl >= 18 && baseId == SEARING_PAIN_1)\n+                    pctbonus += 0.133f;\n+            }\n+            //Improved Shadow Bolt and Incinerate (38393): 6% bonus damage for Shadow bolt and Incinerate\n+            if (baseId == SHADOW_BOLT_1 || baseId == INCINERATE_1)\n+                pctbonus += 0.06f;\n+            //Glyph of Incinerate: 5% bonus damage for Incinerate\n+            if (baseId == INCINERATE_1)\n+                pctbonus += 0.05f;\n+            //Improved Immolate: 30% bonus damage for Immolate\n+            if ((GetSpec() == BOT_SPEC_WARLOCK_DESTRUCTION) && lvl >= 30 && baseId == IMMOLATE_1)\n+                pctbonus += 0.3f;\n+            //EmberStorm part 1: 15% bonus damage for Fire spells\n+            if ((GetSpec() == BOT_SPEC_WARLOCK_DESTRUCTION) &&\n+                lvl >= 35 && spellInfo->SpellFamilyName == SPELLFAMILY_WARLOCK &&\n+                ((spellInfo->SpellFamilyFlags[0] & 0x364) || (spellInfo->SpellFamilyFlags[1] & 0x8200C0)))\n+                pctbonus += 0.15f;\n+            //Fire and Brimstone part 1: 10% bonus damage for Incinerate and Chaos Bolt\n+            if ((GetSpec() == BOT_SPEC_WARLOCK_DESTRUCTION) &&\n+                lvl >= 55 && (baseId == INCINERATE_1 || baseId == CHAOS_BOLT_1) &&\n+                damageinfo.target->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_WARLOCK, 0x4, 0x0, 0x0, me->GetGUID()))\n+                pctbonus += 0.1f;\n+            //Molten Core part 1: 18% bonus damage for Incinerate and Soul Fire\n+            if ((GetSpec() == BOT_SPEC_WARLOCK_DESTRUCTION) &&\n+                lvl >= 35 && (baseId == INCINERATE_1 || baseId == SOUL_FIRE_1))\n+            {\n+                if (me->HasAura(MOLTEN_CORE_BUFF))\n+                    pctbonus += 0.18f;\n+            }\n+            //Improved Corruption part 1: 10% bonus damage for Corruption\n+            if (lvl >= 10 && baseId == CORRUPTION_1)\n+                pctbonus += 0.1f;\n+            //Corruption (28829): 12% bonus damage for Corruption\n+            if (lvl >= 40 && baseId == CORRUPTION_1)\n+                pctbonus += 0.12f;\n+            //Malediction part 1: 3% bonus damage for All spells\n+            if ((GetSpec() == BOT_SPEC_WARLOCK_AFFLICTION) && lvl >= 45)\n+                pctbonus += 0.03f;\n+            //Death's Embrace part 2: 12% bonus damage for Shadow spells on targets below 35 pct health\n+            if ((GetSpec() == BOT_SPEC_WARLOCK_AFFLICTION) &&\n+                lvl >= 50 && damageinfo.target->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT) &&\n+                ((spellInfo->SpellFamilyFlags[0] & 0x8248B) || (spellInfo->SpellFamilyFlags[1] & 0x59913)))\n+                pctbonus += 0.12f;\n+\n+            //Empowered Corruption: 36% spellpower bonus for Corruption\n+            if (lvl >= 25 && baseId == CORRUPTION_1)\n+                fdamage += me->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_MAGIC) * 0.36f * me->CalculateDefaultCoefficient(spellInfo, DOT) * me->CalculateLevelPenalty(spellInfo);\n+            //Shadow and Flame: 20% spellpower bonus for Shadow Bolt, Shadowburn, Chaos Bolt and Incineration\n+            if ((GetSpec() == BOT_SPEC_WARLOCK_DESTRUCTION) && lvl >= 45 &&\n+                (baseId == SHADOW_BOLT_1 || baseId == CHAOS_BOLT_1 || baseId == SHADOWBURN_1 || baseId == INCINERATE_1))\n+                fdamage += me->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_MAGIC) * 0.2f * me->CalculateDefaultCoefficient(spellInfo, SPELL_DIRECT_DAMAGE) * me->CalculateLevelPenalty(spellInfo);\n+            //Everlasting Affliction part 1: 5% spellpower bonus for Corruption and Unstable Affliction\n+            if ((GetSpec() == BOT_SPEC_WARLOCK_AFFLICTION) &&\n+                lvl >= 55 && (baseId == CORRUPTION_1 || baseId == UNSTABLE_AFFLICTION_1))\n+                fdamage += me->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_MAGIC) * 0.05f * me->CalculateDefaultCoefficient(spellInfo, DOT) * me->CalculateLevelPenalty(spellInfo);\n+\n+            //Firestone/Spellstone: 1% bonus damage for all spells\n+            if (lvl >= 28)\n+                pctbonus += 0.01f;\n+\n+            //Improved Shadow Bolt part 1: 10% bonus damage for Shadow Bolt\n+            if (lvl >= 10 && baseId == SHADOW_BOLT_1)\n+                pctbonus += 0.1f;\n+            //Improved Corruption and Immolate (Updated) (61992): 5% bonus damage for Corruption and Immolate\n+            if (lvl >= 10 && (baseId == CORRUPTION_1 || baseId == IMMOLATE_1))\n+                pctbonus += 0.05f;\n+            //Improved Curse of Agony: 10% bonus damage for Curse of Agony\n+            if (lvl >= 10 && baseId == CURSE_OF_AGONY_1)\n+                pctbonus += 0.1f;\n+            //Shadow Mastery: 15% bonus damage for Shadow Spells\n+            if ((GetSpec() == BOT_SPEC_WARLOCK_AFFLICTION) &&\n+                lvl >= 35 && ((spellInfo->SpellFamilyFlags[0] & 0x80091) || spellInfo->SpellFamilyFlags[1] & 0x451910))\n+                pctbonus += 0.15f;\n+            //Contagion: 5% bonus damage for Curse of Agony, Corruption and Seed of Corruption\n+            if ((GetSpec() == BOT_SPEC_WARLOCK_AFFLICTION) &&\n+                lvl >= 40 && (baseId == CORRUPTION_1 || baseId == SEED_OF_CORRUPTION_1 ||\n+                baseId == SEED_OF_CORRUPTION_FINAL_DAMAGE_1 || baseId == CURSE_OF_AGONY_1))\n+                pctbonus += 0.05f;\n+\n+            //Warlock T82P Bonus (64931): 20/10% bonus damage for Unstable Affliction and Immolate\n+            if (lvl >= 80 && baseId == UNSTABLE_AFFLICTION_1)\n+                pctbonus += 0.2f;\n+            if (lvl >= 80 && baseId == IMMOLATE_1)\n+                pctbonus += 0.1f;\n+            //Warlock T94P Bonus (67231): 10% bonus damage for Immolate, Corruption and Unstable Affliction\n+            if (lvl >= 80 && (baseId == IMMOLATE_1 || baseId == CORRUPTION_1 || baseId == UNSTABLE_AFFLICTION_1))\n+                pctbonus += 0.2f;\n+\n+            //Glyph of Immolate: 10% bonus damage for Immolate\n+            if (lvl >= 15 && baseId == IMMOLATE_1)\n+                pctbonus += 0.1f;\n+\n+            //Demonic Pact part 1: 10% bonus damage for all spells\n+            if ((GetSpec() == BOT_SPEC_WARLOCK_DEMONOLOGY) && lvl >= 55)\n+                pctbonus *= 1.1f;\n+            //Master Demonologist part 1.1 (me): 5% bonus damage for Fire spells\n+            if ((GetSpec() == BOT_SPEC_WARLOCK_DEMONOLOGY) &&\n+                lvl >= 35 && botPet && myPetType == BOT_PET_IMP && (spellInfo->GetSchoolMask() & SPELL_SCHOOL_MASK_FIRE))\n+                pctbonus *= 1.05f;\n+            //Master Demonologist part 3.1 (me): 5% bonus damage for Shadow spells\n+            if ((GetSpec() == BOT_SPEC_WARLOCK_DEMONOLOGY) &&\n+                lvl >= 35 && botPet && myPetType == BOT_PET_SUCCUBUS && (spellInfo->GetSchoolMask() & SPELL_SCHOOL_MASK_SHADOW))\n+                pctbonus *= 1.05f;\n+\n+            damage = int32(fdamage * pctbonus);\n+        }\n+\n+        void ApplyClassDamageMultiplierHeal(Unit const* /*victim*/, float& heal, SpellInfo const* spellInfo, DamageEffectType /*damagetype*/, uint32 /*stack*/) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+            float pctbonus = 0.0f;\n+\n+            //Glyph of Siphon Life: 25% bonus healing for Siphon Life effect (50% for bots)\n+            if (baseId == SIPHON_LIFE_HEAL)\n+                pctbonus += 0.5f;\n+            //Improved Death Coil (30052): 30% bonus healing for Death Coil\n+            if (lvl >= 60 && baseId == DEATH_COIL_1)\n+                pctbonus += 0.3f;\n+\n+            heal = heal * (1.0f + pctbonus);\n+        }\n+\n+        void ApplyClassSpellCostMods(SpellInfo const* spellInfo, int32& cost) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            float fcost = float(cost);\n+            float pctbonus = 0.0f;\n+\n+            //pct mods\n+            //Doomcaller Reduced Shadow Bolt Cost (26117): -15% mana cost for Shadow Bolt\n+            if (baseId == SHADOW_BOLT_1)\n+                pctbonus += 0.15f;\n+            //Glyph of Shadow Bolt: -10% mana cost for Shadow Bolt\n+            if (lvl >= 15 && baseId == SHADOW_BOLT_1)\n+                pctbonus += 0.1f;\n+            //Cataclysm: -10% mana cost for Destruction spells\n+            if (lvl >= 15 && spellInfo->SpellFamilyName == SPELLFAMILY_WARLOCK &&\n+                ((spellInfo->SpellFamilyFlags[0] & 0x3E5) || (spellInfo->SpellFamilyFlags[1] & 0x8310C0)))\n+                pctbonus += 0.1f;\n+            //Suppression: -6% mana cost for Affliction spells\n+            if (lvl >= 10 && spellInfo->SpellFamilyName == SPELLFAMILY_WARLOCK &&\n+                ((spellInfo->SpellFamilyFlags[0] & 0x814CC41A) || (spellInfo->SpellFamilyFlags[1] & 0x248F1B)))\n+                pctbonus += 0.06f;\n+\n+            //cost can be < 0\n+            cost = int32(fcost * (1.0f - pctbonus));\n+        }\n+\n+        void ApplyClassSpellCastTimeMods(SpellInfo const* spellInfo, int32& casttime) const override\n+        {\n+            //casttime is in milliseconds\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            int32 timebonus = 0;\n+            float pctbonus = 0.0f;\n+\n+            //100% mods\n+            //Backlash: -100% cast time for Shadow Bolt or Incinerate\n+            if (lvl >= 15 && (baseId == SHADOW_BOLT_1 || baseId == INCINERATE_1))\n+            {\n+                backlash = me->HasAura(BACKLASH_BUFF);\n+                shadowtrance = (baseId == SHADOW_BOLT_1 && me->HasAura(SHADOW_TRANCE_BUFF));\n+                if (backlash || shadowtrance)\n+                    timebonus += casttime;\n+            }\n+            //Improved Howl of Terror: -1.5sec (-100%) cast time for Howl of Terror\n+            if ((GetSpec() == BOT_SPEC_WARLOCK_AFFLICTION) && lvl >= 45 && baseId == HOWL_OF_TERROR_1)\n+                timebonus += casttime;\n+            //Chaotic Mind (custom)\n+            if (baseId == SOUL_FIRE_1)\n+            {\n+                chaoticmind = me->HasAura(CHAOTIC_MIND_BUFF);\n+                if (chaoticmind)\n+                    timebonus += casttime;\n+            }\n+\n+            //pct mods\n+            //BackDraft part 1: -30% cast time for Destruction spells\n+            if (lvl >= 50 && spellInfo->SpellFamilyName == SPELLFAMILY_WARLOCK &&\n+                ((spellInfo->SpellFamilyFlags[0] & 0x165) || (spellInfo->SpellFamilyFlags[1] & 0x310C0)))\n+            {\n+                //skip soul fire insta cast\n+                backdraft = me->HasAura(BACKDRAFT_BUFF) && !(chaoticmind && baseId == SOUL_FIRE_1);\n+                if (backdraft)\n+                    pctbonus += 0.3f;\n+            }\n+            //Molten Core part 2.1: -30% cast time for Incinerate\n+            if (lvl >= 35 && baseId == INCINERATE_1)\n+            {\n+                moltencore = me->HasAura(MOLTEN_CORE_BUFF);\n+                if (moltencore)\n+                    pctbonus += 0.3f;\n+            }\n+            //Decimation: -40% cast time for Soul Fire\n+            if (baseId == SOUL_FIRE_1 && me->HasAura(DECIMATION_BUFF))\n+                pctbonus += 0.4f;\n+\n+            //flat mods\n+            //Bane: -0.5 sec cast time for Shadow Bolt, Immolate and Chaos Bolt, -2 sec cast for Soul Fire\n+            if (lvl >= 10)\n+            {\n+                if (baseId == SHADOW_BOLT_1 || baseId == IMMOLATE_1 || baseId == CHAOS_BOLT_1)\n+                    timebonus += 500;\n+                else if (baseId == SOUL_FIRE_1)\n+                    timebonus += 2000;\n+            }\n+            //EmberStorm part 2: -0.25 sec cast time for Incinerate\n+            if ((GetSpec() == BOT_SPEC_WARLOCK_DESTRUCTION) && lvl >= 35 && baseId == INCINERATE_1)\n+                timebonus += 250;\n+            //Glyph of Unstable Affliction: -0.2 sec cast time for Unstable Affliction\n+            if (lvl >= 50 && baseId == UNSTABLE_AFFLICTION_1)\n+                timebonus += 200;\n+            //Fear Cast Time Reduction (23047): -0.2 sec cast time for Fear\n+            if (baseId == FEAR_1)\n+                timebonus += 200;\n+\n+            casttime = std::max<int32>((float(casttime) * (1.0f - pctbonus)) - timebonus, 0);\n+\n+            instaCast = (casttime <= 500); //triggered GCD is too long\n+        }\n+\n+        void ApplyClassSpellNotLoseCastTimeMods(SpellInfo const* spellInfo, int32& delayReduce) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchoolMask schools = spellInfo->GetSchoolMask();\n+            uint8 lvl = me->GetLevel();\n+            int32 reduceBonus = 0;\n+\n+            if (lvl >= 20 && (/*baseId == DRAIN_LIFE_1 || */baseId == DRAIN_MANA_1 || baseId == DRAIN_SOUL_1 || baseId == UNSTABLE_AFFLICTION_1 || baseId == HAUNT_1))\n+                reduceBonus += 70;\n+\n+            if (GetSpec() == BOT_SPEC_WARLOCK_DESTRUCTION && lvl >= 25)\n+            {\n+                switch (baseId)\n+                {\n+                    case CHAOS_BOLT_1: case HELLFIRE_1: case IMMOLATE_1: case INCINERATE_1: case RAIN_OF_FIRE_1:\n+                    case SEARING_PAIN_1: case SHADOW_BOLT_1: case SOUL_FIRE_1: case SHADOWBURN_1: case SHADOWFURY_1:\n+                        reduceBonus += 70;\n+                        break;\n+                    default:\n+                        break;\n+                }\n+            }\n+\n+            delayReduce += reduceBonus;\n+        }\n+\n+        void ApplyClassSpellCooldownMods(SpellInfo const* /*spellInfo*/, uint32& cooldown) const override\n+        {\n+            //cooldown is in milliseconds\n+            //uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            //uint8 lvl = me->GetLevel();\n+            int32 timebonus = 0;\n+            float pctbonus = 0.0f;\n+\n+            //pct mods\n+            //Glyph of Rapid Charge: -7% cooldown for Charge\n+            //if (lvl >= 40 && spellId == GetSpell(CHARGE_1))\n+            //    pctbonus += 0.07f;\n+\n+            //flat mods\n+\n+            cooldown = std::max<int32>((float(cooldown) * (1.0f - pctbonus)) - timebonus, 0);\n+        }\n+\n+        void ApplyClassSpellCategoryCooldownMods(SpellInfo const* spellInfo, uint32& cooldown) const override\n+        {\n+            //cooldown is in milliseconds\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            int32 timebonus = 0;\n+            float pctbonus = 0.0f;\n+\n+            //Glyph of Chaos Bolt: -2 sec cooldown for Chaos Bolt\n+            if (lvl >= 60 && baseId == CHAOS_BOLT_1)\n+                timebonus += 2000;\n+            //Improved Death Coil (24487): -15% cooldown for Death Coil (30 sec for bots)\n+            if (baseId == DEATH_COIL_1)\n+                timebonus += 30000;\n+            //Glyph of Howl of Terror: -8 sec cooldown for Howl of Terror\n+            if (lvl >= 45 && baseId == HOWL_OF_TERROR_1)\n+                timebonus += 8000;\n+\n+            cooldown = std::max<int32>((float(cooldown) * (1.0f - pctbonus)) - timebonus, 0);\n+        }\n+\n+        void ApplyClassSpellGlobalCooldownMods(SpellInfo const* spellInfo, float& cooldown) const override\n+        {\n+            //cooldown is in milliseconds\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            float timebonus = 0.0f;\n+            float pctbonus = 0.0f;\n+\n+            //pct mods\n+            //BackDraft: -30% global cooldown for Destruction spells\n+            if ((GetSpec() == BOT_SPEC_WARLOCK_DESTRUCTION) &&\n+                lvl >= 50 && spellInfo->SpellFamilyName == SPELLFAMILY_WARLOCK &&\n+                ((spellInfo->SpellFamilyFlags[0] & 0x165) || (spellInfo->SpellFamilyFlags[1] & 0x310C0)) &&\n+                me->HasAura(BACKDRAFT_BUFF))\n+                pctbonus += 0.3f;\n+\n+            //flat mods\n+            //Amplify Curse: -0.5 sec global cooldown for Curses\n+            if (lvl >= 20 && spellInfo->SpellFamilyName == SPELLFAMILY_WARLOCK &&\n+                ((spellInfo->SpellFamilyFlags[0] & 0x408400) || (spellInfo->SpellFamilyFlags[1] & 0x200202) ||\n+                (spellInfo->SpellFamilyFlags[2] & 0x800)))\n+                timebonus += 500.f;\n+\n+            //Fear Cast Time Reduction (23047): -0.2 sec global cooldown for Fear\n+            if (baseId == FEAR_1)\n+                timebonus += 200;\n+\n+            cooldown = (cooldown * (1.0f - pctbonus)) - timebonus;\n+        }\n+\n+        void ApplyClassSpellRadiusMods(SpellInfo const* spellInfo, float& radius) const override\n+        {\n+            //uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            float flatbonus = 0.0f;\n+            float pctbonus = 0.0f;\n+\n+            //pct mods\n+\n+            //flat mods\n+            //Improved Rain of Fire / Hellfire\n+            if (lvl >= 40 && (spellInfo->SpellFamilyFlags[0] & 0x60))\n+                flatbonus += 2.f;\n+\n+            radius = radius * (1.0f + pctbonus) + flatbonus;\n+        }\n+\n+        void ApplyClassSpellRangeMods(SpellInfo const* spellInfo, float& maxrange) const override\n+        {\n+            //uint32 spellId = spellInfo->Id;\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            float flatbonus = 0.0f;\n+            float pctbonus = 0.0f;\n+\n+            //pct mods\n+            //Grim Reach: +20% range for Affliction Spells\n+            if (lvl >= 25 && ((spellInfo->SpellFamilyFlags[0] & 0x8048C41A) || (spellInfo->SpellFamilyFlags[1] & 0x40713)))\n+                pctbonus += 0.2f;\n+            //Destructive Reach: +20% range for Destruction Spells\n+            if (lvl >= 25 && ((spellInfo->SpellFamilyFlags[0] & 0x13A5) || (spellInfo->SpellFamilyFlags[1] & 0x8210C0)))\n+                pctbonus += 0.2f;\n+\n+            //flat mods\n+            //Glyph of Curse of Exhaustion: +5 yd range for Curse of Exhaustion\n+            if (lvl >= 70 && baseId == CURSE_OF_EXHAUSTION_1)\n+                flatbonus += 5.f;\n+\n+            maxrange = maxrange * (1.0f + pctbonus) + flatbonus;\n+        }\n+\n+        void OnClassSpellGo(SpellInfo const* spellInfo) override\n+        {\n+            //uint32 spellId = spellInfo->Id;\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+\n+            //Instacast buffs handling\n+            if (baseId == SHADOW_BOLT_1)\n+            {\n+                if (backlash)\n+                    me->RemoveAurasDueToSpell(BACKLASH_BUFF);\n+                else if (shadowtrance)\n+                    me->RemoveAurasDueToSpell(SHADOW_TRANCE_BUFF);\n+            }\n+            if (baseId == INCINERATE_1)\n+            {\n+                if (backlash)\n+                    me->RemoveAurasDueToSpell(BACKLASH_BUFF);\n+            }\n+            if (chaoticmind && baseId == SOUL_FIRE_1)\n+                me->RemoveAurasDueToSpell(CHAOTIC_MIND_BUFF);\n+\n+            //Backdraft\n+            if (backdraft && spellInfo->SpellFamilyName == SPELLFAMILY_WARLOCK &&\n+                ((spellInfo->SpellFamilyFlags[0] & 0x165) || (spellInfo->SpellFamilyFlags[1] & 0x310C0)))\n+            {\n+                if (Aura* bd = me->GetAura(BACKDRAFT_BUFF))\n+                    bd->DropCharge();\n+            }\n+            //Molten Core\n+            if (moltencore && (baseId == INCINERATE_1 || baseId == SOUL_FIRE_1))\n+            {\n+                if (Aura* mc = me->GetAura(MOLTEN_CORE_BUFF))\n+                    mc->DropCharge();\n+            }\n+            //Decimation: NOT DROPPED ON CAST\n+            //if (baseId == SOUL_FIRE_1)\n+            //{\n+            //    if (Aura* mc = me->GetAura(DECIMATION_BUFF))\n+            //        mc->DropCharge();\n+            //}\n+            longCasted = !instaCast &&\n+                (baseId == SHADOW_BOLT_1 || baseId == INCINERATE_1 || baseId == CHAOS_BOLT_1 ||\n+                baseId == SOUL_FIRE_1 || baseId == HAUNT_1 || baseId == SEARING_PAIN_1); //damaging spells\n+        }\n+\n+        void SpellHit(Unit* wcaster, SpellInfo const* spell) override\n+        {\n+            Unit* caster = wcaster->ToUnit();\n+            if (!caster)\n+                return;\n+\n+            uint32 spellId = spell->Id;\n+            uint32 baseId = spell->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+\n+            //Shadow Ward helper\n+            if (!canShadowWard && (spell->GetSchoolMask() & SPELL_SCHOOL_MASK_SHADOW) &&\n+                (spell->HasEffect(SPELL_EFFECT_SCHOOL_DAMAGE) || spell->HasAura(SPELL_AURA_PERIODIC_DAMAGE)))\n+                canShadowWard = true;\n+\n+            //Create Healthstone trigger\n+            if (baseId == CREATE_HEALTHSTONE_1)\n+            {\n+                hasHealthstone = true;\n+            }\n+            //Create Soulstone trigger\n+            if (baseId == CREATE_SOULSTONE_1)\n+            {\n+                hasSoulstone = true;\n+            }\n+\n+            //Glyph of Soul Link: +5% increased effect\n+            if (baseId == SOUL_LINK_PET)\n+            {\n+                if (AuraEffect* link = me->GetAuraEffect(spellId, 0))\n+                    link->ChangeAmount(link->GetAmount() + 5);\n+            }\n+\n+            //Life Tap energize\n+            if (baseId == LIFE_TAP_1)\n+            {\n+                //level * 3 based on in-game tooltip and spellwork (BasePoints = 2000 + Level * 4,00)\n+                int32 damage = spell->Effects[0].CalcValue(me);\n+                int32 manaGain = damage;\n+                //damage += int32(me->GetLevel() * 3);\n+                manaGain += 0.5f * me->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_MAGIC);\n+\n+                //Life Tap (id: 28830)\n+                //damage = int32(float(damage) * 0.88f);\n+                //Improved Life Tap\n+                if (me->GetLevel() >= 15)\n+                    manaGain = int32(float(manaGain) * 1.2f);\n+\n+                me->ModifyHealth(-damage);\n+                //CastSpellExtraArgs args;\n+                //args.AddSpellBP0(manaGain);\n+                //me->CastSpell(me, LIFE_TAP_ENERGIZE, args);\n+                me->CastCustomSpell(me, LIFE_TAP_ENERGIZE, &manaGain, nullptr, nullptr, false);\n+\n+                //Mana Feed\n+                if ((GetSpec() == BOT_SPEC_WARLOCK_DEMONOLOGY) && me->GetLevel() >= 35 && botPet)\n+                    me->EnergizeBySpell(botPet, LIFE_TAP_ENERGIZE_PET, manaGain, POWER_MANA);\n+            }\n+\n+            //Glyph of Life Tap trigger\n+            if (baseId == GLYPH_LIFE_TAP_BUFF)\n+                SetShouldUpdateStats();\n+\n+            if (baseId == DEMON_ARMOR_1 || baseId == FEL_ARMOR_1)\n+            {\n+                if (Aura* armo = me->GetAura(spellId, me->GetGUID()))\n+                {\n+                    //Armors duration\n+                    uint32 dur = 1 * HOUR * IN_MILLISECONDS;\n+                    armo->SetDuration(dur);\n+                    armo->SetMaxDuration(dur);\n+\n+                    //Demonic Aegis\n+                    if (lvl >= 20)\n+                    {\n+                        for (auto i : NPCBots::index_array<uint8, MAX_SPELL_EFFECTS>)\n+                            if (AuraEffect* eff = armo->GetEffect(i))\n+                                eff->ChangeAmount(eff->GetAmount() * 13 / 10);\n+                    }\n+                }\n+            }\n+            //Chaotic Mind (custom)\n+            if (baseId == CHAOTIC_MIND)\n+            {\n+                if (Aura* mind = me->GetAura(spellId))\n+                {\n+                    uint32 dur = 30000; //30 sec\n+                    mind->SetDuration(dur);\n+                    mind->SetMaxDuration(dur);\n+                }\n+            }\n+            OnSpellHit(caster, spell);\n+        }\n+\n+        void SpellHitTarget(Unit* wtarget, SpellInfo const* spell) override\n+        {\n+            Unit* target = wtarget->ToUnit();\n+            if (!target)\n+                return;\n+\n+            uint32 spellId = spell->Id;\n+            uint32 baseId = spell->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+\n+            //Soulstone resurrection trigger (not ranked)\n+            if (spellId == SOULSTONE_RESURRECTION_1 || spellId == SOULSTONE_RESURRECTION_2 ||\n+                spellId == SOULSTONE_RESURRECTION_3 || spellId == SOULSTONE_RESURRECTION_4 ||\n+                spellId == SOULSTONE_RESURRECTION_5 || spellId == SOULSTONE_RESURRECTION_6 ||\n+                spellId == SOULSTONE_RESURRECTION_7)\n+            {\n+                hasSoulstone = false;\n+                //reduced for bot\n+                //soulstoneTimer = 15 * MINUTE * IN_MILLISECONDS;\n+                soulstoneTimer = 10 * MINUTE * IN_MILLISECONDS;\n+            }\n+\n+            //Improved Imp part 3\n+            if (lvl >= 10 && baseId == BLOOD_PACT_1 && botPet)\n+            {\n+                AuraEffect* pact = target->GetAuraEffect(spellId, 0, botPet->GetGUID());\n+                if (pact)\n+                    pact->ChangeAmount(pact->GetAmount() * 1.3f);\n+            }\n+\n+            //Improved Felhunter part 3\n+            if ((GetSpec() == BOT_SPEC_WARLOCK_AFFLICTION) && lvl >= 35 && baseId == FEL_INTELLIGENCE_1 && botPet)\n+            {\n+                Aura const* feli = target->GetAura(spellId, botPet->GetGUID());\n+                if (feli)\n+                {\n+                    for (auto i : NPCBots::index_array<uint8, EFFECT_2>) // 2 effects\n+                    {\n+                        if (AuraEffect* effi = feli->GetEffect(i))\n+                            effi->ChangeAmount(effi->GetAmount() + effi->GetAmount() / 10);\n+                    }\n+                }\n+            }\n+\n+            //Glyph of Unending Breath: swim speed\n+            if (/*lvl >= 15 && */baseId == UNENDING_BREATH_1)\n+            {\n+                AuraEffect* brea = target->GetAuraEffect(spellId, 1, me->GetGUID());\n+                if (brea)\n+                    brea->ChangeAmount(brea->GetAmount() + 20);\n+            }\n+\n+            //Chaotic Mind (custom)\n+            if (lvl >= 60 && target != me && GetSpec() != BOT_SPEC_WARLOCK_AFFLICTION &&\n+                spell->SpellFamilyName == SPELLFAMILY_WARLOCK && !spell->IsPositive())\n+            {\n+                if (urand(1,100) <= 5)\n+                    me->CastSpell(me, CHAOTIC_MIND, true);\n+            }\n+            if (baseId == IMMOLATE_1 || baseId == CORRUPTION_1)\n+            {\n+                if (Aura* per = target->GetAura(spellId, me->GetGUID()))\n+                {\n+                    //Improved Corruption and Immolate (37380): +3 sec duration for Immolate and Corruption\n+                    uint32 dur = per->GetDuration() + 3000;\n+                    //Molten Core: + 9 sec duration for Immolate\n+                    if ((GetSpec() == BOT_SPEC_WARLOCK_DESTRUCTION) && lvl >= 35 && baseId == IMMOLATE_1)\n+                        dur += 9000;\n+                    per->SetDuration(dur);\n+                    per->SetMaxDuration(dur);\n+                }\n+            }\n+            //Glyph of Death Coil: + 0.5 sec duration for Death Coil (2 sec on creatures)\n+            if (baseId == DEATH_COIL_1)\n+            {\n+                if (Aura* dc = target->GetAura(spellId, me->GetGUID()))\n+                {\n+                    uint32 dur = dc->GetDuration() + (target->IsPlayer() ? 500 : 2000);\n+                    dc->SetDuration(dur);\n+                    dc->SetMaxDuration(dur);\n+                }\n+            }\n+            //Improved Curse of Weakness: +20% increased effect\n+            if (baseId == CURSE_OF_WEAKNESS_1)\n+            {\n+                if (AuraEffect* weak = target->GetAuraEffect(spellId, 0, me->GetGUID()))\n+                {\n+                    weak->ChangeAmount(weak->GetAmount() * 12 / 10);\n+                }\n+            }\n+            //Glyph of Haunt: +3% increased effect\n+            if (lvl >= 60 && baseId == HAUNT_1)\n+            {\n+                if (AuraEffect* haun = target->GetAuraEffect(spellId, 2, me->GetGUID()))\n+                {\n+                    haun->ChangeAmount(haun->GetAmount() + 3);\n+                }\n+            }\n+\n+            OnSpellHitTarget(target, spell);\n+        }\n+\n+        void DamageDealt(Unit* victim, uint32& damage, DamageEffectType damageType, SpellSchoolMask damageSchoolMask) override\n+        {\n+            //Fel Synergy (Life Tap)\n+            if (damage && botPet && me->GetLevel() >= 10 && (damageType == SPELL_DIRECT_DAMAGE || damageType == DOT))\n+            {\n+                uint32 healVal = float(damage) * 0.15f;\n+                if (healVal)\n+                {\n+                    SpellInfo const* synhealInfo = sSpellMgr->GetSpellInfo(FEL_SYNERGY_HEAL);\n+                    HealInfo hinfo(me, botPet, healVal, synhealInfo, synhealInfo->GetSchoolMask());\n+                    botPet->HealBySpell(hinfo);\n+                }\n+            }\n+\n+            bot_ai::DamageDealt(victim, damage, damageType, damageSchoolMask);\n+        }\n+\n+        void DamageTaken(Unit* u, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellSchoolMask /*schoolMask*/) override\n+        {\n+            if (!u)\n+                return;\n+            if (!u->IsInCombat() && !me->IsInCombat())\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void OwnerAttackedBy(Unit* u) override\n+        {\n+            if (!u)\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void SummonBotPet()\n+        {\n+            if (botPet)\n+                UnsummonAll(false);\n+\n+            if (myPetType == BOT_PET_INVALID) //disabled\n+                return;\n+\n+            if (petSummonTimer > GetLastDiff())\n+                return;\n+\n+            uint32 entry;\n+\n+            if (myPetType)\n+                entry = myPetType;\n+            else if (me->GetLevel() >= 50 && GetSpec() == BOT_SPEC_WARLOCK_DEMONOLOGY)\n+                entry = BOT_PET_FELGUARD;\n+            else if (!IAmFree())\n+            {\n+                if (me->GetLevel() >= 30 && master->GetMaxPower(POWER_MANA) > 1 &&\n+                    !master->GetBotMgr()->HasBotClass(BOT_CLASS_MAGE) &&\n+                    !master->GetBotMgr()->HasBotClass(BOT_CLASS_PRIEST) &&\n+                    !master->GetBotMgr()->HasBotPetType(BOT_PET_FELHUNTER))\n+                    entry = BOT_PET_FELHUNTER;\n+                else if ((me->GetLevel() < 68 || !master->GetBotMgr()->HasBotClass(BOT_CLASS_WARRIOR)) &&\n+                    !master->GetBotMgr()->HasBotPetType(BOT_PET_IMP))\n+                    entry = BOT_PET_IMP;\n+                else if (me->GetLevel() >= 10 && IsTank())\n+                    entry = BOT_PET_VOIDWALKER;\n+                else if (me->GetLevel() >= 20 && !IsMeleeClass(master->GetClass()))\n+                    entry = BOT_PET_SUCCUBUS;\n+                else if (me->GetLevel() >= 10)\n+                    entry = BOT_PET_VOIDWALKER;\n+                else\n+                    entry = BOT_PET_IMP;\n+            }\n+            else\n+                entry = urand(BOT_PET_WARLOCK_START, BOT_PET_WARLOCK_END);\n+\n+            //ensurance\n+            if ((entry == BOT_PET_VOIDWALKER && me->GetLevel() < 10) ||\n+                (entry == BOT_PET_SUCCUBUS && me->GetLevel() < 20) ||\n+                (entry == BOT_PET_FELHUNTER && me->GetLevel() < 30) ||\n+                (entry == BOT_PET_FELGUARD && (me->GetLevel() < 50 || _spec != BOT_SPEC_WARLOCK_DEMONOLOGY)) ||\n+                (entry != BOT_PET_IMP && entry != BOT_PET_VOIDWALKER && entry != BOT_PET_SUCCUBUS &&\n+                entry != BOT_PET_FELHUNTER && entry != BOT_PET_FELGUARD))\n+                entry = 0;\n+\n+            myPetType = entry;\n+\n+            //try next time\n+            if (!myPetType)\n+                return;\n+\n+            ResetSpellCooldown(BLOOD_PACT_1);\n+            ResetSpellCooldown(FEL_INTELLIGENCE_1);\n+\n+            Position pos;\n+\n+            me->CastSpell(me, SUMMON_DEMON_VISUAL, true);\n+            Creature* myPet = me->SummonCreature(myPetType, *me, TEMPSUMMON_CORPSE_DESPAWN);\n+            me->GetNearPoint(myPet, pos.m_positionX, pos.m_positionY, pos.m_positionZ, 0.f, 0, me->GetOrientation() + M_PI / 2);\n+            myPet->GetMotionMaster()->MovePoint(me->GetMapId(), pos);\n+            myPet->SetCreator(master);\n+            myPet->SetOwnerGUID(me->GetGUID());\n+            myPet->SetFaction(master->GetFaction());\n+            myPet->SetControlledByPlayer(!IAmFree());\n+            myPet->SetPvP(me->IsPvP());\n+            myPet->SetByteValue(UNIT_FIELD_BYTES_2, 1, master->GetByteValue(UNIT_FIELD_BYTES_2, 1));\n+\n+            //fix scale and equips\n+            switch (myPetType)\n+            {\n+                case BOT_PET_FELHUNTER:\n+                    myPet->SetObjectScale(1.1f);\n+                    break;\n+                case BOT_PET_FELGUARD:\n+                    myPet->SetObjectScale(0.75f);\n+                    myPet->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, 22199);\n+                    break;\n+            }\n+\n+            botPet = myPet;\n+        }\n+\n+        void UnsummonAll(bool savePets = true) override\n+        {\n+            UnsummonPet(savePets);\n+        }\n+\n+        void SummonedCreatureDies(Creature* /*summon*/, Unit* /*killer*/) override\n+        {\n+        }\n+\n+        void SummonedCreatureDespawn(Creature* summon) override\n+        {\n+            //all warlock bot pets despawn at death or manually (gossip, teleport, etc.)\n+            //BOT_LOG_ERROR(\"entities.unit\", \"SummonedCreatureDespawn: %s's %s\", me->GetName().c_str(), summon->GetName().c_str());\n+            if (summon == botPet)\n+            {\n+                petSummonTimer = 10000;\n+                botPet = nullptr;\n+\n+                //party aura hack removal helper\n+                switch (summon->GetEntry())\n+                {\n+                    case BOT_PET_IMP:\n+                        me->RemoveAurasDueToSpell(InitSpell(me, BLOOD_PACT_1));\n+                        break;\n+                    case BOT_PET_FELHUNTER:\n+                        me->RemoveAurasDueToSpell(InitSpell(me, FEL_INTELLIGENCE_1));\n+                        break;\n+                }\n+            }\n+        }\n+\n+        float GetSpellAttackRange(bool longRange) const override\n+        {\n+            return longRange ? CalcSpellMaxRange(SHADOW_BOLT_1) : 20.f;\n+        }\n+\n+        uint32 GetAIMiscValue(uint32 data) const override\n+        {\n+            switch (data)\n+            {\n+                case CREATE_HEALTHSTONE_1:\n+                    return uint32(hasHealthstone);\n+                case BOTAI_MISC_PET_TYPE:\n+                    return myPetType;\n+                case BOTAI_MISC_PET_AVAILABLE_1:\n+                    return BOT_PET_IMP;\n+                case BOTAI_MISC_PET_AVAILABLE_2:\n+                    return me->GetLevel() >= 10 ? BOT_PET_VOIDWALKER : 0;\n+                case BOTAI_MISC_PET_AVAILABLE_3:\n+                    return me->GetLevel() >= 20 ? BOT_PET_SUCCUBUS : 0;\n+                case BOTAI_MISC_PET_AVAILABLE_4:\n+                    return me->GetLevel() >= 30 ? BOT_PET_FELHUNTER : 0;\n+                case BOTAI_MISC_PET_AVAILABLE_5:\n+                    return me->GetLevel() >= 50 && GetSpec() == BOT_SPEC_WARLOCK_DEMONOLOGY ? BOT_PET_FELGUARD : 0;\n+                default:\n+                    return 0;\n+            }\n+        }\n+\n+        void SetAIMiscValue(uint32 data, uint32 value) override\n+        {\n+            switch (data)\n+            {\n+                case CREATE_HEALTHSTONE_1:\n+                    hasHealthstone = bool(value);\n+                    break;\n+                case BOTAI_MISC_PET_TYPE:\n+                    myPetType = value;\n+                    UnsummonAll(false);\n+                    break;\n+                default:\n+                    break;\n+            }\n+\n+            bot_ai::SetAIMiscValue(data, value);\n+        }\n+\n+        void Reset() override\n+        {\n+            UnsummonAll(false);\n+\n+            fearTimer = 0;\n+            banishTimer = 0;\n+            unbanishTimer = 0;\n+            drainManaTimer = 0;\n+            healthstoneTimer = 0;\n+            soulstoneTimer = 0;\n+            lifeTapCheckTimer = 0;\n+            curseCheckTimer = 0;\n+\n+            petSummonTimer = 5000;\n+\n+            hasHealthstone = false;\n+            hasSoulstone = false;\n+\n+            DefaultInit();\n+        }\n+\n+        void ReduceCD(uint32 diff) override\n+        {\n+            if (fearTimer > diff)                   fearTimer -= diff;\n+            if (banishTimer > diff)                 banishTimer -= diff;\n+            if (unbanishTimer > diff)               unbanishTimer -= diff;\n+            if (drainManaTimer > diff)              drainManaTimer -= diff;\n+            if (healthstoneTimer > diff)            healthstoneTimer -= diff;\n+            if (soulstoneTimer > diff)              soulstoneTimer -= diff;\n+            if (lifeTapCheckTimer > diff)           lifeTapCheckTimer -= diff;\n+            if (curseCheckTimer > diff)             curseCheckTimer -= diff;\n+\n+            if (petSummonTimer > diff)              petSummonTimer -= diff;\n+        }\n+\n+        void InitPowers() override\n+        {\n+            me->SetPowerType(POWER_MANA);\n+\n+            if (botPet && botPet->GetPowerType() != POWER_MANA)\n+                botPet->SetByteValue(UNIT_FIELD_BYTES_0, 3, POWER_MANA);\n+        }\n+\n+        void InitSpells() override\n+        {\n+            uint8 lvl = me->GetLevel();\n+            bool isAffl = GetSpec() == BOT_SPEC_WARLOCK_AFFLICTION;\n+            //bool isDemo = GetSpec() == BOT_SPEC_WARLOCK_DEMONOLOGY;\n+            bool isDest = GetSpec() == BOT_SPEC_WARLOCK_DESTRUCTION;\n+\n+            InitSpellMap(CURSE_OF_WEAKNESS_1);\n+            InitSpellMap(CURSE_OF_AGONY_1);\n+            InitSpellMap(CURSE_OF_TONGUES_1);\n+            InitSpellMap(CURSE_OF_THE_ELEMENTS_1);\n+            InitSpellMap(SHADOW_BOLT_1);\n+            InitSpellMap(IMMOLATE_1);\n+            InitSpellMap(CORRUPTION_1);\n+            InitSpellMap(SEED_OF_CORRUPTION_1);\n+            InitSpellMap(INCINERATE_1);\n+            InitSpellMap(SEARING_PAIN_1);\n+            InitSpellMap(SOUL_FIRE_1);\n+            InitSpellMap(RAIN_OF_FIRE_1);\n+            InitSpellMap(HELLFIRE_1);\n+            InitSpellMap(SHADOWFLAME_1);\n+            InitSpellMap(FEAR_1);\n+            InitSpellMap(HOWL_OF_TERROR_1);\n+            InitSpellMap(DEATH_COIL_1);\n+            InitSpellMap(SOULSHATTER_1);\n+\n+            InitSpellMap(DRAIN_SOUL_1);\n+            InitSpellMap(DRAIN_MANA_1);\n+            InitSpellMap(BANISH_1);\n+\n+            InitSpellMap(DEMON_SKIN_1);\n+            InitSpellMap(DEMON_ARMOR_1);\n+            InitSpellMap(FEL_ARMOR_1);\n+            InitSpellMap(DETECT_INVISIBILITY_1);\n+            InitSpellMap(UNENDING_BREATH_1);\n+            InitSpellMap(SHADOW_WARD_1);\n+            InitSpellMap(LIFE_TAP_1);\n+            InitSpellMap(DARK_PACT_1);\n+            InitSpellMap(CREATE_HEALTHSTONE_1);\n+            InitSpellMap(CREATE_SOULSTONE_1);\n+\n+            InitSpellMap(RITUAL_OF_SUMMONING_1); //manual only\n+            InitSpellMap(RITUAL_OF_SOULS_1); //not casted\n+\n+  /*Talent*/lvl >= 30 && isAffl ? InitSpellMap(CURSE_OF_EXHAUSTION_1) : RemoveSpell(CURSE_OF_EXHAUSTION_1);\n+  /*Talent*/lvl >= 50 && isAffl ? InitSpellMap(UNSTABLE_AFFLICTION_1) : RemoveSpell(UNSTABLE_AFFLICTION_1);\n+  /*Talent*/lvl >= 60 && isAffl ? InitSpellMap(HAUNT_1) : RemoveSpell(HAUNT_1);\n+\n+  /*Talent*/lvl >= 20 && isDest ? InitSpellMap(SHADOWBURN_1) : RemoveSpell(SHADOWBURN_1);\n+  /*Talent*/lvl >= 40 && isDest ? InitSpellMap(CONFLAGRATE_1) : RemoveSpell(CONFLAGRATE_1);\n+  /*Talent*/lvl >= 50 && isDest ? InitSpellMap(SHADOWFURY_1) : RemoveSpell(SHADOWFURY_1);\n+  /*Talent*/lvl >= 60 && isDest ? InitSpellMap(CHAOS_BOLT_1) : RemoveSpell(CHAOS_BOLT_1);\n+        }\n+\n+        void ApplyClassPassives() const override\n+        {\n+            uint8 level = master->GetLevel();\n+            bool isAffl = GetSpec() == BOT_SPEC_WARLOCK_AFFLICTION;\n+            bool isDemo = GetSpec() == BOT_SPEC_WARLOCK_DEMONOLOGY;\n+            bool isDest = GetSpec() == BOT_SPEC_WARLOCK_DESTRUCTION;\n+\n+            RefreshAura(CHAOS_BOLT_PASSIVE);\n+            RefreshAura(DEMONIC_IMMOLATE_PASSIVE);\n+\n+            RefreshAura(IMPROVED_DRAIN_SOUL, level >= 15 ? 1 : 0);\n+            RefreshAura(SOUL_SIPHON, level >= 15 ? 1 : 0);\n+            RefreshAura(IMPROVED_FEAR, level >= 20 ? 1 : 0);\n+            RefreshAura(NIGHTFALL, level >= 25 ? 1 : 0);\n+            RefreshAura(SHADOW_EMBRACE, isAffl && level >= 30 ? 1 : 0);\n+            RefreshAura(SIPHON_LIFE, isAffl && level >= 30 ? 1 : 0);\n+            RefreshAura(ERADICATION, isAffl && level >= 40 ? 1 : 0);\n+            RefreshAura(PANDEMIC, isAffl && level >= 50 ? 1 : 0);\n+            RefreshAura(EVERLASTING_AFFLICTION, isAffl && level >= 55 ? 1 : 0);\n+\n+            RefreshAura(DEMONIC_RESILIENCE, isDemo && level >= 40 ? 1 : 0);\n+            RefreshAura(DECIMATION, isDemo && level >= 45 ? 1 : 0);\n+\n+            RefreshAura(IMPROVED_SHADOW_BOLT, level >= 10 ? 1 : 0);\n+            RefreshAura(AFTERMATH, level >= 15 ? 1 : 0);\n+            RefreshAura(BACKLASH, level >= 30 ? 1 : 0);\n+            RefreshAura(MOLTEN_CORE, isDest && level >= 35 ? 1 : 0);\n+            RefreshAura(NETHER_PROTECTION, isDest && level >= 35 ? 1 : 0);\n+            RefreshAura(SOUL_LEECH, isDest && level >= 40 ? 1 : 0);\n+            RefreshAura(PYROCLASM, isDest && level >= 40 ? 1 : 0);\n+            RefreshAura(IMPROVED_SOUL_LEECH, isDest && level >= 45 ? 1 : 0);\n+            RefreshAura(BACKDRAFT, isDest && level >= 50 ? 1 : 0);\n+\n+            RefreshAura(GLYPH_CORRUPTION, level >= 15 ? 1 : 0);\n+            RefreshAura(GLYPH_LIFE_TAP, level >= 15 ? 1 : 0);\n+            RefreshAura(GLYPH_FEAR, level >= 15 ? 1 : 0);\n+            RefreshAura(GLYPH_QUICK_DECAY, level >= 15 ? 1 : 0);\n+            RefreshAura(GLYPH_CONFLAGRATE, level >= 40 ? 1 : 0);\n+            RefreshAura(GLYPH_SHADOWFLAME, level >= 75 ? 1 : 0);\n+        }\n+\n+        bool CanUseManually(uint32 basespell) const override\n+        {\n+            switch (basespell)\n+            {\n+                case RAIN_OF_FIRE_1:\n+                case SHADOWFLAME_1:\n+                case HOWL_OF_TERROR_1:\n+                case DETECT_INVISIBILITY_1:\n+                case UNENDING_BREATH_1:\n+                //case RITUAL_OF_SUMMONING_1:\n+                case SHADOW_WARD_1:\n+                case LIFE_TAP_1:\n+                case DARK_PACT_1:\n+                    return true;\n+                //case FEL_ARMOR_1:\n+                //    return true;\n+                //case DEMON_ARMOR_1:\n+                //    return !GetSpell(FEL_ARMOR_1);\n+                //case DEMON_SKIN_1:\n+                //    return !GetSpell(FEL_ARMOR_1) && !GetSpell(DEMON_ARMOR_1);\n+                default:\n+                    return false;\n+            }\n+        }\n+\n+        std::vector<uint32> const* GetDamagingSpellsList() const override\n+        {\n+            return &Warlock_spells_damage;\n+        }\n+        std::vector<uint32> const* GetCCSpellsList() const override\n+        {\n+            return &Warlock_spells_cc;\n+        }\n+        //std::vector<uint32> const* GetHealingSpellsList() const override\n+        //{\n+        //    return &Warlock_spells_heal;\n+        //}\n+        std::vector<uint32> const* GetSupportSpellsList() const override\n+        {\n+            return &Warlock_spells_support;\n+        }\n+\n+    private:\n+        //Timers\n+        uint32 fearTimer, banishTimer, unbanishTimer, drainManaTimer, healthstoneTimer,\n+            soulstoneTimer, lifeTapCheckTimer, curseCheckTimer;\n+        //Pet\n+        uint32 myPetType;\n+        uint32 petSummonTimer;\n+        //Special\n+        mutable bool backlash, shadowtrance, backdraft, moltencore, chaoticmind;\n+        bool canShadowWard;\n+        bool longCasted; //some sort of rotation thing\n+        mutable bool instaCast;\n+        bool hasHealthstone, hasSoulstone;\n+\n+        uint32 _getCursesMask(Unit const* unit) const\n+        {\n+            uint32 mask = 0;\n+            for (auto const& [_, auraApp] : unit->GetAppliedAuras())\n+            {\n+                bool my_cast = auraApp->GetBase()->GetCasterGUID() == me->GetGUID();\n+                switch (auraApp->GetBase()->GetSpellInfo()->GetFirstRankSpell()->Id)\n+                {\n+                    case CURSE_OF_WEAKNESS_1:       mask |= CURSE_MASK_WEAKNESS | (my_cast ? CURSE_MASK_MY_WEAKNESS : CurseType(0));    break;\n+                    case CURSE_OF_AGONY_1:          mask |= CURSE_MASK_AGONY | (my_cast ? CURSE_MASK_MY_AGONY : CurseType(0));          break;\n+                    case CURSE_OF_DOOM_1:           mask |= CURSE_MASK_DOOM | (my_cast ? CURSE_MASK_MY_DOOM : CurseType(0));            break;\n+                    case CURSE_OF_THE_ELEMENTS_1:   mask |= CURSE_MASK_ELEMENTS | (my_cast ? CURSE_MASK_MY_ELEMENTS : CurseType(0));    break;\n+                    case CURSE_OF_TONGUES_1:        mask |= CURSE_MASK_TONGUES | (my_cast ? CURSE_MASK_MY_TONGUES : CurseType(0));      break;\n+                    case CURSE_OF_EXHAUSTION_1:     mask |= CURSE_MASK_EXHAUSTION | (my_cast ? CURSE_MASK_MY_EXHAUSTION : CurseType(0));break;\n+                    default:                                                                                                            break;\n+                }\n+            }\n+\n+            return mask;\n+        }\n+    };\n+};\n+\n+void AddSC_warlock_bot()\n+{\n+    new warlock_bot();\n+}\ndiff --git a/src/server/game/AI/NpcBots/bot_warrior_ai.cpp b/src/server/game/AI/NpcBots/bot_warrior_ai.cpp\nnew file mode 100644\nindex 0000000000..e95c579f67\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bot_warrior_ai.cpp\n@@ -0,0 +1,2192 @@\n+#include \"bot_ai.h\"\n+#include \"botmgr.h\"\n+#include \"botspell.h\"\n+#include \"bottext.h\"\n+#include \"bottraits.h\"\n+#include \"Group.h\"\n+#include \"Item.h\"\n+#include \"Map.h\"\n+#include \"MotionMaster.h\"\n+//#include \"MovementDefines.h\"\n+#include \"ObjectAccessor.h\"\n+#include \"Player.h\"\n+#include \"ScriptMgr.h\"\n+#include \"Spell.h\"\n+#include \"SpellAuraEffects.h\"\n+#include \"SpellMgr.h\"\n+\n+#include \"Formulas.h\"\n+/*\n+Warrior NpcBot (reworked by Trickerer onlysuffering@gmail.com)\n+Complete - 98%\n+TODO:\n+*/\n+\n+enum WarriorBaseSpells\n+{\n+    BATTLE_STANCE_1                         = 2457,\n+    DEFENSIVE_STANCE_1                      = 71,\n+    BERSERKER_STANCE_1                      = 2458,\n+\n+    INTIMIDATING_SHOUT_1                    = 5246,\n+    ENRAGED_REGENERATION_1                  = 55694,\n+    CHARGE_1                                = 100,\n+    OVERPOWER_1                             = 7384,\n+    TAUNT_1                                 = 355,\n+    BLOODRAGE_1                             = 2687,\n+    BERSERKER_RAGE_1                        = 18499,\n+    INTERCEPT_1                             = 20252,\n+    CLEAVE_1                                = 845,\n+    HAMSTRING_1                             = 1715,\n+    INTERVENE_1                             = 3411,\n+    WHIRLWIND_1                             = 1680,\n+    BLADESTORM_1                            = 46924,\n+    BATTLE_SHOUT_1                          = 6673,\n+    REND_1                                  = 772,\n+    EXECUTE_1                               = 5308,\n+    PUMMEL_1                                = 6552,\n+    BLOODTHIRST_1                           = 23881,\n+    MORTAL_STRIKE_1                         = 12294,\n+    SLAM_1                                  = 1464,\n+    SUNDER_ARMOR_1                          = 7386,\n+    SWEEPING_STRIKES_1                      = 12328,\n+    RECKLESSNESS_1                          = 1719,\n+    RETALIATION_1                           = 20230,\n+    DEATH_WISH_1                            = 12292,\n+    VICTORY_RUSH_1                          = 34428,\n+    THUNDER_CLAP_1                          = 6343,\n+    LAST_STAND_1                            = 12975,\n+    REVENGE_1                               = 6572,\n+    SHIELD_BLOCK_1                          = 2565,\n+    SHIELD_SLAM_1                           = 23922,\n+    SPELL_REFLECTION_1                      = 23920,\n+    DISARM_1                                = 676,\n+    SHIELD_WALL_1                           = 871,\n+    SHIELD_BASH_1                           = 72,\n+    HEROIC_THROW_1                          = 57755,\n+    CONCUSSION_BLOW_1                       = 12809,\n+    VIGILANCE_1                             = 50720,\n+    DEVASTATE_1                             = 20243,\n+    MOCKING_BLOW_1                          = 694,\n+    SHOCKWAVE_1                             = 46968,\n+    PIERCING_HOWL_1                         = 12323,\n+    HEROIC_STRIKE_1                         = 78,\n+    CHALLENGING_SHOUT_1                     = 1161,\n+    COMMANDING_SHOUT_1                      = 469,\n+    SHATTERING_THROW_1                      = 64382,\n+    DEMORALIZING_SHOUT_1                    = 1160,\n+    HEROIC_FURY_1                           = 60970\n+};\n+enum WarriorPassives\n+{\n+//Talents\n+    ARMORED_TO_THE_TEETH                    = 61222,//rank 3\n+    SHIELD_SPECIALIZATION                   = 12727,//rank 5\n+    DEEP_WOUNDS_1                           = 12834,\n+    DEEP_WOUNDS_2                           = 12849,\n+    DEEP_WOUNDS_3                           = 12867,\n+    BLOOD_CRAZE1                            = 16487,\n+    BLOOD_CRAZE2                            = 16489,\n+    BLOOD_CRAZE3                            = 16492,\n+    TOUGHNESS                               = 12764,//rank 5\n+    TWO_HANDED_WEAPON_SPECIALIZATION        = 12712,//rank 3\n+    TASTE_FOR_BLOOD1                        = 56636,\n+    TASTE_FOR_BLOOD2                        = 56637,\n+    TASTE_FOR_BLOOD3                        = 56638,\n+    DUAL_WIELD_SPECIALIZATION               = 23588,//rank 5\n+    IMPROVED_SPELL_REFLECTION               = 59089,//rank 2\n+    SWORD_SPEC1                             = 12281,\n+    SWORD_SPEC2                             = 12812,\n+    SWORD_SPEC3                             = 12813,\n+    SWORD_SPEC4                             = 12814,\n+    SWORD_SPEC5                             = 12815,\n+    IMPROVED_HAMSTRING                      = 23695,//rank 3\n+    TRAUMA1                                 = 46854,\n+    TRAUMA2                                 = 46855,\n+    FLURRY1                                 = 12319,\n+    FLURRY2                                 = 12971,\n+    FLURRY3                                 = 12972,\n+    FLURRY4                                 = 12973,\n+    FLURRY5                                 = 12974,\n+    ONE_HANDED_WEAPON_SPECIALIZATION        = 16542,//rank 5\n+    SECOND_WIND                             = 29838,//rank 2\n+    IMPROVED_DEFENSIVE_STANCE               = 29594,//rank 2\n+    JUGGERNAUGHT                            = 64976,\n+    FURIOUS_ATTACKS                         = 46911,//rank 2\n+    SAFEGUARD                               = 46949,//rank 2\n+    SUDDEN_DEATH                            = 29724,//rank 3\n+    ENDLESS_RAGE                            = 29623,\n+    BLOOD_FRENZY                            = 29859,\n+    RAMPAGE                                 = 29801,\n+    BLOODSURGE                              = 46915,//rank 3\n+    WARBRINGER                              = 57499,\n+    CRITICAL_BLOCK                          = 47296,//rank 3\n+    WRECKING_CREW                           = 56614,//rank 5\n+    DAMAGE_SHIELD                           = 58874,//rank 2\n+//other\n+    GLYPH_HEROIC_STRIKE                     = 58357,\n+    GLYPH_REVENGE                           = 58364,\n+    GLYPH_EXECUTION                         = 58367,\n+    GLYPH_BLOCKING                          = 58375,\n+    GLYPH_VIGILANCE                         = 63326,\n+    GLYPH_DEVASTATE                         = 58388,\n+\n+    WARRIOR_T10_PROT_4P                     = 70844 //bloodrage absorb\n+};\n+enum WarriorSpecial\n+{\n+    STANCE_NONE                             = 0,\n+    STANCE_BATTLE                           = 1,\n+    STANCE_DEFENSIVE                        = 2,\n+    STANCE_BERSERKER                        = 3,\n+\n+    TASTE_FOR_BLOOD_BUFF                    = 60503,\n+    SWORD_AND_BOARD_BUFF                    = 50227,\n+    BLOODSURGE_BUFF                         = 46916,//\"Slam!\"\n+    JUGGERNAUGHT_BUFF                       = 65156,\n+    GLYPH_REVENGE_BUFF                      = 58363,\n+    UNRELENTING_ASSAULT_SPELL               = 64850,\n+    VICTORIOUS_SPELL                        = 32216,\n+    REVENGE_STUN_SPELL                      = 12798,\n+    //SWORD_SPECIALIZATION_TRIGGERED          = 16459,\n+    VIGILANCE_PROC                          = 50725,\n+    IMPROVED_BERSERKER_RAGE_EFFECT          = 23691,//rank 2\n+    UNBRIDLED_WRATH_EFFECT                  = 12964,\n+    SUNDER_ARMOR_DEBUFF                     = 58567,\n+    GAG_ORDER_DEBUFF                        = 18498,//silence\n+    //SUDDEN_DEATH_BUFF                       = 52437,\n+    BLOODRAGE_PERIODIC_EFFECT               = 29131,\n+\n+    //VICTORIOUS_STATE_PASSIVE              = 32215,\n+    BERSERKER_STANCE_PASSIVE                = 7381\n+};\n+\n+static const std::vector<uint32> Warrior_spells_damage\n+{ BLADESTORM_1, BLOODTHIRST_1, CLEAVE_1, CONCUSSION_BLOW_1, DEVASTATE_1, EXECUTE_1, HEROIC_STRIKE_1, HEROIC_THROW_1,\n+INTERCEPT_1, MOCKING_BLOW_1, MORTAL_STRIKE_1, OVERPOWER_1, REND_1, RETALIATION_1, REVENGE_1, SHATTERING_THROW_1,\n+SHIELD_SLAM_1, SHOCKWAVE_1, SLAM_1, THUNDER_CLAP_1, VICTORY_RUSH_1, WHIRLWIND_1 };\n+static const std::vector<uint32> Warrior_spells_cc\n+{ CHARGE_1, INTERCEPT_1, INTIMIDATING_SHOUT_1, CONCUSSION_BLOW_1, DISARM_1, HAMSTRING_1, PIERCING_HOWL_1,\n+SHIELD_BASH_1, SHOCKWAVE_1 };\n+static const std::vector<uint32> Warrior_spells_support\n+{ BATTLE_SHOUT_1, COMMANDING_SHOUT_1, CHALLENGING_SHOUT_1, DEMORALIZING_SHOUT_1, BERSERKER_RAGE_1, BLOODRAGE_1,\n+DEATH_WISH_1, ENRAGED_REGENERATION_1, HEROIC_FURY_1, INTERVENE_1, LAST_STAND_1, PUMMEL_1, RECKLESSNESS_1,\n+RETALIATION_1, SHIELD_BASH_1, SHIELD_BLOCK_1, SHIELD_WALL_1, SPELL_REFLECTION_1, SUNDER_ARMOR_1, SWEEPING_STRIKES_1,\n+TAUNT_1, VIGILANCE_1 };\n+\n+static float rageIncomeMult;\n+static float rageLossMult;\n+\n+class warrior_bot : public CreatureScript\n+{\n+public:\n+    warrior_bot() : CreatureScript(\"warrior_bot\") { }\n+\n+    CreatureAI* GetAI(Creature* creature) const override\n+    {\n+        return new warrior_botAI(creature);\n+    }\n+\n+    bool OnGossipHello(Player* player, Creature* creature) override\n+    {\n+        return creature->GetBotAI()->OnGossipHello(player, 0);\n+    }\n+\n+    bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action) override\n+    {\n+        if (bot_ai* ai = creature->GetBotAI())\n+            return ai->OnGossipSelect(player, creature, sender, action);\n+        return true;\n+    }\n+\n+    bool OnGossipSelectCode(Player* player, Creature* creature, uint32 sender, uint32 action, char const* code) override\n+    {\n+        if (bot_ai* ai = creature->GetBotAI())\n+            return ai->OnGossipSelectCode(player, creature, sender, action, code);\n+        return true;\n+    }\n+\n+    struct warrior_botAI : public bot_ai\n+    {\n+        warrior_botAI(Creature* creature) : bot_ai(creature)\n+        {\n+            _botclass = BOT_CLASS_WARRIOR;\n+\n+            InitUnitFlags();\n+        }\n+\n+        bool doCast(Unit* victim, uint32 spellId)\n+        {\n+            if (CheckBotCast(victim, spellId) != SPELL_CAST_OK)\n+                return false;\n+            return bot_ai::doCast(victim, spellId);\n+        }\n+\n+        uint8 GetBotStance() const override\n+        {\n+            if (_inStance(1))\n+                return WARRIOR_BATTLE_STANCE;\n+            else if (_inStance(2))\n+                return WARRIOR_DEFENSIVE_STANCE;\n+            else if (_inStance(3))\n+                return WARRIOR_BERSERKER_STANCE;\n+\n+            return BOT_STANCE_NONE;\n+        }\n+\n+        void StartAttack(Unit* u, bool force = false)\n+        {\n+            if (!bot_ai::StartAttack(u, force))\n+                return;\n+            GetInPosition(force, u);\n+        }\n+\n+        void JustEngagedWith(Unit* u) override { bot_ai::JustEngagedWith(u); }\n+        void KilledUnit(Unit* u) override\n+        {\n+            //Victorious State spell\n+            //only on targets which give xp or honor\n+            if (u->GetLevel() > Bcore::XP::GetGrayLevel(me->GetLevel()))\n+                me->CastSpell(me, VICTORIOUS_SPELL, true);\n+\n+            bot_ai::KilledUnit(u);\n+        }\n+        void EnterEvadeMode(EvadeReason why = EVADE_REASON_OTHER) override { bot_ai::EnterEvadeMode(why); }\n+        void MoveInLineOfSight(Unit* u) override { bot_ai::MoveInLineOfSight(u); }\n+        void JustDied(Unit* u) override { bot_ai::JustDied(u); }\n+        void DoNonCombatActions(uint32 /*diff*/) { }\n+\n+        //void modrage(int32 mod, bool set = false)\n+        //{\n+        //    if (set && mod < 0)\n+        //        return;\n+        //    if (mod < 0 && rage < abs(mod))\n+        //    {\n+        //        //debug set rage to 0\n+        //        mod = 0;\n+        //        set = true;\n+        //        return;\n+        //    }\n+\n+        //    if (set)\n+        //        rage = mod ? mod*10 : 0;\n+        //    else\n+        //        rage += mod*10;\n+\n+        //    me->SetPower(POWER_RAGE, rage);\n+        //}\n+\n+        void getrage()\n+        {\n+            rage = me->GetPower(POWER_RAGE);\n+            if (me->FindCurrentSpellBySpellId(GetSpell(CLEAVE_1)))\n+                rage = std::max<int32>(rage - 200, 0);\n+            else if (me->FindCurrentSpellBySpellId(GetSpell(HEROIC_STRIKE_1)))\n+                rage = std::max<int32>(rage - rcost(HEROIC_STRIKE_1), 0);\n+        }\n+\n+        int32 rcost(uint32 spellId) const\n+        {\n+            if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId))\n+                return spellInfo->CalcPowerCost(me, spellInfo->GetSchoolMask());\n+            return 0;\n+        }\n+\n+        void BreakCC(uint32 diff) override\n+        {\n+            if (IsSpellReady(HEROIC_FURY_1, diff) && Rand() < 55 &&\n+                (CCed(me, true) || me->HasAuraWithMechanic(1u<<MECHANIC_SNARE)))\n+            {\n+                if (doCast(me, GetSpell(HEROIC_FURY_1)))\n+                    return;\n+            }\n+            if (IsSpellReady(BERSERKER_RAGE_1, diff) && Rand() < 45 &&\n+                !me->GetAuraEffect(SPELL_AURA_MECHANIC_IMMUNITY, SPELLFAMILY_WARRIOR, 0x0, 0x20000, 0x0) &&\n+                /*!me->HasAura(ENRAGED_REGENERATION_1)*/\n+                me->HasAuraWithMechanic((1u<<MECHANIC_FEAR)|(1u<<MECHANIC_SAPPED)|(1u<<MECHANIC_KNOCKOUT)))\n+            {\n+                if (doCast(me, GetSpell(BERSERKER_RAGE_1)))\n+                    return;\n+            }\n+            bot_ai::BreakCC(diff);\n+        }\n+\n+        void UpdateAI(uint32 diff) override\n+        {\n+            if (me->IsAlive())\n+            {\n+                if (ragetimer2 <= diff)\n+                {\n+                    ragetimer2 = 3000;\n+                    //Anger Management\n+                    if (me->IsInCombat() && me->GetLevel() >= 20)\n+                    {\n+                        if (me->GetPower(POWER_RAGE) < 990)\n+                            me->SetPower(POWER_RAGE, me->GetPower(POWER_RAGE) + uint32(10.f * rageIncomeMult)); //1 rage per 3 sec\n+                        else\n+                            me->SetPower(POWER_RAGE, 1000); //max\n+                    }\n+                }\n+                if (ragetimer <= diff)\n+                {\n+                    ragetimer = 1500;\n+                    if (!me->IsInCombat() &&\n+                        !me->HasAuraTypeWithFamilyFlags(SPELL_AURA_PERIODIC_ENERGIZE, SPELLFAMILY_WARRIOR, 0x100))\n+                    {\n+                        if (me->GetPower(POWER_RAGE) > uint32(10.f * rageLossMult))\n+                            me->SetPower(POWER_RAGE, me->GetPower(POWER_RAGE) - uint32(10.f * rageLossMult)); //-1 rage per 1.5 sec\n+                        else\n+                            me->SetPower(POWER_RAGE, 0); //min\n+                    }\n+                }\n+                getrage();\n+            }\n+\n+            if (!GlobalUpdate(diff))\n+                return;\n+\n+            DoVehicleActions(diff);\n+            if (!CanBotAttackOnVehicle())\n+                return;\n+\n+            if (IsPotionReady())\n+            {\n+                if (GetHealthPCT(me) < 40)\n+                    DrinkPotion(false);\n+            }\n+\n+            CheckRacials(diff);\n+\n+            CheckShouts(diff);\n+            CheckVigilance(diff);\n+            CheckIntervene(diff);\n+            CheckSpellReflect(diff);\n+\n+            if (me->IsInCombat())\n+                CheckShatteringThrow(diff);\n+            else\n+                DoNonCombatActions(diff);\n+\n+            if (IsCasting())\n+                return;\n+\n+            if (ProcessImmediateNonAttackTarget())\n+                return;\n+\n+            if (!CheckAttackTarget())\n+            {\n+                if (!me->IsInCombat() && stancetimer <= diff && Rand() < 5 && me->getAttackers().empty() && rage <= 250)\n+                {\n+                    uint8 mystance = 0;\n+                    if (IsTank())\n+                    {\n+                        if (!_inStance(2))\n+                            mystance = 2;\n+                    }\n+                    else\n+                        mystance = 1;\n+\n+                    if (mystance)\n+                        stanceChange(diff, mystance);\n+                }\n+                return;\n+            }\n+\n+            CheckUsableItems(diff);\n+\n+            Attack(diff);\n+        }\n+\n+        void Attack(uint32 diff)\n+        {\n+            Unit* mytar = opponent ? opponent : disttarget ? disttarget : nullptr;\n+            if (!mytar)\n+                return;\n+\n+            StartAttack(mytar, IsMelee());\n+\n+            CheckAttackState();\n+            if (!me->IsAlive() || !mytar->IsAlive())\n+                return;\n+\n+            bool const isFury = GetSpec() == BOT_SPEC_WARRIOR_FURY;\n+            bool const isArms = GetSpec() == BOT_SPEC_WARRIOR_ARMS;\n+\n+            //Keep stance in combat\n+            if (stancetimer <= diff && Rand() < 10 + 15 * (me->GetPower(POWER_RAGE) <= 250))\n+            {\n+                uint8 mystance;\n+                if (IsTank())\n+                    mystance = 2;\n+                else if (isFury && me->GetLevel() >= 30)\n+                    mystance = 3;\n+                else\n+                    mystance = 1;\n+\n+                stanceChange(diff, mystance);\n+            }\n+\n+            if (IsSpellReady(BLOODRAGE_1, diff, false) && me->IsInCombat() && rage < 600 && Rand() < 20 &&\n+                !me->GetAuraEffect(SPELL_AURA_MECHANIC_IMMUNITY, SPELLFAMILY_WARRIOR, 0x0, 0x20000, 0x0)\n+                /*!me->HasAura(ENRAGED_REGENERATION_1)*/)\n+            {\n+                if (doCast(me, GetSpell(BLOODRAGE_1)))\n+                    getrage();\n+            }\n+\n+            getrage();\n+\n+            //SelfHeal\n+            if (IsSpellReady(ENRAGED_REGENERATION_1, diff) && Rand() < 80 && GetHealthPCT(me) < 40 &&\n+                rage >= rcost(ENRAGED_REGENERATION_1) && me->HasAuraWithMechanic(1u<<MECHANIC_ENRAGED))\n+            {\n+                if (doCast(me, GetSpell(ENRAGED_REGENERATION_1)))\n+                    return;\n+            }\n+\n+            Unit::AttackerSet const& b_attackers = me->getAttackers();\n+            float dist = me->GetDistance(mytar);\n+\n+            //FEAR\n+            if (IsSpellReady(INTIMIDATING_SHOUT_1, diff) && Rand() < 70 && rage >= rcost(INTIMIDATING_SHOUT_1))\n+            {\n+                if (mytar->IsNonMeleeSpellCast(false, false, true) && dist < 5 &&\n+                    mytar->GetCreatureType() != CREATURE_TYPE_UNDEAD)\n+                {\n+                    if (doCast(mytar, GetSpell(INTIMIDATING_SHOUT_1)))\n+                        return;\n+                }\n+                Unit::AttackerSet const& m_attackers = master->getAttackers();\n+                Unit* fearTarget = nullptr;\n+                uint8 tCount = 0;\n+                //fear master's attackers\n+                if (!m_attackers.empty() &&\n+                    ((master->GetClass() != BOT_CLASS_DEATH_KNIGHT &&\n+                    master->GetClass() != BOT_CLASS_WARRIOR &&\n+                    master->GetClass() != BOT_CLASS_PALADIN) ||\n+                    GetHealthPCT(master) < 70))\n+                {\n+                    for (Unit* attacker : m_attackers)\n+                    {\n+                        if (!attacker) continue;\n+                        if (attacker->GetCreatureType() == CREATURE_TYPE_UNDEAD) continue;\n+                        if (me->GetDistance((attacker)) < 7.5f)\n+                            ++tCount;\n+                        if (!fearTarget && me->GetDistance(attacker) < 5)\n+                            fearTarget = attacker;\n+                        if (fearTarget && tCount > 1)\n+                            break;\n+                    }\n+                    if (fearTarget && tCount > 1 && doCast(fearTarget, GetSpell(INTIMIDATING_SHOUT_1)))\n+                        return;\n+                }\n+                //Defend myself\n+                if (b_attackers.size() > 1 && (!IsTank() || GetHealthPCT(me) < 50))\n+                {\n+                    tCount = 0;\n+                    fearTarget = nullptr;\n+                    for (Unit* attacker : b_attackers)\n+                    {\n+                        if (!attacker) continue;\n+                        if (attacker->GetCreatureType() == CREATURE_TYPE_UNDEAD) continue;\n+                        if (me->GetDistance((attacker)) < 7.5f)\n+                            ++tCount;\n+                        if (!fearTarget && me->GetDistance(attacker) < 5)\n+                            fearTarget = attacker;\n+                        if (fearTarget && tCount > 1)\n+                            break;\n+                    }\n+                    if (fearTarget && tCount > 1 && doCast(fearTarget, GetSpell(INTIMIDATING_SHOUT_1)))\n+                        return;\n+                }\n+            }//end FEAR\n+\n+            //LAST STAND\n+            if (IsSpellReady(LAST_STAND_1, diff, false) &&\n+                GetHealthPCT(me) < (30 + 20 * (b_attackers.size() > 1) + 10 * me->HasAuraType(SPELL_AURA_PERIODIC_DAMAGE)))\n+            {\n+                if (doCast(me, GetSpell(LAST_STAND_1)))\n+                    return;\n+            }\n+\n+            Unit const* u = mytar->GetVictim();\n+\n+            //TAUNT //No GCD\n+            if (IsSpellReady(TAUNT_1, diff, false) && u && u != me && Rand() < 50 && dist < 30 &&\n+                mytar->CanHaveThreatList() && !CCed(mytar) && !mytar->HasAuraType(SPELL_AURA_MOD_TAUNT) &&\n+                (!IsTank(u) || (IsTank() && GetHealthPCT(me) > 67 &&\n+                (GetHealthPCT(u) < 30 || (IsOffTank() && !IsOffTank(u) && IsPointedOffTankingTarget(mytar)) ||\n+                (!IsOffTank() && IsOffTank(u) && IsPointedTankingTarget(mytar))))) &&\n+                ((!IsTankingClass(u->GetClass()) && (GetHealthPCT(u) < 80 || _inStance(2))) || IsTank()) &&\n+                IsInBotParty(u) &&\n+                (_inStance(2) || (stancetimer <= diff && stanceChange(diff, 2))))\n+            {\n+                if (doCast(mytar, GetSpell(TAUNT_1)))\n+                    return;\n+            }\n+            //TAUNT 2 (distant)\n+            if (IsSpellReady(TAUNT_1, diff, false) && !IAmFree() && u == me && Rand() < 35 && IsTank() &&\n+                (IsOffTank() || master->GetBotMgr()->GetNpcBotsCountByRole(BOT_ROLE_TANK_OFF) == 0) &&\n+                !(me->GetLevel() >= 40 && mytar->IsCreature() &&\n+                (mytar->ToCreature()->IsDungeonBoss() || mytar->ToCreature()->isWorldBoss())) &&\n+                (_inStance(2) || stancetimer <= diff))\n+            {\n+                Unit* tUnit = FindDistantTauntTarget();\n+                if (tUnit && (_inStance(2) || (stancetimer <= diff && stanceChange(diff, 2))))\n+                {\n+                    if (doCast(tUnit, GetSpell(TAUNT_1)))\n+                        return;\n+                }\n+            }\n+            //CHARGE (warbringer)\n+            if (IsSpellReady(CHARGE_1, diff, false) && !HasRole(BOT_ROLE_RANGED) && Rand() < 70 &&\n+                !HasBotCommandState(BOT_COMMAND_STAY) &&\n+                !(IsTank() && mytar->IsCreature() && mytar->ToCreature()->isWorldBoss()) &&\n+                dist > 8 && dist < CalcSpellMaxRange(CHARGE_1) &&\n+                ((IsTank() && me->GetLevel() >= 50) ||\n+                (!me->IsInCombat() && (_inStance(1) || (stancetimer <= diff && stanceChange(diff, 1))))))\n+            {\n+                if (doCast(mytar, GetSpell(CHARGE_1)))\n+                    return;\n+            }\n+            //INTERCEPT (warbringer)\n+            if (IsSpellReady(INTERCEPT_1, diff, false) && !HasRole(BOT_ROLE_RANGED) && HasRole(BOT_ROLE_DPS) &&\n+                !HasBotCommandState(BOT_COMMAND_STAY) &&\n+                !(IsTank() && mytar->IsCreature() && mytar->ToCreature()->isWorldBoss()) &&\n+                !me->HasUnitState(UNIT_STATE_CHARGING) &&\n+                //!(me->GetMotionMaster()->GetCurrentMovementGenerator() && me->GetMotionMaster()->GetCurrentMovementGenerator()->BaseUnitState == UNIT_STATE_CHARGING) && //not charging\n+                (me->IsInCombat() || !IsSpellReady(CHARGE_1, diff, false)) &&\n+                Rand() < 60 && dist > 10 && dist < 25 && !CCed(mytar) && rage >= rcost(INTERCEPT_1) &&\n+                ((IsTank() && me->GetLevel() >= 50) ||\n+                (!IsTank() && (_inStance(3) || (stancetimer <= diff && stanceChange(diff, 3))))))\n+            {\n+                if (doCast(mytar, GetSpell(INTERCEPT_1)))\n+                    return;\n+            }\n+            //CHALLENGING SHOUT\n+            if (IsSpellReady(CHALLENGING_SHOUT_1, diff) && Rand() < 40 &&\n+                !(u == me && me->GetLevel() >= 40 && mytar->IsCreature() &&\n+                (mytar->ToCreature()->IsDungeonBoss() || mytar->ToCreature()->isWorldBoss())) &&\n+                rage >= rcost(CHALLENGING_SHOUT_1))\n+            {\n+                if (IsTank())\n+                {\n+                    std::list<Unit*> targets;\n+                    GetNearbyTargetsList(targets, 9.f, 1);\n+                    uint8 count = 0;\n+                    for (Unit const* target : targets)\n+                    {\n+                        if (!(target->GetVictim() && IsTank(target->GetVictim())))\n+                            if (++count > 1)\n+                                break;\n+                    }\n+                    if (count > 1 && doCast(me, GetSpell(CHALLENGING_SHOUT_1)))\n+                        return;\n+                }\n+                if (u && u != me && !IsSpellReady(TAUNT_1, diff, false) && !IsTank(u) && !CCed(mytar) && dist < 9 &&\n+                    (!IsTankingClass(u->GetClass()) || IsTank()) && IsInBotParty(u))\n+                {\n+                    if (doCast(me, GetSpell(CHALLENGING_SHOUT_1)))\n+                        return;\n+                }\n+            }\n+\n+            bool can_do_normal = CanAffectVictimAny(mytar, SPELL_SCHOOL_NORMAL);\n+\n+            //BERSERKER RAGE (for rage)\n+            if (IsSpellReady(BERSERKER_RAGE_1, diff) && Rand() < 15 && rage < 80/* && me->GetLevel() >= 35*/)\n+            {\n+                if (doCast(me, GetSpell(BERSERKER_RAGE_1)))\n+                    return;\n+            }\n+            //MOCKING BLOW\n+            if (IsSpellReady(MOCKING_BLOW_1, diff) && can_do_normal && HasRole(BOT_ROLE_DPS) && Rand() < 70 && u && u != me &&\n+                !IsTank(u) && dist < 5 && rage >= rcost(MOCKING_BLOW_1) &&\n+                !CCed(mytar) && (!IsTankingClass(u->GetClass()) || IsTank()) && IsInBotParty(u) &&\n+                (_inStance(4) || (stancetimer <= diff && stanceChange(diff, 4))))\n+            {\n+                if (doCast(mytar, GetSpell(MOCKING_BLOW_1)))\n+                    return;\n+            }\n+            //SHIELD SLAM\n+            if (IsSpellReady(SHIELD_SLAM_1, diff) && can_do_normal && HasRole(BOT_ROLE_DPS) && CanBlock() &&\n+                (_inStance(4) || stancetimer <= diff) && dist <= 5 && rage >= rcost(SHIELD_SLAM_1) &&\n+                Rand() < (75 + 200*(me->GetAuraEffect(SPELL_AURA_ADD_PCT_MODIFIER, SPELLFAMILY_WARRIOR, 2780, 0) != nullptr)\n+                /*me->HasAura(SWORD_AND_BOARD_BUFF)*/))\n+            {\n+                //check Shield Block\n+                if (IsSpellReady(SHIELD_BLOCK_1, diff, false) && (_inStance(2) || (IsTank() && stanceChange(diff, 2))))\n+                {\n+                    if (doCast(me, GetSpell(SHIELD_BLOCK_1)))\n+                    {}\n+                }\n+                if (_inStance(4) || stanceChange(diff, 4))\n+                {\n+                    if (doCast(mytar, GetSpell(SHIELD_SLAM_1)))\n+                        return;\n+                }\n+            }\n+            //SHIELD BLOCK\n+            if (IsSpellReady(SHIELD_BLOCK_1, diff, false) && CanBlock() && Rand() < 70 &&\n+                (_inStance(2) || stancetimer <= diff) &&\n+                ((u == me && dist < 8) || (!b_attackers.empty() && me->GetDistance2d(*(b_attackers.begin())) < 8)) &&\n+                GetHealthPCT(me) < (65 + 8 * uint8(b_attackers.size())))\n+            {\n+                if ((_inStance(2) || stanceChange(diff, 2)) &&\n+                    doCast(me, GetSpell(SHIELD_BLOCK_1)))\n+                    return;\n+            }\n+            //SHOCKWAVE - frontal cone\n+            if (IsSpellReady(SHOCKWAVE_1, diff) && can_do_normal && HasRole(BOT_ROLE_DPS) && dist < 8.f && !CCed(mytar) &&\n+                rage >= rcost(SHOCKWAVE_1) && Rand() < (70 + 70 * mytar->IsNonMeleeSpellCast(false)) &&\n+                me->HasInArc(float(M_PI)/2, mytar) && mytar->IsWithinLOSInMap(me, VMAP::ModelIgnoreFlags::M2, LINEOFSIGHT_ALL_CHECKS))\n+            {\n+                if (doCast(me, GetSpell(SHOCKWAVE_1)))\n+                    return;\n+            }\n+            //HEROIC THROW\n+            if (IsSpellReady(HEROIC_THROW_1, diff) && can_do_normal && HasRole(BOT_ROLE_DPS) && dist < 30 &&\n+                (mytar->IsCreature() || dist > 6) &&\n+                Rand() < (20 - 15 * CanBlock() + 90 * mytar->IsNonMeleeSpellCast(false,false,true)))\n+            {\n+                if (doCast(mytar, GetSpell(HEROIC_THROW_1)))\n+                    return;\n+            }\n+            //THUNDER CLAP\n+            if (IsSpellReady(THUNDER_CLAP_1, diff) && HasRole(BOT_ROLE_DPS) && !isFury && Rand() < 40 &&\n+                (_inStance(4) || stancetimer <= diff) && dist < 7.5f && rage >= rcost(THUNDER_CLAP_1) &&\n+                ((IsTank() && b_attackers.size() > 1) ||\n+                (mytar->GetHealth() > me->GetMaxHealth() / 2 &&\n+                !mytar->HasAuraTypeWithFamilyFlags(SPELL_AURA_MOD_MELEE_HASTE, SPELLFAMILY_WARRIOR, 0x80)) ||\n+                FindSplashTarget(7.5f, mytar, 15.f)))\n+            {\n+                if (_inStance(4) || (me->GetLevel() >= 20 && stanceChange(diff, 4)))\n+                {\n+                    if (doCast(me, GetSpell(THUNDER_CLAP_1)))\n+                        return;\n+                }\n+            }\n+            //REVENGE\n+            if (IsSpellReady(REVENGE_1, diff) && can_do_normal && HasRole(BOT_ROLE_DPS) && IsTank() && me->HasReactive(REACTIVE_DEFENSE) &&\n+                Rand() < 150 && (_inStance(2) || stancetimer <= diff) && dist < 5 && rage >= rcost(REVENGE_1))\n+            {\n+                if (_inStance(2) || stanceChange(diff, 2))\n+                {\n+                    if (doCast(mytar, GetSpell(REVENGE_1)))\n+                        return;\n+                }\n+            }\n+            //CONCUSSION BLOW\n+            if (IsSpellReady(CONCUSSION_BLOW_1, diff) && can_do_normal && HasRole(BOT_ROLE_DPS) && !CCed(mytar) &&\n+                dist < 5 && rage >= rcost(CONCUSSION_BLOW_1) &&\n+                mytar->GetDiminishing(DIMINISHING_STUN) <= DIMINISHING_LEVEL_2 &&\n+                Rand() < (30 + 60 * mytar->IsNonMeleeSpellCast(false,false,true)))\n+            {\n+                if (doCast(mytar, GetSpell(CONCUSSION_BLOW_1)))\n+                    return;\n+            }\n+\n+            MoveBehind(mytar);\n+\n+            //SHIELD BASH - shared cd with pummel\n+            if (IsSpellReady(SHIELD_BASH_1, diff, false) && can_do_normal && CanBlock() && Rand() < 80 &&\n+                (_inStance(4) || stancetimer <= diff) &&\n+                dist < 5 && rage >= rcost(SHIELD_BASH_1) && mytar->IsNonMeleeSpellCast(false,false,true))\n+            {\n+                if ((_inStance(4) || stanceChange(diff, 4)) &&\n+                    doCast(mytar, GetSpell(SHIELD_BASH_1)))\n+                    return;\n+            }\n+            //PUMMEL - shared cd with shield bash\n+            if (IsSpellReady(PUMMEL_1, diff, false) && can_do_normal && !IsTank() && !CanBlock() && Rand() < 80 &&\n+                dist < 5 && (_inStance(3) || stancetimer <= diff) &&\n+                rage >= rcost(PUMMEL_1) && mytar->IsNonMeleeSpellCast(false,false,true))\n+            {\n+                if ((_inStance(3) || stanceChange(diff, 3)) &&\n+                    doCast(mytar, GetSpell(PUMMEL_1)))\n+                    return;\n+            }\n+            //HAMSTRING\n+            if (IsSpellReady(HAMSTRING_1, diff) && can_do_normal && Rand() < 70 && (_inStance(5) || stancetimer <= diff) &&\n+                (!GetSpell(PIERCING_HOWL_1) || mytar->IsPlayer()) &&\n+                (mytar->isMoving() || mytar->IsPlayer()) && dist < 5 && rage >= rcost(HAMSTRING_1) &&\n+                !mytar->HasAuraWithMechanic(1u<<MECHANIC_SNARE))\n+            {\n+                if (_inStance(5) || (me->GetLevel() >= 15 && stanceChange(diff, 5)))\n+                    if (doCast(mytar, GetSpell(HAMSTRING_1)))\n+                        return;\n+            }\n+            //PIERCING HOWL\n+            if (IsSpellReady(PIERCING_HOWL_1, diff) && can_do_normal && mytar->isMoving() && Rand() < 80 &&\n+                dist < 9 && rage >= rcost(PIERCING_HOWL_1) && !mytar->HasAuraWithMechanic(1u<<MECHANIC_SNARE))\n+            {\n+                if (doCast(me, GetSpell(PIERCING_HOWL_1)))\n+                    return;\n+            }\n+            //DISARM\n+            if (IsSpellReady(DISARM_1, diff) && can_do_normal && dist < 5 && (_inStance(2) || stancetimer <= diff) &&\n+                Rand() < (35 + 55*mytar->HasAuraType(SPELL_AURA_ALLOW_ONLY_ABILITY)) &&\n+                !mytar->HasAuraType(SPELL_AURA_MOD_DISARM) &&\n+                mytar->GetHealth() > me->GetMaxHealth() / 8 * (1 + mytar->getAttackers().size()) &&\n+                rage >= rcost(DISARM_1))\n+            {\n+                //check weapons\n+                bool hasWeapon = true;\n+                if (mytar->IsCreature() && !mytar->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID))\n+                    hasWeapon = false;\n+                else if (Player const* pla = mytar->ToPlayer())\n+                    if (!pla->GetWeaponForAttack(BASE_ATTACK) || !pla->GetWeaponForAttack(WeaponAttackType(BASE_ATTACK), true))\n+                        hasWeapon = false;\n+\n+                if (hasWeapon && (_inStance(2) || stanceChange(diff, 2)) &&\n+                    doCast(mytar, GetSpell(DISARM_1)))\n+                    return;\n+            }\n+            //DEMORALIZING SHOUT\n+            if (IsSpellReady(DEMORALIZING_SHOUT_1, diff) && can_do_normal && Rand() < 15 + 25 * IsTank() && dist < 10 &&\n+                (mytar->GetClass() == CLASS_WARRIOR || mytar->GetClass() == CLASS_ROGUE ||\n+                (mytar->IsCreature() && mytar->ToCreature()->GetCreatureTemplate()->rank != CREATURE_ELITE_NORMAL)) &&\n+                mytar->GetHealth() > me->GetMaxHealth() / 8 * (1 + mytar->getAttackers().size()) &&\n+                rage >= rcost(DEMORALIZING_SHOUT_1) &&\n+                !mytar->HasAuraTypeWithFamilyFlags(SPELL_AURA_MOD_ATTACK_POWER, SPELLFAMILY_WARRIOR, 0x20000))\n+            {\n+                if (doCast(me, GetSpell(DEMORALIZING_SHOUT_1)))\n+                    return;\n+            }\n+\n+            //UBERS\n+            //Shield Wall\n+            if (IsSpellReady(SHIELD_WALL_1, diff, false) && CanBlock() &&\n+                GetHealthPCT(me) < (30 + 4 * b_attackers.size() + 20ull * (mytar->IsCreature() && mytar->ToCreature()->isWorldBoss())) &&\n+                (_inStance(2) || stanceChange(diff, 2)))\n+            {\n+                if (doCast(me, GetSpell(SHIELD_WALL_1)))\n+                    return;\n+            }\n+            //Retaliation\n+            if (IsSpellReady(RETALIATION_1, diff) && HasRole(BOT_ROLE_DPS) && !CanBlock() && Rand() < 40 &&\n+                !me->HasAuraType(SPELL_AURA_MOD_DISARM) && b_attackers.size() > 4 &&\n+                (_inStance(1) || stanceChange(diff, 1)))\n+            {\n+                if (doCast(me, GetSpell(RETALIATION_1)))\n+                    return;\n+            }\n+            //Recklessness\n+            if (IsSpellReady(RECKLESSNESS_1, diff) && can_do_normal && HasRole(BOT_ROLE_DPS) && !CanBlock() && !IsTank() && Rand() < 60 &&\n+                GetHealthPCT(me) > 50 && (_inStance(3) || stancetimer <= diff) && b_attackers.size() < 2 &&\n+                (mytar->GetHealth() > me->GetHealth()/2 * (1 + mytar->getAttackers().size()) || mytar->IsControlledByPlayer()) &&\n+                !me->GetAuraEffect(SPELL_AURA_MECHANIC_IMMUNITY, SPELLFAMILY_WARRIOR, 0x0, 0x20000, 0x0)\n+                /*!me->HasAura(ENRAGED_REGENERATION_1)*/ &&\n+                (_inStance(3) || stanceChange(diff, 3)))\n+            {\n+                if (doCast(me, GetSpell(RECKLESSNESS_1)))\n+                    return;\n+            }\n+            //DEATHWISH\n+            if (IsSpellReady(DEATH_WISH_1, diff) && can_do_normal && HasRole(BOT_ROLE_DPS) && !IsTank() && Rand() < 70 &&\n+                dist < 15 && rage >= rcost(DEATH_WISH_1) &&\n+                mytar->GetHealth() > me->GetHealth()/4 * (1 + mytar->getAttackers().size()) &&\n+                !me->GetAuraEffect(SPELL_AURA_MECHANIC_IMMUNITY, SPELLFAMILY_WARRIOR, 0x0, 0x20000, 0x0)\n+                /*!me->HasAura(ENRAGED_REGENERATION_1)*/)\n+            {\n+                if (doCast(me, GetSpell(DEATH_WISH_1)))\n+                    return;\n+            }\n+\n+            //VICTORY RUSH\n+            if (IsSpellReady(VICTORY_RUSH_1, diff) && can_do_normal && HasRole(BOT_ROLE_DPS) && Rand() < 70 && dist < 5 && _inStance(5) &&\n+                me->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_WARRIOR, 0x0, 0x40000, 0x0))\n+            {\n+                if (doCast(mytar, GetSpell(VICTORY_RUSH_1)))\n+                    return;\n+            }\n+            //DEVASTATE - only with shield\n+            if (IsSpellReady(DEVASTATE_1, diff) && can_do_normal && HasRole(BOT_ROLE_DPS) && CanBlock() && Rand() < 100 &&\n+                dist < 5 && rage >= rcost(DEVASTATE_1))\n+            {\n+                if (doCast(mytar, GetSpell(DEVASTATE_1)))\n+                    return;\n+            }\n+            //SUNDER ARMOR\n+            if (IsSpellReady(SUNDER_ARMOR_1, diff) && !IAmFree() && can_do_normal && dist < 5 && Rand() < 45 &&\n+                (IsTank() ? (mytar->GetHealth() > me->GetMaxHealth()) : (Rand() < 25 && mytar->GetHealth() > me->GetMaxHealth() * 2)) &&\n+                (!HasRole(BOT_ROLE_DPS) || !CanBlock() || !GetSpell(DEVASTATE_1)) &&\n+                (IsTank() || master->GetBotMgr()->HasBotWithSpec(BOT_SPEC_WARRIOR_PROTECTION, false)) && rage >= rcost(SUNDER_ARMOR_1))\n+            {\n+                AuraEffect const* sunder = mytar->GetAuraEffect(SUNDER_ARMOR_DEBUFF, 0);\n+                if ((!sunder || sunder->GetBase()->GetStackAmount() < 5 || sunder->GetBase()->GetDuration() < 20000) &&\n+                    doCast(mytar, GetSpell(SUNDER_ARMOR_1)))\n+                    return;\n+            }\n+            //SWEEPING STRIKES //no GCD\n+            if (IsSpellReady(SWEEPING_STRIKES_1, diff, false) && HasRole(BOT_ROLE_DPS) && !IsTank() && Rand() < 65 &&\n+                (_inStance(5) || stancetimer <= diff) && rage >= rcost(SWEEPING_STRIKES_1) &&\n+                (b_attackers.size() > 1 || FindSplashTarget(7, mytar)))\n+            {\n+                if ((_inStance(5) || stanceChange(diff, 5)) &&\n+                    doCast(me, GetSpell(SWEEPING_STRIKES_1)))\n+                    getrage();\n+            }\n+            //REND\n+            if (IsSpellReady(REND_1, diff) && can_do_normal && HasRole(BOT_ROLE_DPS) && Rand() < 80 &&\n+                mytar->GetHealth() > me->GetMaxHealth() / 4 * (1 + mytar->getAttackers().size()) &&\n+                (isArms || mytar->GetClass() == CLASS_ROGUE || mytar->GetShapeshiftForm() == FORM_CAT) &&\n+                dist < 5 && rage >= rcost(REND_1) && mytar->GetCreatureType() != CREATURE_TYPE_MECHANICAL &&\n+                !(mytar->IsCreature() &&\n+                (mytar->ToCreature()->HasMechanicTemplateImmunity(1u<<(MECHANIC_BLEED-1)))) &&\n+                !mytar->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_WARRIOR, 0x20, 0x0, 0x0, me->GetGUID()) &&\n+                (_inStance(4) || (me->GetLevel() >= 15 && stanceChange(diff, 4))))\n+            {\n+                if (doCast(mytar, GetSpell(REND_1)))\n+                    return;\n+            }\n+            //BLOODTHIRST\n+            if (IsSpellReady(BLOODTHIRST_1, diff) && can_do_normal && HasRole(BOT_ROLE_DPS) &&\n+                dist < 5 && rage >= rcost(BLOODTHIRST_1))\n+            {\n+                if (doCast(mytar, GetSpell(BLOODTHIRST_1)))\n+                    return;\n+            }\n+            //MORTAL STRIKE\n+            if (IsSpellReady(MORTAL_STRIKE_1, diff) && can_do_normal && HasRole(BOT_ROLE_DPS) && !CanBlock() &&\n+                dist < 5 && rage >= rcost(MORTAL_STRIKE_1))\n+            {\n+                if (doCast(mytar, GetSpell(MORTAL_STRIKE_1)))\n+                    return;\n+            }\n+            //OVERPOWER\n+            if (IsSpellReady(OVERPOWER_1, diff) && can_do_normal && HasRole(BOT_ROLE_DPS) && !IsTank() && (!isFury || rage < 250) &&\n+                (_inStance(1) || stancetimer <= diff) && dist < 5 && rage >= rcost(OVERPOWER_1) &&\n+                (me->HasReactive(REACTIVE_OVERPOWER) ||\n+                me->GetAuraEffect(SPELL_AURA_ABILITY_IGNORE_AURASTATE, SPELLFAMILY_WARRIOR, 2961, 0)\n+                /*me->HasAura(TASTE_FOR_BLOOD_BUFF)*/))\n+            {\n+                if (_inStance(1) || (me->GetLevel() >= 15 && stanceChange(diff, 1)))\n+                {\n+                    if (doCast(mytar, GetSpell(OVERPOWER_1)))\n+                        return;\n+                }\n+            }\n+            //BLADESTORM\n+            if (IsSpellReady(BLADESTORM_1, diff) && can_do_normal && HasRole(BOT_ROLE_DPS) && !IsTank() && !CanBlock() &&\n+               dist < 10 && rage >= rcost(BLADESTORM_1) &&\n+               (b_attackers.size() > 1 || mytar->GetHealth() > me->GetHealth() / 3 * (1 + mytar->getAttackers().size()) ||\n+               mytar->IsControlledByPlayer()) &&\n+               (Rand() < 50 || me->HasAuraTypeWithFamilyFlags(SPELL_AURA_ADD_FLAT_MODIFIER, SPELLFAMILY_WARRIOR, 0x10)\n+               /*me->HasAura(RECKLESSNESS_1)*/) &&\n+               (me->GetMap()->IsDungeon() || mytar->GetMaxHealth() > me->GetMaxHealth() * 8 || CCed(mytar, true) || mytar->HasAuraWithMechanic(1u<<MECHANIC_SNARE)))\n+            {\n+                if (doCast(me, GetSpell(BLADESTORM_1)))\n+                    return;\n+            }\n+            //WHIRLWIND\n+            if (IsSpellReady(WHIRLWIND_1, diff) && can_do_normal && HasRole(BOT_ROLE_DPS) && !IsTank() && !CanBlock() && Rand() < 80 &&\n+                (isFury || mytar->IsControlledByPlayer() || me->GetLevel() < 60 || !me->GetMap()->IsDungeon()) &&\n+                (_inStance(3) || stancetimer <= diff) && dist < 6.f &&\n+                rage >= rcost(WHIRLWIND_1) && (isFury || rage >= 500 || FindSplashTarget(7.f, mytar, 15.f)))\n+            {\n+                if ((_inStance(3) || stanceChange(diff, 3)) &&\n+                    doCast(me, GetSpell(WHIRLWIND_1)))\n+                    return;\n+            }\n+            //EXECUTE\n+            if (IsSpellReady(EXECUTE_1, diff) && can_do_normal && HasRole(BOT_ROLE_DPS) && !IsTank() && Rand() < 110 &&\n+                (isFury || !me->GetMap()->IsRaid()) &&\n+                (mytar->HasAuraState(AURA_STATE_HEALTHLESS_20_PERCENT) ||\n+                me->GetAuraEffect(SPELL_AURA_ABILITY_IGNORE_AURASTATE, SPELLFAMILY_WARRIOR, 0x0, 0x2000000, 0x0)) &&\n+                dist < 5 && rage >= rcost(EXECUTE_1) &&\n+                (_inStance(5) || (stancetimer <= diff && stanceChange(diff, 5))))\n+            {\n+                if (doCast(mytar, GetSpell(EXECUTE_1)))\n+                    return;\n+            }\n+            //SLAM only with improved, has SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS\n+            if (IsSpellReady(SLAM_1, diff) && can_do_normal && HasRole(BOT_ROLE_DPS) && !IsTank() && !CanBlock() &&\n+                me->GetLevel() >= 40 && dist < 5 && rage >= rcost(SLAM_1) &&\n+                ((isArms && !mytar->isMoving() && me->getAttackTimer(BASE_ATTACK) > 500) ||\n+                me->GetAuraEffect(SPELL_AURA_ADD_PCT_MODIFIER, SPELLFAMILY_WARRIOR, 0x0, 0x1000000, 0x0))\n+                /*me->HasAura(BLOODSURGE_BUFF)*/)\n+            {\n+                if (doCast(mytar, GetSpell(SLAM_1)))\n+                    return;\n+            }\n+\n+            //skip if already have cleave of heroic strike casted\n+            if (me->GetCurrentSpell(CURRENT_MELEE_SPELL))\n+                return;\n+\n+            //CLEAVE //no GCD\n+            if (IsSpellReady(CLEAVE_1, diff, false) && can_do_normal && HasRole(BOT_ROLE_DPS) && Rand() < 70 &&\n+                dist < 5 && (!IsTank() || rage >= 500) && rage >= rcost(CLEAVE_1) && FindSplashTarget())\n+            {\n+                if (doCast(mytar, GetSpell(CLEAVE_1)))\n+                    return;\n+            }\n+            //HEROIC STRIKE\n+            if (IsSpellReady(HEROIC_STRIKE_1, diff, false) && can_do_normal && HasRole(BOT_ROLE_DPS) && Rand() < 55 && rage >= 350 &&\n+                dist < 5 && (isFury || IsTank() || rage >= 650) && rage >= rcost(HEROIC_STRIKE_1))\n+            {\n+                if (doCast(mytar, GetSpell(HEROIC_STRIKE_1)))\n+                    return;\n+            }\n+        }\n+\n+        void CheckShouts(uint32 diff)\n+        {\n+            if (shoutCheckTimer > diff || GC_Timer > diff || Rand() > 35 || (IAmFree() && !IsWanderer()) || me->IsMounted() || IsCasting() ||\n+                (rage < rcost(BATTLE_SHOUT_1) && !IsSpellReady(BLOODRAGE_1, diff, false)))\n+                return;\n+\n+            shoutCheckTimer = urand(3000, 5000);\n+\n+            if (IAmFree())\n+            {\n+                if (GetSpell(BATTLE_SHOUT_1) &&\n+                    !me->GetAuraEffect(SPELL_AURA_MOD_RANGED_ATTACK_POWER, SPELLFAMILY_WARRIOR, 0x10000, 0x0, 0x0) &&\n+                    !me->GetAuraEffect(SPELL_AURA_MOD_RANGED_ATTACK_POWER, SPELLFAMILY_PALADIN, 0x2, 0x0, 0x0))\n+                {\n+                    if (rage < rcost(BATTLE_SHOUT_1))\n+                    {\n+                        if (IsSpellReady(BLOODRAGE_1, diff, false))\n+                        {\n+                            if (doCast(me, GetSpell(BLOODRAGE_1)))\n+                            {}\n+                            else\n+                                return;\n+                        }\n+                        else\n+                            return;\n+                    }\n+                    if (doCast(me, GetSpell(BATTLE_SHOUT_1)))\n+                        return;\n+                }\n+\n+                return;\n+            }\n+\n+            if (me->GetDistance(master) > 30)\n+                return;\n+\n+            //ignore Blood Pact\n+            AuraEffect const* bs = me->GetAuraEffect(SPELL_AURA_MOD_RANGED_ATTACK_POWER, SPELLFAMILY_WARRIOR, 0x10000, 0x0, 0x0);\n+            AuraEffect const* cs = me->GetAuraEffect(SPELL_AURA_230, SPELLFAMILY_WARRIOR, 0x0, 0x80, 0x0);\n+            AuraEffect const* bm = me->GetAuraEffect(SPELL_AURA_MOD_RANGED_ATTACK_POWER, SPELLFAMILY_PALADIN, 0x2, 0x0, 0x0);\n+\n+            bool hasBS = bs && (bs->GetBase()->GetDuration() >= 30000 || bs->GetBase()->GetCasterGUID() != me->GetGUID()) && bs->GetBase()->GetId() >= GetSpell(BATTLE_SHOUT_1);\n+            bool hasCS = cs && (cs->GetBase()->GetDuration() >= 30000 || cs->GetBase()->GetCasterGUID() != me->GetGUID()) && cs->GetBase()->GetId() >= GetSpell(COMMANDING_SHOUT_1);\n+            bool hasBM = bm != nullptr;\n+\n+            if (hasCS && (hasBS || hasBM))\n+                return;\n+\n+            bool battleshout = !hasBM && !hasBS && (!cs || cs->GetBase()->GetCasterGUID() != me->GetGUID()) &&\n+                (!IsTank(me) || !GetSpell(COMMANDING_SHOUT_1)) && GetSpell(BATTLE_SHOUT_1);\n+            bool commandingshout = !hasCS && (!bs || bs->GetBase()->GetCasterGUID() != me->GetGUID()) &&\n+                GetSpell(COMMANDING_SHOUT_1);\n+\n+            if (battleshout && !hasCS && !HasRole(BOT_ROLE_DPS) && GetSpell(COMMANDING_SHOUT_1))\n+            {\n+                battleshout = false;\n+                commandingshout = true;\n+            }\n+\n+            if (battleshout || commandingshout)\n+            {\n+                if (rage < rcost(BATTLE_SHOUT_1) && IsSpellReady(BLOODRAGE_1, diff, false) &&\n+                    doCast(me, GetSpell(BLOODRAGE_1)))\n+                    getrage();\n+\n+                if ((battleshout && doCast(me, GetSpell(BATTLE_SHOUT_1))) ||\n+                    (commandingshout && doCast(me, GetSpell(COMMANDING_SHOUT_1))))\n+                    return;\n+            }\n+        }\n+\n+        void CheckVigilance(uint32 diff)\n+        {\n+            if (vigiCheckTimer > diff || Rand() > 30 || !IsSpellReady(VIGILANCE_1, diff) || me->IsInCombat() || me->IsMounted() || IsCasting())\n+                return;\n+\n+            vigiCheckTimer = urand(1500, 3000);\n+            uint32 VIGILANCE = GetSpell(VIGILANCE_1);\n+\n+            if (Unit* u = vigilanceTargetGuid ? ObjectAccessor::GetUnit(*me, vigilanceTargetGuid) : nullptr)\n+            {\n+                bool myVig = u->HasAura(VIGILANCE, me->GetGUID());\n+                if (!IsTank() || !myVig)\n+                {\n+                    if (myVig)\n+                        u->RemoveAura(VIGILANCE, me->GetGUID(), 0, AURA_REMOVE_BY_EXPIRE);\n+                    vigilanceTargetGuid = ObjectGuid::Empty;\n+                }\n+                return;\n+            }\n+            else if (vigilanceTargetGuid)\n+                vigilanceTargetGuid = ObjectGuid::Empty;\n+\n+            if (!IAmFree() && !IsTank())\n+                return;\n+\n+            Unit* target = nullptr;\n+            if (Group const* gr = GetGroup())\n+            {\n+                std::set<Unit*> targets;\n+                for (uint8 i = 0; i < 4 && !targets.empty(); ++i)\n+                {\n+                    for (Unit* member : BotMgr::GetAllGroupMembers(gr))\n+                    {\n+                        if (!(!(i & 1) ? member->IsPlayer() : member->IsNPCBot()) || me->GetMap() != member->FindMap() ||\n+                            !member->IsAlive() || me->GetDistance(member) > 30 ||\n+                            (member->IsNPCBot() && member->ToCreature()->IsTempBot()) ||\n+                            (i < 2 && !(i == 0 ? IsTankingClass(member->GetClass()) : IsTank(member))) ||\n+                            (i == 3 && !member->ToCreature()->GetBotAI()->HasRole(BOT_ROLE_DPS)) ||\n+                            member->HasAura(VIGILANCE) || member->HasAura(DAMAGE_REDUCTION))\n+                            continue;\n+                        targets.insert(member);\n+                    }\n+                }\n+\n+                if (!targets.empty())\n+                    target = targets.size() == 1 ? *targets.begin() : Bcore::Containers::SelectRandomContainerElement(targets);\n+            }\n+\n+            if (!target && !IAmFree() && master->IsAlive() && me->IsWithinDistInMap(master, 30) && !master->HasAura(VIGILANCE))\n+                target = master;\n+\n+            if (target && doCast(target, VIGILANCE))\n+                return;\n+        }\n+\n+        void CheckIntervene(uint32 diff)\n+        {\n+            if (!IsSpellReady(INTERVENE_1, diff, false) || HasBotCommandState(BOT_COMMAND_STAY) || me->IsMounted() ||\n+                Rand() > (IsTank() ? 40 : 80) || rage < rcost(INTERVENE_1) || IsCasting() ||\n+                !(_inStance(2) || stancetimer <= diff || (GetSpec() == BOT_SPEC_WARRIOR_PROTECTION && me->GetLevel() >= 50)))\n+                return;\n+\n+            Unit* target = nullptr;\n+            if (!me->GetVictim() && master->getAttackers().empty() && master->isMoving())\n+            {\n+                float mydist = me->GetDistance(master);\n+                if (mydist < 25 && mydist > 18)\n+                    target = master;\n+            }\n+\n+            Group const* gr = GetGroup();\n+            if (!target && !gr)\n+            {\n+                if (GetHealthPCT(master) < 95 && !master->getAttackers().empty() &&\n+                    me->getAttackers().size() <= master->getAttackers().size())\n+                {\n+                    float mydist = me->GetDistance(master);\n+                    if (mydist < 25 && mydist > 8)\n+                        target = master;\n+                }\n+            }\n+            if (!target && gr && (!IsTank() || !me->GetVictim()))\n+            {\n+                std::set<Unit*> targets;\n+                for (Unit* member : BotMgr::GetAllGroupMembers(gr))\n+                {\n+                    if (me->GetMap() == member->FindMap() && member->IsAlive() && GetHealthPCT(member) <= 70 &&\n+                        !member->HasAuraType(SPELL_AURA_ADD_CASTER_HIT_TRIGGER) &&\n+                        member->getAttackers().size() >= me->getAttackers().size() &&\n+                        !(member->IsNPCBot() && member->ToCreature()->IsTempBot()))\n+                    {\n+                        float dist = me->GetDistance(member);\n+                        if (dist < 25 && dist > 8)\n+                            targets.insert(member);\n+                    }\n+                }\n+                if (!targets.empty())\n+                    target = targets.size() == 1u ? *targets.begin() : Bcore::Containers::SelectRandomContainerElement(targets);\n+            }\n+\n+            if (target && (_inStance(2) || (GetSpec() == BOT_SPEC_WARRIOR_PROTECTION && me->GetLevel() >= 50) || stanceChange(diff, 2)) &&\n+                doCast(target, GetSpell(INTERVENE_1)))\n+                return;\n+\n+            SetSpellCooldown(INTERVENE_1, 500); //fail\n+        }\n+\n+        void CheckSpellReflect(uint32 diff)\n+        {\n+            if (!IsSpellReady(SPELL_REFLECTION_1, diff, false) || me->IsMounted() || IsCasting() ||\n+                !CanBlock() || !(_inStance(4) || stancetimer <= diff) ||\n+                rage < rcost(SPELL_REFLECTION_1) || Rand() > 75)\n+                return;\n+\n+            //use first match (covers most cases)\n+            if (Unit const* target = FindCastingTarget(70))\n+            {\n+                if (Spell const* spell = target->GetCurrentSpell(CURRENT_GENERIC_SPELL))\n+                {\n+                    if (spell->GetTimer() < 500/*(4500 - 4000 * (target->IsPlayer()))*/ &&\n+                        !spell->GetSpellInfo()->IsChanneled() &&\n+                        spell->GetSpellInfo()->DmgClass == SPELL_DAMAGE_CLASS_MAGIC &&\n+                        !(spell->GetSpellInfo()->Attributes & (SPELL_ATTR0_IS_ABILITY|SPELL_ATTR0_NO_IMMUNITIES)) &&\n+                        !(spell->GetSpellInfo()->AttributesEx & SPELL_ATTR1_NO_REFLECTION) &&\n+                        !spell->GetSpellInfo()->IsPassive() && !spell->GetSpellInfo()->IsPositive())\n+                    {\n+                        if (Unit const* u = spell->m_targets.GetUnitTarget())\n+                        {\n+                            if ((IAmFree() ? (u == me) : (master->GetGroup() && master->GetGroup()->IsMember(spell->m_targets.GetObjectTargetGUID()))) &&\n+                                me->GetTotalAuraModifier(SPELL_AURA_REFLECT_SPELLS) < 100)\n+                            {\n+                                if ((_inStance(4) || (stancetimer <= diff && stanceChange(diff, 4))) &&\n+                                    doCast(me, GetSpell(SPELL_REFLECTION_1)))\n+                                    return;\n+                            }\n+                        }\n+                    }\n+                }\n+            }\n+\n+            SetSpellCooldown(SPELL_REFLECTION_1, urand(250, 500)); //fail\n+        }\n+\n+        void CheckShatteringThrow(uint32 diff)\n+        {\n+            if (!IsSpellReady(SHATTERING_THROW_1, diff) || shatterCheckTimer > diff ||\n+                !(_inStance(1) || stancetimer <= diff) || rage < rcost(SHATTERING_THROW_1) ||\n+                me->getAttackers().size() > 2 || Rand() > 50)\n+                return;\n+\n+            shatterCheckTimer = urand(500, 1000);\n+\n+            Unit* unit = FindImmunityShieldDispelTarget();\n+            if (unit && me->GetDistance(unit) < 30 && (_inStance(1) || (stancetimer <= diff && stanceChange(diff, 1))))\n+                if (doCast(unit, GetSpell(SHATTERING_THROW_1)))\n+                    return;\n+        }\n+\n+        bool stanceChange(uint32 diff, uint8 stance)\n+        {\n+            if (stancetimer > diff)\n+                return false;\n+\n+            if (stance == 5)\n+                stance = (me->GetLevel() >= 30 && !IsTank()) ? 3 : 1;\n+            else if (stance == 4)\n+                stance = me->GetLevel() >= 10 && IsTank() ? 2 : 1;\n+\n+            if (stance == 2 && me->GetLevel() < 10)\n+                return false;\n+            if (stance == 3 && me->GetLevel() < 30)\n+                return false;\n+\n+            if (_inStance(stance))\n+                return true;\n+\n+            rage = me->GetPower(POWER_RAGE);\n+            switch (stance)\n+            {\n+                case 1:\n+                    return doCast(me, BATTLE_STANCE_1);\n+                case 2:\n+                    return doCast(me, DEFENSIVE_STANCE_1);\n+                case 3:\n+                    return doCast(me, BERSERKER_STANCE_1);\n+                default:\n+                    return false;\n+            }\n+        }\n+\n+        void ApplyClassDamageMultiplierMelee(uint32& /*damage*/, CalcDamageInfo& damageinfo) const override\n+        {\n+            float pctbonus = 1.0f;\n+\n+            if (damageinfo.hitOutCome == MELEE_HIT_CRIT)\n+            {\n+                //!!!Melee spell damage is not yet critical, all reduced by half\n+                //Poleaxe Specialization: 5% additional critical damage for all attacks\n+                if (GetSpec() == BOT_SPEC_WARRIOR_ARMS && me->GetLevel() >= 30)\n+                    if (Item const* weap = GetEquips(uint8(damageinfo.attackType)))\n+                        if (ItemTemplate const* proto = weap->GetTemplate())\n+                            if (proto->SubClass == ITEM_SUBCLASS_WEAPON_AXE || proto->SubClass == ITEM_SUBCLASS_WEAPON_AXE2 ||\n+                                proto->SubClass == ITEM_SUBCLASS_WEAPON_POLEARM)\n+                                pctbonus *= 1.025f;\n+            }\n+\n+            damageinfo.damages[0].damage *= pctbonus;\n+        }\n+\n+        void ApplyClassSpellCritMultiplierAll(Unit const* /*victim*/, float& crit_chance, SpellInfo const* spellInfo, SpellSchoolMask /*schoolMask*/, WeaponAttackType attackType) const override\n+        {\n+            if (spellInfo->DmgClass != SPELL_DAMAGE_CLASS_MELEE)\n+                return;\n+\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+\n+            //Recklessness: 100% additional critical chance for damaging abilities\n+            if (AuraEffect const* eff = me->GetAuraEffect(RECKLESSNESS_1, EFFECT_0))\n+                if (eff->IsAffectedOnSpell(spellInfo))\n+                    crit_chance += 100.f;\n+            //Juggernaught: 25 additional critical chance for Mortal Strike and Slam\n+            if (lvl >= 45 && (baseId == SLAM_1 || baseId == MORTAL_STRIKE_1))\n+                if (AuraEffect const* jugg = me->GetAuraEffect(JUGGERNAUGHT_BUFF, 0))\n+                    if (jugg->IsAffectedOnSpell(spellInfo))\n+                        crit_chance += 25.f;\n+\n+            //Poleaxe Specialization: 5% additional critical chance for all attacks\n+            if (GetSpec() == BOT_SPEC_WARRIOR_ARMS && lvl >= 30)\n+                if (Item const* weap = GetEquips(uint8(attackType)))\n+                    if (ItemTemplate const* proto = weap->GetTemplate())\n+                        if (proto->SubClass == ITEM_SUBCLASS_WEAPON_AXE || proto->SubClass == ITEM_SUBCLASS_WEAPON_AXE2 ||\n+                            proto->SubClass == ITEM_SUBCLASS_WEAPON_POLEARM)\n+                            crit_chance += 5.f;\n+\n+            //Incite: 15% additional critical chance for Cleave, Heroic Strike and Thunder Clap\n+            if (((GetSpec() == BOT_SPEC_WARRIOR_PROTECTION && lvl >= 15) ||\n+                ((GetSpec() == BOT_SPEC_WARRIOR_ARMS || GetSpec() == BOT_SPEC_WARRIOR_FURY) && lvl >= 75)) &&\n+                (baseId == CLEAVE_1 || baseId == HEROIC_STRIKE_1 || baseId == THUNDER_CLAP_1))\n+                crit_chance += 15.f;\n+            //Improved Overpower: 50% additional critical chance for Overpower\n+            if ((GetSpec() == BOT_SPEC_WARRIOR_ARMS) && lvl >= 20 && baseId == OVERPOWER_1)\n+                crit_chance += 50.f;\n+            //Critical Block: 15% additional critical chance for Shield Slam\n+            if ((GetSpec() == BOT_SPEC_WARRIOR_PROTECTION) &&\n+                lvl >= 50 && baseId == SHIELD_SLAM_1)\n+                crit_chance += 15.f;\n+            //Sword and Board: 15% additional critical chance for Devastate\n+            if (lvl >= 55 && baseId == DEVASTATE_1)\n+                crit_chance += 15.f;\n+\n+            //Glypg of Victory Rush: 30% additional critical chance for Victory Rush\n+            if (lvl >= 15 && baseId == VICTORY_RUSH_1)\n+                crit_chance += 30.f;\n+\n+            //Warrior T8 Protection Bonus (id: 64933): 10% additional critical chance for Devastate (tanks only)\n+            if (lvl >= 78 && baseId == DEVASTATE_1)\n+                crit_chance += 10.f;\n+        }\n+\n+        void ApplyClassDamageMultiplierMeleeSpell(int32& damage, SpellNonMeleeDamage& /*damageinfo*/, SpellInfo const* spellInfo, WeaponAttackType attackType, bool iscrit) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+            float fdamage = float(damage);\n+\n+            // apply bonus damage mods\n+            float pctbonus = 1.0f;\n+            if (iscrit)\n+            {\n+                //!!!Melee spell damage is not yet critical, all reduced by half\n+                //Impale: 20% crit damage bonus for all abilities\n+                if (lvl >= 20)\n+                    pctbonus *= 1.1f;\n+                //Poleaxe Specialization: 5% additional critical damage for all attacks\n+                if ((GetSpec() == BOT_SPEC_WARRIOR_PROTECTION) && lvl >= 30)\n+                    if (Item const* weap = GetEquips(uint8(attackType)))\n+                        if (ItemTemplate const* proto = weap->GetTemplate())\n+                            if (proto->SubClass == ITEM_SUBCLASS_WEAPON_AXE || proto->SubClass == ITEM_SUBCLASS_WEAPON_AXE2 ||\n+                                proto->SubClass == ITEM_SUBCLASS_WEAPON_POLEARM)\n+                                pctbonus *= 1.025f;\n+            }\n+\n+            //Improved Shield Slam (id: 38407): 10% bonus damage for Shield Slam\n+            //if (lvl >= 50 && baseId == SHIELD_SLAM_1)\n+            //    pctbonus *= 1.1f;\n+            //Shield Slam Damage Up (id: 60173): 10% bonus damage for Shield Slam\n+            //if (lvl >= 70 && baseId == SHIELD_SLAM_1)\n+            //    pctbonus *= 1.1f;\n+\n+            //Improved Rend: 20% bonus damage for Rend\n+            if (lvl >= 10 && baseId == REND_1)\n+                pctbonus *= 1.2f;\n+            //Improved Thunder Clap (part 2): 30% bonus damage for Thunder Clap\n+            if (lvl >= 10 && baseId == THUNDER_CLAP_1)\n+                pctbonus *= 1.3f;\n+            //Improved Revenge (part 1): 60% bonus damage for Revenge\n+            if ((GetSpec() == BOT_SPEC_WARRIOR_PROTECTION) && lvl >= 20 && baseId == REVENGE_1)\n+                pctbonus *= 1.6f;\n+            //Gag Order (part 2): 10% bonus damage for Shield Slam\n+            if ((GetSpec() == BOT_SPEC_WARRIOR_PROTECTION) && lvl >= 30 && baseId == SHIELD_SLAM_1)\n+                pctbonus *= 1.1f;\n+            //Improved Whirlwind: 20% bonus damage for Whirlwind\n+            if ((GetSpec() == BOT_SPEC_WARRIOR_FURY) && lvl >= 40 && baseId == WHIRLWIND_1)\n+                pctbonus *= 1.2f;\n+            //Improved Mortal Strike (part 1): 10% bonus damage for Mortal Strike\n+            if (lvl >= 45 && baseId == MORTAL_STRIKE_1)\n+                pctbonus *= 1.1f;\n+            //Unrelenting Assault (part 2): 20% bonus damage for Overpower and Revenge\n+            if ((GetSpec() == BOT_SPEC_WARRIOR_ARMS) &&\n+                lvl >= 45 && (baseId == OVERPOWER_1 || baseId == REVENGE_1))\n+                pctbonus *= 1.2f;\n+            //Unending Fury: 10% bonus damage for Whirlwind, Slam and Bloodthirst\n+            if ((GetSpec() == BOT_SPEC_WARRIOR_FURY) &&\n+                lvl >= 55 && (baseId == WHIRLWIND_1 || baseId == SLAM_1 || baseId == BLOODTHIRST_1))\n+                pctbonus *= 1.1f;\n+\n+            //Glyph of Mocking Blow: 25% bonus damage for Mocking Blow\n+            if (lvl >= 16 && baseId == MOCKING_BLOW_1)\n+                pctbonus *= 1.25f;\n+            //Glyph of Mortal Strike: 10% bonus damage for Mortal Strike\n+            if (lvl >= 40 && baseId == MORTAL_STRIKE_1)\n+                pctbonus *= 1.1f;\n+\n+            //Warrior T9 Protection 2P Bonus (id: 67269): 5% bonus damage for Devastate\n+            if (lvl >= 77 && baseId == DEVASTATE_1)\n+                pctbonus *= 1.05f;\n+            //Warrior T10 Protection 2P Bonus (id: 70843): 20% bonus damage for Shield Slam and Shockwave\n+            if (lvl >= 78 && (baseId == SHIELD_SLAM_1 || baseId == SHOCKWAVE_1))\n+                pctbonus *= 1.2f;\n+\n+            //Improved Cleave: 120% increased '!bonus damage!' done by Cleave (flat mod)\n+            if ((GetSpec() == BOT_SPEC_WARRIOR_FURY) && lvl >= 25 && baseId == CLEAVE_1)\n+            {\n+                float bp = spellInfo->Effects[EFFECT_0].BasePoints; //SPELL_EFFECT_WEAPON_DAMAGE (values: 15 - 222)\n+                fdamage += bp * 1.2;\n+            }\n+\n+            damage = int32(fdamage * pctbonus);\n+        }\n+\n+        void ApplyClassSpellCostMods(SpellInfo const* spellInfo, int32& cost) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            float fcost = float(cost);\n+            //float pctbonus = 1.0f;\n+\n+            //100% mods\n+            //Sword and Board: -100% rage cost for Shield Slam\n+            if (baseId == SHIELD_SLAM_1 && me->HasAura(SWORD_AND_BOARD_BUFF))\n+                fcost = 0;\n+\n+            //Glyph of Bloodrage: -100% health cost for Bloodrage\n+            if (lvl >= 15 && baseId == BLOODRAGE_1)\n+                fcost = 0;\n+            //Glyph of Revenge: -100% rage cost for Heroic Strike\n+            if (lvl >= 15 && baseId == HEROIC_STRIKE_1 && me->HasAura(GLYPH_REVENGE_BUFF))\n+                fcost = 0;\n+            //Glyph of Sweeping Strikes: -100% rage cost for Sweeping Strikes\n+            if (lvl >= 30 && baseId == SWEEPING_STRIKES_1)\n+                fcost = 0;\n+\n+            //flat mods\n+            //Improved Hamstring (id: 24428): -2 rage cost for Hamstring\n+            if (lvl >= 25 && baseId == HAMSTRING_1)\n+                fcost -= 20;\n+            //Bloodthirst and Mortal Strike Discount (id: 37535): -5 rage cost for Bloodthirst and Mortal Strike\n+            if (lvl >= 40 && (baseId == BLOODTHIRST_1 || baseId == MORTAL_STRIKE_1))\n+                fcost -= 50;\n+\n+            //Improved Heroic Strike: -3 rage cost for Heroic Strike\n+            if (lvl >= 10 && baseId == HEROIC_STRIKE_1)\n+                fcost -= 30;\n+            //Improved Thunder Clap (part 1): -4 rage cost for Thunder Clap\n+            if (lvl >= 10 && baseId == THUNDER_CLAP_1)\n+                fcost -= 40;\n+            //Improved Execute: -5 rage cost for Execute\n+            if ((GetSpec() == BOT_SPEC_WARRIOR_FURY) &&\n+                lvl >= 25 && baseId == EXECUTE_1)\n+                fcost -= 50;\n+            //Puncture: -3 rage cost for Sunder Armor and Devastate\n+            if ((GetSpec() == BOT_SPEC_WARRIOR_PROTECTION) &&\n+                lvl >= 25 && (baseId == SUNDER_ARMOR_1 || baseId == DEVASTATE_1))\n+                fcost -= 30;\n+            //Focused Rage: -3 rage cost for all offensive abilities (using rage)\n+            if ((GetSpec() == BOT_SPEC_WARRIOR_PROTECTION) &&\n+                lvl >= 40 && ((spellInfo->SpellFamilyFlags[0] & 0x6E6E4EEE) || (spellInfo->SpellFamilyFlags[1] & 0x40E664)))\n+                fcost -= 30;\n+\n+            //Glyph of Resonating Power: -5 rage cost for Thunder Clap\n+            if (lvl >= 15 && baseId == THUNDER_CLAP_1)\n+                fcost -= 50;\n+            //Glyph of Shockwave: -3 rage cost for Shockwave\n+            if (lvl >= 60 && baseId == SHOCKWAVE_1)\n+                fcost -= 30;\n+\n+            //cost can be < 0\n+            cost = int32(fcost/* * pctbonus*/);\n+        }\n+\n+        void ApplyClassSpellCastTimeMods(SpellInfo const* spellInfo, int32& casttime) const override\n+        {\n+            //casttime is in milliseconds\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            //int32 timebonus = 0;\n+            //float pctbonus = 0.0f;\n+\n+            //100% mods\n+            //Bloodsurge: -100% cast time for Slam\n+            if (baseId == SLAM_1 && me->HasAura(BLOODSURGE_BUFF))\n+                casttime = 0;\n+\n+            //flat mods\n+            //Improved Slam: -1.0 sec cast time for Slam\n+            if ((GetSpec() == BOT_SPEC_WARRIOR_ARMS) &&\n+                lvl >= 40 && baseId == SLAM_1)\n+                casttime -= 1000;\n+\n+            casttime = std::max<int32>(casttime, 0);\n+        }\n+\n+        void ApplyClassSpellCooldownMods(SpellInfo const* spellInfo, uint32& cooldown) const override\n+        {\n+            //cooldown is in milliseconds\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            float pctbonus = 1.0f;\n+\n+            //pct mods\n+            //Intensify Rage: -33% cooldown for Bloodrage, Berserker Rage, Recklessness and Death Wish\n+            if ((GetSpec() == BOT_SPEC_WARRIOR_FURY) && lvl >= 40 &&\n+                (baseId == BLOODRAGE_1 || baseId == BERSERKER_RAGE_1 || baseId == RECKLESSNESS_1 || baseId == DEATH_WISH_1))\n+                pctbonus *= 0.67f;\n+\n+            //flat mods\n+            //zzzOLDImproved Challenging Shout (id: 12327): -2 min cooldown for Challenging Shout (tanks only)\n+            if (lvl >= 30 && IsTank() && baseId == CHALLENGING_SHOUT_1)\n+                cooldown -= 120000;\n+\n+            //Shield Mastery (part 2): -20 sec cooldown for Shield Block\n+            if ((GetSpec() == BOT_SPEC_WARRIOR_PROTECTION) &&\n+                lvl >= 20 && baseId == SHIELD_BLOCK_1)\n+                cooldown -= 20000;\n+            //Improved Disciplines: -60 sec cooldown for Shield Wall, Retaliation and Recklessness\n+            if ((GetSpec() == BOT_SPEC_WARRIOR_PROTECTION) &&\n+                lvl >= 35 && (baseId == SHIELD_WALL_1 || baseId == RETALIATION_1 || baseId == RECKLESSNESS_1))\n+                cooldown -= 60000;\n+\n+            //Glyph of Bladestorm: -15 sec cooldown for Bladestorm\n+            if (lvl >= 60 && baseId == BLADESTORM_1)\n+                cooldown -= 15000;\n+            //Glyph of Spell Reflection: -1 sec cooldown for Spell Reflection\n+            if (lvl >= 64 && baseId == SPELL_REFLECTION_1)\n+                cooldown -= 1000;\n+\n+            cooldown = std::max<float>(cooldown * pctbonus, 0.f);\n+        }\n+\n+        void ApplyClassSpellCategoryCooldownMods(SpellInfo const* spellInfo, uint32& cooldown) const override\n+        {\n+            //cooldown is in milliseconds\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            float pctbonus = 1.0f;\n+\n+            //pct bonuses\n+            //Glyph of Rapid Charge: -7% cooldown for Charge\n+            if (lvl >= 15 && baseId == CHARGE_1)\n+                pctbonus *= 0.93f;\n+\n+            //flat bonuses\n+            //Improved Disarm part 1: -20 sec cooldown for Disarm\n+            if ((GetSpec() == BOT_SPEC_WARRIOR_PROTECTION) &&\n+                lvl >= 25 && baseId == DISARM_1)\n+                cooldown -= 20000;\n+            //Improved Intercept: -10 sec cooldown for Intercept\n+            if ((GetSpec() == BOT_SPEC_WARRIOR_FURY) &&\n+                lvl >= 30 && baseId == INTERCEPT_1)\n+                cooldown -= 10000;\n+            //Improved Mortal Strike (part 2): -1 sec cooldown for Mortal Strike\n+            if (lvl >= 45 && baseId == MORTAL_STRIKE_1)\n+                cooldown -= 1000;\n+            //Unrelenting Assault (part 1): -4 sec cooldown for Overpower and Revenge\n+            if ((GetSpec() == BOT_SPEC_WARRIOR_ARMS) &&\n+                lvl >= 45 && (baseId == OVERPOWER_1 || baseId == REVENGE_1))\n+                cooldown -= 4000;\n+\n+            //Glyph of Last Stand: -1 min cooldown for Last Stand\n+            if (lvl >= 20 && baseId == LAST_STAND_1)\n+                cooldown -= 60000;\n+            //Glyph of Whirlwind: -2 sec cooldown for Whirlwind\n+            if (lvl >= 36 && baseId == WHIRLWIND_1)\n+                cooldown -= 2000;\n+\n+            //Warrior T9 2P Bonus (id: 67269): -2 sec cooldown for Taunt (tanks only)\n+            if (lvl >= 80 && IsTank() && baseId == TAUNT_1)\n+                cooldown -= 2000;\n+\n+            cooldown = std::max<float>(cooldown * pctbonus, 0.f);\n+        }\n+\n+        void ApplyClassSpellGlobalCooldownMods(SpellInfo const* spellInfo, float& cooldown) const override\n+        {\n+            //cooldown is in milliseconds\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+\n+            //Unrelenting Assault (part 1, special): -0.5 sec global cooldown for Overpower and Revenge\n+            if ((GetSpec() == BOT_SPEC_WARRIOR_ARMS) &&\n+                lvl >= 45 && (baseId == OVERPOWER_1 || baseId == REVENGE_1))\n+                cooldown -= 500.f;\n+        }\n+\n+        void ApplyClassSpellRadiusMods(SpellInfo const* spellInfo, float& radius) const override\n+        {\n+            //uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            float pctbonus = 1.0f;\n+\n+            //pct mods\n+            //Booming Voice part 1 (doubled for bots)\n+            if (lvl >= 10 && ((spellInfo->SpellFamilyFlags[0] & 0x30000) || (spellInfo->SpellFamilyFlags[1] & 0x80)))\n+                pctbonus *= 2.0f; //1.5f\n+\n+            //flat mods\n+            //Glyph of Thunder Clap (doubled for tanks)\n+            if (lvl >= 15 && (spellInfo->SpellFamilyFlags[0] & 0x80))\n+                radius += IsTank() ? 4.f : 2.f;\n+\n+            radius = radius * pctbonus;\n+        }\n+\n+        void ApplyClassSpellRangeMods(SpellInfo const* spellInfo, float& maxrange) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+            float pctbonus = 1.0f;\n+\n+            //pct mods\n+            //Holy Reach: +20% range for Holy Spells\n+            //if (lvl >= 25 && (spellInfo->SpellFamilyFlags[0] & 0x100080))\n+            //    pctbonus *= 1.2f;\n+\n+            //flat mods\n+            //Glyph of Charge: +5 yd range for Charge\n+            if (baseId == CHARGE_1 && lvl >= 15)\n+                maxrange += 5.f;\n+\n+            maxrange = maxrange * pctbonus;\n+        }\n+\n+        void ApplyClassSpellMaxTargetsMods(SpellInfo const* spellInfo, uint32& targets) const override\n+        {\n+            //uint32 bonusTargets = 0;\n+            uint8 lvl = me->GetLevel();\n+\n+            //Improved Revenge: +1 target (actually 2 in dbc)\n+            if (lvl >= 20 && (spellInfo->SpellFamilyFlags[0] & 0x400))\n+                targets += 1;\n+\n+            //Glyph of Sunder Armor: +1 target\n+            if (lvl >= 15 && (spellInfo->SpellFamilyFlags[0] & 0x4000))\n+                targets += 1;\n+            //Glyph of Cleaving: +1 target\n+            if (lvl >= 20 && (spellInfo->SpellFamilyFlags[0] & 0x400000))\n+            {\n+                targets += 1;\n+                //double for non-tanks\n+                if (!IsTank())\n+                    targets += 1;\n+            }\n+        }\n+\n+        void ApplyClassEffectMods(SpellInfo const* spellInfo, uint8 effIndex, float& value) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+            float pctbonus = 1.0f;\n+\n+            //Improved Rend: 20% increased effect\n+            if (baseId == REND_1 && effIndex == EFFECT_0 && lvl >= 10)\n+                pctbonus *= 1.2f;\n+            //Improved Bloodrage: 50% increased effect\n+            if ((baseId == BLOODRAGE_1 || baseId == BLOODRAGE_PERIODIC_EFFECT) && effIndex == EFFECT_0 && lvl >= 10)\n+                pctbonus *= 1.5f;\n+            //Improved Charge: +10 rage generated\n+            if (baseId == CHARGE_1 && effIndex == EFFECT_1 && lvl >= 15)\n+                value += 100.f;\n+            //Glyph of Bloodthirst: +100% healing\n+            if (baseId == BLOODTHIRST_1 && effIndex == EFFECT_1 && lvl >= 40)\n+                pctbonus *= 2.0f;\n+\n+            value = value * pctbonus;\n+        }\n+\n+        void OnClassSpellGo(SpellInfo const* spellInfo) override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+\n+            if (baseId == LAST_STAND_1 && !IAmFree())\n+                ReportSpellCast(baseId, LocalizedNpcText(master, BOT_TEXT__USED), master);\n+            if (baseId == SHIELD_WALL_1 && !IAmFree())\n+                ReportSpellCast(baseId, LocalizedNpcText(master, BOT_TEXT__USED), master);\n+            if (baseId == ENRAGED_REGENERATION_1 && !IAmFree())\n+                ReportSpellCast(baseId, LocalizedNpcText(master, BOT_TEXT__USED), master);\n+\n+            if (baseId == SLAM_1)\n+                me->RemoveAura(BLOODSURGE_BUFF);\n+            if (baseId == HEROIC_STRIKE_1)\n+                me->RemoveAura(GLYPH_REVENGE_BUFF);\n+            if (baseId == SHIELD_SLAM_1)\n+                me->RemoveAura(SWORD_AND_BOARD_BUFF);\n+            if (baseId == OVERPOWER_1 && !me->HasReactive(REACTIVE_OVERPOWER))\n+                me->RemoveAura(TASTE_FOR_BLOOD_BUFF);\n+            if (baseId == BERSERKER_RAGE_1)\n+            {\n+                //Improved Berserker Rage: 20 rage bonus when used\n+                if (me->GetLevel() >= 35)\n+                    me->CastSpell(me, IMPROVED_BERSERKER_RAGE_EFFECT, true);\n+            }\n+        }\n+\n+        void SpellHitTarget(Unit* wtarget, SpellInfo const* spell) override\n+        {\n+            Unit* target = wtarget->ToUnit();\n+            if (!target)\n+                return;\n+\n+            uint32 spellId = spell->Id;\n+            uint32 baseId = spell->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+\n+            if (baseId == VIGILANCE_1)\n+                vigilanceTargetGuid = target->GetGUID();\n+\n+            //Recklessness: handle charge drop\n+            AuraEffect const* reck = me->GetAuraEffect(RECKLESSNESS_1, EFFECT_0);\n+            if (reck && reck->IsAffectedOnSpell(spell))\n+                reck->GetBase()->DropCharge();\n+            //Juggernaught: consume buff\n+            if (baseId == SLAM_1 || baseId == MORTAL_STRIKE_1)\n+                if (AuraEffect const* jugg = me->GetAuraEffect(JUGGERNAUGHT_BUFF, 0))\n+                    if (jugg->IsAffectedOnSpell(spell))\n+                        me->RemoveAurasDueToSpell(JUGGERNAUGHT_BUFF);\n+\n+            if (baseId == THUNDER_CLAP_1 && lvl >= 10)\n+            {\n+                if (AuraEffect* clap = target->GetAuraEffect(spellId, EFFECT_1, me->GetGUID()))\n+                {\n+                    int32 amount = clap->GetAmount();\n+                    //Improved Thunder Clap (part 3): 10% extra slow\n+                    amount += (-10);\n+                    //Conqueror Thunder Clap Bonus: 50% increased effect\n+                    if ((GetSpec() == BOT_SPEC_WARRIOR_PROTECTION) && lvl >= 60)\n+                        amount = amount + amount / 2;\n+\n+                    clap->ChangeAmount(amount);\n+                }\n+            }\n+            if (baseId == DEMORALIZING_SHOUT_1 && lvl >= 15)\n+            {\n+                if (AuraEffect* demo = target->GetAuraEffect(spellId, 0, me->GetGUID()))\n+                    demo->ChangeAmount(demo->GetAmount() + demo->GetAmount() * 2 / 5);\n+            }\n+            if (baseId == BATTLE_SHOUT_1 || baseId == COMMANDING_SHOUT_1 || baseId == DEMORALIZING_SHOUT_1)\n+            {\n+                if (Aura* shout = target->GetAura(spellId, me->GetGUID()))\n+                {\n+                    //Booming Voice part 2\n+                    //Buffs duration 10 min for bots\n+                    uint32 dur = baseId == DEMORALIZING_SHOUT_1 ? shout->GetDuration() * 3 / 2 : 600000;\n+                    shout->SetDuration(dur);\n+                    shout->SetMaxDuration(dur);\n+\n+                    if (baseId == BATTLE_SHOUT_1 || baseId == COMMANDING_SHOUT_1)\n+                    {\n+                        if (lvl >= 20)\n+                        {\n+                            //Commanding Presence: +25% increased effect (melee AP / HP)\n+                            AuraEffect* bamm = shout->GetEffect(EFFECT_0);\n+                            if (bamm)\n+                                bamm->ChangeAmount(bamm->GetAmount() * 5 / 4);\n+                        }\n+                    }\n+                    else if (baseId == DEMORALIZING_SHOUT_1)\n+                    {\n+                        if (lvl >= 15)\n+                        {\n+                            //Improved Demoralization Shout: +40% effect\n+                            AuraEffect* demo = shout->GetEffect(EFFECT_0);\n+                            if (demo)\n+                                demo->ChangeAmount(demo->GetAmount() * 7 / 5);\n+                        }\n+                    }\n+                }\n+            }\n+            if (baseId == REVENGE_1)\n+            {\n+                //zzzOLD Revenge Stun (25% chance): skip players\n+                if (lvl >= 25 && !target->IsPlayer() && urand(1,100) <= 25)\n+                    me->CastSpell(target, REVENGE_STUN_SPELL, true);\n+            }\n+            if (baseId == DISARM_1 && (GetSpec() == BOT_SPEC_WARRIOR_PROTECTION) && lvl >= 25)\n+            {\n+                //Improved Disarm part 2\n+                if (AuraEffect* disa = target->GetAuraEffect(spellId, 1, me->GetGUID()))\n+                    disa->ChangeAmount(disa->GetAmount() + 10);\n+            }\n+            if (baseId == OVERPOWER_1)\n+            {\n+                me->ClearReactive(REACTIVE_OVERPOWER);\n+                //Unrelenting Assault (part 3): reduce spells efficiency on players\n+                if (lvl >= 45 && (GetSpec() == BOT_SPEC_WARRIOR_ARMS) &&\n+                    target->IsPlayer() && target->IsNonMeleeSpellCast(false, false, true))\n+                {\n+                    //CastSpellExtraArgs args(true);\n+                    //args.SetOriginalCaster(me->GetGUID());\n+                    //target->CastSpell(target, UNRELENTING_ASSAULT_SPELL, args);\n+                    target->CastSpell(target, UNRELENTING_ASSAULT_SPELL, true, nullptr, nullptr, me->GetGUID());\n+                }\n+            }\n+            if (baseId == REND_1 && lvl >= 15)\n+            {\n+                //Glyph of Rending + 6 sec duration\n+                if (Aura* rend = target->GetAura(spellId, me->GetGUID()))\n+                {\n+                    uint32 dur = rend->GetDuration() + 6000;\n+                    rend->SetDuration(dur);\n+                    rend->SetMaxDuration(dur);\n+                }\n+            }\n+            if (baseId == INTERVENE_1)\n+            {\n+                //Glyph of Intervene + 1 bonus charge\n+                if (Aura* vene = target->GetAura(spellId, me->GetGUID()))\n+                    vene->SetCharges(vene->GetCharges() + 1);\n+            }\n+            if (baseId == PIERCING_HOWL_1)\n+            {\n+                //Piercing Howl: 4 sec duraion increase (exclude players controlled)\n+                if (!target->IsControlledByPlayer())\n+                {\n+                    if (Aura* howl = target->GetAura(spellId, me->GetGUID()))\n+                    {\n+                        uint32 dur = howl->GetDuration() + 4000;\n+                        howl->SetDuration(dur);\n+                        howl->SetMaxDuration(dur);\n+                    }\n+                }\n+            }\n+            if (baseId == SHIELD_BASH_1 && (GetSpec() == BOT_SPEC_WARRIOR_PROTECTION) && lvl >= 30)\n+            {\n+                //Gag Order part 1: silence target\n+                me->CastSpell(target, GAG_ORDER_DEBUFF, true);\n+            }\n+            if (baseId == VICTORY_RUSH_1)\n+            {\n+                //Victory rush disable helper\n+                me->RemoveAura(VICTORIOUS_SPELL);\n+            }\n+            if ((baseId == DEVASTATE_1 || baseId == REVENGE_1) &&\n+                (GetSpec() == BOT_SPEC_WARRIOR_PROTECTION) &&\n+                lvl >= 55 && urand(1,100) <= 30)\n+            {\n+                //Sword and Board: trigger\n+                me->CastSpell(me, SWORD_AND_BOARD_BUFF, true);\n+                //Sword And Board: remove Shield Slam cooldown\n+                ResetSpellCooldown(SHIELD_SLAM_1);\n+            }\n+\n+            OnSpellHitTarget(target, spell);\n+        }\n+\n+        void SpellHit(Unit* wcaster, SpellInfo const* spell) override\n+        {\n+            Unit* caster = wcaster->ToUnit();\n+            if (!caster)\n+                return;\n+\n+            uint32 spellId = spell->Id;\n+            uint32 baseId = spell->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+\n+            //Stances helper\n+            if (spellId == BATTLE_STANCE_1 || spellId == DEFENSIVE_STANCE_1 || spellId == BERSERKER_STANCE_1)\n+            {\n+                stancetimer = 1000;\n+\n+                //stance mastery, tactical mastery\n+                uint32 temprage = 0;\n+                if (lvl >= 20)\n+                    temprage = rage > 250 ? 250 : rage;\n+                else if (lvl >= 15)\n+                    temprage = rage > 150 ? 150 : rage;\n+\n+                _stance =\n+                    spellId == BATTLE_STANCE_1 ? STANCE_BATTLE :\n+                    spellId == DEFENSIVE_STANCE_1 ? STANCE_DEFENSIVE :\n+                    spellId == BERSERKER_STANCE_1 ? STANCE_BERSERKER : STANCE_NONE;\n+\n+                me->SetPower(POWER_RAGE, temprage);\n+                //Update stength bonus from Improved Berserker Stance\n+                //if (lvl >= 45)\n+                //    SetStats(false);\n+            }\n+\n+            //Iron Will: -20% duration for stuns and charms\n+            if ((GetSpec() == BOT_SPEC_WARRIOR_ARMS || GetSpec() == BOT_SPEC_WARRIOR_FURY) &&\n+                lvl >= 15 && !spell->IsPositive() && (spell->Mechanic == MECHANIC_STUN || spell->Mechanic == MECHANIC_CHARM))\n+            {\n+                if (Aura* chun = me->GetAura(spellId, caster->GetGUID()))\n+                {\n+                    uint32 dur = chun->GetDuration() - chun->GetDuration() / 5;\n+                    chun->SetDuration(dur);\n+                    chun->SetMaxDuration(dur);\n+                }\n+            }\n+            //Glyph of Enduring Victory: +5 sec duration\n+            if (lvl >= 62 && baseId == VICTORIOUS_SPELL)\n+            {\n+                if (Aura* vict = me->GetAura(spellId))\n+                {\n+                    uint32 dur = vict->GetDuration() + 5000;\n+                    vict->SetDuration(dur);\n+                    vict->SetMaxDuration(dur);\n+                }\n+            }\n+            //Improved Berserker Stance part 2: threat mod\n+            if (baseId == BERSERKER_STANCE_PASSIVE)\n+            {\n+                if (AuraEffect* pass = me->GetAuraEffect(spellId, EFFECT_2))\n+                    pass->ChangeAmount(pass->GetAmount() - 10);\n+            }\n+            if (baseId == RETALIATION_1)\n+            {\n+                //Increase duration by 3 sec for bot\n+                if (Aura* ret = me->GetAura(spellId, me->GetGUID()))\n+                {\n+                    uint32 dur = ret->GetDuration() + 3000;\n+                    ret->SetDuration(dur);\n+                    ret->SetMaxDuration(dur);\n+                }\n+            }\n+            if (baseId == VIGILANCE_PROC) //confirmed right place\n+            {\n+                //Vigilance: remove Taunt cooldown\n+                ResetSpellCooldown(TAUNT_1);\n+            }\n+            if (baseId == SHIELD_WALL_1)\n+            {\n+                //Shield Wall Duration (id: 60175): 3 sec increased Shield Wall duration\n+                if (Aura* wall = me->GetAura(spellId))\n+                {\n+                    int32 dur = wall->GetDuration() + 3000;\n+                    wall->SetDuration(dur);\n+                    wall->SetMaxDuration(dur);\n+                }\n+            }\n+\n+            OnSpellHit(caster, spell);\n+        }\n+\n+        void DamageDealt(Unit* victim, uint32& damage, DamageEffectType damageType, SpellSchoolMask damageSchoolMask) override\n+        {\n+            //Unbridled Wrath\n+            if ((GetSpec() == BOT_SPEC_WARRIOR_FURY || GetSpec() == BOT_SPEC_WARRIOR_ARMS) &&\n+                damage && me->GetLevel() >= 15 && me->CanDualWield() &&\n+                (damageType == DIRECT_DAMAGE || damageType == SPELL_DIRECT_DAMAGE))\n+            {\n+                if (roll_chance_f(me->GetPPMProcChance(me->GetFloatValue(UNIT_FIELD_BASEATTACKTIME), 15.f, nullptr)))\n+                    me->CastSpell(me, UNBRIDLED_WRATH_EFFECT, true);\n+            }\n+            bot_ai::DamageDealt(victim, damage, damageType, damageSchoolMask);\n+        }\n+\n+        void DamageTaken(Unit* u, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellSchoolMask /*schoolMask*/) override\n+        {\n+            if (!u)\n+                return;\n+            if (!u->IsInCombat() && !me->IsInCombat())\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void OwnerAttackedBy(Unit* u) override\n+        {\n+            if (!u)\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void SetAIMiscValue(uint32 data, uint32 value) override\n+        {\n+            switch (data)\n+            {\n+                case BOTAI_MISC_WEAPON_SPEC:\n+                {\n+                    //AXE and MACE specs are handled elsewhere\n+                    _checkSwordSpec();\n+                    break;\n+                }\n+                default:\n+                    break;\n+            }\n+\n+            bot_ai::SetAIMiscValue(data, value);\n+        }\n+\n+        void Reset() override\n+        {\n+            stancetimer = 0;\n+            ragetimer = 1500;\n+            ragetimer2 = 3000;\n+            shoutCheckTimer = 5000;\n+            shatterCheckTimer = 5000;\n+            vigiCheckTimer = 5000;\n+\n+            vigilanceTargetGuid = ObjectGuid::Empty;\n+\n+            _stance = STANCE_NONE;\n+\n+            rageIncomeMult = sWorld->getRate(RATE_POWER_RAGE_INCOME);\n+            rageLossMult = sWorld->getRate(RATE_POWER_RAGE_LOSS);\n+            rage = 0;\n+\n+            DefaultInit();\n+        }\n+\n+        void ReduceCD(uint32 diff) override\n+        {\n+            if (stancetimer > diff)                 stancetimer -= diff;\n+            if (ragetimer > diff)                   ragetimer -= diff;\n+            if (ragetimer2 > diff)                  ragetimer2 -= diff;\n+            if (shoutCheckTimer > diff)             shoutCheckTimer -= diff;\n+            if (shatterCheckTimer > diff)           shatterCheckTimer -= diff;\n+            if (vigiCheckTimer > diff)              vigiCheckTimer -= diff;\n+        }\n+\n+        void InitPowers() override\n+        {\n+            me->SetPowerType(POWER_RAGE);\n+        }\n+\n+        void InitSpells() override\n+        {\n+            uint8 lvl = me->GetLevel();\n+            bool isArms = GetSpec() == BOT_SPEC_WARRIOR_ARMS;\n+            bool isFury = GetSpec() == BOT_SPEC_WARRIOR_FURY;\n+            bool isProt = GetSpec() == BOT_SPEC_WARRIOR_PROTECTION;\n+\n+            InitSpellMap(BATTLE_STANCE_1);\n+   /*Quest*/lvl >= 10 ? InitSpellMap(DEFENSIVE_STANCE_1) : RemoveSpell(DEFENSIVE_STANCE_1);\n+   /*Quest*/lvl >= 30 ? InitSpellMap(BERSERKER_STANCE_1) : RemoveSpell(BERSERKER_STANCE_1);\n+\n+   /*Quest*/lvl >= 10 ? InitSpellMap(TAUNT_1) : RemoveSpell(TAUNT_1);\n+   /*Quest*/lvl >= 10 ? InitSpellMap(SUNDER_ARMOR_1) : RemoveSpell(SUNDER_ARMOR_1);\n+            InitSpellMap(INTIMIDATING_SHOUT_1);\n+            InitSpellMap(ENRAGED_REGENERATION_1);\n+            InitSpellMap(CHARGE_1);\n+            InitSpellMap(OVERPOWER_1);\n+            InitSpellMap(BLOODRAGE_1);\n+            InitSpellMap(BERSERKER_RAGE_1);\n+            InitSpellMap(INTERCEPT_1);\n+            InitSpellMap(CLEAVE_1);\n+            InitSpellMap(HAMSTRING_1);\n+            InitSpellMap(INTERVENE_1);\n+            InitSpellMap(WHIRLWIND_1);\n+            InitSpellMap(BATTLE_SHOUT_1);\n+            InitSpellMap(REND_1);\n+            InitSpellMap(EXECUTE_1);\n+            InitSpellMap(PUMMEL_1);\n+            InitSpellMap(SLAM_1);\n+            InitSpellMap(RECKLESSNESS_1);\n+            InitSpellMap(RETALIATION_1);\n+            InitSpellMap(VICTORY_RUSH_1);\n+            InitSpellMap(THUNDER_CLAP_1);\n+            InitSpellMap(REVENGE_1);\n+            InitSpellMap(SHIELD_BLOCK_1);\n+            InitSpellMap(SHIELD_SLAM_1);\n+            InitSpellMap(SPELL_REFLECTION_1);\n+            InitSpellMap(DISARM_1);\n+            InitSpellMap(SHIELD_WALL_1);\n+            InitSpellMap(SHIELD_BASH_1);\n+            InitSpellMap(HEROIC_THROW_1);\n+            InitSpellMap(MOCKING_BLOW_1);\n+            InitSpellMap(HEROIC_STRIKE_1);\n+            InitSpellMap(CHALLENGING_SHOUT_1);\n+            InitSpellMap(COMMANDING_SHOUT_1);\n+            InitSpellMap(SHATTERING_THROW_1);\n+            InitSpellMap(DEMORALIZING_SHOUT_1);\n+\n+  /*Talent*/lvl >= 30 && isArms ? InitSpellMap(SWEEPING_STRIKES_1) : RemoveSpell(SWEEPING_STRIKES_1);\n+  /*Talent*/lvl >= 40 && isArms ? InitSpellMap(MORTAL_STRIKE_1) : RemoveSpell(MORTAL_STRIKE_1);\n+  /*Talent*/lvl >= 60 && isArms ? InitSpellMap(BLADESTORM_1) : RemoveSpell(BLADESTORM_1);\n+\n+  /*Talent*/lvl >= (isFury ? 20 : isArms ? 70 : 99) ? InitSpellMap(PIERCING_HOWL_1) : RemoveSpell(PIERCING_HOWL_1);\n+  /*Talent*/lvl >= 30 && isFury ? InitSpellMap(DEATH_WISH_1) : RemoveSpell(DEATH_WISH_1);\n+  /*Talent*/lvl >= 40 && isFury ? InitSpellMap(BLOODTHIRST_1) : RemoveSpell(BLOODTHIRST_1);\n+  /*Talent*/lvl >= 50 && isFury ? InitSpellMap(HEROIC_FURY_1) : RemoveSpell(HEROIC_FURY_1);\n+\n+  /*Talent*/lvl >= 20 && isProt ? InitSpellMap(LAST_STAND_1) : RemoveSpell(LAST_STAND_1);\n+  /*Talent*/lvl >= 30 && isProt ? InitSpellMap(CONCUSSION_BLOW_1) : RemoveSpell(CONCUSSION_BLOW_1);\n+  /*Talent*/lvl >= 40 && isProt ? InitSpellMap(VIGILANCE_1) : RemoveSpell(VIGILANCE_1);\n+  /*Talent*/lvl >= 50 && isProt ? InitSpellMap(DEVASTATE_1) : RemoveSpell(DEVASTATE_1);\n+  /*Talent*/lvl >= 60 && isProt ? InitSpellMap(SHOCKWAVE_1) : RemoveSpell(SHOCKWAVE_1);\n+        }\n+\n+        void ApplyClassPassives() const override\n+        {\n+            uint8 level = master->GetLevel();\n+            bool isArms = GetSpec() == BOT_SPEC_WARRIOR_ARMS;\n+            bool isFury = GetSpec() == BOT_SPEC_WARRIOR_FURY;\n+            bool isProt = GetSpec() == BOT_SPEC_WARRIOR_PROTECTION;\n+\n+            RefreshAura(DEEP_WOUNDS_3, (isArms || isFury) && level >= 24 ? 1 : 0);\n+            RefreshAura(DEEP_WOUNDS_2, (isArms || isFury) && level >= 23 && level < 24 ? 1 : 0);\n+            RefreshAura(DEEP_WOUNDS_1, (isArms || isFury) && level >= 22 && level < 23 ? 1 : 0);\n+            RefreshAura(TWO_HANDED_WEAPON_SPECIALIZATION, isArms && level >= 25 ? 1 : 0);\n+            RefreshAura(TASTE_FOR_BLOOD3, isArms && level >= 27 ? 1 : 0);\n+            RefreshAura(TASTE_FOR_BLOOD2, isArms && level >= 26 && level < 27 ? 1 : 0);\n+            RefreshAura(TASTE_FOR_BLOOD1, isArms && level >= 25 && level < 26 ? 1 : 0);\n+            RefreshAura(IMPROVED_HAMSTRING, isArms && level >= 15 ? 1 : 0);\n+            RefreshAura(TRAUMA2, isArms && level >= 36 ? 1 : 0);\n+            RefreshAura(TRAUMA1, isArms && level >= 35 && level < 36 ? 1 : 0);\n+            RefreshAura(SECOND_WIND, isArms && level >= 40 ? 1 : 0);\n+            RefreshAura(JUGGERNAUGHT, isArms && level >= 45 ? 1 : 0);\n+            RefreshAura(SUDDEN_DEATH, isArms && level >= 50 ? 1 : 0);\n+            RefreshAura(ENDLESS_RAGE, isArms && level >= 50 ? 1 : 0);\n+            RefreshAura(BLOOD_FRENZY, isArms && level >= 50 ? 1 : 0);\n+            RefreshAura(WRECKING_CREW, isArms && level >= 55 ? 1 : 0);\n+            _checkSwordSpec();\n+\n+            RefreshAura(ARMORED_TO_THE_TEETH, level >= 10 ? 1 : 0);\n+            RefreshAura(BLOOD_CRAZE3, (isArms || isFury) && level >= 22 ? 1 : 0);\n+            RefreshAura(BLOOD_CRAZE2, (isArms || isFury) && level >= 21 && level < 22 ? 1 : 0);\n+            RefreshAura(BLOOD_CRAZE1, (isArms || isFury) && level >= 20 && level < 21 ? 1 : 0);\n+            RefreshAura(DUAL_WIELD_SPECIALIZATION, level >= 25 ? 1 : 0);\n+            RefreshAura(FLURRY5, isFury && level >= 39 ? 1 : 0);\n+            RefreshAura(FLURRY4, isFury && level >= 38 && level < 39 ? 1 : 0);\n+            RefreshAura(FLURRY3, isFury && level >= 37 && level < 38 ? 1 : 0);\n+            RefreshAura(FLURRY2, isFury && level >= 36 && level < 37 ? 1 : 0);\n+            RefreshAura(FLURRY1, isFury && level >= 35 && level < 36 ? 1 : 0);\n+            RefreshAura(FURIOUS_ATTACKS, isFury && level >= 45 ? 1 : 0);\n+            RefreshAura(RAMPAGE, !IAmFree() && isFury && level >= 50 ? 1 : 0);\n+            RefreshAura(BLOODSURGE, isFury && level >= 50 ? 1 : 0);\n+\n+            RefreshAura(SHIELD_SPECIALIZATION, isProt && level >= 10 ? 1 : 0);\n+            RefreshAura(TOUGHNESS, isProt && level >= 20 ? 1 : 0);\n+            RefreshAura(IMPROVED_SPELL_REFLECTION, isProt && level >= 25 ? 1 : 0);\n+            RefreshAura(ONE_HANDED_WEAPON_SPECIALIZATION, isProt && level >= 35 ? 1 : 0);\n+            RefreshAura(IMPROVED_DEFENSIVE_STANCE, isProt && level >= 40 ? 1 : 0);\n+            RefreshAura(SAFEGUARD, isProt && level >= 45 ? 1 : 0);\n+            RefreshAura(WARBRINGER, isProt && level >= 50 ? 1 : 0);\n+            RefreshAura(CRITICAL_BLOCK, isProt && level >= 50 ? 1 : 0);\n+            RefreshAura(DAMAGE_SHIELD, isProt && level >= 55 ? 1 : 0);\n+\n+            RefreshAura(GLYPH_HEROIC_STRIKE, level >= 15 ? 1 : 0);\n+            RefreshAura(GLYPH_REVENGE, level >= 15 ? 1 : 0);\n+            RefreshAura(GLYPH_EXECUTION, level >= 24 ? 1 : 0);\n+            RefreshAura(GLYPH_BLOCKING, level >= 40 ? 1 : 0);\n+            RefreshAura(GLYPH_VIGILANCE, level >= 40 ? 1 : 0);\n+            RefreshAura(GLYPH_DEVASTATE, level >= 50 ? 1 : 0);\n+\n+            RefreshAura(WARRIOR_T10_PROT_4P, level >= 70 ? 1 : 0);\n+        }\n+\n+        bool CanUseManually(uint32 basespell) const override\n+        {\n+            switch (basespell)\n+            {\n+                case BLOODRAGE_1:\n+                case BERSERKER_RAGE_1:\n+                case BATTLE_SHOUT_1:\n+                case COMMANDING_SHOUT_1:\n+                case DEATH_WISH_1:\n+                    return true;\n+                case ENRAGED_REGENERATION_1:\n+                    return me->HasAuraWithMechanic(1u<<MECHANIC_ENRAGED);\n+                case BATTLE_STANCE_1:\n+                    return !_inStance(1);\n+                case DEFENSIVE_STANCE_1:\n+                    return !_inStance(2);\n+                case BERSERKER_STANCE_1:\n+                    return !_inStance(3);\n+                case SWEEPING_STRIKES_1:\n+                    return _inStance(5);\n+                case RETALIATION_1:\n+                    return _inStance(1);\n+                case RECKLESSNESS_1:\n+                    return _inStance(3);\n+                case SHIELD_WALL_1:\n+                    return CanBlock() && _inStance(2);\n+                case SHIELD_BLOCK_1:\n+                    return CanBlock();\n+                case LAST_STAND_1:\n+                case VIGILANCE_1:\n+                    return true;\n+                default:\n+                    return false;\n+            }\n+        }\n+\n+        float GetBotArmorPenetrationCoef() const override\n+        {\n+            float bonus = 0.0f;\n+\n+            if (_inStance(1))\n+            {\n+                bonus += 10.f;\n+                //Warrior T10 4P Bonus (part 1): 6% additional armor penetration in Battle Stance\n+                if (me->GetLevel() >= 75)\n+                    bonus += 6.f;\n+            }\n+\n+            //Mace Specialization: 15% armor penetration\n+            if (GetSpec() == BOT_SPEC_WARRIOR_ARMS && me->GetLevel() >= 30)\n+                if (Item const* weap = GetEquips(BOT_SLOT_MAINHAND))\n+                    if (ItemTemplate const* proto = weap->GetTemplate())\n+                        if (proto->SubClass == ITEM_SUBCLASS_WEAPON_MACE || proto->SubClass == ITEM_SUBCLASS_WEAPON_MACE2)\n+                            bonus += 15.f;\n+\n+            return bonus + bot_ai::GetBotArmorPenetrationCoef();\n+        }\n+\n+        std::vector<uint32> const* GetDamagingSpellsList() const override\n+        {\n+            return &Warrior_spells_damage;\n+        }\n+        std::vector<uint32> const* GetCCSpellsList() const override\n+        {\n+            return &Warrior_spells_cc;\n+        }\n+        //std::vector<uint32> const* GetHealingSpellsList() const override\n+        //{\n+        //    return &Warrior_spells_heal;\n+        //}\n+        std::vector<uint32> const* GetSupportSpellsList() const override\n+        {\n+            return &Warrior_spells_support;\n+        }\n+\n+    private:\n+        bool _inStance(uint8 stance) const\n+        {\n+            switch (stance)\n+            {\n+                case 1: return _stance == STANCE_BATTLE;\n+                case 2: return _stance == STANCE_DEFENSIVE;\n+                case 3: return _stance == STANCE_BERSERKER;\n+                case 4: return _stance == STANCE_BATTLE || _stance == STANCE_DEFENSIVE;\n+                case 5: return _stance == STANCE_BATTLE || _stance == STANCE_BERSERKER;\n+                default: return false;\n+            }\n+        }\n+\n+        void _checkSwordSpec() const\n+        {\n+            uint8 level = me->GetLevel();\n+            bool isArms = GetSpec() == BOT_SPEC_WARRIOR_ARMS;\n+            Item const* mhWeap = GetEquips(BOT_SLOT_MAINHAND);\n+            uint32 weaponSubClass = mhWeap ? mhWeap->GetTemplate()->SubClass : uint32(ITEM_SUBCLASS_WEAPON_WAND);\n+            bool sword = (weaponSubClass == ITEM_SUBCLASS_WEAPON_SWORD || weaponSubClass == ITEM_SUBCLASS_WEAPON_SWORD2);\n+            RefreshAura(SWORD_SPEC5, isArms && sword && level >= 34 ? 1 : 0);\n+            RefreshAura(SWORD_SPEC4, isArms && sword && level >= 33 && level < 34 ? 1 : 0);\n+            RefreshAura(SWORD_SPEC3, isArms && sword && level >= 32 && level < 33 ? 1 : 0);\n+            RefreshAura(SWORD_SPEC2, isArms && sword && level >= 31 && level < 32 ? 1 : 0);\n+            RefreshAura(SWORD_SPEC1, isArms && sword && level >= 30 && level < 31 ? 1 : 0);\n+        }\n+\n+/*tmrs*/uint32 stancetimer, ragetimer, ragetimer2, shoutCheckTimer, shatterCheckTimer, vigiCheckTimer;\n+/*misc*/int32 rage;\n+/*misc*/ObjectGuid vigilanceTargetGuid;\n+/*stnc*/uint8 _stance;\n+    };\n+};\n+\n+void AddSC_warrior_bot()\n+{\n+    new warrior_bot();\n+}\ndiff --git a/src/server/game/AI/NpcBots/botcommands.cpp b/src/server/game/AI/NpcBots/botcommands.cpp\nnew file mode 100644\nindex 0000000000..26a34337a9\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/botcommands.cpp\n@@ -0,0 +1,5125 @@\n+#include \"bot_ai.h\"\n+#include \"botdatamgr.h\"\n+#include \"botdump.h\"\n+#include \"botgearscore.h\"\n+#include \"botlog.h\"\n+#include \"botmgr.h\"\n+#include \"botwanderful.h\"\n+#include \"bot_InstanceEvents.h\"\n+#include \"Bag.h\"\n+#include \"CellImpl.h\"\n+#include \"Chat.h\"\n+#include \"CharacterCache.h\"\n+#include \"Creature.h\"\n+#include \"DatabaseEnv.h\"\n+#include \"DBCStores.h\"\n+#include \"Language.h\"\n+//#include \"GameClient.h\"\n+#include \"GridNotifiers.h\"\n+#include \"GridNotifiersImpl.h\"\n+#include \"Group.h\"\n+#include \"InstanceScript.h\"\n+#include \"Item.h\"\n+#include \"Log.h\"\n+#include \"Map.h\"\n+#include \"MapMgr.h\"\n+#include \"ObjectAccessor.h\"\n+#include \"ObjectMgr.h\"\n+#include \"Player.h\"\n+#include \"RaceMgr.h\"\n+//#include \"RBAC.h\"\n+#include \"ScriptMgr.h\"\n+#include \"SpellInfo.h\"\n+#include \"SpellMgr.h\"\n+#include \"Spell.h\"\n+#include \"TemporarySummon.h\"\n+#include \"Tokenize.h\"\n+#include \"Vehicle.h\"\n+#include \"World.h\"\n+#include \"WorldDatabase.h\"\n+#include \"WorldSession.h\"\n+#include \"WorldSessionMgr.h\"\n+#include <ranges>\n+\n+/*\n+Name: script_bot_commands\n+%Complete: ???\n+Comment: Npc Bot related commands by Trickerer (onlysuffering@gmail.com)\n+Category: commandscripts/custom/\n+*/\n+\n+#ifdef _MSC_VER\n+# pragma warning(push, 4)\n+#endif\n+\n+#ifdef AC_COMPILER\n+//Acore only\n+enum rbac\n+{\n+    RBAC_PERM_COMMAND_NPCBOT                                 = SEC_PLAYER,\n+    RBAC_PERM_COMMAND_NPCBOT_ADD                             = SEC_GAMEMASTER,\n+    RBAC_PERM_COMMAND_NPCBOT_REMOVE                          = SEC_GAMEMASTER,\n+    RBAC_PERM_COMMAND_NPCBOT_SPAWN                           = SEC_GAMEMASTER,\n+    RBAC_PERM_COMMAND_NPCBOT_MOVE                            = SEC_GAMEMASTER,\n+    RBAC_PERM_COMMAND_NPCBOT_DELETE                          = SEC_GAMEMASTER,\n+    RBAC_PERM_COMMAND_NPCBOT_LOOKUP                          = SEC_GAMEMASTER,\n+    RBAC_PERM_COMMAND_NPCBOT_REVIVE                          = SEC_GAMEMASTER,\n+    RBAC_PERM_COMMAND_NPCBOT_RELOADCONFIG                    = SEC_GAMEMASTER,\n+    RBAC_PERM_COMMAND_NPCBOT_INFO                            = SEC_PLAYER,\n+    RBAC_PERM_COMMAND_NPCBOT_HIDE                            = SEC_PLAYER,\n+    RBAC_PERM_COMMAND_NPCBOT_UNHIDE                          = SEC_PLAYER,\n+    RBAC_PERM_COMMAND_NPCBOT_RECALL                          = SEC_PLAYER,\n+    RBAC_PERM_COMMAND_NPCBOT_KILL                            = SEC_PLAYER,\n+    RBAC_PERM_COMMAND_NPCBOT_DEBUG_RAID                      = SEC_GAMEMASTER,\n+    RBAC_PERM_COMMAND_NPCBOT_DEBUG_MOUNT                     = SEC_GAMEMASTER,\n+    RBAC_PERM_COMMAND_NPCBOT_DEBUG_VISUAL                    = SEC_GAMEMASTER,\n+    RBAC_PERM_COMMAND_NPCBOT_DEBUG_STATES                    = SEC_GAMEMASTER,\n+    RBAC_PERM_COMMAND_NPCBOT_TOGGLE_FLAGS                    = SEC_GAMEMASTER,\n+    RBAC_PERM_COMMAND_NPCBOT_SET_FACTION                     = SEC_GAMEMASTER,\n+    RBAC_PERM_COMMAND_NPCBOT_SET_OWNER                       = SEC_GAMEMASTER,\n+    RBAC_PERM_COMMAND_NPCBOT_SET_SPEC                        = SEC_GAMEMASTER,\n+    RBAC_PERM_COMMAND_NPCBOT_COMMAND_STANDSTILL              = SEC_PLAYER,\n+    RBAC_PERM_COMMAND_NPCBOT_COMMAND_STOPFULLY               = SEC_PLAYER,\n+    RBAC_PERM_COMMAND_NPCBOT_COMMAND_FOLLOW                  = SEC_PLAYER,\n+    RBAC_PERM_COMMAND_NPCBOT_ATTDISTANCE_SHORT               = SEC_PLAYER,\n+    RBAC_PERM_COMMAND_NPCBOT_ATTDISTANCE_LONG                = SEC_PLAYER,\n+    RBAC_PERM_COMMAND_NPCBOT_ATTDISTANCE_EXACT               = SEC_PLAYER,\n+    RBAC_PERM_COMMAND_NPCBOT_FOLDISTANCE_EXACT               = SEC_PLAYER,\n+    RBAC_PERM_COMMAND_NPCBOT_ORDER_CAST                      = SEC_PLAYER,\n+    RBAC_PERM_COMMAND_NPCBOT_VEHICLE_EJECT                   = SEC_PLAYER,\n+    RBAC_PERM_COMMAND_NPCBOT_DUMP_LOAD                       = SEC_ADMINISTRATOR,\n+    RBAC_PERM_COMMAND_NPCBOT_DUMP_WRITE                      = SEC_ADMINISTRATOR,\n+    RBAC_PERM_COMMAND_NPCBOT_SPAWNED                         = SEC_GAMEMASTER,\n+    RBAC_PERM_COMMAND_NPCBOT_COMMAND_MISC                    = SEC_PLAYER,\n+    RBAC_PERM_COMMAND_NPCBOT_CREATENEW                       = SEC_ADMINISTRATOR,\n+    RBAC_PERM_COMMAND_NPCBOT_SEND                            = SEC_PLAYER\n+};\n+//end Acore only\n+#endif\n+\n+using namespace std::string_view_literals;\n+using namespace Bcore::ChatCommands;\n+\n+static bool isWPSpawnWarningGiven = false;\n+static uint32 last_model_id = 0;\n+\n+static constexpr size_t SOUND_SETS_COUNT = 3;\n+static constexpr size_t GENDERS_COUNT = 2;\n+static constexpr size_t RACES_COUNT = 10;\n+\n+#ifndef MAX_RACES\n+ #define MAX_RACES 12\n+#endif // !MAX_RACES\n+\n+// model ids with different sound sets tied to them\n+enum SoundSetModels : uint32\n+{\n+    SOUNDSETMODEL_HUMAN_MALE_1          = 1492,\n+    SOUNDSETMODEL_HUMAN_MALE_2          = 1290,\n+    SOUNDSETMODEL_HUMAN_MALE_3          = 1699,\n+    SOUNDSETMODEL_HUMAN_FEMALE_1        = 1295,\n+    SOUNDSETMODEL_HUMAN_FEMALE_2        = 1296,\n+    SOUNDSETMODEL_HUMAN_FEMALE_3        = 1297,\n+    SOUNDSETMODEL_DWARF_MALE_1          = 1280,\n+    SOUNDSETMODEL_DWARF_MALE_2          = 1354,\n+    SOUNDSETMODEL_DWARF_MALE_3          = 1362,\n+    SOUNDSETMODEL_DWARF_FEMALE_1        = 1286,\n+    SOUNDSETMODEL_DWARF_FEMALE_2        = 1407,\n+    SOUNDSETMODEL_DWARF_FEMALE_3        = 2585,\n+    SOUNDSETMODEL_NIGHTELF_MALE_1       = 1285,\n+    SOUNDSETMODEL_NIGHTELF_MALE_2       = 1704,\n+    SOUNDSETMODEL_NIGHTELF_MALE_3       = 1706,\n+    SOUNDSETMODEL_NIGHTELF_FEMALE_1     = 1681,\n+    SOUNDSETMODEL_NIGHTELF_FEMALE_2     = 1682,\n+    SOUNDSETMODEL_NIGHTELF_FEMALE_3     = 1719,\n+    SOUNDSETMODEL_GNOME_MALE_1          = 1832,\n+    SOUNDSETMODEL_GNOME_MALE_2          = 4287,\n+    SOUNDSETMODEL_GNOME_MALE_3          = 4717,\n+    SOUNDSETMODEL_GNOME_FEMALE_1        = 3124,\n+    SOUNDSETMODEL_GNOME_FEMALE_2        = 5378,\n+    SOUNDSETMODEL_GNOME_FEMALE_3        = 3108,\n+    SOUNDSETMODEL_DRAENEI_MALE_1        = 16226,\n+    SOUNDSETMODEL_DRAENEI_MALE_2        = 16589,\n+    SOUNDSETMODEL_DRAENEI_MALE_3        = 16224,\n+    SOUNDSETMODEL_DRAENEI_FEMALE_1      = 16222,\n+    SOUNDSETMODEL_DRAENEI_FEMALE_2      = 16202,\n+    SOUNDSETMODEL_DRAENEI_FEMALE_3      = 16636,\n+    SOUNDSETMODEL_ORC_MALE_1            = 1275,\n+    SOUNDSETMODEL_ORC_MALE_2            = 1326,\n+    SOUNDSETMODEL_ORC_MALE_3            = 1368,\n+    SOUNDSETMODEL_ORC_FEMALE_1          = 1325,\n+    SOUNDSETMODEL_ORC_FEMALE_2          = 1868,\n+    SOUNDSETMODEL_ORC_FEMALE_3          = 1874,\n+    SOUNDSETMODEL_UNDEAD_MALE_1         = 1278,\n+    SOUNDSETMODEL_UNDEAD_MALE_2         = 1562,\n+    SOUNDSETMODEL_UNDEAD_MALE_3         = 1578,\n+    SOUNDSETMODEL_UNDEAD_FEMALE_1       = 1592,\n+    SOUNDSETMODEL_UNDEAD_FEMALE_2       = 1593,\n+    SOUNDSETMODEL_UNDEAD_FEMALE_3       = 1603,\n+    SOUNDSETMODEL_TAUREN_MALE_1         = 2083,\n+    SOUNDSETMODEL_TAUREN_MALE_2         = 2087,\n+    SOUNDSETMODEL_TAUREN_MALE_3         = 2096,\n+    SOUNDSETMODEL_TAUREN_FEMALE_1       = 2113,\n+    SOUNDSETMODEL_TAUREN_FEMALE_2       = 2112,\n+    SOUNDSETMODEL_TAUREN_FEMALE_3       = 2127,\n+    SOUNDSETMODEL_TROLL_MALE_1          = 3608,\n+    SOUNDSETMODEL_TROLL_MALE_2          = 4047,\n+    SOUNDSETMODEL_TROLL_MALE_3          = 4068,\n+    SOUNDSETMODEL_TROLL_FEMALE_1        = 4085,\n+    SOUNDSETMODEL_TROLL_FEMALE_2        = 4231,\n+    SOUNDSETMODEL_TROLL_FEMALE_3        = 4524,\n+    SOUNDSETMODEL_BLOODELF_MALE_1       = 15532,\n+    SOUNDSETMODEL_BLOODELF_MALE_2       = 16700,\n+    SOUNDSETMODEL_BLOODELF_MALE_3       = 16699,\n+    SOUNDSETMODEL_BLOODELF_FEMALE_1     = 15514,\n+    SOUNDSETMODEL_BLOODELF_FEMALE_2     = 15518,\n+    SOUNDSETMODEL_BLOODELF_FEMALE_3     = 15520\n+};\n+\n+static constexpr size_t RaceToRaceOffset[] = {\n+    RACE_NONE,\n+    0, //RACE_HUMAN\n+    5, //RACE_ORC\n+    1, //RACE_DWARF\n+    2, //RACE_RACE_NIGHTELF\n+    6, //RACE_RACE_UNDEAD_PLAYER\n+    7, //RACE_TAUREN\n+    3, //RACE_GNOME\n+    8, //RACE_TROLL\n+    RACE_NONE,\n+    9, //RACE_BLOODELF\n+    4, //RACE_DRAENEI\n+};\n+\n+static constexpr uint32 SoundSetModelsArray[RACES_COUNT][GENDERS_COUNT][SOUND_SETS_COUNT] = {\n+    {{SOUNDSETMODEL_HUMAN_MALE_1, SOUNDSETMODEL_HUMAN_MALE_2, SOUNDSETMODEL_HUMAN_MALE_3}, {SOUNDSETMODEL_HUMAN_FEMALE_1, SOUNDSETMODEL_HUMAN_FEMALE_2, SOUNDSETMODEL_HUMAN_FEMALE_3}},\n+    {{SOUNDSETMODEL_DWARF_MALE_1, SOUNDSETMODEL_DWARF_MALE_2, SOUNDSETMODEL_DWARF_MALE_3}, {SOUNDSETMODEL_DWARF_FEMALE_1, SOUNDSETMODEL_DWARF_FEMALE_2, SOUNDSETMODEL_DWARF_FEMALE_3}},\n+    {{SOUNDSETMODEL_NIGHTELF_MALE_1, SOUNDSETMODEL_NIGHTELF_MALE_2, SOUNDSETMODEL_NIGHTELF_MALE_3}, {SOUNDSETMODEL_NIGHTELF_FEMALE_1, SOUNDSETMODEL_NIGHTELF_FEMALE_2, SOUNDSETMODEL_NIGHTELF_FEMALE_3}},\n+    {{SOUNDSETMODEL_GNOME_MALE_1, SOUNDSETMODEL_GNOME_MALE_2, SOUNDSETMODEL_GNOME_MALE_3}, {SOUNDSETMODEL_GNOME_FEMALE_1, SOUNDSETMODEL_GNOME_FEMALE_2, SOUNDSETMODEL_GNOME_FEMALE_3}},\n+    {{SOUNDSETMODEL_DRAENEI_MALE_1, SOUNDSETMODEL_DRAENEI_MALE_2, SOUNDSETMODEL_DRAENEI_MALE_3}, {SOUNDSETMODEL_DRAENEI_FEMALE_1, SOUNDSETMODEL_DRAENEI_FEMALE_2, SOUNDSETMODEL_DRAENEI_FEMALE_3}},\n+    {{SOUNDSETMODEL_ORC_MALE_1, SOUNDSETMODEL_ORC_MALE_2, SOUNDSETMODEL_ORC_MALE_3}, {SOUNDSETMODEL_ORC_FEMALE_1, SOUNDSETMODEL_ORC_FEMALE_2, SOUNDSETMODEL_ORC_FEMALE_3}},\n+    {{SOUNDSETMODEL_UNDEAD_MALE_1, SOUNDSETMODEL_UNDEAD_MALE_2, SOUNDSETMODEL_UNDEAD_MALE_3}, {SOUNDSETMODEL_UNDEAD_FEMALE_1, SOUNDSETMODEL_UNDEAD_FEMALE_2, SOUNDSETMODEL_UNDEAD_FEMALE_3}},\n+    {{SOUNDSETMODEL_TAUREN_MALE_1, SOUNDSETMODEL_TAUREN_MALE_2, SOUNDSETMODEL_TAUREN_MALE_3}, {SOUNDSETMODEL_TAUREN_FEMALE_1, SOUNDSETMODEL_TAUREN_FEMALE_2, SOUNDSETMODEL_TAUREN_FEMALE_3}},\n+    {{SOUNDSETMODEL_TROLL_MALE_1, SOUNDSETMODEL_TROLL_MALE_2, SOUNDSETMODEL_TROLL_MALE_3}, {SOUNDSETMODEL_TROLL_FEMALE_1, SOUNDSETMODEL_TROLL_FEMALE_2, SOUNDSETMODEL_TROLL_FEMALE_3}},\n+    {{SOUNDSETMODEL_BLOODELF_MALE_1, SOUNDSETMODEL_BLOODELF_MALE_2, SOUNDSETMODEL_BLOODELF_MALE_3}, {SOUNDSETMODEL_BLOODELF_FEMALE_1, SOUNDSETMODEL_BLOODELF_FEMALE_2, SOUNDSETMODEL_BLOODELF_FEMALE_3}}\n+};\n+\n+static char const* get_race_name(uint8 race)\n+{\n+    switch (race)\n+    {\n+        case RACE_HUMAN:        return \"Human\";\n+        case RACE_ORC:          return \"Orc\";\n+        case RACE_DWARF:        return \"Dwarf\";\n+        case RACE_NIGHTELF:     return \"Night Elf\";\n+        case RACE_UNDEAD_PLAYER:return \"Undead\";\n+        case RACE_TAUREN:       return \"Tauren\";\n+        case RACE_GNOME:        return \"Gnome\";\n+        case RACE_TROLL:        return \"Troll\";\n+        case RACE_BLOODELF:     return \"Blood Elf\";\n+        case RACE_DRAENEI:      return \"Draenei\";\n+        default:                return \"Non-standard\";\n+    }\n+};\n+\n+static char const* get_class_name(uint8 class_)\n+{\n+    switch (class_)\n+    {\n+        case CLASS_WARRIOR:     return \"Warrior\";\n+        case CLASS_PALADIN:     return \"Paladin\";\n+        case CLASS_HUNTER:      return \"Hunter\";\n+        case CLASS_ROGUE:       return \"Rogue\";\n+        case CLASS_PRIEST:      return \"Priest\";\n+        case CLASS_DEATH_KNIGHT:return \"Death Knight\";\n+        case CLASS_SHAMAN:      return \"Shaman\";\n+        case CLASS_MAGE:        return \"Mage\";\n+        case CLASS_WARLOCK:     return \"Warlock\";\n+        case CLASS_DRUID:       return \"Druid\";\n+        default:                return \"Non-standard\";\n+    }\n+};\n+\n+enum class PlayerVisuals\n+{\n+    Skins,\n+    Faces,\n+    HairStyles,\n+    HairColors,\n+    Features\n+};\n+\n+template<PlayerVisuals E, Races R, Gender G>\n+static consteval uint8 GetMaxVisual()\n+{\n+#define MV_PRED9(skinm,skinf,facem,facef,hairm,hairf,hairc,featm,featf) \\\n+    if      constexpr (E == PlayerVisuals::Skins)      return M ? skinm : skinf; \\\n+    else if constexpr (E == PlayerVisuals::Faces)      return M ? facem : facef; \\\n+    else if constexpr (E == PlayerVisuals::HairStyles) return M ? hairm : hairf; \\\n+    else if constexpr (E == PlayerVisuals::HairColors) return M ? hairc : hairc; \\\n+    else if constexpr (E == PlayerVisuals::Features)   return M ? featm : featf\n+\n+    constexpr bool M = G == GENDER_MALE;\n+    if constexpr (R == RACE_HUMAN)         { MV_PRED9(9,9, 11,14, 16,23, 9,  8,6); }\n+    if constexpr (R == RACE_DWARF)         { MV_PRED9(8,8,   9,9, 15,18, 9, 10,5); }\n+    if constexpr (R == RACE_NIGHTELF)      { MV_PRED9(8,8,   8,8, 11,11, 7,  5,9); }\n+    if constexpr (R == RACE_GNOME)         { MV_PRED9(4,4,   6,6, 11,11, 8,  7,6); }\n+    if constexpr (R == RACE_DRAENEI)       { MV_PRED9(13,13, 9,9, 13,15, 6,  7,6); }\n+    if constexpr (R == RACE_ORC)           { MV_PRED9(8,8,   8,8, 11,12, 7, 10,6); }\n+    if constexpr (R == RACE_UNDEAD_PLAYER) { MV_PRED9(5,5,   9,9, 14,14, 9, 16,7); }\n+    if constexpr (R == RACE_TAUREN)        { MV_PRED9(18,10, 4,3, 12,11, 2,  6,4); }\n+    if constexpr (R == RACE_TROLL)         { MV_PRED9(5,5,   4,5,   9,9, 9, 10,5); }\n+    if constexpr (R == RACE_BLOODELF)      { MV_PRED9(9,9,   9,9, 15,18, 9, 9,10); }\n+    return 0;\n+#undef MV_PRED9\n+}\n+\n+#if !defined(PLAYER_VIS_ARRS) && !defined(PLAYER_VIS_ARR)\n+#define PLAYER_VIS_ARR(r,g) \\\n+    { GetMaxVisual<PlayerVisuals::Skins, r, g>(), \\\n+    GetMaxVisual<PlayerVisuals::Faces, r, g>(), \\\n+    GetMaxVisual<PlayerVisuals::HairStyles, r, g>(), \\\n+    GetMaxVisual<PlayerVisuals::HairColors, r, g>(), \\\n+    GetMaxVisual<PlayerVisuals::Features, r, g>() }\n+\n+#define PLAYER_VIS_ARRS(r) { PLAYER_VIS_ARR(r, GENDER_MALE), PLAYER_VIS_ARR(r, GENDER_FEMALE) }\n+static constinit const uint8 MAX_PLAYER_VISUALS[][GENDERS_COUNT][5] {\n+    PLAYER_VIS_ARRS(RACE_NONE),\n+    PLAYER_VIS_ARRS(RACE_HUMAN),\n+    PLAYER_VIS_ARRS(RACE_ORC),\n+    PLAYER_VIS_ARRS(RACE_DWARF),\n+    PLAYER_VIS_ARRS(RACE_NIGHTELF),\n+    PLAYER_VIS_ARRS(RACE_UNDEAD_PLAYER),\n+    PLAYER_VIS_ARRS(RACE_TAUREN),\n+    PLAYER_VIS_ARRS(RACE_GNOME),\n+    PLAYER_VIS_ARRS(RACE_TROLL),\n+    PLAYER_VIS_ARRS(RACE_NONE),\n+    PLAYER_VIS_ARRS(RACE_BLOODELF),\n+    PLAYER_VIS_ARRS(RACE_DRAENEI)\n+};\n+#undef PLAYER_VIS_ARR\n+#undef PLAYER_VIS_ARRS\n+#endif // !defined(PLAYER_VIS_ARRS) && !defined(PLAYER_VIS_ARR)\n+\n+static_assert(std::size(MAX_PLAYER_VISUALS) == 12);\n+static_assert(std::ranges::all_of(MAX_PLAYER_VISUALS, [](auto const& c) {\n+    return std::size(c) == GENDERS_COUNT;\n+}));\n+static_assert(std::ranges::all_of(MAX_PLAYER_VISUALS, [](auto const& c) {\n+    return std::ranges::all_of(c, [](auto const& cc) { return std::size(cc) == 5; });\n+}));\n+static_assert(sizeof(MAX_PLAYER_VISUALS) == 120);\n+\n+static void ReportVisualRanges(ChatHandler* handler)\n+{\n+#define VISUAL_REPORT_VALUE_G(r,g,v) static_cast<uint32>((MAX_PLAYER_VISUALS[r][g][AsUnderlyingType(v)]))\n+#define FILL_VISUALS_REPORT2G(s,r) s \\\n+    << get_race_name(r) << \" Male:\" \\\n+    << \" skin 0-\" << VISUAL_REPORT_VALUE_G(r, GENDER_MALE, PlayerVisuals::Skins) \\\n+    << \" face 0-\" << VISUAL_REPORT_VALUE_G(r, GENDER_MALE, PlayerVisuals::Faces) \\\n+    << \" hairstyle 0-\" << VISUAL_REPORT_VALUE_G(r, GENDER_MALE, PlayerVisuals::HairStyles) \\\n+    << \" haircolor 0-\" << VISUAL_REPORT_VALUE_G(r, GENDER_MALE, PlayerVisuals::HairColors) \\\n+    << \" features 0-\" << VISUAL_REPORT_VALUE_G(r, GENDER_MALE, PlayerVisuals::Features) \\\n+    << \"\\n\" << get_race_name(r) << \" Female:\" \\\n+    << \" skin 0-\" << VISUAL_REPORT_VALUE_G(r, GENDER_FEMALE, PlayerVisuals::Skins) \\\n+    << \" face 0-\" << VISUAL_REPORT_VALUE_G(r, GENDER_FEMALE, PlayerVisuals::Faces) \\\n+    << \" hairstyle 0-\" << VISUAL_REPORT_VALUE_G(r, GENDER_FEMALE, PlayerVisuals::HairStyles) \\\n+    << \" haircolor 0-\" << VISUAL_REPORT_VALUE_G(r, GENDER_FEMALE, PlayerVisuals::HairColors) \\\n+    << \" features 0-\" << VISUAL_REPORT_VALUE_G(r, GENDER_FEMALE, PlayerVisuals::Features)\n+\n+    handler->SendSysMessage(\"Ranges:\");\n+    for (uint8 race : { RACE_HUMAN, RACE_DWARF, RACE_NIGHTELF, RACE_GNOME, RACE_DRAENEI, RACE_ORC, RACE_UNDEAD_PLAYER, RACE_TAUREN, RACE_TROLL, RACE_BLOODELF })\n+    {\n+        std::ostringstream stream;\n+        switch (race)\n+        {\n+            case RACE_HUMAN:         FILL_VISUALS_REPORT2G(stream, RACE_HUMAN);         break;\n+            case RACE_DWARF:         FILL_VISUALS_REPORT2G(stream, RACE_DWARF);         break;\n+            case RACE_NIGHTELF:      FILL_VISUALS_REPORT2G(stream, RACE_NIGHTELF);      break;\n+            case RACE_GNOME:         FILL_VISUALS_REPORT2G(stream, RACE_GNOME);         break;\n+            case RACE_DRAENEI:       FILL_VISUALS_REPORT2G(stream, RACE_DRAENEI);       break;\n+            case RACE_ORC:           FILL_VISUALS_REPORT2G(stream, RACE_ORC);           break;\n+            case RACE_UNDEAD_PLAYER: FILL_VISUALS_REPORT2G(stream, RACE_UNDEAD_PLAYER); break;\n+            case RACE_TAUREN:        FILL_VISUALS_REPORT2G(stream, RACE_TAUREN);        break;\n+            case RACE_TROLL:         FILL_VISUALS_REPORT2G(stream, RACE_TROLL);         break;\n+            case RACE_BLOODELF:      FILL_VISUALS_REPORT2G(stream, RACE_BLOODELF);      break;\n+            default:                                                                    break;\n+        }\n+\n+        handler->SendSysMessage(stream.view());\n+    }\n+#undef FILL_VISUALS_REPORT2G\n+#undef VISUAL_REPORT_VALUE_G\n+}\n+\n+inline static uint32 GetMaxPlayerVisual(Races race, Gender gender, PlayerVisuals visual_type)\n+{\n+    return static_cast<uint32>((MAX_PLAYER_VISUALS[race][gender][AsUnderlyingType(visual_type)]));\n+}\n+\n+static bool IsValidVisual(uint8 race, uint8 gender, uint8 skin, uint8 face, uint8 hairs, uint8 hairc, uint8 features)\n+{\n+    return (\n+        race < MAX_RACES &&\n+        gender < GENDERS_COUNT &&\n+        skin <= GetMaxPlayerVisual(Races(race), Gender(gender), PlayerVisuals::Skins) &&\n+        face <= GetMaxPlayerVisual(Races(race), Gender(gender), PlayerVisuals::Faces) &&\n+        hairs <= GetMaxPlayerVisual(Races(race), Gender(gender), PlayerVisuals::HairStyles) &&\n+        hairc <= GetMaxPlayerVisual(Races(race), Gender(gender), PlayerVisuals::HairColors) &&\n+        features <= GetMaxPlayerVisual(Races(race), Gender(gender), PlayerVisuals::Features)\n+    );\n+}\n+\n+struct BotClassColor\n+{\n+    std::string_view name;\n+    std::string_view color;\n+};\n+\n+static constexpr std::array BotColors {\n+    BotClassColor{ .name=\"Unknown\"sv, .color=\"ffffffff\"sv },\n+    BotClassColor{ .name=\"Warrior\"sv, .color=\"ffc79c6e\"sv },\n+    BotClassColor{ .name=\"Paladin\"sv, .color=\"fff58cba\"sv },\n+    BotClassColor{ .name=\"Hunter\"sv, .color=\"ffabd473\"sv },\n+    BotClassColor{ .name=\"Rogue\"sv, .color=\"fffff569\"sv },\n+    BotClassColor{ .name=\"Priest\"sv, .color=\"ffffffff\"sv },\n+    BotClassColor{ .name=\"Death Knight\"sv, .color=\"ffc41f3b\"sv },\n+    BotClassColor{ .name=\"Shaman\"sv, .color=\"ff0070de\"sv },\n+    BotClassColor{ .name=\"Mage\"sv, .color=\"ff69ccf0\"sv },\n+    BotClassColor{ .name=\"Warlock\"sv, .color=\"ff9482c9\"sv },\n+    BotClassColor{ .name=\"Unknown\"sv, .color=\"ffffffff\"sv },\n+    BotClassColor{ .name=\"Druid\"sv, .color=\"ffff7d0a\"sv },\n+    BotClassColor{ .name=\"Blademaster\"sv, .color=\"ffa10015\"sv },\n+    BotClassColor{ .name=\"Obsidian Destroyer\"sv, .color=\"ff29004a\"sv },\n+    BotClassColor{ .name=\"Archmage\"sv, .color=\"ff028a99\"sv },\n+    BotClassColor{ .name=\"Dreadlord\"sv, .color=\"ff534161\"sv },\n+    BotClassColor{ .name=\"Spellbreaker\"sv, .color=\"ffcf3c1f\"sv },\n+    BotClassColor{ .name=\"Dark Ranger\"sv, .color=\"ff3e255e\"sv },\n+    BotClassColor{ .name=\"Necromancer\"sv, .color=\"ff9900cc\"sv },\n+    BotClassColor{ .name=\"Sea Witch\"sv, .color=\"ff40d7a9\"sv },\n+    BotClassColor{ .name=\"Crypt Lord\"sv, .color=\"ff19782b\"sv }\n+};\n+\n+static_assert(std::size(BotColors) == BOT_CLASS_END);\n+static_assert(BotColors[BOT_CLASS_CRYPT_LORD].name == \"Crypt Lord\"sv);\n+\n+static std::pair<uint8, uint8> GetZoneLevels(uint32 zoneId)\n+{\n+    //Only maps 0 and 1 are covered\n+    switch (zoneId)\n+    {\n+        case 1: // Dun Morogh\n+        case 12: // Elwynn Forest\n+        case 14: // Durotar\n+        case 85: // Tirisfal Glades\n+        case 141: // Teldrassil\n+        case 215: // Mulgore\n+        case 3430: // Eversong Woods\n+        case 3524: // Azuremyst Isle\n+            return { 1, 10 };\n+        case 38: // Loch Modan\n+        case 40: // Westfall\n+        case 130: // Silverpine Woods\n+        case 148: // Darkshore\n+        case 3433: // Ghostlands\n+        case 3525: // Bloodmyst Isle\n+        case 721: // Gnomeregan\n+            return { 8, 20 };\n+        case 17: // Barrens\n+            return { 8, 25 };\n+        case 44: // Redridge Mountains\n+        case 406: // Stonetalon Mountains\n+            return { 13, 25 };\n+        case 10: // Duskwood\n+        case 11: // Wetlands\n+        case 267: // Hillsbrad Foothills\n+        case 331: // Ashenvale\n+            return { 18, 30 };\n+        case 400: // Thousand Needles\n+            return { 23, 35 };\n+        case 36: // Alterac Mountains\n+        case 45: // Arathi Highlands\n+        case 405: // Desolace\n+            return { 28, 40 };\n+        case 33: // Stranglethorn Valley\n+        case 3: // Badlands\n+        case 8: // Swamp of Sorrows\n+        case 15: // Dustwallow Marsh\n+            return { 33, 45 };\n+        case 47: // Hinterlands\n+        case 357: // Feralas\n+        case 440: // Tanaris\n+            return { 38, 50 };\n+        case 4: // Blasted Lands\n+        case 16: // Azshara\n+        case 51: // Searing Gorge\n+            return { 43, 54 };\n+        case 490: // Un'Goro Crater\n+        case 361: // Felwood\n+            return { 46, 56 };\n+        case 28: // Western Plaguelands\n+        case 46: // Burning Steppes\n+            return { 48, 56 };\n+        case 41: // Deadwind Pass\n+            return { 50, 60 };\n+        case 1377: // Silithus\n+        case 2017: // Stratholme\n+        case 139: // Eastern Plaguelands\n+        case 618: // Winterspring\n+            return { 53, 60 };\n+        case 25: // BlackrockMountain\n+        case 493: // Moonglade\n+            return { 46, 60 };\n+        default:\n+            BOT_LOG_ERROR(\"scripts\", \"GetZoneLevels: no choice for zoneId {}\", zoneId);\n+            return { 1, 60 };\n+    }\n+}\n+\n+static bool IsNoWPZone(uint32 zoneId)\n+{\n+    //Only maps 0 and 1 are covered\n+    switch (zoneId)\n+    {\n+        case 1477: // Moonglade\n+        case 1519: // Stormwind\n+        case 1537: // Ironforge\n+        case 1637: // Orgrimmar\n+        case 1638: // Thunder Bluff\n+        case 1657: // Darnassus\n+        case 3487: // Silvermoon\n+        case 3557: // Exodar\n+        case 493: // Moonglade\n+            return true;\n+        default:\n+            return false;\n+    }\n+}\n+\n+static uint32 GetZoneIdOverride(uint32 zoneId)\n+{\n+    switch (zoneId)\n+    {\n+        case 718: // Wailing Caverns\n+            return 17; // Barrens\n+        case 1337: // Uldaman\n+            return 3; // Badlands\n+        case 2057: // Scholomance\n+            return 139; // EPL\n+        case 2100: // Maraudon\n+            return 405; // Desolace\n+        case 1581: // Deadmines\n+            return 40; // Westfall\n+        default:\n+            return zoneId;\n+    }\n+}\n+\n+struct BotInfo\n+{\n+    BotInfo(uint32 Id, std::string_view&& Name, uint8 Race) : id(Id), name(std::move(Name)), race(Race) {}\n+    uint32 id;\n+    std::string_view name;\n+    uint8 race;\n+\n+    inline constexpr bool operator==(BotInfo const& other) const noexcept { return id == other.id; }\n+    inline constexpr std::strong_ordering operator<=>(BotInfo const& other) const noexcept { return id <=> other.id; }\n+};\n+\n+template <typename C, typename Fn>\n+requires\n+std::random_access_iterator<typename C::iterator> &&\n+std::is_same_v<std::string, typename C::value_type> &&\n+std::is_convertible_v<Fn, std::function<void(std::string const&)>>\n+static void DoForAllNamesNormalizedIn(C& names, Fn&& func)\n+{\n+    for (std::string& name : names)\n+    {\n+        for (std::size_t i{}; i < name.size(); ++i)\n+            if (name[i] == '_')\n+                name[i] = ' ';\n+\n+        std::invoke(std::move(func), name);\n+    }\n+}\n+\n+class script_bot_commands : public CommandScript\n+{\n+public:\n+    script_bot_commands() : CommandScript(\"script_bot_commands\") { }\n+\n+    class WanderNode_AI : public CreatureAI\n+    {\n+    public:\n+        WanderNode_AI(Creature* creature, WanderNode* wp) : CreatureAI(creature), _wp(wp)\n+        { _wp->SetCreature(me); }\n+\n+        void JustDied(Unit*) override { _wp->SetCreature(nullptr); }\n+        //void OnDespawn() override { _wp->SetCreature(nullptr); }\n+\n+        bool CanAIAttack(Unit const*) const override { return false; }\n+        void MoveInLineOfSight(Unit*) override {}\n+        void AttackStart(Unit*) override {}\n+        void UpdateAI(uint32) override {}\n+\n+    private:\n+        WanderNode* const _wp;\n+    };\n+\n+    ChatCommandTable GetCommands() const override\n+    {\n+        static ChatCommandTable npcbotLogCommandTable =\n+        {\n+            //{ \"testwrite\",  HandleNpcBotLogTestWriteCommand,        rbac::RBAC_PERM_COMMAND_NPCBOT_DUMP_WRITE,         Console::Yes },\n+            { \"clear\",      HandleNpcBotLogClearCommand,            rbac::RBAC_PERM_COMMAND_NPCBOT_DUMP_WRITE,         Console::Yes },\n+        };\n+\n+        static ChatCommandTable npcbotToggleCommandTable =\n+        {\n+            { \"flags\",      HandleNpcBotToggleFlagsCommand,         rbac::RBAC_PERM_COMMAND_NPCBOT_TOGGLE_FLAGS,       Console::No  },\n+        };\n+\n+        static ChatCommandTable npcbotWPCommandTable =\n+        {\n+            //{ \"generate\",   HandleNpcBotWPGenerateCommand,          rbac::RBAC_PERM_COMMAND_NPCBOT_SPAWN,              Console::Yes },\n+            { \"spawnall\",   HandleNpcBotWPSpawnAllCommand,          rbac::RBAC_PERM_COMMAND_NPCBOT_SPAWN,              Console::No  },\n+            { \"move\",       HandleNpcBotWPMoveCommand,              rbac::RBAC_PERM_COMMAND_NPCBOT_SPAWN,              Console::No  },\n+            { \"add\",        HandleNpcBotWPAddCommand,               rbac::RBAC_PERM_COMMAND_NPCBOT_SPAWN,              Console::No  },\n+            { \"del\",        HandleNpcBotWPDeleteCommand,            rbac::RBAC_PERM_COMMAND_NPCBOT_SPAWN,              Console::No  },\n+            { \"list\",       HandleNpcBotWPListCommand,              rbac::RBAC_PERM_COMMAND_NPCBOT_SPAWN,              Console::No  },\n+            { \"list all\",   HandleNpcBotWPListAllCommand,           rbac::RBAC_PERM_COMMAND_NPCBOT_SPAWN,              Console::Yes },\n+            { \"go\",         HandleNpcBotWPGoCommand,                rbac::RBAC_PERM_COMMAND_NPCBOT_SPAWN,              Console::No  },\n+            { \"setlevels\",  HandleNpcBotWPSetLevelsCommand,         rbac::RBAC_PERM_COMMAND_NPCBOT_SPAWN,              Console::No  },\n+            { \"setlevels z\",HandleNpcBotWPSetLevelsZoneCommand,     rbac::RBAC_PERM_COMMAND_NPCBOT_SPAWN,              Console::No  },\n+            { \"setflags\",   HandleNpcBotWPSetFlagsCommand,          rbac::RBAC_PERM_COMMAND_NPCBOT_SPAWN,              Console::No  },\n+            { \"setflags z\", HandleNpcBotWPSetFlagsZoneCommand,      rbac::RBAC_PERM_COMMAND_NPCBOT_SPAWN,              Console::No  },\n+            { \"setname\",    HandleNpcBotWPSetNameCommand,           rbac::RBAC_PERM_COMMAND_NPCBOT_SPAWN,              Console::No  },\n+            { \"setlinks\",   HandleNpcBotWPSetLinksCommand,          rbac::RBAC_PERM_COMMAND_NPCBOT_SPAWN,              Console::No  },\n+            { \"setweights\", HandleNpcBotWPSetLinkWeightsCommand,    rbac::RBAC_PERM_COMMAND_NPCBOT_SPAWN,              Console::No  },\n+            { \"info\",       HandleNpcBotWPInfoCommand,              rbac::RBAC_PERM_COMMAND_NPCBOT_SPAWN,              Console::No  },\n+            { \"links\",      HandleNpcBotWPLinksCommand,             rbac::RBAC_PERM_COMMAND_NPCBOT_SPAWN,              Console::No  },\n+        };\n+\n+        static ChatCommandTable npcbotDebugEventCommandTable =\n+        {\n+            { \"launch\",     HandleNpcBotDebugEventLaunchCommand,    rbac::RBAC_PERM_COMMAND_NPCBOT_DEBUG_STATES,       Console::No  },\n+        };\n+\n+        static ChatCommandTable npcbotDebugCommandTable =\n+        {\n+            { \"raid\",       HandleNpcBotDebugRaidCommand,           rbac::RBAC_PERM_COMMAND_NPCBOT_DEBUG_RAID,         Console::No  },\n+            { \"mount\",      HandleNpcBotDebugMountCommand,          rbac::RBAC_PERM_COMMAND_NPCBOT_DEBUG_MOUNT,        Console::No  },\n+            { \"model\",      HandleNpcBotDebugModelCommand,          rbac::RBAC_PERM_COMMAND_NPCBOT_DEBUG_VISUAL,       Console::No  },\n+            { \"spellvisual\",HandleNpcBotDebugSpellVisualCommand,    rbac::RBAC_PERM_COMMAND_NPCBOT_DEBUG_VISUAL,       Console::No  },\n+            { \"states\",     HandleNpcBotDebugStatesCommand,         rbac::RBAC_PERM_COMMAND_NPCBOT_DEBUG_STATES,       Console::No  },\n+            { \"names\",      HandleNpcBotDebugNamesCommand,          rbac::RBAC_PERM_COMMAND_NPCBOT_DEBUG_STATES,       Console::No  },\n+            { \"spells\",     HandleNpcBotDebugSpellsCommand,         rbac::RBAC_PERM_COMMAND_NPCBOT_DEBUG_STATES,       Console::No  },\n+            { \"guids\",      HandleNpcBotDebugGuidsCommand,          rbac::RBAC_PERM_COMMAND_NPCBOT_DEBUG_STATES,       Console::No  },\n+            { \"wbequips\",   HandleNpcBotDebugWBEquipsCommand,       rbac::RBAC_PERM_COMMAND_NPCBOT_DEBUG_STATES,       Console::Yes },\n+            { \"wpreid\",     HandleNpcBotDebugWPReidCommand,         rbac::RBAC_PERM_COMMAND_NPCBOT_DEBUG_STATES,       Console::Yes },\n+            { \"event\",      npcbotDebugEventCommandTable                                                                            },\n+        };\n+\n+        static ChatCommandTable npcbotSetCommandTable =\n+        {\n+            { \"faction\",    HandleNpcBotSetFactionCommand,          rbac::RBAC_PERM_COMMAND_NPCBOT_SET_FACTION,        Console::No  },\n+            { \"owner\",      HandleNpcBotSetOwnerCommand,            rbac::RBAC_PERM_COMMAND_NPCBOT_SET_OWNER,          Console::No  },\n+            { \"spec\",       HandleNpcBotSetSpecCommand,             rbac::RBAC_PERM_COMMAND_NPCBOT_SET_SPEC,           Console::No  },\n+        };\n+\n+        static ChatCommandTable npcbotCommandFollowCommandTable =\n+        {\n+            { \"\",           HandleNpcBotCommandFollowCommand,       rbac::RBAC_PERM_COMMAND_NPCBOT_COMMAND_FOLLOW,     Console::No  },\n+            { \"only\",       HandleNpcBotCommandFollowOnlyCommand,   rbac::RBAC_PERM_COMMAND_NPCBOT_COMMAND_FOLLOW,     Console::No  },\n+        };\n+\n+        static ChatCommandTable npcbotCommandCommandTable =\n+        {\n+            { \"standstill\", HandleNpcBotCommandStandstillCommand,   rbac::RBAC_PERM_COMMAND_NPCBOT_COMMAND_STANDSTILL, Console::No  },\n+            { \"stopfully\",  HandleNpcBotCommandStopfullyCommand,    rbac::RBAC_PERM_COMMAND_NPCBOT_COMMAND_STOPFULLY,  Console::No  },\n+            { \"follow\",     npcbotCommandFollowCommandTable                                                                         },\n+            { \"walk\",       HandleNpcBotCommandWalkCommand,         rbac::RBAC_PERM_COMMAND_NPCBOT_COMMAND_MISC,       Console::No  },\n+            { \"nogossip\",   HandleNpcBotCommandNoGossipCommand,     rbac::RBAC_PERM_COMMAND_NPCBOT_COMMAND_MISC,       Console::No  },\n+            { \"unbind\",     HandleNpcBotCommandUnBindCommand,       rbac::RBAC_PERM_COMMAND_NPCBOT_COMMAND_MISC,       Console::No  },\n+            { \"rebind\",     HandleNpcBotCommandReBindCommand,       rbac::RBAC_PERM_COMMAND_NPCBOT_COMMAND_MISC,       Console::No  },\n+            { \"nocast\",     HandleNpcBotCommandNoCastCommand,       rbac::RBAC_PERM_COMMAND_NPCBOT_COMMAND_MISC,       Console::No  },\n+            { \"nolongcast\", HandleNpcBotCommandNoLongCastCommand,   rbac::RBAC_PERM_COMMAND_NPCBOT_COMMAND_MISC,       Console::No  },\n+        };\n+\n+        static ChatCommandTable npcbotAttackDistanceCommandTable =\n+        {\n+            { \"short\",      HandleNpcBotAttackDistanceShortCommand, rbac::RBAC_PERM_COMMAND_NPCBOT_ATTDISTANCE_SHORT,  Console::No  },\n+            { \"long\",       HandleNpcBotAttackDistanceLongCommand,  rbac::RBAC_PERM_COMMAND_NPCBOT_ATTDISTANCE_LONG,   Console::No  },\n+            { \"\",           HandleNpcBotAttackDistanceExactCommand, rbac::RBAC_PERM_COMMAND_NPCBOT_ATTDISTANCE_EXACT,  Console::No  },\n+        };\n+\n+        static ChatCommandTable npcbotDistanceCommandTable =\n+        {\n+            { \"attack\",     npcbotAttackDistanceCommandTable                                                                        },\n+            { \"\",           HandleNpcBotFollowDistanceCommand,      rbac::RBAC_PERM_COMMAND_NPCBOT_FOLDISTANCE_EXACT,  Console::No  },\n+        };\n+\n+        static ChatCommandTable npcbotOrderCommandTable =\n+        {\n+            { \"cast\",       HandleNpcBotOrderCastCommand,           rbac::RBAC_PERM_COMMAND_NPCBOT_ORDER_CAST,         Console::No  },\n+            { \"pull\",       HandleNpcBotOrderPullCommand,           rbac::RBAC_PERM_COMMAND_NPCBOT_ORDER_CAST,         Console::No  },\n+        };\n+\n+        static ChatCommandTable npcbotVehicleCommandTable =\n+        {\n+            { \"eject\",      HandleNpcBotVehicleEjectCommand,        rbac::RBAC_PERM_COMMAND_NPCBOT_VEHICLE_EJECT,      Console::No  },\n+        };\n+\n+        static ChatCommandTable npcbotDumpCommandTable =\n+        {\n+            { \"load\",       HandleNpcBotDumpLoadCommand,            rbac::RBAC_PERM_COMMAND_NPCBOT_DUMP_LOAD,          Console::Yes },\n+            { \"write\",      HandleNpcBotDumpWriteCommand,           rbac::RBAC_PERM_COMMAND_NPCBOT_DUMP_WRITE,         Console::Yes },\n+        };\n+\n+        static ChatCommandTable npcbotRecallCommandTable =\n+        {\n+            { \"\",           HandleNpcBotRecallCommand,              rbac::RBAC_PERM_COMMAND_NPCBOT_RECALL,             Console::No  },\n+            { \"spawns\",     HandleNpcBotRecallSpawnsCommand,        rbac::RBAC_PERM_COMMAND_NPCBOT_RECALL,             Console::No  },\n+            { \"teleport\",   HandleNpcBotRecallTeleportCommand,      rbac::RBAC_PERM_COMMAND_NPCBOT_RECALL,             Console::No  },\n+        };\n+\n+        static ChatCommandTable npcbotListSpawnedFreeCommandTable =\n+        {\n+            { \"\",           HandleNpcBotSpawnedFreeCommand,         rbac::RBAC_PERM_COMMAND_NPCBOT_SPAWNED,            Console::Yes },\n+            { \"zone\",       HandleNPCBotSpawnedFreeZoneCommand,     rbac::RBAC_PERM_COMMAND_NPCBOT_SPAWNED,            Console::Yes },\n+            { \"class\",      HandleNPCBotSpawnedFreeClassCommand,    rbac::RBAC_PERM_COMMAND_NPCBOT_SPAWNED,            Console::Yes },\n+            { \"level\",      HandleNPCBotSpawnedFreeLevelCommand,    rbac::RBAC_PERM_COMMAND_NPCBOT_SPAWNED,            Console::Yes },\n+            { \"stats\",      HandleNpcBotSpawnedFreeStatsCommand,    rbac::RBAC_PERM_COMMAND_NPCBOT_SPAWNED,            Console::Yes },\n+        };\n+\n+        static ChatCommandTable npcbotListSpawnedCommandTable =\n+        {\n+            { \"\",           HandleNpcBotSpawnedCommand,             rbac::RBAC_PERM_COMMAND_NPCBOT_SPAWNED,            Console::Yes },\n+            { \"zone\",       HandleNPCBotSpawnedZoneCommand,         rbac::RBAC_PERM_COMMAND_NPCBOT_SPAWNED,            Console::Yes },\n+            { \"class\",      HandleNPCBotSpawnedClassCommand,        rbac::RBAC_PERM_COMMAND_NPCBOT_SPAWNED,            Console::Yes },\n+            { \"level\",      HandleNPCBotSpawnedLevelCommand,        rbac::RBAC_PERM_COMMAND_NPCBOT_SPAWNED,            Console::Yes },\n+            { \"stats\",      HandleNpcBotSpawnedStatsCommand,        rbac::RBAC_PERM_COMMAND_NPCBOT_SPAWNED,            Console::Yes },\n+            { \"free\",       npcbotListSpawnedFreeCommandTable                                                                       },\n+        };\n+\n+        static ChatCommandTable npcbotListCommandTable =\n+        {\n+            { \"spawned\",    npcbotListSpawnedCommandTable                                                                           },\n+        };\n+\n+        static ChatCommandTable npcbotDeleteCommandTable =\n+        {\n+            { \"\",           HandleNpcBotDeleteCommand,              rbac::RBAC_PERM_COMMAND_NPCBOT_DELETE,             Console::No  },\n+            { \"id\",         HandleNpcBotDeleteByIdCommand,          rbac::RBAC_PERM_COMMAND_NPCBOT_DELETE,             Console::Yes },\n+            { \"free\",       HandleNpcBotDeleteFreeCommand,          rbac::RBAC_PERM_COMMAND_NPCBOT_DELETE,             Console::Yes },\n+        };\n+\n+        static ChatCommandTable npcbotSendToPointCommandTable =\n+        {\n+            { \"\",           HandleNpcBotSendToPointCommand,         rbac::RBAC_PERM_COMMAND_NPCBOT_SEND,               Console::No  },\n+            { \"set\",        HandleNpcBotSendToPointSetCommand,      rbac::RBAC_PERM_COMMAND_NPCBOT_SEND,               Console::No  },\n+        };\n+\n+        static ChatCommandTable npcbotSendToCommandTable =\n+        {\n+            { \"\",           HandleNpcBotSendToCommand,              rbac::RBAC_PERM_COMMAND_NPCBOT_SEND,               Console::No  },\n+            { \"last\",       HandleNpcBotSendToLastCommand,          rbac::RBAC_PERM_COMMAND_NPCBOT_SEND,               Console::No  },\n+            { \"point\",      npcbotSendToPointCommandTable                                                                           },\n+        };\n+\n+        static ChatCommandTable npcbotUseOnBotCommandTable =\n+        {\n+            { \"spell\",      HandleNpcBotUseOnBotSpellCommand,       rbac::RBAC_PERM_COMMAND_NPCBOT_COMMAND_MISC,       Console::No  },\n+            { \"item\",       HandleNpcBotUseOnBotItemCommand,        rbac::RBAC_PERM_COMMAND_NPCBOT_COMMAND_MISC,       Console::No  },\n+        };\n+\n+        static ChatCommandTable npcbotCommandTable =\n+        {\n+            //{ \"debug\",      npcbotDebugCommandTable                                                                                 },\n+            //{ \"toggle\",     npcbotToggleCommandTable                                                                                },\n+            { \"set\",        npcbotSetCommandTable                                                                                   },\n+            { \"add\",        HandleNpcBotAddCommand,                 rbac::RBAC_PERM_COMMAND_NPCBOT_ADD,                Console::No  },\n+            { \"remove\",     HandleNpcBotRemoveCommand,              rbac::RBAC_PERM_COMMAND_NPCBOT_REMOVE,             Console::No  },\n+            { \"free\",       HandleNpcBotFreeCommand,                rbac::RBAC_PERM_COMMAND_NPCBOT_REMOVE,             Console::No  },\n+            { \"createnew\",  HandleNpcBotCreateNewCommand,           rbac::RBAC_PERM_COMMAND_NPCBOT_CREATENEW,          Console::Yes },\n+            { \"spawn\",      HandleNpcBotSpawnCommand,               rbac::RBAC_PERM_COMMAND_NPCBOT_SPAWN,              Console::No  },\n+            { \"move\",       HandleNpcBotMoveCommand,                rbac::RBAC_PERM_COMMAND_NPCBOT_MOVE,               Console::No  },\n+            { \"delete\",     npcbotDeleteCommandTable                                                                                },\n+            { \"lookup\",     HandleNpcBotLookupCommand,              rbac::RBAC_PERM_COMMAND_NPCBOT_LOOKUP,             Console::Yes },\n+            { \"list\",       npcbotListCommandTable                                                                                  },\n+            { \"revive\",     HandleNpcBotReviveCommand,              rbac::RBAC_PERM_COMMAND_NPCBOT_REVIVE,             Console::No  },\n+            { \"useonbot\",   npcbotUseOnBotCommandTable                                                                              },\n+            { \"command\",    npcbotCommandCommandTable                                                                               },\n+            { \"info\",       HandleNpcBotInfoCommand,                rbac::RBAC_PERM_COMMAND_NPCBOT_INFO,               Console::Yes },\n+            { \"hide\",       HandleNpcBotHideCommand,                rbac::RBAC_PERM_COMMAND_NPCBOT_HIDE,               Console::No  },\n+            { \"unhide\",     HandleNpcBotUnhideCommand,              rbac::RBAC_PERM_COMMAND_NPCBOT_UNHIDE,             Console::No  },\n+            { \"show\",       HandleNpcBotUnhideCommand,              rbac::RBAC_PERM_COMMAND_NPCBOT_UNHIDE,             Console::No  },\n+            { \"recall\",     npcbotRecallCommandTable                                                                                },\n+            { \"kill\",       HandleNpcBotKillCommand,                rbac::RBAC_PERM_COMMAND_NPCBOT_KILL,               Console::No  },\n+            { \"suicide\",    HandleNpcBotKillCommand,                rbac::RBAC_PERM_COMMAND_NPCBOT_KILL,               Console::No  },\n+            { \"fix\",        HandleNpcBotFixCommand,                 rbac::RBAC_PERM_COMMAND_NPCBOT_REVIVE,             Console::No  },\n+            { \"go\",         HandleNpcBotGoCommand,                  rbac::RBAC_PERM_COMMAND_NPCBOT_MOVE,               Console::No  },\n+            { \"gs\",         HandleNpcBotGearScoreCommand,           rbac::RBAC_PERM_COMMAND_NPCBOT_COMMAND_MISC,       Console::No  },\n+            { \"sendto\",     npcbotSendToCommandTable                                                                                },\n+            { \"distance\",   npcbotDistanceCommandTable                                                                              },\n+            { \"order\",      npcbotOrderCommandTable                                                                                 },\n+            { \"vehicle\",    npcbotVehicleCommandTable                                                                               },\n+            { \"dump\",       npcbotDumpCommandTable                                                                                  },\n+            { \"wp\",         npcbotWPCommandTable                                                                                    },\n+            { \"log\",        npcbotLogCommandTable                                                                                   },\n+        };\n+\n+        static ChatCommandTable commandTable =\n+        {\n+            { \"npcbot\",     npcbotCommandTable                                                                                      },\n+        };\n+        return commandTable;\n+    }\n+\n+    static bool HandleNpcBotLogClearCommand(ChatHandler* handler)\n+    {\n+        CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();\n+        trans->Append(\"TRUNCATE TABLE `characters_npcbot_logs`\");\n+        trans->Append(\"ALTER TABLE `characters_npcbot_logs` AUTO_INCREMENT = 0\");\n+        CharacterDatabase.CommitTransaction(trans);\n+        handler->SendSysMessage(\"Table `characters_npcbot_logs` was cleared and autoincrement was reset\");\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotLogTestWriteCommand(ChatHandler* handler, Optional<std::underlying_type_t<BotLogType>> log_type, Optional<uint32> entry, Optional<std::vector<std::string_view>> extra)\n+    {\n+        if (!log_type || !entry)\n+        {\n+            handler->PSendSysMessage(\".npcbot log testwrite #log_type #entry #[owner] #[mapid] #[inmap] #[inworld] #[params[1-{}]]\", MAX_BOT_LOG_PARAMS);\n+            handler->SendSysMessage(\"Test `characters_npcbot_logs` table write 2\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        decltype(extra)::value_type extras = extra ? std::move(extra.value()) : decltype(extra)::value_type{};\n+        extras.resize(MAX_BOT_LOG_PARAMS, {});\n+        BotLogger::Log(*log_type, *entry, std::move(extras[0]), std::move(extras[1]), std::move(extras[2]), std::move(extras[3]), std::move(extras[4]));\n+        return true;\n+    }\n+\n+    static TempSummon* HandleWPSummon(WanderNode* wp, Map* map)\n+    {\n+        CellCoord c = Bcore::ComputeCellCoord(wp->m_positionX, wp->m_positionY);\n+        GridCoord g = Bcore::ComputeGridCoord(wp->m_positionX, wp->m_positionY);\n+        ASSERT(c.IsCoordValid(), \"Invalid Cell coord!\");\n+        ASSERT(g.IsCoordValid(), \"Invalid Grid coord!\");\n+        map->LoadGrid(wp->m_positionX, wp->m_positionY);\n+        ASSERT(map->GetEntry()->IsContinent() || map->GetEntry()->IsBattlegroundOrArena(), map->GetDebugInfo().c_str());\n+\n+        TempSummon* wpc = map->SummonCreature(VISUAL_WAYPOINT, *wp);\n+        wpc->SetTempSummonType(TEMPSUMMON_CORPSE_DESPAWN);\n+        wpc->AIM_Initialize(new WanderNode_AI(wpc, wp));\n+        wpc->setActive(true);\n+        wpc->SetVisibilityDistanceOverride(VisibilityDistanceType::Infinite);\n+        wpc->SetLevel(wp->GetLevels().first);\n+        wpc->AddUnitState(UNIT_STATE_EVADE);\n+        wpc->SetUnitFlag(UNIT_FLAG_IMMUNE_TO_NPC | UNIT_FLAG_IMMUNE_TO_PC);\n+        wpc->SetMaxHealth(wp->GetWPId());\n+        wpc->SetFullHealth();\n+        wpc->SetPowerType(POWER_MANA);\n+        wpc->SetMaxPower(POWER_MANA, wp->GetFlags());\n+        wpc->SetPower(POWER_MANA, wp->GetFlags());\n+        wpc->SetObjectScale(4.0f);\n+        wp->SetupLinkFromAura();\n+        wp->SetupLinkToAura();\n+        wpc->m_serverSideVisibilityDetect.SetValue(SERVERSIDE_VISIBILITY_GM, wpc->m_serverSideVisibility.GetValue(SERVERSIDE_VISIBILITY_GM));\n+        return wpc;\n+    }\n+\n+    static bool HandleNpcBotWPGenerateCommand(ChatHandler* handler, Optional<bool> save)\n+    {\n+        using WanderNodeLink = WanderNode::WanderNodeLink;\n+\n+        WanderNode::RemoveAllWPs();\n+\n+        handler->SendSysMessage(\"Generating wander nodes from POIs. No levels or flags will be set\");\n+\n+        uint32 poiId_start = 0;\n+        for (AreaPOIEntry const* aProto : sAreaPOIStore)\n+        {\n+            if (aProto->mapId != 0 && aProto->mapId != 1/* && aProto->ContinentID != 530 && aProto->ContinentID != 571*/)\n+                continue;\n+\n+            uint32 poiId = ++poiId_start;\n+            std::string poiName = aProto->name;\n+            if (strlen(aProto->name2) > 0)\n+            {\n+                poiName += \" - \";\n+                poiName += aProto->name2;\n+            }\n+            std::erase_if(poiName, [](char c) { return c == '\\''; });\n+            uint32 poiMapId = aProto->mapId;\n+            float x = aProto->x;\n+            float y = aProto->y;\n+            float z = aProto->z;\n+            float o = frand(0.001f, float(M_PI + M_PI) - 0.001f);\n+            float ground_z = sMapMgr->CreateBaseMap(poiMapId)->GetHeight(PHASEMASK_NORMAL, x, y, z);\n+            if (ground_z > INVALID_HEIGHT)\n+                z = ground_z;\n+            uint32 poiZoneId, poiAreaId;\n+            sMapMgr->GetZoneAndAreaId(PHASEMASK_NORMAL, poiZoneId, poiAreaId, poiMapId, x, y, z);\n+\n+            poiZoneId = GetZoneIdOverride(poiZoneId);\n+            if (IsNoWPZone(poiZoneId))\n+            {\n+                --poiId_start;\n+                continue;\n+            }\n+\n+            WanderNode* wp = new WanderNode(poiId, poiMapId, x, y, z, o, poiZoneId, poiAreaId, std::move(poiName));\n+            auto [minl, maxl] = GetZoneLevels(poiZoneId);\n+            wp->SetLevels(minl, maxl);\n+            BotWPFlags flags = BotWPFlags::BOTWP_FLAG_NONE;\n+            wp->SetFlags(flags);\n+            WanderNode::DoForAllMapWPs(poiMapId, [wp = wp](WanderNode const* mwp) {\n+                if (mwp->GetWPId() != wp->GetWPId() && mwp->GetExactDist2d(wp) < MAX_VISIBILITY_DISTANCE)\n+                    wp->Link(WanderNodeLink{ .wp = const_cast<WanderNode*>(mwp), .weight = 0 });\n+            });\n+\n+            handler->SendSysMessage(wp->ToString());\n+        }\n+\n+        handler->PSendSysMessage(\"Generating wander nodes completed with {} nodes\", uint32(WanderNode::GetAllWPsCount()));\n+\n+        if (!(save && *save))\n+            return true;\n+\n+        WorldDatabaseTransaction trans = WorldDatabase.BeginTransaction();\n+        trans->Append(\"DROP TABLE IF EXISTS creature_wander_nodes_\");\n+        trans->Append(\n+            \"CREATE TABLE creature_wander_nodes_ (\"\n+            \"  `id` int(10) unsigned NOT NULL,\"\n+            \"  `name` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'RENAME_ME',\"\n+            \"  `mapid` smallint(5) unsigned NOT NULL DEFAULT '0',\"\n+            \"  `zoneid` int(10) unsigned NOT NULL DEFAULT '0',\"\n+            \"  `areaid` int(10) unsigned NOT NULL DEFAULT '0',\"\n+            \"  `minlevel` tinyint(3) unsigned NOT NULL DEFAULT '0',\"\n+            \"  `maxlevel` tinyint(3) unsigned NOT NULL DEFAULT '0',\"\n+            \"  `flags` int(10) unsigned NOT NULL DEFAULT '0',\"\n+            \"  `x` float NOT NULL DEFAULT '0',\"\n+            \"  `y` float NOT NULL DEFAULT '0',\"\n+            \"  `z` float NOT NULL DEFAULT '0',\"\n+            \"  `o` float NOT NULL DEFAULT '0',\"\n+            \"  `links` mediumtext COLLATE utf8mb4_unicode_ci,\"\n+            \"  PRIMARY KEY (`id`)\"\n+            \") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Bot Wander Map'\"\n+        );\n+        std::ostringstream ss;\n+        ss << \"INSERT INTO creature_wander_nodes_ (id,mapid,x,y,z,o,zoneId,areaId,minlevel,maxlevel,flags,name,links) VALUES \";\n+        WanderNode::DoForAllWPs([&ss](WanderNode const* wp) {\n+            auto [minl, maxl] = wp->GetLevels();\n+            ss << '(' << wp->GetWPId() << ',' << wp->GetMapId()\n+                << ',' << wp->GetPositionX() << ',' << wp->GetPositionY() << ',' << wp->GetPositionZ() << ',' << wp->GetOrientation()\n+                << ',' << wp->GetZoneId() << ',' << wp->GetAreaId() << ',' << uint32(minl) << ',' << uint32(maxl)\n+                << ',' << wp->GetFlags() << \",'\" << wp->GetName() << \"','\" << wp->FormatLinks() << \"'),\";\n+        });\n+        std::string val_str = ss.str();\n+        val_str.resize(val_str.size() - 1u);\n+        trans->Append(val_str);\n+        WorldDatabase.CommitTransaction(trans);\n+\n+        handler->SendSysMessage(\"Saved.\");\n+\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotWPSpawnAllCommand(ChatHandler* handler)\n+    {\n+        if (!isWPSpawnWarningGiven)\n+        {\n+            isWPSpawnWarningGiven = true;\n+            handler->SendSysMessage(\"Warning! Spawning all wander points in map will load ALL required grids. Repeat to confirm.\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+        else\n+        {\n+            if (WanderNode::GetAllWPsCount() == 0u)\n+                BotDataMgr::LoadWanderMap();\n+\n+            Player* player = handler->GetPlayer();\n+            WanderNode::DoForAllMapWPs(player->GetMapId(), [map = player->GetMap()](WanderNode const* wp) {\n+                if (Creature* wpc = wp->GetCreature())\n+                    Unit::Kill(wpc, wpc);\n+                ASSERT_NOTNULL(HandleWPSummon(const_cast<WanderNode*>(wp), map));\n+            });\n+        }\n+\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotWPLinksCommand(ChatHandler* handler)\n+    {\n+        using WanderNodeLink = WanderNode::WanderNodeLink;\n+\n+        Player* player = handler->GetPlayer();\n+        Unit* wpc = player->GetSelectedUnit();\n+\n+        WanderNode* wp = wpc ? WanderNode::FindInAllWPs(wpc->ToCreature()) : nullptr;\n+        if (!wp)\n+        {\n+            handler->SendSysMessage(\"No WP selected\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        auto const& links = wp->GetLinks();\n+\n+        std::vector<WanderNode const*> to_links;\n+        to_links.reserve(links.size());\n+        WanderNode::DoForAllMapWPs(wp->GetMapId(), [=, &to_links](WanderNode const* mwp) {\n+            if (mwp != wp) [[likely]]\n+                if (mwp->HasLink(wp)) [[unlikely]]\n+                    to_links.push_back(mwp);\n+        });\n+\n+        uint32 counter = 0;\n+        std::ostringstream ss;\n+        ss.setf(std::ios_base::fixed);\n+        ss.precision(2);\n+        ss << uint32(to_links.size()) << \" WPs have a link to WP \" << wp->GetWPId() << ':';\n+        WanderNode::DoForContainerWPs(to_links, [&ss, &counter, wp = wp](WanderNode const* lwp) {\n+            ss << \"\\n\" << ++counter << \") <- \" << lwp->ToString() << \" (dist2d: \" << lwp->GetExactDist2d(wp) << \")\";\n+        });\n+        counter = 0;\n+        ss << \"\\nWP \" << wp->GetWPId() << \" has \" << uint32(links.size()) << \" links (avg weight \" << wp->GetAverageLinkWeight() << \"):\";\n+        WanderNode::DoForContainerWPLinks(links, [&ss, &counter, wp = wp](WanderNodeLink const& wlp) {\n+            ss << \"\\n\" << ++counter << \") -> \" << wlp.wp->ToString(static_cast<int32>(wlp.weight)) << \" (dist2d: \" << wp->GetExactDist2d(wlp.wp) << \")\";\n+        });\n+\n+        handler->SendSysMessage(ss.view());\n+\n+        const std::array<uint32, 2> vis_spell_ids = { 2400, 41637 };\n+        WanderNode::DoForContainerWPs(to_links, [=](WanderNode const* lwp) {\n+            if (!lwp->GetCreature())\n+            {\n+                handler->PSendSysMessage(\"Can't visualise link {}-{}, no creature...\", lwp->GetWPId(), wp->GetWPId());\n+                return;\n+            }\n+            for (uint32 spell_id : vis_spell_ids)\n+                lwp->GetCreature()->CastSpell(wpc, spell_id, true);\n+        });\n+        WanderNode::DoForContainerWPLinks(links, [=](WanderNodeLink const& wlp) {\n+            if (!wlp.wp->GetCreature())\n+            {\n+                handler->PSendSysMessage(\"Can't visualise link {}-{}, no creature...\", wp->GetWPId(), wlp.wp->GetWPId());\n+                return;\n+            }\n+            for (uint32 spell_id : vis_spell_ids)\n+                wpc->CastSpell(wlp.wp->GetCreature(), spell_id, true);\n+        });\n+\n+        return true;\n+    }\n+    static bool HandleExtractWPIdWeightPairs(ChatHandler* handler, std::vector<std::string_view> const& links_strings, std::vector<std::pair<uint32, int32>>& link_pairs)\n+    {\n+        bool result = true;\n+        link_pairs.reserve(links_strings.size());\n+        for (std::string_view newlink : links_strings)\n+        {\n+            std::vector<std::string_view> toks = Bcore::Tokenize(newlink, ':', false);\n+            Optional<uint32> val1 = toks.size() >= 1 ? Bcore::StringTo<uint32>(toks[0]) : std::nullopt;\n+            Optional<uint32> val2 = toks.size() >= 2 ? Bcore::StringTo<uint32>(toks[1]) : std::nullopt;\n+            if (toks.size() > 2 || val1 == std::nullopt || val2 == std::nullopt)\n+            {\n+                handler->PSendSysMessage(\"Invalid link format: {}\", newlink);\n+                result = false;\n+                continue;\n+            }\n+            link_pairs.emplace_back(*val1, val2.value_or(int32(-1)));\n+        }\n+        return result;\n+    }\n+    static void HandleWPUpdateLinks(ChatHandler* handler, WanderNode* wp, std::vector<std::pair<uint32, int32>> const& newlinks, bool oneway = false, bool on_delete = false)\n+    {\n+        using WanderNodeLink = WanderNode::WanderNodeLink;\n+\n+        if (oneway && on_delete)\n+        {\n+            handler->PSendSysMessage(\"Can't perform one-way delete!\");\n+            return;\n+        }\n+\n+        std::remove_cvref_t<decltype(wp->GetLinks())> links = wp->GetLinks(); //copy\n+        uint32 average_weight = wp->GetAverageLinkWeight();\n+\n+        std::unordered_set<WanderNode const*> wps_updates;\n+        std::vector<WanderNodeLink const*> wps_relinks;\n+\n+        if (on_delete)\n+        {\n+            //Find all WPs having a link to us and remove those links\n+            WanderNode::DoForAllMapWPs(wp->GetMapId(), [=, &links, &wps_updates](WanderNode const* mwp) {\n+                if (mwp != wp && mwp->HasLink(wp) && std::ranges::none_of(links, [=](WanderNodeLink const& wpl) { return wpl.Id() == mwp->GetWPId(); }))\n+                {\n+                    handler->PSendSysMessage(\"Removing link {}->{}...\", mwp->GetWPId(), wp->GetWPId());\n+                    const_cast<WanderNode*>(mwp)->UnLink(wp);\n+                    wps_updates.insert(mwp);\n+                }\n+            });\n+        }\n+        else\n+        {\n+            wps_updates.insert(wp);\n+            //Re-create all links we are not updating in case of only setting one-way links, unless doing a full purge\n+            if (oneway && !newlinks.empty())\n+                for (std::remove_cvref_t<decltype(links)>::value_type const& wpl : links)\n+                    wps_relinks.push_back(&wpl);\n+        }\n+\n+        if (links.empty())\n+            handler->PSendSysMessage(\"WP {} had no links...\", wp->GetWPId());\n+        else\n+        {\n+            while (!wp->GetLinks().empty())\n+            {\n+                WanderNode* lwp = wp->GetLinks().front().wp;\n+                bool removing_reverse_link = (!oneway || std::ranges::any_of(newlinks, [=](auto const& p) { return p.first == lwp->GetWPId(); })) && lwp->HasLink(wp);\n+                handler->PSendSysMessage(\"Removing link {}{}{}...\", wp->GetWPId(), removing_reverse_link ? \"<->\" : \"->\", lwp->GetWPId());\n+                wp->UnLink(lwp);\n+                if (removing_reverse_link)\n+                {\n+                    lwp->UnLink(wp);\n+                    wps_updates.insert(lwp);\n+                }\n+            }\n+        }\n+\n+        for (auto const& p : newlinks)\n+        {\n+            uint32 lid = p.first;\n+            uint32 lweight = p.second >= 0 ? uint32(p.second) : average_weight;\n+\n+            if (lid == wp->GetWPId())\n+            {\n+                handler->PSendSysMessage(\"Trying to add WP {} to its own links! Are you dumb?\", lid);\n+                continue;\n+            }\n+\n+            WanderNode* lwp = WanderNode::FindInMapWPs(wp->GetMapId(), lid);\n+            if (!lwp)\n+            {\n+                handler->PSendSysMessage(\"WP {} is not found in map {}!\", lid, wp->GetMapId());\n+                continue;\n+            }\n+\n+            if (p.second < 0 && lweight)\n+                handler->PSendSysMessage(\"Link {}{}{} has no weight assigned, using average ({})!\", wp->GetWPId(), oneway ? \"->\" : \"<->\", lid, lweight);\n+\n+            if (!wps_relinks.empty())\n+            {\n+                auto wpscit = std::ranges::find_if(wps_relinks, [=](WanderNodeLink const* wlp) { return wlp->Id() == lwp->GetWPId(); });\n+                if (wpscit != wps_relinks.cend())\n+                    wps_relinks.erase(wpscit);\n+            }\n+\n+            handler->PSendSysMessage(\"Adding link {}{}{} (w={}, avg was {})...\", wp->GetWPId(), oneway ? \"->\" : \"<->\", lid, lweight, average_weight);\n+            if (wp->GetExactDist2d(lwp) > MAX_VISIBILITY_DISTANCE)\n+                handler->PSendSysMessage(\"Warning! Link distance is too great ({:.2f})\", wp->GetExactDist2d(lwp));\n+\n+            wp->Link(WanderNodeLink{ .wp = lwp, .weight = lweight });\n+            if (!oneway)\n+            {\n+                lwp->Link(WanderNodeLink{ .wp = wp, .weight = lwp->GetAverageLinkWeight() });\n+                wps_updates.insert(lwp);\n+            }\n+        }\n+\n+        if (!on_delete)\n+        {\n+            if (!wps_relinks.empty())\n+            {\n+                std::ranges::sort(wps_relinks, [](WanderNodeLink const* wlp1, WanderNodeLink const* wlp2) { return wlp1->Id() < wlp2->Id(); });\n+                for (WanderNodeLink const* wlp : wps_relinks)\n+                {\n+                    handler->PSendSysMessage(\"Adding link {}->{} (w={})...\", wp->GetWPId(), wlp->Id(), wlp->weight);\n+                    if (wp->GetExactDist2d(wlp->wp) > MAX_VISIBILITY_DISTANCE)\n+                        handler->PSendSysMessage(\"Warning! Link distance is too great ({})\", wp->GetExactDist2d(wlp->wp));\n+                    wp->Link(WanderNodeLink{ .wp = wlp->wp, .weight = wlp->weight });\n+                }\n+            }\n+            if (!wp->GetLinks().empty() || !links.empty())\n+            {\n+                handler->PSendSysMessage(\"WP {} links {} -> {}, avg link weight {} -> {}...\",\n+                    wp->GetWPId(), uint32(links.size()), uint32(wp->GetLinks().size()), average_weight, wp->GetAverageLinkWeight());\n+            }\n+        }\n+\n+        WorldDatabaseTransaction trans = WorldDatabase.BeginTransaction();\n+        WanderNode::DoForContainerWPs(wps_updates, [&trans](WanderNode const* uwp) {\n+            trans->Append(\"UPDATE creature_template_npcbot_wander_nodes SET links='{}' WHERE id={}\", uwp->FormatLinks(), uwp->GetWPId());\n+        });\n+        WorldDatabase.DirectCommitTransaction(trans);\n+    }\n+    static void HandleWPUpdateLinkWeights(ChatHandler* handler, WanderNode* wp, std::vector<std::pair<uint32, int32>> const& link_weights)\n+    {\n+        using WanderNodeLink = WanderNode::WanderNodeLink;\n+\n+        bool dirty = false;\n+        auto const& links = wp->GetLinks();\n+        std::vector<uint32> avg_weight_links;\n+\n+        for (auto const& p : link_weights)\n+        {\n+            uint32 lid = p.first;\n+\n+            if (!WanderNode::FindInMapWPs(wp->GetMapId(), lid))\n+            {\n+                handler->PSendSysMessage(\"WP {} does not exist!\", lid);\n+                continue;\n+            }\n+\n+            if (std::ranges::find_if(links, [=](WanderNodeLink const& wpl) { return wpl.Id() == lid; }) == links.cend())\n+            {\n+                handler->PSendSysMessage(\"WP {} has no link to WP {}!\", wp->GetWPId(), lid);\n+                continue;\n+            }\n+\n+            dirty = true;\n+\n+            if (p.second < 0)\n+            {\n+                wp->SetLinkWeight(p.first, 0);\n+                avg_weight_links.push_back(p.first);\n+            }\n+            else\n+                wp->SetLinkWeight(p.first, static_cast<uint32>(p.second));\n+        }\n+\n+        if (!avg_weight_links.empty())\n+        {\n+            uint32 average_weight = wp->GetAverageLinkWeight(true);\n+            for (uint32 awlid : avg_weight_links)\n+                wp->SetLinkWeight(awlid, average_weight);\n+        }\n+\n+        if (dirty)\n+            WorldDatabase.Execute(\"UPDATE creature_template_npcbot_wander_nodes SET links='{}' WHERE id={}\", wp->FormatLinks(), wp->GetWPId());\n+    }\n+    static bool HandleNpcBotWPSetLinksCommand(ChatHandler* handler, Optional<std::vector<uint32>> links, Optional<bool> oneway)\n+    {\n+        if (!links)\n+        {\n+            handler->SendSysMessage(\"Syntax: npcbot wp setlinks #[id[:weight] ...] #[oneway: True/False] #[remove_rev_links: True/False]\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        Player* player = handler->GetPlayer();\n+        Unit* wpc = player->GetSelectedUnit();\n+        WanderNode* wp = wpc ? WanderNode::FindInAllWPs(wpc->ToCreature()) : nullptr;\n+        if (!wp)\n+        {\n+            handler->SendSysMessage(\"No WP selected\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        std::vector<std::pair<uint32, int32>> pairs;\n+        if (!(links->size() == 1 && links->front() == 0))\n+            for (uint32 lid : *links)\n+                pairs.emplace_back(lid, -1);\n+\n+        HandleWPUpdateLinks(handler, wp, pairs, oneway ? *oneway : false);\n+\n+        return true;\n+    }\n+    static bool HandleNpcBotWPSetLinkWeightsCommand(ChatHandler* handler, Optional<std::vector<std::string_view>> link_weights)\n+    {\n+        Player* player = handler->GetPlayer();\n+        Unit* wpc = player->GetSelectedUnit();\n+\n+        WanderNode* wp = wpc ? WanderNode::FindInAllWPs(wpc->ToCreature()) : nullptr;\n+        if (!wp)\n+        {\n+            handler->SendSysMessage(\"No WP selected\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        if (!link_weights || link_weights->empty())\n+        {\n+            handler->SendSysMessage(\"Syntax: npcbot wp setweights #[id:weight ...]\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        std::vector<std::pair<uint32, int32>> pairs;\n+        if (!HandleExtractWPIdWeightPairs(handler, *link_weights, pairs))\n+        {\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        HandleWPUpdateLinkWeights(handler, wp, pairs);\n+\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotWPInfoCommand(ChatHandler* handler, Optional<uint32> wpId)\n+    {\n+        Player* player = handler->GetPlayer();\n+        Unit* wpc = player->GetSelectedUnit();\n+\n+        WanderNode* wp = wpc ? WanderNode::FindInAllWPs(wpc->ToCreature()) : nullptr;\n+\n+        if (!wp && wpId)\n+            wp = WanderNode::FindInAllWPs(*wpId);\n+\n+        if (!wp)\n+        {\n+            handler->SendSysMessage(\"Syntax: npcbot wp info #[id_or_selection]\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        handler->SendSysMessage(wp->ToString());\n+\n+        return true;\n+    }\n+    static bool HandleNpcBotWPSetLevelsZoneCommand(ChatHandler* handler, Optional<uint8> minlevel, Optional<uint8> maxlevel)\n+    {\n+        Player* player = handler->GetPlayer();\n+\n+        if (!minlevel || !maxlevel)\n+        {\n+            handler->SendSysMessage(\"Syntax: npcbot wp info setlevels z #[minlevel] #[maxlevel]\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        if (!*minlevel || !*maxlevel || *minlevel > DEFAULT_MAX_LEVEL || *maxlevel > DEFAULT_MAX_LEVEL || *minlevel > *maxlevel)\n+        {\n+            handler->PSendSysMessage(\"WP levels must be within bounds 1-{}, min <= max\", uint32(DEFAULT_MAX_LEVEL));\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        uint32 zoneId, areaId;\n+        player->GetZoneAndAreaId(zoneId, areaId);\n+        handler->PSendSysMessage(\"Setting levels min={} max={} for zone {}\", uint32(*minlevel), uint32(*maxlevel), zoneId);\n+        WanderNode::DoForAllZoneWPs(zoneId, [handler = handler, minl = *minlevel, maxl = *maxlevel](WanderNode const* wp) {\n+            handler->PSendSysMessage(\"Setting levels min={} max={} for node {} '{}'\", uint32(minl), uint32(maxl), wp->GetWPId(), wp->GetName());\n+            const_cast<WanderNode*>(wp)->SetLevels(minl, maxl);\n+            if (Creature* creature = wp->GetCreature())\n+                if (creature->GetLevel() != minl)\n+                    creature->SetLevel(minl);\n+            WorldDatabase.Execute(\"UPDATE creature_template_npcbot_wander_nodes SET minlevel={}, maxlevel={} WHERE id={}\",\n+                uint32(minl), uint32(maxl), wp->GetWPId());\n+        });\n+\n+        return true;\n+    }\n+    static bool HandleNpcBotWPSetLevelsCommand(ChatHandler* handler, Optional<uint8> minlevel, Optional<uint8> maxlevel)\n+    {\n+        Player* player = handler->GetPlayer();\n+        Unit* wpc = player->GetSelectedUnit();\n+\n+        WanderNode* wp = wpc ? WanderNode::FindInAllWPs(wpc->ToCreature()) : nullptr;\n+        if (!wp)\n+        {\n+            handler->SendSysMessage(\"No WP selected\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        if (!minlevel || !maxlevel)\n+        {\n+            handler->SendSysMessage(\"Syntax: npcbot wp info setlevels #[minlevel] #[maxlevel]\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        if (!*minlevel || !*maxlevel || *minlevel > DEFAULT_MAX_LEVEL || *maxlevel > DEFAULT_MAX_LEVEL || *minlevel > *maxlevel)\n+        {\n+            handler->PSendSysMessage(\"WP levels must be within bounds 1-{}, min <= max\", uint32(DEFAULT_MAX_LEVEL));\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        uint32 wpId = wp->GetWPId();\n+        auto [minlevel_cur, maxlevel_cur] = wp->GetLevels();\n+\n+        handler->PSendSysMessage(\"Changing WP {} '{}' levels from {}-{} to {}-{}\", wpId, wp->GetName().c_str(), uint32(minlevel_cur), uint32(maxlevel_cur), uint32(*minlevel), uint32(*maxlevel));\n+        wp->SetLevels(*minlevel, *maxlevel);\n+        if (Creature* creature = wp->GetCreature())\n+            if (creature->GetLevel() != *minlevel)\n+                creature->SetLevel(*minlevel);\n+\n+        WorldDatabase.Execute(\"UPDATE creature_template_npcbot_wander_nodes SET minlevel={}, maxlevel={} WHERE id={}\",\n+            uint32(*minlevel), uint32(*maxlevel), wpId);\n+\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotWPSetFlagsZoneCommand(ChatHandler* handler, Optional<int32> flags)\n+    {\n+        Player* player = handler->GetPlayer();\n+\n+        if (!flags)\n+        {\n+            handler->SendSysMessage(\"Syntax: npcbot wp info setflags z #[flags]\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        uint32 zoneId, areaId;\n+        player->GetZoneAndAreaId(zoneId, areaId);\n+        WanderNode::DoForAllZoneWPs(zoneId, [handler = handler, flags = *flags](WanderNode const* wp) {\n+            uint32 wpId = wp->GetWPId();\n+            if (flags < 0)\n+            {\n+                handler->PSendSysMessage(\"Removing WP {} '{}' flag {}\", wpId, wp->GetName(), uint32(-flags));\n+                const_cast<WanderNode*>(wp)->RemoveFlags(BotWPFlags(-flags));\n+            }\n+            else\n+            {\n+                handler->PSendSysMessage(\"Adding WP {} '{}' flag {}\", wpId, wp->GetName(), uint32(flags));\n+                const_cast<WanderNode*>(wp)->SetFlags(BotWPFlags(flags));\n+            }\n+            WorldDatabase.Execute(\"UPDATE creature_template_npcbot_wander_nodes SET flags={} WHERE id={}\", wp->GetFlags(), wpId);\n+        });\n+\n+        return true;\n+    }\n+    static bool HandleNpcBotWPSetFlagsCommand(ChatHandler* handler, Optional<int32> flags)\n+    {\n+        Player* player = handler->GetPlayer();\n+        Unit* wpc = player->GetSelectedUnit();\n+\n+        WanderNode* wp = wpc ? WanderNode::FindInAllWPs(wpc->ToCreature()) : nullptr;\n+        if (!wp)\n+        {\n+            handler->SendSysMessage(\"No WP selected\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        if (!flags)\n+        {\n+            handler->SendSysMessage(\"Syntax: npcbot wp info setflags #[flag]. Use negative value to remove\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        uint32 wpId = wp->GetWPId();\n+\n+        if (*flags < 0)\n+        {\n+            handler->PSendSysMessage(\"Removing WP {} '{}' flag {}\", wpId, wp->GetName(), uint32(-*flags));\n+            wp->RemoveFlags(BotWPFlags(-*flags));\n+        }\n+        else\n+        {\n+            handler->PSendSysMessage(\"Adding WP {} '{}' flag {}\", wpId, wp->GetName(), uint32(*flags));\n+            wp->SetFlags(BotWPFlags(*flags));\n+        }\n+\n+        WorldDatabase.Execute(\"UPDATE creature_template_npcbot_wander_nodes SET flags={} WHERE id={}\", wp->GetFlags(), wpId);\n+\n+        return true;\n+    }\n+    static bool HandleNpcBotWPSetNameCommand(ChatHandler* handler, Optional<std::string> newname)\n+    {\n+        Player* player = handler->GetPlayer();\n+        Unit* wpc = player->GetSelectedUnit();\n+\n+        WanderNode* wp = wpc ? WanderNode::FindInAllWPs(wpc->ToCreature()) : nullptr;\n+        if (!wp)\n+        {\n+            handler->SendSysMessage(\"No WP selected\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        if (!newname)\n+        {\n+            handler->SendSysMessage(\"Syntax: npcbot wp info setname #[name]\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        uint32 wpId = wp->GetWPId();\n+\n+        handler->PSendSysMessage(\"Changing WP {} '{}' name to '{}'\", wpId, wp->GetName(), *newname);\n+        wp->SetName(*newname);\n+\n+        WorldDatabase.Execute(\"UPDATE creature_template_npcbot_wander_nodes SET name='{}' WHERE id={}\", wp->GetName(), wpId);\n+\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotWPMoveCommand(ChatHandler* handler, Optional<uint32> wpId)\n+    {\n+        Player* player = handler->GetPlayer();\n+        Unit* wpc = player->GetSelectedUnit();\n+\n+        WanderNode* wp = (wpc && wpc->IsCreature()) ? WanderNode::FindInAllWPs(wpc->ToCreature()) :\n+            wpId ? WanderNode::FindInAllWPs(*wpId) : nullptr;\n+        if (!wp)\n+        {\n+            handler->SendSysMessage(\"No WP selected or id provided\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        if (wp->GetMapId() != player->GetMapId())\n+        {\n+            handler->SendSysMessage(\"Can't move WP to a different map!\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        wp->Relocate(player);\n+        if (Creature* creature = wp->GetCreature())\n+            creature->NearTeleportTo(*player);\n+\n+        WorldDatabase.Execute(\"UPDATE creature_template_npcbot_wander_nodes SET x={},y={},z={},o={} WHERE id={}\",\n+            wp->m_positionX, wp->m_positionY, wp->m_positionZ, wp->GetOrientation(), wp->GetWPId());\n+\n+        handler->PSendSysMessage(\"WP {} '{}' was successfully moved.\", wp->GetWPId(), wp->GetName());\n+\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotWPAddCommand(ChatHandler* handler, Optional<uint32> flags, Optional<std::string> name, Optional<uint8> minlevel, Optional<uint8> maxlevel)\n+    {\n+        Player* player = handler->GetPlayer();\n+\n+        if (!flags || !name || (!player->GetMap()->GetEntry()->IsContinent() && !player->GetMap()->GetEntry()->IsBattlegroundOrArena()))\n+        {\n+            handler->SendSysMessage(\"Syntax: npcbot wp add #[flags] #[name] #[minlevel #[maxlevel]]. World maps / BGs only\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        if (minlevel)\n+        {\n+            if (!*minlevel || *minlevel > DEFAULT_MAX_LEVEL)\n+            {\n+                handler->PSendSysMessage(\"Minlevel must be between 1 and {}!\", uint32(DEFAULT_MAX_LEVEL));\n+                handler->SetSentErrorMessage(true);\n+                return false;\n+            }\n+            if (maxlevel)\n+            {\n+                if (!*maxlevel || *maxlevel > DEFAULT_MAX_LEVEL)\n+                {\n+                    handler->PSendSysMessage(\"Maxlevel must be between 1 and {}!\", uint32(DEFAULT_MAX_LEVEL));\n+                    handler->SetSentErrorMessage(true);\n+                    return false;\n+                }\n+                if (*minlevel > *maxlevel)\n+                {\n+                    handler->SendSysMessage(\"Minlevel can't be greater than maxlevel\");\n+                    handler->SetSentErrorMessage(true);\n+                    return false;\n+                }\n+            }\n+        }\n+\n+        if (*flags >= AsUnderlyingType(BotWPFlags::BOTWP_FLAG_END))\n+        {\n+            handler->PSendSysMessage(\"Flags must be below {}!\", AsUnderlyingType(BotWPFlags::BOTWP_FLAG_END));\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        uint32 zoneId, areaId;\n+        player->GetZoneAndAreaId(zoneId, areaId);\n+        WanderNode* wp = new WanderNode(++WanderNode::nextWPId, player->GetMapId(), player->m_positionX, player->m_positionY, player->m_positionZ,\n+            player->GetOrientation(), zoneId, areaId, std::move(*name));\n+\n+        wp->SetLevels((!minlevel && !maxlevel) ? GetZoneLevels(GetZoneIdOverride(zoneId)) : std::pair{minlevel ? *minlevel : uint8(1), maxlevel ? *maxlevel : uint8(DEFAULT_MAX_LEVEL)});\n+        wp->SetFlags(BotWPFlags(*flags));\n+\n+        std::vector<std::pair<uint32, int32>> link_pairs;\n+        if (Unit* twpc = player->GetSelectedUnit())\n+            if (WanderNode const* twp = WanderNode::FindInMapWPs(player->GetMapId(), twpc->ToCreature()))\n+                if (twp->GetWPId() != wp->GetWPId() - 1)\n+                    link_pairs.emplace_back(twp->GetWPId(), -1);\n+        if (link_pairs.empty())\n+        {\n+            if (WanderNode const* pwp = WanderNode::FindInMapWPs(player->GetMapId(), wp->GetWPId() - 1))\n+                if (wp->GetExactDist2d(pwp) < MAX_VISIBILITY_DISTANCE)\n+                    link_pairs.emplace_back(pwp->GetWPId(), -1);\n+        }\n+        if (link_pairs.empty())\n+        {\n+            WanderNode::DoForAllMapWPs(wp->GetMapId(), [wp = wp, &link_pairs](WanderNode const* mwp) {\n+                if (wp->GetWPId() != mwp->GetWPId() && wp->GetExactDist2d(mwp) < MAX_VISIBILITY_DISTANCE)\n+                    link_pairs.emplace_back(mwp->GetWPId(), -1);\n+            });\n+        }\n+        HandleWPUpdateLinks(handler, wp, link_pairs);\n+\n+        ASSERT_NOTNULL(HandleWPSummon(wp, player->GetMap()));\n+\n+        uint32 wpId = wp->GetWPId();\n+        std::string_view wpName = wp->GetName();\n+        auto [minl, maxl] = wp->GetLevels();\n+        uint32 wpFlags = wp->GetFlags();\n+\n+        std::ostringstream ss;\n+        ss << \"INSERT INTO creature_template_npcbot_wander_nodes (id,mapid,x,y,z,o,zoneId,areaId,minlevel,maxlevel,flags,name,links)\"\n+            << \" VALUES \"\n+            << '(' << wpId << ',' << wp->GetMapId()\n+            << ',' << wp->GetPositionX() << ',' << wp->GetPositionY() << ',' << wp->GetPositionZ() << ',' << wp->GetOrientation()\n+            << ',' << wp->GetZoneId() << ',' << wp->GetAreaId() << ',' << uint32(minl) << ',' << uint32(maxl)\n+            << ',' << wpFlags << \",'\" << wpName << \"','\" << wp->FormatLinks() << \"')\";\n+\n+        WorldDatabase.Execute(ss.str().c_str());\n+\n+        handler->PSendSysMessage(\"Created WP {} '{}' levels {}-{} flags {}\", wpId, wpName, uint32(minl), uint32(maxl), wpFlags);\n+\n+        return true;\n+    }\n+    static bool HandleNpcBotWPDeleteCommand(ChatHandler* handler)\n+    {\n+        Player* player = handler->GetPlayer();\n+        Unit* wpc = player->GetSelectedUnit();\n+\n+        WanderNode* wp = wpc ? WanderNode::FindInAllWPs(wpc->ToCreature()) : nullptr;\n+        if (!wp)\n+        {\n+            handler->SendSysMessage(\"No WP selected\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        uint32 wpId = wp->GetWPId();\n+        std::string_view wpName = wp->GetName();\n+\n+        HandleWPUpdateLinks(handler, wp, {}, false, true);\n+        WanderNode::RemoveWP(wp);\n+\n+        WorldDatabase.Execute(\"DELETE FROM creature_template_npcbot_wander_nodes WHERE id={}\", wpId);\n+\n+        handler->PSendSysMessage(\"WP {} '{}' was successfully deleted.\", wpId, wpName);\n+\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotWPListCommand(ChatHandler* handler, Optional<uint32> ozoneId, Optional<uint32> oareaId)\n+    {\n+        Player* player = handler->GetPlayer();\n+\n+        uint32 zoneId = 0, areaId = 0;\n+        if (!ozoneId && !oareaId)\n+            player->GetZoneAndAreaId(zoneId, areaId);\n+        else\n+        {\n+            if (ozoneId)\n+                zoneId = *ozoneId;\n+            if (oareaId)\n+                areaId = *oareaId;\n+        }\n+\n+        AreaTableEntry const* zone = sAreaTableStore.LookupEntry(zoneId);\n+        AreaTableEntry const* area = sAreaTableStore.LookupEntry(areaId);\n+\n+        std::ostringstream ss;\n+        ss << \"Zone \" << zoneId << \" (\" << std::string_view(zone ? zone->area_name[0] : \"unknown\") << \") wps:\";\n+        WanderNode::DoForAllZoneWPs(zoneId, [&ss](WanderNode const* wp) {\n+            ss << \"\\n\" << wp->ToString();\n+        });\n+        ss << \"\\nArea \" << areaId << \" (\" << std::string_view(area ? area->area_name[0] : \"unknown\") << \") wps:\";\n+        WanderNode::DoForAllAreaWPs(areaId, [&ss](WanderNode const* wp) {\n+            ss << \"\\n\" << wp->ToString();\n+        });\n+\n+        handler->SendSysMessage(ss.view());\n+        return true;\n+    }\n+    static bool HandleNpcBotWPListAllCommand(ChatHandler* handler)\n+    {\n+        WanderNode::DoForAllWPs([handler = handler](WanderNode const* wp) {\n+            handler->SendSysMessage(wp->ToString());\n+        });\n+\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotWPGoCommand(ChatHandler* handler, uint32 wpId)\n+    {\n+        Player* player = handler->GetPlayer();\n+\n+        WanderNode const* wp = WanderNode::FindInAllWPs(wpId);\n+        if (!wp)\n+        {\n+            handler->PSendSysMessage(\"WP {} not found\", wpId);\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        player->TeleportTo(WorldLocation(wp->GetMapId(), *wp), TELE_TO_GM_MODE);\n+\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotDebugEventLaunchCommand(ChatHandler* handler, Optional<uint32> event_num)\n+    {\n+        if (!event_num)\n+        {\n+            handler->SendSysMessage(\"Syntax: .npcbot debug event launch #event_num\");\n+            handler->SendSysMessage(\"Launches event for this instance\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        Player const* player = handler->GetPlayer();\n+        if (!player->HaveBot())\n+        {\n+            handler->SendSysMessage(\"You have no bots!\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        Map* map = player->GetMap();\n+        if (!map->IsDungeon())\n+        {\n+            handler->SendSysMessage(\"Must be in a dungeon/raid!\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+        InstanceScript* script = map->ToInstanceMap()->GetInstanceScript();\n+        if (!script)\n+        {\n+            handler->PSendSysMessage(\"Instance script is not found for map {}!\", map->GetId());\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        switch (*event_num)\n+        {\n+            case 1:\n+                switch (map->GetId())\n+                {\n+                    case 631: //Icecrown Citadel\n+                    {\n+                        if (player->GetAreaId() != 4859) // \"Frozen Throne\"\n+                        {\n+                            handler->SendSysMessage(\"Must be in Frozen Throne area!\");\n+                            handler->SetSentErrorMessage(true);\n+                            return false;\n+                        }\n+                        GameObject* platform = nullptr;\n+                        Bcore::NearestGameObjectEntryInObjectRangeCheck check(*player, 202161, 100.0f);\n+                        Bcore::GameObjectSearcher<Bcore::NearestGameObjectEntryInObjectRangeCheck> searcher(player, platform, check);\n+                        Cell::VisitObjects(player, searcher, 100.0f);\n+                        if (!platform)\n+                        {\n+                            handler->SendSysMessage(\"Cannot find platform id 202161!\");\n+                            handler->SetSentErrorMessage(true);\n+                            return false;\n+                        }\n+                        FrozenThronePlatformDestructionEvent(script, platform->GetPosition())();\n+                        break;\n+                    }\n+                    default:\n+                        handler->PSendSysMessage(\"Unknown event {} for map {}!\", *event_num, map->GetId());\n+                        handler->SetSentErrorMessage(true);\n+                        return false;\n+                }\n+                break;\n+            default:\n+                handler->PSendSysMessage(\"Unknown event {}!\", *event_num);\n+                handler->SetSentErrorMessage(true);\n+                return false;\n+        }\n+\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotDebugWPReidCommand(ChatHandler* handler, Optional<uint32> start_id, Optional<uint32> end_id, Optional<uint32> target_start_id)\n+    {\n+        if (!start_id)\n+        {\n+            handler->SendSysMessage(\".npcbot debug wpreid #start_id [#end_id #target_start_id]\");\n+            handler->SendSysMessage(\"Compacts WP IDs to elimnate gaps between them, starting with <start_id>\");\n+            handler->SendSysMessage(\"If #end_id and #target_start_id are provided then instead relocates WPs with IDs <start_id>..<end_id> to <target_start_id>...\");\n+            handler->SendSysMessage(\"WARNING: THIS IS UNSAFE! Back-up your wander nodes table before proceeding\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        if (!!end_id != !!target_start_id)\n+        {\n+            handler->SendSysMessage(\"Either both #end_id and #target_start_id or none required!\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        if (end_id && *end_id < *start_id)\n+        {\n+            handler->SendSysMessage(\"End id must be equal or greater than start id!\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        if (static bool all_wps_forced = false; !all_wps_forced)\n+        {\n+            all_wps_forced = true;\n+            handler->SendSysMessage(\"Force loading all wander nodes...\");\n+            BotDataMgr::LoadWanderMap(true, true);\n+        }\n+\n+        std::vector<WanderNode const*> wander_nodes_copy;\n+        wander_nodes_copy.reserve(WanderNode::GetAllWPsCount());\n+        WanderNode::DoForAllWPs([&wander_nodes_copy](WanderNode const* wp) { wander_nodes_copy.push_back(wp); });\n+        std::ranges::sort(wander_nodes_copy, [](WanderNode const* wp1, WanderNode const* wp2) { return wp1->GetWPId() < wp2->GetWPId(); });\n+\n+        uint32 startid = *start_id;\n+        uint32 endid = end_id.value_or(wander_nodes_copy.back()->GetWPId());\n+        const uint32 reid_count = endid - startid + 1;\n+        uint32 target_startid = target_start_id.value_or(startid);\n+\n+        if (target_start_id)\n+        {\n+            if (std::ranges::any_of(wander_nodes_copy, [st = *target_start_id, en = *target_start_id + reid_count - 1](WanderNode const* wpc) {\n+                return wpc->GetWPId() >= st && wpc->GetWPId() <= en; }))\n+            {\n+                handler->SendSysMessage(\"Cannot reid onto existing WP ids!\");\n+                handler->SetSentErrorMessage(true);\n+                return false;\n+            }\n+\n+            handler->PSendSysMessage(\"Running re-id on {}..{} -> {}..{}\", startid, endid, target_startid, uint32(target_startid + reid_count - 1));\n+        }\n+        else\n+            handler->PSendSysMessage(\"Running re-id on {}..{}\", startid, endid);\n+\n+        std::set<uint32> checked_map_ids;\n+        std::vector<uint32> wander_node_deletes;\n+        std::vector<WanderNode const*> wander_node_inserts;\n+        for (WanderNode const* wp : wander_nodes_copy)\n+        {\n+            if (wp->GetWPId() >= startid && wp->GetWPId() <= endid)\n+            {\n+                if (!checked_map_ids.contains(wp->GetMapId()))\n+                {\n+                    checked_map_ids.insert(wp->GetMapId());\n+                    WanderNode::DoForAllMapWPs(wp->GetMapId(), [&wander_node_deletes, &wander_node_inserts](WanderNode const* uwp) {\n+                        wander_node_deletes.push_back(uwp->GetWPId());\n+                        wander_node_inserts.push_back(uwp);\n+                    });\n+                }\n+                uint32 prev_id = wp->GetWPId();\n+                const_cast<WanderNode*>(wp)->SetId(target_startid++);\n+                handler->PSendSysMessage(\"{} => {}\", prev_id, wp->GetWPId());\n+            }\n+        }\n+\n+        if (wander_node_deletes.empty() || wander_node_inserts.empty())\n+        {\n+            handler->SendSysMessage(\"No WPs found within given range\");\n+            return false;\n+        }\n+\n+        std::sort(std::begin(wander_nodes_copy), std::end(wander_nodes_copy), [](WanderNode const* wp1, WanderNode const* wp2) { return wp1->GetWPId() < wp2->GetWPId(); });\n+        WanderNode::nextWPId = wander_nodes_copy.back()->GetWPId();\n+\n+        WorldDatabaseTransaction trans = WorldDatabase.BeginTransaction();\n+        std::ostringstream ss;\n+        for (uint32 wpid : wander_node_deletes)\n+            ss << wpid << ',';\n+        std::string_view wp_range_str = ss.view();\n+        wp_range_str.remove_suffix(1);\n+        trans->Append(\"DELETE FROM `creature_template_npcbot_wander_nodes` WHERE id IN ({})\", wp_range_str);\n+        ss.str(\"\");\n+        ss << \"INSERT INTO `creature_template_npcbot_wander_nodes` (id,mapid,x,y,z,o,zoneid,areaid,minlevel,maxlevel,flags,name,links) VALUES \";\n+        WanderNode::DoForContainerWPs(wander_node_inserts, [&ss](WanderNode const* wp) {\n+            auto [minl, maxl] = wp->GetLevels();\n+            ss << '(' << wp->GetWPId() << ',' << wp->GetMapId()\n+                << ',' << wp->GetPositionX() << ',' << wp->GetPositionY() << ',' << wp->GetPositionZ() << ',' << wp->GetOrientation()\n+                << ',' << wp->GetZoneId() << ',' << wp->GetAreaId() << ',' << uint32(minl) << ',' << uint32(maxl)\n+                << ',' << wp->GetFlags() << \",'\" << wp->GetName() << \"','\" << wp->FormatLinks() << \"'),\";\n+        });\n+        std::string val_str = ss.str();\n+        val_str.resize(val_str.size() - 1u);\n+        trans->Append(val_str.c_str());\n+        WorldDatabase.CommitTransaction(trans);\n+\n+        handler->SendSysMessage(\"Reid complete.\");\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotDebugWBEquipsCommand(ChatHandler* handler, Optional<uint32> bc, Optional<uint32> bs, Optional<EXACT_SEQUENCE(\"ids\")> ids)\n+    {\n+        const std::array<std::string_view, BOT_INVENTORY_SIZE> snames {\n+            \"MHAND\"sv, \"OHAND\"sv, \"RANGED\"sv, \"HEAD\"sv, \"SHOULDERS\"sv, \"CHEST\"sv, \"WAIST\"sv, \"LEGS\"sv, \"FEET\"sv, \"WRIST\"sv, \"HANDS\"sv, \"BACK\"sv, \"BODY\"sv, \"FINGER\"sv, \"FINGER\"sv, \"TRINKET\"sv, \"TRINKET\"sv, \"NECK\"sv\n+        };\n+\n+        if (!bc || !bs || *bc >= BOT_CLASS_END || *bs >= BOT_INVENTORY_SIZE)\n+        {\n+            handler->SendSysMessage(\"Syntax: .npcbot debug wbequips #class #slot #['ids']\");\n+            handler->SendSysMessage(\"List all generated equip templates (or just ids) for wandering bots of class #botclass\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        std::ostringstream ss;\n+        for (uint32 c = BOT_CLASS_WARRIOR; c < BOT_CLASS_END; ++c)\n+        {\n+            if (c != *bc)\n+                continue;\n+            auto cname = BotColors.at(c).name;\n+            ItemPerBotClassMap const& bot_gear = BotDataMgr::GetWanderingBotsSortedGearMap();\n+            ItemPerSlot const& ips_arr = bot_gear.at(c);\n+            for (uint32 s = BOT_SLOT_MAINHAND; s < BOT_INVENTORY_SIZE; ++s)\n+            {\n+                if (s != *bs)\n+                    continue;\n+                ItemLeveledArr const& il_arr = ips_arr[s];\n+                for (uint32 lstep = 0; lstep < LEVEL_STEPS; ++lstep)\n+                {\n+                    uint32 minlvl = std::max<uint32>(lstep * ITEM_SORTING_LEVEL_STEP, 1);\n+                    uint32 maxlvl = (lstep + 1) * ITEM_SORTING_LEVEL_STEP - 1;\n+                    ItemIdVector const& vec = il_arr[lstep];\n+                    ss << cname << ' ' << snames[s] << ' ' << minlvl << '-' << maxlvl << \" (\" << uint32(vec.size()) << \"):\";\n+                    for (uint32 itemId : vec)\n+                    {\n+                        if (ids != std::nullopt)\n+                            ss << \"\\n \" << itemId;\n+                        else\n+                        {\n+                            ItemTemplate const* proto = sObjectMgr->GetItemTemplate(itemId);\n+                            if (!proto)\n+                                ss << \"\\n [Invalid] \" << itemId;\n+                            else\n+                            {\n+                                ss << \"\\n |c\";\n+                                switch (proto->Quality)\n+                                {\n+                                    case ITEM_QUALITY_POOR:     ss << \"ff9d9d9d\"; break;  //GREY\n+                                    case ITEM_QUALITY_NORMAL:   ss << \"ffffffff\"; break;  //WHITE\n+                                    case ITEM_QUALITY_UNCOMMON: ss << \"ff1eff00\"; break;  //GREEN\n+                                    case ITEM_QUALITY_RARE:     ss << \"ff0070dd\"; break;  //BLUE\n+                                    case ITEM_QUALITY_EPIC:     ss << \"ffa335ee\"; break;  //PURPLE\n+                                    case ITEM_QUALITY_LEGENDARY:ss << \"ffff8000\"; break;  //ORANGE\n+                                    case ITEM_QUALITY_ARTIFACT: ss << \"ffe6cc80\"; break;  //LIGHT YELLOW\n+                                    case ITEM_QUALITY_HEIRLOOM: ss << \"ffe6cc80\"; break;  //LIGHT YELLOW\n+                                    default:                    ss << \"ff000000\"; break;  //UNK BLACK\n+                                }\n+                                ss << \"|Hitem:\" << uint32(proto->ItemId) << \":0:0:0:0:0:0:0:0:0|h[\" << proto->Name1 << \"]|h|r\";\n+                            }\n+                        }\n+                    }\n+                    handler->SendSysMessage(ss.view());\n+                    ss.str(\"\");\n+                }\n+            }\n+        }\n+\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotDebugGuidsCommand(ChatHandler* handler)\n+    {\n+        Unit* target = handler->getSelectedUnit();\n+        if (!target)\n+            target = handler->GetPlayer();\n+\n+        std::ostringstream gss;\n+        gss << target->GetName() << \"'s guids:\"\n+            << \"\\n  own guid:\\n\" << target->GetGUID().ToString()\n+            << \"\\n  combo target guid:\\n\" << target->GetComboTargetGUID().ToString()\n+            << \"\\n  pet guid:\\n\" << target->GetPetGUID().ToString()\n+            << \"\\n  minion guid:\\n\" << target->GetMinionGUID().ToString()\n+            << \"\\n  critter guid:\\n\" << target->GetCritterGUID().ToString()\n+            << \"\\n  charmed guid:\\n\" << target->GetCharmGUID().ToString()\n+            << \"\\n  charmer guid:\\n\" << target->GetCharmerGUID().ToString()\n+            << \"\\n  creator guid:\\n\" << target->GetCreatorGUID().ToString()\n+            << \"\\n  creator2 guid:\\n\" << (target->GetCreator() ? target->GetCreator()->GetGUID().ToString() : std::string{})\n+            << \"\\n  owner guid:\\n\" << target->GetOwnerGUID().ToString();\n+\n+        handler->SendSysMessage(gss.view());\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotDebugNamesCommand(ChatHandler* handler, Optional<std::string_view> name)\n+    {\n+        Creature* target = handler->getSelectedCreature();\n+        if (!target || !name)\n+        {\n+            handler->SendSysMessage(\"Syntax: .npcbot debug names #name\");\n+            return true;\n+        }\n+\n+        //CreatureTemplate const* ci = target->GetCreatureTemplate();\n+        //LocaleConstant loc = LocaleConstant(handler->GetSessionDbLocaleIndex());\n+\n+        //WorldPackets::Query::QueryCreatureResponse queryTemp;\n+        //std::string locName(*name);\n+        //std::string locTitle = ci->Title;\n+        //if (CreatureLocale const* cl = sObjectMgr->GetCreatureLocale(ci->Entry))\n+        //{\n+        //    //ObjectMgr::GetLocaleString(cl->Name, loc, locName);\n+        //    ObjectMgr::GetLocaleString(cl->Title, loc, locTitle);\n+        //}\n+        //queryTemp.CreatureID = ci->Entry;\n+        //queryTemp.Allow = true;\n+        //queryTemp.Stats.Name = std::move(locName);\n+        //queryTemp.Stats.Title = std::move(locTitle);\n+        //queryTemp.Stats.CursorName = ci->IconName;\n+        //queryTemp.Stats.Flags = ci->type_flags;\n+        //queryTemp.Stats.CreatureType = ci->type;\n+        //queryTemp.Stats.CreatureFamily = ci->family;\n+        //queryTemp.Stats.Classification = ci->rank;\n+        //memcpy(queryTemp.Stats.ProxyCreatureID, ci->KillCredit, sizeof(uint32) * MAX_KILL_CREDIT);\n+        //queryTemp.Stats.CreatureDisplayID[0] = ci->GetModelByIdx(0);\n+        //queryTemp.Stats.CreatureDisplayID[1] = ci->GetModelByIdx(1);\n+        //queryTemp.Stats.CreatureDisplayID[2] = ci->GetModelByIdx(2);\n+        //queryTemp.Stats.CreatureDisplayID[3] = ci->GetModelByIdx(3);\n+        //queryTemp.Stats.HpMulti = ci->ModHealth;\n+        //queryTemp.Stats.EnergyMulti = ci->ModMana;\n+        //queryTemp.Stats.Leader = ci->RacialLeader;\n+        //for (uint32 i = 0; i < MAX_CREATURE_QUEST_ITEMS; ++i)\n+        //    queryTemp.Stats.QuestItems[i] = 0;\n+        //if (std::vector<uint32> const* items = sObjectMgr->GetCreatureQuestItemList(ci->Entry))\n+        //    for (uint32 i = 0; i < MAX_CREATURE_QUEST_ITEMS; ++i)\n+        //        if (i < items->size())\n+        //            queryTemp.Stats.QuestItems[i] = (*items)[i];\n+        //queryTemp.Stats.CreatureMovementInfoID = ci->movementId;\n+        //queryTemp.Write();\n+        //queryTemp.ShrinkToFit();\n+\n+        //WorldPacket response = queryTemp.Move();\n+        //handler->GetSession()->SendPacket(&response);\n+\n+        handler->SendSysMessage(\"Done.\");\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotDebugSpellsCommand(ChatHandler* handler)\n+    {\n+        Unit* target = handler->getSelectedUnit();\n+        if (!target)\n+        {\n+            handler->SendSysMessage(\"No target selected\");\n+            return true;\n+        }\n+\n+        std::ostringstream ostr;\n+        ostr << \"Listing spells for \" << target->GetName() << ':';\n+        for (uint8 i = 0; i < CURRENT_MAX_SPELL; ++i)\n+        {\n+            if (Spell const* curSpell = target->GetCurrentSpell(CurrentSpellTypes(i)))\n+            {\n+                ostr << \"\\nSpell type \" << uint32(i) << \":\\n\";\n+                ostr << \"Id: \" << curSpell->GetSpellInfo()->Id << \" State: \" << curSpell->getState();\n+            }\n+        }\n+\n+        handler->SendSysMessage(ostr.view());\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotDebugStatesCommand(ChatHandler* handler)\n+    {\n+        Unit const* target = handler->getSelectedUnit();\n+        if (!target)\n+        {\n+            handler->SendSysMessage(\"No target selected\");\n+            return true;\n+        }\n+\n+        std::ostringstream ostr;\n+        ostr << \"Listing states for \" << target->GetName() << \":\";\n+        for (uint32 state = 1u; state != 1u << 31; state <<= 1)\n+        {\n+            if (target->HasUnitState(state))\n+                ostr << \"\\n    0x\" << std::hex << (state);\n+        }\n+\n+        handler->SendSysMessage(ostr.view());\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotDebugRaidCommand(ChatHandler* handler)\n+    {\n+        Player* owner = handler->GetSession()->GetPlayer();\n+        Group const* gr = owner->GetGroup();\n+        if (!owner->HaveBot() || !gr)\n+        {\n+            handler->SendSysMessage(\".npcbot debug raid\");\n+            handler->SendSysMessage(\"prints your raid bots info\");\n+            return true;\n+        }\n+        if (!gr->isRaidGroup())\n+        {\n+            handler->SendSysMessage(\"only usable in raid\");\n+            return true;\n+        }\n+\n+        uint8 counter = 0;\n+        uint8* subBots = new uint8[MAX_RAID_SUBGROUPS];\n+        memset((void*)subBots, 0, (MAX_RAID_SUBGROUPS)*sizeof(uint8));\n+        std::ostringstream sstr;\n+        BotMap const* map = owner->GetBotMgr()->GetBotMap();\n+        for (auto const& [guid, bot] : *map)\n+        {\n+            if (!bot || !gr->IsMember(guid))\n+                continue;\n+\n+            uint8 subGroup = gr->GetMemberGroup(guid);\n+            ++subBots[subGroup];\n+            sstr << uint32(++counter) << \": \" << guid.GetCounter() << \" \" << bot->GetName()\n+                << \" subgr: \" << uint32(subGroup + 1) << \"\\n\";\n+        }\n+\n+        for (uint8 i = 0; i != MAX_RAID_SUBGROUPS; ++i)\n+            if (subBots[i] > 0)\n+                sstr << uint32(subBots[i]) << \" bots in subgroup \" << uint32(i + 1) << \"\\n\";\n+\n+        handler->SendSysMessage(sstr.view());\n+        delete[] subBots;\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotDebugMountCommand(ChatHandler* handler, Optional<uint32> mountId)\n+    {\n+        if (!mountId)\n+            return false;\n+\n+        Unit* target = handler->getSelectedUnit();\n+        if (!target)\n+        {\n+            handler->SendSysMessage(\"No target selected\");\n+            return true;\n+        }\n+\n+        target->Mount(*mountId);\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotDebugModelCommand(ChatHandler* handler, Optional<uint32> setId)\n+    {\n+        Player* owner = handler->GetSession()->GetPlayer();\n+        Unit* target = owner->GetSelectedUnit();\n+        if (!target)\n+        {\n+            handler->SendSysMessage(\"No target selected\");\n+            return true;\n+        }\n+\n+        if (setId)\n+            last_model_id = *setId;\n+\n+        handler->PSendSysMessage(\"Setting model {}...\", last_model_id);\n+        target->SetDisplayId(last_model_id++);\n+\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotDebugSpellVisualCommand(ChatHandler* handler, Optional<uint32> kit)\n+    {\n+        Player* owner = handler->GetSession()->GetPlayer();\n+        Unit* target = owner->GetSelectedUnit();\n+        if (!target)\n+        {\n+            handler->SendSysMessage(\"No target selected\");\n+            return true;\n+        }\n+\n+        target->SendPlaySpellVisual(kit.value_or(0));\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotDumpLoadCommand(ChatHandler* handler, Optional<std::string> file_str, Optional<bool> forceKick)\n+    {\n+        bool force_kick = forceKick.value_or(false);\n+        if (!file_str || (!force_kick && sWorldSessionMgr->GetPlayerCount() > 0))\n+        {\n+            handler->SendSysMessage(\".npcbot dump load\");\n+            handler->SendSysMessage(\"Imports NPCBots from a backup SQL file created with '.npcbot dump write' command.\");\n+            handler->SendSysMessage(\"Syntax: .npcbot dump load #file_name [#force_kick_all]\");\n+            if (!force_kick && sWorldSessionMgr->GetPlayerCount() > 0)\n+                handler->SendSysMessage(\"Make sure no players are online before importing.\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        sWorldSessionMgr->SetPlayerAmountLimit(0);\n+        if (force_kick)\n+            sWorldSessionMgr->KickAll();\n+\n+        //omit file ext if needed\n+        if (file_str->find('.') == std::string::npos)\n+            *file_str += \".sql\";\n+\n+        switch (NPCBotsDump{}.Load(*file_str))\n+        {\n+            case BOT_DUMP_SUCCESS:\n+                handler->SendSysMessage(\"Import successful.\");\n+                handler->SendSysMessage(\"Server will be restarted now to prevent DB corruption.\");\n+                sWorld->ShutdownServ(4, SHUTDOWN_MASK_RESTART, 70);\n+                break;\n+            case BOT_DUMP_FAIL_FILE_NOT_EXIST:\n+                handler->PSendSysMessage(\"Can't open {} or the file doesn't exist!\", *file_str);\n+                handler->SetSentErrorMessage(true);\n+                return false;\n+            case BOT_DUMP_FAIL_FILE_CORRUPTED:\n+                handler->SendSysMessage(\"File data integrity check failed!\");\n+                handler->SetSentErrorMessage(true);\n+                return false;\n+            case BOT_DUMP_FAIL_DATA_OCCUPIED:\n+                handler->PSendSysMessage(\"Table data contained in {} overlaps with existing table entries!\", *file_str);\n+                handler->SetSentErrorMessage(true);\n+                return false;\n+            default:\n+                handler->SendSysMessage(\"Error!\");\n+                handler->SetSentErrorMessage(true);\n+                return false;\n+        }\n+\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotDumpWriteCommand(ChatHandler* handler, Optional<std::string> file_str)\n+    {\n+        if (!file_str)\n+        {\n+            handler->SendSysMessage(\".npcbot dump write\\nExports spawned NPCBots into a SQL file.\\nSyntax: .npcbot dump write #file_name\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        //omit file ext if needed\n+        if (file_str->find('.') == std::string::npos)\n+            *file_str += \".sql\";\n+\n+        switch (NPCBotsDump{}.Write(*file_str))\n+        {\n+            case BOT_DUMP_SUCCESS:\n+                handler->SendSysMessage(\"Export successful.\");\n+                break;\n+            case BOT_DUMP_FAIL_FILE_ALREADY_EXISTS:\n+                handler->PSendSysMessage(\"File {} already exists!\", *file_str);\n+                handler->SetSentErrorMessage(true);\n+                return false;\n+            case BOT_DUMP_FAIL_CANT_WRITE_TO_FILE:\n+                handler->SendSysMessage(\"Can't open file for write!\");\n+                handler->SetSentErrorMessage(true);\n+                return false;\n+            case BOT_DUMP_FAIL_INCOMPLETE:\n+                handler->SendSysMessage(\"Export was not completed!\");\n+                handler->SetSentErrorMessage(true);\n+                return false;\n+            default:\n+                handler->SendSysMessage(\"Error!\");\n+                handler->SetSentErrorMessage(true);\n+                return false;\n+        }\n+\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotOrderPullCommand(ChatHandler* handler, Optional<std::string> bot_name, Optional<std::string_view> target_token)\n+    {\n+        Player* owner = handler->GetSession()->GetPlayer();\n+        if (!owner->HaveBot() || !bot_name)\n+        {\n+            handler->SendSysMessage(\".npcbot order pull #bot_name #[target_token]\");\n+            handler->SendSysMessage(\"Orders bot to pull target immediately\");\n+            return true;\n+        }\n+\n+        if (owner->GetBotMgr()->IsPartyInCombat(false))\n+        {\n+            handler->SendSysMessage(\"Can't do that while in combat!\");\n+            return true;\n+        }\n+\n+        for (std::size_t i{}; i < bot_name->size(); ++i)\n+            if ((*bot_name)[i] == '_')\n+                (*bot_name)[i] = ' ';\n+\n+        Creature const* bot = owner->GetBotMgr()->GetBotByName(*bot_name);\n+        if (bot)\n+        {\n+            if (!bot->IsInWorld())\n+            {\n+                handler->PSendSysMessage(\"Bot {} is not found!\", *bot_name);\n+                return true;\n+            }\n+            if (!bot->IsAlive())\n+            {\n+                handler->PSendSysMessage(\"{} is dead!\", bot->GetName());\n+                return true;\n+            }\n+            if (!bot->GetBotAI()->HasRole(BOT_ROLE_DPS) || bot->GetVictim() || bot->IsInCombat() || !bot->getAttackers().empty())\n+            {\n+                handler->PSendSysMessage(\"{} cannot pull target! Must be idle and have DPS role\", bot->GetName());\n+                return true;\n+            }\n+        }\n+        else\n+        {\n+            auto const& class_name = *bot_name;\n+            if (!std::ranges::all_of(class_name, [](char c) { return std::islower(c); }))\n+            {\n+                handler->SendSysMessage(\"Bot class name must be in lower case!\");\n+                return true;\n+            }\n+\n+            uint8 bot_class = BotMgr::BotClassByClassName(class_name);\n+            if (bot_class == BOT_CLASS_NONE)\n+            {\n+                handler->PSendSysMessage(\"Unknown bot name or class {}!\", class_name);\n+                return true;\n+            }\n+\n+            std::vector<Creature*> cBots = owner->GetBotMgr()->GetAllBotsByClass(bot_class);\n+\n+            if (cBots.empty())\n+            {\n+                handler->PSendSysMessage(\"No bots of class {} found!\", bot_class);\n+                return true;\n+            }\n+\n+            bot = cBots.size() == 1 ? cBots.front() : Bcore::Containers::SelectRandomContainerElement(cBots);\n+\n+            if (!bot)\n+            {\n+                handler->SendSysMessage(\"None of {} found bots can use pull yet!\", cBots.size());\n+                return true;\n+            }\n+        }\n+\n+        ObjectGuid target_guid = ObjectGuid::Empty;\n+        bool token_valid = true;\n+        if (!target_token || target_token == \"mytarget\")\n+            target_guid = owner->GetTarget();\n+        else if (Group const* group = owner->GetGroup())\n+        {\n+            if (target_token == \"star\")\n+                target_guid = group->GetTargetIcons()[0];\n+            else if (target_token == \"circle\")\n+                target_guid = group->GetTargetIcons()[1];\n+            else if (target_token == \"diamond\")\n+                target_guid = group->GetTargetIcons()[2];\n+            else if (target_token == \"triangle\")\n+                target_guid = group->GetTargetIcons()[3];\n+            else if (target_token == \"moon\")\n+                target_guid = group->GetTargetIcons()[4];\n+            else if (target_token == \"square\")\n+                target_guid = group->GetTargetIcons()[5];\n+            else if (target_token == \"cross\")\n+                target_guid = group->GetTargetIcons()[6];\n+            else if (target_token == \"skull\")\n+                target_guid = group->GetTargetIcons()[7];\n+            else if (target_token->size() == 1u && std::isdigit(target_token->front()))\n+            {\n+                uint8 digit = static_cast<uint8>(std::stoi(std::string(*target_token)));\n+                switch (digit)\n+                {\n+                    case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8:\n+                        target_guid = group->GetTargetIcons()[digit - 1];\n+                        break;\n+                    default:\n+                        token_valid = false;\n+                        break;\n+                }\n+            }\n+            else\n+                token_valid = false;\n+        }\n+        else\n+            token_valid = false;\n+\n+        if (!token_valid)\n+        {\n+            handler->PSendSysMessage(\"Invalid target token '{}'!\", *target_token);\n+            handler->SendSysMessage(\"Valid target tokens:\\n    '','mytarget', \"\n+                \"'star','1', 'circle','2', 'diamond','3', 'triangle','4', 'moon','5', 'square','6', 'cross','7', 'skull','8'\"\n+                \"\\nNote that target icons tokens are only available while in group\");\n+            return true;\n+        }\n+\n+        Unit* target = target_guid ? ObjectAccessor::GetUnit(*owner, target_guid) : nullptr;\n+        if (!target || !bot->FindMap() || target->FindMap() != bot->FindMap())\n+        {\n+            handler->PSendSysMessage(\"Invalid target '{}'!\", target ? target->GetName().c_str() : \"unknown\");\n+            return true;\n+        }\n+\n+        bot_ai::BotOrder order(BOT_ORDER_PULL);\n+        order.params.pullParams.targetGuid = target_guid;\n+\n+        if (bot->GetBotAI()->AddOrder(std::move(order)))\n+        {\n+            if (DEBUG_BOT_ORDERS)\n+                handler->PSendSysMessage(\"Order given: {}: pull {}\", bot->GetName(), target ? target->GetName().c_str() : \"unknown\");\n+        }\n+        else\n+        {\n+            if (DEBUG_BOT_ORDERS)\n+                handler->PSendSysMessage(\"Order failed: {}: pull {}\", bot->GetName(), target ? target->GetName().c_str() : \"unknown\");\n+        }\n+\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotOrderCastCommand(ChatHandler* handler, Optional<std::string> bot_name, Optional<std::string> spell_name, Optional<std::string_view> target_token)\n+    {\n+        Player* owner = handler->GetSession()->GetPlayer();\n+        if (!owner->HaveBot() || !bot_name || !spell_name)\n+        {\n+            handler->SendSysMessage(\".npcbot order cast #bot_name #spell_underscored_name #[target_token]\");\n+            handler->SendSysMessage(\"Orders bot to cast a spell immediately\");\n+            return true;\n+        }\n+\n+        for (std::size_t i{}; i < spell_name->size(); ++i)\n+            if ((*spell_name)[i] == '_')\n+                (*spell_name)[i] = ' ';\n+\n+        for (std::size_t i{}; i < bot_name->size(); ++i)\n+            if ((*bot_name)[i] == '_')\n+                (*bot_name)[i] = ' ';\n+\n+        auto canBotUseSpell = [=](Creature const* tbot, uint32 bspell) {\n+            //we ignore GCD for now\n+            return bspell && (tbot->GetBotAI()->GetSpellCooldown(bspell) <= tbot->GetBotAI()->GetLastDiff());\n+        };\n+\n+        uint32 base_spell = 0;\n+        Creature* bot = owner->GetBotMgr()->GetBotByName(*bot_name);\n+        if (bot)\n+        {\n+            if (!bot->IsInWorld())\n+            {\n+                handler->PSendSysMessage(\"Bot {} is not found!\", *bot_name);\n+                return true;\n+            }\n+            if (!bot->IsAlive())\n+            {\n+                handler->PSendSysMessage(\"{} is dead!\", bot->GetName());\n+                return true;\n+            }\n+\n+            base_spell = bot->GetBotAI()->GetBaseSpell(*spell_name, handler->GetSessionDbcLocale());\n+            if (!base_spell)\n+            {\n+                handler->PSendSysMessage(\"{} doesn't have spell named '{}'!\", bot->GetName(), *spell_name);\n+                return true;\n+            }\n+            if (!canBotUseSpell(bot, base_spell))\n+            {\n+                handler->PSendSysMessage(\"{}'s {} is not ready yet!\", bot->GetName(), sSpellMgr->GetSpellInfo(base_spell)->SpellName[handler->GetSessionDbcLocale()]);\n+                return true;\n+            }\n+        }\n+        else\n+        {\n+            auto const& class_name = *bot_name;\n+            if (!std::ranges::all_of(class_name, [](char c) { return std::islower(c); }))\n+            {\n+                handler->SendSysMessage(\"Bot class name must be in lower case!\");\n+                return true;\n+            }\n+\n+            uint8 bot_class = BotMgr::BotClassByClassName(class_name);\n+            if (bot_class == BOT_CLASS_NONE)\n+            {\n+                handler->PSendSysMessage(\"Unknown bot name or class {}!\", class_name);\n+                return true;\n+            }\n+\n+            std::vector<Creature*> cBots = owner->GetBotMgr()->GetAllBotsByClass(bot_class);\n+\n+            if (cBots.empty())\n+            {\n+                handler->PSendSysMessage(\"No bots of class {} found!\", bot_class);\n+                return true;\n+            }\n+\n+            uint32 found_bots_count = static_cast<uint32>(cBots.size());\n+\n+            for (Creature const* fbot : cBots)\n+            {\n+                base_spell = fbot->GetBotAI()->GetBaseSpell(*spell_name, handler->GetSessionDbcLocale());\n+                if (base_spell)\n+                    break;\n+            }\n+\n+            if (!base_spell)\n+            {\n+                handler->PSendSysMessage(\"None of {} found bots have spell named '{}'!\", found_bots_count, *spell_name);\n+                return true;\n+            }\n+\n+            std::erase_if(cBots, [=](Creature const* tbot) {\n+                if (tbot->GetBotAI()->GetOrdersCount() >= MAX_BOT_ORDERS_QUEUE_SIZE)\n+                    return true;\n+                return !canBotUseSpell(tbot, base_spell);\n+            });\n+\n+            decltype(cBots) ccBots;\n+            for (decltype(cBots)::const_iterator it = cBots.begin(); it != cBots.end();)\n+            {\n+                if (!(*it)->GetCurrentSpell(CURRENT_CHANNELED_SPELL) && !(*it)->IsNonMeleeSpellCast(false, false, true, false, false))\n+                {\n+                    ccBots.emplace_back(*it);\n+                    it = cBots.erase(it);\n+                }\n+                else\n+                    ++it;\n+            }\n+\n+            bot = ccBots.empty() ? nullptr : ccBots.size() == 1 ? ccBots.front() : Bcore::Containers::SelectRandomContainerElement(ccBots);\n+            if (!bot)\n+                bot = cBots.empty() ? nullptr : cBots.size() == 1 ? cBots.front() : Bcore::Containers::SelectRandomContainerElement(cBots);\n+\n+            if (!bot)\n+            {\n+                handler->PSendSysMessage(\"None of {} found bots can use {} yet!\", found_bots_count, *spell_name);\n+                return true;\n+            }\n+        }\n+\n+        ObjectGuid target_guid = ObjectGuid::Empty;\n+        bool token_valid = true;\n+        if (!target_token || target_token == \"bot\" || target_token == \"self\")\n+            target_guid = bot->GetGUID();\n+        else if (target_token == \"me\" || target_token == \"master\")\n+            target_guid = owner->GetGUID();\n+        else if (target_token == \"mypet\")\n+            target_guid = owner->GetPetGUID();\n+        else if (target_token == \"myvehicle\")\n+            target_guid = owner->GetVehicle() ? owner->GetVehicleBase()->GetGUID() : ObjectGuid::Empty;\n+        else if (target_token == \"target\")\n+            target_guid = bot->GetTarget();\n+        else if (target_token == \"mytarget\")\n+            target_guid = owner->GetTarget();\n+        else if (Group const* group = owner->GetGroup())\n+        {\n+            if (target_token == \"star\")\n+                target_guid = group->GetTargetIcons()[0];\n+            else if (target_token == \"circle\")\n+                target_guid = group->GetTargetIcons()[1];\n+            else if (target_token == \"diamond\")\n+                target_guid = group->GetTargetIcons()[2];\n+            else if (target_token == \"triangle\")\n+                target_guid = group->GetTargetIcons()[3];\n+            else if (target_token == \"moon\")\n+                target_guid = group->GetTargetIcons()[4];\n+            else if (target_token == \"square\")\n+                target_guid = group->GetTargetIcons()[5];\n+            else if (target_token == \"cross\")\n+                target_guid = group->GetTargetIcons()[6];\n+            else if (target_token == \"skull\")\n+                target_guid = group->GetTargetIcons()[7];\n+            else if (target_token->size() == 1u && std::isdigit(target_token->front()))\n+            {\n+                uint8 digit = static_cast<uint8>(std::stoi(std::string(*target_token)));\n+                switch (digit)\n+                {\n+                    case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8:\n+                        target_guid = group->GetTargetIcons()[digit - 1];\n+                        break;\n+                    default:\n+                        token_valid = false;\n+                        break;\n+                }\n+            }\n+            else\n+                token_valid = false;\n+        }\n+        else\n+            token_valid = false;\n+\n+        if (!token_valid)\n+        {\n+            handler->PSendSysMessage(\"Invalid target token '{}'!\", *target_token);\n+            handler->SendSysMessage(\"Valid target tokens:\\n    '','bot','self', 'me','master', 'mypet', 'myvehicle', 'target', 'mytarget', \"\n+                \"'star','1', 'circle','2', 'diamond','3', 'triangle','4', 'moon','5', 'square','6', 'cross','7', 'skull','8'\"\n+                \"\\nNote that target icons tokens are only available while in group\");\n+            return true;\n+        }\n+\n+        Unit* target = target_guid ? ObjectAccessor::GetUnit(*owner, target_guid) : nullptr;\n+        if (!target || !bot->FindMap() || target->FindMap() != bot->FindMap())\n+        {\n+            handler->PSendSysMessage(\"Invalid target '{}'!\", target ? target->GetName().c_str() : \"unknown\");\n+            return true;\n+        }\n+\n+        bot_ai::BotOrder order(BOT_ORDER_SPELLCAST);\n+        order.params.spellCastParams.baseSpell = base_spell;\n+        order.params.spellCastParams.targetGuid = target_guid;\n+\n+        if (bot->GetBotAI()->AddOrder(std::move(order)))\n+        {\n+            if (DEBUG_BOT_ORDERS)\n+                handler->PSendSysMessage(\"Order given: {}: {} on {}\", bot->GetName(),\n+                    sSpellMgr->GetSpellInfo(base_spell)->SpellName[handler->GetSessionDbcLocale()], target ? target->GetName().c_str() : \"unknown\");\n+        }\n+        else\n+        {\n+            if (DEBUG_BOT_ORDERS)\n+                handler->PSendSysMessage(\"Order failed: {}: {} on {}\", bot->GetName(),\n+                    sSpellMgr->GetSpellInfo(base_spell)->SpellName[handler->GetSessionDbcLocale()], target ? target->GetName().c_str() : \"unknown\");\n+        }\n+\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotVehicleEjectCommand(ChatHandler* handler)\n+    {\n+        Player const* owner = handler->GetSession()->GetPlayer();\n+        Unit const* target = handler->getSelectedUnit();\n+\n+        bool hasBotsInVehicles = false;\n+        bool botsInSelVehicle = 0;\n+        BotMap const* bmap = nullptr;\n+        if (owner->HaveBot())\n+        {\n+            bmap = owner->GetBotMgr()->GetBotMap();\n+            for (const auto& [_, bot] : *bmap)\n+            {\n+                if (bot && bot->GetVehicle())\n+                {\n+                    if (!hasBotsInVehicles)\n+                        hasBotsInVehicles = true;\n+                    if (!botsInSelVehicle && target && target->IsVehicle() && target->GetVehicleKit()->GetSeatForPassenger(bot))\n+                        botsInSelVehicle = true;\n+                }\n+                if (hasBotsInVehicles && botsInSelVehicle)\n+                    break;\n+            }\n+        }\n+\n+        if (bmap && hasBotsInVehicles)\n+        {\n+            for (const auto& [_, bot] : *bmap)\n+            {\n+                if (bot && bot->GetVehicle())\n+                {\n+                    bool doeject = false;\n+                    if (!botsInSelVehicle)\n+                        doeject = true;\n+                    else if (target)\n+                        if (/*VehicleSeatEntry const* seat = */target->GetVehicleKit()->GetSeatForPassenger(bot))\n+                            //if (seat->CanEnterOrExit())\n+                                doeject = true;\n+\n+                    if (doeject)\n+                    {\n+                        bot->GetVehicle()->GetBase()->StopMoving();\n+                        //handler->PSendSysMessage(\"Removing {} from {}\", bot->GetName(), bot->GetVehicle()->GetBase()->GetName());\n+                        bot->ExitVehicle();\n+                        //bot->BotStopMovement();\n+                    }\n+                }\n+            }\n+            return true;\n+        }\n+\n+        handler->SendSysMessage(\".npcbot eject\");\n+        handler->SendSysMessage(\"Removes your bots from selected vehicle, or, all bots from any vehicles if no vehicle selected\");\n+        handler->SetSentErrorMessage(true);\n+        return false;\n+    }\n+\n+    static bool HandleNpcBotFollowDistanceCommand(ChatHandler* handler, Optional<int32> dist)\n+    {\n+        Player* owner = handler->GetSession()->GetPlayer();\n+\n+        if (!owner->HaveBot() || !dist)\n+        {\n+            handler->SendSysMessage(\".npcbot distance #[attack] #newdist\");\n+            handler->SendSysMessage(\"Sets follow / attack distance for bots\");\n+            return true;\n+        }\n+\n+        uint8 newdist = uint8(std::min<int32>(std::max<int32>(*dist, 0), 100));\n+        owner->GetBotMgr()->SetBotFollowDist(newdist);\n+\n+        handler->PSendSysMessage(\"Bots' follow distance is set to {}\", uint32(newdist));\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotAttackDistanceShortCommand(ChatHandler* handler)\n+    {\n+        Player* owner = handler->GetSession()->GetPlayer();\n+        if (!owner->HaveBot())\n+        {\n+            handler->SendSysMessage(\".npcbot distance attack short\");\n+            handler->SendSysMessage(\"Sets attack distance for bots\");\n+            return true;\n+        }\n+\n+        owner->GetBotMgr()->SetBotAttackRangeMode(BOT_ATTACK_RANGE_SHORT);\n+\n+        handler->SendSysMessage(\"Bots' attack distance is set to 'short'\");\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotAttackDistanceLongCommand(ChatHandler* handler)\n+    {\n+        Player* owner = handler->GetSession()->GetPlayer();\n+        if (!owner->HaveBot())\n+        {\n+            handler->SendSysMessage(\".npcbot distance attack long\");\n+            handler->SendSysMessage(\"Sets attack distance for bots\");\n+            return true;\n+        }\n+\n+        owner->GetBotMgr()->SetBotAttackRangeMode(BOT_ATTACK_RANGE_LONG);\n+\n+        handler->SendSysMessage(\"Bots' attack distance is set to 'long'\");\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotAttackDistanceExactCommand(ChatHandler* handler, Optional<int32> dist)\n+    {\n+        Player* owner = handler->GetSession()->GetPlayer();\n+\n+        if (!owner->HaveBot() || !dist)\n+        {\n+            handler->SendSysMessage(\".npcbot distance attack #newdist\");\n+            handler->SendSysMessage(\"Sets attack distance for bots\");\n+            return true;\n+        }\n+\n+        uint8 newdist = uint8(std::min<int32>(std::max<int32>(*dist, 0), 50));\n+        owner->GetBotMgr()->SetBotAttackRangeMode(BOT_ATTACK_RANGE_EXACT, newdist);\n+\n+        handler->PSendSysMessage(\"Bots' attack distance is set to {}\", uint32(newdist));\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotHideCommand(ChatHandler* handler)\n+    {\n+        // Hiding/unhiding bots should be allowed only out of combat\n+        // Currenly bots can teleport to master in combat\n+        // This creates potential for some serious trolls\n+        Player* owner = handler->GetSession()->GetPlayer();\n+        if (!owner->HaveBot())\n+        {\n+            handler->SendSysMessage(\".npcbot hide\");\n+            handler->SendSysMessage(\"Removes your owned npcbots from world temporarily\");\n+            //handler->SendSysMessage(\"You have no bots!\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+        if (!owner->IsAlive())\n+        {\n+            handler->SendNotification(\"You are dead\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+        if (owner->GetBotMgr()->IsPartyInCombat(false))\n+        {\n+            handler->SendNotification(LANG_YOU_IN_COMBAT);\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        if (!owner->GetBotMgr()->GetBotsHidden())\n+        {\n+            owner->GetBotMgr()->SetBotsHidden(true);\n+            handler->SendSysMessage(\"Bots hidden\");\n+        }\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotUnhideCommand(ChatHandler* handler)\n+    {\n+        Player* owner = handler->GetSession()->GetPlayer();\n+        if (!owner->HaveBot())\n+        {\n+            handler->SendSysMessage(\".npcbot unhide | show\");\n+            handler->SendSysMessage(\"Returns your temporarily hidden bots back\");\n+            //handler->SendSysMessage(\"You have no bots!\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+        if (!owner->IsAlive())\n+        {\n+            handler->SendNotification(\"You are dead\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+        if (owner->GetBotMgr()->IsPartyInCombat(true))\n+        {\n+            handler->SendNotification(\"You can't do that while in PvP combat\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        if (owner->GetBotMgr()->GetBotsHidden())\n+        {\n+            owner->GetBotMgr()->SetBotsHidden(false);\n+            handler->SendSysMessage(\"Bots unhidden\");\n+        }\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotFixCommand(ChatHandler* handler, Optional<Variant<std::string_view, uint32>> bot_id_or_name)\n+    {\n+        Creature const* target = handler->getSelectedCreature();\n+\n+        uint32 bot_id;\n+        if (target && target->IsNPCBot())\n+            bot_id = target->GetEntry();\n+        else if (bot_id_or_name)\n+        {\n+            if (bot_id_or_name->holds_alternative<uint32>())\n+                bot_id = bot_id_or_name->get<uint32>();\n+            else if (Creature const* fbot = BotDataMgr::FindBot(bot_id_or_name->get<std::string_view>(), LocaleConstant(handler->GetSessionDbLocaleIndex())))\n+            {\n+                target = fbot;\n+                bot_id = target->GetEntry();\n+            }\n+            else\n+            {\n+                char* cre_id = handler->extractKeyFromLink((char*)bot_id_or_name->get<std::string_view>().data(), \"Hcreature_entry\");\n+                bot_id = uint32(atoi(cre_id));\n+            }\n+        }\n+        else if (target)\n+        {\n+            handler->SendSysMessage(\"You must select a npcbot\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+        else\n+        {\n+            handler->SendSysMessage(\".npcbot fix #[id | name | link | <selection>]\");\n+            handler->SendSysMessage(\"Attempts to fix different bot's unit states and ai mishaps which stall its normal function\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        Creature const* bot = target ? target : BotDataMgr::FindBot(bot_id);\n+        if (!bot)\n+        {\n+            handler->PSendSysMessage(\"NpcBot {} is not found!\", bot_id);\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        NpcBotData const* bot_data = BotDataMgr::SelectNpcBotData(bot_id);\n+        Player* owner = !bot->IsFreeBot() ? bot->GetBotOwner() : nullptr;\n+        Player* tickler = handler->GetPlayer();\n+\n+        if (!tickler->IsGameMaster())\n+        {\n+            handler->SendSysMessage(\"Must be in GM mode to use this command!\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        handler->PSendSysMessage(\"Trying to fix bot {} ({}) owned by {} ({})\", bot->GetName(), bot_id,\n+            owner ? owner->GetName().c_str() : \"Unknown\", owner ? owner->GetGUID().GetCounter() : bot_data->owner);\n+\n+        bot->GetBotAI()->ReceiveEmote(tickler, TEXT_EMOTE_TICKLE);\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotKillCommand(ChatHandler* handler)\n+    {\n+        Player* owner = handler->GetSession()->GetPlayer();\n+\n+        ObjectGuid guid = owner->GetTarget();\n+        if (!guid || !owner->HaveBot())\n+        {\n+            handler->SendSysMessage(\".npcbot kill | suicide\");\n+            handler->SendSysMessage(\"Makes your npcbot just drop dead. If you select yourself ALL your bots will die\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        if (guid == owner->GetGUID())\n+        {\n+            owner->GetBotMgr()->KillAllBots();\n+            return true;\n+        }\n+        if (Creature* bot = owner->GetBotMgr()->GetBot(guid))\n+        {\n+            owner->GetBotMgr()->KillBot(bot);\n+            return true;\n+        }\n+\n+        handler->SendSysMessage(\"You must select one of your bots or yourself\");\n+        handler->SetSentErrorMessage(true);\n+        return false;\n+    }\n+\n+    static bool HandleNpcBotGoCommand(ChatHandler* handler, Optional<uint32> creatureId)\n+    {\n+        Player* player = handler->GetSession()->GetPlayer();\n+\n+        if (!creatureId)\n+        {\n+            handler->SendSysMessage(\".npcbot go #[ID]\");\n+            handler->SendSysMessage(\"Teleports to npcbot's current location\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        Creature const* bot = BotDataMgr::FindBot(*creatureId);\n+        if (!bot)\n+        {\n+            handler->PSendSysMessage(\"NpcBot {} is not found!\", *creatureId);\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        handler->PSendSysMessage(LANG_APPEARING_AT, bot->GetName());\n+\n+        if (player->IsInFlight())\n+        {\n+            player->GetMotionMaster()->MovementExpired();\n+            player->CleanupAfterTaxiFlight();\n+        }\n+        else\n+            player->SaveRecallPosition(); // save only in non-flight case\n+\n+        WorldLocation wloc = *bot;\n+        wloc.m_positionZ += 1.5f;\n+\n+        player->TeleportTo(wloc, TELE_TO_GM_MODE);\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotSendToCommand(ChatHandler* handler, Optional<std::vector<std::string>> names)\n+    {\n+        static auto return_syntax = [](ChatHandler* chandler) -> bool {\n+            chandler->SendSysMessage(\"Syntax: .npcbot sendto #names...\");\n+            chandler->SendSysMessage(\"Makes selected/named bot(s) wait 30 sec for your next DEST spell, assume that position and hold it\");\n+            chandler->SendSysMessage(\"Max distance is 70 yds\");\n+            chandler->SetSentErrorMessage(true);\n+            return false;\n+        };\n+\n+        static auto return_success = [](ChatHandler* chandler, Variant<std::string, uint32> name_or_count) -> bool {\n+            if (name_or_count.holds_alternative<uint32>())\n+                chandler->PSendSysMessage(\"Your next dest spell will send {} bot(s) to position...\", name_or_count.get<uint32>());\n+            else\n+                chandler->PSendSysMessage(\"Your next dest spell will send {} to position...\", name_or_count.get<std::string>());\n+            return true;\n+        };\n+\n+        Player const* owner = handler->GetSession()->GetPlayer();\n+\n+        if (!owner->HaveBot())\n+            return return_syntax(handler);\n+\n+        if (!names || names->empty())\n+        {\n+            Unit const* target = handler->getSelectedCreature();\n+            Creature const* bot = target ? owner->GetBotMgr()->GetBot(target->GetGUID()) : nullptr;\n+            if (bot && bot->IsAlive() && !bot->GetBotAI()->HasBotCommandState(BOT_COMMAND_FULLSTOP))\n+            {\n+                bot->GetBotAI()->SetBotAwaitState(BOT_AWAIT_SEND);\n+                return return_success(handler, { bot->GetName() });\n+            }\n+            return return_syntax(handler);\n+        }\n+\n+        uint32 count = 0;\n+        DoForAllNamesNormalizedIn(*names, [owner, &count](std::string const& name) {\n+            Creature const* bot = owner->GetBotMgr()->GetBotByName(name);\n+            if (bot && bot->IsAlive() && !bot->GetBotAI()->HasBotCommandState(BOT_COMMAND_FULLSTOP))\n+            {\n+                ++count;\n+                bot->GetBotAI()->SetBotAwaitState(BOT_AWAIT_SEND);\n+            }\n+        });\n+\n+        if (count == 0)\n+        {\n+            handler->PSendSysMessage(\"Unable to send any of {} bots!\", uint32(names->size()));\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        return return_success(handler, { count });\n+    }\n+\n+    static bool HandleNpcBotSendToLastCommand(ChatHandler* handler, Optional<std::vector<std::string>> names)\n+    {\n+        static auto return_syntax = [](ChatHandler* chandler) -> bool {\n+            chandler->SendSysMessage(\"Syntax: .npcbot sendto last #names...\");\n+            chandler->SendSysMessage(\"Makes selected/named bot(s) assume previous position they were sent from\");\n+            chandler->SendSysMessage(\"This will cancel current sendto await state\");\n+            chandler->SendSysMessage(\"Max distance is 70 yds\");\n+            chandler->SetSentErrorMessage(true);\n+            return false;\n+        };\n+\n+        static auto return_success = [](ChatHandler* chandler, Variant<std::string, uint32> name_or_count) -> bool {\n+            if (name_or_count.holds_alternative<uint32>())\n+                chandler->PSendSysMessage(\"Moving {} bot(s) to previous position...\", name_or_count.get<uint32>());\n+            else\n+                chandler->PSendSysMessage(\"Moving {} to previous position...\", name_or_count.get<std::string>());\n+            return true;\n+        };\n+\n+        Player const* owner = handler->GetSession()->GetPlayer();\n+\n+        if (!owner->HaveBot())\n+            return return_syntax(handler);\n+\n+        if (!names || names->empty())\n+        {\n+            Unit const* target = handler->getSelectedCreature();\n+            Creature const* bot = target ? owner->GetBotMgr()->GetBot(target->GetGUID()) : nullptr;\n+            if (bot && bot->IsAlive() && !bot->GetBotAI()->HasBotCommandState(BOT_COMMAND_FULLSTOP))\n+            {\n+                bot->GetBotAI()->MoveToLastSendPosition();\n+                return return_success(handler, { bot->GetName() });\n+            }\n+            return return_syntax(handler);\n+        }\n+\n+        uint32 count = 0;\n+        DoForAllNamesNormalizedIn(*names, [owner, &count](std::string const& name) {\n+            Creature const* bot = owner->GetBotMgr()->GetBotByName(name);\n+            if (bot && bot->IsAlive() && !bot->GetBotAI()->HasBotCommandState(BOT_COMMAND_FULLSTOP))\n+            {\n+                ++count;\n+                bot->GetBotAI()->MoveToLastSendPosition();\n+            }\n+        });\n+\n+        if (count == 0)\n+        {\n+            handler->PSendSysMessage(\"Unable to send any of {}u bots!\", uint32(names->size()));\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        return return_success(handler, { count });\n+    }\n+\n+    static bool HandleNpcBotSendToPointSetCommand(ChatHandler* handler, Optional<uint32> point_id, Optional<std::vector<std::string>> names)\n+    {\n+        static auto return_syntax = [](ChatHandler* chandler) -> bool {\n+            chandler->SendSysMessage(\"Syntax: .npcbot sendto point set #number #names...\");\n+            chandler->SendSysMessage(\"Marks selected/named bots' current position as send point by #number\");\n+            chandler->PSendSysMessage(\"Point number must be in range 1 ... {}\", uint32(MAX_SEND_POINTS));\n+            chandler->SetSentErrorMessage(true);\n+            return false;\n+        };\n+\n+        static auto return_success = [=](ChatHandler* chandler, Variant<std::string, uint32> name_or_count) -> bool {\n+            if (name_or_count.holds_alternative<uint32>())\n+                chandler->PSendSysMessage(\"Marked send point {} for {} bot(s)\", *point_id, name_or_count.get<uint32>());\n+            else\n+                chandler->PSendSysMessage(\"Marked send point {} for {}\", *point_id, name_or_count.get<std::string>());\n+            return true;\n+        };\n+\n+        Player const* owner = handler->GetSession()->GetPlayer();\n+\n+        if (!point_id || !*point_id || *point_id > MAX_SEND_POINTS || !owner->HaveBot())\n+            return return_syntax(handler);\n+\n+        if (!names || names->empty())\n+        {\n+            Unit const* target = handler->getSelectedCreature();\n+            Creature const* bot = target ? owner->GetBotMgr()->GetBot(target->GetGUID()) : nullptr;\n+            if (bot && bot->IsAlive())\n+            {\n+                bot->GetBotAI()->MarkSendPosition(*point_id - 1);\n+                return return_success(handler, { bot->GetName() });\n+            }\n+            return return_syntax(handler);\n+        }\n+\n+        uint32 count = 0;\n+        DoForAllNamesNormalizedIn(*names, [owner, point_id, &count](std::string const& name) {\n+            Creature const* bot = owner->GetBotMgr()->GetBotByName(name);\n+            if (bot && bot->IsAlive())\n+            {\n+                ++count;\n+                bot->GetBotAI()->MarkSendPosition(*point_id - 1);\n+            }\n+        });\n+\n+        if (count == 0)\n+        {\n+            handler->PSendSysMessage(\"Unable to mark send point for any of {} bots!\", uint32(names->size()));\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        return return_success(handler, { count });\n+    }\n+\n+    static bool HandleNpcBotSendToPointCommand(ChatHandler* handler, Optional<uint32> point_id, Optional<std::vector<std::string>> names)\n+    {\n+        static auto return_syntax = [](ChatHandler* chandler) -> bool {\n+            chandler->SendSysMessage(\"Syntax: .npcbot sendto point #number #names...\");\n+            chandler->SendSysMessage(\"Makes selected/named bot(s) assume previously set point by #number\");\n+            chandler->SendSysMessage(\"This will cancel current sendto await state\");\n+            chandler->SendSysMessage(\"Max distance is 70 yds\");\n+            chandler->SetSentErrorMessage(true);\n+            return false;\n+        };\n+\n+        static auto return_success = [=](ChatHandler* chandler, Variant<std::string, uint32> name_or_count) -> bool {\n+            if (name_or_count.holds_alternative<uint32>())\n+                chandler->PSendSysMessage(\"Moving {} bot(s) to point {}...\", name_or_count.get<uint32>(), *point_id);\n+            else\n+                chandler->PSendSysMessage(\"Moving {} to point {}...\", name_or_count.get<std::string>(), *point_id);\n+            return true;\n+        };\n+\n+        Player const* owner = handler->GetSession()->GetPlayer();\n+\n+        if (!point_id || !*point_id || *point_id > MAX_SEND_POINTS || !owner->HaveBot())\n+            return return_syntax(handler);\n+\n+        if (!names || names->empty())\n+        {\n+            Unit const* target = handler->getSelectedCreature();\n+            Creature const* bot = target ? owner->GetBotMgr()->GetBot(target->GetGUID()) : nullptr;\n+            if (bot && bot->IsAlive() && !bot->GetBotAI()->HasBotCommandState(BOT_COMMAND_FULLSTOP))\n+            {\n+                bot->GetBotAI()->MoveToSendPosition(*point_id - 1);\n+                return return_success(handler, { bot->GetName() });\n+            }\n+            return return_syntax(handler);\n+        }\n+\n+        uint32 count = 0;\n+        DoForAllNamesNormalizedIn(*names, [owner, point_id, &count](std::string const& name) {\n+            Creature const* bot = owner->GetBotMgr()->GetBotByName(name);\n+            if (bot && bot->IsAlive() && !bot->GetBotAI()->HasBotCommandState(BOT_COMMAND_FULLSTOP))\n+            {\n+                ++count;\n+                bot->GetBotAI()->MoveToSendPosition(*point_id - 1);\n+            }\n+        });\n+\n+        if (count == 0)\n+        {\n+            handler->PSendSysMessage(\"Unable to send any of {} bots!\", uint32(names->size()));\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        return return_success(handler, { count });\n+    }\n+\n+    static bool HandleNpcBotRecallCommand(ChatHandler* handler)\n+    {\n+        Player* owner = handler->GetSession()->GetPlayer();\n+\n+        ObjectGuid guid = owner->GetTarget();\n+        if (!guid || !owner->HaveBot())\n+        {\n+            handler->SendSysMessage(\".npcbot recall\");\n+            handler->SendSysMessage(\"Forces npcbots to move directly on your position. Select a npcbot you want to move or select yourself to move all bots\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+        if (owner->GetBotMgr()->IsPartyInCombat(false))\n+        {\n+            handler->SendNotification(LANG_YOU_IN_COMBAT);\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        if (guid == owner->GetGUID())\n+        {\n+            owner->GetBotMgr()->RecallAllBots();\n+            return true;\n+        }\n+        if (Creature* bot = owner->GetBotMgr()->GetBot(guid))\n+        {\n+            owner->GetBotMgr()->RecallBot(bot);\n+            return true;\n+        }\n+\n+        handler->SendSysMessage(\"You must select one of your bots or yourself\");\n+        handler->SetSentErrorMessage(true);\n+        return false;\n+    }\n+\n+    static bool HandleNpcBotRecallSpawnsCommand(ChatHandler* handler)\n+    {\n+        Player const* owner = handler->GetSession()->GetPlayer();\n+\n+        std::vector<ObjectGuid> botvec;\n+        BotDataMgr::GetNPCBotGuidsByOwner(botvec, owner->GetGUID());\n+        if (owner->HaveBot())\n+            std::erase_if(botvec, [=](ObjectGuid botguid) { return owner->GetBotMgr()->GetBot(botguid); });\n+\n+        uint32 recalled_count = 0;\n+        for (ObjectGuid botguid : botvec)\n+        {\n+            if (Creature const* bot = BotDataMgr::FindBot(botguid.GetEntry()))\n+            {\n+                bot->GetBotAI()->ResetBotAI(BOTAI_RESET_FORCERECALL);\n+                ++recalled_count;\n+            }\n+        }\n+\n+        if (recalled_count == 0)\n+        {\n+            handler->SendSysMessage(\".npcbot recall spawns\");\n+            handler->SendSysMessage(\"Forces all your owned inactive npcbots to teleport to their spawn locations immediatelly\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotRecallTeleportCommand(ChatHandler* handler)\n+    {\n+        Player* owner = handler->GetSession()->GetPlayer();\n+\n+        if (!owner->HaveBot())\n+        {\n+            handler->SendSysMessage(\".npcbot recall teleport\");\n+            handler->SendSysMessage(\"Forces all your npcbots to teleport to your position\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+        if (!owner->IsAlive())\n+        {\n+            handler->SendNotification(\"You are dead\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+        if (owner->GetBotMgr()->GetBotsHidden())\n+        {\n+            handler->SendNotification(\"You can't do that while bots are hidden\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+        if (owner->GetBotMgr()->IsPartyInCombat(true))\n+        {\n+            handler->SendNotification(\"You can't do that while in PvP combat\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        owner->GetBotMgr()->RecallAllBots(true);\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotToggleFlagsCommand(ChatHandler* handler, Optional<uint32> flag)\n+    {\n+        Player* chr = handler->GetSession()->GetPlayer();\n+        Unit* unit = chr->GetSelectedUnit();\n+        if (!unit || !unit->IsCreature() || !flag)\n+        {\n+            handler->SendSysMessage(\".npcbot toggle flags #flag\");\n+            handler->SendSysMessage(\"This is a debug command\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        uint32 setFlags = 0;\n+        switch (*flag)\n+        {\n+            case 6:\n+                setFlags = UNIT_FLAG_UNK_6;\n+                break;\n+            case 14:\n+                setFlags = UNIT_FLAG_CANNOT_SWIM;\n+                break;\n+            case 15:\n+                setFlags = UNIT_FLAG_SWIMMING;\n+                break;\n+            case 16:\n+                setFlags = UNIT_FLAG_NON_ATTACKABLE_2;\n+                break;\n+            default:\n+                break;\n+        }\n+\n+        if (!setFlags)\n+            return false;\n+\n+        handler->PSendSysMessage(\"Toggling flag {} on {}\", setFlags, unit->GetName());\n+        unit->ToggleFlag(UNIT_FIELD_FLAGS, setFlags);\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotSetFactionCommand(ChatHandler* handler, Optional<std::string> factionStr)\n+    {\n+        Player* chr = handler->GetSession()->GetPlayer();\n+        Unit* ubot = chr->GetSelectedUnit();\n+        if (!ubot || !factionStr)\n+        {\n+            handler->SendSysMessage(\".npcbot set faction #faction\");\n+            handler->SendSysMessage(\"Sets faction for selected npcbot (saved in DB)\");\n+            handler->SendSysMessage(\"Use 'a', 'h', 'm' or 'f' as argument to set faction to alliance, horde, monsters (hostile to all) or friends (friendly to all)\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        Creature* bot = ubot->ToCreature();\n+        if (!bot || !bot->IsNPCBot() || !bot->IsFreeBot())\n+        {\n+            handler->SendSysMessage(\"You must select uncontrolled npcbot\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        uint32 factionId = 0;\n+\n+        if ((*factionStr)[0] == 'a')\n+            factionId = 1802; //Alliance\n+        else if ((*factionStr)[0] == 'h')\n+            factionId = 1801; //Horde\n+        else if ((*factionStr)[0] == 'm')\n+            factionId = FACTION_TEMPLATE_NEUTRAL_HOSTILE; //Monsters\n+        else if ((*factionStr)[0] == 'f')\n+            factionId = 35; //Friendly to all\n+\n+        if (!factionId)\n+        {\n+            char* pfactionid = handler->extractKeyFromLink((char*)factionStr->c_str(), \"Hfaction\");\n+            factionId = atoi(pfactionid);\n+        }\n+\n+        if (!sFactionTemplateStore.LookupEntry(factionId))\n+        {\n+            handler->PSendSysMessage(LANG_WRONG_FACTION, factionId);\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        BotDataMgr::UpdateNpcBotData(bot->GetEntry(), NPCBOT_UPDATE_FACTION, &factionId);\n+        bot->GetBotAI()->ReInitFaction();\n+\n+        handler->PSendSysMessage(\"{}'s faction set to {}\", bot->GetName(), factionId);\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotSetOwnerCommand(ChatHandler* handler, Optional<std::string> charVal)\n+    {\n+        Player* chr = handler->GetSession()->GetPlayer();\n+        Unit* ubot = chr->GetSelectedUnit();\n+        if (!ubot || !charVal)\n+        {\n+            handler->SendSysMessage(\".npcbot set owner #guid | #name\");\n+            handler->SendSysMessage(\"Binds selected npcbot to new player owner using guid or name and updates owner in DB\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        Creature* bot = ubot->ToCreature();\n+        if (!bot || !bot->IsNPCBot() || bot->GetBotAI()->IsWanderer())\n+        {\n+            handler->SendSysMessage(\"You must select a non-wandering npcbot\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        if (bot->GetBotAI()->GetBotOwnerGuid())\n+        {\n+            handler->SendSysMessage(\"This npcbot already has owner\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        if (!charVal || charVal->empty())\n+            return false;\n+\n+        Optional<uint32> guidlow = Bcore::StringTo<uint32>({ *charVal });\n+        std::string characterName = std::move(*charVal);\n+\n+        bool found = true;\n+        if (guidlow)\n+            found = sCharacterCache->GetCharacterNameByGuid(ObjectGuid::Create<HighGuid::Player>(*guidlow), characterName);\n+        else\n+            guidlow = sCharacterCache->GetCharacterGuidByName(characterName).GetCounter();\n+\n+        if (!guidlow || !found)\n+        {\n+            handler->SendSysMessage(\"Player not found\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        BotDataMgr::UpdateNpcBotData(bot->GetEntry(), NPCBOT_UPDATE_OWNER, &guidlow);\n+        NpcBotData const* bot_data = BotDataMgr::SelectNpcBotData(bot->GetEntry());\n+        if (bot_data->shared_owners.contains(*guidlow))\n+        {\n+            NpcBotData::SharedOwnersContainer shared_owners_new = bot_data->shared_owners; //copy\n+            shared_owners_new.erase(*guidlow);\n+            BotDataMgr::UpdateNpcBotData(bot->GetEntry(), NPCBOT_UPDATE_SHARED_OWNERS, &shared_owners_new);\n+        }\n+\n+        handler->PSendSysMessage(\"{}'s new owner is {} (guidlow: {})\", bot->GetName(), characterName, *guidlow);\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotSetSpecCommand(ChatHandler* handler, Optional<uint8> spec)\n+    {\n+        Player* chr = handler->GetSession()->GetPlayer();\n+        Unit* ubot = chr->GetSelectedUnit();\n+        if (!ubot || !spec)\n+        {\n+            handler->SendSysMessage(\".npcbot set spec #specnumber\");\n+            handler->SendSysMessage(\"Changes talent spec for selected npcbot\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        Creature* bot = ubot->ToCreature();\n+        if (!bot || !bot->IsNPCBot())\n+        {\n+            handler->SendSysMessage(\"You must select a npcbot\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        if (!bot_ai::IsValidSpecForClass(bot->GetBotClass(), *spec))\n+        {\n+            handler->PSendSysMessage(\"{} is not a valid spec for bot class {}!\",\n+                bot_ai::LocalizedNpcText(chr, bot_ai::TextForSpec(*spec)), uint32(bot->GetBotClass()));\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        bot->GetBotAI()->SetSpec(*spec);\n+\n+        handler->PSendSysMessage(\"{}'s new spec is {}\", bot->GetName(), uint32(*spec));\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotLookupCommand(ChatHandler* handler, Optional<uint8> botclass, Optional <bool> unspawned, Optional<uint8> teamid)\n+    {\n+        //this is just a modified '.lookup creature' command\n+        if (!botclass)\n+        {\n+            handler->SendSysMessage(\".npcbot lookup #class #[not_spawned_only] #[team_id]\");\n+            handler->SendSysMessage(\"Looks up npcbots by #class, and returns all matches with their creature ID's\");\n+            handler->SendSysMessage(\"If #not_spawned_only is set to 1 shows only bots which don't exist in world\");\n+            handler->SendSysMessage(\"If #team_id is provided, will also filter by team: Alliance = 0, Horde = 1, Neutral = 2\");\n+            handler->PSendSysMessage(\"BOT_CLASS_WARRIOR = {}\", uint32(BOT_CLASS_WARRIOR));\n+            handler->PSendSysMessage(\"BOT_CLASS_PALADIN = {}\", uint32(BOT_CLASS_PALADIN));\n+            handler->PSendSysMessage(\"BOT_CLASS_HUNTER = {}\", uint32(BOT_CLASS_HUNTER));\n+            handler->PSendSysMessage(\"BOT_CLASS_ROGUE = {}\", uint32(BOT_CLASS_ROGUE));\n+            handler->PSendSysMessage(\"BOT_CLASS_PRIEST = {}\", uint32(BOT_CLASS_PRIEST));\n+            handler->PSendSysMessage(\"BOT_CLASS_DEATH_KNIGHT = {}\", uint32(BOT_CLASS_DEATH_KNIGHT));\n+            handler->PSendSysMessage(\"BOT_CLASS_SHAMAN = {}\", uint32(BOT_CLASS_SHAMAN));\n+            handler->PSendSysMessage(\"BOT_CLASS_MAGE = {}\", uint32(BOT_CLASS_MAGE));\n+            handler->PSendSysMessage(\"BOT_CLASS_WARLOCK = {}\", uint32(BOT_CLASS_WARLOCK));\n+            handler->PSendSysMessage(\"BOT_CLASS_DRUID = {}\", uint32(BOT_CLASS_DRUID));\n+            handler->PSendSysMessage(\"BOT_CLASS_BLADEMASTER = {}\", uint32(BOT_CLASS_BM));\n+            handler->PSendSysMessage(\"BOT_CLASS_SPHYNX = {}\", uint32(BOT_CLASS_SPHYNX));\n+            handler->PSendSysMessage(\"BOT_CLASS_ARCHMAGE = {}\", uint32(BOT_CLASS_ARCHMAGE));\n+            handler->PSendSysMessage(\"BOT_CLASS_DREADLORD = {}\", uint32(BOT_CLASS_DREADLORD));\n+            handler->PSendSysMessage(\"BOT_CLASS_SPELLBREAKER = {}\", uint32(BOT_CLASS_SPELLBREAKER));\n+            handler->PSendSysMessage(\"BOT_CLASS_DARK_RANGER = {}\", uint32(BOT_CLASS_DARK_RANGER));\n+            handler->PSendSysMessage(\"BOT_CLASS_NECROMANCER = {}\", uint32(BOT_CLASS_NECROMANCER));\n+            handler->PSendSysMessage(\"BOT_CLASS_SEA_WITCH = {}\", uint32(BOT_CLASS_SEA_WITCH));\n+            handler->PSendSysMessage(\"BOT_CLASS_CRYPT_LORD = {}\", uint32(BOT_CLASS_CRYPT_LORD));\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        if (botclass == BOT_CLASS_NONE || botclass >= BOT_CLASS_END)\n+        {\n+            handler->PSendSysMessage(\"Unknown bot class {}\", uint32(*botclass));\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        if (teamid && *teamid > uint8(TEAM_NEUTRAL))\n+        {\n+            handler->PSendSysMessage(\"Unknown team {}\", uint32(*teamid));\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        handler->PSendSysMessage(\"Looking for bots of class {}...\", uint32(*botclass));\n+\n+        uint8 localeIndex = handler->GetSessionDbLocaleIndex();\n+        using BotList = std::vector<BotInfo>;\n+        BotList botlist;\n+        for (const auto& [id, ct] : *sObjectMgr->GetCreatureTemplates())\n+        {\n+            if (id == BOT_ENTRY_MIRROR_IMAGE_BM)\n+                continue;\n+\n+            NpcBotExtras const* _botExtras = BotDataMgr::SelectNpcBotExtras(id);\n+            if (!_botExtras || _botExtras->bclass != botclass)\n+                continue;\n+\n+            if (unspawned && *unspawned && BotDataMgr::SelectNpcBotData(id))\n+                continue;\n+\n+            uint8 race = _botExtras->race;\n+\n+            if (teamid)\n+            {\n+                uint32 faction = BotDataMgr::GetDefaultFactionForBotRaceClass(_botExtras->bclass, race);\n+                TeamId team = BotDataMgr::GetTeamIdForFaction(faction);\n+\n+                if (*teamid != uint8(team))\n+                    continue;\n+            }\n+\n+            if (CreatureLocale const* creatureLocale = sObjectMgr->GetCreatureLocale(id))\n+            {\n+                if (creatureLocale->Name.size() > localeIndex && !creatureLocale->Name[localeIndex].empty())\n+                {\n+                    botlist.emplace_back(id, std::string_view{ creatureLocale->Name[localeIndex] }, race);\n+                    continue;\n+                }\n+            }\n+\n+            if (ct.Name.empty())\n+                continue;\n+\n+            botlist.emplace_back(id, std::string_view{ ct.Name }, race);\n+        }\n+\n+        if (botlist.empty())\n+        {\n+            handler->SendSysMessage(LANG_COMMAND_NOCREATUREFOUND);\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        std::ranges::sort(botlist);\n+\n+        for (BotInfo const& bot_info : botlist)\n+        {\n+            uint8 race = bot_info.race;\n+            if (race >= sRaceMgr->GetMaxRaces())\n+                race = RACE_NONE;\n+\n+            std::string_view raceName;\n+            switch (race)\n+            {\n+                case RACE_HUMAN:        raceName = \"Human\";     break;\n+                case RACE_ORC:          raceName = \"Orc\";       break;\n+                case RACE_DWARF:        raceName = \"Dwarf\";     break;\n+                case RACE_NIGHTELF:     raceName = \"Night Elf\"; break;\n+                case RACE_UNDEAD_PLAYER:raceName = \"Forsaken\";  break;\n+                case RACE_TAUREN:       raceName = \"Tauren\";    break;\n+                case RACE_GNOME:        raceName = \"Gnome\";     break;\n+                case RACE_TROLL:        raceName = \"Troll\";     break;\n+                case RACE_BLOODELF:     raceName = \"Blood Elf\"; break;\n+                case RACE_DRAENEI:      raceName = \"Draenei\";   break;\n+                case RACE_NONE:         raceName = \"No Race\";   break;\n+                default:                raceName = \"Unknown\";   break;\n+            }\n+\n+            handler->PSendSysMessage(\"{} - |cffffffff|Hcreature_entry:{}|h[{}]|h|r {}\", bot_info.id, bot_info.id, bot_info.name, raceName);\n+        }\n+\n+        return true;\n+    }\n+\n+    static bool HandeNpcBotCleanUpAndRemoval(ChatHandler* handler, Creature* bot, Player const* chr/* = nullptr*/)\n+    {\n+        Player const* botowner = bot->GetBotOwner()->ToPlayer();\n+\n+        if (bot->GetBotAI()->HasRealEquipment())\n+        {\n+            ObjectGuid receiver =\n+                botowner ? botowner->GetGUID() :\n+                bot->GetBotAI()->GetBotOwnerGuid() != 0 ? ObjectGuid(HighGuid::Player, 0, bot->GetBotAI()->GetBotOwnerGuid()) :\n+                chr ? chr->GetGUID() : ObjectGuid::Empty;\n+\n+            if (!botowner && chr && receiver != chr->GetGUID() && !sCharacterCache->HasCharacterCacheEntry(receiver))\n+                receiver = chr->GetGUID();\n+\n+            if (receiver == ObjectGuid::Empty)\n+            {\n+                handler->PSendSysMessage(\"Cannot delete bot {} from console: has gear but no player to give it back to! Can only delete this bot in-game.\", bot->GetName());\n+                return false;\n+            }\n+            if (bot->GetBotAI()->UnEquipAll(receiver, false) != BotEquipResult::BOT_EQUIP_RESULT_OK)\n+            {\n+                handler->PSendSysMessage(\"{} is unable to unequip some gear. Please remove equips manually first!\", bot->GetName());\n+                return false;\n+            }\n+        }\n+\n+        if (botowner)\n+            botowner->GetBotMgr()->RemoveBot(bot->GetGUID(), BOT_REMOVE_DISMISS);\n+\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotFreeCommand(ChatHandler* handler)\n+    {\n+        Player* chr = handler->GetSession()->GetPlayer();\n+        Unit* ubot = chr->GetSelectedUnit();\n+        if (!ubot)\n+        {\n+            handler->SendSysMessage(\".npcbot free\");\n+            handler->SendSysMessage(\"Immediately cancels selected npcbot's ownership\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        Creature* bot = ubot->ToCreature();\n+        if (!bot || !bot->IsNPCBot() || !bot->GetBotAI()->GetBotOwnerGuid() || bot->IsTempBot())\n+        {\n+            handler->SendSysMessage(\"No owned npcbot selected\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        uint32 owner_guid = bot->GetBotAI()->GetBotOwnerGuid();\n+        Player const* botowner = bot->GetBotOwner()->ToPlayer();\n+        if (!HandeNpcBotCleanUpAndRemoval(handler, bot, chr))\n+        {\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        uint8 spec = bot_ai::SelectSpecForClass(bot->GetBotClass());\n+        BotDataMgr::UpdateNpcBotData(bot->GetEntry(), NPCBOT_UPDATE_SPEC, &spec);\n+        uint32 roleMask = bot_ai::DefaultRolesForClass(bot->GetBotClass(), spec);\n+        BotDataMgr::UpdateNpcBotData(bot->GetEntry(), NPCBOT_UPDATE_ROLES, &roleMask);\n+\n+        if (!botowner)\n+        {\n+            uint32 newOwner = 0;\n+            BotDataMgr::UpdateNpcBotData(bot->GetEntry(), NPCBOT_UPDATE_OWNER, &newOwner);\n+            NpcBotData::SharedOwnersContainer sharedOwners{};\n+            BotDataMgr::UpdateNpcBotData(bot->GetEntry(), NPCBOT_UPDATE_SHARED_OWNERS, &sharedOwners);\n+\n+            if (Group* gr = bot->GetBotGroup())\n+                gr->RemoveMember(bot->GetGUID());\n+\n+            bot->GetBotAI()->ResetBotAI(BOTAI_RESET_DISMISS);\n+        }\n+\n+        handler->PSendSysMessage(\"Npcbot {} successfully freed, owner was {}\", bot->GetName(), owner_guid);\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotDeleteCommand(ChatHandler* handler)\n+    {\n+        Player* chr = handler->GetSession()->GetPlayer();\n+        Unit* ubot = chr->GetSelectedUnit();\n+        if (!ubot)\n+        {\n+            handler->SendSysMessage(\".npcbot delete\");\n+            handler->SendSysMessage(\"Deletes selected npcbot spawn from world and DB\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        Creature* bot = ubot->ToCreature();\n+        if (!bot || !bot->IsNPCBot())\n+        {\n+            handler->SendSysMessage(\"No npcbot selected\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        if (bot->GetBotAI()->IsWanderer())\n+        {\n+            BotDataMgr::DespawnWandererBot(bot->GetEntry());\n+            handler->PSendSysMessage(\"Wandering bot {} '{}' successfully deleted\", bot->GetEntry(), bot->GetName());\n+            return true;\n+        }\n+\n+        if (!HandeNpcBotCleanUpAndRemoval(handler, bot, chr))\n+        {\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        bot->CombatStop();\n+        bot->GetBotAI()->Reset();\n+        bot->GetBotAI()->canUpdate = false;\n+        bot->DeleteFromDB();\n+        bot->AddObjectToRemoveList();\n+\n+        BotDataMgr::UpdateNpcBotData(bot->GetEntry(), NPCBOT_UPDATE_ERASE);\n+\n+        handler->PSendSysMessage(\"Npcbot {} successfully deleted\", bot->GetName());\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotDeleteByIdCommand(ChatHandler* handler, Optional<uint32> creature_id)\n+    {\n+        if (!creature_id)\n+        {\n+            handler->SendSysMessage(\".npcbot delete id\");\n+            handler->SendSysMessage(\"Deletes npcbot spawn from world and DB using creature id\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        Creature const* bot = BotDataMgr::FindBot(*creature_id);\n+        if (!bot)\n+        {\n+            handler->PSendSysMessage(\"npcbot {} not found!\", *creature_id);\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        if (bot->GetBotAI()->IsWanderer())\n+        {\n+            BotDataMgr::DespawnWandererBot(bot->GetEntry());\n+            handler->PSendSysMessage(\"Wandering bot {} '{}' successfully deleted\", bot->GetEntry(), bot->GetName());\n+            return true;\n+        }\n+\n+        Player* chr = !handler->IsConsole() ? handler->GetSession()->GetPlayer() : nullptr;\n+\n+        if (!HandeNpcBotCleanUpAndRemoval(handler, const_cast<Creature*>(bot), chr))\n+        {\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        const_cast<Creature*>(bot)->CombatStop();\n+        bot->GetBotAI()->Reset();\n+        bot->GetBotAI()->canUpdate = false;\n+        const_cast<Creature*>(bot)->DeleteFromDB();\n+        const_cast<Creature*>(bot)->AddObjectToRemoveList();\n+\n+        BotDataMgr::UpdateNpcBotData(bot->GetEntry(), NPCBOT_UPDATE_ERASE);\n+\n+        handler->PSendSysMessage(\"Npcbot {} successfully deleted\", bot->GetName());\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotDeleteFreeCommand(ChatHandler* handler)\n+    {\n+        uint32 count = 0;\n+        for (uint32 creature_id : BotDataMgr::GetExistingNPCBotIds())\n+            if (NpcBotData const* botData = BotDataMgr::SelectNpcBotData(creature_id))\n+                if (botData->owner == 0)\n+                    if (HandleNpcBotDeleteByIdCommand(handler, creature_id))\n+                        ++count;\n+\n+        handler->PSendSysMessage(\"{} free npcbots deleted\", count);\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotMoveCommand(ChatHandler* handler, Optional<std::string> creVal)\n+    {\n+        Player* player = handler->GetSession()->GetPlayer();\n+        Creature* creature = handler->getSelectedCreature();\n+\n+        if ((!creature && !creVal) || player->GetMap()->Instanceable())\n+        {\n+            handler->SendSysMessage(\".npcbot move\");\n+            handler->SendSysMessage(\"Moves npcbot to your location. World maps only\");\n+            handler->SendSysMessage(\"Syntax: .npcbot move [#ID]\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        char* charID = creVal ? handler->extractKeyFromLink((char*)creVal->c_str(), \"Hcreature_entry\") : nullptr;\n+        if (!charID && !creature)\n+            return false;\n+\n+        uint32 id = charID ? atoi(charID) : creature->GetEntry();\n+\n+        CreatureTemplate const* creInfo = sObjectMgr->GetCreatureTemplate(id);\n+        if (!creInfo)\n+        {\n+            handler->PSendSysMessage(\"creature id {} does not exist!\", id);\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        if (!creInfo->IsNPCBot())\n+        {\n+            handler->PSendSysMessage(\"creature id {} is not a npcbot!\", id);\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        if (!BotDataMgr::SelectNpcBotData(id))\n+        {\n+            handler->PSendSysMessage(\"NpcBot {} is not spawned!\", id);\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        Creature const* bot = BotDataMgr::FindBot(id);\n+        ASSERT(bot);\n+\n+        uint32 lowguid = bot->GetSpawnId();\n+\n+        CreatureData const* data = sObjectMgr->GetCreatureData(lowguid);\n+        if (!data)\n+        {\n+            handler->PSendSysMessage(LANG_COMMAND_CREATGUIDNOTFOUND, lowguid);\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        CreatureData* cdata = const_cast<CreatureData*>(data);\n+        cdata->posX = player->GetPositionX();\n+        cdata->posY = player->GetPositionY();\n+        cdata->posZ = player->GetPositionZ();\n+        cdata->orientation = player->GetOrientation();\n+        cdata->mapid = player->GetMapId();\n+\n+        WorldDatabase.Execute(\n+            \"UPDATE creature SET position_x = {}, position_y = {}, position_z = {}, orientation = {}, map = {} WHERE guid = {}\",\n+            cdata->posX, cdata->posY, cdata->posZ, cdata->orientation, uint32(cdata->mapid), lowguid);\n+\n+        if (bot->GetBotAI()->IAmFree() && bot->IsInWorld() && !bot->IsInCombat() && bot->IsAlive())\n+            BotMgr::TeleportBot(const_cast<Creature*>(bot), player->GetMap(), player);\n+\n+        handler->PSendSysMessage(\"NpcBot {} (guid {}) was moved\", id, lowguid);\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotCreateNewCommand(ChatHandler* handler, Optional<std::string> name, Optional<uint8> bclass, Optional<uint8> race, Optional<uint8> gender, Optional<uint8> skin, Optional<uint8> face, Optional<uint8> hairstyle, Optional<uint8> haircolor, Optional<uint8> features, Optional<uint8> soundset)\n+    {\n+        static auto const ret_err = [](ChatHandler* handler, bool report_ranges = false) {\n+            if (report_ranges)\n+                ReportVisualRanges(handler);\n+            else\n+            {\n+                handler->SendSysMessage(\".npcbot createnew\");\n+                handler->SendSysMessage(\"Creates a new npcbot creature entry\");\n+                handler->SendSysMessage(\"Syntax: .npcbot createnew #name #class ##race ##gender ##skin ##face ##hairstyle ##haircolor ##features ##[sound_variant = {{1,2,3}}]\");\n+                handler->SendSysMessage(\"In case of class that cannot change appearance all extra arguments must be omitted\");\n+                handler->SendSysMessage(\"Use '.npcbot createnew ranges' to print visuals constraints for all races\");\n+            }\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        };\n+        static auto const ret_err_invalid_arg = [](ChatHandler* handler, char const* argname, Optional<uint8> argval = {}) {\n+            handler->PSendSysMessage(\"Invalid {}{}!\", argname, argval ? (\" \" + std::to_string(*argval)).c_str() : \"\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        };\n+        static auto const ret_err_invalid_args_for = [](ChatHandler* handler, char const* argname1, char const* argname2) {\n+            handler->PSendSysMessage(\"Invalid arguments for {} '{}'!\", argname1, argname2);\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        };\n+\n+        if (!bclass || !name)\n+            return ret_err(handler, name && *name == \"ranges\");\n+\n+        for (std::size_t i{}; i < name->size(); ++i)\n+            if ((*name)[i] == '_')\n+                (*name)[i] = ' ';\n+\n+        bool const can_change_appearance = (*bclass < BOT_CLASS_EX_START || *bclass == BOT_CLASS_ARCHMAGE);\n+\n+        if (can_change_appearance && (!race || !gender || !skin || !face || !hairstyle || !haircolor || !features))\n+            return ret_err(handler);\n+        if (!can_change_appearance && (race || gender || skin || face || hairstyle || haircolor || features))\n+            return ret_err(handler);\n+        if (soundset && (*soundset < 1 || *soundset > SOUND_SETS_COUNT))\n+            return ret_err(handler);\n+\n+        if (*bclass >= BOT_CLASS_END || (*bclass < BOT_CLASS_EX_START && !((1u << (*bclass - 1)) & CLASSMASK_ALL_PLAYABLE)))\n+            return ret_err_invalid_arg(handler, \"class\", bclass);\n+\n+        std::string namestr;\n+        if (!consoleToUtf8(*name, namestr))\n+            return ret_err_invalid_arg(handler, \"name\");\n+        if (!normalizePlayerName(namestr))\n+            return ret_err_invalid_arg(handler, \"name\");\n+\n+        if (race && !((1u << (*race - 1)) & sRaceMgr->GetPlayableRaceMask()))\n+            return ret_err_invalid_arg(handler, \"race\", race);\n+\n+        if (can_change_appearance && *gender != GENDER_MALE && *gender != GENDER_FEMALE)\n+            return ret_err_invalid_arg(handler, \"gender\", gender);\n+\n+        // class / race combination check\n+        if ((*bclass < BOT_CLASS_EX_START && !sObjectMgr->GetPlayerInfo(*race, *bclass)) ||\n+            (*bclass == BOT_CLASS_ARCHMAGE && *race != RACE_HUMAN))\n+            return ret_err_invalid_args_for(handler, \"class\", get_class_name(*bclass));\n+\n+        if (can_change_appearance && !IsValidVisual(*race, *gender, *skin, *face, *hairstyle, *haircolor, *features))\n+            return ret_err_invalid_args_for(handler, \"race\", get_race_name(*race));\n+\n+        //here we force races for custom classes\n+        switch (*bclass)\n+        {\n+            case BOT_CLASS_BM:\n+            case BOT_CLASS_SPHYNX:\n+            case BOT_CLASS_DREADLORD:\n+            case BOT_CLASS_SPELLBREAKER:\n+            case BOT_CLASS_CRYPT_LORD:\n+                race = 15; //RACE_SKELETON\n+                break;\n+            case BOT_CLASS_NECROMANCER:\n+                race = RACE_HUMAN;\n+                break;\n+            case BOT_CLASS_DARK_RANGER:\n+                race = RACE_BLOODELF;\n+                break;\n+            case BOT_CLASS_SEA_WITCH:\n+                race = 13; //RACE_NAGA\n+                break;\n+        }\n+\n+        //get normalized modelID\n+        uint32 modelId = can_change_appearance ? SoundSetModelsArray[RaceToRaceOffset[*race]][*gender][soundset ? *soundset - 1 : urand(0u, 2u)] : 0;\n+\n+        uint32 newentry = 0;\n+        QueryResult creres = WorldDatabase.Query(\"SELECT entry FROM creature_template WHERE entry = {}\", BOT_ENTRY_CREATE_BEGIN);\n+        if (!creres)\n+            newentry = BOT_ENTRY_CREATE_BEGIN;\n+        else\n+        {\n+            creres = WorldDatabase.Query(\"SELECT MIN(entry) FROM creature_template WHERE entry >= {} AND entry IN (SELECT entry FROM creature_template) AND entry+1 NOT IN (SELECT entry FROM creature_template)\", BOT_ENTRY_CREATE_BEGIN);\n+            ASSERT(creres);\n+            Field* field = creres->Fetch();\n+            newentry = field[0].Get<uint32>() + 1;\n+        }\n+\n+        WorldDatabaseTransaction trans = WorldDatabase.BeginTransaction();\n+        trans->Append(\"DROP TEMPORARY TABLE IF EXISTS creature_template_temp_npcbot_create\");\n+        trans->Append(\"CREATE TEMPORARY TABLE creature_template_temp_npcbot_create ENGINE=MEMORY SELECT * FROM creature_template WHERE entry = (SELECT entry FROM creature_template_npcbot_extras WHERE class = {} LIMIT 1)\", uint32(*bclass));\n+        trans->Append(\"UPDATE creature_template_temp_npcbot_create SET entry = {}\", newentry);\n+        trans->Append(\"INSERT INTO creature_template SELECT * FROM creature_template_temp_npcbot_create\");\n+        WorldDatabasePreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_UPD_NPCBOT_NAME);\n+        stmt->SetData(0, namestr);\n+        stmt->SetData(1, newentry);\n+        trans->Append(stmt);\n+        trans->Append(\"DROP TEMPORARY TABLE creature_template_temp_npcbot_create\");\n+        if (modelId)\n+        {\n+            trans->Append(\"DROP TEMPORARY TABLE IF EXISTS creature_template_model_temp_npcbot_create\");\n+            trans->Append(\"CREATE TEMPORARY TABLE creature_template_model_temp_npcbot_create ENGINE=MEMORY SELECT * FROM creature_template_model WHERE CreatureID = (SELECT entry FROM creature_template_npcbot_extras WHERE class = {} LIMIT 1)\", uint32(*bclass));\n+            trans->Append(\"UPDATE creature_template_model_temp_npcbot_create SET CreatureID = {}, CreatureDisplayID = {}\", newentry, modelId);\n+            trans->Append(\"INSERT INTO creature_template_model SELECT * FROM creature_template_model_temp_npcbot_create\");\n+            trans->Append(\"DROP TEMPORARY TABLE creature_template_model_temp_npcbot_create\");\n+        }\n+        trans->Append(\"REPLACE INTO creature_template_npcbot_extras VALUES ({}, {}, {})\", newentry, uint32(*bclass), uint32(*race));\n+        trans->Append(\"REPLACE INTO creature_equip_template SELECT {}, 1, ids.itemID1, ids.itemID2, ids.itemID3, -1 FROM (SELECT itemID1, itemID2, itemID3 FROM creature_equip_template WHERE CreatureID = (SELECT entry FROM creature_template_npcbot_extras WHERE class = {} LIMIT 1)) ids\", newentry, uint32(*bclass));\n+        if (can_change_appearance)\n+        {\n+            stmt = WorldDatabase.GetPreparedStatement(WORLD_REP_NPCBOT_APPEARANCE);\n+            stmt->SetData(0, newentry);\n+            stmt->SetData(1, namestr);\n+            stmt->SetData(2, uint32(*gender));\n+            stmt->SetData(3, uint32(*skin));\n+            stmt->SetData(4, uint32(*face));\n+            stmt->SetData(5, uint32(*hairstyle));\n+            stmt->SetData(6, uint32(*haircolor));\n+            stmt->SetData(7, uint32(*features));\n+            trans->Append(stmt);\n+        }\n+        WorldDatabase.DirectCommitTransaction(trans);\n+\n+        handler->PSendSysMessage(\"New NPCBot {} (class {}) is created with entry {} and will be available for spawning after server restart.\", namestr, uint32(*bclass), newentry);\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotSpawnCommand(ChatHandler* handler, Optional<std::string> creVal)\n+    {\n+        if (!creVal)\n+        {\n+            handler->SendSysMessage(\".npcbot spawn\");\n+            handler->SendSysMessage(\"Adds new npcbot spawn of given entry in world. You can shift-link the npc\");\n+            handler->SendSysMessage(\"Syntax: .npcbot spawn #entry\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        char* charID = handler->extractKeyFromLink((char*)creVal->c_str(), \"Hcreature_entry\");\n+        if (!charID)\n+            return false;\n+\n+        uint32 id = uint32(atoi(charID));\n+\n+        CreatureTemplate const* creInfo = sObjectMgr->GetCreatureTemplate(id);\n+\n+        if (!creInfo)\n+        {\n+            handler->PSendSysMessage(\"creature {} does not exist!\", id);\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        if (!creInfo->IsNPCBot())\n+        {\n+            handler->PSendSysMessage(\"creature {} is not a npcbot!\", id);\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        if (id == BOT_ENTRY_MIRROR_IMAGE_BM)\n+        {\n+            handler->PSendSysMessage(\"creature {} is a mirror image and cannot be spawned!\", id);\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        if (BotDataMgr::SelectNpcBotData(id))\n+        {\n+            handler->PSendSysMessage(\"Npcbot {} already exists in `characters_npcbot` table!\", id);\n+            handler->SendSysMessage(\"If you want to move this bot to a new location use '.npcbot move' command\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        WorldDatabasePreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_SEL_CREATURE_BY_ID);\n+        //\"SELECT guid FROM creature WHERE id1 = ? OR id2 = ? OR id3 = ?\", CONNECTION_SYNCH\n+        //stmt->setUInt32(0, id);\n+        stmt->SetArguments(id, id, id);\n+        PreparedQueryResult res2 = WorldDatabase.Query(stmt);\n+        if (res2)\n+        {\n+            handler->PSendSysMessage(\"Npcbot {} already exists in `creature` table!\", id);\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        Player* chr = handler->GetSession()->GetPlayer();\n+\n+        if (/*Transport* trans = */chr->GetTransport())\n+        {\n+            handler->SendSysMessage(\"Cannot spawn bots on transport!\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        //float x = chr->GetPositionX();\n+        //float y = chr->GetPositionY();\n+        //float z = chr->GetPositionZ();\n+        //float o = chr->GetOrientation();\n+        Map* map = chr->GetMap();\n+\n+        if (map->Instanceable())\n+        {\n+            handler->SendSysMessage(\"Cannot spawn bots in instances!\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        Creature* creature = new Creature();\n+        if (!creature->Create(map->GenerateLowGuid<HighGuid::Unit>(), map, chr->GetPhaseMaskForSpawn(), id, 0, chr->GetPositionX(), chr->GetPositionY(), chr->GetPositionZ(), chr->GetOrientation()))\n+        {\n+            delete creature;\n+            handler->SendSysMessage(\"Creature is not created!\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        NpcBotExtras const* _botExtras = BotDataMgr::SelectNpcBotExtras(id);\n+        if (!_botExtras)\n+        {\n+            delete creature;\n+            handler->PSendSysMessage(\"No class/race data found for bot {}!\", id);\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        uint8 bot_spec = bot_ai::SelectSpecForClass(_botExtras->bclass);\n+        BotDataMgr::AddNpcBotData(id, bot_ai::DefaultRolesForClass(_botExtras->bclass, bot_spec), bot_spec, creature->GetCreatureTemplate()->faction);\n+\n+        creature->SaveToDB(map->GetId(), (uint8(1) << map->GetSpawnMode()), chr->GetPhaseMaskForSpawn());\n+\n+        uint32 db_guid = creature->GetSpawnId();\n+        if (!creature->LoadBotCreatureFromDB(db_guid, map))\n+        {\n+            delete creature;\n+            handler->SendSysMessage(\"Cannot load npcbot from DB!\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        sObjectMgr->AddCreatureToGrid(db_guid, sObjectMgr->GetCreatureData(db_guid));\n+\n+        handler->SendSysMessage(\"NpcBot successfully spawned\");\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotSpawnedCommandImpl(ChatHandler* handler, Optional<std::string> area_str, Optional<std::string> class_str, Optional<uint32> level_min, Optional<uint32> level_max, bool is_free)\n+    {\n+        std::shared_lock lock(*BotDataMgr::GetLock());\n+        NpcBotRegistry const& all_bots = BotDataMgr::GetExistingNPCBots();\n+        std::vector<NpcBotRegistry::value_type> found_bots;\n+        found_bots.reserve(all_bots.size());\n+        std::copy_if(all_bots.cbegin(), all_bots.cend(), std::back_inserter(found_bots), [=](Creature const* bot) {\n+            return !is_free || BotDataMgr::SelectNpcBotData(bot->GetEntry())->owner == 0;\n+        });\n+\n+        std::ostringstream ss;\n+        if (!found_bots.empty())\n+        {\n+            if (area_str)\n+                std::ranges::transform(*area_str, area_str->begin(), ::toupper);\n+            if (class_str)\n+                std::ranges::transform(*class_str, class_str->begin(), ::toupper);\n+\n+            std::vector<std::string> matched_bots;\n+            matched_bots.reserve(found_bots.size());\n+            uint32 counter = 0;\n+            std::ostringstream bss;\n+            for (Creature const* bot : found_bots)\n+            {\n+                auto const& [bot_color_str, bot_class_str] = BotColors.at(bot->GetBotClass());\n+\n+                AreaTableEntry const* zone = sAreaTableStore.LookupEntry(bot->GetBotAI()->GetLastZoneId() ? bot->GetBotAI()->GetLastZoneId() : bot->GetZoneId());\n+                std::string zone_name = zone ? zone->area_name[handler->GetSession() ? handler->GetSessionDbLocaleIndex() : 0] : \"Unknown\";\n+\n+                std::string zone_name_upper;\n+                if (area_str)\n+                {\n+                    zone_name_upper = zone_name;\n+                    std::ranges::transform(zone_name_upper, zone_name_upper.begin(), ::toupper);\n+                }\n+\n+                std::string bot_class_upper;\n+                if (class_str)\n+                {\n+                    bot_class_upper = bot_class_str;\n+                    std::ranges::transform(bot_class_upper, bot_class_upper.begin(), ::toupper);\n+                }\n+\n+                if ((!area_str || zone_name_upper.find(*area_str) != std::string::npos) &&\n+                    (!class_str || bot_class_upper.find(*class_str) != std::string::npos) &&\n+                    (!level_min || bot->GetLevel() >= *level_min) &&\n+                    (!level_max || bot->GetLevel() <= *level_max))\n+                {\n+                    bss.clear();\n+                    bss.str(\"\");\n+\n+                    ++counter;\n+                    bss << '\\n' << counter << \") \" << bot->GetEntry() << \": \"\n+                        << bot->GetName() << \" - |c\" << bot_color_str << bot_class_str << \"|r - \"\n+                        << \"level \" << uint32(bot->GetLevel()) << \" - \\\"\" << zone_name << '\"'\n+                        << (bot->GetBotAI()->HasRealEquipment() ? \" |cff00ffff(has equipment!)|r\" : \"\");\n+                    matched_bots.push_back(bss.str());\n+                }\n+            }\n+\n+            const std::string_view free_str = is_free ? \"free \" : \"\";\n+            if (matched_bots.empty())\n+                ss << \"No \" << free_str << \"bots found!\";\n+            else\n+            {\n+                ss << \"Found \" << uint32(matched_bots.size()) << ' ' << free_str << \"bots:\";\n+                for (std::string& bstr : matched_bots)\n+                    ss << std::move(bstr);\n+            }\n+        }\n+\n+        handler->SendSysMessage(ss.view());\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotSpawnedCommand(ChatHandler* handler)\n+    {\n+        return HandleNpcBotSpawnedCommandImpl(handler, {}, {}, {}, {}, false);\n+    }\n+\n+    static bool HandleNpcBotSpawnedFreeCommand(ChatHandler* handler)\n+    {\n+        return HandleNpcBotSpawnedCommandImpl(handler, {}, {}, {}, {}, true);\n+    }\n+\n+    static bool HandleNpcBotSpawnedStatsCommandImpl(ChatHandler* handler, bool is_free)\n+    {\n+        std::array<uint32, BRACKETS_COUNT> bot_levels{ 1, 10, 20, 30, 40, 50, 60, 70, 80 };\n+        std::array<uint32, BRACKETS_COUNT> bot_count_by_level{};\n+        std::array<uint32, BOT_CLASS_END> bot_count_by_class{};\n+\n+        std::shared_lock lock(*BotDataMgr::GetLock());\n+        NpcBotRegistry const& all_bots = BotDataMgr::GetExistingNPCBots();\n+        std::vector<NpcBotRegistry::value_type> found_bots;\n+        found_bots.reserve(all_bots.size());\n+        std::copy_if(all_bots.cbegin(), all_bots.cend(), std::back_inserter(found_bots), [=](Creature const* bot) {\n+            return !is_free || BotDataMgr::SelectNpcBotData(bot->GetEntry())->owner == 0;\n+        });\n+\n+        std::ostringstream ss;\n+        const std::string_view free_str = is_free ? \"free \" : \"\";\n+        if (!found_bots.empty())\n+            ss << \"No \" << free_str << \"bots found!\";\n+        else\n+        {\n+            ss << \"Found \" << uint32(found_bots.size()) << ' ' << free_str << \"bots:\";\n+\n+            for (Creature const* bot : found_bots)\n+            {\n+                uint32 bot_level = uint32(bot->GetLevel());\n+                static_assert(std::is_same_v<decltype(bot_level / 10u), decltype(bot_count_by_level)::value_type>);\n+\n+                bot_count_by_class[bot->GetBotClass()]++;\n+                bot_count_by_level[std::min<uint32>(bot_level / 10u, bot_count_by_level.size() - 1)]++;\n+            }\n+\n+            for (std::size_t i{}; i < bot_count_by_class.size(); ++i)\n+                if (bot_count_by_class[i])\n+                    ss << \"\\n \" << BotColors.at(i).name << \": \" << bot_count_by_class[i] << \" bots\";\n+            ss << '\\n';\n+\n+            static_assert(std::size(bot_levels) == std::size(bot_count_by_level));\n+            for (size_t i{}; i < bot_levels.size(); ++i)\n+            {\n+                ss << \"\\n Levels \" << bot_levels[i];\n+                if (i + 1 < bot_levels.size())\n+                    ss << '-' << bot_levels[i + 1] - 1;\n+                else\n+                    ss << '+';\n+                ss << \": \" << bot_count_by_level[i] << \" bots\";\n+            }\n+        };\n+\n+        handler->SendSysMessage(ss.view());\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotSpawnedStatsCommand(ChatHandler* handler)\n+    {\n+        return HandleNpcBotSpawnedStatsCommandImpl(handler, false);\n+    }\n+\n+    static bool HandleNpcBotSpawnedFreeStatsCommand(ChatHandler* handler)\n+    {\n+        return HandleNpcBotSpawnedStatsCommandImpl(handler, true);\n+    }\n+\n+    static bool HandleNPCBotSpawnedZoneCommandImpl(ChatHandler* handler, Optional<std::string> zone_name, bool is_free)\n+    {\n+        if (!zone_name || zone_name->empty())\n+        {\n+            if (!handler->GetPlayer())\n+            {\n+                handler->SendSysMessage(\"Syntax: npcbot list spawned [free] zone #zone_name_part\");\n+                handler->SetSentErrorMessage(true);\n+                return false;\n+            }\n+\n+            AreaTableEntry const* zone = sAreaTableStore.LookupEntry(handler->GetPlayer()->GetZoneId());\n+            zone_name = zone ? zone->area_name[handler->GetSession() ? handler->GetSessionDbLocaleIndex() : 0] : \"Unknown\";\n+        }\n+\n+        return HandleNpcBotSpawnedCommandImpl(handler, zone_name, {}, {}, {}, is_free);\n+    }\n+\n+    static bool HandleNPCBotSpawnedZoneCommand(ChatHandler* handler, Optional<std::string> zone_name)\n+    {\n+        return HandleNPCBotSpawnedZoneCommandImpl(handler, zone_name, false);\n+    }\n+\n+    static bool HandleNPCBotSpawnedFreeZoneCommand(ChatHandler* handler, Optional<std::string> zone_name)\n+    {\n+        return HandleNPCBotSpawnedZoneCommandImpl(handler, zone_name, true);\n+    }\n+\n+    static bool HandleNPCBotSpawnedClassCommandImpl(ChatHandler* handler, Optional<std::string> class_name, Optional<std::string> zone_name, bool is_free)\n+    {\n+        if (!class_name || class_name->empty())\n+        {\n+            handler->SendSysMessage(\"Syntax: npcbot list spawned [free] class #class #[zone]\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+        return HandleNpcBotSpawnedCommandImpl(handler, zone_name, class_name, {}, {}, is_free);\n+    }\n+\n+    static bool HandleNPCBotSpawnedClassCommand(ChatHandler* handler, Optional<std::string> class_name, Optional<std::string> zone_name)\n+    {\n+        return HandleNPCBotSpawnedClassCommandImpl(handler, class_name, zone_name, false);\n+    }\n+\n+    static bool HandleNPCBotSpawnedFreeClassCommand(ChatHandler* handler, Optional<std::string> class_name, Optional<std::string> zone_name)\n+    {\n+        return HandleNPCBotSpawnedClassCommandImpl(handler, class_name, zone_name, true);\n+    }\n+\n+    static bool HandleNPCBotSpawnedLevelCommandImpl(ChatHandler* handler, Optional<uint32> level_min, Optional<uint32> level_max, Optional<std::string> zone_name, bool is_free)\n+    {\n+        if (!level_min || !*level_min)\n+        {\n+            handler->SendSysMessage(\"Syntax: npcbot list spawned [free] level #level_min #[level_max] #[zone]\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        return HandleNpcBotSpawnedCommandImpl(handler, zone_name, {}, level_min, level_max, is_free);\n+    }\n+\n+    static bool HandleNPCBotSpawnedLevelCommand(ChatHandler* handler, Optional<uint32> level_min, Optional<uint32> level_max, Optional<std::string> zone_name)\n+    {\n+        return HandleNPCBotSpawnedLevelCommandImpl(handler, level_min, level_max, zone_name, false);\n+    }\n+\n+    static bool HandleNPCBotSpawnedFreeLevelCommand(ChatHandler* handler, Optional<uint32> level_min, Optional<uint32> level_max, Optional<std::string> zone_name)\n+    {\n+        return HandleNPCBotSpawnedLevelCommandImpl(handler, level_min, level_max, zone_name, true);\n+    }\n+\n+    static bool HandleNpcBotGearScoreCommand(ChatHandler* handler, Optional<std::string_view> class_name)\n+    {\n+        Player* owner = handler->GetSession()->GetPlayer();\n+        Unit* unit = owner->GetSelectedUnit();\n+        if (!(unit && owner->GetBotMgr()->GetBot(unit->GetGUID())) && !class_name)\n+        {\n+            handler->SendSysMessage(\".npcbot gs [#class_name]\");\n+            handler->SendSysMessage(\"Lists GearScore of your selected NPCBot or all bots by #class_name\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+        std::vector<Creature*> bots;\n+        if (class_name)\n+        {\n+            if (!std::ranges::all_of(class_name.value(), [](char c) { return std::islower(c); }))\n+            {\n+                handler->SendSysMessage(\"Bot class name must be in lower case!\");\n+                return true;\n+            }\n+\n+            uint8 bot_class = BotMgr::BotClassByClassName(*class_name);\n+            if (bot_class == BOT_CLASS_NONE)\n+            {\n+                handler->PSendSysMessage(\"Unknown bot name or class {}!\", *class_name);\n+                return true;\n+            }\n+\n+            bots = owner->GetBotMgr()->GetAllBotsByClass(bot_class);\n+            if (bots.empty())\n+            {\n+                handler->PSendSysMessage(\"No bots of class {} found!\", uint32(bot_class));\n+                return true;\n+            }\n+        }\n+        else\n+            bots.push_back(unit->ToCreature());\n+\n+        for (Creature const* bot : bots)\n+        {\n+            auto scores = bot->GetBotAI()->GetBotGearScores();\n+            handler->PSendSysMessage(\"{}'s GearScore total: {}, average: {}\", bot->GetName(), uint32(scores.first), uint32(scores.second));\n+        }\n+\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotUseOnBotSpellCommand(ChatHandler* handler, Optional<Variant<SpellInfo const*, std::vector<std::string>>> spell_name_parts_or_info)\n+    {\n+        Player* player = handler->GetSession()->GetPlayer();\n+        Creature* target = handler->getSelectedCreature();\n+\n+        if (!spell_name_parts_or_info)\n+        {\n+            handler->SendSysMessage(\".npcbot useonbot spell [#spell_name]\");\n+            handler->SendSysMessage(\"Attempts to cast spell by name on selected bot, bypassing client restrictions\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        if (!target || !target->IsNPCBot())\n+        {\n+            handler->SendSysMessage(\"No NPCBot selected\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        uint32 spellId = 0;\n+        std::string spellname;\n+        if (spell_name_parts_or_info->holds_alternative<SpellInfo const*>())\n+            spellId = spell_name_parts_or_info->get<SpellInfo const*>()->Id;\n+        else\n+        {\n+            auto const& vec = spell_name_parts_or_info->get<std::vector<std::string>>();\n+            spellname = vec[0];\n+            for (std::size_t i = 1; i < vec.size(); ++i)\n+                spellname += ' ' + vec[i];\n+\n+            if (spellname.size() >= 2 && spellname[0] == '[' && spellname[spellname.size() - 1] == ']')\n+                spellname = spellname.substr(1, spellname.size() - 2);\n+\n+            LocaleConstant locale = handler->GetSession()->GetSessionDbcLocale();\n+            for (auto const& [spellid, pspell] : player->GetSpellMap())\n+            {\n+                if (pspell->State != PLAYERSPELL_REMOVED && pspell->Active)\n+                {\n+                    SpellInfo const* info = sSpellMgr->GetSpellInfo(spellid);\n+                    if (info && info->SpellName[locale] == spellname)\n+                    {\n+                        spellId = spellid;\n+                        break;\n+                    }\n+                }\n+            }\n+        }\n+\n+        SpellInfo const* spellInfo = spellId ? sSpellMgr->AssertSpellInfo(spellId) : nullptr;\n+        if (!spellInfo)\n+        {\n+            handler->PSendSysMessage(LANG_COMMAND_NOSPELLFOUND);\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        // silently cancel\n+        if (spellInfo->IsPassive() || !spellInfo->IsPositive() || player->isPossessing() || player->IsInFlight())\n+            return true;\n+\n+        SpellInfo const* actualSpellInfo = spellInfo->GetAuraRankForLevel(target->GetLevel());\n+        if (actualSpellInfo)\n+            spellInfo = actualSpellInfo;\n+\n+        SpellCastTargets targets;\n+        targets.SetUnitTarget(target);\n+        Spell* spell = new Spell(player, spellInfo, TRIGGERED_NONE);\n+        spell->m_cast_count = 1;\n+        spell->prepare(&targets);\n+\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotUseOnBotItemCommand(ChatHandler* handler, Optional<Variant<ItemTemplate const*, std::vector<std::string>>> item_name_parts_or_template)\n+    {\n+        Player* player = handler->GetSession()->GetPlayer();\n+        Creature* target = handler->getSelectedCreature();\n+\n+        if (!item_name_parts_or_template)\n+        {\n+            handler->SendSysMessage(\".npcbot useonbot item [#item_name]\");\n+            handler->SendSysMessage(\"Attempts to cast item spell by item name on selected bot, bypassing client restrictions\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        if (!target || !target->IsNPCBot())\n+        {\n+            handler->SendSysMessage(\"No NPCBot selected\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        Item* item = nullptr;\n+        if (item_name_parts_or_template->holds_alternative<ItemTemplate const*>())\n+            item = player->GetItemByEntry(item_name_parts_or_template->get<ItemTemplate const*>()->ItemId);\n+        else\n+        {\n+            auto const& vec = item_name_parts_or_template->get<std::vector<std::string>>();\n+            std::string itemname = vec[0];\n+            for (std::size_t i = 1; i < vec.size(); ++i)\n+                itemname += ' ' + vec[i];\n+\n+            if (itemname.size() >= 2 && itemname[0] == '[' && itemname[itemname.size() - 1] == ']')\n+                itemname = itemname.substr(1, itemname.size() - 2);\n+\n+            LocaleConstant locale = handler->GetSession()->GetSessionDbcLocale();\n+\n+            // find the item\n+            for (uint8 i = EQUIPMENT_SLOT_START; i < INVENTORY_SLOT_ITEM_END && !item; ++i)\n+            {\n+                Item* pItem = player->GetItemByPos(INVENTORY_SLOT_BAG_0, i);\n+                if (!pItem || pItem->IsInTrade())\n+                    continue;\n+\n+                ItemTemplate const* pItemTemplate = pItem->GetTemplate();\n+                std::string pItemName = pItemTemplate->Name1;\n+                if (ItemLocale const* il = sObjectMgr->GetItemLocale(pItemTemplate->ItemId))\n+                    ObjectMgr::GetLocaleString(il->Name, locale, pItemName);\n+                if (pItemName == itemname)\n+                    item = pItem;\n+            }\n+            for (uint8 i = INVENTORY_SLOT_BAG_START; i < INVENTORY_SLOT_BAG_END && !item; ++i)\n+            {\n+                if (Bag* pBag = player->GetBagByPos(i))\n+                {\n+                    for (uint32 j{}; j < pBag->GetBagSize() && !item; ++j)\n+                    {\n+                        Item* pItem = player->GetItemByPos(i, j);\n+                        if (!pItem || pItem->IsInTrade())\n+                            continue;\n+\n+                        ItemTemplate const* pItemTemplate = pItem->GetTemplate();\n+                        std::string pItemName = pItemTemplate->Name1;\n+                        if (ItemLocale const* il = sObjectMgr->GetItemLocale(pItemTemplate->ItemId))\n+                            ObjectMgr::GetLocaleString(il->Name, locale, pItemName);\n+                        if (pItemName == itemname)\n+                            item = pItem;\n+                    }\n+                }\n+            }\n+        }\n+\n+        if (!item)\n+        {\n+            handler->SendSysMessage(LANG_COMMAND_NOITEMFOUND);\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        // find usable spell\n+        ItemTemplate const* itemtemplate = item->GetTemplate();\n+        uint32 spellId = 0;\n+        for (auto const& itemspell : itemtemplate->Spells)\n+        {\n+            if (itemspell.SpellId > 0 && itemspell.SpellTrigger == ITEM_SPELLTRIGGER_ON_USE)\n+            {\n+                spellId = itemspell.SpellId;\n+                break;\n+            }\n+        }\n+\n+        SpellInfo const* spellInfo = spellId ? sSpellMgr->GetSpellInfo(spellId) : nullptr;\n+        if (!spellInfo)\n+        {\n+            handler->PSendSysMessage(LANG_COMMAND_NOSPELLFOUND);\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        if (itemtemplate->InventoryType != INVTYPE_NON_EQUIP && !item->IsEquipped())\n+        {\n+            player->SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND, item, nullptr);\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        InventoryResult msg = player->CanUseItem(item);\n+        if (msg != EQUIP_ERR_OK)\n+        {\n+            player->SendEquipError(msg, item, nullptr);\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        if (itemtemplate->Class == ITEM_CLASS_CONSUMABLE && !(itemtemplate->Flags & ITEM_FLAG_IGNORE_DEFAULT_ARENA_RESTRICTIONS) && player->InArena())\n+        {\n+            player->SendEquipError(EQUIP_ERR_NOT_DURING_ARENA_MATCH, item, nullptr);\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        if ((itemtemplate->Flags & ITEM_FLAG_NOT_USEABLE_IN_ARENA) && player->InArena())\n+        {\n+            player->SendEquipError(EQUIP_ERR_NOT_DURING_ARENA_MATCH, item, nullptr);\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        if (player->IsInCombat() && !spellInfo->CanBeUsedInCombat())\n+        {\n+            player->SendEquipError(EQUIP_ERR_NOT_IN_COMBAT, item, nullptr);\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        // silently cancel\n+        if (spellInfo->IsPassive() || !spellInfo->IsPositive() || player->isPossessing() || player->IsInFlight())\n+            return true;\n+\n+        SpellInfo const* actualSpellInfo = spellInfo->GetAuraRankForLevel(target->GetLevel());\n+        if (actualSpellInfo)\n+            spellInfo = actualSpellInfo;\n+\n+        SpellCastTargets targets;\n+        targets.SetUnitTarget(target);\n+        Spell* spell = new Spell(player, spellInfo, TRIGGERED_NONE);\n+        spell->m_CastItem = item;\n+        spell->m_cast_count = 1;\n+        spell->m_glyphIndex = 0;\n+        spell->prepare(&targets);\n+\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotInfoCommand(ChatHandler* handler, Optional<Variant<uint32, std::string>> player_lg_name)\n+    {\n+        Player* player = handler->GetSession() ? handler->GetSession()->GetPlayer() : nullptr;\n+        std::string master_name = (player_lg_name && player_lg_name->holds_alternative<std::string>()) ? player_lg_name->get<std::string>() : \"\";\n+        if (!master_name.empty())\n+            normalizePlayerName(master_name);\n+        ObjectGuid cached_guid = !master_name.empty() ? sCharacterCache->GetCharacterGuidByName(master_name) : ObjectGuid::Empty;\n+        ObjectGuid master_guid = cached_guid ? cached_guid :\n+            (player_lg_name && player_lg_name->holds_alternative<uint32>()) ? ObjectGuid::Create<HighGuid::Player>(player_lg_name->get<uint32>()) :\n+            player && player->GetTarget().IsPlayer() ? player->GetTarget() : ObjectGuid::Empty;\n+\n+        if (master_guid.IsEmpty())\n+        {\n+            if (!master_name.empty())\n+            {\n+                handler->PSendSysMessage(\"Player '{}' is not found!\", master_name);\n+                handler->SetSentErrorMessage(true);\n+                return false;\n+            }\n+\n+            handler->SendSysMessage(\".npcbot info\");\n+            handler->SendSysMessage(\"Lists NpcBots count of each class owned by selected player. You can use this on self and your party members\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+        if (master_name.empty() && !sCharacterCache->GetCharacterNameByGuid(master_guid, master_name))\n+        {\n+            handler->PSendSysMessage(\"Player {} is not found!\", master_guid.GetCounter());\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+        if (BotDataMgr::GetOwnedBotsCount(master_guid, 0, true) == 0)\n+        {\n+            handler->PSendSysMessage(\"{} ({}) has no NpcBots!\", master_name, master_guid.GetCounter());\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        std::vector<ObjectGuid> guidvec;\n+        BotDataMgr::GetNPCBotGuidsByOwner(guidvec, master_guid, true);\n+        Player* master = ObjectAccessor::FindConnectedPlayer(master_guid);\n+        BotMap const* map = master ? master->GetBotMgr()->GetBotMap() : nullptr;\n+        uint32 map_size = map ? uint32(map->size()) : 0u;\n+        if (map)\n+            std::erase_if(guidvec, [=](ObjectGuid guid) { return map->find(guid) != map->end(); });\n+\n+        handler->PSendSysMessage(\"Listing NpcBots for {}, guid {}{}:\", master_name, master_guid.GetCounter(), !master ? \" (offline)\" : \"\");\n+        handler->PSendSysMessage(\"Owned NpcBots: {} (active: {})\", uint32(guidvec.size()) + map_size, map_size);\n+        LocaleConstant loc = LocaleConstant(handler->GetSessionDbLocaleIndex());\n+        if (map)\n+        {\n+            for (uint8 i = BOT_CLASS_WARRIOR; i != BOT_CLASS_END; ++i)\n+            {\n+                for (auto const& [_, bot] : *map)\n+                {\n+                    if (bot && bot->GetBotClass() == i)\n+                    {\n+                        std::ostringstream nss;\n+                        nss << \"|c\" << BotColors.at(i).color << BotColors.at(i).name << \"|r\";\n+                        std::string_view base_name = bot->GetName();\n+                        if (CreatureLocale const* creatureLocale = sObjectMgr->GetCreatureLocale(bot->GetEntry()))\n+                            if (creatureLocale->Name.size() > loc && !creatureLocale->Name[loc].empty())\n+                                base_name = creatureLocale->Name[loc];\n+\n+                        handler->PSendSysMessage(\"{} ({}): {} (alive: {})\", base_name, bot->GetEntry(), nss.view(), uint32(bot->IsAlive()));\n+                    }\n+                }\n+            }\n+        }\n+\n+        handler->PSendSysMessage(\"{} inactive bots:\", uint32(guidvec.size()));\n+        for (ObjectGuid guid : guidvec)\n+        {\n+            Creature const* bot = BotDataMgr::FindBot(guid.GetEntry());\n+            uint8 bot_class = bot ? bot->GetBotClass() : uint8(BOT_CLASS_NONE);\n+            std::ostringstream nss;\n+            nss << \"|c\" << BotColors.at(bot_class).color << BotColors.at(bot_class).name << \"|r\";\n+            std::string_view base_name = bot ? std::string_view{ bot->GetName() } : std::string_view{ \"Unknown\" };\n+            if (CreatureLocale const* creatureLocale = sObjectMgr->GetCreatureLocale(guid.GetEntry()))\n+                if (creatureLocale->Name.size() > loc && !creatureLocale->Name[loc].empty())\n+                    base_name = creatureLocale->Name[loc];\n+            handler->PSendSysMessage(\"{} ({}): {} (alive: {})\", base_name, guid.GetEntry(), nss.view(), bot ? uint32(bot->IsAlive()) : uint32(0));\n+        }\n+\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotCommandStandstillCommand(ChatHandler* handler)\n+    {\n+        Player* owner = handler->GetSession()->GetPlayer();\n+\n+        if (!owner->HaveBot())\n+        {\n+            handler->SendSysMessage(\".npcbot command standstill\");\n+            handler->SendSysMessage(\"Forces your npcbots to stop all movement and remain stationed\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        std::string msg;\n+        Unit* target = owner->GetSelectedUnit();\n+        if (target && owner->GetBotMgr()->GetBot(target->GetGUID()))\n+        {\n+            target->ToCreature()->GetBotAI()->SetBotCommandState(BOT_COMMAND_STAY);\n+            msg = target->GetName() + \"'s command state set to 'STAY'\";\n+        }\n+        else\n+        {\n+            owner->GetBotMgr()->SendBotCommandState(BOT_COMMAND_STAY);\n+            msg = \"Bots' command state set to 'STAY'\";\n+        }\n+\n+        handler->SendSysMessage(msg);\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotCommandStopfullyCommand(ChatHandler* handler)\n+    {\n+        Player* owner = handler->GetSession()->GetPlayer();\n+\n+        if (!owner->HaveBot())\n+        {\n+            handler->SendSysMessage(\".npcbot command stopfully\");\n+            handler->SendSysMessage(\"Forces your npcbots to stop all activity\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        std::string msg;\n+        Unit* target = owner->GetSelectedUnit();\n+        if (target && owner->GetBotMgr()->GetBot(target->GetGUID()))\n+        {\n+            target->ToCreature()->GetBotAI()->SetBotCommandState(BOT_COMMAND_FULLSTOP);\n+            msg = target->GetName() + \"'s command state set to 'FULLSTOP'\";\n+        }\n+        else\n+        {\n+            owner->GetBotMgr()->SendBotCommandState(BOT_COMMAND_FULLSTOP);\n+            msg = \"Bots' command state set to 'FULLSTOP'\";\n+        }\n+\n+        handler->SendSysMessage(msg);\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotCommandNoLongCastCommand(ChatHandler* handler)\n+    {\n+        Player* owner = handler->GetSession()->GetPlayer();\n+\n+        if (!owner->HaveBot())\n+        {\n+            handler->SendSysMessage(\".npcbot command nolongcast\");\n+            handler->SendSysMessage(\"Makes npcbots unable to cast spells with non-zero cast time\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        std::string_view msg;\n+        if (!owner->GetBotMgr()->GetBotMap()->begin()->second->GetBotAI()->HasBotCommandState(BOT_COMMAND_NO_CAST_LONG))\n+        {\n+            owner->GetBotMgr()->SendBotCommandState(BOT_COMMAND_NO_CAST_LONG);\n+            msg = \"Bots' command state set to 'NOLONGCAST'\";\n+        }\n+        else\n+        {\n+            owner->GetBotMgr()->SendBotCommandStateRemove(BOT_COMMAND_NO_CAST_LONG);\n+            msg = \"Bots' command state 'NOLONGCAST' was removed\";\n+        }\n+\n+        handler->SendSysMessage(msg);\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotCommandNoCastCommand(ChatHandler* handler)\n+    {\n+        Player* owner = handler->GetSession()->GetPlayer();\n+\n+        if (!owner->HaveBot())\n+        {\n+            handler->SendSysMessage(\".npcbot command nocast\");\n+            handler->SendSysMessage(\"Makes npcbots unable to cast ANY spells\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        std::string_view msg;\n+        if (!owner->GetBotMgr()->GetBotMap()->begin()->second->GetBotAI()->HasBotCommandState(BOT_COMMAND_NO_CAST))\n+        {\n+            owner->GetBotMgr()->SendBotCommandState(BOT_COMMAND_NO_CAST);\n+            msg = \"Bots' command state set to 'NOCAST'\";\n+        }\n+        else\n+        {\n+            owner->GetBotMgr()->SendBotCommandStateRemove(BOT_COMMAND_NO_CAST);\n+            msg = \"Bots' command state 'NOCAST' was removed\";\n+        }\n+\n+        handler->SendSysMessage(msg);\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotCommandFollowOnlyCommand(ChatHandler* handler)\n+    {\n+        Player* owner = handler->GetSession()->GetPlayer();\n+\n+        if (!owner->HaveBot())\n+        {\n+            handler->SendSysMessage(\".npcbot command follow only\");\n+            handler->SendSysMessage(\"Makes npcbots follow you and do nothing else\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        std::string_view msg;\n+        if (!owner->GetBotMgr()->GetBotMap()->begin()->second->GetBotAI()->HasBotCommandState(BOT_COMMAND_INACTION))\n+        {\n+            owner->GetBotMgr()->SendBotCommandState(BOT_COMMAND_INACTION);\n+            msg = \"Bots' command state set to 'INACTION'\";\n+        }\n+        else\n+        {\n+            owner->GetBotMgr()->SendBotCommandStateRemove(BOT_COMMAND_INACTION);\n+            msg = \"Bots' command state 'INACTION' was removed\";\n+        }\n+\n+        handler->SendSysMessage(msg);\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotCommandFollowCommand(ChatHandler* handler)\n+    {\n+        Player* owner = handler->GetSession()->GetPlayer();\n+\n+        if (!owner->HaveBot())\n+        {\n+            handler->SendSysMessage(\".npcbot command follow\");\n+            handler->SendSysMessage(\"Allows npcbots to follow you again if stopped\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        std::string msg;\n+        Unit* target = owner->GetSelectedUnit();\n+        if (target && owner->GetBotMgr()->GetBot(target->GetGUID()))\n+        {\n+            target->ToCreature()->GetBotAI()->SetBotCommandState(BOT_COMMAND_FOLLOW);\n+            msg = target->GetName() + \"'s command state set to 'FOLLOW'\";\n+        }\n+        else\n+        {\n+            owner->GetBotMgr()->SendBotCommandState(BOT_COMMAND_FOLLOW);\n+            msg = \"Bots' command state set to 'FOLLOW'\";\n+        }\n+\n+        handler->SendSysMessage(msg);\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotCommandWalkCommand(ChatHandler* handler)\n+    {\n+        Player* owner = handler->GetSession()->GetPlayer();\n+\n+        if (!owner->HaveBot())\n+        {\n+            handler->SendSysMessage(\".npcbot command walk\");\n+            handler->SendSysMessage(\"Toggles walk mode for your npcbots\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        std::string_view msg;\n+        bool isWalking = owner->GetBotMgr()->GetBotMap()->begin()->second->GetBotAI()->HasBotCommandState(BOT_COMMAND_WALK);\n+        if (!isWalking)\n+        {\n+            owner->GetBotMgr()->SendBotCommandState(BOT_COMMAND_WALK);\n+            msg = \"Bots' movement mode is set to 'WALK'\";\n+        }\n+        else\n+        {\n+            owner->GetBotMgr()->SendBotCommandStateRemove(BOT_COMMAND_WALK);\n+            msg = \"Bots' movement mode is set to 'RUN'\";\n+        }\n+\n+        handler->SendSysMessage(msg);\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotCommandNoGossipCommand(ChatHandler* handler)\n+    {\n+        Player* owner = handler->GetSession()->GetPlayer();\n+\n+        if (!owner->HaveBot())\n+        {\n+            handler->SendSysMessage(\".npcbot command nogossip\");\n+            handler->SendSysMessage(\"Toggles gossip availability for your npcbots\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        std::string_view msg;\n+        bool isNoGossipEnabled = owner->GetBotMgr()->GetBotMap()->begin()->second->GetBotAI()->HasBotCommandState(BOT_COMMAND_NOGOSSIP);\n+        if (!isNoGossipEnabled)\n+        {\n+            owner->GetBotMgr()->SendBotCommandState(BOT_COMMAND_NOGOSSIP);\n+            msg = \"Bots' gossip is DISABLED\";\n+        }\n+        else\n+        {\n+            owner->GetBotMgr()->SendBotCommandStateRemove(BOT_COMMAND_NOGOSSIP);\n+            msg = \"Bots' gossip is ENABLED\";\n+        }\n+\n+        handler->SendSysMessage(msg);\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotCommandReBindCommand(ChatHandler* handler, Optional<std::vector<std::string>> names)\n+    {\n+        auto return_syntax = [=] {\n+            handler->SendSysMessage(\".npcbot command rebind [#names...]\");\n+            handler->SendSysMessage(\"Re-binds selected/named unbound npcbot\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        };\n+\n+        auto return_success = [=](Variant<std::string_view, uint32> name_or_count) {\n+            if (name_or_count.holds_alternative<uint32>())\n+                handler->PSendSysMessage(\"Successfully re-bound {} bot(s)\", name_or_count.get<uint32>());\n+            else\n+                handler->PSendSysMessage(\"Successfully re-bound {}\", name_or_count.get<std::string_view>());\n+            return true;\n+        };\n+\n+        auto return_fail = [=](BotAddResult result, Variant<std::string_view, uint32> name_or_count) {\n+            if (name_or_count.holds_alternative<uint32>())\n+                handler->PSendSysMessage(\"Unable to re-bind any of {} bots!\", name_or_count.get<uint32>());\n+            else\n+                handler->PSendSysMessage(\"Failed to re-bind {}, result was {}!\", name_or_count.get<std::string_view>(), uint32(result));\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        };\n+\n+        Player const* owner = handler->GetSession()->GetPlayer();\n+\n+        if (!owner->HaveBot() && BotDataMgr::GetOwnedBotsCount(owner->GetGUID(), 0, true) == 0)\n+            return return_syntax();\n+\n+        BotMgr* mgr = owner->GetBotMgr();\n+\n+        if (!names || names->empty())\n+        {\n+            Creature const* bot = handler->getSelectedCreature();\n+            if (bot && bot->IsNPCBot() && !bot->IsTempBot() && !mgr->GetBot(bot->GetGUID()) && bot->GetBotAI()->HasBotCommandState(BOT_COMMAND_UNBIND) &&\n+                bot->GetBotAI()->HasOwner(owner->GetGUID().GetCounter()))\n+            {\n+                if (BotAddResult res = mgr->RebindBot(const_cast<Creature*>(bot)); res != BOT_ADD_SUCCESS)\n+                    return return_fail(res, { bot->GetName() });\n+\n+                return return_success({ bot->GetName() });\n+            }\n+            return return_syntax();\n+        }\n+\n+        uint32 count = 0;\n+        DoForAllNamesNormalizedIn(*names, [owner, mgr, &return_fail, &count](std::string const& name) {\n+            std::vector<uint32> bot_ids;\n+            bot_ids.reserve(owner->GetBotMgr()->GetNpcBotsCount());\n+            for (auto const& [_, ebot] : *owner->GetBotMgr()->GetBotMap())\n+                bot_ids.push_back(ebot->GetEntry());\n+\n+            Creature const* bot = BotDataMgr::FindBot(name, owner->GetSession()->GetSessionDbLocaleIndex(), &bot_ids);\n+            if (bot && bot->IsNPCBot() && !bot->IsTempBot() && !mgr->GetBot(bot->GetGUID()) && bot->GetBotAI()->HasBotCommandState(BOT_COMMAND_UNBIND) &&\n+                bot->GetBotAI()->HasOwner(owner->GetGUID().GetCounter()))\n+            {\n+                if (BotAddResult res = mgr->RebindBot(const_cast<Creature*>(bot)); res != BOT_ADD_SUCCESS)\n+                {\n+                    return_fail(res, { name });\n+                    return;\n+                }\n+                ++count;\n+            }\n+        });\n+\n+        if (count == 0)\n+            return return_fail({}, { uint32(names->size()) });\n+\n+        return return_success({ count });\n+    }\n+\n+    static bool HandleNpcBotCommandUnBindCommand(ChatHandler* handler, Optional<std::vector<std::string>> names)\n+    {\n+        static auto return_syntax = [](ChatHandler* chandler) -> bool {\n+            chandler->SendSysMessage(\".npcbot command unbind [#names...]\");\n+            chandler->SendSysMessage(\"Frees selected/named npcbot(s) temporarily. The bot will return to home location and wait until re-bound\");\n+            chandler->SetSentErrorMessage(true);\n+            return false;\n+        };\n+\n+        static auto return_success = [](ChatHandler* chandler, Variant<std::string_view, uint32> name_or_count) -> bool {\n+            if (name_or_count.holds_alternative<uint32>())\n+                chandler->PSendSysMessage(\"Successfully unbound {} bot(s)\", name_or_count.get<uint32>());\n+            else\n+                chandler->PSendSysMessage(\"Successfully unbound {}\", name_or_count.get<std::string_view>());\n+            return true;\n+        };\n+\n+        Player const* owner = handler->GetSession()->GetPlayer();\n+\n+        if (!owner->HaveBot())\n+            return return_syntax(handler);\n+\n+        if (!names || names->empty())\n+        {\n+            Unit const* target = handler->getSelectedCreature();\n+            Creature const* bot = target ? owner->GetBotMgr()->GetBot(target->GetGUID()) : nullptr;\n+            if (bot && !bot->GetBotAI()->HasBotCommandState(BOT_COMMAND_UNBIND))\n+            {\n+                owner->GetBotMgr()->UnbindBot(bot->GetGUID());\n+                return return_success(handler, { bot->GetName() });\n+            }\n+            return return_syntax(handler);\n+        }\n+\n+        uint32 count = 0;\n+        DoForAllNamesNormalizedIn(*names, [owner, &count](std::string const& name) {\n+            Creature const* bot = owner->GetBotMgr()->GetBotByName(name);\n+            if (bot && !bot->GetBotAI()->HasBotCommandState(BOT_COMMAND_UNBIND))\n+            {\n+                ++count;\n+                owner->GetBotMgr()->UnbindBot(bot->GetGUID());\n+            }\n+        });\n+\n+        if (count == 0)\n+        {\n+            handler->PSendSysMessage(\"Unable to unbind any of {} bots!\", uint32(names->size()));\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        return return_success(handler, { count });\n+    }\n+\n+    static bool HandleNpcBotRemoveCommand(ChatHandler* handler)\n+    {\n+        Player* owner = handler->GetSession()->GetPlayer();\n+        Unit* u = owner->GetSelectedUnit();\n+        if (!u)\n+        {\n+            handler->SendSysMessage(\".npcbot remove\");\n+            handler->SendSysMessage(\"Frees selected npcbot from it's owner. Select player to remove all npcbots\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        Player* master = u->ToPlayer();\n+        if (master)\n+        {\n+            if (master->HaveBot())\n+            {\n+                master->RemoveAllBots(BOT_REMOVE_DISMISS);\n+\n+                if (!master->HaveBot())\n+                {\n+                    handler->SendSysMessage(\"Npcbots were successfully removed\");\n+                    handler->SetSentErrorMessage(true);\n+                    return true;\n+                }\n+                handler->SendSysMessage(\"Some npcbots were not removed!\");\n+                handler->SetSentErrorMessage(true);\n+                return false;\n+            }\n+            handler->SendSysMessage(\"Npcbots are not found!\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        Creature* cre = u->ToCreature();\n+        if (cre && cre->IsNPCBot() && !cre->IsFreeBot())\n+        {\n+            master = cre->GetBotOwner();\n+            master->GetBotMgr()->RemoveBot(cre->GetGUID(), BOT_REMOVE_DISMISS);\n+            if (master->GetBotMgr()->GetBot(cre->GetGUID()) == nullptr)\n+            {\n+                handler->SendSysMessage(\"NpcBot successfully removed\");\n+                handler->SetSentErrorMessage(true);\n+                return true;\n+            }\n+            handler->SendSysMessage(\"NpcBot was NOT removed for some stupid reason!\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        handler->SendSysMessage(\"You must select player or controlled npcbot\");\n+        handler->SetSentErrorMessage(true);\n+        return false;\n+    }\n+\n+    static bool HandleNpcBotReviveCommand(ChatHandler* handler)\n+    {\n+        Player* owner = handler->GetSession()->GetPlayer();\n+        Unit* u = owner->GetSelectedUnit();\n+        if (!u)\n+        {\n+            handler->SendSysMessage(\".npcbot revive\");\n+            handler->SendSysMessage(\"Revives selected npcbot. If player is selected, revives all selected player's npcbots\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        if (Player* master = u->ToPlayer())\n+        {\n+            if (!master->HaveBot())\n+            {\n+                handler->PSendSysMessage(\"{} has no npcbots!\", master->GetName());\n+                handler->SetSentErrorMessage(true);\n+                return false;\n+            }\n+\n+            master->GetBotMgr()->ReviveAllBots();\n+            handler->SendSysMessage(\"Npcbots revived\");\n+            return true;\n+        }\n+        else if (Creature* bot = u->ToCreature())\n+        {\n+            if (bot->GetBotAI())\n+            {\n+                if (bot->IsAlive())\n+                {\n+                    handler->PSendSysMessage(\"{} is not dead\", bot->GetName());\n+                    handler->SetSentErrorMessage(true);\n+                    return false;\n+                }\n+\n+                BotMgr::ReviveBot(bot, (bot->GetBotOwner() == owner) ? owner->ToUnit() : bot->ToUnit());\n+                handler->PSendSysMessage(\"{} revived\", bot->GetName());\n+                return true;\n+            }\n+        }\n+\n+        handler->SendSysMessage(\"You must select player or npcbot\");\n+        handler->SetSentErrorMessage(true);\n+        return false;\n+    }\n+\n+    static bool HandleNpcBotAddCommand(ChatHandler* handler)\n+    {\n+        Player* owner = handler->GetSession()->GetPlayer();\n+        Unit* cre = owner->GetSelectedUnit();\n+\n+        if (!cre || !cre->IsCreature())\n+        {\n+            handler->SendSysMessage(\".npcbot add\");\n+            handler->SendSysMessage(\"Allows to hire selected uncontrolled bot\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        Creature* bot = cre->ToCreature();\n+        if (!bot || !bot->IsNPCBot() || bot->GetBotAI()->GetBotOwnerGuid() || bot->GetBotAI()->IsWanderer())\n+        {\n+            handler->SendSysMessage(\"You must select uncontrolled non-wandering npcbot\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        ObjectGuid::LowType guidlow = owner->GetGUID().GetCounter();\n+        BotDataMgr::UpdateNpcBotData(bot->GetEntry(), NPCBOT_UPDATE_OWNER, &guidlow);\n+        NpcBotData::SharedOwnersContainer sharedOwners{};\n+        BotDataMgr::UpdateNpcBotData(bot->GetEntry(), NPCBOT_UPDATE_SHARED_OWNERS, &sharedOwners);\n+\n+        if (owner->GetBotMgr()->AddBot(bot) == BOT_ADD_SUCCESS)\n+        {\n+            handler->PSendSysMessage(\"{} is now your npcbot\", bot->GetName());\n+            return true;\n+        }\n+\n+        handler->SendSysMessage(\"NpcBot is NOT added for some reason!\");\n+        handler->SetSentErrorMessage(true);\n+        return false;\n+    }\n+};\n+\n+void AddSC_script_bot_commands()\n+{\n+    new script_bot_commands();\n+}\n+\n+#ifdef _MSC_VER\n+# pragma warning(pop)\n+#endif\ndiff --git a/src/server/game/AI/NpcBots/botcommon.h b/src/server/game/AI/NpcBots/botcommon.h\nnew file mode 100644\nindex 0000000000..66962f26c2\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/botcommon.h\n@@ -0,0 +1,679 @@\n+#ifndef BOTCOMMON_H\n+#define BOTCOMMON_H\n+\n+#include \"botdefine.h\"\n+#include \"ObjectGuid.h\"\n+#include \"SharedDefines.h\"\n+#include \"SpellAuraDefines.h\"\n+\n+#include <utility>\n+#include <vector>\n+\n+/*\n+NpcBot System by Trickerer (onlysuffering@gmail.com)\n+Original patch from: LordPsyan https://bitbucket.org/lordpsyan/trinitycore-patches/src/3b8b9072280e/Individual/11185-BOTS-NPCBots.patch\n+*/\n+\n+#ifdef AC_COMPILER\n+# define TARGET_ICONS_COUNT TARGETICONCOUNT\n+#endif\n+\n+inline constexpr std::size_t MAX_BOT_LOG_PARAMS = 5;\n+inline constexpr std::size_t MAX_BOT_LOG_PARAM_LENGTH = 50;\n+inline constexpr std::size_t MAX_BOT_ITEM_SET_NAME_LENGTH = 30;\n+inline constexpr uint8 BOT_GOSSIP_MAX_ITEMS = 32; // Client limitation 3.3.5 code confirmed\n+\n+inline constexpr std::size_t BRACKETS_COUNT = DEFAULT_MAX_LEVEL / 10 + 1; //0-9, 10-19, 20-29, 30-39, 40-49, 50-59, 60-69, 70-79, 80-83\n+\n+struct Position;\n+\n+using AoeSpotsVec = std::vector<std::pair<Position, float> >;\n+\n+enum BotCommonValues\n+{\n+//MISC\n+    BOT_GIVER_ENTRY                     = 70000,\n+    BOT_ENTRY_BEGIN                     = 70001,\n+    //BOT_ENTRY_END                       = 71000,\n+    BOT_ENTRY_CREATE_BEGIN              = 70800, // 70800+ reserved for bot creation\n+    //BOT_PET_ENTRY_BEGIN                 = 70501,\n+    //BOT_PET_ENTRY_END                   = 70550,\n+    BOT_ENTRY_MIRROR_IMAGE_BM           = 70552,\n+    //BOT_ENTRY_CONVERSING_WITH_THE_DEPTHS_TRIGGER = 70100,\n+    BOT_MAX_CHASE_RANGE                 = 120,  //yds\n+    //BOT_EVADE_TIME                      = 3000, //ms\n+//COMMON GAMEOBJECTS\n+    GO_REFRESHMENT_TABLE_1              = 186812,//lvl 65 req70\n+    GO_REFRESHMENT_TABLE_2              = 193061,//lvl 80 req80\n+    GO_SOULWELL_1                       = 181621,//lvl 60 req68\n+    GO_SOULWELL_2                       = 193169,//lvl 69 req80\n+    GO_BOT_MONEY_BAG                    = 186736,\n+//COMMON CDs\n+    POTION_CD                           = 60000,//default 60sec potion cd\n+    REGEN_CD                            = 1000, //update hp/mana every X milliseconds\n+//COMMON TIMERS\n+    ITEM_ENCHANTMENT_EXPIRE_TIMER       = 3600000, //1 Hour\n+    REVIVE_TIMER_DEFAULT                = 180000, //3 Minutes\n+    REVIVE_TIMER_MEDIUM                 = 90000, //1.5 Minutes\n+    REVIVE_TIMER_SHORT                  = 60000, //1 Minute\n+    INOUTDOORS_ENSURE_TIMER             = 1500,\n+    BOT_GROUP_UPDATE_TIMER              = 2000,\n+    RENT_TIMER                          = 3600000, //1 Hour\n+    RENT_COLLECT_TIMER                  = 600000, //10 Minutes\n+//VEHICLE CREATURES\n+    CREATURE_NEXUS_SKYTALON_1           = 32535, // [Q] Aces High\n+    CREATURE_EOE_SKYTALON_N             = 30161, // Eye of Eternity\n+    CREATURE_EOE_SKYTALON_H             = 31752,\n+    CREATURE_OCULUS_DRAKE_RUBY          = 27756, // Oculus\n+    CREATURE_OCULUS_DRAKE_EMERALD       = 27692,\n+    CREATURE_OCULUS_DRAKE_AMBER         = 27755,\n+    //CREATURE_TOC_STEED_QUELDOREI        = 33845, // Argent Tournament\n+    //CREATURE_TOC_NIGHTSABER             = 33319,\n+    //CREATURE_TOC_STEED_STORMWIND        = 33217,\n+    //CREATURE_TOC_MECHANOSTRIDER         = 33317,\n+    //CREATURE_TOC_RAM                    = 33316,\n+    //CREATURE_TOC_ELEKK                  = 33318,\n+    //CREATURE_TOC_HAWKSTRIDER_SUNREAVER  = 33844,\n+    //CREATURE_TOC_RAPTOR                 = 33321,\n+    //CREATURE_TOC_WARHORSE               = 33324,\n+    //CREATURE_TOC_WOLF                   = 33320,\n+    //CREATURE_TOC_HAWKSTRIDER_SILVERMOON = 33323,\n+    //CREATURE_TOC_KODO                   = 33322,\n+    CREATURE_TOC5_WARHORSE              = 35644, // Trial of Champion\n+    CREATURE_TOC5_BATTLEWORG            = 36558,\n+    CREATURE_ULDUAR_DEMOLISHER          = 33109, // Ulduar\n+    CREATURE_ULDUAR_SIEGE_ENGINE        = 33060,\n+    CREATURE_ULDUAR_CHOPPER             = 33062,\n+    CREATURE_ULDUAR_CHOPPER1            = 34045,\n+    CREATURE_ICC_BONE_SPIKE1            = 36619, // Icecrown Citadel\n+    CREATURE_ICC_BONE_SPIKE2            = 38712,\n+    CREATURE_ICC_BONE_SPIKE3            = 38711,\n+    CREATURE_ICC_GUNSHIPCANNON_ALLIANCE = 36838,\n+    CREATURE_ICC_GUNSHIPCANNON_HORDE    = 36839,\n+    CREATURE_ICC_MUTATED_ABOMINATION1   = 38285,\n+    CREATURE_ICC_MUTATED_ABOMINATION2   = 38788,\n+    CREATURE_ICC_MUTATED_ABOMINATION3   = 38789,\n+    CREATURE_ICC_MUTATED_ABOMINATION4   = 38790,\n+    CREATURE_ICC_MUTATED_ABOMINATION5   = 37672,\n+    CREATURE_ICC_MUTATED_ABOMINATION6   = 38605,\n+    CREATURE_ICC_MUTATED_ABOMINATION7   = 38786,\n+    CREATURE_ICC_MUTATED_ABOMINATION8   = 38787,\n+    CREATURE_GEARGRINDERS_JUMPBOT       = 31784,\n+//COMMON AOE TRIGGERS\n+    CREATURE_MUTATING_BUG_1             = 15316,\n+    CREATURE_MUTATING_BUG_2             = 15317,\n+    CREATURE_FOCUS_FIRE_N               = 18374,\n+    CREATURE_FOCUS_FIRE_H               = 20308,\n+    CREATURE_MT_PHOENIX                 = 24674,\n+    CREATURE_MT_ARCANE_SPHERE_N         = 24708,\n+    CREATURE_MT_ARCANE_SPHERE_H         = 25543,\n+    CREATURE_ZA_FIRE_BOMB               = 23920,\n+    CREATURE_UK_SHADOW_AXE_N            = 23997,\n+    CREATURE_UK_SHADOW_AXE_H            = 31835,\n+    CREATURE_EOE_STATIC_FIELD           = 30592,\n+    CREATURE_ICC_OOZE_PUDDLE            = 37690,\n+    GAMEOBJECT_HOT_COAL                 = 178164,\n+    GAMEOBJECT_SAND_TRAP                = 180647,\n+    GAMEOBJECT_LIQUID_FIRE_1            = 180125,\n+    GAMEOBJECT_LIQUID_FIRE_2            = 181890,\n+    GAMEOBJECT_LIQUID_FIRE_3            = 182533,\n+    GAMEOBJECT_PROXIMITY_BOMB_N         = 181877,\n+    GAMEOBJECT_PROXIMITY_BOMB_H         = 182607,\n+//COMMON ENEMY CREATURES\n+    CREATURE_BOSS_EREGOS_N              = 27656,\n+    CREATURE_BOSS_EREGOS_H              = 31561,\n+    CREATURE_ICC_SINDRAGOSA1            = 36853,\n+    CREATURE_ICC_SINDRAGOSA2            = 38265,\n+    CREATURE_ICC_SINDRAGOSA3            = 38266,\n+    CREATURE_ICC_SINDRAGOSA4            = 38267,\n+    CREATURE_ICC_ICE_TOMB1              = 36980,\n+    CREATURE_ICC_ICE_TOMB2              = 38320,\n+    CREATURE_ICC_ICE_TOMB3              = 38321,\n+    CREATURE_ICC_ICE_TOMB4              = 38322,\n+    CREATURE_ICC_VALKYR_LK1             = 36609,\n+    CREATURE_ICC_VALKYR_LK2             = 39120,\n+    CREATURE_ICC_VALKYR_LK3             = 39121,\n+    CREATURE_ICC_VALKYR_LK4             = 39122,\n+    CREATURE_ICC_ICE_SPHERE1            = 36633,\n+    CREATURE_ICC_ICE_SPHERE2            = 39305,\n+    CREATURE_ICC_ICE_SPHERE3            = 39306,\n+    CREATURE_ICC_ICE_SPHERE4            = 39307,\n+//COMMON NPCS\n+    SHAMAN_EARTH_ELEMENTAL              = 15352,\n+    SHAMAN_FIRE_ELEMENTAL               = 15438,\n+    //NPC_WORLD_TRIGGER                   = 22515,\n+//COMMON ITEM DISPLAY IDS\n+    CHEST_HALISCAN                      = 50566, //Haliscan Jacket\n+    LEGS_HALISCAN                       = 50567, //Haliscan Pants\n+//COMMON GAMEEVENTS\n+    GAME_EVENT_WINTER_VEIL              = 2,\n+//COMMON FACTIONS\n+    FACTION_TEMPLATE_ALLIANCE_DEFAULT   = 1, // Human warrior\n+    FACTION_TEMPLATE_HORDE_DEFAULT      = 2, // Orc warrior\n+    FACTION_TEMPLATE_NEUTRAL_HOSTILE    = FACTION_CREATURE, // 2150 //Hates players and other bots, not attacked by guards\n+  //SOUNDS\n+    SOUND_FREEZE_IMPACT_WINDWALK        = 29,\n+    SOUND_AXE_2H_IMPACT_FLESH_CRIT      = 158,\n+    SOUND_ABSORB_GET_HIT                = 3334,\n+    SOUND_MISS_WHOOSH_2H                = 7081,\n+\n+//UNUSED\n+\n+    //MAX_LOOT_ITEMS                      = 18 // Client limitation 3.3.5 code confirmed\n+};\n+\n+enum BotMiscValues : uint32\n+{\n+//SAVED\n+    BOTAI_MISC_ENCHANT_IS_AUTO_MH       = 1,\n+    BOTAI_MISC_ENCHANT_IS_AUTO_OH       = 2,\n+    BOTAI_MISC_ENCHANT_TIMER_MH         = 3,\n+    BOTAI_MISC_ENCHANT_TIMER_OH         = 4,\n+    BOTAI_MISC_ENCHANT_CURRENT_MH       = 5,\n+    BOTAI_MISC_ENCHANT_CURRENT_OH       = 6,\n+    BOTAI_MISC_PET_TYPE                 = 7,\n+    BOTAI_MISC_AURA_TYPE                = 8,\n+//INTERNAL\n+    BOTAI_MISC_ENCHANT_AVAILABLE_1,\n+    BOTAI_MISC_ENCHANT_AVAILABLE_2,\n+    BOTAI_MISC_ENCHANT_AVAILABLE_3,\n+    BOTAI_MISC_ENCHANT_AVAILABLE_4,\n+    BOTAI_MISC_ENCHANT_AVAILABLE_5,\n+    BOTAI_MISC_ENCHANT_AVAILABLE_6,\n+    BOTAI_MISC_COMBO_POINTS,\n+    BOTAI_MISC_DAGGER_MAINHAND,\n+    BOTAI_MISC_DAGGER_OFFHAND,\n+    BOTAI_MISC_PET_AVAILABLE_1,\n+    BOTAI_MISC_PET_AVAILABLE_2,\n+    BOTAI_MISC_PET_AVAILABLE_3,\n+    BOTAI_MISC_PET_AVAILABLE_4,\n+    BOTAI_MISC_PET_AVAILABLE_5,\n+    BOTAI_MISC_PET_AVAILABLE_6,\n+    BOTAI_MISC_PET_AVAILABLE_7,\n+    BOTAI_MISC_PET_AVAILABLE_8,\n+    BOTAI_MISC_PET_AVAILABLE_9,\n+    BOTAI_MISC_PET_AVAILABLE_10,\n+    BOTAI_MISC_PET_AVAILABLE_11,\n+    BOTAI_MISC_WEAPON_SPEC,\n+    BOTPETAI_MISC_DURATION,\n+    BOTPETAI_MISC_DURATION_MAX,\n+    BOTPETAI_MISC_MAXLEVEL,\n+    BOTPETAI_MISC_FIXEDLEVEL,\n+    BOTPETAI_MISC_CARRY,\n+    BOTPETAI_MISC_CAPACITY,\n+    BOTPETAI_MISC_MAX_ATTACKERS,\n+\n+    BOT_MISCVALUE_SAVED_FIRST = BOTAI_MISC_ENCHANT_IS_AUTO_MH,\n+    BOT_MISCVALUE_SAVED_LAST = BOTAI_MISC_AURA_TYPE\n+};\n+\n+enum BotClasses : uint8\n+{\n+    BOT_CLASS_NONE                      = CLASS_NONE,\n+    BOT_CLASS_WARRIOR                   = CLASS_WARRIOR,\n+    BOT_CLASS_PALADIN                   = CLASS_PALADIN,\n+    BOT_CLASS_HUNTER                    = CLASS_HUNTER,\n+    BOT_CLASS_ROGUE                     = CLASS_ROGUE,\n+    BOT_CLASS_PRIEST                    = CLASS_PRIEST,\n+    BOT_CLASS_DEATH_KNIGHT              = CLASS_DEATH_KNIGHT,\n+    BOT_CLASS_SHAMAN                    = CLASS_SHAMAN,\n+    BOT_CLASS_MAGE                      = CLASS_MAGE,\n+    BOT_CLASS_WARLOCK                   = CLASS_WARLOCK,\n+    BOT_CLASS_DRUID                     = CLASS_DRUID,\n+\n+    BOT_CLASS_BM,\n+    BOT_CLASS_SPHYNX,\n+    BOT_CLASS_ARCHMAGE,\n+    BOT_CLASS_DREADLORD,\n+    BOT_CLASS_SPELLBREAKER,\n+    BOT_CLASS_DARK_RANGER,\n+    BOT_CLASS_NECROMANCER,\n+    BOT_CLASS_SEA_WITCH,\n+    BOT_CLASS_CRYPT_LORD,\n+\n+    BOT_CLASS_END,\n+\n+    BOT_CLASS_EX_START                  = BOT_CLASS_BM\n+};\n+\n+inline constexpr uint32 ALL_BOT_CLASSES_MASK =\n+    ((1 << BOT_CLASS_WARRIOR)|(1 << BOT_CLASS_PALADIN)|(1 << BOT_CLASS_HUNTER)|(1 << BOT_CLASS_ROGUE)|(1 << BOT_CLASS_PRIEST)|\n+    (1 << BOT_CLASS_DEATH_KNIGHT)|(1 << BOT_CLASS_SHAMAN)|(1 << BOT_CLASS_MAGE)|(1 << BOT_CLASS_WARLOCK)|(1 << BOT_CLASS_DRUID)|\n+    (1 << BOT_CLASS_BM)|(1 << BOT_CLASS_SPHYNX)|(1 << BOT_CLASS_ARCHMAGE)|(1 << BOT_CLASS_DREADLORD)|(1 << BOT_CLASS_SPELLBREAKER)|\n+    (1 << BOT_CLASS_DARK_RANGER)|(1 << BOT_CLASS_NECROMANCER)|(1 << BOT_CLASS_SEA_WITCH)|(1 << BOT_CLASS_CRYPT_LORD));\n+\n+inline constexpr uint32 MELEE_BOT_CLASSES_MASK =\n+    ((1 << BOT_CLASS_WARRIOR)|(1 << BOT_CLASS_PALADIN)|(1 << BOT_CLASS_ROGUE)|(1 << BOT_CLASS_DEATH_KNIGHT)|\n+        (1 << BOT_CLASS_BM)|(1 << BOT_CLASS_DREADLORD)|(1 << BOT_CLASS_SPELLBREAKER)|(1 << BOT_CLASS_CRYPT_LORD));\n+inline constexpr uint32 TANKING_BOT_CLASSES_MASK =\n+    ((1 << BOT_CLASS_WARRIOR)|(1 << BOT_CLASS_PALADIN)|(1 << BOT_CLASS_DEATH_KNIGHT)|(1 << BOT_CLASS_SPHYNX)|(1 << BOT_CLASS_SPELLBREAKER)|(1 << BOT_CLASS_CRYPT_LORD));\n+inline constexpr uint32 BLOCKING_BOT_CLASSES_MASK =\n+    ((1 << BOT_CLASS_WARRIOR)|(1 << BOT_CLASS_PALADIN)|(1 << CLASS_SHAMAN)|(1 << BOT_CLASS_SPELLBREAKER));\n+inline constexpr uint32 CASTING_BOT_CLASSES_MASK =\n+    ((1 << BOT_CLASS_PALADIN)|(1 << BOT_CLASS_PRIEST)|(1 << BOT_CLASS_SHAMAN)|(1 << BOT_CLASS_MAGE)|(1 << BOT_CLASS_WARLOCK)|(1 << BOT_CLASS_DRUID)|(1 << BOT_CLASS_SPHYNX)|\n+        (1 << BOT_CLASS_ARCHMAGE)|(1 << BOT_CLASS_DREADLORD)|(1 << BOT_CLASS_SPELLBREAKER)|(1 << BOT_CLASS_DARK_RANGER)|(1 << BOT_CLASS_NECROMANCER)|(1 << BOT_CLASS_SEA_WITCH));\n+inline constexpr uint32 HEALING_BOT_CLASSES_MASK =\n+    ((1 << BOT_CLASS_PALADIN)|(1 << BOT_CLASS_PRIEST)|(1 << BOT_CLASS_SHAMAN)|(1 << BOT_CLASS_DRUID)|(1 << BOT_CLASS_SPHYNX));\n+inline constexpr uint32 HUMANOID_BOT_CLASSES_MASK = (ALL_BOT_CLASSES_MASK & ~(1 << BOT_CLASS_SPHYNX));\n+inline constexpr uint32 HERO_BOT_CLASSES_MASK =\n+    ((1 << BOT_CLASS_BM)|(1 << BOT_CLASS_ARCHMAGE)|(1 << BOT_CLASS_DREADLORD)|(1 << BOT_CLASS_DARK_RANGER)|(1 << BOT_CLASS_SEA_WITCH)|(1 << BOT_CLASS_CRYPT_LORD));\n+\n+enum BotStances\n+{\n+    BOT_STANCE_NONE                     = 0,\n+    WARRIOR_BATTLE_STANCE               = BOT_CLASS_END,\n+    WARRIOR_DEFENSIVE_STANCE,\n+    WARRIOR_BERSERKER_STANCE,\n+    DEATH_KNIGHT_BLOOD_PRESENCE,\n+    DEATH_KNIGHT_FROST_PRESENCE,\n+    DEATH_KNIGHT_UNHOLY_PRESENCE,\n+    DRUID_BEAR_FORM,\n+    DRUID_CAT_FORM,\n+    DRUID_MOONKIN_FORM,\n+    DRUID_TREE_FORM,\n+    DRUID_TRAVEL_FORM,\n+    DRUID_AQUATIC_FORM,\n+    DRUID_FLIGHT_FORM\n+};\n+\n+enum BotRoles : uint32\n+{\n+    BOT_ROLE_NONE                       = 0x00000,\n+    BOT_ROLE_TANK                       = 0x00001,\n+    BOT_ROLE_TANK_OFF                   = 0x00002,\n+    BOT_ROLE_DPS                        = 0x00004,\n+    BOT_ROLE_HEAL                       = 0x00008,\n+    BOT_ROLE_RANGED                     = 0x00010,\n+\n+    BOT_ROLE_PARTY                      = 0x00020, //hidden\n+\n+    BOT_ROLE_GATHERING_MINING           = 0x00040,\n+    BOT_ROLE_GATHERING_HERBALISM        = 0x00080,\n+    BOT_ROLE_GATHERING_SKINNING         = 0x00100,\n+    BOT_ROLE_GATHERING_ENGINEERING      = 0x00200,\n+\n+    BOT_ROLE_AUTOLOOT                   = 0x00400, //not in mask\n+    BOT_ROLE_AUTOLOOT_POOR              = 0x00800,\n+    BOT_ROLE_AUTOLOOT_COMMON            = 0x01000,\n+    BOT_ROLE_AUTOLOOT_UNCOMMON          = 0x02000,\n+    BOT_ROLE_AUTOLOOT_RARE              = 0x04000,\n+    BOT_ROLE_AUTOLOOT_EPIC              = 0x08000,\n+    BOT_ROLE_AUTOLOOT_LEGENDARY         = 0x10000,\n+\n+    BOT_MAX_ROLE                        = 0x20000,\n+\n+    BOT_ROLE_MASK_MAIN                  = (BOT_ROLE_TANK | BOT_ROLE_TANK_OFF | BOT_ROLE_DPS | BOT_ROLE_HEAL | BOT_ROLE_RANGED),\n+    //BOT_ROLE_MASK_MAIN_EX               = (BOT_ROLE_TANK | BOT_ROLE_DPS | BOT_ROLE_HEAL | BOT_ROLE_RANGED | BOT_ROLE_PARTY),\n+    BOT_ROLE_MASK_GATHERING             = (BOT_ROLE_GATHERING_MINING | BOT_ROLE_GATHERING_HERBALISM | BOT_ROLE_GATHERING_SKINNING | BOT_ROLE_GATHERING_ENGINEERING),\n+    BOT_ROLE_MASK_LOOTING               = (BOT_ROLE_AUTOLOOT_POOR | BOT_ROLE_AUTOLOOT_COMMON | BOT_ROLE_AUTOLOOT_UNCOMMON | BOT_ROLE_AUTOLOOT_RARE | BOT_ROLE_AUTOLOOT_EPIC | BOT_ROLE_AUTOLOOT_LEGENDARY),\n+\n+    //BOT_ROLE_TANK_MELEE                 = (BOT_ROLE_TANK | BOT_ROLE_DPS),\n+    //BOT_ROLE_TANK_RANGED                = (BOT_ROLE_TANK | BOT_ROLE_DPS | BOT_ROLE_RANGED),\n+    //BOT_ROLE_TANK_RANGED_NODPS          = (BOT_ROLE_TANK | BOT_ROLE_RANGED),\n+};\n+\n+enum BotTalentSpecs\n+{\n+    BOT_SPEC_WARRIOR_ARMS               = 1,\n+    BOT_SPEC_WARRIOR_FURY               = 2,\n+    BOT_SPEC_WARRIOR_PROTECTION         = 3,\n+    BOT_SPEC_PALADIN_HOLY               = 4,\n+    BOT_SPEC_PALADIN_PROTECTION         = 5,\n+    BOT_SPEC_PALADIN_RETRIBUTION        = 6,\n+    BOT_SPEC_HUNTER_BEASTMASTERY        = 7,\n+    BOT_SPEC_HUNTER_MARKSMANSHIP        = 8,\n+    BOT_SPEC_HUNTER_SURVIVAL            = 9,\n+    BOT_SPEC_ROGUE_ASSASINATION         = 10,\n+    BOT_SPEC_ROGUE_COMBAT               = 11,\n+    BOT_SPEC_ROGUE_SUBTLETY             = 12,\n+    BOT_SPEC_PRIEST_DISCIPLINE          = 13,\n+    BOT_SPEC_PRIEST_HOLY                = 14,\n+    BOT_SPEC_PRIEST_SHADOW              = 15,\n+    BOT_SPEC_DK_BLOOD                   = 16,\n+    BOT_SPEC_DK_FROST                   = 17,\n+    BOT_SPEC_DK_UNHOLY                  = 18,\n+    BOT_SPEC_SHAMAN_ELEMENTAL           = 19,\n+    BOT_SPEC_SHAMAN_ENHANCEMENT         = 20,\n+    BOT_SPEC_SHAMAN_RESTORATION         = 21,\n+    BOT_SPEC_MAGE_ARCANE                = 22,\n+    BOT_SPEC_MAGE_FIRE                  = 23,\n+    BOT_SPEC_MAGE_FROST                 = 24,\n+    BOT_SPEC_WARLOCK_AFFLICTION         = 25,\n+    BOT_SPEC_WARLOCK_DEMONOLOGY         = 26,\n+    BOT_SPEC_WARLOCK_DESTRUCTION        = 27,\n+    BOT_SPEC_DRUID_BALANCE              = 28,\n+    BOT_SPEC_DRUID_FERAL                = 29,\n+    BOT_SPEC_DRUID_RESTORATION          = 30,\n+    BOT_SPEC_DEFAULT                    = 31,\n+\n+    BOT_SPEC_BEGIN                      = BOT_SPEC_WARRIOR_ARMS,\n+    BOT_SPEC_END                        = BOT_SPEC_DEFAULT\n+\n+};\n+\n+enum BotPetTypes\n+{\n+    //Warlock\n+    BOT_PET_IMP                         = 70501,\n+    BOT_PET_VOIDWALKER                  = 70502,\n+    BOT_PET_SUCCUBUS                    = 70503,\n+    BOT_PET_FELHUNTER                   = 70504,\n+    BOT_PET_FELGUARD                    = 70505,\n+\n+    BOT_PET_WARLOCK_START               = BOT_PET_IMP,\n+    BOT_PET_WARLOCK_END                 = BOT_PET_FELGUARD,\n+\n+    //Hunter\n+    //cunning\n+    BOT_PET_SPIDER                      = 70506,\n+    BOT_PET_SERPENT                     = 70507,\n+    BOT_PET_BIRDOFPREY                  = 70508,\n+    BOT_PET_BAT                         = 70509,\n+    BOT_PET_WINDSERPENT                 = 70510,\n+    BOT_PET_RAVAGER                     = 70511,\n+    BOT_PET_DRAGONHAWK                  = 70512,\n+    BOT_PET_NETHERRAY                   = 70513,\n+    BOT_PET_SPOREBAT                    = 70514,\n+    //ferocity\n+    BOT_PET_CARRIONBIRD                 = 70515,\n+    BOT_PET_RAPTOR                      = 70516,\n+    BOT_PET_WOLF                        = 70517,\n+    BOT_PET_TALLSTRIDER                 = 70518,\n+    BOT_PET_CAT                         = 70519,\n+    BOT_PET_HYENA                       = 70520,\n+    BOT_PET_WASP                        = 70521,\n+    BOT_PET_TEROMOTH                    = 70522,\n+    //tenacity\n+    BOT_PET_SCORPID                     = 70523,\n+    BOT_PET_TURTLE                      = 70524,\n+    BOT_PET_GORILLA                     = 70525,\n+    BOT_PET_BEAR                        = 70526,\n+    BOT_PET_BOAR                        = 70527,\n+    BOT_PET_CRAB                        = 70528,\n+    BOT_PET_CROCOLISK                   = 70529,\n+    BOT_PET_WARPSTALKER                 = 70530,\n+    //cunning (exotic)\n+    BOT_PET_SILITHID                    = 70531,\n+    BOT_PET_CHIMAERA                    = 70532,\n+    //ferocity (exotic)\n+    BOT_PET_SPIRITBEAST                 = 70533,\n+    BOT_PET_COREHOUND                   = 70534,\n+    BOT_PET_DEVILSAUR                   = 70535,\n+    //tenacity (exotic)\n+    BOT_PET_RHINO                       = 70536,\n+    BOT_PET_WORM                        = 70537,\n+\n+    BOT_PET_HUNTER_START                = BOT_PET_SPIDER,\n+    BOT_PET_HUNTER_END_GENERAL          = BOT_PET_WARPSTALKER,\n+    BOT_PET_HUNTER_END_EXOTIC           = BOT_PET_WORM,\n+\n+    BOT_PET_CUNNING_START               = BOT_PET_SPIDER,\n+    BOT_PET_CUNNING_END                 = BOT_PET_SPOREBAT,\n+    BOT_PET_FEROCITY_START              = BOT_PET_CARRIONBIRD,\n+    BOT_PET_FEROCITY_END                = BOT_PET_TEROMOTH,\n+    BOT_PET_TENACITY_START              = BOT_PET_SCORPID,\n+    BOT_PET_TENACITY_END                = BOT_PET_WARPSTALKER,\n+\n+    BOT_PET_EXOTIC_START                = BOT_PET_SILITHID,\n+    BOT_PET_EXOTIC_END                  = BOT_PET_WORM,\n+\n+    //DK\n+    BOT_PET_GHOUL                       = 70538,\n+\n+    BOT_PET_REUSE_1                     = 70539,//REUSE, was BOT_PET_GARGOYLE\n+    BOT_PET_REUSE_2                     = 70540,//REUSE, was BOT_PET_DANCING_RUNE_WEAPON\n+    BOT_PET_REUSE_3                     = 70541,//REUSE, was BOT_PET_AOD_GHOUL\n+\n+    //Priest\n+    BOT_PET_SHADOWFIEND                 = 70542,\n+\n+    //Shaman\n+    BOT_PET_SPIRIT_WOLF                 = 70543,\n+\n+    //Mage\n+    BOT_PET_WATER_ELEMENTAL             = 70544,\n+\n+    //Druid\n+    BOT_PET_FORCE_OF_NATURE             = 70545,\n+\n+    //Archmage\n+    BOT_PET_AWATER_ELEMENTAL            = 70556,\n+\n+    //Dreadlord\n+    BOT_PET_INFERNAL                    = 70562,\n+\n+    //Dark Ranger\n+    BOT_PET_DARK_MINION                 = 70573,\n+    BOT_PET_DARK_MINION_ELITE           = 70574,\n+\n+    //Necromancer\n+    BOT_PET_NECROSKELETON               = 70580,\n+\n+    //Sea Witch\n+    BOT_PET_TORNADO                     = 70586,\n+\n+    //Crypt Lord\n+    BOT_PET_CARRION_BEETLE1             = 70592,\n+    BOT_PET_CARRION_BEETLE2             = 70593,\n+    BOT_PET_CARRION_BEETLE3             = 70594,\n+    BOT_PET_LOCUST_SWARM                = 70595,\n+\n+    BOT_PET_INVALID                     = 99999\n+};\n+\n+enum BotPetOriginalEntries\n+{\n+    ORIGINAL_ENTRY_IMP                  = 416,\n+    ORIGINAL_ENTRY_VOIDWALKER           = 1860,\n+    ORIGINAL_ENTRY_SUCCUBUS             = 1863,\n+    ORIGINAL_ENTRY_FELHUNTER            = 417,\n+    ORIGINAL_ENTRY_FELGUARD             = 17252,\n+    //ORIGINAL_ENTRY_GHOUL                = 26125,\n+    //ORIGINAL_ENTRY_SHADOWFIEND          = 19668,\n+    //ORIGINAL_ENTRY_SPIRIT_WOLF          = 29264,\n+    ORIGINAL_ENTRY_WATER_ELEMENTAL      = 510,\n+    //ORIGINAL_ENTRY_FORCE_OF_NATURE      = 1964,\n+    ORIGINAL_ENTRY_HUNTER_PET           = 1 // from Pet.cpp InitStatsForLevel()\n+};\n+\n+enum BotEquipSlot : uint8\n+{\n+    BOT_SLOT_MAINHAND           = 0,\n+    BOT_SLOT_OFFHAND            = 1,\n+    BOT_SLOT_RANGED             = 2,\n+    BOT_SLOT_HEAD               = 3,\n+    BOT_SLOT_SHOULDERS          = 4,\n+    BOT_SLOT_CHEST              = 5,\n+    BOT_SLOT_WAIST              = 6,\n+    BOT_SLOT_LEGS               = 7,\n+    BOT_SLOT_FEET               = 8,\n+    BOT_SLOT_WRIST              = 9,\n+    BOT_SLOT_HANDS              = 10,\n+    BOT_SLOT_BACK               = 11,\n+    BOT_SLOT_BODY               = 12,\n+    BOT_SLOT_FINGER1            = 13,\n+    BOT_SLOT_FINGER2            = 14,\n+    BOT_SLOT_TRINKET1           = 15,\n+    BOT_SLOT_TRINKET2           = 16,\n+    BOT_SLOT_NECK               = 17,\n+    BOT_INVENTORY_SIZE,\n+\n+    BOT_FIRST_NON_MELEE_SLOT   = BOT_SLOT_RANGED,\n+    BOT_FIRST_NON_WEAPON_SLOT   = BOT_SLOT_RANGED + 1,\n+};\n+\n+inline constexpr uint32 BOT_SLOT_MASK_FINGER1_OR_TRINKET1 = (1<<BOT_SLOT_FINGER1)|(1<<BOT_SLOT_TRINKET1);\n+\n+inline constexpr uint8 BOT_TRANSMOG_INVENTORY_SIZE = 13; // BOT_SLOT_BODY + 1\n+inline constexpr uint8 MAX_BOT_EQUIPMENT_SETS = BOT_GOSSIP_MAX_ITEMS - 2;\n+\n+enum class BotEquipResult : uint8\n+{\n+    BOT_EQUIP_RESULT_OK                         = 0,\n+\n+    BOT_EQUIP_RESULT_FAIL_NO_BAG_SPACE          = 1, //unused\n+    BOT_EQUIP_RESULT_FAIL_NO_BANK_SPACE         = 2,\n+    BOT_EQUIP_RESULT_FAIL_NO_RECEIVER           = 3,\n+    BOT_EQUIP_RESULT_FAIL_INVALID_RECEIVER      = 4,\n+    BOT_EQUIP_RESULT_FAIL_NO_ITEM               = 5,\n+    BOT_EQUIP_RESULT_FAIL_SAME_ID               = 6,\n+    BOT_EQUIP_RESULT_FAIL_WANDERER              = 7,\n+    BOT_EQUIP_RESULT_FAIL_LINKED_UNEQUIP_FAILED = 8,\n+    BOT_EQUIP_RESULT_FAIL_LINKED_RESET_FAILED   = 9,\n+    BOT_EQUIP_RESULT_FAIL_CANT_EQUIP            = 10,\n+    BOT_EQUIP_RESULT_FAIL_ITEM_CONFLICT         = 11,\n+};\n+\n+enum BotStatMods: uint8\n+{\n+    //ItemProtoType.h\n+    BOT_STAT_MOD_MANA                       = 0,\n+    BOT_STAT_MOD_HEALTH                     = 1,\n+    BOT_STAT_MOD_AGILITY                    = 3,\n+    BOT_STAT_MOD_STRENGTH                   = 4,\n+    BOT_STAT_MOD_INTELLECT                  = 5,\n+    BOT_STAT_MOD_SPIRIT                     = 6,\n+    BOT_STAT_MOD_STAMINA                    = 7,\n+    BOT_STAT_MOD_DEFENSE_SKILL_RATING       = 12,\n+    BOT_STAT_MOD_DODGE_RATING               = 13,\n+    BOT_STAT_MOD_PARRY_RATING               = 14,\n+    BOT_STAT_MOD_BLOCK_RATING               = 15,\n+    BOT_STAT_MOD_HIT_MELEE_RATING           = 16,\n+    BOT_STAT_MOD_HIT_RANGED_RATING          = 17,\n+    BOT_STAT_MOD_HIT_SPELL_RATING           = 18,\n+    BOT_STAT_MOD_CRIT_MELEE_RATING          = 19,\n+    BOT_STAT_MOD_CRIT_RANGED_RATING         = 20,\n+    BOT_STAT_MOD_CRIT_SPELL_RATING          = 21,\n+    BOT_STAT_MOD_HIT_TAKEN_MELEE_RATING     = 22,\n+    BOT_STAT_MOD_HIT_TAKEN_RANGED_RATING    = 23,\n+    BOT_STAT_MOD_HIT_TAKEN_SPELL_RATING     = 24,\n+    BOT_STAT_MOD_CRIT_TAKEN_MELEE_RATING    = 25,\n+    BOT_STAT_MOD_CRIT_TAKEN_RANGED_RATING   = 26,\n+    BOT_STAT_MOD_CRIT_TAKEN_SPELL_RATING    = 27,\n+    BOT_STAT_MOD_HASTE_MELEE_RATING         = 28,\n+    BOT_STAT_MOD_HASTE_RANGED_RATING        = 29,\n+    BOT_STAT_MOD_HASTE_SPELL_RATING         = 30,\n+    BOT_STAT_MOD_HIT_RATING                 = 31,\n+    BOT_STAT_MOD_CRIT_RATING                = 32,\n+    BOT_STAT_MOD_HIT_TAKEN_RATING           = 33,\n+    BOT_STAT_MOD_CRIT_TAKEN_RATING          = 34,\n+    BOT_STAT_MOD_RESILIENCE_RATING          = 35,\n+    BOT_STAT_MOD_HASTE_RATING               = 36,\n+    BOT_STAT_MOD_EXPERTISE_RATING           = 37,\n+    BOT_STAT_MOD_ATTACK_POWER               = 38,\n+    BOT_STAT_MOD_RANGED_ATTACK_POWER        = 39,\n+    BOT_STAT_MOD_FERAL_ATTACK_POWER         = 40,\n+    BOT_STAT_MOD_SPELL_HEALING_DONE         = 41,                 // deprecated\n+    BOT_STAT_MOD_SPELL_DAMAGE_DONE          = 42,                 // deprecated\n+    BOT_STAT_MOD_MANA_REGENERATION          = 43,\n+    BOT_STAT_MOD_ARMOR_PENETRATION_RATING   = 44,\n+    BOT_STAT_MOD_SPELL_POWER                = 45,\n+    BOT_STAT_MOD_HEALTH_REGEN               = 46,\n+    BOT_STAT_MOD_SPELL_PENETRATION          = 47,\n+    BOT_STAT_MOD_BLOCK_VALUE                = 48,\n+    //END ItemProtoType.h\n+\n+    BOT_STAT_MOD_DAMAGE_MIN                 = BOT_STAT_MOD_BLOCK_VALUE + 1,\n+    BOT_STAT_MOD_DAMAGE_MAX,\n+    BOT_STAT_MOD_ARMOR,\n+    BOT_STAT_MOD_RESIST_HOLY,\n+    BOT_STAT_MOD_RESIST_FIRE,\n+    BOT_STAT_MOD_RESIST_NATURE,\n+    BOT_STAT_MOD_RESIST_FROST,\n+    BOT_STAT_MOD_RESIST_SHADOW,\n+    BOT_STAT_MOD_RESIST_ARCANE,\n+    BOT_STAT_MOD_EX,\n+    MAX_BOT_ITEM_MOD,\n+\n+    BOT_STAT_MOD_RESISTANCE_START           = BOT_STAT_MOD_ARMOR\n+};\n+\n+enum BotAIResetType\n+{\n+    BOTAI_RESET_INIT                    = 0x01,\n+    BOTAI_RESET_DISMISS                 = 0x02,\n+    BOTAI_RESET_UNBIND                  = 0x04,\n+    BOTAI_RESET_LOGOUT                  = 0x08,\n+    BOTAI_RESET_FORCERECALL             = 0x10,\n+\n+    BOTAI_RESET_MASK_ABANDON_MASTER     = (BOTAI_RESET_INIT | BOTAI_RESET_DISMISS),\n+    BOTAI_RESET_MASK_RESET_MASTER       = (BOTAI_RESET_INIT | BOTAI_RESET_DISMISS | BOTAI_RESET_UNBIND | BOTAI_RESET_LOGOUT)\n+};\n+\n+enum BotMovementType\n+{\n+    BOT_MOVE_POINT                      = 1,\n+    BOT_MOVE_CHASE,\n+    BOT_MOVE_JUMP\n+};\n+\n+enum BotCommandStates : uint32\n+{\n+    BOT_COMMAND_STAY                    = 0x00000001,\n+    BOT_COMMAND_FOLLOW                  = 0x00000002,\n+    BOT_COMMAND_ATTACK                  = 0x00000004,\n+    BOT_COMMAND_COMBATRESET             = 0x00000008,\n+    BOT_COMMAND_FULLSTOP                = 0x00000010,\n+    BOT_COMMAND_ISSUED_ORDER            = 0x00000020,\n+    BOT_COMMAND_WALK                    = 0x00000040,\n+    BOT_COMMAND_NOGOSSIP                = 0x00000080,\n+    BOT_COMMAND_UNBIND                  = 0x00000100,\n+    BOT_COMMAND_NO_CAST                 = 0x00000200,\n+    BOT_COMMAND_NO_CAST_LONG            = 0x00000400,\n+    BOT_COMMAND_INACTION                = 0x00000800,\n+\n+    BOT_COMMAND_MASK_UNCHASE            = BOT_COMMAND_STAY | BOT_COMMAND_FOLLOW | BOT_COMMAND_FULLSTOP | BOT_COMMAND_INACTION,\n+    BOT_COMMAND_MASK_UNMOVING           = BOT_COMMAND_STAY | BOT_COMMAND_FULLSTOP | BOT_COMMAND_ISSUED_ORDER,\n+    BOT_COMMAND_MASK_NOCAST_ANY         = BOT_COMMAND_NO_CAST | BOT_COMMAND_NO_CAST_LONG\n+};\n+\n+enum BotAwaitStates\n+{\n+    BOT_AWAIT_NONE                      = 0x00,\n+    BOT_AWAIT_SEND                      = 0x01\n+};\n+\n+inline constexpr std::size_t MAX_SEND_POINTS = 5u;\n+\n+//Only non-persistent types are allowed\n+enum BotOrderTypes\n+{\n+    BOT_ORDER_NONE          = 0,\n+    BOT_ORDER_SPELLCAST     = 1,\n+    BOT_ORDER_PULL          = 2,\n+\n+    BOT_ORDER_END\n+};\n+inline constexpr bool DEBUG_BOT_ORDERS = false;\n+inline constexpr std::size_t MAX_BOT_ORDERS_QUEUE_SIZE = 3u;\n+\n+enum BotVehicleStrats\n+{\n+    BOT_VEH_STRAT_NONE,\n+    BOT_VEH_STRAT_WYRMREST_SKYTALON,\n+    BOT_VEH_STRAT_RUBY_DRAKE,\n+    BOT_VEH_STRAT_EMERALD_DRAKE,\n+    BOT_VEH_STRAT_AMBER_DRAKE,\n+    BOT_VEH_STRAT_TOC5_MOUNT,\n+    BOT_VEH_STRAT_ULDUAR_DEMOLISHER,\n+    BOT_VEH_STRAT_ULDUAR_SIEGEENGINE,\n+    BOT_VEH_STRAT_ULDUAR_CHOPPER,\n+\n+    BOT_VEH_STRAT_GENERIC\n+};\n+\n+inline constexpr uint32 USABLE_CORPSE_CREATURE_TYPE_MASK = (1u << (CREATURE_TYPE_BEAST-1)) | (1u << (CREATURE_TYPE_DRAGONKIN-1)) | (1u << (CREATURE_TYPE_HUMANOID-1));\n+\n+inline constexpr uint8 GroupIconsFlags[] =\n+{\n+    /*STAR        = */0x001,\n+    /*CIRCLE      = */0x002,\n+    /*DIAMOND     = */0x004,\n+    /*TRIANGLE    = */0x008,\n+    /*MOON        = */0x010,\n+    /*SQUARE      = */0x020,\n+    /*CROSS       = */0x040,\n+    /*SKULL       = */0x080\n+};\n+\n+#endif\ndiff --git a/src/server/game/AI/NpcBots/botconfig.cpp b/src/server/game/AI/NpcBots/botconfig.cpp\nnew file mode 100644\nindex 0000000000..aec9176401\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/botconfig.cpp\n@@ -0,0 +1,1355 @@\n+#include \"botcommon.h\"\n+#include \"botconfig.h\"\n+#include \"botdatamgr.h\"\n+#include \"botlog.h\"\n+#include \"Config.h\"\n+#include \"DBCStores.h\"\n+#include \"Group.h\"\n+#include \"Log.h\"\n+#include \"MapMgr.h\"\n+#include \"ScriptMgr.h\"\n+#include \"Tokenize.h\"\n+#include \"World.h\"\n+\n+/*\n+Npc Bot Config by Trickerer (onlysuffering@gmail.com)\n+*/\n+\n+#ifdef _MSC_VER\n+# pragma warning(push, 4)\n+#endif\n+\n+#ifdef AC_COMPILER\n+# define GetBoolDefault GetOption<bool>\n+# define GetIntDefault GetOption<int32>\n+# define GetFloatDefault GetOption<float>\n+# define GetStringDefault GetOption<std::string>\n+#endif\n+\n+static uint8 _basefollowdist;\n+static uint8 _maxClassNpcBots;\n+static uint8 _maxAccountNpcBots;\n+static uint8 _maxSharedOwners;\n+static uint8 _xpReductionExtraAmount;\n+static uint8 _xpReductionExtraStartingNumber;\n+static uint8 _mountLevel60;\n+static uint8 _mountLevel100;\n+static uint8 _healTargetIconFlags;\n+static uint8 _tankingTargetIconFlags;\n+static uint8 _offTankingTargetIconFlags;\n+static uint8 _dpsTargetIconFlags;\n+static uint8 _rangedDpsTargetIconFlags;\n+static uint8 _noDpsTargetIconFlags;\n+static uint8 _npcBotOwnerExpireMode;\n+static int32 _botInfoPacketsLimit;\n+static uint32 _gearBankCapacity;\n+static uint32 _gearBankEquipmentSetsCount;\n+static uint32 _npcBotsCostHire;\n+static uint32 _npcBotsCostRent;\n+static uint32 _npcBotUpdateDelayBase;\n+static uint32 _npcBotEngageDelayDPS_default;\n+static uint32 _npcBotEngageDelayHeal_default;\n+static uint32 _npcBotOwnerExpireTime;\n+static uint32 _desiredWanderingBotsCount;\n+static uint32 _killrewardWandererMoneyBase;\n+static uint32 _killrewardWandererItemCount;\n+static uint32 _killrewardWandererItemQuality;\n+static uint32 _targetBGPlayersPerTeamCount_AV;\n+static uint32 _targetBGPlayersPerTeamCount_WS;\n+static uint32 _targetBGPlayersPerTeamCount_AB;\n+static uint32 _targetBGPlayersPerTeamCount_EY;\n+static uint32 _targetBGPlayersPerTeamCount_SA;\n+static uint32 _targetBGPlayersPerTeamCount_IC;\n+static uint32 _shared_ownership_options;\n+static bool _enableNpcBots;\n+static bool _logToDB;\n+static bool _xpReductionEnable;\n+static bool _xpReductionGroupOnly;\n+static bool _honorReductionEnable;\n+static bool _honorReductionGroupOnly;\n+static bool _moneyLootShareEnable;\n+static bool _moneyLootShareGroupOnly;\n+static bool _enableNpcBotsDungeons;\n+static bool _enableNpcBotsRaids;\n+static bool _enableNpcBotsBGs;\n+static bool _enableNpcBotsArenas;\n+static bool _enableDungeonFinder;\n+static bool _enableNpcBotsPremade;\n+static bool _limitNpcBotsDungeons;\n+static bool _limitNpcBotsRaids;\n+static bool _hideSpawns;\n+/*static*/bool _botPvP;\n+static bool _botMovementFoodInterrupt;\n+static bool _filterRaces;\n+static bool _displayEquipment;\n+static bool _showCloak;\n+static bool _showHelm;\n+static bool _sendEquipListItems;\n+static bool _enableBotGearBank;\n+static bool _transmog_enable;\n+static bool _transmog_mixArmorClasses;\n+static bool _transmog_mixWeaponClasses;\n+static bool _transmog_mixWeaponInvTypes;\n+static bool _transmog_useEquipmentSlots;\n+static bool _enableclass_warrior;\n+static bool _enableclass_paladin;\n+static bool _enableclass_hunter;\n+static bool _enableclass_rogue;\n+static bool _enableclass_priest;\n+static bool _enableclass_deathknight;\n+static bool _enableclass_shaman;\n+static bool _enableclass_mage;\n+static bool _enableclass_warlock;\n+static bool _enableclass_druid;\n+static bool _enableclass_blademaster;\n+static bool _enableclass_sphynx;\n+static bool _enableclass_archmage;\n+static bool _enableclass_dreadlord;\n+static bool _enableclass_spellbreaker;\n+static bool _enableclass_darkranger;\n+static bool _enableclass_necromancer;\n+static bool _enableclass_seawitch;\n+static bool _enableclass_cryptlord;\n+static bool _enableclass_wander_warrior;\n+static bool _enableclass_wander_paladin;\n+static bool _enableclass_wander_hunter;\n+static bool _enableclass_wander_rogue;\n+static bool _enableclass_wander_priest;\n+static bool _enableclass_wander_deathknight;\n+static bool _enableclass_wander_shaman;\n+static bool _enableclass_wander_mage;\n+static bool _enableclass_wander_warlock;\n+static bool _enableclass_wander_druid;\n+static bool _enableclass_wander_blademaster;\n+static bool _enableclass_wander_sphynx;\n+static bool _enableclass_wander_archmage;\n+static bool _enableclass_wander_dreadlord;\n+static bool _enableclass_wander_spellbreaker;\n+static bool _enableclass_wander_darkranger;\n+static bool _enableclass_wander_necromancer;\n+static bool _enableclass_wander_seawitch;\n+static bool _enableclass_wander_cryptlord;\n+static bool _enrageOnDismiss;\n+static bool _botStatLimits;\n+static bool _enableWanderingBotsBG;\n+static bool _enableConfigLevelCapBG;\n+static bool _enableConfigLevelCapBGFirst;\n+static bool _bothk_enable;\n+static bool _bothk_message_enable;\n+static bool _bothk_achievements_enable;\n+static bool _untarget_wnpc_questgiver;\n+static bool _untarget_wnpc_flightmaster;\n+static float _botStatLimits_dodge;\n+static float _botStatLimits_parry;\n+static float _botStatLimits_block;\n+static float _botStatLimits_crit;\n+static float _mult_dmg_physical;\n+static float _mult_dmg_spell;\n+static float _mult_healing;\n+static float _mult_hp;\n+static float _mult_dmg_wanderer;\n+static float _mult_healing_wanderer;\n+static float _mult_hp_wanderer;\n+static float _mult_speed_wanderer;\n+static float _mult_xpgain_wanderer;\n+static float _mult_dmg_warrior;\n+static float _mult_dmg_paladin;\n+static float _mult_dmg_hunter;\n+static float _mult_dmg_rogue;\n+static float _mult_dmg_priest;\n+static float _mult_dmg_deathknight;\n+static float _mult_dmg_shaman;\n+static float _mult_dmg_mage;\n+static float _mult_dmg_warlock;\n+static float _mult_dmg_druid;\n+static float _mult_dmg_blademaster;\n+static float _mult_dmg_obsidiandestroyer;\n+static float _mult_dmg_archmage;\n+static float _mult_dmg_dreadlord;\n+static float _mult_dmg_spellbreaker;\n+static float _mult_dmg_darkranger;\n+static float _mult_dmg_necromancer;\n+static float _mult_dmg_seawitch;\n+static float _mult_dmg_cryptlord;\n+static float _bothk_rate_honor;\n+static std::vector<float> _mult_dmg_levels;\n+static std::vector<float> _mult_heal_levels;\n+static std::vector<float> _mult_hp_levels;\n+static std::vector<float> _mult_mp_levels;\n+static LvlBrackets _max_npcbots;\n+static PctBrackets _botwanderer_pct_level_brackets;\n+static ItemLvlBrackets _botwanderer_itemlvl_level_brackets;\n+static std::vector<uint32> _disabled_instance_maps;\n+static std::vector<uint32> _enabled_wander_node_maps;\n+\n+void AddSC_botconfig_scripts();\n+void AddSC_death_knight_bot();\n+void AddSC_druid_bot();\n+void AddSC_hunter_bot();\n+void AddSC_mage_bot();\n+void AddSC_paladin_bot();\n+void AddSC_priest_bot();\n+void AddSC_rogue_bot();\n+void AddSC_shaman_bot();\n+void AddSC_warlock_bot();\n+void AddSC_warrior_bot();\n+void AddSC_blademaster_bot();\n+void AddSC_sphynx_bot();\n+void AddSC_archmage_bot();\n+void AddSC_dreadlord_bot();\n+void AddSC_spellbreaker_bot();\n+void AddSC_dark_ranger_bot();\n+void AddSC_necromancer_bot();\n+void AddSC_sea_witch_bot();\n+void AddSC_crypt_lord_bot();\n+void AddSC_archmage_bot_pets();\n+void AddSC_dreadlord_bot_pets();\n+void AddSC_dark_ranger_bot_pets();\n+void AddSC_necromancer_bot_pets();\n+void AddSC_sea_witch_bot_pets();\n+void AddSC_crypt_lord_bot_pets();\n+void AddSC_hunter_bot_pets();\n+void AddSC_warlock_bot_pets();\n+void AddSC_deathknight_bot_pets();\n+void AddSC_priest_bot_pets();\n+void AddSC_shaman_bot_pets();\n+void AddSC_mage_bot_pets();\n+void AddSC_druid_bot_pets();\n+void AddSC_script_bot_commands();\n+void AddSC_script_bot_giver();\n+void AddSC_botdatamgr_scripts();\n+\n+void AddNpcBotScripts()\n+{\n+    AddSC_botconfig_scripts();\n+    AddSC_death_knight_bot();\n+    AddSC_druid_bot();\n+    AddSC_hunter_bot();\n+    AddSC_mage_bot();\n+    AddSC_paladin_bot();\n+    AddSC_priest_bot();\n+    AddSC_rogue_bot();\n+    AddSC_shaman_bot();\n+    AddSC_warlock_bot();\n+    AddSC_warrior_bot();\n+    AddSC_blademaster_bot();\n+    AddSC_sphynx_bot();\n+    AddSC_archmage_bot();\n+    AddSC_dreadlord_bot();\n+    AddSC_spellbreaker_bot();\n+    AddSC_dark_ranger_bot();\n+    AddSC_necromancer_bot();\n+    AddSC_sea_witch_bot();\n+    AddSC_crypt_lord_bot();\n+    AddSC_archmage_bot_pets();\n+    AddSC_dreadlord_bot_pets();\n+    AddSC_dark_ranger_bot_pets();\n+    AddSC_necromancer_bot_pets();\n+    AddSC_sea_witch_bot_pets();\n+    AddSC_crypt_lord_bot_pets();\n+    AddSC_hunter_bot_pets();\n+    AddSC_warlock_bot_pets();\n+    AddSC_deathknight_bot_pets();\n+    AddSC_priest_bot_pets();\n+    AddSC_shaman_bot_pets();\n+    AddSC_mage_bot_pets();\n+    AddSC_druid_bot_pets();\n+    AddSC_script_bot_commands();\n+    AddSC_script_bot_giver();\n+    AddSC_botdatamgr_scripts();\n+}\n+\n+class NPCBotsConfigScript : public WorldScript\n+{\n+public:\n+    NPCBotsConfigScript() : WorldScript(\"NPCBotsConfigScript\") { }\n+\n+    void OnAfterConfigLoad(bool reload) override\n+    {\n+        if (!_first_load)\n+            _initNpcbotsConfig(reload);\n+    }\n+\n+    static void ReloadConfig()\n+    {\n+        if (_first_load)\n+        {\n+            _initNpcbotsConfig(false);\n+            _first_load = false;\n+            return;\n+        }\n+\n+        BOT_LOG_INFO(\"misc\", \"Re-Loading config settings...\");\n+        sWorld->LoadConfigSettings(true);\n+        sMapMgr->InitializeVisibilityDistanceInfo();\n+        BOT_LOG_INFO(\"misc\", \"World config settings reloaded.\");\n+    }\n+\n+private:\n+    inline static bool _first_load{ true };\n+\n+    static void _initNpcbotsConfig(bool reload)\n+    {\n+        _loadConfig(reload);\n+\n+        BOT_LOG_INFO(\"server.loading\", \">> NPCBots config {}.\", reload ? \"re-loaded\" : \"loaded\");\n+\n+        if (_enableNpcBots)\n+            BOT_LOG_INFO(\"server.loading\", \">> NPCBots system enabled\");\n+    }\n+\n+    static void _loadConfig(bool reload)\n+    {\n+        _enableNpcBots                  = sConfigMgr->GetBoolDefault(\"NpcBot.Enable\", true);\n+        _logToDB                        = sConfigMgr->GetBoolDefault(\"NpcBot.LogToDB\", true);\n+        _maxClassNpcBots                = sConfigMgr->GetIntDefault(\"NpcBot.MaxBotsPerClass\", 1);\n+        _maxAccountNpcBots              = sConfigMgr->GetIntDefault(\"NpcBot.MaxBotsPerAccount\", 0);\n+        _filterRaces                    = sConfigMgr->GetBoolDefault(\"NpcBot.Botgiver.FilterRaces\", false);\n+        _shared_ownership_options       = sConfigMgr->GetIntDefault(\"NpcBot.SharedOwnership.Options\", 0);\n+        _maxSharedOwners                = sConfigMgr->GetIntDefault(\"NpcBot.SharedOwnership.MaxOwners\", 0);\n+        _basefollowdist                 = sConfigMgr->GetIntDefault(\"NpcBot.BaseFollowDistance\", 30);\n+        _xpReductionEnable              = sConfigMgr->GetBoolDefault(\"NpcBot.XpReduction.Enable\", false);\n+        _xpReductionGroupOnly           = sConfigMgr->GetBoolDefault(\"NpcBot.XpReduction.GroupOnly\", false);\n+        _xpReductionExtraAmount         = sConfigMgr->GetIntDefault(\"NpcBot.XpReduction.Extra.Amount\", 0);\n+        _xpReductionExtraStartingNumber = sConfigMgr->GetIntDefault(\"NpcBot.XpReduction.Extra.StartingNumber\", 2);\n+        _honorReductionEnable           = sConfigMgr->GetBoolDefault(\"NpcBot.HonorReduction.Enable\", false);\n+        _honorReductionGroupOnly        = sConfigMgr->GetBoolDefault(\"NpcBot.HonorReduction.GroupOnly\", false);\n+        _moneyLootShareEnable           = sConfigMgr->GetBoolDefault(\"NpcBot.MoneyShare.Enable\", false);\n+        _moneyLootShareGroupOnly        = sConfigMgr->GetBoolDefault(\"NpcBot.MoneyShare.GroupOnly\", false);\n+        _mountLevel60                   = sConfigMgr->GetIntDefault(\"NpcBot.MountLevel.60\", 20);\n+        _mountLevel100                  = sConfigMgr->GetIntDefault(\"NpcBot.MountLevel.100\", 40);\n+        _healTargetIconFlags            = sConfigMgr->GetIntDefault(\"NpcBot.HealTargetIconMask\", 0);\n+        _tankingTargetIconFlags         = sConfigMgr->GetIntDefault(\"NpcBot.TankTargetIconMask\", 0);\n+        _offTankingTargetIconFlags      = sConfigMgr->GetIntDefault(\"NpcBot.OffTankTargetIconMask\", 0);\n+        _dpsTargetIconFlags             = sConfigMgr->GetIntDefault(\"NpcBot.DPSTargetIconMask\", 0);\n+        _rangedDpsTargetIconFlags       = sConfigMgr->GetIntDefault(\"NpcBot.RangedDPSTargetIconMask\", 0);\n+        _noDpsTargetIconFlags           = sConfigMgr->GetIntDefault(\"NpcBot.NoDPSTargetIconMask\", 0);\n+        _mult_dmg_physical              = sConfigMgr->GetFloatDefault(\"NpcBot.Mult.Damage.Physical\", 1.0f);\n+        _mult_dmg_spell                 = sConfigMgr->GetFloatDefault(\"NpcBot.Mult.Damage.Spell\", 1.0f);\n+        _mult_healing                   = sConfigMgr->GetFloatDefault(\"NpcBot.Mult.Healing\", 1.0f);\n+        _mult_hp                        = sConfigMgr->GetFloatDefault(\"NpcBot.Mult.HP\", 1.0f);\n+        _mult_dmg_wanderer              = sConfigMgr->GetFloatDefault(\"NpcBot.Mult.Wanderer.Damage\", 1.0f);\n+        _mult_healing_wanderer          = sConfigMgr->GetFloatDefault(\"NpcBot.Mult.Wanderer.Healing\", 1.0f);\n+        _mult_hp_wanderer               = sConfigMgr->GetFloatDefault(\"NpcBot.Mult.Wanderer.HP\", 1.0f);\n+        _mult_speed_wanderer            = sConfigMgr->GetFloatDefault(\"NpcBot.Mult.Wanderer.Speed\", 1.0f);\n+        _mult_dmg_warrior               = sConfigMgr->GetFloatDefault(\"NpcBot.Mult.Damage.Warrior\", 1.0f);\n+        _mult_dmg_paladin               = sConfigMgr->GetFloatDefault(\"NpcBot.Mult.Damage.Paladin\", 1.0f);\n+        _mult_dmg_hunter                = sConfigMgr->GetFloatDefault(\"NpcBot.Mult.Damage.Hunter\", 1.0f);\n+        _mult_dmg_rogue                 = sConfigMgr->GetFloatDefault(\"NpcBot.Mult.Damage.Rogue\", 1.0f);\n+        _mult_dmg_priest                = sConfigMgr->GetFloatDefault(\"NpcBot.Mult.Damage.Priest\", 1.0f);\n+        _mult_dmg_deathknight           = sConfigMgr->GetFloatDefault(\"NpcBot.Mult.Damage.DeathKnight\", 1.0f);\n+        _mult_dmg_shaman                = sConfigMgr->GetFloatDefault(\"NpcBot.Mult.Damage.Shaman\", 1.0f);\n+        _mult_dmg_mage                  = sConfigMgr->GetFloatDefault(\"NpcBot.Mult.Damage.Mage\", 1.0f);\n+        _mult_dmg_warlock               = sConfigMgr->GetFloatDefault(\"NpcBot.Mult.Damage.Warlock\", 1.0f);\n+        _mult_dmg_druid                 = sConfigMgr->GetFloatDefault(\"NpcBot.Mult.Damage.Druid\", 1.0f);\n+        _mult_dmg_blademaster           = sConfigMgr->GetFloatDefault(\"NpcBot.Mult.Damage.Blademaster\", 1.0f);\n+        _mult_dmg_obsidiandestroyer     = sConfigMgr->GetFloatDefault(\"NpcBot.Mult.Damage.ObsidianDestroyer\", 1.0f);\n+        _mult_dmg_archmage              = sConfigMgr->GetFloatDefault(\"NpcBot.Mult.Damage.Archmage\", 1.0f);\n+        _mult_dmg_dreadlord             = sConfigMgr->GetFloatDefault(\"NpcBot.Mult.Damage.Dreadlord\", 1.0f);\n+        _mult_dmg_spellbreaker          = sConfigMgr->GetFloatDefault(\"NpcBot.Mult.Damage.SpellBreaker\", 1.0f);\n+        _mult_dmg_darkranger            = sConfigMgr->GetFloatDefault(\"NpcBot.Mult.Damage.DarkRanger\", 1.0f);\n+        _mult_dmg_necromancer           = sConfigMgr->GetFloatDefault(\"NpcBot.Mult.Damage.Necromancer\", 1.0f);\n+        _mult_dmg_seawitch              = sConfigMgr->GetFloatDefault(\"NpcBot.Mult.Damage.SeaWitch\", 1.0f);\n+        _mult_dmg_cryptlord             = sConfigMgr->GetFloatDefault(\"NpcBot.Mult.Damage.CryptLord\", 1.0f);\n+        _enableNpcBotsDungeons          = sConfigMgr->GetBoolDefault(\"NpcBot.Enable.Dungeon\", true);\n+        _enableNpcBotsRaids             = sConfigMgr->GetBoolDefault(\"NpcBot.Enable.Raid\", false);\n+        _enableNpcBotsBGs               = sConfigMgr->GetBoolDefault(\"NpcBot.Enable.BG\", false);\n+        _enableNpcBotsArenas            = sConfigMgr->GetBoolDefault(\"NpcBot.Enable.Arena\", false);\n+        _enableDungeonFinder            = sConfigMgr->GetBoolDefault(\"NpcBot.Enable.DungeonFinder\", true);\n+        _enableNpcBotsPremade           = sConfigMgr->GetBoolDefault(\"NpcBot.Premade.Enable\", false);\n+        _limitNpcBotsDungeons           = sConfigMgr->GetBoolDefault(\"NpcBot.Limit.Dungeon\", true);\n+        _limitNpcBotsRaids              = sConfigMgr->GetBoolDefault(\"NpcBot.Limit.Raid\", true);\n+        _hideSpawns                     = sConfigMgr->GetBoolDefault(\"NpcBot.HideSpawns\", false);\n+        _botInfoPacketsLimit            = sConfigMgr->GetIntDefault(\"NpcBot.InfoPacketsLimit\", -1);\n+        _npcBotsCostHire                = sConfigMgr->GetIntDefault(\"NpcBot.Cost.Hire\", 1000000);\n+        _npcBotsCostRent                = sConfigMgr->GetIntDefault(\"NpcBot.Cost.Rent\", 0);\n+        _npcBotUpdateDelayBase          = sConfigMgr->GetIntDefault(\"NpcBot.UpdateDelay.Base\", 0);\n+        _npcBotEngageDelayDPS_default   = sConfigMgr->GetIntDefault(\"NpcBot.EngageDelay.DPS\", 0);\n+        _npcBotEngageDelayHeal_default  = sConfigMgr->GetIntDefault(\"NpcBot.EngageDelay.Heal\", 0);\n+        _npcBotOwnerExpireTime          = sConfigMgr->GetIntDefault(\"NpcBot.OwnershipExpireTime\", 0);\n+        _npcBotOwnerExpireMode          = sConfigMgr->GetIntDefault(\"NpcBot.OwnershipExpireMode\", 0);\n+        _botPvP                         = sConfigMgr->GetBoolDefault(\"NpcBot.PvP\", true);\n+        _botMovementFoodInterrupt       = sConfigMgr->GetBoolDefault(\"NpcBot.Movements.InterruptFood\", false);\n+        _displayEquipment               = sConfigMgr->GetBoolDefault(\"NpcBot.EquipmentDisplay.Enable\", true);\n+        _showCloak                      = sConfigMgr->GetBoolDefault(\"NpcBot.EquipmentDisplay.ShowCloak\", true);\n+        _showHelm                       = sConfigMgr->GetBoolDefault(\"NpcBot.EquipmentDisplay.ShowHelm\", false);\n+        _sendEquipListItems             = sConfigMgr->GetBoolDefault(\"NpcBot.Gossip.ShowEquipmentListItems\", false);\n+        _enableBotGearBank              = sConfigMgr->GetBoolDefault(\"NpcBot.GearBank.Enable\", true);\n+        _gearBankCapacity               = sConfigMgr->GetIntDefault(\"NpcBot.GearBank.Capacity\", 40);\n+        _gearBankEquipmentSetsCount     = sConfigMgr->GetIntDefault(\"NpcBot.GearBank.EquipmentSets\", 0);\n+        _transmog_enable                = sConfigMgr->GetBoolDefault(\"NpcBot.Transmog.Enable\", false);\n+        _transmog_mixArmorClasses       = sConfigMgr->GetBoolDefault(\"NpcBot.Transmog.MixArmorClasses\", false);\n+        _transmog_mixWeaponClasses      = sConfigMgr->GetBoolDefault(\"NpcBot.Transmog.MixWeaponClasses\", false);\n+        _transmog_mixWeaponInvTypes     = sConfigMgr->GetBoolDefault(\"NpcBot.Transmog.MixWeaponInventoryTypes\", false);\n+        _transmog_useEquipmentSlots     = sConfigMgr->GetBoolDefault(\"NpcBot.Transmog.UseEquipmentSlots\", false);\n+        _enableclass_warrior            = sConfigMgr->GetBoolDefault(\"NpcBot.Classes.Warrior.Enable\", true);\n+        _enableclass_paladin            = sConfigMgr->GetBoolDefault(\"NpcBot.Classes.Paladin.Enable\", true);\n+        _enableclass_hunter             = sConfigMgr->GetBoolDefault(\"NpcBot.Classes.Hunter.Enable\", true);\n+        _enableclass_rogue              = sConfigMgr->GetBoolDefault(\"NpcBot.Classes.Rogue.Enable\", true);\n+        _enableclass_priest             = sConfigMgr->GetBoolDefault(\"NpcBot.Classes.Priest.Enable\", true);\n+        _enableclass_deathknight        = sConfigMgr->GetBoolDefault(\"NpcBot.Classes.DeathKnight.Enable\", true);\n+        _enableclass_shaman             = sConfigMgr->GetBoolDefault(\"NpcBot.Classes.Shaman.Enable\", true);\n+        _enableclass_mage               = sConfigMgr->GetBoolDefault(\"NpcBot.Classes.Mage.Enable\", true);\n+        _enableclass_warlock            = sConfigMgr->GetBoolDefault(\"NpcBot.Classes.Warlock.Enable\", true);\n+        _enableclass_druid              = sConfigMgr->GetBoolDefault(\"NpcBot.Classes.Druid.Enable\", true);\n+        _enableclass_blademaster        = sConfigMgr->GetBoolDefault(\"NpcBot.Classes.Blademaster.Enable\", false);\n+        _enableclass_sphynx             = sConfigMgr->GetBoolDefault(\"NpcBot.Classes.ObsidianDestroyer.Enable\", true);\n+        _enableclass_archmage           = sConfigMgr->GetBoolDefault(\"NpcBot.Classes.Archmage.Enable\", true);\n+        _enableclass_dreadlord          = sConfigMgr->GetBoolDefault(\"NpcBot.Classes.Dreadlord.Enable\", true);\n+        _enableclass_spellbreaker       = sConfigMgr->GetBoolDefault(\"NpcBot.Classes.SpellBreaker.Enable\", true);\n+        _enableclass_darkranger         = sConfigMgr->GetBoolDefault(\"NpcBot.Classes.DarkRanger.Enable\", true);\n+        _enableclass_necromancer        = sConfigMgr->GetBoolDefault(\"NpcBot.Classes.Necromancer.Enable\", true);\n+        _enableclass_seawitch           = sConfigMgr->GetBoolDefault(\"NpcBot.Classes.SeaWitch.Enable\", true);\n+        _enableclass_cryptlord          = sConfigMgr->GetBoolDefault(\"NpcBot.Classes.CryptLord.Enable\", true);\n+        _enableclass_wander_warrior     = sConfigMgr->GetBoolDefault(\"NpcBot.WanderingBots.Classes.Warrior.Enable\", true);\n+        _enableclass_wander_paladin     = sConfigMgr->GetBoolDefault(\"NpcBot.WanderingBots.Classes.Paladin.Enable\", true);\n+        _enableclass_wander_hunter      = sConfigMgr->GetBoolDefault(\"NpcBot.WanderingBots.Classes.Hunter.Enable\", true);\n+        _enableclass_wander_rogue       = sConfigMgr->GetBoolDefault(\"NpcBot.WanderingBots.Classes.Rogue.Enable\", true);\n+        _enableclass_wander_priest      = sConfigMgr->GetBoolDefault(\"NpcBot.WanderingBots.Classes.Priest.Enable\", true);\n+        _enableclass_wander_deathknight = sConfigMgr->GetBoolDefault(\"NpcBot.WanderingBots.Classes.DeathKnight.Enable\", true);\n+        _enableclass_wander_shaman      = sConfigMgr->GetBoolDefault(\"NpcBot.WanderingBots.Classes.Shaman.Enable\", true);\n+        _enableclass_wander_mage        = sConfigMgr->GetBoolDefault(\"NpcBot.WanderingBots.Classes.Mage.Enable\", true);\n+        _enableclass_wander_warlock     = sConfigMgr->GetBoolDefault(\"NpcBot.WanderingBots.Classes.Warlock.Enable\", true);\n+        _enableclass_wander_druid       = sConfigMgr->GetBoolDefault(\"NpcBot.WanderingBots.Classes.Druid.Enable\", true);\n+        _enableclass_wander_blademaster = sConfigMgr->GetBoolDefault(\"NpcBot.WanderingBots.Classes.Blademaster.Enable\", false);\n+        _enableclass_wander_sphynx      = sConfigMgr->GetBoolDefault(\"NpcBot.WanderingBots.Classes.ObsidianDestroyer.Enable\", true);\n+        _enableclass_wander_archmage    = sConfigMgr->GetBoolDefault(\"NpcBot.WanderingBots.Classes.Archmage.Enable\", true);\n+        _enableclass_wander_dreadlord   = sConfigMgr->GetBoolDefault(\"NpcBot.WanderingBots.Classes.Dreadlord.Enable\", true);\n+        _enableclass_wander_spellbreaker= sConfigMgr->GetBoolDefault(\"NpcBot.WanderingBots.Classes.SpellBreaker.Enable\", true);\n+        _enableclass_wander_darkranger  = sConfigMgr->GetBoolDefault(\"NpcBot.WanderingBots.Classes.DarkRanger.Enable\", true);\n+        _enableclass_wander_necromancer = sConfigMgr->GetBoolDefault(\"NpcBot.WanderingBots.Classes.Necromancer.Enable\", true);\n+        _enableclass_wander_seawitch    = sConfigMgr->GetBoolDefault(\"NpcBot.WanderingBots.Classes.SeaWitch.Enable\", true);\n+        _enableclass_wander_cryptlord   = sConfigMgr->GetBoolDefault(\"NpcBot.WanderingBots.Classes.CryptLord.Enable\", true);\n+        _untarget_wnpc_questgiver       = sConfigMgr->GetBoolDefault(\"NpcBot.WanderingBots.SkipTarget.Questgiver\", false);\n+        _untarget_wnpc_flightmaster     = sConfigMgr->GetBoolDefault(\"NpcBot.WanderingBots.SkipTarget.Flightmaster\", false);\n+        _enrageOnDismiss                = sConfigMgr->GetBoolDefault(\"NpcBot.EnrageOnDismiss\", true);\n+        _botStatLimits                  = sConfigMgr->GetBoolDefault(\"NpcBot.Stats.Limits.Enable\", false);\n+        _botStatLimits_dodge            = sConfigMgr->GetFloatDefault(\"NpcBot.Stats.Limits.Dodge\", 95.0f);\n+        _botStatLimits_parry            = sConfigMgr->GetFloatDefault(\"NpcBot.Stats.Limits.Parry\", 95.0f);\n+        _botStatLimits_block            = sConfigMgr->GetFloatDefault(\"NpcBot.Stats.Limits.Block\", 95.0f);\n+        _botStatLimits_crit             = sConfigMgr->GetFloatDefault(\"NpcBot.Stats.Limits.Crit\", 95.0f);\n+        _desiredWanderingBotsCount      = sConfigMgr->GetIntDefault(\"NpcBot.WanderingBots.Continents.Count\", 0);\n+        _killrewardWandererMoneyBase    = sConfigMgr->GetIntDefault(\"NpcBot.WanderingBots.KillReward.Money\", 0);\n+        _killrewardWandererItemCount    = sConfigMgr->GetIntDefault(\"NpcBot.WanderingBots.KillReward.ItemCount\", 0);\n+        _killrewardWandererItemQuality  = sConfigMgr->GetIntDefault(\"NpcBot.WanderingBots.KillReward.ItemQuality\", int(ITEM_QUALITY_RARE));\n+        _mult_xpgain_wanderer           = sConfigMgr->GetFloatDefault(\"NpcBot.WanderingBots.Continents.XPGain\", 1.0f);\n+        _enableWanderingBotsBG          = sConfigMgr->GetBoolDefault(\"NpcBot.WanderingBots.BG.Enable\", false);\n+        _enableConfigLevelCapBG         = sConfigMgr->GetBoolDefault(\"NpcBot.WanderingBots.BG.CapLevel\", false);\n+        _enableConfigLevelCapBGFirst    = sConfigMgr->GetBoolDefault(\"NpcBot.WanderingBots.BG.CapLevelByFirstPlayer\", false);\n+        _targetBGPlayersPerTeamCount_AV = sConfigMgr->GetIntDefault(\"NpcBot.WanderingBots.BG.TargetTeamPlayersCount.AV\", 30);\n+        _targetBGPlayersPerTeamCount_WS = sConfigMgr->GetIntDefault(\"NpcBot.WanderingBots.BG.TargetTeamPlayersCount.WS\", 8);\n+        _targetBGPlayersPerTeamCount_AB = sConfigMgr->GetIntDefault(\"NpcBot.WanderingBots.BG.TargetTeamPlayersCount.AB\", 12);\n+        _targetBGPlayersPerTeamCount_EY = sConfigMgr->GetIntDefault(\"NpcBot.WanderingBots.BG.TargetTeamPlayersCount.EY\", 12);\n+        _targetBGPlayersPerTeamCount_SA = sConfigMgr->GetIntDefault(\"NpcBot.WanderingBots.BG.TargetTeamPlayersCount.SA\", 0);\n+        _targetBGPlayersPerTeamCount_IC = sConfigMgr->GetIntDefault(\"NpcBot.WanderingBots.BG.TargetTeamPlayersCount.IC\", 0);\n+        _bothk_enable                   = sConfigMgr->GetBoolDefault(\"NpcBot.HK.Enable\", true);\n+        _bothk_message_enable           = sConfigMgr->GetBoolDefault(\"NpcBot.HK.Message.Enable\", false);\n+        _bothk_achievements_enable      = sConfigMgr->GetBoolDefault(\"NpcBot.HK.Achievements.Enable\", false);\n+        _bothk_rate_honor               = sConfigMgr->GetFloatDefault(\"NpcBot.HK.Rate.Honor\", 1.0);\n+\n+        if (reload)\n+            BotLogger::Log(NPCBOT_LOG_CONFIG_RELOAD, uint32(0));\n+\n+        _max_npcbots = {};\n+        std::string max_npcbots_by_levels = sConfigMgr->GetStringDefault(\"NpcBot.MaxBots\", \"1,1,1,1,1,1,1,1,1\");\n+        std::vector<std::string_view> toks0 = Bcore::Tokenize(max_npcbots_by_levels, ',', false);\n+        ASSERT(toks0.size() == BRACKETS_COUNT, \"NpcBot.MaxBots must have exactly %u values\", uint32(BRACKETS_COUNT));\n+        for (std::size_t i{}; i != toks0.size(); ++i)\n+        {\n+            Optional<uint8> val = Bcore::StringTo<uint8>(toks0[i]);\n+            if (val == std::nullopt)\n+                BOT_LOG_ERROR(\"server.loading\", \"NpcBot.MaxBots contains invalid uint8 value '{}', set to default\", toks0[i]);\n+            uint8 uval = val.value_or(uint8(0));\n+            if (i > 0)\n+            {\n+                uint8 prev = _max_npcbots[i - 1];\n+                if (prev > uval)\n+                {\n+                    BOT_LOG_WARN(\"server.loading\", \"NpcBot.MaxBots value at offset {} is {} which is lower than previous value {}!\", uint32(i), uint32(uval), uint32(prev));\n+                    //uval = prev;\n+                }\n+                if (uval >= MAXRAIDSIZE)\n+                {\n+                    BOT_LOG_ERROR(\"server.loading\", \"NpcBot.MaxBots value at offset {} is {} > 39, enforcing max value!\", uint32(i), uint32(uval));\n+                    uval = uint8(MAXRAIDSIZE - 1);\n+                }\n+            }\n+            _max_npcbots[i] = uval;\n+        }\n+\n+        _mult_dmg_levels.clear();\n+        std::string mult_dps_by_levels = sConfigMgr->GetStringDefault(\"NpcBot.Mult.Damage.Levels\", \"1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0\");\n+        std::vector<std::string_view> toks1 = Bcore::Tokenize(mult_dps_by_levels, ',', false);\n+        ASSERT(toks1.size() >= BRACKETS_COUNT, \"NpcBot.Mult.Damage.Levels must have at least %u values\", uint32(BRACKETS_COUNT));\n+        for (std::size_t i{}; i != toks1.size(); ++i)\n+        {\n+            Optional<float> val = Bcore::StringTo<float>(toks1[i]);\n+            if (val == std::nullopt)\n+                BOT_LOG_ERROR(\"server.loading\", \"NpcBot.Mult.Damage.Levels contains invalid float value '{}', set to default\", toks1[i]);\n+            float fval = val.value_or(1.0f);\n+            RoundToInterval(fval, 0.1f, 10.f);\n+            _mult_dmg_levels.push_back(fval);\n+        }\n+\n+        _mult_heal_levels.clear();\n+        std::string mult_healing_by_levels = sConfigMgr->GetStringDefault(\"NpcBot.Mult.Healing.Levels\", \"1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0\");\n+        std::vector<std::string_view> toks5 = Bcore::Tokenize(mult_healing_by_levels, ',', false);\n+        ASSERT(toks5.size() >= BRACKETS_COUNT, \"NpcBot.Mult.Healing.Levels must have at least %u values\", uint32(BRACKETS_COUNT));\n+        for (std::size_t i{}; i != toks5.size(); ++i)\n+        {\n+            Optional<float> val = Bcore::StringTo<float>(toks5[i]);\n+            if (val == std::nullopt)\n+                BOT_LOG_ERROR(\"server.loading\", \"NpcBot.Mult.Healing.Levels contains invalid float value '{}', set to default\", toks5[i]);\n+            float fval = val.value_or(1.0f);\n+            RoundToInterval(fval, 0.1f, 10.f);\n+            _mult_heal_levels.push_back(fval);\n+        }\n+\n+        _mult_hp_levels.clear();\n+        std::string mult_hp_by_levels = sConfigMgr->GetStringDefault(\"NpcBot.Mult.HP.Levels\", \"1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0\");\n+        std::vector<std::string_view> toks6 = Bcore::Tokenize(mult_hp_by_levels, ',', false);\n+        ASSERT(toks6.size() >= BRACKETS_COUNT, \"NpcBot.Mult.HP.Levels must have at least %u values\", uint32(BRACKETS_COUNT));\n+        for (std::size_t i{}; i != toks6.size(); ++i)\n+        {\n+            Optional<float> val = Bcore::StringTo<float>(toks6[i]);\n+            if (val == std::nullopt)\n+                BOT_LOG_ERROR(\"server.loading\", \"NpcBot.Mult.HP.Levels contains invalid float value '{}', set to default\", toks6[i]);\n+            float fval = val.value_or(1.0f);\n+            RoundToInterval(fval, 0.1f, 10.f);\n+            _mult_hp_levels.push_back(fval);\n+        }\n+\n+        _mult_mp_levels.clear();\n+        std::string mult_mp_by_levels = sConfigMgr->GetStringDefault(\"NpcBot.Mult.MP.Levels\", \"1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0\");\n+        std::vector<std::string_view> toks7 = Bcore::Tokenize(mult_mp_by_levels, ',', false);\n+        ASSERT(toks7.size() >= BRACKETS_COUNT, \"NpcBot.Mult.MP.Levels must have at least %u values\", uint32(BRACKETS_COUNT));\n+        for (std::size_t i{}; i != toks7.size(); ++i)\n+        {\n+            Optional<float> val = Bcore::StringTo<float>(toks7[i]);\n+            if (val == std::nullopt)\n+                BOT_LOG_ERROR(\"server.loading\", \"NpcBot.Mult.MP.Levels contains invalid float value '{}', set to default\", toks7[i]);\n+            float fval = val.value_or(1.0f);\n+            RoundToInterval(fval, 0.1f, 10.f);\n+            _mult_mp_levels.push_back(fval);\n+        }\n+\n+        _botwanderer_pct_level_brackets = {};\n+        std::string wanderers_by_levels = sConfigMgr->GetStringDefault(\"NpcBot.WanderingBots.Continents.Levels\", \"20,15,15,10,10,15,15,0,0\");\n+        std::vector<std::string_view> toks2 = Bcore::Tokenize(wanderers_by_levels, ',', false);\n+        ASSERT(toks2.size() == BRACKETS_COUNT, \"NpcBot.WanderingBots.Continents.Levels must have exactly %u values\", uint32(BRACKETS_COUNT));\n+        uint32 total_pct = 0;\n+        for (std::size_t i{}; i != toks2.size(); ++i)\n+        {\n+            Optional<uint32> val = Bcore::StringTo<uint32>(toks2[i]);\n+            if (val == std::nullopt)\n+                BOT_LOG_ERROR(\"server.loading\", \"NpcBot.WanderingBots.Continents.Levels contains invalid uint32 value '{}', set to default\", toks2[i]);\n+            uint32 uval = val.value_or(uint32(0));\n+            total_pct += uval;\n+            _botwanderer_pct_level_brackets[i] = uval;\n+        }\n+        ASSERT(total_pct == 100u, \"NpcBot.WanderingBots.Continents.Levels sum of values must be exactly 100!\");\n+\n+        _enabled_wander_node_maps.clear();\n+        std::string enabled_wander_node_maps = sConfigMgr->GetStringDefault(\"NpcBot.WanderingBots.Continents.Maps\", \"0,1,530,571\");\n+        std::vector<std::string_view> toks3 = Bcore::Tokenize(enabled_wander_node_maps, ',', false);\n+        for (std::size_t i{}; i != toks3.size(); ++i)\n+        {\n+            Optional<uint32> val = Bcore::StringTo<uint32>(toks3[i]);\n+            if (val == std::nullopt)\n+            {\n+                BOT_LOG_ERROR(\"server.loading\", \"NpcBot.WanderingBots.Continents.Maps contains invalid uint32 value '{}', skipped\", toks3[i]);\n+                continue;\n+            }\n+            uint32 uval = val.value_or(uint32(0));\n+            MapEntry const* mapEntry = sMapStore.LookupEntry(uval);\n+            if (!mapEntry || !mapEntry->IsContinent())\n+            {\n+                BOT_LOG_ERROR(\"server.loading\", \"NpcBot.WanderingBots.Continents.Maps contains invalid continent map id '{}', skipped\", uval);\n+                continue;\n+            }\n+            _enabled_wander_node_maps.push_back(uval);\n+        }\n+        if (_enabled_wander_node_maps.empty())\n+        {\n+            BOT_LOG_ERROR(\"server.loading\", \"NpcBot.WanderingBots.Continents.Maps does not provide any valid maps! Wandering bots will not be spawned!\");\n+            _desiredWanderingBotsCount = 0;\n+        }\n+\n+        _disabled_instance_maps.clear();\n+        std::string disabled_instance_maps = sConfigMgr->GetStringDefault(\"NpcBot.DisableInstances\", \"\");\n+        std::vector<std::string_view> toks4 = Bcore::Tokenize(disabled_instance_maps, ',', false);\n+        for (std::size_t i{}; i != toks4.size(); ++i)\n+        {\n+            Optional<uint32> val = Bcore::StringTo<uint32>(toks4[i]);\n+            if (val == std::nullopt)\n+            {\n+                BOT_LOG_ERROR(\"server.loading\", \"NpcBot.DisableInstances contains invalid uint32 value '{}', skipped\", toks4[i]);\n+                continue;\n+            }\n+            uint32 uval = val.value_or(uint32(0));\n+            MapEntry const* mapEntry = sMapStore.LookupEntry(uval);\n+            if (!mapEntry || !mapEntry->IsDungeon())\n+            {\n+                BOT_LOG_ERROR(\"server.loading\", \"NpcBot.DisableInstances contains invalid instance map id '{}', skipped\", uval);\n+                continue;\n+            }\n+            _disabled_instance_maps.push_back(uval);\n+        }\n+\n+        _botwanderer_itemlvl_level_brackets = {};\n+        std::string itemlevel_by_levels = sConfigMgr->GetStringDefault(\"NpcBot.WanderingBots.MaxItemLevel.Levels\", \"0,0,0,0,0,0,0,0,0\");\n+        std::vector<std::string_view> tok8 = Bcore::Tokenize(itemlevel_by_levels, ',', false);\n+        ASSERT(tok8.size() == BRACKETS_COUNT, \"NpcBot.WanderingBots.MaxItemLevel.Levels must have exactly %u values\", uint32(BRACKETS_COUNT));\n+        for (std::size_t i{}; i != tok8.size(); ++i)\n+        {\n+            Optional<uint32> val = Bcore::StringTo<uint32>(tok8[i]);\n+            if (val == std::nullopt)\n+                BOT_LOG_ERROR(\"server.loading\", \"NpcBot.WanderingBots.MaxItemLevel.Levels contains invalid uint32 value '{}', set to default\", tok8[i]);\n+            uint32 uval = val.value_or(uint32(0));\n+            _botwanderer_itemlvl_level_brackets[i] = uval;\n+        }\n+\n+        //limits\n+        _mountLevel100 = std::max<uint8>(_mountLevel100, _mountLevel60);\n+        RoundToInterval(_mult_dmg_physical, 0.1f, 10.f);\n+        RoundToInterval(_mult_dmg_spell, 0.1f, 10.f);\n+        RoundToInterval(_mult_healing, 0.1f, 10.f);\n+        RoundToInterval(_mult_hp, 0.1f, 10.f);\n+        RoundToInterval(_mult_dmg_wanderer, 0.1f, 10.f);\n+        RoundToInterval(_mult_healing_wanderer, 0.1f, 10.f);\n+        RoundToInterval(_mult_hp_wanderer, 0.1f, 10.f);\n+        RoundToInterval(_mult_speed_wanderer, 0.1f, 10.f);\n+        RoundToInterval(_mult_xpgain_wanderer, 0.0f, 100.f);\n+        RoundToInterval(_mult_dmg_warrior, 0.1f, 10.f);\n+        RoundToInterval(_mult_dmg_paladin, 0.1f, 10.f);\n+        RoundToInterval(_mult_dmg_hunter, 0.1f, 10.f);\n+        RoundToInterval(_mult_dmg_rogue, 0.1f, 10.f);\n+        RoundToInterval(_mult_dmg_priest, 0.1f, 10.f);\n+        RoundToInterval(_mult_dmg_deathknight, 0.1f, 10.f);\n+        RoundToInterval(_mult_dmg_shaman, 0.1f, 10.f);\n+        RoundToInterval(_mult_dmg_mage, 0.1f, 10.f);\n+        RoundToInterval(_mult_dmg_warlock, 0.1f, 10.f);\n+        RoundToInterval(_mult_dmg_druid, 0.1f, 10.f);\n+        RoundToInterval(_mult_dmg_blademaster, 0.1f, 10.f);\n+        RoundToInterval(_mult_dmg_obsidiandestroyer, 0.1f, 10.f);\n+        RoundToInterval(_mult_dmg_archmage, 0.1f, 10.f);\n+        RoundToInterval(_mult_dmg_dreadlord, 0.1f, 10.f);\n+        RoundToInterval(_mult_dmg_spellbreaker, 0.1f, 10.f);\n+        RoundToInterval(_mult_dmg_darkranger, 0.1f, 10.f);\n+        RoundToInterval(_mult_dmg_necromancer, 0.1f, 10.f);\n+        RoundToInterval(_mult_dmg_seawitch, 0.1f, 10.f);\n+        RoundToInterval(_mult_dmg_cryptlord, 0.1f, 10.f);\n+        RoundToInterval(_bothk_rate_honor, 0.1f, 10.f);\n+        RoundToInterval(_killrewardWandererItemCount, uint32(0), uint32(MAX_NR_LOOT_ITEMS));\n+        RoundToInterval(_killrewardWandererItemQuality, uint32(ITEM_QUALITY_POOR), uint32(ITEM_QUALITY_HEIRLOOM));\n+        RoundToInterval(_maxSharedOwners, uint8(0), uint8(MAXRAIDSIZE - 1));\n+\n+        if ((_shared_ownership_options | SHARED_OWNER_OPTION_MASK_ALL) != SHARED_OWNER_OPTION_MASK_ALL)\n+        {\n+            BOT_LOG_ERROR(\"server.loading\", \"NpcBot.SharedOwnershipOptions contains unknown values outside of full mask {}! Disabled.\", SHARED_OWNER_OPTION_MASK_ALL);\n+            _shared_ownership_options = 0;\n+        }\n+\n+        _resolveConfigConflicts();\n+    }\n+\n+    static void _resolveConfigConflicts()\n+    {\n+        if (_gearBankEquipmentSetsCount > MAX_BOT_EQUIPMENT_SETS)\n+        {\n+            BOT_LOG_ERROR(\"server.loading\", \"NpcBot.GearBank.EquipmentSets can't be greater than {}, reduced (was {})!\", uint32(MAX_BOT_EQUIPMENT_SETS), _gearBankEquipmentSetsCount);\n+            _gearBankEquipmentSetsCount = MAX_BOT_EQUIPMENT_SETS;\n+        }\n+\n+        uint8 dpsFlags = /*_tankingTargetIconFlags | _offTankingTargetIconFlags | */_dpsTargetIconFlags | _rangedDpsTargetIconFlags;\n+        if (uint8 interFlags = (_noDpsTargetIconFlags & dpsFlags))\n+        {\n+            _noDpsTargetIconFlags &= ~interFlags;\n+            BOT_LOG_ERROR(\"server.loading\", \"NpcBot.NoDPSTargetIconMask intersects with dps targets flags {:#X}! Removed, new mask: {:#X}\",\n+                uint32(interFlags), uint32(_noDpsTargetIconFlags));\n+        }\n+\n+        if (!_enabled_wander_node_maps.empty())\n+        {\n+            uint8 minbotlevel = DEFAULT_MAX_LEVEL;\n+            uint8 maxbotlevel = 0;\n+            for (uint32 mapid : _enabled_wander_node_maps)\n+            {\n+                minbotlevel = std::min<uint8>(minbotlevel, BotDataMgr::GetMinLevelForMapId(mapid));\n+                maxbotlevel = std::max<uint8>(maxbotlevel, BotDataMgr::GetMaxLevelForMapId(mapid));\n+            }\n+            for (int8 j = minbotlevel / 10 - 1; j >= 0; --j)\n+            {\n+                if (_botwanderer_pct_level_brackets[j] > 0)\n+                {\n+                    uint32 pct = _botwanderer_pct_level_brackets[j];\n+                    _botwanderer_pct_level_brackets[minbotlevel / 10] += pct;\n+                    _botwanderer_pct_level_brackets[j] = 0;\n+                    BOT_LOG_WARN(\"server.loading\", \"NpcBot.WanderingBots.Continents.Levels conflicts with NpcBot.WanderingBots.Continents.Maps: no map for levels {}-{}! Transferring extra {}% to levels {}-{}\",\n+                        uint32(j ? j * 10 : 1), uint32(j * 10 + 9), pct, std::max<uint32>(minbotlevel / 10 * 10, 1), uint32(minbotlevel / 10 * 10 + 9));\n+                }\n+            }\n+            for (std::size_t i = std::size_t(maxbotlevel) / 10 + 1; i < _botwanderer_pct_level_brackets.size(); ++i)\n+            {\n+                if (_botwanderer_pct_level_brackets[i] > 0)\n+                {\n+                    uint32 pct = _botwanderer_pct_level_brackets[i];\n+                    _botwanderer_pct_level_brackets[maxbotlevel / 10] += pct;\n+                    _botwanderer_pct_level_brackets[i] = 0;\n+                    BOT_LOG_WARN(\"server.loading\", \"NpcBot.WanderingBots.Continents.Levels conflicts with NpcBot.WanderingBots.Continents.Maps: no map for levels {}-{}! Transferring extra {}% to levels {}-{}\",\n+                        uint32(i ? i * 10 : 1), uint32(i * 10 + 9), pct, std::max<uint32>(maxbotlevel, 1), uint32(maxbotlevel + 9));\n+                }\n+            }\n+        }\n+    }\n+};\n+\n+void BotCfg::ReloadConfig()\n+{\n+    NPCBotsConfigScript::ReloadConfig();\n+}\n+\n+bool BotCfg::IsNpcBotModEnabled()\n+{\n+    return _enableNpcBots;\n+}\n+\n+bool BotCfg::IsNpcBotLogEnabled()\n+{\n+    return _logToDB;\n+}\n+\n+bool BotCfg::IsNpcBotDungeonFinderEnabled()\n+{\n+    return _enableDungeonFinder;\n+}\n+\n+bool BotCfg::LimitNpcBotsInDungeons()\n+{\n+    return _limitNpcBotsDungeons;\n+}\n+bool BotCfg::LimitNpcBotsInRaids()\n+{\n+    return _limitNpcBotsRaids;\n+}\n+\n+bool BotCfg::IsNpcBotsPremadeEnabled()\n+{\n+    return _enableNpcBotsPremade;\n+}\n+\n+uint32 BotCfg::GetNpcBotCostRent(uint8 level, uint8 botclass)\n+{\n+    return _normalizedCostForLevel(_npcBotsCostRent, botclass, level);\n+}\n+\n+uint32 BotCfg::GetNpcBotCostHire(uint8 level, uint8 botclass)\n+{\n+    return _normalizedCostForLevel(_npcBotsCostHire, botclass, level);\n+}\n+\n+std::string BotCfg::GetNpcBotCostStr(uint8 level, uint8 botclass)\n+{\n+    std::ostringstream money;\n+\n+    if (uint32 cost = GetNpcBotCostHire(level, botclass))\n+    {\n+        uint32 gold = uint32(cost / GOLD);\n+        cost -= (gold * GOLD);\n+        uint32 silver = uint32(cost / SILVER);\n+        cost -= (silver * SILVER);\n+\n+        if (gold != 0)\n+            money << gold << \" |TInterface\\\\Icons\\\\INV_Misc_Coin_01:8|t\";\n+        if (silver != 0)\n+            money << silver << \" |TInterface\\\\Icons\\\\INV_Misc_Coin_03:8|t\";\n+        if (cost)\n+            money << cost << \" |TInterface\\\\Icons\\\\INV_Misc_Coin_05:8|t\";\n+    }\n+\n+    if (uint32 rcost = GetNpcBotCostRent(level, botclass))\n+    {\n+        uint32 gold = uint32(rcost / GOLD);\n+        rcost -= (gold * GOLD);\n+        uint32 silver = uint32(rcost / SILVER);\n+        rcost -= (silver * SILVER);\n+\n+        money << \" + |TInterface\\\\Icons\\\\INV_Misc_PocketWatch_01:16|t\";\n+\n+        if (gold != 0)\n+            money << gold << \" |TInterface\\\\Icons\\\\INV_Misc_Coin_01:8|t\";\n+        if (silver != 0)\n+            money << silver << \" |TInterface\\\\Icons\\\\INV_Misc_Coin_03:8|t\";\n+        if (rcost)\n+            money << rcost << \" |TInterface\\\\Icons\\\\INV_Misc_Coin_05:8|t\";\n+    }\n+\n+    return money.str();\n+}\n+\n+bool BotCfg::DisplayEquipment()\n+{\n+    return _displayEquipment;\n+}\n+\n+bool BotCfg::ShowEquippedCloak()\n+{\n+    return _showCloak;\n+}\n+\n+bool BotCfg::ShowEquippedHelm()\n+{\n+    return _showHelm;\n+}\n+\n+bool BotCfg::SendEquipListItems()\n+{\n+    return _sendEquipListItems;\n+}\n+\n+bool BotCfg::IsGearBankEnabled()\n+{\n+    return _enableBotGearBank;\n+}\n+\n+bool BotCfg::IsTransmogEnabled()\n+{\n+    return _transmog_enable;\n+}\n+bool BotCfg::MixArmorClasses()\n+{\n+    return _transmog_mixArmorClasses;\n+}\n+bool BotCfg::MixWeaponClasses()\n+{\n+    return _transmog_mixWeaponClasses;\n+}\n+bool BotCfg::MixWeaponInventoryTypes()\n+{\n+    return _transmog_mixWeaponInvTypes;\n+}\n+bool BotCfg::TransmogUseEquipmentSlots()\n+{\n+    return _transmog_useEquipmentSlots;\n+}\n+\n+bool BotCfg::IsClassEnabled(uint8 m_class)\n+{\n+    switch (m_class)\n+    {\n+        case BOT_CLASS_WARRIOR:\n+            return _enableclass_warrior;\n+        case BOT_CLASS_PALADIN:\n+            return _enableclass_paladin;\n+        case BOT_CLASS_HUNTER:\n+            return _enableclass_hunter;\n+        case BOT_CLASS_ROGUE:\n+            return _enableclass_rogue;\n+        case BOT_CLASS_PRIEST:\n+            return _enableclass_priest;\n+        case BOT_CLASS_DEATH_KNIGHT:\n+            return _enableclass_deathknight;\n+        case BOT_CLASS_SHAMAN:\n+            return _enableclass_shaman;\n+        case BOT_CLASS_MAGE:\n+            return _enableclass_mage;\n+        case BOT_CLASS_WARLOCK:\n+            return _enableclass_warlock;\n+        case BOT_CLASS_DRUID:\n+            return _enableclass_druid;\n+        case BOT_CLASS_BM:\n+            return _enableclass_blademaster;\n+        case BOT_CLASS_SPHYNX:\n+            return _enableclass_sphynx;\n+        case BOT_CLASS_ARCHMAGE:\n+            return _enableclass_archmage;\n+        case BOT_CLASS_DREADLORD:\n+            return _enableclass_dreadlord;\n+        case BOT_CLASS_SPELLBREAKER:\n+            return _enableclass_spellbreaker;\n+        case BOT_CLASS_DARK_RANGER:\n+            return _enableclass_darkranger;\n+        case BOT_CLASS_NECROMANCER:\n+            return _enableclass_necromancer;\n+        case BOT_CLASS_SEA_WITCH:\n+            return _enableclass_seawitch;\n+        case BOT_CLASS_CRYPT_LORD:\n+            return _enableclass_cryptlord;\n+        default:\n+            return true;\n+    }\n+}\n+\n+bool BotCfg::IsWanderingClassEnabled(uint8 m_class)\n+{\n+    switch (m_class)\n+    {\n+        case BOT_CLASS_WARRIOR:\n+            return _enableclass_wander_warrior;\n+        case BOT_CLASS_PALADIN:\n+            return _enableclass_wander_paladin;\n+        case BOT_CLASS_HUNTER:\n+            return _enableclass_wander_hunter;\n+        case BOT_CLASS_ROGUE:\n+            return _enableclass_wander_rogue;\n+        case BOT_CLASS_PRIEST:\n+            return _enableclass_wander_priest;\n+        case BOT_CLASS_DEATH_KNIGHT:\n+            return _enableclass_wander_deathknight;\n+        case BOT_CLASS_SHAMAN:\n+            return _enableclass_wander_shaman;\n+        case BOT_CLASS_MAGE:\n+            return _enableclass_wander_mage;\n+        case BOT_CLASS_WARLOCK:\n+            return _enableclass_wander_warlock;\n+        case BOT_CLASS_DRUID:\n+            return _enableclass_wander_druid;\n+        case BOT_CLASS_BM:\n+            return _enableclass_wander_blademaster;\n+        case BOT_CLASS_SPHYNX:\n+            return _enableclass_wander_sphynx;\n+        case BOT_CLASS_ARCHMAGE:\n+            return _enableclass_wander_archmage;\n+        case BOT_CLASS_DREADLORD:\n+            return _enableclass_wander_dreadlord;\n+        case BOT_CLASS_SPELLBREAKER:\n+            return _enableclass_wander_spellbreaker;\n+        case BOT_CLASS_DARK_RANGER:\n+            return _enableclass_wander_darkranger;\n+        case BOT_CLASS_NECROMANCER:\n+            return _enableclass_wander_necromancer;\n+        case BOT_CLASS_SEA_WITCH:\n+            return _enableclass_wander_seawitch;\n+        case BOT_CLASS_CRYPT_LORD:\n+            return _enableclass_wander_cryptlord;\n+        default:\n+            return true;\n+    }\n+}\n+\n+bool BotCfg::EnableWanderingUntargetNpcQuestgiver()\n+{\n+    return _untarget_wnpc_questgiver;\n+}\n+bool BotCfg::EnableWanderingUntargetNpcFlightmaster()\n+{\n+    return _untarget_wnpc_flightmaster;\n+}\n+\n+bool BotCfg::HideBotSpawns()\n+{\n+    return _hideSpawns;\n+}\n+bool BotCfg::IsEnrageOnDimissEnabled()\n+{\n+    return _enrageOnDismiss;\n+}\n+bool BotCfg::IsBotStatsLimitsEnabled()\n+{\n+    return _botStatLimits;\n+}\n+bool BotCfg::IsPvPEnabled()\n+{\n+    return _botPvP;\n+}\n+bool BotCfg::IsFoodInterruptedByMovement()\n+{\n+    return _botMovementFoodInterrupt;\n+}\n+bool BotCfg::FilterRaces()\n+{\n+    return _filterRaces;\n+}\n+bool BotCfg::IsBotGenerationEnabledBGs()\n+{\n+    return _enableWanderingBotsBG;\n+}\n+bool BotCfg::IsBotLevelCappedByConfigBG()\n+{\n+    return _enableConfigLevelCapBG;\n+}\n+bool BotCfg::IsBotLevelCappedByConfigBGFirstPlayer()\n+{\n+    return _enableConfigLevelCapBGFirst;\n+}\n+bool BotCfg::IsBotGenerationEnabledWorldMapId(uint32 mapId)\n+{\n+    return std::ranges::find(_enabled_wander_node_maps, mapId) != std::cend(_enabled_wander_node_maps);\n+}\n+bool BotCfg::IsBotHKEnabled()\n+{\n+    return _bothk_enable;\n+}\n+bool BotCfg::IsBotHKMessageEnabled()\n+{\n+    return _bothk_message_enable;\n+}\n+bool BotCfg::IsBotHKAchievementsEnabled()\n+{\n+    return _bothk_achievements_enable;\n+}\n+bool BotCfg::IsSharedOwnerOptionEnabled(SharedOwnerOptionMask options)\n+{\n+    return std::ranges::all_of(std::array{ SHARED_OWNER_OPTION_MASK_ENABLE, options }, [=](uint32 mask) { return !!(_shared_ownership_options & mask); });\n+}\n+uint8 BotCfg::GetMaxClassBots()\n+{\n+    return _maxClassNpcBots;\n+}\n+uint8 BotCfg::GetMaxAccountBots()\n+{\n+    return _maxAccountNpcBots;\n+}\n+uint8 BotCfg::GetMaxSharedOwners()\n+{\n+    return _maxSharedOwners;\n+}\n+uint32 BotCfg::GetGearBankCapacity()\n+{\n+    return _gearBankCapacity;\n+}\n+uint32 BotCfg::GetGearBankEquipmentSetsCount()\n+{\n+    return _gearBankEquipmentSetsCount;\n+}\n+uint8 BotCfg::GetHealTargetIconFlags()\n+{\n+    return _healTargetIconFlags;\n+}\n+uint8 BotCfg::GetTankTargetIconFlags()\n+{\n+    return _tankingTargetIconFlags;\n+}\n+uint8 BotCfg::GetOffTankTargetIconFlags()\n+{\n+    return _offTankingTargetIconFlags;\n+}\n+uint8 BotCfg::GetDPSTargetIconFlags()\n+{\n+    return _dpsTargetIconFlags;\n+}\n+uint8 BotCfg::GetRangedDPSTargetIconFlags()\n+{\n+    return _rangedDpsTargetIconFlags;\n+}\n+uint8 BotCfg::GetNoDPSTargetIconFlags()\n+{\n+    return _noDpsTargetIconFlags;\n+}\n+uint32 BotCfg::GetBaseUpdateDelay()\n+{\n+    return _npcBotUpdateDelayBase;\n+}\n+uint32 BotCfg::GetOwnershipExpireTime()\n+{\n+    return _npcBotOwnerExpireTime;\n+}\n+uint8 BotCfg::GetOwnershipExpireMode()\n+{\n+    return _npcBotOwnerExpireMode;\n+}\n+uint32 BotCfg::GetDesiredWanderingBotsCount()\n+{\n+    return _desiredWanderingBotsCount;\n+}\n+uint32 BotCfg::GetBGTargetTeamPlayersCount(BattlegroundTypeId bgTypeId)\n+{\n+    switch (bgTypeId)\n+    {\n+        case BATTLEGROUND_AV:\n+            return _targetBGPlayersPerTeamCount_AV;\n+        case BATTLEGROUND_WS:\n+            return _targetBGPlayersPerTeamCount_WS;\n+        case BATTLEGROUND_AB:\n+            return _targetBGPlayersPerTeamCount_AB;\n+        case BATTLEGROUND_EY:\n+            return _targetBGPlayersPerTeamCount_EY;\n+        case BATTLEGROUND_SA:\n+            return _targetBGPlayersPerTeamCount_SA;\n+        case BATTLEGROUND_IC:\n+            return _targetBGPlayersPerTeamCount_IC;\n+        default:\n+            return 0;\n+    }\n+}\n+float BotCfg::GetBotHKHonorRate()\n+{\n+    return _bothk_rate_honor;\n+}\n+float BotCfg::GetBotStatLimitDodge()\n+{\n+    return _botStatLimits_dodge;\n+}\n+float BotCfg::GetBotStatLimitParry()\n+{\n+    return _botStatLimits_parry;\n+}\n+float BotCfg::GetBotStatLimitBlock()\n+{\n+    return _botStatLimits_block;\n+}\n+float BotCfg::GetBotStatLimitCrit()\n+{\n+    return _botStatLimits_crit;\n+}\n+\n+bool BotCfg::IsNpcBotXpReductionEnabled()\n+{\n+    return _xpReductionEnable;\n+}\n+bool BotCfg::IsNpcBotXpReductionGroupOnly()\n+{\n+    return _xpReductionGroupOnly;\n+}\n+uint8 BotCfg::GetNpcBotXpReductionExtraAmount()\n+{\n+    return _xpReductionExtraAmount;\n+}\n+uint8 BotCfg::GetNpcBotXpReductionExtraStartingNumber()\n+{\n+    return _xpReductionExtraStartingNumber;\n+}\n+\n+bool BotCfg::IsNpcBotHonorReductionEnabled()\n+{\n+    return _honorReductionEnable;\n+}\n+bool BotCfg::IsNpcBotHonorReductionGroupOnly()\n+{\n+    return _honorReductionGroupOnly;\n+}\n+\n+bool BotCfg::GetNpcBotMoneyShareEnabled()\n+{\n+    return _moneyLootShareEnable;\n+}\n+bool BotCfg::GetNpcBotMoneyShareGroupOnly()\n+{\n+    return _moneyLootShareGroupOnly;\n+}\n+\n+uint8 BotCfg::GetNpcBotMountLevel60()\n+{\n+    return _mountLevel60;\n+}\n+uint8 BotCfg::GetNpcBotMountLevel100()\n+{\n+    return _mountLevel100;\n+}\n+\n+uint8 BotCfg::GetMaxNpcBots(uint8 level)\n+{\n+    return _max_npcbots[std::min<size_t>(BRACKETS_COUNT - 1, level / 10)];\n+}\n+\n+int32 BotCfg::GetBotInfoPacketsLimit()\n+{\n+    return _botInfoPacketsLimit;\n+}\n+\n+float BotCfg::GetBotDamageModPhysical()\n+{\n+    return _mult_dmg_physical;\n+}\n+float BotCfg::GetBotDamageModSpell()\n+{\n+    return _mult_dmg_spell;\n+}\n+float BotCfg::GetBotHealingMod()\n+{\n+    return _mult_healing;\n+}\n+float BotCfg::GetBotHPMod()\n+{\n+    return _mult_hp;\n+}\n+float BotCfg::GetBotWandererDamageMod()\n+{\n+    return _mult_dmg_wanderer;\n+}\n+float BotCfg::GetBotWandererHealingMod()\n+{\n+    return _mult_healing_wanderer;\n+}\n+float BotCfg::GetBotWandererHPMod()\n+{\n+    return _mult_hp_wanderer;\n+}\n+float BotCfg::GetBotWandererSpeedMod()\n+{\n+    return _mult_speed_wanderer;\n+}\n+float BotCfg::GetBotWandererXPGainMod()\n+{\n+    return _mult_xpgain_wanderer;\n+}\n+PctBrackets BotCfg::GetBotWandererLevelBrackets()\n+{\n+    return _botwanderer_pct_level_brackets;\n+}\n+uint32 BotCfg::GetBotWandererMaxItemLevel(uint8 level)\n+{\n+    return _botwanderer_itemlvl_level_brackets[std::min<size_t>(BRACKETS_COUNT - 1, level / 10)];\n+}\n+uint32 BotCfg::GetBotWandererKillRewardMoney()\n+{\n+    return _killrewardWandererMoneyBase;\n+}\n+uint32 BotCfg::GetBotWandererKillRewardItemMaxCount()\n+{\n+    return _killrewardWandererItemCount;\n+}\n+uint32 BotCfg::GetBotWandererKillRewardItemMaxQuality()\n+{\n+    return _killrewardWandererItemQuality;\n+}\n+float BotCfg::GetBotDamageModByClass(uint8 botclass)\n+{\n+    switch (botclass)\n+    {\n+        case BOT_CLASS_WARRIOR:\n+            return _mult_dmg_warrior;\n+        case BOT_CLASS_PALADIN:\n+            return _mult_dmg_paladin;\n+        case BOT_CLASS_HUNTER:\n+            return _mult_dmg_hunter;\n+        case BOT_CLASS_ROGUE:\n+            return _mult_dmg_rogue;\n+        case BOT_CLASS_PRIEST:\n+            return _mult_dmg_priest;\n+        case BOT_CLASS_DEATH_KNIGHT:\n+            return _mult_dmg_deathknight;\n+        case BOT_CLASS_SHAMAN:\n+            return _mult_dmg_shaman;\n+        case BOT_CLASS_MAGE:\n+            return _mult_dmg_mage;\n+        case BOT_CLASS_WARLOCK:\n+            return _mult_dmg_warlock;\n+        case BOT_CLASS_DRUID:\n+            return _mult_dmg_druid;\n+        case BOT_CLASS_BM:\n+            return _mult_dmg_blademaster;\n+        case BOT_CLASS_SPHYNX:\n+            return _mult_dmg_obsidiandestroyer;\n+        case BOT_CLASS_ARCHMAGE:\n+            return _mult_dmg_archmage;\n+        case BOT_CLASS_DREADLORD:\n+            return _mult_dmg_dreadlord;\n+        case BOT_CLASS_SPELLBREAKER:\n+            return _mult_dmg_spellbreaker;\n+        case BOT_CLASS_DARK_RANGER:\n+            return _mult_dmg_darkranger;\n+        case BOT_CLASS_NECROMANCER:\n+            return _mult_dmg_necromancer;\n+        case BOT_CLASS_SEA_WITCH:\n+            return _mult_dmg_seawitch;\n+        case BOT_CLASS_CRYPT_LORD:\n+            return _mult_dmg_cryptlord;\n+        default:\n+            return 1.0;\n+    }\n+}\n+\n+float BotCfg::GetBotDamageModByLevel(uint8 botlevel)\n+{\n+    uint8 bracket = botlevel / 10;\n+    if (bracket < _mult_dmg_levels.size())\n+        return _mult_dmg_levels[bracket];\n+    return 1.0f;\n+}\n+float BotCfg::GetBotHealingModByLevel(uint8 botlevel)\n+{\n+    uint8 bracket = botlevel / 10;\n+    if (bracket < _mult_heal_levels.size())\n+        return _mult_heal_levels[bracket];\n+    return 1.0f;\n+}\n+float BotCfg::GetBotHPModByLevel(uint8 botlevel)\n+{\n+    uint8 bracket = botlevel / 10;\n+    if (bracket < _mult_hp_levels.size())\n+        return _mult_hp_levels[bracket];\n+    return 1.0f;\n+}\n+float BotCfg::GetBotMPModByLevel(uint8 botlevel)\n+{\n+    uint8 bracket = botlevel / 10;\n+    if (bracket < _mult_mp_levels.size())\n+        return _mult_mp_levels[bracket];\n+    return 1.0f;\n+}\n+\n+uint8 BotCfg::GetFollowDistDefault()\n+{\n+    return _basefollowdist;\n+}\n+uint32 BotCfg::GetEngageDelayDPSDefault()\n+{\n+    return _npcBotEngageDelayDPS_default;\n+}\n+uint32 BotCfg::GetEngageDelayHealDefault()\n+{\n+    return _npcBotEngageDelayHeal_default;\n+}\n+\n+bool BotCfg::IsMapAllowedForBots(Map const* map)\n+{\n+    if ((!_enableNpcBotsBGs && map->IsBattleground()) ||\n+        (!_enableNpcBotsArenas && map->IsBattleArena()) ||\n+        (!_enableNpcBotsDungeons && map->IsNonRaidDungeon()) ||\n+        (!_enableNpcBotsRaids && map->IsRaid()))\n+        return false;\n+\n+    if (map->IsDungeon() && !_disabled_instance_maps.empty() && std::ranges::find(_disabled_instance_maps, map->GetId()) != _disabled_instance_maps.cend())\n+        return false;\n+\n+    return true;\n+}\n+\n+uint32 BotCfg::_normalizedCostForLevel(uint32 cost_base, uint8 bot_class, uint8 level)\n+{\n+    //assuming default 1000000\n+    //level 1: 500  //5  silver\n+    //10 : 10000    //1  gold\n+    //20 : 50000    //5  gold\n+    //30 : 200000   //20 gold\n+    //40 : 500000   //50 gold\n+    //rest is linear\n+    //rare / rareelite bots have their cost adjusted\n+    uint32 cost =\n+        level < 10 ? cost_base / 2000 : //5 silver\n+        level < 20 ? cost_base / 100 :  //1 gold\n+        level < 30 ? cost_base / 20 :   //5 gold\n+        level < 40 ? cost_base / 5 :    //20 gold\n+        (cost_base * (level - (level % 10))) / DEFAULT_MAX_LEVEL; //50 - 100 gold\n+\n+    switch (bot_class)\n+    {\n+        case BOT_CLASS_BM:\n+        case BOT_CLASS_ARCHMAGE:\n+        case BOT_CLASS_SPELLBREAKER:\n+        case BOT_CLASS_NECROMANCER:\n+            cost += cost; //200%\n+            break;\n+        case BOT_CLASS_SPHYNX:\n+        case BOT_CLASS_DREADLORD:\n+        case BOT_CLASS_DARK_RANGER:\n+        case BOT_CLASS_SEA_WITCH:\n+        case BOT_CLASS_CRYPT_LORD:\n+            cost += cost * 4; //500%\n+            break;\n+        default:\n+            break;\n+    }\n+\n+    return cost;\n+}\n+\n+void AddSC_botconfig_scripts()\n+{\n+    new NPCBotsConfigScript();\n+}\n+\n+#ifdef _MSC_VER\n+# pragma warning(pop)\n+#endif\ndiff --git a/src/server/game/AI/NpcBots/botconfig.h b/src/server/game/AI/NpcBots/botconfig.h\nnew file mode 100644\nindex 0000000000..33870d6096\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/botconfig.h\n@@ -0,0 +1,142 @@\n+#ifndef BOTCONFIG_H\n+#define BOTCONFIG_H\n+\n+#include \"botcommon.h\"\n+\n+enum SharedOwnerOptions : uint32\n+{\n+    SHARED_OWNER_ENABLE                 = 1,\n+    SHARED_OWNER_EQUIPMENT              = 2,\n+    SHARED_OWNER_ADD_OWNERS             = 3,\n+    SHARED_OWNER_REMOVE_OWNERS          = 4,\n+\n+    MAX_SHARED_OWNER_OPTIONS\n+};\n+enum SharedOwnerOptionMask : uint32\n+{\n+    SHARED_OWNER_OPTION_MASK_ENABLE         = (1<<(SHARED_OWNER_ENABLE-1)),\n+    SHARED_OWNER_OPTION_MASK_EQUIPMENT      = (1<<(SHARED_OWNER_EQUIPMENT-1)),\n+    SHARED_OWNER_OPTION_MASK_ADD_OWNERS     = (1<<(SHARED_OWNER_ADD_OWNERS-1)),\n+    SHARED_OWNER_OPTION_MASK_REMOVE_OWNERS  = (1<<(SHARED_OWNER_REMOVE_OWNERS-1)),\n+\n+    SHARED_OWNER_OPTION_MASK_MANAGE_OWNERS  = SHARED_OWNER_OPTION_MASK_ADD_OWNERS | SHARED_OWNER_OPTION_MASK_REMOVE_OWNERS,\n+    SHARED_OWNER_OPTION_MASK_ALL            = (1<<(MAX_SHARED_OWNER_OPTIONS-1)) - 1\n+};\n+\n+class Map;\n+\n+template<typename U>\n+using BotBrackets = std::array<U, BRACKETS_COUNT>;\n+using LvlBrackets = BotBrackets<uint8>;\n+using PctBrackets = BotBrackets<uint32>;\n+using ItemLvlBrackets = BotBrackets<uint32>;\n+\n+class AC_GAME_API BotCfg\n+{\n+public:\n+    static void ReloadConfig();\n+\n+    static bool IsNpcBotModEnabled();\n+    static bool IsNpcBotLogEnabled();\n+    static bool IsNpcBotDungeonFinderEnabled();\n+    static bool LimitNpcBotsInDungeons();\n+    static bool LimitNpcBotsInRaids();\n+    static bool IsNpcBotsPremadeEnabled();\n+    static bool DisplayEquipment();\n+    static bool ShowEquippedCloak();\n+    static bool ShowEquippedHelm();\n+    static bool SendEquipListItems();\n+    static bool IsGearBankEnabled();\n+    static bool IsTransmogEnabled();\n+    static bool MixArmorClasses();\n+    static bool MixWeaponClasses();\n+    static bool MixWeaponInventoryTypes();\n+    static bool TransmogUseEquipmentSlots();\n+    static bool IsClassEnabled(uint8 m_class);\n+    static bool IsWanderingClassEnabled(uint8 m_class);\n+    static bool EnableWanderingUntargetNpcQuestgiver();\n+    static bool EnableWanderingUntargetNpcFlightmaster();\n+    static bool HideBotSpawns();\n+    static bool IsEnrageOnDimissEnabled();\n+    static bool IsBotStatsLimitsEnabled();\n+    static bool IsPvPEnabled();\n+    static bool IsFoodInterruptedByMovement();\n+    static bool FilterRaces();\n+    static bool IsBotGenerationEnabledBGs();\n+    static bool IsBotLevelCappedByConfigBG();\n+    static bool IsBotLevelCappedByConfigBGFirstPlayer();\n+    static bool IsBotGenerationEnabledWorldMapId(uint32 mapId);\n+    static bool IsBotHKEnabled();\n+    static bool IsBotHKMessageEnabled();\n+    static bool IsBotHKAchievementsEnabled();\n+    static bool IsSharedOwnerOptionEnabled(SharedOwnerOptionMask options);\n+    static uint8 GetMaxClassBots();\n+    static uint8 GetMaxAccountBots();\n+    static uint8 GetMaxSharedOwners();\n+    static uint32 GetGearBankCapacity();\n+    static uint32 GetGearBankEquipmentSetsCount();\n+    static uint8 GetHealTargetIconFlags();\n+    static uint8 GetTankTargetIconFlags();\n+    static uint8 GetOffTankTargetIconFlags();\n+    static uint8 GetDPSTargetIconFlags();\n+    static uint8 GetRangedDPSTargetIconFlags();\n+    static uint8 GetNoDPSTargetIconFlags();\n+    static uint32 GetBaseUpdateDelay();\n+    static uint32 GetOwnershipExpireTime();\n+    static uint8 GetOwnershipExpireMode();\n+    static uint32 GetDesiredWanderingBotsCount();\n+    static uint32 GetBGTargetTeamPlayersCount(BattlegroundTypeId bgTypeId);\n+    static float GetBotHKHonorRate();\n+    static float GetBotStatLimitDodge();\n+    static float GetBotStatLimitParry();\n+    static float GetBotStatLimitBlock();\n+    static float GetBotStatLimitCrit();\n+    static float GetBotDamageModPhysical();\n+    static float GetBotDamageModSpell();\n+    static float GetBotHealingMod();\n+    static float GetBotHPMod();\n+    static float GetBotWandererDamageMod();\n+    static float GetBotWandererHealingMod();\n+    static float GetBotWandererHPMod();\n+    static float GetBotWandererSpeedMod();\n+    static float GetBotWandererXPGainMod();\n+    static PctBrackets GetBotWandererLevelBrackets();\n+    static uint32 GetBotWandererMaxItemLevel(uint8 level);\n+    static uint32 GetBotWandererKillRewardMoney();\n+    static uint32 GetBotWandererKillRewardItemMaxCount();\n+    static uint32 GetBotWandererKillRewardItemMaxQuality();\n+    static float GetBotDamageModByClass(uint8 botclass);\n+    static float GetBotDamageModByLevel(uint8 botlevel);\n+    static float GetBotHealingModByLevel(uint8 botlevel);\n+    static float GetBotHPModByLevel(uint8 botlevel);\n+    static float GetBotMPModByLevel(uint8 botlevel);\n+\n+    static uint8 GetFollowDistDefault();\n+    static uint32 GetEngageDelayDPSDefault();\n+    static uint32 GetEngageDelayHealDefault();\n+\n+    static uint8 GetMaxNpcBots(uint8 level);\n+    static bool IsNpcBotXpReductionEnabled();\n+    static bool IsNpcBotXpReductionGroupOnly();\n+    static uint8 GetNpcBotXpReductionExtraAmount();\n+    static uint8 GetNpcBotXpReductionExtraStartingNumber();\n+    static bool IsNpcBotHonorReductionEnabled();\n+    static bool IsNpcBotHonorReductionGroupOnly();\n+    static bool GetNpcBotMoneyShareEnabled();\n+    static bool GetNpcBotMoneyShareGroupOnly();\n+    static uint8 GetNpcBotMountLevel60();\n+    static uint8 GetNpcBotMountLevel100();\n+    static int32 GetBotInfoPacketsLimit();\n+\n+    static uint32 GetNpcBotCostRent(uint8 level, uint8 botclass);\n+    static uint32 GetNpcBotCostHire(uint8 level, uint8 botclass);\n+    static std::string GetNpcBotCostStr(uint8 level, uint8 botclass);\n+\n+    static bool IsMapAllowedForBots(Map const* map);\n+private:\n+    static uint32 _normalizedCostForLevel(uint32 cost_base, uint8 bot_class, uint8 level);\n+};\n+\n+void AddNpcBotScripts();\n+\n+#endif\ndiff --git a/src/server/game/AI/NpcBots/botdatamgr.cpp b/src/server/game/AI/NpcBots/botdatamgr.cpp\nnew file mode 100644\nindex 0000000000..ca9ba9fe2a\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/botdatamgr.cpp\n@@ -0,0 +1,3503 @@\n+#include \"BattlegroundMgr.h\"\n+#include \"BattlegroundQueue.h\"\n+#include \"bot_ai.h\"\n+#include \"botconfig.h\"\n+#include \"botdatamgr.h\"\n+#include \"botgearscore.h\"\n+#include \"botlog.h\"\n+#include \"botmgr.h\"\n+#include \"botspell.h\"\n+#include \"botwanderful.h\"\n+#include \"bpet_ai.h\"\n+#include \"CharacterCache.h\"\n+#include \"Containers.h\"\n+#include \"Creature.h\"\n+#include \"DatabaseEnv.h\"\n+#include \"DBCStores.h\"\n+#include \"GameTime.h\"\n+#include \"GroupMgr.h\"\n+#include \"Item.h\"\n+#include \"Log.h\"\n+#include \"Map.h\"\n+#include \"MapMgr.h\"\n+#include \"ObjectMgr.h\"\n+#include \"Player.h\"\n+#include \"ScriptMgr.h\"\n+#include \"SpellInfo.h\"\n+#include \"SpellMgr.h\"\n+#include \"StringConvert.h\"\n+#include \"Tokenize.h\"\n+#include \"World.h\"\n+#include \"WorldDatabase.h\"\n+\n+#include <numeric>\n+/*\n+Npc Bot Data Manager by Trickerer (onlysuffering@gmail.com)\n+NpcBots DB Data management\n+%Complete: ???\n+*/\n+\n+#ifdef _MSC_VER\n+# pragma warning(push, 4)\n+#endif\n+\n+using namespace std::string_view_literals;\n+\n+using NpcBotMgrDataMap = std::unordered_map<ObjectGuid /*player_guid*/, NpcBotMgrData>;\n+using NpcBotDataMap = std::unordered_map<uint32 /*entry*/, NpcBotData>;\n+using NpcBotAppearanceDataMap = std::unordered_map<uint32 /*entry*/, NpcBotAppearanceData>;\n+using NpcBotExtrasMap = std::unordered_map<uint32 /*entry*/, NpcBotExtras>;\n+using NpcBotTransmogDataMap = std::unordered_map<uint32 /*entry*/, NpcBotTransmogData>;\n+static NpcBotMgrDataMap _botMgrsData;\n+static NpcBotDataMap _botsData;\n+static NpcBotAppearanceDataMap _botsAppearanceData;\n+static NpcBotExtrasMap _botsExtras;\n+static NpcBotTransmogDataMap _botsTransmogData;\n+static NpcBotRegistry _existingBots;\n+\n+static std::map<uint32, uint8> _wpMinSpawnLevelPerMapId;\n+static std::map<uint32, uint8> _wpMaxSpawnLevelPerMapId;\n+static std::map<uint8, std::set<uint32>> _spareBotIdsPerClassMap;\n+static CreatureTemplateContainer _botsWanderCreatureTemplates;\n+static std::unordered_map<uint32, EquipmentInfo const*> _botsWanderCreatureEquipmentTemplates;\n+static std::list<std::pair<uint32, WanderNode const*>> _botsWanderCreaturesToSpawn;\n+static std::set<uint32> _botsWanderCreaturesToDespawn;\n+\n+static ItemPerBotClassMap _botsWanderCreaturesSortedGear;\n+\n+using BotGearStorageMap = std::unordered_map<ObjectGuid /*playerGuid*/, BotBankItemContainer>;\n+static BotGearStorageMap _botStoredGearMap;\n+using BotGearSetStorageMap = std::unordered_map<ObjectGuid /*playerGuid*/, BotItemSetsArray>;\n+static BotGearSetStorageMap _botStoredGearSetMap;\n+\n+static bool allBotsLoaded = false;\n+\n+static uint32 next_wandering_bot_spawn_delay = 0;\n+\n+static EventProcessor botSpawnEvents;\n+static std::unordered_map<ObjectGuid, EventProcessor> botBGJoinEvents;\n+\n+bool BotBankItemCompare::operator()(Item const* item1, Item const* item2) const\n+{\n+    ItemTemplate const* proto1 = item1->GetTemplate();\n+    ItemTemplate const* proto2 = item2->GetTemplate();\n+\n+    if (proto1->Class == proto2->Class)\n+    {\n+        if (proto1->SubClass == proto2->SubClass)\n+        {\n+            if (proto1->InventoryType == proto2->InventoryType)\n+            {\n+                if (proto1->Quality == proto2->Quality)\n+                {\n+                    float gs1 = CalculateItemGearScoreRaw(proto1);\n+                    float gs2 = CalculateItemGearScoreRaw(proto1);\n+                    if (gs1 == gs2)\n+                    {\n+                        if (proto1->Name1 == proto2->Name1)\n+                            return item1->GetGUID().GetCounter() < item2->GetGUID().GetCounter();\n+                        return proto1->Name1 < proto2->Name1;\n+                    }\n+                    return gs1 < gs2;\n+                }\n+                return proto1->Quality > proto2->Quality;\n+            }\n+            return proto1->InventoryType < proto2->InventoryType;\n+        }\n+        return proto1->SubClass < proto2->SubClass;\n+    }\n+    return proto1->Class < proto2->Class;\n+}\n+\n+class BotBattlegroundEnterEvent : public BasicEvent\n+{\n+    const ObjectGuid _playerGUID;\n+    const ObjectGuid _botGUID;\n+    const BattlegroundQueueTypeId _bgQueueTypeId;\n+    const BattlegroundTypeId _bgTypeId;\n+    const uint64 _removeTime;\n+\n+public:\n+    BotBattlegroundEnterEvent(ObjectGuid playerGUID, ObjectGuid botGUID, BattlegroundQueueTypeId bgQueueTypeId, BattlegroundTypeId bgTypeId, uint64 removeTime)\n+        : _playerGUID(playerGUID), _botGUID(botGUID), _bgQueueTypeId(bgQueueTypeId), _bgTypeId(bgTypeId), _removeTime(removeTime) {}\n+\n+    void AbortMe()\n+    {\n+        BOT_LOG_ERROR(\"npcbots\", \"BotBattlegroundEnterEvent: Aborting bot {} bg {}!\", _botGUID.GetEntry(), uint32(_bgQueueTypeId));\n+        sBattlegroundMgr->GetBattlegroundQueue(_bgQueueTypeId).RemovePlayer(_botGUID, true);\n+        BotDataMgr::DespawnWandererBot(_botGUID.GetEntry());\n+    }\n+\n+    void AbortAll()\n+    {\n+        BOT_LOG_ERROR(\"npcbots\", \"BotBattlegroundEnterEvent: Aborting ALL bots by {} bg {}!\", _playerGUID.GetCounter(), uint32(_bgQueueTypeId));\n+        AbortMe();\n+        botBGJoinEvents.at(_playerGUID).KillAllEvents(false);\n+    }\n+\n+    bool Execute(uint64 e_time, uint32 /*p_time*/) override\n+    {\n+        if (e_time >= _removeTime)\n+        {\n+            AbortMe();\n+            return true;\n+        }\n+        else if (Creature const* bot = BotDataMgr::FindBot(_botGUID.GetEntry()))\n+        {\n+            // Battleground is created at this point, try to find it\n+            BattlegroundQueue& queue = sBattlegroundMgr->GetBattlegroundQueue(_bgQueueTypeId);\n+            BattlegroundQueue::QueuedPlayersMap::const_iterator qpm_citr = queue.m_QueuedPlayers.find(_botGUID);\n+            GroupQueueInfo const* my_gqi = qpm_citr != queue.m_QueuedPlayers.cend() ? qpm_citr->second : nullptr;\n+            Battleground* bg = my_gqi ? sBattlegroundMgr->GetBattleground(my_gqi->IsInvitedToBGInstanceGUID, _bgTypeId) : nullptr;\n+\n+            if (!bg || bg->GetPlayersCountByTeam(TEAM_ALLIANCE) + bg->GetPlayersCountByTeam(TEAM_HORDE) >= bg->GetMaxPlayersPerTeam() * 2)\n+            {\n+                AbortAll();\n+                return true;\n+            }\n+\n+            if (!queue.IsBotInvited(_botGUID, bg->GetInstanceID()))\n+            {\n+                AbortMe();\n+                return true;\n+            }\n+\n+            if (bg->GetPlayersCountByTeam(TEAM_ALLIANCE) + bg->GetPlayersCountByTeam(TEAM_HORDE) > 0)\n+            {\n+                Map* bgMap = ASSERT_NOTNULL(sMapMgr->FindMap(bg->GetMapId(), bg->GetInstanceID()));\n+\n+                queue.RemovePlayer(bot->GetGUID(), false);\n+\n+                //BG is set second time in Battleground::AddBot() but it's the same value so this is alright\n+                bot->GetBotAI()->SetBG(bg);\n+\n+                TeamId teamId = BotDataMgr::GetTeamIdForFaction(bot->GetFaction());\n+                BotMgr::TeleportBot(const_cast<Creature*>(bot), bgMap, bg->GetTeamStartPosition(teamId), true, false);\n+            }\n+            else if (std::ranges::any_of(queue.m_QueuedPlayers, [=](BattlegroundQueue::QueuedPlayersMap::value_type const& qpm_pair) {\n+                return qpm_pair.first.IsPlayer() && qpm_pair.second->IsInvitedToBGInstanceGUID == my_gqi->IsInvitedToBGInstanceGUID;\n+            }))\n+                botBGJoinEvents.at(_playerGUID).AddEventAtOffset(new BotBattlegroundEnterEvent(_playerGUID, _botGUID, _bgQueueTypeId, _bgTypeId, _removeTime), 2s);\n+            else\n+                AbortAll();\n+        }\n+\n+        return true;\n+    }\n+\n+    void Abort(uint64 /*e_time*/) override { AbortMe(); }\n+};\n+\n+static void SpawnWandererBot(uint32 bot_id, WanderNode const* spawnLoc, NpcBotRegistry* registry)\n+{\n+    CreatureTemplate const& bot_template = _botsWanderCreatureTemplates.at(bot_id);\n+    NpcBotData const* bot_data = BotDataMgr::SelectNpcBotData(bot_id);\n+    NpcBotExtras const* bot_extras = BotDataMgr::SelectNpcBotExtras(bot_id);\n+    Position spawnPos = spawnLoc->GetPosition();\n+\n+    ASSERT(bot_data);\n+    ASSERT(bot_extras);\n+\n+    Map* map = sMapMgr->CreateBaseMap(spawnLoc->GetMapId());\n+    map->LoadGrid(spawnLoc->m_positionX, spawnLoc->m_positionY);\n+\n+    BOT_LOG_DEBUG(\"npcbots\", \"Spawning wandering bot: {} ({}) class {} race {} fac {}, location: mapId {} {} ({})\",\n+        bot_template.Name.c_str(), bot_id, uint32(bot_extras->bclass), uint32(bot_extras->race), bot_data->faction,\n+        spawnLoc->GetMapId(), spawnLoc->ToString().c_str(), spawnLoc->GetName().c_str());\n+\n+    Creature* bot = new Creature();\n+    if (!bot->LoadBotCreatureFromDB(0, map, true, true, bot_id, &spawnPos))\n+    {\n+        delete bot;\n+        BOT_LOG_FATAL(\"server.loading\", \"Cannot load npcbot from DB!\");\n+        ASSERT(false);\n+    }\n+\n+    if (registry)\n+        registry->insert(bot);\n+}\n+\n+void BotDataMgr::DespawnWandererBot(uint32 entry)\n+{\n+    Creature const* bot = FindBot(entry);\n+    if (bot && bot->IsWandererBot())\n+    {\n+        if (bot->GetBotAI())\n+            bot->GetBotAI()->canUpdate = false;\n+        _botsWanderCreaturesToDespawn.insert(entry);\n+    }\n+    else\n+        BOT_LOG_ERROR(\"npcbots\", \"DespawnWandererBot(): trying to despawn non-existing wanderer bot {} '{}'!\", entry, bot ? bot->GetName().c_str() : \"unknown\");\n+}\n+\n+struct WanderingBotsGenerator\n+{\n+private:\n+    using NodeVec = std::vector<WanderNode const*>;\n+\n+    const std::map<uint8, uint32> wbot_faction_for_ex_class = {\n+        {BOT_CLASS_BM, FACTION_TEMPLATE_NEUTRAL_HOSTILE/*2u*/},\n+        {BOT_CLASS_SPHYNX, FACTION_TEMPLATE_NEUTRAL_HOSTILE},\n+        {BOT_CLASS_ARCHMAGE, FACTION_TEMPLATE_NEUTRAL_HOSTILE/*1u*/},\n+        {BOT_CLASS_DREADLORD, FACTION_TEMPLATE_NEUTRAL_HOSTILE},\n+        {BOT_CLASS_SPELLBREAKER, FACTION_TEMPLATE_NEUTRAL_HOSTILE/*1610u*/},\n+        {BOT_CLASS_DARK_RANGER, FACTION_TEMPLATE_NEUTRAL_HOSTILE},\n+        {BOT_CLASS_NECROMANCER, FACTION_TEMPLATE_NEUTRAL_HOSTILE},\n+        {BOT_CLASS_SEA_WITCH, FACTION_TEMPLATE_NEUTRAL_HOSTILE},\n+        {BOT_CLASS_CRYPT_LORD, FACTION_TEMPLATE_NEUTRAL_HOSTILE}\n+    };\n+\n+    uint32 next_bot_id;\n+    uint32 enabledBotsCount;\n+\n+    WanderingBotsGenerator()\n+    {\n+        next_bot_id = BOT_ENTRY_CREATE_BEGIN - 1;\n+        QueryResult result = CharacterDatabase.Query(\"SELECT value FROM worldstates WHERE entry = {}\", uint32(BOT_GIVER_ENTRY));\n+        if (!result)\n+        {\n+            BOT_LOG_WARN(\"server.loading\", \"Next bot id for autogeneration is not found! Resetting! (client cache may interfere with names)\");\n+            for (uint32 bot_cid : BotDataMgr::GetExistingNPCBotIds())\n+                if (bot_cid > next_bot_id)\n+                    next_bot_id = bot_cid;\n+            CharacterDatabase.DirectExecute(\"INSERT INTO worldstates (entry, value, comment) VALUES ({}, {}, '{}')\",\n+                uint32(BOT_GIVER_ENTRY), next_bot_id, \"NPCBOTS MOD - last autogenerated bot entry\");\n+        }\n+        else\n+            next_bot_id = result->Fetch()[0].Get<uint32>();\n+\n+        ASSERT(next_bot_id > BOT_ENTRY_BEGIN);\n+\n+        for (uint8 c = BOT_CLASS_WARRIOR; c < BOT_CLASS_END; ++c)\n+            if (BotCfg::IsWanderingClassEnabled(c) && !_spareBotIdsPerClassMap.contains(c))\n+                _spareBotIdsPerClassMap.insert({ c, {} });\n+\n+        for (auto const& [id, extras] : _botsExtras)\n+        {\n+            uint8 c = extras.bclass;\n+            if (c != BOT_CLASS_NONE && BotCfg::IsWanderingClassEnabled(c))\n+            {\n+                ++enabledBotsCount;\n+                if (!_botsData.contains(id))\n+                {\n+                    ASSERT(_spareBotIdsPerClassMap.contains(c));\n+                    _spareBotIdsPerClassMap.at(c).insert(id);\n+                }\n+            }\n+        }\n+\n+        for (uint8 c = BOT_CLASS_WARRIOR; c < BOT_CLASS_END; ++c)\n+            if (_spareBotIdsPerClassMap.contains(c) && _spareBotIdsPerClassMap.at(c).empty())\n+                _spareBotIdsPerClassMap.erase(c);\n+    }\n+\n+    bool GenerateWanderingBotToSpawn(std::pair<uint8, uint32> const& spareBotPair, uint8 desired_bracket,\n+        NodeVec const& spawns_a, NodeVec const& spawns_h, NodeVec const& spawns_n,\n+        bool immediate, PvPDifficultyEntry const* bracketEntry, NpcBotRegistry* registry)\n+    {\n+        CreatureTemplateContainer const* all_templates = sObjectMgr->GetCreatureTemplates();\n+\n+        while (all_templates->contains(++next_bot_id));\n+\n+        const uint8 bot_class = spareBotPair.first;\n+        const uint32 orig_entry = spareBotPair.second;\n+        CreatureTemplate const* orig_template = ASSERT_NOTNULL(sObjectMgr->GetCreatureTemplate(orig_entry));\n+        NpcBotExtras const* orig_extras = ASSERT_NOTNULL(BotDataMgr::SelectNpcBotExtras(orig_entry));\n+        uint32 bot_faction = BotDataMgr::GetDefaultFactionForBotRaceClass(bot_class, orig_extras->race);\n+\n+        NodeVec const* bot_spawn_nodes;\n+        TeamId bot_team = BotDataMgr::GetTeamIdForFaction(bot_faction);\n+        switch (bot_team)\n+        {\n+            case TEAM_ALLIANCE:\n+                bot_spawn_nodes = &spawns_a;\n+                break;\n+            case TEAM_HORDE:\n+                bot_spawn_nodes = &spawns_h;\n+                break;\n+            default:\n+                bot_spawn_nodes = &spawns_n;\n+                break;\n+        }\n+        NodeVec level_nodes;\n+        level_nodes.reserve(bot_spawn_nodes->size());\n+        desired_bracket = std::max<uint8>(desired_bracket, BotDataMgr::GetMinLevelForBotClass(bot_class) / 10);\n+        for (WanderNode const* node : *bot_spawn_nodes)\n+        {\n+            if (desired_bracket * 10 + 9 >= node->GetLevels().first && node->GetLevels().second >= desired_bracket * 10)\n+                level_nodes.push_back(node);\n+        }\n+\n+        ASSERT(!level_nodes.empty());\n+        WanderNode const* spawnLoc = Bcore::Containers::SelectRandomContainerElement(level_nodes);\n+\n+        CreatureTemplate& bot_template = _botsWanderCreatureTemplates[next_bot_id];\n+        //copy all fields\n+        bot_template = *orig_template;\n+        bot_template.Entry = next_bot_id;\n+        bot_template.SubName = \"\";\n+        bot_template.speed_run = BotCfg::GetBotWandererSpeedMod();\n+        bot_template.KillCredit[0] = orig_entry;\n+\n+        uint32 max_level = DEFAULT_MAX_LEVEL;\n+        if (bracketEntry && BotCfg::IsBotLevelCappedByConfigBG())\n+        {\n+            uint32 max_expansion_level;\n+            switch (sWorld->getIntConfig(CONFIG_EXPANSION))\n+            {\n+                case EXPANSION_CLASSIC:                max_expansion_level = 60;                break;\n+                case EXPANSION_THE_BURNING_CRUSADE:    max_expansion_level = 70;                break;\n+                case EXPANSION_WRATH_OF_THE_LICH_KING: max_expansion_level = 80;                break;\n+                default:                               max_expansion_level = DEFAULT_MAX_LEVEL; break;\n+            }\n+\n+            max_level = std::min<uint32>(sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL), max_level);\n+            max_level = std::min<uint32>(max_expansion_level, max_level);\n+        }\n+\n+        if (bracketEntry)\n+        {\n+            //force level range for bgs\n+            bot_template.minlevel = std::min<uint32>(bracketEntry->minLevel, max_level);\n+            bot_template.maxlevel = std::min<uint32>(bracketEntry->maxLevel, max_level);\n+            if (sWorld->getBoolConfig(CONFIG_BG_XP_FOR_KILL))\n+                bot_template.flags_extra &= ~(CREATURE_FLAG_EXTRA_NO_XP);\n+        }\n+        else\n+        {\n+            bot_template.minlevel = std::min<uint32>(std::max<uint32>(desired_bracket * 10, spawnLoc->GetLevels().first), max_level);\n+            bot_template.maxlevel = std::min<uint32>(std::min<uint32>(desired_bracket * 10 + 9, spawnLoc->GetLevels().second), max_level);\n+            bot_template.flags_extra &= ~(CREATURE_FLAG_EXTRA_NO_XP);\n+\n+            if (sWorld->IsFFAPvPRealm())\n+            {\n+                bot_template.faction = FACTION_TEMPLATE_NEUTRAL_HOSTILE;\n+                bot_faction = FACTION_TEMPLATE_NEUTRAL_HOSTILE;\n+            }\n+        }\n+\n+        bot_template.InitializeQueryData();\n+\n+        uint8 bot_spec = bot_ai::SelectSpecForClass(bot_class);\n+        _botsData.emplace(std::piecewise_construct, std::forward_as_tuple(next_bot_id), std::forward_as_tuple(bot_ai::DefaultRolesForClass(bot_class, bot_spec), bot_faction, bot_spec));\n+        _botsExtras.emplace(next_bot_id, NpcBotExtras{.race = orig_extras->race, .bclass = bot_class});\n+        if (NpcBotAppearanceData const* orig_apdata = BotDataMgr::SelectNpcBotAppearance(orig_entry))\n+            _botsAppearanceData.emplace(std::piecewise_construct, std::forward_as_tuple(next_bot_id), std::forward_as_tuple(orig_apdata->gender, orig_apdata->skin, orig_apdata->face, orig_apdata->hair, orig_apdata->haircolor, orig_apdata->features));\n+\n+        int8 beqId = 1;\n+        _botsWanderCreatureEquipmentTemplates[next_bot_id] = sObjectMgr->GetEquipmentInfo(orig_entry, beqId);\n+\n+        //We do not create CreatureData for generated bots\n+\n+        CellCoord c = Bcore::ComputeCellCoord(spawnLoc->m_positionX, spawnLoc->m_positionY);\n+        GridCoord g = Bcore::ComputeGridCoord(spawnLoc->m_positionX, spawnLoc->m_positionY);\n+        ASSERT(c.IsCoordValid(), \"Invalid Cell coord!\");\n+        ASSERT(g.IsCoordValid(), \"Invalid Grid coord!\");\n+        Map* map = sMapMgr->CreateBaseMap(spawnLoc->GetMapId());\n+        ASSERT(map->GetEntry()->IsContinent() || map->GetEntry()->IsBattlegroundOrArena(), map->GetDebugInfo().c_str());\n+\n+        if (immediate)\n+            SpawnWandererBot(next_bot_id, spawnLoc, registry);\n+        else\n+            _botsWanderCreaturesToSpawn.emplace_back(next_bot_id, spawnLoc);\n+\n+        _spareBotIdsPerClassMap.at(bot_class).erase(orig_entry);\n+        if (_spareBotIdsPerClassMap.at(bot_class).empty())\n+            _spareBotIdsPerClassMap.erase(bot_class);\n+\n+        return true;\n+    }\n+\n+public:\n+    uint32 GetEnabledBotsCount() const { return enabledBotsCount; }\n+\n+    uint32 GetSpareBotsCount(TeamId teamId = TEAM_NEUTRAL) const\n+    {\n+        uint32 count = 0;\n+        for (auto const& [bot_class, bots] : _spareBotIdsPerClassMap)\n+        {\n+            if (teamId == TEAM_NEUTRAL)\n+                count += bots.size();\n+            else\n+            {\n+                if (bot_class >= BOT_CLASS_EX_START)\n+                {\n+                    auto cit = wbot_faction_for_ex_class.find(bot_class);\n+                    if (cit != wbot_faction_for_ex_class.cend() && cit->second == FACTION_TEMPLATE_NEUTRAL_HOSTILE)\n+                        continue;\n+                }\n+\n+                for (uint32 entry : bots)\n+                {\n+                    NpcBotExtras const* extras = ASSERT_NOTNULL(BotDataMgr::SelectNpcBotExtras(entry));\n+                    uint32 bot_faction = BotDataMgr::GetDefaultFactionForBotRaceClass(extras->bclass, extras->race);\n+                    TeamId bot_team = BotDataMgr::GetTeamIdForFaction(bot_faction);\n+                    if (teamId == bot_team)\n+                        ++count;\n+                }\n+            }\n+        }\n+        return count;\n+    }\n+\n+    bool GenerateWanderingBotsToSpawn(uint32 count, int32 map_id, int32 team, bool immediate, PvPDifficultyEntry const* bracketEntry, NpcBotRegistry* registry, uint32& spawned)\n+    {\n+        using NodeVec = std::vector<WanderNode const*>;\n+\n+        if (_spareBotIdsPerClassMap.empty())\n+            return false;\n+\n+        std::array<NodeVec, 3> spawns_all{};\n+        for (NodeVec& vec : spawns_all)\n+            vec.reserve(WanderNode::GetWPMapsCount() * 20u);\n+\n+        auto& [spawns_a, spawns_h, spawns_n] = spawns_all;\n+        WanderNode::DoForAllWPs([map_id = map_id, &spawns_a = spawns_a, &spawns_h = spawns_h, &spawns_n = spawns_n](WanderNode const* wp) {\n+            MapEntry const* mapEntry = sMapStore.LookupEntry(wp->GetMapId());\n+            if ((map_id == -1) ? mapEntry->IsWorldMap() : (int32(mapEntry->MapID) == map_id))\n+            {\n+                if (wp->HasFlag(BotWPFlags::BOTWP_FLAG_SPAWN))\n+                {\n+                    if (bot_ai::IsWanderNodeAvailableForBotFaction(wp, FACTION_TEMPLATE_ALLIANCE_DEFAULT, false, true))\n+                        spawns_a.emplace_back(wp);\n+                    else if (bot_ai::IsWanderNodeAvailableForBotFaction(wp, FACTION_TEMPLATE_HORDE_DEFAULT, false, true))\n+                        spawns_h.emplace_back(wp);\n+                    if (bot_ai::IsWanderNodeAvailableForBotFaction(wp, FACTION_TEMPLATE_NEUTRAL_HOSTILE, false, true))\n+                        spawns_n.emplace_back(wp);\n+                }\n+            }\n+        });\n+\n+        bool found_maxlevel_node_a = false;\n+        bool found_maxlevel_node_h = false;\n+        bool found_maxlevel_node_n = false;\n+        const uint8 maxof_minclasslvl_nor = BotDataMgr::GetMinLevelForBotClass(BOT_CLASS_DEATH_KNIGHT); // 55\n+        const uint8 maxof_minclasslvl_ex = BotDataMgr::GetMinLevelForBotClass(BOT_CLASS_DREADLORD); // 60\n+        for (WanderNode const* wp : spawns_a)\n+        {\n+            if (wp->GetLevels().second >= maxof_minclasslvl_nor)\n+            {\n+                found_maxlevel_node_a = true;\n+                break;\n+            }\n+        }\n+        for (WanderNode const* wp : spawns_h)\n+        {\n+            if (wp->GetLevels().second >= maxof_minclasslvl_nor)\n+            {\n+                found_maxlevel_node_h = true;\n+                break;\n+            }\n+        }\n+        for (WanderNode const* wp : spawns_n)\n+        {\n+            if (wp->GetLevels().second >= maxof_minclasslvl_ex)\n+            {\n+                found_maxlevel_node_n = true;\n+                break;\n+            }\n+        }\n+\n+        PctBrackets bracketPcts{};\n+        PctBrackets bots_per_bracket{};\n+\n+        std::vector<std::pair<uint8, uint32>> teamSpareBotIdsPerClass;\n+        teamSpareBotIdsPerClass.reserve(count);\n+\n+        if (team == -1)\n+        {\n+            if (!found_maxlevel_node_a || !found_maxlevel_node_h || !found_maxlevel_node_n)\n+                return false;\n+\n+            //make a full copy\n+            for (auto const& [bot_class, spare_bots] : _spareBotIdsPerClassMap)\n+                for (uint32 spareBotId : spare_bots)\n+                    teamSpareBotIdsPerClass.emplace_back(bot_class, spareBotId);\n+            bracketPcts = BotCfg::GetBotWandererLevelBrackets();\n+        }\n+        else\n+        {\n+            ASSERT(bracketEntry);\n+\n+            bracketPcts[bracketEntry->minLevel / 10] = 100u;\n+            switch (team)\n+            {\n+                case ALLIANCE:\n+                    if (!found_maxlevel_node_a)\n+                        return false;\n+                    break;\n+                case HORDE:\n+                    if (!found_maxlevel_node_h)\n+                        return false;\n+                    break;\n+                case TEAM_OTHER:\n+                default:\n+                    if (!found_maxlevel_node_n)\n+                        return false;\n+                    break;\n+            }\n+\n+            for (auto const& [bot_class, spare_bots] : _spareBotIdsPerClassMap)\n+            {\n+                for (uint32 spareBotId : spare_bots)\n+                {\n+                    NpcBotExtras const* orig_extras = ASSERT_NOTNULL(BotDataMgr::SelectNpcBotExtras(spareBotId));\n+                    uint32 bot_faction = BotDataMgr::GetDefaultFactionForBotRaceClass(orig_extras->bclass, orig_extras->race);\n+                    uint32 botTeam = BotDataMgr::GetTeamForFaction(bot_faction);\n+\n+                    if (int32(botTeam) != team)\n+                        continue;\n+\n+                    if (BotDataMgr::GetMinLevelForBotClass(bot_class) > bracketEntry->maxLevel)\n+                        continue;\n+\n+                    teamSpareBotIdsPerClass.emplace_back(bot_class, spareBotId);\n+                }\n+            }\n+        }\n+\n+        if (teamSpareBotIdsPerClass.empty())\n+            return false;\n+\n+        uint32 total_bots_in_brackets = 0;\n+        for (size_t k{}; k < BRACKETS_COUNT; ++k)\n+        {\n+            if (!bracketPcts[k])\n+                continue;\n+            bots_per_bracket[k] = CalculatePct(count, bracketPcts[k]);\n+            total_bots_in_brackets += bots_per_bracket[k];\n+        }\n+        for (std::make_signed_t<std::size_t> j = BRACKETS_COUNT - 1; j >= 0; --j)\n+        {\n+            if (bots_per_bracket[j])\n+            {\n+                bots_per_bracket[j] += count - total_bots_in_brackets;\n+                break;\n+            }\n+        }\n+\n+        std::vector<uint8> brackets_shuffled;\n+        brackets_shuffled.reserve(count);\n+        for (uint8 bracket{}; bracket < BRACKETS_COUNT; ++bracket)\n+        {\n+            while (bots_per_bracket[bracket])\n+            {\n+                brackets_shuffled.push_back(bracket);\n+                --bots_per_bracket[bracket];\n+            }\n+        }\n+\n+        Bcore::Containers::RandomShuffle(teamSpareBotIdsPerClass);\n+        Bcore::Containers::RandomShuffle(brackets_shuffled);\n+\n+        for (std::size_t i{}; i < brackets_shuffled.size() && !teamSpareBotIdsPerClass.empty();) // i is a counter, NOT used as index or value\n+        {\n+            uint8 bracket = brackets_shuffled[i];\n+\n+            int8 tries = 100;\n+            do {\n+                --tries;\n+                if (GenerateWanderingBotToSpawn(teamSpareBotIdsPerClass.back(), bracket, spawns_a, spawns_h, spawns_n, immediate, bracketEntry, registry))\n+                {\n+                    ++i;\n+                    ++spawned;\n+                    teamSpareBotIdsPerClass.pop_back();\n+                    break;\n+                }\n+            } while (tries >= 0);\n+\n+            if (tries < 0)\n+                return false;\n+        }\n+\n+        CharacterDatabase.Execute(\"UPDATE worldstates SET value = {} WHERE entry = {}\", next_bot_id, uint32(BOT_GIVER_ENTRY));\n+\n+        return true;\n+    }\n+\n+    static WanderingBotsGenerator* instance()\n+    {\n+        static WanderingBotsGenerator _instance;\n+        return &_instance;\n+    }\n+};\n+#define sBotGen WanderingBotsGenerator::instance()\n+\n+void BotDataMgr::Update(uint32 diff)\n+{\n+    botSpawnEvents.Update(diff);\n+    for (auto& [_, events] : botBGJoinEvents)\n+        events.Update(diff);\n+\n+    //lock is not needed here\n+    for (Creature const* bot : _existingBots)\n+    {\n+        if (bot->IsFreeBot() && !bot->IsWandererBot() && !bot->IsInWorld() && bot->FindMap() && !!SelectNpcBotData(bot->GetEntry()))\n+        {\n+            bot->GetBotAI()->CommonTimers(diff);\n+            bot->GetBotAI()->UpdateAI(diff);\n+        }\n+    }\n+\n+    if (!_botsWanderCreaturesToDespawn.empty())\n+    {\n+        BOT_LOG_DEBUG(\"npcbots\", \"Bots to despawn: {}\", uint32(_botsWanderCreaturesToDespawn.size()));\n+\n+        while (!_botsWanderCreaturesToDespawn.empty())\n+        {\n+            uint32 bot_despawn_id = *_botsWanderCreaturesToDespawn.begin();\n+\n+            Creature* bot = const_cast<Creature*>(ASSERT_NOTNULL(FindBot(bot_despawn_id)));\n+\n+            if (!bot->IsInWorld())\n+                break;\n+\n+            _botsWanderCreaturesToDespawn.erase(bot_despawn_id);\n+\n+            uint32 origEntry = _botsWanderCreatureTemplates.at(bot_despawn_id).KillCredit[0];\n+            std::string_view botName = bot->GetName();\n+\n+            _spareBotIdsPerClassMap[bot->GetBotClass()].insert(origEntry);\n+\n+            BotMgr::CleanupsBeforeBotDelete(bot);\n+            bot->GetBotAI()->canUpdate = false;\n+            bot->GetMap()->AddObjectToRemoveList(bot);\n+\n+            auto bditr = _botsData.find(bot_despawn_id);\n+            auto beitr = _botsExtras.find(bot_despawn_id);\n+            auto baditr = _botsAppearanceData.find(bot_despawn_id);\n+            auto bwcetitr = _botsWanderCreatureEquipmentTemplates.find(bot_despawn_id);\n+            auto bwctitr = _botsWanderCreatureTemplates.find(bot_despawn_id);\n+\n+            ASSERT(bditr != _botsData.end());\n+            ASSERT(beitr != _botsExtras.end());\n+            //ASSERT(baditr != _botsAppearanceData.end()); may not exist\n+            ASSERT(bwcetitr != _botsWanderCreatureEquipmentTemplates.end());\n+            ASSERT(bwctitr != _botsWanderCreatureTemplates.end());\n+\n+            _botsData.erase(bditr);\n+            _botsExtras.erase(beitr);\n+            if (baditr != _botsAppearanceData.end())\n+                _botsAppearanceData.erase(baditr);\n+            _botsWanderCreatureEquipmentTemplates.erase(bwcetitr);\n+            _botsWanderCreatureTemplates.erase(bwctitr);\n+\n+            BOT_LOG_DEBUG(\"npcbots\", \"Despawned wanderer bot {} '{}' (orig {})\", bot_despawn_id, botName, origEntry);\n+        }\n+    }\n+\n+    if (!_botsWanderCreaturesToSpawn.empty())\n+    {\n+        static const uint32 WANDERING_BOT_SPAWN_DELAY = 500;\n+\n+        next_wandering_bot_spawn_delay += diff;\n+\n+        while (next_wandering_bot_spawn_delay >= WANDERING_BOT_SPAWN_DELAY && !_botsWanderCreaturesToSpawn.empty())\n+        {\n+            next_wandering_bot_spawn_delay -= WANDERING_BOT_SPAWN_DELAY;\n+\n+            auto const& p = _botsWanderCreaturesToSpawn.front();\n+\n+            uint32 bot_id = p.first;\n+            WanderNode const* spawnLoc = p.second;\n+\n+            _botsWanderCreaturesToSpawn.pop_front();\n+\n+            SpawnWandererBot(bot_id, spawnLoc, nullptr);\n+        }\n+\n+        return;\n+    }\n+}\n+\n+std::shared_mutex* BotDataMgr::GetLock()\n+{\n+    static std::shared_mutex _lock;\n+    return &_lock;\n+}\n+\n+bool BotDataMgr::AllBotsLoaded()\n+{\n+    return allBotsLoaded;\n+}\n+\n+void BotDataMgr::LoadNpcBots(bool spawn)\n+{\n+    if (allBotsLoaded)\n+        return;\n+\n+    BOT_LOG_INFO(\"server.loading\", \"Starting NpcBot system...\");\n+\n+    GenerateBotCustomSpells();\n+\n+    uint32 botoldMSTime = getMSTime();\n+\n+    Field* field;\n+    uint8 index;\n+\n+    //                                                      1       2     3     4     5          6\n+    QueryResult result = WorldDatabase.Query(\"SELECT entry, gender, skin, face, hair, haircolor, features FROM creature_template_npcbot_appearance\");\n+    if (result)\n+    {\n+        do\n+        {\n+            field = result->Fetch();\n+            index = 0;\n+            uint32 entry = field[  index].Get<uint32>();\n+\n+            if (!sObjectMgr->GetCreatureTemplate(entry))\n+            {\n+                BOT_LOG_ERROR(\"server.loading\", \"Bot entry {} has appearance data but doesn't exist in `creature_template` table! Skipped.\", entry);\n+                continue;\n+            }\n+\n+            uint8 bot_gender =    field[++index].Get<uint8>();\n+            uint8 bot_skin =      field[++index].Get<uint8>();\n+            uint8 bot_face =      field[++index].Get<uint8>();\n+            uint8 bot_hair =      field[++index].Get<uint8>();\n+            uint8 bot_haircolor = field[++index].Get<uint8>();\n+            uint8 bot_features =  field[++index].Get<uint8>();\n+\n+            _botsAppearanceData.emplace(std::piecewise_construct, std::forward_as_tuple(entry), std::forward_as_tuple(bot_gender, bot_skin, bot_face, bot_hair, bot_haircolor, bot_features));\n+\n+        } while (result->NextRow());\n+\n+        BOT_LOG_INFO(\"server.loading\", \">> Bot appearance data loaded\");\n+    }\n+    else\n+        BOT_LOG_INFO(\"server.loading\", \">> Bots appearance data is not loaded. Table `creature_template_npcbot_appearance` is empty!\");\n+\n+    //                                          1      2\n+    result = WorldDatabase.Query(\"SELECT entry, class, race FROM creature_template_npcbot_extras\");\n+    if (result)\n+    {\n+        do\n+        {\n+            field = result->Fetch();\n+            index = 0;\n+            uint32 entry =      field[  index].Get<uint32>();\n+\n+            if (!sObjectMgr->GetCreatureTemplate(entry))\n+            {\n+                BOT_LOG_ERROR(\"server.loading\", \"Bot entry {} has extras data but doesn't exist in `creature_template` table! Skipped.\", entry);\n+                continue;\n+            }\n+\n+            uint8 bot_class = field[++index].Get<uint8>();\n+            uint8 bot_race =  field[++index].Get<uint8>();\n+\n+            _botsExtras.emplace(entry, NpcBotExtras{ .race = bot_race, .bclass = bot_class });\n+\n+        } while (result->NextRow());\n+\n+        BOT_LOG_INFO(\"server.loading\", \">> Bot race data loaded\");\n+    }\n+    else\n+        BOT_LOG_INFO(\"server.loading\", \">> Bots race data is not loaded. Table `creature_template_npcbot_extras` is empty!\");\n+\n+    //                                              1     2        3\n+    result = CharacterDatabase.Query(\"SELECT entry, slot, item_id, fake_id FROM characters_npcbot_transmog\");\n+    if (result)\n+    {\n+        do\n+        {\n+            field = result->Fetch();\n+            index = 0;\n+            uint32 entry =          field[  index].Get<uint32>();\n+\n+            if (!sObjectMgr->GetCreatureTemplate(entry))\n+            {\n+                BOT_LOG_ERROR(\"server.loading\", \"Bot entry {} has transmog data but doesn't exist in `creature_template` table! Skipped.\", entry);\n+                continue;\n+            }\n+\n+            _botsTransmogData.try_emplace(entry, NpcBotTransmogData{});\n+\n+            //load data\n+            uint8 slot =            field[++index].Get<uint8>();\n+            uint32 item_id =        field[++index].Get<uint32>();\n+            int32 fake_id =         field[++index].Get<int32>();\n+\n+            _botsTransmogData[entry].transmogs.at(slot) = {item_id, fake_id};\n+\n+        } while (result->NextRow());\n+\n+        BOT_LOG_INFO(\"server.loading\", \">> Bot transmog data loaded\");\n+    }\n+    else\n+        BOT_LOG_INFO(\"server.loading\", \">> Bots transmog data is not loaded. Table `characters_npcbot_transmog` is empty!\");\n+\n+    //                                       0      1      2      3     4        5                          6\n+    result = CharacterDatabase.Query(\"SELECT entry, owner, roles, spec, faction, UNIX_TIMESTAMP(hire_time), shared_owners, \"\n+    //   7          8          9          10              11          12          13         14         15\n+        \"equipMhEx, equipOhEx, equipRhEx, equipHead, equipShoulders, equipChest, equipWaist, equipLegs, equipFeet, \"\n+    //   16          17          18         19         20            21            22             23             24\n+        \"equipWrist, equipHands, equipBack, equipBody, equipFinger1, equipFinger2, equipTrinket1, equipTrinket2, equipNeck, \"\n+    //   25               26\n+        \"spells_disabled, miscvalues FROM characters_npcbot\");\n+\n+    std::vector<uint32> entryList;\n+    if (result)\n+    {\n+        uint32 botcounter = 0;\n+        uint32 datacounter = 0;\n+        std::set<uint32> botgrids;\n+        QueryResult infores;\n+        CreatureTemplate const* proto;\n+        entryList.reserve(result->GetRowCount());\n+\n+        do\n+        {\n+            field = result->Fetch();\n+            index = 0;\n+            uint32 entry =          field[  index].Get<uint32>();\n+\n+            if (!sObjectMgr->GetCreatureTemplate(entry))\n+            {\n+                BOT_LOG_ERROR(\"server.loading\", \"Bot entry {} doesn't exist in `creature_template` table! Skipped.\", entry);\n+                continue;\n+            }\n+\n+            //load data\n+            uint32 bot_owner =          field[++index].Get<uint32>();\n+            uint32 bot_roles =          field[++index].Get<uint32>();\n+            uint8  bot_spec =           field[++index].Get<uint8>();\n+            uint32 bot_faction =        field[++index].Get<uint32>();\n+            uint64 bot_hire_time =      field[++index].Get<uint64>();\n+\n+            entryList.push_back(entry);\n+            _botsData.emplace(std::piecewise_construct, std::forward_as_tuple(entry), std::forward_as_tuple(bot_owner, bot_hire_time, bot_roles, bot_faction, bot_spec));\n+            auto& bot_data = _botsData.at(entry);\n+\n+            for (std::string_view shared_owner_sv : Bcore::Tokenize(field[++index].Get<std::string_view>(), ' ', false))\n+            {\n+                if (Optional<uint32> showner_guid = Bcore::StringTo<uint32>(shared_owner_sv))\n+                {\n+                    const ObjectGuid showner_pguid = ObjectGuid::Create<HighGuid::Player>(*showner_guid);\n+                    if (!sCharacterCache->HasCharacterCacheEntry(showner_pguid))\n+                    {\n+                        BOT_LOG_WARN(\"server.loading\", \"Bot entry {} has shared owner {} which doesn't exist! Skipped.\", entry, *showner_guid);\n+                        continue;\n+                    }\n+                    bot_data.shared_owners.insert(*showner_guid);\n+                }\n+            }\n+\n+            for (uint8 i = BOT_SLOT_MAINHAND; i != BOT_INVENTORY_SIZE; ++i)\n+                bot_data.equips[i] = field[++index].Get<uint32>();\n+\n+            std::string disabled_spells_str = field[++index].Get<std::string>();\n+            if (!disabled_spells_str.empty())\n+            {\n+                std::vector<std::string_view> tok = Bcore::Tokenize(disabled_spells_str, ' ', false);\n+                for (std::size_t i{}; i != tok.size(); ++i)\n+                    bot_data.disabled_spells.insert(*(Bcore::StringTo<uint32>(tok[i])));\n+            }\n+\n+            std::string miscvalues_str = field[++index].Get<std::string>();\n+            if (!miscvalues_str.empty())\n+            {\n+                std::vector<std::string_view> tok = Bcore::Tokenize(miscvalues_str, ' ', false);\n+                for (std::size_t i{}; i != tok.size(); ++i)\n+                {\n+                    std::vector<std::string_view> tok2 = Bcore::Tokenize(tok[i], ':', false);\n+                    bot_data.miscvalues.emplace(*(Bcore::StringTo<uint32>(tok2[0])), *(Bcore::StringTo<uint32>(tok2[1])));\n+                }\n+            }\n+\n+            ++datacounter;\n+\n+        } while (result->NextRow());\n+\n+        BOT_LOG_INFO(\"server.loading\", \">> Loaded {} bot data entries\", datacounter);\n+\n+        if (spawn)\n+        {\n+            for (uint32 entry : entryList)\n+            {\n+                proto = sObjectMgr->GetCreatureTemplate(entry);\n+                //                                     1     2    3           4           5           6\n+                infores = WorldDatabase.Query(\"SELECT guid, map, position_x, position_y, position_z, orientation FROM creature WHERE id1 = {}\", entry);\n+                if (!infores)\n+                {\n+                    BOT_LOG_ERROR(\"server.loading\", \"Cannot spawn npcbot {} (id: {}), not found in `creature` table!\", proto->Name.c_str(), entry);\n+                    continue;\n+                }\n+\n+                field = infores->Fetch();\n+                uint32 tableGuid = field[0].Get<uint32>();\n+                uint32 mapId = uint32(field[1].Get<uint16>());\n+                float pos_x = field[2].Get<float>();\n+                float pos_y = field[3].Get<float>();\n+                float pos_z = field[4].Get<float>();\n+                float ori = field[5].Get<float>();\n+\n+                CellCoord c = Bcore::ComputeCellCoord(pos_x, pos_y);\n+                GridCoord g = Bcore::ComputeGridCoord(pos_x, pos_y);\n+                ASSERT(c.IsCoordValid(), \"Invalid Cell coord!\");\n+                ASSERT(g.IsCoordValid(), \"Invalid Grid coord!\");\n+                Map* map = sMapMgr->CreateBaseMap(mapId);\n+                Position spawnPos(pos_x, pos_y, pos_z, ori);\n+                Creature* bot = new Creature();\n+                if (!bot->LoadBotCreatureFromDB(tableGuid, map, false, false, entry, &spawnPos))\n+                {\n+                    delete bot;\n+                    BOT_LOG_FATAL(\"server.loading\", \"Cannot load npcbot {} from DB!\", entry);\n+                    ABORT();\n+                }\n+\n+                if (!bot->AIM_Initialize())\n+                {\n+                    delete bot;\n+                    BOT_LOG_FATAL(\"server.loading\", \"Cannot initialize npcbot {} AI!\", entry);\n+                    ABORT();\n+                }\n+\n+                if (!bot->IsAlive())\n+                {\n+                    BOT_LOG_WARN(\"server.loading\", \"bot {} is dead, respawning!\", entry);\n+                    bot->setDeathState(DeathState::JustRespawned);\n+                }\n+\n+                BOT_LOG_DEBUG(\"server.loading\", \">> Spawned npcbot {} (id: {}, map: {}, grid: {}, cell: {})\", proto->Name.c_str(), entry, mapId, g.GetId(), c.GetId());\n+                botgrids.insert(g.GetId());\n+                ++botcounter;\n+            }\n+\n+            BOT_LOG_INFO(\"server.loading\", \">> Spawned {} npcbot(s) within {} grid(s) in {} ms\", botcounter, uint32(botgrids.size()), GetMSTimeDiffToNow(botoldMSTime));\n+        }\n+    }\n+    else\n+        BOT_LOG_INFO(\"server.loading\", \">> Loaded 0 npcbots. Table `characters_npcbot` is empty!\");\n+\n+    std::vector<uint32> invalid_ids;\n+\n+    auto report_inavlid_ids = [&invalid_ids](std::string_view error_msg) {\n+        std::ostringstream ss;\n+        ss << error_msg << \" IDs: \";\n+        for (uint32 bot_id : invalid_ids)\n+            ss << Bcore::ToString(bot_id) << \", \";\n+        ss << \"\\nFix your DB contents and retry\";\n+        ABORT(ss.str());\n+    };\n+\n+    for (auto const& [_, cdata] : sObjectMgr->GetAllCreatureData())\n+        if (cdata.id1 >= BOT_ENTRY_BEGIN && sObjectMgr->GetCreatureTemplate(cdata.id1)->IsNPCBot() && std::ranges::find(entryList, cdata.id1) == entryList.cend())\n+            invalid_ids.push_back(cdata.id1);\n+\n+    if (!invalid_ids.empty())\n+    {\n+        report_inavlid_ids(\"Invalid NPCBot spawns found in `creature` table having no data in `characters_npcbot` table!\");\n+        invalid_ids.clear();\n+    }\n+\n+    for (uint32 bot_id : entryList)\n+        if (!_botsExtras.contains(bot_id))\n+            invalid_ids.push_back(bot_id);\n+\n+    if (!invalid_ids.empty())\n+    {\n+        report_inavlid_ids(\"Invalid NPCBots found in `characters_npcbot` table having no data in `creature_template_npcbot_extras` table!\");\n+        invalid_ids.clear();\n+    }\n+\n+    allBotsLoaded = true;\n+}\n+\n+void BotDataMgr::LoadNpcBotGroupData()\n+{\n+    BOT_LOG_INFO(\"server.loading\", \"Loading NPCBot group members...\");\n+\n+    uint32 oldMSTime = getMSTime();\n+\n+    CharacterDatabase.DirectExecute(\"DELETE FROM characters_npcbot_group_member WHERE guid NOT IN (SELECT guid FROM `groups`)\");\n+    CharacterDatabase.DirectExecute(\"DELETE FROM characters_npcbot_group_member WHERE entry NOT IN (SELECT entry FROM characters_npcbot)\");\n+\n+    //                                                   0     1      2            3         4\n+    QueryResult result = CharacterDatabase.Query(\"SELECT guid, entry, memberFlags, subgroup, roles FROM characters_npcbot_group_member ORDER BY guid\");\n+    if (!result)\n+    {\n+        BOT_LOG_INFO(\"server.loading\", \">> Loaded 0 NPCBot group members. DB table `characters_npcbot_group_member` is empty!\");\n+        return;\n+    }\n+\n+    uint32 count = 0;\n+    do\n+    {\n+        Field* fields = result->Fetch();\n+\n+        uint32 creature_id = fields[1].Get<uint32>();\n+        uint8 subgroup = fields[3].Get<uint8>();\n+        if (!SelectNpcBotExtras(creature_id))\n+        {\n+            BOT_LOG_WARN(\"server.loading\", \"Table `characters_npcbot_group_member` contains non-NPCBot creature {} which will not be loaded!\", creature_id);\n+            continue;\n+        }\n+\n+        if (Group* group = sGroupMgr->GetGroupByGUID(fields[0].Get<uint32>()))\n+        {\n+            group->LoadCreatureMemberFromDB(creature_id, fields[2].Get<uint8>(), subgroup, fields[4].Get<uint8>());\n+            const_cast<Creature*>(ASSERT_NOTNULL(BotDataMgr::FindBot(creature_id)))->SetBotGroup(group, subgroup);\n+        }\n+        else\n+            BOT_LOG_ERROR(\"misc\", \"BotDataMgr::LoadNpcBotGroupData: Consistency failed, can't find group (storage id: {})\", fields[0].Get<uint32>());\n+\n+        ++count;\n+\n+    } while (result->NextRow());\n+\n+    BOT_LOG_INFO(\"server.loading\", \">> Loaded {} NPCBot group members in {} ms\", count, GetMSTimeDiffToNow(oldMSTime));\n+}\n+\n+void BotDataMgr::LoadNpcBotGearStorage()\n+{\n+    BOT_LOG_INFO(\"server.loading\", \"Loading NPCBot items storage...\");\n+\n+    uint32 oldMSTime = getMSTime();\n+\n+    QueryResult result = CharacterDatabase.Query(\n+    //          0               1                   2         3            4           5         6                7                    8              9              10       11       12            13             14       15\n+        \"SELECT ii.creatorGuid, ii.giftCreatorGuid, ii.count, ii.duration, ii.charges, ii.flags, ii.enchantments, ii.randomPropertyId, ii.durability, ii.playedTime, ii.text, ii.guid, ii.itemEntry, ii.owner_guid, gs.guid, gs.item_guid\"\n+        \" FROM  characters_npcbot_gear_storage gs JOIN item_instance ii ON gs.item_guid = ii.guid ORDER BY gs.guid, gs.item_guid\");\n+    if (!result)\n+    {\n+        BOT_LOG_INFO(\"server.loading\", \">> Loaded 0 NPCBot stored gear items. DB table `characters_npcbot_gear_storage` is empty!\");\n+        return;\n+    }\n+\n+    uint32 count = 0;\n+    std::set<uint32> player_guids;\n+    do\n+    {\n+        Field* fields = result->Fetch();\n+\n+        uint32 item_id = fields[12].Get<uint32>();\n+        uint32 player_guidlow = fields[14].Get<uint32>();\n+        uint32 item_guidlow = fields[15].Get<uint32>();\n+\n+        Item* item = new Item();\n+        ObjectGuid player_guid = ObjectGuid::Create<HighGuid::Player>(player_guidlow);\n+        ASSERT(item->LoadFromDB(item_guidlow, player_guid, fields, item_id), \"LoadNpcBotGearStorage(): unable to load item {} id {}! Owner: {}\", item_guidlow, item_id, player_guid.ToString().c_str());\n+\n+        _botStoredGearMap[player_guid].insert(item);\n+        player_guids.insert(player_guidlow);\n+        ++count;\n+\n+    } while (result->NextRow());\n+\n+    BOT_LOG_INFO(\"server.loading\", \">> Loaded {} NPCBot stored items for {} bot owners in {} ms\", count, uint32(player_guids.size()), GetMSTimeDiffToNow(oldMSTime));\n+}\n+\n+void BotDataMgr::LoadNpcBotGearSets()\n+{\n+    BOT_LOG_INFO(\"server.loading\", \"Loading NPCBot item sets...\");\n+\n+    uint32 oldMSTime = getMSTime();\n+\n+    static auto MAKE_PAIR64 = [](uint32 l, uint32 h) { return uint64(l | (uint64(h) << 32)); };\n+    auto make_set_guid = [](uint32 plow, uint8 set_id) { return MAKE_PAIR64(plow, set_id); };\n+    auto unpack_set_guid = [](uint64 set_guid) { return std::tuple(PAIR64_LOPART(set_guid), (uint8)PAIR64_HIPART(set_guid)); };\n+\n+    //                                                   0      1       2\n+    QueryResult result = CharacterDatabase.Query(\"SELECT owner, set_id, set_name FROM characters_npcbot_gear_set\");\n+    if (!result)\n+    {\n+        BOT_LOG_INFO(\"server.loading\", \">> Loaded 0 NPCBot item sets. DB table `characters_npcbot_gear_set` is empty!\");\n+        return;\n+    }\n+\n+    std::set<uint32> player_guids;\n+    std::set<uint64> set_guids;\n+    do\n+    {\n+        Field* fields = result->Fetch();\n+\n+        uint32 player_guidlow = fields[0].Get<uint32>();\n+        uint8 set_id          = fields[1].Get<uint8>();\n+        std::string set_name  = fields[2].Get<std::string>();\n+\n+        ObjectGuid player_guid = ObjectGuid::Create<HighGuid::Player>(player_guidlow);\n+\n+        UpdateBotItemSet(player_guid, set_id, std::move(set_name));\n+\n+        player_guids.insert(player_guidlow);\n+        set_guids.insert(make_set_guid(player_guidlow, set_id));\n+\n+    } while (result->NextRow());\n+\n+    //                                       0      1       2     3\n+    result = CharacterDatabase.Query(\"SELECT owner, set_id, slot, item_id FROM characters_npcbot_gear_set_item ORDER BY owner,set_id,slot\");\n+\n+    std::set<uint64> invalid_sets;\n+    if (!result)\n+        invalid_sets = set_guids; //full copy\n+    else\n+    {\n+        do\n+        {\n+            Field* fields = result->Fetch();\n+\n+            uint32 player_guidlow = fields[0].Get<uint32>();\n+            uint8 set_id          = fields[1].Get<uint8>();\n+            uint8 slot            = fields[2].Get<uint8>();\n+            uint32 item_id        = fields[3].Get<uint32>();\n+\n+            uint64 set_guid = make_set_guid(player_guidlow, set_id);\n+\n+            if (!player_guids.contains(player_guidlow))\n+            {\n+                BOT_LOG_ERROR(\"server.loading\", \"Table `characters_npcbot_gear_set_item` contains values '{} {} {}' for non-existent player {}. Removing!\",\n+                    uint32(set_id), uint32(slot), item_id, player_guidlow);\n+                invalid_sets.insert(set_guid);\n+                continue;\n+            }\n+\n+            if (!set_guids.contains(set_guid))\n+            {\n+                BOT_LOG_ERROR(\"server.loading\", \"Table `characters_npcbot_gear_set_item` contains values '{} {}' for non-existent item set {} (player {}). Removing!\",\n+                    uint32(slot), item_id, uint32(set_id), player_guidlow);\n+                invalid_sets.insert(set_guid);\n+                continue;\n+            }\n+\n+            if (set_id >= MAX_BOT_EQUIPMENT_SETS)\n+            {\n+                BOT_LOG_ERROR(\"server.loading\", \"Table `characters_npcbot_gear_set_item` contains invalid set id {} (player {}). Removing!\",\n+                    uint32(set_id), player_guidlow);\n+                invalid_sets.insert(set_guid);\n+                continue;\n+            }\n+\n+            if (slot >= BOT_INVENTORY_SIZE)\n+            {\n+                BOT_LOG_ERROR(\"server.loading\", \"Table `characters_npcbot_gear_set_item` contains invalid slot {} for item set {} (player {}). Removing!\",\n+                    uint32(slot), uint32(set_id), player_guidlow);\n+                invalid_sets.insert(set_guid);\n+                continue;\n+            }\n+\n+            if (!sObjectMgr->GetItemTemplate(item_id))\n+            {\n+                BOT_LOG_ERROR(\"server.loading\", \"Table `characters_npcbot_gear_set_item` contains invalid item id {} in slot {} for item set {} (player {}). Removing!\",\n+                    item_id, uint32(slot), uint32(set_id), player_guidlow);\n+                invalid_sets.insert(set_guid);\n+                continue;\n+            }\n+\n+            ObjectGuid player_guid = ObjectGuid::Create<HighGuid::Player>(player_guidlow);\n+\n+            UpdateBotItemSet(player_guid, set_id, slot, item_id);\n+\n+        } while (result->NextRow());\n+    }\n+\n+    if (!invalid_sets.empty())\n+    {\n+        CharacterDatabaseTransaction ctrans = CharacterDatabase.BeginTransaction();\n+        for (uint64 set_guid : invalid_sets)\n+        {\n+            set_guids.erase(set_guid);\n+            auto [player_guidlow, set_id] = unpack_set_guid(set_guid);\n+            ObjectGuid player_guid = ObjectGuid::Create<HighGuid::Player>(player_guidlow);\n+            _botStoredGearSetMap.at(player_guid).at(set_id).clear();\n+            ctrans->Append(\"DELETE FROM characters_npcbot_gear_set_item WHERE owner = {} and set_id = {}\", player_guidlow, uint32(set_id));\n+        }\n+\n+        std::set<ObjectGuid::LowType> invalid_players;\n+        for (auto const& [guid, itemsets] : _botStoredGearSetMap)\n+        {\n+            if (std::ranges::all_of(itemsets, [](NpcBotItemSet const& arr) { return arr.is_empty(); }))\n+            {\n+                invalid_players.insert(guid.GetCounter());\n+                ctrans->Append(\"DELETE FROM characters_npcbot_gear_set WHERE owner = {}\", guid.GetCounter());\n+                ctrans->Append(\"DELETE FROM characters_npcbot_gear_set_item WHERE owner = {}\", guid.GetCounter());\n+            }\n+        }\n+        CharacterDatabase.CommitTransaction(ctrans);\n+\n+        for (ObjectGuid::LowType player_guidlow : invalid_players)\n+        {\n+            player_guids.erase(player_guidlow);\n+            _botStoredGearSetMap.erase(ObjectGuid::Create<HighGuid::Player>(player_guidlow));\n+        }\n+    }\n+\n+    BOT_LOG_INFO(\"server.loading\", \">> Loaded {} NPCBot item sets for {} bot owners in {} ms\", uint32(set_guids.size()), uint32(player_guids.size()), GetMSTimeDiffToNow(oldMSTime));\n+}\n+\n+void BotDataMgr::LoadNpcBotMgrData()\n+{\n+    BOT_LOG_INFO(\"server.loading\", \"Loading NPCBot managers data...\");\n+\n+    uint32 oldMSTime = getMSTime();\n+\n+    //                                                   0      1            2            3                  4                  5                 6                  7\n+    QueryResult result = CharacterDatabase.Query(\"SELECT owner, dist_follow, dist_attack, attack_range_mode, attack_angle_mode, engage_delay_dps, engage_delay_heal, flags FROM characters_npcbot_settings\");\n+    if (result)\n+    {\n+        do\n+        {\n+            Field* fields = result->Fetch();\n+\n+            uint32 idx = 0;\n+            ObjectGuid player_guid = ObjectGuid::Create<HighGuid::Player>(fields[  idx].Get<uint32>());\n+\n+            if (!sCharacterCache->HasCharacterCacheEntry(player_guid))\n+            {\n+                BOT_LOG_ERROR(\"server.loading\", \"Player {} found in table `characters_npcbot_settings` doesn't exist!\", player_guid.GetCounter());\n+                BotDataMgr::RemoveNpcBotMgrDataFromDB(player_guid);\n+                continue;\n+            }\n+\n+            uint8 dist_follow        = fields[++idx].Get<uint8>();\n+            uint8 dist_attack        = fields[++idx].Get<uint8>();\n+            uint8 attack_range_mode  = fields[++idx].Get<uint8>();\n+            uint8 attack_angle_mode  = fields[++idx].Get<uint8>();\n+            uint32 engage_delay_dps  = fields[++idx].Get<uint32>();\n+            uint32 engage_delay_heal = fields[++idx].Get<uint32>();\n+            uint32 flags             = fields[++idx].Get<uint32>();\n+\n+            if (dist_follow > 100)\n+            {\n+                BOT_LOG_WARN(\"server.loading\", \"Bot follow distance has invalid value {} > 100 for player {}, reduced!\", uint32(dist_follow), player_guid.GetCounter());\n+                dist_follow = 100;\n+            }\n+            if (dist_attack > 50)\n+            {\n+                BOT_LOG_WARN(\"server.loading\", \"Bot attack distance has invalid value {} > 50 for player {}, reduced!\", uint32(dist_attack), player_guid.GetCounter());\n+                dist_attack = 50;\n+            }\n+            if (attack_range_mode > BOT_ATTACK_RANGE_END)\n+            {\n+                BOT_LOG_WARN(\"server.loading\", \"Bot attack range mode has invalid value {} for player {}, reset to default!\", uint32(attack_range_mode), player_guid.GetCounter());\n+                attack_range_mode = BOT_ATTACK_RANGE_SHORT;\n+            }\n+            if (attack_angle_mode > BOT_ATTACK_ANGLE_END)\n+            {\n+                BOT_LOG_WARN(\"server.loading\", \"Bot attack angle mode has invalid value {} for player {}, reset to default!\", uint32(attack_angle_mode), player_guid.GetCounter());\n+                attack_angle_mode = BOT_ATTACK_ANGLE_NORMAL;\n+            }\n+            if (engage_delay_dps > 10 * IN_MILLISECONDS)\n+            {\n+                BOT_LOG_WARN(\"server.loading\", \"Bot dps engage timer has invalid value {} for player {}, reduced!\", engage_delay_dps, player_guid.GetCounter());\n+                engage_delay_dps = BotCfg::GetEngageDelayDPSDefault();\n+            }\n+            if (engage_delay_heal > 10 * IN_MILLISECONDS)\n+            {\n+                BOT_LOG_WARN(\"server.loading\", \"Bot heal engage timer has invalid value {} for player {}, reduced!\", engage_delay_heal, player_guid.GetCounter());\n+                engage_delay_heal = BotCfg::GetEngageDelayHealDefault();\n+            }\n+            if (flags & ~NPCBOT_MGR_FLAG_MASK_ALL_ALLOWED)\n+            {\n+                BOT_LOG_WARN(\"server.loading\", \"Bot manager flags have invalid value {} for player {}, removing invalid flags!\", flags, player_guid.GetCounter());\n+                flags &= NPCBOT_MGR_FLAG_MASK_ALL_ALLOWED;\n+            }\n+\n+            _botMgrsData.emplace(std::piecewise_construct, std::forward_as_tuple(player_guid), std::forward_as_tuple(dist_follow, dist_attack, attack_range_mode, attack_angle_mode, engage_delay_dps, engage_delay_heal, flags));\n+\n+        } while (result->NextRow());\n+\n+        BOT_LOG_INFO(\"server.loading\", \">> Loaded NPCBot manager data for {} bot owners in {} ms\", uint32(_botMgrsData.size()), GetMSTimeDiffToNow(oldMSTime));\n+    }\n+    else\n+        BOT_LOG_INFO(\"server.loading\", \">> Bot managers data is not loaded. Table `characters_npcbot_settings` is empty!\");\n+}\n+\n+void BotDataMgr::DeleteOldLogs()\n+{\n+    uint32 month_cutoff = static_cast<uint32>(GameTime::GetGameTime().count() - static_cast<time_t>(BOT_LOG_KEEP_DAYS) * DAY);\n+    CharacterDatabase.Execute(\"DELETE FROM `characters_npcbot_logs` WHERE timestamp IS NOT NULL AND timestamp < FROM_UNIXTIME({})\", month_cutoff);\n+    BOT_LOG_INFO(\"server.loading\", \"Deleting NPCBot log entries older than {} days...\", BOT_LOG_KEEP_DAYS);\n+}\n+\n+void BotDataMgr::LoadWanderMap(bool reload, bool force_all_maps)\n+{\n+    using WanderNodeLink = WanderNode::WanderNodeLink;\n+    using SpawnMapEx = std::map<uint32, bool>;\n+    using SpawnVector = std::vector<WanderNode const*>;\n+\n+    const std::array<uint32, 4> ALL_CONTINENT_MAPS = { 0u, 1u, 530u, 571u };\n+\n+    if (WanderNode::GetAllWPsCount() > 0u)\n+    {\n+        if (!reload)\n+            return;\n+\n+        WanderNode::RemoveAllWPs();\n+    }\n+\n+    _wpMinSpawnLevelPerMapId.clear();\n+    _wpMaxSpawnLevelPerMapId.clear();\n+\n+    uint32 botoldMSTime = getMSTime();\n+\n+    BOT_LOG_INFO(\"server.loading\", \"Setting up wander map...\");\n+\n+    //                                             0  1     2 3 4 5 6      7      8        9        10    11   12\n+    QueryResult wres = WorldDatabase.Query(\"SELECT id,mapid,x,y,z,o,zoneId,areaId,minlevel,maxlevel,flags,name,links,minwaittime,maxwaittime,proximity FROM creature_template_npcbot_wander_nodes ORDER BY mapid,id\");\n+    if (!wres)\n+    {\n+        BOT_LOG_FATAL(\"server.loading\", \"Failed to load wander points: table `creature_template_npcbot_wander_nodes` is empty!\");\n+        ASSERT(false);\n+    }\n+\n+    const uint32 maxof_minclasslvl_nr = GetMinLevelForBotClass(BOT_CLASS_DEATH_KNIGHT); // 55\n+    const uint32 maxof_minclasslvl_ex = GetMinLevelForBotClass(BOT_CLASS_DREADLORD); // 60\n+\n+    std::unordered_map<uint32, std::pair<WanderNode*, std::vector<std::pair<std::string, std::string>>>> links_to_create;\n+    std::array<SpawnMapEx, 3> SpawnMapsEx{};\n+    SpawnVector all_spawn_nodes;\n+    all_spawn_nodes.reserve(wres->GetRowCount() >> 8);\n+    for (SpawnMapEx& smap : SpawnMapsEx)\n+        for (uint32 mapId : ALL_CONTINENT_MAPS)\n+            if (BotCfg::IsBotGenerationEnabledWorldMapId(mapId))\n+                smap.emplace(mapId, false);\n+\n+    uint32 disabled_nodes = 0;\n+    do\n+    {\n+        Field* fields = wres->Fetch();\n+        uint32 index = 0;\n+\n+        uint32 id             = fields[  index].Get<uint32>();\n+        uint32 mapId          = fields[++index].Get<uint16>();\n+        float x               = fields[++index].Get<float>();\n+        float y               = fields[++index].Get<float>();\n+        float z               = fields[++index].Get<float>();\n+        float o               = fields[++index].Get<float>();\n+        uint32 zoneId         = fields[++index].Get<uint32>();\n+        uint32 areaId         = fields[++index].Get<uint32>();\n+        uint8 minLevel        = fields[++index].Get<uint8>();\n+        uint8 maxLevel        = fields[++index].Get<uint8>();\n+        EnumFlag<BotWPFlags> flags = static_cast<BotWPFlags>(fields[++index].Get<uint32>());\n+        std::string name      = fields[++index].Get<std::string>();\n+        std::string_view lstr = fields[++index].Get<std::string_view>();\n+        uint32 minwaittime    = fields[++index].Get<uint32>();\n+        uint32 maxwaittime    = fields[++index].Get<uint32>();\n+        float proximity       = fields[++index].Get<float>();\n+\n+        WanderNode::nextWPId = std::max<uint32>(WanderNode::nextWPId, id);\n+\n+        MapEntry const* mapEntry = sMapStore.LookupEntry(mapId);\n+        if (!mapEntry)\n+        {\n+            BOT_LOG_ERROR(\"server.loading\", \"WP {} has invalid map id {}!\", id, mapId);\n+            continue;\n+        }\n+\n+        if (minLevel == 1u && maxLevel == DEFAULT_MAX_LEVEL)\n+            BOT_LOG_WARN(\"server.loading\", \"WP {} has no levels set.\", id);\n+\n+        if (!minLevel || !maxLevel || minLevel > DEFAULT_MAX_LEVEL || maxLevel > DEFAULT_MAX_LEVEL || minLevel > maxLevel)\n+        {\n+            BOT_LOG_WARN(\"server.loading\", \"WP {} has invalid levels min {} max {}! Setting to default...\",\n+                id, uint32(minLevel), uint32(maxLevel));\n+            minLevel = 1;\n+            maxLevel = DEFAULT_MAX_LEVEL;\n+        }\n+\n+        if (flags >= BotWPFlags::BOTWP_FLAG_END)\n+        {\n+            BOT_LOG_WARN(\"server.loading\", \"WP {} has invalid flags {}! Removing all invalid flags...\", id, flags.AsUnderlyingType());\n+            flags &= BotWPFlags::BOTWP_FLAGS_ALL_VALID;\n+        }\n+\n+        const auto nonbg_flags = BotWPFlags::BOTWP_FLAG_BG_FLAG_PICKUP_TARGET | BotWPFlags::BOTWP_FLAG_BG_FLAG_DELIVER_TARGET;\n+        if (flags.HasFlag(nonbg_flags) && !mapEntry->IsBattleground())\n+        {\n+            BOT_LOG_WARN(\"server.loading\", \"WP {} has BG-only flags {} for non-BG map {}! Removing...\", id, (flags & nonbg_flags).AsUnderlyingType(), mapEntry->MapID);\n+            flags &= ~nonbg_flags;\n+        }\n+\n+        const std::array conflicting_flags{\n+            std::pair{BotWPFlags::BOTWP_FLAG_ALLIANCE_ONLY, BotWPFlags::BOTWP_FLAG_HORDE_ONLY },\n+            std::pair{BotWPFlags::BOTWP_FLAG_CAN_BACKTRACK_FROM, BotWPFlags::BOTWP_FLAG_MOVEMENT_FORCE_JUMP_END },\n+            std::pair{BotWPFlags::BOTWP_FLAG_BG_MISC_OBJECTIVE_1, BotWPFlags::BOTWP_FLAG_BG_MISC_OBJECTIVE_2 },\n+            std::pair{BotWPFlags::BOTWP_FLAG_BG_OPTIONAL_PICKUP_1, BotWPFlags::BOTWP_FLAG_BG_OPTIONAL_PICKUP_2 },\n+            std::pair{BotWPFlags::BOTWP_FLAG_BG_OPTIONAL_PICKUP_1, BotWPFlags::BOTWP_FLAG_BG_OPTIONAL_PICKUP_3 },\n+            std::pair{BotWPFlags::BOTWP_FLAG_BG_OPTIONAL_PICKUP_1, BotWPFlags::BOTWP_FLAG_BG_OPTIONAL_PICKUP_4 },\n+            std::pair{BotWPFlags::BOTWP_FLAG_BG_OPTIONAL_PICKUP_1, BotWPFlags::BOTWP_FLAG_BG_OPTIONAL_PICKUP_5 },\n+            std::pair{BotWPFlags::BOTWP_FLAG_BG_OPTIONAL_PICKUP_2, BotWPFlags::BOTWP_FLAG_BG_OPTIONAL_PICKUP_3 },\n+            std::pair{BotWPFlags::BOTWP_FLAG_BG_OPTIONAL_PICKUP_2, BotWPFlags::BOTWP_FLAG_BG_OPTIONAL_PICKUP_4 },\n+            std::pair{BotWPFlags::BOTWP_FLAG_BG_OPTIONAL_PICKUP_2, BotWPFlags::BOTWP_FLAG_BG_OPTIONAL_PICKUP_5 },\n+            std::pair{BotWPFlags::BOTWP_FLAG_BG_OPTIONAL_PICKUP_3, BotWPFlags::BOTWP_FLAG_BG_OPTIONAL_PICKUP_4 },\n+            std::pair{BotWPFlags::BOTWP_FLAG_BG_OPTIONAL_PICKUP_3, BotWPFlags::BOTWP_FLAG_BG_OPTIONAL_PICKUP_5 },\n+            std::pair{BotWPFlags::BOTWP_FLAG_BG_OPTIONAL_PICKUP_4, BotWPFlags::BOTWP_FLAG_BG_OPTIONAL_PICKUP_5 },\n+        };\n+        for (std::pair<BotWPFlags, BotWPFlags> const& p : conflicting_flags)\n+        {\n+            const BotWPFlags cflags = p.first | p.second;\n+            if ((flags & cflags) == cflags)\n+            {\n+                BOT_LOG_WARN(\"server.loading\", \"WP {} has conflicting flags {}+{}! Removing both...\", id, AsUnderlyingType(p.first), AsUnderlyingType(p.second));\n+                flags &= ~cflags;\n+            }\n+        }\n+\n+        if (!force_all_maps && mapEntry->IsContinent() && !BotCfg::IsBotGenerationEnabledWorldMapId(mapId))\n+        {\n+            ++disabled_nodes;\n+            continue;\n+        }\n+\n+        WanderNode* wp = new WanderNode(id, mapId, x, y, z, o, zoneId, areaId, std::move(name));\n+        wp->SetLevels(minLevel, maxLevel);\n+        wp->SetFlags(BotWPFlags(flags));\n+        wp->SetWaitTime(minwaittime, maxwaittime);\n+        wp->SetProximity(proximity);\n+\n+        if (wp->HasFlag(BotWPFlags::BOTWP_FLAG_SPAWN) && !lstr.empty())\n+        {\n+            all_spawn_nodes.push_back(wp);\n+\n+            if (!wp->HasFlag(BotWPFlags::BOTWP_FLAG_ALLIANCE_OR_HORDE_ONLY) && wp->GetLevels().second <= 10)\n+                BOT_LOG_WARN(\"server.loading\", \"WP {} is a start location but has no HORDE or ALLIANCE flag assigned! Only Neutral bots will spawn there!\", id);\n+        }\n+\n+        if (lstr.empty())\n+        {\n+            BOT_LOG_ERROR(\"server.loading\", \"WP {} has no links!\", id);\n+            continue;\n+        }\n+        std::vector<std::string_view> tok = Bcore::Tokenize(lstr, ' ', false);\n+        for (std::vector<std::string_view>::size_type i = 0; i != tok.size(); ++i)\n+        {\n+            std::vector<std::string_view> link_str = Bcore::Tokenize(tok[i], ':', false);\n+            ASSERT(link_str.size() == 2u, \"Invalid links_str format: '{}'\", std::string(tok[i].data(), tok[i].length()).c_str());\n+            ASSERT(link_str[0].find(\" \") == std::string_view::npos);\n+            ASSERT(link_str[1].find(\" \") == std::string_view::npos);\n+            ASSERT(Bcore::StringTo<uint32>(link_str[0]) != std::nullopt, \"Invalid links_str format: '{}'\", std::string(tok[i].data(), tok[i].length()).c_str());\n+            ASSERT(Bcore::StringTo<uint32>(link_str[1]) != std::nullopt, \"Invalid links_str format: '{}'\", std::string(tok[i].data(), tok[i].length()).c_str());\n+\n+            std::pair<std::string, std::string> tok_pair = { std::string(link_str[0].data(), link_str[0].length()), std::string(link_str[1].data(), link_str[1].length()) };\n+            auto lit = links_to_create.find(id);\n+            if (lit == links_to_create.cend())\n+                links_to_create[id] = { wp, {std::move(tok_pair)} };\n+            else\n+                lit->second.second.push_back(std::move(tok_pair));\n+        }\n+\n+    } while (wres->NextRow());\n+\n+    auto& [spawn_node_exists_a, spawn_node_exists_h, spawn_node_exists_n] = SpawnMapsEx;\n+    for (WanderNode const* wp : all_spawn_nodes)\n+    {\n+        uint32 mapId = wp->GetMapId();\n+        auto [minLevel, maxLevel] = wp->GetLevels();\n+\n+        spawn_node_exists_a[mapId] |= (maxLevel >= maxof_minclasslvl_nr && bot_ai::IsWanderNodeAvailableForBotFaction(wp, FACTION_TEMPLATE_ALLIANCE_DEFAULT, false, true));\n+        spawn_node_exists_h[mapId] |= (maxLevel >= maxof_minclasslvl_nr && bot_ai::IsWanderNodeAvailableForBotFaction(wp, FACTION_TEMPLATE_HORDE_DEFAULT, false, true));\n+        spawn_node_exists_n[mapId] |= (maxLevel >= maxof_minclasslvl_ex && bot_ai::IsWanderNodeAvailableForBotFaction(wp, FACTION_TEMPLATE_NEUTRAL_HOSTILE, false, true));\n+\n+        decltype(_wpMinSpawnLevelPerMapId)::const_iterator mincit = _wpMinSpawnLevelPerMapId.find(mapId);\n+        _wpMinSpawnLevelPerMapId[mapId] = std::min<uint8>((mincit != _wpMinSpawnLevelPerMapId.cend()) ? mincit->second : uint8(DEFAULT_MAX_LEVEL), minLevel);\n+        decltype(_wpMaxSpawnLevelPerMapId)::const_iterator maxcit = _wpMaxSpawnLevelPerMapId.find(mapId);\n+        _wpMaxSpawnLevelPerMapId[mapId] = std::max<uint8>((maxcit != _wpMaxSpawnLevelPerMapId.cend()) ? maxcit->second : 1u, maxLevel);\n+    }\n+\n+    bool spawn_node_minclasslvl_exists_all = true;\n+    for (auto [map_id, exists] : spawn_node_exists_a)\n+    {\n+        if (!exists)\n+        {\n+            BOT_LOG_FATAL(\"server.loading\", \"No valid Alliance spawn node for at least level {} on map {}! Spawning wandering bots is impossible! Aborting.\",\n+                maxof_minclasslvl_nr, map_id);\n+            spawn_node_minclasslvl_exists_all = false;\n+        }\n+    }\n+    for (auto [map_id, exists] : spawn_node_exists_h)\n+    {\n+        if (!exists)\n+        {\n+            BOT_LOG_FATAL(\"server.loading\", \"No valid Horde spawn node for at least level {} on map {}! Spawning wandering bots is impossible! Aborting.\",\n+                maxof_minclasslvl_nr, map_id);\n+            spawn_node_minclasslvl_exists_all = false;\n+        }\n+    }\n+    for (auto [map_id, exists] : spawn_node_exists_n)\n+    {\n+        if (!exists)\n+        {\n+            if (sMapStore.LookupEntry(map_id)->IsBattlegroundOrArena())\n+                BOT_LOG_INFO(\"server.loading\", \"No valid Neutral spawn node for at least level {} on non-continent map {}.\", maxof_minclasslvl_ex, map_id);\n+            else\n+            {\n+                BOT_LOG_FATAL(\"server.loading\", \"No valid Neutral spawn node for at least level {} on map {}! Spawning wandering bots is impossible! Aborting.\",\n+                    maxof_minclasslvl_ex, map_id);\n+                spawn_node_minclasslvl_exists_all = false;\n+            }\n+        }\n+    }\n+    if (!spawn_node_minclasslvl_exists_all)\n+        ABORT();\n+\n+    const uint8 TEAMS_COUNT = TEAM_NEUTRAL + 1;\n+    std::array team_strs{ \"Alliance\"sv, \"Horde\"sv, \"Neutral\"sv };\n+    std::array<bool, DEFAULT_MAX_LEVEL> spawn_node_levels[TEAMS_COUNT]{ { false } };\n+    uint8 min_spawn_level = DEFAULT_MAX_LEVEL;\n+    uint8 max_spawn_level = 0;\n+    for (WanderNode const* wp : all_spawn_nodes)\n+    {\n+        if (sMapStore.LookupEntry(wp->GetMapId())->IsContinent() && BotCfg::IsBotGenerationEnabledWorldMapId(wp->GetMapId()))\n+        {\n+            auto [minLevel, maxLevel] = wp->GetLevels();\n+            min_spawn_level = std::min<uint32>(min_spawn_level, minLevel);\n+            max_spawn_level = std::max<uint32>(max_spawn_level, maxLevel);\n+        }\n+    }\n+    for (WanderNode const* wp : all_spawn_nodes)\n+    {\n+        if (sMapStore.LookupEntry(wp->GetMapId())->IsContinent())\n+        {\n+            auto [minLevel, maxLevel] = wp->GetLevels();\n+            minLevel = std::max<uint8>(minLevel, 1);\n+            maxLevel = std::min<uint8>(maxLevel, max_spawn_level);\n+            for (uint8 k = 0; k < TEAMS_COUNT; ++k)\n+            {\n+                if ((k == 0 && bot_ai::IsWanderNodeAvailableForBotFaction(wp, FACTION_TEMPLATE_ALLIANCE_DEFAULT, false, true)) ||\n+                    (k == 1 && bot_ai::IsWanderNodeAvailableForBotFaction(wp, FACTION_TEMPLATE_HORDE_DEFAULT, false, true)) ||\n+                    (k == 2 && bot_ai::IsWanderNodeAvailableForBotFaction(wp, FACTION_TEMPLATE_NEUTRAL_HOSTILE, false, true)))\n+                {\n+                    for (size_t i = minLevel; i <= maxLevel; ++i)\n+                        spawn_node_levels[k][i - 1] = true;\n+                }\n+            }\n+        }\n+    }\n+    for (uint8 k = 0; k < TEAMS_COUNT; ++k)\n+    {\n+        auto const& vec = spawn_node_levels[k];\n+        for (size_t i = min_spawn_level; i <= max_spawn_level; ++i)\n+        {\n+            if (vec[i - 1] == false)\n+                BOT_LOG_ERROR(\"server.loading\", \"No {} spawn node found for level {}! Wandering bots may cause a crash!\", team_strs[k], i);\n+        }\n+    }\n+\n+    float mindist = 50000.f;\n+    float maxdist = 0.f;\n+    for (auto const& vt : links_to_create)\n+    {\n+        for (auto const& p : vt.second.second)\n+        {\n+            uint32 lid = *Bcore::StringTo<uint32>(p.first);\n+            uint32 lweight = *Bcore::StringTo<uint32>(p.second);\n+\n+            if (lweight >= 1000)\n+                BOT_LOG_WARN(\"server.loading\", \"WP {} has link {} with suspicious weight of {}, error?\", vt.first, lid, lweight);\n+\n+            if (lid == vt.first)\n+            {\n+                BOT_LOG_ERROR(\"server.loading\", \"WP {} has link {} which links to itself! Skipped.\", vt.first, lid);\n+                continue;\n+            }\n+\n+            WanderNode* lwp = WanderNode::FindInAllWPs(lid);\n+            if (!lwp)\n+            {\n+                BOT_LOG_ERROR(\"server.loading\", \"WP {} has link {} which does not exist!\", vt.first, lid);\n+                continue;\n+            }\n+            if (lwp->GetMapId() != vt.second.first->GetMapId())\n+            {\n+                BOT_LOG_ERROR(\"server.loading\", \"WP {} map {} has link {} ON A DIFFERENT MAP {}!\", vt.first, vt.second.first->GetMapId(), lid, lwp->GetMapId());\n+                continue;\n+            }\n+\n+            bool is_continent = sMapStore.LookupEntry(vt.second.first->GetMapId())->IsContinent();\n+            float lwpdist2d = vt.second.first->GetExactDist2d(lwp);\n+            if (lwpdist2d > MAX_WANDER_NODE_DISTANCE)\n+                BOT_LOG_WARN(\"server.loading\", \"Warning! Link distance between WP {} and {} is too great ({})\", vt.first, lid, lwpdist2d);\n+            if (lwpdist2d < MIN_WANDER_NODE_DISTANCE && is_continent)\n+                BOT_LOG_WARN(\"server.loading\", \"Warning! Link distance between WP {} and {} is low ({})\", vt.first, lid, lwpdist2d);\n+\n+            WanderNodeLink newlink{ .wp = lwp, .weight = lweight };\n+            vt.second.first->Link(std::move(newlink));\n+\n+            if (is_continent)\n+            {\n+                float dist2d = vt.second.first->GetExactDist2d(lwp);\n+                if (dist2d < mindist)\n+                    mindist = dist2d;\n+                if (dist2d > maxdist)\n+                    maxdist = dist2d;\n+            }\n+        }\n+\n+        if (uint32 avg_weight = vt.second.first->GetAverageLinkWeight())\n+        {\n+            for (WanderNodeLink const& wpl : vt.second.first->GetLinks())\n+            {\n+                if (wpl.weight == 0)\n+                    BOT_LOG_WARN(\"server.loading\", \"WP {} has link {} with weight of 0 (average {})! Link will be inaccessible!\", vt.first, wpl.Id(), avg_weight);\n+                else if (float(wpl.weight) < avg_weight / 100.f)\n+                    BOT_LOG_WARN(\"server.loading\", \"WP {} has link {} with weight of {} below 1% average ({}), error?\", vt.first, wpl.Id(), wpl.weight, avg_weight);\n+            }\n+        }\n+    }\n+\n+    std::set<WanderNode const*> tops;\n+    WanderNode::DoForAllWPs([&](WanderNode const* wp) {\n+        auto const& wplinks = wp->GetLinks();\n+        if (!tops.contains(wp) && wplinks.size() == 1u)\n+        {\n+            BOT_LOG_DEBUG(\"server.loading\", \"Node {} ('{}') has single connection!\", wp->GetWPId(), wp->GetName().c_str());\n+            WanderNode const* tn = wplinks.begin()->wp;\n+            WanderNode const* prev = nullptr;\n+            std::vector<WanderNode const*> sc_chain;\n+            sc_chain.push_back(wp);\n+            tops.emplace(wp);\n+            while (tn != wp)\n+            {\n+                auto const& tnlinks = tn->GetLinks();\n+                if (tnlinks.size() != 2u || !tn->HasLink(prev ? prev : wp))\n+                {\n+                    sc_chain.push_back(tn);\n+                    break;\n+                }\n+                prev = sc_chain.back();\n+                sc_chain.push_back(tn);\n+                tn = std::ranges::find_if_not(tnlinks, [=](std::remove_cvref_t<decltype(tnlinks)>::value_type const& lwp) { return lwp.wp == prev; })->wp;\n+            }\n+            if (sc_chain.back()->GetLinks().size() == 1u && prev && sc_chain.back()->GetLinks().front().wp == prev)\n+            {\n+                BOT_LOG_DEBUG(\"server.loading\", \"Node {} ('{}') has single connection!\", tn->GetWPId(), tn->GetName().c_str());\n+                tops.emplace(sc_chain.back());\n+                std::ostringstream ss;\n+                ss << \"Node \" << (sc_chain.size() == 2u ? \"pair \" : \"chain \");\n+                for (std::size_t i{}; i < sc_chain.size(); ++i)\n+                {\n+                    ss << sc_chain[i]->GetWPId();\n+                    if (i < sc_chain.size() - 1u)\n+                        ss << '-';\n+                }\n+                ss << \" is isolated!\";\n+                BOT_LOG_INFO(\"server.loading\", \"{}\", ss.str());\n+            }\n+        }\n+    });\n+\n+    BOT_LOG_INFO(\"server.loading\", \">> Loaded {} bot wander nodes ({} disabled) on {} maps (total {} tops) in {} ms\",\n+        uint32(WanderNode::GetAllWPsCount()), disabled_nodes, uint32(WanderNode::GetWPMapsCount()), uint32(tops.size()), GetMSTimeDiffToNow(botoldMSTime));\n+}\n+\n+void BotDataMgr::GenerateWanderingBots()\n+{\n+    const uint32 wandering_bots_desired = BotCfg::GetDesiredWanderingBotsCount();\n+\n+    if (wandering_bots_desired == 0)\n+        return;\n+\n+    BOT_LOG_INFO(\"server.loading\", \"Spawning wandering bots...\");\n+\n+    uint32 oldMSTime = getMSTime();\n+\n+    uint32 maxbots = sBotGen->GetSpareBotsCount();\n+    uint32 enabledbots = sBotGen->GetEnabledBotsCount();\n+\n+    if (maxbots < wandering_bots_desired)\n+    {\n+        BOT_LOG_FATAL(\"server.loading\", \"Only {} out of {} bots of enabled classes aren't spawned. Desired amount of wandering bots ({}) cannot be created. Aborting!\",\n+            maxbots, enabledbots, wandering_bots_desired);\n+        ASSERT(false);\n+    }\n+\n+    uint32 spawned_count = 0;\n+    if (!sBotGen->GenerateWanderingBotsToSpawn(wandering_bots_desired, -1, -1, false, nullptr, nullptr, spawned_count))\n+    {\n+        BOT_LOG_FATAL(\"server.loading\", \"Failed to spawn all {} bots ({} succeeded)!\", wandering_bots_desired, spawned_count);\n+        ASSERT(false);\n+    }\n+\n+    BOT_LOG_INFO(\"server.loading\", \">> Set up spawning of {} wandering bots in {} ms\", spawned_count, GetMSTimeDiffToNow(oldMSTime));\n+}\n+\n+bool BotDataMgr::GenerateBattlegroundBots(Player const* groupLeader, [[maybe_unused]] Group const* group, BattlegroundQueue* queue, PvPDifficultyEntry const* bracketEntry, GroupQueueInfo const* gqinfo)\n+{\n+    if (!BotCfg::IsBotGenerationEnabledBGs())\n+        return true;\n+\n+    BattlegroundTypeId bgTypeId = gqinfo->BgTypeId;\n+    uint8 atype = gqinfo->ArenaType;\n+    uint32 ammr = gqinfo->ArenaMatchmakerRating;\n+    BattlegroundBracketId bracketId = bracketEntry->GetBracketId();\n+    BattlegroundQueueTypeId bgqTypeId = sBattlegroundMgr->BGQueueTypeId(bgTypeId, atype);\n+\n+    uint32 tarteamplayers = BotCfg::GetBGTargetTeamPlayersCount(bgTypeId);\n+\n+    if (tarteamplayers == 0)\n+    {\n+        BOT_LOG_INFO(\"npcbots\", \"[Disabled] BG {} wandering bots generation is disabled (not implemented?)\", uint32(bgTypeId));\n+        return true;\n+    }\n+\n+    //find running BG\n+    auto const& all_bgs = sBattlegroundMgr->GetBgDataStore();\n+    for (auto const& [bg_type_id, bg_data] : all_bgs)\n+    {\n+        if (bg_type_id == bgTypeId)\n+        {\n+            for (auto const& [_, bg_ptr] : bg_data._Battlegrounds)\n+            {\n+                Battleground const* real_bg = bg_ptr;\n+                if (real_bg->GetInstanceID() != 0 && real_bg->GetBracketId() == bracketId && real_bg->GetStatus() < STATUS_WAIT_LEAVE && real_bg->HasFreeSlots())\n+                {\n+                    if (real_bg->GetFreeSlotsForTeam(groupLeader->GetTeamId()) < gqinfo->Players.size())\n+                    {\n+                        BOT_LOG_INFO(\"npcbots\", \"[Already running 1] Found running non-full BG {} instance {}. Not generating bots: queuing group or player (leader {}) CANNOT join existing BG, prevent borrowing bots\",\n+                            uint32(bgTypeId), real_bg->GetInstanceID(), groupLeader->GetGUID().GetCounter());\n+                    }\n+                    else\n+                    {\n+                        BOT_LOG_INFO(\"npcbots\", \"[Already running 2] Found running non-full BG {} instance {}. Not generating bots: queuing group or player (leader {}) CAN join existing BG\",\n+                            uint32(bgTypeId), real_bg->GetInstanceID(), groupLeader->GetGUID().GetCounter());\n+                    }\n+                    return true;\n+                }\n+            }\n+        }\n+    }\n+\n+    Battleground const* bg_template = sBattlegroundMgr->GetBattlegroundTemplate(bgTypeId);\n+\n+    if (!bg_template)\n+        return false;\n+\n+    uint32 minteamplayers = bg_template->GetMinPlayersPerTeam();\n+    uint32 maxteamplayers = bg_template->GetMaxPlayersPerTeam();\n+\n+    uint32 normalCount = tarteamplayers;\n+    RoundToInterval(normalCount, minteamplayers, maxteamplayers);\n+    if (tarteamplayers != normalCount)\n+    {\n+        BOT_LOG_ERROR(\"npcbots\", \"NpcBot.WanderingBots.BG.TargetTeamPlayersCount value {} for BG {} '{}' is out of bounds ({}-{})! Normalized to {}!\",\n+            tarteamplayers, uint32(bgTypeId), bg_template->GetName(), minteamplayers, maxteamplayers, normalCount);\n+        tarteamplayers = normalCount;\n+    }\n+\n+    uint32 queued_players_a = 0;\n+    uint32 queued_players_h = 0;\n+    for (uint8 i = 0; i < BG_QUEUE_CFBG; ++i)\n+    {\n+        for (GroupQueueInfo const* qgr : queue->m_QueuedGroups[bracketId][i])\n+        {\n+            if (qgr->teamId == TEAM_ALLIANCE)\n+                queued_players_a += qgr->Players.size();\n+            else\n+                queued_players_h += qgr->Players.size();\n+        }\n+    }\n+\n+    uint32 needed_bots_count_a = (queued_players_a < tarteamplayers) ? (tarteamplayers - queued_players_a) : 0;\n+    uint32 needed_bots_count_h = (queued_players_h < tarteamplayers) ? (tarteamplayers - queued_players_h) : 0;\n+\n+    ASSERT(needed_bots_count_a <= maxteamplayers);\n+    ASSERT(needed_bots_count_h <= maxteamplayers);\n+\n+    if (needed_bots_count_a + needed_bots_count_h == 0)\n+    {\n+        BOT_LOG_INFO(\"npcbots\", \"[No bots required] Failed to generate bots for BG {} inited by player {} ({})\",\n+            uint32(bgTypeId), groupLeader->GetName().c_str(), groupLeader->GetGUID().GetCounter());\n+        return true;\n+    }\n+\n+    uint32 spare_bots_a = sBotGen->GetSpareBotsCount(TEAM_ALLIANCE);\n+    uint32 spare_bots_h = sBotGen->GetSpareBotsCount(TEAM_HORDE);\n+\n+    if (queued_players_a + spare_bots_a < minteamplayers)\n+    {\n+        BOT_LOG_INFO(\"npcbots\", \"[Not enough A bots] Failed to generate bots for BG {} inited by player {} ({})\",\n+            uint32(bgTypeId), groupLeader->GetName().c_str(), groupLeader->GetGUID().GetCounter());\n+        return false;\n+    }\n+    if (queued_players_h + spare_bots_h < minteamplayers)\n+    {\n+        BOT_LOG_INFO(\"npcbots\", \"[Not enough H bots] Failed to generate bots for BG {} inited by player {} ({})\",\n+            uint32(bgTypeId), groupLeader->GetName().c_str(), groupLeader->GetGUID().GetCounter());\n+        return false;\n+    }\n+\n+    needed_bots_count_a = std::min<uint32>(needed_bots_count_a, spare_bots_a);\n+    needed_bots_count_h = std::min<uint32>(needed_bots_count_h, spare_bots_h);\n+\n+    uint32 spawned_a = 0;\n+    uint32 spawned_h = 0;\n+    std::array<NpcBotRegistry, 2> spawned_bots;\n+    auto& [spawned_bots_a, spawned_bots_h] = spawned_bots;\n+\n+    if (needed_bots_count_a)\n+    {\n+        if (!sBotGen->GenerateWanderingBotsToSpawn(needed_bots_count_a, bg_template->GetMapId(), ALLIANCE, true, bracketEntry, &spawned_bots_a, spawned_a))\n+        {\n+            BOT_LOG_WARN(\"npcbots\", \"Failed to spawn {} ALLIANCE bots for BG {} '{}' queued A {} H {} req A {} H {} spare {}\",\n+                needed_bots_count_a, uint32(bg_template->GetBgTypeID()), bg_template->GetName().c_str(),\n+                queued_players_a, queued_players_h, needed_bots_count_a, needed_bots_count_h, spare_bots_a);\n+            for (NpcBotRegistry const& registry1 : spawned_bots)\n+                for (Creature const* bot : registry1)\n+                    DespawnWandererBot(bot->GetEntry());\n+            return false;\n+        }\n+    }\n+    if (needed_bots_count_h)\n+    {\n+        if (!sBotGen->GenerateWanderingBotsToSpawn(needed_bots_count_h, bg_template->GetMapId(), HORDE, true, bracketEntry, &spawned_bots_h, spawned_h))\n+        {\n+            BOT_LOG_WARN(\"npcbots\", \"Failed to spawn {} HORDE bots for BG {} '{}' queued A {} H {} req A {} H {} spare {}\",\n+                needed_bots_count_h, uint32(bg_template->GetBgTypeID()), bg_template->GetName().c_str(),\n+                queued_players_a, queued_players_h, needed_bots_count_a, needed_bots_count_h, spare_bots_h);\n+            for (NpcBotRegistry const& registry2 : spawned_bots)\n+                for (Creature const* bot : registry2)\n+                    DespawnWandererBot(bot->GetEntry());\n+            return false;\n+        }\n+    }\n+\n+    ASSERT(uint32(spawned_bots_a.size()) == needed_bots_count_a);\n+    ASSERT(uint32(spawned_bots_h.size()) == needed_bots_count_h);\n+\n+    botBGJoinEvents[groupLeader->GetGUID()].AddEventAtOffset([ammr = ammr, atype = atype, bgqTypeId = bgqTypeId, bgTypeId = bgTypeId, bracketId = bracketId]() {\n+        sBattlegroundMgr->ScheduleQueueUpdate(ammr, atype, bgqTypeId, bgTypeId, bracketId);\n+    }, Seconds(2));\n+\n+    uint8 maxlevel = BotCfg::IsBotLevelCappedByConfigBGFirstPlayer() ? groupLeader->GetLevel() : 0;\n+    for (NpcBotRegistry const& registry3 : spawned_bots)\n+    {\n+        uint32 seconds_delay = 5;\n+        for (Creature const* bot : registry3)\n+        {\n+            bot->GetBotAI()->SetBotCommandState(BOT_COMMAND_STAY);\n+            bot->GetBotAI()->canUpdate = false;\n+\n+            const_cast<Creature*>(bot)->SetPvP(true);\n+            if (maxlevel && bot->GetLevel() > maxlevel)\n+                const_cast<Creature*>(bot)->SetLevel(maxlevel);\n+            queue->AddBotAsGroup(bot->GetGUID(), GetTeamIdForFaction(bot->GetFaction()),\n+                bgTypeId, bracketEntry, atype, false, gqinfo->ArenaTeamRating, ammr);\n+\n+            seconds_delay = std::min<uint32>(uint32(MINUTE * 2), seconds_delay + std::max<uint32>(1u, uint32((MINUTE / 2) / std::max<uint32>(needed_bots_count_a, needed_bots_count_h))));\n+\n+            BotBattlegroundEnterEvent* bbe = new BotBattlegroundEnterEvent(groupLeader->GetGUID(), bot->GetGUID(), bgqTypeId, bgTypeId,\n+                botBGJoinEvents[groupLeader->GetGUID()].CalculateTime(Milliseconds(uint32(INVITE_ACCEPT_WAIT_TIME) + uint32(BG_START_DELAY_2M)).count()));\n+            botBGJoinEvents[groupLeader->GetGUID()].AddEventAtOffset(bbe, Seconds(seconds_delay));\n+        }\n+    }\n+\n+    return true;\n+}\n+\n+ItemPerBotClassMap const& BotDataMgr::GetWanderingBotsSortedGearMap()\n+{\n+    return _botsWanderCreaturesSortedGear;\n+}\n+\n+void BotDataMgr::CreateWanderingBotsSortedGear()\n+{\n+    BOT_LOG_INFO(\"server.loading\", \"Sorting wandering bot's gear...\");\n+\n+    uint32 oldMSTime = getMSTime();\n+\n+    std::set<uint32> disabled_item_ids;\n+    QueryResult dires = WorldDatabase.Query(\"SELECT id FROM creature_template_npcbot_disabled_items\");\n+    if (dires)\n+    {\n+        do\n+        {\n+            uint32 id = dires->Fetch()->Get<uint32>();\n+            disabled_item_ids.insert(id);\n+\n+        } while (dires->NextRow());\n+\n+        BOT_LOG_INFO(\"server.loading\", \">> Loaded {} disabled wandering bots gear items\", uint32(disabled_item_ids.size()));\n+    }\n+    else\n+        BOT_LOG_INFO(\"server.loading\", \">> Loaded 0 disabled wandering bots gear items. Table `creature_template_npcbot_disabled_items` is empty!\");\n+\n+    const std::map<uint32, uint8> InvTypeToBotSlot = {\n+        {INVTYPE_HEAD, BOT_SLOT_HEAD},\n+        {INVTYPE_SHOULDERS, BOT_SLOT_SHOULDERS},\n+        {INVTYPE_CHEST, BOT_SLOT_CHEST},\n+        {INVTYPE_ROBE, BOT_SLOT_CHEST},\n+        {INVTYPE_WAIST, BOT_SLOT_WAIST},\n+        {INVTYPE_LEGS, BOT_SLOT_LEGS},\n+        {INVTYPE_FEET, BOT_SLOT_FEET},\n+        {INVTYPE_WRISTS, BOT_SLOT_WRIST},\n+        {INVTYPE_HANDS, BOT_SLOT_HANDS}\n+    };\n+\n+    auto push_gear_to_classes = [](ItemTemplate const& itt, uint8 slot, uint8 lstep, std::initializer_list<BotClasses> const& cs) {\n+        for (BotClasses c : cs)\n+        {\n+            if (c == BOT_CLASS_SPHYNX &&\n+                (itt.InventoryType == INVTYPE_FINGER || itt.InventoryType == INVTYPE_TRINKET || itt.InventoryType == INVTYPE_CLOAK || itt.InventoryType == INVTYPE_NECK || itt.InventoryType == INVTYPE_SHIELD))\n+                continue;\n+            if (!itt.AllowableClass || itt.AllowableClass >= ((1u << MAX_CLASSES) - 1) || !!(itt.AllowableClass & (1u << (c - 1))))\n+                _botsWanderCreaturesSortedGear[c][slot][lstep].push_back(itt.ItemId);\n+        }\n+    };\n+\n+    const std::initializer_list<BotClasses> IntUsers = { BOT_CLASS_PALADIN, BOT_CLASS_PRIEST, BOT_CLASS_SHAMAN, BOT_CLASS_MAGE, BOT_CLASS_WARLOCK, BOT_CLASS_DRUID, BOT_CLASS_SPHYNX, BOT_CLASS_ARCHMAGE, BOT_CLASS_DREADLORD, BOT_CLASS_NECROMANCER, BOT_CLASS_SEA_WITCH, BOT_CLASS_CRYPT_LORD };\n+    const std::initializer_list<BotClasses> StrUsers = { BOT_CLASS_WARRIOR, BOT_CLASS_DEATH_KNIGHT, BOT_CLASS_SPELLBREAKER, BOT_CLASS_CRYPT_LORD };\n+    const std::initializer_list<BotClasses> AgiUsers = { BOT_CLASS_HUNTER, BOT_CLASS_SHAMAN, BOT_CLASS_ROGUE, BOT_CLASS_DRUID, BOT_CLASS_BM, BOT_CLASS_DARK_RANGER };\n+\n+    ItemTemplateContainer const* all_item_templates = sObjectMgr->GetItemTemplateStore();\n+    for (auto const& [_, proto] : *all_item_templates)\n+    {\n+        if (!proto.ItemLevel || proto.RequiredSpell)\n+            continue;\n+\n+        bool skip = false;\n+        switch (proto.Quality)\n+        {\n+            case ITEM_QUALITY_NORMAL:\n+                if (std::ranges::any_of(proto.Spells, [](_Spell const& spell) { return !!spell.SpellId; }))\n+                    skip = true;\n+                if (proto.RequiredLevel > 14)\n+                    skip = true;\n+                break;\n+            case ITEM_QUALITY_UNCOMMON:\n+                if (proto.RequiredLevel > 75)\n+                    skip = true;\n+            [[fallthrough]];\n+            case ITEM_QUALITY_RARE:\n+                if (proto.RequiredLevel > 75 && proto.RequiredLevel < 80)\n+                    skip = true;\n+            [[fallthrough]];\n+            case ITEM_QUALITY_EPIC:\n+                if (!(proto.RequiredLevel >= 2 && proto.RequiredLevel <= DEFAULT_MAX_LEVEL))\n+                    skip = true;\n+                if (!proto.RandomProperty && !proto.RandomSuffix && !proto.StatsCount &&\n+                    !(proto.Class == ITEM_CLASS_WEAPON && proto.SubClass == ITEM_SUBCLASS_WEAPON_WAND) &&\n+                    !(proto.Class == ITEM_CLASS_WEAPON && proto.SubClass == ITEM_SUBCLASS_WEAPON_BOW && proto.RequiredLevel < 45))\n+                    skip = true;\n+                break;\n+            default:\n+                skip = true;\n+                break;\n+        }\n+        if (skip)\n+            continue;\n+\n+        if (disabled_item_ids.contains(proto.ItemId))\n+        {\n+            //BOT_LOG_INFO(\"server.loading\", \"Item %u is disabled...\", proto.ItemId);\n+            continue;\n+        }\n+\n+        if (proto.StatsCount > 0 && std::ranges::any_of(proto.ItemStat, [](_ItemStat const& stat) {\n+            return (stat.ItemStatType == ITEM_MOD_DEFENSE_SKILL_RATING || stat.ItemStatType == ITEM_MOD_DODGE_RATING ||\n+                stat.ItemStatType == ITEM_MOD_PARRY_RATING || stat.ItemStatType == ITEM_MOD_BLOCK_VALUE) &&\n+                stat.ItemStatValue > 0;\n+        }))\n+            continue;\n+\n+        uint8 reqLstep = (((proto.RequiredLevel == 1) ? 0 : proto.RequiredLevel) + ITEM_SORTING_LEVEL_STEP - 1) / ITEM_SORTING_LEVEL_STEP;\n+        bool is_caster_item = proto.StatsCount > 0 && std::ranges::any_of(proto.ItemStat, [](_ItemStat const& stat) {\n+            return (stat.ItemStatType == ITEM_MOD_INTELLECT || stat.ItemStatType == ITEM_MOD_SPELL_POWER ||\n+                stat.ItemStatType == ITEM_MOD_SPELL_PENETRATION || stat.ItemStatType == ITEM_MOD_MANA_REGENERATION) &&\n+                stat.ItemStatValue > 0;\n+        });\n+        bool is_strength_item = proto.StatsCount > 0 && std::ranges::any_of(proto.ItemStat, [](_ItemStat const& stat) {\n+            return stat.ItemStatType == ITEM_MOD_STRENGTH && stat.ItemStatValue > 0;\n+        });\n+        bool is_agility_item = proto.StatsCount > 0 && std::ranges::any_of(proto.ItemStat, [](_ItemStat const& stat) {\n+            return stat.ItemStatType == ITEM_MOD_AGILITY && stat.ItemStatValue > 0;\n+        });\n+\n+        switch (proto.Class)\n+        {\n+            case ITEM_CLASS_ARMOR:\n+                switch (proto.InventoryType)\n+                {\n+                    case INVTYPE_NECK:\n+                        if (proto.Quality < ITEM_QUALITY_UNCOMMON)\n+                            break;\n+                        if (is_caster_item || (reqLstep < LEVEL_STEPS - 1 && proto.StatsCount == 0))\n+                            push_gear_to_classes(proto, BOT_SLOT_NECK, reqLstep, IntUsers);\n+                        if (is_strength_item || (reqLstep < LEVEL_STEPS - 1 && proto.StatsCount == 0))\n+                            push_gear_to_classes(proto, BOT_SLOT_NECK, reqLstep, StrUsers);\n+                        if (is_agility_item || (reqLstep < LEVEL_STEPS - 1 && proto.StatsCount == 0))\n+                            push_gear_to_classes(proto, BOT_SLOT_NECK, reqLstep, AgiUsers);\n+                        break;\n+                    case INVTYPE_FINGER:\n+                        if (proto.Quality < ITEM_QUALITY_UNCOMMON)\n+                            break;\n+                        if (is_caster_item || (reqLstep < LEVEL_STEPS - 1 && proto.StatsCount == 0))\n+                        {\n+                            push_gear_to_classes(proto, BOT_SLOT_FINGER1, reqLstep, IntUsers);\n+                            push_gear_to_classes(proto, BOT_SLOT_FINGER2, reqLstep, IntUsers);\n+                        }\n+                        if (is_strength_item || (reqLstep < LEVEL_STEPS - 1 && proto.StatsCount == 0))\n+                        {\n+                            push_gear_to_classes(proto, BOT_SLOT_FINGER1, reqLstep, StrUsers);\n+                            push_gear_to_classes(proto, BOT_SLOT_FINGER2, reqLstep, StrUsers);\n+                        }\n+                        if (is_agility_item || (reqLstep < LEVEL_STEPS - 1 && proto.StatsCount == 0))\n+                        {\n+                            push_gear_to_classes(proto, BOT_SLOT_FINGER1, reqLstep, AgiUsers);\n+                            push_gear_to_classes(proto, BOT_SLOT_FINGER2, reqLstep, AgiUsers);\n+                        }\n+                        break;\n+                    case INVTYPE_TRINKET:\n+                        if (proto.Quality < ITEM_QUALITY_UNCOMMON)\n+                            break;\n+                        if (!is_strength_item && !is_agility_item)\n+                        {\n+                            push_gear_to_classes(proto, BOT_SLOT_TRINKET1, reqLstep, IntUsers);\n+                            push_gear_to_classes(proto, BOT_SLOT_TRINKET2, reqLstep, IntUsers);\n+                        }\n+                        if (!is_caster_item)\n+                        {\n+                            push_gear_to_classes(proto, BOT_SLOT_TRINKET1, reqLstep, StrUsers);\n+                            push_gear_to_classes(proto, BOT_SLOT_TRINKET2, reqLstep, StrUsers);\n+                            push_gear_to_classes(proto, BOT_SLOT_TRINKET1, reqLstep, AgiUsers);\n+                            push_gear_to_classes(proto, BOT_SLOT_TRINKET2, reqLstep, AgiUsers);\n+                        }\n+                        break;\n+                    case INVTYPE_CLOAK:\n+                        if (is_caster_item || (reqLstep < LEVEL_STEPS - 1 && proto.StatsCount == 0))\n+                            push_gear_to_classes(proto, BOT_SLOT_BACK, reqLstep, IntUsers);\n+                        if (is_strength_item || (reqLstep < LEVEL_STEPS - 1 && proto.StatsCount == 0))\n+                            push_gear_to_classes(proto, BOT_SLOT_BACK, reqLstep, StrUsers);\n+                        if (is_agility_item || (reqLstep < LEVEL_STEPS - 1 && proto.StatsCount == 0))\n+                            push_gear_to_classes(proto, BOT_SLOT_BACK, reqLstep, AgiUsers);\n+                        break;\n+                    case INVTYPE_HOLDABLE:\n+                        if (proto.Quality < ITEM_QUALITY_UNCOMMON)\n+                            break;\n+                        push_gear_to_classes(proto, BOT_SLOT_OFFHAND, reqLstep, { BOT_CLASS_PRIEST, BOT_CLASS_MAGE, BOT_CLASS_WARLOCK, BOT_CLASS_DRUID });\n+                        break;\n+                    case INVTYPE_SHIELD:\n+                        if (proto.Armor == 0)\n+                            break;\n+                        if (!is_caster_item)\n+                            push_gear_to_classes(proto, BOT_SLOT_OFFHAND, reqLstep, { BOT_CLASS_WARRIOR });\n+                        if (is_caster_item || proto.RequiredLevel < 60 || (proto.RequiredLevel < 69 && (proto.RandomProperty || proto.RandomSuffix)))\n+                            push_gear_to_classes(proto, BOT_SLOT_OFFHAND, reqLstep, { BOT_CLASS_PALADIN, BOT_CLASS_SHAMAN, BOT_CLASS_SPELLBREAKER });\n+                        break;\n+                    case INVTYPE_HEAD:\n+                    case INVTYPE_SHOULDERS:\n+                    case INVTYPE_CHEST:\n+                    case INVTYPE_ROBE:\n+                    case INVTYPE_WAIST:\n+                    case INVTYPE_LEGS:\n+                    case INVTYPE_FEET:\n+                    case INVTYPE_WRISTS:\n+                    case INVTYPE_HANDS:\n+                    {\n+                        if (proto.Armor == 0)\n+                            break;\n+                        decltype(InvTypeToBotSlot)::const_iterator ci = InvTypeToBotSlot.find(proto.InventoryType);\n+                        ASSERT(ci != InvTypeToBotSlot.cend());\n+                        uint8 slot = ci->second;\n+                        switch (proto.SubClass)\n+                        {\n+                            case ItemSubclassArmor::ITEM_SUBCLASS_ARMOR_CLOTH:\n+                                if (slot == BOT_SLOT_CHEST && proto.InventoryType != INVTYPE_ROBE)\n+                                    break;\n+                                push_gear_to_classes(proto, slot, reqLstep, { BOT_CLASS_PRIEST, BOT_CLASS_MAGE, BOT_CLASS_WARLOCK, BOT_CLASS_ARCHMAGE, BOT_CLASS_NECROMANCER, BOT_CLASS_SEA_WITCH });\n+                                break;\n+                            case ItemSubclassArmor::ITEM_SUBCLASS_ARMOR_LEATHER:\n+                                if (!is_caster_item)\n+                                    push_gear_to_classes(proto, slot, reqLstep, { BOT_CLASS_ROGUE, BOT_CLASS_DARK_RANGER });\n+                                push_gear_to_classes(proto, slot, reqLstep, { BOT_CLASS_DRUID });\n+                                if (proto.RequiredLevel < 40)\n+                                    push_gear_to_classes(proto, slot, reqLstep, { BOT_CLASS_HUNTER, BOT_CLASS_SHAMAN });\n+                                break;\n+                            case ItemSubclassArmor::ITEM_SUBCLASS_ARMOR_MAIL:\n+                                if (proto.RequiredLevel < 40)\n+                                {\n+                                    if (!is_caster_item)\n+                                        push_gear_to_classes(proto, slot, reqLstep, { BOT_CLASS_WARRIOR });\n+                                    push_gear_to_classes(proto, slot, reqLstep, { BOT_CLASS_PALADIN });\n+                                }\n+                                else\n+                                    push_gear_to_classes(proto, slot, reqLstep, { BOT_CLASS_HUNTER, BOT_CLASS_SHAMAN });\n+                                if (!is_caster_item)\n+                                    push_gear_to_classes(proto, slot, reqLstep, { BOT_CLASS_BM, BOT_CLASS_SPELLBREAKER });\n+                                push_gear_to_classes(proto, slot, reqLstep, { BOT_CLASS_SPHYNX, BOT_CLASS_CRYPT_LORD });\n+                                break;\n+                            case ItemSubclassArmor::ITEM_SUBCLASS_ARMOR_PLATE:\n+                                if (!is_caster_item)\n+                                    push_gear_to_classes(proto, slot, reqLstep, { BOT_CLASS_WARRIOR, BOT_CLASS_DEATH_KNIGHT, BOT_CLASS_BM, BOT_CLASS_SPELLBREAKER });\n+                                if (is_caster_item || proto.RequiredLevel < 60 || (proto.RequiredLevel < 78 && (proto.RandomProperty || proto.RandomSuffix)))\n+                                    push_gear_to_classes(proto, slot, reqLstep, { BOT_CLASS_PALADIN, BOT_CLASS_SPHYNX, BOT_CLASS_DREADLORD, BOT_CLASS_CRYPT_LORD });\n+                                break;\n+                            default:\n+                                break;\n+                        }\n+                        break;\n+                    }\n+                    default:\n+                        break;\n+                }\n+                break;\n+            case ITEM_CLASS_WEAPON:\n+                if (proto.Damage[0].DamageMin < 1.0f || proto.Damage[0].DamageMax < 2.0f || proto.Delay < 1000)\n+                    break;\n+                if (proto.RequiredLevel > 75 && proto.Quality < ITEM_QUALITY_EPIC)\n+                    break;\n+                switch (proto.SubClass)\n+                {\n+                    case ItemSubclassWeapon::ITEM_SUBCLASS_WEAPON_WAND:\n+                        if (proto.InventoryType != INVTYPE_RANGED && proto.InventoryType != INVTYPE_RANGEDRIGHT)\n+                            break;\n+                        push_gear_to_classes(proto, BOT_SLOT_MAINHAND, reqLstep, { BOT_CLASS_SPHYNX });\n+                        push_gear_to_classes(proto, BOT_SLOT_OFFHAND, reqLstep, { BOT_CLASS_SPHYNX });\n+                        push_gear_to_classes(proto, BOT_SLOT_RANGED, reqLstep, { BOT_CLASS_PRIEST, BOT_CLASS_MAGE, BOT_CLASS_WARLOCK });\n+                        break;\n+                    case ItemSubclassWeapon::ITEM_SUBCLASS_WEAPON_GUN:\n+                    case ItemSubclassWeapon::ITEM_SUBCLASS_WEAPON_CROSSBOW:\n+                        if (proto.InventoryType != INVTYPE_RANGED && proto.InventoryType != INVTYPE_RANGEDRIGHT)\n+                            break;\n+                        push_gear_to_classes(proto, BOT_SLOT_RANGED, reqLstep, { BOT_CLASS_WARRIOR, BOT_CLASS_ROGUE, BOT_CLASS_HUNTER });\n+                        break;\n+                    case ItemSubclassWeapon::ITEM_SUBCLASS_WEAPON_BOW:\n+                        if (proto.InventoryType != INVTYPE_RANGED && proto.InventoryType != INVTYPE_RANGEDRIGHT)\n+                            break;\n+                        push_gear_to_classes(proto, BOT_SLOT_RANGED, reqLstep, { BOT_CLASS_WARRIOR, BOT_CLASS_ROGUE, BOT_CLASS_HUNTER, BOT_CLASS_DARK_RANGER, BOT_CLASS_SEA_WITCH });\n+                        break;\n+                    case ItemSubclassWeapon::ITEM_SUBCLASS_WEAPON_THROWN:\n+                        if (proto.InventoryType != INVTYPE_THROWN)\n+                            break;\n+                        push_gear_to_classes(proto, BOT_SLOT_RANGED, reqLstep, { BOT_CLASS_WARRIOR, BOT_CLASS_ROGUE });\n+                        break;\n+                    case ItemSubclassWeapon::ITEM_SUBCLASS_WEAPON_STAFF:\n+                        if (proto.InventoryType != INVTYPE_2HWEAPON)\n+                            break;\n+                        if (is_caster_item || proto.RequiredLevel < 50)\n+                            push_gear_to_classes(proto, BOT_SLOT_MAINHAND, reqLstep, { BOT_CLASS_PRIEST, BOT_CLASS_MAGE, BOT_CLASS_WARLOCK, BOT_CLASS_DRUID, BOT_CLASS_SHAMAN, BOT_CLASS_ARCHMAGE, BOT_CLASS_NECROMANCER, BOT_CLASS_DREADLORD, BOT_CLASS_CRYPT_LORD });\n+                        break;\n+                    case ItemSubclassWeapon::ITEM_SUBCLASS_WEAPON_AXE2:\n+                        if (proto.InventoryType != INVTYPE_2HWEAPON)\n+                            break;\n+                        if (!is_caster_item)\n+                        {\n+                            push_gear_to_classes(proto, BOT_SLOT_MAINHAND, reqLstep, { BOT_CLASS_WARRIOR, BOT_CLASS_PALADIN, BOT_CLASS_DEATH_KNIGHT, BOT_CLASS_BM });\n+                            if (proto.RequiredLevel >= 60 - ITEM_SORTING_LEVEL_STEP)\n+                                push_gear_to_classes(proto, BOT_SLOT_OFFHAND, reqLstep, { BOT_CLASS_WARRIOR });\n+                        }\n+                        push_gear_to_classes(proto, BOT_SLOT_MAINHAND, reqLstep, { BOT_CLASS_HUNTER, BOT_CLASS_SHAMAN, BOT_CLASS_DREADLORD, BOT_CLASS_CRYPT_LORD });\n+                        break;\n+                    case ItemSubclassWeapon::ITEM_SUBCLASS_WEAPON_SWORD2:\n+                        if (proto.InventoryType != INVTYPE_2HWEAPON)\n+                            break;\n+                        if (!is_caster_item)\n+                        {\n+                            push_gear_to_classes(proto, BOT_SLOT_MAINHAND, reqLstep, { BOT_CLASS_WARRIOR, BOT_CLASS_PALADIN, BOT_CLASS_DEATH_KNIGHT, BOT_CLASS_BM });\n+                            if (proto.RequiredLevel >= 60 - ITEM_SORTING_LEVEL_STEP)\n+                                push_gear_to_classes(proto, BOT_SLOT_OFFHAND, reqLstep, { BOT_CLASS_WARRIOR });\n+                        }\n+                        push_gear_to_classes(proto, BOT_SLOT_MAINHAND, reqLstep, { BOT_CLASS_HUNTER, BOT_CLASS_DREADLORD, BOT_CLASS_CRYPT_LORD });\n+                        break;\n+                    case ItemSubclassWeapon::ITEM_SUBCLASS_WEAPON_POLEARM:\n+                        if (proto.InventoryType != INVTYPE_2HWEAPON)\n+                            break;\n+                        if (!is_caster_item)\n+                            push_gear_to_classes(proto, BOT_SLOT_MAINHAND, reqLstep, { BOT_CLASS_WARRIOR, BOT_CLASS_PALADIN, BOT_CLASS_DEATH_KNIGHT, BOT_CLASS_BM });\n+                        push_gear_to_classes(proto, BOT_SLOT_MAINHAND, reqLstep, { BOT_CLASS_DRUID, BOT_CLASS_HUNTER, BOT_CLASS_DREADLORD, BOT_CLASS_CRYPT_LORD });\n+                        break;\n+                    case ItemSubclassWeapon::ITEM_SUBCLASS_WEAPON_MACE2:\n+                        if (proto.InventoryType != INVTYPE_2HWEAPON)\n+                            break;\n+                        if (!is_caster_item)\n+                        {\n+                            push_gear_to_classes(proto, BOT_SLOT_MAINHAND, reqLstep, { BOT_CLASS_WARRIOR, BOT_CLASS_PALADIN, BOT_CLASS_HUNTER, BOT_CLASS_DEATH_KNIGHT });\n+                            if (proto.RequiredLevel >= 60 - ITEM_SORTING_LEVEL_STEP)\n+                                push_gear_to_classes(proto, BOT_SLOT_OFFHAND, reqLstep, { BOT_CLASS_WARRIOR });\n+                        }\n+                        push_gear_to_classes(proto, BOT_SLOT_MAINHAND, reqLstep, { BOT_CLASS_DRUID, BOT_CLASS_DREADLORD, BOT_CLASS_CRYPT_LORD });\n+                        break;\n+                    case ItemSubclassWeapon::ITEM_SUBCLASS_WEAPON_AXE:\n+                        if (proto.InventoryType == INVTYPE_WEAPON || proto.InventoryType == INVTYPE_WEAPONMAINHAND)\n+                        {\n+                            if (!is_caster_item)\n+                            {\n+                                push_gear_to_classes(proto, BOT_SLOT_MAINHAND, reqLstep, { BOT_CLASS_WARRIOR });\n+                                push_gear_to_classes(proto, BOT_SLOT_MAINHAND, reqLstep, { BOT_CLASS_ROGUE, BOT_CLASS_SPELLBREAKER });\n+                            }\n+                            push_gear_to_classes(proto, BOT_SLOT_MAINHAND, reqLstep, { BOT_CLASS_PALADIN, BOT_CLASS_SHAMAN });\n+                        }\n+                        if (proto.InventoryType == INVTYPE_WEAPON || proto.InventoryType == INVTYPE_WEAPONOFFHAND)\n+                        {\n+                            if (!is_caster_item)\n+                            {\n+                                if (proto.RequiredLevel < 60 - ITEM_SORTING_LEVEL_STEP)\n+                                    push_gear_to_classes(proto, BOT_SLOT_OFFHAND, reqLstep, { BOT_CLASS_WARRIOR });\n+                                push_gear_to_classes(proto, BOT_SLOT_OFFHAND, reqLstep, { BOT_CLASS_ROGUE });\n+                            }\n+                            push_gear_to_classes(proto, BOT_SLOT_OFFHAND, reqLstep, { BOT_CLASS_SHAMAN });\n+                        }\n+                        break;\n+                    case ItemSubclassWeapon::ITEM_SUBCLASS_WEAPON_MACE:\n+                        if (proto.InventoryType == INVTYPE_WEAPON || proto.InventoryType == INVTYPE_WEAPONMAINHAND)\n+                        {\n+                            if (!is_caster_item)\n+                            {\n+                                push_gear_to_classes(proto, BOT_SLOT_MAINHAND, reqLstep, { BOT_CLASS_WARRIOR });\n+                                push_gear_to_classes(proto, BOT_SLOT_MAINHAND, reqLstep, { BOT_CLASS_ROGUE, BOT_CLASS_SPELLBREAKER });\n+                            }\n+                            push_gear_to_classes(proto, BOT_SLOT_MAINHAND, reqLstep, { BOT_CLASS_PALADIN, BOT_CLASS_SHAMAN });\n+                            if (is_caster_item || proto.RequiredLevel < 55 || (proto.RequiredLevel < 78 && (proto.RandomProperty || proto.RandomSuffix)))\n+                                push_gear_to_classes(proto, BOT_SLOT_MAINHAND, reqLstep, { BOT_CLASS_DRUID, BOT_CLASS_PRIEST });\n+                        }\n+                        if (proto.InventoryType == INVTYPE_WEAPON || proto.InventoryType == INVTYPE_WEAPONOFFHAND)\n+                        {\n+                            if (!is_caster_item)\n+                            {\n+                                if (proto.RequiredLevel < 60 - ITEM_SORTING_LEVEL_STEP)\n+                                    push_gear_to_classes(proto, BOT_SLOT_OFFHAND, reqLstep, { BOT_CLASS_WARRIOR });\n+                                push_gear_to_classes(proto, BOT_SLOT_OFFHAND, reqLstep, { BOT_CLASS_ROGUE });\n+                            }\n+                            push_gear_to_classes(proto, BOT_SLOT_OFFHAND, reqLstep, { BOT_CLASS_SHAMAN });\n+                        }\n+                        break;\n+                    case ItemSubclassWeapon::ITEM_SUBCLASS_WEAPON_SWORD:\n+                        if (proto.InventoryType == INVTYPE_WEAPON || proto.InventoryType == INVTYPE_WEAPONMAINHAND)\n+                        {\n+                            if (!is_caster_item)\n+                            {\n+                                push_gear_to_classes(proto, BOT_SLOT_MAINHAND, reqLstep, { BOT_CLASS_WARRIOR });\n+                                push_gear_to_classes(proto, BOT_SLOT_MAINHAND, reqLstep, { BOT_CLASS_ROGUE, BOT_CLASS_SPELLBREAKER, BOT_CLASS_DARK_RANGER });\n+                            }\n+                            push_gear_to_classes(proto, BOT_SLOT_MAINHAND, reqLstep, { BOT_CLASS_PALADIN });\n+                            if (is_caster_item || proto.RequiredLevel < 55 || (proto.RequiredLevel < 78 && (proto.RandomProperty || proto.RandomSuffix)))\n+                                push_gear_to_classes(proto, BOT_SLOT_MAINHAND, reqLstep, { BOT_CLASS_MAGE, BOT_CLASS_WARLOCK });\n+                        }\n+                        if (proto.InventoryType == INVTYPE_WEAPON || proto.InventoryType == INVTYPE_WEAPONOFFHAND)\n+                        {\n+                            if (!is_caster_item)\n+                            {\n+                                if (proto.RequiredLevel < 60 - ITEM_SORTING_LEVEL_STEP)\n+                                    push_gear_to_classes(proto, BOT_SLOT_OFFHAND, reqLstep, { BOT_CLASS_WARRIOR });\n+                                push_gear_to_classes(proto, BOT_SLOT_OFFHAND, reqLstep, { BOT_CLASS_ROGUE, BOT_CLASS_DARK_RANGER });\n+                            }\n+                        }\n+                        break;\n+                    case ItemSubclassWeapon::ITEM_SUBCLASS_WEAPON_FIST:\n+                        if (proto.InventoryType == INVTYPE_WEAPON || proto.InventoryType == INVTYPE_WEAPONMAINHAND)\n+                        {\n+                            if (!is_caster_item)\n+                            {\n+                                push_gear_to_classes(proto, BOT_SLOT_MAINHAND, reqLstep, { BOT_CLASS_WARRIOR });\n+                                push_gear_to_classes(proto, BOT_SLOT_MAINHAND, reqLstep, { BOT_CLASS_SHAMAN, BOT_CLASS_ROGUE, BOT_CLASS_SPELLBREAKER });\n+                            }\n+                        }\n+                        if (proto.InventoryType == INVTYPE_WEAPON || proto.InventoryType == INVTYPE_WEAPONOFFHAND)\n+                        {\n+                            if (!is_caster_item)\n+                            {\n+                                if (proto.RequiredLevel < 60 - ITEM_SORTING_LEVEL_STEP)\n+                                    push_gear_to_classes(proto, BOT_SLOT_OFFHAND, reqLstep, { BOT_CLASS_WARRIOR });\n+                                push_gear_to_classes(proto, BOT_SLOT_OFFHAND, reqLstep, { BOT_CLASS_SHAMAN, BOT_CLASS_ROGUE });\n+                            }\n+                        }\n+                        break;\n+                    case ItemSubclassWeapon::ITEM_SUBCLASS_WEAPON_DAGGER:\n+                        if (proto.InventoryType == INVTYPE_WEAPON || proto.InventoryType == INVTYPE_WEAPONMAINHAND)\n+                        {\n+                            if (!is_caster_item)\n+                            {\n+                                if (proto.RequiredLevel < 60 - ITEM_SORTING_LEVEL_STEP)\n+                                    push_gear_to_classes(proto, BOT_SLOT_MAINHAND, reqLstep, { BOT_CLASS_WARRIOR });\n+                                push_gear_to_classes(proto, BOT_SLOT_MAINHAND, reqLstep, { BOT_CLASS_ROGUE, BOT_CLASS_SPELLBREAKER, BOT_CLASS_DARK_RANGER });\n+                            }\n+                            push_gear_to_classes(proto, BOT_SLOT_MAINHAND, reqLstep, { BOT_CLASS_SHAMAN });\n+                            if (is_caster_item || proto.RequiredLevel < 55 || (proto.RequiredLevel < 78 && (proto.RandomProperty || proto.RandomSuffix)))\n+                                push_gear_to_classes(proto, BOT_SLOT_MAINHAND, reqLstep, { BOT_CLASS_PRIEST, BOT_CLASS_MAGE, BOT_CLASS_WARLOCK, BOT_CLASS_DRUID, BOT_CLASS_SEA_WITCH });\n+                        }\n+                        if (proto.InventoryType == INVTYPE_WEAPON || proto.InventoryType == INVTYPE_WEAPONOFFHAND)\n+                        {\n+                            if (!is_caster_item)\n+                            {\n+                                if (proto.RequiredLevel < 60 - ITEM_SORTING_LEVEL_STEP)\n+                                    push_gear_to_classes(proto, BOT_SLOT_OFFHAND, reqLstep, { BOT_CLASS_WARRIOR });\n+                                push_gear_to_classes(proto, BOT_SLOT_OFFHAND, reqLstep, { BOT_CLASS_ROGUE, BOT_CLASS_DARK_RANGER });\n+                            }\n+                            push_gear_to_classes(proto, BOT_SLOT_OFFHAND, reqLstep, { BOT_CLASS_SHAMAN, BOT_CLASS_SEA_WITCH });\n+                        }\n+                        break;\n+                    default:\n+                        break;\n+                }\n+                break;\n+            default:\n+                break;\n+        }\n+    }\n+\n+    for (uint32 c = BOT_CLASS_WARRIOR; c < BOT_CLASS_END; ++c)\n+    {\n+        if (!((1u << c) & ALL_BOT_CLASSES_MASK))\n+            continue;\n+\n+        ItemPerSlot const& ips_arr = _botsWanderCreaturesSortedGear.at(c);\n+        for (uint32 s = BOT_SLOT_MAINHAND; s < BOT_INVENTORY_SIZE; ++s)\n+        {\n+            if (s == BOT_SLOT_FINGER2 || s == BOT_SLOT_TRINKET1 || s == BOT_SLOT_TRINKET2 || s == BOT_SLOT_BODY)\n+                continue;\n+            if ((s == BOT_SLOT_FINGER1 || s == BOT_SLOT_NECK || s == BOT_SLOT_BACK) && c == BOT_CLASS_SPHYNX)\n+                continue;\n+            if (s == BOT_SLOT_RANGED && !(c == BOT_CLASS_HUNTER || c == BOT_CLASS_ROGUE || c == BOT_CLASS_WARRIOR || c == BOT_CLASS_PRIEST ||\n+                c == BOT_CLASS_MAGE || c == BOT_CLASS_WARLOCK || c == BOT_CLASS_DARK_RANGER || c == BOT_CLASS_SEA_WITCH))\n+                continue;\n+            ItemLeveledArr const& il_arr = ips_arr[s];\n+            \n+            for (auto lstep : NPCBots::index_array<uint32, LEVEL_STEPS>)\n+            {\n+                if ((s == BOT_SLOT_SHOULDERS || s == BOT_SLOT_FINGER1 || s == BOT_SLOT_NECK) && lstep < 4)\n+                    continue;\n+                if ((s == BOT_SLOT_HEAD || s == BOT_SLOT_TRINKET1) && lstep < 6)\n+                    continue;\n+                if (s == BOT_SLOT_OFFHAND &&\n+                    (lstep < 3 || c == BOT_CLASS_PALADIN || c == BOT_CLASS_HUNTER || c == BOT_CLASS_DEATH_KNIGHT || c == BOT_CLASS_BM || c == BOT_CLASS_ARCHMAGE ||\n+                        c == BOT_CLASS_SPHYNX || c == BOT_CLASS_DREADLORD || c == BOT_CLASS_NECROMANCER || c == BOT_CLASS_CRYPT_LORD))\n+                    continue;\n+                if ((c == BOT_CLASS_DREADLORD || c == BOT_CLASS_DEATH_KNIGHT) && lstep < 8)\n+                    continue;\n+                if (il_arr[lstep].empty())\n+                {\n+                    uint32 minlvl = std::max<uint32>(lstep * ITEM_SORTING_LEVEL_STEP, 1);\n+                    uint32 maxlvl = (lstep + 1) * ITEM_SORTING_LEVEL_STEP - 1;\n+                    BOT_LOG_DEBUG(\"npcbots\", \"No items for class {} slot {} at levels {}-{}!\", c, s, minlvl, maxlvl);\n+                }\n+            }\n+        }\n+    }\n+\n+    BOT_LOG_INFO(\"server.loading\", \">> Sorted wandering bots gear in {} ms\", GetMSTimeDiffToNow(oldMSTime));\n+}\n+\n+Item* BotDataMgr::GenerateWanderingBotItem(uint8 slot, uint8 botclass, uint8 level, std::function<bool(uint8, ItemTemplate const*)> const& check)\n+{\n+    ASSERT(slot < BOT_INVENTORY_SIZE);\n+    ASSERT(botclass < BOT_CLASS_END);\n+    ASSERT(level <= DEFAULT_MAX_LEVEL + 4);\n+\n+    uint8 lvl = level;\n+    while (_botsWanderCreaturesSortedGear[botclass][slot][lvl / ITEM_SORTING_LEVEL_STEP].empty() && lvl > ITEM_SORTING_LEVEL_STEP)\n+        lvl -= ITEM_SORTING_LEVEL_STEP;\n+\n+    auto& itemIdVec = _botsWanderCreaturesSortedGear[botclass][slot][lvl / ITEM_SORTING_LEVEL_STEP];\n+    if (!itemIdVec.empty())\n+    {\n+        ItemIdVector validVec;\n+        validVec.reserve(itemIdVec.size());\n+        uint32 maxItemLevel = BotCfg::GetBotWandererMaxItemLevel(level);\n+        for (uint32 maxLvl : { maxItemLevel, decltype(maxItemLevel){} })\n+        {\n+            if (!validVec.empty())\n+                break;\n+\n+            for (uint32 iid : itemIdVec)\n+            {\n+                ItemTemplate const* proto = sObjectMgr->GetItemTemplate(iid);\n+                if ((!maxLvl || proto->ItemLevel <= maxLvl) && check(slot, proto))\n+                    validVec.push_back(iid);\n+            }\n+        }\n+\n+        if (!validVec.empty())\n+        {\n+            uint32 itemId = Bcore::Containers::SelectRandomContainerElement(validVec);\n+            if (Item* newItem = Item::CreateItem(itemId, 1, nullptr))\n+            {\n+                if (uint32 randomPropertyId = Item::GenerateItemRandomPropertyId(itemId))\n+                    newItem->SetItemRandomProperties(randomPropertyId);\n+\n+                return newItem;\n+            }\n+        }\n+    }\n+\n+    return nullptr;\n+}\n+\n+bool BotDataMgr::GenerateWanderingBotItemEnchants(Item* item, uint8 slot, uint8 spec)\n+{\n+    bool result = false;\n+\n+    switch (slot)\n+    {\n+        case BOT_SLOT_BODY:\n+        case BOT_SLOT_TRINKET1:\n+        case BOT_SLOT_TRINKET2:\n+            return result;\n+        default:\n+            break;\n+    }\n+\n+    ItemTemplate const* proto = item->GetTemplate();\n+\n+    if (proto->RequiredLevel < 60)\n+        return result;\n+\n+    static const auto is_enchantable = [](ItemTemplate const* p, SpellInfo const* s) {\n+        SpellEffectInfo const& e = s->GetEffect(EFFECT_0);\n+        return e.Effect == SPELL_EFFECT_ENCHANT_ITEM && s->EquippedItemClass == int32(p->Class) && s->BaseLevel <= p->RequiredLevel && e.MiscValue > 0 &&\n+            (s->EquippedItemClass == ITEM_CLASS_WEAPON ? !!(s->EquippedItemSubClassMask & (1u << p->SubClass)) : !!(s->EquippedItemInventoryTypeMask & (1u << p->InventoryType))) &&\n+            sSpellItemEnchantmentStore.LookupEntry(uint32(e.MiscValue));\n+    };\n+\n+    static const std::array<uint32, 10> weapon_enchants_dk{ 53323, 53331, 53341, 53342, 53343, 53344, 53346, 53347, 62158, 70164 }; //2h only\n+    static const std::array<uint32, 11> weapon_enchants_caster{ 27968, 27975, 28003, 34010, 44510, 44629, 59619, 59625, 60714, 62948, 62959 };\n+    static const std::array<uint32, 18> weapon_enchants_melee{ 27971, 27977, 27984, 28004, 42620, 42974, 44524, 44576, 44630, 44633, 46578, 55836, 59619, 59621, 60621, 60691, 60707, 62257 };\n+    static const std::array<uint32, 34> armor_enchants_caster{ 34003, 34008, 44383, 44488, 44492, 44528, 44555, 44582, 44592, 44612, 44616, 44623, 44635, 47898, 47900, 47901, 57690, 57691, 59636, 59784, 59970, 60609, 60653, 60692, 60767, 61120, 61271, 62256, 60583, 50911, 55016, 55634, 55642, 56034 };\n+    static const std::array<uint32, 40> armor_enchants_melee{ 34007, 34008, 34009, 44383, 44484, 44488, 44492, 44500, 44513, 44528, 44529, 44575, 44589, 44598, 44612, 44616, 44623, 47898, 47900, 47901, 59777, 59954, 60606, 60609, 60616, 60623, 60663, 60668, 60692, 60763, 61271, 62256, 50903, 50911, 55016, 55777, 57690, 61117, 62201, 59636 };\n+\n+    //enchants\n+    SpellInfo const* sInfo = nullptr;\n+    std::vector<uint32> valid_enchant_ids;\n+    valid_enchant_ids.reserve(1ull << 6);\n+    switch (spec)\n+    {\n+        case BOT_SPEC_PALADIN_HOLY:\n+        case BOT_SPEC_PRIEST_DISCIPLINE:\n+        case BOT_SPEC_PRIEST_HOLY:\n+        case BOT_SPEC_PRIEST_SHADOW:\n+        case BOT_SPEC_SHAMAN_ELEMENTAL:\n+        case BOT_SPEC_SHAMAN_RESTORATION:\n+        case BOT_SPEC_MAGE_ARCANE:\n+        case BOT_SPEC_MAGE_FIRE:\n+        case BOT_SPEC_MAGE_FROST:\n+        case BOT_SPEC_WARLOCK_AFFLICTION:\n+        case BOT_SPEC_WARLOCK_DEMONOLOGY:\n+        case BOT_SPEC_WARLOCK_DESTRUCTION:\n+        case BOT_SPEC_DRUID_BALANCE:\n+        case BOT_SPEC_DRUID_RESTORATION:\n+            switch (proto->Class)\n+            {\n+                case ITEM_CLASS_WEAPON:\n+                    for (uint32 spellId : weapon_enchants_caster)\n+                    {\n+                        sInfo = sSpellMgr->AssertSpellInfo(spellId);\n+                        if (is_enchantable(proto, sInfo))\n+                            valid_enchant_ids.push_back(uint32(sInfo->GetEffect(EFFECT_0).MiscValue));\n+                    }\n+                    break;\n+                case ITEM_CLASS_ARMOR:\n+                    for (uint32 spellId : armor_enchants_caster)\n+                    {\n+                        sInfo = sSpellMgr->AssertSpellInfo(spellId);\n+                        if (is_enchantable(proto, sInfo))\n+                            valid_enchant_ids.push_back(uint32(sInfo->GetEffect(EFFECT_0).MiscValue));\n+                    }\n+                    break;\n+                default:\n+                    break;\n+            }\n+            break;\n+        case BOT_SPEC_DK_BLOOD:\n+        case BOT_SPEC_DK_FROST:\n+        case BOT_SPEC_DK_UNHOLY:\n+            switch (proto->Class)\n+            {\n+                case ITEM_CLASS_WEAPON:\n+                    for (uint32 spellId : weapon_enchants_dk)\n+                    {\n+                        sInfo = sSpellMgr->AssertSpellInfo(spellId);\n+                        if (is_enchantable(proto, sInfo))\n+                            valid_enchant_ids.push_back(uint32(sInfo->GetEffect(EFFECT_0).MiscValue));\n+                    }\n+                    break;\n+                default:\n+                    break;\n+            }\n+        [[fallthrough]];\n+        case BOT_SPEC_WARRIOR_ARMS:\n+        case BOT_SPEC_WARRIOR_FURY:\n+        case BOT_SPEC_WARRIOR_PROTECTION:\n+        case BOT_SPEC_PALADIN_PROTECTION:\n+        case BOT_SPEC_PALADIN_RETRIBUTION:\n+        case BOT_SPEC_HUNTER_BEASTMASTERY:\n+        case BOT_SPEC_HUNTER_MARKSMANSHIP:\n+        case BOT_SPEC_HUNTER_SURVIVAL:\n+        case BOT_SPEC_ROGUE_ASSASINATION:\n+        case BOT_SPEC_ROGUE_COMBAT:\n+        case BOT_SPEC_ROGUE_SUBTLETY:\n+        case BOT_SPEC_SHAMAN_ENHANCEMENT:\n+        case BOT_SPEC_DRUID_FERAL:\n+            switch (proto->Class)\n+            {\n+                case ITEM_CLASS_WEAPON:\n+                    for (uint32 spellId : weapon_enchants_melee)\n+                    {\n+                        sInfo = sSpellMgr->AssertSpellInfo(spellId);\n+                        if (is_enchantable(proto, sInfo))\n+                            valid_enchant_ids.push_back(uint32(sInfo->GetEffect(EFFECT_0).MiscValue));\n+                    }\n+                    break;\n+                case ITEM_CLASS_ARMOR:\n+                    for (uint32 spellId : armor_enchants_melee)\n+                    {\n+                        sInfo = sSpellMgr->AssertSpellInfo(spellId);\n+                        if (is_enchantable(proto, sInfo))\n+                            valid_enchant_ids.push_back(uint32(sInfo->GetEffect(EFFECT_0).MiscValue));\n+                    }\n+                    break;\n+                default:\n+                    break;\n+            }\n+            break;\n+        default:\n+            break;\n+    }\n+\n+    uint32 enchant_id;\n+    enchant_id = valid_enchant_ids.empty() ? 0 : valid_enchant_ids.size() == 1u ? valid_enchant_ids.front() : Bcore::Containers::SelectRandomContainerElement(valid_enchant_ids);\n+    if (enchant_id)\n+    {\n+        item->SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + PERM_ENCHANTMENT_SLOT*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_ID_OFFSET, enchant_id);\n+        item->SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + PERM_ENCHANTMENT_SLOT*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_DURATION_OFFSET, 0);\n+        item->SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + PERM_ENCHANTMENT_SLOT*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_CHARGES_OFFSET, 0);\n+        result = true;\n+    }\n+\n+    //gems\n+    constexpr std::array<uint32, 5> gems_caster{ 40132, 40135, 40123, 40127, 40128 };\n+    constexpr std::array<uint32, 6> gems_melee{ 40136, 40140, 40124, 40125, 40127, 40128 };\n+\n+    for (auto i : NPCBots::index_array<uint8, MAX_ITEM_PROTO_SOCKETS>)\n+    {\n+        valid_enchant_ids.clear();\n+        switch (spec)\n+        {\n+            case BOT_SPEC_PALADIN_HOLY:\n+            case BOT_SPEC_PRIEST_DISCIPLINE:\n+            case BOT_SPEC_PRIEST_HOLY:\n+            case BOT_SPEC_PRIEST_SHADOW:\n+            case BOT_SPEC_SHAMAN_ELEMENTAL:\n+            case BOT_SPEC_SHAMAN_RESTORATION:\n+            case BOT_SPEC_MAGE_ARCANE:\n+            case BOT_SPEC_MAGE_FIRE:\n+            case BOT_SPEC_MAGE_FROST:\n+            case BOT_SPEC_WARLOCK_AFFLICTION:\n+            case BOT_SPEC_WARLOCK_DEMONOLOGY:\n+            case BOT_SPEC_WARLOCK_DESTRUCTION:\n+            case BOT_SPEC_DRUID_BALANCE:\n+            case BOT_SPEC_DRUID_RESTORATION:\n+                for (uint32 gId : gems_caster)\n+                {\n+                    GemPropertiesEntry const* gprops = sGemPropertiesStore.LookupEntry(sObjectMgr->GetItemTemplate(gId)->GemProperties);\n+                    if (gprops->color & proto->Socket[i].Color)\n+                        valid_enchant_ids.push_back(gprops->spellitemenchantement);\n+                }\n+                break;\n+            case BOT_SPEC_DK_BLOOD:\n+            case BOT_SPEC_DK_FROST:\n+            case BOT_SPEC_DK_UNHOLY:\n+            case BOT_SPEC_WARRIOR_ARMS:\n+            case BOT_SPEC_WARRIOR_FURY:\n+            case BOT_SPEC_WARRIOR_PROTECTION:\n+            case BOT_SPEC_PALADIN_PROTECTION:\n+            case BOT_SPEC_PALADIN_RETRIBUTION:\n+            case BOT_SPEC_HUNTER_BEASTMASTERY:\n+            case BOT_SPEC_HUNTER_MARKSMANSHIP:\n+            case BOT_SPEC_HUNTER_SURVIVAL:\n+            case BOT_SPEC_ROGUE_ASSASINATION:\n+            case BOT_SPEC_ROGUE_COMBAT:\n+            case BOT_SPEC_ROGUE_SUBTLETY:\n+            case BOT_SPEC_SHAMAN_ENHANCEMENT:\n+            case BOT_SPEC_DRUID_FERAL:\n+                for (uint32 gId : gems_melee)\n+                {\n+                    GemPropertiesEntry const* gprops = sGemPropertiesStore.LookupEntry(sObjectMgr->GetItemTemplate(gId)->GemProperties);\n+                    if (gprops->color & proto->Socket[i].Color)\n+                        valid_enchant_ids.push_back(gprops->spellitemenchantement);\n+                }\n+                break;\n+            default:\n+                break;\n+        }\n+\n+        enchant_id = valid_enchant_ids.empty() ? 0 : valid_enchant_ids.size() == 1u ? valid_enchant_ids.front() : Bcore::Containers::SelectRandomContainerElement(valid_enchant_ids);\n+        if (enchant_id)\n+        {\n+            item->SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + (uint8(SOCK_ENCHANTMENT_SLOT) + i)*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_ID_OFFSET, enchant_id);\n+            item->SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + (uint8(SOCK_ENCHANTMENT_SLOT) + i)*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_DURATION_OFFSET, 0);\n+            item->SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + (uint8(SOCK_ENCHANTMENT_SLOT) + i)*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_CHARGES_OFFSET, 0);\n+            result = true;\n+        }\n+    }\n+\n+    return result;\n+}\n+\n+CreatureTemplate const* BotDataMgr::GetBotExtraCreatureTemplate(uint32 entry)\n+{\n+    CreatureTemplateContainer::const_iterator cit = _botsWanderCreatureTemplates.find(entry);\n+    return cit == _botsWanderCreatureTemplates.cend() ? nullptr : &cit->second;\n+}\n+\n+EquipmentInfo const* BotDataMgr::GetBotEquipmentInfo(uint32 entry)\n+{\n+    decltype(_botsWanderCreatureEquipmentTemplates)::const_iterator cit = _botsWanderCreatureEquipmentTemplates.find(entry);\n+    if (cit == _botsWanderCreatureEquipmentTemplates.cend())\n+    {\n+        int8 eqId = 1;\n+        return sObjectMgr->GetEquipmentInfo(entry, eqId);\n+    }\n+    else\n+        return cit->second;\n+}\n+\n+void BotDataMgr::AddNpcBotData(uint32 entry, uint32 roles, uint8 spec, uint32 faction)\n+{\n+    if (!_botsData.contains(entry))\n+    {\n+        _botsData.emplace(std::piecewise_construct, std::forward_as_tuple(entry), std::forward_as_tuple(roles, faction, spec));\n+\n+        CharacterDatabasePreparedStatement* bstmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_NPCBOT);\n+        //\"INSERT INTO characters_npcbot (entry, roles, spec, faction) VALUES (?, ?, ?, ?)\", CONNECTION_ASYNC);\n+        bstmt->SetData(0, entry);\n+        bstmt->SetData(1, roles);\n+        bstmt->SetData(2, spec);\n+        bstmt->SetData(3, faction);\n+        CharacterDatabase.Execute(bstmt);\n+\n+        return;\n+    }\n+\n+    BOT_LOG_ERROR(\"sql.sql\", \"BotDataMgr::AddNpcBotData(): trying to add new data but entry already exists! entry = {}\", entry);\n+}\n+NpcBotData const* BotDataMgr::SelectNpcBotData(uint32 entry)\n+{\n+    NpcBotDataMap::const_iterator itr = _botsData.find(entry);\n+    return itr != _botsData.cend() ? &itr->second : nullptr;\n+}\n+void BotDataMgr::UpdateNpcBotData(uint32 entry, NpcBotDataUpdateType updateType, void* data)\n+{\n+    NpcBotDataMap::iterator itr = _botsData.find(entry);\n+    if (itr == _botsData.end())\n+        return;\n+\n+    CharacterDatabasePreparedStatement* bstmt;\n+    switch (updateType)\n+    {\n+        case NPCBOT_UPDATE_OWNER:\n+        {\n+            if (itr->second.owner == *(uint32*)(data))\n+                break;\n+            itr->second.owner = *(uint32*)(data);\n+            itr->second.hire_time = itr->second.owner ? uint64(std::time(0)) : 1ULL;\n+            bstmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_NPCBOT_OWNER);\n+            //\"UPDATE characters_npcbot SET owner = ?, hire_time = FROM_UNIXTIME(?) WHERE entry = ?\", CONNECTION_ASYNC\n+            bstmt->SetData(0, itr->second.owner);\n+            bstmt->SetData(1, itr->second.hire_time);\n+            bstmt->SetData(2, entry);\n+            CharacterDatabase.Execute(bstmt);\n+            //break; //no break: erase transmogs\n+        }\n+        [[fallthrough]];\n+        case NPCBOT_UPDATE_TRANSMOG_ERASE:\n+            bstmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_NPCBOT_TRANSMOG);\n+            //\"DELETE FROM characters_npcbot_transmog WHERE entry = ?\", CONNECTION_ASYNC\n+            bstmt->SetData(0, entry);\n+            CharacterDatabase.Execute(bstmt);\n+            break;\n+        case NPCBOT_UPDATE_ROLES:\n+            itr->second.roles = *(uint32*)(data);\n+            bstmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_NPCBOT_ROLES);\n+            //\"UPDATE character_npcbot SET roles = ? WHERE entry = ?\", CONNECTION_ASYNC\n+            bstmt->SetData(0, itr->second.roles);\n+            bstmt->SetData(1, entry);\n+            CharacterDatabase.Execute(bstmt);\n+            break;\n+        case NPCBOT_UPDATE_SPEC:\n+            itr->second.spec = *(uint8*)(data);\n+            bstmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_NPCBOT_SPEC);\n+            //\"UPDATE characters_npcbot SET spec = ? WHERE entry = ?\", CONNECTION_ASYNCH\n+            bstmt->SetData(0, itr->second.spec);\n+            bstmt->SetData(1, entry);\n+            CharacterDatabase.Execute(bstmt);\n+            break;\n+        case NPCBOT_UPDATE_FACTION:\n+            itr->second.faction = *(uint32*)(data);\n+            bstmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_NPCBOT_FACTION);\n+            //\"UPDATE characters_npcbot SET faction = ? WHERE entry = ?\", CONNECTION_ASYNCH\n+            bstmt->SetData(0, itr->second.faction);\n+            bstmt->SetData(1, entry);\n+            CharacterDatabase.Execute(bstmt);\n+            break;\n+        case NPCBOT_UPDATE_SHARED_OWNERS:\n+        {\n+            NpcBotData::SharedOwnersContainer const* shared_owners = (NpcBotData::SharedOwnersContainer const*)(data);\n+\n+            if (std::addressof(itr->second.shared_owners) != shared_owners)\n+                itr->second.shared_owners = *shared_owners;\n+\n+            std::vector shared_owners_v(itr->second.shared_owners.cbegin(), itr->second.shared_owners.cend());\n+            std::ranges::sort(shared_owners_v);\n+            std::ostringstream ss;\n+            for (uint32 guid_low : shared_owners_v)\n+                ss << guid_low << ' ';\n+\n+            bstmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_NPCBOT_SHARED_OWNERS);\n+            //\"UPDATE characters_npcbot SET shared_owners = ? WHERE entry = ?\", CONNECTION_ASYNC\n+            bstmt->SetData(0, ss.view());\n+            bstmt->SetData(1, entry);\n+            CharacterDatabase.Execute(bstmt);\n+            break;\n+        }\n+        case NPCBOT_UPDATE_DISABLED_SPELLS:\n+        {\n+            NpcBotData::DisabledSpellsContainer const* spells = (NpcBotData::DisabledSpellsContainer const*)(data);\n+            std::ostringstream ss;\n+            for (uint32 spellId : *spells)\n+                ss << spellId << ' ';\n+\n+            bstmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_NPCBOT_DISABLED_SPELLS);\n+            //\"UPDATE characters_npcbot SET spells_disabled = ? WHERE entry = ?\", CONNECTION_ASYNCH\n+            bstmt->SetData(0, ss.view());\n+            bstmt->SetData(1, entry);\n+            CharacterDatabase.Execute(bstmt);\n+            break;\n+        }\n+        case NPCBOT_UPDATE_MISCVALUES:\n+        {\n+            NpcBotData::MiscValuesContainer const* miscvals = (NpcBotData::MiscValuesContainer const*)(data);\n+            std::ostringstream ss;\n+            for (auto [misc_type, misc_val] : *miscvals)\n+                ss << misc_type << ':' << misc_val << ' ';\n+\n+            bstmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_NPCBOT_MISCVALUES);\n+            //\"UPDATE characters_npcbot SET miscvalues = ? WHERE entry = ?\", CONNECTION_ASYNCH\n+            bstmt->SetData(0, ss.view());\n+            bstmt->SetData(1, entry);\n+            CharacterDatabase.Execute(bstmt);\n+            break;\n+        }\n+        case NPCBOT_UPDATE_EQUIPS:\n+        {\n+            Item** items = (Item**)(data);\n+\n+            EquipmentInfo const* einfo = BotDataMgr::GetBotEquipmentInfo(entry);\n+\n+            CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();\n+\n+            bstmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_NPCBOT_EQUIP);\n+            //\"UPDATE character_npcbot SET equipMhEx = ?, equipOhEx = ?, equipRhEx = ?, equipHead = ?, equipShoulders = ?, equipChest = ?, equipWaist = ?, equipLegs = ?,\n+            //equipFeet = ?, equipWrist = ?, equipHands = ?, equipBack = ?, equipBody = ?, equipFinger1 = ?, equipFinger2 = ?, equipTrinket1 = ?, equipTrinket2 = ?, equipNeck = ? WHERE entry = ?\", CONNECTION_ASYNC\n+            CharacterDatabasePreparedStatement* stmt;\n+            uint8 k;\n+            for (k = BOT_SLOT_MAINHAND; k != BOT_INVENTORY_SIZE; ++k)\n+            {\n+                itr->second.equips[k] = items[k] ? items[k]->GetGUID().GetCounter() : 0;\n+                if (Item const* botitem = items[k])\n+                {\n+                    bool standard = false;\n+                    for (auto i : NPCBots::index_array<uint8, MAX_EQUIPMENT_ITEMS>)\n+                    {\n+                        if (einfo->ItemEntry[i] == botitem->GetEntry())\n+                        {\n+                            itr->second.equips[k] = 0;\n+                            bstmt->SetData(k, uint32(0));\n+                            standard = true;\n+                            break;\n+                        }\n+                    }\n+                    if (standard)\n+                        continue;\n+\n+                    uint8 index = 0;\n+                    stmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_ITEM_INSTANCE);\n+                    //REPLACE INTO item_instance (itemEntry, owner_guid, creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomPropertyId, durability, playedTime, text, guid)\n+                    //VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\", CONNECTION_ASYNC : 0-13\n+                    stmt->SetData(  index, botitem->GetEntry());\n+                    stmt->SetData(++index, botitem->GetOwnerGUID().GetCounter());\n+                    stmt->SetData(++index, botitem->GetGuidValue(ITEM_FIELD_CREATOR).GetCounter());\n+                    stmt->SetData(++index, botitem->GetGuidValue(ITEM_FIELD_GIFTCREATOR).GetCounter());\n+                    stmt->SetData(++index, botitem->GetCount());\n+                    stmt->SetData(++index, botitem->GetUInt32Value(ITEM_FIELD_DURATION));\n+\n+                    std::ostringstream ssSpells;\n+                    for (auto i : NPCBots::index_array<uint8, MAX_ITEM_PROTO_SPELLS>)\n+                        ssSpells << botitem->GetSpellCharges(i) << ' ';\n+                    stmt->SetData(++index, ssSpells.str());\n+\n+                    stmt->SetData(++index, botitem->GetUInt32Value(ITEM_FIELD_FLAGS));\n+\n+                    std::ostringstream ssEnchants;\n+                    for (auto i : NPCBots::index_array<uint8, MAX_ENCHANTMENT_SLOT>)\n+                    {\n+                        ssEnchants << botitem->GetEnchantmentId(EnchantmentSlot(i)) << ' ';\n+                        ssEnchants << botitem->GetEnchantmentDuration(EnchantmentSlot(i)) << ' ';\n+                        ssEnchants << botitem->GetEnchantmentCharges(EnchantmentSlot(i)) << ' ';\n+                    }\n+                    stmt->SetData(++index, ssEnchants.str());\n+\n+                    stmt->SetData (++index, int16(botitem->GetItemRandomPropertyId()));\n+                    stmt->SetData(++index, uint16(botitem->GetUInt32Value(ITEM_FIELD_DURABILITY)));\n+                    stmt->SetData(++index, botitem->GetUInt32Value(ITEM_FIELD_CREATE_PLAYED_TIME));\n+                    stmt->SetData(++index, botitem->GetText());\n+                    stmt->SetData(++index, botitem->GetGUID().GetCounter());\n+\n+                    trans->Append(stmt);\n+\n+                    Item::DeleteFromInventoryDB(trans, botitem->GetGUID().GetCounter()); //prevent duplicates\n+\n+                    bstmt->SetData(k, botitem->GetGUID().GetCounter());\n+                }\n+                else\n+                    bstmt->SetData(k, uint32(0));\n+            }\n+\n+            bstmt->SetData(k, entry);\n+            trans->Append(bstmt);\n+            CharacterDatabase.CommitTransaction(trans);\n+            break;\n+        }\n+        case NPCBOT_UPDATE_ERASE:\n+        {\n+            NpcBotDataMap::iterator bitr = _botsData.find(entry);\n+            ASSERT(bitr != _botsData.end());\n+            _botsData.erase(bitr);\n+            bstmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_NPCBOT);\n+            //\"DELETE FROM characters_npcbot WHERE entry = ?\", CONNECTION_ASYNC\n+            bstmt->SetData(0, entry);\n+            CharacterDatabase.Execute(bstmt);\n+            break;\n+        }\n+        default:\n+            BOT_LOG_ERROR(\"sql.sql\", \"BotDataMgr:UpdateNpcBotData: unhandled updateType {}\", uint32(updateType));\n+            break;\n+    }\n+}\n+void BotDataMgr::UpdateNpcBotDataAll(uint32 playerGuid, NpcBotDataUpdateType updateType, void* data)\n+{\n+    CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();\n+    CharacterDatabasePreparedStatement* bstmt;\n+    uint32 newowner = *(uint32*)(data);\n+    switch (updateType)\n+    {\n+        case NPCBOT_UPDATE_OWNER:\n+            ASSERT(newowner == 0);\n+            bstmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_NPCBOT_EQUIP_RESET_ALL);\n+            //\"UPDATE characters_npcbot SET equipMhEx = 0, equipOhEx = 0, equipRhEx = 0, equipHead = 0, equipShoulders = 0, equipChest = 0, equipWaist = 0, equipLegs = 0, equipFeet = 0, \"\n+            //\"equipWrist = 0, equipHands = 0, equipBack = 0, equipBody = 0, equipFinger1 = 0, equipFinger2 = 0, equipTrinket1 = 0, equipTrinket2 = 0, equipNeck = 0 WHERE owner = ?\", CONNECTION_ASYNC\n+            bstmt->SetData(0, playerGuid);\n+            trans->Append(bstmt);\n+            bstmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_NPCBOT_TRANSMOG_ALL);\n+            //\"DELETE FROM characters_npcbot_transmog WHERE entry IN (SELECT entry FROM characters_npcbot WHERE owner = ?)\", CONNECTION_ASYNC\n+            bstmt->SetData(0, playerGuid);\n+            trans->Append(bstmt);\n+            bstmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_NPCBOT_SHARED_OWNERS_ALL);\n+            //\"UPDATE characters_npcbot SET shared_owners = NULL WHERE owner = ?\", CONNECTION_ASYNC\n+            bstmt->SetData(0, playerGuid);\n+            trans->Append(bstmt);\n+            bstmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_NPCBOT_OWNER_ALL);\n+            //\"UPDATE characters_npcbot SET owner = ?, hire_time = FROM_UNIXTIME(?) WHERE owner = ?\", CONNECTION_ASYNC\n+            bstmt->SetData(0, newowner);\n+            bstmt->SetData(1, uint64(1ULL));\n+            bstmt->SetData(2, playerGuid);\n+            trans->Append(bstmt);\n+            break;\n+        default:\n+            BOT_LOG_ERROR(\"sql.sql\", \"BotDataMgr:UpdateNpcBotDataAll: unhandled updateType {}\", uint32(updateType));\n+            break;\n+    }\n+\n+    if (trans->GetSize() > 0)\n+        CharacterDatabase.CommitTransaction(trans);\n+}\n+\n+void BotDataMgr::SaveNpcBotStats(NpcBotStats const& stats)\n+{\n+    CharacterDatabasePreparedStatement* bstmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_NPCBOT_STATS);\n+    //\"REPLACE INTO characters_npcbot_stats\n+    //(entry, maxhealth, maxpower, strength, agility, stamina, intellect, spirit, armor, defense,\n+    //resHoly, resFire, resNature, resFrost, resShadow, resArcane, blockPct, dodgePct, parryPct, critPct,\n+    //attackPower, spellPower, spellPen, hastePct, hitBonusPct, expertise, armorPenPct) VALUES\n+    //(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\", CONNECTION_ASYNC\n+\n+    uint32 index = 0;\n+    bstmt->SetData(  index, stats.entry);\n+    bstmt->SetData(++index, stats.maxhealth);\n+    bstmt->SetData(++index, stats.maxpower);\n+    bstmt->SetData(++index, stats.strength);\n+    bstmt->SetData(++index, stats.agility);\n+    bstmt->SetData(++index, stats.stamina);\n+    bstmt->SetData(++index, stats.intellect);\n+    bstmt->SetData(++index, stats.spirit);\n+    bstmt->SetData(++index, stats.armor);\n+    bstmt->SetData(++index, stats.defense);\n+    bstmt->SetData(++index, stats.resHoly);\n+    bstmt->SetData(++index, stats.resFire);\n+    bstmt->SetData(++index, stats.resNature);\n+    bstmt->SetData(++index, stats.resFrost);\n+    bstmt->SetData(++index, stats.resShadow);\n+    bstmt->SetData(++index, stats.resArcane);\n+    bstmt->SetData(++index, stats.blockPct);\n+    bstmt->SetData(++index, stats.dodgePct);\n+    bstmt->SetData(++index, stats.parryPct);\n+    bstmt->SetData(++index, stats.critPct);\n+    bstmt->SetData(++index, stats.attackPower);\n+    bstmt->SetData(++index, stats.spellPower);\n+    bstmt->SetData(++index, stats.spellPen);\n+    bstmt->SetData(++index, stats.hastePct);\n+    bstmt->SetData(++index, stats.hitBonusPct);\n+    bstmt->SetData(++index, stats.expertise);\n+    bstmt->SetData(++index, stats.armorPenPct);\n+\n+    CharacterDatabase.Execute(bstmt);\n+}\n+\n+NpcBotAppearanceData const* BotDataMgr::SelectNpcBotAppearance(uint32 entry)\n+{\n+    NpcBotAppearanceDataMap::const_iterator itr = _botsAppearanceData.find(entry);\n+    return itr != _botsAppearanceData.cend() ? &itr->second : nullptr;\n+}\n+\n+NpcBotExtras const* BotDataMgr::SelectNpcBotExtras(uint32 entry)\n+{\n+    NpcBotExtrasMap::const_iterator itr = _botsExtras.find(entry);\n+    return itr != _botsExtras.cend() ? &itr->second : nullptr;\n+}\n+\n+NpcBotTransmogData const* BotDataMgr::SelectNpcBotTransmogs(uint32 entry)\n+{\n+    NpcBotTransmogDataMap::const_iterator itr = _botsTransmogData.find(entry);\n+    return itr != _botsTransmogData.cend() ? &itr->second : nullptr;\n+}\n+void BotDataMgr::UpdateNpcBotTransmogData(uint32 entry, uint8 slot, uint32 item_id, int32 fake_id, bool update_db)\n+{\n+    ASSERT(slot < BOT_TRANSMOG_INVENTORY_SIZE);\n+\n+    _botsTransmogData.try_emplace(entry, NpcBotTransmogData{});\n+    _botsTransmogData.at(entry).transmogs[slot] = { item_id, fake_id };\n+\n+    if (update_db)\n+    {\n+        CharacterDatabasePreparedStatement* bstmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_NPCBOT_TRANSMOG);\n+        //\"REPLACE INTO characters_npcbot_transmog (entry, slot, item_id, fake_id) VALUES (?, ?, ?, ?)\", CONNECTION_ASYNC\n+        bstmt->SetData(0, entry);\n+        bstmt->SetData(1, slot);\n+        bstmt->SetData(2, item_id);\n+        bstmt->SetData(3, fake_id);\n+        CharacterDatabase.Execute(bstmt);\n+    }\n+}\n+\n+void BotDataMgr::ResetNpcBotTransmogData(uint32 entry, bool update_db)\n+{\n+    NpcBotTransmogDataMap::iterator itr = _botsTransmogData.find(entry);\n+    if (itr == _botsTransmogData.end())\n+        return;\n+\n+    auto& transmog_data = itr->second;\n+\n+    if (update_db)\n+    {\n+        CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();\n+        for (auto i : NPCBots::index_array<uint8, BOT_TRANSMOG_INVENTORY_SIZE>)\n+        {\n+            if (transmog_data.transmogs[i].first == 0 && transmog_data.transmogs[i].second == -1)\n+                continue;\n+\n+            CharacterDatabasePreparedStatement* bstmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_NPCBOT_TRANSMOG);\n+            //\"REPLACE INTO characters_npcbot_transmog (entry, slot, item_id, fake_id) VALUES (?, ?, ?, ?)\", CONNECTION_ASYNC\n+            bstmt->SetData(0, entry);\n+            bstmt->SetData(1, i);\n+            bstmt->SetData(2, 0);\n+            bstmt->SetData(3, -1);\n+            trans->Append(bstmt);\n+        }\n+\n+        if (trans->GetSize() > 0)\n+            CharacterDatabase.CommitTransaction(trans);\n+    }\n+\n+    for (auto i : NPCBots::index_array<uint8, BOT_TRANSMOG_INVENTORY_SIZE>)\n+        transmog_data.transmogs[i] = { 0, -1 };\n+}\n+\n+void BotDataMgr::RegisterBot(Creature const* bot)\n+{\n+    if (_existingBots.contains(bot))\n+    {\n+        BOT_LOG_ERROR(\"entities.unit\", \"BotDataMgr::RegisterBot: bot {} ({}) already registered!\",\n+            bot->GetEntry(), bot->GetName().c_str());\n+        return;\n+    }\n+\n+    std::unique_lock lock(*GetLock());\n+\n+    _existingBots.insert(bot);\n+    //BOT_LOG_ERROR(\"entities.unit\", \"BotDataMgr::RegisterBot: registered bot %u (%s)\", bot->GetEntry(), bot->GetName().c_str());\n+}\n+void BotDataMgr::UnregisterBot(Creature const* bot)\n+{\n+    std::unique_lock lock(*GetLock());\n+\n+    if (!_existingBots.contains(bot))\n+    {\n+        BOT_LOG_ERROR(\"entities.unit\", \"BotDataMgr::UnregisterBot: bot {} ({}) not found!\", bot->GetEntry(), bot->GetName());\n+        return;\n+    }\n+\n+    _existingBots.erase(bot);\n+    //BOT_LOG_ERROR(\"entities.unit\", \"BotDataMgr::UnregisterBot: unregistered bot %u (%s)\", bot->GetEntry(), bot->GetName().c_str());\n+}\n+Creature const* BotDataMgr::FindBot(uint32 entry)\n+{\n+    std::shared_lock lock(*GetLock());\n+\n+    auto it = std::ranges::find_if(_existingBots, [entry](Creature const* bot) { return bot->GetEntry() == entry; });\n+    return it != _existingBots.cend() ? *it : nullptr;\n+}\n+Creature const* BotDataMgr::FindBot(std::string_view name, LocaleConstant loc, std::vector<uint32> const* not_ids)\n+{\n+    std::wstring wname;\n+    if (Utf8toWStr(name, wname))\n+    {\n+        wstrToLower(wname);\n+        std::shared_lock lock(*GetLock());\n+        for (Creature const* bot : _existingBots)\n+        {\n+            if (not_ids && std::ranges::find(*not_ids, bot->GetEntry()) != not_ids->cend())\n+                continue;\n+\n+            std::string_view basename = bot->GetName();\n+            if (CreatureLocale const* creatureInfo = sObjectMgr->GetCreatureLocale(bot->GetEntry()))\n+            {\n+                if (creatureInfo->Name.size() > loc && !creatureInfo->Name[loc].empty())\n+                    basename = creatureInfo->Name[loc];\n+            }\n+\n+            std::wstring wbname;\n+            if (!Utf8toWStr(basename, wbname))\n+                continue;\n+\n+            wstrToLower(wbname);\n+            if (wbname == wname)\n+                return bot;\n+        }\n+    }\n+\n+    return nullptr;\n+}\n+\n+NpcBotRegistry const& BotDataMgr::GetExistingNPCBots()\n+{\n+    return _existingBots;\n+}\n+\n+void BotDataMgr::GetNPCBotGuidsByOwner(std::vector<ObjectGuid> &guids_vec, ObjectGuid owner_guid, bool count_shared)\n+{\n+    ASSERT(AllBotsLoaded());\n+\n+    std::shared_lock lock(*GetLock());\n+\n+    for (Creature const* bot : _existingBots)\n+    {\n+        if (_botsData.at(bot->GetEntry()).owner == owner_guid.GetCounter() || (count_shared && _botsData.at(bot->GetEntry()).shared_owners.contains(owner_guid.GetCounter())))\n+            guids_vec.push_back(bot->GetGUID());\n+    }\n+}\n+\n+ObjectGuid BotDataMgr::GetNPCBotGuid(uint32 entry)\n+{\n+    ASSERT(AllBotsLoaded());\n+\n+    std::shared_lock lock(*GetLock());\n+\n+    for (Creature const* bot : _existingBots)\n+    {\n+        if (bot->GetEntry() == entry)\n+            return bot->GetGUID();\n+    }\n+\n+    return ObjectGuid::Empty;\n+}\n+\n+std::vector<uint32> BotDataMgr::GetExistingNPCBotIds()\n+{\n+    ASSERT(AllBotsLoaded());\n+\n+    std::vector<uint32> existing_ids;\n+    existing_ids.reserve(_botsData.size());\n+    for (auto const& [bot_id, _] : _botsData)\n+        existing_ids.push_back(bot_id);\n+\n+    return existing_ids;\n+}\n+\n+uint8 BotDataMgr::GetOwnedBotsCount(ObjectGuid owner_guid, uint32 class_mask, bool count_shared)\n+{\n+    uint8 count = 0;\n+    for (auto const& [bot_id, bot_data] : _botsData)\n+        if ((bot_data.owner == owner_guid.GetCounter() || (count_shared && bot_data.shared_owners.contains(owner_guid.GetCounter()))) &&\n+            (!class_mask || !!(class_mask & (1u << (_botsExtras.at(bot_id).bclass - 1)))))\n+            ++count;\n+    return count;\n+}\n+\n+uint8 BotDataMgr::GetAccountBotsCount(uint32 account_id)\n+{\n+    CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_NPCBOT_ACC_BOT_COUNT);\n+    stmt->SetData(0, account_id);\n+\n+    PreparedQueryResult result = CharacterDatabase.Query(stmt);\n+    if (result)\n+        return (*result)[0].Get<uint64>();\n+\n+    return 0;\n+}\n+\n+uint8 BotDataMgr::GetLevelBonusForBotRank(uint32 rank)\n+{\n+    switch (rank)\n+    {\n+        case CREATURE_ELITE_RARE:\n+            return 1;\n+        case CREATURE_ELITE_ELITE:\n+            return 2;\n+        case CREATURE_ELITE_RAREELITE:\n+            return 3;\n+        default:\n+            return 0;\n+    }\n+}\n+\n+uint8 BotDataMgr::GetMinLevelForMapId(uint32 mapId)\n+{\n+    decltype(_wpMinSpawnLevelPerMapId)::const_iterator cit = _wpMinSpawnLevelPerMapId.find(mapId);\n+    if (cit != _wpMinSpawnLevelPerMapId.cend())\n+        return cit->second;\n+\n+    switch (mapId)\n+    {\n+        case 0:\n+        case 1:\n+            return 1;\n+        case 530:\n+            return 61;\n+        case 571:\n+            return 71;\n+        default:\n+            return 1;\n+    }\n+}\n+uint8 BotDataMgr::GetMaxLevelForMapId(uint32 mapId)\n+{\n+    decltype(_wpMaxSpawnLevelPerMapId)::const_iterator cit = _wpMaxSpawnLevelPerMapId.find(mapId);\n+    if (cit != _wpMaxSpawnLevelPerMapId.cend())\n+        return cit->second;\n+\n+    switch (mapId)\n+    {\n+        case 0:\n+        case 1:\n+            return 60;\n+        case 530:\n+            return 70;\n+        case 571:\n+            return 80;\n+        default:\n+            return 80;\n+    }\n+}\n+\n+uint8 BotDataMgr::GetMinLevelForBotClass(uint8 m_class)\n+{\n+    switch (m_class)\n+    {\n+        case BOT_CLASS_DEATH_KNIGHT:\n+            return 55;\n+        case BOT_CLASS_ARCHMAGE:\n+        case BOT_CLASS_SPELLBREAKER:\n+        case BOT_CLASS_NECROMANCER:\n+            return 20;\n+        case BOT_CLASS_DARK_RANGER:\n+            return 40;\n+        case BOT_CLASS_SPHYNX:\n+        case BOT_CLASS_DREADLORD:\n+            return 60;\n+        default:\n+            return 1;\n+    }\n+}\n+\n+int32 BotDataMgr::GetBotBaseReputation(Creature const* bot, FactionEntry const* factionEntry)\n+{\n+    if (!factionEntry)\n+        return 0;\n+\n+    if (bot->IsNPCBotPet())\n+        bot = bot->GetBotPetAI()->GetPetsOwner();\n+\n+    uint32 raceMask = GetDefaultFactionForBotRaceClass(bot->GetBotClass(), bot->GetRace()) == FACTION_TEMPLATE_NEUTRAL_HOSTILE ? 0 : bot->GetRaceMask();\n+    uint32 classMask = bot->GetClassMask();\n+\n+    int32 minRep = 42999;\n+    for (auto i : NPCBots::index_array<uint8, std::size(decltype(FactionEntry::BaseRepValue){})>)\n+    {\n+        if (raceMask == 0)\n+            minRep = std::min<int32>(minRep, factionEntry->BaseRepValue[i]);\n+        if ((factionEntry->BaseRepRaceMask[i] & raceMask || (factionEntry->BaseRepRaceMask[i] == 0 && factionEntry->BaseRepClassMask[i] != 0)) &&\n+            (factionEntry->BaseRepClassMask[i] & classMask || factionEntry->BaseRepClassMask[i] == 0))\n+        {\n+            return factionEntry->BaseRepValue[i];\n+        }\n+    }\n+\n+    return std::min<int32>(minRep, 0);\n+}\n+\n+uint32 BotDataMgr::GetDefaultFactionForBotRaceClass(uint8 bot_class, uint8 bot_race)\n+{\n+    if (bot_class >= BOT_CLASS_EX_START)\n+        return uint32(FACTION_TEMPLATE_NEUTRAL_HOSTILE);\n+\n+    ChrRacesEntry const* rentry = sChrRacesStore.LookupEntry(bot_race);\n+    return rentry ? rentry->FactionID : uint32(FACTION_TEMPLATE_NEUTRAL_HOSTILE);\n+}\n+\n+TeamId BotDataMgr::GetTeamIdForFaction(uint32 factionTemplateId)\n+{\n+    if (FactionTemplateEntry const* fte = sFactionTemplateStore.LookupEntry(factionTemplateId))\n+    {\n+        if (fte->ourMask & FACTION_MASK_ALLIANCE)\n+            return TEAM_ALLIANCE;\n+        else if (fte->ourMask & FACTION_MASK_HORDE)\n+            return TEAM_HORDE;\n+    }\n+\n+    return TEAM_NEUTRAL;\n+}\n+\n+uint32 BotDataMgr::GetTeamForFaction(uint32 factionTemplateId)\n+{\n+    switch (GetTeamIdForFaction(factionTemplateId))\n+    {\n+        case TEAM_ALLIANCE:\n+            return ALLIANCE;\n+        case TEAM_HORDE:\n+            return HORDE;\n+        default:\n+            return TEAM_OTHER;\n+    }\n+}\n+\n+bool BotDataMgr::CanDepositBotBankItemsCount(ObjectGuid playerGuid, uint32 items_count)\n+{\n+    if (uint32 capacity = BotCfg::GetGearBankCapacity())\n+    {\n+        uint32 stored_count = GetBotBankItemsCount(playerGuid);\n+        if (stored_count + items_count > capacity)\n+            return false;\n+    }\n+    return true;\n+}\n+\n+BotBankItemContainer const* BotDataMgr::GetBotBankItems(ObjectGuid playerGuid)\n+{\n+    decltype(_botStoredGearMap)::iterator mci = _botStoredGearMap.find(playerGuid);\n+    return mci != _botStoredGearMap.cend() ? &mci->second : nullptr;\n+}\n+\n+uint32 BotDataMgr::GetBotBankItemsCount(ObjectGuid playerGuid)\n+{\n+    if (BotBankItemContainer const* botBankItems = GetBotBankItems(playerGuid))\n+        return static_cast<uint32>(botBankItems->size());\n+    return 0;\n+}\n+\n+Item* BotDataMgr::WithdrawBotBankItem(ObjectGuid playerGuid, ObjectGuid::LowType itemGuidLow)\n+{\n+    decltype(_botStoredGearMap)::iterator mci = _botStoredGearMap.find(playerGuid);\n+    if (mci != _botStoredGearMap.cend())\n+    {\n+        auto ici = std::ranges::find_if(mci->second, [=](Item const* item) { return item->GetGUID().GetCounter() == itemGuidLow; });\n+        if (ici != mci->second.cend())\n+        {\n+            Item* item = *ici;\n+            mci->second.erase(ici);\n+            return item;\n+        }\n+    }\n+\n+    return nullptr;\n+}\n+\n+void BotDataMgr::DepositBotBankItem(ObjectGuid playerGuid, Item* item)\n+{\n+    _botStoredGearMap[playerGuid].insert(item);\n+}\n+\n+void BotDataMgr::SaveNpcBotStoredGear(ObjectGuid playerGuid, CharacterDatabaseTransaction trans)\n+{\n+    decltype(_botStoredGearMap)::iterator mci = _botStoredGearMap.find(playerGuid);\n+    // we don't check if container is empty!\n+    // we have to be able to erase items always\n+    if (mci == _botStoredGearMap.cend())\n+        return;\n+\n+    trans->Append(\"DELETE FROM characters_npcbot_gear_storage WHERE guid = {}\", mci->first.GetCounter());\n+    for (Item* item : mci->second)\n+    {\n+        //order is important here\n+        item->SaveToDB(trans);\n+        item->DeleteFromInventoryDB(trans);\n+        trans->Append(\"INSERT INTO characters_npcbot_gear_storage (guid, item_guid) VALUES ({}, {})\", mci->first.GetCounter(), item->GetGUID().GetCounter());\n+    }\n+}\n+\n+uint32 BotDataMgr::GetBotItemSetsCount(ObjectGuid playerGuid)\n+{\n+    if (BotItemSetsArray const* item_sets = GetBotItemSets(playerGuid))\n+        return std::ranges::count_if(NPCBots::index_array<uint8, MAX_BOT_EQUIPMENT_SETS>, [=](uint8 i) { return !!item_sets->at(i); });\n+    return 0;\n+}\n+\n+BotItemSetsArray const* BotDataMgr::GetBotItemSets(ObjectGuid playerGuid)\n+{\n+    decltype(_botStoredGearSetMap)::const_iterator sci = _botStoredGearSetMap.find(playerGuid);\n+    return sci != _botStoredGearSetMap.cend() ? &sci->second : nullptr;\n+}\n+\n+NpcBotItemSet const* BotDataMgr::GetBotItemSet(ObjectGuid playerGuid, uint8 set_id)\n+{\n+    if (BotItemSetsArray const* item_sets = GetBotItemSets(playerGuid))\n+        return &item_sets->at(set_id);\n+    return nullptr;\n+}\n+\n+NpcBotItemSet& BotDataMgr::CreateNewBotItemSet(ObjectGuid playerGuid)\n+{\n+    auto [itr, _] = _botStoredGearSetMap.try_emplace(playerGuid);\n+    auto& item_sets = itr->second;\n+\n+    for (auto i : NPCBots::index_array<uint8, MAX_BOT_EQUIPMENT_SETS>)\n+    {\n+        if (!item_sets[i])\n+            return item_sets[i];\n+    }\n+\n+    //should not happen\n+    BOT_LOG_ERROR(\"npcbots\", \"CreateNewBotItemSet: item set limit was exhausted by player {}. Using last offset!\", playerGuid.ToString());\n+    const uint8 max_offset = MAX_BOT_EQUIPMENT_SETS - 1;\n+    item_sets[max_offset].clear();\n+    return item_sets[max_offset];\n+}\n+\n+void BotDataMgr::UpdateBotItemSet(ObjectGuid playerGuid, uint8 set_id, std::string&& set_name)\n+{\n+    _botStoredGearSetMap[playerGuid][set_id].name = std::move(set_name);\n+}\n+\n+void BotDataMgr::UpdateBotItemSet(ObjectGuid playerGuid, uint8 set_id, uint8 slot, uint32 item_id)\n+{\n+    _botStoredGearSetMap[playerGuid][set_id].items[slot] = item_id;\n+}\n+\n+void BotDataMgr::DeleteBotItemSet(ObjectGuid playerGuid, uint8 set_id)\n+{\n+    _botStoredGearSetMap.at(playerGuid).at(set_id).clear();\n+}\n+\n+void BotDataMgr::SaveNpcBotItemSets(ObjectGuid playerGuid, CharacterDatabaseTransaction trans)\n+{\n+    decltype(_botStoredGearSetMap)::const_iterator sci = _botStoredGearSetMap.find(playerGuid);\n+    if (sci == _botStoredGearSetMap.cend())\n+        return;\n+\n+    trans->Append(\"DELETE FROM characters_npcbot_gear_set WHERE owner = {}\", sci->first.GetCounter());\n+    trans->Append(\"DELETE FROM characters_npcbot_gear_set_item WHERE owner = {}\", sci->first.GetCounter());\n+    for (auto i : NPCBots::index_array<uint32, MAX_BOT_EQUIPMENT_SETS>)\n+    {\n+        NpcBotItemSet const& item_set = sci->second[i];\n+        if (!!item_set)\n+        {\n+            trans->Append(\"INSERT INTO characters_npcbot_gear_set (owner, set_id, set_name) VALUES ({}, {}, '{}')\", sci->first.GetCounter(), i, item_set.name);\n+            for (auto j : NPCBots::index_array<uint32, BOT_INVENTORY_SIZE>)\n+            {\n+                if (item_set.items[j])\n+                {\n+                    trans->Append(\"INSERT INTO characters_npcbot_gear_set_item (owner, set_id, slot, item_id) VALUES ({}, {}, {}, {})\",\n+                        sci->first.GetCounter(), i, j, item_set.items[j]);\n+                }\n+            }\n+        }\n+    }\n+}\n+\n+NpcBotMgrData* BotDataMgr::SelectOrCreateNpcBotMgrData(ObjectGuid playerGuid)\n+{\n+    std::unique_lock lock(*GetLock());\n+    decltype(_botMgrsData)::iterator bmdi = _botMgrsData.find(playerGuid);\n+    if (bmdi == _botMgrsData.cend())\n+    {\n+        CharacterDatabase.Execute(\"INSERT INTO characters_npcbot_settings (owner) VALUES ({})\", playerGuid.GetCounter());\n+        auto placed = _botMgrsData.emplace(std::piecewise_construct, std::forward_as_tuple(playerGuid), std::forward_as_tuple(BotCfg::GetFollowDistDefault(), 0, BOT_ATTACK_RANGE_SHORT, BOT_ATTACK_ANGLE_NORMAL, 0, 0, 0));\n+        return &placed.first->second;\n+    }\n+\n+    return &bmdi->second;\n+}\n+\n+void BotDataMgr::EraseNpcBotMgrData(ObjectGuid playerGuid)\n+{\n+    std::unique_lock lock(*GetLock());\n+    decltype(_botMgrsData)::iterator bmci = _botMgrsData.find(playerGuid);\n+    if (bmci == _botMgrsData.cend())\n+        return;\n+\n+    RemoveNpcBotMgrDataFromDB(playerGuid);\n+    _botMgrsData.erase(bmci);\n+}\n+\n+void BotDataMgr::RemoveNpcBotMgrDataFromDB(ObjectGuid playerGuid)\n+{\n+    CharacterDatabase.Execute(\"DELETE FROM characters_npcbot_settings WHERE owner = {}\", playerGuid.GetCounter());\n+}\n+\n+void BotDataMgr::SaveNpcBotMgrData(ObjectGuid playerGuid, CharacterDatabaseTransaction trans)\n+{\n+    std::shared_lock lock(*GetLock());\n+    decltype(_botMgrsData)::iterator bmdi = _botMgrsData.find(playerGuid);\n+    if (bmdi == _botMgrsData.cend())\n+        return;\n+\n+    NpcBotMgrData const& md = bmdi->second;\n+    trans->Append(\"DELETE FROM characters_npcbot_settings WHERE owner = {}\", bmdi->first.GetCounter());\n+    trans->Append(\"INSERT INTO characters_npcbot_settings (owner,dist_follow,dist_attack,attack_range_mode,attack_angle_mode,engage_delay_dps,engage_delay_heal,flags) VALUES ({},{},{},{},{},{},{},{})\",\n+        bmdi->first.GetCounter(), md.dist_follow, md.dist_attack, md.attack_range_mode, md.attack_angle_mode, md.engage_delay_dps, md.engage_delay_heal,\n+        (md.flags & NPCBOT_MGR_FLAG_MASK_ALL_DB_ALLOWED));\n+}\n+\n+class AC_GAME_API WanderingBotXpGainFormulaScript : public FormulaScript\n+{\n+    static constexpr float WANDERING_BOT_XP_GAIN_MULT = 10.0f;\n+\n+public:\n+    WanderingBotXpGainFormulaScript() : FormulaScript(\"WanderingBotXpGainFormulaScript\") {}\n+\n+    void OnGainCalculation(uint32& gain, Player* /*player*/, Unit* unit) override\n+    {\n+        if (gain && unit->IsNPCBot() && unit->ToCreature()->IsWandererBot())\n+            gain *= WANDERING_BOT_XP_GAIN_MULT;\n+    }\n+};\n+\n+class AC_GAME_API BotDataMgrShutdownScript : public WorldScript\n+{\n+public:\n+    BotDataMgrShutdownScript() : WorldScript(\"BotDataMgrShutdownScript\") {}\n+\n+    void OnShutdown() override\n+    {\n+        botSpawnEvents.KillAllEvents(true);\n+        for (auto& [_, events] : botBGJoinEvents)\n+            events.KillAllEvents(true);\n+    }\n+};\n+\n+void AddSC_botdatamgr_scripts()\n+{\n+    new WanderingBotXpGainFormulaScript();\n+    new BotDataMgrShutdownScript();\n+}\n+\n+#ifdef _MSC_VER\n+# pragma warning(pop)\n+#endif\ndiff --git a/src/server/game/AI/NpcBots/botdatamgr.h b/src/server/game/AI/NpcBots/botdatamgr.h\nnew file mode 100644\nindex 0000000000..3b4cad5c18\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/botdatamgr.h\n@@ -0,0 +1,273 @@\n+#ifndef BOTDATAMGR_H\n+#define BOTDATAMGR_H\n+\n+#include \"botcommon.h\"\n+#include \"DatabaseEnvFwd.h\"\n+#include \"DBCEnums.h\"\n+ \n+#include <algorithm>\n+#include <functional>\n+#include <map>\n+#include <ranges>\n+#include <set>\n+#include <shared_mutex>\n+\n+class BattlegroundQueue;\n+class Creature;\n+class Group;\n+class Item;\n+class Player;\n+class WanderNode;\n+class WorldLocation;\n+\n+struct EquipmentInfo;\n+struct CreatureTemplate;\n+struct FactionEntry;\n+struct GroupQueueInfo;\n+struct ItemTemplate;\n+struct Position;\n+struct PvPDifficultyEntry;\n+\n+enum LocaleConstant : uint8;\n+\n+inline constexpr float MIN_WANDER_NODE_DISTANCE = 50.0f; // VISIBILITY_DISTANCE_NORMAL * 0.5f;\n+inline constexpr float MAX_WANDER_NODE_DISTANCE = 800.0f; //SIZE_OF_GRIDS * 1.5f;\n+\n+struct NpcBotMgrData\n+{\n+public:\n+    uint8 dist_follow;\n+    uint8 dist_attack;\n+    uint8 attack_range_mode;\n+    uint8 attack_angle_mode;\n+    uint32 engage_delay_dps;\n+    uint32 engage_delay_heal;\n+    uint32 flags;\n+\n+    void SetFlag(uint32 flags_) { flags |= flags_; }\n+    void RemoveFlag(uint32 flags_) { flags &= ~flags_; }\n+    bool HasFlag(uint32 flags_) const { return !!(flags & flags_); }\n+\n+    NpcBotMgrData(uint8 idist_follow, uint8 idist_attack, uint8 iattack_range_mode, uint8 iattack_angle_mode, uint32 iengage_delay_dps, uint32 iengage_delay_heal, uint32 iflags) :\n+        dist_follow(idist_follow), dist_attack(idist_attack), attack_range_mode(iattack_range_mode), attack_angle_mode(iattack_angle_mode),\n+        engage_delay_dps(iengage_delay_dps), engage_delay_heal(iengage_delay_heal), flags(iflags) { }\n+    NpcBotMgrData(NpcBotMgrData const&) = delete;\n+    NpcBotMgrData(NpcBotMgrData&&) = delete;\n+    NpcBotMgrData& operator=(NpcBotMgrData const&) = delete;\n+    NpcBotMgrData& operator=(NpcBotMgrData&&) = delete;\n+};\n+\n+enum NpcBotDataUpdateType\n+{\n+    NPCBOT_UPDATE_OWNER                 = 1,\n+    NPCBOT_UPDATE_ROLES,\n+    NPCBOT_UPDATE_SPEC,\n+    NPCBOT_UPDATE_SHARED_OWNERS,\n+    NPCBOT_UPDATE_DISABLED_SPELLS,\n+    NPCBOT_UPDATE_MISCVALUES,\n+    NPCBOT_UPDATE_FACTION,\n+    NPCBOT_UPDATE_EQUIPS,\n+    NPCBOT_UPDATE_ERASE,\n+    NPCBOT_UPDATE_TRANSMOG_ERASE,\n+    NPCBOT_UPDATE_END\n+};\n+\n+struct NpcBotData\n+{\n+    using DisabledSpellsContainer = std::set<uint32>;\n+    using MiscValuesContainer = std::map<uint32, uint32>;\n+    using SharedOwnersContainer = std::set<uint32>;\n+\n+    uint32 owner;\n+    uint64 hire_time;\n+    uint32 roles;\n+    uint32 faction;\n+    uint8 spec;\n+    std::array<uint32, BOT_INVENTORY_SIZE> equips = {};\n+    DisabledSpellsContainer disabled_spells;\n+    MiscValuesContainer miscvalues;\n+    SharedOwnersContainer shared_owners;\n+\n+    NpcBotData(uint32 bowner, uint64 bhire_time, uint32 broles, uint32 bfaction, uint8 bspec)\n+        : owner(bowner), hire_time(bhire_time), roles(broles), faction(bfaction), spec(bspec) {}\n+    NpcBotData(uint32 broles, uint32 bfaction, uint8 bspec) : NpcBotData(0, 0, broles, bfaction, bspec) {}\n+    NpcBotData(NpcBotData const&) = delete;\n+    NpcBotData(NpcBotData&&) = delete;\n+    NpcBotData& operator=(NpcBotData const&) = delete;\n+    NpcBotData& operator=(NpcBotData&&) = delete;\n+};\n+\n+struct NpcBotAppearanceData\n+{\n+    uint8 gender;\n+    uint8 skin;\n+    uint8 face;\n+    uint8 hair;\n+    uint8 haircolor;\n+    uint8 features;\n+\n+    NpcBotAppearanceData(uint32 bgender, uint64 bskin, uint32 bface, uint32 bhair, uint8 bhaircolor, uint8 bfeatures)\n+        : gender(bgender), skin(bskin), face(bface), hair(bhair), haircolor(bhaircolor), features(bfeatures) {}\n+    NpcBotAppearanceData(NpcBotAppearanceData const&) = delete;\n+    NpcBotAppearanceData(NpcBotAppearanceData&&) = delete;\n+    NpcBotAppearanceData& operator=(NpcBotAppearanceData const&) = delete;\n+    NpcBotAppearanceData& operator=(NpcBotAppearanceData&&) = delete;\n+};\n+\n+struct NpcBotExtras\n+{\n+    uint8 race;\n+    uint8 bclass;\n+};\n+\n+struct NpcBotTransmogData\n+{\n+    std::array<std::pair<uint32 /*item_id*/, int32 /*fake_id*/>, BOT_TRANSMOG_INVENTORY_SIZE> transmogs;\n+};\n+\n+struct NpcBotStats\n+{\n+    uint32 entry;\n+    uint32 maxhealth;\n+    uint32 maxpower;\n+    uint32 strength;\n+    uint32 agility;\n+    uint32 stamina;\n+    uint32 intellect;\n+    uint32 spirit;\n+    uint32 armor;\n+    uint32 defense;\n+    uint32 resHoly;\n+    uint32 resFire;\n+    uint32 resNature;\n+    uint32 resFrost;\n+    uint32 resShadow;\n+    uint32 resArcane;\n+    float blockPct;\n+    float dodgePct;\n+    float parryPct;\n+    float critPct;\n+    uint32 attackPower;\n+    uint32 spellPower;\n+    uint32 spellPen;\n+    float hastePct;\n+    float hitBonusPct;\n+    uint32 expertise;\n+    float armorPenPct;\n+};\n+\n+struct NpcBotItemSet\n+{\n+public:\n+    NpcBotItemSet() : items{} {}\n+\n+    constexpr operator bool() const { return !is_empty(); }\n+    constexpr bool is_empty() const { return items_count() == 0; }\n+\n+    constexpr uint8 items_count() const {\n+        return BOT_INVENTORY_SIZE - static_cast<uint8>(std::ranges::count(items, 0u));\n+    }\n+    void clear() { items = {}; name.clear(); }\n+\n+    std::string name;\n+    std::array<uint32, BOT_INVENTORY_SIZE> items;\n+};\n+\n+using NpcBotRegistry = std::set<Creature const*>;\n+\n+struct BotBankItemCompare{ bool operator()(Item const* item1, Item const* item2) const; };\n+using BotBankItemContainer = std::multiset<Item*, BotBankItemCompare>;\n+\n+inline constexpr uint8 ITEM_SORTING_LEVEL_STEP = 5;\n+inline constexpr uint8 LEVEL_STEPS = DEFAULT_MAX_LEVEL / ITEM_SORTING_LEVEL_STEP + 1;\n+using ItemIdVector = std::vector<uint32>;\n+using BotItemSetsArray = std::array<NpcBotItemSet, MAX_BOT_EQUIPMENT_SETS>;\n+using ItemLeveledArr = std::array<ItemIdVector, LEVEL_STEPS>;\n+using ItemPerSlot = std::array<ItemLeveledArr, BOT_INVENTORY_SIZE>;\n+using ItemPerBotClassMap = std::array<ItemPerSlot, BOT_CLASS_END>;\n+\n+class BotDataMgr\n+{\n+public:\n+    static void Update(uint32 diff);\n+\n+    static void LoadNpcBots(bool spawn = true);\n+    static void LoadNpcBotGroupData();\n+    static void LoadNpcBotGearStorage();\n+    static void LoadNpcBotGearSets();\n+\n+    static void LoadNpcBotMgrData();\n+\n+    static void DeleteOldLogs();\n+\n+    static void AddNpcBotData(uint32 entry, uint32 roles, uint8 spec, uint32 faction);\n+    static NpcBotData const* SelectNpcBotData(uint32 entry);\n+    static void UpdateNpcBotData(uint32 entry, NpcBotDataUpdateType updateType, void* data = nullptr);\n+    static void UpdateNpcBotDataAll(uint32 playerGuid, NpcBotDataUpdateType updateType, void* data = nullptr);\n+    static void SaveNpcBotStats(NpcBotStats const& stats);\n+\n+    static NpcBotAppearanceData const* SelectNpcBotAppearance(uint32 entry);\n+    static NpcBotExtras const* SelectNpcBotExtras(uint32 entry);\n+\n+    static NpcBotTransmogData const* SelectNpcBotTransmogs(uint32 entry);\n+    static void UpdateNpcBotTransmogData(uint32 entry, uint8 slot, uint32 item_id, int32 fake_id, bool update_db = true);\n+    static void ResetNpcBotTransmogData(uint32 entry, bool update_db = true);\n+\n+    static bool AllBotsLoaded();\n+\n+    static void RegisterBot(Creature const* bot);\n+    static void UnregisterBot(Creature const* bot);\n+    static Creature const* FindBot(uint32 entry);\n+    static Creature const* FindBot(std::string_view name, LocaleConstant loc, std::vector<uint32> const* not_ids = nullptr);\n+    static NpcBotRegistry const& GetExistingNPCBots();\n+    static void GetNPCBotGuidsByOwner(std::vector<ObjectGuid> &guids_vec, ObjectGuid owner_guid, bool count_shared = false);\n+    static ObjectGuid GetNPCBotGuid(uint32 entry);\n+    static std::vector<uint32> GetExistingNPCBotIds();\n+    static uint8 GetOwnedBotsCount(ObjectGuid owner_guid, uint32 class_mask = 0, bool count_shared = false);\n+    static uint8 GetAccountBotsCount(uint32 account_id);\n+\n+    static void DespawnWandererBot(uint32 entry);\n+    static void LoadWanderMap(bool reload = false, bool force_all_maps = false);\n+    static void GenerateWanderingBots();\n+    static bool GenerateBattlegroundBots(Player const* groupLeader, Group const* group, BattlegroundQueue* queue, PvPDifficultyEntry const* bracketEntry, GroupQueueInfo const* gqinfo);\n+    static void CreateWanderingBotsSortedGear();\n+    static ItemPerBotClassMap const& GetWanderingBotsSortedGearMap();\n+    static Item* GenerateWanderingBotItem(uint8 slot, uint8 botclass, uint8 level, std::function<bool(uint8, ItemTemplate const*)> const& check);\n+    static bool GenerateWanderingBotItemEnchants(Item* item, uint8 slot, uint8 spec);\n+    static CreatureTemplate const* GetBotExtraCreatureTemplate(uint32 entry);\n+    static EquipmentInfo const* GetBotEquipmentInfo(uint32 entry);\n+\n+    static uint8 GetLevelBonusForBotRank(uint32 rank);\n+    static uint8 GetMinLevelForMapId(uint32 mapId);\n+    static uint8 GetMaxLevelForMapId(uint32 mapId);\n+    static uint8 GetMinLevelForBotClass(uint8 m_class);\n+    static int32 GetBotBaseReputation(Creature const* bot, FactionEntry const* factionEntry);\n+    static uint32 GetDefaultFactionForBotRaceClass(uint8 bot_class, uint8 bot_race);\n+    static TeamId GetTeamIdForFaction(uint32 factionTemplateId);\n+    static uint32 GetTeamForFaction(uint32 factionTemplateId);\n+\n+    static bool CanDepositBotBankItemsCount(ObjectGuid playerGuid, uint32 items_count);\n+    static BotBankItemContainer const* GetBotBankItems(ObjectGuid playerGuid);\n+    static uint32 GetBotBankItemsCount(ObjectGuid playerGuid);\n+    static Item* WithdrawBotBankItem(ObjectGuid playerGuid, ObjectGuid::LowType itemGuidLow);\n+    static void DepositBotBankItem(ObjectGuid playerGuid, Item* item);\n+    static void SaveNpcBotStoredGear(ObjectGuid playerGuid, CharacterDatabaseTransaction trans);\n+\n+    static uint32 GetBotItemSetsCount(ObjectGuid playerGuid);\n+    static BotItemSetsArray const* GetBotItemSets(ObjectGuid playerGuid);\n+    static NpcBotItemSet const* GetBotItemSet(ObjectGuid playerGuid, uint8 set_id);\n+    static NpcBotItemSet& CreateNewBotItemSet(ObjectGuid playerGuid);\n+    static void UpdateBotItemSet(ObjectGuid playerGuid, uint8 set_id, std::string&& set_name);\n+    static void UpdateBotItemSet(ObjectGuid playerGuid, uint8 set_id, uint8 slot, uint32 item_id);\n+    static void DeleteBotItemSet(ObjectGuid playerGuid, uint8 set_id);\n+    static void SaveNpcBotItemSets(ObjectGuid playerGuid, CharacterDatabaseTransaction trans);\n+\n+    static NpcBotMgrData* SelectOrCreateNpcBotMgrData(ObjectGuid playerGuid);\n+    static void EraseNpcBotMgrData(ObjectGuid playerGuid);\n+    static void RemoveNpcBotMgrDataFromDB(ObjectGuid playerGuid);\n+    static void SaveNpcBotMgrData(ObjectGuid playerGuid, CharacterDatabaseTransaction trans);\n+\n+    static std::shared_mutex* GetLock();\n+};\n+\n+#endif\ndiff --git a/src/server/game/AI/NpcBots/botdefine.h b/src/server/game/AI/NpcBots/botdefine.h\nnew file mode 100644\nindex 0000000000..b8d53fe324\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/botdefine.h\n@@ -0,0 +1,33 @@\n+#ifndef BOTDEFINE_H_\n+#define BOTDEFINE_H_\n+\n+#include \"Define.h\"\n+\n+#ifdef _MSC_VER\n+# define __PRAGMA_STR2__(x) #x\n+# define __PRAGMA_STR1__(x) __PRAGMA_STR2__(x)\n+# define __PRAGMA_LOC__ __FILE__ \"(\"__PRAGMA_STR1__(__LINE__)\") \"\n+# define PRAGMA_WARN(x) __pragma(message(__PRAGMA_LOC__ \": warning: \" #x))\n+#else\n+# define PRAGMA_WARN(x)\n+#endif\n+\n+#ifdef TRINITY_COMPILER\n+# define Bcore Trinity\n+# define BOT_LOG_TRACE TC_LOG_TRACE\n+# define BOT_LOG_DEBUG TC_LOG_DEBUG\n+# define BOT_LOG_INFO TC_LOG_INFO\n+# define BOT_LOG_WARN TC_LOG_WARN\n+# define BOT_LOG_ERROR TC_LOG_ERROR\n+# define BOT_LOG_FATAL TC_LOG_FATAL\n+#else\n+# define Bcore Acore\n+# define BOT_LOG_TRACE LOG_TRACE\n+# define BOT_LOG_DEBUG LOG_DEBUG\n+# define BOT_LOG_INFO LOG_INFO\n+# define BOT_LOG_WARN LOG_WARN\n+# define BOT_LOG_ERROR LOG_ERROR\n+# define BOT_LOG_FATAL LOG_FATAL\n+#endif\n+\n+#endif\ndiff --git a/src/server/game/AI/NpcBots/botdpstracker.cpp b/src/server/game/AI/NpcBots/botdpstracker.cpp\nnew file mode 100644\nindex 0000000000..e5b7b02141\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/botdpstracker.cpp\n@@ -0,0 +1,99 @@\n+#include \"botdpstracker.h\"\n+#include \"Unit.h\"\n+\n+#include <numeric>\n+\n+/*\n+Name: bot_dps_tracker\n+%Complete: 100\n+Comment: dps taken tracker for NPCBot system by Trickerer (onlysuffering@gmail.com)\n+DPS trackers may collect data from different bot owners if in party but this overdoing has no significance whatsoever\n+*/\n+\n+void DPSTracker::Update(uint32 diff)\n+{\n+    if (_active)\n+    {\n+        _inactiveTimer += diff;\n+        _updateTimer += diff;\n+        _trackTimer += diff;\n+\n+        if (_inactiveTimer >= DPS_INACTIVE_TIMER)\n+        {\n+            _Reset();\n+        }\n+        else if (_updateTimer >= DPS_UPDATE_TIMER)\n+        {\n+            _updateTimer -= DPS_UPDATE_TIMER;\n+            _Release();\n+        }\n+    }\n+}\n+\n+void DPSTracker::_Reset()\n+{\n+    if (_active)\n+    {\n+        _active = false;\n+\n+        for (auto& [_, damage_array] : _damages)\n+            damage_array = {};\n+        for (auto& [_, dps] : _DPSes)\n+            dps = 0;\n+\n+        _updateTimer = 0;\n+        _inactiveTimer = 0;\n+        _trackTimer = 0;\n+    }\n+}\n+\n+void DPSTracker::_Release()\n+{\n+    for (auto& [guid, damage_array] : _damages)\n+    {\n+        uint32 total_damage = std::accumulate(damage_array.cbegin(), damage_array.cend(), 0u);\n+\n+        _DPSes.insert_or_assign(guid, uint32(total_damage / (0.001f * std::max<uint32>(1 * IN_MILLISECONDS, std::min<uint32>(_trackTimer, MAX_DPS_TRACK_TIME)))));\n+        //BOT_LOG_ERROR(\"entities.player\", \"DPSTracker::Release(): guidlow = %u, time = %u, tick damage %u, total %u, dps = %u\",\n+        //    itr->first, _trackTimer, dmgs[0], total_damage, _DPSes[itr->first]);\n+\n+        //shift\n+        std::copy_backward(damage_array.begin(), std::prev(damage_array.end()), damage_array.end());\n+        damage_array[0] = 0;\n+    }\n+}\n+\n+void DPSTracker::_AccumulateDamage(ObjectGuid guid, uint32 damage)\n+{\n+    decltype(_damages)::iterator itr = _damages.find(guid);\n+\n+    if (itr == _damages.end())\n+    {\n+        DamageTakenMap::value_type::second_type dmgs{ damage };\n+        _damages.emplace(guid, std::move(dmgs));\n+        return;\n+    }\n+\n+    itr->second[0] += damage;\n+}\n+//victim is bot owner, bot, party player or party bot; checked in Unit::DealDamage()\n+void DPSTracker::TrackDamage(Unit const* victim, uint32 damage)\n+{\n+    //BOT_LOG_ERROR(\"entities.player\", \"DPSTracker::OnDamage(): on %s, damage %u\", victim->GetName().c_str(), damage);\n+\n+    _SetActive();\n+    _AccumulateDamage(victim->GetGUID(), damage);\n+}\n+\n+void DPSTracker::_SetActive()\n+{\n+    _inactiveTimer = 0;\n+    _active = true;\n+}\n+\n+uint32 DPSTracker::GetDPSTaken(ObjectGuid guid) const\n+{\n+    decltype(_DPSes)::const_iterator itr = _DPSes.find(guid);\n+    //BOT_LOG_ERROR(\"entities.player\", \"DPSTracker::GetDPSTaken(): from %u, damage %u\", guid, itr != _DPSes.end() ? itr->second : 0);\n+    return itr != _DPSes.end() ? itr->second : 0;\n+}\ndiff --git a/src/server/game/AI/NpcBots/botdpstracker.h b/src/server/game/AI/NpcBots/botdpstracker.h\nnew file mode 100644\nindex 0000000000..41ffabe34b\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/botdpstracker.h\n@@ -0,0 +1,45 @@\n+#ifndef BOT_DPSTRACKER_H\n+#define BOT_DPSTRACKER_H\n+\n+#include \"ObjectGuid.h\"\n+\n+#include <unordered_map>\n+\n+class Unit;\n+\n+enum DPSTrackerConstants : uint32\n+{\n+    DPS_UPDATE_TIMER        =  500, //recalculate dps every x ms\n+    MAX_DPS_TRACK_TIME      = 5000, //track damage taken for last x ms\n+    DPS_INACTIVE_TIMER      = 5000  //reset if combat not active for botparty for x ms\n+};\n+\n+//maximum tracked damage taken periods of DPS_UPDATE_TIMER during MAX_DPS_TRACK_TIME\n+inline constexpr std::size_t MAX_DAMAGES = MAX_DPS_TRACK_TIME / DPS_UPDATE_TIMER;\n+\n+class DPSTracker\n+{\n+public:\n+    void Update(uint32 diff);\n+\n+    void TrackDamage(Unit const* victim, uint32 damage);\n+    uint32 GetDPSTaken(ObjectGuid guid) const;\n+\n+private:\n+    void _Reset();\n+    void _Release();\n+    void _AccumulateDamage(ObjectGuid guid, uint32 damage);\n+    void _SetActive();\n+\n+    using DamageTakenMap = std::unordered_map<ObjectGuid /*guid*/, std::array<uint32, MAX_DAMAGES> /*dmgarray*/>;\n+    using DPSTakenMap = std::unordered_map<ObjectGuid /*guid*/, uint32 /*dps*/>;\n+    DamageTakenMap _damages;\n+    DPSTakenMap _DPSes;\n+\n+    uint32 _updateTimer{};\n+    uint32 _inactiveTimer{};\n+    uint32 _trackTimer{};\n+    bool _active{};\n+};\n+\n+#endif\ndiff --git a/src/server/game/AI/NpcBots/botdump.cpp b/src/server/game/AI/NpcBots/botdump.cpp\nnew file mode 100644\nindex 0000000000..a30cb160eb\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/botdump.cpp\n@@ -0,0 +1,1009 @@\n+/*\n+ * NpcBots Data Migration System by Trickerer (onlysuffering@gmail.com)\n+ *\n+ * Last update: *09 Apr 2023*\n+ *\n+ * Saved data:\n+ * 1) `characters_npcbot` - spawned bots' BOT info\n+ * 2) `characters_npcbot_transmog` - bots' transmogs\n+ * 3) `item_instance` - bots' equipment\n+ * 4) `creature` - bot spawns\n+ *\n+ * Make sure you have bots installed, or you are in for an unpleasant surprise.\n+ */\n+\n+#include \"botdump.h\"\n+#include \"botdatamgr.h\"\n+#include \"botlogtraits.h\"\n+#include \"DatabaseEnv.h\"\n+#include \"Log.h\"\n+#include \"ObjectMgr.h\"\n+#include \"QueryResult.h\"\n+#include \"StringConvert.h\"\n+\n+#include <sstream>\n+\n+static std::map<uint32, uint32> ItemReguidMap;\n+\n+class BotStringTransaction\n+{\n+public:\n+    using stream_type = std::ostringstream;\n+\n+    template <typename S>\n+    BotStringTransaction& Append(S&& sql)\n+    {\n+        _buf <<  std::forward<S>(sql);\n+        return *this;\n+    }\n+\n+    std::string_view GetBuffer() const\n+    {\n+        return _buf.view();\n+    }\n+\n+private:\n+    stream_type _buf;\n+};\n+\n+enum ImportDataTableType : uint8\n+{\n+    TABLE_TYPE_CHARACTERS_NPCBOT    = 0,\n+    TABLE_TYPE_NPCBOT_TRANSMOG      = 1,\n+    TABLE_TYPE_ITEM_INSTANCE        = 2,\n+    TABLE_TYPE_CREATURE             = 3,\n+\n+    IMPORT_TABLES_COUNT             = 4,\n+    IMPORT_TABLE_INVALID            = 255\n+};\n+\n+struct TableImportData\n+{\n+    std::string_view name;\n+    std::string_view fieldsStr;\n+    uint32 paramsCount;\n+    size_t guidOffsetBegin;\n+    size_t guidOffsetEnd;\n+};\n+\n+static constexpr const TableImportData TableImportDatas[IMPORT_TABLES_COUNT] =\n+{\n+    { \"`characters_npcbot` \",\n+      \"(\"\n+      //0       1       2       3      4         5                 6           7           8           9\n+      \"`entry`,`owner`,`roles`,`spec`,`faction`,`spells_disabled`,`equipMhEx`,`equipOhEx`,`equipRhEx`,`equipHead`,\"\n+      //10               11           12           13          14          15           16           17\n+      \"`equipShoulders`,`equipChest`,`equipWaist`,`equipLegs`,`equipFeet`,`equipWrist`,`equipHands`,`equipBack`,\"\n+      //18          19             20             21              22              23\n+      \"`equipBody`,`equipFinger1`,`equipFinger2`,`equipTrinket1`,`equipTrinket2`,`equipNeck`\"\n+      \") VALUES \", 24, 6, 23 },\n+\n+    { \"`characters_npcbot_transmog` \",\n+      \"(\"\n+      //0       1      2         3\n+      \"`entry`,`slot`,`item_id`,`fake_id`\"\n+      \") VALUES \", 4, 0, 0 },\n+\n+    { \"`item_instance` \",\n+      \"(\"\n+      //0             1                 2       3          4         5       6\n+      \"`creatorGuid`,`giftCreatorGuid`,`count`,`duration`,`charges`,`flags`,`enchantments`,\"\n+      //7                  8            9            10     11     12          13\n+      \"`randomPropertyId`,`durability`,`playedTime`,`text`,`guid`,`itemEntry`,`owner_guid`\"\n+      \") VALUES \", 14, 11, 11 },\n+\n+    { \"`creature` \",\n+      \"(\"\n+      //0      1    2     3           4           5            6            7            8             9           10\n+      \"`guid`,`id1`,`map`,`spawnMask`,`phaseMask`,`position_x`,`position_y`,`position_z`,`orientation`,`curhealth`,`curmana`\"\n+      \") VALUES \", 11, 0, 0 }\n+};\n+\n+static ImportDataTableType GetImportDataTableType(std::string const& name)\n+{\n+    for (auto i : NPCBots::index_array<uint32, IMPORT_TABLES_COUNT>)\n+    {\n+        //BOT_LOG_ERROR(\"scripts\", \"import: GetImportDataTableType\");\n+        if (!TableImportDatas[i].name.compare(name))\n+            return ImportDataTableType(i);\n+    }\n+\n+    return IMPORT_TABLE_INVALID;\n+}\n+\n+static uint8 GetImportLineParamsCount(std::string const& line)\n+{\n+    static std::string const ParamSeparator = \"','\";\n+    uint8 count = 0;\n+    size_t pos = line.find(ParamSeparator);\n+    while (pos != std::string::npos)\n+    {\n+        //BOT_LOG_ERROR(\"scripts\", \"import: GetImportLineParamsCount\");\n+        ++count;\n+        pos = line.find(ParamSeparator, pos + 1);\n+    }\n+    return count + 1; //separators count is params count - 1\n+}\n+\n+static void FixNULLBotFields(std::string& line)\n+{\n+    static std::string const NullString = \"'NULL'\";\n+    size_t pos = line.find(NullString);\n+    while (pos != std::string::npos)\n+    {\n+        //BOT_LOG_ERROR(\"scripts\", \"import: FixNULLBotFields\");\n+        line.replace(pos, NullString.length(), \"NULL\");\n+        pos = line.find(NullString);\n+    }\n+}\n+\n+template<typename T>\n+void StringToVal(std::string const& /*line*/, T& /*v*/, size_t /*begin_pos*/, size_t /*end_pos*/)\n+{\n+    BOT_LOG_ERROR(\"scripts\", \"StringToVal misuse\");\n+}\n+/*\n+template<>\n+void StringToVal(std::string const& line, float& v, size_t begin_pos, size_t end_pos)\n+{\n+    v = atof(line.substr(begin_pos, end_pos).c_str());\n+    BOT_LOG_ERROR(\"scripts\", \"import: StringToVal returned %.2f\", v);\n+}\n+*/\n+template<>\n+void StringToVal(std::string const& line, uint32& v, size_t begin_pos, size_t end_pos)\n+{\n+    using v_type = std::remove_cvref_t<decltype(v)>;\n+\n+    std::string subst = line.substr(begin_pos, end_pos - begin_pos).c_str();\n+    Optional<v_type> ov = Bcore::Impl::StringConvertImpl::For<v_type>::FromString(subst);\n+    v = *ov;\n+    //BOT_LOG_ERROR(\"scripts\", \"import: StringToVal returned {} ({} to {}: {})\",\n+    //    v, uint32(begin_pos), uint32(end_pos), subst.c_str());\n+}\n+\n+template<typename T>\n+bool ExtractValueFromString(std::string const& line, T& v, size_t offset)\n+{\n+    uint32 sepNum = 0;\n+\n+    size_t begin_pos = 0, end_pos = 0;\n+\n+    size_t pos = line.find('\\'');\n+    while (pos != std::string::npos)\n+    {\n+        ++sepNum;\n+        if (begin_pos == 0 && !((sepNum-1) % 2) && ((sepNum-1) / 2) == offset)\n+        {\n+            begin_pos = pos + 1;\n+            //BOT_LOG_ERROR(\"scripts\", \"import: ExtractValueFromString begin_pos %u\", uint32(begin_pos));\n+        }\n+        else if (end_pos == 0 && ((sepNum-1) % 2) && ((sepNum-1) / 2) == offset)\n+        {\n+            end_pos = pos;\n+            //BOT_LOG_ERROR(\"scripts\", \"import: ExtractValueFromString end_pos %u\", uint32(end_pos));\n+        }\n+\n+        if (begin_pos && end_pos)\n+            break;\n+\n+        pos = line.find('\\'', pos + 1);\n+    }\n+\n+    if (begin_pos && end_pos)\n+    {\n+        StringToVal(line, v, begin_pos, end_pos);\n+        return true;\n+    }\n+\n+    return false;\n+}\n+\n+static bool ReGuidBotEquip(std::string& line, size_t ne_guid_offset)\n+{\n+    /*\n+    INSERT INTO `characters_npcbot` (`entry`,`owner`,`roles`,`spec`,`faction`,`spell\n+    s_disabled`,`equipMhEx`,`equipOhEx`,`equipRhEx`,`equipHead`,`equipShoulders`,`eq\n+    uipChest`,`equipWaist`,`equipLegs`,`equipFeet`,`equipWrist`,`equipHands`,`equipB\n+    ack`,`equipBody`,`equipFinger1`,`equipFinger2`,`equipTrinket1`,`equipTrinket2`,`\n+    equipNeck`) VALUES ('70027','2204','19','3','35','NULL','4305063','4305032','0','0\n+    ','4305069','4237321','4237326','4305049','4305067','4305055','0','4305054','430\n+    5029','4303835','0','0','0','0');\n+    */\n+    static const std::string ne_vals_sep = \"('\";\n+    static const std::string ne_sep = \"'\";\n+\n+    bool reguidDone = false;\n+    uint32 sepNum = 0;\n+    size_t begin_pos = 0, end_pos = 0;\n+\n+    size_t pos = line.find(ne_vals_sep);\n+    ASSERT(pos != std::string::npos);\n+    pos = line.find(ne_sep);\n+    ASSERT(pos != std::string::npos);\n+    while (pos != std::string::npos)\n+    {\n+        ++sepNum;\n+        //BOT_LOG_ERROR(\"scripts\", \"import: ReGuidBotEquip sepNum %u\", sepNum);\n+        if (begin_pos == 0 && !((sepNum-1) % 2) && ((sepNum-1) / 2) == ne_guid_offset)\n+        {\n+            begin_pos = pos + 1;\n+            //BOT_LOG_ERROR(\"scripts\", \"import: ReGuidBotEquip begin_pos %u\", uint32(begin_pos));\n+        }\n+        else if (end_pos == 0 && ((sepNum-1) % 2) && ((sepNum-1) / 2) == ne_guid_offset)\n+        {\n+            end_pos = pos;\n+            //BOT_LOG_ERROR(\"scripts\", \"import: ReGuidBotEquip end_pos %u\", uint32(end_pos));\n+        }\n+\n+        if (begin_pos && end_pos)\n+        {\n+            uint32 guidVal;\n+            StringToVal(line, guidVal, begin_pos, end_pos);\n+            if (!guidVal)\n+            {\n+                //ignore no equip\n+                if (line.substr(begin_pos, end_pos - begin_pos) == \"0\")\n+                    return true;\n+\n+                BOT_LOG_ERROR(\"scripts\", \"import: ReGuidBotEquip no guidVal from {} offset {}!\",\n+                    line.substr(begin_pos, end_pos - begin_pos).c_str(), uint32(ne_guid_offset));\n+                break;\n+            }\n+\n+            decltype(ItemReguidMap)::const_iterator iter = ItemReguidMap.find(guidVal);\n+            if (iter == ItemReguidMap.cend())\n+            {\n+                BOT_LOG_ERROR(\"scripts\", \"import: ReGuidBotEquip reguid value not found for {}!\", guidVal);\n+                break;\n+            }\n+\n+            uint32 neVal = iter->second;\n+            //BOT_LOG_ERROR(\"scripts\", \"import: ReGuidBotEquip replacing %u with %u\", guidVal, neVal);\n+            line.replace(begin_pos, end_pos - begin_pos, Bcore::Impl::StringConvertImpl::For<decltype(neVal)>::ToString(neVal));\n+            reguidDone = true;\n+            break;\n+        }\n+\n+        pos = line.find(ne_sep, pos + 1);\n+    }\n+\n+    return reguidDone;\n+}\n+static bool ReGuidBotEquips(std::string& line)\n+{\n+    constexpr size_t ne_guid_offset_s = TableImportDatas[TABLE_TYPE_CHARACTERS_NPCBOT].guidOffsetBegin;\n+    constexpr size_t ne_guid_offset_e = TableImportDatas[TABLE_TYPE_CHARACTERS_NPCBOT].guidOffsetEnd;\n+    //BOT_LOG_ERROR(\"scripts\", \"import: ReGuidBotEquips ne_guid_offset_s %u ne_guid_offset_e %u\", uint32(ne_guid_offset_s), uint32(ne_guid_offset_e));\n+\n+    for (size_t i = ne_guid_offset_s; i <= ne_guid_offset_e; ++i)\n+    {\n+        if (!ReGuidBotEquip(line, i))\n+            return false;\n+    }\n+\n+    return true;\n+}\n+\n+static bool ReGuidItemInstance(std::string& line, uint32& nextGuid)\n+{\n+    /*\n+    INSERT INTO `item_instance` (`creatorGuid`,`giftCreatorGuid`,`count`,`duration`,\n+    `charges`,`flags`,`enchantments`,`randomPropertyId`,`durability`,`playedTime`,`t\n+    ext`,`guid`,`itemEntry`,`owner_guid`) VALUES ('0','0','1','0','0 0 0 0 0 ','1','\n+    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ','0','9\n+    0','7200','','4296510','42490','0'),('0','0','1','0','0 0 0 0 0 ','0','0 0 0 0 0\n+     0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ','0','100','0','\n+    ','4303949','48468','0'), etc.\n+    */\n+    constexpr size_t ii_guid_offset = TableImportDatas[TABLE_TYPE_ITEM_INSTANCE].guidOffsetBegin;\n+    const std::string ii_vals_sep = \"('\";\n+    const std::string ii_sep = \"'\";\n+\n+    //BOT_LOG_ERROR(\"scripts\", \"import: ReGuidItemInstance ii_guid_offset %u\", uint32(ii_guid_offset));\n+\n+    size_t pos1 = line.find(ii_vals_sep);\n+    ASSERT(pos1 != std::string::npos);\n+    while (pos1 != std::string::npos)\n+    {\n+        //BOT_LOG_ERROR(\"scripts\", \"cur pos1 %i\", int32(pos1));\n+        bool reguidDone = false;\n+        uint32 sepNum = 0;\n+        size_t begin_pos = 0, end_pos = 0;\n+        size_t pos2 = line.find(ii_sep, pos1 + 1);\n+        ASSERT(pos2 != std::string::npos);\n+        while (pos2 != std::string::npos)\n+        {\n+            ++sepNum;\n+            //BOT_LOG_ERROR(\"scripts\", \"cur pos2 %i sep %u s %u e %u, cval %u\",\n+            //    int32(pos2), sepNum, uint32(begin_pos), uint32(end_pos), uint32((sepNum-1) / 2));\n+            if (begin_pos == 0 && !((sepNum-1) % 2) && ((sepNum-1) / 2) == ii_guid_offset)\n+            {\n+                begin_pos = pos2 + 1;\n+                //BOT_LOG_ERROR(\"scripts\", \"import: ReGuidItemInstance begin_pos %u\", uint32(begin_pos));\n+            }\n+            else if (end_pos == 0 && ((sepNum-1) % 2) && ((sepNum-1) / 2) == ii_guid_offset)\n+            {\n+                end_pos = pos2;\n+                //BOT_LOG_ERROR(\"scripts\", \"import: ReGuidItemInstance end_pos %u\", uint32(end_pos));\n+            }\n+\n+            if (begin_pos && end_pos)\n+            {\n+                uint32 guidVal;\n+                StringToVal(line, guidVal, begin_pos, end_pos);\n+                if (!guidVal)\n+                {\n+                    BOT_LOG_ERROR(\"scripts\", \"import: ReGuidItemInstance no guidVal from {}!\", line.substr(begin_pos, end_pos - begin_pos));\n+                    return false;\n+                }\n+                //this is not checked at dump save\n+                if (auto [iter, res] = ItemReguidMap.insert({ guidVal, nextGuid }); !res)\n+                    BOT_LOG_ERROR(\"scripts\", \"import: ReGuidItemInstance item guid {} was already reguided to {}. Saved dump contains duplicate item guids - you'll have to fix them manually, proceeding anyways...\",\n+                        guidVal, iter->second);\n+\n+                //BOT_LOG_ERROR(\"scripts\", \"import: ReGuidItemInstance replacing %u with %u\", guidVal, nextGuid);\n+                line.replace(begin_pos, end_pos - begin_pos, Bcore::Impl::StringConvertImpl::For<std::remove_cvref_t<decltype(nextGuid)>>::ToString(nextGuid));\n+\n+                ++nextGuid;\n+                reguidDone = true;\n+                break;\n+            }\n+\n+            pos2 = line.find(ii_sep, pos2 + 1);\n+        }\n+\n+        if (!reguidDone)\n+        {\n+            BOT_LOG_ERROR(\"scripts\", \"import: ReGuidItemInstance reguid failed for string! Was:\\n{}\", line.c_str());\n+            return false;\n+        }\n+\n+        pos1 = line.find(ii_vals_sep, pos1 + 1);\n+    }\n+\n+    return true;\n+}\n+\n+static bool ReGuidCreature(std::string& line)\n+{\n+    /*\n+    INSERT INTO `item_instance` (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`position\n+    _x`,`position_y`,`position_z`,`orientation`,`curhealth`,`curmana` VALUES ('12561\n+    3','30102','571','0','0','1','1','0','0','5735.7','-3037.58','296.551','0.558505\n+    ','120','0','0','1','0','0','0','0','0','','0');\n+    */\n+    constexpr size_t cr_guid_offset = TableImportDatas[TABLE_TYPE_CREATURE].guidOffsetBegin;\n+    static const std::string cr_vals_sep = \"('\";\n+    static const std::string cr_sep = \"'\";\n+\n+    bool reguidDone = false;\n+    uint32 sepNum = 0;\n+    size_t begin_pos = 0, end_pos = 0;\n+\n+    size_t pos = line.find(cr_vals_sep);\n+    ASSERT(pos != std::string::npos);\n+    pos = line.find(cr_sep);\n+    ASSERT(pos != std::string::npos);\n+    while (pos != std::string::npos)\n+    {\n+        ++sepNum;\n+        //BOT_LOG_ERROR(\"scripts\", \"import: ReGuidCreature sepNum %u\", sepNum);\n+        if (begin_pos == 0 && !((sepNum-1) % 2) && ((sepNum-1) / 2) == cr_guid_offset)\n+        {\n+            begin_pos = pos + 1;\n+            //BOT_LOG_ERROR(\"scripts\", \"import: ReGuidCreature begin_pos %u\", uint32(begin_pos));\n+        }\n+        else if (end_pos == 0 && ((sepNum-1) % 2) && ((sepNum-1) / 2) == cr_guid_offset)\n+        {\n+            end_pos = pos;\n+            //BOT_LOG_ERROR(\"scripts\", \"import: ReGuidCreature end_pos %u\", uint32(end_pos));\n+        }\n+\n+        if (begin_pos && end_pos)\n+        {\n+            uint32 guidVal;\n+            StringToVal(line, guidVal, begin_pos, end_pos);\n+            if (!guidVal)\n+            {\n+                BOT_LOG_ERROR(\"scripts\", \"import: ReGuidCreature no guidVal from {}!\",\n+                    line.substr(begin_pos, end_pos - begin_pos).c_str());\n+                return false;\n+            }\n+\n+            uint32 nextGuid = sObjectMgr->GenerateCreatureSpawnId();\n+            //BOT_LOG_ERROR(\"scripts\", \"import: ReGuidCreature replacing %u with %u\", guidVal, nextGuid);\n+            line.replace(begin_pos, end_pos - begin_pos, Bcore::Impl::StringConvertImpl::For<decltype(nextGuid)>::ToString(nextGuid));\n+\n+            reguidDone = true;\n+            break;\n+        }\n+\n+        pos = line.find(cr_sep, pos + 1);\n+    }\n+\n+    return reguidDone;\n+}\n+\n+BotDataDumpResult NPCBotsDump::Load(std::string const& file)\n+{\n+    std::ifstream input(file);\n+    if (!input.is_open())\n+        return BOT_DUMP_FAIL_FILE_NOT_EXIST;\n+\n+    return LoadDump(input);\n+}\n+\n+BotDataDumpResult NPCBotsDump::LoadDump(std::ifstream& input)\n+{\n+    std::unordered_set<uint32> ExistingNPCBots;\n+    std::unordered_set<uint32> ExistingNPCBotTransmogs;\n+\n+    //prepare data for existing entries checks\n+    //bot entry\n+    //first - from `characters_npcbot`\n+    QueryResult result = CharacterDatabase.Query(\"SELECT `entry` FROM `characters_npcbot`\");\n+    Field* fields;\n+    if (result)\n+    {\n+        fields = result->Fetch();\n+        do\n+        {\n+            ExistingNPCBots.insert((*fields).Get<uint32>());\n+        } while (result->NextRow());\n+    }\n+    //second - join with entries from `creature` table (who knows what you have spawned there before you needed to import bots eh?)\n+    result = WorldDatabase.Query(\"SELECT `id1` FROM `creature` WHERE `id1` IN (SELECT `entry` FROM `creature_template_npcbot_extras`) ORDER BY `id1`\");\n+    if (result)\n+    {\n+        fields = result->Fetch();\n+        do\n+        {\n+            ExistingNPCBots.insert((*fields).Get<uint32>());\n+        } while (result->NextRow());\n+    }\n+    //bot transmogs\n+    result = CharacterDatabase.Query(\"SELECT `entry` FROM `characters_npcbot_transmog`\");\n+    if (result)\n+    {\n+        fields = result->Fetch();\n+        do\n+        {\n+            ExistingNPCBotTransmogs.insert((*fields).Get<uint32>());\n+        } while (result->NextRow());\n+    }\n+    //item guid\n+    result = CharacterDatabase.Query(\"SELECT MAX(`guid`) FROM `item_instance`\");\n+    ASSERT(result);\n+    fields = result->Fetch();\n+    static uint32 NextItemGuid = (*fields).Get<uint32>() + 1;\n+    //BOT_LOG_ERROR(\"scripts\", \"import: NextItemGuid %u\", NextItemGuid);\n+\n+    CharacterDatabaseTransaction ctrans = CharacterDatabase.BeginTransaction();\n+    WorldDatabaseTransaction wtrans = WorldDatabase.BeginTransaction();\n+\n+    std::list<std::string> ctransStrings;\n+    std::list<std::string> wtransStrings;\n+\n+    ImportDataTableType curImportDataTableType = IMPORT_TABLE_INVALID;\n+    std::string curFieldsStr;\n+    std::string curExecLine;\n+    uint8 curParamCount = 0;\n+\n+    std::string line;\n+    uint32 lineNum = 0;\n+    while (std::getline(input, line))\n+    {\n+        ++lineNum;\n+\n+        size_t nw_pos = line.find_first_not_of(\" \\t\\n\\r\\7\");\n+        if (nw_pos == std::string::npos)\n+            continue;\n+\n+        static std::string const NoteLine = \"IMPORTANT NOTE:\";\n+        if (line.substr(nw_pos, NoteLine.size()) == NoteLine)\n+            continue;\n+\n+        if (curFieldsStr.empty())\n+        {\n+            std::string table_name = line.substr(line.find_first_of('`'));\n+            //BOT_LOG_ERROR(\"scripts\", \"import: found table %s\", table_name.c_str());\n+            curImportDataTableType = GetImportDataTableType(table_name);\n+            switch (curImportDataTableType)\n+            {\n+                case TABLE_TYPE_CHARACTERS_NPCBOT:\n+                case TABLE_TYPE_NPCBOT_TRANSMOG:\n+                case TABLE_TYPE_ITEM_INSTANCE:\n+                case TABLE_TYPE_CREATURE:\n+                    curFieldsStr = TableImportDatas[curImportDataTableType].fieldsStr;\n+                    break;\n+                default:\n+                    BOT_LOG_ERROR(\"scripts\", \"import: unknown table {} at line {}\", table_name.c_str(), lineNum);\n+                    return BOT_DUMP_FAIL_FILE_CORRUPTED;\n+            }\n+\n+            curExecLine += line;\n+            continue;\n+        }\n+        else if (curParamCount == 0)\n+        {\n+            if (line.compare(curFieldsStr))\n+                return BOT_DUMP_FAIL_FILE_CORRUPTED;\n+\n+            curParamCount = TableImportDatas[curImportDataTableType].paramsCount;\n+            //BOT_LOG_ERROR(\"scripts\", \"import: param count %u\", uint32(curParamCount));\n+\n+            curExecLine += line;\n+            continue;\n+        }\n+        else\n+        {\n+            if (GetImportLineParamsCount(line) != curParamCount)\n+            {\n+                BOT_LOG_ERROR(\"scripts\", \"import: invalid param count {} at line {}\", uint32(curParamCount), lineNum);\n+                return BOT_DUMP_FAIL_FILE_CORRUPTED;\n+            }\n+\n+            //check values conflicts, abort on existing values\n+            size_t checkOffset = 0;\n+            bool needCheckVal = false;\n+            switch (curImportDataTableType)\n+            {\n+                case TABLE_TYPE_CHARACTERS_NPCBOT:\n+                    //entry\n+                    //checkOffset = 0;\n+                    needCheckVal = true;\n+                    break;\n+                case TABLE_TYPE_NPCBOT_TRANSMOG:\n+                    //entry\n+                    //checkOffset = 0;\n+                    needCheckVal = true;\n+                    break;\n+                default:\n+                    break;\n+            }\n+            uint32 checkVal;\n+            if (needCheckVal && !ExtractValueFromString(line, checkVal, checkOffset))\n+            {\n+                BOT_LOG_ERROR(\"scripts\", \"import: unable to extract value from line {} at offset {} type {}\",\n+                    lineNum, uint32(checkOffset), uint32(curImportDataTableType));\n+                return BOT_DUMP_FAIL_FILE_CORRUPTED;\n+            }\n+            switch (curImportDataTableType)\n+            {\n+                case TABLE_TYPE_CHARACTERS_NPCBOT:\n+                    if (ExistingNPCBots.contains(checkVal))\n+                    {\n+                        BOT_LOG_ERROR(\"scripts\", \"import: NPCBot id {} already exists in `characters_npcbot` or `creature` table! Aborting\", checkVal);\n+                        return BOT_DUMP_FAIL_DATA_OCCUPIED;\n+                    }\n+                    break;\n+                case TABLE_TYPE_NPCBOT_TRANSMOG:\n+                    if (ExistingNPCBotTransmogs.contains(checkVal))\n+                    {\n+                        BOT_LOG_ERROR(\"scripts\", \"import: NPCBot id {} already exists in `characters_npcbot_transmog` table! Aborting\", checkVal);\n+                        return BOT_DUMP_FAIL_DATA_OCCUPIED;\n+                    }\n+                    break;\n+                default:\n+                    break;\n+            }\n+\n+            curExecLine += line;\n+\n+            //multi-line import\n+            if (line[line.size()-1] == ',')\n+                continue;\n+            else if (line[line.size()-1] != ';')\n+            {\n+                BOT_LOG_ERROR(\"scripts\", \"import: unexpected line ending at line {}\", lineNum);\n+                return BOT_DUMP_FAIL_FILE_CORRUPTED;\n+            }\n+        }\n+\n+        //reguid if needed\n+        switch (curImportDataTableType)\n+        {\n+            case TABLE_TYPE_ITEM_INSTANCE:\n+                if (!ReGuidItemInstance(curExecLine, NextItemGuid))\n+                {\n+                    BOT_LOG_ERROR(\"scripts\", \"import: unable to reguid item instance at line {}!\", lineNum);\n+                    return BOT_DUMP_FAIL_FILE_CORRUPTED;\n+                }\n+                if (!ReGuidBotEquips(ctransStrings.back()))\n+                {\n+                    BOT_LOG_ERROR(\"scripts\", \"import: unable to reguid bot equips at line {}:\\n{}!\", lineNum, ctransStrings.back().c_str());\n+                    return BOT_DUMP_FAIL_FILE_CORRUPTED;\n+                }\n+                break;\n+            case TABLE_TYPE_CREATURE:\n+                if (!ReGuidCreature(curExecLine))\n+                {\n+                    BOT_LOG_ERROR(\"scripts\", \"import: unable to reguid creature at line {}!\", lineNum);\n+                    return BOT_DUMP_FAIL_FILE_CORRUPTED;\n+                }\n+                break;\n+            default:\n+                break;\n+        }\n+\n+        switch (curImportDataTableType)\n+        {\n+            case TABLE_TYPE_CHARACTERS_NPCBOT:\n+            case TABLE_TYPE_NPCBOT_TRANSMOG:\n+            case TABLE_TYPE_ITEM_INSTANCE:\n+                //BOT_LOG_ERROR(\"scripts\", \"import: adding to chars DB\");\n+                ctransStrings.push_back(curExecLine);\n+                //ctrans->Append(curExecLine.c_str());\n+                break;\n+            case TABLE_TYPE_CREATURE:\n+                //BOT_LOG_ERROR(\"scripts\", \"import: adding to world DB\");\n+                wtransStrings.push_back(curExecLine);\n+                //wtrans->Append(curExecLine.c_str());\n+                break;\n+            default:\n+                ASSERT(false);\n+        }\n+\n+        curParamCount = 0;\n+        curExecLine.clear();\n+        curFieldsStr.clear();\n+        curImportDataTableType = IMPORT_TABLE_INVALID;\n+    }\n+\n+    //check incomplete last query\n+    if (!curExecLine.empty() || !curFieldsStr.empty() || curParamCount > 0 ||\n+        curImportDataTableType != IMPORT_TABLE_INVALID)\n+    {\n+        BOT_LOG_ERROR(\"scripts\", \"import: unexpected file ending, incomplete query {}, fields {}, type {}!\",\n+            curExecLine.c_str(), curFieldsStr.c_str(), uint32(curImportDataTableType));\n+\n+        return BOT_DUMP_FAIL_FILE_CORRUPTED;\n+    }\n+\n+    //Replace all 'NULL' values as they are saved in dump with plain NULL\n+    for (auto& cs : ctransStrings)\n+        FixNULLBotFields(cs);\n+    for (auto& ws : wtransStrings)\n+        FixNULLBotFields(ws);\n+\n+    //BOT_LOG_ERROR(\"scripts\", \"import: charDb execLines:\");\n+    for (auto const& cs : ctransStrings)\n+    {\n+        //BOT_LOG_ERROR(\"scripts\", \"%s\", (*ci).c_str());\n+        ctrans->Append(cs.c_str());\n+    }\n+    //BOT_LOG_ERROR(\"scripts\", \"import: worldDb execLines:\");\n+    for (auto const& ws : wtransStrings)\n+    {\n+        //BOT_LOG_ERROR(\"scripts\", \"%s\", (*wi).c_str());\n+        wtrans->Append(ws.c_str());\n+    }\n+\n+    CharacterDatabase.CommitTransaction(ctrans);\n+    WorldDatabase.CommitTransaction(wtrans);\n+\n+    return BOT_DUMP_SUCCESS;\n+}\n+\n+BotDataDumpResult NPCBotsDump::Write(std::string const& file)\n+{\n+    if (std::ifstream(file).is_open())\n+        return BOT_DUMP_FAIL_FILE_ALREADY_EXISTS;\n+\n+    BotDataDumpResult ret = BOT_DUMP_SUCCESS;\n+    std::string dumpstr = GetDump();\n+    if (dumpstr.empty())\n+        ret = BOT_DUMP_FAIL_INCOMPLETE;\n+    else\n+    {\n+        std::ofstream fout(file, std::ios_base::trunc);\n+        if (!fout.is_open())\n+            return BOT_DUMP_FAIL_CANT_WRITE_TO_FILE;\n+        fout << dumpstr;\n+    }\n+\n+    return ret;\n+}\n+\n+std::string NPCBotsDump::GetDump()\n+{\n+    //bots are disabled but we need that data\n+    if (!BotDataMgr::AllBotsLoaded())\n+        BotDataMgr::LoadNpcBots(false);\n+\n+    std::ostringstream dump;\n+\n+    dump << \"IMPORTANT NOTE: THIS DUMPFILE IS MADE FOR USE WITH THE 'NPCBOT DUMP' COMMAND ONLY - EITHER THROUGH INGAME CHAT OR ON CONSOLE!\\n\";\n+    dump << \"IMPORTANT NOTE: DO NOT apply it directly - it will irreversibly DAMAGE and CORRUPT your database! You have been warned!\\n\\n\";\n+\n+    BotStringTransaction trans;\n+\n+    std::set<uint32> valid_ids;\n+    bool integrityChecked = true;\n+    for (uint32 i : BotDataMgr::GetExistingNPCBotIds())\n+    {\n+        //skip generated bots\n+        if (i >= BOT_ENTRY_CREATE_BEGIN && BotDataMgr::GetBotExtraCreatureTemplate(i))\n+            continue;\n+\n+        BotDataVerificationResult res = VerifyWriteData(i);\n+        if (res == BOT_DATA_INCOMPLETE)\n+        {\n+            if (integrityChecked)\n+                integrityChecked = false;\n+        }\n+        else if (res == BOT_DATA_VALID)\n+            valid_ids.insert(i);\n+    }\n+\n+    if (!integrityChecked || valid_ids.empty())\n+        return {};\n+\n+    for (uint32 valid_id : valid_ids)\n+    {\n+        AppendBotNPCBotData(&trans, valid_id);\n+        AppendBotNPCBotTransmogData(&trans, valid_id);\n+        AppendBotEquipsData(&trans, valid_id);\n+        AppendBotCreatureData(&trans, valid_id);\n+    }\n+\n+    dump << trans.GetBuffer();\n+\n+    return dump.str();\n+}\n+\n+BotDataVerificationResult NPCBotsDump::VerifyWriteData(uint32 entry) const\n+{\n+    NpcBotData const* botData = BotDataMgr::SelectNpcBotData(entry);\n+\n+    //bot of this entry is not spawned\n+    if (!botData)\n+        return BOT_DATA_NOT_EXIST;\n+\n+    EquipmentInfo const* deinfo = BotDataMgr::GetBotEquipmentInfo(entry);\n+    if (!deinfo)\n+    {\n+        BOT_LOG_ERROR(\"scripts\", \"NPCBotsDump::AppendBotCreatureData creature {} is not found in `creature_equip_template` table!\", entry);\n+        return BOT_DATA_INCOMPLETE;\n+    }\n+\n+    QueryResult result = WorldDatabase.Query(\"SELECT `guid` FROM `creature` WHERE `id1` = {}\", entry);\n+\n+    //creature is not spawned, corrupted\n+    if (!result)\n+    {\n+        BOT_LOG_ERROR(\"scripts\", \"NPCBotsDump::AppendBotCreatureData creature {} is not found in `creature` table!\", entry);\n+        return BOT_DATA_INCOMPLETE;\n+    }\n+    if (result->GetRowCount() > 1)\n+    {\n+        BOT_LOG_ERROR(\"scripts\", \"NPCBotsDump::AppendBotCreatureData creature {} is spawned more that once!\", entry);\n+        return BOT_DATA_INCOMPLETE;\n+    }\n+\n+    return BOT_DATA_VALID;\n+}\n+\n+template<typename T>\n+inline static void AppendEscapedValue(std::ostringstream& ss, T&& val, bool end = false)\n+{\n+    ss << '\\'' << std::forward<T>(val) << '\\'';\n+    if (!end)\n+        ss << ',';\n+}\n+inline static void AppendNULL(std::ostringstream& ss, bool end = false)\n+{\n+    AppendEscapedValue(ss, \"NULL\", end);\n+    //ss << \"NULL\";\n+    //if (!end)\n+    //    ss << ',';\n+}\n+static std::string EscapedString(char const* cstr)\n+{\n+    std::string s = cstr;\n+    CharacterDatabase.EscapeString(s);\n+    return s;\n+}\n+\n+void NPCBotsDump::AppendBotNPCBotData(BotStringTransaction* trans, uint32 entry) const\n+{\n+    NpcBotData const* botData = BotDataMgr::SelectNpcBotData(entry);\n+    ASSERT(botData);\n+\n+    std::ostringstream ss;\n+    ss << \"INSERT INTO \" << TableImportDatas[TABLE_TYPE_CHARACTERS_NPCBOT].name << '\\n'\n+        << TableImportDatas[TABLE_TYPE_CHARACTERS_NPCBOT].fieldsStr << '\\n';\n+\n+    ss << '(';\n+\n+    AppendEscapedValue(ss, entry);\n+    AppendEscapedValue(ss, botData->owner);\n+    AppendEscapedValue(ss, botData->roles);\n+    AppendEscapedValue(ss, uint32(botData->spec));\n+    AppendEscapedValue(ss, botData->faction);\n+\n+    if (botData->disabled_spells.empty())\n+        AppendNULL(ss);\n+    else\n+    {\n+        std::ostringstream ssds;\n+        for (uint32 bot_spell : botData->disabled_spells)\n+            ssds << bot_spell << ' ';\n+        AppendEscapedValue(ss, ssds.view());\n+    }\n+\n+    for (auto i : NPCBots::index_array<uint8, BOT_INVENTORY_SIZE>)\n+        AppendEscapedValue(ss, botData->equips[i], i == static_cast<BotEquipSlot>(BOT_INVENTORY_SIZE-1));\n+\n+    ss << \");\\n\";\n+\n+    trans->Append(ss.str());\n+}\n+\n+void NPCBotsDump::AppendBotNPCBotTransmogData(BotStringTransaction* trans, uint32 entry) const\n+{\n+    NpcBotData const* botData = BotDataMgr::SelectNpcBotData(entry);\n+    ASSERT(botData);\n+\n+    QueryResult tresult = CharacterDatabase.Query(\"SELECT `entry`,`slot`,`item_id`,`fake_id` FROM `characters_npcbot_transmog` WHERE entry = {}\", entry);\n+\n+    if (!tresult)\n+        return;\n+\n+    std::ostringstream ss;\n+    ss << \"INSERT INTO \" << TableImportDatas[TABLE_TYPE_NPCBOT_TRANSMOG].name << '\\n'\n+        << TableImportDatas[TABLE_TYPE_NPCBOT_TRANSMOG].fieldsStr << '\\n';\n+\n+    constexpr uint32 transmog_fields_count = TableImportDatas[TABLE_TYPE_NPCBOT_TRANSMOG].paramsCount;\n+\n+    while (true)\n+    {\n+        Field* fields = tresult->Fetch();\n+\n+        ss << '(';\n+\n+        for (auto i : NPCBots::index_array<uint32, transmog_fields_count>)\n+        {\n+            bool end = i == transmog_fields_count - 1;\n+            switch (i)\n+            {\n+                case 1:  //slot\n+                    AppendEscapedValue(ss, uint32(fields[i].Get<uint8>()), end);\n+                    break;\n+                default:\n+                    AppendEscapedValue(ss,        fields[i].Get<uint32>(), end);\n+                    break;\n+            }\n+        }\n+\n+        if (tresult->NextRow())\n+            ss << \"),\\n\";\n+        else\n+        {\n+            ss << \");\\n\";\n+            break;\n+        }\n+    }\n+\n+    trans->Append(ss.str());\n+}\n+\n+void NPCBotsDump::AppendBotEquipsData(BotStringTransaction* trans, uint32 entry) const\n+{\n+    NpcBotData const* botData = BotDataMgr::SelectNpcBotData(entry);\n+    ASSERT(botData);\n+\n+    EquipmentInfo const* deinfo = BotDataMgr::GetBotEquipmentInfo(entry);\n+    ASSERT(deinfo);\n+\n+    CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_NPCBOT_EQUIP_BY_ITEM_INSTANCE);\n+    //        0            1                2      3         4        5      6             7                 8           9           10    11    12         13\n+    //\"SELECT creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomPropertyId, durability, playedTime, text, guid, itemEntry, owner_guid \"\n+    //  \"FROM item_instance WHERE guid IN (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\", CONNECTION_SYNCH\n+\n+    for (auto i : NPCBots::index_array<uint8, BOT_INVENTORY_SIZE>)\n+        stmt->SetData(i, botData->equips[i]);\n+\n+    PreparedQueryResult iiresult = CharacterDatabase.Query(stmt);\n+\n+    //all zeros? or maybe broken entry\n+    if (!iiresult)\n+        return;\n+\n+    std::ostringstream ss;\n+    ss << \"INSERT INTO \" << TableImportDatas[TABLE_TYPE_ITEM_INSTANCE].name << '\\n' << TableImportDatas[TABLE_TYPE_ITEM_INSTANCE].fieldsStr << '\\n';\n+\n+    constexpr uint32 item_instance_fields_count = TableImportDatas[TABLE_TYPE_ITEM_INSTANCE].paramsCount;\n+\n+    while (true)\n+    {\n+        Field* fields = iiresult->Fetch();\n+\n+        ss << '(';\n+\n+        for (auto i : NPCBots::index_array<uint8, item_instance_fields_count>)\n+        {\n+            bool end = i == item_instance_fields_count-1;\n+            switch (i)\n+            {\n+                case 4:  //charges\n+                case 6:  //enchantments\n+                case 10: //text\n+                {\n+                    std::string cstr = fields[i].Get<std::string>();\n+                    if (cstr.empty())\n+                        AppendNULL(ss, end);\n+                    else\n+                        AppendEscapedValue(ss, EscapedString(cstr.c_str()), end);\n+                    break;\n+                }\n+                case 7:  //randomPropertyId\n+                    AppendEscapedValue(ss,      int32(fields[i].Get<int16>()),   end);\n+                    break;\n+                case 8:  //durability\n+                    AppendEscapedValue(ss,     uint32(fields[i].Get<uint16>()),  end);\n+                    break;\n+                default:\n+                    AppendEscapedValue(ss,            fields[i].Get<uint32>(),   end);\n+                    break;\n+            }\n+        }\n+\n+        if (iiresult->NextRow())\n+            ss << \"),\\n\";\n+        else\n+        {\n+            ss << \");\\n\";\n+            break;\n+        }\n+    }\n+\n+    trans->Append(ss.str());\n+}\n+\n+void NPCBotsDump::AppendBotCreatureData(BotStringTransaction* trans, uint32 entry) const\n+{\n+    QueryResult cresult = WorldDatabase.Query(\"SELECT `guid`,`id1`,`map`,`spawnMask`,`phaseMask`,`position_x`,`position_y`,`position_z`,`orientation`,`curhealth`,`curmana` FROM `creature` WHERE id1 = {}\", entry);\n+\n+    ASSERT(cresult);\n+\n+    std::ostringstream ss;\n+    ss << \"INSERT INTO \" << TableImportDatas[TABLE_TYPE_CREATURE].name << '\\n'\n+        << TableImportDatas[TABLE_TYPE_CREATURE].fieldsStr << '\\n';\n+\n+    ss << '(';\n+\n+    constexpr uint32 creature_fields_count = TableImportDatas[TABLE_TYPE_CREATURE].paramsCount;\n+\n+    Field* fields = cresult->Fetch();\n+\n+    for (auto i : NPCBots::index_array<uint8, creature_fields_count>)\n+    {\n+        bool end = i == creature_fields_count-1;\n+        switch (i)\n+        {\n+            case 5:  //position_x\n+            case 6:  //position_y\n+            case 7:  //position_z\n+            case 8:  //orientation\n+                ss.setf(std::ios_base::fixed);\n+                ss.precision(6);\n+                AppendEscapedValue(ss,            fields[i].Get<float>(),    end);\n+                break;\n+            case 3:  //spawnMask\n+                AppendEscapedValue(ss,     uint32(fields[i].Get<uint8>()),   end);\n+                break;\n+            case 2:  //map\n+                AppendEscapedValue(ss,     uint32(fields[i].Get<uint16>()),  end);\n+                break;\n+            default:\n+                AppendEscapedValue(ss,            fields[i].Get<uint32>(),   end);\n+                break;\n+        }\n+    }\n+\n+    ss << \");\\n\";\n+\n+    trans->Append(ss.str());\n+}\ndiff --git a/src/server/game/AI/NpcBots/botdump.h b/src/server/game/AI/NpcBots/botdump.h\nnew file mode 100644\nindex 0000000000..e83c1be55b\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/botdump.h\n@@ -0,0 +1,49 @@\n+#ifndef BOTDUMP_H\n+#define BOTDUMP_H\n+\n+#include \"Define.h\"\n+\n+#include <fstream>\n+#include <string>\n+\n+enum BotDataDumpResult\n+{\n+    //all\n+    BOT_DUMP_SUCCESS                    = 0,\n+    //write\n+    BOT_DUMP_FAIL_FILE_ALREADY_EXISTS,\n+    BOT_DUMP_FAIL_CANT_WRITE_TO_FILE,\n+    BOT_DUMP_FAIL_INCOMPLETE,\n+    //load\n+    BOT_DUMP_FAIL_FILE_NOT_EXIST,\n+    BOT_DUMP_FAIL_FILE_CORRUPTED,\n+    BOT_DUMP_FAIL_DATA_OCCUPIED\n+};\n+\n+enum BotDataVerificationResult\n+{\n+    BOT_DATA_VALID                      = 0,\n+    BOT_DATA_NOT_EXIST,\n+    BOT_DATA_INCOMPLETE\n+};\n+\n+class BotStringTransaction;\n+\n+class NPCBotsDump\n+{\n+public:\n+    BotDataDumpResult Write(std::string const& file);\n+    BotDataDumpResult Load(std::string const& file);\n+\n+private:\n+    std::string GetDump();\n+    BotDataVerificationResult VerifyWriteData(uint32 entry) const;\n+    void AppendBotNPCBotData(BotStringTransaction* trans, uint32 entry) const;\n+    void AppendBotNPCBotTransmogData(BotStringTransaction* trans, uint32 entry) const;\n+    void AppendBotEquipsData(BotStringTransaction* trans, uint32 entry) const;\n+    void AppendBotCreatureData(BotStringTransaction* trans, uint32 entry) const;\n+\n+    BotDataDumpResult LoadDump(std::ifstream& input);\n+};\n+\n+#endif\ndiff --git a/src/server/game/AI/NpcBots/botgearscore.cpp b/src/server/game/AI/NpcBots/botgearscore.cpp\nnew file mode 100644\nindex 0000000000..ee7a9667ff\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/botgearscore.cpp\n@@ -0,0 +1,147 @@\n+#include \"bot_ai.h\"\n+#include \"botdatamgr.h\"\n+#include \"botgearscore.h\"\n+#include \"botlogtraits.h\"\n+#include \"Creature.h\"\n+#include \"Item.h\"\n+\n+#include <map>\n+\n+#ifdef _MSC_VER\n+# pragma warning(push, 4)\n+#endif\n+\n+static constexpr float GS_scale = 1.8618f;\n+\n+static const std::map<uint32, float> ItemSlotMods = {\n+    { INVTYPE_HEAD, 1.0f },\n+    { INVTYPE_NECK, 0.5625f },\n+    { INVTYPE_SHOULDERS, 0.75f },\n+    { INVTYPE_CHEST, 1.0f },\n+    { INVTYPE_WAIST, 0.75f },\n+    { INVTYPE_LEGS, 1.0f },\n+    { INVTYPE_FEET, 0.75f },\n+    { INVTYPE_WRISTS, 0.5625f },\n+    { INVTYPE_HANDS, 0.75f },\n+    { INVTYPE_FINGER, 0.5625f },\n+    { INVTYPE_TRINKET, 0.5625f },\n+    { INVTYPE_WEAPON, 1.0f },\n+    { INVTYPE_SHIELD, 1.0f },\n+    { INVTYPE_RANGED, 0.3164f },\n+    { INVTYPE_CLOAK, 0.5625f },\n+    { INVTYPE_2HWEAPON, 2.0f },\n+    { INVTYPE_ROBE, 1.0f },\n+    { INVTYPE_WEAPONMAINHAND, 1.0f },\n+    { INVTYPE_WEAPONOFFHAND, 1.0f },\n+    { INVTYPE_HOLDABLE, 1.0f },\n+    { INVTYPE_THROWN, 0.3164f },\n+    { INVTYPE_RANGEDRIGHT, 0.3164f },\n+    { INVTYPE_RELIC, 0.3164f }\n+};\n+\n+static constexpr std::pair<float, float> ItemLevelFactors[2][5] = {\n+    {\n+        { 0.0f,    1.0f },\n+        { 0.0f,    1.0f },\n+        { 73.0f,   1.0f },\n+        { 81.375f, 0.8125f },\n+        { 91.45f,  0.65f }\n+    },\n+    {\n+        { 0.0f,    1.0f },\n+        { 0.0f,    2.25f },\n+        { 8.0f,    2.0f },\n+        { 0.75f,   1.8f },\n+        { 26.0f,   1.2f }\n+    }\n+};\n+\n+float CalculateItemGearScoreRaw(ItemTemplate const* proto)\n+{\n+    decltype(ItemSlotMods)::const_iterator smcit = ItemSlotMods.find(proto->InventoryType);\n+    if (smcit == ItemSlotMods.cend())\n+        return 0.0f;\n+\n+    uint32 quality = proto->Quality;\n+    float itemlvl = proto->ItemLevel;\n+    float slotmod = smcit->second;\n+    float qscale = 1.0f;\n+\n+    if (quality == ITEM_QUALITY_LEGENDARY)\n+    {\n+        quality = ITEM_QUALITY_EPIC;\n+        qscale = 1.3f;\n+    }\n+    else if (quality <= ITEM_QUALITY_NORMAL)\n+    {\n+        quality = ITEM_QUALITY_UNCOMMON;\n+        qscale = 0.005f;\n+    }\n+    else if (quality == ITEM_QUALITY_HEIRLOOM)\n+    {\n+        quality = ITEM_QUALITY_RARE;\n+        itemlvl = 187.05f;\n+    }\n+\n+    if (!(quality >= ITEM_QUALITY_UNCOMMON && quality <= ITEM_QUALITY_EPIC))\n+        return 0.0f;\n+\n+    auto const& p = ItemLevelFactors[size_t(itemlvl <= 120.0f)][quality];\n+    return floor(((itemlvl - p.first) / p.second) * slotmod * qscale * GS_scale);\n+}\n+\n+float CalculateItemGearScore(ItemTemplate const* proto, uint32 botentry/* = 0*/, uint8 botlevel/* = 0*/, uint8 botclass/* = 0*/, uint8 botspec/* = 0*/, uint8 slot/* = 18*/)\n+{\n+    EquipmentInfo const* einfo = nullptr;\n+    if (botentry)\n+    {\n+        ASSERT(slot < BOT_INVENTORY_SIZE, \"Invalid bot equip slot %u!\", uint32(slot));\n+        einfo = BotDataMgr::GetBotEquipmentInfo(botentry);\n+        ASSERT(einfo, \"Trying to CalculateItemGearScore for bot %u with no equip info!\", botentry);\n+    }\n+\n+    float itemscore = 0.0f;\n+\n+    if (slot > BOT_SLOT_RANGED || !einfo || einfo->ItemEntry[slot] != proto->ItemId)\n+    {\n+        itemscore = CalculateItemGearScoreRaw(proto);\n+\n+        if (botspec == BOT_SPEC_WARRIOR_FURY && botlevel >= 60 && proto->InventoryType == INVTYPE_2HWEAPON)\n+            itemscore *= 0.5f;\n+        else if (botclass == BOT_CLASS_HUNTER)\n+        {\n+            if (proto->InventoryType == INVTYPE_WEAPON || proto->InventoryType == INVTYPE_WEAPONMAINHAND ||\n+                proto->InventoryType == INVTYPE_WEAPONOFFHAND || proto->InventoryType == INVTYPE_THROWN)\n+                itemscore *= 0.3164f;\n+            else if (proto->InventoryType == INVTYPE_RANGED || proto->InventoryType == INVTYPE_RANGEDRIGHT)\n+               itemscore *= 5.3224f;\n+        }\n+    }\n+\n+    return std::max<float>(itemscore, 0.0f);\n+}\n+\n+std::pair<float, float> CalculateBotGearScore(uint32 botentry, uint8 botlevel, uint8 botclass, uint8 botspec, Item const* const items[BOT_INVENTORY_SIZE])\n+{\n+    uint8 items_count = 0;\n+    float totalscore = 0.0f;\n+\n+    for (auto i : NPCBots::index_array<uint8, BOT_INVENTORY_SIZE>)\n+    {\n+        if (Item const* item = items[i])\n+        {\n+            float itemscore = CalculateItemGearScore(item->GetTemplate(), botentry, botlevel, botclass, botspec, i);\n+            if (itemscore > 0.0f)\n+            {\n+                ++items_count;\n+                totalscore += itemscore;\n+            }\n+        }\n+    }\n+\n+    return { totalscore, totalscore / std::max<uint8>(items_count, 1) };\n+}\n+\n+#ifdef _MSC_VER\n+# pragma warning(pop)\n+#endif\ndiff --git a/src/server/game/AI/NpcBots/botgearscore.h b/src/server/game/AI/NpcBots/botgearscore.h\nnew file mode 100644\nindex 0000000000..1bde8d312e\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/botgearscore.h\n@@ -0,0 +1,16 @@\n+#ifndef BOT_GEARSCORE_H_\n+#define BOT_GEARSCORE_H_\n+\n+#include \"botcommon.h\"\n+\n+#include <utility>\n+\n+class Item;\n+\n+struct ItemTemplate;\n+\n+float CalculateItemGearScoreRaw(ItemTemplate const* proto);\n+float CalculateItemGearScore(ItemTemplate const* proto, uint32 botentry = 0, uint8 botlevel = 0, uint8 botclass = 0, uint8 botspec = 0, uint8 slot = BOT_INVENTORY_SIZE);\n+std::pair<float, float> CalculateBotGearScore(uint32 botentry, uint8 botlevel, uint8 botclass, uint8 botspec, Item const* const items[BOT_INVENTORY_SIZE]);\n+\n+#endif\ndiff --git a/src/server/game/AI/NpcBots/botgiver.cpp b/src/server/game/AI/NpcBots/botgiver.cpp\nnew file mode 100644\nindex 0000000000..a568990668\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/botgiver.cpp\n@@ -0,0 +1,299 @@\n+#include \"bot_ai.h\"\n+#include \"botcommon.h\"\n+#include \"botconfig.h\"\n+#include \"botdatamgr.h\"\n+#include \"botgossip.h\"\n+#include \"botspell.h\"\n+#include \"bottext.h\"\n+#include \"botmgr.h\"\n+#include \"Chat.h\"\n+#include \"Creature.h\"\n+#include \"Log.h\"\n+#include \"Player.h\"\n+#include \"RaceMgr.h\"\n+#include \"ScriptedGossip.h\"\n+#include \"ScriptMgr.h\"\n+/*\n+NPCbot giver NPC by Trickerer (<https://github.com/trickerer/> <onlysuffering@gmail.com>)\n+Complete - 100%\n+*/\n+\n+#define HIRE GOSSIP_SENDER_BOTGIVER_HIRE\n+#define HIRE_CLASS GOSSIP_SENDER_BOTGIVER_HIRE_CLASS\n+#define HIRE_ENTRY GOSSIP_SENDER_BOTGIVER_HIRE_ENTRY\n+\n+class script_bot_giver : public CreatureScript\n+{\n+public:\n+    script_bot_giver() : CreatureScript(\"script_bot_giver\") { }\n+\n+    //struct bot_giver_AI : public CreatureAI\n+    //{\n+    //    bot_giver_AI(Creature* creature) : CreatureAI(creature) {}\n+\n+    //    void UpdateAI(uint32 /*diff*/) override {}\n+\n+        bool OnGossipHello(Player* player, Creature* me) override\n+        {\n+            if (!BotCfg::IsNpcBotModEnabled())\n+            {\n+                player->PlayerTalkClass->SendCloseGossip();\n+                return true;\n+            }\n+\n+            if (me->isMoving())\n+                me->BotStopMovement();\n+\n+            AddGossipItemFor(player, GOSSIP_ICON_TALK, bot_ai::LocalizedNpcText(player, BOT_TEXT_BOTGIVER_SERVICE), HIRE, GOSSIP_ACTION_INFO_DEF + 1);\n+\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, bot_ai::LocalizedNpcText(player, BOT_TEXT_NEVERMIND), 0, GOSSIP_ACTION_INFO_DEF + 2);\n+\n+            player->PlayerTalkClass->SendGossipMenu(GOSSIP_BOTGIVER_GREET, me->GetGUID());\n+            return true;\n+        }\n+\n+        //bool OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override\n+        bool OnGossipSelect(Player* player, Creature* me, uint32 sender, uint32 action) override\n+        {\n+            if (!BotCfg::IsNpcBotModEnabled())\n+            {\n+                player->PlayerTalkClass->SendCloseGossip();\n+                return true;\n+            }\n+\n+            //uint32 sender = player->PlayerTalkClass->GetGossipOptionSender(gossipListId);\n+            //uint32 action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);\n+\n+            player->PlayerTalkClass->ClearMenus();\n+            bool subMenu = false;\n+\n+            uint32 gossipTextId = GOSSIP_BOTGIVER_GREET;\n+\n+            switch (sender)\n+            {\n+                case 0: //exit\n+                    break;\n+                case 1: //BACK: return to main menu\n+                    return OnGossipHello(player, me);\n+                case HIRE:\n+                {\n+                    gossipTextId = GOSSIP_BOTGIVER_HIRE;\n+\n+                    if (player->GetNpcBotsCount() >= BotCfg::GetMaxNpcBots(player->GetLevel()))\n+                    {\n+                        WhisperTo(player, me, bot_ai::LocalizedNpcText(player, BOT_TEXT_BOTGIVER_TOO_MANY_BOTS).c_str());\n+                        break;\n+                    }\n+\n+                    if (uint32 maxBotsPerAccount = BotCfg::GetMaxAccountBots())\n+                    {\n+                        uint32 accountBotsCount = BotDataMgr::GetAccountBotsCount(player->GetSession()->GetAccountId());\n+                        if (accountBotsCount >= maxBotsPerAccount)\n+                        {\n+                            ChatHandler ch(player->GetSession());\n+                            ch.PSendSysMessage(bot_ai::LocalizedNpcText(player, BOT_TEXT_HIREFAIL_MAXBOTS_ACCOUNT).c_str(), accountBotsCount, maxBotsPerAccount);\n+                            break;\n+                        }\n+                    }\n+\n+                    subMenu = true;\n+\n+                    uint8 availCount = 0;\n+                    std::array<uint32, BOT_CLASS_END> npcbot_count_per_class{ 0 };\n+\n+                    {\n+                        std::shared_lock lock(*BotDataMgr::GetLock());\n+                        for (Creature const* bot : BotDataMgr::GetExistingNPCBots())\n+                        {\n+                            if (!bot->IsAlive() || bot->IsTempBot() || bot->IsWandererBot() || bot->GetBotAI()->GetBotOwnerGuid() || bot->HasAura(BERSERK))\n+                                continue;\n+                            if (BotCfg::FilterRaces() && bot->GetBotClass() < BOT_CLASS_EX_START && (bot->GetRaceMask() & sRaceMgr->GetPlayableRaceMask()) &&\n+                                !(bot->GetRaceMask() & ((player->GetRaceMask() & sRaceMgr->GetAllianceRaceMask()) ? sRaceMgr->GetAllianceRaceMask() : sRaceMgr->GetHordeRaceMask())))\n+                                continue;\n+\n+                            ++npcbot_count_per_class[bot->GetBotClass()];\n+                        }\n+                    }\n+\n+                    for (uint8 botclass = BOT_CLASS_WARRIOR; botclass < BOT_CLASS_END; ++botclass)\n+                    {\n+                        if (!BotCfg::IsClassEnabled(botclass))\n+                            continue;\n+\n+                        if (player->HaveBot() && BotCfg::GetMaxClassBots())\n+                        {\n+                            uint8 count = static_cast<uint8>(std::ranges::count_if(*player->GetBotMgr()->GetBotMap(), [=](BotMap::value_type const& kv) {\n+                                return kv.second->GetBotClass() == botclass;\n+                            }));\n+                            if (count >= BotCfg::GetMaxClassBots())\n+                                continue;\n+                        }\n+\n+                        uint32 textId;\n+                        switch (botclass)\n+                        {\n+                            case BOT_CLASS_WARRIOR:     textId = BOT_TEXT_CLASS_WARRIOR_PLU;        break;\n+                            case BOT_CLASS_PALADIN:     textId = BOT_TEXT_CLASS_PALADIN_PLU;        break;\n+                            case BOT_CLASS_MAGE:        textId = BOT_TEXT_CLASS_MAGE_PLU;           break;\n+                            case BOT_CLASS_PRIEST:      textId = BOT_TEXT_CLASS_PRIEST_PLU;         break;\n+                            case BOT_CLASS_WARLOCK:     textId = BOT_TEXT_CLASS_WARLOCK_PLU;        break;\n+                            case BOT_CLASS_DRUID:       textId = BOT_TEXT_CLASS_DRUID_PLU;          break;\n+                            case BOT_CLASS_DEATH_KNIGHT:textId = BOT_TEXT_CLASS_DEATH_KNIGHT_PLU;   break;\n+                            case BOT_CLASS_ROGUE:       textId = BOT_TEXT_CLASS_ROGUE_PLU;          break;\n+                            case BOT_CLASS_SHAMAN:      textId = BOT_TEXT_CLASS_SHAMAN_PLU;         break;\n+                            case BOT_CLASS_HUNTER:      textId = BOT_TEXT_CLASS_HUNTER_PLU;         break;\n+                            case BOT_CLASS_BM:          textId = BOT_TEXT_CLASS_BM_PLU;             break;\n+                            case BOT_CLASS_SPHYNX:      textId = BOT_TEXT_CLASS_SPHYNX_PLU;         break;\n+                            case BOT_CLASS_ARCHMAGE:    textId = BOT_TEXT_CLASS_ARCHMAGE_PLU;       break;\n+                            case BOT_CLASS_DREADLORD:   textId = BOT_TEXT_CLASS_DREADLORD_PLU;      break;\n+                            case BOT_CLASS_SPELLBREAKER:textId = BOT_TEXT_CLASS_SPELLBREAKER_PLU;   break;\n+                            case BOT_CLASS_DARK_RANGER: textId = BOT_TEXT_CLASS_DARK_RANGER_PLU;    break;\n+                            case BOT_CLASS_NECROMANCER: textId = BOT_TEXT_CLASS_NECROMANCER_PLU;    break;\n+                            case BOT_CLASS_SEA_WITCH:   textId = BOT_TEXT_CLASS_SEAWITCH_PLU;       break;\n+                            case BOT_CLASS_CRYPT_LORD:  textId = BOT_TEXT_CLASS_CRYPT_LORD_PLU;     break;\n+                            default:                    textId = 0;                                 break;\n+                        }\n+\n+                        if (!textId)\n+                            continue;\n+\n+                        std::ostringstream bclass;\n+                        bclass << npcbot_count_per_class[botclass] << \" \" << bot_ai::LocalizedNpcText(player, textId) << \" (\" << BotCfg::GetNpcBotCostStr(player->GetLevel(), botclass) << \")\";\n+\n+                        AddGossipItemFor(player, GOSSIP_ICON_TALK, bclass.str(), HIRE_CLASS, GOSSIP_ACTION_INFO_DEF + botclass);\n+\n+                        if (++availCount >= BOT_GOSSIP_MAX_ITEMS - 1) //back\n+                            break;\n+                    }\n+\n+                    if (availCount == 0)\n+                        gossipTextId = GOSSIP_BOTGIVER_HIRE_EMPTY;\n+\n+                    AddGossipItemFor(player, GOSSIP_ICON_CHAT, bot_ai::LocalizedNpcText(player, BOT_TEXT_NEVERMIND), 0, GOSSIP_ACTION_INFO_DEF + 1);\n+\n+                    break;\n+                }\n+                case HIRE_CLASS:\n+                {\n+                    gossipTextId = GOSSIP_BOTGIVER_HIRE_CLASS;\n+\n+                    uint8 botclass = action - GOSSIP_ACTION_INFO_DEF;\n+\n+                    uint32 cost = BotCfg::GetNpcBotCostHire(player->GetLevel(), botclass);\n+                    if (!player->HasEnoughMoney(cost))\n+                    {\n+                        WhisperTo(player, me, bot_ai::LocalizedNpcText(player, BOT_TEXT_HIREFAIL_COST).c_str());\n+                        break;\n+                    }\n+\n+                    subMenu = true;\n+\n+                    uint8 availCount = 0;\n+\n+                    //go through bots map to find what bots are available\n+                    {\n+                        std::shared_lock lock(*BotDataMgr::GetLock());\n+                        for (Creature const* bot : BotDataMgr::GetExistingNPCBots())\n+                        {\n+                            bot_ai const* ai = bot->GetBotAI();\n+                            if (bot->GetBotClass() != botclass || !bot->IsAlive() || ai->IsTempBot() || bot->IsWandererBot() || ai->GetBotOwnerGuid() || bot->HasAura(BERSERK))\n+                                continue;\n+                            if (BotCfg::FilterRaces() && botclass < BOT_CLASS_EX_START && (bot->GetRaceMask() & sRaceMgr->GetPlayableRaceMask()) &&\n+                                !(bot->GetRaceMask() & ((player->GetRaceMask() & sRaceMgr->GetAllianceRaceMask()) ? sRaceMgr->GetAllianceRaceMask() : sRaceMgr->GetHordeRaceMask())))\n+                                continue;\n+\n+                            std::ostringstream message1;\n+                            message1 << bot_ai::LocalizedNpcText(player, BOT_TEXT_BOTGIVER_WISH_TO_HIRE_) << bot->GetName() << '?';\n+\n+                            std::ostringstream info_ostr;\n+                            uint32 raceTextId;\n+                            switch (bot->GetRace())\n+                            {\n+                                case RACE_HUMAN:        raceTextId = BOT_TEXT_RACE_HUMAN;   break;\n+                                case RACE_ORC:          raceTextId = BOT_TEXT_RACE_ORC;     break;\n+                                case RACE_DWARF:        raceTextId = BOT_TEXT_RACE_DWARF;   break;\n+                                case RACE_NIGHTELF:     raceTextId = BOT_TEXT_RACE_NELF;    break;\n+                                case RACE_UNDEAD_PLAYER:raceTextId = BOT_TEXT_RACE_UNDEAD;  break;\n+                                case RACE_TAUREN:       raceTextId = BOT_TEXT_RACE_TAUREN;  break;\n+                                case RACE_GNOME:        raceTextId = BOT_TEXT_RACE_GNOME;   break;\n+                                case RACE_TROLL:        raceTextId = BOT_TEXT_RACE_TROLL;   break;\n+                                case RACE_BLOODELF:     raceTextId = BOT_TEXT_RACE_BELF;    break;\n+                                case RACE_DRAENEI:      raceTextId = BOT_TEXT_RACE_DRAENEI; break;\n+                                default:                raceTextId = BOT_TEXT_RACE_UNKNOWN; break;\n+                            }\n+                            info_ostr << bot->GetName() << \" (\" << (\n+                                bot->GetGender() == GENDER_MALE ? bot_ai::LocalizedNpcText(player, BOT_TEXT_GENDER_MALE) + ' ' :\n+                                bot->GetGender() == GENDER_FEMALE ? bot_ai::LocalizedNpcText(player, BOT_TEXT_GENDER_FEMALE) + ' ' :\n+                                \"\") << bot_ai::LocalizedNpcText(player, raceTextId) << ')';\n+\n+                            player->PlayerTalkClass->GetGossipMenu().AddMenuItem(-1, GOSSIP_ICON_TALK, info_ostr.str(),\n+                                HIRE_ENTRY, GOSSIP_ACTION_INFO_DEF + bot->GetEntry(), message1.str(), cost, false);\n+\n+                            if (++availCount >= BOT_GOSSIP_MAX_ITEMS - 1) //back\n+                                break;\n+                        }\n+                    }\n+\n+                    if (availCount == 0)\n+                        gossipTextId = GOSSIP_BOTGIVER_HIRE_EMPTY;\n+\n+                    AddGossipItemFor(player, GOSSIP_ICON_CHAT, bot_ai::LocalizedNpcText(player, BOT_TEXT_BACK), HIRE, GOSSIP_ACTION_INFO_DEF + 1);\n+\n+                    break;\n+                }\n+                case HIRE_ENTRY:\n+                {\n+                    uint32 entry = action - GOSSIP_ACTION_INFO_DEF;\n+                    Creature const* bot = BotDataMgr::FindBot(entry);\n+                    if (!bot)\n+                    {\n+                        //possible but still\n+                        BOT_LOG_ERROR(\"entities.unit\", \"HIRE_NBOT_ENTRY: bot {} not found!\", entry);\n+                        break;\n+                    }\n+\n+                    bot_ai const* ai = bot->GetBotAI();\n+                    if (bot->IsInCombat() || !bot->IsAlive() || bot_ai::CCed(bot) ||\n+                        bot->HasUnitState(UNIT_STATE_CASTING) || ai->GetBotOwnerGuid() || bot->HasAura(BERSERK))\n+                    {\n+                        //BOT_LOG_ERROR(\"entities.unit\", \"HIRE_NBOT_ENTRY: bot %u (%s) is unavailable all of the sudden!\", entry);\n+                        std::ostringstream failMsg;\n+                        failMsg << bot->GetName() << bot_ai::LocalizedNpcText(player, BOT_TEXT_BOTGIVER__BOT_BUSY);\n+                        WhisperTo(player, me, failMsg.view());\n+                        break;\n+                    }\n+\n+                    //laways returns true\n+                    bot->GetBotAI()->OnGossipSelect(player, me, GOSSIP_SENDER_HIRE, GOSSIP_ACTION_INFO_DEF);\n+\n+                    if (player->HaveBot() && player->GetBotMgr()->GetBot(bot->GetGUID()))\n+                        WhisperTo(player, me, bot_ai::LocalizedNpcText(player, BOT_TEXT_BOTGIVER_HIRESUCCESS).c_str());\n+\n+                    break;\n+                }\n+            }\n+\n+            if (subMenu)\n+                player->PlayerTalkClass->SendGossipMenu(gossipTextId, me->GetGUID());\n+            else\n+                player->PlayerTalkClass->SendCloseGossip();\n+\n+            return true;\n+        }\n+\n+        void WhisperTo(Player* player, Creature* me, std::string_view message)\n+        {\n+            me->Whisper(message, LANG_UNIVERSAL, player);\n+        }\n+    //};\n+\n+    //CreatureAI* GetAI(Creature* creature) const override\n+    //{\n+    //    return new bot_giver_AI(creature);\n+    //}\n+};\n+\n+void AddSC_script_bot_giver()\n+{\n+    new script_bot_giver();\n+}\ndiff --git a/src/server/game/AI/NpcBots/botgossip.h b/src/server/game/AI/NpcBots/botgossip.h\nnew file mode 100644\nindex 0000000000..6bb744a95a\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/botgossip.h\n@@ -0,0 +1,153 @@\n+#ifndef BOTGOSSIP_H\n+#define BOTGOSSIP_H\n+\n+#include \"Define.h\"\n+\n+enum BotGossips : uint32\n+{\n+    GOSSIP_SENDER_BEGIN                 = 6000,\n+    GOSSIP_SENDER_BOTGIVER_HIRE,\n+    GOSSIP_SENDER_BOTGIVER_HIRE_CLASS,\n+    GOSSIP_SENDER_BOTGIVER_HIRE_ENTRY,\n+    GOSSIP_SENDER_CLASS,\n+    GOSSIP_SENDER_CLASS_ACTION1,\n+    GOSSIP_SENDER_CLASS_ACTION2,\n+    GOSSIP_SENDER_CLASS_ACTION3,\n+    GOSSIP_SENDER_CLASS_ACTION4,\n+    GOSSIP_SENDER_EQUIPMENT,\n+    GOSSIP_SENDER_EQUIPMENT_LIST,\n+    GOSSIP_SENDER_EQUIPMENT_SHOW,\n+    GOSSIP_SENDER_EQUIPMENT_INFO,\n+    GOSSIP_SENDER_EQUIP_TRANSMOGS,\n+    GOSSIP_SENDER_EQUIP_TRANSMOG_INFO,\n+    GOSSIP_SENDER_EQUIP_TRANSMOGRIFY,\n+    GOSSIP_SENDER_EQUIP_TRANSMOGRIFY_BEGIN = GOSSIP_SENDER_EQUIP_TRANSMOGRIFY,\n+    GOSSIP_SENDER_EQUIP_TRANSMOGRIFY_MHAND = GOSSIP_SENDER_EQUIP_TRANSMOGRIFY_BEGIN,\n+    GOSSIP_SENDER_EQUIP_TRANSMOGRIFY_OHAND,\n+    GOSSIP_SENDER_EQUIP_TRANSMOGRIFY_RANGED,\n+    GOSSIP_SENDER_EQUIP_TRANSMOGRIFY_HEAD,\n+    GOSSIP_SENDER_EQUIP_TRANSMOGRIFY_SHOULDERS,\n+    GOSSIP_SENDER_EQUIP_TRANSMOGRIFY_CHEST,\n+    GOSSIP_SENDER_EQUIP_TRANSMOGRIFY_WAIST,\n+    GOSSIP_SENDER_EQUIP_TRANSMOGRIFY_LEGS,\n+    GOSSIP_SENDER_EQUIP_TRANSMOGRIFY_FEET,\n+    GOSSIP_SENDER_EQUIP_TRANSMOGRIFY_WRIST,\n+    GOSSIP_SENDER_EQUIP_TRANSMOGRIFY_HANDS,\n+    GOSSIP_SENDER_EQUIP_TRANSMOGRIFY_BACK,\n+    GOSSIP_SENDER_EQUIP_TRANSMOGRIFY_BODY,\n+    GOSSIP_SENDER_UNEQUIP,\n+    GOSSIP_SENDER_UNEQUIP_TO_GEARBANK,\n+    GOSSIP_SENDER_UNEQUIP_ALL,\n+    GOSSIP_SENDER_UNEQUIP_ALL_TO_GEARBANK,\n+    GOSSIP_SENDER_EQUIP_AUTOEQUIP,\n+    GOSSIP_SENDER_EQUIP_AUTOEQUIP_EQUIP,\n+    GOSSIP_SENDER_EQUIP_AUTOEQUIP_BEGIN = GOSSIP_SENDER_EQUIP_AUTOEQUIP_EQUIP,\n+    GOSSIP_SENDER_EQUIP_AUTOEQUIP_MHAND = GOSSIP_SENDER_EQUIP_AUTOEQUIP_BEGIN,\n+    GOSSIP_SENDER_EQUIP_AUTOEQUIP_OHAND,\n+    GOSSIP_SENDER_EQUIP_AUTOEQUIP_RANGED,\n+    GOSSIP_SENDER_EQUIP_AUTOEQUIP_HEAD,\n+    GOSSIP_SENDER_EQUIP_AUTOEQUIP_SHOULDERS,\n+    GOSSIP_SENDER_EQUIP_AUTOEQUIP_CHEST,\n+    GOSSIP_SENDER_EQUIP_AUTOEQUIP_WAIST,\n+    GOSSIP_SENDER_EQUIP_AUTOEQUIP_LEGS,\n+    GOSSIP_SENDER_EQUIP_AUTOEQUIP_FEET,\n+    GOSSIP_SENDER_EQUIP_AUTOEQUIP_WRIST,\n+    GOSSIP_SENDER_EQUIP_AUTOEQUIP_HANDS,\n+    GOSSIP_SENDER_EQUIP_AUTOEQUIP_BACK,\n+    GOSSIP_SENDER_EQUIP_AUTOEQUIP_BODY,\n+    GOSSIP_SENDER_EQUIP_AUTOEQUIP_FINGER1,\n+    GOSSIP_SENDER_EQUIP_AUTOEQUIP_FINGER2,\n+    GOSSIP_SENDER_EQUIP_AUTOEQUIP_TRINKET1,\n+    GOSSIP_SENDER_EQUIP_AUTOEQUIP_TRINKET2,\n+    GOSSIP_SENDER_EQUIP_AUTOEQUIP_NECK,\n+    GOSSIP_SENDER_EQUIP_RESET,\n+    GOSSIP_SENDER_EQUIP_RESET_TO_GEARBANK,\n+    GOSSIP_SENDER_EQUIP,\n+    GOSSIP_SENDER_EQUIP_BEGIN           = GOSSIP_SENDER_EQUIP,\n+    GOSSIP_SENDER_EQUIP_MHAND           = GOSSIP_SENDER_EQUIP_BEGIN,\n+    GOSSIP_SENDER_EQUIP_OHAND,\n+    GOSSIP_SENDER_EQUIP_RANGED,\n+    GOSSIP_SENDER_EQUIP_HEAD,\n+    GOSSIP_SENDER_EQUIP_SHOULDERS,\n+    GOSSIP_SENDER_EQUIP_CHEST,\n+    GOSSIP_SENDER_EQUIP_WAIST,\n+    GOSSIP_SENDER_EQUIP_LEGS,\n+    GOSSIP_SENDER_EQUIP_FEET,\n+    GOSSIP_SENDER_EQUIP_WRIST,\n+    GOSSIP_SENDER_EQUIP_HANDS,\n+    GOSSIP_SENDER_EQUIP_BACK,\n+    GOSSIP_SENDER_EQUIP_BODY,\n+    GOSSIP_SENDER_EQUIP_FINGER1,\n+    GOSSIP_SENDER_EQUIP_FINGER2,\n+    GOSSIP_SENDER_EQUIP_TRINKET1,\n+    GOSSIP_SENDER_EQUIP_TRINKET2,\n+    GOSSIP_SENDER_EQUIP_NECK,\n+    GOSSIP_SENDER_EQUIPMENT_BANK_MENU,\n+    GOSSIP_SENDER_EQUIPMENT_BANK_DEPOSIT,\n+    GOSSIP_SENDER_EQUIPMENT_BANK_WITHDRAW,\n+    GOSSIP_SENDER_EQUIPMENT_BANK_DEPOSIT_ITEM,\n+    GOSSIP_SENDER_EQUIPMENT_BANK_WITHDRAW_ITEM,\n+    GOSSIP_SENDER_EQUIPMENT_BANK_SETS_MENU,\n+    GOSSIP_SENDER_EQUIPMENT_BANK_SET_CREATE,\n+    GOSSIP_SENDER_EQUIPMENT_BANK_SET_MENU,\n+    GOSSIP_SENDER_EQUIPMENT_BANK_SET_MENU_ITEM,\n+    GOSSIP_SENDER_EQUIPMENT_BANK_SET_DELETE,\n+    GOSSIP_SENDER_EQUIPMENT_BANK_SET_EQUIP,\n+    GOSSIP_SENDER_ROLES_MAIN,\n+    GOSSIP_SENDER_ROLES_MAIN_TOGGLE,\n+    GOSSIP_SENDER_ROLES_GATHERING,\n+    GOSSIP_SENDER_ROLES_GATHERING_TOGGLE,\n+    GOSSIP_SENDER_ROLES_LOOTING,\n+    GOSSIP_SENDER_ROLES_LOOTING_TOGGLE,\n+    GOSSIP_SENDER_ABILITIES,\n+    GOSSIP_SENDER_ABILITIES_USE,\n+    GOSSIP_SENDER_ABILITIES_SPECIFICS_LIST,\n+    GOSSIP_SENDER_ABILITIES_USAGE_LIST,\n+    GOSSIP_SENDER_ABILITIES_USAGE_LIST_DAMAGE,\n+    GOSSIP_SENDER_ABILITIES_USAGE_LIST_CC,\n+    GOSSIP_SENDER_ABILITIES_USAGE_LIST_HEAL,\n+    GOSSIP_SENDER_ABILITIES_USAGE_LIST_SUPPORT,\n+    GOSSIP_SENDER_ABILITIES_USAGE_TOGGLE_DAMAGE,\n+    GOSSIP_SENDER_ABILITIES_USAGE_TOGGLE_CC,\n+    GOSSIP_SENDER_ABILITIES_USAGE_TOGGLE_HEAL,\n+    GOSSIP_SENDER_ABILITIES_USAGE_TOGGLE_SUPPORT,\n+    GOSSIP_SENDER_SPEC,\n+    GOSSIP_SENDER_SPEC_SET,\n+    GOSSIP_SENDER_USEITEM,\n+    GOSSIP_SENDER_USEITEM_USE,\n+    GOSSIP_SENDER_HIRE,\n+    GOSSIP_SENDER_DISMISS,\n+    GOSSIP_SENDER_OWNERSHIP,\n+    GOSSIP_SENDER_OWNERSHIP_ADD_PRE,\n+    GOSSIP_SENDER_OWNERSHIP_ADD,\n+    GOSSIP_SENDER_OWNERSHIP_REMOVE,\n+    GOSSIP_SENDER_JOIN_GROUP,\n+    GOSSIP_SENDER_LEAVE_GROUP,\n+    GOSSIP_SENDER_FORMATION,\n+    GOSSIP_SENDER_FORMATION_FOLLOW_DISTANCE_SET,\n+    GOSSIP_SENDER_FORMATION_TOGGLE_COMBAT_POSITIONING,\n+    GOSSIP_SENDER_FORMATION_ATTACK_DISTANCE,\n+    GOSSIP_SENDER_FORMATION_ATTACK_DISTANCE_SET,\n+    GOSSIP_SENDER_FORMATION_ATTACK_ANGLE,\n+    GOSSIP_SENDER_FORMATION_ATTACK_ANGLE_SET,\n+    GOSSIP_SENDER_MODEL_UPDATE,\n+    GOSSIP_SENDER_HOLDPOSITION,\n+    GOSSIP_SENDER_DONOTHING,\n+    GOSSIP_SENDER_FOLLOWME,\n+    GOSSIP_SENDER_ENGAGE_BEHAVIOR,\n+    GOSSIP_SENDER_ENGAGE_DELAY_SET_ATTACK,\n+    GOSSIP_SENDER_ENGAGE_DELAY_SET_HEALING,\n+    GOSSIP_SENDER_HEAL_HEALTH_THRESHOLD_SET,\n+    GOSSIP_SENDER_HEAL_HEALTH_THRESHOLD_PROPAGATE,\n+    GOSSIP_SENDER_PRIORITY_TARGET,\n+    GOSSIP_SENDER_PRIORITY_TARGET_SET_TANK,\n+    GOSSIP_SENDER_PRIORITY_TARGET_SET_DPS = GOSSIP_SENDER_PRIORITY_TARGET_SET_TANK + 3, // BOT_ROLE_DPS - BOT_ROLE_TANK\n+    GOSSIP_SENDER_TROUBLESHOOTING,\n+    GOSSIP_SENDER_TROUBLESHOOTING_FIX,\n+    GOSSIP_SENDER_TROUBLESHOOTING_AURA,\n+    GOSSIP_SENDER_SCAN,\n+    GOSSIP_SENDER_DEBUG,\n+    GOSSIP_SENDER_DEBUG_ACTION,\n+};\n+\n+#endif //BOTGOSSIP_H\ndiff --git a/src/server/game/AI/NpcBots/botlog.cpp b/src/server/game/AI/NpcBots/botlog.cpp\nnew file mode 100644\nindex 0000000000..621a5c86c6\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/botlog.cpp\n@@ -0,0 +1,83 @@\n+#include \"bot_ai.h\"\n+#include \"botconfig.h\"\n+#include \"botdatamgr.h\"\n+#include \"botlog.h\"\n+#include \"Creature.h\"\n+#include \"DatabaseEnvFwd.h\"\n+#include \"Log.h\"\n+\n+template<typename... Args>\n+static void BotLogImpl(uint16 log_type, uint32 entry, int32 owner, int32 mapid, int8 inmap, int8 inworld, Args&&... params)\n+{\n+    std::vector<std::string> sparams;\n+    sparams.reserve(MAX_BOT_LOG_PARAMS);\n+    using compounder = int[];\n+    (void)compounder { 0, ((void)sparams.push_back(NPCBots::StringConvert::ToString(params)), 0) ... };\n+    sparams.resize(MAX_BOT_LOG_PARAMS, {});\n+    for (uint8 i = 0; i < MAX_BOT_LOG_PARAMS; ++i)\n+    {\n+        if (sparams[i].size() > MAX_BOT_LOG_PARAM_LENGTH)\n+        {\n+            BOT_LOG_DEBUG(\"npcbots\", \"Bot logger: while writing type {} entry {} owner {} param {} '{}' was truncated to {} symbols!\",\n+                log_type, entry, owner, uint32(i+1), sparams[i], MAX_BOT_LOG_PARAM_LENGTH);\n+            sparams[i] = sparams[i].substr(0, MAX_BOT_LOG_PARAM_LENGTH);\n+        }\n+    }\n+\n+    CharacterDatabasePreparedStatement* bstmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_NPCBOT_LOG);\n+    //\"INSERT INTO characters_npcbot_logs (entry, owner, mapid, inmap, inworld, type, param1, param2, param3, param4, param5) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\", CONNECTION_ASYNC\n+    uint32 index = 0;\n+    bstmt->SetData(  index, entry);\n+    bstmt->SetData (++index, owner);\n+    bstmt->SetData (++index, mapid);\n+    bstmt->SetData  (++index, inmap);\n+    bstmt->SetData  (++index, inworld);\n+    bstmt->SetData(++index, log_type);\n+    for (std::string const& param : sparams)\n+        bstmt->SetData(++index, param);\n+    CharacterDatabase.Execute(bstmt);\n+}\n+\n+template<typename... Args>\n+inline static void BotLogImpl(uint16 log_type, Creature const* bot, int32 owner, Args&&... params)\n+{\n+    BotLogImpl(log_type, bot->GetEntry(), owner, (int32)bot->GetMapId(), (int8)!!bot->FindMap(), (int8)bot->IsInWorld(), std::forward<Args>(params)...);\n+}\n+\n+void BotLogger::Log(uint16 log_type, Creature const* bot, NPCBots::LoggableArguments auto&&... params)\n+{\n+    if (!BotCfg::IsNpcBotLogEnabled())\n+        return;\n+\n+    BotLogImpl(log_type, bot, int32(bot->GetBotAI() ? bot->GetBotAI()->GetBotOwnerGuid() : -1), std::forward<decltype(params)>(params)...);\n+}\n+\n+void BotLogger::Log(uint16 log_type, uint32 entry,  NPCBots::LoggableArguments auto&&... params)\n+{\n+    if (!BotCfg::IsNpcBotLogEnabled())\n+        return;\n+\n+    if (Creature const* bot = entry ? BotDataMgr::FindBot(entry) : nullptr)\n+        BotLogger::Log(log_type, bot, std::forward<decltype(params)>(params)...);\n+    else\n+    {\n+        if (entry)\n+        {\n+            std::stringstream ss;\n+            using compounder = int[];\n+            (void)compounder { 0, ((void)(ss << ' ' << params), 0) ... };\n+            BOT_LOG_DEBUG(\"npcbots\", \"Logging unregistered bot entry {}: type {} params:{}\", entry, log_type, ss.str());\n+        }\n+        BotLogImpl(log_type, entry, -1, -1, -1, -1, std::forward<decltype(params)>(params)...);\n+    }\n+}\n+\n+template void BotLogger::Log(uint16, Creature const*);\n+template void BotLogger::Log(uint16, Creature const*, bool&&, bool&&, bool&&);\n+template void BotLogger::Log(uint16, Creature const*, bool&&, bool&&, bool&&, uint32&&, bool&&);\n+template void BotLogger::Log(uint16, Creature const*, uint32&&, uint32&&, uint32&&);\n+template void BotLogger::Log(uint16, Creature const*, uint32&&, uint32&&, uint32&&, uint32&&);\n+template void BotLogger::Log(uint16, Creature const*, uint32&&, uint32&&, uint32&&, uint32&&, uint32&&);\n+template void BotLogger::Log(uint16, uint32);\n+template void BotLogger::Log(uint16, uint32, std::string_view&&);\n+template void BotLogger::Log(uint16, uint32, std::string_view&&, std::string_view&&, std::string_view&&, std::string_view&&, std::string_view&&);\ndiff --git a/src/server/game/AI/NpcBots/botlog.h b/src/server/game/AI/NpcBots/botlog.h\nnew file mode 100644\nindex 0000000000..2090b797f5\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/botlog.h\n@@ -0,0 +1,35 @@\n+#ifndef BOTLOG_H_\n+#define BOTLOG_H_\n+\n+#include \"Define.h\"\n+\n+#include \"botlogtraits.h\"\n+\n+class Creature;\n+\n+inline constexpr uint32 BOT_LOG_KEEP_DAYS = 30;\n+\n+enum BotLogType : uint16\n+{\n+    NPCBOT_LOG_SPAWN                    = 1,\n+    NPCBOT_LOG_TELEPORT_START           = 2,\n+    NPCBOT_LOG_TELEPORT_FINISH          = 3,\n+    NPCBOT_LOG_INIT_EQUIP               = 4,\n+    NPCBOT_LOG_EQUIP                    = 5,\n+    NPCBOT_LOG_UNEQUIP                  = 6,\n+    NPCBOT_LOG_EQUIP_RESET              = 7,\n+\n+    NPCBOT_LOG_SYSTEM_START             = 100,\n+    NPCBOT_LOG_CONFIG_RELOAD            = 101,\n+\n+    NPCBOT_LOG_END\n+};\n+\n+class BotLogger\n+{\n+public:\n+    static void Log(uint16 log_type, Creature const* bot, NPCBots::LoggableArguments auto&&... params);\n+    static void Log(uint16 log_type, uint32 entry, NPCBots::LoggableArguments auto&&... params);\n+};\n+\n+#endif //BOTLOG_H_\ndiff --git a/src/server/game/AI/NpcBots/botmgr.cpp b/src/server/game/AI/NpcBots/botmgr.cpp\nnew file mode 100644\nindex 0000000000..581ef14297\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/botmgr.cpp\n@@ -0,0 +1,2120 @@\n+#include \"Battleground.h\"\n+#include \"BattlegroundMgr.h\"\n+#include \"bot_ai.h\"\n+#include \"bot_Events.h\"\n+#include \"botconfig.h\"\n+#include \"botdatamgr.h\"\n+#include \"botdpstracker.h\"\n+#include \"botlog.h\"\n+#include \"botmgr.h\"\n+#include \"botspell.h\"\n+#include \"bottext.h\"\n+#include \"bpet_ai.h\"\n+#include \"Chat.h\"\n+#include \"CombatPackets.h\"\n+#include \"Config.h\"\n+#include \"GroupMgr.h\"\n+#include \"GridNotifiers.h\"\n+#include \"GridNotifiersImpl.h\"\n+#include \"Group.h\"\n+#include \"InstanceScript.h\"\n+#include \"Language.h\"\n+#include \"Log.h\"\n+#include \"Map.h\"\n+#include \"MapMgr.h\"\n+#include \"MotionMaster.h\"\n+#include \"ObjectMgr.h\"\n+#include \"Player.h\"\n+#include \"ScriptMgr.h\"\n+#include \"SpellAuraEffects.h\"\n+#include \"Tokenize.h\"\n+#include \"Transport.h\"\n+#include \"Vehicle.h\"\n+#include \"World.h\"\n+#include \"GitRevision.h\"\n+/*\n+Npc Bot Manager by Trickerer (onlysuffering@gmail.com)\n+Player NpcBots management\n+TODO: Move creature hooks here\n+*/\n+\n+#ifdef _MSC_VER\n+# pragma warning(push, 4)\n+#endif\n+\n+using namespace std::string_view_literals;\n+\n+static std::list<BotMgr::delayed_teleport_callback_type> delayed_bot_teleports;\n+\n+BotMgr::BotMgr(Player* const master) : _owner(master), _dpstracker(new DPSTracker())\n+{\n+    _quickrecall = false;\n+    _update_lock = false;\n+    _data = nullptr;\n+}\n+BotMgr::~BotMgr()\n+{\n+    if (_data)\n+        _data->flags &= NPCBOT_MGR_FLAG_MASK_ALL_DB_ALLOWED;\n+\n+    delete _dpstracker;\n+}\n+\n+void BotMgr::LoadData()\n+{\n+    ASSERT(!_data, \"Trying to load player %u data a second time\", _owner->GetGUID().GetCounter());\n+    _data = BotDataMgr::SelectOrCreateNpcBotMgrData(_owner->GetGUID());\n+}\n+\n+void BotMgr::Initialize()\n+{\n+    BotCfg::ReloadConfig();\n+    BotLogger::Log(NPCBOT_LOG_SYSTEM_START, uint32(0), std::string_view{ GitRevision::GetFileVersionStr() }.substr(0, MAX_BOT_LOG_PARAM_LENGTH));\n+\n+    BotDataMgr::LoadNpcBots();\n+    BotDataMgr::LoadWanderMap();\n+    BotDataMgr::GenerateWanderingBots();\n+    BotDataMgr::CreateWanderingBotsSortedGear();\n+    BotDataMgr::LoadNpcBotGroupData();\n+    BotDataMgr::LoadNpcBotGearStorage();\n+    BotDataMgr::LoadNpcBotGearSets();\n+    BotDataMgr::LoadNpcBotMgrData();\n+    BotDataMgr::DeleteOldLogs();\n+}\n+\n+uint8 BotMgr::GetNpcBotsCount() const\n+{\n+    //if (!inWorldOnly)\n+        return (uint8)_bots.size();\n+\n+    //CRITICAL SECTION\n+    //inWorldOnly is only for one-shot cases (opcodes, etc.)\n+    //maybe convert to (bot && bot->isInWorld()) ?\n+    //uint8 count = 0;\n+    //for (BotMap::const_iterator itr = _bots.begin(); itr != _bots.end(); ++itr)\n+    //    if (ObjectAccessor::GetObjectInWorld(itr->first, (Creature*)nullptr))\n+    //        ++count;\n+    //return count;\n+}\n+\n+uint8 BotMgr::GetNpcBotsCountByRole(uint32 roles) const\n+{\n+    return std::ranges::count_if(_bots, [=](BotMap::value_type const& kv) { return kv.second && (roles & kv.second->GetBotRoles()); });\n+}\n+\n+uint8 BotMgr::GetNpcBotsCountByVehicleEntry(uint32 creEntry) const\n+{\n+    return std::ranges::count_if(_bots, [=](BotMap::value_type const& kv) { return kv.second && kv.second->GetVehicle() && kv.second->GetVehicleBase()->GetEntry() == creEntry; });\n+}\n+\n+uint8 BotMgr::GetNpcBotSlot(Creature const* bot) const\n+{\n+    uint8 count = 1;\n+    for (auto const& [_, mbot] : _bots)\n+    {\n+        if (mbot == bot)\n+            break;\n+        ++count;\n+    }\n+    return count;\n+}\n+\n+uint8 BotMgr::GetNpcBotSlotByRole(uint32 roles, Creature const* bot) const\n+{\n+    uint8 count = 1;\n+    for (auto const& [_, mbot] : _bots)\n+    {\n+        if (roles & mbot->GetBotRoles())\n+        {\n+            if (mbot == bot)\n+                break;\n+            if (!(roles == BOT_ROLE_DPS && (mbot->GetBotRoles() & BOT_ROLE_TANK)))\n+                ++count;\n+        }\n+    }\n+    return count;\n+}\n+\n+uint32 BotMgr::GetAllNpcBotsClassMask() const\n+{\n+    uint32 classMask = 0;\n+    for (auto const& [_, mbot] : _bots)\n+        classMask |= (1u << (BotMgr::GetBotEquipmentClass(mbot->GetBotClass()) - 1));\n+    return classMask;\n+}\n+\n+bool BotMgr::LimitBots(Map const* map)\n+{\n+    if (map->IsBattlegroundOrArena())\n+        return true;\n+\n+    if (BotCfg::LimitNpcBotsInDungeons() && map->IsNonRaidDungeon())\n+        return true;\n+    if (BotCfg::LimitNpcBotsInRaids() && map->IsRaid())\n+        return true;\n+\n+    return false;\n+}\n+\n+bool BotMgr::IsBotContestedPvP(Creature const* bot)\n+{\n+    return bot->GetBotAI()->IsContestedPvP();\n+}\n+\n+void BotMgr::SetBotContestedPvP(Creature const* bot)\n+{\n+    bot->GetBotAI()->SetContestedPvP();\n+}\n+\n+bool BotMgr::CanBotParryWhileCasting(Creature const* bot)\n+{\n+    switch (bot->GetBotClass())\n+    {\n+        case BOT_CLASS_SEA_WITCH:\n+            return true;\n+        default:\n+            return false;\n+    }\n+}\n+\n+bool BotMgr::IsWanderingWorldBot(Creature const* bot)\n+{\n+    return bot->IsWandererBot() && (!bot->FindMap() || !bot->GetMap()->GetEntry() || bot->GetMap()->GetEntry()->IsWorldMap());\n+}\n+\n+void BotMgr::Update(uint32 diff)\n+{\n+    _dpstracker->Update(diff);\n+\n+    if (!HaveBot())\n+        return;\n+\n+    //ObjectGuid guid;\n+    bool partyCombat = IsPartyInCombat(false);\n+    bool restrictBots = RestrictBots(_bots.begin()->second, false);\n+\n+    if (partyCombat)\n+        bot_ai::CalculateAoeSpots(_owner, _aoespots);\n+\n+    _update_lock = true;\n+\n+    for (auto const& [_, bot] : _bots)\n+    {\n+        bot_ai* ai = bot->GetBotAI();\n+\n+        if (ai->IAmFree())\n+            continue;\n+\n+        if (!bot->IsInWorld())\n+        {\n+            ai->CommonTimers(diff);\n+            continue;\n+        }\n+\n+        if (partyCombat == false || _owner->InBattleground())\n+            ai->UpdateReviveTimer(diff);\n+\n+        //bot->IsAIEnabled = true;\n+\n+        if (ai->GetReviveTimer() <= diff)\n+        {\n+            if (bot->IsInMap(_owner) && !bot->IsAlive() && !ai->IsDuringTeleport() && _owner->IsAlive() && !_owner->IsInCombat() &&\n+                !_owner->IsBeingTeleported() && !_owner->GetMap()->IsBattleArena() && !_owner->IsInFlight() &&\n+                !_owner->HasUnitFlag2(UNIT_FLAG2_FEIGN_DEATH) && !_owner->HasInvisibilityAura() && !_owner->HasStealthAura())\n+            {\n+                _reviveBot(bot);\n+                continue;\n+            }\n+\n+            ai->SetReviveTimer(urand(1000, 5000));\n+        }\n+\n+        if (_owner->IsAlive() && (bot->IsAlive() || restrictBots) && !ai->IsTempBot() && !ai->IsDuringTeleport() &&\n+            (restrictBots || bot->GetMap() != _owner->GetMap() ||\n+            (!bot->GetBotAI()->HasBotCommandState(BOT_COMMAND_STAY) && _owner->GetDistance(bot) > SIZE_OF_GRIDS)))\n+        {\n+            //_owner->m_Controlled.erase(bot);\n+            TeleportBot(bot, _owner->GetMap(), _owner, _quickrecall);\n+            continue;\n+        }\n+\n+        ai->canUpdate = true;\n+        bot->Update(diff);\n+        ai->canUpdate = false;\n+    }\n+\n+    _update_lock = false;\n+\n+    while (!_delayedRemoveList.empty())\n+    {\n+        decltype(_delayedRemoveList)::iterator itr = _delayedRemoveList.begin();\n+        RemoveBot(itr->first, itr->second);\n+    }\n+\n+    if (_quickrecall)\n+    {\n+        _quickrecall = false;\n+        _data->RemoveFlag(NPCBOT_MGR_FLAG_HIDE_BOTS);\n+    }\n+}\n+\n+bool BotMgr::RestrictBots(Creature const* bot, bool add) const\n+{\n+    if (!_owner->FindMap())\n+        return true;\n+\n+    if (_owner->IsInFlight())\n+        return true;\n+\n+    if (_data->HasFlag(NPCBOT_MGR_FLAG_HIDE_BOTS))\n+        return true;\n+\n+    Map const* currMap = _owner->GetMap();\n+\n+    if (!BotCfg::IsMapAllowedForBots(currMap))\n+        return true;\n+\n+    if (LimitBots(currMap))\n+    {\n+        Group const* gr = _owner->GetGroup();\n+\n+        //if bot is not in instance group - deny (only if trying to teleport to instance)\n+        if (add)\n+        {\n+            if (!gr || !gr->IsMember(bot->GetGUID()))\n+                return true;\n+\n+            //teleporting raid member bot to non-rain dungeon: prioritize owner sub-group members\n+            if (gr->isRaidGroup() && currMap->IsNonRaidDungeon())\n+            {\n+                uint32 max_members = currMap->ToInstanceMap()->GetMaxPlayers();\n+                if (gr->GetMembersCount() > max_members)\n+                {\n+                    uint8 owner_subgroup = gr->GetMemberGroup(_owner->GetGUID());\n+                    if (owner_subgroup != gr->GetMemberGroup(bot->GetGUID()))\n+                    {\n+                        const std::vector<Unit*> members = GetAllGroupMembers(gr);\n+                        uint32 sub_members = 0;\n+                        uint32 sub_members_inside = 0;\n+                        for (auto const& mslot : gr->GetMemberSlots())\n+                        {\n+                            if (mslot.group == owner_subgroup)\n+                            {\n+                                decltype(members)::const_iterator it = std::ranges::find_if(members, [&](Unit const* unit) { return mslot.guid == unit->GetGUID(); });\n+                                if (it != members.cend() && (*it)->IsInMap(_owner))\n+                                    ++sub_members_inside;\n+                                if (++sub_members >= max_members)\n+                                    break;\n+                            }\n+                        }\n+                        if (sub_members >= max_members || sub_members_inside < sub_members)\n+                            return true;\n+                    }\n+                }\n+            }\n+        }\n+\n+        uint32 max_players = 0;\n+        if (currMap->IsDungeon())\n+            max_players = currMap->ToInstanceMap()->GetMaxPlayers();\n+        else if (currMap->IsBattlegroundOrArena())\n+            max_players = _owner->GetBattleground()->GetMaxPlayersPerTeam();\n+\n+        if (max_players)\n+        {\n+            uint32 curPlayers;\n+            if (gr && currMap->IsBattlegroundOrArena())\n+            {\n+                curPlayers = std::ranges::count_if(GetAllGroupMembers(gr), [this](Unit const* u) {\n+                    return u->IsInWorld() && u->IsInMap(_owner) && !(u->IsNPCBot() && u->ToCreature()->IsTempBot());\n+                });\n+            }\n+            else\n+                curPlayers = currMap->GetPlayersCountExceptGMs();\n+            if (curPlayers + uint32(add) > max_players)\n+                return true;\n+        }\n+    }\n+\n+    return false;\n+}\n+\n+bool BotMgr::IsPartyInCombat(bool is_pvp) const\n+{\n+    if (_owner->IsInCombat() && (!is_pvp || _owner->GetCombatTimer() > 0))\n+        return true;\n+    return std::ranges::any_of(_bots, [=](BotMap::value_type const& kv) { return kv.second->IsInCombat() && (!is_pvp || kv.second->GetCombatManager().HasPvPCombat()); });\n+}\n+\n+bool BotMgr::HasBotClass(uint8 botclass) const\n+{\n+    return std::ranges::any_of(_bots, [=](BotMap::value_type const& kv) { return kv.second->GetBotClass() == botclass; });\n+}\n+\n+bool BotMgr::HasBotWithSpec(uint8 spec, bool alive) const\n+{\n+    return std::ranges::any_of(_bots, [=](BotMap::value_type const& kv) { return kv.second->GetBotAI()->GetSpec() == spec && (!alive || kv.second->IsAlive()); });\n+}\n+\n+bool BotMgr::HasBotPetType(uint32 petType) const\n+{\n+    return std::ranges::any_of(_bots, [=](BotMap::value_type const& kv) { return kv.second->GetBotsPet() && kv.second->GetBotAI()->GetAIMiscValue(BOTAI_MISC_PET_TYPE) == petType; });\n+}\n+\n+bool BotMgr::IsBeingResurrected(WorldObject const* corpse) const\n+{\n+    std::vector<Unit const*> casters;\n+    if (_owner->IsNonMeleeSpellCast(false, true, true))\n+        casters.push_back(_owner);\n+    for (auto const& [_, bot] : _bots)\n+    {\n+        if (bot->IsNonMeleeSpellCast(false, true, true))\n+            casters.push_back(bot);\n+    }\n+\n+    if (Group const* group = _owner->GetGroup())\n+    {\n+        for (GroupReference const* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())\n+        {\n+            Player const* player = itr->GetSource();\n+            if (!player || player == _owner || player->FindMap() != corpse->GetMap())\n+                continue;\n+\n+            if (player->IsNonMeleeSpellCast(false, true, true))\n+                casters.push_back(player);\n+\n+            if (player->HaveBot())\n+            {\n+                for (auto const& [_, bot] : *player->GetBotMgr()->GetBotMap())\n+                {\n+                    if (bot->IsNonMeleeSpellCast(false, true, true))\n+                        casters.push_back(bot);\n+                }\n+            }\n+        }\n+    }\n+\n+    for (Unit const* caster : casters)\n+    {\n+        if (Spell const* spell = caster->GetCurrentSpell(CURRENT_GENERIC_SPELL))\n+        {\n+            if (corpse->GetGUID() == (corpse->ToCorpse() ? spell->m_targets.GetCorpseTargetGUID() : spell->m_targets.GetUnitTargetGUID()))\n+                return true;\n+        }\n+    }\n+\n+    return false;\n+}\n+\n+void BotMgr::_reviveBot(Creature* bot, WorldLocation* dest)\n+{\n+    if (bot->IsAlive() || !bot->IsInWorld())\n+        return;\n+\n+    if (!bot->GetBotAI()->IAmFree())\n+    {\n+        if (!dest)\n+            bot->CastSpell(bot, COSMETIC_RESURRECTION, false);\n+\n+        if (!dest)\n+            dest = bot->GetBotOwner();\n+\n+        bot->NearTeleportTo(dest->GetPositionX(), dest->GetPositionY(), dest->GetPositionZ(), dest->GetOrientation());\n+        //some weird pos manipulation\n+        if (dest != bot)\n+            bot->Relocate(dest);\n+    }\n+\n+    bot->SetDisplayId(bot->GetNativeDisplayId(), bot->GetCreatureTemplate()->GetFirstValidModel()->DisplayScale);\n+    bot->ReplaceAllNpcFlags(NPCFlags(bot->GetCreatureTemplate()->npcflag));\n+    bot->ClearUnitState(uint32(UNIT_STATE_ALL_STATE & ~(UNIT_STATE_IGNORE_PATHFINDING | UNIT_STATE_NO_ENVIRONMENT_UPD)));\n+    bot->ReplaceAllUnitFlags(UnitFlags(0));\n+    bot->SetLootRecipient(nullptr);\n+    bot->SetPvP(bot->GetBotOwner()->IsPvP());\n+    bot->Motion_Initialize();\n+    bot->setDeathState(DeathState::Alive);\n+    //bot->GetBotAI()->Reset();\n+    bot->RefreshSwimmingFlag();\n+    bot->GetBotAI()->SetShouldUpdateStats();\n+\n+    uint8 restore_factor = (bot->IsWandererBot() || (!bot->GetBotAI()->IAmFree() && bot->GetBotOwner()->InBattleground())) ? 1 : 4;\n+    bot->SetHealth(bot->GetMaxHealth() / restore_factor); //25% of max health\n+    if (bot->GetMaxPower(POWER_MANA) > 1)\n+        bot->SetPower(POWER_MANA, bot->GetMaxPower(POWER_MANA) / restore_factor); //25% of max mana\n+\n+    if (IsWanderingWorldBot(bot))\n+        bot->ResetPlayerDamageReq();\n+\n+    if (!bot->GetBotAI()->IAmFree() && !bot->GetBotAI()->HasBotCommandState(BOT_COMMAND_MASK_UNMOVING))\n+        bot->GetBotAI()->SetBotCommandState(BOT_COMMAND_FOLLOW, true);\n+}\n+\n+Creature* BotMgr::GetBot(ObjectGuid guid) const\n+{\n+    decltype(_bots)::const_iterator itr = _bots.find(guid);\n+    return itr != _bots.end() ? itr->second : nullptr;\n+}\n+\n+Creature* BotMgr::GetBotByName(std::string_view name) const\n+{\n+    std::wstring wname;\n+    if (Utf8toWStr(name, wname))\n+    {\n+        wstrToLower(wname);\n+        for (auto const& [_, bot] : _bots)\n+        {\n+            if (!bot)\n+                continue;\n+\n+            std::string_view basename = bot->GetName();\n+            if (CreatureLocale const* creatureInfo = sObjectMgr->GetCreatureLocale(bot->GetEntry()))\n+            {\n+                uint32 loc = _owner->GetSession()->GetSessionDbLocaleIndex();\n+                if (creatureInfo->Name.size() > loc && !creatureInfo->Name[loc].empty())\n+                    basename = creatureInfo->Name[loc];\n+            }\n+\n+            std::wstring wbname;\n+            if (!Utf8toWStr(basename, wbname))\n+                continue;\n+\n+            wstrToLower(wbname);\n+            if (wbname == wname)\n+                return bot;\n+        }\n+    }\n+\n+    return nullptr;\n+}\n+\n+std::vector<Creature*> BotMgr::GetAllBotsByClass(uint8 botclass) const\n+{\n+    std::vector<Creature*> foundBots;\n+    foundBots.reserve(_bots.size());\n+    for (auto const& [_, bot] : _bots)\n+    {\n+        if (!bot|| !bot->IsInWorld() || !bot->IsAlive())\n+            continue;\n+\n+        if (bot->GetBotClass() == botclass)\n+            foundBots.push_back(bot);\n+    }\n+\n+    return foundBots;\n+}\n+\n+void BotMgr::OnOwnerSetGameMaster(bool on)\n+{\n+    for (auto const& [_, bot] : _bots)\n+    {\n+        if (!bot)\n+            continue;\n+\n+        bot->SetFaction(_owner->GetFaction());\n+        //bot->getHostileRefManager().setOnlineOfflineState(!on);\n+        bot->SetByteValue(UNIT_FIELD_BYTES_2, 1, _owner->GetByteValue(UNIT_FIELD_BYTES_2, 1)); //pvp state\n+\n+        if (on && bot->IsInWorld())\n+            bot->CombatStop(true);\n+\n+        if (Unit* pet = bot->GetBotsPet())\n+        {\n+            pet->SetFaction(_owner->GetFaction());\n+            //pet->getHostileRefManager().setOnlineOfflineState(!on);\n+            pet->SetByteValue(UNIT_FIELD_BYTES_2, 1, _owner->GetByteValue(UNIT_FIELD_BYTES_2, 1)); //pvp state\n+\n+            if (on)\n+                pet->CombatStop(true);\n+        }\n+    }\n+}\n+\n+void BotMgr::OnTeleportFar(uint32 mapId, float x, float y, float z, float ori)\n+{\n+    Map* newMap = sMapMgr->CreateBaseMap(mapId);\n+    Position pos{ x, y, z, ori };\n+\n+    for (auto const& [_, bot] : _bots)\n+    {\n+        if (bot->IsTempBot())\n+            continue;\n+\n+        //_owner->m_Controlled.erase(bot);\n+        TeleportBot(bot, newMap, &pos);\n+    }\n+}\n+\n+void BotMgr::_teleportBot(Creature* bot, Map* newMap, float x, float y, float z, float ori, bool quick, bool reset, bot_ai* detached_ai)\n+{\n+    bot_ai* botai = detached_ai ? detached_ai : bot->GetBotAI();\n+    ASSERT(botai);\n+    botai->AbortTeleport();\n+    botai->SetIsDuringTeleport(true);\n+    botai->KillEvents(true);\n+    bot->m_Events.KillAllEvents(false);\n+\n+    BotLogger::Log(NPCBOT_LOG_TELEPORT_START, bot, bot->IsInGrid(), bot->IsWandererBot(), botai->CanAppearInWorld(), newMap->GetId(), bool(reset));\n+\n+    BotMgr::AddDelayedTeleportCallback([bot, botai, newMap, x, y, z, ori, quick, reset]() {\n+        if (bot->GetVehicle())\n+            bot->ExitVehicle();\n+\n+        if (bot->GetTransport())\n+        {\n+            bot->ClearUnitState(UNIT_STATE_IGNORE_PATHFINDING);\n+            bot->GetTransport()->RemovePassenger(bot, true);\n+        }\n+\n+        Map* mymap = bot->FindMap();\n+        if (mymap)\n+        {\n+            bot->BotStopMovement();\n+\n+            if (mymap != newMap)\n+            {\n+                bot->RemoveAurasByType(SPELL_AURA_MOD_STUN);\n+                bot->RemoveAurasByType(SPELL_AURA_MOD_FEAR);\n+                bot->RemoveAurasByType(SPELL_AURA_MOD_CONFUSE);\n+                bot->RemoveAurasByType(SPELL_AURA_MOD_ROOT);\n+                bot->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_TELEPORTED);\n+            }\n+\n+            bot->InterruptNonMeleeSpells(true);\n+\n+            if (bot->IsInWorld())\n+            {\n+                botai->UnsummonAll(!botai->IAmFree() || botai->IsWanderer());\n+\n+                if (Battleground* bg = bot->GetBotBG())\n+                    bg->EventBotDroppedFlag(bot);\n+\n+                bot->CastSpell(bot, COSMETIC_TELEPORT_EFFECT, true);\n+\n+                if (!bot->IsFreeBot())\n+                    if (InstanceScript* iscr = bot->GetBotOwner()->GetInstanceScript())\n+                        iscr->OnNPCBotLeave(bot);\n+\n+                bot->RemoveFromWorld();\n+            }\n+\n+            bot->RemoveAllGameObjects();\n+            bot->m_Events.KillAllEvents(false);\n+            bot->CombatStop();\n+            bot->ClearComboPoints();\n+            bot->ClearComboPointHolders();\n+\n+            if (bot->IsInGrid())\n+                mymap->RemoveFromMap(bot, false);\n+        }\n+\n+        if (botai->IAmFree())\n+        {\n+            bot->Relocate(x, y, z, ori);\n+            if (bot->FindMap())\n+                bot->ResetMap();\n+            bot->SetMap(newMap);\n+            if (!bot->IsWandererBot() && !botai->CanAppearInWorld())\n+            {\n+                botai->AbortTeleport();\n+                TeleportFinishEvent* delayedTeleportEvent = new TeleportFinishEvent(botai, reset);\n+                botai->GetEvents()->AddEvent(delayedTeleportEvent, botai->GetEvents()->CalculateTime(urand(5000, 8000)));\n+                botai->SetTeleportFinishEvent(delayedTeleportEvent);\n+                return;\n+            }\n+\n+            BotLogger::Log(NPCBOT_LOG_TELEPORT_FINISH, bot, bot->IsInGrid(), bot->IsWandererBot(), botai->CanAppearInWorld(), newMap->GetId(), bool(reset));\n+\n+            newMap->AddToMap(bot);\n+            if (reset)\n+                botai->Reset();\n+            botai->SetIsDuringTeleport(false);\n+            botai->ResetContestedPvP();\n+\n+            if (newMap->IsBattleground())\n+            {\n+                Battleground* bg = botai->GetBG();\n+                if (!bg)\n+                {\n+                    BotDataMgr::DespawnWandererBot(bot->GetEntry());\n+                    return;\n+                }\n+\n+                if (newMap != mymap)\n+                {\n+                    //we teleport from base non-instanced map which normally doesn't exist\n+                    if (mymap)\n+                        ASSERT(mymap->GetPlayersCountExceptGMs() == 0);\n+\n+                    bg->AddBot(bot);\n+                }\n+\n+                if (!bot->IsAlive())\n+                {\n+                    ObjectGuid shGuid = ObjectGuid::Empty;\n+                    float mindist = 0.0f;\n+                    for (ObjectGuid bgCreGuid : bg->BgCreatures)\n+                    {\n+                        if (Creature const* bgCre = newMap->GetCreature(bgCreGuid))\n+                        {\n+                            if (bgCre->IsSpiritService())\n+                            {\n+                                float dist = bot->GetExactDist2d(bgCre);\n+                                if (shGuid == ObjectGuid::Empty || dist < mindist)\n+                                {\n+                                    mindist = dist;\n+                                    shGuid = bgCreGuid;\n+                                }\n+                            }\n+                        }\n+                    }\n+                    if (shGuid)\n+                        bg->AddPlayerToResurrectQueue(shGuid, bot->GetGUID());\n+                    else\n+                    {\n+                        BOT_LOG_ERROR(\"npcbots\", \"TeleportBot: Bot {} '{}' can't find SpiritHealer in bg {}!\",\n+                            bot->GetEntry(), bot->GetName().c_str(), bg->GetName().c_str());\n+                    }\n+                }\n+            }\n+\n+            botai->canUpdate = true;\n+\n+            return;\n+        }\n+\n+        //update group member online state\n+        if (Group* gr = bot->GetBotOwner()->GetGroup())\n+            if (gr->IsMember(bot->GetGUID()))\n+                gr->SendUpdate();\n+\n+        botai->AbortTeleport();\n+        TeleportFinishEvent* finishEvent = new TeleportFinishEvent(botai, reset);\n+        uint64 delay = quick ? urand(500, 1500) : urand(5000, 8000);\n+        botai->GetEvents()->AddEvent(finishEvent, botai->GetEvents()->CalculateTime(delay));\n+        botai->SetTeleportFinishEvent(finishEvent);\n+    });\n+}\n+\n+void BotMgr::TeleportBot(Creature* bot, Map* newMap, Position const* pos, bool quick, bool reset, bot_ai* detached_ai)\n+{\n+    _teleportBot(bot, newMap, pos->GetPositionX(), pos->GetPositionY(), pos->GetPositionZ(), pos->GetOrientation(), quick, reset, detached_ai);\n+}\n+\n+void BotMgr::CleanupsBeforeBotDelete(ObjectGuid guid, uint8 removetype)\n+{\n+    decltype(_bots)::const_iterator itr = _bots.find(guid);\n+    ASSERT(itr != _bots.end(), \"Trying to remove bot which does not belong to this botmgr(b)!!\");\n+    //ASSERT(_owner->IsInWorld(), \"Trying to remove bot while not in world(b)!!\");\n+\n+    Creature* bot = itr->second;\n+\n+    ASSERT(bot->GetCreator() && bot->GetCreator()->GetGUID() == _owner->GetGUID());\n+\n+    if (!bot->IsTempBot())\n+        RemoveBotFromBGQueue(bot);\n+\n+    if (removetype != BOT_REMOVE_LOGOUT || bot->GetBotAI()->HasSharedOwner(_owner->GetGUID().GetCounter()))\n+        RemoveBotFromGroup(bot);\n+\n+    CleanupsBeforeBotDelete(bot);\n+}\n+\n+void BotMgr::CleanupsBeforeBotDelete(Creature* bot)\n+{\n+    //don't allow removing bots while they are teleporting\n+    if (!bot->IsInWorld())\n+        bot->GetBotAI()->AbortTeleport();\n+\n+    if (bot->GetVehicle())\n+        bot->ExitVehicle();\n+\n+    //remove any summons\n+    bot->GetBotAI()->UnsummonAll(false);\n+    bot->AttackStop();\n+    bot->CombatStopWithPets(true);\n+\n+    //bot->SetOwnerGUID(ObjectGuid::Empty);\n+    //_owner->m_Controlled.erase(bot);\n+    bot->SetControlledByPlayer(false);\n+    //bot->RemoveUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED);\n+    //bot->RemoveUnitFlag(UNIT_FLAG_PVP_ATTACKABLE);\n+    bot->SetByteValue(UNIT_FIELD_BYTES_2, 1, 0);\n+    bot->SetCreator(nullptr);\n+    //bot->SetCreatorGUID(ObjectGuid::Empty);\n+\n+    Map* map = bot->FindMap();\n+    if (!map || map->IsDungeon() || bot->IsTempBot())\n+        bot->RemoveFromWorld();\n+}\n+\n+void BotMgr::RemoveAllBots(uint8 removetype)\n+{\n+    while (!_bots.empty())\n+        RemoveBot(_bots.begin()->second->GetGUID(), removetype);\n+}\n+//Bot is being abandoned by player\n+void BotMgr::RemoveBot(ObjectGuid guid, uint8 removetype)\n+{\n+    decltype(_bots)::const_iterator itr = _bots.find(guid);\n+    ASSERT(itr != _bots.end(), \"Trying to remove bot which does not belong to this botmgr(a)!!\");\n+    //ASSERT(_owner->IsInWorld(), \"Trying to remove bot while not in world(a)!!\");\n+\n+    Creature* bot = itr->second;\n+\n+    if (_update_lock)\n+    {\n+        _delayedRemoveList.emplace_back(guid, BotRemoveType(removetype));\n+        return;\n+    }\n+    else if (!_delayedRemoveList.empty())\n+        std::erase_if(_delayedRemoveList, [=](decltype(_delayedRemoveList)::value_type const& p) { return p.first == guid; });\n+\n+    CleanupsBeforeBotDelete(guid, removetype);\n+\n+    if (_owner->GetSession()->PlayerLogout() && bot->IsInGrid() && bot->FindMap() && bot->FindMap()->GetEntry()->Instanceable())\n+        bot->FindMap()->RemoveFromMap(bot, false);\n+\n+    ////remove control bar\n+    //if (GetNpcBotsCount() <= 1 && !_owner->GetPetGUID() && _owner->m_Controlled.empty())\n+    //    _owner->SendRemoveControlBar();\n+\n+    _bots.erase(itr);\n+\n+    if (bot->GetBotAI()->IsTempBot())\n+        return;\n+\n+    BotAIResetType resetType;\n+    switch (removetype)\n+    {\n+        case BOT_REMOVE_DISMISS: case BOT_REMOVE_UNAFFORD: resetType = bot->GetBotAI()->IsSharedBot() ? BOTAI_RESET_UNBIND : BOTAI_RESET_DISMISS; break;\n+        case BOT_REMOVE_UNBIND:                            resetType = BOTAI_RESET_UNBIND;                                                        break;\n+        default:                                           resetType = BOTAI_RESET_LOGOUT;                                                        break;\n+    }\n+    bot->GetBotAI()->ResetBotAI(resetType);\n+\n+    bot->SetFaction(bot->GetCreatureTemplate()->faction);\n+    bot->SetLevel(bot->GetCreatureTemplate()->minlevel);\n+\n+    if (resetType == BOTAI_RESET_DISMISS)\n+    {\n+        BotDataMgr::ResetNpcBotTransmogData(bot->GetEntry(), false);\n+        uint32 newOwner = 0;\n+        BotDataMgr::UpdateNpcBotData(bot->GetEntry(), NPCBOT_UPDATE_OWNER, &newOwner);\n+        NpcBotData::SharedOwnersContainer sharedOwners{};\n+        BotDataMgr::UpdateNpcBotData(bot->GetEntry(), NPCBOT_UPDATE_SHARED_OWNERS, &sharedOwners);\n+    }\n+}\n+\n+void BotMgr::UnbindBot(ObjectGuid guid)\n+{\n+    Creature const* bot = GetBot(guid);\n+    ASSERT(bot);\n+\n+    RemoveBot(guid, BOT_REMOVE_UNBIND);\n+    bot->GetBotAI()->SetBotCommandState(BOT_COMMAND_UNBIND);\n+}\n+BotAddResult BotMgr::RebindBot(Creature* bot)\n+{\n+    BotAddResult res = AddBot(bot);\n+    if (res == BOT_ADD_SUCCESS)\n+        bot->GetBotAI()->RemoveBotCommandState(BOT_COMMAND_UNBIND);\n+    return res;\n+}\n+\n+BotAddResult BotMgr::AddBot(Creature* bot)\n+{\n+    ASSERT(bot->IsNPCBot());\n+    ASSERT(bot->GetBotAI() != nullptr);\n+\n+    bool owned = bot->GetBotAI()->IsTempBot() || bot->GetBotAI()->HasOwner(_owner->GetGUID().GetCounter());\n+    uint8 owned_count = BotDataMgr::GetOwnedBotsCount(_owner->GetGUID(), 0, true);\n+    uint8 class_count = BotDataMgr::GetOwnedBotsCount(_owner->GetGUID(), bot->GetClassMask(), true);\n+\n+    if (!BotCfg::IsNpcBotModEnabled())\n+    {\n+        ChatHandler ch(_owner->GetSession());\n+        ch.SendSysMessage(bot_ai::LocalizedNpcText(GetOwner(), BOT_TEXT_BOTADDFAIL_DISABLED));\n+        return BOT_ADD_DISABLED;\n+    }\n+    if (GetBot(bot->GetGUID()))\n+        return BOT_ADD_ALREADY_HAVE; //Silent error, intended\n+    if (!bot->GetBotAI()->IAmFree())\n+    {\n+        ChatHandler ch(_owner->GetSession());\n+        ch.PSendSysMessage(bot_ai::LocalizedNpcText(GetOwner(), BOT_TEXT_BOTADDFAIL_OWNED).c_str(), bot->GetName(), bot->GetBotOwner()->GetName());\n+        return BOT_ADD_NOT_AVAILABLE;\n+    }\n+    if (!owned && owned_count >= BotCfg::GetMaxNpcBots(_owner->GetLevel()))\n+    {\n+        ChatHandler ch(_owner->GetSession());\n+        ch.PSendSysMessage(bot_ai::LocalizedNpcText(GetOwner(), BOT_TEXT_HIREFAIL_MAXBOTS).c_str(), BotCfg::GetMaxNpcBots(_owner->GetLevel()));\n+        return BOT_ADD_MAX_EXCEED;\n+    }\n+    if (!owned && BotCfg::GetMaxClassBots() && class_count >= BotCfg::GetMaxClassBots())\n+    {\n+        ChatHandler ch(_owner->GetSession());\n+        ch.PSendSysMessage(bot_ai::LocalizedNpcText(GetOwner(), BOT_TEXT_HIREFAIL_MAXCLASSBOTS).c_str(), class_count, BotCfg::GetMaxClassBots());\n+        return BOT_ADD_MAX_CLASS_EXCEED;\n+    }\n+    //Map* curMap = _owner->GetMap();\n+    //if (!temporary && LimitBots(curMap))\n+    //{\n+    //    InstanceMap* map = curMap->ToInstanceMap();\n+    //    uint32 count = map->GetPlayersCountExceptGMs();\n+    //    if (count >= map->GetMaxPlayers())\n+    //    {\n+    //        ChatHandler ch(_owner->GetSession());\n+    //        ch.PSendSysMessage(\"Instance players limit exceed ({} of {})\", count, map->GetMaxPlayers());\n+    //        return BOT_ADD_INSTANCE_LIMIT;\n+    //    }\n+    //}\n+    if (!owned)\n+    {\n+        uint32 cost = BotCfg::GetNpcBotCostHire(_owner->GetLevel(), bot->GetBotClass());\n+        if (!_owner->HasEnoughMoney(cost))\n+        {\n+            ChatHandler ch(_owner->GetSession());\n+            std::ostringstream mss;\n+            mss << bot_ai::LocalizedNpcText(GetOwner(), BOT_TEXT_HIREFAIL_COST) << \" (\"\n+                << BotCfg::GetNpcBotCostStr(_owner->GetLevel(), bot->GetBotClass()) << \")!\";\n+            ch.SendSysMessage(mss.view());\n+            return BOT_ADD_CANT_AFFORD;\n+        }\n+\n+        _owner->ModifyMoney(-(int32(cost)));\n+    }\n+\n+    bot->GetBotAI()->canUpdate = false;\n+\n+    if (!bot->IsAlive())\n+        _reviveBot(bot);\n+\n+    bot->GetBotAI()->UnsummonAll(false);\n+\n+    _bots[bot->GetGUID()] = bot;\n+\n+    ASSERT(!bot->GetCreator());\n+    //ASSERT(!bot->GetOwnerGUID());\n+    //bot->SetOwnerGUID(_owner->GetGUID());\n+    bot->SetCreator(_owner); //needed in case of FFAPVP\n+    //bot->SetCreatorGUID(_owner->GetGUID());\n+    //_owner->m_Controlled.insert(bot);\n+    bot->SetControlledByPlayer(true);\n+    //bot->SetUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED);\n+    bot->SetByteValue(UNIT_FIELD_BYTES_2, 1, _owner->GetByteValue(UNIT_FIELD_BYTES_2, 1));\n+    bot->SetFaction(_owner->GetFaction());\n+    bot->SetPhaseMask(_owner->GetPhaseMask(), true);\n+\n+    bot->GetBotAI()->SetBotOwner(_owner);\n+\n+    bot->GetBotAI()->Reset();\n+\n+    bot->LowerPlayerDamageReq(bot->GetMaxHealth(), false);\n+\n+    if (!bot->IsInWorld())\n+        TeleportBot(bot, _owner->GetMap(), _owner);\n+\n+    if (!bot->GetBotAI()->IsTempBot())\n+    {\n+        uint32 newOwner = _owner->GetGUID().GetCounter();\n+        if (!bot->GetBotAI()->HasSharedOwner(newOwner))\n+            BotDataMgr::UpdateNpcBotData(bot->GetEntry(), NPCBOT_UPDATE_OWNER, &newOwner);\n+\n+        bot->GetBotAI()->SetBotCommandState(BOT_COMMAND_FOLLOW, true);\n+        if (bot->GetBotAI()->HasRole(BOT_ROLE_PARTY))\n+            AddBotToGroup(bot);\n+    }\n+\n+    return BOT_ADD_SUCCESS;\n+}\n+\n+bool BotMgr::AddBotToGroup(Creature* bot)\n+{\n+    ASSERT(GetBot(bot->GetGUID()));\n+\n+    Group* gr = _owner->GetGroup();\n+    if (gr)\n+    {\n+        if (gr->IsMember(bot->GetGUID()))\n+            return true;\n+\n+        if (gr->IsFull())\n+        {\n+            if (!gr->isRaidGroup()) //non-raid group is full\n+                gr->ConvertToRaid();\n+            else\n+                return false;\n+        }\n+    }\n+    else\n+    {\n+        gr = new Group;\n+        if (!gr->Create(_owner))\n+        {\n+            delete gr;\n+            return false;\n+        }\n+        sGroupMgr->AddGroup(gr);\n+    }\n+\n+    if (gr->AddMember(bot))\n+    {\n+        if (!bot->GetBotAI()->HasRole(BOT_ROLE_PARTY))\n+            bot->GetBotAI()->ToggleRole(BOT_ROLE_PARTY, true);\n+\n+        return true;\n+    }\n+\n+    return false;\n+}\n+\n+void BotMgr::RemoveBotFromBGQueue(Creature const* bot)\n+{\n+    for (auto i : NPCBots::index_array<uint32, PLAYER_MAX_BATTLEGROUND_QUEUES>)\n+    {\n+        if (BattlegroundQueueTypeId bgQueueTypeId = _owner->GetBattlegroundQueueTypeId(i))\n+            sBattlegroundMgr->GetBattlegroundQueue(bgQueueTypeId).RemovePlayer(bot->GetGUID(), true);\n+    }\n+}\n+\n+bool BotMgr::RemoveBotFromGroup(Creature* bot)\n+{\n+    ASSERT(GetBot(bot->GetGUID()));\n+\n+    Group* gr = _owner->GetGroup();\n+    if (!gr || !gr->IsMember(bot->GetGUID()))\n+        return false;\n+\n+    RemoveBotFromBGQueue(bot);\n+\n+    if (bot->GetBotAI()->HasRole(BOT_ROLE_PARTY) && !_owner->GetSession()->PlayerLogout())\n+        bot->GetBotAI()->ToggleRole(BOT_ROLE_PARTY, true);\n+\n+    //debug\n+    //if (gr->RemoveMember(bot->GetGUID()))\n+    //    BOT_LOG_ERROR(\"entities.player\", \"RemoveBotFromGroup(): bot %s removed from group\", bot->GetName().c_str());\n+    //else\n+    //    BOT_LOG_ERROR(\"entities.player\", \"RemoveBotFromGroup(): RemoveMember() returned FALSE on bot %s\", bot->GetName().c_str());\n+\n+    gr->RemoveMember(bot->GetGUID());\n+\n+    //if removed from group while in instance / bg then remove from world immediately\n+    if (bot->IsInWorld() && RestrictBots(bot, true))\n+        TeleportBot(bot, bot->GetMap(), bot);\n+\n+    return true;\n+}\n+\n+bool BotMgr::RemoveAllBotsFromGroup()\n+{\n+    for (auto const& [_, bot] : _bots)\n+        RemoveBotFromGroup(bot);\n+\n+    return true;\n+}\n+\n+uint8 BotMgr::BotClassByClassName(std::string_view className)\n+{\n+    static const std::map<std::string_view, uint8> BotClassNamesMap = {\n+        { \"warrior\"sv, BOT_CLASS_WARRIOR },\n+        { \"paladin\"sv, BOT_CLASS_PALADIN },\n+        { \"hunter\"sv, BOT_CLASS_HUNTER },\n+        { \"rogue\"sv, BOT_CLASS_ROGUE },\n+        { \"priest\"sv, BOT_CLASS_PRIEST },\n+        { \"deathknight\"sv, BOT_CLASS_DEATH_KNIGHT },\n+        { \"death_knight\"sv, BOT_CLASS_DEATH_KNIGHT },\n+        { \"shaman\"sv, BOT_CLASS_SHAMAN },\n+        { \"mage\"sv, BOT_CLASS_MAGE },\n+        { \"warlock\"sv, BOT_CLASS_WARLOCK },\n+        { \"druid\"sv, BOT_CLASS_DRUID },\n+        { \"blademaster\"sv, BOT_CLASS_BM },\n+        { \"blade_master\"sv, BOT_CLASS_BM },\n+        { \"sphynx\"sv, BOT_CLASS_SPHYNX },\n+        { \"obsidiandestroyer\"sv, BOT_CLASS_SPHYNX },\n+        { \"obsidian_destroyer\"sv, BOT_CLASS_SPHYNX },\n+        { \"destroyer\"sv, BOT_CLASS_SPHYNX },\n+        { \"archmage\"sv, BOT_CLASS_ARCHMAGE },\n+        { \"dreadlord\"sv, BOT_CLASS_DREADLORD },\n+        { \"spellbreaker\"sv, BOT_CLASS_SPELLBREAKER },\n+        { \"spell_breaker\"sv, BOT_CLASS_SPELLBREAKER },\n+        { \"darkranger\"sv, BOT_CLASS_DARK_RANGER },\n+        { \"dark_ranger\"sv, BOT_CLASS_DARK_RANGER },\n+        { \"necromancer\"sv, BOT_CLASS_NECROMANCER },\n+        { \"necro\"sv, BOT_CLASS_NECROMANCER },\n+        { \"seawitch\"sv, BOT_CLASS_SEA_WITCH },\n+        { \"sea_witch\"sv, BOT_CLASS_SEA_WITCH },\n+        { \"cryptlord\"sv, BOT_CLASS_CRYPT_LORD},\n+        { \"crypt_lord\"sv, BOT_CLASS_CRYPT_LORD }\n+    };\n+\n+    //std::transform(className.begin(), className.end(), className.begin(), std::tolower);\n+    decltype(BotClassNamesMap)::const_iterator ci = BotClassNamesMap.find(className);\n+    return ci != BotClassNamesMap.cend() ? ci->second : static_cast<uint8>(BOT_CLASS_NONE);\n+}\n+\n+uint8 BotMgr::GetBotPlayerClass(uint8 bot_class)\n+{\n+    if (bot_class >= BOT_CLASS_EX_START)\n+    {\n+        switch (bot_class)\n+        {\n+            case BOT_CLASS_BM:\n+                return BOT_CLASS_WARRIOR;\n+            case BOT_CLASS_SPHYNX:\n+                return BOT_CLASS_WARLOCK;\n+            case BOT_CLASS_ARCHMAGE:\n+                return BOT_CLASS_MAGE;\n+            case BOT_CLASS_DREADLORD:\n+                return BOT_CLASS_WARLOCK;\n+            case BOT_CLASS_SPELLBREAKER:\n+                return BOT_CLASS_PALADIN;\n+            case BOT_CLASS_DARK_RANGER:\n+                return BOT_CLASS_HUNTER;\n+            case BOT_CLASS_NECROMANCER:\n+                return BOT_CLASS_WARLOCK;\n+            case BOT_CLASS_SEA_WITCH:\n+                return BOT_CLASS_MAGE;\n+            case BOT_CLASS_CRYPT_LORD:\n+                return BOT_CLASS_WARRIOR;\n+            default:\n+                BOT_LOG_ERROR(\"npcbots\", \"GetPlayerClass: unknown Ex bot class {}!\", bot_class);\n+                return BOT_CLASS_PALADIN;\n+        }\n+    }\n+\n+    return bot_class;\n+}\n+\n+uint8 BotMgr::GetBotPlayerRace(uint8 bot_class, uint8 bot_race)\n+{\n+    if (bot_class >= BOT_CLASS_EX_START)\n+    {\n+        switch (bot_class)\n+        {\n+            case BOT_CLASS_BM:\n+                return RACE_ORC;\n+            case BOT_CLASS_SPHYNX:\n+                return RACE_UNDEAD_PLAYER;\n+            case BOT_CLASS_ARCHMAGE:\n+                return RACE_HUMAN;\n+            case BOT_CLASS_DREADLORD:\n+                return RACE_UNDEAD_PLAYER;\n+            case BOT_CLASS_SPELLBREAKER:\n+                return RACE_BLOODELF;\n+            case BOT_CLASS_DARK_RANGER:\n+                return RACE_BLOODELF;\n+            case BOT_CLASS_NECROMANCER:\n+                return RACE_HUMAN;\n+            case BOT_CLASS_SEA_WITCH:\n+                return RACE_TROLL;\n+            case BOT_CLASS_CRYPT_LORD:\n+                return RACE_UNDEAD_PLAYER;\n+            default:\n+                BOT_LOG_ERROR(\"npcbots\", \"GetBotPlayerRace: unknown Ex bot class {}!\", bot_class);\n+                return RACE_HUMAN;\n+        }\n+    }\n+\n+    return bot_race;\n+}\n+\n+uint8 BotMgr::GetBotPlayerClass(Creature const* bot)\n+{\n+    return GetBotPlayerClass(bot->GetBotAI()->GetBotClass());\n+}\n+\n+uint8 BotMgr::GetBotPlayerRace(Creature const* bot)\n+{\n+    return GetBotPlayerRace(bot->GetBotAI()->GetBotClass(), bot->GetRace());\n+}\n+\n+uint8 BotMgr::GetBotEquipmentClass(uint8 bot_class)\n+{\n+    if (bot_class >= BOT_CLASS_EX_START)\n+    {\n+        switch (bot_class)\n+        {\n+            case BOT_CLASS_BM:\n+                return BOT_CLASS_WARRIOR;\n+            case BOT_CLASS_SPHYNX:\n+                return BOT_CLASS_PALADIN;\n+            case BOT_CLASS_ARCHMAGE:\n+                return BOT_CLASS_MAGE;\n+            case BOT_CLASS_DREADLORD:\n+                return BOT_CLASS_PALADIN;\n+            case BOT_CLASS_SPELLBREAKER:\n+                return BOT_CLASS_PALADIN;\n+            case BOT_CLASS_DARK_RANGER:\n+                return BOT_CLASS_HUNTER;\n+            case BOT_CLASS_NECROMANCER:\n+                return BOT_CLASS_PALADIN;\n+            case BOT_CLASS_SEA_WITCH:\n+                return BOT_CLASS_MAGE;\n+            case BOT_CLASS_CRYPT_LORD:\n+                return BOT_CLASS_WARRIOR;\n+            default:\n+                BOT_LOG_ERROR(\"npcbots\", \"GetBotEquipmentClass: unknown Ex bot class {}!\", bot_class);\n+                return BOT_CLASS_PALADIN;\n+        }\n+    }\n+\n+    return BotMgr::GetBotPlayerClass(bot_class);\n+}\n+\n+BotStatMods BotMgr::GetBotStatModByUnitStat(Stats stat)\n+{\n+    BotStatMods bot_stat;\n+    switch (stat)\n+    {\n+        case STAT_STRENGTH:  bot_stat = BotStatMods::BOT_STAT_MOD_STRENGTH;  break;\n+        case STAT_AGILITY:   bot_stat = BotStatMods::BOT_STAT_MOD_AGILITY;   break;\n+        case STAT_STAMINA:   bot_stat = BotStatMods::BOT_STAT_MOD_STAMINA;   break;\n+        case STAT_INTELLECT: bot_stat = BotStatMods::BOT_STAT_MOD_INTELLECT; break;\n+        case STAT_SPIRIT:    bot_stat = BotStatMods::BOT_STAT_MOD_SPIRIT;    break;\n+        default: //should not happen\n+            bot_stat = BOT_STAT_MOD_HEALTH;\n+            break;\n+    }\n+    return bot_stat;\n+}\n+\n+std::string BotMgr::GetTargetIconString(uint8 icon_idx) const\n+{\n+    std::ostringstream ss;\n+    ss << \"|TInterface\\\\TargetingFrame\\\\UI-RaidTargetingIcon_\" << uint32(icon_idx + 1) << \":12|t\";\n+    if (size_t(icon_idx) < TARGET_ICON_NAMES_CACHE_SIZE)\n+        ss << _targetIconNamesCache[icon_idx];\n+\n+    return ss.str();\n+}\n+void BotMgr::UpdateTargetIconName(uint8 id, std::string_view name)\n+{\n+    if (id >= TARGET_ICON_NAMES_CACHE_SIZE)\n+        return;\n+\n+    _targetIconNamesCache[id] = name;\n+}\n+void BotMgr::ResetTargetIconNames()\n+{\n+    _targetIconNamesCache = {};\n+}\n+\n+void BotMgr::ReviveAllBots()\n+{\n+    for (auto const& [_, bot] : _bots)\n+        _reviveBot(bot);\n+}\n+\n+void BotMgr::SendBotCommandState(uint32 state)\n+{\n+    for (auto const& [_, bot] : _bots)\n+        bot->GetBotAI()->SetBotCommandState(state, true);\n+}\n+\n+void BotMgr::SendBotCommandStateRemove(uint32 state)\n+{\n+    for (auto const& [_, bot] : _bots)\n+        bot->GetBotAI()->RemoveBotCommandState(state);\n+}\n+\n+void BotMgr::SendBotAwaitState(uint8 state)\n+{\n+    for (auto const& [_, bot] : _bots)\n+        bot->GetBotAI()->SetBotAwaitState(state);\n+}\n+\n+void BotMgr::RecallAllBots(bool teleport)\n+{\n+    if (teleport)\n+    {\n+        _data->SetFlag(NPCBOT_MGR_FLAG_HIDE_BOTS);\n+        _quickrecall = true;\n+    }\n+    else\n+    {\n+        for (auto const& [_, bot] : _bots)\n+            if (bot->IsInWorld() && bot->IsAlive() && !bot_ai::CCed(bot, true))\n+                bot->GetMotionMaster()->MovePoint(_owner->GetMapId(), *_owner, FORCED_MOVEMENT_NONE, 0.0f, false);\n+    }\n+}\n+\n+void BotMgr::RecallBot(Creature* bot)\n+{\n+    ASSERT(GetBot(bot->GetGUID()));\n+\n+    if (bot->IsInWorld() && bot->IsAlive() && !bot_ai::CCed(bot, true))\n+        bot->GetMotionMaster()->MovePoint(_owner->GetMapId(), *_owner, FORCED_MOVEMENT_NONE, 0.0f, false);\n+}\n+\n+void BotMgr::KillAllBots()\n+{\n+    for (auto const& [_, bot] : _bots)\n+        KillBot(bot);\n+}\n+\n+void BotMgr::KillBot(Creature* bot) const\n+{\n+    ASSERT(GetBot(bot->GetGUID()));\n+\n+    if (bot->IsInWorld() && bot->IsAlive())\n+    {\n+        bot->setDeathState(DeathState::JustDied);\n+        bot->GetBotAI()->JustDied(bot);\n+        //bot->Kill(bot);\n+    }\n+}\n+\n+void BotMgr::SetBotsShouldUpdateStats()\n+{\n+    for (auto const& [_, bot] : _bots)\n+        bot->GetBotAI()->SetShouldUpdateStats();\n+}\n+\n+void BotMgr::UpdatePhaseForBots()\n+{\n+    for (auto const& [_, bot] : _bots)\n+    {\n+        bot->SetPhaseMask(_owner->GetPhaseMask(), bot->IsInWorld());\n+        if (bot->GetBotsPet())\n+            bot->GetBotsPet()->SetPhaseMask(_owner->GetPhaseMask(), bot->GetBotsPet()->IsInWorld());\n+    }\n+}\n+\n+void BotMgr::UpdatePvPForBots()\n+{\n+    for (auto const& [_, bot] : _bots)\n+    {\n+        bot->SetByteValue(UNIT_FIELD_BYTES_2, 1, _owner->GetByteValue(UNIT_FIELD_BYTES_2, 1));\n+        if (bot->GetBotsPet())\n+            bot->GetBotsPet()->SetByteValue(UNIT_FIELD_BYTES_2, 1, _owner->GetByteValue(UNIT_FIELD_BYTES_2, 1));\n+    }\n+}\n+\n+void BotMgr::BuildBotPartyMemberStatsPacket(ObjectGuid bot_guid, WorldPacket* data)\n+{\n+    Creature const* bot = BotDataMgr::FindBot(bot_guid.GetEntry());\n+    if (!bot)\n+    {\n+        *data << uint8(0);\n+        *data << bot_guid.WriteAsPacked();\n+        *data << uint32(GROUP_UPDATE_FLAG_STATUS);\n+        *data << uint16(MEMBER_STATUS_OFFLINE);\n+        return;\n+    }\n+\n+    Creature const* pet = nullptr; //bot->GetBotAI()->GetBotsPet();\n+    Powers powerType = bot->GetPowerType();\n+\n+    *data << uint8(0);                                       // only for SMSG_PARTY_MEMBER_STATS_FULL, probably arena/bg related\n+    *data << bot->GetPackGUID();\n+\n+    uint32 updateFlags = GROUP_UPDATE_FLAG_STATUS | GROUP_UPDATE_FLAG_CUR_HP | GROUP_UPDATE_FLAG_MAX_HP\n+                      | GROUP_UPDATE_FLAG_CUR_POWER | GROUP_UPDATE_FLAG_MAX_POWER | GROUP_UPDATE_FLAG_LEVEL\n+                      | GROUP_UPDATE_FLAG_ZONE | GROUP_UPDATE_FLAG_POSITION | GROUP_UPDATE_FLAG_AURAS\n+                      | GROUP_UPDATE_FLAG_PET_NAME | GROUP_UPDATE_FLAG_PET_MODEL_ID | GROUP_UPDATE_FLAG_PET_AURAS;\n+\n+    if (powerType != POWER_MANA)\n+        updateFlags |= GROUP_UPDATE_FLAG_POWER_TYPE;\n+\n+    if (pet)\n+        updateFlags |= GROUP_UPDATE_FLAG_PET_GUID | GROUP_UPDATE_FLAG_PET_CUR_HP | GROUP_UPDATE_FLAG_PET_MAX_HP\n+                    | GROUP_UPDATE_FLAG_PET_POWER_TYPE | GROUP_UPDATE_FLAG_PET_CUR_POWER | GROUP_UPDATE_FLAG_PET_MAX_POWER;\n+\n+    if (bot->GetVehicle())\n+        updateFlags |= GROUP_UPDATE_FLAG_VEHICLE_SEAT;\n+\n+    uint16 playerStatus = MEMBER_STATUS_ONLINE;\n+    if (bot->IsPvP())\n+        playerStatus |= MEMBER_STATUS_PVP;\n+\n+    if (!bot->IsAlive())\n+        playerStatus |= MEMBER_STATUS_DEAD;\n+\n+    if (bot->IsFFAPvP())\n+        playerStatus |= MEMBER_STATUS_PVP_FFA;\n+\n+    *data << uint32(updateFlags);\n+    *data << uint16(playerStatus);                           // GROUP_UPDATE_FLAG_STATUS\n+    *data << uint32(bot->GetHealth());                    // GROUP_UPDATE_FLAG_CUR_HP\n+    *data << uint32(bot->GetMaxHealth());                 // GROUP_UPDATE_FLAG_MAX_HP\n+    if (updateFlags & GROUP_UPDATE_FLAG_POWER_TYPE)\n+        *data << uint8(powerType);\n+\n+    *data << uint16(bot->GetPower(powerType));            // GROUP_UPDATE_FLAG_CUR_POWER\n+    *data << uint16(bot->GetMaxPower(powerType));         // GROUP_UPDATE_FLAG_MAX_POWER\n+    *data << uint16(bot->GetLevel());                     // GROUP_UPDATE_FLAG_LEVEL\n+    *data << uint16(bot->GetZoneId());                    // GROUP_UPDATE_FLAG_ZONE\n+    *data << uint16(bot->GetPositionX());                 // GROUP_UPDATE_FLAG_POSITION\n+    *data << uint16(bot->GetPositionY());                 // GROUP_UPDATE_FLAG_POSITION\n+\n+    uint64 auraMask = 0;\n+    size_t maskPos = data->wpos();\n+    *data << uint64(auraMask);                               // placeholder\n+    for (auto i : NPCBots::index_array<uint8, MAX_AURAS_GROUP_UPDATE>)\n+    {\n+        if (AuraApplication const* aurApp = const_cast<Creature*>(bot)->GetVisibleAura(i))\n+        {\n+            auraMask |= uint64(1) << i;\n+            *data << uint32(aurApp->GetBase()->GetId());\n+            *data << uint8(aurApp->GetFlags());\n+        }\n+    }\n+\n+    data->put<uint64>(maskPos, auraMask);                    // GROUP_UPDATE_FLAG_AURAS\n+\n+    if (updateFlags & GROUP_UPDATE_FLAG_PET_GUID)\n+        *data << pet->GetGUID();\n+\n+    *data << std::string(pet ? pet->GetName() : \"\");         // GROUP_UPDATE_FLAG_PET_NAME\n+    *data << uint16(pet ? pet->GetDisplayId() : 0);          // GROUP_UPDATE_FLAG_PET_MODEL_ID\n+\n+    if (updateFlags & GROUP_UPDATE_FLAG_PET_CUR_HP)\n+        *data << uint32(pet->GetHealth());\n+\n+    if (updateFlags & GROUP_UPDATE_FLAG_PET_MAX_HP)\n+        *data << uint32(pet->GetMaxHealth());\n+\n+    if (updateFlags & GROUP_UPDATE_FLAG_PET_POWER_TYPE)\n+        *data << (uint8)pet->GetPowerType();\n+\n+    if (updateFlags & GROUP_UPDATE_FLAG_PET_CUR_POWER)\n+        *data << uint16(pet->GetPower(pet->GetPowerType()));\n+\n+    if (updateFlags & GROUP_UPDATE_FLAG_PET_MAX_POWER)\n+        *data << uint16(pet->GetMaxPower(pet->GetPowerType()));\n+\n+    uint64 petAuraMask = 0;\n+    maskPos = data->wpos();\n+    *data << uint64(petAuraMask);                            // placeholder\n+    if (pet)\n+    {\n+        for (auto i : NPCBots::index_array<uint8, MAX_AURAS_GROUP_UPDATE>)\n+        {\n+            if (AuraApplication const* aurApp = const_cast<Creature*>(pet)->GetVisibleAura(i))\n+            {\n+                petAuraMask |= uint64(1) << i;\n+                *data << uint32(aurApp->GetBase()->GetId());\n+                *data << uint8(aurApp->GetFlags());\n+            }\n+        }\n+    }\n+\n+    data->put<uint64>(maskPos, petAuraMask);                 // GROUP_UPDATE_FLAG_PET_AURAS\n+\n+    if (updateFlags & GROUP_UPDATE_FLAG_VEHICLE_SEAT)\n+        *data << uint32(bot->GetVehicle()->GetVehicleInfo()->m_seatID[bot->m_movementInfo.transport.seat]);\n+}\n+\n+void BotMgr::BuildBotPartyMemberStatsChangedPacket(Creature const* bot, WorldPacket* data)\n+{\n+    uint32 mask = bot->GetBotAI()->GetGroupUpdateFlag();\n+\n+    if (mask == GROUP_UPDATE_FLAG_NONE)\n+        return;\n+\n+    if (mask & GROUP_UPDATE_FLAG_POWER_TYPE)                // if update power type, update current/max power also\n+        mask |= (GROUP_UPDATE_FLAG_CUR_POWER | GROUP_UPDATE_FLAG_MAX_POWER);\n+\n+    if (mask & GROUP_UPDATE_FLAG_PET_POWER_TYPE)            // same for pets\n+        mask |= (GROUP_UPDATE_FLAG_PET_CUR_POWER | GROUP_UPDATE_FLAG_PET_MAX_POWER);\n+\n+    uint32 byteCount = 0;\n+    uint8 flags_count = GROUP_UPDATE_FLAGS_COUNT;\n+    for (uint8 i = 1; i < flags_count; ++i)\n+        if (mask & (1u << i))\n+            byteCount += GroupUpdateLength[i];\n+\n+    data->Initialize(SMSG_PARTY_MEMBER_STATS, size_t(8 + 4 + byteCount));\n+    *data << bot->GetPackGUID();\n+    *data << uint32(mask);\n+\n+    if (mask & GROUP_UPDATE_FLAG_STATUS)\n+    {\n+        uint16 playerStatus = MEMBER_STATUS_ONLINE;\n+        if (bot->IsPvP())\n+            playerStatus |= MEMBER_STATUS_PVP;\n+\n+        if (!bot->IsAlive())\n+            playerStatus |= MEMBER_STATUS_DEAD;\n+\n+        if (bot->IsFFAPvP())\n+            playerStatus |= MEMBER_STATUS_PVP_FFA;\n+\n+        *data << uint16(playerStatus);\n+    }\n+\n+    if (mask & GROUP_UPDATE_FLAG_CUR_HP)\n+        *data << uint32(bot->GetHealth());\n+\n+    if (mask & GROUP_UPDATE_FLAG_MAX_HP)\n+        *data << uint32(bot->GetMaxHealth());\n+\n+    Powers powerType = bot->GetPowerType();\n+    if (mask & GROUP_UPDATE_FLAG_POWER_TYPE)\n+        *data << uint8(powerType);\n+\n+    if (mask & GROUP_UPDATE_FLAG_CUR_POWER)\n+        *data << uint16(bot->GetPower(powerType));\n+\n+    if (mask & GROUP_UPDATE_FLAG_MAX_POWER)\n+        *data << uint16(bot->GetMaxPower(powerType));\n+\n+    if (mask & GROUP_UPDATE_FLAG_LEVEL)\n+        *data << uint16(bot->GetLevel());\n+\n+    if (mask & GROUP_UPDATE_FLAG_ZONE)\n+        *data << uint16(bot->GetZoneId());\n+\n+    if (mask & GROUP_UPDATE_FLAG_POSITION)\n+    {\n+        *data << uint16(bot->GetPositionX());\n+        *data << uint16(bot->GetPositionY());\n+    }\n+\n+    if (mask & GROUP_UPDATE_FLAG_AURAS)\n+    {\n+        uint64 auramask = GetBotAuraUpdateMaskForRaid(bot);\n+        *data << uint64(auramask);\n+        for (auto i : NPCBots::index_array<uint8, MAX_AURAS_GROUP_UPDATE>)\n+        {\n+            if (auramask & (uint64(1) << i))\n+            {\n+                AuraApplication const* aurApp = const_cast<Creature*>(bot)->GetVisibleAura(i);\n+                *data << uint32(aurApp ? aurApp->GetBase()->GetId() : 0);\n+                *data << uint8(1);\n+            }\n+        }\n+    }\n+\n+    Creature const* pet = nullptr; //bot->GetBotAI()->GetBotsPet();\n+    if (mask & GROUP_UPDATE_FLAG_PET_GUID)\n+    {\n+        if (pet)\n+            *data << pet->GetGUID();\n+        else\n+            *data << (uint64) 0;\n+    }\n+\n+    if (mask & GROUP_UPDATE_FLAG_PET_NAME)\n+    {\n+        if (pet)\n+            *data << pet->GetName();\n+        else\n+            *data << uint8(0);\n+    }\n+\n+    if (mask & GROUP_UPDATE_FLAG_PET_MODEL_ID)\n+    {\n+        if (pet)\n+            *data << uint16(pet->GetDisplayId());\n+        else\n+            *data << uint16(0);\n+    }\n+\n+    if (mask & GROUP_UPDATE_FLAG_PET_CUR_HP)\n+    {\n+        if (pet)\n+            *data << uint32(pet->GetHealth());\n+        else\n+            *data << uint32(0);\n+    }\n+\n+    if (mask & GROUP_UPDATE_FLAG_PET_MAX_HP)\n+    {\n+        if (pet)\n+            *data << uint32(pet->GetMaxHealth());\n+        else\n+            *data << uint32(0);\n+    }\n+\n+    if (mask & GROUP_UPDATE_FLAG_PET_POWER_TYPE)\n+    {\n+        if (pet)\n+            *data << uint8(pet->GetPowerType());\n+        else\n+            *data << uint8(0);\n+    }\n+\n+    if (mask & GROUP_UPDATE_FLAG_PET_CUR_POWER)\n+    {\n+        if (pet)\n+            *data << uint16(pet->GetPower(pet->GetPowerType()));\n+        else\n+            *data << uint16(0);\n+    }\n+\n+    if (mask & GROUP_UPDATE_FLAG_PET_MAX_POWER)\n+    {\n+        if (pet)\n+            *data << uint16(pet->GetMaxPower(pet->GetPowerType()));\n+        else\n+            *data << uint16(0);\n+    }\n+\n+    if (mask & GROUP_UPDATE_FLAG_PET_AURAS)\n+    {\n+        if (pet)\n+        {\n+            uint64 auramask = GetBotPetAuraUpdateMaskForRaid(pet);\n+            *data << uint64(auramask);\n+            for (auto i : NPCBots::index_array<uint8, MAX_AURAS_GROUP_UPDATE>)\n+            {\n+                if (auramask & (uint64(1) << i))\n+                {\n+                    AuraApplication const* aurApp = const_cast<Creature*>(pet)->GetVisibleAura(i);\n+                    *data << uint32(aurApp ? aurApp->GetBase()->GetId() : 0);\n+                    *data << uint8(aurApp ? aurApp->GetFlags() : 0);\n+                }\n+            }\n+        }\n+        else\n+            *data << uint64(0);\n+    }\n+\n+    if (mask & GROUP_UPDATE_FLAG_VEHICLE_SEAT)\n+    {\n+        if (Vehicle* veh = bot->GetVehicle())\n+            *data << uint32(veh->GetVehicleInfo()->m_seatID[bot->m_movementInfo.transport.seat]);\n+        else\n+            *data << uint32(0);\n+    }\n+}\n+\n+//uint32 BotMgr::GetBotGroupUpdateFlag(Creature const* bot)\n+//{\n+//    bot->GetBotAI()->GetGroupUpdateFlags\n+//}\n+void BotMgr::SetBotGroupUpdateFlag(Creature const* bot, uint32 flag)\n+{\n+    bot->GetBotAI()->SetGroupUpdateFlag(flag);\n+}\n+uint64 BotMgr::GetBotAuraUpdateMaskForRaid(Creature const* bot)\n+{\n+    return bot->GetBotAI()->GetAuraUpdateMaskForRaid();\n+}\n+void BotMgr::SetBotAuraUpdateMaskForRaid(Creature const* bot, uint8 slot)\n+{\n+    bot->GetBotAI()->SetAuraUpdateMaskForRaid(slot);\n+}\n+void BotMgr::ResetBotAuraUpdateMaskForRaid(Creature const* bot)\n+{\n+    bot->GetBotAI()->ResetAuraUpdateMaskForRaid();\n+}\n+uint64 BotMgr::GetBotPetAuraUpdateMaskForRaid(Creature const* botpet)\n+{\n+    return botpet->GetBotPetAI()->GetAuraUpdateMaskForRaid();\n+}\n+void BotMgr::SetBotPetAuraUpdateMaskForRaid(Creature const* botpet, uint8 slot)\n+{\n+    botpet->GetBotPetAI()->SetAuraUpdateMaskForRaid(slot);\n+}\n+void BotMgr::ResetBotPetAuraUpdateMaskForRaid(Creature const* botpet)\n+{\n+    botpet->GetBotPetAI()->ResetAuraUpdateMaskForRaid();\n+}\n+\n+uint8 BotMgr::GetBotFollowDist() const\n+{\n+    return _data->dist_follow;\n+}\n+void BotMgr::SetBotFollowDist(uint8 dist)\n+{\n+    _data->dist_follow = dist;\n+}\n+\n+void BotMgr::_setBotExactAttackRange(uint8 exactRange)\n+{\n+    _data->dist_attack = exactRange;\n+}\n+\n+uint8 BotMgr::GetBotExactAttackRange() const\n+{\n+    return _data->dist_attack;\n+}\n+uint8 BotMgr::GetBotAttackRangeMode() const\n+{\n+    return _data->attack_range_mode;\n+}\n+void BotMgr::SetBotAttackRangeMode(uint8 mode, uint8 exactRange)\n+{\n+    _data->attack_range_mode = mode; _setBotExactAttackRange(exactRange);\n+}\n+\n+uint8 BotMgr::GetBotAttackAngleMode() const\n+{\n+    return _data->attack_angle_mode;\n+}\n+void BotMgr::SetBotAttackAngleMode(uint8 mode)\n+{\n+    _data->attack_angle_mode = mode;\n+}\n+\n+bool BotMgr::GetBotAllowCombatPositioning() const\n+{\n+    return !_data->HasFlag(NPCBOT_MGR_FLAG_DISABLE_COMBAT_POSITIONING);\n+}\n+void BotMgr::SetBotAllowCombatPositioning(bool allow)\n+{\n+    allow ? _data->RemoveFlag(NPCBOT_MGR_FLAG_DISABLE_COMBAT_POSITIONING) : _data->SetFlag(NPCBOT_MGR_FLAG_DISABLE_COMBAT_POSITIONING);\n+}\n+\n+bool BotMgr::GetBotsHidden() const\n+{\n+    return _data->HasFlag(NPCBOT_MGR_FLAG_HIDE_BOTS);\n+}\n+void BotMgr::SetBotsHidden(bool hidden)\n+{\n+    hidden ? _data->SetFlag(NPCBOT_MGR_FLAG_HIDE_BOTS) : _data->RemoveFlag(NPCBOT_MGR_FLAG_HIDE_BOTS);\n+}\n+\n+uint32 BotMgr::GetEngageDelayDPS() const\n+{\n+    return _data->engage_delay_dps;\n+}\n+uint32 BotMgr::GetEngageDelayHeal() const { return _data->engage_delay_heal;\n+}\n+void BotMgr::SetEngageDelayDPS(uint32 delay)\n+{\n+    _data->engage_delay_dps = delay;\n+}\n+void BotMgr::SetEngageDelayHeal(uint32 delay)\n+{\n+    _data->engage_delay_heal = delay;\n+}\n+\n+void BotMgr::PropagateEngageTimers() const\n+{\n+    uint32 delay_dps = GetEngageDelayDPS();\n+    uint32 delay_heal = GetEngageDelayHeal();\n+\n+    if (!delay_dps && !delay_heal)\n+        return;\n+\n+    for (auto const& [_, bot] : _bots)\n+    {\n+        if (bot->GetBotAI()->IsTank())\n+            continue;\n+\n+        bool is_heal = bot->GetBotAI()->HasRole(BOT_ROLE_HEAL);\n+        bool is_dps= bot->GetBotAI()->HasRole(BOT_ROLE_DPS);\n+        uint32 delay = (is_heal && is_dps) ? std::max<uint32>(delay_dps, delay_heal) : is_heal ? delay_heal : is_dps ? delay_dps : 0;\n+\n+        bot->GetBotAI()->ResetEngageTimer(delay);\n+    }\n+}\n+\n+void BotMgr::TrackDamage(Unit const* u, uint32 damage)\n+{\n+    _dpstracker->TrackDamage(u, damage);\n+}\n+\n+uint32 BotMgr::GetDPSTaken(Unit const* u) const\n+{\n+    return _dpstracker->GetDPSTaken(u->GetGUID());\n+}\n+\n+int32 BotMgr::GetHPSTaken(Unit const* unit) const\n+{\n+    if (!HaveBot())\n+        return 0;\n+\n+    std::list<Unit*> unitList;\n+    Group const* gr = _owner->GetGroup();\n+    if (!gr)\n+    {\n+        if (_owner->HasUnitState(UNIT_STATE_CASTING))\n+            unitList.push_back(_owner);\n+        for (auto const& [_, bot] : _bots)\n+            if (bot->GetTarget() == unit->GetGUID() && bot->HasUnitState(UNIT_STATE_CASTING))\n+                unitList.push_back(bot);\n+    }\n+    else\n+    {\n+        bool Bots = false;\n+        for (GroupReference const* itr = gr->GetFirstMember(); itr != nullptr; itr = itr->next())\n+        {\n+            Player* player = itr->GetSource();\n+            if (player == nullptr) continue;\n+            if (_owner->GetMap() != player->FindMap()) continue;\n+            if (!Bots)\n+                Bots = true;\n+            if (player->HasUnitState(UNIT_STATE_CASTING))\n+                unitList.push_back(player);\n+        }\n+        if (Bots)\n+        {\n+            for (GroupReference const* gitr = gr->GetFirstMember(); gitr != nullptr; gitr = gitr->next())\n+            {\n+                if (gitr->GetSource() == nullptr) continue;\n+                if (_owner->GetMap() != gitr->GetSource()->FindMap()) continue;\n+\n+                if (gitr->GetSource()->HaveBot())\n+                {\n+                    for (auto const& [_, bot] : *gitr->GetSource()->GetBotMgr()->GetBotMap())\n+                        if (bot->GetTarget() == unit->GetGUID() && bot->HasUnitState(UNIT_STATE_CASTING))\n+                            unitList.push_back(bot);\n+                }\n+            }\n+        }\n+    }\n+\n+    int32 amount = 0;\n+    for (Unit* u : unitList)\n+    {\n+        for (uint8 i = CURRENT_FIRST_NON_MELEE_SPELL; i != CURRENT_AUTOREPEAT_SPELL; ++i)\n+        {\n+            Spell const* spell = u->GetCurrentSpell(CurrentSpellTypes(i));\n+            if (!spell)\n+                continue;\n+\n+            ObjectGuid targetGuid = spell->m_targets.GetObjectTargetGUID();\n+            if (!targetGuid || !targetGuid.IsUnit())\n+                continue;\n+\n+            if (targetGuid != unit->GetGUID())\n+            {\n+                if (!gr || !gr->IsMember(unit->GetGUID()))\n+                    continue;\n+            }\n+\n+            SpellInfo const* spellInfo = spell->GetSpellInfo();\n+\n+            for (auto j : NPCBots::index_array<uint8, MAX_SPELL_EFFECTS>)\n+            {\n+                if (spellInfo->Effects[j].Effect != SPELL_EFFECT_HEAL)\n+                    continue;\n+\n+                if (targetGuid != unit->GetGUID())\n+                {\n+                    if (spellInfo->Effects[j].TargetA.GetSelectionCategory() != TARGET_SELECT_CATEGORY_AREA)\n+                        continue;\n+\n+                    //Targets t = spellInfo->Effects[j].TargetA.GetTarget();\n+                    //non-existing case\n+                    //if (t == TARGET_UNIT_CASTER_AREA_PARTY && !gr->SameSubGroup(u->GetGUID(), unit->GetGUID()))\n+                    //    continue;\n+                    Targets t = spellInfo->Effects[j].TargetB.GetTarget();\n+                    if (t == TARGET_UNIT_LASTTARGET_AREA_PARTY &&\n+                        !(GetBot(unit->GetGUID()) && GetBot(targetGuid)) &&\n+                        !gr->SameSubGroup(unit->GetGUID(), targetGuid))\n+                        continue;\n+                }\n+\n+                int32 healing = u->SpellHealingBonusDone(const_cast<Unit*>(unit), spellInfo, spellInfo->Effects[0].CalcValue(u), HEAL, 0);\n+                healing = const_cast<Unit*>(unit)->SpellHealingBonusTaken(u, spellInfo, healing, HEAL);\n+\n+                if (i == CURRENT_CHANNELED_SPELL)\n+                    amount += int32(healing / (spellInfo->Effects[j].Amplitude * 0.001f));\n+                else\n+                    amount += int32(healing / (std::max<int32>(spell->GetTimer(), 1000) * 0.001f));\n+\n+                //BOT_LOG_ERROR(\"entities.player\", \"BotMgr:pendingHeals: found %s's %s on %s in %u (%i, total %i)\",\n+                //    u->GetName().c_str(), spellInfo->SpellName[0], target->GetName().c_str(), pheal->delay, healing, pheal->amount);\n+            }\n+\n+            break;\n+        }\n+    }\n+\n+    //HoTs\n+    for (AuraEffect const* aeff : unit->GetAuraEffectsByType(SPELL_AURA_PERIODIC_HEAL))\n+        amount += int32(aeff->GetAmount() / (aeff->GetAmplitude() * 0.001f));\n+\n+    //if (amount != 0)\n+    //    BOT_LOG_ERROR(\"entities.player\", \"BotMgr:GetHPSTaken(): %s got %i)\", unit->GetName().c_str(), amount);\n+\n+    return amount;\n+}\n+\n+void BotMgr::OnBotWandererKilled(Creature const* bot, Player* looter)\n+{\n+    bot->GetBotAI()->SpawnKillReward(looter);\n+}\n+\n+void BotMgr::OnBotWandererKilled(GameObject* go)\n+{\n+    if (go->GetEntry() == GO_BOT_MONEY_BAG && go->GetSpellId() > go->GetEntry())\n+    {\n+        uint32 bot_id = go->GetSpellId() - GO_BOT_MONEY_BAG;\n+        if (Creature const* bot = BotDataMgr::FindBot(bot_id))\n+            bot->GetBotAI()->FillKillReward(go);\n+    }\n+}\n+\n+void BotMgr::OnBotKilled(Creature const* bot, Unit* attacker/* = nullptr*/)\n+{\n+    bot->GetBotAI()->OnDeath(attacker);\n+}\n+\n+void BotMgr::OnBotSpellInterrupt(Unit const* caster, CurrentSpellTypes spellType)\n+{\n+    if (spellType == CURRENT_AUTOREPEAT_SPELL)\n+    {\n+        WorldPacket data(SMSG_CANCEL_AUTO_REPEAT, caster->GetPackGUID().size());\n+        data << caster->GetPackGUID();\n+        caster->SendMessageToSet(&data, true);\n+    }\n+}\n+\n+void BotMgr::OnBotSpellGo(Unit const* caster, Spell const* spell, bool ok)\n+{\n+    if (caster->ToCreature()->GetBotAI())\n+        caster->ToCreature()->GetBotAI()->OnBotSpellGo(spell, ok);\n+    else if (caster->ToCreature()->GetBotPetAI())\n+        caster->ToCreature()->GetBotPetAI()->OnBotPetSpellGo(spell, ok);\n+}\n+\n+void BotMgr::OnBotOwnerSpellGo(Unit const* caster, Spell const* spell, bool ok)\n+{\n+    for (auto const& [_, bot] : *caster->ToPlayer()->GetBotMgr()->GetBotMap())\n+    {\n+        if (!bot || !bot->IsInWorld() || !bot->IsAlive())\n+            continue;\n+\n+        bot->GetBotAI()->OnBotOwnerSpellGo(spell, ok);\n+        //if (Creature const* botpet = bot->GetBotsPet())\n+        //    botpet->GetBotAI()->OnBotPetOwnerSpellGo(spell, ok);\n+    }\n+}\n+\n+void BotMgr::OnBotChannelFinish(Unit const* caster, Spell const* spell)\n+{\n+    if (caster->ToCreature()->GetBotAI())\n+        caster->ToCreature()->GetBotAI()->OnBotChannelFinish(spell);\n+    //else if (caster->ToCreature()->GetBotPetAI())\n+    //    caster->ToCreature()->GetBotPetAI()->OnBotPetChannelFinish(spell);\n+}\n+\n+void BotMgr::OnVehicleSpellGo(Unit const* caster, Spell const* spell, bool ok)\n+{\n+    if (caster->GetCharmerGUID().IsPlayer())\n+    {\n+        Unit const* owner = caster->GetCharmer();\n+        if (owner && owner->ToPlayer()->HaveBot())\n+        {\n+            for (auto const& [_, bot] : *owner->ToPlayer()->GetBotMgr()->GetBotMap())\n+            {\n+                if (bot)\n+                {\n+                    bot->GetBotAI()->OnBotOwnerSpellGo(spell, ok);\n+                    //if (Creature const* botpet = bot->GetBotsPet())\n+                    //    botpet->GetBotAI()->OnBotPetOwnerSpellGo(spell, ok);\n+                }\n+            }\n+        }\n+    }\n+    else if (caster->GetCharmerGUID().IsCreature())\n+    {\n+        Unit const* bot = caster->GetCharmer();\n+        if (bot->ToCreature()->GetBotAI())\n+            bot->ToCreature()->GetBotAI()->OnBotSpellGo(spell, ok);\n+    }\n+}\n+\n+void BotMgr::OnVehicleAttackedBy(Unit* attacker, Unit const* victim)\n+{\n+    Unit const* owner = victim->GetCharmer();\n+    if (victim->GetCharmerGUID().IsPlayer())\n+        owner = victim->GetCharmer();\n+    else if (victim->GetCharmerGUID().IsCreature())\n+        if (Unit const* bot = victim->GetCharmer())\n+            owner = bot->ToCreature()->GetBotOwner();\n+\n+    if (owner && owner->IsPlayer() && owner->ToPlayer()->HaveBot())\n+    {\n+        for (auto const& [_, bot] : *owner->ToPlayer()->GetBotMgr()->GetBotMap())\n+            if (bot)\n+                bot->GetBotAI()->OnOwnerVehicleDamagedBy(attacker);\n+    }\n+}\n+\n+void BotMgr::OnBotDamageTaken(Unit* attacker, Unit* victim, uint32 damage, CleanDamage const* cleanDamage, DamageEffectType damagetype, SpellInfo const* spellInfo)\n+{\n+    victim->ToCreature()->GetBotAI()->OnBotDamageTaken(attacker, damage, cleanDamage , damagetype, spellInfo);\n+}\n+\n+void BotMgr::OnBotDamageDealt(Unit* attacker, Unit* victim, uint32 damage, CleanDamage const* cleanDamage, DamageEffectType damagetype, SpellInfo const* spellInfo)\n+{\n+    attacker->ToCreature()->GetBotAI()->OnBotDamageDealt(victim, damage, cleanDamage, damagetype, spellInfo);\n+}\n+\n+void BotMgr::OnBotDispelDealt(Unit* dispeller, Unit* dispelled, uint8 num)\n+{\n+    dispeller->ToCreature()->GetBotAI()->OnBotDispelDealt(dispelled, num);\n+}\n+\n+void BotMgr::OnBotEnterVehicle(Creature const* passenger, Vehicle const* vehicle)\n+{\n+    passenger->GetBotAI()->OnBotEnterVehicle(vehicle);\n+}\n+\n+void BotMgr::OnBotExitVehicle(Creature const* passenger, Vehicle const* vehicle)\n+{\n+    passenger->GetBotAI()->OnBotExitVehicle(vehicle);\n+}\n+\n+void BotMgr::OnBotOwnerEnterVehicle(Player const* passenger, Vehicle const* vehicle)\n+{\n+    for (auto const& [_, bot] : *passenger->GetBotMgr()->GetBotMap())\n+        if (bot && bot->IsInWorld() && bot->IsAlive())\n+            bot->GetBotAI()->OnBotOwnerEnterVehicle(vehicle);\n+}\n+\n+void BotMgr::OnBotOwnerExitVehicle(Player const* passenger, Vehicle const* vehicle)\n+{\n+    for (auto const& [_, bot] : *passenger->GetBotMgr()->GetBotMap())\n+        if (bot && bot->IsInWorld() && bot->IsAlive())\n+            bot->GetBotAI()->OnBotOwnerExitVehicle(vehicle);\n+}\n+\n+void BotMgr::OnBotPartyEngage(Player const* owner)\n+{\n+    Group const* gr = owner->GetGroup();\n+    if (gr)\n+    {\n+        std::vector<Player const*> affectedPlayers;\n+        for (GroupReference const* itr = gr->GetFirstMember(); itr != nullptr; itr = itr->next())\n+        {\n+            Player const* player = itr->GetSource();\n+            if (!player || owner->GetMap() != player->FindMap() ||\n+                player->GetDistance(owner) > World::GetMaxVisibleDistanceOnContinents() ||\n+                !player->HaveBot())\n+                continue;\n+\n+            if (player->GetBotMgr()->IsPartyInCombat(false))\n+                return;\n+\n+            affectedPlayers.push_back(player);\n+        }\n+        for (Player const* p : affectedPlayers)\n+            p->GetBotMgr()->PropagateEngageTimers();\n+    }\n+    else\n+        owner->GetBotMgr()->PropagateEngageTimers();\n+}\n+\n+void BotMgr::OnBotAttackStop(Creature const* bot, Unit const* target)\n+{\n+    if (bot->IsNPCBot())\n+        bot->GetBotAI()->OnAttackStop(target);\n+    else if (bot->IsNPCBotPet())\n+        bot->GetBotPetAI()->OnAttackStop(target);\n+}\n+\n+void BotMgr::ApplyBotEffectMods(Unit const* caster, SpellInfo const* spellInfo, uint8 effIndex, float& value)\n+{\n+    caster->ToCreature()->GetBotAI()->ApplyBotEffectMods(spellInfo, effIndex, value);\n+}\n+\n+void BotMgr::ApplyBotThreatMods(Unit const* attacker, SpellInfo const* spellInfo, float& threat)\n+{\n+    attacker->ToCreature()->GetBotAI()->ApplyBotThreatMods(spellInfo, threat);\n+}\n+\n+void BotMgr::ApplyBotEffectValueMultiplierMods(Unit const* caster, SpellInfo const* spellInfo, SpellEffIndex effIndex, float& multiplier)\n+{\n+    caster->ToCreature()->GetBotAI()->ApplyBotEffectValueMultiplierMods(spellInfo, effIndex, multiplier);\n+}\n+\n+float BotMgr::GetBotDamageTakenMod(Creature const* bot, bool magic)\n+{\n+    return bot->GetBotAI()->GetBotDamageTakenMod(magic);\n+}\n+\n+int32 BotMgr::GetBotStat(Creature const* bot, BotStatMods stat)\n+{\n+    return bot->GetBotAI()->GetTotalBotStat(stat);\n+}\n+\n+int32 BotMgr::GetBotStat(Creature const* bot, Stats stat)\n+{\n+    return GetBotStat(bot, GetBotStatModByUnitStat(stat));\n+}\n+\n+float BotMgr::GetBotResilience(Creature const* botOrPet)\n+{\n+    if (botOrPet->IsNPCBot())\n+        return botOrPet->GetBotAI()->GetBotResilience();\n+\n+    return botOrPet->GetBotPetAI()->GetPetsOwner()->GetBotAI()->GetBotResilience();\n+}\n+\n+std::vector<Unit*> BotMgr::GetAllGroupMembers(Group const* group)\n+{\n+    std::vector<Unit*> group_members;\n+    if (group)\n+    {\n+        group_members.reserve(group->GetMembersCount());\n+        for (GroupReference const* ref = group->GetFirstMember(); ref != nullptr; ref = ref->next())\n+        {\n+            if (Player* pl = ref->GetSource())\n+                group_members.push_back(pl);\n+        }\n+        for (GroupBotReference const* ref = group->GetFirstBotMember(); ref != nullptr; ref = ref->next())\n+        {\n+            if (Creature* cr = ref->GetSource())\n+                group_members.push_back(cr);\n+        }\n+    }\n+\n+    return group_members;\n+}\n+std::vector<Unit*> BotMgr::GetAllGroupMembers(Unit const* source)\n+{\n+    Group const* group = (source->IsNPCBot() && source->ToCreature()->GetBotAI()) ? source->ToCreature()->GetBotAI()->GetGroup() :\n+        source->IsPlayer() ? source->ToPlayer()->GetGroup() : nullptr;\n+    return GetAllGroupMembers(group);\n+}\n+\n+void BotMgr::InviteBotToBG(ObjectGuid botguid, GroupQueueInfo* ginfo, Battleground* bg)\n+{\n+    Creature const* bot = BotDataMgr::FindBot(botguid.GetEntry());\n+    ASSERT(bot);\n+\n+    bg->IncreaseInvitedCount(ginfo->teamId);\n+    //BOT_LOG_INFO(\"npcbots\", \"Battleground: invited NPCBot %u to BG instance %u bgtype %u '%s'\",\n+    //    botguid.GetEntry(), bg->GetInstanceID(), bg->GetTypeID(), bg->GetName().c_str());\n+}\n+\n+bool BotMgr::IsBotInAreaTriggerRadius(Creature const* bot, AreaTrigger const* trigger)\n+{\n+    if (!trigger || !bot->IsInWorld() || bot->GetMap()->GetId() != trigger->map)\n+        return false;\n+\n+    if (trigger->radius > 0.f)\n+    {\n+        // if we have radius check it\n+        float dist = bot->GetDistance(trigger->x, trigger->y, trigger->z);\n+        if (dist > trigger->radius)\n+            return false;\n+    }\n+    else\n+    {\n+        Position center(trigger->x, trigger->y, trigger->z, trigger->orientation);\n+        if (!bot->IsWithinBox(center, trigger->length / 2.f, trigger->width / 2.f, trigger->height / 2.f))\n+            return false;\n+    }\n+\n+    return true;\n+}\n+\n+BotMgr::delayed_teleport_mutex_type* BotMgr::_getTpLock()\n+{\n+    static BotMgr::delayed_teleport_mutex_type _lock;\n+    return &_lock;\n+}\n+void BotMgr::AddDelayedTeleportCallback(delayed_teleport_callback_type&& callback)\n+{\n+    delayed_teleport_lock_type lock(*_getTpLock());\n+    delayed_bot_teleports.push_back(std::forward<delayed_teleport_callback_type>(callback));\n+}\n+void BotMgr::HandleDelayedTeleports()\n+{\n+    for (auto& func : delayed_bot_teleports)\n+        func();\n+    delayed_bot_teleports.clear();\n+}\n+\n+#ifdef _MSC_VER\n+# pragma warning(pop)\n+#endif\ndiff --git a/src/server/game/AI/NpcBots/botmgr.h b/src/server/game/AI/NpcBots/botmgr.h\nnew file mode 100644\nindex 0000000000..442babe2a9\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/botmgr.h\n@@ -0,0 +1,292 @@\n+#ifndef BOTMGR_H\n+#define BOTMGR_H\n+\n+#include \"botcommon.h\"\n+#include \"DBCEnums.h\"\n+\n+#include <functional>\n+#include <mutex>\n+#include <string_view>\n+\n+class bot_ai;\n+class Battleground;\n+class Creature;\n+class GameObject;\n+class Group;\n+class Map;\n+class Player;\n+class Spell;\n+class SpellInfo;\n+class Unit;\n+class Vehicle;\n+class WorldLocation;\n+class WorldObject;\n+class WorldPacket;\n+\n+class DPSTracker;\n+\n+struct AreaTrigger;\n+struct CleanDamage;\n+struct GroupQueueInfo;\n+struct NpcBotMgrData;\n+struct Position;\n+\n+enum BattlegroundTypeId : uint8;\n+enum CurrentSpellTypes : uint8;\n+enum DamageEffectType : uint8;\n+\n+inline constexpr std::size_t TARGET_ICON_NAMES_CACHE_SIZE = 8u; // Group.h TARGETICONCOUNT\n+\n+enum BotMgrDataFlags : uint32\n+{\n+    NPCBOT_MGR_FLAG_HIDE_BOTS                  = 0x00000001,\n+    NPCBOT_MGR_FLAG_DISABLE_COMBAT_POSITIONING = 0x00000002,\n+\n+    NPCBOT_MGR_FLAG_MASK_ALL_ALLOWED           = (NPCBOT_MGR_FLAG_HIDE_BOTS | NPCBOT_MGR_FLAG_DISABLE_COMBAT_POSITIONING),\n+    NPCBOT_MGR_FLAG_MASK_ALL_DB_ALLOWED        = (NPCBOT_MGR_FLAG_DISABLE_COMBAT_POSITIONING)\n+};\n+\n+enum BotAddResult\n+{\n+    BOT_ADD_DISABLED                    = 0x001,\n+    BOT_ADD_ALREADY_HAVE                = 0x002,\n+    BOT_ADD_MAX_EXCEED                  = 0x004,\n+    BOT_ADD_MAX_CLASS_EXCEED            = 0x008,\n+    BOT_ADD_CANT_AFFORD                 = 0x010,\n+    BOT_ADD_INSTANCE_LIMIT              = 0x020,\n+    BOT_ADD_BUSY                        = 0x040, // unused\n+    BOT_ADD_NOT_AVAILABLE               = 0x080,\n+\n+    BOT_ADD_SUCCESS                     = 0x100,\n+\n+    BOT_ADD_FATAL                       = (BOT_ADD_DISABLED | BOT_ADD_CANT_AFFORD | BOT_ADD_MAX_EXCEED | BOT_ADD_MAX_CLASS_EXCEED)\n+};\n+\n+enum BotRemoveType\n+{\n+    BOT_REMOVE_LOGOUT                   = 0,\n+    BOT_REMOVE_DISMISS                  = 1,\n+    BOT_REMOVE_UNSUMMON                 = 2,\n+    BOT_REMOVE_UNBIND                   = 3,\n+    BOT_REMOVE_UNAFFORD                 = 4,\n+    BOT_REMOVE_BY_DEFAULT               = BOT_REMOVE_LOGOUT\n+};\n+\n+enum BotOwnershipExpireMode\n+{\n+    BOT_OWNERSHIP_EXPIRE_OFFLINE        = 0,\n+    BOT_OWNERSHIP_EXPIRE_HIRE           = 1\n+};\n+\n+enum BotAttackRange\n+{\n+    BOT_ATTACK_RANGE_SHORT              = 1,\n+    BOT_ATTACK_RANGE_LONG               = 2,\n+    BOT_ATTACK_RANGE_EXACT              = 3,\n+\n+    BOT_ATTACK_RANGE_END                = BOT_ATTACK_RANGE_EXACT\n+};\n+\n+enum BotAttackAngle\n+{\n+    BOT_ATTACK_ANGLE_NORMAL             = 1,\n+    BOT_ATTACK_ANGLE_AVOID_FRONTAL_AOE  = 2,\n+\n+    BOT_ATTACK_ANGLE_END                = BOT_ATTACK_ANGLE_AVOID_FRONTAL_AOE\n+};\n+\n+using BotMap = std::unordered_map<ObjectGuid /*guid*/, Creature* /*bot*/>;\n+\n+class AC_GAME_API BotMgr\n+{\n+public:\n+    using delayed_teleport_callback_type = std::function<void(void)>;\n+    using delayed_teleport_mutex_type = std::mutex;\n+    using delayed_teleport_lock_type = std::unique_lock<delayed_teleport_mutex_type>;\n+\n+    explicit BotMgr(Player* const master);\n+    ~BotMgr();\n+    BotMgr(BotMgr const&) = delete;\n+    BotMgr(BotMgr&&) = delete;\n+    BotMgr& operator=(BotMgr const&) = delete;\n+    BotMgr& operator=(BotMgr&&) = delete;\n+\n+    Player* GetOwner() const { return _owner; }\n+\n+    BotMap const* GetBotMap() const { return &_bots; }\n+    BotMap* GetBotMap() { return &_bots; }\n+\n+    static void Initialize();\n+\n+    //onEvent hooks\n+    static void OnBotWandererKilled(Creature const* bot, Player* looter);\n+    static void OnBotWandererKilled(GameObject* go);\n+    static void OnBotKilled(Creature const* bot, Unit* attacker = nullptr);\n+    static void OnBotSpellInterrupt(Unit const* caster, CurrentSpellTypes spellType);\n+    static void OnBotSpellGo(Unit const* caster, Spell const* spell, bool ok = true);\n+    static void OnBotOwnerSpellGo(Unit const* caster, Spell const* spell, bool ok = true);\n+    static void OnBotChannelFinish(Unit const* caster, Spell const* spell);\n+    static void OnVehicleSpellGo(Unit const* caster, Spell const* spell, bool ok = true);\n+    static void OnVehicleAttackedBy(Unit* attacker, Unit const* victim);\n+    static void OnBotDamageTaken(Unit* attacker, Unit* victim, uint32 damage, CleanDamage const* cleanDamage, DamageEffectType damagetype, SpellInfo const* spellInfo);\n+    static void OnBotDamageDealt(Unit* attacker, Unit* victim, uint32 damage, CleanDamage const* cleanDamage, DamageEffectType damagetype, SpellInfo const* spellInfo);\n+    static void OnBotDispelDealt(Unit* dispeller, Unit* dispelled, uint8 num);\n+    static void OnBotEnterVehicle(Creature const* passenger, Vehicle const* vehicle);\n+    static void OnBotExitVehicle(Creature const* passenger, Vehicle const* vehicle);\n+    static void OnBotOwnerEnterVehicle(Player const* passenger, Vehicle const* vehicle);\n+    static void OnBotOwnerExitVehicle(Player const* passenger, Vehicle const* vehicle);\n+    static void OnBotPartyEngage(Player const* owner);\n+    static void OnBotAttackStop(Creature const* bot, Unit const* target);\n+    //mod hooks\n+    static void ApplyBotEffectMods(Unit const* caster, SpellInfo const* spellInfo, uint8 effIndex, float& value);\n+    static void ApplyBotThreatMods(Unit const* attacker, SpellInfo const* spellInfo, float& threat);\n+    static void ApplyBotEffectValueMultiplierMods(Unit const* caster, SpellInfo const* spellInfo, SpellEffIndex effIndex, float& multiplier);\n+    static float GetBotDamageTakenMod(Creature const* bot, bool magic);\n+    static int32 GetBotStat(Creature const* bot, BotStatMods stat);\n+    static int32 GetBotStat(Creature const* bot, Stats stat);\n+    static float GetBotResilience(Creature const* botOrPet);\n+\n+    void LoadData();\n+\n+    void Update(uint32 diff);\n+\n+    Creature* GetBot(ObjectGuid guid) const;\n+    Creature* GetBotByName(std::string_view name) const;\n+    std::vector<Creature*> GetAllBotsByClass(uint8 botclass) const;\n+\n+    bool HaveBot() const { return !_bots.empty(); }\n+    uint8 GetNpcBotsCount() const;\n+    uint8 GetNpcBotsCountByRole(uint32 roles) const;\n+    uint8 GetNpcBotsCountByVehicleEntry(uint32 creEntry) const;\n+    uint8 GetNpcBotSlot(Creature const* bot) const;\n+    uint8 GetNpcBotSlotByRole(uint32 roles, Creature const* bot) const;\n+    uint32 GetAllNpcBotsClassMask() const;\n+    static bool LimitBots(Map const* map);\n+    static bool CanBotParryWhileCasting(Creature const* bot);\n+    static bool IsWanderingWorldBot(Creature const* bot);\n+    static bool IsBotContestedPvP(Creature const* bot);\n+    static void SetBotContestedPvP(Creature const* bot);\n+    bool RestrictBots(Creature const* bot, bool add) const;\n+    bool IsPartyInCombat(bool is_pvp) const;\n+    bool HasBotClass(uint8 botclass) const;\n+    bool HasBotWithSpec(uint8 spec, bool alive = true) const;\n+    bool HasBotPetType(uint32 petType) const;\n+    bool IsBeingResurrected(WorldObject const* corpse) const;\n+\n+    static uint8 BotClassByClassName(std::string_view className);\n+    static uint8 GetBotPlayerClass(uint8 bot_class);\n+    static uint8 GetBotPlayerRace(uint8 bot_class, uint8 bot_race);\n+    static uint8 GetBotPlayerClass(Creature const* bot);\n+    static uint8 GetBotPlayerRace(Creature const* bot);\n+    static uint8 GetBotEquipmentClass(uint8 bot_class);\n+    static BotStatMods GetBotStatModByUnitStat(Stats stat);\n+\n+    std::string GetTargetIconString(uint8 icon_idx) const;\n+\n+    void OnTeleportFar(uint32 mapId, float x, float y, float z, float ori = 0.f);\n+    void OnOwnerSetGameMaster(bool on);\n+    void ReviveAllBots();\n+    void SendBotCommandState(uint32 state);\n+    void SendBotCommandStateRemove(uint32 state);\n+    void SendBotAwaitState(uint8 state);\n+    void RecallAllBots(bool teleport = false);\n+    void RecallBot(Creature* bot);\n+    void KillAllBots();\n+    void KillBot(Creature* bot) const;\n+\n+    void CleanupsBeforeBotDelete(ObjectGuid guid, uint8 removetype = BOT_REMOVE_LOGOUT);\n+    static void CleanupsBeforeBotDelete(Creature* bot);\n+    void RemoveAllBots(uint8 removetype = BOT_REMOVE_LOGOUT);\n+    void RemoveBot(ObjectGuid guid, uint8 removetype = BOT_REMOVE_LOGOUT);\n+    void UnbindBot(ObjectGuid guid);\n+    [[nodiscard]] BotAddResult RebindBot(Creature* bot);\n+    [[nodiscard]] BotAddResult AddBot(Creature* bot);\n+    bool AddBotToGroup(Creature* bot);\n+    void RemoveBotFromBGQueue(Creature const* bot);\n+    bool RemoveBotFromGroup(Creature* bot);\n+    bool RemoveAllBotsFromGroup();\n+\n+    static uint8 GetBotFollowDistMax() { return 100; }\n+    uint8 GetBotFollowDist() const;\n+    void SetBotFollowDist(uint8 dist);\n+\n+    uint8 GetBotExactAttackRange() const;\n+    uint8 GetBotAttackRangeMode() const;\n+    void SetBotAttackRangeMode(uint8 mode, uint8 exactRange = 0);\n+\n+    uint8 GetBotAttackAngleMode() const;\n+    void SetBotAttackAngleMode(uint8 mode);\n+\n+    bool GetBotAllowCombatPositioning() const;\n+    void SetBotAllowCombatPositioning(bool allow);\n+\n+    bool GetBotsHidden() const;\n+    void SetBotsHidden(bool hidden);\n+\n+    uint32 GetEngageDelayDPS() const;\n+    uint32 GetEngageDelayHeal() const;\n+    void SetEngageDelayDPS(uint32 delay);\n+    void SetEngageDelayHeal(uint32 delay);\n+    void PropagateEngageTimers() const;\n+\n+    void SetBotsShouldUpdateStats();\n+    void UpdatePhaseForBots();\n+    void UpdatePvPForBots();\n+\n+    static void BuildBotPartyMemberStatsPacket(ObjectGuid bot_guid, WorldPacket* data);\n+    static void BuildBotPartyMemberStatsChangedPacket(Creature const* bot, WorldPacket* data);\n+    //static uint32 GetBotGroupUpdateFlag(Creature const* bot);\n+    static void SetBotGroupUpdateFlag(Creature const* bot, uint32 flag);\n+    static uint64 GetBotAuraUpdateMaskForRaid(Creature const* bot);\n+    static void SetBotAuraUpdateMaskForRaid(Creature const* bot, uint8 slot);\n+    static void ResetBotAuraUpdateMaskForRaid(Creature const* bot);\n+    static uint64 GetBotPetAuraUpdateMaskForRaid(Creature const* botpet);\n+    static void SetBotPetAuraUpdateMaskForRaid(Creature const* botpet, uint8 slot);\n+    static void ResetBotPetAuraUpdateMaskForRaid(Creature const* botpet);\n+\n+    void TrackDamage(Unit const* u, uint32 damage);\n+    uint32 GetDPSTaken(Unit const* u) const;\n+    int32 GetHPSTaken(Unit const* unit) const;\n+\n+    static void ReviveBot(Creature* bot, WorldLocation* dest = nullptr) { _reviveBot(bot, dest); }\n+\n+    //TELEPORT BETWEEN MAPS\n+    //CONFIRMEND UNSAFE (charmer,owner)\n+    static void TeleportBot(Creature* bot, Map* newMap, Position const* pos, bool quick = false, bool reset = false, bot_ai* detached_ai = nullptr);\n+\n+    AoeSpotsVec const& GetAoeSpots() const { return _aoespots; }\n+    AoeSpotsVec& GetAoeSpots() { return _aoespots; }\n+\n+    void UpdateTargetIconName(uint8 id, std::string_view name);\n+    void ResetTargetIconNames();\n+\n+    static std::vector<Unit*> GetAllGroupMembers(Group const* group);\n+    static std::vector<Unit*> GetAllGroupMembers(Unit const* source);\n+    static void InviteBotToBG(ObjectGuid botguid, GroupQueueInfo* ginfo, Battleground* bg);\n+\n+    static bool IsBotInAreaTriggerRadius(Creature const* bot, AreaTrigger const* trigger);\n+\n+    static void AddDelayedTeleportCallback(delayed_teleport_callback_type&& callback);\n+    static void HandleDelayedTeleports();\n+\n+private:\n+    static void _teleportBot(Creature* bot, Map* newMap, float x, float y, float z, float ori, bool quick, bool reset, bot_ai* detached_ai);\n+    static void _reviveBot(Creature* bot, WorldLocation* dest = nullptr);\n+    void _setBotExactAttackRange(uint8 exactRange);\n+    static delayed_teleport_mutex_type* _getTpLock();\n+\n+    Player* const _owner;\n+    BotMap _bots;\n+    std::list<std::pair<ObjectGuid, BotRemoveType>> _delayedRemoveList;\n+    DPSTracker* const _dpstracker;\n+    NpcBotMgrData* _data;\n+\n+    bool _quickrecall;\n+    bool _update_lock;\n+\n+    AoeSpotsVec _aoespots;\n+\n+    std::array<std::string_view, TARGET_ICON_NAMES_CACHE_SIZE> _targetIconNamesCache;\n+};\n+\n+#endif\ndiff --git a/src/server/game/AI/NpcBots/botspell.cpp b/src/server/game/AI/NpcBots/botspell.cpp\nnew file mode 100644\nindex 0000000000..7371f6b65d\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/botspell.cpp\n@@ -0,0 +1,1909 @@\n+#include \"botdefine.h\"\n+#include \"botspell.h\"\n+#include \"DBCStores.h\"\n+#include \"Log.h\"\n+#include \"SpellInfo.h\"\n+#include \"SpellMgr.h\"\n+#include \"Timer.h\"\n+\n+#include <unordered_map>\n+\n+using SpellInfoOverridesMap = std::unordered_map<uint32, SpellInfo>;\n+using SpellProcOverridesMap = std::unordered_map<uint32, SpellProcEntry>;\n+static SpellInfoOverridesMap botSpellInfoOverrides;\n+static SpellProcOverridesMap botSpellProcOverrides;\n+\n+void GenerateBotCustomSpellProcs()\n+{\n+}\n+\n+SpellInfo const* GetBotSpellInfoOverride(uint32 spellId)\n+{\n+    decltype(botSpellInfoOverrides)::const_iterator ci = botSpellInfoOverrides.find(spellId);\n+    return ci != botSpellInfoOverrides.cend() ? &ci->second : nullptr;\n+}\n+\n+SpellInfo const* AssertBotSpellInfoOverride(uint32 spellId)\n+{\n+    decltype(botSpellInfoOverrides)::const_iterator ci = botSpellInfoOverrides.find(spellId);\n+    ASSERT(ci != botSpellInfoOverrides.cend(), \"AssertBotSpellInfoOverride failed for spell Id %u!\", spellId);\n+    return &ci->second;\n+}\n+\n+SpellProcEntry const* GetBotSpellProceEntryOverride(uint32 spellId)\n+{\n+    decltype(botSpellProcOverrides)::const_iterator ci = botSpellProcOverrides.find(spellId);\n+    return ci != botSpellProcOverrides.cend() ? &ci->second : nullptr;\n+}\n+\n+void GenerateBotCustomSpells()\n+{\n+    botSpellInfoOverrides.clear();\n+\n+    uint32 spellId, triggerSpellId;\n+    SpellInfo* sinfo;\n+\n+    //COMMON\n+    //1) SPELL_TELEPORT_LOCAL\n+    spellId = SPELL_TELEPORT_LOCAL; //7794\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->InterruptFlags = SPELL_INTERRUPT_FLAG_ABORT_ON_DMG;\n+    sinfo->CastTimeEntry = sSpellCastTimesStore.LookupEntry(6); //5000ms\n+    //sinfo->CastTimeEntry = sSpellCastTimesStore.LookupEntry(4); //1000ms\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(1); //self\n+    sinfo->ExplicitTargetMask = TARGET_FLAG_DEST_LOCATION;\n+    sinfo->Attributes |= SPELL_ATTR0_NO_IMMUNITIES | SPELL_ATTR0_ALLOW_WHILE_MOUNTED;\n+    sinfo->AttributesEx2 |= SPELL_ATTR2_IGNORE_LINE_OF_SIGHT;\n+\n+    sinfo->Effects[0].Effect = SPELL_EFFECT_TELEPORT_UNITS;\n+    sinfo->Effects[0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_CASTER);\n+    sinfo->Effects[0].TargetB = SpellImplicitTargetInfo(TARGET_DEST_DEST);\n+    sinfo->Effects[0].BasePoints = 1;\n+\n+    // SPELL_NULLIFY_POISON\n+    spellId = SPELL_NULLIFY_POISON; //550\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->PreventionType = SPELL_PREVENTION_TYPE_NONE;\n+    sinfo->SpellLevel = 0;\n+    sinfo->MaxLevel = 0;\n+    sinfo->RecoveryTime = 0;\n+    sinfo->StartRecoveryCategory = 0;\n+    sinfo->StartRecoveryTime = 0;\n+    sinfo->ManaCost = 0;\n+    sinfo->ManaCostPercentage = 0;\n+    sinfo->ManaCostPerlevel = 0;\n+    sinfo->CastTimeEntry = sSpellCastTimesStore.LookupEntry(1); //0\n+    sinfo->DurationEntry = sSpellDurationStore.LookupEntry(21); //-1\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(1); //self\n+    sinfo->ExplicitTargetMask = TARGET_FLAG_UNIT;\n+    sinfo->Attributes &= ~(SPELL_ATTR0_NOT_SHAPESHIFTED);\n+    sinfo->Attributes |= SPELL_ATTR0_PASSIVE | SPELL_ATTR0_DO_NOT_DISPLAY | SPELL_ATTR0_DO_NOT_LOG;\n+\n+    sinfo->Effects[0].Effect = SPELL_EFFECT_APPLY_AURA;\n+    sinfo->Effects[0].ApplyAuraName = SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL;\n+    sinfo->Effects[0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_CASTER);\n+    sinfo->Effects[0].TargetB = SpellImplicitTargetInfo(0);\n+    sinfo->Effects[0].BasePoints = -200;\n+    sinfo->Effects[0].MiscValue = DISPEL_POISON;\n+    sinfo->Effects[0].RealPointsPerLevel = 0.0f;\n+    sinfo->Effects[0].BonusMultiplier = 0.0f;\n+    sinfo->Effects[0].DamageMultiplier = 0.0f;\n+    // END SPELL_NULLIFY_POISON\n+\n+    //BLADEMASTER\n+    //2) SPELL_COMBAT_SPECIAL_2H_ATTACK\n+    spellId = SPELL_COMBAT_SPECIAL_2H_ATTACK; //44079\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(6); //6 - 100 yds\n+    sinfo->Attributes &= ~(SPELL_ATTR0_NOT_IN_COMBAT_ONLY_PEACEFUL);\n+    sinfo->AttributesEx2 |= SPELL_ATTR2_ALLOW_DEAD_TARGET;\n+    //2) END SPELL_COMBAT_SPECIAL_2H_ATTACK\n+\n+    //3) WINDWALK\n+    //3.1) TRANSPARENCY\n+    spellId = SPELL_TRANSPARENCY_50; //44816\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+    triggerSpellId = spellId;\n+\n+    sinfo->Attributes |= (SPELL_ATTR0_NOT_SHAPESHIFTED | SPELL_ATTR0_ALLOW_WHILE_SITTING);\n+    sinfo->AttributesEx |= (SPELL_ATTR1_ALLOW_WHILE_STEALTHED);\n+    sinfo->AuraInterruptFlags =\n+        AURA_INTERRUPT_FLAG_SPELL_ATTACK | AURA_INTERRUPT_FLAG_MELEE_ATTACK |\n+        AURA_INTERRUPT_FLAG_NOT_ABOVEWATER | AURA_INTERRUPT_FLAG_MOUNT; //0x00003C07;vanish\n+    sinfo->CasterAuraStateNot = 0;\n+    //3.1) END TRANSPARENCY\n+\n+    spellId = SPELL_NETHERWALK; //31599\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellLevel = 0;\n+    sinfo->MaxLevel = 0;\n+    sinfo->RecoveryTime = 5000;\n+    sinfo->PowerType = POWER_MANA;\n+    sinfo->ManaCost = 75 * 5;\n+    sinfo->ManaCostPercentage = 0;\n+    sinfo->ManaCostPerlevel = 0;\n+    sinfo->Attributes &= ~(SPELL_ATTR0_WEARER_CASTS_PROC_TRIGGER);\n+    sinfo->Attributes |= (SPELL_ATTR0_NOT_SHAPESHIFTED | SPELL_ATTR0_ALLOW_WHILE_SITTING | SPELL_ATTR0_NO_IMMUNITIES);\n+    sinfo->AttributesEx &= ~SPELL_ATTR1_AURA_UNIQUE;\n+    sinfo->AttributesEx |= (SPELL_ATTR1_ALLOW_WHILE_STEALTHED | SPELL_ATTR1_NO_THREAT);\n+    sinfo->AttributesEx2 |= SPELL_ATTR2_NO_SHAPESHIFT_UI;\n+    sinfo->AuraInterruptFlags =\n+        AURA_INTERRUPT_FLAG_SPELL_ATTACK | AURA_INTERRUPT_FLAG_MELEE_ATTACK |\n+        AURA_INTERRUPT_FLAG_NOT_ABOVEWATER | AURA_INTERRUPT_FLAG_MOUNT; //0x00003C07;vanish\n+    sinfo->CasterAuraStateNot = 0;\n+\n+    sinfo->Effects[0].Effect = SPELL_EFFECT_APPLY_AURA;\n+    sinfo->Effects[0].BasePoints = 100;\n+    sinfo->Effects[0].RealPointsPerLevel = 2.5f;\n+    sinfo->Effects[0].ValueMultiplier = 1.0f;\n+    sinfo->Effects[0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_CASTER);\n+    sinfo->Effects[0].ApplyAuraName = SPELL_AURA_MOD_INVISIBILITY;\n+    sinfo->Effects[0].Amplitude = 0;\n+    sinfo->Effects[0].TriggerSpell = 0;\n+    sinfo->Effects[0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_0_YARDS);\n+\n+    sinfo->Effects[1].Effect = SPELL_EFFECT_APPLY_AURA;\n+    sinfo->Effects[1].BasePoints = 10;\n+    sinfo->Effects[1].RealPointsPerLevel = 0.5f;\n+    sinfo->Effects[1].ValueMultiplier = 1.0f;\n+    sinfo->Effects[1].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_CASTER);\n+    sinfo->Effects[1].TargetB = SpellImplicitTargetInfo(0);\n+    sinfo->Effects[1].ApplyAuraName = SPELL_AURA_MOD_INCREASE_SPEED;\n+    sinfo->Effects[1].Amplitude = 0;\n+    sinfo->Effects[1].TriggerSpell = 0;\n+    sinfo->Effects[1].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_0_YARDS); //14\n+\n+    sinfo->Effects[2].Effect = SPELL_EFFECT_TRIGGER_SPELL;\n+    sinfo->Effects[2].BasePoints = 0;\n+    sinfo->Effects[2].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_CASTER);\n+    sinfo->Effects[2].TargetB = SpellImplicitTargetInfo(0);\n+    sinfo->Effects[2].ApplyAuraName = SPELL_AURA_NONE;\n+    sinfo->Effects[2].Amplitude = 0;\n+    sinfo->Effects[2].TriggerSpell = triggerSpellId;\n+    sinfo->Effects[2].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_0_YARDS); //14\n+    //3) END WINDWALK\n+\n+    //4) MIRROR IMAGE (BLADEMASTER)\n+    spellId = SPELL_MIRROR_IMAGE_BM; //69936\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(1); //1 - self only //6 - 100 yds\n+    sinfo->DurationEntry = sSpellDurationStore.LookupEntry(566); //566 - 0 sec //3 - 60 sec //1 - 10 sec //32 - 6 seconds\n+    sinfo->RecoveryTime = 8000;\n+    sinfo->PowerType = POWER_MANA;\n+    sinfo->ManaCost = 125 * 5;\n+    sinfo->ManaCostPercentage = 0;\n+    sinfo->ManaCostPerlevel = 0;\n+    sinfo->Attributes |= (SPELL_ATTR0_NOT_SHAPESHIFTED/* | SPELL_ATTR0_ALLOW_WHILE_SITTING | SPELL_ATTR0_NO_IMMUNITIES*/);\n+    sinfo->AttributesEx2 &= ~(SPELL_ATTR2_IGNORE_LINE_OF_SIGHT);\n+    //sinfo->AttributesEx3 |= SPELL_ATTR3_DONT_DISPLAY_RANGE;\n+\n+    sinfo->Effects[0].Effect = SPELL_EFFECT_DUMMY;\n+    sinfo->Effects[0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_CASTER);\n+    sinfo->Effects[0].MiscValue = 0;\n+    sinfo->Effects[0].MiscValueB = 0;\n+    sinfo->Effects[0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_0_YARDS);\n+    //4) END MIRROR IMAGE (BLADEMASTER)\n+\n+    //SPHYNX\n+    //5) SHADOW BLAST (SPLASH ATTACK)\n+    //TODO: balance\n+    spellId = SPELL_SHADOW_BLAST; //38085\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellFamilyName = SPELLFAMILY_WARLOCK;\n+    sinfo->SpellLevel = 60;\n+    sinfo->MaxLevel = 83;\n+    sinfo->ManaCost = BASE_MANA_SPHYNX / 16;\n+    sinfo->ManaCostPercentage = 0;\n+    sinfo->ManaCostPerlevel = 0;\n+    sinfo->CastTimeEntry = nullptr;\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(4); //30 yds\n+    sinfo->SchoolMask = SPELL_SCHOOL_MASK_SHADOW | SPELL_SCHOOL_MASK_ARCANE;\n+    sinfo->ExplicitTargetMask = TARGET_FLAG_UNIT | TARGET_FLAG_DEST_LOCATION;\n+    //sinfo->MaxAffectedTargets = 1000;\n+    //sinfo->Attributes |= SPELL_ATTR0_DO_NOT_LOG | SPELL_ATTR0_HIDDEN_CLIENTSIDE | SPELL_ATTR0_DO_NOT_SHEATH;\n+    sinfo->Attributes &= ~(SPELL_ATTR0_SCALES_WITH_CREATURE_LEVEL);\n+    //sinfo->AttributesEx2 |= SPELL_ATTR2_IGNORE_LINE_OF_SIGHT;\n+    sinfo->AttributesEx3 |= SPELL_ATTR3_ALWAYS_HIT;\n+\n+    sinfo->Effects[0].BasePoints = 300;\n+    sinfo->Effects[0].DieSides = 0;\n+    sinfo->Effects[0].BonusMultiplier = 0.f;\n+    sinfo->Effects[0].DamageMultiplier = 0.75f;\n+    sinfo->Effects[0].RealPointsPerLevel = 50.f;\n+    //sinfo->Effects[0].ValueMultiplier = 1.f;\n+\n+    sinfo->Effects[1].Effect = SPELL_EFFECT_SCHOOL_DAMAGE;\n+    sinfo->Effects[1].BasePoints = 50;\n+    sinfo->Effects[1].BonusMultiplier = 1.0f;\n+    sinfo->Effects[1].DamageMultiplier = 0.5f;\n+    sinfo->Effects[1].DieSides = /*17*/25;\n+    sinfo->Effects[1].RealPointsPerLevel = 30.f;\n+    //sinfo->Effects[1].ValueMultiplier = 1.f;\n+    sinfo->Effects[1].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ENEMY);\n+    sinfo->Effects[1].TargetB = SpellImplicitTargetInfo(TARGET_UNIT_DEST_AREA_ENEMY);\n+    sinfo->Effects[1].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_12_YARDS);\n+    //5) END SHADOW BLAST (SPLASH ATTACK)\n+\n+    //6) SHADOW BOLT (BASE ATTACK)\n+    spellId = SPELL_SHADOW_BOLT1; //16408\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->PreventionType = SPELL_PREVENTION_TYPE_NONE;\n+    sinfo->SpellLevel = 60;\n+    sinfo->MaxLevel = 83;\n+    sinfo->ManaCost = 0;\n+    sinfo->ManaCostPercentage = 0;\n+    sinfo->ManaCostPerlevel = 0;\n+    sinfo->CastTimeEntry = nullptr;\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(4); //30 yds\n+    sinfo->SchoolMask = SPELL_SCHOOL_MASK_SHADOW | SPELL_SCHOOL_MASK_ARCANE;\n+    //sinfo->Attributes |= SPELL_ATTR0_DO_NOT_LOG | SPELL_ATTR0_HIDDEN_CLIENTSIDE | SPELL_ATTR0_DO_NOT_SHEATH;\n+    //sinfo->AttributesEx3 |= SPELL_ATTR3_DONT_DISPLAY_RANGE;\n+\n+    sinfo->Effects[0].BasePoints = 200;\n+    sinfo->Effects[0].DieSides = /*12*/25;\n+    sinfo->Effects[0].BonusMultiplier = 1.15f;\n+    sinfo->Effects[0].DamageMultiplier = 1.f;\n+    sinfo->Effects[0].RealPointsPerLevel = 10.f;\n+    //sinfo->Effects[0].ValueMultiplier = 1.f;\n+    //6) END SHADOW BOLT (BASE ATTACK)\n+\n+    //7) ATTACK ANIMATION\n+    spellId = SPELL_ATTACK_MELEE_RANDOM; //42902\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->Attributes &= ~(SPELL_ATTR0_NOT_IN_COMBAT_ONLY_PEACEFUL);\n+    //7) END ATTACK ANIMATION\n+\n+    //8) SPLASH ANIMATION\n+    spellId = SHADOWFURY_VISUAL; //48582\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellLevel = 0;\n+    sinfo->MaxLevel = 0;\n+    sinfo->ManaCost = 0;\n+    sinfo->ManaCostPercentage = 0;\n+    sinfo->ManaCostPerlevel = 0;\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(6); //100 yds\n+    sinfo->ExplicitTargetMask = TARGET_FLAG_DEST_LOCATION;\n+    sinfo->MaxAffectedTargets = 1;\n+    sinfo->Stances = 0;\n+    sinfo->Speed = 0.f;\n+    sinfo->Attributes |= SPELL_ATTR0_ALLOW_CAST_WHILE_DEAD | SPELL_ATTR0_NO_IMMUNITIES;\n+    sinfo->AttributesEx |= SPELL_ATTR1_IMMUNITY_TO_HOSTILE_AND_FRIENDLY_EFFECTS | SPELL_ATTR1_NO_THREAT;\n+    sinfo->AttributesEx2 |= SPELL_ATTR2_ALLOW_DEAD_TARGET | SPELL_ATTR2_IGNORE_LINE_OF_SIGHT;\n+    sinfo->AttributesEx3 |= SPELL_ATTR3_ALWAYS_HIT;\n+    sinfo->AttributesEx5 |= SPELL_ATTR5_ALLOW_WHILE_STUNNED | SPELL_ATTR5_ALLOW_WHILE_CONFUSED | SPELL_ATTR5_ALLOW_WHILE_FLEEING;\n+\n+    sinfo->Effects[0].Effect = SPELL_EFFECT_DUMMY;\n+    sinfo->Effects[0].BasePoints = 1;\n+    sinfo->Effects[0].RealPointsPerLevel = 0.f;\n+    sinfo->Effects[0].ValueMultiplier = 0.f;\n+    sinfo->Effects[0].RealPointsPerLevel = 0.f;\n+    sinfo->Effects[0].DamageMultiplier = 0.f;\n+    sinfo->Effects[0].TargetB = SpellImplicitTargetInfo(0);\n+    sinfo->Effects[0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_0_YARDS);\n+    sinfo->Effects[0].TargetA = SpellImplicitTargetInfo(TARGET_DEST_DEST);\n+    //8) END SPLASH ANIMATION\n+\n+    //9) DEVOUR MAGIC\n+    spellId = SPELL_DEVOUR_MAGIC; //17012\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->InterruptFlags = 0xF;\n+    sinfo->SpellLevel = 0;\n+    sinfo->MaxLevel = 0;\n+    sinfo->MaxTargetLevel = 0;\n+    sinfo->RecoveryTime = 7000;\n+    sinfo->PowerType = POWER_MANA;\n+    sinfo->ManaCost = 0;\n+    sinfo->ManaCostPercentage = 0;\n+    sinfo->ManaCostPerlevel = 0;\n+    sinfo->CastTimeEntry = sSpellCastTimesStore.LookupEntry(4); //1000ms\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(5); //40 yds\n+    sinfo->SchoolMask = SPELL_SCHOOL_MASK_SHADOW | SPELL_SCHOOL_MASK_ARCANE;\n+    sinfo->DmgClass = SPELL_DAMAGE_CLASS_MAGIC;\n+    sinfo->ExplicitTargetMask = TARGET_FLAG_DEST_LOCATION;\n+    //sinfo->MaxAffectedTargets = 100;\n+    sinfo->Attributes |= SPELL_ATTR0_NO_IMMUNITIES;\n+    sinfo->AttributesEx |= SPELL_ATTR1_NO_THREAT;\n+    //sinfo->Attributes &= ~(SPELL_ATTR0_DO_NOT_LOG);\n+    //sinfo->AttributesEx3 |= SPELL_ATTR3_DONT_DISPLAY_RANGE;\n+\n+    sinfo->Effects[0].Effect = SPELL_EFFECT_DISPEL;\n+    sinfo->Effects[0].BasePoints = 2;\n+    sinfo->Effects[0].MiscValue = DISPEL_MAGIC;\n+    sinfo->Effects[0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_DEST_AREA_ALLY);\n+    sinfo->Effects[0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_20_YARDS);\n+\n+    sinfo->Effects[1].Effect = SPELL_EFFECT_DISPEL;\n+    sinfo->Effects[1].BasePoints = 2;\n+    sinfo->Effects[1].MiscValue = DISPEL_CURSE;\n+    sinfo->Effects[1].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_DEST_AREA_ALLY);\n+    sinfo->Effects[1].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_20_YARDS);\n+\n+    sinfo->Effects[2].Effect = SPELL_EFFECT_DISPEL;\n+    sinfo->Effects[2].BasePoints = 2;\n+    sinfo->Effects[2].MiscValue = DISPEL_MAGIC;\n+    sinfo->Effects[2].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_DEST_AREA_ENEMY);\n+    sinfo->Effects[2].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_20_YARDS);\n+    //9) END DEVOUR MAGIC\n+\n+    //10) DRAIN MANA\n+    spellId = SPELL_DRAIN_MANA; //25755\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellLevel = 0;\n+    sinfo->MaxLevel = 0;\n+    sinfo->MaxTargetLevel = 0;\n+    sinfo->RecoveryTime = 0;//60000;\n+    //sinfo->PowerType = POWER_MANA;\n+    //sinfo->ManaCost = 0;\n+    //sinfo->ManaCostPercentage = 0;\n+    //sinfo->ManaCostPerlevel = 0;\n+    sinfo->Speed = 0.f;\n+    sinfo->CastTimeEntry = sSpellCastTimesStore.LookupEntry(4); //1000ms\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(5); //40 yds\n+    sinfo->SchoolMask = SPELL_SCHOOL_MASK_SHADOW | SPELL_SCHOOL_MASK_ARCANE;\n+    //sinfo->DmgClass = SPELL_DAMAGE_CLASS_MAGIC;\n+    sinfo->ExplicitTargetMask = TARGET_FLAG_UNIT;\n+    sinfo->Attributes |= SPELL_ATTR0_IS_ABILITY | SPELL_ATTR0_DO_NOT_SHEATH;\n+    sinfo->AttributesEx3 |= SPELL_ATTR3_ALWAYS_HIT | SPELL_ATTR3_IGNORE_CASTER_MODIFIERS;\n+\n+    //sinfo->Effects[0].Effect = SPELL_EFFECT_POWER_DRAIN;\n+    sinfo->Effects[0].BasePoints = 999999;\n+    sinfo->Effects[0].RealPointsPerLevel = 0.f;\n+    sinfo->Effects[0].ValueMultiplier = 1.f;\n+    sinfo->Effects[0].RealPointsPerLevel = 0.f;\n+    sinfo->Effects[0].DamageMultiplier = 1.f;\n+    sinfo->Effects[0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ANY);\n+\n+    sinfo->Effects[1].Effect = 0;\n+    //10) END DRAIN MANA\n+\n+    //11) REPLENISH MANA\n+    spellId = SPELL_REPLENISH_MANA; //33394\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellFamilyName = SPELLFAMILY_WARLOCK;\n+    sinfo->SpellLevel = 0;\n+    sinfo->RecoveryTime = 3000;\n+    sinfo->CategoryRecoveryTime = 0;\n+    sinfo->CategoryEntry = nullptr;\n+    sinfo->PowerType = POWER_MANA;\n+    sinfo->CastTimeEntry = nullptr;//sSpellCastTimesStore.LookupEntry(2); //250ms\n+    sinfo->SchoolMask = SPELL_SCHOOL_MASK_SHADOW | SPELL_SCHOOL_MASK_ARCANE;\n+    sinfo->ExplicitTargetMask = TARGET_FLAG_UNIT;\n+    sinfo->MaxAffectedTargets = 100;\n+    sinfo->Attributes |= SPELL_ATTR0_IS_ABILITY | SPELL_ATTR0_DO_NOT_SHEATH | SPELL_ATTR0_DO_NOT_LOG_IMMUNE_MISSES | SPELL_ATTR0_DO_NOT_LOG;\n+    sinfo->AttributesEx |= SPELL_ATTR1_USE_ALL_MANA/* | SPELL_ATTR1_EXCLUDE_CASTER*/;\n+    sinfo->AttributesEx2 |= SPELL_ATTR2_IGNORE_LINE_OF_SIGHT;\n+    sinfo->AttributesEx3 |= SPELL_ATTR3_IGNORE_CASTER_MODIFIERS;\n+    sinfo->AttributesEx4 |= SPELL_ATTR4_AURA_NEVER_BOUNCES;\n+    sinfo->AttributesEx5 |= SPELL_ATTR5_AI_DOESNT_FACE_TARGET;\n+    sinfo->AttributesEx6 |= SPELL_ATTR6_NO_AURA_LOG;\n+\n+    sinfo->Effects[0].Effect = SPELL_EFFECT_TRIGGER_SPELL;\n+    sinfo->Effects[0].BasePoints = 3;\n+    sinfo->Effects[0].DieSides = 0;\n+    sinfo->Effects[0].RealPointsPerLevel = 0.f;\n+    sinfo->Effects[0].ValueMultiplier = 0.f;\n+    sinfo->Effects[0].RealPointsPerLevel = 0.f;\n+    sinfo->Effects[0].DamageMultiplier = 0.f;\n+    sinfo->Effects[0].TriggerSpell = SPELL_TRIGGERED_ENERGIZE;\n+    sinfo->Effects[0].TargetA = SpellImplicitTargetInfo(TARGET_SRC_CASTER);\n+    sinfo->Effects[0].TargetB = SpellImplicitTargetInfo(TARGET_UNIT_SRC_AREA_ALLY);\n+    sinfo->Effects[0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_25_YARDS);\n+    //11) END REPLENISH MANA\n+\n+    //12) REPLENISH HEALTH\n+    spellId = SPELL_REPLENISH_HEALTH; //34756\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellFamilyName = SPELLFAMILY_WARLOCK;\n+    sinfo->SpellLevel = 0;\n+    sinfo->RecoveryTime = 3000;\n+    sinfo->CategoryEntry = nullptr;\n+    sinfo->PowerType = POWER_MANA;\n+    sinfo->CastTimeEntry = nullptr;//sSpellCastTimesStore.LookupEntry(2); //250ms\n+    sinfo->SchoolMask = SPELL_SCHOOL_MASK_SHADOW | SPELL_SCHOOL_MASK_ARCANE;\n+    sinfo->ExplicitTargetMask = TARGET_FLAG_UNIT;\n+    sinfo->MaxAffectedTargets = 100;\n+    sinfo->Attributes |= SPELL_ATTR0_IS_ABILITY | SPELL_ATTR0_DO_NOT_SHEATH | SPELL_ATTR0_DO_NOT_LOG_IMMUNE_MISSES | SPELL_ATTR0_DO_NOT_LOG;\n+    sinfo->AttributesEx |= SPELL_ATTR1_USE_ALL_MANA/* | SPELL_ATTR1_EXCLUDE_CASTER*/;\n+    sinfo->AttributesEx &= ~(SPELL_ATTR1_EXCLUDE_CASTER);\n+    sinfo->AttributesEx2 |= SPELL_ATTR2_IGNORE_LINE_OF_SIGHT;\n+    sinfo->AttributesEx3 |= SPELL_ATTR3_IGNORE_CASTER_MODIFIERS;\n+    sinfo->AttributesEx4 |= SPELL_ATTR4_AURA_NEVER_BOUNCES;\n+    sinfo->AttributesEx5 |= SPELL_ATTR5_AI_DOESNT_FACE_TARGET;\n+    sinfo->AttributesEx6 |= SPELL_ATTR6_NO_AURA_LOG;\n+\n+    sinfo->Effects[0].Effect = SPELL_EFFECT_TRIGGER_SPELL;\n+    sinfo->Effects[0].BasePoints = 3;\n+    sinfo->Effects[0].DieSides = 0;\n+    sinfo->Effects[0].RealPointsPerLevel = 0.f;\n+    sinfo->Effects[0].ValueMultiplier = 0.f;\n+    sinfo->Effects[0].RealPointsPerLevel = 0.f;\n+    sinfo->Effects[0].DamageMultiplier = 0.f;\n+    sinfo->Effects[0].TriggerSpell = SPELL_TRIGGERED_HEAL;\n+    sinfo->Effects[0].TargetA = SpellImplicitTargetInfo(TARGET_SRC_CASTER);\n+    sinfo->Effects[0].TargetB = SpellImplicitTargetInfo(TARGET_UNIT_SRC_AREA_ALLY);\n+    sinfo->Effects[0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_25_YARDS);\n+    //12) END REPLENISH HEALTH\n+\n+    //ARCHMAGE\n+    //13) BRILLIANCE AURA\n+    spellId = SPELL_BRILLIANCE_AURA; //1234\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellLevel = 0;\n+    sinfo->MaxLevel = 0;\n+    sinfo->MaxTargetLevel = 0;\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(1); //0 yds\n+    sinfo->ExplicitTargetMask = TARGET_FLAG_UNIT;\n+    sinfo->Attributes |= SPELL_ATTR0_IS_ABILITY | SPELL_ATTR0_PASSIVE;\n+    sinfo->AttributesEx4 |= SPELL_ATTR4_ALLOW_ENETRING_ARENA;\n+    sinfo->AttributesEx7 |= SPELL_ATTR7_DO_NOT_COUNT_FOR_PVP_SCOREBOARD;\n+\n+    sinfo->Effects[0].Effect = SPELL_EFFECT_APPLY_AREA_AURA_RAID;\n+    sinfo->Effects[0].ApplyAuraName = SPELL_AURA_MOD_POWER_REGEN_PERCENT;\n+    sinfo->Effects[0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_CASTER);\n+    sinfo->Effects[0].BasePoints = 100;\n+    sinfo->Effects[0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_40_YARDS);\n+\n+    sinfo->Effects[1].Effect = SPELL_EFFECT_APPLY_AREA_AURA_RAID;\n+    sinfo->Effects[1].ApplyAuraName = SPELL_AURA_MOD_INCREASE_ENERGY_PERCENT;\n+    sinfo->Effects[1].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_CASTER);\n+    sinfo->Effects[1].BasePoints = 10;\n+    sinfo->Effects[1].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_40_YARDS);\n+\n+    //for stacking rule\n+    /*\n+    sinfo->Effects[2].Effect = SPELL_EFFECT_APPLY_AURA;\n+    sinfo->Effects[2].ApplyAuraName = SPELL_AURA_DUMMY;\n+    sinfo->Effects[2].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_CASTER);\n+    sinfo->Effects[2].BasePoints = 1;\n+    sinfo->Effects[2].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_0_YARDS);\n+    */\n+    //13) END BRILLIANCE AURA\n+\n+    //14) FIREBALL (MAIN_ATTACK)\n+    //TODO: balance\n+    spellId = SPELL_FIREBALL; //9488\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellLevel = 20;\n+    sinfo->BaseLevel = 20;\n+    sinfo->MaxLevel = 81;\n+    sinfo->ManaCost = 0;\n+    sinfo->ManaCostPercentage = 0;\n+    sinfo->ManaCostPerlevel = 0;\n+    sinfo->CastTimeEntry = nullptr;\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(4); //30 yds\n+    sinfo->SchoolMask = SPELL_SCHOOL_MASK_FIRE | SPELL_SCHOOL_MASK_ARCANE;\n+    //sinfo->ExplicitTargetMask = TARGET_FLAG_UNIT;\n+    //sinfo->MaxAffectedTargets = 1000;\n+    sinfo->Attributes |= SPELL_ATTR0_DO_NOT_SHEATH | SPELL_ATTR0_IS_ABILITY | SPELL_ATTR0_ALLOW_WHILE_MOUNTED;\n+    sinfo->Attributes &= ~(SPELL_ATTR0_SCALES_WITH_CREATURE_LEVEL);\n+    sinfo->AttributesEx3 |= SPELL_ATTR3_ALWAYS_HIT;\n+\n+    sinfo->Effects[0].BasePoints = 15;\n+    sinfo->Effects[0].DieSides = 9;\n+    sinfo->Effects[0].BonusMultiplier = 0.5f;\n+    sinfo->Effects[0].DamageMultiplier = 1.f;\n+    sinfo->Effects[0].RealPointsPerLevel = 15.f;\n+    sinfo->Effects[0].ValueMultiplier = 1.f;\n+    //14) END FIREBALL (MAIN ATTACK)\n+\n+    //15) BLIZZARD\n+    //TODO: balance\n+    spellId = SPELL_BLIZZARD; //15783\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellFamilyName = SPELLFAMILY_MAGE;\n+    sinfo->SpellLevel = 20;\n+    sinfo->BaseLevel = 20;\n+    sinfo->MaxLevel = 0;\n+    sinfo->ManaCost = 75 * 5;\n+    sinfo->ManaCostPercentage = 0;\n+    sinfo->ManaCostPerlevel = 0;\n+    sinfo->CastTimeEntry = nullptr;\n+    sinfo->RecoveryTime = 6000;\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(4); //30 yds\n+    sinfo->SchoolMask = SPELL_SCHOOL_MASK_FROST | SPELL_SCHOOL_MASK_ARCANE;\n+    ///sinfo->ExplicitTargetMask = TARGET_FLAG_DEST_LOCATION;\n+    //sinfo->MaxAffectedTargets = 1000;\n+    sinfo->Attributes |= SPELL_ATTR0_DO_NOT_SHEATH | SPELL_ATTR0_IS_ABILITY | SPELL_ATTR0_ALLOW_WHILE_MOUNTED;\n+    sinfo->AttributesEx2 |= SPELL_ATTR2_IGNORE_LINE_OF_SIGHT | SPELL_ATTR2_NO_INITIAL_THREAD;\n+    sinfo->AttributesEx3 |= SPELL_ATTR3_ALWAYS_HIT;\n+    sinfo->AttributesEx5 |= SPELL_ATTR5_SPELL_HASTE_AFFECTS_PERIODIC;\n+\n+    sinfo->Effects[0].BasePoints = 26;\n+    sinfo->Effects[0].DieSides = 0;\n+    sinfo->Effects[0].BonusMultiplier = 1.f;\n+    sinfo->Effects[0].DamageMultiplier = 1.f;\n+    sinfo->Effects[0].RealPointsPerLevel = 15.f;\n+    sinfo->Effects[0].ValueMultiplier = 1.f;\n+    sinfo->Effects[0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_13_YARDS);\n+    sinfo->Effects[0].Amplitude = 1000;\n+    //15) END BLIZZARD\n+\n+    //16) SUMMON WATER ELEMENTAL (dummy spell)\n+    spellId = SPELL_SUMMON_WATER_ELEMENTAL; //35593\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellFamilyName = SPELLFAMILY_MAGE;\n+    sinfo->SpellLevel = 20;\n+    sinfo->BaseLevel = 20;\n+    sinfo->MaxLevel = 0;\n+    sinfo->RecoveryTime = 20000;\n+    sinfo->PowerType = POWER_MANA;\n+    sinfo->ManaCost = 125 * 5;\n+    sinfo->ManaCostPercentage = 0;\n+    sinfo->ManaCostPerlevel = 0;\n+    sinfo->CastTimeEntry = sSpellCastTimesStore.LookupEntry(3); //500ms\n+    sinfo->SchoolMask = SPELL_SCHOOL_MASK_FROST | SPELL_SCHOOL_MASK_ARCANE;\n+    sinfo->ExplicitTargetMask = TARGET_FLAG_UNIT;\n+\n+    sinfo->Effects[0].Effect = SPELL_EFFECT_DUMMY;\n+    //sinfo->Effects[0].BasePoints = 1;\n+    sinfo->Effects[0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_CASTER);\n+    sinfo->Effects[0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_0_YARDS);\n+    //16) END SUMMON WATER ELEMENTAL\n+\n+    //17) WATERBOLT (MAIN_ATTACK)\n+    //TODO: balance, we only have 1 of 3 possible elementals so boost damage\n+    spellId = SPELL_WATERBOLT; //72898\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellFamilyName = SPELLFAMILY_GENERIC;\n+    sinfo->SpellLevel = 20;\n+    sinfo->BaseLevel = 20;\n+    sinfo->MaxTargetLevel = 0;\n+    sinfo->ManaCost = 0;\n+    sinfo->ManaCostPercentage = 0;\n+    sinfo->ManaCostPerlevel = 0;\n+    sinfo->CastTimeEntry = sSpellCastTimesStore.LookupEntry(5); //2000ms\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(4); //30 yds\n+    sinfo->SchoolMask = SPELL_SCHOOL_MASK_FROST | SPELL_SCHOOL_MASK_ARCANE;\n+    sinfo->AttributesEx3 |= SPELL_ATTR3_ALWAYS_HIT;\n+\n+    sinfo->Effects[0].BasePoints = 25;\n+    sinfo->Effects[0].DieSides = 20;\n+    sinfo->Effects[0].BonusMultiplier = 1.f;\n+    sinfo->Effects[0].DamageMultiplier = 1.f;\n+    sinfo->Effects[0].RealPointsPerLevel = 25.f;\n+    sinfo->Effects[0].ValueMultiplier = 1.f;\n+    //17) END WATERBOLT (MAIN ATTACK)\n+\n+    //DREADLORD\n+    //18) VAMPIRIC AURA\n+    spellId = SPELL_VAMPIRIC_AURA; //20810\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->ProcFlags = PROC_FLAG_DONE_MELEE_AUTO_ATTACK | PROC_FLAG_DONE_SPELL_MELEE_DMG_CLASS;\n+    sinfo->SchoolMask = SPELL_SCHOOL_MASK_SHADOW | SPELL_SCHOOL_MASK_ARCANE;\n+    sinfo->PreventionType = SPELL_PREVENTION_TYPE_NONE;\n+    sinfo->DmgClass = SPELL_DAMAGE_CLASS_NONE;\n+    sinfo->SpellLevel = 0;\n+    sinfo->BaseLevel = 0;\n+    sinfo->MaxTargetLevel = 0;\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(1); //0 yds\n+    sinfo->ExplicitTargetMask = TARGET_FLAG_UNIT;\n+    sinfo->Attributes |= SPELL_ATTR0_IS_ABILITY | SPELL_ATTR0_PASSIVE;\n+    sinfo->AttributesEx3 |= SPELL_ATTR3_CAN_PROC_FROM_PROCS;\n+    sinfo->AttributesEx4 |= SPELL_ATTR4_ALLOW_ENETRING_ARENA;\n+    sinfo->AttributesEx7 |= SPELL_ATTR7_DO_NOT_COUNT_FOR_PVP_SCOREBOARD;\n+\n+    sinfo->Effects[0].Effect = SPELL_EFFECT_APPLY_AREA_AURA_RAID;\n+    sinfo->Effects[0].ApplyAuraName = SPELL_AURA_MOD_CRIT_DAMAGE_BONUS;\n+    sinfo->Effects[0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_CASTER);\n+    sinfo->Effects[0].BasePoints = 5;\n+    sinfo->Effects[0].MiscValue = SPELL_SCHOOL_MASK_NORMAL;\n+    sinfo->Effects[0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_40_YARDS);\n+\n+    sinfo->Effects[1].Effect = SPELL_EFFECT_APPLY_AREA_AURA_RAID;\n+    sinfo->Effects[1].ApplyAuraName = SPELL_AURA_PROC_TRIGGER_SPELL;\n+    sinfo->Effects[1].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_CASTER);\n+    sinfo->Effects[1].BasePoints = 1;\n+    sinfo->Effects[1].TriggerSpell = SPELL_TRIGGERED_HEAL;\n+    sinfo->Effects[1].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_40_YARDS);\n+\n+    //for stacking rule\n+    /*\n+    sinfo->Effects[2].Effect = SPELL_EFFECT_APPLY_AURA;\n+    sinfo->Effects[2].ApplyAuraName = SPELL_AURA_DUMMY;\n+    sinfo->Effects[2].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_CASTER);\n+    sinfo->Effects[2].BasePoints = 1;\n+    sinfo->Effects[2].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_0_YARDS);\n+    */\n+    //18) END VAMPIRIC AURA\n+\n+    //19) VAMPIRIC HEAL\n+    spellId = SPELL_TRIGGERED_HEAL; //25155\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->PreventionType = SPELL_PREVENTION_TYPE_NONE;\n+    sinfo->DmgClass = SPELL_DAMAGE_CLASS_NONE;\n+    sinfo->SchoolMask = SPELL_SCHOOL_MASK_SHADOW | SPELL_SCHOOL_MASK_ARCANE;\n+    sinfo->Attributes &= ~(SPELL_ATTR0_NOT_SHAPESHIFTED);\n+    sinfo->AttributesEx |= SPELL_ATTR1_NO_REFLECTION | SPELL_ATTR1_NO_REDIRECTION | SPELL_ATTR1_NO_THREAT;\n+    sinfo->AttributesEx2 |= SPELL_ATTR2_CANT_CRIT;\n+    sinfo->AttributesEx3 |= SPELL_ATTR3_ALWAYS_HIT | SPELL_ATTR3_INSTANT_TARGET_PROCS | SPELL_ATTR3_CAN_PROC_FROM_PROCS | SPELL_ATTR3_IGNORE_CASTER_MODIFIERS;\n+\n+    sinfo->Effects[0].BasePoints = 1;\n+\n+    sinfo->Effects[1].Effect = 0;\n+    //19) END VAMPIRIC HEAL\n+\n+    //20) SLEEP\n+    spellId = SPELL_SLEEP; //20663\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellFamilyName = SPELLFAMILY_WARLOCK;\n+    sinfo->SchoolMask = SPELL_SCHOOL_MASK_SHADOW | SPELL_SCHOOL_MASK_ARCANE;\n+    sinfo->InterruptFlags = 0xF;\n+    sinfo->SpellLevel = 0;\n+    sinfo->BaseLevel = 0;\n+    sinfo->MaxTargetLevel = 0;\n+    sinfo->Dispel = DISPEL_MAGIC;\n+    sinfo->Mechanic = MECHANIC_SLEEP;\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(4); //30 yds\n+    sinfo->CastTimeEntry = sSpellCastTimesStore.LookupEntry(3); //500ms\n+    sinfo->RecoveryTime = 6000;\n+    //sinfo->StartRecoveryCategory = 133;\n+    //sinfo->StartRecoveryTime = 1000;\n+    sinfo->DurationEntry = sSpellDurationStore.LookupEntry(3); //60000ms\n+    sinfo->ManaCost = 50 * 5;\n+    sinfo->ManaCostPercentage = 0;\n+    sinfo->ManaCostPerlevel = 0;\n+    sinfo->AuraInterruptFlags = AURA_INTERRUPT_FLAG_DIRECT_DAMAGE;\n+    sinfo->ExplicitTargetMask = TARGET_FLAG_UNIT;\n+    sinfo->Attributes &= ~(SPELL_ATTR0_NOT_SHAPESHIFTED | SPELL_ATTR0_HEARTBEAT_RESIST);\n+    sinfo->AttributesEx |= SPELL_ATTR1_NO_REDIRECTION | SPELL_ATTR1_NO_REFLECTION;\n+    sinfo->AttributesEx3 |= SPELL_ATTR3_ALWAYS_HIT;\n+\n+    //sinfo->Effects[0].Effect = SPELL_EFFECT_APPLY_AURA;\n+    //sinfo->Effects[0].ApplyAuraName = SPELL_AURA_MOD_STUN;\n+    //sinfo->Effects[0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ENEMY);\n+    //sinfo->Effects[0].BasePoints = 1;\n+\n+    sinfo->Effects[1].Effect = SPELL_EFFECT_APPLY_AURA;\n+    sinfo->Effects[1].ApplyAuraName = SPELL_AURA_MOD_RESISTANCE_PCT;\n+    sinfo->Effects[1].MiscValue = SPELL_SCHOOL_MASK_NORMAL;\n+    sinfo->Effects[1].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ENEMY);\n+    sinfo->Effects[1].BasePoints = -100;\n+    //20) END SLEEP\n+\n+    //21) CARRION SWARM\n+    //TODO: balance\n+    spellId = SPELL_CARRION_SWARM; //34240\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellFamilyName = SPELLFAMILY_WARLOCK;\n+    sinfo->DmgClass = SPELL_DAMAGE_CLASS_MAGIC;\n+    sinfo->SchoolMask = SPELL_SCHOOL_MASK_SHADOW | SPELL_SCHOOL_MASK_ARCANE;\n+    sinfo->PreventionType = SPELL_PREVENTION_TYPE_NONE;\n+    sinfo->SpellLevel = 40;\n+    sinfo->BaseLevel = 40;\n+    sinfo->MaxTargetLevel = 0;\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(4); //30 yds\n+    sinfo->RecoveryTime = 10000;\n+    sinfo->StartRecoveryCategory = 133;\n+    sinfo->StartRecoveryTime = 1500;\n+    sinfo->ManaCost = 110 * 5;\n+    //sinfo->MaxAffectedTargets = 1000;\n+    //sinfo->ExplicitTargetMask = TARGET_FLAG_UNIT;\n+    sinfo->Attributes &= ~(SPELL_ATTR0_WEARER_CASTS_PROC_TRIGGER);\n+    sinfo->AttributesEx |= SPELL_ATTR1_NO_REDIRECTION | SPELL_ATTR1_NO_REFLECTION;\n+    sinfo->AttributesEx2 |= SPELL_ATTR2_CANT_CRIT/* | SPELL_ATTR2_IGNORE_LINE_OF_SIGHT*/;\n+    sinfo->AttributesEx3 |= SPELL_ATTR3_ALWAYS_HIT;\n+\n+    //sinfo->Effects[0].Effect = SPELL_EFFECT_SCHOOL_DAMAGE;\n+    sinfo->Effects[0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_CONE_ENEMY_104);\n+    sinfo->Effects[0].BasePoints = 425;\n+    sinfo->Effects[0].DieSides = 150;\n+    sinfo->Effects[0].BonusMultiplier = 2.f;\n+    sinfo->Effects[0].DamageMultiplier = 1.f;\n+    sinfo->Effects[0].RealPointsPerLevel = 37.5f; //2000 avg at 80\n+    sinfo->Effects[0].ValueMultiplier = 1.f;\n+    sinfo->Effects[0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_40_YARDS);\n+    //21) END CARRION SWARM\n+\n+    //22) INFERNO (dummy summon)\n+    spellId = SPELL_INFERNO; //12740\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellFamilyName = SPELLFAMILY_WARLOCK;\n+    sinfo->SpellLevel = 60;\n+    sinfo->BaseLevel = 60;\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(4); //30 yds\n+    sinfo->CastTimeEntry = sSpellCastTimesStore.LookupEntry(3); //500ms\n+    sinfo->RecoveryTime = 180000;\n+    sinfo->StartRecoveryCategory = 133;\n+    sinfo->StartRecoveryTime = 1500;\n+    sinfo->ManaCost = 175 * 5;\n+    sinfo->ExplicitTargetMask = TARGET_FLAG_DEST_LOCATION;\n+    sinfo->Attributes &= ~(SPELL_ATTR0_IS_ABILITY);\n+    sinfo->AttributesEx |= /*SPELL_ATTR1_IMMUNITY_TO_HOSTILE_AND_FRIENDLY_EFFECTS | */SPELL_ATTR1_NO_THREAT;\n+    //sinfo->AttributesEx3 |= SPELL_ATTR3_ALWAYS_HIT;\n+\n+    sinfo->Effects[0].Effect = SPELL_EFFECT_DUMMY;\n+    sinfo->Effects[0].TargetA = SpellImplicitTargetInfo(TARGET_DEST_DEST);\n+    sinfo->Effects[0].BasePoints = 1;\n+    //22) END INFERNO\n+\n+    //23) INFERNO VISUAL (dummy summon)\n+    spellId = SPELL_INFERNO_METEOR_VISUAL; //5739\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->ExplicitTargetMask = TARGET_FLAG_DEST_LOCATION;\n+\n+    //sinfo->Effects[0].Effect = SPELL_EFFECT_DUMMY;\n+    sinfo->Effects[0].TargetA = SpellImplicitTargetInfo(TARGET_DEST_DEST);\n+    //23) END INFERNO VISUAL\n+\n+    //SPELL BREAKER\n+    //24) STEAL MAGIC\n+    spellId = SPELL_STEAL_MAGIC; //30036\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellFamilyName = SPELLFAMILY_PALADIN;\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(34); //25 yds\n+    sinfo->RecoveryTime = 2000;\n+    sinfo->ManaCost = 75 * 5;\n+    sinfo->ManaCostPercentage = 0;\n+    sinfo->ManaCostPerlevel = 0;\n+    sinfo->ExplicitTargetMask = TARGET_FLAG_UNIT;\n+    sinfo->AttributesEx |= SPELL_ATTR1_NO_REDIRECTION | SPELL_ATTR1_NO_REFLECTION;\n+    sinfo->AttributesEx3 |= SPELL_ATTR3_ALWAYS_HIT;\n+    sinfo->AttributesEx6 |= SPELL_ATTR6_NO_AURA_LOG;\n+\n+    sinfo->Effects[0].Effect = SPELL_EFFECT_DUMMY;\n+    sinfo->Effects[0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ANY);\n+\n+    sinfo->Effects[1].Effect = 0;\n+    //24) END STEAL MAGIC\n+\n+    //24.1) STEAL MAGIC VISUAL\n+    spellId = SPELL_STEAL_MAGIC_VISUAL; //11084\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellLevel = 1;\n+    sinfo->BaseLevel = 1;\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(6); //100 yds\n+    sinfo->RecoveryTime = 0;\n+    sinfo->ExplicitTargetMask = TARGET_FLAG_UNIT;\n+    sinfo->AttributesEx |= SPELL_ATTR1_NO_REDIRECTION | SPELL_ATTR1_NO_REFLECTION;\n+    sinfo->AttributesEx3 |= SPELL_ATTR3_ALWAYS_HIT;\n+\n+    sinfo->Effects[0].Effect = SPELL_EFFECT_DUMMY;\n+    sinfo->Effects[0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ANY);\n+    sinfo->Effects[0].BasePoints = 1;\n+    sinfo->Effects[0].DieSides = 0;\n+    sinfo->Effects[0].RealPointsPerLevel = 0.f;\n+    sinfo->Effects[0].BonusMultiplier = 0.f;\n+    //24.1) END STEAL MAGIC VISUAL\n+\n+    //25) FEEDBACK\n+    spellId = SPELL_FEEDBACK; //32897\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellFamilyName = SPELLFAMILY_PALADIN;\n+    sinfo->SchoolMask = SPELL_SCHOOL_MASK_ARCANE;\n+    sinfo->PreventionType = SPELL_PREVENTION_TYPE_NONE;\n+    sinfo->SpellLevel = 0;\n+    sinfo->BaseLevel = 0;\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(13); //50000 yds\n+    sinfo->ManaCost = 0;\n+    sinfo->ManaCostPercentage = 0;\n+    sinfo->ManaCostPerlevel = 0;\n+    sinfo->ExplicitTargetMask = TARGET_FLAG_UNIT;\n+    sinfo->Attributes &= ~(SPELL_ATTR0_NOT_SHAPESHIFTED);\n+    sinfo->AttributesEx |= SPELL_ATTR1_NO_REDIRECTION | SPELL_ATTR1_NO_REFLECTION | SPELL_ATTR1_IMMUNITY_TO_HOSTILE_AND_FRIENDLY_EFFECTS;\n+    sinfo->AttributesEx2 |= SPELL_ATTR2_CANT_CRIT;\n+    sinfo->AttributesEx3 |= SPELL_ATTR3_ALWAYS_HIT;\n+\n+    sinfo->Effects[0].Effect = SPELL_EFFECT_POWER_BURN;\n+    sinfo->Effects[0].DieSides = 0;\n+    sinfo->Effects[0].ValueMultiplier = 1.f;\n+    //25) END FEEDBACK\n+\n+    // DARK RANGER\n+    //26) BLACK ARROW\n+    //TODO: balance\n+    spellId = SPELL_BLACK_ARROW; //20733\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellFamilyName = SPELLFAMILY_WARLOCK;\n+    //sinfo->SpellFamilyFlags[0] = 0x0;\n+    sinfo->SpellFamilyFlags[1] = 0x4; //custom, not present in db\n+    //sinfo->SpellFamilyFlags[2] = 0x0;\n+    sinfo->DmgClass = SPELL_DAMAGE_CLASS_RANGED;\n+    sinfo->SchoolMask = SPELL_SCHOOL_MASK_SHADOW | SPELL_SCHOOL_MASK_ARCANE;\n+    sinfo->PreventionType = SPELL_PREVENTION_TYPE_PACIFY;\n+    sinfo->Dispel = DISPEL_NONE;\n+    sinfo->Mechanic = MECHANIC_NONE;\n+    sinfo->SpellLevel = 40;\n+    sinfo->BaseLevel = 40;\n+    sinfo->MaxTargetLevel = 0;\n+    sinfo->CastTimeEntry = sSpellCastTimesStore.LookupEntry(3); //500ms\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(4); //5-30 yds\n+    sinfo->DurationEntry = sSpellDurationStore.LookupEntry(85); //18 sec\n+    sinfo->RecoveryTime = 3000;\n+    sinfo->StartRecoveryCategory = 133;\n+    sinfo->StartRecoveryTime = 1500;\n+    sinfo->ManaCost = 6 * 5 * 2; //need to increase cost since ability is not autocast, has cd and deals more damage\n+    sinfo->MaxAffectedTargets = 1;\n+    sinfo->AuraInterruptFlags = AURA_INTERRUPT_FLAG_CHANGE_MAP;\n+    //sinfo->ExplicitTargetMask = TARGET_FLAG_UNIT;\n+    sinfo->Attributes |= SPELL_ATTR0_NO_ACTIVE_DEFENSE | SPELL_ATTR0_AURA_IS_DEBUFF;\n+    sinfo->AttributesEx |= SPELL_ATTR1_NO_REDIRECTION | SPELL_ATTR1_NO_REFLECTION;\n+    sinfo->AttributesEx2 |= SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS/* | SPELL_ATTR2_CANT_CRIT*/;\n+    sinfo->AttributesEx4 |= SPELL_ATTR4_NO_CAST_LOG;\n+\n+    sinfo->Effects[1].Effect = SPELL_EFFECT_WEAPON_PERCENT_DAMAGE;\n+    sinfo->Effects[1].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ENEMY);\n+    sinfo->Effects[1].ApplyAuraName = SPELL_AURA_NONE;\n+    sinfo->Effects[1].BasePoints = 150;\n+    sinfo->Effects[1].DieSides = 0;\n+    sinfo->Effects[1].BonusMultiplier = 1.f;\n+    sinfo->Effects[1].DamageMultiplier = 1.f;\n+    sinfo->Effects[1].RealPointsPerLevel = 0.f;\n+    sinfo->Effects[1].ValueMultiplier = 1.f;\n+    sinfo->Effects[1].RadiusEntry = nullptr;\n+\n+    //sinfo->Effects[0].Effect = SPELL_EFFECT_APPLY_AURA;\n+    //sinfo->Effects[0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ENEMY);\n+    //sinfo->Effects[0].ApplyAuraName = SPELL_AURA_PERIODIC_DAMAGE;\n+    sinfo->Effects[0].BasePoints = 100;\n+    //sinfo->Effects[0].DieSides = 0;\n+    sinfo->Effects[0].BonusMultiplier = 1.5f;\n+    sinfo->Effects[0].DamageMultiplier = 1.f;\n+    sinfo->Effects[0].RealPointsPerLevel = 10.f;\n+    //sinfo->Effects[0].ValueMultiplier = 1.f;\n+    //sinfo->Effects[0].RadiusEntry = nullptr;\n+    sinfo->Effects[0].Amplitude = 2000;\n+    //26) END BLACK ARROW\n+\n+    //27) DRAIN LIFE\n+    //TODO: balance\n+    spellId = SPELL_DRAIN_LIFE; //17238\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellFamilyName = SPELLFAMILY_WARLOCK;\n+    sinfo->DmgClass = SPELL_DAMAGE_CLASS_MAGIC;\n+    sinfo->SchoolMask = SPELL_SCHOOL_MASK_SHADOW;\n+    sinfo->PreventionType = SPELL_PREVENTION_TYPE_SILENCE;\n+    sinfo->Dispel = DISPEL_NONE;\n+    sinfo->Mechanic = MECHANIC_NONE;\n+    sinfo->SpellLevel = 40;\n+    sinfo->BaseLevel = 40;\n+    sinfo->MaxTargetLevel = 0;\n+    sinfo->CastTimeEntry = nullptr;\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(4); //30 yds\n+    //sinfo->DurationEntry = sSpellDurationStore.LookupEntry(85); //18 sec\n+    sinfo->RecoveryTime = 5000;\n+    sinfo->StartRecoveryCategory = 133;\n+    sinfo->StartRecoveryTime = 1500;\n+    sinfo->ManaCost = 75 * 5;\n+    sinfo->MaxAffectedTargets = 1;\n+    sinfo->AuraInterruptFlags = 0x0;\n+    sinfo->ExplicitTargetMask = TARGET_FLAG_UNIT;\n+    sinfo->Attributes |= SPELL_ATTR0_NO_ACTIVE_DEFENSE;\n+    sinfo->AttributesEx |= SPELL_ATTR1_NO_REDIRECTION | SPELL_ATTR1_NO_REFLECTION;\n+    sinfo->AttributesEx3 |= SPELL_ATTR3_SUPPRESS_TARGET_PROCS | SPELL_ATTR3_ALWAYS_HIT;\n+    sinfo->AttributesEx4 |= SPELL_ATTR4_NO_CAST_LOG;\n+    sinfo->AttributesEx5 |= SPELL_ATTR5_EXTRA_INITIAL_PERIOD;\n+\n+    sinfo->Effects[0].Effect = SPELL_EFFECT_APPLY_AURA;\n+    sinfo->Effects[0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ENEMY);\n+    sinfo->Effects[0].ApplyAuraName = SPELL_AURA_PERIODIC_LEECH;\n+    sinfo->Effects[0].BasePoints = 45;\n+    sinfo->Effects[0].DieSides = 0;\n+    sinfo->Effects[0].BonusMultiplier = 1.f;\n+    sinfo->Effects[0].DamageMultiplier = 1.f;\n+    sinfo->Effects[0].RealPointsPerLevel = 6.f;\n+    sinfo->Effects[0].ValueMultiplier = 2.f;\n+    sinfo->Effects[0].RadiusEntry = nullptr;\n+    sinfo->Effects[0].Amplitude = 1000;\n+    //27) END DRAIN LIFE\n+\n+    //28) SILENCE\n+    //TODO: balance\n+    spellId = SPELL_SILENCE; //29943\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellFamilyName = SPELLFAMILY_WARLOCK;\n+    sinfo->DmgClass = SPELL_DAMAGE_CLASS_NONE;\n+    sinfo->SchoolMask = SPELL_SCHOOL_MASK_SHADOW | SPELL_SCHOOL_MASK_ARCANE;\n+    sinfo->PreventionType = SPELL_PREVENTION_TYPE_SILENCE;\n+    sinfo->Dispel = DISPEL_MAGIC;\n+    sinfo->Mechanic = MECHANIC_SILENCE;\n+    sinfo->SpellLevel = 60;\n+    sinfo->BaseLevel = 60;\n+    sinfo->MaxTargetLevel = 0;\n+    sinfo->CastTimeEntry = sSpellCastTimesStore.LookupEntry(2); //250ms\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(4); //30 yds\n+    //sinfo->DurationEntry = sSpellDurationStore.LookupEntry(85); //18 sec\n+    sinfo->RecoveryTime = 15000;\n+    sinfo->StartRecoveryCategory = 133;\n+    sinfo->StartRecoveryTime = 1500;\n+    sinfo->ManaCost = 75 * 5;\n+    sinfo->MaxAffectedTargets = 5;\n+    sinfo->AuraInterruptFlags = 0x0;\n+    sinfo->ExplicitTargetMask = TARGET_FLAG_UNIT | TARGET_FLAG_DEST_LOCATION;\n+    sinfo->AttributesEx |= SPELL_ATTR1_NO_REFLECTION | SPELL_ATTR1_NO_REDIRECTION;\n+\n+    sinfo->Effects[0].Effect = SPELL_EFFECT_APPLY_AURA;\n+    sinfo->Effects[0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ENEMY);\n+    sinfo->Effects[0].TargetB = SpellImplicitTargetInfo(TARGET_UNIT_DEST_AREA_ENEMY);\n+    sinfo->Effects[0].ApplyAuraName = SPELL_AURA_MOD_SILENCE;\n+    sinfo->Effects[0].BasePoints = 1;\n+    sinfo->Effects[0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_15_YARDS);\n+    //28) END SILENCE\n+\n+    // NECROMANCER\n+    //29) SHADOW BOLT (MAIN_ATTACK)\n+    //TODO: balance\n+    spellId = SPELL_SHADOW_BOLT2; //17509\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellFamilyName = SPELLFAMILY_WARLOCK;\n+    sinfo->SpellLevel = 20;\n+    sinfo->BaseLevel = 20;\n+    sinfo->MaxLevel = 82;\n+    sinfo->ManaCost = 0;\n+    sinfo->ManaCostPercentage = 0;\n+    sinfo->ManaCostPerlevel = 0;\n+    sinfo->CastTimeEntry = nullptr;\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(4); //30 yds\n+    sinfo->SchoolMask = SPELL_SCHOOL_MASK_SHADOW | SPELL_SCHOOL_MASK_ARCANE;\n+    sinfo->Attributes |= SPELL_ATTR0_DO_NOT_SHEATH;\n+\n+    sinfo->Effects[0].BasePoints = 15;\n+    sinfo->Effects[0].DieSides = 9;\n+    sinfo->Effects[0].BonusMultiplier = 0.75f;\n+    sinfo->Effects[0].DamageMultiplier = 1.f;\n+    sinfo->Effects[0].RealPointsPerLevel = 8.f;\n+    sinfo->Effects[0].ValueMultiplier = 1.f;\n+    //29) END SHADOW BOLT (MAIN_ATTACK)\n+\n+    //30) RAISE DEAD\n+    spellId = SPELL_RAISE_DEAD; //34011\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellFamilyName = SPELLFAMILY_WARLOCK;\n+    sinfo->SchoolMask = SPELL_SCHOOL_MASK_SHADOW;\n+    sinfo->InterruptFlags = 0xF;\n+    sinfo->SpellLevel = 20;\n+    sinfo->BaseLevel = 20;\n+    sinfo->MaxTargetLevel = 0;\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(34); //25 yds\n+    sinfo->CastTimeEntry = sSpellCastTimesStore.LookupEntry(3); //500ms\n+    sinfo->RecoveryTime = 8000;\n+    sinfo->StartRecoveryCategory = 133;\n+    sinfo->StartRecoveryTime = 1500;\n+    sinfo->ManaCost = 50 * 5;\n+    sinfo->ManaCostPercentage = 0;\n+    sinfo->ManaCostPerlevel = 0;\n+    sinfo->ExplicitTargetMask = TARGET_FLAG_CORPSE_ENEMY;\n+    sinfo->Attributes |= SPELL_ATTR0_IS_ABILITY | SPELL_ATTR0_DO_NOT_SHEATH;\n+    sinfo->AttributesEx3 |= SPELL_ATTR3_ALWAYS_HIT;\n+\n+    sinfo->Effects[0].Effect = SPELL_EFFECT_DUMMY;\n+    sinfo->Effects[0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ANY);\n+    sinfo->Effects[0].TargetB = SpellImplicitTargetInfo(0);\n+    sinfo->Effects[1].Effect = 0;\n+    sinfo->Effects[2].Effect = 0;\n+    //30) END RAISE DEAD\n+\n+    //31) UNHOLY FRENZY\n+    spellId = SPELL_UNHOLY_FRENZY; //52499\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellFamilyName = SPELLFAMILY_WARLOCK;\n+    sinfo->DmgClass = SPELL_DAMAGE_CLASS_NONE;\n+    sinfo->SchoolMask = SPELL_SCHOOL_MASK_SHADOW;\n+    sinfo->SpellLevel = 30;\n+    sinfo->BaseLevel = 30;\n+    sinfo->MaxTargetLevel = 0;\n+    sinfo->DurationEntry = sSpellDurationStore.LookupEntry(22); //566 - 0 sec //3 - 60 sec //1 - 10 sec //32 - 6 sec //22 - 45 sec\n+    sinfo->RecoveryTime = 2000; //original 1000\n+    sinfo->CategoryEntry = nullptr;\n+    sinfo->StartRecoveryCategory = 133;\n+    sinfo->StartRecoveryTime = 1500;\n+    sinfo->ManaCost = 50 * 5;\n+    sinfo->ManaCostPercentage = 0;\n+    sinfo->ManaCostPerlevel = 0;\n+    sinfo->ExplicitTargetMask = TARGET_FLAG_UNIT;\n+    sinfo->Attributes |= SPELL_ATTR0_IS_ABILITY | SPELL_ATTR0_DO_NOT_SHEATH;\n+    sinfo->AttributesEx |= SPELL_ATTR1_NO_REFLECTION | SPELL_ATTR1_NO_REDIRECTION;\n+    sinfo->AttributesEx2 |= SPELL_ATTR2_CANT_CRIT;\n+    sinfo->AttributesEx3 |= SPELL_ATTR3_ALWAYS_HIT | SPELL_ATTR3_IGNORE_CASTER_MODIFIERS;\n+    sinfo->AttributesEx4 |= SPELL_ATTR4_NO_CAST_LOG;\n+\n+    sinfo->Effects[0].ApplyAuraName = SPELL_AURA_MOD_ATTACKSPEED;\n+    sinfo->Effects[0].BasePoints = 75;\n+    sinfo->Effects[1].Amplitude = 3000;\n+    sinfo->Effects[1].BasePoints = 1;\n+    //31) END UNHOLY FRENZY\n+\n+    //32) CRIPPLE\n+    spellId = SPELL_CRIPPLE; //50379\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellFamilyName = SPELLFAMILY_WARLOCK;\n+    sinfo->DmgClass = SPELL_DAMAGE_CLASS_NONE;\n+    sinfo->Dispel = DISPEL_CURSE; //TODO: check if works\n+    sinfo->SpellLevel = 50;\n+    sinfo->BaseLevel = 50;\n+    sinfo->MaxLevel = 0;\n+    sinfo->MaxTargetLevel = 0;\n+    sinfo->CastTimeEntry = sSpellCastTimesStore.LookupEntry(0); //0ms\n+    sinfo->DurationEntry = sSpellDurationStore.LookupEntry(3); //60 sec\n+    sinfo->RecoveryTime = 10000;\n+    sinfo->CategoryEntry = nullptr;\n+    sinfo->StartRecoveryCategory = 133;\n+    sinfo->StartRecoveryTime = 1500;\n+    sinfo->ManaCost = 175 * 5;\n+    sinfo->ExplicitTargetMask = TARGET_FLAG_UNIT;\n+    sinfo->AttributesEx |= SPELL_ATTR1_NO_REFLECTION | SPELL_ATTR1_NO_REDIRECTION;\n+    sinfo->AttributesEx3 |= SPELL_ATTR3_ALWAYS_HIT;\n+    //32) END CRIPPLE\n+\n+    //33) CORPSE EXPLOSION\n+    spellId = SPELL_CORPSE_EXPLOSION; //61614\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellFamilyName = SPELLFAMILY_WARLOCK;\n+    sinfo->DmgClass = SPELL_DAMAGE_CLASS_NONE;\n+    sinfo->SchoolMask = SPELL_SCHOOL_MASK_SHADOW;\n+    sinfo->TargetCreatureType = 0x0000037F;\n+    sinfo->InterruptFlags = 0xF;\n+    sinfo->SpellLevel = 40;\n+    sinfo->BaseLevel = 40;\n+    sinfo->MaxTargetLevel = 0;\n+    sinfo->DurationEntry = sSpellDurationStore.LookupEntry(21); //-1\n+    sinfo->CastTimeEntry = sSpellCastTimesStore.LookupEntry(110); //750ms\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(3); //20 yds\n+    sinfo->RecoveryTime = 1500;\n+    sinfo->StartRecoveryCategory = 133;\n+    sinfo->StartRecoveryTime = 1500;\n+    sinfo->ManaCost = 100 * 5;\n+    sinfo->ExplicitTargetMask = TARGET_FLAG_CORPSE_ENEMY;\n+    sinfo->Attributes |= SPELL_ATTR0_IS_ABILITY | SPELL_ATTR0_DO_NOT_SHEATH;\n+    sinfo->AttributesEx2 |= SPELL_ATTR2_CANT_CRIT;\n+    sinfo->AttributesEx3 |= SPELL_ATTR3_ALWAYS_HIT | SPELL_ATTR3_IGNORE_CASTER_MODIFIERS;\n+\n+    sinfo->Effects[0].Effect = SPELL_EFFECT_APPLY_AURA;\n+    sinfo->Effects[0].ApplyAuraName = SPELL_AURA_DUMMY;\n+    sinfo->Effects[0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ANY);\n+    sinfo->Effects[0].TargetB = SpellImplicitTargetInfo(0);\n+    sinfo->Effects[0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_10_YARDS);\n+    sinfo->Effects[0].SpellClassMask[0] = 0;\n+    sinfo->Effects[0].BasePoints = 1;\n+    sinfo->Effects[1].Effect = 0;\n+    //33) END CORPSE EXPLOSION\n+\n+    //SEA WITCH\n+    //35) FORKED LIGHTNING\n+    spellId = SPELL_FORKED_LIGHTNING; //63541\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellFamilyName = SPELLFAMILY_MAGE;\n+    sinfo->SchoolMask = SPELL_SCHOOL_MASK_NATURE | SPELL_SCHOOL_MASK_ARCANE;\n+    sinfo->PreventionType = SPELL_PREVENTION_TYPE_SILENCE;\n+    sinfo->InterruptFlags = 0x9;\n+    sinfo->SpellLevel = 4;\n+    sinfo->BaseLevel = 4;\n+    sinfo->CastTimeEntry = sSpellCastTimesStore.LookupEntry(110); //750ms\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(4); //30 yds\n+    sinfo->RecoveryTime = 11000;\n+    sinfo->StartRecoveryCategory = 133;\n+    sinfo->StartRecoveryTime = 1500;\n+    sinfo->ManaCost = 110 * 5;\n+    sinfo->MaxAffectedTargets = 2;\n+    sinfo->Speed = 1000.f;\n+    sinfo->AttributesEx |= SPELL_ATTR1_NO_THREAT;\n+    sinfo->AttributesEx3 |= SPELL_ATTR3_ALWAYS_HIT;\n+    sinfo->AttributesEx5 |= SPELL_ATTR5_AI_DOESNT_FACE_TARGET;\n+    //sinfo->AttributesEx6 |= SPELL_ATTR6_IGNORE_PHASE_SHIFT;\n+\n+    sinfo->Effects[0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_CONE_ENEMY_24);\n+    //sinfo->Effects[0].TargetB = SpellImplicitTargetInfo(TARGET_UNIT_CONE_ENEMY_24);\n+    sinfo->Effects[0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_30_YARDS);\n+    sinfo->Effects[0].BasePoints = 1;\n+    sinfo->Effects[0].DieSides = 49;\n+    sinfo->Effects[0].BonusMultiplier = 0.0f;\n+    sinfo->Effects[0].DamageMultiplier = 1.f;\n+    sinfo->Effects[0].RealPointsPerLevel = 15.f;\n+    sinfo->Effects[0].ValueMultiplier = 1.f;\n+    //35) END FORKED LIGHTNING\n+\n+    //36) FORKED LIGHTNING EFFECT\n+    spellId = SPELL_FORKED_LIGHTNING_EFFECT; //50900\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellFamilyName = SPELLFAMILY_MAGE;\n+    sinfo->SchoolMask = SPELL_SCHOOL_MASK_NATURE | SPELL_SCHOOL_MASK_ARCANE;\n+    sinfo->Dispel = DISPEL_MAGIC;\n+    sinfo->Mechanic = MECHANIC_STUN;\n+    sinfo->DurationEntry = sSpellDurationStore.LookupEntry(39); //2000ms\n+    sinfo->CastTimeEntry = sSpellCastTimesStore.LookupEntry(1); //instant\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(6); //100 yds\n+    sinfo->ManaCost = 0;\n+    sinfo->AttributesEx3 |= SPELL_ATTR3_ALWAYS_HIT;\n+    sinfo->AttributesEx5 |= SPELL_ATTR5_AI_DOESNT_FACE_TARGET;\n+    sinfo->AttributesEx6 |= SPELL_ATTR6_IGNORE_PHASE_SHIFT;\n+\n+    sinfo->Effects[0].Effect = SPELL_EFFECT_APPLY_AURA;\n+    sinfo->Effects[0].ApplyAuraName = SPELL_AURA_MOD_STUN;\n+    sinfo->Effects[0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ENEMY);\n+    sinfo->Effects[0].RadiusEntry = nullptr;\n+    //36) END FORKED LIGHTNING EFFECT\n+\n+    //37) FROST ARROW\n+    spellId = SPELL_FROST_ARROW; //38942\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellFamilyName = SPELLFAMILY_MAGE;\n+    //sinfo->SpellFamilyFlags[0] = 0x0;\n+    sinfo->SpellFamilyFlags[1] = 0x4; //custom, not present in db\n+    //sinfo->SpellFamilyFlags[2] = 0x0;\n+    sinfo->DmgClass = SPELL_DAMAGE_CLASS_RANGED;\n+    sinfo->SchoolMask = SPELL_SCHOOL_MASK_FROST | SPELL_SCHOOL_MASK_ARCANE;\n+    sinfo->PreventionType = SPELL_PREVENTION_TYPE_PACIFY;\n+    sinfo->Dispel = DISPEL_NONE;\n+    sinfo->Mechanic = MECHANIC_NONE;\n+    sinfo->SpellLevel = 4;\n+    sinfo->BaseLevel = 4;\n+    sinfo->MaxTargetLevel = 0;\n+    sinfo->CastTimeEntry = sSpellCastTimesStore.LookupEntry(110); //750ms\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(35); //0-35 yds\n+    sinfo->DurationEntry = nullptr;\n+    sinfo->RecoveryTime = 0;\n+    sinfo->StartRecoveryCategory = 133;\n+    sinfo->StartRecoveryTime = 750;\n+    sinfo->PowerType = POWER_MANA;\n+    sinfo->ManaCost = 10 * 5;\n+    sinfo->MaxAffectedTargets = 1;\n+    sinfo->AuraInterruptFlags = AURA_INTERRUPT_FLAG_CHANGE_MAP;\n+    sinfo->ExplicitTargetMask = TARGET_FLAG_UNIT;\n+    sinfo->Attributes |= SPELL_ATTR0_NO_ACTIVE_DEFENSE | SPELL_ATTR0_DO_NOT_SHEATH;\n+    sinfo->Attributes &= ~(SPELL_ATTR0_USES_RANGED_SLOT);\n+    sinfo->AttributesEx |= SPELL_ATTR1_NO_REDIRECTION | SPELL_ATTR1_NO_REFLECTION;\n+    sinfo->AttributesEx2 |= SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS/* | SPELL_ATTR2_CANT_CRIT*/;\n+    sinfo->AttributesEx4 |= SPELL_ATTR4_NO_CAST_LOG;\n+    sinfo->AttributesEx4 &= ~(SPELL_ATTR4_FORCE_DISPLAY_CASTBAR);\n+\n+    sinfo->Effects[0].Effect = SPELL_EFFECT_WEAPON_DAMAGE;\n+    sinfo->Effects[0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ENEMY);\n+    sinfo->Effects[0].BasePoints = 10;\n+    sinfo->Effects[0].DieSides = 0;\n+    sinfo->Effects[0].BonusMultiplier = 0.5f;\n+    sinfo->Effects[0].DamageMultiplier = 1.f;\n+    sinfo->Effects[0].RealPointsPerLevel = 2.f;\n+    sinfo->Effects[0].ValueMultiplier = 1.f;\n+    sinfo->Effects[0].RadiusEntry = nullptr;\n+    sinfo->Effects[1].Effect = 0;\n+    //37) END FROST ARROW\n+\n+    //38) FROST ARROW EFFECT\n+    spellId = SPELL_FROST_ARROW_EFFECT; //56095\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellFamilyName = SPELLFAMILY_GENERIC;\n+    //sinfo->SpellFamilyFlags[0] = 0x0;\n+    sinfo->SpellFamilyFlags[1] = 0x4; //custom, not present in db\n+    //sinfo->SpellFamilyFlags[2] = 0x0;\n+    sinfo->SchoolMask = SPELL_SCHOOL_MASK_FROST | SPELL_SCHOOL_MASK_ARCANE;\n+    sinfo->Dispel = DISPEL_MAGIC;\n+    sinfo->Mechanic = MECHANIC_SNARE;\n+    sinfo->Attributes &= ~(SPELL_ATTR0_TRACK_TARGET_IN_CAST_PLAYER_ONLY);\n+    sinfo->AttributesEx |= SPELL_ATTR1_NO_REDIRECTION | SPELL_ATTR1_NO_REFLECTION;\n+    sinfo->AttributesEx4 |= SPELL_ATTR4_NO_CAST_LOG;\n+\n+    sinfo->Effects[0].Effect = SPELL_EFFECT_APPLY_AURA;\n+    sinfo->Effects[0].ApplyAuraName = SPELL_AURA_MOD_SPEED_SLOW_ALL;\n+    sinfo->Effects[0].Mechanic = MECHANIC_SLOW_ATTACK;\n+    sinfo->Effects[0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_CASTER);\n+    sinfo->Effects[0].BasePoints = -30;\n+    sinfo->Effects[0].DieSides = 0;\n+    sinfo->Effects[0].BonusMultiplier = 1.f;\n+    sinfo->Effects[0].DamageMultiplier = 1.f;\n+    sinfo->Effects[0].RealPointsPerLevel = 0.f;\n+    sinfo->Effects[0].ValueMultiplier = 1.f;\n+    sinfo->Effects[0].RadiusEntry = nullptr;\n+    sinfo->Effects[1].Effect = SPELL_EFFECT_APPLY_AURA;\n+    sinfo->Effects[1].ApplyAuraName = SPELL_AURA_MOD_DECREASE_SPEED;\n+    sinfo->Effects[1].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_CASTER);\n+    sinfo->Effects[1].BasePoints = -30;\n+    sinfo->Effects[1].DieSides = 0;\n+    sinfo->Effects[1].BonusMultiplier = 1.f;\n+    sinfo->Effects[1].DamageMultiplier = 1.f;\n+    sinfo->Effects[1].RealPointsPerLevel = 0.f;\n+    sinfo->Effects[1].ValueMultiplier = 1.f;\n+    sinfo->Effects[1].RadiusEntry = nullptr;\n+    //38) END FROST ARROW EFFECT\n+\n+    //39) MANA SHIELD\n+    spellId = SPELL_MANA_SHIELD; //35064\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->Dispel = DISPEL_NONE;\n+    sinfo->PreventionType = SPELL_PREVENTION_TYPE_NONE;\n+    sinfo->SpellLevel = 0;\n+    sinfo->BaseLevel = 0;\n+    sinfo->MaxTargetLevel = 0;\n+    sinfo->DurationEntry = sSpellDurationStore.LookupEntry(21); //-1\n+    sinfo->RecoveryTime = 10000;\n+    sinfo->StartRecoveryCategory = 133;\n+    sinfo->StartRecoveryTime = 1500;\n+    sinfo->Attributes |= SPELL_ATTR0_IS_ABILITY | SPELL_ATTR0_DO_NOT_SHEATH | SPELL_ATTR0_COOLDOWN_ON_EVENT;\n+    sinfo->AttributesEx3 |= SPELL_ATTR3_ALWAYS_HIT | SPELL_ATTR3_IGNORE_CASTER_MODIFIERS;\n+    sinfo->AttributesEx4 |= SPELL_ATTR4_CANNOT_BE_STOLEN;\n+\n+    sinfo->Effects[0].BasePoints = 1000000000;\n+    sinfo->Effects[0].ValueMultiplier = 10.f;\n+    //39) END MANA SHIELD\n+\n+    //40) TORNADO\n+    spellId = SPELL_TORNADO; //34695\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellFamilyName = SPELLFAMILY_MAGE;\n+    sinfo->SchoolMask = SPELL_SCHOOL_MASK_NATURE | SPELL_SCHOOL_MASK_ARCANE;\n+    sinfo->InterruptFlags = 0x9;\n+    sinfo->SpellLevel = 60;\n+    sinfo->BaseLevel = 60;\n+    sinfo->MaxTargetLevel = 0;\n+    sinfo->DurationEntry = nullptr;\n+    sinfo->CastTimeEntry = sSpellCastTimesStore.LookupEntry(15); //4000ms\n+    //sinfo->RangeEntry = sSpellRangeStore.LookupEntry(5); //40 yds\n+    sinfo->RecoveryTime = 120000;\n+    sinfo->StartRecoveryCategory = 133;\n+    sinfo->StartRecoveryTime = 1500;\n+    sinfo->ManaCost = 250 * 5;\n+    sinfo->ExplicitTargetMask = TARGET_FLAG_DEST_LOCATION;\n+    sinfo->Attributes |= SPELL_ATTR0_IS_ABILITY | SPELL_ATTR0_DO_NOT_SHEATH | SPELL_ATTR0_ONLY_OUTDOORS;\n+    sinfo->AttributesEx2 |= SPELL_ATTR2_CANT_CRIT | SPELL_ATTR2_IGNORE_LINE_OF_SIGHT;\n+    sinfo->AttributesEx3 |= SPELL_ATTR3_ALWAYS_HIT | SPELL_ATTR3_IGNORE_CASTER_MODIFIERS;\n+    sinfo->AttributesEx3 &= ~(SPELL_ATTR3_ONLY_ON_PLAYER);\n+    sinfo->AttributesEx4 = 0;\n+\n+    sinfo->Effects[0].Effect = SPELL_EFFECT_DUMMY;\n+    sinfo->Effects[0].TargetA = SpellImplicitTargetInfo(TARGET_DEST_DEST);\n+    sinfo->Effects[0].TargetB = SpellImplicitTargetInfo(0);\n+    sinfo->Effects[0].RadiusEntry = nullptr;\n+    sinfo->Effects[0].BasePoints = 1;\n+    sinfo->Effects[0].TriggerSpell = 0;\n+    sinfo->Effects[0].Amplitude = 0;\n+    sinfo->Effects[1].Effect = 0;\n+    //40) END TORNADO\n+\n+    //41) TORNADO EFFECT\n+    spellId = SPELL_TORNADO_EFFECT; //21990\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellFamilyName = SPELLFAMILY_MAGE;\n+    //sinfo->SpellFamilyFlags[0] = 0x0;\n+    sinfo->SpellFamilyFlags[1] = 0x4; //custom, not present in db\n+    //sinfo->SpellFamilyFlags[2] = 0x0;\n+    sinfo->SchoolMask = SPELL_SCHOOL_MASK_NATURE | SPELL_SCHOOL_MASK_ARCANE;\n+    sinfo->Dispel = DISPEL_MAGIC;\n+    sinfo->Mechanic = MECHANIC_NONE; //MECHANIC_KNOCKOUT\n+    sinfo->InterruptFlags = 0x0;\n+    sinfo->SpellLevel = 60;\n+    sinfo->BaseLevel = 60;\n+    sinfo->MaxTargetLevel = 0;\n+    sinfo->DurationEntry = sSpellDurationStore.LookupEntry(29); //12000ms\n+    sinfo->CastTimeEntry = sSpellCastTimesStore.LookupEntry(1); //0ms\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(2); //5 yds\n+    sinfo->RecoveryTime = 3000;\n+    //sinfo->StartRecoveryCategory = 133;\n+    //sinfo->StartRecoveryTime = 1500;\n+    //sinfo->ManaCost = 250 * 5;\n+    sinfo->MaxAffectedTargets = 1;\n+    sinfo->ExplicitTargetMask = TARGET_FLAG_UNIT;\n+    sinfo->Attributes |= SPELL_ATTR0_IS_ABILITY | SPELL_ATTR0_DO_NOT_SHEATH | SPELL_ATTR0_ONLY_OUTDOORS;\n+    sinfo->Attributes &= ~(SPELL_ATTR0_HEARTBEAT_RESIST);\n+    sinfo->AttributesEx2 |= SPELL_ATTR2_CANT_CRIT | SPELL_ATTR2_IGNORE_LINE_OF_SIGHT;\n+    sinfo->AttributesEx3 |= SPELL_ATTR3_ALWAYS_HIT | SPELL_ATTR3_IGNORE_CASTER_MODIFIERS;\n+    sinfo->AttributesEx3 &= ~(SPELL_ATTR3_ONLY_ON_PLAYER);\n+    sinfo->AttributesEx4 = 0;\n+    sinfo->AttributesEx5 = 0;\n+\n+    //sinfo->Effects[0].Effect = SPELL_EFFECT_DUMMY;\n+    //sinfo->Effects[0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ENEMY);\n+    //sinfo->Effects[0].TargetB = SpellImplicitTargetInfo(0);\n+    //sinfo->Effects[0].RadiusEntry = nullptr;\n+    //sinfo->Effects[0].BasePoints = 1;\n+    //sinfo->Effects[0].TriggerSpell = 0;\n+    //sinfo->Effects[0].Amplitude = 0;\n+    sinfo->Effects[1].Effect = SPELL_EFFECT_APPLY_AURA;\n+    sinfo->Effects[1].ApplyAuraName = SPELL_AURA_MOD_RESISTANCE_PCT;\n+    sinfo->Effects[1].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ENEMY);\n+    sinfo->Effects[1].TargetB = SpellImplicitTargetInfo(0);\n+    sinfo->Effects[1].BasePoints = -100;\n+    sinfo->Effects[1].MiscValue = SPELL_SCHOOL_MASK_ALL;\n+    sinfo->Effects[2].Effect = SPELL_EFFECT_APPLY_AURA;\n+    sinfo->Effects[2].ApplyAuraName = SPELL_AURA_PERIODIC_DAMAGE;\n+    sinfo->Effects[2].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ENEMY);\n+    sinfo->Effects[2].TargetB = SpellImplicitTargetInfo(0);\n+    sinfo->Effects[2].BasePoints = 212;\n+    sinfo->Effects[2].DieSides = 183;\n+    sinfo->Effects[2].RealPointsPerLevel = 35.f;\n+    sinfo->Effects[2].BonusMultiplier = 0.25f;\n+    sinfo->Effects[2].Amplitude = 1500;\n+    //41) END TORNADO EFFECT\n+\n+    //42) TORNADO EFFECT2\n+    spellId = SPELL_TORNADO_EFFECT2; //34683\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellFamilyName = SPELLFAMILY_MAGE;\n+    //sinfo->SpellFamilyFlags[0] = 0x0;\n+    //sinfo->SpellFamilyFlags[1] = 0x4; //custom, not present in db\n+    //sinfo->SpellFamilyFlags[2] = 0x0;\n+    sinfo->SchoolMask = SPELL_SCHOOL_MASK_NATURE | SPELL_SCHOOL_MASK_ARCANE;\n+    //sinfo->Dispel = DISPEL_MAGIC;\n+    //sinfo->Mechanic = MECHANIC_DISORIENTED;\n+    sinfo->ProcFlags = 0;\n+    sinfo->InterruptFlags = 0x0;\n+    sinfo->SpellLevel = 60;\n+    sinfo->BaseLevel = 60;\n+    sinfo->MaxTargetLevel = 0;\n+    sinfo->DurationEntry = nullptr;\n+    //sinfo->CastTimeEntry = sSpellCastTimesStore.LookupEntry(1); //0ms\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(7); //10 yds\n+    sinfo->RecoveryTime = 4500;\n+    //sinfo->StartRecoveryCategory = 133;\n+    //sinfo->StartRecoveryTime = 1500;\n+    //sinfo->ManaCost = 250 * 5;\n+    sinfo->MaxAffectedTargets = 1;\n+    sinfo->ExplicitTargetMask = TARGET_FLAG_UNIT;\n+    sinfo->Attributes |= SPELL_ATTR0_DO_NOT_SHEATH | SPELL_ATTR0_ONLY_OUTDOORS;\n+    sinfo->Attributes &= ~(SPELL_ATTR0_WEARER_CASTS_PROC_TRIGGER);\n+    sinfo->AttributesEx2 |= SPELL_ATTR2_IGNORE_LINE_OF_SIGHT;\n+    sinfo->AttributesEx3 |= SPELL_ATTR3_ALWAYS_HIT;\n+    sinfo->AttributesEx4 = 0;\n+    sinfo->AttributesEx5 = 0;\n+\n+    sinfo->Effects[0].Effect = SPELL_EFFECT_SCHOOL_DAMAGE;\n+    sinfo->Effects[0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ENEMY);\n+    sinfo->Effects[0].TargetB = SpellImplicitTargetInfo(0);\n+    //sinfo->Effects[0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_10_YARDS);\n+    sinfo->Effects[0].BasePoints = 541;\n+    sinfo->Effects[0].DieSides = 215;\n+    sinfo->Effects[0].RealPointsPerLevel = 40.f;\n+    sinfo->Effects[0].BonusMultiplier = 0.5f;\n+    //42) END TORNADO EFFECT2\n+\n+    //43) TORNADO EFFECT3\n+    spellId = SPELL_TORNADO_EFFECT3; //39261\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellFamilyName = SPELLFAMILY_MAGE;\n+    //sinfo->SpellFamilyFlags[0] = 0x0;\n+    //sinfo->SpellFamilyFlags[1] = 0x4; //custom, not present in db\n+    //sinfo->SpellFamilyFlags[2] = 0x0;\n+    sinfo->SchoolMask = SPELL_SCHOOL_MASK_NATURE | SPELL_SCHOOL_MASK_ARCANE;\n+    //sinfo->Dispel = DISPEL_NONE;\n+    //sinfo->Mechanic = MECHANIC_DISORIENTED;\n+    //sinfo->ProcFlags = 0;\n+    //sinfo->InterruptFlags = 0x0;\n+    sinfo->SpellLevel = 0;\n+    sinfo->BaseLevel = 0;\n+    //sinfo->MaxTargetLevel = 0;\n+    sinfo->DurationEntry = sSpellDurationStore.LookupEntry(21); //-1\n+    //sinfo->CastTimeEntry = sSpellCastTimesStore.LookupEntry(1); //0ms\n+    //sinfo->RangeEntry = sSpellRangeStore.LookupEntry(1); //self\n+    //sinfo->RecoveryTime = 4500;\n+    //sinfo->StartRecoveryCategory = 133;\n+    //sinfo->StartRecoveryTime = 1500;\n+    //sinfo->ManaCost = 250 * 5;\n+    //sinfo->MaxAffectedTargets = 1;\n+    //sinfo->ExplicitTargetMask = TARGET_FLAG_UNIT;\n+    sinfo->Attributes |= SPELL_ATTR0_DO_NOT_SHEATH | SPELL_ATTR0_ONLY_OUTDOORS;\n+    sinfo->AttributesEx |= SPELL_ATTR1_NO_THREAT;\n+    sinfo->AttributesEx2 |= SPELL_ATTR2_IGNORE_LINE_OF_SIGHT;\n+    sinfo->AttributesEx3 |= SPELL_ATTR3_ALWAYS_HIT;\n+    sinfo->AttributesEx4 = 0;\n+    sinfo->AttributesEx5 = 0;\n+\n+    sinfo->Effects[0].Effect = SPELL_EFFECT_APPLY_AREA_AURA_ENEMY;\n+    //sinfo->Effects[0].ApplyAuraName = SPELL_AURA_MOD_DECREASE_SPEED;\n+    //sinfo->Effects[0].TargetA = SpellImplicitTargetInfo(TARGET_SRC_CASTER);\n+    //sinfo->Effects[0].TargetB = SpellImplicitTargetInfo(TARGET_UNIT_SRC_AREA_ENEMY);\n+    sinfo->Effects[0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_5_YARDS);\n+    //sinfo->Effects[0].BasePoints = -50;\n+    sinfo->Effects[1].Effect = SPELL_EFFECT_APPLY_AREA_AURA_ENEMY;\n+    sinfo->Effects[1].ApplyAuraName = SPELL_AURA_MOD_DECREASE_SPEED;\n+    sinfo->Effects[1].TargetA = SpellImplicitTargetInfo(TARGET_SRC_CASTER);\n+    sinfo->Effects[1].TargetB = SpellImplicitTargetInfo(TARGET_UNIT_SRC_AREA_ENEMY);\n+    sinfo->Effects[1].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_5_YARDS);\n+    sinfo->Effects[1].BasePoints = -60;\n+    //sinfo->AttributesCu &= ~(SPELL_ATTR0_CU_NEGATIVE_EFF1);\n+    //43) END TORNADO EFFECT3\n+\n+    //44) SHOOT\n+    spellId = SPELL_SHOOT_BOW; //41188\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellFamilyName = SPELLFAMILY_MAGE;\n+    sinfo->DmgClass = SPELL_DAMAGE_CLASS_RANGED;\n+    sinfo->PreventionType = SPELL_PREVENTION_TYPE_PACIFY;\n+    sinfo->SpellLevel = 1;\n+    sinfo->BaseLevel = 1;\n+    sinfo->CategoryEntry = sSpellCategoryStore.LookupEntry(76);\n+    sinfo->CastTimeEntry = sSpellCastTimesStore.LookupEntry(110); //750ms\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(35); //0-35 yds\n+    sinfo->StartRecoveryCategory = 133;\n+    sinfo->StartRecoveryTime = 750;\n+    sinfo->ExplicitTargetMask = TARGET_FLAG_UNIT;\n+    sinfo->Attributes |= SPELL_ATTR0_NO_ACTIVE_DEFENSE/* | SPELL_ATTR0_DO_NOT_SHEATH*/;\n+    sinfo->Attributes &= ~(SPELL_ATTR0_USES_RANGED_SLOT/* | SPELL_ATTR0_IS_ABILITY*/ | SPELL_ATTR0_TRACK_TARGET_IN_CAST_PLAYER_ONLY | SPELL_ATTR0_SCALES_WITH_CREATURE_LEVEL | SPELL_ATTR0_NO_IMMUNITIES);\n+    sinfo->AttributesEx |= SPELL_ATTR1_NO_REDIRECTION | SPELL_ATTR1_NO_REFLECTION;\n+    sinfo->AttributesEx &= ~(SPELL_ATTR1_TRACK_TARGET_IN_CHANNEL | SPELL_ATTR1_NO_THREAT);\n+    sinfo->AttributesEx2 |= SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS;\n+    sinfo->AttributesEx2 &= ~(SPELL_ATTR2_IGNORE_LINE_OF_SIGHT);\n+    sinfo->AttributesEx3 |= SPELL_ATTR3_NORMAL_RANGED_ATTACK;\n+\n+    sinfo->Effects[0].Effect = SPELL_EFFECT_WEAPON_PERCENT_DAMAGE;\n+    sinfo->Effects[0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ENEMY);\n+    sinfo->Effects[0].TargetB = SpellImplicitTargetInfo(0);\n+    sinfo->Effects[0].BasePoints = 100;\n+    sinfo->Effects[0].DieSides = 0;\n+    sinfo->Effects[0].BonusMultiplier = 1.f;\n+    //44) END SHOOT\n+\n+    //CRYPT LORD\n+    //45) IMPALE\n+    spellId = SPELL_IMPALE; //53458\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellFamilyName = SPELLFAMILY_WARRIOR;\n+    sinfo->PreventionType = SPELL_PREVENTION_TYPE_PACIFY;\n+    sinfo->SpellLevel = 20;\n+    sinfo->BaseLevel = 20;\n+    sinfo->CategoryEntry = nullptr;\n+    sinfo->RecoveryTime = 9000;\n+    sinfo->CategoryRecoveryTime = 0;\n+    sinfo->StartRecoveryCategory = 133;\n+    sinfo->StartRecoveryTime = 1500;\n+    sinfo->PowerType = POWER_MANA;\n+    sinfo->ManaCost = 100 * 5;\n+    sinfo->MaxAffectedTargets = 0;\n+    sinfo->InterruptFlags = 0x1;\n+    sinfo->ChannelInterruptFlags = 0x0;\n+    sinfo->CastTimeEntry = sSpellCastTimesStore.LookupEntry(1); //0\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(5); //40 yds\n+    sinfo->DurationEntry = sSpellDurationStore.LookupEntry(592); //400ms\n+    sinfo->ExplicitTargetMask = TARGET_FLAG_UNIT;\n+    sinfo->Attributes |= SPELL_ATTR0_DO_NOT_DISPLAY | SPELL_ATTR0_IS_ABILITY;\n+    sinfo->AttributesEx |= SPELL_ATTR1_IS_SELF_CHANNELED | SPELL_ATTR1_TRACK_TARGET_IN_CHANNEL | SPELL_ATTR1_NO_THREAT;\n+    sinfo->AttributesEx2 |= SPELL_ATTR2_IGNORE_LINE_OF_SIGHT;\n+    sinfo->AttributesEx3 |= SPELL_ATTR3_SUPPRESS_TARGET_PROCS;\n+\n+    sinfo->Effects[0].Effect = SPELL_EFFECT_APPLY_AURA;\n+    sinfo->Effects[0].ApplyAuraName = SPELL_AURA_DUMMY;\n+    sinfo->Effects[0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_CONE_ENEMY_24);\n+    sinfo->Effects[0].TargetB = SpellImplicitTargetInfo(0);\n+    sinfo->Effects[0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_40_YARDS);\n+    sinfo->Effects[0].MiscValue = 0;\n+    sinfo->Effects[0].MiscValueB = 0;\n+    sinfo->Effects[0].BasePoints = 1;\n+    sinfo->Effects[0].Amplitude = 0;\n+    sinfo->Effects[0].RealPointsPerLevel = 0.0f;\n+    sinfo->Effects[0].DieSides = 0;\n+    sinfo->Effects[0].DamageMultiplier = 0.0f;\n+    sinfo->Effects[0].BonusMultiplier = 0.0f;\n+\n+    sinfo->Effects[1].Effect = SPELL_EFFECT_APPLY_AURA;\n+    sinfo->Effects[1].ApplyAuraName = SPELL_AURA_DUMMY;\n+    sinfo->Effects[1].TargetA = SpellImplicitTargetInfo(TARGET_SRC_CASTER);\n+    sinfo->Effects[1].TargetB = SpellImplicitTargetInfo(TARGET_UNIT_SRC_AREA_ENEMY);\n+    sinfo->Effects[1].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_8_YARDS);\n+    sinfo->Effects[1].MiscValue = 0;\n+    sinfo->Effects[1].MiscValueB = 0;\n+    sinfo->Effects[1].BasePoints = 1;\n+    sinfo->Effects[1].Amplitude = 0;\n+    sinfo->Effects[1].RealPointsPerLevel = 0.0f;\n+    sinfo->Effects[1].DieSides = 0;\n+    sinfo->Effects[1].DamageMultiplier = 0.0f;\n+    sinfo->Effects[1].BonusMultiplier = 0.0f;\n+    //45) END IMPALE\n+\n+    //46) IMPALE DAMAGE\n+    spellId = SPELL_IMPALE_DAMAGE; //53454\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellFamilyName = SPELLFAMILY_WARRIOR;\n+    sinfo->PreventionType = SPELL_PREVENTION_TYPE_NONE;\n+    sinfo->SpellLevel = 20;\n+    sinfo->BaseLevel = 20;\n+    sinfo->CategoryEntry = nullptr;\n+    sinfo->RecoveryTime = 0;\n+    sinfo->CategoryRecoveryTime = 0;\n+    sinfo->StartRecoveryCategory = 0;\n+    sinfo->StartRecoveryTime = 0;\n+    sinfo->PowerType = POWER_MANA;\n+    sinfo->ManaCost = 0;\n+    sinfo->MaxAffectedTargets = 1;\n+    sinfo->ChannelInterruptFlags = 0;\n+    sinfo->CastTimeEntry = sSpellCastTimesStore.LookupEntry(1); //0\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(36); //45 yds\n+    sinfo->DurationEntry = sSpellDurationStore.LookupEntry(32); //6000ms\n+    sinfo->ExplicitTargetMask = TARGET_FLAG_UNIT_ENEMY;\n+    sinfo->Attributes |= SPELL_ATTR0_IS_ABILITY | SPELL_ATTR0_DO_NOT_SHEATH | SPELL_ATTR0_ALLOW_CAST_WHILE_DEAD | SPELL_ATTR0_ALLOW_WHILE_SITTING;\n+    sinfo->AttributesEx |= SPELL_ATTR1_NO_REFLECTION | SPELL_ATTR1_NO_REDIRECTION;\n+    sinfo->AttributesEx2 |= SPELL_ATTR2_IGNORE_LINE_OF_SIGHT;\n+    sinfo->AttributesEx3 |= SPELL_ATTR3_ALWAYS_HIT;\n+    sinfo->AttributesEx5 |= SPELL_ATTR5_ALLOW_WHILE_STUNNED;\n+    sinfo->AttributesEx6 |= SPELL_ATTR6_ALLOW_WHILE_RIDING_VEHICLE | SPELL_ATTR6_IGNORE_PHASE_SHIFT;\n+\n+    sinfo->Effects[0].Effect = SPELL_EFFECT_SCHOOL_DAMAGE;\n+    sinfo->Effects[0].ApplyAuraName = SPELL_AURA_NONE;\n+    sinfo->Effects[0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ENEMY);\n+    sinfo->Effects[0].TargetB = SpellImplicitTargetInfo(0);\n+    sinfo->Effects[0].RadiusEntry = nullptr;\n+    sinfo->Effects[0].MiscValue = 0;\n+    sinfo->Effects[0].MiscValueB = 0;\n+    sinfo->Effects[0].BasePoints = 150;\n+    sinfo->Effects[0].Amplitude = 0;\n+    sinfo->Effects[0].RealPointsPerLevel = 35.0f;\n+    sinfo->Effects[0].DieSides = 200;\n+    sinfo->Effects[0].DamageMultiplier = 0.0f;\n+    sinfo->Effects[0].BonusMultiplier = 0.0f;\n+\n+    sinfo->Effects[1].Effect = SPELL_EFFECT_KNOCK_BACK;\n+    sinfo->Effects[1].ApplyAuraName = SPELL_AURA_NONE;\n+    sinfo->Effects[1].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ENEMY);\n+    sinfo->Effects[1].TargetB = SpellImplicitTargetInfo(0);\n+    sinfo->Effects[1].RadiusEntry = nullptr;\n+    sinfo->Effects[1].Mechanic = MECHANIC_KNOCKOUT;\n+    sinfo->Effects[1].MiscValue = 5;\n+    sinfo->Effects[1].MiscValueB = 0;\n+    sinfo->Effects[1].BasePoints = 180;\n+    sinfo->Effects[1].Amplitude = 0;\n+    sinfo->Effects[1].RealPointsPerLevel = 0.0;\n+    sinfo->Effects[1].DieSides = 0;\n+    sinfo->Effects[1].DamageMultiplier = 0.0f;\n+    sinfo->Effects[1].BonusMultiplier = 0.0f;\n+\n+    sinfo->Effects[2].Effect = SPELL_EFFECT_APPLY_AURA;\n+    sinfo->Effects[2].ApplyAuraName = SPELL_AURA_MOD_STUN;\n+    //sinfo->Effects[2].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ENEMY);\n+    //sinfo->Effects[2].TargetB = SpellImplicitTargetInfo(0);\n+    sinfo->Effects[2].TargetA = sinfo->Effects[0].TargetA;\n+    sinfo->Effects[2].TargetB = sinfo->Effects[0].TargetB;\n+    sinfo->Effects[2].RadiusEntry = nullptr;\n+    sinfo->Effects[2].Mechanic = MECHANIC_NONE;\n+    sinfo->Effects[2].MiscValue = 0;\n+    sinfo->Effects[2].MiscValueB = 0;\n+    sinfo->Effects[2].BasePoints = 1;\n+    sinfo->Effects[2].Amplitude = 0;\n+    sinfo->Effects[2].RealPointsPerLevel = 0.0;\n+    sinfo->Effects[2].DieSides = 0;\n+    sinfo->Effects[2].DamageMultiplier = 0.0f;\n+    sinfo->Effects[2].BonusMultiplier = 0.0f;\n+    //46) END IMPALE DAMAGE\n+\n+    //47) IMPALE VISUAL\n+    spellId = SPELL_IMPALE_VISUAL; //53454\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellFamilyName = SPELLFAMILY_WARRIOR;\n+    sinfo->PreventionType = SPELL_PREVENTION_TYPE_NONE;\n+    sinfo->SpellLevel = 20;\n+    sinfo->BaseLevel = 20;\n+    sinfo->CategoryEntry = nullptr;\n+    sinfo->RecoveryTime = 0;\n+    sinfo->CategoryRecoveryTime = 0;\n+    sinfo->StartRecoveryCategory = 0;\n+    sinfo->StartRecoveryTime = 0;\n+    sinfo->PowerType = POWER_MANA;\n+    sinfo->ManaCost = 0;\n+    sinfo->MaxAffectedTargets = 1;\n+    sinfo->ChannelInterruptFlags = 0;\n+    sinfo->CastTimeEntry = sSpellCastTimesStore.LookupEntry(1); //0\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(36); //45 yds\n+    sinfo->ExplicitTargetMask = TARGET_FLAG_DEST_LOCATION;\n+    sinfo->Attributes |= SPELL_ATTR0_IS_ABILITY | SPELL_ATTR0_DO_NOT_SHEATH | SPELL_ATTR0_ALLOW_CAST_WHILE_DEAD | SPELL_ATTR0_ALLOW_WHILE_SITTING;\n+    sinfo->AttributesEx |= SPELL_ATTR1_NO_REFLECTION | SPELL_ATTR1_NO_REDIRECTION | SPELL_ATTR1_NO_THREAT;\n+    sinfo->AttributesEx2 |= SPELL_ATTR2_IGNORE_LINE_OF_SIGHT;\n+    sinfo->AttributesEx3 |= SPELL_ATTR3_ALWAYS_HIT | SPELL_ATTR3_SUPPRESS_TARGET_PROCS;\n+    sinfo->AttributesEx5 |= SPELL_ATTR5_ALLOW_WHILE_STUNNED;\n+    sinfo->AttributesEx6 |= SPELL_ATTR6_ALLOW_WHILE_RIDING_VEHICLE | SPELL_ATTR6_IGNORE_PHASE_SHIFT;\n+\n+    sinfo->Effects[0].Effect = SPELL_EFFECT_DUMMY;\n+    sinfo->Effects[0].ApplyAuraName = SPELL_AURA_NONE;\n+    sinfo->Effects[0].TargetA = SpellImplicitTargetInfo(TARGET_DEST_DEST);\n+    sinfo->Effects[0].TargetB = SpellImplicitTargetInfo(0);\n+    sinfo->Effects[0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_0_5_YARDS);\n+    sinfo->Effects[0].MiscValue = 0;\n+    sinfo->Effects[0].MiscValueB = 0;\n+    sinfo->Effects[0].BasePoints = 1;\n+    sinfo->Effects[0].Amplitude = 0;\n+    sinfo->Effects[0].RealPointsPerLevel = 0.0f;\n+    sinfo->Effects[0].DieSides = 0;\n+    sinfo->Effects[0].DamageMultiplier = 0.0f;\n+    sinfo->Effects[0].BonusMultiplier = 0.0f;\n+\n+    sinfo->Effects[1].Effect = 0;\n+    sinfo->Effects[1].ApplyAuraName = SPELL_AURA_NONE;\n+    sinfo->Effects[1].TargetA = SpellImplicitTargetInfo(0);\n+    sinfo->Effects[1].TargetB = SpellImplicitTargetInfo(0);\n+    sinfo->Effects[1].RadiusEntry = nullptr;\n+    sinfo->Effects[1].MiscValueB = 0;\n+    sinfo->Effects[1].BasePoints = 0;\n+    sinfo->Effects[1].Amplitude = 0;\n+    sinfo->Effects[1].RealPointsPerLevel = 0.0;\n+    sinfo->Effects[1].DieSides = 0;\n+    sinfo->Effects[1].DamageMultiplier = 0.0f;\n+    sinfo->Effects[1].BonusMultiplier = 0.0f;\n+    //47) END IMPALE VISUAL\n+\n+    //48) CARRION BEETLES\n+    spellId = SPELL_CARRION_BEETLES; //53520\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellFamilyName = SPELLFAMILY_WARRIOR;\n+    sinfo->PreventionType = SPELL_PREVENTION_TYPE_PACIFY;\n+    sinfo->SpellLevel = 10;\n+    sinfo->BaseLevel = 10;\n+    sinfo->RecoveryTime = 6000;\n+    sinfo->StartRecoveryCategory = 133;\n+    sinfo->StartRecoveryTime = 1500;\n+    sinfo->PowerType = POWER_MANA;\n+    sinfo->ManaCost = 50 * 5;\n+    sinfo->MaxAffectedTargets = 1;\n+    sinfo->InterruptFlags = 0x1;\n+    sinfo->ChannelInterruptFlags = 0x100C;\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(4); //30 yds\n+    sinfo->DurationEntry = sSpellDurationStore.LookupEntry(327); //500ms // (36); // 1000ms // (327); //500ms\n+    sinfo->ExplicitTargetMask = TARGET_FLAG_CORPSE_ENEMY;\n+    sinfo->Attributes |= SPELL_ATTR0_DO_NOT_DISPLAY | SPELL_ATTR0_IS_ABILITY;\n+    sinfo->AttributesEx |= SPELL_ATTR1_TRACK_TARGET_IN_CHANNEL;\n+    sinfo->AttributesEx2 |= SPELL_ATTR2_ALLOW_DEAD_TARGET;\n+\n+    sinfo->Effects[0].Effect = SPELL_EFFECT_DUMMY;\n+    sinfo->Effects[0].ApplyAuraName = SPELL_AURA_NONE;\n+    sinfo->Effects[0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ANY);\n+    sinfo->Effects[0].TargetB = SpellImplicitTargetInfo(0);\n+    sinfo->Effects[0].BasePoints = 1;\n+    sinfo->Effects[0].Amplitude = 500;\n+    sinfo->Effects[0].RealPointsPerLevel = 0.0f;\n+    sinfo->Effects[0].DieSides = 0;\n+    sinfo->Effects[0].DamageMultiplier = 0.0f;\n+    sinfo->Effects[0].BonusMultiplier = 0.0f;\n+    //48) END CARRION BEETLES\n+\n+    //49) LOCUST SWARM\n+    spellId = SPELL_LOCUST_SWARM; //28785\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellFamilyName = SPELLFAMILY_WARRIOR;\n+    sinfo->PreventionType = SPELL_PREVENTION_TYPE_PACIFY;\n+    sinfo->SpellLevel = 40;\n+    sinfo->BaseLevel = 40;\n+    sinfo->CategoryEntry = nullptr;\n+    sinfo->RecoveryTime = 180000;\n+    sinfo->CategoryRecoveryTime = 0;\n+    sinfo->StartRecoveryCategory = 133;\n+    sinfo->StartRecoveryTime = 1500;\n+    sinfo->PowerType = POWER_MANA;\n+    sinfo->ManaCost = 50 * 5;\n+    sinfo->MaxAffectedTargets = 0;\n+    sinfo->StackAmount = 0;\n+    sinfo->InterruptFlags = 0x1;\n+    sinfo->ChannelInterruptFlags = 0x100C;\n+    sinfo->CastTimeEntry = sSpellCastTimesStore.LookupEntry(1); //0\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(4); //30 yds\n+    sinfo->DurationEntry = sSpellDurationStore.LookupEntry(35); //4000ms\n+    sinfo->ExplicitTargetMask = TARGET_FLAG_UNIT;\n+    sinfo->Attributes |= SPELL_ATTR0_DO_NOT_DISPLAY | SPELL_ATTR0_DO_NOT_LOG;\n+    sinfo->AttributesEx |= SPELL_ATTR1_IS_SELF_CHANNELED | SPELL_ATTR1_NO_AURA_ICON | SPELL_ATTR1_NO_THREAT;\n+    sinfo->AttributesEx3 |= SPELL_ATTR3_SUPPRESS_TARGET_PROCS;\n+\n+    sinfo->Effects[0].Effect = SPELL_EFFECT_APPLY_AURA;\n+    sinfo->Effects[0].ApplyAuraName = SPELL_AURA_DUMMY;\n+    sinfo->Effects[0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_CASTER);\n+    sinfo->Effects[0].TargetB = SpellImplicitTargetInfo(0);\n+    sinfo->Effects[0].TriggerSpell = 0;\n+    sinfo->Effects[0].RadiusEntry = nullptr;\n+    sinfo->Effects[0].MiscValue = 0;\n+    sinfo->Effects[0].MiscValueB = 0;\n+    sinfo->Effects[0].BasePoints = 1;\n+    sinfo->Effects[0].Amplitude = 0;\n+    sinfo->Effects[0].RealPointsPerLevel = 0.0f;\n+    sinfo->Effects[0].DieSides = 0;\n+    sinfo->Effects[0].DamageMultiplier = 0.0f;\n+    sinfo->Effects[0].BonusMultiplier = 0.0f;\n+\n+    for (uint8 i = EFFECT_1; i < MAX_SPELL_EFFECTS; ++i)\n+    {\n+        sinfo->Effects[i].Effect = 0;\n+        sinfo->Effects[i].ApplyAuraName = SPELL_AURA_NONE;\n+        sinfo->Effects[i].TargetA = SpellImplicitTargetInfo(0);\n+        sinfo->Effects[i].TargetB = SpellImplicitTargetInfo(0);\n+        sinfo->Effects[i].RadiusEntry = nullptr;\n+        sinfo->Effects[i].MiscValue = 0;\n+        sinfo->Effects[i].MiscValueB = 0;\n+        sinfo->Effects[i].BasePoints = 0;\n+        sinfo->Effects[i].Amplitude = 0;\n+        sinfo->Effects[i].RealPointsPerLevel = 0.0f;\n+        sinfo->Effects[i].DieSides = 0;\n+        sinfo->Effects[i].DamageMultiplier = 0.0f;\n+        sinfo->Effects[i].BonusMultiplier = 0.0f;\n+    }\n+    //49) END LOCUST SWARM\n+\n+    //50) SOUL BITE\n+    spellId = SPELL_SOUL_BITE; //11016\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellFamilyName = SPELLFAMILY_WARRIOR;\n+    sinfo->PreventionType = SPELL_PREVENTION_TYPE_PACIFY;\n+    sinfo->SchoolMask = SPELL_SCHOOL_MASK_SHADOW | SPELL_SCHOOL_MASK_ARCANE;\n+    sinfo->SpellLevel = 40;\n+    sinfo->BaseLevel = 40;\n+    sinfo->CategoryEntry = nullptr;\n+    sinfo->RecoveryTime = 0;\n+    sinfo->CategoryRecoveryTime = 0;\n+    sinfo->StartRecoveryCategory = 0;\n+    sinfo->StartRecoveryTime = 0;\n+    sinfo->PowerType = POWER_MANA;\n+    sinfo->ManaCost = 0;\n+    sinfo->MaxAffectedTargets = 0;\n+    sinfo->StackAmount = 10;\n+    sinfo->ChannelInterruptFlags = 0;\n+    sinfo->CastTimeEntry = sSpellCastTimesStore.LookupEntry(1); //0\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(11); //15 yds\n+    sinfo->DurationEntry = sSpellDurationStore.LookupEntry(568); // 1250ms // (36); //1000ms\n+    sinfo->ExplicitTargetMask = TARGET_FLAG_UNIT;\n+    sinfo->Attributes |= SPELL_ATTR0_DO_NOT_LOG;\n+    sinfo->AttributesEx |= SPELL_ATTR1_NO_REFLECTION | SPELL_ATTR1_NO_REDIRECTION;\n+    sinfo->AttributesEx2 |= SPELL_ATTR2_CANT_CRIT;\n+    sinfo->AttributesEx3 |= SPELL_ATTR3_IGNORE_CASTER_MODIFIERS | SPELL_ATTR3_ALWAYS_HIT;\n+    sinfo->AttributesEx4 |= SPELL_ATTR4_IGNORE_DAMAGE_TAKEN_MODIFIERS;\n+    sinfo->AttributesCu &= ~(SPELL_ATTR0_CU_AURA_CC);\n+\n+    sinfo->Effects[0].Effect = SPELL_EFFECT_HEALTH_LEECH;\n+    sinfo->Effects[0].ApplyAuraName = SPELL_AURA_NONE;\n+    sinfo->Effects[0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ENEMY);\n+    sinfo->Effects[0].TargetB = SpellImplicitTargetInfo(0);\n+    sinfo->Effects[0].RadiusEntry = nullptr;\n+    sinfo->Effects[0].MiscValue = 0;\n+    sinfo->Effects[0].MiscValueB = 0;\n+    sinfo->Effects[0].BasePoints = 10;\n+    sinfo->Effects[0].Amplitude = 0;\n+    sinfo->Effects[0].RealPointsPerLevel = 0.0f;\n+    sinfo->Effects[0].DieSides = 25;\n+    sinfo->Effects[0].DamageMultiplier = 0.0f;\n+    sinfo->Effects[0].ValueMultiplier = 0.0f;\n+    sinfo->Effects[0].BonusMultiplier = 0.0f;\n+\n+    sinfo->Effects[1].Effect = SPELL_EFFECT_APPLY_AURA;\n+    sinfo->Effects[1].ApplyAuraName = SPELL_AURA_MOD_PACIFY_SILENCE;\n+    sinfo->Effects[1].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ENEMY);\n+    sinfo->Effects[1].TargetB = SpellImplicitTargetInfo(0);\n+    sinfo->Effects[1].RadiusEntry = nullptr;\n+    sinfo->Effects[1].MiscValue = 0;\n+    sinfo->Effects[1].MiscValueB = 0;\n+    sinfo->Effects[1].BasePoints = 1;\n+    sinfo->Effects[1].Amplitude = 0;\n+    sinfo->Effects[1].RealPointsPerLevel = 0.0f;\n+    sinfo->Effects[1].DieSides = 0;\n+    sinfo->Effects[1].DamageMultiplier = 0.0f;\n+    sinfo->Effects[1].ValueMultiplier = 0.0f;\n+    sinfo->Effects[1].BonusMultiplier = 0.0f;\n+\n+    sinfo->Effects[2].Effect = SPELL_EFFECT_APPLY_AURA;\n+    sinfo->Effects[2].ApplyAuraName = SPELL_AURA_MOD_DECREASE_SPEED;\n+    sinfo->Effects[2].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ENEMY);\n+    sinfo->Effects[2].TargetB = SpellImplicitTargetInfo(0);\n+    sinfo->Effects[2].Mechanic = MECHANIC_SNARE;\n+    sinfo->Effects[2].RadiusEntry = nullptr;\n+    sinfo->Effects[2].MiscValue = 0;\n+    sinfo->Effects[2].MiscValueB = 0;\n+    sinfo->Effects[2].BasePoints = -3;\n+    sinfo->Effects[2].Amplitude = 0;\n+    sinfo->Effects[2].RealPointsPerLevel = 0.0f;\n+    sinfo->Effects[2].DieSides = 0;\n+    sinfo->Effects[2].DamageMultiplier = 0.0f;\n+    sinfo->Effects[2].ValueMultiplier = 0.0f;\n+    sinfo->Effects[2].BonusMultiplier = 0.0f;\n+    //50) END SOUL BITE\n+\n+    //51) ENERGIZE VISUAL\n+    spellId = SPELL_ENERGIZE_VISUAL; //59198\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SchoolMask = SPELL_SCHOOL_MASK_SHADOW;\n+    sinfo->SpellLevel = 1;\n+    sinfo->BaseLevel = 1;\n+\n+    sinfo->Effects[0].Effect = SPELL_EFFECT_DUMMY;\n+    sinfo->Effects[0].BasePoints = 0;\n+    sinfo->Effects[0].DieSides = 0;\n+    //51) END ENERGIZE VISUAL\n+\n+    //XX) FIXES\n+    spellId = 48155; // Mind Flay (Rank 8)\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+    sinfo->InterruptFlags &= SPELL_INTERRUPT_FLAG_MOVEMENT;\n+\n+    for (auto& p : botSpellInfoOverrides)\n+    {\n+        for (auto& eff : p.second.Effects)\n+        {\n+            eff.OverrideSpellInfo(&p.second);\n+        }\n+    }\n+\n+    BOT_LOG_INFO(\"server.loading\", \">> Bot spellInfo overrides generated for {} spells\", uint32(botSpellInfoOverrides.size()));\n+\n+    GenerateBotCustomSpellProcs();\n+}\ndiff --git a/src/server/game/AI/NpcBots/botspell.h b/src/server/game/AI/NpcBots/botspell.h\nnew file mode 100644\nindex 0000000000..9f2a129000\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/botspell.h\n@@ -0,0 +1,322 @@\n+#ifndef BOTSPELL_H\n+#define BOTSPELL_H\n+\n+#include \"Define.h\"\n+\n+/*\n+NpcBot System by Trickerer (onlysuffering@gmail.com)\n+Original patch from: LordPsyan https://bitbucket.org/lordpsyan/trinitycore-patches/src/3b8b9072280e/Individual/11185-BOTS-NPCBots.patch\n+*/\n+\n+class SpellInfo;\n+struct SpellProcEntry;\n+\n+enum BotSpells : uint32\n+{\n+//COMMON SPELLS\n+    PVPTRINKET                          = 42292,//PvP Trinket no CD\n+    BERSERK                             = 46587,//68378,//900%/150%\n+    MODEL_TRANSITION                    = 24753,//\"Trick\" cannot cast or attack\n+    SUMMONING_DISORIENTATION            = 32752,\n+    ACTIVATE_SPEC                       = 63645,//Activate Primary Spec\n+    WANDERER_HEARTHSTONE                = 54318,//\"Hearthsone\" no CD\n+    SUMMONING_STONE_EFFECT              = 59782,//Cast time 5s + Channeled 2m\n+    SHOOT_WAND                          = 5019,\n+    OPEN_FLAG_BG                        = 21651,\n+    ARENA_FLAG_TEAM_A_GOLD              = 32724,\n+    ARENA_FLAG_TEAM_A_GREEN             = 32725,\n+    ARENA_FLAG_TEAM_H_GOLD              = 35774,\n+    ARENA_FLAG_TEAM_H_GREEN             = 35775,\n+///Portals\n+    PORTAL_STORMWIND                    = 10059,\n+    PORTAL_IRONFORGE                    = 11416,\n+    PORTAL_DARNASSUS                    = 11419,\n+    PORTAL_EXODAR                       = 32266,\n+    PORTAL_SHATTRATH_A                  = 33691,\n+    PORTAL_THERAMORE                    = 49360,\n+    PORTAL_ORGRIMMAR                    = 11417,\n+    PORTAL_UNDERCITY                    = 11418,\n+    PORTAL_THUNDERBLUFF                 = 11420,\n+    PORTAL_SILVERMOON                   = 32267,\n+    PORTAL_SHATTRATH_H                  = 35717,\n+    PORTAL_STONARD                      = 49361,\n+    PORTAL_DALARAN                      = 53142,\n+///Passives\n+    DAMAGE_REDUCTION                    = 68066,//Vigilance, Blessing of Sanctuary, etc.\n+///Passives for Pets\n+    DAMAGEDONE_PASSIVE                  = 30147,//for custom value, Tamed Pet Passive (DND) physical at 0, magic at 1\n+    DAMAGETAKEN_PASSIVE                 = 35697,//for custom value, Pet Passive (DND), single effect (aura 87 at 0)\n+    SPELLDAMAGE_PASSIVE                 = 43922,//for custom value, Increase Spell Dam 473, single effect (aura 13 at 0)\n+    SPELLPENETRATION_PASSIVE            = 25975,//for custom value, Spell Penetration 10, single effect (aura 123 at 0)\n+    SPELLHASTE_PASSIVE                  = 44400,//for custom value, Netherwind Presence rank 1, single effect (aura 65 at 0)\n+    CRITBONUS_PASSIVE                   = 35695,//for custom value, Pet Passive (DND), spell at 0, physical at 1\n+///Racials\n+    RACIAL_EVERY_MAN_FOR_HIMSELF        = 59752,//pvp trinket effect, instant, 2 min cd\n+    RACIAL_BLOOD_FURY_WARLOCK           = 33702,//effect varies, 15 sec, 2 min cd\n+    RACIAL_BLOOD_FURY_SHAMAN            = 33697,\n+    RACIAL_BLOOD_FURY_OTHERS            = 20572,\n+    RACIAL_STONEFORM                    = 20594,//dispell disease, poison, bleed, instant, 2 min cd\n+    //RACIAL_FIND_TREASURE                = 2481,\n+    RACIAL_SHADOWMELD                   = 58984,//stealth, -threat, instant, 2 min cd\n+    RACIAL_WILL_OF_THE_FORSAKEN         = 7744,//dispel charm/fear/sleep, instant, 2 min cd, 45 sec category cd\n+    RACIAL_WARSTOMP                     = 20549,//2sec stun, casttime 500, 8yd, 2 min cd\n+    RACIAL_ESCAPE_ARTIST                = 20589,//dispel snare/root, instant, 1 min 45 sec cd\n+    RACIAL_BERSERKING                   = 26297,//haste all 20%, isntant, 3 min cd\n+    RACIAL_ARCANE_TORRENT_DEATHKNIGHT   = 50613,//2sec AoE silence + energize, instant, 2 min cd\n+    RACIAL_ARCANE_TORRENT_ROGUE         = 25046,\n+    RACIAL_ARCANE_TORRENT_OTHERS        = 28730,\n+    RACIAL_GIFT_OF_NAARU_WARRIOR        = 28880,//Hot over 15 sec, instant, 2 min cd\n+    RACIAL_GIFT_OF_NAARU_PALADIN        = 59542,\n+    RACIAL_GIFT_OF_NAARU_HUNTER         = 59543,\n+    RACIAL_GIFT_OF_NAARU_PRIEST         = 59544,\n+    RACIAL_GIFT_OF_NAARU_DEATHKNIGHT    = 59545,\n+    RACIAL_GIFT_OF_NAARU_SHAMAN         = 59547,\n+    RACIAL_GIFT_OF_NAARU_MAGE           = 59548,\n+//ADVANCED\n+    //SPELL_SUMMON_FELBLAZE_PREVISUAL     = 46350,//green splash impact head/torso\n+    //HONORLESS_TARGET                    = 2479,\n+    COSMETIC_TELEPORT_EFFECT            = 52096,//visual instant cast omni\n+    COSMETIC_RESURRECTION               = 58854,//visual instant cast self (castable while dead, hidden)\n+    SUMMON_DEMON_VISUAL                 = 6657,//SUMMON_SERPENT_MESSENGER\n+    CALL_PET_VISUAL                     = 30416,//QUEST_WOOD_CLEANSE_EFFECT\n+    SPELL_VERTEX_COLOR_BLACK            = 39662,//black color model full\n+    SPELL_VERTEX_COLOR_GREY             = 43355,//grey color model full\n+    SPELL_BLACK_HOLE_VISUAL_2           = 46235,//blackened+smoke trail med\n+////CUSTOM SPELLS - UNUSED IN CODE AND DB\n+  //common\n+  //modify\n+    SPELL_TRIGGERED_HEAL                = 25155,//hidden\n+    SPELL_TELEPORT_LOCAL                = 7794,//Teleport, no log\n+    SPELL_NULLIFY_POISON                = 550,//To convert into passive for bots\n+  //unmodify\n+    SPELL_ATTACK_MELEE_1H               = 42880,\n+    SPELL_TRIGGERED_ENERGIZE            = 60628,//hidden\n+    SPELL_BRIEF_STUN                    = 41421,//1sec stun\n+//BLADEMASTER\n+  //SPELLS\n+  //unmodify\n+    //SPELL_DEATH_GRIP_JUMP               = 49575,\n+/**/SPELL_CRITICAL_STRIKE               = 1132,\n+    SPELL_BURNING_BLADE_BLADEMASTER     = 32281,//horde flag visual\n+    SPELL_STUN_FREEZE_ANIM              = 59123,//stun forever, full stop\n+  //modify\n+    SPELL_TRANSPARENCY_50               = 44816,\n+/**/SPELL_NETHERWALK                    = 31599,\n+/**/SPELL_MIRROR_IMAGE_BM               = 69936,//blank spell\n+    SPELL_COMBAT_SPECIAL_2H_ATTACK      = 44079,//animation only\n+//SPHYNX\n+  //modify\n+    SPELL_SHADOW_BOLT1                  = 16408,\n+    SPELL_SHADOW_BLAST                  = 38085,\n+    //SPELL_SHADOW_BLAST_SPLASH           = 38205,\n+    SPELL_ATTACK_MELEE_RANDOM           = 42902,\n+    SHADOWFURY_VISUAL                   = 47444,//59912,\n+    SPELL_DEVOUR_MAGIC                  = 17012,//used by Spellmaw but no matter (this spell does not work as intended)\n+    SPELL_DRAIN_MANA                    = 25755,\n+    SPELL_REPLENISH_MANA                = 33394,//5406,\n+    SPELL_REPLENISH_HEALTH              = 34756,//regenerating aura\n+  //unmodify\n+    SPELL_DEVOUR_MAGIC_CASTER_IMPACT    = 50527,\n+    SPELL_DEVOUR_MAGIC_BEAM             = 54393,\n+//ARCHMAGE\n+  //modify\n+    SPELL_BRILLIANCE_AURA               = 1234,\n+    SPELL_FIREBALL                      = 9488,\n+    SPELL_BLIZZARD                      = 15783,\n+    SPELL_SUMMON_WATER_ELEMENTAL        = 35593,\n+    SPELL_WATERBOLT                     = 72898,\n+  //unmodify\n+//DREADLORD\n+  //modify\n+    SPELL_VAMPIRIC_AURA                 = 20810,\n+    SPELL_SLEEP                         = 20663,\n+    SPELL_CARRION_SWARM                 = 34240,\n+    SPELL_INFERNO                       = 12740, //summon infernal servant\n+    SPELL_INFERNO_METEOR_VISUAL         = 5739, //meteor strike infernal\n+  //unmodify\n+    SPELL_INFERNO_EFFECT                = 22703, //stun, damage (warlock spell)\n+    //SPELL_INFERNO_IMPACT_EXPLOSION      = 00000, //visual\n+//SPELLBREAKER\n+  //modify\n+    SPELL_STEAL_MAGIC                   = 30036, //used by Ethereal Spellfilcher\n+    SPELL_FEEDBACK                      = 32897,\n+    SPELL_STEAL_MAGIC_VISUAL            = 11084, // \"Shock\"\n+  //unmodify\n+//DARK RANGER\n+  //modify\n+    SPELL_BLACK_ARROW                   = 20733, //supposed to be used by Dark Ranger Clea\n+    SPELL_DRAIN_LIFE                    = 17238, //used by Maleki the Palid, supposed to be by Shadow Adept (31145)\n+    SPELL_SILENCE                       = 29943,\n+    //SPELL_CHARM                         = 11111, //\n+  //unmodify\n+//NECROMANCER\n+  //modify\n+    SPELL_SHADOW_BOLT2                  = 17509,\n+    SPELL_RAISE_DEAD                    = 34011,\n+    SPELL_UNHOLY_FRENZY                 = 52499,\n+    SPELL_CRIPPLE                       = 50379,\n+    SPELL_CORPSE_EXPLOSION              = 61614,\n+    //SPELL_BONE_SHIELD                   = 0,//27688, //NIY //NO VIABLE SPELLS\n+    //for Attract faction reaction must be adjusted at Object.cpp::GetFactionReactionTo(L2831)\n+    //SPELL_BLOOD_CURSE                   = 29933, //NIY for Attract //NO VIABLE SPELLS\n+  //unmodify\n+    CORPSE_EXPLOSION_VISUAL             = 60081, //explosion\n+//NAGA SEA WITCH\n+  //modify\n+    SPELL_FORKED_LIGHTNING              = 63541,\n+    SPELL_FORKED_LIGHTNING_EFFECT       = 50900, // \"Lightning Shock\"\n+    SPELL_FROST_ARROW                   = 38942,\n+    SPELL_FROST_ARROW_EFFECT            = 56095,\n+    SPELL_MANA_SHIELD                   = 35064,\n+    SPELL_TORNADO                       = 34695,\n+    SPELL_TORNADO_EFFECT                = 21990, // stun, -resistances\n+    SPELL_TORNADO_EFFECT2               = 34683, // aoe damage\n+    SPELL_TORNADO_EFFECT3               = 39261,\n+    SPELL_SHOOT_BOW                     = 41188,\n+  //unmodify\n+    SPELL_TORNADO_LIGHTNING_VISUAL      = 45869, //periodic, 1 sec\n+//CRYPT LORD\n+  //modify\n+    //impale cd 9\n+    //locust dur 30 cd 180\n+    SPELL_IMPALE                        = 53458,\n+    SPELL_IMPALE_DAMAGE                 = 53454,\n+    SPELL_IMPALE_VISUAL                 = 59446,\n+    SPELL_CARRION_BEETLES               = 53520,\n+    SPELL_LOCUST_SWARM                  = 28785,\n+    SPELL_SOUL_BITE                     = 11016, //special - pet\n+    SPELL_ENERGIZE_VISUAL               = 59198,\n+    SPELL_BURROW                        = 68394, //special - pet (NYI) //SPELL_EFFECT_FORCE_DESELECT\n+  //unmodify\n+    SPELL_SPIKED_CARAPACE_DAMAGE        = 14104,\n+\n+//OTHER\n+    BASE_MANA_SPHYNX                    = 400 * 5,\n+    BASE_MANA_SPELLBREAKER              = 250 * 5,\n+    BASE_MANA_NECROMANCER               = 400 * 5,\n+    //base mana at 10\n+    BASE_MANA_10_BM                     = 540 * 5,\n+    BASE_MANA_10_ARCHMAGE               = 705 * 5,\n+    BASE_MANA_10_DREADLORD              = 600 * 5,\n+    BASE_MANA_10_DARK_RANGER            = 570 * 5,\n+    BASE_MANA_10_SEA_WITCH              = 735 * 5,\n+    BASE_MANA_10_CRYPT_LORD             = 420 * 5,\n+    //base mana at 1\n+    BASE_MANA_1_BM                      = 240 * 5,\n+    BASE_MANA_1_ARCHMAGE                = 285 * 5,\n+    BASE_MANA_1_DREADLORD               = 270 * 5,\n+    BASE_MANA_1_DARK_RANGER             = 225 * 5,\n+    BASE_MANA_1_SEA_WITCH               = 330 * 5,\n+    BASE_MANA_1_CRYPT_LORD              = 210 * 5,\n+};\n+\n+enum BotMountSpells : uint32\n+{\n+    //By game events\n+    REINDEER                            = 25859,\n+    REINDEER_FLY                        = 44827,\n+    //AQ40\n+    QIRAJI_BATTLE_TANK_1                = 25953,\n+    QIRAJI_BATTLE_TANK_2                = 26054,\n+    QIRAJI_BATTLE_TANK_3                = 26055,\n+    QIRAJI_BATTLE_TANK_4                = 26056,\n+    //By class\n+    BOT_DARK_RANGER_MOUNT               = 17481, // Deathcharger's Reins\n+    BOT_BE_PALLY_FAST_MOUNT             = 34767,\n+    BOT_BE_PALLY_MOUNT                  = 34769,\n+    BOT_ALLI_PALLY_FAST_MOUNT           = 23214,\n+    BOT_ALLI_PALLY_MOUNT                = 13819,\n+    BOT_DEATH_KNIGHT_MOUNT              = 48778,\n+    BOT_WARLOCK_FAST_MOUNT              = 23161,\n+    BOT_WARLOCK_MOUNT                   = 5784,\n+    //By race\n+    BOT_MOUNT_HUMAN_60_1                = 458,\n+    BOT_MOUNT_HUMAN_60_2                = 468,\n+    BOT_MOUNT_HUMAN_60_3                = 470,\n+    BOT_MOUNT_ORC_60_1                  = 459,\n+    BOT_MOUNT_ORC_60_2                  = 578,\n+    BOT_MOUNT_ORC_60_3                  = 579,\n+    BOT_MOUNT_DWARF_60_1                = 6777,\n+    BOT_MOUNT_DWARF_60_2                = 6896,\n+    BOT_MOUNT_DWARF_60_3                = 6897,\n+    BOT_MOUNT_NIGHTELF_60_1             = 8394,\n+    BOT_MOUNT_NIGHTELF_60_2             = 10787,\n+    BOT_MOUNT_NIGHTELF_60_3             = 10789,\n+    BOT_MOUNT_FORSAKEN_60_1             = 8980,\n+    BOT_MOUNT_FORSAKEN_60_2             = 17462,\n+    BOT_MOUNT_FORSAKEN_60_3             = 17463,\n+    BOT_MOUNT_TAUREN_60_1               = 18363,\n+    BOT_MOUNT_TAUREN_60_2               = 18989,\n+    BOT_MOUNT_TAUREN_60_3               = 18990,\n+    BOT_MOUNT_GNOME_60_1                = 10873,\n+    BOT_MOUNT_GNOME_60_2                = 10969,\n+    BOT_MOUNT_GNOME_60_3                = 15780,\n+    BOT_MOUNT_TROLL_60_1                = 8395,\n+    BOT_MOUNT_TROLL_60_2                = 10795,\n+    BOT_MOUNT_TROLL_60_3                = 10796,\n+    BOT_MOUNT_BLOODELF_60_1             = 34795,\n+    BOT_MOUNT_BLOODELF_60_2             = 35018,\n+    BOT_MOUNT_BLOODELF_60_3             = 35020,\n+    BOT_MOUNT_DRAENEI_60_1              = 34406,\n+    BOT_MOUNT_DRAENEI_60_2              = 35710,\n+    BOT_MOUNT_DRAENEI_60_3              = 35711,\n+    BOT_MOUNT_HUMAN_100_1               = 23227,\n+    BOT_MOUNT_HUMAN_100_2               = 23228,\n+    BOT_MOUNT_HUMAN_100_3               = 23229,\n+    BOT_MOUNT_ORC_100_1                 = 23250,\n+    BOT_MOUNT_ORC_100_2                 = 23251,\n+    BOT_MOUNT_ORC_100_3                 = 23252,\n+    BOT_MOUNT_DWARF_100_1               = 23238,\n+    BOT_MOUNT_DWARF_100_2               = 23239,\n+    BOT_MOUNT_DWARF_100_3               = 23240,\n+    BOT_MOUNT_NIGHTELF_100_1            = 23219,\n+    BOT_MOUNT_NIGHTELF_100_2            = 23220,\n+    BOT_MOUNT_NIGHTELF_100_3            = 23221,\n+    BOT_MOUNT_FORSAKEN_100_1            = 17465,\n+    BOT_MOUNT_FORSAKEN_100_2            = 22722,\n+    BOT_MOUNT_FORSAKEN_100_3            = 23246,\n+    BOT_MOUNT_TAUREN_100_1              = 23247,\n+    BOT_MOUNT_TAUREN_100_2              = 23248,\n+    BOT_MOUNT_TAUREN_100_3              = 23249,\n+    BOT_MOUNT_GNOME_100_1               = 23222,\n+    BOT_MOUNT_GNOME_100_2               = 23223,\n+    BOT_MOUNT_GNOME_100_3               = 23225,\n+    BOT_MOUNT_TROLL_100_1               = 23241,\n+    BOT_MOUNT_TROLL_100_2               = 23242,\n+    BOT_MOUNT_TROLL_100_3               = 23243,\n+    BOT_MOUNT_BLOODELF_100_1            = 35025,\n+    BOT_MOUNT_BLOODELF_100_2            = 35027,\n+    BOT_MOUNT_BLOODELF_100_3            = 46628,\n+    BOT_MOUNT_DRAENEI_100_1             = 35712,\n+    BOT_MOUNT_DRAENEI_100_2             = 35713,\n+    BOT_MOUNT_DRAENEI_100_3             = 35714,\n+    //By Team (flyers)\n+    BOT_MOUNT_FLY_ALLIANCE_150_1        = 32235,\n+    BOT_MOUNT_FLY_ALLIANCE_150_2        = 32239,\n+    BOT_MOUNT_FLY_ALLIANCE_150_3        = 32240,\n+    BOT_MOUNT_FLY_HORDE_150_1           = 32243,\n+    BOT_MOUNT_FLY_HORDE_150_2           = 32244,\n+    BOT_MOUNT_FLY_HORDE_150_3           = 32245,\n+    BOT_MOUNT_FLY_ALLIANCE_280_1        = 32242,\n+    BOT_MOUNT_FLY_ALLIANCE_280_2        = 32289,\n+    BOT_MOUNT_FLY_ALLIANCE_280_3        = 32290,\n+    BOT_MOUNT_FLY_HORDE_280_1           = 32246,\n+    BOT_MOUNT_FLY_HORDE_280_2           = 32295,\n+    BOT_MOUNT_FLY_HORDE_280_3           = 32296\n+};\n+inline constexpr std::size_t NUM_MOUNTS_PER_SPEED = 3;\n+\n+enum BotItemUseSpellTargeting : uint8\n+{\n+    BOT_ITEM_USE_SPELL_TARGET_NONE         = 0,\n+    BOT_ITEM_USE_SPELL_TARGET_SELF         = 1,\n+    BOT_ITEM_USE_SPELL_TARGET_ATTACKTARGET = 2,\n+    BOT_ITEM_USE_SPELL_TARGET_ALLY         = 3\n+};\n+\n+SpellInfo const* GetBotSpellInfoOverride(uint32 spellId);\n+SpellInfo const* AssertBotSpellInfoOverride(uint32 spellId);\n+SpellProcEntry const* GetBotSpellProceEntryOverride(uint32 spellId);\n+void GenerateBotCustomSpells();\n+\n+#endif //BOTSPELL_H\ndiff --git a/src/server/game/AI/NpcBots/bottext.h b/src/server/game/AI/NpcBots/bottext.h\nnew file mode 100644\nindex 0000000000..4fe4ce482a\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bottext.h\n@@ -0,0 +1,441 @@\n+#ifndef BOTTEXT_H\n+#define BOTTEXT_H\n+\n+#include \"Define.h\"\n+\n+enum BotTexts : uint32\n+{\n+    GOSSIP_NORMAL_SERVE_MASTER              = 70001,//\"I live only to serve the master.\"\n+    GOSSIP_GREET_NEED_SMTH                  = 70002,//\"You need something?\"\n+    GOSSIP_GREET_MURDER                     = 70003,//\"Mortals... usually I kill wretches like you at sight\"\n+    GOSSIP_GREET_CUSTOM_SPHYNX              = 70004,\n+    GOSSIP_NORMAL_CUSTOM_SPHYNX             = 70005,\n+    GOSSIP_GREET_CUSTOM_DREADLORD           = 70006,\n+    GOSSIP_NORMAL_CUSTOM_DREADLORD          = 70007,\n+    GOSSIP_GREET_CUSTOM_DARKRANGER          = 70008,\n+    GOSSIP_NORMAL_CUSTOM_DARKRANGER         = 70009,\n+    GOSSIP_GREET_CUSTOM_SEAWITCH            = 70010,\n+    GOSSIP_NORMAL_CUSTOM_SEAWITCH           = 70011,\n+    GOSSIP_GREET_CUSTOM_CRYPTLORD           = 70012,\n+    GOSSIP_NORMAL_CUSTOM_CRYPTLORD          = 70013,\n+    //70012-70100 reserved for bot gossip texts (not selectable)\n+    GOSSIP_CLASSDESC_BM                     = 70101,\n+    GOSSIP_CLASSDESC_SPHYNX                 = 70102,\n+    GOSSIP_CLASSDESC_ARCHMAGE               = 70103,\n+    GOSSIP_CLASSDESC_DREADLORD              = 70104,\n+    GOSSIP_CLASSDESC_SPELLBREAKER           = 70105,\n+    GOSSIP_CLASSDESC_DARKRANGER             = 70106,\n+    GOSSIP_CLASSDESC_NECROMANCER            = 70107,\n+    GOSSIP_CLASSDESC_SEAWITCH               = 70108,\n+    GOSSIP_CLASSDESC_CRYPTLORD              = 70109,\n+    //70109-70200 reserved for bot class descriptions gossip texts (not selectable)\n+    GOSSIP_BOTGIVER_GREET                   = 70201,\n+    GOSSIP_BOTGIVER_HIRE                    = 70202,\n+    GOSSIP_BOTGIVER_HIRE_CLASS              = 70203,\n+    GOSSIP_BOTGIVER_HIRE_EMPTY              = 70204,\n+    //70205-70299 reserved for botgiver gossip texts (not selectable)\n+    BOT_TEXT_DIE                            = 70300, //\"Die!\"\n+    BOT_TEXT_REZZING_YOU                    = 70301, //\"Rezzing You\"\n+    BOT_TEXT_REZZING_                       = 70302, //\"Rezzing \"\n+    BOT_TEXT_YOUR_BOT                       = 70303, //\"your bot\"\n+    BOT_TEXT__S_BOT                         = 70304, //\"'s bot\"\n+    BOT_TEXT_CANT_CONJURE_WATER_YET         = 70305, //\"I can't conjure water yet\"\n+    BOT_TEXT_CANT_CONJURE_FOOD_YET          = 70306, //\"I can't conjure food yet\"\n+    BOT_TEXT_CANT_RIGHT_NOW                 = 70307, //\"I can't do it right now\"\n+    BOT_TEXT_HERE_YOU_GO                    = 70308, //\"Here you go...\"\n+    BOT_TEXT_DISABLED                       = 70309, //\"Disabled\"\n+    BOT_TEXT_NOT_READY_YET                  = 70310, //\"Not ready yet\"\n+    BOT_TEXT_INVALID_OBJECT_TYPE            = 70311, //\"Invalid object type\"\n+    BOT_TEXT_FAILED                         = 70312, //\"Failed\"\n+    BOT_TEXT_DONE                           = 70313, //\"Done\"\n+    BOT_TEXT_NOT_SHAPESHIFTED               = 70314, //\"I am not shapeshifted\"\n+    BOT_TEXT_NO_HEALTHSTONE                 = 70315, //\"I don't have a healthstone\"\n+    BOT_TEXT_CANT_CREATE_HEALTHSTONE        = 70316, //\"I can't create healthstones yet!\"\n+    BOT_TEXT_NO_LOCKPICKING                 = 70317, //\"WTF I don't have lockpicking!\"\n+    BOT_TEXT_SKILL_LEVEL_TOO_LOW            = 70318, //\"My skill level in not high enough\"\n+    BOT_TEXT_CHANGING_MY_SPEC_TO_           = 70319, //\"Changing my spec to \"\n+    BOT_TEXT_SPEC_ARMS                      = 70320, //\"Arms\"\n+    BOT_TEXT_SPEC_FURY                      = 70321, //\"Fury\"\n+    BOT_TEXT_SPEC_PROTECTION                = 70322, //\"Protection\"\n+    BOT_TEXT_SPEC_RETRIBUTION               = 70323, //\"Retribution\"\n+    BOT_TEXT_SPEC_BEASTMASTERY              = 70324, //\"Beast Mastery\"\n+    BOT_TEXT_SPEC_MARKSMANSHIP              = 70325, //\"Marksmanship\"\n+    BOT_TEXT_SPEC_SURVIVAL                  = 70326, //\"Survival\"\n+    BOT_TEXT_SPEC_ASSASINATION              = 70327, //\"Assassination\"\n+    BOT_TEXT_SPEC_COMBAT                    = 70328, //\"Combat\"\n+    BOT_TEXT_SPEC_SUBTLETY                  = 70329, //\"Subtlety\"\n+    BOT_TEXT_SPEC_DISCIPLINE                = 70330, //\"Discipline\"\n+    BOT_TEXT_SPEC_HOLY                      = 70331, //\"Holy\"\n+    BOT_TEXT_SPEC_SHADOW                    = 70332, //\"Shadow\"\n+    BOT_TEXT_SPEC_BLOOD                     = 70333, //\"Blood\"\n+    BOT_TEXT_SPEC_FROST                     = 70334, //\"Frost\"\n+    BOT_TEXT_SPEC_UNHOLY                    = 70335, //\"Unholy\"\n+    BOT_TEXT_SPEC_ELEMENTAL                 = 70336, //\"Elemental\"\n+    BOT_TEXT_SPEC_ENHANCEMENT               = 70337, //\"Enhancement\"\n+    BOT_TEXT_SPEC_RESTORATION               = 70338, //\"Restoration\"\n+    BOT_TEXT_SPEC_ARCANE                    = 70339, //\"Arcane\"\n+    BOT_TEXT_SPEC_FIRE                      = 70340, //\"Fire\"\n+    BOT_TEXT_SPEC_AFFLICTION                = 70341, //\"Affliction\"\n+    BOT_TEXT_SPEC_DEMONOLOGY                = 70342, //\"Demonology\"\n+    BOT_TEXT_SPEC_DESTRUCTION               = 70343, //\"Destruction\"\n+    BOT_TEXT_SPEC_BALANCE                   = 70344, //\"Balance\"\n+    BOT_TEXT_SPEC_FERAL                     = 70345, //\"Feral Combat\"\n+    BOT_TEXT_SPEC_UNKNOWN                   = 70346, //\"Unknown\"\n+    BOT_TEXT_HIREDENY_DK                    = 70347, //\"Go away, weakling\"\n+    BOT_TEXT_HIREDENY_SPHYNX                = 70348, //\" is not convinced\"\n+    BOT_TEXT_HIREDENY_ARCHMAGE              = 70349, //\"I am not going to waste my time on just anything\"\n+    BOT_TEXT_HIREDENY_DREADLORD             = 70350, //NIY\n+    BOT_TEXT_HIREDENY_SPELLBREAKER          = 70351, //NIY\n+    BOT_TEXT_HIREDENY_DARKRANGER            = 70352, //NIY\n+    BOT_TEXT_HIRE_SUCCESS                   = 70353, //\"I am ready\"\n+    BOT_TEXT_HIREDENY_MY_MASTER_IS_         = 70354, //\"Go away. I serve my master \"\n+    BOT_TEXT_UNKNOWN                        = 70355, //\"unknown\"\n+    BOT_TEXT__ON_YOU                        = 70356, //\" on You!\"\n+    BOT_TEXT__ON_MYSELF                     = 70357, //\" on myself!\"\n+    BOT_TEXT__ON_                           = 70358, //\" on \"\n+    BOT_TEXT__USED                          = 70359, //\" used!\"\n+    BOT_TEXT_BOT_TANK                       = 70360, //\"bot tank\"\n+    BOT_TEXT_CLASS                          = 70361, //\"class\"\n+    BOT_TEXT_PLAYER                         = 70362, //\"player\"\n+    BOT_TEXT_MASTER                         = 70363, //\"master\"\n+    BOT_TEXT_NONE                           = 70364, //\"none\"\n+    BOT_TEXT_RANK                           = 70365, //\"Rank\"\n+    BOT_TEXT_TALENT                         = 70366, //\"talent\"\n+    BOT_TEXT_PASSIVE                        = 70367, //\"passive\"\n+    BOT_TEXT_HIDDEN                         = 70368, //\"hidden\"\n+    BOT_TEXT_KNOWN                          = 70369, //\"known\"\n+    BOT_TEXT_ABILITY                        = 70370, //\"ability\"\n+    BOT_TEXT_STAT_STR                       = 70371, //\"str\"\n+    BOT_TEXT_STAT_AGI                       = 70372, //\"agi\"\n+    BOT_TEXT_STAT_STA                       = 70373, //\"sta\"\n+    BOT_TEXT_STAT_INT                       = 70374, //\"int\"\n+    BOT_TEXT_STAT_SPI                       = 70375, //\"spi\"\n+    BOT_TEXT_STAT_UNK                       = 70376, //\"unk stat\"\n+    BOT_TEXT_TOTAL                          = 70377, //\"total\"\n+    BOT_TEXT_MELEE_AP                       = 70378, //\"Melee AP\"\n+    BOT_TEXT_RANGED_AP                      = 70379, //\"Ranged AP\"\n+    BOT_TEXT_ARMOR                          = 70380, //\"armor\"\n+    BOT_TEXT_CRIT                           = 70381, //\"crit\"\n+    BOT_TEXT_DEFENSE                        = 70382, //\"defense\"\n+    BOT_TEXT_MISS                           = 70383, //\"miss\"\n+    BOT_TEXT_DODGE                          = 70384, //\"dodge\"\n+    BOT_TEXT_PARRY                          = 70385, //\"parry\"\n+    BOT_TEXT_BLOCK                          = 70386, //\"block\"\n+    BOT_TEXT_BLOCKVALUE                     = 70387, //\"block value\"\n+    BOT_TEXT_DMG_TAKEN_MELEE                = 70388, //\"Damage taken melee\"\n+    BOT_TEXT_DMG_TAKEN_SPELL                = 70389, //\"Damage taken spell\"\n+    BOT_TEXT_DMG_RANGE_MAINHAND             = 70390, //\"Damage range mainhand\"\n+    BOT_TEXT_DMG_MULT_MAINHAND              = 70391, //\"Damage mult mainhand\"\n+    BOT_TEXT_ATTACK_TIME_MAINHAND           = 70392, //\"Attack time mainhand\"\n+    BOT_TEXT_DMG_RANGE_OFFHAND              = 70393, //\"Damage range offhand\"\n+    BOT_TEXT_DMG_MULT_OFFHAND               = 70394, //\"Damage mult offhand\"\n+    BOT_TEXT_ATTACK_TIME_OFFHAND            = 70395, //\"Attack time offhand\"\n+    BOT_TEXT_DMG_RANGE_RANGED               = 70396, //\"Damage range ranged\"\n+    BOT_TEXT_DMG_MULT_RANGED                = 70397, //\"Damage mult ranged\"\n+    BOT_TEXT_ATTACK_TIME_RANGED             = 70398, //\"Attack time ranged\"\n+    BOT_TEXT_MIN                            = 70399, //\"min\"\n+    BOT_TEXT_MAX                            = 70400, //\"max\"\n+    BOT_TEXT_DPS                            = 70401, //\"DPS\"\n+    BOT_TEXT_BASE_HP                        = 70402, //\"base hp\"\n+    BOT_TEXT_TOTAL_HP                       = 70403, //\"total hp\"\n+    BOT_TEXT_BASE_MP                        = 70404, //\"base mana\"\n+    BOT_TEXT_TOTAL_MP                       = 70405, //\"total mana\"\n+    BOT_TEXT_CURR_MP                        = 70406, //\"current mana\"\n+    BOT_TEXT_SPELLPOWER                     = 70407, //\"spell power\"\n+    BOT_TEXT_REGEN_HP                       = 70408, //\"health regen_5 bonus\"\n+    BOT_TEXT_REGEN_MP_CAST                  = 70409, //\"mana regen_5 no cast\"\n+    BOT_TEXT_REGEN_MP_NOCAST                = 70410, //\"mana regen_5 casting\"\n+    BOT_TEXT_HASTE                          = 70411, //\"haste\"\n+    BOT_TEXT_HIT                            = 70412, //\"hit\"\n+    BOT_TEXT_EXPERTISE                      = 70413, //\"expertise\"\n+    BOT_TEXT_ARMOR_PEN                      = 70414, //\"armor penetration\"\n+    BOT_TEXT_SPELL_PEN                      = 70415, //\"spell penetration\"\n+    BOT_TEXT_PCT                            = 70416, //\"pct\"\n+    BOT_TEXT_HOLY                           = 70417, //\"holy\"\n+    BOT_TEXT_FIRE                           = 70418, //\"fire\"\n+    BOT_TEXT_NATURE                         = 70419, //\"nature\"\n+    BOT_TEXT_FROST                          = 70420, //\"frost\"\n+    BOT_TEXT_SHADOW                         = 70421, //\"shadow\"\n+    BOT_TEXT_ARCANE                         = 70422, //\"arcane\"\n+    BOT_TEXT_RESISTANCE                     = 70423, //\"Resistance\"\n+    BOT_TEXT_COMMAND_STATES                 = 70424, //\"Command states\"\n+    BOT_TEXT_COMMAND_FOLLOW                 = 70425, //\"Follow\"\n+    BOT_TEXT_COMMAND_ATTACK                 = 70426, //\"Attack\"\n+    BOT_TEXT_COMMAND_STAY                   = 70427, //\"Stay\"\n+    BOT_TEXT_COMMAND_RESET                  = 70428, //\"Reset\"\n+    BOT_TEXT_COMMAND_FULLSTOP               = 70429, //\"FullStop\"\n+    BOT_TEXT_FOLLOW_DISTANCE                = 70430, //\"Follow distance\"\n+    BOT_TEXT_SPEC                           = 70431, //\"Spec\"\n+    BOT_TEXT_BOT_ROLEMASK_MAIN              = 70432, //\"Bot roles mask main\"\n+    BOT_TEXT_BOT_ROLEMASK_GATHERING         = 70433, //\"Bot roles mask gathering\"\n+    BOT_TEXT_PVP_KILLS                      = 70434, //\"PvP kills\"\n+    BOT_TEXT_PLAYERS                        = 70435, //\"players\"\n+    BOT_TEXT_DIED_                          = 70436, //\"Died \"\n+    BOT_TEXT__TIMES                         = 70437, //\" times\"\n+    BOT_TEXT_BOT_TICKLED                    = 70438, //\"{} (bot) calms down\"\n+    BOT_TEXT_DEBUG                          = 70439, //\"<Debug>\"\n+    BOT_TEXT_HIREWARN_SPHYNX_1              = 70440, //\"Are you sure you want to risk drawing \"\n+    BOT_TEXT_HIREWARN_SPHYNX_2              = 70441, //\"'s attention?\"\n+    BOT_TEXT_HIREOPTION_SPHYNX              = 70442, //\"<Insert Coin>\"\n+    BOT_TEXT_HIREWARN_DREADLORD             = 70443, //\"Do you want to entice \"\n+    BOT_TEXT_HIREOPTION_DREADLORD           = 70444, //\"<Try to make an offering>\"\n+    BOT_TEXT_HIREWARN_DEFAULT               = 70445, //\"Do you wish to hire \"\n+    BOT_TEXT_HIREOPTION_DEFAULT             = 70446, //\"<Hire bot>\"\n+    BOT_TEXT_MANAGE_EQUIPMENT               = 70447, //\"Manage equipment...\"\n+    BOT_TEXT_MANAGE_ROLES                   = 70448, //\"Manage roles...\"\n+    BOT_TEXT_MANAGE_FORMATION               = 70449, //\"Manage formation...\"\n+    BOT_TEXT_MANAGE_ABILITIES               = 70450, //\"Manage abilities...\"\n+    BOT_TEXT_MANAGE_TALENTS                 = 70451, //\"Manage talents...\"\n+    BOT_TEXT_GIVE_CONSUMABLE                = 70452, //\"Give consumable...\"\n+    BOT_TEXT_CREATE_GROUP                   = 70453, //\"<Create group>\"\n+    BOT_TEXT_CREATE_GROUP_ALL               = 70454, //\"<Create group (all bots)>\"\n+    BOT_TEXT_ADD_TO_GROUP                   = 70455, //\"<Add to group>\"\n+    BOT_TEXT_ADD_TO_GROUP_ALL               = 70456, //\"<Add all bots to group>\"\n+    BOT_TEXT_REMOVE_FROM_GROUP              = 70457, //\"<Remove from group>\"\n+    BOT_TEXT_FOLLOW_ME                      = 70458, //\"Follow me\"\n+    BOT_TEXT_HOLD_POSITION                  = 70459, //\"Hold your position\"\n+    BOT_TEXT_STAY_HERE                      = 70460, //\"Stay here and don't do anything\"\n+    BOT_TEXT_MAGE_FOOD                      = 70461, //\"I need food\"\n+    BOT_TEXT_MAGE_DRINK                     = 70462, //\"I need water\"\n+    BOT_TEXT_MAGE_TABLE                     = 70463, //\"I need a refreshment table\"\n+    BOT_TEXT_ROGUE_PICKLOCK                 = 70464, //\"Help me pick a lock\"\n+    BOT_TEXT_WARLOCK_HEALTHSTONE            = 70465, //\"I need your your healthstone\"\n+    BOT_TEXT_WARLOCK_SOULWELL               = 70466, //\"I need a soulwell\"\n+    BOT_TEXT_ROGUE_POISON_REFRESH           = 70467, //\"I need you to refresh poisons\"\n+    BOT_TEXT_ROGUE_POISON_MH                = 70468, //\"<Choose poison (Main Hand)>\"\n+    BOT_TEXT_ROGUE_POISON_OH                = 70469, //\"<Choose poison (Offhand)>\"\n+    BOT_TEXT_SHAMAN_ENCH_REFRESH            = 70470, //\"I need you to refresh enchants\"\n+    BOT_TEXT_SHAMAN_ENCH_MH                 = 70471, //\"<Choose enchant (Main Hand)>\"\n+    BOT_TEXT_SHAMAN_ENCH_OH                 = 70472, //\"<Choose enchant (Offhand)>\"\n+    BOT_TEXT_REMOVE_SHAPESHIFT              = 70473, //\"I need you to remove shapeshift\"\n+    BOT_TEXT_CHOOSE_PET_TYPE                = 70474, //\"<Choose pet type>\"\n+    BOT_TEXT_UR_DISMISSED                   = 70475, //\"You are dismissed\"\n+    BOT_TEXT_ABANDON_WARN_1                 = 70476, //\"Are you going to abandon \"\n+    BOT_TEXT_ABANDON_WARN_2                 = 70477, //\"You may regret it...\"\n+    BOT_TEXT_PULL_URSELF                    = 70478, //\"Pull yourself together, damnit\"\n+    BOT_TEXT_STUDY_CREATURE                 = 70479, //\"<Study the creature>\"\n+    BOT_TEXT_NEVERMIND                      = 70480, //\"Nevermind\"\n+    BOT_TEXT_DISTANCE_SHORT                 = 70481, //\"dist\"\n+    BOT_TEXT_BACK                           = 70482, //\"BACK\"\n+    BOT_TEXT_AUTO                           = 70483, //\"<Auto>\"\n+    BOT_TEXT_NONE2                          = 70484, //\"<None>\"\n+    BOT_TEXT_RANDOMPET_CUNNING              = 70485, //\"Random (Cunning)\"\n+    BOT_TEXT_RANDOMPET_FEROCITY             = 70486, //\"Random (Ferocity)\"\n+    BOT_TEXT_RANDOMPET_TENACITY             = 70487, //\"Random (Tenacity)\"\n+    BOT_TEXT_SHOW_INVENTORY                 = 70488, //\"Show me your inventory\"\n+    BOT_TEXT_AUTOEQUIP                      = 70489, //\"Auto-equip\"\n+    BOT_TEXT_SLOT_MH                        = 70490, //\"Main hand\"\n+    BOT_TEXT_SLOT_OH                        = 70491, //\"Off-hand\"\n+    BOT_TEXT_SLOT_RH                        = 70492, //\"Ranged\"\n+    BOT_TEXT_SLOT_RELIC                     = 70493, //\"Relic\"\n+    BOT_TEXT_SLOT_HEAD                      = 70494, //\"Head\"\n+    BOT_TEXT_SLOT_SHOULDERS                 = 70495, //\"Shoulders\"\n+    BOT_TEXT_SLOT_CHEST                     = 70496, //\"Chest\"\n+    BOT_TEXT_SLOT_WAIST                     = 70497, //\"Waist\"\n+    BOT_TEXT_SLOT_LEGS                      = 70498, //\"Legs\"\n+    BOT_TEXT_SLOT_FEET                      = 70499, //\"Feet\"\n+    BOT_TEXT_SLOT_WRIST                     = 70500, //\"Wrist\"\n+    BOT_TEXT_SLOT_HANDS                     = 70501, //\"Hands\"\n+    BOT_TEXT_SLOT_BACK                      = 70502, //\"Back\"\n+    BOT_TEXT_SLOT_SHIRT                     = 70503, //\"Shirt\"\n+    BOT_TEXT_SLOT_FINGER1                   = 70504, //\"Finger1\"\n+    BOT_TEXT_SLOT_FINGER2                   = 70505, //\"Finger2\"\n+    BOT_TEXT_SLOT_TRINKET1                  = 70506, //\"Trinket1\"\n+    BOT_TEXT_SLOT_TRINKET2                  = 70507, //\"Trinket2\"\n+    BOT_TEXT_SLOT_NECK                      = 70508, //\"Neck\"\n+    BOT_TEXT_UNEQUIP_ALL                    = 70509, //\"Unequip all\"\n+    BOT_TEXT_UPDATE_VISUAL                  = 70510, //\"Update visual\"\n+    BOT_TEXT_VISUALONLY                     = 70511, //\"visual only\"\n+    BOT_TEXT_EQUIPPED                       = 70512, //\"Equipped\"\n+    BOT_TEXT_NOTHING                        = 70513, //\"nothing\"\n+    BOT_TEXT_USE_OLD_EQUIPMENT              = 70514, //\"Use your old equipment\"\n+    BOT_TEXT_UNEQUIP                        = 70515, //\"Unequip it\"\n+    BOT_TEXT_NOTHING_TO_GIVE                = 70516, //\"Hm... I have nothing to give you\"\n+    BOT_TEXT_GATHERING                      = 70517, //\"Gathering\"\n+    BOT_TEXT_ABILITIES_STATUS               = 70518, //\"Abilities status\"\n+    BOT_TEXT_ALLOWED_ABILITIES              = 70519, //\"Manage allowed abilities\"\n+    BOT_TEXT_USE_                           = 70520, //\"Use \"\n+    BOT_TEXT_UPDATE                         = 70521, //\"Update\"\n+    BOT_TEXT_DAMAGE                         = 70522, //\"Damage\"\n+    BOT_TEXT_CONTROL                        = 70523, //\"Control\"\n+    BOT_TEXT_HEAL                           = 70524, //\"Heal\"\n+    BOT_TEXT_OTHER                          = 70525, //\"Other\"\n+    BOT_TEXT_HIRE_EMOTE_SPHYNX              = 70526, //\" makes a grinding sound and begins to follow \"\n+    BOT_TEXT_HIREFAIL_OWNED                 = 70527, //\"{} will not join you until dismissed by the owner\"\n+    BOT_TEXT_HIREFAIL_LVL60                 = 70528, //\"{} will not join you until you are level 60\"\n+    BOT_TEXT_HIREFAIL_LVL55                 = 70529, //\"{} will not join you until you are level 55\"\n+    BOT_TEXT_HIREFAIL_LVL40                 = 70530, //\"{} will not join you until you are level 40\"\n+    BOT_TEXT_HIREFAIL_LVL20                 = 70531, //\"{} will not join you until you are level 20\"\n+    BOT_TEXT_HIREFAIL_MAXBOTS               = 70532, //\"You exceed max npcbots for your level ({})\"\n+    BOT_TEXT_HIREFAIL_COST                  = 70533, //\"You don't have enough money\"\n+    BOT_TEXT_HIREFAIL_MAXCLASSBOTS          = 70534, //\"You cannot have more bots of that class! {} of {}\"\n+    BOT_TEXT_CANT_DISMISS_EQUIPMENT         = 70535, //\"Cannot reset equipment in slot {} ({})! Cannot dismiss bot!\"\n+    BOT_TEXT_CURRENT                        = 70536, //\"current\"\n+    BOT_TEXT_ATTACK_DISTANCE                = 70537, //\"Attack distance\"\n+    BOT_TEXT_SHORT_RANGE_ATTACKS            = 70538, //\"Short range attacks\"\n+    BOT_TEXT_LONG_RANGE_ATTACKS             = 70539, //\"Long range attacks\"\n+    BOT_TEXT_EXACT                          = 70540, //\"Exact\"\n+    BOT_TEXT_REMOVE_BUFF                    = 70541, //\"Remove buff\"\n+    BOT_TEXT_FIX_POWER                      = 70542, //\"Fix your power type\"\n+    BOT_TEXT_CANT_UNEQUIP_MAILING           = 70543, //\"Cannot unequip {} for some stupid reason! Sending through mail\"\n+    BOT_TEXT_TANK                           = 70544, //\"Tank\"\n+    BOT_TEXT_RANGED                         = 70545, //\"Ranged\"\n+    BOT_TEXT_MINER                          = 70546, //\"Miner\"\n+    BOT_TEXT_HERBALIST                      = 70547, //\"Herbalist\"\n+    BOT_TEXT_SKINNER                        = 70548, //\"Skinner\"\n+    BOT_TEXT_ENGINEER                       = 70549, //\"Engineer\"\n+    BOT_TEXT_OWNERSHIP_EXPIRED              = 70550, //\"Bot ownership expired due to inactivity\"\n+    BOT_TEXT_BOTADDFAIL_DISABLED            = 70551, //\"NpcBot system is currently disabled. Please contact administration.\"\n+    BOT_TEXT_BOTADDFAIL_OWNED               = 70552, //\"{} will not join you, already has master: {}\"\n+    BOT_TEXT_BANK_IS_FULL                   = 70553, //\"Bank is full\"\n+    BOT_TEXT_ASPECT                         = 70554, //\"Aspect\"\n+    BOT_TEXT_MONKEY                         = 70555, //\"Monkey\"\n+    BOT_TEXT_HAWK                           = 70556, //\"Hawk\"\n+    BOT_TEXT_CHEETAH                        = 70557, //\"Cheetah\"\n+    BOT_TEXT_VIPER                          = 70558, //\"Viper\"\n+    BOT_TEXT_BEAST                          = 70559, //\"Beast\"\n+    BOT_TEXT_PACK                           = 70560, //\"Pack\"\n+    BOT_TEXT_WILD                           = 70561, //\"Wild\"\n+    BOT_TEXT_DRAGONHAWK                     = 70562, //\"Dragonhawk\"\n+    BOT_TEXT_NOASPECT                       = 70563, //\"No Aspect\"\n+    BOT_TEXT_AURA                           = 70564, //\"Aura\"\n+    BOT_TEXT_DEVOTION                       = 70565, //\"Devotion\"\n+    BOT_TEXT_CONCENTRATION                  = 70566, //\"Concentration\"\n+    BOT_TEXT_FIRERESISTANCE                 = 70567, //\"Fire Resistance\"\n+    BOT_TEXT_FROSTRESISTANCE                = 70568, //\"Frost Resistance\"\n+    BOT_TEXT_SHADOWRESISTANCE               = 70569, //\"Shadow Resistance\"\n+    BOT_TEXT_RETRIBUTION                    = 70570, //\"Retribution\"\n+    BOT_TEXT_CRUSADER                       = 70571, //\"Crusader\"\n+    BOT_TEXT_NOAURA                         = 70572, //\"No Aura\"\n+    BOT_TEXT_CRIPPLING                      = 70573, //\"Crippling\"\n+    BOT_TEXT_INSTANT                        = 70574, //\"Instant\"\n+    BOT_TEXT_DEADLY                         = 70575, //\"Deadly\"\n+    BOT_TEXT_WOUND                          = 70576, //\"Wound\"\n+    BOT_TEXT_MINDNUMBING                    = 70577, //\"Mind-Numbing\"\n+    BOT_TEXT_ANESTHETIC                     = 70578, //\"Anesthetic\"\n+    BOT_TEXT_NOTHING_C                      = 70579, //\"Nothing\"\n+    BOT_TEXT_FLAMETONGUE                    = 70580, //\"Flametongue\"\n+    BOT_TEXT_FROSTBRAND                     = 70581, //\"Frostbrand\"\n+    BOT_TEXT_WINDFURY                       = 70582, //\"Windfury\"\n+    BOT_TEXT_EARTHLIVING                    = 70583, //\"Earthliving\"\n+    BOT_TEXT_BOTGIVER_SERVICE               = 70584, //\"I need your services\"\n+    BOT_TEXT_BOTGIVER_TOO_MANY_BOTS         = 70585, //\"You have too many bots\"\n+    BOT_TEXT_BOTGIVER_WISH_TO_HIRE_         = 70586, //\"Do you wish to hire \"\n+    BOT_TEXT_BOTGIVER__BOT_BUSY             = 70587, //\" is a bit busy at the moment, try again later.\"\n+    BOT_TEXT_BOTGIVER_HIRESUCCESS           = 70588, //\"Pleasure doing business with you\"\n+    BOT_TEXT_CLASS_WARRIOR_PLU              = 70589, //\"Warriors\"\n+    BOT_TEXT_CLASS_PALADIN_PLU              = 70590, //\"Paladins\"\n+    BOT_TEXT_CLASS_MAGE_PLU                 = 70591, //\"Mages\"\n+    BOT_TEXT_CLASS_PRIEST_PLU               = 70592, //\"Priests\"\n+    BOT_TEXT_CLASS_WARLOCK_PLU              = 70593, //\"Warlocks\"\n+    BOT_TEXT_CLASS_DRUID_PLU                = 70594, //\"Druids\"\n+    BOT_TEXT_CLASS_DEATH_KNIGHT_PLU         = 70595, //\"Death Knights\"\n+    BOT_TEXT_CLASS_ROGUE_PLU                = 70596, //\"Rogues\"\n+    BOT_TEXT_CLASS_SHAMAN_PLU               = 70597, //\"Shamans\"\n+    BOT_TEXT_CLASS_HUNTER_PLU               = 70598, //\"Hunters\"\n+    BOT_TEXT_CLASS_BM_PLU                   = 70599, //\"Blademasters\"\n+    BOT_TEXT_CLASS_SPHYNX_PLU               = 70600, //\"Destroyers\"\n+    BOT_TEXT_CLASS_ARCHMAGE_PLU             = 70601, //\"Archmagi\"\n+    BOT_TEXT_CLASS_DREADLORD_PLU            = 70602, //\"Dreadlords\"\n+    BOT_TEXT_CLASS_SPELLBREAKER_PLU         = 70603, //\"Spell Breakers\"\n+    BOT_TEXT_CLASS_DARK_RANGER_PLU          = 70604, //\"Dark Rangers\"\n+    BOT_TEXT_CLASS_WARRIOR                  = 70605, //\"Warrior\"\n+    BOT_TEXT_CLASS_PALADIN                  = 70606, //\"Paladin\"\n+    BOT_TEXT_CLASS_MAGE                     = 70607, //\"Mage\"\n+    BOT_TEXT_CLASS_PRIEST                   = 70608, //\"Priest\"\n+    BOT_TEXT_CLASS_WARLOCK                  = 70609, //\"Warlock\"\n+    BOT_TEXT_CLASS_DRUID                    = 70610, //\"Druid\"\n+    BOT_TEXT_CLASS_DEATH_KNIGHT             = 70611, //\"Death Knight\"\n+    BOT_TEXT_CLASS_ROGUE                    = 70612, //\"Rogue\"\n+    BOT_TEXT_CLASS_SHAMAN                   = 70613, //\"Shaman\"\n+    BOT_TEXT_CLASS_HUNTER                   = 70614, //\"Hunter\"\n+    BOT_TEXT_CLASS_BM                       = 70615, //\"Blademaster\"\n+    BOT_TEXT_CLASS_SPHYNX                   = 70616, //\"Destroyer\"\n+    BOT_TEXT_CLASS_ARCHMAGE                 = 70617, //\"Archmage\"\n+    BOT_TEXT_CLASS_DREADLORD                = 70618, //\"Dreadlord\"\n+    BOT_TEXT_CLASS_SPELLBREAKER             = 70619, //\"Spell Breaker\"\n+    BOT_TEXT_CLASS_DARK_RANGER              = 70620, //\"Dark Ranger\"\n+    BOT_TEXT_GENDER_MALE                    = 70621, //\"Male\"\n+    BOT_TEXT_GENDER_FEMALE                  = 70622, //\"Female\"\n+    BOT_TEXT_RACE_HUMAN                     = 70623, //\"Human\"\n+    BOT_TEXT_RACE_ORC                       = 70624, //\"Orc\"\n+    BOT_TEXT_RACE_DWARF                     = 70625, //\"Dwarf\"\n+    BOT_TEXT_RACE_NELF                      = 70626, //\"Night Elf\"\n+    BOT_TEXT_RACE_UNDEAD                    = 70627, //\"Undead\"\n+    BOT_TEXT_RACE_TAUREN                    = 70628, //\"Tauren\"\n+    BOT_TEXT_RACE_GNOME                     = 70629, //\"Gnome\"\n+    BOT_TEXT_RACE_TROLL                     = 70630, //\"Troll\"\n+    BOT_TEXT_RACE_BELF                      = 70631, //\"Blood Elf\"\n+    BOT_TEXT_RACE_DRAENEI                   = 70632, //\"Draenei\"\n+    BOT_TEXT_RACE_UNKNOWN                   = 70633, //\"Unknown\"\n+    BOT_TEXT_LOOTING                        = 70634, //\"Looting\"\n+    BOT_TEXT_POOR                           = 70635, //\"Poor\"\n+    BOT_TEXT_COMMON                         = 70636, //\"Common\"\n+    BOT_TEXT_UNCOMMON                       = 70637, //\"Uncommon\"\n+    BOT_TEXT_RARE                           = 70638, //\"Rare\"\n+    BOT_TEXT_EPIC                           = 70639, //\"Epic\"\n+    BOT_TEXT_LEGENDARY                      = 70640, //\"Legendary\"\n+    BOT_TEXT_ENGAGE_BEHAVIOR                = 70641, //\"Engage behavior\"\n+    BOT_TEXT_DELAY_ATTACK_BY                = 70642, //\"Delay attack by\"\n+    BOT_TEXT_DELAY_HEALING_BY               = 70643, //\"Delay healing by\"\n+    BOT_TEXT_SECOND_SHORT                   = 70644, //\"s\"\n+    BOT_TEXT_TANK_OFF                       = 70645, //\"Off-Tank\"\n+    BOT_TEXT_CLASS_NECROMANCER_PLU          = 70646, //\"Necromancers\"\n+    BOT_TEXT_CLASS_NECROMANCER              = 70647, //\"Necromancer\"\n+    BOT_TEXT_ATTACK_ANGLE                   = 70648, //\"Attack angle\"\n+    BOT_TEXT_NORMAL                         = 70649, //\"Normal\"\n+    BOT_TEXT_AVOID_FRONTAL_AOE              = 70650, //\"Avoid frontal AOE\"\n+    BOT_TEXT_HIREDENY_SEAWITCH              = 70651, //NIY\n+    BOT_TEXT_HIREWARN_SEAWITCH              = 70652, //\"Are you sure this is gonna work? It's better be the best water in the world...\"\n+    BOT_TEXT_HIREOPTION_SEAWITCH            = 70653, //\"Seems like you could really use a drink of fresh water.\"\n+    BOT_TEXT_CLASS_SEAWITCH_PLU             = 70654, //\"Sea Witches\"\n+    BOT_TEXT_CLASS_SEAWITCH                 = 70655, //\"Sea Witch\"\n+    BOT_TEXT_MANA_PER_DAMAGE                = 70656, //\"Mana per damage\"\n+    BOT_TEXT_DAMAGE_PER_MANA                = 70657, //\"Damage per mana\"\n+    BOT_TEXT_TRANSMOGRIFICATION             = 70658, //\"Transmogrification...\"\n+    BOT_TEXT_DISABLE_COMBAT_POSITIONING     = 70659, //\"DISABLE combat positioning\"\n+    BOT_TEXT_PRIORITY_TARGET                = 70660, //\"Priority target\"\n+    BOT_TEXT_BOT_GEAR_BANK                  = 70661, //\"Bot gear bank...\"\n+    BOT_TEXT_DEPOSIT_ITEMS                  = 70662, //\"Deposit items...\"\n+    BOT_TEXT_WITHDRAW_ITEMS                 = 70663, //\"Withdraw items...\"\n+    BOT_TEXT_BANK_IS_EMPTY                  = 70664, //\"Bank is empty\"\n+    BOT_TEXT_PREVIOUS_PAGE                  = 70665, //\"Previous page\"\n+    BOT_TEXT_NEXT_PAGE                      = 70666, //\"Next page\"\n+    BOT_TEXT_HIREWARN_CRYPTLORD             = 70667, //\"Do you really want to spend all this money to make Crypt Lord move again?\"\n+    BOT_TEXT_HIREOPTION_CRYPTLORD           = 70668, //\"I doubt your ability to do much harm in your current state, but I am willing to lead you and help you restore your powers.\"\n+    BOT_TEXT_CLASS_CRYPT_LORD_PLU           = 70669, //\"Crypt Lords\"\n+    BOT_TEXT_CLASS_CRYPT_LORD               = 70670, //\"Crypt Lord\"\n+    BOT_TEXT_REFLECT                        = 70671, //\"Reflect\"\n+    BOT_TEXT_LOCUSTS                        = 70672, //\"Locusts\"\n+    BOT_TEXT_HEAL_TARGET_HEALTH_THRESHOLD   = 70673, //\"Heal target health threshold\"\n+    BOT_TEXT_I_NEED_A_PORTAL                = 70674, //\"I need a portal\"\n+    BOT_TEXT_STORMWIND                      = 70675, //\"Stormwind\"\n+    BOT_TEXT_IRONFORGE                      = 70676, //\"Ironforge\"\n+    BOT_TEXT_DARNASSUS                      = 70677, //\"Darnassus\"\n+    BOT_TEXT_EXORDAR                        = 70678, //\"Exordar\"\n+    BOT_TEXT_ORGRIMMAR                      = 70679, //\"Orgrimmar\"\n+    BOT_TEXT_UNDERCITY                      = 70680, //\"Undercity\"\n+    BOT_TEXT_THUNDER_BLUFF                  = 70681, //\"Thunder Bluff\"\n+    BOT_TEXT_SILVERMOON                     = 70682, //\"Silvermoon\"\n+    BOT_TEXT_SHATTRATH                      = 70683, //\"Shattrath\"\n+    BOT_TEXT_DALARAN                        = 70684, //\"Dalaran\"\n+    BOT_TEXT_HIREFAIL_MAXBOTS_ACCOUNT       = 70685, //\"You exceed max npcbots for your account ({} >= {})\"\n+    BOT_TEXT_SET_FOR_ALL_EVERYONE           = 70686, //\"<Set for all bots>\"\n+    BOT_TEXT___GEAR_BANK_                   = 70687, //\" (gear bank)\"\n+    BOT_TEXT_NOT_ENOUGH_GEAR_BANK_SPACE     = 70688, //\"Not enough gear bank space to store %u item(s) (%u / %u)!\"\n+    BOT_TEXT_EQUIPMENT_SETS                 = 70689, //\"Equipment sets\"\n+    BOT_TEXT_CREATE                         = 70690, //\"Create\"\n+    BOT_TEXT_DELETE                         = 70691, //\"Delete\"\n+    BOT_TEXT_EQUIP                          = 70692, //\"Equip\"\n+    BOT_TEXT_MISSING                        = 70693, //\"missing\"\n+    BOT_TEXT_MANAGE_OWNERSHIP               = 70694, //\"Manage ownership...\"\n+    BOT_TEXT_ADD_OWNER                      = 70695, //\"<Add owner>\"\n+    BOT_TEXT_SHARED_BOT_WARN_ADD            = 70696, //\"WARNING: by sharing ownership over your bot you give another player FULL control over their inventory, roles and all other settings (including sharing them with others)\"\n+    BOT_TEXT_REMOVE_OWNER                   = 70697, //\"<Remove owner>\"\n+    BOT_TEXT_OWNERS_LIMIT_EXCEEDED          = 70698, //\"Owners limit exceeded\"\n+    BOT_TEXT_SHARED_WITH                    = 70699, //\"Shared with\"\n+    BOT_TEXT_OWNER                          = 70700, //\"Owner\"\n+    //70701-71000 reserved for custom localization strings\n+};\n+\n+#endif //BOTTEXT_H\ndiff --git a/src/server/game/AI/NpcBots/botwanderful.cpp b/src/server/game/AI/NpcBots/botwanderful.cpp\nnew file mode 100644\nindex 0000000000..6585ec96b8\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/botwanderful.cpp\n@@ -0,0 +1,455 @@\n+#include \"botdefine.h\"\n+#include \"botwanderful.h\"\n+#include \"DBCStores.h\"\n+#include \"SpellAuras.h\"\n+#include \"StringConvert.h\"\n+#include \"TemporarySummon.h\"\n+\n+#include <algorithm>\n+#include <iomanip>\n+#include <numeric>\n+#include <unordered_set>\n+\n+#ifdef _MSC_VER\n+# pragma warning(push, 4)\n+#endif\n+\n+uint32 WanderNode::nextWPId = 0;\n+WanderNode::node_ltype WanderNode::ALL_WPS = {};\n+WanderNode::node_mtype WanderNode::ALL_WPS_PER_MAP = {};\n+WanderNode::node_mtype WanderNode::ALL_WPS_PER_ZONE = {};\n+WanderNode::node_mtype WanderNode::ALL_WPS_PER_AREA = {};\n+\n+WanderNode::mutex_type* WanderNode::GetLock()\n+{\n+    static mutex_type _lock;\n+    return &_lock;\n+}\n+\n+WanderNode* WanderNode::FindInAllWPs(uint32 wpId)\n+{\n+    std::shared_lock lock(*GetLock());\n+\n+    auto ci = std::ranges::find_if(ALL_WPS, [wpId = wpId](WanderNode const* wp) {\n+        return wp->GetWPId() == wpId;\n+    });\n+\n+    return ci == ALL_WPS.cend() ? nullptr : *ci;\n+}\n+\n+WanderNode* WanderNode::FindInAllWPs(Creature const* creature)\n+{\n+    if (!creature)\n+        return nullptr;\n+\n+    std::shared_lock lock(*GetLock());\n+\n+    auto ci = std::ranges::find_if(ALL_WPS, [=](WanderNode const* wp) {\n+        return wp->GetCreature() == creature;\n+    });\n+\n+    return ci == ALL_WPS.cend() ? nullptr : *ci;\n+}\n+\n+WanderNode* WanderNode::FindInMapWPs(uint32 mapId, Creature const* creature)\n+{\n+    if (!creature)\n+        return nullptr;\n+\n+    std::shared_lock lock(*GetLock());\n+\n+    decltype(ALL_WPS_PER_MAP)::const_iterator cim = ALL_WPS_PER_MAP.find(mapId);\n+    if (cim == ALL_WPS_PER_MAP.cend())\n+        return nullptr;\n+    decltype(cim->second)::const_iterator ci = std::ranges::find_if(cim->second, [=](WanderNode const* wp) {\n+        return wp->GetCreature() == creature;\n+    });\n+\n+    return ci == cim->second.cend() ? nullptr : *ci;\n+}\n+\n+WanderNode* WanderNode::FindInMapWPs(uint32 mapId, uint32 wpId)\n+{\n+    std::shared_lock lock(*GetLock());\n+\n+    decltype(ALL_WPS_PER_MAP)::const_iterator cim = ALL_WPS_PER_MAP.find(mapId);\n+    if (cim == ALL_WPS_PER_MAP.cend())\n+        return nullptr;\n+    decltype(cim->second)::const_iterator ci = std::ranges::find_if(cim->second, [=](WanderNode const* wp) {\n+        return wp->GetWPId() == wpId;\n+    });\n+\n+    return ci == cim->second.cend() ? nullptr : *ci;\n+}\n+\n+WanderNode* WanderNode::FindInMapWPs(uint32 mapId, node_check_ftype_c const& pred)\n+{\n+    std::shared_lock lock(*GetLock());\n+\n+    decltype(ALL_WPS_PER_MAP)::const_iterator cim = ALL_WPS_PER_MAP.find(mapId);\n+    if (cim == ALL_WPS_PER_MAP.cend())\n+        return nullptr;\n+    decltype(cim->second)::const_iterator ci = std::ranges::find_if(cim->second, pred);\n+\n+    return ci == cim->second.cend() ? nullptr : *ci;\n+}\n+\n+WanderNode* WanderNode::FindInZoneWPs(uint32 zoneId, node_check_ftype_c const& pred)\n+{\n+    std::shared_lock lock(*GetLock());\n+\n+    decltype(ALL_WPS_PER_ZONE)::const_iterator cim = ALL_WPS_PER_ZONE.find(zoneId);\n+    if (cim == ALL_WPS_PER_ZONE.cend())\n+        return nullptr;\n+    decltype(cim->second)::const_iterator ci = std::ranges::find_if(cim->second, pred);\n+\n+    return ci == cim->second.cend() ? nullptr : *ci;\n+}\n+\n+WanderNode* WanderNode::FindInAreaWPs(uint32 areaId, node_check_ftype_c const& pred)\n+{\n+    std::shared_lock lock(*GetLock());\n+\n+    decltype(ALL_WPS_PER_AREA)::const_iterator cim = ALL_WPS_PER_AREA.find(areaId);\n+    if (cim == ALL_WPS_PER_AREA.cend())\n+        return nullptr;\n+    decltype(cim->second)::const_iterator ci = std::ranges::find_if(cim->second, pred);\n+\n+    return ci == cim->second.cend() ? nullptr : *ci;\n+}\n+\n+void WanderNode::DoForAllWPs(node_proc_ftype_c&& func)\n+{\n+    std::shared_lock lock(*GetLock());\n+\n+    DoForContainerWPs(ALL_WPS, std::forward<node_proc_ftype_c>(func));\n+}\n+\n+void WanderNode::DoForAllZoneWPs(uint32 zoneId, node_proc_ftype_c&& func)\n+{\n+    std::shared_lock lock(*GetLock());\n+\n+    decltype(ALL_WPS_PER_ZONE)::const_iterator ci = ALL_WPS_PER_ZONE.find(zoneId);\n+    if (ci != ALL_WPS_PER_ZONE.cend())\n+        DoForContainerWPs(ci->second, std::forward<node_proc_ftype_c>(func));\n+}\n+\n+void WanderNode::DoForAllMapWPs(uint32 mapId, node_proc_ftype_c&& func)\n+{\n+    std::shared_lock lock(*GetLock());\n+\n+    decltype(ALL_WPS_PER_MAP)::const_iterator ci = ALL_WPS_PER_MAP.find(mapId);\n+    if (ci != ALL_WPS_PER_MAP.cend())\n+        DoForContainerWPs(ci->second, std::forward<node_proc_ftype_c>(func));\n+}\n+\n+void WanderNode::DoForAllAreaWPs(uint32 areaId, node_proc_ftype_c&& func)\n+{\n+    std::shared_lock lock(*GetLock());\n+\n+    decltype(ALL_WPS_PER_AREA)::const_iterator ci = ALL_WPS_PER_AREA.find(areaId);\n+    if (ci != ALL_WPS_PER_AREA.cend())\n+        DoForContainerWPs(ci->second, std::forward<node_proc_ftype_c>(func));\n+}\n+\n+size_t WanderNode::GetAllWPsCount()\n+{\n+    std::shared_lock lock(*GetLock());\n+\n+    return ALL_WPS.size();\n+}\n+\n+size_t WanderNode::GetMapWPsCount(uint32 mapId)\n+{\n+    std::shared_lock lock(*GetLock());\n+\n+    decltype(ALL_WPS_PER_MAP)::const_iterator ci = ALL_WPS_PER_MAP.find(mapId);\n+    return ci != ALL_WPS_PER_MAP.cend() ? ci->second.size() : 0u;\n+}\n+\n+size_t WanderNode::GetWPMapsCount()\n+{\n+    std::shared_lock lock(*GetLock());\n+\n+    return ALL_WPS_PER_MAP.size();\n+}\n+\n+WanderNode::WanderNode(uint32 wpId, uint32 mapId, float x, float y, float z, float o, uint32 zoneId, uint32 areaId, std::string&& name)\n+    : Position(x, y, z, o), _wpId(wpId), _mapId(mapId), _zoneId(zoneId), _areaId(areaId),\n+    _name(std::move(name)), _minLevel(1u), _maxLevel(DEFAULT_MAX_LEVEL), _flags(0), _to_links_count(0), _creature(nullptr)\n+{\n+    ASSERT(!!sMapStore.LookupEntry(_mapId), \"WanderNode::Ctr(): Invalid value for _mapId\");\n+    ASSERT(!!sAreaTableStore.LookupEntry(_zoneId), \"WanderNode::Ctr(): Invalid value for _zoneId\");\n+    ASSERT(!!sAreaTableStore.LookupEntry(_areaId), \"WanderNode::Ctr(): Invalid value for _areaId\");\n+\n+    std::unique_lock lock(*GetLock());\n+\n+    ALL_WPS.push_back(this);\n+    ALL_WPS_PER_MAP.try_emplace(_mapId).first->second.push_back(this);\n+    ALL_WPS_PER_ZONE.try_emplace(_zoneId).first->second.push_back(this);\n+    ALL_WPS_PER_AREA.try_emplace(_areaId).first->second.push_back(this);\n+}\n+\n+WanderNode::~WanderNode()\n+{\n+    RemoveWP(this);\n+}\n+\n+void WanderNode::RemoveWP(WanderNode* wp)\n+{\n+    while (!wp->GetLinks().empty())\n+        wp->UnLink(wp->GetLinks().front());\n+\n+    if (wp->GetCreature() && wp->GetCreature()->IsInWorld())\n+        Unit::Kill(wp->GetCreature(), wp->GetCreature());\n+\n+    ALL_WPS_PER_AREA.at(wp->_areaId).remove(wp);\n+    ALL_WPS_PER_ZONE.at(wp->_zoneId).remove(wp);\n+    ALL_WPS_PER_MAP.at(wp->_mapId).remove(wp);\n+    ALL_WPS.remove(wp);\n+\n+    //WP removal should only be performed during maintanence with no players online\n+    //WE LET THE NODE LEAK for threadsafety - wp or creature pointer could be held ouside of sync context\n+    //delete wp\n+}\n+\n+void WanderNode::RemoveAllWPs()\n+{\n+    std::unique_lock lock(*GetLock());\n+\n+    while (!ALL_WPS.empty())\n+        RemoveWP(ALL_WPS.front());\n+}\n+\n+WanderNode::node_lltype WanderNode::GetShortestPathLinks(WanderNode const* target, WanderNode::node_lltype const& base_links, BotWPLevel max_level_diff) const\n+{\n+    using NodeLinkList = WanderNode::node_lltype;\n+    using NodeLinkPList = std::vector<WanderNodeLink const*>;\n+\n+    ASSERT(std::ranges::all_of(base_links, [this](WanderNodeLink const& wpl) { return HasLink(wpl.Id()); }));\n+\n+    NodeLinkList retlist;\n+    if (this == target)\n+        retlist.push_back(WanderNodeLink{ .wp = const_cast<WanderNode*>(this), .weight = 10000 });\n+    else\n+    {\n+        std::list<std::pair<uint32 /*level*/, WanderNodeLink const*>> validLinks;\n+        for (WanderNodeLink const& link : base_links)\n+        {\n+            if (link.wp == target)\n+            {\n+                retlist.push_back(link);\n+                validLinks.clear();\n+                break;\n+            }\n+\n+            if (max_level_diff != BotWPLevel::BOTWP_LEVEL_ZERO && link.wp->GetLinks().size() == 1 && link.wp->GetLinks().front().wp == this)\n+                continue;\n+\n+            std::unordered_set<uint32> checked_links;\n+            checked_links.insert(GetWPId());\n+            NodeLinkPList vlinks_cur;\n+            NodeLinkList clinks;\n+            clinks.push_back(link);\n+            for (uint32 level = 0; !clinks.empty(); ++level)\n+            {\n+                for (WanderNodeLink const& wpl : clinks)\n+                {\n+                    if (wpl.wp->HasLink(target))\n+                        vlinks_cur.push_back(&link);\n+                }\n+                if (!vlinks_cur.empty())\n+                {\n+                    validLinks.emplace_back(level, &link);\n+                    break;\n+                }\n+                decltype(clinks) clinks_new;\n+                for (WanderNodeLink const& wpl : clinks)\n+                {\n+                    checked_links.insert(wpl.Id()); // cut off all ways back (2-ways, circular)\n+                    std::copy_if(wpl.wp->GetLinks().cbegin(), wpl.wp->GetLinks().cend(), std::back_inserter(clinks_new), [&checked_links](WanderNodeLink const& wpl) {\n+                        return !checked_links.contains(wpl.Id());\n+                    });\n+                }\n+                clinks = std::move(clinks_new);\n+            }\n+        }\n+\n+        if (!validLinks.empty())\n+        {\n+            //only choose one of the shortest routes\n+            if (validLinks.size() > 1)\n+            {\n+                auto minlevel = std::numeric_limits<decltype(validLinks)::value_type::first_type>::max();\n+                for (auto const& vlp : validLinks)\n+                    minlevel = std::min<decltype(minlevel)>(minlevel, vlp.first);\n+                decltype(minlevel) inclevel = minlevel + AsUnderlyingType(max_level_diff);\n+                std::erase_if(validLinks, [=, this](decltype(validLinks)::value_type const& p) {\n+                    return p.first > inclevel || (p.first > minlevel && p.second->wp->GetExactDist2d(target) > GetExactDist2d(target));\n+                });\n+            }\n+            for (auto const& kv : validLinks)\n+                retlist.push_back(*kv.second); //copying 16 bytes each\n+        }\n+    }\n+\n+    return retlist;\n+}\n+\n+void WanderNode::SetCreature(Creature* creature)\n+{\n+    if (creature != nullptr)\n+        ASSERT(!_creature);\n+\n+    _creature = creature;\n+}\n+\n+Creature* WanderNode::GetCreature() const\n+{\n+    return _creature;\n+}\n+\n+uint32 WanderNode::GetAverageLinkWeight(bool exclude_0/* = false*/) const\n+{\n+    if (GetLinks().empty())\n+        return 0;\n+\n+    if (exclude_0)\n+    {\n+        uint32 zeros_count = 0;\n+        uint32 sum = 0;\n+        for (WanderNodeLink const& wpl : GetLinks())\n+        {\n+            sum += wpl.weight;\n+            if (wpl.weight == 0)\n+                ++zeros_count;\n+        }\n+        return sum / std::max<uint32>(1u, GetLinks().size() - zeros_count);\n+    }\n+\n+    return static_cast<uint32>(std::accumulate(GetLinks().cbegin(), GetLinks().cend(), 0u, [](size_t total, WanderNodeLink const& wpl) { return total + wpl.weight; }) / GetLinks().size());\n+}\n+\n+std::string WanderNode::FormatLinks() const\n+{\n+    std::ostringstream lss;\n+    for (WanderNodeLink const& wpl : _links)\n+        lss << uint32(wpl.Id()) << ':' << uint32(wpl.weight) << ' ';\n+\n+    return lss.str();\n+}\n+\n+void WanderNode::SetLinkWeight(uint32 wp_id, uint32 new_weight)\n+{\n+    auto lit = GetLink(wp_id);\n+    ASSERT(lit != GetLinks().cend());\n+    lit->weight = new_weight;\n+}\n+\n+void WanderNode::SetFlags(BotWPFlags flags)\n+{\n+    _flags |= AsUnderlyingType(flags);\n+    if (Creature* wpc = GetCreature())\n+    {\n+        wpc->SetMaxPower(POWER_MANA, GetFlags());\n+        wpc->SetPower(POWER_MANA, GetFlags());\n+    }\n+}\n+\n+void WanderNode::RemoveFlags(BotWPFlags flags)\n+{\n+    _flags &= ~AsUnderlyingType(flags);\n+    if (Creature* wpc = GetCreature())\n+    {\n+        wpc->SetMaxPower(POWER_MANA, GetFlags());\n+        wpc->SetPower(POWER_MANA, GetFlags());\n+    }\n+}\n+\n+bool WanderNode::HasFlag(BotWPFlags flags) const\n+{\n+    return !!(_flags & AsUnderlyingType(flags));\n+}\n+\n+bool WanderNode::HasAllFlags(BotWPFlags flags) const\n+{\n+    return (_flags & AsUnderlyingType(flags)) == AsUnderlyingType(flags);\n+}\n+\n+std::string WanderNode::ToString(int32 link_weight/* = -1*/) const\n+{\n+    std::ostringstream wps;\n+    wps << \"WP \" << _wpId << (link_weight >= 0 ? (\":\" + Bcore::ToString(link_weight)) : std::string{})\n+        << \" '\" << _name << \"', \" << uint32(_links.size()) << \" link(s) (avg weight \" << GetAverageLinkWeight()\n+        << \"), Map \" << _mapId << \", Zone \" << _zoneId << \", Area \" << _areaId << \", minLvl \" << uint32(_minLevel) << \", maxLvl \" << uint32(_maxLevel)\n+        << \" (\" << std::setiosflags(std::ios_base::fixed) << std::setprecision(2) << \"X: \" << m_positionX << \" Y: \" << m_positionY << \" Z: \" << m_positionZ\n+        << \"), flags: 0x\" << std::hex << std::setw(8) << std::setfill('0') << _flags << std::dec;\n+    return wps.str();\n+}\n+\n+void WanderNode::Link(WanderNodeLink&& wpl)\n+{\n+    if (!HasLink(wpl))\n+    {\n+        _links.push_back(std::move(wpl));\n+        _links.back().wp->_setLinkedBy(this);\n+        SetupLinkFromAura();\n+    }\n+}\n+void WanderNode::UnLink(uint32 wp_id)\n+{\n+    auto lit = GetLink(wp_id);\n+    if (lit != _links.cend())\n+    {\n+        WanderNode* lwp = lit->wp;\n+        _links.erase(lit);\n+        lwp->_setUnLinkedBy(this);\n+        SetupLinkFromAura();\n+    }\n+}\n+void WanderNode::_setLinkedBy(WanderNode const*/* lwp*/)\n+{\n+    ++_to_links_count;\n+    SetupLinkToAura();\n+}\n+void WanderNode::_setUnLinkedBy(WanderNode const*/* lwp*/)\n+{\n+    --_to_links_count;\n+    SetupLinkToAura();\n+}\n+void WanderNode::SetupLinkFromAura() const\n+{\n+    if (Creature* wpc = GetCreature())\n+    {\n+        Aura* linkfrom = wpc->GetAura(WP_SPELL_ID_LINK_FROM);\n+        if (GetLinks().empty())\n+        {\n+            if (linkfrom)\n+                linkfrom->Remove();\n+            return;\n+        }\n+        if (!linkfrom)\n+            linkfrom = wpc->AddAura(WP_SPELL_ID_LINK_FROM, wpc);\n+        linkfrom->SetStackAmount((uint8)GetLinks().size());\n+    }\n+}\n+void WanderNode::SetupLinkToAura() const\n+{\n+    if (Creature* wpc = GetCreature())\n+    {\n+        Aura* linkto = wpc->GetAura(WP_SPELL_ID_LINK_TO);\n+        if (_to_links_count == 0)\n+        {\n+            if (linkto)\n+                linkto->Remove();\n+            return;\n+        }\n+        if (!linkto)\n+            linkto = wpc->AddAura(WP_SPELL_ID_LINK_TO, wpc);\n+        linkto->SetStackAmount((uint8)_to_links_count);\n+    }\n+}\n+\n+#ifdef _MSC_VER\n+# pragma warning(pop)\n+#endif\ndiff --git a/src/server/game/AI/NpcBots/botwanderful.h b/src/server/game/AI/NpcBots/botwanderful.h\nnew file mode 100644\nindex 0000000000..76299cfc87\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/botwanderful.h\n@@ -0,0 +1,240 @@\n+#ifndef BOTWANDERFUL_H_\n+#define BOTWANDERFUL_H_\n+\n+#include \"EnumFlag.h\"\n+#include \"Position.h\"\n+\n+#include <functional>\n+#include <list>\n+#include <mutex>\n+#include <shared_mutex>\n+#include <unordered_map>\n+\n+/*\n+NpcBot System by Trickerer (onlysuffering@gmail.com)\n+Original patch from: LordPsyan https://bitbucket.org/lordpsyan/trinitycore-patches/src/3b8b9072280e/Individual/11185-BOTS-NPCBots.patch\n+*/\n+\n+class Creature;\n+\n+enum class BotWPFlags : uint32\n+{\n+    BOTWP_FLAG_NONE                         = 0x00000000,\n+    BOTWP_FLAG_SPAWN                        = 0x00000001, // wandering bots can spawn at this WP location\n+    BOTWP_FLAG_ALLIANCE_ONLY                = 0x00000002, // only alliance bots can move here, SPAWN+A = only alliance bots can spawn at this WP location\n+    BOTWP_FLAG_HORDE_ONLY                   = 0x00000004, // only horde bots can move here, SPAWN+H = only horde bots can spawn at this WP location\n+    BOTWP_FLAG_CAN_BACKTRACK_FROM           = 0x00000008, // can move back to WPs links even if other links exist\n+    BOTWP_FLAG_MOVEMENT_IGNORES_FACTION     = 0x00000010, // ignore faction flags when trying to select this WP as move point\n+    BOTWP_FLAG_MOVEMENT_IGNORES_PATHING     = 0x00000020, // do not generate path between 2 WPs having this flag\n+    BOTWP_FLAG_BG_FLAG_DELIVER_TARGET       = 0x00000040, // <BG only> flag carrier destination marker\n+    BOTWP_FLAG_BG_FLAG_PICKUP_TARGET        = 0x00000080, // <BG only> flag pick/activate up marker\n+    BOTWP_FLAG_BG_BOSS_ROOM                 = 0x00000100, // <BG only> boss room to attack as group / defend\n+    BOTWP_FLAG_BG_MISC_OBJECTIVE_1          = 0x00000200, // <BG only> misc objective 1 (AV = mine, EY = intercept)\n+    BOTWP_FLAG_BG_MISC_OBJECTIVE_2          = 0x00000400, // <BG only> misc objective 2 (AV = captain)\n+    BOTWP_FLAG_BG_OPTIONAL_PICKUP_1         = 0x00000800, // <BG only> optional pickup point 1 (WS = healNW, AB = stables, EY = buffNW)\n+    BOTWP_FLAG_BG_OPTIONAL_PICKUP_2         = 0x00001000, // <BG only> optional pickup point 2 (WS = bersNE, AB = farm, EY = buffNE)\n+    BOTWP_FLAG_BG_OPTIONAL_PICKUP_3         = 0x00002000, // <BG only> optional pickup point 3 (WS = healSE, AB = mill, EY = buffSW)\n+    BOTWP_FLAG_BG_OPTIONAL_PICKUP_4         = 0x00004000, // <BG only> optional pickup point 4 (WS = bersSW, AB = mine, EY = buffSE)\n+    BOTWP_FLAG_BG_OPTIONAL_PICKUP_5         = 0x00008000, // <BG only> optional pickup point 5 (AB = blacksmith)\n+    BOTWP_FLAG_MOVEMENT_FORCE_JUMP_BEGIN    = 0x00010000, // movement between 2 WPs having begin and end flags is forced to be a jump (prevent casting when falling from a cliff)\n+    BOTWP_FLAG_MOVEMENT_FORCE_JUMP_END      = 0x00020000, // movement between 2 WPs having begin and end flags is forced to be a jump (prevent casting when falling from a cliff)\n+    BOTWP_FLAG_INTERACTION_MILL_RADIUS      = 0x00040000, // if chosen as a mill point, radius is reduced to INTERACTION_DISTANCE\n+    BOTWP_FLAG_NOT_A_START_POINT            = 0x00080000, // a bot can not teleport to this node, its a waypoint for moving only.\n+    BOTWP_FLAG_END                          = 0x00100000,\n+\n+    BOTWP_FLAGS_ALL_VALID                   = BOTWP_FLAG_END - 1,\n+\n+    BOTWP_FLAG_ALLIANCE_OR_HORDE_ONLY       = BOTWP_FLAG_ALLIANCE_ONLY | BOTWP_FLAG_HORDE_ONLY,\n+    BOTWP_FLAG_ALLIANCE_SPAWN_POINT         = BOTWP_FLAG_SPAWN | BOTWP_FLAG_ALLIANCE_ONLY,\n+    BOTWP_FLAG_HORDE_SPAWN_POINT            = BOTWP_FLAG_SPAWN | BOTWP_FLAG_HORDE_ONLY,\n+    BOTWP_FLAG_ALLIANCE_FLAG_DELIVER_TARGET = BOTWP_FLAG_BG_FLAG_DELIVER_TARGET | BOTWP_FLAG_ALLIANCE_ONLY,\n+    BOTWP_FLAG_HORDE_FLAG_DELIVER_TARGET    = BOTWP_FLAG_BG_FLAG_DELIVER_TARGET | BOTWP_FLAG_HORDE_ONLY,\n+    BOTWP_FLAG_ALLIANCE_FLAG_PICKUP_TARGET  = BOTWP_FLAG_BG_FLAG_PICKUP_TARGET | BOTWP_FLAG_ALLIANCE_ONLY,\n+    BOTWP_FLAG_HORDE_FLAG_PICKUP_TARGET     = BOTWP_FLAG_BG_FLAG_PICKUP_TARGET | BOTWP_FLAG_HORDE_ONLY,\n+    BOTWP_FLAG_ALLIANCE_BOSS_ROOM           = BOTWP_FLAG_BG_BOSS_ROOM | BOTWP_FLAG_ALLIANCE_ONLY,\n+    BOTWP_FLAG_HORDE_BOSS_ROOM              = BOTWP_FLAG_BG_BOSS_ROOM | BOTWP_FLAG_HORDE_ONLY,\n+    BOTWP_FLAG_ALLIANCE_DEMIBOSS_ROOM       = BOTWP_FLAG_BG_MISC_OBJECTIVE_2 | BOTWP_FLAG_ALLIANCE_ONLY,\n+    BOTWP_FLAG_HORDE_DEMIBOSS_ROOM          = BOTWP_FLAG_BG_MISC_OBJECTIVE_2 | BOTWP_FLAG_HORDE_ONLY,\n+    BOTWP_FLAG_SPAWN_INTERCEPT_ALLIANCE     = BOTWP_FLAG_BG_MISC_OBJECTIVE_1 | BOTWP_FLAG_ALLIANCE_ONLY,\n+    BOTWP_FLAG_SPAWN_INTERCEPT_HORDE        = BOTWP_FLAG_BG_MISC_OBJECTIVE_1 | BOTWP_FLAG_HORDE_ONLY,\n+    BOTWP_FLAG_OPTIONAL_PICKUP              = (BOTWP_FLAG_BG_OPTIONAL_PICKUP_1 | BOTWP_FLAG_BG_OPTIONAL_PICKUP_2 | BOTWP_FLAG_BG_OPTIONAL_PICKUP_3 |\n+                                               BOTWP_FLAG_BG_OPTIONAL_PICKUP_4 | BOTWP_FLAG_BG_OPTIONAL_PICKUP_5),\n+    BOTWP_FLAG_WS_PICKUP_RESTORATION        = BOTWP_FLAG_BG_OPTIONAL_PICKUP_1 | BOTWP_FLAG_BG_OPTIONAL_PICKUP_3,\n+    BOTWP_FLAG_WS_PICKUP_BERSERKING         = BOTWP_FLAG_BG_OPTIONAL_PICKUP_2 | BOTWP_FLAG_BG_OPTIONAL_PICKUP_4,\n+};\n+\n+DEFINE_ENUM_FLAG(BotWPFlags);\n+\n+enum class BotWPLevel : uint32\n+{\n+    BOTWP_LEVEL_ZERO                        = 0,\n+    BOTWP_LEVEL_ONE                         = 1,\n+};\n+\n+inline constexpr uint32 WP_SPELL_ID_LINK_TO = 64034;\n+inline constexpr uint32 WP_SPELL_ID_LINK_FROM = 64036;\n+\n+class WanderNode : public Position\n+{\n+public:\n+    struct WanderNodeLink\n+    {\n+        WanderNode* wp;\n+        uint32 weight;\n+\n+        inline constexpr uint32 Id() const noexcept { return wp ? wp->GetWPId() : 0; }\n+\n+        inline constexpr bool operator==(WanderNodeLink const& other) const noexcept { return Id() == other.Id(); }\n+        inline constexpr std::strong_ordering operator<=>(WanderNodeLink const& other) const noexcept { return Id() <=> other.Id(); }\n+\n+        struct WeightExtractor {\n+            inline constexpr uint32 operator()(WanderNodeLink const& wpl) const noexcept { return wpl.weight; }\n+            inline constexpr uint32 operator()(WanderNodeLink const* wpl) const noexcept { return wpl->weight; }\n+        };\n+    };\n+\n+private:\n+    using node_ltype = std::list<WanderNode*>;\n+    using node_ltype_c = std::list<WanderNode const*>;\n+    using node_mtype = std::unordered_map<uint32, node_ltype>;\n+    using node_lltype = std::list<WanderNodeLink>;\n+\n+    using node_proc_ftype = std::function<void(WanderNode*)>;\n+    using node_proc_ftype_c = std::function<void(WanderNode const*)>;\n+    using node_check_ftype_c = std::function<bool(WanderNode const*)>;\n+    using node_proc_ltype = std::function<void(WanderNodeLink const&)>;\n+\n+    using mutex_type = std::shared_mutex;\n+\n+    static node_ltype ALL_WPS;\n+    static node_mtype ALL_WPS_PER_MAP;\n+    static node_mtype ALL_WPS_PER_ZONE;\n+    static node_mtype ALL_WPS_PER_AREA;\n+\n+    static mutex_type* GetLock();\n+\n+public:\n+    static uint32 nextWPId;\n+\n+    static WanderNode* FindInAllWPs(uint32 wpId);\n+    static WanderNode* FindInAllWPs(Creature const* creature);\n+    static WanderNode* FindInMapWPs(uint32 mapId, Creature const* creature);\n+    static WanderNode* FindInMapWPs(uint32 mapId, uint32 wpId);\n+    static WanderNode* FindInMapWPs(uint32 mapId, node_check_ftype_c const& pred);\n+    static WanderNode* FindInZoneWPs(uint32 zoneId, node_check_ftype_c const& pred);\n+    static WanderNode* FindInAreaWPs(uint32 areaId, node_check_ftype_c const& pred);\n+\n+    template<typename Func>\n+    requires (std::is_convertible_v<Func, node_proc_ltype>)\n+    static void DoForContainerWPLinks(WanderNode::node_lltype const& c, Func&& func) {\n+        for (auto const& wl : c)\n+            func(wl);\n+    }\n+\n+    template<typename Container, typename Func>\n+    requires (\n+        std::is_convertible_v<Func, node_proc_ftype_c> &&\n+        std::is_same_v<std::decay_t<std::remove_pointer_t<typename Container::value_type>>, WanderNode> &&\n+        std::input_or_output_iterator<typename Container::iterator>\n+    )\n+    static void DoForContainerWPs(Container const& c, Func&& func) {\n+        for (auto* wp : c)\n+            func(wp);\n+    }\n+\n+    static void DoForAllWPs(node_proc_ftype_c&& func);\n+    static void DoForAllMapWPs(uint32 mapId, node_proc_ftype_c&& func);\n+    static void DoForAllZoneWPs(uint32 zoneId, node_proc_ftype_c&& func);\n+    static void DoForAllAreaWPs(uint32 areaId, node_proc_ftype_c&& func);\n+    static size_t GetAllWPsCount();\n+    static size_t GetMapWPsCount(uint32 mapId);\n+    static size_t GetWPMapsCount();\n+\n+    WanderNode(uint32 wpId, uint32 mapId, float x, float y, float z, float o, uint32 zoneId, uint32 areaId, std::string&& name);\n+    ~WanderNode();\n+\n+    static void RemoveAllWPs();\n+    static void RemoveWP(WanderNode* wp);\n+\n+    //utils\n+    WanderNode::node_lltype GetShortestPathLinks(WanderNode const* target, WanderNode::node_lltype const& base_links, BotWPLevel max_level_diff = BotWPLevel::BOTWP_LEVEL_ZERO) const;\n+\n+    //base\n+    void SetCreature(Creature* creature);\n+    Creature* GetCreature() const;\n+\n+    std::string FormatLinks() const;\n+    uint32 GetAverageLinkWeight(bool exclude_0 = false) const;\n+\n+    void Link(WanderNodeLink&& wpl);\n+    void UnLink(uint32 wp_id);\n+    inline void UnLink(WanderNodeLink const& wpl) { return UnLink(wpl.Id()); }\n+    inline void UnLink(WanderNode const* wp) { return UnLink(wp->GetWPId()); }\n+    inline bool HasLink(uint32 wp_id) const { return GetLink(wp_id) != _links.cend(); }\n+    inline bool HasLink(WanderNodeLink const& wpl) const { return HasLink(wpl.Id()); }\n+    inline bool HasLink(WanderNode const* wp) const { return HasLink(wp->GetWPId()); }\n+    auto GetLinks() const -> typename std::add_const_t<WanderNode::node_lltype>& { return _links; }\n+    auto GetLink(uint32 wp_id) -> typename WanderNode::node_lltype::iterator {\n+        return std::ranges::find_if(_links, [=](WanderNodeLink const& wpl) { return wpl.Id() == wp_id; });\n+    }\n+    auto GetLink(uint32 wp_id) const -> typename WanderNode::node_lltype::const_iterator {\n+        return std::ranges::find_if(_links, [=](WanderNodeLink const& wpl) { return wpl.Id() == wp_id; });\n+    }\n+\n+    void SetLinkWeight(uint32 wp_id, uint32 new_weight);\n+\n+    void SetLevels(std::pair<uint8, uint8> levels) { std::tie(_minLevel, _maxLevel) = levels; }\n+    inline void SetLevels(uint8 minLevel, uint8 maxLevel) { SetLevels(std::pair{ minLevel, maxLevel }); }\n+\n+    void SetWaitTime(std::pair<uint32, uint32> waitTime) { std::tie(_minWaitTime, _maxWaitTime) = waitTime; }\n+    inline void SetWaitTime(uint32 minWaitTime, uint32 maxWaitTime) { SetWaitTime(std::pair{ minWaitTime, maxWaitTime }); }\n+\n+    void SetProximity(float proximity) { _proximity = proximity; }\n+\n+    void SetFlags(BotWPFlags flags);\n+    void RemoveFlags(BotWPFlags flags);\n+    bool HasFlag(BotWPFlags flags) const;\n+    bool HasAllFlags(BotWPFlags flags) const;\n+\n+    void SetName(std::string const& name) { _name = name; }\n+\n+    void SetId(uint32 newid) { _wpId = newid; }\n+\n+    std::string ToString(int32 link_weight = -1) const;\n+\n+    uint32 GetWPId() const { return _wpId; }\n+    uint32 GetMapId() const { return _mapId; }\n+    uint32 GetZoneId() const { return _zoneId; }\n+    uint32 GetAreaId() const { return _areaId; }\n+    std::string const& GetName() const { return _name; }\n+    std::pair<uint8, uint8> GetLevels() const { return { _minLevel, _maxLevel }; }\n+    std::pair<uint32, uint32> GetWaitTime() const { return { _minWaitTime, _maxWaitTime }; }\n+    float GetProximity() const { return _proximity; }\n+    uint32 GetFlags() const { return _flags; }\n+\n+    void SetupLinkFromAura() const;\n+    void SetupLinkToAura() const;\n+\n+private:\n+    void _setLinkedBy(WanderNode const*/* lwp*/);\n+    void _setUnLinkedBy(WanderNode const*/* lwp*/);\n+\n+    uint32 _wpId;\n+    const uint32 _mapId;\n+    const uint32 _zoneId;\n+    const uint32 _areaId;\n+    /*const*/ std::string _name;\n+    uint8 _minLevel;\n+    uint8 _maxLevel;\n+    uint32 _minWaitTime;\n+    uint32 _maxWaitTime;\n+    float _proximity;\n+    uint32 _flags;\n+\n+    node_lltype _links;\n+    uint32 _to_links_count;\n+\n+    Creature* _creature;\n+};\n+\n+#endif //BOTWANDERFUL_H_\ndiff --git a/src/server/game/AI/NpcBots/bpet_ai.cpp b/src/server/game/AI/NpcBots/bpet_ai.cpp\nnew file mode 100644\nindex 0000000000..dc5b5ee25b\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bpet_ai.cpp\n@@ -0,0 +1,2573 @@\n+#include \"bpet_ai.h\"\n+#include \"bot_GridNotifiers.h\"\n+#include \"botconfig.h\"\n+#include \"botlogtraits.h\"\n+#include \"botmgr.h\"\n+#include \"LFGMgr.h\"\n+#include \"Log.h\"\n+#include \"Map.h\"\n+#include \"MotionMaster.h\"\n+#include \"ObjectMgr.h\"\n+#include \"PointMovementGenerator.h\"\n+#include \"SpellAuraEffects.h\"\n+#include \"Transport.h\"\n+#include \"World.h\"\n+/*\n+NpcBot Pet System by Trickerer (https://github.com/trickerer/Trinity-Bots; onlysuffering@gmail.com)\n+*/\n+\n+static constexpr uint32 SHAMAN_MAX_PET_POSITIONS = 2;\n+static constexpr uint32 DRUID_MAX_PET_POSITIONS = 3;\n+static constexpr uint32 DK_MAX_PET_POSITIONS = 10;\n+static constexpr uint32 DARK_RANGER_MAX_PET_POSITIONS = 5;\n+static constexpr uint32 NECROMANCER_MAX_PET_POSITIONS = 12;\n+static constexpr uint32 CRYPT_LORD_MAX_PET_POSITIONS = 6;\n+static constexpr float ShamanPetPositionAnglesByPosNumber[SHAMAN_MAX_PET_POSITIONS] =\n+{\n+    0.f,//left\n+    float(M_PI)//right\n+};\n+static constexpr float DruidPetPositionAnglesByPosNumber[DRUID_MAX_PET_POSITIONS] =\n+{\n+    0.f,//left\n+    float(M_PI)/2,//back\n+    float(M_PI)//right\n+};\n+static constexpr float DKPetPositionAnglesByPosNumber[DK_MAX_PET_POSITIONS] =\n+{\n+    0.f,\n+    float(M_PI),\n+    0.3490658f,//1*M_PI/9\n+    0.6981317f,//2*M_PI/9\n+    1.0471975f,//3*M_PI/9\n+    1.3962634f,//4*M_PI/9\n+    1.7453292f,//5*M_PI/9\n+    2.0943951f,//6*M_PI/9\n+    2.4434609f,//7*M_PI/9\n+    2.7925268f //8*M_PI/9\n+};\n+static constexpr float DarkRangerPetPositionAnglesByPosNumber[DARK_RANGER_MAX_PET_POSITIONS] =\n+{\n+    0.f,\n+    float(M_PI),\n+    0.7853981f,//1*M_PI/4\n+    1.5707963f,//2*M_PI/4\n+    2.3561944f //3*M_PI/4\n+};\n+static constexpr float NecromancerPetPositionAnglesByPosNumber[NECROMANCER_MAX_PET_POSITIONS] =\n+{\n+    0.f,\n+    float(M_PI),\n+    float(1 *M_PI/11),\n+    float(2 *M_PI/11),\n+    float(3 *M_PI/11),\n+    float(4 *M_PI/11),\n+    float(5 *M_PI/11),\n+    float(6 *M_PI/11),\n+    float(7 *M_PI/11),\n+    float(8 *M_PI/11),\n+    float(9 *M_PI/11),\n+    float(10*M_PI/11)\n+};\n+static constexpr float CryptLordPetPositionAnglesByPosNumber[CRYPT_LORD_MAX_PET_POSITIONS] =\n+{\n+    0.7853981f,//1*M_PI/4\n+    2.3561944f,//3*M_PI/4\n+    0.0f,\n+    float(M_PI),\n+    5.4977875f,//7*M_PI/4\n+    3.9269910f //5*M_PI/4\n+};\n+\n+static uint16 __rand; //calculated for each bot separately once every updateAI tick\n+\n+bot_pet_ai::bot_pet_ai(Creature* creature) : CreatureAI(creature), _updateTimerEx1{ urand(12000, 15000) } { }\n+\n+uint16 bot_pet_ai::Rand() const\n+{\n+    return __rand;\n+}\n+//0-178\n+void bot_pet_ai::GenerateRand() const\n+{\n+    __rand = urand(0, IAmFree() ? 100 : 100 + (petOwner->GetBotOwner()->GetNpcBotsCount() - 1) * 2);\n+}\n+\n+bool bot_pet_ai::_checkImmunities(Unit const* target, SpellInfo const* spellInfo) const\n+{\n+    return target && spellInfo && !target->IsImmunedToDamage(me, spellInfo);\n+}\n+//Follow point calculation\n+void bot_pet_ai::_calculatePos(Position& pos) const\n+{\n+    switch (myType)\n+    {\n+        case BOT_PET_LOCUST_SWARM:\n+            pos.Relocate(me);\n+            return;\n+        default:\n+            break;\n+    }\n+\n+    float x,y,z;\n+    //destination\n+    petOwner->GetPosition(x, y, z);\n+    //relative angle\n+    uint32 movFlags = petOwner->m_movementInfo.GetMovementFlags();\n+    float o = petOwner->GetOrientation() + PET_FOLLOW_ANGLE;\n+    uint8 posNum = petOwner->GetBotAI()->GetPetPositionNumber(me);\n+    if (petOwner->GetBotClass() == BOT_CLASS_DEATH_KNIGHT)\n+        o += DKPetPositionAnglesByPosNumber[posNum];\n+    else if (petOwner->GetBotClass() == BOT_CLASS_DRUID)\n+        o += DruidPetPositionAnglesByPosNumber[posNum];\n+    else if (petOwner->GetBotClass() == BOT_CLASS_SHAMAN)\n+        o += ShamanPetPositionAnglesByPosNumber[posNum];\n+    else if (petOwner->GetBotClass() == BOT_CLASS_DARK_RANGER)\n+        o += DarkRangerPetPositionAnglesByPosNumber[posNum];\n+    else if (petOwner->GetBotClass() == BOT_CLASS_NECROMANCER)\n+        o += NecromancerPetPositionAnglesByPosNumber[posNum];\n+    else if (petOwner->GetBotClass() == BOT_CLASS_CRYPT_LORD)\n+        o += CryptLordPetPositionAnglesByPosNumber[posNum];\n+\n+    o = Position::NormalizeOrientation(o);\n+    //distance\n+    x += (PET_FOLLOW_DIST + me->GetCombatReach() + petOwner->GetCombatReach()) * std::cos(o);\n+    y += (PET_FOLLOW_DIST + me->GetCombatReach() + petOwner->GetCombatReach()) * std::sin(o);\n+    if (movFlags & MOVEMENTFLAG_FORWARD)\n+    {\n+        static float const aheadDist = 6.f;\n+        x = x + aheadDist * std::cos(petOwner->GetOrientation());\n+        y = y + aheadDist * std::sin(petOwner->GetOrientation());\n+    }\n+    if (!petOwner->GetTransport())\n+        me->UpdateGroundPositionZ(x, y, z);\n+    if (me->GetPositionZ() < z)\n+        z += 0.5f; //prevent going underground\n+\n+    pos.m_positionX = x;\n+    pos.m_positionY = y;\n+    pos.m_positionZ = z;\n+}\n+void bot_pet_ai::SetBotCommandState(uint32 st, bool force, Position* newpos)\n+{\n+    if (!(st & (BOT_COMMAND_INACTION)))\n+    {\n+        if (!me->IsAlive() || JumpingOrFalling())\n+            return;\n+    }\n+\n+    switch (myType)\n+    {\n+        case BOT_PET_LOCUST_SWARM:\n+            return;\n+        default:\n+            break;\n+    }\n+\n+    if ((st & BOT_COMMAND_FOLLOW) && !IsChanneling() &&\n+        ((!me->isMoving() && !IsCasting() && petOwner->GetBotOwner()->IsAlive()) || force))\n+    {\n+        if (CCed(me, true)) return;\n+        if (me->isMoving() && Rand() > 10) return;\n+\n+        float x,y,z;\n+        bool dest_valid = petOwner->GetMotionMaster()->GetDestination(x, y, z);\n+        float pdist = dest_valid ? me->GetDistance(x, y, z) : 0.0f;\n+        if (dest_valid && (pdist < 6.f || pdist > 20.f))\n+        {\n+            if (!me->HasUnitState(UNIT_STATE_FOLLOW))\n+                me->GetMotionMaster()->MoveFollow(petOwner, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE);\n+        }\n+        else\n+        {\n+            if (!newpos)\n+                _calculatePos(movepos);\n+            else\n+            {\n+                movepos.m_positionX = newpos->m_positionX;\n+                movepos.m_positionY = newpos->m_positionY;\n+                movepos.m_positionZ = newpos->m_positionZ;\n+            }\n+\n+            float speed = 0.0f;\n+            if (!IAmFree() && !(petOwner->IsWalking() || HasBotCommandState(BOT_COMMAND_WALK)))\n+            {\n+                const float baserunspeed = petOwner->GetSpeed(MOVE_RUN);\n+                if (pdist > 50.0f)\n+                    speed = baserunspeed * 2.0f;\n+                else if (pdist > 30.0f)\n+                    speed = baserunspeed * 1.5f;\n+                else if (pdist > 10.0f)\n+                    speed = baserunspeed * 1.25f;\n+            }\n+            me->GetMotionMaster()->Add(new PointMovementGenerator<Creature>(1, movepos.m_positionX, movepos.m_positionY, movepos.m_positionZ, FORCED_MOVEMENT_NONE, speed, 0.f, nullptr, true));\n+        }\n+        RemoveBotCommandState(BOT_COMMAND_STAY | BOT_COMMAND_FULLSTOP | BOT_COMMAND_ATTACK | BOT_COMMAND_COMBATRESET);\n+    }\n+    else if (st & BOT_COMMAND_INACTION)\n+    {\n+        uint32 removeMask = BOT_COMMAND_INACTION & GetBotCommandState();\n+        st &= ~removeMask;\n+        RemoveBotCommandState(removeMask | BOT_COMMAND_MASK_NOCAST_ANY | BOT_COMMAND_STAY | BOT_COMMAND_FULLSTOP | BOT_COMMAND_ATTACK);\n+        me->AttackStop();\n+        me->InterruptNonMeleeSpells(true);\n+    }\n+    else if (st & BOT_COMMAND_FULLSTOP)\n+    {\n+        RemoveBotCommandState(BOT_COMMAND_FOLLOW | BOT_COMMAND_STAY | BOT_COMMAND_ATTACK);\n+        me->AttackStop();\n+        me->InterruptNonMeleeSpells(true);\n+        if (me->isMoving())\n+            me->BotStopMovement();\n+    }\n+    else if (st & BOT_COMMAND_STAY)\n+    {\n+        RemoveBotCommandState(BOT_COMMAND_FOLLOW | BOT_COMMAND_FULLSTOP);\n+        if (me->isMoving())\n+            me->BotStopMovement();\n+    }\n+    else if (st & BOT_COMMAND_ATTACK)\n+    {\n+        RemoveBotCommandState(BOT_COMMAND_FOLLOW);\n+    }\n+    else if (st & BOT_COMMAND_COMBATRESET)\n+    {\n+        RemoveBotCommandState(BOT_COMMAND_ATTACK);\n+    }\n+    _botCommandState |= st;\n+}\n+\n+void bot_pet_ai::RemoveBotCommandState(uint32 st)\n+{\n+    _botCommandState &= ~st;\n+}\n+// CURES\n+//cycle through the group sending members for cure\n+void bot_pet_ai::CureGroup(uint32 cureSpell, uint32 diff)\n+{\n+    if (!cureSpell) return;\n+    if (GC_Timer > diff) return;\n+    if (IsCasting()) return;\n+\n+    if (IAmFree())\n+    {\n+        std::list<Unit*> cureTargets;\n+\n+        if (_canCureTarget(me, cureSpell))\n+            cureTargets.push_back(me);\n+        if (_canCureTarget(petOwner, cureSpell))\n+            cureTargets.push_back(petOwner);\n+\n+        if (!cureTargets.empty())\n+            me->CastSpell(Bcore::Containers::SelectRandomContainerElement(cureTargets), cureSpell, false);\n+\n+        return;\n+    }\n+\n+    if (!me->GetMap()->IsRaid() && Rand() > 35)\n+        return;\n+\n+    std::list<Unit*> targets;\n+    Group const* pGroup = petOwner->GetBotOwner()->GetGroup();\n+    Unit* u = nullptr;\n+    if (!pGroup)\n+    {\n+        if (_canCureTarget(petOwner->GetBotOwner(), cureSpell))\n+            targets.push_back(petOwner->GetBotOwner());\n+\n+        for (auto const& [_, bot] : *petOwner->GetBotOwner()->GetBotMgr()->GetBotMap())\n+        {\n+            u = bot;\n+            if (!u || !u->IsInWorld() || me->GetMap() != u->FindMap() || !u->IsAlive()) continue;\n+            if (_canCureTarget(u, cureSpell))\n+                targets.push_back(u);\n+        }\n+\n+        for (Unit* m : petOwner->GetBotOwner()->m_Controlled)\n+        {\n+            u = m;\n+            if (!u || !u->IsPet() || !u->IsAlive() || me->GetDistance(u) > 30) continue;\n+\n+            if (_canCureTarget(u, cureSpell))\n+                targets.push_back(u);\n+        }\n+    }\n+    else\n+    {\n+        bool Bots = false;\n+        for (GroupReference const* itr = pGroup->GetFirstMember(); itr != nullptr; itr = itr->next())\n+        {\n+            Player* tPlayer = itr->GetSource();\n+            if (!tPlayer || (!tPlayer->IsAlive() && !tPlayer->HaveBot())) continue;\n+            if (!tPlayer->IsInWorld() || tPlayer->IsBeingTeleported()) continue;\n+            if (me->GetMap() != tPlayer->FindMap()) continue;\n+            if (!Bots && tPlayer->HaveBot())\n+                Bots = true;\n+            if (_canCureTarget(tPlayer, cureSpell))\n+                targets.push_back(tPlayer);\n+        }\n+        if (!Bots) return;\n+        for (GroupReference const* itr = pGroup->GetFirstMember(); itr != nullptr; itr = itr->next())\n+        {\n+            Player* tPlayer = itr->GetSource();\n+            if (tPlayer == nullptr) continue;\n+            if (!tPlayer->IsInWorld() || tPlayer->IsBeingTeleported()) continue;\n+            if (me->GetMap() != tPlayer->FindMap()) continue;\n+\n+            if (tPlayer->HaveBot())\n+            {\n+                for (auto const& [_, bot] : *tPlayer->GetBotMgr()->GetBotMap())\n+                {\n+                    u = bot;\n+                    if (!u || !u->IsInWorld() || me->GetMap() != u->FindMap() || !u->IsAlive()) continue;\n+                    if (_canCureTarget(u, cureSpell))\n+                        targets.push_back(u);\n+                }\n+            }\n+\n+            for (Unit* m : tPlayer->m_Controlled)\n+            {\n+                u = m;\n+                if (!u || !u->IsPet() || !u->IsAlive() || me->GetDistance(u) > 30) continue;\n+\n+                if (_canCureTarget(u, cureSpell))\n+                    targets.push_back(u);\n+            }\n+        }\n+    }\n+\n+    if (!targets.empty())\n+        me->CastSpell(Bcore::Containers::SelectRandomContainerElement(targets), cureSpell, false);\n+}\n+\n+// determines if unit has something to cure\n+bool bot_pet_ai::_canCureTarget(Unit const* target, uint32 cureSpell) const\n+{\n+    if (me->GetLevel() < 10 || target->GetLevel() < 10) return false;\n+    if (target->HasUnitState(UNIT_STATE_ISOLATED)) return false;\n+    if (target->IsCreature() && target->ToCreature()->IsTempBot()) return false;\n+\n+    SpellInfo const* info = sSpellMgr->GetSpellInfo(cureSpell);\n+    if (!info)\n+        return false;\n+\n+    if (me->GetDistance(target) > CalcSpellMaxRange(cureSpell, false))\n+        return false;\n+\n+    uint32 dispelMask = 0;\n+    for (auto i : NPCBots::index_array<uint8, MAX_SPELL_EFFECTS>)\n+        if (info->Effects[i].Effect == SPELL_EFFECT_DISPEL)\n+            dispelMask |= SpellInfo::GetDispelMask(DispelType(info->Effects[i].MiscValue));\n+\n+    if (dispelMask == 0)\n+        return false;\n+\n+    std::list<Aura const*> dispel_list;\n+    _getBotDispellableAuraList(target, me, dispelMask, dispel_list);\n+\n+    return !(dispel_list.empty());\n+}\n+\n+void bot_pet_ai::_getBotDispellableAuraList(Unit const* target, Unit const* caster, uint32 dispelMask, std::list<Aura const*> &dispelList) const\n+{\n+    //Unholy Blight prevents diseases from being dispelled\n+    if ((dispelMask & (1u<<DISPEL_DISEASE)) &&\n+        target->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DEATHKNIGHT, 1494, 0))\n+        dispelMask &= ~(1u<<DISPEL_DISEASE);\n+\n+    for (auto const& [_, aura] : target->GetOwnedAuras())\n+    {\n+        if (aura->IsPassive())\n+            continue;\n+\n+        AuraApplication const* aurApp = aura->GetApplicationOfTarget(target->GetGUID());\n+        if (!aurApp)\n+            continue;\n+\n+        if (aura->GetSpellInfo()->GetDispelMask() & dispelMask)\n+        {\n+            //do not dispel positive auras from enemies and negative ones from friends\n+            if (aurApp->IsPositive() == target->IsFriendlyTo(caster))\n+                continue;\n+\n+            //skip Vampiric Touch to prevent being CCed just heal it out\n+            if (aura->GetSpellInfo()->IsRankOf(sSpellMgr->GetSpellInfo(34914)))\n+                continue;\n+\n+            if (((aura->GetSpellInfo()->AttributesEx7 & SPELL_ATTR7_DISPEL_REMOVES_CHARGES) ? aura->GetCharges() : aura->GetStackAmount()) > 0)\n+                dispelList.push_back(aura);\n+        }\n+    }\n+}\n+\n+uint32 bot_pet_ai::GetData(uint32 data) const\n+{\n+    switch (data)\n+    {\n+        case BOTPETAI_MISC_DURATION:\n+            return 0;\n+        case BOTPETAI_MISC_DURATION_MAX:\n+            return 0;\n+        case BOTPETAI_MISC_MAXLEVEL:\n+            return petOwner->GetLevel();\n+        case BOTPETAI_MISC_FIXEDLEVEL:\n+            return 0;\n+        case BOTPETAI_MISC_CARRY:\n+            return 0;\n+        case BOTPETAI_MISC_CAPACITY:\n+            return 0;\n+        case BOTPETAI_MISC_MAX_ATTACKERS:\n+            return 0;\n+        default:\n+            BOT_LOG_DEBUG(\"entities.unit\", \"bot_pet_ai::GetData(): unk data type {}!\", data);\n+            return 0;\n+    }\n+}\n+\n+void bot_pet_ai::SetPetStats(bool force)\n+{\n+    shouldUpdateStats = false;\n+\n+    switch (myType)\n+    {\n+        //warlock\n+        case BOT_PET_IMP:\n+        case BOT_PET_VOIDWALKER:\n+        case BOT_PET_SUCCUBUS:\n+        case BOT_PET_FELHUNTER:\n+        case BOT_PET_FELGUARD:\n+        //hunter\n+        //cunning\n+        case BOT_PET_SPIDER:\n+        case BOT_PET_SERPENT:\n+        case BOT_PET_BIRDOFPREY:\n+        case BOT_PET_BAT:\n+        case BOT_PET_WINDSERPENT:\n+        case BOT_PET_RAVAGER:\n+        case BOT_PET_DRAGONHAWK:\n+        case BOT_PET_NETHERRAY:\n+        case BOT_PET_SPOREBAT:\n+        //ferocity\n+        case BOT_PET_CARRIONBIRD:\n+        case BOT_PET_RAPTOR:\n+        case BOT_PET_WOLF:\n+        case BOT_PET_TALLSTRIDER:\n+        case BOT_PET_CAT:\n+        case BOT_PET_HYENA:\n+        case BOT_PET_WASP:\n+        case BOT_PET_TEROMOTH:\n+        //tenacity\n+        case BOT_PET_SCORPID:\n+        case BOT_PET_TURTLE:\n+        case BOT_PET_GORILLA:\n+        case BOT_PET_BEAR:\n+        case BOT_PET_BOAR:\n+        case BOT_PET_CRAB:\n+        case BOT_PET_CROCOLISK:\n+        case BOT_PET_WARPSTALKER:\n+        //cunning (exotic)\n+        case BOT_PET_SILITHID:\n+        case BOT_PET_CHIMAERA:\n+        //ferocity (exotic)\n+        case BOT_PET_SPIRITBEAST:\n+        case BOT_PET_COREHOUND:\n+        case BOT_PET_DEVILSAUR:\n+        //tenacity (exotic)\n+        case BOT_PET_RHINO:\n+        case BOT_PET_WORM:\n+        //death knight\n+        case BOT_PET_GHOUL:\n+        //case BOT_PET_GARGOYLE:\n+        //case BOT_PET_DANCING_RUNE_WEAPON:\n+        //case BOT_PET_AOD_GHOUL:\n+        //priest\n+        case BOT_PET_SHADOWFIEND:\n+        //shaman\n+        case BOT_PET_SPIRIT_WOLF:\n+        //mage\n+        case BOT_PET_WATER_ELEMENTAL:\n+        //druid\n+        case BOT_PET_FORCE_OF_NATURE:\n+        //archmage\n+        case BOT_PET_AWATER_ELEMENTAL:\n+        //dreadlord\n+        case BOT_PET_INFERNAL:\n+        //dark ranger\n+        case BOT_PET_DARK_MINION:\n+        case BOT_PET_DARK_MINION_ELITE:\n+        //necromancer\n+        case BOT_PET_NECROSKELETON:\n+        //sea witch\n+        case BOT_PET_TORNADO:\n+        //crypt lord\n+        case BOT_PET_CARRION_BEETLE1:\n+        case BOT_PET_CARRION_BEETLE2:\n+        case BOT_PET_CARRION_BEETLE3:\n+        case BOT_PET_LOCUST_SWARM:\n+            break;\n+        default:\n+            BOT_LOG_ERROR(\"entities.player\", \"bot_pet_ai::SetPetStats(): unk pet type {}, aborting\", myType);\n+            return;\n+    }\n+\n+    //some time limited summons can only init stats and never change them\n+    switch (myType)\n+    {\n+        case BOT_PET_SHADOWFIEND:\n+        case BOT_PET_SPIRIT_WOLF:\n+        //case BOT_PET_WATER_ELEMENTAL:\n+        case BOT_PET_FORCE_OF_NATURE:\n+        case BOT_PET_DARK_MINION:\n+        case BOT_PET_DARK_MINION_ELITE:\n+        case BOT_PET_NECROSKELETON:\n+        case BOT_PET_TORNADO:\n+        case BOT_PET_CARRION_BEETLE1:\n+        case BOT_PET_CARRION_BEETLE2:\n+        case BOT_PET_CARRION_BEETLE3:\n+        case BOT_PET_LOCUST_SWARM:\n+            if (force == false)\n+                return;\n+            break;\n+        default:\n+            break;\n+    }\n+\n+    uint8 level = GetData(BOTPETAI_MISC_FIXEDLEVEL);\n+    level = level ? level : std::min<uint8>(petOwner->GetLevel(), GetData(BOTPETAI_MISC_MAXLEVEL));\n+    if (level != me->GetLevel())\n+    {\n+        me->SetLevel(level);\n+        force = true;\n+    }\n+\n+    int32 spdtotal;\n+    switch (petOwner->GetBotClass())\n+    {\n+        case BOT_CLASS_WARLOCK:\n+        case BOT_CLASS_PRIEST:\n+        case BOT_CLASS_MAGE:\n+        case BOT_CLASS_DRUID:\n+        case BOT_CLASS_ARCHMAGE:\n+        case BOT_CLASS_DREADLORD:\n+        case BOT_CLASS_SEA_WITCH:\n+            spdtotal = petOwner->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_MAGIC);\n+            break;\n+        default:\n+            spdtotal = 0;\n+            break;\n+    }\n+\n+    if (force)\n+    {\n+        InitPetSpells();\n+        ApplyPetPassives();\n+\n+        me->RemoveAurasDueToSpell(DAMAGEDONE_PASSIVE);\n+        me->RemoveAurasDueToSpell(DAMAGETAKEN_PASSIVE);\n+        me->RemoveAurasDueToSpell(SPELLDAMAGE_PASSIVE);\n+        me->RemoveAurasDueToSpell(SPELLPENETRATION_PASSIVE);\n+        me->RemoveAurasDueToSpell(SPELLHASTE_PASSIVE);\n+        me->RemoveAurasDueToSpell(CRITBONUS_PASSIVE);\n+\n+        me->CastSpell(me, DAMAGEDONE_PASSIVE, true);\n+        me->CastSpell(me, DAMAGETAKEN_PASSIVE, true);\n+        me->CastSpell(me, SPELLDAMAGE_PASSIVE, true);\n+        me->CastSpell(me, SPELLPENETRATION_PASSIVE, true);\n+        me->CastSpell(me, SPELLHASTE_PASSIVE, true);\n+        me->CastSpell(me, CRITBONUS_PASSIVE, true);\n+    }\n+\n+    //base stats\n+    uint32 myarmor = 0;\n+    if (force)\n+    {\n+        uint32 origEntry = bot_ai::GetPetOriginalEntry(myType);\n+        CreatureTemplate const* cinfo = sObjectMgr->GetCreatureTemplate(origEntry);\n+        ASSERT(cinfo);\n+\n+        me->SetMeleeDamageSchool(SpellSchools(cinfo->dmgschool));\n+\n+        PetLevelInfo const* pInfo = sObjectMgr->GetPetLevelInfo(origEntry, level);\n+        if (pInfo)\n+        {\n+            me->SetCreateHealth(pInfo->health);\n+            if (petOwner->GetBotClass() == BOT_CLASS_HUNTER) //hunter pet use focus\n+            {\n+                //prevent from modifying powers inside\n+                if (me->GetPowerType() != POWER_FOCUS)\n+                {\n+                    me->SetMaxPower(POWER_FOCUS, 100);\n+                    me->SetByteValue(UNIT_FIELD_BYTES_0, 3, POWER_FOCUS);\n+                }\n+            }\n+            else if (myType == BOT_PET_GHOUL)\n+            {\n+                if (me->GetPowerType() != POWER_ENERGY)\n+                {\n+                    me->SetMaxPower(POWER_ENERGY, 100);\n+                    me->SetByteValue(UNIT_FIELD_BYTES_0, 3, POWER_ENERGY);\n+                }\n+            }\n+            else if (myType == BOT_PET_SHADOWFIEND)\n+            {\n+                me->SetCreateHealth(28 + 30*level);\n+                me->SetCreateMana(28 + 10*level);\n+                me->SetPowerType(POWER_MANA);\n+            }\n+            else if (myType == BOT_PET_SPIRIT_WOLF)\n+            {\n+                me->SetCreateHealth(30*level);\n+                me->SetByteValue(UNIT_FIELD_BYTES_0, 3, MAX_POWERS);\n+            }\n+            else if (myType == BOT_PET_FORCE_OF_NATURE)\n+            {\n+                me->SetCreateHealth(30*(level+1));\n+                me->SetByteValue(UNIT_FIELD_BYTES_0, 3, MAX_POWERS);\n+            }\n+            else if (myType == BOT_PET_DARK_MINION)\n+            {\n+                me->SetCreateHealth(pInfo->health / 4);\n+                me->SetByteValue(UNIT_FIELD_BYTES_0, 3, MAX_POWERS);\n+            }\n+            else if (myType == BOT_PET_DARK_MINION_ELITE)\n+            {\n+                me->SetCreateHealth(pInfo->health / 2);\n+                me->SetByteValue(UNIT_FIELD_BYTES_0, 3, MAX_POWERS);\n+            }\n+            else if (myType == BOT_PET_NECROSKELETON)\n+            {\n+                me->SetCreateHealth(pInfo->health / 5);\n+                me->SetByteValue(UNIT_FIELD_BYTES_0, 3, MAX_POWERS);\n+            }\n+            else if (myType == BOT_PET_AWATER_ELEMENTAL || myType == BOT_PET_INFERNAL)\n+            {\n+                //custom pets / not using mana\n+                me->SetByteValue(UNIT_FIELD_BYTES_0, 3, MAX_POWERS);\n+            }\n+            else if (myType == BOT_PET_CARRION_BEETLE1)\n+            {\n+                me->SetCreateHealth(pInfo->health / 4);\n+                me->SetByteValue(UNIT_FIELD_BYTES_0, 3, MAX_POWERS);\n+            }\n+            else if (myType == BOT_PET_CARRION_BEETLE2)\n+            {\n+                me->SetCreateHealth(pInfo->health / 4);\n+                me->SetByteValue(UNIT_FIELD_BYTES_0, 3, MAX_POWERS);\n+            }\n+            else if (myType == BOT_PET_CARRION_BEETLE3)\n+            {\n+                me->SetCreateHealth(pInfo->health / 3);\n+                me->SetByteValue(UNIT_FIELD_BYTES_0, 3, MAX_POWERS);\n+            }\n+            else\n+            {\n+                me->SetCreateMana(pInfo->mana);\n+                me->SetPowerType(POWER_MANA);\n+            }\n+\n+            if (pInfo->armor > 0)\n+                myarmor = pInfo->armor;\n+\n+            for (auto i : NPCBots::index_array<uint8, MAX_STATS>)\n+                me->SetCreateStat(Stats(i), pInfo->stats[i]);\n+\n+            float mindamage, maxdamage;\n+            switch (myType)\n+            {\n+                case BOT_PET_SHADOWFIEND:       mindamage = float(level * 3 + spdtotal * 0.3f);  maxdamage = float(level * 5 + spdtotal * 0.3f);  break;\n+                case BOT_PET_SPIRIT_WOLF:       mindamage = float(level * 3);                    maxdamage = float(level * 5);                    break;\n+                case BOT_PET_FORCE_OF_NATURE:   mindamage = float(level * 2) + spdtotal * 0.15f; maxdamage = float(level * 3) + spdtotal * 0.15f; break;\n+                case BOT_PET_DARK_MINION:       mindamage = float(level);                        maxdamage = float(level + level / 2);            break;\n+                case BOT_PET_DARK_MINION_ELITE: mindamage = float(level * 3);                    maxdamage = float(level * 4);                    break;\n+                case BOT_PET_NECROSKELETON:     mindamage = float(level);                        maxdamage = float(level + level / 3);            break;\n+                case BOT_PET_CARRION_BEETLE1:   mindamage = float(level / 2 + 2);                maxdamage = float(level / 4 * 3 + 2);            break;\n+                case BOT_PET_CARRION_BEETLE2:   mindamage = float(level / 4 * 3 + 8);            maxdamage = float(level + level / 2 + 8);        break;\n+                case BOT_PET_CARRION_BEETLE3:   mindamage = float(level + level / 2 + 10);       maxdamage = float(level + level / 4 * 3 + 15);   break;\n+                default:\n+                    if (myType < BOT_PET_AWATER_ELEMENTAL)\n+                    {\n+                        //we have to compensate for a different way damage is calculated for non-guardians\n+                        mindamage = pInfo->min_dmg * 0.75f;\n+                        maxdamage = pInfo->max_dmg * 0.75f;\n+                    }\n+                    else\n+                    {\n+                        mindamage = float(level - (level / 4));\n+                        maxdamage = float(level + (level / 4));\n+                    }\n+                    break;\n+            }\n+\n+            me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, mindamage);\n+            me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, maxdamage);\n+        }\n+        else\n+        {\n+            CreatureBaseStats const* stats = sObjectMgr->GetCreatureBaseStats(level, me->GetCreatureTemplate()->unit_class);\n+            me->SetCreateHealth(stats->BaseHealth[cinfo->expansion]);\n+            me->SetCreateMana(stats->BaseMana);\n+\n+            me->SetCreateStat(STAT_STRENGTH, level * 3 + 20);\n+            me->SetCreateStat(STAT_AGILITY, level * 2 + 20);\n+            me->SetCreateStat(STAT_STAMINA, level * 5 + 20);\n+            me->SetCreateStat(STAT_INTELLECT, level * 2 + 25);\n+            me->SetCreateStat(STAT_SPIRIT,  level * 2 + 30);\n+            BOT_LOG_ERROR(\"entities.unit\", \"SetPetStats(): pInfo is NULL, setting default stats for pet {}\", myType);\n+        }\n+    }\n+\n+    //STAT INHERITANCE\n+    //STAT -- 'mod' -- description\n+    // WARLOCK\n+    //AP      x0.57 -- attack power from spd\n+    //Armor   x0.35 -- armor\n+    //Resist  x0.4  -- resistances\n+    //Stamina x0.75 -- stamina\n+    //Int     x0.3  -- int\n+    //Spd     x0.15 -- spd\n+    //Sppen   x1.00 -- sppenetration\n+    // HUNTER\n+    //AP      x0.22 -- attack power/spd from ranged AP (0.338 wild hunt)\n+    //Stamina x0.4  -- health (0.63 wild hunt)\n+    //Spd   x0.1287 -- spd from ranged AP (0.18 wild hunt)\n+    //rest is same as warlock\n+    // DK\n+    //AP      x1.52 -- attack power from master's strength\n+    //Stamina x0.88 -- health\n+    //rest is same as warlock\n+    // PRIEST\n+    //Damage from spd\n+    // SHAMAN\n+    //AP      x0.6  -- attack power glyphed\n+    //Stamina x0.75 -- health\n+    // MAGE\n+    //Stamina x0.75 -- health\n+    //Spd     x0.40 -- spd\n+    //Int     x0.3  -- int\n+    // DRUID\n+    //Stamina x0.45 -- health\n+    //\n+    // SHAMAN\n+    //\n+    // ARCHMAGE\n+    //Stamina x2.5  -- stamina\n+    //Spd     x1.0  -- spd\n+    //rest is same as warlock\n+    // DREADLORD\n+    //AP      x1.00 -- attack power from spd\n+    //Resist  x2.0  -- resistances\n+    //Stamina x2.5  -- stamina\n+    //Spd     x1.0  -- spd\n+    // DARK RANGER\n+    //AP      x0.50 -- attack power\n+    //Resist  x0.3  -- resistances\n+    //Stamina x0.8  -- stamina\n+    //rest is same as warlock\n+    // NECROMANCER\n+    //AP      x0.40 -- attack power\n+    //Resist  x0.25 -- resistances\n+    //Stamina x0.8  -- stamina\n+    //rest is same as warlock\n+    // SEA WITCH\n+    //Spd     x1.0  -- spd\n+    //rest is same as warlock\n+    // CRYPT LORD\n+    //AP      x0.40 -- attack power\n+    //Resist  x1.0  -- resistances\n+    //Stamina x1.5  -- stamina\n+    //Spd     x1.0  -- spd\n+\n+    //attack power\n+    float atpower = /*IAmFree() ? 1000.f :*/ 0.f; //+1000/+0 base pet ap\n+    switch (myType)\n+    {\n+        case BOT_PET_IMP:\n+            atpower += me->GetTotalStatValue(STAT_STRENGTH) - 10.0f;\n+            break;\n+        case BOT_PET_GHOUL:\n+            atpower += me->GetTotalStatValue(STAT_STRENGTH) - 10.0f;\n+            atpower += 1.52f * petOwner->GetTotalStatValue(STAT_STRENGTH);\n+            atpower += 0.3f * petOwner->GetTotalAttackPowerValue(BASE_ATTACK);\n+            atpower += level * 8;\n+            break;\n+        case BOT_PET_DARK_MINION:\n+            atpower += 2 * me->GetTotalStatValue(STAT_STRENGTH) - 20.0f;\n+            atpower += 0.3f * petOwner->GetTotalAttackPowerValue(RANGED_ATTACK);\n+            break;\n+        case BOT_PET_DARK_MINION_ELITE:\n+            atpower += 2 * me->GetTotalStatValue(STAT_STRENGTH) - 20.0f;\n+            atpower += 0.4f * petOwner->GetTotalAttackPowerValue(RANGED_ATTACK);\n+            break;\n+        case BOT_PET_NECROSKELETON:\n+            atpower += 2 * me->GetTotalStatValue(STAT_STRENGTH) - 20.0f;\n+            break;\n+        case BOT_PET_CARRION_BEETLE1:\n+            atpower += 2 * me->GetTotalStatValue(STAT_STRENGTH) - 20.0f;\n+            atpower += 0.15f * petOwner->GetTotalAttackPowerValue(BASE_ATTACK);\n+            break;\n+        case BOT_PET_CARRION_BEETLE2:\n+            atpower += 2 * me->GetTotalStatValue(STAT_STRENGTH) - 15.0f;\n+            atpower += 0.20f * petOwner->GetTotalAttackPowerValue(BASE_ATTACK);\n+            break;\n+        case BOT_PET_CARRION_BEETLE3:\n+            atpower += 2 * me->GetTotalStatValue(STAT_STRENGTH) - 10.0f;\n+            atpower += 0.25f * petOwner->GetTotalAttackPowerValue(BASE_ATTACK);\n+            break;\n+        default:\n+            //atpower += 2 * me->GetTotalStatValue(STAT_STRENGTH) - 20.0f;\n+            break;\n+    }\n+    switch (petOwner->GetBotClass())\n+    {\n+        case BOT_CLASS_HUNTER:\n+            atpower += (level >= 80 ? 0.338f : 0.22f) * petOwner->GetTotalAttackPowerValue(RANGED_ATTACK);\n+            //Hunter vs. Wild\n+            if (level >= 30 && Spec() == BOT_SPEC_HUNTER_SURVIVAL)\n+                atpower += 0.3f * petOwner->GetBotAI()->GetTotalBotStat(BOT_STAT_MOD_STAMINA);\n+            //Animal Handler\n+            if (level >= 35 && Spec() == BOT_SPEC_HUNTER_BEASTMASTERY)\n+                atpower *= 1.1f;\n+            break;\n+        case BOT_CLASS_SHAMAN:\n+            //Glyph of Feral Spirit\n+            atpower += 0.6f * petOwner->GetTotalAttackPowerValue(BASE_ATTACK);\n+            break;\n+        case BOT_CLASS_DRUID:\n+            atpower += 300 + 0.3f * petOwner->GetTotalAttackPowerValue(BASE_ATTACK);\n+            break;\n+        case BOT_CLASS_WARLOCK:\n+            atpower += 0.57f * spdtotal;\n+            //BOT_LOG_ERROR(\"entities.player\", \"SetPetStat(): atpower += 0.57 of %i = %.2f\", spdtotal, atpower);\n+            break;\n+        case BOT_CLASS_DREADLORD:\n+            atpower += spdtotal * 6;\n+            break;\n+        case BOT_CLASS_NECROMANCER:\n+            atpower += 0.75f * spdtotal;\n+            break;\n+        default:\n+            break;\n+    }\n+    me->SetStatFlatModifier(UNIT_MOD_ATTACK_POWER, BASE_VALUE, atpower);\n+    me->UpdateAttackPowerAndDamage();\n+    //armor\n+    myarmor = std::max<uint32>(myarmor, level*50);\n+    myarmor += me->GetStat(STAT_AGILITY)*2 + petOwner->GetArmor()*0.35f;\n+    //armor bonuses\n+    if (petOwner->GetBotClass() == BOT_CLASS_HUNTER)\n+    {\n+        //5% innate\n+        myarmor += myarmor / 20;\n+        //Thick Hide\n+        if (level >= 15)\n+            myarmor += myarmor / 5;\n+        //Natural Armor\n+        if (level >= 20)\n+            myarmor += myarmor / 10;\n+        //Pet Barding\n+        if (level >= 32)\n+            myarmor += myarmor / 10;\n+    }\n+    if (petOwner->GetBotClass() == BOT_CLASS_DARK_RANGER || petOwner->GetBotClass() == BOT_CLASS_NECROMANCER)\n+    {\n+        //even though skeletons have shields their armor needs to be very low\n+        myarmor = myarmor / 4;\n+    }\n+    else if (petOwner->GetBotClass() == BOT_CLASS_CRYPT_LORD)\n+    {\n+        myarmor /= 3;\n+    }\n+    me->SetStatFlatModifier(UNIT_MOD_ARMOR, BASE_VALUE, float(myarmor));\n+    me->UpdateArmor();\n+    //resistances\n+    for (uint8 i = SPELL_SCHOOL_HOLY; i != MAX_SPELL_SCHOOL; ++i)\n+    {\n+        float petResist;\n+        switch (petOwner->GetBotClass())\n+        {\n+            case BOT_CLASS_DREADLORD:\n+                petResist = (petOwner->GetBotAI()->GetBotResistanceBonus(SpellSchools(i)) + petOwner->GetResistance(SpellSchools(i)))*2.0f;\n+                break;\n+            case BOT_CLASS_DARK_RANGER:\n+            case BOT_CLASS_NECROMANCER:\n+                petResist = (petOwner->GetBotAI()->GetBotResistanceBonus(SpellSchools(i)) + petOwner->GetResistance(SpellSchools(i)))*0.3f;\n+                break;\n+            case BOT_CLASS_CRYPT_LORD:\n+                petResist = (petOwner->GetBotAI()->GetBotResistanceBonus(SpellSchools(i)) + petOwner->GetResistance(SpellSchools(i)))*1.0f;\n+                break;\n+            default:\n+                petResist = (petOwner->GetBotAI()->GetBotResistanceBonus(SpellSchools(i)) + petOwner->GetResistance(SpellSchools(i)))*0.4f;\n+                break;\n+        }\n+        me->SetStatFlatModifier(UnitMods(UNIT_MOD_RESISTANCE_START + i), BASE_VALUE, petResist);\n+        me->UpdateResistances(i);\n+    }\n+    //crit physical\n+    if (AuraEffect* critbonus = me->GetAuraEffect(CRITBONUS_PASSIVE, 1, me->GetGUID()))\n+    {\n+        int32 amount = 5; //base crit\n+        switch (petOwner->GetBotClass())\n+        {\n+            case BOT_CLASS_WARLOCK:\n+                //Demonic Tactics part 1 (pet)\n+                amount += level >= 45 ? 10 : 0;\n+                //Improved Demonic Tactics (pshysical)\n+                amount += level >= 50 ? petOwner->GetCreatureCritChance() * 0.3f : 0;\n+                break;\n+            case BOT_CLASS_HUNTER:\n+                //Ferocity\n+                if (level >= 20)\n+                    amount += 10;\n+                //Spider's Bite\n+                if (level >= 44)\n+                    amount += 9;\n+                break;\n+            case BOT_CLASS_DREADLORD:\n+                amount += petOwner->GetCreatureCritChance() * 0.5f;\n+                break;\n+            case BOT_CLASS_DARK_RANGER:\n+            case BOT_CLASS_NECROMANCER:\n+            case BOT_CLASS_CRYPT_LORD:\n+                amount += petOwner->GetCreatureCritChance() * 0.35f;\n+                break;\n+            default:\n+                break;\n+        }\n+        critbonus->ChangeAmount(amount);\n+    }\n+    //crit spell\n+    if (AuraEffect* critbonus = me->GetAuraEffect(CRITBONUS_PASSIVE, 0, me->GetGUID()))\n+    {\n+        int32 amount = 5; //base crit\n+        switch (myType)\n+        {\n+            case BOT_PET_IMP:\n+            case BOT_PET_SUCCUBUS:\n+                //Master Demonologist part 1.2 (pet)\n+                //Master Demonologist part 3.2 (pet)\n+                amount += level >= 35 ? 5 : 0;\n+                //Improved Demonic Tactics (pshysical)\n+                amount += level >= 50 ? petOwner->GetCreatureCritChance() * 0.3f : 0;\n+                break;\n+            default:\n+                break;\n+        }\n+        switch (petOwner->GetBotClass())\n+        {\n+            case BOT_CLASS_WARLOCK:\n+                //Demonic Tactics part 2 (pet)\n+                amount += level >= 45 ? 10 : 0;\n+                break;\n+            case BOT_CLASS_HUNTER:\n+                //Ferocity\n+                if (level >= 20)\n+                    amount += 10;\n+                //Spider's Bite\n+                if (level >= 44)\n+                    amount += 9;\n+                break;\n+            case BOT_CLASS_ARCHMAGE:\n+            case BOT_CLASS_SEA_WITCH:\n+                amount += petOwner->GetCreatureCritChance();\n+                break;\n+            default:\n+                break;\n+        }\n+        critbonus->ChangeAmount(amount);\n+    }\n+    //damage done physical\n+    if (AuraEffect* physdam = me->GetAuraEffect(DAMAGEDONE_PASSIVE, 0, me->GetGUID()))\n+    {\n+        int32 amount = 0;\n+        switch (myType)\n+        {\n+            case BOT_PET_IMP:\n+                //Empowered Imp part 1\n+                amount += level >= 50 ? 30 : 0;\n+                break;\n+            case BOT_PET_INFERNAL:\n+                amount += 100;\n+                break;\n+            default:\n+                break;\n+        }\n+        switch (petOwner->GetBotClass())\n+        {\n+            case BOT_CLASS_WARLOCK:\n+                //Unholy Power\n+                if (myType != BOT_PET_IMP)\n+                    amount += level >= 30 ? 20 : 0;\n+                break;\n+            case BOT_CLASS_HUNTER:\n+                //Hapiness bonus (always happy) + 5% innate\n+                amount += 30;\n+                //Unleashed Fury\n+                if (level >= 20)\n+                    amount += 15;\n+                //Kindred Spirits\n+                if (level >= 55 && Spec() == BOT_SPEC_HUNTER_BEASTMASTERY)\n+                    amount += 20;\n+                //Spiked Collar\n+                if (level >= 32)\n+                    amount += 9;\n+                //Shark Attack\n+                if (level >= 80)\n+                    amount += 6;\n+                break;\n+            default:\n+                break;\n+        }\n+        //Command (Racial)\n+        if (petOwner->GetRace() == RACE_ORC)\n+            amount += 5;\n+        physdam->ChangeAmount(amount);\n+    }\n+    //damage done magic\n+    if (AuraEffect* spelldam = me->GetAuraEffect(DAMAGEDONE_PASSIVE, 1, me->GetGUID()))\n+    {\n+        int32 amount = 0;\n+        switch (myType)\n+        {\n+            case BOT_PET_IMP:\n+                //Empowered Imp part 1, Master Demonologist part 1.2 (pet), Improved Imp part 1\n+                amount += level >= 50 ? 65 : level >= 35 ? 35 : level >= 10 ? 30 : 0;\n+                break;\n+            case BOT_PET_SUCCUBUS:\n+                //Master Demonologist part 3 (pet)\n+                amount += level >= 35 ? 5 : 0;\n+                break;\n+            default:\n+                break;\n+        }\n+        switch (petOwner->GetBotClass())\n+        {\n+            case BOT_CLASS_WARLOCK:\n+                //Unholy Power\n+                if (myType == BOT_PET_IMP)\n+                    amount += level >= 30 ? 20 : 0;\n+                break;\n+            case BOT_CLASS_HUNTER:\n+                //Hapiness bonus (always happy) + 5% innate\n+                amount += 30;\n+                //Unleashed Fury\n+                if (level >= 20)\n+                    amount += 15;\n+                //Kindred Spirits\n+                if (level >= 55 && Spec() == BOT_SPEC_HUNTER_BEASTMASTERY)\n+                    amount += 20;\n+                //Spiked Collar\n+                if (level >= 32)\n+                    amount += 9;\n+                //Shark Attack\n+                if (level >= 80)\n+                    amount += 6;\n+                break;\n+            default:\n+                break;\n+        }\n+        //Command (Racial)\n+        if (petOwner->GetRace() == RACE_ORC)\n+            amount += 5;\n+        spelldam->ChangeAmount(amount);\n+    }\n+    //spell power\n+    if (AuraEffect* spelldam = me->GetAuraEffect(SPELLDAMAGE_PASSIVE, 0, me->GetGUID()))\n+    {\n+        int32 amount = 0;\n+        switch (petOwner->GetBotClass())\n+        {\n+            case BOT_CLASS_HUNTER:\n+                amount += int32(petOwner->GetTotalAttackPowerValue(RANGED_ATTACK) * (level >= 80 ? 0.18f : 0.1287f));\n+                break;\n+            case BOT_CLASS_WARLOCK:\n+                amount += int32(spdtotal * 0.15f);\n+                break;\n+            case BOT_CLASS_MAGE:\n+                amount += int32(spdtotal * 0.4f);\n+                break;\n+            case BOT_CLASS_ARCHMAGE:\n+                amount += int32(spdtotal * 1.0f);\n+                break;\n+            case BOT_CLASS_DREADLORD:\n+                amount += int32(spdtotal * 1.0f);\n+                break;\n+            case BOT_CLASS_SEA_WITCH:\n+                amount += int32(spdtotal * 1.0f);\n+                break;\n+            default:\n+                break;\n+        }\n+        spelldam->ChangeAmount(amount);\n+    }\n+    //spell penetration\n+    if (AuraEffect* spellpenet = me->GetAuraEffect(SPELLPENETRATION_PASSIVE, 0, me->GetGUID()))\n+    {\n+        int32 amount = int32(petOwner->GetCreatureSpellPenetration());\n+        spellpenet->ChangeAmount(amount);\n+    }\n+    //haste spell\n+    if (AuraEffect* spellhaste = me->GetAuraEffect(SPELLHASTE_PASSIVE, 0, me->GetGUID()))\n+    {\n+        int32 amount = 0;\n+        switch (myType)\n+        {\n+            case BOT_PET_IMP:\n+                //Demonic Power part 2\n+                amount += level >= 20 ? 25 : 0;\n+                break;\n+            case BOT_PET_SUCCUBUS:\n+                //Improved Succubus part 1\n+                amount += level >= 20 ? 200 : 0;\n+                break;\n+            case BOT_PET_AWATER_ELEMENTAL:\n+                amount += petOwner->GetBotAI()->GetHaste();\n+                break;\n+            default:\n+                break;\n+        }\n+        spellhaste->ChangeAmount(amount);\n+    }\n+    //dmgtaken\n+    if (AuraEffect* dmgtaken = me->GetAuraEffect(DAMAGETAKEN_PASSIVE, 0, me->GetGUID()))\n+    {\n+        int32 amount = 0;\n+\n+        if (petOwner->GetBotClass() == BOT_CLASS_WARLOCK)\n+        {\n+            //Demonic Resilience part 2\n+            if (level >= 40)\n+                amount += 15;\n+        }\n+        if (petOwner->GetBotClass() == BOT_CLASS_HUNTER)\n+        {\n+            //Great Resistance (everything)\n+            if (level >= 44)\n+                amount += 15;\n+        }\n+        if (petOwner->GetBotClass() == BOT_CLASS_DREADLORD)\n+        {\n+            amount += 25;\n+        }\n+        if (petOwner->GetBotClass() == BOT_CLASS_CRYPT_LORD)\n+        {\n+            switch (myType)\n+            {\n+                case BOT_PET_CARRION_BEETLE1:\n+                    amount += 10;\n+                    break;\n+                case BOT_PET_CARRION_BEETLE2:\n+                    amount += 15;\n+                    break;\n+                case BOT_PET_CARRION_BEETLE3:\n+                    amount += 20;\n+                    break;\n+                default:\n+                    break;\n+            }\n+        }\n+\n+        dmgtaken->ChangeAmount(amount);\n+    }\n+    //hp\n+    float stamValue = me->GetTotalStatValue(STAT_STAMINA) - me->GetCreateStat(STAT_STAMINA);\n+    switch (petOwner->GetBotClass())\n+    {\n+        case BOT_CLASS_HUNTER:\n+            stamValue += (level >= 80 ? 0.63f : 0.4f) * petOwner->GetBotAI()->GetTotalBotStat(BOT_STAT_MOD_STAMINA);\n+            break;\n+        case BOT_CLASS_WARLOCK:\n+            stamValue += 0.75f * petOwner->GetBotAI()->GetTotalBotStat(BOT_STAT_MOD_STAMINA);\n+            break;\n+        case BOT_CLASS_DEATH_KNIGHT:\n+            switch (myType)\n+            {\n+                case BOT_PET_GHOUL:\n+                    stamValue += 0.88f * petOwner->GetBotAI()->GetTotalBotStat(BOT_STAT_MOD_STAMINA);\n+                    break;\n+                default:\n+                    stamValue += 0.3f * petOwner->GetBotAI()->GetTotalBotStat(BOT_STAT_MOD_STAMINA);\n+                    break;\n+            }\n+            break;\n+        case BOT_CLASS_SHAMAN:\n+            stamValue += 0.75f * petOwner->GetBotAI()->GetTotalBotStat(BOT_STAT_MOD_STAMINA);\n+            break;\n+        case BOT_CLASS_MAGE:\n+            stamValue += 0.75f * petOwner->GetBotAI()->GetTotalBotStat(BOT_STAT_MOD_STAMINA);\n+            break;\n+        case BOT_CLASS_DRUID:\n+            stamValue += 0.45f * petOwner->GetBotAI()->GetTotalBotStat(BOT_STAT_MOD_STAMINA);\n+            break;\n+        case BOT_CLASS_ARCHMAGE:\n+            stamValue += 2.50f * petOwner->GetBotAI()->GetTotalBotStat(BOT_STAT_MOD_STAMINA);\n+            break;\n+        case BOT_CLASS_DREADLORD:\n+            stamValue += 2.50f * petOwner->GetBotAI()->GetTotalBotStat(BOT_STAT_MOD_STAMINA);\n+            break;\n+        case BOT_CLASS_DARK_RANGER:\n+            switch (myType)\n+            {\n+                case BOT_PET_DARK_MINION_ELITE:\n+                    stamValue += 1.0f * petOwner->GetBotAI()->GetTotalBotStat(BOT_STAT_MOD_STAMINA);\n+                    break;\n+                default:\n+                    stamValue += 0.8f * petOwner->GetBotAI()->GetTotalBotStat(BOT_STAT_MOD_STAMINA);\n+                    break;\n+            }\n+            break;\n+        case BOT_CLASS_NECROMANCER:\n+            stamValue += 0.75f * petOwner->GetBotAI()->GetTotalBotStat(BOT_STAT_MOD_STAMINA);\n+            break;\n+        case BOT_CLASS_CRYPT_LORD:\n+            switch (myType)\n+            {\n+                case BOT_PET_CARRION_BEETLE1:\n+                    stamValue += 0.25f * petOwner->GetBotAI()->GetTotalBotStat(BOT_STAT_MOD_STAMINA);\n+                    break;\n+                case BOT_PET_CARRION_BEETLE2:\n+                    stamValue += 0.40f * petOwner->GetBotAI()->GetTotalBotStat(BOT_STAT_MOD_STAMINA);\n+                    break;\n+                case BOT_PET_CARRION_BEETLE3:\n+                    stamValue += 0.70f * petOwner->GetBotAI()->GetTotalBotStat(BOT_STAT_MOD_STAMINA);\n+                    break;\n+                default:\n+                    break;\n+            }\n+            break;\n+        default:\n+            break;\n+    }\n+    float stamMult;\n+    switch (myType)\n+    {\n+        case BOT_PET_IMP:        stamMult = 8.4f;  break;\n+        case BOT_PET_VOIDWALKER: stamMult = 11.0f; break;\n+        case BOT_PET_SUCCUBUS:   stamMult = 9.1f;  break;\n+        case BOT_PET_FELHUNTER:  stamMult = 9.5f;  break;\n+        case BOT_PET_FELGUARD:   stamMult = 11.0f; break;\n+        default:                 stamMult = 10.f;  break;\n+    }\n+    //stam bonuses\n+    if (petOwner->GetBotClass() == BOT_CLASS_WARLOCK)\n+    {\n+        //Fel Vitality (pet) part 1\n+        if (level >= 15)\n+            stamValue *= 1.15f;\n+        //Glyph of Voidwalker\n+        if (myType == BOT_PET_VOIDWALKER && level >= 15)\n+            stamValue *= 1.2f;\n+    }\n+    if (petOwner->GetBotClass() == BOT_CLASS_HUNTER)\n+    {\n+        //Endurance Training\n+        if (level >= 10)\n+            stamValue *= 1.1f;\n+        //Greater Stamina\n+        if (level >= 20)\n+            stamValue *= 1.12f;\n+        //Blood of the Rhino part 1\n+        if (level >= 32)\n+            stamValue *= 1.04f;\n+    }\n+    //additional: store stat\n+    me->SetStat(STAT_STAMINA, int32(stamValue));\n+    float m_totalhp = stamValue * stamMult + me->GetCreateHealth() + (/*IAmFree() ? level * 125.f :*/ 0); //+10000/+0 hp at 80\n+    //hp bonuses\n+    if (petOwner->GetBotClass() == BOT_CLASS_HUNTER)\n+    {\n+        //Innate 5%\n+        m_totalhp *= 1.05f;\n+    }\n+    //BOT_LOG_ERROR(\"entities.player\", \"SetPetStat(): hp stamval %.1f, stammult %.1f, base %u, total %.2f\", stamValue, stamMult, botPet->GetCreateHealth(), m_totalhp);\n+    bool fullhp = me->GetHealth() == me->GetMaxHealth();\n+    float pct = fullhp ? 100.f : me->GetHealthPct(); // needs for regeneration\n+    me->SetStatFlatModifier(UNIT_MOD_HEALTH, BASE_VALUE, m_totalhp);\n+    me->UpdateMaxHealth();\n+    me->SetHealth(fullhp ? me->GetMaxHealth() : uint32(0.5f + float(me->GetMaxHealth()) * pct / 100.f)); //restore pct\n+    //mana\n+    if (me->GetPowerType() == POWER_MANA)\n+    {\n+        float intValue = me->GetTotalStatValue(STAT_INTELLECT) - me->GetCreateStat(STAT_INTELLECT);\n+        intValue += 0.3f * petOwner->GetBotAI()->GetTotalBotStat(BOT_STAT_MOD_INTELLECT);\n+        float intMult;\n+        switch (myType)\n+        {\n+            case BOT_PET_IMP:        intMult = 4.95f; break;\n+            case BOT_PET_VOIDWALKER:\n+            case BOT_PET_SUCCUBUS:\n+            case BOT_PET_FELHUNTER:\n+            case BOT_PET_FELGUARD:   intMult = 11.5f; break;\n+            default:                 intMult = 15.f;  break;\n+        }\n+        //int/mana bonuses\n+        if (petOwner->GetBotClass() == BOT_CLASS_WARLOCK)\n+        {\n+            //Fel Vitality (pet) part 2\n+            if (level >= 15)\n+                intValue *= 1.15f;\n+        }\n+        //additional: store stat\n+        me->SetStat(STAT_INTELLECT, int32(intValue));\n+        float m_totalmana = intValue * intMult/* + me->GetCreatePowerValue(POWER_MANA)*/ + (IAmFree() ? level * 25.f : 0); //+2000/+0 mana at 80\n+        //BOT_LOG_ERROR(\"entities.player\", \"SetPetStat(): mana intValue %.1f, intMult %.1f, base %u, total %.2f\", intValue, intMult, botPet->GetCreatePowerValue(POWER_MANA), m_totalmana);\n+        bool fullmana = me->GetPower(POWER_MANA) == me->GetMaxPower(POWER_MANA);\n+        pct = fullmana ? 100.f : (float(me->GetPower(POWER_MANA)) * 100.f) / float(me->GetMaxPower(POWER_MANA));\n+        me->SetStatFlatModifier(UNIT_MOD_MANA, BASE_VALUE, m_totalmana);\n+        me->UpdateMaxPower(POWER_MANA);\n+        me->SetPower(POWER_MANA, fullmana ? me->GetMaxPower(POWER_MANA) :\n+            uint32(0.5f + float(me->GetMaxPower(POWER_MANA)) * pct / 100.f)); //restore pct\n+    }\n+\n+    if (force)\n+    {\n+        me->SetFullHealth();\n+        if (me->GetPowerType() == POWER_MANA)\n+            me->SetPower(POWER_MANA, me->GetMaxPower(POWER_MANA));\n+        else if (me->GetPowerType() == POWER_FOCUS)\n+            me->SetPower(POWER_FOCUS, me->GetMaxPower(POWER_FOCUS));\n+    }\n+}\n+//Force pet to start attack anyone who tries to DAMAGE me or owner\n+//This means that anyone who attacks party will be attacked by whole bot party (see GetTarget())\n+void bot_pet_ai::OnOwnerDamagedBy(Unit* attacker)\n+{\n+    switch (myType)\n+    {\n+        case BOT_PET_TORNADO:\n+        case BOT_PET_LOCUST_SWARM:\n+            return;\n+        default:\n+            break;\n+    }\n+\n+    if (petOwner->GetBotAI()->HasBotCommandState(BOT_COMMAND_MASK_UNMOVING))\n+        return;\n+    if (!petOwner->GetBotAI()->CanBotAttack(attacker))\n+        return;\n+\n+    SetBotCommandState(BOT_COMMAND_COMBATRESET);\n+    me->Attack(attacker, IsPetMelee());\n+}\n+void bot_pet_ai::OnAttackStop(Unit const* target)\n+{\n+    if (opponent == target)\n+        opponent = nullptr;\n+}\n+\n+bool bot_pet_ai::IsPetMelee() const\n+{\n+    return bot_ai::IsPetMelee(myType);\n+}\n+\n+uint8 bot_pet_ai::Spec() const\n+{\n+    return petOwner->GetBotAI()->GetSpec();\n+}\n+\n+//ISINBOTPARTY\n+//Returns group members (and their npcbots too)\n+//For now all your puppets are in your group automatically\n+bool bot_pet_ai::IsInBotParty(Unit const* unit) const\n+{\n+    if (!unit) return false;\n+    if (unit == petOwner->GetBotOwner() || unit == me || unit == petOwner) return true;\n+\n+    if (IAmFree())\n+    {\n+        if (me->GetFaction() == FACTION_TEMPLATE_NEUTRAL_HOSTILE || unit->GetFaction() == FACTION_TEMPLATE_NEUTRAL_HOSTILE)\n+            return false;\n+\n+        if (me->HasByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_FFA_PVP) ||\n+            unit->HasByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_FFA_PVP))\n+            return false;\n+\n+        return\n+            (unit->IsPlayer() || unit->ToCreature()->IsPet() || unit->IsNPCBot() || unit->IsNPCBotPet()) &&\n+            (unit->GetFaction() == me->GetFaction() ||\n+            (me->GetReactionTo(unit) >= REP_FRIENDLY && unit->GetReactionTo(me) >= REP_FRIENDLY));\n+    }\n+\n+    //cheap check\n+    if (Group const* gr = petOwner->GetBotOwner()->GetGroup())\n+    {\n+        //group member case\n+        if (gr->IsMember(unit->GetGUID()))\n+            return true;\n+        //pointed target case\n+        for (auto i : NPCBots::index_array<uint8, TARGET_ICONS_COUNT>)\n+            if (BotCfg::GetHealTargetIconFlags() & GroupIconsFlags[i] &&\n+                !((BotCfg::GetOffTankTargetIconFlags() | BotCfg::GetDPSTargetIconFlags()) & GroupIconsFlags[i]))\n+                if (ObjectGuid guid = gr->GetTargetIcons()[i])\n+                    if (guid == unit->GetGUID())\n+                        return true;\n+    }\n+\n+    //Player-controlled creature case\n+    if (Creature const* cre = unit->ToCreature())\n+    {\n+        ObjectGuid ownerGuid = unit->GetOwnerGUID() ? unit->GetOwnerGUID() : unit->GetCreator() ? unit->GetCreator()->GetGUID() : ObjectGuid::Empty;\n+        //controlled by master\n+        if (ownerGuid == petOwner->GetBotOwner()->GetGUID())\n+            return true;\n+        //npcbot/npcbot's pet case\n+        if (cre->GetBotOwner() == petOwner->GetBotOwner())\n+            return true;\n+        if (ownerGuid && petOwner->GetBotOwner()->GetBotMgr()->GetBot(ownerGuid))\n+            return true;\n+        //controlled by group member\n+        //pets, minions, guardians etc.\n+        //bot pets too\n+        if (ownerGuid)\n+            if (Group const* gr = petOwner->GetBotOwner()->GetGroup())\n+                if (gr->IsMember(ownerGuid))\n+                    return true;\n+    }\n+\n+    return false;\n+}\n+\n+//REFRESHAURA\n+//Applies/removes/reapplies aura stacks\n+void bot_pet_ai::RefreshAura(uint32 spellId, int8 count, Unit* target) const\n+{\n+    if (count < 0 || count > 10)\n+    {\n+        BOT_LOG_ERROR(\"entities.player\", \"bot_pet_ai::RefreshAura(): count is out of bounds ({}) for bot {} (botclass: {}, entry: {})\",\n+            int32(count), me->GetName().c_str(), uint32(petOwner->GetBotClass()), me->GetEntry());\n+        return;\n+    }\n+    if (!spellId)\n+    {\n+        BOT_LOG_ERROR(\"entities.player\", \"bot_pet_ai::RefreshAura(): spellId is 0 for bot {} (botclass: {}, entry: {})\",\n+            me->GetName().c_str(), uint32(petOwner->GetBotClass()), me->GetEntry());\n+        return;\n+    }\n+\n+    SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);\n+    if (!spellInfo)\n+    {\n+        BOT_LOG_ERROR(\"entities.player\", \"bot_pet_ai::RefreshAura(): Invalid spellInfo for spell {}! Bot - {} (botclass: {}, entry: {})\",\n+            spellId, me->GetName().c_str(), uint32(petOwner->GetBotClass()), me->GetEntry());\n+        return;\n+    }\n+\n+    if (!target)\n+        target = me;\n+\n+    target->RemoveAurasDueToSpell(spellId);\n+\n+    for (int8 i = 0; i < count; ++i)\n+        target->AddAura(spellInfo, MAX_EFFECT_MASK, target);\n+}\n+//GETTARGET\n+//Returns attack target or 'no target'\n+//All code above 'x = _getTarget() call must not dereference opponent since it can be invalid\n+Unit* bot_pet_ai::_getTarget(bool &reset) const\n+{\n+    if (petOwner->GetBotAI()->HasBotCommandState(BOT_COMMAND_FULLSTOP | BOT_COMMAND_INACTION))\n+        return nullptr;\n+    if (petOwner->GetBotAI()->GetEngageTimer() > lastdiff)\n+        return nullptr;\n+\n+    Unit* mytar = me->GetVictim();\n+    Unit* u = petOwner->GetVictim();\n+\n+    if (mytar && me->HasAuraType(SPELL_AURA_MOD_TAUNT))\n+        return mytar;\n+\n+    if (u)\n+    {\n+        if (opponent && u != opponent)\n+            reset = true;\n+        return u;\n+    }\n+\n+    uint8 followdist = IAmFree() ? BotMgr::GetBotFollowDistMax() : petOwner->GetBotOwner()->GetBotMgr()->GetBotFollowDist();\n+\n+    if (followdist == 0)\n+        return nullptr;\n+\n+    float foldist = _getAttackDistance(float(followdist));\n+    if (!IAmFree() && !IsPetMelee())\n+    {\n+        float spelldist;\n+        uint8 rangeMode = petOwner->GetBotOwner()->GetBotMgr()->GetBotAttackRangeMode();\n+        if (rangeMode == BOT_ATTACK_RANGE_EXACT)\n+            spelldist = petOwner->GetBotOwner()->GetBotMgr()->GetBotExactAttackRange();\n+        else\n+            spelldist = GetSpellAttackRange(rangeMode == BOT_ATTACK_RANGE_LONG);\n+        foldist = std::max<float>(foldist, spelldist + 4.f);\n+    }\n+    bool dropTarget = false;\n+    if (mytar)\n+    {\n+        dropTarget = IAmFree() ?\n+            petOwner->GetDistance(mytar) > foldist :\n+            (petOwner->GetBotOwner()->GetDistance(mytar) > foldist || (petOwner->GetBotOwner()->GetDistance(mytar) > foldist * 0.75f && !mytar->IsWithinLOSInMap(petOwner, VMAP::ModelIgnoreFlags::M2, LINEOFSIGHT_ALL_CHECKS)));\n+    }\n+    if (dropTarget)\n+        return nullptr;\n+\n+    if (mytar && (!IAmFree() || me->GetDistance(mytar) < float(BOT_MAX_CHASE_RANGE)) && me->IsValidAttackTarget(mytar) && !petOwner->GetBotAI()->IsPointedNoDPSTarget(mytar))\n+    {\n+        if (me->GetDistance(mytar) > (!IsPetMelee() ? 20.f : 5.f) && _botCommandState != COMMAND_STAY && _botCommandState != COMMAND_FOLLOW)\n+            reset = true;\n+        return mytar;\n+    }\n+\n+    return nullptr;\n+}\n+//'CanAttack' function\n+//Only called in class ai UpdateAI function\n+bool bot_pet_ai::CheckAttackTarget()\n+{\n+    bool reset = false;\n+    opponent = _getTarget(reset);\n+\n+    if (!opponent)\n+    {\n+        if (me->GetVictim() || me->IsInCombat())\n+        {\n+            if (me->GetVictim())\n+                me->AttackStop();\n+        }\n+\n+        return false;\n+    }\n+    if (petOwner->GetBotAI()->IsLastOrder(BOT_ORDER_PULL, 0, opponent->GetGUID()))\n+        return false;\n+\n+    if (reset)\n+        SetBotCommandState(BOT_COMMAND_COMBATRESET);//reset AttackStart()\n+\n+    if (opponent != me->GetVictim())\n+        me->Attack(opponent, IsPetMelee());\n+\n+    return true;\n+}\n+//POSITION\n+//Ranged attack position\n+void bot_pet_ai::CalculateAttackPos(Unit* target, Position& pos) const\n+{\n+    uint8 followdist = IAmFree() ? BotMgr::GetBotFollowDistMax() : petOwner->GetBotOwner()->GetBotMgr()->GetBotFollowDist();\n+    uint8 rangeMode = IAmFree() ? uint8(BOT_ATTACK_RANGE_LONG) : petOwner->GetBotOwner()->GetBotMgr()->GetBotAttackRangeMode();\n+    uint8 exactRange = rangeMode != BOT_ATTACK_RANGE_EXACT || IAmFree() ? 255 : petOwner->GetBotOwner()->GetBotMgr()->GetBotExactAttackRange();\n+    Position ppos;\n+    float //x(0),y(0),z(0),\n+        dist = (rangeMode == BOT_ATTACK_RANGE_EXACT) ? exactRange :\n+        followdist >= 40 ? followdist :\n+        5 + urand(followdist/3, followdist/3 + 5)/*18-23 at 40, 15-20 at 30*/,\n+        angle = target->GetAbsoluteAngle(me);\n+    //most ranged classes have some sort of 20yd spell\n+    if (rangeMode != BOT_ATTACK_RANGE_EXACT)\n+        dist = std::min<float>(dist, petOwner->GetBotAI()->HasRole(BOT_ROLE_DPS) ? GetSpellAttackRange(rangeMode == BOT_ATTACK_RANGE_LONG) - 4.f : 30.f);\n+\n+    float clockwise = (me->GetEntry() % 2) ? 1.f : -1.f;\n+    float angleDelta = frand(0.0f, float(M_PI)*0.10f) * clockwise;\n+\n+    for (auto i : NPCBots::index_array<uint8, 5>)\n+    {\n+        ppos = target->GetFirstCollisionPosition(dist, angle - target->GetOrientation());\n+        //target->GetNearPoint(me, x, y, z, dist, angle);\n+        if (!target->IsWithinLOS(/*x,y,z*/ppos.m_positionX, ppos.m_positionY, ppos.m_positionZ))\n+        {\n+            if (rangeMode != BOT_ATTACK_RANGE_EXACT)\n+                dist *= i >= 4 ? 0.1f : 0.33f;\n+            if (i >= 4)\n+                angle += angleDelta;\n+        }\n+    }\n+\n+    pos.Relocate(ppos);\n+    //pos.m_positionX = x;\n+    //pos.m_positionY = y;\n+    //pos.m_positionZ = z;\n+}\n+// Forces bot to chase opponent (if ranged then distance depends on follow distance)\n+void bot_pet_ai::GetInPosition(bool force, Unit* newtarget, Position* mypos)\n+{\n+    if (petOwner->GetBotAI()->HasBotCommandState(BOT_COMMAND_MASK_UNMOVING))\n+        return;\n+    if (CCed(me, true) || JumpingOrFalling())\n+        return;\n+    if (!newtarget)\n+        newtarget = me->GetVictim();\n+    if (!newtarget)\n+        return;\n+    if ((!newtarget->IsInCombat() || me->isMoving()) && !force)\n+        return;\n+    if (IsCasting())\n+        return;\n+\n+    if (!IAmFree() && petOwner->GetBotOwner()->GetBotMgr()->GetBotAttackRangeMode() == BOT_ATTACK_RANGE_EXACT &&\n+        petOwner->GetBotOwner()->GetBotMgr()->GetBotExactAttackRange() == 0)\n+    {\n+        attackpos.m_positionX = newtarget->GetPositionX() - frand(0.5f, 1.5f) * std::cos(me->GetAbsoluteAngle(newtarget));\n+        attackpos.m_positionY = newtarget->GetPositionY() - frand(0.5f, 1.5f) * std::sin(me->GetAbsoluteAngle(newtarget));\n+        attackpos.m_positionZ = newtarget->GetPositionZ();\n+        if (me->GetExactDist2d(&attackpos) > 3.5f)\n+            me->GetMotionMaster()->MovePoint(newtarget->GetMapId(), attackpos);\n+        return;\n+    }\n+\n+    uint8 followdist = IAmFree() ? BotMgr::GetBotFollowDistMax() : petOwner->GetBotOwner()->GetBotMgr()->GetBotFollowDist();\n+    if (!IsPetMelee())\n+    {\n+        //do not allow constant runaway from player\n+        if (!force && newtarget->IsPlayer() &&\n+            me->GetDistance(newtarget) < 6 + urand(followdist/4, followdist/3))\n+            return;\n+\n+        if (!mypos)\n+            CalculateAttackPos(newtarget, attackpos);\n+        else\n+        {\n+            attackpos.m_positionX = mypos->m_positionX;\n+            attackpos.m_positionY = mypos->m_positionY;\n+            attackpos.m_positionZ = mypos->m_positionZ;\n+        }\n+        if (me->GetExactDist2d(&attackpos) > 4.f || !me->IsWithinLOSInMap(newtarget, VMAP::ModelIgnoreFlags::M2, LINEOFSIGHT_ALL_CHECKS))\n+        {\n+            me->GetMotionMaster()->MovePoint(newtarget->GetMapId(), attackpos);\n+            if (!me->HasUnitState(UNIT_STATE_MELEE_ATTACKING))\n+                me->SetInFront(newtarget);\n+        }\n+    }\n+    else if (!JumpingOrFalling() && ((!me->HasUnitState(UNIT_STATE_CHASE) && !me->isMoving()) || (!me->HasUnitState(UNIT_STATE_CHASE_MOVE) && me->GetDistance(newtarget) > 1.5f)))\n+    {\n+        //me->BotStopMovement();\n+        me->GetMotionMaster()->MoveChase(newtarget);\n+    }\n+\n+    if (newtarget != me->GetVictim())\n+    {\n+        if (!me->Attack(newtarget, IsPetMelee()))\n+            me->SetInFront(newtarget);\n+    }\n+}\n+\n+void bot_pet_ai::CheckAttackState()\n+{\n+    if (me->GetVictim())\n+    {\n+        MoveBehind(me->GetVictim());\n+\n+        if (petOwner->GetBotAI()->HasRole(BOT_ROLE_DPS) &&\n+            !me->HasAuraType(SPELL_AURA_MOD_STEALTH) && !me->HasAuraType(SPELL_AURA_MOD_INVISIBILITY))\n+        {\n+            //if (!CCed(me->GetVictim()) || me->HasAuraType(SPELL_AURA_MOD_TAUNT))\n+                DoMeleeAttackIfReady();\n+        }\n+    }\n+}\n+\n+void bot_pet_ai::MoveBehind(Unit const* target) const\n+{\n+    if (_moveBehindTimer > lastdiff || HasBotCommandState(BOT_COMMAND_MASK_UNMOVING) || !IsPetMelee() || CCed(me, true) || JumpingOrFalling())\n+        return;\n+\n+    if (target->GetVictim() != me && !CCed(target) && target->IsWithinCombatRange(me, ATTACK_DISTANCE) && target->HasInArc(float(M_PI), me))\n+    {\n+        float x,y,z;\n+        target->GetNearPoint(me, x, y, z, 0.f, me->GetCombatReach(), me->GetAbsoluteAngle(target));\n+        me->GetMotionMaster()->MovePoint(me->GetMapId(), x, y, z);\n+        const_cast<bot_pet_ai*>(this)->_moveBehindTimer = urand(1000, 4000);\n+    }\n+}\n+bool bot_pet_ai::_canRegenerate() const\n+{\n+    switch (me->GetEntry())\n+    {\n+        case BOT_PET_DARK_MINION:\n+        case BOT_PET_DARK_MINION_ELITE:\n+        case BOT_PET_NECROSKELETON:\n+        case BOT_PET_TORNADO:\n+        case BOT_PET_CARRION_BEETLE1:\n+        case BOT_PET_CARRION_BEETLE2:\n+        case BOT_PET_CARRION_BEETLE3:\n+        case BOT_PET_LOCUST_SWARM:\n+            return false;\n+        default:\n+            return true;\n+    }\n+}\n+//Health and Powers regeneration\n+void bot_pet_ai::Regenerate()\n+{\n+    regenTimer += lastdiff;\n+\n+    //every tick\n+    if (me->GetPowerType() == POWER_FOCUS)\n+        RegeneratePetFocus();\n+    else if (me->GetPowerType() == POWER_ENERGY)\n+        RegeneratePetEnergy();\n+\n+    if (regenTimer >= REGEN_CD)\n+    {\n+        regenTimer -= REGEN_CD;\n+\n+        // Regen Pet Health\n+        if (_canRegenerate() && (!me->IsInCombat() || me->IsPolymorphed()) && me->GetHealth() < me->GetMaxHealth())\n+        {\n+            int32 add = IAmFree() && !me->GetVictim() ? me->GetMaxHealth() / 32 : 20 + me->GetCreateHealth() / 64;\n+\n+            if (me->IsPolymorphed())\n+                add += me->GetMaxHealth() / 6;\n+            else if (!me->IsInCombat() || me->HasAuraType(SPELL_AURA_MOD_REGEN_DURING_COMBAT))\n+            {\n+                if (!me->IsInCombat())\n+                {\n+                    for (AuraEffect const* aeff : me->GetAuraEffectsByType(SPELL_AURA_MOD_HEALTH_REGEN_PERCENT))\n+                        AddPct(add, aeff->GetAmount());\n+\n+                    add += me->GetTotalAuraModifier(SPELL_AURA_MOD_REGEN) * REGEN_CD / 5000;\n+                }\n+                else if (me->HasAuraType(SPELL_AURA_MOD_REGEN_DURING_COMBAT))\n+                    ApplyPct(add, me->GetTotalAuraModifier(SPELL_AURA_MOD_REGEN_DURING_COMBAT));\n+            }\n+\n+            add += me->GetTotalAuraModifier(SPELL_AURA_MOD_HEALTH_REGEN_IN_COMBAT);\n+\n+            if (add < 0)\n+                add = 0;\n+\n+            me->ModifyHealth(add);\n+        }\n+        // Regen Pet Mana (use bot's regen rate) warlock only\n+        if (me->GetPowerType() == POWER_MANA && me->GetPower(POWER_MANA) < me->GetMaxPower(POWER_MANA))\n+        {\n+            float addvalue;\n+            if (me->IsUnderLastManaUseEffect())\n+                addvalue = petOwner->GetFloatValue(UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER);\n+            else\n+                addvalue = petOwner->GetFloatValue(UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER);\n+\n+            addvalue *= sWorld->getRate(RATE_POWER_MANA) * float(REGEN_CD) * 0.001f; //regenTimer threshold / 1000\n+            if (addvalue < 0.0f)\n+                addvalue = 0.0f;\n+\n+            me->ModifyPower(POWER_MANA, int32(addvalue));\n+        }\n+    }\n+}\n+\n+void bot_pet_ai::RegeneratePetFocus()\n+{\n+    uint32 curValue = me->GetPower(POWER_FOCUS);\n+    uint32 maxValue = me->GetMaxPower(POWER_FOCUS);\n+\n+    // Regen Pet Focus\n+    if (curValue < maxValue)\n+    {\n+        float addvalue = 0.005f * lastdiff * sWorld->getRate(RATE_POWER_FOCUS); //5 per sec\n+\n+        //Bestial Discipline\n+        if (petOwner->GetLevel() >= 30)\n+            addvalue *= 2;\n+\n+        addvalue += _energyFraction;\n+\n+        if (addvalue == 0x0) //only if world rate for focus is 0\n+            return;\n+\n+        uint32 integerValue = uint32(fabs(addvalue));\n+\n+        curValue += integerValue;\n+\n+        if (curValue > maxValue)\n+        {\n+            curValue = maxValue;\n+            _energyFraction = 0.f;\n+        }\n+        else\n+            _energyFraction = addvalue - float(integerValue);\n+\n+        if (curValue == maxValue || regenTimer >= REGEN_CD)\n+            me->SetPower(POWER_FOCUS, curValue);\n+        else\n+            me->UpdateUInt32Value(UNIT_FIELD_POWER1 + uint16(POWER_FOCUS), curValue);\n+    }\n+}\n+\n+void bot_pet_ai::RegeneratePetEnergy()\n+{\n+    uint32 curValue = me->GetPower(POWER_ENERGY);\n+    uint32 maxValue = me->GetMaxPower(POWER_ENERGY);\n+\n+    if (curValue < maxValue)\n+    {\n+        float addvalue = 0.01f * lastdiff * sWorld->getRate(RATE_POWER_ENERGY); //10 per sec\n+\n+        if (addvalue == 0x0) //only if world rate for enegy is 0\n+            return;\n+\n+        addvalue += _energyFraction;\n+\n+        uint32 integerValue = uint32(fabs(addvalue));\n+\n+        curValue += integerValue;\n+\n+        if (curValue > maxValue)\n+        {\n+            curValue = maxValue;\n+            _energyFraction = 0.f;\n+        }\n+        else\n+            _energyFraction = addvalue - float(integerValue);\n+\n+        if (curValue == maxValue || regenTimer >= REGEN_CD)\n+            me->SetPower(POWER_ENERGY, curValue);\n+        else\n+            me->UpdateUInt32Value(UNIT_FIELD_POWER1 + uint16(POWER_ENERGY), curValue);\n+    }\n+}\n+//////////\n+//SPELLMAP\n+//////////\n+//Using first-rank spell as source, returns spellId of max rank allowed for given caster\n+//If you want bot to use this spell through doCast() go InitSpellMap(uint32) instead\n+uint32 bot_pet_ai::InitSpell(Unit const* caster, uint32 spell)\n+{\n+    SpellInfo const* info = sSpellMgr->GetSpellInfo(spell);\n+    if (!info)\n+    {\n+        BOT_LOG_ERROR(\"entities.player\", \"InitSpell(): No SpellInfo found for spell {}\", spell);\n+        return 0; //weird spell with no info, disable it\n+    }\n+\n+    uint8 lvl = caster->GetLevel();\n+    if (lvl < info->BaseLevel) //only 1st rank spells check\n+        return 0; //cannot use this spell\n+\n+    if (SpellInfo const* spInfo = info->GetNextRankSpell())\n+    {\n+        if (lvl < spInfo->BaseLevel)\n+            return spell; //cannot use next rank, use this one\n+        else\n+            return InitSpell(caster, spInfo->Id); //can use next rank, forward check\n+    }\n+\n+    return spell; //max rank, use this\n+}\n+//Using first-rank spell as source, puts spell of max rank allowed for given caster in spellmap\n+void bot_pet_ai::InitSpellMap(uint32 basespell, bool forceadd, bool forwardRank)\n+{\n+    SpellInfo const* info = sSpellMgr->GetSpellInfo(basespell);\n+    if (!info)\n+    {\n+        BOT_LOG_ERROR(\"entities.player\", \"bot_pet_ai::InitSpellMap(): No SpellInfo found for base spell {}\", basespell);\n+        return; //invalid spell id\n+    }\n+\n+    uint8 lvl = me->GetLevel();\n+    uint32 spellId = forceadd ? basespell : 0;\n+\n+    while (info != nullptr && forwardRank && (forceadd || lvl >= info->BaseLevel))\n+    {\n+        spellId = info->Id; //can use this spell\n+        info = info->GetNextRankSpell(); //check next rank\n+    }\n+\n+    BotPetSpell& newSpell = _spells.try_emplace(basespell).first->second;\n+    newSpell.spellId = spellId;\n+}\n+//Using first-rank spell as source, return current spell id\n+uint32 bot_pet_ai::GetSpell(uint32 basespell) const\n+{\n+    decltype(_spells)::const_iterator itr = _spells.find(basespell);\n+    return itr != _spells.end() && (itr->second.enabled == true || IAmFree()) ? itr->second.spellId : 0;\n+}\n+//Using first-rank spell as source, returns cooldown on current spell\n+uint32 bot_pet_ai::GetSpellCooldown(uint32 basespell) const\n+{\n+    decltype(_spells)::const_iterator itr = _spells.find(basespell);\n+    return itr != _spells.end() ? itr->second.cooldown : 0;\n+}\n+bool bot_pet_ai::IsSpellReady(uint32 basespell, uint32 diff, bool checkGCD) const\n+{\n+    if (checkGCD && GC_Timer > diff)\n+        return false;\n+\n+    decltype(_spells)::const_iterator itr = _spells.find(basespell);\n+    return itr == _spells.end() ? true :\n+        ((itr->second.enabled == true || IAmFree()) && itr->second.spellId != 0 && itr->second.cooldown <= diff);\n+}\n+//Using first-rank spell as source, sets cooldown for current spell\n+void bot_pet_ai::SetSpellCooldown(uint32 basespell, uint32 msCooldown)\n+{\n+    //if (!msCooldown)\n+    //    return;\n+\n+    BotPetSpell& newSpell = _spells.try_emplace(basespell).first->second;\n+    newSpell.cooldown = msCooldown;\n+}\n+//Using first-rank spell as source, sets cooldown for spells of that category\n+void bot_pet_ai::SetSpellCategoryCooldown(SpellInfo const* spellInfo, uint32 msCooldown)\n+{\n+    if (!msCooldown)\n+        return;\n+\n+    uint32 category = spellInfo->GetCategory();\n+    if (!category)\n+        return;\n+\n+    SpellInfo const* info;\n+    for (auto& [rank1_id, spell] : _spells)\n+    {\n+        //skip spell which has triggered this category cooldown\n+        if (rank1_id == spellInfo->Id && spell.cooldown >= msCooldown)\n+            continue;\n+\n+        info = sSpellMgr->GetSpellInfo(spell.spellId);\n+        if (info && rank1_id == spellInfo->Id && info->GetCategory() != category)\n+        {\n+            if (rank1_id != 7814) // Lash of Pain\n+            {\n+                BOT_LOG_ERROR(\"scripts\", \"Warning: SetSpellCategoryCooldown: {} has baseId {} but category {}, not {}!\",\n+                    info->Id, rank1_id, info->GetCategory(), category);\n+            }\n+        }\n+\n+        if (info && (info->GetCategory() == category || rank1_id == spellInfo->Id) && spell.cooldown < msCooldown)\n+            spell.cooldown = msCooldown;\n+    }\n+}\n+//Handles spell cooldowns for spell with IsCooldownStartedOnEvent() == true\n+void bot_pet_ai::ReleaseSpellCooldown(uint32 basespell)\n+{\n+    SpellInfo const* baseInfo = sSpellMgr->GetSpellInfo(basespell);\n+\n+    if (!baseInfo->IsCooldownStartedOnEvent())\n+    {\n+        BOT_LOG_ERROR(\"spells\", \"bot_pet_ai::ReleaseSpellCooldown is called for wrong spell {}!\", basespell);\n+        return;\n+    }\n+\n+    uint32 rec = baseInfo->RecoveryTime;\n+    uint32 catrec = baseInfo->CategoryRecoveryTime;\n+\n+    SetSpellCooldown(baseInfo->Id, rec > 0 ? rec : 0);\n+    SetSpellCategoryCooldown(baseInfo, catrec > 0 && !(baseInfo->AttributesEx6 & SPELL_ATTR6_NO_CATEGORY_COOLDOWN_MODS) ? catrec : 0);\n+}\n+//Using first-rank spell as source, disables certain spell for this bot\n+void bot_pet_ai::RemoveSpell(uint32 basespell)\n+{\n+    BotPetSpell& newSpell = _spells.try_emplace(basespell).first->second;\n+    newSpell.spellId = 0;\n+    newSpell.cooldown = 0;\n+}\n+//See CommonTimers(uint32)\n+void bot_pet_ai::SpellTimers(uint32 diff)\n+{\n+    // spell must be initialized!!!\n+    for (auto& [_, spell] : _spells)\n+    {\n+        if (spell.cooldown >= diff)\n+            spell.cooldown -= diff;\n+        else if (spell.cooldown > 0)\n+            spell.cooldown = 0;\n+    }\n+}\n+//Bots cannot dodge/parry from behind so try to condense enemies at front\n+//opponent is always valid\n+void bot_pet_ai::AdjustTankingPosition() const\n+{\n+    if (/*!IsTank() || */!me->IsInCombat() || IsCasting() ||\n+        JumpingOrFalling() || CCed(me, true) || Rand() > 10 + 20*me->GetMap()->IsDungeon() ||\n+        HasBotCommandState(BOT_COMMAND_MASK_UNMOVING))\n+        return;\n+\n+    Unit::AttackerSet const& myattackers = me->getAttackers();\n+    if (myattackers.size() < 2)\n+        return;\n+\n+    //BOT_LOG_ERROR(\"entities.player\", \"AdjustTankingPosition() by %s\", me->GetName().c_str());\n+\n+    uint32 bCount = 0;\n+    for (Unit const* u : myattackers)\n+    {\n+        if (/*!CCed(u) && */(u)->GetDistance(me) < 5 && !me->HasInArc(float(M_PI), u))\n+            ++bCount;\n+            //if (++bCount)\n+            //    break;\n+    }\n+\n+    if (bCount == 0)\n+        return;\n+\n+    //BOT_LOG_ERROR(\"entities.player\", \"AdjustTankingPosition(): atts %u, behind %u\", uint32(myattackers.size()), bCount);\n+\n+    //calculate new position\n+    float x = me->GetPositionX();\n+    float y = me->GetPositionY();\n+    float z = me->GetPositionZ();\n+    float ori = me->GetOrientation();\n+    float const moveDist = -1.f * std::max<float>(opponent->GetCombatReach() * 0.6f, 3.f);\n+    float moveX = 0.f;\n+    float moveY = 0.f;\n+    for (auto i : NPCBots::index_array<uint8, 3>)\n+    {\n+        if (i)\n+        {\n+            ori = Position::NormalizeOrientation(ori + (i+1)*(M_PI*0.5f));\n+        }\n+\n+        //move back\n+        moveX = moveDist * std::cos(ori);\n+        moveY = moveDist * std::sin(ori);\n+\n+        if (me->IsWithinLOS(x+moveX, y+moveY, z))\n+            break;\n+\n+        if (i == 2)\n+        {\n+            moveX *= 0.2f;\n+            moveY *= 0.2f;\n+        }\n+    }\n+\n+    x += moveX;\n+    y += moveY;\n+\n+    me->UpdateAllowedPositionZ(x, y, z);\n+    if (me->GetPositionZ() < z)\n+        z += 0.75f; //prevent going underground\n+\n+    //if (CCed(opponent, true))\n+    //    me->AttackStop();\n+    //me->SetOrientation(ori);\n+    me->GetMotionMaster()->MovePoint(me->GetMapId(), x, y, z);\n+}\n+//SpellHit()... OnSpellHit()\n+void bot_pet_ai::OnSpellHit(Unit* caster, SpellInfo const* spell)\n+{\n+    //uint32 const spellId = spell->Id;\n+\n+    if (spell->HasAura(SPELL_AURA_MOD_TAUNT) || spell->HasEffect(SPELL_EFFECT_ATTACK_ME))\n+        if (caster && me->Attack(caster, true))\n+            me->GetMotionMaster()->MoveChase(caster);\n+\n+    for (auto i : NPCBots::index_array<uint8, MAX_SPELL_EFFECTS>)\n+    {\n+        uint32 const auraname = spell->Effects[i].ApplyAuraName;\n+\n+        //update stats\n+        if (auraname == SPELL_AURA_MOD_STAT || auraname == SPELL_AURA_MOD_PERCENT_STAT ||\n+            auraname == SPELL_AURA_MOD_TOTAL_STAT_PERCENTAGE ||\n+            auraname == SPELL_AURA_MOD_ATTACK_POWER || auraname == SPELL_AURA_MOD_ATTACK_POWER_PCT ||\n+            auraname == SPELL_AURA_MOD_ATTACK_POWER_OF_STAT_PERCENT || auraname == SPELL_AURA_MOD_ATTACK_POWER_OF_ARMOR ||\n+            auraname == SPELL_AURA_MOD_SPELL_DAMAGE_OF_STAT_PERCENT ||\n+            auraname == SPELL_AURA_MOD_RATING || auraname == SPELL_AURA_MOD_RATING_FROM_STAT)\n+            shouldUpdateStats = true;\n+        else if (auraname == SPELL_AURA_MOD_INCREASE_HEALTH ||\n+            auraname == SPELL_AURA_MOD_INCREASE_HEALTH_2 ||\n+            auraname == SPELL_AURA_230 ||\n+            auraname == SPELL_AURA_MOD_INCREASE_HEALTH_PERCENT)\n+            shouldUpdateStats = true;\n+        else if (auraname == SPELL_AURA_MOD_INCREASE_ENERGY || auraname == SPELL_AURA_MOD_INCREASE_ENERGY_PERCENT)\n+            shouldUpdateStats = true;\n+    }\n+\n+    if (!me->GetVictim() && (me->IsHostileTo(caster) || caster->IsHostileTo(me)))\n+    {\n+        if (me->CanSeeOrDetect(caster) && (caster->IsInCombat() || me->IsInCombat() || petOwner->IsInCombat()))\n+            petOwner->GetBotAI()->OwnerAttackedBy(caster);\n+    }\n+}\n+//Update delay\n+//Skip UpdateAI cycles for randomization of bots' reaction and performance adjustments\n+bool bot_pet_ai::Wait()\n+{\n+    if (waitTimer > lastdiff)\n+        return true;\n+\n+    if (IAmFree())\n+        waitTimer = me->IsInCombat() ? 250 : ((__rand + 100) * 20);\n+    else if (!me->GetMap()->IsRaid())\n+        waitTimer = std::min<uint32>(uint32(50 * (petOwner->GetBotOwner()->GetNpcBotsCount() - 1) + __rand + __rand), 500);\n+    else\n+        waitTimer = __rand;\n+\n+    return false;\n+}\n+//Spell Mod Hooks\n+void bot_pet_ai::ApplyBotDamageMultiplierSpell(int32& damage, SpellNonMeleeDamage& damageinfo, SpellInfo const* spellInfo, WeaponAttackType attackType, bool crit) const\n+{\n+    //DAMAGE SPELLS damage bonus (DMG_CLASS_MAGIC)\n+    ApplyClassDamageMultiplierSpell(damage, damageinfo, spellInfo, attackType, crit);\n+}\n+//Spell Mod Utilities\n+float bot_pet_ai::CalcSpellMaxRange(uint32 spellId, bool enemy) const\n+{\n+    SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);\n+    ASSERT(spellInfo);\n+\n+    return spellInfo->GetMaxRange(!enemy);\n+}\n+bool bot_pet_ai::IAmFree() const\n+{\n+    return petOwner->IsFreeBot();\n+}\n+\n+bool bot_pet_ai::CCed(Unit const* target, bool root)\n+{\n+    return bot_ai::CCed(target, root);\n+}\n+\n+bool bot_pet_ai::IsTank(Unit const* unit) const\n+{\n+    if (Creature const* bot = unit->ToCreature())\n+        return bot->GetBotAI() && bot->GetBotAI()->HasRole(BOT_ROLE_TANK);\n+    else if (Player const* player = unit->ToPlayer())\n+    {\n+        if (Group const* gr = player->GetGroup())\n+        {\n+            Group::MemberSlotList const& slots = gr->GetMemberSlots();\n+            for (Group::member_citerator itr = slots.begin(); itr != slots.end(); ++itr)\n+                if (itr->guid == unit->GetGUID())\n+                    return itr->flags & MEMBER_FLAG_MAINTANK;\n+            if (gr->isLFGGroup() && sLFGMgr->GetRoles(unit->GetGUID()) & lfg::PLAYER_ROLE_TANK)\n+                return true;\n+        }\n+    }\n+\n+    return false;\n+}\n+//Unused\n+bool bot_pet_ai::IsOffTank(Unit const* unit) const\n+{\n+    if (Creature const* bot = unit->ToCreature())\n+        return bot->GetBotAI() && bot->GetBotAI()->HasRole(BOT_ROLE_TANK_OFF);\n+    else if (Player const* player = unit->ToPlayer())\n+    {\n+        if (Group const* gr = player->GetGroup())\n+        {\n+            if (gr->isRaidGroup())\n+            {\n+                for (auto const& slot : gr->GetMemberSlots())\n+                    if (slot.guid == unit->GetGUID())\n+                        return slot.flags & MEMBER_FLAG_MAINASSIST;\n+            }\n+        }\n+    }\n+\n+    return false;\n+}\n+\n+void bot_pet_ai::OnStartAttack(Unit const* /*u*/)\n+{\n+    AdjustTankingPosition();\n+}\n+\n+bool bot_pet_ai::StartAttack(Unit const* u, bool force)\n+{\n+    if (HasBotCommandState(BOT_COMMAND_ATTACK) && !force)\n+        return false;\n+\n+    SetBotCommandState(BOT_COMMAND_ATTACK);\n+    OnStartAttack(u);\n+    return true;\n+}\n+\n+void bot_pet_ai::JustDied(Unit*)\n+{\n+    KillEvents(false);\n+}\n+\n+void bot_pet_ai::KilledUnit(Unit* u)\n+{\n+    GetPetsOwner()->GetBotAI()->KilledUnit(u);\n+}\n+\n+void bot_pet_ai::AttackStart(Unit* /*u*/)\n+{\n+}\n+\n+void bot_pet_ai::DamageDealt(Unit* victim, uint32& damage, DamageEffectType /*damageType*/, SpellSchoolMask /*damageSchoolMask*/)\n+{\n+    if (victim == me)\n+        return;\n+\n+    if (damage)\n+    {\n+        if (Creature* cre = victim->ToCreature())\n+        {\n+            if (!cre->hasLootRecipient())\n+                cre->SetLootRecipient(petOwner->GetBotOwner());\n+\n+            //controlled case is handled in Unit::DealDamage\n+            if (IAmFree())\n+                cre->LowerPlayerDamageReq(std::min<uint32>(cre->GetHealth(), damage) / (BotMgr::IsWanderingWorldBot(me) ? 4 : 2));\n+        }\n+    }\n+}\n+\n+void bot_pet_ai::IsSummonedBy(WorldObject* summoner)\n+{\n+    //BOT_LOG_ERROR(\"entities.unit\", \"bot_pet_ai::IsSummonedBy for %s by %s\", me->GetName().c_str(), summoner->GetName().c_str());\n+    //ASSERT(!petOwner);\n+    //ASSERT(summoner->IsCreature());\n+    petOwner = summoner->ToCreature();\n+    _botCommandState = petOwner->GetBotAI()->GetBotCommandState();\n+    myType = me->GetEntry();\n+    //myType = petOwner->GetBotAI()->GetAIMiscValue(BOTAI_MISC_PET_TYPE);\n+    //ASSERT(myType);\n+    me->setActive(true);\n+    //me->SetUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED);\n+    ASSERT(!me->GetBotAI());\n+    ASSERT(!me->GetBotPetAI());\n+    me->SetBotPetAI(this);\n+    SetPetStats(true);\n+    if (petOwner->GetTransport())\n+    {\n+        petOwner->GetTransport()->AddPassenger(me, true);\n+        me->m_movementInfo.transport.pos.Relocate(petOwner->GetTransOffset());\n+        me->Relocate(bot_ai::GetAbsoluteTransportPosition(petOwner));\n+        me->AddUnitState(UNIT_STATE_IGNORE_PATHFINDING);\n+    }\n+    //Send group update if not a minion\n+    if (petOwner->GetBotAI()->GetBotsPet() == me && petOwner->GetBotAI()->GetGroup())\n+        BotMgr::SetBotGroupUpdateFlag(petOwner, GROUP_UPDATE_PET);\n+}\n+//This function is called after Spell::SendSpellCooldown() and Spell::DoAllEffects...() call\n+void bot_pet_ai::OnBotPetSpellGo(Spell const* spell, bool ok)\n+{\n+    if (!ok)\n+        return;\n+\n+    SpellInfo const* curInfo = spell->GetSpellInfo();\n+\n+    //Set cooldown\n+    if (!curInfo->IsCooldownStartedOnEvent() && !curInfo->IsPassive())\n+    {\n+        uint32 rec = curInfo->RecoveryTime;\n+        uint32 catrec = curInfo->CategoryRecoveryTime;\n+\n+        SetSpellCooldown(curInfo->GetFirstRankSpell()->Id, rec);\n+        SetSpellCategoryCooldown(curInfo->GetFirstRankSpell(), catrec);\n+    }\n+\n+    if ((!curInfo->CastTimeEntry || !curInfo->CastTimeEntry->CastTime) &&\n+        curInfo->StartRecoveryTime)\n+    {\n+        GC_Timer = curInfo->StartRecoveryTime;\n+        GC_Timer = std::max<uint32>(GC_Timer, 1000);\n+        GC_Timer = std::min<uint32>(GC_Timer, 1500);\n+    }\n+\n+    OnPetClassSpellGo(curInfo);\n+}\n+\n+void bot_pet_ai::OnBotPetSpellInterrupted(SpellSchoolMask schoolMask, uint32 unTimeMs)\n+{\n+    for (auto& [_, spell] : _spells)\n+    {\n+        SpellInfo const* info = sSpellMgr->GetSpellInfo(spell.spellId);\n+        if (!info || !(info->GetSchoolMask() & schoolMask)) continue;\n+        if (info->IsCooldownStartedOnEvent()) continue;\n+        if (info->PreventionType != SPELL_PREVENTION_TYPE_SILENCE) continue;\n+\n+        spell.cooldown += unTimeMs;\n+        //BOT_LOG_ERROR(\"entities.player\", \"OnBotPetSpellInterrupted(): Adding cooldown (%u, new: %u) to spell %s (id: %u, schoolmask: %u), reqSchoolMask = %u\",\n+        //    unTimeMs, itr->second.second, info->SpellName[0], info->Id, info->SchoolMask, schoolMask);\n+    }\n+\n+    GC_Timer = 0; //reset global cooldown since cast is canceled\n+}\n+//GLOBAL UPDATE\n+//opponent unsafe\n+bool bot_pet_ai::GlobalUpdate(uint32 diff)\n+{\n+    if (!petOwner)\n+    {\n+        BOT_LOG_ERROR(\"entities.unit\", \"botpet:GlobalUpdate(): no owner!\");\n+        return false;\n+    }\n+\n+    if (!BotCfg::IsNpcBotModEnabled())\n+        return false;\n+\n+    ReduceCD(diff);\n+\n+    lastdiff = diff;\n+\n+    if (_updateTimerMedium <= diff)\n+    {\n+        _updateTimerMedium = 500;\n+\n+        //Medium-timed updates\n+        if (!IAmFree())\n+        {\n+            //update pvp state\n+            if (me->GetByteValue(UNIT_FIELD_BYTES_2, 1) != petOwner->GetByteValue(UNIT_FIELD_BYTES_2, 1))\n+                me->SetByteValue(UNIT_FIELD_BYTES_2, 1, petOwner->GetByteValue(UNIT_FIELD_BYTES_2, 1));\n+        }\n+        if (myType == BOT_PET_LOCUST_SWARM)\n+        {\n+            me->SetFloatValue(UNIT_FIELD_BOUNDINGRADIUS, 2.0f * DEFAULT_WORLD_OBJECT_SIZE * me->GetObjectScale());\n+            me->SetFloatValue(UNIT_FIELD_COMBATREACH,  2.0f * DEFAULT_COMBAT_REACH * me->GetObjectScale());\n+        }\n+    }\n+\n+    if (!me->IsAlive())\n+        return false;\n+\n+    //Check current cast state: interrupt casts that became pointless\n+    if (me->HasUnitState(UNIT_STATE_CASTING) && urand(1,100) <= 75)\n+    {\n+        for (uint8 i = CURRENT_FIRST_NON_MELEE_SPELL; i != CURRENT_AUTOREPEAT_SPELL; ++i)\n+        {\n+            bool interrupt = false;\n+            Spell* spell = me->GetCurrentSpell(CurrentSpellTypes(i));\n+            if (!spell)\n+                continue;\n+            if (spell->m_targets.GetObjectTargetGUID().IsAnyTypeCreature())\n+                spell->m_targets.Update(me);\n+            Unit const* target = spell->m_targets.GetUnitTarget();\n+            if (!target)\n+                continue;\n+            SpellInfo const* info = spell->GetSpellInfo();\n+            if (!info->CastTimeEntry)\n+                continue;\n+            if (!info->IsPositive())\n+            {\n+                if (!target->IsAlive())\n+                    interrupt = true;\n+                //control interruptions should be checked inside pet class ai\n+                //else if ((info->Mechanic == MECHANIC_POLYMORPH || info->Mechanic == MECHANIC_SHACKLE ||\n+                //    info->Mechanic == MECHANIC_DISORIENTED || info->Mechanic == MECHANIC_SLEEP ||\n+                //    info->Mechanic == MECHANIC_CHARM || info->Mechanic == MECHANIC_BANISH ||\n+                //    info->Mechanic == MECHANIC_STUN || info->Mechanic == MECHANIC_FREEZE) &&\n+                //    !target->getAttackers().empty() && !IsCasting(target))\n+                //    interrupt = true; //useless control\n+                else if (target->HasAuraType(SPELL_AURA_PERIODIC_DAMAGE) && !IsCasting(target) &&\n+                    (info->AuraInterruptFlags & AURA_INTERRUPT_FLAG_TAKE_DAMAGE))\n+                    interrupt = true; //useless control breaks immediately\n+            }\n+\n+            if (interrupt)\n+            {\n+                me->InterruptSpell(CurrentSpellTypes(i));\n+                GC_Timer = 0;\n+                break;\n+            }\n+        }\n+    }\n+\n+    if (_updateTimerEx1 <= diff && !IAmFree())\n+    {\n+        _updateTimerEx1 = urand(2000, 2500);\n+\n+        //Ex1-timed updates\n+\n+        //DEBUG\n+        /*\n+        Sometimes bots are affected by zone (instance) scripts\n+        Good example is CoT: Battle for Mount Hyjal\n+        */\n+        //Faction\n+        //ensure master is not controlled\n+        ChrRacesEntry const* rEntry = sChrRacesStore.LookupEntry(petOwner->GetBotOwner()->GetRace());\n+        uint32 fac_orig = rEntry ? rEntry->FactionID : 0;\n+        if (petOwner->GetBotOwner()->GetFaction() == fac_orig)\n+        {\n+            uint32 fac = (!IAmFree() && me->GetMap()->IsBattleArena()) ? uint32(FACTION_MONSTER) : fac_orig;\n+            if (me->GetFaction() != fac)\n+                me->SetFaction(fac);\n+        }\n+        //Visibility\n+        if (!me->IsVisible() && petOwner->GetBotOwner()->IsVisible())\n+        {\n+            //BotWhisper(\"Something changed my visibility status! Making visible...\");\n+            me->SetVisible(true);\n+        }\n+        if (me->IsVisible() && !petOwner->GetBotOwner()->IsVisible())\n+        {\n+            //BotWhisper(\"Something changed my visibility status! Making invisible...\");\n+            me->SetVisible(false);\n+        }\n+        //Phase\n+        if (me->GetPhaseMask() != petOwner->GetBotOwner()->GetPhaseMask())\n+        {\n+            //BotWhisper(\"Somehow we are not is same phase! Fixing that...\");\n+            me->SetPhaseMask(petOwner->GetBotOwner()->GetPhaseMask(), true);\n+        }\n+        if (me->GetTransport() != petOwner->GetBotOwner()->GetTransport())\n+        {\n+            if (petOwner->GetBotOwner()->GetTransport())\n+            {\n+                if (me->GetDistance2d(petOwner->GetBotOwner()) < 20.f)\n+                {\n+                    petOwner->GetBotOwner()->GetTransport()->AddPassenger(me, true);\n+                    me->m_movementInfo.transport.pos.Relocate(petOwner->GetBotOwner()->GetTransOffset());\n+                    me->Relocate(bot_ai::GetAbsoluteTransportPosition(petOwner->GetBotOwner()));\n+                    me->AddUnitState(UNIT_STATE_IGNORE_PATHFINDING);\n+                }\n+            }\n+            else\n+            {\n+                switch (me->GetEntry())\n+                {\n+                    case BOT_PET_TORNADO:\n+                    case BOT_PET_LOCUST_SWARM:\n+                        break;\n+                    default:\n+                        me->ClearUnitState(UNIT_STATE_IGNORE_PATHFINDING);\n+                    break;\n+                }\n+                me->GetTransport()->RemovePassenger(me, true);\n+            }\n+        }\n+        //end DEBUG\n+    }\n+\n+    Regenerate();\n+\n+    //update flags\n+    if (!me->IsInCombat())\n+    {\n+        if (me->HasUnitFlag(UNIT_FLAG_PET_IN_COMBAT))\n+            me->RemoveUnitFlag(UNIT_FLAG_PET_IN_COMBAT);\n+    }\n+\n+    //update movement orders if near owner, otherwise get close\n+    bool closeToOwner = false;\n+    if (!opponent && !IsCasting())\n+    {\n+        _calculatePos(movepos);\n+        if (me->GetExactDist(&movepos) > 5.f)\n+            SetBotCommandState(BOT_COMMAND_FOLLOW, true, &movepos);\n+        else\n+            closeToOwner = !me->isMoving();\n+    }\n+    if (closeToOwner || me->IsInCombat())\n+    {\n+        uint8 st = (petOwner->GetBotAI()->GetBotCommandState() & BOT_COMMAND_MASK_UNMOVING);\n+        if (st && GetBotCommandState() != st)\n+        {\n+            SetBotCommandState(st);\n+            return !(st & BOT_COMMAND_FULLSTOP);\n+        }\n+    }\n+\n+    if (HasBotCommandState(BOT_COMMAND_FULLSTOP))\n+        return false;\n+\n+    if (!HasBotCommandState(BOT_COMMAND_INACTION))\n+        CheckAttackState();\n+\n+    //second alive check - CheckAttackState() can cause bot to die\n+    if (!me->IsAlive())\n+        return false;\n+\n+    if (checkAurasTimer <= lastdiff)\n+    {\n+        Unit* victim = me->GetVictim();\n+        checkAurasTimer += uint32(__rand + __rand + (IAmFree() ? 1000 : 40 * (1 + petOwner->GetBotOwner()->GetNpcBotsCount())));\n+\n+        if (!HasBotCommandState(BOT_COMMAND_MASK_UNCHASE) && victim && !CCed(me, true) &&\n+            !me->isMoving() && !IsCasting() && myType != BOT_PET_TORNADO && myType != BOT_PET_LOCUST_SWARM)\n+        {\n+            if (!IAmFree() && petOwner->GetBotOwner()->GetBotMgr()->GetBotAttackRangeMode() == BOT_ATTACK_RANGE_EXACT &&\n+                petOwner->GetBotOwner()->GetBotMgr()->GetBotExactAttackRange() == 0)\n+            {\n+                GetInPosition(true, victim);\n+            }\n+            else if (IsPetMelee())\n+            {\n+                if (me->GetDistance(victim) > 1.5f)\n+                    GetInPosition(true, victim);\n+            }\n+            else\n+            {\n+                CalculateAttackPos(victim, attackpos);\n+                if (me->GetExactDist2d(&attackpos) > 4.f || !me->IsWithinLOSInMap(victim, VMAP::ModelIgnoreFlags::M2, LINEOFSIGHT_ALL_CHECKS))\n+                    GetInPosition(true, victim, &attackpos);\n+            }\n+        }\n+        if (shouldUpdateStats && me->GetPhaseMask() == petOwner->GetBotOwner()->GetPhaseMask())\n+            SetPetStats(false);\n+    }\n+\n+    if (Wait())\n+        return false;\n+\n+    if (CCed(me))\n+        return false;\n+\n+    GenerateRand();\n+\n+    if (HasBotCommandState(BOT_COMMAND_INACTION))\n+        return false;\n+\n+    return true;\n+}\n+\n+void bot_pet_ai::CommonTimers(uint32 diff)\n+{\n+    //_petEvents.Update(diff);\n+    SpellTimers(diff);\n+\n+    if (GC_Timer > diff)            GC_Timer -= diff;\n+    if (checkAurasTimer > diff)     checkAurasTimer -= diff;\n+    if (waitTimer > diff)           waitTimer -= diff;\n+    if (_moveBehindTimer > diff)    _moveBehindTimer -= diff;\n+\n+    if (_updateTimerMedium > diff)  _updateTimerMedium -= diff;\n+    if (_updateTimerEx1 > diff)     _updateTimerEx1 -= diff;\n+}\n+\n+void bot_pet_ai::KillEvents(bool /*force*/)\n+{\n+    //_petEvents.KillAllEvents(force);\n+}\n+\n+bool bot_pet_ai::IsChanneling(Unit const* u/* = nullptr*/) const\n+{\n+    if (!u)\n+        u = me;\n+    return u->GetCurrentSpell(CURRENT_CHANNELED_SPELL);\n+}\n+bool bot_pet_ai::IsCasting(Unit const* u/* = nullptr*/) const\n+{\n+    if (!u)\n+        u = me;\n+    return (u->HasUnitState(UNIT_STATE_CASTING) || IsChanneling(u) || u->IsNonMeleeSpellCast(false, false, true, false, false));\n+}\n+bool bot_pet_ai::JumpingFlyingOrFalling() const\n+{\n+    return JumpingOrFalling() || me->HasUnitMovementFlag(MOVEMENTFLAG_SPLINE_ELEVATION);\n+}\n+bool bot_pet_ai::JumpingOrFalling() const\n+{\n+    return Jumping() || me->IsFalling() || me->HasUnitMovementFlag(MOVEMENTFLAG_PITCH_UP|MOVEMENTFLAG_PITCH_DOWN);\n+}\n+bool bot_pet_ai::Jumping() const\n+{\n+    return me->HasUnitState(UNIT_STATE_JUMPING);\n+}\n+bool bot_pet_ai::IsIndoors() const\n+{\n+    return indoorsTimer >= INOUTDOORS_ENSURE_TIMER && outdoorsTimer == 0;\n+}\n+bool bot_pet_ai::IsOutdoors() const\n+{\n+    return outdoorsTimer >= INOUTDOORS_ENSURE_TIMER && indoorsTimer == 0;\n+}\n+\n+uint32 bot_pet_ai::GetLostHP(Unit const* unit)\n+{\n+    return unit->GetMaxHealth() - unit->GetHealth();\n+}\n+uint8 bot_pet_ai::GetHealthPCT(Unit const* u)\n+{\n+    if (!u || !u->IsAlive() || u->GetMaxHealth() <= 1)\n+        return 100;\n+    return uint8(((float(u->GetHealth()))/u->GetMaxHealth()) * 100);\n+}\n+uint8 bot_pet_ai::GetManaPCT(Unit const* u)\n+{\n+    if (!u || !u->IsAlive() || u->GetMaxPower(POWER_MANA) <= 1)\n+        return 100;\n+    return (u->GetPower(POWER_MANA)*10/(1 + u->GetMaxPower(POWER_MANA)/10));\n+}\ndiff --git a/src/server/game/AI/NpcBots/bpet_ai.h b/src/server/game/AI/NpcBots/bpet_ai.h\nnew file mode 100644\nindex 0000000000..9b77ba15c4\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bpet_ai.h\n@@ -0,0 +1,200 @@\n+#ifndef BOT_PET_AI_H\n+#define BOT_PET_AI_H\n+\n+#include \"botcommon.h\"\n+\n+#include \"CreatureAI.h\"\n+#include \"Position.h\"\n+\n+/*\n+NpcBot Pet System by Trickerer (onlysuffering@gmail.com)\n+*/\n+\n+struct SpellNonMeleeDamage;\n+\n+class Aura;\n+class Spell;\n+class Unit;\n+\n+class bot_pet_ai : public CreatureAI\n+{\n+public:\n+    virtual ~bot_pet_ai() {}\n+\n+    bool canUpdate{true};\n+\n+    void InitializeAI() override { Reset(); }\n+    void Reset() override {}\n+\n+    void JustDied(Unit*) override;\n+    void KilledUnit(Unit* u) override;\n+    void AttackStart(Unit* u) override;\n+    //virtual void JustEngagedWith(Unit* u) override;\n+    void MoveInLineOfSight(Unit* /*u*/) override {}\n+    void DamageDealt(Unit* victim, uint32& damage, DamageEffectType damageType, SpellSchoolMask /*damageSchoolMask*/) override;\n+    void DamageTaken(Unit* /*attacker*/, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellSchoolMask /*schoolMask*/) override { }\n+    //void ReceiveEmote(Player* player, uint32 emote);\n+    void EnterEvadeMode(EvadeReason/* why*/ = EVADE_REASON_OTHER) override { }\n+    uint32 GetData(uint32 data) const override;\n+    void IsSummonedBy(WorldObject* summoner) override;\n+\n+    Creature* GetPetsOwner() const { return petOwner; }\n+    void CalculatePetsOwnerFollowPosition(Position &pos) { _calculatePos(pos); }\n+\n+    //EventProcessor* GetEvents() { return &_petEvents; }\n+    uint32 GetLastDiff() const { return lastdiff; }\n+    void CommonTimers(uint32 diff);\n+    void KillEvents(bool force);\n+    void SetBotCommandState(uint32 st, bool force = false, Position* newpos = nullptr);\n+    void RemoveBotCommandState(uint32 st);\n+    bool HasBotCommandState(uint32 st) const { return (_botCommandState & st); }\n+    uint8 GetBotCommandState() const { return _botCommandState; }\n+    bool IsInBotParty(Unit const* unit) const;\n+    virtual void ApplyBotPetSpellRadiusMods(SpellInfo const* /*spellInfo*/, float& /*radius*/) const {}\n+    bool IsTank(Unit const* unit) const;\n+    bool IsOffTank(Unit const* unit) const;\n+\n+    bool IAmFree() const;\n+\n+    //wandering bots\n+    bool IsWanderer() const { return _wanderer; }\n+    void SetWanderer() { if (IAmFree()) _wanderer = true; }\n+\n+    uint64 GetAuraUpdateMaskForRaid() const { return _auraRaidUpdateMask; }\n+    void SetAuraUpdateMaskForRaid(uint8 slot) { _auraRaidUpdateMask |= (uint64(1) << slot); }\n+    void ResetAuraUpdateMaskForRaid() { _auraRaidUpdateMask = 0; }\n+\n+    static bool CCed(Unit const* target, bool root = false);\n+\n+    inline void SetShouldUpdateStats() { shouldUpdateStats = true; }\n+\n+    //virtual uint32 GetAIMiscValue(uint32 /*data*/) const { return 0; }\n+    //virtual void SetAIMiscValue(uint32 /*data*/, uint32 /*value*/) {}\n+\n+    void OnAttackStop(Unit const* target);\n+\n+    void OnBotPetSpellInterrupted(SpellSchoolMask schoolMask, uint32 unTimeMs);\n+    void OnBotPetSpellGo(Spell const* spell, bool ok = true);\n+    virtual void OnPetClassSpellGo(SpellInfo const* /*spellInfo*/) {}\n+\n+    bool IsSpellReady(uint32 basespell, uint32 diff, bool checkGCD = true) const;\n+    void SetSpellCooldown(uint32 basespell, uint32 msCooldown);\n+    void SetSpellCategoryCooldown(SpellInfo const* spellInfo, uint32 msCooldown);\n+    void ReleaseSpellCooldown(uint32 basespell);\n+\n+    void ApplyBotDamageMultiplierSpell(int32& damage, SpellNonMeleeDamage& damageinfo, SpellInfo const* spellInfo, WeaponAttackType attackType, bool crit) const;\n+\n+protected:\n+    explicit bot_pet_ai(Creature* creature);\n+\n+    virtual void ApplyClassDamageMultiplierSpell(int32& /*damage*/, SpellNonMeleeDamage& /*damageinfo*/, SpellInfo const* /*spellInfo*/, WeaponAttackType /*attackType*/, bool /*crit*/) const {}\n+\n+    virtual void ReduceCD(uint32 /*diff*/) {}\n+    bool GlobalUpdate(uint32 diff);\n+\n+    void CureGroup(uint32 cureSpell, uint32 diff);\n+    void SetPetStats(bool force);\n+\n+    void OnOwnerDamagedBy(Unit* attacker);\n+\n+    bool IsPetMelee() const;\n+    uint8 Spec() const;\n+\n+    static uint32 InitSpell(Unit const* caster, uint32 spell);\n+    void InitSpellMap(uint32 basespell, bool forceadd = false, bool forwardRank = true);\n+    uint32 GetSpell(uint32 basespell) const;\n+    uint32 GetSpellCooldown(uint32 basespell) const;\n+    void ResetSpellCooldown(uint32 basespell) { SetSpellCooldown(basespell, 0); }\n+    void RemoveSpell(uint32 basespell);\n+    void SpellTimers(uint32 diff);\n+\n+    void RefreshAura(uint32 spellId, int8 count = 1, Unit* target = nullptr) const;\n+    bool CheckAttackTarget();\n+    void MoveBehind(Unit const* target) const;\n+\n+    void AdjustTankingPosition() const;\n+    void OnStartAttack(Unit const* /*u*/);\n+    bool StartAttack(Unit const* u, bool force = false);\n+\n+    bool IsChanneling(Unit const* u = nullptr) const;\n+    bool IsCasting(Unit const* u = nullptr) const;\n+    bool JumpingFlyingOrFalling() const;\n+    bool JumpingOrFalling() const;\n+    bool Jumping() const;\n+    bool IsIndoors() const;\n+    bool IsOutdoors() const;\n+\n+    float CalcSpellMaxRange(uint32 spellId, bool enemy = true) const;\n+    void CalculateAttackPos(Unit* target, Position &pos) const;\n+    void GetInPosition(bool force, Unit* newtarget, Position* pos = nullptr);\n+    virtual float GetSpellAttackRange(bool longRange) const { return longRange ? 25.f : 15.f; }\n+    virtual void CheckAttackState();\n+    void OnSpellHit(Unit* caster, SpellInfo const* spell);\n+\n+    virtual void InitPetSpells() {}\n+    virtual void ApplyPetPassives() const {}\n+\n+    void Regenerate();\n+    void RegeneratePetFocus();\n+    void RegeneratePetEnergy();\n+\n+    bool Wait();\n+    uint16 Rand() const;\n+    void GenerateRand() const;\n+\n+    static uint32 GetLostHP(Unit const* unit);\n+    static uint8 GetHealthPCT(Unit const* u);\n+    static uint8 GetManaPCT(Unit const* u);\n+\n+    Unit* opponent{};\n+    Creature* petOwner{};\n+    uint32 GC_Timer{};\n+    uint32 myType{};\n+\n+private:\n+    bool _canCureTarget(Unit const* target, uint32 cureSpell) const;\n+    void _getBotDispellableAuraList(Unit const* target, Unit const* caster, uint32 dispelMask, std::list<Aura const*> &dispelList) const;\n+    void _calculatePos(Position& pos) const;\n+\n+    bool _canRegenerate() const;\n+\n+    Unit* _getTarget(bool &reset) const;\n+    bool _checkImmunities(Unit const* target, SpellInfo const* spellInfo) const;\n+    static inline float _getAttackDistance(float distance) { return distance*0.72f; }\n+\n+    Position movepos{}, attackpos{};\n+    uint32 _botCommandState{};\n+\n+    //timers\n+    uint32 lastdiff{}, checkAurasTimer{}, regenTimer{}, _updateTimerMedium{}, _updateTimerEx1{};\n+    uint32 _moveBehindTimer{};\n+    uint32 waitTimer{};\n+    uint32 indoorsTimer{}, outdoorsTimer{};\n+\n+    uint64 _auraRaidUpdateMask{};\n+\n+    float _energyFraction{};\n+\n+    bool shouldUpdateStats{};\n+\n+    //wandering bots\n+    bool _wanderer{};\n+\n+    struct BotPetSpell\n+    {\n+        explicit BotPetSpell() {}\n+        BotPetSpell(BotPetSpell const&) = delete;\n+        BotPetSpell(BotPetSpell&&) = delete;\n+        BotPetSpell& operator=(BotPetSpell const&) = delete;\n+        BotPetSpell& operator=(BotPetSpell&&) = delete;\n+\n+        uint32 spellId = 0;\n+        uint32 cooldown = 0;\n+        bool enabled = true;\n+    };\n+\n+    using BotPetSpellMap = std::unordered_map<uint32 /*firstrankspellid*/, BotPetSpell /*spell*/>;\n+    BotPetSpellMap _spells;\n+};\n+\n+#endif\ndiff --git a/src/server/game/AI/NpcBots/bpet_archmage.cpp b/src/server/game/AI/NpcBots/bpet_archmage.cpp\nnew file mode 100644\nindex 0000000000..1b948a631d\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bpet_archmage.cpp\n@@ -0,0 +1,151 @@\n+#include \"bot_ai.h\"\n+#include \"botspell.h\"\n+#include \"bpet_ai.h\"\n+#include \"Creature.h\"\n+#include \"ScriptMgr.h\"\n+/*\n+Archmage NpcBot Pets (by Trickerer onlysuffering@gmail.com)\n+Complete - 100%\n+TODO:\n+*/\n+\n+enum ArchmagePetBaseSpells\n+{\n+    WATERBOLT_1             = SPELL_WATERBOLT\n+};\n+\n+enum ArchmagePetSpecial\n+{\n+    ELEMENTAL_DURATION      = 60000 //1 min\n+};\n+\n+class archmage_pet_bot : public CreatureScript\n+{\n+public:\n+    archmage_pet_bot() : CreatureScript(\"archmage_pet_bot\") { }\n+\n+    CreatureAI* GetAI(Creature* creature) const override\n+    {\n+        return new awater_elemental_botpetAI(creature);\n+    }\n+\n+    struct awater_elemental_botpetAI : public bot_pet_ai\n+    {\n+        awater_elemental_botpetAI(Creature* creature) : bot_pet_ai(creature) { }\n+\n+        void JustEngagedWith(Unit* u) override { bot_pet_ai::JustEngagedWith(u); }\n+        void KilledUnit(Unit* u) override { bot_pet_ai::KilledUnit(u); }\n+        void EnterEvadeMode(EvadeReason why = EVADE_REASON_OTHER) override { bot_pet_ai::EnterEvadeMode(why); }\n+        void MoveInLineOfSight(Unit* u) override { bot_pet_ai::MoveInLineOfSight(u); }\n+        void JustDied(Unit* u) override { bot_pet_ai::JustDied(u); }\n+        void DoNonCombatActions(uint32 /*diff*/) { }\n+\n+        void StartAttack(Unit* u, bool force = false)\n+        {\n+            if (!bot_pet_ai::StartAttack(u, force))\n+                return;\n+            GetInPosition(force, u);\n+        }\n+\n+        void UpdateAI(uint32 diff) override\n+        {\n+            if ((liveTimer += diff) >= ELEMENTAL_DURATION * (IAmFree() ? 60u : 1u))\n+            {\n+                canUpdate = false;\n+                me->setDeathState(DeathState::JustDied);\n+                return;\n+            }\n+\n+            if (!GlobalUpdate(diff))\n+                return;\n+\n+            if (!me->IsInCombat())\n+                DoNonCombatActions(diff);\n+\n+            //DoPetActions(diff);\n+            //CheckDrainMana(diff);\n+\n+            if (!CheckAttackTarget())\n+                return;\n+\n+            if (IsCasting())\n+                return;\n+\n+            DoPetAttack(diff);\n+        }\n+\n+        void DoPetAttack(uint32 diff)\n+        {\n+            StartAttack(opponent, IsPetMelee());\n+\n+            if (!petOwner->GetBotAI()->HasRole(BOT_ROLE_DPS))\n+                return;\n+\n+            if (IsSpellReady(WATERBOLT_1, diff) && me->GetDistance(opponent) < 30)\n+            {\n+                me->CastSpell(opponent, GetSpell(WATERBOLT_1), false);\n+                return;\n+            }\n+        }\n+\n+        void OnPetClassSpellGo(SpellInfo const* /*spellInfo*/) override\n+        {\n+        }\n+\n+        void SpellHit(Unit* wcaster, SpellInfo const* spell) override\n+        {\n+            Unit* caster = wcaster->ToUnit();\n+            if (!caster)\n+                return;\n+\n+            OnSpellHit(caster, spell);\n+        }\n+\n+        void SpellHitTarget(Unit* /*wtarget*/, SpellInfo const* /*spell*/) override\n+        {\n+        }\n+\n+        void DamageDealt(Unit* victim, uint32& damage, DamageEffectType damageType, SpellSchoolMask damageSchoolMask) override\n+        {\n+            bot_pet_ai::DamageDealt(victim, damage, damageType, damageSchoolMask);\n+        }\n+\n+        void DamageTaken(Unit* u, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellSchoolMask /*schoolMask*/) override\n+        {\n+            if (!u)\n+                return;\n+            if (!u->IsInCombat() && !me->IsInCombat())\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void OwnerAttackedBy(Unit* u) override\n+        {\n+            if (!u)\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void Reset() override\n+        {\n+            liveTimer = 0;\n+        }\n+\n+        void InitPetSpells() override\n+        {\n+            InitSpellMap(WATERBOLT_1);\n+        }\n+\n+        void ApplyPetPassives() const override\n+        {\n+        }\n+\n+    private:\n+        uint32 liveTimer;\n+    };\n+};\n+\n+void AddSC_archmage_bot_pets()\n+{\n+    new archmage_pet_bot();\n+}\ndiff --git a/src/server/game/AI/NpcBots/bpet_crypt_lord.cpp b/src/server/game/AI/NpcBots/bpet_crypt_lord.cpp\nnew file mode 100644\nindex 0000000000..341d8db4c2\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bpet_crypt_lord.cpp\n@@ -0,0 +1,380 @@\n+#include \"bot_ai.h\"\n+#include \"botspell.h\"\n+#include \"bpet_ai.h\"\n+#include \"CellImpl.h\"\n+#include \"GridNotifiers.h\"\n+#include \"GridNotifiersImpl.h\"\n+#include \"MotionMaster.h\"\n+#include \"ScriptMgr.h\"\n+#include \"SpellMgr.h\"\n+#include \"TemporarySummon.h\"\n+/*\n+Crypt Lord NpcBot Pets (by Trickerer onlysuffering@gmail.com)\n+Notes:\n+Complete - 75%\n+TODO: Check if Burrow can be added\n+*/\n+\n+enum CryptLordPetBaseSpells\n+{\n+};\n+enum CryptLordPetPassives\n+{\n+};\n+enum CryptLordPetSpecial\n+{\n+    LOCUST_SWARM_EFFECTIVE_RADIUS       = 60,\n+    LOCUST_SWARM_SPELL_DURATION         = 30000,\n+};\n+\n+class crypt_lord_pet_bot : public CreatureScript\n+{\n+public:\n+    crypt_lord_pet_bot() : CreatureScript(\"crypt_lord_pet_bot\") { }\n+\n+    CreatureAI* GetAI(Creature* creature) const override\n+    {\n+        switch (creature->GetEntry())\n+        {\n+            case BOT_PET_LOCUST_SWARM:\n+                return new locust_swarm_botpetAI(creature);\n+            default:\n+                return new carrion_beetle_botpetAI(creature);\n+        }\n+    }\n+\n+    struct carrion_beetle_botpetAI : public bot_pet_ai\n+    {\n+        carrion_beetle_botpetAI(Creature* creature) : bot_pet_ai(creature) { }\n+\n+        void JustEnteredCombat(Unit* u) override { bot_pet_ai::JustEnteredCombat(u); }\n+        void KilledUnit(Unit* u) override { bot_pet_ai::KilledUnit(u); }\n+        void EnterEvadeMode(EvadeReason why = EVADE_REASON_OTHER) override { bot_pet_ai::EnterEvadeMode(why); }\n+        void MoveInLineOfSight(Unit* u) override { bot_pet_ai::MoveInLineOfSight(u); }\n+        void JustDied(Unit* u) override { bot_pet_ai::JustDied(u); }\n+        void DoNonCombatActions(uint32 /*diff*/) { }\n+\n+        void StartAttack(Unit* u, bool force = false)\n+        {\n+            if (!bot_pet_ai::StartAttack(u, force))\n+                return;\n+            GetInPosition(force, u);\n+        }\n+\n+        void UpdateAI(uint32 diff) override\n+        {\n+            if (!GlobalUpdate(diff))\n+                return;\n+\n+            if (!me->IsInCombat())\n+                DoNonCombatActions(diff);\n+\n+            if (!CheckAttackTarget())\n+                return;\n+\n+            if (IsCasting())\n+                return;\n+\n+            DoPetAttack(diff);\n+        }\n+\n+        void DoPetAttack(uint32 /*diff*/)\n+        {\n+            StartAttack(opponent, IsPetMelee());\n+        }\n+\n+        void OnPetClassSpellGo(SpellInfo const* /*spellInfo*/) override\n+        {\n+        }\n+\n+        void SpellHit(Unit* wcaster, SpellInfo const* spell) override\n+        {\n+            Unit* caster = wcaster->ToUnit();\n+            if (!caster)\n+                return;\n+\n+            OnSpellHit(caster, spell);\n+        }\n+\n+        void SpellHitTarget(Unit* /*wtarget*/, SpellInfo const* /*spell*/) override\n+        {\n+        }\n+\n+        void DamageDealt(Unit* victim, uint32& damage, DamageEffectType damageType, SpellSchoolMask damageSchoolMask) override\n+        {\n+            bot_pet_ai::DamageDealt(victim, damage, damageType, damageSchoolMask);\n+        }\n+\n+        void DamageTaken(Unit* u, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellSchoolMask /*schoolMask*/) override\n+        {\n+            if (!u)\n+                return;\n+            if (!u->IsInCombat() && !me->IsInCombat())\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void OwnerAttackedBy(Unit* u) override\n+        {\n+            if (!u)\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        uint32 GetData(uint32 data) const override\n+        {\n+            switch (data)\n+            {\n+                case BOTPETAI_MISC_MAXLEVEL:\n+                    return maxlevel;\n+                default:\n+                    return bot_pet_ai::GetData(data);\n+            }\n+        }\n+\n+        void SetData(uint32 data, uint32 value) override\n+        {\n+            switch (data)\n+            {\n+                case BOTPETAI_MISC_MAXLEVEL:\n+                    maxlevel = uint8(value);\n+                    SetPetStats(true);\n+                    break;\n+                default:\n+                    break;\n+            }\n+        }\n+\n+        void Reset() override\n+        {\n+            maxlevel = 1;\n+        }\n+\n+        void InitPetSpells() override\n+        {\n+        }\n+\n+        void ApplyPetPassives() const override\n+        {\n+        }\n+\n+    private:\n+        uint8 maxlevel;\n+    };\n+\n+    struct locust_swarm_botpetAI : public bot_pet_ai\n+    {\n+        locust_swarm_botpetAI(Creature* creature) : bot_pet_ai(creature)\n+        {\n+            (const_cast<CreatureMovementData&>(me->GetMovementTemplate())).Ground = CreatureGroundMovementType::Hover;\n+        }\n+\n+        void JustEnteredCombat(Unit* u) override { bot_pet_ai::JustEnteredCombat(u); }\n+        void KilledUnit(Unit* u) override { bot_pet_ai::KilledUnit(u); }\n+        void EnterEvadeMode(EvadeReason why = EVADE_REASON_OTHER) override { bot_pet_ai::EnterEvadeMode(why); }\n+        void MoveInLineOfSight(Unit* u) override { bot_pet_ai::MoveInLineOfSight(u); }\n+        void JustDied(Unit* u) override { bot_pet_ai::JustDied(u); }\n+\n+        void UpdateAI(uint32 diff) override\n+        {\n+            _activeTimer += diff;\n+\n+            if (!GlobalUpdate(diff))\n+                return;\n+\n+            DoLocustActions(diff);\n+        }\n+\n+        void DoLocustActions(uint32 diff)\n+        {\n+            bool is_full = _gathered >= _capacity;\n+            bool expired = _activeTimer >= LOCUST_SWARM_SPELL_DURATION;\n+\n+            if (Unit* u = me->GetVictim())\n+            {\n+                if (petOwner->GetBotAI()->HasRole(BOT_ROLE_DPS) && me->IsWithinMeleeRange(u) && me->isAttackReady())\n+                {\n+                    me->resetAttackTimer();\n+                    SpellInfo const* spellInfo = sSpellMgr->AssertSpellInfo(SPELL_SOUL_BITE);\n+                    spellInfo = spellInfo->TryGetSpellInfoOverride(me);\n+                    int32 bp = spellInfo->GetEffect(EFFECT_0).CalcValue(petOwner);\n+                    me->CastCustomSpell(u, SPELL_SOUL_BITE, &bp, nullptr, nullptr, true);\n+                }\n+                if (!is_full && !expired && u->IsWithinDist(petOwner, LOCUST_SWARM_EFFECTIVE_RADIUS))\n+                {\n+                    if (_chaseCheckTimer <= diff)\n+                    {\n+                        _chaseCheckTimer = urand(350, 1350);\n+                        float dist = CONTACT_DISTANCE + me->GetCombatReach() * frand(1.0f, 3.0f);\n+                        float angle = frand(0.001f, float(M_PI * 2));\n+                        Position nearpos = u->GetNearPosition(dist, angle);\n+                        me->GetMotionMaster()->MovePoint(1, nearpos, FORCED_MOVEMENT_NONE, 0.0f, false);\n+                    }\n+                    return;\n+                }\n+                else\n+                {\n+                    me->AttackStop();\n+                    me->BotStopMovement();\n+                }\n+            }\n+            else\n+            {\n+                _chaseCheckTimer = 0;\n+\n+                if (me->GetExactDist(petOwner) < (1.5f + 5u * uint32(expired)))\n+                {\n+                    if (_gathered > 0 && (is_full || expired))\n+                    {\n+                        SpellInfo const* spellInfo = sSpellMgr->AssertSpellInfo(SPELL_LOCUST_SWARM);\n+                        spellInfo = spellInfo->TryGetSpellInfoOverride(petOwner);\n+                        HealInfo hinfo(petOwner, petOwner, _gathered, spellInfo, spellInfo->GetSchoolMask());\n+                        petOwner->CastSpell(petOwner, SPELL_ENERGIZE_VISUAL, true);\n+                        petOwner->HealBySpell(hinfo);\n+                        _gathered = 0;\n+                    }\n+                    if (expired)\n+                    {\n+                        canUpdate = false;\n+                        me->ToTempSummon()->UnSummon(1ms);\n+                        return;\n+                    }\n+                }\n+            }\n+\n+            if (_targetRecheckTimer <= diff)\n+            {\n+                _targetRecheckTimer = urand(1000, 1500);\n+\n+                std::list<Unit*> targets;\n+                if (petOwner->GetBotAI()->HasRole(BOT_ROLE_DPS) && !is_full && !expired)\n+                {\n+                    Bcore::AnyUnfriendlyUnitInObjectRangeCheck check(petOwner, petOwner, LOCUST_SWARM_EFFECTIVE_RADIUS);\n+                    Bcore::UnitListSearcher searcher(petOwner, targets, check);\n+                    Cell::VisitObjects(petOwner, searcher, LOCUST_SWARM_EFFECTIVE_RADIUS);\n+\n+                    std::erase_if(targets, [poguid = petOwner->GetGUID(), combat = petOwner->IsInCombat(), max_attackers = _attackers](Unit const* unit) {\n+                        Unit::AttackerSet const& attackers = unit->getAttackers();\n+                        if (!(unit->IsInCombat() || (combat && !attackers.empty())))\n+                            return true;\n+                        return max_attackers <= std::ranges::count_if(attackers, [oguid = poguid](Unit const* attacker) {\n+                            return attacker->GetEntry() == BOT_PET_LOCUST_SWARM && attacker->GetOwnerGUID() == oguid;\n+                        });\n+                    });\n+                }\n+\n+                if (!targets.empty())\n+                {\n+                    opponent = targets.size() == 1 ? targets.front() : Bcore::Containers::SelectRandomContainerElement(targets);\n+                    me->Attack(opponent, false);\n+                    me->GetMotionMaster()->MoveChase(opponent);\n+                }\n+                else\n+                {\n+                    if (expired)\n+                    {\n+                        _targetRecheckTimer = 150;\n+                        for (auto rate : { MOVE_WALK, MOVE_RUN })\n+                            me->SetSpeedRate(rate, std::min<float>(1000.0f, me->GetSpeedRate(rate) * 1.35f));\n+                    }\n+\n+                    float dist = (expired || is_full) ? 0.0f : frand(3.0f, 20.0f);\n+                    float angle = frand(0.001f, float(M_PI * 2));\n+                    Position nearpos = petOwner->GetNearPosition(dist, angle);\n+                    me->GetMotionMaster()->MovePoint(1, nearpos, FORCED_MOVEMENT_NONE, 0.0f, false);\n+                }\n+            }\n+        }\n+\n+        void SpellHit(Unit* wcaster, SpellInfo const* spell) override\n+        {\n+            Unit* caster = wcaster->ToUnit();\n+            if (!caster)\n+                return;\n+\n+            OnSpellHit(caster, spell);\n+        }\n+\n+        void DamageDealt(Unit* victim, uint32& damage, DamageEffectType damageType, SpellSchoolMask damageSchoolMask) override\n+        {\n+            _gathered = std::min<uint32>(_gathered + CalculatePct(damage, 75.0f), _capacity);\n+\n+            bot_pet_ai::DamageDealt(victim, damage, damageType, damageSchoolMask);\n+        }\n+\n+        uint32 GetData(uint32 data) const override\n+        {\n+            switch (data)\n+            {\n+                case BOTPETAI_MISC_FIXEDLEVEL:\n+                    return me->GetCreatureTemplate()->maxlevel;\n+                case BOTPETAI_MISC_CARRY:\n+                    return _gathered;\n+                default:\n+                    return bot_pet_ai::GetData(data);\n+            }\n+        }\n+\n+        void SetData(uint32 data, uint32 value) override\n+        {\n+            switch (data)\n+            {\n+                case BOTPETAI_MISC_CAPACITY:\n+                    _capacity = value;\n+                    break;\n+                case BOTPETAI_MISC_MAX_ATTACKERS:\n+                    _attackers = value;\n+                    break;\n+                default:\n+                    break;\n+            }\n+        }\n+\n+        void CheckAttackState() override\n+        {\n+        }\n+\n+        void Reset() override\n+        {\n+            _gathered = 0;\n+            _capacity = 100;\n+            _attackers = 7;\n+\n+            _targetRecheckTimer = 0;\n+            _chaseCheckTimer = 0;\n+\n+            _activeTimer = 0;\n+        }\n+\n+        void ReduceCD(uint32 diff) override\n+        {\n+            if (_targetRecheckTimer > diff)                 _targetRecheckTimer -= diff;\n+            if (_chaseCheckTimer > diff)                    _chaseCheckTimer -= diff;\n+        }\n+\n+        void InitPetSpells() override\n+        {\n+        }\n+\n+        void ApplyPetPassives() const override\n+        {\n+            RefreshAura(SPELL_VERTEX_COLOR_BLACK);\n+            RefreshAura(SPELL_BLACK_HOLE_VISUAL_2);\n+        }\n+\n+    private:\n+        uint32 _gathered;\n+        uint32 _capacity;\n+        uint32 _attackers;\n+\n+        uint32 _targetRecheckTimer;\n+        uint32 _chaseCheckTimer;\n+\n+        uint32 _activeTimer;\n+    };\n+};\n+\n+void AddSC_crypt_lord_bot_pets()\n+{\n+    new crypt_lord_pet_bot();\n+}\ndiff --git a/src/server/game/AI/NpcBots/bpet_dark_ranger.cpp b/src/server/game/AI/NpcBots/bpet_dark_ranger.cpp\nnew file mode 100644\nindex 0000000000..ce77ee9098\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bpet_dark_ranger.cpp\n@@ -0,0 +1,219 @@\n+#include \"bot_ai.h\"\n+#include \"botspell.h\"\n+#include \"bpet_ai.h\"\n+#include \"Player.h\"\n+#include \"ScriptMgr.h\"\n+/*\n+Dark Ranger NpcBot Pets (by Trickerer onlysuffering@gmail.com)\n+Notes:\n+Extra abilities. For the sake of defending the owner added Taunt. For self defense added Blocking (block value unchanged)\n+Both abilities are one-time use\n+Complete - 100%\n+TODO:\n+*/\n+\n+enum DarkRangerPetBaseSpells\n+{\n+    BLOCKING_1                          = 3248,\n+    TAUNT_1                             = 37548\n+};\n+enum DarkRangerPetPassives\n+{\n+};\n+enum DarkRangerPetSpecial\n+{\n+    SPELL_GENERATE_THREAT               = 23604, //reduce threat\n+    THREAT_BASE                         = 5,\n+    MINION_DURATION                     = 80000\n+};\n+\n+class dark_ranger_pet_bot : public CreatureScript\n+{\n+public:\n+    dark_ranger_pet_bot() : CreatureScript(\"dark_ranger_pet_bot\") { }\n+\n+    CreatureAI* GetAI(Creature* creature) const override\n+    {\n+        return new dark_ranger_botpetAI(creature);\n+    }\n+\n+    struct dark_ranger_botpetAI : public bot_pet_ai\n+    {\n+        dark_ranger_botpetAI(Creature* creature) : bot_pet_ai(creature) { }\n+\n+        void JustEngagedWith(Unit* u) override { bot_pet_ai::JustEngagedWith(u); }\n+        void KilledUnit(Unit* u) override { bot_pet_ai::KilledUnit(u); }\n+        void EnterEvadeMode(EvadeReason why = EVADE_REASON_OTHER) override { bot_pet_ai::EnterEvadeMode(why); }\n+        void MoveInLineOfSight(Unit* u) override { bot_pet_ai::MoveInLineOfSight(u); }\n+        void JustDied(Unit* u) override { bot_pet_ai::JustDied(u); }\n+        void DoNonCombatActions(uint32 /*diff*/) { }\n+\n+        void StartAttack(Unit* u, bool force = false)\n+        {\n+            if (!bot_pet_ai::StartAttack(u, force))\n+                return;\n+            GetInPosition(force, u);\n+        }\n+\n+        void DoPetActions(uint32 /*diff*/)\n+        {\n+            //if (threatGenTimer < diff)\n+            //{\n+            //    threatGenTimer = 1500;\n+            //    int32 threat = THREAT_BASE;\n+            //    CastSpellExtraArgs args(true);\n+            //    args.AddSpellBP0(threat);\n+            //    me->CastSpell(me, SPELL_GENERATE_THREAT, args);\n+            //}\n+        }\n+\n+        void UpdateAI(uint32 diff) override\n+        {\n+            if ((liveTimer += diff) >= _getMaxDuration())\n+            {\n+                canUpdate = false;\n+                me->setDeathState(DeathState::JustDied);\n+                return;\n+            }\n+\n+            if (!GlobalUpdate(diff))\n+                return;\n+\n+            if (!me->IsInCombat())\n+                DoNonCombatActions(diff);\n+\n+            DoPetActions(diff);\n+\n+            if (!CheckAttackTarget())\n+                return;\n+\n+            if (IsCasting())\n+                return;\n+\n+            DoPetAttack(diff);\n+        }\n+\n+        void DoPetAttack(uint32 diff)\n+        {\n+            StartAttack(opponent, IsPetMelee());\n+\n+            if (IsSpellReady(TAUNT_1, diff, false) && Rand() < 50 &&\n+                ((opponent->GetVictim() == petOwner && !IsTank(petOwner)) ||\n+                (opponent->GetVictim() == petOwner->GetBotOwner() && !IsTank(petOwner->GetBotOwner()))) &&\n+                !opponent->HasAuraType(SPELL_AURA_MOD_TAUNT) && me->IsWithinMeleeRange(opponent))\n+            {\n+                me->CastSpell(opponent, GetSpell(TAUNT_1), false);\n+                SetSpellCooldown(TAUNT_1, std::numeric_limits<uint32>::max());\n+                return;\n+            }\n+\n+            if (IsSpellReady(BLOCKING_1, diff) && !me->getAttackers().empty() && Rand() < 40)\n+            {\n+                me->CastSpell(me, GetSpell(BLOCKING_1), true);\n+                SetSpellCooldown(BLOCKING_1, 20000);\n+                return;\n+            }\n+        }\n+\n+        void OnPetClassSpellGo(SpellInfo const* /*spellInfo*/) override\n+        {\n+        }\n+\n+        void SpellHit(Unit* wcaster, SpellInfo const* spell) override\n+        {\n+            Unit* caster = wcaster->ToUnit();\n+            if (!caster)\n+                return;\n+\n+            OnSpellHit(caster, spell);\n+        }\n+\n+        void SpellHitTarget(Unit* /*wtarget*/, SpellInfo const* /*spell*/) override\n+        {\n+        }\n+\n+        void DamageDealt(Unit* victim, uint32& damage, DamageEffectType damageType, SpellSchoolMask damageSchoolMask) override\n+        {\n+            bot_pet_ai::DamageDealt(victim, damage, damageType, damageSchoolMask);\n+        }\n+\n+        void DamageTaken(Unit* u, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellSchoolMask /*schoolMask*/) override\n+        {\n+            if (!u)\n+                return;\n+            if (!u->IsInCombat() && !me->IsInCombat())\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void OwnerAttackedBy(Unit* u) override\n+        {\n+            if (!u)\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        uint32 GetData(uint32 data) const override\n+        {\n+            switch (data)\n+            {\n+                case BOTPETAI_MISC_DURATION:\n+                    return liveTimer;\n+                case BOTPETAI_MISC_DURATION_MAX:\n+                    return _getMaxDuration();\n+                case BOTPETAI_MISC_MAXLEVEL:\n+                    return maxlevel;\n+                default:\n+                    return bot_pet_ai::GetData(data);\n+            }\n+        }\n+\n+        void SetData(uint32 data, uint32 value) override\n+        {\n+            switch (data)\n+            {\n+                case BOTPETAI_MISC_MAXLEVEL:\n+                    maxlevel = uint8(value);\n+                    SetPetStats(true);\n+                    break;\n+                default:\n+                    break;\n+            }\n+        }\n+\n+        void Reset() override\n+        {\n+            liveTimer = 0;\n+            maxlevel = 1;\n+        }\n+\n+        void InitPetSpells() override\n+        {\n+            InitSpellMap(TAUNT_1, true, false);\n+            InitSpellMap(BLOCKING_1, true, false);\n+        }\n+\n+        void ApplyPetPassives() const override\n+        {\n+\n+            if (me->GetEntry() == BOT_PET_DARK_MINION_ELITE)\n+                RefreshAura(SPELL_VERTEX_COLOR_BLACK);\n+            else if (me->GetEntry() == BOT_PET_DARK_MINION)\n+                RefreshAura(SPELL_VERTEX_COLOR_GREY);\n+        }\n+\n+    private:\n+        uint32 _getMaxDuration() const\n+        {\n+            return MINION_DURATION * (IAmFree() ? 5u : 1u);\n+        }\n+\n+        uint32 liveTimer;\n+        uint8 maxlevel;\n+    };\n+};\n+\n+void AddSC_dark_ranger_bot_pets()\n+{\n+    new dark_ranger_pet_bot();\n+}\ndiff --git a/src/server/game/AI/NpcBots/bpet_death_knight.cpp b/src/server/game/AI/NpcBots/bpet_death_knight.cpp\nnew file mode 100644\nindex 0000000000..b89878aa8b\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bpet_death_knight.cpp\n@@ -0,0 +1,190 @@\n+#include \"bot_ai.h\"\n+#include \"bpet_ai.h\"\n+#include \"ScriptMgr.h\"\n+/*\n+Deathknight NpcBot Pets (by Trickerer onlysuffering@gmail.com)\n+Complete - 25%\n+TODO: Garg, AOD, DRW\n+*/\n+enum DeathknightPetBaseSpells\n+{\n+    CLAW_1                              = 47468, //150% damage, 40 cost\n+    GNAW_1                              = 47481, //12% damage, stun 3 sec, 30 cost\n+    LEAP_1                              = 47482, //jump beh tar, 10 cost\n+    HUDDLE_1                            = 47484  //mini-shwall, channeled, 10 sec, 10 cost\n+};\n+\n+enum DeathknightPetPassives\n+{\n+    AVOIDANCE                           = 62137\n+};\n+\n+enum DeathknightPetSpecial\n+{\n+    GHOUL_FRENZY_1                      = 63560 //player-on-pet spell\n+};\n+\n+class deathknight_pet_bot : public CreatureScript\n+{\n+public:\n+    deathknight_pet_bot() : CreatureScript(\"deathknight_pet_bot\") { }\n+\n+    CreatureAI* GetAI(Creature* creature) const override\n+    {\n+        return new deathknight_botpetAI(creature);\n+    }\n+\n+    struct deathknight_botpetAI : public bot_pet_ai\n+    {\n+        deathknight_botpetAI(Creature* creature) : bot_pet_ai(creature) { }\n+\n+        void JustEngagedWith(Unit* u) override { bot_pet_ai::JustEngagedWith(u); }\n+        void KilledUnit(Unit* u) override { bot_pet_ai::KilledUnit(u); }\n+        void EnterEvadeMode(EvadeReason why = EVADE_REASON_OTHER) override { bot_pet_ai::EnterEvadeMode(why); }\n+        void MoveInLineOfSight(Unit* u) override { bot_pet_ai::MoveInLineOfSight(u); }\n+        void JustDied(Unit* u) override { bot_pet_ai::JustDied(u); }\n+        void DoNonCombatActions(uint32 /*diff*/) { }\n+\n+        void StartAttack(Unit* u, bool force = false)\n+        {\n+            if (!bot_pet_ai::StartAttack(u, force))\n+                return;\n+            GetInPosition(force, u);\n+        }\n+\n+        void DoPetActions(uint32 /*diff*/)\n+        {\n+        }\n+\n+        void UpdateAI(uint32 diff) override\n+        {\n+            if (!GlobalUpdate(diff))\n+                return;\n+\n+            if (!me->IsInCombat())\n+                DoNonCombatActions(diff);\n+\n+            DoPetActions(diff);\n+\n+            if (!CheckAttackTarget())\n+                return;\n+\n+            if (IsCasting())\n+                return;\n+\n+            DoPetAttack(diff);\n+        }\n+\n+        void DoPetAttack(uint32 diff)\n+        {\n+            StartAttack(opponent, IsPetMelee());\n+\n+            float dist = me->GetDistance(opponent);\n+            //Unit const* u = opponent->GetVictim();\n+            bool canDPS = petOwner->GetBotAI()->HasRole(BOT_ROLE_DPS);\n+\n+            if (myType == BOT_PET_GHOUL)\n+            {\n+                if (IsSpellReady(GHOUL_FRENZY_1, diff) && canDPS && me->IsWithinMeleeRange(opponent))\n+                {\n+                    RefreshAura(GHOUL_FRENZY_1);\n+                    SetSpellCooldown(GHOUL_FRENZY_1, 30000);\n+                }\n+\n+                uint32 const energy = me->GetPower(POWER_ENERGY);\n+\n+                if (IsSpellReady(HUDDLE_1, diff) && energy >= 10 && dist < 7 &&\n+                    !me->getAttackers().empty() && GetHealthPCT(me) < 70)\n+                {\n+                    me->CastSpell(me, GetSpell(HUDDLE_1), false);\n+                    return;\n+                }\n+\n+                if (IsSpellReady(LEAP_1, diff) && energy >= 10 &&\n+                    !HasBotCommandState(BOT_COMMAND_STAY) &&\n+                    !(opponent->IsCreature() && opponent->ToCreature()->isWorldBoss()) &&\n+                    dist > 5 && dist < 30)\n+                {\n+                    me->CastSpell(opponent, GetSpell(LEAP_1), false);\n+                    return;\n+                }\n+\n+                if (IsSpellReady(GNAW_1, diff) && canDPS && energy >= 30 &&\n+                    me->IsWithinMeleeRange(opponent) && opponent->IsNonMeleeSpellCast(false, false, true))\n+                {\n+                    me->CastSpell(opponent, GetSpell(GNAW_1), false);\n+                    return;\n+                }\n+\n+                if (IsSpellReady(CLAW_1, diff) && canDPS && energy >= 40 && me->IsWithinMeleeRange(opponent))\n+                {\n+                    me->CastSpell(opponent, GetSpell(CLAW_1), false);\n+                    return;\n+                }\n+            }\n+        }\n+\n+        void OnPetClassSpellGo(SpellInfo const* /*spellInfo*/) override\n+        {\n+        }\n+\n+        void SpellHit(Unit* wcaster, SpellInfo const* spell) override\n+        {\n+            Unit* caster = wcaster->ToUnit();\n+            if (!caster)\n+                return;\n+\n+            OnSpellHit(caster, spell);\n+        }\n+\n+        void SpellHitTarget(Unit* /*wtarget*/, SpellInfo const* /*spell*/) override\n+        {\n+        }\n+\n+        void DamageDealt(Unit* victim, uint32& damage, DamageEffectType damageType, SpellSchoolMask damageSchoolMask) override\n+        {\n+            bot_pet_ai::DamageDealt(victim, damage, damageType, damageSchoolMask);\n+        }\n+\n+        void DamageTaken(Unit* u, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellSchoolMask /*schoolMask*/) override\n+        {\n+            if (!u)\n+                return;\n+            if (!u->IsInCombat() && !me->IsInCombat())\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void OwnerAttackedBy(Unit* u) override\n+        {\n+            if (!u)\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void Reset() override\n+        {\n+        }\n+\n+        void InitPetSpells() override\n+        {\n+            InitSpellMap(CLAW_1);\n+            InitSpellMap(GNAW_1);\n+            InitSpellMap(LEAP_1);\n+            InitSpellMap(HUDDLE_1);\n+        }\n+\n+        void ApplyPetPassives() const override\n+        {\n+            if (myType == BOT_PET_GHOUL/* || myType == BOT_PET_AOD_GHOUL*/)\n+                RefreshAura(AVOIDANCE);\n+        }\n+\n+    private:\n+    };\n+};\n+\n+void AddSC_deathknight_bot_pets()\n+{\n+    new deathknight_pet_bot();\n+}\ndiff --git a/src/server/game/AI/NpcBots/bpet_dreadlord.cpp b/src/server/game/AI/NpcBots/bpet_dreadlord.cpp\nnew file mode 100644\nindex 0000000000..3e53244bac\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bpet_dreadlord.cpp\n@@ -0,0 +1,164 @@\n+#include \"bot_ai.h\"\n+#include \"bpet_ai.h\"\n+#include \"Creature.h\"\n+#include \"ScriptMgr.h\"\n+#include \"SpellAuras.h\"\n+#include \"SpellInfo.h\"\n+/*\n+Dreadlord NpcBot Pets (by Trickerer onlysuffering@gmail.com)\n+Complete - 100%\n+TODO:\n+*/\n+\n+enum DreadlordPetBaseSpells\n+{\n+};\n+\n+enum DreadlordPetPassives\n+{\n+};\n+\n+enum DreadlordPetSpecial\n+{\n+    IMMOLATION_DAMAGE       = 35959,\n+\n+    INFERNAL_DURATION       = 180000 //3 min\n+};\n+\n+class dreadlord_pet_bot : public CreatureScript\n+{\n+public:\n+    dreadlord_pet_bot() : CreatureScript(\"dreadlord_pet_bot\") { }\n+\n+    CreatureAI* GetAI(Creature* creature) const override\n+    {\n+        return new dreadlord_botpetAI(creature);\n+    }\n+\n+    struct dreadlord_botpetAI : public bot_pet_ai\n+    {\n+        dreadlord_botpetAI(Creature* creature) : bot_pet_ai(creature) { }\n+\n+        void JustEngagedWith(Unit* u) override { bot_pet_ai::JustEngagedWith(u); }\n+        void KilledUnit(Unit* u) override { bot_pet_ai::KilledUnit(u); }\n+        void EnterEvadeMode(EvadeReason why = EVADE_REASON_OTHER) override { bot_pet_ai::EnterEvadeMode(why); }\n+        void MoveInLineOfSight(Unit* u) override { bot_pet_ai::MoveInLineOfSight(u); }\n+        void JustDied(Unit* u) override { bot_pet_ai::JustDied(u); }\n+        void DoNonCombatActions(uint32 /*diff*/) { }\n+\n+        void StartAttack(Unit* u, bool force = false)\n+        {\n+            if (!bot_pet_ai::StartAttack(u, force))\n+                return;\n+            GetInPosition(force, u);\n+        }\n+\n+        void DoPetActions(uint32 /*diff*/)\n+        {\n+        }\n+\n+        void UpdateAI(uint32 diff) override\n+        {\n+            if ((liveTimer += diff) >= INFERNAL_DURATION * (IAmFree() ? 20u : 1u) - 2000u)\n+            {\n+                canUpdate = false;\n+                me->setDeathState(DeathState::JustDied);\n+                return;\n+            }\n+\n+            if (!GlobalUpdate(diff))\n+                return;\n+\n+            if (!me->IsInCombat())\n+                DoNonCombatActions(diff);\n+\n+            //CheckDrainMana(diff);\n+\n+            if (!CheckAttackTarget())\n+                return;\n+\n+            if (IsCasting())\n+                return;\n+\n+            DoPetAttack(diff);\n+        }\n+\n+        void DoPetAttack(uint32 /*diff*/)\n+        {\n+            StartAttack(opponent, IsPetMelee());\n+        }\n+\n+        void ApplyClassDamageMultiplierSpell(int32& damage, SpellNonMeleeDamage& /*damageinfo*/, SpellInfo const* spellInfo, WeaponAttackType /*attackType*/, bool /*iscrit*/) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            float fdamage = float(damage);\n+\n+            float pctbonus = 1.0f;\n+            pctbonus *= 0.5f;\n+\n+            if (baseId == IMMOLATION_DAMAGE)\n+                fdamage += me->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_MAGIC) * me->CalculateDefaultCoefficient(spellInfo, SPELL_DIRECT_DAMAGE) * me->CalculateLevelPenalty(spellInfo);\n+\n+            damage = int32(fdamage * pctbonus);\n+        }\n+\n+        void OnPetClassSpellGo(SpellInfo const* /*spellInfo*/) override\n+        {\n+        }\n+\n+        void SpellHit(Unit* wcaster, SpellInfo const* spell) override\n+        {\n+            Unit* caster = wcaster->ToUnit();\n+            if (!caster)\n+                return;\n+\n+            OnSpellHit(caster, spell);\n+        }\n+\n+        void SpellHitTarget(Unit* /*wtarget*/, SpellInfo const* /*spell*/) override\n+        {\n+        }\n+\n+        void DamageDealt(Unit* victim, uint32& damage, DamageEffectType damageType, SpellSchoolMask damageSchoolMask) override\n+        {\n+            bot_pet_ai::DamageDealt(victim, damage, damageType, damageSchoolMask);\n+        }\n+\n+        void DamageTaken(Unit* u, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellSchoolMask /*schoolMask*/) override\n+        {\n+            if (!u)\n+                return;\n+            if (!u->IsInCombat() && !me->IsInCombat())\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void OwnerAttackedBy(Unit* u) override\n+        {\n+            if (!u)\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void Reset() override\n+        {\n+            liveTimer = 0;\n+        }\n+\n+        void InitPetSpells() override\n+        {\n+        }\n+\n+        void ApplyPetPassives() const override\n+        {\n+        }\n+\n+    private:\n+        uint32 liveTimer;\n+    };\n+};\n+\n+void AddSC_dreadlord_bot_pets()\n+{\n+    new dreadlord_pet_bot();\n+}\ndiff --git a/src/server/game/AI/NpcBots/bpet_druid.cpp b/src/server/game/AI/NpcBots/bpet_druid.cpp\nnew file mode 100644\nindex 0000000000..139503e94d\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bpet_druid.cpp\n@@ -0,0 +1,146 @@\n+#include \"bot_ai.h\"\n+#include \"bpet_ai.h\"\n+#include \"ScriptMgr.h\"\n+#include \"TemporarySummon.h\"\n+/*\n+Druid NpcBot Pets (by Trickerer onlysuffering@gmail.com)\n+Complete - 100%\n+TODO:\n+*/\n+\n+enum DruidPetBaseSpells\n+{\n+};\n+\n+enum DruidPetPassives\n+{\n+};\n+\n+enum DruidPetSpecial\n+{\n+    TREANT_DURATION         = 30000\n+};\n+\n+class druid_pet_bot : public CreatureScript\n+{\n+public:\n+    druid_pet_bot() : CreatureScript(\"druid_pet_bot\") { }\n+\n+    CreatureAI* GetAI(Creature* creature) const override\n+    {\n+        return new druid_botpetAI(creature);\n+    }\n+\n+    struct druid_botpetAI : public bot_pet_ai\n+    {\n+        druid_botpetAI(Creature* creature) : bot_pet_ai(creature) { }\n+\n+        void JustEngagedWith(Unit* u) override { bot_pet_ai::JustEngagedWith(u); }\n+        void KilledUnit(Unit* u) override { bot_pet_ai::KilledUnit(u); }\n+        void EnterEvadeMode(EvadeReason why = EVADE_REASON_OTHER) override { bot_pet_ai::EnterEvadeMode(why); }\n+        void MoveInLineOfSight(Unit* u) override { bot_pet_ai::MoveInLineOfSight(u); }\n+        void JustDied(Unit* u) override { bot_pet_ai::JustDied(u); }\n+        void DoNonCombatActions(uint32 /*diff*/) { }\n+\n+        void StartAttack(Unit* u, bool force = false)\n+        {\n+            if (!bot_pet_ai::StartAttack(u, force))\n+                return;\n+            GetInPosition(force, u);\n+        }\n+\n+        void DoPetActions(uint32 /*diff*/)\n+        {\n+        }\n+\n+        void UpdateAI(uint32 diff) override\n+        {\n+            if ((liveTimer += diff) >= TREANT_DURATION)\n+            {\n+                canUpdate = false;\n+                me->ToTempSummon()->UnSummon(1ms);\n+                return;\n+            }\n+\n+            if (!GlobalUpdate(diff))\n+                return;\n+\n+            if (!me->IsInCombat())\n+                DoNonCombatActions(diff);\n+\n+            //CheckDrainMana(diff);\n+\n+            if (!CheckAttackTarget())\n+                return;\n+\n+            if (IsCasting())\n+                return;\n+\n+            DoPetAttack(diff);\n+        }\n+\n+        void DoPetAttack(uint32 /*diff*/)\n+        {\n+            StartAttack(opponent, IsPetMelee());\n+        }\n+\n+        void OnPetClassSpellGo(SpellInfo const* /*spellInfo*/) override\n+        {\n+        }\n+\n+        void SpellHit(Unit* wcaster, SpellInfo const* spell) override\n+        {\n+            Unit* caster = wcaster->ToUnit();\n+            if (!caster)\n+                return;\n+\n+            OnSpellHit(caster, spell);\n+        }\n+\n+        void SpellHitTarget(Unit* /*wtarget*/, SpellInfo const* /*spell*/) override\n+        {\n+        }\n+\n+        void DamageDealt(Unit* victim, uint32& damage, DamageEffectType damageType, SpellSchoolMask damageSchoolMask) override\n+        {\n+            bot_pet_ai::DamageDealt(victim, damage, damageType, damageSchoolMask);\n+        }\n+\n+        void DamageTaken(Unit* u, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellSchoolMask /*schoolMask*/) override\n+        {\n+            if (!u)\n+                return;\n+            if (!u->IsInCombat() && !me->IsInCombat())\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void OwnerAttackedBy(Unit* u) override\n+        {\n+            if (!u)\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void Reset() override\n+        {\n+            liveTimer = 0;\n+        }\n+\n+        void InitPetSpells() override\n+        {\n+        }\n+\n+        void ApplyPetPassives() const override\n+        {\n+        }\n+\n+    private:\n+        uint32 liveTimer;\n+    };\n+};\n+\n+void AddSC_druid_bot_pets()\n+{\n+    new druid_pet_bot();\n+}\ndiff --git a/src/server/game/AI/NpcBots/bpet_hunter.cpp b/src/server/game/AI/NpcBots/bpet_hunter.cpp\nnew file mode 100644\nindex 0000000000..3651370e82\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bpet_hunter.cpp\n@@ -0,0 +1,1000 @@\n+#include \"bot_ai.h\"\n+#include \"bpet_ai.h\"\n+#include \"CellImpl.h\"\n+#include \"GridNotifiers.h\"\n+#include \"GridNotifiersImpl.h\"\n+#include \"Map.h\"\n+#include \"ScriptMgr.h\"\n+#include \"SpellMgr.h\"\n+#include \"Player.h\"\n+/*\n+Hunter NpcBot Pets (by Trickerer onlysuffering@gmail.com)\n+Complete - 100%\n+TODO:\n+*/\n+//talent tiers 20-32-44-56-68-80\n+enum HunterPetBaseSpells\n+{\n+    //common\n+    GROWL_1                             = 2649,//1\n+    COWER_1                             = 1742,//20\n+    //semi-common\n+    //attack\n+    BITE_1                              = 17253,//1 cost 25, Bat, Boar, Carrion Bird, Chimaera, Core Hound, Crocolisk, Devilsaur, Dragonhawk, Hyena, Nether Ray, Ravager, Serpent, Wolf, Worm\n+    CLAW_1                              = 16827,//1 cost 25, Bear, Bird of Prey, Cat, Crab, Raptor, Scorpid, Silithid, Spirit Beast, Tallstrider\n+    SMACK_1                             = 49966,//1 cost 25, Gorilla, Sporebat, Moth, Rhino, Wasp\n+    //movement\n+    //charge\n+    SWOOP_1                             = 52825,//44 cost 35 Carrion Bird, Wasp, Teromoth\n+    CHARGE_1                            = 61685,//20/44 cost 35 Bear, Boar, Cat, Core Hound, Crab, Crocolisk, Devilsaur, Gorilla, Hyena, Raptor, Rhino, Scorpid, Spirit Beast, Tallstrider, Turtle, Warp Stalker, Wolf, Worm\n+    //sprint\n+    DASH_1                              = 61684,//20/44 cost 30 Cat, Core Hound, Devilsaur, Hyena, Raptor, Ravager, Serpent, Silithid, Spider, Spirit Beast, Tallstrider, Warp Stalker, Wolf\n+    DIVE_1                              = 23145,//20 cost 30 Bat, Bird of Prey, Carrion Bird, Chimaera, Dragonhawk, Moth, Nether Ray, Sporebat, Wasp, Wind Serpent\n+    //talents cunning\n+    CARRION_FEEDER_1                    = 54045,//44 triggered spell\n+    WOLVERINE_BITE_1                    = 53508,//68 after crit (any time for bot)\n+    ROAR_OF_RECOVERY_1                  = 53517,//68 mana regen\n+    BULLHEADED_1                        = 53490,//68 movement imparing remove\n+    //talents ferocity\n+    //HEART_OF_THE_PHOENIX_1              = 55709,\n+    RABID_1                             = 53401,//68 attack increase proc\n+    LICK_YOUR_WOUNDS_1                  = 53426,//68 full heal over 5, channeled\n+    CALL_OF_THE_WILD_1                  = 53434,//68 10% AP for pet and hunter\n+    //talents tenacity\n+    THUNDERSTOMP_1                      = 63900,//44\n+    LAST_STAND_1                        = 53478,//68 30%\n+    TAUNT_1                             = 53477,//68 3 min cd 126 sec improved\n+    ROAR_OF_SACRIFICE_1                 = 53480,//68\n+    INTERVENE_1                         = 53476,//68\n+    //pet-specific\n+    //cunning\n+    SONIC_BLAST_1                       = 50519,//bat c80 dmg/stun 20y cd60\n+    SNATCH_1                            = 50541,//birdop c20 dmg/disarm 5y cd60\n+    FROSTSTORM_BREATH_1                 = 54644,//chimera c20 dmg/slow 30y cd10\n+    FIRE_BREATH_1                       = 34889,//dhawk c20 dmg/dot 20y cd10\n+    NETHER_SHOCK_1                      = 50479,//nray c20 dmg/interrupt 20y cd40\n+    RAVAGE_1                            = 50518,//ravager c0 (bug?) dmg/stun 5y cd40\n+    POISON_SPIT_1                       = 35387,//serpent c20 dot/slowcast 30y cd10\n+    VENOM_WEB_SPRAY_1                   = 54706,//silithid c0 dot/root 30y cd40\n+    WEB_1                               = 4167,//spider c0 root 30y cd40\n+    SPORE_CLOUD_1                       = 50274,//sporebat c20 aoedot/-armorpct 6yd cd10\n+    LIGHTNING_BREATH_1                  = 24844,//wserpent c20 dmg 20y cd10\n+    //ferocity\n+    DEMORALIZING_SCREECH_1              = 24423,//cbird c20 dmg/aoe-ap 5y cd10\n+    PROWL_1                             = 24450,//cat,spbeast c0 stealth 0y cd10\n+    LAVA_BREATH_1                       = 58604,//chound c20 dmg/slowcast 30y cd10\n+    MONSTROUS_BITE_1                    = 54680,//dsaur c20 dmg/buff 5y cd10\n+    TENDON_RIP_1                        = 50271,//hyena c20 dmg/snare 5y cd20\n+    SERENITY_DUST_1                     = 50318,//tmoth c0 hot/buff+ap 0y cd60\n+    SAVAGE_REND_1                       = 50498,//raptor c20 dmg/dot 5y cd60\n+    SPIRIT_STRIKE_1                     = 61193,//spbeast c20 dmg/dot 30y cd10\n+    DUST_CLOUD_1                        = 50285,//tstrider c20 aoe-100hit 10y cd40 lvl6\n+    STING_1                             = 56626,//wasp c20 dmg/-5%armor 5y cd6\n+    FURIOUS_HOWL_1                      = 24604,//wolf c20 buff+ap 100y cd40\n+    //tenacity\n+    SWIPE_1                             = 50256,//bear c20 dmg 5y cd5\n+    GORE_1                              = 35290,//boar c20 dmg 5y cd10\n+    PIN_1                               = 50245,//crab c0 root/dot 5y cd40\n+    PUMMEL_1                            = 26090,//gorilla c20 interrupt 5y cd30\n+    STAMPEDE_1                          = 57386,//rhino c0 dmg/debuff+bleed 5y cd60\n+    SCORPID_POISON_1                    = 24640,//scorpid c20 threat/dot 5y cd10\n+    SHELL_SHIELD_1                      = 26064,//turtle c0 buff%dmgtaken 0y cd60\n+    WARP_1                              = 35346,//wstalker c0 tp/buff50%avoid 30y cd15\n+    ACID_SPIT_1                         = 55749,//worm c20 dmg/debuff-10%armor 30y cd10\n+\n+    //from hunter's talents\n+    SPIRIT_BOND_PET                     = 24529,\n+    KINDRED_SPIRITS_PET                 = 57475,\n+    INTIMIDATION_1                      = 24394,\n+    BESTIAL_WRATH_1                     = 19574,\n+    BEAST_WITHIN_1                      = 34471\n+};\n+\n+enum HunterPetPassives\n+{\n+    //common\n+    AVOIDANCE                           = 65220,\n+    //pet talents\n+    COBRA_REFLEXES                      = 61683,//rank 2\n+    //BOARS_SPEED                         = 19596,\n+    BLOOD_OF_THE_RHINO                  = 53482,//rank 2\n+    OWLS_FOCUS                          = 53516,//rank 2\n+    CULLING_THE_HERD                    = 52858,//rank 3\n+    GRACE_OF_THE_MANTIS                 = 53451,//rank 2\n+    CORNERED                            = 53497,//rank 2\n+    FEEDING_FRENZY                      = 53512,//rank 2\n+    SILVERBACK                          = 62765,//rank 2\n+    //special\n+    //Catlike Reflexes and Serpent's Swiftness replacement\n+    HASTE_DODGE_PASSIVE                 = 13789,//Lightning Reflexes rank 3 6 dodge 10 haste\n+};\n+\n+enum HunterPetSpecial\n+{\n+    PET_CATEGORY_CUNNING                = 1,\n+    PET_CATEGORY_FEROCITY               = 2,\n+    PET_CATEGORY_TENACITY               = 3,\n+\n+    GO_FOR_THE_THROAT_ENERGIZE          = 34953,\n+    FRENZY_BUFF                         = 19615,\n+    //HEART_OF_THE_PHOENIX_TRIGGERED      = 54114,//resurrect pet effect\n+    //HEART_OF_THE_PHOENIX_DEBUFF         = 55711 //Weakened Heart dummy eff 0 icon 2787\n+};\n+\n+class hunter_pet_bot : public CreatureScript\n+{\n+public:\n+    hunter_pet_bot() : CreatureScript(\"hunter_pet_bot\") { }\n+\n+    CreatureAI* GetAI(Creature* creature) const override\n+    {\n+        return new hunter_botpetAI(creature);\n+    }\n+\n+    struct hunter_botpetAI : public bot_pet_ai\n+    {\n+        hunter_botpetAI(Creature* creature) : bot_pet_ai(creature) { }\n+\n+        void JustEngagedWith(Unit* u) override { bot_pet_ai::JustEngagedWith(u); }\n+        void KilledUnit(Unit* u) override { bot_pet_ai::KilledUnit(u); }\n+        void EnterEvadeMode(EvadeReason why = EVADE_REASON_OTHER) override { bot_pet_ai::EnterEvadeMode(why); }\n+        void MoveInLineOfSight(Unit* u) override { bot_pet_ai::MoveInLineOfSight(u); }\n+        void JustDied(Unit* u) override { bot_pet_ai::JustDied(u); }\n+        void DoNonCombatActions(uint32 /*diff*/) { }\n+\n+        void StartAttack(Unit* u, bool force = false)\n+        {\n+            if (!bot_pet_ai::StartAttack(u, force))\n+                return;\n+            GetInPosition(force, u);\n+        }\n+\n+        void DoPetActions(uint32 diff)\n+        {\n+            if (GetSpell(SPIRIT_BOND_PET) && IsSpellReady(SPIRIT_BOND_PET, diff, false) &&\n+                !petOwner->GetAuraEffect(SPELL_AURA_MOD_HEALING_PCT, SPELLFAMILY_GENERIC, 960, 1))\n+            {\n+                me->CastSpell(me, SPIRIT_BOND_PET, true);\n+                SetSpellCooldown(SPIRIT_BOND_PET, uint32(-1));\n+            }\n+            if (GetSpell(KINDRED_SPIRITS_PET) && IsSpellReady(KINDRED_SPIRITS_PET, diff, false) &&\n+                !petOwner->GetAuraEffect(SPELL_AURA_MOD_INCREASE_SPEED, SPELLFAMILY_GENERIC, 3559, 0))\n+            {\n+                me->CastSpell(me, KINDRED_SPIRITS_PET, true);\n+                SetSpellCooldown(KINDRED_SPIRITS_PET, uint32(-1));\n+            }\n+\n+            //Ignoring pet category\n+\n+            if (IsSpellReady(CARRION_FEEDER_1, diff, false) && !me->isMoving() && GetHealthPCT(me) <= 80 &&\n+                !me->IsInCombat() && !me->GetVictim() && me->getAttackers().empty() &&\n+                !me->HasAuraType(SPELL_AURA_PERIODIC_DAMAGE) && Rand() < 20)\n+            {\n+                WorldObject* result = nullptr;\n+                Bcore::AnyDeadUnitSpellTargetInRangeCheck check(me, 5.f, sSpellMgr->GetSpellInfo(CARRION_FEEDER_1), TARGET_CHECK_ENEMY);\n+                Bcore::WorldObjectSearcher<Bcore::AnyDeadUnitSpellTargetInRangeCheck> searcher(me, result, check);\n+                Cell::VisitObjects(me, searcher, 5.f);\n+\n+                if (result)\n+                {\n+                    me->CastSpell(me, GetSpell(CARRION_FEEDER_1), false);\n+                    SetSpellCooldown(CARRION_FEEDER_1, 21000);\n+                    return;\n+                }\n+            }\n+\n+            if (IsSpellReady(LICK_YOUR_WOUNDS_1, diff, false) && !me->isMoving() && !me->GetVictim() &&\n+                me->getAttackers().empty() && GetHealthPCT(me) <= 50 + 30 * me->IsInCombat() &&\n+                !me->HasAuraType(SPELL_AURA_PERIODIC_DAMAGE) && Rand() < 40)\n+            {\n+                me->CastSpell(me, GetSpell(LICK_YOUR_WOUNDS_1), false);\n+                SetSpellCooldown(LICK_YOUR_WOUNDS_1, 126000);\n+                return;\n+            }\n+\n+            if (IsSpellReady(ROAR_OF_RECOVERY_1, diff, false) && petOwner->IsInCombat() && opponent &&\n+                GetManaPCT(petOwner) < 65 && petOwner->GetDistance(me) < 40)\n+            {\n+                me->CastSpell(me, GetSpell(ROAR_OF_RECOVERY_1), false);\n+                SetSpellCooldown(ROAR_OF_RECOVERY_1, 126000);\n+                return;\n+            }\n+\n+            if (IsSpellReady(INTERVENE_1, diff, false) && GetHealthPCT(petOwner) < 95 && !petOwner->getAttackers().empty() &&\n+                me->getAttackers().size() <= petOwner->getAttackers().size())\n+            {\n+                float petdist = me->GetDistance(petOwner);\n+                if (petdist < 25 && petdist > 8)\n+                {\n+                    me->CastSpell(petOwner, GetSpell(INTERVENE_1), false);\n+                    SetSpellCooldown(INTERVENE_1, 21000);\n+                    return;\n+                }\n+            }\n+        }\n+\n+        void UpdateAI(uint32 diff) override\n+        {\n+            if (!GlobalUpdate(diff))\n+                return;\n+\n+            if (!me->IsInCombat())\n+                DoNonCombatActions(diff);\n+\n+            DoPetActions(diff);\n+            //CheckDrainMana(diff);\n+\n+            if (!CheckAttackTarget())\n+                return;\n+\n+            if (IsCasting())\n+                return;\n+\n+            DoPetAttack(diff);\n+        }\n+\n+        void DoPetAttack(uint32 diff)\n+        {\n+            StartAttack(opponent, IsPetMelee());\n+\n+            Unit const* u = opponent->GetVictim();\n+            float dist = me->GetDistance(opponent);\n+            uint32 focus = me->GetPower(POWER_FOCUS);\n+            bool canDPS = petOwner->GetBotAI()->HasRole(BOT_ROLE_DPS);\n+\n+            //improved + Longevity applied to cds\n+\n+            if (IsSpellReady(BESTIAL_WRATH_1, diff, false) && canDPS && dist < 10 &&\n+                (opponent->GetHealth() > petOwner->GetMaxHealth()/4 * (1 + opponent->getAttackers().size()) ||\n+                opponent->IsPlayer()))\n+            {\n+                if (petOwner->AddAura(GetSpell(BESTIAL_WRATH_1), me))\n+                {\n+                    if (GetSpell(BEAST_WITHIN_1))\n+                        petOwner->AddAura(GetSpell(BEAST_WITHIN_1), petOwner);\n+\n+                    SetSpellCooldown(BESTIAL_WRATH_1, 70000);\n+                    return;\n+                }\n+            }\n+\n+            //LAST STAND\n+            if (IsSpellReady(LAST_STAND_1, diff, false) &&\n+                GetHealthPCT(me) < (30 + 20 * (opponent->getAttackers().size() > 1) + 10 * me->HasAuraType(SPELL_AURA_PERIODIC_DAMAGE)))\n+            {\n+                me->CastSpell(me, GetSpell(LAST_STAND_1), false);\n+                SetSpellCooldown(LAST_STAND_1, 252000);\n+            }\n+\n+            if (IsSpellReady(INTIMIDATION_1, diff, false) && !CCed(opponent) && me->IsWithinMeleeRange(opponent))\n+            {\n+                me->CastSpell(opponent, GetSpell(INTIMIDATION_1), false);\n+                SetSpellCooldown(INTIMIDATION_1, 60000);\n+                return;\n+            }\n+\n+            if (IsSpellReady(GROWL_1, diff, false) && u && u != me && focus >= 15 && me->IsWithinMeleeRange(opponent) &&\n+                opponent->CanHaveThreatList() && !CCed(opponent) && !opponent->HasAuraType(SPELL_AURA_MOD_TAUNT) &&\n+                (!IsTank(u) || (GetHealthPCT(u) < 30 && GetHealthPCT(me) > 50)) && IsInBotParty(u))\n+            {\n+                me->CastSpell(opponent, GetSpell(GROWL_1), false);\n+                SetSpellCooldown(GROWL_1, 3500);\n+                return;\n+            }\n+\n+            if (IsSpellReady(TAUNT_1, diff, false) && u && u != me && me->IsWithinMeleeRange(opponent) &&\n+                opponent->CanHaveThreatList() && !CCed(opponent) && !opponent->HasAuraType(SPELL_AURA_MOD_TAUNT) &&\n+                (!IsTank(u) || (GetHealthPCT(u) < 30 && GetHealthPCT(me) > 50)) && IsInBotParty(u))\n+            {\n+                me->CastSpell(opponent, GetSpell(TAUNT_1), false);\n+                SetSpellCooldown(TAUNT_1, 126000);\n+                return;\n+            }\n+\n+            if (IsSpellReady(COWER_1, diff, false) && !me->getAttackers().empty() &&\n+                me->GetDistance(*me->getAttackers().begin()) < 7 && GetHealthPCT(me) < 90)\n+            {\n+                me->CastSpell(me, GetSpell(COWER_1), false);\n+                SetSpellCooldown(COWER_1, 31500);\n+                return;\n+            }\n+\n+            if (IsSpellReady(BULLHEADED_1, diff, false) && GetHealthPCT(me) < 90 &&\n+                ((!me->getAttackers().empty() && me->GetDistance(*me->getAttackers().begin()) < 7) ||\n+                (dist > 3 && !opponent->HasInArc(float(M_PI)/2, me) &&\n+                (CCed(me, true) || me->HasAuraWithMechanic(1u<<MECHANIC_SNARE)))))\n+            {\n+                me->CastSpell(me, GetSpell(BULLHEADED_1), false);\n+                SetSpellCooldown(BULLHEADED_1, 31500);\n+                return;\n+            }\n+\n+            uint32 SPRINT = IsPetTypeSpell(DASH_1) ? DASH_1 : IsPetTypeSpell(DIVE_1) ? DIVE_1 : 0;\n+            if (SPRINT && GetSpell(SPRINT) && IsSpellReady(SPRINT, diff, false) && dist > 10 && dist < 30 &&\n+                !HasBotCommandState(BOT_COMMAND_STAY))\n+            {\n+                me->CastSpell(opponent, GetSpell(SPRINT), false);\n+                SetSpellCooldown(SPRINT, 17500);\n+                return;\n+            }\n+\n+            if (IsSpellReady(CALL_OF_THE_WILD_1, diff, false) && canDPS && dist < 10)\n+            {\n+                me->CastSpell(me, GetSpell(CALL_OF_THE_WILD_1), false);\n+                SetSpellCooldown(CALL_OF_THE_WILD_1, 210000);\n+                return;\n+            }\n+\n+            if (IsSpellReady(RABID_1, diff, false) && canDPS && dist < 10)\n+            {\n+                me->CastSpell(me, GetSpell(RABID_1), false);\n+                SetSpellCooldown(RABID_1, 31500);\n+                return;\n+            }\n+\n+            if (IsSpellReady(THUNDERSTOMP_1, diff, false) && canDPS && focus >= 20 &&\n+                me->IsWithinMeleeRange(opponent) && me->getAttackers().size() > 1)\n+            {\n+                me->CastSpell(opponent, GetSpell(THUNDERSTOMP_1), false);\n+                SetSpellCooldown(THUNDERSTOMP_1, 7000);\n+                return;\n+            }\n+\n+            if (myType == BOT_PET_BAT)\n+            {\n+                if (IsSpellReady(SONIC_BLAST_1, diff, false) && canDPS && focus >= 80 &&\n+                    dist < 20 && opponent->IsNonMeleeSpellCast(false, false, true))\n+                {\n+                    me->CastSpell(opponent, GetSpell(SONIC_BLAST_1), false);\n+                    SetSpellCooldown(SONIC_BLAST_1, 42000);\n+                    return;\n+                }\n+            }\n+            else if (myType == BOT_PET_BIRDOFPREY)\n+            {\n+                if (IsSpellReady(SNATCH_1, diff, false) && canDPS && focus >= 20 &&\n+                    me->IsWithinMeleeRange(opponent) && !opponent->HasAuraType(SPELL_AURA_MOD_DISARM) &&\n+                    ((opponent->IsPlayer()) ? opponent->ToPlayer()->GetWeaponForAttack(BASE_ATTACK) != nullptr :\n+                    opponent->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID) != 0))\n+                {\n+                    me->CastSpell(opponent, GetSpell(SNATCH_1), false);\n+                    SetSpellCooldown(SNATCH_1, 42000);\n+                    return;\n+                }\n+            }\n+            else if (myType == BOT_PET_CHIMAERA)\n+            {\n+                if (IsSpellReady(FROSTSTORM_BREATH_1, diff, false) && canDPS && focus >= 20 && dist < 30)\n+                {\n+                    me->CastSpell(opponent, GetSpell(FROSTSTORM_BREATH_1), false);\n+                    SetSpellCooldown(FROSTSTORM_BREATH_1, 7000);\n+                    return;\n+                }\n+            }\n+            else if (myType == BOT_PET_DRAGONHAWK)\n+            {\n+                if (IsSpellReady(FIRE_BREATH_1, diff, false) && canDPS && focus >= 20 && dist < 20)\n+                {\n+                    me->CastSpell(opponent, GetSpell(FIRE_BREATH_1), false);\n+                    SetSpellCooldown(FIRE_BREATH_1, 7000);\n+                    return;\n+                }\n+            }\n+            else if (myType == BOT_PET_NETHERRAY)\n+            {\n+                if (IsSpellReady(NETHER_SHOCK_1, diff, false) && canDPS && focus >= 20 && dist < 20 &&\n+                    opponent->IsNonMeleeSpellCast(false, false, true))\n+                {\n+                    me->CastSpell(opponent, GetSpell(NETHER_SHOCK_1), false);\n+                    SetSpellCooldown(NETHER_SHOCK_1, 28000);\n+                    return;\n+                }\n+            }\n+            else if (myType == BOT_PET_RAVAGER)\n+            {\n+                if (IsSpellReady(RAVAGE_1, diff, false) && canDPS/* && focus >= 0*/ &&\n+                    me->IsWithinMeleeRange(opponent) && opponent->IsNonMeleeSpellCast(false, false, true))\n+                {\n+                    me->CastSpell(opponent, GetSpell(RAVAGE_1), false);\n+                    SetSpellCooldown(RAVAGE_1, 28000);\n+                    return;\n+                }\n+            }\n+            else if (myType == BOT_PET_SERPENT)\n+            {\n+                if (IsSpellReady(POISON_SPIT_1, diff, false) && canDPS && focus >= 20 && dist < 30)\n+                {\n+                    me->CastSpell(opponent, GetSpell(POISON_SPIT_1), false);\n+                    SetSpellCooldown(POISON_SPIT_1, 7000);\n+                    return;\n+                }\n+            }\n+            else if (myType == BOT_PET_SILITHID)\n+            {\n+                if (IsSpellReady(VENOM_WEB_SPRAY_1, diff, false) && canDPS/* && focus >= 0*/ && dist < 30 &&\n+                    !CCed(opponent, true))\n+                {\n+                    me->CastSpell(opponent, GetSpell(VENOM_WEB_SPRAY_1), false);\n+                    SetSpellCooldown(VENOM_WEB_SPRAY_1, 28000);\n+                    return;\n+                }\n+            }\n+            else if (myType == BOT_PET_SPIDER)\n+            {\n+                if (IsSpellReady(WEB_1, diff, false)/* && focus >= 0*/ && dist < 30 && !CCed(opponent, true))\n+                {\n+                    me->CastSpell(opponent, GetSpell(WEB_1), false);\n+                    SetSpellCooldown(WEB_1, 28000);\n+                    return;\n+                }\n+            }\n+            else if (myType == BOT_PET_SPOREBAT)\n+            {\n+                if (IsSpellReady(SPORE_CLOUD_1, diff, false) && canDPS && focus >= 20 && dist < 5)\n+                {\n+                    me->CastSpell(opponent, GetSpell(SPORE_CLOUD_1), false);\n+                    SetSpellCooldown(SPORE_CLOUD_1, 7000);\n+                    return;\n+                }\n+            }\n+            else if (myType == BOT_PET_WINDSERPENT)\n+            {\n+                if (IsSpellReady(LIGHTNING_BREATH_1, diff, false) && canDPS && focus >= 20 && dist < 20)\n+                {\n+                    me->CastSpell(opponent, GetSpell(LIGHTNING_BREATH_1), false);\n+                    SetSpellCooldown(LIGHTNING_BREATH_1, 7000);\n+                    return;\n+                }\n+            }\n+            else if (myType == BOT_PET_CARRIONBIRD)\n+            {\n+                if (IsSpellReady(DEMORALIZING_SCREECH_1, diff, false) && canDPS && focus >= 20 &&\n+                    me->IsWithinMeleeRange(opponent))\n+                {\n+                    me->CastSpell(opponent, GetSpell(DEMORALIZING_SCREECH_1), false);\n+                    SetSpellCooldown(DEMORALIZING_SCREECH_1, 7000);\n+                    return;\n+                }\n+            }\n+            else if (myType == BOT_PET_CAT)\n+            {\n+                if (IsSpellReady(PROWL_1, diff, false) && !me->IsInCombat() && !me->HasStealthAura() &&\n+                    /*focus >= 0 && */dist < 20 && dist > 5)\n+                {\n+                    me->CastSpell(opponent, GetSpell(PROWL_1), false);\n+                    SetSpellCooldown(PROWL_1, 7000);\n+                    return;\n+                }\n+            }\n+            else if (myType == BOT_PET_COREHOUND)\n+            {\n+                if (IsSpellReady(LAVA_BREATH_1, diff, false) && canDPS && focus >= 20 && dist < 30)\n+                {\n+                    me->CastSpell(opponent, GetSpell(LAVA_BREATH_1), false);\n+                    SetSpellCooldown(LAVA_BREATH_1, 7000);\n+                    return;\n+                }\n+            }\n+            else if (myType == BOT_PET_DEVILSAUR)\n+            {\n+                if (IsSpellReady(MONSTROUS_BITE_1, diff, false) && canDPS && focus >= 20 &&\n+                    me->IsWithinMeleeRange(opponent))\n+                {\n+                    me->CastSpell(opponent, GetSpell(MONSTROUS_BITE_1), false);\n+                    SetSpellCooldown(MONSTROUS_BITE_1, 7000);\n+                    return;\n+                }\n+            }\n+            else if (myType == BOT_PET_HYENA)\n+            {\n+                if (IsSpellReady(TENDON_RIP_1, diff, false) && canDPS && focus >= 20 &&\n+                    me->IsWithinMeleeRange(opponent))\n+                {\n+                    me->CastSpell(opponent, GetSpell(TENDON_RIP_1), false);\n+                    SetSpellCooldown(TENDON_RIP_1, 14000);\n+                    return;\n+                }\n+            }\n+            else if (myType == BOT_PET_TEROMOTH)\n+            {\n+                if (IsSpellReady(SERENITY_DUST_1, diff, false) && (canDPS || GetHealthPCT(me) < 90) &&\n+                    /*focus >= 0 && */dist < 7)\n+                {\n+                    me->CastSpell(me, GetSpell(SERENITY_DUST_1), false);\n+                    SetSpellCooldown(SERENITY_DUST_1, 42000);\n+                    return;\n+                }\n+            }\n+            else if (myType == BOT_PET_RAPTOR)\n+            {\n+                if (IsSpellReady(SAVAGE_REND_1, diff, false) && canDPS && focus >= 20 &&\n+                    me->IsWithinMeleeRange(opponent))\n+                {\n+                    me->CastSpell(opponent, GetSpell(SAVAGE_REND_1), false);\n+                    SetSpellCooldown(SAVAGE_REND_1, 42000);\n+                    return;\n+                }\n+            }\n+            else if (myType == BOT_PET_SPIRITBEAST)\n+            {\n+                if (IsSpellReady(PROWL_1, diff, false) && !me->IsInCombat() && !me->HasStealthAura() &&\n+                    /*focus >= 0 && */dist < 30 && dist > 5)\n+                {\n+                    me->CastSpell(opponent, GetSpell(PROWL_1), false);\n+                    SetSpellCooldown(PROWL_1, 10000); //custom\n+                    return;\n+                }\n+                if (IsSpellReady(SPIRIT_STRIKE_1, diff, false) && canDPS && !me->HasStealthAura() &&\n+                    focus >= 20 && dist < 30)\n+                {\n+                    me->CastSpell(opponent, GetSpell(SPIRIT_STRIKE_1), false);\n+                    SetSpellCooldown(SPIRIT_STRIKE_1, 7000);\n+                    return;\n+                }\n+            }\n+            else if (myType == BOT_PET_TALLSTRIDER)\n+            {\n+                if (IsSpellReady(DUST_CLOUD_1, diff, false) && focus >= 20 && me->IsWithinMeleeRange(opponent))\n+                {\n+                    me->CastSpell(opponent, GetSpell(DUST_CLOUD_1), false);\n+                    SetSpellCooldown(DUST_CLOUD_1, 28000);\n+                    return;\n+                }\n+            }\n+            else if (myType == BOT_PET_WASP)\n+            {\n+                if (IsSpellReady(STING_1, diff, false) && canDPS && focus >= 20 &&\n+                    me->IsWithinMeleeRange(opponent))\n+                {\n+                    me->CastSpell(opponent, GetSpell(STING_1), false);\n+                    SetSpellCooldown(STING_1, 4000);\n+                    return;\n+                }\n+            }\n+            else if (myType == BOT_PET_WOLF)\n+            {\n+                if (IsSpellReady(FURIOUS_HOWL_1, diff, false) && canDPS && focus >= 20)\n+                {\n+                    me->CastSpell(me, GetSpell(FURIOUS_HOWL_1), false);\n+                    SetSpellCooldown(FURIOUS_HOWL_1, 28000);\n+                    return;\n+                }\n+            }\n+            else if (myType == BOT_PET_BEAR)\n+            {\n+                if (IsSpellReady(SWIPE_1, diff, false) && canDPS && focus >= 20 &&\n+                    me->IsWithinMeleeRange(opponent))\n+                {\n+                    me->CastSpell(opponent, GetSpell(SWIPE_1), false);\n+                    SetSpellCooldown(SWIPE_1, 3500);\n+                    return;\n+                }\n+            }\n+            else if (myType == BOT_PET_BOAR)\n+            {\n+                if (IsSpellReady(GORE_1, diff, false) && canDPS && focus >= 20 &&\n+                    me->IsWithinMeleeRange(opponent))\n+                {\n+                    me->CastSpell(opponent, GetSpell(GORE_1), false);\n+                    SetSpellCooldown(GORE_1, 7000);\n+                    return;\n+                }\n+            }\n+            else if (myType == BOT_PET_CRAB)\n+            {\n+                if (IsSpellReady(PIN_1, diff, false) && canDPS/* && focus >= 0*/ &&\n+                    me->IsWithinMeleeRange(opponent) && !CCed(opponent, true))\n+                {\n+                    me->CastSpell(opponent, GetSpell(PIN_1), false);\n+                    SetSpellCooldown(PIN_1, 28000);\n+                    return;\n+                }\n+            }\n+            else if (myType == BOT_PET_GORILLA)\n+            {\n+                if (IsSpellReady(PUMMEL_1, diff, false) && focus >= 20 && me->IsWithinMeleeRange(opponent) &&\n+                    opponent->IsNonMeleeSpellCast(false,false,true))\n+                {\n+                    me->CastSpell(opponent, GetSpell(PUMMEL_1), false);\n+                    SetSpellCooldown(PUMMEL_1, 21000);\n+                    return;\n+                }\n+            }\n+            else if (myType == BOT_PET_RHINO)\n+            {\n+                if (IsSpellReady(STAMPEDE_1, diff, false) && canDPS/* && focus >= 0*/ &&\n+                    me->IsWithinMeleeRange(opponent))\n+                {\n+                    me->CastSpell(opponent, GetSpell(STAMPEDE_1), false);\n+                    SetSpellCooldown(STAMPEDE_1, 42000);\n+                    return;\n+                }\n+            }\n+            else if (myType == BOT_PET_SCORPID)\n+            {\n+                if (IsSpellReady(SCORPID_POISON_1, diff, false) && canDPS && focus >= 20 &&\n+                    me->IsWithinMeleeRange(opponent))\n+                {\n+                    me->CastSpell(opponent, GetSpell(SCORPID_POISON_1), false);\n+                    SetSpellCooldown(SCORPID_POISON_1, 7000);\n+                    return;\n+                }\n+            }\n+            else if (myType == BOT_PET_TURTLE)\n+            {\n+                if (IsSpellReady(SHELL_SHIELD_1, diff, false)/* && focus >= 0*/ && dist < 7 &&\n+                    !me->getAttackers().empty())\n+                {\n+                    me->CastSpell(me, GetSpell(SHELL_SHIELD_1), false);\n+                    SetSpellCooldown(SHELL_SHIELD_1, 42000);\n+                    return;\n+                }\n+            }\n+            else if (myType == BOT_PET_WARPSTALKER)\n+            {\n+                if (IsSpellReady(WARP_1, diff, false)/* && focus >= 0*/ && dist < 10)\n+                {\n+                    me->CastSpell(opponent, GetSpell(WARP_1), false);\n+                    SetSpellCooldown(WARP_1, 10500);\n+                    return;\n+                }\n+            }\n+            else if (myType == BOT_PET_WORM)\n+            {\n+                if (IsSpellReady(ACID_SPIT_1, diff, false) && canDPS && focus >= 20 && dist < 30)\n+                {\n+                    me->CastSpell(opponent, GetSpell(ACID_SPIT_1), false);\n+                    SetSpellCooldown(ACID_SPIT_1, 7000);\n+                    return;\n+                }\n+            }\n+\n+            uint32 CHARGE = IsPetTypeSpell(SWOOP_1) ? SWOOP_1 : IsPetTypeSpell(CHARGE_1) ? CHARGE_1 : 0;\n+            if (CHARGE && GetSpell(CHARGE) && IsSpellReady(CHARGE, diff, false) && !CCed(opponent, true) && !me->HasStealthAura() &&\n+                !(opponent->IsCreature() && opponent->ToCreature()->isWorldBoss()) &&\n+                !HasBotCommandState(BOT_COMMAND_STAY) &&\n+                dist > 8 && dist < 25)\n+            {\n+                me->CastSpell(opponent, GetSpell(CHARGE), false);\n+                SetSpellCooldown(CHARGE, 17500);\n+                return;\n+            }\n+\n+            if (GetSpell(WOLVERINE_BITE_1) && canDPS && me->IsWithinMeleeRange(opponent))\n+            {\n+                me->CastSpell(opponent, GetSpell(WOLVERINE_BITE_1), false);\n+                SetSpellCooldown(WOLVERINE_BITE_1, 7000);\n+                return;\n+            }\n+\n+            uint32 ATTACK_1 = IsPetTypeSpell(BITE_1) ? BITE_1 : IsPetTypeSpell(CLAW_1) ? CLAW_1 : SMACK_1;\n+            if (GetSpell(ATTACK_1) && IsSpellReady(ATTACK_1, diff) && canDPS && focus >= 25 && me->IsWithinMeleeRange(opponent))\n+            {\n+                me->CastSpell(opponent, GetSpell(ATTACK_1), false);\n+                return;\n+            }\n+        }\n+\n+        void OnPetClassSpellGo(SpellInfo const* /*spellInfo*/) override\n+        {\n+        }\n+\n+        void SpellHit(Unit* wcaster, SpellInfo const* spell) override\n+        {\n+            Unit* caster = wcaster->ToUnit();\n+            if (!caster)\n+                return;\n+\n+            OnSpellHit(caster, spell);\n+        }\n+\n+        void SpellHitTarget(Unit* /*wtarget*/, SpellInfo const* /*spell*/) override\n+        {\n+        }\n+\n+        void DamageDealt(Unit* victim, uint32& damage, DamageEffectType damageType, SpellSchoolMask damageSchoolMask) override\n+        {\n+            bot_pet_ai::DamageDealt(victim, damage, damageType, damageSchoolMask);\n+        }\n+\n+        void DamageTaken(Unit* u, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellSchoolMask /*schoolMask*/) override\n+        {\n+            if (!u)\n+                return;\n+            if (!u->IsInCombat() && !me->IsInCombat())\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void OwnerAttackedBy(Unit* u) override\n+        {\n+            if (!u)\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void Reset() override\n+        {\n+        }\n+\n+        void InitPetSpells() override\n+        {\n+            uint8 lvl = me->GetLevel();\n+            bool isBeas = Spec() == BOT_SPEC_HUNTER_BEASTMASTERY;\n+\n+            InitSpellMap(GROWL_1);\n+            InitSpellMap(COWER_1);\n+\n+            InitSpellMap(BITE_1);\n+            InitSpellMap(CLAW_1);\n+            InitSpellMap(SMACK_1);\n+\n+            //talents\n+  /*Talent*/IsPetTypeSpell(SWOOP_1) ? InitSpellMap(SWOOP_1, true) : RemoveSpell(SWOOP_1);\n+  /*Talent*/IsPetTypeSpell(CHARGE_1) ? InitSpellMap(CHARGE_1, true) : RemoveSpell(CHARGE_1);\n+  /*Talent*/IsPetTypeSpell(DASH_1) ? InitSpellMap(DASH_1, true) : RemoveSpell(DASH_1);\n+  /*Talent*/IsPetTypeSpell(DIVE_1) ? InitSpellMap(DIVE_1, true) : RemoveSpell(DIVE_1);\n+            //talents cunning\n+  /*Talent*/lvl >= 44 ? InitSpellMap(CARRION_FEEDER_1, true) : RemoveSpell(CARRION_FEEDER_1);\n+  /*Talent*/lvl >= 68 ? InitSpellMap(WOLVERINE_BITE_1, true) : RemoveSpell(WOLVERINE_BITE_1);\n+  /*Talent*/lvl >= 68 ? InitSpellMap(ROAR_OF_RECOVERY_1, true) : RemoveSpell(ROAR_OF_RECOVERY_1);\n+  /*Talent*/lvl >= 68 ? InitSpellMap(BULLHEADED_1, true) : RemoveSpell(BULLHEADED_1);\n+            //talents ferocity\n+  ///*Talent*/lvl >= 68 ? InitSpellMap(HEART_OF_THE_PHOENIX_1, true) : RemoveSpell(HEART_OF_THE_PHOENIX_1);\n+  /*Talent*/lvl >= 68 ? InitSpellMap(RABID_1, true) : RemoveSpell(RABID_1);\n+  /*Talent*/lvl >= 68 ? InitSpellMap(LICK_YOUR_WOUNDS_1, true) : RemoveSpell(LICK_YOUR_WOUNDS_1);\n+  /*Talent*/lvl >= 68 ? InitSpellMap(CALL_OF_THE_WILD_1, true) : RemoveSpell(CALL_OF_THE_WILD_1);\n+            //talents tenacity\n+  /*Talent*/lvl >= 44 ? InitSpellMap(THUNDERSTOMP_1, true) : RemoveSpell(THUNDERSTOMP_1);\n+  /*Talent*/lvl >= 68 ? InitSpellMap(LAST_STAND_1, true) : RemoveSpell(LAST_STAND_1);\n+  /*Talent*/lvl >= 68 ? InitSpellMap(TAUNT_1, true) : RemoveSpell(TAUNT_1);\n+  /*Talent*/lvl >= 68 ? InitSpellMap(ROAR_OF_SACRIFICE_1, true) : RemoveSpell(ROAR_OF_SACRIFICE_1);\n+  /*Talent*/lvl >= 68 ? InitSpellMap(INTERVENE_1, true) : RemoveSpell(INTERVENE_1);\n+            //pet-specific\n+            InitSpellMap(SONIC_BLAST_1);\n+            InitSpellMap(SNATCH_1);\n+            InitSpellMap(FROSTSTORM_BREATH_1);\n+            InitSpellMap(FIRE_BREATH_1);\n+            InitSpellMap(NETHER_SHOCK_1);\n+            InitSpellMap(RAVAGE_1);\n+            InitSpellMap(POISON_SPIT_1);\n+            InitSpellMap(VENOM_WEB_SPRAY_1);\n+            InitSpellMap(WEB_1);\n+            InitSpellMap(SPORE_CLOUD_1);\n+            InitSpellMap(LIGHTNING_BREATH_1);\n+            InitSpellMap(DEMORALIZING_SCREECH_1);\n+            InitSpellMap(PROWL_1);\n+            InitSpellMap(LAVA_BREATH_1);\n+            InitSpellMap(MONSTROUS_BITE_1);\n+            InitSpellMap(TENDON_RIP_1);\n+            InitSpellMap(SERENITY_DUST_1);\n+            InitSpellMap(SAVAGE_REND_1);\n+            InitSpellMap(SPIRIT_STRIKE_1);\n+            InitSpellMap(DUST_CLOUD_1);\n+            InitSpellMap(STING_1);\n+            InitSpellMap(FURIOUS_HOWL_1);\n+            InitSpellMap(SWIPE_1);\n+            InitSpellMap(GORE_1);\n+            InitSpellMap(PIN_1);\n+            InitSpellMap(PUMMEL_1);\n+            InitSpellMap(STAMPEDE_1);\n+            InitSpellMap(SCORPID_POISON_1);\n+            InitSpellMap(SHELL_SHIELD_1);\n+            InitSpellMap(WARP_1);\n+            InitSpellMap(ACID_SPIT_1);\n+\n+  /*Talent*/lvl >= 30 && isBeas ? InitSpellMap(SPIRIT_BOND_PET, true) : RemoveSpell(SPIRIT_BOND_PET);\n+  /*Talent*/lvl >= 55 && isBeas ? InitSpellMap(KINDRED_SPIRITS_PET, true) : RemoveSpell(KINDRED_SPIRITS_PET);\n+  /*Talent*/lvl >= 30 && isBeas ? InitSpellMap(INTIMIDATION_1, true) : RemoveSpell(INTIMIDATION_1);\n+  /*Talent*/lvl >= 40 && isBeas ? InitSpellMap(BESTIAL_WRATH_1, true) : RemoveSpell(BESTIAL_WRATH_1);\n+  /*Talent*/lvl >= 50 && isBeas ? InitSpellMap(BEAST_WITHIN_1, true) : RemoveSpell(BEAST_WITHIN_1);\n+        }\n+\n+        void ApplyPetPassives() const override\n+        {\n+            uint8 lvl = me->GetLevel();\n+\n+            RefreshAura(AVOIDANCE, lvl >= 60);\n+            //ignore pet type\n+            RefreshAura(COBRA_REFLEXES, lvl >= 20);\n+            RefreshAura(BLOOD_OF_THE_RHINO, lvl >= 32);\n+            RefreshAura(OWLS_FOCUS, lvl >= 32);\n+            RefreshAura(CULLING_THE_HERD, lvl >= 32);\n+            RefreshAura(GRACE_OF_THE_MANTIS, lvl >= 44);\n+            RefreshAura(CORNERED, lvl >= 44);\n+            RefreshAura(FEEDING_FRENZY, lvl >= 44);\n+            RefreshAura(SILVERBACK, lvl >= 80);\n+\n+            RefreshAura(HASTE_DODGE_PASSIVE, lvl >= 45);\n+        }\n+\n+    private:\n+        bool IsPetTypeSpell(uint32 basespell) const\n+        {\n+            switch (basespell)\n+            {\n+                case BITE_1: //lvl 1\n+                    switch (myType)\n+                    {\n+                        case BOT_PET_BAT:\n+                        case BOT_PET_BOAR:\n+                        case BOT_PET_CARRIONBIRD:\n+                        case BOT_PET_CROCOLISK:\n+                        case BOT_PET_DRAGONHAWK:\n+                        case BOT_PET_HYENA:\n+                        case BOT_PET_NETHERRAY:\n+                        case BOT_PET_RAVAGER:\n+                        case BOT_PET_SERPENT:\n+                        case BOT_PET_WOLF:\n+\n+                        case BOT_PET_CHIMAERA:\n+                        case BOT_PET_COREHOUND:\n+                        case BOT_PET_DEVILSAUR:\n+                        case BOT_PET_WORM:\n+                            return true;\n+                        default:\n+                            return false;\n+                    }\n+                case CLAW_1: //lvl 1\n+                    switch (myType)\n+                    {\n+                        case BOT_PET_BEAR:\n+                        case BOT_PET_BIRDOFPREY:\n+                        case BOT_PET_CAT:\n+                        case BOT_PET_CRAB:\n+                        case BOT_PET_RAPTOR:\n+                        case BOT_PET_SCORPID:\n+                        case BOT_PET_TALLSTRIDER:\n+\n+                        case BOT_PET_SILITHID:\n+                        case BOT_PET_SPIRITBEAST:\n+                            return true;\n+                        default:\n+                            return false;\n+                    }\n+                case SMACK_1: //lvl 1\n+                    switch (myType)\n+                    {\n+                        case BOT_PET_GORILLA:\n+                        case BOT_PET_SPOREBAT:\n+                        case BOT_PET_TEROMOTH:\n+                        case BOT_PET_WASP:\n+\n+                        case BOT_PET_RHINO:\n+                            return true;\n+                        default:\n+                            return false;\n+                    }\n+                case SWOOP_1: //fliers ferocity lvl 44\n+                    switch (myType)\n+                    {\n+                        case BOT_PET_CARRIONBIRD:\n+                        case BOT_PET_WASP:\n+                        case BOT_PET_TEROMOTH:\n+                            return me->GetLevel() >= 44;\n+                        default:\n+                            return false;\n+                    }\n+                case CHARGE_1: //non-fliers tenacity/ferocity lvl 20/44\n+                    switch (myType)\n+                    {\n+                        case BOT_PET_BEAR:\n+                        case BOT_PET_BOAR:\n+                        case BOT_PET_CAT:\n+                        case BOT_PET_CRAB:\n+                        case BOT_PET_CROCOLISK:\n+                        case BOT_PET_GORILLA:\n+                        case BOT_PET_HYENA:\n+                        case BOT_PET_RAPTOR:\n+                        case BOT_PET_SCORPID:\n+                        case BOT_PET_TALLSTRIDER:\n+                        case BOT_PET_TURTLE:\n+                        case BOT_PET_WARPSTALKER:\n+                        case BOT_PET_WOLF:\n+\n+                        case BOT_PET_COREHOUND:\n+                        case BOT_PET_DEVILSAUR:\n+                        case BOT_PET_RHINO:\n+                        case BOT_PET_SPIRITBEAST:\n+                        case BOT_PET_WORM:\n+                            return me->GetLevel() >= (IsPetCategory(PET_CATEGORY_FEROCITY) ? 44 : 20);\n+                        default:\n+                            return false;\n+                    }\n+                case DASH_1: //non-fliers ferocity/cunning lvl 20/44\n+                    switch (myType)\n+                    {\n+                        case BOT_PET_CAT:\n+                        case BOT_PET_HYENA:\n+                        case BOT_PET_RAPTOR:\n+                        case BOT_PET_RAVAGER:\n+                        case BOT_PET_SERPENT:\n+                        case BOT_PET_SPIDER:\n+                        case BOT_PET_TALLSTRIDER:\n+                        case BOT_PET_WARPSTALKER:\n+                        case BOT_PET_WOLF:\n+\n+                        case BOT_PET_COREHOUND:\n+                        case BOT_PET_DEVILSAUR:\n+                        case BOT_PET_SILITHID:\n+                        case BOT_PET_SPIRITBEAST:\n+                            return me->GetLevel() >= (IsPetCategory(PET_CATEGORY_CUNNING) ? 44 : 20);\n+                        default:\n+                            return false;\n+                    }\n+                case DIVE_1: //fliers lvl 20\n+                    switch (myType)\n+                    {\n+                        case BOT_PET_BAT:\n+                        case BOT_PET_BIRDOFPREY:\n+                        case BOT_PET_CARRIONBIRD:\n+                        case BOT_PET_DRAGONHAWK:\n+                        case BOT_PET_TEROMOTH:\n+                        case BOT_PET_NETHERRAY:\n+                        case BOT_PET_SPOREBAT:\n+                        case BOT_PET_WASP:\n+                        case BOT_PET_WINDSERPENT:\n+\n+                        case BOT_PET_CHIMAERA:\n+                            return me->GetLevel() >= 20;\n+                        default:\n+                            return false;\n+                    }\n+                default:\n+                    return true;\n+            }\n+        }\n+\n+        bool IsPetCategory(uint8 category) const\n+        {\n+            switch (myType)\n+            {\n+                case BOT_PET_SPIDER:\n+                case BOT_PET_SERPENT:\n+                case BOT_PET_BIRDOFPREY:\n+                case BOT_PET_BAT:\n+                case BOT_PET_WINDSERPENT:\n+                case BOT_PET_RAVAGER:\n+                case BOT_PET_DRAGONHAWK:\n+                case BOT_PET_NETHERRAY:\n+                case BOT_PET_SPOREBAT:\n+\n+                case BOT_PET_SILITHID:\n+                case BOT_PET_CHIMAERA:\n+                    return category == PET_CATEGORY_CUNNING;\n+                case BOT_PET_CARRIONBIRD:\n+                case BOT_PET_RAPTOR:\n+                case BOT_PET_WOLF:\n+                case BOT_PET_TALLSTRIDER:\n+                case BOT_PET_CAT:\n+                case BOT_PET_HYENA:\n+                case BOT_PET_WASP:\n+                case BOT_PET_TEROMOTH:\n+\n+                case BOT_PET_SPIRITBEAST:\n+                case BOT_PET_COREHOUND:\n+                case BOT_PET_DEVILSAUR:\n+                    return category == PET_CATEGORY_FEROCITY;\n+                case BOT_PET_SCORPID:\n+                case BOT_PET_TURTLE:\n+                case BOT_PET_GORILLA:\n+                case BOT_PET_BEAR:\n+                case BOT_PET_BOAR:\n+                case BOT_PET_CRAB:\n+                case BOT_PET_CROCOLISK:\n+                case BOT_PET_WARPSTALKER:\n+\n+                case BOT_PET_RHINO:\n+                case BOT_PET_WORM:\n+                    return category == PET_CATEGORY_TENACITY;\n+                default:\n+                    return false;\n+            }\n+        }\n+    };\n+};\n+\n+void AddSC_hunter_bot_pets()\n+{\n+    new hunter_pet_bot();\n+}\ndiff --git a/src/server/game/AI/NpcBots/bpet_mage.cpp b/src/server/game/AI/NpcBots/bpet_mage.cpp\nnew file mode 100644\nindex 0000000000..dd75d62a1a\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bpet_mage.cpp\n@@ -0,0 +1,177 @@\n+#include \"bot_ai.h\"\n+#include \"bpet_ai.h\"\n+#include \"ObjectAccessor.h\"\n+#include \"ScriptMgr.h\"\n+#include \"Spell.h\"\n+#include \"SpellInfo.h\"\n+#include \"TemporarySummon.h\"\n+/*\n+Mage NpcBot Pets (by Trickerer onlysuffering@gmail.com)\n+Complete - 100%\n+TODO:\n+*/\n+\n+enum MagePetBaseSpells\n+{\n+    WATERBOLT_1             = 31707,\n+    FREEZE_1                = 33395\n+};\n+\n+enum MagePetSpecial\n+{\n+    ELEMENTAL_DURATION      = 45000\n+};\n+\n+class mage_pet_bot : public CreatureScript\n+{\n+public:\n+    mage_pet_bot() : CreatureScript(\"mage_pet_bot\") { }\n+\n+    CreatureAI* GetAI(Creature* creature) const override\n+    {\n+        return new water_elemental_botpetAI(creature);\n+    }\n+\n+    struct water_elemental_botpetAI : public bot_pet_ai\n+    {\n+        water_elemental_botpetAI(Creature* creature) : bot_pet_ai(creature) { }\n+\n+        void JustEngagedWith(Unit* u) override { bot_pet_ai::JustEngagedWith(u); }\n+        void KilledUnit(Unit* u) override { bot_pet_ai::KilledUnit(u); }\n+        void EnterEvadeMode(EvadeReason why = EVADE_REASON_OTHER) override { bot_pet_ai::EnterEvadeMode(why); }\n+        void MoveInLineOfSight(Unit* u) override { bot_pet_ai::MoveInLineOfSight(u); }\n+        void JustDied(Unit* u) override { bot_pet_ai::JustDied(u); }\n+        void DoNonCombatActions(uint32 /*diff*/) { }\n+\n+        void StartAttack(Unit* u, bool force = false)\n+        {\n+            if (!bot_pet_ai::StartAttack(u, force))\n+                return;\n+            GetInPosition(force, u);\n+        }\n+\n+        void DoPetActions(uint32 diff)\n+        {\n+            if (!petOwner->GetBotAI()->HasRole(BOT_ROLE_DPS))\n+                return;\n+\n+            if (!IsSpellReady(FREEZE_1, diff, false) || Rand() > 40 || !IsCasting(petOwner))\n+                return;\n+\n+            Spell const* spell = petOwner->GetCurrentSpell(CURRENT_GENERIC_SPELL);\n+            if (!spell || !spell->GetSpellInfo()->HasEffect(SPELL_EFFECT_SCHOOL_DAMAGE) ||\n+                !(spell->GetTimer() < spell->GetCastTime() / 2))\n+                return;\n+\n+            Unit* target = ObjectAccessor::GetUnit(*me, spell->m_targets.GetObjectTargetGUID());\n+            if (!target || target->isFrozen() || target->GetDistance(me) - target->GetCombatReach() > 25.f ||\n+                !me->IsValidAttackTarget(target))\n+                return;\n+\n+            me->InterruptNonMeleeSpells(false);\n+            me->CastSpell(target, GetSpell(FREEZE_1), false);\n+            return;\n+        }\n+\n+        void UpdateAI(uint32 diff) override\n+        {\n+            if ((liveTimer += diff) >= ELEMENTAL_DURATION * (IAmFree() ? 80u : 1u))\n+            {\n+                canUpdate = false;\n+                me->ToTempSummon()->UnSummon(1ms);\n+                return;\n+            }\n+\n+            if (!GlobalUpdate(diff))\n+                return;\n+\n+            if (!me->IsInCombat())\n+                DoNonCombatActions(diff);\n+\n+            DoPetActions(diff);\n+\n+            if (!CheckAttackTarget())\n+                return;\n+\n+            if (IsCasting())\n+                return;\n+\n+            DoPetAttack(diff);\n+        }\n+\n+        void DoPetAttack(uint32 diff)\n+        {\n+            StartAttack(opponent, IsPetMelee());\n+\n+            if (!petOwner->GetBotAI()->HasRole(BOT_ROLE_DPS))\n+                return;\n+\n+            if (IsSpellReady(WATERBOLT_1, diff) && me->GetDistance(opponent) < 45)\n+            {\n+                me->CastSpell(opponent, GetSpell(WATERBOLT_1), false);\n+                return;\n+            }\n+        }\n+\n+        void OnPetClassSpellGo(SpellInfo const* /*spellInfo*/) override\n+        {\n+        }\n+\n+        void SpellHit(Unit* wcaster, SpellInfo const* spell) override\n+        {\n+            Unit* caster = wcaster->ToUnit();\n+            if (!caster)\n+                return;\n+\n+            OnSpellHit(caster, spell);\n+        }\n+\n+        void SpellHitTarget(Unit* /*wtarget*/, SpellInfo const* /*spell*/) override\n+        {\n+        }\n+\n+        void DamageDealt(Unit* victim, uint32& damage, DamageEffectType damageType, SpellSchoolMask damageSchoolMask) override\n+        {\n+            bot_pet_ai::DamageDealt(victim, damage, damageType, damageSchoolMask);\n+        }\n+\n+        void DamageTaken(Unit* u, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellSchoolMask /*schoolMask*/) override\n+        {\n+            if (!u)\n+                return;\n+            if (!u->IsInCombat() && !me->IsInCombat())\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void OwnerAttackedBy(Unit* u) override\n+        {\n+            if (!u)\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void Reset() override\n+        {\n+            liveTimer = 0;\n+        }\n+\n+        void InitPetSpells() override\n+        {\n+            InitSpellMap(WATERBOLT_1);\n+            InitSpellMap(FREEZE_1);\n+        }\n+\n+        void ApplyPetPassives() const override\n+        {\n+        }\n+\n+    private:\n+        uint32 liveTimer;\n+    };\n+};\n+\n+void AddSC_mage_bot_pets()\n+{\n+    new mage_pet_bot();\n+}\ndiff --git a/src/server/game/AI/NpcBots/bpet_necromancer.cpp b/src/server/game/AI/NpcBots/bpet_necromancer.cpp\nnew file mode 100644\nindex 0000000000..f5fa116622\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bpet_necromancer.cpp\n@@ -0,0 +1,198 @@\n+#include \"bot_ai.h\"\n+#include \"bpet_ai.h\"\n+#include \"Player.h\"\n+#include \"ScriptMgr.h\"\n+/*\n+Necromancer NpcBot Pets (by Trickerer onlysuffering@gmail.com)\n+Notes:\n+Extra abilities. For the sake of defending the owner added Taunt. For self defense added Blocking (block value unchanged)\n+Both abilities are one-time use\n+Complete - 100%\n+TODO:\n+*/\n+\n+enum NecromancerPetBaseSpells\n+{\n+    BLOCKING_1                          = 3248,\n+    TAUNT_1                             = 37548\n+};\n+enum NecromancerPetPassives\n+{\n+};\n+enum NecromancerPetSpecial\n+{\n+    THREAT_BASE                         = 5,\n+    MINION_DURATION                     = 65000\n+};\n+\n+class necromancer_pet_bot : public CreatureScript\n+{\n+public:\n+    necromancer_pet_bot() : CreatureScript(\"necromancer_pet_bot\") { }\n+\n+    CreatureAI* GetAI(Creature* creature) const override\n+    {\n+        return new necromancer_botpetAI(creature);\n+    }\n+\n+    struct necromancer_botpetAI : public bot_pet_ai\n+    {\n+        necromancer_botpetAI(Creature* creature) : bot_pet_ai(creature) { }\n+\n+        void JustEngagedWith(Unit* u) override { bot_pet_ai::JustEngagedWith(u); }\n+        void KilledUnit(Unit* u) override { bot_pet_ai::KilledUnit(u); }\n+        void EnterEvadeMode(EvadeReason why = EVADE_REASON_OTHER) override { bot_pet_ai::EnterEvadeMode(why); }\n+        void MoveInLineOfSight(Unit* u) override { bot_pet_ai::MoveInLineOfSight(u); }\n+        void JustDied(Unit* u) override { bot_pet_ai::JustDied(u); }\n+        void DoNonCombatActions(uint32 /*diff*/) { }\n+\n+        void StartAttack(Unit* u, bool force = false)\n+        {\n+            if (!bot_pet_ai::StartAttack(u, force))\n+                return;\n+            GetInPosition(force, u);\n+        }\n+\n+        void UpdateAI(uint32 diff) override\n+        {\n+            if ((liveTimer += diff) >= _getMaxDuration())\n+            {\n+                canUpdate = false;\n+                me->setDeathState(DeathState::JustDied);\n+                return;\n+            }\n+\n+            if (!GlobalUpdate(diff))\n+                return;\n+\n+            if (!me->IsInCombat())\n+                DoNonCombatActions(diff);\n+\n+            if (!CheckAttackTarget())\n+                return;\n+\n+            if (IsCasting())\n+                return;\n+\n+            DoPetAttack(diff);\n+        }\n+\n+        void DoPetAttack(uint32 diff)\n+        {\n+            StartAttack(opponent, IsPetMelee());\n+\n+            if (IsSpellReady(TAUNT_1, diff, false) && Rand() < 50 &&\n+                ((opponent->GetVictim() == petOwner && !IsTank(petOwner)) ||\n+                (opponent->GetVictim() == petOwner->GetBotOwner() && !IsTank(petOwner->GetBotOwner()))) &&\n+                !opponent->HasAuraType(SPELL_AURA_MOD_TAUNT) && me->IsWithinMeleeRange(opponent))\n+            {\n+                me->CastSpell(opponent, GetSpell(TAUNT_1), false);\n+                SetSpellCooldown(TAUNT_1, std::numeric_limits<uint32>::max());\n+                return;\n+            }\n+\n+            if (IsSpellReady(BLOCKING_1, diff) && !me->getAttackers().empty() && Rand() < 25)\n+            {\n+                me->CastSpell(me, GetSpell(BLOCKING_1), true);\n+                SetSpellCooldown(BLOCKING_1, std::numeric_limits<uint32>::max());\n+                return;\n+            }\n+        }\n+\n+        void OnPetClassSpellGo(SpellInfo const* /*spellInfo*/) override\n+        {\n+        }\n+\n+        void SpellHit(Unit* wcaster, SpellInfo const* spell) override\n+        {\n+            Unit* caster = wcaster->ToUnit();\n+            if (!caster)\n+                return;\n+\n+            OnSpellHit(caster, spell);\n+        }\n+\n+        void SpellHitTarget(Unit* /*wtarget*/, SpellInfo const* /*spell*/) override\n+        {\n+        }\n+\n+        void DamageDealt(Unit* victim, uint32& damage, DamageEffectType damageType, SpellSchoolMask damageSchoolMask) override\n+        {\n+            bot_pet_ai::DamageDealt(victim, damage, damageType, damageSchoolMask);\n+        }\n+\n+        void DamageTaken(Unit* u, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellSchoolMask /*schoolMask*/) override\n+        {\n+            if (!u)\n+                return;\n+            if (!u->IsInCombat() && !me->IsInCombat())\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void OwnerAttackedBy(Unit* u) override\n+        {\n+            if (!u)\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        uint32 GetData(uint32 data) const override\n+        {\n+            switch (data)\n+            {\n+                case BOTPETAI_MISC_DURATION:\n+                    return liveTimer;\n+                case BOTPETAI_MISC_DURATION_MAX:\n+                    return _getMaxDuration();\n+                case BOTPETAI_MISC_MAXLEVEL:\n+                    return maxlevel;\n+                default:\n+                    return bot_pet_ai::GetData(data);\n+            }\n+        }\n+\n+        void SetData(uint32 data, uint32 value) override\n+        {\n+            switch (data)\n+            {\n+                case BOTPETAI_MISC_MAXLEVEL:\n+                    maxlevel = uint8(value);\n+                    SetPetStats(true);\n+                    break;\n+                default:\n+                    break;\n+            }\n+        }\n+\n+        void Reset() override\n+        {\n+            liveTimer = 0;\n+            maxlevel = 1;\n+        }\n+\n+        void InitPetSpells() override\n+        {\n+            InitSpellMap(TAUNT_1, true, false);\n+            InitSpellMap(BLOCKING_1, true, false);\n+        }\n+\n+        void ApplyPetPassives() const override\n+        {\n+        }\n+\n+    private:\n+        uint32 _getMaxDuration() const\n+        {\n+            return MINION_DURATION * (IAmFree() ? 5u : 1u);\n+        }\n+\n+        uint32 liveTimer;\n+        uint8 maxlevel;\n+    };\n+};\n+\n+void AddSC_necromancer_bot_pets()\n+{\n+    new necromancer_pet_bot();\n+}\ndiff --git a/src/server/game/AI/NpcBots/bpet_priest.cpp b/src/server/game/AI/NpcBots/bpet_priest.cpp\nnew file mode 100644\nindex 0000000000..2452de00c9\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bpet_priest.cpp\n@@ -0,0 +1,172 @@\n+#include \"bot_ai.h\"\n+#include \"bpet_ai.h\"\n+#include \"ScriptMgr.h\"\n+#include \"TemporarySummon.h\"\n+/*\n+Priest NpcBot Pets (by Trickerer onlysuffering@gmail.com)\n+Complete - 100%\n+TODO:\n+*/\n+\n+enum PriestPetBaseSpells\n+{\n+    SHADOWCRAWL_1                       = 63619\n+};\n+\n+enum PriestPetPassives\n+{\n+    MANA_LEECH                          = 28305,\n+    AVOIDANCE                           = 63623\n+};\n+\n+enum PriestPetSpecial\n+{\n+    GLYPH_SHADOWFIEND_PROC              = 58227,\n+\n+    SHADOWFIEND_DURATION                = 15000\n+};\n+\n+class priest_pet_bot : public CreatureScript\n+{\n+public:\n+    priest_pet_bot() : CreatureScript(\"priest_pet_bot\") { }\n+\n+    CreatureAI* GetAI(Creature* creature) const override\n+    {\n+        return new priest_botpetAI(creature);\n+    }\n+\n+    struct priest_botpetAI : public bot_pet_ai\n+    {\n+        priest_botpetAI(Creature* creature) : bot_pet_ai(creature) { }\n+\n+        void JustEngagedWith(Unit* u) override { bot_pet_ai::JustEngagedWith(u); }\n+        void KilledUnit(Unit* u) override { bot_pet_ai::KilledUnit(u); }\n+        void EnterEvadeMode(EvadeReason why = EVADE_REASON_OTHER) override { bot_pet_ai::EnterEvadeMode(why); }\n+        void MoveInLineOfSight(Unit* u) override { bot_pet_ai::MoveInLineOfSight(u); }\n+        void JustDied(Unit* u) override { bot_pet_ai::JustDied(u); }\n+        void DoNonCombatActions(uint32 /*diff*/) { }\n+\n+        void StartAttack(Unit* u, bool force = false)\n+        {\n+            if (!bot_pet_ai::StartAttack(u, force))\n+                return;\n+            GetInPosition(force, u);\n+        }\n+\n+        void DoPetActions(uint32 /*diff*/)\n+        {\n+        }\n+\n+        void UpdateAI(uint32 diff) override\n+        {\n+            if ((liveTimer += diff) >= SHADOWFIEND_DURATION)\n+            {\n+                canUpdate = false;\n+                me->ToTempSummon()->UnSummon(1ms);\n+                return;\n+            }\n+\n+            if (!GlobalUpdate(diff))\n+                return;\n+\n+            if (!me->IsInCombat())\n+                DoNonCombatActions(diff);\n+\n+            DoPetActions(diff);\n+            //CheckDrainMana(diff);\n+\n+            if (!CheckAttackTarget())\n+                return;\n+\n+            if (IsCasting())\n+                return;\n+\n+            DoPetAttack(diff);\n+        }\n+\n+        void DoPetAttack(uint32 diff)\n+        {\n+            StartAttack(opponent, IsPetMelee());\n+\n+            float dist = me->GetDistance(opponent);\n+            bool canDPS = petOwner->GetBotAI()->HasRole(BOT_ROLE_DPS);\n+\n+            if (IsSpellReady(SHADOWCRAWL_1, diff) && canDPS && dist < 30)\n+            {\n+                me->CastSpell(opponent, GetSpell(SHADOWCRAWL_1), false);\n+                SetSpellCooldown(SHADOWCRAWL_1, 6000);\n+                return;\n+            }\n+        }\n+\n+        void OnPetClassSpellGo(SpellInfo const* /*spellInfo*/) override\n+        {\n+        }\n+\n+        void SpellHit(Unit* wcaster, SpellInfo const* spell) override\n+        {\n+            Unit* caster = wcaster->ToUnit();\n+            if (!caster)\n+                return;\n+\n+            OnSpellHit(caster, spell);\n+        }\n+\n+        void SpellHitTarget(Unit* /*wtarget*/, SpellInfo const* /*spell*/) override\n+        {\n+        }\n+\n+        void DamageDealt(Unit* victim, uint32& damage, DamageEffectType damageType, SpellSchoolMask damageSchoolMask) override\n+        {\n+            //Handled by spell scripts\n+            //if (damage && victim && damageType == DIRECT_DAMAGE)\n+            //    victim->CastSpell(petOwner, MANA_LEECH_PROC, true);\n+\n+            bot_pet_ai::DamageDealt(victim, damage, damageType, damageSchoolMask);\n+        }\n+\n+        void DamageTaken(Unit* u, uint32& damage, DamageEffectType /*damageType*/, SpellSchoolMask /*schoolMask*/) override\n+        {\n+            if (damage >= me->GetHealth())\n+                petOwner->CastSpell(petOwner, GLYPH_SHADOWFIEND_PROC, true);\n+\n+            if (!u)\n+                return;\n+            if (!u->IsInCombat() && !me->IsInCombat())\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void OwnerAttackedBy(Unit* u) override\n+        {\n+            if (!u)\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void Reset() override\n+        {\n+            liveTimer = 0;\n+        }\n+\n+        void InitPetSpells() override\n+        {\n+            InitSpellMap(SHADOWCRAWL_1);\n+        }\n+\n+        void ApplyPetPassives() const override\n+        {\n+            RefreshAura(MANA_LEECH);\n+            RefreshAura(AVOIDANCE);\n+        }\n+\n+    private:\n+        uint32 liveTimer;\n+    };\n+};\n+\n+void AddSC_priest_bot_pets()\n+{\n+    new priest_pet_bot();\n+}\ndiff --git a/src/server/game/AI/NpcBots/bpet_sea_witch.cpp b/src/server/game/AI/NpcBots/bpet_sea_witch.cpp\nnew file mode 100644\nindex 0000000000..5e9b9f41c5\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bpet_sea_witch.cpp\n@@ -0,0 +1,250 @@\n+#include \"bot_ai.h\"\n+#include \"botspell.h\"\n+#include \"bpet_ai.h\"\n+#include \"MotionMaster.h\"\n+#include \"ScriptMgr.h\"\n+#include \"SpellAuras.h\"\n+#include \"SpellAuraEffects.h\"\n+#include \"TemporarySummon.h\"\n+/*\n+Sea Witch NpcBot Pets (by Trickerer onlysuffering@gmail.com)\n+Complete - 100%\n+TODO:\n+*/\n+\n+enum SeaWitchPetBaseSpells\n+{\n+    ENVELOP_1                   = SPELL_TORNADO_EFFECT,\n+    LIGHTNING_1                 = SPELL_TORNADO_EFFECT2,\n+};\n+\n+enum SeaWitchPetSpecial\n+{\n+    TORNADO_DURATION            = 40000,\n+    TORNADO_MOVE_RESET_TIMER    = 1500,\n+    TORNADO_GROWTH_TIMER        = 2500,\n+    TORNADO_DISSIPATE_TIMER     = 5000,\n+\n+    PERIODIC_LIGHTNING_VISUAL   = 45869,\n+    CAMERA_SHAKE_VISUAL         = 12816,\n+    TARGET_LIGHTNING_VISUAL     = 39381,\n+    TARGET_LIGHTNING_VISUAL2    = 45935,\n+    SPELL_GROWTH                = 55948,//+10% size, +10% damage\n+    SPELL_SLOW_AURA             = SPELL_TORNADO_EFFECT3\n+};\n+\n+class sea_witch_pet_bot : public CreatureScript\n+{\n+public:\n+    sea_witch_pet_bot() : CreatureScript(\"sea_witch_pet_bot\") { }\n+\n+    CreatureAI* GetAI(Creature* creature) const override\n+    {\n+        return new tornado_botpetAI(creature);\n+    }\n+\n+    struct tornado_botpetAI : public bot_pet_ai\n+    {\n+        tornado_botpetAI(Creature* creature) : bot_pet_ai(creature) { }\n+\n+        void JustEngagedWith(Unit* u) override { bot_pet_ai::JustEngagedWith(u); }\n+        void KilledUnit(Unit* u) override { bot_pet_ai::KilledUnit(u); }\n+        void EnterEvadeMode(EvadeReason why = EVADE_REASON_OTHER) override { bot_pet_ai::EnterEvadeMode(why); }\n+        void MoveInLineOfSight(Unit* u) override { bot_pet_ai::MoveInLineOfSight(u); }\n+        void JustDied(Unit* u) override { bot_pet_ai::JustDied(u); }\n+\n+        void DoPetActions(uint32 diff)\n+        {\n+            //Envelop random target: every 3 sec\n+            if (IsSpellReady(ENVELOP_1, diff, false))\n+            {\n+                std::list<Unit*> targets;\n+                petOwner->GetBotAI()->HelpGetNearbyTargetsList(targets, 10.f, 1, me);\n+                if (targets.size() > 2)\n+                    Bcore::Containers::RandomResize(targets, 2);\n+                for (Unit* u : targets)\n+                    me->CastSpell(u, GetSpell(ENVELOP_1), true);\n+                SetSpellCooldown(ENVELOP_1, 3000);\n+            }\n+\n+            if (IsSpellReady(LIGHTNING_1, diff, false))\n+            {\n+                std::list<Unit*> targets;\n+                petOwner->GetBotAI()->HelpGetNearbyTargetsList(targets, 15.f, 0, me);\n+                if (!targets.empty())\n+                    me->CastSpell(me, CAMERA_SHAKE_VISUAL, true);\n+                for (Unit* u : targets)\n+                {\n+                    me->CastSpell(u, GetSpell(LIGHTNING_1), true);\n+                    u->CastSpell(u, TARGET_LIGHTNING_VISUAL, true);\n+                    u->CastSpell(u, TARGET_LIGHTNING_VISUAL2, true);\n+                }\n+                SetSpellCooldown(LIGHTNING_1, 4500);\n+            }\n+        }\n+\n+        void UpdateAI(uint32 diff) override\n+        {\n+            if (((liveTimer += diff) >= TORNADO_DURATION) || !petOwner->GetBotAI()->HasRole(BOT_ROLE_DPS))\n+            {\n+                canUpdate = false;\n+                me->ToTempSummon()->UnSummon(1ms);\n+                return;\n+            }\n+            else if ((IsIndoors() && !me->IsOutdoors()) && (isIndoorsTimer += diff) >= TORNADO_DISSIPATE_TIMER)\n+            {\n+                canUpdate = false;\n+                me->SetObjectScale(me->GetCreatureTemplate()->GetFirstValidModel()->DisplayScale / 2.f);\n+                me->ToTempSummon()->UnSummon(2000ms);\n+                return;\n+            }\n+\n+            if ((growthTimer += diff) > TORNADO_GROWTH_TIMER)\n+            {\n+                growthTimer %= TORNADO_GROWTH_TIMER;\n+                me->CastSpell(me, SPELL_GROWTH, true);\n+                //me->SetObjectScale(me->GetObjectScale() * 1.1f);\n+            }\n+\n+            if (!GlobalUpdate(diff))\n+                return;\n+\n+            DoPetActions(diff);\n+\n+            if (IsCasting())\n+                return;\n+\n+            if (!CheckAttackTarget())\n+                return;\n+\n+            DoPetAttack(diff);\n+        }\n+\n+        void DoPetAttack(uint32 diff)\n+        {\n+            if ((moveResetTimer += diff) > TORNADO_MOVE_RESET_TIMER || opponent->GetGUID() != me->GetTarget())\n+            {\n+                moveResetTimer %= TORNADO_MOVE_RESET_TIMER;\n+                SetBotCommandState(BOT_COMMAND_ATTACK);\n+                me->SetTarget(opponent->GetGUID());\n+                Position pos = opponent->GetNearPosition(frand(3.f, 5.f + opponent->GetCombatReach()), opponent->GetAbsoluteAngle(petOwner) + frand(float(-M_PI) / 2.f, float(M_PI) / 2.f));\n+                me->GetMotionMaster()->MovePoint(me->GetMapId(), pos, FORCED_MOVEMENT_NONE, 0.0f, false);\n+                //me->GetMotionMaster()->MoveChase(opponent, frand(3.f, 10.f), opponent->GetAbsoluteAngle(petOwner) + frand(-M_PI / 2, M_PI / 2));\n+            }\n+        }\n+\n+        void ApplyBotPetSpellRadiusMods(SpellInfo const* spellInfo, float& radius) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            //uint8 lvl = me->GetLevel();\n+            float flatbonus = 0.0f;\n+            float pctbonus = 0.0f;\n+\n+            ////pct mods\n+            ////Increased Area (AhnQ set bonus?) 23549\n+            //if (lvl >= 60 && (spellInfo->SpellFamilyFlags[0] & 0x1084))\n+            //    pctbonus += 0.25f;\n+\n+            //flat mods\n+            //Slow Aura growth\n+            if (baseId == SPELL_SLOW_AURA)\n+                flatbonus += me->GetCombatReach();\n+\n+            radius = radius * (1.0f + pctbonus) + flatbonus;\n+        }\n+\n+        void OnPetClassSpellGo(SpellInfo const* /*spellInfo*/) override {}\n+\n+        void SpellHit(Unit* wcaster, SpellInfo const* spell) override\n+        {\n+            Unit* caster = wcaster->ToUnit();\n+            if (!caster)\n+                return;\n+\n+            OnSpellHit(caster, spell);\n+        }\n+\n+        void SpellHitTarget(Unit* wtarget, SpellInfo const* spell) override\n+        {\n+            Unit* target = wtarget->ToUnit();\n+            if (!target)\n+                return;\n+\n+            if (target == me)\n+                return;\n+\n+            uint32 baseId = spell->GetFirstRankSpell()->Id;\n+            //uint8 lvl = me->GetLevel();\n+\n+            if (baseId == ENVELOP_1)\n+            {\n+                if (target->IsControlledByPlayer())\n+                {\n+                    if (Aura* enve = target->GetAura(GetSpell(baseId), me->GetGUID()))\n+                    {\n+                        int32 dur = std::max<int32>(enve->GetDuration() - 6000, 0);\n+                        enve->SetDuration(dur);\n+                        enve->SetMaxDuration(dur);\n+                    }\n+                }\n+            }\n+        }\n+\n+        void DamageDealt(Unit* victim, uint32& damage, DamageEffectType damageType, SpellSchoolMask damageSchoolMask) override\n+        {\n+            bot_pet_ai::DamageDealt(victim, damage, damageType, damageSchoolMask);\n+        }\n+\n+        void DamageTaken(Unit* u, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellSchoolMask /*schoolMask*/) override\n+        {\n+            if (!u)\n+                return;\n+            if (!u->IsInCombat() && !me->IsInCombat())\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void OwnerAttackedBy(Unit* u) override\n+        {\n+            if (!u)\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void CheckAttackState() override\n+        {\n+        }\n+\n+        void Reset() override\n+        {\n+            liveTimer = 0;\n+            moveResetTimer = 0;\n+            growthTimer = 0;\n+            isIndoorsTimer = 0;\n+        }\n+\n+        void InitPetSpells() override\n+        {\n+            InitSpellMap(ENVELOP_1, true, false);\n+            InitSpellMap(LIGHTNING_1, true, false);\n+        }\n+\n+        void ApplyPetPassives() const override\n+        {\n+            RefreshAura(PERIODIC_LIGHTNING_VISUAL);\n+            RefreshAura(SPELL_SLOW_AURA);\n+        }\n+\n+    private:\n+        uint32 liveTimer;\n+        uint32 moveResetTimer;\n+        uint32 growthTimer;\n+        uint32 isIndoorsTimer;\n+    };\n+};\n+\n+void AddSC_sea_witch_bot_pets()\n+{\n+    new sea_witch_pet_bot();\n+}\ndiff --git a/src/server/game/AI/NpcBots/bpet_shaman.cpp b/src/server/game/AI/NpcBots/bpet_shaman.cpp\nnew file mode 100644\nindex 0000000000..27c864420b\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bpet_shaman.cpp\n@@ -0,0 +1,191 @@\n+#include \"bot_ai.h\"\n+#include \"bpet_ai.h\"\n+#include \"ScriptMgr.h\"\n+#include \"TemporarySummon.h\"\n+/*\n+Shaman NpcBot Pets (by Trickerer onlysuffering@gmail.com)\n+Complete - 100%\n+TODO:\n+*/\n+\n+enum ShamanPetBaseSpells\n+{\n+    BASH_1                              = 58861, //r5 cd45\n+    LEAP_1                              = 58867, //r5-30 cd20\n+    TWIN_HOWL_1                         = 58857, //r10 cd15\n+    SPIRIT_WALK_1                       = 58875  //r25 cd32\n+};\n+\n+enum ShamanPetPassives\n+{\n+    SPIRIT_HUNT                         = 58877\n+};\n+\n+enum ShamanPetSpecial\n+{\n+    SPIRITWOLF_DURATION                 = 45000\n+};\n+\n+class shaman_pet_bot : public CreatureScript\n+{\n+public:\n+    shaman_pet_bot() : CreatureScript(\"shaman_pet_bot\") { }\n+\n+    CreatureAI* GetAI(Creature* creature) const override\n+    {\n+        return new shaman_botpetAI(creature);\n+    }\n+\n+    struct shaman_botpetAI : public bot_pet_ai\n+    {\n+        shaman_botpetAI(Creature* creature) : bot_pet_ai(creature) { }\n+\n+        void JustEngagedWith(Unit* u) override { bot_pet_ai::JustEngagedWith(u); }\n+        void KilledUnit(Unit* u) override { bot_pet_ai::KilledUnit(u); }\n+        void EnterEvadeMode(EvadeReason why = EVADE_REASON_OTHER) override { bot_pet_ai::EnterEvadeMode(why); }\n+        void MoveInLineOfSight(Unit* u) override { bot_pet_ai::MoveInLineOfSight(u); }\n+        void JustDied(Unit* u) override { bot_pet_ai::JustDied(u); }\n+        void DoNonCombatActions(uint32 /*diff*/) { }\n+\n+        void StartAttack(Unit* u, bool force = false)\n+        {\n+            if (!bot_pet_ai::StartAttack(u, force))\n+                return;\n+            GetInPosition(force, u);\n+        }\n+\n+        void DoPetActions(uint32 diff)\n+        {\n+            if (IsSpellReady(SPIRIT_WALK_1, diff) && (me->GetVictim() || petOwner->GetVictim()) &&\n+                !HasBotCommandState(BOT_COMMAND_STAY) &&\n+                me->GetDistance(petOwner) < 25)\n+            {\n+                me->CastSpell(me, GetSpell(SPIRIT_WALK_1), false);\n+                return;\n+            }\n+        }\n+\n+        void UpdateAI(uint32 diff) override\n+        {\n+            if ((liveTimer += diff) >= SPIRITWOLF_DURATION)\n+            {\n+                canUpdate = false;\n+                me->ToTempSummon()->UnSummon(1ms);\n+                return;\n+            }\n+\n+            if (!GlobalUpdate(diff))\n+                return;\n+\n+            if (!me->IsInCombat())\n+                DoNonCombatActions(diff);\n+\n+            DoPetActions(diff);\n+\n+            if (!CheckAttackTarget())\n+                return;\n+\n+            if (IsCasting())\n+                return;\n+\n+            DoPetAttack(diff);\n+        }\n+\n+        void DoPetAttack(uint32 diff)\n+        {\n+            StartAttack(opponent, IsPetMelee());\n+\n+            float dist = me->GetDistance(opponent);\n+            Unit const* u = opponent->GetVictim();\n+            //bool canDPS = petOwner->GetBotAI()->HasRole(BOT_ROLE_DPS);\n+\n+            if (IsSpellReady(LEAP_1, diff) &&\n+                !HasBotCommandState(BOT_COMMAND_STAY) &&\n+                !(opponent->IsCreature() && opponent->ToCreature()->isWorldBoss()) &&\n+                dist > 5 && dist < 30)\n+            {\n+                me->CastSpell(opponent, GetSpell(LEAP_1), false);\n+                return;\n+            }\n+\n+            if (IsSpellReady(BASH_1, diff) && !CCed(opponent) &&\n+                me->IsWithinMeleeRange(opponent))\n+            {\n+                me->CastSpell(opponent, GetSpell(BASH_1), false);\n+                return;\n+            }\n+\n+            if (IsSpellReady(TWIN_HOWL_1, diff, false) && u && u != me && me->IsWithinMeleeRange(opponent) &&\n+                !CCed(opponent) && !opponent->HasAuraType(SPELL_AURA_MOD_TAUNT) &&\n+                (!IsTank(u) || (GetHealthPCT(u) < 30 && GetHealthPCT(me) > 50)) && IsInBotParty(u))\n+            {\n+                me->CastSpell(opponent, GetSpell(TWIN_HOWL_1), false);\n+                return;\n+            }\n+        }\n+\n+        void OnPetClassSpellGo(SpellInfo const* /*spellInfo*/) override\n+        {\n+        }\n+\n+        void SpellHit(Unit* wcaster, SpellInfo const* spell) override\n+        {\n+            Unit* caster = wcaster->ToUnit();\n+            if (!caster)\n+                return;\n+\n+            OnSpellHit(caster, spell);\n+        }\n+\n+        void SpellHitTarget(Unit* /*wtarget*/, SpellInfo const* /*spell*/) override\n+        {\n+        }\n+\n+        void DamageDealt(Unit* victim, uint32& damage, DamageEffectType damageType, SpellSchoolMask damageSchoolMask) override\n+        {\n+            bot_pet_ai::DamageDealt(victim, damage, damageType, damageSchoolMask);\n+        }\n+\n+        void DamageTaken(Unit* u, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellSchoolMask /*schoolMask*/) override\n+        {\n+            if (!u)\n+                return;\n+            if (!u->IsInCombat() && !me->IsInCombat())\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void OwnerAttackedBy(Unit* u) override\n+        {\n+            if (!u)\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void Reset() override\n+        {\n+            liveTimer = 0;\n+        }\n+\n+        void InitPetSpells() override\n+        {\n+            InitSpellMap(BASH_1);\n+            InitSpellMap(LEAP_1);\n+            InitSpellMap(TWIN_HOWL_1);\n+            InitSpellMap(SPIRIT_WALK_1);\n+        }\n+\n+        void ApplyPetPassives() const override\n+        {\n+            RefreshAura(SPIRIT_HUNT);\n+        }\n+\n+    private:\n+        uint32 liveTimer;\n+    };\n+};\n+\n+void AddSC_shaman_bot_pets()\n+{\n+    new shaman_pet_bot();\n+}\ndiff --git a/src/server/game/AI/NpcBots/bpet_warlock.cpp b/src/server/game/AI/NpcBots/bpet_warlock.cpp\nnew file mode 100644\nindex 0000000000..6ed79e7279\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bpet_warlock.cpp\n@@ -0,0 +1,408 @@\n+#include \"bot_ai.h\"\n+#include \"bpet_ai.h\"\n+#include \"botmgr.h\"\n+#include \"ScriptMgr.h\"\n+#include \"Spell.h\"\n+#include \"SpellAuraEffects.h\"\n+#include \"SpellMgr.h\"\n+#include \"Player.h\"\n+/*\n+Warlock NpcBot Pets (by Trickerer onlysuffering@gmail.com)\n+Complete - 100%\n+TODO:\n+*/\n+\n+enum WarlockPetBaseSpells\n+{\n+    //imp\n+    FIREBOLT_1                          = 3110,//1\n+    BLOOD_PACT_1                        = 6307,//4\n+    PHASE_SHIFT_1                       = 4511,//12\n+    FIRE_SHIELD_1                       = 2947,//14 unused\n+    //voidwalker\n+    TORMENT_1                           = 3716,//10\n+    SACRIFICE_1                         = 7812,//16\n+    CONSUME_SHADOWS_1                   = 17767,//18\n+    SUFFERING_1                         = 17735,//24\n+    //succubus\n+    LASH_OF_PAIN_1                      = 7814,//20\n+    SOOTHING_KISS_1                     = 6360,//22\n+    SEDUCTION_1                         = 6358,//26\n+    LESSER_INVISIBILITY_1               = 7870,//32\n+    //felhunter\n+    DEVOUR_MAGIC_1                      = 19505,//30\n+    FEL_INTELLIGENCE_1                  = 54424,//32\n+    SPELL_LOCK_1                        = 19244,//36\n+    SHADOW_BITE_1                       = 54049,//42\n+    //felguard\n+    ANGUISH_1                           = 33698,//50\n+    CLEAVE_1                            = 30213,//50\n+    INTERCEPT_1                         = 30151 //52\n+};\n+\n+enum WarlockPetPassives\n+{\n+    AVOIDANCE                           = 32233,\n+    DEMONIC_FRENZY                      = 32850\n+};\n+\n+enum WarlockPetSpecial\n+{\n+    SOUL_LINK_PET                       = 25228//split effect lvl 20 req\n+};\n+\n+class warlock_pet_bot : public CreatureScript\n+{\n+public:\n+    warlock_pet_bot() : CreatureScript(\"warlock_pet_bot\") { }\n+\n+    CreatureAI* GetAI(Creature* creature) const override\n+    {\n+        return new warlock_botpetAI(creature);\n+    }\n+\n+    struct warlock_botpetAI : public bot_pet_ai\n+    {\n+        warlock_botpetAI(Creature* creature) : bot_pet_ai(creature) { }\n+\n+        void JustEngagedWith(Unit* u) override { bot_pet_ai::JustEngagedWith(u); }\n+        void KilledUnit(Unit* u) override { bot_pet_ai::KilledUnit(u); }\n+        void EnterEvadeMode(EvadeReason why = EVADE_REASON_OTHER) override { bot_pet_ai::EnterEvadeMode(why); }\n+        void MoveInLineOfSight(Unit* u) override { bot_pet_ai::MoveInLineOfSight(u); }\n+        void JustDied(Unit* u) override { bot_pet_ai::JustDied(u); }\n+        void DoNonCombatActions(uint32 /*diff*/) { }\n+\n+        void StartAttack(Unit* u, bool force = false)\n+        {\n+            if (!bot_pet_ai::StartAttack(u, force))\n+                return;\n+            GetInPosition(force, u);\n+        }\n+\n+        void DoPetActions(uint32 diff)\n+        {\n+            if (GetSpell(SOUL_LINK_PET) && !petOwner->HasAuraTypeWithCaster(SPELL_AURA_SPLIT_DAMAGE_PCT, me->GetGUID()))\n+            {\n+                me->CastSpell(me, SOUL_LINK_PET, false);\n+                return;\n+            }\n+            if (myType == BOT_PET_IMP)\n+            {\n+                //hacked - confilct with soul link due to ownerGuid mismatch\n+                if (IsSpellReady(BLOOD_PACT_1, diff, false) && !IAmFree() && (!me->HasAuraType(SPELL_AURA_230) ||\n+                    me->GetAuraEffectsByType(SPELL_AURA_230).front()->GetAmount() < sSpellMgr->GetSpellInfo(GetSpell(BLOOD_PACT_1))->Effects[0].CalcValue()))\n+                {\n+                    me->CastSpell(me, GetSpell(BLOOD_PACT_1), false);\n+                    //CastSpellExtraArgs args(true);\n+                    //args.SetOriginalCaster(me->GetGUID());\n+                    //petOwner->CastSpell(petOwner, GetSpell(BLOOD_PACT_1), args);\n+                    SetSpellCooldown(BLOOD_PACT_1, uint32(-1));\n+                }\n+\n+                if (IsSpellReady(PHASE_SHIFT_1, diff, false) && !me->GetVictim() &&\n+                    (!petOwner->GetBotAI()->HasRole(BOT_ROLE_DPS) || !me->IsInCombat()) &&\n+                    !me->HasAuraType(SPELL_AURA_MOD_UNATTACKABLE))\n+                {\n+                    me->CastSpell(me, GetSpell(PHASE_SHIFT_1), false);\n+                    return;\n+                }\n+            }\n+            else if (myType == BOT_PET_VOIDWALKER)\n+            {\n+                if (GetSpell(CONSUME_SHADOWS_1) && !me->IsInCombat() && !me->isMoving() &&\n+                    me->GetDistance(me) < 10 && GetHealthPCT(me) < 80)\n+                {\n+                    me->CastSpell(me, GetSpell(CONSUME_SHADOWS_1), false);\n+                    return;\n+                }\n+\n+                if (IsSpellReady(SACRIFICE_1, diff, false) &&\n+                    (!petOwner->getAttackers().empty() || petOwner->HasAuraType(SPELL_AURA_PERIODIC_DAMAGE)) &&\n+                    me->GetHealth() > me->GetCreateHealth() / 4) //hp cost 25%\n+                {\n+                    me->CastSpell(me, GetSpell(SACRIFICE_1), false);\n+                    return;\n+                }\n+            }\n+            else if (myType == BOT_PET_SUCCUBUS)\n+            {\n+                if (IsSpellReady(SOOTHING_KISS_1, diff, false) &&\n+                    !me->getAttackers().empty() && me->GetDistance(*(me->getAttackers().begin())) < 10)\n+                {\n+                    me->CastSpell(*(me->getAttackers().begin()), GetSpell(SOOTHING_KISS_1), false);\n+                    SetSpellCooldown(SOOTHING_KISS_1, 4000);\n+                    return;\n+                }\n+\n+                if (GetSpell(SEDUCTION_1) && Rand() < 20 && !IsCasting())\n+                {\n+                    Unit* target = petOwner->GetBotAI()->HelpFindStunTarget(30);\n+                    if (target && target->GetDiminishing(DIMINISHING_FEAR) <= DIMINISHING_LEVEL_2 + 1 * (target->IsNonMeleeSpellCast(false, false, true)))\n+                    {\n+                        me->CastSpell(target, GetSpell(SEDUCTION_1), false);\n+                        return;\n+                    }\n+                }\n+\n+                if (IsSpellReady(LESSER_INVISIBILITY_1, diff, false) && !me->GetVictim() && !me->IsInCombat() &&\n+                    !me->HasAuraType(SPELL_AURA_MOD_INVISIBILITY))\n+                {\n+                    me->CastSpell(me, GetSpell(LESSER_INVISIBILITY_1), false);\n+                    return;\n+                }\n+            }\n+            else if (myType == BOT_PET_FELHUNTER)\n+            {\n+                //hacked - confilct with soul link due to ownerGuid mismatch\n+                if (IsSpellReady(FEL_INTELLIGENCE_1, diff, false) && !IAmFree() &&\n+                    !petOwner->GetBotOwner()->GetBotMgr()->HasBotClass(BOT_CLASS_MAGE) &&\n+                    !petOwner->GetBotOwner()->GetBotMgr()->HasBotClass(BOT_CLASS_PRIEST))\n+                {\n+                    me->CastSpell(me, GetSpell(FEL_INTELLIGENCE_1), false);\n+                    //CastSpellExtraArgs args(true);\n+                    //args.SetOriginalCaster(me->GetGUID());\n+                    //petOwner->CastSpell(petOwner, GetSpell(FEL_INTELLIGENCE_1), args);\n+                    SetSpellCooldown(FEL_INTELLIGENCE_1, uint32(-1));\n+                }\n+\n+                if (IsSpellReady(SPELL_LOCK_1, diff, false))\n+                {\n+                    if (Unit* target = petOwner->GetBotAI()->HelpFindCastingTarget(30, 0, SPELL_LOCK_1))\n+                        me->CastSpell(target, GetSpell(SPELL_LOCK_1), false);\n+                }\n+\n+                CureGroup(GetSpell(DEVOUR_MAGIC_1), diff);\n+            }\n+        }\n+\n+        void UpdateAI(uint32 diff) override\n+        {\n+            if (!GlobalUpdate(diff))\n+                return;\n+\n+            if (Spell const* spell = me->GetCurrentSpell(CURRENT_GENERIC_SPELL))\n+            {\n+                if (myType == BOT_PET_SUCCUBUS)\n+                {\n+                    //Seduction interrupt\n+                    if (spell->GetSpellInfo()->GetFirstRankSpell()->Id == SEDUCTION_1)\n+                    {\n+                        Unit const* target = ObjectAccessor::GetUnit(*me, spell->m_targets.GetObjectTargetGUID());\n+                        if (target && CCed(target))\n+                            me->InterruptSpell(CURRENT_GENERIC_SPELL);\n+                    }\n+                }\n+            }\n+\n+            if (!me->IsInCombat())\n+                DoNonCombatActions(diff);\n+\n+            DoPetActions(diff);\n+            //CheckDrainMana(diff);\n+\n+            if (!CheckAttackTarget())\n+                return;\n+\n+            if (IsCasting())\n+                return;\n+\n+            DoPetAttack(diff);\n+        }\n+\n+        void DoPetAttack(uint32 diff)\n+        {\n+            StartAttack(opponent, IsPetMelee());\n+\n+            float dist = me->GetDistance(opponent);\n+            Unit const* u = opponent->GetVictim();\n+            bool canDPS = petOwner->GetBotAI()->HasRole(BOT_ROLE_DPS);\n+\n+            if (myType == BOT_PET_IMP)\n+            {\n+                if (GetSpell(FIREBOLT_1) && canDPS && dist < 30)\n+                {\n+                    me->CastSpell(opponent, GetSpell(FIREBOLT_1), false);\n+                    return;\n+                }\n+            }\n+            else if (myType == BOT_PET_VOIDWALKER)\n+            {\n+                if (IsSpellReady(TORMENT_1, diff, false) && u && u != me && me->IsWithinMeleeRange(opponent) &&\n+                    opponent->CanHaveThreatList() && !CCed(opponent) && !opponent->HasAuraType(SPELL_AURA_MOD_TAUNT) &&\n+                    (!IsTank(u) || (GetHealthPCT(u) < 30 && GetHealthPCT(me) > 20)) && IsInBotParty(u))\n+                {\n+                    me->CastSpell(opponent, GetSpell(TORMENT_1), false);\n+                    SetSpellCooldown(TORMENT_1, 5000);\n+                    return;\n+                }\n+\n+                if (IsSpellReady(SUFFERING_1, diff) &&\n+                    !(u == me && opponent->IsCreature() &&\n+                    (opponent->ToCreature()->IsDungeonBoss() || opponent->ToCreature()->isWorldBoss())))\n+                {\n+                    std::list<Unit*> targets;\n+                    petOwner->GetBotAI()->HelpGetNearbyTargetsList(targets, 9.f, 1, me);\n+                    uint8 count = 0;\n+                    for (Unit const* u : targets)\n+                    {\n+                        if (!(u->GetVictim() && IsTank(u->GetVictim())))\n+                            if (++count > 1)\n+                                break;\n+                    }\n+                    if (count < 2 && u && u != me && !IsSpellReady(TORMENT_1, diff, false) && !IsTank(u) && !CCed(opponent) && dist < 8 &&\n+                        IsInBotParty(u))\n+                    {\n+                        count += 2;\n+                    }\n+\n+                    if (count > 1)\n+                    {\n+                        me->CastSpell(me, GetSpell(SUFFERING_1), false);\n+                        SetSpellCooldown(SUFFERING_1, 120000);\n+                        return;\n+                    }\n+                }\n+            }\n+            else if (myType == BOT_PET_SUCCUBUS)\n+            {\n+                if (IsSpellReady(LASH_OF_PAIN_1, diff, false) && canDPS && me->IsWithinMeleeRange(opponent))\n+                {\n+                    me->CastSpell(opponent, GetSpell(LASH_OF_PAIN_1), false);\n+                    //this could have worked if cast was triggered\n+                    //SetSpellCooldown(LASH_OF_PAIN_1, 6000); //Demonic Power part 1\n+                    return;\n+                }\n+            }\n+            else if (myType == BOT_PET_FELHUNTER)\n+            {\n+                if (IsSpellReady(SHADOW_BITE_1, diff, false) && canDPS && me->IsWithinMeleeRange(opponent))\n+                {\n+                    me->CastSpell(opponent, GetSpell(SHADOW_BITE_1), false);\n+                    SetSpellCooldown(SHADOW_BITE_1, me->GetLevel() >= 35 ? 2000 : 6000); //improved felhunter part 2\n+                    return;\n+                }\n+            }\n+            else if (myType == BOT_PET_FELGUARD)\n+            {\n+                if (IsSpellReady(INTERCEPT_1, diff, false) && canDPS &&\n+                    !HasBotCommandState(BOT_COMMAND_STAY) &&\n+                    !(opponent->IsCreature() && opponent->ToCreature()->isWorldBoss()) &&\n+                    dist > 8 && dist < 25 && !CCed(opponent))\n+                {\n+                    me->CastSpell(opponent, GetSpell(INTERCEPT_1), false);\n+                    SetSpellCooldown(INTERCEPT_1, 30000);\n+                    return;\n+                }\n+\n+                if (IsSpellReady(ANGUISH_1, diff, false) && u && u != me && me->IsWithinMeleeRange(opponent) &&\n+                    opponent->CanHaveThreatList() && !CCed(opponent) && !opponent->HasAuraType(SPELL_AURA_MOD_TAUNT) &&\n+                    (!IsTank(u) || (GetHealthPCT(u) < 30 && GetHealthPCT(me) > 20)) && IsInBotParty(u))\n+                {\n+                    me->CastSpell(opponent, GetSpell(ANGUISH_1), false);\n+                    SetSpellCooldown(ANGUISH_1, 5000);\n+                    return;\n+                }\n+\n+                if (IsSpellReady(CLEAVE_1, diff, false) && canDPS && me->IsWithinMeleeRange(opponent))\n+                {\n+                    me->CastSpell(opponent, GetSpell(CLEAVE_1), false);\n+                    SetSpellCooldown(CLEAVE_1, 6000);\n+                    return;\n+                }\n+            }\n+        }\n+\n+        void OnPetClassSpellGo(SpellInfo const* /*spellInfo*/) override\n+        {\n+        }\n+\n+        void SpellHit(Unit* wcaster, SpellInfo const* spell) override\n+        {\n+            Unit* caster = wcaster->ToUnit();\n+            if (!caster)\n+                return;\n+\n+            OnSpellHit(caster, spell);\n+        }\n+\n+        void SpellHitTarget(Unit* /*wtarget*/, SpellInfo const* /*spell*/) override\n+        {\n+        }\n+\n+        void DamageDealt(Unit* victim, uint32& damage, DamageEffectType damageType, SpellSchoolMask damageSchoolMask) override\n+        {\n+            bot_pet_ai::DamageDealt(victim, damage, damageType, damageSchoolMask);\n+        }\n+\n+        void DamageTaken(Unit* u, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellSchoolMask /*schoolMask*/) override\n+        {\n+            if (!u)\n+                return;\n+            if (!u->IsInCombat() && !me->IsInCombat())\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void OwnerAttackedBy(Unit* u) override\n+        {\n+            if (!u)\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void Reset() override\n+        {\n+        }\n+\n+        void InitPetSpells() override\n+        {\n+            InitSpellMap(FIREBOLT_1);\n+            InitSpellMap(BLOOD_PACT_1);\n+            InitSpellMap(PHASE_SHIFT_1);\n+            //InitSpellMap(FIRE_SHIELD_1);\n+\n+            InitSpellMap(TORMENT_1);\n+            InitSpellMap(SACRIFICE_1);\n+            InitSpellMap(CONSUME_SHADOWS_1);\n+            InitSpellMap(SUFFERING_1);\n+\n+            InitSpellMap(LASH_OF_PAIN_1);\n+            InitSpellMap(SOOTHING_KISS_1);\n+            InitSpellMap(SEDUCTION_1);\n+            InitSpellMap(LESSER_INVISIBILITY_1);\n+\n+            InitSpellMap(DEVOUR_MAGIC_1);\n+            InitSpellMap(FEL_INTELLIGENCE_1);\n+            InitSpellMap(SPELL_LOCK_1);\n+            InitSpellMap(SHADOW_BITE_1);\n+\n+            InitSpellMap(ANGUISH_1);\n+            InitSpellMap(CLEAVE_1);\n+            InitSpellMap(INTERCEPT_1);\n+\n+            InitSpellMap(SOUL_LINK_PET);\n+        }\n+\n+        void ApplyPetPassives() const override\n+        {\n+            uint8 lvl = me->GetLevel();\n+            switch (myType)\n+            {\n+                case BOT_PET_FELGUARD:\n+                    RefreshAura(DEMONIC_FRENZY);\n+                    break;\n+                default:\n+                    break;\n+            }\n+\n+            RefreshAura(AVOIDANCE, lvl >= 60 ? 1 : 0);\n+        }\n+\n+    private:\n+    };\n+};\n+\n+void AddSC_warlock_bot_pets()\n+{\n+    new warlock_pet_bot();\n+}\ndiff --git a/src/server/game/AI/NpcBots/lib/botlogtraits.h b/src/server/game/AI/NpcBots/lib/botlogtraits.h\nnew file mode 100644\nindex 0000000000..d7d5c6f8a9\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/lib/botlogtraits.h\n@@ -0,0 +1,53 @@\n+#ifndef BOT_LOG_TRAITS_H_\n+#define BOT_LOG_TRAITS_H_\n+\n+#include \"botcommon.h\"\n+\n+#include \"StringConvert.h\"\n+\n+namespace NPCBots\n+{\n+\n+template<typename ST, ST Size>\n+inline constexpr std::array<ST, Size> index_array = ([]<typename T, T... I>(std::integer_sequence<T, I...>&&) { return std::array{ I... }; })(std::make_integer_sequence<ST, Size>{});\n+\n+template<typename ST, ST Size>\n+inline constexpr std::array<ST, Size> index_array_rev = ([]<typename T, T... I>(std::integer_sequence<T, I...>&&) {\n+    return std::array{ static_cast<ST>((Size - 1) - I)... }; })(std::make_integer_sequence<ST, Size>{});\n+\n+namespace StringConvert\n+{\n+    template<typename T>\n+    static std::enable_if_t<std::is_integral_v<T> || std::is_floating_point_v<T>, std::string>\n+    ToString(T t)\n+    {\n+        return Bcore::Impl::StringConvertImpl::For<T>::ToString(t);\n+    }\n+\n+    template<typename T>\n+    static std::enable_if_t<std::is_trivially_constructible_v<std::string, T> || std::is_same_v<std::string, T>, std::string>\n+    ToString(T t)\n+    {\n+        return std::string{ t };\n+    }\n+\n+    template<typename T>\n+    static std::enable_if_t<!std::is_trivially_constructible_v<std::string, T> && !std::is_same_v<std::string, T> && std::is_constructible_v<std::string, T>, std::string>\n+    ToString(T t)\n+    {\n+        return std::string(t);\n+    }\n+}\n+\n+template<typename T>\n+concept Stringable = requires(T t) { StringConvert::ToString(t); };\n+\n+template<typename... Ts>\n+concept LoggableCount = sizeof...(Ts) <= MAX_BOT_LOG_PARAMS;\n+\n+template<typename... Ts>\n+concept LoggableArguments = LoggableCount<Ts...> && (Stringable<Ts> && ...);\n+\n+}\n+\n+#endif\ndiff --git a/src/server/game/AI/NpcBots/lib/bottraits.h b/src/server/game/AI/NpcBots/lib/bottraits.h\nnew file mode 100644\nindex 0000000000..2b202e91e4\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/lib/bottraits.h\n@@ -0,0 +1,136 @@\n+#ifndef BOT_TRAITS_H\n+#define BOT_TRAITS_H\n+\n+#include \"botcommon.h\"\n+\n+#include \"Creature.h\"\n+#include \"Log.h\"\n+#include \"SpellAuraEffects.h\"\n+\n+#include <algorithm>\n+#include <array>\n+#include <ranges>\n+#include <tuple>\n+\n+namespace NPCBots\n+{\n+\n+template<typename T, std::size_t... Is>\n+constexpr auto fixed_tuple_helper(std::index_sequence<Is...> const&) -> decltype(std::make_tuple(((void)Is, std::declval<T>())...));\n+\n+template<typename T, size_t N>\n+struct fixed_tuple {\n+    using tuple_type = decltype(fixed_tuple_helper<T>(std::make_index_sequence<N>{}));\n+};\n+\n+template<typename T, std::size_t N, std::size_t... Is>\n+typename fixed_tuple<T,N>::tuple_type to_tuple_helper(std::array<T, N>&& arr, std::index_sequence<Is...>&&)\n+{\n+    return std::make_tuple(arr[Is]...);\n+}\n+\n+template<typename T, size_t N>\n+typename fixed_tuple<T,N>::tuple_type to_tuple(std::array<T, N>&& arr)\n+{\n+    return to_tuple_helper(std::forward<std::array<T, N>>(arr), std::make_index_sequence<N>{});\n+}\n+\n+template<typename T, std::size_t N, std::size_t... Is>\n+typename fixed_tuple<typename T::second_type, N>::tuple_type to_spell_school_affect_bool_tuple_helper(std::array<T, N>&& arr, std::index_sequence<Is...>&&)\n+{\n+    return std::make_tuple(arr[Is].second...);\n+}\n+\n+template<typename T, size_t N>\n+typename fixed_tuple<typename T::second_type, N>::tuple_type to_spell_school_affect_bool_tuple(std::array<T, N>&& arr)\n+{\n+    return to_spell_school_affect_bool_tuple_helper(std::forward<std::array<T, N>>(arr), std::make_index_sequence<N>{});\n+}\n+\n+template<typename T, std::size_t N, std::size_t... Is>\n+std::array<typename T::second_type,N> to_spell_school_affect_bool_arr_helper(std::array<T, N>&& arr, std::index_sequence<Is...>&&)\n+{\n+    return std::array{ arr[Is].second... };\n+}\n+\n+template<typename T, size_t N>\n+std::array<typename T::second_type,N> to_spell_school_affect_bool_arr(std::array<T, N>&& arr)\n+{\n+    return to_spell_school_affect_bool_arr_helper(std::forward<std::array<T, N>>(arr), std::make_index_sequence<N>{});\n+}\n+\n+}\n+\n+template<typename School, typename... Schools>\n+std::enable_if_t<std::conjunction_v<std::is_same<School, SpellSchools>, std::is_same<Schools, SpellSchools>...>,\n+    bool>\n+all_schools_valid(School school, Schools... schools)\n+{\n+    if (school < SPELL_SCHOOL_NORMAL || school >= MAX_SPELL_SCHOOL)\n+        return false;\n+\n+    if constexpr (sizeof...(Schools) > 0)\n+        return all_schools_valid(schools...);\n+    return true;\n+}\n+\n+template<class...Schools>\n+std::enable_if_t<std::conjunction_v<std::is_same<Schools, SpellSchools>...>, std::array<std::pair<SpellSchools, bool>, sizeof...(Schools)>>\n+CanAffectVictimSchools(Unit const* target, Schools... schools)\n+{\n+    static_assert(sizeof...(Schools) > 0, \"need at least 1 spell school to check for\");\n+\n+    using arr_type = std::array<std::pair<SpellSchools, bool>, sizeof...(Schools)>;\n+    using arr_iter_type = typename arr_type::iterator;\n+    arr_type results{ std::pair{schools, true}... };\n+\n+    if (!all_schools_valid(schools...))\n+    {\n+        BOT_LOG_ERROR(\"entities.player\", \"bot_ai::CanAffectVictimSchools(): trying to check invalid spell school, first: {}\", uint32(results.at(0).first));\n+        return results;\n+    }\n+\n+    for (uint8 i = SPELL_SCHOOL_NORMAL; i < MAX_SPELL_SCHOOL; ++i)\n+    {\n+        if (target->IsImmunedToDamageOrSchool(SpellSchoolMask(1u << i)))\n+        {\n+            arr_iter_type ri = std::ranges::find(results, std::pair{ SpellSchools(i), true });\n+            if (ri != results.end())\n+                ri->second = false;\n+        }\n+    }\n+    return results;\n+}\n+\n+template<class...Schools>\n+typename NPCBots::fixed_tuple<bool, sizeof...(Schools)>::tuple_type\n+CanAffectVictimBools(Unit const* target, Schools... schools)\n+{\n+    return NPCBots::to_spell_school_affect_bool_tuple(CanAffectVictimSchools(target, schools...));\n+}\n+\n+template<class...Schools>\n+bool\n+CanAffectVictimAny(Unit const* target, Schools... schools)\n+{\n+    using arr_type = std::array<std::pair<SpellSchools, bool>, sizeof...(Schools)>;\n+    using pair_type = typename arr_type::value_type;\n+\n+    arr_type bools = CanAffectVictimSchools(target, schools...);\n+\n+    return std::ranges::any_of(bools, [](pair_type const& p) { return p.second; });\n+}\n+\n+template<class...Schools>\n+bool\n+CanAffectVictimAll(Unit const* target, Schools... schools)\n+{\n+    using arr_type = std::array<std::pair<SpellSchools, bool>, sizeof...(Schools)>;\n+    using pair_type = typename arr_type::value_type;\n+\n+    arr_type bools = CanAffectVictimSchools(target, schools...);\n+\n+    return std::ranges::all_of(bools, [](pair_type const& p) { return p.second; });\n+}\n+\n+#endif\ndiff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp\nindex 27b390bd07..ffeb3ca8c3 100644\n--- a/src/server/game/AI/SmartScripts/SmartScript.cpp\n+++ b/src/server/game/AI/SmartScripts/SmartScript.cpp\n@@ -212,6 +212,9 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u\n                         talkTarget = target->ToCreature();\n                     }\n                     else\n+                    //npcbot: prevent using bots as talkers\n+                    if (!target->IsNPCBotOrPet())\n+                    //end npcbot\n                         talker = target->ToCreature();\n                     break;\n                 }\ndiff --git a/src/server/game/AuctionHouse/AuctionHouseSearcher.cpp b/src/server/game/AuctionHouse/AuctionHouseSearcher.cpp\nindex 909091d04b..71314533a7 100644\n--- a/src/server/game/AuctionHouse/AuctionHouseSearcher.cpp\n+++ b/src/server/game/AuctionHouse/AuctionHouseSearcher.cpp\n@@ -506,7 +506,14 @@ void SearchableAuctionEntry::SetItemNames()\n                 // Append the suffix (ie: of the Monkey) to the name using localization\n                 // or default enUS if localization is invalid\n                 itemName += ' ';\n+                //npcbot\n+                /*\n+                //end npcbot\n                 itemName += (*suffix)[locdbc_idx >= 0 ? locdbc_idx : LOCALE_enUS];\n+                //npcbot\n+                */\n+                itemName += (*suffix)[locdbc_idx > LOCALE_enUS ? locdbc_idx : LOCALE_enUS];\n+                //end npcbot\n             }\n         }\n \ndiff --git a/src/server/game/Battlegrounds/Arena.cpp b/src/server/game/Battlegrounds/Arena.cpp\nindex a3dc1432e4..c6c3fd9f85 100644\n--- a/src/server/game/Battlegrounds/Arena.cpp\n+++ b/src/server/game/Battlegrounds/Arena.cpp\n@@ -139,6 +139,24 @@ void Arena::AddPlayer(Player* player)\n     }\n }\n \n+//npcbot\n+void Arena::AddBot(Creature* bot)\n+{\n+    ASSERT(bot->IsNPCBot() && !bot->IsFreeBot());\n+\n+    bool const isInBattleground = IsPlayerInBattleground(bot->GetGUID());\n+    Battleground::AddBot(bot);\n+    TeamId botteamid = bot->GetBotOwner()->GetBgTeamId();\n+\n+    if (!isInBattleground)\n+        BotScores[bot->GetEntry()] = new ArenaScore(bot->GetGUID(), botteamid);\n+\n+    //No flags - handled by AI\n+\n+    UpdateArenaWorldState();\n+}\n+//end npcbot\n+\n void Arena::RemovePlayer(Player* /*player*/)\n {\n     if (GetStatus() == STATUS_WAIT_LEAVE)\n@@ -148,6 +166,17 @@ void Arena::RemovePlayer(Player* /*player*/)\n     CheckWinConditions();\n }\n \n+//npcbot\n+void Arena::RemoveBot(ObjectGuid /*guid*/)\n+{\n+    if (GetStatus() == STATUS_WAIT_LEAVE)\n+        return;\n+\n+    UpdateArenaWorldState();\n+    CheckWinConditions();\n+}\n+//end npcbot\n+\n void Arena::FillInitialWorldStates(WorldPackets::WorldState::InitWorldStates& packet)\n {\n     packet.Worldstates.reserve(2);\n@@ -172,6 +201,33 @@ void Arena::HandleKillPlayer(Player* player, Player* killer)\n     CheckWinConditions();\n }\n \n+//npcbot\n+void Arena::HandleBotKillPlayer(Creature* killer, Player* victim)\n+{\n+    if (GetStatus() != STATUS_IN_PROGRESS)\n+        return;\n+    Battleground::HandleBotKillPlayer(killer, victim);\n+    UpdateArenaWorldState();\n+    CheckWinConditions();\n+}\n+void Arena::HandleBotKillBot(Creature* killer, Creature* victim)\n+{\n+    if (GetStatus() != STATUS_IN_PROGRESS)\n+        return;\n+    Battleground::HandleBotKillBot(killer, victim);\n+    UpdateArenaWorldState();\n+    CheckWinConditions();\n+}\n+void Arena::HandlePlayerKillBot(Creature* victim, Player* killer)\n+{\n+    if (GetStatus() != STATUS_IN_PROGRESS)\n+        return;\n+    Battleground::HandlePlayerKillBot(victim, killer);\n+    UpdateArenaWorldState();\n+    CheckWinConditions();\n+}\n+//end npcbot\n+\n void Arena::RemovePlayerAtLeave(Player* player)\n {\n     if (isRated() && GetStatus() == STATUS_IN_PROGRESS)\n@@ -193,6 +249,35 @@ void Arena::RemovePlayerAtLeave(Player* player)\n     Battleground::RemovePlayerAtLeave(player);\n }\n \n+//npcbot\n+void Arena::RemoveBotAtLeave(ObjectGuid guid)\n+{\n+    //if (isRated() && GetStatus() == STATUS_IN_PROGRESS)\n+    //{\n+    //    BattlegroundBotMap::const_iterator itr = m_Bots.find(guid);\n+    //    if (itr != m_Bots.end()) // check if the player was a participant of the match, or only entered through gm command (appear)\n+    //    {\n+    //        // if the player was a match participant, calculate rating\n+    //        uint32 team = itr->second.Team;\n+\n+    //        ArenaTeam* winnerArenaTeam = sArenaTeamMgr->GetArenaTeamById(GetArenaTeamIdForTeam(GetOtherTeam(team)));\n+    //        ArenaTeam* loserArenaTeam = sArenaTeamMgr->GetArenaTeamById(GetArenaTeamIdForTeam(team));\n+\n+    //        // left a rated match while the encounter was in progress, consider as loser\n+    //        if (winnerArenaTeam && loserArenaTeam && winnerArenaTeam != loserArenaTeam)\n+    //        {\n+    //            if (Player* player = _GetPlayer(itr->first, itr->second.OfflineRemoveTime != 0, \"Arena::RemovePlayerAtLeave\"))\n+    //                loserArenaTeam->MemberLost(player, GetArenaMatchmakerRating(GetOtherTeam(team)));\n+    //            else\n+    //                loserArenaTeam->OfflineMemberLost(guid, GetArenaMatchmakerRating(GetOtherTeam(team)));\n+    //        }\n+    //    }\n+    //}\n+\n+    Battleground::RemoveBotAtLeave(guid);\n+}\n+//end npcbot\n+\n void Arena::CheckWinConditions()\n {\n     if (!sScriptMgr->OnBeforeArenaCheckWinConditions(this))\ndiff --git a/src/server/game/Battlegrounds/Arena.h b/src/server/game/Battlegrounds/Arena.h\nindex 75fe9c2269..c1ad6c589c 100644\n--- a/src/server/game/Battlegrounds/Arena.h\n+++ b/src/server/game/Battlegrounds/Arena.h\n@@ -47,6 +47,16 @@ protected:\n     void RemovePlayer(Player* /*player*/) override;\n \n     void FillInitialWorldStates(WorldPackets::WorldState::InitWorldStates& packet) override;\n+\n+    //npcbot\n+    void AddBot(Creature* bot) override;\n+    void RemoveBotAtLeave(ObjectGuid guid) override;\n+    void RemoveBot(ObjectGuid /*guid*/) override;\n+    void HandleBotKillPlayer(Creature* killer, Player* victim) override;\n+    void HandleBotKillBot(Creature* killer, Creature* victim) override;\n+    void HandlePlayerKillBot(Creature* victim, Player* killer) override;\n+    //end npcbot\n+\n     void UpdateArenaWorldState();\n \n     void HandleKillPlayer(Player* player, Player* killer) override;\ndiff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp\nindex 40f342a19b..54052f9141 100644\n--- a/src/server/game/Battlegrounds/Battleground.cpp\n+++ b/src/server/game/Battlegrounds/Battleground.cpp\n@@ -48,6 +48,12 @@\n #include \"WorldPacket.h\"\n #include \"WorldStatePackets.h\"\n \n+//npcbot\n+#include \"bot_ai.h\"\n+#include \"botdatamgr.h\"\n+#include \"botmgr.h\"\n+//end npcbot\n+\n namespace Acore\n {\n     class BattlegroundChatBuilder\n@@ -244,6 +250,11 @@ Battleground::~Battleground()\n \n     for (auto const& itr : PlayerScores)\n         delete itr.second;\n+\n+    //npcbot\n+    for (BattlegroundScoreMap::const_iterator itr = BotScores.begin(); itr != BotScores.end(); ++itr)\n+        delete itr->second;\n+    //end npcbot\n }\n \n void Battleground::Update(uint32 diff)\n@@ -259,6 +270,9 @@ void Battleground::Update(uint32 diff)\n     if (!PreUpdateImpl(diff))\n         return;\n \n+    //npcbot\n+    if (m_Bots.empty())\n+    //end npcbot\n     if (!GetPlayersSize())\n     {\n         //BG is empty\n@@ -279,6 +293,17 @@ void Battleground::Update(uint32 diff)\n         return;\n     }\n \n+    //npcbot: end BG if no real players exist\n+    if (GetStatus() != STATUS_WAIT_LEAVE)\n+    {\n+        if (m_Players.empty() && !m_Bots.empty())\n+        {\n+            EndNow();\n+            return;\n+        }\n+    }\n+    //end npcbot\n+\n     switch (GetStatus())\n     {\n         case STATUS_WAIT_JOIN:\n@@ -370,6 +395,28 @@ inline void Battleground::_ProcessResurrect(uint32 diff)\n                 Creature* sh = nullptr;\n                 for (ObjectGuid const& guid : itr->second)\n                 {\n+                    //npcbot\n+                    if (guid.IsCreature())\n+                    {\n+                        if (Creature const* cbot = BotDataMgr::FindBot(guid.GetEntry()))\n+                        {\n+                            Creature* bot = const_cast<Creature*>(cbot);\n+                            ASSERT(bot->IsInWorld());\n+                            if (!sh)\n+                                sh = bot->GetMap()->GetCreature(itr->first);\n+                            if (sh)\n+                            {\n+                                if (bot->GetExactDist(sh) > 15.0f)\n+                                    bot->NearTeleportTo(*sh);\n+                                sh->CastSpell(sh, SPELL_SPIRIT_HEAL, true);\n+                            }\n+                            bot->CastSpell(bot, SPELL_RESURRECTION_VISUAL, true);\n+                            m_ResurrectQueue.push_back(guid);\n+                        }\n+                        continue;\n+                    }\n+                    //end npcbot\n+\n                     Player* player = ObjectAccessor::FindPlayer(guid);\n                     if (!player)\n                         continue;\n@@ -402,6 +449,15 @@ inline void Battleground::_ProcessResurrect(uint32 diff)\n     {\n         for (ObjectGuid const& guid : m_ResurrectQueue)\n         {\n+            //npcbot\n+            if (guid.IsCreature())\n+            {\n+                if (Creature const* cbot = BotDataMgr::FindBot(guid.GetEntry()))\n+                    cbot->GetBotAI()->UpdateReviveTimer(std::numeric_limits<uint32>::max());\n+                continue;\n+            }\n+            //end npcbot\n+\n             Player* player = ObjectAccessor::FindPlayer(guid);\n             if (!player)\n                 continue;\n@@ -678,6 +734,17 @@ inline void Battleground::_ProcessJoin(uint32 diff)\n \n             sScriptMgr->OnBattlegroundStart(this);\n         }\n+\n+        //npcbot: activate bots\n+        for (auto const& kv : m_Bots)\n+        {\n+            if (Creature const* bot = BotDataMgr::FindBot(kv.first.GetEntry()))\n+            {\n+                if (bot->IsNPCBot() && bot->IsWandererBot())\n+                    bot->GetBotAI()->RemoveBotCommandState(BOT_COMMAND_STAY);\n+            }\n+        }\n+        //end npcbot\n     }\n }\n \n@@ -691,6 +758,15 @@ inline void Battleground::_ProcessLeave(uint32 diff)\n     if (m_EndTime <= 0)\n     {\n         m_EndTime = TIME_TO_AUTOREMOVE; // pussywizard: 0 -> TIME_TO_AUTOREMOVE\n+        //npcbot\n+        BattlegroundBotMap::iterator bitr, bnext;\n+        for (bitr = m_Bots.begin(); bitr != m_Bots.end(); bitr = bnext)\n+        {\n+            bnext = bitr;\n+            ++bnext;\n+            RemoveBotAtLeave(bitr->first);\n+        }\n+        //end npcbot\n         BattlegroundPlayerMap::iterator itr, next;\n         for (itr = m_Players.begin(); itr != m_Players.end(); itr = next)\n         {\n@@ -761,6 +837,12 @@ void Battleground::RemoveAuraOnTeam(uint32 spellId, TeamId teamId)\n     for (BattlegroundPlayerMap::const_iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr)\n         if (itr->second->GetBgTeamId() == teamId)\n             itr->second->RemoveAura(spellId);\n+    //npcbot\n+    for (auto const& kv : m_Bots)\n+        if (kv.second.Team == teamId)\n+            if (Creature* bot = GetBgMap()->GetCreature(kv.first))\n+                bot->CastSpell(bot, spellId, true);\n+    //end npcbot\n }\n \n void Battleground::YellToAll(Creature* creature, char const* text, uint32 language)\n@@ -886,6 +968,31 @@ void Battleground::EndBattleground(PvPTeamId winnerTeamId)\n     WorldPacket pvpLogData;\n     BuildPvPLogDataPacket(pvpLogData);\n \n+    //npcbot: despawn generated bots immediately\n+    BattlegroundBotMap::iterator bitr, bnext;\n+    for (bitr = m_Bots.begin(); bitr != m_Bots.end(); bitr = bnext)\n+    {\n+        bnext = bitr;\n+        ++bnext;\n+        if (bitr->first.IsCreature())\n+        {\n+            if (Creature const* bot = BotDataMgr::FindBot(bitr->first.GetEntry()))\n+            {\n+                if (!bot->IsAlive())\n+                    BotMgr::ReviveBot(const_cast<Creature*>(bot));\n+                else\n+                {\n+                    bot->GetBotAI()->UnsummonAll(false);\n+                    const_cast<Creature*>(bot)->InterruptNonMeleeSpells(true);\n+                    const_cast<Creature*>(bot)->RemoveAllControlled();\n+                    const_cast<Creature*>(bot)->SetUnitFlag(UNIT_FLAG_IMMUNE);\n+                    const_cast<Creature*>(bot)->AddUnitState(UNIT_STATE_STUNNED);\n+                }\n+            }\n+        }\n+    }\n+    //end npcbot\n+\n     for (auto const& [playerGuid, player] : m_Players)\n     {\n         TeamId bgTeamId = player->GetBgTeamId();\n@@ -1073,6 +1180,15 @@ void Battleground::RemovePlayerAtLeave(Player* player)\n         player->SpawnCorpseBones();\n     }\n \n+    //npcbot\n+    if (player->HaveBot())\n+    {\n+        BotMap const* map = player->GetBotMgr()->GetBotMap();\n+        for (BotMap::const_iterator itr = map->begin(); itr != map->end(); ++itr)\n+            RemoveBotAtLeave(itr->first);\n+    }\n+    //end npcbot\n+\n     player->RemoveAurasByType(SPELL_AURA_MOUNTED);\n \n     // GetStatus might be changed in RemovePlayer - define it here\n@@ -1101,9 +1217,13 @@ void Battleground::RemovePlayerAtLeave(Player* player)\n \n         // remove from raid group if player is member\n         if (Group* group = GetBgRaid(teamId))\n+        {\n             if (group->IsMember(player->GetGUID()))\n+            {\n                 if (!group->RemoveMember(player->GetGUID())) // group was disbanded\n                     SetBgRaid(teamId, nullptr);\n+            }\n+        }\n \n         // let others know\n         sBattlegroundMgr->BuildPlayerLeftBattlegroundPacket(&data, player->GetGUID());\n@@ -1136,6 +1256,83 @@ void Battleground::RemovePlayerAtLeave(Player* player)\n     sScriptMgr->OnBattlegroundRemovePlayerAtLeave(this, player);\n }\n \n+//npcbot\n+void Battleground::RemoveBotAtLeave(ObjectGuid guid)\n+{\n+    TeamId teamId = GetBotTeamId(guid);\n+\n+    // check if the player was a participant of the match, or only entered through gm command\n+    bool participant = false;\n+    BattlegroundBotMap::iterator itr = m_Bots.find(guid);\n+    if (itr != m_Bots.end())\n+    {\n+        UpdatePlayersCountByTeam(teamId, true); // -1 player\n+        m_Bots.erase(itr);\n+        participant = true;\n+    }\n+\n+    // delete player score if exists\n+    auto const& itr2 = BotScores.find(guid.GetEntry());\n+    if (itr2 != BotScores.end())\n+    {\n+        delete itr2->second;\n+        BotScores.erase(itr2);\n+    }\n+\n+    RemoveBotFromResurrectQueue(guid);\n+\n+    // BG subclass specific code\n+    RemoveBot(guid);\n+\n+    if (participant)\n+    {\n+        // remove from raid group if player is member\n+        if (Group* group = GetBgRaid(teamId))\n+        {\n+            if (group->IsMember(guid))\n+            {\n+                if (!group->RemoveMember(guid)) // group was disbanded\n+                    SetBgRaid(teamId, nullptr);\n+            }\n+        }\n+\n+        // let others know\n+        WorldPacket data;\n+        sBattlegroundMgr->BuildPlayerLeftBattlegroundPacket(&data, guid);\n+        SendPacketToTeam(teamId, &data, nullptr, false);\n+\n+        DecreaseInvitedCount(teamId);\n+\n+        //we should update battleground queue, but only if bg isn't ending\n+        if (isBattleground() && GetStatus() < STATUS_WAIT_LEAVE)\n+        {\n+            BattlegroundTypeId bgTypeId = GetBgTypeID();\n+            BattlegroundQueueTypeId bgQueueTypeId = BattlegroundMgr::BGQueueTypeId(bgTypeId, GetArenaType());\n+\n+            // a player has left the battleground, so there are free slots -> add to queue\n+            AddToBGFreeSlotQueue();\n+            sBattlegroundMgr->ScheduleQueueUpdate(0, 0, bgQueueTypeId, bgTypeId, GetBracketId());\n+        }\n+    }\n+\n+    if (Creature const* bot = BotDataMgr::FindBot(guid.GetEntry()))\n+    {\n+        if (bot->HasAuraType(SPELL_AURA_SPIRIT_OF_REDEMPTION))\n+            const_cast<Creature*>(bot)->RemoveAurasByType(SPELL_AURA_MOD_SHAPESHIFT);\n+        const_cast<Creature*>(bot)->RemoveAurasByType(SPELL_AURA_MOUNTED);\n+        const_cast<Creature*>(bot)->RemoveUnitFlag(UNIT_FLAG_IMMUNE);\n+        const_cast<Creature*>(bot)->ClearUnitState(UNIT_STATE_STUNNED);\n+\n+        bot->GetBotAI()->SetBG(nullptr);\n+        if (bot->IsWandererBot())\n+        {\n+            bot->GetBotAI()->canUpdate = false;\n+            BotDataMgr::DespawnWandererBot(guid.GetEntry());\n+        }\n+    }\n+}\n+//end npcbot\n+\n // this method is called when creating bg\n void Battleground::Init()\n {\n@@ -1158,12 +1355,19 @@ void Battleground::Init()\n     _InBGFreeSlotQueue = false;\n \n     m_Players.clear();\n+    m_Bots.clear();\n \n     for (auto const& itr : PlayerScores)\n         delete itr.second;\n \n     PlayerScores.clear();\n \n+    //npcbot\n+    for (auto const& itr2 : BotScores)\n+        delete itr2.second;\n+    BotScores.clear();\n+    //end npcbot\n+\n     for (auto& itr : _arenaTeamScores)\n         itr.Reset();\n \n@@ -1204,6 +1408,19 @@ void Battleground::AddPlayer(Player* player)\n \n     UpdatePlayersCountByTeam(teamId, false);                  // +1 player\n \n+    //npcbot\n+    if (player->GetGroup() && player->HaveBot())\n+    {\n+        BotMap const* map = player->GetBotMgr()->GetBotMap();\n+        for (BotMap::const_iterator itr = map->begin(); itr != map->end(); ++itr)\n+        {\n+            Creature* bot = itr->second;\n+            if (bot && player->GetGroup()->IsMember(itr->first))\n+                AddBot(bot);\n+        }\n+    }\n+    //end npcbot\n+\n     WorldPacket data;\n     sBattlegroundMgr->BuildPlayerJoinedBattlegroundPacket(&data, player);\n     SendPacketToTeam(teamId, &data, player, false);\n@@ -1250,6 +1467,30 @@ void Battleground::AddPlayer(Player* player)\n     LOG_DEBUG(\"bg.battleground\", \"BATTLEGROUND: Player {} joined the battle.\", player->GetName());\n }\n \n+//npcbot\n+void Battleground::AddBot(Creature* bot)\n+{\n+    ObjectGuid guid = bot->GetGUID();\n+    TeamId teamId = !bot->IsFreeBot() ? bot->GetBotOwner()->GetBgTeamId() : BotDataMgr::GetTeamIdForFaction(bot->GetFaction());\n+\n+    // Add to list/maps\n+    BattlegroundBot bb;\n+    bb.Team = teamId;\n+    m_Bots[guid] = bb;\n+\n+    UpdatePlayersCountByTeam(teamId, false);                  // +1 player\n+\n+    WorldPacket data;\n+    sBattlegroundMgr->BuildPlayerJoinedBattlegroundPacket(&data, (Player*)bot);\n+    SendPacketToTeam(teamId, &data, nullptr, false);\n+\n+    AddOrSetBotToCorrectBgGroup(bot, teamId);\n+\n+    bot->GetBotAI()->SetBG(this);\n+    bot->GetBotAI()->OnBotEnterBattleground();\n+}\n+//end npcbot\n+\n // this method adds player to his team's bg group, or sets his correct group if player is already in bg group\n void Battleground::AddOrSetPlayerToCorrectBgGroup(Player* player, TeamId teamId)\n {\n@@ -1286,6 +1527,31 @@ void Battleground::AddOrSetPlayerToCorrectBgGroup(Player* player, TeamId teamId)\n     }\n }\n \n+//end npcbot\n+void Battleground::AddOrSetBotToCorrectBgGroup(Creature* bot, TeamId teamId)\n+{\n+    ObjectGuid botGuid = bot->GetGUID();\n+    Group* group = GetBgRaid(teamId);\n+    if (!group)                                      // first player joined\n+    {\n+        group = new Group;\n+        SetBgRaid(teamId, group);\n+        group->Create(bot);\n+        sGroupMgr->AddGroup(group);\n+    }\n+    else\n+    {\n+        if (group->IsMember(botGuid))\n+        {\n+            uint8 subgroup = group->GetMemberGroup(botGuid);\n+            bot->SetBattlegroundOrBattlefieldRaid(group, subgroup);\n+        }\n+        else\n+            group->AddMember(bot);\n+    }\n+}\n+//npcbot\n+\n // This method should be called only once ... it adds pointer to queue\n void Battleground::AddToBGFreeSlotQueue()\n {\n@@ -1394,7 +1660,12 @@ void Battleground::BuildPvPLogDataPacket(WorldPacket& data)\n {\n     uint8 type = (isArena() ? 1 : 0);\n \n+    //npcbot\n+    /*\n     data.Initialize(MSG_PVP_LOG_DATA, 1 + 1 + 4 + 40 * GetPlayerScores()->size());\n+    */\n+    data.Initialize(MSG_PVP_LOG_DATA, 1 + 1 + 4 + 40 * (GetPlayerScoresSize() + GetBotScoresSize()));\n+    //end npcbot\n     data << uint8(type); // type (battleground = 0 / arena = 1)\n \n     if (type) // arena\n@@ -1414,7 +1685,14 @@ void Battleground::BuildPvPLogDataPacket(WorldPacket& data)\n     else\n         data << uint8(0);                      // bg not ended\n \n+    //npcbot\n+    /*\n     data << uint32(GetPlayerScores()->size());\n+    */\n+    data << uint32(GetPlayerScoresSize() + GetBotScoresSize());\n+    for (auto const& bscore : BotScores)\n+        bscore.second->AppendToPacket(data);\n+    //end npcbot\n \n     for (auto const& score : PlayerScores)\n         score.second->AppendToPacket(data);\n@@ -1434,6 +1712,18 @@ bool Battleground::UpdatePlayerScore(Player* player, uint32 type, uint32 value,\n     return true;\n }\n \n+//npcbot\n+bool Battleground::UpdateBotScore(Creature const* bot, uint32 type, uint32 value)\n+{\n+    BattlegroundScoreMap::const_iterator itr = BotScores.find(bot->GetEntry());\n+    if (itr == BotScores.end()) // bot not found...\n+        return false;\n+\n+    itr->second->UpdateScore(type, value);\n+    return true;\n+}\n+//end npcbot\n+\n void Battleground::AddPlayerToResurrectQueue(ObjectGuid npc_guid, ObjectGuid player_guid)\n {\n     m_ReviveQueue[npc_guid].push_back(player_guid);\n@@ -1457,6 +1747,23 @@ void Battleground::RemovePlayerFromResurrectQueue(Player* player)\n             }\n }\n \n+//npcbot\n+void Battleground::RemoveBotFromResurrectQueue(ObjectGuid guid)\n+{\n+    for (auto& kv : m_ReviveQueue)\n+    {\n+        for (GuidVector::iterator itr2 = kv.second.begin(); itr2 != kv.second.end(); ++itr2)\n+        {\n+            if (*itr2 == guid)\n+            {\n+                kv.second.erase(itr2);\n+                return;\n+            }\n+        }\n+    }\n+}\n+//end npcbot\n+\n void Battleground::RelocateDeadPlayers(ObjectGuid queueIndex)\n {\n     // Those who are waiting to resurrect at this node are taken to the closest own node's graveyard\n@@ -1464,8 +1771,25 @@ void Battleground::RelocateDeadPlayers(ObjectGuid queueIndex)\n     if (!ghostList.empty())\n     {\n         GraveyardStruct const* closestGrave = nullptr;\n+        //npcbot\n+        GraveyardStruct const* closestBotGrave = nullptr;\n+        //end npcbot\n         for (ObjectGuid const& guid : ghostList)\n         {\n+            //npcbot\n+            if (guid.IsCreature())\n+            {\n+                if (Creature const* bot = BotDataMgr::FindBot(guid.GetEntry()))\n+                {\n+                    if (!closestBotGrave)\n+                        closestBotGrave = GetClosestGraveyardForBot(const_cast<Creature*>(bot));\n+                    if (closestBotGrave)\n+                        const_cast<Creature*>(bot)->NearTeleportTo(closestBotGrave->x, closestBotGrave->y, closestBotGrave->z, bot->GetOrientation());\n+                }\n+                continue;\n+            }\n+            //end npcbot\n+\n             Player* player = ObjectAccessor::FindPlayer(guid);\n             if (!player)\n                 continue;\n@@ -1811,6 +2135,18 @@ void Battleground::HandleKillPlayer(Player* victim, Player* killer)\n             if (creditedPlayer->GetBgTeamId() == killer->GetBgTeamId() && (creditedPlayer == killer || creditedPlayer->IsAtGroupRewardDistance(victim)))\n                 UpdatePlayerScore(creditedPlayer, SCORE_HONORABLE_KILLS, 1);\n         }\n+\n+        //npcbot\n+        TeamId team = killer->GetBgTeamId();\n+        for (auto const& kv : m_Bots)\n+        {\n+            if (kv.second.Team != team || kv.first == killer->GetGUID())\n+                continue;\n+            Creature const* teamedBot = BotDataMgr::FindBot(kv.first.GetEntry());\n+            if (teamedBot && teamedBot->GetDistance(victim) <= sWorld->getFloatConfig(CONFIG_GROUP_XP_DISTANCE))\n+                UpdateBotScore(teamedBot, SCORE_HONORABLE_KILLS, 1);\n+        }\n+        //end npcbot\n     }\n \n     if (!isArena())\n@@ -1821,6 +2157,117 @@ void Battleground::HandleKillPlayer(Player* victim, Player* killer)\n     }\n }\n \n+//npcbot\n+void Battleground::HandleBotKillPlayer(Creature* killer, Player* victim)\n+{\n+    UpdatePlayerScore(victim, SCORE_DEATHS, 1);\n+    // Add +1 kills to group and +1 killing_blows to killer\n+    if (killer)\n+    {\n+        TeamId team = GetBotTeamId(killer->GetGUID());\n+\n+        UpdateBotScore(killer, SCORE_HONORABLE_KILLS, 1);\n+        UpdateBotScore(killer, SCORE_KILLING_BLOWS, 1);\n+\n+        for (BattlegroundPlayerMap::const_iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr)\n+        {\n+            Player* creditedPlayer = itr->second;\n+            if (creditedPlayer->GetBgTeamId() == team && creditedPlayer->IsAtGroupRewardDistance(victim))\n+                UpdatePlayerScore(creditedPlayer, SCORE_HONORABLE_KILLS, 1);\n+        }\n+\n+        for (auto const& kv : m_Bots)\n+        {\n+            if (kv.second.Team != team || kv.first == killer->GetGUID())\n+                continue;\n+            Creature const* teamedBot = BotDataMgr::FindBot(kv.first.GetEntry());\n+            if (teamedBot && teamedBot->GetDistance(victim) <= sWorld->getFloatConfig(CONFIG_GROUP_XP_DISTANCE))\n+                UpdateBotScore(teamedBot, SCORE_HONORABLE_KILLS, 1);\n+        }\n+    }\n+        RewardXPAtKill(killer, victim);\n+}\n+void Battleground::HandleBotKillBot(Creature* killer, Creature* victim)\n+{\n+    UpdateBotScore(victim, SCORE_DEATHS, 1);\n+    // Add +1 kills to group and +1 killing_blows to killer\n+    if (killer)\n+    {\n+        TeamId team = GetBotTeamId(killer->GetGUID());\n+\n+        UpdateBotScore(killer, SCORE_HONORABLE_KILLS, 1);\n+        UpdateBotScore(killer, SCORE_KILLING_BLOWS, 1);\n+\n+        for (BattlegroundPlayerMap::const_iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr)\n+        {\n+            Player* creditedPlayer = itr->second;\n+            if (creditedPlayer->GetBgTeamId() == team && creditedPlayer->IsAtGroupRewardDistance(victim))\n+                UpdatePlayerScore(creditedPlayer, SCORE_HONORABLE_KILLS, 1);\n+        }\n+\n+        for (auto const& kv : m_Bots)\n+        {\n+            if (kv.second.Team != team || kv.first == killer->GetGUID())\n+                continue;\n+            Creature const* teamedBot = BotDataMgr::FindBot(kv.first.GetEntry());\n+            if (teamedBot && teamedBot->GetDistance(victim) <= sWorld->getFloatConfig(CONFIG_GROUP_XP_DISTANCE))\n+                UpdateBotScore(teamedBot, SCORE_HONORABLE_KILLS, 1);\n+        }\n+    }\n+    if (!isArena() && !victim->GetLootRecipient()) // Prevent double reward (AI->KilledUnit (killing blow) and Unit::Kill (recipient))\n+        RewardXPAtKill(killer, victim);\n+}\n+void Battleground::HandlePlayerKillBot(Creature* victim, Player* killer)\n+{\n+    UpdateBotScore(victim, SCORE_DEATHS, 1);\n+    // Add +1 kills to group and +1 killing_blows to killer\n+    if (killer)\n+    {\n+        TeamId team = killer->GetBgTeamId();\n+\n+        UpdatePlayerScore(killer, SCORE_HONORABLE_KILLS, 1);\n+        UpdatePlayerScore(killer, SCORE_KILLING_BLOWS, 1);\n+\n+        for (BattlegroundPlayerMap::const_iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr)\n+        {\n+            Player* creditedPlayer = itr->second;\n+            if (creditedPlayer == killer)\n+                continue;\n+\n+            if (creditedPlayer->GetBgTeamId() == killer->GetBgTeamId() && creditedPlayer->IsAtGroupRewardDistance(victim))\n+                UpdatePlayerScore(creditedPlayer, SCORE_HONORABLE_KILLS, 1);\n+        }\n+\n+        for (auto const& kv : m_Bots)\n+        {\n+            if (kv.second.Team != team || kv.first == killer->GetGUID())\n+                continue;\n+            Creature const* teamedBot = BotDataMgr::FindBot(kv.first.GetEntry());\n+            if (teamedBot && teamedBot->GetDistance(victim) <= sWorld->getFloatConfig(CONFIG_GROUP_XP_DISTANCE))\n+                UpdateBotScore(teamedBot, SCORE_HONORABLE_KILLS, 1);\n+        }\n+    }\n+    if (!isArena())\n+        RewardXPAtKill(killer, victim);\n+}\n+\n+TeamId Battleground::GetBotTeamId(ObjectGuid guid) const\n+{\n+    BattlegroundBotMap::const_iterator itr = m_Bots.find(guid);\n+    if (itr != m_Bots.end())\n+        return itr->second.Team;\n+    return TEAM_NEUTRAL;\n+}\n+\n+TeamId Battleground::GetPlayerTeamId(ObjectGuid guid) const\n+{\n+    BattlegroundPlayerMap::const_iterator itr = m_Players.find(guid);\n+    if (itr != m_Players.end())\n+        return itr->second->GetTeamId();\n+    return TEAM_NEUTRAL;\n+}\n+//end npcbot\n+\n TeamId Battleground::GetOtherTeamId(TeamId teamId)\n {\n     return teamId != TEAM_NEUTRAL ? (teamId == TEAM_ALLIANCE ? TEAM_HORDE : TEAM_ALLIANCE) : TEAM_NEUTRAL;\n@@ -1828,6 +2275,14 @@ TeamId Battleground::GetOtherTeamId(TeamId teamId)\n \n bool Battleground::IsPlayerInBattleground(ObjectGuid guid) const\n {\n+    //npcbot\n+    if (guid.IsCreature())\n+    {\n+        BattlegroundBotMap::const_iterator bitr = m_Bots.find(guid);\n+        if (bitr != m_Bots.end())\n+            return true;\n+    }\n+    //end npcbot\n     BattlegroundPlayerMap::const_iterator itr = m_Players.find(guid);\n     if (itr != m_Players.end())\n         return true;\n@@ -1852,6 +2307,17 @@ void Battleground::PlayerAddedToBGCheckIfBGIsRunning(Player* player)\n uint32 Battleground::GetAlivePlayersCountByTeam(TeamId teamId) const\n {\n     uint32 count = 0;\n+    //npcbot\n+    for (BattlegroundBotMap::const_iterator itr = m_Bots.begin(); itr != m_Bots.end(); ++itr)\n+    {\n+        if (GetBotTeamId(itr->first) == teamId)\n+        {\n+            Creature const* bot = BotDataMgr::FindBot(itr->first.GetEntry());\n+            if (bot && bot->IsAlive() && !bot->HasByteFlag(UNIT_FIELD_BYTES_2, 3, FORM_SPIRITOFREDEMPTION))\n+                ++count;\n+        }\n+    }\n+    //end npcbot\n     for (BattlegroundPlayerMap::const_iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr)\n         if (itr->second->IsAlive() && !itr->second->HasByteFlag(UNIT_FIELD_BYTES_2, 3, FORM_SPIRITOFREDEMPTION) && itr->second->GetBgTeamId() == teamId)\n             ++count;\n@@ -1891,6 +2357,13 @@ GraveyardStruct const* Battleground::GetClosestGraveyard(Player* player)\n     return sGraveyard->GetClosestGraveyard(player, player->GetBgTeamId());\n }\n \n+//npcbot\n+GraveyardStruct const* Battleground::GetClosestGraveyardForBot(Creature* bot) const\n+{\n+    return sGraveyard->GetClosestGraveyard((Player*)bot, GetBotTeamId(bot->GetGUID()));\n+}\n+//end npcbot\n+\n void Battleground::SetBracket(PvPDifficultyEntry const* bracketEntry)\n {\n     m_IsTemplate = false;\n@@ -1904,6 +2377,74 @@ void Battleground::StartTimedAchievement(AchievementCriteriaTimedTypes type, uin\n         itr->second->StartTimedAchievement(type, entry);\n }\n \n+//npcbot\n+void Battleground::RewardXPAtKill(Player* killer, Creature* victim)\n+{\n+    if (sWorld->getBoolConfig(CONFIG_BG_XP_FOR_KILL) && killer && victim)\n+        killer->RewardPlayerAndGroupAtKill(victim, true);\n+}\n+\n+void Battleground::RewardXPAtKill(Creature* killer, Player* victim)\n+{\n+    if (sWorld->getBoolConfig(CONFIG_BG_XP_FOR_KILL) && killer && victim)\n+    {\n+        Player* pkiller = killer->IsFreeBot() ? nullptr : killer->GetBotOwner();\n+        if (!pkiller)\n+        {\n+            TeamId team = BotDataMgr::GetTeamIdForFaction(killer->GetFaction());\n+            if (Group const* group = GetBgRaid(team))\n+            {\n+                float mindist = SIZE_OF_GRIDS;\n+                for (GroupReference const* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())\n+                {\n+                    if (Player* gPlayer = itr->GetSource())\n+                    {\n+                        float dist = gPlayer->GetExactDist2d(victim);\n+                        if (dist < mindist)\n+                        {\n+                            mindist = dist;\n+                            pkiller = gPlayer;\n+                        }\n+                    }\n+                }\n+            }\n+        }\n+        if (pkiller && pkiller->IsAtGroupRewardDistance(victim))\n+            pkiller->RewardPlayerAndGroupAtKill(victim, true);\n+    }\n+}\n+\n+void Battleground::RewardXPAtKill(Creature* killer, Creature* victim)\n+{\n+    if (sWorld->getBoolConfig(CONFIG_BG_XP_FOR_KILL) && killer && victim)\n+    {\n+        Player* pkiller = killer->IsFreeBot() ? nullptr : killer->GetBotOwner();\n+        if (!pkiller)\n+        {\n+            TeamId team = BotDataMgr::GetTeamIdForFaction(killer->GetFaction());\n+            if (Group const* group = GetBgRaid(team))\n+            {\n+                float mindist = SIZE_OF_GRIDS;\n+                for (GroupReference const* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())\n+                {\n+                    if (Player* gPlayer = itr->GetSource())\n+                    {\n+                        float dist = gPlayer->GetExactDist2d(victim);\n+                        if (dist < mindist)\n+                        {\n+                            mindist = dist;\n+                            pkiller = gPlayer;\n+                        }\n+                    }\n+                }\n+            }\n+        }\n+        if (pkiller && pkiller->IsAtGroupRewardDistance(victim))\n+            pkiller->RewardPlayerAndGroupAtKill(victim, true);\n+    }\n+}\n+//end npcbot\n+\n uint32 Battleground::GetTeamScore(TeamId teamId) const\n {\n     if (teamId == TEAM_ALLIANCE || teamId == TEAM_HORDE)\ndiff --git a/src/server/game/Battlegrounds/Battleground.h b/src/server/game/Battlegrounds/Battleground.h\nindex b22cdc143a..0103e87fd2 100644\n--- a/src/server/game/Battlegrounds/Battleground.h\n+++ b/src/server/game/Battlegrounds/Battleground.h\n@@ -194,6 +194,13 @@ enum BattlegroundStatus\n     STATUS_WAIT_LEAVE               = 4                      // means some faction has won BG and it is ending\n };\n \n+//npcbot\n+struct BattlegroundBot\n+{\n+    TeamId Team;                                             // bot's team\n+};\n+//end npcbot\n+\n struct BattlegroundObjectInfo\n {\n     BattlegroundObjectInfo()  = default;\n@@ -406,6 +413,10 @@ public:\n     [[nodiscard]] bool isRated() const        { return m_IsRated; }\n \n     typedef std::map<ObjectGuid, Player*> BattlegroundPlayerMap;\n+    //npcbot\n+    typedef std::map<ObjectGuid, BattlegroundBot> BattlegroundBotMap;\n+    [[nodiscard]] BattlegroundBotMap const& GetBots() const { return m_Bots; }\n+    //end npcbot\n     [[nodiscard]] BattlegroundPlayerMap const& GetPlayers() const { return m_Players; }\n     [[nodiscard]] uint32 GetPlayersSize() const { return m_Players.size(); }\n \n@@ -528,6 +539,29 @@ public:\n \n     void AddOrSetPlayerToCorrectBgGroup(Player* player, TeamId teamId);\n \n+    //npcbot\n+    [[nodiscard]] std::size_t GetBotScoresSize() const { return BotScores.size(); }\n+    void RemoveBotFromResurrectQueue(ObjectGuid guid);\n+    virtual void AddBot(Creature* bot);\n+    virtual void RemoveBotAtLeave(ObjectGuid guid);\n+    virtual bool UpdateBotScore(Creature const* bot, uint32 type, uint32 value);\n+    void AddOrSetBotToCorrectBgGroup(Creature* bot, TeamId teamId);\n+    void RewardXPAtKill(Player* killer, Creature* victim);\n+    void RewardXPAtKill(Creature* killer, Player* victim);\n+    void RewardXPAtKill(Creature* killer, Creature* victim);\n+    virtual void HandleBotKillPlayer(Creature* killer, Player* victim);\n+    virtual void HandleBotKillBot(Creature* killer, Creature* victim);\n+    virtual void HandlePlayerKillBot(Creature* victim, Player* killer);\n+    virtual void HandleBotKillUnit(Creature* /*killer*/, Creature* /*victim*/) { }\n+    TeamId GetBotTeamId(ObjectGuid guid) const;\n+    TeamId GetPlayerTeamId(ObjectGuid guid) const;\n+    virtual GraveyardStruct const* GetClosestGraveyardForBot(Creature* bot) const;\n+    virtual void RemoveBot(ObjectGuid /*guid*/) {}\n+    virtual void EventBotDroppedFlag(Creature* /*bot*/) { }\n+    virtual void EventBotClickedOnFlag(Creature* /*bot*/, GameObject* /*target_obj*/) { }\n+    virtual void HandleBotAreaTrigger(Creature* /*bot*/, uint32 /*trigger*/) { }\n+    //end npcbot\n+\n     virtual void RemovePlayerAtLeave(Player* player);\n     // can be extended in in BG subclass\n \n@@ -619,6 +653,10 @@ protected:\n \n     // Scorekeeping\n     BattlegroundScoreMap PlayerScores;                // Player scores\n+    //npcbot\n+    BattlegroundScoreMap BotScores;\n+    BattlegroundBotMap m_Bots;\n+    //end npcbot\n     // must be implemented in BG subclass\n     virtual void RemovePlayer(Player* /*player*/) {}\n \ndiff --git a/src/server/game/Battlegrounds/BattlegroundMgr.h b/src/server/game/Battlegrounds/BattlegroundMgr.h\nindex 313bee8f0d..c112b073cf 100644\n--- a/src/server/game/Battlegrounds/BattlegroundMgr.h\n+++ b/src/server/game/Battlegrounds/BattlegroundMgr.h\n@@ -182,6 +182,11 @@ private:\n     typedef std::map<uint32 /*mapId*/, BattlegroundTemplate*> BattlegroundMapTemplateContainer;\n     BattlegroundTemplateMap _battlegroundTemplates;\n     BattlegroundMapTemplateContainer _battlegroundMapTemplates;\n+\n+    //npcbot\n+public:\n+    BattlegroundDataContainer const& GetBgDataStore() const { return bgDataStore; }\n+    //end npcbot\n };\n \n #define sBattlegroundMgr BattlegroundMgr::instance()\ndiff --git a/src/server/game/Battlegrounds/BattlegroundQueue.cpp b/src/server/game/Battlegrounds/BattlegroundQueue.cpp\nindex 97a529327d..599999ae0e 100644\n--- a/src/server/game/Battlegrounds/BattlegroundQueue.cpp\n+++ b/src/server/game/Battlegrounds/BattlegroundQueue.cpp\n@@ -33,6 +33,14 @@\n \n #include \"BattlegroundUtils.h\"\n \n+//npcbot\n+//non-PCH\n+#include \"Creature.h\"\n+#include \"botconfig.h\"\n+#include \"botdatamgr.h\"\n+#include \"botmgr.h\"\n+//end npcbot\n+\n /*********************************************************/\n /***            BATTLEGROUND QUEUE SYSTEM              ***/\n /*********************************************************/\n@@ -182,6 +190,19 @@ GroupQueueInfo* BattlegroundQueue::AddGroup(Player* leader, Group* group, Battle\n             m_QueuedPlayers[member->GetGUID()] = ginfo;\n             ginfo->Players.emplace(member->GetGUID());\n         });\n+        //npcbot: queue bots (bg only)\n+        if (!arenaTeamId)\n+        {\n+            for (GroupBotReference* itr = group->GetFirstBotMember(); itr != nullptr; itr = itr->next())\n+            {\n+                Creature const* bot = itr->GetSource();\n+                if (!bot)\n+                    continue;\n+                m_QueuedPlayers[bot->GetGUID()] = ginfo;\n+                ginfo->Players.emplace(bot->GetGUID());\n+            }\n+        }\n+        //end npcbot\n     }\n     else\n     {\n@@ -203,9 +224,86 @@ GroupQueueInfo* BattlegroundQueue::AddGroup(Player* leader, Group* group, Battle\n     if (!isRated && !isPremade && sWorld->getBoolConfig(CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_ENABLE))\n         SendMessageBGQueue(leader, bg, bracketEntry);\n \n+    //npcbot: try to queue wandering bots\n+    if (!isRated && !isPremade && !arenaType && !arenaTeamId && !sBattlegroundMgr->isTesting())\n+    {\n+        if (!BotDataMgr::GenerateBattlegroundBots(leader, group, this, bracketEntry, ginfo))\n+        {\n+            LOG_WARN(\"npcbots\", \"Did NOT generate bots for BG {} for leader {} ({} members)\",\n+                uint32(bgTypeId), leader->GetDebugInfo().c_str(), group ? group->GetMembersCount() : 0u);\n+        }\n+    }\n+    //end npcbot\n+\n     return ginfo;\n }\n \n+//npcbot\n+GroupQueueInfo* BattlegroundQueue::AddBotAsGroup(ObjectGuid guid, TeamId teamId, BattlegroundTypeId bgTypeId, PvPDifficultyEntry const* bracketEntry, uint8 arenaType, bool isRated, uint32 arenaRating, uint32 matchmakerRating, uint32 arenaTeamId, uint32 opponentsArenaTeamId)\n+{\n+    ASSERT(guid.IsCreature());\n+\n+    BattlegroundBracketId bracketId = bracketEntry->GetBracketId();\n+\n+    // create new ginfo\n+    GroupQueueInfo* ginfo            = new GroupQueueInfo;\n+    ginfo->BgTypeId                  = bgTypeId;\n+    ginfo->ArenaType                 = arenaType;\n+    ginfo->ArenaTeamId               = arenaTeamId;\n+    ginfo->IsRated                   = isRated;\n+    ginfo->IsInvitedToBGInstanceGUID = 0;\n+    ginfo->JoinTime                  = GameTime::GetGameTimeMS().count();\n+    ginfo->RemoveInviteTime          = 0;\n+    ginfo->teamId                    = teamId;\n+    ginfo->ArenaTeamRating           = arenaRating;\n+    ginfo->ArenaMatchmakerRating     = matchmakerRating;\n+    ginfo->PreviousOpponentsTeamId   = opponentsArenaTeamId;\n+    ginfo->OpponentsTeamRating       = 0;\n+    ginfo->OpponentsMatchmakerRating = 0;\n+\n+    ginfo->Players.clear();\n+\n+    uint32 index = 0;\n+    if (!isRated)\n+        index += PVP_TEAMS_COUNT;\n+\n+    if (ginfo->teamId == TEAM_HORDE)\n+        index++;\n+\n+    LOG_DEBUG(\"bg.battleground\", \"Adding Group to BattlegroundQueue bgTypeId: {}, bracket_id: {}, index: {}\", bgTypeId, bracketId, index);\n+\n+    // pussywizard: store indices at which GroupQueueInfo is in m_QueuedGroups\n+    ginfo->BracketId = bracketId;\n+    ginfo->GroupType = index;\n+\n+    ASSERT(m_QueuedPlayers.count(guid) == 0);\n+    m_QueuedPlayers[guid] = ginfo;\n+    ginfo->Players.emplace(guid);\n+\n+    //add GroupInfo to m_QueuedGroups\n+    m_QueuedGroups[bracketId][index].push_back(ginfo);\n+\n+    Battleground* bg = sBattlegroundMgr->GetBattlegroundTemplate(ginfo->BgTypeId);\n+    if (!bg)\n+        return ginfo;\n+\n+    if (!isRated && sWorld->getBoolConfig(CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_ENABLE))\n+    {\n+        BattlegroundBracketId bracketId = bracketEntry->GetBracketId();\n+        std::string const& bgName = bg->GetName();\n+        uint32 MinPlayers = bg->GetMinPlayersPerTeam();\n+        uint32 MaxPlayers = MinPlayers * 2;\n+        uint32 q_min_level = std::min(bracketEntry->minLevel, (uint32)80);\n+        uint32 q_max_level = std::min(bracketEntry->maxLevel, (uint32)80);\n+        uint32 qHorde = GetPlayersCountInGroupsQueue(bracketId, BG_QUEUE_NORMAL_HORDE);\n+        uint32 qAlliance = GetPlayersCountInGroupsQueue(bracketId, BG_QUEUE_NORMAL_ALLIANCE);\n+        ChatHandler(nullptr).SendWorldTextOptional(LANG_BG_QUEUE_ANNOUNCE_WORLD, ANNOUNCER_FLAG_DISABLE_BG_QUEUE, bgName.c_str(), q_min_level, q_max_level, qAlliance + qHorde, MaxPlayers);\n+    }\n+\n+    return ginfo;\n+}\n+//end npcbot\n+\n void BattlegroundQueue::PlayerInvitedToBGUpdateAverageWaitTime(GroupQueueInfo* ginfo)\n {\n     uint32 timeInQueue = std::max<uint32>(1, getMSTimeDiff(ginfo->JoinTime, GameTime::GetGameTimeMS().count()));\n@@ -335,6 +433,31 @@ void BattlegroundQueue::RemovePlayer(ObjectGuid guid, bool decreaseInvitedCount)\n         }\n     }\n \n+    //npcbot: remove player's bots\n+    if (!groupInfo->Players.empty() && guid.IsPlayer())\n+    {\n+        std::vector<ObjectGuid> botguids;\n+        botguids.reserve(BotCfg::GetMaxNpcBots(DEFAULT_MAX_LEVEL) / 2);\n+        BotDataMgr::GetNPCBotGuidsByOwner(botguids, guid);\n+        for (std::vector<ObjectGuid>::const_iterator ci = botguids.begin(); ci != botguids.end() && !groupInfo->Players.empty(); ++ci)\n+        {\n+            auto bqpitr = m_QueuedPlayers.find(*ci);\n+            if (bqpitr != m_QueuedPlayers.end())\n+            {\n+                auto bgpitr = groupInfo->Players.find(*ci);\n+                if (bgpitr != groupInfo->Players.end())\n+                    groupInfo->Players.erase(bgpitr);\n+\n+                if (decreaseInvitedCount && groupInfo->IsInvitedToBGInstanceGUID)\n+                    if (Battleground* bg = sBattlegroundMgr->GetBattleground(groupInfo->IsInvitedToBGInstanceGUID, groupInfo->BgTypeId))\n+                        bg->DecreaseInvitedCount(groupInfo->teamId);\n+\n+                m_QueuedPlayers.erase(bqpitr);\n+            }\n+        }\n+    }\n+    //end npcbot\n+\n     // remove group queue info no players left\n     if (groupInfo->Players.empty())\n     {\n@@ -382,6 +505,15 @@ bool BattlegroundQueue::IsPlayerInvited(ObjectGuid pl_guid, const uint32 bgInsta\n     return qItr != m_QueuedPlayers.end() && qItr->second->IsInvitedToBGInstanceGUID == bgInstanceGuid && qItr->second->RemoveInviteTime == removeTime;\n }\n \n+//npcbot\n+bool BattlegroundQueue::IsBotInvited(ObjectGuid guid, uint32 bgInstanceGuid) const\n+{\n+    ASSERT(guid.IsCreature());\n+    QueuedPlayersMap::const_iterator qItr = m_QueuedPlayers.find(guid);\n+    return qItr != m_QueuedPlayers.end() && qItr->second->IsInvitedToBGInstanceGUID == bgInstanceGuid;\n+}\n+//end npcbot\n+\n bool BattlegroundQueue::GetPlayerGroupInfoData(ObjectGuid guid, GroupQueueInfo* ginfo)\n {\n     auto qItr = m_QueuedPlayers.find(guid);\n@@ -1311,6 +1443,15 @@ void BattlegroundQueue::InviteGroupToBG(GroupQueueInfo* ginfo, Battleground* bg,\n     // loop through the players\n     for (auto const& itr : ginfo->Players)\n     {\n+        //npcbot: invite bots\n+        if (itr.IsCreature())\n+        {\n+            PlayerInvitedToBGUpdateAverageWaitTime(ginfo);\n+            BotMgr::InviteBotToBG(itr, ginfo, bg);\n+            continue;\n+        }\n+        //end npcbot\n+\n         // get the player\n         Player* player = ObjectAccessor::FindConnectedPlayer(itr);\n         if (!player)\ndiff --git a/src/server/game/Battlegrounds/BattlegroundQueue.h b/src/server/game/Battlegrounds/BattlegroundQueue.h\nindex 475fae9621..ab2de6fdeb 100644\n--- a/src/server/game/Battlegrounds/BattlegroundQueue.h\n+++ b/src/server/game/Battlegrounds/BattlegroundQueue.h\n@@ -75,6 +75,10 @@ public:\n     bool CheckNormalMatch(Battleground* bgTemplate, BattlegroundBracketId bracket_id, uint32 minPlayers, uint32 maxPlayers);\n     bool CheckSkirmishForSameFaction(BattlegroundBracketId bracket_id, uint32 minPlayersPerTeam);\n     GroupQueueInfo* AddGroup(Player* leader, Group* group, BattlegroundTypeId bgTypeId, PvPDifficultyEntry const* bracketEntry, uint8 arenaType, bool isRated, bool isPremade, uint32 arenaRating, uint32 matchmakerRating, uint32 arenaTeamId = 0, uint32 opponentsArenaTeamId = 0);\n+    //npcbot\n+    GroupQueueInfo* AddBotAsGroup(ObjectGuid leaderGuid, TeamId teamId, BattlegroundTypeId bgTypeId, PvPDifficultyEntry const* bracketEntry, uint8 arenaType, bool isPremade, uint32 arenaRating, uint32 matchmakerRating, uint32 arenaTeamId = 0, uint32 opponentsArenaTeamId = 0);\n+        bool IsBotInvited(ObjectGuid guid, uint32 bgInstanceGuid) const;\n+    //end npcbot\n     void RemovePlayer(ObjectGuid guid, bool decreaseInvitedCount);\n     bool IsPlayerInvitedToRatedArena(ObjectGuid pl_guid);\n     bool IsPlayerInvited(ObjectGuid pl_guid, uint32 bgInstanceGuid, uint32 removeTime);\ndiff --git a/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp\nindex ca02782cce..24fa512797 100644\n--- a/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp\n+++ b/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp\n@@ -26,6 +26,11 @@\n #include \"WorldStatePackets.h\"\n #include \"WorldStateDefines.h\"\n \n+//npcbot\n+#include \"botdatamgr.h\"\n+#include \"botmgr.h\"\n+//end npcbot\n+\n void BattlegroundABScore::BuildObjectivesBlock(WorldPacket& data)\n {\n     data << uint32(2);\n@@ -180,6 +185,16 @@ void BattlegroundAB::AddPlayer(Player* player)\n     PlayerScores.emplace(player->GetGUID().GetCounter(), new BattlegroundABScore(player->GetGUID()));\n }\n \n+//npcbot\n+void BattlegroundAB::AddBot(Creature* bot)\n+{\n+    bool const isInBattleground = IsPlayerInBattleground(bot->GetGUID());\n+    Battleground::AddBot(bot);\n+    if (!isInBattleground)\n+        BotScores[bot->GetEntry()] = new BattlegroundABScore(bot->GetGUID());\n+}\n+//end npcbot\n+\n void BattlegroundAB::RemovePlayer(Player* /*player*/)\n {\n }\n@@ -407,6 +422,146 @@ void BattlegroundAB::EventPlayerClickedOnFlag(Player* player, GameObject* gameOb\n     PlaySoundToAll(sound);\n }\n \n+//npcbot\n+void BattlegroundAB::EventBotClickedOnFlag(Creature* bot, GameObject* target_obj)\n+{\n+    if (GetStatus() != STATUS_IN_PROGRESS || !bot->IsWithinDistInMap(target_obj, 10.0f))\n+        return;\n+\n+    TeamId teamId = GetBotTeamId(bot->GetGUID());\n+\n+    uint8 node = BG_AB_NODE_STABLES;\n+    for (; node < BG_AB_DYNAMIC_NODES_COUNT; ++node)\n+        if (bot->GetDistance2d(BG_AB_NodePositions[node][0], BG_AB_NodePositions[node][1]) < 10.0f)\n+            break;\n+\n+    if (node == BG_AB_DYNAMIC_NODES_COUNT || _capturePointInfo[node]._ownerTeamId == teamId ||\n+            (_capturePointInfo[node]._state == BG_AB_NODE_STATE_ALLY_CONTESTED && teamId == TEAM_ALLIANCE) ||\n+            (_capturePointInfo[node]._state == BG_AB_NODE_STATE_HORDE_CONTESTED && teamId == TEAM_HORDE))\n+        return;\n+\n+    bot->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT);\n+\n+    uint32 sound = 0;\n+\n+    DeleteBanner(node);\n+    CreateBanner(node, true);\n+\n+    if (_capturePointInfo[node]._state == BG_AB_NODE_STATE_NEUTRAL)\n+    {\n+        UpdateBotScore(bot, SCORE_BASES_ASSAULTED, 1);\n+        _capturePointInfo[node]._state = static_cast<uint8>(BG_AB_NODE_STATE_ALLY_CONTESTED) + teamId;\n+        _capturePointInfo[node]._ownerTeamId = TEAM_NEUTRAL;\n+        _bgEvents.RescheduleEvent(BG_AB_EVENT_CAPTURE_STABLE + node, BG_AB_FLAG_CAPTURING_TIME);\n+        sound = BG_AB_SOUND_NODE_CLAIMED;\n+\n+        if (teamId == TEAM_ALLIANCE)\n+        {\n+            SendBroadcastText(ABNodes[node].TextAllianceClaims, CHAT_MSG_BG_SYSTEM_ALLIANCE, bot);\n+        }\n+        else\n+        {\n+            SendBroadcastText(ABNodes[node].TextHordeClaims, CHAT_MSG_BG_SYSTEM_HORDE, bot);\n+        }\n+    }\n+    else if (_capturePointInfo[node]._state == BG_AB_NODE_STATE_ALLY_CONTESTED || _capturePointInfo[node]._state == BG_AB_NODE_STATE_HORDE_CONTESTED)\n+    {\n+        if (!_capturePointInfo[node]._captured)\n+        {\n+            UpdateBotScore(bot, SCORE_BASES_ASSAULTED, 1);\n+            _capturePointInfo[node]._state = static_cast<uint8>(BG_AB_NODE_STATE_ALLY_CONTESTED) + teamId;\n+            _capturePointInfo[node]._ownerTeamId = TEAM_NEUTRAL;\n+            _bgEvents.RescheduleEvent(BG_AB_EVENT_CAPTURE_STABLE + node, BG_AB_FLAG_CAPTURING_TIME);\n+\n+            if (teamId == TEAM_ALLIANCE)\n+            {\n+                SendBroadcastText(ABNodes[node].TextAllianceAssaulted, CHAT_MSG_BG_SYSTEM_ALLIANCE, bot);\n+            }\n+            else\n+            {\n+                SendBroadcastText(ABNodes[node].TextHordeAssaulted, CHAT_MSG_BG_SYSTEM_HORDE, bot);\n+            }\n+        }\n+        else\n+        {\n+            UpdateBotScore(bot, SCORE_BASES_DEFENDED, 1);\n+            _capturePointInfo[node]._state = static_cast<uint8>(BG_AB_NODE_STATE_ALLY_OCCUPIED) + teamId;\n+            _capturePointInfo[node]._ownerTeamId = teamId;\n+            _bgEvents.CancelEvent(BG_AB_EVENT_CAPTURE_STABLE + node);\n+            NodeOccupied(node); // after setting team owner\n+\n+            if (teamId == TEAM_ALLIANCE)\n+            {\n+                SendBroadcastText(ABNodes[node].TextAllianceDefended, CHAT_MSG_BG_SYSTEM_ALLIANCE, bot);\n+            }\n+            else\n+            {\n+                SendBroadcastText(ABNodes[node].TextHordeDefended, CHAT_MSG_BG_SYSTEM_HORDE, bot);\n+            }\n+        }\n+\n+        sound = teamId == TEAM_ALLIANCE ? BG_AB_SOUND_NODE_ASSAULTED_ALLIANCE : BG_AB_SOUND_NODE_ASSAULTED_HORDE;\n+    }\n+    else\n+    {\n+        UpdateBotScore(bot, SCORE_BASES_ASSAULTED, 1);\n+        NodeDeoccupied(node); // before setting team owner to neutral\n+\n+        _capturePointInfo[node]._state = static_cast<uint8>(BG_AB_NODE_STATE_ALLY_CONTESTED) + teamId;\n+\n+        _bgEvents.RescheduleEvent(BG_AB_EVENT_CAPTURE_STABLE + node, BG_AB_FLAG_CAPTURING_TIME);\n+        sound = teamId == TEAM_ALLIANCE ? BG_AB_SOUND_NODE_ASSAULTED_ALLIANCE : BG_AB_SOUND_NODE_ASSAULTED_HORDE;\n+\n+        if (teamId == TEAM_ALLIANCE)\n+        {\n+            SendBroadcastText(ABNodes[node].TextAllianceAssaulted, CHAT_MSG_BG_SYSTEM_ALLIANCE, bot);\n+        }\n+        else\n+        {\n+            SendBroadcastText(ABNodes[node].TextHordeAssaulted, CHAT_MSG_BG_SYSTEM_HORDE, bot);\n+        }\n+    }\n+\n+    SendNodeUpdate(node);\n+    PlaySoundToAll(sound);\n+}\n+\n+bool BattlegroundAB::IsNodeOccupied(uint8 node, TeamId teamId) const\n+{\n+    if (node < BG_AB_DYNAMIC_NODES_COUNT)\n+    {\n+        switch (teamId)\n+        {\n+            case TEAM_ALLIANCE:\n+                return _capturePointInfo[node]._state == BG_AB_NODE_STATE_ALLY_OCCUPIED;\n+            case TEAM_HORDE:\n+                return _capturePointInfo[node]._state == BG_AB_NODE_STATE_HORDE_OCCUPIED;\n+            default:\n+                break;\n+        }\n+    }\n+\n+    return false;\n+}\n+bool BattlegroundAB::IsNodeContested(uint8 node, TeamId teamId) const\n+{\n+    if (node < BG_AB_DYNAMIC_NODES_COUNT)\n+    {\n+        switch (teamId)\n+        {\n+            case TEAM_ALLIANCE:\n+                return _capturePointInfo[node]._state == BG_AB_NODE_STATE_ALLY_CONTESTED;\n+            case TEAM_HORDE:\n+                return _capturePointInfo[node]._state == BG_AB_NODE_STATE_HORDE_CONTESTED;\n+            default:\n+                break;\n+        }\n+    }\n+\n+    return false;\n+}\n+//end npcbot\n+\n TeamId BattlegroundAB::GetPrematureWinner()\n {\n     if (_controlledPoints[TEAM_ALLIANCE] > _controlledPoints[TEAM_HORDE])\n@@ -520,6 +675,73 @@ GraveyardStruct const* BattlegroundAB::GetClosestGraveyard(Player* player)\n     return nearestEntry;\n }\n \n+//npcbot\n+GraveyardStruct const* BattlegroundAB::GetClosestGraveyardForBot(Creature* bot) const\n+{\n+    TeamId teamIndex = GetBotTeamId(bot->GetGUID());\n+\n+    GraveyardStruct const* entry = sGraveyard->GetGraveyard(BG_AB_GraveyardIds[static_cast<uint8>(BG_AB_SPIRIT_ALIANCE) + teamIndex]);\n+    GraveyardStruct const* nearestEntry = entry;\n+\n+    float pX = bot->GetPositionX();\n+    float pY = bot->GetPositionY();\n+    float dist = (entry->x - pX) * (entry->x - pX) + (entry->y - pY) * (entry->y - pY);\n+    float minDist = dist;\n+\n+    for (uint8 i = BG_AB_NODE_STABLES; i < BG_AB_DYNAMIC_NODES_COUNT; ++i)\n+    {\n+        if (_capturePointInfo[i]._ownerTeamId == teamIndex)\n+        {\n+            entry = sGraveyard->GetGraveyard(BG_AB_GraveyardIds[i]);\n+            dist = (entry->x - pX) * (entry->x - pX) + (entry->y - pY) * (entry->y - pY);\n+            if (dist < minDist)\n+            {\n+                minDist = dist;\n+                nearestEntry = entry;\n+            }\n+        }\n+    }\n+\n+    return nearestEntry;\n+}\n+\n+void BattlegroundAB::RewardKillScore(TeamId teamId, uint32 amount)\n+{\n+    // Score feature\n+    m_TeamScores[teamId] += amount;\n+    if (m_TeamScores[teamId] > BG_AB_MAX_TEAM_SCORE)\n+        m_TeamScores[teamId] = BG_AB_MAX_TEAM_SCORE;\n+    UpdateWorldState(teamId == TEAM_ALLIANCE ? WORLD_STATE_BATTLEGROUND_AB_RESOURCES_ALLIANCE : WORLD_STATE_BATTLEGROUND_AB_RESOURCES_HORDE, m_TeamScores[teamId]);\n+    if (m_TeamScores[teamId] >= BG_AB_MAX_TEAM_SCORE)\n+        EndBattleground(teamId);\n+}\n+\n+void BattlegroundAB::HandleBotKillPlayer(Creature* killer, Player* victim)\n+{\n+    if (GetStatus() != STATUS_IN_PROGRESS)\n+        return;\n+\n+    Battleground::HandleBotKillPlayer(killer, victim);\n+    //RewardKillScore(GetPlayerTeamId(killer->GetGUID()), BG_AB_TickPoints[1]);\n+}\n+void BattlegroundAB::HandleBotKillBot(Creature* killer, Creature* victim)\n+{\n+    if (GetStatus() != STATUS_IN_PROGRESS)\n+        return;\n+\n+    Battleground::HandleBotKillBot(killer, victim);\n+    //RewardKillScore(GetPlayerTeamId(killer->GetGUID()), BG_AB_TickPoints[1]);\n+}\n+void BattlegroundAB::HandlePlayerKillBot(Creature* victim, Player* killer)\n+{\n+    if (GetStatus() != STATUS_IN_PROGRESS)\n+        return;\n+\n+    Battleground::HandlePlayerKillBot(victim, killer);\n+    //RewardKillScore(GetPlayerTeamId(killer->GetGUID()), BG_AB_TickPoints[1]);\n+}\n+//end npcbot\n+\n bool BattlegroundAB::UpdatePlayerScore(Player* player, uint32 type, uint32 value, bool doAddHonor)\n {\n     if (!Battleground::UpdatePlayerScore(player, type, value, doAddHonor))\ndiff --git a/src/server/game/Battlegrounds/Zones/BattlegroundAB.h b/src/server/game/Battlegrounds/Zones/BattlegroundAB.h\nindex 230292aa49..03884e6ee1 100644\n--- a/src/server/game/Battlegrounds/Zones/BattlegroundAB.h\n+++ b/src/server/game/Battlegrounds/Zones/BattlegroundAB.h\n@@ -262,6 +262,18 @@ public:\n     void EndBattleground(TeamId winnerTeamId) override;\n     GraveyardStruct const* GetClosestGraveyard(Player* player) override;\n \n+    //npcbot\n+    GraveyardStruct const* GetClosestGraveyardForBot(Creature* bot) const override;\n+    void AddBot(Creature* bot) override;\n+    void RewardKillScore(TeamId teamId, uint32 amount);\n+    void HandleBotKillPlayer(Creature* killer, Player* victim) override;\n+    void HandleBotKillBot(Creature* killer, Creature* victim) override;\n+    void HandlePlayerKillBot(Creature* victim, Player* killer) override;\n+    void EventBotClickedOnFlag(Creature* bot, GameObject* target_obj) override;\n+    bool IsNodeOccupied(uint8 node, TeamId teamId) const;\n+    bool IsNodeContested(uint8 node, TeamId teamId) const;\n+    //end npcbot\n+\n     bool UpdatePlayerScore(Player* player, uint32 type, uint32 value, bool doAddHonor = true) override;\n     void FillInitialWorldStates(WorldPackets::WorldState::InitWorldStates& packet) override;\n     void EventPlayerClickedOnFlag(Player* source, GameObject* gameObject) override;\ndiff --git a/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp\nindex d00a7cb83f..3580c5a962 100644\n--- a/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp\n+++ b/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp\n@@ -28,6 +28,11 @@\n #include \"WorldPacket.h\"\n #include \"WorldStatePackets.h\"\n \n+//npcbot\n+#include \"botdatamgr.h\"\n+#include \"botmgr.h\"\n+//end npcbot\n+\n void BattlegroundAVScore::BuildObjectivesBlock(WorldPacket& data)\n {\n     data << uint32(5); // Objectives Count\n@@ -82,6 +87,33 @@ void BattlegroundAV::HandleKillPlayer(Player* player, Player* killer)\n     UpdateScore(player->GetTeamId(), -1);\n }\n \n+//npcbot\n+void BattlegroundAV::HandleBotKillPlayer(Creature* killer, Player* victim)\n+{\n+    if (GetStatus() != STATUS_IN_PROGRESS)\n+        return;\n+\n+    Battleground::HandleBotKillPlayer(killer, victim);\n+    UpdateScore(victim->GetTeamId(), -1);\n+}\n+void BattlegroundAV::HandleBotKillBot(Creature* killer, Creature* victim)\n+{\n+    if (GetStatus() != STATUS_IN_PROGRESS)\n+        return;\n+\n+    Battleground::HandleBotKillBot(killer, victim);\n+    UpdateScore(GetBotTeamId(victim->GetGUID()), -1);\n+}\n+void BattlegroundAV::HandlePlayerKillBot(Creature* victim, Player* killer)\n+{\n+    if (GetStatus() != STATUS_IN_PROGRESS)\n+        return;\n+\n+    Battleground::HandlePlayerKillBot(victim, killer);\n+    UpdateScore(GetBotTeamId(victim->GetGUID()), -1);\n+}\n+//end npcbot\n+\n void BattlegroundAV::HandleKillUnit(Creature* unit, Player* killer)\n {\n     LOG_DEBUG(\"bg.battleground\", \"bg_av HandleKillUnit {}\", unit->GetEntry());\n@@ -165,6 +197,89 @@ void BattlegroundAV::HandleKillUnit(Creature* unit, Player* killer)\n     }\n }\n \n+//npcbot\n+void BattlegroundAV::HandleBotKillUnit(Creature* killer, Creature* victim)\n+{\n+    LOG_DEBUG(\"bg.battleground\", \"bg_av HandleKillUnit {}\", victim->GetEntry());\n+    if (GetStatus() != STATUS_IN_PROGRESS)\n+        return;\n+    uint32 entry = victim->GetEntry();\n+    /*\n+    uint32 triggerSpawnID = 0;\n+    if (creature->GetEntry() == BG_AV_CreatureInfo[AV_NPC_A_CAPTAIN])\n+        triggerSpawnID = AV_CPLACE_TRIGGER16;\n+    else if (creature->GetEntry() == BG_AV_CreatureInfo[AV_NPC_A_BOSS])\n+        triggerSpawnID = AV_CPLACE_TRIGGER17;\n+    else if (creature->GetEntry() == BG_AV_CreatureInfo[AV_NPC_H_CAPTAIN])\n+        triggerSpawnID = AV_CPLACE_TRIGGER18;\n+    else if (creature->GetEntry() == BG_AV_CreatureInfo[AV_NPC_H_BOSS])\n+        triggerSpawnID = AV_CPLACE_TRIGGER19;\n+    */\n+    if (entry == BG_AV_CreatureInfo[AV_NPC_A_BOSS])\n+    {\n+        CastSpellOnTeam(23658, TEAM_HORDE); //this is a spell which finishes a quest where a player has to kill the boss\n+        RewardReputationToTeam(729, _reputationBoss, TEAM_HORDE);\n+        RewardHonorToTeam(GetBonusHonorFromKill(BG_AV_KILL_BOSS), TEAM_HORDE);\n+        EndBattleground(TEAM_HORDE);\n+        DelCreature(AV_CPLACE_TRIGGER17);\n+    }\n+    else if (entry == BG_AV_CreatureInfo[AV_NPC_H_BOSS])\n+    {\n+        CastSpellOnTeam(23658, TEAM_ALLIANCE); //this is a spell which finishes a quest where a player has to kill the boss\n+        RewardReputationToTeam(730, _reputationBoss, TEAM_ALLIANCE);\n+        RewardHonorToTeam(GetBonusHonorFromKill(BG_AV_KILL_BOSS), TEAM_ALLIANCE);\n+        EndBattleground(TEAM_ALLIANCE);\n+        DelCreature(AV_CPLACE_TRIGGER19);\n+    }\n+    else if (entry == BG_AV_CreatureInfo[AV_NPC_A_CAPTAIN])\n+    {\n+        if (!m_CaptainAlive[0])\n+        {\n+            LOG_ERROR(\"bg.battleground\", \"Killed a Captain twice, please report this bug, if you haven't done \\\".respawn\\\"\");\n+            return;\n+        }\n+        m_CaptainAlive[0] = false;\n+        RewardReputationToTeam(729, _reputationCaptain, TEAM_HORDE);\n+        RewardHonorToTeam(GetBonusHonorFromKill(BG_AV_KILL_CAPTAIN), TEAM_HORDE);\n+        UpdateScore(TEAM_ALLIANCE, (-1)*BG_AV_RES_CAPTAIN);\n+        //spawn destroyed aura\n+        for (uint8 i = 0; i <= 9; i++)\n+            SpawnBGObject(BG_AV_OBJECT_BURN_BUILDING_ALLIANCE + i, RESPAWN_IMMEDIATELY);\n+        if (Creature* creature = GetBGCreature(AV_CPLACE_HERALD))\n+            creature->AI()->Talk(AV_TEXT_HERALD_STORMPIKE_GENERAL_DEAD);\n+        DelCreature(AV_CPLACE_TRIGGER16);\n+    }\n+    else if (entry == BG_AV_CreatureInfo[AV_NPC_H_CAPTAIN])\n+    {\n+        if (!m_CaptainAlive[1])\n+        {\n+            LOG_ERROR(\"bg.battleground\", \"Killed a Captain twice, please report this bug, if you haven't done \\\".respawn\\\"\");\n+            return;\n+        }\n+        m_CaptainAlive[1] = false;\n+        RewardReputationToTeam(730, _reputationCaptain, TEAM_ALLIANCE);\n+        RewardHonorToTeam(GetBonusHonorFromKill(BG_AV_KILL_CAPTAIN), TEAM_ALLIANCE);\n+        UpdateScore(TEAM_HORDE, (-1)*BG_AV_RES_CAPTAIN);\n+        //spawn destroyed aura\n+        for (uint8 i = 0; i <= 9; i++)\n+            SpawnBGObject(BG_AV_OBJECT_BURN_BUILDING_HORDE + i, RESPAWN_IMMEDIATELY);\n+        if (Creature* creature = GetBGCreature(AV_CPLACE_HERALD))\n+            creature->AI()->Talk(AV_TEXT_HERALD_FROSTWOLF_GENERAL_DEAD);\n+        DelCreature(AV_CPLACE_TRIGGER18);\n+    }\n+    else if (entry == BG_AV_CreatureInfo[AV_NPC_N_MINE_N_4] || entry == BG_AV_CreatureInfo[AV_NPC_N_MINE_A_4] || entry == BG_AV_CreatureInfo[AV_NPC_N_MINE_H_4])\n+    {\n+        ChangeMineOwner(AV_NORTH_MINE, GetBotTeamId(killer->GetGUID()));\n+        UpdateBotScore(killer, SCORE_MINES_CAPTURED, 1);\n+    }\n+    else if (entry == BG_AV_CreatureInfo[AV_NPC_S_MINE_N_4] || entry == BG_AV_CreatureInfo[AV_NPC_S_MINE_A_4] || entry == BG_AV_CreatureInfo[AV_NPC_S_MINE_H_4])\n+    {\n+        ChangeMineOwner(AV_SOUTH_MINE, GetBotTeamId(killer->GetGUID()));\n+        UpdateBotScore(killer, SCORE_MINES_CAPTURED, 1);\n+    }\n+}\n+//end npcbot\n+\n void BattlegroundAV::HandleQuestComplete(uint32 questid, Player* player)\n {\n     if (GetStatus() != STATUS_IN_PROGRESS)\n@@ -506,6 +621,16 @@ void BattlegroundAV::AddPlayer(Player* player)\n     PlayerScores.emplace(player->GetGUID().GetCounter(), new BattlegroundAVScore(player->GetGUID()));\n }\n \n+//npcbot\n+void BattlegroundAV::AddBot(Creature* bot)\n+{\n+    bool const isInBattleground = IsPlayerInBattleground(bot->GetGUID());\n+    Battleground::AddBot(bot);\n+    if (!isInBattleground)\n+        BotScores[bot->GetEntry()] = new BattlegroundAVScore(bot->GetGUID());\n+}\n+//end npcbot\n+\n void BattlegroundAV::EndBattleground(TeamId winnerTeamId)\n {\n     //calculate bonuskills for both teams:\n@@ -574,6 +699,18 @@ void BattlegroundAV::RemovePlayer(Player* player)\n     player->RemoveAurasDueToSpell(AV_BUFF_H_CAPTAIN);\n }\n \n+//npcbot\n+void BattlegroundAV::RemoveBot(ObjectGuid guid)\n+{\n+    if (Creature const* bot = BotDataMgr::FindBot(guid.GetEntry()))\n+    {\n+        const_cast<Creature*>(bot)->RemoveAurasDueToSpell(AV_BUFF_ARMOR);\n+        const_cast<Creature*>(bot)->RemoveAurasDueToSpell(AV_BUFF_A_CAPTAIN);\n+        const_cast<Creature*>(bot)->RemoveAurasDueToSpell(AV_BUFF_H_CAPTAIN);\n+    }\n+}\n+//end npcbot\n+\n void BattlegroundAV::HandleAreaTrigger(Player* player, uint32 trigger)\n {\n     // this is wrong way to implement these things. On official it done by gameobject spell cast.\n@@ -879,9 +1016,18 @@ BG_AV_Nodes BattlegroundAV::GetNodeThroughObject(uint32 object)\n     return BG_AV_Nodes(0);\n }\n \n+//npcbot\n+/*\n+//end npcbot\n uint32 BattlegroundAV::GetObjectThroughNode(BG_AV_Nodes node)\n+//npcbot\n+*/\n+uint32 BattlegroundAV::GetObjectThroughNode(BG_AV_Nodes node, bool log) const\n {\n     //this function is the counterpart to GetNodeThroughObject()\n+    //npcbot\n+    if (log)\n+    //end npcbot\n     LOG_DEBUG(\"bg.battleground\", \"bg_AV GetObjectThroughNode {}\", node);\n     if (m_Nodes[node].OwnerId == TEAM_ALLIANCE)\n     {\n@@ -947,6 +1093,35 @@ void BattlegroundAV::EventPlayerClickedOnFlag(Player* source, GameObject* gameOb\n     }\n }\n \n+//npcbot\n+void BattlegroundAV::EventBotClickedOnFlag(Creature* bot, GameObject* target_obj)\n+{\n+    if (GetStatus() != STATUS_IN_PROGRESS)\n+        return;\n+    int32 object = GetObjectType(target_obj->GetGUID());\n+    if (object < 0)\n+        return;\n+    switch (target_obj->GetEntry())\n+    {\n+        case BG_AV_OBJECTID_BANNER_A:\n+        case BG_AV_OBJECTID_BANNER_A_B:\n+        case BG_AV_OBJECTID_BANNER_H:\n+        case BG_AV_OBJECTID_BANNER_H_B:\n+        case BG_AV_OBJECTID_BANNER_SNOWFALL_N:\n+            EventBotAssaultsPoint(bot, object);\n+            break;\n+        case BG_AV_OBJECTID_BANNER_CONT_A:\n+        case BG_AV_OBJECTID_BANNER_CONT_A_B:\n+        case BG_AV_OBJECTID_BANNER_CONT_H:\n+        case BG_AV_OBJECTID_BANNER_CONT_H_B:\n+            EventBotDefendsPoint(bot, object);\n+            break;\n+        default:\n+            break;\n+    }\n+}\n+//end npcbot\n+\n void BattlegroundAV::EventPlayerDefendsPoint(Player* player, uint32 object)\n {\n     ASSERT(GetStatus() == STATUS_IN_PROGRESS);\n@@ -1013,6 +1188,73 @@ void BattlegroundAV::EventPlayerDefendsPoint(Player* player, uint32 object)\n     UpdatePlayerScore(player, (IsTower(node)) ? SCORE_TOWERS_DEFENDED : SCORE_GRAVEYARDS_DEFENDED, 1);\n }\n \n+//npcbot\n+void BattlegroundAV::EventBotDefendsPoint(Creature* bot, uint32 object)\n+{\n+    ASSERT(GetStatus() == STATUS_IN_PROGRESS);\n+    BG_AV_Nodes node = GetNodeThroughObject(object);\n+\n+    TeamId ownerId = m_Nodes[node].OwnerId; //maybe should name it prevowner\n+    TeamId teamId = GetBotTeamId(bot->GetGUID());\n+\n+    if (ownerId == teamId || m_Nodes[node].State != POINT_ASSAULTED)\n+        return;\n+    if (m_Nodes[node].TotalOwnerId == TEAM_NEUTRAL)\n+    {\n+        //until snowfall doesn't belong to anyone it is better handled in assault-code\n+        ASSERT(node == BG_AV_NODES_SNOWFALL_GRAVE); //currently the only neutral grave\n+        EventBotAssaultsPoint(bot, object);\n+        return;\n+    }\n+    LOG_DEBUG(\"bg.battleground\", \"bot defends point object: {} node: {}\", object, node);\n+    if (m_Nodes[node].PrevOwnerId != teamId)\n+    {\n+        LOG_ERROR(\"bg.battleground\", \"BG_AV: bot defends point which doesn't belong to his team {}\", node);\n+        return;\n+    }\n+\n+    //spawn new go :)\n+    if (m_Nodes[node].OwnerId == TEAM_ALLIANCE)\n+        SpawnBGObject(object + 22, RESPAWN_IMMEDIATELY); //spawn horde banner\n+    else\n+        SpawnBGObject(object - 22, RESPAWN_IMMEDIATELY); //spawn alliance banner\n+\n+    if (!IsTower(node))\n+    {\n+        SpawnBGObject(BG_AV_OBJECT_AURA_N_FIRSTAID_STATION + 3 * node, RESPAWN_ONE_DAY);\n+        SpawnBGObject(static_cast<uint8>(BG_AV_OBJECT_AURA_A_FIRSTAID_STATION) + teamId + 3 * node, RESPAWN_IMMEDIATELY);\n+    }\n+    // despawn old go\n+    SpawnBGObject(object, RESPAWN_ONE_DAY);\n+\n+    DefendNode(node, teamId);\n+    PopulateNode(node);\n+    UpdateNodeWorldState(node);\n+\n+    if (IsTower(node))\n+    {\n+        //spawn big flag+aura on top of tower\n+        SpawnBGObject(BG_AV_OBJECT_TAURA_A_DUNBALDAR_SOUTH + (2 * (node - BG_AV_NODES_DUNBALDAR_SOUTH)), (teamId == TEAM_ALLIANCE) ? RESPAWN_IMMEDIATELY : RESPAWN_ONE_DAY);\n+        SpawnBGObject(BG_AV_OBJECT_TAURA_H_DUNBALDAR_SOUTH + (2 * (node - BG_AV_NODES_DUNBALDAR_SOUTH)), (teamId == TEAM_HORDE) ? RESPAWN_IMMEDIATELY : RESPAWN_ONE_DAY);\n+        SpawnBGObject(BG_AV_OBJECT_TFLAG_A_DUNBALDAR_SOUTH + (2 * (node - BG_AV_NODES_DUNBALDAR_SOUTH)), (teamId == TEAM_ALLIANCE) ? RESPAWN_IMMEDIATELY : RESPAWN_ONE_DAY);\n+        SpawnBGObject(BG_AV_OBJECT_TFLAG_H_DUNBALDAR_SOUTH + (2 * (node - BG_AV_NODES_DUNBALDAR_SOUTH)), (teamId == TEAM_HORDE) ? RESPAWN_IMMEDIATELY : RESPAWN_ONE_DAY);\n+    }\n+    else if (node == BG_AV_NODES_SNOWFALL_GRAVE) //snowfall eyecandy\n+    {\n+        for (uint8 i = 0; i < 4; i++)\n+        {\n+            SpawnBGObject(((ownerId == TEAM_ALLIANCE) ? BG_AV_OBJECT_SNOW_EYECANDY_PA : BG_AV_OBJECT_SNOW_EYECANDY_PH) + i, RESPAWN_ONE_DAY);\n+            SpawnBGObject(((teamId == TEAM_ALLIANCE) ? BG_AV_OBJECT_SNOW_EYECANDY_A : BG_AV_OBJECT_SNOW_EYECANDY_H) + i, RESPAWN_IMMEDIATELY);\n+        }\n+    }\n+\n+    if (Creature* creature = GetBGCreature(AV_CPLACE_HERALD))\n+        creature->AI()->Talk(GetDefendString(node, teamId));\n+\n+    //update the statistic for the defending player\n+    UpdateBotScore(bot, (IsTower(node)) ? SCORE_TOWERS_DEFENDED : SCORE_GRAVEYARDS_DEFENDED, 1);\n+}\n+\n void BattlegroundAV::EventPlayerAssaultsPoint(Player* player, uint32 object)\n {\n     ASSERT(GetStatus() == STATUS_IN_PROGRESS);\n@@ -1120,8 +1362,113 @@ void BattlegroundAV::EventPlayerAssaultsPoint(Player* player, uint32 object)\n     player->KilledMonsterCredit((IsTower(node)) ? BG_AV_QUEST_CREDIT_TOWER : BG_AV_QUEST_CREDIT_GRAVEYARD);\n }\n \n-void BattlegroundAV::FillInitialWorldStates(WorldPackets::WorldState::InitWorldStates& packet)\n+void BattlegroundAV::EventBotAssaultsPoint(Creature* bot, uint32 object)\n {\n+    ASSERT(GetStatus() == STATUS_IN_PROGRESS);\n+\n+    BG_AV_Nodes node = GetNodeThroughObject(object);\n+    TeamId prevOwnerId = m_Nodes[node].OwnerId;\n+    TeamId teamId = GetBotTeamId(bot->GetGUID());\n+    LOG_DEBUG(\"bg.battleground\", \"bg_av: player assaults point object {} node {}\", object, node);\n+    if (prevOwnerId == teamId || teamId == m_Nodes[node].TotalOwnerId)\n+        return; //surely a gm used this object\n+\n+    if (node == BG_AV_NODES_SNOWFALL_GRAVE) //snowfall is a bit special in capping + it gets eyecandy stuff\n+    {\n+        if (object == BG_AV_OBJECT_FLAG_N_SNOWFALL_GRAVE) //initial capping\n+        {\n+            if (!(prevOwnerId == TEAM_NEUTRAL && m_Nodes[node].TotalOwnerId == TEAM_NEUTRAL))\n+                return;\n+\n+            if (teamId == TEAM_ALLIANCE)\n+                SpawnBGObject(BG_AV_OBJECT_FLAG_C_A_SNOWFALL_GRAVE, RESPAWN_IMMEDIATELY);\n+            else\n+                SpawnBGObject(BG_AV_OBJECT_FLAG_C_H_SNOWFALL_GRAVE, RESPAWN_IMMEDIATELY);\n+            SpawnBGObject(BG_AV_OBJECT_AURA_N_FIRSTAID_STATION + 3 * node, RESPAWN_IMMEDIATELY); //neutral aura spawn\n+        }\n+        else if (m_Nodes[node].TotalOwnerId == TEAM_NEUTRAL) //recapping, when no team owns this node realy\n+        {\n+            if (!(m_Nodes[node].State != POINT_CONTROLLED))\n+                return;\n+\n+            if (teamId == TEAM_ALLIANCE)\n+                SpawnBGObject(object - 11, RESPAWN_IMMEDIATELY);\n+            else\n+                SpawnBGObject(object + 11, RESPAWN_IMMEDIATELY);\n+        }\n+        //eyecandy\n+        uint32 spawn, despawn;\n+        if (teamId == TEAM_ALLIANCE)\n+        {\n+            despawn = (m_Nodes[node].State == POINT_ASSAULTED) ? BG_AV_OBJECT_SNOW_EYECANDY_PH : BG_AV_OBJECT_SNOW_EYECANDY_H;\n+            spawn = BG_AV_OBJECT_SNOW_EYECANDY_PA;\n+        }\n+        else\n+        {\n+            despawn = (m_Nodes[node].State == POINT_ASSAULTED) ? BG_AV_OBJECT_SNOW_EYECANDY_PA : BG_AV_OBJECT_SNOW_EYECANDY_A;\n+            spawn = BG_AV_OBJECT_SNOW_EYECANDY_PH;\n+        }\n+        for (uint8 i = 0; i < 4; i++)\n+        {\n+            SpawnBGObject(despawn + i, RESPAWN_ONE_DAY);\n+            SpawnBGObject(spawn + i, RESPAWN_IMMEDIATELY);\n+        }\n+    }\n+\n+    // xinef: moved here, assure that no call to m_Nodes is used in IF statement bellow as it is modified\n+    AssaultNode(node, teamId);\n+\n+    //if snowfall gots capped it can be handled like all other graveyards\n+    if (m_Nodes[node].TotalOwnerId != TEAM_NEUTRAL)\n+    {\n+        ASSERT(prevOwnerId != TEAM_NEUTRAL);\n+        if (teamId == TEAM_ALLIANCE)\n+            SpawnBGObject(object - 22, RESPAWN_IMMEDIATELY);\n+        else\n+            SpawnBGObject(object + 22, RESPAWN_IMMEDIATELY);\n+\n+        bool ignoreSpiritGuide = false;\n+        if (IsTower(node))\n+        {\n+            //spawning/despawning of bigflag+aura\n+            SpawnBGObject(BG_AV_OBJECT_TAURA_A_DUNBALDAR_SOUTH + (2 * (node - BG_AV_NODES_DUNBALDAR_SOUTH)), (teamId == TEAM_ALLIANCE) ? RESPAWN_IMMEDIATELY : RESPAWN_ONE_DAY);\n+            SpawnBGObject(BG_AV_OBJECT_TAURA_H_DUNBALDAR_SOUTH + (2 * (node - BG_AV_NODES_DUNBALDAR_SOUTH)), (teamId == TEAM_HORDE) ? RESPAWN_IMMEDIATELY : RESPAWN_ONE_DAY);\n+            SpawnBGObject(BG_AV_OBJECT_TFLAG_A_DUNBALDAR_SOUTH + (2 * (node - BG_AV_NODES_DUNBALDAR_SOUTH)), (teamId == TEAM_ALLIANCE) ? RESPAWN_IMMEDIATELY : RESPAWN_ONE_DAY);\n+            SpawnBGObject(BG_AV_OBJECT_TFLAG_H_DUNBALDAR_SOUTH + (2 * (node - BG_AV_NODES_DUNBALDAR_SOUTH)), (teamId == TEAM_HORDE) ? RESPAWN_IMMEDIATELY : RESPAWN_ONE_DAY);\n+        }\n+        else\n+        {\n+            //spawning/despawning of aura\n+            SpawnBGObject(BG_AV_OBJECT_AURA_N_FIRSTAID_STATION + 3 * node, RESPAWN_IMMEDIATELY); //neutral aura spawn\n+            SpawnBGObject(static_cast<uint8>(BG_AV_OBJECT_AURA_A_FIRSTAID_STATION) + prevOwnerId + 3 * node, RESPAWN_ONE_DAY); //teeamaura despawn\n+\n+            ignoreSpiritGuide = true;\n+\n+            _reviveEvents.AddEventAtOffset([this, node]()\n+            {\n+                RelocateDeadPlayers(BgCreatures[node]);\n+\n+                if (!IsTower(node))\n+                    DelCreature(node); // Delete spirit healer\n+            }, 500ms);\n+        }\n+\n+        DePopulateNode(node, ignoreSpiritGuide);\n+    }\n+\n+    SpawnBGObject(object, RESPAWN_ONE_DAY); //delete old banner\n+    // xinef: change here is too late, AssaultNode(node, team);\n+    UpdateNodeWorldState(node);\n+\n+    if (Creature* creature = GetBGCreature(AV_CPLACE_HERALD))\n+        creature->AI()->Talk(GetAttackString(node, teamId));\n+\n+    //update the statistic for the assaulting player\n+    UpdateBotScore(bot, (IsTower(node)) ? SCORE_TOWERS_ASSAULTED : SCORE_GRAVEYARDS_ASSAULTED, 1);\n+    PlaySoundToAll((teamId == TEAM_ALLIANCE) ? AV_SOUND_ALLIANCE_ASSAULTS : AV_SOUND_HORDE_ASSAULTS);\n+}\n+\n+void BattlegroundAV::FillInitialWorldStates(WorldPackets::WorldState::InitWorldStates& packet){\n     bool stateok;\n     packet.Worldstates.reserve(7*2*2 + 8*2*2 + 5);\n     //graveyards\n@@ -1238,6 +1585,37 @@ GraveyardStruct const* BattlegroundAV::GetClosestGraveyard(Player* player)\n     return pGraveyard;\n }\n \n+//npcbot\n+GraveyardStruct const* BattlegroundAV::GetClosestGraveyardForBot(Creature* bot) const\n+{\n+    GraveyardStruct const* entry = nullptr;\n+    float dist = 0;\n+    float minDist = 0;\n+    float x, y;\n+\n+    bot->GetPosition(x, y);\n+\n+    GraveyardStruct const* pGraveyard = sGraveyard->GetGraveyard(BG_AV_GraveyardIds[GetBotTeamId(bot->GetGUID()) + 7]);\n+    minDist = (pGraveyard->x - x) * (pGraveyard->x - x) + (pGraveyard->y - y) * (pGraveyard->y - y);\n+\n+    for (uint8 i = BG_AV_NODES_FIRSTAID_STATION; i <= BG_AV_NODES_FROSTWOLF_HUT; ++i)\n+        if (m_Nodes[i].OwnerId == GetBotTeamId(bot->GetGUID()) && m_Nodes[i].State == POINT_CONTROLLED)\n+        {\n+            entry = sGraveyard->GetGraveyard(BG_AV_GraveyardIds[i]);\n+            if (entry)\n+            {\n+                dist = (entry->x - x) * (entry->x - x) + (entry->y - y) * (entry->y - y);\n+                if (dist < minDist)\n+                {\n+                    minDist = dist;\n+                    pGraveyard = entry;\n+                }\n+            }\n+        }\n+    return pGraveyard;\n+}\n+//end npcbot\n+\n bool BattlegroundAV::SetupBattleground()\n {\n     _avReputationRate = sWorld->getRate(RATE_REPUTATION_GAIN_AV);\ndiff --git a/src/server/game/Battlegrounds/Zones/BattlegroundAV.h b/src/server/game/Battlegrounds/Zones/BattlegroundAV.h\nindex 57417dd1db..135b44a7b6 100644\n--- a/src/server/game/Battlegrounds/Zones/BattlegroundAV.h\n+++ b/src/server/game/Battlegrounds/Zones/BattlegroundAV.h\n@@ -1785,6 +1785,23 @@ public:\n \n     GraveyardStruct const* GetClosestGraveyard(Player* player) override;\n \n+    //npcbot\n+    GraveyardStruct const* GetClosestGraveyardForBot(Creature* bot) const override;\n+    void AddBot(Creature* bot) override;\n+    void RemoveBot(ObjectGuid guid) override;\n+    void RewardKillScore(TeamId teamId, uint32 amount);\n+    void HandleBotKillPlayer(Creature* killer, Player* victim) override;\n+    void HandleBotKillBot(Creature* killer, Creature* victim) override;\n+    void HandlePlayerKillBot(Creature* victim, Player* killer) override;\n+    void EventBotClickedOnFlag(Creature* bot, GameObject* target_obj) override;\n+    void HandleBotKillUnit(Creature* killer, Creature* victim) override;\n+    void EventBotAssaultsPoint(Creature* bot, uint32 object);\n+    void EventBotDefendsPoint(Creature* bot, uint32 object);\n+    BG_AV_NodeInfo const (&GetNodes() const)[BG_AV_NODES_MAX] { return m_Nodes; }\n+    uint32 GetObjectThroughNodeForBot(BG_AV_Nodes node, bool log = false) { return GetObjectThroughNode(node, log); }\n+    TeamId GetMineOwner(uint8 mine_idx) const { return m_Mine_Owner[mine_idx]; }\n+    //end npcbot\n+\n     /* achievement req. */\n     bool IsBothMinesControlledByTeam(TeamId teamId) const;\n     bool IsAllTowersControlledAndCaptainAlive(TeamId teamId) const;\n@@ -1808,7 +1825,14 @@ private:\n     void DePopulateNode(BG_AV_Nodes node, bool ignoreSpiritGuid = false);\n \n     BG_AV_Nodes GetNodeThroughObject(uint32 object);\n+    //npcbot\n+    /*\n+    //end npcbot\n     uint32 GetObjectThroughNode(BG_AV_Nodes node);\n+    //npcbot\n+    */\n+    uint32 GetObjectThroughNode(BG_AV_Nodes node, bool log = true) const;\n+    //end npcbot\n     bool IsTower(BG_AV_Nodes node) { return m_Nodes[node].Tower; }\n \n     uint8 GetAttackString(BG_AV_Nodes node, TeamId teamId);\ndiff --git a/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp\nindex da6bfb2898..0a10f2480f 100644\n--- a/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp\n+++ b/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp\n@@ -28,6 +28,10 @@\n #include \"WorldSession.h\"\n #include \"WorldStatePackets.h\"\n \n+//npcbot\n+#include \"botdatamgr.h\"\n+//end npcbot\n+\n void BattlegroundEYScore::BuildObjectivesBlock(WorldPacket& data)\n {\n     data << uint32(1); // Objectives Count\n@@ -135,6 +139,29 @@ void BattlegroundEY::UpdatePointsState()\n         _capturePointInfo[point]._playersCount[TEAM_HORDE] = 0;\n     }\n \n+    //npcbot\n+    for (decltype(m_Bots)::value_type const& p : m_Bots)\n+    {\n+        if (Creature const* bot = BotDataMgr::FindBot(p.first.GetEntry()))\n+        {\n+            for (uint8 point = 0; point < EY_POINTS_MAX; ++point)\n+            {\n+                if (GameObject* pointObject = pointsVec[point])\n+                {\n+                    if (bot->IsAlive() && !bot->HasInvisibilityAura() && !bot->HasStealthAura() && bot->IsWithinDistInMap(pointObject, BG_EY_POINT_RADIUS))\n+                    {\n+                        ++_capturePointInfo[point]._playersCount[GetBotTeamId(p.first)];\n+                        _capturePointInfo[point].player = nullptr;\n+                        _capturePointInfo[point].bot = const_cast<Creature*>(bot);\n+                        if (pointObject->GetEntry() == BG_OBJECT_FR_TOWER_CAP_EY_ENTRY && bot->GetDistance2d(2043.96f, 1729.68f) < 3.0f)\n+                            HandleBotAreaTrigger(_capturePointInfo[point].bot, AT_FEL_REAVER_POINT);\n+                    }\n+                }\n+            }\n+        }\n+    }\n+    //end npcbot\n+\n     const BattlegroundPlayerMap& bgPlayerMap = GetPlayers();\n     for (BattlegroundPlayerMap::const_iterator itr = bgPlayerMap.begin(); itr != bgPlayerMap.end(); ++itr)\n     {\n@@ -147,6 +174,9 @@ void BattlegroundEY::UpdatePointsState()\n                     itr->second->SendUpdateWorldState(WORLD_STATE_BATTLEGROUND_EY_PROGRESS_BAR_PERCENT_GREY, BG_EY_PROGRESS_BAR_PERCENT_GREY);\n                     itr->second->SendUpdateWorldState(WORLD_STATE_BATTLEGROUND_EY_PROGRESS_BAR_STATUS, _capturePointInfo[point]._barStatus);\n                     ++_capturePointInfo[point]._playersCount[itr->second->GetTeamId()];\n+                    //npcbot\n+                    _capturePointInfo[point].bot = nullptr;\n+                    //end npcbot\n                     _capturePointInfo[point].player = itr->second;\n \n                     // Xinef: ugly hax... area trigger is no longer called by client...\n@@ -166,6 +196,18 @@ void BattlegroundEY::UpdatePointsState()\n         else if (_capturePointInfo[point]._barStatus >= BG_EY_PROGRESS_BAR_NEUTRAL_HIGH)\n             pointOwnerTeamId = TEAM_ALLIANCE;\n \n+        //npcbot\n+        if (pointOwnerTeamId != _capturePointInfo[point]._ownerTeamId && !_capturePointInfo[point].player)\n+        {\n+            if (_capturePointInfo[point].IsUncontrolled())\n+                EventBotTeamCapturedPoint(_capturePointInfo[point].bot, pointOwnerTeamId, point);\n+\n+            if (pointOwnerTeamId == TEAM_NEUTRAL && _capturePointInfo[point].IsUnderControl())\n+                EventBotTeamLostPoint(_capturePointInfo[point].bot, point);\n+            continue;\n+        }\n+        //end npcbot\n+\n         if (pointOwnerTeamId != _capturePointInfo[point]._ownerTeamId)\n         {\n             if (_capturePointInfo[point].IsUncontrolled())\n@@ -213,12 +255,29 @@ void BattlegroundEY::AddPlayer(Player* player)\n     PlayerScores.emplace(player->GetGUID().GetCounter(), new BattlegroundEYScore(player->GetGUID()));\n }\n \n+//npcbot\n+void BattlegroundEY::AddBot(Creature* bot)\n+{\n+    Battleground::AddBot(bot);\n+    BotScores.emplace(bot->GetEntry(), new BattlegroundEYScore(bot->GetGUID()));\n+}\n+//end npcbot\n+\n void BattlegroundEY::RemovePlayer(Player* player)\n {\n     if (GetFlagPickerGUID() == player->GetGUID())\n         EventPlayerDroppedFlag(player);\n }\n \n+//npcbot\n+void BattlegroundEY::RemoveBot(ObjectGuid guid)\n+{\n+    if (GetFlagPickerGUID() == guid)\n+        if (Creature const* bot = BotDataMgr::FindBot(guid.GetEntry()))\n+            EventBotDroppedFlag(const_cast<Creature*>(bot));\n+}\n+//end npcbot\n+\n void BattlegroundEY::HandleAreaTrigger(Player* player, uint32 trigger)\n {\n     if (GetStatus() != STATUS_IN_PROGRESS || !player->IsAlive())\n@@ -261,6 +320,53 @@ void BattlegroundEY::HandleAreaTrigger(Player* player, uint32 trigger)\n     }\n }\n \n+//npcbot\n+void BattlegroundEY::HandleBotAreaTrigger(Creature* bot, uint32 trigger)\n+{\n+    if (GetStatus() != STATUS_IN_PROGRESS || !bot->IsAlive())\n+        return;\n+\n+    TeamId botteamid = GetBotTeamId(bot->GetGUID());\n+\n+    switch (trigger)\n+    {\n+        case AT_BLOOD_ELF_POINT:\n+            if (_capturePointInfo[POINT_BLOOD_ELF].IsUnderControl(botteamid))\n+                if (_flagState == BG_EY_FLAG_STATE_ON_PLAYER && GetFlagPickerGUID() == bot->GetGUID())\n+                    EventBotCapturedFlag(bot, BG_EY_OBJECT_FLAG_BLOOD_ELF);\n+            break;\n+        case AT_FEL_REAVER_POINT:\n+            if (_capturePointInfo[POINT_FEL_REAVER].IsUnderControl(botteamid))\n+                if (_flagState == BG_EY_FLAG_STATE_ON_PLAYER && GetFlagPickerGUID() == bot->GetGUID())\n+                    EventBotCapturedFlag(bot, BG_EY_OBJECT_FLAG_FEL_REAVER);\n+            break;\n+        case AT_MAGE_TOWER_POINT:\n+            if (_capturePointInfo[POINT_MAGE_TOWER].IsUnderControl(botteamid))\n+                if (_flagState == BG_EY_FLAG_STATE_ON_PLAYER && GetFlagPickerGUID() == bot->GetGUID())\n+                    EventBotCapturedFlag(bot, BG_EY_OBJECT_FLAG_MAGE_TOWER);\n+            break;\n+        case AT_DRAENEI_RUINS_POINT:\n+            if (_capturePointInfo[POINT_DRAENEI_RUINS].IsUnderControl(botteamid))\n+                if (_flagState == BG_EY_FLAG_STATE_ON_PLAYER && GetFlagPickerGUID() == bot->GetGUID())\n+                    EventBotCapturedFlag(bot, BG_EY_OBJECT_FLAG_DRAENEI_RUINS);\n+            break;\n+        case 4512:\n+        case 4515:\n+        case 4517:\n+        case 4519:\n+        case 4530:\n+        case 4531:\n+        case 5866:\n+            //break;\n+        case AT_BLOOD_ELF_BUFF:\n+        case AT_FEL_REAVER_BUFF:\n+        case AT_MAGE_TOWER_BUFF:\n+        case AT_DRAENEI_RUINS_BUFF:\n+            break;\n+    }\n+}\n+//end npcbot\n+\n bool BattlegroundEY::SetupBattleground()\n {\n     _honorTics = BattlegroundMgr::IsBGWeekend(GetBgTypeID(true)) ? BG_EY_HONOR_TICK_WEEKEND : BG_EY_HONOR_TICK_NORMAL;\n@@ -407,6 +513,33 @@ void BattlegroundEY::HandleKillPlayer(Player* player, Player* killer)\n     EventPlayerDroppedFlag(player);\n }\n \n+//npcbot\n+void BattlegroundEY::HandleBotKillPlayer(Creature* killer, Player* victim)\n+{\n+    if (GetStatus() != STATUS_IN_PROGRESS)\n+        return;\n+\n+    Battleground::HandleBotKillPlayer(killer, victim);\n+    EventPlayerDroppedFlag(victim);\n+}\n+void BattlegroundEY::HandleBotKillBot(Creature* killer, Creature* victim)\n+{\n+    if (GetStatus() != STATUS_IN_PROGRESS)\n+        return;\n+\n+    Battleground::HandleBotKillBot(killer, victim);\n+    EventBotDroppedFlag(victim);\n+}\n+void BattlegroundEY::HandlePlayerKillBot(Creature* victim, Player* killer)\n+{\n+    if (GetStatus() != STATUS_IN_PROGRESS)\n+        return;\n+\n+    Battleground::HandlePlayerKillBot(victim, killer);\n+    EventBotDroppedFlag(victim);\n+}\n+//end npcbot\n+\n void BattlegroundEY::EventPlayerDroppedFlag(Player* player)\n {\n     if (GetFlagPickerGUID() != player->GetGUID())\n@@ -429,6 +562,30 @@ void BattlegroundEY::EventPlayerDroppedFlag(Player* player)\n         SendBroadcastText(BG_EY_TEXT_FLAG_DROPPED, CHAT_MSG_BG_SYSTEM_HORDE);\n }\n \n+//npcbot\n+void BattlegroundEY::EventBotDroppedFlag(Creature* bot)\n+{\n+    if (GetFlagPickerGUID() != bot->GetGUID())\n+        return;\n+\n+    SetFlagPicker(ObjectGuid::Empty);\n+    bot->RemoveAurasDueToSpell(BG_EY_NETHERSTORM_FLAG_SPELL);\n+    if (GetStatus() != STATUS_IN_PROGRESS)\n+        return;\n+\n+    _flagState = BG_EY_FLAG_STATE_ON_GROUND;\n+    _bgEvents.RescheduleEvent(BG_EY_EVENT_FLAG_ON_GROUND, BG_EY_FLAG_ON_GROUND_TIME);\n+\n+    bot->CastSpell(bot, SPELL_RECENTLY_DROPPED_FLAG, true);\n+    bot->CastSpell(bot, BG_EY_PLAYER_DROPPED_FLAG_SPELL, true);\n+\n+    if (GetBotTeamId(bot->GetGUID()) == TEAM_ALLIANCE)\n+        SendBroadcastText(BG_EY_TEXT_FLAG_DROPPED, CHAT_MSG_BG_SYSTEM_ALLIANCE);\n+    else\n+        SendBroadcastText(BG_EY_TEXT_FLAG_DROPPED, CHAT_MSG_BG_SYSTEM_HORDE);\n+}\n+//end npcbot\n+\n void BattlegroundEY::EventPlayerClickedOnFlag(Player* player, GameObject* gameObject)\n {\n     if (GetStatus() != STATUS_IN_PROGRESS || GetFlagPickerGUID() || !player->IsWithinDistInMap(gameObject, 10.0f))\n@@ -451,6 +608,32 @@ void BattlegroundEY::EventPlayerClickedOnFlag(Player* player, GameObject* gameOb\n         SendBroadcastText(BG_EY_TEXT_TAKEN_FLAG, CHAT_MSG_BG_SYSTEM_HORDE, player);\n }\n \n+//npcbot\n+void BattlegroundEY::EventBotClickedOnFlag(Creature* bot, GameObject* target_obj)\n+{\n+    if (GetStatus() != STATUS_IN_PROGRESS || GetFlagPickerGUID() || !bot->IsWithinDistInMap(target_obj, 10.0f))\n+        return;\n+\n+    TeamId botteamid = GetBotTeamId(bot->GetGUID());\n+\n+    _flagState = BG_EY_FLAG_STATE_ON_PLAYER;\n+    SpawnBGObject(BG_EY_OBJECT_FLAG_NETHERSTORM, RESPAWN_ONE_DAY);\n+    SetFlagPicker(bot->GetGUID());\n+    SetDroppedFlagGUID(ObjectGuid::Empty);\n+\n+    bot->CastSpell(bot, BG_EY_NETHERSTORM_FLAG_SPELL, true);\n+    bot->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT);\n+\n+    PlaySoundToAll(botteamid == TEAM_ALLIANCE ? BG_EY_SOUND_FLAG_PICKED_UP_ALLIANCE : BG_EY_SOUND_FLAG_PICKED_UP_HORDE);\n+    UpdateWorldState(WORLD_STATE_BATTLEGROUND_EY_FLAG, 0);\n+\n+    if (botteamid == TEAM_ALLIANCE)\n+        SendBroadcastText(BG_EY_TEXT_TAKEN_FLAG, CHAT_MSG_BG_SYSTEM_ALLIANCE, bot);\n+    else\n+        SendBroadcastText(BG_EY_TEXT_TAKEN_FLAG, CHAT_MSG_BG_SYSTEM_HORDE, bot);\n+}\n+//end npcbot\n+\n void BattlegroundEY::EventTeamLostPoint(Player* player, uint32 point)\n {\n     TeamId oldTeamId = _capturePointInfo[point]._ownerTeamId;\n@@ -488,6 +671,46 @@ void BattlegroundEY::EventTeamLostPoint(Player* player, uint32 point)\n     }, 500ms);\n }\n \n+//npcbot\n+void BattlegroundEY::EventBotTeamLostPoint(Creature const* bot, uint32 point)\n+{\n+    TeamId oldTeamId = _capturePointInfo[point]._ownerTeamId;\n+\n+    if (oldTeamId == TEAM_ALLIANCE)\n+    {\n+        _ownedPointsCount[TEAM_ALLIANCE]--;\n+        SpawnBGObject(m_LosingPointTypes[point].DespawnObjectTypeAlliance, RESPAWN_ONE_DAY);\n+        SpawnBGObject(m_LosingPointTypes[point].DespawnObjectTypeAlliance + 1, RESPAWN_ONE_DAY);\n+        SpawnBGObject(m_LosingPointTypes[point].DespawnObjectTypeAlliance + 2, RESPAWN_ONE_DAY);\n+        SendBroadcastText(m_LosingPointTypes[point].MessageIdAlliance, CHAT_MSG_BG_SYSTEM_ALLIANCE, bot);\n+    }\n+    else\n+    {\n+        _ownedPointsCount[TEAM_HORDE]--;\n+        SpawnBGObject(m_LosingPointTypes[point].DespawnObjectTypeHorde, RESPAWN_ONE_DAY);\n+        SpawnBGObject(m_LosingPointTypes[point].DespawnObjectTypeHorde + 1, RESPAWN_ONE_DAY);\n+        SpawnBGObject(m_LosingPointTypes[point].DespawnObjectTypeHorde + 2, RESPAWN_ONE_DAY);\n+        SendBroadcastText(m_LosingPointTypes[point].MessageIdHorde, CHAT_MSG_BG_SYSTEM_HORDE, bot);\n+    }\n+\n+    SpawnBGObject(m_LosingPointTypes[point].SpawnNeutralObjectType, RESPAWN_IMMEDIATELY);\n+    SpawnBGObject(m_LosingPointTypes[point].SpawnNeutralObjectType + 1, RESPAWN_IMMEDIATELY);\n+    SpawnBGObject(m_LosingPointTypes[point].SpawnNeutralObjectType + 2, RESPAWN_IMMEDIATELY);\n+\n+    _capturePointInfo[point]._ownerTeamId = TEAM_NEUTRAL;\n+\n+    UpdatePointsIcons(point);\n+    UpdatePointsCount();\n+    DelCreature(BG_EY_TRIGGER_FEL_REAVER + point);\n+\n+    _reviveEvents.AddEventAtOffset([this, point]()\n+    {\n+        RelocateDeadPlayers(BgCreatures[point]);\n+        DelCreature(point);\n+    }, 500ms);\n+}\n+//end npcbot\n+\n void BattlegroundEY::EventTeamCapturedPoint(Player* player, TeamId teamId, uint32 point)\n {\n     SpawnBGObject(m_CapturingPointTypes[point].DespawnNeutralObjectType, RESPAWN_ONE_DAY);\n@@ -531,6 +754,51 @@ void BattlegroundEY::EventTeamCapturedPoint(Player* player, TeamId teamId, uint3\n     }\n }\n \n+//npcbot\n+void BattlegroundEY::EventBotTeamCapturedPoint(Creature const* bot, TeamId teamId, uint32 point)\n+{\n+    SpawnBGObject(m_CapturingPointTypes[point].DespawnNeutralObjectType, RESPAWN_ONE_DAY);\n+    SpawnBGObject(m_CapturingPointTypes[point].DespawnNeutralObjectType + 1, RESPAWN_ONE_DAY);\n+    SpawnBGObject(m_CapturingPointTypes[point].DespawnNeutralObjectType + 2, RESPAWN_ONE_DAY);\n+\n+    if (teamId == TEAM_ALLIANCE)\n+    {\n+        _ownedPointsCount[TEAM_ALLIANCE]++;\n+        SpawnBGObject(m_CapturingPointTypes[point].SpawnObjectTypeAlliance, RESPAWN_IMMEDIATELY);\n+        SpawnBGObject(m_CapturingPointTypes[point].SpawnObjectTypeAlliance + 1, RESPAWN_IMMEDIATELY);\n+        SpawnBGObject(m_CapturingPointTypes[point].SpawnObjectTypeAlliance + 2, RESPAWN_IMMEDIATELY);\n+        SendBroadcastText(m_CapturingPointTypes[point].MessageIdAlliance, CHAT_MSG_BG_SYSTEM_ALLIANCE, bot);\n+    }\n+    else\n+    {\n+        _ownedPointsCount[TEAM_HORDE]++;\n+        SpawnBGObject(m_CapturingPointTypes[point].SpawnObjectTypeHorde, RESPAWN_IMMEDIATELY);\n+        SpawnBGObject(m_CapturingPointTypes[point].SpawnObjectTypeHorde + 1, RESPAWN_IMMEDIATELY);\n+        SpawnBGObject(m_CapturingPointTypes[point].SpawnObjectTypeHorde + 2, RESPAWN_IMMEDIATELY);\n+        SendBroadcastText(m_CapturingPointTypes[point].MessageIdHorde, CHAT_MSG_BG_SYSTEM_HORDE, bot);\n+    }\n+\n+    _capturePointInfo[point]._ownerTeamId = teamId;\n+\n+    GraveyardStruct const* sg = sGraveyard->GetGraveyard(m_CapturingPointTypes[point].GraveyardId);\n+    AddSpiritGuide(point, sg->x, sg->y, sg->z, 3.124139f, teamId);\n+\n+    UpdatePointsIcons(point);\n+    UpdatePointsCount();\n+\n+    // Xinef: done this way to avoid errors in console\n+    Creature* trigger = GetBgMap()->GetCreature(BgCreatures[std::size_t(BG_EY_TRIGGER_FEL_REAVER) + point]);\n+    if (!trigger)\n+        trigger = AddCreature(WORLD_TRIGGER, BG_EY_TRIGGER_FEL_REAVER + point, BG_EY_TriggerPositions[point][0], BG_EY_TriggerPositions[point][1], BG_EY_TriggerPositions[point][2], BG_EY_TriggerPositions[point][3]);\n+\n+    if (trigger)\n+    {\n+        trigger->SetFaction(teamId == TEAM_ALLIANCE ? FACTION_ALLIANCE_GENERIC : FACTION_HORDE_GENERIC);\n+        trigger->CastSpell(trigger, SPELL_HONORABLE_DEFENDER_25Y, true);\n+    }\n+}\n+//end npcbot\n+\n void BattlegroundEY::EventPlayerCapturedFlag(Player* player, uint32 BgObjectType)\n {\n     SetFlagPicker(ObjectGuid::Empty);\n@@ -558,6 +826,37 @@ void BattlegroundEY::EventPlayerCapturedFlag(Player* player, uint32 BgObjectType\n         AddPoints(player->GetTeamId(), BG_EY_FlagPoints[_ownedPointsCount[player->GetTeamId()] - 1]);\n }\n \n+//npcbot\n+void BattlegroundEY::EventBotCapturedFlag(Creature* bot, uint32 bgObjectType)\n+{\n+    TeamId botteamid = GetBotTeamId(bot->GetGUID());\n+\n+    SetFlagPicker(ObjectGuid::Empty);\n+    _flagState = BG_EY_FLAG_STATE_ON_BASE;\n+    bot->RemoveAurasDueToSpell(BG_EY_NETHERSTORM_FLAG_SPELL);\n+    bot->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT);\n+\n+    SpawnBGObject(bgObjectType, RESPAWN_IMMEDIATELY);\n+    _bgEvents.RescheduleEvent(BG_EY_EVENT_RESPAWN_FLAG, BG_EY_FLAG_RESPAWN_TIME);\n+    _flagCapturedObject = bgObjectType;\n+\n+    if (botteamid == TEAM_ALLIANCE)\n+    {\n+        PlaySoundToAll(BG_EY_SOUND_FLAG_CAPTURED_ALLIANCE);\n+        SendBroadcastText(BG_EY_TEXT_ALLIANCE_CAPTURED_FLAG, CHAT_MSG_BG_SYSTEM_ALLIANCE, bot);\n+    }\n+    else\n+    {\n+        PlaySoundToAll(BG_EY_SOUND_FLAG_CAPTURED_HORDE);\n+        SendBroadcastText(BG_EY_TEXT_HORDE_CAPTURED_FLAG, CHAT_MSG_BG_SYSTEM_HORDE, bot);\n+    }\n+\n+    UpdateBotScore(bot, SCORE_FLAG_CAPTURES, 1);\n+    if (_ownedPointsCount[botteamid] > 0)\n+        AddPoints(botteamid, BG_EY_FlagPoints[_ownedPointsCount[botteamid] - 1]);\n+}\n+//end npcbot\n+\n bool BattlegroundEY::UpdatePlayerScore(Player* player, uint32 type, uint32 value, bool doAddHonor)\n {\n     if (!Battleground::UpdatePlayerScore(player, type, value, doAddHonor))\n@@ -575,6 +874,15 @@ bool BattlegroundEY::UpdatePlayerScore(Player* player, uint32 type, uint32 value\n     return true;\n }\n \n+//npcbot\n+bool BattlegroundEY::UpdateBotScore(Creature const* bot, uint32 type, uint32 value)\n+{\n+    if (!Battleground::UpdateBotScore(bot, type, value))\n+        return false;\n+    return true;\n+}\n+//end npcbot\n+\n void BattlegroundEY::FillInitialWorldStates(WorldPackets::WorldState::InitWorldStates& packet)\n {\n     packet.Worldstates.reserve(22);\n@@ -628,6 +936,36 @@ GraveyardStruct const* BattlegroundEY::GetClosestGraveyard(Player* player)\n     return nearestEntry;\n }\n \n+//npcbot\n+GraveyardStruct const* BattlegroundEY::GetClosestGraveyardForBot(Creature* bot) const\n+{\n+    GraveyardStruct const* entry = sGraveyard->GetGraveyard(static_cast<uint16>(BG_EY_GRAVEYARD_MAIN_ALLIANCE) + GetBotTeamId(bot->GetGUID()));\n+    GraveyardStruct const* myEntry = entry;\n+\n+    float x = bot->GetPositionX();\n+    float y = bot->GetPositionY();\n+    float z = bot->GetPositionZ();\n+    float dist = (entry->x - x) * (entry->x - x) + (entry->y - y) * (entry->y - y) + (entry->z - z) * (entry->z - z);\n+    float minDist = dist;\n+\n+    for (uint8 i = 0; i < EY_POINTS_MAX; ++i)\n+    {\n+        if (_capturePointInfo[i].IsUnderControl(GetBotTeamId(bot->GetGUID())))\n+        {\n+            entry = sGraveyard->GetGraveyard(m_CapturingPointTypes[i].GraveyardId);\n+            dist = (entry->x - x) * (entry->x - x) + (entry->y - y) * (entry->y - y) + (entry->z - z) * (entry->z - z);\n+            if (dist < minDist)\n+            {\n+                minDist = dist;\n+                myEntry = entry;\n+            }\n+        }\n+    }\n+\n+    return myEntry;\n+}\n+//end npcbot\n+\n bool BattlegroundEY::AllNodesConrolledByTeam(TeamId teamId) const\n {\n     uint32 count = 0;\ndiff --git a/src/server/game/Battlegrounds/Zones/BattlegroundEY.h b/src/server/game/Battlegrounds/Zones/BattlegroundEY.h\nindex 2730a06041..48f9d36f3a 100644\n--- a/src/server/game/Battlegrounds/Zones/BattlegroundEY.h\n+++ b/src/server/game/Battlegrounds/Zones/BattlegroundEY.h\n@@ -377,6 +377,24 @@ public:\n     void SetDroppedFlagGUID(ObjectGuid guid, TeamId /*teamId*/ = TEAM_NEUTRAL) override  { _droppedFlagGUID = guid; }\n     ObjectGuid GetDroppedFlagGUID() const { return _droppedFlagGUID; }\n \n+    //npcbot\n+    void AddBot(Creature* bot) override;\n+    GraveyardStruct const* GetClosestGraveyardForBot(Creature* bot) const override;\n+    void RemoveBot(ObjectGuid guid) override;\n+    bool UpdateBotScore(Creature const* bot, uint32 type, uint32 value) override;\n+    void HandleBotKillPlayer(Creature* killer, Player* victim) override;\n+    void HandleBotKillBot(Creature* killer, Creature* victim) override;\n+    void HandlePlayerKillBot(Creature* victim, Player* killer) override;\n+    void EventBotDroppedFlag(Creature* bot) override;\n+    void EventBotClickedOnFlag(Creature* bot, GameObject* target_obj) override;\n+    void HandleBotAreaTrigger(Creature* bot, uint32 trigger) override;\n+    void EventBotCapturedFlag(Creature* bot, uint32 bgObjectType);\n+    void EventBotTeamCapturedPoint(Creature const* bot, TeamId teamId, uint32 point);\n+    void EventBotTeamLostPoint(Creature const* bot, uint32 point);\n+    int8 GetPlayersCountNearPoint(uint8 point, TeamId teamId) const { return _capturePointInfo[point]._playersCount[teamId]; }\n+    TeamId GetPointOwner(uint8 point) const { return _capturePointInfo[point]._ownerTeamId; }\n+    //end npcbot\n+\n     /* Battleground Events */\n     void EventPlayerClickedOnFlag(Player* player, GameObject* gameObject) override;\n     void EventPlayerDroppedFlag(Player* player) override;\n@@ -413,6 +431,9 @@ private:\n         uint32 _areaTrigger;\n         int8 _playersCount[PVP_TEAMS_COUNT];\n         Player* player = nullptr;\n+        //npcbot\n+        Creature* bot = nullptr;\n+        //end npcbot\n \n         bool IsUnderControl(TeamId teamId) const { return _ownerTeamId == teamId; }\n         bool IsUnderControl() const { return _ownerTeamId != TEAM_NEUTRAL; }\ndiff --git a/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp\nindex f5bd8a84f8..191c507a27 100644\n--- a/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp\n+++ b/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp\n@@ -26,6 +26,11 @@\n #include \"WorldPacket.h\"\n #include \"WorldStateDefines.h\"\n \n+//npcbot\n+#include \"botdatamgr.h\"\n+#include \"botmgr.h\"\n+//end npcbot\n+\n void BattlegroundWGScore::BuildObjectivesBlock(WorldPacket& data)\n {\n     data << uint32(2); // Objectives Count\n@@ -148,6 +153,16 @@ void BattlegroundWS::AddPlayer(Player* player)\n     PlayerScores.emplace(player->GetGUID().GetCounter(), new BattlegroundWGScore(player->GetGUID()));\n }\n \n+//npcbot\n+void BattlegroundWS::AddBot(Creature* bot)\n+{\n+    bool const isInBattleground = IsPlayerInBattleground(bot->GetGUID());\n+    Battleground::AddBot(bot);\n+    if (!isInBattleground)\n+        BotScores[bot->GetEntry()] = new BattlegroundWGScore(bot->GetGUID());\n+}\n+//end npcbot\n+\n void BattlegroundWS::RespawnFlagAfterDrop(TeamId teamId)\n {\n     if (GetStatus() != STATUS_IN_PROGRESS || GetFlagState(teamId) != BG_WS_FLAG_STATE_ON_GROUND)\n@@ -235,6 +250,56 @@ void BattlegroundWS::EventPlayerCapturedFlag(Player* player)\n     _bgEvents.CancelEvent(BG_WS_EVENT_BOTH_FLAGS_KEPT15);\n }\n \n+//npcbot\n+void BattlegroundWS::EventBotCapturedFlag(Creature* bot)\n+{\n+    if (GetStatus() != STATUS_IN_PROGRESS)\n+        return;\n+\n+    bot->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT);\n+    RemoveAssaultAuras();\n+\n+    AddPoints(GetBotTeamId(bot->GetGUID()), 1);\n+    SetFlagPicker(ObjectGuid::Empty, GetOtherTeamId(GetBotTeamId(bot->GetGUID())));\n+    UpdateFlagState(GetOtherTeamId(GetBotTeamId(bot->GetGUID())), BG_WS_FLAG_STATE_ON_BASE);\n+\n+    if (GetBotTeamId(bot->GetGUID()) == TEAM_ALLIANCE)\n+    {\n+        bot->RemoveAurasDueToSpell(BG_WS_SPELL_WARSONG_FLAG);\n+        PlaySoundToAll(BG_WS_SOUND_FLAG_CAPTURED_ALLIANCE);\n+        SendBroadcastText(BG_WS_TEXT_CAPTURED_HORDE_FLAG, CHAT_MSG_BG_SYSTEM_ALLIANCE, bot);\n+        RewardReputationToTeam(890, _reputationCapture, TEAM_ALLIANCE);\n+    }\n+    else\n+    {\n+        bot->RemoveAurasDueToSpell(BG_WS_SPELL_SILVERWING_FLAG);\n+        PlaySoundToAll(BG_WS_SOUND_FLAG_CAPTURED_HORDE);\n+        SendBroadcastText(BG_WS_TEXT_CAPTURED_ALLIANCE_FLAG, CHAT_MSG_BG_SYSTEM_HORDE, bot);\n+        RewardReputationToTeam(889, _reputationCapture, TEAM_HORDE);\n+    }\n+\n+    SpawnBGObject(BG_WS_OBJECT_H_FLAG, BG_WS_FLAG_RESPAWN_TIME);\n+    SpawnBGObject(BG_WS_OBJECT_A_FLAG, BG_WS_FLAG_RESPAWN_TIME);\n+\n+    UpdateWorldState(GetBotTeamId(bot->GetGUID()) == TEAM_ALLIANCE ? WORLD_STATE_BATTLEGROUND_WS_FLAG_CAPTURES_ALLIANCE : WORLD_STATE_BATTLEGROUND_WS_FLAG_CAPTURES_HORDE, GetTeamScore(GetBotTeamId(bot->GetGUID())));\n+    UpdateBotScore(bot, SCORE_FLAG_CAPTURES, 1);      // +1 flag captures\n+    _lastFlagCaptureTeam = GetBotTeamId(bot->GetGUID());\n+\n+    RewardHonorToTeam(GetBonusHonorFromKill(2), GetBotTeamId(bot->GetGUID()));\n+\n+    if (GetTeamScore(TEAM_ALLIANCE) == BG_WS_MAX_TEAM_SCORE || GetTeamScore(TEAM_HORDE) == BG_WS_MAX_TEAM_SCORE)\n+    {\n+        UpdateWorldState(WORLD_STATE_BATTLEGROUND_WS_STATE_TIMER_ACTIVE, 0);\n+        EndBattleground(GetTeamScore(TEAM_HORDE) == BG_WS_MAX_TEAM_SCORE ? TEAM_HORDE : TEAM_ALLIANCE);\n+    }\n+    else\n+        _bgEvents.ScheduleEvent(BG_WS_EVENT_RESPAWN_BOTH_FLAGS, Milliseconds(BG_WS_FLAG_RESPAWN_TIME));\n+\n+    _bgEvents.CancelEvent(BG_WS_EVENT_BOTH_FLAGS_KEPT10);\n+    _bgEvents.CancelEvent(BG_WS_EVENT_BOTH_FLAGS_KEPT15);\n+}\n+//end npcbot\n+\n void BattlegroundWS::EventPlayerDroppedFlag(Player* player)\n {\n     if (GetFlagPickerGUID(TEAM_HORDE) != player->GetGUID() && GetFlagPickerGUID(TEAM_ALLIANCE) != player->GetGUID())\n@@ -265,6 +330,38 @@ void BattlegroundWS::EventPlayerDroppedFlag(Player* player)\n     }\n }\n \n+//npcbot\n+void BattlegroundWS::EventBotDroppedFlag(Creature* bot)\n+{\n+    if (GetFlagPickerGUID(TEAM_HORDE) != bot->GetGUID() && GetFlagPickerGUID(TEAM_ALLIANCE) != bot->GetGUID())\n+        return;\n+\n+    SetFlagPicker(ObjectGuid::Empty, GetOtherTeamId(GetBotTeamId(bot->GetGUID())));\n+    bot->RemoveAurasDueToSpell(BG_WS_SPELL_WARSONG_FLAG);\n+    bot->RemoveAurasDueToSpell(BG_WS_SPELL_FOCUSED_ASSAULT);\n+    bot->RemoveAurasDueToSpell(BG_WS_SPELL_BRUTAL_ASSAULT);\n+\n+    if (GetStatus() != STATUS_IN_PROGRESS)\n+        return;\n+\n+    bot->CastSpell(bot, SPELL_RECENTLY_DROPPED_FLAG, true);\n+    if (GetBotTeamId(bot->GetGUID()) == TEAM_ALLIANCE)\n+    {\n+        UpdateFlagState(TEAM_HORDE, BG_WS_FLAG_STATE_ON_GROUND);\n+        bot->CastSpell(bot, BG_WS_SPELL_WARSONG_FLAG_DROPPED, true);\n+        SendBroadcastText(BG_WS_TEXT_HORDE_FLAG_DROPPED, CHAT_MSG_BG_SYSTEM_HORDE, bot);\n+        _bgEvents.RescheduleEvent(BG_WS_EVENT_HORDE_DROP_FLAG, BG_WS_FLAG_DROP_TIME);\n+    }\n+    else\n+    {\n+        UpdateFlagState(TEAM_ALLIANCE, BG_WS_FLAG_STATE_ON_GROUND);\n+        bot->CastSpell(bot, BG_WS_SPELL_SILVERWING_FLAG_DROPPED, true);\n+        SendBroadcastText(BG_WS_TEXT_ALLIANCE_FLAG_DROPPED, CHAT_MSG_BG_SYSTEM_ALLIANCE, bot);\n+        _bgEvents.RescheduleEvent(BG_WS_EVENT_ALLIANCE_DROP_FLAG, BG_WS_FLAG_DROP_TIME);\n+    }\n+}\n+//end npcbot\n+\n void BattlegroundWS::EventPlayerClickedOnFlag(Player* player, GameObject* gameObject)\n {\n     if (GetStatus() != STATUS_IN_PROGRESS)\n@@ -383,6 +480,153 @@ void BattlegroundWS::EventPlayerClickedOnFlag(Player* player, GameObject* gameOb\n     }\n }\n \n+//npcbot\n+void BattlegroundWS::EventBotClickedOnFlag(Creature* bot, GameObject* target_obj)\n+{\n+    if (GetStatus() != STATUS_IN_PROGRESS)\n+        return;\n+\n+    bot->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT);\n+\n+    // Alliance Flag picked up from base\n+    if (GetBotTeamId(bot->GetGUID()) == TEAM_HORDE && GetFlagState(TEAM_ALLIANCE) == BG_WS_FLAG_STATE_ON_BASE && BgObjects[BG_WS_OBJECT_A_FLAG] == target_obj->GetGUID())\n+    {\n+        SpawnBGObject(BG_WS_OBJECT_A_FLAG, RESPAWN_ONE_DAY);\n+        SetFlagPicker(bot->GetGUID(), TEAM_ALLIANCE);\n+        UpdateFlagState(TEAM_ALLIANCE, BG_WS_FLAG_STATE_ON_PLAYER);\n+        bot->CastSpell(bot, BG_WS_SPELL_SILVERWING_FLAG, true);\n+\n+        PlaySoundToAll(BG_WS_SOUND_ALLIANCE_FLAG_PICKED_UP);\n+        SendBroadcastText(BG_WS_TEXT_ALLIANCE_FLAG_PICKED_UP, CHAT_MSG_BG_SYSTEM_HORDE, bot);\n+\n+        if (GetFlagState(TEAM_HORDE) != BG_WS_FLAG_STATE_ON_BASE)\n+        {\n+            _bgEvents.RescheduleEvent(BG_WS_EVENT_BOTH_FLAGS_KEPT10, BG_WS_SPELL_FORCE_TIME);\n+            _bgEvents.RescheduleEvent(BG_WS_EVENT_BOTH_FLAGS_KEPT15, BG_WS_SPELL_BRUTAL_TIME);\n+        }\n+        return;\n+    }\n+\n+    // Horde Flag picked up from base\n+    if (GetBotTeamId(bot->GetGUID()) == TEAM_ALLIANCE && GetFlagState(TEAM_HORDE) == BG_WS_FLAG_STATE_ON_BASE && BgObjects[BG_WS_OBJECT_H_FLAG] == target_obj->GetGUID())\n+    {\n+        SpawnBGObject(BG_WS_OBJECT_H_FLAG, RESPAWN_ONE_DAY);\n+        SetFlagPicker(bot->GetGUID(), TEAM_HORDE);\n+        UpdateFlagState(TEAM_HORDE, BG_WS_FLAG_STATE_ON_PLAYER);\n+        bot->CastSpell(bot, BG_WS_SPELL_WARSONG_FLAG, true);\n+\n+        PlaySoundToAll(BG_WS_SOUND_HORDE_FLAG_PICKED_UP);\n+        SendBroadcastText(BG_WS_TEXT_HORDE_FLAG_PICKED_UP, CHAT_MSG_BG_SYSTEM_ALLIANCE, bot);\n+\n+        if (GetFlagState(TEAM_ALLIANCE) != BG_WS_FLAG_STATE_ON_BASE)\n+        {\n+            _bgEvents.RescheduleEvent(BG_WS_EVENT_BOTH_FLAGS_KEPT10, BG_WS_SPELL_FORCE_TIME);\n+            _bgEvents.RescheduleEvent(BG_WS_EVENT_BOTH_FLAGS_KEPT15, BG_WS_SPELL_BRUTAL_TIME);\n+        }\n+        return;\n+    }\n+    if (bot->IsMounted())\n+    {\n+        bot->Dismount();\n+        bot->RemoveAurasByType(SPELL_AURA_MOUNTED);\n+    }\n+    // Alliance Flag on ground\n+    if (GetFlagState(TEAM_ALLIANCE) == BG_WS_FLAG_STATE_ON_GROUND && bot->IsWithinDistInMap(target_obj, 10.0f) && target_obj->GetEntry() == BG_OBJECT_A_FLAG_GROUND_WS_ENTRY)\n+    {\n+        SetDroppedFlagGUID(ObjectGuid::Empty, TEAM_ALLIANCE);\n+        if (GetBotTeamId(bot->GetGUID()) == TEAM_ALLIANCE)\n+        {\n+            UpdateFlagState(TEAM_ALLIANCE, BG_WS_FLAG_STATE_ON_BASE);\n+            SpawnBGObject(BG_WS_OBJECT_A_FLAG, RESPAWN_IMMEDIATELY);\n+            UpdateBotScore(bot, SCORE_FLAG_RETURNS, 1);\n+\n+            PlaySoundToAll(BG_WS_SOUND_FLAG_RETURNED);\n+            SendBroadcastText(BG_WS_TEXT_ALLIANCE_FLAG_RETURNED, CHAT_MSG_BG_SYSTEM_ALLIANCE, bot);\n+            _bgEvents.CancelEvent(BG_WS_EVENT_BOTH_FLAGS_KEPT10);\n+            _bgEvents.CancelEvent(BG_WS_EVENT_BOTH_FLAGS_KEPT15);\n+            RemoveAssaultAuras();\n+\n+            CheckFlagKeeperInArea(TEAM_HORDE);\n+            return;\n+        }\n+        else\n+        {\n+            SetFlagPicker(bot->GetGUID(), TEAM_ALLIANCE);\n+            UpdateFlagState(TEAM_ALLIANCE, BG_WS_FLAG_STATE_ON_PLAYER);\n+            bot->CastSpell(bot, BG_WS_SPELL_SILVERWING_FLAG, true);\n+            if (uint32 assaultSpellId = GetAssaultSpellId())\n+                bot->CastSpell(bot, assaultSpellId, true);\n+\n+            PlaySoundToAll(BG_WS_SOUND_ALLIANCE_FLAG_PICKED_UP);\n+            SendBroadcastText(BG_WS_TEXT_ALLIANCE_FLAG_PICKED_UP, CHAT_MSG_BG_SYSTEM_HORDE, bot);\n+            return;\n+        }\n+    }\n+\n+    // Horde Flag on ground\n+    if (GetFlagState(TEAM_HORDE) == BG_WS_FLAG_STATE_ON_GROUND && bot->IsWithinDistInMap(target_obj, 10.0f) && target_obj->GetEntry() == BG_OBJECT_H_FLAG_GROUND_WS_ENTRY)\n+    {\n+        SetDroppedFlagGUID(ObjectGuid::Empty, TEAM_HORDE);\n+        if (GetBotTeamId(bot->GetGUID()) == TEAM_HORDE)\n+        {\n+            UpdateFlagState(TEAM_HORDE, BG_WS_FLAG_STATE_ON_BASE);\n+            SpawnBGObject(BG_WS_OBJECT_H_FLAG, RESPAWN_IMMEDIATELY);\n+            UpdateBotScore(bot, SCORE_FLAG_RETURNS, 1);\n+\n+            PlaySoundToAll(BG_WS_SOUND_FLAG_RETURNED);\n+            SendBroadcastText(BG_WS_TEXT_HORDE_FLAG_RETURNED, CHAT_MSG_BG_SYSTEM_HORDE, bot);\n+            _bgEvents.CancelEvent(BG_WS_EVENT_BOTH_FLAGS_KEPT10);\n+            _bgEvents.CancelEvent(BG_WS_EVENT_BOTH_FLAGS_KEPT15);\n+            RemoveAssaultAuras();\n+\n+            CheckFlagKeeperInArea(TEAM_ALLIANCE);\n+            return;\n+        }\n+        else\n+        {\n+            SetFlagPicker(bot->GetGUID(), TEAM_HORDE);\n+            UpdateFlagState(TEAM_HORDE, BG_WS_FLAG_STATE_ON_PLAYER);\n+            bot->CastSpell(bot, BG_WS_SPELL_WARSONG_FLAG, true);\n+            if (uint32 assaultSpellId = GetAssaultSpellId())\n+                bot->CastSpell(bot, assaultSpellId, true);\n+\n+            PlaySoundToAll(BG_WS_SOUND_HORDE_FLAG_PICKED_UP);\n+            SendBroadcastText(BG_WS_TEXT_HORDE_FLAG_PICKED_UP, CHAT_MSG_BG_SYSTEM_ALLIANCE, bot);\n+            return;\n+        }\n+    }\n+}\n+\n+void BattlegroundWS::RemoveBot(ObjectGuid guid)\n+{\n+    // sometimes flag aura not removed :(\n+    if (GetFlagPickerGUID(TEAM_ALLIANCE) == guid)\n+    {\n+        Creature const* bot = BotDataMgr::FindBot(guid.GetEntry());\n+        if (!bot)\n+        {\n+            LOG_ERROR(\"bg.battleground\", \"BattlegroundWS: Removing offline bot {} who has the FLAG!!\", guid.GetEntry());\n+            SetFlagPicker(ObjectGuid::Empty, TEAM_ALLIANCE);\n+            RespawnFlagAfterDrop(TEAM_ALLIANCE);\n+        }\n+        else\n+            EventBotDroppedFlag(const_cast<Creature*>(bot));\n+    }\n+    if (GetFlagPickerGUID(TEAM_HORDE) == guid)\n+    {\n+        Creature const* bot = BotDataMgr::FindBot(guid.GetEntry());\n+        if (!bot)\n+        {\n+            LOG_ERROR(\"bg.battleground\", \"BattlegroundWS: Removing offline bot {} who has the FLAG!!\", guid.GetEntry());\n+            SetFlagPicker(ObjectGuid::Empty, TEAM_HORDE);\n+            RespawnFlagAfterDrop(TEAM_HORDE);\n+        }\n+        else\n+            EventBotDroppedFlag(const_cast<Creature*>(bot));\n+    }\n+}\n+//end npcbot\n+\n void BattlegroundWS::RemovePlayer(Player* player)\n {\n     if (GetFlagPickerGUID(TEAM_ALLIANCE) == player->GetGUID() || GetFlagPickerGUID(TEAM_HORDE) == player->GetGUID())\n@@ -424,6 +668,37 @@ void BattlegroundWS::HandleAreaTrigger(Player* player, uint32 trigger)\n     }\n }\n \n+//npcbot\n+void BattlegroundWS::HandleBotAreaTrigger(Creature* bot, uint32 trigger)\n+{\n+    if (GetStatus() != STATUS_IN_PROGRESS || !bot->IsAlive())\n+        return;\n+\n+    switch (trigger)\n+    {\n+        case BG_WS_TRIGGER_ALLIANCE_FLAG_SPAWN: // Alliance Flag spawn\n+            if (GetFlagState(TEAM_ALLIANCE) == BG_WS_FLAG_STATE_ON_BASE && GetFlagPickerGUID(TEAM_HORDE) == bot->GetGUID())\n+                EventBotCapturedFlag(bot);\n+            break;\n+        case BG_WS_TRIGGER_HORDE_FLAG_SPAWN: // Horde Flag spawn\n+            if (GetFlagState(TEAM_HORDE) == BG_WS_FLAG_STATE_ON_BASE && GetFlagPickerGUID(TEAM_ALLIANCE) == bot->GetGUID())\n+                EventBotCapturedFlag(bot);\n+            break;\n+        case 3649: // Not used\n+        case 3688: // Not used\n+        case 4628: // Not used\n+        case 4629: // Not used\n+        case BG_WS_TRIGGER_ALLIANCE_ELIXIR_SPEED_SPAWN: // Alliance elixir of speed spawn\n+        case BG_WS_TRIGGER_HORDE_ELIXIR_SPEED_SPAWN: // Horde elixir of speed spawn\n+        case BG_WS_TRIGGER_ALLIANCE_ELIXIR_REGEN_SPAWN: // Alliance elixir of regeneration spawn\n+        case BG_WS_TRIGGER_HORDE_ELIXIR_REGEN_SPAWN: // Horde elixir of regeneration spawn\n+        case BG_WS_TRIGGER_ALLIANCE_ELIXIR_BERSERK_SPAWN: // Alliance elixir of berserk spawn\n+        case BG_WS_TRIGGER_HORDE_ELIXIR_BERSERK_SPAWN: // Horde elixir of berserk spawn\n+            break;\n+    }\n+}\n+//end npcbot\n+\n bool BattlegroundWS::SetupBattleground()\n {\n     _wsReputationRate = sWorld->getRate(RATE_REPUTATION_GAIN_WSG);\n@@ -528,6 +803,33 @@ void BattlegroundWS::HandleKillPlayer(Player* player, Player* killer)\n     Battleground::HandleKillPlayer(player, killer);\n }\n \n+//npcbot\n+void BattlegroundWS::HandleBotKillPlayer(Creature* killer, Player* victim)\n+{\n+    if (GetStatus() != STATUS_IN_PROGRESS)\n+        return;\n+\n+    EventPlayerDroppedFlag(victim);\n+    Battleground::HandleBotKillPlayer(killer, victim);\n+}\n+void BattlegroundWS::HandleBotKillBot(Creature* killer, Creature* victim)\n+{\n+    if (GetStatus() != STATUS_IN_PROGRESS)\n+        return;\n+\n+    EventBotDroppedFlag(victim);\n+    Battleground::HandleBotKillBot(killer, victim);\n+}\n+void BattlegroundWS::HandlePlayerKillBot(Creature* victim, Player* killer)\n+{\n+    if (GetStatus() != STATUS_IN_PROGRESS)\n+        return;\n+\n+    EventBotDroppedFlag(victim);\n+    Battleground::HandlePlayerKillBot(victim, killer);\n+}\n+//end npcbot\n+\n bool BattlegroundWS::UpdatePlayerScore(Player* player, uint32 type, uint32 value, bool doAddHonor)\n {\n     if (!Battleground::UpdatePlayerScore(player, type, value, doAddHonor))\n@@ -546,6 +848,16 @@ bool BattlegroundWS::UpdatePlayerScore(Player* player, uint32 type, uint32 value\n     return true;\n }\n \n+//npcbot\n+bool BattlegroundWS::UpdateBotScore(Creature const* bot, uint32 type, uint32 value)\n+{\n+    if (!Battleground::UpdateBotScore(bot, type, value))\n+        return false;\n+\n+    return true;\n+}\n+//end npcbot\n+\n GraveyardStruct const* BattlegroundWS::GetClosestGraveyard(Player* player)\n {\n     if (GetStatus() == STATUS_IN_PROGRESS)\n@@ -554,6 +866,16 @@ GraveyardStruct const* BattlegroundWS::GetClosestGraveyard(Player* player)\n         return sGraveyard->GetGraveyard(player->GetTeamId() == TEAM_ALLIANCE ? WS_GRAVEYARD_FLAGROOM_ALLIANCE : WS_GRAVEYARD_FLAGROOM_HORDE);\n }\n \n+//npcbot\n+GraveyardStruct const* BattlegroundWS::GetClosestGraveyardForBot(Creature* bot) const\n+{\n+    if (GetStatus() == STATUS_IN_PROGRESS)\n+        return sGraveyard->GetGraveyard(GetBotTeamId(bot->GetGUID()) == TEAM_ALLIANCE ? WS_GRAVEYARD_MAIN_ALLIANCE : WS_GRAVEYARD_MAIN_HORDE);\n+    else\n+        return sGraveyard->GetGraveyard(GetBotTeamId(bot->GetGUID()) == TEAM_ALLIANCE ? WS_GRAVEYARD_FLAGROOM_ALLIANCE : WS_GRAVEYARD_FLAGROOM_HORDE);\n+}\n+//end npcbot\n+\n void BattlegroundWS::FillInitialWorldStates(WorldPackets::WorldState::InitWorldStates& packet)\n {\n     packet.Worldstates.reserve(7);\ndiff --git a/src/server/game/Battlegrounds/Zones/BattlegroundWS.h b/src/server/game/Battlegrounds/Zones/BattlegroundWS.h\nindex ff3dc64d61..af461585fc 100644\n--- a/src/server/game/Battlegrounds/Zones/BattlegroundWS.h\n+++ b/src/server/game/Battlegrounds/Zones/BattlegroundWS.h\n@@ -237,6 +237,20 @@ public:\n     void EndBattleground(TeamId winnerTeamId) override;\n     GraveyardStruct const* GetClosestGraveyard(Player* player) override;\n \n+    //npcbot\n+    GraveyardStruct const* GetClosestGraveyardForBot(Creature* bot) const override;\n+    void AddBot(Creature* bot) override;\n+    void RemoveBot(ObjectGuid guid) override;\n+    bool UpdateBotScore(Creature const* bot, uint32 type, uint32 value) override;\n+    void HandleBotKillPlayer(Creature* killer, Player* victim) override;\n+    void HandleBotKillBot(Creature* killer, Creature* victim) override;\n+    void HandlePlayerKillBot(Creature* victim, Player* killer) override;\n+    void EventBotDroppedFlag(Creature* bot) override;\n+    void EventBotClickedOnFlag(Creature* bot, GameObject* target_obj) override;\n+    void HandleBotAreaTrigger(Creature* bot, uint32 trigger) override;\n+    void EventBotCapturedFlag(Creature* bot);\n+    //end npcbot\n+\n     void UpdateFlagState(TeamId teamId, uint32 value);\n     bool UpdatePlayerScore(Player* player, uint32 type, uint32 value, bool doAddHonor = true) override;\n     void SetDroppedFlagGUID(ObjectGuid guid, TeamId teamId) override { _droppedFlagGUID[teamId] = guid; }\ndiff --git a/src/server/game/Combat/CombatManager.cpp b/src/server/game/Combat/CombatManager.cpp\nindex 60bcd77be4..d4c5a3e8cf 100644\n--- a/src/server/game/Combat/CombatManager.cpp\n+++ b/src/server/game/Combat/CombatManager.cpp\n@@ -33,6 +33,10 @@\n #include \"Unit.h\"\n #include \"UnitAI.h\"\n \n+//npcbot\n+#include \"botmgr.h\"\n+//end npcbot\n+\n /*static*/ bool CombatManager::CanBeginCombat(Unit const* a, Unit const* b)\n {\n     // Checks combat validity before initial reference creation.\n@@ -233,12 +237,33 @@ bool CombatManager::SetInCombatWith(Unit* who, bool addSecondUnitSuppressed)\n     CombatReference* ref;\n     if (_owner->IsControlledByPlayer() && who->IsControlledByPlayer())\n         ref = new PvPCombatReference(_owner, who);\n+    //npcbot: follow pvp rules\n+    else if ((_owner->ToCreature() && _owner->ToCreature()->IsNPCBotOrPet() && who->IsControlledByPlayer()) ||\n+        (who->ToCreature() && who->ToCreature()->IsNPCBotOrPet() && _owner->IsControlledByPlayer()) ||\n+        (_owner->ToCreature() && _owner->ToCreature()->IsNPCBotOrPet() &&\n+        who->ToCreature() && who->ToCreature()->IsNPCBotOrPet()))\n+        ref = new PvPCombatReference(_owner, who);\n+    //end npcbot\n     else\n         ref = new CombatReference(_owner, who);\n \n     if (addSecondUnitSuppressed)\n         ref->Suppress(who);\n \n+    //npcbot\n+    /*\n+    if (_owner->GetTypeId() == TYPEID_PLAYER && _owner->ToPlayer()->HaveBot())\n+    {\n+        BotMap const* map = _owner->ToPlayer()->GetBotMgr()->GetBotMap();\n+        for (BotMap::const_iterator itr = map->begin(); itr != map->end(); ++itr)\n+        {\n+            itr->second->SetInCombatWith(who);\n+            if (Unit* botPet = itr->second->GetBotsPet())\n+                botPet->SetInCombatWith(who);\n+        }\n+    }*/\n+    //end npcbot\n+\n     // ...and insert it into both managers\n     PutReference(who->GetGUID(), ref);\n     who->GetCombatManager().PutReference(_owner->GetGUID(), ref);\n@@ -288,6 +313,27 @@ void CombatManager::InheritCombatStatesFrom(Unit const* who)\n             continue;\n         SetInCombatWith(target);\n     }\n+    //npcbot\n+    for (auto& ref : mgr._pveRefs)\n+    {\n+        if (!IsInCombatWith(ref.first))\n+        {\n+            Unit* target = ref.second->GetOther(who);\n+            if ((_owner->IsImmuneToPC() && target->IsNPCBotOrPet()) ||\n+                (_owner->IsImmuneToNPC() && !target->IsNPCBotOrPet()))\n+                continue;\n+            SetInCombatWith(target);\n+        }\n+    }\n+    for (auto& ref : mgr._pvpRefs)\n+    {\n+        Unit* target = ref.second->GetOther(who);\n+        if ((_owner->IsImmuneToPC() && target->IsNPCBotOrPet()) ||\n+            (_owner->IsImmuneToNPC() && !target->IsNPCBotOrPet()))\n+            continue;\n+        SetInCombatWith(target);\n+    }\n+    //end npcbot\n }\n \n void CombatManager::EndCombatBeyondRange(float range, bool includingPvP)\n@@ -413,6 +459,18 @@ bool CombatManager::UpdateOwnerCombatState() const\n \n     if (combatState)\n     {\n+        //npcbot: party combat hook\n+        Player* playerOwner = nullptr;\n+        if (_owner->GetTypeId() == TYPEID_PLAYER && _owner->ToPlayer()->HaveBot())\n+            playerOwner = _owner->ToPlayer();\n+        else if (_owner->GetTypeId() == TYPEID_UNIT && _owner->ToCreature()->IsNPCBotOrPet() &&\n+            !_owner->ToCreature()->IsFreeBot())\n+            playerOwner = _owner->ToCreature()->GetBotOwner();\n+\n+        if (playerOwner)\n+            BotMgr::OnBotPartyEngage(playerOwner);\n+        //end npcbot\n+\n         _owner->SetUnitFlag(UNIT_FLAG_IN_COMBAT);\n         _owner->AtEnterCombat();\n         if (!_owner->IsCreature())\ndiff --git a/src/server/game/Conditions/ConditionMgr.cpp b/src/server/game/Conditions/ConditionMgr.cpp\nindex 213ee742fd..f74ee1a8cc 100644\n--- a/src/server/game/Conditions/ConditionMgr.cpp\n+++ b/src/server/game/Conditions/ConditionMgr.cpp\n@@ -33,6 +33,10 @@\n #include \"SpellMgr.h\"\n #include \"WorldState.h\"\n \n+//npcbot\n+#include \"bot_ai.h\"\n+//end npcbot\n+\n // Checks if object meets the condition\n // Can have CONDITION_SOURCE_TYPE_NONE && !mReferenceId if called from a special event (ie: eventAI)\n bool Condition::Meets(ConditionSourceInfo& sourceInfo)\n@@ -67,6 +71,11 @@ bool Condition::Meets(ConditionSourceInfo& sourceInfo)\n     {\n         if (Unit* unit = object->ToUnit())\n         {\n+            //npcbot\n+            if (object->IsNPCBot())\n+                condMeets = true;\n+            else\n+            //end npcbot\n             if (Player* player = unit->GetCharmerOrOwnerPlayerOrPlayerItself())\n             {\n                 // don't allow 0 items (it's checked during table load)\n@@ -81,6 +90,11 @@ bool Condition::Meets(ConditionSourceInfo& sourceInfo)\n     {\n         if (Unit* unit = object->ToUnit())\n         {\n+            //npcbot\n+            if (object->IsNPCBot())\n+                condMeets = true; //for now\n+            else\n+            //end npcbot\n             if (Player* player = unit->GetCharmerOrOwnerPlayerOrPlayerItself())\n             {\n                 condMeets = player->HasItemOrGemWithIdEquipped(ConditionValue1, 1);\n@@ -95,6 +109,14 @@ bool Condition::Meets(ConditionSourceInfo& sourceInfo)\n     {\n         if (Unit* unit = object->ToUnit())\n         {\n+            //npcbot\n+            if (object->IsNPCBot() && object->ToCreature()->GetBotAI() && !object->ToCreature()->IsFreeBot())\n+            {\n+                if (FactionEntry const* faction = sFactionStore.LookupEntry(ConditionValue1))\n+                   condMeets = (ConditionValue2 & (1 << object->ToCreature()->GetBotOwner()->GetReputationMgr().GetRank(faction)));\n+            }\n+            else\n+            //end npcbot\n             if (Player* player = unit->GetCharmerOrOwnerPlayerOrPlayerItself())\n             {\n                 if (FactionEntry const* faction = sFactionStore.LookupEntry(ConditionValue1))\n@@ -109,6 +131,11 @@ bool Condition::Meets(ConditionSourceInfo& sourceInfo)\n     {\n         if (Unit* unit = object->ToUnit())\n         {\n+            //npcbot\n+            if (object->IsNPCBot())\n+                condMeets = true;\n+            else\n+            //end npcbot\n             if (Player* player = unit->GetCharmerOrOwnerPlayerOrPlayerItself())\n             {\n                 condMeets = player->HasAchieved(ConditionValue1);\n@@ -120,6 +147,11 @@ bool Condition::Meets(ConditionSourceInfo& sourceInfo)\n     {\n         if (Unit* unit = object->ToUnit())\n         {\n+            //npcbot\n+            if (object->IsNPCBot() && object->ToCreature()->GetBotAI() && !object->ToCreature()->IsFreeBot())\n+                condMeets = object->ToCreature()->GetBotOwner()->GetTeamId() == ConditionValue1;\n+            else\n+            //end npcbot\n             if (Player* player = unit->GetCharmerOrOwnerPlayerOrPlayerItself())\n             {\n                 // Xinef: DB Data compatibility...\n@@ -145,6 +177,11 @@ bool Condition::Meets(ConditionSourceInfo& sourceInfo)\n     {\n         if (Unit* unit = object->ToUnit())\n         {\n+            //npcbot\n+            if (object->IsNPCBot())\n+                condMeets = object->ToCreature()->GetGender() == ConditionValue1;\n+            else\n+            //end npcbot\n             if (Player* player = unit->GetCharmerOrOwnerPlayerOrPlayerItself())\n             {\n                 condMeets = player->getGender() == ConditionValue1;\n@@ -156,6 +193,11 @@ bool Condition::Meets(ConditionSourceInfo& sourceInfo)\n     {\n         if (Unit* unit = object->ToUnit())\n         {\n+            //npcbot\n+            if (object->IsNPCBot())\n+                condMeets = true;\n+            else\n+            //end npcbot\n             if (Player* player = unit->GetCharmerOrOwnerPlayerOrPlayerItself())\n             {\n                 condMeets = player->HasSkill(ConditionValue1) && player->GetBaseSkillValue(ConditionValue1) >= ConditionValue2;\n@@ -262,6 +304,11 @@ bool Condition::Meets(ConditionSourceInfo& sourceInfo)\n     {\n         if (Unit* unit = object->ToUnit())\n         {\n+            //npcbot\n+            if (object->GetTypeId() == TYPEID_UNIT && object->ToCreature()->GetBotAI())\n+                condMeets = object->ToCreature()->GetBotAI()->HasSpell(sSpellMgr->GetSpellInfo(ConditionValue1)->GetFirstRankSpell()->Id);\n+            else\n+            //end npcbot\n             if (Player* player = unit->GetCharmerOrOwnerPlayerOrPlayerItself())\n             {\n                 condMeets = player->HasSpell(ConditionValue1);\ndiff --git a/src/server/game/DungeonFinding/LFGMgr.cpp b/src/server/game/DungeonFinding/LFGMgr.cpp\nindex 9da1f91995..8d8e895317 100644\n--- a/src/server/game/DungeonFinding/LFGMgr.cpp\n+++ b/src/server/game/DungeonFinding/LFGMgr.cpp\n@@ -40,6 +40,13 @@\n #include \"SpellAuras.h\"\n #include \"WorldSession.h\"\n \n+//npcbot\n+#include \"botconfig.h\"\n+#include \"botmgr.h\"\n+#include \"Chat.h\"\n+#include \"Creature.h\"\n+//end npcbot\n+\n namespace lfg\n {\n     LFGMgr::LFGMgr(): m_lfgProposalId(1), m_options(sWorld->getIntConfig(CONFIG_LFG_OPTIONSMASK)), m_Testing(sWorld->getBoolConfig(CONFIG_DEBUG_LFG))\n@@ -732,6 +739,37 @@ namespace lfg\n \n                             ++memberCount;\n                             players.insert(plrg->GetGUID());\n+\n+                            //npcbot\n+                            if (!plrg->HaveBot())\n+                                continue;\n+                            //add npcbots\n+                            BotMap const* map = plrg->GetBotMgr()->GetBotMap();\n+                            for (BotMap::const_iterator itr = map->begin(); itr != map->end(); ++itr)\n+                            {\n+                                if (!grp->IsMember(itr->first))\n+                                    continue;\n+\n+                                //disabled in config\n+                                if (!BotCfg::IsNpcBotDungeonFinderEnabled())\n+                                {\n+                                    (ChatHandler(plrg->GetSession())).SendSysMessage(\"Using npcbots in Dungeon Finder is restricted. Contact your administration.\");\n+\n+                                    if (plrg->GetGUID() != grp->GetLeaderGUID())\n+                                        if (Player* leader = ObjectAccessor::FindPlayer(grp->GetLeaderGUID()))\n+                                            (ChatHandler(leader->GetSession())).PSendSysMessage(\"There is a npcbot in your group (owner: {}). Using npcbots in Dungeon Finder is restricted. Contact your administration.\", plrg->GetName());\n+\n+                                    joinData.result = LFG_JOIN_PARTY_NOT_MEET_REQS;\n+                                    break;\n+                                }\n+\n+                                if (ObjectAccessor::GetCreature(*plrg, itr->first))\n+                                {\n+                                    ++memberCount;\n+                                    players.insert(itr->first);\n+                                }\n+                            }\n+                            //end npcbot\n                         }\n                     }\n \n@@ -836,6 +874,9 @@ namespace lfg\n             SetState(gguid, LFG_STATE_ROLECHECK);\n             // Send update to player\n             LfgUpdateData updateData = LfgUpdateData(LFG_UPDATETYPE_JOIN_QUEUE, dungeons, comment);\n+            //npcbot\n+            std::vector<std::pair<ObjectGuid, uint8>> bot_roles;\n+            //end npcbot\n             for (GroupReference* itr = grp->GetFirstMember(); itr != nullptr; itr = itr->next())\n             {\n                 if (Player* plrg = itr->GetSource())\n@@ -849,10 +890,57 @@ namespace lfg\n                     if (!debugNames.empty())\n                         debugNames.append(\", \");\n                     debugNames.append(plrg->GetName());\n+\n+                    //npcbot\n+                    if (!plrg->HaveBot())\n+                        continue;\n+                    //add npcbots\n+                    BotMap const* map = plrg->GetBotMgr()->GetBotMap();\n+                    for (BotMap::const_iterator itr = map->begin(); itr != map->end(); ++itr)\n+                    {\n+                        ObjectGuid bguid = itr->first;\n+                        if (players.find(bguid) == players.end() || !grp->IsMember(bguid))\n+                            continue;\n+\n+                        Creature* bot = ObjectAccessor::GetCreature(*plrg, bguid);\n+                        if (!bot)\n+                            continue;\n+\n+                        SetState(bguid, LFG_STATE_ROLECHECK);\n+                        if (!isContinue)\n+                            SetSelectedDungeons(bguid, dungeons);\n+                        roleCheck.roles[bguid] = 0;\n+                        if (!debugNames.empty())\n+                            debugNames.append(\", \");\n+                        debugNames.append(bot->GetName());\n+\n+                        //fill possible roles (as if player selected all roles possible for class)\n+                        uint8 broles = PLAYER_ROLE_DAMAGE;\n+                        if (bot->GetBotClass() == CLASS_WARRIOR || bot->GetBotClass() == CLASS_PALADIN ||\n+                            bot->GetBotClass() == CLASS_DEATH_KNIGHT || bot->GetBotClass() == CLASS_DRUID ||\n+                            (bot->GetBotRoles() & BOT_ROLE_TANK))\n+                            broles |= PLAYER_ROLE_TANK;\n+                        if (bot->GetBotClass() == CLASS_PRIEST || bot->GetBotClass() == CLASS_DRUID ||\n+                            bot->GetBotClass() == CLASS_SHAMAN || bot->GetBotClass() == CLASS_PALADIN ||\n+                            (bot->GetBotRoles() & BOT_ROLE_HEAL))\n+                            broles |= PLAYER_ROLE_HEALER;\n+                        //remove unneeded / occupied roles so players can go with role they choose\n+                        if (roles & PLAYER_ROLE_TANK)\n+                            broles &= ~PLAYER_ROLE_TANK;\n+                        if (roles & PLAYER_ROLE_HEALER)\n+                            broles &= ~PLAYER_ROLE_HEALER;\n+\n+                        bot_roles.emplace_back(bguid, broles);\n+                    }\n+                    //end npcbot\n                 }\n             }\n             // Update leader role\n             UpdateRoleCheck(gguid, guid, roles);\n+            //npcbot - update bots' roles\n+            for (decltype(bot_roles)::value_type const& brole_pair : bot_roles)\n+                UpdateRoleCheck(gguid, brole_pair.first, brole_pair.second);\n+            //end npcbot\n         }\n         else                                                   // Add player to queue\n         {\n@@ -1728,6 +1816,75 @@ namespace lfg\n             if (!player)\n                 continue;\n \n+            //npcbot - handle player's bots\n+            if (player->HaveBot())\n+            {\n+                Group* group = player->GetGroup();\n+                if (isPremadeGroup && !grp)\n+                {\n+                    oldGroupGUID = group->GetGUID();\n+                    grp = group;\n+                    grp->ConvertToLFG(false);\n+                    SetState(grp->GetGUID(), LFG_STATE_PROPOSAL);\n+                }\n+\n+                // Xinef: Apply Random Buff\n+                if (grp && !grp->IsLfgWithBuff())\n+                {\n+                    if (!group || group->GetGUID() != oldGroupGUID)\n+                        grp->AddLfgBuffFlag();\n+                    else\n+                        oldGroupGUID = group->GetGUID();\n+                }\n+\n+                // Xinef: Store amount of random players player grouped with\n+                if (group)\n+                {\n+                    SetRandomPlayersCount(pguid, group->GetMembersCount() >= MAXGROUPSIZE ? 0 : MAXGROUPSIZE - group->GetMembersCount());\n+                    oldGroupGUID = group->GetGUID();\n+                    if (group != grp)\n+                        group->RemoveMember(player->GetGUID());\n+                }\n+                else\n+                    SetRandomPlayersCount(pguid, MAXGROUPSIZE - 1);\n+\n+                if (!grp)\n+                {\n+                    grp = new Group();\n+                    grp->ConvertToLFG();\n+                    grp->Create(player);\n+                    ObjectGuid gguid = grp->GetGUID();\n+                    SetState(gguid, LFG_STATE_PROPOSAL);\n+                    sGroupMgr->AddGroup(grp);\n+                }\n+                else if (group != grp)\n+                {\n+                    // pussywizard:\n+                    if (!grp->IsFull())\n+                        grp->AddMember(player);\n+                    //else // some cleanup? LeaveLFG?\n+                    //  ;\n+                }\n+\n+                grp->SetLfgRoles(pguid, proposal.players.find(pguid)->second.role);\n+\n+                for (GuidList::const_iterator itr2 = players.begin(); itr2 != players.end(); ++itr2)\n+                {\n+                    ObjectGuid bguid = (*itr2);\n+                    if (bguid.IsPlayer())\n+                        continue;\n+                    Creature* bot = player->GetBotMgr()->GetBot(bguid);\n+                    if (!bot)\n+                        continue;\n+\n+                    player->GetBotMgr()->AddBotToGroup(bot);\n+                    grp->SetLfgRoles(bguid, proposal.players.find(bguid)->second.role);\n+                }\n+\n+                continue;\n+            }\n+            //end npcbot\n+\n             Group* group = player->GetGroup();\n             if (isPremadeGroup && !grp)\n             {\n@@ -1920,6 +2077,29 @@ namespace lfg\n         if (itProposalPlayer == proposal.players.end())\n             return;\n \n+        //npcbot - player accepted proposal\n+        //make its bots accept too\n+        if (accept && guid.IsPlayer())\n+        {\n+            if (Player* player = ObjectAccessor::FindConnectedPlayer(guid))\n+            {\n+                if (player->HaveBot())\n+                {\n+                    for (LfgProposalPlayerContainer::iterator itPlayers = proposal.players.begin(); itPlayers != proposal.players.end(); ++itPlayers)\n+                    {\n+                        ObjectGuid bguid = itPlayers->first;\n+                        if (bguid.IsPlayer())\n+                            continue;\n+                        if (!player->GetBotMgr()->GetBot(bguid))\n+                            continue;\n+\n+                        itPlayers->second.accept = LfgAnswer(accept);\n+                    }\n+                }\n+            }\n+        }\n+        //end npcbot\n+\n         LfgProposalPlayer& player = itProposalPlayer->second;\n         player.accept = LfgAnswer(accept);\n \ndiff --git a/src/server/game/DungeonFinding/LFGScripts.cpp b/src/server/game/DungeonFinding/LFGScripts.cpp\nindex c4c7969cee..7b13c3b3f9 100644\n--- a/src/server/game/DungeonFinding/LFGScripts.cpp\n+++ b/src/server/game/DungeonFinding/LFGScripts.cpp\n@@ -126,6 +126,12 @@ namespace lfg\n                 if (Player* member = itr->GetSource())\n                     player->GetSession()->SendNameQueryOpcode(member->GetGUID());\n \n+            //npcbot\n+            for (GroupBotReference* itr = group->GetFirstBotMember(); itr != nullptr; itr = itr->next())\n+                if (Creature* member = itr->GetSource())\n+                    player->GetSession()->SendNameQueryOpcode(member->GetGUID());\n+            //end npcbot\n+\n             if (group->IsLfgWithBuff())\n                 player->CastSpell(player, LFG_SPELL_LUCK_OF_THE_DRAW, true);\n         }\n@@ -136,6 +142,9 @@ namespace lfg\n             // Xinef: Destroy group if only one player is left\n             if (Group* group = player->GetGroup())\n                 if (group->GetMembersCount() <= 1u)\n+                //npcbot\n+                if (!player->GetSession()->PlayerLoading())\n+                //end npcbot\n                     group->Disband();\n         }\n     }\ndiff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp\nindex 5d7804d01d..817dfd3db9 100644\n--- a/src/server/game/Entities/Creature/Creature.cpp\n+++ b/src/server/game/Entities/Creature/Creature.cpp\n@@ -51,6 +51,13 @@\n #include \"WorldPacket.h\"\n #include \"WorldSessionMgr.h\"\n \n+//npcbot\n+#include \"bot_ai.h\"\n+#include \"botdatamgr.h\"\n+#include \"botmgr.h\"\n+#include \"bpet_ai.h\"\n+//end npcbot\n+\n /// @todo: this import is not necessary for compilation and marked as unused by the IDE\n //  however, for some reasons removing it would cause a damn linking issue\n //  there is probably some underlying problem with imports which should properly addressed\n@@ -288,6 +295,11 @@ Creature::Creature(): Unit(), MovableMapObject(), m_groupLootTimer(0), lootingGr\n     _focusSpell = nullptr;\n \n     m_respawnedTime = time_t(0);\n+\n+    //npcbot\n+    bot_AI = nullptr;\n+    bot_pet_AI = nullptr;\n+    //end npcbot\n }\n \n Creature::~Creature()\n@@ -417,6 +429,11 @@ bool Creature::IsFormationLeaderMoveAllowed() const\n \n void Creature::RemoveCorpse(bool setSpawnTime, bool skipVisibility)\n {\n+    //npcbot\n+    if (IsNPCBotOrPet())\n+        return;\n+    //end npcbot\n+\n     if (getDeathState() != DeathState::Corpse)\n         return;\n \n@@ -684,6 +701,29 @@ bool Creature::UpdateEntry(uint32 Entry, const CreatureData* data, bool changele\n \n void Creature::Update(uint32 diff)\n {\n+    //npcbot: update helper\n+    if (bot_AI)\n+    {\n+        if (!bot_AI->canUpdate)\n+        {\n+            return;\n+        }\n+\n+        bot_AI->CommonTimers(diff);\n+    }\n+    else if (bot_pet_AI)\n+    {\n+        if (!bot_pet_AI->canUpdate)\n+        {\n+            //needed for delayed unsummon\n+            m_Events.Update(diff);\n+            return;\n+        }\n+\n+        bot_pet_AI->CommonTimers(diff);\n+    }\n+    //end npcbot\n+\n     if (IsAIEnabled && TriggerJustRespawned)\n     {\n         TriggerJustRespawned = false;\n@@ -704,6 +744,10 @@ void Creature::Update(uint32 diff)\n             break;\n         case DeathState::Dead:\n         {\n+            //npcbot\n+            if (bot_AI || bot_pet_AI)\n+                break;\n+            //end npcbot\n             time_t now = GameTime::GetGameTime().count();\n             if (m_respawnTime <= now)\n             {\n@@ -733,8 +777,21 @@ void Creature::Update(uint32 diff)\n                     m_groupLootTimer -= diff;\n                 }\n             }\n+            //npcbot: update dead bots\n+            else if (bot_AI)\n+            {\n+                bot_AI->UpdateDeadAI(diff);\n+                break;\n+            }\n+            else if (bot_pet_AI)\n+                break;\n+            //end npcbot\n             else if (m_corpseRemoveTime <= GameTime::GetGameTime().count())\n             {\n+                //npcbot: do not remove corpse\n+                if (IsNPCBotOrPet())\n+                    break;\n+                //end npcbot\n                 RemoveCorpse(false);\n                 LOG_DEBUG(\"entities.unit\", \"Removing corpse... {} \", GetUInt32Value(OBJECT_FIELD_ENTRY));\n             }\n@@ -746,6 +803,9 @@ void Creature::Update(uint32 diff)\n \n             // creature can be dead after Unit::Update call\n             // CORPSE/DEAD state will processed at next tick (in other case death timer will be updated unexpectedly)\n+            //npcbot - skip dead state for bots (handled by AI)\n+            if (!bot_AI && !bot_pet_AI)\n+            //end npcbot\n             if (!IsAlive())\n                 break;\n \n@@ -859,6 +919,11 @@ void Creature::Update(uint32 diff)\n                 m_AI_locked = false;\n             }\n \n+            //npcbot: skip regeneration\n+            if (bot_AI || bot_pet_AI)\n+                break;\n+            //end npcbot\n+\n             // creature can be dead after UpdateAI call\n             // CORPSE/DEAD state will processed at next tick (in other case death timer will be updated unexpectedly)\n             if (!IsAlive())\n@@ -905,6 +970,9 @@ void Creature::Update(uint32 diff)\n     {\n         // pussywizard:\n         if (GetOwnerGUID().IsPlayer())\n+        //npcbot: do not add bots to transport (handled inside AI)\n+        if (!IsNPCBotOrPet())\n+        //end npcbot\n         {\n             if (m_transportCheckTimer <= diff)\n             {\n@@ -1087,6 +1155,11 @@ bool Creature::AIM_Initialize(CreatureAI* ai)\n \n     Motion_Initialize();\n \n+    //npcbot: prevent overriding bot_AI\n+    if (bot_AI || bot_pet_AI)\n+        return false;\n+    //end npcbot\n+\n     i_AI = ai ? ai : FactorySelector::SelectAI(this);\n     delete oldAI;\n     IsAIEnabled = true;\n@@ -1296,7 +1369,16 @@ void Creature::SetLootRecipient(Unit* unit, bool withGroup)\n         return;\n     }\n \n+    /*\n     Player* player = unit->GetCharmerOrOwnerPlayerOrPlayerItself();\n+    */\n+    //npcbot - loot recipient of bot's vehicle is owner\n+    Player* player = nullptr;\n+    if (unit->IsVehicle() && unit->GetCharmerGUID().IsCreature() && unit->GetCreator() && unit->GetCreator()->IsPlayer())\n+        player = unit->GetCreator()->ToPlayer();\n+    else\n+        player = unit->GetCharmerOrOwnerPlayerOrPlayerItself();\n+    //end npcbot\n     if (!player)                                             // normal creature, no player involved\n         return;\n \n@@ -1338,6 +1420,11 @@ void Creature::SetLootRecipient(Unit* unit, bool withGroup)\n     else\n         m_lootRecipientGroup = 0;\n \n+    //npcbot: prevent visual tap on owned bots\n+    if (IsNPCBotOrPet() && !IsFreeBot())\n+        return;\n+    //end npcbot\n+\n     SetDynamicFlag(UNIT_DYNFLAG_TAPPED);\n }\n \n@@ -1356,6 +1443,11 @@ bool Creature::isTappedBy(Player const* player) const\n \n void Creature::SaveToDB()\n {\n+    //npcbot: disallow saving generated bots\n+    if (IsNPCBot() && GetBotAI() && GetBotAI()->IsWanderer())\n+        return;\n+    //end npcbot\n+\n     // this should only be used when the creature has already been loaded\n     // preferably after adding to map, because mapid may not be valid otherwise\n     CreatureData const* data = sObjectMgr->GetCreatureData(m_spawnId);\n@@ -1371,6 +1463,11 @@ void Creature::SaveToDB()\n \n void Creature::SaveToDB(uint32 mapid, uint8 spawnMask, uint32 phaseMask)\n {\n+    //npcbot: disallow saving generated bots\n+    if (IsNPCBot() && GetBotAI() && GetBotAI()->IsWanderer())\n+        return;\n+    //end npcbot\n+\n     // update in loaded data\n     if (!m_spawnId)\n         m_spawnId = sObjectMgr->GenerateCreatureSpawnId();\n@@ -1692,6 +1789,11 @@ bool Creature::LoadCreatureFromDB(ObjectGuid::LowType spawnId, Map* map, bool ad\n         return false;\n     }\n \n+    //npcbot\n+    if (BotDataMgr::SelectNpcBotData(data->id1))\n+        return false;\n+    //end npcbot\n+\n     // xinef: this has to be assigned before Create function, properly loads equipment id from DB\n     m_creatureData = data;\n     m_spawnId = spawnId;\n@@ -1710,6 +1812,11 @@ bool Creature::LoadCreatureFromDB(ObjectGuid::LowType spawnId, Map* map, bool ad\n     m_respawnDelay = data->spawntimesecs;\n     m_deathState = DeathState::Alive;\n \n+    //npcbot: remove respawn time if any\n+    if (IsNPCBotOrPet())\n+        map->RemoveCreatureRespawnTime(spawnId);\n+    //end npcbot\n+\n     m_respawnTime  = GetMap()->GetCreatureRespawnTime(m_spawnId);\n     if (m_respawnTime)                          // respawn on Update\n     {\n@@ -1748,6 +1855,23 @@ bool Creature::LoadCreatureFromDB(ObjectGuid::LowType spawnId, Map* map, bool ad\n     // checked at creature_template loading\n     m_defaultMovementType = MovementGeneratorType(data->movementType);\n \n+    //npcbot\n+    if (IsNPCBot())\n+    {\n+        //prevent loading npcbot twice (grid unload/load case)\n+        if (sWorldSessionMgr->GetMaxPlayerCount() > 0)\n+            return false;\n+\n+        LOG_INFO(\"entities.unit\", \"Creature: loading npcbot {} (id: {})\", GetName(), GetEntry());\n+        ASSERT(!IsInWorld());\n+\n+        //don't allow removing dead bot's corpse\n+        m_corpseDelay = 0;\n+        m_respawnDelay = 0;\n+        setActive(true);\n+    }\n+    //end npcbot\n+\n     if (addToMap && !GetMap()->AddToMap(this))\n         return false;\n     return true;\n@@ -1761,6 +1885,11 @@ void Creature::SetCanDualWield(bool value)\n \n void Creature::LoadEquipment(int8 id, bool force /*= false*/)\n {\n+    //npcbot: prevent loading equipment for bots\n+    if (IsNPCBot())\n+        return;\n+    //end npcbot\n+\n     if (id == 0)\n     {\n         if (force)\n@@ -1843,6 +1972,11 @@ bool Creature::IsInvisibleDueToDespawn() const\n     if (IsAlive() || isDying() || m_corpseRemoveTime > GameTime::GetGameTime().count())\n         return false;\n \n+    //npcbot\n+    if (bot_AI || bot_pet_AI)\n+        return false;\n+    //end npcbot\n+\n     return true;\n }\n \n@@ -1875,9 +2009,19 @@ bool Creature::CanStartAttack(Unit const* who, bool force) const\n         return false;\n \n     // This set of checks is should be done only for creatures\n+    //npcbot\n+    /*\n+    //end npcbot\n     if ((IsImmuneToNPC() && !who->IsPlayer()) ||\n         (IsImmuneToPC() && who->IsPlayer()))\n+        //npcbot: allow attacking PvP free bots\n+        return false;\n+    //npcbot\n+    */\n+    if ((IsImmuneToNPC() && !(who->IsPlayer() || who->IsNPCBotOrPet())) ||\n+        (IsImmuneToPC() && (who->IsPlayer() || who->IsNPCBotOrPet())))\n         return false;\n+    //end npcbot\n \n     if (Unit* owner = who->GetOwner())\n         if (owner->IsPlayer() && IsImmuneToPC())\n@@ -1988,6 +2132,11 @@ void Creature::setDeathState(DeathState state, bool despawn)\n  */\n void Creature::Respawn(bool force)\n {\n+    //npcbot\n+    if (IsNPCBotOrPet())\n+        return;\n+    //end npcbot\n+\n     if (force)\n     {\n         if (IsAlive())\n@@ -2107,6 +2256,11 @@ void Creature::Respawn(bool force)\n \n void Creature::ForcedDespawn(Milliseconds timeMSToDespawn, Seconds forceRespawnTimer)\n {\n+    //npcbot\n+    if (IsNPCBotOrPet())\n+        return;\n+    //end npcbot\n+\n     if (timeMSToDespawn > 0ms)\n     {\n         ForcedDespawnDelayEvent* pEvent = new ForcedDespawnDelayEvent(*this, forceRespawnTimer);\n@@ -2213,6 +2367,9 @@ void Creature::LoadTemplateImmunities(int32 creatureImmunitiesId)\n }\n \n bool Creature::IsImmunedToSpell(SpellInfo const* spellInfo, Spell const* spell)\n+//npcbot\n+const\n+//end npcbot\n {\n     if (!spellInfo)\n         return false;\n@@ -2490,6 +2647,11 @@ bool Creature::CanAssistTo(Unit const* u, Unit const* enemy, bool checkfaction /\n     if (GetCharmerOrOwnerGUID())\n         return false;\n \n+    //npcbot\n+    if (IsNPCBotOrPet())\n+        return false;\n+    //end npcbot\n+\n     /// @todo: Implement aggro range, detection range and assistance range templates\n     if (m_creatureInfo->HasFlagsExtra(CREATURE_FLAG_EXTRA_IGNORE_ALL_ASSISTANCE_CALLS))\n     {\n@@ -2591,6 +2753,11 @@ void Creature::SaveRespawnTime()\n     if (IsSummon() || !m_spawnId || (m_creatureData && !m_creatureData->dbData))\n         return;\n \n+    //npcbot: DO NOT save npcbots respawn time\n+    if (IsNPCBot())\n+        return;\n+    //end npcbot\n+\n     GetMap()->SaveCreatureRespawnTime(m_spawnId, m_respawnTime);\n }\n \n@@ -2785,6 +2952,21 @@ void Creature::SendZoneUnderAttackMessage(Player* attacker)\n     sWorldSessionMgr->SendGlobalMessage(&data, nullptr, (attacker->GetTeamId() == TEAM_ALLIANCE ? TEAM_HORDE : TEAM_ALLIANCE));\n }\n \n+uint32 Creature::GetShieldBlockValue() const\n+{\n+    //npcbot - bot block value is fully calculated inside botAI\n+    if (bot_AI)\n+    {\n+        uint32 blockValue = bot_AI->GetShieldBlockValue();\n+        blockValue += GetTotalAuraModifier(SPELL_AURA_MOD_SHIELD_BLOCKVALUE);\n+        blockValue *= GetTotalAuraMultiplier(SPELL_AURA_MOD_SHIELD_BLOCKVALUE_PCT);\n+        return uint32(blockValue);\n+    }\n+    //end npcbot\n+\n+    return (GetLevel() / 2 + uint32(GetStat(STAT_STRENGTH) / 20));\n+}\n+\n /**\n  * @brief Set in combat all units in the dungeon/raid. Affect only units with IsAIEnabled.\n  */\n@@ -2964,6 +3146,13 @@ uint32 Creature::GetSpellCooldown(uint32 spell_id) const\n \n bool Creature::HasSpellCooldown(uint32 spell_id) const\n {\n+    //npcbot\n+    if (bot_AI)\n+        return !bot_AI->IsSpellReady(sSpellMgr->GetSpellInfo(spell_id)->GetFirstRankSpell()->Id, bot_AI->GetLastDiff(), false);\n+    else if (bot_pet_AI)\n+        return !bot_pet_AI->IsSpellReady(sSpellMgr->GetSpellInfo(spell_id)->GetFirstRankSpell()->Id, bot_pet_AI->GetLastDiff(), false);\n+    //end npcbot\n+\n     CreatureSpellCooldowns::const_iterator itr = m_CreatureSpellCooldowns.find(spell_id);\n     return (itr != m_CreatureSpellCooldowns.end() && itr->second.end > GameTime::GetGameTimeMS().count());\n }\n@@ -3037,6 +3226,11 @@ CreatureMovementData const& Creature::GetMovementTemplate() const\n \n void Creature::AllLootRemovedFromCorpse()\n {\n+    //npcbot\n+    if (IsNPCBotOrPet())\n+        return;\n+    //end npcbot\n+\n     if (loot.loot_type != LOOT_SKINNING && !IsPet() && GetCreatureTemplate()->SkinLootId && hasLootRecipient())\n     {\n         if (LootTemplates_Skinning.HaveLootFor(GetCreatureTemplate()->SkinLootId))\n@@ -3201,6 +3395,11 @@ void Creature::SetPosition(float x, float y, float z, float o)\n     if (!Acore::IsValidMapCoord(x, y, z, o))\n         return;\n \n+    //npcbot: send bot group update\n+    if (IsNPCBot())\n+        BotMgr::SetBotGroupUpdateFlag(ToCreature(), GROUP_UPDATE_FLAG_POSITION);\n+    //end npcbot\n+\n     GetMap()->CreatureRelocation(this, x, y, z, o);\n }\n \n@@ -3280,6 +3479,11 @@ bool Creature::CanSwim() const\n     if (Unit::CanSwim() || (!Unit::CanSwim() && !CanFly()))\n         return true;\n \n+    //npcbot\n+    if (IsNPCBotOrPet())\n+        return true;\n+    //end npcbot\n+\n     if (IsPet())\n         return true;\n \n@@ -3360,6 +3564,17 @@ void Creature::UpdateMovementFlags()\n     if (!info)\n         return;\n \n+    //npcbot: do not update movement flags for vehicles controlled by npcbots\n+    if (GetCharmerGUID().IsCreature())\n+    {\n+        if (CreatureTemplate const* bot_template = sObjectMgr->GetCreatureTemplate(GetCharmerGUID().GetEntry()))\n+        {\n+            if (bot_template->IsNPCBot())\n+                return;\n+        }\n+    }\n+    //end npcbot\n+\n     // Creatures with CREATURE_FLAG_EXTRA_NO_MOVE_FLAGS_UPDATE should control MovementFlags in your own scripts\n     if (info->HasFlagsExtra(CREATURE_FLAG_EXTRA_NO_MOVE_FLAGS_UPDATE))\n         return;\n@@ -3455,6 +3670,15 @@ void Creature::SetDisplayId(uint32 modelId, float displayScale /*= 1.f*/)\n     SetObjectScale(displayScale);\n \n     SetFloatValue(UNIT_FIELD_COMBATREACH, combatReach * GetObjectScale());\n+\n+    //npcbot: send group update for bot pet\n+    if (IsNPCBotPet())\n+    {\n+        if (Creature const* botPetOwner = GetBotPetAI() ? GetBotPetAI()->GetPetsOwner() : nullptr)\n+            if (botPetOwner->GetBotAI()->GetGroup())\n+                BotMgr::SetBotGroupUpdateFlag(botPetOwner, GROUP_UPDATE_FLAG_PET_MODEL_ID);\n+    }\n+    //end npcbot\n }\n \n void Creature::SetDisplayFromModel(uint32 modelIdx)\n@@ -3757,6 +3981,10 @@ void Creature::ModifyThreatPercentTemp(Unit* victim, int32 percent, Milliseconds\n \n bool Creature::IsDamageEnoughForLootingAndReward() const\n {\n+    //npcbot\n+    if (IsNPCBotOrPet())\n+        return (m_creatureInfo->flags_extra & CREATURE_FLAG_EXTRA_NO_PLAYER_DAMAGE_REQ) || _playerDamageReq == 0;\n+    //end npcbot\n     return m_creatureInfo->HasFlagsExtra(CREATURE_FLAG_EXTRA_NO_PLAYER_DAMAGE_REQ) || (_playerDamageReq == 0 && _damagedByPlayer);\n }\n \n@@ -3852,3 +4080,408 @@ bool Creature::IsUpdateNeeded()\n \n     return false;\n }\n+\n+//NPCBOT\n+bool Creature::LoadBotCreatureFromDB(ObjectGuid::LowType spawnId, Map* map, bool addToMap, bool generated, uint32 entry, Position const* pos)\n+{\n+    CreatureData const* data = generated ? nullptr : sObjectMgr->GetCreatureData(spawnId);\n+    if (!data)\n+    {\n+        if (!generated)\n+        {\n+            LOG_ERROR(\"sql.sql\", \"Bot creature (GUID: {}) not found in table `creature`, can't load.\", spawnId);\n+            return false;\n+        }\n+        else\n+        {\n+            ASSERT(entry != 0);\n+            ASSERT_NOTNULL(pos);\n+        }\n+    }\n+\n+    m_spawnId = spawnId;\n+    ASSERT(map->GetInstanceId() == 0);\n+\n+    m_creatureData = data;\n+    m_wanderDistance = data ? data->wander_distance : 0.f;\n+\n+    if (!Create(map->GenerateLowGuid<HighGuid::Unit>(), map,\n+        data ? data->phaseMask : PHASEMASK_NORMAL,\n+        data ? data->id1 : entry, 0,\n+        data ? data->posX : pos->m_positionX, data ? data->posY : pos->m_positionY,\n+        data ? data->posZ : pos->m_positionZ, data ? data->orientation : pos->GetOrientation(),\n+        data))\n+        return false;\n+\n+    //We should set first home position, because then AI calls home movement\n+    SetHomePosition(*this);\n+\n+    m_deathState = DeathState::Alive;\n+    m_respawnTime = 0;\n+\n+    uint32 curhealth;\n+\n+    if (data && !m_regenHealth)\n+    {\n+        curhealth = data->curhealth;\n+        if (curhealth)\n+        {\n+            curhealth = uint32(curhealth * _GetHealthMod(GetCreatureTemplate()->rank));\n+            if (curhealth < 1)\n+                curhealth = 1;\n+        }\n+        SetPower(POWER_MANA, data->curmana);\n+    }\n+    else\n+    {\n+        curhealth = GetMaxHealth();\n+        SetPower(POWER_MANA, GetMaxPower(POWER_MANA));\n+    }\n+\n+    SetHealth(m_deathState == DeathState::Alive ? curhealth : 0);\n+\n+    // checked at creature_template loading\n+    m_defaultMovementType = data ? MovementGeneratorType(data->movementType) : IDLE_MOTION_TYPE;\n+\n+    LOG_INFO(\"entities.unit\", \"Creature: loading npcbot {} (id: {}, gen: {})\", GetName().c_str(), GetEntry(), uint32(generated));\n+    ASSERT(!IsInWorld());\n+\n+    m_corpseDelay = 0;\n+    m_respawnDelay = 0;\n+    setActive(true);\n+\n+    if (addToMap && !GetMap()->AddToMap(this))\n+        return false;\n+\n+    return true;\n+}\n+\n+uint8 Creature::GetBotClass() const\n+{\n+    return bot_AI ? bot_AI->GetBotClass() : GetClass();\n+}\n+\n+Player* Creature::GetBotOwner() const\n+{\n+    return bot_AI ? bot_AI->GetBotOwner() : bot_pet_AI ? bot_pet_AI->GetPetsOwner()->GetBotOwner() : nullptr;\n+}\n+Unit* Creature::GetBotsPet() const\n+{\n+    return bot_AI ? bot_AI->GetBotsPet() : nullptr;\n+}\n+\n+bool Creature::IsNPCBot() const\n+{\n+    return GetCreatureTemplate()->IsNPCBot();\n+}\n+\n+bool Creature::IsNPCBotPet() const\n+{\n+    return GetCreatureTemplate()->IsNPCBotPet();\n+}\n+\n+bool Creature::IsNPCBotOrPet() const\n+{\n+    return GetCreatureTemplate()->IsNPCBotOrPet();\n+}\n+\n+bool Creature::IsFreeBot() const\n+{\n+    return bot_AI ? bot_AI->IAmFree() : bot_pet_AI ? bot_pet_AI->IAmFree() : false;\n+}\n+\n+bool Creature::IsWandererBot() const\n+{\n+    return bot_AI ? bot_AI->IsWanderer() : bot_pet_AI ? bot_pet_AI->IsWanderer() : false;\n+}\n+\n+Group* Creature::GetBotGroup() const\n+{\n+    return bot_AI ? bot_AI->GetGroup() : nullptr;\n+}\n+void Creature::SetBotGroup(Group* group, int8 subgroup)\n+{\n+    if (bot_AI)\n+        bot_AI->SetGroup(group, subgroup);\n+}\n+uint8 Creature::GetSubGroup() const\n+{\n+    return bot_AI ? bot_AI->GetSubGroup() : 0;\n+}\n+void Creature::SetSubGroup(uint8 subgroup)\n+{\n+    if (bot_AI)\n+        bot_AI->SetSubGroup(subgroup);\n+}\n+\n+void Creature::SetBattlegroundOrBattlefieldRaid(Group* group, int8 subgroup)\n+{\n+    if (bot_AI)\n+        bot_AI->SetBattlegroundOrBattlefieldRaid(group, subgroup);\n+}\n+void Creature::RemoveFromBattlegroundOrBattlefieldRaid()\n+{\n+    if (bot_AI)\n+        bot_AI->RemoveFromBattlegroundOrBattlefieldRaid();\n+}\n+Group* Creature::GetOriginalGroup() const\n+{\n+    return bot_AI ? bot_AI->GetOriginalGroup() : nullptr;\n+}\n+void Creature::SetOriginalGroup(Group* group, int8 subgroup)\n+{\n+    if (bot_AI)\n+        bot_AI->SetOriginalGroup(group, subgroup);\n+}\n+uint8 Creature::GetOriginalSubGroup() const\n+{\n+    return bot_AI ? bot_AI->GetOriginalSubGroup() : 0;\n+}\n+void Creature::SetOriginalSubGroup(uint8 subgroup)\n+{\n+    if (bot_AI)\n+        bot_AI->SetOriginalSubGroup(subgroup);\n+}\n+\n+Battleground* Creature::GetBotBG() const\n+{\n+    return bot_AI ? bot_AI->GetBG() : nullptr;\n+}\n+\n+uint32 Creature::GetBotRoles() const\n+{\n+    return bot_AI ? bot_AI->GetBotRoles() : 0;\n+}\n+//Bot damage mods\n+void Creature::ApplyBotDamageMultiplierMelee(uint32& damage, CalcDamageInfo& damageinfo) const\n+{\n+    if (bot_AI)\n+        bot_AI->ApplyBotDamageMultiplierMelee(damage, damageinfo);\n+}\n+void Creature::ApplyBotDamageMultiplierMelee(int32& damage, SpellNonMeleeDamage& damageinfo, SpellInfo const* spellInfo, WeaponAttackType attackType, bool crit) const\n+{\n+    if (bot_AI)\n+        bot_AI->ApplyBotDamageMultiplierMelee(damage, damageinfo, spellInfo, attackType, crit);\n+}\n+void Creature::ApplyBotDamageMultiplierSpell(int32& damage, SpellNonMeleeDamage& damageinfo, SpellInfo const* spellInfo, WeaponAttackType attackType, bool crit) const\n+{\n+    if (bot_AI)\n+        bot_AI->ApplyBotDamageMultiplierSpell(damage, damageinfo, spellInfo, attackType, crit);\n+    else if (bot_pet_AI)\n+        bot_pet_AI->ApplyBotDamageMultiplierSpell(damage, damageinfo, spellInfo, attackType, crit);\n+}\n+void Creature::ApplyBotDamageMultiplierHeal(Unit const* victim, float& heal, SpellInfo const* spellInfo, DamageEffectType damagetype, uint32 stack) const\n+{\n+    if (bot_AI)\n+        bot_AI->ApplyBotDamageMultiplierHeal(victim, heal, spellInfo, damagetype, stack);\n+}\n+void Creature::ApplyBotCritMultiplierAll(Unit const* victim, float& crit_chance, SpellInfo const* spellInfo, SpellSchoolMask schoolMask, WeaponAttackType attackType) const\n+{\n+    if (bot_AI)\n+        bot_AI->ApplyBotCritMultiplierAll(victim, crit_chance, spellInfo, schoolMask, attackType);\n+}\n+void Creature::ApplyCreatureSpellCostMods(SpellInfo const* spellInfo, int32& cost) const\n+{\n+    if (bot_AI)\n+        bot_AI->ApplyBotSpellCostMods(spellInfo, cost);\n+}\n+void Creature::ApplyCreatureSpellCastTimeMods(SpellInfo const* spellInfo, int32& casttime) const\n+{\n+    if (bot_AI)\n+        bot_AI->ApplyBotSpellCastTimeMods(spellInfo, casttime);\n+}\n+void Creature::ApplyCreatureSpellNotLoseCastTimeMods(SpellInfo const* spellInfo, int32& delayReduce) const\n+{\n+    if (bot_AI)\n+        bot_AI->ApplyBotSpellNotLoseCastTimeMods(spellInfo, delayReduce);\n+}\n+void Creature::ApplyCreatureSpellRadiusMods(SpellInfo const* spellInfo, float& radius) const\n+{\n+    if (bot_AI)\n+        bot_AI->ApplyBotSpellRadiusMods(spellInfo, radius);\n+    else if (bot_pet_AI)\n+        bot_pet_AI->ApplyBotPetSpellRadiusMods(spellInfo, radius);\n+}\n+void Creature::ApplyCreatureSpellRangeMods(SpellInfo const* spellInfo, float& maxrange) const\n+{\n+    if (bot_AI)\n+        bot_AI->ApplyBotSpellRangeMods(spellInfo, maxrange);\n+}\n+void Creature::ApplyCreatureSpellMaxTargetsMods(SpellInfo const* spellInfo, uint32& targets) const\n+{\n+    if (bot_AI)\n+        bot_AI->ApplyBotSpellMaxTargetsMods(spellInfo, targets);\n+}\n+void Creature::ApplyCreatureSpellChanceOfSuccessMods(SpellInfo const* spellInfo, float& chance) const\n+{\n+    if (bot_AI)\n+        bot_AI->ApplyBotSpellChanceOfSuccessMods(spellInfo, chance);\n+}\n+\n+void Creature::ApplyCreatureEffectMods(SpellInfo const* spellInfo, uint8 effIndex, float& value) const\n+{\n+    if (bot_AI)\n+        bot_AI->ApplyBotEffectMods(spellInfo, effIndex, value);\n+}\n+\n+void Creature::OnBotSummon(Creature* summon)\n+{\n+    if (bot_AI)\n+        bot_AI->OnBotSummon(summon);\n+}\n+void Creature::OnBotDespawn(Creature* summon)\n+{\n+    if (bot_AI)\n+        bot_AI->OnBotDespawn(summon);\n+}\n+\n+void Creature::BotStopMovement()\n+{\n+    if (IsInWorld())\n+    {\n+        GetMotionMaster()->Clear();\n+        GetMotionMaster()->MoveIdle();\n+    }\n+    StopMoving();\n+    DisableSpline();\n+}\n+\n+bool Creature::CanParry() const\n+{\n+    return bot_AI ? bot_AI->CanParry() : true;\n+}\n+\n+bool Creature::CanDodge() const\n+{\n+    return bot_AI ? bot_AI->CanDodge() : true;\n+}\n+//unused\n+bool Creature::CanBlock() const\n+{\n+    return bot_AI ? bot_AI->CanBlock() : true;\n+}\n+//unused\n+bool Creature::CanCrit() const\n+{\n+    return bot_AI ? bot_AI->CanCrit() : true;\n+}\n+bool Creature::CanMiss() const\n+{\n+    return bot_AI ? bot_AI->CanMiss() : true;\n+}\n+\n+float Creature::GetCreatureParryChance() const\n+{\n+    return bot_AI ? bot_AI->GetBotParryChance() : 5.0f;\n+}\n+float Creature::GetCreatureDodgeChance() const\n+{\n+    return bot_AI ? bot_AI->GetBotDodgeChance() : 5.0f;\n+}\n+float Creature::GetCreatureBlockChance() const\n+{\n+    return bot_AI ? bot_AI->GetBotBlockChance() : 5.0f;\n+}\n+float Creature::GetCreatureCritChance() const\n+{\n+    return bot_AI ? bot_AI->GetBotCritChance() : 0.0f;\n+}\n+float Creature::GetCreatureMissChance() const\n+{\n+    return bot_AI ? bot_AI->GetBotMissChance() : 5.0f;\n+}\n+float Creature::GetCreatureArmorPenetrationCoef() const\n+{\n+    return bot_AI ? bot_AI->GetBotArmorPenetrationCoef() : 0.0f;\n+}\n+uint32 Creature::GetCreatureExpertise() const\n+{\n+    return bot_AI ? bot_AI->GetBotExpertise() : 0;\n+}\n+uint32 Creature::GetCreatureSpellPenetration() const\n+{\n+    return bot_AI ? bot_AI->GetBotSpellPenetration() : 0;\n+}\n+uint32 Creature::GetCreatureSpellPower() const\n+{\n+    return bot_AI ? bot_AI->GetBotSpellPower() : 0;\n+}\n+uint32 Creature::GetCreatureDefense() const\n+{\n+    return bot_AI ? bot_AI->GetBotDefense() : GetMaxSkillValueForLevel();\n+}\n+int32 Creature::GetCreatureResistanceBonus(SpellSchoolMask mask) const\n+{\n+    return bot_AI ? bot_AI->GetBotResistanceBonus(mask) : 0;\n+}\n+\n+uint8 Creature::GetCreatureComboPoints() const\n+{\n+    return bot_AI ? bot_AI->GetBotComboPoints() : 0;\n+}\n+\n+float Creature::GetCreatureAmmoDPS() const\n+{\n+    return bot_AI ? bot_AI->GetBotAmmoDPS() : 0.0f;\n+}\n+\n+bool Creature::IsTempBot() const\n+{\n+    return bot_AI && bot_AI->IsTempBot();\n+}\n+\n+MeleeHitOutcome Creature::BotRollMeleeOutcomeAgainst(Unit const* victim, WeaponAttackType attType) const\n+{\n+    return bot_AI ? bot_AI->BotRollCustomMeleeOutcomeAgainst(victim, attType) : RollMeleeOutcomeAgainst(victim, attType);\n+}\n+\n+void Creature::CastCreatureItemCombatSpell(DamageInfo const& damageInfo)\n+{\n+    if (bot_AI)\n+        bot_AI->CastBotItemCombatSpell(damageInfo);\n+}\n+\n+//bool Creature::HasSpellCooldown(uint32 spell_id) const\n+//{\n+//    if (bot_AI)\n+//        return !bot_AI->IsSpellReady(sSpellMgr->GetSpellInfo(spell_id)->GetFirstRankSpell()->Id, bot_AI->GetLastDiff(), false);\n+//    else if (bot_pet_AI)\n+//        return !bot_pet_AI->IsSpellReady(sSpellMgr->GetSpellInfo(spell_id)->GetFirstRankSpell()->Id, bot_pet_AI->GetLastDiff(), false);\n+//\n+//    return false;\n+//}\n+void Creature::AddBotSpellCooldown(uint32 spellId, uint32 cooldown)\n+{\n+    if (bot_AI)\n+        bot_AI->SetSpellCooldown(sSpellMgr->GetSpellInfo(spellId)->GetFirstRankSpell()->Id, cooldown);\n+    else if (bot_pet_AI)\n+        bot_pet_AI->SetSpellCooldown(sSpellMgr->GetSpellInfo(spellId)->GetFirstRankSpell()->Id, cooldown);\n+}\n+void Creature::ReleaseBotSpellCooldown(uint32 spellId)\n+{\n+    if (bot_AI)\n+        bot_AI->ReleaseSpellCooldown(sSpellMgr->GetSpellInfo(spellId)->GetFirstRankSpell()->Id);\n+    else if (bot_pet_AI)\n+        bot_pet_AI->ReleaseSpellCooldown(sSpellMgr->GetSpellInfo(spellId)->GetFirstRankSpell()->Id);\n+}\n+\n+void Creature::SpendBotRunes(SpellInfo const* spellInfo, bool didHit)\n+{\n+    if (bot_AI)\n+        bot_AI->SpendRunes(spellInfo, didHit);\n+}\n+\n+//equips\n+Item* Creature::GetBotEquips(uint8 slot) const\n+{\n+    return bot_AI ? bot_AI->GetEquips(slot) : nullptr;\n+}\n+Item* Creature::GetBotEquipsByGuid(ObjectGuid itemGuid) const\n+{\n+    return bot_AI ? bot_AI->GetEquipsByGuid(itemGuid) : nullptr;\n+}\n+float Creature::GetBotAverageItemLevel() const\n+{\n+    return bot_AI ? bot_AI->GetAverageItemLevel() : 0.0f;\n+}\n+//END NPCBOT\ndiff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h\nindex f95946ab9b..2c119f0047 100644\n--- a/src/server/game/Entities/Creature/Creature.h\n+++ b/src/server/game/Entities/Creature/Creature.h\n@@ -28,6 +28,12 @@\n \n class SpellInfo;\n \n+// npcbot\n+class bot_ai;\n+class bot_pet_ai;\n+class Battleground;\n+//end npcbot\n+\n class CreatureAI;\n class Quest;\n class Player;\n@@ -105,7 +111,12 @@ public:\n     bool isCanInteractWithBattleMaster(Player* player, bool msg) const;\n     bool CanResetTalents(Player* player) const;\n     bool CanCreatureAttack(Unit const* victim, bool skipDistCheck = false) const;\n+    //npcbot\n+    /*\n     bool IsImmunedToSpell(SpellInfo const* spellInfo, Spell const* spell = nullptr) override;\n+    */\n+    bool IsImmunedToSpell(SpellInfo const* spellInfo, Spell const* spell = nullptr) const override;\n+    //end npcbot\n \n     [[nodiscard]] bool HasMechanicTemplateImmunity(uint64 mask) const;\n     // redefine Unit::IsImmunedToSpell\n@@ -155,9 +166,11 @@ public:\n     } _spellFocusInfo;\n \n     [[nodiscard]] uint32 GetShieldBlockValue() const override\n+    ;/*\n     {\n         return (GetLevel() / 2 + uint32(GetStat(STAT_STRENGTH) / 20));\n     }\n+    */\n \n     [[nodiscard]] SpellSchoolMask GetMeleeDamageSchoolMask(WeaponAttackType /*attackType*/ = BASE_ATTACK, uint8 /*damageIndex*/ = 0) const override { return m_meleeDamageSchoolMask; }\n     void SetMeleeDamageSchool(SpellSchools school) { m_meleeDamageSchoolMask = SpellSchoolMask(1 << school); }\n@@ -453,6 +466,84 @@ public:\n \n     bool IsUpdateNeeded() override;\n \n+    //NPCBots\n+    bool LoadBotCreatureFromDB(ObjectGuid::LowType guid, Map* map, bool addToMap = true, bool generated = false, uint32 entry = 0, Position const* pos = nullptr);\n+    Player* GetBotOwner() const;\n+    Unit* GetBotsPet() const;\n+    bool IsNPCBot() const override;\n+    bool IsNPCBotPet() const override;\n+    bool IsNPCBotOrPet() const override;\n+    bool IsFreeBot() const;\n+    bool IsWandererBot() const;\n+        Group* GetBotGroup() const;\n+        void SetBotGroup(Group* group, int8 subgroup = -1);\n+        uint8 GetSubGroup() const;\n+        void SetSubGroup(uint8 subgroup);\n+        void SetBattlegroundOrBattlefieldRaid(Group* group, int8 subgroup = -1);\n+        void RemoveFromBattlegroundOrBattlefieldRaid();\n+        Group* GetOriginalGroup() const;\n+        void SetOriginalGroup(Group* group, int8 subgroup = -1);\n+        uint8 GetOriginalSubGroup() const;\n+        void SetOriginalSubGroup(uint8 subgroup);\n+    Battleground* GetBotBG() const;\n+    uint8 GetBotClass() const;\n+    uint32 GetBotRoles() const;\n+    bot_ai* GetBotAI() const { return bot_AI; }\n+    bot_pet_ai* GetBotPetAI() const { return bot_pet_AI; }\n+    void SetBotAI(bot_ai* ai) { bot_AI = ai; }\n+    void SetBotPetAI(bot_pet_ai* ai) { bot_pet_AI = ai; }\n+    void ApplyBotDamageMultiplierMelee(uint32& damage, CalcDamageInfo& damageinfo) const;\n+    void ApplyBotDamageMultiplierMelee(int32& damage, SpellNonMeleeDamage& damageinfo, SpellInfo const* spellInfo, WeaponAttackType attackType, bool crit) const;\n+    void ApplyBotDamageMultiplierSpell(int32& damage, SpellNonMeleeDamage& damageinfo, SpellInfo const* spellInfo, WeaponAttackType attackType, bool crit) const;\n+    void ApplyBotDamageMultiplierHeal(Unit const* victim, float& heal, SpellInfo const* spellInfo, DamageEffectType damagetype, uint32 stack) const;\n+    void ApplyBotCritMultiplierAll(Unit const* victim, float& crit_chance, SpellInfo const* spellInfo, SpellSchoolMask schoolMask, WeaponAttackType attackType) const;\n+    void ApplyCreatureSpellCostMods(SpellInfo const* spellInfo, int32& cost) const;\n+    void ApplyCreatureSpellCastTimeMods(SpellInfo const* spellInfo, int32& casttime) const;\n+    void ApplyCreatureSpellNotLoseCastTimeMods(SpellInfo const* spellInfo, int32& delayReduce) const;\n+    void ApplyCreatureSpellRadiusMods(SpellInfo const* spellInfo, float& radius) const;\n+    void ApplyCreatureSpellRangeMods(SpellInfo const* spellInfo, float& maxrange) const;\n+    void ApplyCreatureSpellMaxTargetsMods(SpellInfo const* spellInfo, uint32& targets) const;\n+    void ApplyCreatureSpellChanceOfSuccessMods(SpellInfo const* spellInfo, float& chance) const;\n+    void ApplyCreatureEffectMods(SpellInfo const* spellInfo, uint8 effIndex, float& value) const;\n+    void OnBotSummon(Creature* summon);\n+    void OnBotDespawn(Creature* summon);\n+    void BotStopMovement();\n+\n+    bool CanParry() const;\n+    bool CanDodge() const;\n+    bool CanBlock() const;\n+    bool CanCrit() const;\n+    bool CanMiss() const;\n+\n+    float GetCreatureParryChance() const;\n+    float GetCreatureDodgeChance() const;\n+    float GetCreatureBlockChance() const;\n+    float GetCreatureCritChance() const;\n+    float GetCreatureMissChance() const;\n+    float GetCreatureArmorPenetrationCoef() const;\n+    uint32 GetCreatureExpertise() const;\n+    uint32 GetCreatureSpellPenetration() const;\n+    uint32 GetCreatureSpellPower() const;\n+    uint32 GetCreatureDefense() const;\n+    int32 GetCreatureResistanceBonus(SpellSchoolMask mask) const;\n+    uint8 GetCreatureComboPoints() const;\n+    float GetCreatureAmmoDPS() const;\n+\n+    bool IsTempBot() const;\n+\n+    MeleeHitOutcome BotRollMeleeOutcomeAgainst(Unit const* victim, WeaponAttackType attType) const;\n+\n+    void CastCreatureItemCombatSpell(DamageInfo const& damageInfo);\n+    //bool HasSpellCooldown(uint32 spellId) const;\n+    void AddBotSpellCooldown(uint32 spellId, uint32 cooldown);\n+    void ReleaseBotSpellCooldown(uint32 spellId);\n+    void SpendBotRunes(SpellInfo const* spellInfo, bool didHit);\n+\n+    Item* GetBotEquips(uint8 slot) const;\n+    Item* GetBotEquipsByGuid(ObjectGuid itemGuid) const;\n+    float GetBotAverageItemLevel() const;\n+    //End NPCBots\n+\n protected:\n     bool CreateFromProto(ObjectGuid::LowType guidlow, uint32 Entry, uint32 vehId, const CreatureData* data = nullptr);\n     bool InitEntry(uint32 entry, const CreatureData* data = nullptr);\n@@ -520,6 +611,11 @@ protected:\n     bool IsAlwaysDetectableFor(WorldObject const* seer) const override;\n \n private:\n+    //bot system\n+    bot_ai* bot_AI;\n+    bot_pet_ai* bot_pet_AI;\n+    //end bot system\n+\n     void ForcedDespawn(Milliseconds timeMSToDespawn = 0ms, Seconds forcedRespawnTimer = 0s);\n \n     [[nodiscard]] bool CanPeriodicallyCallForAssistance() const;\ndiff --git a/src/server/game/Entities/Creature/CreatureData.h b/src/server/game/Entities/Creature/CreatureData.h\nindex ec71df83a0..3eda840c00 100644\n--- a/src/server/game/Entities/Creature/CreatureData.h\n+++ b/src/server/game/Entities/Creature/CreatureData.h\n@@ -77,6 +77,11 @@ enum CreatureFlagsExtra : uint32\n     CREATURE_FLAG_EXTRA_HARD_RESET                      = 0x80000000,\n \n     // Masks\n+    //npcbot\n+    CREATURE_FLAG_EXTRA_NPCBOT                          = (CREATURE_FLAG_EXTRA_HARD_RESET | CREATURE_FLAG_EXTRA_DONT_CALL_ASSISTANCE | CREATURE_FLAG_EXTRA_DONT_OVERRIDE_ENTRY_SAI | CREATURE_FLAG_EXTRA_IGNORE_ALL_ASSISTANCE_CALLS),\n+    CREATURE_FLAG_EXTRA_NPCBOT_PET                      = (CREATURE_FLAG_EXTRA_HARD_RESET | CREATURE_FLAG_EXTRA_DONT_CALL_ASSISTANCE | CREATURE_FLAG_EXTRA_DONT_OVERRIDE_ENTRY_SAI),\n+    //end npcbot\n+\n     CREATURE_FLAG_EXTRA_DB_ALLOWED                      = (0xFFFFFFFF & ~CREATURE_FLAG_EXTRA_DUNGEON_BOSS) // SKIP\n };\n \n@@ -249,6 +254,21 @@ struct CreatureTemplate\n     CreatureModel const* GetFirstVisibleModel() const;\n \n     // helpers\n+    //npcbot\n+    bool IsNPCBot() const\n+    {\n+        return (flags_extra & CREATURE_FLAG_EXTRA_NPCBOT) == CREATURE_FLAG_EXTRA_NPCBOT;\n+    }\n+    bool IsNPCBotPet() const\n+    {\n+        return (flags_extra & CREATURE_FLAG_EXTRA_NPCBOT) == CREATURE_FLAG_EXTRA_NPCBOT_PET;\n+    }\n+    bool IsNPCBotOrPet() const\n+    {\n+        return IsNPCBot() || IsNPCBotPet();\n+    }\n+    //end npcbot\n+\n     [[nodiscard]] SkillType GetRequiredLootSkill() const\n     {\n         if (type_flags & CREATURE_TYPE_FLAG_SKIN_WITH_HERBALISM)\ndiff --git a/src/server/game/Entities/Creature/GossipDef.h b/src/server/game/Entities/Creature/GossipDef.h\nindex b6a06092c5..dd7b667349 100644\n--- a/src/server/game/Entities/Creature/GossipDef.h\n+++ b/src/server/game/Entities/Creature/GossipDef.h\n@@ -56,7 +56,7 @@ enum Gossip_Option\n     GOSSIP_OPTION_MAX\n };\n \n-enum GossipOptionIcon\n+enum GossipOptionIcon : uint8\n {\n     GOSSIP_ICON_CHAT                = 0,                    // white chat bubble\n     GOSSIP_ICON_VENDOR              = 1,                    // brown bag\ndiff --git a/src/server/game/Entities/Creature/TemporarySummon.cpp b/src/server/game/Entities/Creature/TemporarySummon.cpp\nindex 5eceb9e53f..28a429926d 100644\n--- a/src/server/game/Entities/Creature/TemporarySummon.cpp\n+++ b/src/server/game/Entities/Creature/TemporarySummon.cpp\n@@ -24,6 +24,11 @@\n #include \"Player.h\"\n #include \"ScriptMgr.h\"\n \n+//npcbot\n+#include \"botmgr.h\"\n+#include \"bpet_ai.h\"\n+//end npcbot\n+\n TempSummon::TempSummon(SummonPropertiesEntry const* properties, ObjectGuid owner) :\n     Creature(), m_Properties(properties), m_type(TEMPSUMMON_MANUAL_DESPAWN),\n     m_timer(0), m_lifetime(0), _visibleBySummonerOnly(false)\n@@ -229,6 +234,12 @@ void TempSummon::InitStats(uint32 duration)\n     if (!m_Properties)\n         return;\n \n+    //npcbot: skip deleting/reassigning player totems\n+    //normally no creatorGUID is assigned at this point, perform full check anyway for compatibilty reasons\n+    if (!(m_Properties->Slot && m_Properties->Slot >= SUMMON_SLOT_TOTEM_FIRE && m_Properties->Slot < MAX_TOTEM_SLOT &&\n+        GetCreatorGUID() && GetCreatorGUID().IsCreature() && owner && owner->GetTypeId() == TYPEID_PLAYER &&\n+        owner->ToPlayer()->HaveBot() && owner->ToPlayer()->GetBotMgr()->GetBot(GetCreatorGUID())))\n+    //end npcbot\n     if (owner)\n     {\n         if (uint32 slot = m_Properties->Slot)\n@@ -276,6 +287,14 @@ void TempSummon::InitSummon()\n \n         if (IsAIEnabled)\n             AI()->IsSummonedBy(owner);\n+\n+        //npcbot\n+        if (IsTempBot())\n+        {\n+            m_summonerGUID = ObjectGuid::Empty;\n+            SetCreatorGUID(m_summonerGUID);\n+        }\n+        //end npcbot\n     }\n }\n \n@@ -311,6 +330,14 @@ void TempSummon::UnSummon(Milliseconds msTime)\n         return;\n     }\n \n+    //npcbot\n+    if (IsNPCBotPet())\n+    {\n+        if (Creature* petowner = GetBotPetAI()->GetPetsOwner())\n+            petowner->AI()->SummonedCreatureDespawn(this);\n+    }\n+    else\n+    //end npcbot\n     if (WorldObject* owner = GetSummoner())\n     {\n         if (owner->IsCreature() && owner->ToCreature()->IsAIEnabled)\n@@ -368,6 +395,15 @@ void Minion::InitStats(uint32 duration)\n \n     SetReactState(REACT_PASSIVE);\n \n+    //npcbot\n+    //do not add bot totem to player's controlled list\n+    //client indicator will be OwnerGUID\n+    if (m_Properties && m_Properties->Slot && m_Properties->Slot >= SUMMON_SLOT_TOTEM_FIRE && m_Properties->Slot < MAX_TOTEM_SLOT &&\n+        GetCreatorGUID() && GetCreatorGUID().IsCreature() && GetOwner() && GetOwner()->GetTypeId() == TYPEID_PLAYER &&\n+        GetOwner()->ToPlayer()->HaveBot() && GetOwner()->ToPlayer()->GetBotMgr()->GetBot(GetCreatorGUID()))\n+        return;\n+    //end npcbot\n+\n     if (Unit* owner = GetOwner())\n     {\n         SetCreatorGUID(owner->GetGUID());\ndiff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp\nindex 7885b3bfc5..fd6bfe77c8 100644\n--- a/src/server/game/Entities/GameObject/GameObject.cpp\n+++ b/src/server/game/Entities/GameObject/GameObject.cpp\n@@ -38,6 +38,10 @@\n #include <G3D/CoordinateFrame.h>\n #include <G3D/Quat.h>\n \n+//npcbot\n+#include \"botmgr.h\"\n+//end npcbot\n+\n bool QuaternionData::IsUnit() const\n {\n     return fabs(x * x + y * y + z * z + w * w - 1.0f) < 1e-5f;\n@@ -723,6 +727,17 @@ void GameObject::Update(uint32 diff)\n                             Acore::PlayerSearcher<Acore::AnyPlayerInObjectRangeCheck> searcher(this, player, checker);\n                             Cell::VisitObjects(this, searcher, radius);\n                             target = player;\n+\n+                        //npcbot\n+                        if (!target)\n+                        {\n+                            Creature* bot = nullptr;\n+                            std::function bot_checker = [=, this](Creature const* c) { return c->IsNPCBot() && c->IsAlive() && IsWithinDistInMap(c, radius); };\n+                            Acore::CreatureSearcher searcher(this, bot, bot_checker);\n+                            Cell::VisitObjects(this, searcher, radius);\n+                            target = bot;\n+                        }\n+                        //end npcbot\n                         }\n \n                         if (target)\n@@ -810,6 +825,12 @@ void GameObject::Update(uint32 diff)\n                                 if (Player* player = target->ToPlayer())\n                                     if (Battleground* bg = player->GetBattleground())\n                                         bg->HandleTriggerBuff(this);\n+\n+                        //npcbot\n+                        if (target->IsNPCBot() && !goInfo->trap.diameter && goInfo->trap.cooldown == 3)\n+                            if (Battleground* bg = target->ToCreature()->GetBotBG())\n+                                bg->HandleTriggerBuff(this);\n+                        //end npcbot\n                         }\n                         break;\n                     }\n@@ -1803,6 +1824,36 @@ void GameObject::Use(Unit* user)\n \n         case GAMEOBJECT_TYPE_SUMMONING_RITUAL:              //18\n             {\n+                //npcbot\n+                if (user->IsNPCBot())\n+                {\n+                    GameObjectTemplate const* info = GetGOInfo();\n+                    Player* botOwner = user->ToCreature()->GetBotOwner();\n+                    spellCaster = botOwner;\n+\n+                    if (info->summoningRitual.animSpell)\n+                        user->CastSpell(user, info->summoningRitual.animSpell, true);\n+\n+                    spellId = info->summoningRitual.spellId;\n+                    if (spellId == 62330)\n+                    {\n+                        spellId = 61993;\n+                        triggeredFlags = TRIGGERED_FULL_MASK;\n+                    }\n+                    if (!info->summoningRitual.ritualPersistent)\n+                        SetLootState(GO_JUST_DEACTIVATED);\n+                    else\n+                    {\n+                        // reset ritual for this GO\n+                        m_ritualOwnerGUID.Clear();\n+                        m_unique_users.clear();\n+                        m_usetimes = 0;\n+                    }\n+\n+                    break;\n+                }\n+                //end npcbot\n+\n                 if (!user->IsPlayer())\n                     return;\n \n@@ -1918,6 +1969,20 @@ void GameObject::Use(Unit* user)\n \n         case GAMEOBJECT_TYPE_FLAGSTAND:                     // 24\n             {\n+                //npcbot\n+                if (user->IsNPCBot())\n+                {\n+                    Creature* bot = user->ToCreature();\n+                    if (Battleground* botbg = bot->GetBotBG())\n+                    {\n+                        bot->RemoveAurasByType(SPELL_AURA_MOD_STEALTH);\n+                        bot->RemoveAurasByType(SPELL_AURA_MOD_INVISIBILITY);\n+                        botbg->EventBotClickedOnFlag(bot, this);\n+                        return;\n+                    }\n+                }\n+                //end npcbot\n+\n                 if (!user->IsPlayer())\n                     return;\n \n@@ -1962,6 +2027,38 @@ void GameObject::Use(Unit* user)\n \n         case GAMEOBJECT_TYPE_FLAGDROP:                      // 26\n             {\n+                //npcbot\n+                if (user->IsNPCBot())\n+                {\n+                    Creature* bot = user->ToCreature();\n+                    if (Battleground* botbg = bot->GetBotBG())\n+                    {\n+                        bot->RemoveAurasByType(SPELL_AURA_MOD_STEALTH);\n+                        bot->RemoveAurasByType(SPELL_AURA_MOD_INVISIBILITY);\n+\n+                        if (GameObjectTemplate const* bgoinfo = GetGOInfo())\n+                        {\n+                            switch (bgoinfo->entry)\n+                            {\n+                                case 179785:                        // Silverwing Flag\n+                                case 179786:                        // Warsong Flag\n+                                    if (botbg->GetBgTypeID(true) == BATTLEGROUND_WS)\n+                                        botbg->EventBotClickedOnFlag(bot, this);\n+                                    break;\n+                                case 184142:                        // Netherstorm Flag\n+                                    if (botbg->GetBgTypeID(true) == BATTLEGROUND_EY)\n+                                        botbg->EventBotClickedOnFlag(bot, this);\n+                                    break;\n+                            }\n+                        }\n+                        //this cause to call return, all flags must be deleted here!!\n+                        spellId = 0;\n+                        Delete();\n+                        break;\n+                    }\n+                }\n+                //end npcbot\n+\n                 if (!user->IsPlayer())\n                     return;\n \ndiff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp\nindex 9cd58f197b..e7031a3e54 100644\n--- a/src/server/game/Entities/Object/Object.cpp\n+++ b/src/server/game/Entities/Object/Object.cpp\n@@ -1087,6 +1087,11 @@ void WorldObject::setActive(bool on)\n     if (IsPlayer())\n         return;\n \n+    //npcbot: bots should never be removed from active\n+    if (on == false && IsNPCBotOrPet())\n+        return;\n+    //end npcbot\n+\n     m_isActive = on;\n \n     if (!on || !IsInWorld())\n@@ -1174,6 +1179,10 @@ void WorldObject::SetPositionDataUpdate()\n     // Calls immediately for charmed units\n     if (IsCreature() && ToUnit()->IsCharmedOwnedByPlayerOrPlayer())\n         UpdatePositionData();\n+    //npcbot\n+    else if (IsNPCBotOrPet() && ToUnit()->IsControlledByPlayer())\n+        UpdatePositionData();\n+    //end npcbot\n }\n \n void WorldObject::UpdatePositionData()\n@@ -1914,6 +1923,26 @@ bool WorldObject::CanDetect(WorldObject const* obj, bool ignoreStealth, bool che\n {\n     WorldObject const* seer = this;\n \n+    //npcbot: master's sight only partially affects bots\n+    if (IsNPCBot())\n+    {\n+        Unit const* owner = ToCreature()->GetBotOwner();\n+        if (!owner)\n+            owner = ToUnit();\n+\n+        if (!obj->IsAlwaysDetectableFor(seer) && !obj->IsAlwaysDetectableFor(owner) && !ignoreStealth)\n+        {\n+            if (!seer->CanDetectInvisibilityOf(obj) && !(owner->IsInWorld() && owner->GetMap()->IsDungeon() && owner->CanDetectInvisibilityOf(obj)))\n+                return false;\n+\n+            if (!seer->CanDetectStealthOf(obj, checkAlert))\n+                return false;\n+        }\n+\n+        return true;\n+    }\n+    //end npcbot\n+\n     // Pets don't have detection, they use the detection of their masters\n     if (Unit const* thisUnit = ToUnit())\n         if (Unit* controller = thisUnit->GetCharmerOrOwner())\n@@ -2253,6 +2282,11 @@ TempSummon* Map::SummonCreature(uint32 entry, Position const& pos, SummonPropert\n             summon = new Puppet(properties, summoner ? summoner->GetGUID() : ObjectGuid::Empty);\n             break;\n         case UNIT_MASK_TOTEM:\n+            //npcbot: totem emul step 1\n+            if (summoner && summoner->IsNPCBot())\n+                summon = new Totem(properties, summoner->ToCreature()->GetBotOwner()->GetGUID());\n+            else\n+            //end npcbot\n             summon = new Totem(properties, summoner ? summoner->GetGUID() : ObjectGuid::Empty);\n             break;\n         case UNIT_MASK_MINION:\n@@ -2269,6 +2303,25 @@ TempSummon* Map::SummonCreature(uint32 entry, Position const& pos, SummonPropert\n         return nullptr;\n     }\n \n+    //npcbot: totem emul step 2\n+    if (summoner && summoner->IsNPCBot() && !summon->IsTempBot())\n+    {\n+        summon->SetCreatorGUID(summoner->GetGUID()); // see TempSummon::InitStats()\n+        if (mask == UNIT_MASK_TOTEM)\n+        {\n+            summon->SetFaction(summoner->ToCreature()->GetFaction());\n+            summon->SetPvP(summoner->ToCreature()->IsPvP());\n+            //set key flags if needed\n+            if (!summoner->ToCreature()->IsFreeBot())\n+            {\n+                summon->SetUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED);\n+                summon->SetOwnerGUID(summoner->ToCreature()->GetBotOwner()->GetGUID());\n+                summon->SetControlledByPlayer(true);\n+            }\n+        }\n+    }\n+    //end npcbot\n+\n     summon->SetUInt32Value(UNIT_CREATED_BY_SPELL, spellId);\n \n     summon->SetHomePosition(pos);\n@@ -2292,6 +2345,12 @@ TempSummon* Map::SummonCreature(uint32 entry, Position const& pos, SummonPropert\n     Acore::AIRelocationNotifier notifier(*summon);\n     Cell::VisitObjects(summon, notifier, GetVisibilityRange());\n \n+    //npcbot: totem emul step 3\n+    if (summoner && summoner->IsNPCBot())\n+        summoner->ToCreature()->OnBotSummon(summon);\n+    //end npcbot\n+\n+\n     return summon;\n }\n \n@@ -2915,14 +2974,14 @@ Position WorldObject::GetFirstCollisionPosition(float destX, float destY, float\n     return pos;\n }\n \n-Position WorldObject::GetFirstCollisionPosition(float dist, float angle)\n+Position WorldObject::GetFirstCollisionPosition(float dist, float angle) const\n {\n     Position pos = GetPosition();\n     MovePositionToFirstCollision(pos, dist, angle);\n     return pos;\n }\n \n-void WorldObject::MovePositionToFirstCollision(Position& pos, float dist, float angle)\n+void WorldObject::MovePositionToFirstCollision(Position& pos, float dist, float angle) const\n {\n     angle += GetOrientation();\n     float destx, desty, destz;\ndiff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h\nindex 4a635175da..c42e16b5f7 100644\n--- a/src/server/game/Entities/Object/Object.h\n+++ b/src/server/game/Entities/Object/Object.h\n@@ -198,6 +198,12 @@ public:\n     // FG: some hacky helpers\n     void ForceValuesUpdateAtIndex(uint32);\n \n+    //npcbot\n+    virtual bool IsNPCBot() const { return false; }\n+    virtual bool IsNPCBotPet() const { return false; }\n+    virtual bool IsNPCBotOrPet() const { return false; }\n+    //end npcbot\n+\n     [[nodiscard]] inline bool IsPlayer() const { return GetTypeId() == TYPEID_PLAYER; }\n     Player* ToPlayer() { if (IsPlayer()) return reinterpret_cast<Player*>(this); else return nullptr; }\n     [[nodiscard]] Player const* ToPlayer() const { if (IsPlayer()) return reinterpret_cast<Player const*>(this); else return nullptr; }\n@@ -492,10 +498,10 @@ public:\n     bool GetClosePoint(float& x, float& y, float& z, float size, float distance2d = 0, float angle = 0, WorldObject const* forWho = nullptr, bool force = false) const;\n     void MovePosition(Position& pos, float dist, float angle);\n     Position GetNearPosition(float dist, float angle);\n-    void MovePositionToFirstCollision(Position& pos, float dist, float angle);\n+    void MovePositionToFirstCollision(Position& pos, float dist, float angle) const;\n     Position GetFirstCollisionPosition(float startX, float startY, float startZ, float destX, float destY);\n     Position GetFirstCollisionPosition(float destX, float destY, float destZ);\n-    Position GetFirstCollisionPosition(float dist, float angle);\n+    Position GetFirstCollisionPosition(float dist, float angle) const;\n     Position GetRandomNearPosition(float radius);\n \n     void GetContactPoint(WorldObject const* obj, float& x, float& y, float& z, float distance2d = CONTACT_DISTANCE) const;\n@@ -690,6 +696,9 @@ public:\n     [[nodiscard]] float GetTransOffsetY() const { return m_movementInfo.transport.pos.GetPositionY(); }\n     [[nodiscard]] float GetTransOffsetZ() const { return m_movementInfo.transport.pos.GetPositionZ(); }\n     [[nodiscard]] float GetTransOffsetO() const { return m_movementInfo.transport.pos.GetOrientation(); }\n+    //npcbot: TC method transfer\n+    [[nodiscard]] Position const& GetTransOffset() const { return m_movementInfo.transport.pos; }\n+    //end npcbot\n     [[nodiscard]] uint32 GetTransTime()   const { return m_movementInfo.transport.time; }\n     [[nodiscard]] int8 GetTransSeat()     const { return m_movementInfo.transport.seat; }\n     [[nodiscard]] virtual ObjectGuid GetTransGUID()   const;\ndiff --git a/src/server/game/Entities/Player/KillRewarder.cpp b/src/server/game/Entities/Player/KillRewarder.cpp\nindex 78d24b4dbc..cea1887d2c 100644\n--- a/src/server/game/Entities/Player/KillRewarder.cpp\n+++ b/src/server/game/Entities/Player/KillRewarder.cpp\n@@ -24,6 +24,11 @@\n #include \"SpellAuraDefines.h\"\n #include \"SpellAuraEffects.h\"\n \n+//npcbot\n+#include \"botconfig.h\"\n+#include \"botmgr.h\"\n+//end npcbot\n+\n // KillRewarder incapsulates logic of rewarding player upon kill with:\n // * XP;\n // * honor;\n@@ -73,6 +78,10 @@ KillRewarder::KillRewarder(Player* killer, Unit* victim, bool isBattleGround) :\n     // mark the credit as pvp if victim is player\n     if (victim->IsPlayer())\n         _isPvP = true;\n+    //npcbot\n+    else if (victim->IsNPCBotOrPet())\n+        _isPvP = true;\n+    //end npcbot\n         // or if its owned by player and its not a vehicle\n     else if (victim->GetCharmerOrOwnerGUID().IsPlayer())\n         _isPvP = !victim->IsVehicle();\n@@ -112,6 +121,46 @@ void KillRewarder::_InitGroupData()\n                     // 2.5. _sumLevel - sum of levels of group members within reward distance;\n                     _sumLevel += lvl;\n                 }\n+\n+        //npcbot\n+        _bots_count_xp = 0;\n+        _bots_count_honor = 0;\n+        if (BotCfg::IsNpcBotXpReductionEnabled() || BotCfg::IsNpcBotHonorReductionEnabled())\n+        {\n+            const float reward_dist_sq = std::pow(sWorld->getFloatConfig(CONFIG_GROUP_XP_DISTANCE), 2.f);\n+            for (GroupReference const* itr = _group->GetFirstMember(); itr != nullptr; itr = itr->next())\n+            {\n+                Player const* member = itr->GetSource();\n+                if (!member || !member->IsInMap(_victim) || !member->HaveBot())\n+                    continue;\n+\n+                BotMap const* botMap = member->GetBotMgr()->GetBotMap();\n+                for (auto const& kv : *botMap)\n+                {\n+                    Creature const* bot = kv.second;\n+                    if (bot && bot->IsAlive() && bot->IsInMap(_victim) &&\n+                        (member->GetMap()->IsDungeon() || _victim->GetExactDistSq(bot) <= reward_dist_sq))\n+                    {\n+                        const bool add_for_xp = BotCfg::IsNpcBotXpReductionEnabled() && (!BotCfg::IsNpcBotXpReductionGroupOnly() || _group->IsMember(kv.first));\n+                        const bool add_for_honor = BotCfg::IsNpcBotHonorReductionEnabled() && (!BotCfg::IsNpcBotHonorReductionGroupOnly() || _group->IsMember(kv.first));\n+                        if (add_for_xp || add_for_honor)\n+                        {\n+                            if (add_for_xp)\n+                                ++_bots_count_xp;\n+                            if (add_for_honor)\n+                                ++_bots_count_honor;\n+                            const uint8 lvl = bot->GetLevel();\n+                            _sumLevel += lvl;\n+                            _aliveSumLevel += lvl;\n+                            if (_maxLevel < lvl)\n+                                _maxLevel = lvl;\n+                        }\n+                    }\n+                }\n+            }\n+        }\n+        //end npcbot\n+\n         // 2.6. _isFullXP - flag identifying that for all group members victim is not gray,\n         //      so 100% XP will be rewarded (50% otherwise).\n         _isFullXP = _maxNotGrayMember && (_maxLevel == _maxNotGrayMember->GetLevel());\n@@ -140,6 +189,14 @@ void KillRewarder::_InitXP(Player* player)\n void KillRewarder::_RewardHonor(Player* player)\n {\n     // Rewarded player must be alive.\n+    //npcbot\n+    if (BotCfg::IsNpcBotHonorReductionEnabled())\n+    {\n+        if (player->IsAlive())\n+            player->RewardHonor(_victim, _count + _bots_count_honor, -1, true);\n+    }\n+    else\n+    //end npcbot\n     if (player->IsAlive())\n         player->RewardHonor(_victim, _count, -1);\n }\n@@ -165,6 +222,16 @@ void KillRewarder::_RewardXP(Player* player, float rate)\n         // 4.2.2. Apply auras modifying rewarded XP (SPELL_AURA_MOD_XP_PCT).\n         xp *= player->GetTotalAuraMultiplier(SPELL_AURA_MOD_XP_PCT);\n \n+        //npcbot 4.2.2.1. Apply NpcBot XP reduction\n+        const uint8 xp_reduction = BotCfg::GetNpcBotXpReductionExtraAmount();\n+        const uint8 xp_reduction_start = BotCfg::GetNpcBotXpReductionExtraStartingNumber();\n+        if (xp_reduction_start > 0 && xp_reduction > 0 && _bots_count_xp >= xp_reduction_start)\n+        {\n+            const uint32 ratePct = static_cast<uint32>(std::max<int32>(100 - ((_bots_count_xp - (xp_reduction_start - 1)) * xp_reduction), 10));\n+            xp = xp * ratePct / 100;\n+        }\n+        //end npcbot\n+\n         // 4.2.3. Give XP to player.\n         sScriptMgr->OnPlayerGiveXP(player, xp, _victim, PlayerXPSource::XPSOURCE_KILL);\n         player->GiveXP(xp, _victim, _groupRate);\n@@ -243,6 +310,11 @@ void KillRewarder::_RewardGroup()\n             {\n                 // 3.1.2. Alter group rate if group is in raid (not for battlegrounds).\n                 const bool isRaid = !_isPvP && sMapStore.LookupEntry(_killer->GetMapId())->IsRaid() && _group->isRaidGroup();\n+                //npcbot\n+                if (_bots_count_xp)\n+                    _groupRate = Acore::XP::xp_in_group_rate(_count + _bots_count_xp, isRaid);\n+                else\n+                //end npcbot\n                 _groupRate = Acore::XP::xp_in_group_rate(_count, isRaid);\n             }\n \ndiff --git a/src/server/game/Entities/Player/KillRewarder.h b/src/server/game/Entities/Player/KillRewarder.h\nindex a91a2a0452..05c87753d0 100644\n--- a/src/server/game/Entities/Player/KillRewarder.h\n+++ b/src/server/game/Entities/Player/KillRewarder.h\n@@ -50,6 +50,10 @@ private:\n     float _groupRate;\n     Player* _maxNotGrayMember;\n     uint32 _count;\n+    //npcbot\n+    uint32 _bots_count_xp = 0;\n+    uint32 _bots_count_honor = 0;\n+    //end npcbot\n     uint32 _aliveSumLevel;\n     uint32 _sumLevel;\n     uint32 _xp;\ndiff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp\nindex c32f0402ad..da5d1e76cb 100644\n--- a/src/server/game/Entities/Player/Player.cpp\n+++ b/src/server/game/Entities/Player/Player.cpp\n@@ -102,6 +102,12 @@\n //  see: https://github.com/azerothcore/azerothcore-wotlk/issues/9766\n #include \"GridNotifiersImpl.h\"\n \n+//npcbot\n+#include \"botconfig.h\"\n+#include \"botdatamgr.h\"\n+#include \"botmgr.h\"\n+//end npcbot\n+\n enum CharacterFlags\n {\n     CHARACTER_FLAG_NONE                 = 0x00000000,\n@@ -398,6 +404,10 @@ Player::Player(WorldSession* session): Unit(), m_mover(this), _cinematicMgr(*thi\n     m_achievementMgr = new AchievementMgr(this);\n     m_reputationMgr = new ReputationMgr(this);\n \n+    /////////////// NPCBot System //////////////////\n+    _botMgr = new BotMgr(this);\n+    ///////////// End NPCBot System ////////////////\n+\n     m_NeedToSaveGlyphs = false;\n     m_MountBlockId = 0;\n     m_realDodge = 0.0f;\n@@ -461,6 +471,10 @@ Player::~Player()\n     delete m_achievementMgr;\n     delete m_reputationMgr;\n \n+    //npcbot\n+    delete _botMgr;\n+    //end npcbot\n+\n     sWorldSessionMgr->DecreasePlayerCount();\n \n     if (!m_isInSharedVisionOf.empty())\n@@ -1540,6 +1554,11 @@ bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientati\n             if (pet)\n                 UnsummonPetTemporaryIfAny();\n \n+            //bot: teleport npcbots\n+            if (HaveBot())\n+                _botMgr->OnTeleportFar(mapid, x, y, z, orientation);\n+            //end bot\n+\n             // remove all dyn objects\n             RemoveAllDynObjects();\n \n@@ -1749,6 +1768,25 @@ void Player::RemoveFromWorld()\n     }\n }\n \n+//NPCBOT\n+bool Player::HaveBot() const\n+{\n+    return _botMgr->HaveBot();\n+}\n+uint8 Player::GetNpcBotsCount() const\n+{\n+    return _botMgr->GetNpcBotsCount();\n+}\n+void Player::RemoveAllBots(uint8 removetype)\n+{\n+    _botMgr->RemoveAllBots(removetype);\n+}\n+void Player::UpdatePhaseForBots()\n+{\n+    _botMgr->UpdatePhaseForBots();\n+}\n+//END NPCBOT\n+\n void Player::RegenerateAll()\n {\n     //if (m_regenTimer <= 500)\n@@ -2096,6 +2134,11 @@ Creature* Player::GetNPCIfCanInteractWith(ObjectGuid const& guid, uint32 npcflag\n     if (creature->GetCharmerGUID())\n         return nullptr;\n \n+    //npcbot\n+    if (creature->IsNPCBot() && creature->IsWithinDistInMap(this, INTERACTION_DISTANCE))\n+        return creature;\n+    //end npcbot\n+\n     // xinef: perform better check\n     if (creature->GetReactionTo(this) <= REP_UNFRIENDLY)\n         return nullptr;\n@@ -2248,6 +2291,10 @@ void Player::SetGameMaster(bool on)\n         SetServerSideVisibilityDetect(SERVERSIDE_VISIBILITY_GM, SEC_PLAYER);\n     }\n \n+    //npcbot: pet is handled already, bots are not, so do it\n+    _botMgr->OnOwnerSetGameMaster(on);\n+    //end npcbot\n+\n     UpdateObjectVisibility();\n }\n \n@@ -2323,6 +2370,52 @@ void Player::RemoveFromGroup(Group* group, ObjectGuid guid, RemoveMethod method\n {\n     if (group)\n     {\n+        //npcbot - player is being removed from group - remove bots from that group\n+        if (Player* player = ObjectAccessor::FindPlayer(guid))\n+        {\n+            if (player->HaveBot())\n+            {\n+                //remove npcbots and set up new group if needed\n+                player->GetBotMgr()->RemoveAllBotsFromGroup();\n+                group = player->GetGroup();\n+                if (!group)\n+                    return; //group has been disbanded\n+            }\n+        }\n+        //npcbot - deleting player from db: remove bots\n+        else if (guid.IsPlayer())\n+        {\n+            std::vector<ObjectGuid> botguids;\n+            botguids.reserve(BotCfg::GetMaxNpcBots(DEFAULT_MAX_LEVEL) / 2 + 1);\n+            BotDataMgr::GetNPCBotGuidsByOwner(botguids, guid, true);\n+            for (std::vector<ObjectGuid>::const_iterator ci = botguids.begin(); ci != botguids.end(); ++ci)\n+            {\n+                if (group->IsMember(*ci))\n+                {\n+                    if (!group->RemoveMember(*ci, method, kicker, reason))\n+                        return;\n+                }\n+            }\n+        }\n+        //npcbot - bot is being removed from group - find master and remove bot through botmap\n+        else if (guid.IsCreature())\n+        {\n+            for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())\n+            {\n+                if (Player* member = itr->GetSource())\n+                {\n+                    if (!member->HaveBot())\n+                        continue;\n+\n+                    if (Creature* bot = member->GetBotMgr()->GetBot(guid))\n+                    {\n+                        member->GetBotMgr()->RemoveBotFromGroup(bot);\n+                        return;\n+                    }\n+                }\n+            }\n+        }\n+\n         group->RemoveMember(guid, method, kicker, reason);\n         group = nullptr;\n     }\n@@ -2366,6 +2459,9 @@ void Player::GiveXP(uint32 xp, Unit* victim, float group_rate, bool isLFGReward)\n \n     if (victim && victim->IsCreature() && !victim->ToCreature()->hasLootRecipient())\n     {\n+    //npcbot\n+        if (!(victim->IsNPCBot() && victim->FindMap() && victim->GetMap()->IsBattleground()))\n+    //end npcbot\n         return;\n     }\n \n@@ -2528,6 +2624,10 @@ void Player::GiveLevel(uint8 level)\n     SendQuestGiverStatusMultiple();\n \n     sScriptMgr->OnPlayerLevelChanged(this, oldLevel);\n+\n+    //npcbot: force bots to update stats\n+    _botMgr->SetBotsShouldUpdateStats();\n+    //end npcbot\n }\n \n bool Player::IsMaxLevel() const\n@@ -4209,6 +4309,12 @@ void Player::DeleteFromDB(ObjectGuid::LowType lowGuid, uint32 accountId, bool up\n \n                 Corpse::DeleteFromDB(playerGuid, trans);\n \n+                //npcbot - erase npcbots and manager data\n+                uint32 newOwner = 0;\n+                BotDataMgr::UpdateNpcBotDataAll(lowGuid, NPCBOT_UPDATE_OWNER, &newOwner);\n+                BotDataMgr::EraseNpcBotMgrData(playerGuid);\n+                //end npcbot\n+\n                 sScriptMgr->OnPlayerDeleteFromDB(trans, lowGuid);\n \n                 CharacterDatabase.CommitTransaction(trans);\n@@ -6159,6 +6265,49 @@ bool Player::RewardHonor(Unit* uVictim, uint32 groupsize, int32 honor, bool awar\n             UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_SPECIAL_PVP_KILL, 1, 0, victim);\n             sScriptMgr->OnPlayerVictimRewardAfter(this, victim, killer_title, victim_rank, honor_f);\n         }\n+        //npcbot: honor for bots\n+        else if (uVictim->ToCreature()->IsNPCBot() && !uVictim->ToCreature()->IsTempBot())\n+        {\n+            static const float WANDERING_BOT_HONOR_GAIN_MULT = 10.0f;\n+\n+            if (!BotCfg::IsBotHKEnabled())\n+                return false;\n+\n+            Creature const* bot = uVictim->ToCreature();\n+\n+            TeamId victimTeam = !bot->IsFreeBot() ? bot->GetBotOwner()->GetTeamId() : BotDataMgr::GetTeamIdForFaction(bot->GetFaction());\n+            if (GetTeamId() == victimTeam && !sWorld->IsFFAPvPRealm())\n+                return false;\n+\n+            uint8 k_level = GetLevel();\n+            uint8 k_grey = Acore::XP::GetGrayLevel(k_level);\n+            uint8 v_level = uVictim->GetLevel();\n+\n+            if (v_level <= k_grey)\n+                return false;\n+\n+            if (!BotCfg::IsBotHKMessageEnabled())\n+                victim_guid.Clear(); // Don't show HK: <rank> message, only log.\n+\n+            //TODO: honor gain rate\n+            honor_f = ceil(Acore::Honor::hk_honor_at_level_f(k_level) * (v_level - k_grey) / (k_level - k_grey));\n+            honor_f *= BotCfg::GetBotHKHonorRate();\n+            if (bot->IsWandererBot() && !bot->GetBotBG())\n+                honor_f *= WANDERING_BOT_HONOR_GAIN_MULT;\n+\n+            if (BotCfg::IsBotHKAchievementsEnabled())\n+            {\n+                ApplyModUInt32Value(PLAYER_FIELD_KILLS, 1, true);\n+                ApplyModUInt32Value(PLAYER_FIELD_LIFETIME_HONORABLE_KILLS, 1, true);\n+                UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_EARN_HONORABLE_KILL);\n+                UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HK_CLASS, BotMgr::GetBotPlayerClass(uVictim->ToCreature()));\n+                UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HK_RACE, BotMgr::GetBotPlayerRace(uVictim->ToCreature()));\n+                UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL_AT_AREA, GetAreaId());\n+                UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL, 1, 0, uVictim);\n+                UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_SPECIAL_PVP_KILL, 1, 0, uVictim);\n+            }\n+        }\n+        //end npcbot\n         else\n         {\n             if (!uVictim->ToCreature()->IsRacialLeader())\n@@ -7876,6 +8025,14 @@ void Player::SendLoot(ObjectGuid guid, LootType loot_type)\n             if (GameObjectTemplateAddon const* addon = go->GetTemplateAddon())\n                 loot->generateMoneyLoot(addon->mingold, addon->maxgold);\n \n+            //npcbot: fill wandering bot kill reward\n+            if (lootid)\n+            {\n+                if (go->GetEntry() == GO_BOT_MONEY_BAG)\n+                    BotMgr::OnBotWandererKilled(go);\n+            }\n+            //end npcbot\n+\n             if (loot_type == LOOT_FISHING)\n                 go->GetFishLoot(loot, this);\n             else if (loot_type == LOOT_FISHING_JUNK)\n@@ -10651,6 +10808,18 @@ bool Player::BuyItemFromVendorSlot(ObjectGuid vendorguid, uint32 vendorslot, uin\n         return false;\n     }\n \n+    // npcbot\n+    if (HaveBot())\n+    {\n+        if (!(pProto->AllowableClass & (GetClassMask() | GetBotMgr()->GetAllNpcBotsClassMask())) &&\n+            pProto->Bonding == BIND_WHEN_PICKED_UP && !IsGameMaster())\n+        {\n+            SendBuyError(BUY_ERR_CANT_FIND_ITEM, nullptr, item, 0);\n+            return false;\n+        }\n+    }\n+    else\n+    // end npcbot\n     if (!(pProto->AllowableClass & getClassMask()) && pProto->Bonding == BIND_WHEN_PICKED_UP && !IsGameMaster())\n     {\n         SendBuyError(BUY_ERR_CANT_FIND_ITEM, nullptr, item, 0);\n@@ -12679,6 +12848,9 @@ bool Player::isHonorOrXPTarget(Unit* victim) const\n \n     if (victim->IsCreature())\n         if (victim->IsTotem() || victim->IsCritter() || victim->IsPet() || victim->ToCreature()->HasFlagsExtra(CREATURE_FLAG_EXTRA_NO_XP))\n+        //npcbot: count npcbots at xp targets (DEPRECATED)\n+        if (!victim->ToCreature()->IsNPCBotOrPet())\n+        //end npcbots\n             return false;\n \n     return true;\ndiff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h\nindex 45c5dc5532..e9aa120c7c 100644\n--- a/src/server/game/Entities/Player/Player.h\n+++ b/src/server/game/Entities/Player/Player.h\n@@ -65,6 +65,10 @@ class PlayerSocial;\n class SpellCastTargets;\n class UpdateMask;\n \n+// NpcBot mod\n+class BotMgr;\n+// end NpcBot mod\n+\n typedef std::deque<Mail*> PlayerMails;\n typedef void(*bgZoneRef)(Battleground*, WorldPackets::WorldState::InitWorldStates&);\n \n@@ -2676,6 +2680,18 @@ public:\n     void SetMapChangeOrderCounter() { _mapChangeOrderCounter = GetSession()->GetOrderCounter(); }\n     uint32 GetMapChangeOrderCounter() { return _mapChangeOrderCounter; }\n \n+    /*****************************************************************/\n+    /***                        NPCBOT SYSTEM                      ***/\n+    /*****************************************************************/\n+    BotMgr* GetBotMgr() const { return _botMgr; }\n+    bool HaveBot() const;\n+    uint8 GetNpcBotsCount() const;\n+    void RemoveAllBots(uint8 removetype = 0);\n+    void UpdatePhaseForBots();\n+    /*****************************************************************/\n+    /***                      END NPCBOT SYSTEM                    ***/\n+    /*****************************************************************/\n+\n     /*********************************************************/\n     /***               SPELL QUEUE SYSTEM                  ***/\n     /*********************************************************/\n@@ -2973,6 +2989,14 @@ protected:\n     bool m_needZoneUpdate;\n \n private:\n+    /*****************************************************************/\n+    /***                        NPCBOT SYSTEM                      ***/\n+    /*****************************************************************/\n+    BotMgr* _botMgr;\n+    /*****************************************************************/\n+    /***                      END NPCBOT SYSTEM                    ***/\n+    /*****************************************************************/\n+\n     // internal common parts for CanStore/StoreItem functions\n     InventoryResult CanStoreItem_InSpecificSlot(uint8 bag, uint8 slot, ItemPosCountVec& dest, ItemTemplate const* pProto, uint32& count, bool swap, Item* pSrcItem) const;\n     InventoryResult CanStoreItem_InBag(uint8 bag, ItemPosCountVec& dest, ItemTemplate const* pProto, uint32& count, bool merge, bool non_specialized, Item* pSrcItem, uint8 skip_bag, uint8 skip_slot) const;\ndiff --git a/src/server/game/Entities/Player/PlayerStorage.cpp b/src/server/game/Entities/Player/PlayerStorage.cpp\nindex 843d1118ed..45b2d6d7bb 100644\n--- a/src/server/game/Entities/Player/PlayerStorage.cpp\n+++ b/src/server/game/Entities/Player/PlayerStorage.cpp\n@@ -72,6 +72,11 @@\n //  see: https://github.com/azerothcore/azerothcore-wotlk/issues/9766\n #include \"GridNotifiersImpl.h\"\n \n+//npcbot\n+#include \"botdatamgr.h\"\n+#include \"botmgr.h\"\n+//end npcbot\n+\n /*********************************************************/\n /***                    STORAGE SYSTEM                 ***/\n /*********************************************************/\n@@ -5676,6 +5681,11 @@ bool Player::LoadFromDB(ObjectGuid playerGuid, CharacterDatabaseQueryHolder cons\n         if (!HasAuraState((AuraStateType)m_spellInfo->CasterAuraState))\n             aura->HandleAllEffects(itr->second, AURA_EFFECT_HANDLE_REAL, false);\n     }\n+\n+    //npcbots: load BotManager data\n+    _botMgr->LoadData();\n+    //end npcbots\n+\n     return true;\n }\n \n@@ -7184,6 +7194,12 @@ void Player::SaveToDB(CharacterDatabaseTransaction trans, bool create, bool logo\n     // save pet (hunter pet level and experience and all type pets health/mana).\n     if (Pet* pet = GetPet())\n         pet->SavePetToDB(PET_SAVE_AS_CURRENT);\n+\n+    //npcbot: save player-related npcbot data\n+    BotDataMgr::SaveNpcBotStoredGear(GetGUID(), trans);\n+    BotDataMgr::SaveNpcBotItemSets(GetGUID(), trans);\n+    BotDataMgr::SaveNpcBotMgrData(GetGUID(), trans);\n+    //end npcbot\n }\n \n // fast save function for item/money cheating preventing - save only inventory and money state\ndiff --git a/src/server/game/Entities/Player/PlayerUpdates.cpp b/src/server/game/Entities/Player/PlayerUpdates.cpp\nindex ce2fde0517..effdae4fb9 100644\n--- a/src/server/game/Entities/Player/PlayerUpdates.cpp\n+++ b/src/server/game/Entities/Player/PlayerUpdates.cpp\n@@ -47,6 +47,10 @@\n //  see: https://github.com/azerothcore/azerothcore-wotlk/issues/9766\n #include \"GridNotifiersImpl.h\"\n \n+//npcbot\n+#include \"botmgr.h\"\n+//end npcbot\n+\n // Zone Interval should be 1 second\n constexpr auto ZONE_UPDATE_INTERVAL = 1000;\n \n@@ -422,6 +426,10 @@ void Player::Update(uint32 p_time)\n         m_delayed_unit_relocation_timer = 0;\n         RemoveFromNotify(NOTIFY_VISIBILITY_CHANGED);\n     }\n+\n+    //NpcBot mod: Update\n+    _botMgr->Update(p_time);\n+    //end Npcbot\n }\n \n void Player::UpdateMirrorTimers()\n@@ -1535,6 +1543,11 @@ void Player::UpdatePvP(bool state, bool _override)\n         SetPvP(state);\n     }\n \n+    //npcbot: update pvp flags for bots\n+    if (HaveBot())\n+        _botMgr->UpdatePvPForBots();\n+    //end npcbot\n+\n     RemovePlayerFlag(PLAYER_FLAGS_PVP_TIMER);\n     sScriptMgr->OnPlayerPVPFlagChange(this, state);\n }\ndiff --git a/src/server/game/Entities/Totem/Totem.cpp b/src/server/game/Entities/Totem/Totem.cpp\nindex 20253a0c37..b8e2379849 100644\n--- a/src/server/game/Entities/Totem/Totem.cpp\n+++ b/src/server/game/Entities/Totem/Totem.cpp\n@@ -24,6 +24,11 @@\n #include \"SpellMgr.h\"\n #include \"TotemPackets.h\"\n \n+//npcbot\n+#include \"botmgr.h\"\n+#include \"ObjectAccessor.h\"\n+//end npcbot\n+\n Totem::Totem(SummonPropertiesEntry const* properties, ObjectGuid owner) : Minion(properties, owner)\n {\n     m_unitTypeMask |= UNIT_MASK_TOTEM;\n@@ -34,7 +39,20 @@ Totem::Totem(SummonPropertiesEntry const* properties, ObjectGuid owner) : Minion\n void Totem::Update(uint32 time)\n {\n     Unit* owner = GetOwner();\n+    //npcbot: do not despawn bot totem if master is dead\n+    Creature const* botOwner = (owner && owner->IsPlayer() && owner->ToPlayer()->HaveBot()) ?\n+       owner->ToPlayer()->GetBotMgr()->GetBot(GetCreatorGUID()) : nullptr;\n \n+    if (botOwner)\n+    {\n+        if (!IsAlive() || m_duration <= time || (!botOwner->IsAlive() && !(m_Properties && m_Properties->Type == SUMMON_TYPE_LIGHTWELL)))\n+        {\n+            UnSummon();\n+            return;\n+        }\n+    }\n+    else\n+    //end npcbot\n     if (!owner || !IsAlive() || m_duration <= time)\n     {\n         UnSummon();                                         // remove self\n@@ -69,6 +87,9 @@ void Totem::InitStats(uint32 duration)\n             owner->ToPlayer()->SendDirectMessage(data.Write());\n \n             // set display id depending on caster's race\n+            //npcbot: handled in class AI for bot totems\n+            if (!(GetCreatorGUID().IsCreature() && owner->ToPlayer()->HaveBot() && owner->ToPlayer()->GetBotMgr()->GetBot(GetCreatorGUID())))\n+            //end npcbot\n             SetDisplayId(sObjectMgr->GetModelForTotem(SummonSlot(slot), Races(owner->getRace())));\n         }\n \n@@ -176,6 +197,12 @@ void Totem::UnSummon(Milliseconds msTime)\n         }\n     }\n \n+    //npcbot: send SummonedCreatureDespawn()\n+    if (Unit* creator = GetCreator())\n+        if (creator->IsNPCBot())\n+            creator->ToCreature()->OnBotDespawn(this);\n+    //end npcbot\n+\n     AddObjectToRemoveList();\n }\n \ndiff --git a/src/server/game/Entities/Transport/Transport.cpp b/src/server/game/Entities/Transport/Transport.cpp\nindex ec12d2572c..bfefca0cd1 100644\n--- a/src/server/game/Entities/Transport/Transport.cpp\n+++ b/src/server/game/Entities/Transport/Transport.cpp\n@@ -447,6 +447,13 @@ void MotionTransport::UnloadNonStaticPassengers()\n             ++itr;\n             continue;\n         }\n+        //npcbot: do not unload bots\n+        if ((*itr)->IsNPCBotOrPet())\n+        {\n+            ++itr;\n+            continue;\n+        }\n+        //end npcbot\n         PassengerSet::iterator itr2 = itr++;\n         (*itr2)->AddObjectToRemoveList();\n     }\n@@ -557,6 +564,10 @@ void MotionTransport::DelayedTeleportTransport()\n         switch (obj->GetTypeId())\n         {\n             case TYPEID_UNIT:\n+                //npcbot: do not add bots to transport (handled inside AI)\n+                if (obj->IsNPCBotOrPet())\n+                    break;\n+                //end npcbot\n                 _passengers.erase(obj);\n                 if (!obj->ToCreature()->IsPet())\n                     obj->ToCreature()->DespawnOrUnsummon();\ndiff --git a/src/server/game/Entities/Unit/StatSystem.cpp b/src/server/game/Entities/Unit/StatSystem.cpp\nindex 24c025ac6d..062ab89968 100644\n--- a/src/server/game/Entities/Unit/StatSystem.cpp\n+++ b/src/server/game/Entities/Unit/StatSystem.cpp\n@@ -1078,6 +1078,12 @@ void Creature::UpdateMaxPower(Powers power)\n     UnitMods unitMod = UnitMods(static_cast<uint16>(UNIT_MOD_POWER_START) + power);\n \n     float value  = GetTotalAuraModValue(unitMod);\n+\n+    //npcbot\n+    if (IsNPCBotOrPet())\n+        value += GetCreatePowers(power);\n+    //end npcbot\n+\n     SetMaxPower(power, uint32(value));\n }\n \n@@ -1153,17 +1159,67 @@ void Creature::CalculateMinMaxDamage(WeaponAttackType attType, bool normalized,\n     float weaponMinDamage = GetWeaponDamageRange(attType, MINDAMAGE);\n     float weaponMaxDamage = GetWeaponDamageRange(attType, MAXDAMAGE);\n \n+    //npcbot: support for feral form\n+    if (IsNPCBot() && IsInFeralForm())\n+    {\n+        float att_speed = GetAPMultiplier(attType, false);\n+        uint8 lvl = GetLevel();\n+        if (lvl > 60)\n+            lvl = 60;\n+\n+        weaponMinDamage = lvl*0.85f*att_speed;\n+        weaponMaxDamage = lvl*1.25f*att_speed;\n+    }\n+    else\n+    //end npcbot\n     // Disarm for creatures\n     if (HasWeapon(attType) && !HasWeaponForAttack(attType))\n     {\n+        //npcbot: mimic player-like disarm (retain damage)\n+        if (IsNPCBot())\n+        {\n+            // Main hand melee is always usable, but disarm reduces damage drastically\n+            if (attType == BASE_ATTACK)\n+            {\n+                weaponMinDamage *= 0.25f;\n+                weaponMaxDamage *= 0.25f;\n+            }\n+            else\n+            {\n+                weaponMinDamage = 0.0f;\n+                weaponMaxDamage = 0.0f;\n+            }\n+        }\n+        else\n+        {\n+        //end npcbot\n         minDamage *= 0.5f;\n         maxDamage *= 0.5f;\n+        //npcbot\n+        }\n+    }\n+    //end npcbot\n+    //npcbot: support for ammo\n+    else if (attType == RANGED_ATTACK)\n+    {\n+        float att_speed = GetAPMultiplier(attType, false);\n+        weaponMinDamage += GetCreatureAmmoDPS() * att_speed;\n+        weaponMaxDamage += GetCreatureAmmoDPS() * att_speed;\n+    //end npcbot\n     }\n \n     float attackPower      = GetTotalAttackPowerValue(attType);\n     float attackSpeedMulti = GetAPMultiplier(attType, normalized);\n+    //npcbot\n+    /*\n+    //end npcbot\n     float baseValue        = GetFlatModifierValue(unitMod, BASE_VALUE) + (attackPower / 14.0f) * variance;\n     float basePct          = GetPctModifierValue(unitMod, BASE_PCT) * attackSpeedMulti;\n+    //npcbot\n+    */\n+    float baseValue        = GetFlatModifierValue(unitMod, BASE_VALUE) + (attackPower / 14.0f) * variance * (IsNPCBot() ? attackSpeedMulti : 1.0f);\n+    float basePct          = GetPctModifierValue(unitMod, BASE_PCT) * (!IsNPCBot() ? attackSpeedMulti : 1.0f);\n+    //end npcbot\n     float totalValue       = GetFlatModifierValue(unitMod, TOTAL_VALUE);\n     float totalPct         = addTotalPct ? GetPctModifierValue(unitMod, TOTAL_PCT) : 1.0f;\n     float dmgMultiplier    = GetCreatureTemplate()->DamageModifier; // = DamageModifier * _GetDamageMod(rank);\ndiff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp\nindex ce7e5c5b9c..2d911bc79b 100644\n--- a/src/server/game/Entities/Unit/Unit.cpp\n+++ b/src/server/game/Entities/Unit/Unit.cpp\n@@ -75,6 +75,12 @@\n #include <algorithm>\n #include <cmath>\n \n+//npcbot\n+#include \"botconfig.h\"\n+#include \"botdatamgr.h\"\n+#include \"botmgr.h\"\n+//end npcbot\n+\n float baseMoveSpeed[MAX_MOVE_TYPE] =\n {\n     2.5f,                  // MOVE_WALK\n@@ -797,6 +803,23 @@ bool Unit::IsWithinMeleeRange(Unit const* obj, float dist) const\n     return distsq < maxdist * maxdist;\n }\n \n+//npcbot\n+bool Unit::IsWithinMeleeRangeAt(Position const& pos, Unit const* obj) const\n+{\n+    if (!obj || !IsInMap(obj) || !InSamePhase(obj))\n+        return false;\n+\n+    float dx = pos.GetPositionX() - obj->GetPositionX();\n+    float dy = pos.GetPositionY() - obj->GetPositionY();\n+    float dz = pos.GetPositionZ() - obj->GetPositionZ();\n+    float distsq = dx*dx + dy*dy + dz*dz;\n+\n+    float maxdist = GetMeleeRange(obj);\n+\n+    return distsq <= maxdist * maxdist;\n+}\n+//end npcbot\n+\n float Unit::GetMeleeRange(Unit const* target) const\n {\n     float range = GetCombatReach() + target->GetCombatReach() + 4.0f / 3.0f;\n@@ -906,6 +929,9 @@ bool Unit::HasAuraTypeWithFamilyFlags(AuraType auraType, uint32 familyName, uint\n }\n \n bool Unit::IsImmunedToSpell(SpellInfo const* spellInfo, uint32 effectMask, Unit const* caster /*= nullptr*/)\n+//npcbot\n+const\n+//end npcbot\n {\n     if (!spellInfo)\n         return false;\n@@ -996,6 +1022,26 @@ uint32 Unit::DealDamage(Unit* attacker, Unit* victim, uint32 damage, CleanDamage\n             attacker->GetAI()->DamageDealt(victim, damage, damagetype, damageSchoolMask);\n     }\n \n+    //npcbot\n+    if (victim->IsNPCBot())\n+        BotMgr::OnBotDamageTaken(attacker, victim, damage, cleanDamage , damagetype, spellProto);\n+    //end npcbot\n+    //npcbot: damage dealt hook for crits and spells\n+    if (attacker && attacker->IsNPCBot())\n+        BotMgr::OnBotDamageDealt(attacker, victim, damage, cleanDamage, damagetype, spellProto);\n+    //end npcbot\n+\n+    //npcbot: damage tracker hook\n+    if (damage > 0 && damage < victim->GetHealth())\n+    {\n+        Player const* botowner = victim->GetTypeId() == TYPEID_PLAYER ? victim->ToPlayer() :\n+            victim->IsNPCBot() && !victim->ToCreature()->IsFreeBot() ? victim->ToCreature()->GetBotOwner() : nullptr;\n+\n+        if (botowner && botowner->GetBotMgr() && (botowner->HaveBot() || (botowner->GetGroup() && botowner->GetGroup()->IsMember(victim->GetGUID()))))\n+            botowner->GetBotMgr()->TrackDamage(victim, damage);\n+    }\n+    //end npcbot\n+\n     // Hook for OnDamage Event\n     sScriptMgr->OnDamage(attacker, victim, damage);\n \n@@ -1008,6 +1054,11 @@ uint32 Unit::DealDamage(Unit* attacker, Unit* victim, uint32 damage, CleanDamage\n                     controlledAI->OwnerAttackedBy(attacker);\n     }\n \n+    //npcbot\n+    if (attacker && attacker != victim && victim->IsVehicle() && victim->IsAlive())\n+        BotMgr::OnVehicleAttackedBy(attacker, victim);\n+    //end npcbot\n+\n     //Dont deal damage to unit if .cheat god is enable.\n     if (victim->IsPlayer())\n     {\n@@ -1054,6 +1105,17 @@ uint32 Unit::DealDamage(Unit* attacker, Unit* victim, uint32 damage, CleanDamage\n             }\n         }\n \n+        //npcbot\n+        if (!damage && damagetype != DOT && cleanDamage && cleanDamage->absorbed_damage && victim->IsNPCBotOrPet() && attacker && victim != attacker &&\n+            (attacker->IsNPCBotOrPet() || attacker->IsControlledByPlayer()))\n+        {\n+            if (Spell* spell = victim->m_currentSpells[CURRENT_GENERIC_SPELL])\n+                if (spell->getState() == SPELL_STATE_PREPARING)\n+                    if ((spell->m_spellInfo->InterruptFlags & SPELL_INTERRUPT_FLAG_ABORT_ON_DMG) != 0)\n+                        victim->InterruptNonMeleeSpells(false);\n+        }\n+        //end npcbot\n+\n         // We're going to call functions which can modify content of the list during iteration over it's elements\n         // Let's copy the list so we can prevent iterator invalidation\n         AuraEffectList vCopyDamageCopy(victim->GetAuraEffectsByType(SPELL_AURA_SHARE_DAMAGE_PCT));\n@@ -1180,6 +1242,7 @@ uint32 Unit::DealDamage(Unit* attacker, Unit* victim, uint32 damage, CleanDamage\n     }\n \n     if (attacker && attacker != victim)\n+    {\n         if (Player* killer = attacker->GetCharmerOrOwnerPlayerOrPlayerItself())\n         {\n             // pussywizard: don't allow GMs to deal damage in normal way (this leaves no evidence in logs!), they have commands to do so\n@@ -1193,9 +1256,35 @@ uint32 Unit::DealDamage(Unit* attacker, Unit* victim, uint32 damage, CleanDamage\n             }\n             //killer->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_DEALT, damage); // pussywizard: optimization\n         }\n+        //npcbot\n+        if (attacker->IsNPCBot() && (victim->IsPlayer() || victim->IsNPCBot()))\n+        {\n+            Creature const* bot = attacker->ToCreature();\n+            if (Battleground* bg = bot->GetBotBG())\n+                bg->UpdateBotScore(bot, SCORE_DAMAGE_DONE, damage);\n+        }\n+        //end npcbot\n+    }\n \n     if (victim->IsPlayer())\n         ;//victim->ToPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_RECEIVED, damage); // pussywizard: optimization\n+    //npcbot\n+    else if (victim->IsNPCBotOrPet())\n+    {\n+        if (attacker && !victim->ToCreature()->hasLootRecipient())\n+            victim->ToCreature()->SetLootRecipient(attacker);\n+        if (victim->ToCreature()->GetPlayerDamageReq())\n+        {\n+            if (!attacker || attacker->IsControlledByPlayer() || (attacker->ToTempSummon() && attacker->ToTempSummon()->GetSummonerUnit() && attacker->ToTempSummon()->GetSummonerUnit()->IsPlayer()) ||\n+                (attacker->IsNPCBotOrPet() && !attacker->ToCreature()->IsFreeBot()) || (attacker->GetCreator() && attacker->GetCreator()->IsPlayer()))\n+            {\n+                uint32 unDamage = health < damage ? health : damage;\n+                bool damagedByPlayer = unDamage && attacker && (attacker->IsPlayer() || attacker->IsNPCBotOrPet() || attacker->m_movedByPlayer != nullptr);\n+                victim->ToCreature()->LowerPlayerDamageReq(unDamage, damagedByPlayer);\n+            }\n+        }\n+    }\n+    //end npcbot\n     else if (!victim->IsControlledByPlayer() || victim->IsVehicle())\n     {\n         if (!victim->ToCreature()->hasLootRecipient())\n@@ -1205,6 +1294,9 @@ uint32 Unit::DealDamage(Unit* attacker, Unit* victim, uint32 damage, CleanDamage\n         {\n             uint32 unDamage = health < damage ? health : damage;\n             bool damagedByPlayer = unDamage && attacker && (attacker->IsPlayer() || attacker->m_movedByPlayer != nullptr);\n+            //npcbot: npcbots' damage allways counts towards damage requirement\n+            damagedByPlayer |= attacker && attacker->IsNPCBotOrPet();\n+            //end npcbot\n             victim->ToCreature()->LowerPlayerDamageReq(unDamage, damagedByPlayer);\n         }\n     }\n@@ -1312,6 +1404,28 @@ uint32 Unit::DealDamage(Unit* attacker, Unit* victim, uint32 damage, CleanDamage\n             }\n         }\n \n+        //npcbot\n+        if (victim->IsNPCBot() && attacker && victim != attacker && damagetype != NODAMAGE && damagetype != DOT && damage &&\n+            (attacker->IsNPCBotOrPet() || attacker->IsControlledByPlayer()) &&\n+            (!spellProto || !(spellProto->HasAttribute(SPELL_ATTR7_DONT_CAUSE_SPELL_PUSHBACK) || spellProto->HasAttribute(SPELL_ATTR3_TREAT_AS_PERIODIC))))\n+        {\n+            if (Spell* spell = victim->m_currentSpells[CURRENT_GENERIC_SPELL])\n+            {\n+                if (spell->getState() == SPELL_STATE_PREPARING)\n+                {\n+                    if (spell->m_spellInfo->InterruptFlags & SPELL_INTERRUPT_FLAG_ABORT_ON_DMG)\n+                        victim->InterruptNonMeleeSpells(false);\n+                    else\n+                        spell->Delayed();\n+                }\n+            }\n+\n+            if (Spell* spell = victim->m_currentSpells[CURRENT_CHANNELED_SPELL])\n+                if (spell->getState() == SPELL_STATE_CASTING)\n+                    spell->DelayedChannel();\n+        }\n+        //end npcbot\n+\n         // last damage from duel opponent\n         if (duel_hasEnded)\n         {\n@@ -1355,6 +1469,10 @@ SpellCastResult Unit::CastSpell(SpellCastTargets const& targets, SpellInfo const\n         return SPELL_FAILED_SPELL_UNAVAILABLE;\n     }\n \n+    //npcbot: try override\n+    spellInfo = spellInfo->TryGetSpellInfoOverride(this);\n+    //end npcbot\n+\n     /// @todo: this is a workaround - not needed anymore, but required for some scripts :(\n     if (!originalCaster && triggeredByAura)\n     {\n@@ -1516,6 +1634,18 @@ void Unit::CalculateSpellDamageTaken(SpellNonMeleeDamage* damageInfo, int32 dama\n         case SPELL_DAMAGE_CLASS_RANGED:\n         case SPELL_DAMAGE_CLASS_MELEE:\n             {\n+                //NpcBot mod: apply bot damage mods\n+                if (IsNPCBotOrPet())\n+                {\n+                    //TODO: rename to ApplyBotDamageMultiplierPhysical\n+                    ToCreature()->ApplyBotDamageMultiplierMelee(damage, *damageInfo, spellInfo, attackType, crit);\n+                    if (damageSchoolMask & SPELL_SCHOOL_MASK_NORMAL)\n+                        damage *= (BotMgr::IsWanderingWorldBot(ToCreature()) ? BotCfg::GetBotWandererDamageMod() : BotCfg::GetBotDamageModPhysical());\n+                    else if (damageSchoolMask & SPELL_SCHOOL_MASK_MAGIC)\n+                        damage *= (BotMgr::IsWanderingWorldBot(ToCreature()) ? BotCfg::GetBotWandererDamageMod() : BotCfg::GetBotDamageModSpell());\n+                }\n+                //End NpcBot\n+\n                 // Physical Damage\n                 if (damageSchoolMask & SPELL_SCHOOL_MASK_NORMAL)\n                 {\n@@ -1587,6 +1717,17 @@ void Unit::CalculateSpellDamageTaken(SpellNonMeleeDamage* damageInfo, int32 dama\n         case SPELL_DAMAGE_CLASS_NONE:\n         case SPELL_DAMAGE_CLASS_MAGIC:\n             {\n+                //NpcBot mod: apply bot damage mods\n+                if (IsNPCBotOrPet())\n+                {\n+                    ToCreature()->ApplyBotDamageMultiplierSpell(damage, *damageInfo, spellInfo, attackType, crit);\n+                    if (damageSchoolMask & SPELL_SCHOOL_MASK_NORMAL)\n+                        damage *= (BotMgr::IsWanderingWorldBot(ToCreature()) ? BotCfg::GetBotWandererDamageMod() : BotCfg::GetBotDamageModPhysical());\n+                    else if (damageSchoolMask & SPELL_SCHOOL_MASK_MAGIC)\n+                        damage *= (BotMgr::IsWanderingWorldBot(ToCreature()) ? BotCfg::GetBotWandererDamageMod() : BotCfg::GetBotDamageModSpell());\n+                }\n+                //End NpcBot\n+\n                 // If crit add critical bonus\n                 if (crit)\n                 {\n@@ -1643,6 +1784,10 @@ void Unit::DealSpellDamage(SpellNonMeleeDamage* damageInfo, bool durabilityLoss,\n         return;\n     }\n \n+    //npcbot: override spellInfo\n+    spellProto = spellProto->TryGetSpellInfoOverride(damageInfo->attacker);\n+    //end npcbot\n+\n     // Call default DealDamage\n     CleanDamage cleanDamage(damageInfo->cleanDamage, damageInfo->absorb, BASE_ATTACK, MELEE_HIT_NORMAL);\n     Unit::DealDamage(this, victim, damageInfo->damage, &cleanDamage, SPELL_DIRECT_DAMAGE, SpellSchoolMask(damageInfo->schoolMask), spellProto, durabilityLoss, false, spell);\n@@ -1752,6 +1897,17 @@ void Unit::CalculateMeleeDamage(Unit* victim, CalcDamageInfo* damageInfo, Weapon\n             victim->GetAI()->OnCalculateMeleeDamageReceived(damage, this);\n         }\n \n+        //NpcBot mod: apply bot damage mods\n+        if (IsNPCBotOrPet())\n+        {\n+            damageInfo->damages[i].damage = damage;\n+            //damage is unused. TODO: remove this redundant argument\n+            ToCreature()->ApplyBotDamageMultiplierMelee(damageInfo->damages[i].damage, *damageInfo);\n+            damage = damageInfo->damages[i].damage;\n+            damage *= (BotMgr::IsWanderingWorldBot(ToCreature()) ? BotCfg::GetBotWandererDamageMod() : BotCfg::GetBotDamageModPhysical());\n+        }\n+        //End NpcBot\n+\n         // Calculate armor reduction\n         if (IsDamageReducedByArmor((SpellSchoolMask)(damageInfo->damages[i].damageSchoolMask)))\n         {\n@@ -1764,6 +1920,11 @@ void Unit::CalculateMeleeDamage(Unit* victim, CalcDamageInfo* damageInfo, Weapon\n         }\n     }\n \n+    //NpcBot mod: check custom melee outcome\n+    if (IsNPCBot())\n+        damageInfo->hitOutCome = ToCreature()->BotRollMeleeOutcomeAgainst(damageInfo->target, damageInfo->attackType);\n+    else\n+    //End NpcBot\n     damageInfo->hitOutCome = RollMeleeOutcomeAgainst(damageInfo->target, damageInfo->attackType);\n \n     // If the victim was a sitting player and we didn't roll a miss, then crit.\n@@ -2079,6 +2240,9 @@ void Unit::DealMeleeDamage(CalcDamageInfo* damageInfo, bool durabilityLoss)\n     if ((damageInfo->damages[0].damage + damageInfo->damages[1].damage) && ((damageInfo->hitOutCome == MELEE_HIT_CRIT || damageInfo->hitOutCome == MELEE_HIT_CRUSHING || damageInfo->hitOutCome == MELEE_HIT_NORMAL || damageInfo->hitOutCome == MELEE_HIT_GLANCING) &&\n                                !IsPlayer() && !ToCreature()->IsControlledByPlayer() && !victim->HasInArc(M_PI, this)\n                                && (victim->IsPlayer() || !victim->ToCreature()->isWorldBoss()) && !victim->IsVehicle()))\n+    //npcbot: prevent daze caused by bots\n+    if (!IsNPCBotOrPet())\n+    //end npcbot\n     {\n         // -probability is between 0% and 40%\n         // 20% base chance\n@@ -2109,6 +2273,13 @@ void Unit::DealMeleeDamage(CalcDamageInfo* damageInfo, bool durabilityLoss)\n         DamageInfo dmgInfo(*damageInfo);\n         ToPlayer()->CastItemCombatSpell(victim, damageInfo->attackType, damageInfo->procVictim, dmgInfo.GetHitMask());\n     }\n+    //npcbot - CastItemCombatSpell for bots\n+    else if (IsNPCBot())\n+    {\n+        DamageInfo dmgInfo(*damageInfo);\n+        ToCreature()->CastCreatureItemCombatSpell(dmgInfo);\n+    }\n+    //end npcbot\n \n     // Do effect if any damage done to target\n     if (damageInfo->damages[0].damage + damageInfo->damages[1].damage)\n@@ -2263,6 +2434,14 @@ uint32 Unit::CalcArmorReducedDamage(Unit const* attacker, Unit const* victim, co\n             armor -= std::min(armorPen, maxArmorPen);\n         }\n     }\n+    //npcbot: armor penetration modifier\n+    if (attacker && attacker->IsNPCBot())\n+    {\n+        // SPELL_AURA_MOD_ARMOR_PENETRATION_PCT is handled in class mods\n+        // No cap\n+        armor -= CalculatePct(armor, attacker->ToCreature()->GetCreatureArmorPenetrationCoef());\n+    }\n+    //end npcbot\n \n     if (armor < 0.0f)\n         armor = 0.0f;\n@@ -2299,6 +2478,14 @@ float Unit::GetEffectiveResistChance(Unit const* owner, SpellSchoolMask schoolMa\n             victimResistance += static_cast<float>(owner->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_TARGET_RESISTANCE, schoolMask));\n     }\n \n+    //npcbot - spell resist and spell penetration for bots\n+    if (owner && owner->IsNPCBot())\n+        victimResistance -= owner->ToCreature()->GetCreatureSpellPenetration();\n+\n+    if (victim->IsNPCBot())\n+        victimResistance += victim->ToCreature()->GetCreatureResistanceBonus(schoolMask);\n+    //end npcbot\n+\n     victimResistance = std::max(victimResistance, 0.0f);\n \n     if (owner && (!spellInfo || !spellInfo->HasAttribute(SPELL_ATTR0_CU_BINARY_SPELL)))\n@@ -2504,6 +2691,10 @@ void Unit::CalcAbsorbResist(DamageInfo& dmgInfo, bool Splited)\n         if (float manaMultiplier = absorbAurEff->GetSpellInfo()->Effects[absorbAurEff->GetEffIndex()].CalcValueMultiplier(absorbAurEff->GetCaster()))\n             manaReduction = int32(float(manaReduction) * manaMultiplier);\n \n+        //npcbot: fix absorption with 'manaMultiplier' < 1.0 (Mana Shield 35064)\n+        manaReduction = std::max<decltype(manaReduction)>(manaReduction, 1);\n+        //end npcbot\n+\n         int32 manaTaken = -victim->ModifyPower(POWER_MANA, -manaReduction);\n \n         // take case when mana has ended up into account\n@@ -3001,12 +3192,25 @@ MeleeHitOutcome Unit::RollMeleeOutcomeAgainst(Unit const* victim, WeaponAttackTy\n     {\n         //LOG_DEBUG(\"entities.unit\", \"RollMeleeOutcomeAgainst: attack came from behind and victim was a player.\");\n     }\n+    //npcbot - bots cannot dodge if attacker is behind\n+    else if (victim->IsNPCBot() && !victim->HasInArc(M_PI, this) && !victim->HasAuraType(SPELL_AURA_IGNORE_HIT_DIRECTION))\n+    {\n+        //TC_LOG_DEBUG(\"entities.unit\", \"RollMeleeOutcomeAgainst: attack came from behind and victim was a bot.\");\n+    }\n+    //end npcbot\n     // Xinef: do not allow to dodge with CREATURE_FLAG_EXTRA_NO_DODGE flag\n     else if (victim->IsPlayer() || !(victim->ToCreature()->HasFlagsExtra(CREATURE_FLAG_EXTRA_NO_DODGE)))\n     {\n         // Reduce dodge chance by attacker expertise rating\n         if (IsPlayer())\n             dodge_chance -= int32(ToPlayer()->GetExpertiseDodgeOrParryReduction(attType) * 100);\n+        //npcbot - manual expertise instead of auras\n+        else if (IsNPCBot())\n+        {\n+            dodge_chance -= ToCreature()->GetCreatureExpertise() * 25;\n+            dodge_chance -= GetTotalAuraModifier(SPELL_AURA_MOD_EXPERTISE) * 25;\n+        }\n+        //end npcbot\n         else\n             dodge_chance -= GetTotalAuraModifier(SPELL_AURA_MOD_EXPERTISE) * 25;\n \n@@ -3041,6 +3245,13 @@ MeleeHitOutcome Unit::RollMeleeOutcomeAgainst(Unit const* victim, WeaponAttackTy\n         // Reduce parry chance by attacker expertise rating\n         if (IsPlayer())\n             parry_chance -= int32(ToPlayer()->GetExpertiseDodgeOrParryReduction(attType) * 100);\n+        //npcbot - manual expertise instead of auras\n+        else if (IsNPCBot())\n+        {\n+            parry_chance -= ToCreature()->GetCreatureExpertise() * 25;\n+            parry_chance -= GetTotalAuraModifier(SPELL_AURA_MOD_EXPERTISE) * 25;\n+        }\n+        //end npcbot\n         else\n             parry_chance -= GetTotalAuraModifier(SPELL_AURA_MOD_EXPERTISE) * 25;\n \n@@ -3049,6 +3260,21 @@ MeleeHitOutcome Unit::RollMeleeOutcomeAgainst(Unit const* victim, WeaponAttackTy\n             tmp = parry_chance;\n \n             // xinef: cant parry while casting or while stunned\n+            //npcbot: allow some bot classes to parry while casting\n+            if (victim->IsNPCBot())\n+            {\n+                if (victim->HasUnitState(UNIT_STATE_CONTROLLED))\n+                {\n+                    tmp = 0;\n+                }\n+                else if (victim->IsNonMeleeSpellCast(false, false, true))\n+                {\n+                    if (!BotMgr::CanBotParryWhileCasting(victim->ToCreature()))\n+                        tmp = 0;\n+                }\n+            }\n+            else\n+            //end npcbot\n             if (victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))\n                 tmp = 0;\n \n@@ -3080,6 +3306,9 @@ MeleeHitOutcome Unit::RollMeleeOutcomeAgainst(Unit const* victim, WeaponAttackTy\n     }\n \n     // Max 40% chance to score a glancing blow against mobs that are higher level (can do only players and pets and not with ranged weapon)\n+    //npcbot: no glances on npcbots and their pets\n+    if (!victim->IsNPCBotOrPet())\n+    //end npcbot\n     if (attType != RANGED_ATTACK &&\n             (IsPlayer() || IsPet()) &&\n             !victim->IsPlayer() && !victim->IsPet() &&\n@@ -3199,6 +3428,9 @@ uint32 Unit::CalculateDamage(WeaponAttackType attType, bool normalized, bool add\n float Unit::CalculateLevelPenalty(SpellInfo const* spellProto) const\n {\n     if (!IsPlayer())\n+    //npcbot\n+    if (!IsNPCBot())\n+    //end npcbot\n         return 1.0f;\n \n     if (spellProto->SpellLevel <= 0 || spellProto->SpellLevel >= spellProto->MaxLevel)\n@@ -3436,6 +3668,13 @@ SpellMissInfo Unit::MeleeSpellHitResult(Unit* victim, SpellInfo const* spellInfo\n         // Reduce dodge chance by attacker expertise rating\n         if (IsPlayer())\n             dodgeChance -= int32(ToPlayer()->GetExpertiseDodgeOrParryReduction(attType) * 100.0f);\n+        //npcbot - manual expertise instead of auras\n+        else if (IsNPCBot())\n+        {\n+            dodgeChance -= ToCreature()->GetCreatureExpertise() * 25;\n+            dodgeChance -= GetTotalAuraModifier(SPELL_AURA_MOD_EXPERTISE) * 25;\n+        }\n+        //end npcbot\n         else\n             dodgeChance -= GetTotalAuraModifier(SPELL_AURA_MOD_EXPERTISE) * 25;\n \n@@ -3455,6 +3694,13 @@ SpellMissInfo Unit::MeleeSpellHitResult(Unit* victim, SpellInfo const* spellInfo\n         // Reduce parry chance by attacker expertise rating\n         if (IsPlayer())\n             parryChance -= int32(ToPlayer()->GetExpertiseDodgeOrParryReduction(attType) * 100.0f);\n+        //npcbot - manual expertise instead of auras\n+        else if (IsNPCBot())\n+        {\n+            parryChance -= ToCreature()->GetCreatureExpertise() * 25;\n+            parryChance -= GetTotalAuraModifier(SPELL_AURA_MOD_EXPERTISE) * 25;\n+        }\n+        //end npcbot\n         else\n             parryChance -= GetTotalAuraModifier(SPELL_AURA_MOD_EXPERTISE) * 25;\n \n@@ -3561,6 +3807,11 @@ SpellMissInfo Unit::MagicSpellHitResult(Unit* victim, SpellInfo const* spellInfo\n     else\n         HitChance += int32(m_modSpellHitChance * 100.0f);\n \n+    //npcbot: spell hit chance bonus\n+    if (IsNPCBot())\n+        HitChance -= int32(ToCreature()->GetCreatureMissChance() * 100.f);\n+    //end npcbot\n+\n     if (HitChance < 100)\n         HitChance = 100;\n     else if (HitChance > 10000)\n@@ -3784,6 +4035,10 @@ uint32 Unit::GetDefenseSkillValue(Unit const* target) const\n         value += uint32(ToPlayer()->GetRatingBonusValue(CR_DEFENSE_SKILL));\n         return value;\n     }\n+    //npcbot - defense\n+    else if (IsNPCBot())\n+        return ToCreature()->GetCreatureDefense();\n+    //end npcbot\n     else\n         return GetUnitMeleeSkill(target);\n }\n@@ -3799,6 +4054,14 @@ float Unit::GetUnitDodgeChance() const\n         else\n         {\n             float dodge = ToCreature()->isWorldBoss() ? 5.85f : 5.0f; // Xinef: bosses should have 6.5% dodge (5.9 + 0.6 from defense skill difference)\n+            //npcbot - custom dodge chance instead of bunch of auras and remove base chance\n+            if (IsNPCBot())\n+            {\n+                if (!ToCreature()->CanDodge())\n+                    return 0.f;\n+                dodge = ToCreature()->GetCreatureDodgeChance();\n+            }\n+            //end npcbot\n             dodge += GetTotalAuraModifier(SPELL_AURA_MOD_DODGE_PERCENT);\n             return dodge > 0.0f ? dodge : 0.0f;\n         }\n@@ -3826,7 +4089,14 @@ float Unit::GetUnitParryChance() const\n         if (ToCreature()->isWorldBoss())\n             chance = 13.4f; // + 0.6 by skill diff\n         else if (GetCreatureType() == CREATURE_TYPE_HUMANOID)\n+        {\n+            //npcbot - custom parry chance instead of bunch of auras\n+            if (IsNPCBot())\n+                chance = ToCreature()->GetCreatureParryChance();\n+            else\n+            //end npcbot\n             chance = 5.0f;\n+        }\n \n         // Xinef: if aura is present, type should not matter\n         chance += GetTotalAuraModifier(SPELL_AURA_MOD_PARRY_PERCENT);\n@@ -3847,6 +4117,11 @@ float Unit::GetUnitMissChance(WeaponAttackType attType) const\n     else\n         miss_chance -= GetTotalAuraModifier(SPELL_AURA_MOD_ATTACKER_MELEE_HIT_CHANCE);\n \n+    //npcbot: defense skill bonus\n+    if (Creature const* creature = ToCreature())\n+        miss_chance += (creature->GetCreatureDefense() - GetLevel() * 5) * 0.04f;\n+    //end npcbot\n+\n     return miss_chance;\n }\n \n@@ -3870,6 +4145,10 @@ float Unit::GetUnitBlockChance() const\n         else\n         {\n             float block = 5.0f;\n+            //npcbot - custom block chance instead of bunch of auras and remove base chance\n+            if (IsNPCBot())\n+                block = ToCreature()->GetCreatureBlockChance();\n+            //end npcbot\n             block += GetTotalAuraModifier(SPELL_AURA_MOD_BLOCK_PERCENT);\n             return block > 0.0f ? block : 0.0f;\n         }\n@@ -3901,6 +4180,11 @@ float Unit::GetUnitCriticalChance(WeaponAttackType attackType, Unit const* victi\n     }\n     else\n     {\n+        //npcbot - custom crit chance instead of bunch of auras and remove base chance\n+        if (IsNPCBot())\n+            crit = ToCreature()->GetCreatureCritChance();\n+        else\n+        //end npcbot\n         crit = 5.0f;\n         crit += GetTotalAuraModifier(SPELL_AURA_MOD_WEAPON_CRIT_PERCENT);\n         crit += GetTotalAuraModifier(SPELL_AURA_MOD_CRIT_PCT);\n@@ -4244,6 +4528,11 @@ void Unit::InterruptSpell(CurrentSpellTypes spellType, bool withDelayed, bool wi\n             if (IsPlayer())\n                 ToPlayer()->SendAutoRepeatCancel(this);\n \n+        //npcbot\n+        if (IsNPCBot())\n+            BotMgr::OnBotSpellInterrupt(this, spellType);\n+        //end npcbot\n+\n         if (spell->getState() != SPELL_STATE_FINISHED)\n             spell->cancel(bySelf);\n         else\n@@ -5208,6 +5497,11 @@ void Unit::RemoveAurasDueToSpellByDispel(uint32 spellId, uint32 dispellerSpellId\n             // Call AfterDispel hook on AuraScript\n             aura->CallScriptAfterDispel(&dispelInfo);\n \n+            //npcbot: hook dispels\n+            if (dispeller->IsNPCBot())\n+                BotMgr::OnBotDispelDealt(dispeller->ToUnit(), this, dispelInfo.GetRemovedCharges());\n+            //end npcbot\n+\n             switch (aura->GetSpellInfo()->SpellFamilyName)\n             {\n                 case SPELLFAMILY_HUNTER:\n@@ -5872,7 +6166,12 @@ void Unit::GetDispellableAuraList(Unit* caster, uint32 dispelMask, DispelCharges\n     if (dispelMask & (1 << DISPEL_DISEASE) && HasAura(50536))\n         dispelMask &= ~(1 << DISPEL_DISEASE);\n \n+    //npcbot\n+    /*\n     ReputationRank rank = GetReactionTo(caster, IsCharmed());\n+    */\n+    ReputationRank rank = GetReactionTo(caster, IsCharmed() && !caster->IsNPCBotOrPet());\n+    //end npcbot\n     bool positive = rank >= REP_FRIENDLY;\n \n     // Neutral unit not at war with caster should be treated as a friendly unit\n@@ -6548,6 +6847,24 @@ GameObject* Unit::GetGameObject(uint32 spellId) const\n     return nullptr;\n }\n \n+//npcbot\n+GameObject* Unit::GetFirstGameObjectById(uint32 id) const\n+{\n+    for (GameObjectList::const_iterator i = m_gameObj.begin(); i != m_gameObj.end(); ++i)\n+        if (i->GetEntry() == id)\n+            if (GameObject* go = ObjectAccessor::GetGameObject(*this, *i))\n+                return go;\n+\n+    return nullptr;\n+}\n+\n+void Unit::SetCreator(Unit* creator)\n+{\n+    //creator is unrelated to creator guid\n+    m_creator = creator;\n+}\n+//end npcbot\n+\n void Unit::AddGameObject(GameObject* gameObj)\n {\n     if (!gameObj || gameObj->GetOwnerGUID())\n@@ -6997,6 +7314,22 @@ void Unit::setPowerType(Powers new_powertype)\n                 owner->ToPlayer()->SetGroupUpdateFlag(GROUP_UPDATE_FLAG_PET_POWER_TYPE);\n         }\n     }\n+    //npcbot\n+    else if (IsNPCBotOrPet())\n+    {\n+        if (IsNPCBot())\n+        {\n+            if (ToCreature()->GetBotGroup())\n+                BotMgr::SetBotGroupUpdateFlag(ToCreature(), GROUP_UPDATE_FLAG_POWER_TYPE);\n+        }\n+        else if (GetOwnerGUID().IsCreature())\n+        {\n+            Unit const* owner = GetOwner();\n+            if (owner && owner->IsNPCBot() && owner->ToCreature()->GetBotsPet() == this && owner->ToCreature()->GetBotGroup())\n+                BotMgr::SetBotGroupUpdateFlag(owner->ToCreature(), GROUP_UPDATE_FLAG_PET_POWER_TYPE);\n+        }\n+    }\n+    //end npcbot\n \n     float powerMultiplier = 1.0f;\n     if (!IsPet())\n@@ -7091,10 +7424,20 @@ ReputationRank Unit::GetReactionTo(Unit const* target, bool checkOriginalFaction\n                 return *repRank;\n     }\n \n+    //npcbot\n+    /*\n     if (HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED))\n     {\n         if (target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED))\n         {\n+    */\n+    if (HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) || IsNPCBotOrPet())\n+    {\n+        if (target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) || target->IsNPCBotOrPet())\n+        {\n+            if (IsInRaidWith(target))\n+                return REP_FRIENDLY;\n+    //end npcbot\n             if (selfPlayerOwner && targetPlayerOwner)\n             {\n                 // always friendly to other unit controlled by player, or to the player himself\n@@ -7205,6 +7548,16 @@ ReputationRank Unit::GetFactionReactionTo(FactionTemplateEntry const* factionTem\n         if (factionTemplateEntry->factionFlags & FACTION_TEMPLATE_FLAG_ATTACK_PVP_ACTIVE_PLAYERS\n                 && targetPlayerOwner->HasPlayerFlag(PLAYER_FLAGS_CONTESTED_PVP))\n             return REP_HOSTILE;\n+\n+        //npcbot\n+        if (target->IsNPCBotOrPet() && (factionTemplateEntry->factionFlags & FACTION_TEMPLATE_FLAG_ATTACK_PVP_ACTIVE_PLAYERS))\n+        {\n+            Unit const* bot = target->IsNPCBotPet() ? static_cast<Unit*>(targetPlayerOwner->GetBotMgr()->GetBot(target->GetOwnerGUID())) : target->ToUnit();\n+            if (bot && bot->IsNPCBot() && BotMgr::IsBotContestedPvP(bot->ToCreature()))\n+                return REP_HOSTILE;\n+        }\n+        //end npcbot\n+\n         if (ReputationRank const* repRank = targetPlayerOwner->GetReputationMgr().GetForcedRankIfAny(factionTemplateEntry))\n             return *repRank;\n         if (!target->HasUnitFlag2(UNIT_FLAG2_IGNORE_REPUTATION))\n@@ -7222,6 +7575,14 @@ ReputationRank Unit::GetFactionReactionTo(FactionTemplateEntry const* factionTem\n             }\n         }\n     }\n+    //npcbot: contested guards reaction to bots in contested PvP mode\n+    else if (target->IsNPCBotOrPet() && (factionTemplateEntry->factionFlags & FACTION_TEMPLATE_FLAG_ATTACK_PVP_ACTIVE_PLAYERS))\n+    {\n+        Unit const* bot = target->IsNPCBotPet() ? target->ToUnit()->GetCreator() : target->ToUnit();\n+        if (bot && bot->IsNPCBot() && BotMgr::IsBotContestedPvP(bot->ToCreature()))\n+            return REP_HOSTILE;\n+    }\n+    //end npcbot\n \n     // common faction based check\n     if (factionTemplateEntry->IsHostileTo(*targetFactionTemplateEntry))\n@@ -7395,6 +7756,9 @@ bool Unit::Attack(Unit* victim, bool meleeAttack)\n     //if (IsCreature())\n     //    ToCreature()->SetCombatStartPosition(GetPositionX(), GetPositionY(), GetPositionZ());\n     if (creature)\n+    //npcbot - not for npcbots either\n+    if (!creature->IsNPCBotOrPet())\n+    //end npcbot\n     {\n         EngageWithTarget(victim);\n \n@@ -7500,6 +7864,19 @@ void Unit::CombatStopWithPets(bool includingCast)\n \n     for (ControlSet::const_iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)\n         (*itr)->CombatStop(includingCast);\n+\n+    //npcbot: combatstop for bots\n+    if (GetTypeId() == TYPEID_PLAYER && ToPlayer()->HaveBot())\n+    {\n+        BotMap const* map = ToPlayer()->GetBotMgr()->GetBotMap();\n+        for (BotMap::const_iterator itr = map->begin(); itr != map->end(); ++itr)\n+        {\n+            itr->second->CombatStop(includingCast);\n+            if (Unit* botPet = itr->second->GetBotsPet())\n+                botPet->CombatStop(includingCast);\n+        }\n+    }\n+    //end npcbot\n }\n \n void Unit::EngageWithTarget(Unit* who)\n@@ -7571,6 +7948,10 @@ void Unit::RemoveAllAttackers()\n     while (!m_attackers.empty())\n     {\n         AttackerSet::iterator iter = m_attackers.begin();\n+        //npcbot\n+        if ((*iter)->IsNPCBotOrPet())\n+            BotMgr::OnBotAttackStop((*iter)->ToCreature(), this);\n+        //end npcbot\n         if (!(*iter)->AttackStop())\n         {\n             LOG_ERROR(\"entities.unit\", \"WORLD: Unit has an attacker that isn't attacking it!\");\n@@ -7704,11 +8085,23 @@ Player* Unit::GetCharmerOrOwnerPlayerOrPlayerItself() const\n     if (guid.IsPlayer())\n         return ObjectAccessor::GetPlayer(*this, guid);\n \n+    //npcbot\n+    if (GetTypeId() == TYPEID_UNIT && ToCreature()->IsNPCBotOrPet())\n+        if (Unit* creator = ToUnit()->GetCreator())\n+            return creator->ToPlayer();\n+    //end npcbot\n+\n     return const_cast<Unit*>(this)->ToPlayer();\n }\n \n Player* Unit::GetAffectingPlayer() const\n {\n+    //npcbot: affecting player is creator\n+    if (IsNPCBotOrPet())\n+        if (Unit* creator = GetCreator())\n+            return creator->ToPlayer();\n+    //end npcbot\n+\n     if (!GetCharmerOrOwnerGUID())\n         return const_cast<Unit*>(this)->ToPlayer();\n \n@@ -8078,6 +8471,15 @@ int32 Unit::DealHeal(Unit* healer, Unit* victim, uint32 addhealth)\n         //player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEAL_CASTED, addhealth); // pussywizard: optimization\n     }\n \n+    //npcbot\n+    if (unit->IsNPCBot())\n+    {\n+        Creature const* bot = unit->ToCreature();\n+        if (Battleground* bg = bot->GetBotBG())\n+            bg->UpdateBotScore(bot, SCORE_HEALING_DONE, gain);\n+    }\n+    //end npcbot\n+\n     /*if (Player* player = victim->ToPlayer())\n     {\n         //player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_TOTAL_HEALING_RECEIVED, gain); // pussywizard: optimization\n@@ -8218,13 +8620,23 @@ Unit* Unit::GetNextRandomRaidMemberOrPet(float radius)\n     else if (IsCreature() && IsPet())\n         player = GetOwner()->ToPlayer();\n \n+    //npcbot\n+    /*\n+    //end npcbot\n     if (!player)\n         return nullptr;\n     Group* group = player->GetGroup();\n+    //npcbot\n+    */\n+    Group* group = player ? player->GetGroup() : IsNPCBot() ? ToCreature()->GetBotGroup() : nullptr;\n+    //end npcbot\n     // When there is no group check pet presence\n     if (!group)\n     {\n         // We are pet now, return owner\n+        //npcbot\n+        if (player)\n+        //end npcbot\n         if (player != this)\n             return IsWithinDistInMap(player, radius) ? player : nullptr;\n         Unit* pet = GetGuardianPet();\n@@ -8255,6 +8667,17 @@ Unit* Unit::GetNextRandomRaidMemberOrPet(float radius)\n                     nearMembers.push_back(pet);\n         }\n \n+    //npcbot\n+    for (GroupBotReference* itr = group->GetFirstBotMember(); itr != nullptr; itr = itr->next())\n+    {\n+        if (Creature* bot = itr->GetSource())\n+        {\n+            if (bot != this && bot->IsAlive() && IsWithinDistInMap(bot, radius) && !IsHostileTo(bot))\n+                nearMembers.push_back(bot);\n+        }\n+    }\n+    //end npcbot\n+\n     if (nearMembers.empty())\n         return nullptr;\n \n@@ -8732,6 +9155,11 @@ uint32 Unit::SpellDamageBonusDone(Unit* victim, SpellInfo const* spellProto, uin\n     float DoneTotalMod = TotalMod ? TotalMod : SpellPctDamageModsDone(victim, spellProto, damagetype);\n \n     // Config : RATE_CREATURE_X_SPELLDAMAGE & Do Not Modify Pet/Guardian/Mind Controlled Damage\n+    //npcbot: do not affect bots\n+    if (IsNPCBotOrPet())\n+    { /*do nothing*/ }\n+    else\n+    //end npcbot\n     if (IsCreature() && (!ToCreature()->IsPet() || !ToCreature()->IsGuardian() || !ToCreature()->IsControlledByPlayer()))\n         DoneTotalMod *= ToCreature()->GetSpellDamageMod(ToCreature()->GetCreatureTemplate()->rank);\n \n@@ -8883,6 +9311,11 @@ uint32 Unit::SpellDamageBonusTaken(Unit* caster, SpellInfo const* spellProto, ui\n \n     TakenTotalMod = processDummyAuras(TakenTotalMod);\n \n+    //npcbot - damage taken modifier\n+    if (IsNPCBot())\n+        TakenTotalMod *= BotMgr::GetBotDamageTakenMod(ToCreature(), true);\n+    //end npcbot\n+\n     // From caster spells\n     if (caster)\n     {\n@@ -9023,6 +9456,11 @@ int32 Unit::SpellBaseDamageBonusDone(SpellSchoolMask schoolMask)\n                 aurEff->GetSpellInfo()->EquippedItemInventoryTypeMask == 0;\n     });\n \n+    //npcbot: apply bot spellpower\n+    if ((schoolMask & SPELL_SCHOOL_MASK_MAGIC) && IsNPCBot())\n+        DoneAdvertisedBenefit += ToCreature()->GetCreatureSpellPower();\n+    //end npcbot\n+\n     if (IsPlayer())\n     {\n         // Base value\n@@ -9061,6 +9499,9 @@ float Unit::SpellDoneCritChance(Unit const* /*victim*/, SpellInfo const* spellPr\n {\n     // Mobs can't crit with spells.\n     if (IsCreature() && !GetSpellModOwner())\n+        //npcbot - allow bots to crit\n+        if (!IsNPCBotOrPet())\n+        //end npcbot\n         return -100.0f;\n \n     // not critting spell\n@@ -9351,6 +9792,11 @@ float Unit::SpellTakenCritChance(Unit const* caster, SpellInfo const* spellProto\n     if (!spellProto->IsPositive())\n         crit_chance += GetTotalAuraModifier(SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE);\n \n+    //npcbot - apply bot spell crit mods\n+    if (caster && caster->IsNPCBot())\n+        caster->ToCreature()->ApplyBotCritMultiplierAll(this, crit_chance, spellProto, schoolMask, attackType);\n+    //end npcbot\n+\n     // xinef: can be negative!\n     return crit_chance;\n }\n@@ -9636,6 +10082,11 @@ uint32 Unit::SpellHealingBonusDone(Unit* victim, SpellInfo const* spellProto, ui\n     if (Player* modOwner = GetSpellModOwner())\n         modOwner->ApplySpellMod(spellProto->Id, damagetype == DOT ? SPELLMOD_DOT : SPELLMOD_DAMAGE, heal);\n \n+    //npcbot - healing bonus done for bots\n+    if (IsNPCBot())\n+        ToCreature()->ApplyBotDamageMultiplierHeal(victim, heal, spellProto, damagetype, stack);\n+    //end npcbot\n+\n     return uint32(std::max(heal, 0.0f));\n }\n \n@@ -9778,6 +10229,11 @@ int32 Unit::SpellBaseHealingBonusDone(SpellSchoolMask schoolMask)\n         return !aurEff->GetMiscValue() || (aurEff->GetMiscValue() & schoolMask) != 0;\n     });\n \n+    //npcbot: apply bot spellpower to healing\n+    if (IsNPCBot())\n+        AdvertisedBenefit += ToCreature()->GetCreatureSpellPower();\n+    //end npcbot\n+\n     // Healing bonus of spirit, intellect and strength\n     if (IsPlayer())\n     {\n@@ -9983,6 +10439,9 @@ bool Unit::IsImmunedToAuraPeriodicTick(Unit const* caster, SpellInfo const* spel\n }\n \n bool Unit::IsImmunedToSpell(SpellInfo const* spellInfo, Spell const* spell)\n+//npcbot\n+const\n+//end npcbot\n {\n     if (!spellInfo)\n         return false;\n@@ -10349,6 +10808,11 @@ uint32 Unit::MeleeDamageBonusTaken(Unit* attacker, uint32 pdamage, WeaponAttackT\n \n     TakenTotalMod *= GetTotalAuraMultiplierByMiscMask(SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, damageSchoolMask);\n \n+    //npcbot - damage taken modifier\n+    if (IsNPCBot())\n+        TakenTotalMod *= BotMgr::GetBotDamageTakenMod(ToCreature(), false);\n+    //end npcbot\n+\n     // .. taken pct (special attacks)\n     if (spellProto)\n     {\n@@ -10486,6 +10950,25 @@ void Unit::Mount(uint32 mount, uint32 VehicleId, uint32 creatureEntry)\n \n     SetUnitFlag(UNIT_FLAG_MOUNT);\n \n+    //npcbot\n+    if (IsNPCBot())\n+    {\n+        if (VehicleId)\n+        {\n+            LOG_ERROR(\"scripts\", \"NPCBot::Mount mounting {}, vehicle {} ({})\", mount, VehicleId, creatureEntry);\n+            if (CreateVehicleKit(VehicleId, creatureEntry))\n+            {\n+                // Send others that we now have a vehicle\n+                WorldPacket data(SMSG_PLAYER_VEHICLE_DATA, GetPackGUID().size()+4);\n+                data << GetPackGUID();\n+                data << uint32(VehicleId);\n+                SendMessageToSet(&data, true);\n+                GetVehicleKit()->InstallAllAccessories(false);\n+            }\n+        }\n+    }\n+    else\n+    //end npcbot\n     if (Player* player = ToPlayer())\n     {\n         sScriptMgr->AnticheatSetUnderACKmount(player);\n@@ -10562,6 +11045,19 @@ void Unit::Dismount()\n     SendMessageToSet(&data, true);\n \n     // dismount as a vehicle\n+    //npcbot\n+    if (IsNPCBot() && GetVehicleKit())\n+    {\n+        //TC_LOG_ERROR(\"scripts\", \"NPCBot::Dismount dismounting vehicle %u (base %u, cre %u)\",\n+        //    GetVehicleKit()->GetVehicleInfo()->m_ID, GetVehicleKit()->GetBase()->GetEntry(), GetVehicleKit()->GetCreatureEntry());\n+        data.Initialize(SMSG_PLAYER_VEHICLE_DATA, 8 + 4);\n+        data << GetPackGUID();\n+        data << uint32(0);\n+        SendMessageToSetInRange(&data, GetVisibilityRange(), /*not used*/true);\n+        RemoveVehicleKit();\n+    }\n+    else\n+    //end npcbot\n     if (IsPlayer() && GetVehicleKit())\n     {\n         // Send other players that we are no longer a vehicle\n@@ -10610,6 +11106,14 @@ void Unit::SetImmuneToPC(bool apply, bool keepCombat)\n                     toEnd.push_back(pair.second);\n             for (auto const& pair : m_combatManager.GetPvPCombatRefs())\n                 toEnd.push_back(pair.second);\n+            //npcbot\n+            for (auto const& pair : m_combatManager.GetPvECombatRefs())\n+                if (pair.second->GetOther(this)->IsNPCBotOrPet())\n+                    toEnd.push_back(pair.second);\n+            for (auto const& pair : m_combatManager.GetPvPCombatRefs())\n+                if (pair.second->GetOther(this)->IsNPCBotOrPet())\n+                    toEnd.push_back(pair.second);\n+            //end npcbot\n             for (CombatReference* ref : toEnd)\n                 ref->EndCombat();\n         }\n@@ -10629,6 +11133,9 @@ void Unit::SetImmuneToNPC(bool apply, bool keepCombat)\n             for (auto const& pair : m_combatManager.GetPvECombatRefs())\n                 if (!pair.second->GetOther(this)->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED))\n                     toEnd.push_back(pair.second);\n+            //npcbot\n+            std::erase_if(toEnd, [this](CombatReference const* cref) { return cref->GetOther(this)->IsNPCBotOrPet(); });\n+            //end npcbot\n             for (CombatReference* ref : toEnd)\n                 ref->EndCombat();\n         }\n@@ -10724,6 +11231,11 @@ bool Unit::_IsValidAttackTarget(Unit const* target, SpellInfo const* bySpell, Wo\n             || (target->IsPlayer() && target->ToPlayer()->IsGameMaster()))\n         return false;\n \n+    //npcbot: can't attack unit if controlled by a GM (bots, pets, possible others)\n+    if (target->IsControlledByPlayer() && target->GetFaction() == 35)\n+        return false;\n+    //end npcbot\n+\n     // can't attack own vehicle or passenger\n     if (m_vehicle)\n         if (IsOnVehicle(target) || m_vehicle->GetBase()->IsOnVehicle(target))\n@@ -10750,6 +11262,9 @@ bool Unit::_IsValidAttackTarget(Unit const* target, SpellInfo const* bySpell, Wo\n             return false;\n     }\n     // check flags\n+    //npcbot: rewrite all that\n+    /*\n+    //end npcbot\n     if (target->HasUnitFlag(UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_TAXI_FLIGHT | UNIT_FLAG_NOT_ATTACKABLE_1 | UNIT_FLAG_NON_ATTACKABLE_2)\n             || (!HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && target->IsImmuneToNPC())\n             || (!target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && IsImmuneToNPC())\n@@ -10757,7 +11272,69 @@ bool Unit::_IsValidAttackTarget(Unit const* target, SpellInfo const* bySpell, Wo\n             // check if this is a world trigger cast - GOs are using world triggers to cast their spells, so we need to ignore their immunity flag here, this is a temp workaround, needs removal when go cast is implemented properly\n             || ((GetEntry() != WORLD_TRIGGER && (!obj || !obj->isType(TYPEMASK_GAMEOBJECT | TYPEMASK_DYNAMICOBJECT))) && target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && IsImmuneToPC()))\n         return false;\n+    //npcbot\n+    */\n+    if (target->HasUnitFlag(UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_TAXI_FLIGHT | UNIT_FLAG_NOT_ATTACKABLE_1 | UNIT_FLAG_NON_ATTACKABLE_2))\n+        return false;\n \n+    // not checked in AC for some reason - not changing\n+    //if (!(bySpell && bySpell->IsPositive() && bySpell->HasAttribute(SPELL_ATTR6_CAN_ASSIST_IMMUNE_PC)))\n+    {\n+        if (!HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && !IsNPCBotOrPet() && target->IsImmuneToNPC())\n+            return false;\n+\n+        if (!target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && !target->IsNPCBotOrPet() && IsImmuneToNPC())\n+            return false;\n+\n+        if ((HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) || IsNPCBotOrPet()) && target->IsImmuneToPC())\n+            return false;\n+\n+        if ((target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) || target->IsNPCBotOrPet()) && IsImmuneToPC() &&\n+            GetEntry() != WORLD_TRIGGER && (!obj || !obj->isType(TYPEMASK_GAMEOBJECT | TYPEMASK_DYNAMICOBJECT)))\n+            return false;\n+    }\n+    //end npcbot\n+\n+    //npcbot: CvB, BvC case\n+    if (((IsNPCBotOrPet() && ToCreature()->IsFreeBot()) || (target->IsNPCBotOrPet() && target->ToCreature()->IsFreeBot())) &&\n+        !IsFriendlyTo(target) && !target->IsFriendlyTo(this))\n+    {\n+        if (target->IsNPCBotOrPet() && IsContestedGuard())\n+        {\n+            if (Unit const* bot = target->IsNPCBotPet() ? target->GetCreator() : target)\n+            {\n+                if (BotMgr::IsBotContestedPvP(bot->ToCreature()))\n+                    return true;\n+            }\n+        }\n+        else if (IsNPCBotOrPet() && target->IsContestedGuard())\n+        {\n+            if (Unit const* bot = IsNPCBotPet() ? GetCreator() : this)\n+            {\n+                if (BotMgr::IsBotContestedPvP(bot->ToCreature()))\n+                    return true;\n+            }\n+        }\n+\n+        auto const* ft1 = sFactionTemplateStore.LookupEntry(GetFaction());\n+        auto const* ft2 = sFactionTemplateStore.LookupEntry(target->GetFaction());\n+        auto const* fe1 = ft1 ? sFactionStore.LookupEntry(ft1->faction) : nullptr;\n+        auto const* fe2 = ft2 ? sFactionStore.LookupEntry(ft2->faction) : nullptr;\n+        if ((IsNPCBotOrPet() && fe2 && fe2->CanHaveReputation() && ReputationMgr::ReputationToRank(BotDataMgr::GetBotBaseReputation(ToCreature(), fe2)) >= REP_NEUTRAL) ||\n+            (target->IsNPCBotOrPet() && fe1 && fe1->CanHaveReputation() && ReputationMgr::ReputationToRank(BotDataMgr::GetBotBaseReputation(target->ToCreature(), fe1)) >= REP_NEUTRAL))\n+            return false;\n+    }\n+    //end npcbot\n+\n+    //npcbot: allow bots and their summons to ignore this rule\n+    if (IsNPCBotOrPet() || target->IsNPCBotOrPet())\n+    {}\n+    else if (GetOwnerGUID() && GetOwnerGUID().IsCreature() && sObjectMgr->GetCreatureTemplate(GetOwnerGUID().GetEntry())->IsNPCBotOrPet())\n+    {}\n+    else if (target->GetOwnerGUID() && target->GetOwnerGUID().IsCreature() && sObjectMgr->GetCreatureTemplate(target->GetOwnerGUID().GetEntry())->IsNPCBotOrPet())\n+    {}\n+    else\n+    //end npcbot\n     // CvC case - can attack each other only when one of them is hostile\n     if (!HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && !target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED))\n         return GetReactionTo(target) <= REP_HOSTILE || target->GetReactionTo(this) <= REP_HOSTILE;\n@@ -10816,6 +11393,13 @@ bool Unit::_IsValidAttackTarget(Unit const* target, SpellInfo const* bySpell, Wo\n     Player const* playerAffectingAttacker = HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) ? GetAffectingPlayer() : nullptr;\n     Player const* playerAffectingTarget = target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) ? target->GetAffectingPlayer() : nullptr;\n \n+    //npcbot: get affectingplayers for bots\n+    if (!playerAffectingAttacker && IsNPCBotOrPet())\n+        playerAffectingAttacker = GetAffectingPlayer();\n+    if (!playerAffectingTarget && target->IsNPCBotOrPet())\n+        playerAffectingTarget = target->GetAffectingPlayer();\n+    //end npcbot\n+\n     // check duel - before sanctuary checks\n     if (playerAffectingAttacker && playerAffectingTarget)\n         if (playerAffectingAttacker->duel && playerAffectingAttacker->duel->Opponent == playerAffectingTarget && playerAffectingAttacker->duel->State == DUEL_STATE_IN_PROGRESS)\n@@ -10826,6 +11410,13 @@ bool Unit::_IsValidAttackTarget(Unit const* target, SpellInfo const* bySpell, Wo\n     if (target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && (target->IsInSanctuary() || IsInSanctuary()))\n         return false;\n \n+    //npcbot: BvP, PvB, BvB sanctuary case\n+    if ((target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) || target->IsNPCBotOrPet()) &&\n+        (HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) || IsNPCBotOrPet()) &&\n+        (target->IsInSanctuary() || IsInSanctuary()))\n+        return false;\n+    //end npcbot\n+\n     // additional checks - only PvP case\n     if (playerAffectingAttacker && playerAffectingTarget)\n     {\n@@ -10840,6 +11431,22 @@ bool Unit::_IsValidAttackTarget(Unit const* target, SpellInfo const* bySpell, Wo\n \n         return HasByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_UNK1) || target->HasByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_UNK1);\n     }\n+    //npcbot: BvP checks\n+    else if (playerAffectingTarget && !playerAffectingAttacker && IsNPCBotOrPet())\n+    {\n+        if (Unit const* bot = IsNPCBotPet() ? GetCreator() : this)\n+        {\n+            if (target->IsPvP())\n+                return true;\n+\n+            if (bot->IsFFAPvP() && target->IsFFAPvP())\n+                return true;\n+\n+            return bot->HasByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_UNK1) || target->HasByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_UNK1);\n+        }\n+    }\n+    //end npcbot\n+\n     return true;\n }\n \n@@ -10891,6 +11498,13 @@ bool Unit::_IsValidAssistTarget(Unit const* target, SpellInfo const* bySpell) co\n             if (target->IsImmuneToPC())\n                 return false;\n         }\n+        //npcbot\n+        else if (IsNPCBotOrPet())\n+        {\n+            if (target->IsImmuneToPC())\n+                return false;\n+        }\n+        //end npcbot\n         else\n         {\n             if (target->IsImmuneToNPC())\n@@ -10937,6 +11551,21 @@ bool Unit::_IsValidAssistTarget(Unit const* target, SpellInfo const* bySpell) co\n         if (Creature const* creatureTarget = target->ToCreature())\n             return creatureTarget->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT || creatureTarget->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_CAN_ASSIST;\n     }\n+\n+    //npcbot: PvP (BvB) case\n+    if (IsNPCBotOrPet() && target->IsNPCBotOrPet())\n+    {\n+        Player const* selfPlayerOwner = GetAffectingPlayer();\n+        Player const* targetPlayerOwner = target->GetAffectingPlayer();\n+        if (selfPlayerOwner && targetPlayerOwner && selfPlayerOwner != targetPlayerOwner && targetPlayerOwner->duel)\n+            return false;\n+        if (target->IsFFAPvP() && !IsFFAPvP())\n+            return false;\n+        if (target->IsPvP() && IsInSanctuary() && !target->IsInSanctuary())\n+            return false;\n+    }\n+    //end npcbot\n+\n     return true;\n }\n \n@@ -11051,6 +11680,11 @@ bool Unit::IsAlwaysVisibleFor(WorldObject const* seer) const\n                 if (ownerPlayer->IsGroupVisibleFor(seerPlayer))\n                     return true;\n \n+    //npcbot - bots are always visible for owner\n+    if (GetCreator() && (seer->GetGUID() == GetCreator()->GetGUID() || (seer->IsCreature() && seer->ToCreature()->GetCreator() == GetCreator())))\n+        return true;\n+    //end npcbot\n+\n     return false;\n }\n \n@@ -11237,7 +11871,10 @@ void Unit::UpdateSpeed(UnitMoveType mtype, bool forced)\n         && !IsPet()\n         && !(IsControlledByPlayer() && IsVehicle())\n         && !(creature->HasMechanicTemplateImmunity(UI64LIT(1) << MECHANIC_SNARE))\n-        && !(creature->IsDungeonBoss()))\n+        && !(creature->IsDungeonBoss())\n+        //npcbots: prevent slowing due to health percentage\n+        && !creature->IsNPCBot())\n+        //end npcbot\n     {\n         // 1.6% for each % under 30.\n         // use min(0, health-30) so that we don't boost mobs above 30.\n@@ -11408,6 +12045,11 @@ bool Unit::CanHaveThreatList(bool skipAliveCheck) const\n     if (ToCreature()->IsVehicle() && GetMap()->IsBattlegroundOrArena())\n         return false;\n \n+    //npcbots: npcbots and their pets cannot have threatlist\n+    if (IsNPCBotOrPet())\n+        return false;\n+    //end npcbot\n+\n     return true;\n }\n \n@@ -11554,6 +12196,10 @@ float Unit::ApplyEffectModifiers(SpellInfo const* spellProto, uint8 effect_index\n                 break;\n         }\n     }\n+    //npcbot: handle effect mods\n+    if (IsNPCBot())\n+        ToCreature()->ApplyCreatureEffectMods(spellProto, effect_index, value);\n+    //end npcbot\n     return value;\n }\n \n@@ -11567,6 +12213,24 @@ int32 Unit::CalcSpellDuration(SpellInfo const* spellProto)\n {\n     uint8 comboPoints = GetComboPoints();\n \n+    //npcbot\n+    if (IsNPCBot())\n+        comboPoints = ToCreature()->GetCreatureComboPoints();\n+    else\n+    //npcbot: combo points support for spell duration (vehicle)\n+    if (ToCreature() && ToCreature()->IsVehicle() && ToCreature()->GetCharmerGUID().IsCreature() &&\n+        spellProto->GetDuration() != spellProto->GetMaxDuration())\n+    {\n+        Unit const* bot = ToCreature()->GetCharmer();\n+        if (bot && bot->IsNPCBot())\n+        {\n+            comboPoints = bot->ToCreature()->GetCreatureComboPoints();\n+            //TC_LOG_ERROR(\"scripts\", \"CalcSpellDuration bot %s veh spell %u cp %u\",\n+            //    bot->GetName().c_str(), spellProto->Id, uint32(comboPoints));\n+        }\n+    }\n+    //end npcbot\n+\n     int32 minduration = spellProto->GetDuration();\n     int32 maxduration = spellProto->GetMaxDuration();\n \n@@ -11692,6 +12356,10 @@ void Unit::ModSpellCastTime(SpellInfo const* spellInfo, int32& castTime, Spell*\n     if (Player* modOwner = GetSpellModOwner())\n         /// @todo:(MadAgos) Eventually check and delete the bool argument\n         modOwner->ApplySpellMod(spellInfo->Id, SPELLMOD_CASTING_TIME, castTime, spell, bool(modOwner != this && !IsPet()));\n+    //npcbot - apply bot spell cast time mods\n+    if (castTime > 0 && IsNPCBot())\n+        ToCreature()->ApplyCreatureSpellCastTimeMods(spellInfo, castTime);\n+    //end npcbot\n \n     switch (spellInfo->DmgClass)\n     {\n@@ -11774,6 +12442,11 @@ float Unit::ApplyDiminishingToDuration(DiminishingGroup group, int32& duration,\n                 || target->ToCreature()->HasFlagsExtra(CREATURE_FLAG_EXTRA_ALL_DIMINISH))\n                 && source->IsPlayer())\n             duration = limitduration;\n+\n+        //npcbot: limit duration if casted by npcbots\n+        if (target->GetTypeId() == TYPEID_PLAYER && source->IsNPCBotOrPet())\n+            duration = limitduration;\n+        //end npcbots\n     }\n \n     float mod = 1.0f;\n@@ -11905,6 +12578,17 @@ uint32 Unit::GetCreatureType() const\n         else\n             return CREATURE_TYPE_HUMANOID;\n     }\n+    //npcbot: support for druid's shapeshifting\n+    else if (IsNPCBot())\n+    {\n+        ShapeshiftForm form = GetShapeshiftForm();\n+        SpellShapeshiftFormEntry const* ssEntry = sSpellShapeshiftFormStore.LookupEntry(form);\n+        if (ssEntry && ssEntry->creatureType > 0)\n+            return ssEntry->creatureType;\n+        else\n+            return CREATURE_TYPE_HUMANOID;\n+    }\n+    //end npcbot\n     else\n         return ToCreature()->GetCreatureTemplate()->type;\n }\n@@ -12308,6 +12992,13 @@ void Unit::SetLevel(uint8 lvl, bool showLevelChange)\n     // group update\n     if (IsPlayer() && ToPlayer()->GetGroup())\n         ToPlayer()->SetGroupUpdateFlag(GROUP_UPDATE_FLAG_LEVEL);\n+    //npcbot\n+    else if (IsNPCBot())\n+    {\n+        if (ToCreature()->GetBotGroup())\n+            BotMgr::SetBotGroupUpdateFlag(ToCreature(), GROUP_UPDATE_FLAG_LEVEL);\n+    }\n+    //end npcbot\n \n     if (IsPlayer())\n     {\n@@ -12363,6 +13054,22 @@ void Unit::SetHealth(uint32 val)\n                 }\n         }\n     }\n+    //npcbot\n+    else if (IsNPCBotOrPet())\n+    {\n+        if (IsNPCBot())\n+        {\n+            if (ToCreature()->GetBotGroup())\n+                BotMgr::SetBotGroupUpdateFlag(ToCreature(), GROUP_UPDATE_FLAG_CUR_HP);\n+        }\n+        else\n+        {\n+            Unit const* owner = GetOwner();\n+            if (owner && owner->IsNPCBot() && owner->ToCreature()->GetBotsPet() == this && owner->ToCreature()->GetBotGroup())\n+                BotMgr::SetBotGroupUpdateFlag(owner->ToCreature(), GROUP_UPDATE_FLAG_PET_CUR_HP);\n+        }\n+    }\n+    //end npcbot\n }\n \n void Unit::SetMaxHealth(uint32 val)\n@@ -12398,6 +13105,22 @@ void Unit::SetMaxHealth(uint32 val)\n                 }\n         }\n     }\n+    //npcbot\n+    else if (IsNPCBotOrPet())\n+    {\n+        if (IsNPCBot())\n+        {\n+            if (ToCreature()->GetBotGroup())\n+                BotMgr::SetBotGroupUpdateFlag(ToCreature(), GROUP_UPDATE_FLAG_MAX_HP);\n+        }\n+        else\n+        {\n+            Unit const* owner = GetOwner();\n+            if (owner && owner->IsNPCBot() && owner->ToCreature()->GetBotsPet() == this && owner->ToCreature()->GetBotGroup())\n+                BotMgr::SetBotGroupUpdateFlag(owner->ToCreature(), GROUP_UPDATE_FLAG_PET_MAX_HP);\n+        }\n+    }\n+    //end npcbot\n \n     if (val < health)\n         SetHealth(val);\n@@ -12452,6 +13175,22 @@ void Unit::SetPower(Powers power, uint32 val, bool withPowerUpdate /*= true*/, b\n         if (pet->getPetType() == HUNTER_PET && power == POWER_HAPPINESS)\n             pet->UpdateDamagePhysical(BASE_ATTACK);\n     }\n+    //npcbot\n+    else if (IsNPCBotOrPet())\n+    {\n+        if (IsNPCBot())\n+        {\n+            if (ToCreature()->GetBotGroup())\n+                BotMgr::SetBotGroupUpdateFlag(ToCreature(), GROUP_UPDATE_FLAG_CUR_POWER);\n+        }\n+        else\n+        {\n+            Unit const* owner = GetOwner();\n+            if (owner && owner->IsNPCBot() && owner->ToCreature()->GetBotsPet() == this && owner->ToCreature()->GetBotGroup())\n+                BotMgr::SetBotGroupUpdateFlag(owner->ToCreature(), GROUP_UPDATE_FLAG_PET_CUR_POWER);\n+        }\n+    }\n+    //end npcbot\n }\n \n void Unit::SetMaxPower(Powers power, uint32 val)\n@@ -12478,6 +13217,22 @@ void Unit::SetMaxPower(Powers power, uint32 val)\n                 owner->ToPlayer()->SetGroupUpdateFlag(GROUP_UPDATE_FLAG_PET_MAX_POWER);\n         }\n     }\n+    //npcbot\n+    else if (IsNPCBotOrPet())\n+    {\n+        if (IsNPCBot())\n+        {\n+            if (ToCreature()->GetBotGroup())\n+                BotMgr::SetBotGroupUpdateFlag(ToCreature(), GROUP_UPDATE_FLAG_MAX_POWER);\n+        }\n+        else\n+        {\n+            Unit const* owner = GetOwner();\n+            if (owner && owner->IsNPCBot() && owner->ToCreature()->GetBotsPet() == this && owner->ToCreature()->GetBotGroup())\n+                BotMgr::SetBotGroupUpdateFlag(owner->ToCreature(), GROUP_UPDATE_FLAG_PET_MAX_POWER);\n+        }\n+    }\n+    //end npcbot\n \n     if (val < cur_power)\n         SetPower(power, val);\n@@ -12746,6 +13501,9 @@ void Unit::ProcSkillsAndReactives(bool isVictim, Unit* target, uint32 procFlag,\n         // Update skills here for players\n         // only when you are not fighting other players or their pets/totems (pvp)\n         if (IsPlayer() && !target->IsCharmedOwnedByPlayerOrPlayer())\n+        //npcbot\n+        if (!target->IsNPCBotOrPet())\n+        //end npcbot\n         {\n             // On melee based hit/miss/resist/parry/dodge need to update skill (for victim and attacker)\n             if (procExtra & (PROC_EX_NORMAL_HIT | PROC_EX_MISS | PROC_EX_RESIST | PROC_EX_PARRY | PROC_EX_DODGE))\n@@ -12795,6 +13553,13 @@ void Unit::ProcSkillsAndReactives(bool isVictim, Unit* target, uint32 procFlag,\n                     ModifyAuraState(AURA_STATE_DEFENSE, true);\n                     StartReactiveTimer(REACTIVE_DEFENSE);\n                 }\n+                //npcbot - update reactives for bots (victim)\n+                if ((procExtra & PROC_HIT_PARRY) && IsNPCBot() && ToCreature()->GetBotClass() == CLASS_HUNTER)\n+                {\n+                    ModifyAuraState(AURA_STATE_HUNTER_PARRY, true);\n+                    StartReactiveTimer(REACTIVE_HUNTER_PARRY);\n+                }\n+                //end npcbot\n             }\n             else // For attacker\n             {\n@@ -12814,6 +13579,15 @@ void Unit::ProcSkillsAndReactives(bool isVictim, Unit* target, uint32 procFlag,\n                     AddComboPoints(target, 1);\n                     StartReactiveTimer(REACTIVE_WOLVERINE_BITE);\n                 }\n+\n+                //npcbot - update reactives for bots (attacker)\n+                if ((procExtra & (PROC_HIT_DODGE | PROC_HIT_PARRY)) && IsNPCBot() && ToCreature()->GetBotClass() == CLASS_WARRIOR)\n+                {\n+                    AddComboPoints(target, 1);\n+                    StartReactiveTimer(REACTIVE_OVERPOWER);\n+                }\n+                //TODO REACTIVE_WOLVERINE_BITE for bot hunter pets\n+                //end npcbot\n             }\n         }\n     }\n@@ -13266,6 +14040,13 @@ void Unit::SendComboPoints()\n     {\n         owner = ObjectAccessor::GetPlayer(*this, ownerGuid);\n     }\n+    //npcbot\n+    else if (IsNPCBotOrPet())\n+    {\n+        if (Unit* creator = ToUnit()->GetCreator())\n+            owner = creator->ToPlayer();\n+    }\n+    //end npcbot\n \n     if (m_movedByPlayer || owner)\n     {\n@@ -13290,6 +14071,32 @@ void Unit::ClearComboPointHolders()\n     }\n }\n \n+//npcbot\n+void Unit::ClearReactive(ReactiveType reactive)\n+{\n+    m_reactiveTimer[reactive] = 0;\n+\n+    switch (reactive)\n+    {\n+        case REACTIVE_DEFENSE:\n+            if (HasAuraState(AURA_STATE_DEFENSE))\n+                ModifyAuraState(AURA_STATE_DEFENSE, false);\n+            break;\n+        case REACTIVE_HUNTER_PARRY:\n+            if (GetClass() == CLASS_HUNTER && HasAuraState(AURA_STATE_HUNTER_PARRY))\n+                ModifyAuraState(AURA_STATE_HUNTER_PARRY, false);\n+            break;\n+        case REACTIVE_OVERPOWER:\n+            if (GetClass() == CLASS_WARRIOR)\n+                ClearComboPoints();\n+            break;\n+        default:\n+            break;\n+        //TODO WOLVERINE_BITE clear\n+    }\n+}\n+//end npcbot\n+\n void Unit::ClearAllReactives()\n {\n     for (uint8 i = 0; i < MAX_REACTIVE; ++i)\n@@ -13457,6 +14264,9 @@ uint32 Unit::GetCastingTimeForBonus(SpellInfo const* spellProto, DamageEffectTyp\n {\n     // Not apply this to creature casted spells with casttime == 0\n     if (CastingTime == 0 && IsCreature() && !IsPet())\n+        //npcbot - skip bots\n+        if (!IsNPCBotOrPet())\n+        //end npcbot\n         return 3500;\n \n     if (CastingTime > 7000) CastingTime = 7000;\n@@ -13569,6 +14379,28 @@ void Unit::UpdateAuraForGroup(uint8 slot)\n             }\n         }\n     }\n+    //npcbot\n+    else if (IsNPCBotOrPet())\n+    {\n+        if (IsNPCBot())\n+        {\n+            if (ToCreature()->GetBotGroup())\n+            {\n+                BotMgr::SetBotGroupUpdateFlag(ToCreature(), GROUP_UPDATE_FLAG_AURAS);\n+                BotMgr::SetBotAuraUpdateMaskForRaid(ToCreature(), slot);\n+            }\n+        }\n+        else\n+        {\n+            Unit const* owner = GetOwner();\n+            if (owner && owner->IsNPCBot() && owner->ToCreature()->GetBotsPet() == this && owner->ToCreature()->GetBotGroup())\n+            {\n+                BotMgr::SetBotGroupUpdateFlag(owner->ToCreature(), GROUP_UPDATE_FLAG_PET_AURAS);\n+                BotMgr::SetBotPetAuraUpdateMaskForRaid(ToCreature(), slot);\n+            }\n+        }\n+    }\n+    //end npcbot\n }\n \n float Unit::CalculateDefaultCoefficient(SpellInfo const* spellInfo, DamageEffectType damagetype) const\n@@ -13951,6 +14783,11 @@ void Unit::Kill(Unit* killer, Unit* victim, bool durabilityLoss, WeaponAttackTyp\n     Player* player = killer ? killer->GetCharmerOrOwnerPlayerOrPlayerItself() : nullptr;\n     Creature* creature = victim->ToCreature();\n \n+    //npcbot - loot recipient of bot's vehicle is owner\n+    if (!player && killer && killer->IsVehicle() && killer->GetCharmerGUID().IsCreature() && killer->GetCreator() && killer->GetCreator()->IsPlayer())\n+        player = killer->GetCreator()->ToPlayer();\n+    //end npcbot\n+\n     bool isRewardAllowed = true;\n     if (creature)\n     {\n@@ -14035,6 +14872,11 @@ void Unit::Kill(Unit* killer, Unit* victim, bool durabilityLoss, WeaponAttackTyp\n             if (creature->GetLootMode())\n                 loot->generateMoneyLoot(creature->GetCreatureTemplate()->mingold, creature->GetCreatureTemplate()->maxgold);\n \n+            //npcbot: spawn wandering bot kill reward\n+            if (creature->IsNPCBot() && creature->IsWandererBot())\n+                BotMgr::OnBotWandererKilled(creature, looter);\n+            //end npcbot\n+\n             if (group)\n             {\n                 if (hasLooterGuid)\n@@ -14051,6 +14893,11 @@ void Unit::Kill(Unit* killer, Unit* victim, bool durabilityLoss, WeaponAttackTyp\n         player->RewardPlayerAndGroupAtKill(victim, false);\n     }\n \n+    //npcbot: spawn wandering bot kill reward\n+    if (creature && creature->IsNPCBot())\n+        BotMgr::OnBotKilled(creature, killer);\n+    //end npcbot\n+\n     // Do KILL and KILLED procs. KILL proc is called only for the unit who landed the killing blow (and its owner - for pets and totems) regardless of who tapped the victim\n     // Spell context is not passed to avoid the killing spell's triggered status from suppressing nested proc events\n     if (killer && (killer->IsPet() || killer->IsTotem()))\n@@ -14138,6 +14985,12 @@ void Unit::Kill(Unit* killer, Unit* victim, bool durabilityLoss, WeaponAttackTyp\n         // at original death (not at SpiritOfRedemtionTalent timeout)\n         plrVictim->SetPvPDeath(player != nullptr);\n \n+        //npcbot - bots should not cause durability loss\n+        if (durabilityLoss && killer && killer->GetTypeId() == TYPEID_UNIT && killer->ToCreature()->GetBotAI() &&\n+            !sWorld->getBoolConfig(CONFIG_DURABILITY_LOSS_IN_PVP))\n+            durabilityLoss = false;\n+        //end npcbot\n+\n         // only if not player and not controlled by player pet. And not at BG\n         if ((durabilityLoss && !player && !plrVictim->InBattleground()) || (player && sWorld->getBoolConfig(CONFIG_DURABILITY_LOSS_IN_PVP)))\n         {\n@@ -14235,6 +15088,10 @@ void Unit::Kill(Unit* killer, Unit* victim, bool durabilityLoss, WeaponAttackTyp\n         {\n             if (victim->IsPlayer())\n                 bg->HandleKillPlayer(victim->ToPlayer(), player);\n+            //npcbot: handler PvB bg kill\n+            else if (victim->IsNPCBot() && victim->ToCreature()->GetBotBG() == bg)\n+                bg->HandlePlayerKillBot(victim->ToCreature(), player);\n+            //end npcbot\n             else\n                 bg->HandleKillUnit(victim->ToCreature(), player);\n         }\n@@ -14262,6 +15119,14 @@ void Unit::Kill(Unit* killer, Unit* victim, bool durabilityLoss, WeaponAttackTyp\n         {\n             if (Player* killed = victim->ToPlayer())\n                 sScriptMgr->OnPlayerKilledByCreature(killerCre, killed);\n+            //npcbot: Creature Kill hook for owner\n+            else if (Creature* killedCre = victim->ToCreature())\n+            {\n+                Unit* killerCreOwner = killerCre->GetCreator();\n+                if (killerCre->IsNPCBotOrPet() && killerCreOwner && killerCreOwner->GetTypeId() == TYPEID_PLAYER)\n+                    sScriptMgr->OnPlayerCreatureKill(killerCreOwner->ToPlayer(), killedCre);\n+            }\n+            //end npcbot\n         }\n     }\n \n@@ -15009,6 +15874,17 @@ bool Unit::IsInPartyWith(Unit const* unit) const\n     if (u1 == u2)\n         return true;\n \n+    //npcbot\n+    Player const* pla = u1->IsPlayer() ? u1->ToPlayer() : u2->IsPlayer() ? u2->ToPlayer() : nullptr;\n+    Creature const* bot = u1->IsNPCBot() ? u1->ToCreature() : u2->IsNPCBot() ? u2->ToCreature() : nullptr;\n+    if (pla && bot)\n+        return (pla->GetGroup() && pla->GetGroup() == bot->GetBotGroup()) ? pla->GetSubGroup() == bot->GetSubGroup() : !!pla->GetBotMgr()->GetBot(bot->GetGUID());\n+    if (u1->IsNPCBot() && u2->IsNPCBot() && u1->ToCreature()->GetBotGroup() && u1->ToCreature()->GetBotGroup() == u2->ToCreature()->GetBotGroup())\n+        return u1->ToCreature()->GetSubGroup() == u2->ToCreature()->GetSubGroup();\n+    if (u1->IsNPCBot() && u2->IsNPCBot() && u1->IsFFAPvP() && u2->IsFFAPvP())\n+        return false;\n+    //end npcbot\n+\n     if (u1->IsPlayer() && u2->IsPlayer())\n         return u1->ToPlayer()->IsInSameGroupWith(u2->ToPlayer());\n     // Xinef: we assume that npcs with the same faction are in party\n@@ -15032,6 +15908,17 @@ bool Unit::IsInRaidWith(Unit const* unit) const\n     if (u1 == u2)\n         return true;\n \n+    //npcbot\n+    Player const* pla = u1->IsPlayer() ? u1->ToPlayer() : u2->IsPlayer() ? u2->ToPlayer() : nullptr;\n+    Creature const* bot = u1->IsNPCBot() ? u1->ToCreature() : u2->IsNPCBot() ? u2->ToCreature() : nullptr;\n+    if (pla && bot)\n+        return (pla->GetGroup() && pla->GetGroup() == bot->GetBotGroup()) ? true : !!pla->GetBotMgr()->GetBot(bot->GetGUID());\n+    if (u1->IsNPCBot() && u2->IsNPCBot() && u1->ToCreature()->GetBotGroup())\n+        return  u1->ToCreature()->GetBotGroup() == u2->ToCreature()->GetBotGroup();\n+    if (u1->IsNPCBot() && u2->IsNPCBot() && u1->IsFFAPvP() && u2->IsFFAPvP())\n+        return false;\n+    //end npcbot\n+\n     if (u1->IsPlayer() && u2->IsPlayer())\n         return u1->ToPlayer()->IsInSameRaidWith(u2->ToPlayer());\n     // Xinef: we assume that npcs with the same faction are in party\n@@ -15051,9 +15938,21 @@ void Unit::GetPartyMembers(std::list<Unit*>& TagUnitMap)\n     if (owner->IsPlayer())\n         group = owner->ToPlayer()->GetGroup();\n \n+    //npcbot: get bot group\n+    if (!group && IsNPCBot())\n+        group = ToCreature()->GetBotGroup();\n+    //end npcbot\n+\n     if (group)\n     {\n+        //npcbot: get bot group\n+        /*\n+        //end npcbot\n         uint8 subgroup = owner->ToPlayer()->GetSubGroup();\n+        //npcbot: get bot group\n+        */\n+        uint8 subgroup = owner->IsPlayer() ? owner->ToPlayer()->GetSubGroup() : group->GetMemberGroup(owner->GetGUID());\n+        //end npcbot\n \n         for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())\n         {\n@@ -15073,6 +15972,14 @@ void Unit::GetPartyMembers(std::list<Unit*>& TagUnitMap)\n                 }\n             }\n         }\n+        //npcbot: count bots\n+        for (GroupBotReference* itr = group->GetFirstBotMember(); itr != nullptr; itr = itr->next())\n+        {\n+            Creature* bot = itr->GetSource();\n+            if (bot && group->GetMemberGroup(bot->GetGUID()) == subgroup && bot->IsAlive() && IsInMap(bot) && !IsHostileTo(bot))\n+                TagUnitMap.push_back(bot);\n+        }\n+        //end npcbot\n     }\n     else\n     {\n@@ -15085,6 +15992,18 @@ void Unit::GetPartyMembers(std::list<Unit*>& TagUnitMap)\n                 if (pet->IsGuardian() && pet->IsAlive())\n                     TagUnitMap.push_back(pet);\n         }\n+\n+        //npcbot: count bots\n+        if (owner->GetTypeId() == TYPEID_PLAYER && owner->ToPlayer()->HaveBot())\n+        {\n+            BotMap const* map = owner->ToPlayer()->GetBotMgr()->GetBotMap();\n+            for (BotMap::const_iterator it = map->begin(); it != map->end(); ++it)\n+            {\n+                if (it->second->IsAlive() && IsInMap(it->second) && !IsHostileTo(it->second))\n+                    TagUnitMap.push_back(it->second);\n+            }\n+        }\n+        //end npcbot\n     }\n }\n \n@@ -15097,6 +16016,10 @@ Aura* Unit::AddAura(uint32 spellId, Unit* target)\n     if (!spellInfo)\n         return nullptr;\n \n+    //npcbot: override spellInfo\n+    spellInfo = spellInfo->TryGetSpellInfoOverride(this);\n+    //end npcbot\n+\n     if (!target->IsAlive() && !spellInfo->HasAttribute(SPELL_ATTR0_PASSIVE) && !spellInfo->HasAttribute(SPELL_ATTR2_ALLOW_DEAD_TARGET))\n         return nullptr;\n \n@@ -15152,6 +16075,13 @@ void Unit::SendPlaySpellImpact(ObjectGuid guid, uint32 id)\n     SendMessageToSet(&data, true);\n }\n \n+//npcbot\n+bool Unit::CanApplyResilience() const\n+{\n+    return (m_applyResilience || IsNPCBotOrPet());\n+}\n+//end npcbot\n+\n void Unit::ApplyResilience(Unit const* victim, float* crit, int32* damage, bool isCrit, CombatRating type)\n {\n     // player mounted on multi-passenger mount is also classified as vehicle\n@@ -15216,6 +16146,11 @@ void Unit::ApplyResilience(Unit const* victim, float* crit, int32* damage, bool\n float Unit::MeleeSpellMissChance(Unit const* victim, WeaponAttackType attType, int32 skillDiff, uint32 spellId) const\n {\n     SpellInfo const* spellInfo = spellId ? sSpellMgr->GetSpellInfo(spellId) : nullptr;\n+\n+    //npcbot: override spellInfo\n+    spellInfo = spellInfo ? spellInfo->TryGetSpellInfoOverride(this) : spellInfo;\n+    //end npcbot\n+\n     if (spellInfo && spellInfo->HasAttribute(SPELL_ATTR7_NO_ATTACK_MISS))\n     {\n         return 0.0f;\n@@ -15224,6 +16159,16 @@ float Unit::MeleeSpellMissChance(Unit const* victim, WeaponAttackType attType, i\n     //calculate miss chance\n     float missChance = victim->GetUnitMissChance(attType);\n \n+    //npcbot - custom miss chance instead of bunch of auras\n+    if (IsNPCBot())\n+    {\n+        if (!ToCreature()->CanMiss())\n+            return 0.f;\n+\n+        missChance += ToCreature()->GetCreatureMissChance();\n+    }\n+    //end npcbot\n+\n     // Check if dual wielding, add additional miss penalty - when mainhand has on next swing spell, offhand doesnt suffer penalty\n     if (!spellId && (attType != RANGED_ATTACK) && HasOffhandWeaponForAttack() && (!m_currentSpells[CURRENT_MELEE_SPELL] || !m_currentSpells[CURRENT_MELEE_SPELL]->IsNextMeleeSwingSpell()))\n     {\n@@ -15326,6 +16271,11 @@ void Unit::SetPhaseMask(uint32 newPhaseMask, bool update)\n         }\n     }\n \n+    //npcbot: update for temporarily uncontrolled bots (teleport, taxi)\n+    if (GetTypeId() == TYPEID_PLAYER)\n+        ToPlayer()->UpdatePhaseForBots();\n+    //end npcbot\n+\n     for (uint8 i = 0; i < MAX_SUMMON_SLOT; ++i)\n     {\n         if (m_SummonSlot[i])\n@@ -15397,6 +16347,10 @@ float Unit::GetCombatRatingReduction(CombatRating cr) const\n {\n     if (Player const* player = ToPlayer())\n         return player->GetRatingBonusValue(cr);\n+    //npcbot: get bot resilience\n+    else if (IsNPCBotOrPet())\n+        return BotMgr::GetBotResilience(ToCreature());\n+    //end npcbot\n     // Player's pet get resilience from owner\n     else if (IsPet() && GetOwner())\n         if (Player* owner = GetOwner()->ToPlayer())\n@@ -15429,6 +16383,183 @@ uint32 Unit::GetModelForForm(ShapeshiftForm form, uint32 spellId)\n         if (uint32 ModelId = sObjectMgr->GetModelForShapeshift(form, ToPlayer()))\n             return ModelId;\n     }\n+    else if (ToCreature() && ToCreature()->GetBotOwner() && ToCreature()->GetBotOwner()->ToPlayer())\n+    {\n+        //this has to be modified after implementation of bots' appearances which will include player bytes emulation\n+        Player const* player = ToCreature()->GetBotOwner();\n+        //let's make druids look according to player but base model must be selected based on our race\n+        switch (form)\n+        {\n+            case FORM_CAT:\n+                // Based on master's Hair color\n+                if (GetRace() == RACE_NIGHTELF)\n+                {\n+                    uint8 hairColor = player->GetByteValue(PLAYER_BYTES, 3);\n+                    switch (hairColor)\n+                    {\n+                        case 7: // Violet\n+                        case 8:\n+                            return 29405;\n+                        case 3: // Light Blue\n+                            return 29406;\n+                        case 0: // Green\n+                        case 1: // Light Green\n+                        case 2: // Dark Green\n+                            return 29407;\n+                        case 4: // White\n+                            return 29408;\n+                        default: // original - Dark Blue\n+                            return 892;\n+                    }\n+                }\n+                // Based on master's Skin color\n+                else if (GetRace() == RACE_TAUREN)\n+                {\n+                    uint8 skinColor = player->GetByteValue(PLAYER_BYTES, 0);\n+                    // Male master\n+                    if (GetGender() == GENDER_MALE)\n+                    {\n+                        switch (skinColor)\n+                        {\n+                            case 12: // White\n+                            case 13:\n+                            case 14:\n+                            case 18: // Completly White\n+                                return 29409;\n+                            case 9: // Light Brown\n+                            case 10:\n+                            case 11:\n+                                return 29410;\n+                            case 6: // Brown\n+                            case 7:\n+                            case 8:\n+                                return 29411;\n+                            case 0: // Dark\n+                            case 1:\n+                            case 2:\n+                            case 3: // Dark Grey\n+                            case 4:\n+                            case 5:\n+                                return 29412;\n+                            default: // original - Grey\n+                                return 8571;\n+                        }\n+                    }\n+                    // Female master\n+                    else switch (skinColor)\n+                    {\n+                        case 10: // White\n+                            return 29409;\n+                        case 6: // Light Brown\n+                        case 7:\n+                            return 29410;\n+                        case 4: // Brown\n+                        case 5:\n+                            return 29411;\n+                        case 0: // Dark\n+                        case 1:\n+                        case 2:\n+                        case 3:\n+                            return 29412;\n+                        default: // original - Grey\n+                            return 8571;\n+                    }\n+                }\n+                else if (Player::TeamIdForRace(GetRace()) == TEAM_ALLIANCE)\n+                    return 892;\n+                else\n+                    return 8571;\n+            case FORM_DIREBEAR:\n+            case FORM_BEAR:\n+                // Based on Hair color\n+                if (GetRace() == RACE_NIGHTELF)\n+                {\n+                    uint8 hairColor = player->GetByteValue(PLAYER_BYTES, 3);\n+                    switch (hairColor)\n+                    {\n+                        case 0: // Green\n+                        case 1: // Light Green\n+                        case 2: // Dark Green\n+                            return 29413; // 29415?\n+                        case 6: // Dark Blue\n+                            return 29414;\n+                        case 4: // White\n+                            return 29416;\n+                        case 3: // Light Blue\n+                            return 29417;\n+                        default: // original - Violet\n+                            return 2281;\n+                    }\n+                }\n+                // Based on Skin color\n+                else if (GetRace() == RACE_TAUREN)\n+                {\n+                    uint8 skinColor = player->GetByteValue(PLAYER_BYTES, 0);\n+                    // Male\n+                    if (GetGender() == GENDER_MALE)\n+                    {\n+                        switch (skinColor)\n+                        {\n+                            case 0: // Dark (Black)\n+                            case 1:\n+                            case 2:\n+                                return 29418;\n+                            case 3: // White\n+                            case 4:\n+                            case 5:\n+                            case 12:\n+                            case 13:\n+                            case 14:\n+                                return 29419;\n+                            case 9: // Light Brown/Grey\n+                            case 10:\n+                            case 11:\n+                            case 15:\n+                            case 16:\n+                            case 17:\n+                                return 29420;\n+                            case 18: // Completly White\n+                                return 29421;\n+                            default: // original - Brown\n+                                return 2289;\n+                        }\n+                    }\n+                    // Female\n+                    else switch (skinColor)\n+                    {\n+                        case 0: // Dark (Black)\n+                        case 1:\n+                            return 29418;\n+                        case 2: // White\n+                        case 3:\n+                            return 29419;\n+                        case 6: // Light Brown/Grey\n+                        case 7:\n+                        case 8:\n+                        case 9:\n+                            return 29420;\n+                        case 10: // Completly White\n+                            return 29421;\n+                        default: // original - Brown\n+                            return 2289;\n+                    }\n+                }\n+                else if (Player::TeamIdForRace(GetRace()) == TEAM_ALLIANCE)\n+                    return 2281;\n+                else\n+                    return 2289;\n+            case FORM_FLIGHT:\n+                if (Player::TeamIdForRace(GetRace()) == TEAM_ALLIANCE)\n+                    return 20857;\n+                return 20872;\n+            case FORM_FLIGHT_EPIC:\n+                if (Player::TeamIdForRace(GetRace()) == TEAM_ALLIANCE)\n+                    return 21243;\n+                return 21244;\n+            default:\n+                break;\n+        }\n+    }\n \n     uint32 modelid = 0;\n     SpellShapeshiftFormEntry const* formEntry = sSpellShapeshiftFormStore.LookupEntry(form);\n@@ -16001,6 +17132,11 @@ bool Unit::UpdatePosition(float x, float y, float z, float orientation, bool tel\n             UpdateObjectVisibility(false);\n     }\n \n+    //npcbot: send bot group update\n+    if ((relocated || turn) && IsNPCBot())\n+        BotMgr::SetBotGroupUpdateFlag(ToCreature(), GROUP_UPDATE_FLAG_POSITION);\n+    //end npcbot\n+\n     return (relocated || turn);\n }\n \n@@ -16091,6 +17227,19 @@ void Unit::StopAttackFaction(uint32 faction_id)\n \n     for (ControlSet::const_iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)\n         (*itr)->StopAttackFaction(faction_id);\n+\n+    //npcbot: stopattackfaction for bots\n+    if (GetTypeId() == TYPEID_PLAYER && ToPlayer()->HaveBot())\n+    {\n+        BotMap const* map = ToPlayer()->GetBotMgr()->GetBotMap();\n+        for (BotMap::const_iterator itr = map->begin(); itr != map->end(); ++itr)\n+        {\n+            itr->second->StopAttackFaction(faction_id);\n+            if (Unit* botPet = itr->second->GetBotsPet())\n+                botPet->StopAttackFaction(faction_id);\n+        }\n+    }\n+    //end npcbot\n }\n \n void Unit::StopAttackingInvalidTarget()\n@@ -16735,6 +17884,10 @@ void Unit::BuildValuesUpdate(uint8 updateType, ByteBuffer* data, Player* target)\n \n     if (plr && plr->IsInSameRaidWith(target))\n         visibleFlag |= UF_FLAG_PARTY_MEMBER;\n+    //npcbot\n+    else if (IsNPCBotOrPet() && IsInRaidWith(target))\n+        visibleFlag |= UF_FLAG_PARTY_MEMBER;\n+    //end npcbot\n \n     uint64 cacheKey = static_cast<uint64>(visibleFlag) << 8 | updateType;\n \n@@ -16865,6 +18018,11 @@ void Unit::PatchValuesUpdate(ByteBuffer& valuesUpdateBuf, BuildValuesCachePosPoi\n         if (!target->CanSeeSpellClickOn(creature))\n             appendValue &= ~UNIT_NPC_FLAG_SPELLCLICK;\n \n+        //npcbot: make wandering bots non-interactive for non-GM players\n+        if ((appendValue & UNIT_NPC_FLAG_GOSSIP) && !target->IsGameMaster() && IsNPCBotOrPet() && creature->IsWandererBot())\n+            appendValue &= ~UNIT_NPC_FLAG_GOSSIP;\n+        //end npcbot\n+\n         if (!target->CanSeeVendor(creature))\n         {\n             appendValue &= ~UNIT_NPC_FLAG_REPAIR;\n@@ -16965,6 +18123,17 @@ void Unit::PatchValuesUpdate(ByteBuffer& valuesUpdateBuf, BuildValuesCachePosPoi\n         {\n                 valuesUpdateBuf.put(posPointers.UnitFieldBytes2Pos, (m_uint32Values[UNIT_FIELD_BYTES_2] & 0xFFFFF2FF)); // clear UNIT_BYTE2_FLAG_PVP, UNIT_BYTE2_FLAG_FFA_PVP, UNIT_BYTE2_FLAG_SANCTUARY\n         }\n+        //npcbot\n+        else if (IsNPCBotOrPet() && IsInRaidWith(target))\n+        {\n+            FactionTemplateEntry const* ft1 = GetFactionTemplateEntry();\n+            FactionTemplateEntry const* ft2 = target->GetFactionTemplateEntry();\n+            if (ft1 && ft2 && !ft1->IsFriendlyTo(*ft2))\n+                valuesUpdateBuf.put(posPointers.UnitFieldBytes2Pos, (m_uint32Values[UNIT_FIELD_BYTES_2] & ((UNIT_BYTE2_FLAG_SANCTUARY /*| UNIT_BYTE2_FLAG_AURAS | UNIT_BYTE2_FLAG_UNK5*/) << 8))); // this flag is at uint8 offset 1 !!\n+            else\n+                valuesUpdateBuf.put(posPointers.UnitFieldBytes2Pos, m_uint32Values[UNIT_FIELD_BYTES_2]);\n+        }\n+        //end npcbot\n     }\n \n     // UNIT_FIELD_FACTIONTEMPLATE\n@@ -16987,6 +18156,15 @@ void Unit::PatchValuesUpdate(ByteBuffer& valuesUpdateBuf, BuildValuesCachePosPoi\n         {\n             valuesUpdateBuf.put(posPointers.UnitFieldFactionTemplatePos, uint32(target->GetFaction()));\n         }\n+        //npcbot\n+        else if (IsNPCBotOrPet() && IsInRaidWith(target))\n+        {\n+            FactionTemplateEntry const* ft1 = GetFactionTemplateEntry();\n+            FactionTemplateEntry const* ft2 = target->GetFactionTemplateEntry();\n+            if (ft1 && ft2 && !ft1->IsFriendlyTo(*ft2))\n+                valuesUpdateBuf.put(posPointers.UnitFieldBytes2Pos, uint32(target->GetFaction()));\n+        }\n+        //end npcbot\n     }\n \n     sScriptMgr->OnPatchValuesUpdate(this, valuesUpdateBuf, posPointers, target);\ndiff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h\nindex b784c702eb..21200380b5 100644\n--- a/src/server/game/Entities/Unit/Unit.h\n+++ b/src/server/game/Entities/Unit/Unit.h\n@@ -286,7 +286,7 @@ struct DiminishingReturn\n     uint32                  hitCount;\n };\n \n-enum MeleeHitOutcome\n+enum MeleeHitOutcome : uint8\n {\n     MELEE_HIT_EVADE, MELEE_HIT_MISS, MELEE_HIT_DODGE, MELEE_HIT_BLOCK, MELEE_HIT_PARRY,\n     MELEE_HIT_GLANCING, MELEE_HIT_CRIT, MELEE_HIT_CRUSHING, MELEE_HIT_NORMAL\n@@ -550,7 +550,7 @@ struct DeclinedName\n     std::string name[MAX_DECLINED_NAME_CASES];\n };\n \n-enum CurrentSpellTypes\n+enum CurrentSpellTypes : uint8\n {\n     CURRENT_MELEE_SPELL             = 0,\n     CURRENT_GENERIC_SPELL           = 1,\n@@ -880,6 +880,9 @@ public:\n     bool IsWithinBoundaryRadius(const Unit* obj) const;\n     bool IsWithinCombatRange(Unit const* obj, float dist2compare) const;\n     bool IsWithinMeleeRange(Unit const* obj, float dist = 0.f) const;\n+    //npcbot: TC method transfer\n+    bool IsWithinMeleeRangeAt(Position const& pos, Unit const* obj) const;\n+    //end npcbot\n     float GetMeleeRange(Unit const* target) const;\n \n     void setAttackTimer(WeaponAttackType type, int32 time) { m_attackTimer[type] = time; }  /// @todo - Look to convert to std::chrono\n@@ -970,6 +973,16 @@ public:\n \n     void SetLastDamagedTargetGuid(ObjectGuid const& guid) { _lastDamagedTargetGuid = guid; }\n     [[nodiscard]] ObjectGuid const& GetLastDamagedTargetGuid() const { return _lastDamagedTargetGuid; }\n+    //npcbot: compatibility accessors\n+    [[nodiscard]] inline uint8 GetRace(bool original = false) const { return getRace(original); }\n+    [[nodiscard]] inline uint32 GetRaceMask() const { return getRaceMask(); }\n+    [[nodiscard]] inline uint8 GetClass() const { return getClass(); }\n+    [[nodiscard]] inline uint32 GetClassMask() const { return getClassMask(); }\n+    [[nodiscard]] inline uint8 GetGender() const { return getGender(); }\n+    inline void SetPowerType(Powers power) { setPowerType(power); }\n+    [[nodiscard]] inline Powers GetPowerType() const { return getPowerType(); }\n+    [[nodiscard]] uint8 GetStandState() const { return getStandState(); }\n+    //end npcbot\n \n     void AttackerStateUpdate (Unit* victim, WeaponAttackType attType = BASE_ATTACK, bool extra = false, bool ignoreCasting = false);\n \n@@ -1168,7 +1181,14 @@ public:\n \n     // Resilience\n     static void ApplyResilience(Unit const* victim, float* crit, int32* damage, bool isCrit, CombatRating type);\n+    //npcbot\n+    /*\n+    //end npcbot\n     [[nodiscard]] bool CanApplyResilience() const { return m_applyResilience; }\n+    //npcbot\n+    */\n+    [[nodiscard]] bool CanApplyResilience() const;\n+    //end npcbot\n \n     // Skills values\n     [[nodiscard]] virtual uint32 GetShieldBlockValue() const = 0;\n@@ -1271,6 +1291,14 @@ public:\n     [[nodiscard]] float GetRangedCritChanceReduction() const { return GetCombatRatingReduction(CR_CRIT_TAKEN_RANGED); }\n     [[nodiscard]] float GetSpellCritChanceReduction() const { return GetCombatRatingReduction(CR_CRIT_TAKEN_SPELL); }\n \n+    //npcbot\n+    void SetControlledByPlayer(bool set) { m_ControlledByPlayer = set; }\n+    GameObject* GetFirstGameObjectById(uint32 id) const;\n+    void SetCreator(Unit* creator);\n+    Unit* GetCreator() const { return m_creator; }\n+    Unit* m_creator = nullptr;\n+    //end npcbot\n+\n     [[nodiscard]] uint32 GetMeleeCritDamageReduction(uint32 damage) const { return GetCombatRatingDamageReduction(CR_CRIT_TAKEN_MELEE, 2.2f, 33.0f, damage); }\n     [[nodiscard]] uint32 GetRangedCritDamageReduction(uint32 damage) const { return GetCombatRatingDamageReduction(CR_CRIT_TAKEN_RANGED, 2.2f, 33.0f, damage); }\n     [[nodiscard]] uint32 GetSpellCritDamageReduction(uint32 damage) const { return GetCombatRatingDamageReduction(CR_CRIT_TAKEN_SPELL, 2.2f, 33.0f, damage); }\n@@ -1636,8 +1664,18 @@ public:\n \n     // Spells immunities\n     void ApplySpellImmune(uint32 spellId, uint32 op, uint32 type, bool apply, SpellImmuneBlockType blockType = SPELL_BLOCK_TYPE_ALL);\n+    //npcbot\n+    /*\n     virtual bool IsImmunedToSpell(SpellInfo const* spellInfo, Spell const* spell = nullptr);\n+    */\n+    virtual bool IsImmunedToSpell(SpellInfo const* spellInfo, Spell const* spell = nullptr) const;\n+    //end npcbot\n+    //npcbot\n+    /*\n     bool IsImmunedToSpell(SpellInfo const* spellInfo, uint32 effectMask, Unit const* caster = nullptr);\n+    */\n+    bool IsImmunedToSpell(SpellInfo const* spellInfo, uint32 effectMask, Unit const* caster = nullptr) const;\n+    //end npcbot\n     [[nodiscard]] bool IsImmunedToDamage(SpellSchoolMask schoolMask) const;\n     [[nodiscard]] bool IsImmunedToDamage(Unit const* caster, SpellInfo const* spellInfo) const;\n     [[nodiscard]] bool IsImmunedToSchool(SpellSchoolMask schoolMask) const;\n@@ -1722,6 +1760,11 @@ public:\n     [[nodiscard]] virtual bool CanSwim() const;\n     [[nodiscard]] bool CanFreeMove() const\n     {\n+        //npcbot: skip owner guid condition for bots\n+        if (IsNPCBotOrPet())\n+            return !HasUnitState(UNIT_STATE_CONFUSED | UNIT_STATE_FLEEING | UNIT_STATE_IN_FLIGHT |\n+                                 UNIT_STATE_ROOT | UNIT_STATE_STUNNED | UNIT_STATE_DISTRACTED);\n+        //end npcbot\n         return !HasUnitState(UNIT_STATE_CONFUSED | UNIT_STATE_FLEEING | UNIT_STATE_IN_FLIGHT |\n                              UNIT_STATE_ROOT | UNIT_STATE_STUNNED | UNIT_STATE_DISTRACTED) && !GetOwnerGUID();\n     }\n@@ -1787,7 +1830,12 @@ public:\n     void  RemoveStandFlags(uint8 flags) { RemoveByteFlag(UNIT_FIELD_BYTES_1,  UNIT_BYTES_1_OFFSET_VIS_FLAG, flags); }\n \n     // DeathState\n+    //npcbot\n+    /*\n     DeathState getDeathState() { return m_deathState; };\n+    */\n+    DeathState getDeathState() const { return m_deathState; };\n+    //end npcbot\n     virtual void setDeathState(DeathState s, bool despawn = false);           // overwrited in Creature/Player/Pet\n \n     [[nodiscard]] bool IsAlive() const { return (m_deathState == DeathState::Alive); };\n@@ -2067,6 +2115,11 @@ public:\n     void OutDebugInfo() const;\n     std::string GetDebugInfo() const override;\n \n+    //npcbot\n+    bool HasReactive(ReactiveType reactive) const { return m_reactiveTimer[reactive] > 0; }\n+    void ClearReactive(ReactiveType reactive);\n+    //end npcbot\n+\n     //----------- Public variables ----------//\n     uint32 m_extraAttacks;\n     DualWieldMode _dualWieldMode;\ndiff --git a/src/server/game/Entities/Vehicle/Vehicle.cpp b/src/server/game/Entities/Vehicle/Vehicle.cpp\nindex c4ce556583..d8d936a011 100644\n--- a/src/server/game/Entities/Vehicle/Vehicle.cpp\n+++ b/src/server/game/Entities/Vehicle/Vehicle.cpp\n@@ -28,6 +28,10 @@\n #include \"Util.h\"\n #include <algorithm>\n \n+//npcbot\n+#include \"botmgr.h\"\n+//end npcbot\n+\n Vehicle::Vehicle(Unit* unit, VehicleEntry const* vehInfo, uint32 creatureEntry) :\n     _me(unit), _vehicleInfo(vehInfo), _usableSeatNum(0), _creatureEntry(creatureEntry), _status(STATUS_NONE)\n {\n@@ -374,6 +378,16 @@ bool Vehicle::AddPassenger(Unit* unit, int8 seatId)\n         else\n             _me->SetNpcFlag(_me->IsPlayer() ?  UNIT_NPC_FLAG_PLAYER_VEHICLE : UNIT_NPC_FLAG_SPELLCLICK);\n     }\n+        //npcbot: do not allow other passengers on bot vehicles\n+        if (unit->IsNPCBot()/* &&\n+            (Seat->second.SeatInfo->m_flags & VEHICLE_SEAT_FLAG_CAN_CONTROL)*/)\n+        {\n+            if (_me->GetTypeId() == TYPEID_PLAYER)\n+                _me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_PLAYER_VEHICLE);\n+            else\n+                _me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK);\n+        }\n+        //end npcbot\n \n     if (!_me || !_me->IsInWorld() || _me->IsDuringRemoveFromWorld())\n         return false;\n@@ -399,6 +413,11 @@ bool Vehicle::AddPassenger(Unit* unit, int8 seatId)\n     unit->m_movementInfo.transport.seat = seat->first;\n     unit->m_movementInfo.transport.guid = _me->GetGUID();\n \n+    //npcbot\n+    if (unit->GetTypeId() == TYPEID_UNIT && unit->ToCreature()->GetBotAI())\n+        BotMgr::OnBotEnterVehicle(unit->ToCreature(), this);\n+    //end npcbot\n+\n     // xinef: removed seat->first == 0 check...\n     if (_me->IsCreature()\n             && unit->IsPlayer()\n@@ -419,8 +438,14 @@ bool Vehicle::AddPassenger(Unit* unit, int8 seatId)\n             LOG_INFO(\"vehicles\", \"Crash recovered in Unit::SetCharmedBy(). Unit {}, typeid: {}, in world: {}, duringremove: {} has wrong CharmType! Charmer {}, typeid: {}, in world: {}, duringremove: {}.\", _me->GetName(), _me->GetTypeId(), _me->IsInWorld(), _me->IsDuringRemoveFromWorld(), unit->GetName(), unit->GetTypeId(), unit->IsInWorld(), unit->IsDuringRemoveFromWorld());\n             return false;\n         }\n+\n+        //npcbot\n+        if (unit->ToPlayer()->HaveBot())\n+            BotMgr::OnBotOwnerEnterVehicle(unit->ToPlayer(), this);\n+        //end npcbot\n     }\n \n+\n     if (_me->IsInWorld())\n     {\n         unit->SendClearTarget();                                // SMSG_BREAK_TARGET\n@@ -491,10 +516,21 @@ void Vehicle::RemovePassenger(Unit* unit)\n     if (seat->second.SeatInfo->m_flags & VEHICLE_SEAT_FLAG_PASSENGER_NOT_SELECTABLE && !seat->second.Passenger.IsUnselectable)\n         unit->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE);\n \n+    //npcbot\n+    if (unit->GetTypeId() == TYPEID_UNIT && unit->ToCreature()->GetBotAI())\n+        BotMgr::OnBotExitVehicle(unit->ToCreature(), this);\n+    //end npcbot\n+\n     seat->second.Passenger.Reset();\n \n     if (_me->IsCreature() && unit->IsPlayer() && seat->second.SeatInfo->m_flags & VEHICLE_SEAT_FLAG_CAN_CONTROL)\n+    {\n+        //npcbot\n+        if (unit->ToPlayer()->HaveBot())\n+            BotMgr::OnBotOwnerExitVehicle(unit->ToPlayer(), this);\n+        //end npcbot\n         _me->RemoveCharmedBy(unit);\n+    }\n \n     if (_me->IsInWorld())\n     {\n@@ -608,8 +644,16 @@ void Vehicle::InitMovementInfoForBase()\n }\n \n VehicleSeatEntry const* Vehicle::GetSeatForPassenger(Unit const* passenger)\n+//npcbot\n+const\n+//end npcbot\n {\n+    //npcbot\n+    /*\n     SeatMap::iterator itr;\n+    */\n+    SeatMap::const_iterator itr;\n+    //end npcbot\n     for (itr = Seats.begin(); itr != Seats.end(); ++itr)\n         if (itr->second.Passenger.Guid == passenger->GetGUID())\n             return itr->second.SeatInfo;\ndiff --git a/src/server/game/Entities/Vehicle/Vehicle.h b/src/server/game/Entities/Vehicle/Vehicle.h\nindex d7359760ca..c1017c6bcd 100644\n--- a/src/server/game/Entities/Vehicle/Vehicle.h\n+++ b/src/server/game/Entities/Vehicle/Vehicle.h\n@@ -56,7 +56,13 @@ public:\n \n     SeatMap Seats;\n \n+    //npcbot\n+    /*\n     VehicleSeatEntry const* GetSeatForPassenger(Unit const* passenger);\n+    */\n+    VehicleSeatEntry const* GetSeatForPassenger(Unit const* passenger) const;\n+    //end npcbot\n+\n     SeatMap::iterator GetSeatIteratorForPassenger(Unit* passenger);\n \n protected:\ndiff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp\nindex f1e100bbad..4b94322fdf 100644\n--- a/src/server/game/Globals/ObjectMgr.cpp\n+++ b/src/server/game/Globals/ObjectMgr.cpp\n@@ -57,6 +57,10 @@\n \n #include \"ItemEnchantmentMgr.h\"\n \n+//npcbot\n+#include \"botdatamgr.h\"\n+//end npcbot\n+\n ScriptMapMap sSpellScripts;\n ScriptMapMap sEventScripts;\n ScriptMapMap sWaypointScripts;\n@@ -1206,6 +1210,11 @@ void ObjectMgr::CheckCreatureTemplate(CreatureTemplate const* cInfo)\n         const_cast<CreatureTemplate*>(cInfo)->expansion = 0;\n     }\n \n+    //npcbot: skip flags check and damage multiplier\n+    if (cInfo->IsNPCBotOrPet())\n+        return;\n+    //end npcbot\n+\n     if (uint32 badFlags = (cInfo->flags_extra & ~CREATURE_FLAG_EXTRA_DB_ALLOWED))\n     {\n         LOG_ERROR(\"sql.sql\", \"Table `creature_template` lists creature (Entry: {}) with disallowed `flags_extra` {}, removing incorrect flag.\", cInfo->Entry, badFlags);\n@@ -9544,6 +9553,81 @@ SkillRangeType GetSkillRangeType(SkillRaceClassInfoEntry const* rcEntry)\n     return SKILL_RANGE_LEVEL;\n }\n \n+void ObjectMgr::LoadCreatureOutfits()\n+{\n+    uint32 oldMSTime = getMSTime();\n+\n+    _creatureOutfitStore.clear();                           // for reload case (test only)\n+\n+    //                                                 0     1      2      3     4     5       6           7\n+    QueryResult result = WorldDatabase.Query(\"SELECT entry, race, gender, skin, face, hair, haircolor, facialhair, \"\n+        //8       9        10    11     12     13    14     15     16     17     18\n+        \"head, shoulders, body, chest, waist, legs, feet, wrists, hands, back, tabard FROM creature_template_outfits\");\n+\n+    if (!result)\n+    {\n+        LOG_ERROR(\"server.loading\", \">> Loaded 0 creature outfits. DB table `creature_template_outfits` is empty!\");\n+        return;\n+    }\n+\n+    uint32 count = 0;\n+\n+    do\n+    {\n+        Field* fields = result->Fetch();\n+\n+        uint32 i = 0;\n+        uint32 entry     = fields[i++].Get<uint32>();\n+\n+        if (!GetCreatureTemplate(entry))\n+        {\n+            LOG_ERROR(\"server.loading\", \">> Creature entry {} in `creature_template_outfits`, but not in `creature_template`!\", entry);\n+            continue;\n+        }\n+\n+        CreatureOutfit co; // const, shouldnt be changed after saving\n+        co.race          = fields[i++].Get<uint8>();\n+        ChrRacesEntry const* rEntry = sChrRacesStore.LookupEntry(co.race);\n+        if (!rEntry)\n+        {\n+            LOG_ERROR(\"server.loading\", \">> Creature entry {} in `creature_template_outfits` has incorrect race ({}).\", entry, uint32(co.race));\n+            continue;\n+        }\n+        co.gender        = fields[i++].Get<uint8>();\n+        // Set correct displayId\n+        _creatureTemplateStore[entry].unit_flags2 |= UNIT_FLAG2_MIRROR_IMAGE; // Needed so client requests mirror packet\n+        _creatureTemplateStore[entry].Models.clear();\n+        switch (co.gender)\n+        {\n+            case GENDER_FEMALE:\n+                _creatureTemplateStore[entry].Models.emplace_back(rEntry->model_f, 1.0f, 1.0f);\n+                break;\n+            case GENDER_MALE:\n+                _creatureTemplateStore[entry].Models.emplace_back(rEntry->model_m, 1.0f, 1.0f);\n+                break;\n+            default:\n+                LOG_ERROR(\"server.loading\", \">> Creature entry {} in `creature_template_outfits` has invalid gender {}\", entry, uint32(co.gender));\n+                _creatureTemplateStore[entry].Models.emplace_back(rEntry->model_m, 1.0f, 1.0f);\n+                continue;\n+        }\n+\n+        co.skin          = fields[i++].Get<uint8>();\n+        co.face          = fields[i++].Get<uint8>();\n+        co.hair          = fields[i++].Get<uint8>();\n+        co.haircolor     = fields[i++].Get<uint8>();\n+        co.facialhair    = fields[i++].Get<uint8>();\n+        for (uint32 j = 0; j != MAX_CREATURE_OUTFIT_DISPLAYS; ++j)\n+            co.outfit[j] = fields[i+j].Get<uint32>();\n+\n+        _creatureOutfitStore[entry] = co;\n+\n+        ++count;\n+    }\n+    while (result->NextRow());\n+\n+    LOG_INFO(\"server.loading\", \">> Loaded {} creature outfits in {} ms\", count, GetMSTimeDiffToNow(oldMSTime));\n+}\n+\n void ObjectMgr::LoadGameTele()\n {\n     uint32 oldMSTime = getMSTime();\n@@ -10821,6 +10905,18 @@ GameObjectTemplateAddon const* ObjectMgr::GetGameObjectTemplateAddon(uint32 entr\n \n CreatureTemplate const* ObjectMgr::GetCreatureTemplate(uint32 entry)\n {\n+    //npcbot: try fetch custom creature template\n+    if (entry >= BOT_ENTRY_CREATE_BEGIN)\n+    {\n+        if (CreatureTemplate const* extra_template = BotDataMgr::GetBotExtraCreatureTemplate(entry))\n+        {\n+            //custom creature template should only exist in custom container\n+            ASSERT_NODEBUGINFO(_creatureTemplateStore.find(entry) == _creatureTemplateStore.end());\n+            return extra_template;\n+        }\n+    }\n+    //end npcbot\n+\n     return entry < _creatureTemplateStoreFast.size() ? _creatureTemplateStoreFast[entry] : nullptr;\n }\n \ndiff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h\nindex 39bdbe59fc..cdcb2ea148 100644\n--- a/src/server/game/Globals/ObjectMgr.h\n+++ b/src/server/game/Globals/ObjectMgr.h\n@@ -142,6 +142,21 @@ struct GameTele\n \n typedef std::unordered_map<uint32, GameTele > GameTeleContainer;\n \n+#define MAX_CREATURE_OUTFIT_DISPLAYS 11\n+struct CreatureOutfit\n+{\n+    uint8 race;\n+    uint8 gender;\n+    uint8 face;\n+    uint8 skin;\n+    uint8 hair;\n+    uint8 facialhair;\n+    uint8 haircolor;\n+    uint32 outfit[MAX_CREATURE_OUTFIT_DISPLAYS];\n+};\n+\n+typedef std::unordered_map<uint32, CreatureOutfit > CreatureOutfitContainer;\n+\n enum ScriptsType\n {\n     SCRIPTS_FIRST = 1,\n@@ -1104,6 +1119,8 @@ public:\n \n     void LoadNPCSpellClickSpells();\n \n+    void LoadCreatureOutfits();\n+\n     void LoadGameTele();\n \n     void LoadGossipMenu();\n@@ -1427,6 +1444,8 @@ public:\n     bool AddGameTele(GameTele& data);\n     bool DeleteGameTele(std::string_view name);\n \n+    CreatureOutfitContainer const& GetCreatureOutfitMap() const { return _creatureOutfitStore; }\n+\n     Trainer::Trainer* GetTrainer(uint32 creatureId);\n     std::vector<Trainer::Trainer const*> const& GetClassTrainers(uint8 classId) const { return _classTrainers.at(classId); }\n \n@@ -1594,6 +1613,8 @@ private:\n     PageTextContainer _pageTextStore;\n     InstanceTemplateContainer _instanceTemplateStore;\n \n+    CreatureOutfitContainer _creatureOutfitStore;\n+\n     CreatureSparringContainer _creatureSparringStore;\n \n private:\ndiff --git a/src/server/game/Grids/Notifiers/GridNotifiers.h b/src/server/game/Grids/Notifiers/GridNotifiers.h\nindex 838ed4048e..bb9a1f08f3 100644\n--- a/src/server/game/Grids/Notifiers/GridNotifiers.h\n+++ b/src/server/game/Grids/Notifiers/GridNotifiers.h\n@@ -1527,6 +1527,10 @@ namespace Acore\n             {\n                 player = u->GetOwner()->ToPlayer();\n             }\n+            //npcbot: find bot owner\n+            else if (u->IsNPCBotOrPet() && !u->ToCreature()->IsFreeBot())\n+                player = u->ToCreature()->GetBotOwner();\n+            //end npcbot\n \n             if (!player)\n             {\ndiff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp\nindex 5ddc2b133c..00f0fcc8c4 100644\n--- a/src/server/game/Groups/Group.cpp\n+++ b/src/server/game/Groups/Group.cpp\n@@ -42,6 +42,11 @@\n #include \"ArenaTeam.h\"\n #include \"ArenaTeamMgr.h\"\n \n+//npcbot\n+#include \"botdatamgr.h\"\n+#include \"botmgr.h\"\n+//end npcbot\n+\n Roll::Roll(ObjectGuid _guid, LootItem const& li) : itemGUID(_guid), itemid(li.itemid),\n     itemRandomPropId(li.randomPropertyId), itemRandomSuffix(li.randomSuffix), itemCount(li.count),\n     totalPlayersRolling(0), totalNeed(0), totalGreed(0), totalPass(0), itemSlot(0),\n@@ -105,6 +110,38 @@ Group::~Group()\n     delete[] m_subGroupsCounts;\n }\n \n+//npcbot\n+bool Group::Create(Creature* leader)\n+{\n+    ASSERT(isBGGroup());\n+\n+    ObjectGuid leaderGuid = leader->GetGUID();\n+    ObjectGuid::LowType lowguid = sGroupMgr->GenerateGroupId();\n+\n+    m_guid = ObjectGuid::Create<HighGuid::Group>(lowguid);\n+    m_leaderGuid = leaderGuid;\n+    m_leaderName = leader->GetName();\n+\n+    m_groupType = GROUPTYPE_BGRAID;\n+\n+    _initRaidSubGroupsCounter();\n+\n+    m_lootMethod = FREE_FOR_ALL;\n+\n+    m_lootThreshold = ITEM_QUALITY_UNCOMMON;\n+    m_looterGuid = leaderGuid;\n+    m_masterLooterGuid.Clear();\n+\n+    m_dungeonDifficulty = DUNGEON_DIFFICULTY_NORMAL;\n+    m_raidDifficulty = RAID_DIFFICULTY_10MAN_NORMAL;\n+\n+    if (!AddMember(leader))\n+        return false;\n+\n+    return true;\n+}\n+//end npcbot\n+\n bool Group::Create(Player* leader)\n {\n     ObjectGuid leaderGuid = leader->GetGUID();\n@@ -257,6 +294,38 @@ void Group::LoadMemberFromDB(ObjectGuid::LowType guidLow, uint8 memberFlags, uin\n     sLFGMgr->SetupGroupMember(member.guid, GetGUID());\n }\n \n+//npcbot\n+void Group::LoadCreatureMemberFromDB(uint32 entry, uint8 memberFlags, uint8 subgroup, uint8 roles)\n+{\n+    MemberSlot member;\n+    member.guid = BotDataMgr::GetNPCBotGuid(entry);\n+\n+    // skip non-existed bot\n+    if (member.guid == ObjectGuid::Empty)\n+    {\n+        CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_NPCBOT_GROUP_MEMBER);\n+        stmt->SetData(0, entry);\n+        stmt->SetData(1, GetGUID().GetCounter());\n+        CharacterDatabase.Execute(stmt);\n+        return;\n+    }\n+\n+    CreatureTemplate const* ct = sObjectMgr->GetCreatureTemplate(entry);\n+    ASSERT(ct);\n+\n+    member.name = ct->Name;\n+    member.group = subgroup;\n+    member.flags = memberFlags;\n+    member.roles = roles;\n+\n+    m_memberSlots.push_back(member);\n+\n+    SubGroupCounterIncrease(subgroup);\n+\n+    //sLFGMgr->SetupGroupMember(member.guid, GetGUID());\n+}\n+//end npcbot\n+\n void Group::ConvertToLFG(bool restricted /*= true*/)\n {\n     m_groupType = GroupType(m_groupType | GROUPTYPE_LFG);\n@@ -387,6 +456,75 @@ Player* Group::GetInvited(const std::string& name) const\n     return nullptr;\n }\n \n+//npcbot\n+bool Group::AddMember(Creature* creature)\n+{\n+    // Get first not-full group\n+    uint8 subGroup = 0;\n+    if (m_subGroupsCounts)\n+    {\n+        bool groupFound = false;\n+        for (; subGroup < MAX_RAID_SUBGROUPS; ++subGroup)\n+        {\n+            if (m_subGroupsCounts[subGroup] < MAXGROUPSIZE)\n+            {\n+                groupFound = true;\n+                break;\n+            }\n+        }\n+        // We are raid group and no one slot is free\n+        if (!groupFound)\n+            return false;\n+    }\n+\n+    MemberSlot member;\n+    member.guid      = creature->GetGUID();\n+    member.name      = creature->GetName();\n+    member.group     = subGroup;\n+    member.flags     = 0;\n+    member.roles     = 0;\n+    m_memberSlots.push_back(member);\n+\n+    if (creature->GetBotGroup())\n+    {\n+        if (isBGGroup() || isBFGroup()) // if player is in group and he is being added to BG raid group, then call SetBattlegroundRaid()\n+            creature->SetBattlegroundOrBattlefieldRaid(this, subGroup);\n+        else //if player is in bg raid and we are adding him to normal group, then call SetOriginalGroup()\n+            creature->SetOriginalGroup(this, subGroup);\n+    }\n+    else //if player is not in group, then call set group\n+        creature->SetBotGroup(this, subGroup);\n+\n+    if (!isRaidGroup())\n+    {\n+        for (uint8 i = 0; i < TARGETICONCOUNT; ++i)\n+            m_targetIcons[i].Clear();\n+    }\n+\n+    // insert into the table if we're not a battleground group\n+    if (!isBGGroup() && !isBFGroup())\n+    {\n+        //REPLACE INTO characters_npcbot_group_member (guid, entry, memberFlags, subgroup, roles) VALUES(?, ?, ?, ?, ?), CONNECTION_ASYNC\n+        CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_NPCBOT_GROUP_MEMBER);\n+        stmt->SetData(0, GetGUID().GetCounter());\n+        stmt->SetData(1, member.guid.GetEntry());\n+        stmt->SetData(2, member.flags);\n+        stmt->SetData(3, member.group);\n+        stmt->SetData(4, member.roles);\n+        CharacterDatabase.Execute(stmt);\n+    }\n+\n+    SubGroupCounterIncrease(subGroup);\n+    SendUpdate();\n+    sScriptMgr->OnGroupAddMember(this, creature->GetGUID());\n+\n+    BotMgr::SetBotGroupUpdateFlag(creature, GROUP_UPDATE_FULL);\n+    UpdateBotOutOfRange(creature);\n+\n+    return true;\n+}\n+//end npcbot\n+\n bool Group::AddMember(Player* player)\n {\n     if (!player)\n@@ -540,6 +678,11 @@ bool Group::AddMember(Player* player)\n             m_maxEnchantingLevel = player->GetSkillValue(SKILL_ENCHANTING);\n     }\n \n+    //npcbot: if player has been added to bot BG raid switch leader to it\n+    if (!m_leaderGuid.IsPlayer())\n+        ChangeLeader(player->GetGUID());\n+    //end npcbot\n+\n     return true;\n }\n \n@@ -557,6 +700,63 @@ bool Group::RemoveMember(ObjectGuid guid, const RemoveMethod& method /*= GROUP_R\n     // remove member and change leader (if need) only if strong more 2 members _before_ member remove (BG/BF allow 1 member group)\n     if (GetMembersCount() > ((isBGGroup() || isLFGGroup() || isBFGroup()) ? 1u : 2u))\n     {\n+        //npcbot: skip group size check before removing a bot\n+        if (guid.IsCreature())\n+        {\n+            if (Creature const* cbot = BotDataMgr::FindBot(guid.GetEntry()))\n+            {\n+                Creature* bot = const_cast<Creature*>(cbot);\n+                if (isBGGroup() || isBFGroup())\n+                    bot->RemoveFromBattlegroundOrBattlefieldRaid();\n+                else\n+                {\n+                    if (bot->GetOriginalGroup() == this)\n+                        bot->SetOriginalGroup(nullptr);\n+                    else\n+                        bot->SetBotGroup(nullptr);\n+                }\n+            }\n+\n+            // Remove bot from group in DB\n+            if (!isBGGroup() && !isBFGroup())\n+            {\n+                //DELETE FROM characters_npcbot_group_member WHERE entry = ?, CONNECTION_ASYNC\n+                CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_NPCBOT_GROUP_MEMBER);\n+                stmt->SetData(0, guid.GetEntry());\n+                CharacterDatabase.Execute(stmt);\n+                DelinkBotMember(guid);\n+            }\n+\n+            // Update subgroups\n+            member_witerator slot = _getMemberWSlot(guid);\n+            if (slot != m_memberSlots.end())\n+            {\n+                SubGroupCounterDecrease(slot->group);\n+                m_memberSlots.erase(slot);\n+            }\n+\n+            sScriptMgr->OnGroupRemoveMember(this, guid, method, kicker, reason);\n+\n+            SendUpdate();\n+\n+            // do not disband raid group if bot owner logging out within dungeon\n+            // 1-player raid groups will not happen unless player is gm - bots will rejoin at login\n+            if (GetMembersCount() < 2 && isRaidGroup() && !(isBGGroup() || isBFGroup()) && GetLeaderGUID())\n+            {\n+                Player const* player = ObjectAccessor::FindPlayer(GetLeaderGUID());\n+                Map const* map = player ? player->FindMap() : nullptr;\n+                if (!(map && map->IsDungeon() && player && player->GetSession()->PlayerLogout()))\n+                    Disband();\n+            }\n+            else if (GetMembersCount() < ((isLFGGroup() || isBGGroup() || isBFGroup()) ? 1u : 2u))\n+            {\n+                Disband();\n+                return false;\n+            }\n+\n+            return true;\n+        }\n+\n         Player* player = ObjectAccessor::FindConnectedPlayer(guid);\n         if (player)\n         {\n@@ -665,6 +865,9 @@ bool Group::RemoveMember(ObjectGuid guid, const RemoveMethod& method /*= GROUP_R\n         }\n \n         if (m_memberMgr.getSize() < ((isLFGGroup() || isBGGroup() || isBFGroup()) ? 1u : 2u))\n+        //npcbot: prevent group from being disbanded due to checking only players count\n+        if (GetMembersCount() < ((isLFGGroup() || isBGGroup() || isBFGroup()) ? 1u : 2u))\n+        //end npcbot\n         {\n             Disband();\n             return false;\n@@ -736,6 +939,26 @@ void Group::Disband(bool hideDestroy /* = false */)\n             sCharacterCache->ClearCharacterGroup(citr->guid);\n         }\n \n+        //npcbot: set bot's group\n+        if (citr->guid.IsCreature())\n+        {\n+            if (Creature const* cbot = BotDataMgr::FindBot(citr->guid.GetEntry()))\n+            {\n+                Creature* bot = const_cast<Creature*>(cbot);\n+                if (isBGGroup() || isBFGroup())\n+                    bot->RemoveFromBattlegroundOrBattlefieldRaid();\n+                else\n+                {\n+                    if (bot->GetOriginalGroup() == this)\n+                        bot->SetOriginalGroup(nullptr);\n+                    else\n+                        bot->SetBotGroup(nullptr);\n+                }\n+            }\n+            continue;\n+        }\n+        //end npcbot\n+\n         player = ObjectAccessor::FindConnectedPlayer(citr->guid);\n \n         if (player && !instanceId && !isBGGroup() && !isBFGroup())\n@@ -804,6 +1027,12 @@ void Group::Disband(bool hideDestroy /* = false */)\n         stmt->SetData(0, GetGUID().GetCounter());\n         trans->Append(stmt);\n \n+        //npcbot: bot members deletion\n+        stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_NPCBOT_GROUP_MEMBER_ALL);\n+        stmt->SetData(0, GetGUID().GetCounter());\n+        trans->Append(stmt);\n+        //end npcbot\n+\n         CharacterDatabase.CommitTransaction(trans);\n \n         stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_LFG_DATA);\n@@ -975,6 +1204,11 @@ bool CanRollOnItem(LootItem const& item, Player const* player, Loot* loot)\n \n void Group::GroupLoot(Loot* loot, WorldObject* pLootedObject)\n {\n+    //npcbot\n+    if (m_memberMgr.getSize() <= 1)\n+        return;\n+    //end npcbot\n+\n     std::vector<LootItem>::iterator i;\n     ItemTemplate const* item;\n     uint8 itemSlot = 0;\n@@ -1131,6 +1365,11 @@ void Group::GroupLoot(Loot* loot, WorldObject* pLootedObject)\n \n void Group::NeedBeforeGreed(Loot* loot, WorldObject* lootedObject)\n {\n+    //npcbot\n+    if (m_memberMgr.getSize() <= 1)\n+        return;\n+    //end npcbot\n+\n     ItemTemplate const* item;\n     uint8 itemSlot = 0;\n     for (std::vector<LootItem>::iterator i = loot->items.begin(); i != loot->items.end(); ++i, ++itemSlot)\n@@ -1637,6 +1876,36 @@ void Group::SetTargetIcon(uint8 id, ObjectGuid whoGuid, ObjectGuid targetGuid)\n \n     m_targetIcons[id] = targetGuid;\n \n+    //npcbot: name cache\n+    bool need_cache_name = false;\n+    Player const* setter = nullptr;\n+    for (GroupReference const* itr = GetFirstMember(); itr != nullptr; itr = itr->next())\n+    {\n+        if (itr->GetSource())\n+        {\n+            if (!need_cache_name && itr->GetSource()->GetBotMgr())\n+                need_cache_name = true;\n+            if (!setter && itr->GetSource()->GetGUID() == whoGuid)\n+                setter = itr->GetSource();\n+        }\n+\n+        if (need_cache_name && setter)\n+            break;\n+    }\n+\n+    if (need_cache_name && setter)\n+    {\n+        Unit const* newtarget = targetGuid ? ObjectAccessor::GetUnit(*setter, targetGuid) : nullptr;\n+        std::string_view newname = newtarget ? std::string_view{ newtarget->GetName() } : std::string_view{ \"\" };\n+        for (GroupReference const* itr = GetFirstMember(); itr != nullptr; itr = itr->next())\n+        {\n+            Player const* member = itr->GetSource();\n+            if (member && member->GetBotMgr())\n+                member->GetBotMgr()->UpdateTargetIconName(id, newname);\n+        }\n+    }\n+    //end npcbot\n+\n     WorldPacket data(MSG_RAID_TARGET_UPDATE, (1 + 8 + 1 + 8));\n     data << uint8(0);                                       // set targets\n     data << whoGuid;\n@@ -1673,6 +1942,11 @@ void Group::SendUpdate()\n \n void Group::SendUpdateToPlayer(ObjectGuid playerGUID, MemberSlot* slot)\n {\n+    //npcbot\n+    if (!playerGUID.IsPlayer())\n+        return;\n+    //end npcbot\n+\n     Player* player = ObjectAccessor::FindConnectedPlayer(playerGUID);\n \n     if (!player || player->GetGroup() != this)\n@@ -1713,6 +1987,10 @@ void Group::SendUpdateToPlayer(ObjectGuid playerGUID, MemberSlot* slot)\n         uint8 onlineState = (member && !member->GetSession()->PlayerLogout()) ? MEMBER_STATUS_ONLINE : MEMBER_STATUS_OFFLINE;\n         onlineState = onlineState | ((isBGGroup() || isBFGroup()) ? MEMBER_STATUS_PVP : 0);\n \n+        //npcbot: bots are always online\n+        onlineState |= citr->guid.IsCreature() ? 1 : 0;\n+        //end npcbot\n+\n         data << citr->name;\n         data << citr->guid;                             // guid\n         data << uint8(onlineState);                     // online-state\n@@ -1741,6 +2019,24 @@ void Group::SendUpdateToPlayer(ObjectGuid playerGUID, MemberSlot* slot)\n     player->SendDirectMessage(&data);\n }\n \n+//npcbot\n+void Group::UpdateBotOutOfRange(Creature* creature)\n+{\n+    if (!creature || !creature->IsInWorld() || m_memberMgr.IsEmpty())\n+        return;\n+\n+    WorldPacket data;\n+    BotMgr::BuildBotPartyMemberStatsChangedPacket(creature, &data);\n+\n+    for (GroupReference* itr = GetFirstMember(); itr != nullptr; itr = itr->next())\n+    {\n+        Player const*member = itr->GetSource();\n+        if (member/* && (!member->IsInMap(creature) || !member->IsWithinDist(creature, member->GetSightRange(), false))*/)\n+            member->SendDirectMessage(&data);\n+    }\n+}\n+//end npcbot\n+\n void Group::UpdatePlayerOutOfRange(Player* player)\n {\n     if (!player || !player->IsInWorld())\n@@ -1751,7 +2047,7 @@ void Group::UpdatePlayerOutOfRange(Player* player)\n \n     for (GroupReference* itr = GetFirstMember(); itr != nullptr; itr = itr->next())\n     {\n-        Player* member = itr->GetSource();\n+        Player const* member = itr->GetSource();\n         if (member && (!member->IsInMap(player) || !member->IsWithinDist(player, member->GetSightRange(player), false)))\n             member->SendDirectMessage(&data);\n     }\n@@ -1844,6 +2140,24 @@ void Group::ChangeMembersGroup(ObjectGuid guid, uint8 group)\n         CharacterDatabase.Execute(stmt);\n     }\n \n+    //npcbot\n+    if (guid.IsCreature())\n+    {\n+        Creature const* cbot = BotDataMgr::FindBot(guid.GetEntry());\n+        if (Creature* bot = cbot ? const_cast<Creature*>(cbot) : nullptr)\n+        {\n+            if (bot->GetBotGroup() == this)\n+                bot->SetOriginalSubGroup(group);\n+            else\n+            {\n+                // If player is in BG raid, it is possible that he is also in normal raid - and that normal raid is stored in m_originalGroup reference\n+                prevSubGroup = bot->GetOriginalSubGroup();\n+                bot->SetOriginalSubGroup(group);\n+            }\n+        }\n+    }\n+    else\n+    //end npcbot\n     // In case the moved player is online, update the player object with the new sub group references\n     if (Player* player = ObjectAccessor::FindConnectedPlayer(guid))\n     {\n@@ -2027,6 +2341,14 @@ GroupJoinBattlegroundResult Group::CanJoinBattlegroundQueue(Battleground const*\n         }\n     }\n \n+    //npcbot\n+    for (GroupBotReference* bitr = GetFirstBotMember(); bitr != nullptr; bitr = bitr->next(), ++memberscount)\n+    {\n+        if (!bitr->GetSource())\n+            return ERR_BATTLEGROUND_JOIN_FAILED;\n+    }\n+    //end npcbot\n+\n     // for arenas: check party size is proper\n     if (bgTemplate->isArena() && memberscount != MinPlayerCount)\n         return ERR_ARENA_TEAM_PARTY_SIZE;\n@@ -2442,12 +2764,26 @@ void Group::SetGroupMemberFlag(ObjectGuid guid, bool apply, GroupMemberFlags fla\n     ToggleGroupMemberFlag(slot, flag, apply);\n \n     // Preserve the new setting in the db\n+    //npcbot\n+    if (!guid.IsPlayer())\n+    {\n+        CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_NPCBOT_GROUP_MEMBER_FLAG);\n+        stmt->SetData(0, slot->flags);\n+        stmt->SetData(1, guid.GetEntry());\n+        CharacterDatabase.Execute(stmt);\n+    }\n+    else\n+    {\n+    //end npcbot\n     CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_GROUP_MEMBER_FLAG);\n \n     stmt->SetData(0, slot->flags);\n     stmt->SetData(1, guid.GetCounter());\n \n     CharacterDatabase.Execute(stmt);\n+    //npcbot\n+    }\n+    //end npcbot\n \n     // Broadcast the changes to the group\n     SendUpdate();\n@@ -2487,6 +2823,28 @@ void Group::LinkMember(GroupReference* pRef)\n     m_memberMgr.insertFirst(pRef);\n }\n \n+\n+//npcbot\n+void Group::LinkBotMember(GroupBotReference* bRef)\n+{\n+    m_botMemberMgr.insertFirst(bRef);\n+}\n+\n+void Group::DelinkBotMember(ObjectGuid guid)\n+{\n+    GroupBotReference* ref = m_botMemberMgr.getFirst();\n+    while (ref)\n+    {\n+        GroupBotReference* nextRef = ref->next();\n+        if (ref->GetSource()->GetGUID() == guid)\n+        {\n+            ref->unlink();\n+            break;\n+        }\n+        ref = nextRef;\n+    }\n+}\n+//end npcbot\n void Group::_initRaidSubGroupsCounter()\n {\n     // Sub group counters initialization\ndiff --git a/src/server/game/Groups/Group.h b/src/server/game/Groups/Group.h\nindex 5d2ca9e758..891c8616b9 100644\n--- a/src/server/game/Groups/Group.h\n+++ b/src/server/game/Groups/Group.h\n@@ -193,6 +193,16 @@ public:\n     bool   Create(Player* leader);\n     bool   LoadGroupFromDB(Field* field);\n     void   LoadMemberFromDB(ObjectGuid::LowType guidLow, uint8 memberFlags, uint8 subgroup, uint8 roles);\n+    //npcbot\n+    bool Create(Creature* leader);\n+    bool AddMember(Creature* creature);\n+    void LoadCreatureMemberFromDB(uint32 entry, uint8 memberFlags, uint8 subgroup, uint8 roles);\n+    void UpdateBotOutOfRange(Creature* creature);\n+    void LinkBotMember(GroupBotReference* bRef);\n+    void DelinkBotMember(ObjectGuid guid);\n+    GroupBotReference* GetFirstBotMember() { return m_botMemberMgr.getFirst(); }\n+    GroupBotReference const* GetFirstBotMember() const { return m_botMemberMgr.getFirst(); }\n+    //end npcbot\n     bool   AddInvite(Player* player);\n     void   RemoveInvite(Player* player);\n     void   RemoveAllInvites();\n@@ -325,6 +335,10 @@ public:\n \n     DataMap CustomData;\n \n+    //npcbots\n+    ObjectGuid const* GetTargetIcons() const { return m_targetIcons; }\n+    //end npcbots\n+\n protected:\n     void _homebindIfInstance(Player* player);\n     void _cancelHomebindIfInstance(Player* player);\n@@ -338,6 +352,9 @@ protected:\n \n     MemberSlotList      m_memberSlots;\n     GroupRefMgr     m_memberMgr;\n+    //npcbot\n+    GroupBotRefManager  m_botMemberMgr;\n+    //end npcbot\n     InvitesList         m_invitees;\n     ObjectGuid          m_leaderGuid;\n     std::string         m_leaderName;\ndiff --git a/src/server/game/Groups/GroupMgr.cpp b/src/server/game/Groups/GroupMgr.cpp\nindex 4ce8475385..1e91329673 100644\n--- a/src/server/game/Groups/GroupMgr.cpp\n+++ b/src/server/game/Groups/GroupMgr.cpp\n@@ -106,7 +106,14 @@ void GroupMgr::LoadGroups()\n         CharacterDatabase.DirectExecute(\"DELETE FROM `groups` WHERE leaderGuid NOT IN (SELECT guid FROM characters)\");\n \n         // Delete all groups with less than 2 members\n+        //npcbot: adjust this\n+        /*\n+        //end npcbot\n         CharacterDatabase.DirectExecute(\"DELETE FROM `groups` WHERE guid NOT IN (SELECT guid FROM group_member GROUP BY guid HAVING COUNT(guid) > 1)\");\n+        //npcbot\n+        */\n+        CharacterDatabase.DirectExecute(\"DELETE FROM `groups` WHERE guid NOT IN (SELECT guid from group_member GROUP BY guid HAVING (SELECT (SELECT COUNT(guid) FROM group_member) + (SELECT COUNT(guid) FROM characters_npcbot_group_member)) > 1)\");\n+        //end npcbot\n \n         // Delete invalid lfg_data\n         CharacterDatabase.DirectExecute(\"DELETE lfg_data FROM lfg_data LEFT JOIN `groups` ON lfg_data.guid = groups.guid WHERE groups.guid IS NULL OR groups.groupType <> 12\");\ndiff --git a/src/server/game/Groups/GroupRefMgr.h b/src/server/game/Groups/GroupRefMgr.h\nindex 3a965d1955..1cb68826d4 100644\n--- a/src/server/game/Groups/GroupRefMgr.h\n+++ b/src/server/game/Groups/GroupRefMgr.h\n@@ -30,4 +30,16 @@ public:\n     GroupReference* getFirst() { return ((GroupReference*)RefMgr<Group, Player>::getFirst()); }\n     GroupReference const* getFirst() const { return ((GroupReference const*)RefMgr<Group, Player>::getFirst()); }\n };\n+\n+//npcbot\n+class Creature;\n+class GroupBotReference;\n+\n+class GroupBotRefManager : public RefMgr<Group, Creature>\n+{\n+    public:\n+        GroupBotReference* getFirst() { return ((GroupBotReference*)RefMgr<Group, Creature>::getFirst()); }\n+        GroupBotReference const* getFirst() const { return ((GroupBotReference const*)RefMgr<Group, Creature>::getFirst()); }\n+};\n+//end npcbot\n #endif\ndiff --git a/src/server/game/Groups/GroupReference.cpp b/src/server/game/Groups/GroupReference.cpp\nindex 69f7df5135..c60ee69fa5 100644\n--- a/src/server/game/Groups/GroupReference.cpp\n+++ b/src/server/game/Groups/GroupReference.cpp\n@@ -33,3 +33,23 @@ void GroupReference::sourceObjectDestroyLink()\n {\n     // called from invalidate()\n }\n+\n+//npcbot\n+void GroupBotReference::targetObjectBuildLink()\n+{\n+    // called from link()\n+    getTarget()->LinkBotMember(this);\n+}\n+\n+void GroupBotReference::targetObjectDestroyLink()\n+{\n+    // called from unlink()\n+    //getTarget()->DelinkMember(this);\n+}\n+\n+void GroupBotReference::sourceObjectDestroyLink()\n+{\n+    // called from invalidate()\n+    //getTarget()->DelinkMember(this);\n+}\n+//end npcbot\ndiff --git a/src/server/game/Groups/GroupReference.h b/src/server/game/Groups/GroupReference.h\nindex dec6e6586b..c7379a219d 100644\n--- a/src/server/game/Groups/GroupReference.h\n+++ b/src/server/game/Groups/GroupReference.h\n@@ -38,4 +38,24 @@ public:\n     [[nodiscard]] uint8 getSubGroup() const { return iSubGroup; }\n     void setSubGroup(uint8 pSubGroup) { iSubGroup = pSubGroup; }\n };\n+\n+//npcbot\n+class Creature;\n+\n+class GroupBotReference : public Reference<Group, Creature>\n+{\n+    protected:\n+        uint8 iSubGroup;\n+        void targetObjectBuildLink() override;\n+        void targetObjectDestroyLink() override;\n+        void sourceObjectDestroyLink() override;\n+    public:\n+        GroupBotReference() : Reference<Group, Creature>(), iSubGroup(0) { }\n+        ~GroupBotReference() { unlink(); }\n+        GroupBotReference* next() { return (GroupBotReference*)Reference<Group, Creature>::next(); }\n+        GroupBotReference const* next() const { return (GroupBotReference const*)Reference<Group, Creature>::next(); }\n+        uint8 getSubGroup() const { return iSubGroup; }\n+        void setSubGroup(uint8 pSubGroup) { iSubGroup = pSubGroup; }\n+};\n+//end npcbot\n #endif\ndiff --git a/src/server/game/Handlers/BattleGroundHandler.cpp b/src/server/game/Handlers/BattleGroundHandler.cpp\nindex dba88af1b7..8148453292 100644\n--- a/src/server/game/Handlers/BattleGroundHandler.cpp\n+++ b/src/server/game/Handlers/BattleGroundHandler.cpp\n@@ -34,6 +34,12 @@\n #include \"WorldPacket.h\"\n #include \"WorldSession.h\"\n \n+//npcbot\n+#include \"botconfig.h\"\n+#include \"botdatamgr.h\"\n+#include \"botmgr.h\"\n+//end npcbot\n+\n void WorldSession::HandleBattlemasterHelloOpcode(WorldPacket& recvData)\n {\n     ObjectGuid guid;\n@@ -203,6 +209,22 @@ void WorldSession::HandleBattlemasterJoinOpcode(WorldPacket& recvData)\n             return;\n         }\n \n+        //npcbot: do not allow entering as group if there are bots in group\n+        if (_player->GetGroup() && _player->HaveBot())\n+        {\n+            for (auto const& mslot : _player->GetGroup()->GetMemberSlots())\n+            {\n+                if (mslot.guid.IsCreature() && _player->GetBotMgr()->GetBot(mslot.guid))\n+                {\n+                    WorldPacket data;\n+                    sBattlegroundMgr->BuildGroupJoinedBattlegroundPacket(&data, ERR_BATTLEGROUND_JOIN_FAILED);\n+                    _player->SendDirectMessage(&data);\n+                    return;\n+                }\n+            }\n+        }\n+        //end npcbot\n+\n         GroupQueueInfo* ginfo = bgQueue.AddGroup(_player, nullptr, bgTypeId, bracketEntry, 0, false, isPremade, 0, 0);\n         uint32 avgWaitTime = bgQueue.GetAverageQueueWaitTime(ginfo);\n         uint32 queueSlot = _player->AddBattlegroundQueueId(bgQueueTypeId);\n@@ -272,6 +294,10 @@ void WorldSession::HandleBattlemasterJoinOpcode(WorldPacket& recvData)\n         }\n \n         isPremade = (grp->GetMembersCount() >= bg->GetMinPlayersPerTeam() && bgTypeId != BATTLEGROUND_RB);\n+        //npcbot: check premade for bots\n+        if (isPremade && !BotCfg::IsNpcBotsPremadeEnabled() && grp->GetFirstBotMember() != nullptr)\n+            isPremade = false;\n+        //end npcbot\n         uint32 avgWaitTime = 0;\n \n         GroupQueueInfo* ginfo = bgQueue.AddGroup(_player, grp, bgTypeId, bracketEntry, 0, false, isPremade, 0, 0);\n@@ -290,6 +316,31 @@ void WorldSession::HandleBattlemasterJoinOpcode(WorldPacket& recvData)\n \n             sScriptMgr->OnPlayerJoinBG(member);\n         });\n+        //npcbot: debug report\n+        for (GroupReference* itr = grp->GetFirstMember(); itr != nullptr; itr = itr->next())\n+        {\n+            Player* member = itr->GetSource();\n+            if (!member)\n+                continue;   // this should never happen\n+\n+            LOG_DEBUG(\"bg.battleground\", \"Battleground: player joined queue for bg queue type {} bg type {}: GUID {}, NAME {}\",\n+                bgQueueTypeId, bgTypeId, member->GetGUID().ToString().c_str(), member->GetName().c_str());\n+\n+            if (!member->HaveBot())\n+                continue;\n+\n+            BotMap const* map = member->GetBotMgr()->GetBotMap();\n+            for (BotMap::const_iterator itr = map->begin(); itr != map->end(); ++itr)\n+            {\n+                Creature const* bot = itr->second;\n+                if (!bot || !grp->IsMember(bot->GetGUID()))\n+                    continue;\n+\n+                LOG_DEBUG(\"bg.battleground\", \"Battleground: NPCBot joined queue for bg queue type {} bg type {}: GUID {}, NAME {} (owner: {})\",\n+                    bgQueueTypeId, bgTypeId, bot->GetGUID().ToString().c_str(), bot->GetName().c_str(), member->GetName().c_str());\n+            }\n+        }\n+        //end npcbot\n     }\n \n     sBattlegroundMgr->ScheduleQueueUpdate(0, 0, bgQueueTypeId, bgTypeId, bracketEntry->GetBracketId());\n@@ -307,11 +358,24 @@ void WorldSession::HandleBattlegroundPlayerPositionsOpcode(WorldPacket& /*recvDa\n     Player* allianceFlagCarrier = nullptr;\n     Player* hordeFlagCarrier = nullptr;\n \n+    //npcbot\n+    Creature const* afcbot = nullptr;\n+    Creature const* hfcbot = nullptr;\n+    //end npcbot\n+\n     if (ObjectGuid guid = bg->GetFlagPickerGUID(TEAM_ALLIANCE))\n     {\n         allianceFlagCarrier = ObjectAccessor::FindPlayer(guid);\n         if (allianceFlagCarrier)\n             ++flagCarrierCount;\n+        //npcbot\n+        else if (guid.IsCreature())\n+        {\n+            afcbot = BotDataMgr::FindBot(guid.GetEntry());\n+            if (afcbot)\n+                ++flagCarrierCount;\n+        }\n+        //end npcbot\n     }\n \n     if (ObjectGuid guid = bg->GetFlagPickerGUID(TEAM_HORDE))\n@@ -319,6 +383,14 @@ void WorldSession::HandleBattlegroundPlayerPositionsOpcode(WorldPacket& /*recvDa\n         hordeFlagCarrier = ObjectAccessor::FindPlayer(guid);\n         if (hordeFlagCarrier)\n             ++flagCarrierCount;\n+        //npcbot\n+        else if (guid.IsCreature())\n+        {\n+            hfcbot = BotDataMgr::FindBot(guid.GetEntry());\n+            if (hfcbot)\n+                ++flagCarrierCount;\n+        }\n+        //end npcbot\n     }\n \n     WorldPacket data(MSG_BATTLEGROUND_PLAYER_POSITIONS, 4 + 4 + 16 * flagCarrierCount);\n@@ -335,6 +407,14 @@ void WorldSession::HandleBattlegroundPlayerPositionsOpcode(WorldPacket& /*recvDa\n         data << float(allianceFlagCarrier->GetPositionX());\n         data << float(allianceFlagCarrier->GetPositionY());\n     }\n+    //npcbot\n+    else if (afcbot)\n+    {\n+        data << afcbot->GetGUID();\n+        data << float(afcbot->GetPositionX());\n+        data << float(afcbot->GetPositionY());\n+    }\n+    //end npcbot\n \n     if (hordeFlagCarrier)\n     {\n@@ -342,6 +422,14 @@ void WorldSession::HandleBattlegroundPlayerPositionsOpcode(WorldPacket& /*recvDa\n         data << float(hordeFlagCarrier->GetPositionX());\n         data << float(hordeFlagCarrier->GetPositionY());\n     }\n+    //npcbot\n+    else if (hfcbot)\n+    {\n+        data << hfcbot->GetGUID();\n+        data << float(hfcbot->GetPositionX());\n+        data << float(hfcbot->GetPositionY());\n+    }\n+    //end npcbot\n \n     SendPacket(&data);\n }\n@@ -757,6 +845,21 @@ void WorldSession::HandleBattlemasterJoinArena(WorldPacket& recvData)\n         return;\n     }\n \n+    //npcbot\n+    bool have_bots_in_group = false;\n+    if (_player->GetGroup() && _player->HaveBot())\n+    {\n+        for (auto const& mslot : _player->GetGroup()->GetMemberSlots())\n+        {\n+            if (mslot.guid.IsCreature() && _player->GetBotMgr()->GetBot(mslot.guid))\n+            {\n+                have_bots_in_group = true;\n+                break;\n+            }\n+        }\n+    }\n+    //end npcbot\n+\n     BattlegroundQueueTypeId bgQueueTypeId = BattlegroundMgr::BGQueueTypeId(bgTypeId, arenatype);\n     BattlegroundQueue& bgQueue = sBattlegroundMgr->GetBattlegroundQueue(bgQueueTypeId);\n \n@@ -790,6 +893,16 @@ void WorldSession::HandleBattlemasterJoinArena(WorldPacket& recvData)\n         if (!_player->HasFreeBattlegroundQueueId())\n             return;\n \n+        //npcbot: do not allow entering as group if there are bots in group\n+        if (have_bots_in_group)\n+        {\n+            WorldPacket data;\n+            sBattlegroundMgr->BuildGroupJoinedBattlegroundPacket(&data, ERR_BATTLEGROUND_JOIN_FAILED);\n+            _player->SendDirectMessage(&data);\n+            return;\n+        }\n+        //end npcbot\n+\n         GroupQueueInfo* ginfo = bgQueue.AddGroup(_player, nullptr, bgTypeId, bracketEntry, arenatype, isRated != 0, false, arenaRating, matchmakerRating, ateamId, previousOpponents);\n         uint32 avgWaitTime = bgQueue.GetAverageQueueWaitTime(ginfo);\n         uint32 queueSlot = _player->AddBattlegroundQueueId(bgQueueTypeId);\n@@ -827,6 +940,16 @@ void WorldSession::HandleBattlemasterJoinArena(WorldPacket& recvData)\n                 return;\n             }\n \n+            //npcbot: do not allow bots in rated matches\n+            if (have_bots_in_group)\n+            {\n+                WorldPacket data;\n+                sBattlegroundMgr->BuildGroupJoinedBattlegroundPacket(&data, ERR_BATTLEGROUND_JOIN_TIMED_OUT);\n+                _player->SendDirectMessage(&data);\n+                return;\n+            }\n+            //end npcbot\n+\n             // get team rating for queueing\n             arenaRating = at->GetRating();\n             matchmakerRating = at->GetAverageMMR(grp);\n@@ -895,6 +1018,22 @@ void WorldSession::HandleBattlemasterJoinArena(WorldPacket& recvData)\n             LOG_DEBUG(\"bg.battleground\", \"Battleground: player joined queue for arena as group bg queue type {} bg type {}: {}, NAME {}\", bgQueueTypeId, bgTypeId, member->GetGUID().ToString(), member->GetName());\n \n             sScriptMgr->OnPlayerJoinArena(member);\n+\n+            //npcbot: list bots\n+            if (!member->HaveBot())\n+                continue;\n+\n+            BotMap const* map = member->GetBotMgr()->GetBotMap();\n+            for (BotMap::const_iterator itr = map->begin(); itr != map->end(); ++itr)\n+            {\n+                Creature const* bot = itr->second;\n+                if (!bot || !grp->IsMember(bot->GetGUID()))\n+                    continue;\n+\n+                LOG_DEBUG(\"bg.battleground\", \"Battleground: NPCBot joined queue for arena bg queue type {} bg type {}: GUID {}, NAME {} (owner: {})\",\n+                    bgQueueTypeId, bgTypeId, bot->GetGUID().ToString(), bot->GetName(), member->GetName());\n+            }\n+            //end npcbot\n         }\n     }\n \ndiff --git a/src/server/game/Handlers/GroupHandler.cpp b/src/server/game/Handlers/GroupHandler.cpp\nindex d3bf30d1fd..8cdd98c813 100644\n--- a/src/server/game/Handlers/GroupHandler.cpp\n+++ b/src/server/game/Handlers/GroupHandler.cpp\n@@ -37,6 +37,12 @@\n #include \"WorldPacket.h\"\n #include \"WorldSession.h\"\n \n+//npcbot: try query bot name\n+#include \"CreatureData.h\"\n+#include \"botdatamgr.h\"\n+#include \"botmgr.h\"\n+//end npcbot\n+\n class Aura;\n \n /* differeces from off:\n@@ -642,6 +648,17 @@ void WorldSession::HandleGroupChangeSubGroupOpcode(WorldPacket& recvData)\n         guid = sCharacterCache->GetCharacterGuidByName(name);\n     }\n \n+    //npcbot\n+    if (guid.IsEmpty())\n+    {\n+        if (Creature const* bot = BotDataMgr::FindBot(name, GetSessionDbcLocale()))\n+            guid = bot->GetGUID();\n+    }\n+\n+    if (guid.IsEmpty())\n+        return;\n+    //end npcbot\n+\n     group->ChangeMembersGroup(guid, groupNr);\n }\n \n@@ -944,6 +961,32 @@ void WorldSession::HandleRequestPartyMemberStatsOpcode(WorldPacket& recvData)\n     ObjectGuid Guid;\n     recvData >> Guid;\n \n+    //npcbot: try send bot group member info\n+    if (Guid.IsCreature())\n+    {\n+        if (!GetPlayer()->GetGroup() || !GetPlayer()->GetGroup()->IsMember(Guid))\n+        {\n+            WorldPacket data(SMSG_PARTY_MEMBER_STATS_FULL, 3+4+2);\n+            data << uint8(0);\n+            data << Guid.WriteAsPacked();\n+            data << uint32(GROUP_UPDATE_FLAG_STATUS);\n+            data << uint16(MEMBER_STATUS_OFFLINE);\n+            SendPacket(&data);\n+            return;\n+        }\n+\n+        uint32 creatureId = Guid.GetEntry();\n+        CreatureTemplate const* creatureTemplate = sObjectMgr->GetCreatureTemplate(creatureId);\n+        if (creatureTemplate && creatureTemplate->IsNPCBot())\n+        {\n+            WorldPacket bpdata(SMSG_PARTY_MEMBER_STATS_FULL, 4+2+2+2+1+2*6+8+1+8);\n+            BotMgr::BuildBotPartyMemberStatsPacket(Guid, &bpdata);\n+            SendPacket(&bpdata);\n+            return;\n+        }\n+    }\n+    //end npcbot\n+\n     Player* player = HashMapHolder<Player>::Find(Guid);\n     if (!player || !player->IsInSameRaidWith(_player))\n     {\ndiff --git a/src/server/game/Handlers/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp\nindex c2cc245b6a..118356c4c5 100644\n--- a/src/server/game/Handlers/ItemHandler.cpp\n+++ b/src/server/game/Handlers/ItemHandler.cpp\n@@ -31,6 +31,10 @@\n \n #include \"ItemPackets.h\"\n \n+// npcbot\n+#include \"botmgr.h\"\n+//end npcbot\n+\n void WorldSession::HandleSplitItemOpcode(WorldPackets::Item::SplitItem& packet)\n {\n     //LOG_DEBUG(\"network.opcode\", \"WORLD: CMSG_SPLIT_ITEM\");\n@@ -910,6 +914,15 @@ void WorldSession::SendListInventory(ObjectGuid vendorGuid, uint32 vendorEntry)\n         {\n             if (ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(item->item))\n             {\n+                // npcbot\n+                if (_player->HaveBot())\n+                {\n+                    if (!(itemTemplate->AllowableClass & (_player->GetClassMask() | _player->GetBotMgr()->GetAllNpcBotsClassMask())) &&\n+                        itemTemplate->Bonding == BIND_WHEN_PICKED_UP && !_player->IsGameMaster())\n+                        continue;\n+                }\n+                else\n+                // end npcbot\n                 if (!(itemTemplate->AllowableClass & _player->getClassMask()) && itemTemplate->Bonding == BIND_WHEN_PICKED_UP && !_player->IsGameMaster())\n                 {\n                     continue;\n@@ -1072,7 +1085,13 @@ void WorldSession::HandleItemNameQueryOpcode(WorldPacket& recvData)\n     {\n         std::string Name = pName->name;\n         LocaleConstant loc_idx = GetSessionDbLocaleIndex();\n+        //npcbot: pointless check, see AccountInfo()\n+        /*\n+        //end npcbot\n         if (loc_idx >= 0)\n+        //npcbot\n+        */\n+        //end npcbot\n             if (ItemSetNameLocale const* isnl = sObjectMgr->GetItemSetNameLocale(itemid))\n                 ObjectMgr::GetLocaleString(isnl->Name, loc_idx, Name);\n \ndiff --git a/src/server/game/Handlers/LootHandler.cpp b/src/server/game/Handlers/LootHandler.cpp\nindex 50636f27c7..dd585f1399 100644\n--- a/src/server/game/Handlers/LootHandler.cpp\n+++ b/src/server/game/Handlers/LootHandler.cpp\n@@ -30,6 +30,11 @@\n #include \"WorldPacket.h\"\n #include \"WorldSession.h\"\n \n+//npcbot\n+#include \"botconfig.h\"\n+#include \"botmgr.h\"\n+//end npcbot\n+\n void WorldSession::HandleAutostoreLootItemOpcode(WorldPacket& recvData)\n {\n     LOG_DEBUG(\"network\", \"WORLD: CMSG_AUTOSTORE_LOOT_ITEM\");\n@@ -181,6 +186,50 @@ void WorldSession::HandleLootMoneyOpcode(WorldPacket& /*recvData*/)\n     {\n         sScriptMgr->OnPlayerBeforeLootMoney(player, loot);\n         loot->NotifyMoneyRemoved();\n+        //npcbot\n+        if (shareMoney && player->GetGroup() && BotCfg::GetNpcBotMoneyShareEnabled())\n+        {\n+            Group* group = player->GetGroup();\n+            std::vector<Player*> playersNear;\n+            uint32 bots_count = 0;\n+            for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())\n+            {\n+                Player* member = itr->GetSource();\n+                if (!member)\n+                    continue;\n+\n+                if (player->IsAtGroupRewardDistance(member))\n+                    playersNear.push_back(member);\n+\n+                if (!member->HaveBot())\n+                    continue;\n+\n+                BotMap const* botMap = member->GetBotMgr()->GetBotMap();\n+                for (auto const& kv : *botMap)\n+                {\n+                    Creature const* bot = kv.second;\n+                    if (bot && bot->IsAlive() && bot->IsInMap(player) && (group->IsMember(kv.first) || !BotCfg::GetNpcBotMoneyShareGroupOnly()) &&\n+                        (member->GetMap()->IsDungeon() || player->GetDistance(bot) <= sWorld->getFloatConfig(CONFIG_GROUP_XP_DISTANCE)))\n+                        ++bots_count;\n+                }\n+            }\n+\n+            uint32 sharers_count = uint32(playersNear.size()) + bots_count;\n+            uint32 goldPerPlayer = uint32(loot->gold / sharers_count);\n+\n+            for (std::vector<Player*>::const_iterator i = playersNear.begin(); i != playersNear.end(); ++i)\n+            {\n+                (*i)->ModifyMoney(goldPerPlayer);\n+                (*i)->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LOOT_MONEY, goldPerPlayer);\n+\n+                WorldPacket data(SMSG_LOOT_MONEY_NOTIFY, 4 + 1);\n+                data << uint32(goldPerPlayer);\n+                data << uint8(sharers_count <= 1); // Controls the text displayed in chat. 0 is \"Your share is...\" and 1 is \"You loot...\"\n+                (*i)->SendDirectMessage(&data);\n+            }\n+        }\n+        else\n+        //end npcbot\n         if (shareMoney && player->GetGroup())      //item, pickpocket and players can be looted only single player\n         {\n             Group* group = player->GetGroup();\ndiff --git a/src/server/game/Handlers/QueryHandler.cpp b/src/server/game/Handlers/QueryHandler.cpp\nindex 478dbe5abe..ee707f029a 100644\n--- a/src/server/game/Handlers/QueryHandler.cpp\n+++ b/src/server/game/Handlers/QueryHandler.cpp\n@@ -29,8 +29,47 @@\n #include \"WorldPacket.h\"\n #include \"WorldSession.h\"\n \n+//npcbot\n+#include \"CreatureData.h\"\n+#include \"botdatamgr.h\"\n+#include \"botmgr.h\"\n+//end npcbot\n+\n void WorldSession::SendNameQueryOpcode(ObjectGuid guid)\n {\n+    //npcbot: try query bot info\n+    if (guid.IsCreature())\n+    {\n+        uint32 creatureId = guid.GetEntry();\n+        CreatureTemplate const* creatureTemplate = sObjectMgr->GetCreatureTemplate(creatureId);\n+        if (creatureTemplate && creatureTemplate->IsNPCBot())\n+        {\n+            std::string creatureName = creatureTemplate->Name;\n+            if (CreatureLocale const* creatureInfo = sObjectMgr->GetCreatureLocale(creatureId))\n+            {\n+                uint32 loc = GetSessionDbLocaleIndex();\n+                if (creatureInfo->Name.size() > loc && !creatureInfo->Name[loc].empty() && Utf8FitTo(creatureInfo->Name[loc], {}))\n+                    creatureName = creatureInfo->Name[loc];\n+            }\n+\n+            NpcBotExtras const* extData = ASSERT_NOTNULL(BotDataMgr::SelectNpcBotExtras(creatureId));\n+            NpcBotAppearanceData const* appData = BotDataMgr::SelectNpcBotAppearance(creatureId);\n+\n+            WorldPacket bpdata(SMSG_NAME_QUERY_RESPONSE, (8+1+1+1+1+1+10));\n+            bpdata << guid.WriteAsPacked();\n+            bpdata << uint8(0);\n+            bpdata << creatureName;\n+            bpdata << uint8(0);\n+            bpdata << uint8(BotMgr::GetBotPlayerRace(extData->bclass, extData->race));\n+            bpdata << uint8(appData ? appData->gender : uint8(GENDER_MALE));\n+            bpdata << uint8(BotMgr::GetBotPlayerClass(extData->bclass));\n+            bpdata << uint8(0);\n+            SendPacket(&bpdata);\n+            return;\n+        }\n+    }\n+    //end npcbot\n+\n     CharacterCacheEntry const* playerData = sCharacterCache->GetCharacterCacheByGuid(guid);\n \n     WorldPackets::Query::NameQueryResponse nameQueryResponse;\n@@ -100,7 +139,13 @@ void WorldSession::HandleCreatureQueryOpcode(WorldPacket& recvData)\n         Title = ci->SubName;\n \n         LocaleConstant loc_idx = GetSessionDbLocaleIndex();\n+        //npcbot: pointless check, see AccountInfo()\n+        /*\n+        //end npcbot\n         if (loc_idx >= 0)\n+        //npcbot\n+        */\n+        //end npcbot\n         {\n             if (CreatureLocale const* cl = sObjectMgr->GetCreatureLocale(entry))\n             {\ndiff --git a/src/server/game/Handlers/SpellHandler.cpp b/src/server/game/Handlers/SpellHandler.cpp\nindex bbb3a1f559..8162f20acf 100644\n--- a/src/server/game/Handlers/SpellHandler.cpp\n+++ b/src/server/game/Handlers/SpellHandler.cpp\n@@ -32,6 +32,12 @@\n #include \"WorldPacket.h\"\n #include \"WorldSession.h\"\n \n+//npcbot\n+#include \"bot_ai.h\"\n+#include \"botconfig.h\"\n+#include \"botdatamgr.h\"\n+//end npcbot\n+\n void WorldSession::HandleClientCastFlags(WorldPacket& recvPacket, uint8 castFlags, SpellCastTargets& targets)\n {\n     // some spell cast packet including more data (for projectiles?)\n@@ -747,6 +753,109 @@ void WorldSession::HandleMirrorImageDataRequest(WorldPacket& recvData)\n     if (!unit)\n         return;\n \n+    //npcbot\n+    if (unit->GetTypeId() == TYPEID_UNIT)\n+    {\n+        CreatureOutfitContainer const& outfits = sObjectMgr->GetCreatureOutfitMap();\n+        CreatureOutfitContainer::const_iterator it = outfits.find(unit->GetEntry());\n+        if (it != outfits.end())\n+        {\n+            WorldPacket data(SMSG_MIRRORIMAGE_DATA, 68);\n+            data << guid;\n+            data << uint32(unit->GetNativeDisplayId()); // displayId\n+            data << uint8(it->second.race);             // race\n+            data << uint8(it->second.gender);           // gender\n+            data << uint8(unit->GetClass());            // class\n+            data << uint8(it->second.skin);             // skin\n+            data << uint8(it->second.face);             // face\n+            data << uint8(it->second.hair);             // hair\n+            data << uint8(it->second.haircolor);        // haircolor\n+            data << uint8(it->second.facialhair);       // facialhair\n+            data << uint32(0);                          // guildId\n+\n+            // item displays\n+            for (uint8 i = 0; i != MAX_CREATURE_OUTFIT_DISPLAYS; ++i)\n+                data << uint32(it->second.outfit[i]);\n+\n+            SendPacket(&data);\n+            return;\n+        }\n+\n+        //npcbot minion without a record in outfits table\n+        //OR\n+        //npcbot's mirror image\n+        Creature const* bot = unit->ToCreature();\n+        if (!bot->IsNPCBot() && unit->HasAuraType(SPELL_AURA_CLONE_CASTER))\n+            if (Unit const* creator = unit->GetAuraEffectsByType(SPELL_AURA_CLONE_CASTER).front()->GetCaster())\n+                if (creator->IsNPCBot())\n+                    bot = creator->ToCreature();\n+\n+        if (bot->IsNPCBot())\n+        {\n+            NpcBotAppearanceData const* appearData = BotDataMgr::SelectNpcBotAppearance(bot->GetEntry());\n+\n+            WorldPacket data(SMSG_MIRRORIMAGE_DATA, 68);\n+            data << guid;\n+            data << uint32(bot->GetDisplayId());                                       // displayId\n+            data << uint8(bot->GetRace());                                             // race\n+            data << uint8(appearData ? appearData->gender : (uint8)bot->GetGender());  // gender\n+            data << uint8(bot->GetBotAI()->GetPlayerClass());                          // class\n+            data << uint8(appearData ? appearData->skin : 0);                          // skin\n+            data << uint8(appearData ? appearData->face : 0);                          // face\n+            data << uint8(appearData ? appearData->hair : 0);                          // hair\n+            data << uint8(appearData ? appearData->haircolor : 0);                     // haircolor\n+            data << uint8(appearData ? appearData->features : 0);                      // facialhair\n+            data << uint32(0);                                                         // guildId\n+\n+            static uint8 const botItemSlots[MAX_CREATURE_OUTFIT_DISPLAYS] =\n+            {\n+                BOT_SLOT_HEAD,\n+                BOT_SLOT_SHOULDERS,\n+                BOT_SLOT_BODY,\n+                BOT_SLOT_CHEST,\n+                BOT_SLOT_WAIST,\n+                BOT_SLOT_LEGS,\n+                BOT_SLOT_FEET,\n+                BOT_SLOT_WRIST,\n+                BOT_SLOT_HANDS,\n+                BOT_SLOT_BACK,\n+                0//tabard\n+            };\n+\n+            // Display items in visible slots\n+            for (uint8 i = 0; i != MAX_CREATURE_OUTFIT_DISPLAYS; ++i)\n+            {\n+                uint8 slot = botItemSlots[i];\n+                //Items not displayed on bot: tabard, head, back\n+                if (slot == 0 ||\n+                    (slot == BOT_SLOT_HEAD && BotCfg::ShowEquippedHelm() == false) ||\n+                    (slot == BOT_SLOT_BACK && BotCfg::ShowEquippedCloak() == false))\n+                {\n+                    data << uint32(0);\n+                    continue;\n+                }\n+\n+                uint32 display_id = bot->GetBotAI()->GetEquipDisplayId(slot);\n+                if (display_id)\n+                    data << uint32(display_id);\n+                else\n+                {\n+                    //don't allow to go naked\n+                    if (slot == BOT_SLOT_CHEST)\n+                        data << uint32(CHEST_HALISCAN);\n+                    else if (slot == BOT_SLOT_LEGS)\n+                        data << uint32(LEGS_HALISCAN);\n+                    else\n+                        data << uint32(0);\n+                }\n+            }\n+\n+            SendPacket(&data);\n+            return;\n+        }\n+    }\n+    //end npcbot\n+\n     if (!unit->HasCloneCasterAura())\n         return;\n \ndiff --git a/src/server/game/Instances/InstanceScript.cpp b/src/server/game/Instances/InstanceScript.cpp\nindex 94b367e61c..ba577e11d7 100644\n--- a/src/server/game/Instances/InstanceScript.cpp\n+++ b/src/server/game/Instances/InstanceScript.cpp\n@@ -32,6 +32,10 @@\n #include \"Spell.h\"\n #include \"WorldSession.h\"\n \n+//npcbot\n+#include \"botmgr.h\"\n+//end npcbot\n+\n BossBoundaryData::~BossBoundaryData()\n {\n     for (const_iterator it = begin(); it != end(); ++it)\n@@ -692,6 +696,14 @@ void InstanceScript::DoRemoveAurasDueToSpellOnPlayers(uint32 spell)\n         player->RemoveAurasDueToSpell(spell);\n         if (Pet* pet = player->GetPet())\n             pet->RemoveAurasDueToSpell(spell);\n+                //npcbot: include bots\n+                if (player->HaveBot())\n+                {\n+                    for (auto const& bitr : *player->GetBotMgr()->GetBotMap())\n+                        if (bitr.second && bitr.second->IsInWorld())\n+                            DoRemoveAurasDueToSpellOnNPCBot(bitr.second, spell);\n+                }\n+                //end npcbot\n     });\n }\n \n@@ -701,9 +713,35 @@ void InstanceScript::DoCastSpellOnPlayers(uint32 spell)\n     instance->DoForAllPlayers([&](Player* player)\n     {\n         player->CastSpell(player, spell, true);\n+        //npcbot: include bots\n+        if (player->HaveBot())\n+        {\n+            for (auto const& bitr : *player->GetBotMgr()->GetBotMap())\n+                if (bitr.second && bitr.second->IsInWorld())\n+                    DoCastSpellOnNPCBot(bitr.second, spell);\n+        }\n+        //end npcbot\n     });\n }\n \n+//npcbot: hooks\n+void InstanceScript::DoRemoveAurasDueToSpellOnNPCBot(Creature* bot, uint32 spell)\n+{\n+    ASSERT(bot && bot->IsNPCBot() && bot->IsInWorld() && !bot->IsFreeBot());\n+    bot->RemoveAurasDueToSpell(spell);\n+    if (Unit* botpet = bot->GetBotsPet())\n+        botpet->RemoveAurasDueToSpell(spell);\n+}\n+\n+void InstanceScript::DoCastSpellOnNPCBot(Creature* bot, uint32 spell)\n+{\n+    ASSERT(bot && bot->IsNPCBot() && bot->IsInWorld() && !bot->IsFreeBot());\n+    bot->CastSpell(bot, spell, true);\n+    if (Unit* botpet = bot->GetBotsPet())\n+        botpet->CastSpell(botpet, spell, true);\n+}\n+//end npcbot\n+\n void InstanceScript::DoCastSpellOnPlayer(Player* player, uint32 spell, bool includePets /*= false*/, bool includeControlled /*= false*/)\n {\n     if (!player)\ndiff --git a/src/server/game/Instances/InstanceScript.h b/src/server/game/Instances/InstanceScript.h\nindex ba05588eea..acd6e798e7 100644\n--- a/src/server/game/Instances/InstanceScript.h\n+++ b/src/server/game/Instances/InstanceScript.h\n@@ -193,6 +193,13 @@ public:\n     //Called when a player enters/leaves water bodies.\n     virtual void OnPlayerInWaterStateUpdate(Player* /*player*/, bool /*inWater*/) {}\n \n+    //npcbot: map hooks\n+    virtual void OnNPCBotEnter(Creature* /*bot*/) { }\n+    virtual void OnNPCBotLeave(Creature* /*bot*/) { }\n+    void DoRemoveAurasDueToSpellOnNPCBot(Creature* bot, uint32 spell);\n+    void DoCastSpellOnNPCBot(Creature* bot, uint32 spell);\n+    //end npcbot\n+\n     /**\n      * @brief Open or close a GameObject by GUID.\n      * @param guid The GUID of the GameObject. Pass ObjectGuid::Empty when providing the go pointer directly.\ndiff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp\nindex 89cdd4bbfe..a7d6efb51f 100644\n--- a/src/server/game/Maps/Map.cpp\n+++ b/src/server/game/Maps/Map.cpp\n@@ -44,6 +44,10 @@\n #include \"Weather.h\"\n #include \"WeatherMgr.h\"\n \n+//npcbot\n+#include \"botmgr.h\"\n+//end npcbot\n+\n #define MAP_INVALID_ZONE        0xFFFFFFFF\n \n ZoneDynamicInfo::ZoneDynamicInfo() : MusicId(0), DefaultWeather(nullptr), WeatherId(WEATHER_STATE_FINE),\n@@ -334,6 +338,9 @@ bool Map::AddToMap(T* obj, bool checkTransport)\n     //obj->SetMap(this);\n     obj->AddToWorld();\n \n+    //npcbot: do not add bots to transport (handled inside AI)\n+    if (!obj->IsNPCBotOrPet())\n+    //end npcbot\n     if (checkTransport)\n         if (!(obj->IsGameObject() && obj->ToGameObject()->IsTransport())) // dont add transport to transport ;d\n             if (Transport* transport = GetTransportForPos(obj->GetPhaseMask(), obj->GetPositionX(), obj->GetPositionY(), obj->GetPositionZ(), obj))\n@@ -724,6 +731,34 @@ void Map::AfterPlayerUnlinkFromMap()\n template<class T>\n void Map::RemoveFromMap(T* obj, bool remove)\n {\n+    //npcbot: tempfix for bots out of grid during remove from map\n+    if constexpr (std::is_base_of_v<Creature, T>)\n+    {\n+        if (obj->IsNPCBot())\n+        {\n+            obj->RemoveFromWorld();\n+\n+            if (obj->IsInGrid())\n+                obj->RemoveFromGrid();\n+            else\n+            {\n+                Player const* owner = obj->ToCreature()->GetBotOwner();\n+                BOT_LOG_ERROR(\"npcbots\", \"Map::Remove<Bot>FromMap() bot {} id {} is in map id {} \\\"{}\\\" instanceId {} but not in grid!\\nmaster: {}\\nmaster map id {} \\\"{}\\\"\",\n+                    obj->GetName(), obj->GetEntry(), GetId(), GetMapName(), i_InstanceId, owner ? owner->GetGUID().ToString() : std::string{ \"Unknown\" },\n+                    (owner && owner->IsInWorld()) ? owner->GetMap()->GetId() : 0u, (owner && owner->IsInWorld()) ? std::string(owner->GetMap()->GetMapName()) : std::string{\"Unknown\"});\n+            }\n+\n+            obj->ResetMap();\n+            RemoveObjectFromMapUpdateList(obj);\n+\n+            if (remove)\n+                DeleteFromWorld(obj);\n+\n+            return;\n+        }\n+    }\n+    //end npcbot\n+\n     obj->RemoveFromWorld();\n \n     obj->RemoveFromGrid();\n@@ -816,6 +851,21 @@ void Map::CreatureRelocation(Creature* creature, float x, float y, float z, floa\n     else\n         RemoveCreatureFromMoveList(creature);\n \n+    //npcbot:\n+    if (creature->IsNPCBotOrPet() && !creature->GetVehicle())\n+    {\n+        float old_orientation = creature->GetOrientation();\n+        float current_z = creature->GetPositionZ();\n+        bool turn = (old_orientation != o);\n+        bool relocated = (creature->GetPositionX() != x || creature->GetPositionY() != y || current_z != z);\n+        uint32 mask = 0;\n+        if (turn) mask |= AURA_INTERRUPT_FLAG_TURNING;\n+        if (relocated) mask |= AURA_INTERRUPT_FLAG_MOVE;\n+        if (mask)\n+            creature->RemoveAurasWithInterruptFlags(mask);\n+    }\n+    //end npcbot\n+\n     creature->Relocate(x, y, z, o);\n     if (creature->IsVehicle())\n         creature->GetVehicleKit()->RelocatePassengers();\n@@ -1815,7 +1865,26 @@ uint32 Map::GetPlayersCountExceptGMs() const\n     uint32 count = 0;\n     for (MapRefMgr::const_iterator itr = m_mapRefMgr.begin(); itr != m_mapRefMgr.end(); ++itr)\n         if (!itr->GetSource()->IsGameMaster())\n+        //npcbot - count npcbots as group members (event if not in group)\n+        {\n+            if (itr->GetSource()->HaveBot() && BotMgr::LimitBots(this))\n+            {\n+                ++count;\n+                BotMap const* botmap = itr->GetSource()->GetBotMgr()->GetBotMap();\n+                for (BotMap::const_iterator itr = botmap->begin(); itr != botmap->end(); ++itr)\n+                {\n+                    Creature* cre = itr->second;\n+                    if (!cre || !cre->IsInWorld() || cre->FindMap() != this || cre->IsTempBot())\n+                        continue;\n+                    ++count;\n+                }\n+                continue;\n+            }\n+        //end npcbot\n             ++count;\n+        //npcbot\n+        }\n+        //end npcbot\n     return count;\n }\n \ndiff --git a/src/server/game/Maps/MapMgr.cpp b/src/server/game/Maps/MapMgr.cpp\nindex 94044f7997..b4fd400c92 100644\n--- a/src/server/game/Maps/MapMgr.cpp\n+++ b/src/server/game/Maps/MapMgr.cpp\n@@ -35,6 +35,11 @@\n #include \"World.h\"\n #include \"WorldPacket.h\"\n \n+//npcbot\n+#include \"botdatamgr.h\"\n+#include \"botmgr.h\"\n+//end npcbot\n+\n MapMgr::MapMgr()\n {\n     i_timer[3].SetInterval(sWorld->getIntConfig(CONFIG_INTERVAL_MAPUPDATE));\n@@ -59,6 +64,10 @@ void MapMgr::Initialize()\n     // Start mtmaps if needed\n     if (num_threads > 0)\n         m_updater.activate(num_threads);\n+\n+    //npcbot: load bots\n+    BotMgr::Initialize();\n+    //end npcbot\n }\n \n void MapMgr::InitializeVisibilityDistanceInfo()\n@@ -252,6 +261,10 @@ void MapMgr::Update(uint32 diff)\n     for (uint8 i = 0; i < 4; ++i)\n         i_timer[i].Update(diff);\n \n+    //npcbot\n+    BotDataMgr::Update(diff);\n+    //end npcbot\n+\n     // pussywizard: lfg compatibles update, schedule before maps so it is processed from the very beginning\n     //if (mapUpdateStep == 0)\n     {\n@@ -278,6 +291,10 @@ void MapMgr::Update(uint32 diff)\n     if (m_updater.activated())\n         m_updater.wait();\n \n+    //npcbot\n+    BotMgr::HandleDelayedTeleports();\n+    //end npcbot\n+\n     if (mapUpdateStep < 3)\n     {\n         for (iter = i_maps.begin(); iter != i_maps.end(); ++iter)\ndiff --git a/src/server/game/Movement/MotionMaster.cpp b/src/server/game/Movement/MotionMaster.cpp\nindex 0801edecfd..90d330ab73 100644\n--- a/src/server/game/Movement/MotionMaster.cpp\n+++ b/src/server/game/Movement/MotionMaster.cpp\n@@ -669,6 +669,26 @@ void MotionMaster::MoveJump(float x, float y, float z, float speedXY, float spee\n     if (speedXY <= 0.1f)\n         return;\n \n+    //npcbot: blademaser only (disabled)\n+    /*\n+    if (_owner->IsNPCBot())\n+    {\n+        Movement::MoveSplineInit init(_owner);\n+        init.MoveTo(x, y, z, false);\n+        init.SetParabolic(speedZ, 0);\n+        init.SetFacing(o);\n+        init.SetOrientationFixed(true);\n+        init.SetVelocity(speedXY);\n+\n+        GenericMovementGenerator* movement = new GenericMovementGenerator(std::move(init), EFFECT_MOTION_TYPE, EVENT_JUMP);\n+        movement->Priority = MOTION_PRIORITY_HIGHEST;\n+        movement->BaseUnitState = UNIT_STATE_JUMPING;\n+        Add(movement);\n+        return;\n+    }\n+    */\n+    //end npcbot\n+\n     float moveTimeHalf = speedZ / Movement::gravity;\n     float max_height = -Movement::computeFallElevation(moveTimeHalf, false, -speedZ);\n \ndiff --git a/src/server/game/Movement/MotionMaster.h b/src/server/game/Movement/MotionMaster.h\nindex c33c29473e..ba721fc632 100644\n--- a/src/server/game/Movement/MotionMaster.h\n+++ b/src/server/game/Movement/MotionMaster.h\n@@ -276,6 +276,10 @@ public:\n     bool GetDestination(float& x, float& y, float& z);\n \n     void DistanceYourself(float range);\n+\n+    //npcbot: add an accessor for Mutate\n+    void Add(MovementGenerator* m, MovementSlot slot = MOTION_SLOT_ACTIVE) { Mutate(m, slot); }\n+    //end npcbot\n private:\n     void Mutate(MovementGenerator* m, MovementSlot slot);                  // use Move* functions instead\n \ndiff --git a/src/server/game/Movement/MovementGenerators/PointMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/PointMovementGenerator.cpp\nindex 66ba79be59..b034aa265e 100644\n--- a/src/server/game/Movement/MovementGenerators/PointMovementGenerator.cpp\n+++ b/src/server/game/Movement/MovementGenerators/PointMovementGenerator.cpp\n@@ -79,7 +79,14 @@ void PointMovementGenerator<T>::DoInitialize(T* unit)\n             i_y += 0.2f * std::sin(unit->GetOrientation());\n         }\n \n+        //npcbot: fix a bug - spline always generates path, !!_generatePath is False!!\n+        /*\n+        //end npcbot\n         init.MoveTo(i_x, i_y, i_z, true);\n+        //npcbot\n+        */\n+        init.MoveTo(i_x, i_y, i_z, false);\n+        //end npcbot\n     }\n     if (speed > 0.0f)\n         init.SetVelocity(speed);\ndiff --git a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp\nindex 188578ea05..a941400ceb 100644\n--- a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp\n+++ b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp\n@@ -448,6 +448,28 @@ static Optional<float> GetVelocity(Unit* owner, Unit* target, G3D::Vector3 const\n \n     bool isPetLike = owner->IsPet() || owner->IsGuardian() || owner->GetGUID() == target->GetCritterGUID() || owner->GetCharmerOrOwnerGUID() == target->GetGUID();\n \n+    //npcbot\n+    if (owner->IsNPCBotPet() && (target->GetGUID() == owner->GetOwnerGUID() || target->GetGUID() == owner->GetCreatorGUID()))\n+    {\n+        UnitMoveType moveType = Movement::SelectSpeedType(target->GetUnitMovementFlags());\n+        speed = target->GetSpeed(moveType);\n+        float distance = owner->GetDistance2d(dest.x, dest.y) - target->GetObjectSize() - (*speed / 2.f);\n+        if (distance > 0.f)\n+        {\n+            float multiplier;\n+            if (distance > 50.0f)\n+                multiplier = 2.0f;\n+            else if (distance > 30.0f)\n+                multiplier = 1.5f;\n+            else if (distance > 10.0f)\n+                multiplier = 1.25f;\n+            else\n+                multiplier = 1.f + (distance / 10.f);\n+            *speed *= multiplier;\n+        }\n+    }\n+    else\n+    //end npcbot\n     // For pets/guardians/critters or creature-to-creature follow: sync with target's speed\n     if (isPetLike || (owner->IsCreature() && target->IsCreature()))\n     {\ndiff --git a/src/server/game/Movement/Spline/MoveSplineInit.cpp b/src/server/game/Movement/Spline/MoveSplineInit.cpp\nindex 16b58a45df..15612782bc 100644\n--- a/src/server/game/Movement/Spline/MoveSplineInit.cpp\n+++ b/src/server/game/Movement/Spline/MoveSplineInit.cpp\n@@ -100,6 +100,11 @@ namespace Movement\n                 moveFlagsForSpeed &= ~MOVEMENTFLAG_WALKING;\n \n             args.velocity = unit->GetSpeed(SelectSpeedType(moveFlagsForSpeed));\n+\n+            //npcbot: do not emit an error if unit cannot move at all\n+            if ((unit->IsNPCBotOrPet() || !unit->CanFreeMove()) && !(args.velocity > 0.01f))\n+                return 0;\n+            //end npcbot\n         }\n \n         // limit the speed in the same way the client does\ndiff --git a/src/server/game/OutdoorPvP/OutdoorPvP.cpp b/src/server/game/OutdoorPvP/OutdoorPvP.cpp\nindex 88e210cfc6..9d3ed0f08f 100644\n--- a/src/server/game/OutdoorPvP/OutdoorPvP.cpp\n+++ b/src/server/game/OutdoorPvP/OutdoorPvP.cpp\n@@ -354,6 +354,23 @@ bool OPvPCapturePoint::Update(uint32 diff)\n     if (factDiff == 0.f)\n         return false;\n \n+    //npcbots - count bots as players but 2 times less affect and only if there is a players difference\n+    uint32 botsCount[2];\n+\n+    for (uint8 team = 0; team != 2; ++team)\n+    {\n+        botsCount[team] = 0;\n+\n+        for (GuidSet::iterator itr = _activePlayers[team].begin(); itr != _activePlayers[team].end(); ++itr)\n+        {\n+            if (Player* player = ObjectAccessor::FindPlayer(*itr))\n+                botsCount[team] += player->GetNpcBotsCount();\n+        }\n+    }\n+\n+    factDiff += 0.5f * ((float)botsCount[0] - (float)botsCount[1]) * diff / OUTDOORPVP_OBJECTIVE_UPDATE_INTERVAL;\n+    //end npcbot\n+\n     TeamId ChallengerId = TEAM_NEUTRAL;\n     float maxDiff = (_maxSpeed * float(diff)) * sWorld->getFloatConfig(CONFIG_OUTDOOR_PVP_CAPTURE_RATE);\n \ndiff --git a/src/server/game/Scripting/ScriptMgr.cpp b/src/server/game/Scripting/ScriptMgr.cpp\nindex b28f31445c..a1160bf103 100644\n--- a/src/server/game/Scripting/ScriptMgr.cpp\n+++ b/src/server/game/Scripting/ScriptMgr.cpp\n@@ -24,6 +24,10 @@\n #include \"SpellMgr.h\"\n #include \"UnitAI.h\"\n \n+//npcbot\n+#include \"botconfig.h\"\n+//end npcbot\n+\n namespace\n {\n     template<typename T>\n@@ -65,6 +69,10 @@ void ScriptMgr::Initialize()\n \n     AddSC_SmartScripts();\n \n+    //npcbot: load bot scripts here\n+    AddNpcBotScripts();\n+    //end npcbot\n+\n     // LFGScripts\n     lfg::AddSC_LFGScripts();\n \ndiff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h\nindex 070a97c09c..8bb22ab3e9 100644\n--- a/src/server/game/Scripting/ScriptMgr.h\n+++ b/src/server/game/Scripting/ScriptMgr.h\n@@ -40,6 +40,8 @@\n \n // Add support old api modules\n #include \"AllScriptsObjects.h\"\n+#define MOD_PRESENT_NPCBOTS 1\n+\n \n class AuctionHouseObject;\n class AuraScript;\ndiff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp\nindex 131e39a300..7cdbc689f8 100644\n--- a/src/server/game/Server/WorldSession.cpp\n+++ b/src/server/game/Server/WorldSession.cpp\n@@ -55,6 +55,10 @@\n #include \"WorldState.h\"\n #include <zlib.h>\n \n+//npcbot\n+#include \"botmgr.h\"\n+//end npcbot\n+\n namespace\n {\n     std::string const DefaultPlayerName = \"<none>\";\n@@ -616,6 +620,12 @@ void WorldSession::LogoutPlayer(bool save)\n     m_playerLogout = true;\n     m_playerSave = save;\n \n+    //npcbot - free all bots and remove from botmap\n+    if (_player->HaveBot() && _player->GetGroup() && !_player->GetGroup()->isRaidGroup() && !_player->GetGroup()->isLFGGroup() && m_Socket && sWorld->getBoolConfig(CONFIG_LEAVE_GROUP_ON_LOGOUT))\n+        _player->GetBotMgr()->RemoveAllBotsFromGroup();\n+    _player->RemoveAllBots();\n+    //end npcbots\n+\n     if (_player)\n     {\n         //! Call script hook before other logout events\ndiff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp\nindex 5506a94611..1edb6a29fc 100644\n--- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp\n+++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp\n@@ -40,6 +40,11 @@\n #include \"Vehicle.h\"\n #include \"WorldPacket.h\"\n \n+//npcbot\n+#include \"botconfig.h\"\n+#include \"botmgr.h\"\n+//end npcbot\n+\n /// @todo: this import is not necessary for compilation and marked as unused by the IDE\n //  however, for some reasons removing it would cause a damn linking issue\n //  there is probably some underlying problem with imports which should properly addressed\n@@ -978,6 +983,21 @@ void AuraEffect::UpdatePeriodic(Unit* caster)\n                         case 49472: // Drink Coffee\n                         case 57073:\n                         case 61830:\n+                            //npcbot\n+                            if (caster && caster->IsNPCBot())\n+                            {\n+                                if (AuraEffect* aurEff = GetBase()->GetEffect(EFFECT_0))\n+                                {\n+                                    if (aurEff->GetAuraType() == SPELL_AURA_MOD_POWER_REGEN)\n+                                    {\n+                                        aurEff->ChangeAmount(GetAmount());\n+                                        m_isPeriodic = false;\n+                                    }\n+                                }\n+                                break;\n+                            }\n+                            //end npcbot\n+\n                             if (!caster || !caster->IsPlayer())\n                                 return;\n                             // Get SPELL_AURA_MOD_POWER_REGEN aura from spell\n@@ -1073,6 +1093,29 @@ float AuraEffect::CalcPeriodicCritChance(Unit const* caster, Unit const* target)\n     float critChance = 0.0f;\n     if (caster)\n     {\n+        //npcbot\n+        if (caster->IsNPCBotOrPet())\n+        {\n+            Unit::AuraEffectList const& mPeriodicCritAuras = caster->GetAuraEffectsByType(SPELL_AURA_ABILITY_PERIODIC_CRIT);\n+            for (Unit::AuraEffectList::const_iterator itr = mPeriodicCritAuras.begin(); itr != mPeriodicCritAuras.end(); ++itr)\n+            {\n+                if ((*itr)->IsAffectedOnSpell(GetSpellInfo()))\n+                {\n+                    critChance = caster->SpellDoneCritChance(nullptr, GetSpellInfo(), GetSpellInfo()->GetSchoolMask(), (GetSpellInfo()->DmgClass == SPELL_DAMAGE_CLASS_RANGED ? RANGED_ATTACK : BASE_ATTACK), true);\n+                    break;\n+                }\n+            }\n+\n+            switch(GetSpellInfo()->SpellFamilyName)\n+            {\n+                // Rupture - since 3.3.3 can crit\n+                case SPELLFAMILY_ROGUE:\n+                    if (GetSpellInfo()->SpellFamilyFlags[0] & 0x100000)\n+                        critChance = caster->SpellDoneCritChance(nullptr, GetSpellInfo(), GetSpellInfo()->GetSchoolMask(), BASE_ATTACK, true);\n+                    break;\n+            }\n+        }\n+        //end npcbot\n         if (Player* modOwner = caster->GetSpellModOwner())\n         {\n             Unit::AuraEffectList const& mPeriodicCritAuras = modOwner->GetAuraEffectsByType(SPELL_AURA_ABILITY_PERIODIC_CRIT);\n@@ -1781,6 +1824,9 @@ void AuraEffect::HandleModStealth(AuraApplication const* aurApp, uint8 mode, boo\n         if (target->GetCurrentSpell(CURRENT_AUTOREPEAT_SPELL))\n         {\n             target->FinishSpell(CURRENT_AUTOREPEAT_SPELL);\n+            //npcbot: do not try with npcbot target\n+            if (target->IsPlayer())\n+            //end npcbot\n             target->ToPlayer()->SendAutoRepeatCancel(target);\n         }\n     }\n@@ -2179,6 +2225,10 @@ void AuraEffect::HandleAuraModShapeshift(AuraApplication const* aurApp, uint8 mo\n             case FORM_DEFENSIVESTANCE:\n             case FORM_BERSERKERSTANCE:\n                 {\n+                    //npcbot: skip this, handled inside class ai\n+                    if (target->IsNPCBot())\n+                        break;\n+                    //end npcbot\n                     uint32 Rage_val = 0;\n                     // Defensive Tactics\n                     if (form == FORM_DEFENSIVESTANCE)\n@@ -2240,6 +2290,11 @@ void AuraEffect::HandleAuraModShapeshift(AuraApplication const* aurApp, uint8 mo\n         // and also HandleAuraModDisarm is not triggered\n         if (!target->CanUseAttackType(BASE_ATTACK))\n         {\n+            //npcbot: skip bots (handled inside AI)\n+            if (target->IsNPCBotOrPet())\n+            {}\n+            else\n+            //end npcbot\n             if (Item* pItem = target->ToPlayer()->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_MAINHAND))\n             {\n                 target->ToPlayer()->_ApplyWeaponDamage(EQUIPMENT_SLOT_MAINHAND, pItem->GetTemplate(), nullptr, apply);\n@@ -2247,6 +2302,11 @@ void AuraEffect::HandleAuraModShapeshift(AuraApplication const* aurApp, uint8 mo\n         }\n \n         // Update crit chance for feral forms\n+        //npcbot: skip bots (handled inside AI)\n+        if (target->IsNPCBotOrPet())\n+        {}\n+        else\n+        //end npcbot\n         switch (form)\n         {\n             case FORM_CAT:\n@@ -3565,6 +3625,16 @@ void AuraEffect::HandleAuraModTotalThreat(AuraApplication const* aurApp, uint8 m\n \n     Unit* target = aurApp->GetTarget();\n \n+    //npcbot: handle for bots\n+    if (target->IsAlive() && target->IsNPCBotOrPet())\n+    {\n+        Unit* caster = GetCaster();\n+        if (caster && caster->IsAlive())\n+            caster->GetThreatMgr().UpdateMyTempModifiers();\n+        return;\n+    }\n+    //end npcbot\n+\n     if (!target->IsAlive() || !target->IsPlayer())\n         return;\n \n@@ -3966,6 +4036,17 @@ void AuraEffect::HandleAuraModEffectImmunity(AuraApplication const* aurApp, uint\n         else\n             sOutdoorPvPMgr->HandleDropFlag(player, GetSpellInfo()->Id);\n     }\n+\n+    //npcbot\n+    if (Creature* bot = target->ToCreature())\n+    {\n+        if (!apply && bot->IsNPCBot() && (GetSpellInfo()->AuraInterruptFlags & AURA_INTERRUPT_FLAG_IMMUNE_OR_LOST_SELECTION))\n+        {\n+            if (Battleground* botbg = bot->GetBotBG())\n+                botbg->EventBotDroppedFlag(bot);\n+        }\n+    }\n+    //end npcbot\n }\n \n void AuraEffect::HandleAuraModStateImmunity(AuraApplication const* aurApp, uint8 mode, bool apply) const\n@@ -6217,6 +6298,10 @@ void AuraEffect::HandlePeriodicTriggerSpellAuraTick(Unit* target, Unit* caster)\n \n     if (triggeredSpellInfo)\n     {\n+        //npcbot: override spellInfo\n+        triggeredSpellInfo = triggeredSpellInfo->TryGetSpellInfoOverride(caster);\n+        //end npcbot\n+\n         if (Unit* triggerCaster = triggeredSpellInfo->NeedsToBeTriggeredByCaster(m_spellInfo, GetEffIndex()) ? caster : target)\n         {\n             SpellCastTargets targets;\n@@ -6243,6 +6328,10 @@ void AuraEffect::HandlePeriodicTriggerSpellWithValueAuraTick(Unit* target, Unit*\n     uint32 triggerSpellId = GetSpellInfo()->Effects[m_effIndex].TriggerSpell;\n     if (SpellInfo const* triggeredSpellInfo = sSpellMgr->GetSpellInfo(triggerSpellId))\n     {\n+        //npcbot: override spellInfo\n+        triggeredSpellInfo = triggeredSpellInfo->TryGetSpellInfoOverride(caster);\n+        //end npcbot\n+\n         if (Unit* triggerCaster = triggeredSpellInfo->NeedsToBeTriggeredByCaster(m_spellInfo, GetEffIndex()) ? caster : target)\n         {\n             SpellCastTargets targets;\n@@ -6340,6 +6429,14 @@ void AuraEffect::HandlePeriodicDamageAurasTick(Unit* target, Unit* caster) const\n \n     if (GetAuraType() == SPELL_AURA_PERIODIC_DAMAGE)\n     {\n+        //npcbot: Black Arrow damage on targets below 20%\n+        if (GetSpellInfo()->SpellFamilyName == SPELLFAMILY_WARLOCK && (GetSpellInfo()->SpellFamilyFlags[1] & 0x4) &&\n+            target->HasAuraState(AURA_STATE_HEALTHLESS_20_PERCENT))\n+        {\n+            damage *= 5;\n+        }\n+        //end npcbot\n+\n         // xinef: leave only target depending bonuses, rest is handled in calculate amount\n         if (GetBase()->GetType() == DYNOBJ_AURA_TYPE && caster)\n             damage = caster->SpellDamageBonusDone(target, GetSpellInfo(), damage, DOT, GetEffIndex(), 0.0f, GetBase()->GetStackAmount());\n@@ -6360,6 +6457,20 @@ void AuraEffect::HandlePeriodicDamageAurasTick(Unit* target, Unit* caster) const\n     if ((crit = roll_chance_f(GetCritChance())))\n         damage = Unit::SpellCriticalDamageBonus(caster, m_spellInfo, damage, target);\n \n+    //NpcBot mod: apply bot damage mods\n+    if (caster && caster->IsNPCBotOrPet())\n+    {\n+        SpellNonMeleeDamage damageInfo(caster, target, m_spellInfo, m_spellInfo->GetSchoolMask());\n+        int32 idamage = damage;\n+        caster->ToCreature()->ApplyBotDamageMultiplierSpell(idamage, damageInfo, m_spellInfo, BASE_ATTACK, crit);\n+        damage = std::max<int32>(idamage, 0);\n+        if (GetSpellInfo()->GetSchoolMask() & SPELL_SCHOOL_MASK_NORMAL)\n+            damage *= BotMgr::IsWanderingWorldBot(caster->ToCreature()) ? BotCfg::GetBotWandererDamageMod() : BotCfg::GetBotDamageModPhysical();\n+        else if (GetSpellInfo()->GetSchoolMask() & SPELL_SCHOOL_MASK_MAGIC)\n+            damage *= BotMgr::IsWanderingWorldBot(caster->ToCreature()) ? BotCfg::GetBotWandererDamageMod() : BotCfg::GetBotDamageModSpell();\n+    }\n+    //End NpcBot\n+\n     // Auras reducing damage from AOE spells\n     if (!GetSpellInfo()->HasAttribute(SPELL_ATTR4_IGNORE_DAMAGE_TAKEN_MODIFIERS))\n     {\n@@ -6905,6 +7016,48 @@ void AuraEffect::HandleProcTriggerSpellAuraProc(AuraApplication* aurApp, ProcEve\n     if (SpellInfo const* triggeredSpellInfo = sSpellMgr->GetSpellInfo(triggerSpellId))\n     {\n         LOG_DEBUG(\"spells.aura\", \"AuraEffect::HandleProcTriggerSpellAuraProc: Triggering spell {} from aura {} proc\", triggeredSpellInfo->Id, GetId());\n+\n+        //npcbot: override spellInfo\n+        triggeredSpellInfo = triggeredSpellInfo->TryGetSpellInfoOverride(aurApp->GetBase()->GetCaster());\n+        //end npcbot\n+\n+        //npcbot\n+        Aura const* triggeredByAura = aurApp->GetBase();\n+        int32 basepoints0 = 0;\n+        switch (triggerSpellId)\n+        {\n+            // Quest - Self Healing from resurrect (invisible in log)\n+            case 25155:\n+            {\n+                switch (GetId())\n+                {\n+                    //Vampiric Aura\n+                    case 20810:\n+                    {\n+                        DamageInfo const* dinfo = eventInfo.GetDamageInfo();\n+                        uint32 damage = dinfo->GetDamage();\n+                        if (!damage)\n+                            return;\n+\n+                        // 100% / 25%\n+                        if (triggerTarget->GetGUID() == triggeredByAura->GetCasterGUID())\n+                            basepoints0 = int32(damage);\n+                        else\n+                            basepoints0 = int32(damage / 4);\n+\n+                        triggerCaster->CastCustomSpell(triggerTarget, triggerSpellId, &basepoints0, nullptr, nullptr, true, nullptr);\n+                        return;\n+                    }\n+                    default:\n+                        break;\n+                }\n+                break;\n+            }\n+            default:\n+                break;\n+        }\n+        //end npcbot\n+\n         triggerCaster->CastSpell(triggerTarget, triggeredSpellInfo, true, nullptr, this);\n     }\n     else\n@@ -6924,6 +7077,10 @@ void AuraEffect::HandleProcTriggerSpellWithValueAuraProc(AuraApplication* aurApp\n         // used only with EXTRA_LOGS\n         (void)triggeredSpellInfo;\n \n+        //npcbot: override spellInfo\n+        triggeredSpellInfo = triggeredSpellInfo->TryGetSpellInfoOverride(aurApp->GetBase()->GetCaster());\n+        //end npcbot\n+\n         int32 basepoints0 = GetAmount();\n         LOG_DEBUG(\"spells.aura\", \"AuraEffect::HandleProcTriggerSpellWithValueAuraProc: Triggering spell {} with value {} from aura {} proc\", triggeredSpellInfo->Id, basepoints0, GetId());\n         triggerCaster->CastCustomSpell(triggerTarget, triggerSpellId, &basepoints0, nullptr, nullptr, true, nullptr, this);\ndiff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp\nindex 3ca928b47a..32180d27c5 100644\n--- a/src/server/game/Spells/Auras/SpellAuras.cpp\n+++ b/src/server/game/Spells/Auras/SpellAuras.cpp\n@@ -35,6 +35,10 @@\n #include \"Vehicle.h\"\n #include \"WorldPacket.h\"\n \n+//npcbot\n+#include \"botspell.h\"\n+//end npcbot\n+\n /// @todo: this import is not necessary for compilation and marked as unused by the IDE\n //  however, for some reasons removing it would cause a damn linking issue\n //  there is probably some underlying problem with imports which should properly addressed\n@@ -448,6 +452,10 @@ void Aura::_ApplyForTarget(Unit* target, Unit* caster, AuraApplication* auraApp)\n         {\n             caster->ToCreature()->AddSpellCooldown(m_spellInfo->Id, 0, infinityCooldownDelay);\n         }\n+        //npcbot: infinity cd for bots\n+        if (caster && m_spellInfo->IsCooldownStartedOnEvent() && caster->IsNPCBot())\n+            caster->ToCreature()->AddBotSpellCooldown(m_spellInfo->Id, std::numeric_limits<uint32>::max());\n+        //end npcbot\n     }\n }\n \n@@ -506,6 +514,10 @@ void Aura::_UnapplyForTarget(Unit* target, Unit* caster, AuraApplication* auraAp\n             caster->ToPlayer()->SendCooldownEvent(GetSpellInfo());\n         }\n     }\n+    //npcbot: release cd state for bots\n+    if (caster && m_spellInfo->IsCooldownStartedOnEvent() && caster->IsNPCBot())\n+        caster->ToCreature()->ReleaseBotSpellCooldown(m_spellInfo->Id);\n+    //end npcbot\n }\n \n // removes aura from all targets\n@@ -906,6 +918,14 @@ uint8 Aura::CalcMaxCharges(Unit* caster) const\n     if (SpellProcEntry const* procEntry = sSpellMgr->GetSpellProcEntry(GetId()))\n         maxProcCharges = procEntry->Charges;\n \n+    //npcbot: override spell proc\n+    if (caster && caster->IsNPCBot())\n+    {\n+        if (SpellProcEntry const* procOverride = GetBotSpellProceEntryOverride(GetId()))\n+            maxProcCharges = procOverride->Charges;\n+    }\n+    //end npcbot\n+\n     if (caster)\n         if (Player* modOwner = caster->GetSpellModOwner())\n             modOwner->ApplySpellMod(GetId(), SPELLMOD_CHARGES, maxProcCharges);\n@@ -1713,6 +1733,20 @@ void Aura::HandleAuraSpecificMods(AuraApplication const* aurApp, Unit* caster, b\n                     {\n                         if (removeMode != AURA_REMOVE_BY_EXPIRE)\n                             break;\n+\n+                        //npcbot: handle Glyph of Guardian Spirit proc for bots\n+                        if (Creature* bot = caster->ToCreature())\n+                        {\n+                            if (bot->IsNPCBot() && bot->HasSpellCooldown(47788))\n+                            {\n+                                bot->AddBotSpellCooldown(47788, 60000);\n+                                //bot->GetSpellHistory()->ResetCooldown(GetSpellInfo()->Id, true);\n+                                //bot->GetSpellHistory()->AddCooldown(GetSpellInfo()->Id, 0, std::chrono::seconds(60));\n+                                break;\n+                            }\n+                        }\n+                        //end npcbot\n+\n                         if (!caster->IsPlayer())\n                             break;\n \n@@ -2120,6 +2154,15 @@ void Aura::PrepareProcToTrigger(AuraApplication* aurApp, ProcEventInfo& eventInf\n \n     SpellProcEntry const* procEntry = sSpellMgr->GetSpellProcEntry(GetId());\n \n+    //npcbot: override spell proc\n+    Unit const* caster = aurApp && aurApp->GetBase()->GetCasterGUID().IsCreature() ? aurApp->GetBase()->GetCaster() : nullptr;\n+    if (caster && caster->IsNPCBot())\n+    {\n+        if (SpellProcEntry const* procOverride = GetBotSpellProceEntryOverride(GetId()))\n+            procEntry = procOverride;\n+    }\n+    //end npcbot\n+\n     ASSERT(procEntry);\n \n     // cooldowns should be added to the whole aura (see 51698 area aura)\n@@ -2130,6 +2173,15 @@ uint8 Aura::GetProcEffectMask(AuraApplication* aurApp, ProcEventInfo& eventInfo,\n {\n     SpellProcEntry const* procEntry = sSpellMgr->GetSpellProcEntry(GetId());\n \n+    //npcbot: override spell proc\n+    Unit const* caster = aurApp && aurApp->GetBase()->GetCasterGUID().IsCreature() ? aurApp->GetBase()->GetCaster() : nullptr;\n+    if (caster && caster->IsNPCBot())\n+    {\n+        if (SpellProcEntry const* procOverride = GetBotSpellProceEntryOverride(GetId()))\n+            procEntry = procOverride;\n+    }\n+    //end npcbot\n+\n     // only auras with spell proc entry can trigger proc\n     if (!procEntry)\n         return 0;\ndiff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp\nindex 69a795012e..d5e3f08e8f 100644\n--- a/src/server/game/Spells/Spell.cpp\n+++ b/src/server/game/Spells/Spell.cpp\n@@ -61,6 +61,10 @@\n #include \"IVMapMgr.h\"\n #include \"VMapMgr2.h\"\n \n+//npcbot\n+#include \"botmgr.h\"\n+//end npcbot\n+\n extern pEffect SpellEffects[TOTAL_SPELL_EFFECTS];\n \n SpellDestination::SpellDestination()\n@@ -568,7 +572,12 @@ SpellValue::SpellValue(SpellInfo const* proto)\n }\n \n Spell::Spell(Unit* caster, SpellInfo const* info, TriggerCastFlags triggerFlags, ObjectGuid originalCasterGUID, bool skipCheck) :\n+//npcbot: override spellInfo\n+/*\n     m_spellInfo(sSpellMgr->GetSpellForDifficultyFromSpell(info, caster)),\n+*/\n+    m_spellInfo((caster->IsNPCBot() ? info : sSpellMgr->GetSpellForDifficultyFromSpell(info, caster))->TryGetSpellInfoOverride(caster)),\n+//end npcbot\n     m_caster((info->HasAttribute(SPELL_ATTR6_ORIGINATE_FROM_CONTROLLER) && caster->GetCharmerOrOwner()) ? caster->GetCharmerOrOwner() : caster)\n     , m_spellValue(new SpellValue(m_spellInfo)), _spellEvent(nullptr)\n {\n@@ -616,6 +625,15 @@ Spell::Spell(Unit* caster, SpellInfo const* info, TriggerCastFlags triggerFlags,\n             if (Item* pItem = m_caster->ToPlayer()->GetWeaponForAttack(RANGED_ATTACK))\n                 m_spellSchoolMask = SpellSchoolMask(1 << pItem->GetTemplate()->Damage[0].DamageType);\n \n+    //npcbot: ranged weapon dmg school\n+    if (m_attackType == RANGED_ATTACK && m_caster->IsNPCBot() &&\n+        ((1<<(m_caster->ToCreature()->GetBotClass()-1)) & CLASSMASK_WAND_USERS))\n+    {\n+        if (Item const* pItem = m_caster->ToCreature()->GetBotEquips(2))\n+            m_spellSchoolMask = SpellSchoolMask(1 << pItem->GetTemplate()->Damage[0].DamageType);\n+    }\n+    //end npcbot\n+\n     if (originalCasterGUID)\n         m_originalCasterGUID = originalCasterGUID;\n     else\n@@ -1242,6 +1260,11 @@ void Spell::SelectImplicitConeTargets(SpellEffIndex effIndex, SpellImplicitTarge\n             if (uint32 maxTargets = m_spellValue->MaxAffectedTargets)\n             {\n                 maxTargets += m_caster->GetTotalAuraModifierByAffectMask(SPELL_AURA_MOD_MAX_AFFECTED_TARGETS, m_spellInfo);\n+                //npcbot - apply bot spell max targets mods\n+                if (m_caster->IsNPCBot())\n+                    m_caster->ToCreature()->ApplyCreatureSpellMaxTargetsMods(m_spellInfo, maxTargets);\n+                //end npcbot\n+\n                 Acore::Containers::RandomResize(targets, maxTargets);\n             }\n \n@@ -1775,6 +1798,10 @@ void Spell::SelectImplicitCasterObjectTargets(SpellEffIndex effIndex, SpellImpli\n             target = m_caster->GetGuardianPet();\n             if (!target)\n                 target = m_caster->GetCharm();\n+            //npcbot: allow bot pet as target\n+            if (!target && m_caster->IsNPCBot())\n+                target = m_caster->ToCreature()->GetBotsPet();\n+            //end npcbot\n             break;\n         case TARGET_UNIT_SUMMONER:\n             if (m_caster->IsSummon())\n@@ -1832,6 +1859,11 @@ void Spell::SelectImplicitChainTargets(SpellEffIndex effIndex, SpellImplicitTarg\n     if (Player* modOwner = m_caster->GetSpellModOwner())\n         modOwner->ApplySpellMod(m_spellInfo->Id, SPELLMOD_JUMP_TARGETS, maxTargets, this);\n \n+    //npcbot - apply bot spell max targets mods\n+    if (m_caster->IsNPCBot())\n+        m_caster->ToCreature()->ApplyCreatureSpellMaxTargetsMods(m_spellInfo, maxTargets);\n+    //end npcbot\n+\n     if (maxTargets > 1)\n     {\n         // mark damage multipliers as used\n@@ -2058,7 +2090,14 @@ uint32 Spell::GetSearcherTypeMask(SpellTargetObjectTypes objType, ConditionList*\n     if (!m_spellInfo->HasAttribute(SPELL_ATTR2_ALLOW_DEAD_TARGET))\n         retMask &= ~GRID_MAP_TYPE_MASK_CORPSE;\n     if (m_spellInfo->HasAttribute(SPELL_ATTR3_ONLY_ON_PLAYER))\n+    {\n+        //npcbot: do not exclude creatures, see WorldObjectSpellNearbyTargetCheck, WorldObjectSpellAreaTargetCheck\n+        if (retMask & GRID_MAP_TYPE_MASK_CREATURE)\n+            retMask &= GRID_MAP_TYPE_MASK_CORPSE | GRID_MAP_TYPE_MASK_PLAYER | GRID_MAP_TYPE_MASK_CREATURE;\n+        else\n+        //end npcbot\n         retMask &= GRID_MAP_TYPE_MASK_CORPSE | GRID_MAP_TYPE_MASK_PLAYER;\n+    }\n     if (m_spellInfo->HasAttribute(SPELL_ATTR3_ONLY_ON_GHOSTS))\n         retMask &= GRID_MAP_TYPE_MASK_PLAYER;\n     if (m_spellInfo->HasAttribute(SPELL_ATTR5_NOT_ON_PLAYER))\n@@ -2859,6 +2898,13 @@ void Spell::DoAllEffectOnTarget(TargetInfo* target)\n                 if (caster->IsPlayer() && m_spellInfo->HasAttribute(SPELL_ATTR0_CANCELS_AUTO_ATTACK_COMBAT) == 0 &&\n                         m_spellInfo->HasAttribute(SPELL_ATTR4_SUPPRESS_WEAPON_PROCS) == 0 && (m_spellInfo->DmgClass == SPELL_DAMAGE_CLASS_MELEE || m_spellInfo->DmgClass == SPELL_DAMAGE_CLASS_RANGED))\n                     caster->ToPlayer()->CastItemCombatSpell(unitTarget, m_attackType, procVictim, dmgInfo.GetHitMask());\n+\n+            //npcbot\n+            if (caster->IsNPCBot() &&\n+                !m_spellInfo->HasAttribute(SPELL_ATTR0_CANCELS_AUTO_ATTACK_COMBAT) && !m_spellInfo->HasAttribute(SPELL_ATTR4_SUPPRESS_WEAPON_PROCS) &&\n+                (m_spellInfo->DmgClass == SPELL_DAMAGE_CLASS_MELEE || m_spellInfo->DmgClass == SPELL_DAMAGE_CLASS_RANGED))\n+                caster->ToCreature()->CastCreatureItemCombatSpell(dmgInfo);\n+            //end npcbot\n             }\n \n             m_damage = damageInfo.damage;\n@@ -2927,6 +2973,15 @@ void Spell::DoAllEffectOnTarget(TargetInfo* target)\n         if (m_caster->IsCreature() && m_caster->ToCreature()->IsAIEnabled)\n             m_caster->ToCreature()->AI()->SpellHitTarget(spellHitTarget, m_spellInfo);\n \n+        //npcbot: vehicle spell hits\n+        if (m_caster->GetTypeId() == TYPEID_UNIT && m_caster->ToCreature()->IsVehicle() && m_caster->ToCreature()->GetCharmerGUID().IsCreature())\n+        {\n+            Unit const* bot = m_caster->ToCreature()->GetCharmer();\n+            if (bot && bot->ToCreature()->IsNPCBot())\n+                bot->ToCreature()->AI()->SpellHitTarget(spellHitTarget, m_spellInfo);\n+        }\n+        //end npcbot\n+\n         // Needs to be called after dealing damage/healing to not remove breaking on damage auras\n         DoTriggersOnSpellHit(spellHitTarget, mask);\n \n@@ -3024,6 +3079,13 @@ SpellMissInfo Spell::DoSpellHitOnUnit(Unit* unit, uint32 effectMask, bool scaleA\n                 m_caster->SetContestedPvP();\n                 if (m_caster->IsPlayer() && !m_spellInfo->HasAttribute(SPELL_ATTR0_CU_NO_PVP_FLAG))\n                     m_caster->ToPlayer()->UpdatePvP(true);\n+                //npcbot: bot assist case\n+                else if (m_caster->IsNPCBotOrPet() && m_caster->ToCreature()->IsFreeBot())\n+                {\n+                    if (Unit const* bot = m_caster->IsNPCBotPet() ? m_caster->ToUnit()->GetCreator() : m_caster->ToUnit())\n+                        BotMgr::SetBotContestedPvP(bot->ToCreature());\n+                }\n+                //end npcbot\n             }\n \n             // xinef: triggered spells should not prolong combat\n@@ -3065,6 +3127,10 @@ SpellMissInfo Spell::DoSpellHitOnUnit(Unit* unit, uint32 effectMask, bool scaleA\n             {\n                 unit->IncrDiminishing(m_diminishGroup);\n             }\n+            //npcbot\n+            else if (m_caster->IsNPCBotOrPet())\n+                unit->IncrDiminishing(m_diminishGroup);\n+            //end npcbot\n         }\n     }\n \n@@ -3342,6 +3408,11 @@ bool Spell::UpdateChanneledTargetList()\n         if (Player* modOwner = m_caster->GetSpellModOwner())\n             modOwner->ApplySpellMod(m_spellInfo->Id, SPELLMOD_RANGE, range, this);\n \n+        //npcbot: apply range mods\n+        if (m_caster->IsNPCBot())\n+            m_caster->ToCreature()->ApplyCreatureSpellRangeMods(m_spellInfo, range);\n+        //end npcbot\n+\n         // xinef: add little tolerance level\n         range += std::min(3.0f, range * 0.1f); // 10% but no more than 3yd\n     }\n@@ -3590,6 +3661,9 @@ SpellCastResult Spell::prepare(SpellCastTargets const* targets, AuraEffect const\n \n     // prevent exploit that allows to cast spell while sitting\n     if (!IsTriggered() && !(m_spellInfo->AuraInterruptFlags & AURA_INTERRUPT_FLAG_NOT_SEATED) && !(m_spellInfo->Attributes & SPELL_ATTR0_ALLOW_WHILE_SITTING) && !m_triggeredByAuraSpell && m_caster->IsSitState())\n+        //npcbot\n+        if (!m_originalCaster || m_caster == m_originalCaster)\n+        //end npcbot\n         m_caster->SetStandState(UNIT_STAND_STATE_STAND);\n \n     //Containers for channeled spells have to be set\n@@ -3805,6 +3879,11 @@ void Spell::_cast(bool skipCheck)\n             SendCastResult(castResult);\n             SendInterrupted(0);\n \n+            //npcbot - hook for spellcast finish (unsuccessful)\n+            if (m_caster->IsNPCBotOrPet())\n+                BotMgr::OnBotSpellGo(m_caster->ToCreature(), this, false);\n+            //end npcbot\n+\n             finish(false);\n             SetExecutedCurrently(false);\n             return;\n@@ -3848,6 +3927,12 @@ void Spell::_cast(bool skipCheck)\n     {\n         SendInterrupted(0);\n         finish(false);\n+\n+        //npcbot - hook for spellcast finish (unsuccessful)\n+        if (m_caster->IsNPCBotOrPet())\n+            BotMgr::OnBotSpellGo(m_caster->ToCreature(), this, false);\n+        //end npcbot\n+\n         SetExecutedCurrently(false);\n         return;\n     }\n@@ -3949,6 +4034,17 @@ void Spell::_cast(bool skipCheck)\n         handle_immediate();\n     }\n \n+    //npcbot - hook for spellcast finish\n+    if (m_caster->IsNPCBotOrPet())\n+        BotMgr::OnBotSpellGo(m_caster->ToCreature(), this);\n+    //npcbot - hook for master's spellcast finish\n+    else if (m_caster->GetTypeId() == TYPEID_PLAYER && m_caster->ToPlayer()->HaveBot())\n+        BotMgr::OnBotOwnerSpellGo(m_caster->ToPlayer(), this);\n+    //npcbot - hook for master's vehicle spellcast finish\n+    else if (m_caster->ToUnit() && m_caster->ToUnit()->IsVehicle())\n+        BotMgr::OnVehicleSpellGo(m_caster->ToUnit(), this);\n+    //end npcbot\n+\n     if (resetAttackTimers)\n     {\n         if (m_casttime == 0 && m_spellInfo->CalcCastTime())\n@@ -4410,6 +4506,11 @@ void Spell::update(uint32 difftime)\n                     if (Creature* creatureCaster = m_caster->ToCreature())\n                         if (creatureCaster->IsAIEnabled)\n                             creatureCaster->AI()->OnChannelFinished(m_spellInfo);\n+\n+                    //npcbot: signal channel finish to botmgr\n+                    if (m_caster->IsNPCBot())\n+                        BotMgr::OnBotChannelFinish(m_caster->ToUnit(), this);\n+                    //end npcbot\n                 }\n                 // Xinef: Dont update channeled target list on last tick, allow auras to update duration properly\n                 // Xinef: Added this strange check because of diffrent update routines for players / creatures\n@@ -4420,6 +4521,11 @@ void Spell::update(uint32 difftime)\n                     LOG_DEBUG(\"spells.aura\", \"Channeled spell {} is removed due to lack of targets\", m_spellInfo->Id);\n                     SendChannelUpdate(0);\n                     finish();\n+\n+                    //npcbot: signal channel finish to botmgr\n+                    if (m_caster->IsNPCBot())\n+                        BotMgr::OnBotChannelFinish(m_caster->ToUnit(), this);\n+                    //end npcbot\n                 }\n                 break;\n             }\n@@ -4456,6 +4562,11 @@ void Spell::finish(bool ok)\n     if (Creature* creatureCaster = m_caster->ToCreature())\n         creatureCaster->ReleaseFocus(this);\n \n+    //npcbot\n+    if (!ok && m_caster->IsNPCBotOrPet())\n+        BotMgr::OnBotSpellGo(m_caster, this, false);\n+    //end npcbot\n+\n     if (ok)\n     {\n         if (m_caster->IsPlayer() && m_spellInfo->IsChanneled() && m_spellInfo->IsCooldownStartedOnEvent())\n@@ -4508,6 +4619,9 @@ void Spell::finish(bool ok)\n \n     // Stop Attack for some spells\n     if (m_spellInfo->HasAttribute(SPELL_ATTR0_CANCELS_AUTO_ATTACK_COMBAT))\n+    //npcbot: disable for npcbots\n+    if (!m_caster->IsNPCBot())\n+    //end npcbot\n         m_caster->AttackStop();\n }\n \n@@ -5292,9 +5406,39 @@ void Spell::TakePower()\n                     }\n     }\n \n+    //npcbot: handle SPELLMOD_SPELL_COST_REFUND_ON_FAIL (druid Primal Precision)\n+    if (m_caster->IsNPCBot() && m_caster->ToCreature()->GetBotClass() == CLASS_DRUID)\n+    {\n+        if (PowerType == POWER_ENERGY/* || PowerType == POWER_RAGE || PowerType == POWER_RUNE*/)\n+        {\n+            if (ObjectGuid targetGUID = m_targets.GetUnitTargetGUID())\n+            {\n+                //auto ihit = std::find_if(std::being());\n+                for (std::list<TargetInfo>::iterator ihit= m_UniqueTargetInfo.begin(); ihit != m_UniqueTargetInfo.end(); ++ihit)\n+                {\n+                    if (ihit->targetGUID == targetGUID && ihit->missCondition != SPELL_MISS_NONE)\n+                    {\n+                        hit = false;\n+                        //Primal Precision: 80% refund\n+                        if ((m_spellInfo->SpellFamilyFlags[0] & 0x800000) || (m_spellInfo->SpellFamilyFlags[1] & 0x10000080))\n+                            m_powerCost = m_powerCost / 5;\n+                    }\n+                    break;\n+                }\n+            }\n+        }\n+    }\n+    //end npcbot\n+\n     if (PowerType == POWER_RUNE)\n     {\n         TakeRunePower(hit);\n+\n+        //npcbot: spend runes (pass hit result)\n+        if (m_caster->IsNPCBot() && m_caster->ToCreature()->GetBotClass() == CLASS_DEATH_KNIGHT)\n+            m_caster->ToCreature()->SpendBotRunes(m_spellInfo, hit);\n+        //end npcbot\n+\n         return;\n     }\n \n@@ -5648,6 +5792,17 @@ SpellCastResult Spell::CheckCast(bool strict, uint32* /*param1*/, uint32* /*para\n         }\n         else if (!IsTriggered() && m_caster->IsCreature() && m_caster->ToCreature()->IsSpellProhibited(m_spellInfo->GetSchoolMask()))\n             return SPELL_FAILED_NOT_READY;\n+\n+        //npcbot\n+        if (m_caster->IsNPCBot() && m_caster->ToCreature()->HasSpellCooldown(m_spellInfo->Id) && !IsIgnoringCooldowns())\n+        {\n+            //TC_LOG_ERROR(\"spells\", \"%s has cd of %u on %s\", m_caster->GetName().c_str(), m_caster->ToCreature()->GetCreatureSpellCooldownDelay(m_spellInfo->Id), m_spellInfo->SpellName[0]);\n+            if (m_triggeredByAuraSpell)\n+                return SPELL_FAILED_DONT_REPORT;\n+            //else\n+            //    return SPELL_FAILED_NOT_READY;\n+        }\n+        //end npcbot\n     }\n \n     if (m_spellInfo->HasAttribute(SPELL_ATTR7_DEBUG_SPELL) && !m_caster->HasUnitFlag2(UNIT_FLAG2_ALLOW_CHEAT_SPELLS))\n@@ -5927,6 +6082,11 @@ SpellCastResult Spell::CheckCast(bool strict, uint32* /*param1*/, uint32* /*para\n     {\n         if (m_spellInfo->Effects[j].TargetA.GetTarget() == TARGET_UNIT_PET)\n         {\n+            //npcbot: allow bot pet as target\n+            if (m_caster->IsNPCBot() && m_caster->ToCreature()->GetBotsPet())\n+                break;\n+            else\n+            //end npcbot\n             if (!m_caster->GetGuardianPet() && !m_caster->GetCharm())\n             {\n                 if (m_triggeredByAuraSpell.spellInfo) // not report pet not existence for triggered spells\n@@ -5952,6 +6112,11 @@ SpellCastResult Spell::CheckCast(bool strict, uint32* /*param1*/, uint32* /*para\n                 return SPELL_FAILED_NOT_IN_ARENA;\n \n     // zone check\n+    //npcbot: do not check location for bots (to avoid crash introduced in TC rev. 5cb8409f1ee57e8d)\n+    if (m_caster->IsNPCBot())\n+    {}\n+    else\n+    //end npcbot\n     if (m_caster->IsCreature() || !m_caster->ToPlayer()->IsGameMaster())\n     {\n         uint32 zone, area;\n@@ -6252,6 +6417,15 @@ SpellCastResult Spell::CheckCast(bool strict, uint32* /*param1*/, uint32* /*para\n                             m_spellInfo->Effects[i].TargetA.GetTarget() != TARGET_GAMEOBJECT_ITEM_TARGET)\n                         break;\n \n+                //npcbot\n+                if (m_caster->IsNPCBot())\n+                {\n+                    if (m_spellInfo->Effects[i].TargetA.GetTarget() == TARGET_GAMEOBJECT_TARGET && !m_targets.GetGOTarget())\n+                        return SPELL_FAILED_BAD_TARGETS;\n+                    break;\n+                }\n+                //end npcbot\n+\n                     if (!m_caster->IsPlayer()  // only players can open locks, gather etc.\n                             // we need a go target in case of TARGET_GAMEOBJECT_TARGET\n                             || (m_spellInfo->Effects[i].TargetA.GetTarget() == TARGET_GAMEOBJECT_TARGET && !m_targets.GetGOTarget()))\n@@ -6622,6 +6796,13 @@ SpellCastResult Spell::CheckCast(bool strict, uint32* /*param1*/, uint32* /*para\n                         if (target->GetCharmerGUID())\n                             return SPELL_FAILED_CHARMED;\n \n+                        //npcbot: do not allow to charm owned npcbots\n+                        if (target->GetCreator() && target->GetCreator()->IsPlayer())\n+                            return SPELL_FAILED_TARGET_IS_PLAYER_CONTROLLED;\n+                        else if (target->IsNPCBotOrPet())\n+                            return SPELL_FAILED_CANT_BE_CHARMED;\n+                        //end npcbot\n+\n                         if (target->GetOwnerGUID() && target->GetOwnerGUID().IsPlayer())\n                             return SPELL_FAILED_TARGET_IS_PLAYER_CONTROLLED;\n \n@@ -6760,6 +6941,14 @@ SpellCastResult Spell::CheckCast(bool strict, uint32* /*param1*/, uint32* /*para\n     // check if caster has at least 1 combo point on target for spells that require combo points\n     if (m_needComboPoints)\n     {\n+        //npcbot\n+        if (m_caster->ToCreature() && m_caster->ToCreature()->IsNPCBot())\n+        {\n+            if (!m_caster->ToCreature()->GetCreatureComboPoints())\n+                return SPELL_FAILED_NO_COMBO_POINTS;\n+        }\n+        else\n+        //end npcbot\n         if (m_spellInfo->NeedsExplicitUnitTarget())\n         {\n             if (!m_caster->GetComboPoints(m_targets.GetUnitTarget()))\n@@ -7049,6 +7238,11 @@ SpellCastResult Spell::CheckRange(bool strict)\n     float max_range = m_caster->GetSpellMaxRangeForTarget(target, m_spellInfo);\n     float min_range = m_caster->GetSpellMinRangeForTarget(target, m_spellInfo);\n \n+    //npcbot: apply range mods\n+    if (m_caster->IsNPCBot())\n+        m_caster->ToCreature()->ApplyCreatureSpellRangeMods(m_spellInfo, max_range);\n+    //end npcbot\n+\n     // xinef: hack for npc shooters\n     if (min_range && GetCaster()->IsCreature() && !GetCaster()->GetOwnerGUID().IsPlayer() && min_range <= 6.0f)\n         range_type = SPELL_RANGE_RANGED;\n@@ -7096,6 +7290,14 @@ SpellCastResult Spell::CheckRange(bool strict)\n \n     if (GameObject* goTarget = m_targets.GetGOTarget())\n     {\n+        //npcbot\n+        if (!m_caster->IsPlayer())\n+        {\n+            if (!goTarget->IsAtInteractDistance(*m_caster, m_spellInfo->GetMaxRange(m_spellInfo->IsPositive())))\n+                return SPELL_FAILED_OUT_OF_RANGE;\n+        }\n+        else\n+        //end npcbot\n         if (!goTarget->IsAtInteractDistance(m_caster->ToPlayer(), m_spellInfo))\n         {\n             return SPELL_FAILED_OUT_OF_RANGE;\n@@ -7783,6 +7985,43 @@ SpellCastResult Spell::CheckSpellFocus()\n \n void Spell::Delayed() // only called in DealDamage()\n {\n+    //npcbot\n+    if (!m_caster)\n+        return;\n+\n+    if (m_caster->IsNPCBot())\n+    {\n+        if ((m_spellInfo->InterruptFlags & SPELL_INTERRUPT_FLAG_PUSH_BACK) && !m_spellInfo->HasAttribute(SPELL_ATTR6_NO_PUSHBACK) && !isDelayableNoMore())\n+        {\n+            Creature* creature = m_caster->ToCreature();\n+            int32 delaytime = 500;\n+\n+            int32 delayReduce = 100;\n+            creature->ApplyCreatureSpellNotLoseCastTimeMods(m_spellInfo, delayReduce);\n+            delayReduce += creature->GetTotalAuraModifier(SPELL_AURA_REDUCE_PUSHBACK) - 100;\n+            if (delayReduce >= 100)\n+                return;\n+\n+            AddPct(delaytime, -delayReduce);\n+\n+            if (m_timer + delaytime > m_casttime)\n+            {\n+                delaytime = m_casttime - m_timer;\n+                m_timer = m_casttime;\n+            }\n+            else\n+                m_timer += delaytime;\n+\n+            WorldPacket data(SMSG_SPELL_DELAYED, 8 + 4);\n+            data << creature->GetPackGUID();\n+            data << uint32(delaytime);\n+\n+            creature->SendMessageToSet(&data, true);\n+        }\n+        return;\n+    }\n+    //end npcbot\n+\n     if (!m_caster)// || !m_caster->IsPlayer())\n         return;\n \n@@ -7828,6 +8067,46 @@ void Spell::Delayed() // only called in DealDamage()\n \n void Spell::DelayedChannel()\n {\n+    //npcbot\n+    if (!m_caster)\n+        return;\n+\n+    if (m_caster && m_caster->IsNPCBot() && m_spellState == SPELL_STATE_CASTING && (m_spellInfo->ChannelInterruptFlags & CHANNEL_FLAG_DELAY) && !isDelayableNoMore())\n+    {\n+        Creature* creature = m_caster->ToCreature();\n+        int32 duration = ((m_channeledDuration > 0) ? m_channeledDuration : m_spellInfo->GetDuration());\n+\n+        int32 delaytime = CalculatePct(duration, 25);\n+\n+        int32 delayReduce = 100;\n+        creature->ApplyCreatureSpellNotLoseCastTimeMods(m_spellInfo, delayReduce);\n+        delayReduce += creature->GetTotalAuraModifier(SPELL_AURA_REDUCE_PUSHBACK) - 100;\n+        if (delayReduce >= 100)\n+            return;\n+\n+        AddPct(delaytime, -delayReduce);\n+\n+        if (m_timer <= delaytime)\n+        {\n+            delaytime = m_timer;\n+            m_timer = 0;\n+        }\n+        else\n+            m_timer -= delaytime;\n+\n+        for (TargetInfo const& targetInfo : m_UniqueTargetInfo)\n+            if (targetInfo.missCondition == SPELL_MISS_NONE)\n+                if (Unit* unit = (creature->GetGUID() == targetInfo.targetGUID) ? creature : ObjectAccessor::GetUnit(*creature, targetInfo.targetGUID))\n+                    unit->DelayOwnedAuras(m_spellInfo->Id, m_originalCasterGUID, delaytime);\n+\n+        if (DynamicObject* dynObj = creature->GetDynObject(m_spellInfo->Id))\n+            dynObj->Delay(delaytime);\n+\n+        SendChannelUpdate(m_timer);\n+        return;\n+    }\n+    //end npcbot\n+\n     if (!m_caster || !m_caster->IsPlayer() || getState() != SPELL_STATE_CASTING)\n         return;\n \n@@ -7896,6 +8175,9 @@ bool Spell::UpdatePointers()\n             return false;\n     }\n     else\n+    //npcbot\n+    if (!m_caster->IsNPCBot())\n+    //end npcbot\n         m_CastItem = nullptr;\n \n     m_targets.Update(m_caster);\n@@ -8426,6 +8708,13 @@ SpellCastResult Spell::CanOpenLock(uint32 effIndex, uint32 lockId, SkillType& sk\n                         skillValue = m_CastItem || !m_caster->IsPlayer() ?\n                                      0 : m_caster->ToPlayer()->GetSkillValue(skillId);\n \n+                        //npcbot: use bot skill if cast through gossip\n+                        if (m_originalCasterGUID)\n+                            if (Unit const* unit = ObjectAccessor::GetUnit(*m_caster, m_originalCasterGUID))\n+                                if (unit->GetTypeId() == TYPEID_UNIT && unit->ToCreature()->GetBotClass() == CLASS_ROGUE)\n+                                    skillValue = std::max<int32>(skillValue, int32(unit->GetLevel() * 5));\n+                        //end npcbot\n+\n                         // skill bonus provided by casting spell (mostly item spells)\n                         // add the effect base points modifier from the spell casted (cheat lock / skeleton key etc.)\n                         if ((m_spellInfo->Effects[effIndex].TargetA.GetTarget() == TARGET_GAMEOBJECT_ITEM_TARGET || m_spellInfo->Effects[effIndex].TargetB.GetTarget() == TARGET_GAMEOBJECT_ITEM_TARGET)\n@@ -9069,6 +9358,11 @@ namespace Acore\n \n     bool WorldObjectSpellNearbyTargetCheck::operator()(WorldObject* target)\n     {\n+        //npcbot: custom check 1 for targeting bots by spells with SPELL_ATTR3_ONLY_ON_PLAYER\n+        if (_spellInfo->HasAttribute(SPELL_ATTR3_ONLY_ON_PLAYER) && target->GetTypeId() == TYPEID_UNIT && !target->IsNPCBot())\n+            return false;\n+        //end npcbot\n+\n         float dist = target->GetDistance(*_position);\n         if (dist < _range && WorldObjectSpellTargetCheck::operator ()(target))\n         {\n@@ -9097,6 +9391,10 @@ namespace Acore\n         {\n             if (c->IsAvoidingAOE()) // pussywizard\n                 return false;\n+            //npcbot: custom check 2 for targeting bots by spells with SPELL_ATTR3_ONLY_ON_PLAYER\n+            if (_spellInfo->HasAttribute(SPELL_ATTR3_ONLY_ON_PLAYER) && !target->IsNPCBot())\n+                return false;\n+            //end npcbot\n             if (CreatureImmunities const* immunities = sSpellMgr->GetCreatureImmunities(c->GetCreatureTemplate()->CreatureImmunitiesId))\n             {\n                 switch (_searchReason)\ndiff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h\nindex 40ebfaa6f4..4ececcbdbf 100644\n--- a/src/server/game/Spells/Spell.h\n+++ b/src/server/game/Spells/Spell.h\n@@ -559,6 +559,9 @@ public:\n \n     UsedSpellMods m_appliedMods;\n \n+    //npcbot\n+    int32 GetTimer() const { return m_timer; }\n+    //end npcbot\n     int32 GetCastTime() const { return m_casttime; }\n     bool IsAutoRepeat() const { return m_autoRepeat; }\n     void SetAutoRepeat(bool rep) { m_autoRepeat = rep; }\ndiff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp\nindex 46e6747369..082c221f08 100644\n--- a/src/server/game/Spells/SpellEffects.cpp\n+++ b/src/server/game/Spells/SpellEffects.cpp\n@@ -478,6 +478,17 @@ void Spell::EffectSchoolDMG(SpellEffIndex effIndex)\n                         damage += int32(energy * multiple);\n                         damage += int32(CalculatePct(m_caster->GetComboPoints() * ap, 7));\n                     }\n+                    //npcbot: Ferocious Bite support\n+                    else if (m_caster->IsNPCBot() && (m_spellInfo->SpellFamilyFlags[0] & 0x800000) && m_spellInfo->SpellVisual[0] == 6587)\n+                    {\n+                        // converts each extra point of energy into ($f1+$AP/410) additional damage\n+                        float ap = m_caster->GetTotalAttackPowerValue(BASE_ATTACK);\n+                        float multiple = ap / 410 + m_spellInfo->Effects[effIndex].DamageMultiplier;\n+                        int32 energy = -(m_caster->ModifyPower(POWER_ENERGY, -30));\n+                        damage += int32(energy * multiple);\n+                        damage += int32(CalculatePct(m_caster->ToCreature()->GetCreatureComboPoints() * ap, 7));\n+                    }\n+                    //end npcbot\n                     // Wrath\n                     else if (m_spellInfo->SpellFamilyFlags[0] & 0x00000001)\n                     {\n@@ -537,6 +548,52 @@ void Spell::EffectSchoolDMG(SpellEffIndex effIndex)\n                                     damage += combo * 40;\n                             }\n                         }\n+                        //npcbot: Envenom support\n+                        else if (m_caster->IsNPCBot())\n+                        {\n+                            // consume from stack dozes not more that have combo-points\n+                            if (uint8 combo = m_caster->ToCreature()->GetCreatureComboPoints())\n+                            {\n+                                // Lookup for Deadly poison (only attacker applied)\n+                                if (AuraEffect const* aurEff = unitTarget->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_ROGUE, 0x00010000, 0, 0, m_caster->GetGUID()))\n+                                {\n+                                    // count consumed deadly poison doses at target\n+                                    bool needConsume = true;\n+                                    uint32 spellId = aurEff->GetId();\n+\n+                                    uint32 doses = aurEff->GetBase()->GetStackAmount();\n+                                    if (doses > combo)\n+                                        doses = combo;\n+\n+                                    // Master Poisoner\n+                                    Unit::AuraEffectList const& auraList = m_caster->GetAuraEffectsByType(SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL_NOT_STACK);\n+                                    for (Unit::AuraEffectList::const_iterator iter = auraList.begin(); iter != auraList.end(); ++iter)\n+                                    {\n+                                        if ((*iter)->GetSpellInfo()->SpellFamilyName == SPELLFAMILY_ROGUE && (*iter)->GetSpellInfo()->SpellIconID == 1960)\n+                                        {\n+                                            uint32 chance = (*iter)->GetSpellInfo()->GetEffect(EFFECT_2).CalcValue(m_caster);\n+\n+                                            if (chance && roll_chance_i(chance))\n+                                                needConsume = false;\n+\n+                                            break;\n+                                        }\n+                                    }\n+\n+                                    if (needConsume)\n+                                        for (uint32 i = 0; i < doses; ++i)\n+                                            unitTarget->RemoveAuraFromStack(spellId, m_caster->GetGUID());\n+\n+                                    damage *= doses;\n+                                    damage += int32(m_caster->GetTotalAttackPowerValue(BASE_ATTACK) * 0.09f * combo);\n+                                }\n+\n+                                // Eviscerate and Envenom Bonus Damage (item set effect)\n+                                if (m_caster->HasAura(37169))\n+                                    damage += combo * 40;\n+                            }\n+                        }\n+                        //end npcbot\n                     }\n                     // Eviscerate\n                     else if (m_spellInfo->SpellFamilyFlags[0] & 0x00020000)\n@@ -553,6 +610,20 @@ void Spell::EffectSchoolDMG(SpellEffIndex effIndex)\n                                     damage += combo * 40;\n                             }\n                         }\n+                        //npcbot: Eviscerate support\n+                        else if (m_caster->IsNPCBot())\n+                        {\n+                            if (uint32 combo = m_caster->ToCreature()->GetCreatureComboPoints())\n+                            {\n+                                float ap = m_caster->GetTotalAttackPowerValue(BASE_ATTACK);\n+                                damage += std::lroundf(ap * combo * 0.07f);\n+\n+                                // Eviscerate and Envenom Bonus Damage (item set effect)\n+                                if (m_caster->HasAura(37169))\n+                                    damage += combo*40;\n+                            }\n+                        }\n+                        //end npcbot\n                     }\n                     break;\n                 }\n@@ -604,6 +675,27 @@ void Spell::EffectSchoolDMG(SpellEffIndex effIndex)\n                             }\n                             damage += int32(caster->GetAmmoDPS() * caster->GetAttackTime(RANGED_ATTACK) * 0.001f);\n                         }\n+                        //npcbot: calculate bot weapon damage\n+                        if (m_caster->IsNPCBot())\n+                        {\n+                            if (Item* item = m_caster->ToCreature()->GetBotEquips(2/*BOT_SLOT_RANGED*/))\n+                            {\n+                                ItemTemplate const* weaponTemplate = item->GetTemplate();\n+                                float dmg_min = 0.f;\n+                                float dmg_max = 0.f;\n+                                for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)\n+                                {\n+                                    dmg_min += weaponTemplate->Damage[i].DamageMin;\n+                                    dmg_max += weaponTemplate->Damage[i].DamageMax;\n+                                }\n+                                if (dmg_max == 0.0f && dmg_min > dmg_max)\n+                                    damage += int32(dmg_min);\n+                                else\n+                                    damage += irand(int32(dmg_min), int32(dmg_max));\n+                                damage += int32(m_caster->ToCreature()->GetCreatureAmmoDPS() * weaponTemplate->Delay * 0.001f);\n+                            }\n+                        }\n+                        //end npcbot\n                     }\n                     break;\n                 }\n@@ -629,6 +721,26 @@ void Spell::EffectSchoolDMG(SpellEffIndex effIndex)\n                             int32 count = m_caster->CalculateSpellDamage(unitTarget, m_spellInfo, EFFECT_2);\n                             damage += count * int32(average * IN_MILLISECONDS) / m_caster->GetAttackTime(BASE_ATTACK);\n                         }\n+                        //npcbot: creature weaoin damage\n+                        else if (m_caster->IsNPCBot())\n+                        {\n+                            float minTotal = 0.f;\n+                            float maxTotal = 0.f;\n+\n+                            float tmpMin, tmpMax;\n+                            for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)\n+                            {\n+                                m_caster->ToCreature()->CalculateMinMaxDamage(BASE_ATTACK, false, false, tmpMin, tmpMax, i);\n+                                minTotal += tmpMin;\n+                                maxTotal += tmpMax;\n+                            }\n+\n+                            float average = (minTotal + maxTotal) / 2;\n+                            // Add main hand dps * effect[2] amount\n+                            int32 count = m_caster->CalculateSpellDamage(unitTarget, m_spellInfo, EFFECT_2);\n+                            damage += count * int32(average * IN_MILLISECONDS) / m_caster->GetAttackTime(BASE_ATTACK);\n+                        }\n+                        //end npcbot\n                         break;\n                     }\n                     // Shield of Righteousness\n@@ -797,6 +909,62 @@ void Spell::EffectTriggerSpell(SpellEffIndex effIndex)\n         // special cases\n         switch (triggered_spell_id)\n         {\n+            //npcbot: triggered heal/energize calculation (effect)\n+            // Quest - Self Healing from resurrect (invisible in log)\n+            case 25155:\n+            {\n+                switch (m_spellInfo->Id)\n+                {\n+                    //Replenish Life (Regenerating Aura)\n+                    case 34756:\n+                    {\n+                        //cannot target self\n+                        if (m_caster == unitTarget)\n+                            return;\n+\n+                        // % of max health\n+                        int32 basepoints0 = 0.01f * unitTarget->GetMaxHealth() * m_spellInfo->Effects[effIndex].BasePoints;\n+                        //TC_LOG_ERROR(\"entities.unit\", \"TriggerSpell(%u from %u): %s on %s base val %i,\",\n+                        //    triggered_spell_id, m_spellInfo->Id, m_caster->GetName().c_str(), unitTarget->GetName().c_str(), int32(basepoints0));\n+                        //CastSpellExtraArgs args(true);\n+                        //args.AddSpellBP0(basepoints0);\n+                        //unitTarget->CastSpell(unitTarget, triggered_spell_id, args);\n+                        unitTarget->CastCustomSpell(unitTarget, triggered_spell_id, &basepoints0, nullptr, nullptr, true);\n+                        return;\n+                    }\n+                    default:\n+                        break;\n+                }\n+                break;\n+            }\n+            // Energize (invisible in log)\n+            case 60628:\n+            {\n+                switch (m_spellInfo->Id)\n+                {\n+                    //Replenish Mana\n+                    case 33394:\n+                    {\n+                        //cannot target self\n+                        if (m_caster == unitTarget)\n+                            return;\n+\n+                        // % of max mana\n+                        int32 basepoints0 = m_spellInfo->Effects[effIndex].BasePoints;\n+                        //TC_LOG_ERROR(\"entities.unit\", \"TriggerSpell(%u from %u): %s on %s base val %i,\",\n+                        //    triggered_spell_id, m_spellInfo->Id, m_caster->GetName().c_str(), unitTarget->GetName().c_str(), int32(basepoints0));\n+                        //CastSpellExtraArgs args(true);\n+                        //args.AddSpellBP0(basepoints0);\n+                        //unitTarget->CastSpell(unitTarget, triggered_spell_id, args);\n+                        unitTarget->CastCustomSpell(unitTarget, triggered_spell_id, &basepoints0, nullptr, nullptr, true, nullptr, nullptr, m_caster->GetGUID());\n+                        return;\n+                    }\n+                    default:\n+                        break;\n+                }\n+                break;\n+            }\n+            //end npcbot\n             // Mirror Image\n             case 58832:\n                 {\n@@ -898,6 +1066,10 @@ void Spell::EffectTriggerSpell(SpellEffIndex effIndex)\n         return;\n     }\n \n+    //npcbot: override spellInfo\n+    spellInfo = spellInfo->TryGetSpellInfoOverride(GetCaster());\n+    //end npcbot\n+\n     SpellCastTargets targets;\n     if (effectHandleMode == SPELL_EFFECT_HANDLE_LAUNCH_TARGET)\n     {\n@@ -955,6 +1127,10 @@ void Spell::EffectTriggerMissileSpell(SpellEffIndex effIndex)\n         return;\n     }\n \n+    //npcbot: override spellInfo\n+    spellInfo = spellInfo->TryGetSpellInfoOverride(GetCaster());\n+    //end npcbot\n+\n     SpellCastTargets targets;\n     if (effectHandleMode == SPELL_EFFECT_HANDLE_HIT_TARGET)\n     {\n@@ -1370,6 +1546,11 @@ void Spell::EffectPowerDrain(SpellEffIndex effIndex)\n     if (PowerType == POWER_MANA)\n         power -= unitTarget->GetSpellCritDamageReduction(power);\n \n+    //npcbot: handle Obsidian Destroyer's Drain Mana (target is friendly, amount is only limited by caster's max mana)\n+    if (m_caster->GetTypeId() == TYPEID_UNIT && m_caster->ToCreature()->GetBotClass() == 13 && PowerType == POWER_MANA)\n+        power = m_caster->GetMaxPower(PowerType);\n+    //end npcbot\n+\n     int32 newDamage = -(unitTarget->ModifyPower(PowerType, -int32(power)));\n \n     float gainMultiplier = 0.0f;\n@@ -2090,6 +2271,45 @@ void Spell::EffectOpenLock(SpellEffIndex effIndex)\n     if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET)\n         return;\n \n+    //npcbot\n+    if (m_caster->IsNPCBot() && gameObjTarget)\n+    {\n+        GameObjectTemplate const* botGoInfo = gameObjTarget->GetGOInfo();\n+        Creature* bot = m_caster->ToCreature();\n+\n+        // Arathi Basin banner opening. /// @todo Verify correctness of this check\n+        if ((botGoInfo->type == GAMEOBJECT_TYPE_BUTTON && botGoInfo->button.noDamageImmune) ||\n+            (botGoInfo->type == GAMEOBJECT_TYPE_GOOBER && botGoInfo->goober.losOK))\n+        {\n+            //CanUseBattlegroundObject() already called in CheckCast()\n+            // in battleground check\n+            if (Battleground* bg = bot->GetBotBG())\n+            {\n+                bg->EventBotClickedOnFlag(bot, gameObjTarget);\n+                return;\n+            }\n+        }\n+        else if (botGoInfo->type == GAMEOBJECT_TYPE_FLAGSTAND)\n+        {\n+            //CanUseBattlegroundObject() already called in CheckCast()\n+            // in battleground check\n+            if (Battleground* bg = bot->GetBotBG())\n+            {\n+                if (bg->GetBgTypeID(true) == BATTLEGROUND_EY)\n+                    bg->EventBotClickedOnFlag(bot, gameObjTarget);\n+                return;\n+            }\n+        }\n+        else if (botGoInfo->type == GAMEOBJECT_TYPE_TRAP)\n+        {\n+            gameObjTarget->SetLootState(GO_ACTIVATED);\n+            return;\n+        }\n+\n+        return;\n+    }\n+    //end npcbot\n+\n     if (!m_caster->IsPlayer())\n     {\n         LOG_DEBUG(\"spells.aura\", \"WORLD: Open Lock - No Player Caster!\");\n@@ -3404,6 +3624,14 @@ void Spell::EffectWeaponDmg(SpellEffIndex effIndex)\n                         if (Item* item = m_caster->ToPlayer()->GetWeaponForAttack(m_attackType, true))\n                             if (item->GetTemplate()->SubClass == ITEM_SUBCLASS_WEAPON_DAGGER)\n                                 AddPct(totalDamagePercentMod, 50.0f);\n+\n+                    //npcbot: handle bot weapons\n+                    // 50% more damage with daggers\n+                    if (m_caster->IsNPCBot())\n+                        if (Item const* weapon = m_caster->ToCreature()->GetBotEquips(m_attackType))\n+                            if (weapon->GetTemplate()->SubClass == ITEM_SUBCLASS_WEAPON_DAGGER)\n+                                totalDamagePercentMod *= 1.5f;\n+                    //end npcbot\n                 }\n                 // Mutilate (for each hand)\n                 else if (m_spellInfo->SpellFamilyFlags[1] & 0x6)\n@@ -3781,6 +4009,14 @@ void Spell::EffectSummonObjectWild(SpellEffIndex effIndex)\n             if (Battleground* bg = player->GetBattleground())\n                 bg->SetDroppedFlagGUID(pGameObj->GetGUID(), player->GetTeamId() == TEAM_ALLIANCE ? TEAM_HORDE : TEAM_ALLIANCE);\n \n+    //npcbot\n+    if (m_caster->IsNPCBot() && pGameObj->GetGoType() == GAMEOBJECT_TYPE_FLAGDROP)\n+    {\n+        if (Battleground* bg = m_caster->ToCreature()->GetBotBG())\n+            bg->SetDroppedFlagGUID(pGameObj->GetGUID(), bg->GetOtherTeamId(bg->GetBotTeamId(m_caster->GetGUID())));\n+    }\n+    //end npcbot\n+\n     if (GameObject* linkedTrap = pGameObj->GetLinkedTrap())\n     {\n         linkedTrap->SetRespawnTime(duration > 0 ? duration/IN_MILLISECONDS :0);\n@@ -6020,6 +6256,21 @@ void Spell::SummonGuardian(uint32 i, uint32 entry, SummonPropertiesEntry const*\n     if (Player* modOwner = m_originalCaster->GetSpellModOwner())\n         modOwner->ApplySpellMod(m_spellInfo->Id, SPELLMOD_DURATION, duration);\n \n+    //npcbot: most bot summons are botpets, we have no place to put summon duration mods, keep them here for now\n+    if (m_originalCaster->IsNPCBot())\n+    {\n+        switch (m_spellInfo->Id)\n+        {\n+            case 49028: // Dancing Rune Weapon\n+                //Glyph of Dancing Rune Weapon: +5 sec duration\n+                duration += 5000;\n+                break;\n+            default:\n+                break;\n+        }\n+    }\n+    //end npcbot\n+\n     //TempSummonType summonType = (duration == 0) ? TEMPSUMMON_DEAD_DESPAWN : TEMPSUMMON_TIMED_DESPAWN;\n     Map* map = caster->GetMap();\n     TempSummon* summon = nullptr;\ndiff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp\nindex 1775e9ec16..fb92b28112 100644\n--- a/src/server/game/Spells/SpellInfo.cpp\n+++ b/src/server/game/Spells/SpellInfo.cpp\n@@ -28,6 +28,11 @@\n #include \"SpellAuraEffects.h\"\n #include \"SpellMgr.h\"\n \n+//npcbot\n+#include \"botmgr.h\"\n+#include \"botspell.h\"\n+//end npcbot\n+\n uint32 GetTargetFlagMask(SpellTargetObjectTypes objType)\n {\n     switch (objType)\n@@ -450,6 +455,31 @@ int32 SpellEffectInfo::CalcValue(Unit const* caster, int32 const* bp, Unit const\n     // random damage\n     if (caster)\n     {\n+        //npcbot: Life Burst heal tempfix 2013\n+        float pointsPerComboPoint = PointsPerComboPoint;\n+        if (_spellInfo->Id == 57143 && EffectIndex == EFFECT_1)\n+        {\n+            basePoints = 2500;\n+            value = float(basePoints);\n+            pointsPerComboPoint = 2500.f;\n+        }\n+        //npcbot: bonus amount from combo points and specific mods\n+        if (caster->IsNPCBot())\n+        {\n+            if (uint8 comboPoints = caster->ToCreature()->GetCreatureComboPoints())\n+                value += pointsPerComboPoint * comboPoints;\n+        }\n+        //npcbot: bonus amount from combo points (vehicle)\n+        else if (caster->IsVehicle() && caster->GetTypeId() == TYPEID_UNIT && caster->GetCharmerGUID().IsCreature() &&\n+            PointsPerComboPoint)\n+        {\n+            Unit const* bot = caster->GetCharmer();\n+            if (bot && bot->ToCreature()->IsNPCBot())\n+                if (uint8 comboPoints = bot->ToCreature()->GetCreatureComboPoints())\n+                    value += pointsPerComboPoint * comboPoints;\n+        }\n+        else\n+        //end npcbot\n         // bonus amount from combo points\n         if (uint8 comboPoints = caster->GetComboPoints())\n         {\n@@ -533,6 +563,12 @@ float SpellEffectInfo::CalcValueMultiplier(Unit* caster, Spell* spell) const\n     float multiplier = ValueMultiplier;\n     if (Player* modOwner = (caster ? caster->GetSpellModOwner() : nullptr))\n         modOwner->ApplySpellMod(_spellInfo->Id, SPELLMOD_VALUE_MULTIPLIER, multiplier, spell);\n+\n+    //npcbot - apply bot spell effect value mult mods\n+    if (caster && caster->IsNPCBot())\n+        BotMgr::ApplyBotEffectValueMultiplierMods(caster->ToCreature(), _spellInfo, SpellEffIndex(EffectIndex), multiplier);\n+    //end npcbot\n+\n     return multiplier;\n }\n \n@@ -561,6 +597,11 @@ float SpellEffectInfo::CalcRadius(Unit* caster, Spell* spell) const\n         radius = std::min(radius, RadiusEntry->RadiusMax);\n         if (Player* modOwner = caster->GetSpellModOwner())\n             modOwner->ApplySpellMod(_spellInfo->Id, SPELLMOD_RADIUS, radius, spell);\n+\n+        //npcbot - apply bot spell radius mods\n+        if (caster->IsNPCBotOrPet())\n+            caster->ToCreature()->ApplyCreatureSpellRadiusMods(_spellInfo, radius);\n+        //end npcbot\n     }\n \n     return radius;\n@@ -877,6 +918,12 @@ SpellInfo::~SpellInfo()\n     _UnloadImplicitTargetConditionLists();\n }\n \n+SpellInfo const* SpellInfo::TryGetSpellInfoOverride(WorldObject const* caster) const\n+{\n+    SpellInfo const* spellInfoOverride = (caster && caster->IsNPCBotOrPet()) ? GetBotSpellInfoOverride(Id) : nullptr;\n+    return spellInfoOverride ? spellInfoOverride : this;\n+}\n+\n uint32 SpellInfo::GetCategory() const\n {\n     return CategoryEntry ? CategoryEntry->Id : 0;\n@@ -1771,9 +1818,15 @@ SpellCastResult SpellInfo::CheckTarget(Unit const* caster, WorldObject const* ta\n     else\n     {\n         if (HasAttribute(SPELL_ATTR3_ONLY_ON_PLAYER))\n+            //npcbot: allow to target bots\n+            if (!unitTarget->IsNPCBot())\n+            //end npcbot\n             return SPELL_FAILED_TARGET_NOT_PLAYER;\n \n         if (HasAttribute(SPELL_ATTR5_NOT_ON_PLAYER_CONTROLLED_NPC) && unitTarget->IsControlledByPlayer())\n+            //npcbot: allow to target bots\n+            if (!unitTarget->IsNPCBot())\n+            //end npcbot\n             return SPELL_FAILED_TARGET_IS_PLAYER_CONTROLLED;\n     }\n \n@@ -1872,6 +1925,13 @@ SpellCastResult SpellInfo::CheckExplicitTarget(Unit const* caster, WorldObject c\n                     return SPELL_CAST_OK;\n             return SPELL_FAILED_BAD_TARGETS;\n         }\n+        //npcbot\n+        else if ((neededTargets & TARGET_FLAG_CORPSE_ALLY) && unitTarget->IsNPCBot())\n+        {\n+            if (!caster->_IsValidAssistTarget(unitTarget, this))\n+                return SPELL_FAILED_BAD_TARGETS;\n+        }\n+        //end npcbot\n     }\n     return SPELL_CAST_OK;\n }\n@@ -2881,6 +2941,11 @@ int32 SpellInfo::CalcPowerCost(Unit const* caster, SpellSchoolMask schoolMask, S\n         }\n     }\n \n+    //npcbot - apply bot spell cost mods\n+    if (powerCost > 0 && caster->IsNPCBot())\n+        caster->ToCreature()->ApplyCreatureSpellCostMods(this, powerCost);\n+    //end npcbot\n+\n     // PCT mod from user auras by school\n     powerCost = int32(powerCost * (1.0f + caster->GetFloatValue(static_cast<uint16>(UNIT_FIELD_POWER_COST_MULTIPLIER) + school)));\n     if (powerCost < 0)\ndiff --git a/src/server/game/Spells/SpellInfo.h b/src/server/game/Spells/SpellInfo.h\nindex b87b5e37d9..26d36314d0 100644\n--- a/src/server/game/Spells/SpellInfo.h\n+++ b/src/server/game/Spells/SpellInfo.h\n@@ -299,6 +299,10 @@ public:\n         ItemType(0), TriggerSpell(0), ImplicitTargetConditions(nullptr) {}\n     SpellEffectInfo(SpellEntry const* spellEntry, SpellInfo const* spellInfo, uint8 effIndex);\n \n+    //npcbot\n+    void OverrideSpellInfo(SpellInfo const* spellInfo) { ASSERT_NOTNULL(spellInfo); _spellInfo = spellInfo; }\n+    //end npcbot\n+\n     bool IsEffect() const;\n     bool IsEffect(SpellEffects effectName) const;\n     bool IsAura() const;\n@@ -559,6 +563,10 @@ public:\n     std::array<SpellEffectInfo, MAX_SPELL_EFFECTS> const& GetEffects() const { return Effects; }\n     SpellEffectInfo const& GetEffect(SpellEffIndex index) const { ASSERT(index < Effects.size()); return Effects[index]; }\n \n+    //npcbot\n+    SpellInfo const* TryGetSpellInfoOverride(WorldObject const* caster) const;\n+    //end npcbot\n+\n     // loading helpers\n     void _InitializeExplicitTargetMask();\n     bool _IsPositiveEffect(uint8 effIndex, bool deep) const;\ndiff --git a/src/server/game/Spells/SpellInfoCorrections.cpp b/src/server/game/Spells/SpellInfoCorrections.cpp\nindex f5d1d83e29..a5644424e8 100644\n--- a/src/server/game/Spells/SpellInfoCorrections.cpp\n+++ b/src/server/game/Spells/SpellInfoCorrections.cpp\n@@ -40,6 +40,68 @@ void SpellMgr::LoadSpellInfoCorrections()\n {\n     uint32 oldMSTime = getMSTime();\n \n+    //npcbot: corrections for Life Tap (see Trinity-Bots issue #239)\n+    ApplySpellFix({1454}, [](SpellInfo* spellInfo) // Life Tap (Rank 1)\n+    {\n+        spellInfo->SpellLevel = 6;\n+        spellInfo->BaseLevel = 6;\n+        spellInfo->MaxLevel = 16;\n+    });\n+    ApplySpellFix({1455}, [](SpellInfo* spellInfo) // Life Tap (Rank 2)\n+    {\n+        spellInfo->SpellLevel = 16;\n+        spellInfo->BaseLevel = 16;\n+        spellInfo->MaxLevel = 26;\n+    });\n+    ApplySpellFix({1456}, [](SpellInfo* spellInfo) // Life Tap (Rank 3)\n+    {\n+        spellInfo->SpellLevel = 26;\n+        spellInfo->BaseLevel = 26;\n+        spellInfo->MaxLevel = 36;\n+    });\n+    ApplySpellFix({11687}, [](SpellInfo* spellInfo) // Life Tap (Rank 4)\n+    {\n+        spellInfo->SpellLevel = 36;\n+        spellInfo->BaseLevel = 36;\n+        spellInfo->MaxLevel = 46;\n+    });\n+    ApplySpellFix({11688}, [](SpellInfo* spellInfo) // Life Tap (Rank 5)\n+    {\n+        spellInfo->SpellLevel = 46;\n+        spellInfo->BaseLevel = 46;\n+        spellInfo->MaxLevel = 56;\n+    });\n+    ApplySpellFix({11689}, [](SpellInfo* spellInfo) // Life Tap (Rank 6)\n+    {\n+        spellInfo->SpellLevel = 56;\n+        spellInfo->BaseLevel = 56;\n+        spellInfo->MaxLevel = 68;\n+    });\n+    ApplySpellFix({27222}, [](SpellInfo* spellInfo) // Life Tap (Rank 7)\n+    {\n+        spellInfo->SpellLevel = 68;\n+        spellInfo->BaseLevel = 68;\n+        spellInfo->MaxLevel = 78;\n+    });\n+    ApplySpellFix({57946}, [](SpellInfo* spellInfo) // Life Tap (Rank 8)\n+    {\n+        spellInfo->SpellLevel = 80;\n+        spellInfo->BaseLevel = 80;\n+        spellInfo->MaxLevel = 90;\n+    });\n+    //npcbot: corrections for Gunship Battle Shoot: should be able to target creatures (Hurl Axe can)\n+    ApplySpellFix({\n+        70162,  // Shoot 10N\n+        72566,  // Shoot 25N\n+        72567,  // Shoot 10H\n+        72568   // Shoot 25H\n+        }, [](SpellInfo* spellInfo)\n+    {\n+        spellInfo->AttributesEx3 &= ~SPELL_ATTR3_ONLY_ON_PLAYER;\n+        spellInfo->TargetAuraSpell = 0;\n+    });\n+    //end npcbot\n+\n     ApplySpellFix({\n         467,    // Thorns (Rank 1)\n         782,    // Thorns (Rank 2)\ndiff --git a/src/server/scripts/Commands/cs_npc.cpp b/src/server/scripts/Commands/cs_npc.cpp\nindex 6eb781317c..d95fe3c212 100644\n--- a/src/server/scripts/Commands/cs_npc.cpp\n+++ b/src/server/scripts/Commands/cs_npc.cpp\n@@ -214,6 +214,16 @@ public:\n         if (!sObjectMgr->GetCreatureTemplate(id))\n             return false;\n \n+        //npcbot\n+        CreatureTemplate const* cinfo = sObjectMgr->GetCreatureTemplate(id);\n+        if (cinfo && cinfo->IsNPCBotOrPet())\n+        {\n+            handler->PSendSysMessage(\"You tried to spawn creature {}, which is part of NPCBots mod. To spawn bots use '.npcbot spawn' instead.\", uint32(id));\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+        //end npcbot\n+\n         Player* chr = handler->GetSession()->GetPlayer();\n         float x = chr->GetPositionX();\n         float y = chr->GetPositionY();\n@@ -446,6 +456,15 @@ public:\n             return false;\n         }\n \n+        //npcbot\n+        if (creature->IsNPCBotOrPet())\n+        {\n+            handler->SendSysMessage(\"Selected creature has botAI assigned, use '.npcbot delete' instead\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+        //end npcbot\n+\n         // Delete the creature\n         creature->CombatStop();\n         creature->DeleteFromDB();\n@@ -885,6 +904,15 @@ public:\n             return false;\n         }\n \n+        //npcbot\n+        if (creature->GetCreatureTemplate()->IsNPCBotOrPet())\n+        {\n+            handler->PSendSysMessage(\"creature {} (id {}) is a part of NPCBots mod. Use '.npcbot move' instead\", lowGuid, creature->GetEntry());\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+        //end npcbot\n+\n         float x = handler->GetSession()->GetPlayer()->GetPositionX();\n         float y = handler->GetSession()->GetPlayer()->GetPositionY();\n         float z = handler->GetSession()->GetPlayer()->GetPositionZ();\ndiff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_viscidus.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_viscidus.cpp\nindex e3d2ddd6be..f86ff02cac 100644\n--- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_viscidus.cpp\n+++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_viscidus.cpp\n@@ -204,6 +204,14 @@ struct boss_viscidus : public BossAI\n         SpellSchoolMask spellSchoolMask = spellInfo->GetSchoolMask();\n         if (spellInfo->EquippedItemClass == ITEM_CLASS_WEAPON && spellInfo->EquippedItemSubClassMask & (1 << ITEM_SUBCLASS_WEAPON_WAND))\n         {\n+            //npcbot: get bot's wand\n+            if (caster->GetTypeId() == TYPEID_UNIT)\n+            {\n+                if (Item const* pItem = caster->ToCreature()->GetBotEquips(2/*BOT_SLOT_RANGED*/))\n+                    spellSchoolMask = SpellSchoolMask(uint32(spellSchoolMask) | (1ul << pItem->GetTemplate()->Damage[0].DamageType));\n+            }\n+            else\n+            //end npcbot\n             if (Item* pItem = caster->ToPlayer()->GetWeaponForAttack(RANGED_ATTACK))\n             {\n                 spellSchoolMask = SpellSchoolMask(1 << pItem->GetTemplate()->Damage[0].DamageType);\ndiff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp\nindex 2256c4e12e..04bb138aed 100644\n--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp\n+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp\n@@ -32,6 +32,10 @@\n #include \"PassiveAI.h\"\n #include \"SpellAuraEffects.h\"\n \n+//npcbot\n+#include \"botmgr.h\"\n+//end npcbot\n+\n enum Texts\n {\n     // High Overlord Saurfang\n@@ -610,6 +614,15 @@ public:\n                         continue;\n                     (*itr)->ToCreature()->CastSpell((*itr)->ToCreature(), explosionSpell, true);\n                 }\n+\n+                //npcbot: kill bots\n+                Transport::PassengerSet const& allpassengers = t->GetPassengers();\n+                for (Transport::PassengerSet::const_iterator citr = allpassengers.begin(); citr != allpassengers.end(); ++citr)\n+                {\n+                    if ((*citr)->GetTypeId() == TYPEID_PLAYER && (*citr)->ToPlayer()->HaveBot())\n+                        (*citr)->ToPlayer()->GetBotMgr()->KillAllBots();\n+                }\n+                //end npcbot\n             }\n \n             uint32 cannonEntry = _teamIdInInstance == TEAM_HORDE ? NPC_HORDE_GUNSHIP_CANNON : NPC_ALLIANCE_GUNSHIP_CANNON;\n@@ -1646,6 +1659,7 @@ struct npc_gunship_boarding_addAI : public ScriptedAI\n             Map::PlayerList const& pl = me->GetMap()->GetPlayers();\n             for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr)\n                 if (Player* p = itr->GetSource())\n+                {\n                     if (CanAIAttack(p) && me->IsValidAttackTarget(p))\n                     {\n                         anyValid = true;\n@@ -1653,6 +1667,23 @@ struct npc_gunship_boarding_addAI : public ScriptedAI\n                         p->SetInCombatWith(me);\n                         me->AddThreat(p, 0.0f);\n                     }\n+                    //npcbot: check bots\n+                    else if (p->HaveBot())\n+                    {\n+                        BotMap const* bmap = p->GetBotMgr()->GetBotMap();\n+                        for (BotMap::const_iterator citr = bmap->begin(); citr != bmap->end(); ++citr)\n+                        {\n+                            if (citr->second && CanAIAttack(citr->second) && me->IsValidAttackTarget(citr->second))\n+                            {\n+                                anyValid = true;\n+                                me->SetInCombatWith(citr->second);\n+                                citr->second->SetInCombatWith(me);\n+                                me->AddThreat(citr->second, 0.0f);\n+                            }\n+                        }\n+                    }\n+                    //end npcbot\n+                }\n         }\n         else\n             checkTimer -= diff;\n@@ -1888,6 +1919,7 @@ public:\n                 Map::PlayerList const& pl = me->GetMap()->GetPlayers();\n                 for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr)\n                     if (Player* p = itr->GetSource())\n+                    {\n                         if (CanAIAttack(p) && me->IsValidAttackTarget(p))\n                         {\n                             anyValid = true;\n@@ -1895,6 +1927,23 @@ public:\n                             p->SetInCombatWith(me);\n                             me->AddThreat(p, 0.0f);\n                         }\n+                        //npcbot: check bots\n+                        else if (p->HaveBot())\n+                        {\n+                            BotMap const* bmap = p->GetBotMgr()->GetBotMap();\n+                            for (BotMap::const_iterator citr = bmap->begin(); citr != bmap->end(); ++citr)\n+                            {\n+                                if (citr->second && CanAIAttack(citr->second) && me->IsValidAttackTarget(citr->second))\n+                                {\n+                                    anyValid = true;\n+                                    me->SetInCombatWith(citr->second);\n+                                    citr->second->SetInCombatWith(me);\n+                                    me->AddThreat(citr->second, 0.0f);\n+                                }\n+                            }\n+                        }\n+                        //end npcbot\n+                    }\n             }\n             else\n                 checkTimer -= diff;\ndiff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp\nindex ddcc19954b..aef7ec9b3f 100644\n--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp\n+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp\n@@ -714,6 +714,21 @@ public:\n         {\n             me->RemoveAllGameObjects();\n \n+            //npcbot\n+            if (_trappedPlayerGUID.IsCreature())\n+            {\n+                if (Creature* bot = ObjectAccessor::GetCreature(*me, _trappedPlayerGUID))\n+                {\n+                    _trappedPlayerGUID.Clear();\n+                    bot->RemoveAurasDueToSpell(SPELL_ICE_TOMB_DAMAGE);\n+                    bot->RemoveAurasDueToSpell(SPELL_ASPHYXIATION);\n+                    bot->RemoveAurasDueToSpell(SPELL_ICE_TOMB_UNTARGETABLE);\n+                    me->DespawnOrUnsummon(5s);\n+                }\n+                return;\n+            }\n+            //end npcbot\n+\n             if (Player* player = ObjectAccessor::GetPlayer(*me, _trappedPlayerGUID))\n             {\n                 _trappedPlayerGUID.Clear();\n@@ -731,6 +746,21 @@ public:\n \n             if (_existenceCheckTimer <= diff)\n             {\n+                //npcbot\n+                if (_trappedPlayerGUID.IsCreature())\n+                {\n+                    Creature* bot = ObjectAccessor::GetCreature(*me, _trappedPlayerGUID);\n+                    if (!bot || !bot->IsAlive() || !bot->HasAura(SPELL_ICE_TOMB_DAMAGE))\n+                    {\n+                        JustDied(me);\n+                        me->DespawnOrUnsummon();\n+                        return;\n+                    }\n+                    _existenceCheckTimer = 1000;\n+                    return;\n+                }\n+                //end npcbot\n+\n                 Player* player = ObjectAccessor::GetPlayer(*me, _trappedPlayerGUID);\n                 if (!player || !player->IsAlive() || !player->HasAura(SPELL_ICE_TOMB_DAMAGE))\n                 {\n@@ -1002,11 +1032,21 @@ class SindragosaIceTombCheck\n public:\n     bool operator()(Unit* unit) const\n     {\n+        //npcbot\n+        if (!unit->IsPlayer())\n+            return true;\n+        //end npcbot\n+\n         return unit->HasAura(SPELL_FROST_IMBUED_BLADE) || unit->IsImmunedToDamageOrSchool(SPELL_SCHOOL_MASK_ALL);\n     }\n \n     bool operator()(WorldObject* object) const\n     {\n+        //npcbot\n+        if (!object->IsPlayer())\n+            return true;\n+        //end npcbot\n+\n         return object->ToUnit() && (object->ToUnit()->HasAura(SPELL_FROST_IMBUED_BLADE) || object->ToUnit()->IsImmunedToDamageOrSchool(SPELL_SCHOOL_MASK_ALL));\n     }\n };\ndiff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp\nindex b27e9008bf..160666486f 100644\n--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp\n+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp\n@@ -2699,6 +2699,9 @@ class spell_the_lich_king_valkyr_target_search : public SpellScript\n             targets.clear();\n             return;\n         }\n+            //npcbot\n+            targets.remove_if(Acore::ObjectTypeIdCheck(TYPEID_PLAYER, false));\n+            //end npcbot\n         targets.remove_if(Acore::UnitAuraCheck(true, GetSpellInfo()->Id));\n         targets.remove_if(Acore::UnitAuraCheck(true, SPELL_BOSS_HITTIN_YA_AURA)); // done in dbc, but just to be sure xd\n         targets.remove_if(Acore::UnitAuraCheck(true, SPELL_HARVEST_SOUL_VALKYR));\ndiff --git a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp\nindex 3f0b454902..417e6e419c 100644\n--- a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp\n+++ b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp\n@@ -31,6 +31,10 @@\n #include \"WorldStateDefines.h\"\n #include \"icecrown_citadel.h\"\n \n+//npcbot\n+#include \"bot_InstanceEvents.h\"\n+//end npcbot\n+\n enum EventIds\n {\n     EVENT_PLAYERS_GUNSHIP_SPAWN     = 22663,\n@@ -1712,6 +1716,11 @@ public:\n                         }\n                     case EVENT_QUAKE_SHATTER:\n                         {\n+                            //npcbot\n+                            if (GameObject const* platform = instance->GetGameObject(ArthasPlatformGUID))\n+                                FrozenThronePlatformDestructionEvent(this, platform->GetPosition())();\n+                            //end npcbot\n+\n                             if (GameObject* platform = instance->GetGameObject(ArthasPlatformGUID))\n                                 platform->SetDestructibleState(GO_DESTRUCTIBLE_DAMAGED);\n                             if (GameObject* edge = instance->GetGameObject(FrozenThroneEdgeGUID))\ndiff --git a/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp b/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp\nindex c31b2042e8..3ca5cd2000 100644\n--- a/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp\n+++ b/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp\n@@ -315,7 +315,7 @@ public:\n \n             if (me->GetEntry() == NPC_LADY_BLAUMEUX || me->GetEntry() == NPC_SIR_ZELIEK)\n             {\n-                if (Unit* pTarget = me->SelectNearestPlayer(300.0f))\n+                if (Unit* pTarget = me->SelectNearestTarget(300.0f))\n                 {\n                     if (pTarget && me->IsValidAttackTarget(pTarget))\n                     {\ndiff --git a/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp b/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp\nindex 392425bbb8..d26567a3f0 100644\n--- a/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp\n+++ b/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp\n@@ -377,6 +377,14 @@ public:\n \n         void PassengerBoarded(Unit* passenger, int8 /*seatid*/, bool add) override\n         {\n+            //npcbot\n+            if (passenger->IsNPCBot() && add)\n+            {\n+                despawnTimer = 0;\n+                return;\n+            }\n+            //end npcbot\n+\n             if (!passenger->IsPlayer())\n                 return;\n \n@@ -416,6 +424,12 @@ public:\n             if (JustSummoned)\n             {\n                 despawnTimer = 1;\n+                //npcbot\n+                if (Vehicle const* v = me->GetVehicleKit())\n+                    if (Unit const* passenger = v->GetPassenger(0))\n+                        if (passenger->IsNPCBot())\n+                            despawnTimer = 0;\n+                //end npcbot\n                 JustSummoned = false;\n                 if (m_pInstance)\n                 {\ndiff --git a/src/server/scripts/Northrend/zone_wintergrasp.cpp b/src/server/scripts/Northrend/zone_wintergrasp.cpp\nindex 770c8ae076..dd86ddd561 100644\n--- a/src/server/scripts/Northrend/zone_wintergrasp.cpp\n+++ b/src/server/scripts/Northrend/zone_wintergrasp.cpp\n@@ -805,6 +805,11 @@ public:\n \n         bool CanControlVehicle(Unit* passenger)\n         {\n+            //npcbot\n+            if (passenger->IsNPCBot())\n+                return true;\n+            //end npcbot\n+\n             if (passenger->HasAura(SPELL_LIEUTENANT))\n                 return true;\n \ndiff --git a/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_shirrak_the_dead_watcher.cpp b/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_shirrak_the_dead_watcher.cpp\nindex bb7bb9404e..8a61b385ff 100644\n--- a/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_shirrak_the_dead_watcher.cpp\n+++ b/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_shirrak_the_dead_watcher.cpp\n@@ -110,7 +110,14 @@ struct boss_shirrak_the_dead_watcher : public BossAI\n             context.Repeat(10s);\n         }).Schedule(17s, [this](TaskContext context)\n         {\n+            //npcbot\n+            /*\n+            //end npcbot\n             if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 60.0f, true))\n+            //npcbot\n+            */\n+            if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 60.0f))\n+            //end npcbot\n             {\n                 if (Creature* cr = me->SummonCreature(ENTRY_FOCUS_FIRE, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 7000))\n                 {\ndiff --git a/src/server/scripts/Pet/pet_dk.cpp b/src/server/scripts/Pet/pet_dk.cpp\nindex f3d561f378..273295cfb4 100644\n--- a/src/server/scripts/Pet/pet_dk.cpp\n+++ b/src/server/scripts/Pet/pet_dk.cpp\n@@ -115,6 +115,30 @@ struct npc_pet_dk_ebon_gargoyle : ScriptedAI\n \n     void MySelectNextTarget()\n     {\n+            //npcbot: allow bot summons to select bot's target without being engaged themselves\n+            Unit* creator = me->GetCreator();\n+            if (creator && creator->IsCreature())\n+            {\n+                if (!me->GetVictim() || me->GetVictim()->IsImmunedToSpell(sSpellMgr->GetSpellInfo(51963)) || !me->IsValidAttackTarget(me->GetVictim()) || !creator->CanSeeOrDetect(me->GetVictim()))\n+                {\n+                    Unit* selection = creator->GetVictim();\n+                    if (selection && selection != me->GetVictim() && me->IsValidAttackTarget(selection))\n+                    {\n+                        me->GetMotionMaster()->Clear(false);\n+                        SetGazeOn(selection);\n+                    }\n+                    else if (!me->GetVictim() || !creator->CanSeeOrDetect(me->GetVictim()))\n+                    {\n+                        me->CombatStop(true);\n+                        me->GetMotionMaster()->Clear(false);\n+                        me->GetMotionMaster()->MoveFollow(creator, PET_FOLLOW_DIST, 0.0f);\n+                        RemoveTargetAura();\n+                    }\n+                }\n+                return;\n+            }\n+            //end npcbot\n+\n         Unit* owner = me->GetOwner();\n         if (owner && owner->IsPlayer() && (!me->GetVictim() || me->GetVictim()->IsImmunedToSpell(sSpellMgr->GetSpellInfo(SPELL_GARGOYLE_STRIKE)) || !me->IsValidAttackTarget(me->GetVictim()) || !owner->CanSeeOrDetect(me->GetVictim())))\n         {\ndiff --git a/src/server/scripts/Pet/pet_mage.cpp b/src/server/scripts/Pet/pet_mage.cpp\nindex 6ccf7673f4..c1725ca759 100644\n--- a/src/server/scripts/Pet/pet_mage.cpp\n+++ b/src/server/scripts/Pet/pet_mage.cpp\n@@ -181,6 +181,22 @@ struct npc_pet_mage_mirror_image : CasterAI\n             if (!owner->IsInCombat() && !me->GetVictim())\n                 EnterEvadeMode(EVADE_REASON_OTHER);\n         }\n+        //npcbot: allow mirror images to attack creature owner's target\n+        else if (owner)\n+        {\n+            if (Unit* mytar = owner->GetVictim())\n+            {\n+                if (mytar != me->GetVictim() && me->IsValidAttackTarget(mytar) && CanAIAttack(mytar))\n+                {\n+                    me->GetThreatMgr().ResetAllThreat();\n+                    me->AddThreat(mytar, 1000000.0f);\n+                    AttackStart(mytar);\n+                }\n+            }\n+            else\n+                EnterEvadeMode(EVADE_REASON_NO_HOSTILES);\n+        }\n+        //end npcbot\n     }\n \n     void Reset() override\ndiff --git a/src/server/scripts/Spells/spell_dk.cpp b/src/server/scripts/Spells/spell_dk.cpp\nindex 4421397831..20f933d2e6 100644\n--- a/src/server/scripts/Spells/spell_dk.cpp\n+++ b/src/server/scripts/Spells/spell_dk.cpp\n@@ -25,6 +25,11 @@\n #include \"SpellScriptLoader.h\"\n #include \"Totem.h\"\n #include \"UnitAI.h\"\n+\n+//npcbot\n+#include \"botmgr.h\"\n+//end npcbot\n+\n /*\n  * Scripts for spells with SPELLFAMILY_DEATHKNIGHT and SPELLFAMILY_GENERIC spells used by deathknight players.\n  * Ordered alphabetically using scriptname.\n@@ -570,8 +575,17 @@ class spell_dk_rune_of_the_fallen_crusader : public SpellScript\n     {\n         std::list<TargetInfo>* targetsInfo = GetSpell()->GetUniqueTargetInfo();\n         for (std::list<TargetInfo>::iterator ihit = targetsInfo->begin(); ihit != targetsInfo->end(); ++ihit)\n+        {\n             if (ihit->targetGUID == GetCaster()->GetGUID())\n+            {\n+                //npcbot: get bot's crit\n+                if (GetCaster()->IsNPCBot())\n+                    ihit->crit = roll_chance_f(GetCaster()->ToCreature()->GetCreatureCritChance());\n+                else\n+                //end npcbot\n                 ihit->crit = roll_chance_f(GetCaster()->GetFloatValue(PLAYER_CRIT_PERCENTAGE));\n+            }\n+        }\n     }\n \n     void Register() override\n@@ -688,6 +702,23 @@ class spell_dk_dancing_rune_weapon : public AuraScript\n \n     bool CheckProc(ProcEventInfo& eventInfo)\n     {\n+        //npcbot\n+        if (eventInfo.GetActor() && eventInfo.GetActor()->IsNPCBot())\n+        {\n+            if (!eventInfo.GetActor() || !eventInfo.GetActionTarget() || !eventInfo.GetActionTarget()->IsAlive())\n+                return false;\n+\n+            if (SpellInfo const* spellInfo = eventInfo.GetSpellInfo())\n+            {\n+                if (spellInfo->SpellFamilyFlags.HasFlag(0x20A1220, 0x10000000, 0x0) || (spellInfo->IsTargetingArea() && eventInfo.GetActor() != eventInfo.GetActionTarget()) ||\n+                    spellInfo->HasEffect(SPELL_EFFECT_SUMMON) || spellInfo->IsPositive())\n+                    return false;\n+            }\n+\n+            return true;\n+        }\n+        //end npcbot\n+\n         if (!eventInfo.GetActor() || !eventInfo.GetActionTarget() || !eventInfo.GetActionTarget()->IsAlive() || !eventInfo.GetActor()->IsPlayer())\n             return false;\n \n@@ -776,6 +807,18 @@ class spell_dk_dancing_rune_weapon_visual : public AuraScript\n     void HandleEffectApply(AuraEffect const*  /*aurEff*/, AuraEffectHandleModes /*mode*/)\n     {\n         PreventDefaultAction();\n+        //npcbot\n+        if (GetUnitOwner()->ToTempSummon()->GetSummonerGUID().IsCreature())\n+        {\n+            if (Unit* owner = GetUnitOwner()->ToTempSummon()->GetSummonerUnit())\n+            {\n+                GetUnitOwner()->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, owner->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0));\n+                GetUnitOwner()->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, owner->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1));\n+                GetUnitOwner()->SetFloatValue(UNIT_FIELD_COMBATREACH, 0.01f);\n+            }\n+        }\n+        else\n+        //end npcbot\n         if (Unit* owner = GetUnitOwner()->ToTempSummon()->GetSummonerUnit())\n         {\n             GetUnitOwner()->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, owner->GetUInt32Value(PLAYER_VISIBLE_ITEM_16_ENTRYID));\n@@ -820,6 +863,11 @@ class spell_dk_pet_scaling : public AuraScript\n         // xinef: dk ghoul inherits 70% of strength and 30% of stamina\n         if (GetUnitOwner()->GetEntry() != NPC_RISEN_GHOUL)\n         {\n+            //npcbot\n+            if (GetUnitOwner()->GetEntry() == NPC_EBON_GARGOYLE && stat == STAT_STAMINA && GetUnitOwner()->GetCreator() && GetUnitOwner()->GetCreator()->IsNPCBot())\n+                amount = CalculatePct(std::max<int32>(0, BotMgr::GetBotStat(GetUnitOwner()->GetCreator()->ToCreature(), stat)), 30);\n+            else\n+            //end npcbot\n             // xinef: ebon garogyle - inherit 30% of stamina\n             if (GetUnitOwner()->GetEntry() == NPC_EBON_GARGOYLE && stat == STAT_STAMINA)\n                 if (Unit* owner = GetUnitOwner()->GetOwner())\n@@ -1080,6 +1128,22 @@ class spell_dk_anti_magic_shell_raid : public AuraScript\n     {\n         /// @todo: this should absorb limited amount of damage, but no info on calculation formula\n         amount = -1;\n+\n+        SpellInfo const* talentSpell = sSpellMgr->AssertSpellInfo(SPELL_DK_ANTI_MAGIC_SHELL_TALENT);\n+        Unit* owner = GetCaster()->GetOwner();\n+        if (!owner)\n+            return;\n+\n+        //npcbot: take bot attack power into account\n+        if (Creature const* bot = owner->ToCreature())\n+        {\n+            if (bot->IsNPCBot())\n+            {\n+                amount = talentSpell->GetEffect(EFFECT_0).CalcValue(owner);\n+                amount += int32(2 * bot->GetTotalAttackPowerValue(BASE_ATTACK));\n+            }\n+        }\n+        //end npcbot\n     }\n \n     void Absorb(AuraEffect* /*aurEff*/, DamageInfo& dmgInfo, uint32& absorbAmount)\n@@ -2346,6 +2410,16 @@ class spell_dk_spell_deflection : public AuraScript\n         if (GetTarget()->IsNonMeleeSpellCast(false, false, true) || GetTarget()->HasUnitState(UNIT_STATE_CONTROLLED))\n             chance = 0.0f;\n \n+        //npcbot handle creature case (and prevent crashes)\n+        Unit* target = GetTarget();\n+        if (target->GetTypeId() == TYPEID_UNIT)\n+        {\n+            if (dmgInfo.GetDamageType() == SPELL_DIRECT_DAMAGE &&\n+                roll_chance_f(target->ToCreature()->GetCreatureParryChance()))\n+                absorbAmount = CalculatePct(dmgInfo.GetDamage(), absorbPct);\n+        }\n+        else\n+        //end npcbot\n         if ((dmgInfo.GetDamageType() == SPELL_DIRECT_DAMAGE) && roll_chance_f(chance))\n             absorbAmount = CalculatePct(dmgInfo.GetDamage(), absorbPct);\n     }\ndiff --git a/src/server/scripts/Spells/spell_druid.cpp b/src/server/scripts/Spells/spell_druid.cpp\nindex 0670da786a..e504af2ec9 100644\n--- a/src/server/scripts/Spells/spell_druid.cpp\n+++ b/src/server/scripts/Spells/spell_druid.cpp\n@@ -29,6 +29,11 @@\n  * Scriptnames of files in this file should be prefixed with \"spell_dru_\".\n  */\n \n+//npcbot\n+#include \"Creature.h\"\n+#include \"Group.h\"\n+//end npcbot\n+\n enum DruidSpells\n {\n     SPELL_DRUID_GLYPH_OF_WILD_GROWTH        = 62970,\n@@ -856,6 +861,10 @@ class spell_dru_rip : public AuraScript\n     bool Load() override\n     {\n         Unit* caster = GetCaster();\n+        //npcbot\n+        if (caster && caster->IsNPCBot())\n+            return true;\n+        //end npcbot\n         return caster && caster->IsPlayer();\n     }\n \n@@ -865,6 +874,22 @@ class spell_dru_rip : public AuraScript\n \n         if (Unit* caster = GetCaster())\n         {\n+            //npcbot\n+            if (caster && caster->IsNPCBot())\n+            {\n+                uint8 botcp = caster->ToCreature()->GetCreatureComboPoints();\n+                // Idol of Feral Shadows. Can't be handled as SpellMod due its dependency from CPs\n+                if (AuraEffect const* auraEffIdolOfFeralShadows = caster->GetAuraEffect(SPELL_DRUID_IDOL_OF_FERAL_SHADOWS, EFFECT_0))\n+                    amount += botcp * auraEffIdolOfFeralShadows->GetAmount();\n+                // Idol of Worship. Can't be handled as SpellMod due its dependency from CPs\n+                else if (AuraEffect const* auraEffIdolOfWorship = caster->GetAuraEffect(SPELL_DRUID_IDOL_OF_WORSHIP, EFFECT_0))\n+                    amount += botcp * auraEffIdolOfWorship->GetAmount();\n+\n+                amount += int32(CalculatePct(caster->GetTotalAttackPowerValue(BASE_ATTACK), botcp));\n+                return;\n+            }\n+            //end npcbot\n+\n             // 0.01 * $AP * cp\n             uint8 cp = caster->ToPlayer()->GetComboPoints();\n \n@@ -1143,11 +1168,50 @@ class spell_dru_t10_restoration_4p_bonus : public SpellScript\n \n     bool Load() override\n     {\n+        //npcbot\n+        if (GetCaster()->IsNPCBot())\n+            return true;\n+        //end npcbot\n         return GetCaster()->IsPlayer();\n     }\n \n     void FilterTargets(std::list<WorldObject*>& targets)\n     {\n+        //npcbot\n+        if (Creature* bot = GetCaster()->ToCreature())\n+        {\n+            if (bot->IsFreeBot())\n+            {\n+                targets.clear();\n+                targets.push_back(bot);\n+                return;\n+            }\n+\n+            targets.remove(GetExplTargetUnit());\n+            std::list<Unit*> tempTargets;\n+            Group const* gr = bot->GetBotOwner()->GetGroup();\n+            if (gr && !gr->IsMember(bot->GetGUID()))\n+                gr = nullptr;\n+\n+            if (gr)\n+                for (std::list<WorldObject*>::const_iterator itr = targets.begin(); itr != targets.end(); ++itr)\n+                    if (gr->IsMember((*itr)->GetGUID()))\n+                        tempTargets.push_back((*itr)->ToUnit());\n+\n+            if (tempTargets.empty())\n+            {\n+                targets.clear();\n+                FinishCast(SPELL_FAILED_DONT_REPORT);\n+                return;\n+            }\n+\n+            tempTargets.sort(Acore::HealthPctOrderPred());\n+            targets.clear();\n+            targets.push_back(tempTargets.front());\n+            return;\n+        }\n+        //end npcbot\n+\n         if (!GetCaster()->ToPlayer()->GetGroup())\n         {\n             targets.clear();\ndiff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp\nindex 8dff3bba93..7c157662c6 100644\n--- a/src/server/scripts/Spells/spell_generic.cpp\n+++ b/src/server/scripts/Spells/spell_generic.cpp\n@@ -2558,6 +2558,10 @@ class spell_gen_vehicle_scaling_aura: public AuraScript\n \n     bool Load() override\n     {\n+        //npcbot\n+        if (GetCaster() && GetCaster()->IsNPCBot() && GetOwner() && GetOwner()->IsCreature())\n+            return true;\n+        //end npcbot\n         return GetCaster() && GetCaster()->IsPlayer() && GetOwner() && GetOwner()->IsCreature();\n     }\n \n@@ -2580,7 +2584,19 @@ class spell_gen_vehicle_scaling_aura: public AuraScript\n                 break;\n         }\n \n+        //npcbot\n+        /*\n+        //end npcbot\n         float avgILvl = caster->ToPlayer()->GetAverageItemLevel();\n+        //npcbot\n+        */\n+        float avgILvl;\n+        if (caster->GetTypeId() == TYPEID_PLAYER)\n+            avgILvl = caster->ToPlayer()->GetAverageItemLevel();\n+        else\n+            avgILvl = caster->ToCreature()->GetBotAverageItemLevel();\n+        //end npcbot\n+\n         if (avgILvl < baseItemLevel)\n             return;                     /// @todo Research possibility of scaling down\n \n@@ -3688,6 +3704,11 @@ class spell_gen_tournament_pennant : public AuraScript\n \n     bool Load() override\n     {\n+        //npcbot\n+        if (GetCaster() && GetCaster()->IsNPCBot())\n+            return true;\n+        //end npcbot\n+\n         return GetCaster() && GetCaster()->IsPlayer();\n     }\n \ndiff --git a/src/server/scripts/Spells/spell_hunter.cpp b/src/server/scripts/Spells/spell_hunter.cpp\nindex a7147d3282..f505360983 100644\n--- a/src/server/scripts/Spells/spell_hunter.cpp\n+++ b/src/server/scripts/Spells/spell_hunter.cpp\n@@ -772,6 +772,22 @@ class spell_hun_sniper_training : public AuraScript\n \n     void HandleUpdatePeriodic(AuraEffect* aurEff)\n     {\n+        //npcbot: handle creatures, remove dead trigger\n+        if (!GetUnitOwner()->IsAlive())\n+            return;\n+        if (Creature const* bot = GetUnitOwner()->ToCreature())\n+        {\n+            if (!bot->IsNPCBot())\n+                return;\n+\n+            int32 baseAmount = aurEff->GetBaseAmount();\n+            int32 amount = bot->isMoving() || aurEff->GetAmount() <= 0 ?\n+                bot->CalculateSpellDamage(bot, GetSpellInfo(), aurEff->GetEffIndex(), &baseAmount) :\n+                aurEff->GetAmount() - 1;\n+            aurEff->SetAmount(amount);\n+            return;\n+        }\n+        //end npcbot\n         if (Player* playerTarget = GetUnitOwner()->ToPlayer())\n         {\n             int32 baseAmount = aurEff->GetBaseAmount();\ndiff --git a/src/server/scripts/Spells/spell_item.cpp b/src/server/scripts/Spells/spell_item.cpp\nindex dc93404799..1c3544e49a 100644\n--- a/src/server/scripts/Spells/spell_item.cpp\n+++ b/src/server/scripts/Spells/spell_item.cpp\n@@ -2238,6 +2238,11 @@ class spell_item_noggenfogger_elixir : public SpellScript\n \n     bool Load() override\n     {\n+        //npcbot\n+        if (GetCaster()->IsNPCBot())\n+            return true;\n+        //end npcbot\n+\n         return GetCaster()->IsPlayer();\n     }\n \ndiff --git a/src/server/scripts/Spells/spell_mage.cpp b/src/server/scripts/Spells/spell_mage.cpp\nindex f6d5f240a9..16d5e875c9 100644\n--- a/src/server/scripts/Spells/spell_mage.cpp\n+++ b/src/server/scripts/Spells/spell_mage.cpp\n@@ -919,6 +919,11 @@ class spell_mage_summon_water_elemental : public SpellScript\n     {\n         Unit* caster = GetCaster();\n \n+        //npcbot: prevent default handler for bots\n+        if (caster->IsNPCBot())\n+            return;\n+        //end npcbot\n+\n         if (Creature* pet = ObjectAccessor::GetCreature(*caster, caster->GetPetGUID()))\n             if (!pet->IsAlive())\n                 pet->ToTempSummon()->UnSummon();\ndiff --git a/src/server/scripts/Spells/spell_paladin.cpp b/src/server/scripts/Spells/spell_paladin.cpp\nindex 963d1d2667..8915bee5d6 100644\n--- a/src/server/scripts/Spells/spell_paladin.cpp\n+++ b/src/server/scripts/Spells/spell_paladin.cpp\n@@ -29,6 +29,10 @@\n  * Scriptnames of files in this file should be prefixed with \"spell_pal_\".\n  */\n \n+//npcbot\n+#include \"Creature.h\"\n+//end npcbot\n+\n enum PaladinSpells\n {\n     SPELL_PALADIN_DIVINE_PLEA                    = 54428,\n@@ -339,6 +343,12 @@ private:\n     {\n         healPct = GetSpellInfo()->Effects[EFFECT_1].CalcValue();\n         absorbPct = GetSpellInfo()->Effects[EFFECT_0].CalcValue();\n+\n+        //npcbot - allow for npcbots\n+        if (GetUnitOwner()->IsNPCBot())\n+            return true;\n+        //end npcbot\n+\n         return GetUnitOwner()->IsPlayer();\n     }\n \n@@ -353,6 +363,39 @@ private:\n         Unit* victim = GetTarget();\n         int32 remainingHealth = victim->GetHealth() - dmgInfo.GetDamage();\n         uint32 allowedHealth = victim->CountPctFromMaxHealth(35);\n+\n+        //npcbot - calc for bots\n+        if (victim->GetTypeId() == TYPEID_UNIT/* && victim->ToCreature()->IsNPCBot()*/)\n+        {\n+            if (remainingHealth <= 0 && !victim->HasSpellCooldown(PAL_SPELL_ARDENT_DEFENDER_HEAL) &&\n+                !victim->ToCreature()->HasSpellCooldown(PAL_SPELL_ARDENT_DEFENDER_HEAL))\n+            {\n+                // Cast healing spell, completely avoid damage\n+                absorbAmount = dmgInfo.GetDamage();\n+\n+                float defenseSkillValue = victim->GetDefenseSkillValue();\n+                // Max heal when defense skill denies critical hits from raid bosses\n+                // Formula: max defense at level + 140 (rating from gear)\n+                float reqDefForMaxHeal = victim->GetMaxSkillValueForLevel() + 140.0f;\n+                float defenseFactor = std::min(1.0f, defenseSkillValue / reqDefForMaxHeal);\n+\n+                int32 healAmount = int32(victim->CountPctFromMaxHealth(uint32(healPct * defenseFactor)));\n+                victim->CastCustomSpell(PAL_SPELL_ARDENT_DEFENDER_HEAL, SPELLVALUE_BASE_POINT0, healAmount, victim, true, nullptr, aurEff);\n+                victim->ToCreature()->AddBotSpellCooldown(PAL_SPELL_ARDENT_DEFENDER_HEAL, 120000);\n+            }\n+            else if (remainingHealth < int32(allowedHealth))\n+            {\n+                // Reduce damage that brings us under 35% (or full damage if we are already under 35%) by x%\n+                uint32 damageToReduce = (victim->GetHealth() < allowedHealth)\n+                    ? dmgInfo.GetDamage()\n+                    : allowedHealth - remainingHealth;\n+                absorbAmount = CalculatePct(damageToReduce, absorbPct);\n+            }\n+\n+            return;\n+        }\n+        //end npcbot\n+\n         // If damage kills us\n         if (remainingHealth <= 0 && !victim->ToPlayer()->HasAura(PAL_SPELL_ARDENT_DEFENDER_DEBUFF))\n         {\n@@ -605,6 +648,23 @@ class spell_pal_divine_sacrifice : public AuraScript\n     {\n         if (Unit* caster = GetCaster())\n         {\n+            //npcbot: handle for bots\n+            if (caster->IsNPCBot())\n+            {\n+                Player const* owner = caster->ToCreature()->GetBotOwner();\n+                if (!owner || owner->GetTypeId() != TYPEID_PLAYER)\n+                    return false;\n+\n+                if (owner->GetGroup())\n+                    groupSize = owner->GetGroup()->GetMembersCount();\n+                else\n+                    groupSize = 1 + owner->GetNpcBotsCount();\n+\n+                remainingAmount = (caster->CountPctFromMaxHealth(GetSpellInfo()->Effects[EFFECT_2].CalcValue(caster)) * groupSize);\n+                minHpPct = GetSpellInfo()->Effects[EFFECT_1].CalcValue(caster);\n+                return true;\n+            }\n+            //end npcbot\n             if (caster->IsPlayer())\n             {\n                 if (caster->ToPlayer()->GetGroup())\n@@ -1128,6 +1188,9 @@ class spell_pal_righteous_defense : public SpellScript\n     {\n         Unit* caster = GetCaster();\n         if (!caster->IsPlayer())\n+            //npcbot: this player check makes no sense\n+            if (!caster->IsNPCBot())\n+            //end npcbot\n             return SPELL_FAILED_DONT_REPORT;\n \n         if (Unit* target = GetExplTargetUnit())\ndiff --git a/src/server/scripts/Spells/spell_priest.cpp b/src/server/scripts/Spells/spell_priest.cpp\nindex 4ab3a1611c..7c52623ccf 100644\n--- a/src/server/scripts/Spells/spell_priest.cpp\n+++ b/src/server/scripts/Spells/spell_priest.cpp\n@@ -565,6 +565,10 @@ class spell_pri_penance : public SpellScript\n \n     bool Load() override\n     {\n+        //npcbot\n+        if (GetCaster() && GetCaster()->IsNPCBot())\n+            return true;\n+        //end npcbot\n         return GetCaster()->IsPlayer();\n     }\n \n@@ -795,6 +799,10 @@ class spell_pri_renew : public AuraScript\n \n     bool Load() override\n     {\n+        //npcbot\n+        if (GetCaster() && GetCaster()->IsNPCBot())\n+            return true;\n+        //end npcbot\n         return GetCaster() && GetCaster()->IsPlayer();\n     }\n \ndiff --git a/src/server/scripts/Spells/spell_rogue.cpp b/src/server/scripts/Spells/spell_rogue.cpp\nindex 1d01f3028c..8a1c7b66a4 100644\n--- a/src/server/scripts/Spells/spell_rogue.cpp\n+++ b/src/server/scripts/Spells/spell_rogue.cpp\n@@ -29,6 +29,10 @@\n  * Scriptnames of files in this file should be prefixed with \"spell_rog_\".\n  */\n \n+//npcbot\n+#include \"Creature.h\"\n+//end npcbot\n+\n enum RogueSpells\n {\n     SPELL_ROGUE_BLADE_FLURRY_EXTRA_ATTACK       = 22482,\n@@ -177,6 +181,10 @@ class spell_rog_cheat_death : public AuraScript\n     bool Load() override\n     {\n         absorbChance = GetSpellInfo()->Effects[EFFECT_0].CalcValue();\n+        //npcbot\n+        if (GetUnitOwner()->IsNPCBot())\n+            return true;\n+        //end npcbot\n         return GetUnitOwner()->ToPlayer();\n     }\n \n@@ -188,6 +196,27 @@ class spell_rog_cheat_death : public AuraScript\n \n     void Absorb(AuraEffect* /*aurEff*/, DamageInfo& dmgInfo, uint32& absorbAmount)\n     {\n+        //npcbot\n+        if (Creature* bot = GetTarget()->ToCreature())\n+        {\n+            if (dmgInfo.GetDamage() < bot->GetHealth() || bot->HasSpellCooldown(SPELL_ROGUE_CHEAT_DEATH_COOLDOWN) ||\n+                bot->HasSpellCooldown(SPELL_ROGUE_CHEAT_DEATH_COOLDOWN) || !roll_chance_i(absorbChance))\n+                return;\n+\n+            bot->CastSpell(bot, SPELL_ROGUE_CHEAT_DEATH_COOLDOWN, true);\n+            bot->AddBotSpellCooldown(SPELL_ROGUE_CHEAT_DEATH_COOLDOWN, MINUTE * IN_MILLISECONDS);\n+\n+            uint32 health10 = bot->CountPctFromMaxHealth(10);\n+\n+            if (bot->GetHealth() > health10)\n+                absorbAmount = dmgInfo.GetDamage() - bot->GetHealth() + health10;\n+            else\n+                absorbAmount = dmgInfo.GetDamage();\n+\n+            return;\n+        }\n+        //end npcbot\n+\n         Player* target = GetTarget()->ToPlayer();\n         if (dmgInfo.GetDamage() < target->GetHealth() || target->HasSpellCooldown(SPELL_ROGUE_CHEAT_DEATH_COOLDOWN) || !roll_chance_i(absorbChance))\n             return;\n@@ -337,9 +366,16 @@ class spell_rog_killing_spree_aura : public AuraScript\n \n                 GetTarget()->CastSpell(target, SPELL_ROGUE_KILLING_SPREE_TELEPORT, true);\n \n+                    //npcbot: prevent crash from trying to access player fields\n+                    if (GetTarget()->GetTypeId() == TYPEID_PLAYER)\n+                    {\n+                    //end npcbot\n                 // xinef: ensure fast coordinates switch, dont wait for client to send opcode\n                 WorldLocation const& dest = GetTarget()->ToPlayer()->GetTeleportDest();\n                 GetTarget()->ToPlayer()->UpdatePosition(dest, true);\n+                    //npcbot\n+                    }\n+                    //end npcbot\n \n                 GetTarget()->CastSpell(target, SPELL_ROGUE_KILLING_SPREE_WEAPON_DMG, TriggerCastFlags(TRIGGERED_FULL_MASK & ~TRIGGERED_DONT_REPORT_CAST_ERROR));\n                 break;\n@@ -555,6 +591,10 @@ class spell_rog_rupture : public AuraScript\n     bool Load() override\n     {\n         Unit* caster = GetCaster();\n+        //npcbot\n+        if (caster && caster->IsNPCBot())\n+            return true;\n+        //end npcbot\n         return caster && caster->IsPlayer();\n     }\n \n@@ -574,6 +614,18 @@ class spell_rog_rupture : public AuraScript\n                 0.0375f         // 5 points: ${($m1 + $b1*5 + 0.0375 * $AP) * 8} damage over 16 secs\n             };\n \n+            //npcbot\n+            if (caster->GetTypeId() == TYPEID_UNIT)\n+            {\n+                uint8 cp = caster->ToCreature()->GetCreatureComboPoints();\n+                if (cp > 5)\n+                    cp = 5;\n+\n+                amount += int32(caster->GetTotalAttackPowerValue(BASE_ATTACK) * attackpowerPerCombo[cp]);\n+                return;\n+            }\n+            //end npcbot\n+\n             uint8 cp = caster->ToPlayer()->GetComboPoints();\n             if (cp > 5)\n                 cp = 5;\ndiff --git a/src/server/scripts/Spells/spell_shaman.cpp b/src/server/scripts/Spells/spell_shaman.cpp\nindex 1a9c545a59..74e1aa83a3 100644\n--- a/src/server/scripts/Spells/spell_shaman.cpp\n+++ b/src/server/scripts/Spells/spell_shaman.cpp\n@@ -648,6 +648,16 @@ class spell_sha_earthbind_totem : public AuraScript\n     {\n         if (!GetCaster())\n             return;\n+\n+        //npcbot: workaround for bots\n+        if (ObjectGuid creatorGuid = GetCaster()->GetCreatorGUID())\n+            if (!creatorGuid.IsPlayer())\n+                if (Creature const* bot = ObjectAccessor::GetCreature(*GetCaster(), creatorGuid))\n+                    if (AuraEffect const* aur = bot->GetDummyAuraEffect(SPELLFAMILY_SHAMAN, 2289, 0))\n+                        if (roll_chance_i(aur->GetBaseAmount()))\n+                            GetTarget()->CastSpell((Unit*)nullptr, SPELL_SHAMAN_TOTEM_EARTHEN_POWER, true);\n+        //end npcbot\n+\n         if (Player* owner = GetCaster()->GetCharmerOrOwnerPlayerOrPlayerItself())\n             if (AuraEffect* aur = owner->GetDummyAuraEffect(SPELLFAMILY_SHAMAN, 2289, 0))\n                 if (roll_chance_i(aur->GetBaseAmount()))\ndiff --git a/src/server/scripts/Spells/spell_warlock.cpp b/src/server/scripts/Spells/spell_warlock.cpp\nindex c3410d0da0..258220c62c 100644\n--- a/src/server/scripts/Spells/spell_warlock.cpp\n+++ b/src/server/scripts/Spells/spell_warlock.cpp\n@@ -812,6 +812,10 @@ class spell_warl_life_tap : public SpellScript\n \n     bool Load() override\n     {\n+        //npcbot\n+        if (GetCaster()->IsNPCBot())\n+            return true;\n+        //end npcbot\n         return GetCaster()->IsPlayer();\n     }\n \n@@ -822,6 +826,11 @@ class spell_warl_life_tap : public SpellScript\n \n     void HandleDummy(SpellEffIndex /*effIndex*/)\n     {\n+        //npcbot: skip - handled inside class AI\n+        if (GetCaster()->IsNPCBot())\n+            return;\n+        //end npcbot\n+\n         Player* caster = GetCaster()->ToPlayer();\n         if (Unit* target = GetHitUnit())\n         {\ndiff --git a/src/server/shared/DataStores/DBCStructure.h b/src/server/shared/DataStores/DBCStructure.h\nindex 3ebac7eb92..1001e205b9 100644\n--- a/src/server/shared/DataStores/DBCStructure.h\n+++ b/src/server/shared/DataStores/DBCStructure.h\n@@ -562,9 +562,11 @@ struct AreaPOIEntry\n     uint32 mapId;               //15\n     //uint32 val1;              //16\n     uint32 zoneId;              //17\n-    //char const* name[16];     //18-33\n+    char const* name;           // 18\n+    //char const* name[15];     // 19-33\n     //uint32 name_flag;         //34\n-    //char const* name2[16];    //35-50\n+    char const* name2;          // 35\n+    //char const* name2[15];    // 36-50\n     //uint32 name_flag2;        //51\n     uint32 worldState;          //52\n     //uint32 val2;              //53\ndiff --git a/src/server/shared/DataStores/DBCfmt.h b/src/server/shared/DataStores/DBCfmt.h\nindex e3af013ca5..cfc6321e3f 100644\n--- a/src/server/shared/DataStores/DBCfmt.h\n+++ b/src/server/shared/DataStores/DBCfmt.h\n@@ -23,7 +23,7 @@ char constexpr AchievementCategoryfmt[] = \"nixxxxxxxxxxxxxxxxxx\";\n char constexpr AchievementCriteriafmt[] = \"niiiiiiiixxxxxxxxxxxxxxxxxiiiix\";\n char constexpr AreaTableEntryfmt[] = \"niiiixxxxxissssssssssssssssxiiiiixxx\";\n char constexpr AreaGroupEntryfmt[] = \"niiiiiii\";\n-char constexpr AreaPOIEntryfmt[] = \"niiiiiiiiiiifffixixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxix\";\n+char constexpr AreaPOIEntryfmt[] = \"niiiiiiiiiiifffixisxxxxxxxxxxxxxxxxsxxxxxxxxxxxxxxxxix\";\n char constexpr AuctionHouseEntryfmt[] = \"niiixxxxxxxxxxxxxxxxx\";\n char constexpr BankBagSlotPricesEntryfmt[] = \"ni\";\n char constexpr BarberShopStyleEntryfmt[] = \"nixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxiii\";\ndiff --git a/src/server/shared/SharedDefines.h b/src/server/shared/SharedDefines.h\nindex 9b081e7f59..d5d44a4587 100644\n--- a/src/server/shared/SharedDefines.h\n+++ b/src/server/shared/SharedDefines.h\n@@ -146,7 +146,14 @@ enum Classes\n     (1<<(CLASS_DEATH_KNIGHT-1)))\n \n // valid classes for creature_template.unit_class\n+//npcbot\n+/*\n+//end npcbot\n #define CLASSMASK_ALL_CREATURES ((1<<(CLASS_WARRIOR-1)) | (1<<(CLASS_PALADIN-1)) | (1<<(CLASS_ROGUE-1)) | (1<<(CLASS_MAGE-1)))\n+//npcbot\n+*/\n+#define CLASSMASK_ALL_CREATURES CLASSMASK_ALL_PLAYABLE\n+//end npcbot\n \n #define CLASSMASK_WAND_USERS ((1<<(CLASS_PRIEST-1))|(1<<(CLASS_MAGE-1))|(1<<(CLASS_WARLOCK-1)))\n \n"
  },
  {
    "path": "AC/SQL/1_world_bot_appearance.sql",
    "content": "-- Handmade data, very sensitive\nDROP TABLE IF EXISTS `creature_template_npcbot_appearance`;\n\nCREATE TABLE `creature_template_npcbot_appearance` (\n  `entry` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,\n  `name*` char(16) DEFAULT 'unk' COMMENT 'unused',\n  `gender` tinyint(3) unsigned NOT NULL DEFAULT '0',\n  `skin` tinyint(3) unsigned NOT NULL DEFAULT '0',\n  `face` tinyint(3) unsigned NOT NULL DEFAULT '0',\n  `hair` tinyint(3) unsigned NOT NULL DEFAULT '0',\n  `haircolor` tinyint(3) unsigned NOT NULL DEFAULT '0',\n  `features` tinyint(3) unsigned NOT NULL DEFAULT '0',\n  PRIMARY KEY (`entry`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\ninsert into `creature_template_npcbot_appearance`(`entry`,`name*`,`gender`,`skin`,`face`,`hair`,`haircolor`,`features`)\nvalues\n(70001,'Llane',0,3,0,1,1,6),\n(70002,'Thran',0,0,0,4,5,4),\n(70003,'Lyria',1,3,4,6,4,0),\n(70004,'Ander',0,1,11,1,7,6),\n(70005,'Malosh',0,7,0,5,5,5),\n(70006,'Granis',0,0,2,9,4,4),\n(70007,'Kelstrum',0,5,4,2,2,2),\n(70008,'Dannal',0,1,0,8,5,0),\n(70009,'Austil',0,4,1,8,1,7),\n(70010,'Torm',0,7,1,2,0,2),\n(70011,'Sark',0,0,3,7,0,5),\n(70012,'Ker',1,4,0,0,0,1),\n(70013,'Harutt',0,1,3,7,0,4),\n(70014,'Krang',0,5,2,6,2,0),\n(70015,'Frang',0,0,4,1,1,3),\n(70016,'Tarshaw',0,3,3,1,0,7),\n(70017,'Grezz',0,3,5,1,0,3),\n(70018,'Sorek',0,2,1,3,1,6),\n(70019,'Zel\\'mak',0,1,0,4,8,1),\n(70020,'Alyissia',1,5,1,5,2,0),\n(70021,'Kyra',1,6,8,4,6,1),\n(70022,'Arias\\'ta',1,0,6,3,4,1),\n(70023,'Sildanair',1,3,0,2,4,2),\n(70024,'Chris',0,3,2,2,2,10),\n(70025,'Angela',1,2,7,3,8,6),\n(70026,'Baltus',0,0,0,1,8,1),\n(70027,'Kelv',0,5,1,7,3,1),\n(70028,'Bilban',0,2,2,2,7,1),\n(70029,'Wu',0,4,5,1,0,8),\n(70030,'Ilsa',1,5,6,7,3,4),\n(70031,'Darnath',0,7,8,3,0,0),\n(70032,'Evencane',0,5,9,2,4,2),\n(70033,'Kore',0,4,0,2,1,6),\n(70034,'Ahonan',0,6,1,1,6,5),\n(70035,'Behomat',0,4,8,3,6,3),\n(70036,'Ruada',1,1,2,1,6,0),\n(70037,'Kazi',1,1,2,3,3,0),\n(70038,'Kerra',1,2,0,2,2,0),\n(70051,'Sammuel',0,9,11,6,2,7),\n(70052,'Bromos',0,6,4,2,9,1),\n(70053,'Wilhelm',0,4,2,2,1,6),\n(70054,'Grayson',0,3,2,2,0,2),\n(70055,'Azar',0,2,4,3,1,6),\n(70056,'Valgar',0,4,3,0,0,0),\n(70057,'Beldruk',0,4,6,2,4,2),\n(70058,'Brandur',0,5,4,1,1,3),\n(70059,'Arthur',0,1,0,1,5,2),\n(70060,'Katherine',1,1,3,2,4,0),\n(70061,'Karman',0,3,11,10,5,8),\n(70062,'Jesthenis',0,4,0,0,0,0),\n(70063,'Noellene',1,0,1,1,1,0),\n(70064,'Aurelon',0,8,0,0,0,0),\n(70065,'Osselan',0,8,1,1,2,0),\n(70066,'Ithelis',0,9,2,2,2,0),\n(70067,'Bachi',0,3,0,10,1,0),\n(70068,'Baatun',0,6,4,3,0,7),\n(70069,'Kavaan',0,2,5,5,6,4),\n(70070,'Tullas',1,0,9,9,2,0),\n(70071,'Jol',1,0,8,8,6,0),\n(70072,'Cyssa',1,4,1,7,6,0),\n(70073,'Pyreanor',0,3,3,2,7,1),\n(70074,'Rukua',1,5,8,4,4,1),\n(70101,'Thorgas',0,4,5,8,4,8),\n(70102,'Ogromm',0,4,4,3,1,4),\n(70103,'Grif',0,0,1,5,4,4),\n(70104,'Kragg',0,7,4,3,2,2),\n(70105,'Kary',1,2,1,1,2,1),\n(70106,'Holt',0,18,3,4,0,3),\n(70107,'Urek',0,4,2,2,1,1),\n(70108,'Lanka',0,4,2,2,1,2),\n(70109,'Yaw',0,1,1,5,2,2),\n(70110,'Jen\\'shan',1,3,0,2,6,3),\n(70111,'Thotar',0,0,3,3,1,9),\n(70112,'Ormak',0,5,8,1,0,5),\n(70113,'Xor\\'juul',0,2,3,2,0,1),\n(70114,'Sian\\'dur',1,2,4,1,2,4),\n(70115,'Ayanna',1,5,0,6,5,8),\n(70116,'Dazalar',0,8,0,6,2,3),\n(70117,'Danlaar',0,0,0,3,6,0),\n(70118,'Jeen\\'ra',1,7,2,1,4,1),\n(70119,'Jocaste',1,6,1,1,6,1),\n(70120,'Dorion',0,4,6,5,0,5),\n(70121,'Daera',1,0,3,12,4,0),\n(70122,'Olmin',0,3,1,2,2,4),\n(70123,'Regnus',0,3,9,1,4,2),\n(70124,'Kaerbrus',0,2,0,0,2,2),\n(70125,'Einris',1,1,1,5,4,0),\n(70126,'Ulfir',0,6,2,5,8,1),\n(70127,'Thorfin',0,2,2,5,4,7),\n(70128,'Alenndaar',0,2,6,3,2,2),\n(70129,'Dargh',0,3,1,1,4,4),\n(70130,'Sallina',1,4,2,1,1,0),\n(70131,'Hannovia',1,0,2,2,1,0),\n(70132,'Keilnei',1,7,5,2,4,1),\n(70133,'Tana',1,8,1,1,2,0),\n(70134,'Oninath',0,0,0,0,0,0),\n(70135,'Zandine',1,8,0,1,4,0),\n(70136,'Deremiis',0,11,0,5,6,7),\n(70137,'Acteon',0,2,0,0,0,0),\n(70138,'Vord',0,11,0,5,6,7),\n(70139,'Killac',0,11,0,5,6,7),\n(70151,'Jorik',0,3,0,11,1,2),\n(70152,'Solm',0,7,8,4,9,6),\n(70153,'Keryn',1,4,4,7,0,0),\n(70154,'Osborne',0,4,9,9,0,1),\n(70155,'Hogral',0,6,7,10,5,7),\n(70156,'Ian',0,5,9,9,1,6),\n(70157,'David',0,4,2,1,1,1),\n(70158,'Marion',1,5,2,3,5,7),\n(70159,'Rwag',0,0,0,0,0,0),\n(70160,'Kaplak',0,3,5,0,0,3),\n(70161,'Gest',0,4,0,2,0,1),\n(70162,'Ormok',0,3,8,4,0,3),\n(70163,'Shenthul',0,3,0,5,5,1),\n(70164,'Frahun',0,2,1,3,5,4),\n(70165,'Jannok',0,3,2,4,5,3),\n(70166,'Syurna',1,0,3,5,4,0),\n(70167,'Erion',0,5,0,3,4,3),\n(70168,'Anishar',0,5,6,4,6,5),\n(70169,'Carolyn',1,0,6,3,1,7),\n(70170,'Miles',0,0,0,1,9,8),\n(70171,'Gregory',0,3,7,8,4,14),\n(70172,'Hulfdan',0,8,8,8,5,6),\n(70173,'Ormyr',0,0,6,4,4,4),\n(70174,'Fenthwick',0,0,2,2,5,0),\n(70175,'Fahrad',0,3,0,9,4,2),\n(70176,'Tony',0,3,0,1,0,2),\n(70177,'Kariel',0,1,0,0,0,0),\n(70178,'Tannaria',1,2,2,0,2,0),\n(70179,'Zelanis',0,0,1,1,1,0),\n(70180,'Elara',1,2,2,1,4,0),\n(70181,'Nerisen',0,1,1,2,1,0),\n(70201,'Anetta',1,0,9,14,5,0),\n(70202,'Laurena',1,0,1,4,5,0),\n(70203,'Josetta',1,1,3,17,2,0),\n(70204,'Branstock',0,2,7,1,8,0),\n(70205,'Maxan',0,2,0,6,1,5),\n(70206,'Duesten',0,0,9,5,1,0),\n(70207,'Beryl',0,0,0,0,0,12),\n(70208,'Miles',0,0,2,7,9,2),\n(70209,'Malakai',0,4,3,2,6,8),\n(70210,'Cobb',0,5,6,6,4,14),\n(70211,'Shanda',1,1,0,2,7,4),\n(70212,'Laurna',1,0,7,0,2,4),\n(70213,'Tai\\'jin',1,0,3,1,6,5),\n(70214,'Ken\\'jai',0,5,2,4,3,0),\n(70215,'Astarii',1,0,0,0,0,0),\n(70216,'Jandria',1,1,1,5,3,0),\n(70217,'Lariia',1,0,3,3,6,0),\n(70218,'Lankester',0,2,0,9,4,16),\n(70219,'Lazarus',0,0,0,6,6,14),\n(70220,'Theodrus',0,2,6,5,7,4),\n(70221,'Braenna',1,0,1,1,0,0),\n(70222,'Toldren',0,4,1,3,3,10),\n(70223,'Benjamin',0,9,11,0,0,8),\n(70224,'Joshua',0,3,0,1,1,8),\n(70225,'Zayus',0,2,0,3,1,4),\n(70226,'X\\'yera',0,2,1,2,4,4),\n(70227,'Ur\\'kyo',0,0,2,2,3,2),\n(70228,'Nara',1,0,7,4,1,3),\n(70229,'Alathea',1,4,3,0,4,5),\n(70230,'Rohan',0,0,9,4,7,5),\n(70231,'Arena',1,0,2,2,1,0),\n(70232,'Ponaris',0,1,0,1,2,0),\n(70233,'Zalduun',0,9,0,0,0,0),\n(70234,'Aldrae',0,3,1,1,1,0),\n(70235,'Lotheolan',0,8,8,1,2,0),\n(70236,'Belestra',1,4,0,1,3,0),\n(70237,'Caedmos',0,4,0,0,4,3),\n(70238,'Guvan',0,12,0,5,6,4),\n(70239,'Izmir',0,7,0,4,6,6),\n(70240,'Fallat',0,7,1,4,6,6),\n(70251,'Haromm',0,0,3,5,0,6),\n(70252,'Siln',1,10,1,3,2,1),\n(70253,'Tigor',0,13,2,2,2,1),\n(70254,'Beram',0,10,0,2,0,5),\n(70255,'Meela',1,8,1,3,0,0),\n(70256,'Narm',0,17,0,6,1,4),\n(70257,'Shikrik',1,3,4,5,1,1),\n(70258,'Swart',0,0,4,5,0,7),\n(70259,'Kardris',1,0,4,7,0,6),\n(70260,'Sian\\'tsu',1,3,3,3,1,3),\n(70261,'Sagorne',0,6,1,1,1,2),\n-- (70262,'Firmanvaar',0,0,0,1,0,0),\n-- (70263,'Nobundo',0,0,0,0,0,0),\n-- (70264,'Tuluun',0,0,0,0,0,0),\n(70265,'Sulaa',1,7,2,2,4,6),\n(70266,'Hobahken',0,0,0,0,0,0),\n(70267,'Umbrua',1,1,7,5,5,1),\n(70268,'Javad',0,4,1,6,0,1),\n(70301,'Khelden',0,7,5,7,0,5),\n(70302,'Zaldimar',0,2,10,11,9,3),\n(70303,'Maginor',0,1,9,8,7,4),\n(70304,'Marryk',0,0,4,6,7,1),\n(70305,'Magis',0,1,5,4,6,4),\n(70306,'Isabella',1,2,0,7,1,5),\n(70307,'Cain',0,0,0,7,1,10),\n(70308,'Shymm',0,5,6,6,5,12),\n(70309,'Ursyn',1,0,5,9,1,7),\n(70310,'Thurston',0,4,1,5,5,1),\n(70311,'Pierce',0,0,2,5,8,2),\n(70312,'Anastasia',1,2,7,3,8,5),\n(70313,'Bink',1,2,1,1,6,0),\n(70314,'Juli',1,1,5,5,3,0),\n(70315,'Nittlebur',0,0,4,0,7,6),\n(70316,'Jennea',1,5,4,5,4,4),\n(70317,'Un\\'Thuwa',0,1,2,1,3,4),\n(70318,'Pephredo',1,0,4,1,2,5),\n(70319,'Enyo',1,3,4,4,0,0),\n(70320,'Mai\\'ah',1,1,2,1,1,5),\n(70321,'Deino',1,2,0,3,3,2),\n(70322,'Uthel\\'nay',0,3,4,2,3,0),\n(70323,'Dink',0,1,3,2,6,1),\n(70324,'Julia',1,2,6,2,0,0),\n(70325,'Garridel',1,3,1,2,2,0),\n(70326,'Valaatu',1,9,6,7,6,5),\n(70327,'Zaedana',1,3,2,2,1,0),\n(70328,'Quithas',0,2,3,1,1,0),\n(70329,'Inethven',0,0,0,0,3,0),\n(70330,'Narinth',1,0,2,2,0,0),\n(70331,'Edirah',1,5,0,5,3,0),\n(70332,'Valustraa',1,5,5,9,6,5),\n(70333,'Semid',0,8,9,8,0,7),\n(70334,'Harnan',0,8,8,7,1,3),\n(70335,'Bati',1,8,1,2,1,0),\n(70336,'Derek',0,5,3,3,1,5),\n(70351,'Drusilla',1,0,10,4,0,0),\n(70352,'Alamar',0,2,2,3,2,5),\n(70353,'Demisette',1,0,9,2,0,0),\n(70354,'Maximillian',0,1,10,6,0,6),\n(70355,'Kartosh',0,0,7,0,1,6),\n(70356,'Maximillion',0,5,0,9,5,5),\n(70357,'Rupert',0,0,0,0,0,8),\n(70358,'Nartok',0,0,6,4,0,1),\n(70359,'Dhugru',0,5,6,4,3,9),\n(70360,'Grol\\'dar',0,3,2,3,1,2),\n(70361,'Mirket',1,5,3,7,0,5),\n(70362,'Zevrost',0,3,7,5,5,9),\n(70363,'Kaal',0,3,1,4,2,3),\n(70364,'Luther',0,4,9,0,0,0),\n(70365,'Richard',0,5,5,0,0,0),\n(70366,'Thistleheart',0,3,2,6,3,0),\n(70367,'Briarthorn',0,0,6,1,0,3),\n(70368,'Alexander',0,0,10,11,0,6),\n(70369,'Ursula',1,1,4,18,3,6),\n(70370,'Sandahl',0,4,2,11,1,6),\n(70371,'Gimrizz',0,2,5,2,0,3),\n(70372,'Teli\\'Larien',0,0,0,0,0,0),\n(70373,'Celoenus',0,0,0,2,0,0),\n(70374,'Alamma',0,0,1,0,0,0),\n(70375,'Talionia',1,0,2,1,2,0),\n(70376,'Zanien',0,0,0,0,3,0),\n(70377,'Babagaya',1,0,6,0,3,0),\n(70401,'Turak',0,4,3,5,0,5),\n(70402,'Sheal',1,7,0,3,1,1),\n(70403,'Kym',1,9,2,3,0,0),\n(70404,'Gart',0,13,1,3,2,2),\n(70405,'Gennia',1,9,3,0,1,3),\n(70406,'Mardant',0,1,1,2,0,4),\n(70407,'Kal',0,2,2,4,4,2),\n(70408,'Mathrengyl',0,5,0,2,6,3),\n(70409,'Denatharion',0,4,8,3,2,5),\n(70410,'Fylerian',0,2,1,4,5,0),\n(70411,'Sheldras',0,0,3,2,2,4),\n(70412,'Theridran',0,2,1,3,7,3),\n(70413,'Maldryn',0,2,8,5,4,0),\n(70414,'Jannos',0,5,3,2,1,5),\n(70415,'Golhine',0,0,2,6,0,4),\n(70416,'Loganaar',0,2,1,1,0,1),\n(70417,'Harene',1,6,0,3,2,4),\n(70418,'Shalannius',0,4,3,0,4,5),\n(70451,'Siouxsie',1,9,9,3,4,9),\n(70452,'Imhadria',1,10,8,6,1,0),\n(70453,'Vaelen',0,16,9,11,9,8),\n(70454,'Mynx',1,10,0,17,11,0),\n(70455,'Lankral',0,6,13,16,12,4),\n(70456,'Sliver',0,10,11,11,6,0),\n(70457,'Vereth',0,4,0,8,9,10),\n(70458,'Arly',1,7,9,2,8,4),\n(70459,'Setaal',1,14,12,15,9,2),\n(70460,'Uzo',0,8,7,8,9,18),\n(70461,'Illyrie',1,9,11,1,12,0),\n(70462,'Crok',0,11,9,10,7,3),\n(70463,'Zor\\'be',0,8,7,6,9,18),\n(70464,'Datura',1,10,11,11,18,0),\n(70465,'Stefan',0,10,12,6,12,2),\n-- (70551,'Gorkramato',0,0,14,9,7,5);\n(70555,'Detrae',0,3,12,11,19,4);\n"
  },
  {
    "path": "AC/SQL/2_world_bot_extras.sql",
    "content": "DROP TABLE IF EXISTS `creature_template_npcbot_extras`;\n\nCREATE TABLE `creature_template_npcbot_extras` (\n  `entry` mediumint(8) unsigned NOT NULL,\n  `class` tinyint(3) unsigned NOT NULL DEFAULT '1',\n  `race` tinyint(3) unsigned NOT NULL DEFAULT '1',\n  PRIMARY KEY (`entry`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\nINSERT INTO `creature_template_npcbot_extras` (`entry`,`class`,`race`) VALUES\n('70001', '1', '1'),\n('70002', '1', '3'),\n('70003', '1', '1'),\n('70004', '1', '3'),\n('70005', '1', '2'),\n('70006', '1', '3'),\n('70007', '1', '3'),\n('70008', '1', '5'),\n('70009', '1', '5'),\n('70010', '1', '6'),\n('70011', '1', '6'),\n('70012', '1', '6'),\n('70013', '1', '6'),\n('70014', '1', '6'),\n('70015', '1', '2'),\n('70016', '1', '2'),\n('70017', '1', '2'),\n('70018', '1', '2'),\n('70019', '1', '8'),\n('70020', '1', '4'),\n('70021', '1', '4'),\n('70022', '1', '4'),\n('70023', '1', '4'),\n('70024', '1', '5'),\n('70025', '1', '5'),\n('70026', '1', '5'),\n('70027', '1', '3'),\n('70028', '1', '7'),\n('70029', '1', '1'),\n('70030', '1', '1'),\n('70031', '1', '4'),\n('70032', '1', '1'),\n('70033', '1', '11'),\n('70034', '1', '11'),\n('70035', '1', '11'),\n('70036', '1', '11'),\n('70037', '1', '11'),\n('70038', '1', '4'),\n('70051', '2', '1'),\n('70052', '2', '3'),\n('70053', '2', '1'),\n('70054', '2', '1'),\n('70055', '2', '3'),\n('70056', '2', '3'),\n('70057', '2', '3'),\n('70058', '2', '3'),\n('70059', '2', '1'),\n('70060', '2', '1'),\n('70061', '2', '1'),\n('70062', '2', '10'),\n('70063', '2', '10'),\n('70064', '2', '11'),\n('70065', '2', '10'),\n('70066', '2', '10'),\n('70067', '2', '10'),\n('70068', '2', '11'),\n('70069', '2', '11'),\n('70070', '2', '11'),\n('70071', '2', '11'),\n('70072', '2', '10'),\n('70073', '2', '10'),\n('70074', '2', '11'),\n('70101', '3', '3'),\n('70102', '3', '2'),\n('70103', '3', '3'),\n('70104', '3', '2'),\n('70105', '3', '6'),\n('70106', '3', '6'),\n('70107', '3', '6'),\n('70108', '3', '6'),\n('70109', '3', '6'),\n('70110', '3', '8'),\n('70111', '3', '2'),\n('70112', '3', '2'),\n('70113', '3', '8'),\n('70114', '3', '8'),\n('70115', '3', '4'),\n('70116', '3', '4'),\n('70117', '3', '4'),\n('70118', '3', '4'),\n('70119', '3', '4'),\n('70120', '3', '4'),\n('70121', '3', '3'),\n('70122', '3', '3'),\n('70123', '3', '3'),\n('70124', '3', '4'),\n('70125', '3', '3'),\n('70126', '3', '3'),\n('70127', '3', '3'),\n('70128', '3', '4'),\n('70129', '3', '3'),\n('70130', '3', '10'),\n('70131', '3', '10'),\n('70132', '3', '11'),\n('70133', '3', '10'),\n('70134', '3', '10'),\n('70135', '3', '11'),\n('70136', '3', '11'),\n('70137', '3', '11'),\n('70138', '3', '11'),\n('70139', '3', '11'),\n('70151', '4', '1'),\n('70152', '4', '3'),\n('70153', '4', '1'),\n('70154', '4', '1'),\n('70155', '4', '3'),\n('70156', '4', '1'),\n('70157', '4', '5'),\n('70158', '4', '5'),\n('70159', '4', '2'),\n('70160', '4', '2'),\n('70161', '4', '2'),\n('70162', '4', '2'),\n('70163', '4', '8'),\n('70164', '4', '4'),\n('70165', '4', '4'),\n('70166', '4', '4'),\n('70167', '4', '4'),\n('70168', '4', '4'),\n('70169', '4', '5'),\n('70170', '4', '5'),\n('70171', '4', '5'),\n('70172', '4', '3'),\n('70173', '4', '3'),\n('70174', '4', '7'),\n('70175', '4', '1'),\n('70176', '4', '1'),\n('70177', '4', '10'),\n('70178', '4', '10'),\n('70179', '4', '10'),\n('70180', '4', '10'),\n('70181', '4', '10'),\n('70201', '5', '1'),\n('70202', '5', '1'),\n('70203', '5', '1'),\n('70204', '5', '3'),\n('70205', '5', '3'),\n('70206', '5', '5'),\n('70207', '5', '5'),\n('70208', '5', '5'),\n('70209', '5', '5'),\n('70210', '5', '5'),\n('70211', '5', '4'),\n('70212', '5', '4'),\n('70213', '5', '8'),\n('70214', '5', '8'),\n('70215', '5', '4'),\n('70216', '5', '4'),\n('70217', '5', '4'),\n('70218', '5', '5'),\n('70219', '5', '5'),\n('70220', '5', '3'),\n('70221', '5', '3'),\n('70222', '5', '3'),\n('70223', '5', '1'),\n('70224', '5', '1'),\n('70225', '5', '8'),\n('70226', '5', '8'),\n('70227', '5', '8'),\n('70228', '5', '4'),\n('70229', '5', '4'),\n('70230', '5', '3'),\n('70231', '5', '10'),\n('70232', '5', '10'),\n('70233', '5', '11'),\n('70234', '5', '10'),\n('70235', '5', '10'),\n('70236', '5', '10'),\n('70237', '5', '11'),\n('70238', '5', '11'),\n('70239', '5', '11'),\n('70240', '5', '11'),\n('70251', '7', '2'),\n('70252', '7', '6'),\n('70253', '7', '6'),\n('70254', '7', '6'),\n('70255', '7', '6'),\n('70256', '7', '6'),\n('70257', '7', '2'),\n('70258', '7', '2'),\n('70259', '7', '2'),\n('70260', '7', '8'),\n('70261', '7', '6'),\n('70265', '7', '11'),\n('70267', '7', '11'),\n('70268', '7', '11'),\n('70301', '8', '1'),\n('70302', '8', '1'),\n('70303', '8', '1'),\n('70304', '8', '7'),\n('70305', '8', '7'),\n('70306', '8', '5'),\n('70307', '8', '5'),\n('70308', '8', '5'),\n('70309', '8', '5'),\n('70310', '8', '5'),\n('70311', '8', '5'),\n('70312', '8', '5'),\n('70313', '8', '7'),\n('70314', '8', '7'),\n('70315', '8', '7'),\n('70316', '8', '1'),\n('70317', '8', '8'),\n('70318', '8', '8'),\n('70319', '8', '8'),\n('70320', '8', '8'),\n('70321', '8', '8'),\n('70322', '8', '8'),\n('70323', '8', '7'),\n('70324', '8', '10'),\n('70325', '8', '10'),\n('70326', '8', '11'),\n('70327', '8', '10'),\n('70328', '8', '10'),\n('70329', '8', '10'),\n('70330', '8', '10'),\n('70331', '8', '11'),\n('70332', '8', '11'),\n('70333', '8', '11'),\n('70334', '8', '11'),\n('70335', '8', '11'),\n('70336', '8', '5'),\n('70351', '9', '1'),\n('70352', '9', '7'),\n('70353', '9', '1'),\n('70354', '9', '1'),\n('70355', '9', '2'),\n('70356', '9', '5'),\n('70357', '9', '5'),\n('70358', '9', '2'),\n('70359', '9', '2'),\n('70360', '9', '2'),\n('70361', '9', '2'),\n('70362', '9', '2'),\n('70363', '9', '2'),\n('70364', '9', '5'),\n('70365', '9', '5'),\n('70366', '9', '7'),\n('70367', '9', '7'),\n('70368', '9', '1'),\n('70369', '9', '1'),\n('70370', '9', '1'),\n('70371', '9', '7'),\n('70372', '9', '10'),\n('70373', '9', '10'),\n('70374', '9', '10'),\n('70375', '9', '10'),\n('70376', '9', '10'),\n('70377', '9', '7'),\n('70401', '11', '6'),\n('70402', '11', '6'),\n('70403', '11', '6'),\n('70404', '11', '6'),\n('70405', '11', '6'),\n('70406', '11', '4'),\n('70407', '11', '4'),\n('70408', '11', '4'),\n('70409', '11', '4'),\n('70410', '11', '4'),\n('70411', '11', '4'),\n('70412', '11', '4'),\n('70413', '11', '6'),\n('70414', '11', '6'),\n('70415', '11', '4'),\n('70416', '11', '4'),\n('70417', '11', '6'),\n('70418', '11', '4'),\n('70451', '6', '4'),\n('70452', '6', '10'),\n('70453', '6', '11'),\n('70454', '6', '10'),\n('70455', '6', '1'),\n('70456', '6', '10'),\n('70457', '6', '5'),\n('70458', '6', '7'),\n('70459', '6', '11'),\n('70460', '6', '8'),\n('70461', '6', '4'),\n('70462', '6', '2'),\n('70463', '6', '8'),\n('70464', '6', '10'),\n('70465', '6', '1'),\n('70501', '0', '0'),\n('70502', '0', '0'),\n('70503', '0', '0'),\n('70504', '0', '0'),\n('70505', '0', '0'),\n('70506', '0', '0'),\n('70507', '0', '0'),\n('70508', '0', '0'),\n('70509', '0', '0'),\n('70510', '0', '0'),\n('70511', '0', '0'),\n('70512', '0', '0'),\n('70513', '0', '0'),\n('70514', '0', '0'),\n('70515', '0', '0'),\n('70516', '0', '0'),\n('70517', '0', '0'),\n('70518', '0', '0'),\n('70519', '0', '0'),\n('70520', '0', '0'),\n('70521', '0', '0'),\n('70522', '0', '0'),\n('70523', '0', '0'),\n('70524', '0', '0'),\n('70525', '0', '0'),\n('70526', '0', '0'),\n('70527', '0', '0'),\n('70528', '0', '0'),\n('70529', '0', '0'),\n('70530', '0', '0'),\n('70531', '0', '0'),\n('70532', '0', '0'),\n('70533', '0', '0'),\n('70534', '0', '0'),\n('70535', '0', '0'),\n('70536', '0', '0'),\n('70537', '0', '0'),\n('70538', '0', '0'),\n('70542', '0', '0'),\n('70543', '0', '0'),\n('70544', '0', '0'),\n('70545', '0', '0'),\n('70551', '12', '15'),\n('70552', '12', '15'),\n('70553', '13', '15'),\n('70554', '13', '15'),\n('70555', '14', '1'),\n('70556', '0', '0'),\n('70557', '15', '15'),\n('70558', '15', '15'),\n('70559', '15', '15'),\n('70560', '15', '15'),\n('70561', '15', '15'),\n('70562', '0', '0'),\n('70563', '16', '15'),\n('70564', '16', '15'),\n('70565', '16', '15'),\n('70566', '16', '15'),\n('70567', '16', '15'),\n('70568', '17', '10'),\n('70569', '17', '10'),\n('70570', '17', '10'),\n('70571', '17', '10'),\n('70572', '17', '10'),\n('70573', '0', '15'),\n('70574', '0', '15');\n"
  },
  {
    "path": "AC/SQL/3_world_bots.sql",
    "content": "-- GENERAL --\n\nSET @BOT_START = 70001;\nSET @BOT_END   = 71000;\n\n-- move to creature_template_movement InhabitType\n-- Resistance\n-- basevariance, rangevariance -- spell_school_immune_mask -- damage modifier, expirience modifier\n\n-- TOTAL BOT ENTRIES: 352 (348)\n\ndelete from `creature_template` where entry between @BOT_START and @BOT_END AND entry != 70100;\n\ninsert into `creature_template`\n(`entry`,`difficulty_entry_1`,`difficulty_entry_2`,`difficulty_entry_3`,`KillCredit1`,`KillCredit2`,\n`name`,`subname`,`IconName`,`gossip_menu_id`,`minlevel`,`maxlevel`,`exp`,\n`faction`,`npcflag`,`speed_walk`,`speed_run`,`scale`,`rank`,`dmgschool`,`BaseAttackTime`,`RangeAttackTime`,\n`unit_class`,`unit_flags`,`unit_flags2`,`dynamicflags`,`family`,`type`,`type_flags`,`lootid`,\n`pickpocketloot`,`skinloot`,`PetSpellDataId`,`VehicleId`,`mingold`,`maxgold`,`AIName`,`MovementType`,\n`HoverHeight`,`HealthModifier`,`ManaModifier`,`ArmorModifier`,`RacialLeader`,`movementId`,`RegenHealth`,\n`mechanic_immune_mask`,`flags_extra`,`ScriptName`,`VerifiedBuild`)\nvalues\n('70001','0','0','0','0','0','Llane','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70002','0','0','0','0','0','Thran','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70003','0','0','0','0','0','Lyria','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70004','0','0','0','0','0','Ander','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70005','0','0','0','0','0','Malosh','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70006','0','0','0','0','0','Granis','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70007','0','0','0','0','0','Kelstrum','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70008','0','0','0','0','0','Dannal','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70009','0','0','0','0','0','Austil','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70010','0','0','0','0','0','Torm','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70011','0','0','0','0','0','Sark','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70012','0','0','0','0','0','Ker','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70013','0','0','0','0','0','Harutt','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70014','0','0','0','0','0','Krang','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70015','0','0','0','0','0','Frang','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70016','0','0','0','0','0','Tarshaw','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70017','0','0','0','0','0','Grezz','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70018','0','0','0','0','0','Sorek','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70019','0','0','0','0','0','Zel\\'mak','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70020','0','0','0','0','0','Alyissia','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70021','0','0','0','0','0','Kyra','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70022','0','0','0','0','0','Arias\\'ta','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70023','0','0','0','0','0','Sildanair','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70024','0','0','0','0','0','Chris','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70025','0','0','0','0','0','Angela','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70026','0','0','0','0','0','Baltus','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70027','0','0','0','0','0','Kelv','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70028','0','0','0','0','0','Bilban','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70029','0','0','0','0','0','Wu','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70030','0','0','0','0','0','Ilsa','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70031','0','0','0','0','0','Darnath','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70032','0','0','0','0','0','Evencane','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70033','0','0','0','0','0','Kore','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70034','0','0','0','0','0','Ahonan','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70035','0','0','0','0','0','Behomat','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70036','0','0','0','0','0','Ruada','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70037','0','0','0','0','0','Kazi','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70038','0','0','0','0','0','Kerra','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n-- 70039 - 70050 reserved for warriors\n('70051','0','0','0','0','0','Sammuel','Paladin Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2300','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','paladin_bot','-1'),\n('70052','0','0','0','0','0','Bromos','Paladin Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2300','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','paladin_bot','-1'),\n('70053','0','0','0','0','0','Wilhelm','Paladin Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2300','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','paladin_bot','-1'),\n('70054','0','0','0','0','0','Grayson','Paladin Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2300','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','paladin_bot','-1'),\n('70055','0','0','0','0','0','Azar','Paladin Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2300','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','paladin_bot','-1'),\n('70056','0','0','0','0','0','Valgar','Paladin Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2300','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','paladin_bot','-1'),\n('70057','0','0','0','0','0','Beldruk','Paladin Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2300','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','paladin_bot','-1'),\n('70058','0','0','0','0','0','Brandur','Paladin Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2300','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','paladin_bot','-1'),\n('70059','0','0','0','0','0','Arthur','Paladin Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2300','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','paladin_bot','-1'),\n('70060','0','0','0','0','0','Katherine','Paladin Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2300','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','paladin_bot','-1'),\n('70061','0','0','0','0','0','Karman','Paladin Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2300','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','paladin_bot','-1'),\n('70062','0','0','0','0','0','Jesthenis','Paladin Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2300','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','paladin_bot','-1'),\n('70063','0','0','0','0','0','Noellene','Paladin Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2300','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','paladin_bot','-1'),\n('70064','0','0','0','0','0','Aurelon','Paladin Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2300','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','paladin_bot','-1'),\n('70065','0','0','0','0','0','Osselan','Paladin Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2300','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','paladin_bot','-1'),\n('70066','0','0','0','0','0','Ithelis','Paladin Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2300','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','paladin_bot','-1'),\n('70067','0','0','0','0','0','Bachi','Paladin Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2300','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','paladin_bot','-1'),\n('70068','0','0','0','0','0','Baatun','Paladin Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2300','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','paladin_bot','-1'),\n('70069','0','0','0','0','0','Kavaan','Paladin Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2300','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','paladin_bot','-1'),\n('70070','0','0','0','0','0','Tullas','Paladin Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2300','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','paladin_bot','-1'),\n('70071','0','0','0','0','0','Jol','Paladin Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2300','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','paladin_bot','-1'),\n('70072','0','0','0','0','0','Cyssa','Paladin Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2300','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','paladin_bot','-1'),\n('70073','0','0','0','0','0','Pyreanor','Paladin Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2300','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','paladin_bot','-1'),\n('70074','0','0','0','0','0','Rukua','Paladin Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2300','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','paladin_bot','-1'),\n-- 70075 - 70100 reserved for paldins\n('70101','0','0','0','0','0','Thorgas','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70102','0','0','0','0','0','Ogromm','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70103','0','0','0','0','0','Grif','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70104','0','0','0','0','0','Kragg','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70105','0','0','0','0','0','Kary','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70106','0','0','0','0','0','Holt','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70107','0','0','0','0','0','Urek','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70108','0','0','0','0','0','Lanka','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70109','0','0','0','0','0','Yaw','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70110','0','0','0','0','0','Jen\\'shan','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70111','0','0','0','0','0','Thotar','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70112','0','0','0','0','0','Ormak','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70113','0','0','0','0','0','Xor\\'juul','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70114','0','0','0','0','0','Sian\\'dur','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70115','0','0','0','0','0','Ayanna','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70116','0','0','0','0','0','Dazalar','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70117','0','0','0','0','0','Danlaar','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70118','0','0','0','0','0','Jeen\\'ra','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70119','0','0','0','0','0','Jocaste','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70120','0','0','0','0','0','Dorion','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70121','0','0','0','0','0','Daera','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70122','0','0','0','0','0','Olmin','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70123','0','0','0','0','0','Regnus','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70124','0','0','0','0','0','Kaerbrus','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70125','0','0','0','0','0','Einris','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70126','0','0','0','0','0','Ulfir','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70127','0','0','0','0','0','Thorfin','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70128','0','0','0','0','0','Alenndaar','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70129','0','0','0','0','0','Dargh','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70130','0','0','0','0','0','Sallina','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70131','0','0','0','0','0','Hannovia','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70132','0','0','0','0','0','Keilnei','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70133','0','0','0','0','0','Tana','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70134','0','0','0','0','0','Oninath','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70135','0','0','0','0','0','Zandine','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70136','0','0','0','0','0','Deremiis','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70137','0','0','0','0','0','Acteon','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70138','0','0','0','0','0','Vord','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70139','0','0','0','0','0','Killac','Hunter bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n-- 70140 - 70150 reserved for hunters\n('70151','0','0','0','0','0','Jorik','Rogue Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','1600','2000','4','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','rogue_bot','-1'),\n('70152','0','0','0','0','0','Solm','Rogue Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','1600','2000','4','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','rogue_bot','-1'),\n('70153','0','0','0','0','0','Keryn','Rogue Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','1600','2000','4','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','rogue_bot','-1'),\n('70154','0','0','0','0','0','Osborne','Rogue Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','1600','2000','4','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','rogue_bot','-1'),\n('70155','0','0','0','0','0','Hogral','Rogue Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','1600','2000','4','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','rogue_bot','-1'),\n('70156','0','0','0','0','0','Ian','Rogue Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','1600','2000','4','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','rogue_bot','-1'),\n('70157','0','0','0','0','0','David','Rogue Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','1600','2000','4','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','rogue_bot','-1'),\n('70158','0','0','0','0','0','Marion','Rogue Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','1600','2000','4','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','rogue_bot','-1'),\n('70159','0','0','0','0','0','Rwag','Rogue Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','1600','2000','4','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','rogue_bot','-1'),\n('70160','0','0','0','0','0','Kaplak','Rogue Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','1600','2000','4','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','rogue_bot','-1'),\n('70161','0','0','0','0','0','Gest','Rogue Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','1600','2000','4','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','rogue_bot','-1'),\n('70162','0','0','0','0','0','Ormok','Rogue Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','1600','2000','4','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','rogue_bot','-1'),\n('70163','0','0','0','0','0','Shenthul','Rogue Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','1600','2000','4','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','rogue_bot','-1'),\n('70164','0','0','0','0','0','Frahun','Rogue Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','1600','2000','4','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','rogue_bot','-1'),\n('70165','0','0','0','0','0','Jannok','Rogue Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','1600','2000','4','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','rogue_bot','-1'),\n('70166','0','0','0','0','0','Syurna','Rogue Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','1600','2000','4','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','rogue_bot','-1'),\n('70167','0','0','0','0','0','Erion','Rogue Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','1600','2000','4','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','rogue_bot','-1'),\n('70168','0','0','0','0','0','Anishar','Rogue Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','1600','2000','4','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','rogue_bot','-1'),\n('70169','0','0','0','0','0','Carolyn','Rogue Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','1600','2000','4','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','rogue_bot','-1'),\n('70170','0','0','0','0','0','Miles','Rogue Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','1600','2000','4','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','rogue_bot','-1'),\n('70171','0','0','0','0','0','Gregory','Rogue Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','1600','2000','4','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','rogue_bot','-1'),\n('70172','0','0','0','0','0','Hulfdan','Rogue Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','1600','2000','4','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','rogue_bot','-1'),\n('70173','0','0','0','0','0','Ormyr','Rogue Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','1600','2000','4','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','rogue_bot','-1'),\n('70174','0','0','0','0','0','Fenthwick','Rogue Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','1600','2000','4','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','rogue_bot','-1'),\n('70175','0','0','0','0','0','Fahrad','Rogue Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','1600','2000','4','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','rogue_bot','-1'),\n('70176','0','0','0','0','0','Tony','Rogue Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','1600','2000','4','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','rogue_bot','-1'),\n('70177','0','0','0','0','0','Kariel','Rogue Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','1600','2000','4','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','rogue_bot','-1'),\n('70178','0','0','0','0','0','Tannaria','Rogue Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','1600','2000','4','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','rogue_bot','-1'),\n('70179','0','0','0','0','0','Zelanis','Rogue Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','1600','2000','4','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','rogue_bot','-1'),\n('70180','0','0','0','0','0','Elara','Rogue Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','1600','2000','4','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','rogue_bot','-1'),\n('70181','0','0','0','0','0','Nerisen','Rogue Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','1600','2000','4','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','rogue_bot','-1'),\n-- 70182 - 70200 reserved for rogues\n('70201','0','0','0','0','0','Anetta','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70202','0','0','0','0','0','Laurena','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70203','0','0','0','0','0','Josetta','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70204','0','0','0','0','0','Branstock','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70205','0','0','0','0','0','Maxan','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70206','0','0','0','0','0','Duesten','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70207','0','0','0','0','0','Beryl','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70208','0','0','0','0','0','Miles','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70209','0','0','0','0','0','Malakai','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70210','0','0','0','0','0','Cobb','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70211','0','0','0','0','0','Shanda','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70212','0','0','0','0','0','Laurna','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70213','0','0','0','0','0','Tai\\'jin','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70214','0','0','0','0','0','Ken\\'jai','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70215','0','0','0','0','0','Astarii','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70216','0','0','0','0','0','Jandria','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70217','0','0','0','0','0','Lariia','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70218','0','0','0','0','0','Lankester','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70219','0','0','0','0','0','Lazarus','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70220','0','0','0','0','0','Theodrus','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70221','0','0','0','0','0','Braenna','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70222','0','0','0','0','0','Toldren','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70223','0','0','0','0','0','Benjamin','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70224','0','0','0','0','0','Joshua','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70225','0','0','0','0','0','Zayus','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70226','0','0','0','0','0','X\\'yera','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70227','0','0','0','0','0','Ur\\'kyo','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70228','0','0','0','0','0','Nara','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70229','0','0','0','0','0','Alathea','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70230','0','0','0','0','0','Rohan','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70231','0','0','0','0','0','Arena','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70232','0','0','0','0','0','Ponaris','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70233','0','0','0','0','0','Zalduun','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70234','0','0','0','0','0','Aldrae','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70235','0','0','0','0','0','Lotheolan','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70236','0','0','0','0','0','Belestra','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70237','0','0','0','0','0','Caedmos','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70238','0','0','0','0','0','Guvan','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70239','0','0','0','0','0','Izmir','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70240','0','0','0','0','0','Fallat','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n-- 70241 - 70250 reserved for priests\n('70251','0','0','0','0','0','Haromm','Shaman Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2600','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','shaman_bot','-1'),\n('70252','0','0','0','0','0','Siln','Shaman Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2600','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','shaman_bot','-1'),\n('70253','0','0','0','0','0','Tigor','Shaman Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2600','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','shaman_bot','-1'),\n('70254','0','0','0','0','0','Beram','Shaman Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2600','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','shaman_bot','-1'),\n('70255','0','0','0','0','0','Meela','Shaman Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2600','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','shaman_bot','-1'),\n('70256','0','0','0','0','0','Narm','Shaman Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2600','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','shaman_bot','-1'),\n('70257','0','0','0','0','0','Shikrik','Shaman Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2600','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','shaman_bot','-1'),\n('70258','0','0','0','0','0','Swart','Shaman Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2600','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','shaman_bot','-1'),\n('70259','0','0','0','0','0','Kardris','Shaman Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2600','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','shaman_bot','-1'),\n('70260','0','0','0','0','0','Sian\\'tsu','Shaman Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2600','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','shaman_bot','-1'),\n('70261','0','0','0','0','0','Sagorne','Shaman Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2600','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','shaman_bot','-1'),\n-- ('70262','0','0','0','0','0','Firmanvaar','Shaman Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2600','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','shaman_bot','-1'),\n-- ('70263','0','0','0','0','0','Nobundo','Shaman Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2600','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','shaman_bot','-1'),\n-- ('70264','0','0','0','0','0','Tuluun','Shaman Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2600','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','shaman_bot','-1'),\n('70265','0','0','0','0','0','Sulaa','Shaman Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2600','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','shaman_bot','-1'),\n-- ('70266','0','0','0','0','0','Hobahken','Shaman Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2600','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','shaman_bot','-1'),\n('70267','0','0','0','0','0','Umbrua','Shaman Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2600','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','shaman_bot','-1'),\n('70268','0','0','0','0','0','Javad','Shaman Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2600','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','shaman_bot','-1'),\n-- 70269 - 70300 reserved for shamans\n('70301','0','0','0','0','0','Khelden','Mage Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3800','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','mage_bot','-1'),\n('70302','0','0','0','0','0','Zaldimar','Mage Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3800','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','mage_bot','-1'),\n('70303','0','0','0','0','0','Maginor','Mage Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3800','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','mage_bot','-1'),\n('70304','0','0','0','0','0','Marryk','Mage Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3800','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','mage_bot','-1'),\n('70305','0','0','0','0','0','Magis','Mage Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3800','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','mage_bot','-1'),\n('70306','0','0','0','0','0','Isabella','Mage Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3800','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','mage_bot','-1'),\n('70307','0','0','0','0','0','Cain','Mage Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3800','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','mage_bot','-1'),\n('70308','0','0','0','0','0','Shymm','Mage Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3800','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','mage_bot','-1'),\n('70309','0','0','0','0','0','Ursyn','Mage Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3800','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','mage_bot','-1'),\n('70310','0','0','0','0','0','Thurston','Mage Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3800','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','mage_bot','-1'),\n('70311','0','0','0','0','0','Pierce','Mage Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3800','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','mage_bot','-1'),\n('70312','0','0','0','0','0','Anastasia','Mage Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3800','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','mage_bot','-1'),\n('70313','0','0','0','0','0','Bink','Mage Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3800','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','mage_bot','-1'),\n('70314','0','0','0','0','0','Juli','Mage Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3800','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','mage_bot','-1'),\n('70315','0','0','0','0','0','Nittlebur','Mage Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3800','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','mage_bot','-1'),\n('70316','0','0','0','0','0','Jennea','Mage Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3800','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','mage_bot','-1'),\n('70317','0','0','0','0','0','Un\\'Thuwa','Mage Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3800','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','mage_bot','-1'),\n('70318','0','0','0','0','0','Pephredo','Mage Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3800','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','mage_bot','-1'),\n('70319','0','0','0','0','0','Enyo','Mage Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3800','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','mage_bot','-1'),\n('70320','0','0','0','0','0','Mai\\'ah','Mage Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3800','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','mage_bot','-1'),\n('70321','0','0','0','0','0','Deino','Mage Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3800','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','mage_bot','-1'),\n('70322','0','0','0','0','0','Uthel\\'nay','Mage Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3800','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','mage_bot','-1'),\n('70323','0','0','0','0','0','Dink','Mage Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3800','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','mage_bot','-1'),\n('70324','0','0','0','0','0','Julia','Mage Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3800','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','mage_bot','-1'),\n('70325','0','0','0','0','0','Garridel','Mage Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3800','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','mage_bot','-1'),\n('70326','0','0','0','0','0','Valaatu','Mage Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3800','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','mage_bot','-1'),\n('70327','0','0','0','0','0','Zaedana','Mage Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3800','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','mage_bot','-1'),\n('70328','0','0','0','0','0','Quithas','Mage Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3800','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','mage_bot','-1'),\n('70329','0','0','0','0','0','Inethven','Mage Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3800','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','mage_bot','-1'),\n('70330','0','0','0','0','0','Narinth','Mage Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3800','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','mage_bot','-1'),\n('70331','0','0','0','0','0','Edirah','Mage Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3800','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','mage_bot','-1'),\n('70332','0','0','0','0','0','Valustraa','Mage Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3800','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','mage_bot','-1'),\n('70333','0','0','0','0','0','Semid','Mage Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3800','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','mage_bot','-1'),\n('70334','0','0','0','0','0','Harnan','Mage Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3800','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','mage_bot','-1'),\n('70335','0','0','0','0','0','Bati','Mage Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3800','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','mage_bot','-1'),\n('70336','0','0','0','0','0','Derek','Mage Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3800','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','mage_bot','-1'),\n-- 70337 - 70350 reserved for mages\n('70351','0','0','0','0','0','Drusilla','Warlock Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3500','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warlock_bot','-1'),\n('70352','0','0','0','0','0','Alamar','Warlock Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3500','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warlock_bot','-1'),\n('70353','0','0','0','0','0','Demisette','Warlock Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3500','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warlock_bot','-1'),\n('70354','0','0','0','0','0','Maximillian','Warlock Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3500','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warlock_bot','-1'),\n('70355','0','0','0','0','0','Kartosh','Warlock Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3500','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warlock_bot','-1'),\n('70356','0','0','0','0','0','Maximillion','Warlock Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3500','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warlock_bot','-1'),\n('70357','0','0','0','0','0','Rupert','Warlock Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3500','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warlock_bot','-1'),\n('70358','0','0','0','0','0','Nartok','Warlock Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3500','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warlock_bot','-1'),\n('70359','0','0','0','0','0','Dhugru','Warlock Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3500','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warlock_bot','-1'),\n('70360','0','0','0','0','0','Grol\\'dar','Warlock Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3500','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warlock_bot','-1'),\n('70361','0','0','0','0','0','Mirket','Warlock Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3500','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warlock_bot','-1'),\n('70362','0','0','0','0','0','Zevrost','Warlock Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3500','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warlock_bot','-1'),\n('70363','0','0','0','0','0','Kaal','Warlock Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3500','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warlock_bot','-1'),\n('70364','0','0','0','0','0','Luther','Warlock Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3500','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warlock_bot','-1'),\n('70365','0','0','0','0','0','Richard','Warlock Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3500','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warlock_bot','-1'),\n('70366','0','0','0','0','0','Thistleheart','Warlock Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3500','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warlock_bot','-1'),\n('70367','0','0','0','0','0','Briarthorn','Warlock Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3500','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warlock_bot','-1'),\n('70368','0','0','0','0','0','Alexander','Warlock Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3500','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warlock_bot','-1'),\n('70369','0','0','0','0','0','Ursula','Warlock Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3500','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warlock_bot','-1'),\n('70370','0','0','0','0','0','Sandahl','Warlock Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3500','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warlock_bot','-1'),\n('70371','0','0','0','0','0','Gimrizz','Warlock Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3500','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warlock_bot','-1'),\n('70372','0','0','0','0','0','Teli\\'Larien','Warlock Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3500','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warlock_bot','-1'),\n('70373','0','0','0','0','0','Celoenus','Warlock Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3500','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warlock_bot','-1'),\n('70374','0','0','0','0','0','Alamma','Warlock Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3500','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warlock_bot','-1'),\n('70375','0','0','0','0','0','Talionia','Warlock Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3500','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warlock_bot','-1'),\n('70376','0','0','0','0','0','Zanien','Warlock Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3500','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warlock_bot','-1'),\n('70377','0','0','0','0','0','Babagaya','Warlock Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3500','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warlock_bot','-1'),\n-- 70378 - 70400 reserved for warlocks\n('70401','0','0','0','0','0','Turak','Druid Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2200','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','druid_bot','-1'),\n('70402','0','0','0','0','0','Sheal','Druid Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2200','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','druid_bot','-1'),\n('70403','0','0','0','0','0','Kym','Druid Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2200','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','druid_bot','-1'),\n('70404','0','0','0','0','0','Gart','Druid Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2200','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','druid_bot','-1'),\n('70405','0','0','0','0','0','Gennia','Druid Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2200','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','druid_bot','-1'),\n('70406','0','0','0','0','0','Mardant','Druid Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2200','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','druid_bot','-1'),\n('70407','0','0','0','0','0','Kal','Druid Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2200','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','druid_bot','-1'),\n('70408','0','0','0','0','0','Mathrengyl','Druid Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2200','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','druid_bot','-1'),\n('70409','0','0','0','0','0','Denatharion','Druid Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2200','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','druid_bot','-1'),\n('70410','0','0','0','0','0','Fylerian','Druid Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2200','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','druid_bot','-1'),\n('70411','0','0','0','0','0','Sheldras','Druid Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2200','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','druid_bot','-1'),\n('70412','0','0','0','0','0','Theridran','Druid Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2200','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','druid_bot','-1'),\n('70413','0','0','0','0','0','Maldryn','Druid Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2200','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','druid_bot','-1'),\n('70414','0','0','0','0','0','Jannos','Druid Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2200','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','druid_bot','-1'),\n('70415','0','0','0','0','0','Golhine','Druid Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2200','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','druid_bot','-1'),\n('70416','0','0','0','0','0','Loganaar','Druid Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2200','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','druid_bot','-1'),\n('70417','0','0','0','0','0','Harene','Druid Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2200','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','druid_bot','-1'),\n('70418','0','0','0','0','0','Shalannius','Druid Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2200','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','druid_bot','-1'),\n-- 70419 - 70450 reserved for druids\n('70451','0','0','0','0','0','Siouxsie','Death Knight Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3300','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','death_knight_bot','-1'),\n('70452','0','0','0','0','0','Imhadria','Death Knight Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3300','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','death_knight_bot','-1'),\n('70453','0','0','0','0','0','Vaelen','Death Knight Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3300','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','death_knight_bot','-1'),\n('70454','0','0','0','0','0','Mynx','Death Knight Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3300','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','death_knight_bot','-1'),\n('70455','0','0','0','0','0','Lankral','Death Knight Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3300','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','death_knight_bot','-1'),\n('70456','0','0','0','0','0','Sliver','Death Knight Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3300','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','death_knight_bot','-1'),\n('70457','0','0','0','0','0','Vereth','Death Knight Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3300','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','death_knight_bot','-1'),\n('70458','0','0','0','0','0','Arly','Death Knight Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3300','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','death_knight_bot','-1'),\n('70459','0','0','0','0','0','Setaal','Death Knight Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3300','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','death_knight_bot','-1'),\n('70460','0','0','0','0','0','Uzo','Death Knight Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3300','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','death_knight_bot','-1'),\n('70461','0','0','0','0','0','Illyrie','Death Knight Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3300','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','death_knight_bot','-1'),\n('70462','0','0','0','0','0','Crok','Death Knight Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3300','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','death_knight_bot','-1'),\n('70463','0','0','0','0','0','Zor\\'be','Death Knight Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3300','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','death_knight_bot','-1'),\n('70464','0','0','0','0','0','Datura','Death Knight Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3300','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','death_knight_bot','-1'),\n('70465','0','0','0','0','0','Stefan','Death Knight Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3300','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','death_knight_bot','-1'),\n-- 70466 - 70500 reserved for deathknights\n('70501','0','0','0','0','0','Imp',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','8','0','0','0','0','3','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','1','135266416','warlock_pet_bot','-1'),\n('70502','0','0','0','0','0','Voidwalker',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','8','0','0','0','0','3','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','1','135266416','warlock_pet_bot','-1'),\n('70503','0','0','0','0','0','Succubus',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','8','0','0','0','0','3','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','1','135266416','warlock_pet_bot','-1'),\n('70504','0','0','0','0','0','Felhunter',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','8','0','0','0','0','3','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','1','135266416','warlock_pet_bot','-1'),\n('70505','0','0','0','0','0','Felguard',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','8','0','0','0','0','3','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','1','135266416','warlock_pet_bot','-1'),\n('70506','0','0','0','0','0','Spider',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','1','0','0','0','0','1','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','hunter_pet_bot','-1'),\n('70507','0','0','0','0','0','Serpent',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','1','0','0','0','0','1','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','hunter_pet_bot','-1'),\n('70508','0','0','0','0','0','Bird of Prey',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','1','0','0','0','0','1','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','hunter_pet_bot','-1'),\n('70509','0','0','0','0','0','Bat',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','1','0','0','0','0','1','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','hunter_pet_bot','-1'),\n('70510','0','0','0','0','0','Wind Serpent',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','1','0','0','0','0','1','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','hunter_pet_bot','-1'),\n('70511','0','0','0','0','0','Ravager',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','1','0','0','0','0','1','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','hunter_pet_bot','-1'),\n('70512','0','0','0','0','0','Dragonhawk',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','1','0','0','0','0','1','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','hunter_pet_bot','-1'),\n('70513','0','0','0','0','0','Nether Ray',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','1','0','0','0','0','1','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','hunter_pet_bot','-1'),\n('70514','0','0','0','0','0','Sporebat',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','1','0','0','0','0','1','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','hunter_pet_bot','-1'),\n('70515','0','0','0','0','0','Carrion Bird',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','1','0','0','0','0','1','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','hunter_pet_bot','-1'),\n('70516','0','0','0','0','0','Raptor',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','1','0','0','0','0','1','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','hunter_pet_bot','-1'),\n('70517','0','0','0','0','0','Wolf',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','1','0','0','0','0','1','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','hunter_pet_bot','-1'),\n('70518','0','0','0','0','0','Tallstrider',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','1','0','0','0','0','1','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','hunter_pet_bot','-1'),\n('70519','0','0','0','0','0','Cat',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','1','0','0','0','0','1','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','hunter_pet_bot','-1'),\n('70520','0','0','0','0','0','Hyena',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','1','0','0','0','0','1','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','hunter_pet_bot','-1'),\n('70521','0','0','0','0','0','Wasp',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','1','0','0','0','0','1','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','hunter_pet_bot','-1'),\n('70522','0','0','0','0','0','Teromoth',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','1','0','0','0','0','1','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','hunter_pet_bot','-1'),\n('70523','0','0','0','0','0','Scorpid',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','1','0','0','0','0','1','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','hunter_pet_bot','-1'),\n('70524','0','0','0','0','0','Turtle',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','1','0','0','0','0','1','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','hunter_pet_bot','-1'),\n('70525','0','0','0','0','0','Gorilla',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','1','0','0','0','0','1','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','hunter_pet_bot','-1'),\n('70526','0','0','0','0','0','Bear',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','1','0','0','0','0','1','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','hunter_pet_bot','-1'),\n('70527','0','0','0','0','0','Boar',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','1','0','0','0','0','1','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','hunter_pet_bot','-1'),\n('70528','0','0','0','0','0','Crab',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','1','0','0','0','0','1','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','hunter_pet_bot','-1'),\n('70529','0','0','0','0','0','Crocolisk',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','1','0','0','0','0','1','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','hunter_pet_bot','-1'),\n('70530','0','0','0','0','0','Warp Stalker',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','1','0','0','0','0','1','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','hunter_pet_bot','-1'),\n('70531','0','0','0','0','0','Silithid',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','1','0','0','0','0','1','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','hunter_pet_bot','-1'),\n('70532','0','0','0','0','0','Chimaera',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','1','0','0','0','0','1','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','hunter_pet_bot','-1'),\n('70533','0','0','0','0','0','Spirit Beast',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','1','0','0','0','0','1','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','hunter_pet_bot','-1'),\n('70534','0','0','0','0','0','Core Hound',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','1','0','0','0','0','1','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','hunter_pet_bot','-1'),\n('70535','0','0','0','0','0','Devilsaur',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','1','0','0','0','0','1','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','hunter_pet_bot','-1'),\n('70536','0','0','0','0','0','Rhino',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','1','0','0','0','0','1','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','hunter_pet_bot','-1'),\n('70537','0','0','0','0','0','Worm',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','1','0','0','0','0','1','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','hunter_pet_bot','-1'),\n('70538','0','0','0','0','0','Risen Ghoul',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','8','0','0','0','0','6','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','deathknight_pet_bot','-1'),\n-- 70539 - 70541 reserved for dk pets\n('70542','0','0','0','0','0','Shadowfiend',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','5','1500','1500','2','0','0','0','0','10','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','priest_pet_bot','-1'),\n('70543','0','0','0','0','0','Spirit Wolf',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','1500','1500','1','0','0','0','0','1','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','shaman_pet_bot','-1'),\n('70544','0','0','0','0','0','Water Elemental',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','8','0','0','0','0','4','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','mage_pet_bot','-1'),\n('70545','0','0','0','0','0','Treant',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','1','0','0','0','0','4','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','druid_pet_bot','-1'),\n-- 70546 - 70550 reserved for pets\n('70551','0','0','0','0','0','Gorkramato','Blademaster Bot','','0','81','81','2','35','1','1.1','1.1','1','4','0','2200','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157560','blademaster_bot','-1'),\n('70552','0','0','0','0','0','Mirror Image (Blademaster)','Blademaster bot','','0','81','81','2','35','1','1.1','1.1','1','4','0','2200','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157560','blademaster_bot','-1'),\n('70553','0','0','0','0','0','Osis','Obsidian Destroyer Bot','','0','83','83','2','35','1','1.1','1.1','0.7','2','0','1200','1200','8','0','0','0','0','10','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','0','sphynx_bot','-1'),\n('70554','0','0','0','0','0','Amot','Obsidian Destroyer Bot','','0','83','83','2','35','1','1.1','1.1','0.7','2','0','1200','1200','8','0','0','0','0','10','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','0','sphynx_bot','-1'),\n('70555','0','0','0','0','0','Detrae','Archmage Bot','','0','81','81','2','35','1','1.1','1.1','1','4','0','1420','1420','8','0','16432','0','0','7','2048','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','archmage_bot','-1'),\n('70556','0','0','0','0','0','Water Elemental',NULL,'','0','81','81','2','35','0','1.2','1.3','1','0','0','1500','1500','1','0','0','0','0','4','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','archmage_pet_bot','-1'),\n('70557','0','0','0','0','0','Neroth','Dreadlord Bot','','0','83','83','2','35','1','1.1','1.1','1.5','2','0','1300','1300','2','0','0','0','0','3','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','0','dreadlord_bot','-1'),\n('70558','0','0','0','0','0','Fearoth','Dreadlord Bot','','0','83','83','2','35','1','1.1','1.1','1.5','2','0','1300','1300','2','0','0','0','0','3','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','0','dreadlord_bot','-1'),\n('70559','0','0','0','0','0','Zalamon','Dreadlord Bot','','0','83','83','2','35','1','1.1','1.1','1.5','2','0','1300','1300','2','0','0','0','0','3','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','0','dreadlord_bot','-1'),\n('70560','0','0','0','0','0','Lotthicus','Dreadlord Bot','','0','83','83','2','35','1','1.1','1.1','1.5','2','0','1300','1300','2','0','0','0','0','3','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','0','dreadlord_bot','-1'),\n('70561','0','0','0','0','0','Ramarot','Dreadlord Bot','','0','83','83','2','35','1','1.1','1.1','1.5','2','0','1300','1300','2','0','0','0','0','3','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','0','dreadlord_bot','-1'),\n('70562','0','0','0','0','0','Infernal',NULL,'','0','83','83','2','35','0','1.2','1.3','1.5','0','2','1350','1350','1','0','0','0','0','3','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','dreadlord_pet_bot','-1'),\n('70563','0','0','0','0','0','Eanor','Spell Breaker Bot','','0','81','81','2','35','1','1.1','1.1','1.5','4','0','1900','1900','2','0','0','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','0','spellbreaker_bot','-1'),\n('70564','0','0','0','0','0','Narsen','Spell Breaker Bot','','0','81','81','2','35','1','1.1','1.1','1.5','4','0','1900','1900','2','0','0','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','0','spellbreaker_bot','-1'),\n('70565','0','0','0','0','0','Caelnor','Spell Breaker Bot','','0','81','81','2','35','1','1.1','1.1','1.5','4','0','1900','1900','2','0','0','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','0','spellbreaker_bot','-1'),\n('70566','0','0','0','0','0','Daenste','Spell Breaker Bot','','0','81','81','2','35','1','1.1','1.1','1.5','4','0','1900','1900','2','0','0','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','0','spellbreaker_bot','-1'),\n('70567','0','0','0','0','0','Neshdar','Spell Breaker Bot','','0','81','81','2','35','1','1.1','1.1','1.5','4','0','1900','1900','2','0','0','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','0','spellbreaker_bot','-1'),\n('70568','0','0','0','0','0','Mara','Dark Ranger Bot','','0','83','83','2','35','1','1.1','1.1','1','2','0','2000','2000','8','0','0','0','0','6','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','0','dark_ranger_bot','-1'),\n('70569','0','0','0','0','0','Tani','Dark Ranger Bot','','0','83','83','2','35','1','1.1','1.1','1','2','0','2000','2000','8','0','0','0','0','6','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','0','dark_ranger_bot','-1'),\n('70570','0','0','0','0','0','Eva','Dark Ranger Bot','','0','83','83','2','35','1','1.1','1.1','1','2','0','2000','2000','8','0','0','0','0','6','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','0','dark_ranger_bot','-1'),\n('70571','0','0','0','0','0','Darise','Dark Ranger Bot','','0','83','83','2','35','1','1.1','1.1','1','2','0','2000','2000','8','0','0','0','0','6','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','0','dark_ranger_bot','-1'),\n('70572','0','0','0','0','0','Lyra','Dark Ranger Bot','','0','83','83','2','35','1','1.1','1.1','1','2','0','2000','2000','8','0','0','0','0','6','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','0','dark_ranger_bot','-1'),\n('70573','0','0','0','0','0','Dark Minion',NULL,'','0','83','83','2','35','0','1.1','1.1','1','0','0','2000','2000','1','0','0','0','0','6','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','0','dark_ranger_pet_bot','-1'),\n('70574','0','0','0','0','0','Dark Minion',NULL,'','0','83','83','2','35','0','1.1','1.1','1','1','0','2000','2000','1','0','0','0','0','6','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','0','dark_ranger_pet_bot','-1');\n-- 70575 - 71000 reserved for custom stuff\n\n-- GOSSIPS --\ndelete from `npc_text` where ID between @BOT_START and @BOT_END;\ninsert into `npc_text` (`ID`,`text0_0`,`VerifiedBuild`)\nvalues\n('70001','I live only to serve the master.','-1'),\n('70002','You need something?','-1'),\n('70003','Mortals... usually I kill wretches like you at sight.','-1'),\n('70004','<You see what is supposed to be an obsidian destroyer. This one looks different though, damaged and faded, and does not react to your presence. You recall the Scourge have been using their own versions of those at some point in the past. How the hell did it end up here? After further examination you notice an opening on creature\\'s back.>','-1'),\n('70005','<Obsidian Destroyer stares at you and makes a low growling sound.>','-1'),\n('70006','Are you surprised, mortal? As a lesser nathrezim I have to resort to seeking out allies. You look like you could amuse me at least.','-1'),\n('70007','What is it now, mortal?','-1'),\n('70008','Can you just leave me be? <sigh>','-1'),\n('70009','Now what?','-1'),\n-- 70010 - 70100 reserved for standard/greet gossips\n('70101','|cffff3300Blademaster|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\\\"An elite swordsman, former member of Burning Blade clan, now an elite fighter within the Horde\\\".$B$BMain attribute: Agility.$B$BNetherwalk (Windwalk). Allows Blademaster to become invisible, and move faster for a set amount of time. When the Blademaster attacks a unit to break invisibility, he will deal bonus damage.$B$BMirror Image. Confuses the enemy by creating illusions of the Blademaster and dispelling all magic from the Blademaster.$B$BCritical Strike (passive). Gives a 15% chance to deal critical x2(x3,x4) times normal damage on his attacks.$B$BBladestorm (NIY). Grants immunity to magic and deals damage to all surrounding enemies.$B$B','-1'),\n('70102','|cff9900ccObsidian Destroyer|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\\\"An obsidian winged monstrocity with insatiable hunger for magic\\\".$B$BHigh armor, very high resistances, partially immune to magic, loses mana over time and doesn\\'t benefit from passive mana regeneration effects, mail/plate armor, dual-wielding wands, deals spellshadow damage, no physical attack, cannot attack enemies not in front while moving, spell power bonus: 50% attack power + 200% intellect + wands damage.$B$BDevour Magic. Dispels up to 2 magic effects from enemies, up to 2 magic effects and up to 2 curses from allies and damaging summoned units in 20 yards area. Every dispelled effect restores 20% mana and 5% health, 7 seconds cooldown.$B$BShadow Blast. Empowered attack that deals increased splash damage.$B$BDrain Mana. Drains all mana (limited by caster\\'s mana pool) from a random friendly unit.$B$BReplenish Mana. Energizes surrounding party and raid members within 25 yards for 2% of their maximum mana nullifying caster\\'s mana, affects up to 10 targets, 3 seconds cooldown.$B$BRegenerating Aura. Heals surrounding party and raid members within 25 yards for 3% of their maximum health nullifying caster\\'s mana, affects up to 10 targets, 3 seconds cooldown.$B$BShadow Armor (passive). Restores mana equal to a percentage of damage taken.$B$B','-1'),\n('70103','|cff0000ddArchmage|r$b|cffdd6600-=Warcraft III tribute=-|r$B$BSpell damage taken reduced by 35%, partially immune to control effects, cloth armor, deals spellsfire/spellfrost damage, no physical attack, spell power bonus: 100% intellect. Main attribute: Intellect.$B$BBlizzard. Your typical blizzard, just a little more powerful, 6 seconds cooldown.$B$BSummon Water Elemental. Summons a water elemental to attack archmage\\'s enemies for 1 min, 20 seconds cooldown.$B$BBrilliance Aura. Increases maximum mana by 10% and greatly increases mana regeneration of party and raid members within 40 yards.$B$BMass Teleport. NIY.','-1'),\n('70104','|cff9900ccDreadlord|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\\\"Incredibly powerful demon who wields power of darkness and mental domination\\\".$B$BHigh armor, high resistances, partially immune to control effects, damage taken speeds up spells recharge, plate armor, deals melee/spellshadow damage, bonus damage against incapacitated targets, spell power bonus: 200% strength. Main attribute: Strength.$B$BCarrion Swarm. Sends a horde of bats combined with chaotic magic to damage enemies in a very large frontal cone, cannot crit, 10 seconds cooldown.$B$BSleep. Puts the enemy target to sleep for 60 seconds and allows next physical attack on that target to bypass armor, direct damage caused will awaken the target, 6 seconds cooldown.$B$BVampiric Aura. Increases physical critical damage by 5% and heals party and raid members within 40 yards for a percentage (100% for Dreadlord and 25% for everyone else) of damage done by melee physical attacks and Carrion Swarm, no threat.$B$BSummon Infernal Servant. Calls an infernal down from the sky dealing damage and stunning enemy units, infernal is very resistant to magic and lasts 180 seconds, 180 seconds cooldown.','-1'),\n('70105','|cff0000ddSpell Breaker|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\\\"An elven warrior trained to disrupt and contort magical energies\\\".$B$BSpell damage taken reduced by 75%, partially immune to control effects, armor penalty -30%, mail/plate armor, deals melee/arcane damage, spell power bonus: 200% strength. Main attribute: Strength.$B$BSteal Magic (Spellsteal). Steals a benefical spell from an enemy and applies it to a nearby ally or removes a negative spell from an ally and applies it to a nearby enemy, affects magic and curse effects, 3 seconds cooldown.$B$BFeedback (passive). Successful melee attacks burn target\\'s mana equal to damage caused (increased by spellpower) dealing arcane damage. If target is drained, Spell Breaker\\'s melee attacks will do triple damage with increased critical strike chance','-1'),\n('70106','|cff9900ccDark Ranger|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\\\"A former ranger of Quel\\'thalas forcibly raised from the dead\\\".$B$BSpell damage taken reduced by 35%, undead, partially immune to control effects, leather/cloth armor, deals physical/spellshadow damage, stick to shadows and generates no threat, spell power bonus: 50% intellect. Main attribute: Agility.$B$BSilence. Silences an enemy and up to 4 nearby targets for 8 seconds, 15 seconds cooldown.$B$BBlack Arrow. Fires a cursed arrow dealing 150% weapon damage and additional spellshadow damage over time. If affected target dies from Dark Ranger\\'s damage, Dark Minion will spawn from the corpse (maximum 5 Minions, 80 seconds duration, only works on humanoids, beasts and dragonkin). Deals five times more damage if target is under 20% health.$B$BDrain Life. Drains health from an enemy every second for 5 seconds, healing Dark Ranger for 200% of the drained amount.','-1');\n-- 70107 - 70200 reserved for custom class descriptions\n\n-- OUTFITS --\n-- Npc Dress mod by Rochet2\nCREATE TABLE IF NOT EXISTS `creature_template_outfits` (\n    `entry` INT(10) UNSIGNED NOT NULL,\n    `race` tinyint(3) UNSIGNED NOT NULL DEFAULT '1',\n    `gender` tinyint(3) UNSIGNED NOT NULL DEFAULT '0' COMMENT '0 for male, 1 for female',\n    `skin` tinyint(3) UNSIGNED NOT NULL DEFAULT '0',\n    `face` tinyint(3) UNSIGNED NOT NULL DEFAULT '0',\n    `hair` tinyint(3) UNSIGNED NOT NULL DEFAULT '0',\n    `haircolor` tinyint(3) UNSIGNED NOT NULL DEFAULT '0',\n    `facialhair` tinyint(3) UNSIGNED NOT NULL DEFAULT '0',\n    `head` INT(10) UNSIGNED NOT NULL DEFAULT '0',\n    `shoulders` INT(10) UNSIGNED NOT NULL DEFAULT '0',\n    `body` INT(10) UNSIGNED NOT NULL DEFAULT '0',\n    `chest` INT(10) UNSIGNED NOT NULL DEFAULT '0',\n    `waist` INT(10) UNSIGNED NOT NULL DEFAULT '0',\n    `legs` INT(10) UNSIGNED NOT NULL DEFAULT '0',\n    `feet` INT(10) UNSIGNED NOT NULL DEFAULT '0',\n    `wrists` INT(10) UNSIGNED NOT NULL DEFAULT '0',\n    `hands` INT(10) UNSIGNED NOT NULL DEFAULT '0',\n    `back` INT(10) UNSIGNED NOT NULL DEFAULT '0',\n    `tabard` INT(10) UNSIGNED NOT NULL DEFAULT '0',\n    PRIMARY KEY  (`entry`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n-- End Npc Dress mod\n\nreplace into `creature_template_outfits` (`entry`, `race`, `gender`, `skin`, `face`, `hair`, `haircolor`, `facialhair`, `head`, `shoulders`, `body`, `chest`, `waist`, `legs`, `feet`, `wrists`, `hands`, `back`, `tabard`)\nvalues\n('70551','2','0','0','14','9','7','5','0','0','0','0','59194','64674','0','36248','0','0','0'), -- Blademaster\n('70552','2','0','0','14','9','7','5','0','0','0','0','59194','64674','0','36248','0','0','0'); -- Mirror Image (Blademaster)\n\n-- Customize section\n\nSET @CLASS_WARRIOR          = 1;\nSET @CLASS_PALADIN          = 2;\nSET @CLASS_HUNTER           = 3;\nSET @CLASS_ROGUE            = 4;\nSET @CLASS_PRIEST           = 5;\nSET @CLASS_DK               = 6;\nSET @CLASS_SHAMAN           = 7;\nSET @CLASS_MAGE             = 8;\nSET @CLASS_WARLOCK          = 9;\nSET @CLASS_DRUID            = 11;\nSET @CLASS_BM               = 12;\nSET @CLASS_SPHYNX           = 13;\nSET @CLASS_ARCHMAGE         = 14;\nSET @CLASS_DREADLORD        = 15;\nSET @CLASS_SPELLBREAKER     = 16;\nSET @CLASS_DARK_RANGER      = 17;\n\n-- Add flags_extra\n\nSET @EX_NO_PARRY_HASTEN     = 8; -- 0x00000008 - CREATURE_FLAG_EXTRA_NO_PARRY_HASTEN\nSET @EX_NO_BLOCK            = 16; -- 0x00000010 - CREATURE_FLAG_EXTRA_NO_BLOCK\nSET @EX_NO_CRUSH            = 32; -- 0x00000020 - CREATURE_FLAG_EXTRA_NO_CRUSH\nSET @EX_NO_XP               = 64; -- 0x00000040 - CREATURE_FLAG_EXTRA_NO_XP_AT_KILL\nSET @EX_DIMINISH            = 1048576; -- 0x00100000 - CREATURE_FLAG_EXTRA_ALL_DIMINISH\nSET @EX_NPCBOT              = 67108864; -- 0x04000000 - CREATURE_FLAG_EXTRA_NPCBOT - custom flag\nSET @EX_NPCBOT_PET          = 134217728; -- 0x08000000 - CREATURE_FLAG_EXTRA_NPCBOT_PET - custom flag\nSET @FLAGS_EX               = @EX_NO_BLOCK | @EX_NO_CRUSH | @EX_NO_XP | @EX_DIMINISH | @EX_NPCBOT;\nSET @FLAGS_EXN              = @EX_NO_BLOCK | @EX_NO_CRUSH | @EX_NO_XP | @EX_DIMINISH | @EX_NPCBOT | @EX_NO_PARRY_HASTEN;\nSET @FLAGS_EX_PET           = @EX_NO_BLOCK | @EX_NO_CRUSH | @EX_NO_XP | @EX_DIMINISH | @EX_NPCBOT_PET;\nSET @FLAGS_EX_PET_BLOCK     = @EX_NO_CRUSH | @EX_NO_XP | @EX_DIMINISH | @EX_NPCBOT_PET;\n\n-- Add unit_flags\n-- SET @U_PVP_ATTACKABLE       = 8; -- 0x00000008 - UNIT_FLAG_PVP_ATTACKABLE\nSET @FLAGS_U                = 0;\nSET @FLAGS_U_PET            = 0;\n\n-- Add unit_flags2\nSET @U2_MIRROR_IMAGE        = 16; -- 0x00000010 - UNIT_FLAG2_MIRROR_IMAGE - 22.06.19\nSET @U2_INSTANT_APPEAR_MODEL= 32; -- 0x00000020 - UNIT_FLAG2_INSTANTLY_APPEAR_MODEL - 29.05.19\nSET @U2_ENEMY_INTERRACT     = 16384; -- 0x00004000 - UNIT_FLAG2_ALLOW_ENEMY_INTERACT\n-- SET @U2_DISABLE_TURN        = 32768; -- 0x00008000 - UNIT_FLAG2_DISABLE_TURN\nSET @FLAGS_U2               = @U2_MIRROR_IMAGE | @U2_INSTANT_APPEAR_MODEL | @U2_ENEMY_INTERRACT;\nSET @FLAGS_U2_NM            = @U2_INSTANT_APPEAR_MODEL | @U2_ENEMY_INTERRACT;\nSET @FLAGS_U2_PET           = 0;\n\n-- Add type_flags\nSET @CT_CAN_ASSIST          = 4096; -- 0x00001000 - CREATURE_TYPE_FLAG_CAN_ASSIST - 26.10.19\nSET @FLAGS_CT               = @CT_CAN_ASSIST;\n\n-- general\nUPDATE `creature_template` SET type_flags:=`type_flags`|@FLAGS_CT WHERE `entry` BETWEEN @BOT_START AND @BOT_END;\n\n-- minions\nUPDATE `creature_template` SET exp:=2, faction:=35, minlevel:=80, maxlevel:=80, BaseAttackTime:=3300, RangeAttackTime:=2000, dynamicflags:=0, speed_walk:=1.1, speed_run:=1.1, scale:=1, HealthModifier:=1, ManaModifier:=1, ArmorModifier:=1, RegenHealth:=0, mechanic_immune_mask:=0, flags_extra:=@FLAGS_EX, unit_flags:=`unit_flags`|@FLAGS_U, unit_flags2:=`unit_flags2`|@FLAGS_U2,    AIName:=''\nWHERE `entry` IN (SELECT `entry` FROM `creature_template_npcbot_extras` WHERE `class`=@CLASS_DK);\nUPDATE `creature_template` SET exp:=2, faction:=35, minlevel:=80, maxlevel:=80, BaseAttackTime:=2200, RangeAttackTime:=2000, dynamicflags:=0, speed_walk:=1.1, speed_run:=1.1, scale:=1, HealthModifier:=1, ManaModifier:=1, ArmorModifier:=1, RegenHealth:=0, mechanic_immune_mask:=0, flags_extra:=@FLAGS_EX, unit_flags:=`unit_flags`|@FLAGS_U, unit_flags2:=`unit_flags2`|@FLAGS_U2,    AIName:=''\nWHERE `entry` IN (SELECT `entry` FROM `creature_template_npcbot_extras` WHERE `class`=@CLASS_DRUID);\nUPDATE `creature_template` SET exp:=2, faction:=35, minlevel:=80, maxlevel:=80, BaseAttackTime:=2800, RangeAttackTime:=2000, dynamicflags:=0, speed_walk:=1.1, speed_run:=1.1, scale:=1, HealthModifier:=1, ManaModifier:=1, ArmorModifier:=1, RegenHealth:=0, mechanic_immune_mask:=0, flags_extra:=@FLAGS_EX, unit_flags:=`unit_flags`|@FLAGS_U, unit_flags2:=`unit_flags2`|@FLAGS_U2,    AIName:=''\nWHERE `entry` IN (SELECT `entry` FROM `creature_template_npcbot_extras` WHERE `class`=@CLASS_HUNTER);\nUPDATE `creature_template` SET exp:=2, faction:=35, minlevel:=80, maxlevel:=80, BaseAttackTime:=3800, RangeAttackTime:=2000, dynamicflags:=0, speed_walk:=1.1, speed_run:=1.1, scale:=1, HealthModifier:=1, ManaModifier:=1, ArmorModifier:=1, RegenHealth:=0, mechanic_immune_mask:=0, flags_extra:=@FLAGS_EX, unit_flags:=`unit_flags`|@FLAGS_U, unit_flags2:=`unit_flags2`|@FLAGS_U2,    AIName:=''\nWHERE `entry` IN (SELECT `entry` FROM `creature_template_npcbot_extras` WHERE `class`=@CLASS_MAGE);\nUPDATE `creature_template` SET exp:=2, faction:=35, minlevel:=80, maxlevel:=80, BaseAttackTime:=2300, RangeAttackTime:=2000, dynamicflags:=0, speed_walk:=1.1, speed_run:=1.1, scale:=1, HealthModifier:=1, ManaModifier:=1, ArmorModifier:=1, RegenHealth:=0, mechanic_immune_mask:=0, flags_extra:=@FLAGS_EX, unit_flags:=`unit_flags`|@FLAGS_U, unit_flags2:=`unit_flags2`|@FLAGS_U2,    AIName:=''\nWHERE `entry` IN (SELECT `entry` FROM `creature_template_npcbot_extras` WHERE `class`=@CLASS_PALADIN);\nUPDATE `creature_template` SET exp:=2, faction:=35, minlevel:=80, maxlevel:=80, BaseAttackTime:=3600, RangeAttackTime:=2000, dynamicflags:=0, speed_walk:=1.1, speed_run:=1.1, scale:=1, HealthModifier:=1, ManaModifier:=1, ArmorModifier:=1, RegenHealth:=0, mechanic_immune_mask:=0, flags_extra:=@FLAGS_EX, unit_flags:=`unit_flags`|@FLAGS_U, unit_flags2:=`unit_flags2`|@FLAGS_U2,    AIName:=''\nWHERE `entry` IN (SELECT `entry` FROM `creature_template_npcbot_extras` WHERE `class`=@CLASS_PRIEST);\nUPDATE `creature_template` SET exp:=2, faction:=35, minlevel:=80, maxlevel:=80, BaseAttackTime:=1600, RangeAttackTime:=2000, dynamicflags:=0, speed_walk:=1.1, speed_run:=1.1, scale:=1, HealthModifier:=1, ManaModifier:=1, ArmorModifier:=1, RegenHealth:=0, mechanic_immune_mask:=0, flags_extra:=@FLAGS_EX, unit_flags:=`unit_flags`|@FLAGS_U, unit_flags2:=`unit_flags2`|@FLAGS_U2,    AIName:=''\nWHERE `entry` IN (SELECT `entry` FROM `creature_template_npcbot_extras` WHERE `class`=@CLASS_ROGUE);\nUPDATE `creature_template` SET exp:=2, faction:=35, minlevel:=80, maxlevel:=80, BaseAttackTime:=2600, RangeAttackTime:=2000, dynamicflags:=0, speed_walk:=1.1, speed_run:=1.1, scale:=1, HealthModifier:=1, ManaModifier:=1, ArmorModifier:=1, RegenHealth:=0, mechanic_immune_mask:=0, flags_extra:=@FLAGS_EX, unit_flags:=`unit_flags`|@FLAGS_U, unit_flags2:=`unit_flags2`|@FLAGS_U2,    AIName:=''\nWHERE `entry` IN (SELECT `entry` FROM `creature_template_npcbot_extras` WHERE `class`=@CLASS_SHAMAN);\nUPDATE `creature_template` SET exp:=2, faction:=35, minlevel:=80, maxlevel:=80, BaseAttackTime:=3500, RangeAttackTime:=2000, dynamicflags:=0, speed_walk:=1.1, speed_run:=1.1, scale:=1, HealthModifier:=1, ManaModifier:=1, ArmorModifier:=1, RegenHealth:=0, mechanic_immune_mask:=0, flags_extra:=@FLAGS_EX, unit_flags:=`unit_flags`|@FLAGS_U, unit_flags2:=`unit_flags2`|@FLAGS_U2,    AIName:=''\nWHERE `entry` IN (SELECT `entry` FROM `creature_template_npcbot_extras` WHERE `class`=@CLASS_WARLOCK);\nUPDATE `creature_template` SET exp:=2, faction:=35, minlevel:=80, maxlevel:=80, BaseAttackTime:=3400, RangeAttackTime:=2000, dynamicflags:=0, speed_walk:=1.1, speed_run:=1.1, scale:=1, HealthModifier:=1, ManaModifier:=1, ArmorModifier:=1, RegenHealth:=0, mechanic_immune_mask:=0, flags_extra:=@FLAGS_EX, unit_flags:=`unit_flags`|@FLAGS_U, unit_flags2:=`unit_flags2`|@FLAGS_U2,    AIName:=''\nWHERE `entry` IN (SELECT `entry` FROM `creature_template_npcbot_extras` WHERE `class`=@CLASS_WARRIOR);\nUPDATE `creature_template` SET exp:=2, faction:=35, minlevel:=81, maxlevel:=81, BaseAttackTime:=1940, RangeAttackTime:=1940, dynamicflags:=0, speed_walk:=1.1, speed_run:=1.1, scale:=1, HealthModifier:=1, ManaModifier:=1, ArmorModifier:=1, RegenHealth:=0, mechanic_immune_mask:=1, flags_extra:=@FLAGS_EXN,unit_flags:=`unit_flags`|@FLAGS_U, unit_flags2:=`unit_flags2`|@FLAGS_U2,    AIName:=''\nWHERE `entry` IN (SELECT `entry` FROM `creature_template_npcbot_extras` WHERE `class`=@CLASS_BM);\nUPDATE `creature_template` SET exp:=2, faction:=35, minlevel:=83, maxlevel:=83, BaseAttackTime:=1350, RangeAttackTime:=1350, dynamicflags:=0, speed_walk:=1.1, speed_run:=1.1,scale:=0.7,HealthModifier:=1, ManaModifier:=1, ArmorModifier:=1, RegenHealth:=0, mechanic_immune_mask:=0, flags_extra:=@FLAGS_EX, unit_flags:=`unit_flags`|@FLAGS_U, unit_flags2:=`unit_flags2`|@FLAGS_U2_NM, AIName:=''\nWHERE `entry` IN (SELECT `entry` FROM `creature_template_npcbot_extras` WHERE `class`=@CLASS_SPHYNX);\nUPDATE `creature_template` SET exp:=2, faction:=35, minlevel:=81, maxlevel:=81, BaseAttackTime:=1420, RangeAttackTime:=1420, dynamicflags:=0, speed_walk:=1.1, speed_run:=2.1, scale:=1, HealthModifier:=1, ManaModifier:=1, ArmorModifier:=1, RegenHealth:=0, mechanic_immune_mask:=0, flags_extra:=@FLAGS_EX, unit_flags:=`unit_flags`|@FLAGS_U, unit_flags2:=`unit_flags2`|@FLAGS_U2,    AIName:=''\nWHERE `entry` IN (SELECT `entry` FROM `creature_template_npcbot_extras` WHERE `class`=@CLASS_ARCHMAGE);\nUPDATE `creature_template` SET exp:=2, faction:=35, minlevel:=83, maxlevel:=83, BaseAttackTime:=2600, RangeAttackTime:=2600, dynamicflags:=0, speed_walk:=1.1, speed_run:=1.1,scale:=1.2,HealthModifier:=1, ManaModifier:=1, ArmorModifier:=1, RegenHealth:=0, mechanic_immune_mask:=0, flags_extra:=@FLAGS_EX, unit_flags:=`unit_flags`|@FLAGS_U, unit_flags2:=`unit_flags2`|@FLAGS_U2_NM, AIName:=''\nWHERE `entry` IN (SELECT `entry` FROM `creature_template_npcbot_extras` WHERE `class`=@CLASS_DREADLORD);\nUPDATE `creature_template` SET exp:=2, faction:=35, minlevel:=81, maxlevel:=81, BaseAttackTime:=1900, RangeAttackTime:=1900, dynamicflags:=0, speed_walk:=1.1, speed_run:=1.1,scale:=1.1,HealthModifier:=1, ManaModifier:=1, ArmorModifier:=1, RegenHealth:=0, mechanic_immune_mask:=0, flags_extra:=@FLAGS_EX, unit_flags:=`unit_flags`|@FLAGS_U, unit_flags2:=`unit_flags2`|@FLAGS_U2_NM, AIName:=''\nWHERE `entry` IN (SELECT `entry` FROM `creature_template_npcbot_extras` WHERE `class`=@CLASS_SPELLBREAKER);\nUPDATE `creature_template` SET exp:=2, faction:=35, minlevel:=82, maxlevel:=82, BaseAttackTime:=2000, RangeAttackTime:=2000, dynamicflags:=0, speed_walk:=1.1, speed_run:=1.1, scale:=1, HealthModifier:=1, ManaModifier:=1, ArmorModifier:=1, RegenHealth:=0, mechanic_immune_mask:=0, flags_extra:=@FLAGS_EX, unit_flags:=`unit_flags`|@FLAGS_U, unit_flags2:=`unit_flags2`|@FLAGS_U2_NM, AIName:=''\nWHERE `entry` IN (SELECT `entry` FROM `creature_template_npcbot_extras` WHERE `class`=@CLASS_DARK_RANGER);\n\n-- pets\nSET @PET_START              = 70501;\nSET @PET_END                = 70550;\nSET @PET_WATER_ELEMENTAL    = 70556;\nSET @PET_INFERNAL           = 70562;\nSET @PET_DARK_MINION        = 70573;\nSET @PET_DARK_MINION_ELITE  = 70574;\n\nUPDATE `creature_template` SET exp:=2, faction:=35, minlevel:=80, maxlevel:=80, dynamicflags:=0, speed_walk:=1.2, speed_run:=1.3, scale:=1.0, HealthModifier:=1, ManaModifier:=1, ArmorModifier:=1, RegenHealth:=0, flags_extra:=@FLAGS_EX_PET, unit_flags:=`unit_flags`|@FLAGS_U_PET, unit_flags2:=`unit_flags2`|@FLAGS_U2_PET, AIName:=''\nWHERE `entry` BETWEEN @PET_START and @PET_END;\nUPDATE `creature_template` SET exp:=2, faction:=35, minlevel:=81, maxlevel:=81, dynamicflags:=0, speed_walk:=1.2, speed_run:=1.3, scale:=1.3, HealthModifier:=1, ManaModifier:=1, ArmorModifier:=1, RegenHealth:=0, flags_extra:=@FLAGS_EX_PET, unit_flags:=`unit_flags`|@FLAGS_U_PET, unit_flags2:=`unit_flags2`|@FLAGS_U2_PET, AIName:=''\nWHERE `entry`=@PET_WATER_ELEMENTAL;\nUPDATE `creature_template` SET exp:=2, faction:=35, minlevel:=83, maxlevel:=83, dynamicflags:=0, speed_walk:=1.2, speed_run:=1.3, scale:=1.5, HealthModifier:=1, ManaModifier:=1, ArmorModifier:=1, RegenHealth:=0, flags_extra:=@FLAGS_EX_PET, unit_flags:=`unit_flags`|@FLAGS_U_PET, unit_flags2:=`unit_flags2`|@FLAGS_U2_PET, AIName:=''\nWHERE `entry`=@PET_INFERNAL;\nUPDATE `creature_template` SET exp:=2, faction:=35, minlevel:=83, maxlevel:=83, dynamicflags:=0, speed_walk:=1.2, speed_run:=1.3, scale:=0.8, HealthModifier:=1, ManaModifier:=1, ArmorModifier:=1, RegenHealth:=0, flags_extra:=@FLAGS_EX_PET_BLOCK, unit_flags:=`unit_flags`|@FLAGS_U_PET, unit_flags2:=`unit_flags2`|@FLAGS_U2_PET, AIName:=''\nWHERE `entry`=@PET_DARK_MINION;\nUPDATE `creature_template` SET exp:=2, faction:=35, minlevel:=83, maxlevel:=83, dynamicflags:=0, speed_walk:=1.2, speed_run:=1.3, scale:=0.9, HealthModifier:=1, ManaModifier:=1, ArmorModifier:=1, RegenHealth:=0, flags_extra:=@FLAGS_EX_PET_BLOCK, unit_flags:=`unit_flags`|@FLAGS_U_PET, unit_flags2:=`unit_flags2`|@FLAGS_U2_PET, AIName:=''\nWHERE `entry`=@PET_DARK_MINION_ELITE;\n"
  },
  {
    "path": "AC/SQL/4_world_generate_bot_equips.sql",
    "content": "/*!50003 DROP PROCEDURE IF EXISTS `sp__generate_npcbot_equips`*/;\n\nDELIMITER ;;\n\n/*!50003 CREATE*/\n/*!50003 PROCEDURE `sp__generate_npcbot_equips`()\nBEGIN\n\nDECLARE CLASS_WARRIOR INT DEFAULT 1;\nDECLARE CLASS_PALADIN INT DEFAULT 2;\nDECLARE CLASS_HUNTER INT DEFAULT 3;\nDECLARE CLASS_ROGUE INT DEFAULT 4;\nDECLARE CLASS_PRIEST INT DEFAULT 5;\nDECLARE CLASS_DEATH_KNIGHT INT DEFAULT 6;\nDECLARE CLASS_SHAMAN INT DEFAULT 7;\nDECLARE CLASS_MAGE INT DEFAULT 8;\nDECLARE CLASS_WARLOCK INT DEFAULT 9;\nDECLARE CLASS_DRUID INT DEFAULT 11;\nDECLARE CLASS_BLADEMASTER INT DEFAULT 12;\nDECLARE CLASS_SPHYNX INT DEFAULT 13;\nDECLARE CLASS_ARCHMAGE INT DEFAULT 14;\nDECLARE CLASS_DREADLORD INT DEFAULT 15;\nDECLARE CLASS_SPELL_BREAKER INT DEFAULT 16;\nDECLARE CLASS_DARK_RANGER INT DEFAULT 17;\n\nDECLARE RACE_HUMAN INT DEFAULT 1;\nDECLARE RACE_ORC INT DEFAULT 2;\nDECLARE RACE_DWARF INT DEFAULT 3;\nDECLARE RACE_NELF INT DEFAULT 4;\nDECLARE RACE_UNDEAD INT DEFAULT 5;\nDECLARE RACE_TAUREN INT DEFAULT 6;\nDECLARE RACE_GNOME INT DEFAULT 7;\nDECLARE RACE_TROLL INT DEFAULT 8;\nDECLARE RACE_BELF INT DEFAULT 10;\nDECLARE RACE_DRAENEI INT DEFAULT 11;\n\nDECLARE NPCBOT_ENTRY_BEGIN INT DEFAULT 70001;\nDECLARE NPCBOT_ENTRY_END INT DEFAULT 71000;\n\nDECLARE NPCBOT_ENTRY_PET_DARK_MINION INT DEFAULT 70573;\nDECLARE NPCBOT_ENTRY_PET_DARK_MINION_ELITE INT DEFAULT 70574;\n\nDECLARE cur_pos INT DEFAULT 0;\nDECLARE myclass INT;\nDECLARE myrace INT;\nDECLARE item1 INT DEFAULT 0;\nDECLARE item2 INT DEFAULT 0;\nDECLARE item3 INT DEFAULT 0;\n\nDELETE FROM `creature_equip_template` WHERE `CreatureID` BETWEEN NPCBOT_ENTRY_BEGIN AND NPCBOT_ENTRY_END;\n\nSET cur_pos = NPCBOT_ENTRY_BEGIN;\nWHILE cur_pos < NPCBOT_ENTRY_END DO\n    SET myclass = (SELECT `class` FROM `creature_template_npcbot_extras` WHERE `entry` = cur_pos);\n    SET myrace = (SELECT `race` FROM `creature_template_npcbot_extras` WHERE `entry` = cur_pos);\n\n    IF myclass != 0 AND myrace != 0 THEN\n\n        IF myclass = CLASS_WARRIOR THEN\n            IF myrace = RACE_TAUREN THEN\n                SET item1 = 2361; -- hammer\n            ELSEIF myrace IN(RACE_DWARF,RACE_ORC) THEN\n                SET item1 = 2483; -- axe\n            ELSEIF TRUE THEN\n                SET item1 = 2497; -- sword\n            END IF;\n        ELSEIF myclass = CLASS_PALADIN THEN\n            SET item1 = 2488; -- gladius\n            SET item3 = 0;\n            IF myrace = RACE_BELF THEN\n                SET item2 = 20841; -- sunstrider shield\n            ELSE\n                SET item2 = 7188;  -- stormwind guard shield\n            END IF;\n        ELSEIF myclass = CLASS_HUNTER THEN\n            SET item1 = 12282;\n            SET item2 = 0;\n            SET item3 = 2506;\n        ELSEIF myclass = CLASS_ROGUE THEN\n            SET item3 = 25873;\n            IF (cur_pos % 2) = 1 THEN\n                SET item1 = 2092;\n                SET item2 = 3296; -- daggers\n            ELSE\n                SET item1 = 2131;\n                SET item2 = 2484; -- swords\n            END IF;\n        ELSEIF myclass = CLASS_PRIEST THEN\n            SET item1 = 1388; -- short staff\n            SET item2 = 0;\n            SET item3 = 0;\n        ELSEIF myclass = CLASS_DEATH_KNIGHT THEN\n            SET item1 = 38633; -- dk axe\n            SET item2 = 0;\n            SET item3 = 0;\n        ELSEIF myclass = CLASS_SHAMAN THEN\n            SET item1 = 15903; -- claw\n            SET item2 = 0;\n            SET item3 = 0;\n        ELSEIF myclass = CLASS_MAGE THEN\n            SET item1 = 2132; -- staff\n            SET item2 = 0;\n            SET item3 = 0;\n        ELSEIF myclass = CLASS_WARLOCK THEN\n            SET item1 = 3661; -- staff\n            SET item2 = 0;\n            SET item3 = 0;\n        ELSEIF myclass = CLASS_DRUID THEN\n            SET item1 = 3327; -- staff\n            SET item2 = 0;\n            SET item3 = 0;\n        ELSEIF myclass = CLASS_BLADEMASTER THEN\n            SET item1 = 24044; -- blademaster polearm\n            SET item2 = 0;\n            SET item3 = 0;\n        ELSEIF myclass = CLASS_SPHYNX THEN\n            SET item1 = 5208; -- smoldering wand\n            SET item2 = 5208;\n            SET item3 = 0;\n        ELSEIF myclass = CLASS_ARCHMAGE THEN\n            SET item1 = 25917; -- white staff\n            SET item2 = 0;\n            SET item3 = 0;\n        ELSEIF myclass = CLASS_DREADLORD THEN\n            SET item1 = 0;\n            SET item2 = 0;\n            SET item3 = 0;\n        ELSEIF myclass = CLASS_SPELL_BREAKER THEN\n            SET item1 = 0;\n            SET item2 = 0;\n            SET item3 = 0;\n        ELSEIF myclass = CLASS_DARK_RANGER THEN\n            SET item1 = 20849; -- arcane forged shortsword (1.7 dps)\n            SET item2 = 0;\n            SET item3 = 34529; -- vengeful gladiator's longbow\n        END IF;\n\n        INSERT INTO `creature_equip_template` (`CreatureID`,`ID`,`itemID1`,`itemID2`,`itemID3`,`VerifiedBuild`) VALUES (cur_pos,1,item1,item2,item3,-1);\n\n    ELSEIF cur_pos = NPCBOT_ENTRY_PET_DARK_MINION OR cur_pos = NPCBOT_ENTRY_PET_DARK_MINION_ELITE THEN\n        SET item1 = 3935;\n        SET item2 = 15648;\n        SET item3 = 0;\n\n        INSERT INTO `creature_equip_template` (`CreatureID`,`ID`,`itemID1`,`itemID2`,`itemID3`,`VerifiedBuild`) VALUES (cur_pos,1,item1,item2,item3,-1);\n\n    END IF;\n\n    SET cur_pos = cur_pos + 1;\n\nEND WHILE;\n\nEND */;;\n\nDELIMITER ;\n\nCALL `sp__generate_npcbot_equips`();\n\nDROP PROCEDURE IF EXISTS `sp__generate_npcbot_equips`;\n"
  },
  {
    "path": "AC/SQL/5_world_botgiver.sql",
    "content": "DELETE FROM `creature_template` WHERE `entry` = 70000;\nINSERT INTO `creature_template`\n(`entry`,`difficulty_entry_1`,`difficulty_entry_2`,`difficulty_entry_3`,`KillCredit1`,`KillCredit2`,\n`name`,`subname`,`IconName`,`gossip_menu_id`,`minlevel`,`maxlevel`,`exp`,\n`faction`,`npcflag`,`speed_walk`,`speed_run`,`speed_swim`,`speed_flight`,`detection_range`,`scale`,`rank`,`dmgschool`,`DamageModifier`,`BaseAttackTime`,`RangeAttackTime`,\n`BaseVariance`,`RangeVariance`,`unit_class`,`unit_flags`,`unit_flags2`,`dynamicflags`,`family`,`trainer_type`,`trainer_spell`,`trainer_class`,`trainer_race`,`type`,`type_flags`,`lootid`,\n`pickpocketloot`,`skinloot`,`PetSpellDataId`,`VehicleId`,`mingold`,`maxgold`,`AIName`,`MovementType`,\n`HoverHeight`,`HealthModifier`,`ManaModifier`,`ArmorModifier`,`ExperienceModifier`,`RacialLeader`,`movementId`,`RegenHealth`,\n`mechanic_immune_mask`,`spell_school_immune_mask`,`flags_extra`,`ScriptName`,`VerifiedBuild`)\nVALUES\n(70000, 0, 0, 0, 0, 0, \"Lagretta\", \"Bots for hire\", \"\", 0, 83, 83, 2, 35, 1, 1.4, 1.14286, 1, 1, 20, 0.7, 4, 0, 1, 0, 0, 1, 1, 1, 33088, 2048, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \"\", 0, 1, 4.8, 1, 1, 1, 0, 0, 1, 0, 0, 0, \"script_bot_giver\", -1);\n\nDELETE FROM `npc_text` WHERE `ID` BETWEEN 70201 AND 70204;\nINSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n('70201','There are always dudes ready to kill for money.','-1'),\n('70202','Mercenaries are always in demand. Here is what available right now.','-1'),\n('70203','Mercenaries are always in demand. Here is what available right now.','-1'),\n('70204','Seems like there is nobody available right now, check again later.','-1');\n"
  },
  {
    "path": "AC/SQL/6_world_bot_models.sql",
    "content": "--\nINSERT IGNORE INTO `creature_template_model` (`CreatureID`,`Idx`,`CreatureDisplayID`,`DisplayScale`,`Probability`,`VerifiedBuild`) VALUES\n(70000,0,27541,0.7,1,0),\n(70001,0,3343,1,1,0),\n(70002,0,3399,1,1,0),\n(70003,0,1300,1,1,0),\n(70004,0,3431,1,1,0),\n(70005,0,4556,1,1,0),\n(70006,0,3431,1,1,0),\n(70007,0,3053,1,1,0),\n(70008,0,1578,1,1,0),\n(70009,0,1599,1,1,0),\n(70010,0,2103,1,1,0),\n(70011,0,2096,1,1,0),\n(70012,0,2113,1,1,0),\n(70013,0,3793,1,1,0),\n(70014,0,3794,1,1,0),\n(70015,0,1880,1,1,0),\n(70016,0,3743,1,1,0),\n(70017,0,1374,1,1,0),\n(70018,0,1375,1,1,0),\n(70019,0,4242,1,1,0),\n(70020,0,1721,1,1,0),\n(70021,0,1707,1,1,0),\n(70022,0,2196,1,1,0),\n(70023,0,2198,1,1,0),\n(70024,0,2620,1,1,0),\n(70025,0,2658,1,1,0),\n(70026,0,2614,1,1,0),\n(70027,0,3054,1,1,0),\n(70028,0,3055,1,1,0),\n(70029,0,3280,1,1,0),\n(70030,0,3287,1,1,0),\n(70031,0,6071,1,1,0),\n(70032,0,11037,1,1,0),\n(70033,0,16226,1,1,0),\n(70034,0,17212,1,1,0),\n(70035,0,17213,1,1,0),\n(70036,0,17215,1,1,0),\n(70037,0,17214,1,1,0),\n(70038,0,17211,1,1,0),\n(70051,0,3346,1,1,0),\n(70052,0,3393,1,1,0),\n(70053,0,1299,1,1,0),\n(70054,0,1499,1,1,0),\n(70055,0,1622,1,1,0),\n(70056,0,3089,1,1,0),\n(70057,0,3088,1,1,0),\n(70058,0,3087,1,1,0),\n(70059,0,3284,1,1,0),\n(70060,0,3289,1,1,0),\n(70061,0,7356,1,1,0),\n(70062,0,15521,1,1,0),\n(70063,0,16685,1,1,0),\n(70064,0,16224,1,1,0),\n(70065,0,16815,1,1,0),\n(70066,0,16811,1,1,0),\n(70067,0,16829,1,1,0),\n(70068,0,17225,1,1,0),\n(70069,0,17227,1,1,0),\n(70070,0,17234,1,1,0),\n(70071,0,17226,1,1,0),\n(70072,0,19596,1,1,0),\n(70073,0,21264,1,1,0),\n(70074,0,29735,1,1,0),\n(70101,0,3395,1,1,0),\n(70102,0,4560,1,1,0),\n(70103,0,3558,1,1,0),\n(70104,0,4372,1,1,0),\n(70105,0,2112,1,1,0),\n(70106,0,2087,1,1,0),\n(70107,0,2105,1,1,0),\n(70108,0,3810,1,1,0),\n(70109,0,3811,1,1,0),\n(70110,0,1882,1,1,0),\n(70111,0,3744,1,1,0),\n(70112,0,1373,1,1,0),\n(70113,0,4239,1,1,0),\n(70114,0,4241,1,1,0),\n(70115,0,1723,1,1,0),\n(70116,0,1703,1,1,0),\n(70117,0,2066,1,1,0),\n(70118,0,2205,1,1,0),\n(70119,0,2206,1,1,0),\n(70120,0,2251,1,1,0),\n(70121,0,3056,1,1,0),\n(70122,0,3072,1,1,0),\n(70123,0,3073,1,1,0),\n(70124,0,3299,1,1,0),\n(70125,0,3312,1,1,0),\n(70126,0,3309,1,1,0),\n(70127,0,3310,1,1,0),\n(70128,0,7538,1,1,0),\n(70129,0,10245,1,1,0),\n(70130,0,15520,1,1,0),\n(70131,0,16681,1,1,0),\n(70132,0,16222,1,1,0),\n(70133,0,16778,1,1,0),\n(70134,0,16816,1,1,0),\n(70135,0,16802,1,1,0),\n(70136,0,17434,1,1,0),\n(70137,0,16860,1,1,0),\n(70138,0,17511,1,1,0),\n(70139,0,17488,1,1,0),\n(70151,0,3351,1,1,0),\n(70152,0,3407,1,1,0),\n(70153,0,1297,1,1,0),\n(70154,0,1507,1,1,0),\n(70155,0,3436,1,1,0),\n(70156,0,5146,1,1,0),\n(70157,0,1580,1,1,0),\n(70158,0,1603,1,1,0),\n(70159,0,1886,1,1,0),\n(70160,0,3749,1,1,0),\n(70161,0,1327,1,1,0),\n(70162,0,1328,1,1,0),\n(70163,0,4360,1,1,0),\n(70164,0,1725,1,1,0),\n(70165,0,1704,1,1,0),\n(70166,0,2231,1,1,0),\n(70167,0,2252,1,1,0),\n(70168,0,2243,1,1,0),\n(70169,0,2659,1,1,0),\n(70170,0,2639,1,1,0),\n(70171,0,2631,1,1,0),\n(70172,0,3101,1,1,0),\n(70173,0,3100,1,1,0),\n(70174,0,3113,1,1,0),\n(70175,0,5528,1,1,0),\n(70176,0,13171,1,1,0),\n(70177,0,15519,1,1,0),\n(70178,0,16689,1,1,0),\n(70179,0,16767,1,1,0),\n(70180,0,16798,1,1,0),\n(70181,0,16818,1,1,0),\n(70201,0,3344,1,1,0),\n(70202,0,1495,1,1,0),\n(70203,0,1295,1,1,0),\n(70204,0,3401,1,1,0),\n(70205,0,3429,1,1,0),\n(70206,0,1579,1,1,0),\n(70207,0,1602,1,1,0),\n(70208,0,2139,1,1,0),\n(70209,0,2138,1,1,0),\n(70210,0,2137,1,1,0),\n(70211,0,1733,1,1,0),\n(70212,0,1708,1,1,0),\n(70213,0,1897,1,1,0),\n(70214,0,4068,1,1,0),\n(70215,0,2200,1,1,0),\n(70216,0,2201,1,1,0),\n(70217,0,2202,1,1,0),\n(70218,0,2626,1,1,0),\n(70219,0,2618,1,1,0),\n(70220,0,3086,1,1,0),\n(70221,0,3066,1,1,0),\n(70222,0,3085,1,1,0),\n(70223,0,3282,1,1,0),\n(70224,0,3283,1,1,0),\n(70225,0,4690,1,1,0),\n(70226,0,10473,1,1,0),\n(70227,0,4711,1,1,0),\n(70228,0,11044,1,1,0),\n(70229,0,11048,1,1,0),\n(70230,0,11053,1,1,0),\n(70231,0,15518,1,1,0),\n(70232,0,16707,1,1,0),\n(70233,0,16225,1,1,0),\n(70234,0,16788,1,1,0),\n(70235,0,16817,1,1,0),\n(70236,0,16795,1,1,0),\n(70237,0,17247,1,1,0),\n(70238,0,17232,1,1,0),\n(70239,0,17249,1,1,0),\n(70240,0,17248,1,1,0),\n(70251,0,4552,1,1,0),\n(70252,0,2123,1,1,0),\n(70253,0,2102,1,1,0),\n(70254,0,2082,1,1,0),\n(70255,0,10180,1,1,0),\n(70256,0,3816,1,1,0),\n(70257,0,1878,1,1,0),\n(70258,0,3746,1,1,0),\n(70259,0,1360,1,1,0),\n(70260,0,4231,1,1,0),\n(70261,0,13341,1,1,0),\n(70265,0,16914,1,1,0),\n(70267,0,19598,1,1,0),\n(70268,0,21265,1,1,0),\n(70301,0,5001,1,1,0),\n(70302,0,1294,1,1,0),\n(70303,0,1484,1,1,0),\n(70304,0,10216,1,1,0),\n(70305,0,10215,1,1,0),\n(70306,0,1592,1,1,0),\n(70307,0,1600,1,1,0),\n(70308,0,2134,1,1,0),\n(70309,0,6058,1,1,0),\n(70310,0,2135,1,1,0),\n(70311,0,2644,1,1,0),\n(70312,0,2657,1,1,0),\n(70313,0,3108,1,1,0),\n(70314,0,10214,1,1,0),\n(70315,0,3109,1,1,0),\n(70316,0,3292,1,1,0),\n(70317,0,10171,1,1,0),\n(70318,0,4524,1,1,0),\n(70319,0,4522,1,1,0),\n(70320,0,4526,1,1,0),\n(70321,0,4523,1,1,0),\n(70322,0,6060,1,1,0),\n(70323,0,6072,1,1,0),\n(70324,0,15522,1,1,0),\n(70325,0,16680,1,1,0),\n(70326,0,16223,1,1,0),\n(70327,0,16781,1,1,0),\n(70328,0,16824,1,1,0),\n(70329,0,16809,1,1,0),\n(70330,0,16777,1,1,0),\n(70331,0,17242,1,1,0),\n(70332,0,16856,1,1,0),\n(70333,0,17233,1,1,0),\n(70334,0,17243,1,1,0),\n(70335,0,17241,1,1,0),\n(70336,0,11466,1,1,0),\n(70351,0,3345,1,1,0),\n(70352,0,1930,1,1,0),\n(70353,0,1469,1,1,0),\n(70354,0,3271,1,1,0),\n(70355,0,4567,1,1,0),\n(70356,0,1581,1,1,0),\n(70357,0,1604,1,1,0),\n(70358,0,1884,1,1,0),\n(70359,0,3745,1,1,0),\n(70360,0,1324,1,1,0),\n(70361,0,1325,1,1,0),\n(70362,0,1326,1,1,0),\n(70363,0,2675,1,1,0),\n(70364,0,2637,1,1,0),\n(70365,0,2646,1,1,0),\n(70366,0,3115,1,1,0),\n(70367,0,3116,1,1,0),\n(70368,0,3122,1,1,0),\n(70369,0,3291,1,1,0),\n(70370,0,3286,1,1,0),\n(70371,0,3607,1,1,0),\n(70372,0,15524,1,1,0),\n(70373,0,16700,1,1,0),\n(70374,0,16787,1,1,0),\n(70375,0,16800,1,1,0),\n(70376,0,16831,1,1,0),\n(70377,0,21604,1,1,0),\n(70401,0,2106,1,1,0),\n(70402,0,2121,1,1,0),\n(70403,0,2115,1,1,0),\n(70404,0,3819,1,1,0),\n(70405,0,10734,1,1,0),\n(70406,0,1732,1,1,0),\n(70407,0,1706,1,1,0),\n(70408,0,2261,1,1,0),\n(70409,0,2250,1,1,0),\n(70410,0,2255,1,1,0),\n(70411,0,3300,1,1,0),\n(70412,0,3301,1,1,0),\n(70413,0,3302,1,1,0),\n(70414,0,7357,1,1,0),\n(70415,0,10738,1,1,0),\n(70416,0,12053,1,1,0),\n(70417,0,16739,1,1,0),\n(70418,0,16858,1,1,0),\n(70451,0,24935,1,1,0),\n(70452,0,26939,1,1,0),\n(70453,0,26854,1,1,0),\n(70454,0,28039,1,1,0),\n(70455,0,26688,1,1,0),\n(70456,0,26195,1,1,0),\n(70457,0,27402,1,1,0),\n(70458,0,27189,1,1,0),\n(70459,0,26217,1,1,0),\n(70460,0,26222,1,1,0),\n(70461,0,28842,1,1,0),\n(70462,0,28837,1,1,0),\n(70463,0,28840,1,1,0),\n(70464,0,25512,1,1,0),\n(70465,0,25500,1,1,0),\n(70501,0,4449,1,1,0),\n(70502,0,1132,1,1,0),\n(70503,0,4162,1,1,0),\n(70504,0,850,1,1,0),\n(70505,0,14255,1,1,0),\n(70506,0,368,1,1,0),\n(70507,0,4312,1,1,0),\n(70508,0,16724,1,1,0),\n(70509,0,8808,1,1,0),\n(70510,0,17562,1,1,0),\n(70511,0,20308,1,1,0),\n(70512,0,17545,1,1,0),\n(70513,0,19405,1,1,0),\n(70514,0,17753,1,1,0),\n(70515,0,15590,1,1,0),\n(70516,0,11319,1,1,0),\n(70517,0,741,1,1,0),\n(70518,0,1220,1,1,0),\n(70519,0,321,1,1,0),\n(70520,0,2714,1,1,0),\n(70521,0,29113,1,1,0),\n(70522,0,17798,1,1,0),\n(70523,0,20790,1,1,0),\n(70524,0,1244,1,1,0),\n(70525,0,809,1,1,0),\n(70526,0,706,1,1,0),\n(70527,0,381,1,1,0),\n(70528,0,1938,1,1,0),\n(70529,0,1250,1,1,0),\n(70530,0,19998,1,1,0),\n(70531,0,11087,1,1,0),\n(70532,0,10810,1,1,0),\n(70533,0,29673,1,1,0),\n(70534,0,12168,1,1,0),\n(70535,0,5239,1,1,0),\n(70536,0,26279,1,1,0),\n(70537,0,13212,1,1,0),\n(70538,0,24994,1,1,0),\n(70538,1,24993,1,1,0),\n(70538,2,24992,1,1,0),\n(70538,3,24995,1,1,0),\n(70542,0,19110,1,1,0),\n(70543,0,21114,1,1,0),\n(70544,0,525,1,1,0),\n(70545,0,18922,1,1,0),\n(70551,0,17659,1,1,0),\n(70552,0,17659,1,1,0),\n(70553,0,15343,0.7,1,0),\n(70554,0,15343,0.7,1,0),\n(70555,0,6769,1,1,0),\n(70556,0,5561,1.3,1,0),\n(70557,0,348,1.2,1,0),\n(70558,0,348,1.2,1,0),\n(70559,0,348,1.2,1,0),\n(70560,0,348,1.2,1,0),\n(70561,0,348,1.2,1,0),\n(70562,0,169,1.5,1,0),\n(70563,0,15511,1.1,1,0),\n(70564,0,15511,1.1,1,0),\n(70565,0,15511,1.1,1,0),\n(70566,0,15511,1.1,1,0),\n(70567,0,15511,1.1,1,0),\n(70568,0,30072,1,1,0),\n(70569,0,30072,1,1,0),\n(70570,0,30072,1,1,0),\n(70571,0,30072,1,1,0),\n(70572,0,30072,1,1,0),\n(70573,0,30363,0.8,1,0),\n(70574,0,30363,0.9,1,0),\n(70575,0,23277,1,1,0),\n(70576,0,23277,1,1,0),\n(70577,0,23277,1,1,0),\n(70578,0,23277,1,1,0),\n(70579,0,23277,1,1,0),\n(70580,0,200,1.1,1,0),\n(70581,0,20748,0.5,1,0),\n(70582,0,20748,0.5,1,0),\n(70583,0,20748,0.5,1,0),\n(70584,0,20748,0.5,1,0),\n(70585,0,20748,0.5,1,0),\n(70586,0,20211,3,1,0),\n(70587,0,27395,0.5,1,0),\n(70588,0,27395,0.5,1,0),\n(70589,0,27395,0.5,1,0),\n(70590,0,27395,0.5,1,0),\n(70591,0,27395,0.5,1,0),\n(70592,0,11094,0.5,1,0),\n(70593,0,11094,0.7,1,0),\n(70594,0,11094,0.9,1,0),\n(70595,0,19252,0.25,1,0);\n"
  },
  {
    "path": "AC/SQL/characters_bots.sql",
    "content": "--\nSET FOREIGN_KEY_CHECKS=0;\n\nDROP TABLE IF EXISTS `characters_npcbot`;\nCREATE TABLE `characters_npcbot` (\n  `entry` int(10) unsigned NOT NULL COMMENT 'creature_template.entry',\n  `owner` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'characters.guid (lowguid)',\n  `roles` smallint(5) unsigned NOT NULL COMMENT 'bitmask: tank(1),dps(2),heal(4),ranged(8)',\n  `faction` int(10) unsigned NOT NULL DEFAULT '35',\n  `equipMhEx` int(10) unsigned NOT NULL DEFAULT '0',\n  `equipOhEx` int(10) unsigned NOT NULL DEFAULT '0',\n  `equipRhEx` int(10) unsigned NOT NULL DEFAULT '0',\n  `equipHead` int(10) unsigned NOT NULL DEFAULT '0',\n  `equipShoulders` int(10) unsigned NOT NULL DEFAULT '0',\n  `equipChest` int(10) unsigned NOT NULL DEFAULT '0',\n  `equipWaist` int(10) unsigned NOT NULL DEFAULT '0',\n  `equipLegs` int(10) unsigned NOT NULL DEFAULT '0',\n  `equipFeet` int(10) unsigned NOT NULL DEFAULT '0',\n  `equipWrist` int(10) unsigned NOT NULL DEFAULT '0',\n  `equipHands` int(10) unsigned NOT NULL DEFAULT '0',\n  `equipBack` int(10) unsigned NOT NULL DEFAULT '0',\n  `equipBody` int(10) unsigned NOT NULL DEFAULT '0',\n  `equipFinger1` int(10) unsigned NOT NULL DEFAULT '0',\n  `equipFinger2` int(10) unsigned NOT NULL DEFAULT '0',\n  `equipTrinket1` int(10) unsigned NOT NULL DEFAULT '0',\n  `equipTrinket2` int(10) unsigned NOT NULL DEFAULT '0',\n  `equipNeck` int(10) unsigned NOT NULL DEFAULT '0',\n  PRIMARY KEY (`entry`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n"
  },
  {
    "path": "AC/SQL/locales/deDE/npc_text_locale.sql",
    "content": "DELETE FROM `npc_text_locale` WHERE `Locale`='deDE' AND `ID` BETWEEN '70000' AND '71000';\nINSERT INTO `npc_text_locale` (`ID`, `Locale`, `Text0_0`, `Text0_1`, `Text1_0`, `Text1_1`, `Text2_0`, `Text2_1`, `Text3_0`, `Text3_1`, `Text4_0`, `Text4_1`, `Text5_0`, `Text5_1`, `Text6_0`, `Text6_1`, `Text7_0`, `Text7_1`)\nVALUES\n('70001','deDE','Ich lebe nur um dem Meister zu dienen.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70002','deDE','Brauchst du etwas?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70003','deDE','Sterbliche... Normalerweise töte ich Abschaum wie euch auf den ersten Blick.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70004','deDE','<Du siehst etwas, das ein Obsidian-Zerstörer sein soll. Dieser sieht jedoch anders aus, beschädigt und verblasst, und er reagiert nicht auf deine Anwesenheit. Du erinnerst dich, dass die Geißel irgendwann in der Vergangenheit ihre eigenen Versionen davon benutzt haben. Wie zum Teufel ist es hierher gekommen? Nach einer weiteren Untersuchung bemerkst du eine Öffnung auf dem Rücken der Kreatur.>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70005','deDE','<Obsidischan-Zerstörer starrt dich an und gibt ein leises Knurren von sich.>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70006','deDE','Bist du überrascht, Sterblicher? Als unbedeutenderer Nathrezim muss ich mir Verbündete suchen. Du siehst aus, als könntest du mich zumindest unterhalten.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70007','deDE','Was ist es diesmal, Sterblicher?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70008','deDE','Kannst du mich einfach in Ruhe lassen? <seufz>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70009','deDE','Was nun?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70010','deDE','<Du siehst eine ausgemergelte Naga-Matrone. Sie sieht müde und schwach aus und vermeidet es, dich anzusehen.>$B$BS-s-s-spare die Worte, Sterblicher...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70011','deDE','Habe ich wieder meine Haare durcheinander gebracht? <Sie bürstet ihr \"Haar\">$B...Nein, habe ich nicht. Was ist es dann?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70012','deDE','<Der vom Kampf vernarbte Gruftlord steht vor dir, er ist offensichtlich unkontrolliert. Ohne seinen Meister hat dieser mächtige untote nerubische Fürst den größten Teil seiner Macht verloren>$B$BWas wird es sein, kleine Kreatur? Dein Fleisch wird wie jedes andere sein...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70013','deDE','Ich verzehre die Lebenden und die Toten.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70101','deDE','|cffff3300Klingenmeister|r$b|cffdd6600-=Warcraft III Tribut=-|r$B$B \"Ein Elite-Schwertkämpfer, ehemaliges Mitglied des Clans der Brennenden Klinge, jetzt ein Elite-Kämpfer der Horde\".$B$BHauptattribut: Beweglichkeit.$B$BNetherlauf (Windlauf). Ermöglicht es dem Blademaster, unsichtbar zu werden und sich für eine bestimmte Zeit schneller zu bewegen. Wenn der Klingenmeister eine Einheit angreift, um die Unsichtbarkeit zu durchbrechen, verursacht er zusätzlichen Schaden.$B$BSpiegelbild. Verwirrt den Feind, indem er Illusionen des Klingenmeisters erzeugt und alle auf den Klingenmeister wirkende Zauber bannt.$B$BKritischer Schlag (passiv). Gewährt eine 15%ige Chance, mit seinen Angriffen das 2(3,4)-fache des normalen Schadens als kritisch zu verursachen.$B$BKlingensturm (NYI). Gewährt Immunität gegen Magie und fügt allen umstehenden Feinden Schaden zu.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70102','deDE','|cff9900ccObsidian Zerstörer|r$b|cffdd6600-=Warcraft III Tribut=-|r$B$B \"Ein geflügeltes Monstrum aus Obsidian mit unstillbarem Hunger nach Magie\". $B$BHohe Rüstung, sehr hohe Resistenzen, teilweise immun gegen Magie, verliert mit der Zeit Mana und profitiert nicht von passiven Manaregenerationseffekten, Kettenhemd/Plattenrüstung, zwei Zauberstäbe, verursacht Schattenzauber-Schaden, kein physischer Angriff, kann keine Gegner angreifen, die sich nicht in der Nähe befinden, während er sich bewegt, Zauberkraft-Bonus: 50% Angriffskraft + 200% Intellekt + Zauberstab-Schaden.$B$BMagie verschlingen. Entfernt bis zu 2 magische Effekte von Gegnern, bis zu 2 magische Effekte und bis zu 2 Flüche von Verbündeten und Schaden verursachende beschworene Einheiten im Umkreis von 20 Metern. Jeder gebannte Effekt stellt 20% Mana und 5% Gesundheit wieder her, 7 Sekunden Abklingzeit.$B$BSchattenschlag. Verstärkter Angriff, der erhöhten Splash-Schaden verursacht.$B$BMana entziehen. Entzieht einer zufälligen befreundeten Einheit das gesamte Mana (begrenzt durch den Manapool des Zaubernden).$B$BMana auffrischen. Versorgt umstehende Gruppen- und Schlachtzugsmitglieder im Umkreis von 25 Metern mit 3% ihres maximalen Manas, wobei das Mana des Zaubernden annulliert wird, 3 Sekunden Abklingzeit.$B$BRegenerierende Aura. Heilt Gruppen- und Schlachtzugsmitglieder im Umkreis von 25 Metern um 3% ihrer maximalen Gesundheit und macht das Mana des Zaubernden zunichte, 3 Sekunden Abklingzeit.$B$BSchattenrüstung (passiv). Stellt Mana in Höhe eines Prozentsatzes des erlittenen Schadens wieder her.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70103','deDE','|cff0000ddErzmagier|r$b|cffdd6600-=Warcraft III Tribut=-|r$B$BSZauberschaden um 35% reduziert, teilweise immun gegen Kontrolleffekte, Stoffrüstung, verursacht Feuerzauber/Frostzauber Schaden, kein physischer Angriff, Zaubermachtbonus: 100% Intelligenz. Hauptattribut: Intelligenz.$B$BBlizzard. Ein typischer Blizzard, nur etwas mächtiger, 6 Sekunden Abklingzeit.$B$BWasserelementar beschwören. Beschwört ein Wasserelementar, das die Feinde des Erzmagiers 1 Minute lang angreift, 20 Sekunden Abklingzeit.$B$BBrillianz Aura. Erhöht das maximale Mana um 10% und erhöht die Manaregeneration von Gruppen- und Schlachtzugsmitgliedern im Umkreis von 40 Metern erheblich.$B$BMassenteleport. NYI.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70104','deDE','|cff9900ccSchreckenslord|r$b|cffdd6600-=Warcraft III Tribut=-|r$B$B\"|Unglaublich mächtiger Dämon, der die Macht der Finsternis und geistige Beherrschung ausübt\".$B$BHohe Rüstung, hohe Resistenzen, teilweise immun gegen Kontrolleffekte, erlittener Schaden beschleunigt die Wiederaufladung von Zaubern, Plattenrüstung, verursacht Nahkampf-/Schattenzauberschaden, Bonusschaden gegen kampfunfähige Ziele, Bonus auf Zaubermacht: 200% Stärke. Hauptattribut: Stärke.$B$BAasschwarm. Schickt eine Horde Fledermäuse in Kombination mit Chaos Magie, um Gegnern in einem sehr großen Frontalkegel Schaden zuzufügen, kann nicht kritisch sein, 10 Sekunden Abklingzeit.$B$BSchlaf. Versetzt das gegnerische Ziel für 60 Sekunden in Schlaf und ermöglicht es, dass der nächste physische Angriff auf dieses Ziel die Rüstung umgeht, direkter verursachter Schaden weckt das Ziel auf, 6 Sekunden Abklingzeit.$B$BVampirische Aura. Erhöht physischen kritischen Schaden um 5% und heilt Gruppen- und Schlachtzugsmitglieder im Umkreis von 40 Metern um einen bestimmten Prozentsatz (100% für den Schreckenslord und 25% für alle anderen) des durch physische Nahkampfangriffe und Aasschwarm verursachten Schadens, keine Bedrohung.$B$BSBeschwörung eines Höllendieners. Ruft einen Höllendiener vom Himmel, der Schaden verursacht und gegnerische Einheiten betäubt. Der Höllendiener ist sehr resistent gegen Magie und hält 180 Sekunden lang, 180 Sekunden Abklingzeit.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70105','deDE','|cff0000ddZauberbrecher|r$b|cffdd6600-=Warcraft III Tribut=-|r$B$B\"Ein elfischer Krieger, der darauf trainiert ist, magische Energien zu unterbrechen und zu verzerren\".$B$BSZauberschaden um 75% reduziert, teilweise immun gegen Kontrolleffekte, Rüstungsabzug -30%, Ketten-/Panzerrüstung, verursacht Nahkampf-/Arkanschaden, Zaubermachtbonus: 200% Stärke. Hauptattribut: Stärke.$B$BMagie stehlen (Zauberraub). Stiehlt einem Feind einen nützlichen Zauber und wendet ihn auf einen Verbündeten in der Nähe an oder entfernt einen negativen Zauber von einem Verbündeten und wendet ihn auf einen Feind in der Nähe an, wirkt auf Magie- und Fluch-Effekte, 2 Sekunden Abklingzeit.$B$BRückkopplung (passiv). Erfolgreiche Nahkampfangriffe verbrennen das Mana des Ziels in Höhe des verursachten Schadens (erhöht durch Zaubermacht) und verursachen arkanen Schaden. Wenn das Mana des Ziels aufgebraucht ist, verursachen die Nahkampfangriffe von Zauberbrecher dreifachen Schaden mit erhöhter Chance auf einen kritischen Treffer. Wenn das Ziel kein Mana hat, erhält der Zauberbrecher Mana in Höhe von 25% des verursachten Schadens.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70106','deDE','|cff9900ccDunkler Waldläufer|r$b|cffdd6600-=Warcraft III Tribut=-|r$B$B\"Ein ehemaliger Waldläufer von Quel Thalas, der gewaltsam von den Toten auferweckt wurde.\"$B$BSZauberschaden um 35% reduziert, untot, teilweise immun gegen Kontrolleffekte, Leder-/Stoffrüstung, verursacht physischen/zauberhaften Schattenschaden, haftet an Schatten und stellt keine Bedrohung dar, Zauberkraftbonus: 50% Intelligenz. Hauptattribut: Beweglichkeit.$B$BStille. Bringt einen Gegner und bis zu 4 Ziele in der Nähe 8 Sekunden lang zum Schweigen, 15 Sekunden Abklingzeit.$B$BBSchwarzer Pfeil. Feuert einen verfluchten Pfeil ab, der 150% Waffenschaden und zusätzlichen Schattenzauberschaden über Zeit verursacht. Wenn das betroffene Ziel durch den Schaden des dunklen Waldläufers stirbt, spawnen aus der Leiche dunkle Schergen (maximal 5 Schergen, 80 Sekunden Dauer, funktioniert nur bei Humanoiden, Bestien und Drachenkin). Verursacht fünfmal mehr Schaden, wenn das Ziel weniger als 20% Gesundheit hat.$B$BLebensentzug. Entzieht einem Feind 5 Sekunden lang jede Sekunde Leben und heilt den dunklen Waldläufer für 200% der entzogenen Menge.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70107','deDE','|cff9900ccTotenbeschwörer|r$b|cffdd6600-=Warcraft III / Diablo II Tribut=-|r$B$BSZauberschaden um 20% reduziert, teilweise immun gegen Kontrolleffekte, Stoffrüstung, verursacht Zauberschattenschaden, kein physischer Angriff, Zaubermachtbonus: 100% Intelligenz. Hauptattribut: Intelligenz.$B$BRaise Dead. Erweckt 2 Skelette aus einer Leiche (maximal 6 Skelette, 65 Sekunden Dauer, funktioniert nur bei Humanoiden, Bestien und Drachenkin).$B$BUnheilige Raserei. Erhöht das Nahkampfangriffstempo des Ziels um 75%, entzieht ihm aber ständig Lebenspunkte. Hält 45 Sekunden lang an. Kann nicht abgebrochen werden. Wird auf Stufe 30 freigeschaltet.$B$BCorpse Explosion. Lässt eine Leiche explodieren und fügt allen umstehenden Gegnern Schaden in Höhe von 35% bis 75% der maximalen Lebenspunkte der toten Einheit zu (abhängig von der Stufe des Nekromanten). Dieser Schaden erzeugt keine Bedrohung. Wird auf Stufe 40 freigeschaltet.$B$BCVerkrüppeln. Verringert das Bewegungstempo, das Nahkampfangriffstempo und die Gesamtstärke des Ziels 60 Sekunden lang um 50%. Wird auf Stufe 50 freigeschaltet.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70108','deDE','|cff0000ddMeereshexe|r$b|cffdd6600-=Warcraft III Tribut=-|r$B$B\"Eine bösartige, schuppige Meeresbewohnerin, die oft mit dem Aufkommen gewaltiger Stürme in Verbindung gebracht wird.\" $B$BSZauberschaden um 30% reduziert, teilweise immun gegen Kontrolleffekte, Stoffrüstung, verursacht physischen Schaden, Zauberfrost und Zaubersturm, Angriffskraftbonus: Beweglichkeit x2, Zauberkraftbonus: 200% Intelligenz. Hauptattribut: Intelligenz.$B$BGabelblitzschlag. Ruft einen Blitzkegel herbei, um Feinden Schaden zuzufügen. Trifft 2 bis alle Ziele (je nach Stufe der Meerhexe) und betäubt sie 2 Sekunden lang. Dieser Schaden erzeugt keine Bedrohung.$B$BFrostpfeile. Durchtränkt Pfeile mit Frostzauber für zusätzlichen Schaden und verlangsamt die Bewegungs-, Angriffs- und Wirkgeschwindigkeit des Ziels um 30% bis 70% (abhängig von der Stufe der Meereshexe).$B$BMana-Schild. Erzeugt einen Schild, der 100% des eingehenden (nicht gemilderten) Schadens absorbiert, indem er das Mana der Meerhexe verwendet. Die Wirkung reicht von 1 Schaden pro 10 Mana bis 10 Schaden pro 1 Mana (je nach Stufe der Meereshexe).$B$BTornado. Beschwört einen heftigen Tornado, der gegnerische Einheiten in der Nähe beschädigt und verlangsamt, manchmal sogar komplett außer Gefecht setzt. Der Tornado wächst im Freien mit der Zeit und erhöht den verursachten Schaden und den Wirkungsbereich, schrumpft aber in geschlossenen Räumen und löst sich schnell auf. Wird auf Stufe 60 freigeschaltet.$B$BNaga (Passiv). Schwimmgeschwindigkeit, Schaden und Ausweichchance werden im Wasser stark erhöht.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70109','deDE','|cff9900ccGruftlord|r$b|cffdd6600-=Warcraft III Tribut=-|r$B$B\"Uraltes Ungetüm, einst einer der Könige von Azjol-Nerub, jetzt ein untotes Monster in den Reihen der mächtigsten Krieger des Lichkönigs\".$B$BSehr hohe Rüstung, erhöhte Resistenzen, teilweise immun gegen Steuerungseffekte, immun gegen Gifteffekte, Kettenhemd/Plattenrüstung, verursacht Nahkampf-/Zauberschattenschaden, Zauberkraftbonus: 200% Stärke. Hauptattribut: Stärke.$B$BImpale. Der Gruftlord schlägt mit seinen massiven Klauen auf den Boden und schießt Stacheln in einem frontalen Kegel aus, die Schaden verursachen und feindliche Einheiten in die Luft schleudern, um sie zu betäuben. Wird auf Stufe 20 freigeschaltet.$B$BSpitzenpanzer. Der Chitinpanzer des Crypt Lords erhöht die Schadensresistenz und fügt gegnerischen Nahkämpfern 15% bis 50% Schaden zu.$B$BAaskäfer. Der Gruftlord generiert aus der frischen Leiche eines Feindes einen Aaskäfer, der seine Feinde angreift. Die Käfer sind permanent, regenerieren aber keine Gesundheit und es können nur 6 gleichzeitig kontrolliert werden. Höhere Stufen erlauben es dem Gruftlord, mächtigere Käfer zu beschwören. Wird auf Stufe 10 freigeschaltet.$B$BLKäferschwarm. Der Gruftlord lässt einen Schwarm von 20-40 (hängt von der Stufe des Crypt Lords ab) wütenden Heuschrecken frei, die in der Nähe befindliche feindliche Einheiten beißen und zerreißen, wodurch deren Bewegungs- und Angriffsfähigkeit eingeschränkt wird. Während sie das gegnerische Fleisch verzehren, wandeln sie es in eine Substanz um, die dem Gruftlord bei seiner Rückkehr Trefferpunkte zurückgibt. Wird auf Stufe 40 freigeschaltet.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70201','deDE','Es gibt immer Leute, die bereit sind, für Geld zu töten.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70202','deDE','Söldner sind immer gefragt. Hier ist, was im Moment verfügbar ist:',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70203','deDE','Söldner sind immer gefragt. Hier ist, was im Moment verfügbar ist:',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70204','deDE','Im Moment scheint niemand verfügbar zu sein, schauen Sie später noch einmal nach.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70300','deDE','Stirb!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70301','deDE','Belebe dich wieder',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70302','deDE','Wiederbelebe  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70303','deDE','dein bot',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70304','deDE',' Bot',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70305','deDE','Ich kann noch kein Wasser herbeizaubern',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70306','deDE','Ich kann noch kein Essen herbeizaubern',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70307','deDE','Ich kann das jetzt nicht tun',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70308','deDE','Bitte sehr...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70309','deDE','Deaktiviert',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70310','deDE','Noch nicht bereit',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70311','deDE','Ungültiger Objekttyp',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70312','deDE','Fehlgeschlagen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70313','deDE','Erledigt',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70314','deDE','Ich bin nicht gestaltgewandelt',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70315','deDE','Ich habe keinen Gesundheitsstein',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70316','deDE','Ich kann noch keine Gesundheitssteine erstellen!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70317','deDE','WTF Ich kann keine Schlösser knacken!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70318','deDE','Mein Fähigkeitslevel ist nicht hoch genug',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70319','deDE','Ich ändere meine Talente zu ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70320','deDE','Waffen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70321','deDE','Furor',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70322','deDE','Schutz',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70323','deDE','Vergeltung',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70324','deDE','Tierherrschaft',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70325','deDE','Treffsicherheit',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70326','deDE','Überleben',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70327','deDE','Meucheln',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70328','deDE','Kampf',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70329','deDE','Täuschung',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70330','deDE','Disziplin',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70331','deDE','Heilig',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70332','deDE','Schatten',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70333','deDE','Blut',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70334','deDE','Frost',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70335','deDE','Unheilig',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70336','deDE','Elementar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70337','deDE','Verstärkung',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70338','deDE','Wiederherstellung',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70339','deDE','Arkan',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70340','deDE','Feuer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70341','deDE','Gebrechen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70342','deDE','Dämonologie',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70343','deDE','Zerstörung',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70344','deDE','Gleichgewicht',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70345','deDE','Widlheit',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70346','deDE','Unbekannt',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70347','deDE','Verschwinde, Schwächling',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70348','deDE',' ist nicht überzeugt',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70349','deDE','Ich werde meine Zeit nicht mit irgendetwas verschwenden.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70350','deDE','NYI',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70351','deDE','NYI',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70352','deDE','NYI',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70353','deDE','Ich bin bereit',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70354','deDE','Geh weg. Ich diene meinem Herrn  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70355','deDE','unbekannt',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70356','deDE',' auf dich!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70357','deDE',' auf mich!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70358','deDE',' auf ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70359','deDE',' benutzt!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70360','deDE','bot tank',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70361','deDE','Klasse',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70362','deDE','Spieler',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70363','deDE','Meister',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70364','deDE','nichts',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70365','deDE','Rang',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70366','deDE','Talent',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70367','deDE','Passiv',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70368','deDE','versteckt',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70369','deDE','bekannt',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70370','deDE','Fähigkeit',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70371','deDE','Str',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70372','deDE','Bew',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70373','deDE','Aus',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70374','deDE','Int',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70375','deDE','Wil',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70376','deDE','unk stat',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70377','deDE','Gesamt',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70378','deDE','Nahkampf AP',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70379','deDE','Distanz AP',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70380','deDE','Rüstung',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70381','deDE','Krit',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70382','deDE','Verteidigung',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70383','deDE','Verfehlen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70384','deDE','Ausweichen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70385','deDE','Parrieren',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70386','deDE','Blocken',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70387','deDE','Blockwert',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70388','deDE','Schaden erhalten Nahkampf',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70389','deDE','Schaden erhalten Zauber',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70390','deDE','Schadensreichweite Waffenhand',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70391','deDE','Schadensmultiplikator Waffenhand',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70392','deDE','Angriffszeit Waffenahnd',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70393','deDE','Schadensreichweite Schildhand',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70394','deDE','Schadensmultiplikator Schildhand',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70395','deDE','Angriffszeit Schildhand',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70396','deDE','Schadensreichweite Distanz',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70397','deDE','SchadensmultiplikatorDistanz',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70398','deDE','Angriffszeit Distanz',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70399','deDE','min',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70400','deDE','max',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70401','deDE','DPS',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70402','deDE','Grundlegende HP',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70403','deDE','Gesamt HP',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70404','deDE','Grundlegendes Mana',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70405','deDE','Gesamt Mana',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70406','deDE','Aktuelles Mana',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70407','deDE','Zaubermacht',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70408','deDE','Leben alle 5 Sekunden bonus',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70409','deDE','Mana alle 5 Sekunden ohne Zaubern',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70410','deDE','Mana alle 5 Sekunden beim Zaubern',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70411','deDE','Tempo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70412','deDE','Trefferwertung',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70413','deDE','Waffenkunde',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70414','deDE','Rüstungsdurchschlag',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70415','deDE','Zauberdurchschlag',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70416','deDE','%',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70417','deDE','Heilig',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70418','deDE','Feuer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70419','deDE','Natur',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70420','deDE','Frost',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70421','deDE','Schatten',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70422','deDE','Arkan',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70423','deDE','Resistenz',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70424','deDE','Befehlszustand',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70425','deDE','Folgen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70426','deDE','Angreifen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70427','deDE','Warten',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70428','deDE','Zurücksetzen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70429','deDE','Vollständig stoppen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70430','deDE','Folgeabstand',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70431','deDE','Spezifikation',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70432','deDE','Hauptaufgabe des Bots',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70433','deDE','Bot Sammelrolle',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70434','deDE','PvP Tötungen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70435','deDE','Spieler',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70436','deDE','Gestorben ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70437','deDE',' mal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70438','deDE','%s (Bot) beruhigt sich wieder',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70439','deDE','<Debug>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70440','deDE','Bist du sicher, dass du es riskieren willst  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70441','deDE',' Aufmerksamkeit?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70442','deDE','<Geld einwerfen>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70443','deDE','Möchtest du anlocken ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70444','deDE','<Versuche ein Angebot zu machen>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70445','deDE','Möchtest du folgendes anheuern ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70446','deDE','<Bot anheuern>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70447','deDE','Ausrüstung verwalten...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70448','deDE','Rollen verwalten...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70449','deDE','Formation verwalten...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70450','deDE','Fähigkeiten verwalten...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70451','deDE','Talente verwalten...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70452','deDE','Verbrauchsgüter geben...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70453','deDE','<Gruppe erstellen>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70454','deDE','<Gruppe erstellen (alle Bots)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70455','deDE','<Zur Gruppe hinzufügen>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70456','deDE','<Alle Bots zur Gruppe hinzufügen>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70457','deDE','<Aus der Gruppe entfernen>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70458','deDE','Folge mir',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70459','deDE','Halte deine Position',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70460','deDE','Bleibe hier und tue nichts',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70461','deDE','Ich brauche Essen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70462','deDE','Ich brauche was zu trinken',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70463','deDE','Ich brauche einen gedeckten Tisch',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70464','deDE','Hilf mir ein Schloss zu knacken',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70465','deDE','Ich brauche einen Gesundheitsstein',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70466','deDE','Ich brauche einen Seelenbrunnen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70467','deDE','Frische deine Gifte auf',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70468','deDE','<Gift auswählen (Waffenhand)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70469','deDE','<Gift auswählen (Schildhand)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70470','deDE','Ich möchte Verzauberungen erneuern',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70471','deDE','<Verzauberung auswählen (Waffenhand)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70472','deDE','<Verzauberung auswählen (Schildhand)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70473','deDE','Entferne deine Gestaltwandlung',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70474','deDE','<Haustierart auswählen>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70475','deDE','Du bist entlassen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70476','deDE','Willst du aufgeben ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70477','deDE','Du wirst es vielleicht bereuen...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70478','deDE','Reiß dich zusammen, verdammt noch mal!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70479','deDE','<Studiere die Kreatur>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70480','deDE','Vergiss es',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70481','deDE','Distanz',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70482','deDE','ZURÜCK',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70483','deDE','<Automatisch>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70484','deDE','<Nichts>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70485','deDE','Zufällig (Gerissenheit)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70486','deDE','Zufällig (Wildheit)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70487','deDE','Zufällig (Zähigkeit)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70488','deDE','Zeig mir deine Ausrüstung',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70489','deDE','Automatisch anlegen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70490','deDE','Waffenhand',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70491','deDE','Schildhand',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70492','deDE','Distanz',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70493','deDE','Relikt',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70494','deDE','Kopf',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70495','deDE','Schultern',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70496','deDE','Brust',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70497','deDE','Tailie',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70498','deDE','Beine',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70499','deDE','Füße',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70500','deDE','Handgelenke',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70501','deDE','Hände',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70502','deDE','Rücken',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70503','deDE','Hemd',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70504','deDE','Finger 1',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70505','deDE','Finger 2',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70506','deDE','Schmuck 1',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70507','deDE','Schmuck 2',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70508','deDE','Hals',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70509','deDE','Alles ablegen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70510','deDE','Ausrüstung aktualisieren (nur Visuell)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70511','deDE','nur Visuell',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70512','deDE','Ausgerüstet',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70513','deDE','nichts',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70514','deDE','Verwende deine alte Ausrüstung',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70515','deDE','Ablegen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70516','deDE','Hm... Ich habe nichts, was ich dir geben könnte.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70517','deDE','Sammeln',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70518','deDE','Fähigkeiten Status',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70519','deDE','Erlaubte Fähigkeiten verwalten',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70520','deDE','Benutze ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70521','deDE','Aktualisieren',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70522','deDE','Schaden',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70523','deDE','Kontrolle',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70524','deDE','Heiler',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70525','deDE','Anderes',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70526','deDE',' macht ein knirschendes Geräusch und beginnt zu folgen  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70527','deDE','%s wird sich dir erst anschließen, wenn sein Besitzer ihn entlässt',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70528','deDE','%s wird sich dir erst anschließen, wenn du Stufe 60 erreicht hast.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70529','deDE','%s wird sich dir erst anschließen, wenn du Stufe 55 erreicht hast.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70530','deDE','%s wird sich dir erst anschließen, wenn du Stufe 40 erreicht hast.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70531','deDE','%s wird sich dir erst anschließen, wenn du Stufe 20 erreicht hast.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70532','deDE','Du hast die maximale Anzahl an Npcbots für dein Level überschritten (%u)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70533','deDE','Sie haben nicht genug Geld',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70534','deDE','Du kannst nicht mehr Bots dieser Klasse haben! %u von %u',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70535','deDE','Ausrüstung in Slot %u (%s) kann nicht zurückgesetzt werden! Bot kann nicht entlassen werden!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70536','deDE','aktuell',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70537','deDE','Angriffsdistanz',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70538','deDE','Angriffe aus kurzer Entfernung',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70539','deDE','Angriffe aus großer Entfernung',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70540','deDE','Exakt',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70541','deDE','Buff entfernen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70542','deDE','Lege deinen Krafttyp fest',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70543','deDE','Kann %s aus irgendeinem dummen Grund nicht ausrüsten! Versenden per Post',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70544','deDE','Tank',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70545','deDE','Distanz',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70546','deDE','Bergbauer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70547','deDE','Kräuterkundler',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70548','deDE','Kürschner',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70549','deDE','Ingenieur',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70550','deDE','Besitz des Bots abgelaufen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70551','deDE','Das NpcBot-System ist derzeit deaktiviert. Bitte kontaktiere die Administration.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70552','deDE','%s wird sich Ihnen nicht anschließen, hat bereits einen Meister: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70553','deDE','%s kann Ihnen nicht beitreten, wenn Sie sich teleportieren wollen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70554','deDE','Aspekt',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70555','deDE','des Affen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70556','deDE','des Falken',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70557','deDE','des Geparden',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70558','deDE','der Viper',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70559','deDE','des Wildtiers',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70560','deDE','des Rudels',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70561','deDE','der Wildnis',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70562','deDE','des Drachenfalken',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70563','deDE','kein Aspekt',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70564','deDE','Aura',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70565','deDE','der Hingabe',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70566','deDE','der Konzentration',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70567','deDE','des Feuerwiderstands',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70568','deDE','des Frostwiderstands',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70569','deDE','des Schattenwiderstands',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70570','deDE','der Vergeltung',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70571','deDE','des Kreuzfahrers',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70572','deDE','Keine Aura',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70573','deDE','Verkrüppelndes Gift',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70574','deDE','Sofort wirkendes Gift',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70575','deDE','Tödliches Gift',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70576','deDE','Wundgift',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70577','deDE','Gedankenbenebelndes Gift',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70578','deDE','Narkotisierendes Gift',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70579','deDE','Nichts',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70580','deDE','Flammenzunge',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70581','deDE','Frostbrand',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70582','deDE','Windzorn',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70583','deDE','Lebensgeister',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70584','deDE','Ich brauche deine Dienste',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70585','deDE','Du hast zuviele Bots',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70586','deDE','Möchtest du diesen Bot anheuern? ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70587','deDE',' ist im Moment etwas beschäftigt, versuchen Sie es später noch einmal.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70588','deDE','Ein Vergnügen, mit Ihnen Geschäfte zu machen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70589','deDE','Krieger',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70590','deDE','Paladine',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70591','deDE','Magier',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70592','deDE','Priester',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70593','deDE','Hexenmeister',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70594','deDE','Druiden',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70595','deDE','Todesritter',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70596','deDE','Schurken',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70597','deDE','Schamanen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70598','deDE','Jäger',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70599','deDE','Klingenmeister',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70600','deDE','Zerstörer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70601','deDE','Erzmagier',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70602','deDE','Schreckenslords',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70603','deDE','Zauberbrecher',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70604','deDE','Dunkle Waldläufer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70605','deDE','Krieger',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70606','deDE','Paladin',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70607','deDE','Magier',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70608','deDE','Priester',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70609','deDE','Hexenmeister',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70610','deDE','Druide',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70611','deDE','Todesritter',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70612','deDE','Schurke',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70613','deDE','Schamane',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70614','deDE','Jäger',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70615','deDE','Klingenmeister',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70616','deDE','Zerstörer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70617','deDE','Erzmagier',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70618','deDE','Schreckenslord',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70619','deDE','Zauberbrecher',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70620','deDE','Dunkler Waldläufer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70621','deDE','Männlich',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70622','deDE','Weiblich',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70623','deDE','Mensch',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70624','deDE','Orc',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70625','deDE','Zwerg',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70626','deDE','Nachtelf',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70627','deDE','Untote',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70628','deDE','Tauren',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70629','deDE','Gnom',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70630','deDE','Troll',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70631','deDE','Blutelf',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70632','deDE','Draenei',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70633','deDE','Unbekannt',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70634','deDE','Plündern',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70635','deDE','|cff9d9d9dSchlecht|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70636','deDE','|cffffffffGewöhnlich|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70637','deDE','|cff1eff00Außergewöhnlich|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70638','deDE','|cff0070ddSelten|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70639','deDE','|cffa335eeEpisch|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70640','deDE','|cffff8000Legendär|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70641','deDE','Kampfbeginn verhalten',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70642','deDE','Verzögerung des Angriffs um',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70643','deDE','Verzögerung der Heilung um',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70644','deDE','s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70645','deDE','Off-Tank',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70646','deDE','Totenbeschwörers',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70647','deDE','Totenbeschwörer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70648','deDE','Angriffswinkel',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70649','deDE','Normal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70650','deDE','Frontales AOE vermeiden',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70651','deDE','NYI',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70652','deDE','Bist du sicher, dass das klappt? Es sollte besser das beste Wasser der Welt sein...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70653','deDE','Es scheint, als könnten Sie wirklich einen Schluck frisches Wasser gebrauchen.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70654','deDE','Meereshexes',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70655','deDE','Meereshexe',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70656','deDE','Mana pro Schaden',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70657','deDE','Schaden pro Mana',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70658','deDE','TransfiguTransmogrifikation...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70659','deDE','Kampfpositionierung DEAKTIVIEREN',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70660','deDE','Vorrangiges Ziel',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70661','deDE','Bot Ausrüstungsbank...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70662','deDE','Gegenstände einlagern...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70663','deDE','Gegenstände entnehmen...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70664','deDE','Bank ist leer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70665','deDE','Vorherige Seite',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70666','deDE','Nächste Seite',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70667','deDE','Willst du wirklich so viel Geld ausgeben, damit der Gruftlord sich wieder bewegt?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70668','deDE','Ich bezweifle, dass ihr in eurem jetzigen Zustand viel Schaden anrichten könnt, aber ich bin bereit, euch zu führen und euch dabei zu helfen, eure Kräfte wiederherzustellen.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70669','deDE','Gruftlords',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70670','deDE','Gruftlord',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70671','deDE','Reflektieren',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70672','deDE','Heuschrecken',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70673','deDE','Gesundheitsschwelle des Ziels heilen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70674','deDE','Ich benötige ein Portal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70675','deDE','Sturmwind',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70676','deDE','Eisenschmiede',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70680','deDE','Unterstadt',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70681','deDE','Donnerfels',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70682','deDE','Silbermond',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70683','deDE','Shattrath',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70684','deDE','Dalaran',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70685','deDE','Du überschreitest die maximale Anzahl an NPC‑Bots für deinen Account ({} >= {})',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70686','deDE','<Für alle Bots festlegen>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70687','deDE','(Ausrüstungsbank)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70688','deDE','Nicht genug Platz in der Ausrüstungsbank, um %u Gegenstand(‑e) zu lagern (%u / %u)!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70689','deDE','Ausrüstungs‑Sets',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70690','deDE','Erstellen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70691','deDE','Löschen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70692','deDE','Ausrüsten',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70693','deDE','fehlt',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);\n"
  },
  {
    "path": "AC/SQL/locales/esES/npc_text_locale.sql",
    "content": "DELETE FROM `npc_text_locale` WHERE `Locale`='esES' AND `ID` BETWEEN '70000' AND '71000';\nINSERT INTO `npc_text_locale` (`ID`, `Locale`, `Text0_0`, `Text0_1`, `Text1_0`, `Text1_1`, `Text2_0`, `Text2_1`, `Text3_0`, `Text3_1`, `Text4_0`, `Text4_1`, `Text5_0`, `Text5_1`, `Text6_0`, `Text6_1`, `Text7_0`, `Text7_1`)\nVALUES\n('70001','esES','Vivo solo para servir a mi dueño.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70002','esES','¿Necesitas algo?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70003','esES','Mortales... normalmente mato a miserables como tú a la vista.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70004','esES','<Ves lo que se supone que es un destructor de obsidiana. Sin embargo, este se ve diferente, dañado y descolorido, y no reacciona a tu presencia. Recuerdas que la Plaga ha estado usando sus propias versiones de esos en algún momento en el pasado. ¿Cómo diablos terminó aquí? Después de un examen más detallado, notas una abertura en la espalda de la criatura.>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70005','esES','<El Destructor de obsidiana te mira fijamente y emite un gruñido bajo.>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70006','esES','¿Estás sorprendido, mortal? Como nathrezim menor, tengo que recurrir a buscar aliados. Parece que podrías divertirme al menos.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70007','esES','¿Qué pasa ahora, mortal?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70008','esES','¿Puedes dejarme en paz? <suspiro>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70009','esES','¿Ahora que?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70101','esES','|cffff3300Blademaster|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\"An elite swordsman, former member of Burning Blade clan, now an elite fighter within the Horde\".$B$BMain attribute: Agility.$B$BNetherwalk (Windwalk). Allows Blademaster to become invisible, and move faster for a set amount of time. When the Blademaster attacks a unit to break invisibility, he will deal bonus damage.$B$BMirror Image. Confuses the enemy by creating illusions of the Blademaster and dispelling all magic from the Blademaster.$B$BCritical Strike (passive). Gives a 15% chance to deal critical x2(x3,x4) times normal damage on his attacks.$B$BBladestorm (NIY). Grants immunity to magic and deals damage to all surrounding enemies.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70102','esES','|cff9900ccObsidian Destroyer|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\"An obsidian winged monstrocity with insatiable hunger for magic\".$B$BHigh armor, very high resistances, partially immune to magic, loses mana over time and doesnt benefit from passive mana regeneration effects, mail/plate armor, dual-wielding wands, deals spellshadow damage, no physical attack, cannot attack enemies not in front while moving, spell power bonus: 50% attack power + 200% intellect + wands damage.$B$BDevour Magic. Dispels up to 2 magic effects from enemies, up to 2 magic effects and up to 2 curses from allies and damaging summoned units in 20 yards area. Every dispelled effect restores 20% mana and 5% health, 7 seconds cooldown.$B$BShadow Blast. Empowered attack that deals increased splash damage.$B$BDrain Mana. Drains all mana (limited by casters mana pool) from a random friendly unit.$B$BReplenish Mana. Energizes surrounding party and raid members within 25 yards for 2% of their maximum mana nullifying casters mana, affects up to 10 targets, 3 seconds cooldown.$B$BRegenerating Aura. Heals surrounding party and raid members within 25 yards for 3% of their maximum health nullifying casters mana, affects up to 10 targets, 3 seconds cooldown.$B$BShadow Armor (passive). Restores mana equal to a percentage of damage taken.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70103','esES','|cff0000ddArchmage|r$b|cffdd6600-=Warcraft III tribute=-|r$B$BSpell damage taken reduced by 35%, partially immune to control effects, cloth armor, deals spellsfire/spellfrost damage, no physical attack, spell power bonus: 100% intellect. Main attribute: Intellect.$B$BBlizzard. Your typical blizzard, just a little more powerful, 6 seconds cooldown.$B$BSummon Water Elemental. Summons a water elemental to attack archmage enemies for 1 min, 20 seconds cooldown.$B$BBrilliance Aura. Increases maximum mana by 10% and greatly increases mana regeneration of party and raid members within 40 yards.$B$BMass Teleport. NIY.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70104','esES','|cff9900ccDreadlord|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\"Incredibly powerful demon who wields power of darkness and mental domination\".$B$BHigh armor, high resistances, partially immune to control effects, damage taken speeds up spells recharge, plate armor, deals melee/spellshadow damage, bonus damage against incapacitated targets, spell power bonus: 200% strength. Main attribute: Strength.$B$BCarrion Swarm. Sends a horde of bats combined with chaotic magic to damage enemies in a very large frontal cone, cannot crit, 10 seconds cooldown.$B$BSleep. Puts the enemy target to sleep for 60 seconds and allows next physical attack on that target to bypass armor, direct damage caused will awaken the target, 6 seconds cooldown.$B$BVampiric Aura. Increases physical critical damage by 5% and heals party and raid members within 40 yards for a percentage (100% for Dreadlord and 25% for everyone else) of damage done by melee physical attacks and Carrion Swarm, no threat.$B$BSummon Infernal Servant. Calls an infernal down from the sky dealing damage and stunning enemy units, infernal is very resistant to magic and lasts 180 seconds, 180 seconds cooldown.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70105','esES','|cff0000ddSpell Breaker|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\"An elven warrior trained to disrupt and contort magical energies\".$B$BSpell damage taken reduced by 75%, partially immune to control effects, armor penalty -30%, mail/plate armor, deals melee/arcane damage, spell power bonus: 200% strength. Main attribute: Strength.$B$BSteal Magic (Spellsteal). Steals a benefical spell from an enemy and applies it to a nearby ally or removes a negative spell from an ally and applies it to a nearby enemy, affects magic and curse effects, 3 seconds cooldown.$B$BFeedback (passive). Successful melee attacks burn target mana equal to damage caused (increased by spellpower) dealing arcane damage. If target is drained, Spell Breaker melee attacks will do triple damage with increased critical strike chance',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70106','esES','|cff9900ccDark Ranger|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\"A former ranger of Quel thalas forcibly raised from the dead\".$B$BSpell damage taken reduced by 35%, undead, partially immune to control effects, leather/cloth armor, deals physical/spellshadow damage, stick to shadows and generates no threat, spell power bonus: 50% intellect. Main attribute: Agility.$B$BSilence. Silences an enemy and up to 4 nearby targets for 8 seconds, 15 seconds cooldown.$B$BBlack Arrow. Fires a cursed arrow dealing 150% weapon damage and additional spellshadow damage over time. If affected target dies from Dark Ranger damage, Dark Minion will spawn from the corpse (maximum 5 Minions, 80 seconds duration, only works on humanoids, beasts and dragonkin). Deals five times more damage if target is under 20% health.$B$BDrain Life. Drains health from an enemy every second for 5 seconds, healing Dark Ranger for 200% of the drained amount.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70201','esES','Siempre hay tipos dispuestos a matar por dinero.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70202','esES','Estos son los bots que están disponibles en este momento: ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70203','esES','Estos son los bots que están disponibles en este momento: ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70204','esES','Parece que no hay nadie disponible en este momento, vuelve más tarde.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70300','esES','¡Muere!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70301','esES','Resucitandote',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70302','esES','Resucitando ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70303','esES','tu bot',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70304','esES',' bot',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70305','esES','Todavía no puedo crear agua',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70306','esES','Todavía no puedo crear comida',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70307','esES','No puedo hacerlo ahora',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70308','esES','Aquí tienes...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70309','esES','Desactivado',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70310','esES','No está listo todavía',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70311','esES','Tipo de objeto no válido',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70312','esES','Fallido',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70313','esES','Vale',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70314','esES','No estoy en ninguna forma',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70315','esES','No tengo piedra de salud',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70316','esES','¡Aún no puedo crear piedras de salud!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70317','esES','¡WTF, no tengo forzar cerraduras!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70318','esES','Mi nivel de habilidad no es alto',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70319','esES','Cambiando mi talento a ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70320','esES','Armas',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70321','esES','Furia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70322','esES','Protección',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70323','esES','Retribución',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70324','esES','Maestro de bestias',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70325','esES','Punteria',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70326','esES','Supervivencia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70327','esES','Asesinato',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70328','esES','Combate',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70329','esES','Sutileza',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70330','esES','Disciplina',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70331','esES','Sagrado',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70332','esES','Sombra',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70333','esES','Sangre',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70334','esES','Escarcha',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70335','esES','Profano',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70336','esES','Elemental',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70337','esES','Mejora',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70338','esES','Restauración',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70339','esES','Arcano',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70340','esES','Fuego',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70341','esES','Aflición',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70342','esES','Demologia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70343','esES','Destrucción',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70344','esES','Equilibrio',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70345','esES','Combate feral',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70346','esES','Unknown',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70347','esES','Vete, debilucho',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70348','esES',' no está convencido',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70349','esES','No voy a perder el tiempo en nada',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70350','esES','NIY',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70351','esES','NIY',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70352','esES','NIY',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70353','esES','Estoy listo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70354','esES','Vete, sirvo a mi dueño ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70355','esES','unknown',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70356','esES',' en ti!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70357','esES',' en mí mismo!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70358','esES',' en ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70359','esES',' usado!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70360','esES','bot tank',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70361','esES','clase',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70362','esES','jugador',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70363','esES','dueño',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70364','esES','ninguno',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70365','esES','Rango',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70366','esES','talento',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70367','esES','pasivo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70368','esES','oculto',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70369','esES','conocido',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70370','esES','habilidad',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70371','esES','str',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70372','esES','agi',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70373','esES','sta',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70374','esES','int',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70375','esES','spi',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70376','esES','unk stat',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70377','esES','total',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70378','esES','Melee AP',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70379','esES','Ranged AP',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70380','esES','armadura',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70381','esES','crit',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70382','esES','defensa',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70383','esES','miss',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70384','esES','evasión',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70385','esES','parry',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70386','esES','bloqueo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70387','esES','valor de bloqueo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70388','esES','Daño recibido cuerpo a cuerpo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70389','esES','Daño recibido de hechizos',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70390','esES','Rango de daño mano principal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70391','esES','Daño múltiple mano principal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70392','esES','Tiempo de ataque mano principal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70393','esES','Rango de daño de mano secundaria',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70394','esES','Daño múltiple mano secundaria',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70395','esES','Tiempo de ataque mano secundaria',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70396','esES','Rango de daño a distancia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70397','esES','Daño a distancia múltiple',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70398','esES','Tiempo de ataque a distancia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70399','esES','min',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70400','esES','max',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70401','esES','DPS',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70402','esES','base hp',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70403','esES','total hp',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70404','esES','base mana',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70405','esES','total mana',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70406','esES','mana actual',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70407','esES','poder de hechizos',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70408','esES','health regen_5 bonus',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70409','esES','mana regen_5 no cast',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70410','esES','mana regen_5 casting',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70411','esES','haste',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70412','esES','hit',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70413','esES','pericia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70414','esES','penetración de armadura',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70415','esES','penetración de hechizos',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70416','esES','%',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70417','esES','sagrado',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70418','esES','fuego',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70419','esES','naturaleza',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70420','esES','escarcha',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70421','esES','sombra',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70422','esES','arcano',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70423','esES','Resistencia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70424','esES','Estados de comando',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70425','esES','Seguir',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70426','esES','Ataque',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70427','esES','Quédate',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70428','esES','Reiniciar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70429','esES','Parar por completo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70430','esES','Distancia de seguimiento',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70431','esES','Especificaciones',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70432','esES','Rol principal del bot',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70433','esES','Rol de recoleción del bot',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70434','esES','Muertes PvP',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70435','esES','jugadores',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70436','esES','Murió ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70437','esES',' veces',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70438','esES','%s (bot) se calma',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70439','esES','<Debug>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70440','esES','¿Estás seguro de que quieres arriesgarte a dibujar ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70441','esES',' atención?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70442','esES','<Insertar Moneda>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70443','esES','Quieres atraer ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70444','esES','<Intenta hacer una ofrenda>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70445','esES','Quieres contratar a ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70446','esES','<Contratar Bot>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70447','esES','Administrar equipamiento...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70448','esES','Administrar rol...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70449','esES','Administrar formación...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70450','esES','Administrar habilidades...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70451','esES','Administrar talentos...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70452','esES','Dar consumibles...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70453','esES','<Crear grupo>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70454','esES','<Crear grupo (Todos los bots)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70455','esES','<Añadir al grupo>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70456','esES','<Añadir todos los bots al grupo>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70457','esES','<Quitar del grupo>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70458','esES','¡Sigueme!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70459','esES','¡Mantén tu posición!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70460','esES','¡Quédate aquí, no hagas nada!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70461','esES','Necesito comida',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70462','esES','Necesito agua',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70463','esES','Necesito una mesa de refrigerios',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70464','esES','Ayúdame a abrir esta cerradura',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70465','esES','Necesito una piedra de salud',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70466','esES','Necesito un pozo de alma',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70467','esES','Necesito que actualices tus venenos',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70468','esES','<Elegir veneno (Mano Principal)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70469','esES','<Elegir veneno (Mano Sencundaria)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70470','esES','Necesito que actualices tus encantamientos',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70471','esES','<Elegir encantamiento (Mano Principal)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70472','esES','<Elegir encantamiento (Mano Secundaria)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70473','esES','Necesito que te quites el cambio de forma',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70474','esES','<Elegir tipo de mascota>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70475','esES','Despedir',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70476','esES','Despedir a ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70477','esES','Puede que te arrepientas...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70478','esES','!Tranquilizaté!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70479','esES','<Estudia a la criatura>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70480','esES','Nada',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70481','esES','Distancia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70482','esES','ATRÁS',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70483','esES','<auto>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70484','esES','<ninguna>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70485','esES','Aleatoria (Astucia)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70486','esES','Aleatoria (Ferocidad)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70487','esES','Aleatoria (Tenacidad)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70488','esES','Muéstrame tu inventario',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70489','esES','Auto-equipar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70490','esES','Mano Principal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70491','esES','Mano Secundaria',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70492','esES','A distancia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70493','esES','Reliquia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70494','esES','Cabeza',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70495','esES','Hombros',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70496','esES','Pecho',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70497','esES','Cintura',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70498','esES','Piernas',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70499','esES','Pies',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70500','esES','Brazales',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70501','esES','Guantes',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70502','esES','Capa',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70503','esES','Camisa',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70504','esES','Anillo1...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70505','esES','Anillo2...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70506','esES','Abalorio1',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70507','esES','Abalorio2',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70508','esES','Collar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70509','esES','Desequipar todo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70510','esES','Actualizar equipamiento (Visual)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70511','esES','Solo visual',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70512','esES','Equipado',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70513','esES','nada',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70514','esES','Usa tu equipamiento antiguo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70515','esES','Desequipar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70516','esES','Mmmm... no tengo nada que darte',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70517','esES','Recolectar material',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70518','esES','Estado de las habilidades',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70519','esES','Administrar habilidades disponibles',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70520','esES','Usar ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70521','esES','Actualizar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70522','esES','Daño',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70523','esES','Control',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70524','esES','Healer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70525','esES','Otros',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70526','esES',' hace un ruido chirriante y comienza a seguir ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70527','esES','%s no se unira a ti hasta que su dueño no lo despida.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70528','esES','%s no se unira a ti hasta que seas nivel 60',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70529','esES','%s no se unira a ti hasta que seas nivel 55',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70530','esES','%s no se unira a ti hasta que seas nivel 40',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70531','esES','%s no se unira a ti hasta que seas nivel 20',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70532','esES','Superas el número máximo de bots (%u)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70533','esES','No tienes suficiente dinero',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70534','esES','¡No puedes tener más bots de esa clase! %u de %u ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70535','esES','¡No se puede reiniciar el equipamiento en el slot %u (%s)! ¡No se puede despedir el bot!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70536','esES','actual',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70537','esES','Distancia de ataque',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70538','esES','Ataques de corto alcance',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70539','esES','Ataques de largo alcance',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70540','esES','Exacto',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70541','esES','Eliminar Buff',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70542','esES','Fija tu tipo de poder',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70543','esES','¡No se puede desequipar a %s por alguna razón! Enviando por correo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70544','esES','Tank',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70545','esES','A distancia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70546','esES','Mineria',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70547','esES','Herbolistaeria',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70548','esES','Desollar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70549','esES','Ingeniería',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70550','esES','El contrato del bot expiró',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70551','esES','Los NPCBot están deshabilitado actualmente.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70552','esES','%s No se unira a ti, ya tiene un dueño: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70553','esES','%s no puede unirse mientras estás a punto de teletransportarte',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70554','esES','Aspecto',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70555','esES','de Mono',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70556','esES','de Halcón',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70557','esES','de Guepardo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70558','esES','de Víbora',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70559','esES','de la Bestia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70560','esES','de la Manada',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70561','esES','de lo Salvaje',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70562','esES','de Dracohalcón',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70563','esES','Sin Aspecto',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70564','esES','Aura',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70565','esES','de Devoción',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70566','esES','de Concentración',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70567','esES','de Resistencia al fuego',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70568','esES','de Resistencia a la escarcha',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70569','esES','de Resistencia a las sombras',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70570','esES','de Reprensión',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70571','esES','de Cruzado',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70572','esES','Sin Aura',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70573','esES','Veneno entorpecedor',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70574','esES','Veneno instantáneo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70575','esES','Veneno mortal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70576','esES','Veneno hiriente',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70577','esES','Veneno de aturdimiento mental',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70578','esES','Veneno anestésico',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70579','esES','Nada',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70580','esES','Lengua de fuego',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70581','esES','Estigma de escarcha',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70582','esES','Viento furioso',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70583','esES','Vida terrestre',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70584','esES','Necesito tus servicios',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70585','esES','Tienes demasiados bots',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70586','esES','Quieres contratar a ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70587','esES',' está ocupado en este momento, vuelve a intentarlo más tarde.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70588','esES','Un placer hacer negocios contigo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70589','esES','Guerreros',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70590','esES','Paladines',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70591','esES','Magos',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70592','esES','Sacerdotes',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70593','esES','Brujos',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70594','esES','Druidas',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70595','esES','Caballeros de la Muerte',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70596','esES','Picaros',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70597','esES','Chamanes',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70598','esES','Cazadores',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70599','esES','Blademasters',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70600','esES','Destroyers',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70601','esES','Archmagi',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70602','esES','Dreadlords',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70603','esES','Spell Breakers',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70604','esES','Dark Rangers',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70605','esES','Guerrero',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70606','esES','Paladin',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70607','esES','Mago',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70608','esES','Sacerdote',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70609','esES','Brujo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70610','esES','Druida',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70611','esES','Caballero de la Muerte',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70612','esES','Picaro',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70613','esES','Chaman',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70614','esES','Cazador',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70615','esES','Blademaster',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70616','esES','Destroyer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70617','esES','Archmage',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70618','esES','Dreadlord',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70619','esES','Spell Breaker',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70620','esES','Dark Ranger',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70621','esES','Hombre',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70622','esES','Mujer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70623','esES','Humano',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70624','esES','Orco',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70625','esES','Enano',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70626','esES','Elfo de la noche',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70627','esES','No-muerto',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70628','esES','Tauren',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70629','esES','Gnomo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70630','esES','Troll',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70631','esES','Elfo de sangre',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70632','esES','Draenei',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70633','esES','Unknown',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70634','esES','Saquear',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70635','esES','|cff9d9d9dBasura|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70636','esES','|cffffffffComún|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70637','esES','|cff1eff00Poco común|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70638','esES','|cff0070ddRaro|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70639','esES','|cffa335eeÉpico|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70640','esES','|cffff8000Legendario|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70641','esES','Elige un comprtamineto',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70642','esES','Retrasa el ataque a',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70643','esES','Retrasa la sanación a',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70644','esES','s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70645','esES','Off-Tank',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70646','esES','Necromancers',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70647','esES','Necromancer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70648','esES','Ángulo de ataque',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70649','esES','Normal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70650','esES','Evitar AOE frontal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70652','esES','¿Estás seguro de que esto va a funcionar? Más vale que sea la mejor agua del mundo...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70653','esES','Parece que realmente te vendría bien un trago de agua fresca.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70654','esES','Brujas del mar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70655','esES','Bruja de mar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70656','esES','Maná por daño',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70657','esES','Daño por maná',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70658','esES','Transfiguración...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70659','esES','DESACTIVAR el posicionamiento de combate',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70660','esES','Objetivo prioritario',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70661','esES','Banco de equipamiento del bot...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70662','esES','Depositar objetos...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70663','esES','Retirar objetos...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70664','esES','El banco está vacío',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70665','esES','Página anterior',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70666','esES','Página siguiente',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70667','esES','¿Realmente quieres gastar todo ese dinero para volver a mover al Señor de las Criptas?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70668','esES','Dudo de tu capacidad para hacer mucho daño en tu estado actual, pero estoy dispuesto a guiarte y ayudarte a restaurar tus poderes.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70669','esES','Señores de las Criptas',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70670','esES','Señor de las Criptas',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70671','esES','Despido',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70672','esES','Langostas',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70673','esES','Umbral de salud del objetivo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70674','esES','Necesito un portal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70675','esES','Ventormenta',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70676','esES','Forjaz',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70677','esES','Darnassus',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70678','esES','El Exodar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70679','esES','Orgrimmar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70680','esES','Entrañas',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70681','esES','Cima del Trueno',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70682','esES','Ciudad de Lunargenta',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70683','esES','Shattrath',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70684','esES','Dalaran',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70685','esES','Superas el número máximo de npcbots para tu cuenta ({} >= {})',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70686','esES','<Aplicar a todos los bots>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70687','esES','(banco de equipamiento)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70688','esES','¡No hay suficiente espacio en el banco de equipamiento para almacenar %u objeto(s) (%u / %u)!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70689','esES','Conjuntos de equipamiento',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70690','esES','Crear',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70691','esES','Eliminar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70692','esES','Equipar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70693','esES','faltante',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);\n"
  },
  {
    "path": "AC/SQL/locales/esMX/npc_text_locale.sql",
    "content": "DELETE FROM `npc_text_locale` WHERE `Locale`='esMX' AND `ID` BETWEEN '70000' AND '71000';\nINSERT INTO `npc_text_locale` (`ID`, `Locale`, `Text0_0`, `Text0_1`, `Text1_0`, `Text1_1`, `Text2_0`, `Text2_1`, `Text3_0`, `Text3_1`, `Text4_0`, `Text4_1`, `Text5_0`, `Text5_1`, `Text6_0`, `Text6_1`, `Text7_0`, `Text7_1`)\nVALUES\n('70001','esMX','Vivo solo para servir a mi dueño.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70002','esMX','¿Necesitas algo?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70003','esMX','Mortales... normalmente mato a miserables como tú a la vista.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70004','esMX','<Ves lo que se supone que es un destructor de obsidiana. Sin embargo, este se ve diferente, dañado y descolorido, y no reacciona a tu presencia. Recuerdas que la Plaga ha estado usando sus propias versiones de esos en algún momento en el pasado. ¿Cómo diablos terminó aquí? Después de un examen más detallado, notas una abertura en la espalda de la criatura.>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70005','esMX','<El Destructor de obsidiana te mira fijamente y emite un gruñido bajo.>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70006','esMX','¿Estás sorprendido, mortal? Como nathrezim menor, tengo que recurrir a buscar aliados. Parece que podrías divertirme al menos.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70007','esMX','¿Qué pasa ahora, mortal?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70008','esMX','¿Puedes dejarme en paz? <suspiro>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70009','esMX','¿Ahora que?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70101','esMX','|cffff3300Blademaster|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\"An elite swordsman, former member of Burning Blade clan, now an elite fighter within the Horde\".$B$BMain attribute: Agility.$B$BNetherwalk (Windwalk). Allows Blademaster to become invisible, and move faster for a set amount of time. When the Blademaster attacks a unit to break invisibility, he will deal bonus damage.$B$BMirror Image. Confuses the enemy by creating illusions of the Blademaster and dispelling all magic from the Blademaster.$B$BCritical Strike (passive). Gives a 15% chance to deal critical x2(x3,x4) times normal damage on his attacks.$B$BBladestorm (NIY). Grants immunity to magic and deals damage to all surrounding enemies.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70102','esMX','|cff9900ccObsidian Destroyer|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\"An obsidian winged monstrocity with insatiable hunger for magic\".$B$BHigh armor, very high resistances, partially immune to magic, loses mana over time and doesnt benefit from passive mana regeneration effects, mail/plate armor, dual-wielding wands, deals spellshadow damage, no physical attack, cannot attack enemies not in front while moving, spell power bonus: 50% attack power + 200% intellect + wands damage.$B$BDevour Magic. Dispels up to 2 magic effects from enemies, up to 2 magic effects and up to 2 curses from allies and damaging summoned units in 20 yards area. Every dispelled effect restores 20% mana and 5% health, 7 seconds cooldown.$B$BShadow Blast. Empowered attack that deals increased splash damage.$B$BDrain Mana. Drains all mana (limited by casters mana pool) from a random friendly unit.$B$BReplenish Mana. Energizes surrounding party and raid members within 25 yards for 2% of their maximum mana nullifying casters mana, affects up to 10 targets, 3 seconds cooldown.$B$BRegenerating Aura. Heals surrounding party and raid members within 25 yards for 3% of their maximum health nullifying casters mana, affects up to 10 targets, 3 seconds cooldown.$B$BShadow Armor (passive). Restores mana equal to a percentage of damage taken.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70103','esMX','|cff0000ddArchmage|r$b|cffdd6600-=Warcraft III tribute=-|r$B$BSpell damage taken reduced by 35%, partially immune to control effects, cloth armor, deals spellsfire/spellfrost damage, no physical attack, spell power bonus: 100% intellect. Main attribute: Intellect.$B$BBlizzard. Your typical blizzard, just a little more powerful, 6 seconds cooldown.$B$BSummon Water Elemental. Summons a water elemental to attack archmage enemies for 1 min, 20 seconds cooldown.$B$BBrilliance Aura. Increases maximum mana by 10% and greatly increases mana regeneration of party and raid members within 40 yards.$B$BMass Teleport. NIY.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70104','esMX','|cff9900ccDreadlord|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\"Incredibly powerful demon who wields power of darkness and mental domination\".$B$BHigh armor, high resistances, partially immune to control effects, damage taken speeds up spells recharge, plate armor, deals melee/spellshadow damage, bonus damage against incapacitated targets, spell power bonus: 200% strength. Main attribute: Strength.$B$BCarrion Swarm. Sends a horde of bats combined with chaotic magic to damage enemies in a very large frontal cone, cannot crit, 10 seconds cooldown.$B$BSleep. Puts the enemy target to sleep for 60 seconds and allows next physical attack on that target to bypass armor, direct damage caused will awaken the target, 6 seconds cooldown.$B$BVampiric Aura. Increases physical critical damage by 5% and heals party and raid members within 40 yards for a percentage (100% for Dreadlord and 25% for everyone else) of damage done by melee physical attacks and Carrion Swarm, no threat.$B$BSummon Infernal Servant. Calls an infernal down from the sky dealing damage and stunning enemy units, infernal is very resistant to magic and lasts 180 seconds, 180 seconds cooldown.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70105','esMX','|cff0000ddSpell Breaker|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\"An elven warrior trained to disrupt and contort magical energies\".$B$BSpell damage taken reduced by 75%, partially immune to control effects, armor penalty -30%, mail/plate armor, deals melee/arcane damage, spell power bonus: 200% strength. Main attribute: Strength.$B$BSteal Magic (Spellsteal). Steals a benefical spell from an enemy and applies it to a nearby ally or removes a negative spell from an ally and applies it to a nearby enemy, affects magic and curse effects, 3 seconds cooldown.$B$BFeedback (passive). Successful melee attacks burn target mana equal to damage caused (increased by spellpower) dealing arcane damage. If target is drained, Spell Breaker melee attacks will do triple damage with increased critical strike chance',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70106','esMX','|cff9900ccDark Ranger|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\"A former ranger of Quel thalas forcibly raised from the dead\".$B$BSpell damage taken reduced by 35%, undead, partially immune to control effects, leather/cloth armor, deals physical/spellshadow damage, stick to shadows and generates no threat, spell power bonus: 50% intellect. Main attribute: Agility.$B$BSilence. Silences an enemy and up to 4 nearby targets for 8 seconds, 15 seconds cooldown.$B$BBlack Arrow. Fires a cursed arrow dealing 150% weapon damage and additional spellshadow damage over time. If affected target dies from Dark Ranger damage, Dark Minion will spawn from the corpse (maximum 5 Minions, 80 seconds duration, only works on humanoids, beasts and dragonkin). Deals five times more damage if target is under 20% health.$B$BDrain Life. Drains health from an enemy every second for 5 seconds, healing Dark Ranger for 200% of the drained amount.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70201','esMX','Siempre hay tipos dispuestos a matar por dinero.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70202','esMX','Estos son los bots que están disponibles en este momento: ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70203','esMX','Estos son los bots que están disponibles en este momento: ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70204','esMX','Parece que no hay nadie disponible en este momento, vuelve más tarde.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70300','esMX','¡Muere!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70301','esMX','Resucitandote',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70302','esMX','Resucitando ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70303','esMX','tu bot',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70304','esMX',' bot',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70305','esMX','Todavía no puedo crear agua',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70306','esMX','Todavía no puedo crear comida',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70307','esMX','No puedo hacerlo ahora',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70308','esMX','Aquí tienes...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70309','esMX','Desactivado',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70310','esMX','No está listo todavía',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70311','esMX','Tipo de objeto no válido',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70312','esMX','Fallido',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70313','esMX','Vale',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70314','esMX','No estoy en ninguna forma',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70315','esMX','No tengo piedra de salud',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70316','esMX','¡Aún no puedo crear piedras de salud!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70317','esMX','¡WTF, no tengo forzar cerraduras!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70318','esMX','Mi nivel de habilidad no es alto',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70319','esMX','Cambiando mi talento a ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70320','esMX','Armas',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70321','esMX','Furia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70322','esMX','Protección',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70323','esMX','Retribución',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70324','esMX','Maestro de bestias',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70325','esMX','Punteria',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70326','esMX','Supervivencia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70327','esMX','Asesinato',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70328','esMX','Combate',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70329','esMX','Sutileza',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70330','esMX','Disciplina',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70331','esMX','Sagrado',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70332','esMX','Sombra',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70333','esMX','Sangre',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70334','esMX','Escarcha',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70335','esMX','Profano',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70336','esMX','Elemental',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70337','esMX','Mejora',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70338','esMX','Restauración',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70339','esMX','Arcano',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70340','esMX','Fuego',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70341','esMX','Aflición',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70342','esMX','Demologia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70343','esMX','Destrucción',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70344','esMX','Equilibrio',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70345','esMX','Combate feral',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70346','esMX','Unknown',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70347','esMX','Vete, debilucho',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70348','esMX',' no está convencido',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70349','esMX','No voy a perder el tiempo en nada',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70350','esMX','NIY',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70351','esMX','NIY',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70352','esMX','NIY',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70353','esMX','Estoy listo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70354','esMX','Vete, sirvo a mi dueño ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70355','esMX','unknown',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70356','esMX',' en ti!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70357','esMX',' en mí mismo!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70358','esMX',' en ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70359','esMX',' usado!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70360','esMX','bot tank',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70361','esMX','clase',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70362','esMX','jugador',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70363','esMX','dueño',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70364','esMX','ninguno',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70365','esMX','Rango',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70366','esMX','talento',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70367','esMX','pasivo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70368','esMX','oculto',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70369','esMX','conocido',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70370','esMX','habilidad',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70371','esMX','str',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70372','esMX','agi',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70373','esMX','sta',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70374','esMX','int',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70375','esMX','spi',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70376','esMX','unk stat',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70377','esMX','total',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70378','esMX','Melee AP',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70379','esMX','Ranged AP',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70380','esMX','armadura',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70381','esMX','crit',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70382','esMX','defensa',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70383','esMX','miss',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70384','esMX','evasión',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70385','esMX','parry',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70386','esMX','bloqueo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70387','esMX','valor de bloqueo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70388','esMX','Daño recibido cuerpo a cuerpo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70389','esMX','Daño recibido de hechizos',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70390','esMX','Rango de daño mano principal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70391','esMX','Daño múltiple mano principal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70392','esMX','Tiempo de ataque mano principal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70393','esMX','Rango de daño de mano secundaria',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70394','esMX','Daño múltiple mano secundaria',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70395','esMX','Tiempo de ataque mano secundaria',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70396','esMX','Rango de daño a distancia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70397','esMX','Daño a distancia múltiple',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70398','esMX','Tiempo de ataque a distancia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70399','esMX','min',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70400','esMX','max',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70401','esMX','DPS',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70402','esMX','base hp',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70403','esMX','total hp',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70404','esMX','base mana',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70405','esMX','total mana',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70406','esMX','mana actual',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70407','esMX','poder de hechizos',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70408','esMX','health regen_5 bonus',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70409','esMX','mana regen_5 no cast',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70410','esMX','mana regen_5 casting',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70411','esMX','haste',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70412','esMX','hit',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70413','esMX','pericia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70414','esMX','penetración de armadura',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70415','esMX','penetración de hechizos',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70416','esMX','%',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70417','esMX','sagrado',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70418','esMX','fuego',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70419','esMX','naturaleza',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70420','esMX','escarcha',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70421','esMX','sombra',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70422','esMX','arcano',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70423','esMX','Resistencia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70424','esMX','Estados de comando',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70425','esMX','Seguir',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70426','esMX','Ataque',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70427','esMX','Quédate',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70428','esMX','Reiniciar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70429','esMX','Parar por completo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70430','esMX','Distancia de seguimiento',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70431','esMX','Especificaciones',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70432','esMX','Rol principal del bot',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70433','esMX','Rol de recoleción del bot',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70434','esMX','Muertes PvP',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70435','esMX','jugadores',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70436','esMX','Murió ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70437','esMX',' veces',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70438','esMX','%s (bot) se calma',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70439','esMX','<Debug>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70440','esMX','¿Estás seguro de que quieres arriesgarte a dibujar ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70441','esMX',' atención?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70442','esMX','<Insertar Moneda>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70443','esMX','Quieres atraer ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70444','esMX','<Intenta hacer una ofrenda>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70445','esMX','Quieres contratar a ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70446','esMX','<Contratar Bot>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70447','esMX','Administrar equipamiento...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70448','esMX','Administrar rol...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70449','esMX','Administrar formación...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70450','esMX','Administrar habilidades...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70451','esMX','Administrar talentos...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70452','esMX','Dar consumibles...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70453','esMX','<Crear grupo>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70454','esMX','<Crear grupo (Todos los bots)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70455','esMX','<Añadir al grupo>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70456','esMX','<Añadir todos los bots al grupo>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70457','esMX','<Quitar del grupo>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70458','esMX','¡Sigueme!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70459','esMX','¡Mantén tu posición!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70460','esMX','¡Quédate aquí, no hagas nada!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70461','esMX','Necesito comida',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70462','esMX','Necesito agua',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70463','esMX','Necesito una mesa de refrigerios',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70464','esMX','Ayúdame a abrir esta cerradura',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70465','esMX','Necesito una piedra de salud',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70466','esMX','Necesito un pozo de alma',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70467','esMX','Necesito que actualices tus venenos',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70468','esMX','<Elegir veneno (Mano Principal)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70469','esMX','<Elegir veneno (Mano Sencundaria)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70470','esMX','Necesito que actualices tus encantamientos',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70471','esMX','<Elegir encantamiento (Mano Principal)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70472','esMX','<Elegir encantamiento (Mano Secundaria)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70473','esMX','Necesito que te quites el cambio de forma',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70474','esMX','<Elegir tipo de mascota>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70475','esMX','Despedir',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70476','esMX','Despedir a ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70477','esMX','Puede que te arrepientas...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70478','esMX','!Tranquilizaté!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70479','esMX','<Estudia a la criatura>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70480','esMX','Nada',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70481','esMX','Distancia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70482','esMX','ATRÁS',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70483','esMX','<auto>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70484','esMX','<ninguna>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70485','esMX','Aleatoria (Astucia)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70486','esMX','Aleatoria (Ferocidad)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70487','esMX','Aleatoria (Tenacidad)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70488','esMX','Muéstrame tu inventario',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70489','esMX','Auto-equipar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70490','esMX','Mano Principal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70491','esMX','Mano Secundaria',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70492','esMX','A distancia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70493','esMX','Reliquia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70494','esMX','Cabeza',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70495','esMX','Hombros',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70496','esMX','Pecho',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70497','esMX','Cintura',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70498','esMX','Piernas',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70499','esMX','Pies',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70500','esMX','Brazales',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70501','esMX','Guantes',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70502','esMX','Capa',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70503','esMX','Camisa',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70504','esMX','Anillo1...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70505','esMX','Anillo2...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70506','esMX','Abalorio1',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70507','esMX','Abalorio2',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70508','esMX','Collar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70509','esMX','Desequipar todo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70510','esMX','Actualizar equipamiento (Visual)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70511','esMX','Solo visual',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70512','esMX','Equipado',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70513','esMX','nada',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70514','esMX','Usa tu equipamiento antiguo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70515','esMX','Desequipar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70516','esMX','Mmmm... no tengo nada que darte',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70517','esMX','Recolectar material',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70518','esMX','Estado de las habilidades',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70519','esMX','Administrar habilidades disponibles',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70520','esMX','Usar ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70521','esMX','Actualizar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70522','esMX','Daño',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70523','esMX','Control',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70524','esMX','Healer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70525','esMX','Otros',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70526','esMX',' hace un ruido chirriante y comienza a seguir ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70527','esMX','%s no se unira a ti hasta que su dueño no lo despida.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70528','esMX','%s no se unira a ti hasta que seas nivel 60',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70529','esMX','%s no se unira a ti hasta que seas nivel 55',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70530','esMX','%s no se unira a ti hasta que seas nivel 40',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70531','esMX','%s no se unira a ti hasta que seas nivel 20',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70532','esMX','Superas el número máximo de bots (%u)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70533','esMX','No tienes suficiente dinero',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70534','esMX','¡No puedes tener más bots de esa clase! %u de %u ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70535','esMX','¡No se puede reiniciar el equipamiento en el slot %u (%s)! ¡No se puede despedir el bot!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70536','esMX','actual',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70537','esMX','Distancia de ataque',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70538','esMX','Ataques de corto alcance',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70539','esMX','Ataques de largo alcance',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70540','esMX','Exacto',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70541','esMX','Eliminar Buff',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70542','esMX','Fija tu tipo de poder',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70543','esMX','¡No se puede desequipar a %s por alguna razón! Enviando por correo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70544','esMX','Tank',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70545','esMX','A distancia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70546','esMX','Mineria',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70547','esMX','Herbolistaeria',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70548','esMX','Desollar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70549','esMX','Ingeniería',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70550','esMX','El contrato del bot expiró',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70551','esMX','Los NPCBot están deshabilitado actualmente.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70552','esMX','%s No se unira a ti, ya tiene un dueño: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70553','esMX','%s no puede unirse mientras estás a punto de teletransportarte',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70554','esMX','Aspecto',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70555','esMX','de Mono',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70556','esMX','de Halcón',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70557','esMX','de Guepardo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70558','esMX','de Víbora',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70559','esMX','de la Bestia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70560','esMX','de la Manada',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70561','esMX','de lo Salvaje',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70562','esMX','de Dracohalcón',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70563','esMX','Sin Aspecto',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70564','esMX','Aura',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70565','esMX','de Devoción',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70566','esMX','de Concentración',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70567','esMX','de Resistencia al fuego',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70568','esMX','de Resistencia a la escarcha',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70569','esMX','de Resistencia a las sombras',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70570','esMX','de Reprensión',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70571','esMX','de Cruzado',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70572','esMX','Sin Aura',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70573','esMX','Veneno entorpecedor',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70574','esMX','Veneno instantáneo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70575','esMX','Veneno mortal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70576','esMX','Veneno hiriente',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70577','esMX','Veneno de aturdimiento mental',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70578','esMX','Veneno anestésico',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70579','esMX','Nada',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70580','esMX','Lengua de fuego',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70581','esMX','Estigma de escarcha',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70582','esMX','Viento furioso',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70583','esMX','Vida terrestre',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70584','esMX','Necesito tus servicios',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70585','esMX','Tienes demasiados bots',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70586','esMX','Quieres contratar a ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70587','esMX',' está ocupado en este momento, vuelve a intentarlo más tarde.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70588','esMX','Un placer hacer negocios contigo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70589','esMX','Guerreros',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70590','esMX','Paladines',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70591','esMX','Magos',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70592','esMX','Sacerdotes',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70593','esMX','Brujos',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70594','esMX','Druidas',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70595','esMX','Caballeros de la Muerte',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70596','esMX','Picaros',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70597','esMX','Chamanes',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70598','esMX','Cazadores',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70599','esMX','Blademasters',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70600','esMX','Destroyers',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70601','esMX','Archmagi',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70602','esMX','Dreadlords',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70603','esMX','Spell Breakers',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70604','esMX','Dark Rangers',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70605','esMX','Guerrero',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70606','esMX','Paladin',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70607','esMX','Mago',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70608','esMX','Sacerdote',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70609','esMX','Brujo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70610','esMX','Druida',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70611','esMX','Caballero de la Muerte',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70612','esMX','Picaro',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70613','esMX','Chaman',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70614','esMX','Cazador',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70615','esMX','Blademaster',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70616','esMX','Destroyer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70617','esMX','Archmage',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70618','esMX','Dreadlord',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70619','esMX','Spell Breaker',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70620','esMX','Dark Ranger',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70621','esMX','Hombre',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70622','esMX','Mujer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70623','esMX','Humano',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70624','esMX','Orco',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70625','esMX','Enano',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70626','esMX','Elfo de la noche',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70627','esMX','No-muerto',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70628','esMX','Tauren',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70629','esMX','Gnomo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70630','esMX','Troll',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70631','esMX','Elfo de sangre',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70632','esMX','Draenei',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70633','esMX','Unknown',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70634','esMX','Saquear',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70635','esMX','|cff9d9d9dBasura|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70636','esMX','|cffffffffComún|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70637','esMX','|cff1eff00Poco común|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70638','esMX','|cff0070ddRaro|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70639','esMX','|cffa335eeÉpico|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70640','esMX','|cffff8000Legendario|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70641','esMX','Elige un comprtamineto',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70642','esMX','Retrasa el ataque a',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70643','esMX','Retrasa la sanación a',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70644','esMX','s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70645','esMX','Off-Tank',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70646','esMX','Necromancers',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70647','esMX','Necromancer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70648','esMX','Ángulo de ataque',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70649','esMX','Normal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70650','esMX','Evitar AOE frontal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70652','esMX','¿Estás seguro de que esto va a funcionar? Más vale que sea la mejor agua del mundo...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70653','esMX','Parece que realmente te vendría bien un trago de agua fresca.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70654','esMX','Brujas del mar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70655','esMX','Bruja de mar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70656','esMX','Maná por daño',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70657','esMX','Daño por maná',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70658','esMX','Transfiguración...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70659','esMX','DESACTIVAR el posicionamiento de combate',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70660','esMX','Objetivo prioritario',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);\n"
  },
  {
    "path": "AC/SQL/locales/frFR/npc_text_locale_frFR.sql",
    "content": "-- French\nDELETE FROM `npc_text_locale` WHERE `Locale`='frFR' AND `ID` BETWEEN '70000' AND '71000';\n\nINSERT INTO `npc_text_locale` (`ID`, `Locale`, `Text0_0`, `Text0_1`, `Text1_0`, `Text1_1`, `Text2_0`, `Text2_1`, `Text3_0`, `Text3_1`, `Text4_0`, `Text4_1`, `Text5_0`, `Text5_1`, `Text6_0`, `Text6_1`, `Text7_0`, `Text7_1`) VALUES \n('70001','frFR','Je ne vis que pour servir le maître.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70002','frFR','Tu as besoin de quelque chose ?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70003','frFR','Mortels… d’ordinaire, je tue les misérables comme toi sur-le-champ.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70004','frFR','<Vous voyez ce qui est censé être un Destructeur d’Obsidienne. Celui-ci semble toutefois différent, endommagé et terni, et ne réagit pas à votre présence. Vous vous souvenez que le Fléau a utilisé ses propres versions de ces créatures à un moment donné dans le passé. Comment diable est-il arrivé ici ? Après un examen plus approfondi, vous remarquez une ouverture sur le dos de la créature.>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70005','frFR','<Le Destructeur d’Obsidienne vous fixe et émet un grondement sourd.>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70006','frFR','Es-tu surpris, mortel ? En tant que nathrezim mineur, je dois me résoudre à chercher des alliés. Tu as au moins l’air de pouvoir m’amuser.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70007','frFR','Qu’y a-t-il, maintenant, mortel ?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70008','frFR','Peux-tu me laisser tranquille ? <sigh>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70009','frFR','Et maintenant ?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70010','frFR','<Vous voyez une matriarche naga émaciée. Elle semble fatiguée et faible, et évite de vous regarder.>$B$BÉ-é-épargne tes paroles, mortel...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70011','frFR','Est-ce que je me suis ébouriffé ? <Elle remet en place sa “chevelure”>$B…Non, ce n\\'est pas ça. Alors, de quoi s\\'agit-il ?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70012','frFR','<Le Seigneur des Cryptes meurtri se tient devant vous, il est manifestement hors de contrôle. Privé de maître, ce puissant seigneur nerubien mort-vivant a perdu l\\'essentiel de son pouvoir.>$B$BQue sera-t-il, petite créature ? Ta chair conviendra comme tant d\\'autres…',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70013','frFR','Je dévore les vivants et les morts.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70101','frFR','|cffff3300Blademaster|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\"Un épéiste d\\'élite, ancien membre du clan Burning Blade, désormais combattant d\\'élite au sein de la Horde\".$B$BAttribut principal : Agilité.$B$BMarche des Ténèbres (Windwalk). Permet au Maître-lame de devenir invisible et de se déplacer plus vite pendant un temps donné. Lorsqu\\'il attaque une unité pour rompre l\\'invisibilité, il inflige des dégâts bonus.$B$BImage Miroir. Confond l\\'ennemi en créant des illusions du Maître-lame et dissipe toute magie le concernant.$B$BCoup Critique (passif). Confère 15 % de chances d\\'infliger des dégâts critiques ×2(×3,×4) fois les dégâts normaux lors de ses attaques.$B$BTempête de Lames (NIY). Octroie une immunité à la magie et inflige des dégâts à tous les ennemis alentour.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70102','frFR','|cff9900ccObsidian Destroyer|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B« Une monstruosité ailée d\\'obsidienne à la faim insatiable pour la magie ». $B$BArmure élevée, résistances très élevées, partiellement immunisé à la magie, perd du mana au fil du temps et ne bénéficie pas des effets de régénération passive, armure maille/plaques, double maniement de baguettes, inflige des dégâts d’ombre magique, pas d\\'attaque physique, ne peut pas attaquer les ennemis hors de son champ frontal en mouvement, bonus de puissance magique : 50 % de puissance d\\'attaque + 200 % d\\'intelligence + dégâts des baguettes.$B$BDévorer la Magie. Dissipe jusqu\\'à 2 effets magiques des ennemis, jusqu\\'à 2 effets magiques et 2 malédictions des alliés et unités invoquées hostiles dans un rayon de 20 m. Chaque effet dissipé restaure 20 % de mana et 5 % de vie, temps de recharge de 7 s.$B$BPoussée Sombre. Attaque renforcée infligeant des dégâts de zone accrus.$B$BDrain de Mana. Vide tout le mana (dans les limites de la réserve de l\\'incantateur) d\\'une unité alliée aléatoire.$B$BRestauration de Mana. Revigore les membres du groupe et du raid dans un rayon de 25 m en leur restituant 3 % de leur mana maximal, au prix du mana de l\\'incantateur, temps de recharge de 3 s.$B$BAura Régénératrice. Soigne les membres du groupe et du raid dans un rayon de 25 m en leur restituant 3 % de leur vie maximale, au prix du mana de l\\'incantateur, temps de recharge de 3 s.$B$BArmure d\\'Ombre (passif). Restaure du mana égal à un pourcentage des dégâts subis.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70103','frFR','|cff0000ddArchmage|r$b|cffdd6600-=Warcraft III tribute=-|r$B$BRéduction des dégâts des sorts subis de 35 %, partiellement immunisé aux effets de contrôle, armure en tissu, inflige des dégâts de feu/givre magique, pas d\\'attaque physique, bonus de puissance des sorts : 100 % d\\'intelligence. Attribut principal : Intelligence.$B$BBlizzard. Votre blizzard habituel, juste un peu plus puissant, temps de recharge de 6 s.$B$BInvocation d\\'Élémentaire d\\'Eau. Invoque un élémentaire d\\'eau pour attaquer les ennemis de l\\'archimage pendant 1 min, temps de recharge de 20 s.$B$BAura de Brillance. Augmente le mana maximum de 10 % et augmente grandement la régénération de mana des membres du groupe et du raid dans un rayon de 40 m.$B$BTéléportation de Masse. NIY.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70104','frFR','|cff9900ccDreadlord|r$b|cffdd6600-=Warcraft III tribute=-|r$B$BDémon incroyablement puissant maniant le pouvoir des ténèbres et la domination mentale.$B$BArmure élevée, résistances élevées, partiellement immunisé aux effets de contrôle, les dégâts subis accélèrent le rechargement des sorts, armure en plaques, inflige des dégâts de mêlée et d\\'ombre magique, bonus de dégâts contre les cibles incapables, bonus de puissance des sorts : 200 % de force. Attribut principal : Force.$B$BCarrion Swarm. Envoie une horde de chauves-souris mêlées à une magie chaotique infligeant des dégâts dans un très large cône frontal, ne peut pas infliger de critiques, temps de recharge : 10 s.$B$BSleep. Endort la cible pendant 60 s et permet à la prochaine attaque physique de passer outre \\'’armure ; les dégâts directs réveillent la cible, temps de recharge : 6 s.$B$BVampiric Aura. Augmente les dégâts critiques physiques de 5 % et soigne les membres du groupe et du raid dans un rayon de 40 m d’un pourcentage des dégâts infligés par les attaques physiques et Carrion Swarm (100 % pour le Dreadlord et 25 % pour les autres), sans générer de menace.$B$BSummon Infernal Servant. Invoque un serviteur infernal depuis le ciel infligeant des dégâts et étourdissant les unités ennemies ; l\\'infernal est très résistant à la magie et dure 180 s, temps de recharge : 180 s.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70105','frFR','|cff0000ddSpell Breaker|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B« Un guerrier elfe entraîné à perturber et tordre les énergies magiques ».$B$BLes dégâts des sorts subis sont réduits de 75 %, partiellement immunisé aux effets de contrôle, pénalité d\\'armure : -30 %, armure maille/plaques, inflige des dégâts de mêlée/arcane, bonus de puissance des sorts : 200 % de force. Attribut principal : Force.$B$BVol de Magie (Spellsteal). Vole un sort bénéfique à un ennemi pour l\\'appliquer à un allié proche ou retire un sort négatif d\\'un allié pour l\\'appliquer à un ennemi proche, affecte magie et malédictions, temps de recharge : 2 s.$B$BRéaction (passif). Les attaques de mêlée réussies brûlent le mana de la cible égal aux dégâts infligés (augmentés par la puissance des sorts), infligeant des dégâts d\\'arcane. Si le mana de la cible est épuisé, les attaques de mêlée du Spell Breaker infligent le triple de dégâts avec une chance de coup critique accrue. Si la cible n\\'a pas de mana, le Spell Breaker gagne un mana égal à 25 % des dégâts infligés.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70106','frFR','|cff9900ccDark Ranger|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B« Une ancienne ranger de Quel\\'Thalas ressuscitée de force ».$B$BRéduction des dégâts des sorts subis de 35 %, mort-vivant, partiellement immunisé aux effets de contrôle, armure en cuir/toile, inflige des dégâts physiques/ombre magique, reste dans l\\'ombre sans générer de menace, bonus de puissance des sorts : 50 % d\\'intelligence. Attribut principal : Agilité.$B$BSilence. Fait taire une cible et jusqu\\'à 4 cibles proches pendant 8 s, temps de recharge : 15 s.$B$BFlèche Noire. Tire une flèche maudite infligeant 150 % de dégâts d\\'arme et des dégâts d\\'ombre supplémentaires sur la durée. Si la cible meurt sous les coups de la Dark Ranger, un serviteur sombre naît de son cadavre (maximum 5, durée 80 s, n\\'affecte que les humanoïdes, bêtes et draconiens). Inflige cinq fois plus de dégâts si la cible est sous 20 % de vie.$B$BDrain de Vie. Absorbe la vie d\\'une cible chaque seconde pendant 5 s, soignant la Dark Ranger de 200 % de la quantité absorbée.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70107','frFR','|cff9900ccNecromancer|r$b|cffdd6600-=Warcraft III / Diablo II tribute=-|r$B$BRéduction des dégâts des sorts subis de 20 %, partiellement immunisé aux effets de contrôle, armure en tissu, inflige des dégâts d\\'ombre magique, pas d\\'attaque physique, bonus de puissance des sorts : 100 % d\\'intelligence. Attribut principal : Intelligence.$B$BRaise Dead. Fait surgir 2 Squelettes d\\'un cadavre (maximum 6 Squelettes, durée 65 s, n\\'affecte que les humanoïdes, bêtes et draconiens).$B$BUnholy Frenzy. Augmente la vitesse d\\'attaque mêlée de la cible de 75 %, mais draine constamment sa vie. Dure 45 s. Ne peut pas être annulé. Débloqué au niveau 30.$B$BCorpse Explosion. Fait exploser un cadavre, infligeant des dégâts égaux à 35 %–75 % de la vie maximale de l’unité morte (selon le niveau du nécromancien) à tous les ennemis alentour. Ces dégâts ne génèrent pas de menace. Débloqué au niveau 40.$B$BCripple. Réduit la vitesse de déplacement, la vitesse d\\'attaque mêlée et la force totale de la cible de 50 % pendant 60 s. Débloqué au niveau 50.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70108','frFR','|cff0000ddSea Witch|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B« Une vicieuse créature écailleuse des océans souvent associée à l\\'arrivée de tempêtes prodigieuses ».$B$BRéduction des dégâts des sorts subis de 30 %, partiellement immunisée aux effets de contrôle, armure en tissu, inflige des dégâts physiques/glace/orage magique, bonus de puissance d\\'attaque : agilité ×2, bonus de puissance des sorts : 200 % d\\'intelligence. Attribut principal : Intelligence.$B$BForked Lightning. Éclair Fourchu. Convoque un cône de foudre pour endommager les ennemis. Frappe de 2 jusqu\\'à toutes les cibles (selon le niveau de la Sea Witch\\'s), les étourdissant pendant 2 s. Ces dégâts ne génèrent pas de menace.$B$BFrost Arrows. Flèches de Givre. Imprègne les flèches de glace pour des dégâts supplémentaires, ralentissant la vitesse de déplacement, d\\'attaque et d\\'incantation de 30 % à 70 % (selon le niveau).$B$BMana Shield. Bouclier de Mana. Crée un bouclier absorbant 100 % des dégâts entrants (non atténués) en utilisant le mana de la Sea Witch. L\\'efficacité varie de 1 dégât pour 10 mana à 10 dégâts pour 1 mana (selon le niveau).$B$BTornado. Tornade. Invoque une tornade féroce infligeant des dégâts et ralentissant les unités ennemies proches, parfois les incapacitant complètement. La tornade grandit en extérieur, augmentant dégâts et zone d\\'effet, mais rétrécit en intérieur, se dissipant rapidement. Débloqué au niveau 60.$B$BNaga (Passive). Naga (passif). Vitesse de nage, dégâts et chances d\\'esquive grandement augmentés dans l\\'eau.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70109','frFR','|cff9900ccCrypt Lord|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B« Ancien béhémoth, autrefois l\\'un des rois d\\'Azjol-Nerub, désormais monstre mort-vivant parmi les guerriers les plus puissants du Roi-Liche ».$B$BArmure très élevée, résistances accrues, partiellement immunisé aux effets de contrôle, immunisé aux poisons, armure maille/plaques, inflige des dégâts de mêlée/ombre magique, bonus de puissance des sorts : 200 % de force. Attribut principal : Force.$B$BImpale. Le Crypt Lord frappe le sol de ses griffes massives, projetant des pointes en cône frontal, infligeant des dégâts et propulsant les unités ennemies dans les airs, les étourdissant. Débloqué au niveau 20.$B$BSpiked Carapace. L\\'armure chitineuse du Crypt Lord augmente la résistance aux dégâts et renvoie de 15 % à 50 % des dégâts infligés par les attaquants de mêlée.$B$BCarrion Beetles. Le Crypt Lord engendre un Scarabée de Charogne à partir d\\'un cadavre frais pour attaquer ses ennemis. Les scarabées sont permanents mais ne régénèrent pas de vie et seuls 6 peuvent être contrôlés simultanément. Les niveaux supérieurs permettent d\\'invoquer des scarabées plus puissants. Débloqué au niveau 10.$B$BLocust Swarm. Le Crypt Lord libère une nuée de 20 à 40 criquets enragés (selon son niveau) qui mordent et lacèrent les unités ennemies proches, réduisant leur capacité à se déplacer ou attaquer. En mastiquant la chair ennemie, ils la transforment en une substance qui restaure des points de vie au Crypt Lord à leur retour. Débloqué au niveau 40.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70201','frFR','Il y a toujours des types prêts à tuer pour de l\\'\\'argent.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70202','frFR','Les mercenaires sont toujours en demande. Voici ce qui est disponible pour le moment.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70203','frFR','Les mercenaires sont toujours en demande. Voici ce qui est disponible pour le moment.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70204','frFR','On dirait qu\\'il n\\'y a personne de disponible pour le moment, réessaye plus tard.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70300','frFR','Meurs !',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70301','frFR','Je te ressuscite',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70302','frFR','Ressuscite',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70303','frFR','ton bot',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70304','frFR','du bot',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70305','frFR','Je ne peux pas encore invoquer d\\'\\'eau.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70306','frFR','Je ne peux pas encore invoquer de nourriture.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70307','frFR','Je ne peux pas le faire maintenant.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70308','frFR','Tiens...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70309','frFR','Désactivé',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70310','frFR','Pas encore prêt',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70311','frFR','Type d\\'\\'objet invalide',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70312','frFR','Échec',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70313','frFR','Terminé',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70314','frFR','Je ne suis pas métamorphosé.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70315','frFR','Je n\\'ai pas de pierre de vie.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70316','frFR','Je ne peux pas encore créer de pierres de vie !',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70317','frFR','WTF, je n\\'ai pas de crochetage !',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70318','frFR','Mon niveau de compétence n\\'\\'est pas assez élevé.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70319','frFR','Changement de spécialisation vers',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70320','frFR','Armes',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70321','frFR','Fureur',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70322','frFR','Protection',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70323','frFR','Vengeance',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70324','frFR','Maîtrise des bêtes',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70325','frFR','Précision',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70326','frFR','Survie',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70327','frFR','Assassinat',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70328','frFR','Combat',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70329','frFR','Finesse',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70330','frFR','Discipline',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70331','frFR','Sacré',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70332','frFR','Ombre',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70333','frFR','Sang',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70334','frFR','Givre',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70335','frFR','Impie',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70336','frFR','Élémentaire',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70337','frFR','Amélioration',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70338','frFR','Restauration  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70339','frFR','Arcane  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70340','frFR','Feu  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70341','frFR','Affliction  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70342','frFR','Démonologie  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70343','frFR','Destruction  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70344','frFR','Équilibre  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70345','frFR','Combat farouche  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70346','frFR','Inconnu  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70347','frFR','Va-t-en, lâche !  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70348','frFR',' n\\'est pas convaincu  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70349','frFR','Je ne vais pas perdre mon temps pour n\\'importe quoi  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70350','frFR','NIY  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70351','frFR','NIY  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70352','frFR','NIY  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70353','frFR','Je suis prêt  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70354','frFR','Va-t-en. Je sers mon maître   ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70355','frFR','inconnu  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70356','frFR',' sur vous !  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70357','frFR',' sur moi !  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70358','frFR',' sur   ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70359','frFR',' utilisé !  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70360','frFR','tank de bot  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70361','frFR','classe  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70362','frFR','joueur  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70363','frFR','maître  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70364','frFR','aucun  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70365','frFR','Rang  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70366','frFR','talent  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70367','frFR','passif  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70368','frFR','caché  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70369','frFR','connu  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70370','frFR','capacité  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70371','frFR','for  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70372','frFR','agi  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70373','frFR','end  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70374','frFR','int  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70375','frFR','spi  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70376','frFR','stat inconnue  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70377','frFR','total  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70378','frFR','Puissance d’attaque (mêlée)  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70379','frFR','Puissance d’attaque (à distance)  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70380','frFR','armure  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70381','frFR','coup critique  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70382','frFR','défense  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70383','frFR','raté  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70384','frFR','esquive  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70385','frFR','parade  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70386','frFR','blocage  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70387','frFR','valeur de blocage  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70388','frFR','dégâts subis (mêlée)  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70389','frFR','dégâts subis (sorts)  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70390','frFR','plage de dégâts (main droite)  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70391','frFR','multiplicateur de dégâts (main droite)  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70392','frFR','vitesse d’attaque (main droite)  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70393','frFR','plage de dégâts (main gauche)  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70394','frFR','multiplicateur de dégâts (main gauche)  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70395','frFR','vitesse d’attaque (main gauche)  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70396','frFR','plage de dégâts (à distance)  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70397','frFR','multiplicateur de dégâts (à distance)  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70398','frFR','vitesse d’attaque (à distance)  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70399','frFR','min  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70400','frFR','max  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70401','frFR','DPS  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70402','frFR','PV de base  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70403','frFR','PV totaux  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70404','frFR','mana de base  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70405','frFR','mana total  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70406','frFR','mana actuel  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70407','frFR','puissance des sorts  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70408','frFR','régénération de vie/5 bonus  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70409','frFR','régénération de mana/5 hors incantation  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70410','frFR','régénération de mana/5 en incantation  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70411','frFR','hâte  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70412','frFR','toucher  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70413','frFR','expertise  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70414','frFR','pénétration d’armure  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70415','frFR','pénétration des sorts  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70416','frFR','pourcentage  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70417','frFR','sacré  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70418','frFR','feu  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70419','frFR','nature',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70420','frFR','givre  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70421','frFR','ombre  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70422','frFR','arcane  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70423','frFR','résistance  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70424','frFR','états de commande  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70425','frFR','suivre  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70426','frFR','attaquer  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70427','frFR','rester  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70428','frFR','réinitialiser  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70429','frFR','arrêt complet  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70430','frFR','distance de suivi  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70431','frFR','Spécialisation  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70432','frFR','masque de rôles du bot (principal)  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70433','frFR','masque de rôles du bot (récolte)  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70434','frFR','tués en JcJ  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70435','frFR','joueurs  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70436','frFR','Mort   ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70437','frFR',' fois  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70438','frFR','{} (bot) se calme  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70439','frFR','<Debug>  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70440','frFR','Es-tu sûr de vouloir prendre le risque d\\'attirer l\\'attention de  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70441','frFR','?  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70442','frFR','<Inseérer Pièce>  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70443','frFR','Veux-tu tenter de pull  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70444','frFR','<Tenter de faire une offrande>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70445','frFR','Souhaites-tu engager  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70446','frFR','<Embaucher le  bot>  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70447','frFR','Gérer l\\'équipement...  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70448','frFR','Gérer les rôles...  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70449','frFR','Gérer la formation...  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70450','frFR','Gérer les capacités...  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70451','frFR','Gérer les talents...  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70452','frFR','Donner un consommable...  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70453','frFR','<Créer un groupe>  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70454','frFR','<Créer un groupe (tous les bots)>  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70455','frFR','<Ajouter au groupe>  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70456','frFR','<Ajouter tous les bots au groupe>  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70457','frFR','<Retirer du groupe>  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70458','frFR','Suis-moi  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70459','frFR','Tiens ta position  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70460','frFR','Reste ici et ne fais rien  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70461','frFR','J\\'ai besoin de nourriture  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70462','frFR','J\\'ai besoin d\\'eau  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70463','frFR','J\\'ai besoin d\\'une table de rafraîchissements  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70464','frFR','Aide-moi à crocheter une serrure  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70465','frFR','J\\'ai besoin de ta pierre de vie  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70466','frFR','J\\'ai besoin d\\'un puits d\\'âme  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70467','frFR','J\\'ai besoin que tu renouvelles les poisons  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70468','frFR','<Choisir le poison (main droite)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70469','frFR','<Choisir le poison (main gauche)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70470','frFR','J\\'ai besoin que tu renouvelles les enchantements  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70471','frFR','<Choisir l’enchantement (main droite)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70472','frFR','<Choisir l’enchantement (main gauche)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70473','frFR','J\\'ai besoin que tu retires la métamorphose  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70474','frFR','<Choisir le type de familier>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70475','frFR','Tu es renvoyé  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70476','frFR','Vas-tu abandonner   ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70477','frFR','Tu pourrais le regretter…  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70478','frFR','Ressaisis-toi, bordel  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70479','frFR','<Étudier la créature>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70480','frFR','Laisse tomber  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70481','frFR','dist  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70482','frFR','RETOURS',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70483','frFR','<Auto>  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70484','frFR','<Aucun>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70485','frFR','Aléatoire (Ruse)  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70486','frFR','Aléatoire (Férocité)  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70487','frFR','Aléatoire (Ténacité)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70488','frFR','Montre-moi ton inventaire  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70489','frFR','Équipement automatique  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70490','frFR','Main droite  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70491','frFR','Main gauche  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70492','frFR','À distance  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70493','frFR','Relique  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70494','frFR','Tête  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70495','frFR','Épaules  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70496','frFR','Torse  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70497','frFR','Taille  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70498','frFR','Jambes  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70499','frFR','Pieds  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70500','frFR','Poignets  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70501','frFR','Mains  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70502','frFR','Dos  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70503','frFR','Chemise  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70504','frFR','Doigt1  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70505','frFR','Doigt2  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70506','frFR','Bijou1  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70507','frFR','Bijou2  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70508','frFR','Cou  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70509','frFR','Déséquiper tout  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70510','frFR','Mettre à jour l\\'aspect visuel  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70511','frFR','visuel seulement  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70512','frFR','Équipé  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70513','frFR','rien  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70514','frFR','Utilise ton ancien équipement  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70515','frFR','Déséquipe-le  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70516','frFR','Hum... je n\\'ai rien à te donner  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70517','frFR','Récolte  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70518','frFR','État des capacités  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70519','frFR','Gérer les capacités autorisées  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70520','frFR','Utiliser  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70521','frFR','Mettre à jour  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70522','frFR','Dégâts  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70523','frFR','Contrôle  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70524','frFR','Soin  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70525','frFR','Autre  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70526','frFR','  produit un bruit de grincement et commence à te suivre   ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70527','frFR','{} ne te rejoindra pas tant qu\\'il ne sera pas renvoyé par le propriétaire  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70528','frFR','{} ne te rejoindra pas tant que tu n\\'auras pas atteint le niveau 60  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70529','frFR','{} ne te rejoindra pas tant que tu n\\'auras pas atteint le niveau 55  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70530','frFR','{} ne te rejoindra pas tant que tu n\\'auras pas atteint le niveau 40  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70531','frFR','{} ne te rejoindra pas tant que tu n\\'auras pas atteint le niveau 20  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70532','frFR','Tu dépasses le nombre maximal de bots NPC pour ton niveau ({})  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70533','frFR','Tu n\\'as pas assez d\\'argent  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70534','frFR','Tu ne peux pas avoir plus de bots de cette classe ! {} sur {}  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70535','frFR','Impossible de réinitialiser l\\'équipement à l\\'emplacement {} ({}) ! Impossible de renvoyer le bot !  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70536','frFR','actuel  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70537','frFR','Distance d\\'\\'attaque  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70538','frFR','Attaques à courte portée  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70539','frFR','Attaques à longue portée  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70540','frFR','Exact  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70541','frFR','Retirer le buff  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70542','frFR','Corrige ton type de pouvoir  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70543','frFR','Impossible de déséquiper {} pour une raison stupide ! Envoi par courrier  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70544','frFR','Tank  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70545','frFR','À distance  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70546','frFR','Mineur  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70547','frFR','Herboriste  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70548','frFR','Dépeceur  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70549','frFR','Ingénieur  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70550','frFR','La propriété du bot a expiré  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70551','frFR','Le système NpcBot est actuellement désactivé. Veuillez contacter l\\'administration.  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70552','frFR','{} ne vous rejoindra pas, a déjà un maître : {}  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70553','frFR','La banque est pleine  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70554','frFR','Aspect  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70555','frFR','Singe  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70556','frFR','Faucon  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70557','frFR','Guépard  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70558','frFR','Vipère  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70559','frFR','Bête  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70560','frFR','Meute  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70561','frFR','Sauvage  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70562','frFR','Faucon-dragon  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70563','frFR','Aucun Aspect  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70564','frFR','Aura  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70565','frFR','Dévotion  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70566','frFR','Concentration  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70567','frFR','Résistance au Feu  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70568','frFR','Résistance au Givre  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70569','frFR','Résistance à l\\'Ombre  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70570','frFR','Vengeance  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70571','frFR','Croisé  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70572','frFR','Aucune Aura  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70573','frFR','Handicapant  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70574','frFR','Instantané  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70575','frFR','Mortel  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70576','frFR','Blessure  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70577','frFR','Engourdissant  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70578','frFR','Anesthésiant  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70579','frFR','Rien  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70580','frFR','Langue-de-flammes  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70581','frFR','Marque du Givre  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70582','frFR','Fureur des Vents  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70583','frFR','Vie de la Terre  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70584','frFR','J\\'\\'ai besoin de vos services  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70585','frFR','Vous avez trop de bots  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70586','frFR','Souhaitez-vous engager   ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70587','frFR',' est un peu occupé en ce moment, réessayez plus tard.  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70588','frFR','Ravi de faire affaire avec vous  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70589','frFR','Guerriers  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70590','frFR','Paladins  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70591','frFR','Mages  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70592','frFR','Prêtres  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70593','frFR','Démonistes  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70594','frFR','Druides  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70595','frFR','Chevaliers de la Mort  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70596','frFR','Voleurs  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70597','frFR','Chamans  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70598','frFR','Chasseurs  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70599','frFR','Maîtres-lames  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70600','frFR','Destructeurs  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70601','frFR','Archimages  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70602','frFR','Seigneurs du Fléau  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70603','frFR','Brise-sort  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70604','frFR','Rangers sombres  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70605','frFR','Guerrier  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70606','frFR','Paladin  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70607','frFR','Mage  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70608','frFR','Prêtre  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70609','frFR','Démoniste  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70610','frFR','Druide  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70611','frFR','Chevalier de la Mort  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70612','frFR','Voleur  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70613','frFR','Chaman  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70614','frFR','Chasseur  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70615','frFR','Maître-lame  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70616','frFR','Destructeur  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70617','frFR','Archimage  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70618','frFR','Seigneur du Fléau  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70619','frFR','Brise-sort  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70620','frFR','Ranger sombre  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70621','frFR','Masculin  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70622','frFR','Féminin  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70623','frFR','Humain  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70624','frFR','Orc  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70625','frFR','Nain  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70626','frFR','Elfe de la Nuit  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70627','frFR','Mort-vivant  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70628','frFR','Tauren  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70629','frFR','Gnome  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70630','frFR','Troll  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70631','frFR','Elfe de sang  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70632','frFR','Draeneï  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70633','frFR','Inconnu  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70634','frFR','Pillage  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70635','frFR','|cff9d9d9dMédiocre|r  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70636','frFR','|cffffffffCommun|r  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70637','frFR','|cff1eff00Non commun|r  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70638','frFR','|cff0070ddRare|r  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70639','frFR','|cffa335eeÉpique|r  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70640','frFR','|cffff8000Légendaire|r  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70641','frFR','Comportement d\\'engagement  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70642','frFR','Retarder l\\'attaque de  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70643','frFR','Retarder la guérison de  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70644','frFR','s  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70645','frFR','Off-Tank  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70646','frFR','Nécromanciens  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70647','frFR','Nécromancien  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70648','frFR','Angle d\\'attaque  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70649','frFR','Normal  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70650','frFR','Éviter la zone d\\'effet frontale  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70651','frFR','NIY  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70652','frFR','Es-tu sûr que ça va marcher ? Ça doit être la meilleure eau du monde...  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70653','frFR','Il semble que tu pourrais vraiment avoir besoin d\\'une gorgée d\\'eau fraîche.  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70654','frFR','Sorcières des Mers  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70655','frFR','Sorcière des Mers  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70656','frFR','Mana par dégât  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70657','frFR','Dégât par mana  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70658','frFR','Transmogrification...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70659','frFR','Désactiver le positionnement de combat',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70660','frFR','Cible prioritaire',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70661','frFR','Banque d’équipement du bot...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70662','frFR','Déposer des objets...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70663','frFR','Retirer des objets...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70664','frFR','La banque est vide',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70665','frFR','Page précédente',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70666','frFR','Page suivante',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70667','frFR','Voulez-vous vraiment dépenser tout cet argent pour faire bouger à nouveau le Seigneur des Cryptes ?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70668','frFR','Je doute de ta capacité à faire beaucoup de mal dans ton état actuel, mais je suis prêt à te guider et à t\\'aider à restaurer tes pouvoirs.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70669','frFR','Crypt Lords',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70670','frFR','Crypt Lord',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70671','frFR','Renvoi',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70672','frFR','Sauterelles',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70673','frFR','Seuil de santé de la cible',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70674','frFR','J\\'ai besoin d\\'un portail',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70675','frFR','Hurlevent',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70676','frFR','Forgefer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70677','frFR','Darnassus',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70678','frFR','Exodar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70679','frFR','Orgrimmar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70680','frFR','Fossoyeuses',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70681','frFR','Les Pitons-du-Tonnerre',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70682','frFR','Lune d\\'Argent',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70683','frFR','Shattrath',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70684','frFR','Dalaran',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70685','frFR','Vous dépassez le nombre maximal de npcbots pour votre compte ({} >= {})',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70686','frFR','<Définir pour tous les bots>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70687','frFR','(banque d’équipement)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70688','frFR','Pas assez d\\'espace dans la banque d\\'équipement pour stocker %u objet(s) (%u / %u) !',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70689','frFR','Ensembles d’équipement',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70690','frFR','Créer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70691','frFR','Supprimer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70692','frFR','Equiper',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70693','frFR','manquant',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);\n"
  },
  {
    "path": "AC/SQL/locales/ruRU/npc_text_locale.sql",
    "content": "DELETE FROM `npc_text_locale` WHERE `Locale`='ruRU' AND `ID` BETWEEN '70000' AND '71000';\nINSERT INTO `npc_text_locale` (`ID`, `Locale`, `Text0_0`, `Text0_1`, `Text1_0`, `Text1_1`, `Text2_0`, `Text2_1`, `Text3_0`, `Text3_1`, `Text4_0`, `Text4_1`, `Text5_0`, `Text5_1`, `Text6_0`, `Text6_1`, `Text7_0`, `Text7_1`)\nVALUES\n('70001','ruRU','Я живу только для того, чтобы служить хозяину!','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70002','ruRU','Тебе что-то нужно?','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70003','ruRU','Смертные... обычно я убиваю тварей вроде тебя как только увижу!','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70004','ruRU','<Перед вами, похоже, обсидиановый разрушитель. Этот, впрочем, выглядит иначе, поврежденный и поблекший, он не реагирует на ваше присутствие. Вам помнится Плеть когда-то давно использовала таких. Как, черт возьми, он оказался здесь? При дальнейшем осмотре вы замечаете щель на его спине.>','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70005','ruRU','<Обсидиановый Разрушитель смотрит на вас и издает глубокий рычащий звук.>','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70006','ruRU','Ты удивлен, смертный? Как низший натрезим, я вынужден прибегать к поиску союзников. Ты выглядишь так, будто сможешь меня хотя бы развлечь.','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70007','ruRU','Ну что ещё, смертный?','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70008','ruRU','Ты можешь просто оставить меня в покое? <вздох>','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70009','ruRU','Что теперь?','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70010','ruRU','<Вы видите истощенную предводительницу наг. Она выглядит усталой и слабой, и пытается не смотреть на вас.>$B$BНе нуж-жно с-с-слов, с-с-смертный...','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70011','ruRU','У меня опять что-то не так с-с причёс-ской? <Она расчесывает свои \"волосы\">$B... Нет, вс-сё в порядке. Так в чём же дело?','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70101','ruRU','|cffff3300Мастер Клинка|r$b|cffdd6600-=отсылка к Warcraft III=-|r$B$B\"Элитный мечник, бывший член клана Пылающего Клинка, ныне элитный воин ​​Орды\".$B$BОсновная характеристика: Ловкость.$B$BПуть Пустоты (Прогулка с ветром). Позволяет Мастеру клинка становиться невидимым и двигаться быстрее в течение определенного времени. Если Мастер клинка атакует врага, выходя из невидимости, он наносит дополнительный урон.$B$BЗеркальное изображение. Сбивает противника с толку, создавая иллюзию Мастера клинка и рассеивая всю магию Мастера клинка.$B$BКритический удар (пассивный). Дает 15% шанс нанести критический урон в 2(3,4) раза больше обычного при атаках.$B$BВихрь клинков (NIY). Дает иммунитет к магии и наносит урон всем окружающим врагам.$B$B','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70102','ruRU','|cff9900ccОбсидиановый Разрушитель|r$b|cffdd6600-=отсылка к Warcraft III=-|r$B$B\"Крылатое чудовище из обсидиана, обладающее ненасытной жаждой магии\".$B$BКрепкая броня, очень высокое сопротивление, частичный иммунитет к магии, постоянно теряет ману, пассивные эффекты регенерации маны для него бесполезны, кольчужная/латная броня, использует жезлы в обоих руках, наносит урон темной магией, нет физической атаки, не может атаковать во время перемещения, бонус к силе заклинаний: 50% силы атаки + 200% интеллекта + урон жезлов.$B$BПожирание магии. Снимает до 2 магических эффектов с врагов, до 2 магических эффектов и до 2 проклятий с союзников и наносит урон призванным юнитам в радиусе 20 м. Каждый развеянный эффект восстанавливает 20% маны и 5% здоровья, время восстановления 7 секунд.$B$BТеневой взрыв. Усиленная атака, наносящая повышенный урон по площади.$B$BВытягивание маны. Вытягивает всю ману (ограниченную запасом маны заклинателя) из случайного дружественного юнита.$B$BПополнить запасы маны. Восполняет манну окружающим участникав группы и рейда в радиусе 25 ярдов на 3% от их максимального запаса, сводя на нет ману заклинателя, время восстановления 3 секунды.$B$BАура восстановления. Исцеляет окружающих членов группы и рейда в радиусе 25 м на 3% от их максимального запаса здоровья, сводя на нет ману заклинателя, время восстановления 3 секунды.$B$BТемная броня (пассивная). Восстанавливает ману в размере процента от полученного урона.$B$B','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70103','ruRU','|cff0000ddАрхимаг|r$b|cffdd6600-=отсылка к Warcraft III=-|r$B$B Получаемый урон от заклинаний уменьшен на 35%, частично невосприимчив к эффектам контроля, тканевая броня, наносит урон от магии огня/льда, нет физической атаки, бонус к силе заклинаний: 100% интеллекта. Основная характеристика: Интеллект.$B$BСнежная буря. Обычная снежная буря, только немного мощнее, время восстановления 6 секунд.$B$BПризыв элементаля воды. Призывает элементаля воды, который атакует врагов архимага. Время восстановления: 1 мин., 20 сек.$B$BАура великолепия. Увеличивает максимальный запас маны на 10% и значительно увеличивает регенерацию маны участников группы и рейда в радиусе 40 м.$B$BM Массовая телепортация. NIY.$B$B','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70104','ruRU','|cff9900ccПовелитель Ужаса|r$b|cffdd6600-=отсылка к Warcraft III=-|r$B$B\"Невероятно могущественный демон, владеющий силами тьмы и управления разумом\".$B$BКрепкая броня, высокое сопротивление, частичная невосприимчивость к эффектам контроля, получаемый урон ускоряет перезарядку заклинаний, латная броня, наносит урон в ближнем бою а также урон от темной магии, дополнительный урон по целям выведенным из равновесия, бонус к силе заклинаний: 200% силы. Основная характеристика: Сила.$B$BТемная Стая. Посылает стаю летучих мышей наносящих урон от магии в конусе перед собой, не может нанести критический урон, время восстановления 10 секунд.$B$BСон. Погружает вражескую цель в сон на 60 секунд и позволяет при наненсения урона следующей физической атаке этой цели игнорировать ее броню, нанесенный прямой урон пробудит цель, время восстановления 6 секунд.$B$BАура вампиризма. Увеличивает физический критический урон на 5% и исцеляет членов группы и рейда в радиусе 40 м в процентном соотношении (100% для Повелителя ужаса и 25% для всех остальных) от урона, нанесенного физическими атаками в ближнем бою и Темной Стаей, без угрозы.$B$BПризыв Инфернала. Призывает инфернала с неба на 180 секунд, нанося урон и оглушая врагов, инфернал очень устойчив к магии, время восстановления 180 секунд.$B$B','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70105','ruRU','|cff0000ddРазрушитель Заклинаний|r$b|cffdd6600-=отсылка к Warcraft III=-|r$B$B\"Эльфийский воин, специально обученный разрушать и искажать магию\".$B$BУрон, получаемый от заклинаний, уменьшен на 75%, частично невосприимчив к эффектам контроля, штраф за броню -30%, кольчужная/латная броня, наносит урон в ближнем бою и урон от тайной магии, бонус к силе заклинаний: 200% силы. Основная характеристика: Сила.$B$BПохищение Магии. Похищает полезное заклинание у врага и передаёт его ближайшему союзнику или снимает отрицательное заклинание с союзника на ближайшего врага, влияет на эффекты магии и проклятия, время восстановления 2 секунды.$B$BСожжение Маны (пассивная). Успешные атаки ближнего боя сжигают ману цели, равную нанесенному урону (увеличенному силой заклинаний), нанося урон от тайной магии. Если мана цели исчерпана, атаки ближнего боя Разрушителя Заклинаний будут наносить тройной урон с повышенным шансом критического удара. Если у цели нет маны, Разрушитель Заклинаний восполнит ману в количестве 25% от нанесенного урона.$B$B','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70106','ruRU','|cff9900ccТемная Охотница|r$b|cffdd6600-=отсылка к Warcraft III=-|r$B$B\"Бывшая охотница Кель\\'Таласа, насильно возвращённая из мира мёртвых\".$B$B Получаемый урон от заклинаний уменьшен на 35%, нежить, частично невосприимчива к эффектам контроля, кожаная/тканевая броня, наносит физический урон/урон от темной магии, придерживается теней и не генерирует угрозы, бонус к силе заклинаний: 50% интеллекта. Основное характеристика: Ловкость.$B$BБезмолвие. Заставляет врага и до 4 его ближайших друзей замолчать на 8 секунд, теряя возможность применять заклинания, время восстановления 15 секунд.$B$BЧерная стрела. Выпускает проклятую стрелу, наносящую 150% урона от оружия и дополнительный урон от темной магии каждые несколько секунд. Если цель умирает от урона Темной Охотницы, она превратится в Тёмного Приспешника (максимум 5 приспешников, продолжительность 80 секунд, срабатывает только на гуманоидах, зверях и драконах). Наносит пятикратный урон, если у цели меньше 20% здоровья.$B$Bпохищение Жизни. Высасывает здоровье врага каждую секунду в течение 5 секунд, исцеляя Темную Охотницу на 200% от похищенного количества.$B$B','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70107','ruRU','|cff9900ccНекромант|r$b|cffdd6600-=отсылка к Warcraft III / Diablo II=-|r$B$BПолучаемый урон от заклинаний уменьшен на 20%, частично невосприимчив к эффектам контроля, тканевая броня, наносит урон от темной магии, нет физической атаки, бонус к силе заклинаний: интеллект 100%. Основная характеристика: Интеллект.$B$BВоскрешение Мертвых. Поднимает 2 скелета из трупа (максимум 6 скелетов, продолжительность 65 секунд, работает только с гуманоидами, зверями и драконами).$B$BНечестивое Бешенство. Увеличивает скорость атаки цели в ближнем бою на 75%, но постоянно истощает здоровье. Длится 45 секунд. Не может быть отменено. Разблокируется на 30 уровне.$B$BВзрыв Трупа. Заставляет труп взорваться, нанося урон в размере от 35% до 75% от максимального здоровья мертвого существа (зависит от уровня Некроманта) всем окружающим врагам. Этот урон не генерирует угрозы. Разблокируется на 40 уровне.$B$BУвечье. Снижает скорость передвижения цели, скорость атаки в ближнем бою и общую силу на 50% на 60 секунд. Разблокируется на уровне 50.$B$B','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70108','ruRU','|cff0000ddМорская Ведьма|r$b|cffdd6600-=отсылка к Warcraft III=-|r$B$B\"Грозная колдунья наг, часто ассоциирующаяся с приходом ужасных штормов\".$B$BПолучаемый урон от заклинаний уменьшен на 30%, частично невосприимчив к эффектам контроля, тканевая броня, наносит физический урон/урон от магии льда, бонус к силе атаки: ловкость x2, бонус к силе заклинаний: 200% к интеллекту. Основная характеристика: Интеллект.$B$BРаздвоенная молния. Вызывает разветвлённую молнию, наносящую урон врагам. Поражает от 2 до всех целей (в зависимости от уровня Морской Ведьмы), оглушая их на 2 секунды. Этот урон не создает угрозы.$B$BЛедяные Стрелы. Наполняет стрелу магическим морозом для дополнительного урона, снижая скорость движения цели, скорость атаки и произнесения заклинаний на 30-70% (в зависимости от уровня Морской ведьмы).$B$BЩит Маны. Создает щит, который поглощает 100% входящего (не смягченного) урона, используя ману Морской Ведьмы. Эффект варьируется от 1 единицы урона за 10 единиц маны до 10 единиц урона за 1 единицу ману (в зависимости от уровня Морской Ведьмы).$B$BТорнадо. Вызывает яростный торнадо, который наносит урон и замедляет ближайших врагов, иногда полностью выводя их из строя. На открытом пространстве Торнадо со временем разрастается, увеличивая наносимый урон и область действия, но в закрытом помещении уменьшается и быстро рассеивается. Разблокируется на уровне 60.$B$BНага (пассивный эффект). Скорость плавания, урон и шанс уклонения значительно увеличиваются в воде.$B$B','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70201','ruRU','Всегда найдутся чуваки, готовые убить за деньги.','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70202','ruRU','Наёмники востребованы всегда. Вот кто доступен прямо сейчас.','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70203','ruRU','Наёмники востребованы всегда. Вот кто доступен прямо сейчас.','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70204','ruRU','Похоже сейчас никого нет, проверь позже.','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70300','ruRU','Умри!','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70301','ruRU','Воскрешаю тебя','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70302','ruRU','Воскрешаю ','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70303','ruRU','твой бот','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70304','ruRU',' бот','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70305','ruRU','Я пока не могу применить заклинание создания воды','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70306','ruRU','Я пока не могу применить заклинание создания еды','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70307','ruRU','Я не могу сделать это сейчас','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70308','ruRU','Во-о-от...','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70309','ruRU','Отключено','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70310','ruRU','Ещё не готово','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70311','ruRU','Неверный тип объекта','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70312','ruRU','Не удалось','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70313','ruRU','Готово','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70314','ruRU','Я не изменил форму','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70315','ruRU','У меня нет камня здоровья','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70316','ruRU','Я пока не могу создавать камни здоровья!','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70317','ruRU','WTF у меня нет отмычек!','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70318','ruRU','Мой уровень навыка недостаточно высок','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70319','ruRU','Меняю специализацию на ','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70320','ruRU','Оружие','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70321','ruRU','Неистовство','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70322','ruRU','Защита','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70323','ruRU','Воздаяние','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70324','ruRU','Повелитель зверей','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70325','ruRU','Стрельба','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70326','ruRU','Выживание','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70327','ruRU','Ликвидация','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70328','ruRU','Бой','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70329','ruRU','Скрытность','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70330','ruRU','Послушание','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70331','ruRU','Свет','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70332','ruRU','Тьма','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70333','ruRU','Кровь','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70334','ruRU','Лёд','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70335','ruRU','Нечестивость','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70336','ruRU','Стихии','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70337','ruRU','Совершенствование','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70338','ruRU','Исцеление','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70339','ruRU','Тайная магия','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70340','ruRU','Огонь','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70341','ruRU','Колдовство','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70342','ruRU','Демонология','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70343','ruRU','Разрушение','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70344','ruRU','Баланс','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70345','ruRU','Сила зверя','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70346','ruRU','Неизвестно','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70347','ruRU','Проваливай, слабак','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70348','ruRU',' не убеждён','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70349','ruRU','Я не собираюсь тратить свое время на всякую ерунду','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70353','ruRU','Я готов','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70354','ruRU','Уходи. Я служу своему хозяину ','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70355','ruRU','неизвестный','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70356','ruRU',' на тебя!','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70357','ruRU',' на себя!','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70358','ruRU',' на ','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70359','ruRU',' использовано!','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70360','ruRU','бот-танк','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70361','ruRU','класс','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70362','ruRU','игрок','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70363','ruRU','владелец','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70364','ruRU','никто','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70365','ruRU','Уровень','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70366','ruRU','талант','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70367','ruRU','пассивный','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70368','ruRU','скрытый','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70369','ruRU','изучен','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70370','ruRU','способность','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70371','ruRU','сила','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70372','ruRU','ловкость','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70373','ruRU','выносливость','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70374','ruRU','интеллект','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70375','ruRU','дух','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70376','ruRU','неизвестный стат','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70377','ruRU','всего','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70378','ruRU','Сила атаки ближний бой','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70379','ruRU','Сила атаки дальний бой','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70380','ruRU','броня','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70381','ruRU','крит','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70382','ruRU','защита','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70383','ruRU','промах','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70384','ruRU','уклонение','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70385','ruRU','парирование','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70386','ruRU','блок','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70387','ruRU','показатель блокирования','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70388','ruRU','Получаемый урон в ближнем бою','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70389','ruRU','Получаемый урон от заклинаний','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70390','ruRU','Разброс урона оружия в правой руке','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70391','ruRU','Множитель урона оружия в правой руке','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70392','ruRU','Скорость атаки оружием в правой руке','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70393','ruRU','Разброс урон оружия в левой руке','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70394','ruRU','Множитель урона оружия в левой руке','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70395','ruRU','Скорость атаки оружием в левой руке','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70396','ruRU','Разброс урона оружия дальнего боя','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70397','ruRU','Множитель урона оружия дальнего боя','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70398','ruRU','Скорость атаки оружием дальнего боя','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70399','ruRU','минимум','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70400','ruRU','максимум','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70402','ruRU','базовый уровень здоровья','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70403','ruRU','всего здоровья','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70404','ruRU','базовый уровень маны','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70405','ruRU','всего маны','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70406','ruRU','текущий запас маны','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70407','ruRU','сила заклинаний','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70408','ruRU','бонус регенерации здоровья_5','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70409','ruRU','регенерация маны_5 без использования заклинания','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70410','ruRU','регенерация маны_5 при использовании заклинания','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70411','ruRU','скорость','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70412','ruRU','меткость','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70413','ruRU','мастерство','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70414','ruRU','пробивание брони','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70415','ruRU','проникновение заклинаний','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70416','ruRU','проц.','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70417','ruRU','святлая магия','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70418','ruRU','магия огня','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70419','ruRU','силы природы','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70420','ruRU','магия льда','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70421','ruRU','темная магия','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70422','ruRU','тайная магия','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70423','ruRU','Сопротивление','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70424','ruRU','Состояния команд','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70425','ruRU','Следовать','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70426','ruRU','Атаковать','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70427','ruRU','Стоять','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70428','ruRU','Сброс','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70429','ruRU','Полная остановка','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70430','ruRU','Дистанция следования','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70431','ruRU','Специализация','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70432','ruRU','Маска ролей ботов (главная)','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70433','ruRU','Маска ролей ботов (сбор)','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70434','ruRU','PvP-убийства','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70435','ruRU','игроки','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70436','ruRU','Умер ','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70437','ruRU',' раз','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70438','ruRU','%s (бот) успокаивается','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70439','ruRU','<Отладка>','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70440','ruRU','Вы уверены, что хотите рискнуть, привлекая внимание ','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70441','ruRU','?','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70442','ruRU','<Вставить монету>','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70443','ruRU','Вы хотите приманить ','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70444','ruRU','<Попробовать сделать подношение>','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70445','ruRU','Вы хотите нанять ','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70446','ruRU','<Нанять бота>','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70447','ruRU','Снаряжение...','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70448','ruRU','Роли...','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70449','ruRU','Построение...','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70450','ruRU','Способности...','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70451','ruRU','Специализация...','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70452','ruRU','Дать использовать...','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70453','ruRU','<Создать группу>','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70454','ruRU','<Создать группу (все боты)>','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70455','ruRU','<Добавить в группу>','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70456','ruRU','<Добавить всех ботов в группу>','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70457','ruRU','<Удалить из группы>','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70458','ruRU','Следуй за мной','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70459','ruRU','Удерживай позицию','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70460','ruRU','Стой здесь и ничего не делай','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70461','ruRU','Мне нужна еда','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70462','ruRU','Мне нужна вода','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70463','ruRU','Мне нужен стол с едой','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70464','ruRU','Помоги мне взломать замок','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70465','ruRU','Мне нужен камень здоровья','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70466','ruRU','Мне нужен источник душ','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70467','ruRU','Мне нужно, чтобы ты обновил яды','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70468','ruRU','<Выберите яд (правая рука)>','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70469','ruRU','<Выберите яд (левая рука)>','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70470','ruRU','Мне нужно, чтобы ты обновил чары','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70471','ruRU','<Выберите чары (правая рука)>','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70472','ruRU','<Выберите чары (левая рука)>','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70473','ruRU','Мне нужно, чтобы ты вышел из формы','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70474','ruRU','<Выбрать тип питомца>','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70475','ruRU','Свободен отсюда','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70476','ruRU','Вы действительно хотите уволить ','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70477','ruRU','Вы можете пожалеть об этом...','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70478','ruRU','Соберись, тряпка','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70479','ruRU','<Рассмотреть существо>','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70480','ruRU','Ладно, не важно','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70481','ruRU','дист.','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70482','ruRU','НАЗАД','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70483','ruRU','<Авто>','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70484','ruRU','<Нет>','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70485','ruRU','Случайный (Хитрость)','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70486','ruRU','Случайный (Свирепость)','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70487','ruRU','Случайный (Упорство)','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70488','ruRU','Покажи мне свой инвентарь','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70489','ruRU','Автовыбор','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70490','ruRU','Правая рука','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70491','ruRU','Левая рука','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70492','ruRU','Дальний бой','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70493','ruRU','Реликвия','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70494','ruRU','Голова','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70495','ruRU','Плечи','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70496','ruRU','Грудь','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70497','ruRU','Пояс','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70498','ruRU','Ноги','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70499','ruRU','Ступни','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70500','ruRU','Запястья','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70501','ruRU','Кисти рук','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70502','ruRU','Спина','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70503','ruRU','Рубашка','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70504','ruRU','Палец1','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70505','ruRU','Палец2','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70506','ruRU','Аксессуар1','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70507','ruRU','Аксессуар2','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70508','ruRU','Шея','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70509','ruRU','Снять все','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70510','ruRU','Обновить внешний вид','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70511','ruRU','только внешний вид','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70512','ruRU','Надето','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70513','ruRU','ничего','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70514','ruRU','Используй свое старое cнаряжение','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70515','ruRU','Снять','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70516','ruRU','Хм... мне нечего тебе дать','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70517','ruRU','Сбор ингредиентов','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70518','ruRU','Статус способностей','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70519','ruRU','Разрешённые способности','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70520','ruRU','Используй ','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70521','ruRU','Обновить','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70522','ruRU','Урон','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70523','ruRU','Контроль','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70524','ruRU','Лечение','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70525','ruRU','Другое','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70526','ruRU',' издает скрежет и начинает следовать за ','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70527','ruRU','%s не присоединится к вам, пока владелец не уволит','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70528','ruRU','%s не присоединится к вам, пока вы не достигнете 60-го уровня','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70529','ruRU','%s не присоединится к вам, пока вы не достигнете 55-го уровня','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70530','ruRU','%s не присоединится к вам, пока вы не достигнете 40-го уровня','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70531','ruRU','%s не присоединится к вам, пока вы не достигнете 20-го уровня','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70532','ruRU','Вы превысили максимальное количество ботов (%u)','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70533','ruRU','У вас недостаточно денег','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70534','ruRU','У вас не может быть больше ботов этого класса! %u из %u','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70535','ruRU','Не удается сбросить снаряжение в слоте %u (%s)! Не могу уволить бота!','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70536','ruRU','сейчас','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70537','ruRU','Дистанция атаки','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70538','ruRU','Короткая дистанция','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70539','ruRU','Длинная дистанция','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70540','ruRU','Заданная','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70541','ruRU','Снять бафф','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70542','ruRU','Исправь тип энергии','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70543','ruRU','Не могу снять %s по какой-то идиотской причине! Отправляю по почте','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70544','ruRU','Танк','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70545','ruRU','Дальний бой','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70546','ruRU','Горное дело','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70547','ruRU','Травничество','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70548','ruRU','Снятие шкур','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70549','ruRU','Инженерное дело','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70550','ruRU','Срок владения ботом истек из-за бездействия','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70551','ruRU','Система NpcBot в данный момент отключена. Пожалуйста, обратитесь к администратору','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70552','ruRU','%s не присоединится к вам, уже есть владелец: %s','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70553','ruRU','%s не может присоединиться к вам: телепортируется','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70554','ruRU','Дух','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70555','ruRU','Обезьяна','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70556','ruRU','Ястреб','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70557','ruRU','Гепард','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70558','ruRU','Гадюка','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70559','ruRU','Зверь','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70560','ruRU','Стая','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70561','ruRU','Дикий','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70562','ruRU','Дракондор','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70563','ruRU','Нет духа','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70564','ruRU','Аура','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70565','ruRU','Благочестие','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70566','ruRU','Сосредоточенность','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70567','ruRU','Защита от огня','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70568','ruRU','Защита от магии льда','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70569','ruRU','Защита от темной магии','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70570','ruRU','Воздаяние','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70571','ruRU','Воин света','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70572','ruRU','Нет ауры','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70573','ruRU','Калечащий','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70574','ruRU','Быстродействующий','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70575','ruRU','Смертельный','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70576','ruRU','Нейтрализующий','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70577','ruRU','Дурманящий','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70578','ruRU','Анестезирующий','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70579','ruRU','Ничего','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70580','ruRU','Языки пламени','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70581','ruRU','Ледяное клеймо','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70582','ruRU','Неистовство ветра','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70583','ruRU','Жизнь земли','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70584','ruRU','Мне нужны твои услуги','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70585','ruRU','У тебя слишком много ботов','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70586','ruRU','Вы хотите нанять ','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70587','ruRU',' сейчас немного занят, повторите попытку позже.','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70588','ruRU','Приятно иметь с тобой дело','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70589','ruRU','Воины','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70590','ruRU','Паладины','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70591','ruRU','Маги','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70592','ruRU','Жрецы','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70593','ruRU','Чернокнижники','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70594','ruRU','Друиды','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70595','ruRU','Рыцари Смерти','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70596','ruRU','Разбойники','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70597','ruRU','Шаманы','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70598','ruRU','Охотники','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70599','ruRU','Мастера Клинка','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70600','ruRU','Разрушители','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70601','ruRU','Архимаги','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70602','ruRU','Повелители Ужаса','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70603','ruRU','Разрушители Заклинаний','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70604','ruRU','Тёмные Охотницы','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70605','ruRU','Воин','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70606','ruRU','Паладин','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70607','ruRU','Маг','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70608','ruRU','Жрец','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70609','ruRU','Чернокнижник','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70610','ruRU','Друид','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70611','ruRU','Рыцарь смерти','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70612','ruRU','Разбойник','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70613','ruRU','Шаман','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70614','ruRU','Охотник','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70615','ruRU','Мастер Клинка','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70616','ruRU','Разрушитель','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70617','ruRU','Архимаг','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70618','ruRU','Повелитель Ужаса','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70619','ruRU','Разрушитель Заклинаний','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70620','ruRU','Темная Охотница','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70621','ruRU','Мужчина','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70622','ruRU','Женщина','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70623','ruRU','Человек','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70624','ruRU','Орк','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70625','ruRU','Гном','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70626','ruRU','Ночной эльф','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70627','ruRU','Нежить','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70628','ruRU','Таурен','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70629','ruRU','Гном','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70630','ruRU','Тролль','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70631','ruRU','Эльф крови','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70632','ruRU','Дреней','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70633','ruRU','Неизвестно','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70634','ruRU','Сбор добычи','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70635','ruRU','|cff9d9d9dПлохой|r','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70636','ruRU','|cffffffffОбычный|r','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70637','ruRU','|cff1eff00Необычный|r','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70638','ruRU','|cff0070ddРедкий|r','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70639','ruRU','|cffa335eeЭпический|r','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70640','ruRU','|cffff8000Легендарный|r','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70641','ruRU','Активное действие','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70642','ruRU','Задержка атаки на','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70643','ruRU','Задержка лечения на','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70644','ruRU','с','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70645','ruRU','Off-танк (второй танк)','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70646','ruRU','Некроманты','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70647','ruRU','Некромант','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70648','ruRU','Позиционирование в дальнем бою','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70649','ruRU','Обычное','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70650','ruRU','Избегать фронтального АОЕ','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70652','ruRU','Вы уверены, что это сработает? Это должна быть самая лучшая вода в мире...','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70653','ruRU','Похоже, тебе не помешает хороший глоток свежей воды.','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70654','ruRU','Морские Ведьмы','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70655','ruRU','Морская Ведьма','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70656','ruRU','Маны на единицу урона','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70657','ruRU','Урона на еденицу маны','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70658','ruRU','Трансмогрификация...','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70659','ruRU','Отключить боевое позиционирование',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70660','ruRU','Приоритетная цель',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70661','ruRU','Банковское хранилище бота...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70662','ruRU','Положить предметы...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70663','ruRU','Забрать предметы...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70664','ruRU','Банк пуст',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70665','ruRU','Предыдущая страница',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70666','ruRU','Следующая страница',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70667','ruRU','Ты действительно хочешь потратить столько золота, чтобы снова поднять Властелина Крипт?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70668','ruRU','Сомневаюсь, что ты можешь нанести много урона в своём нынешнем состоянии, но я готов направить тебя и помочь восстановить свои силы.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70669','ruRU','Властелины Крипт',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70670','ruRU','Властелин Крипт',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70671','ruRU','Уволить',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70672','ruRU','Саранча',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70673','ruRU','Порог здоровья цели',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70674','ruRU','Мне нужен портал',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70675','ruRU','Штормград',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70676','ruRU','Стальгорн',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70677','ruRU','Дарнасс',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70678','ruRU','Экзодар',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70679','ruRU','Оргриммар',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70680','ruRU','Подгород',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70681','ruRU','Громовой Утёс',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70682','ruRU','Луносвет',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70683','ruRU','Шаттрат',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70684','ruRU','Даларан',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70685','ruRU','Вы превысили максимальное количество npcbot для вашей учётной записи ({} >= {})',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70686','ruRU','<Применить ко всем ботам>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70687','ruRU','(банк снаряжения)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70688','ruRU','Недостаточно места в банке снаряжения для хранения %u предмет(ов) (%u / %u)!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70689','ruRU','Наборы снаряжения',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70690','ruRU','Создать',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70691','ruRU','Удалить',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70692','ruRU','Экипировать',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70693','ruRU','отсутствует',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);\n"
  },
  {
    "path": "AC/SQL/locales/zhCN/creature_template_locale.sql",
    "content": "DELETE FROM `creature_template_locale` WHERE `entry`=70595 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70595, 'zhCN', '蝗虫', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70594 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70594, 'zhCN', '腐尸甲虫', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70593 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70593, 'zhCN', '腐尸甲虫', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70592 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70592, 'zhCN', '腐尸甲虫', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70591 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70591, 'zhCN', '荷鲁斯明', '机动 地穴领主', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70590 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70590, 'zhCN', '阿拉克-阿拉姆', '机动 地穴领主', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70589 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70589, 'zhCN', '翡若斯', '机动 地穴领主', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70588 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70588, 'zhCN', '厄努比洛斯', '机动 地穴领主', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70587 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70587, 'zhCN', '图坦阿拉克', '机动 地穴领主', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70586 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70586, 'zhCN', '龙卷风', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70585 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70585, 'zhCN', '恰利布迪沙', '机动 深渊海巫', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70584 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70584, 'zhCN', '灰云', '机动 深渊海巫', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70583 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70583, 'zhCN', '小丽', '机动 深渊海巫', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70582 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70582, 'zhCN', '毒蛇娜', '机动 深渊海巫', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70581 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70581, 'zhCN', '康德拉', '机动 深渊海巫', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70580 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70580, 'zhCN', '骷髅', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70579 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70579, 'zhCN', '德罗萨姆', '机动 死灵法师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70578 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70578, 'zhCN', '丰磨', '机动 死灵法师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70577 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70577, 'zhCN', '赫克斯尔', '机动 死灵法师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70576 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70576, 'zhCN', '罗希克', '机动 死灵法师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70575 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70575, 'zhCN', '帕卡', '机动 死灵法师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70574 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70574, 'zhCN', '黑暗使徒', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70573 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70573, 'zhCN', '暗影使徒', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70572 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70572, 'zhCN', '丽拉', '机动 黑暗游侠', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70571 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70571, 'zhCN', '达莉丝', '机动 黑暗游侠', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70570 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70570, 'zhCN', '伊娃', '机动 黑暗游侠', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70569 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70569, 'zhCN', '谭', '机动 黑暗游侠', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70568 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70568, 'zhCN', '玛拉', '机动 黑暗游侠', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70567 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70567, 'zhCN', '涅什达', '机动 破法者', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70566 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70566, 'zhCN', '丹斯德', '机动 破法者', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70565 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70565, 'zhCN', '凯尔诺', '机动 破法者', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70564 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70564, 'zhCN', '纳森', '机动 破法者', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70563 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70563, 'zhCN', '伊诺尔', '机动 破法者', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70562 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70562, 'zhCN', '炼狱', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70561 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70561, 'zhCN', '拉马罗特', '机动 恐惧魔王', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70560 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70560, 'zhCN', '罗特修斯', '机动 恐惧魔王', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70559 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70559, 'zhCN', '扎拉蒙', '机动 恐惧魔王', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70558 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70558, 'zhCN', '恶魔罗斯', '机动 恐惧魔王', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70557 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70557, 'zhCN', '尼罗斯', '机动 恐惧魔王', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70556 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70556, 'zhCN', '水元素', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70555 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70555, 'zhCN', '迪崔', '机动 高阶法师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70554 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70554, 'zhCN', '阿默', '机动 殁境神蚀者', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70553 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70553, 'zhCN', '欧西斯', '机动 殁境神蚀者', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70552 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70552, 'zhCN', '剑圣', '机动 剑圣', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70551 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70551, 'zhCN', '戈克拉马托', '机动 剑圣', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70545 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70545, 'zhCN', '树人', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70544 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70544, 'zhCN', '水元素', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70543 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70543, 'zhCN', '灵狼', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70542 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70542, 'zhCN', '暗影恶魔', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70538 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70538, 'zhCN', '升起食尸鬼', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70537 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70537, 'zhCN', '虫子', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70536 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70536, 'zhCN', '犀牛', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70535 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70535, 'zhCN', '魔暴龙', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70534 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70534, 'zhCN', '核心犬', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70533 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70533, 'zhCN', '灵兽', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70532 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70532, 'zhCN', '奇美拉', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70531 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70531, 'zhCN', '蛰鞭兽', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70530 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70530, 'zhCN', '扭曲潜行者', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70529 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70529, 'zhCN', '鳄鱼兽', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70528 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70528, 'zhCN', '螃蟹', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70527 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70527, 'zhCN', '猪', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70526 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70526, 'zhCN', '熊', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70525 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70525, 'zhCN', '大猩猩', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70524 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70524, 'zhCN', '乌龟', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70523 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70523, 'zhCN', '天蝎灵', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70522 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70522, 'zhCN', '特罗莫斯', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70521 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70521, 'zhCN', '黄蜂', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70520 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70520, 'zhCN', '鬣狗', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70519 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70519, 'zhCN', '猫', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70518 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70518, 'zhCN', '高大步行者', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70517 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70517, 'zhCN', '狼', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70516 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70516, 'zhCN', '猛禽', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70515 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70515, 'zhCN', '腐肉鸟', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70514 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70514, 'zhCN', '孢子蝙', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70513 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70513, 'zhCN', '虚空鳐', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70512 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70512, 'zhCN', '龙鹰', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70511 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70511, 'zhCN', '毁灭者', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70510 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70510, 'zhCN', '风蛇', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70509 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70509, 'zhCN', '蝙蝠', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70508 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70508, 'zhCN', '掠食之鸟', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70507 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70507, 'zhCN', '毒蛇', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70506 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70506, 'zhCN', '蜘蛛', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70505 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70505, 'zhCN', '恶魔卫士', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70504 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70504, 'zhCN', '邪能猎犬', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70503 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70503, 'zhCN', '魅魔', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70502 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70502, 'zhCN', '虚空行者', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70501 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70501, 'zhCN', '小恶魔', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70465 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70465, 'zhCN', '史蒂芬', '机动 死亡骑士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70464 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70464, 'zhCN', '曼陀罗', '机动 死亡骑士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70463 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70463, 'zhCN', '佐贝', '机动 死亡骑士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70462 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70462, 'zhCN', '克洛克', '机动 死亡骑士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70461 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70461, 'zhCN', '伊利丽额', '机动 死亡骑士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70460 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70460, 'zhCN', '乌佐', '机动 死亡骑士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70459 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70459, 'zhCN', '星澈', '机动 死亡骑士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70458 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70458, 'zhCN', '阿莉', '机动 死亡骑士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70457 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70457, 'zhCN', '维瑞思', '机动 死亡骑士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70456 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70456, 'zhCN', '银缕', '机动 死亡骑士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70455 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70455, 'zhCN', '岚克雷', '机动 死亡骑士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70454 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70454, 'zhCN', '缪妮克斯', '机动 死亡骑士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70453 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70453, 'zhCN', '维伦', '机动 死亡骑士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70452 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70452, 'zhCN', '音风', '机动 死亡骑士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70451 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70451, 'zhCN', '苏西', '机动 死亡骑士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70418 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70418, 'zhCN', '夏兰尼斯', '机动 德鲁伊', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70417 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70417, 'zhCN', '哈琳', '机动 德鲁伊', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70416 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70416, 'zhCN', '洛加纳尔', '机动 德鲁伊', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70415 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70415, 'zhCN', '高林', '机动 德鲁伊', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70414 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70414, 'zhCN', '杰诺斯', '机动 德鲁伊', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70413 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70413, 'zhCN', '曼德林', '机动 德鲁伊', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70412 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70412, 'zhCN', '瑟里德兰', '机动 德鲁伊', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70411 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70411, 'zhCN', '谢尔德拉斯', '机动 德鲁伊', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70410 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70410, 'zhCN', '费勒里安', '机动 德鲁伊', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70409 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70409, 'zhCN', '丹纳萨利安', '机动 德鲁伊', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70408 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70408, 'zhCN', '玛斯兰吉尔', '机动 德鲁伊', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70407 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70407, 'zhCN', '卡尔', '机动 德鲁伊', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70406 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70406, 'zhCN', '马丹特', '机动 德鲁伊', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70405 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70405, 'zhCN', '珍雅', '机动 德鲁伊', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70404 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70404, 'zhCN', '嘉特', '机动 德鲁伊', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70403 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70403, 'zhCN', '凯姆', '机动 德鲁伊', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70402 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70402, 'zhCN', '希尔', '机动 德鲁伊', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70401 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70401, 'zhCN', '图拉克', '机动 德鲁伊', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70377 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70377, 'zhCN', '巴巴加亚', '机动 术士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70376 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70376, 'zhCN', '赞尼恩', '机动 术士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70375 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70375, 'zhCN', '复仇者', '机动 术士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70374 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70374, 'zhCN', '阿拉玛', '机动 术士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70373 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70373, 'zhCN', '赛洛尼斯', '机动 术士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70372 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70372, 'zhCN', '泰莉拉琳', '机动 术士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70371 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70371, 'zhCN', '金瑞兹', '机动 术士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70370 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70370, 'zhCN', '桑达尔', '机动 术士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70369 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70369, 'zhCN', '厄伊', '机动 术士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70368 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70368, 'zhCN', '亚历山大', '机动 术士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70367 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70367, 'zhCN', '荆棘霜', '机动 术士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70366 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70366, 'zhCN', '蓟心', '机动 术士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70365 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70365, 'zhCN', '理查德', '机动 术士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70364 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70364, 'zhCN', '路德', '机动 术士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70363 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70363, 'zhCN', '卡尔', '机动 术士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70362 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70362, 'zhCN', '泽弗洛斯', '机动 术士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70361 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70361, 'zhCN', '米尔凯', '机动 术士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70360 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70360, 'zhCN', '格洛达', '机动 术士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70359 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70359, 'zhCN', '杜古如', '机动 术士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70358 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70358, 'zhCN', '纳托克', '机动 术士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70357 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70357, 'zhCN', '鲁珀', '机动 术士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70356 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70356, 'zhCN', '马克西米利安', '机动 术士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70355 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70355, 'zhCN', '卡托什', '机动 术士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70354 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70354, 'zhCN', '马克西米利安', '机动 术士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70353 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70353, 'zhCN', '德米赛特', '机动 术士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70352 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70352, 'zhCN', '阿拉玛', '机动 术士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70351 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70351, 'zhCN', '杜瑟拉', '机动 术士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70336 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70336, 'zhCN', '德里克', '机动 法师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70335 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70335, 'zhCN', '巴蒂', '机动 法师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70334 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70334, 'zhCN', '哈南', '机动 法师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70333 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70333, 'zhCN', '半葵', '机动 法师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70332 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70332, 'zhCN', '华兰斯', '机动 法师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70331 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70331, 'zhCN', '伊迪拉', '机动 法师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70330 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70330, 'zhCN', '纳林思', '机动 法师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70329 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70329, 'zhCN', '因特芬', '机动 法师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70328 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70328, 'zhCN', '奎萨思', '机动 法师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70327 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70327, 'zhCN', '泽达娜', '机动 法师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70326 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70326, 'zhCN', '瓦拉图', '机动 法师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70325 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70325, 'zhCN', '嘉瑞德', '机动 法师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70324 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70324, 'zhCN', '朱莉', '机动 法师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70323 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70323, 'zhCN', '丁克', '机动 法师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70322 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70322, 'zhCN', '优瑟妮', '机动 法师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70321 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70321, 'zhCN', '迪诺', '机动 法师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70320 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70320, 'zhCN', '麦亚', '机动 法师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70319 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70319, 'zhCN', '恩尤', '机动 法师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70318 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70318, 'zhCN', '菲佛德', '机动 法师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70317 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70317, 'zhCN', '恩图瓦', '机动 法师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70316 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70316, 'zhCN', '洁娜', '机动 法师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70315 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70315, 'zhCN', '尼特尔伯', '机动 法师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70314 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70314, 'zhCN', '朱莉', '机动 法师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70313 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70313, 'zhCN', '彬克', '机动 法师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70312 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70312, 'zhCN', '安娜斯塔西娅', '机动 法师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70311 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70311, 'zhCN', '皮尔斯', '机动 法师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70310 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70310, 'zhCN', '瑟斯顿', '机动 法师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70309 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70309, 'zhCN', '乌尔辛', '机动 法师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70308 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70308, 'zhCN', '什姆', '机动 法师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70307 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70307, 'zhCN', '肯', '机动 法师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70306 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70306, 'zhCN', '伊莎贝拉', '机动 法师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70305 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70305, 'zhCN', '魔姬', '机动 法师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70304 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70304, 'zhCN', '玛瑞克', '机动 法师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70303 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70303, 'zhCN', '玛吉诺', '机动 法师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70302 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70302, 'zhCN', '赞迪玛', '机动 法师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70301 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70301, 'zhCN', '凯尔登', '机动 法师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70268 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70268, 'zhCN', '贾瓦德', '机动 萨满', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70267 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70267, 'zhCN', '幽蓝', '机动 萨满', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70265 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70265, 'zhCN', '舒拉', '机动 萨满', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70261 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70261, 'zhCN', '萨戈恩', '机动 萨满', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70260 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70260, 'zhCN', '思安德', '机动 萨满', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70259 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70259, 'zhCN', '卡德里斯', '机动 萨满', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70258 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70258, 'zhCN', '斯沃特', '机动 萨满', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70257 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70257, 'zhCN', '采莎', '机动 萨满', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70256 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70256, 'zhCN', '楠琳', '机动 萨满', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70255 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70255, 'zhCN', '米拉', '机动 萨满', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70254 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70254, 'zhCN', '贝拉姆', '机动 萨满', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70253 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70253, 'zhCN', '腾格', '机动 萨满', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70252 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70252, 'zhCN', '思琳', '机动 萨满', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70251 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70251, 'zhCN', '哈罗姆', '机动 萨满', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70240 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70240, 'zhCN', '法拉特', '机动 牧师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70239 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70239, 'zhCN', '伊兹密尔', '机动 牧师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70238 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70238, 'zhCN', '谷万', '机动 牧师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70237 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70237, 'zhCN', '凯德莫斯', '机动 牧师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70236 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70236, 'zhCN', '贝莱斯特拉', '机动 牧师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70235 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70235, 'zhCN', '洛西兰', '机动 牧师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70234 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70234, 'zhCN', '艾尔德雷', '机动 牧师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70233 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70233, 'zhCN', '沙尔顿', '机动 牧师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70232 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70232, 'zhCN', '波纳里斯', '机动 牧师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70231 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70231, 'zhCN', '竞技场', '机动 牧师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70230 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70230, 'zhCN', '若涵', '机动 牧师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70229 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70229, 'zhCN', '艾莉西娅', '机动 牧师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70228 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70228, 'zhCN', '娜拉', '机动 牧师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70227 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70227, 'zhCN', '乌尔奇奥', '机动 牧师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70226 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70226, 'zhCN', '席雅拉', '机动 牧师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70225 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70225, 'zhCN', '泽尤斯', '机动 牧师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70224 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70224, 'zhCN', '约书亚', '机动 牧师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70223 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70223, 'zhCN', '本杰明', '机动 牧师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70222 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70222, 'zhCN', '托尔德伦', '机动 牧师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70221 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70221, 'zhCN', '布雷娜', '机动 牧师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70220 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70220, 'zhCN', '西奥德鲁斯', '机动 牧师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70219 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70219, 'zhCN', '拉撒路', '机动 牧师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70218 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70218, 'zhCN', '兰开斯特', '机动 牧师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70217 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70217, 'zhCN', '拉莉娅', '机动 牧师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70216 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70216, 'zhCN', '杨迪儿', '机动 牧师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70215 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70215, 'zhCN', '阿斯塔丽', '机动 牧师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70214 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70214, 'zhCN', '肯杰', '机动 牧师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70213 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70213, 'zhCN', '泰津', '机动 牧师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70212 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70212, 'zhCN', '罗娜', '机动 牧师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70211 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70211, 'zhCN', '珊达', '机动 牧师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70210 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70210, 'zhCN', '科布', '机动 牧师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70209 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70209, 'zhCN', '马拉凯', '机动 牧师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70208 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70208, 'zhCN', '迈尔斯', '机动 牧师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70207 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70207, 'zhCN', '贝丽', '机动 牧师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70206 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70206, 'zhCN', '迪斯滕', '机动 牧师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70205 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70205, 'zhCN', '马克森', '机动 牧师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70204 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70204, 'zhCN', '枝根', '机动 牧师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70203 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70203, 'zhCN', '若青', '机动 牧师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70202 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70202, 'zhCN', '罗芮娜', '机动 牧师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70201 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70201, 'zhCN', '安妮塔', '机动 牧师', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70181 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70181, 'zhCN', '涅莉森', '机动 潜行者', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70180 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70180, 'zhCN', '艾拉拉', '机动 潜行者', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70179 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70179, 'zhCN', '泽兰尼斯', '机动 潜行者', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70178 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70178, 'zhCN', '坦娜莉娅', '机动 潜行者', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70177 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70177, 'zhCN', '卡丽尔', '机动 潜行者', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70176 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70176, 'zhCN', '托尼', '机动 潜行者', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70175 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70175, 'zhCN', '法拉德', '机动 潜行者', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70174 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70174, 'zhCN', '芬瑟维克', '机动 潜行者', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70173 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70173, 'zhCN', '奥米尔', '机动 潜行者', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70172 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70172, 'zhCN', '霍尔夫丹', '机动 潜行者', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70171 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70171, 'zhCN', '格雷戈里', '机动 潜行者', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70170 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70170, 'zhCN', '迈尔斯', '机动 潜行者', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70169 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70169, 'zhCN', '凯琳', '机动 潜行者', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70168 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70168, 'zhCN', '安尼莎', '机动 潜行者', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70167 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70167, 'zhCN', '艾瑞昂', '机动 潜行者', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70166 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70166, 'zhCN', '思娜', '机动 潜行者', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70165 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70165, 'zhCN', '简诺', '机动 潜行者', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70164 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70164, 'zhCN', '弗拉洪', '机动 潜行者', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70163 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70163, 'zhCN', '深石', '机动 潜行者', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70162 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70162, 'zhCN', '奥莫克', '机动 潜行者', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70161 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70161, 'zhCN', '盖斯特', '机动 潜行者', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70160 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70160, 'zhCN', '卡普拉', '机动 潜行者', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70159 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70159, 'zhCN', '鲁瓦格', '机动 潜行者', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70158 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70158, 'zhCN', '玛丽安', '机动 潜行者', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70157 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70157, 'zhCN', '大卫', '机动 潜行者', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70156 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70156, 'zhCN', '伊恩', '机动 潜行者', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70155 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70155, 'zhCN', '猎獭', '机动 潜行者', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70154 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70154, 'zhCN', '奥斯本', '机动 潜行者', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70153 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70153, 'zhCN', '凯琳', '机动 潜行者', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70152 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70152, 'zhCN', '索尔姆', '机动 潜行者', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70151 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70151, 'zhCN', '乔里克', '机动 潜行者', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70139 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70139, 'zhCN', '杀手', '机动 猎人', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70138 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70138, 'zhCN', '沃德', '机动 猎人', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70137 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70137, 'zhCN', '阿克特翁', '机动 猎人', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70136 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70136, 'zhCN', '德蕾米丝', '机动 猎人', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70135 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70135, 'zhCN', '赞迪娜', '机动 猎人', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70134 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70134, 'zhCN', '奥尼纳丝', '机动 猎人', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70133 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70133, 'zhCN', '塔娜', '机动 猎人', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70132 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70132, 'zhCN', '凯尔内', '机动 猎人', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70131 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70131, 'zhCN', '汉诺维亚', '机动 猎人', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70130 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70130, 'zhCN', '萨琳娜', '机动 猎人', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70129 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70129, 'zhCN', '达格', '机动 猎人', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70128 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70128, 'zhCN', '阿伦达', '机动 猎人', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70127 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70127, 'zhCN', '托尔芬', '机动 猎人', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70126 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70126, 'zhCN', '乌尔菲尔', '机动 猎人', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70125 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70125, 'zhCN', '恩瑞斯', '机动 猎人', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70124 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70124, 'zhCN', '凯布鲁斯', '机动 猎人', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70123 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70123, 'zhCN', '雷格努斯', '机动 猎人', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70122 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70122, 'zhCN', '奥尔明', '机动 猎人', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70121 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70121, 'zhCN', '德拉', '机动 猎人', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70120 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70120, 'zhCN', '多里昂', '机动 猎人', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70119 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70119, 'zhCN', '约卡斯特', '机动 猎人', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70118 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70118, 'zhCN', '洁娜', '机动 猎人', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70117 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70117, 'zhCN', '丹拉尔', '机动 猎人', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70116 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70116, 'zhCN', '达扎拉', '机动 猎人', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70115 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70115, 'zhCN', '艾安娜', '机动 猎人', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70114 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70114, 'zhCN', '思安杜尔', '机动 猎人', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70113 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70113, 'zhCN', '索兹朱尔', '机动 猎人', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70112 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70112, 'zhCN', '奥玛克', '机动 猎人', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70111 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70111, 'zhCN', '索费雷', '机动 猎人', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70110 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70110, 'zhCN', '杰尚', '机动 猎人', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70109 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70109, 'zhCN', '尧', '机动 猎人', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70108 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70108, 'zhCN', '兰卡', '机动 猎人', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70107 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70107, 'zhCN', '优瑞', '机动 猎人', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70106 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70106, 'zhCN', '霍尔特', '机动 猎人', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70105 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70105, 'zhCN', '凯瑞', '机动 猎人', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70104 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70104, 'zhCN', '克拉格', '机动 猎人', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70103 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70103, 'zhCN', '格里夫', '机动 猎人', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70102 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70102, 'zhCN', '奥格罗姆', '机动 猎人', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70101 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70101, 'zhCN', '索尔加斯', '机动 猎人', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70100 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70100, 'zhCN', '深海对话触发器', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70074 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70074, 'zhCN', '如云', '机动 圣骑士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70073 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70073, 'zhCN', '烈焰者', '机动 圣骑士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70072 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70072, 'zhCN', '希莎', '机动 圣骑士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70071 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70071, 'zhCN', '乔勒', '机动 圣骑士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70070 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70070, 'zhCN', '图拉斯', '机动 圣骑士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70069 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70069, 'zhCN', '卡万', '机动 圣骑士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70068 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70068, 'zhCN', '巴屯', '机动 圣骑士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70067 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70067, 'zhCN', '巴奇', '机动 圣骑士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70066 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70066, 'zhCN', '艾瑟丽丝', '机动 圣骑士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70065 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70065, 'zhCN', '欧瑟兰', '机动 圣骑士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70064 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70064, 'zhCN', '奥瑞隆', '机动 圣骑士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70063 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70063, 'zhCN', '娜琳', '机动 圣骑士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70062 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70062, 'zhCN', '杰斯汀', '机动 圣骑士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70061 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70061, 'zhCN', '卡曼', '机动 圣骑士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70060 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70060, 'zhCN', '凯瑟琳', '机动 圣骑士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70059 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70059, 'zhCN', '亚瑟', '机动 圣骑士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70058 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70058, 'zhCN', '布兰德尔', '机动 圣骑士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70057 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70057, 'zhCN', '贝尔德鲁克', '机动 圣骑士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70056 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70056, 'zhCN', '瓦尔加', '机动 圣骑士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70055 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70055, 'zhCN', '阿萨尔', '机动 圣骑士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70054 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70054, 'zhCN', '格雷森', '机动 圣骑士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70053 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70053, 'zhCN', '威廉', '机动 圣骑士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70052 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70052, 'zhCN', '溴盐', '机动 圣骑士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70051 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70051, 'zhCN', '山缪尔', '机动 圣骑士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70038 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70038, 'zhCN', '凯丽娅', '机动 战士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70037 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70037, 'zhCN', '卡茲', '机动 战士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70036 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70036, 'zhCN', '如娜', '机动 战士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70035 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70035, 'zhCN', '贝霍玛', '机动 战士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70034 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70034, 'zhCN', '阿霍南', '机动 战士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70033 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70033, 'zhCN', '柯蕊', '机动 战士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70032 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70032, 'zhCN', '均糖', '机动 战士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70031 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70031, 'zhCN', '达纳斯', '机动 战士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70030 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70030, 'zhCN', '伊莎', '机动 战士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70029 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70029, 'zhCN', '吴', '机动 战士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70028 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70028, 'zhCN', '毕尔邦', '机动 战士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70027 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70027, 'zhCN', '凯尔夫', '机动 战士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70026 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70026, 'zhCN', '巴尔图斯', '机动 战士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70025 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70025, 'zhCN', '安琪拉', '机动 战士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70024 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70024, 'zhCN', '克里斯', '机动 战士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70023 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70023, 'zhCN', '西尔丹爱尔', '机动 战士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70022 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70022, 'zhCN', '阿丽亚思塔', '机动 战士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70021 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70021, 'zhCN', '凯拉', '机动 战士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70020 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70020, 'zhCN', '爱丽西娅', '机动 战士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70019 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70019, 'zhCN', '泽尔马克', '机动 战士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70018 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70018, 'zhCN', '索热克', '机动 战士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70017 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70017, 'zhCN', '格雷兹', '机动 战士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70016 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70016, 'zhCN', '塔尔肖', '机动 战士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70015 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70015, 'zhCN', '方儿', '机动 战士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70014 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70014, 'zhCN', '克兰', '机动 战士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70013 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70013, 'zhCN', '哈鲁特', '机动 战士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70012 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70012, 'zhCN', '柯尔', '机动 战士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70011 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70011, 'zhCN', '萨克', '机动 战士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70010 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70010, 'zhCN', '托姆', '机动 战士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70009 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70009, 'zhCN', '奥斯汀', '机动 战士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70008 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70008, 'zhCN', '丹娜', '机动 战士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70007 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70007, 'zhCN', '凯尔斯特拉姆', '机动 战士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70006 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70006, 'zhCN', '格兰尼斯', '机动 战士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70005 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70005, 'zhCN', '马洛什', '机动 战士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70004 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70004, 'zhCN', '安德尔', '机动 战士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70003 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70003, 'zhCN', '丽娜', '机动 战士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70002 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70002, 'zhCN', '思兰', '机动 战士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70001 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70001, 'zhCN', '莱恩', '机动 战士', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70000 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70000, 'zhCN', '拉格雷塔', '机动雇佣兵 首领', NULL);\n"
  },
  {
    "path": "AC/SQL/locales/zhCN/npc_text_locale.sql",
    "content": "DELETE FROM `npc_text_locale` WHERE `Locale`='zhCN' AND `ID` BETWEEN '70000' AND '71000';\nINSERT INTO `npc_text_locale` (`ID`, `Locale`, `Text0_0`, `Text0_1`, `Text1_0`, `Text1_1`, `Text2_0`, `Text2_1`, `Text3_0`, `Text3_1`, `Text4_0`, `Text4_1`, `Text5_0`, `Text5_1`, `Text6_0`, `Text6_1`, `Text7_0`, `Text7_1`)\nVALUES\n('70001','zhCN','我愿意为你奉献一切.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70002','zhCN','你需要什么吗？',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70003','zhCN','凡人,通常情况下,我会立刻杀了你这混蛋！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70004','zhCN','<你看着这个歿境神蚀者.它看起来有点与众不同,它并没有因为你的伤害而消失,在仔细检查过后,你注意到它的背部有一个小口.>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70005','zhCN','<毁灭者盯着你,发出低沉的咆哮.>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70006','zhCN','你惊讶吗,凡人？作为一名纳斯雷兹姆,我不得不寻求盟友,你看起来至少可以逗我开心.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70007','zhCN','现在怎么样了,凡人？',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70008','zhCN','你就不能让我一个人静一静吗？ <唉...>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70009','zhCN','现在如何？',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70101','zhCN','|cffff3300剑圣|r$b|cffdd6600-=致敬魔兽争霸III=-|r$B$B\\\\\\\"剑圣,以前是燃烧之刃家族的成员,现在是部落中的精锐战士\\\".$B$B主要属性:敏捷.$B$B疾风步: 让剑圣隐形,并在一段时间内移动得更快.当剑圣攻击一个单位以打破隐身状态时,他将造成额外的伤害.$B$B镜像: 制造剑圣幻象迷惑敌人,并驱散剑圣的所有魔法.$B$B致命一击(被动): 有15%的几率在他的攻击中造成致命的x2(x3,x4)倍的正常伤害.$B$B剑刃风暴: 给予魔法免疫并对周围所有敌人造成伤害.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70102','zhCN','|cff9900cc歿境神蚀者|r$b|cffdd6600-=致敬魔兽争霸III=-|r$B$B\\\\\\\"歿境神蚀者,对魔法有着无法满足的渴望\\\\\\\".$B$B高护甲,非常高的抵抗力,部分免疫魔法,随着时间的推移失去法力\\\\并且不受益于被动法力再生效果,板甲,双持魔杖,造成暗影法术伤害,没有物理攻击\\\\法术伤害加成:50%攻击力+200% 智力增加魔杖伤害.$B$B吞噬魔法.从敌人身上驱散最多2个魔法效果,从盟友身上驱散最多2个魔法效果和最多2个诅咒,并在20码范围内伤害召唤单位.每次驱散效果回复20%法力和5%生命,7秒冷却.$B$B暗影爆炸: 强化攻击,增加飞溅伤害.$B$B吸取法力: 从随机友方单位吸取所有法力(受施法者法力限制).$B$B法力再生: 给周围15码范围内的团队和团队成员通电,使其法力值达到最大值的1%,影响最多10个目标,冷却3秒.$B$B生命再生: 治疗周围15码范围内的团队和团队成员,使其生命值降低施法者法力上限的2%,最多影响10个目标,冷却3秒.$B$B暗影护甲(被动): 恢复相当于所受伤害百分比的法力值.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70103','zhCN','|cff0000dd高阶法师|r$b|cffdd6600-=致敬魔兽争霸III=-|r$B$B\\\\\\\"高阶法师,无法用言语来形容的暴雪亲儿子\\\\\\\".$B$B法术伤害降低35%,部分免疫控制效果,布甲,造成火/冰法术伤害,无物理攻击,法术能量加成:100%智力.主要属性:智力.$B$B暴风雪: 典型的暴风雪,只是稍微强大一点,6秒冷却.$B$B召唤水元素: 攻击高阶法师的敌人1分钟,冷却20秒.$B$B光辉光环: 增加10%的法力上限,大大提高40码范围内己方和队友的法力回复.$B$B群体传送: 暂未实现.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70104','zhCN','|cff9900cc恐惧魔王|r$b|cffdd6600-=致敬魔兽争霸III=-|r$B$B\\\\\\\"恐惧魔王,拥有黑暗力量和精神控制力的强大恶魔\\\\\\\".$B$B高护甲,高抵抗,部分免疫控制效果,所受伤害加速法术能量,板甲,造成近战/暗影法术伤害,对瘫痪目标造成额外伤害,法术能量加成:200%力量.主要属性:力量.$B$B食腐虫群: 派一大群蝙蝠与混乱魔法结合,对面前锥形范围的敌人造成伤害,无法暴击,冷却10秒.$B$B沉睡: 使敌方目标睡眠60秒,并允许下次对该目标的物理攻击忽视护甲,造成的直接伤害将唤醒目标,冷却6秒.$B$B吸血光环: 增加5%的物理暴击伤害,治疗40码范围内的团队和突袭成员受到近战物理攻击和腐肉群伤害的百分比(恐惧领主100%,其他人25%),没有威胁.$B$B召唤地狱火: 召唤一个来自天空的恶魔,恶魔对魔法有很强的抵抗力并且持续180秒,180秒的冷却时间.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70105','zhCN','|cff0000dd破法者|r$b|cffdd6600-=致敬魔兽争霸III=-|r$B$B\\\\\\\"破法者,一个被训练来破坏和扭曲魔法能量的精灵战士\\\\\\\".$B$B法术伤害减少75%,部分免疫控制效果,护甲降低-30%,板甲,近战/奥术伤害,法术能量加成:200%力量.主要属性:力量.$B$B魔法偷取.从敌人身上偷取一个有益的法术并施于附近的盟友,或者从盟友身上移除一个消极的法术并施于附近的敌人,影响魔法和诅咒效果,3秒冷却.$B$B能量窃取(被动): 成功的近战攻击消耗目标的法力,相当于造成的伤害(由法术力增加),造成奥术伤害.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70106','zhCN','|cff9900cc黑暗游侠|r$b|cffdd6600-=致敬魔兽争霸III=-|r$B$B\\\\\\\"黑暗游侠,强行起死回生的奎尔萨拉斯的前游侠\\\\\\\".$B$B法术伤害减少35%,不死系,部分免疫控制效果,皮甲/布甲,造成物理/暗影法术伤害,不产生威胁,法术力量加成:50%智力.主要属性:敏捷.$B$B沉默: 使一个敌人和最多4个附近目标沉默8秒,15秒冷却.$B$B黑箭: 射出一支诅咒之箭,造成150%武器伤害和额外的暗影伤害.如果受影响的目标死于黑暗游侠的伤害,黑暗仆从将从尸体中产生(最多5个仆从,持续时间80秒,只对人形、野兽和龙类有效).如果目标生命低于20%,造成5倍伤害.$B$B吸取生命: 每秒吸取一个敌人的生命值,持续5秒,治疗黑暗游侠消耗生命值的200%.$B$B嘲讽(暗夜仆从): 使近战范围内的敌人攻击暗夜仆从而不是暗夜游侠,持续5秒。一次性使用$B$B改进格挡(暗夜仆从): 增加格挡攻击的几率60-100%(取决于施法者的等级),持续6秒。一次性使用.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70107','zhCN','|cff9900cc死灵法师|r$b|cffdd6600-=魔兽争霸III / 暗黑破坏神II致敬=-|r$B$B受到的法术伤害减少20%,部分免疫控制效果,布甲,造成暗影法术伤害,没有物理攻击,法术强度加成: 智力的100%.主属性: 智力.$B$B死灵复生: 从尸体上复活2个骷髅(最多6个骷髅,持续65秒,只对人型生物、野兽和龙类有效).$B$B邪恶狂热: 增加目标的近战攻击速度75%,但持续消耗生命.持续45秒.不能取消.30级解锁.$B$B尸体爆炸: 让尸体爆炸,对周围所有敌人造成相当于死亡单位最大生命值35%至75%的伤害(取决于死灵法师的等级).这种伤害不产生威胁.40级解锁.$B$B致残: 减少目标的移动速度、近战攻击速度和总力量50%,持续60秒.$B$B嘲讽(骷髅): 嘲讽一个近战范围内的敌人攻击骷髅而不是亡灵巫师,持续5秒.一次性使用.$B$B改进格挡(骷髅): 增加格挡攻击的几率60-100%(取决于施法者的等级),持续6秒.一次性使用.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70108','zhCN','|cff0000dd深渊海巫|r$b|cffdd6600-=魔兽争霸III致敬=-|r$B$B\"海洋中的凶猛鳞皮居民,常与巨大风暴的到来联系在一起.\"$B$B受到的法术伤害减少30%,部分免疫控制效果,布甲,造成物理/冰霜法术/风暴法术伤害,攻击力加成: 敏捷x2,法术强度加成: 智力的200%.主属性: 智力.$B$B分叉闪电: 召唤一道闪电锥,伤害敌人.从2到所有目标(取决于海巫的等级),使它们昏迷2秒.这种伤害不产生威胁.$B$B冰霜箭: 用冰霜法术为箭矢增加额外伤害,减慢目标的移动、攻击和施法速度30%至70%(取决于海巫的等级).$B$B法力护盾: 创造一个护盾,使用海巫的法力吸收100%的(未减免的)进来伤害.效果范围从每10法力吸收1伤害到每1法力吸收10伤害(取决于海巫的等级).$B$B龙卷风: 召唤一个猛烈的龙卷风,伤害并减慢附近敌方单位的速度,有时完全使它们失去行动能力.龙卷风在户外随时间增长,增加伤害和影响区域,但在室内缩小,迅速消散.60级解锁.$B$B娜迦(被动): 在水中游泳速度、伤害和躲避几率大幅提升.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70109','zhCN','|cff9900cc地穴领主|r$b|cffdd6600-=魔兽争霸III致敬=-|r$B$B\"古老的庞然大物,曾是艾泽拉斯之王之一,现在是巫妖王麾下最强大的亡灵战士之一.\"$B$B高度护甲,增加的抗性,部分免疫控制效果,免疫基于毒素的效果,锁甲/板甲,造成近战/暗影法术伤害,法术强度加成: 力量的200%.主属性: 力量.$B$B穿刺: 地穴领主用他巨大的爪子猛击地面,向前锥形射出尖刺,造成伤害并将敌方单位掀入空中,使他们晕眩.20级解锁.$B$B尖刺甲壳: 地穴领主的几丁质护甲增加伤害抗性,并将15%至50%的伤害反弹给近战攻击者.$B$B腐尸甲虫: 地穴领主从敌人的新鲜尸体上产生一个腐尸甲虫来攻击他的敌人.甲虫是永久的,但不会恢复生命值,一次最多控制6个.更高等级允许地穴领主召唤更强大的甲虫.10级解锁.$B$B蝗虫群: 地穴领主释放一群20-40只(取决于地穴领主的等级)愤怒的蝗虫,啃咬并撕扯附近的敌方单位,减少他们的移动或攻击能力.当它们啃食敌人肉体时,它们将其转化为一种物质,当它们返回时恢复地穴领主的生命值.40级解锁.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70201','zhCN','并不总是有人愿意为钱去卖命！',NULL,'我们的服务遍布艾泽拉斯的每个角落！',NULL,'很高兴为您服务,我这里有最能打的家伙！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70202','zhCN','雇佣兵向来十分抢手；以下是现在你能雇佣的人: ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70203','zhCN','雇佣兵向来十分抢手；以下是现在你能雇佣的人: ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70204','zhCN','看来现在没有空闲的雇佣兵,你过些时候再来看看吧.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70300','zhCN','去死！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70301','zhCN','正在复活你！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70302','zhCN','正在复活 ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70303','zhCN','你的机器人',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70304','zhCN','的机器人',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70305','zhCN','我现在还不能制造魔法水',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70306','zhCN','我现在还不能制造魔法食物',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70307','zhCN','我还不能那样做',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70308','zhCN','给你...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70309','zhCN','已禁用',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70310','zhCN','还没有准备好',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70311','zhCN','无效的物品类型',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70312','zhCN','失败',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70313','zhCN','完成',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70314','zhCN','我没有变形',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70315','zhCN','我没有治疗石',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70316','zhCN','我还不能制造治疗石',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70317','zhCN','搞什么鬼,我没有锁可开！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70318','zhCN','我的技能等级还不够高',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70319','zhCN','正在将我的天赋切换为',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70320','zhCN','武器',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70321','zhCN','狂怒',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70322','zhCN','防护',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70323','zhCN','惩戒',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70324','zhCN','野兽控制',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70325','zhCN','射击',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70326','zhCN','生存',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70327','zhCN','刺杀',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70328','zhCN','战斗',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70329','zhCN','敏锐',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70330','zhCN','戒律',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70331','zhCN','神圣',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70332','zhCN','暗影',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70333','zhCN','鲜血',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70334','zhCN','冰霜',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70335','zhCN','邪恶',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70336','zhCN','元素',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70337','zhCN','增强',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70338','zhCN','恢复',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70339','zhCN','奥术',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70340','zhCN','火焰',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70341','zhCN','痛苦',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70342','zhCN','恶魔学识',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70343','zhCN','毁灭',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70344','zhCN','平衡',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70345','zhCN','野性战斗',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70346','zhCN','未知',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70347','zhCN','滚开！ 懦夫.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70348','zhCN',' 不方便.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70349','zhCN','我不会把我宝贵的时间浪费在这些琐事上！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70350','zhCN','NIY',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70351','zhCN','NIY',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70352','zhCN','NIY',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70353','zhCN','我准备好了',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70354','zhCN','走开！我已经有雇主了！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70355','zhCN','未知',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70356','zhCN','在你身上！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70357','zhCN','在我身上！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70358','zhCN',' 对 ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70359','zhCN',' 已使用！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70360','zhCN','坦克机器人',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70361','zhCN','职业',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70362','zhCN','玩家',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70363','zhCN','雇主',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70364','zhCN','无',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70365','zhCN','级别',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70366','zhCN','天赋',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70367','zhCN','被动',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70368','zhCN','隐藏',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70369','zhCN','已知',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70370','zhCN','能力',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70371','zhCN','力量',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70372','zhCN','敏捷',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70373','zhCN','耐力',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70374','zhCN','智力',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70375','zhCN','精神',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70376','zhCN','未知属性',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70377','zhCN','共',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70378','zhCN','近战攻击强度',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70379','zhCN','远程攻击强度',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70380','zhCN','护甲',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70381','zhCN','暴击',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70382','zhCN','防御',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70383','zhCN','未命中',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70384','zhCN','躲闪',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70385','zhCN','招架',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70386','zhCN','格挡',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70387','zhCN','盾牌格挡值',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70388','zhCN','近战防御',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70389','zhCN','法术防御',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70390','zhCN','主手攻击伤害范围',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70391','zhCN','主手攻击伤害加成',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70392','zhCN','主手攻击速度',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70393','zhCN','副手攻击伤害范围',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70394','zhCN','副手攻击伤害加成',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70395','zhCN','副手攻击速度',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70396','zhCN','远程攻击伤害范围',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70397','zhCN','远程攻击伤害加成',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70398','zhCN','远程攻击速度',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70399','zhCN','最小',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70400','zhCN','最大',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70401','zhCN','输出',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70402','zhCN','基础生命值',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70403','zhCN','最大生命值',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70404','zhCN','基础法力值',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70405','zhCN','最大法力值',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70406','zhCN','当前法力值',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70407','zhCN','法术强度',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70408','zhCN','每5秒恢复生命',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70409','zhCN','非施法状态: 每5秒回复法力值',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70410','zhCN','施法状态: 每5秒回复法力值',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70411','zhCN','急速',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70412','zhCN','命中',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70413','zhCN','专精',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70414','zhCN','物理 护甲穿透',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70415','zhCN','法术 护甲穿透',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70416','zhCN','%',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70417','zhCN','神圣',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70418','zhCN','火焰',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70419','zhCN','自然',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70420','zhCN','冰霜',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70421','zhCN','暗影',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70422','zhCN','奥术',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70423','zhCN','抗性',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70424','zhCN','指令状态',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70425','zhCN','跟随',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70426','zhCN','攻击',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70427','zhCN','停留',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70428','zhCN','重置',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70429','zhCN','完全停止',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70430','zhCN','跟随距离',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70431','zhCN','天赋',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70432','zhCN','机器人主职务',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70433','zhCN','机器人材料采集',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70434','zhCN','PvP 杀敌',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70435','zhCN','玩家',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70436','zhCN','已死亡 ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70437','zhCN',' 次',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70438','zhCN','%s (机器人)渐渐冷静了下来.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70439','zhCN','<Debug调试>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70440','zhCN','你真的想冒险引起',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70441','zhCN','对你的注意？',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70442','zhCN','<请投币>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70443','zhCN','你想吸引',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70444','zhCN','<试着发出邀请...>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70445','zhCN','你想雇佣',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70446','zhCN','<雇佣机器人>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70447','zhCN','机器人 装备 管理...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70448','zhCN','机器人 职责 管理...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70449','zhCN','机器人 队形 管理...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70450','zhCN','机器人 技能 管理...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70451','zhCN','机器人 天赋 管理...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70452','zhCN','使用消耗品、合剂等...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70453','zhCN','<创建队伍>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70454','zhCN','<创建队伍(所有机器人)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70455','zhCN','<加入队伍>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70456','zhCN','<将所有机器人加入队伍>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70457','zhCN','<移出队伍>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70458','zhCN','跟着我！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70459','zhCN','原地守候！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70460','zhCN','停下来,什么也别做！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70461','zhCN','给我一些食物',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70462','zhCN','给我一些水',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70463','zhCN','召唤一个魔法餐桌！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70464','zhCN','帮我开个锁',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70465','zhCN','给我一颗治疗石',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70466','zhCN','召唤一个灵魂之井！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70467','zhCN','给你的武器重新上毒...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70468','zhCN','<选择毒药 (主手武器)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70469','zhCN','<选择毒药 (副手武器)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70470','zhCN','元素武器附魔...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70471','zhCN','<选择附魔 (主手武器)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70472','zhCN','<选择附魔 (副手武器)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70473','zhCN','取消你的变形形态',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70474','zhCN','<选择宠物类型>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70475','zhCN','你被解雇了！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70476','zhCN','你确定要解雇',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70477','zhCN','你可别后悔...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70478','zhCN','该死的,振作起来！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70479','zhCN','<职业介绍>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70480','zhCN','没事了',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70481','zhCN','距离',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70482','zhCN','返回',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70483','zhCN','<自动>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70484','zhCN','<解散宠物>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70485','zhCN','召唤随机宠物 (狡诈型)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70486','zhCN','召唤随机宠物 (残暴型)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70487','zhCN','召唤随机宠物 (坚韧型)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70488','zhCN','让我看看你的装备',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70489','zhCN','自动筛选可用装备...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70490','zhCN','主手武器...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70491','zhCN','副手武器...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70492','zhCN','远程武器...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70493','zhCN','圣物...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70494','zhCN','头部...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70495','zhCN','肩部...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70496','zhCN','胸部...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70497','zhCN','腰带...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70498','zhCN','腿部...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70499','zhCN','脚...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70500','zhCN','手腕...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70501','zhCN','手...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70502','zhCN','披风...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70503','zhCN','衬衣...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70504','zhCN','戒指1...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70505','zhCN','戒指2...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70506','zhCN','饰品1...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70507','zhCN','饰品2...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70508','zhCN','颈部...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70509','zhCN','卸下全部装备(退回到背包)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70510','zhCN','刷新机器人外观',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70511','zhCN','只有外观,无实际效果',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70512','zhCN','已装备',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70513','zhCN','没有可供选择的装备',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70514','zhCN','使用你的旧装备',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70515','zhCN','卸下这件装备',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70516','zhCN','额...我没有适合你的装备了...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70517','zhCN','收集材料',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70518','zhCN','技能状态...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70519','zhCN','管理可用技能...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70520','zhCN','使用 ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70521','zhCN','刷新',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70522','zhCN','伤害类技能...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70523','zhCN','控制类技能...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70524','zhCN','治疗类技能...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70525','zhCN','其他技能...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70526','zhCN',' 发出了一阵摩擦声,并开始跟随着 ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70527','zhCN','在他的雇主把他解雇之前, %s不能加入你的队伍.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70528','zhCN','在你到达60级以前, %s不会加入你们',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70529','zhCN','在你到达55级以前, %s不会加入你们',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70530','zhCN','在你到达40级以前, %s不会加入你们',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70531','zhCN','在你到达20级以前, %s不会加入你们',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70532','zhCN','你最多只能招募%u个机器人！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70533','zhCN','你没有足够的现金',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70534','zhCN','你最多只能招募%u位%u.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70535','zhCN','无法退还装备 %u (%s)! 无法解雇机器人！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70536','zhCN','当前设定',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70537','zhCN','攻击距离',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70538','zhCN','最小远程攻击距离...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70539','zhCN','最大远程攻击距离...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70540','zhCN','设定攻击距离',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70541','zhCN','移除增益魔法...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70542','zhCN','修正属性...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70543','zhCN','因为某些原因,无法卸下 %s 这件装备将发到你的邮箱.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70544','zhCN','坦克',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70545','zhCN','远程',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70546','zhCN','采矿',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70547','zhCN','草药',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70548','zhCN','剥皮',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70549','zhCN','工程学',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70550','zhCN','由于长时间未上线,已自动解除雇佣状态.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70551','zhCN','机器人系统已被禁用,请联系管理员.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70552','zhCN','%s 不能假如你的队伍,已经有雇主了: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70553','zhCN','%s 正在传送中,不能加入你的队伍',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70554','zhCN','守护',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70555','zhCN','灵猴',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70556','zhCN','雄鹰守护',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70557','zhCN','猎豹守护',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70558','zhCN','蝰蛇守护',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70559','zhCN','野兽守护',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70560','zhCN','豹群守护',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70561','zhCN','野性守护',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70562','zhCN','龙鹰守护',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70563','zhCN','无守护',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70564','zhCN','光环',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70565','zhCN','虔诚',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70566','zhCN','专注',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70567','zhCN','火焰抗性',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70568','zhCN','冰霜抗性',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70569','zhCN','暗影抗性',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70570','zhCN','惩戒',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70571','zhCN','十字军',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70572','zhCN','无光环',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70573','zhCN','减速药膏',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70574','zhCN','速效药膏',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70575','zhCN','致命药膏',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70576','zhCN','致伤药膏',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70577','zhCN','麻痹药膏',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70578','zhCN','麻醉药膏',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70579','zhCN','无',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70580','zhCN','火舌武器',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70581','zhCN','冰封武器',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70582','zhCN','风怒武器',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70583','zhCN','大地生命武器',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70584','zhCN','我需要你的服务.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70585','zhCN','你不能再雇佣更多的机器人了.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70586','zhCN','你希望雇佣',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70587','zhCN','现在正在忙着,请稍后再试.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70588','zhCN','很高兴和你进行交易.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70589','zhCN','战士',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70590','zhCN','圣骑士',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70591','zhCN','法师',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70592','zhCN','牧师',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70593','zhCN','术士',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70594','zhCN','德鲁伊',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70595','zhCN','死亡骑士',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70596','zhCN','盗贼',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70597','zhCN','萨满',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70598','zhCN','猎人',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70599','zhCN','剑圣',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70600','zhCN','歿境神蚀者',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70601','zhCN','高阶法师',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70602','zhCN','恐惧魔王',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70603','zhCN','破法者',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70604','zhCN','黑暗游侠',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70605','zhCN','战士',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70606','zhCN','圣骑士',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70607','zhCN','法师',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70608','zhCN','牧师',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70609','zhCN','术士',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70610','zhCN','德鲁伊',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70611','zhCN','死亡骑士',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70612','zhCN','盗贼',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70613','zhCN','萨满',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70614','zhCN','猎人',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70615','zhCN','剑圣',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70616','zhCN','歿境神蚀者',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70617','zhCN','高阶法师',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70618','zhCN','恐惧魔王',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70619','zhCN','破法者',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70620','zhCN','黑暗游侠',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70621','zhCN','男',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70622','zhCN','女',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70623','zhCN','人类',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70624','zhCN','兽人',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70625','zhCN','矮人',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70626','zhCN','暗夜精灵',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70627','zhCN','亡灵',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70628','zhCN','牛头人',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70629','zhCN','侏儒',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70630','zhCN','地精',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70631','zhCN','血精灵',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70632','zhCN','德莱尼',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70633','zhCN','未知',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70634','zhCN','自动拾取',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70635','zhCN','|cff9d9d9d灰色|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70636','zhCN','|cffffffff白色|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70637','zhCN','|cff1eff00绿色|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70638','zhCN','|cff0070dd蓝色|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70639','zhCN','|cffa335ee紫色|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70640','zhCN','|cffff8000橙色|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70641','zhCN','参与行为',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70642','zhCN','|延迟攻击时间|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70643','zhCN','|延迟治疗时间|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70644','zhCN','|秒|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70645','zhCN','副坦克',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70646','zhCN','亡灵法师们',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70647','zhCN','亡灵法师',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70648','zhCN','攻击方向',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70649','zhCN','正常',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70650','zhCN','避免正面AOE',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70651','zhCN','|NIY|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70652','zhCN','|你确定这会奏效吗？最好是世界上最好的水....|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70653','zhCN','|看来你真的需要喝点淡水.|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70654','zhCN','海女巫们',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70655','zhCN','海女巫',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70656','zhCN','|每点伤害的法力|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70657','zhCN','|每点魔法的伤害|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70658','zhCN','幻化...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70659','zhCN','禁用战斗定位',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70660','zhCN','优先目标',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70661','zhCN','机器人装备银行...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70662','zhCN','存款项目...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70663','zhCN','撤回物品...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70664','zhCN','银行是空的',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70665','zhCN','前一页',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70666','zhCN','下一页',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70667','zhCN','你真的想花这么多钱让地穴领主再次动起来吗？',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70668','zhCN','我很怀疑你现在的状态,但我愿意带领你并帮助你恢复力量.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70669','zhCN','地穴领主们',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70670','zhCN','地穴领主',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70671','zhCN','反射',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70672','zhCN','蝗虫',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70673','zhCN','治疗目标生命阈值',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70674','zhCN','我需要传送门',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70675','zhCN','暴风城',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70676','zhCN','铁炉堡',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70677','zhCN','达纳苏斯',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70678','zhCN','埃索达',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70679','zhCN','奥格瑞玛',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70680','zhCN','幽暗城',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70681','zhCN','雷霆崖',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70682','zhCN','银月城',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70683','zhCN','沙塔斯城',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70684','zhCN','达拉然',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70685','zhCN','你已超过帐户的最大NPC机器人数量 ({} >= {})',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70686','zhCN','<为所有机器人设置>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70687','zhCN','(装备银行)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70688','zhCN','装备银行没有足够的空间存放 %u 件物品 (%u / %u)！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70689','zhCN','装备方案',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70690','zhCN','创建',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70691','zhCN','删除',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70692','zhCN','装备',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70693','zhCN','缺失',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);\n"
  },
  {
    "path": "AC/SQL/locales/zhTW/npc_text_locale.sql",
    "content": "DELETE FROM `npc_text_locale` WHERE `Locale`='zhTW' AND `ID` BETWEEN '70000' AND '71000';\nINSERT INTO `npc_text_locale` (`ID`, `Locale`, `Text0_0`, `Text0_1`, `Text1_0`, `Text1_1`, `Text2_0`, `Text2_1`, `Text3_0`, `Text3_1`, `Text4_0`, `Text4_1`, `Text5_0`, `Text5_1`, `Text6_0`, `Text6_1`, `Text7_0`, `Text7_1`)\nVALUES\n('70001','zhTW','我願意為你奉獻一切。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70002','zhTW','你需要什麼嗎？',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70003','zhTW','凡人，通常情況下，我會立刻殺了你這混蛋！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70004','zhTW','<你看著這個黑曜石毀滅者。它看起來有點與眾不同，它並沒有因為你的傷害而消失，在仔細檢查過後，你注意到它的背部有一個小口。>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70005','zhTW','<毀滅者盯著你，發出低沉的咆哮。>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70006','zhTW','你驚訝嗎，凡人？作為一名納斯雷茲姆，我不得不尋求盟友，你看起來至少可以逗我開心。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70007','zhTW','現在怎麼樣了，凡人？',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70008','zhTW','你就不能讓我一個人靜一靜嗎？ <唉...>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70009','zhTW','現在如何？',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70101','zhTW','|cffff3300劍聖|r$b|cffdd6600-=致敬魔獸爭霸III=-|r$B$B\\\\\\\"劍聖,以前是燃燒之刃家族的成員,現在是部落中的精銳戰士\\\".$B$B主要屬性:敏捷.$B$B疾風步.讓劍聖隱形,並在一段時間內移動得更快.當劍聖攻擊一個單位以打破隱身狀態時,他將造成額外的傷害.$B$B鏡像.製造劍聖幻象迷惑敵人,並驅散劍聖的所有魔法.$B$B爆擊(被動).有15%的機率在他的攻擊中造成致命的x2(x3,x4)倍的正常傷害.$B$B劍刃風暴. 給予魔法免疫並對周圍所有敵人造成傷害.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70102','zhTW','|cff9900cc黑曜石毀滅者|r$b|cffdd6600-=致敬魔獸爭霸III=-|r$B$B\\\\\\\"黑曜石毀滅者,對魔法有著無法滿足的渴望\\\\\\\".$B$B高護甲,非常高的抵抗力,部分免疫魔法,隨著時間的推移失去法力\\\\並且不受益於被動法力再生效果,鎧甲,雙持魔杖,造成暗影法術傷害,沒有物理攻擊\\\\法術傷害加成:50%攻擊力+200% 智力增加魔杖傷害.$B$B吞噬魔法.從敵人身上驅散最多2個魔法效果,從盟友身上驅散最多2個魔法效果和最多2個詛咒,並在20碼範圍內傷害召喚單位.每次驅散效果回復20%法力和5%生命,7秒冷卻.$B$B暗影爆炸.強化攻擊,增加飛濺傷害.$B$B吸取法力.從隨機友方單位吸取所有法力(受施法者法力限制).$B$B補充法力.給周圍15碼範圍內的團隊和團隊成員通電,使其法力值達到最大值的1%,影響最多10個目標,冷卻3秒.$B$B再生光環.治療周圍15碼範圍內的團隊和團隊成員,使其生命值降低施法者法力上限的2%,最多影響10個目標,冷卻3秒.$B$B暗影護甲(被動).恢復相當於所受傷害百分比的法力值.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70103','zhTW','|cff0000dd大魔導師|r$b|cffdd6600-=致敬魔獸爭霸III=-|r$B$B\\\\\\\"大法師,無法用言語來形容的暴雪親兒子\\\\\\\".$B$B法術傷害降低35%,部分免疫控制效果,布甲,造成火/冰法術傷害,無物理攻擊,法術能量加成:100%智力.主要屬性:智力.$B$B暴風雪！典型的暴風雪,只是稍微強大一點,6秒冷卻.召喚水元素攻擊大法師的敵人1分鐘,冷卻20秒.$B$B光輝光環.增加10%的法力上限,大大提高40碼範圍內己方和隊友的法力回復.$B$B大規模傳送.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70104','zhTW','|cff9900cc恐懼魔王|r$b|cffdd6600-=致敬魔獸爭霸III=-|r$B$B\\\\\\\"恐懼魔王,擁有黑暗力量和精神控制力的強大惡魔\\\\\\\".$B$B高護甲,高抵抗,部分免疫控制效果,所受傷害加速法術能量,鎧甲,造成近戰/暗影法術傷害,對癱瘓目標造成額外傷害,法術能量加成:200%力量.主要屬性:力量.$B$B腐蝕蟲群.派一大群蝙蝠與混亂魔法結合,對面前錐形範圍的敵人造成傷害,無法暴擊,冷卻10秒.$B$B沉睡.使敵方目標睡眠60秒,並允許下次對該目標的物理攻擊忽視護甲,造成的直接傷害將喚醒目標,冷卻6秒.$B$B吸血鬼的光環.增加5%的物理暴擊傷害,治療40碼範圍內的團隊和突襲成員受到近戰物理攻擊和腐肉群傷害的百分比(驚懼領主100%,其他人25%),沒有威脅.$B$B召喚地獄惡魔.召喚一個來自天空的惡魔,惡魔對魔法有很強的抵抗力並且持續180秒,180秒的冷卻時間.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70105','zhTW','|cff0000dd破法者|r$b|cffdd6600-=致敬魔獸爭霸III=-|r$B$B\\\\\\\"破法者,一個被訓練來破壞和扭曲魔法能量的精靈戰士\\\\\\\".$B$B法術傷害減少75%,部分免疫控制效果,護甲降低-30%,鎧甲,近戰/秘法傷害,法術能量加成:200%力量.主要屬性:力量.$B$B魔法偷取.從敵人身上偷取一個有益的法術並施於附近的盟友,或者從盟友身上移除一個消極的法術並施於附近的敵人,影響魔法和詛咒效果,3秒冷卻.$B$B能量竊取(被動).成功的近戰攻擊消耗目標的法力,相當於造成的傷害(由法術力增加),造成秘法傷害.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70106','zhTW','|cff9900cc黑暗遊俠|r$b|cffdd6600-=致敬魔獸爭霸III=-|r$B$B\\\\\\\"黑暗遊俠,強行起死回生的奎爾薩拉斯的前遊俠\\\\\\\".$B$B法術傷害減少35%,不死系,部分免疫控制效果,皮甲/布甲,造成物理/暗影法術傷害,不產生威脅,法術力量加成:50%智力.主要屬性:敏捷.$B$B沉默.使一個敵人和最多4個附近目標沉默8秒,15秒冷卻.$B$B黑箭.射出一支詛咒之箭,造成150%武器傷害和額外的暗影傷害.如果受影響的目標死於黑暗遊俠的傷害,黑暗僕從將從屍體中產生(最多5個僕從,持續時間80秒,只對人形、野獸和龍類有效).如果目標生命低於20%,造成5倍傷害.$B$B吸取生命.每秒吸取一個敵人的生命值,持續5秒,治療黑暗遊俠消耗生命值的200%.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70107','zhTW','|cff9900cc死靈法師|r$b|cffdd6600-=魔獸爭霸III / 暗黑破壞神II致敬=-|r$B$B受到的法術傷害減少20%,部分免疫控制效果,布甲,造成暗影法術傷害,沒有物理攻擊,法術強度加成: 智力的100%。主屬性: 智力。$B$B復活死者: 從屍體上復活2個骷髏(最多6個骷髏,持續65秒,只對人型生物、野獸和龍類有效)。$B$B邪惡狂熱: 增加目標的近戰攻擊速度75%,但持續消耗生命。持續45秒。不能取消。30級解鎖。$B$B屍體爆炸。讓屍體爆炸,對周圍所有敵人造成相當於死亡單位最大生命值35%至75%的傷害(取決於死靈法師的等級)。這種傷害不產生威脅。40級解鎖。$B$B殘廢: 減少目標的移動速度、近戰攻擊速度和總力量50%,持續60秒。50級解鎖。$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70108','zhTW','|cff0000dd海巫|r$b|cffdd6600-=魔獸爭霸III致敬=-|r$B$B\"海洋中的凶猛鱗皮居民,常與巨大風暴的到來聯繫在一起。\"$B$B受到的法術傷害減少30%,部分免疫控制效果,布甲,造成物理/冰霜法術/風暴法術傷害,攻擊力加成: 敏捷x2,法術強度加成: 智力的200%。主屬性: 智力。$B$B分叉閃電: 召喚一道閃電錐,傷害敵人。從2到所有目標(取決於海巫的等級),使它們昏迷2秒。這種傷害不產生威脅。$B$B冰霜箭。用冰霜法術為箭矢增加額外傷害,減慢目標的移動、攻擊和施法速度30%至70%(取決於海巫的等級)。$B$B法力護盾: 創造一個護盾,使用海巫的法力吸收100%的(未減免的)進來傷害。效果範圍從每10法力吸收1傷害到每1法力吸收10傷害(取決於海巫的等級)。$B$B龍捲風: 召喚一個猛烈的龍捲風,傷害並減慢附近敵方單位的速度,有時完全使它們失去行動能力。龍捲風在戶外隨時間增長,增加傷害和影響區域,但在室內縮小,迅速消散。60級解鎖。$B$B娜迦(被動): 在水中游泳速度、傷害和躲避機率大幅提升。$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70109','zhTW','|cff9900cc地穴領主|r$b|cffdd6600-=魔獸爭霸III致敬=-|r$B$B\"古老的龐然大物,曾是艾澤拉斯之王之一,現在是巫妖王麾下最強大的亡靈戰士之一。\"$B$B高度護甲,增加的抗性,部分免疫控制效果,免疫基於毒素的效果,鎖甲/板甲,造成近戰/暗影法術傷害,法術強度加成: 力量的200%。主屬性: 力量。$B$B穿刺。地穴領主用他巨大的爪子猛擊地面,向前錐形射出尖刺,造成傷害並將敵方單位掀入空中,使他們暈眩。20級解鎖。$B$B刺甲: 地穴領主的幾丁質護甲增加傷害抗性,並將15%至50%的傷害反彈給近戰攻擊者。$B$B腐屍甲蟲。地穴領主從敵人的新鮮屍體上產生一個腐屍甲蟲來攻擊他的敵人。甲蟲是永久的,但不會恢復生命值,一次最多控制6個。更高等級允許地穴領主召喚更強大的甲蟲。10級解鎖。$B$B蝗蟲群: 地穴領主釋放一群20-40隻(取決於地穴領主的等級)憤怒的蝗蟲,啃咬並撕扯附近的敵方單位,減少他們的移動或攻擊能力。當它們啃食敵人肉體時,它們將其轉化為一種物質,當它們返回時恢復地穴領主的生命值。40級解鎖。$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70201','zhTW','並不總是有人願意為錢去賣命！',NULL,'我們的服務遍布艾澤拉斯的每個角落！',NULL,'很高興為您服務，我這里有最能打的傢伙！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70202','zhTW','雇傭兵向來十分搶手；以下是現在你能雇傭的人：',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70203','zhTW','雇傭兵向來十分搶手；以下是現在你能雇傭的人：',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70204','zhTW','看來現在沒有空閒的雇傭兵，你過些時候再來看看吧。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70300','zhTW','去死！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70301','zhTW','正在復活你！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70302','zhTW','正在復活 ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70303','zhTW','你的機器人',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70304','zhTW','的機器人',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70305','zhTW','我現在還不能製造魔法水',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70306','zhTW','我現在還不能製造魔法食物',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70307','zhTW','我還不能那樣做',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70308','zhTW','給你...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70309','zhTW','已禁用',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70310','zhTW','還沒有準備好',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70311','zhTW','無效的物品類型',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70312','zhTW','失敗',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70313','zhTW','完成',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70314','zhTW','我沒有變形',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70315','zhTW','我沒有治療石',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70316','zhTW','我還不能製造治療石',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70317','zhTW','搞什麼鬼，我沒有鎖可開！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70318','zhTW','我的技能等級還不夠高',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70319','zhTW','正在將我的天賦切換為',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70320','zhTW','武器',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70321','zhTW','狂怒',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70322','zhTW','防護',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70323','zhTW','懲戒',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70324','zhTW','野獸控制',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70325','zhTW','射擊',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70326','zhTW','生存',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70327','zhTW','刺殺',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70328','zhTW','戰鬥',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70329','zhTW','敏銳',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70330','zhTW','戒律',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70331','zhTW','神聖',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70332','zhTW','暗影',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70333','zhTW','鮮血',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70334','zhTW','冰霜',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70335','zhTW','邪惡',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70336','zhTW','元素',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70337','zhTW','增強',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70338','zhTW','恢復',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70339','zhTW','秘法',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70340','zhTW','火焰',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70341','zhTW','痛苦',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70342','zhTW','惡魔學識',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70343','zhTW','毀滅',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70344','zhTW','平衡',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70345','zhTW','野性戰鬥',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70346','zhTW','未知',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70347','zhTW','滾開！ 懦夫。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70348','zhTW',' 不方便。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70349','zhTW','我不會把我寶貴的時間浪費在這些瑣事上！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70350','zhTW','NIY',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70351','zhTW','NIY',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70352','zhTW','NIY',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70353','zhTW','我準備好了',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70354','zhTW','走開！我已經有雇主了！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70355','zhTW','未知',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70356','zhTW','在你身上！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70357','zhTW','在我身上！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70358','zhTW',' 對 ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70359','zhTW',' 已使用！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70360','zhTW','坦克機器人',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70361','zhTW','職業',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70362','zhTW','玩家',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70363','zhTW','雇主',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70364','zhTW','無',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70365','zhTW','級別',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70366','zhTW','天賦',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70367','zhTW','被動',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70368','zhTW','隱藏',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70369','zhTW','已知',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70370','zhTW','能力',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70371','zhTW','力量',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70372','zhTW','敏捷',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70373','zhTW','耐力',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70374','zhTW','智力',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70375','zhTW','精神',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70376','zhTW','未知屬性',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70377','zhTW','共',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70378','zhTW','近戰攻擊強度',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70379','zhTW','遠程攻擊強度',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70380','zhTW','護甲',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70381','zhTW','暴擊',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70382','zhTW','防禦',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70383','zhTW','未命中',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70384','zhTW','躲閃',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70385','zhTW','招架',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70386','zhTW','格擋',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70387','zhTW','盾牌格擋值',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70388','zhTW','近戰防禦',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70389','zhTW','法術防禦',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70390','zhTW','主手攻擊傷害範圍',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70391','zhTW','主手攻擊傷害加成',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70392','zhTW','主手攻擊速度',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70393','zhTW','副手攻擊傷害範圍',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70394','zhTW','副手攻擊傷害加成',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70395','zhTW','副手攻擊速度',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70396','zhTW','遠程攻擊傷害範圍',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70397','zhTW','遠程攻擊傷害加成',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70398','zhTW','遠程攻擊速度',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70399','zhTW','最小',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70400','zhTW','最大',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70401','zhTW','輸出',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70402','zhTW','基礎生命值',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70403','zhTW','最大生命值',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70404','zhTW','基礎法力值',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70405','zhTW','最大法力值',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70406','zhTW','當前法力值',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70407','zhTW','法術強度',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70408','zhTW','每5秒恢復生命',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70409','zhTW','非施法狀態：每5秒回復法力值',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70410','zhTW','施法狀態：每5秒回復法力值',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70411','zhTW','急速',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70412','zhTW','命中',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70413','zhTW','專精',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70414','zhTW','物理 護甲穿透',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70415','zhTW','法術 護甲穿透',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70416','zhTW','%',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70417','zhTW','神聖',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70418','zhTW','火焰',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70419','zhTW','自然',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70420','zhTW','冰霜',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70421','zhTW','暗影',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70422','zhTW','秘法',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70423','zhTW','抗性',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70424','zhTW','指令狀態',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70425','zhTW','跟隨',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70426','zhTW','攻擊',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70427','zhTW','停留',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70428','zhTW','重置',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70429','zhTW','完全停止',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70430','zhTW','跟隨距離',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70431','zhTW','天賦',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70432','zhTW','機器人主職務',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70433','zhTW','機器人材料採集',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70434','zhTW','PvP 殺敵',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70435','zhTW','玩家',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70436','zhTW','已死亡 ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70437','zhTW',' 次',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70438','zhTW','%s （機器人）漸漸冷靜了下來。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70439','zhTW','<Debug調試>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70440','zhTW','你真的想冒險引起',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70441','zhTW','對你的注意？',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70442','zhTW','<請投幣>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70443','zhTW','你想吸引',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70444','zhTW','<試著發出邀請...>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70445','zhTW','你想雇傭',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70446','zhTW','<雇傭機器人>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70447','zhTW','機器人 裝備 管理...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70448','zhTW','機器人 職責 管理...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70449','zhTW','機器人 隊形 管理...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70450','zhTW','機器人 技能 管理...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70451','zhTW','機器人 天賦 管理...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70452','zhTW','使用消耗品、合劑等...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70453','zhTW','<創建隊伍>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70454','zhTW','<創建隊伍（所有機器人）>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70455','zhTW','<加入隊伍>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70456','zhTW','<將所有機器人加入隊伍>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70457','zhTW','<移出隊伍>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70458','zhTW','跟著我！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70459','zhTW','原地守候！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70460','zhTW','停下來，什麼也別做！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70461','zhTW','給我一些食物',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70462','zhTW','給我一些水',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70463','zhTW','召喚一個魔法餐桌！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70464','zhTW','幫我開個鎖',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70465','zhTW','給我一顆治療石',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70466','zhTW','召喚一個靈魂之井！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70467','zhTW','給你的武器重新上毒...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70468','zhTW','<選擇毒藥 （主手武器）>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70469','zhTW','<選擇毒藥 （副手武器）>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70470','zhTW','元素武器附魔...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70471','zhTW','<選擇附魔 （主手武器）>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70472','zhTW','<選擇附魔 （副手武器）>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70473','zhTW','取消你的變形形態',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70474','zhTW','<選擇寵物類型>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70475','zhTW','你被解雇了！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70476','zhTW','你確定要解雇',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70477','zhTW','你可別後悔...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70478','zhTW','該死的，振作起來！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70479','zhTW','<職業介紹>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70480','zhTW','沒事了',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70481','zhTW','距離',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70482','zhTW','返回',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70483','zhTW','<自動>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70484','zhTW','<解散寵物>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70485','zhTW','召喚隨機寵物 (狡詐型)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70486','zhTW','召喚隨機寵物 (殘暴型)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70487','zhTW','召喚隨機寵物 (堅韌型)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70488','zhTW','讓我看看你的裝備',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70489','zhTW','自動篩選可用裝備...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70490','zhTW','主手武器...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70491','zhTW','副手武器...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70492','zhTW','遠程武器...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70493','zhTW','聖物...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70494','zhTW','頭部...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70495','zhTW','肩部...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70496','zhTW','胸部...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70497','zhTW','腰帶...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70498','zhTW','腿部...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70499','zhTW','腳...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70500','zhTW','手腕...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70501','zhTW','手...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70502','zhTW','披風...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70503','zhTW','襯衣...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70504','zhTW','戒指1...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70505','zhTW','戒指2...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70506','zhTW','飾品1...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70507','zhTW','飾品2...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70508','zhTW','頸部...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70509','zhTW','卸下全部裝備（退回到背包）',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70510','zhTW','刷新機器人外觀',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70511','zhTW','只有外觀，無實際效果',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70512','zhTW','已裝備',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70513','zhTW','沒有可供選擇的裝備',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70514','zhTW','使用你的舊裝備',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70515','zhTW','卸下這件裝備',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70516','zhTW','額...我沒有適合你的裝備了...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70517','zhTW','收集材料',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70518','zhTW','技能狀態...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70519','zhTW','管理可用技能...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70520','zhTW','使用 ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70521','zhTW','刷新',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70522','zhTW','傷害類技能...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70523','zhTW','控制類技能...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70524','zhTW','治療類技能...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70525','zhTW','其他技能...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70526','zhTW',' 發出了一陣摩擦聲，並開始跟隨著 ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70527','zhTW','在他的雇主把他解雇之前， %s不能加入你的隊伍。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70528','zhTW','在你到達60級以前， %s不會加入你們',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70529','zhTW','在你到達55級以前， %s不會加入你們',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70530','zhTW','在你到達40級以前， %s不會加入你們',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70531','zhTW','在你到達20級以前， %s不會加入你們',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70532','zhTW','你最多只能招募%u個機器人！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70533','zhTW','你沒有足夠的現金',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70534','zhTW','你最多只能招募%u位%u。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70535','zhTW','無法退還裝備 %u (%s)! 無法解雇機器人！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70536','zhTW','當前設定',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70537','zhTW','攻擊距離',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70538','zhTW','最小遠程攻擊距離...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70539','zhTW','最大遠程攻擊距離...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70540','zhTW','設定攻擊距離',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70541','zhTW','移除增益魔法...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70542','zhTW','修正屬性...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70543','zhTW','因為某些原因，無法卸下 %s 這件裝備將發到你的郵箱。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70544','zhTW','坦克',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70545','zhTW','遠程',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70546','zhTW','採礦',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70547','zhTW','草藥',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70548','zhTW','剝皮',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70549','zhTW','工程學',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70550','zhTW','由於長時間未上線，已自動解除雇傭狀態。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70551','zhTW','機器人系統已被停用，請聯系管理員。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70552','zhTW','%s 不能假如你的隊伍，已經有雇主了：%s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70553','zhTW','%s 正在傳送中，不能加入你的隊伍',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70554','zhTW','守護',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70555','zhTW','靈猴',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70556','zhTW','雄鷹守護',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70557','zhTW','獵豹守護',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70558','zhTW','蝮蛇守護',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70559','zhTW','野獸守護',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70560','zhTW','豹群守護',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70561','zhTW','野性守護',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70562','zhTW','龍鷹守護',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70563','zhTW','無守護',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70564','zhTW','光環',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70565','zhTW','虔誠',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70566','zhTW','專注',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70567','zhTW','火焰抗性',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70568','zhTW','冰霜抗性',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70569','zhTW','暗影抗性',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70570','zhTW','懲戒',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70571','zhTW','十字軍',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70572','zhTW','無光環',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70573','zhTW','減速藥膏',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70574','zhTW','速效藥膏',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70575','zhTW','致命藥膏',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70576','zhTW','致傷藥膏',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70577','zhTW','麻痹藥膏',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70578','zhTW','麻醉藥膏',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70579','zhTW','無',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70580','zhTW','火舌武器',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70581','zhTW','冰封武器',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70582','zhTW','風怒武器',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70583','zhTW','大地生命武器',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70584','zhTW','我需要你的服務。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70585','zhTW','你不能再雇傭更多的機器人了。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70586','zhTW','你希望雇傭',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70587','zhTW','現在正在忙著，請稍後再試。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70588','zhTW','很高興和你進行交易。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70589','zhTW','戰士',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70590','zhTW','聖騎士',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70591','zhTW','法師',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70592','zhTW','牧師',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70593','zhTW','術士',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70594','zhTW','德魯伊',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70595','zhTW','死亡騎士',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70596','zhTW','盜賊',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70597','zhTW','薩滿',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70598','zhTW','獵人',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70599','zhTW','劍聖',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70600','zhTW','黑曜石毀滅者',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70601','zhTW','大法師',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70602','zhTW','恐懼魔王',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70603','zhTW','破法者',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70604','zhTW','黑暗遊俠',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70605','zhTW','戰士',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70606','zhTW','聖騎士',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70607','zhTW','法師',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70608','zhTW','牧師',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70609','zhTW','術士',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70610','zhTW','德魯伊',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70611','zhTW','死亡騎士',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70612','zhTW','盜賊',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70613','zhTW','薩滿',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70614','zhTW','獵人',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70615','zhTW','劍聖',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70616','zhTW','黑曜石毀滅者',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70617','zhTW','大法師',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70618','zhTW','恐懼魔王',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70619','zhTW','破法者',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70620','zhTW','黑暗遊俠',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70621','zhTW','男',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70622','zhTW','女',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70623','zhTW','人類',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70624','zhTW','獸人',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70625','zhTW','矮人',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70626','zhTW','夜精靈',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70627','zhTW','不死族',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70628','zhTW','牛頭人',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70629','zhTW','地精',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70630','zhTW','食人妖',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70631','zhTW','血精靈',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70632','zhTW','德萊尼',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70633','zhTW','未知',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70634','zhTW','自動拾取',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70635','zhTW','|cff9d9d9d灰色|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70636','zhTW','|cffffffff白色|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70637','zhTW','|cff1eff00綠色|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70638','zhTW','|cff0070dd藍色|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70639','zhTW','|cffa335ee紫色|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70640','zhTW','|cffff8000橙色|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70641','zhTW','參與行為',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70642','zhTW','|延遲攻擊時間|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70643','zhTW','|延遲治療時間|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70644','zhTW','|秒|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70645','zhTW','|副坦克|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70646','zhTW','|死靈法師們|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70647','zhTW','|死靈法師|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70648','zhTW','|攻擊方向|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70649','zhTW','|正常|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70650','zhTW','|避免正面AOE|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70651','zhTW','|NIY|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70652','zhTW','|你確定這會奏效嗎？最好是世界上最好的水....|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70653','zhTW','|看來你真的需要喝點淡水。|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70654','zhTW','|海女巫們|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70655','zhTW','|海女巫|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70656','zhTW','|每點傷害的法力|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70657','zhTW','|每點魔法的傷害|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70658','zhTW','幻化...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70659','zhTW','禁用戰鬥定位',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70660','zhTW','優先目標',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70661','zhTW','機器人裝備銀行...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70662','zhTW','存款項目...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70663','zhTW','撤回物品...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70664','zhTW','銀行是空的',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70665','zhTW','前一頁',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70666','zhTW','下一頁',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70667','zhTW','你真的想花這麼多錢讓地窟領主再次動起來嗎？',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70668','zhTW','我很懷疑你現在的狀態,但我願意帶領你並幫助你恢復力量。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70669','zhTW','地窟領主們|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70670','zhTW','|地窟領主|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70671','zhTW','反射',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70672','zhTW','蝗蟲',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70673','zhTW','治療目標生命閾值',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70674','zhTW','我需要傳送門',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70675','zhTW','暴風城',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70676','zhTW','鐵爐堡',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70677','zhTW','達納蘇斯',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70678','zhTW','艾克索達',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70679','zhTW','奧格瑞瑪',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70680','zhTW','幽暗城',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70681','zhTW','雷霆崖',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70682','zhTW','銀月城',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70683','zhTW','沙塔斯城',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70684','zhTW','達拉然',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);\n"
  },
  {
    "path": "AC/SQL/merge_sqls_characters_unix.sh",
    "content": "#!/bin/bash\ncat characters_bots.sql > ALL_characters.sql\ncat updates/characters/*.sql >> ALL_characters.sql\n"
  },
  {
    "path": "AC/SQL/merge_sqls_characters_windows.bat",
    "content": "copy /a characters_bots.sql + /a updates\\characters\\*.sql /b ALL_characters.sql\n"
  },
  {
    "path": "AC/SQL/merge_sqls_world_unix.sh",
    "content": "#!/bin/bash\ncat *world_*.sql > ALL_world.sql\ncat updates/world/*.sql >> ALL_world.sql\n"
  },
  {
    "path": "AC/SQL/merge_sqls_world_windows.bat",
    "content": "copy /a *world_*.sql + /a updates\\world\\*.sql /b ALL_world.sql\n"
  },
  {
    "path": "AC/SQL/updates/characters/2020_05_15_characters_npcbot_NPCBots_4.7.8a-4.7.27a.sql",
    "content": "ALTER TABLE `characters_npcbot` ADD `spec` tinyint(3) unsigned NOT NULL DEFAULT '1' AFTER `roles`;\n"
  },
  {
    "path": "AC/SQL/updates/characters/2020_06_21_characters_npcbot_43fceb98.sql",
    "content": "DROP TEMPORARY TABLE IF EXISTS `npcbot_extras_temp`;\n\nCREATE TEMPORARY TABLE `npcbot_extras_temp` (\n  `entry` MEDIUMINT(8) UNSIGNED NOT NULL,\n  `class` TINYINT(3) UNSIGNED NOT NULL DEFAULT '1',\n  PRIMARY KEY (`entry`)\n) ENGINE=INNODB DEFAULT CHARSET=utf8;\n\nINSERT INTO `npcbot_extras_temp` (`entry`,`class`) VALUES\n('70001','1'),('70002','1'),('70003','1'),('70004','1'),('70005','1'),\n('70006','1'),('70007','1'),('70008','1'),('70009','1'),('70010','1'),\n('70011','1'),('70012','1'),('70013','1'),('70014','1'),('70015','1'),\n('70016','1'),('70017','1'),('70018','1'),('70019','1'),('70020','1'),\n('70021','1'),('70022','1'),('70023','1'),('70024','1'),('70025','1'),\n('70026','1'),('70027','1'),('70028','1'),('70029','1'),('70030','1'),\n('70031','1'),('70032','1'),('70033','1'),('70034','1'),('70035','1'),\n('70036','1'),('70037','1'),('70038','1'),('70051','2'),('70052','2'),\n('70053','2'),('70054','2'),('70055','2'),('70056','2'),('70057','2'),\n('70058','2'),('70059','2'),('70060','2'),('70061','2'),('70062','2'),\n('70063','2'),('70064','2'),('70065','2'),('70066','2'),('70067','2'),\n('70068','2'),('70069','2'),('70070','2'),('70071','2'),('70072','2'),\n('70073','2'),('70074','2'),('70101','3'),('70102','3'),('70103','3'),\n('70104','3'),('70105','3'),('70106','3'),('70107','3'),('70108','3'),\n('70109','3'),('70110','3'),('70111','3'),('70112','3'),('70113','3'),\n('70114','3'),('70115','3'),('70116','3'),('70117','3'),('70118','3'),\n('70119','3'),('70120','3'),('70121','3'),('70122','3'),('70123','3'),\n('70124','3'),('70125','3'),('70126','3'),('70127','3'),('70128','3'),\n('70129','3'),('70130','3'),('70131','3'),('70132','3'),('70133','3'),\n('70134','3'),('70135','3'),('70136','3'),('70137','3'),('70138','3'),\n('70139','3'),('70151','4'),('70152','4'),('70153','4'),('70154','4'),\n('70155','4'),('70156','4'),('70157','4'),('70158','4'),('70159','4'),\n('70160','4'),('70161','4'),('70162','4'),('70163','4'),('70164','4'),\n('70165','4'),('70166','4'),('70167','4'),('70168','4'),('70169','4'),\n('70170','4'),('70171','4'),('70172','4'),('70173','4'),('70174','4'),\n('70175','4'),('70176','4'),('70177','4'),('70178','4'),('70179','4'),\n('70180','4'),('70181','4'),('70201','5'),('70202','5'),('70203','5'),\n('70204','5'),('70205','5'),('70206','5'),('70207','5'),('70208','5'),\n('70209','5'),('70210','5'),('70211','5'),('70212','5'),('70213','5'),\n('70214','5'),('70215','5'),('70216','5'),('70217','5'),('70218','5'),\n('70219','5'),('70220','5'),('70221','5'),('70222','5'),('70223','5'),\n('70224','5'),('70225','5'),('70226','5'),('70227','5'),('70228','5'),\n('70229','5'),('70230','5'),('70231','5'),('70232','5'),('70233','5'),\n('70234','5'),('70235','5'),('70236','5'),('70237','5'),('70238','5'),\n('70239','5'),('70240','5'),('70251','7'),('70252','7'),('70253','7'),\n('70254','7'),('70255','7'),('70256','7'),('70257','7'),('70258','7'),\n('70259','7'),('70260','7'),('70261','7'),('70265','7'),('70267','7'),\n('70268','7'),('70301','8'),('70302','8'),('70303','8'),('70304','8'),\n('70305','8'),('70306','8'),('70307','8'),('70308','8'),('70309','8'),\n('70310','8'),('70311','8'),('70312','8'),('70313','8'),('70314','8'),\n('70315','8'),('70316','8'),('70317','8'),('70318','8'),('70319','8'),\n('70320','8'),('70321','8'),('70322','8'),('70323','8'),('70324','8'),\n('70325','8'),('70326','8'),('70327','8'),('70328','8'),('70329','8'),\n('70330','8'),('70331','8'),('70332','8'),('70333','8'),('70334','8'),\n('70335','8'),('70336','8'),('70351','9'),('70352','9'),('70353','9'),\n('70354','9'),('70355','9'),('70356','9'),('70357','9'),('70358','9'),\n('70359','9'),('70360','9'),('70361','9'),('70362','9'),('70363','9'),\n('70364','9'),('70365','9'),('70366','9'),('70367','9'),('70368','9'),\n('70369','9'),('70370','9'),('70371','9'),('70372','9'),('70373','9'),\n('70374','9'),('70375','9'),('70376','9'),('70377','9'),('70401','11'),\n('70402','11'),('70403','11'),('70404','11'),('70405','11'),('70406','11'),\n('70407','11'),('70408','11'),('70409','11'),('70410','11'),('70411','11'),\n('70412','11'),('70413','11'),('70414','11'),('70415','11'),('70416','11'),\n('70417','11'),('70418','11'),('70451','6'),('70452','6'),('70453','6'),\n('70454','6'),('70455','6'),('70456','6'),('70457','6'),('70458','6'),\n('70459','6'),('70460','6'),('70461','6'),('70462','6'),('70463','6'),\n('70464','6'),('70465','6'),('70501','0'),('70502','0'),('70503','0'),\n('70504','0'),('70505','0'),('70506','0'),('70507','0'),('70508','0'),\n('70509','0'),('70510','0'),('70511','0'),('70512','0'),('70513','0'),\n('70514','0'),('70515','0'),('70516','0'),('70517','0'),('70518','0'),\n('70519','0'),('70520','0'),('70521','0'),('70522','0'),('70523','0'),\n('70524','0'),('70525','0'),('70526','0'),('70527','0'),('70528','0'),\n('70529','0'),('70530','0'),('70531','0'),('70532','0'),('70533','0'),\n('70534','0'),('70535','0'),('70536','0'),('70537','0'),('70538','0'),\n('70542','0'),('70543','0'),('70544','0'),('70545','0'),('70551','12'),\n('70552','12'),('70553','13'),('70554','13'),('70555','14'),('70556','0'),\n('70557','15'),('70558','15'),('70559','15'),('70560','15'),('70561','15'),\n('70562','0'),('70563','16'),('70564','16'),('70565','16'),('70566','16'),\n('70567','16'),('70568','17'),('70569','17'),('70570','17'),('70571','17'),\n('70572','17'),('70573','0'),('70574','0');\n\n/*!50003 DROP PROCEDURE IF EXISTS `sp__update_specs_2020_06_21`*/;\n\nDELIMITER ;;\n\n/*!50003 CREATE*/\n/*!50003 PROCEDURE `sp__update_specs_2020_06_21`()\nBEGIN\n\nDECLARE CLASS_WARRIOR INT DEFAULT 1;\nDECLARE CLASS_PALADIN INT DEFAULT 2;\nDECLARE CLASS_HUNTER INT DEFAULT 3;\nDECLARE CLASS_ROGUE INT DEFAULT 4;\nDECLARE CLASS_PRIEST INT DEFAULT 5;\nDECLARE CLASS_DEATH_KNIGHT INT DEFAULT 6;\nDECLARE CLASS_SHAMAN INT DEFAULT 7;\nDECLARE CLASS_MAGE INT DEFAULT 8;\nDECLARE CLASS_WARLOCK INT DEFAULT 9;\nDECLARE CLASS_DRUID INT DEFAULT 11;\nDECLARE CLASS_BLADEMASTER INT DEFAULT 12;\nDECLARE CLASS_SPHYNX INT DEFAULT 13;\nDECLARE CLASS_ARCHMAGE INT DEFAULT 14;\nDECLARE CLASS_DREADLORD INT DEFAULT 15;\nDECLARE CLASS_SPELL_BREAKER INT DEFAULT 16;\nDECLARE CLASS_DARK_RANGER INT DEFAULT 17;\n\nDECLARE SPEC_START_WARRIOR INT DEFAULT 1;\nDECLARE SPEC_START_PALADIN INT DEFAULT 4;\nDECLARE SPEC_START_HUNTER INT DEFAULT 7;\nDECLARE SPEC_START_ROGUE INT DEFAULT 10;\nDECLARE SPEC_START_PRIEST INT DEFAULT 13;\nDECLARE SPEC_START_DEATH_KNIGHT INT DEFAULT 16;\nDECLARE SPEC_START_SHAMAN INT DEFAULT 19;\nDECLARE SPEC_START_MAGE INT DEFAULT 22;\nDECLARE SPEC_START_WARLOCK INT DEFAULT 25;\nDECLARE SPEC_START_DRUID INT DEFAULT 28;\nDECLARE SPEC_DEFAULT INT DEFAULT 31;\n\nDECLARE NPCBOT_ENTRY_BEGIN INT DEFAULT 70001;\nDECLARE NPCBOT_ENTRY_END INT DEFAULT 71000;\n\nDECLARE cur_pos INT;\nDECLARE myclass INT;\nDECLARE myspec INT;\n\nSET cur_pos = NPCBOT_ENTRY_BEGIN;\nWHILE cur_pos < NPCBOT_ENTRY_END DO\n    SET myclass = (SELECT `class` FROM `npcbot_extras_temp` WHERE `entry` = cur_pos);\n    SET myspec = (SELECT `spec` FROM `characters_npcbot` WHERE `entry` = cur_pos);\n\n    IF myclass != 0 AND myspec != 0 AND myspec < 4 THEN\n\n        IF myclass = CLASS_WARRIOR THEN\n            SET myspec = myspec + SPEC_START_WARRIOR - 1;\n        ELSEIF myclass = CLASS_PALADIN THEN\n            SET myspec = myspec + SPEC_START_PALADIN - 1;\n        ELSEIF myclass = CLASS_HUNTER THEN\n            SET myspec = myspec + SPEC_START_HUNTER - 1;\n        ELSEIF myclass = CLASS_ROGUE THEN\n            SET myspec = myspec + SPEC_START_ROGUE - 1;\n        ELSEIF myclass = CLASS_PRIEST THEN\n            SET myspec = myspec + SPEC_START_PRIEST - 1;\n        ELSEIF myclass = CLASS_DEATH_KNIGHT THEN\n            SET myspec = myspec + SPEC_START_DEATH_KNIGHT - 1;\n        ELSEIF myclass = CLASS_SHAMAN THEN\n            SET myspec = myspec + SPEC_START_SHAMAN - 1;\n        ELSEIF myclass = CLASS_MAGE THEN\n            SET myspec = myspec + SPEC_START_MAGE - 1;\n        ELSEIF myclass = CLASS_WARLOCK THEN\n            SET myspec = myspec + SPEC_START_WARLOCK - 1;\n        ELSEIF myclass = CLASS_DRUID THEN\n            SET myspec = myspec + SPEC_START_DRUID - 1;\n        ELSE\n            SET myspec = SPEC_DEFAULT;\n        END IF;\n\n        UPDATE `characters_npcbot` SET `spec` = myspec WHERE `entry` = cur_pos;\n\n    END IF;\n\n    SET cur_pos = cur_pos + 1;\n\nEND WHILE;\n\nDROP TEMPORARY TABLE IF EXISTS `npcbot_extras_temp`;\n\nEND*/;;\n\nDELIMITER ;\n\nCALL `sp__update_specs_2020_06_21`();\n\nDROP PROCEDURE IF EXISTS `sp__update_specs_2020_06_21`;\n"
  },
  {
    "path": "AC/SQL/updates/characters/2020_10_08_characters_npcbot_NPCBots_4.7.34a-4.7.39a.sql",
    "content": "ALTER TABLE `characters_npcbot` ADD `spells_disabled` longtext AFTER `equipNeck`;\n"
  },
  {
    "path": "AC/SQL/updates/characters/2021_01_04_characters_npcbot.sql",
    "content": "ALTER TABLE `characters_npcbot` MODIFY COLUMN `roles` int(10) unsigned NOT NULL COMMENT 'bitmask: tank(1),dps(2),heal(4),ranged(8)';\n"
  },
  {
    "path": "AC/SQL/updates/characters/2021_01_24_characters_npcbot_stats.sql",
    "content": "DROP TABLE IF EXISTS `characters_npcbot_stats`;\n\nCREATE TABLE `characters_npcbot_stats` (\n  `entry` int(10) unsigned NOT NULL DEFAULT '0',\n  `maxhealth` int(10) unsigned NOT NULL DEFAULT '0',\n  `maxpower` int(10) unsigned NOT NULL DEFAULT '0',\n  `strength` int(10) unsigned NOT NULL DEFAULT '0',\n  `agility` int(10) unsigned NOT NULL DEFAULT '0',\n  `stamina` int(10) unsigned NOT NULL DEFAULT '0',\n  `intellect` int(10) unsigned NOT NULL DEFAULT '0',\n  `spirit` int(10) unsigned NOT NULL DEFAULT '0',\n  `armor` int(10) unsigned NOT NULL DEFAULT '0',\n  `defense` int(10) unsigned NOT NULL DEFAULT '0',\n  `resHoly` int(10) unsigned NOT NULL DEFAULT '0',\n  `resFire` int(10) unsigned NOT NULL DEFAULT '0',\n  `resNature` int(10) unsigned NOT NULL DEFAULT '0',\n  `resFrost` int(10) unsigned NOT NULL DEFAULT '0',\n  `resShadow` int(10) unsigned NOT NULL DEFAULT '0',\n  `resArcane` int(10) unsigned NOT NULL DEFAULT '0',\n  `blockPct` float unsigned NOT NULL DEFAULT '0',\n  `dodgePct` float unsigned NOT NULL DEFAULT '0',\n  `parryPct` float unsigned NOT NULL DEFAULT '0',\n  `critPct` float unsigned NOT NULL DEFAULT '0',\n  `attackPower` int(10) unsigned NOT NULL DEFAULT '0',\n  `spellPower` int(10) unsigned NOT NULL DEFAULT '0',\n  `spellPen` int(10) unsigned NOT NULL DEFAULT '0',\n  `hastePct` float unsigned NOT NULL DEFAULT '0',\n  `hitBonusPct` float unsigned NOT NULL DEFAULT '0',\n  `expertise` int(10) unsigned NOT NULL DEFAULT '0',\n  `armorPenPct` float unsigned NOT NULL DEFAULT '0',\n  PRIMARY KEY (`entry`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n"
  },
  {
    "path": "AC/SQL/updates/characters/2021_08_27_characters_npcbot.sql",
    "content": "-- An update for shifted roles\nUPDATE `characters_npcbot` SET `roles` = (roles & 0x1) | ((roles & ~0x1) << 1);\n"
  },
  {
    "path": "AC/SQL/updates/characters/2022_11_15_characters_npcbot_transmog.sql",
    "content": "--\nDROP TABLE IF EXISTS `characters_npcbot_transmog`;\nCREATE TABLE `characters_npcbot_transmog` (\n  `entry` int(10) unsigned NOT NULL,\n  `slot` tinyint(3) unsigned NOT NULL,\n  `item_id` int(10) unsigned NOT NULL DEFAULT '0',\n  `fake_id` int(10) unsigned NOT NULL DEFAULT '0',\n  PRIMARY KEY (`entry`,`slot`),\n  CONSTRAINT `bot_id` FOREIGN KEY (`entry`) REFERENCES `characters_npcbot` (`entry`) ON DELETE CASCADE ON UPDATE CASCADE\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n"
  },
  {
    "path": "AC/SQL/updates/characters/2022_11_27_characters_npcbot_group_member.sql",
    "content": "--\nDROP TABLE IF EXISTS `characters_npcbot_group_member`;\nCREATE TABLE `characters_npcbot_group_member` (\n  `guid` int(10) unsigned NOT NULL,\n  `entry` int(10) unsigned NOT NULL,\n  `memberFlags` tinyint(3) unsigned NOT NULL DEFAULT '0',\n  `subgroup` tinyint(3) unsigned NOT NULL DEFAULT '0',\n  `roles` tinyint(3) unsigned NOT NULL DEFAULT '0',\n  PRIMARY KEY (`entry`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n"
  },
  {
    "path": "AC/SQL/updates/characters/2023_05_16_00_characters_npcbot_gear_storage.sql",
    "content": "--\nSET FOREIGN_KEY_CHECKS=0;\nDROP TABLE IF EXISTS `characters_npcbot_gear_storage`;\nCREATE TABLE `characters_npcbot_gear_storage` (\n  `guid` int(10) unsigned NOT NULL DEFAULT '0',\n  `item_guid` int(10) unsigned NOT NULL DEFAULT '0',\n  PRIMARY KEY (`item_guid`),\n  KEY `existing_player` (`guid`),\n  CONSTRAINT `characters_npcbot_gear_storage_ibfk_1` FOREIGN KEY (`item_guid`) REFERENCES `item_instance` (`guid`) ON DELETE CASCADE ON UPDATE CASCADE,\n  CONSTRAINT `existing_player` FOREIGN KEY (`guid`) REFERENCES `characters` (`guid`) ON DELETE CASCADE ON UPDATE CASCADE\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Bot item storage system';\n"
  },
  {
    "path": "AC/SQL/updates/characters/2023_05_26_00_characters_npcbot_transmog.sql",
    "content": "--\nALTER TABLE `characters_npcbot_transmog` MODIFY `fake_id` int(11) NOT NULL DEFAULT '-1' AFTER `item_id`;\n"
  },
  {
    "path": "AC/SQL/updates/characters/2024_03_12_00_characters_npcbot.sql",
    "content": "--\n/*!50003 DROP PROCEDURE IF EXISTS `sp__drop_column_if_exists`*/;\nDELIMITER ;;\n/*!50003 CREATE*/\n/*!50003 PROCEDURE `sp__drop_column_if_exists`(`@TABLE` varchar(100), `@COLUMN` varchar(100))\nBEGIN\nDECLARE `@EXISTS` INT DEFAULT 0;\nSELECT COUNT(*) INTO `@EXISTS` FROM `information_schema`.`columns`WHERE `TABLE_SCHEMA` = DATABASE() AND `TABLE_NAME` = `@TABLE` AND `COLUMN_NAME` = `@COLUMN`;\nIF (`@EXISTS` > 0) THEN\n    ALTER TABLE `characters_npcbot` DROP COLUMN `hire_time`;\nEND IF;\nEND */;;\n\nDELIMITER ;\n\nCALL `sp__drop_column_if_exists`('characters_npcbot', 'hire_time');\n\nDROP PROCEDURE IF EXISTS `sp__drop_column_if_exists`;\n\nALTER TABLE `characters_npcbot` ADD `hire_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP AFTER `faction`;\n"
  },
  {
    "path": "AC/SQL/updates/characters/2024_05_29_00_characters_npcbot_logs.sql",
    "content": "--\nSET FOREIGN_KEY_CHECKS=0;\nDROP TABLE IF EXISTS `characters_npcbot_logs`;\nCREATE TABLE `characters_npcbot_logs` (\n  `id` bigint unsigned NOT NULL AUTO_INCREMENT,\n  `entry` int unsigned NOT NULL DEFAULT '0',\n  `owner` int NOT NULL DEFAULT '-1',\n  `mapid` int NOT NULL DEFAULT '-1',\n  `inmap` tinyint NOT NULL DEFAULT '-1',\n  `inworld` tinyint NOT NULL DEFAULT '-1',\n  `type` smallint unsigned NOT NULL DEFAULT '0',\n  `param1` varchar(51) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,\n  `param2` varchar(51) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,\n  `param3` varchar(51) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,\n  `param4` varchar(51) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,\n  `param5` varchar(51) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,\n  `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;\n"
  },
  {
    "path": "AC/SQL/updates/characters/2024_10_17_00_characters_npcbot_settings.sql",
    "content": "--\nSET FOREIGN_KEY_CHECKS=0;\nDROP TABLE IF EXISTS `characters_npcbot_settings`;\nCREATE TABLE `characters_npcbot_settings` (\n  `owner` int unsigned NOT NULL,\n  `dist_follow` tinyint unsigned NOT NULL DEFAULT '30',\n  `dist_attack` tinyint unsigned NOT NULL DEFAULT '0',\n  `attack_range_mode` tinyint unsigned NOT NULL DEFAULT '1',\n  `attack_angle_mode` tinyint unsigned NOT NULL DEFAULT '1',\n  `engage_delay_dps` int unsigned NOT NULL DEFAULT '0',\n  `engage_delay_heal` int unsigned NOT NULL DEFAULT '0',\n  `flags` int unsigned NOT NULL DEFAULT '0',\n  PRIMARY KEY (`owner`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;\n"
  },
  {
    "path": "AC/SQL/updates/characters/2024_11_13_00_characters_npcbot_gear_set.sql",
    "content": "--\nDROP TABLE IF EXISTS `characters_npcbot_gear_set`;\nCREATE TABLE `characters_npcbot_gear_set` (\n  `owner` int unsigned NOT NULL DEFAULT '0',\n  `set_id` tinyint unsigned NOT NULL DEFAULT '0',\n  `set_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n  PRIMARY KEY (`owner`,`set_id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Bot equipment sets system';\n"
  },
  {
    "path": "AC/SQL/updates/characters/2024_11_13_01_characters_npcbot_gear_set_item.sql",
    "content": "--\nDROP TABLE IF EXISTS `characters_npcbot_gear_set_item`;\nCREATE TABLE `characters_npcbot_gear_set_item` (\n  `owner` int unsigned NOT NULL DEFAULT '0',\n  `set_id` tinyint unsigned NOT NULL DEFAULT '0',\n  `slot` tinyint unsigned NOT NULL DEFAULT '0',\n  `item_id` mediumint unsigned NOT NULL DEFAULT '0',\n  PRIMARY KEY (`owner`,`set_id`,`slot`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Bot equipment sets system';\n"
  },
  {
    "path": "AC/SQL/updates/characters/2024_11_21_00_characters_npcbot.sql",
    "content": "--\nALTER TABLE `characters_npcbot` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;\nALTER TABLE `characters_npcbot` ADD `miscvalues` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL AFTER `spells_disabled`;\n"
  },
  {
    "path": "AC/SQL/updates/world/2020_07_08_creature_template_npcbot_extras.sql",
    "content": "-- Zandine race fix\nUPDATE `creature_template_npcbot_extras` SET `race`='10' WHERE (`entry`='70135');\n"
  },
  {
    "path": "AC/SQL/updates/world/2020_10_14_creature_classlevelstats.sql",
    "content": "--\nSET @CLASS_HUNTER           = 3;\nSET @CLASS_PRIEST           = 5;\nSET @CLASS_DK               = 6;\nSET @CLASS_SHAMAN           = 7;\nSET @CLASS_WARLOCK          = 9;\nSET @CLASS_DRUID            = 11;\n\n-- actual values are irrelevant, but hp and mana must be > 1\nDELETE FROM `creature_classlevelstats` WHERE `class` IN (@CLASS_HUNTER,@CLASS_PRIEST,@CLASS_DK,@CLASS_SHAMAN,@CLASS_WARLOCK,@CLASS_DRUID) AND `level` BETWEEN '1' AND '100';\nINSERT INTO `creature_classlevelstats` (`level`,`class`,`basehp0`,`basehp1`,`basehp2`,`basemana`,`basearmor`,`attackpower`,`rangedattackpower`,`damage_base`,`damage_exp1`,`damage_exp2`,`comment`) VALUES\n('1', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('1', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('1', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('1', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('1', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('1', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('2', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('2', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('2', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('2', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('2', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('2', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('3', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('3', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('3', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('3', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('3', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('3', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('4', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('4', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('4', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('4', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('4', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('4', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('5', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('5', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('5', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('5', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('5', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('5', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('6', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('6', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('6', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('6', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('6', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('6', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('7', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('7', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('7', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('7', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('7', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('7', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('8', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('8', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('8', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('8', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('8', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('8', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('9', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('9', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('9', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('9', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('9', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('9', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('10', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('10', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('10', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('10', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('10', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('10', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('11', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('11', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('11', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('11', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('11', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('11', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('12', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('12', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('12', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('12', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('12', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('12', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('13', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('13', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('13', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('13', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('13', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('13', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('14', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('14', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('14', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('14', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('14', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('14', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('15', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('15', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('15', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('15', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('15', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('15', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('16', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('16', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('16', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('16', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('16', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('16', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('17', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('17', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('17', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('17', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('17', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('17', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('18', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('18', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('18', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('18', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('18', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('18', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('19', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('19', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('19', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('19', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('19', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('19', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('20', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('20', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('20', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('20', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('20', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('20', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('21', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('21', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('21', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('21', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('21', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('21', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('22', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('22', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('22', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('22', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('22', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('22', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('23', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('23', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('23', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('23', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('23', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('23', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('24', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('24', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('24', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('24', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('24', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('24', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('25', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('25', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('25', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('25', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('25', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('25', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('26', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('26', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('26', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('26', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('26', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('26', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('27', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('27', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('27', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('27', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('27', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('27', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('28', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('28', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('28', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('28', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('28', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('28', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('29', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('29', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('29', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('29', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('29', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('29', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('30', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('30', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('30', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('30', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('30', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('30', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('31', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('31', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('31', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('31', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('31', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('31', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('32', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('32', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('32', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('32', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('32', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('32', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('33', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('33', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('33', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('33', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('33', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('33', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('34', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('34', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('34', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('34', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('34', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('34', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('35', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('35', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('35', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('35', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('35', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('35', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('36', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('36', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('36', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('36', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('36', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('36', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('37', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('37', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('37', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('37', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('37', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('37', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('38', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('38', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('38', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('38', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('38', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('38', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('39', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('39', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('39', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('39', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('39', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('39', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('40', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('40', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('40', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('40', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('40', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('40', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('41', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('41', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('41', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('41', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('41', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('41', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('42', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('42', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('42', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('42', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('42', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('42', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('43', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('43', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('43', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('43', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('43', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('43', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('44', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('44', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('44', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('44', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('44', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('44', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('45', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('45', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('45', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('45', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('45', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('45', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('46', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('46', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('46', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('46', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('46', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('46', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('47', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('47', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('47', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('47', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('47', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('47', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('48', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('48', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('48', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('48', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('48', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('48', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('49', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('49', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('49', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('49', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('49', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('49', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('50', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('50', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('50', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('50', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('50', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('50', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('51', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('51', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('51', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('51', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('51', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('51', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('52', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('52', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('52', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('52', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('52', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('52', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('53', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('53', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('53', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('53', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('53', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('53', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('54', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('54', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('54', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('54', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('54', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('54', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('55', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('55', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('55', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('55', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('55', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('55', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('56', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('56', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('56', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('56', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('56', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('56', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('57', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('57', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('57', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('57', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('57', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('57', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('58', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('58', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('58', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('58', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('58', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('58', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('59', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('59', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('59', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('59', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('59', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('59', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('60', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('60', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('60', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('60', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('60', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('60', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('61', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('61', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('61', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('61', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('61', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('61', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('62', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('62', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('62', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('62', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('62', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('62', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('63', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('63', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('63', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('63', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('63', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('63', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('64', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('64', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('64', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('64', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('64', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('64', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('65', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('65', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('65', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('65', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('65', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('65', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('66', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('66', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('66', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('66', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('66', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('66', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('67', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('67', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('67', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('67', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('67', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('67', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('68', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('68', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('68', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('68', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('68', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('68', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('69', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('69', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('69', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('69', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('69', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('69', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('70', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('70', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('70', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('70', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('70', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('70', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('71', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('71', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('71', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('71', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('71', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('71', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('72', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('72', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('72', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('72', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('72', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('72', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('73', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('73', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('73', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('73', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('73', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('73', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('74', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('74', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('74', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('74', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('74', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('74', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('75', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('75', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('75', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('75', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('75', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('75', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('76', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('76', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('76', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('76', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('76', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('76', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('77', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('77', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('77', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('77', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('77', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('77', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('78', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('78', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('78', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('78', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('78', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('78', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('79', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('79', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('79', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('79', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('79', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('79', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('80', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('80', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('80', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('80', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('80', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('80', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('81', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('81', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('81', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('81', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('81', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('81', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('82', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('82', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('82', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('82', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('82', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('82', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('83', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('83', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('83', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('83', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('83', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('83', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('84', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('84', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('84', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('84', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('84', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('84', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('85', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('85', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('85', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('85', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('85', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('85', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('86', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('86', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('86', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('86', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('86', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('86', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('87', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('87', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('87', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('87', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('87', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('87', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('88', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('88', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('88', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('88', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('88', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('88', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('89', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('89', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('89', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('89', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('89', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('89', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('90', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('90', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('90', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('90', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('90', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('90', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('91', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('91', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('91', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('91', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('91', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('91', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('92', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('92', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('92', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('92', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('92', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('92', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('93', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('93', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('93', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('93', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('93', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('93', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('94', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('94', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('94', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('94', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('94', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('94', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('95', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('95', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('95', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('95', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('95', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('95', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('96', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('96', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('96', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('96', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('96', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('96', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('97', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('97', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('97', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('97', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('97', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('97', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('98', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('98', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('98', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('98', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('98', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('98', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('99', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('99', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('99', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('99', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('99', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('99', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('100', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('100', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('100', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('100', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('100', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('100', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL);\n"
  },
  {
    "path": "AC/SQL/updates/world/2020_10_14_creature_template.sql",
    "content": "--\nSET @CLASS_WARRIOR          = 1;\nSET @CLASS_PALADIN          = 2;\nSET @CLASS_HUNTER           = 3;\nSET @CLASS_ROGUE            = 4;\nSET @CLASS_PRIEST           = 5;\nSET @CLASS_DK               = 6;\nSET @CLASS_SHAMAN           = 7;\nSET @CLASS_MAGE             = 8;\nSET @CLASS_WARLOCK          = 9;\nSET @CLASS_DRUID            = 11;\nSET @CLASS_BM               = 12;\nSET @CLASS_SPHYNX           = 13;\nSET @CLASS_ARCHMAGE         = 14;\nSET @CLASS_DREADLORD        = 15;\nSET @CLASS_SPELLBREAKER     = 16;\nSET @CLASS_DARK_RANGER      = 17;\n\nUPDATE `creature_template` SET `unit_class`:=@CLASS_DK\nWHERE `entry` IN (SELECT `entry` FROM `creature_template_npcbot_extras` WHERE `class`=@CLASS_DK);\nUPDATE `creature_template` SET `unit_class`:=@CLASS_DRUID\nWHERE `entry` IN (SELECT `entry` FROM `creature_template_npcbot_extras` WHERE `class`=@CLASS_DRUID);\nUPDATE `creature_template` SET `unit_class`:=@CLASS_HUNTER\nWHERE `entry` IN (SELECT `entry` FROM `creature_template_npcbot_extras` WHERE `class`=@CLASS_HUNTER);\nUPDATE `creature_template` SET `unit_class`:=@CLASS_MAGE\nWHERE `entry` IN (SELECT `entry` FROM `creature_template_npcbot_extras` WHERE `class`=@CLASS_MAGE);\nUPDATE `creature_template` SET `unit_class`:=@CLASS_PALADIN\nWHERE `entry` IN (SELECT `entry` FROM `creature_template_npcbot_extras` WHERE `class`=@CLASS_PALADIN);\nUPDATE `creature_template` SET `unit_class`:=@CLASS_PRIEST\nWHERE `entry` IN (SELECT `entry` FROM `creature_template_npcbot_extras` WHERE `class`=@CLASS_PRIEST);\nUPDATE `creature_template` SET `unit_class`:=@CLASS_ROGUE\nWHERE `entry` IN (SELECT `entry` FROM `creature_template_npcbot_extras` WHERE `class`=@CLASS_ROGUE);\nUPDATE `creature_template` SET `unit_class`:=@CLASS_SHAMAN\nWHERE `entry` IN (SELECT `entry` FROM `creature_template_npcbot_extras` WHERE `class`=@CLASS_SHAMAN);\nUPDATE `creature_template` SET `unit_class`:=@CLASS_WARLOCK\nWHERE `entry` IN (SELECT `entry` FROM `creature_template_npcbot_extras` WHERE `class`=@CLASS_WARLOCK);\nUPDATE `creature_template` SET `unit_class`:=@CLASS_WARRIOR\nWHERE `entry` IN (SELECT `entry` FROM `creature_template_npcbot_extras` WHERE `class`=@CLASS_WARRIOR);\nUPDATE `creature_template` SET `unit_class`:=@CLASS_WARRIOR\nWHERE `entry` IN (SELECT `entry` FROM `creature_template_npcbot_extras` WHERE `class`=@CLASS_BM);\nUPDATE `creature_template` SET `unit_class`:=@CLASS_WARLOCK\nWHERE `entry` IN (SELECT `entry` FROM `creature_template_npcbot_extras` WHERE `class`=@CLASS_SPHYNX);\nUPDATE `creature_template` SET `unit_class`:=@CLASS_MAGE\nWHERE `entry` IN (SELECT `entry` FROM `creature_template_npcbot_extras` WHERE `class`=@CLASS_ARCHMAGE);\nUPDATE `creature_template` SET `unit_class`:=@CLASS_WARLOCK\nWHERE `entry` IN (SELECT `entry` FROM `creature_template_npcbot_extras` WHERE `class`=@CLASS_DREADLORD);\nUPDATE `creature_template` SET `unit_class`:=@CLASS_PALADIN\nWHERE `entry` IN (SELECT `entry` FROM `creature_template_npcbot_extras` WHERE `class`=@CLASS_SPELLBREAKER);\nUPDATE `creature_template` SET `unit_class`:=@CLASS_DK\nWHERE `entry` IN (SELECT `entry` FROM `creature_template_npcbot_extras` WHERE `class`=@CLASS_DARK_RANGER);\n"
  },
  {
    "path": "AC/SQL/updates/world/2020_10_15_creature_template.sql",
    "content": "--\nUPDATE `creature_template` SET `unit_flags2`='16416' WHERE `entry` IN ('70551','70552');\n"
  },
  {
    "path": "AC/SQL/updates/world/2020_11_07_npc_text.sql",
    "content": "--\nSET @LOCALIZED_STRINGS_START = 70300;\nSET @LOCALIZED_STRINGS_END   = 70799;\n\n-- LOCALIZATION STRING --\n\nDELETE FROM `npc_text` WHERE ID BETWEEN @LOCALIZED_STRINGS_START and @LOCALIZED_STRINGS_END;\nINSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n('70300','Die!','-1'),\n('70301','Rezzing You','-1'),\n('70302','Rezzing ','-1'),\n('70303','your bot','-1'),\n('70304','\\'s bot','-1'),\n('70305','I can\\'t conjure water yet','-1'),\n('70306','I can\\'t conjure food yet','-1'),\n('70307','I can\\'t do it right now','-1'),\n('70308','Here you go...','-1'),\n('70309','Disabled','-1'),\n('70310','Not ready yet','-1'),\n('70311','Invalid object type','-1'),\n('70312','Failed','-1'),\n('70313','Done','-1'),\n('70314','I am not shapeshifted','-1'),\n('70315','I don\\'t have a healthstone','-1'),\n('70316','I can\\'t create healthstones yet!','-1'),\n('70317','WTF I don\\'t have lockpicking!','-1'),\n('70318','My skill level in not high enough','-1'),\n('70319','Changing my spec to ','-1'),\n('70320','Arms','-1'),\n('70321','Fury','-1'),\n('70322','Protection','-1'),\n('70323','Retribution','-1'),\n('70324','Beast Mastery','-1'),\n('70325','Marksmanship','-1'),\n('70326','Survival','-1'),\n('70327','Assassination','-1'),\n('70328','Combat','-1'),\n('70329','Subtlety','-1'),\n('70330','Discipline','-1'),\n('70331','Holy','-1'),\n('70332','Shadow','-1'),\n('70333','Blood','-1'),\n('70334','Frost','-1'),\n('70335','Unholy','-1'),\n('70336','Elemental','-1'),\n('70337','Enhancement','-1'),\n('70338','Restoration','-1'),\n('70339','Arcane','-1'),\n('70340','Fire','-1'),\n('70341','Affliction','-1'),\n('70342','Demonology','-1'),\n('70343','Destruction','-1'),\n('70344','Balance','-1'),\n('70345','Feral Combat','-1'),\n('70346','Unknown','-1'),\n('70347','Go away, weakling','-1'),\n('70348',' is not convinced','-1'),\n('70349','I am not going to waste my time on just anything','-1'),\n('70350','NIY','-1'),\n('70351','NIY','-1'),\n('70352','NIY','-1'),\n('70353','I am ready','-1'),\n('70354','Go away. I serve my master ','-1'),\n('70355','unknown','-1'),\n('70356',' on You!','-1'),\n('70357',' on myself!','-1'),\n('70358',' on ','-1'),\n('70359',' used!','-1'),\n('70360','bot tank','-1'),\n('70361','class','-1'),\n('70362','player','-1'),\n('70363','master','-1'),\n('70364','none','-1'),\n('70365','Rank','-1'),\n('70366','talent','-1'),\n('70367','passive','-1'),\n('70368','hidden','-1'),\n('70369','known','-1'),\n('70370','ability','-1'),\n('70371','str','-1'),\n('70372','agi','-1'),\n('70373','sta','-1'),\n('70374','int','-1'),\n('70375','spi','-1'),\n('70376','unk stat','-1'),\n('70377','total','-1'),\n('70378','Melee AP','-1'),\n('70379','Ranged AP','-1'),\n('70380','armor','-1'),\n('70381','crit','-1'),\n('70382','defense','-1'),\n('70383','miss','-1'),\n('70384','dodge','-1'),\n('70385','parry','-1'),\n('70386','block','-1'),\n('70387','block value','-1'),\n('70388','Damage taken melee','-1'),\n('70389','Damage taken spell','-1'),\n('70390','Damage range mainhand','-1'),\n('70391','Damage mult mainhand','-1'),\n('70392','Attack time mainhand','-1'),\n('70393','Damage range offhand','-1'),\n('70394','Damage mult offhand','-1'),\n('70395','Attack time offhand','-1'),\n('70396','Damage range ranged','-1'),\n('70397','Damage mult ranged','-1'),\n('70398','Attack time ranged','-1'),\n('70399','min','-1'),\n('70400','max','-1'),\n('70401','DPS','-1'),\n('70402','base hp','-1'),\n('70403','total hp','-1'),\n('70404','base mana','-1'),\n('70405','total mana','-1'),\n('70406','current mana','-1'),\n('70407','spell power','-1'),\n('70408','health regen_5 bonus','-1'),\n('70409','mana regen_5 no cast','-1'),\n('70410','mana regen_5 casting','-1'),\n('70411','haste','-1'),\n('70412','hit','-1'),\n('70413','expertise','-1'),\n('70414','armor penetration','-1'),\n('70415','spell penetration','-1'),\n('70416','pct','-1'),\n('70417','holy','-1'),\n('70418','fire','-1'),\n('70419','nature','-1'),\n('70420','frost','-1'),\n('70421','shadow','-1'),\n('70422','arcane','-1'),\n('70423','Resistance','-1'),\n('70424','Command states','-1'),\n('70425','Follow','-1'),\n('70426','Attack','-1'),\n('70427','Stay','-1'),\n('70428','Reset','-1'),\n('70429','FullStop','-1'),\n('70430','Follow distance','-1'),\n('70431','Spec','-1'),\n('70432','Bot roles mask main','-1'),\n('70433','Bot roles mask gathering','-1'),\n('70434','PvP kills','-1'),\n('70435','players','-1'),\n('70436','Died ','-1'),\n('70437',' times','-1'),\n('70438','%s (bot) calms down','-1'),\n('70439','<Debug>','-1'),\n('70440','Are you sure you want to risk drawing ','-1'),\n('70441','\\'s attention?','-1'),\n('70442','<Insert Coin>','-1'),\n('70443','Do you want to entice ','-1'),\n('70444','<Try to make an offering>','-1'),\n('70445','Do you wish to hire ','-1'),\n('70446','<Hire bot>','-1'),\n('70447','Manage equipment...','-1'),\n('70448','Manage roles...','-1'),\n('70449','Manage formation...','-1'),\n('70450','Manage abilities...','-1'),\n('70451','Manage talents...','-1'),\n('70452','Give consumable...','-1'),\n('70453','<Create group>','-1'),\n('70454','<Create group (all bots)>','-1'),\n('70455','<Add to group>','-1'),\n('70456','<Add all bots to group>','-1'),\n('70457','<Remove from group>','-1'),\n('70458','Follow me','-1'),\n('70459','Hold your position','-1'),\n('70460','Stay here and don\\'t do anything','-1'),\n('70461','I need food','-1'),\n('70462','I need water','-1'),\n('70463','I need a refreshment table','-1'),\n('70464','Help me pick a lock','-1'),\n('70465','I need your your healthstone','-1'),\n('70466','I need a soulwell','-1'),\n('70467','I need you to refresh poisons','-1'),\n('70468','<Choose poison (Main Hand)>','-1'),\n('70469','<Choose poison (Offhand)>','-1'),\n('70470','I need you to refresh enchants','-1'),\n('70471','<Choose enchant (Main Hand)>','-1'),\n('70472','<Choose enchant (Offhand)>','-1'),\n('70473','I need you to remove shapeshift','-1'),\n('70474','<Choose pet type>','-1'),\n('70475','You are dismissed','-1'),\n('70476','Are you going to abandon ','-1'),\n('70477','You may regret it...','-1'),\n('70478','Pull yourself together, damnit','-1'),\n('70479','<Study the creature>','-1'),\n('70480','Nevermind','-1'),\n('70481','dist','-1'),\n('70482','BACK','-1'),\n('70483','<Auto>','-1'),\n('70484','<None>','-1'),\n('70485','Random (Cunning)','-1'),\n('70486','Random (Ferocity)','-1'),\n('70487','Random (Tenacity)','-1'),\n('70488','Show me your inventory','-1'),\n('70489','Auto-equip...','-1'),\n('70490','Main hand','-1'),\n('70491','Off-hand','-1'),\n('70492','Ranged','-1'),\n('70493','Relic','-1'),\n('70494','Head','-1'),\n('70495','Shoulders','-1'),\n('70496','Chest','-1'),\n('70497','Waist','-1'),\n('70498','Legs','-1'),\n('70499','Feet','-1'),\n('70500','Wrist','-1'),\n('70501','Hands','-1'),\n('70502','Back','-1'),\n('70503','Shirt','-1'),\n('70504','Finger1','-1'),\n('70505','Finger2','-1'),\n('70506','Trinket1','-1'),\n('70507','Trinket2','-1'),\n('70508','Neck','-1'),\n('70509','Unequip all','-1'),\n('70510','Update visual','-1'),\n('70511','visual only','-1'),\n('70512','Equipped','-1'),\n('70513','nothing','-1'),\n('70514','Use your old equipment','-1'),\n('70515','Unequip it','-1'),\n('70516','Hm... I have nothing to give you','-1'),\n('70517','Gathering','-1'),\n('70518','Abilities status','-1'),\n('70519','Manage allowed abilities','-1'),\n('70520','Use ','-1'),\n('70521','Update','-1'),\n('70522','Damage','-1'),\n('70523','Control','-1'),\n('70524','Heal','-1'),\n('70525','Other','-1'),\n('70526',' makes a grinding sound and begins to follow ','-1'),\n('70527','%s will not join you until dismissed by the owner','-1'),\n('70528','%s will not join you until you are level 60','-1'),\n('70529','%s will not join you until you are level 55','-1'),\n('70530','%s will not join you until you are level 40','-1'),\n('70531','%s will not join you until you are level 20','-1'),\n('70532','You exceed max npcbots (%u)','-1'),\n('70533','You don\\'t have enough money','-1'),\n('70534','You cannot have more bots of that class! %u of %u','-1'),\n('70535','Cannot reset equipment in slot %u (%s)! Cannot dismiss bot!','-1'),\n('70536','current','-1'),\n('70537','Attack distance','-1'),\n('70538','Short range attacks','-1'),\n('70539','Long range attacks','-1'),\n('70540','Exact','-1'),\n('70541','Remove buff','-1'),\n('70542','Fix your power type','-1'),\n('70543','Cannot unequip %s for some stupid reason! Sending through mail','-1'),\n('70544','Tank','-1'),\n('70545','Ranged','-1'),\n('70546','Miner','-1'),\n('70547','Herbalist','-1'),\n('70548','Skinner','-1'),\n('70549','Engineer','-1'),\n('70550','Bot ownership expired due to inactivity','-1'),\n('70551','NpcBot system is currently disabled. Please contact administration.','-1'),\n('70552','%s will not join you, already has master: %s','-1'),\n('70553','%s cannot join you while about to teleport','-1'),\n('70554','Aspect','-1'),\n('70555','Monkey','-1'),\n('70556','Hawk','-1'),\n('70557','Cheetah','-1'),\n('70558','Viper','-1'),\n('70559','Beast','-1'),\n('70560','Pack','-1'),\n('70561','Wild','-1'),\n('70562','Dragonhawk','-1'),\n('70563','No Aspect','-1'),\n('70564','Aura','-1'),\n('70565','Devotion','-1'),\n('70566','Concentration','-1'),\n('70567','Fire Resistance','-1'),\n('70568','Frost Resistance','-1'),\n('70569','Shadow Resistance','-1'),\n('70570','Retribution','-1'),\n('70571','Crusader','-1'),\n('70572','No Aura','-1'),\n('70573','Crippling','-1'),\n('70574','Instant','-1'),\n('70575','Deadly','-1'),\n('70576','Wound','-1'),\n('70577','Mind-Numbing','-1'),\n('70578','Anesthetic','-1'),\n('70579','Nothing','-1'),\n('70580','Flametongue','-1'),\n('70581','Frostbrand','-1'),\n('70582','Windfury','-1'),\n('70583','Earthliving','-1'),\n('70584','I need your services','-1'),\n('70585','You have too many bots','-1'),\n('70586','Do you wish to hire ','-1'),\n('70587',' is a bit busy at the moment, try again later.','-1'),\n('70588','Pleasure doing business with you','-1'),\n('70589','Warriors','-1'),\n('70590','Paladins','-1'),\n('70591','Mages','-1'),\n('70592','Priests','-1'),\n('70593','Warlocks','-1'),\n('70594','Druids','-1'),\n('70595','Death Knights','-1'),\n('70596','Rogues','-1'),\n('70597','Shamans','-1'),\n('70598','Hunters','-1'),\n('70599','Blademasters','-1'),\n('70600','Destroyers','-1'),\n('70601','Archmagi','-1'),\n('70602','Dreadlords','-1'),\n('70603','Spell Breakers','-1'),\n('70604','Dark Rangers','-1'),\n('70605','Warrior','-1'),\n('70606','Paladin','-1'),\n('70607','Mage','-1'),\n('70608','Priest','-1'),\n('70609','Warlock','-1'),\n('70610','Druid','-1'),\n('70611','Death Knight','-1'),\n('70612','Rogue','-1'),\n('70613','Shaman','-1'),\n('70614','Hunter','-1'),\n('70615','Blademaster','-1'),\n('70616','Destroyer','-1'),\n('70617','Archmage','-1'),\n('70618','Dreadlord','-1'),\n('70619','Spell Breaker','-1'),\n('70620','Dark Ranger','-1');\n"
  },
  {
    "path": "AC/SQL/updates/world/2020_12_11_npc_text.sql",
    "content": "--\nDELETE FROM `npc_text` WHERE ID = 70550;\nINSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n('70550','Bot ownership expired','-1');\n"
  },
  {
    "path": "AC/SQL/updates/world/2021_01_04_npc_text.sql",
    "content": "--\nSET @LOCALIZED_STRINGS_START = 70621;\nSET @LOCALIZED_STRINGS_END   = 70633;\n\nDELETE FROM `npc_text` WHERE ID BETWEEN @LOCALIZED_STRINGS_START and @LOCALIZED_STRINGS_END;\nINSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n('70621','Male','-1'),\n('70622','Female','-1'),\n('70623','Human','-1'),\n('70624','Orc','-1'),\n('70625','Dwarf','-1'),\n('70626','Night Elf','-1'),\n('70627','Undead','-1'),\n('70628','Tauren','-1'),\n('70629','Gnome','-1'),\n('70630','Troll','-1'),\n('70631','Blood Elf','-1'),\n('70632','Draenei','-1'),\n('70633','Unknown','-1');\n"
  },
  {
    "path": "AC/SQL/updates/world/2021_01_05_npc_text.sql",
    "content": "--\nSET @LOCALIZED_STRINGS_START = 70634;\nSET @LOCALIZED_STRINGS_END   = 70640;\n\nDELETE FROM `npc_text` WHERE ID BETWEEN @LOCALIZED_STRINGS_START and @LOCALIZED_STRINGS_END;\nINSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n('70634','Looting','-1'),\n('70635','|cff9d9d9dPoor|r','-1'),\n('70636','|cffffffffCommon|r','-1'),\n('70637','|cff1eff00Uncommon|r','-1'),\n('70638','|cff0070ddRare|r','-1'),\n('70639','|cffa335eeEpic|r','-1'),\n('70640','|cffff8000Legendary|r','-1');\n"
  },
  {
    "path": "AC/SQL/updates/world/2021_01_08_npc_text.sql",
    "content": "--\nSET @LOCALIZED_STRINGS_START = 70641;\nSET @LOCALIZED_STRINGS_END   = 70643;\n\nDELETE FROM `npc_text` WHERE ID BETWEEN @LOCALIZED_STRINGS_START and @LOCALIZED_STRINGS_END;\nINSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n('70641','Grab on ','-1'),\n('70642','my ','-1'),\n('70643','<Exit Vehicle>','-1');\n"
  },
  {
    "path": "AC/SQL/updates/world/2021_02_01_npc_text.sql",
    "content": "--\nUPDATE `npc_text` SET `text0_0`='Auto-equip' WHERE (`ID`='70489');\n"
  },
  {
    "path": "AC/SQL/updates/world/2021_03_29_npc_text.sql",
    "content": "--\nSET @LOCALIZED_STRINGS_START = 70641;\nSET @LOCALIZED_STRINGS_END   = 70644;\n\nDELETE FROM `npc_text` WHERE ID BETWEEN @LOCALIZED_STRINGS_START and @LOCALIZED_STRINGS_END;\nINSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n('70641','Engage behavior','-1'),\n('70642','Delay attack by','-1'),\n('70643','Delay healing by','-1'),\n('70644','s','-1');\n"
  },
  {
    "path": "AC/SQL/updates/world/2021_08_20_creature_template_npcbot_extras.sql",
    "content": "-- Kerra race fix\nUPDATE `creature_template_npcbot_extras` SET `race`='10' WHERE (`entry`='70038');\n"
  },
  {
    "path": "AC/SQL/updates/world/2021_08_27_npc_text.sql",
    "content": "--\nDELETE FROM `npc_text` WHERE ID = 70645;\nINSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n('70645','Off-Tank','-1');\n"
  },
  {
    "path": "AC/SQL/updates/world/2021_10_12_creature_template.sql",
    "content": "--\nSET @BOT_START = 70001;\nSET @BOT_END   = 71000;\n\nSET @U2_MIRROR_IMAGE\t\t  = 16;    -- 0x00000010 - UNIT_FLAG2_MIRROR_IMAGE\nSET @U2_ENABLE_ENEMY_INTERACT = 16384; -- 0x00004000 - UNIT_FLAG2_ALLOW_ENEMY_INTERACT\n\nUPDATE `creature_template` SET `unit_flags2` = `unit_flags2`&~(@U2_MIRROR_IMAGE|@U2_ENABLE_ENEMY_INTERACT) WHERE `entry` BETWEEN @BOT_START AND @BOT_END AND `entry` != 70100;\n"
  },
  {
    "path": "AC/SQL/updates/world/2022_01_02_00_creature_template_npcbot_extras.sql",
    "content": "--\nSET @BOT_START = 70575;\nSET @BOT_END   = 70580;\n\nDELETE FROM `creature_template_npcbot_extras` WHERE `entry` BETWEEN @BOT_START AND @BOT_END;\nINSERT INTO `creature_template_npcbot_extras` (`entry`,`class`,`race`) VALUES\n('70575', '18', '1'),\n('70576', '18', '1'),\n('70577', '18', '1'),\n('70578', '18', '1'),\n('70579', '18', '1'),\n('70580', '0', '15');\n"
  },
  {
    "path": "AC/SQL/updates/world/2022_01_02_01_generate_equips_necromancer.sql",
    "content": "/*!50003 DROP PROCEDURE IF EXISTS `sp__generate_necromancer_equips`*/;\n\nDELIMITER ;;\n\n/*!50003 CREATE*/\n/*!50003 PROCEDURE `sp__generate_necromancer_equips`()\nBEGIN\n\nDECLARE CLASS_NECROMANCER INT DEFAULT 18;\n\nDECLARE NPCBOT_ENTRY_BEGIN INT DEFAULT 70575;\nDECLARE NPCBOT_ENTRY_END INT DEFAULT 71000;\n\nDECLARE NPCBOT_ENTRY_PET_NECROSKELETON INT DEFAULT 70580;\n\nDECLARE cur_pos INT DEFAULT 0;\nDECLARE myclass INT;\nDECLARE myrace INT;\nDECLARE item1 INT DEFAULT 0;\nDECLARE item2 INT DEFAULT 0;\nDECLARE item3 INT DEFAULT 0;\n\nDELETE FROM `creature_equip_template` WHERE `CreatureID` BETWEEN NPCBOT_ENTRY_BEGIN AND NPCBOT_ENTRY_END;\n\nSET cur_pos = NPCBOT_ENTRY_BEGIN;\nWHILE cur_pos < NPCBOT_ENTRY_END DO\n    SET myclass = (SELECT `class` FROM `creature_template_npcbot_extras` WHERE `entry` = cur_pos);\n    SET myrace = (SELECT `race` FROM `creature_template_npcbot_extras` WHERE `entry` = cur_pos);\n\n    IF myclass != 0 AND myrace != 0 THEN\n\n        IF myclass = CLASS_NECROMANCER THEN\n            SET item1 = 13937; -- staff\n        END IF;\n\n        INSERT INTO `creature_equip_template` (`CreatureID`,`ID`,`itemID1`,`itemID2`,`itemID3`,`VerifiedBuild`) VALUES (cur_pos,1,item1,item2,item3,-1);\n\n    ELSEIF cur_pos = NPCBOT_ENTRY_PET_NECROSKELETON THEN\n        SET item1 = 3935;\n        SET item2 = 15648;\n        SET item3 = 0;\n\n        INSERT INTO `creature_equip_template` (`CreatureID`,`ID`,`itemID1`,`itemID2`,`itemID3`,`VerifiedBuild`) VALUES (cur_pos,1,item1,item2,item3,-1);\n\n    END IF;\n\n    SET cur_pos = cur_pos + 1;\n\nEND WHILE;\n\nEND */;;\n\nDELIMITER ;\n\nCALL `sp__generate_necromancer_equips`();\n\nDROP PROCEDURE IF EXISTS `sp__generate_necromancer_equips`;\n"
  },
  {
    "path": "AC/SQL/updates/world/2022_01_02_02_creature_template.sql",
    "content": "--\nSET @BOT_START = 70575;\nSET @BOT_END   = 70580;\n\nDELETE FROM `creature_template` WHERE `entry` BETWEEN @BOT_START AND @BOT_END;\n\nINSERT INTO `creature_template`\n(`entry`,`difficulty_entry_1`,`difficulty_entry_2`,`difficulty_entry_3`,`KillCredit1`,`KillCredit2`,\n`name`,`subname`,`IconName`,`gossip_menu_id`,`minlevel`,`maxlevel`,`exp`,\n`faction`,`npcflag`,`speed_walk`,`speed_run`,`scale`,`rank`,`dmgschool`,`BaseAttackTime`,`RangeAttackTime`,\n`unit_class`,`unit_flags`,`unit_flags2`,`dynamicflags`,`family`,`type`,`type_flags`,`lootid`,\n`pickpocketloot`,`skinloot`,`PetSpellDataId`,`VehicleId`,`mingold`,`maxgold`,`AIName`,`MovementType`,\n`HoverHeight`,`HealthModifier`,`ManaModifier`,`ArmorModifier`,`RacialLeader`,`movementId`,`RegenHealth`,\n`mechanic_immune_mask`,`flags_extra`,`ScriptName`,`VerifiedBuild`)\nVALUES\n('70575','0','0','0','0','0','Prakar','Necromancer Bot','','0','82','82','2','35','1','1.1','1.1','1','1','0','1800','1800','9','0','32','0','0','7','4096','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','necromancer_bot','-1'),\n('70576','0','0','0','0','0','Rothik','Necromancer Bot','','0','82','82','2','35','1','1.1','1.1','1','1','0','1800','1800','9','0','32','0','0','7','4096','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','necromancer_bot','-1'),\n('70577','0','0','0','0','0','Hexir','Necromancer Bot','','0','82','82','2','35','1','1.1','1.1','1','1','0','1800','1800','9','0','32','0','0','7','4096','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','necromancer_bot','-1'),\n('70578','0','0','0','0','0','Fikhar','Necromancer Bot','','0','82','82','2','35','1','1.1','1.1','1','1','0','1800','1800','9','0','32','0','0','7','4096','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','necromancer_bot','-1'),\n('70579','0','0','0','0','0','Drothum','Necromancer Bot','','0','82','82','2','35','1','1.1','1.1','1','1','0','1800','1800','9','0','32','0','0','7','4096','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','necromancer_bot','-1'),\n('70580','0','0','0','0','0','Skeleton',NULL,'','0','82','82','2','35','0','1.2','1.3','1.1','0','0','2000','2000','1','0','0','0','0','6','4096','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266400','necromancer_pet_bot','-1');\n"
  },
  {
    "path": "AC/SQL/updates/world/2022_01_02_03_npc_text.sql",
    "content": "--\nSET @LOCALIZED_STRINGS_START = 70107;\nSET @LOCALIZED_STRINGS_END   = 70107;\n\nDELETE FROM `npc_text` WHERE ID BETWEEN @LOCALIZED_STRINGS_START and @LOCALIZED_STRINGS_END;\nINSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n('70107','|cff9900ccNecromancer|r$b|cffdd6600-=Warcraft III / Diablo II tribute=-|r$B$BSpell damage taken reduced by 20%, partially immune to control effects, cloth armor, deals spellshadow damage, no physical attack, spell power bonus: 100% intellect. Main attribute: Intellect.$B$BRaise Dead. Raises 2 Skeletons from a corpse (maximum 6 Skeletons, 65 seconds duration, only works on humanoids, beasts and dragonkin).$B$BUnholy Frenzy. Increases target\\'s melee attack speed by 75%, but constantly drains health. Lasts 45 seconds. Cannot be cancelled. Unlocked at level 30.$B$BCorpse Explosion. Causes a corpse to explode, dealing damage equal to 35% to 75% of dead unit\\'s maximum health (depends on Necromancer\\'s level) to all surrounding enemies. This damage generates no threat. Unlocked at level 40.$B$BCripple. Reduces target\\'s movement speed, melee attack speed and total strength by 50% for 60 seconds. Unlocked at level 50.','-1');\n\nSET @LOCALIZED_STRINGS_START = 70646;\nSET @LOCALIZED_STRINGS_END   = 70647;\n\nDELETE FROM `npc_text` WHERE ID BETWEEN @LOCALIZED_STRINGS_START and @LOCALIZED_STRINGS_END;\nINSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n('70646','Necromancers','-1'),\n('70647','Necromancer','-1');\n"
  },
  {
    "path": "AC/SQL/updates/world/2022_01_31_npc_text.sql",
    "content": "--\n\nSET @LOCALIZED_STRINGS_START = 70648;\nSET @LOCALIZED_STRINGS_END   = 70650;\n\nDELETE FROM `npc_text` WHERE ID BETWEEN @LOCALIZED_STRINGS_START and @LOCALIZED_STRINGS_END;\nINSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n('70648','Attack angle','-1'),\n('70649','Normal','-1'),\n('70650','Avoid frontal AOE','-1');\n"
  },
  {
    "path": "AC/SQL/updates/world/2022_06_15_00_creature_template_npcbot_extras.sql",
    "content": "-- Maldryn race fix\nUPDATE `creature_template_npcbot_extras` SET `race`='4' WHERE (`entry`='70413');\n"
  },
  {
    "path": "AC/SQL/updates/world/2022_06_17_npc_text.sql",
    "content": "--\n\nUPDATE `npc_text` SET `text0_0`='|cff9900ccObsidian Destroyer|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\\\"An obsidian winged monstrocity with insatiable hunger for magic\\\".$B$BHigh armor, very high resistances, partially immune to magic, loses mana over time and doesn\\'t benefit from passive mana regeneration effects, mail/plate armor, dual-wielding wands, deals spellshadow damage, no physical attack, cannot attack enemies not in front while moving, spell power bonus: 50% attack power + 200% intellect + wands damage.$B$BDevour Magic. Dispels up to 2 magic effects from enemies, up to 2 magic effects and up to 2 curses from allies and damaging summoned units in 20 yards area. Every dispelled effect restores 20% mana and 5% health, 7 seconds cooldown.$B$BShadow Blast. Empowered attack that deals increased splash damage.$B$BDrain Mana. Drains all mana (limited by caster\\'s mana pool) from a random friendly unit.$B$BReplenish Mana. Energizes surrounding party and raid members within 25 yards for 3% of their maximum mana nullifying caster\\'s mana, 3 seconds cooldown.$B$BRegenerating Aura. Heals surrounding party and raid members within 25 yards for 3% of their maximum health nullifying caster\\'s mana, 3 seconds cooldown.$B$BShadow Armor (passive). Restores mana equal to a percentage of damage taken.$B$B' WHERE (`ID`='70102');\n"
  },
  {
    "path": "AC/SQL/updates/world/2022_06_22_00_creature_template_npcbot_extras.sql",
    "content": "--\nSET @BOT_START = 70581;\nSET @BOT_END   = 70585;\n\nDELETE FROM `creature_template_npcbot_extras` WHERE `entry` BETWEEN @BOT_START AND @BOT_END;\nINSERT INTO `creature_template_npcbot_extras` (`entry`,`class`,`race`) VALUES\n('70581', '19', '13'),\n('70582', '19', '13'),\n('70583', '19', '13'),\n('70584', '19', '13'),\n('70585', '19', '13');\n"
  },
  {
    "path": "AC/SQL/updates/world/2022_06_22_01_generate_equips_sea_witch.sql",
    "content": "/*!50003 DROP PROCEDURE IF EXISTS `sp__generate_seawitch_equips`*/;\n\nDELIMITER ;;\n\n/*!50003 CREATE*/\n/*!50003 PROCEDURE `sp__generate_seawitch_equips`()\nBEGIN\n\nDECLARE CLASS_SEA_WITCH INT DEFAULT 19;\n\nDECLARE NPCBOT_ENTRY_BEGIN INT DEFAULT 70581;\nDECLARE NPCBOT_ENTRY_END INT DEFAULT 70585;\n\nDECLARE cur_pos INT DEFAULT 0;\nDECLARE myclass INT;\nDECLARE myrace INT;\nDECLARE item1 INT DEFAULT 0;\nDECLARE item2 INT DEFAULT 0;\nDECLARE item3 INT DEFAULT 0;\n\nDELETE FROM `creature_equip_template` WHERE `CreatureID` BETWEEN NPCBOT_ENTRY_BEGIN AND NPCBOT_ENTRY_END;\n\nSET cur_pos = NPCBOT_ENTRY_BEGIN;\nWHILE cur_pos <= NPCBOT_ENTRY_END DO\n    SET myclass = (SELECT `class` FROM `creature_template_npcbot_extras` WHERE `entry` = cur_pos);\n    SET myrace = (SELECT `race` FROM `creature_template_npcbot_extras` WHERE `entry` = cur_pos);\n\n    IF myclass != 0 AND myrace != 0 THEN\n\n        IF myclass = CLASS_SEA_WITCH THEN\n            SET item1 = 20852; -- dagger\n            SET item2 = 20852; -- dagger\n            SET item3 = 17069; -- bow\n        END IF;\n\n        INSERT INTO `creature_equip_template` (`CreatureID`,`ID`,`itemID1`,`itemID2`,`itemID3`,`VerifiedBuild`) VALUES (cur_pos,1,item1,item2,item3,-1);\n\n    END IF;\n\n    SET cur_pos = cur_pos + 1;\n\nEND WHILE;\n\nEND */;;\n\nDELIMITER ;\n\nCALL `sp__generate_seawitch_equips`();\n\nDROP PROCEDURE IF EXISTS `sp__generate_seawitch_equips`;\n"
  },
  {
    "path": "AC/SQL/updates/world/2022_06_22_02_creature_template.sql",
    "content": "--\nSET @BOT_START = 70581;\nSET @BOT_END   = 70586;\n\nDELETE FROM `creature_template` WHERE `entry` BETWEEN @BOT_START AND @BOT_END;\n\nINSERT INTO `creature_template`\n(`entry`,`difficulty_entry_1`,`difficulty_entry_2`,`difficulty_entry_3`,`KillCredit1`,`KillCredit2`,\n`name`,`subname`,`IconName`,`gossip_menu_id`,`minlevel`,`maxlevel`,`exp`,\n`faction`,`npcflag`,`speed_walk`,`speed_run`,`scale`,`rank`,`dmgschool`,`BaseAttackTime`,`RangeAttackTime`,\n`BaseVariance`,`RangeVariance`,`unit_class`,`unit_flags`,`unit_flags2`,`dynamicflags`,`family`,`type`,`type_flags`,`lootid`,\n`pickpocketloot`,`skinloot`,`PetSpellDataId`,`VehicleId`,`mingold`,`maxgold`,`AIName`,`MovementType`,\n`HoverHeight`,`HealthModifier`,`ManaModifier`,`ArmorModifier`,`DamageModifier`,`ExperienceModifier`,`RacialLeader`,`movementId`,`RegenHealth`,\n`mechanic_immune_mask`,`spell_school_immune_mask`,`flags_extra`,`ScriptName`,`VerifiedBuild`)\nVALUES\n('70581','0','0','0','0','0','Kondra','Sea Witch Bot','','0','83','83','2','35','1','1.05','1.05','0.5','2','0','1900','1900','1','1','8','0','32','0','0','7','4096','0','0','0','0','0','0','0','','0','1','1','1','1','1','1','0','0','0','0','0','68157552','sea_witch_bot','-1'),\n('70582','0','0','0','0','0','Serpentra','Sea Witch Bot','','0','83','83','2','35','1','1.05','1.05','0.5','2','0','1900','1900','1','1','8','0','32','0','0','7','4096','0','0','0','0','0','0','0','','0','1','1','1','1','1','1','0','0','0','0','0','68157552','sea_witch_bot','-1'),\n('70583','0','0','0','0','0','Serena','Sea Witch Bot','','0','83','83','2','35','1','1.05','1.05','0.5','2','0','1900','1900','1','1','8','0','32','0','0','7','4096','0','0','0','0','0','0','0','','0','1','1','1','1','1','1','0','0','0','0','0','68157552','sea_witch_bot','-1'),\n('70584','0','0','0','0','0','Asprah','Sea Witch Bot','','0','83','83','2','35','1','1.05','1.05','0.5','2','0','1900','1900','1','1','8','0','32','0','0','7','4096','0','0','0','0','0','0','0','','0','1','1','1','1','1','1','0','0','0','0','0','68157552','sea_witch_bot','-1'),\n('70585','0','0','0','0','0','Charib\\'dishal','Sea Witch Bot','','0','83','83','2','35','1','1.05','1.05','0.5','2','0','1900','1900','1','1','8','0','32','0','0','7','4096','0','0','0','0','0','0','0','','0','1','1','1','1','1','1','0','0','0','0','0','68157552','sea_witch_bot','-1'),\n('70586','0','0','0','0','0','Tornado','','','0','83','83','2','35','0','0.9','0.9','3','1','0','2000','2000','1','1','1','33554432','32768','0','0','4','33554432','0','0','0','0','0','0','0','','0','1','1','1','1','1','1','0','0','0','0','0','671096832','sea_witch_pet_bot','-1');\n"
  },
  {
    "path": "AC/SQL/updates/world/2022_06_22_03_npc_text.sql",
    "content": "--\nSET @LOCALIZED_STRINGS_START = 70010;\nSET @LOCALIZED_STRINGS_END   = 70011;\n\nDELETE FROM `npc_text` WHERE ID BETWEEN @LOCALIZED_STRINGS_START and @LOCALIZED_STRINGS_END;\nINSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n('70010','<You see an emaciated naga matron. She looks tired and weak, and avoids looking at you.>$B$BS-s-s-spare the words, mortal...','-1'),\n('70011','Did I mess-s-s-s up my hair again? <She brushes her \\\"hair\\\">$B...No, I didn\\'t. Then what is it?','-1');\n\nSET @LOCALIZED_STRINGS_START = 70108;\nSET @LOCALIZED_STRINGS_END   = 70108;\n\nDELETE FROM `npc_text` WHERE ID BETWEEN @LOCALIZED_STRINGS_START and @LOCALIZED_STRINGS_END;\nINSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n('70108','|cff0000ddSea Witch|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\"A vicious scaly denizen of ocean often associated with the coming of prodigious storms\".$B$BSpell damage taken reduced by 30%, partially immune to control effects, cloth armor, deals physical/spellfrost/spellstorm damage, attack power bonus: agility x2, spell power bonus: 200% intellect. Main attribute: Intellect.$B$BForked Lightning. Calls forth a cone of lightning to damage enemies. Hits from 2 to all targets (depending on Sea Witch\\'s level), stunning them for 2 seconds. This damage generates no threat.$B$BFrost Arrows. Imbues arrow with spellfrost for extra damage, slowing target\\'s movement, attack and casting speed by 30% to 70% (depending on Sea Witch\\'s level).$B$BMana Shield. Creates a shield that absorbs 100% incoming (non-mitigated) damage by using Sea Witch\\'s mana. Absorbs 2 to 10 damage per point of mana (depending on Sea Witch\\'s level).$B$BTornado. Summons a fierce tornado that damages and slows nearby enemy units, sometimes incapacitating them completely. Tornado grows over time oudoors, increasing damage dealt and area of effect, but shrinks indoors, dissipating quickly. Unlocked at level 60.$B$BNaga (Passive). Swim speed increased by 200%, damage and dodge chance are greatly increased while in water.','-1');\n\nSET @LOCALIZED_STRINGS_START = 70651;\nSET @LOCALIZED_STRINGS_END   = 70655;\n\nDELETE FROM `npc_text` WHERE ID BETWEEN @LOCALIZED_STRINGS_START and @LOCALIZED_STRINGS_END;\nINSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n('70651','NIY','-1'),\n('70652','Are you sure this is gonna work? It\\'s better be the best water in the world...','-1'),\n('70653','Seems like you could really use a drink of fresh water.','-1'),\n('70654','Sea Witches','-1'),\n('70655','Sea Witch','-1');\n"
  },
  {
    "path": "AC/SQL/updates/world/2022_06_23_00_command.sql",
    "content": "--\nDELETE FROM `command` WHERE `name` LIKE 'npcbot %';\nINSERT INTO `command` (`name`) VALUES\n('npcbot add'),\n('npcbot command'),\n('npcbot command follow'),\n('npcbot command standstill'),\n('npcbot command stopfully'),\n('npcbot delete'),\n('npcbot distance'),\n('npcbot distance attack'),\n('npcbot distance attack long'),\n('npcbot distance attack short'),\n('npcbot dump'),\n('npcbot dump load'),\n('npcbot dump write'),\n('npcbot hide'),\n('npcbot info'),\n('npcbot kill'),\n('npcbot lookup'),\n('npcbot move'),\n('npcbot order'),\n('npcbot order cast'),\n('npcbot recall'),\n('npcbot recall teleport'),\n('npcbot reloadconfig'),\n('npcbot remove'),\n('npcbot revive'),\n('npcbot set'),\n('npcbot set faction'),\n('npcbot set owner'),\n('npcbot set spec'),\n('npcbot show'),\n('npcbot spawn'),\n('npcbot spawned'),\n('npcbot suicide'),\n('npcbot unhide'),\n('npcbot vehicle'),\n('npcbot vehicle eject');\n"
  },
  {
    "path": "AC/SQL/updates/world/2022_06_24_00_npc_text.sql",
    "content": "--\nSET @LOCALIZED_STRINGS_START = 70108;\nSET @LOCALIZED_STRINGS_END   = 70108;\n\nDELETE FROM `npc_text` WHERE ID BETWEEN @LOCALIZED_STRINGS_START and @LOCALIZED_STRINGS_END;\nINSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n('70108','|cff0000ddSea Witch|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\"A vicious scaly denizen of ocean often associated with the coming of prodigious storms\".$B$BSpell damage taken reduced by 30%, partially immune to control effects, cloth armor, deals physical/spellfrost/spellstorm damage, attack power bonus: agility x2, spell power bonus: 200% intellect. Main attribute: Intellect.$B$BForked Lightning. Calls forth a cone of lightning to damage enemies. Hits from 2 to all targets (depending on Sea Witch\\'s level), stunning them for 2 seconds. This damage generates no threat.$B$BFrost Arrows. Imbues arrow with spellfrost for extra damage, slowing target\\'s movement, attack and casting speed by 30% to 70% (depending on Sea Witch\\'s level).$B$BMana Shield. Creates a shield that absorbs 100% incoming (non-mitigated) damage by using Sea Witch\\'s mana. Effect ranges from 1 damage per 10 mana to 10 damage per 1 mana (depending on Sea Witch\\'s level).$B$BTornado. Summons a fierce tornado that damages and slows nearby enemy units, sometimes incapacitating them completely. Tornado grows over time oudoors, increasing damage dealt and area of effect, but shrinks indoors, dissipating quickly. Unlocked at level 60.$B$BNaga (Passive). Swim speed increased by 200%, damage and dodge chance are greatly increased while in water.','-1');\n"
  },
  {
    "path": "AC/SQL/updates/world/2022_06_24_01_npc_text.sql",
    "content": "--\nSET @LOCALIZED_STRINGS_START = 70656;\nSET @LOCALIZED_STRINGS_END   = 70657;\n\nDELETE FROM `npc_text` WHERE ID BETWEEN @LOCALIZED_STRINGS_START and @LOCALIZED_STRINGS_END;\nINSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n('70656','Mana per damage','-1'),\n('70657','Damage per mana','-1');\n"
  },
  {
    "path": "AC/SQL/updates/world/2022_06_24_02_command.sql",
    "content": "--\nDELETE FROM `command` WHERE `name`='npcbot command walk';\nINSERT INTO `command` (`name`) VALUES\n('npcbot command walk');\n"
  },
  {
    "path": "AC/SQL/updates/world/2022_07_04_00_command.sql",
    "content": "--\nDELETE FROM `command` WHERE `name`='npcbot createnew';\nINSERT INTO `command` (`name`) VALUES\n('npcbot createnew');\n"
  },
  {
    "path": "AC/SQL/updates/world/2022_07_25_00_npc_text.sql",
    "content": "--\nUPDATE `npc_text` SET `text0_0`='|cff0000ddArchmage|r$b|cffdd6600-=Warcraft III tribute=-|r$B$BSpell damage taken reduced by 35%, partially immune to control effects, cloth armor, deals spellsfire/spellfrost damage, no physical attack, spell power bonus: 100% intellect. Main attribute: Intellect.$B$BBlizzard. Your typical blizzard, just a little more powerful, 6 seconds cooldown.$B$BSummon Water Elemental. Summons a water elemental to attack archmage\\'s enemies for 1 min, 20 seconds cooldown.$B$BBrilliance Aura. Increases maximum mana by 10% and greatly increases mana regeneration of party and raid members within 40 yards.$B$BMass Teleport. NIY.$B$B' WHERE (`ID`='70103');\nUPDATE `npc_text` SET `text0_0`='|cff9900ccDreadlord|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\\\"Incredibly powerful demon who wields power of darkness and mental domination\\\".$B$BHigh armor, high resistances, partially immune to control effects, damage taken speeds up spells recharge, plate armor, deals melee/spellshadow damage, bonus damage against incapacitated targets, spell power bonus: 200% strength. Main attribute: Strength.$B$BCarrion Swarm. Sends a horde of bats combined with chaotic magic to damage enemies in a very large frontal cone, cannot crit, 10 seconds cooldown.$B$BSleep. Puts the enemy target to sleep for 60 seconds and allows next physical attack on that target to bypass armor, direct damage caused will awaken the target, 6 seconds cooldown.$B$BVampiric Aura. Increases physical critical damage by 5% and heals party and raid members within 40 yards for a percentage (100% for Dreadlord and 25% for everyone else) of damage done by melee physical attacks and Carrion Swarm, no threat.$B$BSummon Infernal Servant. Calls an infernal down from the sky dealing damage and stunning enemy units, infernal is very resistant to magic and lasts 180 seconds, 180 seconds cooldown.$B$B' WHERE (`ID`='70104');\nUPDATE `npc_text` SET `text0_0`='|cff0000ddSpell Breaker|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\\\"An elven warrior trained to disrupt and contort magical energies\\\".$B$BSpell damage taken reduced by 75%, partially immune to control effects, armor penalty -30%, mail/plate armor, deals melee/arcane damage, spell power bonus: 200% strength. Main attribute: Strength.$B$BSteal Magic (Spellsteal). Steals a benefical spell from an enemy and applies it to a nearby ally or removes a negative spell from an ally and applies it to a nearby enemy, affects magic and curse effects, 2 seconds cooldown.$B$BFeedback (passive). Successful melee attacks burn target\\'s mana equal to damage caused (increased by spellpower) dealing arcane damage. If target\\'s mana is depleted, Spell Breaker\\'s melee attacks will do triple damage with increased critical strike chance. If target does not have mana, Spell Breaker will gain mana equal to 25% of damage dealt.$B$B' WHERE (`ID`='70105');\nUPDATE `npc_text` SET `text0_0`='|cff9900ccDark Ranger|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\\\"A former ranger of Quel\\'thalas forcibly raised from the dead\\\".$B$BSpell damage taken reduced by 35%, undead, partially immune to control effects, leather/cloth armor, deals physical/spellshadow damage, stick to shadows and generates no threat, spell power bonus: 50% intellect. Main attribute: Agility.$B$BSilence. Silences an enemy and up to 4 nearby targets for 8 seconds, 15 seconds cooldown.$B$BBlack Arrow. Fires a cursed arrow dealing 150% weapon damage and additional spellshadow damage over time. If affected target dies from Dark Ranger\\'s damage, Dark Minion will spawn from the corpse (maximum 5 Minions, 80 seconds duration, only works on humanoids, beasts and dragonkin). Deals five times more damage if target is under 20% health.$B$BDrain Life. Drains health from an enemy every second for 5 seconds, healing Dark Ranger for 200% of the drained amount.$B$B' WHERE (`ID`='70106');\nUPDATE `npc_text` SET `text0_0`='|cff9900ccNecromancer|r$b|cffdd6600-=Warcraft III / Diablo II tribute=-|r$B$BSpell damage taken reduced by 20%, partially immune to control effects, cloth armor, deals spellshadow damage, no physical attack, spell power bonus: 100% intellect. Main attribute: Intellect.$B$BRaise Dead. Raises 2 Skeletons from a corpse (maximum 6 Skeletons, 65 seconds duration, only works on humanoids, beasts and dragonkin).$B$BUnholy Frenzy. Increases target\\'s melee attack speed by 75%, but constantly drains health. Lasts 45 seconds. Cannot be cancelled. Unlocked at level 30.$B$BCorpse Explosion. Causes a corpse to explode, dealing damage equal to 35% to 75% of dead unit\\'s maximum health (depends on Necromancer\\'s level) to all surrounding enemies. This damage generates no threat. Unlocked at level 40.$B$BCripple. Reduces target\\'s movement speed, melee attack speed and total strength by 50% for 60 seconds. Unlocked at level 50.$B$B' WHERE (`ID`='70107');\nUPDATE `npc_text` SET `text0_0`='|cff0000ddSea Witch|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\\\"A vicious scaly denizen of ocean often associated with the coming of prodigious storms\\\".$B$BSpell damage taken reduced by 30%, partially immune to control effects, cloth armor, deals physical/spellfrost/spellstorm damage, attack power bonus: agility x2, spell power bonus: 200% intellect. Main attribute: Intellect.$B$BForked Lightning. Calls forth a cone of lightning to damage enemies. Hits from 2 to all targets (depending on Sea Witch\\'s level), stunning them for 2 seconds. This damage generates no threat.$B$BFrost Arrows. Imbues arrow with spellfrost for extra damage, slowing target\\'s movement, attack and casting speed by 30% to 70% (depending on Sea Witch\\'s level).$B$BMana Shield. Creates a shield that absorbs 100% incoming (non-mitigated) damage by using Sea Witch\\'s mana. Effect ranges from 1 damage per 10 mana to 10 damage per 1 mana (depending on Sea Witch\\'s level).$B$BTornado. Summons a fierce tornado that damages and slows nearby enemy units, sometimes incapacitating them completely. Tornado grows over time outdoors, increasing damage dealt and area of effect, but shrinks indoors, dissipating quickly. Unlocked at level 60.$B$BNaga (Passive). Swim speed, damage and dodge chance are greatly increased while in water.$B$B' WHERE (`ID`='70108');\n"
  },
  {
    "path": "AC/SQL/updates/world/2022_11_15_00_npc_text.sql",
    "content": "--\nSET @LOCALIZED_STRINGS_START = 70658;\nSET @LOCALIZED_STRINGS_END   = 70658;\n\nDELETE FROM `npc_text` WHERE ID BETWEEN @LOCALIZED_STRINGS_START and @LOCALIZED_STRINGS_END;\nINSERT INTO `npc_text` (`ID`,`text0_0`) VALUES\n('70658','Transmogrification...');\n"
  },
  {
    "path": "AC/SQL/updates/world/2022_11_30_00_command.sql",
    "content": "--\nDELETE FROM `command` WHERE `name`='npcbot sendto';\nINSERT INTO `command` (`name`) VALUES\n('npcbot sendto');\n"
  },
  {
    "path": "AC/SQL/updates/world/2022_12_08_00_npc_text.sql",
    "content": "--\nSET @BOT_START = 70659;\nSET @BOT_END   = 70659;\n\nDELETE FROM `npc_text` WHERE `ID` BETWEEN @BOT_START AND @BOT_END AND `ID` != 70100;\n\nINSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n(@BOT_START+0, \"DISABLE combat positioning\", -1);\n"
  },
  {
    "path": "AC/SQL/updates/world/2022_12_17_00_command.sql",
    "content": "--\nDELETE FROM `command` WHERE `name` IN ('npcbot list spawned','npcbot list spawned free','npcbot delete free','npcbot delete id');\nINSERT INTO `command` (`name`) VALUES\n('npcbot list spawned'),\n('npcbot list spawned free'),\n('npcbot delete free'),\n('npcbot delete id');\n"
  },
  {
    "path": "AC/SQL/updates/world/2022_12_17_01_command.sql",
    "content": "--\nDELETE FROM `command` WHERE `name` = 'npcbot spawned';\n"
  },
  {
    "path": "AC/SQL/updates/world/2022_12_23_00_command.sql",
    "content": "--\nDELETE FROM `command` WHERE `name` IN ('npcbot command nogossip','npcbot command rebind','npcbot command unbind');\nINSERT INTO `command` (`name`) VALUES\n('npcbot command nogossip'),\n('npcbot command rebind'),\n('npcbot command unbind');\n"
  },
  {
    "path": "AC/SQL/updates/world/2022_12_29_00_command.sql",
    "content": "--\nDELETE FROM `command` WHERE `name` LIKE \"npcbot%\";\n"
  },
  {
    "path": "AC/SQL/updates/world/2023_01_02_00_npc_text.sql",
    "content": "--\nSET @BOT_START = 70660;\nSET @BOT_END   = 70660;\n\nDELETE FROM `npc_text` WHERE `ID` BETWEEN @BOT_START AND @BOT_END;\n\nINSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n(@BOT_START+0, \"Priority target\", -1);\n"
  },
  {
    "path": "AC/SQL/updates/world/2023_03_12_00_creature_template_npcbot_wander_nodes.sql",
    "content": "--\nDROP TABLE IF EXISTS `creature_template_npcbot_wander_nodes`;\nCREATE TABLE `creature_template_npcbot_wander_nodes` (\n  `id` int(10) unsigned NOT NULL,\n  `name` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'RENAME_ME',\n  `mapid` smallint(5) unsigned NOT NULL DEFAULT '0',\n  `zoneid` int(10) unsigned NOT NULL DEFAULT '0',\n  `areaid` int(10) unsigned NOT NULL DEFAULT '0',\n  `minlevel` tinyint(3) unsigned NOT NULL DEFAULT '0',\n  `maxlevel` tinyint(3) unsigned NOT NULL DEFAULT '0',\n  `flags` int(10) unsigned NOT NULL DEFAULT '0',\n  `x` float NOT NULL DEFAULT '0',\n  `y` float NOT NULL DEFAULT '0',\n  `z` float NOT NULL DEFAULT '0',\n  `o` float NOT NULL DEFAULT '0',\n  `links` mediumtext COLLATE utf8mb4_unicode_ci,\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Bot Wander Map';\n"
  },
  {
    "path": "AC/SQL/updates/world/2023_03_14_00_creature_wander_nodes.sql",
    "content": "--\nDROP TABLE IF EXISTS `creature_wander_nodes`;\n"
  },
  {
    "path": "AC/SQL/updates/world/2023_03_21_00_creature_template_npcbot_wander_nodes.sql",
    "content": "--\nDROP TABLE IF EXISTS `creature_template_npcbot_wander_nodes`;\n\nCREATE TABLE `creature_template_npcbot_wander_nodes` (\n  `id` int(10) unsigned NOT NULL,\n  `name` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'RENAME_ME',\n  `mapid` smallint(5) unsigned NOT NULL DEFAULT '0',\n  `zoneid` int(10) unsigned NOT NULL DEFAULT '0',\n  `areaid` int(10) unsigned NOT NULL DEFAULT '0',\n  `minlevel` tinyint(3) unsigned NOT NULL DEFAULT '0',\n  `maxlevel` tinyint(3) unsigned NOT NULL DEFAULT '0',\n  `flags` int(10) unsigned NOT NULL DEFAULT '0',\n  `x` float NOT NULL DEFAULT '0',\n  `y` float NOT NULL DEFAULT '0',\n  `z` float NOT NULL DEFAULT '0',\n  `o` float NOT NULL DEFAULT '0',\n  `links` mediumtext COLLATE utf8mb4_unicode_ci,\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Bot Wander Map';\n\nINSERT INTO `creature_template_npcbot_wander_nodes`(`id`,`name`,`mapid`,`zoneid`,`areaid`,`minlevel`,`maxlevel`,`flags`,`x`,`y`,`z`,`o`,`links`) VALUES\n(1,'Anvilmar',0,1,132,1,5,2,-6077.84,384.826,393.598,4.63263,'542:0 '),\n(2,'Brill',0,85,159,1,10,5,2249.85,278.414,34.1142,5.11546,'18:0 277:0 278:0 279:0 281:0 '),\n(3,'Darkshire',0,10,42,18,30,3,-10560.6,-1182.34,27.9637,3.1803,'783:0 784:0 787:0 788:0 789:0 '),\n(4,'Deathknell',0,85,154,1,10,5,1879.83,1588.2,90.1725,5.25172,'295:0 296:0 '),\n(5,'Dun Algaz',0,11,836,18,30,0,-4245.13,-2356.42,204.034,3.9477,'483:0 '),\n(6,'Dun Modr',0,11,205,18,30,0,-2610.26,-2350.56,81.5918,1.1263,'444:0 '),\n(7,'Goldshire',0,12,87,1,10,3,-9480.09,63.5218,56.1755,3.4173,'88:0 71:0 16:0 42:0 72:0 710:0 709:0 714:0 717:0 '),\n(8,'Ironforge',0,1,809,1,10,2,-5023.64,-831.425,495.319,5.37056,'559:0 560:0 '),\n(9,'Kharanos',0,1,131,1,10,3,-5501.22,-472.604,408.453,2.4002,'537:0 545:0 557:0 '),\n(10,'Lakeshire',0,44,69,13,25,3,-9235.12,-2145.54,71.2121,5.71383,'665:0 666:0 '),\n(11,'Menethil Harbor',0,11,150,18,30,3,-3672.7,-828.455,9.89925,3.18444,'476:0 477:0 478:0 '),\n(12,'Moonbrook',0,40,20,8,20,2,-11017.1,1510.17,43.1667,2.58627,'737:0 738:0 736:0 747:0 '),\n(13,'Northshire Abbey',0,12,9,1,10,3,-8900.51,-116.199,81.8499,0.369434,'710:0 70:0 73:0 '),\n(14,'Raven Hill',0,10,94,18,30,0,-10805.5,291.025,30.9282,3.92422,'751:0 753:0 754:0 755:0 766:0 '),\n(15,'Sentinel Hill',0,40,108,8,20,3,-10509.5,1047.74,60.519,5.20046,'741:0 742:0 745:0 746:0 736:0 750:0 '),\n(16,'Stormwind City',0,12,12,1,10,2,-9153.77,364.057,90.151,5.16709,'42:0 710:0 712:0 7:0 '),\n(17,'The Sepulcher',0,130,228,8,20,5,470.768,1589.82,126.632,5.16292,'305:0 '),\n(18,'Undercity',0,85,153,1,10,5,1885.94,236.924,58.0313,3.1016,'2:0 285:0 '),\n(19,'Thelsamar',0,38,144,8,20,3,-5334.7,-3015.26,324.2,1.73643,'503:0 504:0 '),\n(20,'Southshore',0,267,271,18,30,3,-803.031,-531.727,15.9656,1.39359,'362:0 363:0 376:0 384:0 385:0 356:0 '),\n(21,'Tarren Mill',0,267,272,18,30,5,-27.0354,-900.562,55.9602,4.57301,'378:0 380:0 379:0 384:0 '),\n(22,'Refuge Pointe',0,45,320,28,40,3,-1280.81,-2466.89,34.7175,5.16384,'78:0 416:0 419:0 '),\n(23,'Hammerfall',0,45,321,28,40,5,-955.494,-3540.82,56.7101,3.23882,'438:0 '),\n(24,'Kargath',0,3,340,33,45,5,-6625,-2152.82,249.141,4.5492,'594:0 598:0 '),\n(25,'Angor Fortress',0,3,338,33,45,0,-6392.65,-3158,299.765,4.68826,'608:0 620:0 '),\n(26,'Bloodhoof Village',1,215,222,1,10,0,-2323.92,-394.981,-9.12757,0.10888,''),\n(27,'Camp Narache',1,215,221,1,10,0,-2906.49,-253.607,52.941,5.73627,''),\n(28,'Razor Hill',1,14,362,1,10,0,312.659,-4745.52,9.54734,1.10362,'66:0 '),\n(29,'The Den',1,14,363,1,10,0,-604.098,-4202.92,38.7281,1.10189,''),\n(30,'Orgrimmar',1,14,14,1,10,0,1381.77,-4371.16,26.023,2.19128,''),\n(31,'Senjin Village',1,14,367,1,10,0,-819.492,-4918.24,18.3507,2.67153,''),\n(32,'The Crossroads',1,17,380,8,20,0,-455.9,-2652.15,95.5864,4.41391,''),\n(33,'Aldrassil',1,141,256,1,10,0,10462.7,805.993,1312.66,0.945149,'61:0 62:0 63:0 65:0 '),\n(34,'Dolanaar',1,141,186,1,10,0,9787.99,949.897,1306.73,0.734179,'63:0 '),\n(35,'Ratchet',1,17,392,8,20,0,-951.364,-3680.07,8.04046,0.798474,''),\n(36,'Booty Bay',0,33,35,33,45,0,-14308.8,440.139,25.5878,0.828079,'959:0 960:0 961:0 '),\n(37,'Gromgol Base Camp',0,33,117,33,45,5,-12416.5,185.125,1.83125,6.17782,'904:0 900:0 908:0 '),\n(38,'Astranaar',1,331,415,18,30,0,2720.43,-382.391,107.089,1.24727,''),\n(39,'Stonetalon Peak',1,406,467,13,25,0,2658.78,1449.71,226.135,5.85107,'155:0 '),\n(40,'Thalanaar',1,357,489,38,50,0,-4510.03,-779.474,-41.5367,0.513916,''),\n(41,'Freewind Post',1,400,484,23,35,0,-5454.07,-2445.5,90.1122,6.10667,'119:0 120:0 '),\n(42,'Mirror Lake',0,12,92,1,10,2,-9389.26,458.427,38.2852,2.4529,'72:0 16:0 88:0 7:0 '),\n(44,'Drywhisker Gorge',0,45,318,28,40,0,-1014.22,-3827.39,145.41,2.59534,'440:0 '),\n(45,'Sun Rock Retreat',1,406,460,13,25,0,936.308,910.974,104.44,0.864181,'151:0 '),\n(46,'Temple of Zin-Malor',1,16,1223,43,54,0,3549.15,-5359.12,188.348,1.22969,''),\n(47,'Hetaeras Clutch',1,16,1222,43,54,0,3556.64,-6232.79,44.0085,4.90175,'141:0 195:0 '),\n(48,'Uthers Tomb',0,28,196,48,56,0,1021.5,-1809.43,77.1448,3.5376,'271:0 '),\n(49,'Scholomance',0,139,2057,53,60,0,1262.19,-2579.41,123.746,4.56181,''),\n(50,'Whitereach Post',1,400,2237,23,35,0,-4917.35,-1375.5,-52.612,3.05417,''),\n(51,'Stonard',0,8,75,33,45,5,-10445,-3261.11,20.179,5.57373,'828:0 829:0 830:0 '),\n(52,'Gadgetzan',1,440,976,38,50,0,-7139.15,-3752.11,8.53951,2.41012,''),\n(53,'Camp Mojache',1,357,1099,38,50,0,-4394.98,215.611,25.4138,0.668987,'136:0 137:0 '),\n(54,'Theramore Isle',1,15,513,33,45,0,-3680.17,-4388.51,10.5544,2.126,'109:0 '),\n(55,'Aerie Peak',0,47,348,38,50,0,170.251,-2085.14,112.706,5.73674,'82:0 386:0 387:0 388:0 '),\n(56,'Everlook',1,618,2255,53,60,0,6723.46,-4662.5,720.986,4.0489,'143:0 147:0 '),\n(57,'Shadowprey Village',1,405,2408,28,40,0,-1657.85,3097.92,30.5002,4.53043,'127:0 '),\n(58,'Feathermoon Stronghold',1,357,1116,38,50,0,-4434.99,3276.74,11.7782,1.86721,''),\n(59,'Auberdine',1,148,442,8,20,0,6439.33,411.951,10.8632,4.98592,''),\n(60,'Nijels Point',1,405,608,28,40,0,202.521,1308.24,190.237,3.56577,''),\n(61,'Aldrassil',1,141,256,1,10,0,10479.6,812.281,1322.74,1.7975,'33:0 62:0 63:0 65:0 '),\n(62,'Shadowthread Cave',1,141,257,1,10,0,10756.2,921.301,1338.56,2.9431,'33:0 61:0 65:0 '),\n(63,'Fel Rock',1,141,258,1,10,0,10050.6,1031.2,1329.95,1.85839,'33:0 34:0 61:0 65:0 '),\n(64,'Banethil Barrow Den',1,141,736,1,10,0,9864.17,1557.41,1328.3,4.60699,''),\n(65,'The Cleft',1,141,263,1,10,0,10316.4,1200.62,1458.08,3.62911,'33:0 61:0 62:0 63:0 '),\n(66,'Razorwind Canyon',1,14,410,1,10,0,636.963,-4534.04,8.82068,1.74237,'28:0 67:0 '),\n(67,'Torkren Farm',1,14,2979,1,10,0,726.297,-4242.41,17.2915,1.86203,'66:0 '),\n(69,'Ironbands Compound',0,1,716,1,10,2,-5858.7,-2004.1,401.648,0.478922,'523:0 528:0 '),\n(70,'Echo Ridge Mine',0,12,34,1,10,2,-8691.38,-113.152,89.09,5.86134,'73:0 13:0 711:0 '),\n(71,'Maclure Vineyards',0,12,64,1,10,2,-9948.39,69.1568,33.3005,5.49869,'72:0 7:0 714:0 716:0 '),\n(72,'Stonefield Farm',0,12,63,1,10,2,-9901.14,378.19,35.2801,5.75613,'71:0 7:0 42:0 88:0 713:0 714:0 717:0 '),\n(73,'Northshire Vineyards',0,12,59,1,10,2,-9067.35,-333.965,73.4519,1.09469,'70:0 13:0 '),\n(74,'Tower of Ilgalar',0,44,96,18,25,0,-9282.21,-3330.43,115.604,1.41034,'683:0 685:0 686:0 '),\n(75,'Renders Rock',0,44,998,13,25,0,-8677.89,-2302.91,155.917,1.18325,'661:0 662:0 '),\n(76,'Spirit Den',0,33,1742,33,45,0,-13751.4,-18.3165,44.0002,0.851192,'964:0 '),\n(77,'Rethban Caverns',0,44,98,13,25,2,-8976.38,-2016.83,136.063,1.26142,'670:0 671:0 '),\n(78,'Boulderfist Outpost',0,45,1858,28,40,0,-1183.46,-2180.67,55.5524,1.6849,'22:0 415:0 416:0 419:0 '),\n(79,'Groshgok Compound',0,41,2937,50,60,0,-11094.7,-2311.06,117.13,4.77931,'800:0 803:0 804:0 '),\n(80,'Stagalbog Cave',0,8,1817,33,45,0,-10775.6,-3747.85,22.347,3.74768,'186:0 825:0 824:0 826:0 828:0 832:0 '),\n(81,'The Tower of Arathor',0,45,324,28,40,0,-1760.68,-1537.05,64.8696,2.02383,'425:0 '),\n(82,'Wildhammer Keep',0,47,349,38,50,0,257.234,-2208.21,142.103,6.19816,'55:0 387:0 388:0 '),\n(83,'Night Webs Hollow',0,85,155,1,10,4,2053.22,1802.16,99.8006,1.83635,'295:0 '),\n(84,'Terrorweb Tunnel',0,139,2626,53,60,0,3035.33,-2773.9,100.473,5.05065,'215:0 243:0 '),\n(85,'Browman Mill',0,139,2269,53,60,0,2483.98,-5183.79,76.1135,3.20045,'234:0 211:0 '),\n(86,'Uldaman',0,3,1337,33,45,0,-6092.01,-3179.35,255.852,5.9237,'621:0 '),\n(87,'Dustbelch Grotto',0,3,347,33,45,0,-7299.86,-2270.26,244.599,3.07308,'595:0 '),\n(88,'Westbrook Garrison',0,12,120,1,10,2,-9671.96,690.134,36.5414,5.31336,'72:0 42:0 713:0 7:0 717:0 '),\n(89,'Jasperlode Mine',0,12,54,1,10,0,-9194.18,-610.205,60.7892,0.426731,'701:0 702:0 707:0 708:0 '),\n(91,'Algaz Station',0,38,925,8,20,0,-4880.26,-2723,328.908,0.873682,'485:0 486:0 487:0 500:0 502:0 '),\n(92,'Grim Batol',0,11,1037,61,70,0,-4130,-3468.16,259.76,0.014411,'454:0 '),\n(93,'Venture Co. Mine',1,215,215,1,10,0,-1501.49,-1036.19,151.717,1.01756,''),\n(94,'Blackwood Den',1,148,455,8,20,0,4619.42,25.6126,69.7834,4.80597,'95:0 '),\n(95,'Wildbend River',1,148,454,8,20,0,5056.04,220.755,22.9081,5.20884,'94:0 '),\n(96,'Cliffspring Falls',1,148,445,8,20,0,6870.57,-662.396,82.9506,0.302464,''),\n(97,'Fray Island',1,17,720,8,20,0,-1668.51,-4329.2,3.26569,0.222455,''),\n(98,'Wailing Caverns',1,17,718,8,20,0,-837.968,-2037,80.467,1.58062,''),\n(99,'Shady Rest Inn',1,15,403,33,45,0,-3723.63,-2535.18,69.5651,1.00004,'103:0 '),\n(100,'Darkmist Cavern',1,15,499,33,45,0,-2829.79,-2722.81,36.7883,2.20851,'102:0 187:0 '),\n(101,'North Point Tower',1,15,504,33,45,0,-2884.79,-3429.99,39.357,3.86048,'102:0 110:0 '),\n(102,'Bluefen',1,15,507,33,45,0,-2685.32,-3087.58,41.4492,4.02905,'100:0 101:0 187:0 '),\n(103,'Lost Point',1,15,506,33,45,0,-3925.5,-2862.15,46.4791,4.55427,'99:0 108:0 '),\n(104,'Tidefury Cove',1,15,517,33,45,0,-4300.98,-4062.71,-10.5964,2.84709,'106:0 '),\n(105,'Stonemaul Ruins',1,15,508,33,45,0,-4346.02,-3321.15,34.2542,6.16796,'106:0 233:0 '),\n(106,'Onyxias Lair',1,15,511,33,45,0,-4698.06,-3720.58,47.1529,0.469848,'104:0 105:0 107:0 '),\n(107,'Emberstrifes Den',1,15,2158,33,45,0,-4987.73,-3832.99,44.1305,3.70876,'106:0 '),\n(108,'Bloodfen Burrow',1,15,498,33,45,0,-4335.04,-2639.53,38.0638,1.30845,'103:0 '),\n(109,'Sentry Point',1,15,503,33,45,0,-3476.59,-4109.08,17.1041,4.05466,'54:0 '),\n(110,'Swamplight Manor',1,15,497,33,45,0,-2949.47,-3893.5,35.0303,1.23141,'101:0 '),\n(111,'Marshals Refuge',1,490,541,46,56,0,-6143.21,-1078.89,-198.367,5.66637,''),\n(112,'Fungal Rock',1,490,542,46,56,0,-6370.15,-1836.52,-260.084,0.958035,''),\n(113,'Wavestrider Beach',1,440,988,38,50,0,-7693.45,-4878.96,0.661957,4.5132,''),\n(114,'Uldum',1,440,989,38,50,0,-9635.41,-2787.2,7.85617,5.44167,''),\n(115,'Darkcloud Pinnacle',1,400,2097,23,35,0,-5086.21,-1919.44,88.1806,6.15461,'116:0 119:0 '),\n(116,'Roguefeather Den',1,400,487,23,35,0,-5466.71,-1636.27,29.0246,3.60035,'115:0 '),\n(117,'Mirage Raceway',1,400,2240,23,35,0,-6239.42,-3973.12,-58.7501,5.06259,'122:0 123:0 '),\n(118,'The Rustmaul Digsite',1,400,479,23,35,0,-6490.61,-3449.15,-58.7821,3.58106,'123:0 '),\n(119,'Splithoof Hold',1,400,1557,23,35,0,-5065.61,-2367.61,-53.6725,4.0206,'41:0 115:0 120:0 '),\n(120,'The Weathered Nook',1,400,2303,23,35,0,-5213.85,-2794.53,-7.83752,2.24538,'41:0 119:0 '),\n(121,'Ironstone Camp',1,400,3037,23,35,0,-5848.05,-3412.38,-51.0548,0.373431,'122:0 '),\n(122,'Weazels Crater',1,400,3038,23,35,0,-5799.94,-3899.53,-96.7429,1.92693,'117:0 121:0 '),\n(123,'Tahonda Ruins',1,400,3039,23,35,0,-6569.91,-3894.97,-58.7495,0.100017,'117:0 118:0 '),\n(124,'Rolands Doom',0,10,2161,24,30,0,-11045.3,-1130.98,38.585,3.65547,'780:0 781:0 '),\n(126,'Bolgans Hole',1,405,600,28,40,0,-2281.95,2499.6,73.7525,5.34105,''),\n(127,'Maraudon',1,405,2100,28,40,0,-1422.62,2918.45,136.147,4.46498,'57:0 '),\n(128,'Ghost Walker Post',1,405,597,28,40,0,-1224.06,1736.67,90.0219,0.112112,'129:0 '),\n(129,'Scrabblescrews Camp',1,405,2617,28,40,0,-1407.87,1493.13,60.8875,4.75641,'128:0 '),\n(130,'Valley of Bones',1,405,2657,28,40,0,-2251.19,1513.55,63.5889,6.25387,''),\n(131,'Rage Scar Hold',1,357,1115,38,50,0,-3842.71,1738.94,142.708,2.30123,''),\n(132,'Ruins of Solarsal',1,357,1117,38,50,0,-4852.91,3616.63,16.4186,4.11504,''),\n(133,'Ravaged Twilight Camp',1,1377,3100,53,60,0,-6206.25,1766.95,17.464,4.2566,''),\n(134,'Twilight Post',1,1377,3098,53,60,0,-6740.04,1636.32,15.2836,4.04162,'189:0 202:0 '),\n(135,'Twilight Outpost',1,1377,3099,53,60,0,-7929.11,1833.28,4.86506,0.733634,''),\n(136,'Woodpaw Hills',1,357,2519,38,50,0,-4915.81,199.275,52.2959,6.13256,'53:0 '),\n(137,'Lariss Pavillion',1,357,2518,38,50,0,-4052.72,81.5525,77.1755,5.22503,'53:0 '),\n(138,'Slither Rock',0,46,2419,48,56,0,-7653.86,-2991.1,135.917,1.62615,'648:0 650:0 652:0 '),\n(139,'Flame Crest',0,46,251,48,56,0,-7486.64,-2184.45,166.505,5.87909,'646:0 '),\n(140,'Shalzarus Lair',1,357,3117,38,50,0,-5492.37,3622.79,1.62975,3.27216,''),\n(141,'Scalebeards Cave',1,16,3140,43,54,0,3705.1,-6043.45,2.50768,0.191079,'47:0 195:0 '),\n(142,'Timbermaw Hold',1,618,618,53,60,0,6900.63,-2298.18,588.52,1.94812,'148:0 '),\n(143,'The Ruins of KelTheril',1,618,2252,53,60,0,6426.76,-4304.99,664.687,3.04093,'56:0 194:0 '),\n(144,'Dun Mandarr',1,618,2248,53,60,0,5718.83,-4507.31,761.083,4.26757,''),\n(145,'Talrendis Point',1,16,3137,43,54,0,2707.72,-3869.25,104.208,5.79411,''),\n(146,'Rethress Sanctum',1,16,3138,43,54,0,2195.67,-6438.33,2.1301,4.39206,''),\n(147,'Moon Horror Den',1,618,3139,53,60,0,7123.02,-4631.57,639.68,2.0052,'56:0 '),\n(148,'Timbermaw Hold',1,361,1769,46,56,0,6817.78,-2097.68,624.839,2.56313,'142:0 '),\n(149,'Irontree Cavern',1,361,1768,46,56,0,6481.87,-1571,438.965,0.859127,''),\n(150,'Bloodvenom Post',1,361,1997,46,56,0,5111.98,-353.403,357.231,5.23802,''),\n(151,'Sishir Canyon',1,406,2541,13,25,0,515.845,624.05,68.1596,5.69462,'45:0 '),\n(152,'Cragpool Lake',1,406,463,13,25,0,1543.57,70.1338,-10.3835,0.632571,''),\n(153,'Windshear Mine',1,406,461,13,25,0,981.949,-358.9,14.3123,3.71479,''),\n(154,'The Talondeep Path',1,406,1277,13,25,0,1531.94,-576.57,67.9212,5.18318,'168:0 '),\n(155,'The Talon Den',1,406,468,13,25,0,2416.89,1792.39,393.641,3.36062,'39:0 '),\n(156,'The Ruins of OrdilAran',1,331,412,18,30,0,3493.89,-119.601,0.714987,2.44963,'157:0 '),\n(157,'Bathrans Haunt',1,331,411,18,30,0,3827.37,-161.305,-0.60768,3.24941,'156:0 '),\n(158,'Zoramgar Outpost',1,331,2897,18,30,0,3362.22,1010.16,3.59814,2.49558,''),\n(159,'Falfarren River',1,331,433,18,30,0,2231.21,-2222.91,94.4116,6.0491,'163:0 175:0 '),\n(160,'Xavian',1,331,429,18,30,0,2936.56,-2822.67,212.731,0.0776333,'161:0 '),\n(161,'Forest Song',1,331,2358,18,30,0,2880.33,-3287.54,156.204,1.1163,'160:0 '),\n(162,'Demon Fall Canyon',1,331,435,18,30,0,1702.45,-3150.99,93.5217,3.37253,'164:0 '),\n(163,'Silverwing Outpost',1,331,2360,18,30,0,1776.64,-2065.15,102.283,2.23373,'159:0 169:0 182:0 '),\n(164,'The DorDanil Barrow Den',1,331,432,18,30,0,1776.23,-2678.36,111.666,5.44343,'162:0 169:0 175:0 '),\n(165,'Silverwind Refuge',1,331,420,18,30,0,2130.27,-1190.25,99.3456,1.77657,'166:0 168:0 '),\n(166,'Greenpaw Village',1,331,2359,18,30,0,2291.29,-1444.96,87.8806,1.08665,'165:0 '),\n(167,'Bloodtooth Camp',1,331,2357,18,30,0,1612.52,-1465.1,157.023,5.78447,'182:0 '),\n(168,'The Talondeep Path',1,406,1277,13,25,0,1930.26,-732.677,114.534,3.7975,'154:0 165:0 '),\n(169,'Warsong Labor Camp',1,331,3177,18,30,0,1575.91,-2463.94,98.549,2.24558,'163:0 164:0 '),\n(170,'Aridens Camp',0,41,2560,50,60,0,-10443.3,-2141.1,90.7796,5.92189,'801:0 '),\n(171,'Deadwind Ravine',0,41,2558,50,60,0,-10607.9,-1904.89,117.201,2.66188,'798:0 799:0 '),\n(172,'Sleeping Gorge',0,41,2938,50,60,0,-10740.7,-1951.45,121.127,3.69664,'800:0 801:0 '),\n(173,'Chillwind Camp',0,28,3197,48,56,1,940.955,-1419.2,66.7723,0.796556,'271:0 272:0 334:0 '),\n(174,'Camp Taurajo',1,17,378,8,20,0,-2352.66,-1921.67,95.7825,1.62324,''),\n(175,'Splintertree Post',1,331,431,18,30,0,2286.41,-2564.67,105.481,4.11999,'159:0 164:0 '),\n(176,'The Swarming Pillar',1,1377,3097,53,60,0,-7066.79,731.852,67.2655,1.04864,'177:0 188:0 189:0 205:0 '),\n(177,'Bones of Grakkarond',1,1377,3257,53,60,0,-7234.61,874.224,0.285286,1.72442,'176:0 188:0 189:0 205:0 '),\n(178,'Woodpaw Den',1,357,2520,38,50,0,-4835.2,863.048,137.048,3.8637,''),\n(179,'Revantusk Village',0,47,3317,38,50,5,-573.459,-4590.51,10.4122,3.48476,'407:0 '),\n(180,'Thorium Point',0,51,1446,43,54,0,-6521.12,-1190.02,309.255,4.39589,'590:0 '),\n(181,'Morshan Base Camp',1,17,1599,8,20,0,1035.13,-2113.34,122.947,5.1989,'182:0 '),\n(182,'Silverwing Grove',1,331,3319,18,30,0,1462.48,-1858.93,123.55,1.74032,'163:0 167:0 181:0 '),\n(183,'The Weeping Cave',0,28,198,48,56,0,2249.61,-2389.63,59.8017,5.27414,'244:0 255:0 256:0 '),\n(184,'Valors Rest',1,1377,3077,53,60,0,-6404.33,-292.647,1.04401,3.06251,'190:0 191:0 '),\n(185,'Yojamba Isle',0,33,3357,33,45,0,-11838,1268.18,1.74176,4.79629,'894:0 887:0 895:0 896:0 '),\n(186,'Misty Reed Post',0,8,1978,33,45,4,-10854.8,-4093.43,21.7429,5.03063,'825:0 80:0 826:0 '),\n(187,'Brackenwall Village',1,15,496,33,45,0,-3132.98,-2880.71,34.718,4.58324,'100:0 102:0 '),\n(188,'Cenarion Hold',1,1377,3425,53,60,0,-6886.15,718.398,42.798,6.10305,'176:0 177:0 189:0 '),\n(189,'Twilight Base Camp',1,1377,2739,53,60,0,-6996.15,1195.01,11.4959,1.16226,'134:0 176:0 177:0 188:0 202:0 204:0 '),\n(190,'Staghelm Point',1,1377,3426,53,60,0,-6517.49,97.5554,126.126,1.85794,'184:0 191:0 '),\n(191,'Twilights Run',1,1377,3446,53,60,0,-6310.14,136.591,15.4595,2.53339,'184:0 190:0 '),\n(192,'Ortells Hideout',1,1377,2744,53,60,0,-7586.17,226.396,10.8663,1.24673,'205:0 '),\n(193,'Bronzebeard Encampment',1,1377,3427,53,60,0,-8021.76,1105.84,3.54927,1.43333,'203:0 '),\n(194,'Under Attack - Winterspring',1,618,2251,53,60,0,6519.57,-4117.1,661.535,4.32283,'143:0 '),\n(195,'Under Attack - Azshara',1,16,1222,43,54,0,3366.79,-6226.81,-15.3194,1.50275,'47:0 141:0 '),\n(196,'BLC1',0,4,4,43,54,0,-11202.2,-3034.46,6.232,1.13173,'839:0 841:0 845:0 852:0 854:0 '),\n(198,'Under Attack - Tanaris Desert',1,440,440,38,50,0,-8277.12,-3484.09,17.7284,1.51601,''),\n(199,'Under Attack - Eastern Plaguelands',0,139,2258,53,60,0,2492.32,-3803.41,177.692,4.09879,'248:0 '),\n(200,'Ivars Patch',0,130,239,8,20,4,1233.05,1214.28,52.5845,3.07876,'201:0 298:0 299:0 303:0 '),\n(201,'Valgans Field',0,130,227,8,20,4,908.754,1255.63,45.9684,0.575633,'299:0 302:0 303:0 200:0 '),\n(202,'Sandworm! - A Silithyst beast has surfaced',1,1377,2742,53,60,0,-6548.72,1150.51,-1.23794,4.6252,'134:0 189:0 '),\n(203,'Sandworm! - A Silithyst beast has surfaced',1,1377,1377,53,60,0,-7786.01,978.815,-2.90318,5.53981,'193:0 '),\n(204,'Sandworm! - A Silithyst beast has surfaced',1,1377,2743,53,60,0,-7463.3,1411.7,3.70656,4.14577,'189:0 '),\n(205,'Sandworm! - A Silithyst beast has surfaced',1,1377,2738,53,60,0,-7377.08,447.046,4.53578,2.59898,'176:0 177:0 192:0 '),\n(211,'Eastwall Tower - Horde',0,139,2271,53,60,0,2550.77,-4783.57,109.501,5.47479,'85:0 235:0 237:0 250:0 '),\n(215,'Plaguewood Tower - Horde, Progressing',0,139,4067,53,60,0,2991.34,-3045.27,119.143,2.65173,'84:0 241:0 242:0 '),\n(220,'Northpass Tower - Horde, Contested',0,139,2275,53,60,0,3168.41,-4356.58,138.976,4.89792,'236:0 237:0 238:0 '),\n(230,'Crown Guard Tower - Alliance',0,139,2263,53,60,0,1861.6,-3701.08,160.834,4.34226,'248:0 247:0 249:0 '),\n(233,'Mudsprocket',1,15,4010,33,45,0,-4590.83,-3182.5,34.9064,2.13752,'105:0 '),\n(234,'LightsHopeChapel',0,139,2268,53,60,1,2273.52,-5332.92,88.0978,1.44413,'85:0 252:0 '),\n(235,'BlackwoodLake',0,139,2624,53,60,0,2464.31,-4192.32,86.7625,5.25334,'211:0 236:0 250:0 '),\n(236,'EPL_hubN1',0,139,139,53,60,0,2895.84,-4274.37,91.0774,2.94428,'220:0 235:0 237:0 240:0 '),\n(237,'Northdale',0,139,2272,53,60,0,2939.45,-4922.8,110.201,2.76758,'236:0 211:0 220:0 238:0 '),\n(238,'ZulMasharEntrance',0,139,2273,53,60,0,3243.57,-4728.42,157.177,1.67982,'237:0 220:0 239:0 '),\n(239,'MazraAlor',0,139,2274,53,60,0,3446.77,-4987,196.046,5.53613,'238:0 '),\n(240,'PlaguewoodEast',0,139,2277,53,60,0,3031.09,-3786.79,119.967,4.37961,'236:0 241:0 242:0 '),\n(241,'PlaguewoodSouth',0,139,2277,53,60,0,2764.18,-3442.19,97.1331,4.24216,'215:0 240:0 242:0 '),\n(242,'PlaguewoodCenter',0,139,2277,53,60,0,3137.26,-3403.95,139.517,0.937594,'215:0 240:0 241:0 '),\n(243,'TerrorweTunnelWest',0,139,2619,53,60,0,2724.41,-2453.2,66.836,5.42496,'244:0 84:0 '),\n(244,'ThondorilRiverSouth',0,139,2619,53,60,0,2417.75,-2469.65,72.4504,0.00296164,'183:0 243:0 245:0 '),\n(245,'EPL_hubSW',0,139,139,53,60,0,2076.2,-2853.69,86.3391,0.879086,'244:0 246:0 248:0 255:0 '),\n(246,'EPL_hubSWRoad',0,139,139,53,60,0,1811.3,-3046.98,75.4985,1.09939,'245:0 247:0 255:0 '),\n(247,'Undercroft',0,139,2261,53,60,0,1600.37,-3283.08,91.4858,0.567285,'246:0 230:0 '),\n(248,'EPL_hubSW2',0,139,139,53,60,0,2175.83,-3487.76,123.024,5.90406,'199:0 230:0 245:0 '),\n(249,'EPL_SRoad',0,139,139,53,60,0,1841.76,-4088.5,101.961,5.05584,'230:0 250:0 '),\n(250,'CorinsCrossing',0,139,2264,53,60,0,2074.45,-4556.23,73.5772,0.745981,'211:0 235:0 249:0 251:0 252:0 '),\n(251,'ScarletBaseCamp',0,139,2265,53,60,0,1656.05,-4826.35,87.7738,0.384695,'250:0 252:0 253:0 '),\n(252,'PestilentScar',0,139,2622,53,60,0,2013.6,-4964.85,73.6116,5.58402,'234:0 250:0 251:0 253:0 '),\n(253,'TyrshandEntrance',0,139,2266,53,60,0,1690.77,-5201.46,74.6226,4.83788,'251:0 252:0 254:0 '),\n(254,'Tyrshand',0,139,2266,53,60,0,1609.91,-5528.27,111.168,4.2076,'253:0 '),\n(255,'ThondorilRiverBridge',0,139,2619,53,60,0,1924.72,-2608.2,62.8109,4.6761,'183:0 245:0 246:0 256:0 '),\n(256,'GahrronWithering',0,28,201,48,56,0,1768.07,-2280.14,59.7087,0.010807,'183:0 255:0 257:0 258:0 '),\n(257,'WritingHaunt',0,28,202,48,56,0,1506.64,-1862.76,59.0986,5.271,'256:0 258:0 259:0 266:0 269:0 '),\n(258,'WPL_hubC2',0,28,28,48,56,0,1760.12,-1779.45,64.8245,4.87437,'256:0 257:0 259:0 260:0 266:0 269:0 '),\n(259,'DalsonTears',0,28,200,48,56,0,1864.12,-1558.81,59.2668,3.44495,'257:0 258:0 260:0 266:0 267:0 269:0 '),\n(260,'WPL_hubN1',0,28,28,48,56,0,2122.47,-1665.81,64.0458,5.36013,'258:0 259:0 261:0 262:0 '),\n(261,'NorthridgeLumberCamp',0,28,192,48,56,0,2421.88,-1647.26,103.541,5.77835,'260:0 '),\n(262,'WPL_hubN2',0,28,28,48,56,0,2425.99,-1947.45,109.098,4.71217,'260:0 263:0 '),\n(263,'HearthglenTower',0,28,28,48,56,0,2701.43,-1944.23,107.238,0.832291,'262:0 265:0 '),\n(264,'Hearthglen',0,28,203,48,56,0,2924.12,-1426.31,150.782,1.09736,'265:0 '),\n(265,'HearthglenEntrance',0,28,190,48,56,0,2782.62,-1612.54,129.551,0.826396,'264:0 263:0 '),\n(266,'WPL_hubC1',0,28,28,48,56,0,1680.03,-1358.64,69.8578,5.02985,'268:0 257:0 258:0 259:0 267:0 269:0 270:0 274:0 '),\n(267,'FelstoneField',0,28,199,48,56,0,1795.08,-1188.53,59.8914,5.54821,'268:0 259:0 266:0 269:0 273:0 274:0 '),\n(268,'AndorhalW',0,28,193,48,56,0,1336.99,-1272.01,57.8614,2.26525,'266:0 267:0 269:0 270:0 272:0 '),\n(269,'AndorhalNE',0,28,193,48,56,0,1540.11,-1606.19,65.1216,5.937,'257:0 258:0 259:0 266:0 267:0 268:0 270:0 '),\n(270,'AndorhalEntranceSE',0,28,197,48,56,0,1294.98,-1678.78,62.5727,3.83801,'268:0 266:0 269:0 271:0 '),\n(271,'SorrowHillCR',0,28,197,48,56,0,1162.78,-1758.3,60.6308,3.04279,'48:0 173:0 270:0 '),\n(272,'AndorhalEntranceSW',0,28,28,48,56,0,1214.59,-1145.63,60.8962,5.48342,'268:0 173:0 '),\n(273,'Bulwark',0,28,813,10,56,4,1718.17,-802.509,57.5466,1.68044,'267:0 274:0 275:0 276:0 '),\n(274,'WPL_hubE',0,28,813,48,56,0,1663.85,-956.731,69.3084,0.651574,'266:0 267:0 273:0 '),\n(275,'TG_hubSE',0,85,85,1,10,4,1806.63,-369.504,32.3876,6.02566,'273:0 276:0 277:0 '),\n(276,'BalnirFarmstead',0,85,165,6,10,4,2029.54,-432.459,35.4011,5.30269,'273:0 275:0 277:0 '),\n(277,'TG_hubC2',0,85,85,1,10,4,2029.86,-87.8105,35.5077,4.49765,'2:0 275:0 276:0 '),\n(278,'BrillEntrance',0,85,159,1,10,4,2296.05,429.197,35.7333,5.74799,'2:0 279:0 285:0 297:0 '),\n(279,'GarrensHauntGraves',0,85,85,4,10,4,2599.87,521.024,17.2769,5.97968,'2:0 278:0 280:0 281:0 '),\n(280,'GarrensHaunt',0,85,164,6,10,4,2883.52,376.589,25.8553,5.87914,'279:0 281:0 284:0 '),\n(281,'BrightwaterLake',0,85,85,1,10,4,2634.44,79.5244,31.089,6.13244,'2:0 279:0 280:0 282:0 284:0 '),\n(282,'NorthCoastE',0,85,168,7,10,4,3032.54,-341.266,5.44748,2.52746,'281:0 283:0 '),\n(283,'NorthCoastC',0,85,168,1,10,4,2935.15,41.7046,6.92148,4.82869,'282:0 284:0 '),\n(284,'NorthCoastW',0,85,168,1,10,4,2984.21,388.32,7.96326,4.49688,'280:0 281:0 283:0 '),\n(285,'ColdHearthManor',0,85,166,1,10,4,2107.98,617.879,35.0405,0.497239,'278:0 18:0 286:0 287:0 297:0 '),\n(286,'TG_hubC1',0,85,85,1,10,0,2204.7,1063.28,28.6853,4.1572,'285:0 287:0 288:0 292:0 294:0 '),\n(287,'CrusadersOutpost',0,85,85,1,10,0,1797.65,703.831,48.147,1.54771,'286:0 285:0 297:0 '),\n(288,'TH_hubNE',0,85,85,1,10,4,2446.9,1082.07,58.5203,0.911539,'286:0 289:0 292:0 293:0 294:0 '),\n(289,'AgamandMillsEntrance',0,85,157,4,10,4,2701.33,937.571,110.912,0.173269,'288:0 290:0 291:0 '),\n(290,'AgamandMillsW',0,85,157,6,10,4,2889.98,1065.92,105.434,5.38438,'289:0 291:0 '),\n(291,'AgamandMillsE',0,85,157,6,10,4,2973.71,619.932,93.8373,1.31013,'289:0 290:0 '),\n(292,'SollidenFarmstead',0,85,156,1,10,4,2329.03,1407.79,33.3337,0.622907,'286:0 288:0 293:0 294:0 '),\n(293,'CrusadersOutpost',0,85,85,1,10,4,2430.28,1585.02,37.0619,0.587566,'288:0 292:0 '),\n(294,'UndeadStartExit',0,85,85,5,10,4,2197.51,1192.39,31.5497,5.11342,'288:0 286:0 292:0 295:0 '),\n(295,'UndeadStartEnd',0,85,154,1,10,4,2061.91,1418.99,63.8379,5.30978,'294:0 83:0 4:0 296:0 '),\n(296,'UndeadStartE',0,85,154,1,10,4,1805.3,1351.42,87.1354,0.232168,'295:0 4:0 '),\n(297,'TH_exitS',0,85,85,7,12,4,1642.09,555.658,33.4922,2.88878,'278:0 285:0 287:0 298:0 '),\n(298,'ShiningStrandN',0,130,927,8,14,4,1331.69,679.903,40.5373,1.02387,'297:0 200:0 '),\n(299,'DeadField',0,130,240,8,20,4,1076.06,1545.35,28.6412,4.79771,'201:0 300:0 301:0 302:0 303:0 200:0 '),\n(300,'SkitteringDark',0,130,226,8,20,4,1271.34,1974.49,17.8502,4.31862,'299:0 301:0 '),\n(301,'NorthTidesHollow',0,130,305,8,20,4,833.25,1880.5,21.9868,5.06279,'299:0 300:0 '),\n(302,'SPF_hubC1',0,130,130,8,20,4,867.729,1518.72,35.2045,0.160734,'201:0 299:0 303:0 304:0 '),\n(303,'SPF_hubC2',0,130,130,8,20,4,934.532,1356.51,43.5579,3.0887,'201:0 299:0 302:0 200:0 305:0 '),\n(304,'SPF_hubC3',0,130,130,8,20,4,736.764,1449.26,64.4284,0.457609,'302:0 305:0 306:0 '),\n(305,'SPF_hubC4',0,130,130,8,20,4,587.903,1352.93,90.6192,0.359403,'303:0 304:0 306:0 17:0 313:0 '),\n(306,'DecrepitFerry',0,130,237,13,20,4,664.305,1021.48,45.3265,5.10911,'304:0 305:0 307:0 '),\n(307,'FenrisIsle',0,130,172,15,20,4,704.961,674.359,43.3624,1.57874,'306:0 308:0 311:0 '),\n(308,'FenrisIsleSE',0,130,172,15,20,4,653.059,335.097,35.0481,1.33722,'307:0 309:0 '),\n(309,'FenrisIsleE',0,130,232,16,20,4,866.03,78.8803,34.2361,2.23258,'308:0 310:0 '),\n(310,'DawningIsles',0,130,232,17,22,4,1199.57,370.42,34.3257,3.13185,'309:0 '),\n(311,'FenrisKeep',0,130,172,8,20,4,1013.6,734.689,59.2651,3.23986,'307:0 '),\n(312,'DeepElemMineFork',0,130,213,8,20,4,271.231,1110.33,80.2136,5.99661,'313:0 314:0 317:0 318:0 '),\n(313,'SPF_hubC5',0,130,130,8,20,4,385.877,1253.37,80.2878,0.320144,'305:0 312:0 315:0 '),\n(314,'DeepElemMine',0,130,213,8,20,4,376.82,1082.54,106.396,3.03959,'312:0 '),\n(315,'SPF_hubC6',0,130,130,8,20,4,194.263,1268.01,72.8331,6.23812,'313:0 316:0 317:0 318:0 '),\n(316,'OlsensFarthing',0,130,229,8,20,4,171.155,1487.65,114.395,4.84404,'315:0 '),\n(317,'SPF_DalaranCamp1',0,130,130,8,20,4,-50.4703,1331.43,60.9321,5.92005,'315:0 312:0 318:0 319:0 323:0 '),\n(318,'SPF_hubS1',0,130,130,8,20,4,-132.172,1170.25,63.4384,0.508657,'315:0 317:0 312:0 319:0 323:0 326:0 '),\n(319,'AmberhillEntrance',0,130,233,11,20,4,-131.822,896.74,65.831,1.54539,'317:0 318:0 320:0 321:0 323:0 325:0 '),\n(320,'AmberhillHall',0,130,233,13,20,4,-141.972,812.61,63.737,1.09457,'319:0 '),\n(321,'AmberhillFarms',0,130,233,15,20,4,88.1028,694.265,60.6053,2.4376,'322:0 319:0 '),\n(322,'AmberhillMurlocCamp',0,130,130,15,20,4,434.265,696.251,33.7837,3.19747,'321:0 '),\n(323,'SPF_hubS2',0,130,130,8,20,4,-330.828,1311.68,37.1012,1.70757,'317:0 318:0 319:0 324:0 326:0 327:0 '),\n(324,'PyrewoodVillage',0,130,204,8,20,4,-383.772,1597.45,16.8392,4.90611,'323:0 '),\n(325,'SPF_exitSE',0,130,130,15,20,4,-543.136,724.877,91.2236,0.975962,'319:0 326:0 357:0 '),\n(326,'SPF_hubS3',0,130,130,8,20,4,-503.287,1113.31,76.93,0.514545,'318:0 323:0 325:0 '),\n(327,'GreymaneWall',0,130,230,8,20,4,-744.895,1522.56,15.5245,5.84742,'323:0 '),\n(328,'DandredsFold',0,36,1682,35,40,0,1235.47,-274.821,40.3856,4.48552,'329:0 '),\n(329,'UplandsN',0,36,284,28,40,0,1085.27,-663.59,87.8456,1.24773,'328:0 330:0 '),\n(330,'UplandsS',0,36,284,28,40,0,958.693,-748.597,114.797,4.04964,'329:0 331:0 335:0 '),\n(331,'Strahnbard',0,36,280,28,40,0,683.909,-963.157,164.301,0.671641,'330:0 332:0 343:0 '),\n(332,'AM_hubE1',0,36,36,28,40,0,615.654,-1043.7,168.11,0.331968,'331:0 333:0 381:0 '),\n(333,'AM_hubE2',0,36,1684,36,42,0,640.065,-1460.93,76.3018,6.17925,'332:0 334:0 '),\n(334,'ChillwindCampRoad',0,28,3197,48,56,0,933.473,-1479.87,62.8272,3.06319,'333:0 173:0 '),\n(335,'SlaughterHollowNE',0,36,283,28,40,0,802.9,-628.854,149.733,3.01018,'330:0 336:0 337:0 '),\n(336,'SlaughterHollowN',0,36,283,28,40,0,835.191,-445.445,134.228,4.48673,'335:0 '),\n(337,'SlaughterHollowC',0,36,281,28,40,0,620.637,-522.586,179.928,5.73159,'335:0 338:0 343:0 '),\n(338,'RuinsOfAlterac',0,36,281,28,40,0,631.058,-371.491,154.481,2.42898,'340:0 337:0 339:0 '),\n(339,'RuinsOfAlteracSW',0,36,281,28,40,0,500.776,-173.116,151.449,5.19357,'340:0 338:0 341:0 '),\n(340,'RuinsOfAlteracSE',0,36,281,28,40,0,397.344,-248.661,161.727,5.94755,'338:0 339:0 '),\n(341,'RuinsOfAlteracE',0,36,281,28,40,0,573.088,-14.3215,142.366,3.66008,'339:0 342:0 '),\n(342,'RuinsOfAlteracSSW',0,36,1683,28,40,0,252.323,-82.4394,141.544,0.263228,'341:0 344:0 '),\n(343,'RuinsOfAlteracE',0,36,1357,28,40,0,493.629,-621.553,172.877,0.602885,'331:0 337:0 344:0 345:0 380:0 '),\n(344,'RuinsOfAlteracS',0,36,1683,28,40,0,141.788,-316.452,150.648,1.12125,'342:0 343:0 346:0 '),\n(345,'CorrahnsDagger',0,36,1679,28,40,0,-45.3608,-581.074,153.724,5.82187,'343:0 346:0 380:0 '),\n(346,'CorrahnsDaggerFork',0,36,1679,28,40,0,57.1052,-405.389,132.108,2.70582,'344:0 345:0 347:0 385:0 '),\n(347,'Headland',0,36,1680,28,40,0,-163.833,-293.019,151.411,0.123425,'346:0 348:0 '),\n(348,'GavinsNaze',0,36,1677,28,40,0,-63.0062,-197.056,131.24,2.72704,'347:0 349:0 350:0 355:0 '),\n(349,'GavinsNazeTop',0,36,1677,28,40,0,-125.184,-59.9939,147.694,5.63693,'348:0 350:0 '),\n(350,'GavinsNazeW',0,36,279,28,40,0,68.1015,-53.44,99.6287,3.99152,'348:0 349:0 351:0 352:0 353:0 '),\n(351,'DalaranCraterN',0,36,279,28,40,4,466.751,167.322,41.9053,3.38088,'350:0 352:0 '),\n(352,'DalaranCraterS',0,36,279,28,40,4,90.2654,237.935,43.2902,5.2894,'351:0 350:0 353:0 354:0 '),\n(353,'LordamereInternmentCamp',0,36,278,28,40,4,-90.5356,218.366,53.2755,6.11997,'352:0 350:0 354:0 '),\n(354,'HillsbradFieldsC',0,267,286,18,30,4,-499.681,78.0454,56.6165,0.278575,'352:0 353:0 356:0 355:0 '),\n(355,'HillsbradFieldsE',0,267,286,18,30,0,-437.039,-135.243,56.2029,2.13409,'354:0 356:0 348:0 385:0 '),\n(356,'HillsbradFieldsSRoad',0,267,267,18,30,0,-639.845,-98.2014,47.262,0.172558,'358:0 360:0 354:0 357:0 361:0 355:0 385:0 20:0 '),\n(357,'SouthPointTower',0,267,285,18,30,0,-637.717,273.387,63.926,4.49972,'356:0 325:0 358:0 359:0 '),\n(358,'WesternStrandW',0,267,295,18,30,0,-979.029,273.179,7.90667,5.62479,'357:0 356:0 359:0 '),\n(359,'WesternStrandSW',0,267,295,18,30,0,-1128.84,276.704,0.0000662804,5.89576,'357:0 358:0 360:0 '),\n(360,'WesternStrandS',0,267,295,18,30,0,-1156.55,7.61478,0.00000548363,6.16081,'359:0 356:0 361:0 '),\n(361,'WesternStrandS',0,267,295,18,30,0,-1102.38,-114.03,0.0000309944,0.148599,'362:0 360:0 356:0 '),\n(362,'WesternStrandE',0,267,271,18,30,0,-962.262,-506.545,2.13023,1.90396,'361:0 363:0 20:0 '),\n(363,'SouthshoreS',0,267,271,18,30,0,-974.276,-592.998,0.229758,0.372044,'362:0 364:0 20:0 '),\n(364,'EasternStrandW',0,267,294,18,30,0,-1012.85,-790.213,9.01406,5.30042,'363:0 365:0 368:0 376:0 '),\n(365,'EasternStrandC',0,267,294,18,30,0,-1183.14,-847.579,1.43171,6.18988,'364:0 366:0 '),\n(366,'EasternStrandS',0,267,294,18,30,0,-1311.64,-1052.47,18.2271,0.929683,'365:0 367:0 368:0 '),\n(367,'DunGarok',0,267,290,18,30,4,-1256.01,-1190.37,38.9786,2.03514,'366:0 368:0 376:0 '),\n(368,'DunGarokRoad',0,267,267,18,30,0,-1049.49,-1239.84,53.3175,1.75045,'364:0 366:0 367:0 369:0 373:0 '),\n(369,'HillsbradFoothillsExitSE',0,267,267,18,30,0,-784.955,-1512.45,56.6724,1.97822,'370:0 368:0 373:0 410:0 '),\n(370,'HillsbradFoothillsExitE',0,267,275,18,30,0,-594.279,-1721.03,62.3187,2.25507,'369:0 371:0 411:0 '),\n(371,'DurnholdeNE',0,267,275,18,30,0,-383.173,-1720.01,90.0634,3.41784,'372:0 370:0 '),\n(372,'DurnholdeNNE',0,267,275,18,30,0,-316.76,-1609.34,86.0559,5.49914,'371:0 377:0 386:0 '),\n(373,'DurnholdeS',0,267,267,18,30,0,-669.891,-1326.66,66.6887,5.65621,'376:0 374:0 368:0 369:0 383:0 '),\n(374,'DurnholdeInside',0,267,275,18,30,0,-518.661,-1435.16,64.889,2.5637,'373:0 375:0 '),\n(375,'DurnholdeInsideDeep',0,267,275,18,30,0,-512.473,-1541.62,67.1947,1.69387,'374:0 '),\n(376,'NethanderStead',0,267,289,18,30,0,-915.831,-926.49,31.1754,1.19711,'364:0 367:0 373:0 383:0 20:0 '),\n(377,'DurnholdeN',0,267,275,18,30,0,-298.033,-1310.71,76.9034,4.69017,'372:0 378:0 383:0 '),\n(378,'DurnholdeNN',0,267,267,18,30,0,-37.1467,-1296.59,83.7166,3.13705,'377:0 21:0 '),\n(379,'TarrenMillN',0,267,267,18,30,4,188.047,-974.547,75.5356,0.0209713,'21:0 381:0 '),\n(380,'GallowsCorner',0,36,1357,28,40,0,324.254,-615.115,145.246,3.03887,'343:0 345:0 21:0 382:0 '),\n(381,'SoferasCorner',0,36,36,28,40,0,461.934,-926.633,129.374,2.72668,'379:0 332:0 382:0 '),\n(382,'SoferasNaze',0,36,1678,28,40,0,248.314,-839.928,146.333,0.818164,'381:0 380:0 '),\n(383,'HFH_bridge',0,267,267,18,30,0,-487.607,-967.55,34.4918,4.54488,'377:0 376:0 373:0 384:0 '),\n(384,'DarrowHillE',0,267,267,18,30,0,-323.998,-672.57,54.6417,3.9048,'21:0 383:0 385:0 20:0 '),\n(385,'DarrowHillW',0,267,1056,18,30,0,-332.483,-447.42,58.4647,0.297842,'346:0 355:0 356:0 384:0 20:0 '),\n(386,'HinterlandsEntrance',0,47,47,38,50,0,-77.4076,-1845.63,143.116,2.46164,'372:0 55:0 '),\n(387,'ZunWatha',0,47,352,38,50,0,-11.9998,-2493.37,119.659,1.99629,'55:0 82:0 388:0 391:0 '),\n(388,'QuelDanilS',0,47,47,38,50,0,65.3995,-2664.2,111.823,5.20269,'55:0 82:0 387:0 389:0 390:0 391:0 392:0 '),\n(389,'QuelDanil',0,47,350,38,50,4,210.196,-2789.46,122.156,1.50935,'388:0 390:0 392:0 '),\n(390,'HL_hubW',0,47,47,38,50,0,132.208,-2876.17,116.583,1.69588,'388:0 389:0 392:0 393:0 397:0 398:0 '),\n(391,'BogensLedge',0,47,1887,38,50,0,-198.398,-2585.67,120.378,6.18051,'387:0 388:0 393:0 '),\n(392,'HiriWatha',0,47,1885,38,50,0,-35.4616,-2815.33,122.143,0.435323,'389:0 390:0 388:0 393:0 '),\n(393,'ShadraAlorEntrance',0,47,47,38,50,0,-160.179,-2955.33,115.773,1.96371,'391:0 392:0 390:0 395:0 394:0 396:0 398:0 400:0 '),\n(394,'ShadraAlorE',0,47,353,38,50,0,-366.126,-2955.41,89.39,6.27554,'393:0 395:0 396:0 '),\n(395,'ShadraAlorS',0,47,353,38,50,0,-455.461,-2839.4,105.834,6.08704,'393:0 394:0 396:0 '),\n(396,'ShadraAlorW',0,47,353,38,50,0,-296.621,-2833,96.7074,5.15045,'393:0 395:0 394:0 '),\n(397,'AgolWatha',0,47,1884,38,50,0,397.177,-3352.2,123.451,2.24644,'390:0 398:0 399:0 '),\n(398,'CreepingRun',0,47,1886,38,50,0,116.576,-3466.05,107.658,1.12922,'393:0 397:0 390:0 399:0 400:0 401:0 '),\n(399,'SkulkRock',0,47,351,38,50,0,363.014,-3796.73,171.76,1.54745,'397:0 398:0 401:0 404:0 '),\n(400,'AltarOfZul',0,47,355,38,50,0,-147.861,-3319.03,121.957,3.93113,'393:0 398:0 '),\n(401,'HL_hubC',0,47,47,38,50,0,109.926,-3922.75,136.697,0.948588,'398:0 399:0 402:0 403:0 404:0 '),\n(402,'JinthaAlor',0,47,354,38,50,0,-217.196,-4159.98,118.665,0.453769,'401:0 403:0 '),\n(403,'OverlookCliffsS',0,47,307,38,50,0,-150.233,-4250.21,120.905,4.17653,'401:0 402:0 405:0 '),\n(404,'SeradaneBridge',0,47,351,38,50,0,472.513,-3907.18,113.731,5.88677,'399:0 401:0 409:0 '),\n(405,'OverlookCliffsRampTop',0,47,307,38,50,0,-243.665,-4377.48,105.997,0.98978,'403:0 406:0 '),\n(406,'OverlookCliffsRampBottom',0,47,307,38,50,0,-3.15739,-4629.26,13.899,2.27391,'405:0 407:0 408:0 '),\n(407,'RevantuskOutside',0,47,307,38,50,0,-355.789,-4475.87,11.3783,0.924997,'406:0 179:0 '),\n(408,'OverlookCliffsEnd',0,47,307,38,50,0,133.371,-4745.73,2.05405,2.27392,'406:0 '),\n(409,'Seradane',0,47,356,60,80,0,755.958,-4011.61,92.8808,5.95432,'404:0 '),\n(410,'ArathiExitNW',0,45,334,28,40,0,-889.426,-1677.32,57.6111,1.06053,'369:0 411:0 412:0 414:0 '),\n(411,'ArathiExitN',0,45,45,28,40,0,-684.458,-1831.3,53.3946,0.936824,'370:0 410:0 412:0 413:0 '),\n(412,'ArathiCW',0,45,45,28,40,0,-863.176,-1785.9,39.6302,5.66886,'410:0 411:0 413:0 414:0 '),\n(413,'NorthfoldManor',0,45,313,28,40,0,-822.895,-2039.83,34.4558,1.25884,'411:0 412:0 415:0 '),\n(414,'Arathi_hubW',0,45,45,28,40,0,-1190.48,-1731.63,56.3674,6.26181,'410:0 412:0 415:0 420:0 '),\n(415,'NorthfoldManor',0,45,313,28,40,0,-933.512,-2120.29,56.5869,2.05011,'78:0 413:0 414:0 416:0 '),\n(416,'RefugePointeExitN',0,45,315,28,40,0,-1158.07,-2706.9,52.0215,2.18796,'78:0 22:0 415:0 417:0 418:0 419:0 435:0 '),\n(417,'DabyrieFarmstead',0,45,45,28,40,0,-1091.19,-2856.55,42.4006,1.78073,'416:0 418:0 435:0 436:0 '),\n(418,'ArathiCO',0,45,336,28,40,0,-1352.09,-2738.95,59.0948,6.08275,'416:0 417:0 419:0 431:0 432:0 435:0 '),\n(419,'RefugePointeExitS',0,45,45,28,40,0,-1466.43,-2424.6,57.8277,5.98262,'22:0 78:0 416:0 418:0 420:0 427:0 429:0 431:0 '),\n(420,'StromgardeRoad',0,45,45,28,40,0,-1323.01,-1833.39,63.6564,0.712589,'421:0 414:0 419:0 427:0 '),\n(421,'StromgardeInside',0,45,324,28,40,0,-1576.29,-1800.48,67.6512,3.46934,'422:0 423:0 424:0 420:0 '),\n(422,'StromgardeKeep',0,45,324,28,40,0,-1660.06,-1803.63,83.0724,6.27321,'421:0 426:0 '),\n(423,'StromgardeE',0,45,324,28,40,0,-1602.44,-1922.26,67.2707,1.50115,'421:0 '),\n(424,'StromgardeW1',0,45,324,28,40,0,-1596.2,-1745.56,67.3627,5.09826,'421:0 425:0 '),\n(425,'StromgardeW2',0,45,324,28,40,0,-1720.34,-1736.69,52.4064,6.26851,'424:0 81:0 '),\n(426,'StromgardeKeepSide',0,45,324,28,40,0,-1681.32,-1933.25,80.6272,1.35821,'422:0 '),\n(427,'ArathiCI',0,45,335,28,40,0,-1517.62,-2100.44,22.3405,4.92548,'419:0 420:0 428:0 '),\n(428,'ThandolRoadN',0,45,45,28,40,0,-1995.23,-2466.74,78.7992,0.837489,'427:0 429:0 441:0 '),\n(429,'ArathiRoadSmid',0,45,45,28,40,0,-1763.42,-2422.8,59.5627,0.9015,'419:0 428:0 431:0 430:0 '),\n(430,'BoulderfistHall',0,45,316,28,40,0,-1941.13,-2794.22,85.7724,0.38314,'429:0 431:0 432:0 '),\n(431,'Arathi_hubE1',0,45,45,28,40,0,-1570.23,-2675.51,35.6533,6.03014,'419:0 418:0 429:0 432:0 435:0 430:0 '),\n(432,'Arathi_hubE2',0,45,317,28,40,0,-1705.19,-3021.39,31.689,0.310091,'433:0 418:0 431:0 434:0 430:0 '),\n(433,'WitherbarkVillage',0,45,317,28,40,0,-1867.12,-3365.42,56.1179,1.07782,'432:0 '),\n(434,'GoshekFarm',0,45,314,28,40,0,-1526.14,-3075.57,14.1487,2.82925,'432:0 435:0 '),\n(435,'Arathi_hubNE1',0,45,45,28,40,0,-1297.32,-3141.76,34.9289,1.25489,'416:0 417:0 418:0 431:0 434:0 436:0 438:0 '),\n(436,'Arathi_hubNE2',0,45,45,28,40,0,-1005.91,-3313.55,55.2766,2.32737,'435:0 417:0 437:0 438:0 '),\n(437,'ArathiCE',0,45,333,28,40,0,-839.717,-3280.93,78.5616,3.98495,'436:0 438:0 '),\n(438,'HammerfallEntrance',0,45,321,28,40,0,-1164.53,-3558.81,50.1497,1.47167,'435:0 436:0 437:0 23:0 439:0 '),\n(439,'DrywhiskerGorgeOutside',0,45,318,28,40,0,-1086,-3696.31,81.3913,2.10981,'438:0 440:0 '),\n(440,'DrywhiskerGorgeEntrance',0,45,318,28,40,0,-1083.95,-3820.83,128.504,1.71515,'439:0 44:0 '),\n(441,'ArathiRoadSbottom',0,45,880,28,40,0,-2248.64,-2487.38,80.1236,4.70713,'428:0 442:0 443:0 '),\n(442,'ThandolSpanCamp',0,45,45,28,40,0,-2249.4,-2633.38,78.816,1.44851,'441:0 '),\n(443,'ThandolSpanS',0,11,881,18,30,0,-2478.16,-2506.16,78.5672,0.110205,'441:0 444:0 '),\n(444,'DunModrCamp',0,11,881,18,30,0,-2609.79,-2494.69,80.9667,1.57693,'443:0 6:0 445:0 '),\n(445,'Wetlands_hubN1',0,11,11,18,30,0,-2937.95,-2470.57,26.6988,6.13028,'444:0 446:0 447:0 461:0 462:0 '),\n(446,'DaggerforgeHill',0,11,1016,18,30,0,-2859.63,-2907.96,33.1564,1.54551,'445:0 448:0 449:0 '),\n(447,'WL_hubC1',0,11,11,18,30,0,-3206.06,-2452.65,10.0327,5.76822,'445:0 448:0 455:0 461:0 462:0 '),\n(448,'Greenwarden',0,11,1025,18,30,0,-3254.89,-2726.4,9.41813,1.21683,'446:0 447:0 449:0 455:0 458:0 '),\n(449,'WL_hubE1',0,11,11,18,30,0,-3421.46,-3088.4,22.5006,4.5862,'446:0 448:0 450:0 451:0 455:0 456:0 '),\n(450,'RaptorRidge',0,11,1017,23,30,0,-3132.51,-3240.98,63.5747,2.76015,'449:0 451:0 '),\n(451,'DragonmawGates',0,11,1038,61,70,0,-3452,-3659.86,58.5533,1.08333,'449:0 450:0 452:0 '),\n(452,'DragonmawGatesI1',0,11,1038,61,70,0,-3594.66,-4056.85,113.625,1.23963,'451:0 453:0 '),\n(453,'DragonmawGatesI2',0,11,1038,61,70,0,-3956.61,-4019.52,170.857,6.00896,'452:0 454:0 '),\n(454,'DragonmawGatesI3',0,11,1037,61,70,0,-4145.01,-3662.88,204.651,5.17056,'92:0 453:0 '),\n(455,'WL_hubS1',0,11,1020,18,30,0,-3777.35,-2817.99,12.647,0.508038,'447:0 448:0 449:0 456:0 457:0 '),\n(456,'MosshideFen',0,11,1020,18,30,0,-3913.48,-3043.47,11.7092,0.398469,'449:0 455:0 457:0 '),\n(457,'ThelgenRock',0,11,1021,18,30,0,-3921.58,-2647.27,36.3203,4.94005,'455:0 456:0 479:0 '),\n(458,'AngerfangEnampmentE',0,11,1036,18,30,0,-3503.17,-2440.43,48.2306,5.48001,'448:0 459:0 '),\n(459,'AngerfangEnampmentW',0,11,1036,18,30,0,-3354.34,-2190.82,45.3521,1.88565,'458:0 460:0 461:0 '),\n(460,'AngerfangEnampmentTop',0,11,1036,18,30,0,-3458.4,-2008.76,119.804,5.31784,'459:0 '),\n(461,'WL_hubW1',0,11,11,18,30,0,-3186.98,-2117.49,15.8054,4.81126,'445:0 447:0 459:0 462:0 463:0 467:0 '),\n(462,'IronbeardsTomb',0,11,309,18,30,0,-2861.94,-2217.72,29.2628,4.06121,'445:0 447:0 461:0 463:0 464:0 '),\n(463,'MosshideWest',0,11,11,18,30,0,-2916.55,-1848.65,10.201,4.36986,'461:0 462:0 464:0 465:0 466:0 467:0 '),\n(464,'BaradinBayN',0,11,1023,18,30,0,-2598.33,-1745.42,10.159,4.05766,'462:0 463:0 465:0 466:0 '),\n(465,'BaradinBayNW',0,11,298,18,30,0,-2723.52,-1348.51,9.75282,4.1578,'464:0 463:0 466:0 474:0 '),\n(466,'BaradinBayW',0,11,1022,18,30,0,-2951.24,-1112.1,9.14625,2.36904,'464:0 463:0 465:0 474:0 475:0 476:0 '),\n(467,'WhelgarsOutside',0,11,1024,18,30,0,-3208.01,-1693.31,8.6748,4.04314,'461:0 463:0 468:0 473:0 474:0 '),\n(468,'WhelgarsEntrance',0,11,118,18,30,0,-3328.04,-1856.79,25.9266,3.14189,'467:0 469:0 470:0 '),\n(469,'WhelgarsBottom',0,11,118,18,30,0,-3540.59,-1803.75,24.3572,5.93869,'468:0 '),\n(470,'WhelgarsRamp',0,11,118,18,30,0,-3370.49,-1931.82,63.5201,0.805329,'468:0 471:0 '),\n(471,'WhelgarsRampTop',0,11,118,18,30,0,-3471.16,-1925.52,113.829,3.80162,'470:0 472:0 '),\n(472,'WhelgarsCave',0,11,118,18,30,0,-3569.75,-1976.96,117.678,0.449137,'471:0 '),\n(473,'BlueChannelMarsh',0,11,1018,18,30,0,-3582.96,-1324.33,9.39017,5.56012,'467:0 474:0 476:0 '),\n(474,'BluegillMarsh',0,11,1022,18,30,0,-3135.95,-1301.23,7.27194,1.32132,'465:0 466:0 467:0 473:0 475:0 476:0 '),\n(475,'BaradinBayS',0,11,298,18,30,0,-3202.27,-925.946,8.88303,5.67636,'466:0 474:0 476:0 '),\n(476,'MenethilHarborRoad',0,11,1022,18,30,2,-3333.27,-1053.79,8.28482,2.51317,'11:0 466:0 473:0 474:0 475:0 '),\n(477,'MenethilBayS',0,11,298,18,30,2,-3909.27,-638.054,4.91793,5.35238,'11:0 '),\n(478,'MenethilBayN',0,11,298,18,30,2,-3732.25,-581.622,4.65228,4.77512,'11:0 '),\n(479,'DunAlgazBottom',0,11,836,18,30,0,-4086.88,-2624.69,43.3702,1.60133,'457:0 480:0 '),\n(480,'DunAlgazMid1',0,11,836,18,30,0,-4092.37,-2403.53,100.01,4.74881,'479:0 481:0 '),\n(481,'DunAlgazMid2',0,11,836,18,30,0,-3994.82,-2377.44,120.415,3.60017,'480:0 482:0 '),\n(482,'DunAlgazMid3',0,11,836,18,30,0,-4070,-2464.84,155.161,3.20551,'481:0 483:0 '),\n(483,'DunAlgazMid4',0,11,836,18,30,0,-4418.61,-2470.44,212.203,0.00303268,'482:0 5:0 484:0 '),\n(484,'DunAlgazMid5',0,11,836,18,30,0,-4453.35,-2691.02,268.159,1.48548,'483:0 485:0 '),\n(485,'DunAlgazTop',0,38,837,8,20,0,-4741.84,-2699.03,325.269,6.26389,'484:0 91:0 487:0 488:0 '),\n(486,'NorthGatePassBottom',0,38,838,8,20,2,-4797.55,-2537.41,354.11,2.07534,'91:0 524:0 '),\n(487,'SilverStreamMine',0,38,149,8,20,2,-4801.44,-2968.22,321.735,1.63004,'91:0 485:0 488:0 '),\n(488,'StonewroughDamW',0,38,146,8,20,2,-4676.63,-3184.73,310.249,2.0836,'487:0 485:0 489:0 '),\n(489,'StonewroughDamC',0,38,146,8,20,2,-4761.78,-3306.52,310.258,4.81285,'488:0 490:0 '),\n(490,'StonewroughDamE',0,38,146,8,20,2,-4680.9,-3464.1,310.208,3.57506,'489:0 491:0 '),\n(491,'TheLochNE',0,38,38,8,20,2,-4859.79,-3631.09,306.481,2.35809,'490:0 492:0 495:0 496:0 497:0 '),\n(492,'MogroshStronghold',0,38,143,8,20,2,-4884.91,-3956.61,298.791,3.26837,'491:0 493:0 494:0 495:0 '),\n(493,'MogroshStrongholdTop',0,38,143,8,20,2,-4853.52,-4046.55,315.354,1.54756,'492:0 '),\n(494,'LochModanE',0,38,38,8,20,2,-5200.93,-4080.99,324.555,1.53421,'492:0 495:0 512:0 '),\n(495,'LochModanC2',0,38,38,8,20,2,-5358.15,-3755.11,304.073,5.92655,'491:0 492:0 494:0 496:0 506:0 512:0 '),\n(496,'LochIsleE',0,38,38,8,20,2,-4983.21,-3478.31,305.5,4.76612,'491:0 495:0 497:0 498:0 '),\n(497,'LochIsleW',0,38,38,8,20,2,-4869.1,-3302.75,307.516,3.90807,'491:0 496:0 498:0 '),\n(498,'LochIsleS',0,38,38,8,20,2,-5031.68,-3316.94,298.701,5.51616,'497:0 496:0 499:0 '),\n(499,'LochC1',0,38,556,8,20,2,-5138.3,-3125.08,302.046,2.10361,'498:0 502:0 '),\n(500,'LochW1',0,38,38,8,20,2,-5067.56,-2665.82,323.188,6.27801,'91:0 501:0 502:0 '),\n(501,'LochW2',0,38,38,8,20,2,-5383.73,-2741.02,362.182,0.255963,'500:0 502:0 503:0 '),\n(502,'LochW3',0,38,38,8,20,0,-5215.01,-2861.61,336.947,0.715418,'91:0 499:0 500:0 501:0 503:0 '),\n(503,'ThelsamarEntrance',0,38,38,8,20,0,-5405.86,-2884.97,342.8,0.491581,'501:0 502:0 19:0 504:0 515:0 '),\n(504,'LochC3',0,38,144,8,20,0,-5441.5,-3109.22,349.359,0.721317,'503:0 19:0 505:0 '),\n(505,'LochS',0,38,38,8,20,0,-5860.82,-3292.84,292.88,5.93047,'504:0 506:0 621:0 '),\n(506,'IronbandsExcavationOutside',0,38,142,8,20,2,-5617.55,-3680.57,313.913,2.11697,'495:0 505:0 507:0 509:0 '),\n(507,'IronbandsExcavationSW',0,38,142,8,20,2,-5787.94,-3777.91,328.169,4.57725,'506:0 508:0 510:0 '),\n(508,'IronbandsExcavationInside1',0,38,142,8,20,2,-5722.82,-3946.06,324.917,2.02667,'507:0 509:0 '),\n(509,'IronbandsExcavationInside2',0,38,142,8,20,2,-5578.49,-3926.28,327.498,1.64379,'506:0 508:0 '),\n(510,'LochCornerSE',0,38,147,8,20,2,-5843.55,-4145.23,387.605,1.3532,'507:0 511:0 512:0 '),\n(511,'FastriderLodgeEntrance',0,38,147,8,20,2,-5555.41,-4251.75,380.644,2.87687,'510:0 512:0 513:0 '),\n(512,'LochModanSE',0,38,147,8,20,2,-5553.71,-4104.44,372.683,1.01823,'494:0 495:0 510:0 511:0 '),\n(513,'FarstriderLodge',0,38,147,8,20,2,-5621.61,-4334.97,403.763,0.951478,'511:0 514:0 '),\n(514,'FarstriderLodgeInside',0,38,147,8,20,3,-5674.26,-4247.48,407.006,5.29276,'513:0 '),\n(515,'LochModanSW1',0,38,38,8,20,2,-5673.4,-2775.82,363.022,5.89359,'503:0 516:0 519:0 '),\n(516,'StonesplinterValley1',0,38,923,8,20,2,-5878.01,-2909.13,366.788,0.558766,'515:0 517:0 518:0 '),\n(517,'StonesplinterValley2',0,38,923,8,20,2,-6057.08,-3024.86,403.365,0.541086,'516:0 '),\n(518,'StonesplinterValley3',0,38,923,8,20,2,-6077.12,-2770.04,413.566,5.71294,'516:0 '),\n(519,'LochModanSW2',0,38,924,8,20,2,-5804.6,-2605.8,316.201,6.15474,'515:0 520:0 521:0 '),\n(520,'LochModanSW3',0,38,924,8,20,2,-6029.33,-2496.11,310.016,2.1924,'519:0 561:0 '),\n(521,'SouthGatePassBottom',0,38,839,8,20,2,-5690.63,-2589.07,346.087,0.415367,'519:0 522:0 '),\n(522,'SouthGateOutpost',0,1,806,1,10,0,-5520.09,-2399.78,400.417,2.27487,'521:0 523:0 '),\n(523,'SouthGatePassTop',0,1,805,1,10,2,-5636.7,-2242.95,424.761,5.34381,'522:0 527:0 69:0 '),\n(524,'NorthGatePassTop1',0,1,808,1,10,2,-4911.88,-2330.69,408.794,5.22601,'486:0 525:0 '),\n(525,'NorthGatePassBottom2',0,1,808,1,10,2,-5204.26,-2288.4,400.984,2.97781,'524:0 526:0 '),\n(526,'NorthGatePassTop2',0,1,807,1,10,2,-5294.53,-2180,423.003,2.8011,'525:0 527:0 '),\n(527,'DunMoroghPassFork',0,1,1,1,10,2,-5515.28,-2008.17,399.376,4.60752,'526:0 523:0 528:0 '),\n(528,'DunMoroghE1',0,1,1,1,10,2,-5509.11,-1798.18,397.338,5.99176,'527:0 69:0 529:0 '),\n(529,'GolBolarFork',0,1,1,1,10,2,-5611.84,-1487.57,399.057,5.05517,'528:0 530:0 533:0 '),\n(530,'GolBolarCamp',0,1,134,1,10,2,-5711.36,-1562.28,383.568,2.84075,'529:0 531:0 '),\n(531,'GolBolarQuarry1',0,1,134,1,10,2,-5849.25,-1514.03,358.812,5.96152,'530:0 532:0 '),\n(532,'GolBolarQuarry2',0,1,134,1,10,2,-5737.17,-1683.52,362.196,6.04595,'531:0 '),\n(533,'TundridHills',0,1,804,1,10,2,-5651.13,-1033.73,410.816,4.75985,'529:0 534:0 536:0 556:0 '),\n(534,'Vagash1',0,1,1,1,10,2,-5422.73,-1195.14,450.063,2.06791,'533:0 535:0 '),\n(535,'Vagash2',0,1,803,1,10,2,-5417.7,-1264.17,446.78,2.22146,'534:0 '),\n(536,'DunMoroghS1',0,1,1,1,10,2,-5892.71,-628.276,400.121,5.26175,'533:0 537:0 '),\n(537,'DwarfGnomeStartExit1',0,1,1,1,10,2,-5975.18,-476.82,406.774,5.36188,'536:0 9:0 538:0 '),\n(538,'DwarfGnomeStartExit2',0,1,1,1,10,2,-6013.25,-224.693,412.196,4.79638,'537:0 539:0 '),\n(539,'DwarfGnomeStartExit3',0,1,800,1,10,2,-5890.34,69.4737,372.157,4.07706,'538:0 540:0 545:0 546:0 '),\n(540,'ColdridgePass1',0,1,800,1,10,2,-6066.08,42.2314,408.342,0.120498,'539:0 541:0 '),\n(541,'ColdridgePass2',0,1,800,4,10,2,-6231.65,125.6,430.753,5.63871,'540:0 542:0 '),\n(542,'DwarfGnomeStart1',0,1,132,1,10,3,-6261.08,369.552,383.537,4.94484,'541:0 1:0 543:0 544:0 '),\n(543,'DwarfGnomeStart2',0,1,132,1,10,2,-6482.65,496.244,386.328,5.80485,'542:0 544:0 '),\n(544,'DwarfGnomeStart3',0,1,132,1,10,2,-6269.69,741.137,386.893,4.77403,'542:0 543:0 '),\n(545,'GrizzledDen',0,1,136,1,10,2,-5690.95,-281.229,364.314,5.54297,'539:0 9:0 '),\n(546,'DunMoroghSW1',0,1,1,1,10,2,-5756.39,127.948,368.817,4.07511,'539:0 547:0 548:0 '),\n(547,'OldIcebeard',0,1,801,1,10,2,-5602.44,-28.5472,416.22,2.31387,'546:0 '),\n(548,'DunMoroghW1',0,1,135,1,10,2,-5661.62,365.277,393.274,4.27146,'546:0 549:0 550:0 551:0 '),\n(549,'FrostmaneHold',0,1,135,1,10,2,-5549.4,568.067,394.761,1.30462,'548:0 551:0 '),\n(550,'GnomereganS',0,1,133,1,10,2,-5183.81,585.068,404.291,4.35,'548:0 551:0 '),\n(551,'IceflowLake',0,1,211,1,10,2,-5250.86,115.774,394.041,2.85773,'548:0 549:0 550:0 552:0 555:0 '),\n(552,'ShimmerRidge1',0,1,802,1,10,2,-5266.4,-149.752,437.903,6.01894,'551:0 553:0 '),\n(553,'ShimmerRidge2',0,1,802,1,10,2,-5088.11,-166.104,442.035,0.727311,'552:0 554:0 555:0 '),\n(554,'ShimmerRidge3',0,1,802,1,10,2,-5043,-267.85,441.4,2.19994,'553:0 '),\n(555,'ShimmerRidge4',0,1,802,1,10,2,-5021.64,-132.237,411.899,3.77858,'553:0 551:0 '),\n(556,'DunmoroghC1',0,1,1,1,10,2,-5391.34,-928.482,393.467,4.06525,'533:0 557:0 '),\n(557,'IronforgeRamp',0,1,1,1,10,2,-5259.37,-493.579,386.436,3.14828,'556:0 9:0 558:0 '),\n(558,'IronforgeRampMid',0,1,809,1,10,2,-5197.66,-730.697,445.722,5.89324,'557:0 559:0 '),\n(559,'IronforgeRampTop',0,1,809,1,10,2,-5060.46,-745.984,480.27,3.47972,'558:0 8:0 '),\n(560,'IronforgeBank',0,1537,1537,1,60,3,-4909.88,-969.761,501.463,5.46481,'8:0 '),\n(561,'SGgate',0,51,1959,43,54,0,-6413.58,-2007.56,244.634,2.74852,'520:0 562:0 563:0 '),\n(562,'DustfireValleyMid',0,51,1959,43,54,0,-6590.48,-1884.27,245.713,1.74321,'561:0 580:0 585:0 '),\n(563,'SGexitE',0,51,51,43,54,0,-6906.38,-1818.59,241.661,5.89992,'561:0 564:0 566:0 593:0 '),\n(564,'GrimesiltDigSite',0,51,247,43,54,0,-7019.65,-1698.57,241.667,5.46992,'563:0 565:0 566:0 567:0 568:0 '),\n(565,'TannerCamp',0,51,1958,43,54,0,-7225.75,-1752.49,244.286,0.924438,'564:0 566:0 567:0 568:0 '),\n(566,'SGtower4',0,51,1444,43,54,0,-6980,-1505.92,242.742,3.93841,'563:0 564:0 565:0 567:0 568:0 '),\n(567,'SGtower3',0,51,1444,43,54,0,-7036.7,-1320.2,244.272,4.7631,'565:0 564:0 566:0 568:0 '),\n(568,'SGsouth1',0,51,1444,43,54,0,-7155.86,-1317.76,242.155,5.03211,'565:0 569:0 567:0 564:0 566:0 '),\n(569,'BRM_SG1',0,51,1445,43,54,0,-7215.95,-1057.94,242.73,1.72755,'571:0 568:0 570:0 572:0 573:0 '),\n(570,'BRM_SG2',0,25,25,46,60,0,-7399.25,-1106.95,278.077,0.229401,'569:0 622:0 '),\n(571,'SGwest1',0,51,51,43,54,0,-7085,-941.753,268.272,4.123,'569:0 572:0 573:0 '),\n(572,'SGtower2',0,51,51,43,54,0,-7001.07,-1109.84,243.97,2.78587,'571:0 569:0 573:0 '),\n(573,'SGwest2',0,51,51,43,54,0,-6974.99,-1007.32,241.667,3.29324,'571:0 569:0 572:0 574:0 588:0 '),\n(574,'CauldronRampTop',0,51,246,43,54,0,-6974.25,-1172.02,228.781,3.87051,'573:0 575:0 '),\n(575,'CauldronRampMid1',0,51,246,43,54,0,-7024.61,-1220.88,207.974,5.71816,'574:0 576:0 '),\n(576,'CauldronRampMid2',0,51,246,43,54,0,-6955.19,-1270.62,180.686,0.528642,'575:0 577:0 581:0 '),\n(577,'CauldronRampBottom',0,51,246,43,54,0,-6866.28,-1410.17,172.855,2.20156,'576:0 578:0 '),\n(578,'CauldronRamp2Bottom',0,51,246,43,54,0,-6712.76,-1610.77,196.339,2.17329,'577:0 579:0 '),\n(579,'CauldronRamp2Mid',0,51,246,43,54,0,-6668.28,-1664.76,229.053,1.92432,'578:0 580:0 '),\n(580,'CauldronRamp2Top',0,51,246,43,54,0,-6680,-1730.07,255.913,4.54363,'562:0 579:0 '),\n(581,'SlagPit1',0,51,1443,43,54,0,-6850.01,-1218.8,177.395,3.61294,'576:0 582:0 '),\n(582,'SlagPit2',0,51,1443,43,54,0,-6764.59,-1174.15,187.213,1.12951,'581:0 583:0 '),\n(583,'SlagPit3',0,51,1443,43,54,0,-6439.47,-1311.02,180.938,2.63197,'582:0 584:0 '),\n(584,'SlagPit4',0,51,1443,43,54,0,-6631.29,-1289.33,208.714,0.00481129,'583:0 '),\n(585,'SG_hubN1',0,51,51,43,54,0,-6686.77,-1347.22,247.961,4.79378,'562:0 586:0 588:0 589:0 '),\n(586,'CauldronTopN',0,51,246,43,54,0,-6862.1,-1188.37,240.366,5.51045,'585:0 '),\n(587,'FirewatchRidgeBottom',0,51,1442,43,54,0,-6612.66,-860.886,244.297,0.237204,'588:0 589:0 591:0 '),\n(588,'FirewatchRidgeS',0,51,1442,43,54,0,-6817.17,-866.771,248.462,4.87941,'573:0 585:0 587:0 '),\n(589,'ThoriumPointRampBottom',0,51,1442,43,54,0,-6608.41,-1025.59,244.328,1.21161,'587:0 585:0 590:0 '),\n(590,'ThoriumPointRampTop',0,51,1446,43,54,1,-6473.64,-1104.63,303.285,2.64303,'589:0 180:0 '),\n(591,'FirewatchRidgeTop1',0,51,1442,43,54,0,-6473.38,-887.709,324.088,3.80543,'587:0 592:0 '),\n(592,'FirewatchRidgeTop2',0,51,1442,43,54,0,-6502.46,-1018.74,344.372,1.2407,'591:0 '),\n(593,'SGexitEmid',0,51,51,43,54,0,-6952.2,-2064.74,282.478,5.11429,'563:0 594:0 '),\n(594,'BLexitW',0,3,3,33,45,0,-6885.86,-2233.35,242.64,0.361067,'593:0 595:0 24:0 '),\n(595,'ApocryphansRest',0,3,337,33,45,0,-6892.26,-2477.47,247.238,1.71982,'594:0 87:0 596:0 597:0 600:0 601:0 602:0 '),\n(596,'CampCaggS',0,3,344,33,45,0,-7270.91,-2407.34,268.195,5.1163,'595:0 597:0 '),\n(597,'CampCaggE',0,3,3,33,45,0,-7140.34,-2650.51,243.568,0.467924,'595:0 596:0 602:0 603:0 '),\n(598,'KargathE',0,3,3,33,45,0,-6600.53,-2373.56,254.037,0.026153,'600:0 599:0 24:0 '),\n(599,'KargathNE',0,3,3,33,45,0,-6431.02,-2454.24,321.326,3.51922,'598:0 600:0 '),\n(600,'DustbowlW',0,3,1878,33,45,0,-6718.55,-2572.24,241.801,0.471881,'595:0 598:0 599:0 601:0 602:0 '),\n(601,'DustbowlNE',0,3,1878,33,45,0,-6653.03,-2889.09,241.667,2.73974,'595:0 600:0 602:0 620:0 '),\n(602,'BL_hubC',0,3,1879,33,45,0,-6902.56,-2958.24,244.772,1.67356,'600:0 597:0 601:0 595:0 608:0 603:0 '),\n(603,'AgmondsendS',0,3,345,33,45,0,-7141.97,-3251.77,246.326,0.774282,'597:0 602:0 604:0 605:0 607:0 '),\n(604,'BL_elemsS',0,3,3,33,45,0,-7319.09,-3144.54,317.901,5.93436,'603:0 '),\n(605,'AgmondsEnd',0,3,345,33,45,0,-7033.01,-3313.39,238.277,2.5061,'603:0 606:0 607:0 609:0 '),\n(606,'BL_elemsSE',0,3,3,33,45,0,-7339.37,-3450.9,320.961,0.385524,'605:0 '),\n(607,'CampBoff',0,3,342,33,45,0,-7039.11,-3655.92,244.152,1.66966,'603:0 605:0 608:0 609:0 '),\n(608,'BL_hubN1',0,3,1877,33,45,0,-6667.51,-3285.91,241.069,2.14484,'25:0 602:0 607:0 609:0 620:0 '),\n(609,'BL_hubNE1',0,3,1898,33,45,0,-6775.23,-3555.53,245.004,5.79028,'605:0 607:0 608:0 610:0 617:0 620:0 '),\n(610,'LethlorRavineEntranceS',0,3,339,38,45,0,-6742.54,-3895.6,264.574,1.61394,'609:0 611:0 '),\n(611,'LethlorRavineS',0,3,339,38,45,0,-7002.17,-3938.58,263.889,5.47219,'610:0 612:0 '),\n(612,'LethlorRavineC',0,3,339,38,45,0,-6820.98,-4135.08,263.933,2.32276,'611:0 613:0 '),\n(613,'LethlorRavineN',0,3,339,38,45,0,-6424.74,-4106.41,263.889,3.0143,'612:0 614:0 '),\n(614,'LethlorRavineNW',0,3,339,38,45,0,-6513.4,-4004.6,264.394,5.30492,'613:0 615:0 '),\n(615,'LethlorRavineEntranceN',0,3,339,38,45,0,-6396.09,-3976.18,268.618,3.37284,'614:0 616:0 '),\n(616,'LethlorRavineExitN',0,3,1898,38,45,0,-6467.07,-3837.32,315.608,5.41801,'615:0 617:0 '),\n(617,'CampKoshS',0,3,1898,33,45,0,-6360.66,-3685.6,245.154,4.17511,'616:0 609:0 618:0 619:0 '),\n(618,'CampKosh',0,3,341,33,45,0,-6249.45,-3750.01,243.041,2.72409,'617:0 619:0 '),\n(619,'HammertoesDigsite',0,3,346,33,45,0,-6349.91,-3447.28,241.681,0.369852,'617:0 618:0 620:0 621:0 '),\n(620,'BL_hubN2',0,3,338,33,45,0,-6494.59,-3248.21,242.617,1.06886,'25:0 601:0 608:0 609:0 619:0 '),\n(621,'MakersTerrace',0,3,1897,33,45,0,-6056.99,-3302.11,258.645,3.45646,'86:0 505:0 619:0 '),\n(622,'BRM_SG3',0,25,25,46,60,0,-7496.19,-1063.83,264.543,4.72301,'570:0 623:0 628:0 '),\n(623,'BRM_chain1',0,25,25,46,60,0,-7501.48,-1151.43,269.644,1.34305,'622:0 624:0 627:0 '),\n(624,'BRM_chain2',0,25,25,46,60,0,-7599.78,-1110.62,249.93,1.94977,'623:0 625:0 '),\n(625,'BRM_chain3',0,25,25,46,60,0,-7523.43,-1048.09,180.912,0.471264,'624:0 626:0 '),\n(626,'BRM_chain4',0,25,25,46,60,0,-7383.99,-1012.09,173.658,3.00809,'625:0 '),\n(627,'BRM_BRS1',0,25,25,46,60,0,-7609.9,-1226.43,233.401,0.518375,'623:0 628:0 '),\n(628,'BRM_BS1',0,25,25,46,60,0,-7697.61,-1089.8,217.609,3.00611,'627:0 622:0 629:0 '),\n(629,'BRM_BS2',0,25,25,46,60,0,-7769.06,-1129.81,215.084,0.38328,'628:0 630:0 '),\n(630,'BRM_BS3',0,25,25,46,60,0,-7993.75,-1138.96,163.061,0.128021,'629:0 631:0 637:0 639:0 641:0 '),\n(631,'DracodarNW',0,46,2421,48,56,0,-7968.74,-817.038,131.202,4.58672,'630:0 632:0 636:0 '),\n(632,'AltarOfStormsRoad',0,46,46,48,56,0,-7803.25,-717,176.761,6.28318,'631:0 633:0 '),\n(633,'AltarOfStormsFork',0,46,255,48,56,0,-7679.67,-712.976,183.628,3.3461,'632:0 634:0 635:0 '),\n(634,'AltarOfStormsVendor',0,46,255,48,56,0,-7644.75,-636.535,200.452,4.00749,'633:0 '),\n(635,'AltarOfStorms',0,46,255,48,56,0,-7586.74,-773.071,190.859,2.70569,'633:0 '),\n(636,'DracodarW',0,46,2421,48,56,0,-8170.67,-727.141,135.21,5.81979,'631:0 637:0 '),\n(637,'DracodarS',0,46,2421,48,56,0,-8255.07,-1040.7,147.3,0.143321,'630:0 636:0 638:0 639:0 '),\n(638,'DracodarS_hill1',0,46,2421,48,56,0,-8419.15,-933.413,214.705,5.70788,'637:0 '),\n(639,'DracodarSE',0,46,46,48,56,0,-8254.03,-1168.68,144.64,0.0510463,'630:0 637:0 640:0 641:0 '),\n(640,'DracodarS_hill2',0,46,46,48,56,0,-8431.62,-1227.92,207.816,0.498725,'639:0 '),\n(641,'DracodarHub',0,46,46,48,56,0,-8073.86,-1401.78,132.05,4.03301,'630:0 639:0 642:0 644:0 645:0 '),\n(642,'BlackrockStrongholdOutside',0,46,46,48,56,0,-7757.29,-1591.7,133.263,1.43923,'641:0 643:0 644:0 646:0 '),\n(643,'BlackrockStrongholdInside',0,46,252,48,56,0,-7698.11,-1443.02,139.787,4.00159,'642:0 '),\n(644,'PillarOfAshS',0,46,46,48,56,0,-8232.79,-1737.58,147.888,6.17911,'641:0 642:0 645:0 658:0 '),\n(645,'PillarOfAshE',0,46,253,48,56,0,-8102.12,-1922.65,134.695,1.31201,'641:0 644:0 646:0 647:0 658:0 '),\n(646,'ThaurissanNW',0,46,250,48,56,0,-7704.8,-2045.32,133.437,1.61634,'642:0 645:0 139:0 647:0 648:0 '),\n(647,'DreadmaulRockW',0,46,249,48,56,0,-7971.45,-2449.46,130.882,1.47692,'646:0 645:0 648:0 652:0 654:0 658:0 659:0 660:0 '),\n(648,'DreadmaulRockNW',0,46,249,48,56,0,-7665.96,-2453.95,147.044,2.94798,'647:0 646:0 138:0 649:0 654:0 '),\n(649,'DreadmaulRockNE',0,46,249,48,56,0,-7765.85,-2707.5,172.836,1.14313,'648:0 650:0 655:0 '),\n(650,'DreadmaulRockSE',0,46,2420,48,56,0,-8161.75,-2869.02,134.8,0.000368118,'649:0 138:0 651:0 652:0 659:0 '),\n(651,'MorgansVigil',0,46,2418,48,56,0,-8379.57,-2741.96,186.492,6.13436,'650:0 652:0 659:0 '),\n(652,'DreadmaulRockTop1',0,46,249,48,56,0,-7971.64,-2664.1,198.213,2.32517,'647:0 650:0 651:0 138:0 653:0 '),\n(653,'DreadmaulRockTop2',0,46,249,48,56,0,-7873.63,-2613.13,221.072,2.92403,'652:0 '),\n(654,'DreadmaulRockNWW',0,46,249,48,56,0,-7776.13,-2493.23,160.084,5.03518,'648:0 647:0 '),\n(655,'DreadmaulRockInside1',0,46,249,48,56,0,-7848.98,-2661.75,172.955,1.73534,'649:0 656:0 657:0 '),\n(656,'DreadmaulRockInside2',0,46,249,48,56,0,-7961.48,-2603.36,173.834,6.08133,'655:0 '),\n(657,'DreadmaulRockInside3',0,46,249,48,56,0,-7975.04,-2695.45,157.958,5.80842,'655:0 '),\n(658,'DreadmaulPassW',0,46,46,48,56,0,-8216.14,-2308.1,151.442,1.03911,'644:0 645:0 647:0 659:0 '),\n(659,'DreadmaulPassN',0,46,46,48,56,0,-8150.16,-2629.44,133.659,1.18246,'647:0 650:0 651:0 658:0 660:0 '),\n(660,'DreadmaulPass',0,46,2417,48,56,0,-8431.68,-2546.4,133.207,6.07628,'647:0 659:0 661:0 '),\n(661,'RedridgeExitN',0,44,44,13,25,0,-8900,-2574.56,131.851,0.152413,'660:0 75:0 663:0 '),\n(662,'RendersRockInside',0,44,998,13,25,0,-8738.68,-2205.37,149.754,2.59501,'75:0 '),\n(663,'AlthersMillEntrance',0,44,97,13,25,0,-9153.73,-2628.6,109.561,0.156359,'661:0 664:0 690:0 '),\n(664,'RedridgeHub1',0,44,44,13,25,0,-9099.79,-2451.23,120.464,0.197585,'663:0 665:0 667:0 669:0 '),\n(665,'RedridgeBridgeN',0,44,69,13,25,2,-9287.68,-2284.47,67.5443,5.81789,'664:0 10:0 672:0 673:0 '),\n(666,'RedridgeW',0,44,44,13,25,2,-9312.11,-1873.26,82.1473,5.08747,'10:0 672:0 '),\n(667,'RedridgeCanyons1',0,44,95,13,25,2,-8916.14,-2305.07,134.682,3.96044,'664:0 668:0 670:0 '),\n(668,'RedridgeCanyons2',0,44,95,13,25,2,-8864.57,-2150.9,133.327,3.71892,'667:0 669:0 670:0 '),\n(669,'RedridgeCanyons3',0,44,69,13,25,2,-9145.97,-2198.54,119.516,4.7478,'668:0 664:0 670:0 '),\n(670,'RedridgeCanyons4',0,44,95,13,25,2,-9135.91,-2029.37,127.775,5.01877,'667:0 668:0 669:0 77:0 '),\n(671,'RethbanCavernsInside',0,44,98,13,25,0,-8826.83,-1947.01,133.091,2.11555,'77:0 '),\n(672,'RedridgeBridgeS',0,44,44,13,25,2,-9503.49,-2289.12,74.7234,1.13183,'665:0 666:0 674:0 675:0 '),\n(673,'EverstillN',0,44,68,13,25,2,-9263.45,-2458.04,56.1636,1.20646,'665:0 '),\n(674,'ThreeCorners',0,44,1002,13,25,0,-9607.09,-2055.97,65.077,4.99696,'672:0 675:0 692:0 693:0 694:0 '),\n(675,'RedridgeS1',0,44,1001,13,25,0,-9713.82,-2284.16,63.9369,5.46531,'672:0 674:0 676:0 677:0 '),\n(676,'RedridgeS2',0,44,68,13,25,0,-9620.32,-2514.61,59.4453,0.974015,'675:0 677:0 '),\n(677,'RedridgeS3',0,44,1001,13,25,0,-9624.96,-2717.09,56.3955,1.53951,'676:0 675:0 678:0 679:0 691:0 '),\n(678,'StonewatchS',0,44,70,18,25,0,-9468.55,-3007.78,135.551,1.52185,'677:0 689:0 '),\n(679,'RedridgeS4',0,44,997,13,25,0,-9751.37,-3185.18,58.6091,5.63735,'677:0 680:0 681:0 '),\n(680,'RedridgeE1',0,44,997,13,25,0,-9611,-3315.1,49.8404,2.09716,'679:0 681:0 682:0 683:0 684:0 '),\n(681,'RedridgeE2',0,44,71,13,25,0,-9499.43,-3249.9,50.6,3.02197,'679:0 680:0 '),\n(682,'RedridgeE3',0,44,44,18,25,0,-9598.71,-3503.57,121.964,2.30923,'680:0 683:0 '),\n(683,'RedridgeE4',0,44,71,18,25,0,-9465.03,-3460.8,116.076,2.91242,'680:0 682:0 74:0 684:0 '),\n(684,'RedridgeE5',0,44,71,18,25,0,-9469.61,-3328.04,5.51622,4.94268,'680:0 683:0 '),\n(685,'RedridgeNE',0,44,1000,18,25,0,-9116.4,-3271.35,104.33,2.00332,'74:0 686:0 687:0 '),\n(686,'RedridgeE6',0,44,1000,18,25,0,-9317.33,-3210.41,107.191,5.54352,'685:0 74:0 687:0 '),\n(687,'StonewatchFork',0,44,70,18,25,0,-9195.1,-3020.88,94.6252,4.57746,'686:0 685:0 688:0 689:0 690:0 '),\n(688,'StonewatchTower',0,44,999,18,25,0,-9297.56,-2958.62,128.754,5.64364,'687:0 689:0 '),\n(689,'StonewatchTop',0,44,2099,18,25,0,-9364.92,-3072.52,164.756,3.2698,'687:0 688:0 678:0 '),\n(690,'AlthersMillCenter',0,44,97,13,25,0,-9215.61,-2770.74,89.3399,4.66193,'687:0 663:0 '),\n(691,'EverstillE',0,44,44,13,25,0,-9457.68,-2870.36,85.486,2.24488,'677:0 '),\n(692,'ThreeCornersCamp1',0,44,1002,13,25,0,-9472.89,-1956.22,83.561,4.19346,'674:0 693:0 694:0 '),\n(693,'RedridgeExitW1',0,44,1002,13,25,2,-9620.34,-1809.71,51.8565,1.49408,'692:0 674:0 694:0 696:0 '),\n(694,'RedridgeExitW2',0,44,1002,13,25,0,-9831.1,-1766.69,23.8242,2.51983,'692:0 674:0 693:0 695:0 792:0 '),\n(695,'ElwynnHubS1',0,12,798,1,10,2,-9928.36,-1115.12,24.1788,6.21189,'705:0 704:0 694:0 696:0 706:0 '),\n(696,'ElwynnHubE1',0,12,12,1,10,2,-9659.48,-1341.54,48.8561,4.72993,'693:0 697:0 698:0 704:0 695:0 '),\n(697,'EastvaleLC1',0,12,88,1,10,2,-9405,-1343.43,50.0284,2.89799,'696:0 698:0 699:0 '),\n(698,'StoneCairnLakeSE',0,12,86,1,10,2,-9299.52,-1180.36,69.4951,3.31622,'696:0 697:0 699:0 701:0 797:0 '),\n(699,'StoneCairnLakeNE',0,12,86,1,10,2,-8956.22,-1264.96,77.7779,2.94511,'700:0 697:0 698:0 797:0 '),\n(700,'StoneCairnLakeNW',0,12,86,1,10,2,-8860.62,-826.796,71.9141,4.57088,'699:0 701:0 797:0 '),\n(701,'StoneCairnLakeSW',0,12,12,1,10,2,-9355.59,-802.598,64.4981,0.692979,'89:0 700:0 708:0 698:0 705:0 706:0 707:0 797:0 '),\n(702,'JasperlodeMineInside1',0,12,54,1,10,2,-9125.33,-585.357,58.3507,3.90606,'89:0 703:0 '),\n(703,'JasperlodeMineInside2',0,12,54,1,10,2,-9049.44,-618.138,53.1456,4.05725,'702:0 '),\n(704,'ElwynnHubE2',0,12,12,1,10,2,-9613.79,-1100.85,40.5009,4.62273,'696:0 705:0 695:0 '),\n(705,'ElwynnHubE3',0,12,12,1,10,2,-9618.95,-1024.81,40.4731,4.99973,'704:0 695:0 701:0 706:0 707:0 '),\n(706,'BrackwellPumpkinPatch',0,12,62,1,10,2,-9777.88,-877.924,39.5328,5.4101,'705:0 701:0 695:0 707:0 '),\n(707,'ElwynnHubC1',0,12,12,1,10,2,-9609.57,-527.364,55.1285,4.48725,'89:0 708:0 701:0 705:0 706:0 716:0 '),\n(708,'CrystalLakeE',0,12,18,1,10,2,-9464.16,-422.645,58.9952,3.63313,'89:0 701:0 707:0 709:0 '),\n(709,'CrystalLakeW',0,12,18,1,10,2,-9470.07,-173.045,59.9322,4.58858,'708:0 710:0 7:0 '),\n(710,'NorthshireExit',0,12,12,1,10,2,-9133.8,-66.2742,82.4151,1.35237,'709:0 16:0 13:0 7:0 '),\n(711,'EchoRidgeMineInside',0,12,34,1,10,2,-8560.22,-214.447,85.0045,2.95145,'70:0 '),\n(712,'TradeDistrict',0,1519,1519,1,60,3,-8794.44,645.505,94.4595,3.54245,'16:0 '),\n(713,'ForestsEdgeS',0,12,60,1,10,2,-10070.2,658.114,37.3319,5.88491,'72:0 88:0 717:0 '),\n(714,'FargodeepMineOutside',0,12,57,1,10,2,-9868.23,221.066,14.0194,6.19474,'7:0 71:0 72:0 715:0 '),\n(715,'FargodeepMineInside',0,12,57,1,10,2,-9779.25,104.966,4.57989,3.01191,'714:0 '),\n(716,'ElwynnHubS2',0,12,12,1,10,2,-9808.32,-269.092,40.0067,5.15408,'71:0 707:0 '),\n(717,'ElwynnExitW',0,12,60,1,10,2,-9747.07,741.601,25.5892,4.55914,'7:0 88:0 72:0 713:0 718:0 '),\n(718,'WestfallExitNE',0,40,916,8,20,2,-9853.3,918.261,30.2216,5.34454,'717:0 719:0 745:0 746:0 '),\n(719,'Longshore1',0,40,2,8,20,2,-9616.19,1059.16,5.79699,0.013632,'720:0 718:0 745:0 '),\n(720,'Longshore2',0,40,2,8,20,2,-9634.2,1389.29,9.09694,4.71817,'719:0 721:0 '),\n(721,'Longshore3',0,40,2,8,20,2,-9648.12,1575.23,3.54258,4.75547,'720:0 722:0 '),\n(722,'Longshore4',0,40,2,8,20,2,-9776.1,1654.24,11.5179,2.15188,'721:0 723:0 742:0 743:0 '),\n(723,'Longshore5',0,40,2,8,20,2,-9985.75,1913.6,4.86301,5.35756,'722:0 724:0 742:0 '),\n(724,'Longshore6',0,40,2,8,20,2,-10334,2061.94,3.69692,5.05125,'723:0 725:0 739:0 '),\n(725,'Longshore7',0,40,2,8,20,2,-10695.4,2102.07,8.28685,6.14098,'724:0 726:0 738:0 '),\n(726,'Longshore8',0,40,2,8,20,2,-10975.2,2108.77,-0.213533,6.27058,'725:0 727:0 737:0 '),\n(727,'Longshore9',0,40,2,8,20,2,-11307.8,1926.18,9.26031,4.25015,'726:0 728:0 '),\n(728,'Longshore10',0,40,2,8,20,2,-11466.2,1725.82,8.61195,0.641238,'727:0 729:0 '),\n(729,'DaggerHillsW',0,40,920,8,20,2,-11264.1,1714.56,39.9062,4.76851,'728:0 730:0 737:0 '),\n(730,'DaggerHillsC1',0,40,920,8,20,2,-11258.8,1470.77,88.9353,4.93148,'729:0 731:0 '),\n(731,'DaggerHillsC2',0,40,920,8,20,2,-11211.1,1297.89,91.1699,1.90966,'730:0 732:0 733:0 '),\n(732,'DaggerHillsNook',0,40,920,8,20,2,-11235.2,1182.36,91.6522,1.1871,'731:0 733:0 '),\n(733,'DaggerHillsE',0,40,920,8,20,2,-11062.7,1163.02,43.0261,2.75789,'736:0 732:0 731:0 734:0 735:0 750:0 '),\n(734,'DustPlains',0,40,922,8,20,2,-11152,739.176,32.5228,1.40505,'733:0 735:0 750:0 '),\n(735,'DeadAcre',0,40,917,8,20,2,-10770.8,864.294,33.1505,2.913,'736:0 733:0 734:0 746:0 750:0 '),\n(736,'WestfallHubC1',0,40,40,8,20,2,-10842.5,1196.94,34.875,1.14192,'12:0 15:0 735:0 733:0 738:0 741:0 750:0 '),\n(737,'DemontsPlace',0,40,921,8,20,2,-11087.9,1894.97,35.4372,5.06105,'726:0 729:0 12:0 738:0 '),\n(738,'AlexstonFarmstead',0,40,219,8,20,2,-10615,1671.77,41.41,4.1441,'737:0 725:0 12:0 741:0 742:0 736:0 '),\n(739,'GoldCoastQuarry',0,40,113,8,20,2,-10403.7,1909.99,9.96272,4.64675,'724:0 740:0 741:0 '),\n(740,'GoldCoastQuarryInside',0,40,113,8,20,2,-10575.3,1990.25,-8.03668,3.01509,'739:0 '),\n(741,'WestfallHubC2',0,40,40,8,20,2,-10495.4,1349.24,42.6842,1.76042,'738:0 739:0 15:0 742:0 745:0 736:0 '),\n(742,'WestfallHubC3',0,40,918,8,20,2,-10274.9,1408.84,38.9079,3.90454,'741:0 738:0 723:0 722:0 15:0 743:0 745:0 '),\n(743,'JangolodeMine',0,40,111,8,20,2,-10017,1466.37,41.0745,6.08639,'742:0 722:0 744:0 745:0 '),\n(744,'JangolodeMineInside',0,40,111,8,20,2,-9887.11,1427.15,40.0346,0.896887,'743:0 '),\n(745,'SaldeansFarm',0,40,107,8,20,2,-10154.1,1116.55,36.8816,1.65283,'15:0 718:0 719:0 741:0 742:0 743:0 746:0 '),\n(746,'WestfallHubE1',0,40,40,8,20,2,-10333.7,859.579,39.774,0.563072,'15:0 718:0 735:0 745:0 752:0 '),\n(747,'DefiasHideout',0,1581,1581,15,22,2,-11112,1483.69,32.39,3.56723,'12:0 748:0 '),\n(748,'Deadmines1',0,1581,1581,15,22,2,-11252.8,1533.82,28.6803,0.814416,'747:0 749:0 '),\n(749,'Deadmines2',0,1581,1581,15,22,2,-11214.4,1638.37,27.2613,1.55073,'748:0 '),\n(750,'WestfallExitSE',0,40,40,8,20,2,-10870.3,667.353,30.8385,4.48578,'733:0 734:0 735:0 736:0 15:0 751:0 '),\n(751,'DuskwoodExitW',0,10,10,18,30,0,-10857.5,557.367,30.4883,6.27453,'750:0 752:0 14:0 753:0 755:0 '),\n(752,'HushedBankN',0,10,1097,18,30,0,-10326.3,623.959,26.42,3.17024,'746:0 751:0 757:0 758:0 763:0 '),\n(753,'AddlesSteadW',0,10,536,18,30,0,-11054.9,270.776,25.2035,6.01338,'751:0 14:0 754:0 '),\n(754,'AddlesSteadE',0,10,536,18,30,0,-10997.4,179.443,30.4059,1.04377,'753:0 14:0 766:0 '),\n(755,'RHCemetaryS',0,10,492,18,30,0,-10587.6,294.965,31.0441,0.0129175,'751:0 14:0 756:0 757:0 765:0 766:0 '),\n(756,'RHCemetaryNE',0,10,492,24,30,0,-10398,201.223,34.2462,5.21064,'755:0 757:0 758:0 762:0 764:0 765:0 '),\n(757,'RHCemetaryW',0,10,492,22,30,0,-10427.4,409.679,46.6267,4.40525,'752:0 755:0 756:0 758:0 759:0 '),\n(758,'RHCemetaryN',0,10,243,24,30,0,-10308.2,348.036,59.693,3.07006,'752:0 757:0 756:0 '),\n(759,'DawningWoodCatacombs1',0,10,2098,18,30,0,-10261.5,383.964,10.414,2.92673,'757:0 760:0 '),\n(760,'DawningWoodCatacombs2',0,10,2098,18,30,0,-10234.6,284.99,2.79944,4.82935,'759:0 761:0 '),\n(761,'DawningWoodCatacombs3',0,10,2098,18,30,0,-10220.1,166.144,0.047382,3.23144,'760:0 762:0 '),\n(762,'DawningWoodCatacombs4',0,10,2098,18,30,0,-10338.4,136.513,4.82896,0.380849,'756:0 761:0 '),\n(763,'DuskwoodNW1',0,10,799,18,30,0,-10173.2,350.099,32.3759,4.62356,'752:0 764:0 '),\n(764,'DuskwoodNW2',0,10,799,18,30,0,-10183.8,-55.3832,27.6626,5.67208,'763:0 756:0 765:0 793:0 '),\n(765,'DuskwoodC1',0,10,10,18,30,0,-10482,-16.5716,51.5694,0.81242,'764:0 755:0 756:0 766:0 '),\n(766,'DuskwoodC2',0,10,10,18,30,0,-10750.8,67.4617,28.3337,1.80202,'765:0 755:0 14:0 754:0 767:0 '),\n(767,'DuskwoodC3',0,10,10,18,30,0,-10910.1,-371.894,39.8351,3.06651,'766:0 768:0 769:0 773:0 774:0 775:0 779:0 795:0 '),\n(768,'DuskwoodExitS',0,10,10,18,30,0,-11268.2,-368.936,61.3823,6.14723,'767:0 858:0 '),\n(769,'VulGolOgreMound1',0,10,93,24,30,0,-11005.9,-176.407,14.5532,5.12818,'767:0 770:0 771:0 '),\n(770,'VulGolOgreMound2',0,10,93,24,30,0,-10959.3,-38.5543,13.6432,4.44096,'769:0 771:0 '),\n(771,'VulGolOgreMound3',0,10,93,24,30,0,-11083.6,-80.7448,16.7954,5.39522,'769:0 770:0 772:0 '),\n(772,'VulGolOgreMoundInside',0,10,93,24,30,0,-11234.1,-172.07,4.22438,4.5174,'771:0 '),\n(773,'YorgenFarmsteadW',0,10,245,24,30,0,-11096.9,-452.028,32.1764,4.54422,'767:0 774:0 '),\n(774,'YorgenFarmsteadE',0,10,245,24,30,0,-11052.8,-598.054,29.3447,1.47723,'767:0 773:0 776:0 '),\n(775,'DuskwoodC4',0,10,10,18,30,0,-10908,-739.892,54.8364,0.583838,'767:0 776:0 778:0 779:0 '),\n(776,'RottingOrchardW',0,10,241,18,30,0,-10986.3,-770.892,55.1122,1.55183,'774:0 775:0 777:0 778:0 '),\n(777,'RottingOrchardS',0,10,241,18,30,0,-11103.5,-891.729,62.1149,0.69773,'776:0 778:0 '),\n(778,'DuskwoodC5',0,10,10,18,30,0,-10823,-837.935,55.75,1.63037,'775:0 776:0 777:0 779:0 780:0 '),\n(779,'DuskwoodC6',0,10,10,18,30,0,-10768,-644.008,42.2621,2.90859,'767:0 775:0 778:0 786:0 '),\n(780,'DuskwoodE1',0,10,42,18,30,0,-10757.1,-1156.72,24.9918,1.69202,'778:0 124:0 782:0 783:0 '),\n(781,'RolandsDoomInside',0,10,2161,24,30,0,-11157.5,-1167.04,42.5151,0.315576,'124:0 '),\n(782,'TranquilGardensCemetery',0,10,121,18,30,0,-11023.4,-1315.7,53.1833,6.14911,'780:0 783:0 '),\n(783,'DuskwoodE2',0,10,10,18,30,0,-10813.8,-1366.37,42.2527,0.00140238,'780:0 782:0 3:0 784:0 794:0 '),\n(784,'DarkshireExitE',0,10,10,18,30,0,-10539.7,-1338.09,48.0906,1.65268,'785:0 783:0 3:0 '),\n(785,'DuskwoodExitE',0,10,10,18,30,0,-10442.9,-1486.98,73.8977,5.13748,'784:0 798:0 '),\n(786,'DuskwoodC7',0,10,242,24,30,0,-10451.9,-825.607,50.4132,2.61635,'779:0 787:0 788:0 793:0 '),\n(787,'DuskwoodC8',0,10,242,24,30,0,-10647.9,-908.344,50.934,5.93661,'786:0 3:0 788:0 '),\n(788,'DuskwoodNE1',0,10,242,18,30,0,-10219.2,-1021.98,31.9202,2.92658,'786:0 787:0 3:0 789:0 790:0 793:0 '),\n(789,'ManorMismantle',0,10,1098,24,30,0,-10332.7,-1264.03,35.3024,1.53643,'788:0 3:0 790:0 '),\n(790,'DuskwoodNE2',0,10,10,18,30,0,-10181.4,-1145.35,24.304,3.28393,'788:0 789:0 791:0 793:0 '),\n(791,'DuskwoodNE3',0,10,10,18,30,0,-10067.1,-1379.68,29.9246,1.99195,'790:0 792:0 '),\n(792,'DuskwoodExitNE',0,10,10,18,30,0,-9963.01,-1637.21,27.2574,2.08816,'694:0 791:0 '),\n(793,'DuskwoodN',0,10,799,18,30,0,-10020.5,-660.012,39.1578,1.66406,'790:0 788:0 764:0 786:0 '),\n(794,'Naraxis',0,10,10,18,30,0,-10619.4,-1502.44,90.534,3.1465,'783:0 '),\n(795,'TwilightGroveEntrance',0,10,10,50,60,0,-10718.7,-425.681,126.691,0.442773,'767:0 796:0 '),\n(796,'TwilightGrove',0,10,856,50,60,0,-10419.3,-421.597,45.6561,3.03852,'795:0 '),\n(797,'HeroesVigil',0,12,56,1,10,0,-9101.04,-1034.1,72.9837,5.20227,'698:0 699:0 700:0 701:0 '),\n(798,'DWPExitW',0,41,2697,50,60,0,-10464.2,-1734.78,86.7801,1.49361,'785:0 171:0 802:0 '),\n(799,'DeadwindRavineSW',0,41,2558,50,60,0,-10919.4,-1957.74,114.777,4.67839,'171:0 800:0 '),\n(800,'TheViceW',0,41,2561,50,60,0,-10843.3,-2118.87,121.161,1.51324,'799:0 172:0 79:0 '),\n(801,'DWPExitE',0,41,2938,50,60,0,-10593.5,-2125.78,90.9212,3.83802,'172:0 170:0 802:0 811:0 '),\n(802,'DeadsmansCrossingE',0,41,41,50,60,0,-10437,-2037.61,94.6245,1.59492,'798:0 801:0 810:0 '),\n(803,'GroshgokCompoundInside',0,41,2937,50,60,0,-11169.4,-2483.11,105.139,0.944598,'79:0 '),\n(804,'KarazhanOutskirts',0,41,2562,50,60,0,-11148.9,-2130,55.9803,1.2403,'79:0 805:0 806:0 '),\n(805,'Karazhan',0,41,2562,50,60,0,-11115.2,-2008.72,48.4017,4.31317,'804:0 806:0 '),\n(806,'KarazhanCellarEntrance',0,41,2837,50,60,0,-11173.4,-2033.69,47.0759,0.798522,'804:0 805:0 807:0 '),\n(807,'KarazhanCellar1',0,41,2837,50,60,0,-11100.4,-1963.77,1.93936,4.49657,'806:0 808:0 '),\n(808,'KarazhanCellar2',0,41,2837,50,60,0,-11159.5,-1898.41,-17.7918,6.21463,'807:0 809:0 '),\n(809,'KarazhanCellar3',0,41,2837,50,60,0,-11033.9,-1910.04,-32.9889,4.98353,'808:0 '),\n(810,'DeadmansCrossingBottom',0,41,41,50,60,0,-10282.6,-2019.49,51.0186,2.21028,'802:0 '),\n(811,'SSExitW',0,8,8,33,45,0,-10546.2,-2376.39,84.2413,1.87648,'801:0 812:0 '),\n(812,'SSW1',0,8,8,33,45,0,-10381.8,-2424.26,52.7345,2.75809,'811:0 813:0 '),\n(813,'SSW2',0,8,8,33,45,0,-10427.8,-2549.06,24.1947,5.68762,'812:0 814:0 830:0 '),\n(814,'IthariusCaveOutside',0,8,1777,33,45,0,-10561.3,-2508.68,22.0709,5.83489,'813:0 815:0 816:0 '),\n(815,'IthariusCave',0,8,1777,33,45,0,-10677.4,-2531.21,28.912,6.2649,'814:0 '),\n(816,'SSCRW1',0,8,1780,33,45,0,-10387.5,-2710.03,21.6778,1.56036,'814:0 817:0 818:0 819:0 830:0 '),\n(817,'MistyValley',0,8,116,33,45,0,-10110,-2413.91,29.9136,4.35049,'816:0 818:0 '),\n(818,'SSW3',0,8,8,33,45,0,-10320.4,-2794.27,21.9908,1.07734,'817:0 816:0 819:0 820:0 829:0 830:0 '),\n(819,'Harborage',0,8,657,33,45,3,-10113,-2807.71,22.1444,3.06047,'818:0 816:0 820:0 829:0 '),\n(820,'SSN1',0,8,1798,33,45,0,-10099.4,-3266.23,20.4381,1.58785,'818:0 819:0 821:0 827:0 828:0 829:0 '),\n(821,'SSN2',0,8,76,33,45,0,-9974.74,-3687.45,21.6788,2.09247,'820:0 822:0 823:0 827:0 828:0 829:0 '),\n(822,'SSNE1',0,8,2403,33,45,0,-9634.53,-3969.85,0.0000146627,2.75613,'821:0 823:0 '),\n(823,'SSNE2',0,8,300,33,45,0,-10034.8,-4306.49,1.78832,0.101491,'822:0 821:0 824:0 826:0 827:0 '),\n(824,'SSE',0,8,300,33,45,0,-10512,-4371.71,6.04597,6.27469,'823:0 825:0 80:0 826:0 827:0 '),\n(825,'SSSE',0,8,300,33,45,0,-11038.3,-4116.28,1.98503,5.82703,'186:0 824:0 80:0 '),\n(826,'PoolOfTearsE',0,8,1778,33,45,0,-10444.5,-4087.57,23.9872,1.47592,'80:0 186:0 823:0 824:0 827:0 '),\n(827,'PoolOfTearsN',0,8,8,33,45,0,-10147.3,-3802.05,22.1649,2.27113,'820:0 821:0 823:0 824:0 826:0 828:0 829:0 '),\n(828,'PoolOfTearsW',0,8,8,33,45,0,-10377.4,-3577.61,22.0023,3.94206,'820:0 821:0 827:0 80:0 51:0 829:0 '),\n(829,'SSC',0,8,1798,33,45,0,-10292.9,-3192.2,22.1489,5.69742,'818:0 819:0 820:0 821:0 827:0 828:0 51:0 830:0 '),\n(830,'SSExitS',0,8,8,33,45,0,-10553.9,-3043.33,24.794,0.0857489,'813:0 816:0 818:0 829:0 51:0 831:0 '),\n(831,'SSExitSS',0,4,4,43,54,0,-10690.8,-2978.8,37.8508,5.87412,'830:0 834:0 '),\n(832,'StagalbogInside1',0,8,1817,33,45,0,-10966.8,-3697.03,11.0105,4.21105,'80:0 833:0 '),\n(833,'StagalbogInside2',0,8,1817,33,45,0,-10894.6,-3613.42,16.0499,6.1176,'832:0 '),\n(834,'BLExitN',0,4,4,43,54,0,-10811.4,-2992.21,41.134,0.16765,'831:0 835:0 839:0 846:0 '),\n(835,'BLNW1',0,4,1437,43,54,0,-11009.6,-2785.5,4.70615,5.63206,'834:0 836:0 839:0 840:0 '),\n(836,'DreadmaulHoldEntrance',0,4,1437,43,54,0,-10916.9,-2714.76,7.63624,3.85903,'835:0 837:0 838:0 '),\n(837,'DreadmaulHoldRight',0,4,1437,43,54,0,-10814.2,-2705.35,8.14439,3.20125,'836:0 838:0 '),\n(838,'DreadmaulHoldLeft',0,4,1437,43,54,0,-10859.8,-2615.61,8.07541,4.52661,'836:0 837:0 '),\n(839,'BLNW2',0,4,4,43,54,0,-11080.5,-2903.3,9.18506,0.371865,'835:0 834:0 196:0 '),\n(840,'BLW1',0,4,4,43,54,0,-11249.1,-2724.95,13.3527,2.49675,'835:0 841:0 842:0 '),\n(841,'DreadmaulPost',0,4,1439,43,54,0,-11528.8,-2858.71,8.50437,6.19557,'840:0 196:0 842:0 856:0 '),\n(842,'BLAltarOfStormsBottom',0,4,4,43,54,0,-11501.6,-2718.85,5.65372,0.900431,'840:0 841:0 843:0 856:0 '),\n(843,'BLAltarOfStormsMid',0,4,4,47,54,0,-11381.5,-2566.03,75.8033,3.74358,'842:0 844:0 '),\n(844,'BLAltarOfStormsTop',0,4,1441,47,54,0,-11255.9,-2556.41,97.0494,2.9896,'843:0 '),\n(845,'BLE1',0,4,4,43,54,0,-11149.6,-3232.6,8.07553,2.30354,'196:0 846:0 850:0 '),\n(846,'NethergardeOutside',0,4,1438,43,54,0,-10961.7,-3200.5,45.5708,0.954623,'834:0 845:0 847:0 '),\n(847,'NethergardeInside1',0,4,1438,43,54,2,-11008.9,-3340.48,64.7225,4.78147,'846:0 848:0 '),\n(848,'NethergardeInside2',0,4,1438,43,54,3,-10993.2,-3453.24,64.8707,3.21459,'847:0 849:0 '),\n(849,'NethergardeInside3',0,4,1438,43,54,2,-11112.2,-3438.11,79.0946,6.1402,'848:0 '),\n(850,'BLE2',0,4,1440,43,54,0,-11310.9,-3410.18,7.46828,4.16649,'845:0 851:0 852:0 '),\n(851,'BLE2Inside',0,4,1440,43,54,0,-11225.8,-3486.48,8.69295,2.17551,'850:0 '),\n(852,'BLE3',0,4,4,43,54,0,-11438.8,-3304.34,7.30604,5.76674,'196:0 850:0 853:0 854:0 '),\n(853,'BLSE',0,4,72,43,54,0,-11632.5,-3381.23,14.577,0.215935,'852:0 854:0 855:0 '),\n(854,'BLS1',0,4,4,43,54,0,-11607.8,-3099.85,7.81021,5.30924,'196:0 852:0 853:0 855:0 '),\n(855,'BLS2',0,4,72,43,54,0,-11765.8,-2959.84,7.91609,5.25623,'853:0 854:0 856:0 '),\n(856,'BLS3',0,4,4,43,54,0,-11716.6,-2785.99,8.27783,3.20635,'855:0 841:0 842:0 857:0 '),\n(857,'TaintedScar1',0,4,73,55,60,0,-11907.8,-2658.64,-2.15637,5.48008,'856:0 '),\n(858,'SVExitN',0,33,33,33,45,0,-11362.1,-380.82,64.9035,0.170793,'768:0 859:0 '),\n(859,'SVExitNFork',0,33,33,33,45,0,-11397.1,-284.376,58.1739,3.29667,'858:0 860:0 861:0 '),\n(860,'RebelCamp',0,33,99,33,45,3,-11314.2,-182.813,75.1397,3.66777,'859:0 '),\n(861,'SVEntranceN',0,33,33,33,45,0,-11511.9,-302.586,38.7986,0.353382,'859:0 863:0 864:0 862:0 '),\n(862,'NesingwarysExpeditionCamp',0,33,100,33,45,0,-11616,-50.0157,10.9823,4.49439,'861:0 879:0 880:0 881:0 901:0 902:0 907:0 '),\n(863,'SVNBridge1N',0,33,33,33,45,0,-11604.1,-282.333,37.221,5.64107,'861:0 879:0 '),\n(864,'SVNHubN1',0,33,33,33,45,0,-11643.7,-473.703,17.1608,0.3141,'861:0 865:0 873:0 '),\n(865,'KurzensCompound',0,33,101,33,45,0,-11604,-644.056,29.157,3.77181,'864:0 866:0 872:0 '),\n(866,'TheStockpile1',0,33,106,33,45,0,-11461.5,-750.28,30.6105,4.24893,'865:0 867:0 '),\n(867,'TheStockpile2',0,33,106,33,45,0,-11514.8,-845.839,22.0076,3.08261,'866:0 868:0 869:0 '),\n(868,'TheStockpile3',0,33,106,33,45,0,-11418.4,-794.929,14.9653,3.89354,'867:0 '),\n(869,'TheStockpile4',0,33,106,33,45,0,-11506.4,-946.763,29.2275,0.414209,'867:0 870:0 '),\n(870,'TheStockpile5',0,33,106,33,45,0,-11406.8,-896.737,18.0813,0.89682,'869:0 871:0 '),\n(871,'TheStockpile6',0,33,106,33,45,0,-11337.1,-985.396,27.3203,1.9202,'870:0 '),\n(872,'SVNHubN2',0,33,33,33,45,0,-11729.7,-799.127,29.6214,0.89486,'865:0 873:0 875:0 913:0 '),\n(873,'VentureCoBaseCamp',0,33,1760,33,45,0,-11959.6,-531.751,11.3978,5.11834,'872:0 864:0 874:0 875:0 913:0 '),\n(874,'SVNHub1',0,33,33,33,45,0,-12225,-546.002,28.8839,0.0407319,'873:0 875:0 911:0 913:0 915:0 '),\n(875,'SVE1',0,33,33,33,45,0,-12149.1,-965.968,32.4681,1.43677,'872:0 873:0 874:0 876:0 878:0 913:0 '),\n(876,'MoshoggOgreMound',0,33,105,33,45,0,-12352.7,-972.262,13.1171,5.38338,'875:0 877:0 878:0 913:0 '),\n(877,'MoshoggOgreMoundInside',0,33,105,33,45,0,-12364,-1147.48,0.104103,2.92311,'876:0 '),\n(878,'MoshoggOgreMoundUpper',0,33,105,33,45,0,-12466.5,-881.644,39.1084,5.72306,'875:0 876:0 914:0 918:0 '),\n(879,'SVNBridge1C',0,33,33,33,45,0,-11710.1,-210.005,39.5643,5.90174,'863:0 880:0 862:0 '),\n(880,'SVNBridge1S',0,33,33,33,45,0,-11818.3,-43.4252,39.7487,5.27146,'879:0 862:0 903:0 905:0 907:0 '),\n(881,'SVNHubW1',0,33,33,33,45,0,-11518.9,255.102,25.1192,4.23669,'862:0 882:0 883:0 901:0 '),\n(882,'SVNHubW2',0,33,33,33,45,0,-11502.5,373.117,53.2392,3.3217,'881:0 883:0 '),\n(883,'ZulKundaNE',0,33,33,33,45,0,-11650.7,401.397,42.8581,5.68183,'881:0 882:0 884:0 889:0 890:0 '),\n(884,'ZulKundaE',0,33,33,33,45,0,-11785.5,436.17,47.4037,6.2807,'883:0 885:0 889:0 899:0 '),\n(885,'ZulKundaSE',0,33,33,33,45,0,-11863.3,560.263,47.0214,5.06137,'884:0 886:0 887:0 889:0 '),\n(886,'ZulKundaS',0,33,33,33,45,0,-11831.5,711.922,45.1329,4.4252,'885:0 888:0 '),\n(887,'SavageCoastNW1',0,33,301,33,45,0,-11924.1,793.032,3.06387,4.97496,'885:0 894:0 185:0 897:0 898:0 '),\n(888,'ZulKunda1',0,33,102,33,45,0,-11690.4,742.837,49.7495,3.41987,'886:0 889:0 891:0 '),\n(889,'ZulKunda2',0,33,102,33,45,0,-11694.8,565.959,49.7011,1.34053,'883:0 884:0 885:0 888:0 890:0 891:0 '),\n(890,'ZulKunda3',0,33,102,33,45,0,-11550.4,601.183,50.5784,3.11945,'883:0 889:0 891:0 '),\n(891,'ZulKunda4',0,33,102,33,45,0,-11622.9,760.15,39.7329,0.007312,'888:0 889:0 890:0 892:0 893:0 '),\n(892,'ZulKunda5',0,33,102,33,45,0,-11528.7,724.898,59.4101,3.50037,'891:0 '),\n(893,'ZulKundaW',0,33,122,33,45,0,-11572.6,840.524,8.14386,2.72086,'891:0 894:0 '),\n(894,'SavageCoastNW2',0,33,122,33,45,0,-11692.5,954.651,3.70656,5.00441,'893:0 887:0 185:0 897:0 '),\n(895,'YojambaIsleW',0,33,3357,33,45,0,-11810.6,1364.62,0.0261903,4.46053,'185:0 '),\n(896,'YojambaIsleN',0,33,3357,33,45,0,-11748.3,1318.44,5.22585,2.37531,'185:0 '),\n(897,'VileReefIsle',0,33,301,33,45,0,-12154.2,871.091,18.6659,5.996,'894:0 887:0 '),\n(898,'SavageCoastW1',0,33,301,33,45,0,-12016.1,440.588,3.35169,0.661185,'887:0 899:0 900:0 '),\n(899,'SVNWHub1',0,33,33,33,45,0,-11888.7,290.463,12.6077,0.998902,'898:0 884:0 900:0 901:0 902:0 903:0 '),\n(900,'SavageCoastW2',0,33,33,33,45,0,-12196.8,238.239,2.19021,4.81004,'898:0 899:0 904:0 37:0 '),\n(901,'SVNHunW3',0,33,100,33,45,0,-11656.6,59.5536,17.3151,1.50941,'899:0 881:0 862:0 902:0 '),\n(902,'TkashiRuins',0,33,126,33,45,0,-11843.2,59.0602,14.1655,3.34528,'899:0 901:0 862:0 903:0 905:0 '),\n(903,'KalaiRuins',0,33,125,33,45,0,-12069.3,66.3927,-5.18214,3.5436,'902:0 899:0 880:0 904:0 906:0 '),\n(904,'SVNHub2',0,33,33,33,45,0,-12283.3,28.601,18.2879,0.246879,'903:0 900:0 37:0 912:0 '),\n(905,'SVNBridge2N',0,33,33,33,45,0,-11907.9,-50.0313,39.7259,0.870484,'902:0 880:0 906:0 907:0 '),\n(906,'SVNBridge2S',0,33,33,33,45,0,-12090.1,-139.679,35.2928,0.399245,'903:0 905:0 910:0 '),\n(907,'SVCHub1',0,33,33,33,45,0,-11853.5,-167.599,15.3333,0.51312,'862:0 880:0 905:0 '),\n(908,'SavageCoastW3',0,33,301,33,45,0,-12543.1,74.9728,0.873061,0.513523,'37:0 912:0 '),\n(909,'SavageCoastW4',0,33,1578,33,45,0,-12691.2,142.464,3.092,5.80512,'921:0 924:0 925:0 936:0 '),\n(910,'SVNBridge3W',0,33,33,33,45,0,-12171.4,-240.719,29.8621,0.766786,'906:0 911:0 912:0 '),\n(911,'SVNBridge3E',0,33,33,33,45,0,-12157.4,-431.52,30.3485,1.45204,'874:0 910:0 913:0 '),\n(912,'MizjahRuins',0,33,129,33,45,0,-12468.7,-147.093,13.8431,5.95827,'904:0 908:0 910:0 916:0 '),\n(913,'SVNHub3',0,33,1740,33,45,0,-12127.6,-649.027,14.8876,2.30225,'874:0 876:0 911:0 873:0 875:0 872:0 '),\n(914,'BaliamahRuins',0,33,127,33,45,0,-12540.7,-734.478,39.4424,6.20568,'878:0 915:0 917:0 918:0 '),\n(915,'SVNHub4',0,33,33,33,45,0,-12417,-580.502,11.0755,6.10556,'914:0 874:0 916:0 '),\n(916,'SVNHub5',0,33,33,33,45,0,-12522,-370.721,12.7107,0.882666,'912:0 915:0 917:0 921:0 '),\n(917,'ZiatajaiRuins',0,33,128,33,45,0,-12701.1,-464.07,30.0552,6.19787,'914:0 916:0 918:0 920:0 '),\n(918,'ZulMamweN',0,33,33,33,45,0,-12776.9,-784.489,63.0348,0.421265,'878:0 914:0 917:0 919:0 '),\n(919,'ZulMamweC',0,33,103,33,45,0,-12985.7,-833.459,69.9343,0.193503,'918:0 920:0 '),\n(920,'ZulMamweW',0,33,103,33,45,0,-12943.6,-608.837,53.0521,6.05178,'917:0 919:0 '),\n(921,'SVSHub1',0,33,33,33,45,0,-12826,-301.024,9.96047,5.46666,'916:0 922:0 909:0 925:0 '),\n(922,'SVSVentureCoMine1',0,33,33,33,45,0,-12978,-452.477,53.6008,5.60214,'921:0 923:0 '),\n(923,'SVSVentureCoMine2',0,33,33,33,45,0,-13088.9,-466.483,47.2022,3.61705,'922:0 '),\n(924,'GurubashiArenaOuterN',0,33,1577,33,45,0,-12949,251.702,18.4183,2.2214,'909:0 937:0 '),\n(925,'STCHub1',0,33,1577,33,45,0,-13136.8,-184.248,-3.10173,5.92455,'909:0 921:0 926:0 929:0 '),\n(926,'CrystalveinMine1',0,33,310,33,45,0,-13322.7,-420.202,15.4509,2.04861,'925:0 927:0 928:0 929:0 '),\n(927,'CrystalveinMine2',0,33,310,33,45,0,-13158.5,-564.518,4.64271,0.568135,'926:0 928:0 '),\n(928,'CrystalveinMine3',0,33,310,33,45,0,-13170,-467.696,3.57551,3.1305,'926:0 927:0 '),\n(929,'STCHub2',0,33,1577,33,45,0,-13246.3,-110.492,19.5979,5.04296,'926:0 925:0 930:0 '),\n(930,'GurubashiOuterSE',0,33,1741,33,45,0,-13280.6,57.3154,17.1498,4.95263,'929:0 931:0 932:0 933:0 934:0 '),\n(931,'GurubashiOuterSSE',0,33,1741,33,45,0,-13402.5,96.0163,23.7905,6.03724,'930:0 932:0 933:0 934:0 935:0 943:0 944:0 '),\n(932,'RuinsOfJubuwal',0,33,477,33,45,0,-13382.8,-24.5642,22.0332,0.894086,'930:0 931:0 '),\n(933,'GurubashiArenaInside1',0,33,2177,33,45,0,-13216,312.587,21.8574,3.50161,'930:0 931:0 934:0 '),\n(934,'GurubashiArenaInside2',0,33,2177,33,45,0,-13163.8,257.166,21.8574,3.62531,'930:0 931:0 933:0 '),\n(935,'STCHub3',0,33,1577,33,45,0,-13475.6,312.292,31.942,5.22555,'931:0 938:0 942:0 '),\n(936,'SSavageCoast1',0,33,1578,33,45,0,-12862.3,459.666,6.403,4.74253,'909:0 937:0 '),\n(937,'GurubashiArenaOuterW',0,33,1741,33,45,0,-13076.6,428.328,24.6507,6.12678,'924:0 936:0 938:0 '),\n(938,'GurubashiArenaOuterSW',0,33,1577,33,45,0,-13273.2,479.65,3.7542,5.77924,'935:0 937:0 939:0 940:0 '),\n(939,'BloodsailCompoundW',0,33,1739,33,45,0,-13331.9,777.87,2.16424,3.85895,'938:0 940:0 941:0 '),\n(940,'BloodsailCompoundC',0,33,1739,33,45,0,-13470.3,687.069,8.46535,3.18977,'938:0 939:0 941:0 '),\n(941,'SSavageCoast2',0,33,1578,33,45,0,-13705.9,620.54,10.152,3.17013,'939:0 940:0 966:0 968:0 '),\n(942,'STCHub4',0,33,1577,33,45,0,-13618.7,330.576,43.7429,5.59271,'935:0 943:0 968:0 '),\n(943,'STCHub5',0,33,1577,33,45,0,-13719.1,129.331,23.7103,3.72188,'931:0 942:0 944:0 964:0 965:0 '),\n(944,'STCHub6',0,33,1577,33,45,0,-13572.2,-93.8439,42.7481,1.44857,'931:0 943:0 945:0 '),\n(945,'RuinsOfAboraz',0,33,311,33,45,0,-13627.7,-351.772,12.434,1.10692,'944:0 946:0 '),\n(946,'CrystalShore1',0,33,302,33,45,0,-13867.2,-89.5993,18.4363,2.92315,'945:0 947:0 964:0 '),\n(947,'CrystalShore2',0,33,302,33,45,0,-14086.6,-142.781,3.55938,1.30916,'946:0 948:0 '),\n(948,'WildShore1',0,33,43,33,45,0,-14260.2,-15.7846,3.81308,5.84287,'947:0 949:0 '),\n(949,'WildShore2',0,33,43,33,45,0,-14293.2,109.305,7.5176,0.82025,'948:0 950:0 962:0 '),\n(950,'WildShore3',0,33,43,33,45,0,-14585.8,177.319,2.91916,6.15507,'949:0 951:0 952:0 955:0 958:0 '),\n(951,'WildShore4',0,33,43,33,45,0,-14708.6,511.328,2.52661,5.16547,'950:0 952:0 '),\n(952,'WildShoreShips1',0,33,43,33,45,0,-14894,302.458,3.67936,4.08476,'950:0 951:0 953:0 954:0 955:0 '),\n(953,'WildShoreShips1Left',0,33,43,33,45,0,-14940,357.129,0.221882,0.0694,'952:0 '),\n(954,'WildShoreShips1Right',0,33,43,33,45,0,-15009.9,266.91,0.198072,0.0485881,'952:0 '),\n(955,'WildShoreShips2',0,33,43,33,45,0,-14843.8,75.9812,2.07268,0.570875,'950:0 952:0 956:0 957:0 '),\n(956,'WildShoreShips2Center',0,33,43,33,45,0,-14926.8,110.764,0.2001,4.9102,'955:0 '),\n(957,'JagueroIsle1',0,33,297,33,45,0,-14817.1,-427.547,1.62653,0.804531,'955:0 958:0 '),\n(958,'JagueroIsle2',0,33,297,33,45,0,-14556.9,-277.709,10.043,3.68499,'950:0 957:0 '),\n(959,'BootyBayW',0,33,35,33,45,0,-14300.4,523.178,8.69884,4.45859,'36:0 960:0 '),\n(960,'BootyBayS',0,33,35,33,45,1,-14462.8,467.081,15.1246,5.4423,'36:0 959:0 '),\n(961,'BootyBayEntrance',0,33,1577,33,45,0,-14249.5,333.168,24.6767,2.49077,'36:0 962:0 967:0 '),\n(962,'STCHub7',0,33,1577,33,45,0,-14217.2,239.309,20.2817,3.77098,'949:0 961:0 963:0 '),\n(963,'STCHub8',0,33,1577,33,45,0,-14073.6,266.586,17.42,5.16308,'962:0 964:0 965:0 '),\n(964,'MistvaleValley',0,33,1737,33,45,0,-13952.8,86.1666,15.8298,5.2161,'76:0 943:0 946:0 963:0 '),\n(965,'STCHub9',0,33,1577,33,45,0,-13879.6,258.837,17.7662,5.83459,'943:0 963:0 '),\n(966,'SSavageCoast3',0,33,1578,33,45,0,-13908.6,676.67,10.0579,5.32409,'967:0 941:0 969:0 '),\n(967,'SSavageCoast4',0,33,1578,33,45,0,-14050.8,500.109,2.8225,0.635261,'961:0 966:0 '),\n(968,'SSavageCoast5',0,33,1578,33,45,0,-13683.6,505.174,34.349,3.2526,'941:0 942:0 969:0 970:0 '),\n(969,'SSavageCoast6',0,33,1577,33,45,0,-13859.9,575.635,44.9464,6.06235,'966:0 968:0 '),\n(970,'SSavageCoast7',0,33,1577,33,45,0,-13849.3,494.156,89.7643,5.84244,'968:0 971:0 '),\n(971,'SSavageCoast8',0,33,1738,33,45,0,-13806.7,377.83,94.1372,2.10198,'970:0 ');\n"
  },
  {
    "path": "AC/SQL/updates/world/2023_03_22_00_creature_template.sql",
    "content": "--\nUPDATE `creature_template` SET `subname`='' WHERE (`entry` BETWEEN 70501 AND 70580) AND `subname`='NULL';\n"
  },
  {
    "path": "AC/SQL/updates/world/2023_04_04_00_creature_template_npcbot_wander_nodes.sql",
    "content": "--\nDROP TABLE IF EXISTS `creature_template_npcbot_wander_nodes`;\nCREATE TABLE `creature_template_npcbot_wander_nodes` (\n  `id` int(10) unsigned NOT NULL,\n  `name` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'RENAME_ME',\n  `mapid` smallint(5) unsigned NOT NULL DEFAULT '0',\n  `zoneid` int(10) unsigned NOT NULL DEFAULT '0',\n  `areaid` int(10) unsigned NOT NULL DEFAULT '0',\n  `minlevel` tinyint(3) unsigned NOT NULL DEFAULT '0',\n  `maxlevel` tinyint(3) unsigned NOT NULL DEFAULT '0',\n  `flags` int(10) unsigned NOT NULL DEFAULT '0',\n  `x` float NOT NULL DEFAULT '0',\n  `y` float NOT NULL DEFAULT '0',\n  `z` float NOT NULL DEFAULT '0',\n  `o` float NOT NULL DEFAULT '0',\n  `links` mediumtext COLLATE utf8mb4_unicode_ci,\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Bot Wander Map';\n\nINSERT INTO `creature_template_npcbot_wander_nodes` (`id`,`name`,`mapid`,`zoneid`,`areaid`,`minlevel`,`maxlevel`,`flags`,`x`,`y`,`z`,`o`,`links`) VALUES\n(1,'Anvilmar',0,1,132,1,5,2,-6077.84,384.826,393.598,4.63263,'542:0 '),\n(2,'Brill',0,85,159,1,10,5,2249.85,278.414,34.1142,5.11546,'18:0 277:0 278:0 279:0 281:0 '),\n(3,'Darkshire',0,10,42,18,30,3,-10560.6,-1182.34,27.9637,3.1803,'783:0 784:0 787:0 788:0 789:0 '),\n(4,'Deathknell',0,85,154,1,10,5,1879.83,1588.2,90.1725,5.25172,'295:0 296:0 '),\n(5,'Dun Algaz',0,11,836,18,30,0,-4245.13,-2356.42,204.034,3.9477,'483:0 '),\n(6,'Dun Modr',0,11,205,18,30,0,-2610.26,-2350.56,81.5918,1.1263,'444:0 '),\n(7,'Goldshire',0,12,87,1,10,3,-9480.09,63.5218,56.1755,3.4173,'88:0 71:0 16:0 42:0 72:0 710:0 709:0 714:0 717:0 '),\n(8,'Ironforge',0,1,809,1,10,2,-5023.64,-831.425,495.319,5.37056,'559:0 560:0 '),\n(9,'Kharanos',0,1,131,1,10,3,-5501.22,-472.604,408.453,2.4002,'537:0 545:0 557:0 '),\n(10,'Lakeshire',0,44,69,13,25,3,-9235.12,-2145.54,71.2121,5.71383,'665:0 666:0 '),\n(11,'Menethil Harbor',0,11,150,18,30,3,-3672.7,-828.455,9.89925,3.18444,'476:0 477:0 478:0 '),\n(12,'Moonbrook',0,40,20,8,20,2,-11017.1,1510.17,43.1667,2.58627,'737:0 738:0 736:0 747:0 '),\n(13,'Northshire Abbey',0,12,9,1,10,3,-8900.51,-116.199,81.8499,0.369434,'710:0 70:0 73:0 '),\n(14,'Raven Hill',0,10,94,18,30,0,-10805.5,291.025,30.9282,3.92422,'751:0 753:0 754:0 755:0 766:0 '),\n(15,'Sentinel Hill',0,40,108,8,20,3,-10509.5,1047.74,60.519,5.20046,'741:0 742:0 745:0 746:0 736:0 750:0 '),\n(16,'Stormwind City',0,12,12,1,10,2,-9153.77,364.057,90.151,5.16709,'42:0 710:0 712:0 7:0 '),\n(17,'The Sepulcher',0,130,228,8,20,5,470.768,1589.82,126.632,5.16292,'305:0 '),\n(18,'Undercity',0,85,153,1,10,5,1885.94,236.924,58.0313,3.1016,'2:0 285:0 '),\n(19,'Thelsamar',0,38,144,8,20,3,-5334.7,-3015.26,324.2,1.73643,'503:0 504:0 '),\n(20,'Southshore',0,267,271,18,30,3,-803.031,-531.727,15.9656,1.39359,'362:0 363:0 376:0 384:0 385:0 356:0 '),\n(21,'Tarren Mill',0,267,272,18,30,5,-27.0354,-900.562,55.9602,4.57301,'378:0 380:0 379:0 384:0 '),\n(22,'Refuge Pointe',0,45,320,28,40,3,-1280.81,-2466.89,34.7175,5.16384,'78:0 416:0 419:0 '),\n(23,'Hammerfall',0,45,321,28,40,5,-955.494,-3540.82,56.7101,3.23882,'438:0 '),\n(24,'Kargath',0,3,340,33,45,5,-6625,-2152.82,249.141,4.5492,'594:0 598:0 '),\n(25,'Angor Fortress',0,3,338,33,45,0,-6392.65,-3158,299.765,4.68826,'608:0 620:0 '),\n(26,'Bloodhoof Village',1,215,222,1,10,5,-2383.39,-343.878,-0.729101,4.63375,'1817:0 1818:0 1819:0 '),\n(27,'Camp Narache',1,215,221,1,10,5,-2886.88,-207.003,54.8208,5.16976,'1825:0 1826:0 '),\n(28,'Razor Hill',1,14,362,1,10,0,311.158,-4740.49,9.58476,2.69842,'1401:0 1402:0 1409:0 '),\n(29,'The Den',1,14,363,1,10,0,-604.098,-4202.92,38.7281,1.10189,'1431:0 '),\n(30,'Orgrimmar',1,14,14,1,10,5,1429.15,-4364.86,25.4626,0.273189,'1361:0 '),\n(31,'Senjin Village',1,14,367,1,10,0,-827.631,-4901.78,19.7839,0.842982,'1413:0 1419:0 1420:0 1421:0 1422:0 '),\n(32,'The Crossroads',1,17,380,8,25,5,-456.721,-2653.33,95.6449,4.9548,'1487:0 1490:0 1526:0 1535:0 '),\n(33,'Aldrassil',1,141,256,1,4,2,10318.8,828.943,1326.38,0.947904,'972:0 62:0 974:0 '),\n(34,'Dolanaar',1,141,186,1,10,3,9809.39,956.34,1308.79,0.244923,'981:0 983:0 985:0 '),\n(35,'Ratchet',1,17,392,8,25,0,-949.408,-3670.31,9.21524,5.18454,'1475:0 1562:0 1484:0 1618:0 '),\n(36,'Booty Bay',0,33,35,33,45,0,-14308.8,440.139,25.5878,0.828079,'959:0 960:0 961:0 '),\n(37,'Gromgol Base Camp',0,33,117,33,45,5,-12416.5,185.125,1.83125,6.17782,'904:0 900:0 908:0 '),\n(38,'Astranaar',1,331,415,18,30,3,2687.8,-420.338,107.402,0.195851,'1056:0 1055:0 '),\n(39,'Stonetalon Peak',1,406,467,18,25,3,2693.45,1481.51,235.304,5.88192,'1692:0 1694:0 1690:0 '),\n(40,'Thalanaar',1,357,489,23,35,3,-4496.36,-778.473,-40.558,2.54579,'2014:0 2019:0 2020:0 2021:0 '),\n(41,'Freewind Post',1,400,484,23,35,4,-5429.82,-2388.59,89.4787,2.85815,'2104:0 2105:0 '),\n(42,'Mirror Lake',0,12,92,1,10,2,-9389.26,458.427,38.2852,2.4529,'72:0 16:0 88:0 7:0 '),\n(44,'Drywhisker Gorge',0,45,318,28,40,0,-1014.22,-3827.39,145.41,2.59534,'440:0 '),\n(45,'Sun Rock Retreat',1,406,460,13,25,4,946.771,895.865,106.952,1.46258,'1662:0 1663:0 '),\n(46,'Temple of Zin-Malor',1,16,1223,43,54,0,3549.15,-5359.12,188.348,1.22969,'1325:0 '),\n(48,'Uthers Tomb',0,28,196,48,56,0,1021.5,-1809.43,77.1448,3.5376,'271:0 '),\n(50,'Whitereach Post',1,400,2237,23,35,0,-4917.35,-1375.5,-52.612,3.05417,'2034:0 2036:0 2038:0 2040:0 '),\n(51,'Stonard',0,8,75,33,45,5,-10445,-3261.11,20.179,5.57373,'828:0 829:0 830:0 '),\n(52,'Gadgetzan',1,440,976,38,50,0,-7145.2,-3724,8.49316,4.91643,'2144:0 2146:0 2147:0 '),\n(53,'Camp Mojache',1,357,1099,38,50,4,-4402.29,263.941,25.2783,4.51526,'1995:0 1996:0 1997:0 '),\n(54,'Theramore Isle',1,15,513,33,45,2,-3702.55,-4393.17,15.8191,0.332538,'1882:0 1883:0 '),\n(55,'Aerie Peak',0,47,348,38,50,0,151.003,-2052.21,117.992,6.03287,'82:0 386:0 387:0 388:0 '),\n(56,'Everlook',1,618,2255,53,60,0,6726.4,-4671.8,720.854,3.62348,'1218:0 1240:0 '),\n(57,'Shadowprey Village',1,405,2408,31,40,5,-1591.76,3150,62.5296,3.57741,'1792:0 '),\n(58,'Feathermoon Stronghold',1,357,1116,38,50,3,-4377.97,3297.09,28.7853,5.12409,'1940:0 1941:0 1939:0 '),\n(59,'Auberdine',1,148,442,8,20,0,6300.77,315.841,22.9342,5.97913,'993:0 994:0 1008:0 1010:0 1011:0 1012:0 '),\n(60,'Nijels Point',1,405,608,28,40,3,164.433,1335.57,197.473,2.41439,'1716:0 '),\n(62,'Shadowthread Cave',1,141,257,1,4,2,10749.1,923.327,1336.99,6.25796,'33:0 972:0 973:0 '),\n(63,'Fel Rock',1,141,258,1,10,2,10038.9,1030.06,1329.12,0.362337,'983:0 984:0 '),\n(64,'Banethil Barrow Den',1,141,736,4,10,2,9972.27,1541.52,1308.75,3.05312,'985:0 986:0 987:0 '),\n(66,'DurotarCanyon1_1',1,14,410,1,10,0,622.608,-4563.33,7.7631,0.614446,'1372:0 1373:0 1374:0 '),\n(67,'Torkren Farm',1,14,2979,1,10,0,723.247,-4242.04,17.2031,4.54537,'1372:0 1373:0 1385:0 1392:0 1400:0 '),\n(69,'Ironbands Compound',0,1,716,1,10,2,-5858.7,-2004.1,401.648,0.478922,'523:0 528:0 '),\n(70,'Echo Ridge Mine',0,12,34,1,10,2,-8691.38,-113.152,89.09,5.86134,'73:0 13:0 711:0 '),\n(71,'Maclure Vineyards',0,12,64,1,10,2,-9948.39,69.1568,33.3005,5.49869,'72:0 7:0 714:0 716:0 '),\n(72,'Stonefield Farm',0,12,63,1,10,2,-9901.14,378.19,35.2801,5.75613,'71:0 7:0 42:0 88:0 713:0 714:0 717:0 '),\n(73,'Northshire Vineyards',0,12,59,1,10,2,-9067.35,-333.965,73.4519,1.09469,'70:0 13:0 '),\n(74,'Tower of Ilgalar',0,44,96,18,25,0,-9282.21,-3330.43,115.604,1.41034,'683:0 685:0 686:0 '),\n(75,'Renders Rock',0,44,998,13,25,0,-8677.89,-2302.91,155.917,1.18325,'661:0 662:0 '),\n(76,'Spirit Den',0,33,1742,33,45,0,-13751.4,-18.3165,44.0002,0.851192,'964:0 '),\n(77,'Rethban Caverns',0,44,98,13,25,2,-8976.38,-2016.83,136.063,1.26142,'670:0 671:0 '),\n(78,'Boulderfist Outpost',0,45,1858,28,40,0,-1183.46,-2180.67,55.5524,1.6849,'22:0 415:0 416:0 419:0 '),\n(79,'Groshgok Compound',0,41,2937,50,60,0,-11094.7,-2311.06,117.13,4.77931,'800:0 803:0 804:0 '),\n(80,'Stagalbog Cave',0,8,1817,33,45,0,-10775.6,-3747.85,22.347,3.74768,'186:0 825:0 824:0 826:0 828:0 832:0 '),\n(81,'The Tower of Arathor',0,45,324,28,40,0,-1760.68,-1537.05,64.8696,2.02383,'425:0 '),\n(82,'Wildhammer Keep',0,47,349,38,50,3,250.073,-2203.83,125.172,0.474207,'55:0 387:0 388:0 '),\n(83,'Night Webs Hollow',0,85,155,1,10,4,2053.22,1802.16,99.8006,1.83635,'295:0 '),\n(84,'Terrorweb Tunnel',0,139,2626,53,60,0,3035.33,-2773.9,100.473,5.05065,'215:0 243:0 '),\n(85,'Browman Mill',0,139,2269,53,60,0,2475.41,-5143.98,77.5041,5.20031,'234:0 211:0 '),\n(86,'Uldaman',0,3,1337,33,45,0,-6092.01,-3179.35,255.852,5.9237,'621:0 '),\n(87,'Dustbelch Grotto',0,3,347,33,45,0,-7299.86,-2270.26,244.599,3.07308,'595:0 '),\n(88,'Westbrook Garrison',0,12,120,1,10,2,-9671.96,690.134,36.5414,5.31336,'72:0 42:0 713:0 7:0 717:0 '),\n(89,'Jasperlode Mine',0,12,54,1,10,0,-9194.18,-610.205,60.7892,0.426731,'701:0 702:0 707:0 708:0 '),\n(91,'Algaz Station',0,38,925,8,20,0,-4880.26,-2723,328.908,0.873682,'485:0 486:0 487:0 500:0 502:0 '),\n(92,'Grim Batol',0,11,1037,61,70,0,-4130,-3468.16,259.76,0.014411,'454:0 '),\n(93,'Venture Co. Mine',1,215,215,1,10,4,-1466.09,-994.107,148.38,4.09562,'1868:0 '),\n(94,'Blackwood Den',1,148,455,8,20,0,4626.07,40.557,68.8626,1.32329,'95:0 999:0 1003:0 1006:0 '),\n(95,'WindbendRiverS',1,148,454,8,20,0,5014.05,224.988,33.2141,0.194282,'996:0 999:0 1005:0 94:0 1006:0 '),\n(96,'Cliffspring Falls',1,148,445,8,20,0,6878.37,-656.215,84.4074,3.85022,'1019:0 1020:0 1021:0 '),\n(98,'Wailing Caverns',1,17,718,8,25,0,-868.365,-2044.69,81.6627,1.16842,'1539:0 1540:0 1557:0 1614:0 '),\n(99,'Shady Rest Inn',1,15,403,33,45,0,-3695.7,-2558.8,61.0548,1.48476,'1872:0 1873:0 1904:0 '),\n(100,'Darkmist Cavern',1,15,499,33,45,0,-2829.79,-2722.81,36.7883,2.20851,'187:0 102:0 1902:0 '),\n(101,'North Point Tower',1,15,504,33,45,2,-2869.79,-3419.99,39.3517,3.30334,'102:0 1875:0 1877:0 1878:0 1902:0 '),\n(102,'Bluefen',1,15,507,33,45,0,-2695.87,-3011.4,41.88,2.01726,'100:0 187:0 1874:0 101:0 1875:0 1902:0 '),\n(103,'Lost Point',1,15,506,33,45,0,-3917.65,-2833.95,42.7963,4.55319,'1873:0 1904:0 1907:0 1908:0 1909:0 '),\n(104,'Tidefury Cove',1,15,517,33,45,0,-4414.52,-4100.84,6.37542,0.28057,'106:0 1912:0 '),\n(105,'Stonemaul Ruins',1,15,508,33,45,0,-4346.02,-3321.15,34.2542,6.16796,'106:0 233:0 1906:0 1907:0 1909:0 '),\n(106,'Onyxias Lair',1,15,511,33,45,0,-4638.56,-3708.98,38.6239,2.33441,'233:0 105:0 1910:0 1911:0 104:0 '),\n(107,'Emberstrifes Den',1,15,2158,33,45,0,-4956.66,-3850.19,43.6067,2.10466,'1910:0 1911:0 '),\n(108,'Bloodfen Burrow',1,15,498,33,45,0,-4335.04,-2639.53,38.0638,1.30845,'1908:0 1909:0 '),\n(109,'Sentry Point',1,15,503,33,45,0,-3410.26,-4186.35,10.7187,3.27073,'1881:0 1882:0 '),\n(110,'Swamplight Manor',1,15,497,33,45,0,-2949.47,-3893.5,35.0303,1.23141,'1877:0 1878:0 1879:0 1880:0 '),\n(111,'Marshals Refuge',1,490,541,46,56,1,-6112.07,-1130.95,-187.426,1.5835,'2245:0 2246:0 '),\n(112,'Fungal Rock',1,490,542,46,56,0,-6383.04,-1806.79,-266.123,6.01903,'2249:0 2250:0 2251:0 '),\n(113,'Wavestrider Beach',1,440,988,38,50,0,-7619.63,-4828.43,0.668867,3.36332,'2157:0 2158:0 2159:0 2160:0 '),\n(114,'Uldum',1,440,989,44,55,0,-9473.22,-2749.02,15.4728,5.89777,'2193:0 2194:0 2195:0 '),\n(115,'Darkcloud Pinnacle',1,400,2097,23,35,0,-5086.21,-1919.44,88.1806,6.15461,'2071:0 2077:0 2078:0 '),\n(116,'Roguefeather Den',1,400,487,23,35,0,-5462.36,-1633.26,30.0036,4.16001,'2056:0 2057:0 '),\n(117,'Mirage Raceway',1,400,2240,23,35,0,-6239.42,-3973.12,-58.7501,5.06259,'122:0 123:0 2136:0 2137:0 118:0 2138:0 '),\n(118,'The Rustmaul Digsite',1,400,479,23,35,0,-6490.61,-3449.15,-58.7821,3.58106,'117:0 123:0 2138:0 2139:0 '),\n(119,'Splithoof Hold',1,400,1557,23,35,0,-5071.33,-2349.27,-53.6634,5.48527,'2084:0 2094:0 2112:0 '),\n(121,'Ironstone Camp',1,400,3037,23,35,0,-5813.18,-3421.49,-50.9325,2.44381,'2131:0 2133:0 122:0 2134:0 2138:0 '),\n(122,'Weazels Crater',1,400,3038,23,35,0,-5880.19,-3796.15,-59.9445,0.25844,'121:0 2133:0 2134:0 2136:0 117:0 2138:0 '),\n(123,'Tahonda Ruins',1,400,3039,23,35,0,-6569.91,-3894.97,-58.7495,0.100017,'117:0 2137:0 118:0 2138:0 2140:0 '),\n(124,'Rolands Doom',0,10,2161,24,30,0,-11045.3,-1130.98,38.585,3.65547,'780:0 781:0 '),\n(127,'Maraudon',1,405,2100,33,40,0,-1421.88,2905.15,136.781,1.31624,'1786:0 1787:0 '),\n(128,'Ghost Walker Post',1,405,597,28,40,4,-1258.05,1699.26,89.9098,0.914953,'1765:0 1766:0 1769:0 1776:0 '),\n(129,'Scrabblescrews Camp',1,405,2617,31,40,0,-1407.87,1493.13,60.8875,4.75641,'1749:0 1750:0 1764:0 1769:0 1770:0 1777:0 1778:0 '),\n(130,'Valley of Bones',1,405,2657,33,40,0,-2323.83,1355.6,63.5887,1.00444,'1812:0 1813:0 '),\n(131,'Rage Scar Hold',1,357,1115,38,50,0,-3839.01,1752.22,143.122,4.59397,'1927:0 1928:0 '),\n(132,'Ruins of Solarsal',1,357,1117,38,50,2,-4932.61,3653.2,12.2193,0.301741,'1940:0 1941:0 140:0 '),\n(133,'Ravaged Twilight Camp',1,1377,3100,53,60,0,-6206.25,1766.95,17.464,4.2566,'2318:0 2319:0 '),\n(134,'Twilight Post',1,1377,3098,55,60,0,-6753.94,1661.67,6.34336,0.541008,'2319:0 2320:0 2321:0 2322:0 '),\n(135,'Twilight Outpost',1,1377,3099,55,60,0,-7929.11,1833.28,4.86506,0.733634,'2336:0 2337:0 2338:0 '),\n(136,'Woodpaw Hills',1,357,2519,38,50,0,-4867.47,196.488,57.1639,3.31322,'1991:0 1992:0 '),\n(137,'Lariss Pavillion',1,357,2518,38,50,0,-4097.42,96.644,76.2811,5.8877,'2004:0 2006:0 2007:0 '),\n(138,'Slither Rock',0,46,2419,48,56,0,-7653.86,-2991.1,135.917,1.62615,'648:0 650:0 652:0 '),\n(139,'Flame Crest',0,46,251,48,56,5,-7486.64,-2184.45,166.505,5.87909,'646:0 '),\n(140,'Shalzarus Lair',1,357,3117,38,50,0,-5418.89,3677.45,4.7662,3.81836,'132:0 1942:0 '),\n(142,'Timbermaw Hold',1,618,618,53,60,0,6889.31,-2300.49,584.754,3.03017,'1196:0 1202:0 '),\n(143,'The Ruins of KelTheril',1,618,2252,53,60,0,6430.1,-4328.62,666.714,0.935105,'1216:0 '),\n(144,'Dun Mandarr',1,618,2248,53,60,0,5667.17,-4495.06,769.144,0.689558,'1255:0 1258:0 1259:0 1260:0 '),\n(145,'Talrendis Point',1,16,3137,43,54,3,2689.78,-3854.8,103.228,5.51976,'1270:0 '),\n(147,'Moon Horror Den',1,618,3139,53,60,0,7122.72,-4596.74,637.499,3.77862,'1225:0 '),\n(148,'Timbermaw Hold',1,361,1769,46,56,0,6811.82,-2090.36,625.019,5.71392,'1148:0 1196:0 '),\n(149,'Irontree Cavern',1,361,1768,46,56,0,6464.49,-1502.77,438.462,4.97283,'1142:0 1143:0 1183:0 1184:0 '),\n(150,'Bloodvenom Post',1,361,1997,46,56,5,5070.53,-333.931,367.077,5.98328,'1164:0 '),\n(151,'Sishir Canyon',1,406,2541,13,25,0,599.482,622.34,74.9622,3.1924,'1645:0 '),\n(152,'Cragpool Lake',1,406,463,13,25,0,1491.34,85.8624,11.9254,3.12763,'1649:0 1650:0 1651:0 1652:0 '),\n(153,'Windshear Mine',1,406,461,13,25,0,981.949,-358.9,14.3123,3.71479,'1648:0 1654:0 1655:0 '),\n(154,'The Talondeep Path',1,406,1277,13,25,0,1531.94,-576.57,67.9212,5.18318,'1653:0 1655:0 168:0 '),\n(155,'The Talon Den',1,406,468,18,25,4,2416.89,1792.39,393.641,3.36062,'1692:0 1693:0 '),\n(156,'The Ruins of OrdilAran',1,331,412,18,30,0,3476.85,-104.536,2.98631,5.31466,'157:0 1029:0 1031:0 1033:0 '),\n(157,'Bathrans Haunt',1,331,411,18,30,0,3827.37,-161.305,-0.60768,3.24941,'1028:0 156:0 '),\n(158,'Zoramgar Outpost',1,331,2897,18,30,5,3362.22,1010.16,3.59814,2.49558,'1035:0 1036:0 1037:0 '),\n(159,'Falfarren River',1,331,433,18,30,0,2247.11,-2187.63,105.176,0.680699,'1078:0 1079:0 '),\n(160,'Xavian',1,331,429,18,30,0,2931.82,-2808,212.839,0.056247,'1080:0 1081:0 1085:0 '),\n(161,'Forest Song',1,331,2358,18,30,3,2936.03,-3270.73,159.15,3.69459,'1085:0 1091:0 1093:0 '),\n(162,'Demon Fall Canyon',1,331,435,18,30,0,1708.23,-3157.86,94.4801,5.70126,'1099:0 1100:0 1104:0 '),\n(163,'Silverwing Outpost',1,331,2360,18,30,0,1776.04,-2061.14,106.556,1.50326,'1109:0 '),\n(164,'The DorDanil Barrow Den',1,331,432,18,30,0,1776.92,-2583.5,85.9882,3.82761,'169:0 1113:0 1115:0 1117:0 '),\n(165,'Silverwind Refuge',1,331,420,18,30,0,2141.6,-1189.65,96.7733,3.54353,'1063:0 1064:0 1066:0 '),\n(166,'Greenpaw Village',1,331,2359,18,30,0,2274.68,-1460.01,90.2583,4.48209,'1066:0 1068:0 1069:0 '),\n(167,'Bloodtooth Camp',1,331,2357,18,30,0,1668.68,-1469.31,140.228,5.79562,'1067:0 '),\n(168,'The Talondeep Path',1,406,1277,13,25,0,1941.31,-740.96,113.545,2.12791,'154:0 1063:0 '),\n(169,'Warsong Labor Camp',1,331,3177,18,30,0,1575.91,-2463.94,98.549,2.24558,'164:0 1110:0 '),\n(170,'Aridens Camp',0,41,2560,50,60,0,-10443.3,-2141.1,90.7796,5.92189,'801:0 '),\n(171,'Deadwind Ravine',0,41,2558,50,60,0,-10607.9,-1904.89,117.201,2.66188,'798:0 799:0 '),\n(172,'Sleeping Gorge',0,41,2938,50,60,0,-10740.7,-1951.45,121.127,3.69664,'800:0 801:0 '),\n(173,'Chillwind Camp',0,28,3197,48,56,3,940.955,-1419.2,66.7723,0.796556,'271:0 272:0 334:0 '),\n(174,'Camp Taurajo',1,17,378,8,25,5,-2353.97,-1913.23,95.7826,0.204344,'1550:0 1551:0 1553:0 1554:0 1584:0 1585:0 1814:0 '),\n(175,'Splintertree Post',1,331,431,18,30,5,2251.83,-2538.3,90.4185,6.01297,'1113:0 1114:0 '),\n(177,'Bones of Grakkarond',1,1377,3257,53,60,0,-7228.09,854.674,-1.38994,1.38965,'2323:0 2324:0 2335:0 2343:0 2348:0 2349:0 2350:0 '),\n(178,'Woodpaw Den',1,357,2520,38,50,0,-4775.84,905.452,142.986,4.17326,'1980:0 '),\n(179,'Revantusk Village',0,47,3317,38,50,5,-573.459,-4590.51,10.4122,3.48476,'407:0 '),\n(180,'Thorium Point',0,51,1446,43,54,0,-6521.12,-1190.02,309.255,4.39589,'590:0 '),\n(183,'The Weeping Cave',0,28,198,48,56,0,2249.61,-2389.63,59.8017,5.27414,'244:0 255:0 256:0 '),\n(184,'Valors Rest',1,1377,3077,50,60,0,-6382.38,-308.522,-1.89701,4.0769,'2292:0 2293:0 '),\n(185,'Yojamba Isle',0,33,3357,33,45,0,-11838,1268.18,1.74176,4.79629,'894:0 887:0 895:0 896:0 '),\n(186,'Misty Reed Post',0,8,1978,33,45,4,-10854.8,-4093.43,21.7429,5.03063,'825:0 80:0 826:0 '),\n(187,'Brackenwall Village',1,15,496,33,45,5,-3113.73,-2860.5,34.4097,2.94207,'1873:0 100:0 102:0 '),\n(188,'Cenarion Hold',1,1377,3425,53,60,3,-6886.15,718.398,42.798,6.10305,'2305:0 2306:0 '),\n(189,'Twilight Base Camp',1,1377,2739,53,60,0,-6969.25,1167.66,12.8483,1.06764,'2322:0 2323:0 2324:0 2325:0 2335:0 '),\n(191,'Twilights Run',1,1377,3446,55,60,0,-6332.81,164.268,6.01109,2.33216,'2295:0 2296:0 2297:0 2299:0 '),\n(192,'Ortells Hideout',1,1377,2744,53,60,0,-7601.34,285.736,2.83228,0.367888,'2349:0 2357:0 2358:0 '),\n(193,'Bronzebeard Encampment',1,1377,3427,53,60,0,-7993.44,1118.16,-1.76652,1.00873,'2339:0 2340:0 2341:0 2344:0 2347:0 2346:0 '),\n(196,'BLC1',0,4,4,43,54,0,-11202.2,-3034.46,6.232,1.13173,'839:0 841:0 845:0 852:0 854:0 '),\n(199,'Under Attack - Eastern Plaguelands',0,139,2258,53,60,0,2492.32,-3803.41,177.692,4.09879,'248:0 '),\n(200,'Ivars Patch',0,130,239,8,20,4,1233.05,1214.28,52.5845,3.07876,'201:0 298:0 299:0 303:0 '),\n(201,'Valgans Field',0,130,227,8,20,4,908.754,1255.63,45.9684,0.575633,'299:0 302:0 303:0 200:0 '),\n(211,'Eastwall Tower - Horde',0,139,2271,53,60,0,2550.77,-4783.57,109.501,5.47479,'85:0 235:0 237:0 250:0 '),\n(215,'Plaguewood Tower - Horde, Progressing',0,139,4067,53,60,0,2991.34,-3045.27,119.143,2.65173,'84:0 241:0 242:0 '),\n(220,'Northpass Tower - Horde, Contested',0,139,2275,53,60,0,3168.41,-4356.58,138.976,4.89792,'236:0 237:0 238:0 '),\n(230,'Crown Guard Tower - Alliance',0,139,2263,53,60,0,1861.6,-3701.08,160.834,4.34226,'248:0 247:0 249:0 2369:0 '),\n(233,'Mudsprocket',1,15,4010,33,45,1,-4601.09,-3173.17,38.4677,3.21013,'1909:0 106:0 105:0 1911:0 '),\n(234,'LightsHopeChapel',0,139,2268,53,60,1,2207.38,-5321.35,92.2225,0.203619,'85:0 252:0 '),\n(235,'BlackwoodLake',0,139,2624,53,60,0,2464.31,-4192.32,86.7625,5.25334,'211:0 236:0 250:0 '),\n(236,'EPL_hubN1',0,139,139,53,60,0,2895.84,-4274.37,91.0774,2.94428,'220:0 235:0 237:0 240:0 '),\n(237,'Northdale',0,139,2272,53,60,0,2939.45,-4922.8,110.201,2.76758,'236:0 211:0 220:0 238:0 '),\n(238,'ZulMasharEntrance',0,139,2273,53,60,0,3243.57,-4728.42,157.177,1.67982,'237:0 220:0 239:0 '),\n(239,'MazraAlor',0,139,2274,53,60,0,3446.77,-4987,196.046,5.53613,'238:0 '),\n(240,'PlaguewoodEast',0,139,2277,53,60,0,3031.09,-3786.79,119.967,4.37961,'236:0 241:0 242:0 '),\n(241,'PlaguewoodSouth',0,139,2277,53,60,0,2764.18,-3442.19,97.1331,4.24216,'215:0 240:0 242:0 '),\n(242,'PlaguewoodCenter',0,139,2277,53,60,0,3137.26,-3403.95,139.517,0.937594,'215:0 240:0 241:0 '),\n(243,'TerrorweTunnelWest',0,139,2619,53,60,0,2724.41,-2453.2,66.836,5.42496,'244:0 84:0 '),\n(244,'ThondorilRiverSouth',0,139,2619,53,60,0,2417.75,-2469.65,72.4504,0.00296164,'183:0 243:0 245:0 '),\n(245,'EPL_hubSW',0,139,139,53,60,0,2076.2,-2853.69,86.3391,0.879086,'244:0 246:0 248:0 255:0 '),\n(246,'EPL_hubSWRoad',0,139,139,53,60,0,1811.3,-3046.98,75.4985,1.09939,'245:0 247:0 255:0 '),\n(247,'Undercroft',0,139,2261,53,60,0,1600.37,-3283.08,91.4858,0.567285,'246:0 230:0 '),\n(248,'EPL_hubSW2',0,139,139,53,60,0,2175.83,-3487.76,123.024,5.90406,'199:0 230:0 245:0 '),\n(249,'EPL_SRoad',0,139,139,53,60,0,1841.76,-4088.5,101.961,5.05584,'230:0 250:0 '),\n(250,'CorinsCrossing',0,139,2264,53,60,0,2074.45,-4556.23,73.5772,0.745981,'211:0 235:0 249:0 251:0 252:0 '),\n(251,'ScarletBaseCamp',0,139,2265,53,60,0,1656.05,-4826.35,87.7738,0.384695,'250:0 252:0 253:0 '),\n(252,'PestilentScar',0,139,2622,53,60,0,2013.6,-4964.85,73.6116,5.58402,'234:0 250:0 251:0 253:0 '),\n(253,'TyrshandEntrance',0,139,2266,53,60,0,1690.77,-5201.46,74.6226,4.83788,'251:0 252:0 254:0 '),\n(254,'Tyrshand',0,139,2266,53,60,0,1609.91,-5528.27,111.168,4.2076,'253:0 '),\n(255,'ThondorilRiverBridge',0,139,2619,53,60,0,1924.72,-2608.2,62.8109,4.6761,'183:0 245:0 246:0 256:0 '),\n(256,'GahrronWithering',0,28,201,48,56,0,1768.07,-2280.14,59.7087,0.010807,'183:0 255:0 257:0 258:0 '),\n(257,'WritingHaunt',0,28,202,48,56,0,1506.64,-1862.76,59.0986,5.271,'256:0 258:0 259:0 266:0 269:0 '),\n(258,'WPL_hubC2',0,28,28,48,56,0,1760.12,-1779.45,64.8245,4.87437,'256:0 257:0 259:0 260:0 266:0 269:0 '),\n(259,'DalsonTears',0,28,200,48,56,0,1864.12,-1558.81,59.2668,3.44495,'257:0 258:0 260:0 266:0 267:0 269:0 '),\n(260,'WPL_hubN1',0,28,28,48,56,0,2122.47,-1665.81,64.0458,5.36013,'258:0 259:0 261:0 262:0 '),\n(261,'NorthridgeLumberCamp',0,28,192,48,56,0,2421.88,-1647.26,103.541,5.77835,'260:0 '),\n(262,'WPL_hubN2',0,28,28,48,56,0,2425.99,-1947.45,109.098,4.71217,'260:0 263:0 '),\n(263,'HearthglenTower',0,28,28,48,56,0,2701.43,-1944.23,107.238,0.832291,'262:0 265:0 '),\n(264,'Hearthglen',0,28,203,48,56,0,2924.12,-1426.31,150.782,1.09736,'265:0 '),\n(265,'HearthglenEntrance',0,28,190,48,56,0,2782.62,-1612.54,129.551,0.826396,'264:0 263:0 '),\n(266,'WPL_hubC1',0,28,28,48,56,0,1680.03,-1358.64,69.8578,5.02985,'268:0 257:0 258:0 259:0 267:0 269:0 270:0 274:0 '),\n(267,'FelstoneField',0,28,199,48,56,0,1795.08,-1188.53,59.8914,5.54821,'268:0 259:0 266:0 269:0 273:0 274:0 '),\n(268,'AndorhalW',0,28,193,48,56,0,1336.99,-1272.01,57.8614,2.26525,'266:0 267:0 269:0 270:0 272:0 '),\n(269,'AndorhalNE',0,28,193,48,56,0,1540.11,-1606.19,65.1216,5.937,'257:0 258:0 259:0 266:0 267:0 268:0 270:0 '),\n(270,'AndorhalEntranceSE',0,28,197,48,56,0,1294.98,-1678.78,62.5727,3.83801,'268:0 266:0 269:0 271:0 '),\n(271,'SorrowHillCR',0,28,197,48,56,0,1162.78,-1758.3,60.6308,3.04279,'48:0 173:0 270:0 334:0 '),\n(272,'AndorhalEntranceSW',0,28,28,48,56,0,1214.59,-1145.63,60.8962,5.48342,'268:0 173:0 334:0 '),\n(273,'Bulwark',0,28,813,48,56,5,1718.17,-802.509,57.5466,1.68044,'267:0 274:0 275:0 276:0 '),\n(274,'WPL_hubE',0,28,813,48,56,0,1663.85,-956.731,69.3084,0.651574,'266:0 267:0 273:0 '),\n(275,'TG_hubSE',0,85,85,1,10,4,1806.63,-369.504,32.3876,6.02566,'273:0 276:0 277:0 '),\n(276,'BalnirFarmstead',0,85,165,6,10,4,2029.54,-432.459,35.4011,5.30269,'273:0 275:0 277:0 '),\n(277,'TG_hubC2',0,85,85,1,10,4,2029.86,-87.8105,35.5077,4.49765,'2:0 275:0 276:0 '),\n(278,'BrillEntrance',0,85,159,1,10,4,2296.05,429.197,35.7333,5.74799,'2:0 279:0 285:0 297:0 '),\n(279,'GarrensHauntGraves',0,85,85,4,10,4,2599.87,521.024,17.2769,5.97968,'2:0 278:0 280:0 281:0 '),\n(280,'GarrensHaunt',0,85,164,6,10,4,2883.52,376.589,25.8553,5.87914,'279:0 281:0 284:0 '),\n(281,'BrightwaterLake',0,85,85,1,10,4,2634.44,79.5244,31.089,6.13244,'2:0 279:0 280:0 282:0 284:0 '),\n(282,'NorthCoastE',0,85,168,7,10,4,3032.54,-341.266,5.44748,2.52746,'281:0 283:0 '),\n(283,'NorthCoastC',0,85,168,1,10,4,2935.15,41.7046,6.92148,4.82869,'282:0 284:0 '),\n(284,'NorthCoastW',0,85,168,1,10,4,2984.21,388.32,7.96326,4.49688,'280:0 281:0 283:0 '),\n(285,'ColdHearthManor',0,85,166,1,10,4,2107.98,617.879,35.0405,0.497239,'278:0 18:0 286:0 287:0 297:0 '),\n(286,'TG_hubC1',0,85,85,1,10,0,2204.7,1063.28,28.6853,4.1572,'285:0 287:0 288:0 292:0 294:0 '),\n(287,'CrusadersOutpost',0,85,85,1,10,0,1797.65,703.831,48.147,1.54771,'286:0 285:0 297:0 '),\n(288,'TG_hubNE',0,85,85,1,10,4,2446.9,1082.07,58.5203,0.911539,'286:0 289:0 292:0 293:0 294:0 '),\n(289,'AgamandMillsEntrance',0,85,157,4,10,4,2701.33,937.571,110.912,0.173269,'288:0 290:0 291:0 '),\n(290,'AgamandMillsW',0,85,157,6,10,4,2889.98,1065.92,105.434,5.38438,'289:0 291:0 '),\n(291,'AgamandMillsE',0,85,157,6,10,4,2973.71,619.932,93.8373,1.31013,'289:0 290:0 '),\n(292,'SollidenFarmstead',0,85,156,1,10,4,2329.03,1407.79,33.3337,0.622907,'286:0 288:0 293:0 294:0 '),\n(293,'CrusadersOutpost',0,85,85,1,10,4,2430.28,1585.02,37.0619,0.587566,'288:0 292:0 '),\n(294,'UndeadStartExit',0,85,85,5,10,4,2197.51,1192.39,31.5497,5.11342,'288:0 286:0 292:0 295:0 '),\n(295,'UndeadStartEnd',0,85,154,1,10,4,2061.91,1418.99,63.8379,5.30978,'294:0 83:0 4:0 296:0 '),\n(296,'UndeadStartE',0,85,154,1,10,4,1805.3,1351.42,87.1354,0.232168,'295:0 4:0 '),\n(297,'TH_exitS',0,85,85,7,12,4,1642.09,555.658,33.4922,2.88878,'278:0 285:0 287:0 298:0 '),\n(298,'ShiningStrandN',0,130,927,8,14,4,1331.69,679.903,40.5373,1.02387,'297:0 200:0 '),\n(299,'DeadField',0,130,240,8,20,4,1076.06,1545.35,28.6412,4.79771,'201:0 300:0 301:0 302:0 303:0 200:0 '),\n(300,'SkitteringDark',0,130,226,8,20,4,1271.34,1974.49,17.8502,4.31862,'299:0 301:0 '),\n(301,'NorthTidesHollow',0,130,305,8,20,4,833.25,1880.5,21.9868,5.06279,'299:0 300:0 '),\n(302,'SPF_hubC1',0,130,130,8,20,4,867.729,1518.72,35.2045,0.160734,'201:0 299:0 303:0 304:0 '),\n(303,'SPF_hubC2',0,130,130,8,20,4,934.532,1356.51,43.5579,3.0887,'201:0 299:0 302:0 200:0 305:0 '),\n(304,'SPF_hubC3',0,130,130,8,20,4,736.764,1449.26,64.4284,0.457609,'302:0 305:0 306:0 '),\n(305,'SPF_hubC4',0,130,130,8,20,4,587.903,1352.93,90.6192,0.359403,'303:0 304:0 306:0 17:0 313:0 '),\n(306,'DecrepitFerry',0,130,237,13,20,4,664.305,1021.48,45.3265,5.10911,'304:0 305:0 307:0 '),\n(307,'FenrisIsle',0,130,172,15,20,4,704.961,674.359,43.3624,1.57874,'306:0 308:0 311:0 '),\n(308,'FenrisIsleSE',0,130,172,15,20,4,653.059,335.097,35.0481,1.33722,'307:0 309:0 '),\n(309,'FenrisIsleE',0,130,232,16,20,4,866.03,78.8803,34.2361,2.23258,'308:0 310:0 '),\n(310,'DawningIsles',0,130,232,17,22,4,1199.57,370.42,34.3257,3.13185,'309:0 '),\n(311,'FenrisKeep',0,130,172,8,20,4,1013.6,734.689,59.2651,3.23986,'307:0 '),\n(312,'DeepElemMineFork',0,130,213,8,20,4,271.231,1110.33,80.2136,5.99661,'313:0 314:0 317:0 318:0 '),\n(313,'SPF_hubC5',0,130,130,8,20,4,385.877,1253.37,80.2878,0.320144,'305:0 312:0 315:0 '),\n(314,'DeepElemMine',0,130,213,8,20,4,376.82,1082.54,106.396,3.03959,'312:0 '),\n(315,'SPF_hubC6',0,130,130,8,20,4,194.263,1268.01,72.8331,6.23812,'313:0 316:0 317:0 318:0 '),\n(316,'OlsensFarthing',0,130,229,8,20,4,171.155,1487.65,114.395,4.84404,'315:0 '),\n(317,'SPF_DalaranCamp1',0,130,130,8,20,4,-50.4703,1331.43,60.9321,5.92005,'315:0 312:0 318:0 319:0 323:0 '),\n(318,'SPF_hubS1',0,130,130,8,20,4,-132.172,1170.25,63.4384,0.508657,'315:0 317:0 312:0 319:0 323:0 326:0 '),\n(319,'AmberhillEntrance',0,130,233,11,20,4,-131.822,896.74,65.831,1.54539,'317:0 318:0 320:0 321:0 323:0 325:0 '),\n(320,'AmberhillHall',0,130,233,13,20,4,-141.972,812.61,63.737,1.09457,'319:0 '),\n(321,'AmberhillFarms',0,130,233,15,20,4,88.1028,694.265,60.6053,2.4376,'322:0 319:0 '),\n(322,'AmberhillMurlocCamp',0,130,130,15,20,4,434.265,696.251,33.7837,3.19747,'321:0 '),\n(323,'SPF_hubS2',0,130,130,8,20,4,-330.828,1311.68,37.1012,1.70757,'317:0 318:0 319:0 324:0 326:0 327:0 '),\n(324,'PyrewoodVillage',0,130,204,8,20,4,-383.772,1597.45,16.8392,4.90611,'323:0 '),\n(325,'SPF_exitSE',0,130,130,15,20,4,-543.136,724.877,91.2236,0.975962,'319:0 326:0 357:0 '),\n(326,'SPF_hubS3',0,130,130,8,20,4,-503.287,1113.31,76.93,0.514545,'318:0 323:0 325:0 '),\n(327,'GreymaneWall',0,130,230,8,20,4,-744.895,1522.56,15.5245,5.84742,'323:0 '),\n(328,'DandredsFold',0,36,1682,35,40,0,1235.47,-274.821,40.3856,4.48552,'329:0 '),\n(329,'UplandsN',0,36,284,28,40,0,1085.27,-663.59,87.8456,1.24773,'328:0 330:0 '),\n(330,'UplandsS',0,36,284,28,40,0,958.693,-748.597,114.797,4.04964,'329:0 331:0 335:0 '),\n(331,'Strahnbard',0,36,280,28,40,0,683.909,-963.157,164.301,0.671641,'330:0 332:0 343:0 '),\n(332,'AM_hubE1',0,36,36,28,40,0,615.654,-1043.7,168.11,0.331968,'331:0 333:0 381:0 '),\n(333,'AM_hubE2',0,36,1684,36,42,0,641.277,-1429.39,84.6042,5.55291,'332:0 334:0 '),\n(334,'ChillwindCampRoad',0,28,3197,48,56,0,966.365,-1511.29,75.4645,2.81971,'173:0 271:0 272:0 333:0 '),\n(335,'SlaughterHollowNE',0,36,283,28,40,0,802.9,-628.854,149.733,3.01018,'330:0 336:0 337:0 '),\n(336,'SlaughterHollowN',0,36,283,28,40,0,835.191,-445.445,134.228,4.48673,'335:0 '),\n(337,'SlaughterHollowC',0,36,281,28,40,0,620.637,-522.586,179.928,5.73159,'335:0 338:0 343:0 '),\n(338,'RuinsOfAlterac',0,36,281,28,40,0,631.058,-371.491,154.481,2.42898,'340:0 337:0 339:0 '),\n(339,'RuinsOfAlteracSW',0,36,281,28,40,0,500.776,-173.116,151.449,5.19357,'340:0 338:0 341:0 '),\n(340,'RuinsOfAlteracSE',0,36,281,28,40,0,397.344,-248.661,161.727,5.94755,'338:0 339:0 '),\n(341,'RuinsOfAlteracE',0,36,281,28,40,0,573.088,-14.3215,142.366,3.66008,'339:0 342:0 '),\n(342,'RuinsOfAlteracSSW',0,36,1683,28,40,0,252.323,-82.4394,141.544,0.263228,'341:0 344:0 '),\n(343,'RuinsOfAlteracE',0,36,1357,28,40,0,493.629,-621.553,172.877,0.602885,'331:0 337:0 344:0 345:0 380:0 '),\n(344,'RuinsOfAlteracS',0,36,1683,28,40,0,141.788,-316.452,150.648,1.12125,'342:0 343:0 346:0 '),\n(345,'CorrahnsDagger',0,36,1679,28,40,0,-45.3608,-581.074,153.724,5.82187,'343:0 346:0 380:0 '),\n(346,'CorrahnsDaggerFork',0,36,1679,28,40,0,57.1052,-405.389,132.108,2.70582,'344:0 345:0 347:0 385:0 '),\n(347,'Headland',0,36,1680,28,40,0,-163.833,-293.019,151.411,0.123425,'346:0 348:0 '),\n(348,'GavinsNaze',0,36,1677,28,40,0,-63.0062,-197.056,131.24,2.72704,'347:0 349:0 350:0 355:0 '),\n(349,'GavinsNazeTop',0,36,1677,28,40,0,-125.184,-59.9939,147.694,5.63693,'348:0 350:0 '),\n(350,'GavinsNazeW',0,36,279,28,40,0,68.1015,-53.44,99.6287,3.99152,'348:0 349:0 351:0 352:0 353:0 '),\n(351,'DalaranCraterN',0,36,279,28,40,4,466.751,167.322,41.9053,3.38088,'350:0 352:0 '),\n(352,'DalaranCraterS',0,36,279,28,40,4,90.2654,237.935,43.2902,5.2894,'351:0 350:0 353:0 354:0 '),\n(353,'LordamereInternmentCamp',0,36,278,28,40,4,-90.5356,218.366,53.2755,6.11997,'352:0 350:0 354:0 '),\n(354,'HillsbradFieldsC',0,267,286,18,30,4,-499.681,78.0454,56.6165,0.278575,'352:0 353:0 356:0 355:0 '),\n(355,'HillsbradFieldsE',0,267,286,18,30,0,-437.039,-135.243,56.2029,2.13409,'354:0 356:0 348:0 385:0 '),\n(356,'HillsbradFieldsSRoad',0,267,267,18,30,0,-639.845,-98.2014,47.262,0.172558,'20:0 358:0 360:0 354:0 355:0 361:0 385:0 357:0 '),\n(357,'SouthPointTower',0,267,285,18,30,5,-613.976,388.915,83.0604,2.91123,'325:0 356:0 358:0 '),\n(358,'WesternStrandW',0,267,295,18,30,0,-979.029,273.179,7.90667,5.62479,'356:0 359:0 357:0 '),\n(359,'WesternStrandSW',0,267,295,18,30,0,-1128.84,276.704,0.0000662804,5.89576,'358:0 360:0 '),\n(360,'WesternStrandS',0,267,295,18,30,0,-1156.55,7.61478,0.00000548363,6.16081,'359:0 356:0 361:0 '),\n(361,'WesternStrandS',0,267,295,18,30,0,-1102.38,-114.03,0.0000309944,0.148599,'362:0 360:0 356:0 '),\n(362,'WesternStrandE',0,267,271,18,30,0,-962.262,-506.545,2.13023,1.90396,'361:0 363:0 20:0 '),\n(363,'SouthshoreS',0,267,271,18,30,0,-974.276,-592.998,0.229758,0.372044,'362:0 364:0 20:0 '),\n(364,'EasternStrandW',0,267,294,18,30,0,-1012.85,-790.213,9.01406,5.30042,'363:0 365:0 368:0 376:0 '),\n(365,'EasternStrandC',0,267,294,18,30,0,-1183.14,-847.579,1.43171,6.18988,'364:0 366:0 '),\n(366,'EasternStrandS',0,267,294,18,30,0,-1311.64,-1052.47,18.2271,0.929683,'365:0 367:0 368:0 '),\n(367,'DunGarok',0,267,290,18,30,4,-1256.01,-1190.37,38.9786,2.03514,'366:0 368:0 376:0 '),\n(368,'DunGarokRoad',0,267,267,18,30,0,-1049.49,-1239.84,53.3175,1.75045,'364:0 366:0 367:0 369:0 373:0 '),\n(369,'HillsbradFoothillsExitSE',0,267,267,18,30,0,-784.955,-1512.45,56.6724,1.97822,'370:0 368:0 373:0 410:0 '),\n(370,'HillsbradFoothillsExitE',0,267,275,18,30,0,-594.279,-1721.03,62.3187,2.25507,'369:0 371:0 411:0 '),\n(371,'DurnholdeNE',0,267,275,18,30,0,-383.173,-1720.01,90.0634,3.41784,'372:0 370:0 '),\n(372,'DurnholdeNNE',0,267,275,18,30,0,-316.76,-1609.34,86.0559,5.49914,'371:0 377:0 386:0 '),\n(373,'DurnholdeS',0,267,267,18,30,0,-669.891,-1326.66,66.6887,5.65621,'376:0 374:0 368:0 369:0 383:0 '),\n(374,'DurnholdeInside',0,267,275,18,30,0,-518.661,-1435.16,64.889,2.5637,'373:0 375:0 '),\n(375,'DurnholdeInsideDeep',0,267,275,18,30,0,-512.473,-1541.62,67.1947,1.69387,'374:0 '),\n(376,'NethanderStead',0,267,289,18,30,0,-915.831,-926.49,31.1754,1.19711,'364:0 367:0 373:0 383:0 20:0 '),\n(377,'DurnholdeN',0,267,275,18,30,0,-298.033,-1310.71,76.9034,4.69017,'372:0 378:0 383:0 '),\n(378,'DurnholdeNN',0,267,267,18,30,0,-37.1467,-1296.59,83.7166,3.13705,'377:0 21:0 '),\n(379,'TarrenMillN',0,267,267,18,30,4,188.047,-974.547,75.5356,0.0209713,'21:0 381:0 '),\n(380,'GallowsCorner',0,36,1357,28,40,0,324.254,-615.115,145.246,3.03887,'343:0 345:0 21:0 382:0 '),\n(381,'SoferasCorner',0,36,36,28,40,0,461.934,-926.633,129.374,2.72668,'379:0 332:0 382:0 '),\n(382,'SoferasNaze',0,36,1678,28,40,0,248.314,-839.928,146.333,0.818164,'381:0 380:0 '),\n(383,'HFH_bridge',0,267,267,18,30,0,-487.607,-967.55,34.4918,4.54488,'377:0 376:0 373:0 384:0 '),\n(384,'DarrowHillE',0,267,267,18,30,0,-323.998,-672.57,54.6417,3.9048,'21:0 383:0 385:0 20:0 '),\n(385,'DarrowHillW',0,267,1056,18,30,0,-332.483,-447.42,58.4647,0.297842,'346:0 355:0 356:0 384:0 20:0 '),\n(386,'HinterlandsEntrance',0,47,47,38,50,0,-77.4076,-1845.63,143.116,2.46164,'372:0 55:0 '),\n(387,'ZunWatha',0,47,352,38,50,0,-11.9998,-2493.37,119.659,1.99629,'55:0 82:0 388:0 391:0 '),\n(388,'QuelDanilS',0,47,47,38,50,0,65.3995,-2664.2,111.823,5.20269,'55:0 82:0 387:0 389:0 390:0 391:0 392:0 '),\n(389,'QuelDanil',0,47,350,38,50,4,210.196,-2789.46,122.156,1.50935,'388:0 390:0 392:0 '),\n(390,'HL_hubW',0,47,47,38,50,0,132.208,-2876.17,116.583,1.69588,'388:0 389:0 392:0 393:0 397:0 398:0 '),\n(391,'BogensLedge',0,47,1887,38,50,0,-198.398,-2585.67,120.378,6.18051,'387:0 388:0 393:0 '),\n(392,'HiriWatha',0,47,1885,38,50,0,-35.4616,-2815.33,122.143,0.435323,'389:0 390:0 388:0 393:0 '),\n(393,'ShadraAlorEntrance',0,47,47,38,50,0,-160.179,-2955.33,115.773,1.96371,'391:0 392:0 390:0 395:0 394:0 396:0 398:0 400:0 '),\n(394,'ShadraAlorE',0,47,353,38,50,0,-366.126,-2955.41,89.39,6.27554,'393:0 395:0 396:0 '),\n(395,'ShadraAlorS',0,47,353,38,50,0,-455.461,-2839.4,105.834,6.08704,'393:0 394:0 396:0 '),\n(396,'ShadraAlorW',0,47,353,38,50,0,-296.621,-2833,96.7074,5.15045,'393:0 395:0 394:0 '),\n(397,'AgolWatha',0,47,1884,38,50,0,397.177,-3352.2,123.451,2.24644,'390:0 398:0 399:0 '),\n(398,'CreepingRun',0,47,1886,38,50,0,116.576,-3466.05,107.658,1.12922,'393:0 397:0 390:0 399:0 400:0 401:0 '),\n(399,'SkulkRock',0,47,351,38,50,0,363.014,-3796.73,171.76,1.54745,'397:0 398:0 401:0 404:0 '),\n(400,'AltarOfZul',0,47,355,38,50,0,-147.861,-3319.03,121.957,3.93113,'393:0 398:0 '),\n(401,'HL_hubC',0,47,47,38,50,0,109.926,-3922.75,136.697,0.948588,'398:0 399:0 402:0 403:0 404:0 '),\n(402,'JinthaAlor',0,47,354,38,50,0,-217.196,-4159.98,118.665,0.453769,'401:0 403:0 '),\n(403,'OverlookCliffsS',0,47,307,38,50,0,-150.233,-4250.21,120.905,4.17653,'401:0 402:0 405:0 '),\n(404,'SeradaneBridge',0,47,351,38,50,0,472.513,-3907.18,113.731,5.88677,'399:0 401:0 409:0 '),\n(405,'OverlookCliffsRampTop',0,47,307,38,50,0,-243.665,-4377.48,105.997,0.98978,'403:0 406:0 '),\n(406,'OverlookCliffsRampBottom',0,47,307,38,50,0,-3.15739,-4629.26,13.899,2.27391,'405:0 407:0 408:0 '),\n(407,'RevantuskOutside',0,47,307,38,50,0,-355.789,-4475.87,11.3783,0.924997,'406:0 179:0 '),\n(408,'OverlookCliffsEnd',0,47,307,38,50,0,133.371,-4745.73,2.05405,2.27392,'406:0 '),\n(409,'Seradane',0,47,356,60,80,0,755.958,-4011.61,92.8808,5.95432,'404:0 '),\n(410,'ArathiExitNW',0,45,334,28,40,0,-889.426,-1677.32,57.6111,1.06053,'369:0 411:0 412:0 414:0 '),\n(411,'ArathiExitN',0,45,45,28,40,0,-684.458,-1831.3,53.3946,0.936824,'370:0 410:0 412:0 413:0 '),\n(412,'ArathiCW',0,45,45,28,40,0,-863.176,-1785.9,39.6302,5.66886,'410:0 411:0 413:0 414:0 '),\n(413,'NorthfoldManor',0,45,313,28,40,0,-822.895,-2039.83,34.4558,1.25884,'411:0 412:0 415:0 '),\n(414,'Arathi_hubW',0,45,45,28,40,0,-1190.48,-1731.63,56.3674,6.26181,'410:0 412:0 415:0 420:0 '),\n(415,'NorthfoldManor',0,45,313,28,40,0,-933.512,-2120.29,56.5869,2.05011,'78:0 413:0 414:0 416:0 '),\n(416,'RefugePointeExitN',0,45,315,28,40,0,-1158.07,-2706.9,52.0215,2.18796,'78:0 22:0 415:0 417:0 418:0 419:0 435:0 '),\n(417,'DabyrieFarmstead',0,45,45,28,40,0,-1091.19,-2856.55,42.4006,1.78073,'416:0 418:0 435:0 436:0 '),\n(418,'ArathiCO',0,45,336,28,40,0,-1352.09,-2738.95,59.0948,6.08275,'416:0 417:0 419:0 431:0 432:0 435:0 '),\n(419,'RefugePointeExitS',0,45,45,28,40,0,-1466.43,-2424.6,57.8277,5.98262,'22:0 78:0 416:0 418:0 420:0 427:0 429:0 431:0 '),\n(420,'StromgardeRoad',0,45,45,28,40,0,-1323.01,-1833.39,63.6564,0.712589,'421:0 414:0 419:0 427:0 '),\n(421,'StromgardeInside',0,45,324,28,40,0,-1576.29,-1800.48,67.6512,3.46934,'422:0 423:0 424:0 420:0 '),\n(422,'StromgardeKeep',0,45,324,28,40,0,-1660.06,-1803.63,83.0724,6.27321,'421:0 426:0 '),\n(423,'StromgardeE',0,45,324,28,40,0,-1602.44,-1922.26,67.2707,1.50115,'421:0 '),\n(424,'StromgardeW1',0,45,324,28,40,0,-1596.2,-1745.56,67.3627,5.09826,'421:0 425:0 '),\n(425,'StromgardeW2',0,45,324,28,40,0,-1720.34,-1736.69,52.4064,6.26851,'424:0 81:0 '),\n(426,'StromgardeKeepSide',0,45,324,28,40,0,-1681.32,-1933.25,80.6272,1.35821,'422:0 '),\n(427,'ArathiCI',0,45,335,28,40,0,-1517.62,-2100.44,22.3405,4.92548,'419:0 420:0 428:0 '),\n(428,'ThandolRoadN',0,45,45,28,40,0,-1995.23,-2466.74,78.7992,0.837489,'427:0 429:0 441:0 '),\n(429,'ArathiRoadSmid',0,45,45,28,40,0,-1763.42,-2422.8,59.5627,0.9015,'419:0 428:0 431:0 430:0 '),\n(430,'BoulderfistHall',0,45,316,28,40,0,-1941.13,-2794.22,85.7724,0.38314,'429:0 431:0 432:0 '),\n(431,'Arathi_hubE1',0,45,45,28,40,0,-1570.23,-2675.51,35.6533,6.03014,'419:0 418:0 429:0 432:0 435:0 430:0 '),\n(432,'Arathi_hubE2',0,45,317,28,40,0,-1705.19,-3021.39,31.689,0.310091,'433:0 418:0 431:0 434:0 430:0 '),\n(433,'WitherbarkVillage',0,45,317,28,40,0,-1867.12,-3365.42,56.1179,1.07782,'432:0 '),\n(434,'GoshekFarm',0,45,314,28,40,0,-1526.14,-3075.57,14.1487,2.82925,'432:0 435:0 '),\n(435,'Arathi_hubNE1',0,45,45,28,40,0,-1297.32,-3141.76,34.9289,1.25489,'416:0 417:0 418:0 431:0 434:0 436:0 438:0 '),\n(436,'Arathi_hubNE2',0,45,45,28,40,0,-1005.91,-3313.55,55.2766,2.32737,'435:0 417:0 437:0 438:0 '),\n(437,'ArathiCE',0,45,333,28,40,0,-839.717,-3280.93,78.5616,3.98495,'436:0 438:0 '),\n(438,'HammerfallEntrance',0,45,321,28,40,0,-1164.53,-3558.81,50.1497,1.47167,'435:0 436:0 437:0 23:0 439:0 '),\n(439,'DrywhiskerGorgeOutside',0,45,318,28,40,0,-1086,-3696.31,81.3913,2.10981,'438:0 440:0 '),\n(440,'DrywhiskerGorgeEntrance',0,45,318,28,40,0,-1083.95,-3820.83,128.504,1.71515,'439:0 44:0 '),\n(441,'ArathiRoadSbottom',0,45,880,28,40,0,-2248.64,-2487.38,80.1236,4.70713,'428:0 442:0 443:0 '),\n(442,'ThandolSpanCamp',0,45,45,28,40,0,-2249.4,-2633.38,78.816,1.44851,'441:0 '),\n(443,'ThandolSpanS',0,11,881,18,30,0,-2478.16,-2506.16,78.5672,0.110205,'441:0 444:0 '),\n(444,'DunModrCamp',0,11,881,18,30,0,-2609.79,-2494.69,80.9667,1.57693,'443:0 6:0 445:0 '),\n(445,'Wetlands_hubN1',0,11,11,18,30,0,-2937.95,-2470.57,26.6988,6.13028,'444:0 446:0 447:0 461:0 462:0 '),\n(446,'DaggerforgeHill',0,11,1016,18,30,0,-2859.63,-2907.96,33.1564,1.54551,'445:0 448:0 449:0 '),\n(447,'WL_hubC1',0,11,11,18,30,0,-3206.06,-2452.65,10.0327,5.76822,'445:0 448:0 455:0 461:0 462:0 '),\n(448,'Greenwarden',0,11,1025,18,30,0,-3254.89,-2726.4,9.41813,1.21683,'446:0 447:0 449:0 455:0 458:0 '),\n(449,'WL_hubE1',0,11,11,18,30,0,-3421.46,-3088.4,22.5006,4.5862,'446:0 448:0 450:0 451:0 455:0 456:0 '),\n(450,'RaptorRidge',0,11,1017,23,30,0,-3132.51,-3240.98,63.5747,2.76015,'449:0 451:0 '),\n(451,'DragonmawGates',0,11,1038,61,70,0,-3452,-3659.86,58.5533,1.08333,'449:0 450:0 452:0 '),\n(452,'DragonmawGatesI1',0,11,1038,61,70,0,-3594.66,-4056.85,113.625,1.23963,'451:0 453:0 '),\n(453,'DragonmawGatesI2',0,11,1038,61,70,0,-3956.61,-4019.52,170.857,6.00896,'452:0 454:0 '),\n(454,'DragonmawGatesI3',0,11,1037,61,70,0,-4145.01,-3662.88,204.651,5.17056,'92:0 453:0 '),\n(455,'WL_hubS1',0,11,1020,18,30,0,-3777.35,-2817.99,12.647,0.508038,'447:0 448:0 449:0 456:0 457:0 '),\n(456,'MosshideFen',0,11,1020,18,30,0,-3913.48,-3043.47,11.7092,0.398469,'449:0 455:0 457:0 '),\n(457,'ThelgenRock',0,11,1021,18,30,0,-3921.58,-2647.27,36.3203,4.94005,'455:0 456:0 479:0 '),\n(458,'AngerfangEnampmentE',0,11,1036,18,30,0,-3503.17,-2440.43,48.2306,5.48001,'448:0 459:0 '),\n(459,'AngerfangEnampmentW',0,11,1036,18,30,0,-3354.34,-2190.82,45.3521,1.88565,'458:0 460:0 461:0 '),\n(460,'AngerfangEnampmentTop',0,11,1036,18,30,0,-3458.4,-2008.76,119.804,5.31784,'459:0 '),\n(461,'WL_hubW1',0,11,11,18,30,0,-3186.98,-2117.49,15.8054,4.81126,'445:0 447:0 459:0 462:0 463:0 467:0 '),\n(462,'IronbeardsTomb',0,11,309,18,30,0,-2861.94,-2217.72,29.2628,4.06121,'445:0 447:0 461:0 463:0 464:0 '),\n(463,'MosshideWest',0,11,11,18,30,0,-2916.55,-1848.65,10.201,4.36986,'461:0 462:0 464:0 465:0 466:0 467:0 '),\n(464,'BaradinBayN',0,11,1023,18,30,5,-2598.33,-1745.42,10.159,4.05766,'462:0 463:0 465:0 466:0 '),\n(465,'BaradinBayNW',0,11,298,18,30,0,-2723.52,-1348.51,9.75282,4.1578,'464:0 463:0 466:0 474:0 '),\n(466,'BaradinBayW',0,11,1022,18,30,0,-2951.24,-1112.1,9.14625,2.36904,'464:0 463:0 465:0 474:0 475:0 476:0 '),\n(467,'WhelgarsOutside',0,11,1024,18,30,0,-3208.01,-1693.31,8.6748,4.04314,'461:0 463:0 468:0 473:0 474:0 '),\n(468,'WhelgarsEntrance',0,11,118,18,30,0,-3328.04,-1856.79,25.9266,3.14189,'467:0 469:0 470:0 '),\n(469,'WhelgarsBottom',0,11,118,18,30,0,-3540.59,-1803.75,24.3572,5.93869,'468:0 '),\n(470,'WhelgarsRamp',0,11,118,18,30,0,-3370.49,-1931.82,63.5201,0.805329,'468:0 471:0 '),\n(471,'WhelgarsRampTop',0,11,118,18,30,0,-3471.16,-1925.52,113.829,3.80162,'470:0 472:0 '),\n(472,'WhelgarsCave',0,11,118,18,30,0,-3569.75,-1976.96,117.678,0.449137,'471:0 '),\n(473,'BlueChannelMarsh',0,11,1018,18,30,0,-3582.96,-1324.33,9.39017,5.56012,'467:0 474:0 476:0 '),\n(474,'BluegillMarsh',0,11,1022,18,30,0,-3135.95,-1301.23,7.27194,1.32132,'465:0 466:0 467:0 473:0 475:0 476:0 '),\n(475,'BaradinBayS',0,11,298,18,30,0,-3202.27,-925.946,8.88303,5.67636,'466:0 474:0 476:0 '),\n(476,'MenethilHarborRoad',0,11,1022,18,30,2,-3333.27,-1053.79,8.28482,2.51317,'11:0 466:0 473:0 474:0 475:0 '),\n(477,'MenethilBayS',0,11,298,18,30,2,-3909.27,-638.054,4.91793,5.35238,'11:0 '),\n(478,'MenethilBayN',0,11,298,18,30,2,-3732.25,-581.622,4.65228,4.77512,'11:0 '),\n(479,'DunAlgazBottom',0,11,836,18,30,0,-4086.88,-2624.69,43.3702,1.60133,'457:0 480:0 '),\n(480,'DunAlgazMid1',0,11,836,18,30,0,-4092.37,-2403.53,100.01,4.74881,'479:0 481:0 '),\n(481,'DunAlgazMid2',0,11,836,18,30,0,-3994.82,-2377.44,120.415,3.60017,'480:0 482:0 '),\n(482,'DunAlgazMid3',0,11,836,18,30,0,-4070,-2464.84,155.161,3.20551,'481:0 483:0 '),\n(483,'DunAlgazMid4',0,11,836,18,30,0,-4418.61,-2470.44,212.203,0.00303268,'482:0 5:0 484:0 '),\n(484,'DunAlgazMid5',0,11,836,18,30,0,-4453.35,-2691.02,268.159,1.48548,'483:0 485:0 '),\n(485,'DunAlgazTop',0,38,837,8,20,0,-4741.84,-2699.03,325.269,6.26389,'484:0 91:0 487:0 488:0 '),\n(486,'NorthGatePassBottom',0,38,838,8,20,2,-4797.55,-2537.41,354.11,2.07534,'91:0 524:0 '),\n(487,'SilverStreamMine',0,38,149,8,20,2,-4801.44,-2968.22,321.735,1.63004,'91:0 485:0 488:0 '),\n(488,'StonewroughDamW',0,38,146,8,20,2,-4676.63,-3184.73,310.249,2.0836,'487:0 485:0 489:0 '),\n(489,'StonewroughDamC',0,38,146,8,20,2,-4761.78,-3306.52,310.258,4.81285,'488:0 490:0 '),\n(490,'StonewroughDamE',0,38,146,8,20,2,-4680.9,-3464.1,310.208,3.57506,'489:0 491:0 '),\n(491,'TheLochNE',0,38,38,8,20,2,-4859.79,-3631.09,306.481,2.35809,'490:0 492:0 495:0 496:0 497:0 '),\n(492,'MogroshStronghold',0,38,143,8,20,2,-4884.91,-3956.61,298.791,3.26837,'491:0 493:0 494:0 495:0 '),\n(493,'MogroshStrongholdTop',0,38,143,8,20,2,-4853.52,-4046.55,315.354,1.54756,'492:0 '),\n(494,'LochModanE',0,38,38,8,20,2,-5200.93,-4080.99,324.555,1.53421,'492:0 495:0 512:0 '),\n(495,'LochModanC2',0,38,38,8,20,2,-5358.15,-3755.11,304.073,5.92655,'491:0 492:0 494:0 496:0 506:0 512:0 '),\n(496,'LochIsleE',0,38,38,8,20,2,-4983.21,-3478.31,305.5,4.76612,'491:0 495:0 497:0 498:0 '),\n(497,'LochIsleW',0,38,38,8,20,2,-4869.1,-3302.75,307.516,3.90807,'491:0 496:0 498:0 '),\n(498,'LochIsleS',0,38,38,8,20,2,-5031.68,-3316.94,298.701,5.51616,'497:0 496:0 499:0 '),\n(499,'LochC1',0,38,556,8,20,2,-5138.3,-3125.08,302.046,2.10361,'498:0 502:0 '),\n(500,'LochW1',0,38,38,8,20,2,-5067.56,-2665.82,323.188,6.27801,'91:0 501:0 502:0 '),\n(501,'LochW2',0,38,38,8,20,2,-5383.73,-2741.02,362.182,0.255963,'500:0 502:0 503:0 '),\n(502,'LochW3',0,38,38,8,20,0,-5215.01,-2861.61,336.947,0.715418,'91:0 499:0 500:0 501:0 503:0 '),\n(503,'ThelsamarEntrance',0,38,38,8,20,0,-5405.86,-2884.97,342.8,0.491581,'501:0 502:0 19:0 504:0 515:0 '),\n(504,'LochC3',0,38,144,8,20,0,-5441.5,-3109.22,349.359,0.721317,'503:0 19:0 505:0 '),\n(505,'LochS',0,38,38,8,20,0,-5860.82,-3292.84,292.88,5.93047,'504:0 506:0 621:0 '),\n(506,'IronbandsExcavationOutside',0,38,142,8,20,2,-5617.55,-3680.57,313.913,2.11697,'495:0 505:0 507:0 509:0 '),\n(507,'IronbandsExcavationSW',0,38,142,8,20,2,-5787.94,-3777.91,328.169,4.57725,'506:0 508:0 510:0 '),\n(508,'IronbandsExcavationInside1',0,38,142,8,20,2,-5722.82,-3946.06,324.917,2.02667,'507:0 509:0 '),\n(509,'IronbandsExcavationInside2',0,38,142,8,20,2,-5578.49,-3926.28,327.498,1.64379,'506:0 508:0 '),\n(510,'LochCornerSE',0,38,147,8,20,2,-5843.55,-4145.23,387.605,1.3532,'507:0 511:0 512:0 '),\n(511,'FastriderLodgeEntrance',0,38,147,8,20,2,-5555.41,-4251.75,380.644,2.87687,'510:0 512:0 513:0 '),\n(512,'LochModanSE',0,38,147,8,20,2,-5553.71,-4104.44,372.683,1.01823,'494:0 495:0 510:0 511:0 '),\n(513,'FarstriderLodge',0,38,147,8,20,2,-5621.61,-4334.97,403.763,0.951478,'511:0 514:0 '),\n(514,'FarstriderLodgeInside',0,38,147,8,20,3,-5674.26,-4247.48,407.006,5.29276,'513:0 '),\n(515,'LochModanSW1',0,38,38,8,20,2,-5673.4,-2775.82,363.022,5.89359,'503:0 516:0 519:0 '),\n(516,'StonesplinterValley1',0,38,923,8,20,2,-5878.01,-2909.13,366.788,0.558766,'515:0 517:0 518:0 '),\n(517,'StonesplinterValley2',0,38,923,8,20,2,-6057.08,-3024.86,403.365,0.541086,'516:0 '),\n(518,'StonesplinterValley3',0,38,923,8,20,2,-6077.12,-2770.04,413.566,5.71294,'516:0 '),\n(519,'LochModanSW2',0,38,924,8,20,2,-5804.6,-2605.8,316.201,6.15474,'515:0 520:0 521:0 '),\n(520,'LochModanSW3',0,38,924,8,20,2,-6029.33,-2496.11,310.016,2.1924,'519:0 561:0 '),\n(521,'SouthGatePassBottom',0,38,839,8,20,2,-5690.63,-2589.07,346.087,0.415367,'519:0 522:0 '),\n(522,'SouthGateOutpost',0,1,806,1,10,0,-5520.09,-2399.78,400.417,2.27487,'521:0 523:0 '),\n(523,'SouthGatePassTop',0,1,805,1,10,2,-5636.7,-2242.95,424.761,5.34381,'522:0 527:0 69:0 '),\n(524,'NorthGatePassTop1',0,1,808,1,10,2,-4911.88,-2330.69,408.794,5.22601,'486:0 525:0 '),\n(525,'NorthGatePassBottom2',0,1,808,1,10,2,-5204.26,-2288.4,400.984,2.97781,'524:0 526:0 '),\n(526,'NorthGatePassTop2',0,1,807,1,10,2,-5294.53,-2180,423.003,2.8011,'525:0 527:0 '),\n(527,'DunMoroghPassFork',0,1,1,1,10,2,-5515.28,-2008.17,399.376,4.60752,'526:0 523:0 528:0 '),\n(528,'DunMoroghE1',0,1,1,1,10,2,-5509.11,-1798.18,397.338,5.99176,'527:0 69:0 529:0 '),\n(529,'GolBolarFork',0,1,1,1,10,2,-5611.84,-1487.57,399.057,5.05517,'528:0 530:0 533:0 '),\n(530,'GolBolarCamp',0,1,134,1,10,2,-5711.36,-1562.28,383.568,2.84075,'529:0 531:0 '),\n(531,'GolBolarQuarry1',0,1,134,1,10,2,-5849.25,-1514.03,358.812,5.96152,'530:0 532:0 '),\n(532,'GolBolarQuarry2',0,1,134,1,10,2,-5737.17,-1683.52,362.196,6.04595,'531:0 '),\n(533,'TundridHills',0,1,804,1,10,2,-5651.13,-1033.73,410.816,4.75985,'529:0 534:0 536:0 556:0 '),\n(534,'Vagash1',0,1,1,1,10,2,-5422.73,-1195.14,450.063,2.06791,'533:0 535:0 '),\n(535,'Vagash2',0,1,803,1,10,2,-5417.7,-1264.17,446.78,2.22146,'534:0 '),\n(536,'DunMoroghS1',0,1,1,1,10,2,-5892.71,-628.276,400.121,5.26175,'533:0 537:0 '),\n(537,'DwarfGnomeStartExit1',0,1,1,1,10,2,-5975.18,-476.82,406.774,5.36188,'536:0 9:0 538:0 '),\n(538,'DwarfGnomeStartExit2',0,1,1,1,10,2,-6013.25,-224.693,412.196,4.79638,'537:0 539:0 '),\n(539,'DwarfGnomeStartExit3',0,1,800,1,10,2,-5890.34,69.4737,372.157,4.07706,'538:0 540:0 545:0 546:0 '),\n(540,'ColdridgePass1',0,1,800,1,10,2,-6066.08,42.2314,408.342,0.120498,'539:0 541:0 '),\n(541,'ColdridgePass2',0,1,800,4,10,2,-6231.65,125.6,430.753,5.63871,'540:0 542:0 '),\n(542,'DwarfGnomeStart1',0,1,132,1,10,3,-6261.08,369.552,383.537,4.94484,'541:0 1:0 543:0 544:0 '),\n(543,'DwarfGnomeStart2',0,1,132,1,10,2,-6482.65,496.244,386.328,5.80485,'542:0 544:0 '),\n(544,'DwarfGnomeStart3',0,1,132,1,10,2,-6269.69,741.137,386.893,4.77403,'542:0 543:0 '),\n(545,'GrizzledDen',0,1,136,1,10,2,-5690.95,-281.229,364.314,5.54297,'539:0 9:0 '),\n(546,'DunMoroghSW1',0,1,1,1,10,2,-5756.39,127.948,368.817,4.07511,'539:0 547:0 548:0 '),\n(547,'OldIcebeard',0,1,801,1,10,2,-5602.44,-28.5472,416.22,2.31387,'546:0 '),\n(548,'DunMoroghW1',0,1,135,1,10,2,-5661.62,365.277,393.274,4.27146,'546:0 549:0 550:0 551:0 '),\n(549,'FrostmaneHold',0,1,135,1,10,2,-5549.4,568.067,394.761,1.30462,'548:0 551:0 '),\n(550,'GnomereganS',0,1,133,1,10,2,-5183.81,585.068,404.291,4.35,'548:0 551:0 '),\n(551,'IceflowLake',0,1,211,1,10,2,-5250.86,115.774,394.041,2.85773,'548:0 549:0 550:0 552:0 555:0 '),\n(552,'ShimmerRidge1',0,1,802,1,10,2,-5266.4,-149.752,437.903,6.01894,'551:0 553:0 '),\n(553,'ShimmerRidge2',0,1,802,1,10,2,-5088.11,-166.104,442.035,0.727311,'552:0 554:0 555:0 '),\n(554,'ShimmerRidge3',0,1,802,1,10,2,-5043,-267.85,441.4,2.19994,'553:0 '),\n(555,'ShimmerRidge4',0,1,802,1,10,2,-5021.64,-132.237,411.899,3.77858,'553:0 551:0 '),\n(556,'DunmoroghC1',0,1,1,1,10,2,-5391.34,-928.482,393.467,4.06525,'533:0 557:0 '),\n(557,'IronforgeRamp',0,1,1,1,10,2,-5259.37,-493.579,386.436,3.14828,'556:0 9:0 558:0 '),\n(558,'IronforgeRampMid',0,1,809,1,10,2,-5197.66,-730.697,445.722,5.89324,'557:0 559:0 '),\n(559,'IronforgeRampTop',0,1,809,1,10,2,-5060.46,-745.984,480.27,3.47972,'558:0 8:0 '),\n(560,'IronforgeBank',0,1537,1537,1,10,3,-4909.88,-969.761,501.463,5.46481,'8:0 '),\n(561,'SGgate',0,51,1959,43,54,0,-6413.58,-2007.56,244.634,2.74852,'520:0 562:0 563:0 '),\n(562,'DustfireValleyMid',0,51,1959,43,54,0,-6590.48,-1884.27,245.713,1.74321,'561:0 580:0 585:0 '),\n(563,'SGexitE',0,51,51,43,54,0,-6906.38,-1818.59,241.661,5.89992,'561:0 564:0 566:0 593:0 '),\n(564,'GrimesiltDigSite',0,51,247,43,54,0,-7019.65,-1698.57,241.667,5.46992,'563:0 565:0 566:0 567:0 568:0 '),\n(565,'TannerCamp',0,51,1958,43,54,0,-7225.75,-1752.49,244.286,0.924438,'564:0 566:0 567:0 568:0 '),\n(566,'SGtower4',0,51,1444,43,54,0,-6980,-1505.92,242.742,3.93841,'563:0 564:0 565:0 567:0 568:0 '),\n(567,'SGtower3',0,51,1444,43,54,0,-7036.7,-1320.2,244.272,4.7631,'565:0 564:0 566:0 568:0 '),\n(568,'SGsouth1',0,51,1444,43,54,0,-7155.86,-1317.76,242.155,5.03211,'565:0 569:0 567:0 564:0 566:0 '),\n(569,'BRM_SG1',0,51,1445,43,54,0,-7215.95,-1057.94,242.73,1.72755,'571:0 568:0 570:0 572:0 573:0 '),\n(570,'BRM_SG2',0,25,25,46,60,0,-7399.25,-1106.95,278.077,0.229401,'569:0 622:0 '),\n(571,'SGwest1',0,51,51,43,54,0,-7085,-941.753,268.272,4.123,'569:0 572:0 573:0 '),\n(572,'SGtower2',0,51,51,43,54,0,-7001.07,-1109.84,243.97,2.78587,'571:0 569:0 573:0 '),\n(573,'SGwest2',0,51,51,43,54,0,-6974.99,-1007.32,241.667,3.29324,'571:0 569:0 572:0 574:0 588:0 '),\n(574,'CauldronRampTop',0,51,246,43,54,0,-6974.25,-1172.02,228.781,3.87051,'573:0 575:0 '),\n(575,'CauldronRampMid1',0,51,246,43,54,0,-7024.61,-1220.88,207.974,5.71816,'574:0 576:0 '),\n(576,'CauldronRampMid2',0,51,246,43,54,0,-6955.19,-1270.62,180.686,0.528642,'575:0 577:0 581:0 '),\n(577,'CauldronRampBottom',0,51,246,43,54,0,-6866.28,-1410.17,172.855,2.20156,'576:0 578:0 '),\n(578,'CauldronRamp2Bottom',0,51,246,43,54,0,-6712.76,-1610.77,196.339,2.17329,'577:0 579:0 '),\n(579,'CauldronRamp2Mid',0,51,246,43,54,0,-6668.28,-1664.76,229.053,1.92432,'578:0 580:0 '),\n(580,'CauldronRamp2Top',0,51,246,43,54,0,-6680,-1730.07,255.913,4.54363,'562:0 579:0 '),\n(581,'SlagPit1',0,51,1443,43,54,0,-6850.01,-1218.8,177.395,3.61294,'576:0 582:0 '),\n(582,'SlagPit2',0,51,1443,43,54,0,-6764.59,-1174.15,187.213,1.12951,'581:0 583:0 '),\n(583,'SlagPit3',0,51,1443,43,54,0,-6439.47,-1311.02,180.938,2.63197,'582:0 584:0 '),\n(584,'SlagPit4',0,51,1443,43,54,0,-6631.29,-1289.33,208.714,0.00481129,'583:0 '),\n(585,'SG_hubN1',0,51,51,43,54,0,-6686.77,-1347.22,247.961,4.79378,'562:0 586:0 588:0 589:0 '),\n(586,'CauldronTopN',0,51,246,43,54,0,-6862.1,-1188.37,240.366,5.51045,'585:0 '),\n(587,'FirewatchRidgeBottom',0,51,1442,43,54,0,-6612.66,-860.886,244.297,0.237204,'588:0 589:0 591:0 '),\n(588,'FirewatchRidgeS',0,51,1442,43,54,0,-6817.17,-866.771,248.462,4.87941,'573:0 585:0 587:0 '),\n(589,'ThoriumPointRampBottom',0,51,1442,43,54,0,-6608.41,-1025.59,244.328,1.21161,'587:0 585:0 590:0 '),\n(590,'ThoriumPointRampTop',0,51,1446,43,54,1,-6473.64,-1104.63,303.285,2.64303,'589:0 180:0 '),\n(591,'FirewatchRidgeTop1',0,51,1442,43,54,0,-6473.38,-887.709,324.088,3.80543,'587:0 592:0 '),\n(592,'FirewatchRidgeTop2',0,51,1442,43,54,0,-6502.46,-1018.74,344.372,1.2407,'591:0 '),\n(593,'SGexitEmid',0,51,51,43,54,0,-6952.2,-2064.74,282.478,5.11429,'563:0 594:0 '),\n(594,'BLexitW',0,3,3,33,45,0,-6885.86,-2233.35,242.64,0.361067,'593:0 595:0 24:0 '),\n(595,'ApocryphansRest',0,3,337,33,45,0,-6892.26,-2477.47,247.238,1.71982,'594:0 87:0 596:0 597:0 600:0 601:0 602:0 '),\n(596,'CampCaggS',0,3,344,33,45,0,-7270.91,-2407.34,268.195,5.1163,'595:0 597:0 '),\n(597,'CampCaggE',0,3,3,33,45,0,-7140.34,-2650.51,243.568,0.467924,'595:0 596:0 602:0 603:0 '),\n(598,'KargathE',0,3,3,33,45,0,-6600.53,-2373.56,254.037,0.026153,'600:0 599:0 24:0 '),\n(599,'KargathNE',0,3,3,33,45,0,-6431.02,-2454.24,321.326,3.51922,'598:0 600:0 '),\n(600,'DustbowlW',0,3,1878,33,45,0,-6718.55,-2572.24,241.801,0.471881,'595:0 598:0 599:0 601:0 602:0 '),\n(601,'DustbowlNE',0,3,1878,33,45,0,-6653.03,-2889.09,241.667,2.73974,'595:0 600:0 602:0 620:0 '),\n(602,'BL_hubC',0,3,1879,33,45,0,-6902.56,-2958.24,244.772,1.67356,'600:0 597:0 601:0 595:0 608:0 603:0 '),\n(603,'AgmondsendS',0,3,345,33,45,0,-7141.97,-3251.77,246.326,0.774282,'597:0 602:0 604:0 605:0 607:0 '),\n(604,'BL_elemsS',0,3,3,33,45,0,-7319.09,-3144.54,317.901,5.93436,'603:0 '),\n(605,'AgmondsEnd',0,3,345,33,45,0,-7033.01,-3313.39,238.277,2.5061,'603:0 606:0 607:0 609:0 '),\n(606,'BL_elemsSE',0,3,3,33,45,0,-7339.37,-3450.9,320.961,0.385524,'605:0 '),\n(607,'CampBoff',0,3,342,33,45,0,-7039.11,-3655.92,244.152,1.66966,'603:0 605:0 608:0 609:0 '),\n(608,'BL_hubN1',0,3,1877,33,45,0,-6667.51,-3285.91,241.069,2.14484,'25:0 602:0 607:0 609:0 620:0 '),\n(609,'BL_hubNE1',0,3,1898,33,45,0,-6775.23,-3555.53,245.004,5.79028,'605:0 607:0 608:0 610:0 617:0 620:0 '),\n(610,'LethlorRavineEntranceS',0,3,339,38,45,0,-6742.54,-3895.6,264.574,1.61394,'609:0 611:0 '),\n(611,'LethlorRavineS',0,3,339,38,45,0,-7002.17,-3938.58,263.889,5.47219,'610:0 612:0 '),\n(612,'LethlorRavineC',0,3,339,38,45,0,-6820.98,-4135.08,263.933,2.32276,'611:0 613:0 '),\n(613,'LethlorRavineN',0,3,339,38,45,0,-6424.74,-4106.41,263.889,3.0143,'612:0 614:0 '),\n(614,'LethlorRavineNW',0,3,339,38,45,0,-6513.4,-4004.6,264.394,5.30492,'613:0 615:0 '),\n(615,'LethlorRavineEntranceN',0,3,339,38,45,0,-6396.09,-3976.18,268.618,3.37284,'614:0 616:0 '),\n(616,'LethlorRavineExitN',0,3,1898,38,45,0,-6467.07,-3837.32,315.608,5.41801,'615:0 617:0 '),\n(617,'CampKoshS',0,3,1898,33,45,0,-6360.66,-3685.6,245.154,4.17511,'616:0 609:0 618:0 619:0 '),\n(618,'CampKosh',0,3,341,33,45,0,-6249.45,-3750.01,243.041,2.72409,'617:0 619:0 '),\n(619,'HammertoesDigsite',0,3,346,33,45,0,-6349.91,-3447.28,241.681,0.369852,'617:0 618:0 620:0 621:0 '),\n(620,'BL_hubN2',0,3,338,33,45,0,-6494.59,-3248.21,242.617,1.06886,'25:0 601:0 608:0 609:0 619:0 '),\n(621,'MakersTerrace',0,3,1897,33,45,0,-6056.99,-3302.11,258.645,3.45646,'86:0 505:0 619:0 '),\n(622,'BRM_SG3',0,25,25,46,60,0,-7496.19,-1063.83,264.543,4.72301,'570:0 623:0 628:0 '),\n(623,'BRM_chain1',0,25,25,46,60,0,-7501.48,-1151.43,269.644,1.34305,'622:0 624:0 627:0 '),\n(624,'BRM_chain2',0,25,25,46,60,0,-7599.78,-1110.62,249.93,1.94977,'623:0 625:0 '),\n(625,'BRM_chain3',0,25,25,46,60,0,-7523.43,-1048.09,180.912,0.471264,'624:0 626:0 '),\n(626,'BRM_chain4',0,25,25,46,60,0,-7383.99,-1012.09,173.658,3.00809,'625:0 '),\n(627,'BRM_BRS1',0,25,25,46,60,0,-7609.9,-1226.43,233.401,0.518375,'623:0 628:0 '),\n(628,'BRM_BS1',0,25,25,46,60,0,-7697.61,-1089.8,217.609,3.00611,'627:0 622:0 629:0 '),\n(629,'BRM_BS2',0,25,25,46,60,0,-7769.06,-1129.81,215.084,0.38328,'628:0 630:0 '),\n(630,'BRM_BS3',0,25,25,46,60,0,-7993.75,-1138.96,163.061,0.128021,'629:0 631:0 637:0 639:0 641:0 '),\n(631,'DracodarNW',0,46,2421,48,56,0,-7968.74,-817.038,131.202,4.58672,'630:0 632:0 636:0 '),\n(632,'AltarOfStormsRoad',0,46,46,48,56,0,-7803.25,-717,176.761,6.28318,'631:0 633:0 '),\n(633,'AltarOfStormsFork',0,46,255,48,56,0,-7679.67,-712.976,183.628,3.3461,'632:0 634:0 635:0 '),\n(634,'AltarOfStormsVendor',0,46,255,48,56,0,-7644.75,-636.535,200.452,4.00749,'633:0 '),\n(635,'AltarOfStorms1',0,46,255,48,56,0,-7626.75,-709.048,183.359,5.20123,'633:0 2368:0 '),\n(636,'DracodarW',0,46,2421,48,56,0,-8170.67,-727.141,135.21,5.81979,'631:0 637:0 '),\n(637,'DracodarS',0,46,2421,48,56,0,-8255.07,-1040.7,147.3,0.143321,'630:0 636:0 638:0 639:0 '),\n(638,'DracodarS_hill1',0,46,2421,48,56,0,-8419.15,-933.413,214.705,5.70788,'637:0 '),\n(639,'DracodarSE',0,46,46,48,56,0,-8254.03,-1168.68,144.64,0.0510463,'630:0 637:0 640:0 641:0 '),\n(640,'DracodarS_hill2',0,46,46,48,56,0,-8431.62,-1227.92,207.816,0.498725,'639:0 '),\n(641,'DracodarHub',0,46,46,48,56,0,-8073.86,-1401.78,132.05,4.03301,'630:0 639:0 642:0 644:0 645:0 '),\n(642,'BlackrockStrongholdOutside',0,46,46,48,56,0,-7757.29,-1591.7,133.263,1.43923,'641:0 643:0 644:0 646:0 '),\n(643,'BlackrockStrongholdInside',0,46,252,48,56,0,-7698.11,-1443.02,139.787,4.00159,'642:0 '),\n(644,'PillarOfAshS',0,46,46,48,56,0,-8232.79,-1737.58,147.888,6.17911,'641:0 642:0 645:0 658:0 '),\n(645,'PillarOfAshE',0,46,253,48,56,0,-8102.12,-1922.65,134.695,1.31201,'641:0 644:0 646:0 647:0 658:0 '),\n(646,'ThaurissanNW',0,46,250,48,56,0,-7704.8,-2045.32,133.437,1.61634,'642:0 645:0 139:0 647:0 648:0 '),\n(647,'DreadmaulRockW',0,46,249,48,56,0,-7971.45,-2449.46,130.882,1.47692,'646:0 645:0 648:0 652:0 654:0 658:0 659:0 660:0 '),\n(648,'DreadmaulRockNW',0,46,249,48,56,0,-7665.96,-2453.95,147.044,2.94798,'647:0 646:0 138:0 649:0 654:0 '),\n(649,'DreadmaulRockNE',0,46,249,48,56,0,-7765.85,-2707.5,172.836,1.14313,'648:0 650:0 655:0 '),\n(650,'DreadmaulRockSE',0,46,2420,48,56,0,-8161.75,-2869.02,134.8,0.000368118,'649:0 138:0 651:0 652:0 659:0 '),\n(651,'MorgansVigil',0,46,2418,48,56,3,-8379.57,-2741.96,186.492,6.13436,'650:0 652:0 659:0 '),\n(652,'DreadmaulRockTop1',0,46,249,48,56,0,-7971.64,-2664.1,198.213,2.32517,'647:0 650:0 651:0 138:0 653:0 '),\n(653,'DreadmaulRockTop2',0,46,249,48,56,0,-7873.63,-2613.13,221.072,2.92403,'652:0 '),\n(654,'DreadmaulRockNWW',0,46,249,48,56,0,-7776.13,-2493.23,160.084,5.03518,'648:0 647:0 '),\n(655,'DreadmaulRockInside1',0,46,249,48,56,0,-7848.98,-2661.75,172.955,1.73534,'649:0 656:0 657:0 '),\n(656,'DreadmaulRockInside2',0,46,249,48,56,0,-7961.48,-2603.36,173.834,6.08133,'655:0 '),\n(657,'DreadmaulRockInside3',0,46,249,48,56,0,-7975.04,-2695.45,157.958,5.80842,'655:0 '),\n(658,'DreadmaulPassW',0,46,46,48,56,0,-8216.14,-2308.1,151.442,1.03911,'644:0 645:0 647:0 659:0 '),\n(659,'DreadmaulPassN',0,46,46,48,56,0,-8150.16,-2629.44,133.659,1.18246,'647:0 650:0 651:0 658:0 660:0 '),\n(660,'DreadmaulPass',0,46,2417,48,56,0,-8431.68,-2546.4,133.207,6.07628,'647:0 659:0 661:0 '),\n(661,'RedridgeExitN',0,44,44,13,25,0,-8900,-2574.56,131.851,0.152413,'660:0 75:0 663:0 '),\n(662,'RendersRockInside',0,44,998,13,25,0,-8738.68,-2205.37,149.754,2.59501,'75:0 '),\n(663,'AlthersMillEntrance',0,44,97,13,25,0,-9153.73,-2628.6,109.561,0.156359,'661:0 664:0 690:0 '),\n(664,'RedridgeHub1',0,44,44,13,25,0,-9099.79,-2451.23,120.464,0.197585,'663:0 665:0 667:0 669:0 '),\n(665,'RedridgeBridgeN',0,44,69,13,25,2,-9287.68,-2284.47,67.5443,5.81789,'664:0 10:0 672:0 673:0 '),\n(666,'RedridgeW',0,44,44,13,25,2,-9312.11,-1873.26,82.1473,5.08747,'10:0 672:0 '),\n(667,'RedridgeCanyons1',0,44,95,13,25,2,-8916.14,-2305.07,134.682,3.96044,'664:0 668:0 670:0 '),\n(668,'RedridgeCanyons2',0,44,95,13,25,2,-8864.57,-2150.9,133.327,3.71892,'667:0 669:0 670:0 '),\n(669,'RedridgeCanyons3',0,44,69,13,25,2,-9145.97,-2198.54,119.516,4.7478,'668:0 664:0 670:0 '),\n(670,'RedridgeCanyons4',0,44,95,13,25,2,-9135.91,-2029.37,127.775,5.01877,'667:0 668:0 669:0 77:0 '),\n(671,'RethbanCavernsInside',0,44,98,13,25,0,-8826.83,-1947.01,133.091,2.11555,'77:0 '),\n(672,'RedridgeBridgeS',0,44,44,13,25,2,-9503.49,-2289.12,74.7234,1.13183,'665:0 666:0 674:0 675:0 '),\n(673,'EverstillN',0,44,68,13,25,2,-9263.45,-2458.04,56.1636,1.20646,'665:0 '),\n(674,'ThreeCorners',0,44,1002,13,25,0,-9607.09,-2055.97,65.077,4.99696,'672:0 675:0 692:0 693:0 694:0 '),\n(675,'RedridgeS1',0,44,1001,13,25,0,-9713.82,-2284.16,63.9369,5.46531,'672:0 674:0 676:0 677:0 '),\n(676,'RedridgeS2',0,44,68,13,25,0,-9620.32,-2514.61,59.4453,0.974015,'675:0 677:0 '),\n(677,'RedridgeS3',0,44,1001,13,25,0,-9624.96,-2717.09,56.3955,1.53951,'676:0 675:0 678:0 679:0 691:0 '),\n(678,'StonewatchS',0,44,70,18,25,0,-9468.55,-3007.78,135.551,1.52185,'677:0 689:0 '),\n(679,'RedridgeS4',0,44,997,13,25,0,-9751.37,-3185.18,58.6091,5.63735,'677:0 680:0 681:0 '),\n(680,'RedridgeE1',0,44,997,13,25,0,-9611,-3315.1,49.8404,2.09716,'679:0 681:0 682:0 683:0 684:0 '),\n(681,'RedridgeE2',0,44,71,13,25,0,-9499.43,-3249.9,50.6,3.02197,'679:0 680:0 '),\n(682,'RedridgeE3',0,44,44,18,25,2,-9598.71,-3503.57,121.964,2.30923,'680:0 683:0 '),\n(683,'RedridgeE4',0,44,71,18,25,1,-9465.03,-3460.8,116.076,2.91242,'680:0 682:0 74:0 684:0 '),\n(684,'RedridgeE5',0,44,71,18,25,0,-9469.61,-3328.04,5.51622,4.94268,'680:0 683:0 '),\n(685,'RedridgeNE',0,44,1000,18,25,0,-9116.4,-3271.35,104.33,2.00332,'74:0 686:0 687:0 '),\n(686,'RedridgeE6',0,44,1000,18,25,0,-9317.33,-3210.41,107.191,5.54352,'685:0 74:0 687:0 '),\n(687,'StonewatchFork',0,44,70,18,25,0,-9195.1,-3020.88,94.6252,4.57746,'686:0 685:0 688:0 689:0 690:0 '),\n(688,'StonewatchTower',0,44,999,18,25,0,-9297.56,-2958.62,128.754,5.64364,'687:0 689:0 '),\n(689,'StonewatchTop',0,44,2099,18,25,0,-9364.92,-3072.52,164.756,3.2698,'687:0 688:0 678:0 '),\n(690,'AlthersMillCenter',0,44,97,13,25,0,-9215.61,-2770.74,89.3399,4.66193,'687:0 663:0 '),\n(691,'EverstillE',0,44,44,13,25,0,-9457.68,-2870.36,85.486,2.24488,'677:0 '),\n(692,'ThreeCornersCamp1',0,44,1002,13,25,0,-9472.89,-1956.22,83.561,4.19346,'674:0 693:0 694:0 '),\n(693,'RedridgeExitW1',0,44,1002,13,25,2,-9620.34,-1809.71,51.8565,1.49408,'692:0 674:0 694:0 696:0 '),\n(694,'RedridgeExitW2',0,44,1002,13,25,0,-9831.1,-1766.69,23.8242,2.51983,'692:0 674:0 693:0 695:0 792:0 '),\n(695,'ElwynnHubS1',0,12,798,1,10,2,-9928.36,-1115.12,24.1788,6.21189,'705:0 704:0 694:0 696:0 706:0 '),\n(696,'ElwynnHubE1',0,12,12,1,10,2,-9659.48,-1341.54,48.8561,4.72993,'693:0 697:0 698:0 704:0 695:0 '),\n(697,'EastvaleLC1',0,12,88,1,10,2,-9405,-1343.43,50.0284,2.89799,'696:0 698:0 699:0 '),\n(698,'StoneCairnLakeSE',0,12,86,1,10,2,-9299.52,-1180.36,69.4951,3.31622,'696:0 697:0 699:0 701:0 797:0 '),\n(699,'StoneCairnLakeNE',0,12,86,1,10,2,-8956.22,-1264.96,77.7779,2.94511,'700:0 697:0 698:0 797:0 '),\n(700,'StoneCairnLakeNW',0,12,86,1,10,2,-8860.62,-826.796,71.9141,4.57088,'699:0 701:0 797:0 '),\n(701,'StoneCairnLakeSW',0,12,12,1,10,2,-9355.59,-802.598,64.4981,0.692979,'89:0 700:0 708:0 698:0 705:0 706:0 707:0 797:0 '),\n(702,'JasperlodeMineInside1',0,12,54,1,10,2,-9125.33,-585.357,58.3507,3.90606,'89:0 703:0 '),\n(703,'JasperlodeMineInside2',0,12,54,1,10,2,-9049.44,-618.138,53.1456,4.05725,'702:0 '),\n(704,'ElwynnHubE2',0,12,12,1,10,2,-9613.79,-1100.85,40.5009,4.62273,'696:0 705:0 695:0 '),\n(705,'ElwynnHubE3',0,12,12,1,10,2,-9618.95,-1024.81,40.4731,4.99973,'704:0 695:0 701:0 706:0 707:0 '),\n(706,'BrackwellPumpkinPatch',0,12,62,1,10,2,-9777.88,-877.924,39.5328,5.4101,'705:0 701:0 695:0 707:0 '),\n(707,'ElwynnHubC1',0,12,12,1,10,2,-9609.57,-527.364,55.1285,4.48725,'89:0 708:0 701:0 705:0 706:0 716:0 '),\n(708,'CrystalLakeE',0,12,18,1,10,2,-9464.16,-422.645,58.9952,3.63313,'89:0 701:0 707:0 709:0 '),\n(709,'CrystalLakeW',0,12,18,1,10,2,-9470.07,-173.045,59.9322,4.58858,'708:0 710:0 7:0 '),\n(710,'NorthshireExit',0,12,12,1,10,2,-9133.8,-66.2742,82.4151,1.35237,'709:0 16:0 13:0 7:0 '),\n(711,'EchoRidgeMineInside',0,12,34,1,10,2,-8560.22,-214.447,85.0045,2.95145,'70:0 '),\n(712,'TradeDistrict',0,1519,1519,1,10,3,-8794.44,645.505,94.4595,3.54245,'16:0 '),\n(713,'ForestsEdgeS',0,12,60,1,10,2,-10070.2,658.114,37.3319,5.88491,'72:0 88:0 717:0 '),\n(714,'FargodeepMineOutside',0,12,57,1,10,2,-9868.23,221.066,14.0194,6.19474,'7:0 71:0 72:0 715:0 '),\n(715,'FargodeepMineInside',0,12,57,1,10,2,-9779.25,104.966,4.57989,3.01191,'714:0 '),\n(716,'ElwynnHubS2',0,12,12,1,10,2,-9808.32,-269.092,40.0067,5.15408,'71:0 707:0 '),\n(717,'ElwynnExitW',0,12,60,1,10,2,-9747.07,741.601,25.5892,4.55914,'7:0 88:0 72:0 713:0 718:0 '),\n(718,'WestfallExitNE',0,40,916,8,20,2,-9853.3,918.261,30.2216,5.34454,'717:0 719:0 745:0 746:0 '),\n(719,'Longshore1',0,40,2,8,20,2,-9616.19,1059.16,5.79699,0.013632,'720:0 718:0 745:0 '),\n(720,'Longshore2',0,40,2,8,20,2,-9634.2,1389.29,9.09694,4.71817,'719:0 721:0 '),\n(721,'Longshore3',0,40,2,8,20,2,-9648.12,1575.23,3.54258,4.75547,'720:0 722:0 '),\n(722,'Longshore4',0,40,2,8,20,2,-9776.1,1654.24,11.5179,2.15188,'721:0 723:0 742:0 743:0 '),\n(723,'Longshore5',0,40,2,8,20,2,-9985.75,1913.6,4.86301,5.35756,'722:0 724:0 742:0 '),\n(724,'Longshore6',0,40,2,8,20,2,-10334,2061.94,3.69692,5.05125,'723:0 725:0 739:0 '),\n(725,'Longshore7',0,40,2,8,20,2,-10695.4,2102.07,8.28685,6.14098,'724:0 726:0 738:0 '),\n(726,'Longshore8',0,40,2,8,20,2,-10975.2,2108.77,-0.213533,6.27058,'725:0 727:0 737:0 '),\n(727,'Longshore9',0,40,2,8,20,2,-11307.8,1926.18,9.26031,4.25015,'726:0 728:0 '),\n(728,'Longshore10',0,40,2,8,20,2,-11466.2,1725.82,8.61195,0.641238,'727:0 729:0 '),\n(729,'DaggerHillsW',0,40,920,8,20,2,-11264.1,1714.56,39.9062,4.76851,'728:0 730:0 737:0 '),\n(730,'DaggerHillsC1',0,40,920,8,20,2,-11258.8,1470.77,88.9353,4.93148,'729:0 731:0 '),\n(731,'DaggerHillsC2',0,40,920,8,20,2,-11211.1,1297.89,91.1699,1.90966,'730:0 732:0 733:0 '),\n(732,'DaggerHillsNook',0,40,920,8,20,2,-11235.2,1182.36,91.6522,1.1871,'731:0 733:0 '),\n(733,'DaggerHillsE',0,40,920,8,20,2,-11062.7,1163.02,43.0261,2.75789,'736:0 732:0 731:0 734:0 735:0 750:0 '),\n(734,'DustPlains',0,40,922,8,20,2,-11152,739.176,32.5228,1.40505,'733:0 735:0 750:0 '),\n(735,'DeadAcre',0,40,917,8,20,2,-10770.8,864.294,33.1505,2.913,'736:0 733:0 734:0 746:0 750:0 '),\n(736,'WestfallHubC1',0,40,40,8,20,2,-10842.5,1196.94,34.875,1.14192,'12:0 15:0 735:0 733:0 738:0 741:0 750:0 '),\n(737,'DemontsPlace',0,40,921,8,20,2,-11087.9,1894.97,35.4372,5.06105,'726:0 729:0 12:0 738:0 '),\n(738,'AlexstonFarmstead',0,40,219,8,20,2,-10615,1671.77,41.41,4.1441,'737:0 725:0 12:0 741:0 742:0 736:0 '),\n(739,'GoldCoastQuarry',0,40,113,8,20,2,-10403.7,1909.99,9.96272,4.64675,'724:0 740:0 741:0 '),\n(740,'GoldCoastQuarryInside',0,40,113,8,20,2,-10575.3,1990.25,-8.03668,3.01509,'739:0 '),\n(741,'WestfallHubC2',0,40,40,8,20,2,-10495.4,1349.24,42.6842,1.76042,'738:0 739:0 15:0 742:0 745:0 736:0 '),\n(742,'WestfallHubC3',0,40,918,8,20,2,-10274.9,1408.84,38.9079,3.90454,'741:0 738:0 723:0 722:0 15:0 743:0 745:0 '),\n(743,'JangolodeMine',0,40,111,8,20,2,-10017,1466.37,41.0745,6.08639,'742:0 722:0 744:0 745:0 '),\n(744,'JangolodeMineInside',0,40,111,8,20,2,-9887.11,1427.15,40.0346,0.896887,'743:0 '),\n(745,'SaldeansFarm',0,40,107,8,20,2,-10154.1,1116.55,36.8816,1.65283,'15:0 718:0 719:0 741:0 742:0 743:0 746:0 '),\n(746,'WestfallHubE1',0,40,40,8,20,2,-10333.7,859.579,39.774,0.563072,'15:0 718:0 735:0 745:0 752:0 '),\n(747,'DefiasHideout',0,1581,1581,15,22,2,-11112,1483.69,32.39,3.56723,'12:0 748:0 '),\n(748,'Deadmines1',0,1581,1581,15,22,2,-11252.8,1533.82,28.6803,0.814416,'747:0 749:0 '),\n(749,'Deadmines2',0,1581,1581,15,22,2,-11214.4,1638.37,27.2613,1.55073,'748:0 '),\n(750,'WestfallExitSE',0,40,40,8,20,2,-10870.3,667.353,30.8385,4.48578,'733:0 734:0 735:0 736:0 15:0 751:0 '),\n(751,'DuskwoodExitW',0,10,10,18,30,0,-10857.5,557.367,30.4883,6.27453,'750:0 752:0 14:0 753:0 755:0 '),\n(752,'HushedBankN',0,10,1097,18,30,0,-10326.3,623.959,26.42,3.17024,'746:0 751:0 757:0 758:0 763:0 '),\n(753,'AddlesSteadW',0,10,536,18,30,0,-11054.9,270.776,25.2035,6.01338,'751:0 14:0 754:0 '),\n(754,'AddlesSteadE',0,10,536,18,30,0,-10997.4,179.443,30.4059,1.04377,'753:0 14:0 766:0 '),\n(755,'RHCemetaryS',0,10,492,18,30,0,-10587.6,294.965,31.0441,0.0129175,'751:0 14:0 756:0 757:0 765:0 766:0 '),\n(756,'RHCemetaryNE',0,10,492,24,30,0,-10398,201.223,34.2462,5.21064,'755:0 757:0 758:0 762:0 764:0 765:0 '),\n(757,'RHCemetaryW',0,10,492,22,30,0,-10427.4,409.679,46.6267,4.40525,'752:0 755:0 756:0 758:0 759:0 '),\n(758,'RHCemetaryN',0,10,243,24,30,0,-10308.2,348.036,59.693,3.07006,'752:0 757:0 756:0 '),\n(759,'DawningWoodCatacombs1',0,10,2098,18,30,0,-10261.5,383.964,10.414,2.92673,'757:0 760:0 '),\n(760,'DawningWoodCatacombs2',0,10,2098,18,30,0,-10234.6,284.99,2.79944,4.82935,'759:0 761:0 '),\n(761,'DawningWoodCatacombs3',0,10,2098,18,30,0,-10220.1,166.144,0.047382,3.23144,'760:0 762:0 '),\n(762,'DawningWoodCatacombs4',0,10,2098,18,30,0,-10338.4,136.513,4.82896,0.380849,'756:0 761:0 '),\n(763,'DuskwoodNW1',0,10,799,18,30,0,-10173.2,350.099,32.3759,4.62356,'752:0 764:0 '),\n(764,'DuskwoodNW2',0,10,799,18,30,0,-10183.8,-55.3832,27.6626,5.67208,'763:0 756:0 765:0 793:0 '),\n(765,'DuskwoodC1',0,10,10,18,30,0,-10482,-16.5716,51.5694,0.81242,'764:0 755:0 756:0 766:0 '),\n(766,'DuskwoodC2',0,10,10,18,30,0,-10750.8,67.4617,28.3337,1.80202,'765:0 755:0 14:0 754:0 767:0 '),\n(767,'DuskwoodC3',0,10,10,18,30,0,-10910.1,-371.894,39.8351,3.06651,'766:0 768:0 769:0 773:0 774:0 775:0 779:0 795:0 '),\n(768,'DuskwoodExitS',0,10,10,18,30,0,-11268.2,-368.936,61.3823,6.14723,'767:0 858:0 '),\n(769,'VulGolOgreMound1',0,10,93,24,30,0,-11005.9,-176.407,14.5532,5.12818,'767:0 770:0 771:0 '),\n(770,'VulGolOgreMound2',0,10,93,24,30,0,-10959.3,-38.5543,13.6432,4.44096,'769:0 771:0 '),\n(771,'VulGolOgreMound3',0,10,93,24,30,0,-11083.6,-80.7448,16.7954,5.39522,'769:0 770:0 772:0 '),\n(772,'VulGolOgreMoundInside',0,10,93,24,30,0,-11234.1,-172.07,4.22438,4.5174,'771:0 '),\n(773,'YorgenFarmsteadW',0,10,245,24,30,0,-11096.9,-452.028,32.1764,4.54422,'767:0 774:0 '),\n(774,'YorgenFarmsteadE',0,10,245,24,30,0,-11052.8,-598.054,29.3447,1.47723,'767:0 773:0 776:0 '),\n(775,'DuskwoodC4',0,10,10,18,30,0,-10908,-739.892,54.8364,0.583838,'767:0 776:0 778:0 779:0 '),\n(776,'RottingOrchardW',0,10,241,18,30,0,-10986.3,-770.892,55.1122,1.55183,'774:0 775:0 777:0 778:0 '),\n(777,'RottingOrchardS',0,10,241,18,30,0,-11103.5,-891.729,62.1149,0.69773,'776:0 778:0 '),\n(778,'DuskwoodC5',0,10,10,18,30,0,-10823,-837.935,55.75,1.63037,'775:0 776:0 777:0 779:0 780:0 '),\n(779,'DuskwoodC6',0,10,10,18,30,0,-10768,-644.008,42.2621,2.90859,'767:0 775:0 778:0 786:0 '),\n(780,'DuskwoodE1',0,10,42,18,30,0,-10757.1,-1156.72,24.9918,1.69202,'778:0 124:0 782:0 783:0 '),\n(781,'RolandsDoomInside',0,10,2161,24,30,0,-11157.5,-1167.04,42.5151,0.315576,'124:0 '),\n(782,'TranquilGardensCemetery',0,10,121,18,30,0,-11023.4,-1315.7,53.1833,6.14911,'780:0 783:0 '),\n(783,'DuskwoodE2',0,10,10,18,30,0,-10813.8,-1366.37,42.2527,0.00140238,'780:0 782:0 3:0 784:0 794:0 '),\n(784,'DarkshireExitE',0,10,10,18,30,0,-10539.7,-1338.09,48.0906,1.65268,'785:0 783:0 3:0 '),\n(785,'DuskwoodExitE',0,10,10,18,30,0,-10442.9,-1486.98,73.8977,5.13748,'784:0 798:0 '),\n(786,'DuskwoodC7',0,10,242,24,30,0,-10451.9,-825.607,50.4132,2.61635,'779:0 787:0 788:0 793:0 '),\n(787,'DuskwoodC8',0,10,242,24,30,0,-10647.9,-908.344,50.934,5.93661,'786:0 3:0 788:0 '),\n(788,'DuskwoodNE1',0,10,242,18,30,0,-10219.2,-1021.98,31.9202,2.92658,'786:0 787:0 3:0 789:0 790:0 793:0 '),\n(789,'ManorMismantle',0,10,1098,24,30,0,-10332.7,-1264.03,35.3024,1.53643,'788:0 3:0 790:0 '),\n(790,'DuskwoodNE2',0,10,10,18,30,0,-10181.4,-1145.35,24.304,3.28393,'788:0 789:0 791:0 793:0 '),\n(791,'DuskwoodNE3',0,10,10,18,30,0,-10067.1,-1379.68,29.9246,1.99195,'790:0 792:0 '),\n(792,'DuskwoodExitNE',0,10,10,18,30,0,-9963.01,-1637.21,27.2574,2.08816,'694:0 791:0 '),\n(793,'DuskwoodN',0,10,799,18,30,0,-10020.5,-660.012,39.1578,1.66406,'790:0 788:0 764:0 786:0 '),\n(794,'Naraxis',0,10,10,18,30,0,-10619.4,-1502.44,90.534,3.1465,'783:0 '),\n(795,'TwilightGroveEntrance',0,10,10,50,60,0,-10718.7,-425.681,126.691,0.442773,'767:0 796:0 '),\n(796,'TwilightGrove',0,10,856,50,60,0,-10419.3,-421.597,45.6561,3.03852,'795:0 '),\n(797,'HeroesVigil',0,12,56,1,10,0,-9101.04,-1034.1,72.9837,5.20227,'698:0 699:0 700:0 701:0 '),\n(798,'DWPExitW',0,41,2697,50,60,0,-10464.2,-1734.78,86.7801,1.49361,'785:0 171:0 802:0 '),\n(799,'DeadwindRavineSW',0,41,2558,50,60,0,-10919.4,-1957.74,114.777,4.67839,'171:0 800:0 '),\n(800,'TheViceW',0,41,2561,50,60,0,-10843.3,-2118.87,121.161,1.51324,'799:0 172:0 79:0 '),\n(801,'DWPExitE',0,41,2938,50,60,0,-10593.5,-2125.78,90.9212,3.83802,'172:0 170:0 802:0 811:0 '),\n(802,'DeadsmansCrossingE',0,41,41,50,60,0,-10437,-2037.61,94.6245,1.59492,'798:0 801:0 810:0 '),\n(803,'GroshgokCompoundInside',0,41,2937,50,60,0,-11169.4,-2483.11,105.139,0.944598,'79:0 '),\n(804,'KarazhanOutskirts',0,41,2562,50,60,0,-11148.9,-2130,55.9803,1.2403,'79:0 805:0 806:0 '),\n(805,'Karazhan',0,41,2562,50,60,0,-11115.2,-2008.72,48.4017,4.31317,'804:0 806:0 '),\n(806,'KarazhanCellarEntrance',0,41,2837,50,60,0,-11173.4,-2033.69,47.0759,0.798522,'804:0 805:0 807:0 '),\n(807,'KarazhanCellar1',0,41,2837,50,60,0,-11100.4,-1963.77,1.93936,4.49657,'806:0 808:0 '),\n(808,'KarazhanCellar2',0,41,2837,50,60,0,-11159.5,-1898.41,-17.7918,6.21463,'807:0 809:0 '),\n(809,'KarazhanCellar3',0,41,2837,50,60,0,-11033.9,-1910.04,-32.9889,4.98353,'808:0 '),\n(810,'DeadmansCrossingBottom',0,41,41,50,60,0,-10282.6,-2019.49,51.0186,2.21028,'802:0 '),\n(811,'SSExitW',0,8,8,33,45,0,-10546.2,-2376.39,84.2413,1.87648,'801:0 812:0 '),\n(812,'SSW1',0,8,8,33,45,0,-10381.8,-2424.26,52.7345,2.75809,'811:0 813:0 '),\n(813,'SSW2',0,8,8,33,45,0,-10427.8,-2549.06,24.1947,5.68762,'812:0 814:0 830:0 '),\n(814,'IthariusCaveOutside',0,8,1777,33,45,0,-10561.3,-2508.68,22.0709,5.83489,'813:0 815:0 816:0 '),\n(815,'IthariusCave',0,8,1777,33,45,0,-10677.4,-2531.21,28.912,6.2649,'814:0 '),\n(816,'SSCRW1',0,8,1780,33,45,0,-10387.5,-2710.03,21.6778,1.56036,'814:0 817:0 818:0 819:0 830:0 '),\n(817,'MistyValley',0,8,116,33,45,0,-10110,-2413.91,29.9136,4.35049,'816:0 818:0 '),\n(818,'SSW3',0,8,8,33,45,0,-10320.4,-2794.27,21.9908,1.07734,'817:0 816:0 819:0 820:0 829:0 830:0 '),\n(819,'Harborage',0,8,657,33,45,2,-10113,-2807.71,22.1444,3.06047,'818:0 816:0 820:0 829:0 '),\n(820,'SSN1',0,8,1798,33,45,0,-10099.4,-3266.23,20.4381,1.58785,'818:0 819:0 821:0 827:0 828:0 829:0 '),\n(821,'SSN2',0,8,76,33,45,0,-9974.74,-3687.45,21.6788,2.09247,'820:0 822:0 823:0 827:0 828:0 829:0 '),\n(822,'SSNE1',0,8,2403,33,45,0,-9634.53,-3969.85,0.0000146627,2.75613,'821:0 823:0 '),\n(823,'SSNE2',0,8,300,33,45,0,-10034.8,-4306.49,1.78832,0.101491,'822:0 821:0 824:0 826:0 827:0 '),\n(824,'SSE',0,8,300,33,45,0,-10512,-4371.71,6.04597,6.27469,'823:0 825:0 80:0 826:0 827:0 '),\n(825,'SSSE',0,8,300,33,45,0,-11038.3,-4116.28,1.98503,5.82703,'186:0 824:0 80:0 '),\n(826,'PoolOfTearsE',0,8,1778,33,45,0,-10444.5,-4087.57,23.9872,1.47592,'80:0 186:0 823:0 824:0 827:0 '),\n(827,'PoolOfTearsN',0,8,8,33,45,0,-10147.3,-3802.05,22.1649,2.27113,'820:0 821:0 823:0 824:0 826:0 828:0 829:0 '),\n(828,'PoolOfTearsW',0,8,8,33,45,0,-10377.4,-3577.61,22.0023,3.94206,'820:0 821:0 827:0 80:0 51:0 829:0 '),\n(829,'SSC',0,8,1798,33,45,0,-10292.9,-3192.2,22.1489,5.69742,'818:0 819:0 820:0 821:0 827:0 828:0 51:0 830:0 '),\n(830,'SSExitS',0,8,8,33,45,0,-10553.9,-3043.33,24.794,0.0857489,'813:0 816:0 818:0 829:0 51:0 831:0 '),\n(831,'SSExitSS',0,4,4,43,54,0,-10690.8,-2978.8,37.8508,5.87412,'830:0 834:0 '),\n(832,'StagalbogInside1',0,8,1817,33,45,0,-10966.8,-3697.03,11.0105,4.21105,'80:0 833:0 '),\n(833,'StagalbogInside2',0,8,1817,33,45,0,-10894.6,-3613.42,16.0499,6.1176,'832:0 '),\n(834,'BLExitN',0,4,4,43,54,0,-10811.4,-2992.21,41.134,0.16765,'831:0 835:0 839:0 846:0 '),\n(835,'BLNW1',0,4,1437,43,54,0,-11009.6,-2785.5,4.70615,5.63206,'834:0 836:0 839:0 840:0 '),\n(836,'DreadmaulHoldEntrance',0,4,1437,43,54,0,-10916.9,-2714.76,7.63624,3.85903,'835:0 837:0 838:0 '),\n(837,'DreadmaulHoldRight',0,4,1437,43,54,0,-10814.2,-2705.35,8.14439,3.20125,'836:0 838:0 '),\n(838,'DreadmaulHoldLeft',0,4,1437,43,54,0,-10859.8,-2615.61,8.07541,4.52661,'836:0 837:0 '),\n(839,'BLNW2',0,4,4,43,54,0,-11080.5,-2903.3,9.18506,0.371865,'835:0 834:0 196:0 '),\n(840,'BLW1',0,4,4,43,54,0,-11268.2,-2725.08,11.1047,5.91718,'835:0 841:0 842:0 '),\n(841,'DreadmaulPost',0,4,1439,43,54,0,-11528.8,-2858.71,8.50437,6.19557,'840:0 196:0 842:0 856:0 '),\n(842,'BLAltarOfStormsBottom',0,4,4,43,54,0,-11501.6,-2718.85,5.65372,0.900431,'840:0 841:0 843:0 856:0 '),\n(843,'BLAltarOfStormsMid',0,4,4,47,54,0,-11381.5,-2566.03,75.8033,3.74358,'842:0 844:0 '),\n(844,'BLAltarOfStormsTop',0,4,1441,47,54,1,-11255.9,-2556.41,97.0494,2.9896,'843:0 '),\n(845,'BLE1',0,4,4,43,54,0,-11149.6,-3232.6,8.07553,2.30354,'196:0 846:0 850:0 '),\n(846,'NethergardeOutside',0,4,1438,43,54,0,-10961.7,-3200.5,45.5708,0.954623,'834:0 845:0 847:0 '),\n(847,'NethergardeInside1',0,4,1438,43,54,2,-11008.9,-3340.48,64.7225,4.78147,'846:0 848:0 '),\n(848,'NethergardeInside2',0,4,1438,43,54,3,-10993.2,-3453.24,64.8707,3.21459,'847:0 849:0 '),\n(849,'NethergardeInside3',0,4,1438,43,54,2,-11112.2,-3438.11,79.0946,6.1402,'848:0 '),\n(850,'BLE2',0,4,1440,43,54,0,-11310.9,-3410.18,7.46828,4.16649,'845:0 851:0 852:0 '),\n(851,'BLE2Inside',0,4,1440,43,54,0,-11225.8,-3486.48,8.69295,2.17551,'850:0 '),\n(852,'BLE3',0,4,4,43,54,0,-11438.8,-3304.34,7.30604,5.76674,'196:0 850:0 853:0 854:0 '),\n(853,'BLSE',0,4,72,43,54,0,-11632.5,-3381.23,14.577,0.215935,'852:0 854:0 855:0 '),\n(854,'BLS1',0,4,4,43,54,0,-11607.8,-3099.85,7.81021,5.30924,'196:0 852:0 853:0 855:0 '),\n(855,'BLS2',0,4,72,43,54,0,-11765.8,-2959.84,7.91609,5.25623,'853:0 854:0 856:0 2370:0 '),\n(856,'BLS3',0,4,4,43,54,0,-11716.6,-2785.99,8.27783,3.20635,'855:0 841:0 842:0 857:0 '),\n(857,'TaintedScar1',0,4,73,55,60,0,-11907.8,-2658.64,-2.15637,5.48008,'856:0 '),\n(858,'SVExitN',0,33,33,33,45,0,-11362.1,-380.82,64.9035,0.170793,'768:0 859:0 '),\n(859,'SVExitNFork',0,33,33,33,45,0,-11397.1,-284.376,58.1739,3.29667,'858:0 860:0 861:0 '),\n(860,'RebelCamp',0,33,99,33,45,3,-11314.2,-182.813,75.1397,3.66777,'859:0 '),\n(861,'SVEntranceN',0,33,33,33,45,0,-11511.9,-302.586,38.7986,0.353382,'859:0 863:0 864:0 862:0 '),\n(862,'NesingwarysExpeditionCamp',0,33,100,33,45,1,-11616,-50.0157,10.9823,4.49439,'861:0 879:0 880:0 881:0 901:0 902:0 907:0 '),\n(863,'SVNBridge1N',0,33,33,33,45,0,-11604.1,-282.333,37.221,5.64107,'861:0 879:0 '),\n(864,'SVNHubN1',0,33,33,33,45,0,-11643.7,-473.703,17.1608,0.3141,'861:0 865:0 873:0 '),\n(865,'KurzensCompound',0,33,101,33,45,0,-11604,-644.056,29.157,3.77181,'864:0 866:0 872:0 '),\n(866,'TheStockpile1',0,33,106,33,45,0,-11461.5,-750.28,30.6105,4.24893,'865:0 867:0 '),\n(867,'TheStockpile2',0,33,106,33,45,0,-11514.8,-845.839,22.0076,3.08261,'866:0 868:0 869:0 '),\n(868,'TheStockpile3',0,33,106,33,45,0,-11418.4,-794.929,14.9653,3.89354,'867:0 '),\n(869,'TheStockpile4',0,33,106,33,45,0,-11506.4,-946.763,29.2275,0.414209,'867:0 870:0 '),\n(870,'TheStockpile5',0,33,106,33,45,0,-11406.8,-896.737,18.0813,0.89682,'869:0 871:0 '),\n(871,'TheStockpile6',0,33,106,33,45,0,-11337.1,-985.396,27.3203,1.9202,'870:0 '),\n(872,'SVNHubN2',0,33,33,33,45,0,-11729.7,-799.127,29.6214,0.89486,'865:0 873:0 875:0 913:0 '),\n(873,'VentureCoBaseCamp',0,33,1760,33,45,0,-11959.6,-531.751,11.3978,5.11834,'872:0 864:0 874:0 875:0 913:0 '),\n(874,'SVNHub1',0,33,33,33,45,0,-12225,-546.002,28.8839,0.0407319,'873:0 875:0 911:0 913:0 915:0 '),\n(875,'SVE1',0,33,33,33,45,0,-12149.1,-965.968,32.4681,1.43677,'872:0 873:0 874:0 876:0 878:0 913:0 '),\n(876,'MoshoggOgreMound',0,33,105,33,45,0,-12352.7,-972.262,13.1171,5.38338,'875:0 877:0 878:0 913:0 '),\n(877,'MoshoggOgreMoundInside',0,33,105,33,45,0,-12364,-1147.48,0.104103,2.92311,'876:0 '),\n(878,'MoshoggOgreMoundUpper',0,33,105,33,45,0,-12466.5,-881.644,39.1084,5.72306,'875:0 876:0 914:0 918:0 '),\n(879,'SVNBridge1C',0,33,33,33,45,0,-11710.1,-210.005,39.5643,5.90174,'863:0 880:0 862:0 '),\n(880,'SVNBridge1S',0,33,33,33,45,0,-11818.3,-43.4252,39.7487,5.27146,'879:0 862:0 903:0 905:0 907:0 '),\n(881,'SVNHubW1',0,33,33,33,45,0,-11518.9,255.102,25.1192,4.23669,'862:0 882:0 883:0 901:0 '),\n(882,'SVNHubW2',0,33,33,33,45,0,-11502.5,373.117,53.2392,3.3217,'881:0 883:0 '),\n(883,'ZulKundaNE',0,33,33,33,45,0,-11650.7,401.397,42.8581,5.68183,'881:0 882:0 884:0 889:0 890:0 '),\n(884,'ZulKundaE',0,33,33,33,45,0,-11785.5,436.17,47.4037,6.2807,'883:0 885:0 889:0 899:0 '),\n(885,'ZulKundaSE',0,33,33,33,45,0,-11863.3,560.263,47.0214,5.06137,'884:0 886:0 887:0 889:0 '),\n(886,'ZulKundaS',0,33,33,33,45,0,-11831.5,711.922,45.1329,4.4252,'885:0 888:0 '),\n(887,'SavageCoastNW1',0,33,301,33,45,0,-11924.1,793.032,3.06387,4.97496,'885:0 894:0 185:0 897:0 898:0 '),\n(888,'ZulKunda1',0,33,102,33,45,0,-11690.4,742.837,49.7495,3.41987,'886:0 889:0 891:0 '),\n(889,'ZulKunda2',0,33,102,33,45,0,-11694.8,565.959,49.7011,1.34053,'883:0 884:0 885:0 888:0 890:0 891:0 '),\n(890,'ZulKunda3',0,33,102,33,45,0,-11550.4,601.183,50.5784,3.11945,'883:0 889:0 891:0 '),\n(891,'ZulKunda4',0,33,102,33,45,0,-11622.9,760.15,39.7329,0.007312,'888:0 889:0 890:0 892:0 893:0 '),\n(892,'ZulKunda5',0,33,102,33,45,0,-11528.7,724.898,59.4101,3.50037,'891:0 '),\n(893,'ZulKundaW',0,33,122,33,45,0,-11572.6,840.524,8.14386,2.72086,'891:0 894:0 '),\n(894,'SavageCoastNW2',0,33,122,33,45,0,-11692.5,954.651,3.70656,5.00441,'893:0 887:0 185:0 897:0 '),\n(895,'YojambaIsleW',0,33,3357,33,45,0,-11810.6,1364.62,0.0261903,4.46053,'185:0 '),\n(896,'YojambaIsleN',0,33,3357,33,45,0,-11748.3,1318.44,5.22585,2.37531,'185:0 '),\n(897,'VileReefIsle',0,33,301,33,45,0,-12154.2,871.091,18.6659,5.996,'894:0 887:0 '),\n(898,'SavageCoastW1',0,33,301,33,45,0,-12016.1,440.588,3.35169,0.661185,'887:0 899:0 900:0 '),\n(899,'SVNWHub1',0,33,33,33,45,0,-11888.7,290.463,12.6077,0.998902,'898:0 884:0 900:0 901:0 902:0 903:0 '),\n(900,'SavageCoastW2',0,33,33,33,45,0,-12196.8,238.239,2.19021,4.81004,'898:0 899:0 904:0 37:0 '),\n(901,'SVNHunW3',0,33,100,33,45,0,-11656.6,59.5536,17.3151,1.50941,'899:0 881:0 862:0 902:0 '),\n(902,'TkashiRuins',0,33,126,33,45,0,-11843.2,59.0602,14.1655,3.34528,'899:0 901:0 862:0 903:0 905:0 '),\n(903,'KalaiRuins',0,33,125,33,45,0,-12069.3,66.3927,-5.18214,3.5436,'902:0 899:0 880:0 904:0 906:0 '),\n(904,'SVNHub2',0,33,33,33,45,0,-12283.3,28.601,18.2879,0.246879,'903:0 900:0 37:0 912:0 '),\n(905,'SVNBridge2N',0,33,33,33,45,0,-11907.9,-50.0313,39.7259,0.870484,'902:0 880:0 906:0 907:0 '),\n(906,'SVNBridge2S',0,33,33,33,45,0,-12090.1,-139.679,35.2928,0.399245,'903:0 905:0 910:0 '),\n(907,'SVCHub1',0,33,33,33,45,0,-11853.5,-167.599,15.3333,0.51312,'862:0 880:0 905:0 '),\n(908,'SavageCoastW3',0,33,301,33,45,0,-12543.1,74.9728,0.873061,0.513523,'37:0 912:0 '),\n(909,'SavageCoastW4',0,33,1578,33,45,0,-12691.2,142.464,3.092,5.80512,'921:0 924:0 925:0 936:0 '),\n(910,'SVNBridge3W',0,33,33,33,45,0,-12171.4,-240.719,29.8621,0.766786,'906:0 911:0 912:0 '),\n(911,'SVNBridge3E',0,33,33,33,45,0,-12157.4,-431.52,30.3485,1.45204,'874:0 910:0 913:0 '),\n(912,'MizjahRuins',0,33,129,33,45,0,-12468.7,-147.093,13.8431,5.95827,'904:0 908:0 910:0 916:0 '),\n(913,'SVNHub3',0,33,1740,33,45,0,-12127.6,-649.027,14.8876,2.30225,'874:0 876:0 911:0 873:0 875:0 872:0 '),\n(914,'BaliamahRuins',0,33,127,33,45,0,-12540.7,-734.478,39.4424,6.20568,'878:0 915:0 917:0 918:0 '),\n(915,'SVNHub4',0,33,33,33,45,0,-12417,-580.502,11.0755,6.10556,'914:0 874:0 916:0 '),\n(916,'SVNHub5',0,33,33,33,45,0,-12522,-370.721,12.7107,0.882666,'912:0 915:0 917:0 921:0 '),\n(917,'ZiatajaiRuins',0,33,128,33,45,0,-12701.1,-464.07,30.0552,6.19787,'914:0 916:0 918:0 920:0 '),\n(918,'ZulMamweN',0,33,33,33,45,0,-12776.9,-784.489,63.0348,0.421265,'878:0 914:0 917:0 919:0 '),\n(919,'ZulMamweC',0,33,103,33,45,0,-12985.7,-833.459,69.9343,0.193503,'918:0 920:0 '),\n(920,'ZulMamweW',0,33,103,33,45,0,-12943.6,-608.837,53.0521,6.05178,'917:0 919:0 '),\n(921,'SVSHub1',0,33,33,33,45,0,-12826,-301.024,9.96047,5.46666,'916:0 922:0 909:0 925:0 '),\n(922,'SVSVentureCoMine1',0,33,33,33,45,0,-12978,-452.477,53.6008,5.60214,'921:0 923:0 '),\n(923,'SVSVentureCoMine2',0,33,33,33,45,0,-13088.9,-466.483,47.2022,3.61705,'922:0 '),\n(924,'GurubashiArenaOuterN',0,33,1577,33,45,0,-12949,251.702,18.4183,2.2214,'909:0 937:0 '),\n(925,'STCHub1',0,33,1577,33,45,0,-13136.8,-184.248,-3.10173,5.92455,'909:0 921:0 926:0 929:0 '),\n(926,'CrystalveinMine1',0,33,310,33,45,0,-13322.7,-420.202,15.4509,2.04861,'925:0 927:0 928:0 929:0 '),\n(927,'CrystalveinMine2',0,33,310,33,45,0,-13158.5,-564.518,4.64271,0.568135,'926:0 928:0 '),\n(928,'CrystalveinMine3',0,33,310,33,45,0,-13170,-467.696,3.57551,3.1305,'926:0 927:0 '),\n(929,'STCHub2',0,33,1577,33,45,0,-13246.3,-110.492,19.5979,5.04296,'926:0 925:0 930:0 '),\n(930,'GurubashiOuterSE',0,33,1741,33,45,0,-13280.6,57.3154,17.1498,4.95263,'929:0 931:0 932:0 933:0 934:0 '),\n(931,'GurubashiOuterSSE',0,33,1741,33,45,0,-13402.5,96.0163,23.7905,6.03724,'930:0 932:0 933:0 934:0 935:0 943:0 944:0 '),\n(932,'RuinsOfJubuwal',0,33,477,33,45,0,-13382.8,-24.5642,22.0332,0.894086,'930:0 931:0 '),\n(933,'GurubashiArenaInside1',0,33,2177,33,45,0,-13216,312.587,21.8574,3.50161,'930:0 931:0 934:0 '),\n(934,'GurubashiArenaInside2',0,33,2177,33,45,0,-13163.8,257.166,21.8574,3.62531,'930:0 931:0 933:0 '),\n(935,'STCHub3',0,33,1577,33,45,0,-13475.6,312.292,31.942,5.22555,'931:0 938:0 942:0 '),\n(936,'SSavageCoast1',0,33,1578,33,45,0,-12862.3,459.666,6.403,4.74253,'909:0 937:0 '),\n(937,'GurubashiArenaOuterW',0,33,1741,33,45,0,-13076.6,428.328,24.6507,6.12678,'924:0 936:0 938:0 '),\n(938,'GurubashiArenaOuterSW',0,33,1577,33,45,0,-13273.2,479.65,3.7542,5.77924,'935:0 937:0 939:0 940:0 '),\n(939,'BloodsailCompoundW',0,33,1739,33,45,0,-13331.9,777.87,2.16424,3.85895,'938:0 940:0 941:0 '),\n(940,'BloodsailCompoundC',0,33,1739,33,45,0,-13470.3,687.069,8.46535,3.18977,'938:0 939:0 941:0 '),\n(941,'SSavageCoast2',0,33,1578,33,45,0,-13705.9,620.54,10.152,3.17013,'939:0 940:0 966:0 968:0 '),\n(942,'STCHub4',0,33,1577,33,45,0,-13618.7,330.576,43.7429,5.59271,'935:0 943:0 968:0 '),\n(943,'STCHub5',0,33,1577,33,45,0,-13719.1,129.331,23.7103,3.72188,'931:0 942:0 944:0 964:0 965:0 '),\n(944,'STCHub6',0,33,1577,33,45,0,-13572.2,-93.8439,42.7481,1.44857,'931:0 943:0 945:0 '),\n(945,'RuinsOfAboraz',0,33,311,33,45,0,-13627.7,-351.772,12.434,1.10692,'944:0 946:0 '),\n(946,'CrystalShore1',0,33,302,33,45,0,-13867.2,-89.5993,18.4363,2.92315,'945:0 947:0 964:0 '),\n(947,'CrystalShore2',0,33,302,33,45,0,-14086.6,-142.781,3.55938,1.30916,'946:0 948:0 '),\n(948,'WildShore1',0,33,43,33,45,0,-14260.2,-15.7846,3.81308,5.84287,'947:0 949:0 '),\n(949,'WildShore2',0,33,43,33,45,0,-14293.2,109.305,7.5176,0.82025,'948:0 950:0 962:0 '),\n(950,'WildShore3',0,33,43,33,45,0,-14585.8,177.319,2.91916,6.15507,'949:0 951:0 952:0 955:0 958:0 '),\n(951,'WildShore4',0,33,43,33,45,0,-14708.6,511.328,2.52661,5.16547,'950:0 952:0 '),\n(952,'WildShoreShips1',0,33,43,33,45,0,-14894,302.458,3.67936,4.08476,'950:0 951:0 953:0 954:0 955:0 '),\n(953,'WildShoreShips1Left',0,33,43,33,45,0,-14940,357.129,0.221882,0.0694,'952:0 '),\n(954,'WildShoreShips1Right',0,33,43,33,45,0,-15009.9,266.91,0.198072,0.0485881,'952:0 '),\n(955,'WildShoreShips2',0,33,43,33,45,0,-14843.8,75.9812,2.07268,0.570875,'950:0 952:0 956:0 957:0 '),\n(956,'WildShoreShips2Center',0,33,43,33,45,0,-14926.8,110.764,0.2001,4.9102,'955:0 '),\n(957,'JagueroIsle1',0,33,297,33,45,0,-14817.1,-427.547,1.62653,0.804531,'955:0 958:0 '),\n(958,'JagueroIsle2',0,33,297,33,45,0,-14556.9,-277.709,10.043,3.68499,'950:0 957:0 '),\n(959,'BootyBayW',0,33,35,33,45,0,-14300.4,523.178,8.69884,4.45859,'36:0 960:0 '),\n(960,'BootyBayS',0,33,35,33,45,1,-14462.8,467.081,15.1246,5.4423,'36:0 959:0 '),\n(961,'BootyBayEntrance',0,33,1577,33,45,0,-14249.5,333.168,24.6767,2.49077,'36:0 962:0 967:0 '),\n(962,'STCHub7',0,33,1577,33,45,0,-14217.2,239.309,20.2817,3.77098,'949:0 961:0 963:0 '),\n(963,'STCHub8',0,33,1577,33,45,0,-14073.6,266.586,17.42,5.16308,'962:0 964:0 965:0 '),\n(964,'MistvaleValley',0,33,1737,33,45,0,-13952.8,86.1666,15.8298,5.2161,'76:0 943:0 946:0 963:0 '),\n(965,'STCHub9',0,33,1577,33,45,0,-13879.6,258.837,17.7662,5.83459,'943:0 963:0 '),\n(966,'SSavageCoast3',0,33,1578,33,45,0,-13908.6,676.67,10.0579,5.32409,'967:0 941:0 969:0 '),\n(967,'SSavageCoast4',0,33,1578,33,45,0,-14050.8,500.109,2.8225,0.635261,'961:0 966:0 '),\n(968,'SSavageCoast5',0,33,1578,33,45,0,-13683.6,505.174,34.349,3.2526,'941:0 942:0 969:0 970:0 '),\n(969,'SSavageCoast6',0,33,1577,33,45,0,-13859.9,575.635,44.9464,6.06235,'966:0 968:0 '),\n(970,'SSavageCoast7',0,33,1577,33,45,0,-13849.3,494.156,89.7643,5.84244,'968:0 971:0 '),\n(971,'SSavageCoast8',0,33,1738,33,45,0,-13806.7,377.83,94.1372,2.10198,'970:0 '),\n(972,'Shadowglen',1,141,188,1,4,2,10281,1001.05,1342.98,5.96933,'33:0 62:0 '),\n(973,'ShadowthreadCaveInside',1,141,257,1,10,2,10936.3,951.018,1322.87,0.852457,'62:0 '),\n(974,'ShadowglenExit1',1,141,188,1,10,2,10236.2,699.749,1353.3,3.24203,'33:0 975:0 '),\n(975,'ShadowglenExit2',1,141,141,1,10,2,9988.41,591.889,1315.9,0.829698,'974:0 976:0 983:0 '),\n(976,'StarbreezeVillage',1,141,260,1,10,2,9825.13,399.226,1308.15,0.857567,'975:0 977:0 978:0 '),\n(977,'StarbreezeBackyard',1,141,141,1,10,2,10038.9,286.037,1323.77,1.89429,'976:0 '),\n(978,'TeldrassilS1',1,141,141,1,10,2,9396.17,568.108,1320.55,0.244948,'976:0 979:0 '),\n(979,'TeldrassilS2',1,141,141,1,10,2,9232.75,931.478,1321.37,5.94693,'978:0 980:0 '),\n(980,'TeldrassilS3',1,141,141,1,10,2,9171.08,1419.38,1320.31,5.13404,'979:0 981:0 '),\n(981,'TeldrassilHubS1',1,141,141,1,10,2,9352.14,1496.95,1274.46,0.140488,'980:0 982:0 34:0 988:0 '),\n(982,'GnarlpineHold',1,141,261,5,10,2,9106.12,1796.37,1324.94,4.59408,'981:0 '),\n(983,'DolanaarRoadE',1,141,141,1,10,2,9883.36,802.735,1309.84,1.38768,'975:0 63:0 34:0 '),\n(984,'FelRockInside',1,141,258,1,10,2,10112.3,1195.5,1312.02,5.06294,'63:0 '),\n(985,'DolanaarRoadW',1,141,141,1,10,2,9956.16,1248.6,1307.74,2.3227,'34:0 64:0 989:0 '),\n(986,'BanethilBarrowDenInside',1,141,262,4,10,2,9759.16,1553.23,1264.26,3.07786,'64:0 '),\n(987,'TeldrassilHubW1',1,141,141,1,10,2,10032.9,1820.23,1320.1,4.58073,'64:0 988:0 989:0 990:0 992:0 '),\n(988,'PoolsOfArlithrien',1,141,478,1,10,2,9596.69,1802.05,1293.91,5.64964,'981:0 987:0 '),\n(989,'TeldrassilHubW2',1,141,141,1,10,2,10162.3,1440.21,1325.14,3.89821,'985:0 987:0 '),\n(990,'OracleGladeRoad',1,141,141,4,10,2,10352,1874.33,1324.48,6.02465,'987:0 991:0 '),\n(991,'OracleGlade',1,141,264,1,10,2,10884.7,2071.72,1327.43,2.94589,'990:0 '),\n(992,'DarnassusEntrance',1,1657,1657,1,60,3,9945.1,2019.66,1351.87,4.64235,'987:0 '),\n(993,'AuberdineSpawn',1,148,442,8,20,3,6553.45,522.918,11.8561,3.67005,'59:0 994:0 '),\n(994,'LongWash1',1,148,453,8,20,2,6232.15,537.866,7.35703,5.18,'59:0 993:0 995:0 1008:0 '),\n(995,'LongWash2',1,148,2077,8,20,2,5552.17,453.898,19.6886,6.27955,'994:0 996:0 1005:0 1008:0 '),\n(996,'TwilightShore1',1,148,2078,14,20,2,5012.98,536.041,5.96794,4.54499,'995:0 997:0 1005:0 95:0 '),\n(997,'TwilightShore2',1,148,2078,14,20,2,4688.48,865.878,2.79823,2.76606,'996:0 998:0 999:0 '),\n(998,'TwilightShore3',1,148,2078,14,20,2,4503.92,906.145,4.30626,5.45958,'997:0 1002:0 1038:0 '),\n(999,'RemtravelsExcavation',1,148,450,8,20,2,4714.44,550.759,26.823,1.95474,'997:0 1000:0 95:0 94:0 '),\n(1000,'RemtravelsExcavationInside1',1,148,450,14,20,2,4620.8,642.65,6.43919,5.10026,'999:0 1001:0 '),\n(1001,'RemtravelsExcavationInside2',1,148,450,14,20,2,4567.99,561.83,1.27184,0.69615,'1000:0 '),\n(1002,'DarkshoreExitSW',1,148,2077,8,20,2,4243.34,412.704,58.3351,0.245327,'998:0 1003:0 1027:0 '),\n(1003,'DarkshoreExitFork',1,148,2077,8,20,2,4395.16,213.188,52.2559,2.29326,'1002:0 1004:0 94:0 1006:0 '),\n(1004,'DarkshoreExitSE',1,148,2077,8,20,2,4141.67,41.4988,23.6074,3.67163,'1003:0 1028:0 '),\n(1005,'WindbendRiverN',1,148,2077,8,20,2,5261.19,254.236,30.0406,3.18665,'995:0 996:0 95:0 1008:0 1009:0 '),\n(1006,'MastersGlaiveRoad',1,148,2077,8,20,2,4568.13,285.307,57.6068,1.63547,'94:0 95:0 1003:0 1007:0 '),\n(1007,'MastersGlaive',1,148,449,8,20,2,4541.58,449.011,32.0175,5.01071,'1006:0 '),\n(1008,'AmetharanRoad',1,148,2077,8,20,2,5720.14,311.438,20.1904,4.41184,'59:0 994:0 995:0 1005:0 1009:0 1010:0 '),\n(1009,'Ametharan',1,148,447,8,20,2,5586.01,84.3345,27.1266,1.57459,'1005:0 1008:0 1010:0 '),\n(1010,'AmetharanN',1,148,447,8,20,2,5801.69,83.785,34.5622,2.98046,'59:0 1008:0 1009:0 1011:0 '),\n(1011,'DarkshoreMoonkins',1,148,148,8,20,2,6267.1,23.9018,32.4976,3.19251,'59:0 1010:0 1012:0 1013:0 '),\n(1012,'DarkshoreNRoad1',1,148,148,8,20,2,6568,183.3,33.0481,3.37511,'59:0 1011:0 1013:0 1014:0 '),\n(1013,'BashalAran',1,148,446,8,20,2,6724.32,-182.155,32.4813,2.68198,'1011:0 1012:0 1014:0 '),\n(1014,'DarkshoreNRoad2',1,148,148,8,20,2,6818.81,102.669,19.5599,2.84101,'1012:0 1013:0 1015:0 '),\n(1015,'DarkshoreNRoad3',1,148,148,8,20,2,6851.5,-74.339,19.6655,5.58399,'1014:0 1016:0 1022:0 '),\n(1016,'DarkshoreNRoad4',1,148,148,8,20,2,7119.42,-81.8027,14.4199,3.09232,'1015:0 1017:0 1022:0 '),\n(1017,'DarkshoreNRoad5',1,148,148,8,20,2,7256.24,-291.22,21.0422,4.79468,'1016:0 1018:0 1022:0 '),\n(1018,'DarkshoreNRoad6',1,148,148,8,20,2,7251.65,-503.552,27.2626,1.57453,'1017:0 1019:0 1023:0 1026:0 1024:0 '),\n(1019,'CliffspringFalls1',1,148,445,8,20,2,6945.23,-647.544,58.2647,0.698808,'1018:0 96:0 1022:0 '),\n(1020,'CliffspringFallsInside1',1,148,445,8,20,2,6751.15,-678.916,69.6518,0.322209,'96:0 '),\n(1021,'CliffspringFallsInside2',1,148,445,8,20,2,6801.08,-758.228,69.6369,1.04478,'96:0 '),\n(1022,'CliffspringRiverCamp',1,148,456,8,20,2,6874.54,-444.951,41.5568,5.10331,'1015:0 1016:0 1017:0 1019:0 '),\n(1023,'TowerOfAlthalaxx',1,148,444,14,20,2,7134.02,-794.131,67.6245,1.1665,'1018:0 1024:0 '),\n(1024,'RuinsOfMathystra1',1,148,443,14,20,2,7266.69,-945.767,35.1327,5.29378,'1018:0 1023:0 1025:0 1026:0 '),\n(1025,'RuinsOfMathystra2',1,148,443,14,20,2,7600.47,-1097.96,49.7759,2.73731,'1026:0 1024:0 '),\n(1026,'RuinsOfMathystra3',1,148,443,14,20,2,7493.36,-767.521,12.9545,3.62677,'1018:0 1025:0 1024:0 '),\n(1027,'ZoramStrandFork',1,331,331,18,30,2,3817.2,679.137,5.10897,5.73165,'1002:0 1035:0 1036:0 1039:0 '),\n(1028,'AshenvaleNW_hub1',1,331,331,18,30,0,3974.7,-4.75098,16.9651,0.475045,'157:0 1004:0 1029:0 '),\n(1029,'AshenvaleNW_hub2',1,331,331,18,30,0,3657.91,209.708,2.09702,5.65554,'156:0 1028:0 1030:0 1031:0 '),\n(1030,'AshenvaleNW_hub3',1,331,331,18,30,0,3467.65,456.674,-1.34147,5.28246,'1029:0 1031:0 1032:0 1033:0 1035:0 '),\n(1031,'AshenvaleNW_hub4',1,331,413,18,30,0,3455.92,219.392,12.6662,4.49903,'156:0 1029:0 1030:0 1033:0 '),\n(1032,'AshenvaleNW_hub5',1,331,441,18,30,0,3249.97,704.667,5.38086,5.25498,'1030:0 1034:0 '),\n(1033,'MaestrasPost',1,331,413,18,30,0,3259.03,232.17,11.012,5.89391,'156:0 1030:0 1031:0 1034:0 1040:0 '),\n(1034,'LakeFalathim',1,331,441,18,30,0,3042.8,537.807,4.22352,5.78789,'1032:0 1033:0 '),\n(1035,'ZoramStrandExit',1,331,331,18,30,0,3657.05,656.795,4.96231,0.51393,'158:0 1027:0 1030:0 1036:0 '),\n(1036,'ZoramStrandC',1,331,414,18,30,0,3801.56,849.009,0.513784,2.44601,'158:0 1027:0 1035:0 1037:0 1039:0 '),\n(1037,'ZoramStrandS',1,331,414,18,30,0,3530.82,1106.94,3.5186,5.37358,'158:0 1036:0 '),\n(1038,'ZoramStrandNWIsle',1,331,414,18,30,0,4170.75,1326.83,19.2012,4.42522,'998:0 1039:0 '),\n(1039,'ZoramStrandN',1,331,414,18,30,0,4069.2,824.531,3.14713,3.15877,'1027:0 1036:0 1038:0 '),\n(1040,'MaestraHighway1',1,331,413,18,30,0,3098.29,226.932,38.2729,0.113369,'1033:0 1041:0 '),\n(1041,'MaestraHighway2',1,331,413,18,30,0,3010.21,148.647,65.398,0.16052,'1040:0 1042:0 '),\n(1042,'MaestraHighway3',1,331,331,18,30,0,2859.2,196.478,94.7169,5.92141,'1041:0 1043:0 '),\n(1043,'MaestraHighway4',1,331,331,18,30,0,2812.81,41.9868,95.6736,1.28951,'1042:0 1044:0 1058:0 '),\n(1044,'ThistlefurVillageExit',1,331,331,18,30,0,2868.2,-73.4622,101.174,1.57029,'1043:0 1045:0 1046:0 1056:0 1058:0 '),\n(1045,'ThistlefurVillageRoad1',1,331,331,18,30,0,3135.26,-172.008,106.895,2.338,'1044:0 1046:0 1047:0 1051:0 '),\n(1046,'ThistlefurVillageRoad2',1,331,331,18,30,0,3105.59,-62.1211,99.9184,3.67319,'1044:0 1045:0 '),\n(1047,'ThistlefurVillage1',1,331,2301,18,30,0,3406.44,-322.711,134.117,2.65215,'1045:0 1048:0 '),\n(1048,'ThistlefurVillage2',1,331,2301,18,30,0,3405.57,-442.447,153.072,1.32875,'1047:0 1049:0 1051:0 '),\n(1049,'ThistlefurVillage3',1,331,2301,18,30,0,3502.9,-501.921,187.011,2.83083,'1048:0 1050:0 '),\n(1050,'ThistlefurVillage4',1,331,2301,18,30,0,3340.18,-745.556,165.112,0.56888,'1049:0 '),\n(1051,'ThistlefurVillage5',1,331,331,18,30,0,3151.47,-574.826,152.496,0.537465,'1045:0 1048:0 1052:0 '),\n(1052,'IrisLakeFork',1,331,424,18,30,0,2898.98,-769.452,163.783,4.51548,'1051:0 1053:0 1054:0 1055:0 '),\n(1053,'IrisLake',1,331,424,18,30,0,2942.58,-1048.01,198.163,1.57223,'1052:0 '),\n(1054,'AshenvaleC_hub1',1,331,331,18,30,0,2507.45,-866.571,135.152,0.193841,'1052:0 1055:0 1065:0 '),\n(1055,'AshenvaleC_hub2',1,331,415,18,30,0,2438.14,-533.1,114.408,0.47461,'38:0 1052:0 1054:0 1057:0 1059:0 '),\n(1056,'AshenvaleC_hub3',1,331,415,18,30,2,2850.97,-220.421,105.829,4.13457,'38:0 1044:0 '),\n(1057,'AshenvaleC_hub4h',1,331,415,18,30,0,2496.08,-368.618,107.608,4.35054,'1055:0 1058:0 '),\n(1058,'AshenvaleC_hub5h',1,331,415,18,30,0,2723.63,-97.6203,94.1401,0.260605,'1043:0 1044:0 1057:0 1060:0 '),\n(1059,'RuinsOfStardust',1,331,418,18,30,0,2078.15,-208.159,97.3023,6.04115,'1055:0 1063:0 '),\n(1060,'FireScarShrine1',1,331,417,18,30,0,2256.66,75.4186,101.15,2.42832,'1058:0 1061:0 '),\n(1061,'FireScarShrine2',1,331,417,18,30,0,2216.37,200.114,132.147,0.0014348,'1060:0 1062:0 '),\n(1062,'FireScarShrine3',1,331,417,18,30,0,2267.87,408.396,133.106,0.831985,'1061:0 '),\n(1063,'MystralLakeW',1,331,421,18,30,0,2023,-843.478,97.5457,1.65663,'1064:0 1059:0 165:0 168:0 '),\n(1064,'MystralLakeC',1,331,421,18,30,0,1984.95,-1113.44,95.5274,1.49563,'1063:0 165:0 1067:0 '),\n(1065,'AshenvaleC_hub6',1,331,331,18,30,0,2450.24,-1258.76,125.028,2.45577,'1054:0 1066:0 1068:0 1071:0 '),\n(1066,'AshenvaleC_hub7',1,331,331,18,30,0,2235.23,-1257.52,78.4907,4.80606,'166:0 1065:0 165:0 '),\n(1067,'AshenvaleC_hub8',1,331,331,18,30,0,1948.15,-1576.73,62.1809,2.79343,'167:0 1064:0 1069:0 '),\n(1068,'AshenvaleC_hub9',1,331,426,18,30,0,2312.84,-1688.24,121.859,1.16373,'166:0 1065:0 1072:0 1074:0 '),\n(1069,'AshenvaleC_hub10',1,331,331,18,30,0,2066.34,-1671.01,66.4345,2.13565,'166:0 1067:0 1070:0 '),\n(1070,'AshenvaleE_hub1',1,331,2457,18,30,0,2042.45,-1869.26,98.5045,1.0065,'1069:0 1074:0 1106:0 '),\n(1071,'AshenvaleC_hub11',1,331,331,18,30,0,2610.58,-1273.73,147.484,1.45233,'1065:0 1072:0 '),\n(1072,'AshenvaleC_hub12',1,331,426,18,30,0,2492.08,-1690.32,135.531,1.25401,'1068:0 1071:0 1073:0 '),\n(1073,'AshenvaleC_hub13',1,331,2457,18,30,0,2524.32,-1885.69,143.053,1.82734,'1072:0 1074:0 1075:0 '),\n(1074,'AshenvaleC_hub14',1,331,2457,18,30,0,2243.34,-1738.27,110.775,5.1594,'1068:0 1073:0 1070:0 '),\n(1075,'AshenvaleExitN1',1,331,2457,18,30,0,2722.91,-1983,158.23,2.65788,'1073:0 1076:0 1078:0 '),\n(1076,'AshenvaleExitN2',1,331,2457,18,30,0,3188.58,-1706.76,164.247,3.95184,'1075:0 1077:0 '),\n(1077,'AshenvaleExitN3',1,331,2457,18,30,0,3297.65,-1543.44,164.945,5.56976,'1076:0 1118:0 '),\n(1078,'AshenvaleC_hub14',1,331,2457,18,30,0,2434.66,-2007.27,137.863,5.44996,'159:0 1075:0 '),\n(1079,'FalfarenRiverN1',1,331,433,18,30,0,2635.78,-2457.48,169.635,2.50866,'159:0 1080:0 1086:0 '),\n(1080,'FalfarenRiverN2',1,331,433,18,30,0,2714.01,-2536.19,182.43,2.13757,'1079:0 1081:0 160:0 '),\n(1081,'NightRunE',1,331,428,18,30,0,2790.65,-2428.46,206.042,3.93612,'1080:0 1082:0 160:0 '),\n(1082,'NightRun',1,331,428,18,30,0,2635.93,-2273.51,202.702,5.29878,'1081:0 1083:0 1084:0 '),\n(1083,'NightRunC',1,331,428,18,30,0,2508.34,-2113.14,200.284,6.10971,'1082:0 1084:0 '),\n(1084,'NightRunW1',1,331,428,18,30,0,2796.44,-2157.58,201.403,3.2489,'1082:0 1083:0 '),\n(1085,'ForestSongEntranceW',1,331,2358,18,30,0,2816.28,-3116.79,176.969,1.10278,'160:0 161:0 1088:0 1089:0 '),\n(1086,'AshenvaleE_hub2',1,331,2457,18,30,0,2468.98,-2717.07,150.406,4.36767,'1079:0 1087:0 1114:0 '),\n(1087,'AshenvaleE_hub3',1,331,2457,18,30,0,2544.03,-2863.47,160.596,1.768,'1086:0 1088:0 '),\n(1088,'SatyrnaarEntrance',1,331,2457,18,30,0,2634.38,-3046.12,161.142,6.24673,'1085:0 1087:0 1089:0 1090:0 1096:0 '),\n(1089,'Satyrnaar',1,331,430,18,30,0,2728.6,-2942.91,140.775,5.09219,'1085:0 1088:0 '),\n(1090,'AshenvaleE_hub4',1,331,2457,18,30,0,2718.15,-3174.63,154.002,4.95083,'1088:0 1091:0 '),\n(1091,'AshenvaleE_hub5',1,331,2457,18,30,0,2747.9,-3325.14,129.722,0.481917,'161:0 1090:0 1092:0 1096:0 1097:0 '),\n(1092,'AshenvaleE_hub6',1,331,2457,18,30,0,2858.75,-3503.4,106.63,0.432834,'1091:0 1093:0 1095:0 '),\n(1093,'BoughShadowEntrance',1,331,2358,18,30,0,3097.87,-3414.65,140.149,2.35511,'161:0 1092:0 1094:0 '),\n(1094,'BoughShadow',1,331,438,50,60,0,3193.56,-3715.88,121.867,1.87405,'1093:0 '),\n(1095,'AshenvaleExitE1',1,331,2457,18,30,0,2885.88,-3697.95,96.0233,1.45779,'1092:0 1269:0 '),\n(1096,'WarsongLumberCampW1',1,331,437,18,30,0,2228.79,-3249.63,101.566,0.607582,'1088:0 1091:0 1097:0 1099:0 '),\n(1097,'WarsongLumberCampE1',1,331,437,18,30,0,2451.74,-3379.23,102.331,4.70735,'1091:0 1096:0 1098:0 1356:0 '),\n(1098,'KargathiaKeep',1,331,2637,18,30,2,2437.92,-3546.25,98.3118,2.20389,'1097:0 '),\n(1099,'FelfireHillFork',1,331,434,18,30,0,2080.86,-3145.14,101.473,3.35095,'1116:0 162:0 1096:0 1356:0 '),\n(1100,'DemonFallRidgeW1',1,331,436,18,30,0,1674.45,-3019.31,126.383,5.53436,'162:0 1101:0 '),\n(1101,'DemonFallRidgeW2',1,331,436,18,30,0,1590.49,-2969.19,181.724,5.65806,'1100:0 1102:0 '),\n(1102,'DemonFallRidgeW3',1,331,436,18,30,0,1540.54,-2824.95,181.724,2.53218,'1101:0 1103:0 '),\n(1103,'DemonFallRidgeW4',1,331,436,18,30,0,1461.22,-2803.04,146.324,2.97199,'1102:0 '),\n(1104,'DemonFallRidgeE1',1,331,435,18,30,0,1627.48,-3316.31,144.676,0.784629,'162:0 1105:0 '),\n(1105,'DemonFallRidgeE2',1,331,435,18,30,0,1721.33,-3476.04,144.293,2.30437,'1104:0 '),\n(1106,'AshenvaleE_hub7',1,331,433,18,30,0,1988.27,-1943.15,97.1296,1.1247,'1070:0 1107:0 '),\n(1107,'AshenvaleE_hub8',1,331,2457,18,30,0,1962.79,-2012.8,96.2461,1.06579,'1106:0 1108:0 '),\n(1108,'AshenvaleE_hub9',1,331,2457,18,30,0,1921.52,-2170.42,94.4681,2.67153,'1107:0 1109:0 1113:0 '),\n(1109,'AshenvaleE_hub10',1,331,2457,18,30,0,1650,-2198.36,90.4962,0.191633,'163:0 1108:0 1110:0 1111:0 1112:0 '),\n(1110,'AshenvaleExitSh',1,331,2457,18,30,0,1372.44,-2259.8,89.962,3.46083,'1111:0 1109:0 1112:0 169:0 1518:0 '),\n(1111,'AshenvaleExitSa',1,17,1703,8,25,2,1283.04,-2337.27,95.7661,5.44005,'1109:0 1110:0 1519:0 '),\n(1112,'AshenvaleE_hub11',1,331,422,18,30,0,1407.02,-2005.8,95.7095,5.15141,'1109:0 1110:0 '),\n(1113,'SplintertreePostRoadW',1,331,431,18,30,0,1994.45,-2424.98,91.2477,1.28488,'164:0 175:0 1108:0 1114:0 '),\n(1114,'SplintertreePostFork',1,331,2457,18,30,0,2176.5,-2659.1,114.31,6.03653,'175:0 1086:0 1113:0 1115:0 '),\n(1115,'SplintertreePostRoadE',1,331,2457,18,30,0,2082.36,-2724.41,108.011,0.790059,'164:0 1114:0 1116:0 '),\n(1116,'FelfireHillBridgeW',1,331,434,18,30,0,2039.97,-2914.67,108.448,1.43407,'1099:0 1115:0 1356:0 '),\n(1117,'DorDanilarrowDenInside',1,331,432,18,30,0,1800.96,-2749.28,74.2595,4.55915,'164:0 '),\n(1118,'FelwoodExitS',1,361,361,46,56,0,3743.81,-1481.83,196.177,3.29581,'1077:0 1119:0 '),\n(1119,'EmeraldSanctuaryFork',1,361,2479,46,56,0,3880.67,-1320.46,216.16,2.5595,'1118:0 1120:0 1123:0 1124:0 '),\n(1120,'DeadwoodVillage1',1,361,1761,46,56,0,3687.18,-1161.35,207.07,5.5283,'1119:0 1121:0 1122:0 '),\n(1121,'DeadwoodVillage2',1,361,1761,46,56,0,3530.84,-1083.16,232.998,0.383932,'1120:0 1122:0 '),\n(1122,'DeadwoodVillage3',1,361,361,46,56,0,3799.15,-1018.83,233.051,3.60798,'1120:0 1121:0 1124:0 1149:0 '),\n(1123,'EmeraldSanctuary',1,361,2479,46,56,1,4008.37,-1323.24,254.74,2.01756,'1119:0 1124:0 '),\n(1124,'FelwoodRoad1',1,361,361,46,56,0,3917.77,-1102.56,251.192,4.86854,'1119:0 1122:0 1123:0 1125:0 1149:0 '),\n(1125,'FelwoodRoad2',1,361,361,46,56,0,4111.01,-1000.91,273.994,3.79844,'1124:0 1126:0 1149:0 1155:0 '),\n(1126,'FelwoodRoad3',1,361,361,46,56,0,4217.57,-895.05,283.719,4.15774,'1125:0 1127:0 1149:0 1156:0 1157:0 1158:0 '),\n(1127,'FelwoodRoad4',1,361,361,46,56,0,4284.53,-848.098,284.982,3.75914,'1126:0 1128:0 '),\n(1128,'FelwoodRoad5',1,361,361,46,56,0,4421.12,-848.39,292.935,3.21525,'1127:0 1129:0 1157:0 '),\n(1129,'FelwoodRoad6',1,361,361,46,56,0,4543.91,-853.393,298.894,3.13867,'1128:0 1130:0 '),\n(1130,'FelwoodRoad7',1,361,361,46,56,0,4626.9,-811.164,299.948,3.55493,'1129:0 1131:0 1158:0 '),\n(1131,'FelwoodRoad8',1,361,361,46,56,0,4816.57,-743.65,300.125,3.49799,'1130:0 1132:0 1162:0 '),\n(1132,'FelwoodRoad9',1,361,361,46,56,0,4924.41,-736.286,307.085,3.21525,'1131:0 1133:0 1161:0 '),\n(1133,'FelwoodRoad10',1,361,361,46,56,0,5067.29,-754.16,325.077,3.06602,'1132:0 1134:0 1162:0 '),\n(1134,'FelwoodRoad11',1,361,361,46,56,0,5190.8,-721.312,342.065,3.32245,'1133:0 1135:0 1163:0 '),\n(1135,'FelwoodRoad12',1,361,1765,46,56,0,5321.67,-714.318,345.44,3.1693,'1134:0 1136:0 1175:0 '),\n(1136,'FelwoodRoad13',1,361,361,46,56,0,5528.6,-586.974,357.722,3.70533,'1135:0 1137:0 1175:0 1176:0 '),\n(1137,'FelwoodRoad14',1,361,361,46,56,0,5829.53,-657.626,373.409,2.93956,'1136:0 1138:0 1176:0 1177:0 '),\n(1138,'FelwoodRoad15',1,361,361,46,56,0,6212.38,-740.556,409.705,2.87084,'1137:0 1139:0 '),\n(1139,'FelwoodRoad16',1,361,361,46,56,0,6248.94,-853.467,415.845,1.8714,'1138:0 1140:0 1180:0 1188:0 '),\n(1140,'FelwoodRoad17',1,361,361,46,56,0,6316.22,-1000.95,421.045,1.77912,'1139:0 1141:0 1181:0 '),\n(1141,'FelwoodRoad18',1,361,361,46,56,0,6517.96,-1128.86,435.787,2.40548,'1140:0 1142:0 1187:0 '),\n(1142,'FelwoodRoad19',1,361,361,46,56,0,6589.42,-1238.14,446.438,2.19734,'1141:0 1143:0 1181:0 149:0 '),\n(1143,'FelwoodRoad20',1,361,361,46,56,0,6642.07,-1424.29,466.141,1.83997,'1142:0 1144:0 149:0 1190:0 '),\n(1144,'FelwoodRoad21',1,361,361,46,56,0,6582.2,-1624.29,494.577,1.32358,'1143:0 1145:0 1190:0 '),\n(1145,'FelwoodRoad22',1,361,361,46,56,0,6510.95,-1745.71,510.835,1.13311,'1144:0 1146:0 1183:0 '),\n(1146,'FelwoodRoad23',1,361,361,46,56,0,6528.61,-1901.05,539.009,1.63379,'1145:0 1147:0 1191:0 1193:0 '),\n(1147,'FelwoodRoad24',1,361,361,46,56,0,6558.12,-2008.36,559.656,1.52776,'1146:0 1148:0 1193:0 '),\n(1148,'FelwoodRoad25',1,361,361,46,56,0,6560.77,-2085.29,574.689,1.48063,'1147:0 1191:0 148:0 '),\n(1149,'JadefireGlenEntrance',1,361,361,46,56,0,3926.58,-911.03,268.957,1.31568,'1122:0 1124:0 1125:0 1126:0 1150:0 1157:0 '),\n(1150,'JadefireGlen1',1,361,2480,46,56,0,3811.45,-783.703,310.11,5.52543,'1149:0 1151:0 1152:0 1153:0 '),\n(1151,'JadefireGlen2',1,361,2480,46,56,0,3718.85,-847.307,312.709,0.532263,'1150:0 '),\n(1152,'JadefireGlen3',1,361,2480,46,56,0,3912.89,-762.669,314.637,3.43039,'1150:0 '),\n(1153,'JadefireGlen4',1,361,2480,46,56,0,3856.5,-672.112,328.888,4.11173,'1150:0 1154:0 '),\n(1154,'JadefireGlen5',1,361,2480,46,56,0,4036.91,-552.243,344.95,3.72492,'1153:0 '),\n(1155,'FelwoodSide1_1',1,361,361,46,56,0,4213.32,-1147.96,320.929,1.94598,'1125:0 1156:0 '),\n(1156,'FelwoodSide1_2',1,361,361,46,56,0,4310.85,-1068.85,323.86,2.16393,'1126:0 1155:0 '),\n(1157,'FelwoodSide2_1',1,361,361,46,56,0,4140.08,-676.318,285.659,4.10583,'1126:0 1128:0 1149:0 '),\n(1158,'RuinsOfConstellas1',1,361,2481,46,56,0,4508.94,-658.169,260.072,5.34478,'1126:0 1130:0 1159:0 '),\n(1159,'RuinsOfConstellas2',1,361,2481,46,56,0,4578.21,-555.417,290.438,2.46629,'1158:0 1160:0 '),\n(1160,'RuinsOfConstellas3',1,361,2481,46,56,0,4580.93,-222.976,301.195,4.57508,'1159:0 '),\n(1161,'Jaedenar1',1,361,1763,46,56,0,4922.62,-656.651,308.014,3.98916,'1132:0 1162:0 '),\n(1162,'Jaedenar2',1,361,1763,46,56,0,4883.95,-595.824,308.56,5.16136,'1131:0 1133:0 1161:0 1163:0 1165:0 1166:0 '),\n(1163,'BloodvenomPostEntrance',1,361,361,46,56,0,5228.11,-538.087,328.617,3.14997,'1134:0 1162:0 1164:0 '),\n(1164,'BloodvenomPost',1,361,1997,46,56,0,5222.93,-365.293,325.373,4.62848,'150:0 1163:0 '),\n(1165,'ShrineOfTheDeceiver',1,361,1771,46,56,0,4783.38,-551.646,274.445,4.62258,'1162:0 '),\n(1166,'Jaedenar3',1,361,1763,46,56,0,4729.93,-453.696,349.944,4.46628,'1162:0 1167:0 '),\n(1167,'Jaedenar4',1,361,1763,46,56,0,4856.52,-382.228,350.288,4.8845,'1166:0 1168:0 '),\n(1168,'ShadowHold1',1,361,1770,46,56,0,4986.27,-445.68,316.676,5.65694,'1167:0 1169:0 '),\n(1169,'ShadowHold2',1,361,1770,46,56,0,5098.64,-485.812,296.677,4.68186,'1168:0 1170:0 '),\n(1170,'ShadowHold3',1,361,1770,46,56,0,5178.54,-485.604,301.227,5.33099,'1169:0 1171:0 '),\n(1171,'ShadowHold4',1,361,1770,46,56,0,5275.41,-671.399,253.46,3.4162,'1170:0 1172:0 '),\n(1172,'ShadowHold5',1,361,1770,46,56,0,5339.64,-532.836,254.255,4.57192,'1171:0 1173:0 1174:0 '),\n(1173,'ShadowHold6',1,361,1770,46,56,0,5427.58,-486.39,248.303,2.98345,'1172:0 '),\n(1174,'ShadowHold7',1,361,1770,46,56,0,5435.52,-425.111,272.429,5.11384,'1172:0 '),\n(1175,'ShatterScarVale1',1,361,1766,46,56,0,5476.34,-722.154,342.284,2.91904,'1135:0 1136:0 1176:0 1178:0 '),\n(1176,'ShatterScarVale2',1,361,1766,46,56,0,5601.44,-768.8,344.125,2.60488,'1136:0 1137:0 1175:0 1178:0 '),\n(1177,'ShatterScarVale3',1,361,1766,46,56,0,5560.13,-1032.72,379.177,1.06354,'1137:0 1178:0 1179:0 '),\n(1178,'ShatterScarVale4',1,361,1766,46,56,0,5457.81,-881.575,366.112,0.423435,'1175:0 1176:0 1177:0 '),\n(1179,'ShatterScarVale5',1,361,1766,46,56,0,5754.61,-1189.42,406.559,5.86624,'1177:0 1180:0 '),\n(1180,'IrontreeWoods1',1,361,1767,46,56,0,6121.79,-1182.38,370.89,3.93611,'1139:0 1179:0 1181:0 1182:0 '),\n(1181,'IrontreeWoods2',1,361,1767,46,56,0,6394.76,-1179.55,386.014,6.27855,'1140:0 1142:0 1180:0 '),\n(1182,'IrontreeWoods3',1,361,1767,46,56,0,6130.52,-1612.09,477.459,1.51512,'1180:0 1183:0 '),\n(1183,'IrontreeWoods4',1,361,1767,46,56,0,6296.99,-1561.48,453.656,3.98913,'1145:0 1182:0 149:0 '),\n(1184,'IrontreeCavern1',1,361,1768,46,56,0,6352.66,-1649.89,424.433,0.128896,'149:0 1185:0 1186:0 '),\n(1185,'IrontreeCavern2',1,361,1768,46,56,0,6439.2,-1697.67,413.417,3.51397,'1184:0 '),\n(1186,'IrontreeCavern3',1,361,1768,46,56,0,6348.65,-1752.82,421.668,2.4419,'1184:0 '),\n(1187,'JadefireRun1',1,361,2618,46,56,0,6621.19,-889.352,485.149,4.30328,'1141:0 1188:0 '),\n(1188,'JadefireRun2',1,361,2618,46,56,0,6459.98,-779.685,474.056,3.5611,'1139:0 1187:0 1189:0 '),\n(1189,'JadefireRun3',1,361,2618,46,56,0,6292.94,-589.199,467.536,5.59331,'1188:0 '),\n(1190,'FelwoodSide3_1',1,361,361,46,56,0,6839.58,-1594.78,491.498,3.27443,'1143:0 1144:0 '),\n(1191,'TalonbranchGladeEntrance',1,361,1998,46,56,0,6265.97,-1990.07,570.371,0.397118,'1146:0 1148:0 1192:0 '),\n(1192,'TalonbranchGlade',1,361,1998,46,56,3,6170.94,-1933.43,569.997,5.3569,'1191:0 '),\n(1193,'FelpawVillage1',1,361,1762,46,56,0,6806.95,-1993.95,564.972,2.74938,'1146:0 1147:0 1194:0 1195:0 '),\n(1194,'FelpawVillage2',1,361,1762,46,56,0,6789.17,-1850.3,554.16,4.19844,'1193:0 1195:0 '),\n(1195,'FelpawVillage3',1,361,1762,46,56,0,6929.55,-1812.01,575.12,3.87447,'1193:0 1194:0 '),\n(1196,'TimbermawHoldInside',1,361,1769,46,56,0,7017.44,-2122.43,586.887,0.262027,'142:0 148:0 1197:0 '),\n(1197,'MoongladeExitS',1,493,493,46,60,0,7409.39,-2177.56,520.829,3.84148,'1196:0 1198:0 1199:0 '),\n(1198,'MoongladeFlightH',1,493,493,46,60,5,7479.01,-2119.01,492.215,1.99187,'1197:0 1199:0 '),\n(1199,'MoongladeMainRoad1',1,493,493,46,60,0,7621.21,-2207.23,468.939,2.73996,'1197:0 1198:0 1200:0 '),\n(1200,'MoongladeMainRoad2',1,493,493,46,60,0,7521.64,-2483.68,454.141,1.37142,'1199:0 1201:0 '),\n(1201,'MoongladeFlightA',1,493,493,46,60,3,7441.03,-2497.31,462.16,0.100638,'1200:0 '),\n(1202,'FrostfireHotSprings1',1,618,2246,53,60,0,6669.75,-2350.35,569.688,6.11089,'142:0 1203:0 1204:0 1205:0 '),\n(1203,'FrostfireHotSprings2',1,618,618,53,60,0,6516.03,-2438.96,575.469,0.575811,'1202:0 1204:0 1205:0 1206:0 '),\n(1204,'FrostfireHotSprings3',1,618,2246,53,60,0,6739.97,-2534.28,547.608,2.35473,'1202:0 1203:0 1205:0 1206:0 1207:0 '),\n(1205,'FrostfireHotSprings4',1,618,2246,53,60,0,6844.94,-2510.17,562.168,2.83383,'1202:0 1203:0 1204:0 1207:0 '),\n(1206,'WinterspringWRoad1',1,618,618,53,60,0,6552.68,-2761.31,569.286,1.6412,'1203:0 1204:0 1208:0 1209:0 '),\n(1207,'FrostfireHotSprings5',1,618,2246,53,60,0,6778.35,-2683.46,542.964,1.10124,'1204:0 1205:0 '),\n(1208,'WinterspringWRoad2',1,618,618,53,60,0,6544.07,-3009.5,594.631,1.59877,'1206:0 1209:0 1211:0 1213:0 '),\n(1209,'TimbermawPost1',1,618,2243,53,60,0,6443.26,-2975.94,574.619,1.46329,'1206:0 1208:0 1210:0 '),\n(1210,'TimbermawPost2',1,618,2243,53,60,0,6501.28,-3395.1,596.264,1.54182,'1209:0 1212:0 '),\n(1211,'WinterspringWRoad3',1,618,618,53,60,0,6612.45,-3218.46,610.975,1.85402,'1208:0 1212:0 1213:0 '),\n(1212,'WinterspringWRoad4',1,618,618,53,60,0,6645.3,-3475.9,667.925,1.61251,'1210:0 1211:0 1214:0 '),\n(1213,'FrostfireHotSprings6',1,618,2246,53,60,0,6782.88,-3070.45,577.01,3.04979,'1208:0 1211:0 '),\n(1214,'WinterspringWRoad5',1,618,618,53,60,0,6657.52,-3668.1,695.82,1.56341,'1212:0 1215:0 1216:0 1221:0 '),\n(1215,'WinterspringWRoad6',1,618,2252,53,60,0,6397.07,-3892.14,680.982,0.597365,'1214:0 1216:0 1217:0 '),\n(1216,'LakeKeltheril',1,618,2251,53,60,0,6536.55,-4131.94,665.606,1.20213,'1214:0 1215:0 143:0 1218:0 '),\n(1217,'Mazthoril1',1,618,2245,53,60,0,6183.02,-4265.44,745.257,1.04309,'1215:0 1218:0 1219:0 '),\n(1218,'EverlookFork1',1,618,2255,53,60,0,6655.73,-4560.81,717.041,1.46131,'56:0 1216:0 1217:0 1239:0 1240:0 '),\n(1219,'Mazthoril2',1,618,2245,53,60,0,5991.6,-4416.44,712.225,0.648425,'1217:0 1220:0 1255:0 1259:0 '),\n(1220,'Mazthoril3',1,618,2245,53,60,0,6111.88,-4459.18,665.247,2.8927,'1219:0 1254:0 1255:0 '),\n(1221,'WinterspringCFork',1,618,618,53,60,0,6913.24,-4134.15,695.074,1.72442,'1214:0 1222:0 1224:0 1225:0 '),\n(1222,'WinterspringNRoad1',1,618,618,53,60,0,7189.47,-4145.52,708.652,2.01894,'1221:0 1223:0 1224:0 1225:0 1226:0 '),\n(1223,'StarfallVillage1',1,618,2253,53,60,2,7163.35,-3949.34,749.855,4.52632,'1222:0 1224:0 '),\n(1224,'StarfallVillage2',1,618,2253,53,60,2,7095.04,-4017.7,744.806,3.57795,'1221:0 1222:0 1223:0 '),\n(1225,'WinterspringN_hub1',1,618,618,53,60,0,7243.63,-4428.68,637.464,1.30573,'147:0 1221:0 1222:0 1235:0 '),\n(1226,'WinterspringNRoad2',1,618,618,53,60,0,7437.77,-4106.34,703.256,3.39493,'1222:0 1227:0 1231:0 1233:0 '),\n(1227,'WinterspringNRoad3',1,618,2241,53,60,0,7658.36,-4006.12,703.193,3.60307,'1226:0 1228:0 1229:0 1230:0 '),\n(1228,'FrostsaberRock',1,618,2241,53,60,0,8080.15,-3838.54,691.237,3.49507,'1227:0 1229:0 1230:0 '),\n(1229,'FrostsaberRockSide1',1,618,2241,53,60,0,7601.67,-3828.53,689.193,5.16206,'1227:0 1228:0 '),\n(1230,'FrostsaberRockSide2',1,618,2241,53,60,0,7960.17,-4207.36,694.89,1.05442,'1227:0 1228:0 1231:0 1232:0 '),\n(1231,'FrostsaberRockSide3',1,618,2241,53,60,0,7696.88,-4240.08,674.756,0.182632,'1226:0 1230:0 1232:0 1233:0 '),\n(1232,'FrostsaberRockSide4',1,618,2241,53,60,0,7898.77,-4343.01,714.863,1.26058,'1230:0 1231:0 1234:0 '),\n(1233,'WinterspringN_hub2',1,618,618,53,60,0,7541.26,-4433.34,604.622,1.91639,'1226:0 1231:0 1234:0 1235:0 '),\n(1234,'WinterspringN_hub3',1,618,618,53,60,0,7841.47,-4633.94,711.459,1.96351,'1232:0 1233:0 '),\n(1235,'WinterspringN_hub4',1,618,618,53,60,0,7409.79,-4690.69,629.373,2.1363,'1225:0 1233:0 1236:0 1238:0 '),\n(1236,'WinterspringN_hub5',1,618,618,53,60,0,7593.76,-4979.89,701.375,2.05382,'1235:0 1237:0 1238:0 '),\n(1237,'HiddenGrove',1,618,2242,53,60,0,7765.82,-4824.05,695.683,4.13316,'1236:0 '),\n(1238,'WinterfallVillage1',1,618,2244,53,60,0,7043.19,-4998.21,715.354,0.445711,'1235:0 1236:0 1243:0 '),\n(1239,'EverlookFork2',1,618,2255,53,60,0,6611.3,-4739.92,698.015,0.695072,'1218:0 1241:0 1247:0 1254:0 '),\n(1240,'EverlookFlightH',1,618,2255,53,60,5,6816.77,-4612.99,710.669,6.21445,'56:0 1218:0 1242:0 '),\n(1241,'EverlookFlightA',1,618,2255,53,60,3,6790.08,-4744.29,701.5,3.20441,'1239:0 1242:0 '),\n(1242,'WinterspringN_hub6',1,618,618,53,60,0,6927.32,-4786.97,694.458,2.5918,'1240:0 1241:0 1243:0 '),\n(1243,'WinterfallVillageOutside',1,618,2244,53,60,0,6939.52,-5010.6,692.554,1.59042,'1238:0 1242:0 1244:0 '),\n(1244,'WinterfallVillage2',1,618,2244,53,60,0,6808.46,-5094.96,695.933,0.427246,'1243:0 1245:0 '),\n(1245,'WinterfallVillage3',1,618,2244,53,60,0,6729.74,-5155.43,735.364,6.18029,'1244:0 1246:0 '),\n(1246,'WinterfallVillage4',1,618,2244,53,60,0,6716.73,-5241.35,779.049,1.49343,'1245:0 '),\n(1247,'IceThistleHills1',1,618,2247,53,60,0,6422.5,-5063.45,747.183,0.955424,'1239:0 1248:0 1249:0 '),\n(1248,'IceThistleHills2',1,618,2247,53,60,0,6075.66,-5048.11,793.011,6.23722,'1247:0 1255:0 '),\n(1249,'IceThistleHillsCave1',1,618,2247,53,60,0,6558.26,-5114.63,770.071,4.80583,'1247:0 1250:0 '),\n(1250,'IceThistleHillsCave2',1,618,2247,53,60,0,6647.69,-5270.98,753.532,0.248568,'1249:0 1251:0 1252:0 '),\n(1251,'IceThistleHillsCave3',1,618,2247,53,60,0,6547.52,-5279.93,751.433,0.29569,'1250:0 '),\n(1252,'IceThistleHillsCave4',1,618,2247,53,60,0,6591.19,-5377.61,757.91,2.11585,'1250:0 1253:0 '),\n(1253,'IceThistleHillsCave5',1,618,2247,53,60,0,6749.19,-5302.24,746.013,3.42748,'1252:0 '),\n(1254,'WinterspringSFork',1,618,618,53,60,0,6181.52,-4918.26,736.9,1.70352,'1220:0 1239:0 1255:0 '),\n(1255,'WinterspringSRoad1',1,618,618,53,60,0,5738.96,-4759.97,772.327,5.63249,'144:0 1219:0 1220:0 1248:0 1254:0 1256:0 1258:0 '),\n(1256,'OwlWingThicket1',1,618,2250,53,60,0,5704.51,-4972.1,807.203,1.24015,'1255:0 1257:0 '),\n(1257,'OwlWingThicket2',1,618,2250,53,60,0,5516.17,-4932.2,843.306,5.86024,'1256:0 '),\n(1258,'WinterspringSRoad2',1,618,618,53,60,0,5542.21,-4699,784.197,5.83863,'144:0 1255:0 1263:0 '),\n(1259,'DunMandarrW',1,618,2248,53,60,0,5726.18,-4420.5,778.036,0.0455333,'144:0 1219:0 '),\n(1260,'FrostwhisperGorge1',1,618,2249,53,60,0,5376.4,-4513.45,720.025,0.126024,'144:0 1261:0 '),\n(1261,'FrostwhisperGorge2',1,618,2249,53,60,0,5296.85,-4663.41,691.461,1.09206,'1260:0 1262:0 '),\n(1262,'FrostwhisperGorge3',1,618,2249,53,60,0,5259.63,-4868.84,691.501,1.4769,'1261:0 '),\n(1263,'FrostwhisperGorgeBridge1',1,618,618,53,60,0,5329.29,-4753.88,815.467,6.28158,'1258:0 1264:0 '),\n(1264,'FrostwhisperGorgeBridge2',1,618,618,53,60,1,5184.44,-4704.74,823.398,6.16966,'1263:0 1265:0 '),\n(1265,'DarkwhisperGorge1',1,618,618,53,60,0,5076.75,-4593.36,846.068,5.72001,'1264:0 1266:0 1267:0 1268:0 '),\n(1266,'DarkwhisperGorge2',1,618,2249,53,60,0,5094.49,-4876.76,867.355,1.66931,'1265:0 '),\n(1267,'DarkwhisperGorge3',1,618,2249,53,60,0,5323.19,-4418.49,854.383,3.62103,'1265:0 '),\n(1268,'DarkwhisperGorge4',1,618,2256,53,60,0,4938.26,-4535.16,855.372,3.64264,'1265:0 '),\n(1269,'AzsharaExitW',1,16,878,43,54,0,2800.83,-3813.24,83.7107,0.929092,'1095:0 1270:0 '),\n(1270,'TalrendisPointRoad',1,16,3137,43,54,0,2749.62,-3926.91,89.3218,0.361656,'1269:0 145:0 1271:0 1273:0 '),\n(1271,'ShadowsongShrine1',1,16,878,43,54,0,2935.67,-3982.68,124.392,2.73551,'1270:0 1272:0 '),\n(1272,'ShadowsongShrine2',1,16,1235,43,54,0,2850.78,-4024.75,140.874,0.32041,'1271:0 '),\n(1273,'AzsharaRoad1',1,16,16,43,54,0,2815.94,-4122.46,94.8896,2.21715,'1270:0 1274:0 1279:0 '),\n(1274,'AzsharaRoad2',1,16,16,43,54,0,2941.29,-4227.56,95.186,2.45278,'1273:0 1275:0 1280:0 '),\n(1275,'AzsharaRoad3',1,16,16,43,54,0,3057.29,-4322.31,90.9214,2.58827,'1274:0 1276:0 1280:0 '),\n(1276,'AzsharaRoad4',1,16,16,43,54,0,3229.99,-4491.16,92.7121,1.9737,'1275:0 1277:0 1280:0 1284:0 '),\n(1277,'AzsharaRoad5',1,16,16,43,54,0,3333.33,-4589.69,92.2964,2.31141,'1276:0 1278:0 1283:0 1286:0 1326:0 '),\n(1278,'AzsharaRoad6',1,16,16,43,54,0,3451.9,-4750.56,108.662,2.10326,'1277:0 1286:0 1287:0 1288:0 1324:0 1327:0 '),\n(1279,'AzsharaE1',1,16,16,43,54,0,2997.33,-4106.35,99.9666,3.2087,'1273:0 1280:0 1283:0 '),\n(1280,'AzsharaE2',1,16,1236,43,54,0,3118.77,-4225.25,100.015,2.98486,'1274:0 1275:0 1276:0 1279:0 1281:0 1283:0 '),\n(1281,'AzsharaE3',1,16,1236,43,54,0,3300.36,-4275.9,126.16,2.80817,'1280:0 1282:0 '),\n(1282,'AzsharaE4',1,16,1236,43,54,0,3271.81,-4373.57,125.961,1.43765,'1281:0 '),\n(1283,'AzsharaE5',1,16,1236,43,54,0,3373.1,-4206.33,105.482,3.57,'1277:0 1279:0 1280:0 1284:0 1285:0 '),\n(1284,'AzsharaE6',1,16,16,43,54,0,3582.46,-4138.13,104.333,3.80758,'1276:0 1283:0 1285:0 '),\n(1285,'Valormok',1,16,1237,43,54,5,3613.75,-4414.24,112.731,2.85922,'1283:0 1284:0 1286:0 '),\n(1286,'AzsharaE7',1,16,16,43,54,0,3590.09,-4639.97,116.675,1.6988,'1277:0 1278:0 1285:0 1287:0 '),\n(1287,'AzsharaE8',1,16,1224,43,54,0,3744.78,-4813.74,138.923,2.88199,'1278:0 1286:0 1289:0 '),\n(1288,'AzsharaE9',1,16,1221,43,54,0,3499.39,-4902.72,144.155,1.64696,'1278:0 1289:0 '),\n(1289,'AzsharaE10',1,16,1221,43,54,0,3759.42,-4967.77,142.273,2.79364,'1287:0 1288:0 1290:0 '),\n(1290,'AzsharaN1',1,16,1216,43,54,0,4036.22,-5259.02,107.607,2.29688,'1289:0 1291:0 1292:0 1322:0 '),\n(1291,'AzsharaN2',1,16,1216,43,54,0,4056.25,-5430.36,110.698,6.13747,'1290:0 1294:0 1293:0 1322:0 '),\n(1292,'AzsharaN3',1,16,1216,43,54,0,4443.1,-5422.68,110.062,2.83485,'1290:0 1293:0 '),\n(1293,'AzsharaN4',1,16,1225,43,54,0,4501.55,-5509.11,112.466,2.9016,'1291:0 1292:0 1294:0 1295:0 '),\n(1294,'AzsharaN5',1,16,1225,43,54,0,4344.93,-5684.07,101.657,1.91789,'1291:0 1293:0 1296:0 1297:0 1322:0 '),\n(1295,'AzsharaN6',1,16,1219,43,54,0,4731.82,-5683.23,101.157,2.58744,'1293:0 1296:0 1297:0 '),\n(1296,'AzsharaN7',1,16,1220,43,54,0,4463.44,-6017.87,99.0046,1.97484,'1294:0 1295:0 1299:0 1300:0 '),\n(1297,'AzsharaN8',1,16,1219,43,54,0,4794.73,-5948.23,94.5572,2.9291,'1294:0 1295:0 1298:0 1300:0 '),\n(1298,'AzsharaN9',1,16,1219,43,54,0,4752.23,-6324.43,112.261,1.52126,'1297:0 1300:0 1301:0 '),\n(1299,'AzsharaN10',1,16,1220,43,54,0,4304.26,-6172.26,132.068,0.476687,'1296:0 1300:0 '),\n(1300,'AzsharaN11',1,16,1220,43,54,0,4483.15,-6277.92,109.808,2.02983,'1296:0 1297:0 1298:0 1299:0 1302:0 '),\n(1301,'AzsharaN12',1,16,1219,43,54,0,4815.57,-6641.1,96.3628,1.82366,'1298:0 1302:0 1304:0 '),\n(1302,'AzsharaN13',1,16,1219,43,54,0,4579.43,-6593.47,100.233,1.80599,'1300:0 1301:0 1303:0 '),\n(1303,'AzsharaN14',1,16,2497,43,54,0,4335.22,-6872.83,94.6868,0.889033,'1302:0 1304:0 1305:0 1306:0 '),\n(1304,'AzsharaN15',1,16,2497,43,54,0,4772.55,-7077.06,93.7659,1.50753,'1301:0 1303:0 1306:0 1308:0 '),\n(1305,'AzsharaN16',1,16,1228,43,54,0,4163.23,-7077.25,104.42,0.918482,'1303:0 '),\n(1306,'AzsharaN17',1,16,2497,43,54,0,4378.53,-7190.76,114.567,1.36616,'1303:0 1304:0 1307:0 '),\n(1307,'AzsharaN18',1,16,2497,43,54,0,4547.1,-7477.55,77.7456,1.89042,'1306:0 1308:0 1312:0 1313:0 '),\n(1308,'AzsharaN19',1,16,2497,43,54,0,4697.79,-7545.77,76.1055,2.41466,'1304:0 1307:0 1309:0 1311:0 '),\n(1309,'AzsharaN20',1,16,1230,43,54,0,4879.55,-7649.88,-0.264126,2.8859,'1308:0 1310:0 1311:0 '),\n(1310,'AzsharaN21',1,16,1230,43,54,0,4981.1,-7379.41,2.45741,4.29372,'1309:0 '),\n(1311,'AzsharaN22',1,16,1230,43,54,0,4636.23,-7784.83,-0.404812,0.517923,'1308:0 1309:0 1312:0 1313:0 '),\n(1312,'AzsharaN23',1,16,1229,43,54,0,4265.54,-7853.88,3.0357,0.839938,'1307:0 1311:0 1313:0 '),\n(1313,'AzsharaN24',1,16,1228,43,54,0,4328.17,-7549.27,10.4959,5.60927,'1307:0 1311:0 1312:0 1314:0 1316:0 '),\n(1314,'AzsharaN25',1,16,1228,43,54,0,4248.34,-7195.83,18.9926,3.96189,'1313:0 1315:0 '),\n(1315,'AzsharaN26',1,16,1226,43,54,0,4103.25,-7187.96,10.5715,6.16297,'1314:0 1316:0 1317:0 '),\n(1316,'AzsharaN27',1,16,1226,43,54,0,4038.51,-7321.54,1.12717,0.769242,'1313:0 1315:0 1317:0 '),\n(1317,'AzsharaN28',1,16,1226,43,54,0,3934.81,-7205.7,26.486,5.91163,'1315:0 1316:0 1318:0 1320:0 1321:0 '),\n(1318,'TempleOfArkkoran1',1,16,1226,43,54,0,3807.79,-7280.66,26.4812,1.14034,'1317:0 1319:0 '),\n(1319,'TempleOfArkkoran2',1,16,1226,43,54,0,3768.46,-7134.44,26.4806,5.96857,'1318:0 1320:0 '),\n(1320,'TempleOfArkkoran3',1,16,1226,43,54,0,3902.48,-7060.61,26.4811,4.31335,'1317:0 1319:0 '),\n(1321,'TempleOfArkkoran4',1,16,1226,43,54,0,3858.12,-7171.88,24.03,5.83506,'1317:0 '),\n(1322,'AzsharaRamp1Top',1,16,1225,43,54,0,4108.38,-5554.42,99.4778,1.77221,'1290:0 1291:0 1294:0 1323:0 '),\n(1323,'AzsharaRamp1Bottom',1,16,1228,43,54,0,3897.1,-5695.14,17.2205,0.46452,'1322:0 1341:0 1342:0 '),\n(1324,'AzsharaC1',1,16,1221,43,54,0,3389.18,-4881.96,119.527,0.94754,'1278:0 1325:0 '),\n(1325,'AzsharaC2',1,16,1221,43,54,0,3548.39,-5142.38,83.2368,2.40053,'1324:0 1326:0 1328:0 46:0 1332:0 '),\n(1326,'AzsharaC3',1,16,1221,43,54,0,3353.2,-4996.79,88.9565,1.84487,'1277:0 1325:0 '),\n(1327,'AzsharaC4',1,16,1233,43,54,0,3111.76,-5099.04,133.69,0.892567,'1278:0 1328:0 1343:0 1344:0 '),\n(1328,'AzsharaC5',1,16,1221,43,54,0,3288.43,-5313.47,92.0357,2.24738,'1325:0 1327:0 1329:0 '),\n(1329,'AzsharaC6',1,16,1221,43,54,0,3069.52,-5522.7,98.46,0.58232,'1328:0 1330:0 1343:0 '),\n(1330,'AzsharaC7',1,16,1231,43,54,0,3063.44,-5615.53,60.2217,1.67206,'1329:0 1331:0 1338:0 '),\n(1331,'AzsharaC8',1,16,1231,43,54,0,3004.41,-5699.66,35.8993,0.918073,'1330:0 1334:0 '),\n(1332,'AzsharaC9',1,16,1221,43,54,0,3744.95,-5305.2,85.9123,2.48299,'1325:0 1333:0 '),\n(1333,'AzsharaC10',1,16,1228,43,54,0,3658.05,-5517.8,24.2321,1.28329,'1332:0 1339:0 1340:0 1341:0 '),\n(1334,'AzsharaC11',1,16,1231,43,54,0,3087.73,-5859.39,-0.161575,2.13546,'1331:0 1335:0 1338:0 '),\n(1335,'AzsharaC12',1,16,1231,43,54,0,2934.41,-5884.56,25.8109,0.120912,'1334:0 1336:0 '),\n(1336,'AzsharaC13',1,16,1231,43,54,0,2980.62,-6084.05,0.213247,2.38089,'1335:0 1337:0 '),\n(1337,'AzsharaC14',1,16,1231,43,54,0,2846.38,-6166.7,3.60284,0.643192,'1336:0 '),\n(1338,'AzsharaC15',1,16,1231,43,54,0,3226.36,-5673.24,15.8216,3.93007,'1330:0 1334:0 1339:0 1340:0 '),\n(1339,'AzsharaC16',1,16,1231,43,54,0,3427.33,-5505.43,26.9806,5.26131,'1333:0 1338:0 1340:0 1341:0 '),\n(1340,'AzsharaC17',1,16,1231,43,54,0,3475.44,-5753.95,11.6531,1.76236,'1333:0 1338:0 1339:0 1341:0 '),\n(1341,'AzsharaC18',1,16,1228,43,54,0,3704.73,-5723.53,4.41024,0.254392,'1323:0 1333:0 1339:0 1340:0 1342:0 '),\n(1342,'AzsharaC19',1,16,1228,43,54,0,3948.84,-5885.08,8.49314,2.09811,'1323:0 1341:0 '),\n(1343,'AzsharaS1',1,16,1234,43,54,0,2887.1,-5407.2,110.727,1.29111,'1327:0 1329:0 1344:0 1347:0 1346:0 '),\n(1344,'AzsharaS2',1,16,1234,43,54,0,2671.51,-5134.67,110.162,6.23323,'1327:0 1343:0 1345:0 '),\n(1345,'AzsharaS3',1,16,1234,43,54,0,2476.44,-5345.72,112.668,0.747221,'1344:0 1346:0 '),\n(1346,'AzsharaS4',1,16,16,43,54,0,2551.54,-5739.78,99.3784,1.5499,'1343:0 1345:0 1347:0 1348:0 '),\n(1347,'AzsharaS5',1,16,16,43,54,0,2773.38,-5801.37,102.296,1.23417,'1343:0 1346:0 '),\n(1348,'AzsharaS6',1,16,16,43,54,0,2497.05,-6122.14,101.12,1.55774,'1346:0 1349:0 '),\n(1349,'AzsharaS7',1,16,16,43,54,0,2591.64,-6535.29,102.94,1.79136,'1348:0 1350:0 1351:0 '),\n(1350,'AzsharaS8',1,16,16,43,54,0,2738.28,-6626.16,105.229,0.130243,'1349:0 '),\n(1351,'AzsharaS9',1,16,1232,43,54,0,2530.76,-6691.49,105.655,1.22588,'1349:0 1352:0 1353:0 '),\n(1352,'AzsharaS10',1,16,1232,43,54,0,2594.6,-6859.47,124.355,1.98575,'1351:0 '),\n(1353,'AzsharaS11',1,16,1232,43,54,0,2469.22,-6950.98,112.622,1.32995,'1351:0 1354:0 '),\n(1354,'AzsharaS12',1,16,1232,43,54,0,2290.99,-6837.2,120.824,5.67516,'1353:0 1355:0 '),\n(1355,'AzsharaS13',1,16,1232,43,54,0,2245.13,-6620.49,130.493,5.82242,'1354:0 '),\n(1356,'NightsongWoodsSE',1,331,2457,18,30,0,2031.76,-3416.6,92.6375,6.12481,'1097:0 1099:0 1116:0 1357:0 '),\n(1357,'SouthfuryRiver1',1,331,879,18,30,0,2157.71,-3580.65,40.0791,2.2096,'1356:0 1358:0 '),\n(1358,'SouthfuryRiver2',1,331,879,18,30,0,1982.59,-3613.01,40.3535,1.3378,'1357:0 1359:0 '),\n(1359,'SouthfuryRiver3',1,331,879,18,30,4,1751.38,-3745.84,39.7381,3.16817,'1358:0 1360:0 '),\n(1360,'OrgrimmarExitW',1,17,815,8,25,4,1641.94,-3837.63,50.7719,5.47332,'1359:0 1454:0 '),\n(1361,'DurotarN_hub1',1,14,14,1,10,4,1290.89,-4391.75,26.2836,3.73994,'30:0 1362:0 1377:0 1385:0 1386:0 '),\n(1362,'DurotarN_hub2',1,14,14,1,10,4,1341.58,-4623.78,24.2112,1.68496,'1361:0 1363:0 1365:0 1377:0 '),\n(1363,'SkullRock1',1,14,817,1,10,4,1448.11,-4879.66,11.5034,1.9029,'1362:0 1364:0 1365:0 '),\n(1364,'SkullRock2',1,14,817,1,10,4,1445.58,-4687.97,-5.65162,4.9365,'1363:0 '),\n(1365,'DurotarN_hub3',1,14,14,1,10,4,1100.2,-4908.62,14.577,0.165201,'1362:0 1363:0 1366:0 1367:0 '),\n(1366,'DurotarN_hub4',1,14,375,1,10,4,985.89,-5115.68,1.41706,1.16658,'1365:0 1367:0 '),\n(1367,'DurotarN_hub5',1,14,14,1,10,4,809.043,-4957.4,16.2794,2.83475,'1365:0 1366:0 1368:0 1370:0 '),\n(1368,'DustwindCave1',1,14,14,1,10,4,778.919,-4756.62,37.5488,4.94158,'1367:0 1369:0 1370:0 '),\n(1369,'DustwindCave2',1,14,371,1,10,4,931.181,-4715.15,19.9519,2.6443,'1368:0 '),\n(1370,'DurotarN_hub6',1,14,14,1,10,4,512.237,-4785.91,29.1897,1.93467,'1367:0 1368:0 1371:0 1407:0 '),\n(1371,'DurotarN_hub7',1,14,14,1,10,4,438.776,-4564.65,52.1313,5.05391,'1370:0 1372:0 1400:0 1403:0 '),\n(1372,'DurotarN_hub8',1,14,14,1,10,4,599.139,-4404.63,18.4833,5.05392,'1371:0 66:0 67:0 1400:0 1403:0 '),\n(1373,'DurotarCanyon1_2',1,14,410,1,10,4,754.968,-4457.2,15.6687,1.93155,'66:0 67:0 '),\n(1374,'DurotarCanyon1_3',1,14,14,1,10,4,720.095,-4682.12,-6.58629,2.1711,'66:0 1375:0 1401:0 '),\n(1375,'DurotarCanyon1_4',1,14,14,1,10,4,762.27,-4587.67,0.395604,5.89975,'1374:0 1376:0 1384:0 '),\n(1376,'DurotarCanyon1_5',1,14,410,1,10,4,909.793,-4623.59,17.4591,2.58341,'1375:0 1377:0 1378:0 '),\n(1377,'DurotarCanyon1_6',1,14,14,1,10,4,1089.79,-4544.84,18.7912,3.37862,'1361:0 1362:0 1376:0 1385:0 '),\n(1378,'DurotarCanyon1_7',1,14,410,1,10,4,846.499,-4687.15,10.6635,4.45069,'1376:0 1379:0 '),\n(1379,'DurotarCanyon1_8',1,14,370,1,10,4,822.93,-4819.09,11.1622,1.25216,'1378:0 1380:0 '),\n(1380,'DurotarCanyon1_9',1,14,370,1,10,4,922.247,-4823.86,14.833,3.04091,'1379:0 1381:0 1382:0 '),\n(1381,'DurotarCanyon1_10',1,14,370,1,10,4,984.82,-4668.01,26.8858,4.65295,'1380:0 '),\n(1382,'DurotarCanyon1_11',1,14,370,1,10,4,1028.11,-4807.86,13.422,1.33267,'1380:0 1383:0 '),\n(1383,'DurotarCanyon1_12',1,14,370,1,10,4,1112.67,-4667.33,19.0025,5.6445,'1382:0 '),\n(1384,'DurotarCanyon1_13',1,14,14,1,10,4,863.608,-4507.22,5.89497,4.47623,'1375:0 1385:0 '),\n(1385,'DurotarCanyon1_14',1,14,14,1,10,4,1076.54,-4421.72,18.043,3.13516,'67:0 1361:0 1377:0 1384:0 1387:0 '),\n(1386,'RocktuskFarm',1,14,1296,1,10,4,1261.75,-4189.97,25.9612,5.01817,'1361:0 1387:0 1388:0 '),\n(1387,'DurotarN_hub9',1,14,14,1,10,4,1103.69,-4095.77,17.1414,5.61704,'1385:0 1386:0 1388:0 1389:0 '),\n(1388,'DurotarN_hub10',1,14,14,1,10,4,1240.84,-3994.36,19.8563,4.64119,'1386:0 1387:0 1389:0 1452:0 1453:0 '),\n(1389,'DurotarN_hub11',1,14,814,1,10,4,932.462,-3903.15,18.4923,5.69476,'1387:0 1388:0 1390:0 1391:0 1451:0 1452:0 '),\n(1390,'DurotarN_hub12',1,14,14,1,10,4,554.028,-3867,21.5181,6.15421,'1389:0 1391:0 1392:0 1405:0 1406:0 '),\n(1391,'DurotarN_hub13',1,14,14,1,10,4,484.992,-4008.81,21.634,0.40509,'1389:0 1390:0 1392:0 1400:0 1405:0 1406:0 '),\n(1392,'DurotarCanyon2_1',1,14,14,1,10,4,621.087,-4034.14,5.79289,6.22882,'67:0 1390:0 1391:0 1393:0 1400:0 '),\n(1393,'DurotarCanyon2_2',1,14,369,1,10,4,805.35,-4026.74,-8.81716,3.20306,'1392:0 1394:0 1398:0 '),\n(1394,'DurotarCanyon2_3',1,14,369,1,10,4,924.692,-4010.46,-13.3326,3.34246,'1393:0 1395:0 '),\n(1395,'DurotarCanyon2_4',1,14,369,1,10,4,969.211,-4144.86,-6.8125,2.00533,'1394:0 1396:0 1397:0 '),\n(1396,'DurotarCanyon2_5',1,14,369,1,10,4,858.51,-4186.73,-13.9605,0.410964,'1395:0 '),\n(1397,'DurotarCanyon2_6',1,14,369,1,10,4,955.695,-4276.78,-6.40429,1.49874,'1395:0 '),\n(1398,'DurotarCanyon2_7',1,14,369,1,10,4,832.014,-4096.6,-12.8537,2.28805,'1393:0 1399:0 '),\n(1399,'DurotarCanyon2_8',1,14,369,1,10,4,733.597,-4112.95,-9.91997,0.344189,'1398:0 '),\n(1400,'RazormaneGrounds',1,14,816,1,10,4,394.471,-4227.01,25.6721,6.10902,'67:0 1371:0 1372:0 1391:0 1392:0 1403:0 1404:0 '),\n(1401,'DurotarCanyon1_15',1,14,14,1,10,4,618.018,-4729.15,-9.7302,0.530719,'1374:0 28:0 '),\n(1402,'DurotarRoadW1',1,14,14,1,10,4,229.555,-4564.93,14.4257,4.87206,'28:0 1403:0 1409:0 1437:0 '),\n(1403,'DurotarRoadW2',1,14,14,1,10,4,311.231,-4367.13,23.2866,0.650496,'1371:0 1372:0 1400:0 1402:0 1404:0 1437:0 1440:0 '),\n(1404,'DurotarRoadW3',1,14,14,1,10,4,290.25,-4093.37,30.0616,4.8897,'1400:0 1403:0 1405:0 1440:0 1441:0 1443:0 '),\n(1405,'DurotarRoadW4',1,14,14,1,10,4,289.101,-3928.87,32.0584,5.95001,'1390:0 1391:0 1404:0 1406:0 1441:0 1443:0 '),\n(1406,'DurotarWBridge',1,14,814,1,10,4,317.731,-3805.25,24.3367,6.02659,'1390:0 1391:0 1405:0 1443:0 1449:0 '),\n(1407,'DurotarS_hub1',1,14,14,1,10,4,250.862,-4982.03,19.1509,0.356019,'1370:0 1408:0 1409:0 1410:0 1414:0 '),\n(1408,'DurotarS_hub2',1,14,373,1,10,4,274.781,-5126.02,4.75879,2.02892,'1407:0 1414:0 '),\n(1409,'DurotarRoadS1',1,14,14,1,10,4,119.098,-4745.19,15.4912,5.09591,'28:0 1402:0 1407:0 1410:0 1414:0 1415:0 '),\n(1410,'DurotarRoadS2',1,14,14,1,10,4,-99.4238,-4745.37,21.6208,0.102741,'1407:0 1409:0 1411:0 1414:0 '),\n(1411,'DurotarRoadS3',1,14,14,1,10,4,-278.577,-4798.87,28.7297,0.267683,'1410:0 1412:0 1414:0 1415:0 '),\n(1412,'DurotarRoadS4',1,14,14,1,10,4,-448.465,-4791.29,35.8497,6.27205,'1411:0 1413:0 '),\n(1413,'DurotarRoadS5',1,14,14,1,10,4,-640.871,-4736.39,33.6569,6.15227,'1412:0 31:0 1419:0 1421:0 1422:0 1429:0 '),\n(1414,'TirigardeKeep1',1,14,372,1,10,4,-84.5912,-5061.01,15.5227,0.185219,'1407:0 1408:0 1409:0 1410:0 1411:0 1415:0 '),\n(1415,'TirigardeKeep2',1,14,372,1,10,4,-198.068,-5050.76,20.9866,3.49606,'1409:0 1411:0 1414:0 1416:0 1417:0 '),\n(1416,'TirigardeKeep3',1,14,372,1,10,4,-225.492,-5115.3,49.3248,1.51096,'1415:0 '),\n(1417,'TirigardeKeep4',1,14,372,1,10,4,-321.717,-5084.89,21.2127,0.285748,'1415:0 1418:0 '),\n(1418,'TirigardeKeep5',1,14,373,1,10,4,-291.897,-5186.7,20.4791,1.8644,'1417:0 '),\n(1419,'DurotarS_hub3',1,14,393,1,10,4,-716.008,-5088.67,9.54796,1.34603,'31:0 1413:0 1420:0 1444:0 '),\n(1420,'DurotarS_hub4',1,14,393,1,10,4,-920.843,-4982.52,11.1974,5.87385,'31:0 1419:0 1421:0 1422:0 1445:0 '),\n(1421,'DurotarS_hub5',1,14,393,1,10,4,-1100.19,-4784.19,8.13918,5.95632,'31:0 1413:0 1420:0 1422:0 '),\n(1422,'DurotarCanyon3_1',1,14,14,1,10,4,-978.237,-4704.6,20.1681,1.62878,'31:0 1413:0 1420:0 1421:0 1423:0 '),\n(1423,'DurotarCanyon3_2',1,14,366,1,10,4,-986.47,-4574.42,25.5859,4.28734,'1422:0 1424:0 1425:0 1427:0 '),\n(1424,'DurotarCanyon3_3',1,14,366,1,10,4,-1067.61,-4604.24,25.8221,3.64331,'1423:0 '),\n(1425,'DurotarCanyon3_4',1,14,366,1,10,4,-1047.58,-4451.84,27.4603,4.97458,'1423:0 1426:0 '),\n(1426,'DurotarCanyon3_5',1,14,366,1,10,4,-965.059,-4407.81,29.5222,3.58441,'1425:0 '),\n(1427,'DurotarCanyon3_6',1,14,366,1,10,4,-981.936,-4503.15,25.7079,1.87618,'1423:0 1428:0 '),\n(1428,'DurotarCanyon3_7',1,14,366,1,10,4,-904.997,-4477.99,29.6937,3.30756,'1427:0 '),\n(1429,'ValleyOfTrials1',1,14,363,1,10,4,-603.24,-4597.62,41.2213,4.5544,'1413:0 1430:0 '),\n(1430,'ValleyOfTrials2',1,14,363,1,10,4,-580.729,-4526.65,41.4449,4.54262,'1429:0 1431:0 '),\n(1431,'ValleyOfTrials3',1,14,363,1,10,4,-589.381,-4297.57,37.9694,5.56165,'1430:0 29:0 1432:0 1433:0 1434:0 1436:0 '),\n(1432,'ValleyOfTrials4',1,14,363,1,10,4,-746.092,-4261.15,43.9991,6.03879,'1431:0 '),\n(1433,'ValleyOfTrials5',1,14,363,1,10,4,-409.694,-4455.21,51.0433,2.32778,'1431:0 1434:0 1436:0 '),\n(1434,'ValleyOfTrials6',1,14,363,1,10,4,-197.604,-4331.89,68.4747,3.01697,'1431:0 1433:0 1435:0 1436:0 '),\n(1435,'ValleyOfTrials7',1,14,365,1,10,4,-87.1332,-4210.24,49.4149,4.1067,'1434:0 '),\n(1436,'ValleyOfTrials8',1,14,363,1,10,4,-403.018,-4206.27,53.0641,5.51453,'1431:0 1433:0 1434:0 '),\n(1437,'DurotarSW_hub1',1,14,816,1,10,4,162.168,-4433.07,35.4298,5.87386,'1402:0 1403:0 1438:0 1439:0 '),\n(1438,'DurotarSW_hub2',1,14,816,1,10,4,80.4142,-4475.95,43.2596,0.578313,'1437:0 1439:0 '),\n(1439,'DurotarSW_hub3',1,14,816,1,10,4,107.992,-4332.41,52.3223,5.13559,'1437:0 1438:0 1440:0 '),\n(1440,'DurotarSW_hub4',1,14,816,1,10,4,29.2317,-4205.25,67.7773,5.8385,'1403:0 1404:0 1439:0 1441:0 '),\n(1441,'DurotarSW_hub5',1,14,14,1,10,4,-53.7095,-4041.71,67.3331,0.00298548,'1404:0 1405:0 1440:0 1442:0 1443:0 '),\n(1442,'DurotarSW_hub6',1,14,814,1,10,4,-173.855,-3864.96,35.2069,5.30244,'1441:0 1443:0 1476:0 1474:0 '),\n(1443,'DurotarSW_hub7',1,14,14,1,10,4,72.4652,-3876.98,41.5453,3.44105,'1404:0 1405:0 1406:0 1441:0 1442:0 1474:0 '),\n(1444,'EchoIsles1',1,14,368,1,10,4,-808.575,-5363.62,2.20208,1.32598,'1419:0 1445:0 1448:0 '),\n(1445,'EchoIsles2',1,14,368,1,10,4,-1142.01,-5152.05,1.44042,0.283367,'1420:0 1444:0 1446:0 '),\n(1446,'EchoIsles3',1,14,368,1,10,4,-1236.39,-5359.85,5.43454,0.742817,'1445:0 1447:0 1448:0 '),\n(1447,'EchoIsles4',1,14,368,1,10,4,-1232.75,-5606.75,4.85907,1.49091,'1446:0 1448:0 '),\n(1448,'EchoIsles5',1,14,368,1,10,4,-1035.61,-5519.3,7.91372,2.83395,'1444:0 1446:0 1447:0 '),\n(1449,'BarrensNWBridge',1,17,17,8,25,4,313.815,-3718.22,26.5065,4.61206,'1406:0 1450:0 '),\n(1450,'BarrensNW1',1,17,379,8,25,4,319.615,-3637.99,27.1854,4.5885,'1449:0 1451:0 1473:0 1474:0 '),\n(1451,'BarrensNW2',1,17,17,8,25,4,824.833,-3721.02,27.1993,3.19834,'1389:0 1450:0 1452:0 '),\n(1452,'BarrensNW3',1,17,17,8,25,0,1017.81,-3739.15,27.7416,5.18933,'1388:0 1389:0 1451:0 1453:0 1455:0 1459:0 '),\n(1453,'BarrensNW4',1,17,17,8,25,4,1260.21,-3830.17,30.3266,3.3515,'1388:0 1452:0 1454:0 '),\n(1454,'BarrensNW5',1,17,815,8,25,4,1550.39,-3863.76,40.7872,0.119578,'1360:0 1453:0 '),\n(1455,'BarrensNW6',1,17,381,12,25,0,1205.41,-3622.44,82.8357,4.34975,'1452:0 1456:0 1457:0 '),\n(1456,'BarrensNW7',1,17,381,12,25,0,1348.99,-3642.47,111.642,2.66035,'1455:0 1457:0 '),\n(1457,'BarrensNW8',1,17,381,12,25,0,1351.11,-3571.19,92.4931,1.99552,'1455:0 1456:0 1458:0 '),\n(1458,'BarrensNW9',1,17,381,8,25,0,1340.7,-3455.1,93.8483,3.69787,'1457:0 '),\n(1459,'BarrensNW10',1,17,17,12,25,0,1103.13,-3455.42,87.1314,4.31322,'1452:0 1460:0 1462:0 1465:0 '),\n(1460,'BarrensNW11',1,17,17,12,25,0,724.802,-3585.11,91.2962,0.655228,'1459:0 1461:0 '),\n(1461,'BarrensNW12',1,17,17,8,25,0,383.869,-3439.47,95.2678,5.6425,'1460:0 1470:0 1471:0 '),\n(1462,'BarrensNW13',1,17,17,12,25,0,1223.08,-3084.31,93.9201,4.30731,'1459:0 1463:0 1464:0 1466:0 '),\n(1463,'BarrensNW14',1,17,17,18,25,0,1229.76,-2928.45,141.696,4.49974,'1462:0 1464:0 '),\n(1464,'BarrensNW15',1,17,17,12,25,0,1012.81,-2999.42,92.4922,0.109361,'1462:0 1463:0 1465:0 1466:0 1467:0 1469:0 '),\n(1465,'BarrensNW16',1,17,382,12,25,0,955.029,-3084.95,93.7057,5.40099,'1459:0 1464:0 1466:0 '),\n(1466,'BarrensNW17',1,17,382,12,25,0,1020.82,-3080.5,105.204,1.82743,'1462:0 1464:0 1465:0 '),\n(1467,'BarrensNW18',1,17,17,8,25,0,898.48,-2740.8,99.757,5.46973,'1464:0 1468:0 1469:0 '),\n(1468,'BarrensNW19',1,17,17,8,25,0,803.624,-2654.79,91.6669,5.87813,'1467:0 1469:0 1496:0 1497:0 '),\n(1469,'BarrensNW20',1,17,17,8,25,0,605.003,-2881.18,91.6679,0.109375,'1464:0 1467:0 1468:0 1470:0 1471:0 1493:0 1496:0 '),\n(1470,'BarrensNW21',1,17,17,8,25,0,470.698,-3149.25,95.5705,1.16378,'1461:0 1469:0 1471:0 1472:0 '),\n(1471,'BarrensNW22',1,17,17,8,25,0,382.399,-3074.79,91.8682,5.88794,'1461:0 1469:0 1470:0 1472:0 1477:0 '),\n(1472,'BarrensNW23',1,17,17,8,25,0,146.635,-3204.39,80.1468,0.405853,'1470:0 1471:0 1473:0 1474:0 1477:0 1478:0 1479:0 '),\n(1473,'BarrensNW24',1,17,17,8,25,0,204.31,-3418.93,30.6025,4.75106,'1450:0 1472:0 1474:0 '),\n(1474,'BarrensNW25',1,17,17,8,25,0,18.7822,-3604.62,27.213,0.267903,'1442:0 1443:0 1450:0 1472:0 1473:0 1476:0 '),\n(1475,'BarrensNW26',1,17,391,8,25,0,-701.915,-3931.25,25.2456,2.31781,'35:0 1476:0 '),\n(1476,'BarrensNW27',1,17,17,8,25,0,-364.212,-3750.15,28.5958,0.262038,'1442:0 1475:0 1474:0 '),\n(1477,'BarrensNW28',1,17,17,8,25,0,111.71,-2964.41,95.9003,5.8816,'1471:0 1472:0 1478:0 1491:0 1492:0 '),\n(1478,'BarrensNW29',1,17,1699,8,25,0,-7.39568,-3036.98,91.6667,5.57137,'1472:0 1477:0 1479:0 1480:0 1489:0 1491:0 '),\n(1479,'BarrensNW30',1,17,1699,8,25,0,-80.6494,-3175.83,92.6429,0.527153,'1472:0 1478:0 1480:0 '),\n(1480,'BarrensNW31',1,17,1699,8,25,0,-43.7595,-3360.78,91.6672,1.44018,'1478:0 1479:0 1481:0 '),\n(1481,'BarrensNW32',1,17,1699,8,25,0,-298.484,-3473.6,91.6745,0.415233,'1480:0 1482:0 1483:0 '),\n(1482,'BarrensNW33',1,17,17,8,25,0,-636.173,-3699.63,92.7051,0.694045,'1481:0 1483:0 '),\n(1483,'BarrensNW34',1,17,17,8,25,0,-807.155,-3308.81,91.6657,5.92872,'1482:0 1481:0 1485:0 1486:0 1484:0 '),\n(1484,'BarrensNW35',1,17,17,8,25,0,-1029.31,-3412.99,75.3336,4.91947,'35:0 1483:0 1485:0 1563:0 '),\n(1485,'BarrensNW36',1,17,17,8,25,0,-949.557,-3245.5,94.7159,4.38735,'1483:0 1486:0 1536:0 1538:0 1484:0 1563:0 '),\n(1486,'BarrensNW37',1,17,17,8,25,0,-679.296,-2946.69,95.7877,4.08497,'1487:0 1488:0 1483:0 1485:0 1535:0 1536:0 1537:0 1539:0 '),\n(1487,'BarrensNW38',1,17,17,8,25,0,-494.28,-2779.02,91.6669,0.741136,'1486:0 32:0 1488:0 '),\n(1488,'BarrensNW39',1,17,1699,8,25,0,-242.594,-2859.38,91.9719,3.12681,'1486:0 1487:0 1489:0 1490:0 1491:0 '),\n(1489,'BarrensNW40',1,17,1699,8,25,0,-191.258,-3014.29,91.6673,2.33356,'1478:0 1488:0 1491:0 '),\n(1490,'BarrensNW41',1,17,458,8,25,0,-264.197,-2688.78,95.0971,4.53071,'32:0 1488:0 1491:0 1525:0 '),\n(1491,'BarrensNW42',1,17,17,8,25,0,72.2048,-2789.84,95.8713,3.29567,'1490:0 1488:0 1489:0 1477:0 1478:0 1492:0 1525:0 '),\n(1492,'BarrensNW43',1,17,458,8,25,0,205.138,-2695.31,91.667,3.68445,'1477:0 1491:0 1493:0 1494:0 1495:0 '),\n(1493,'BarrensNW44',1,17,458,8,25,0,400.957,-2643.1,91.667,3.49596,'1469:0 1492:0 1494:0 1496:0 '),\n(1494,'BarrensNW45',1,17,17,8,25,0,266.964,-2535.13,91.6658,3.36441,'1492:0 1493:0 1495:0 '),\n(1495,'BarrensNW46',1,17,17,8,25,0,78.9108,-2561.24,92.6826,5.54193,'1492:0 1494:0 1524:0 '),\n(1496,'BarrensNW47',1,17,458,8,25,0,575.696,-2568.22,95.8126,5.44179,'1468:0 1469:0 1493:0 1497:0 '),\n(1497,'BarrensNW48',1,17,458,8,25,0,687.068,-2366.64,91.6681,4.22717,'1468:0 1496:0 1498:0 1499:0 '),\n(1498,'BarrensNW49',1,17,458,8,25,0,804.041,-2282.18,91.6685,3.41822,'1497:0 1499:0 1500:0 1519:0 '),\n(1499,'BarrensNW50',1,17,17,12,25,0,703.606,-2031.77,91.6667,4.72591,'1497:0 1498:0 1500:0 1509:0 1510:0 '),\n(1500,'BarrensNW51',1,17,17,12,25,0,529.014,-2166.69,94.5542,0.545634,'1498:0 1499:0 1501:0 '),\n(1501,'DreadmistPeak1',1,17,384,12,25,0,459.817,-2082.78,138.447,5.5015,'1500:0 1502:0 1504:0 '),\n(1502,'DreadmistPeak2',1,17,384,12,25,0,375.749,-2068.56,138.668,6.1259,'1501:0 1503:0 '),\n(1503,'DreadmistPeak3',1,17,384,12,25,0,324.847,-1976.99,98.671,5.27963,'1502:0 1510:0 1520:0 '),\n(1504,'DreadmistPeak4',1,17,384,12,25,0,417.639,-2212.21,181.222,1.37424,'1501:0 1505:0 '),\n(1505,'DreadmistPeak5',1,17,384,12,25,0,307.073,-2144.55,210.989,5.7273,'1504:0 1506:0 1507:0 '),\n(1506,'DreadmistPeak6',1,17,2138,12,25,0,319.238,-2233.42,211.954,1.68053,'1505:0 '),\n(1507,'DreadmistPeak7',1,17,384,8,25,0,353.055,-2209.97,222.18,1.93971,'1505:0 1508:0 '),\n(1508,'DreadmistPeak8',1,17,384,17,25,0,322.312,-2277.26,243.384,1.42331,'1507:0 '),\n(1509,'BarrensNW52',1,17,17,12,25,0,583.146,-1755.46,92.9558,1.45863,'1499:0 1510:0 1511:0 '),\n(1510,'BarrensNW53',1,17,17,8,25,0,372.587,-1848.86,91.6675,6.01198,'1503:0 1499:0 1509:0 1520:0 1521:0 1522:0 '),\n(1511,'BarrensNW54',1,17,383,12,25,0,535.439,-1429.14,91.6668,4.989,'1509:0 1512:0 1514:0 1515:0 1516:0 '),\n(1512,'BarrensNW55',1,17,383,12,25,0,709.638,-1260.36,91.682,3.91105,'1511:0 1513:0 '),\n(1513,'BarrensNW56',1,17,383,12,25,0,817.064,-1365.59,91.871,2.68583,'1512:0 '),\n(1514,'BarrensNW57',1,17,383,12,25,0,532.937,-1155.43,91.6668,4.67093,'1511:0 '),\n(1515,'BarrensNW58',1,17,383,12,25,0,296.616,-1482.58,91.6668,0.139182,'1511:0 1517:0 1516:0 1520:0 '),\n(1516,'BarrensNW59',1,17,383,12,25,0,300.682,-1617.75,91.6668,0.681106,'1511:0 1515:0 1517:0 1520:0 '),\n(1517,'BarrensNW60',1,17,17,8,25,0,42.8186,-1528.23,91.6728,3.42876,'1515:0 1516:0 1520:0 1523:0 1531:0 1533:0 '),\n(1518,'BarrensExitN1h',1,17,1703,8,25,4,1261.05,-2223.39,92.0335,0.0904736,'1110:0 1519:0 '),\n(1519,'BarrensExitN2',1,17,1703,8,25,0,1157.98,-2338.54,92.3068,2.80599,'1111:0 1498:0 1518:0 '),\n(1520,'BarrensNW61',1,17,17,8,25,0,242.384,-1748.46,91.6668,5.32751,'1503:0 1510:0 1515:0 1516:0 1517:0 1521:0 '),\n(1521,'BarrensNW62',1,17,17,8,25,0,130.568,-1864.4,92.6122,0.169403,'1510:0 1520:0 1522:0 1523:0 '),\n(1522,'BarrensNW63',1,17,386,8,25,0,132.261,-1980.79,93.8709,0.723104,'1510:0 1521:0 1524:0 1528:0 '),\n(1523,'BarrensNW64',1,17,17,8,25,0,-136.632,-1764.4,93.1031,0.640629,'1517:0 1521:0 1524:0 1528:0 1529:0 1530:0 1531:0 '),\n(1524,'BarrensNW65',1,17,17,8,25,0,-73.4923,-2214.29,92.1839,1.03725,'1495:0 1522:0 1523:0 1527:0 1528:0 '),\n(1525,'BarrensNW66',1,17,17,8,25,0,-246.525,-2527.3,91.7286,5.22342,'1490:0 1491:0 1527:0 1526:0 1528:0 '),\n(1526,'BarrensNW67',1,17,380,8,25,4,-349.471,-2524,95.5815,4.46591,'32:0 1525:0 1527:0 '),\n(1527,'BarrensNW68',1,17,17,8,25,0,-344.921,-2376.03,92.3735,5.15509,'1524:0 1525:0 1526:0 1528:0 1534:0 '),\n(1528,'BarrensNW69',1,17,17,8,25,0,-281.4,-2113.94,95.7902,6.18005,'1522:0 1523:0 1524:0 1525:0 1527:0 1529:0 '),\n(1529,'BarrensNW70',1,17,17,8,25,0,-430.244,-1826.78,95.7877,0.218878,'1523:0 1528:0 1530:0 1557:0 '),\n(1530,'BarrensNW71',1,17,17,8,25,0,-515.745,-1537.11,91.6677,5.10603,'1523:0 1529:0 1531:0 1532:0 1557:0 '),\n(1531,'BarrensNW72',1,17,17,8,25,0,-343.855,-1488.98,92.6671,5.38288,'1517:0 1523:0 1530:0 1532:0 '),\n(1532,'BarrensExitW1h',1,17,1702,8,25,4,-390.512,-1368.33,91.7005,4.15177,'1530:0 1531:0 1533:0 '),\n(1533,'BarrensExitW2h',1,17,17,13,25,0,-245.782,-1071.05,33.877,5.35494,'1517:0 1532:0 1619:0 1621:0 '),\n(1534,'BarrensC1',1,17,17,8,25,0,-554.876,-2457.12,91.7172,0.415224,'1527:0 1535:0 '),\n(1535,'BarrensC2',1,17,458,8,25,0,-733.228,-2616.64,95.7878,6.07401,'32:0 1486:0 1534:0 1536:0 1537:0 1539:0 '),\n(1536,'BarrensC3',1,17,388,8,25,0,-1088.78,-2943.42,93.188,0.309157,'1485:0 1486:0 1535:0 1537:0 1538:0 1539:0 1563:0 '),\n(1537,'BarrensC4',1,17,388,8,25,0,-1234.76,-2828.43,94.4675,5.62828,'1486:0 1535:0 1536:0 1542:0 1543:0 '),\n(1538,'BarrensC5',1,17,17,8,25,0,-1482.86,-2989.48,91.6667,0.000901222,'1485:0 1536:0 1542:0 1543:0 1546:0 1545:0 1544:0 1563:0 '),\n(1539,'BarrensC6',1,17,458,8,25,0,-950.333,-2486.75,94.2879,5.17669,'98:0 1486:0 1535:0 1536:0 1540:0 1541:0 '),\n(1540,'BarrensC7',1,17,387,8,25,0,-1024.84,-2164.71,84.5132,0.52637,'98:0 1539:0 1541:0 '),\n(1541,'BarrensC8',1,17,17,8,25,0,-1117.92,-2388.71,94.9693,5.93383,'1539:0 1540:0 1542:0 1556:0 '),\n(1542,'BarrensC9',1,17,458,8,25,0,-1390.23,-2505.64,95.7878,4.84017,'1537:0 1538:0 1541:0 1543:0 1555:0 '),\n(1543,'BarrensC10',1,17,458,8,25,0,-1623.03,-2514.87,91.6709,0.0433447,'1537:0 1538:0 1542:0 1546:0 1555:0 1544:0 '),\n(1544,'BarrensC11',1,17,17,8,25,0,-1811.46,-3139.58,82.9337,0.885322,'1571:0 1545:0 1538:0 1543:0 1546:0 1568:0 1613:0 '),\n(1545,'BarrensC12',1,17,1698,14,25,0,-1907.03,-2804.32,92.2989,1.69465,'1538:0 1546:0 1547:0 1548:0 1544:0 '),\n(1546,'BarrensC13',1,17,1157,8,25,0,-1711.88,-2559.16,91.6722,0.463532,'1538:0 1543:0 1545:0 1548:0 1549:0 1544:0 '),\n(1547,'BarrensC14',1,17,1698,14,25,0,-2248.79,-2613.16,92.2697,5.81799,'1545:0 1548:0 1550:0 1551:0 '),\n(1548,'BarrensC15',1,17,1698,14,25,0,-2094.77,-2532.69,91.9084,5.93581,'1545:0 1546:0 1547:0 1549:0 1550:0 1551:0 1583:0 '),\n(1549,'BarrensC16',1,17,1157,8,25,0,-1876.87,-2436.12,95.4993,5.38799,'1546:0 1548:0 1551:0 1552:0 1555:0 '),\n(1550,'BarrensC17',1,17,1157,8,25,0,-2277.85,-2179.6,95.7945,5.15236,'174:0 1547:0 1548:0 1551:0 1552:0 1554:0 1583:0 1585:0 '),\n(1551,'BarrensC18',1,17,1157,8,25,0,-2101.34,-2220.57,95.7877,5.73158,'174:0 1547:0 1548:0 1549:0 1550:0 1552:0 '),\n(1552,'BarrensC19',1,17,1700,14,25,0,-1909.45,-2038.55,92.9508,3.72685,'1549:0 1550:0 1551:0 1553:0 1554:0 1555:0 1560:0 '),\n(1553,'BarrensC20',1,17,1700,14,25,0,-2121.99,-1733.9,91.6668,3.88196,'174:0 1552:0 1554:0 1560:0 1584:0 '),\n(1554,'BarrensC21',1,17,1700,14,25,0,-2085.34,-1938.99,95.871,2.79616,'174:0 1550:0 1552:0 1553:0 1560:0 '),\n(1555,'BarrensC22',1,17,17,14,25,0,-1638.12,-2190.4,92.6765,5.08558,'1542:0 1543:0 1549:0 1552:0 1556:0 1558:0 1561:0 '),\n(1556,'BarrensC23',1,17,17,8,25,0,-1266.05,-2043.5,92.6438,3.55996,'1541:0 1555:0 1557:0 1558:0 '),\n(1557,'BarrensC24',1,17,17,8,25,0,-926.196,-1839.83,92.0056,5.03258,'98:0 1529:0 1530:0 1556:0 1558:0 '),\n(1558,'BarrensC25',1,17,1700,14,25,0,-1425.03,-1796.65,92.0678,5.31103,'1555:0 1556:0 1557:0 1559:0 1561:0 '),\n(1559,'BarrensC26',1,17,1700,14,25,0,-1440.3,-1560.56,95.9826,0.920663,'1558:0 1561:0 '),\n(1560,'BarrensC27',1,17,1700,14,25,0,-1871.3,-1875.92,93.6595,4.45692,'1552:0 1553:0 1554:0 1561:0 '),\n(1561,'BarrensC28',1,17,1700,14,25,0,-1612.86,-1781.52,91.7801,1.78067,'1555:0 1558:0 1559:0 1560:0 '),\n(1562,'BarrensC29',1,17,391,8,25,0,-1376.36,-3840.81,18.7024,0.388567,'35:0 1565:0 1569:0 '),\n(1563,'BarrensC30',1,17,17,8,25,0,-1136.17,-3317.73,91.835,0.363033,'1484:0 1485:0 1536:0 1538:0 1564:0 '),\n(1564,'BarrensC31',1,17,17,8,25,0,-1232.04,-3640.85,93.8864,1.23286,'1563:0 1565:0 '),\n(1565,'BarrensC32',1,17,17,12,25,0,-1358.56,-3651.68,91.8621,5.3562,'1562:0 1564:0 1566:0 '),\n(1566,'BarrensC33',1,17,17,12,25,0,-1611.42,-3708.07,89.8631,0.284498,'1565:0 1567:0 1568:0 '),\n(1567,'BarrensC34',1,17,17,12,25,0,-1630.78,-3593.7,93.0714,4.90264,'1566:0 1568:0 '),\n(1568,'BarrensC35',1,17,17,12,25,0,-1755.9,-3578.38,93.1759,5.92169,'1544:0 1566:0 1567:0 '),\n(1569,'BarrensC36',1,17,391,8,25,0,-1644.33,-3851.75,13.843,0.197311,'1562:0 1570:0 '),\n(1570,'BarrensC37',1,17,385,8,25,0,-1877.52,-3684.16,8.56349,5.68766,'1569:0 1571:0 1572:0 1575:0 '),\n(1571,'BarrensC38',1,17,385,8,25,0,-1962.03,-3412.38,56.1606,4.99848,'1544:0 1570:0 '),\n(1572,'BarrensC39',1,17,385,8,25,0,-2093.49,-3786.65,1.11667,0.38229,'1570:0 1573:0 '),\n(1573,'BarrensC40',1,17,385,33,45,0,-2168.16,-3893.99,0.105911,2.3988,'1572:0 1574:0 1900:0 '),\n(1574,'BarrensC41',1,17,385,33,45,0,-2296.44,-3875.08,0.411085,0.0838384,'1573:0 1896:0 1900:0 '),\n(1575,'NorthwatchHold1',1,17,385,12,25,4,-2006.43,-3674.7,21.8223,5.27337,'1570:0 1576:0 '),\n(1576,'NorthwatchHold2',1,17,385,12,25,4,-2014.16,-3558.11,22.9401,4.40551,'1575:0 1577:0 '),\n(1577,'NorthwatchHold3',1,17,385,12,25,4,-2105.62,-3592.85,59.4242,0.125087,'1576:0 1578:0 1579:0 '),\n(1578,'NorthwatchHold4',1,17,385,8,25,4,-2106.59,-3663.32,96.1895,0.928159,'1577:0 '),\n(1579,'NorthwatchHold5',1,17,385,12,25,4,-2186.42,-3696.81,90.2787,1.00002,'1577:0 1580:0 1581:0 '),\n(1580,'NorthwatchHold6',1,17,385,12,25,4,-2222.08,-3775.47,130.862,0.551559,'1579:0 '),\n(1581,'NorthwatchHold7',1,17,385,12,25,4,-2146.93,-3560.64,91.6658,4.29007,'1579:0 1582:0 '),\n(1582,'NorthwatchHold8',1,17,385,12,25,4,-2088.88,-3507.98,130.084,4.00692,'1581:0 '),\n(1583,'BarrensS1',1,17,1156,18,25,0,-2489.54,-2427.29,91.7094,6.28066,'1548:0 1550:0 1585:0 1586:0 '),\n(1584,'BarrensS2',1,17,1156,18,25,0,-2509.21,-1790.84,91.6888,0.117235,'174:0 1553:0 1585:0 1586:0 1587:0 '),\n(1585,'BarrensS3',1,17,1157,18,25,0,-2496.45,-2147.95,95.7846,6.25905,'174:0 1550:0 1583:0 1584:0 1586:0 '),\n(1586,'BarrensS4',1,17,1157,18,25,0,-2759.08,-2184.15,95.793,0.0131506,'1583:0 1584:0 1585:0 1587:0 '),\n(1587,'BarrensS5',1,17,1157,18,25,0,-2945.71,-2047.99,95.7879,0.507956,'1584:0 1586:0 1588:0 1589:0 1591:0 '),\n(1588,'BarrensS6',1,17,1157,18,25,0,-3285.06,-2049.93,92.2466,6.10862,'1587:0 1589:0 1590:0 1591:0 1593:0 1594:0 1596:0 '),\n(1589,'BarrensS7',1,17,390,18,25,0,-3079.79,-1941.98,94.9653,3.28119,'1587:0 1588:0 1590:0 '),\n(1590,'BarrensS8',1,17,390,18,25,0,-3131.93,-1680.95,92.0185,4.74203,'1588:0 1589:0 '),\n(1591,'BarrensS9',1,17,390,18,25,0,-3131.04,-2171.34,93.5897,1.45786,'1587:0 1588:0 1592:0 1596:0 '),\n(1592,'BarrensS10',1,17,390,18,25,0,-3110.95,-2348.03,94.3578,1.81325,'1591:0 '),\n(1593,'BarrensS11',1,17,1156,18,25,0,-3458.57,-1830.89,91.667,5.2042,'1588:0 1595:0 '),\n(1594,'BarrensS12',1,17,1157,18,25,0,-3481.33,-2051.77,96.4547,0.0284251,'1588:0 1595:0 1596:0 '),\n(1595,'BarrensS13',1,17,1157,18,25,0,-3653.21,-2015.41,91.6668,0.540897,'1593:0 1594:0 1596:0 1597:0 1599:0 1600:0 '),\n(1596,'BarrensS14',1,17,1156,18,25,0,-3651.34,-2318.77,91.6674,0.625316,'1595:0 1588:0 1591:0 1594:0 1597:0 1607:0 1872:0 '),\n(1597,'BarrensS15',1,17,1157,18,25,0,-3840.72,-2048.27,91.6821,6.27935,'1595:0 1596:0 1598:0 1599:0 1600:0 1607:0 '),\n(1598,'BarrensS16',1,17,1157,18,25,0,-4067.36,-2048.82,91.6672,6.16353,'1597:0 1601:0 1602:0 1607:0 1610:0 '),\n(1599,'BarrensS17',1,17,1701,18,25,0,-3730.53,-1594.06,93.2113,4.82441,'1595:0 1597:0 1600:0 1601:0 '),\n(1600,'BarrensS18',1,17,1701,18,25,0,-3894.71,-1618.14,91.6668,0.128916,'1595:0 1597:0 1599:0 1601:0 '),\n(1601,'BarrensS19',1,17,1701,18,25,0,-4039.89,-1841.83,94.2054,0.676733,'1598:0 1599:0 1600:0 1602:0 '),\n(1602,'BarrensS20',1,17,1157,18,25,0,-4188.61,-1914.07,91.6668,5.68758,'1598:0 1601:0 1603:0 '),\n(1603,'BarrensS21',1,17,1157,18,25,0,-4356.79,-1884.72,89.6352,5.97818,'1602:0 1604:0 1606:0 '),\n(1604,'BarrensS22',1,17,1157,18,25,0,-4478.66,-1866.94,86.1087,1.26186,'1603:0 1605:0 '),\n(1605,'BarrensRFK1',1,17,1717,18,25,0,-4476,-1686.51,81.5791,4.60765,'1604:0 '),\n(1606,'BarrensRFD1',1,17,1316,30,40,0,-4487.33,-2054.23,75.9531,5.76807,'1603:0 '),\n(1607,'BaelModan1',1,17,359,18,25,4,-3989.77,-2218.81,95.0004,6.06065,'1596:0 1597:0 1598:0 1608:0 '),\n(1608,'BaelModan2',1,17,359,18,25,4,-4109.4,-2315.19,125.071,0.600164,'1607:0 1609:0 '),\n(1609,'BaelModan3',1,17,2157,8,25,4,-4073.79,-2368.19,108.909,2.02644,'1608:0 '),\n(1610,'BaelModan4',1,17,359,18,25,4,-4176.57,-2101.49,72.6592,0.294635,'1598:0 1611:0 '),\n(1611,'BaelModan5',1,17,359,18,25,4,-4071.12,-2157.56,50.3844,2.75686,'1610:0 1612:0 '),\n(1612,'BaelModan6',1,17,359,18,25,4,-4223.35,-2272.53,60.9001,0.575407,'1611:0 '),\n(1613,'RaptorGrounds',1,17,1697,12,25,0,-2042.89,-3229.73,91.8767,0.499641,'1544:0 '),\n(1614,'BarrensWC1',1,718,718,8,20,0,-692.325,-2048.77,65.8045,0.216115,'98:0 1615:0 '),\n(1615,'BarrensWC2',1,718,718,12,25,0,-580.407,-2042.49,57.4486,4.80284,'1614:0 1616:0 '),\n(1616,'BarrensWC3',1,718,718,12,25,0,-677.272,-2203.72,25.3109,0.830688,'1615:0 1617:0 '),\n(1617,'BarrensWC4',1,718,718,12,25,0,-638.458,-2387.33,25.6848,1.69853,'1616:0 '),\n(1618,'RatchetSpawn',1,17,392,8,20,1,-1057.17,-3641.62,23.878,5.32863,'35:0 '),\n(1619,'BarrensExitW2_1a',1,17,17,13,25,2,-365.7,-970.989,26.4604,0.0515498,'1533:0 1620:0 '),\n(1620,'BarrensExitW2_2',1,17,17,13,25,2,-257.953,-835.045,8.42398,4.38694,'1619:0 1621:0 1622:0 '),\n(1621,'STMExitE',1,406,469,13,25,4,-231.912,-777.297,7.15901,4.25107,'1533:0 1620:0 1622:0 '),\n(1622,'StonetalonSE1',1,406,469,13,25,0,-183.878,-696.708,0.285728,4.19806,'1620:0 1621:0 1623:0 '),\n(1623,'StonetalonSE2',1,406,2538,13,25,0,7.63915,-645.484,-33.8698,3.50887,'1622:0 1624:0 1625:0 1626:0 1630:0 '),\n(1624,'StonetalonSE3',1,406,469,13,25,0,-21.452,-771.961,1.19909,1.25477,'1623:0 1625:0 '),\n(1625,'StonetalonSE4',1,406,469,13,25,0,173.964,-863.908,2.87119,2.42107,'1623:0 1624:0 '),\n(1626,'StonetalonSE5',1,406,2537,13,25,0,127.03,-646.104,-0.157034,3.15149,'1623:0 1627:0 '),\n(1627,'StonetalonSE6',1,406,2537,13,25,0,102.577,-522.122,3.25329,4.9677,'1626:0 1628:0 1629:0 '),\n(1628,'StonetalonSE7',1,406,2537,13,25,0,219.214,-475.456,21.9453,3.60701,'1627:0 1629:0 '),\n(1629,'StonetalonSE8',1,406,469,13,25,0,104.777,-261.978,5.20105,5.15819,'1627:0 1628:0 1632:0 1633:0 '),\n(1630,'StonetalonSE9',1,406,2538,13,25,0,-62.1728,-442.081,-37.1112,5.01095,'1623:0 1631:0 '),\n(1631,'StonetalonSE10',1,406,469,13,25,0,-29.9825,-291.416,-5.66732,4.59076,'1630:0 1632:0 '),\n(1632,'StonetalonSE11',1,406,2539,13,25,0,-2.18294,-227.074,15.1619,4.29231,'1629:0 1631:0 1633:0 1640:0 '),\n(1633,'StonetalonSE12',1,406,1076,13,25,0,59.7029,-127.555,15.3056,4.18039,'1629:0 1632:0 1634:0 '),\n(1634,'StonetalonSE13',1,406,1076,13,25,0,109.545,-71.7213,22.4065,2.6092,'1633:0 1635:0 1641:0 '),\n(1635,'StonetalonSE14',1,406,2540,13,25,0,23.5805,-29.4616,31.6752,5.8097,'1634:0 1636:0 '),\n(1636,'StonetalonSE15',1,406,2540,13,25,0,-14.5426,41.0345,49.7486,5.30902,'1635:0 1637:0 '),\n(1637,'StonetalonSE16',1,406,2540,13,25,0,-152.111,135.096,48.9698,5.51519,'1636:0 1638:0 '),\n(1638,'StonetalonSE17',1,406,3157,13,25,0,-114.052,239.055,102.383,4.22518,'1637:0 1639:0 '),\n(1639,'StonetalonSE18',1,406,3157,13,25,0,2.62312,403.85,101.011,3.79714,'1638:0 '),\n(1640,'StonetalonSE19',1,406,2539,13,25,5,-235.218,-347.587,20.2574,0.490614,'1632:0 '),\n(1641,'StonetalonSE20',1,406,1076,13,25,0,197.073,203.918,52.5873,4.43331,'1634:0 1642:0 '),\n(1642,'StonetalonSE21',1,406,1076,13,25,0,274.453,322.855,41.911,4.60022,'1641:0 1643:0 '),\n(1643,'StonetalonSE22',1,406,1076,13,25,0,447.877,347.349,47.8893,3.28665,'1642:0 1644:0 1646:0 '),\n(1644,'StonetalonSE23',1,406,2541,13,25,0,426.687,491.945,98.4352,4.79266,'1643:0 1645:0 '),\n(1645,'StonetalonSE24',1,406,2541,13,25,0,465.249,636.071,69.1319,4.43923,'1644:0 151:0 '),\n(1646,'StonetalonSE25',1,406,1076,13,25,0,547.002,317.026,51.4155,2.61083,'1643:0 1647:0 1660:0 '),\n(1647,'StonetalonSE26',1,406,461,13,25,0,944.851,205.469,22.8061,2.8916,'1646:0 1648:0 1649:0 1650:0 '),\n(1648,'StonetalonE1',1,406,636,13,25,0,1111.38,-250.367,-1.11603,1.94521,'1647:0 153:0 1649:0 1651:0 1655:0 '),\n(1649,'StonetalonE2',1,406,636,13,25,0,1154.28,55.6527,1.56437,2.89789,'1647:0 1648:0 152:0 1650:0 1651:0 1655:0 '),\n(1650,'StonetalonE3',1,406,461,13,25,0,1307.08,338.017,30.2635,3.38681,'152:0 1647:0 1649:0 1651:0 '),\n(1651,'StonetalonE4',1,406,461,13,25,0,1299.88,-37.5445,6.46784,2.5696,'152:0 1648:0 1649:0 1650:0 1655:0 '),\n(1652,'StonetalonE5',1,406,463,13,25,0,1596.92,-164.112,37.8,1.7689,'152:0 1653:0 1656:0 '),\n(1653,'StonetalonE6',1,406,461,13,25,0,1503.38,-325.077,23.7601,0.679167,'154:0 1652:0 1655:0 '),\n(1654,'StonetalonE7',1,406,461,13,25,0,1239.88,-573.82,14.7456,2.30493,'153:0 1655:0 '),\n(1655,'StonetalonE8',1,406,461,13,25,0,1274.45,-389.01,15.6582,4.91048,'153:0 154:0 1648:0 1649:0 1651:0 1653:0 1654:0 '),\n(1656,'StonetalonE9',1,406,463,13,25,0,1689.34,-66.4877,90.3719,1.43312,'1652:0 1657:0 '),\n(1657,'StonetalonE10',1,406,463,13,25,0,1683.31,88.067,136.952,4.78089,'1656:0 1658:0 '),\n(1658,'StonetalonE11',1,406,463,13,25,0,1607.48,98.5127,98.5487,1.23875,'1657:0 1659:0 '),\n(1659,'StonetalonE12',1,406,463,13,25,0,1607.14,183.852,104.64,5.9099,'1658:0 '),\n(1660,'StonetalonC1',1,406,1076,13,25,0,741.152,432.351,64.3987,3.6401,'1646:0 1661:0 1662:0 '),\n(1661,'StonetalonC2',1,406,1076,13,25,3,734.898,323.955,63.5237,1.26623,'1660:0 1662:0 '),\n(1662,'StonetalonC3',1,406,1076,13,25,0,911.255,644.216,97.0932,4.02886,'1660:0 1661:0 45:0 1670:0 '),\n(1663,'StonetalonC4',1,406,460,13,25,5,967.945,1059.83,107.154,4.48637,'45:0 1664:0 '),\n(1664,'StonetalonC5',1,406,460,20,25,4,857.673,1068.45,134.552,6.12668,'1663:0 1665:0 '),\n(1665,'StonetalonC6',1,406,406,20,25,4,770.751,1128.86,184.567,5.69273,'1664:0 1666:0 '),\n(1666,'StonetalonC7',1,406,406,20,25,4,763.22,1201.45,167.109,4.77383,'1665:0 1667:0 '),\n(1667,'StonetalonC8',1,406,406,20,25,4,612.567,1230.12,105.052,5.96764,'1666:0 1668:0 '),\n(1668,'StonetalonC9',1,406,465,20,25,4,639.837,1320.23,57.7872,0.670119,'1667:0 1669:0 '),\n(1669,'StonetalonC10',1,406,465,20,25,0,717.122,1407.26,-11.3895,4.23973,'1668:0 1698:0 1699:0 1703:0 '),\n(1670,'StonetalonC11',1,406,1076,16,25,0,1254.55,723.188,177.709,3.60317,'1662:0 1671:0 1677:0 '),\n(1671,'StonetalonC12',1,406,406,18,25,2,1149.35,812.103,216.145,0.074743,'1670:0 1672:0 '),\n(1672,'StonetalonC13',1,406,406,18,25,2,1174.45,1039.29,211.338,4.51028,'1671:0 1673:0 '),\n(1673,'StonetalonC14',1,406,406,18,25,2,1150.98,1125.82,230.66,4.8323,'1672:0 1674:0 '),\n(1674,'StonetalonC15',1,406,406,18,25,2,1185.65,1218.77,221.734,4.2727,'1673:0 1675:0 '),\n(1675,'StonetalonC16',1,406,406,18,25,2,1120.4,1212.75,204.833,0.0197749,'1674:0 1676:0 '),\n(1676,'StonetalonC17',1,406,406,18,25,2,1150.62,1371.11,126.775,4.37873,'1675:0 1697:0 '),\n(1677,'StonetalonC18',1,406,464,16,25,0,1370.73,733.802,156.258,3.23598,'1670:0 1678:0 1681:0 '),\n(1678,'StonetalonC19',1,406,464,16,25,0,1446.65,663,145.249,2.57819,'1677:0 1679:0 1680:0 '),\n(1679,'StonetalonC20',1,406,464,16,25,0,1553.51,543.727,164.574,2.16586,'1678:0 1680:0 '),\n(1680,'StonetalonC21',1,406,464,16,25,0,1584.31,756.555,132.915,4.49848,'1678:0 1679:0 1681:0 1686:0 '),\n(1681,'StonetalonC22',1,406,464,16,25,0,1440.45,891.877,138.324,4.65164,'1677:0 1680:0 1682:0 1683:0 '),\n(1682,'StonetalonC23',1,406,464,16,25,0,1361.44,1063.47,166.157,5.2289,'1681:0 1683:0 '),\n(1683,'StonetalonC24',1,406,464,16,25,0,1500.8,1046.96,144.855,4.37673,'1681:0 1682:0 1684:0 1685:0 '),\n(1684,'StonetalonC25',1,406,464,16,25,0,1668.56,1003.04,136.669,2.88249,'1683:0 1685:0 1686:0 1687:0 '),\n(1685,'StonetalonC26',1,406,406,16,25,0,1533.39,1167.23,150.198,5.27402,'1683:0 1684:0 1695:0 '),\n(1686,'StonetalonC27',1,406,464,16,25,0,1837.17,772.144,145.217,3.08276,'1680:0 1684:0 1687:0 '),\n(1687,'StonetalonC28',1,406,464,16,25,0,1832.42,946.127,147.601,2.87658,'1684:0 1686:0 1688:0 '),\n(1688,'StonetalonN1',1,406,406,16,25,0,2089.45,985.763,224.629,0.496822,'1687:0 1689:0 1690:0 '),\n(1689,'StonetalonN2',1,406,467,16,25,0,2389.72,1113.13,305.081,3.60307,'1688:0 '),\n(1690,'StonetalonN3',1,406,467,16,25,0,2406.02,1262.32,293.173,4.48076,'39:0 1688:0 1691:0 1694:0 '),\n(1691,'StonetalonN4',1,406,467,16,25,0,2308.04,1474.22,278.518,5.29758,'1692:0 1694:0 1690:0 '),\n(1692,'StonetalonN5',1,406,468,16,25,0,2455.85,1706.87,321.807,3.7366,'1691:0 155:0 39:0 1694:0 '),\n(1693,'StonetalonN6',1,406,468,16,25,4,2502.8,1923.14,341.618,4.8177,'155:0 '),\n(1694,'StonetalonN7',1,406,467,18,25,0,2490.31,1474.07,262.723,0.177969,'39:0 1691:0 1692:0 1690:0 '),\n(1695,'StonetalonW1',1,406,406,18,25,0,1531.08,1382.61,154.485,3.40792,'1685:0 1696:0 '),\n(1696,'StonetalonW2',1,406,406,18,25,0,1396,1443.1,122.505,3.64354,'1695:0 1697:0 '),\n(1697,'StonetalonW3',1,406,406,18,25,0,1250.91,1480.82,78.0749,3.62587,'1676:0 1696:0 1698:0 '),\n(1698,'StonetalonW4',1,406,465,20,25,0,926.026,1574.39,-15.7829,5.87604,'1669:0 1697:0 1702:0 1703:0 '),\n(1699,'StonetalonW5',1,406,465,20,25,0,546.937,1540.31,-5.73179,5.59329,'1669:0 1700:0 1703:0 '),\n(1700,'StonetalonW6',1,406,465,20,25,0,498.082,1756.93,4.7637,5.0278,'1699:0 1701:0 1703:0 1704:0 '),\n(1701,'StonetalonW7',1,406,465,20,25,0,684.965,1869.36,-7.54489,3.9518,'1700:0 1702:0 1703:0 '),\n(1702,'StonetalonW8',1,406,465,20,25,0,905.075,1799.18,-4.36236,2.8974,'1698:0 1701:0 1703:0 '),\n(1703,'StonetalonW9',1,406,465,20,25,0,709.779,1654.47,-27.9084,0.454811,'1669:0 1698:0 1699:0 1700:0 1701:0 1702:0 '),\n(1704,'STMExitSW',1,406,465,20,25,0,386.19,1791.83,40.6481,5.89762,'1700:0 1705:0 '),\n(1705,'DesolaceExitN',1,405,405,28,40,0,254.286,1837.65,86.6541,5.89961,'1704:0 1706:0 '),\n(1706,'DesolaceN1',1,405,405,28,40,0,136.31,1790.75,86.2292,4.91001,'1705:0 1707:0 1708:0 1709:0 '),\n(1707,'DesolaceN2',1,405,405,28,40,0,174.958,1580.05,166.08,3.19588,'1706:0 1708:0 '),\n(1708,'DesolaceN3',1,405,405,28,40,0,-43.4822,1503,100.016,0.657084,'1706:0 1707:0 1709:0 1711:0 1712:0 1713:0 '),\n(1709,'DesolaceN4',1,405,599,28,40,0,-240.456,1624.18,94.7617,2.12576,'1706:0 1708:0 1710:0 1711:0 1712:0 '),\n(1710,'DesolaceN5',1,405,599,28,40,0,-478.435,1651.62,103.311,6.16664,'1709:0 1711:0 1724:0 1727:0 '),\n(1711,'DesolaceN6',1,405,405,28,40,0,-519.027,1436.95,89.0591,0.360579,'1708:0 1709:0 1710:0 1712:0 1723:0 1743:0 1744:0 1745:0 '),\n(1712,'DesolaceN7',1,405,405,28,40,0,-262.519,1170.51,90.2776,1.81553,'1708:0 1709:0 1711:0 1713:0 1717:0 1720:0 1723:0 '),\n(1713,'DesolaceN8',1,405,405,28,40,0,-68.2755,1158.91,90.8663,1.88621,'1708:0 1712:0 1714:0 1717:0 1720:0 '),\n(1714,'DesolaceN9',1,405,608,28,40,2,24.7744,1218.69,134.023,3.19194,'1713:0 1715:0 '),\n(1715,'DesolaceN10',1,405,608,28,40,2,166.996,1219.58,166.116,3.12321,'1714:0 1716:0 '),\n(1716,'DesolaceN11',1,405,608,28,40,2,222.502,1276.25,189.878,5.01405,'1715:0 60:0 '),\n(1717,'DesolaceN12',1,405,603,28,40,0,-37.1114,929.567,91.722,2.17957,'1712:0 1713:0 1718:0 1720:0 1721:0 '),\n(1718,'DesolaceN13',1,405,603,28,40,0,7.08753,779.096,91.8455,4.34648,'1717:0 1719:0 '),\n(1719,'DesolaceN14',1,405,603,28,40,0,-67.217,604.321,91.3718,1.59562,'1718:0 1720:0 1721:0 '),\n(1720,'DesolaceN15',1,405,603,28,40,0,-319.285,898.298,89.3548,5.81712,'1712:0 1713:0 1717:0 1719:0 1721:0 1722:0 1723:0 '),\n(1721,'DesolaceN16',1,405,603,28,40,0,-88.9887,771.679,132.892,1.27553,'1717:0 1719:0 1720:0 '),\n(1722,'DesolaceN17',1,405,405,28,40,0,-524.771,816.278,91.0366,0.333055,'1720:0 1723:0 1744:0 '),\n(1723,'DesolaceN18',1,405,405,28,40,0,-518.678,1099.09,93.063,6.1992,'1711:0 1712:0 1720:0 1722:0 1744:0 1745:0 '),\n(1724,'DesolaceN19',1,405,599,28,40,0,-433.656,1712.56,127.171,4.07939,'1710:0 1725:0 1726:0 '),\n(1725,'DesolaceN20',1,405,599,28,40,0,-346.92,1761.61,138.371,0.287887,'1724:0 '),\n(1726,'DesolaceN21',1,405,599,28,40,0,-409.361,1865.43,127.463,4.65667,'1724:0 '),\n(1727,'DesolaceN22',1,405,599,28,40,0,-557.524,1836.01,96.4213,5.15932,'1710:0 1728:0 1743:0 '),\n(1728,'DesolaceN23',1,405,405,28,40,0,-596.61,2002.61,88.4432,6.14696,'1727:0 1729:0 1730:0 1731:0 1742:0 1743:0 '),\n(1729,'DesolaceN24',1,405,405,28,40,0,-409.395,2019.53,98.1479,3.16245,'1728:0 1730:0 1731:0 '),\n(1730,'DesolaceN25',1,405,598,28,40,0,-362.318,2211.47,90.4702,1.2127,'1728:0 1729:0 1731:0 1732:0 1733:0 '),\n(1731,'DesolaceN26',1,405,2405,28,40,0,-574.499,2247.88,89.8498,5.11024,'1728:0 1729:0 1730:0 1732:0 1738:0 1741:0 1742:0 1772:0 '),\n(1732,'DesolaceN27',1,405,2405,28,40,0,-436.581,2351.38,60.8605,4.01462,'1730:0 1731:0 1734:0 1735:0 '),\n(1733,'DesolaceN28',1,405,598,28,40,0,-45.3846,2199.95,94.7517,3.10159,'1730:0 '),\n(1734,'DesolaceN29',1,405,598,28,40,0,-223.597,2401.87,19.3117,3.25671,'1732:0 1735:0 '),\n(1735,'DesolaceN30',1,405,598,28,40,0,-240.439,2492.2,1.43883,3.79864,'1732:0 1734:0 1736:0 1737:0 '),\n(1736,'DesolaceN31',1,405,2405,28,40,0,-370.369,2605.96,1.54797,5.56185,'1735:0 1739:0 '),\n(1737,'DesolaceN32',1,405,2406,31,40,0,263.113,2974.68,2.07535,3.87325,'1735:0 '),\n(1738,'DesolaceN33',1,405,2405,28,40,0,-601.969,2431.57,74.1931,4.86205,'1731:0 1739:0 1741:0 '),\n(1739,'DesolaceN34',1,405,2405,28,40,0,-502.176,2576.74,18.2199,4.19054,'1736:0 1738:0 1740:0 '),\n(1740,'DesolaceN35',1,405,598,28,40,0,-719.849,2595.3,58.3371,6.23453,'1739:0 1741:0 '),\n(1741,'DesolaceN36',1,405,405,31,40,0,-750.951,2392.96,91.9055,1.38273,'1731:0 1738:0 1740:0 1742:0 1770:0 1772:0 '),\n(1742,'DesolaceN37',1,405,405,28,40,0,-759.272,2036.09,91.7138,1.7715,'1728:0 1731:0 1741:0 1770:0 1771:0 '),\n(1743,'DesolaceN38',1,405,405,28,40,0,-785.037,1666.3,90.7953,3.33248,'1711:0 1727:0 1728:0 1745:0 1769:0 1770:0 '),\n(1744,'DesolaceN39',1,405,609,28,40,0,-796.298,1079.33,90.2949,6.11672,'1711:0 1722:0 1723:0 1745:0 1746:0 1747:0 '),\n(1745,'DesolaceN40',1,405,405,28,40,0,-754.549,1363.26,88.5616,5.47467,'1711:0 1723:0 1743:0 1744:0 1769:0 '),\n(1746,'DesolaceN41',1,405,609,28,40,0,-897.587,897.096,95.0181,0.982181,'1744:0 1747:0 1748:0 '),\n(1747,'DesolaceC1',1,405,405,28,40,0,-1125.97,1230.91,93.7933,5.43931,'1744:0 1746:0 1748:0 1749:0 1769:0 '),\n(1748,'DesolaceC2',1,405,405,28,40,0,-1391.67,958.264,89.5921,0.552166,'1746:0 1747:0 1750:0 1751:0 '),\n(1749,'DesolaceC3',1,405,405,28,40,0,-1427.18,1225.61,103.863,0.133931,'1747:0 129:0 1750:0 '),\n(1750,'DesolaceC4',1,405,604,28,40,0,-1577.16,1114.97,90.6547,0.632647,'129:0 1748:0 1749:0 1751:0 1760:0 1762:0 '),\n(1751,'DesolaceC5',1,405,604,28,40,0,-1631.55,978.868,90.3134,0.0954253,'1748:0 1750:0 1752:0 1759:0 1760:0 '),\n(1752,'DesolaceC6',1,405,604,34,40,0,-1672.96,839.546,93.6943,1.409,'1751:0 1753:0 '),\n(1753,'DesolaceC7',1,405,604,34,40,0,-1824.57,798.663,103.148,0.209302,'1752:0 1754:0 '),\n(1754,'DesolaceC8',1,405,2198,34,40,0,-1847.21,666.041,107.727,1.26565,'1753:0 1755:0 1756:0 '),\n(1755,'DesolaceC9',1,405,2198,34,40,0,-1837.82,584.775,136.457,1.64775,'1754:0 '),\n(1756,'DesolaceC10',1,405,2198,34,40,0,-2020.93,674.999,118.726,6.26783,'1754:0 1757:0 '),\n(1757,'DesolaceC11',1,405,2198,34,40,0,-2022.56,589.179,143.38,5.31357,'1756:0 1758:0 '),\n(1758,'DesolaceC12',1,405,2198,34,40,0,-1933.59,514.493,164.939,2.49988,'1757:0 '),\n(1759,'DesolaceC13',1,405,604,28,40,0,-1799.06,928.096,91.3039,0.218297,'1751:0 1760:0 1762:0 '),\n(1760,'DesolaceC14',1,405,604,28,40,0,-1889.74,1110.04,92.5553,5.97134,'1750:0 1751:0 1759:0 1761:0 1762:0 '),\n(1761,'DesolaceC15',1,405,405,31,40,0,-1897.9,1372.61,61.1381,4.74417,'1760:0 1762:0 1764:0 1777:0 1811:0 1813:0 '),\n(1762,'DesolaceC16',1,405,604,28,40,0,-1749.34,1214.45,91.3952,0.204553,'1750:0 1759:0 1760:0 1761:0 1763:0 '),\n(1763,'DesolaceC17',1,405,405,28,40,0,-1569.77,1277.99,87.9315,3.56017,'1762:0 1764:0 '),\n(1764,'DesolaceC18',1,405,405,31,40,0,-1699.9,1433.42,61.6894,0.112268,'129:0 1761:0 1763:0 '),\n(1765,'DesolaceC19',1,405,597,28,40,4,-1335.75,1704.43,89.9029,5.8932,'128:0 '),\n(1766,'DesolaceC20',1,405,597,28,40,4,-1199.03,1771.37,99.5835,4.08873,'128:0 1767:0 '),\n(1767,'DesolaceC21',1,405,597,28,40,4,-1157.92,1848.6,99.595,4.17119,'1766:0 1768:0 '),\n(1768,'DesolaceC22',1,405,597,28,40,4,-1151.69,1938.33,88.8694,1.73253,'1767:0 '),\n(1769,'DesolaceC23',1,405,405,31,40,0,-1193.57,1475.36,61.1112,4.30472,'128:0 129:0 1743:0 1745:0 1747:0 1770:0 1777:0 '),\n(1770,'DesolaceC24',1,405,405,31,40,0,-1051.16,1759.04,62.2132,3.91398,'129:0 1741:0 1742:0 1743:0 1769:0 1771:0 1776:0 '),\n(1771,'DesolaceC25',1,405,405,31,40,0,-1096.46,2045.41,58.5175,4.84859,'1742:0 1770:0 1772:0 1775:0 '),\n(1772,'DesolaceC26',1,405,405,31,40,0,-1095.17,2383.16,92.5366,5.96779,'1731:0 1741:0 1771:0 1773:0 '),\n(1773,'DesolaceC27',1,405,405,31,40,0,-1419.73,2331.31,91.8161,0.0556962,'1772:0 1774:0 1778:0 1779:0 1798:0 '),\n(1774,'DesolaceC28',1,405,596,31,40,0,-1340.98,2101.55,63.5443,1.99366,'1773:0 1775:0 1776:0 1778:0 '),\n(1775,'DesolaceC29',1,405,596,31,40,0,-1225.31,2021.97,59.0277,2.34708,'1771:0 1774:0 1776:0 '),\n(1776,'DesolaceC30',1,405,596,31,40,0,-1362.19,1917.79,50.1441,0.929436,'128:0 1770:0 1774:0 1775:0 1777:0 '),\n(1777,'DesolaceC31',1,405,405,31,40,0,-1575.89,1726.59,58.925,5.73608,'129:0 1761:0 1769:0 1776:0 1778:0 1809:0 1810:0 '),\n(1778,'DesolaceC32',1,405,405,31,40,0,-1561.67,1991.32,61.6415,0.949069,'129:0 1773:0 1774:0 1777:0 1809:0 '),\n(1779,'DesolaceC33',1,405,607,33,40,0,-1371.99,2554.03,108.02,4.4441,'1773:0 1780:0 1781:0 '),\n(1780,'DesolaceC34',1,405,607,33,40,0,-1392.44,2659.84,112.065,5.41015,'1779:0 1781:0 '),\n(1781,'DesolaceC35',1,405,607,33,40,0,-1251.49,2685.06,111.557,3.5193,'1779:0 1780:0 1782:0 1783:0 '),\n(1782,'DesolaceC36',1,405,607,33,40,0,-1123.21,2688.52,111.831,2.59448,'1781:0 1783:0 '),\n(1783,'DesolaceC37',1,405,607,33,40,0,-1161.95,2795.33,122.835,2.23711,'1781:0 1782:0 1784:0 1785:0 '),\n(1784,'DesolaceC38',1,405,607,33,40,0,-1067.79,2918.91,179.121,3.97481,'1783:0 '),\n(1785,'DesolaceC39',1,405,607,33,40,0,-1289.84,2920.03,113.966,5.30998,'1783:0 1786:0 '),\n(1786,'DesolaceC40',1,405,607,33,40,0,-1360.57,2783.12,113.08,5.63201,'1785:0 127:0 1787:0 '),\n(1787,'DesolaceC41',1,405,607,33,40,0,-1422.79,2793.13,111.697,0.937294,'127:0 1786:0 1788:0 '),\n(1788,'DesolaceC42',1,405,607,33,40,0,-1470.51,2717.61,112.426,0.907843,'1787:0 1789:0 '),\n(1789,'DesolaceC43',1,405,607,33,40,0,-1526.76,2740.76,111.941,5.60649,'1788:0 1790:0 '),\n(1790,'DesolaceC44',1,405,607,33,40,0,-1487.94,2839.33,111.17,4.34789,'1789:0 1791:0 '),\n(1791,'DesolaceC45',1,405,607,33,40,0,-1571.53,2902.93,112.301,5.73411,'1790:0 1794:0 '),\n(1792,'DesolaceC46',1,405,2408,31,40,4,-1727.84,3103.88,35.0044,5.61552,'57:0 1793:0 '),\n(1793,'DesolaceC47',1,405,598,31,40,4,-1841.75,3013.22,11.277,0.475075,'1792:0 1794:0 1795:0 '),\n(1794,'DesolaceC48',1,405,598,31,40,0,-1852.69,2854.14,50.9586,0.237108,'1791:0 1795:0 1793:0 1796:0 1797:0 '),\n(1795,'DesolaceC49',1,405,598,31,40,0,-1990.78,2803.76,56.2314,0.896844,'1794:0 1793:0 1796:0 1797:0 '),\n(1796,'DesolaceS1',1,405,606,28,40,0,-2002.35,2610.23,62.383,1.22083,'1794:0 1795:0 1797:0 1799:0 1800:0 '),\n(1797,'DesolaceS2',1,405,405,28,40,0,-1772.22,2471.83,73.3018,5.67404,'1794:0 1795:0 1796:0 1798:0 1800:0 '),\n(1798,'DesolaceS3',1,405,405,31,40,0,-1592.19,2396.96,91.4972,2.81715,'1773:0 1797:0 1799:0 '),\n(1799,'DesolaceS4',1,405,405,31,40,0,-1797.31,2149.68,62.4428,1.77847,'1796:0 1798:0 1800:0 1809:0 '),\n(1800,'DesolaceS5',1,405,606,28,40,0,-1967.47,2474.94,61.5806,1.35043,'1796:0 1797:0 1799:0 1801:0 1803:0 '),\n(1801,'DesolaceS6',1,405,606,28,40,0,-2098.84,2409.19,61.4027,3.19808,'1800:0 1802:0 1803:0 '),\n(1802,'DesolaceExitS',1,405,405,28,40,0,-2402.61,2363.59,108.604,0.107536,'1801:0 1913:0 '),\n(1803,'DesolaceS7',1,405,602,33,40,0,-2145.67,2180.6,67.6286,1.21495,'1800:0 1801:0 1804:0 1806:0 '),\n(1804,'DesolaceS8',1,405,602,33,40,0,-2190.56,1992.71,64.0673,1.30332,'1803:0 1805:0 '),\n(1805,'DesolaceS9',1,405,602,33,40,0,-2171.01,1903.5,66.9158,1.58018,'1804:0 1807:0 '),\n(1806,'DesolaceS10',1,405,602,33,40,0,-1981.74,2045.99,59.3955,2.2831,'1803:0 1808:0 1809:0 '),\n(1807,'DesolaceS11',1,405,602,33,40,0,-2096.65,1787.92,57.1531,1.95912,'1805:0 1808:0 1811:0 '),\n(1808,'DesolaceS12',1,405,602,33,40,0,-1982.92,1838.14,63.409,3.36694,'1806:0 1807:0 1810:0 '),\n(1809,'DesolaceS13',1,405,602,33,40,0,-1815.92,1988.94,59.0664,1.39951,'1777:0 1778:0 1799:0 1806:0 '),\n(1810,'DesolaceS14',1,405,602,33,40,0,-1765.64,1678.32,60.7555,0.438962,'1777:0 1808:0 1811:0 '),\n(1811,'DesolaceS15',1,405,405,31,40,0,-2062.67,1679.65,60.5781,5.56172,'1761:0 1807:0 1810:0 1812:0 '),\n(1812,'DesolaceS16',1,405,2657,33,40,0,-2225.06,1577.55,60.1882,0.421288,'130:0 1811:0 '),\n(1813,'DesolaceS17',1,405,2657,33,40,0,-2153.93,1293.66,63.9415,0.29169,'130:0 1761:0 '),\n(1814,'MulgoreExitE',1,215,215,1,10,4,-2345.37,-1484.97,40.0713,4.66713,'174:0 1815:0 '),\n(1815,'Mulgore1',1,215,215,1,10,4,-2440.53,-1200.03,-9.30534,1.55892,'1814:0 1816:0 1865:0 1869:0 '),\n(1816,'Mulgore2',1,215,215,1,10,4,-2371.49,-904.809,-9.42438,4.38439,'1815:0 1817:0 1865:0 1866:0 1869:0 '),\n(1817,'Mulgore3',1,215,215,1,10,4,-2311.97,-607.857,-9.42454,4.65338,'1816:0 26:0 1818:0 1819:0 1869:0 '),\n(1818,'Mulgore4',1,215,223,1,10,4,-2105.91,-429.602,-6.83183,3.82086,'26:0 1817:0 1846:0 '),\n(1819,'Mulgore5',1,215,215,1,10,4,-2475.36,-501.699,-9.42479,5.94732,'26:0 1817:0 1820:0 1869:0 '),\n(1820,'Mulgore6',1,215,215,1,10,4,-2628.95,-190.942,-9.21765,5.24046,'1819:0 1821:0 1843:0 1844:0 1869:0 '),\n(1821,'Mulgore7',1,215,215,1,10,4,-2844.69,184.459,62.1599,5.51927,'1820:0 1822:0 1843:0 1844:0 '),\n(1822,'Mulgore8',1,215,215,1,10,4,-2993.74,194.655,71.8138,0.231569,'1821:0 1823:0 '),\n(1823,'Mulgore9',1,215,220,1,10,4,-3072.38,82.3203,78.0188,1.03857,'1822:0 1824:0 '),\n(1824,'Mulgore10',1,215,220,1,10,4,-3137.17,-93.9051,45.0213,1.34488,'1823:0 1825:0 1842:0 '),\n(1825,'Mulgore11',1,215,220,1,10,4,-3063.95,-239.512,50.6424,1.85735,'1824:0 27:0 1842:0 '),\n(1826,'Mulgore12',1,215,220,1,10,4,-2891.86,-697.729,45.2768,1.58442,'27:0 1827:0 1842:0 '),\n(1827,'Mulgore13',1,215,220,1,10,4,-3261.33,-846.251,48.8421,0.235503,'1826:0 1828:0 1830:0 1841:0 1842:0 '),\n(1828,'Mulgore14',1,215,220,1,10,4,-3366.64,-1016.68,109.367,6.12009,'1827:0 1829:0 '),\n(1829,'Mulgore15',1,215,358,1,10,4,-3224,-1083.1,88.5366,2.85872,'1828:0 1830:0 '),\n(1830,'Mulgore16',1,215,358,1,10,4,-3119.41,-1033.45,49.7491,3.46937,'1827:0 1829:0 1831:0 1832:0 '),\n(1831,'Mulgore17',1,215,358,1,10,4,-3063.5,-1162.46,66.0398,0.149071,'1830:0 1832:0 1833:0 '),\n(1832,'Mulgore18',1,215,358,1,10,4,-2991.05,-1001.3,57.8123,3.50664,'1830:0 1831:0 '),\n(1833,'Mulgore19',1,215,358,1,10,4,-2989.95,-1155.46,58.1984,3.50469,'1831:0 1834:0 1837:0 '),\n(1834,'Mulgore20',1,215,358,1,10,4,-2907.83,-1077.93,55.9333,3.94844,'1833:0 1835:0 1837:0 '),\n(1835,'Mulgore21',1,215,358,1,10,4,-2844.44,-1016.64,56.9403,4.16051,'1834:0 1836:0 '),\n(1836,'Mulgore22',1,215,358,1,10,4,-2854.01,-1100.12,90.8135,0.692983,'1835:0 '),\n(1837,'Mulgore23',1,215,358,1,10,4,-2883.85,-1231.28,72.9943,1.82985,'1833:0 1834:0 1838:0 1840:0 '),\n(1838,'Mulgore24',1,215,358,1,10,4,-3026.45,-1229.87,71.6597,6.01404,'1837:0 1839:0 '),\n(1839,'Mulgore25',1,215,358,1,10,4,-2970.92,-1323.02,80.5074,1.92996,'1838:0 1840:0 '),\n(1840,'Mulgore26',1,215,358,1,10,4,-2895.78,-1325.44,95.4793,2.24804,'1837:0 1839:0 '),\n(1841,'Mulgore27',1,215,220,1,10,4,-3440.17,-866.836,69.6282,6.24768,'1827:0 1842:0 '),\n(1842,'Mulgore28',1,215,220,1,10,4,-3367.33,-495.02,69.8435,4.71616,'1824:0 1825:0 1826:0 1827:0 1841:0 '),\n(1843,'Mulgore29',1,215,818,1,10,4,-2404.86,217.609,48.1932,3.41043,'1820:0 1821:0 1844:0 1845:0 1847:0 1870:0 '),\n(1844,'Mulgore30',1,215,215,1,10,4,-2261.05,-69.3042,-1.37537,2.79193,'1820:0 1821:0 1843:0 1845:0 1846:0 1847:0 '),\n(1845,'Mulgore31',1,215,215,1,10,4,-1909.74,216.749,46.1874,3.10216,'1843:0 1844:0 1847:0 1848:0 1849:0 1871:0 '),\n(1846,'Mulgore32',1,215,223,1,10,4,-2045.76,-343.178,-6.87874,4.09177,'1818:0 1844:0 1847:0 1862:0 1863:0 '),\n(1847,'Mulgore33',1,215,215,1,10,4,-1920.69,-119.003,-11.7465,4.00341,'1843:0 1844:0 1845:0 1846:0 1848:0 1862:0 '),\n(1848,'Mulgore34',1,215,215,1,10,4,-1668.96,-1.5923,-11.6961,3.52429,'1845:0 1847:0 1849:0 1850:0 1862:0 '),\n(1849,'Mulgore35',1,215,215,1,10,5,-1427.28,82.3261,15.7467,3.85023,'1845:0 1848:0 1850:0 '),\n(1850,'Mulgore36',1,215,215,1,10,4,-1347.57,320.413,8.78348,0.441607,'1848:0 1849:0 1851:0 1852:0 '),\n(1851,'Mulgore37',1,1638,1638,1,10,4,-1148.06,245.946,40.6026,3.4811,'1850:0 1852:0 1853:0 1854:0 '),\n(1852,'Mulgore38',1,215,215,1,10,4,-996.688,514.659,49.632,4.10942,'1850:0 1851:0 '),\n(1853,'Mulgore39',1,215,215,1,10,4,-751.74,38.1612,-20.8616,2.04343,'1851:0 1854:0 1856:0 1855:0 '),\n(1854,'Mulgore40',1,215,215,1,10,4,-927.854,10.2372,12.3669,2.39686,'1851:0 1853:0 1856:0 1855:0 '),\n(1855,'Mulgore41',1,215,819,1,10,4,-561.426,-405.799,30.6454,1.96489,'1853:0 1854:0 1856:0 1857:0 '),\n(1856,'Mulgore42',1,215,215,1,10,4,-901.7,-443.722,-39.0694,1.58907,'1853:0 1854:0 1855:0 1857:0 1861:0 '),\n(1857,'Mulgore43',1,215,820,1,10,4,-924.517,-801.42,-5.66428,4.78761,'1855:0 1856:0 1858:0 1860:0 1861:0 '),\n(1858,'Mulgore44',1,215,225,1,10,4,-956.811,-1082.75,42.1933,1.43395,'1857:0 1859:0 '),\n(1859,'Mulgore45',1,215,225,1,10,4,-1099.12,-1152.59,50.0739,0.809557,'1858:0 1860:0 '),\n(1860,'Mulgore46',1,215,820,1,10,4,-1365.16,-841.737,-8.11366,5.8636,'1857:0 1859:0 1861:0 1862:0 1863:0 '),\n(1861,'Mulgore47',1,215,820,1,10,4,-1254.38,-429.801,-44.919,0.114484,'1856:0 1857:0 1860:0 1862:0 '),\n(1862,'Mulgore48',1,215,820,1,10,4,-1600.99,-429.634,-38.9597,5.5357,'1846:0 1847:0 1848:0 1860:0 1861:0 1863:0 1864:0 '),\n(1863,'Mulgore49',1,215,820,1,10,4,-1742.71,-749.243,-8.79196,6.02461,'1846:0 1860:0 1862:0 1864:0 1865:0 1866:0 '),\n(1864,'Mulgore50',1,215,224,1,10,4,-1925.81,-713.913,3.65139,0.842938,'1862:0 1863:0 1865:0 1866:0 '),\n(1865,'Mulgore51',1,215,215,1,10,4,-2111.14,-877.576,-5.68659,6.00889,'1815:0 1816:0 1863:0 1864:0 1866:0 '),\n(1866,'Mulgore52',1,215,360,1,10,4,-1975.78,-1068.43,47.7644,0.687805,'1816:0 1863:0 1864:0 1865:0 1867:0 '),\n(1867,'Mulgore53',1,215,360,1,10,4,-1884.66,-1112.51,92.8851,6.08152,'1866:0 1868:0 '),\n(1868,'Mulgore54',1,215,360,1,10,4,-1584.13,-1092.53,103.917,3.87848,'1867:0 93:0 '),\n(1869,'Mulgore55',1,215,215,1,10,4,-2751.82,-857.915,4.54324,5.9912,'1815:0 1816:0 1817:0 1819:0 1820:0 '),\n(1870,'Mulgore56',1,215,818,1,10,4,-2369.44,444.618,66.6944,2.44118,'1843:0 '),\n(1871,'Mulgore57',1,215,404,1,10,4,-1938.35,454.865,133.59,5.01926,'1845:0 '),\n(1872,'DWMExitW',1,15,15,33,45,0,-3684.38,-2471.41,78.489,4.65716,'1596:0 99:0 '),\n(1873,'DustwallowC1',1,15,15,33,45,0,-3476.61,-2710.46,33.3673,2.4724,'99:0 187:0 1903:0 1904:0 103:0 '),\n(1874,'BlackhoofVillage',1,15,512,33,45,0,-2455.85,-3159.6,35.8624,3.43489,'102:0 1875:0 '),\n(1875,'DustwallowN1',1,15,15,33,45,0,-2686.37,-3372.62,34.5997,0.845044,'101:0 102:0 1874:0 1876:0 1877:0 1902:0 '),\n(1876,'DustwallowN2',1,15,15,33,45,0,-2562.07,-3486.87,34.2695,2.37303,'1875:0 1877:0 '),\n(1877,'DustwallowN3',1,15,15,33,45,0,-2671.59,-3675.6,30.8794,2.00782,'101:0 110:0 1875:0 1876:0 1878:0 1879:0 1894:0 '),\n(1878,'DustwallowN4',1,15,502,33,45,0,-2914.27,-3675.73,33.4338,1.38735,'101:0 110:0 1877:0 1879:0 1880:0 '),\n(1879,'DustwallowN5',1,15,502,33,45,0,-2802.66,-3997.22,36.7838,2.19983,'110:0 1877:0 1878:0 1880:0 1892:0 '),\n(1880,'DustwallowN6',1,15,502,33,45,0,-3155.95,-3974.68,29.251,1.17881,'110:0 1878:0 1879:0 1881:0 1887:0 '),\n(1881,'DustwallowN7',1,15,15,33,45,0,-3305.97,-4095.97,23.4925,0.654559,'109:0 1880:0 '),\n(1882,'DustwallowN8',1,15,15,33,45,0,-3491.34,-4245.46,7.816,1.17292,'109:0 54:0 1884:0 1912:0 '),\n(1883,'TheramoreInn',1,15,513,33,45,3,-3627.66,-4472.85,17.4714,0.218669,'54:0 '),\n(1884,'DustwallowCoastN1',1,15,518,33,45,0,-3458.13,-4377.69,0.755389,2.14564,'1882:0 1885:0 '),\n(1885,'DustwallowCoastN2',1,15,518,33,45,0,-3329.33,-4289.33,1.48119,3.70268,'1884:0 1886:0 '),\n(1886,'DustwallowCoastN3',1,15,518,33,45,0,-3142.27,-4215.25,0.891156,0.280307,'1885:0 1887:0 1897:0 '),\n(1887,'DustwallowCoastN4',1,15,518,33,45,0,-2985.17,-4207.51,1.60007,3.33747,'1880:0 1886:0 1888:0 1897:0 '),\n(1888,'DustwallowCoastN5',1,15,518,33,45,0,-2802.02,-4220.5,1.16157,3.12737,'1889:0 1887:0 1897:0 1898:0 '),\n(1889,'DustwallowCoastN6',1,15,518,33,45,0,-2682.96,-4150.2,0.491195,3.24911,'1888:0 1890:0 1898:0 '),\n(1890,'DustwallowCoastN7',1,15,518,33,45,0,-2644.79,-4076.96,0.24736,4.12678,'1889:0 1891:0 1892:0 1893:0 '),\n(1891,'DustwallowCoastN8',1,15,518,33,45,0,-2634.51,-3970.05,1.40599,4.46647,'1890:0 1892:0 1893:0 1894:0 '),\n(1892,'DustwallowCoastN9',1,15,518,33,45,0,-2678.39,-4014.18,4.97984,2.78377,'1879:0 1890:0 1891:0 '),\n(1893,'DustwallowCoastN10',1,15,518,33,45,0,-2559.21,-4015.96,9.99785,3.70856,'1890:0 1891:0 1899:0 '),\n(1894,'DustwallowCoastN11',1,15,518,33,45,0,-2607.14,-3826.64,6.27917,4.49985,'1877:0 1891:0 1895:0 '),\n(1895,'DustwallowCoastN12',1,15,518,33,45,0,-2466.63,-3818.63,2.61691,3.22358,'1896:0 1894:0 1899:0 1900:0 '),\n(1896,'DustwallowCoastN13',1,17,385,33,45,0,-2395.84,-3763.83,5.73158,5.36182,'1574:0 1895:0 '),\n(1897,'DustwallowCoastN14',1,15,518,33,45,0,-3001.64,-4378.46,9.05538,1.1933,'1886:0 1887:0 1888:0 '),\n(1898,'DustwallowCoastN15',1,15,518,33,45,0,-2662.99,-4255.03,3.90542,2.70126,'1888:0 1889:0 1901:0 '),\n(1899,'DustwallowCoastN16',1,15,518,33,45,0,-2408.96,-4080.5,3.33986,2.28499,'1893:0 1895:0 1900:0 1901:0 '),\n(1900,'DustwallowCoastN17',1,15,518,33,45,0,-2302.1,-4086.25,16.0641,1.37353,'1573:0 1574:0 1895:0 1899:0 1901:0 '),\n(1901,'DustwallowCoastN18',1,15,518,33,45,0,-2291.73,-4303.19,4.72444,2.85793,'1898:0 1899:0 1900:0 '),\n(1902,'DustwallowN9',1,15,15,33,45,0,-2942.4,-3252.27,31.3912,5.0692,'100:0 101:0 102:0 1875:0 1903:0 '),\n(1903,'DustwallowC2',1,15,15,33,45,0,-3285.02,-3185.79,32.3767,5.19094,'1873:0 1902:0 1904:0 1905:0 '),\n(1904,'DustwallowC3',1,15,2302,33,45,0,-3645.37,-3105.83,35.4956,0.749902,'99:0 1873:0 1903:0 1905:0 1907:0 103:0 '),\n(1905,'DustwallowC4',1,15,4046,33,45,0,-3692.77,-3428.45,36.5831,1.67942,'1903:0 1904:0 1906:0 1907:0 '),\n(1906,'DustwallowC5',1,15,501,33,45,0,-4023.01,-3761.02,42.2472,0.725162,'1905:0 1907:0 105:0 '),\n(1907,'DustwallowC6',1,15,4049,33,45,0,-4017.64,-3385.66,38.3117,5.35312,'1904:0 1905:0 1906:0 103:0 105:0 '),\n(1908,'DustwallowC7',1,15,510,33,45,0,-4230.28,-2794.11,27.7681,6.16323,'103:0 108:0 1909:0 '),\n(1909,'DustwallowS1',1,15,509,33,45,0,-4392.92,-2968.72,72.0173,1.4685,'103:0 108:0 1908:0 233:0 105:0 '),\n(1910,'DustwallowS2',1,15,511,33,45,0,-4652.75,-3983.64,63.5063,1.62756,'106:0 107:0 '),\n(1911,'DustwallowS3',1,15,511,33,45,0,-4869.31,-3443.39,39.4441,0.620287,'106:0 107:0 233:0 '),\n(1912,'DustwallowCoastS1',1,15,516,33,45,0,-3990.53,-4144.75,15.8765,3.0059,'104:0 1882:0 '),\n(1913,'FeralasN1',1,357,1114,38,50,0,-2571.82,2244.63,96.3995,0.543668,'1802:0 1914:0 '),\n(1914,'FeralasN2',1,357,1114,38,50,0,-2742,2335.99,62.5691,5.81565,'1913:0 1915:0 1920:0 1921:0 '),\n(1915,'FeralasN3',1,357,1114,38,50,0,-2829.93,2719.49,74.7843,5.10291,'1914:0 1916:0 1920:0 '),\n(1916,'FeralasN4',1,357,1114,38,50,0,-3032.68,2638.14,54.8507,0.249148,'1915:0 1917:0 1920:0 '),\n(1917,'FeralasN5',1,357,1119,38,50,0,-3246.59,2815.94,85.1355,5.88045,'1916:0 1918:0 '),\n(1918,'FeralasN6',1,357,1119,38,50,0,-3570.32,2569.75,80.1298,0.734128,'1917:0 1919:0 1923:0 '),\n(1919,'FeralasN7',1,357,1119,38,50,0,-3349.08,2217.29,32.4203,2.18908,'1918:0 1920:0 1922:0 '),\n(1920,'FeralasN8',1,357,1119,38,50,0,-2939.01,2249.46,45.7452,1.87688,'1914:0 1915:0 1916:0 1919:0 1921:0 '),\n(1921,'FeralasN9',1,357,1111,50,60,0,-2867.51,1894.77,52.6495,3.09033,'1914:0 1920:0 '),\n(1922,'FeralasN10',1,357,1119,38,50,0,-3464.98,2077.93,40.3195,0.882963,'1919:0 1923:0 1925:0 1926:0 '),\n(1923,'FeralasN11',1,357,1119,38,50,0,-3508.95,2343.43,61.5171,1.82151,'1918:0 1922:0 1924:0 '),\n(1924,'FeralasN12',1,357,1119,38,50,0,-3582.9,2225.74,39.1949,3.55134,'1923:0 1925:0 '),\n(1925,'FeralasN13',1,357,1119,38,50,0,-3677.85,2192.02,79.5813,5.92325,'1922:0 1924:0 1929:0 '),\n(1926,'FeralasN14',1,357,1119,38,50,0,-3902.37,1958.83,79.7325,5.2537,'1922:0 1927:0 1931:0 '),\n(1927,'FeralasN15',1,357,1115,38,50,0,-3845.14,1829.16,124.075,1.98644,'1926:0 131:0 '),\n(1928,'FeralasN16',1,357,1115,38,50,0,-3896.35,1647.85,117.592,4.8178,'131:0 '),\n(1929,'FeralasN17',1,357,1119,38,50,0,-3899.54,2080.79,120.315,0.496151,'1925:0 1930:0 '),\n(1930,'FeralasN18',1,357,1119,38,50,0,-4106.11,2126.23,91.7704,5.83686,'1929:0 1931:0 1932:0 '),\n(1931,'FeralasN19',1,357,1119,38,50,0,-4171.24,2101.97,88.0788,0.490217,'1926:0 1930:0 1943:0 '),\n(1932,'FeralasCoast1',1,357,1108,38,50,0,-4118.28,2330.97,2.19033,5.05932,'1930:0 1933:0 1935:0 '),\n(1933,'FeralasCoast2',1,357,1108,38,50,0,-4052.79,2718.62,0.6784,4.75105,'1932:0 1934:0 1939:0 '),\n(1934,'FeralasCoast3',1,357,1108,38,50,0,-3843.41,3064.54,7.61114,4.17574,'1933:0 '),\n(1935,'FeralasCoast4',1,357,1108,38,50,0,-4379.47,2356.68,-0.331094,5.57371,'1932:0 1936:0 1937:0 1939:0 1944:0 '),\n(1936,'FeralasCoast5',1,357,1108,38,50,0,-4743.36,2004.49,5.62754,0.704225,'1935:0 1937:0 1950:0 '),\n(1937,'FeralasCoast6',1,357,1108,38,50,0,-4901.88,2189.77,1.21295,5.78972,'1935:0 1936:0 1938:0 '),\n(1938,'FeralasCoast7',1,357,1108,38,50,0,-5436.32,2245.93,4.15669,6.02534,'1937:0 '),\n(1939,'FeathermoonCoast',1,357,1116,38,50,2,-4396.44,3096.49,-0.543116,1.686,'58:0 1933:0 1935:0 '),\n(1940,'SardorIsle1',1,357,1117,38,50,2,-4874.91,3238.84,9.84719,0.996823,'58:0 132:0 1941:0 '),\n(1941,'SardorIsle2',1,357,1120,38,50,2,-4509.12,3541.55,19.5222,3.63969,'58:0 132:0 1940:0 '),\n(1942,'ShalzarusLairInside',1,357,3117,38,50,0,-5628.12,3481.23,0.291859,1.03412,'140:0 '),\n(1943,'FeralasC1',1,357,1108,38,50,0,-4354.27,2114.61,65.9115,3.94793,'1931:0 1944:0 '),\n(1944,'FeralasC2',1,357,1108,38,50,0,-4459.61,2051.49,45.6382,0.749398,'1935:0 1943:0 1945:0 '),\n(1945,'FeralasC3',1,357,1108,38,50,0,-4587.74,2020.12,49.7424,0.107333,'1944:0 1946:0 '),\n(1946,'FeralasC4',1,357,1108,38,50,0,-4669.12,1941.38,71.209,4.65283,'1945:0 1947:0 '),\n(1947,'FeralasC5',1,357,1136,38,50,0,-4689.38,1793.15,92.5165,3.59252,'1946:0 1948:0 1951:0 '),\n(1948,'FeralasC6',1,357,1136,38,50,0,-4548.77,1825.47,91.6009,4.86489,'1947:0 1949:0 '),\n(1949,'FeralasC7',1,357,2577,38,50,0,-4570.42,1333.99,110.276,1.57406,'1948:0 1952:0 1966:0 '),\n(1950,'FeralasC8',1,357,1136,38,50,0,-4774.62,1706.39,79.0617,1.25399,'1936:0 1951:0 '),\n(1951,'FeralasC9',1,357,1136,38,50,0,-4747.41,1601.96,83.6922,1.48372,'1947:0 1950:0 1952:0 1953:0 '),\n(1952,'FeralasC10',1,357,1136,38,50,0,-4850.91,1315.71,81.0286,0.264391,'1949:0 1951:0 1966:0 '),\n(1953,'FeralasC11',1,357,1105,38,50,0,-4984.77,1575.59,59.7078,0.164254,'1951:0 1954:0 1956:0 1964:0 '),\n(1954,'FeralasC12',1,357,1105,38,50,0,-4932.88,1723.53,64.1127,4.66263,'1953:0 1955:0 '),\n(1955,'FeralasC13',1,357,1105,38,50,0,-5149.79,1759.34,78.4796,0.706951,'1954:0 '),\n(1956,'FeralasC14',1,357,1136,38,50,0,-5121.12,1597.3,62.6844,6.11245,'1953:0 1957:0 1964:0 '),\n(1957,'FeralasC15',1,357,1136,38,50,0,-5312.41,1586.43,50.2301,2.5919,'1956:0 1958:0 1961:0 1964:0 '),\n(1958,'FeralasC16',1,357,1106,38,50,0,-5747.35,1698.84,93.4873,6.16546,'1957:0 1959:0 '),\n(1959,'FeralasC17',1,357,2522,38,50,0,-5765.25,1224.11,66.4458,1.50412,'1958:0 1960:0 '),\n(1960,'FeralasC18',1,357,2522,38,50,0,-5550.63,1116.69,56.7549,0.496841,'1959:0 1961:0 '),\n(1961,'FeralasC19',1,357,2522,38,50,0,-5461.46,1368.9,22.0332,4.46507,'1957:0 1960:0 1962:0 1964:0 '),\n(1962,'FeralasC20',1,357,2522,38,50,0,-5595.89,1373.16,54.1263,3.31838,'1961:0 1963:0 '),\n(1963,'FeralasC21',1,357,2522,38,50,0,-5687.79,1413.51,73.2559,3.3773,'1962:0 '),\n(1964,'FeralasC22',1,357,2522,38,50,0,-5109.82,1250.83,51.7218,2.34252,'1953:0 1956:0 1957:0 1961:0 1965:0 '),\n(1965,'FeralasC23',1,357,2522,38,50,0,-4947.18,1144.74,76.4718,2.43362,'1964:0 1966:0 '),\n(1966,'FeralasC24',1,357,1136,38,50,0,-4819.41,1182.67,88.2722,1.88973,'1949:0 1952:0 1965:0 1967:0 '),\n(1967,'FeralasC25',1,357,2521,38,50,0,-4850.75,1054.39,94.6178,1.13575,'1966:0 1968:0 '),\n(1968,'FeralasC26',1,357,357,38,50,0,-4701.43,1002.11,106.384,2.81258,'1967:0 1969:0 1972:0 '),\n(1969,'FeralasC27',1,357,357,38,50,0,-4686.71,913.041,90.3337,1.80138,'1968:0 1970:0 '),\n(1970,'FeralasC28',1,357,357,38,50,0,-4641.48,856.356,83.6012,2.41398,'1969:0 1971:0 '),\n(1971,'FeralasC29',1,357,357,38,50,0,-4679.42,716.437,75.2356,1.09647,'1970:0 1974:0 1981:0 '),\n(1972,'FeralasC30',1,357,357,38,50,0,-4555.72,884.281,58.0988,3.21115,'1968:0 1973:0 '),\n(1973,'FeralasC31',1,357,357,38,50,0,-4505.93,684.371,66.7637,1.78171,'1972:0 1974:0 1975:0 1976:0 '),\n(1974,'FeralasE1',1,357,357,38,50,0,-4659.39,623.64,52.4147,4.96061,'1971:0 1973:0 1975:0 1978:0 2006:0 '),\n(1975,'FeralasE2',1,357,357,38,50,0,-4635.27,542.675,37.1032,1.8524,'1973:0 1974:0 1976:0 1981:0 1993:0 1994:0 1995:0 '),\n(1976,'FeralasE3',1,357,357,38,50,0,-4390.02,604.52,62.0106,2.9598,'1973:0 1975:0 1977:0 1995:0 2006:0 '),\n(1977,'FeralasE4',1,357,1100,38,50,0,-4212.24,655.545,69.8097,3.6706,'1976:0 2005:0 2006:0 '),\n(1978,'FeralasE5',1,357,2519,38,50,0,-4898.74,674.126,43.55,1.02185,'1974:0 1979:0 1981:0 1982:0 '),\n(1979,'FeralasE6',1,357,2519,38,50,0,-4953.5,761.759,82.878,5.39652,'1978:0 1980:0 '),\n(1980,'FeralasE7',1,357,2520,38,50,0,-4845.02,785.634,113.891,1.35172,'1979:0 178:0 '),\n(1981,'FeralasE8',1,357,2519,38,50,0,-4880.52,558.22,12.8999,1.88775,'1971:0 1975:0 1978:0 1993:0 1994:0 '),\n(1982,'FeralasE9',1,357,2519,38,50,0,-5149.35,692.713,54.9213,6.26831,'1978:0 1983:0 1994:0 '),\n(1983,'FeralasE10',1,357,1101,38,50,0,-5319.6,478.232,53.9695,0.898155,'1982:0 1984:0 1994:0 '),\n(1984,'FeralasE11',1,357,1101,38,50,0,-5163.07,220.677,54.4074,1.30064,'1983:0 1985:0 1986:0 1987:0 1988:0 1991:0 '),\n(1985,'FeralasE12',1,357,1101,38,50,0,-5302,428.292,8.41442,3.73933,'1984:0 '),\n(1986,'FeralasE13',1,357,1101,38,50,0,-5384.3,261.887,20.4496,0.905996,'1984:0 '),\n(1987,'FeralasE14',1,357,1101,38,50,0,-5265.18,-4.42852,15.1479,1.56377,'1984:0 '),\n(1988,'FeralasE15',1,357,1101,38,50,0,-5343.63,67.4607,28.7204,3.66077,'1984:0 1989:0 1990:0 '),\n(1989,'FeralasE16',1,357,1101,38,50,0,-5450.99,119.201,27.5633,6.28204,'1988:0 '),\n(1990,'FeralasE17',1,357,1101,38,50,0,-5340.47,-23.1596,18.5077,1.41062,'1988:0 '),\n(1991,'FeralasE18',1,357,2519,38,50,0,-4991.17,205.185,56.0523,2.62992,'1984:0 136:0 1992:0 1994:0 '),\n(1992,'FeralasE19',1,357,1137,38,50,0,-4866.29,339.413,26.1994,4.53453,'136:0 1991:0 1993:0 1994:0 1999:0 '),\n(1993,'FeralasE20',1,357,357,38,50,0,-4722.79,464.496,31.986,3.94744,'1975:0 1981:0 1992:0 '),\n(1994,'FeralasE21',1,357,2519,38,50,0,-5009.99,424.997,15.1355,0.648747,'1975:0 1981:0 1982:0 1983:0 1991:0 1992:0 '),\n(1995,'FeralasE22',1,357,357,38,50,4,-4578.16,370.868,33.8808,1.77815,'1975:0 1976:0 53:0 2006:0 '),\n(1996,'FeralasE23',1,357,1099,38,50,5,-4481.74,227.782,48.3927,0.264285,'53:0 '),\n(1997,'FeralasE24',1,357,1099,38,50,4,-4376.3,121.922,32.6793,1.76165,'53:0 1998:0 '),\n(1998,'FeralasE25',1,357,1137,38,50,4,-4328.21,-19.6833,60.5124,1.72631,'1997:0 2003:0 '),\n(1999,'FeralasE26',1,357,357,38,50,0,-4659.2,184.738,43.8095,4.93936,'1992:0 2000:0 '),\n(2000,'FeralasE27',1,357,357,38,50,0,-4603.74,66.3705,89.2353,5.28101,'1999:0 2001:0 '),\n(2001,'FeralasE28',1,357,357,38,50,0,-4564.62,-31.7688,90.9571,1.80758,'2000:0 2002:0 '),\n(2002,'FeralasE29',1,357,357,38,50,0,-4446.96,-44.7766,57.3336,5.9427,'2001:0 2003:0 2009:0 '),\n(2003,'FeralasE30',1,357,1137,38,50,0,-4300.16,-85.5649,62.2238,2.29256,'1998:0 2002:0 2004:0 2007:0 2008:0 '),\n(2004,'FeralasE31',1,357,2518,38,50,0,-4205.65,113.809,55.5058,4.08129,'2003:0 2006:0 137:0 '),\n(2005,'FeralasE32',1,357,1100,38,50,0,-4133.72,537.891,69.2153,3.29981,'1977:0 2006:0 '),\n(2006,'FeralasE33',1,357,357,38,50,0,-4279.19,459.305,53.0559,3.87904,'1974:0 1976:0 1977:0 1995:0 2004:0 2005:0 137:0 '),\n(2007,'FeralasE34',1,357,1137,38,50,0,-4106.63,-81.3584,57.9545,3.10739,'2003:0 137:0 2008:0 '),\n(2008,'FeralasE35',1,357,1137,38,50,0,-4234.2,-193.867,59.9266,1.9823,'2003:0 2007:0 2010:0 2017:0 '),\n(2009,'FeralasE36',1,357,1137,38,50,0,-4457.62,-347.118,42.7385,1.56603,'2002:0 2010:0 2013:0 '),\n(2010,'FeralasE37',1,357,1137,38,50,0,-4279.38,-302.439,53.8359,3.38225,'2008:0 2009:0 2011:0 '),\n(2011,'FeralasE38',1,357,1137,38,50,0,-4304.01,-380.254,42.9873,1.37949,'2010:0 2012:0 '),\n(2012,'FeralasE39',1,357,1137,38,50,0,-4323.94,-518.378,18.8016,1.66222,'2011:0 2013:0 2015:0 '),\n(2013,'FeralasE40',1,357,1137,38,50,0,-4484.94,-528.383,12.6689,1.34413,'2009:0 2012:0 2014:0 '),\n(2014,'FeralasE41',1,357,1137,38,50,0,-4483.85,-680.591,-13.4172,2.0451,'2013:0 40:0 2019:0 '),\n(2015,'FeralasE42',1,357,1137,38,50,0,-4357.69,-582.597,3.62467,1.18115,'2012:0 2016:0 '),\n(2016,'FeralasE43',1,357,1137,38,50,0,-4283.62,-657.145,-16.5908,4.73115,'2015:0 2019:0 '),\n(2017,'FeralasE44',1,357,1137,38,50,0,-4097.49,-507.444,10.4313,4.54463,'2008:0 2018:0 '),\n(2018,'FeralasE45',1,357,1137,38,50,0,-4189.57,-767.003,-39.6189,2.74803,'2017:0 2019:0 2023:0 '),\n(2019,'FeralasE46',1,357,1137,38,50,0,-4273.71,-763.178,-44.585,1.5287,'40:0 2014:0 2016:0 2018:0 2020:0 '),\n(2020,'ThousandNeedlesW1',1,400,400,23,35,0,-4400.82,-883.395,-57.6691,2.28464,'40:0 2019:0 2022:0 2024:0 '),\n(2021,'ThousandNeedlesW2',1,400,400,23,35,0,-4635.23,-913.058,-56.816,0.876811,'40:0 2022:0 2030:0 '),\n(2022,'ThousandNeedlesW3',1,400,400,23,35,0,-4526.31,-1003.24,-57.3019,0.841468,'2020:0 2021:0 2024:0 2025:0 '),\n(2023,'ThousandNeedlesW4',1,400,400,23,35,0,-4265.7,-975.548,-52.6163,1.36572,'2018:0 2024:0 '),\n(2024,'ThousandNeedlesW5',1,400,400,23,35,0,-4345.17,-1001.19,-55.4334,0.859138,'2020:0 2022:0 2023:0 2026:0 '),\n(2025,'ThousandNeedlesW6',1,400,400,23,35,0,-4577.79,-1063.18,-51.9676,0.682426,'2022:0 2026:0 2027:0 '),\n(2026,'ThousandNeedlesW7',1,400,480,23,35,0,-4478.86,-1145.77,-53.883,1.10654,'2024:0 2025:0 2028:0 '),\n(2027,'ThousandNeedlesW8',1,400,400,23,35,0,-4653.89,-1114.06,-54.8856,5.97601,'2025:0 2028:0 2029:0 '),\n(2028,'ThousandNeedlesW9',1,400,480,23,35,0,-4608.02,-1288.85,-51.0977,0.870926,'2026:0 2027:0 2033:0 2037:0 '),\n(2029,'ThousandNeedlesW10',1,400,400,23,35,0,-4726.44,-1099.89,-54.2582,6.07616,'2027:0 2030:0 2033:0 '),\n(2030,'ThousandNeedlesW11',1,400,400,23,35,0,-4790.74,-1025.56,-58.7304,0.476274,'2021:0 2029:0 2031:0 2058:0 '),\n(2031,'ThousandNeedlesW12',1,400,400,23,35,0,-4923.35,-1082.53,-50.209,0.562663,'2030:0 2032:0 2035:0 '),\n(2032,'ThousandNeedlesW13',1,400,400,23,35,0,-4838.39,-1191.4,-49.6151,2.08829,'2031:0 2033:0 2034:0 '),\n(2033,'ThousandNeedlesW14',1,400,400,23,35,0,-4768.1,-1216.56,-52.8083,3.08574,'2028:0 2029:0 2032:0 2036:0 '),\n(2034,'ThousandNeedlesW15',1,400,400,23,35,0,-4942.46,-1263.31,-48.5414,1.36768,'2032:0 2035:0 50:0 '),\n(2035,'ThousandNeedlesW16',1,400,400,23,35,0,-5066.47,-1194.08,-55.537,0.71973,'2031:0 2034:0 2039:0 '),\n(2036,'ThousandNeedlesW17',1,400,400,23,35,0,-4769.77,-1352.68,-49.836,1.52869,'50:0 2033:0 2037:0 2040:0 '),\n(2037,'ThousandNeedlesW18',1,400,400,23,35,0,-4652.8,-1464.98,-50.872,2.47901,'2028:0 2036:0 2041:0 2043:0 '),\n(2038,'ThousandNeedlesW19',1,400,400,23,35,0,-5074.73,-1410.96,-52.2312,0.222955,'50:0 2039:0 2048:0 '),\n(2039,'ThousandNeedlesW20',1,400,400,23,35,0,-5194.18,-1406.79,-50.3763,0.764877,'2035:0 2038:0 2050:0 '),\n(2040,'ThousandNeedlesW21',1,400,400,23,35,0,-4891.87,-1456.05,-51.236,1.07118,'50:0 2036:0 2042:0 2048:0 '),\n(2041,'ThousandNeedlesW22',1,400,400,23,35,0,-4757,-1501.21,-28.7948,0.370198,'2037:0 2042:0 '),\n(2042,'ThousandNeedlesW23',1,400,400,23,35,0,-4811.64,-1556.31,-50.0359,0.963171,'2040:0 2041:0 2043:0 2046:0 '),\n(2043,'ThousandNeedlesW24',1,400,400,23,35,0,-4661.22,-1624.56,-25.4573,1.73482,'2037:0 2042:0 2044:0 '),\n(2044,'ThousandNeedlesW25',1,400,400,23,35,0,-4624.13,-1730.14,-31.5621,1.85852,'2043:0 2045:0 '),\n(2045,'ThousandNeedlesW26',1,400,485,23,35,0,-4691.02,-1824.75,-56.5207,1.01619,'2044:0 2047:0 2081:0 '),\n(2046,'ThousandNeedlesW27',1,400,400,23,35,0,-4811.86,-1670.4,-51.0873,1.72892,'2042:0 2047:0 2052:0 '),\n(2047,'ThousandNeedlesW28',1,400,2097,23,35,0,-4783.23,-1788.72,-49.3172,1.42261,'2045:0 2046:0 2051:0 '),\n(2048,'ThousandNeedlesW29',1,400,400,23,35,0,-4982.42,-1560.83,-47.125,1.17787,'2038:0 2040:0 2049:0 2052:0 '),\n(2049,'ThousandNeedlesW30',1,400,400,23,35,0,-5165.39,-1577.56,-54.4116,0.343386,'2048:0 2050:0 2054:0 '),\n(2050,'ThousandNeedlesW31',1,400,483,23,35,0,-5295.65,-1509.76,-56.4121,0.573119,'2039:0 2049:0 2055:0 '),\n(2051,'ThousandNeedlesW32',1,400,2097,23,35,0,-4855.93,-1831.87,-51.9183,1.28194,'2047:0 2052:0 2079:0 2080:0 '),\n(2052,'ThousandNeedlesW33',1,400,400,23,35,0,-4969.52,-1717.69,-61.5435,1.6491,'2046:0 2048:0 2051:0 2053:0 '),\n(2053,'ThousandNeedlesW34',1,400,400,23,35,0,-5061.47,-1763.65,-66.1325,0.36653,'2052:0 2054:0 2068:0 '),\n(2054,'ThousandNeedlesW35',1,400,400,23,35,0,-5173.45,-1717.17,-61.8311,6.25112,'2049:0 2053:0 2055:0 2086:0 2087:0 '),\n(2055,'ThousandNeedlesW36',1,400,483,23,35,0,-5372.83,-1603.26,-55.6282,0.975215,'2050:0 2054:0 2056:0 2087:0 2088:0 '),\n(2056,'ThousandNeedlesW37',1,400,483,23,35,0,-5472.25,-1702.35,2.75952,1.04984,'2055:0 116:0 '),\n(2057,'ThousandNeedlesW38',1,400,487,23,35,0,-5593.3,-1588.57,6.36415,0.366532,'116:0 '),\n(2058,'ThousandNeedlesW39',1,400,482,23,35,0,-4950.58,-1058.58,-14.0026,1.23243,'2030:0 2059:0 '),\n(2059,'ThousandNeedlesW40',1,400,482,23,35,0,-4980.25,-980.015,-4.94507,5.09659,'2058:0 2060:0 2062:0 2061:0 '),\n(2060,'ThousandNeedlesW41',1,400,482,23,35,0,-4876.43,-922.254,-5.58887,3.87725,'2059:0 2062:0 2061:0 '),\n(2061,'ThousandNeedlesW42',1,400,482,23,35,0,-5005.39,-842.193,-5.46968,5.01411,'2059:0 2060:0 2062:0 '),\n(2062,'ThousandNeedlesW43',1,400,482,23,35,0,-5051.17,-927.317,-5.60775,4.14232,'2059:0 2060:0 2061:0 2063:0 2064:0 '),\n(2063,'ThousandNeedlesW44',1,400,482,23,35,0,-5166.88,-896.379,-5.07889,5.92361,'2062:0 '),\n(2064,'ThousandNeedlesW45',1,400,482,23,35,0,-5091.13,-1008.99,-5.23615,3.78733,'2062:0 2065:0 '),\n(2065,'ThousandNeedlesW46',1,400,482,23,35,0,-5126.17,-1095.6,50.5447,1.11501,'2064:0 2066:0 '),\n(2066,'ThousandNeedlesW47',1,400,482,23,35,0,-5191.66,-1142.08,49.8328,4.3371,'2065:0 2067:0 '),\n(2067,'ThousandNeedlesW48',1,400,482,23,35,0,-5186.85,-1242.42,53.7882,2.36968,'2066:0 '),\n(2068,'DarkcloudPinnacle1',1,400,2097,23,35,0,-5005.12,-1890.45,3.66479,1.83561,'2053:0 2069:0 '),\n(2069,'DarkcloudPinnacle2',1,400,2097,23,35,0,-4901.08,-1867.77,34.9781,3.58507,'2068:0 2070:0 '),\n(2070,'DarkcloudPinnacle3',1,400,2097,23,35,0,-4776.06,-1872.74,90.3879,3.04316,'2069:0 2071:0 '),\n(2071,'DarkcloudPinnacle4',1,400,2097,23,35,0,-4876.74,-1978.26,91.8746,0.720343,'2070:0 2072:0 115:0 '),\n(2072,'DarkcloudPinnacle5',1,400,2097,23,35,0,-4915.54,-2071.05,84.7897,4.93989,'2071:0 2073:0 2076:0 '),\n(2073,'DarkcloudPinnacle6',1,400,2097,23,35,0,-4831.42,-2151.41,81.6488,1.60588,'2072:0 2074:0 2075:0 '),\n(2074,'DarkcloudPinnacle7',1,400,2097,23,35,0,-4748.26,-2111.8,83.523,4.04415,'2073:0 '),\n(2075,'DarkcloudPinnacle8',1,400,400,23,35,0,-4842.57,-2213.19,85.1857,5.94087,'2073:0 '),\n(2076,'DarkcloudPinnacle9',1,400,2097,23,35,0,-5016.1,-2107.74,83.8605,6.28252,'2072:0 '),\n(2077,'DarkcloudPinnacle10',1,400,2097,23,35,0,-5170.08,-2145.09,93.7072,3.77318,'115:0 '),\n(2078,'DarkcloudPinnacle11',1,400,2097,23,35,0,-4921.47,-1843.98,80.8273,3.6318,'115:0 '),\n(2079,'ThousandNeedlesC1',1,400,2097,23,35,0,-4970.93,-1895.26,-42.399,2.08851,'2051:0 2080:0 '),\n(2080,'ThousandNeedlesC2',1,400,2097,23,35,0,-4870.6,-1904.88,-51.5857,2.74235,'2051:0 2079:0 2082:0 '),\n(2081,'ThousandNeedlesC3',1,400,2097,23,35,0,-4709.18,-1916.95,-45.1441,1.27365,'2045:0 2082:0 '),\n(2082,'ThousandNeedlesC4',1,400,2097,23,35,0,-4776.72,-1989.22,-60.8744,1.12639,'2080:0 2081:0 2083:0 '),\n(2083,'ThousandNeedlesC5',1,400,2097,23,35,0,-4881.01,-2128.55,-44.1711,3.78849,'2082:0 2084:0 '),\n(2084,'ThousandNeedlesC6',1,400,481,23,35,0,-5057.5,-2264.52,-53.5104,0.73918,'2083:0 2085:0 2094:0 119:0 '),\n(2085,'ThousandNeedlesC7',1,400,2097,23,35,0,-5086.72,-2103.07,-39.7408,4.73175,'2084:0 2086:0 '),\n(2086,'ThousandNeedlesC8',1,400,400,23,35,0,-5241.22,-1991.69,-60.4397,4.88884,'2054:0 2085:0 2090:0 2094:0 '),\n(2087,'ThousandNeedlesC9',1,400,483,23,35,0,-5343.03,-1806.64,-52.2102,0.525945,'2054:0 2055:0 2089:0 '),\n(2088,'ThousandNeedlesC10',1,400,483,23,35,0,-5473.39,-1743.1,-18.0835,0.979516,'2055:0 2089:0 '),\n(2089,'ThousandNeedlesC11',1,400,483,23,35,0,-5533.01,-1878.93,-58.2063,1.19746,'2087:0 2088:0 2090:0 2092:0 '),\n(2090,'ThousandNeedlesC12',1,400,400,23,35,0,-5432.97,-2043.66,-64.7738,6.26721,'2086:0 2089:0 2091:0 '),\n(2091,'ThousandNeedlesC13',1,400,400,23,35,0,-5465.16,-2122.43,-60.3274,1.03645,'2090:0 2092:0 2095:0 '),\n(2092,'ThousandNeedlesC14',1,400,400,23,35,0,-5599.58,-2073.33,-64.8276,0.983438,'2089:0 2091:0 2093:0 '),\n(2093,'ThousandNeedlesC15',1,400,400,23,35,0,-5667.81,-2212.47,-58.1306,1.11303,'2092:0 2096:0 2106:0 '),\n(2094,'ThousandNeedlesC16',1,400,400,23,35,0,-5287.5,-2195.62,-54.0753,0.741926,'2084:0 2086:0 2095:0 2097:0 119:0 '),\n(2095,'ThousandNeedlesC17',1,400,400,23,35,0,-5426.32,-2213.81,-58.3051,6.2613,'2091:0 2094:0 2096:0 2097:0 '),\n(2096,'ThousandNeedlesC18',1,400,400,23,35,0,-5522.8,-2260.72,-59.6581,0.457222,'2093:0 2095:0 2098:0 '),\n(2097,'ThousandNeedlesC19',1,400,400,23,35,0,-5326.39,-2315.08,-42.353,1.99266,'2094:0 2095:0 2098:0 2110:0 '),\n(2098,'ThousandNeedlesC20',1,400,484,23,35,4,-5535.61,-2362.59,-50.5979,1.14639,'2096:0 2097:0 2099:0 2107:0 '),\n(2099,'ThousandNeedlesC21',1,400,484,23,35,4,-5649.75,-2375.72,2.56609,6.22399,'2098:0 2100:0 '),\n(2100,'ThousandNeedlesC22',1,400,484,23,35,4,-5656.57,-2454.18,0.642997,4.88096,'2099:0 2101:0 '),\n(2101,'ThousandNeedlesC23',1,400,484,23,35,4,-5604.75,-2490.4,30.4679,0.258887,'2100:0 2102:0 '),\n(2102,'ThousandNeedlesC24',1,400,484,23,35,4,-5527.14,-2463.43,30.6774,2.88172,'2101:0 2103:0 '),\n(2103,'ThousandNeedlesC25',1,400,484,23,35,4,-5474.04,-2382.59,57.2742,4.1305,'2102:0 2104:0 '),\n(2104,'ThousandNeedlesC26',1,400,484,23,35,4,-5424.92,-2272.98,82.5255,4.55855,'2103:0 41:0 '),\n(2105,'ThousandNeedlesC27',1,400,484,23,35,5,-5477.21,-2454.4,89.2838,1.45228,'41:0 '),\n(2106,'ThousandNeedlesC28',1,400,400,23,35,0,-5735.44,-2408.6,-53.3532,0.767009,'2093:0 2107:0 2108:0 '),\n(2107,'ThousandNeedlesC29',1,400,484,23,35,0,-5587.73,-2442.35,-50.4618,1.40318,'2098:0 2106:0 2109:0 '),\n(2108,'ThousandNeedlesC30',1,400,400,23,35,0,-5685.83,-2597.38,-56.0596,2.12378,'2106:0 2109:0 2119:0 '),\n(2109,'ThousandNeedlesC31',1,400,484,23,35,0,-5520.25,-2555.03,-56.5953,1.46797,'2107:0 2108:0 2111:0 2118:0 '),\n(2110,'ThousandNeedlesC32',1,400,484,23,35,0,-5309.22,-2432.88,-43.4182,2.04524,'2097:0 2111:0 2112:0 '),\n(2111,'ThousandNeedlesC33',1,400,400,23,35,4,-5357.57,-2551.14,-55.4342,1.46403,'2109:0 2110:0 2113:0 2115:0 '),\n(2112,'ThousandNeedlesC34',1,400,400,23,35,0,-5163.1,-2464.2,-52.5964,1.02224,'119:0 2110:0 2113:0 '),\n(2113,'ThousandNeedlesC35',1,400,400,23,35,0,-5168.45,-2584.79,-50.393,1.73498,'2111:0 2112:0 2114:0 '),\n(2114,'ThousandNeedlesC36',1,400,400,23,35,0,-5206.18,-2701.85,-49.9805,1.80567,'2113:0 2115:0 2116:0 '),\n(2115,'ThousandNeedlesC37',1,400,400,23,35,0,-5338.74,-2645.97,-45.5587,1.67019,'2111:0 2114:0 2117:0 '),\n(2116,'ThousandNeedlesC38',1,400,2303,23,35,0,-5338.36,-2841.96,-55.7141,1.17145,'2114:0 2117:0 2120:0 2123:0 '),\n(2117,'ThousandNeedlesC39',1,400,400,23,35,0,-5400.44,-2696.1,-41.6368,5.12985,'2115:0 2116:0 2118:0 '),\n(2118,'ThousandNeedlesC40',1,400,400,23,35,0,-5508.15,-2681.27,-49.789,6.27849,'2109:0 2117:0 2119:0 '),\n(2119,'ThousandNeedlesC41',1,400,400,23,35,0,-5557.86,-2761.38,-53.7029,2.24548,'2108:0 2118:0 2121:0 '),\n(2120,'ThousandNeedlesC42',1,400,2303,23,35,0,-5427.21,-2905.53,-56.1528,0.737522,'2116:0 2121:0 2122:0 '),\n(2121,'ThousandNeedlesC43',1,400,400,23,35,0,-5557.61,-2850.74,-55.2145,1.22644,'2119:0 2120:0 2124:0 '),\n(2122,'ThousandNeedlesC44',1,400,2303,23,35,0,-5449.75,-3008,-48.4049,1.26768,'2120:0 2123:0 2125:0 '),\n(2123,'ThousandNeedlesC45',1,400,2303,23,35,0,-5324.57,-3065.64,-49.0275,2.62249,'2116:0 2122:0 2127:0 '),\n(2124,'ThousandNeedlesC46',1,400,400,23,35,0,-5623.73,-2943.53,-50.4623,1.05563,'2121:0 2125:0 2126:0 '),\n(2125,'ThousandNeedlesC47',1,400,400,23,35,0,-5602.92,-3056.82,-51.9701,1.71732,'2122:0 2124:0 2126:0 2130:0 '),\n(2126,'ThousandNeedlesC48',1,400,400,23,35,0,-5718.6,-3126.82,-37.7719,1.04973,'2124:0 2125:0 2131:0 '),\n(2127,'ThousandNeedlesC49',1,400,400,23,35,0,-5328.41,-3207.34,-47.4244,5.04348,'2123:0 2128:0 2129:0 '),\n(2128,'ThousandNeedlesC50',1,400,400,23,35,0,-5464.87,-3276.04,-34.1317,0.525478,'2127:0 2129:0 2130:0 '),\n(2129,'ThousandNeedlesC51',1,400,400,23,35,0,-5455.25,-3387.53,-41.6009,1.22056,'2127:0 2128:0 2132:0 '),\n(2130,'ThousandNeedlesC52',1,400,400,23,35,0,-5569.49,-3268.7,-44.3082,1.72125,'2125:0 2128:0 2131:0 2133:0 '),\n(2131,'ThousandNeedlesC53',1,400,400,23,35,0,-5740.95,-3216.87,-41.218,1.17932,'2126:0 2130:0 121:0 '),\n(2132,'ThousandNeedlesC54',1,400,439,23,35,0,-5553.99,-3514.19,-56.2254,0.918174,'2129:0 2133:0 2134:0 '),\n(2133,'ThousandNeedlesC55',1,400,439,23,35,0,-5650.38,-3490.29,-57.2333,1.16557,'121:0 2130:0 2132:0 122:0 2134:0 '),\n(2134,'ThousandNeedlesE1',1,400,2240,23,35,0,-5619.93,-3820.34,-58.7494,1.7723,'121:0 122:0 2132:0 2133:0 2135:0 2136:0 '),\n(2135,'ThousandNeedlesE2',1,400,439,23,35,0,-5645.47,-4214.99,-58.7498,1.71339,'2134:0 2136:0 '),\n(2136,'ThousandNeedlesE3',1,400,2240,23,35,0,-5936.34,-4266.6,-58.7493,0.65899,'122:0 2134:0 2135:0 117:0 2137:0 '),\n(2137,'ThousandNeedlesE4',1,400,2240,23,35,0,-6405.27,-4240.86,-58.749,0.861231,'117:0 123:0 2136:0 '),\n(2138,'ThousandNeedlesE5',1,400,439,23,35,0,-6173.94,-3567.25,-58.7497,5.13183,'117:0 118:0 121:0 122:0 123:0 '),\n(2139,'ThousandNeedlesE6',1,400,439,23,35,0,-6638.63,-3654.02,-58.7493,0.631484,'118:0 2141:0 '),\n(2140,'ThousandNeedlesE7',1,400,439,23,35,0,-6660.6,-3797.14,-58.5293,2.97002,'123:0 2141:0 '),\n(2141,'ThousandNeedlesE8',1,400,439,23,35,0,-6820.59,-3759.56,21.2097,1.72713,'2139:0 2140:0 2142:0 '),\n(2142,'TanarisExitN1',1,440,440,38,50,0,-6890.93,-3772.75,52.9557,0.201496,'2141:0 2143:0 '),\n(2143,'TanarisExitN2',1,440,440,38,50,0,-6952.74,-3716.92,43.1345,3.42359,'2142:0 2144:0 2145:0 '),\n(2144,'GadgetzanH1',1,440,976,38,50,5,-7047.86,-3764.87,11.4018,3.75207,'2143:0 52:0 2147:0 2148:0 2149:0 2166:0 '),\n(2145,'GadgetzanA1',1,440,976,38,50,2,-7182.58,-3638.57,11.2417,5.95314,'2143:0 2146:0 2165:0 2166:0 '),\n(2146,'GadgetzanA2',1,440,976,38,50,3,-7232.4,-3740.53,8.47838,5.52708,'2145:0 52:0 2147:0 2148:0 2165:0 2166:0 '),\n(2147,'GadgetzanS',1,440,976,38,50,1,-7160.74,-3844,8.72832,1.31539,'52:0 2144:0 2146:0 '),\n(2148,'Tanaris1',1,440,440,38,50,0,-7236.3,-4040.94,11.0963,1.40179,'2144:0 2146:0 2149:0 2150:0 2158:0 2161:0 2165:0 '),\n(2149,'Tanaris2',1,440,1937,38,50,0,-7012.17,-4180.07,10.8027,2.40318,'2144:0 2148:0 2150:0 2151:0 2152:0 '),\n(2150,'Tanaris3',1,440,440,38,50,0,-7183.44,-4321.24,9.48149,1.28398,'2148:0 2149:0 2151:0 2152:0 2157:0 2158:0 '),\n(2151,'Tanaris4',1,440,1937,38,50,0,-6915.38,-4366.17,11.3936,2.18522,'2149:0 2150:0 2152:0 '),\n(2152,'Tanaris5',1,440,440,38,50,0,-7083.47,-4512.85,8.48356,1.53726,'2149:0 2150:0 2151:0 2153:0 2157:0 2158:0 '),\n(2153,'Tanaris6',1,440,977,38,50,0,-6965.03,-4691.43,8.43736,2.08705,'2152:0 2154:0 2155:0 2156:0 2157:0 '),\n(2154,'Tanaris7',1,440,977,38,50,0,-6745.21,-4852.73,0.167925,2.76838,'2153:0 2155:0 '),\n(2155,'Tanaris8',1,440,977,38,50,0,-6936.98,-4872.05,0.71439,1.89659,'2153:0 2154:0 2156:0 '),\n(2156,'Tanaris9',1,440,988,38,50,0,-7135.69,-4833.99,0.699453,1.36644,'2153:0 2155:0 2157:0 '),\n(2157,'Tanaris10',1,440,985,38,50,0,-7326.32,-4666.64,8.78219,0.194235,'2150:0 2152:0 2153:0 2156:0 2158:0 113:0 '),\n(2158,'Tanaris11',1,440,985,38,50,0,-7455.84,-4410.59,11.5646,0.58301,'2148:0 2150:0 2152:0 2157:0 113:0 2160:0 2161:0 '),\n(2159,'Tanaris12',1,440,988,40,50,0,-7777.85,-4943.31,6.30343,4.78293,'113:0 2160:0 2210:0 '),\n(2160,'Tanaris13',1,440,985,38,50,0,-7765.82,-4633.67,11.3435,5.2954,'113:0 2158:0 2159:0 2161:0 2162:0 '),\n(2161,'Tanaris14',1,440,1938,38,50,0,-7816.44,-4067.72,9.39531,5.57225,'2148:0 2158:0 2160:0 2162:0 2163:0 2164:0 2165:0 '),\n(2162,'Tanaris15',1,440,440,40,50,0,-8124.61,-4381.44,10.6814,6.10827,'2160:0 2161:0 2163:0 2206:0 '),\n(2163,'Tanaris16',1,440,440,40,50,0,-8211.49,-4018.52,10.2243,5.89032,'2161:0 2162:0 2164:0 2205:0 2209:0 '),\n(2164,'Tanaris17',1,440,1938,38,50,0,-7957.98,-3774.76,42.6206,4.73579,'2161:0 2163:0 2165:0 2173:0 '),\n(2165,'Tanaris18',1,440,440,38,50,0,-7532.17,-3671.41,9.08631,5.75681,'2145:0 2146:0 2148:0 2161:0 2164:0 2166:0 2172:0 2173:0 '),\n(2166,'Tanaris19',1,440,440,38,50,0,-7149.95,-3429.64,10.9479,4.73187,'2144:0 2145:0 2146:0 2165:0 2167:0 2170:0 2172:0 '),\n(2167,'Tanaris20',1,440,979,38,50,0,-6944.47,-3147.06,30.6034,1.0405,'2166:0 2168:0 2169:0 2170:0 '),\n(2168,'Tanaris21',1,440,978,38,50,0,-6847.43,-2908.93,8.88901,4.55712,'2167:0 2169:0 2170:0 '),\n(2169,'Tanaris22',1,440,979,38,50,0,-6994.4,-2790.52,8.87793,5.49763,'2167:0 2168:0 2170:0 2171:0 '),\n(2170,'Tanaris23',1,440,979,38,50,0,-7181.29,-3008.99,31.1598,2.12434,'2166:0 2167:0 2168:0 2169:0 2171:0 2172:0 '),\n(2171,'Tanaris24',1,440,982,40,50,0,-7405.37,-2656.15,12.3269,5.64056,'2169:0 2170:0 2172:0 2174:0 2175:0 '),\n(2172,'Tanaris25',1,440,979,38,50,0,-7432.96,-3165.88,11.6881,0.195781,'2165:0 2166:0 2170:0 2171:0 2173:0 2174:0 '),\n(2173,'Tanaris26',1,440,1939,38,50,0,-7856.78,-3289.98,68.7512,5.401,'2164:0 2165:0 2172:0 2174:0 2184:0 2187:0 '),\n(2174,'Tanaris27',1,440,982,40,50,0,-7689.14,-2835.54,14.0257,3.79487,'2171:0 2172:0 2173:0 2175:0 2179:0 2182:0 2184:0 '),\n(2175,'Tanaris28',1,440,982,44,55,0,-7757.78,-2516.52,8.85209,5.79567,'2171:0 2174:0 2176:0 2177:0 2178:0 2179:0 2183:0 '),\n(2176,'Tanaris29',1,440,982,38,50,0,-7885.89,-2645.63,-56.7571,1.76264,'2175:0 '),\n(2177,'Tanaris30',1,440,982,38,50,0,-7691.97,-2600,-56.5855,2.87594,'2175:0 '),\n(2178,'Tanaris31',1,440,982,38,50,0,-7867.56,-2503.34,-45.915,6.01951,'2175:0 '),\n(2179,'Tanaris32',1,440,982,44,55,0,-8024.98,-2496.1,4.7767,5.76032,'2174:0 2175:0 2180:0 2181:0 2182:0 '),\n(2180,'Tanaris33',1,440,982,38,50,0,-7961.12,-2608.77,-51.3402,2.94075,'2181:0 2179:0 '),\n(2181,'Tanaris34',1,440,982,38,50,0,-7948.03,-2388.48,-27.27,2.48522,'2180:0 2179:0 '),\n(2182,'Tanaris35',1,440,982,44,55,0,-8192.63,-2678.87,9.10516,6.208,'2174:0 2179:0 2183:0 2185:0 '),\n(2183,'Tanaris36',1,440,982,40,50,0,-8237.94,-2283.21,9.47101,5.21841,'2175:0 2182:0 2188:0 2189:0 2190:0 '),\n(2184,'Tanaris37',1,440,1939,40,50,0,-8080.23,-2940.32,41.1249,5.97434,'2173:0 2174:0 2185:0 2186:0 2187:0 '),\n(2185,'Tanaris38',1,440,983,40,50,0,-8463.57,-2772.2,16.342,6.04503,'2182:0 2184:0 2186:0 2187:0 2190:0 '),\n(2186,'Tanaris39',1,440,983,40,50,0,-8572.13,-2989.04,10.5515,0.775002,'2184:0 2185:0 2187:0 2190:0 2194:0 2196:0 '),\n(2187,'Tanaris40',1,440,983,40,50,0,-8349.72,-3161.78,10.5974,1.38762,'2173:0 2184:0 2185:0 2186:0 '),\n(2188,'Tanaris41',1,440,440,44,55,0,-8568.73,-2090.66,8.81721,5.96256,'2183:0 2189:0 2220:0 '),\n(2189,'Tanaris42',1,440,980,44,55,0,-8728.04,-2264.78,8.87691,0.109387,'2183:0 2188:0 2190:0 2191:0 2192:0 '),\n(2190,'Tanaris43',1,440,440,40,50,0,-8780.75,-2536.53,12.5632,1.2757,'2183:0 2185:0 2186:0 2189:0 2192:0 2194:0 '),\n(2191,'Tanaris44',1,440,980,44,55,0,-9113.86,-2138.28,14.5526,5.80156,'2189:0 2192:0 '),\n(2192,'Tanaris45',1,440,440,44,55,0,-9078.5,-2368.44,15.1243,6.03129,'2189:0 2190:0 2191:0 2193:0 2194:0 '),\n(2193,'Tanaris46',1,440,440,40,50,0,-9394.76,-2441.52,12.341,0.162396,'2192:0 114:0 2194:0 '),\n(2194,'Tanaris47',1,440,992,40,50,0,-9166,-2942.59,27.3153,4.4055,'114:0 2186:0 2190:0 2192:0 2193:0 2195:0 2196:0 '),\n(2195,'Tanaris48',1,440,992,40,50,0,-9259.98,-3213.55,17.6595,1.63894,'114:0 2194:0 2196:0 2197:0 2198:0 '),\n(2196,'Tanaris49',1,440,984,40,50,0,-8891.65,-3316.57,17.9459,2.09054,'2186:0 2194:0 2195:0 2197:0 2198:0 '),\n(2197,'Tanaris50',1,440,981,44,55,0,-8891.37,-3634.86,9.8928,2.97216,'2195:0 2196:0 2198:0 2199:0 2204:0 2205:0 '),\n(2198,'Tanaris51',1,440,440,40,50,0,-9376.51,-3525.65,10.4557,1.04009,'2195:0 2196:0 2197:0 2199:0 '),\n(2199,'Tanaris52',1,440,981,44,55,0,-9238.88,-3842.23,16.1398,6.21782,'2197:0 2198:0 2200:0 2201:0 2204:0 '),\n(2200,'Tanaris53',1,440,981,44,55,0,-9122.46,-4119.91,14.5657,1.92562,'2199:0 2202:0 2203:0 2204:0 '),\n(2201,'Tanaris54',1,440,981,38,50,0,-9448.09,-4056.48,-45.7265,1.70179,'2199:0 '),\n(2202,'Tanaris55',1,440,981,38,50,0,-9058.94,-4138.03,-30.5429,1.76658,'2200:0 '),\n(2203,'Tanaris56',1,440,981,38,50,0,-9239.16,-3990.68,-38.2526,5.54632,'2200:0 '),\n(2204,'Tanaris57',1,440,981,44,55,0,-8846.97,-4120.67,11.0961,2.09647,'2197:0 2199:0 2200:0 2205:0 2209:0 '),\n(2205,'Tanaris58',1,440,440,40,50,0,-8582.56,-3848.15,27.4666,3.85733,'2163:0 2197:0 2204:0 2209:0 '),\n(2206,'Tanaris59',1,440,440,40,50,0,-8436.38,-4485.59,9.98615,0.059917,'2162:0 2207:0 2209:0 '),\n(2207,'Tanaris60',1,440,1940,44,50,0,-8543.26,-4792.62,0.74885,2.08624,'2206:0 2208:0 2371:0 '),\n(2208,'Tanaris61',1,440,1940,44,50,0,-8731.47,-4651.05,6.22094,6.04857,'2207:0 2209:0 '),\n(2209,'Tanaris62',1,440,981,40,50,0,-8636.73,-4274.81,14.2733,1.53645,'2163:0 2204:0 2205:0 2206:0 2208:0 '),\n(2210,'Tanaris63',1,440,1336,40,50,0,-7834.45,-5044.24,4.58704,0.700017,'2159:0 2211:0 '),\n(2211,'Tanaris64',1,440,1336,40,50,0,-7869.58,-5185.77,0.738081,3.22506,'2210:0 2212:0 2213:0 2215:0 '),\n(2212,'Tanaris65',1,440,1336,40,50,0,-8043.72,-5139.25,11.1577,5.95236,'2211:0 '),\n(2213,'Tanaris66',1,440,1336,40,50,0,-7985.53,-5405.09,1.12058,1.11823,'2211:0 2214:0 2215:0 2216:0 '),\n(2214,'Tanaris67',1,440,1336,40,50,0,-7957.94,-5481.79,0.207866,2.5025,'2213:0 '),\n(2215,'Tanaris68',1,440,1336,40,50,0,-7979.86,-5272.84,0.574685,0.762833,'2211:0 2213:0 2216:0 2217:0 2218:0 2219:0 '),\n(2216,'Tanaris69',1,440,1336,40,50,0,-8057.83,-5349.53,19.8843,5.57338,'2213:0 2215:0 '),\n(2217,'Tanaris70',1,440,1336,40,50,0,-8101.51,-5296.31,2.11654,0.146278,'2215:0 '),\n(2218,'Tanaris71',1,440,1336,40,50,0,-8088.86,-5238.43,1.94444,6.18206,'2215:0 '),\n(2219,'Tanaris72',1,440,1336,40,50,0,-8005.83,-5204.31,4.73672,1.59535,'2215:0 '),\n(2220,'TanarisExitSW',1,440,440,44,55,0,-8243.03,-2079.74,-95.586,0.052021,'2188:0 2221:0 '),\n(2221,'Ungoro1',1,490,490,44,56,0,-8066.01,-2098.76,-168.295,6.18792,'2220:0 2222:0 '),\n(2222,'Ungoro2',1,490,490,44,56,0,-7916.41,-2142.07,-238.077,0.49967,'2221:0 2223:0 '),\n(2223,'Ungoro3',1,490,490,44,56,0,-7864.72,-2099.17,-266.094,3.40762,'2222:0 2224:0 2260:0 '),\n(2224,'Ungoro4',1,490,1942,44,56,0,-7934.33,-2040.71,-267.978,5.68527,'2223:0 2225:0 '),\n(2225,'Ungoro5',1,490,1942,44,56,0,-7884.5,-1843.96,-274.777,4.70158,'2224:0 2226:0 2260:0 2261:0 '),\n(2226,'Ungoro6',1,490,540,46,56,0,-8088.18,-1491.28,-269.655,5.9268,'2225:0 2227:0 2228:0 2261:0 '),\n(2227,'Ungoro7',1,490,490,46,56,0,-8249.65,-1584.9,-198.819,0.538974,'2226:0 2229:0 '),\n(2228,'Ungoro8',1,490,540,46,56,0,-8064.8,-1172.37,-270.687,4.96077,'2226:0 2229:0 2232:0 '),\n(2229,'Ungoro9',1,490,540,46,56,0,-7866.69,-1345.21,-274.102,2.63992,'2227:0 2228:0 2230:0 2231:0 2232:0 2261:0 2262:0 2265:0 '),\n(2230,'Ungoro10',1,490,490,46,56,0,-7978.25,-1085.08,-328.506,4.68783,'2229:0 '),\n(2231,'Ungoro11',1,490,540,46,56,0,-8110.2,-1212.13,-336.702,6.17813,'2229:0 '),\n(2232,'Ungoro12',1,490,539,48,56,0,-7862.94,-1011.26,-266.988,4.49344,'2228:0 2229:0 2233:0 2234:0 2262:0 '),\n(2233,'Ungoro13',1,490,539,48,56,0,-7893.05,-604.125,-260.044,4.74085,'2232:0 2234:0 2235:0 '),\n(2234,'Ungoro14',1,490,539,48,56,0,-7779.84,-752.864,-268.32,4.3658,'2232:0 2233:0 2235:0 2262:0 2263:0 '),\n(2235,'Ungoro15',1,490,543,48,56,0,-7516.02,-568.085,-272.224,3.45867,'2233:0 2234:0 2236:0 2240:0 2263:0 '),\n(2236,'Ungoro16',1,490,543,48,56,0,-7357.96,-423.47,-270.864,3.80227,'2235:0 2237:0 2238:0 '),\n(2237,'Ungoro17',1,490,543,48,56,0,-7453.5,-224.428,-202.131,5.11585,'2236:0 '),\n(2238,'Ungoro18',1,490,543,48,56,0,-7065.02,-412.024,-271.337,3.13271,'2236:0 2239:0 2240:0 '),\n(2239,'Ungoro19',1,490,490,48,56,0,-6942.78,-227.898,-200.477,4.11643,'2238:0 '),\n(2240,'Ungoro20',1,490,543,48,56,0,-7057.61,-568.049,-272.117,3.13074,'2235:0 2238:0 2241:0 2273:0 2275:0 '),\n(2241,'Ungoro21',1,490,490,46,56,0,-6819.88,-500.077,-273.734,4.04377,'2240:0 2242:0 2273:0 '),\n(2242,'Ungoro22',1,490,490,46,56,0,-6621.16,-628.631,-271.06,2.65557,'2241:0 2243:0 2273:0 2289:0 '),\n(2243,'Ungoro23',1,490,490,46,56,0,-6516.77,-714.125,-272.04,4.8802,'2242:0 2244:0 2271:0 '),\n(2244,'Ungoro24',1,490,538,46,56,0,-6357.05,-1044.55,-271.024,2.01939,'2243:0 2245:0 2247:0 '),\n(2245,'Ungoro25',1,490,541,46,56,0,-6247.33,-1096.9,-216.374,2.3198,'111:0 2244:0 2246:0 '),\n(2246,'Ungoro26',1,490,541,46,56,0,-6263.44,-1146.22,-245.676,0.70581,'111:0 2245:0 2247:0 '),\n(2247,'Ungoro27',1,490,538,46,56,0,-6307.92,-1177.22,-269.521,1.78377,'2244:0 2246:0 2248:0 '),\n(2248,'Ungoro28',1,490,538,46,56,0,-6416.8,-1325.76,-272.118,0.908046,'2247:0 2249:0 2270:0 2271:0 '),\n(2249,'Ungoro29',1,490,538,46,56,0,-6394.87,-1511.09,-269.907,1.76217,'2248:0 112:0 2251:0 2269:0 2270:0 2271:0 '),\n(2250,'Ungoro30',1,490,542,46,56,0,-6359.08,-1992.29,-276.383,1.21435,'112:0 '),\n(2251,'Ungoro31',1,490,538,46,56,0,-6575.48,-1808.43,-271.11,0.413242,'112:0 2249:0 2252:0 2253:0 2269:0 2270:0 '),\n(2252,'Ungoro32',1,490,490,46,56,0,-6527.29,-2027.48,-271.963,1.5501,'2251:0 2253:0 '),\n(2253,'Ungoro33',1,490,490,46,56,0,-6834.73,-2083.14,-267.953,0.248293,'2251:0 2252:0 2254:0 2267:0 2269:0 '),\n(2254,'Ungoro34',1,490,1942,46,56,0,-7068.84,-2256.36,-271.191,0.560497,'2253:0 2255:0 2256:0 2267:0 '),\n(2255,'Ungoro35',1,490,1943,46,56,0,-6944.44,-2436.79,-201.566,2.1097,'2254:0 '),\n(2256,'Ungoro36',1,490,1942,46,56,0,-7266.48,-2293,-268.44,0.00677204,'2254:0 2257:0 '),\n(2257,'Ungoro37',1,490,1942,44,56,0,-7476.48,-2263.22,-266.534,5.76177,'2256:0 2258:0 2259:0 '),\n(2258,'Ungoro38',1,490,1942,46,56,0,-7419.79,-2422.73,-214.477,1.54419,'2257:0 '),\n(2259,'Ungoro39',1,490,1942,44,56,0,-7613.45,-2129.98,-272.086,5.58506,'2257:0 2260:0 2266:0 '),\n(2260,'Ungoro40',1,490,1942,44,56,0,-7787.58,-1962.82,-272.166,5.62628,'2223:0 2225:0 2259:0 2261:0 2266:0 '),\n(2261,'Ungoro41',1,490,1942,46,56,0,-7685.24,-1654.69,-272.216,4.29698,'2225:0 2226:0 2229:0 2260:0 2265:0 2266:0 '),\n(2262,'Ungoro42',1,490,490,48,56,0,-7724.44,-1062.81,-269.408,1.8701,'2229:0 2232:0 2234:0 2263:0 2264:0 '),\n(2263,'Ungoro43',1,490,539,48,56,0,-7524.61,-811.974,-269.097,2.63781,'2234:0 2235:0 2262:0 2264:0 2276:0 '),\n(2264,'Ungoro44',1,490,490,46,56,0,-7536.49,-1136.09,-271.668,2.21958,'2262:0 2263:0 2265:0 2276:0 '),\n(2265,'Ungoro45',1,490,490,46,56,0,-7540.94,-1440.28,-272.37,1.75227,'2229:0 2261:0 2264:0 2268:0 '),\n(2266,'Ungoro46',1,490,1942,44,56,0,-7481.25,-1864.35,-272.185,3.61563,'2259:0 2260:0 2261:0 2267:0 '),\n(2267,'Ungoro47',1,490,1942,46,56,0,-7196.2,-1804.18,-272.191,4.61501,'2253:0 2254:0 2266:0 2268:0 '),\n(2268,'Ungoro48',1,490,537,46,56,0,-7052.38,-1597.57,-270.962,3.20599,'2265:0 2267:0 2269:0 2270:0 2272:0 2279:0 2280:0 '),\n(2269,'Ungoro49',1,490,538,46,56,0,-6864.28,-1691.91,-271.236,0.290198,'2249:0 2251:0 2253:0 2268:0 2270:0 '),\n(2270,'Ungoro50',1,490,538,46,56,0,-6742.71,-1481.45,-270.728,0.152749,'2248:0 2249:0 2251:0 2268:0 2269:0 2271:0 2272:0 '),\n(2271,'Ungoro51',1,490,538,46,56,0,-6687.22,-1202.84,-270.132,5.43062,'2243:0 2248:0 2249:0 2270:0 2272:0 2274:0 2275:0 '),\n(2272,'Ungoro52',1,490,537,48,56,0,-6971.9,-1359.19,-272.023,5.74869,'2268:0 2270:0 2271:0 2280:0 '),\n(2273,'Ungoro53',1,490,490,46,56,0,-6905.86,-744.591,-271.912,1.82168,'2240:0 2241:0 2242:0 2274:0 2275:0 '),\n(2274,'Ungoro54',1,490,490,46,56,0,-6713.26,-889.582,-269.981,2.47553,'2271:0 2273:0 2275:0 '),\n(2275,'Ungoro55',1,490,490,46,56,0,-7071.75,-971.188,-268.921,1.5625,'2240:0 2271:0 2273:0 2274:0 2276:0 '),\n(2276,'Ungoro56',1,490,537,48,56,0,-7262.04,-1142.55,-256.214,3.05082,'2263:0 2264:0 2275:0 2277:0 '),\n(2277,'Ungoro57',1,490,537,48,56,0,-7276.34,-1237.12,-242.301,0.11537,'2276:0 2278:0 2286:0 '),\n(2278,'Ungoro58',1,490,537,48,56,0,-7196.58,-1221.48,-206.377,2.70522,'2277:0 '),\n(2279,'Ungoro59',1,490,537,48,56,0,-7139.11,-1460.35,-240.441,5.44625,'2268:0 '),\n(2280,'Ungoro60',1,490,537,48,56,0,-6995.92,-1426.86,-263.362,1.61744,'2268:0 2272:0 2281:0 '),\n(2281,'Ungoro61',1,490,537,48,56,0,-7087.82,-1424.62,-235.604,0.254778,'2280:0 2282:0 '),\n(2282,'Ungoro62',1,490,537,48,56,0,-7094.67,-1371.27,-215.077,4.51555,'2281:0 2283:0 '),\n(2283,'Ungoro63',1,490,537,48,56,0,-7151.31,-1318.52,-184.389,0.761355,'2282:0 2284:0 2285:0 '),\n(2284,'Ungoro64',1,490,537,48,56,0,-7093.52,-1298.11,-185.557,3.52203,'2283:0 '),\n(2285,'Ungoro65',1,490,537,48,56,0,-7193.59,-1360.95,-184.286,6.25914,'2283:0 '),\n(2286,'Ungoro66',1,490,537,48,56,0,-7288.45,-1306.18,-240.621,1.48982,'2277:0 2287:0 '),\n(2287,'Ungoro67',1,490,537,48,56,0,-7220.03,-1431,-231.915,2.60313,'2286:0 2288:0 '),\n(2288,'Ungoro68',1,490,537,48,56,0,-7328.61,-1466.63,-241.155,0.211588,'2287:0 '),\n(2289,'Ungoro69',1,490,490,50,56,0,-6487.3,-527.418,-240.618,3.68697,'2242:0 2290:0 '),\n(2290,'Ungoro70',1,490,490,50,56,0,-6221.83,-588.48,-118.307,2.76414,'2289:0 2291:0 '),\n(2291,'Ungoro71',1,490,490,50,56,0,-6222.04,-471.141,-64.8223,4.41936,'2290:0 2292:0 '),\n(2292,'Silithus1',1,1377,1377,50,60,0,-6290.28,-372.309,-0.180207,5.29035,'2291:0 184:0 '),\n(2293,'Silithus2',1,1377,1377,50,60,0,-6723.42,16.99,1.33043,2.60703,'184:0 2294:0 2295:0 2296:0 '),\n(2294,'Silithus3',1,1377,2738,50,60,0,-7058.45,311.497,7.73577,5.31076,'2293:0 2295:0 2304:0 2350:0 2351:0 2352:0 2353:0 '),\n(2295,'Silithus4',1,1377,1377,50,60,0,-6775.62,325.939,7.96733,4.88272,'191:0 2293:0 2294:0 2296:0 2304:0 2350:0 '),\n(2296,'Silithus5',1,1377,1377,53,60,0,-6480.77,427.825,2.85797,3.86957,'191:0 2293:0 2295:0 2299:0 2304:0 2311:0 '),\n(2297,'Silithus6',1,1377,3446,53,60,0,-6249.14,4.14336,6.27956,4.62356,'191:0 2298:0 '),\n(2298,'Silithus7',1,1377,3446,53,60,0,-6303.03,23.7784,-8.51367,4.98288,'2297:0 '),\n(2299,'Silithus8',1,1377,1377,53,60,0,-6325.77,679.48,7.83164,4.56898,'191:0 2296:0 2300:0 2304:0 2311:0 '),\n(2300,'Silithus9',1,1377,2742,53,60,0,-6512.68,1140.49,5.52295,5.13838,'2299:0 2301:0 2311:0 2317:0 2322:0 2323:0 '),\n(2301,'Silithus10',1,1377,2742,53,60,0,-6376.67,1003.32,-29.6361,5.81971,'2300:0 2302:0 2303:0 '),\n(2302,'Silithus11',1,1377,2742,53,60,0,-6233.34,982.199,-44.8168,2.95104,'2301:0 2303:0 '),\n(2303,'Silithus12',1,1377,2742,53,60,0,-6264.39,1180.37,-17.4845,2.70757,'2301:0 2302:0 '),\n(2304,'Silithus13',1,1377,3425,50,60,0,-6806.63,645.151,14.4502,4.36084,'2294:0 2295:0 2296:0 2299:0 2305:0 2350:0 2351:0 '),\n(2305,'Silithus14',1,1377,3425,53,60,0,-6809.1,722.467,39.8123,2.17349,'2304:0 2306:0 188:0 '),\n(2306,'Silithus15',1,1377,3425,53,60,0,-6835.28,767.676,43.3803,5.14818,'2305:0 188:0 2307:0 2308:0 2309:0 2310:0 '),\n(2307,'Silithus16',1,1377,3425,53,60,5,-6754.01,823.51,57.2677,3.58719,'2306:0 '),\n(2308,'Silithus17',1,1377,3425,53,60,1,-6739.83,766.866,128.438,3.03271,'2306:0 '),\n(2309,'Silithus18',1,1377,3425,53,60,0,-6767.97,869.849,23.6798,5.43995,'2306:0 2310:0 2311:0 '),\n(2310,'Silithus19',1,1377,3425,53,60,0,-6882.21,862.037,35.6652,6.05845,'2306:0 2309:0 2323:0 '),\n(2311,'Silithus20',1,1377,2742,53,60,0,-6689.89,843.881,1.63418,4.68008,'2296:0 2299:0 2300:0 2309:0 2312:0 2313:0 '),\n(2312,'Silithus21',1,1377,2742,53,60,0,-6610.39,1133.65,-47.8484,4.53085,'2311:0 '),\n(2313,'Silithus22',1,1377,2742,53,60,0,-6560.42,848.396,-19.7968,5.5872,'2311:0 2314:0 2315:0 2316:0 '),\n(2314,'Silithus23',1,1377,2742,53,60,0,-6485.94,926.037,-42.1164,4.07923,'2313:0 '),\n(2315,'Silithus24',1,1377,2742,53,60,0,-6592.71,755.859,-52.6973,0.303426,'2313:0 '),\n(2316,'Silithus25',1,1377,2742,53,60,0,-6626.24,951.29,-53.3026,5.44387,'2313:0 '),\n(2317,'Silithus26',1,1377,2742,53,60,0,-6416.82,1332.7,1.61694,4.0223,'2300:0 2318:0 2322:0 '),\n(2318,'Silithus27',1,1377,2740,53,60,0,-6260.69,1633.49,6.1983,4.14011,'2317:0 2319:0 133:0 '),\n(2319,'Silithus28',1,1377,1377,53,60,0,-6412.61,1879.6,4.97151,5.48313,'2318:0 133:0 2320:0 134:0 '),\n(2320,'Silithus29',1,1377,1377,53,60,0,-6709.78,1906.69,5.58306,6.01956,'2319:0 2321:0 134:0 '),\n(2321,'Silithus30',1,1377,2743,53,60,0,-6952.45,1684.29,2.49135,0.649405,'2320:0 134:0 2322:0 2325:0 '),\n(2322,'Silithus31',1,1377,1377,53,60,0,-6798.69,1359.48,2.84112,2.99187,'134:0 189:0 2300:0 2317:0 2321:0 2325:0 '),\n(2323,'Silithus32',1,1377,1377,53,60,0,-6935.53,933.15,20.0826,5.50711,'177:0 189:0 2300:0 2310:0 2324:0 2351:0 '),\n(2324,'Silithus33',1,1377,1377,53,60,0,-7170.32,969.526,1.6856,0.846154,'177:0 189:0 2323:0 2335:0 2343:0 '),\n(2325,'Silithus34',1,1377,2743,55,60,0,-7102.06,1490.93,6.9342,0.374927,'189:0 2321:0 2322:0 2326:0 '),\n(2326,'Silithus35',1,1377,2743,55,60,0,-7227.39,1476.62,-3.4765,1.83774,'2325:0 2327:0 2335:0 2336:0 '),\n(2327,'Silithus36',1,1377,2743,55,60,0,-7304.89,1624.78,-30.4609,5.43684,'2326:0 2328:0 2329:0 2330:0 '),\n(2328,'Silithus37',1,1377,2743,55,60,0,-7466.84,1605.7,-50.256,4.1959,'2327:0 2331:0 '),\n(2329,'Silithus38',1,1377,2743,55,60,0,-7434.92,1813.75,-46.5685,5.83934,'2327:0 2332:0 '),\n(2330,'Silithus39',1,1377,2743,55,60,0,-7246.4,1714.88,-63.0024,4.43346,'2327:0 2333:0 2334:0 '),\n(2331,'Silithus40',1,1377,1377,53,60,0,-7396.76,1242.93,-84.3036,3.00401,'2328:0 '),\n(2332,'Silithus41',1,1377,2743,53,60,0,-7611.96,1707.51,-36.9118,0.00770472,'2329:0 '),\n(2333,'Silithus42',1,1377,2743,53,60,0,-7390.74,1717.46,-92.9352,5.54673,'2330:0 '),\n(2334,'Silithus43',1,1377,2743,53,60,0,-7320.18,1835.39,-90.5829,0.977671,'2330:0 '),\n(2335,'Silithus44',1,1377,1377,53,60,0,-7395.86,1200.83,3.1343,6.21237,'177:0 189:0 2324:0 2326:0 2336:0 2341:0 2342:0 2343:0 '),\n(2336,'Silithus45',1,1377,2743,53,60,0,-7467.85,1375.97,4.32407,0.317961,'2326:0 2335:0 135:0 2337:0 2341:0 2342:0 '),\n(2337,'Silithus46',1,1377,1377,53,60,0,-7741.83,1415.69,0.628408,1.87894,'135:0 2336:0 2338:0 2339:0 2340:0 '),\n(2338,'Silithus47',1,1377,1377,53,60,0,-7929.26,1491.4,-6.62955,0.141247,'135:0 2337:0 2339:0 '),\n(2339,'Silithus48',1,1377,1377,53,60,0,-7951.61,1381.21,2.92482,0.094128,'193:0 2337:0 2338:0 2340:0 '),\n(2340,'Silithus49',1,1377,1377,53,60,0,-7884.95,1305.55,-9.32275,1.92018,'193:0 2337:0 2339:0 2341:0 '),\n(2341,'Silithus50',1,1377,1377,53,60,0,-7724.06,1121.13,1.90701,2.14991,'193:0 2335:0 2336:0 2340:0 2342:0 2347:0 '),\n(2342,'Silithus51',1,1377,1377,53,60,0,-7614.56,1040.35,4.34335,2.37375,'2335:0 2336:0 2341:0 2343:0 2347:0 2348:0 '),\n(2343,'Silithus52',1,1377,1377,53,60,0,-7446.46,1011.04,1.56245,2.60898,'177:0 2324:0 2335:0 2342:0 2348:0 '),\n(2344,'Silithus53',1,1377,3427,53,60,0,-8071.74,1080.25,7.69378,0.464863,'193:0 2345:0 '),\n(2345,'Silithus54',1,1377,1377,55,60,0,-8049.18,988.938,42.0219,2.43622,'2344:0 '),\n(2346,'Silithus55',1,1377,2744,55,60,0,-8023.11,662.371,-12.5444,1.51572,'193:0 2359:0 '),\n(2347,'Silithus56',1,1377,2744,53,60,0,-7855.36,863.831,-4.99768,1.56248,'193:0 2341:0 2342:0 2348:0 '),\n(2348,'Silithus57',1,1377,1377,53,60,0,-7512.58,878.283,-2.19269,1.08534,'177:0 2342:0 2343:0 2347:0 2349:0 2350:0 '),\n(2349,'Silithus58',1,1377,1377,53,60,0,-7412.18,577.662,-7.35207,4.30862,'177:0 2348:0 2355:0 2357:0 192:0 2359:0 '),\n(2350,'Silithus59',1,1377,1377,53,60,0,-7177.07,574.409,1.58818,2.04744,'177:0 2294:0 2295:0 2304:0 2348:0 2351:0 2352:0 2355:0 '),\n(2351,'Silithus60',1,1377,3097,53,60,0,-6922.48,666.906,11.4539,0.176223,'2294:0 2304:0 2323:0 2350:0 '),\n(2352,'Silithus61',1,1377,2738,50,60,0,-7078.09,417.604,8.20627,4.43703,'2294:0 2350:0 2353:0 '),\n(2353,'Silithus62',1,1377,2738,50,60,0,-7146.41,350.222,26.2951,0.0509645,'2294:0 2352:0 2354:0 2356:0 '),\n(2354,'Silithus63',1,1377,2738,50,60,0,-7259.78,328.568,47.9494,0.00187492,'2353:0 2356:0 2357:0 '),\n(2355,'Silithus64',1,1377,2738,50,60,0,-7283.42,473.511,11.4843,5.52991,'2349:0 2350:0 2356:0 2357:0 '),\n(2356,'Silithus65',1,1377,2738,50,60,0,-7183.12,437.593,64.3972,4.38322,'2353:0 2354:0 2355:0 '),\n(2357,'Silithus66',1,1377,2738,50,60,0,-7342.29,338.615,9.9245,1.29662,'2349:0 2354:0 2355:0 192:0 '),\n(2358,'Silithus67',1,1377,2744,53,60,0,-7815.08,208.412,5.58908,6.15627,'192:0 '),\n(2359,'Silithus68',1,1377,2744,55,60,0,-7734.1,629.157,-47.1739,6.08166,'2349:0 2360:0 2361:0 2346:0 '),\n(2360,'Silithus69',1,1377,2744,55,60,0,-7803.61,427.995,-36.2971,1.11402,'2359:0 2361:0 2362:0 '),\n(2361,'Silithus70',1,1377,2744,55,60,0,-7937.51,488.881,-34.8964,5.632,'2359:0 2360:0 2365:0 2366:0 '),\n(2362,'Silithus71',1,1377,2744,55,60,0,-7860.7,346.797,-48.3413,1.79141,'2360:0 2363:0 2364:0 '),\n(2363,'Silithus72',1,1377,2744,53,60,0,-7708.29,262.213,-42.7965,5.31941,'2362:0 '),\n(2364,'Silithus73',1,1377,2744,53,60,0,-7678.37,284.795,-37.2732,5.97131,'2362:0 '),\n(2365,'Silithus74',1,1377,1377,53,60,0,-8294.16,376.133,-94.7165,0.44759,'2361:0 '),\n(2366,'Silithus75',1,1377,2744,53,60,0,-8140.13,753.793,-85.1582,5.97285,'2361:0 2367:0 '),\n(2367,'Silithus76',1,1377,1377,53,60,0,-8313.26,729.325,-74.3037,4.85955,'2366:0 '),\n(2368,'AltarOfStorms2',0,46,255,48,56,1,-7605.65,-798.145,190.852,3.45765,'635:0 '),\n(2369,'Darrowshire',0,139,2262,53,60,1,1416.41,-3653.3,82.0183,4.38389,'230:0 '),\n(2370,'BLS4H',0,4,72,43,54,5,-11896.1,-3084.13,31.0889,0.713907,'855:0 '),\n(2371,'TanarisSpawnAll',1,440,1940,44,50,1,-8319.94,-5071.72,4.11589,2.25351,'2207:0 ');\n"
  },
  {
    "path": "AC/SQL/updates/world/2023_04_11_00_creature_template_npcbot_wander_nodes.sql",
    "content": "--\nDELETE FROM `creature_template_npcbot_wander_nodes` WHERE `id` IN (2372,2373,2374,2375,2376,2377,2378,2379,2380,2381,2382,2383,2384,2385,2386,2387,2388,2389,2390,2391,2392,2393,2394,2395);\nINSERT INTO `creature_template_npcbot_wander_nodes`(`id`,`name`,`mapid`,`zoneid`,`areaid`,`minlevel`,`maxlevel`,`flags`,`x`,`y`,`z`,`o`,`links`) VALUES\n(2372,'WarsongGulchSpawnA1',489,3277,4571,10,80,59,1523.81,1481.76,351.992,3.14159,'2373:0 2375:0 2378:0 2377:0 '),\n(2373,'WarsongGulchAInside1',489,3277,3321,10,80,0,1488.03,1463.62,362.472,1.46358,'2372:0 2374:0 2379:0 '),\n(2374,'WarsongGulchAInside2',489,3277,4571,10,80,32,1530.85,1468.31,362.665,3.14825,'2372:0 2373:0 '),\n(2375,'WarsongGulchAInside3',489,3277,3321,10,80,0,1471.13,1454.77,342.795,6.27608,'2372:0 2376:0 2380:0 '),\n(2376,'WarsongGulchAInside4',489,3277,3321,10,80,32,1523.32,1468.01,373.688,4.44809,'2374:0 2375:0 '),\n(2377,'WarsongGulchAInside5',489,3277,3321,10,80,0,1439.11,1574.68,343.587,5.09406,'2381:0 2383:0 2372:0 '),\n(2378,'WarsongGulchAInside6',489,3277,3321,10,80,0,1416.56,1540.82,342.735,5.58886,'2381:0 2383:0 2372:0 '),\n(2379,'WarsongGulchAInside7',489,3277,3321,10,80,0,1360.6,1392.13,326.593,5.39054,'2381:0 2382:0 2373:0 '),\n(2380,'WarsongGulchAInside8',489,3277,3321,10,80,0,1356.9,1461.83,324.512,0.0216269,'2381:0 2382:0 2383:0 2375:0 '),\n(2381,'WarsongGulchMidC1',489,3277,3277,10,80,2,1231.42,1473.79,307.813,5.82692,'2391:0 2392:0 '),\n(2382,'WarsongGulchMidE1',489,3277,3277,10,80,2,1225.27,1411.04,310.329,0.0703331,'2391:0 2392:0 '),\n(2383,'WarsongGulchMidW1',489,3277,3277,10,80,2,1195.67,1530.47,306.785,6.16029,'2391:0 2392:0 '),\n(2384,'WarsongGulchSpawnH1',489,3277,4572,10,80,61,929.191,1434.63,345.536,0.0577507,'2385:0 2387:0 2390:0 2389:0 '),\n(2385,'WarsongGulchHInside1',489,3277,3320,10,80,0,965.729,1453.27,356.269,4.75445,'2384:0 2391:0 2386:0 '),\n(2386,'WarsongGulchHInside2',489,3277,4572,10,80,32,925.907,1451.62,355.856,5.79629,'2384:0 2385:0 '),\n(2387,'WarsongGulchHInside3',489,3277,3320,10,80,0,982.314,1463.02,335.964,1.72006,'2384:0 2392:0 2388:0 '),\n(2388,'WarsongGulchHInside4',489,3277,3320,10,80,32,931.381,1448.91,367.604,1.1742,'2386:0 2387:0 '),\n(2389,'WarsongGulchHInside5',489,3277,3320,10,80,0,1033.59,1363.21,342.852,2.24035,'2394:0 2395:0 2384:0 '),\n(2390,'WarsongGulchHInside6',489,3277,3320,10,80,0,1060.56,1390.51,338.618,2.82356,'2394:0 2395:0 2384:0 '),\n(2391,'WarsongGulchHInside7',489,3277,3320,10,80,0,1086.1,1540.21,316.792,2.79013,'2393:0 2394:0 2385:0 '),\n(2392,'WarsongGulchHInside8',489,3277,3320,10,80,0,1119.21,1462.5,316.34,3.25941,'2393:0 2394:0 2395:0 2387:0 '),\n(2393,'WarsongGulchMidW2',489,3277,3277,10,80,4,1255.33,1511.56,309.973,3.31243,'2379:0 2380:0 '),\n(2394,'WarsongGulchMidC2',489,3277,3277,10,80,4,1217.19,1480.7,306.432,3.41258,'2379:0 2380:0 '),\n(2395,'WarsongGulchMidE2',489,3277,3277,10,80,4,1263.56,1400.5,310.369,3.07681,'2379:0 2380:0 ');\n"
  },
  {
    "path": "AC/SQL/updates/world/2023_04_16_00_creature_template_npcbot_wander_nodes.sql",
    "content": "--\nDELETE FROM `creature_template_npcbot_wander_nodes` WHERE `id` IN (2372,2373,2374,2375,2376,2377,2378,2379,2380,2381,2382,2383,2384,2385,2386,2387,2388,2389,2390,2391,2392,2393,2394,2395);\nINSERT INTO `creature_template_npcbot_wander_nodes`(`id`,`name`,`mapid`,`zoneid`,`areaid`,`minlevel`,`maxlevel`,`flags`,`x`,`y`,`z`,`o`,`links`) VALUES\n(2372,'WarsongGulchSpawnA1',489,3277,4571,10,80,251,1535.77,1481.37,352.109,0.188495,'2373:0 2375:0 2378:0 2377:0 '),\n(2373,'WarsongGulchAInside1',489,3277,3321,10,80,0,1488.03,1463.62,362.472,1.46358,'2372:0 2374:0 2379:0 '),\n(2374,'WarsongGulchAInside2',489,3277,4571,10,80,32,1530.85,1468.31,362.665,3.14825,'2372:0 2373:0 '),\n(2375,'WarsongGulchAInside3',489,3277,3321,10,80,0,1471.13,1454.77,342.795,6.27608,'2372:0 2376:0 2380:0 '),\n(2376,'WarsongGulchAInside4',489,3277,3321,10,80,32,1523.32,1468.01,373.688,4.44809,'2374:0 2375:0 '),\n(2377,'WarsongGulchAInside5',489,3277,3321,10,80,0,1439.11,1574.68,343.587,5.09406,'2381:0 2383:0 2372:0 '),\n(2378,'WarsongGulchAInside6',489,3277,3321,10,80,0,1416.56,1540.82,342.735,5.58886,'2381:0 2383:0 2372:0 '),\n(2379,'WarsongGulchAInside7',489,3277,3321,10,80,0,1360.6,1392.13,326.593,5.39054,'2381:0 2382:0 2373:0 '),\n(2380,'WarsongGulchAInside8',489,3277,3321,10,80,0,1356.9,1461.83,324.512,0.0216269,'2381:0 2382:0 2383:0 2375:0 '),\n(2381,'WarsongGulchMidC1',489,3277,3277,10,80,0,1231.42,1473.79,307.813,5.82692,'2391:0 2392:0 '),\n(2382,'WarsongGulchMidE1',489,3277,3277,10,80,0,1225.27,1411.04,310.329,0.0703331,'2391:0 2392:0 '),\n(2383,'WarsongGulchMidW1',489,3277,3277,10,80,0,1195.67,1530.47,306.785,6.16029,'2391:0 2392:0 '),\n(2384,'WarsongGulchSpawnH1',489,3277,4572,10,80,253,919.418,1434.62,345.695,3.13216,'2385:0 2387:0 2390:0 2389:0 '),\n(2385,'WarsongGulchHInside1',489,3277,3320,10,80,0,965.729,1453.27,356.269,4.75445,'2384:0 2391:0 2386:0 '),\n(2386,'WarsongGulchHInside2',489,3277,4572,10,80,32,925.907,1451.62,355.856,5.79629,'2384:0 2385:0 '),\n(2387,'WarsongGulchHInside3',489,3277,3320,10,80,0,982.314,1463.02,335.964,1.72006,'2384:0 2392:0 2388:0 '),\n(2388,'WarsongGulchHInside4',489,3277,3320,10,80,32,931.381,1448.91,367.604,1.1742,'2386:0 2387:0 '),\n(2389,'WarsongGulchHInside5',489,3277,3320,10,80,0,1033.59,1363.21,342.852,2.24035,'2394:0 2395:0 2384:0 '),\n(2390,'WarsongGulchHInside6',489,3277,3320,10,80,0,1060.56,1390.51,338.618,2.82356,'2394:0 2395:0 2384:0 '),\n(2391,'WarsongGulchHInside7',489,3277,3320,10,80,0,1086.1,1540.21,316.792,2.79013,'2393:0 2394:0 2385:0 '),\n(2392,'WarsongGulchHInside8',489,3277,3320,10,80,0,1119.21,1462.5,316.34,3.25941,'2393:0 2394:0 2395:0 2387:0 '),\n(2393,'WarsongGulchMidW2',489,3277,3277,10,80,0,1255.33,1511.56,309.973,3.31243,'2379:0 2380:0 '),\n(2394,'WarsongGulchMidC2',489,3277,3277,10,80,0,1217.19,1480.7,306.432,3.41258,'2379:0 2380:0 '),\n(2395,'WarsongGulchMidE2',489,3277,3277,10,80,0,1263.56,1400.5,310.369,3.07681,'2379:0 2380:0 ');\n"
  },
  {
    "path": "AC/SQL/updates/world/2023_04_18_00_creature_template_npcbot_appearance.sql",
    "content": "--\nDELETE FROM `creature_template_npcbot_appearance` WHERE (`entry`='70266');\n"
  },
  {
    "path": "AC/SQL/updates/world/2023_04_22_00_creature_template_npcbot_wander_nodes.sql",
    "content": "--\nDELETE FROM `creature_template_npcbot_wander_nodes` WHERE `id` IN (2396,2397,2398,2399,2400,2401,2402,2403,2404,2405,2406,2407,2408,2409,2410,2411,2412,2413,2414,2415,2416,2417,2418,2419,2420,2421,2422,2423,2424,2425,2426,2427,2428,2429,2430,2431,2432,2433,2434,2435,2436);\nINSERT INTO `creature_template_npcbot_wander_nodes`(`id`,`name`,`mapid`,`zoneid`,`areaid`,`minlevel`,`maxlevel`,`flags`,`x`,`y`,`z`,`o`,`links`) VALUES\n(2396,'ArathiBasinSpawnA',529,3358,3417,20,80,3,1313.9,1310.74,-9.01043,3.83874,'2397:0 '),\n(2397,'ArathiBasinStartA',529,3358,3358,20,80,0,1241.32,1228.52,-40.2271,4.12149,'2411:0 2398:0 '),\n(2398,'ArathiBasinStables',529,3358,3424,20,80,128,1168.45,1204.15,-56.582,6.24992,'2397:0 2399:0 '),\n(2399,'ArathiBasinStablesBridge',529,3358,3358,20,80,0,1089.36,1231.75,-51.8785,4.23379,'2400:0 2398:0 2403:0 '),\n(2400,'ArathiBasinMillLow1',529,3358,3358,20,80,0,988.277,1179.75,-50.2717,5.04236,'2399:0 2401:0 2416:0 '),\n(2401,'ArathiBasinMillLow2',529,3358,3358,20,80,0,890.451,1109.94,-56.335,4.04097,'2400:0 2402:0 '),\n(2402,'ArathiBasinMillLow3',529,3358,3358,20,80,0,845.513,978.663,-60.2139,0.977914,'2401:0 2408:0 2415:0 '),\n(2403,'ArathiBasinMillUp1',529,3358,3358,20,80,0,939.139,1227.33,-23.8137,3.6404,'2399:0 2404:0 '),\n(2404,'ArathiBasinMill',529,3358,3422,20,80,136,852.619,1151.8,11.5342,0.752077,'2405:0 2403:0 '),\n(2405,'ArathiBasinMillUp2',529,3358,3422,20,80,0,783.565,1047.78,-26.1072,1.57478,'2404:0 2408:0 '),\n(2406,'ArathiBasinSpawnH',529,3358,3418,20,80,5,684.071,681.281,-12.9148,0.836507,'2407:0 '),\n(2407,'ArathiBasinStartH',529,3358,3358,20,80,0,748.646,759.099,-41.5104,0.818832,'2409:0 2408:0 '),\n(2408,'ArathiBasinFarm',529,3358,3420,20,80,128,809.5,872.547,-56.7509,1.20759,'2405:0 2407:0 2402:0 '),\n(2409,'ArathiBasinFarmBridge',529,3358,3420,20,80,0,864.499,771.902,-51.7236,0.695112,'2407:0 2410:0 '),\n(2410,'ArathiBasinMineForkSE',529,3358,3358,20,80,0,956.739,804.522,-61.6094,0.524283,'2409:0 2412:0 2414:0 '),\n(2411,'ArathiBasinMineForkNW',529,3358,3358,20,80,0,1221.3,1088.37,-59.7666,4.47091,'2412:0 2397:0 2413:0 '),\n(2412,'ArathiBasinMine',529,3358,3423,20,80,136,1151.72,846.381,-110.525,2.55257,'2411:0 2410:0 '),\n(2413,'ArathiBasinMineUp1',529,3358,3358,20,80,0,1156.61,991.63,-63.6154,2.3307,'2411:0 2414:0 2416:0 '),\n(2414,'ArathiBasinMineUp2',529,3358,3358,20,80,0,1040.93,882.871,-61.8051,2.33458,'2410:0 2415:0 2413:0 '),\n(2415,'ArathiBasinBlacksmithForkS',529,3358,3421,20,80,0,922.673,999.161,-55.5623,5.49188,'2402:0 2414:0 2417:0 2416:0 '),\n(2416,'ArathiBasinBlacksmithForkN',529,3358,3421,20,80,0,1050.68,999.89,-50.4064,5.62341,'2400:0 2413:0 2415:0 2417:0 '),\n(2417,'ArathiBasinBlacksmith',529,3358,3421,20,80,136,979.258,1043.34,-44.3749,0.106003,'2415:0 2416:0 ');\n"
  },
  {
    "path": "AC/SQL/updates/world/2023_04_28_00_creature_template.sql",
    "content": "--\nUPDATE `creature_template` SET `flags_extra` = (`flags_extra` | 0x02000000) WHERE (`flags_extra` & 0x0A000000) = 0x08000000 AND `entry` > 70000;\nUPDATE `creature_template` SET `flags_extra` = (`flags_extra` | 0x0A000000) WHERE (`flags_extra` & 0x0E000000) = 0x04000000 AND `entry` > 70000;\n"
  },
  {
    "path": "AC/SQL/updates/world/2023_05_14_00_creature_template_npcbot_wander_nodes.sql",
    "content": "--\nUPDATE `creature_template_npcbot_wander_nodes` SET `minlevel`='23',`flags`='1' WHERE (`id`='753');\n"
  },
  {
    "path": "AC/SQL/updates/world/2023_05_16_00_npc_text.sql",
    "content": "--\nSET @BOT_START = 70661;\nSET @BOT_END   = 70666;\n\nDELETE FROM `npc_text` WHERE `ID` BETWEEN @BOT_START AND @BOT_END;\n\nINSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n(@BOT_START+0, \"Bot gear bank...\", -1),\n(@BOT_START+1, \"Deposit items...\", -1),\n(@BOT_START+2, \"Withdraw items...\", -1),\n(@BOT_START+3, \"Bank is empty\", -1),\n(@BOT_START+4, \"Previous page\", -1),\n(@BOT_START+5, \"Next page\", -1);\n"
  },
  {
    "path": "AC/SQL/updates/world/2023_05_20_00_creature_template.sql",
    "content": "--\nSET @BOT_START = 70587;\nSET @BOT_END   = 70595;\n\nINSERT IGNORE INTO `creature_template`\n(`entry`,`difficulty_entry_1`,`difficulty_entry_2`,`difficulty_entry_3`,`KillCredit1`,`KillCredit2`,\n`name`,`subname`,`IconName`,`gossip_menu_id`,`minlevel`,`maxlevel`,`exp`,\n`faction`,`npcflag`,`speed_walk`,`speed_run`,`scale`,`rank`,`dmgschool`,`BaseAttackTime`,`RangeAttackTime`,\n`BaseVariance`,`RangeVariance`,`unit_class`,`unit_flags`,`unit_flags2`,`dynamicflags`,`family`,`type`,`type_flags`,`lootid`,\n`pickpocketloot`,`skinloot`,`PetSpellDataId`,`VehicleId`,`mingold`,`maxgold`,`AIName`,`MovementType`,\n`HoverHeight`,`HealthModifier`,`ManaModifier`,`ArmorModifier`,`DamageModifier`,`ExperienceModifier`,`RacialLeader`,`movementId`,\n`RegenHealth`,`mechanic_immune_mask`,`spell_school_immune_mask`,`flags_extra`,`ScriptName`,`VerifiedBuild`)\nVALUES\n('70587','0','0','0','0','0','Tuten\\'arak','Crypt Lord Bot','','0','83','83','2','35','1','1.1','1.1','0.5','2','0','1900','1900','1','1','1','0','32','0','0','6','4096','0','0','0','0','0','0','0','','0','1','1','1','1','1','1','0','0','0','0','0','235929712','crypt_lord_bot','-1'),\n('70588','0','0','0','0','0','Anubiros','Crypt Lord Bot','','0','83','83','2','35','1','1.1','1.1','0.5','2','0','1900','1900','1','1','1','0','32','0','0','6','4096','0','0','0','0','0','0','0','','0','1','1','1','1','1','1','0','0','0','0','0','235929712','crypt_lord_bot','-1'),\n('70589','0','0','0','0','0','Nephri\\'thos','Crypt Lord Bot','','0','83','83','2','35','1','1.1','1.1','0.5','2','0','1900','1900','1','1','1','0','32','0','0','6','4096','0','0','0','0','0','0','0','','0','1','1','1','1','1','1','0','0','0','0','0','235929712','crypt_lord_bot','-1'),\n('70590','0','0','0','0','0','Arak-arahm','Crypt Lord Bot','','0','83','83','2','35','1','1.1','1.1','0.5','2','0','1900','1900','1','1','1','0','32','0','0','6','4096','0','0','0','0','0','0','0','','0','1','1','1','1','1','1','0','0','0','0','0','235929712','crypt_lord_bot','-1'),\n('70591','0','0','0','0','0','Horus\\'aman','Crypt Lord Bot','','0','83','83','2','35','1','1.1','1.1','0.5','2','0','1900','1900','1','1','1','0','32','0','0','6','4096','0','0','0','0','0','0','0','','0','1','1','1','1','1','1','0','0','0','0','0','235929712','crypt_lord_bot','-1'),\n('70592','0','0','0','0','0','Carrion Beetle','','','0','83','83','2','35','0','1.05','1.05','0.5','0','0','1500','1500','1','1','1','0','0','0','0','6','4096','0','0','0','0','0','0','0','','0','1','1','1','1','1','1','0','0','0','0','0','168820832','crypt_lord_pet_bot','-1'),\n('70593','0','0','0','0','0','Carrion Beetle','','','0','83','83','2','35','0','1.05','1.05','0.7','0','0','1500','1500','1','1','1','0','0','0','0','6','4096','0','0','0','0','0','0','0','','0','1','1','1','1','1','1','0','0','0','0','0','168820832','crypt_lord_pet_bot','-1'),\n('70594','0','0','0','0','0','Carrion Beetle','','','0','83','83','2','35','0','1.05','1.05','0.9','0','0','1500','1500','1','1','1','0','0','0','0','6','4096','0','0','0','0','0','0','0','','0','1','1','1','1','1','1','0','0','0','0','0','168820832','crypt_lord_pet_bot','-1'),\n('70595','0','0','0','0','0','Locust','','','0','83','83','2','35','0','1.4','1.4','0.25','1','0','1200','1200','1','1','1','33554432','0','0','0','6','4096','0','0','0','0','0','0','0','','0','2','1','1','1','1','1','0','0','0','0','0','704782368','crypt_lord_pet_bot','-1');\n"
  },
  {
    "path": "AC/SQL/updates/world/2023_05_20_01_creature_equip_template.sql",
    "content": "--\nSET @BOT_START = 70587;\nSET @BOT_END   = 70591;\n\nDELETE FROM `creature_equip_template` WHERE `CreatureID` BETWEEN @BOT_START AND @BOT_END;\nINSERT INTO `creature_equip_template`\n(`CreatureID`,`ID`,`VerifiedBuild`)\nVALUES\n('70587','1','-1'),\n('70588','1','-1'),\n('70589','1','-1'),\n('70590','1','-1'),\n('70591','1','-1');\n"
  },
  {
    "path": "AC/SQL/updates/world/2023_05_20_02_creature_template_npcbot_extras.sql",
    "content": "--\nSET @BOT_START = 70587;\nSET @BOT_END   = 70595;\n\nDELETE FROM `creature_template_npcbot_extras` WHERE `entry` BETWEEN @BOT_START AND @BOT_END;\nINSERT INTO `creature_template_npcbot_extras` (`entry`,`class`,`race`) VALUES\n('70587', '20', '15'),\n('70588', '20', '15'),\n('70589', '20', '15'),\n('70590', '20', '15'),\n('70591', '20', '15'),\n('70592', '0', '15'),\n('70593', '0', '15'),\n('70594', '0', '15'),\n('70595', '0', '15');\n"
  },
  {
    "path": "AC/SQL/updates/world/2023_05_20_03_npc_text.sql",
    "content": "--\nSET @LOCALIZED_STRINGS_START = 70012;\nSET @LOCALIZED_STRINGS_END   = 70013;\n\nDELETE FROM `npc_text` WHERE ID BETWEEN @LOCALIZED_STRINGS_START and @LOCALIZED_STRINGS_END;\nINSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n(70012,'<Battle-scarred Crypt Lord stands before you, he is obviously uncontrolled. Without master this mighty undead nerubian lord has lost most of his power>$B$BWhat will it be, tiny creature? Your flesh will do like any other...','-1'),\n(70013,'I consume the living and the dead.','-1');\n\nSET @LOCALIZED_STRINGS_START = 70109;\nSET @LOCALIZED_STRINGS_END   = 70109;\n\nDELETE FROM `npc_text` WHERE ID BETWEEN @LOCALIZED_STRINGS_START and @LOCALIZED_STRINGS_END;\nINSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n(70109,'|cff9900ccCrypt Lord|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\\\"Ancient behemoth, once one of the kings of Azjol-Nerub, now an undead monster within ranks of Lich King\\'s mightiest warriors\\\".$B$BVery high armor, increased resistances, partially immune to control effects, immune to poison-based effects, mail/plate armor, deals melee/spellshadow damage, spell power bonus: 200% strength. Main attribute: Strength.$B$BImpale. Crypt Lord slams the ground with his massive claws, shooting spikes out in a frontal cone, dealing damage and hurling enemy units into the air in their wake, stunning them. Unlocked at level 20.$B$BSpiked Carapace. Crypt Lord\\'s chitinous armor increases damage resistance and returns 15% to 50% damage to enemy melee attackers.$B$BCarrion Beetles. Crypt Lord progenerates a Carrion Beetle from a fresh corpse of an enemy to attack his enemies. Beetles are permanent but do not regenerate health and only 6 can be controlled at a time. Higher levels allow Crypt Lord to summon more powerful beetles. Unlocked at level 10.$B$BLocust Swarm. Crypt Lord releases a swarm of 20-40 (depends on Crypt Lord\\'s level) angry locusts that bite and tear at nearby enemy units, reducing their ability to move or attack. As they chew the enemy flesh, they convert it into a substance that restores hit points to the Crypt Lord when they return. Unlocked at level 40.$B$B',-1);\n\nSET @LOCALIZED_STRINGS_START = 70667;\nSET @LOCALIZED_STRINGS_END   = 70672;\n\nDELETE FROM `npc_text` WHERE ID BETWEEN @LOCALIZED_STRINGS_START and @LOCALIZED_STRINGS_END;\nINSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n(70667,'Do you really want to spend all this money to make Crypt Lord move again?','-1'),\n(70668,'I doubt your ability to do much harm in your current state, but I am willing to lead you and help you restore your powers.','-1'),\n(70669,'Crypt Lords','-1'),\n(70670,'Crypt Lord','-1'),\n(70671,'Reflect','-1'),\n(70672,'Locusts','-1');\n"
  },
  {
    "path": "AC/SQL/updates/world/2023_06_02_00_creature_template_npcbot_extras.sql",
    "content": "--\nUPDATE `creature_template_npcbot_wander_nodes` SET `flags`='1' WHERE (`id`='283');\n"
  },
  {
    "path": "AC/SQL/updates/world/2023_06_03_00_creature_template.sql",
    "content": "--\nUPDATE `creature_template` SET `flags_extra`=(`flags_extra`|0x80000000) WHERE `entry` > 70000 AND (`flags_extra`&0x8E000000) IN (0xE000000, 0xA000000);\n"
  },
  {
    "path": "AC/SQL/updates/world/2023_06_09_00_creature_template_npcbot_wander_nodes.sql",
    "content": "--\nSET @WP_START = 2418;\nSET @WP_END   = 5038;\n\nDELETE FROM `creature_template_npcbot_wander_nodes` WHERE `id` BETWEEN @WP_START AND @WP_END;\nINSERT INTO `creature_template_npcbot_wander_nodes`(`id`,`name`,`mapid`,`zoneid`,`areaid`,`minlevel`,`maxlevel`,`flags`,`x`,`y`,`z`,`o`,`links`) VALUES\n('2418','hellfire001','530','3483','3804','60','63','0','-88.1661','1757.73','61.4158','2.30551','2419:0 2422:0 '),\n('2419','hellfire002','530','3483','3804','60','63','0','-130.83','1837.76','78.4899','5.22012','2418:0 2420:0 2422:0 '),\n('2420','hellfire003','530','3483','3542','60','63','0','-228.144','1920.56','96.8968','1.90495','2419:0 2421:0 2422:0 '),\n('2421','hellfire004','530','3483','3542','60','63','1','-207.846','2150.92','80.3185','1.58606','2420:0 2442:0 2453:0 '),\n('2422','hellfire005','530','3483','3804','60','63','0','-320.252','1725.48','60.1535','0.383608','2418:0 2419:0 2420:0 2423:0 '),\n('2423','hellfire006','530','3483','3804','60','63','0','-443.68','1809.38','64.2507','6.17593','2422:0 2424:0 '),\n('2424','hellfire007','530','3483','3815','60','63','0','-614.482','1855.41','72.3221','2.91339','2423:0 2425:0 '),\n('2425','hellfire008','530','3483','3483','60','63','0','-772.087','1924.89','51.3142','3.69486','2424:0 2426:0 2427:0 '),\n('2426','hellfire009','530','3483','3582','60','63','0','-890.066','1889.54','71.6232','2.99193','2425:0 '),\n('2427','hellfire010','530','3483','3483','60','63','0','-665.15','2133.08','41.0304','6.09818','2425:0 2428:0 '),\n('2428','hellfire011','530','3483','3483','60','63','0','-830.651','2170.3','10.6442','6.00392','2427:0 2429:0 '),\n('2429','hellfire012','530','3483','3582','60','63','0','-1044.48','2221.12','18.1881','2.68955','2428:0 2430:0 2432:0 '),\n('2430','hellfire013','530','3483','3582','60','63','0','-1060.21','2075.54','65.7492','1.53579','2429:0 2431:0 '),\n('2431','hellfire014','530','3483','3582','60','63','0','-1136.98','1968.35','74.7199','4.3593','2430:0 '),\n('2432','hellfire015','530','3483','3483','60','63','0','-1116.71','2366.85','26.2','1.55936','2429:0 2433:0 '),\n('2433','hellfire016','530','3483','3483','60','63','0','-1209.75','2517.59','48.9283','1.97249','2432:0 '),\n('2434','hellfire017','530','3483','3483','60','63','0','-927.061','2680.73','24.4655','4.225','2435:0 2438:0 '),\n('2435','hellfire018','530','3483','3483','60','63','0','-991.176','2930.18','4.1955','4.89571','2434:0 2458:0 2459:0 '),\n('2436','hellfire019','530','3483','3483','60','63','0','-652.576','2459.81','56.8494','0.00658825','2437:0 2438:0 '),\n('2437','hellfire020','530','3483','3483','60','63','0','-382.816','2594.23','50.224','3.72781','2436:0 '),\n('2438','hellfire021','530','3483','3538','60','63','3','-721.67','2675.81','95.7509','0.770785','2434:0 2436:0 '),\n('2439','hellfire022','530','3483','3483','60','63','0','-449.715','2925.64','21.2132','0.32312','2440:0 '),\n('2440','hellfire023','530','3483','3483','60','63','0','-593.071','2998.53','15.8438','0.017592','2439:0 2441:0 '),\n('2441','hellfire024','530','3483','3483','60','63','0','-749.912','3117.85','4.88152','5.75179','2440:0 2458:0 2499:0 '),\n('2442','hellfire025','530','3483','3483','60','63','0','-80.7943','2320.17','65.6333','4.50299','2421:0 2443:0 2446:0 2453:0 '),\n('2443','hellfire026','530','3483','3483','60','63','0','18.4377','2469.36','53.639','4.22811','2442:0 2444:0 2446:0 '),\n('2444','hellfire027','530','3483','3536','60','63','4','33.0662','2661.07','75.7738','3.89274','2443:0 2445:0 '),\n('2445','hellfire028','530','3483','3536','60','63','5','221.743','2789.93','121.175','3.98307','2444:0 2496:0 '),\n('2446','hellfire029','530','3483','3793','60','63','0','158.425','2334.4','54.1841','5.04414','2442:0 2443:0 2447:0 '),\n('2447','hellfire030','530','3483','3793','60','63','0','270.62','2240.47','56.9978','2.96989','2446:0 2448:0 '),\n('2448','hellfire031','530','3483','3793','60','63','0','255.635','2040.2','31.817','2.78925','2447:0 2449:0 '),\n('2449','hellfire032','530','3483','3483','60','63','0','446.912','2049.26','99.1622','3.3783','2448:0 2450:0 '),\n('2450','hellfire033','530','3483','3483','60','63','0','442.066','2351.62','123.026','4.69385','2449:0 2451:0 '),\n('2451','hellfire034','530','3483','3483','60','63','0','438.394','2661.09','177.718','4.90591','2450:0 2452:0 '),\n('2452','hellfire035','530','3483','3549','60','63','0','549.636','2796.65','217.8','4.31374','2451:0 '),\n('2453','hellfire036','530','3483','3542','60','63','0','-220.959','2363','37.4537','1.6049','2421:0 2442:0 2454:0 '),\n('2454','hellfire037','530','3483','3542','60','63','0','-248.594','2648.76','-11.9763','4.88786','2453:0 2455:0 '),\n('2455','hellfire038','530','3483','3542','60','63','0','-270.052','2895.86','-55.0992','4.86824','2454:0 2456:0 2457:0 '),\n('2456','hellfire039','530','3483','3545','60','63','0','-371.638','3039.8','-63.8946','5.60259','2455:0 '),\n('2457','hellfire040','530','3483','3545','60','63','0','-243.298','3044.75','-65.4235','4.48185','2455:0 '),\n('2458','hellfire041','530','3483','3483','60','63','0','-930.007','3088.24','16.9479','0.133084','2435:0 2441:0 2459:0 2466:0 '),\n('2459','hellfire042','530','3483','3483','60','63','0','-1233.86','3071.59','29.2379','5.81622','2458:0 2435:0 2460:0 2462:0 '),\n('2460','hellfire043','530','3483','3796','60','63','0','-1370.5','2890.29','-26.0325','3.35557','2459:0 2461:0 '),\n('2461','hellfire044','530','3483','3546','60','63','0','-1257.98','2677.11','1.84108','2.88824','2460:0 '),\n('2462','hellfire045','530','3483','3483','60','63','0','-1343.14','3305.78','47.482','2.24265','2459:0 2463:0 '),\n('2463','hellfire046','530','3483','3765','60','63','0','-1519.57','3487.42','30.3847','2.18217','2462:0 2464:0 '),\n('2464','hellfire047','530','3483','3765','60','63','0','-1621.55','3645.56','31.4811','1.74235','2463:0 2465:0 '),\n('2465','hellfire048','530','3483','3765','60','63','0','-1680.38','3854.3','36.4441','1.97326','2464:0 2784:0 '),\n('2466','hellfire049','530','3483','3483','60','63','0','-1003.35','3339.19','79.143','4.83211','2458:0 2467:0 '),\n('2467','hellfire050','530','3483','3483','60','63','0','-866.12','3482.05','93.6018','3.97209','2466:0 2468:0 '),\n('2468','hellfire051','530','3483','3543','60','63','0','-842.626','3645.6','31.4407','5.28056','2467:0 2469:0 '),\n('2469','hellfire052','530','3483','3543','60','63','0','-578.854','3725.85','28.9962','3.4176','2468:0 2470:0 '),\n('2470','hellfire053','530','3483','3543','60','63','0','-629.058','3954.17','28.9952','4.88236','2469:0 2471:0 2472:0 2474:0 '),\n('2471','hellfire054','530','3483','3483','60','63','0','-503.474','4084.93','51.2172','4.03729','2470:0 2474:0 2481:0 '),\n('2472','hellfire055','530','3483','3543','60','63','0','-841.235','4095.51','32.9704','5.79579','2470:0 2473:0 2474:0 2477:0 '),\n('2473','hellfire056','530','3483','3483','60','63','0','-950.497','4184.92','29.5337','3.20635','2472:0 2475:0 2477:0 '),\n('2474','hellfire057','530','3483','3554','60','63','5','-659.228','4167.05','67.8382','3.41684','2470:0 2471:0 2472:0 2481:0 '),\n('2475','hellfire058','530','3483','3556','60','63','0','-1174.94','4209.88','20.9412','0.188851','2473:0 2476:0 '),\n('2476','hellfire059','530','3483','3798','60','63','0','-1287.84','4075.76','93.8567','5.93954','2475:0 '),\n('2477','hellfire060','530','3483','3483','60','63','0','-1036.95','4000.75','83.0333','2.90005','2472:0 2473:0 2478:0 '),\n('2478','hellfire061','530','3483','3483','60','63','0','-891.162','4017.27','84.496','3.16788','2477:0 2479:0 '),\n('2479','hellfire062','530','3483','3543','60','63','0','-799.397','3955.75','91.0415','2.42568','2478:0 2480:0 '),\n('2480','hellfire063','530','3483','3483','60','63','0','-766.496','3789.21','113.362','1.77223','2479:0 '),\n('2481','hellfire064','530','3483','3483','60','63','0','-593.759','4335.47','52.0515','4.60437','2474:0 2471:0 2482:0 '),\n('2482','hellfire065','530','3483','3483','60','63','0','-336.014','4367.15','59.658','3.93679','2481:0 2483:0 2509:0 '),\n('2483','hellfire066','530','3483','3483','60','63','0','-202.4','4447.51','42.6762','3.81506','2482:0 2484:0 2506:0 2509:0 '),\n('2484','hellfire067','530','3483','3483','60','63','0','-100.749','4241.25','83.9687','2.24269','2483:0 2485:0 2487:0 2489:0 2505:0 '),\n('2485','hellfire068','530','3483','3552','60','63','2','63.0268','4335.15','96.8814','6.21365','2484:0 2486:0 2487:0 '),\n('2486','hellfire069','530','3483','3552','60','63','3','215.545','4332.38','119.241','2.95661','2485:0 '),\n('2487','hellfire070','530','3483','3483','60','63','0','39.4389','4153.06','71.524','1.85939','2484:0 2485:0 2488:0 2489:0 2505:0 '),\n('2488','hellfire071','530','3483','3483','60','63','0','150.282','3945.51','79.661','2.2835','2487:0 2489:0 2515:0 '),\n('2489','hellfire072','530','3483','3483','60','63','0','-96.2588','3960.84','99.7364','0.521852','2484:0 2488:0 2487:0 2490:0 2505:0 '),\n('2490','hellfire073','530','3483','3669','60','63','0','-120.509','3779.67','72.1233','1.75885','2489:0 2491:0 '),\n('2491','hellfire074','530','3483','3553','60','63','0','-61.6848','3514.21','73.5858','5.1667','2490:0 2492:0 2494:0 2498:0 '),\n('2492','hellfire075','530','3483','3553','60','63','0','318.42','3476.5','61.5198','2.95581','2491:0 2493:0 '),\n('2493','hellfire076','530','3483','3553','60','63','0','383.974','3310.89','74.522','1.91516','2492:0 '),\n('2494','hellfire077','530','3483','3483','60','63','0','-44.2798','3288.99','27.2629','1.47534','2491:0 2495:0 2498:0 '),\n('2495','hellfire078','530','3483','3483','60','63','0','-43.1353','3087.28','-1.55873','1.59942','2494:0 2496:0 '),\n('2496','hellfire079','530','3483','3483','60','63','0','312.814','2983.21','19.5651','2.81914','2445:0 2495:0 2497:0 '),\n('2497','hellfire080','530','3483','3799','60','63','0','459.167','3040.66','17.0606','3.687','2496:0 '),\n('2498','hellfire081','530','3483','3670','60','63','0','-182.907','3456.14','39.4587','0.671851','2491:0 2494:0 '),\n('2499','hellfire082','530','3483','3671','60','63','0','-567.836','3269.14','15.2208','4.86979','2441:0 2500:0 '),\n('2500','hellfire083','530','3483','3671','60','63','0','-549.666','3476.52','45.226','4.64597','2499:0 2501:0 2502:0 '),\n('2501','hellfire084','530','3483','3671','60','63','0','-445.867','3462.18','37.6671','2.82071','2500:0 '),\n('2502','hellfire085','530','3483','3669','60','63','0','-452.212','3658.72','45.9024','0.816375','2500:0 2503:0 '),\n('2503','hellfire086','530','3483','3483','60','63','0','-378.049','3871.34','62.3491','4.48419','2502:0 2504:0 '),\n('2504','hellfire087','530','3483','3669','60','63','0','-294.007','3742.96','51.9568','2.11386','2503:0 2505:0 '),\n('2505','hellfire088','530','3483','3483','60','63','0','-203.95','4100.77','98.2207','5.35677','2484:0 2487:0 2489:0 2504:0 '),\n('2506','hellfire089','530','3483','3483','60','63','1','-249.051','4768.73','14.6773','1.56722','2483:0 2507:0 2508:0 2509:0 2512:0 2513:0 '),\n('2507','hellfire090','530','3483','3797','60','63','0','13.8026','4691.45','41.6534','6.21284','2506:0 2513:0 '),\n('2508','hellfire091','530','3483','3551','60','63','0','-556.09','4800.17','34.169','3.11602','2506:0 2509:0 2512:0 '),\n('2509','hellfire092','530','3483','3483','60','63','0','-412.14','4578.53','39.0585','2.37774','2506:0 2482:0 2483:0 2508:0 2512:0 '),\n('2510','hellfire093','530','3483','3800','60','63','0','-259.551','5042.36','65.21','1.36455','2511:0 2517:0 '),\n('2511','hellfire094','530','3483','3795','60','63','0','-403.556','4975.22','40.4154','0.508468','2510:0 2512:0 '),\n('2512','hellfire095','530','3483','3795','60','63','0','-417.252','4788.73','19.9639','2.94399','2509:0 2506:0 2508:0 2511:0 '),\n('2513','hellfire096','530','3483','3797','60','63','0','-68.76','4846.8','50.753','4.86823','2506:0 2507:0 2514:0 '),\n('2514','hellfire097','530','3483','3797','60','63','0','173.831','4854.22','77.6594','3.44272','2513:0 '),\n('2515','hellfire098','530','3483','3483','60','63','0','335.776','4014.33','100.063','3.83622','2488:0 2516:0 '),\n('2516','hellfire099','530','3483','3483','60','63','0','353.816','3871.24','144.979','1.47611','2515:0 '),\n('2517','hellfire100','530','3483','3800','60','63','0','-234.311','5165.64','83.9852','4.49598','2510:0 2518:0 '),\n('2518','zangar101','530','3521','3521','61','64','0','-271.021','5303.67','41.8812','4.77871','2517:0 2519:0 '),\n('2519','zangar102','530','3521','3565','61','64','1','-220.592','5436.56','21.669','5.30379','2518:0 2520:0 2521:0 '),\n('2520','zangar103','530','3521','3521','61','64','0','-84.4992','5395.31','22.3401','3.21027','2519:0 2659:0 '),\n('2521','zangar104','530','3521','3521','61','64','0','-395.049','5385.52','18.5881','6.06676','2519:0 2522:0 '),\n('2522','zangar105','530','3521','3521','61','64','0','-535.462','5435.61','20.9825','5.81938','2521:0 2523:0 '),\n('2523','zangar106','530','3521','3521','61','64','0','-672.658','5367.99','22.9724','0.237551','2522:0 2524:0 '),\n('2524','zangar107','530','3521','3641','61','64','0','-758.891','5282.57','17.6121','1.72588','2523:0 2525:0 '),\n('2525','zangar108','530','3521','3641','61','64','0','-813.122','5198.88','19.1746','1.05202','2524:0 2526:0 '),\n('2526','zangar109','530','3521','3641','61','64','0','-976.189','5260.97','19.0927','6.05108','2525:0 2527:0 2672:0 '),\n('2527','zangar110','530','3521','3521','61','64','0','-934.208','5419.78','22.8095','4.46851','2526:0 2528:0 2672:0 '),\n('2528','zangar111','530','3521','3521','61','64','0','-966.5','5606.91','22.0137','4.97508','2527:0 2529:0 '),\n('2529','zangar112','530','3521','3521','61','64','0','-912.293','5682.09','21.6937','5.08504','2528:0 2530:0 '),\n('2530','zangar113','530','3521','3521','61','64','0','-913.195','5896.44','20.1725','4.59652','2529:0 2531:0 2534:0 '),\n('2531','zangar114','530','3521','3521','61','64','0','-909.682','6045.49','19.7314','4.59651','2530:0 2532:0 2534:0 2535:0 '),\n('2532','zangar115','530','3521','3521','61','64','0','-1037.12','6091.11','19.5931','5.89242','2531:0 2533:0 '),\n('2533','zangar116','530','3521','3521','61','64','0','-1163.58','6201.43','53.0219','5.61282','2532:0 2671:0 '),\n('2534','zangar117','530','3521','3841','61','64','0','-796.58','5918.23','22.3409','2.31415','2530:0 2531:0 2535:0 '),\n('2535','zangar118','530','3521','3521','61','64','0','-701.347','6013.97','22.3146','3.22521','2534:0 2531:0 2536:0 2537:0 '),\n('2536','zangar119','530','3521','3841','61','64','0','-592.408','5933.75','20.813','5.51464','2535:0 2537:0 '),\n('2537','zangar120','530','3521','3521','61','64','0','-504.59','6048.64','23.1686','4.20775','2536:0 2535:0 2538:0 '),\n('2538','zangar121','530','3521','3841','61','64','0','-495.325','5854.59','20.3458','2.52376','2537:0 2539:0 '),\n('2539','zangar122','530','3521','3521','61','64','0','-318.55','6013.33','23.3657','3.50315','2538:0 2540:0 2654:0 '),\n('2540','zangar123','530','3521','3819','61','64','0','-352.699','6158.62','21.7844','4.91293','2539:0 2541:0 2654:0 '),\n('2541','zangar124','530','3521','3819','61','64','0','-338.739','6298.09','21.04','4.63411','2540:0 2542:0 '),\n('2542','zangar125','530','3521','3819','61','64','0','-409.277','6401.64','21.9404','0.801373','2541:0 2543:0 2546:0 '),\n('2543','zangar126','530','3521','3819','61','64','0','-230.832','6354.36','21.7058','3.81024','2542:0 2544:0 '),\n('2544','zangar127','530','3521','3659','61','64','0','-139.857','6456.59','20.0973','3.85658','2543:0 2545:0 2653:0 '),\n('2545','zangar128','530','3521','3659','61','64','0','-269.671','6613.48','23.0533','4.34353','2544:0 2546:0 '),\n('2546','zangar129','530','3521','3659','61','64','0','-383.175','6598.68','22.9642','4.52024','2542:0 2545:0 2547:0 '),\n('2547','zangar130','530','3521','3659','61','64','0','-215.725','6703.55','20.6145','4.19588','2546:0 2548:0 2549:0 '),\n('2548','zangar131','530','3521','3659','61','64','0','-63.9463','6759.2','20.4434','3.22986','2547:0 2549:0 2555:0 '),\n('2549','zangar132','530','3521','3659','61','64','0','-261.475','6823.98','21.6241','5.85702','2547:0 2548:0 2550:0 '),\n('2550','zangar133','530','3521','3642','61','64','0','-208.234','6950.07','20.1839','0.893301','2549:0 2551:0 '),\n('2551','zangar134','530','3521','3642','61','64','0','-126.36','7041.34','18.9083','3.86997','2550:0 2552:0 '),\n('2552','zangar135','530','3521','3642','61','64','0','-50.056','7132.44','19.2134','4.60817','2551:0 2553:0 '),\n('2553','zangar136','530','3521','3521','61','64','0','64.7648','7212.88','22.0782','0.46519','2552:0 2554:0 2562:0 2563:0 2574:0 '),\n('2554','zangar137','530','3521','3521','61','64','0','44.854','7014.88','23.4767','1.78543','2553:0 2555:0 '),\n('2555','zangar138','530','3521','3521','61','64','0','43.5835','6871.99','22.3894','4.7567','2554:0 2548:0 2556:0 2557:0 '),\n('2556','zangar139','530','3521','3521','61','64','0','157.048','6719.99','20.4444','2.3259','2555:0 2557:0 2641:0 '),\n('2557','zangar140','530','3521','3720','61','64','0','223.784','6824.17','25.6438','3.74197','2555:0 2556:0 2558:0 2641:0 '),\n('2558','zangar141','530','3521','3720','61','64','0','234.681','6926.14','23.7418','4.49203','2557:0 2559:0 '),\n('2559','zangar142','530','3521','3720','61','64','0','212.404','7079.58','35.2277','4.69231','2558:0 2560:0 '),\n('2560','zangar143','530','3521','3720','61','64','0','220.362','7208.94','25.1738','4.71196','2559:0 2561:0 '),\n('2561','zangar144','530','3521','3720','61','64','0','336.506','7340.86','41.5461','4.13471','2560:0 2562:0 2633:0 '),\n('2562','zangar145','530','3521','3720','61','64','0','157.889','7365.75','22.1067','6.02358','2553:0 2561:0 2563:0 '),\n('2563','zangar146','530','3521','3521','61','64','0','63.1597','7443.51','22.1993','5.2932','2553:0 2562:0 2564:0 2574:0 '),\n('2564','zangar147','530','3521','3521','61','64','0','115.528','7547.02','21.6598','4.53135','2563:0 2565:0 2569:0 '),\n('2565','zangar148','530','3521','3521','61','64','0','118.141','7658.13','21.5634','4.72141','2564:0 2566:0 2569:0 2575:0 2633:0 '),\n('2566','zangar149','530','3521','3521','61','64','4','246.937','7753.08','23.1428','3.93445','2565:0 2567:0 2569:0 2575:0 2633:0 '),\n('2567','zangar150','530','3521','3645','61','64','5','264.306','7863.47','23.7956','4.64131','2566:0 2568:0 2569:0 2575:0 '),\n('2568','zangar151','530','3521','3521','61','64','4','449.39','7844.62','22.0319','3.04694','2567:0 2615:0 '),\n('2569','zangar152','530','3521','3521','61','64','0','81.5617','7740.29','21.6356','3.14119','2564:0 2565:0 2566:0 2567:0 2570:0 2575:0 '),\n('2570','zangar153','530','3521','3521','61','64','0','-28.0868','7736.24','20.5893','6.25922','2569:0 2571:0 2575:0 2582:0 '),\n('2571','zangar154','530','3521','3521','61','64','0','-170.551','7601.35','23.3202','0.757515','2570:0 2572:0 2581:0 '),\n('2572','zangar155','530','3521','3521','61','64','0','-174.825','7443.51','21.9702','1.57433','2571:0 2573:0 2574:0 '),\n('2573','zangar156','530','3521','3642','61','64','0','-120.981','7305.7','23.422','1.77461','2572:0 2574:0 '),\n('2574','zangar157','530','3521','3521','61','64','0','-20.2426','7327.37','23.7348','2.19481','2573:0 2572:0 2563:0 2553:0 '),\n('2575','zangar158','530','3521','3521','61','64','0','84.0333','7841.91','22.0373','4.55886','2565:0 2566:0 2567:0 2569:0 2570:0 2576:0 '),\n('2576','zangar159','530','3521','3521','61','64','0','65.13','7971.37','21.6779','4.89266','2575:0 2577:0 '),\n('2577','zangar160','530','3521','3521','61','64','0','43.5829','8117.3','22.3841','4.94372','2576:0 2578:0 2598:0 '),\n('2578','zangar161','530','3521','3521','61','64','0','-49.1017','8195.83','23.1999','5.71343','2577:0 2579:0 2583:0 2587:0 '),\n('2579','zangar162','530','3521','3646','61','64','0','-209.87','8126.35','19.9595','0.261968','2578:0 2580:0 2582:0 2583:0 '),\n('2580','zangar163','530','3521','3646','61','64','0','-261.772','7885.5','18.5845','1.41258','2579:0 2581:0 2582:0 '),\n('2581','zangar164','530','3521','3521','61','64','0','-259.719','7720.02','20.8878','1.65605','2571:0 2580:0 '),\n('2582','zangar165','530','3521','3646','61','64','0','-98.2706','7905.01','21.2267','4.92567','2570:0 2579:0 2580:0 '),\n('2583','zangar166','530','3521','3521','61','64','0','-180.804','8271.58','22.3452','2.13749','2578:0 2579:0 2584:0 2587:0 '),\n('2584','zangar167','530','3521','3521','61','64','0','-280.916','8401.01','22.613','5.34193','2583:0 2585:0 '),\n('2585','zangar168','530','3521','3521','61','64','0','-414.115','8416.71','22.9544','6.2098','2584:0 2586:0 2949:0 '),\n('2586','zangar169','530','3521','3521','61','64','0','-208.705','8507.09','22.1101','4.05625','2585:0 2587:0 '),\n('2587','zangar170','530','3521','3521','61','64','0','-76.6423','8339.54','20.5708','1.28772','2583:0 2578:0 2586:0 2588:0 '),\n('2588','zangar171','530','3521','3521','61','64','0','2.14825','8447.62','24.0799','1.18326','2587:0 2589:0 2596:0 '),\n('2589','zangar172','530','3521','3647','61','64','0','-67.5414','8574.38','21.4033','5.22493','2588:0 2590:0 2596:0 '),\n('2590','zangar173','530','3521','3647','61','64','0','-131.783','8711.6','20.1378','5.16367','2589:0 2591:0 '),\n('2591','zangar174','530','3521','3647','61','64','0','-58.2395','8845.13','19.6236','4.45683','2590:0 2592:0 '),\n('2592','zangar175','530','3521','3647','61','64','0','-158.14','8998.32','22.6743','5.39853','2591:0 2593:0 '),\n('2593','zangar176','530','3521','3521','61','64','0','49.2289','8919.95','22.8353','4.08298','2592:0 2594:0 2612:0 '),\n('2594','zangar177','530','3521','3658','61','64','0','191.332','8791.02','22.5064','3.15621','2593:0 2595:0 '),\n('2595','zangar178','530','3521','3658','61','64','0','100.838','8633.77','22.3518','1.01992','2594:0 2596:0 '),\n('2596','zangar179','530','3521','3521','61','64','0','46.3545','8528.92','21.3211','3.67772','2588:0 2589:0 2595:0 2597:0 '),\n('2597','zangar180','530','3521','3521','61','64','1','201.143','8506.92','24.4625','4.24664','2596:0 2598:0 '),\n('2598','zangar181','530','3521','3656','61','64','0','176.313','8271.1','19.3723','2.275','2577:0 2597:0 2599:0 '),\n('2599','zangar182','530','3521','3656','61','64','0','285.943','8219.3','20.2926','3.15229','2598:0 2600:0 '),\n('2600','zangar183','530','3521','3656','61','64','0','386.339','8346.33','22.789','4.31625','2599:0 2601:0 '),\n('2601','zangar184','530','3521','3656','61','64','0','494.267','8437.25','21.4802','4.07671','2600:0 2602:0 2609:0 2613:0 '),\n('2602','zangar185','530','3521','3656','61','64','0','608.933','8508.26','22.3504','3.55914','2601:0 2603:0 2609:0 '),\n('2603','zangar186','530','3521','3521','61','64','0','742.61','8532.55','22.4318','3.26227','2602:0 2604:0 2608:0 2609:0 '),\n('2604','zangar187','530','3521','3521','61','64','0','895.923','8416.01','24.0337','2.57898','2603:0 2605:0 '),\n('2605','zangar188','530','3521','3650','61','64','0','1075.84','8407.67','22.4904','3.12875','2604:0 2606:0 2607:0 2620:0 '),\n('2606','zangar189','530','3521','3650','61','64','0','1227.41','8505.09','22.644','3.70367','2605:0 2607:0 2621:0 '),\n('2607','zangar190','530','3521','3650','61','64','0','1037.11','8556.71','23.1526','5.52971','2605:0 2606:0 2608:0 '),\n('2608','zangar191','530','3521','3521','61','64','0','838.679','8631.92','21.121','3.9','2607:0 2603:0 '),\n('2609','zangar192','530','3521','3657','61','64','0','532.243','8648.7','20.2148','1.72209','2601:0 2602:0 2603:0 2610:0 '),\n('2610','zangar193','530','3521','3521','61','64','0','500.585','8831.78','29.9762','3.31252','2609:0 2611:0 '),\n('2611','zangar194','530','3521','3521','61','64','0','312.939','8988.81','29.3602','2.17448','2610:0 2612:0 '),\n('2612','zangar195','530','3521','3521','61','64','0','153.844','9001.52','20.6373','4.20787','2593:0 2611:0 '),\n('2613','zangar196','530','3521','3643','61','64','0','634.189','8249.73','20.9802','4.23537','2601:0 2614:0 '),\n('2614','zangar197','530','3521','3643','61','64','0','610.771','8068.12','19.5665','1.60114','2613:0 2615:0 2617:0 '),\n('2615','zangar198','530','3521','3667','61','64','0','579.736','7860.06','21.923','1.46997','2568:0 2614:0 2616:0 '),\n('2616','zangar199','530','3521','3667','61','64','0','737.751','7895.31','21.9665','6.19807','2615:0 2617:0 '),\n('2617','zangar200','530','3521','3521','61','64','0','787.048','8075.83','19.8301','1.19115','2614:0 2616:0 2618:0 '),\n('2618','zangar201','530','3521','3667','61','64','0','940.179','8075.93','22.3322','3.07219','2617:0 2619:0 2625:0 '),\n('2619','zangar202','530','3521','3667','61','64','0','1079.94','8078.99','22.0839','3.44134','2618:0 2620:0 2624:0 '),\n('2620','zangar203','530','3521','3640','61','64','0','1142.01','8208.94','18.3815','1.68911','2605:0 2619:0 2624:0 '),\n('2621','zangar204','530','3521','3650','61','64','0','1365.27','8597.28','20.4376','3.62905','2606:0 2622:0 '),\n('2622','zangar205','530','3521','3650','61','64','0','1473.46','8617.75','-19.2604','3.20336','2621:0 2623:0 '),\n('2623','zangar206','530','3521','3651','61','64','0','1617.83','8604.6','-25.7602','3.11932','2622:0 '),\n('2624','zangar207','530','3521','3521','61','64','0','1204.46','7994.66','23.5559','2.79496','2619:0 2620:0 2625:0 '),\n('2625','zangar208','530','3521','3667','61','64','0','985.581','7906.61','21.9749','1.94279','2618:0 2624:0 2626:0 '),\n('2626','zangar209','530','3521','3667','61','64','0','924.71','7759.51','22.2632','4.47963','2625:0 2627:0 '),\n('2627','zangar210','530','3521','3667','61','64','0','972.886','7540.98','20.6745','5.06474','2626:0 2628:0 '),\n('2628','zangar211','530','3521','3766','61','64','3','1008.04','7381.67','36.2454','2.67557','2627:0 2629:0 3123:0 '),\n('2629','zangar212','530','3521','3521','61','64','2','888.478','7369.16','20.9021','3.3785','2628:0 2630:0 2634:0 '),\n('2630','zangar213','530','3521','3521','61','64','0','749.898','7401.62','22.0246','0.295815','2629:0 2631:0 2634:0 '),\n('2631','zangar214','530','3521','3653','61','64','0','578.096','7540.84','19.4559','5.3043','2630:0 2632:0 '),\n('2632','zangar215','530','3521','3653','61','64','0','453.399','7459.1','23.6644','2.9591','2631:0 2633:0 '),\n('2633','zangar216','530','3521','3521','61','64','0','301.56','7502.53','18.7007','4.88489','2561:0 2632:0 2566:0 2565:0 '),\n('2634','zangar217','530','3521','3653','61','64','0','723.766','7219.4','18.4476','1.52104','2629:0 2630:0 2635:0 '),\n('2635','zangar218','530','3521','3653','61','64','0','828.704','7046.99','21.9746','5.47316','2634:0 2636:0 '),\n('2636','zangar219','530','3521','3521','61','64','0','813.291','6859.8','21.1175','4.5346','2635:0 2637:0 '),\n('2637','zangar220','530','3521','3521','61','64','0','786.813','6686.79','19.6235','4.77415','2636:0 2638:0 '),\n('2638','zangar221','530','3521','3521','61','64','0','739.145','6548.18','21.4284','2.68185','2637:0 2639:0 2646:0 '),\n('2639','zangar222','530','3521','3653','61','64','0','533.697','6616.1','23.4617','5.98523','2638:0 2640:0 2646:0 '),\n('2640','zangar223','530','3521','3521','61','64','0','392.669','6497.59','21.0234','1.88546','2639:0 2641:0 2642:0 2646:0 '),\n('2641','zangar224','530','3521','3521','61','64','0','309.995','6655.73','21.2137','5.01134','2556:0 2640:0 2557:0 '),\n('2642','zangar225','530','3521','3521','61','64','0','377.938','6282.83','22.023','4.47492','2640:0 2643:0 '),\n('2643','zangar226','530','3521','3521','61','64','0','413.817','6144.54','22.2423','1.89569','2642:0 2644:0 2649:0 '),\n('2644','zangar227','530','3521','3521','61','64','0','588.059','6075.05','22.5742','2.63553','2643:0 2645:0 2647:0 2670:0 '),\n('2645','zangar228','530','3521','3818','61','64','0','603.408','6285.69','21.8038','4.64065','2644:0 2646:0 2647:0 '),\n('2646','zangar229','530','3521','3653','61','64','0','621.81','6442.18','20.5988','2.00643','2638:0 2639:0 2640:0 2645:0 '),\n('2647','zangar230','530','3521','3521','61','64','0','691.526','6136.65','24.626','4.02491','2644:0 2645:0 2648:0 3018:0 '),\n('2648','zangar231','530','3521','3521','61','64','0','718.677','6010.01','23.0266','4.85273','2647:0 2670:0 3018:0 '),\n('2649','zangar232','530','3521','3644','61','64','3','284.699','5949','26.4296','1.71192','2643:0 2650:0 2657:0 '),\n('2650','zangar233','530','3521','3521','61','64','2','171.4','6095.69','21.4396','5.75672','2649:0 2651:0 2654:0 2657:0 '),\n('2651','zangar234','530','3521','3521','61','64','0','220.592','6179.94','22.7879','2.4926','2650:0 2652:0 '),\n('2652','zangar235','530','3521','3521','61','64','0','109.112','6307.6','20.5752','2.47375','2651:0 2653:0 2654:0 '),\n('2653','zangar236','530','3521','3659','61','64','0','-2.05183','6372.4','21.196','6.01275','2544:0 2652:0 '),\n('2654','zangar237','530','3521','3521','61','64','0','-101.637','6148.49','20.9712','3.74609','2539:0 2540:0 2652:0 2650:0 2655:0 '),\n('2655','zangar238','530','3521','3521','61','64','0','-95.8529','5919.89','21.912','1.45665','2654:0 2656:0 '),\n('2656','zangar239','530','3521','3521','61','64','0','13.2803','5837.85','22.8222','2.53657','2655:0 2657:0 '),\n('2657','zangar240','530','3521','3521','61','64','0','151.585','5801.02','22.4062','1.73938','2649:0 2650:0 2656:0 2658:0 '),\n('2658','zangar241','530','3521','3521','61','64','0','12.867','5638.72','21.5024','0.850312','2657:0 2659:0 '),\n('2659','zangar242','530','3521','3521','61','64','0','48.9274','5481.91','21.872','2.08181','2520:0 2658:0 2660:0 2662:0 '),\n('2660','zangar243','530','3521','3521','61','64','4','71.9609','5332.54','21.9147','5.20377','2659:0 2661:0 2662:0 '),\n('2661','zangar244','530','3521','3718','61','64','5','85.2911','5223.84','22.6669','1.80693','2660:0 '),\n('2662','zangar245','530','3521','3648','61','64','0','158.923','5429.39','21.7352','4.09636','2660:0 2659:0 2663:0 '),\n('2663','zangar246','530','3521','3648','61','64','0','315.219','5408.5','20.9134','6.16588','2662:0 2664:0 2665:0 '),\n('2664','zangar247','530','3521','3648','61','64','0','377.232','5291.67','16.6948','0.491381','2663:0 2665:0 '),\n('2665','zangar248','530','3521','3648','61','64','0','610.457','5425.64','-14.6579','4.20083','2663:0 2664:0 2666:0 2667:0 2668:0 '),\n('2666','zangar249','530','3521','3648','61','64','0','820.719','5482.54','9.38793','3.43975','2665:0 2667:0 '),\n('2667','zangar250','530','3521','3648','61','64','0','675.579','5207.73','-0.430108','1.71187','2665:0 2666:0 '),\n('2668','zangar251','530','3521','3648','61','64','0','581.932','5617.72','21.5502','1.58306','2665:0 2669:0 '),\n('2669','zangar252','530','3521','3521','61','64','0','549.492','5772.45','23.2954','1.1668','2668:0 2670:0 '),\n('2670','zangar253','530','3521','3521','61','64','0','569.447','5936.2','20.4341','1.13146','2669:0 2648:0 2644:0 3018:0 '),\n('2671','nagrand254','530','3521','3521','61','64','0','-1293.68','6268.96','47.863','5.30897','2533:0 2973:0 '),\n('2672','zangar255','530','3521','3521','61','64','0','-1072.75','5374.44','23.0643','3.2316','2526:0 2527:0 2673:0 '),\n('2673','tero256','530','3519','3519','61','64','0','-1193.26','5326.41','32.1568','3.76253','2672:0 2674:0 '),\n('2674','tero257','530','3519','3519','61','64','0','-1352.86','5166.19','60.3214','0.730896','2673:0 2675:0 '),\n('2675','tero258','530','3519','3519','61','64','0','-1481.09','5196.68','44.2804','2.26164','2674:0 2676:0 '),\n('2676','tero259','530','3703','3703','61','64','0','-1562.26','5219.05','26.8104','5.79513','2675:0 2677:0 '),\n('2677','tero260','530','3703','3703','61','64','0','-1646.24','5089.63','9.06231','3.96908','2676:0 2678:0 2679:0 '),\n('2678','tero261','530','3519','3519','62','65','0','-1504.23','5007.75','-5.38562','2.6182','2677:0 '),\n('2679','tero262','530','3703','3703','62','65','0','-1767.61','5061.37','7.70519','3.4303','2677:0 2680:0 '),\n('2680','tero263','530','3703','3703','62','65','0','-1923.14','5054.44','19.4908','2.72737','2679:0 2681:0 2682:0 2787:0 '),\n('2681','tero264','530','3519','3519','62','65','0','-1970.49','4974.82','28.2638','4.09397','2680:0 2770:0 2787:0 '),\n('2682','tero265','530','3703','3703','62','65','0','-2043.23','5134.06','8.27497','5.68597','2680:0 2683:0 2787:0 '),\n('2683','tero266','530','3519','3519','62','65','0','-2181.58','5096.17','-21.1362','0.23923','2682:0 2684:0 2685:0 2686:0 2787:0 '),\n('2684','tero267','530','3519','3519','62','65','0','-2216.99','4909.63','1.39859','1.40554','2683:0 2787:0 '),\n('2685','tero268','530','3519','3519','62','65','0','-2303.98','5268.43','-9.97572','5.28148','2683:0 2686:0 2687:0 2690:0 '),\n('2686','tero269','530','3519','3682','62','65','0','-2344.61','5051.57','-2.04758','0.266708','2685:0 2683:0 2690:0 '),\n('2687','tero270','530','3519','3677','62','65','0','-2431.44','5399.92','1.64547','5.51947','2685:0 2688:0 '),\n('2688','tero271','530','3519','3519','62','65','0','-2521.64','5210.06','1.76945','1.04896','2687:0 2689:0 2691:0 '),\n('2689','tero272','530','3519','3682','62','65','0','-2502.78','5113.56','7.96009','6.26007','2688:0 2690:0 2691:0 '),\n('2690','tero273','530','3519','3519','62','65','0','-2359.81','5159.68','-3.26821','3.01403','2689:0 2685:0 2686:0 '),\n('2691','tero274','530','3519','3519','62','65','0','-2640.66','5114.54','-2.29','3.12004','2688:0 2689:0 2692:0 '),\n('2692','tero275','530','3519','3887','62','65','1','-2764.32','5083.04','-6.61069','4.7576','2691:0 2693:0 2694:0 '),\n('2693','tero276','530','3519','3697','62','65','0','-2753.24','4900.43','-9.77721','1.5139','2692:0 2694:0 2696:0 '),\n('2694','tero277','530','3519','3697','62','65','0','-2924.05','5077.7','-21.4831','6.27734','2693:0 2692:0 2695:0 2696:0 '),\n('2695','tero278','530','3519','3697','62','65','0','-2988.38','5242.11','-18.2224','5.09376','2694:0 2737:0 2739:0 '),\n('2696','tero279','530','3519','3697','62','65','0','-2927.67','4884.87','-20.3937','1.65765','2693:0 2694:0 2697:0 '),\n('2697','tero280','530','3519','3891','62','65','0','-2833.33','4763.19','-3.82034','2.17758','2696:0 2698:0 '),\n('2698','tero281','530','3519','3891','62','65','0','-2735.66','4761.53','-7.97762','3.14205','2697:0 2699:0 '),\n('2699','tero282','530','3519','3697','62','65','0','-2927.04','4629.03','-20.1141','1.04898','2698:0 2700:0 2701:0 2703:0 '),\n('2700','tero283','530','3519','3697','62','65','0','-2792.58','4548.65','-5.17792','2.36688','2699:0 '),\n('2701','tero284','530','3519','3697','62','65','0','-3098.66','4626.88','-20.2418','0.186611','2699:0 2702:0 2707:0 '),\n('2702','tero285','530','3519','3697','62','65','0','-3111.3','4451.66','-21.8624','1.72364','2701:0 2703:0 '),\n('2703','tero286','530','3519','3697','62','65','0','-2978.71','4453.52','-19.1914','1.37334','2702:0 2699:0 2704:0 2762:0 '),\n('2704','tero287','530','3519','3697','62','65','0','-3124.74','4312.73','-13.4977','1.36941','2703:0 2705:0 2744:0 '),\n('2705','tero288','530','3519','3697','62','65','0','-3343.1','4318.47','-21.2101','0.0703571','2704:0 2706:0 2708:0 2744:0 '),\n('2706','tero289','530','3519','3697','62','65','0','-3251.81','4540.47','-21.009','4.41204','2705:0 2707:0 2709:0 '),\n('2707','tero290','530','3519','3688','62','65','0','-3251.45','4665.87','-22.0178','5.15817','2706:0 2701:0 '),\n('2708','tero291','530','3519','3892','62','65','0','-3461.56','4373.44','-11.6911','5.77627','2705:0 2709:0 2710:0 '),\n('2709','tero292','530','3519','3697','62','65','0','-3412.64','4543.05','-19.8323','4.37513','2708:0 2706:0 2710:0 '),\n('2710','tero293','530','3519','3697','62','65','0','-3615.55','4423.5','-15.264','6.23338','2708:0 2709:0 2711:0 2712:0 '),\n('2711','tero294','530','3519','3885','62','65','0','-3737.19','4335.92','3.0303','0.715952','2710:0 2712:0 '),\n('2712','tero295','530','3519','3697','62','65','0','-3717.12','4553.09','-15.395','5.41343','2710:0 2711:0 2713:0 '),\n('2713','tero296','530','3519','3886','62','65','0','-3751.58','4692.08','-17.1029','5.18959','2712:0 2714:0 2717:0 '),\n('2714','tero297','530','3519','3688','62','65','0','-3628.23','4736.46','-22.1214','3.39967','2713:0 2715:0 '),\n('2715','tero298','530','3519','3688','62','65','0','-3683.64','4880.37','-22.2453','4.85659','2714:0 2716:0 '),\n('2716','tero299','530','3519','3697','62','65','0','-3787.46','5013.52','-20.1657','5.31998','2715:0 2717:0 2718:0 '),\n('2717','tero300','530','3519','3697','62','65','0','-3875.72','4882.7','-35.8103','0.180317','2716:0 2713:0 '),\n('2718','tero301','530','3519','3697','62','65','0','-3756.44','5163.25','-22.4721','4.73093','2716:0 2720:0 2719:0 '),\n('2719','tero302','530','3519','3697','62','65','1','-3750.45','5404.46','-3.33481','1.38198','2718:0 2720:0 2721:0 '),\n('2720','tero303','530','3519','3894','62','65','0','-3634.78','5300.46','-21.1377','3.63217','2718:0 2721:0 2741:0 2719:0 '),\n('2721','tero304','530','3519','3697','62','65','0','-3670.35','5445.73','-4.16488','5.0239','2720:0 2722:0 2741:0 2719:0 '),\n('2722','tero305','530','3519','3697','62','65','0','-3645.73','5559.5','-2.14497','4.56524','2721:0 2723:0 '),\n('2723','tero306','530','3519','3686','62','65','0','-3642.69','5710.06','-2.77685','4.68385','2722:0 2724:0 2725:0 '),\n('2724','tero307','530','3519','3519','62','65','0','-3501.7','5745.82','0.234953','3.52538','2723:0 2730:0 '),\n('2725','tero308','530','3519','3519','62','65','0','-3733.98','5830.74','-2.74856','5.14723','2723:0 2726:0 '),\n('2726','tero309','530','3519','3519','62','65','0','-3787.12','5986.43','-1.72887','4.96659','2725:0 2727:0 '),\n('2727','tero310','530','3519','3519','62','65','0','-3628.51','6056.29','-3.33948','3.46806','2726:0 2728:0 '),\n('2728','tero311','530','3519','3519','62','65','0','-3508.49','6174.6','4.08676','3.93145','2727:0 2729:0 '),\n('2729','tero312','530','3519','3519','62','65','0','-3378.56','5998.98','-6.51004','2.27505','2728:0 2730:0 2731:0 2742:0 '),\n('2730','tero313','530','3519','3519','62','65','0','-3476.42','5902.44','-30.7079','0.739594','2729:0 2724:0 2731:0 '),\n('2731','tero314','530','3519','3519','62','65','0','-3285.32','5879.96','-19.0985','2.70702','2730:0 2729:0 2732:0 2742:0 '),\n('2732','tero315','530','3519','3519','62','65','0','-3364.14','5789.3','-1.76223','1.10479','2731:0 2733:0 2742:0 '),\n('2733','tero316','530','3519','3697','62','65','0','-3305.33','5740.49','0.884062','4.92025','2732:0 2734:0 2742:0 '),\n('2734','tero317','530','3519','3697','62','65','0','-3286.23','5602.34','-6.97428','4.90454','2733:0 2735:0 '),\n('2735','tero318','530','3519','3697','62','65','0','-3117.93','5582.45','-7.6733','6.23185','2734:0 2736:0 2739:0 '),\n('2736','tero319','530','3519','3697','62','65','0','-2973.64','5517.8','-7.12772','5.62318','2735:0 2737:0 2739:0 '),\n('2737','tero320','530','3519','3697','62','65','0','-2940.15','5358.09','-13.875','4.96972','2736:0 2695:0 2738:0 2739:0 '),\n('2738','tero321','530','3519','3697','62','65','0','-2795.19','5341.13','-2.81699','5.23676','2737:0 '),\n('2739','tero322','530','3519','3697','62','65','0','-3141.55','5381.37','-22.1389','0.524372','2695:0 2735:0 2736:0 2737:0 2740:0 '),\n('2740','tero323','530','3519','3697','62','65','0','-3327.94','5329.47','-18.7903','0.115962','2739:0 2741:0 '),\n('2741','tero324','530','3519','3697','62','65','0','-3499.7','5387.05','-17.1808','2.91198','2740:0 2720:0 2721:0 '),\n('2742','tero325','530','3519','3519','62','65','0','-3184.45','5888','2.6866','3.28897','2729:0 2731:0 2732:0 2733:0 2743:0 2823:0 '),\n('2743','tero326','530','3519','3519','62','65','0','-3032.12','5978.81','4.34466','3.72093','2742:0 2823:0 '),\n('2744','tero327','530','3519','3697','62','65','0','-3134.88','4193.43','-7.28336','1.29796','2704:0 2705:0 2745:0 '),\n('2745','tero328','530','3519','3697','62','65','0','-3028.19','4178.94','-0.0653765','2.95906','2744:0 2746:0 '),\n('2746','tero329','530','3519','3519','62','65','0','-2977.23','4157.96','8.11812','3.04232','2745:0 2747:0 '),\n('2747','tero330','530','3519','3684','62','65','3','-2960.39','4073.83','2.27582','5.22886','2746:0 2748:0 '),\n('2748','tero331','530','3519','3684','62','65','3','-2931.59','3983.95','-0.908721','4.85187','2747:0 2749:0 '),\n('2749','tero332','530','3519','3519','62','65','2','-2826.95','3982.66','1.7483','3.08078','2748:0 2750:0 '),\n('2750','tero333','530','3519','3519','62','65','0','-2775.95','3939.94','2.93918','0.30046','2749:0 2751:0 '),\n('2751','tero334','530','3519','3519','62','65','0','-2653.89','3959.73','4.49025','3.42242','2750:0 2752:0 2791:0 '),\n('2752','tero335','530','3519','3519','62','65','0','-2556.49','4106.29','1.74147','4.38846','2751:0 2753:0 2790:0 '),\n('2753','tero336','530','3519','3519','62','65','0','-2371.13','4150.23','2.76251','3.40672','2752:0 2754:0 2763:0 '),\n('2754','tero337','530','3519','3519','62','65','0','-2284.4','4192.35','1.1876','3.57951','2753:0 2755:0 2763:0 '),\n('2755','tero338','530','3519','3675','62','65','0','-2258.83','4242.98','1.82659','4.04289','2754:0 2756:0 2763:0 '),\n('2756','tero339','530','3519','3519','62','65','0','-2454.44','4246.04','1.04828','6.28128','2755:0 2757:0 '),\n('2757','tero340','530','3519','3519','62','65','4','-2553.08','4300.19','21.2595','5.70952','2756:0 2758:0 '),\n('2758','tero341','530','3519','3683','62','65','5','-2594.46','4387.9','29.7655','5.39144','2757:0 2759:0 '),\n('2759','tero342','530','3519','3683','62','65','5','-2656.03','4422.89','36.1553','5.66241','2758:0 2760:0 '),\n('2760','tero343','530','3519','3683','62','65','4','-2719.28','4376.75','22.1052','0.28636','2759:0 2761:0 '),\n('2761','tero344','530','3519','3697','62','65','0','-2834.82','4335.44','5.95973','3.39654','2760:0 2762:0 '),\n('2762','tero345','530','3519','3697','62','65','0','-2909.54','4349.69','0.308415','2.08492','2761:0 2703:0 '),\n('2763','tero346','530','3519','3675','62','65','0','-2170.52','4243.01','5.56803','3.39654','2753:0 2754:0 2755:0 2764:0 2822:0 '),\n('2764','tero347','530','3519','3675','62','65','0','-2148.84','4189.65','7.46099','4.90842','2763:0 2765:0 2766:0 2822:0 '),\n('2765','tero348','530','3519','3519','62','65','0','-2169.46','4024.43','0.27975','4.58248','2764:0 2788:0 2793:0 '),\n('2766','tero349','530','3519','3675','62','65','0','-2043.89','4276.14','4.85305','3.85599','2764:0 2767:0 2780:0 2822:0 '),\n('2767','tero350','530','3519','3519','62','65','0','-2003.56','4443.33','7.66134','1.22491','2766:0 2768:0 2780:0 2785:0 2822:0 '),\n('2768','tero351','530','3519','3674','62','65','0','-1957.79','4600.09','4.55853','1.42126','2767:0 2769:0 2777:0 2780:0 2785:0 '),\n('2769','tero352','530','3519','3674','62','65','0','-1958.96','4765.62','-1.86355','1.51943','2768:0 2770:0 2785:0 2787:0 '),\n('2770','tero353','530','3519','3519','62','65','0','-1920.31','4893.8','2.58999','4.29189','2769:0 2681:0 2771:0 2787:0 '),\n('2771','tero354','530','3519','3674','62','65','0','-1767.42','4808.53','10.9381','2.60326','2770:0 2772:0 '),\n('2772','tero355','530','3519','3519','62','65','0','-1610.9','4687.94','-0.462587','3.37452','2771:0 2773:0 '),\n('2773','tero356','530','3519','3519','62','65','0','-1438.54','4646.53','23.7191','3.09413','2772:0 2774:0 '),\n('2774','tero357','530','3519','3689','62','65','0','-1505.3','4470.55','41.7643','1.30342','2773:0 2775:0 2779:0 '),\n('2775','tero358','530','3519','3674','62','65','0','-1652.18','4568.13','2.67411','5.85088','2774:0 2776:0 '),\n('2776','tero359','530','3519','3674','62','65','0','-1796.78','4588.16','10.9079','6.12577','2775:0 2777:0 2778:0 2780:0 '),\n('2777','tero360','530','3519','3674','62','65','0','-1895.32','4551.89','11.162','0.506242','2776:0 2768:0 2778:0 2780:0 2785:0 '),\n('2778','tero361','530','3519','3689','62','65','0','-1732.56','4448.64','2.34425','5.26889','2777:0 2776:0 2779:0 2780:0 '),\n('2779','tero362','530','3519','3689','62','65','0','-1608.22','4353.23','36.5945','1.16519','2778:0 2774:0 '),\n('2780','tero363','530','3519','3519','62','65','0','-1921.27','4373.25','1.92765','2.16501','2766:0 2767:0 2768:0 2776:0 2777:0 2778:0 2781:0 2822:0 '),\n('2781','tero364','530','3519','3519','62','65','0','-1840.29','4219.11','25.1803','2.004','2780:0 2782:0 2822:0 '),\n('2782','tero365','530','3519','3519','62','65','0','-1752.97','4184.94','57.0737','5.13381','2781:0 2783:0 2822:0 '),\n('2783','tero366','530','3519','3858','62','65','0','-1716.88','4074.81','63.5817','4.67042','2782:0 2784:0 '),\n('2784','tero367','530','3519','3858','62','65','0','-1691.82','3935.7','48.2267','4.84636','2783:0 2465:0 '),\n('2785','tero368','530','3519','3519','62','65','0','-2102.76','4635.13','-7.65692','2.95747','2767:0 2768:0 2769:0 2777:0 2786:0 '),\n('2786','tero369','530','3519','3519','62','65','0','-2257.36','4704.28','-0.0780256','1.2021','2785:0 '),\n('2787','tero370','530','3519','3519','62','65','0','-2070.88','4924.17','13.5597','3.10277','2680:0 2681:0 2682:0 2683:0 2684:0 2769:0 2770:0 '),\n('2788','tero371','530','3519','3519','62','65','0','-2246.8','3880.41','2.21742','1.23746','2765:0 2789:0 2793:0 '),\n('2789','tero372','530','3519','3519','62','65','0','-2340.28','3972.87','-13.2572','5.73387','2788:0 2790:0 2793:0 '),\n('2790','tero373','530','3519','3519','62','65','0','-2488.61','4019.54','0.242718','5.94199','2789:0 2752:0 2792:0 '),\n('2791','tero374','530','3519','3860','62','65','0','-2554.91','3912.09','9.61175','2.80825','2751:0 2792:0 '),\n('2792','tero375','530','3519','3860','62','65','0','-2485.03','3909.12','5.70774','1.75582','2791:0 2790:0 '),\n('2793','tero376','530','3519','3519','62','65','0','-2259.61','3793.94','0.912792','1.33958','2765:0 2788:0 2789:0 2794:0 2817:0 '),\n('2794','tero377','530','3519','3519','62','65','0','-2386.92','3640.31','1.09836','4.00208','2793:0 2795:0 2804:0 '),\n('2795','tero378','530','3519','3519','62','65','0','-2479.53','3552.42','1.40969','5.89488','2794:0 2796:0 2805:0 '),\n('2796','tero379','530','3519','3519','62','65','0','-2345.97','3468.35','-9.89249','2.70223','2795:0 2797:0 2805:0 '),\n('2797','tero380','530','3519','3519','62','65','0','-2312.38','3409.64','-11.2993','4.48901','2796:0 2798:0 '),\n('2798','tero381','530','3519','3681','62','65','0','-2354.51','3272.69','-1.60544','1.28851','2797:0 2799:0 '),\n('2799','tero382','530','3519','3681','62','65','0','-2370.38','3203.41','-1.58182','4.34763','2798:0 2800:0 2808:0 '),\n('2800','tero383','530','3519','3681','62','65','0','-2266.46','3160.45','-5.07597','2.81611','2799:0 2801:0 '),\n('2801','tero384','530','3519','3519','62','65','0','-2151','3259.96','-30.9173','0.993986','2800:0 2802:0 '),\n('2802','tero385','530','3519','3519','62','65','0','-2122.05','3416.4','-46.8967','4.54007','2801:0 2803:0 2817:0 '),\n('2803','tero386','530','3519','3519','62','65','0','-2185.17','3533.98','-39.5174','5.06236','2802:0 2804:0 2817:0 '),\n('2804','tero387','530','3519','3519','62','65','0','-2281.3','3632.39','-12.7757','5.10555','2803:0 2794:0 2817:0 '),\n('2805','tero388','530','3519','3519','62','65','0','-2591.73','3492.79','0.37378','0.569874','2795:0 2796:0 2806:0 '),\n('2806','tero389','530','3519','3519','62','65','0','-2706.59','3361.89','-0.445352','4.0649','2805:0 2807:0 2809:0 2810:0 '),\n('2807','tero390','530','3519','3519','62','65','0','-2599.6','3260.29','1.92252','2.39202','2806:0 2808:0 2809:0 '),\n('2808','tero391','530','3519','3519','62','65','0','-2474.91','3212.52','3.71098','0.644506','2807:0 2799:0 '),\n('2809','tero392','530','3519','3519','62','65','0','-2789.26','3261.1','5.82088','0.813367','2806:0 2807:0 3580:0 '),\n('2810','tero393','530','3519','3685','62','65','0','-2834.79','3413.38','-40.4077','5.88312','2806:0 2811:0 2816:0 '),\n('2811','tero394','530','3519','3519','62','65','0','-2792.39','3494.53','-29.9885','3.12636','2810:0 2812:0 '),\n('2812','tero395','530','3519','3685','62','65','0','-2893.22','3498.45','-28.8532','2.48233','2811:0 2813:0 '),\n('2813','tero396','530','3519','3685','62','65','0','-2966.27','3553.99','-6.76611','5.48021','2812:0 2814:0 '),\n('2814','tero397','530','3519','3685','62','65','0','-2986.16','3462.38','0.040144','1.25475','2813:0 2815:0 '),\n('2815','tero398','530','3519','3685','62','65','0','-2966.04','3366.93','-1.18287','0.0020256','2814:0 2816:0 '),\n('2816','tero399','530','3519','3519','62','65','0','-2877.47','3356.32','-19.7096','2.96298','2815:0 2810:0 '),\n('2817','tero400','530','3519','3519','62','65','0','-2096.95','3654.03','-54.8181','4.15287','2793:0 2802:0 2803:0 2804:0 2818:0 '),\n('2818','tero401','530','3519','3519','62','65','0','-2064.06','3807.53','1.04682','4.11754','2817:0 2819:0 '),\n('2819','tero402','530','3519','3676','62','65','0','-1908.63','3920.4','-2.85436','0.610731','2818:0 2820:0 2821:0 '),\n('2820','tero403','530','3519','3519','62','65','0','-1975.78','4077.99','-0.0257859','4.60841','2819:0 2821:0 2822:0 '),\n('2821','tero404','530','3519','3676','62','65','0','-2060.38','3925.05','-0.749629','0.524347','2820:0 2819:0 '),\n('2822','tero405','530','3519','3519','62','65','0','-1932.67','4229.67','0.0246133','4.45526','2763:0 2764:0 2766:0 2767:0 2780:0 2781:0 2782:0 2820:0 '),\n('2823','nag406','530','3518','3788','62','65','0','-2979.16','5983.95','6.75645','5.87684','2742:0 2743:0 2824:0 '),\n('2824','nag407','530','3518','3788','64','67','0','-2903.9','5958.93','14.5613','0.547909','2823:0 2825:0 '),\n('2825','nag408','530','3518','3788','64','67','0','-2695.32','6074.17','39.2839','0.398684','2824:0 2826:0 '),\n('2826','nag409','530','3518','3518','64','67','0','-2642.01','6196.52','35.4889','4.38459','2825:0 2827:0 2830:0 '),\n('2827','nag410','530','3518','3610','64','67','0','-2584.26','6153','22.5432','1.45591','2826:0 2828:0 2878:0 '),\n('2828','nag411','530','3518','3518','64','67','0','-2469.6','6354.46','29.3999','3.93692','2827:0 2829:0 2848:0 2868:0 '),\n('2829','nag412','530','3518','3518','64','67','0','-2598.81','6353.52','38.4982','4.67519','2828:0 2830:0 2848:0 '),\n('2830','nag413','530','3518','3518','64','67','0','-2647.16','6298.81','39.1645','4.36889','2829:0 2826:0 2831:0 '),\n('2831','nag414','530','3518','3518','64','67','0','-2698.48','6403.1','37.6375','5.24131','2830:0 2832:0 '),\n('2832','nag416','530','3518','3637','64','67','0','-2811.55','6437.45','63.1489','2.87099','2833:0 2834:0 2838:0 2831:0 '),\n('2833','nag417','530','3518','3637','64','67','0','-2883.12','6557.15','51.9561','5.05205','2832:0 2836:0 2839:0 '),\n('2834','nag418','530','3518','3637','64','67','0','-2866.92','6391.89','80.9253','0.732363','2832:0 2835:0 '),\n('2835','nag419','530','3518','3637','64','67','0','-2947.68','6377.55','94.6931','0.234009','2834:0 2836:0 2837:0 '),\n('2836','nag420','530','3518','3637','64','67','0','-2933.99','6526.24','74.3112','5.85317','2833:0 2835:0 '),\n('2837','nag421','530','3518','3637','64','67','0','-2858.26','6300.73','73.5168','2.16181','2835:0 2838:0 '),\n('2838','nag422','530','3518','3637','64','67','0','-2800.78','6320.06','63.9422','1.52171','2837:0 2832:0 '),\n('2839','nag423','530','3518','3518','64','67','0','-2813.58','6624.23','27.952','0.826629','2833:0 2840:0 2843:0 '),\n('2840','nag424','530','3518','3518','64','67','0','-2876.27','6701.94','18.9403','5.46206','2839:0 2841:0 '),\n('2841','nag425','530','3518','3518','64','67','0','-2695.5','6579.52','23.3102','2.71395','2840:0 2842:0 '),\n('2842','nag426','530','3518','3518','64','67','0','-2618.02','6729.9','-1.1338','4.0884','2841:0 2843:0 '),\n('2843','nag427','530','3518','3518','64','67','0','-2762.9','6813.59','-4.67732','4.5989','2839:0 2842:0 2844:0 2979:0 '),\n('2844','nag428','530','3518','3518','64','67','0','-2754.65','6993.51','-7.49834','4.92564','2843:0 2845:0 2979:0 2980:0 '),\n('2845','nag429','530','3518','3518','64','67','0','-2554.45','7061.91','-8.95898','0.31535','2844:0 2846:0 2849:0 '),\n('2846','nag430','530','3518','3518','64','67','0','-2401.18','6918.47','-1.9365','5.18482','2845:0 2847:0 2849:0 2860:0 2871:0 '),\n('2847','nag431','530','3518','3518','64','67','0','-2443.4','6718.82','0.5495','4.75286','2846:0 2848:0 2870:0 '),\n('2848','nag432','530','3518','3518','64','67','0','-2465.96','6485.46','18.388','4.48583','2847:0 2828:0 2829:0 '),\n('2849','nag433','530','3518','3518','64','67','0','-2495.17','7067.29','-6.61379','5.16519','2845:0 2846:0 2850:0 2860:0 '),\n('2850','nag434','530','3518','3518','64','67','2','-2545.1','7142.88','17.2089','5.26259','2849:0 2851:0 '),\n('2851','nag435','530','3518','3626','64','67','3','-2587.61','7240.05','13.2805','5.09373','2850:0 2852:0 2853:0 '),\n('2852','nag436','530','3518','3626','64','67','2','-2552.46','7299.13','13.4929','4.96416','2851:0 2855:0 '),\n('2853','nag437','530','3518','3626','64','67','2','-2670.89','7210.11','23.8723','0.310654','2851:0 2854:0 '),\n('2854','nag438','530','3518','3626','64','67','3','-2655.58','7280.08','30.7964','4.57931','2853:0 '),\n('2855','nag439','530','3518','3626','64','67','2','-2487.77','7333.59','-15.1601','0.389211','2852:0 2856:0 '),\n('2856','nag440','530','3518','3518','64','67','2','-2287.49','7419.75','-15.9035','3.46169','2855:0 2857:0 2913:0 '),\n('2857','nag441','530','3518','3518','64','67','0','-2167.73','7320.37','-34.5989','5.71198','2856:0 2912:0 2858:0 '),\n('2858','nag443','530','3518','3705','64','67','0','-2271.92','7267.29','-57.0529','4.8127','2859:0 2857:0 '),\n('2859','nag444','530','3518','3705','64','67','0','-2261.19','7161.5','-56.5907','4.81663','2860:0 2861:0 2858:0 '),\n('2860','nag445','530','3518','3518','64','67','0','-2347.48','7041.26','-12.5344','2.817','2859:0 2846:0 2849:0 '),\n('2861','nag447','530','3518','3705','64','67','0','-2116.24','7209.42','-112.779','5.97431','2859:0 2862:0 '),\n('2862','nag448','530','3518','3705','64','67','0','-1904.26','7175.34','-92.9691','3.12725','2863:0 2861:0 '),\n('2863','nag449','530','3518','3705','64','67','0','-1985.26','6900.65','-85.609','5.34993','2862:0 2864:0 '),\n('2864','nag450','530','3518','3518','64','67','0','-1848.57','6696.54','-53.151','5.40883','2863:0 2865:0 2872:0 '),\n('2865','nag451','530','3518','3518','64','67','0','-1730.63','6547.09','19.5667','5.00434','2864:0 2866:0 2872:0 2885:0 2889:0 '),\n('2866','nag452','530','3518','3518','64','67','0','-1929.46','6510.46','16.1863','2.96231','2865:0 2867:0 2885:0 2974:0 '),\n('2867','nag453','530','3518','3638','64','67','0','-2134.61','6517.76','14.0285','6.16673','2866:0 2868:0 2869:0 2885:0 '),\n('2868','nag454','530','3518','3518','64','67','0','-2312.35','6407.62','22.8307','0.6603','2867:0 2828:0 2869:0 '),\n('2869','nag455','530','3518','3518','64','67','0','-2275.72','6586.73','3.55526','5.16535','2868:0 2867:0 2870:0 2877:0 '),\n('2870','nag456','530','3518','3518','64','67','0','-2337.25','6706.87','-0.736603','5.08052','2869:0 2847:0 '),\n('2871','nag457','530','3518','3518','64','67','0','-2230.6','6874.1','-6.45156','5.78973','2846:0 '),\n('2872','nag458','530','3518','3518','64','67','0','-1596.41','6719.35','6.94102','2.95446','2865:0 2864:0 2873:0 2889:0 '),\n('2873','nag459','530','3518','3518','64','67','0','-1749.49','6887.02','-31.8672','3.0919','2872:0 2874:0 2902:0 '),\n('2874','nag460','530','3518','3705','64','67','0','-2033.22','6893.42','-39.0869','0.112087','2873:0 2875:0 '),\n('2875','nag461','530','3518','3638','64','67','0','-2099.87','6812.26','-29.9742','0.936751','2874:0 2876:0 '),\n('2876','nag462','530','3518','3638','64','67','0','-2097.69','6747.79','-3.22856','3.89457','2875:0 2877:0 '),\n('2877','nag463','530','3518','3638','64','67','0','-2181.79','6690.97','-0.800369','0.623385','2876:0 2869:0 '),\n('2878','nag464','530','3518','3610','64','67','0','-2569.73','6270.11','18.4891','5.91894','2827:0 2879:0 '),\n('2879','nag465','530','3518','3610','64','67','0','-2480.31','6262.64','30.7263','5.11194','2878:0 2880:0 '),\n('2880','nag466','530','3518','3610','64','67','0','-2447.6','6170.75','50.9756','3.42333','2879:0 2881:0 '),\n('2881','nag467','530','3518','3610','64','67','0','-2505.35','6175.86','59.938','5.6892','2880:0 2882:0 '),\n('2882','nag468','530','3518','3610','64','67','0','-2439.68','6122.93','84.0967','2.43372','2881:0 2883:0 '),\n('2883','nag469','530','3518','3610','64','67','0','-2332.91','6161.97','53.5534','0.177271','2882:0 2884:0 '),\n('2884','nag470','530','3518','3610','64','67','0','-2259.12','6100.84','76.839','2.48242','2883:0 '),\n('2885','nag471','530','3518','3518','64','67','0','-1938.01','6408.13','38.4565','3.95504','2865:0 2866:0 2867:0 2886:0 2974:0 '),\n('2886','nag472','530','3518','3518','64','67','0','-2080.87','6349.27','43.0054','5.9188','2885:0 2887:0 2974:0 '),\n('2887','nag473','530','3518','3634','64','67','0','-1853.87','6319.73','46.4678','2.96543','2886:0 2888:0 2974:0 '),\n('2888','nag474','530','3518','3518','64','67','0','-1699.25','6393.14','40.5718','0.499271','2887:0 2889:0 2973:0 '),\n('2889','nag475','530','3518','3518','64','67','0','-1534.13','6557.83','19.5951','2.01038','2872:0 2888:0 2865:0 2890:0 2973:0 '),\n('2890','nag476','530','3518','3518','64','67','0','-1482.81','6727.6','24.7441','1.27603','2889:0 2891:0 '),\n('2891','nag477','530','3518','3518','64','67','0','-1390.93','6854.77','28.5326','0.624149','2890:0 2902:0 2899:0 '),\n('2892','nag480','530','3518','3613','64','67','4','-1409.34','7112.02','33.814','1.09183','2893:0 2899:0 '),\n('2893','nag481','530','3518','3613','64','67','5','-1329.62','7212.68','33.1588','0.853479','2892:0 2894:0 2901:0 '),\n('2894','nag482','530','3518','3613','64','67','4','-1270.74','7314.59','33.6816','4.21027','2893:0 2895:0 '),\n('2895','nag483','530','3518','3613','64','67','4','-1220.36','7373.07','33.23','4.20635','2894:0 2896:0 2897:0 '),\n('2896','nag484','530','3518','3518','64','67','0','-1212.08','7477.88','22.0868','1.54857','2895:0 2908:0 2972:0 '),\n('2897','nag485','530','3518','3613','64','67','4','-1182.14','7317.1','34.1095','4.44589','2895:0 2898:0 '),\n('2898','nag486','530','3518','3613','64','67','4','-1195.71','7212.96','50.7515','1.47708','2897:0 2900:0 '),\n('2899','nag487','530','3518','3613','64','67','4','-1266.65','6971.73','37.8915','2.73527','2891:0 2892:0 2900:0 '),\n('2900','nag488','530','3518','3613','64','67','5','-1222.4','7167.59','57.2656','4.44744','2898:0 2901:0 2899:0 '),\n('2901','nag489','530','3518','3613','64','67','4','-1276.87','7200.65','48.3758','5.06006','2893:0 2900:0 '),\n('2902','nag491','530','3518','3518','64','67','0','-1550.75','6994.79','2.3684','5.6216','2891:0 2873:0 2903:0 '),\n('2903','nag492','530','3518','3518','64','67','0','-1663.57','7019.01','0.239528','1.55716','2902:0 2904:0 2910:0 '),\n('2904','nag493','530','3518','3518','64','67','0','-1624.79','7247.01','1.99533','4.52597','2903:0 2905:0 2910:0 '),\n('2905','nag494','530','3518','3518','64','67','0','-1561.04','7386.09','1.02012','0.650024','2904:0 2906:0 2909:0 '),\n('2906','nag495','530','3518','3518','64','67','0','-1369.87','7525.98','8.40119','6.06534','2905:0 2907:0 3014:0 '),\n('2907','nag496','530','3518','3628','64','67','0','-1342.35','7749.72','-4.85434','4.51025','2906:0 2908:0 3005:0 '),\n('2908','nag497','530','3518','3518','64','67','0','-1244.21','7675','9.34848','4.90297','2907:0 2896:0 2965:0 '),\n('2909','nag498','530','3518','3518','64','67','0','-1822.25','7460.83','-6.36199','6.02215','2905:0 2910:0 3017:0 '),\n('2910','nag499','530','3518','3518','64','67','0','-1788.32','7255.55','-7.10964','1.73702','2909:0 2904:0 2903:0 2911:0 '),\n('2911','nag500','530','3518','3518','64','67','0','-1876.28','7247.82','-15.0226','2.58134','2910:0 2912:0 '),\n('2912','nag501','530','3518','3518','64','67','0','-2010.2','7318.56','-33.8028','5.83525','2911:0 2857:0 '),\n('2913','nag502','530','3518','3518','64','67','0','-2284.88','7613.96','-8.38883','4.91632','2856:0 2914:0 2915:0 2928:0 '),\n('2914','nag503','530','3518','3518','64','67','0','-2110.77','7507.01','-30.9661','2.75255','2913:0 '),\n('2915','nag504','530','3518','3518','64','67','0','-2280.53','7760.34','-25.2768','3.08634','2913:0 2916:0 2928:0 2999:0 '),\n('2916','nag505','530','3518','3631','64','67','0','-2202.48','7982.31','-19.9501','4.31156','2915:0 2917:0 2930:0 2999:0 '),\n('2917','nag506','530','3518','3518','64','67','0','-2164.5','8163.38','-23.2432','1.37024','2916:0 2918:0 2930:0 2995:0 '),\n('2918','nag507','530','3518','3518','64','67','0','-2186.27','8355.19','-20.7293','1.74723','2917:0 2919:0 2931:0 2995:0 '),\n('2919','nag508','530','3518','3518','64','67','0','-2261.53','8552.19','-18.4527','1.93573','2918:0 2920:0 2931:0 2932:0 2933:0 '),\n('2920','nag509','530','3518','3631','64','67','0','-2454.9','8618.3','-25.5244','2.80359','2919:0 2921:0 2932:0 '),\n('2921','nag510','530','3518','3518','64','67','0','-2638.28','8663.06','-21.4046','2.94104','2920:0 2922:0 2932:0 '),\n('2922','nag511','530','3518','3631','64','67','0','-2824.97','8623.37','-27.21','4.0995','2921:0 2923:0 '),\n('2923','nag512','530','3518','3518','64','67','0','-2867.65','8450.08','-30.1391','4.44507','2922:0 2924:0 '),\n('2924','nag513','530','3518','3631','64','67','0','-2899.04','8250.79','-34.7269','4.57858','2923:0 2925:0 '),\n('2925','nag514','530','3518','3518','64','67','0','-2888.4','8048.68','-26.7216','5.47001','2924:0 2926:0 '),\n('2926','nag515','530','3518','3518','64','67','0','-2777.53','7867.47','-33.0086','5.33648','2925:0 2927:0 2984:0 '),\n('2927','nag516','530','3518','3518','64','67','0','-2646.42','7719.28','-30.5333','5.53675','2926:0 2928:0 2929:0 2984:0 '),\n('2928','nag517','530','3518','3518','64','67','0','-2469.37','7698.03','-17.5014','0.0114679','2915:0 2927:0 2913:0 2929:0 '),\n('2929','nag518','530','3518','3631','64','67','0','-2548.6','7872.59','-53.4948','1.39927','2928:0 2927:0 2930:0 '),\n('2930','nag519','530','3518','3631','64','67','0','-2377.16','8119.54','-42.3084','5.94673','2929:0 2916:0 2917:0 2931:0 '),\n('2931','nag520','530','3518','3631','64','67','0','-2383.8','8337.19','-39.2254','0.68063','2930:0 2918:0 2919:0 2932:0 '),\n('2932','nag521','530','3518','3631','64','67','0','-2489.29','8499.84','-36.8544','3.07375','2931:0 2920:0 2919:0 2921:0 '),\n('2933','nag522','530','3518','3518','64','67','0','-2206.87','8693.03','-3.10935','4.27148','2919:0 2934:0 2985:0 '),\n('2934','nag523','530','3518','3518','64','67','1','-2042.46','8705.35','18.0019','0.174061','2933:0 2935:0 '),\n('2935','nag524','530','3518','3518','64','67','0','-1841.7','8722.11','25.2892','5.96245','2934:0 2936:0 '),\n('2936','nag525','530','3518','3518','64','67','0','-1640.31','8750.19','32.1406','6.19414','2935:0 2937:0 2959:0 2987:0 '),\n('2937','nag526','530','3518','3518','64','67','0','-1515.41','8730.96','27.2727','5.36163','2936:0 2938:0 2959:0 2940:0 '),\n('2938','nag527','530','3518','3518','64','67','0','-1371.92','8548.95','11.8041','3.728','2937:0 2939:0 2944:0 2950:0 '),\n('2939','nag528','530','3518','3622','64','67','0','-1460.34','8490.57','4.09139','0.714427','2938:0 2943:0 3011:0 '),\n('2940','nag530','530','3518','3622','64','67','0','-1570.36','8600.16','4.98091','3.67147','2937:0 2941:0 2943:0 '),\n('2941','nag531','530','3518','3622','64','67','0','-1642.07','8541.56','-12.6482','5.37185','2942:0 2940:0 '),\n('2942','nag532','530','3518','3622','64','67','0','-1595.85','8476.21','-11.7076','0.541643','2941:0 2943:0 '),\n('2943','nag533','530','3518','3622','64','67','0','-1526.1','8519.38','1.01318','3.57721','2942:0 2939:0 2940:0 '),\n('2944','nag534','530','3518','3518','64','67','0','-1207.6','8431.13','20.2568','5.9334','2938:0 2945:0 2950:0 '),\n('2945','nag535','530','3518','3518','64','67','0','-1095.6','8405.41','20.4451','5.79204','2944:0 2946:0 2950:0 '),\n('2946','nag536','530','3518','3518','64','67','0','-953.793','8333.32','22.8678','0.0193606','2945:0 2947:0 2962:0 '),\n('2947','nag537','530','3518','3518','64','67','0','-745.188','8393.11','33.9484','0.313885','2946:0 2948:0 '),\n('2948','nag538','530','3518','3763','64','67','0','-588.034','8447.14','64.625','6.12976','2947:0 2949:0 '),\n('2949','nag539','530','3518','3763','64','67','0','-494.831','8433.32','38.1295','6.07479','2948:0 2585:0 '),\n('2950','nag540','530','3518','3518','64','67','0','-1168.9','8591.89','36.759','1.21709','2938:0 2944:0 2945:0 2951:0 2961:0 '),\n('2951','nag541','530','3518','3617','64','67','0','-1067.77','8749.39','84.4276','1.60586','2950:0 2952:0 '),\n('2952','nag542','530','3518','3617','64','67','0','-1080.66','8823.02','100.874','1.41736','2951:0 2953:0 '),\n('2953','nag543','530','3518','3617','64','67','0','-1090.98','8945.42','103.447','0.588767','2952:0 2954:0 '),\n('2954','nag544','530','3518','3617','64','67','0','-963.69','8887.28','146.6','3.44055','2953:0 2955:0 '),\n('2955','nag545','530','3518','3617','64','67','0','-868.709','8940.17','156.257','5.74571','2954:0 2956:0 '),\n('2956','nag546','530','3518','3617','64','67','0','-752.326','8861.16','182.978','4.2134','2955:0 2957:0 2958:0 '),\n('2957','nag547','530','3518','3617','64','67','0','-651.777','8791','201.252','0.180777','2956:0 '),\n('2958','nag553','530','3518','3617','64','67','0','-902.893','8685.38','170.054','1.29602','2956:0 '),\n('2959','nag554','530','3518','3625','64','67','0','-1431.81','8885.86','36.9729','1.07333','2936:0 2937:0 2960:0 2994:0 '),\n('2960','nag555','530','3518','3625','64','67','0','-1305.49','8958.42','58.5828','5.24728','2959:0 2961:0 '),\n('2961','nag556','530','3518','3518','64','67','0','-1225.12','8803.57','39.6271','4.88207','2960:0 2950:0 '),\n('2962','nag557','530','3518','3518','64','67','0','-968.504','8169.97','14.3663','5.25514','2946:0 2963:0 '),\n('2963','nag558','530','3518','3518','64','67','0','-917.128','8072.21','21.4411','5.19624','2962:0 2964:0 2966:0 '),\n('2964','nag559','530','3518','3518','64','67','0','-1020.93','7945.51','22.9619','4.026','2963:0 2965:0 2966:0 '),\n('2965','nag560','530','3518','3518','64','67','0','-1146.56','7828.51','14.0417','4.1548','2964:0 2908:0 '),\n('2966','nag561','530','3518','3616','64','67','0','-852.563','7887.28','40.6401','4.6339','2963:0 2964:0 2967:0 '),\n('2967','nag562','530','3518','3616','64','67','0','-830.358','7797.91','38.3027','4.69279','2966:0 2968:0 '),\n('2968','nag563','530','3518','3616','64','67','0','-829.954','7695.84','37.7371','5.2465','2967:0 2969:0 '),\n('2969','nag564','530','3518','3616','64','67','0','-783.358','7540.05','60.9113','5.00303','2968:0 2970:0 '),\n('2970','nag565','530','3518','3518','64','67','0','-763.166','7451.73','58.8323','4.56714','2969:0 2971:0 '),\n('2971','nag566','530','3518','3518','64','67','0','-933.691','7394.83','34.4282','3.14949','2970:0 2972:0 '),\n('2972','nag567','530','3518','3518','64','67','0','-1090.44','7395.57','33.0234','2.48583','2971:0 2896:0 '),\n('2973','nag568','530','3518','3518','64','67','1','-1409.72','6385.4','38.2999','5.37255','2671:0 2888:0 2889:0 '),\n('2974','nag569','530','3518','3634','64','67','0','-2075.76','6274.62','62.3128','0.289453','2866:0 2885:0 2886:0 2887:0 2975:0 '),\n('2975','nag571','530','3518','3518','64','67','0','-2094.97','6179.79','87.9183','1.00219','2974:0 2976:0 '),\n('2976','nag572','530','3518','3761','64','67','0','-2030.06','6071.21','119.672','4.93705','2977:0 2975:0 '),\n('2977','nag573','530','3518','3761','64','67','0','-2001.22','5972.22','151.597','6.26043','2976:0 2978:0 '),\n('2978','nag574','530','3518','3761','64','67','0','-1946.52','5928.39','150.948','1.91915','2977:0 '),\n('2979','nag575','530','3518','3518','64','67','0','-2897.91','6988.92','-35.6052','0.23407','2843:0 2844:0 2980:0 '),\n('2980','nag576','530','3518','3518','64','67','0','-2847.89','7102.5','-8.05767','2.77876','2979:0 2844:0 2981:0 '),\n('2981','nag577','530','3518','3518','64','67','0','-2912.74','7175.13','-2.27885','1.70277','2980:0 2982:0 '),\n('2982','nag578','530','3518','3518','64','67','0','-2935.1','7301.43','3.27707','1.53784','2981:0 2983:0 '),\n('2983','nag579','530','3518','3518','64','67','0','-2902.48','7467.17','2.79586','1.43181','2982:0 2984:0 '),\n('2984','nag580','530','3518','3518','64','67','0','-2802.19','7645.35','-6.45531','0.870248','2983:0 2926:0 2927:0 '),\n('2985','nag581','530','3518','3633','64','67','0','-2196.09','8827.81','16.1506','4.59461','2933:0 2986:0 '),\n('2986','nag582','530','3518','3633','64','67','0','-2071.65','8894.1','28.0157','0.506613','2985:0 2987:0 '),\n('2987','nag583','530','3518','3518','64','67','0','-1884.01','8889.41','36.2099','5.7138','2936:0 2986:0 2988:0 '),\n('2988','nag584','530','3518','3518','64','67','0','-1916.54','9091.13','52.9111','1.74753','2987:0 2989:0 '),\n('2989','nag585','530','3518','3624','64','67','0','-1849.22','9237.75','70.9999','5.57243','2988:0 2990:0 '),\n('2990','nag586','530','3518','3624','64','67','0','-1755.41','9160.76','79.5049','5.59599','2989:0 2991:0 '),\n('2991','nag587','530','3518','3518','64','67','0','-1651.3','9137.62','86.3008','5.99261','2990:0 2992:0 '),\n('2992','nag588','530','3518','3518','64','67','0','-1545.69','9099.13','82.8122','5.48996','2991:0 2993:0 '),\n('2993','nag589','530','3518','3625','64','67','0','-1448.69','9002.9','57.299','5.25434','2992:0 2994:0 '),\n('2994','nag590','530','3518','3625','64','67','0','-1419.87','8948.03','58.9144','6.12613','2993:0 2959:0 '),\n('2995','nag591','530','3518','3518','64','67','0','-2052.37','8225.22','-6.54776','2.94922','2917:0 2918:0 2996:0 '),\n('2996','nag592','530','3518','3518','64','67','0','-1986.35','8210.53','0.797534','4.84989','2995:0 2997:0 3000:0 '),\n('2997','nag593','530','3518','3518','64','67','0','-2024.61','8154.98','1.25254','4.1077','2996:0 2998:0 '),\n('2998','nag594','530','3518','3518','64','67','0','-2103.83','8063.36','2.18912','4.10771','2997:0 2999:0 '),\n('2999','nag595','530','3518','3518','64','67','0','-2156.48','7911.49','-11.2008','4.37866','2998:0 2916:0 2915:0 '),\n('3000','nag596','530','3518','3628','64','67','0','-1840.26','7999.74','-24.7446','2.3484','2996:0 3001:0 '),\n('3001','nag597','530','3518','3628','64','67','0','-1746.01','7996.18','-27.0075','3.06865','3000:0 3002:0 '),\n('3002','nag598','530','3518','3628','64','67','0','-1653.08','7993.42','-26.6535','6.25344','3001:0 3006:0 '),\n('3003','nag600','530','3518','3628','64','67','0','-1550.22','7929.2','-21.6393','6.03352','3004:0 3006:0 '),\n('3004','nag601','530','3518','3628','64','67','0','-1483.84','7905.42','-19.2864','5.65261','3003:0 3005:0 '),\n('3005','nag602','530','3518','3628','64','67','0','-1404.2','7842.35','-18.1886','5.40914','3004:0 2907:0 '),\n('3006','nag603','530','3518','3628','64','67','0','-1554.58','7990.68','-21.1856','3.99937','3002:0 3003:0 3007:0 3008:0 '),\n('3007','nag604','530','3518','3628','64','67','0','-1601.1','7865.59','-22.0744','4.70386','3012:0 3006:0 '),\n('3008','nag605','530','3518','3628','64','67','0','-1478.18','8079.45','-21.4921','0.88839','3009:0 3006:0 '),\n('3009','nag606','530','3518','3518','64','67','0','-1517.43','8229.34','-15.3084','1.82694','3008:0 3010:0 '),\n('3010','nag607','530','3518','3622','64','67','0','-1508.91','8347.15','-12.1475','1.98089','3009:0 3011:0 '),\n('3011','nag608','530','3518','3622','64','67','0','-1502.91','8432.5','-0.939562','0.853047','3010:0 2939:0 '),\n('3012','nag609','530','3518','3628','64','67','0','-1604.12','7762.81','-21.7436','1.48608','3007:0 3013:0 3015:0 '),\n('3013','nag610','530','3518','3518','64','67','0','-1587.52','7621.15','-10.2326','4.91826','3012:0 3014:0 3015:0 '),\n('3014','nag611','530','3518','3518','64','67','0','-1475.29','7596.72','-5.21911','5.69972','3013:0 2906:0 3015:0 '),\n('3015','nag612','530','3518','3628','64','67','0','-1647.6','7686.9','-14.3996','0.653543','3013:0 3014:0 3012:0 3016:0 '),\n('3016','nag613','530','3518','3518','64','67','0','-1703.41','7669.14','-14.3192','3.85013','3015:0 3017:0 '),\n('3017','nag614','530','3518','3518','64','67','0','-1781.28','7605.53','-8.7957','3.82657','3016:0 2909:0 '),\n('3018','zang615','530','3521','3521','64','67','0','794.211','5932.33','57.6977','1.47191','2647:0 2648:0 2670:0 3019:0 '),\n('3019','zang616','530','3521','3521','64','67','0','820.771','6049.46','79.8283','4.84129','3018:0 3020:0 '),\n('3020','bedg617','530','3522','3767','65','70','0','882.952','5919.73','115.632','0.505885','3019:0 3021:0 '),\n('3021','bedg618','530','3522','3767','65','70','0','942.091','5960.21','121.279','0.600133','3020:0 3022:0 '),\n('3022','bedg619','530','3522','3522','65','70','0','1067.62','6060.89','132.716','0.256129','3021:0 3023:0 '),\n('3023','bedg620','530','3522','3522','65','70','0','1132.44','6081.19','153.605','5.97461','3022:0 3024:0 '),\n('3024','bedg621','530','3522','3522','65','70','0','1202.41','6057.05','164.269','5.95105','3023:0 3025:0 '),\n('3025','bedg622','530','3522','3522','65','70','0','1278.35','5993.43','168.127','5.58584','3024:0 3026:0 '),\n('3026','bedg623','530','3522','3522','65','70','0','1406.14','6036.86','152.292','0.476827','3025:0 3027:0 '),\n('3027','bedg624','530','3522','3522','65','70','0','1466.01','6069.6','133.93','6.17882','3026:0 3028:0 '),\n('3028','bedg625','530','3522','3522','65','70','0','1591.09','6047.48','128.651','6.21023','3027:0 3029:0 '),\n('3029','bedg626','530','3522','3768','65','70','0','1713.44','6043.35','143.923','6.2495','3028:0 3030:0 3049:0 '),\n('3030','bedg627','530','3522','3768','65','70','0','1762.72','5869.71','155.631','4.98895','3029:0 3031:0 3049:0 '),\n('3031','bedg628','530','3522','3833','65','70','0','1802.41','5792.15','188.129','6.12384','3030:0 3032:0 '),\n('3032','bedg629','530','3522','3833','65','70','0','1865.39','5786.05','215.307','4.78866','3031:0 3033:0 '),\n('3033','bedg631','530','3522','3833','65','70','0','1882.59','5668.18','256.167','1.82379','3034:0 3037:0 3032:0 '),\n('3034','bedg632','530','3522','3833','65','70','0','2046.5','5630.87','263.828','6.03743','3033:0 3035:0 3036:0 3037:0 3040:0 '),\n('3035','bedg633','530','3522','3922','65','70','0','2186.78','5679.45','267.903','1.53317','3034:0 3236:0 '),\n('3036','bedg634','530','3522','3833','65','70','0','2078.91','5730.76','265.935','3.74408','3034:0 3037:0 '),\n('3037','bedg635','530','3522','3833','65','70','0','1986.76','5663.91','265.451','5.29919','3036:0 3034:0 3033:0 3038:0 '),\n('3038','bedg636','530','3522','3918','65','70','0','1882.53','5595.86','256.211','0.429695','3037:0 3039:0 '),\n('3039','bedg637','530','3522','3918','65','70','3','1913.85','5539.89','265.641','4.76903','3038:0 3040:0 '),\n('3040','bedg638','530','3522','3918','65','70','3','1980.47','5572.14','258.131','2.97243','3039:0 3034:0 3041:0 '),\n('3041','bedg639','530','3522','3833','65','70','0','1818.29','5603','261.471','3.82655','3040:0 3042:0 3048:0 '),\n('3042','bedg640','530','3522','3918','65','70','0','1800.72','5550.99','267.48','2.61311','3041:0 3043:0 3047:0 '),\n('3043','bedg641','530','3522','3919','65','70','0','1708.89','5566.11','265.641','3.36316','3042:0 3047:0 3235:0 '),\n('3044','bedg643','530','3522','3919','65','70','0','1564.28','5423.88','265.088','1.83317','3045:0 3235:0 '),\n('3045','bedg644','530','3522','3919','65','70','0','1534.04','5541.59','258.021','1.3761','3044:0 3046:0 '),\n('3046','bedg645','530','3522','3919','65','70','0','1599.86','5605.47','266.783','0.413989','3045:0 3047:0 '),\n('3047','bedg646','530','3522','3919','65','70','0','1692.34','5649.63','265.597','5.29918','3046:0 3043:0 3042:0 3048:0 '),\n('3048','bedg647','530','3522','3919','65','70','0','1775.77','5678.9','267.502','5.25597','3041:0 3047:0 '),\n('3049','bedg648','530','3522','3768','65','70','0','1827.31','6004.38','138.57','2.3814','3029:0 3030:0 3050:0 '),\n('3050','bedg649','530','3522','3768','65','70','0','1934.89','5992.25','140.661','0.472881','3049:0 3051:0 3087:0 '),\n('3051','bedg650','530','3522','3768','65','70','0','2035.37','6038.3','145.555','3.92079','3050:0 3052:0 3087:0 '),\n('3052','bedg651','530','3522','3768','65','70','0','2098.1','5939.59','137.134','5.31486','3051:0 3053:0 3087:0 '),\n('3053','bedg652','530','3522','3831','65','70','0','2140.78','5883.29','138.074','5.36983','3052:0 3054:0 '),\n('3054','bedg653','530','3522','3831','65','70','0','2169.87','5811.41','120.231','1.97692','3053:0 3055:0 '),\n('3055','bedg654','530','3522','3831','65','70','0','2156.44','5731.77','120.753','4.55303','3054:0 3056:0 '),\n('3056','bedg655','530','3522','3831','65','70','0','2209.5','5671.79','127.813','5.09887','3055:0 3057:0 '),\n('3057','bedg656','530','3522','3831','65','70','0','2242.52','5586.84','144.63','4.98106','3056:0 3058:0 '),\n('3058','bedg657','530','3522','3831','65','70','0','2242.64','5516.54','161.969','4.74938','3057:0 3059:0 '),\n('3059','bedg658','530','3522','3831','65','70','0','2266.32','5460.89','147.107','3.73228','3058:0 3060:0 3061:0 '),\n('3060','bedg659','530','3522','3831','65','70','0','2243.22','5409.52','144.241','3.16286','3061:0 3059:0 '),\n('3061','bedg660','530','3522','3831','65','70','0','2184.26','5427.04','144.314','3.26496','3060:0 3062:0 3059:0 '),\n('3062','bedg661','530','3522','3831','65','70','0','2056.91','5452.67','144.871','3.87757','3061:0 3063:0 '),\n('3063','bedg662','530','3522','3831','65','70','0','1986.16','5372.79','148.912','3.58305','3062:0 3064:0 '),\n('3064','bedg663','530','3522','3831','65','70','0','1869.19','5342.55','144.553','3.39455','3063:0 3065:0 '),\n('3065','bedg664','530','3522','3831','65','70','0','1844.86','5256.68','138.071','1.36038','3064:0 3066:0 '),\n('3066','bedg666','530','3522','3831','65','70','0','1882.44','5202','150.044','6.2809','3065:0 3067:0 '),\n('3067','bedg668','530','3522','3831','65','70','0','1942.47','5157.81','163.104','1.47426','3066:0 3068:0 '),\n('3068','bedg670','530','3522','3831','65','70','0','1859.25','5091.18','146.37','4.69048','3067:0 3069:0 '),\n('3069','bedg672','530','3522','3831','65','70','0','1892.19','4998.98','146.563','5.3777','3070:0 3068:0 '),\n('3070','bedg673','530','3522','3827','65','70','0','1882.75','4918.05','144.661','4.59623','3069:0 3071:0 3079:0 '),\n('3071','bedg674','530','3522','3827','65','70','0','1970.05','4876.31','143.046','5.83716','3070:0 3072:0 3078:0 '),\n('3072','bedg675','530','3522','3844','65','70','0','2066.28','4886.71','148.962','0.107673','3071:0 3073:0 '),\n('3073','bedg676','530','3522','3844','65','70','0','2113.18','4914.06','149.085','6.14739','3072:0 3074:0 '),\n('3074','bedg677','530','3522','3827','65','70','0','2197.61','4955.01','153.824','2.65786','3073:0 3075:0 3232:0 '),\n('3075','bedg678','530','3522','3844','65','70','5','2122.42','4767.11','145.442','4.39595','3074:0 3076:0 3077:0 '),\n('3076','bedg679','530','3522','3844','65','70','5','2051.79','4712.94','149.377','4.14775','3075:0 '),\n('3077','bedg680','530','3522','3844','65','70','4','2045.43','4756.7','142.832','3.24454','3075:0 3078:0 '),\n('3078','bedg681','530','3522','3827','65','70','0','1924.25','4753.97','143.374','3.15815','3077:0 3071:0 3079:0 '),\n('3079','bedg682','530','3522','3827','65','70','0','1818.76','4741.32','143.599','3.17386','3078:0 3080:0 3081:0 3070:0 '),\n('3080','bedg683','530','3522','3783','65','70','0','1763.5','4636.75','148.572','2.17246','3081:0 3079:0 '),\n('3081','bedg684','530','3522','3827','65','70','0','1721.08','4751.46','141.246','2.47877','3080:0 3082:0 3079:0 '),\n('3082','bedg685','530','3522','3827','65','70','0','1671.81','4805.51','144.067','1.15537','3081:0 3083:0 '),\n('3083','bedg686','530','3522','3827','65','70','0','1716.64','4889.56','168.716','1.08076','3082:0 3084:0 '),\n('3084','bedg690','530','3522','3779','65','70','0','1764.57','5020.59','169.786','2.98533','3083:0 3085:0 '),\n('3085','bedg691','530','3522','3779','65','70','0','1689.52','5029.67','171.17','6.17405','3086:0 3084:0 '),\n('3086','bedg692','530','3522','3779','65','70','0','1644.1','5086.59','174.824','5.08627','3085:0 '),\n('3087','bedg693','530','3522','3768','65','70','0','2051.36','6085.99','147.268','1.58417','3050:0 3051:0 3052:0 3088:0 3094:0 '),\n('3088','bedg694','530','3522','3768','65','70','0','2163.29','6091.67','144.685','6.16931','3087:0 3089:0 3093:0 '),\n('3089','bedg695','530','3522','3769','65','70','5','2276.18','6049.52','143.141','5.80411','3088:0 3090:0 '),\n('3090','bedg696','530','3522','3769','65','70','4','2338.36','6031.21','142.438','2.8196','3089:0 3091:0 '),\n('3091','bedg697','530','3522','3769','65','70','5','2384.95','6054.49','138.162','1.60222','3090:0 3092:0 '),\n('3092','bedg698','530','3522','3768','65','70','0','2372.13','6149.95','128.725','3.20443','3091:0 3093:0 3160:0 '),\n('3093','bedg699','530','3522','3768','65','70','0','2265.65','6155.81','138.179','3.41256','3092:0 3088:0 '),\n('3094','bedg700','530','3522','3768','65','70','0','2028.28','6216.03','134.538','4.67706','3087:0 3095:0 '),\n('3095','bedg701','530','3522','3771','65','70','0','2041.4','6592.18','135.807','3.54607','3094:0 3096:0 3102:0 '),\n('3096','bedg702','530','3522','3772','65','70','3','2066.72','6735.02','154.854','4.59066','3095:0 3097:0 3101:0 '),\n('3097','bedg703','530','3522','3772','65','70','2','1972.28','6779.92','162.128','1.46478','3096:0 3098:0 '),\n('3098','bedg704','530','3522','3772','65','70','2','1959.55','6842.15','158.876','3.29476','3097:0 3099:0 3105:0 '),\n('3099','bedg705','530','3522','3772','65','70','3','2065.72','6849.09','172.562','0.0589211','3098:0 3100:0 '),\n('3100','bedg706','530','3522','3772','65','70','2','2135.82','6829.36','173.431','4.65351','3099:0 3101:0 '),\n('3101','bedg707','530','3522','3772','65','70','2','2140.28','6753.83','165.006','3.40472','3100:0 3096:0 '),\n('3102','bedg708','530','3522','3771','65','70','0','1952.24','6615.86','143.542','5.85751','3095:0 3103:0 3104:0 '),\n('3103','bedg709','530','3522','3771','65','70','0','1869.68','6608.28','143.783','2.00906','3102:0 3104:0 '),\n('3104','bedg710','530','3522','3771','65','70','0','1867.3','6714.18','142.554','2.81017','3102:0 3103:0 3105:0 '),\n('3105','bedg711','530','3522','3771','65','70','0','1794.79','6806.46','137.334','0.147653','3104:0 3098:0 3106:0 3125:0 '),\n('3106','bedg712','530','3522','3782','65','70','0','1698.35','6823.85','136.031','2.50777','3105:0 3107:0 3112:0 3113:0 '),\n('3107','bedg713','530','3522','3782','65','70','0','1660.38','6861.71','142.107','2.01886','3106:0 3108:0 '),\n('3108','bedg714','530','3522','3782','65','70','0','1628.86','6909.46','152.556','2.54312','3107:0 3109:0 '),\n('3109','bedg715','530','3522','3782','65','70','0','1565.97','6934.47','157.679','0.579622','3108:0 3110:0 '),\n('3110','bedg716','530','3522','3782','65','70','0','1642.57','6995.64','157.952','6.01458','3109:0 3111:0 '),\n('3111','bedg717','530','3522','3782','65','70','0','1706.57','6967.44','152.552','5.15456','3110:0 3112:0 '),\n('3112','bedg718','530','3522','3782','65','70','0','1749.11','6892.32','140.635','4.05192','3111:0 3106:0 '),\n('3113','bedg719','530','3522','3782','65','70','0','1636.12','6812.12','131.714','0.187751','3106:0 3114:0 3124:0 '),\n('3114','bedg720','530','3522','3782','65','70','0','1569.95','6826.69','128.23','3.23117','3113:0 3115:0 '),\n('3115','bedg721','530','3522','3522','65','70','0','1487.42','6820.82','107.218','2.83454','3114:0 3116:0 '),\n('3116','bedg722','530','3522','3522','65','70','0','1418.63','6847.18','110.541','2.77564','3115:0 3117:0 '),\n('3117','bedg723','530','3522','3522','65','70','0','1357.84','6881.95','95.233','5.88189','3116:0 3118:0 '),\n('3118','bedg724','530','3522','3522','65','70','0','1305.01','6962.51','93.0961','3.03875','3117:0 3119:0 '),\n('3119','bedg725','530','3522','3522','65','70','0','1224.71','6978.54','90.3881','2.59893','3118:0 3120:0 '),\n('3120','bedg726','530','3522','3522','65','70','0','1145.67','7048.89','113.579','2.41436','3119:0 3121:0 '),\n('3121','bedg727','530','3522','3522','65','70','2','1107.87','7095.02','122.35','3.18012','3120:0 3122:0 '),\n('3122','bedg728','530','3522','3770','65','70','2','1053.11','7098.72','116.217','0.376251','3121:0 3123:0 '),\n('3123','bedg729','530','3522','3770','65','70','2','1020.4','7173.65','86.2439','1.66823','3122:0 2628:0 '),\n('3124','bedg730','530','3522','3824','65','70','0','1647.1','6732.39','116.704','4.75248','3113:0 3125:0 '),\n('3125','bedg731','530','3522','3771','65','70','0','1740.86','6736.89','134.249','0.774434','3124:0 3105:0 3126:0 '),\n('3126','bedg732','530','3522','3824','65','70','0','1628.32','6690.04','108.29','6.13869','3125:0 3127:0 '),\n('3127','bedg733','530','3522','3824','65','70','0','1723.61','6678.08','87.8644','5.8481','3126:0 3128:0 '),\n('3128','bedg734','530','3522','3824','65','70','0','1772.91','6642.19','74.5483','2.51408','3127:0 3129:0 '),\n('3129','bedg735','530','3522','3824','65','70','0','1619.66','6621.4','33.3376','3.64899','3128:0 3130:0 '),\n('3130','bedg736','530','3522','3824','65','70','0','1761.7','6532.98','4.13407','5.72636','3129:0 3131:0 3263:0 '),\n('3131','bedg737','530','3522','3824','65','70','0','1936.85','6455.82','1.98027','5.87558','3130:0 3132:0 3261:0 '),\n('3132','bedg738','530','3522','3824','65','70','0','2158.79','6394.21','-10.3376','6.01302','3131:0 3133:0 '),\n('3133','bedg739','530','3522','3931','65','70','0','2352.32','6410.86','-10.3378','0.246553','3132:0 3134:0 3136:0 '),\n('3134','bedg740','530','3522','3773','65','70','0','2401.13','6465.38','3.57212','0.140524','3133:0 3135:0 '),\n('3135','bedg741','530','3522','3773','65','70','0','2489.83','6479','-6.94094','0.898433','3134:0 3136:0 3137:0 '),\n('3136','bedg742','530','3522','3931','65','70','0','2486.13','6407.7','-10.338','3.05435','3135:0 3133:0 3143:0 '),\n('3137','bedg743','530','3522','3773','65','70','0','2546.35','6560.09','1.844','4.13898','3135:0 3138:0 3139:0 3140:0 3142:0 '),\n('3138','bedg744','530','3522','3773','65','70','0','2667.31','6519.19','0.94932','5.95717','3137:0 '),\n('3139','bedg745','530','3522','3773','65','70','0','2613.6','6682.32','23.1547','1.02881','3137:0 3142:0 '),\n('3140','bedg746','530','3522','3773','65','70','0','2376.02','6637.4','10.9828','6.02394','3137:0 3141:0 '),\n('3141','bedg747','530','3522','3773','65','70','0','2482.22','6684.55','0.72676','5.48987','3140:0 3142:0 '),\n('3142','bedg748','530','3522','3773','65','70','0','2570.07','6610.1','7.6561','4.0683','3141:0 3137:0 3139:0 '),\n('3143','bedg749','530','3522','3931','65','70','0','2625.59','6357.13','-10.3379','0.0313585','3136:0 3144:0 3150:0 '),\n('3144','bedg750','530','3522','3862','65','70','0','2747.24','6390.91','2.251','5.27782','3143:0 3145:0 '),\n('3145','bedg751','530','3522','3862','65','70','0','2871.51','6233.27','11.692','5.37992','3144:0 3146:0 3150:0 '),\n('3146','bedg752','530','3522','3862','65','70','0','2980.33','6146.77','4.99801','5.25426','3145:0 3147:0 '),\n('3147','bedg753','530','3522','3826','65','70','0','3036.46','6073.22','0.772358','5.36224','3146:0 3148:0 '),\n('3148','bedg754','530','3522','3826','65','70','0','3098.88','6022.32','1.18446','4.5042','3147:0 3149:0 '),\n('3149','bedg755','530','3522','3826','65','70','0','3081.27','5967.39','-10.3385','2.55249','3148:0 3150:0 3154:0 '),\n('3150','bedg756','530','3522','3825','65','70','0','2759.83','6108.29','-10.3396','6.08285','3145:0 3149:0 3143:0 3151:0 3157:0 '),\n('3151','bedg757','530','3522','3825','65','70','1','2685.12','5895.26','-16.1123','4.71862','3150:0 3152:0 '),\n('3152','bedg758','530','3522','3825','65','70','0','2687.78','5785.12','-16.8636','4.73433','3151:0 3153:0 '),\n('3153','bedg759','530','3522','3904','65','70','0','2695.75','5583.37','-10.6374','4.75001','3152:0 '),\n('3154','bedg760','530','3522','3826','65','70','0','3126.83','5854.78','-10.3341','5.52444','3149:0 3155:0 3156:0 '),\n('3155','bedg761','530','3522','3826','65','70','0','3287.4','5738.99','-10.3325','5.79933','3154:0 3156:0 3161:0 '),\n('3156','bedg762','530','3522','3826','65','70','0','3281.88','5854.49','-1.4584','3.21929','3155:0 3154:0 3161:0 '),\n('3157','bedg763','530','3522','3825','65','70','0','2582.1','6136.86','24.0804','4.49162','3150:0 3158:0 '),\n('3158','bedg765','530','3522','3825','65','70','0','2521.32','6015.69','84.9349','2.22967','3157:0 3159:0 '),\n('3159','bedg767','530','3522','3768','65','70','0','2494.15','6124.82','111.3','1.62492','3160:0 3158:0 '),\n('3160','bedg768','530','3522','3768','65','70','0','2427.5','6152.5','122.621','2.74804','3159:0 3092:0 '),\n('3161','bedg769','530','3522','3826','65','70','0','3383.33','5729.17','-10.3389','3.41014','3155:0 3156:0 3162:0 3163:0 3172:0 '),\n('3162','bedg770','530','3522','3777','65','70','0','3452.63','5809.98','1.12407','0.865436','3161:0 3164:0 '),\n('3163','bedg771','530','3522','3826','65','70','0','3520','5691.54','-10.3386','6.05377','3161:0 3164:0 '),\n('3164','bedg772','530','3522','3777','65','70','0','3523.18','5795.46','1.6669','1.53041','3163:0 3162:0 3165:0 '),\n('3165','bedg773','530','3522','3826','65','70','0','3589.57','5684.17','-10.2714','6.25066','3164:0 3166:0 '),\n('3166','bedg774','530','3522','3774','65','70','0','3660.48','5491.29','-20.7025','5.0647','3165:0 3171:0 '),\n('3167','bedg775','530','3522','3774','65','70','0','3641.58','5308.33','-20.5148','5.3867','3168:0 3171:0 '),\n('3168','bedg776','530','3522','3774','65','70','0','3587.11','5221.49','14.2925','1.80371','3169:0 3167:0 '),\n('3169','bedg777','530','3522','3774','65','70','0','3438.2','5241.29','-6.61032','0.307527','3168:0 '),\n('3170','bedg779','530','3522','3774','65','70','0','3593.15','5382.62','-9.51038','0.0970404','3171:0 '),\n('3171','bedg780','530','3522','3774','65','70','0','3651.06','5374.99','-20.2357','1.49502','3170:0 3166:0 3167:0 '),\n('3172','bedg781','530','3522','3826','65','70','0','3233.27','5636.21','38.3515','5.69295','3161:0 3173:0 '),\n('3173','bedg782','530','3522','3826','65','70','0','3303.69','5597.03','55.3332','6.0071','3172:0 3174:0 '),\n('3174','bedg783','530','3522','3826','65','70','0','3374.58','5579.62','85.0975','4.19284','3173:0 3175:0 '),\n('3175','bedg784','530','3522','3828','65','70','0','3306.73','5468.57','141.818','6.03852','3174:0 3176:0 3179:0 '),\n('3176','bedg785','530','3522','3828','65','70','0','3389.48','5461.86','145.745','4.75047','3175:0 3177:0 '),\n('3177','bedg786','530','3522','3829','65','70','0','3363.88','5342.13','147.792','3.91795','3176:0 3178:0 '),\n('3178','bedg787','530','3522','3829','65','70','0','3286','5287.73','147.247','2.3825','3177:0 3179:0 3182:0 '),\n('3179','bedg788','530','3522','3828','65','70','0','3187.06','5468.2','146.95','2.07226','3178:0 3175:0 3180:0 '),\n('3180','bedg789','530','3522','3828','65','70','0','3116.13','5482.01','145.293','4.71905','3179:0 3181:0 3183:0 '),\n('3181','bedg790','530','3522','3829','65','70','0','3130.15','5332.98','148.604','4.94682','3180:0 3182:0 '),\n('3182','bedg791','530','3522','3829','65','70','0','3215.6','5360.26','142.29','5.42984','3181:0 3178:0 '),\n('3183','bedg792','530','3522','3828','65','70','0','2956.95','5583.27','146.351','5.04498','3180:0 3184:0 3186:0 '),\n('3184','bedg793','530','3522','3952','65','70','0','2952.85','5779.65','134.692','1.27116','3183:0 3185:0 '),\n('3185','bedg794','530','3522','3952','65','70','0','3050.1','5991.54','130.725','1.20636','3184:0 3238:0 '),\n('3186','bedg795','530','3522','3951','65','70','1','2949.59','5525.69','144.16','2.62095','3183:0 3187:0 '),\n('3187','bedg796','530','3522','3828','65','70','0','2915.37','5365.92','147.713','1.64902','3186:0 3188:0 '),\n('3188','bedg797','530','3522','3867','65','70','0','2973.41','5294.89','183.643','6.14688','3187:0 3189:0 '),\n('3189','bedg798','530','3522','3867','65','70','0','3038.23','5281.8','219.214','4.54468','3188:0 3190:0 '),\n('3190','bedg799','530','3522','3867','65','70','0','3021.8','5214.18','250.296','5.00414','3189:0 3191:0 '),\n('3191','bedg800','530','3522','3867','65','70','0','3082.54','5063.01','264.326','4.87847','3190:0 3192:0 3211:0 3212:0 '),\n('3192','bedg801','530','3522','3867','65','70','0','3099.95','4980.23','265.505','6.22935','3191:0 3193:0 3218:0 3221:0 '),\n('3193','bedg802','530','3522','3867','65','70','0','3304.97','4970.79','264.838','5.68742','3192:0 3194:0 3210:0 '),\n('3194','bedg803','530','3522','3867','65','70','0','3434.24','4937.21','262.546','5.47143','3193:0 3195:0 3209:0 3210:0 '),\n('3195','bedg804','530','3522','3867','65','70','0','3574.68','4758.04','240.131','5.37718','3194:0 3196:0 3202:0 '),\n('3196','bedg805','530','3522','3863','65','70','0','3564.29','4641.89','228.617','3.77105','3195:0 3197:0 '),\n('3197','bedg806','530','3522','3863','65','70','0','3459.92','4594.26','206.487','3.08147','3196:0 3198:0 3199:0 '),\n('3198','bedg807','530','3522','3962','65','70','0','3346.24','4594.8','221.66','2.70055','3197:0 '),\n('3199','bedg808','530','3522','3863','65','70','0','3393.49','4543.75','179.957','4.49519','3197:0 3200:0 '),\n('3200','bedg809','530','3522','3863','65','70','0','3360.85','4462.38','157.372','4.73472','3199:0 3201:0 3269:0 '),\n('3201','bedg810','530','3522','3863','65','70','0','3368.28','4367.62','122.375','1.75021','3200:0 3269:0 '),\n('3202','bedg811','530','3522','3866','65','70','0','3701.21','4770.37','244.343','1.75806','3195:0 3203:0 '),\n('3203','bedg812','530','3522','3866','65','70','0','3761.47','4802.74','254.61','1.73842','3202:0 3204:0 '),\n('3204','bedg813','530','3522','3866','65','70','0','3738.29','4879.52','256.491','2.75944','3203:0 3205:0 '),\n('3205','bedg814','530','3522','3866','65','70','0','3668.47','4898.18','260.046','1.56956','3204:0 3206:0 '),\n('3206','bedg815','530','3522','3866','65','70','0','3668.33','5008.48','266.738','4.7465','3205:0 3207:0 3208:0 '),\n('3207','bedg816','530','3522','3866','65','70','0','3732.68','5010.06','273.797','4.86824','3206:0 '),\n('3208','bedg817','530','3522','3866','65','70','0','3581.65','5022.38','265.138','6.01885','3206:0 3209:0 '),\n('3209','bedg818','530','3522','3866','65','70','0','3523.16','4984.99','269.146','3.77261','3208:0 3194:0 '),\n('3210','bedg819','530','3522','3867','65','70','0','3312.28','5066.6','254.195','4.73865','3193:0 3194:0 3211:0 '),\n('3211','bedg820','530','3522','3867','65','70','0','3243.07','5149.71','260.466','2.97621','3210:0 3191:0 '),\n('3212','bedg821','530','3522','3942','65','70','0','2961.39','5151.76','265.026','5.66383','3191:0 3213:0 3217:0 '),\n('3213','bedg822','530','3522','3942','65','70','0','2940.58','5217.19','264.835','2.79713','3212:0 3214:0 '),\n('3214','bedg823','530','3522','3942','65','70','0','2844.64','5234.99','267.298','3.70426','3213:0 3215:0 '),\n('3215','bedg824','530','3522','3942','65','70','0','2724.25','5157.06','265.076','3.71605','3214:0 3216:0 3222:0 '),\n('3216','bedg825','530','3522','3867','65','70','0','2816.5','5099.67','265.683','5.72666','3215:0 3217:0 '),\n('3217','bedg826','530','3522','3867','65','70','0','2900.18','5096.37','265.127','0.775502','3212:0 3216:0 3218:0 3221:0 '),\n('3218','bedg827','530','3522','3787','65','70','0','2929.12','4947.5','266.731','4.91062','3192:0 3217:0 3219:0 3221:0 '),\n('3219','bedg828','530','3522','3787','65','70','0','2898.72','4782.92','277.957','4.52971','3218:0 3220:0 '),\n('3220','bedg829','530','3522','3787','65','70','0','2984.26','4824.35','278.892','1.56875','3219:0 3221:0 '),\n('3221','bedg830','530','3522','3787','65','70','0','2852.35','4933.54','267.974','6.12327','3220:0 3218:0 3192:0 3217:0 '),\n('3222','bedg831','530','3522','3833','65','70','0','2545.57','5293.37','266.598','6.1005','3215:0 3223:0 3237:0 '),\n('3223','bedg832','530','3522','3833','65','70','0','2456.71','5321.66','264.923','2.73899','3222:0 3224:0 3230:0 3237:0 '),\n('3224','bedg833','530','3522','3833','65','70','0','2282.88','5171.44','264.676','3.69325','3223:0 3225:0 3230:0 '),\n('3225','bedg834','530','3522','3953','65','70','0','2194.7','5122.32','258.602','4.28623','3224:0 3226:0 '),\n('3226','bedg835','530','3522','3953','65','70','0','2189.16','5051.76','252.603','2.1395','3225:0 3227:0 '),\n('3227','bedg836','530','3522','3953','65','70','0','2116.51','5085.08','256.974','5.94279','3226:0 3228:0 3231:0 '),\n('3228','bedg837','530','3522','3953','65','70','0','2090.4','5162.61','265.04','2.37496','3227:0 3229:0 3233:0 '),\n('3229','bedg838','530','3522','3953','65','70','0','2063.34','5235.11','265.179','0.122197','3228:0 3230:0 '),\n('3230','bedg839','530','3522','3833','65','70','0','2316.24','5243.18','261.206','0.031876','3229:0 3224:0 3223:0 '),\n('3231','bedg840','530','3522','3953','65','70','0','2089.3','5022.57','223.769','0.835746','3227:0 3232:0 '),\n('3232','bedg841','530','3522','3953','65','70','0','2164.72','5005.6','178.623','5.23199','3231:0 3074:0 '),\n('3233','bedg842','530','3522','3953','65','70','0','1740.09','5133.27','265.058','3.33132','3228:0 3234:0 '),\n('3234','bedg843','530','3522','3919','65','70','0','1674.61','5254.04','265.321','1.92546','3233:0 3235:0 '),\n('3235','bedg844','530','3522','3919','65','70','0','1612.29','5464.5','265.941','1.8587','3234:0 3044:0 3043:0 '),\n('3236','bedg845','530','3522','3833','65','70','0','2395.42','5588.73','267.895','5.88623','3035:0 3237:0 '),\n('3237','bedg846','530','3522','3833','65','70','0','2397.69','5390.93','264.287','4.72385','3236:0 3223:0 3222:0 '),\n('3238','bedg847','530','3522','3954','65','70','0','3094.62','6101.88','130.589','1.3065','3185:0 3239:0 '),\n('3239','bedg848','530','3522','3954','65','70','0','3120.37','6181.58','137.697','1.30738','3238:0 3240:0 '),\n('3240','bedg849','530','3522','3954','65','70','0','3147.57','6248.67','124.212','0.486635','3239:0 3241:0 '),\n('3241','bedg850','530','3522','3954','65','70','0','3217.19','6289.41','124.654','1.62939','3240:0 3242:0 '),\n('3242','bedg851','530','3522','3954','65','70','0','3215.71','6365.94','119.805','1.02856','3241:0 3243:0 '),\n('3243','bedg852','530','3522','3954','65','70','0','3279.94','6464.48','149.929','0.887189','3242:0 3244:0 '),\n('3244','bedg853','530','3522','3830','65','70','0','3323.9','6505.86','159.443','0.796868','3243:0 3245:0 3260:0 '),\n('3245','bedg854','530','3522','3781','65','70','0','3488.68','6673.14','148.361','0.895043','3244:0 3246:0 3260:0 '),\n('3246','bedg855','530','3522','3781','65','70','0','3566.67','6807.32','137.289','2.01031','3245:0 3247:0 3256:0 '),\n('3247','bedg856','530','3522','3830','65','70','0','3446.01','7089.42','152.831','1.97497','3246:0 3248:0 3250:0 3251:0 '),\n('3248','bedg857','530','3522','3830','65','70','0','3286.14','7143.51','168.873','3.41617','3247:0 3249:0 '),\n('3249','bedg858','530','3522','3830','65','70','0','3303.87','6962.97','164.125','0.482707','3248:0 3250:0 '),\n('3250','bedg859','530','3522','3830','65','70','0','3360.25','6980.78','163.409','0.305992','3249:0 3247:0 '),\n('3251','bedg860','530','3522','3903','65','70','0','3481.37','7222.76','141.365','1.30345','3247:0 3252:0 '),\n('3252','bedg861','530','3522','3903','65','70','0','3590.93','7211.94','137.85','5.43858','3251:0 3253:0 '),\n('3253','bedg862','530','3522','3903','65','70','0','3641.59','7154.45','142.814','5.19904','3252:0 3254:0 '),\n('3254','bedg863','530','3522','3903','65','70','0','3697.31','7047.11','149.054','4.94771','3253:0 3255:0 '),\n('3255','bedg864','530','3522','3830','65','70','0','3765.97','6838.37','141.277','4.82598','3254:0 3256:0 '),\n('3256','bedg865','530','3522','3781','65','70','0','3736.74','6702.81','136.262','4.17018','3246:0 3255:0 3257:0 '),\n('3257','bedg866','530','3522','3781','65','70','0','3630.09','6582.49','134.163','3.31724','3256:0 3258:0 '),\n('3258','bedg867','530','3522','3781','65','70','0','3502.63','6555.2','131.654','3.74921','3257:0 3259:0 '),\n('3259','bedg868','530','3522','3830','65','70','0','3447.34','6507.7','134.998','3.17979','3258:0 3260:0 '),\n('3260','bedg869','530','3522','3830','65','70','0','3367.73','6538.54','150.282','2.78317','3244:0 3259:0 3245:0 '),\n('3261','bedg870','530','3522','3824','65','70','0','1832.55','6314.24','0.000980531','2.39439','3131:0 3262:0 '),\n('3262','bedg871','530','3522','3824','65','70','0','1739.41','6384.91','-10.3385','3.01878','3261:0 3263:0 '),\n('3263','bedg872','530','3522','3776','65','70','0','1654.93','6407.76','-10.1815','2.87741','3262:0 3130:0 3264:0 '),\n('3264','bedg873','530','3522','3776','65','70','0','1604.99','6316.74','1.22794','4.18509','3263:0 3265:0 '),\n('3265','bedg874','530','3522','3824','65','70','0','1475.3','6532.8','-10.3385','5.60273','3264:0 3266:0 '),\n('3266','bedg876','530','3522','3778','65','70','0','1361.1','6534.43','6.43101','6.15055','3265:0 3267:0 '),\n('3267','bedg877','530','3522','3778','65','70','0','1339.54','6590.17','-8.16829','2.78314','3268:0 3266:0 '),\n('3268','bedg878','530','3522','3778','65','70','0','1355.69','6688.28','-22.7054','2.60447','3267:0 '),\n('3269','net880','530','3523','3868','67','70','0','3385.12','4257.44','122.681','4.84713','3200:0 3201:0 3270:0 '),\n('3270','net881','530','3523','3523','67','70','0','3394.02','4139.94','151.096','1.574','3269:0 3271:0 '),\n('3271','net883','530','3523','3523','67','70','0','3433.77','4036.61','177.446','4.57617','3272:0 3270:0 '),\n('3272','net884','530','3523','3523','67','70','0','3443.07','3946.93','166.449','4.15205','3271:0 3273:0 '),\n('3273','net885','530','3523','3523','67','70','0','3403.88','3894.6','153.082','3.72008','3272:0 3274:0 '),\n('3274','net886','530','3523','3523','67','70','0','3356.69','3870.95','144.623','4.91389','3273:0 3275:0 3284:0 3285:0 '),\n('3275','net887','530','3523','3523','67','70','0','3379','3814.14','142.822','4.46228','3274:0 3276:0 '),\n('3276','net888','530','3523','3725','67','70','0','3356.46','3730.03','141.12','5.51863','3275:0 3277:0 '),\n('3277','net889','530','3523','3725','67','70','0','3395.58','3698.26','144.989','5.91132','3276:0 3278:0 '),\n('3278','net890','530','3523','3725','67','70','0','3463.55','3674.25','150.706','4.98848','3277:0 3279:0 '),\n('3279','net891','530','3523','3725','67','70','0','3489.72','3601.83','158.293','4.35231','3278:0 3280:0 '),\n('3280','net892','530','3523','3725','67','70','0','3537.5','3575.94','135.389','2.48697','3279:0 3281:0 '),\n('3281','net893','530','3523','3725','67','70','0','3582.4','3548.11','124.35','1.42276','3280:0 3282:0 '),\n('3282','net894','530','3523','3721','67','70','0','3601.15','3625.27','127.148','2.16889','3281:0 3283:0 '),\n('3283','net895','530','3523','3725','67','70','0','3506.7','3744.78','141.004','1.82724','3282:0 3284:0 '),\n('3284','net896','530','3523','3523','67','70','0','3492.41','3820.83','138.898','2.78542','3283:0 3274:0 '),\n('3285','net897','530','3523','3523','67','70','0','3288.33','3814.38','139.103','3.2089','3274:0 3286:0 '),\n('3286','net898','530','3523','3523','67','70','0','3228.8','3802.26','137.833','3.34242','3285:0 3287:0 3318:0 3319:0 '),\n('3287','net899','530','3523','3712','67','70','0','3127.16','3690.44','142.929','3.42881','3286:0 3318:0 3319:0 3324:0 '),\n('3288','net903','530','3523','3712','67','70','0','2999.35','3698.08','144.031','2.76314','3289:0 3315:0 3323:0 3316:0 '),\n('3289','net904','530','3523','3712','67','70','0','2922.84','3722.08','143.833','1.69299','3290:0 3288:0 '),\n('3290','net905','530','3523','3523','67','70','0','2885.06','3679.8','140.256','0.687686','3289:0 3291:0 '),\n('3291','net906','530','3523','3523','67','70','0','2816.99','3697.81','120.765','3.2795','3290:0 3292:0 '),\n('3292','net907','530','3523','3523','67','70','0','2757.67','3673.48','134.526','2.26241','3291:0 3293:0 3336:0 '),\n('3293','net908','530','3523','3729','67','70','0','2719.32','3721.32','139.083','3.091','3292:0 3294:0 '),\n('3294','net909','530','3523','3729','67','70','0','2639.32','3732.64','144.622','2.23884','3293:0 3295:0 '),\n('3295','net910','530','3523','3729','67','70','0','2585.42','3776.42','143.482','2.4509','3294:0 3296:0 3339:0 '),\n('3296','net911','530','3523','3729','67','70','0','2514.06','3815.49','129.888','2.12889','3295:0 3297:0 '),\n('3297','net912','530','3523','3729','67','70','0','2508.94','3883.67','132.691','1.6655','3296:0 3298:0 '),\n('3298','net913','530','3523','3729','67','70','0','2477.31','4067.17','130.201','5.03879','3297:0 3299:0 '),\n('3299','net914','530','3523','3523','67','70','0','2545.65','4202.77','136.176','0.542382','3298:0 3300:0 '),\n('3300','net915','530','3523','3523','67','70','0','2609.03','4303.08','140.386','0.000453472','3299:0 3301:0 '),\n('3301','net916','530','3523','3726','67','70','0','2747.27','4290.97','151.997','6.19723','3300:0 3302:0 '),\n('3302','net917','530','3523','3726','67','70','0','2895.85','4349.05','157.653','4.53219','3301:0 3303:0 '),\n('3303','net918','530','3523','3726','67','70','0','2865.03','4280.18','159.366','5.10554','3302:0 3304:0 '),\n('3304','net919','530','3523','3726','67','70','0','2890.62','4215.62','164.008','5.09376','3303:0 3305:0 3312:0 '),\n('3305','net920','530','3523','3726','67','70','0','2940.62','4199.62','164.007','0.322464','3304:0 3306:0 3311:0 '),\n('3306','net921','530','3523','3726','67','70','0','2999.27','4224.49','160.851','0.401004','3305:0 3307:0 '),\n('3307','net922','530','3523','3726','67','70','0','3026.75','4163.73','153.291','4.74035','3306:0 3308:0 '),\n('3308','net923','530','3523','3726','67','70','0','3010.04','4106.05','150.967','4.08455','3307:0 3309:0 '),\n('3309','net924','530','3523','3726','67','70','0','2977.7','4033.08','148.218','1.89329','3308:0 3310:0 3313:0 '),\n('3310','net925','530','3523','3726','67','70','0','2939.58','4099.08','162.599','2.04252','3309:0 3311:0 '),\n('3311','net926','530','3523','3726','67','70','0','2918.39','4149.56','164.008','1.96398','3310:0 3305:0 3312:0 '),\n('3312','net927','530','3523','3726','67','70','0','2870.91','4167.67','164.007','1.92863','3311:0 3304:0 '),\n('3313','net928','530','3523','3523','67','70','0','2982.92','3921.89','146.316','1.62627','3309:0 3314:0 '),\n('3314','net929','530','3523','3523','67','70','0','3051.56','3890.86','143.683','5.83993','3313:0 3315:0 '),\n('3315','net930','530','3523','3712','67','70','0','3039.6','3790.04','145.363','4.28485','3314:0 3317:0 3288:0 '),\n('3316','net931','530','3523','3712','67','70','0','3064.35','3704.05','142.478','3.15387','3288:0 3324:0 '),\n('3317','net932','530','3523','3523','67','70','0','3092.9','3822.62','142.74','5.9106','3315:0 3318:0 '),\n('3318','net933','530','3523','3523','67','70','0','3125.95','3779.17','142.072','0.118293','3317:0 3287:0 3286:0 '),\n('3319','net934','530','3523','3523','67','70','0','3196.76','3711.71','129.813','5.90669','3287:0 3286:0 3320:0 '),\n('3320','net935','530','3523','3523','67','70','0','3253.35','3630.84','126.607','3.66438','3319:0 3321:0 '),\n('3321','net936','530','3523','3523','67','70','0','3139.27','3579.06','142.77','3.24419','3320:0 3322:0 '),\n('3322','net937','530','3523','3712','67','70','0','3046.95','3595.34','143.235','1.59486','3321:0 3325:0 3324:0 '),\n('3323','net938','530','3523','3712','1','60','0','2935.94','3648.71','132.577','0.379446','3288:0 3324:0 '),\n('3324','net939','530','3523','3712','67','70','1','3062.95','3645.68','144.33','5.51596','3287:0 3322:0 3323:0 3316:0 '),\n('3325','net940','530','3523','3523','67','70','0','3016.58','3539.17','143.581','3.54657','3322:0 3326:0 3340:0 '),\n('3326','net941','530','3523','3523','67','70','0','2859.55','3471.67','136.322','0.389269','3325:0 3327:0 3334:0 '),\n('3327','net942','530','3523','3723','67','70','0','2805.81','3360.76','144.743','4.68931','3326:0 3328:0 '),\n('3328','net944','530','3523','3723','67','70','0','2802.57','3251.58','147.597','1.60466','3327:0 3329:0 '),\n('3329','net945','530','3523','3723','67','70','0','2769.35','3153.34','149.314','2.61194','3330:0 3328:0 '),\n('3330','net946','530','3523','3723','67','70','0','2713.25','3168.67','147.073','4.21416','3329:0 3331:0 '),\n('3331','net947','530','3523','3721','67','70','0','2645.59','3055.71','123.459','0.911553','3330:0 3332:0 3347:0 3348:0 '),\n('3332','net948','530','3523','3723','67','70','0','2635.1','3154.85','135.257','1.35923','3331:0 3333:0 '),\n('3333','net949','530','3523','3523','67','70','0','2617.24','3347.94','142.696','1.66554','3332:0 3334:0 3337:0 '),\n('3334','net950','530','3523','3523','67','70','0','2742.84','3444.31','140.23','4.12776','3333:0 3326:0 3335:0 '),\n('3335','net951','530','3523','3523','67','70','0','2704.66','3571.67','134.738','5.57132','3334:0 3336:0 '),\n('3336','net952','530','3523','3523','67','70','0','2828.97','3612.56','157.278','2.2157','3335:0 3292:0 '),\n('3337','net953','530','3523','3721','67','70','0','2522.14','3469.45','130.706','1.47151','3333:0 3338:0 '),\n('3338','net954','530','3523','3523','67','70','0','2544.17','3592.01','138.626','1.39297','3337:0 3339:0 '),\n('3339','net955','530','3523','3721','67','70','0','2528.36','3697.54','134.608','0.964924','3338:0 3295:0 '),\n('3340','net956','530','3523','3523','67','70','0','3051.39','3455.12','118.577','4.822','3325:0 3341:0 '),\n('3341','net957','530','3523','3523','67','70','0','3057.51','3309.81','106.678','5.00264','3340:0 3342:0 '),\n('3342','net958','530','3523','3721','67','70','0','3103.15','3197.03','101.208','5.67416','3341:0 3343:0 3344:0 '),\n('3343','net959','530','3523','3721','67','70','0','3221.06','3114.67','102.79','5.68986','3342:0 3385:0 3386:0 '),\n('3344','net960','530','3523','3921','67','70','0','2987.27','3194.73','134.342','4.05624','3342:0 3345:0 '),\n('3345','net961','530','3523','3921','67','70','0','2929.07','3149.43','147.291','1.12512','3344:0 3346:0 '),\n('3346','net962','530','3523','3721','67','70','0','2829.63','2992.81','120.478','2.75876','3345:0 3347:0 '),\n('3347','net963','530','3523','3721','67','70','0','2726.18','3015.49','121.825','2.99045','3346:0 3331:0 '),\n('3348','net964','530','3523','3721','67','70','0','2519.49','2940.34','119.757','3.88108','3331:0 3349:0 '),\n('3349','net965','530','3523','3730','67','70','0','2455.26','2867.95','131.925','4.34839','3348:0 3350:0 3354:0 '),\n('3350','net966','530','3523','3730','67','70','0','2531.85','2827','126.995','4.61936','3351:0 3349:0 '),\n('3351','net967','530','3523','3730','67','70','0','2555.92','2738.68','119.45','1.55822','3350:0 3352:0 3376:0 '),\n('3352','net970','530','3523','3730','67','70','0','2501.34','2718.83','131.657','2.74617','3353:0 3351:0 3375:0 '),\n('3353','net971','530','3523','3730','67','70','0','2440.85','2747.78','134.493','2.69511','3354:0 3356:0 3352:0 '),\n('3354','net972','530','3523','3730','67','70','0','2424.83','2798.75','134.493','1.0929','3353:0 3355:0 3349:0 '),\n('3355','net973','530','3523','3730','67','70','0','2364.39','2781.17','133.656','5.81904','3354:0 3356:0 '),\n('3356','net974','530','3523','3730','67','70','0','2392.65','2726.98','134.491','5.0199','3353:0 3355:0 3357:0 '),\n('3357','net975','530','3523','3730','67','70','0','2364.76','2665.91','130.977','1.12433','3356:0 3358:0 '),\n('3358','net976','530','3523','3523','67','70','0','2326','2600.19','126.548','4.98456','3357:0 3359:0 '),\n('3359','net977','530','3523','3523','67','70','0','2287.03','2439.79','104.053','4.47406','3358:0 3360:0 '),\n('3360','net978','530','3523','3523','67','70','0','2336.37','2367.16','115.816','5.18877','3359:0 3373:0 3361:0 '),\n('3361','net979','530','3523','3523','67','70','0','2310.67','2271.59','98.2741','5.2673','3360:0 3362:0 3367:0 '),\n('3362','net981','530','3523','3935','67','70','0','2246.67','2310.26','89.8977','3.71223','3363:0 3372:0 3361:0 '),\n('3363','net982','530','3523','3934','67','70','0','2176.86','2262.3','76.0387','4.01068','3362:0 3364:0 3372:0 '),\n('3364','net983','530','3523','3934','67','70','0','2119.56','2206.31','71.3039','6.1607','3363:0 3365:0 '),\n('3365','net984','530','3523','3934','67','70','0','2180.34','2173.31','71.6002','5.61288','3364:0 3366:0 '),\n('3366','net985','530','3523','3934','67','70','0','2233.52','2115.22','71.2016','2.29655','3365:0 3367:0 '),\n('3367','net987','530','3523','3934','67','70','0','2294.17','2189.49','93.5883','6.28047','3368:0 3361:0 3366:0 '),\n('3368','net990','530','3523','3934','67','70','0','2353.3','2183.05','89.3993','6.15874','3367:0 3369:0 '),\n('3369','net991','530','3523','3879','67','70','0','2411.12','2183.37','89.9985','4.94529','3368:0 3370:0 '),\n('3370','net992','530','3523','3879','67','70','0','2523.75','2185.83','102.693','5.98201','3369:0 3371:0 '),\n('3371','net993','530','3523','3879','67','70','0','2484.6','2033.27','88.1469','4.36606','3370:0 '),\n('3372','net997','530','3523','3935','67','70','0','2183.73','2382.64','98.0661','5.72675','3362:0 3363:0 '),\n('3373','net999','530','3523','3837','67','70','0','2400.24','2395.93','142.613','3.9737','3374:0 3360:0 '),\n('3374','net1000','530','3523','3837','67','70','0','2482.84','2424.13','134.571','3.45533','3373:0 3375:0 '),\n('3375','net1001','530','3523','3523','67','70','0','2516.55','2638.79','129.583','6.18383','3374:0 3352:0 3376:0 '),\n('3376','net1003','530','3523','3523','67','70','0','2599.94','2630.3','129.384','5.99453','3351:0 3375:0 3377:0 '),\n('3377','net1004','530','3523','3721','67','70','0','2697.9','2608.37','102.479','0.0883238','3378:0 3376:0 '),\n('3378','net1005','530','3523','3721','67','70','0','2824.9','2626.19','104.537','0.139375','3377:0 3379:0 '),\n('3379','net1006','530','3523','3523','67','70','0','2944.38','2624.27','115.88','6.27726','3378:0 3380:0 '),\n('3380','net1007','530','3523','3523','67','70','0','3044.31','2606.49','109.94','6.10839','3379:0 3381:0 3410:0 '),\n('3381','net1008','530','3523','3523','67','70','0','3088.57','2759.93','115.588','1.28997','3380:0 3382:0 '),\n('3382','net1009','530','3523','3523','67','70','0','3181.15','2839.31','132.63','0.00191784','3381:0 3383:0 '),\n('3383','net1010','530','3523','3877','67','70','0','3314.68','2857.1','140.864','0.174705','3382:0 3384:0 3394:0 '),\n('3384','net1011','530','3523','3523','67','70','0','3251.04','2889.15','139.525','5.61752','3383:0 3385:0 '),\n('3385','net1012','530','3523','3523','67','70','0','3260.45','2979.53','133.71','1.72431','3384:0 3343:0 '),\n('3386','net1013','530','3523','3721','67','70','0','3328.19','3109.33','123.938','0.003479','3343:0 3387:0 '),\n('3387','net1014','530','3523','3721','67','70','0','3467.09','3253.66','100.83','0.804579','3386:0 3388:0 '),\n('3388','net1015','530','3523','3523','67','70','0','3558.21','3192.19','105.717','5.68976','3387:0 3389:0 '),\n('3389','net1016','530','3523','3877','67','70','0','3523.96','3113.12','130.592','4.30353','3388:0 3390:0 '),\n('3390','net1017','530','3523','3877','67','70','0','3511.13','3048.77','142.826','5.09678','3389:0 3391:0 '),\n('3391','net1018','530','3523','3877','67','70','0','3536.43','3000.68','143.097','5.20281','3390:0 3395:0 3392:0 '),\n('3392','net1020','530','3523','3877','67','70','0','3646.43','3045.04','123.609','0.195882','3391:0 3393:0 '),\n('3393','net1021','530','3523','3523','67','70','0','3924.41','3119.4','115.634','0.278359','3526:0 3392:0 '),\n('3394','net1022','530','3523','3877','67','70','1','3410.82','2878.14','142.972','0.18804','3383:0 3395:0 3396:0 '),\n('3395','net1023','530','3523','3877','67','70','0','3473.27','2973.11','143.266','0.989146','3394:0 3391:0 '),\n('3396','net1024','530','3523','3877','67','70','0','3472.55','2819.87','145.201','4.69465','3394:0 3397:0 '),\n('3397','net1025','530','3523','3523','67','70','0','3576.26','2719.73','151.525','3.15525','3396:0 3398:0 '),\n('3398','net1026','530','3523','3523','67','70','0','3439.56','2608.19','150.833','0.802981','3397:0 3399:0 '),\n('3399','net1027','530','3523','3523','67','70','0','3372.76','2617.96','145.564','2.25596','3398:0 3400:0 3403:0 '),\n('3400','net1028','530','3523','3727','67','70','0','3328.76','2674.02','157.504','3.71287','3399:0 3401:0 '),\n('3401','net1029','530','3523','3727','67','70','0','3250.52','2628.38','139.888','2.91962','3400:0 3402:0 '),\n('3402','net1030','530','3523','3523','67','70','0','3285.42','2563.6','113.658','4.09772','3401:0 3403:0 '),\n('3403','net1031','530','3523','3523','67','70','0','3352.87','2536.5','95.7401','1.21138','3399:0 3402:0 3404:0 '),\n('3404','net1033','530','3523','3728','67','70','0','3246.86','2379.03','91.5897','4.38044','3403:0 3405:0 '),\n('3405','net1035','530','3523','3728','67','70','0','3241.13','2272.31','99.5301','4.56501','3404:0 3406:0 '),\n('3406','net1037','530','3523','3728','67','70','0','3202.86','2140.94','138.867','1.63547','3423:0 3405:0 3407:0 '),\n('3407','net1039','530','3523','3728','67','70','0','3162.82','2326.75','134.887','1.78864','3406:0 3408:0 '),\n('3408','net1040','530','3523','3728','67','70','0','3160.48','2406.47','131.04','1.60014','3409:0 3407:0 '),\n('3409','net1041','530','3523','3728','67','70','0','3113.17','2449.04','120.183','2.1774','3408:0 3410:0 '),\n('3410','net1042','530','3523','3728','67','70','0','3069.26','2504.52','114.18','1.78077','3409:0 3380:0 3411:0 '),\n('3411','net1043','530','3523','3734','67','70','0','3083.75','2363.04','144.526','4.81242','3410:0 3412:0 '),\n('3412','net1044','530','3523','3734','67','70','0','3085.33','2294.83','150.494','4.74173','3411:0 3413:0 3419:0 '),\n('3413','net1045','530','3523','3734','67','70','0','3125.61','2238.22','150.562','3.67359','3412:0 3414:0 '),\n('3414','net1046','530','3523','3734','67','70','0','3074.15','2209.78','161.33','3.55578','3413:0 3415:0 '),\n('3415','net1047','530','3523','3734','67','70','0','3017.03','2183.87','165.329','3.55578','3414:0 3416:0 3418:0 '),\n('3416','net1048','530','3523','3734','67','70','0','2998.08','2133.47','165.328','4.35295','3415:0 3417:0 3420:0 '),\n('3417','net1049','530','3523','3734','67','70','0','2946.6','2153.28','165.328','2.77429','3416:0 3418:0 '),\n('3418','net1050','530','3523','3734','67','70','0','2965.73','2206.06','165.328','1.22313','3417:0 3415:0 3419:0 '),\n('3419','net1051','530','3523','3734','67','70','0','2936.31','2281.19','161.738','6.1684','3412:0 3418:0 '),\n('3420','net1054','530','3523','3734','67','70','0','3024.32','2073.46','161.904','5.51533','3416:0 3421:0 '),\n('3421','net1055','530','3523','3728','67','70','0','3109.36','1996.97','143.897','5.55067','3420:0 3422:0 '),\n('3422','net1056','530','3523','3728','67','70','0','3166.19','1968.36','143.636','5.79022','3421:0 3423:0 3424:0 '),\n('3423','net1057','530','3523','3728','67','70','0','3200.13','2051.68','140.786','4.08789','3422:0 3406:0 '),\n('3424','net1058','530','3523','3728','67','70','0','3152.12','1897.92','143.899','6.07689','3422:0 3425:0 3427:0 '),\n('3425','net1059','530','3523','3728','67','70','0','3101.78','1824.2','144.391','4.03094','3426:0 3424:0 '),\n('3426','net1060','530','3523','3728','67','70','1','3001.93','1820.1','139.674','3.72463','3425:0 '),\n('3427','net1061','530','3523','3728','67','70','0','3242.1','1874.48','139.223','3.2581','3424:0 3428:0 '),\n('3428','net1062','530','3523','3721','67','70','0','3356.3','1846.42','102.117','6.15621','3427:0 3429:0 '),\n('3429','net1063','530','3523','3721','67','70','0','3493.95','1840.83','95.7573','0.214661','3428:0 3430:0 '),\n('3430','net1064','530','3523','3735','67','70','0','3613.29','1892.38','114.291','3.62722','3429:0 3459:0 3460:0 '),\n('3431','net1066','530','3523','3736','67','70','0','3865.27','1760.4','212.947','0.885387','3432:0 3456:0 '),\n('3432','net1067','530','3523','3736','67','70','0','3913.4','1809.95','227.674','2.24413','3431:0 3442:0 3433:0 '),\n('3433','net1070','530','3523','3736','67','70','0','3881.31','1918.58','254.223','0.97178','3432:0 3434:0 '),\n('3434','net1071','530','3523','3736','67','70','0','3915.93','1973.35','257.813','1.00712','3435:0 3437:0 3433:0 '),\n('3435','net1072','530','3523','3736','67','70','0','3903.14','2024.48','257.813','1.77289','3434:0 3436:0 '),\n('3436','net1073','530','3523','3736','67','70','0','3959.61','2037.62','257.813','0.233506','3435:0 3437:0 3438:0 '),\n('3437','net1074','530','3523','3736','67','70','0','3969.45','1982.24','257.813','4.86736','3436:0 3434:0 '),\n('3438','net1075','530','3523','3736','67','70','0','3996.64','2094.06','254.332','0.975711','3436:0 3439:0 '),\n('3439','net1077','530','3523','3736','67','70','0','4094.87','2029.53','236.513','5.17366','3438:0 3440:0 '),\n('3440','net1078','530','3523','3736','67','70','0','4145.6','1950.14','225.805','2.1106','3443:0 3441:0 3439:0 '),\n('3441','net1079','530','3523','3736','67','70','0','4106.82','1883.96','228.654','3.273','3440:0 3442:0 '),\n('3442','net1081','530','3523','3736','67','70','0','3993.09','1800.64','228.295','3.01381','3432:0 3441:0 '),\n('3443','net1082','530','3523','3736','67','70','0','4192.46','2017.97','187.695','1.85243','3440:0 3444:0 '),\n('3444','net1083','530','3523','3736','67','70','0','4174.2','2071.5','164.367','1.33406','3443:0 3445:0 '),\n('3445','net1084','530','3523','3735','67','70','0','4198.79','2173.44','151.336','1.33406','3444:0 3446:0 3447:0 3477:0 '),\n('3446','net1085','530','3523','3735','67','70','0','4292.53','2293.49','122.367','0.595787','3445:0 3478:0 '),\n('3447','net1086','530','3523','3854','67','70','0','4247.96','2110.73','144.575','4.7741','3445:0 3448:0 '),\n('3448','net1087','530','3523','3735','67','70','0','4252.18','1989.35','136.107','4.82514','3447:0 3449:0 '),\n('3449','net1088','530','3523','3735','67','70','0','4268.67','1894.47','138.946','4.87226','3448:0 3450:0 3453:0 '),\n('3450','net1089','530','3523','3735','67','70','0','4299.75','1730.52','113.615','4.18507','3449:0 3451:0 '),\n('3451','net1090','530','3523','3735','67','70','0','4113.8','1674.62','130.483','2.68103','3450:0 3452:0 '),\n('3452','net1091','530','3523','3735','67','70','0','4046.36','1742.75','145.812','2.35116','3451:0 3453:0 3454:0 '),\n('3453','net1092','530','3523','3735','67','70','0','4181.61','1781.88','136.718','0.423012','3452:0 3449:0 '),\n('3454','net1093','530','3523','3735','67','70','0','3930.55','1683.62','139.355','3.27165','3452:0 3455:0 '),\n('3455','net1094','530','3523','3735','67','70','0','3819.95','1651.37','133.174','2.01794','3454:0 3457:0 3456:0 '),\n('3456','net1095','530','3523','3735','67','70','0','3785.44','1751.5','175.377','2.55396','3431:0 3455:0 3459:0 '),\n('3457','net1097','530','3523','3735','67','70','0','3779.17','1581.07','120.895','1.36998','3455:0 3458:0 '),\n('3458','net1098','530','3523','3735','67','70','0','3710.46','1647.45','128.67','1.14614','3457:0 3459:0 '),\n('3459','net1099','530','3523','3735','67','70','0','3682.83','1822.97','129.53','5.05546','3458:0 3430:0 3456:0 '),\n('3460','net1100','530','3523','3735','67','70','0','3551.83','1960.87','89.9501','1.23472','3430:0 3461:0 3462:0 '),\n('3461','net1101','530','3523','3735','67','70','0','3582.85','2061.58','97.1173','1.30541','3460:0 '),\n('3462','net1102','530','3523','3735','67','70','0','3654.98','2151.19','121.699','1.26065','3460:0 3463:0 '),\n('3463','net1103','530','3523','3735','67','70','0','3647.05','2320.07','95.0628','1.67298','3462:0 3464:0 '),\n('3464','net1104','530','3523','3735','67','70','0','3753.6','2270.39','127.706','5.84031','3463:0 3465:0 '),\n('3465','net1105','530','3523','3735','67','70','0','3743.54','2216.22','132.261','5.08632','3464:0 3466:0 '),\n('3466','net1106','530','3523','3880','67','70','0','3752.43','2164.28','140.754','4.1949','3465:0 3467:0 3473:0 '),\n('3467','net1107','530','3523','3880','67','70','0','3712.58','2091.74','151.686','5.93062','3466:0 3468:0 '),\n('3468','net1108','530','3523','3880','67','70','0','3791.21','2078.46','153.464','0.004788','3467:0 3469:0 '),\n('3469','net1109','530','3523','3880','67','70','0','3833.37','2045.96','145.651','5.41226','3468:0 3470:0 '),\n('3470','net1110','530','3523','3880','67','70','0','3890.34','2027.56','147.129','1.10633','3469:0 3471:0 '),\n('3471','net1112','530','3523','3880','67','70','0','3911.03','2086.24','156.158','1.07294','3470:0 3472:0 '),\n('3472','net1113','530','3523','3880','67','70','0','3942.19','2139.62','160.422','6.24086','3471:0 '),\n('3473','net1114','530','3523','3735','67','70','0','3790.48','2245.91','149.586','4.56011','3466:0 3474:0 '),\n('3474','net1115','530','3523','3735','67','70','0','3843.92','2279.21','153.861','2.84204','3473:0 3475:0 '),\n('3475','net1116','530','3523','3735','67','70','0','3944.34','2283.35','158.599','6.04059','3474:0 3476:0 '),\n('3476','net1117','530','3523','3735','67','70','0','4063.98','2226.19','164.346','5.41228','3475:0 3477:0 '),\n('3477','net1119','530','3523','3735','67','70','0','4123.87','2142.65','157.701','2.91076','3445:0 3476:0 '),\n('3478','net1121','530','3523','3741','67','70','0','4466.87','2397.83','122.968','0.527102','3446:0 3479:0 '),\n('3479','net1122','530','3523','3741','67','70','0','4530.13','2410.14','141.874','5.42799','3478:0 3480:0 3484:0 '),\n('3480','net1123','530','3523','3741','67','70','0','4566.37','2316.31','146.43','5.07457','3479:0 3481:0 '),\n('3481','net1124','530','3523','3741','67','70','0','4632.34','2295.23','162.104','1.47351','3480:0 3482:0 '),\n('3482','net1125','530','3523','3741','67','70','0','4622.3','2365.33','187.361','1.96046','3481:0 3483:0 '),\n('3483','net1126','530','3523','3741','67','70','0','4729.92','2383.24','198.355','3.24458','3482:0 '),\n('3484','net1127','530','3523','3741','67','70','0','4575.52','2543.12','194.543','0.915856','3479:0 3485:0 '),\n('3485','net1128','530','3523','3741','67','70','0','4579.8','2608.07','196.971','1.06115','3484:0 3486:0 '),\n('3486','net1129','530','3523','3741','67','70','0','4616.02','2682.15','187.718','1.52847','3485:0 3487:0 '),\n('3487','net1130','530','3523','3523','67','70','0','4613.1','2774.93','159.097','0.786306','3486:0 3488:0 3507:0 '),\n('3488','net1131','530','3523','3523','67','70','0','4581.46','2841.92','146.738','1.62271','3487:0 3489:0 3508:0 '),\n('3489','net1132','530','3523','3523','67','70','0','4623.84','2957.12','144.621','1.21823','3488:0 3490:0 3509:0 '),\n('3490','net1133','530','3523','3850','67','70','0','4760.8','2985.3','129.535','0.205073','3489:0 3491:0 '),\n('3491','net1134','530','3523','3850','67','70','0','4849.32','2917.43','146.288','5.62826','3490:0 3492:0 '),\n('3492','net1135','530','3523','3874','67','70','0','4916.97','2942.46','157.256','0.212934','3491:0 3493:0 '),\n('3493','net1136','530','3523','3850','67','70','0','4803.44','3004.17','134.11','2.64374','3492:0 3494:0 '),\n('3494','net1137','530','3523','3523','67','70','0','4689.74','3022.54','131.238','0.00480604','3493:0 3495:0 '),\n('3495','net1138','530','3523','3523','67','70','0','4770.95','3072.84','120.927','0.216864','3494:0 3496:0 '),\n('3496','net1139','530','3523','3523','67','70','0','4841.73','3077.92','111.914','5.77749','3495:0 3497:0 3579:0 '),\n('3497','net1140','530','3523','3874','67','70','0','4921.37','3026.16','99.5096','5.7068','3496:0 3498:0 '),\n('3498','net1141','530','3523','3874','67','70','0','5030.73','3015.92','91.2729','6.18983','3497:0 3499:0 '),\n('3499','net1142','530','3523','3874','67','70','0','5047.36','2928.45','88.8179','4.9057','3498:0 3500:0 '),\n('3500','net1143','530','3523','3874','67','70','0','4988.68','2838.26','81.9239','3.64121','3499:0 3501:0 '),\n('3501','net1144','530','3523','3850','67','70','0','4907.06','2817.68','91.5802','3.63336','3500:0 3502:0 '),\n('3502','net1145','530','3523','3850','67','70','0','4903.41','2721.51','83.4709','4.33629','3501:0 3503:0 '),\n('3503','net1146','530','3523','3850','67','70','0','4844.82','2634.49','94.0377','2.49061','3502:0 3504:0 '),\n('3504','net1147','530','3523','3850','67','70','0','4803.14','2703.36','87.3788','2.22751','3503:0 3505:0 '),\n('3505','net1148','530','3523','3850','67','70','0','4741.03','2771.78','92.6406','2.30998','3504:0 3506:0 '),\n('3506','net1149','530','3523','3850','67','70','0','4719.31','2848.51','113.113','1.8623','3505:0 3507:0 '),\n('3507','net1150','530','3523','3850','67','70','0','4656.43','2805.22','134.562','3.22497','3506:0 3487:0 '),\n('3508','net1151','530','3523','3876','67','70','0','4484.96','2804.2','139.481','1.71701','3488:0 3530:0 '),\n('3509','net1152','530','3523','3740','67','70','0','4590.85','3169.73','146.93','4.87431','3489:0 3510:0 3511:0 3516:0 3569:0 '),\n('3510','net1153','530','3523','3740','67','70','0','4693.85','3149.86','170.153','5.31804','3509:0 3511:0 '),\n('3511','net1154','530','3523','3740','1','60','0','4655.8','3065','169.231','2.59665','3510:0 3509:0 3512:0 '),\n('3512','net1155','530','3523','3740','67','70','0','4685.7','3259.51','173.132','2.39442','3511:0 3513:0 3515:0 '),\n('3513','net1156','530','3523','3740','67','70','0','4776.31','3293.39','196.421','1.55207','3512:0 3514:0 '),\n('3514','net1157','530','3523','3740','67','70','0','4732.45','3359.96','201.252','3.83758','3513:0 3515:0 '),\n('3515','net1158','530','3523','3740','67','70','0','4630.74','3310.08','170.694','5.45551','3514:0 3512:0 '),\n('3516','net1159','530','3523','3523','67','70','0','4397.77','3265.13','143.404','2.67128','3509:0 3517:0 3521:0 3522:0 3569:0 3533:0 '),\n('3517','net1160','530','3523','3739','67','70','0','4463.52','3434.86','167.212','1.19866','3516:0 3518:0 3521:0 '),\n('3518','net1161','530','3523','3739','67','70','0','4387.49','3412.69','167.78','2.42782','3517:0 3519:0 '),\n('3519','net1162','530','3523','3739','67','70','0','4350.61','3471.82','175.837','4.81542','3518:0 3520:0 '),\n('3520','net1163','530','3523','3739','67','70','0','4364.97','3377.13','154.103','0.876653','3519:0 3521:0 '),\n('3521','net1164','530','3523','3739','67','70','0','4427.16','3339.99','152.658','0.896303','3520:0 3516:0 3517:0 '),\n('3522','net1165','530','3523','3738','67','70','0','4313.76','3185.04','161.274','0.774559','3516:0 3523:0 '),\n('3523','net1166','530','3523','3738','67','70','1','4231.39','3159.2','178.712','0.566429','3522:0 3524:0 '),\n('3524','net1167','530','3523','3738','67','70','0','4178.63','3151.63','175.35','3.55094','3523:0 3525:0 '),\n('3525','net1168','530','3523','3738','67','70','0','4098.18','3118.59','159.275','3.31924','3524:0 3526:0 '),\n('3526','net1169','530','3523','3738','67','70','0','4000.86','3107.64','138.035','3.24856','3525:0 3393:0 3527:0 '),\n('3527','net1170','530','3523','3875','67','70','0','4031.23','3259.48','139.947','1.37536','3526:0 3528:0 '),\n('3528','net1171','530','3523','3875','67','70','0','4071.98','3372.71','141.877','5.11779','3527:0 3529:0 3535:0 '),\n('3529','net1172','530','3523','3875','67','70','0','4151.5','3229.24','196.056','3.95933','3528:0 '),\n('3530','net1173','530','3523','3876','67','70','0','4466.66','2879.42','140.619','2.91867','3508:0 3531:0 '),\n('3531','net1174','530','3523','3876','67','70','0','4370.42','2904.8','148.304','2.95794','3530:0 3532:0 '),\n('3532','net1175','530','3523','3876','67','70','0','4330.52','2945.08','132.085','5.41232','3531:0 '),\n('3533','net1176','530','3523','3523','67','70','0','4301.84','3317.13','147.441','2.74981','3516:0 3534:0 '),\n('3534','net1178','530','3523','3523','67','70','0','4181.61','3456.1','144.034','2.38458','3535:0 3533:0 '),\n('3535','net1179','530','3523','3875','67','70','0','4137.43','3393.24','142.177','3.93968','3534:0 3528:0 3536:0 '),\n('3536','net1180','530','3523','3523','67','70','0','4138.78','3496.33','135.37','2.48591','3535:0 3537:0 3563:0 '),\n('3537','net1181','530','3523','3852','67','70','0','4091.57','3538.26','117.689','1.98718','3536:0 3538:0 '),\n('3538','net1182','530','3523','3852','67','70','0','4069.39','3591.81','114.31','2.34453','3537:0 3539:0 '),\n('3539','net1183','530','3523','3722','67','70','0','3910.13','3724.58','112.828','2.44664','3538:0 3540:0 '),\n('3540','net1184','530','3523','3722','67','70','0','3891.58','3773.08','119.636','1.37064','3539:0 3541:0 3556:0 '),\n('3541','net1185','530','3523','3722','67','70','0','3908.92','3833.69','129.749','1.2921','3540:0 3542:0 '),\n('3542','net1186','530','3523','3722','67','70','0','3990.07','3844.3','168.636','3.74058','3541:0 3543:0 '),\n('3543','net1188','530','3523','3722','67','70','0','3883.22','3936.25','179.58','1.96754','3542:0 3544:0 '),\n('3544','net1189','530','3523','3722','67','70','0','3884.07','3990.71','182.988','1.21356','3545:0 3555:0 3543:0 '),\n('3545','net1190','530','3523','3722','67','70','0','3912.9','4038.34','190.499','6.07518','3544:0 3546:0 '),\n('3546','net1191','530','3523','3722','67','70','0','3973.04','4023.83','194.227','6.0634','3545:0 3547:0 3549:0 '),\n('3547','net1192','530','3523','3722','67','70','0','4018.79','4051.87','194.227','0.549902','3546:0 3548:0 3552:0 '),\n('3548','net1193','530','3523','3722','67','70','0','4047.95','4004.82','194.226','3.89178','3547:0 3549:0 '),\n('3549','net1194','530','3523','3722','67','70','0','4001.04','3975.21','194.226','3.74256','3548:0 3546:0 3550:0 '),\n('3550','net1195','530','3523','3722','67','70','0','3987.35','3916.16','191.701','4.48476','3549:0 3551:0 '),\n('3551','net1196','530','3523','3722','67','70','0','4046.25','3890.47','189.426','0.432092','3550:0 '),\n('3552','net1197','530','3523','3722','67','70','0','4034.82','4111.42','191.69','4.44076','3547:0 3553:0 '),\n('3553','net1198','530','3523','3722','67','70','0','4009.09','4170.41','196.566','3.6907','3552:0 3554:0 '),\n('3554','net1199','530','3523','3722','67','70','0','3913.64','4108.63','193.142','4.23262','3553:0 3555:0 '),\n('3555','net1200','530','3523','3722','67','70','0','3881.18','4041.13','183.645','4.80596','3554:0 3544:0 '),\n('3556','net1202','530','3523','3722','67','70','0','3793.14','3905.54','108.811','1.48529','3540:0 3557:0 '),\n('3557','net1203','530','3523','3881','67','70','0','3802.78','4013.52','122.041','4.63866','3558:0 3556:0 '),\n('3558','net1204','530','3523','3881','67','70','0','3873.36','4009.36','122.335','5.89452','3557:0 3559:0 '),\n('3559','net1205','530','3523','3881','67','70','0','3925.68','3980.18','123.291','0.96222','3558:0 3560:0 '),\n('3560','net1206','530','3523','3881','67','70','0','3946.32','4028.85','115.31','5.07772','3559:0 3561:0 '),\n('3561','net1207','530','3523','3881','67','70','0','4034.51','3981.16','124.954','0.0315266','3560:0 3562:0 '),\n('3562','net1208','530','3523','3881','67','70','0','4093.15','3979.78','116.913','6.25973','3561:0 '),\n('3563','net1209','530','3523','3523','67','70','0','4192.46','3560.85','141.75','3.80144','3536:0 3564:0 '),\n('3564','net1210','530','3523','3721','67','70','0','4226.42','3607.77','132.686','0.593084','3563:0 3565:0 '),\n('3565','net1212','530','3523','3721','67','70','0','4313.98','3676.81','118.894','5.57251','3564:0 3566:0 '),\n('3566','net1213','530','3523','3523','67','70','0','4402.34','3609.63','125.622','5.65104','3567:0 3565:0 '),\n('3567','net1214','530','3523','3523','67','70','0','4488.77','3626.57','104.723','0.252208','3566:0 3568:0 '),\n('3568','net1215','530','3523','3721','67','70','0','4533.39','3589.74','117.794','5.57721','3567:0 '),\n('3569','net1216','530','3523','3740','67','70','0','4515.18','3245.18','144.362','1.06117','3509:0 3516:0 3570:0 '),\n('3570','net1217','530','3523','3740','67','70','0','4540.26','3296.59','134.776','0.813774','3569:0 3571:0 '),\n('3571','net1218','530','3523','3523','67','70','0','4586.71','3342.4','125.714','0.566373','3570:0 3572:0 '),\n('3572','net1219','530','3523','3523','67','70','0','4668.88','3392.34','110.519','0.444637','3571:0 3573:0 '),\n('3573','net1220','530','3523','3900','67','70','0','4744.11','3423.26','102.517','0.629205','3572:0 3574:0 '),\n('3574','net1221','530','3523','3900','67','70','0','4791.18','3452.42','102.703','5.32589','3573:0 3575:0 '),\n('3575','net1222','530','3523','3523','67','70','0','4831.57','3384.27','122','4.79967','3574:0 3576:0 '),\n('3576','net1223','530','3523','3523','67','70','0','4850.84','3313.75','131.13','3.99465','3575:0 3577:0 '),\n('3577','net1224','530','3523','3523','67','70','0','4816.07','3269.64','149.703','0.982658','3576:0 3578:0 '),\n('3578','net1225','530','3523','3523','67','70','0','4832.65','3173.12','139.44','1.878','3577:0 3579:0 '),\n('3579','net1226','530','3523','3523','67','70','0','4806.1','3117.37','139.757','4.67009','3578:0 3496:0 '),\n('3580','shmv1227','530','3520','3520','67','70','0','-2866.67','3174.8','12.0966','4.03472','2809:0 3581:0 '),\n('3581','shmv1228','530','3520','3520','67','70','0','-2919.41','3080.6','39.7651','0.776879','3580:0 3582:0 '),\n('3582','shmv1229','530','3520','3520','67','70','0','-2912.13','3021.5','54.1235','3.61375','3581:0 3583:0 '),\n('3583','shmv1230','530','3520','3520','67','70','0','-3025.35','2947.82','86.1102','3.93969','3582:0 3584:0 '),\n('3584','shmv1231','530','3520','3743','67','70','0','-3075.55','2877.97','82.0334','3.71192','3583:0 3585:0 3592:0 3749:0 '),\n('3585','shmv1232','530','3520','3743','67','70','0','-3179.64','2866.95','94.9902','2.90296','3584:0 3586:0 '),\n('3586','shmv1233','530','3520','3743','67','70','0','-3236.04','2882.68','114.136','3.1857','3585:0 3587:0 3746:0 '),\n('3587','shmv1234','530','3520','3743','67','70','0','-3367.61','2868.56','158.738','3.24853','3586:0 3588:0 3591:0 '),\n('3588','shmv1235','530','3520','3743','67','70','0','-3404.24','2930.17','169.88','0.354339','3587:0 3589:0 '),\n('3589','shmv1236','530','3520','3743','67','70','0','-3346.8','2955.36','169.88','0.413244','3588:0 3590:0 '),\n('3590','shmv1237','530','3520','3743','67','70','0','-3375.43','3001.18','170.817','2.12933','3589:0 3591:0 '),\n('3591','shmv1238','530','3520','3743','67','70','0','-3444.14','2938.58','172.959','3.88077','3590:0 3587:0 '),\n('3592','shmv1239','530','3520','3520','67','70','0','-3181.96','2718.28','68.7275','4.12424','3584:0 3593:0 3602:0 '),\n('3593','shmv1240','530','3520','3744','67','70','0','-3176.94','2562.78','61.0113','0.102998','3592:0 3594:0 3603:0 '),\n('3594','shmv1241','530','3520','3744','67','70','5','-3111.48','2564.12','61.7347','0.0205314','3593:0 3595:0 '),\n('3595','shmv1242','530','3520','3744','67','70','5','-3059.25','2507.74','62.9718','4.55621','3594:0 3596:0 '),\n('3596','shmv1243','530','3520','3744','67','70','4','-3069.01','2436.27','63.7223','4.4227','3595:0 3597:0 '),\n('3597','shmv1244','530','3520','3520','67','70','0','-3123.06','2321.13','59.93','3.60981','3596:0 3598:0 3604:0 '),\n('3598','shmv1245','530','3520','3520','67','70','0','-3231.28','2289.35','59.5698','4.92143','3597:0 3599:0 3652:0 '),\n('3599','shmv1246','530','3520','3520','67','70','0','-3462.86','2282.37','63.8282','3.30352','3598:0 3600:0 3605:0 '),\n('3600','shmv1247','530','3520','3949','67','70','0','-3455.95','2462.16','58.5579','1.65025','3599:0 3601:0 3652:0 '),\n('3601','shmv1248','530','3520','3520','67','70','0','-3483.53','2605.88','62.0554','4.92536','3600:0 3602:0 3750:0 '),\n('3602','shmv1249','530','3520','3520','67','70','0','-3301.81','2669.56','57.3856','0.154061','3601:0 3592:0 3603:0 '),\n('3603','shmv1250','530','3520','3744','67','70','0','-3199.36','2470.72','62.1645','2.00446','3602:0 3593:0 3604:0 '),\n('3604','shmv1251','530','3520','3520','67','70','0','-3210.03','2392.06','61.8107','5.34555','3597:0 3603:0 '),\n('3605','shmv1252','530','3520','3520','67','70','0','-3690.32','2310.79','78.5618','6.17099','3599:0 3606:0 3612:0 3750:0 '),\n('3606','shmv1253','530','3520','3752','67','70','0','-3792.84','2478.03','79.8242','1.51751','3605:0 3607:0 3611:0 '),\n('3607','shmv1254','530','3520','3752','67','70','0','-3790.89','2565.75','91.2376','1.68244','3606:0 3608:0 3609:0 '),\n('3608','shmv1255','530','3520','3752','67','70','0','-3793.32','2666.77','101.912','1.6471','3607:0 '),\n('3609','shmv1256','530','3520','3752','67','70','0','-4020.54','2670.54','126.986','4.24676','3607:0 3610:0 '),\n('3610','shmv1257','530','3520','3752','67','70','0','-4064.49','2549.64','134.278','5.45704','3609:0 3611:0 '),\n('3611','shmv1258','530','3520','3752','67','70','0','-3950.4','2473.76','116.781','0.0024457','3610:0 3606:0 '),\n('3612','shmv1259','530','3520','3745','67','70','0','-3762.45','2127.89','76.7131','3.78807','3605:0 3613:0 3616:0 '),\n('3613','shmv1260','530','3520','3745','67','70','2','-3882.03','2033.78','96.002','2.18978','3612:0 3614:0 3616:0 '),\n('3614','shmv1261','530','3520','3745','67','70','3','-3952.84','2136.12','98.2022','2.21727','3613:0 3615:0 '),\n('3615','shmv1262','530','3520','3745','67','70','3','-3972.41','2203.81','101.676','5.04862','3614:0 '),\n('3616','shmv1263','530','3520','3520','67','70','0','-3769.55','1947.31','94.6509','4.07473','3612:0 3613:0 3617:0 '),\n('3617','shmv1264','530','3520','3520','67','70','0','-3890.57','1771.31','96.9587','3.89017','3616:0 3618:0 3653:0 '),\n('3618','shmv1265','530','3520','3520','67','70','0','-4052.33','1643.87','94.7068','4.5499','3617:0 3619:0 '),\n('3619','shmv1266','530','3520','3520','67','70','0','-4057.55','1395.83','83.9803','4.95438','3618:0 3620:0 3664:0 3679:0 '),\n('3620','shmv1267','530','3520','3520','67','70','0','-4028.73','1253.84','79.0241','1.89525','3619:0 3621:0 '),\n('3621','shmv1268','530','3520','3520','67','70','0','-3956.14','1083.59','27.6555','5.11538','3620:0 3622:0 3684:0 3771:0 '),\n('3622','shmv1269','530','3520','3520','67','70','0','-3882.17','883.51','18.5293','4.46743','3621:0 3623:0 3685:0 '),\n('3623','shmv1270','530','3520','3520','67','70','0','-3840.27','741.517','11.8649','0.0181477','3622:0 3624:0 3685:0 '),\n('3624','shmv1271','530','3520','3520','67','70','0','-3586.49','737.497','-11.4566','0.0534906','3623:0 3625:0 3627:0 3778:0 '),\n('3625','shmv1272','530','3520','3520','67','70','0','-3561.52','586.272','10.6201','4.78552','3624:0 3626:0 3693:0 3705:0 '),\n('3626','shmv1273','530','3520','3520','67','70','0','-3569.67','423.902','28.3305','4.75019','3625:0 '),\n('3627','shmv1274','530','3520','3520','67','70','0','-3346.71','753.909','-26.6716','0.0849111','3624:0 3628:0 3729:0 '),\n('3628','shmv1275','530','3520','3520','67','70','0','-3232.2','784.314','-19.8198','0.00243998','3627:0 3629:0 '),\n('3629','shmv1276','530','3520','3754','67','70','0','-3120.7','799.898','-22.5484','1.24337','3628:0 3630:0 3717:0 '),\n('3630','shmv1277','530','3520','3520','67','70','0','-3121.46','1102.68','20.44','1.2473','3629:0 3631:0 3717:0 '),\n('3631','shmv1278','530','3520','3753','67','70','0','-3106.91','1197.3','22.976','1.40439','3630:0 3632:0 3725:0 3726:0 '),\n('3632','shmv1279','530','3520','3520','67','70','0','-3026.37','1314.44','8.68562','0.968488','3631:0 3633:0 3733:0 '),\n('3633','shmv1280','530','3520','3520','67','70','0','-2904.03','1491.38','14.8027','0.960634','3632:0 3634:0 '),\n('3634','shmv1281','530','3520','3750','67','70','0','-2867.58','1577.53','15.2282','2.85737','3633:0 3635:0 3751:0 '),\n('3635','shmv1282','530','3520','3750','67','70','0','-2824.65','1682.74','22.3429','1.17662','3634:0 3636:0 '),\n('3636','shmv1283','530','3520','3750','67','70','0','-2886.26','1742.5','43.8502','2.40576','3635:0 3637:0 '),\n('3637','shmv1284','530','3520','3520','67','70','0','-2975.68','1908','104.519','2.08612','3636:0 3638:0 '),\n('3638','shmv1285','530','3520','3520','67','70','0','-3102.48','1972.24','105.605','0.868752','3637:0 3639:0 3642:0 '),\n('3639','shmv1286','530','3520','3520','67','70','0','-3180.63','2099.72','75.4619','0.291484','3638:0 3640:0 3643:0 '),\n('3640','shmv1287','530','3520','3933','67','70','0','-3042.81','2156.41','79.2338','0.393586','3639:0 3641:0 '),\n('3641','shmv1288','530','3520','3933','67','70','0','-3015.9','2104.22','90.4026','4.71721','3640:0 3642:0 '),\n('3642','shmv1289','530','3520','3933','67','70','0','-3017.6','2046.19','96.9335','3.75903','3641:0 3638:0 '),\n('3643','shmv1290','530','3520','3748','67','70','0','-3265.68','2066.96','73.9146','4.35987','3639:0 3652:0 3644:0 '),\n('3644','shmv1291','530','3520','3748','67','70','0','-3287.9','1978.44','52.6152','2.07043','3643:0 3648:0 '),\n('3645','shmv1294','530','3520','3748','67','70','0','-3389.68','1984.65','24.8931','1.53832','3646:0 3648:0 '),\n('3646','shmv1295','530','3520','3748','67','70','0','-3405.52','2054.01','15.1476','3.06395','3647:0 3645:0 '),\n('3647','shmv1296','530','3520','3748','67','70','0','-3321.42','2125.97','3.08638','2.40814','3646:0 '),\n('3648','shmv1297','530','3520','3748','67','70','0','-3343.59','2008.19','32.1771','2.00758','3649:0 3645:0 3644:0 '),\n('3649','shmv1298','530','3520','3748','67','70','0','-3419.14','2114.58','34.4588','2.18822','3648:0 3650:0 '),\n('3650','shmv1299','530','3520','3748','67','70','0','-3495.43','2186.55','33.5276','5.96992','3649:0 3651:0 '),\n('3651','shmv1301','530','3520','3748','67','70','0','-3410.98','2272.59','33.8565','1.54813','3650:0 '),\n('3652','shmv1302','530','3520','3949','67','70','0','-3336.88','2207.97','74.9806','2.06645','3643:0 3598:0 3600:0 '),\n('3653','shmv1303','530','3520','3932','67','70','0','-4003.29','1878.34','76.5277','5.50491','3617:0 3654:0 '),\n('3654','shmv1304','530','3520','3932','67','70','0','-4085.04','1923.15','77.0726','5.10829','3653:0 3655:0 '),\n('3655','shmv1305','530','3520','3932','67','70','0','-4058.27','1821.93','84.9857','4.00088','3654:0 3656:0 '),\n('3656','shmv1306','530','3520','3932','67','70','0','-4103.15','1784.26','103.457','4.80985','3655:0 3657:0 '),\n('3657','shmv1307','530','3520','3932','67','70','0','-4195.07','1861.58','109.916','5.5167','3656:0 3658:0 '),\n('3658','shmv1308','530','3520','3822','67','70','0','-4334.08','1789.5','144.816','3.61996','3657:0 3659:0 '),\n('3659','shmv1309','530','3520','3822','67','70','0','-4420.11','1797.35','157.396','4.44855','3658:0 3660:0 3668:0 '),\n('3660','shmv1310','530','3520','3822','67','70','0','-4448.82','1724.98','158.876','4.33467','3659:0 3661:0 3666:0 '),\n('3661','shmv1311','530','3520','3822','67','70','0','-4383.86','1707.44','156.573','5.0533','3660:0 3662:0 '),\n('3662','shmv1312','530','3520','3822','67','70','0','-4361','1640.49','156.748','5.04152','3661:0 3663:0 3665:0 '),\n('3663','shmv1313','530','3520','3822','67','70','0','-4252.69','1521.47','129.453','5.45072','3662:0 3664:0 3672:0 '),\n('3664','shmv1314','530','3520','3822','67','70','0','-4141.51','1512.19','103.518','6.20863','3663:0 3619:0 '),\n('3665','shmv1315','530','3520','3822','67','70','0','-4423.22','1575.75','164.241','3.96398','3662:0 3666:0 '),\n('3666','shmv1316','530','3520','3822','67','70','0','-4491.12','1668.12','165.043','2.20469','3665:0 3660:0 3667:0 '),\n('3667','shmv1317','530','3520','3822','67','70','0','-4564.8','1670.31','174.579','3.11182','3666:0 '),\n('3668','shmv1318','530','3520','3520','67','70','0','-4426.81','1860.99','159.258','2.50232','3659:0 3669:0 '),\n('3669','shmv1319','530','3520','3930','67','70','0','-4488.03','1934.26','144.075','1.12787','3668:0 3670:0 '),\n('3670','shmv1320','530','3520','3930','67','70','0','-4450.04','1988.33','105.344','2.32482','3669:0 3671:0 '),\n('3671','shmv1321','530','3520','3930','67','70','0','-4500.91','2022.31','100.196','4.19013','3670:0 '),\n('3672','shmv1323','530','3520','3929','67','70','0','-4234.47','1405.21','129.348','4.72107','3663:0 3673:0 '),\n('3673','shmv1324','530','3520','3929','67','70','0','-4309.54','1384.96','143.997','3.08352','3672:0 3674:0 '),\n('3674','shmv1325','530','3520','3950','67','70','0','-4558.9','1328.47','135.392','6.27616','3673:0 3675:0 '),\n('3675','shmv1326','530','3520','3929','67','70','0','-4452.67','1313.79','113.624','0.000826359','3674:0 3676:0 '),\n('3676','shmv1327','530','3520','3929','67','70','0','-4318.73','1322.33','73.5928','6.21333','3675:0 3677:0 3680:0 '),\n('3677','shmv1328','530','3520','3929','67','70','0','-4226.21','1305.14','56.0568','6.20155','3676:0 3678:0 '),\n('3678','shmv1329','530','3520','3929','67','70','0','-4117.45','1299.67','52.606','1.29281','3677:0 3679:0 '),\n('3679','shmv1330','530','3520','3520','67','70','0','-4096.52','1451.91','87.6478','5.2198','3678:0 3619:0 '),\n('3680','shmv1331','530','3520','3929','67','70','0','-4403.59','1300.45','84.0575','3.42125','3676:0 3681:0 '),\n('3681','shmv1332','530','3520','3520','67','70','0','-4511.47','1203.3','34.9082','3.43695','3680:0 3682:0 '),\n('3682','shmv1333','530','3520','3945','67','70','0','-4641.99','1163.55','-14.0182','0.205018','3681:0 3683:0 '),\n('3683','shmv1334','530','3520','3945','67','70','0','-4660.62','1088.53','0.90432','5.98162','3682:0 '),\n('3684','shmv1335','530','3520','3938','67','70','1','-4090.85','1104.54','41.0582','5.28662','3621:0 3685:0 '),\n('3685','shmv1336','530','3520','3758','67','70','0','-4110.45','861.06','9.26995','4.56397','3684:0 3622:0 3623:0 3686:0 '),\n('3686','shmv1337','530','3520','3939','67','70','0','-4149.68','586.65','8.64057','4.66214','3685:0 3687:0 '),\n('3687','shmv1338','530','3520','3939','67','70','0','-4184.61','489.528','29.5585','1.24958','3688:0 3689:0 3686:0 '),\n('3688','shmv1339','530','3520','3939','67','70','0','-4114.39','424.914','34.9882','2.74575','3687:0 '),\n('3689','shmv1341','530','3520','3939','67','70','0','-4224.07','420.493','51.1341','1.46947','3687:0 3690:0 '),\n('3690','shmv1342','530','3520','3939','67','70','0','-4299.45','334.074','109.437','3.99453','3689:0 3691:0 '),\n('3691','shmv1344','530','3520','3939','67','70','0','-4202.19','250.869','124.805','2.69862','3690:0 3692:0 '),\n('3692','shmv1345','530','3520','3939','67','70','0','-4203.68','345.854','115.285','1.493','3691:0 '),\n('3693','shmv1346','530','3520','3520','67','70','0','-3501.72','557.894','16.7235','0.323666','3625:0 3694:0 '),\n('3694','shmv1347','530','3520','3757','67','70','0','-3426.99','580.376','42.2179','5.95105','3693:0 3695:0 '),\n('3695','shmv1348','530','3520','3757','67','70','0','-3327.45','544.282','74.5225','4.63944','3694:0 3696:0 '),\n('3696','shmv1349','530','3520','3757','67','70','0','-3333.62','454.382','99.8124','6.05315','3695:0 3697:0 3704:0 '),\n('3697','shmv1350','530','3520','3757','67','70','0','-3228.24','439.514','104.731','3.31604','3696:0 3698:0 '),\n('3698','shmv1351','530','3520','3757','67','70','0','-3392.06','415.921','103.96','4.61195','3697:0 3699:0 3704:0 '),\n('3699','shmv1352','530','3520','3757','67','70','0','-3390.43','293.527','103.961','4.72583','3698:0 3700:0 '),\n('3700','shmv1353','530','3520','3757','67','70','0','-3337.54','294.86','116.382','1.36824','3699:0 3701:0 '),\n('3701','shmv1354','530','3520','3757','67','70','0','-3324.03','371.217','120.458','5.9746','3700:0 3702:0 '),\n('3702','shmv1355','530','3520','3757','67','70','0','-3231.77','337.352','127.504','4.49021','3701:0 3703:0 '),\n('3703','shmv1356','530','3520','3757','67','70','0','-3239.92','279.443','137.131','4.57267','3702:0 '),\n('3704','shmv1357','530','3520','3757','67','70','0','-3416.2','459.709','103.935','5.91964','3696:0 3698:0 '),\n('3705','shmv1358','530','3520','3756','67','70','0','-3685.39','550.038','35.0742','2.93905','3625:0 3706:0 '),\n('3706','shmv1359','530','3520','3756','67','70','0','-3813.8','565.02','71.7251','4.91432','3705:0 3707:0 '),\n('3707','shmv1360','530','3520','3756','67','70','0','-3802.41','461.803','99.9172','4.68655','3706:0 3708:0 3716:0 '),\n('3708','shmv1361','530','3520','3756','67','70','0','-3896.83','442.087','104.97','6.26668','3707:0 3709:0 '),\n('3709','shmv1362','530','3520','3756','67','70','0','-3719.39','417.216','104.061','2.6833','3708:0 3710:0 3716:0 '),\n('3710','shmv1363','530','3520','3756','67','70','0','-3732.23','295.716','104.066','3.10939','3709:0 3711:0 '),\n('3711','shmv1364','530','3520','3756','67','70','0','-3786.92','297.908','116.455','3.10153','3710:0 3712:0 '),\n('3712','shmv1365','530','3520','3756','67','70','0','-3812.37','248.065','120.604','1.80405','3711:0 3713:0 '),\n('3713','shmv1366','530','3520','3756','67','70','0','-3838.38','357.549','120.582','1.80405','3712:0 3714:0 '),\n('3714','shmv1367','530','3520','3756','67','70','0','-3904.87','343.016','127.62','4.76657','3713:0 3715:0 '),\n('3715','shmv1368','530','3520','3756','67','70','0','-3890.45','282.542','137.239','3.8665','3714:0 '),\n('3716','shmv1369','530','3520','3756','67','70','0','-3719.66','475.869','104.038','4.2914','3709:0 3707:0 '),\n('3717','shmv1370','530','3520','3754','67','70','0','-3124.49','886.832','-14.3889','1.56135','3629:0 3630:0 3718:0 '),\n('3718','shmv1371','530','3520','3754','67','70','1','-3061.33','830.398','-10.215','4.92836','3717:0 3719:0 '),\n('3719','shmv1372','530','3520','3520','67','70','0','-3030.95','544.921','-1.12904','0.00390148','3718:0 3720:0 '),\n('3720','shmv1373','530','3520','3520','67','70','0','-2881.37','547.854','-13.197','0.0196085','3719:0 3721:0 '),\n('3721','shmv1374','530','3520','3520','67','70','0','-2744.62','677.917','-16.4588','1.42468','3720:0 3722:0 '),\n('3722','shmv1375','530','3520','3520','67','70','0','-2720.25','857.215','-3.3875','4.54664','3721:0 3723:0 '),\n('3723','shmv1376','530','3520','3520','67','70','0','-2768.24','985.559','-2.57223','2.06085','3722:0 3724:0 '),\n('3724','shmv1377','530','3520','3520','67','70','0','-2871.08','1130.08','8.92665','3.16433','3723:0 3725:0 '),\n('3725','shmv1378','530','3520','3520','67','70','0','-2984.92','1134.44','-3.92959','2.62712','3724:0 3631:0 '),\n('3726','shmv1379','530','3520','3753','67','70','0','-3245.6','1189.8','59.4774','4.33927','3631:0 3727:0 3731:0 '),\n('3727','shmv1380','530','3520','3753','67','70','0','-3222.89','1092.48','64.7857','6.14175','3726:0 3728:0 3731:0 3732:0 '),\n('3728','shmv1381','530','3520','3753','67','70','0','-3292.57','985.163','40.7467','5.15608','3727:0 3730:0 '),\n('3729','shmv1382','530','3520','3753','67','70','0','-3344.18','870.1','-14.6762','4.80342','3627:0 3730:0 '),\n('3730','shmv1383','530','3520','3753','67','70','0','-3205.87','897.037','49.1172','0.192352','3729:0 3728:0 '),\n('3731','shmv1384','530','3520','3753','67','70','0','-3399.1','1175.31','50.0129','3.15252','3726:0 3727:0 3732:0 '),\n('3732','shmv1385','530','3520','3753','67','70','0','-3335.34','1043.32','47.1116','0.383668','3727:0 3731:0 3772:0 '),\n('3733','shmv1386','530','3520','3749','67','70','0','-2929.04','1324.33','7.92349','5.43769','3632:0 3734:0 '),\n('3734','shmv1387','530','3520','3749','67','70','0','-2845.89','1301.54','6.02801','3.20519','3733:0 3735:0 '),\n('3735','shmv1388','530','3520','3749','67','70','0','-2847.46','1231.33','6.78906','1.62065','3734:0 3736:0 '),\n('3736','shmv1390','530','3520','3749','67','70','0','-2732.51','1138.3','2.89233','2.40802','3735:0 3737:0 '),\n('3737','shmv1391','530','3520','3749','67','70','0','-2634.08','1230.04','11.146','1.86804','3738:0 3736:0 '),\n('3738','shmv1392','530','3520','3749','67','70','0','-2651.9','1282.45','26.4813','3.01869','3737:0 3739:0 '),\n('3739','shmv1393','530','3520','3749','67','70','0','-2710.39','1300.75','33.7332','1.28218','3738:0 3740:0 '),\n('3740','shmv1394','530','3520','3749','67','70','0','-2690.89','1361.98','35.0836','6.28124','3739:0 3741:0 '),\n('3741','shmv1395','530','3520','3749','67','70','0','-2617.04','1355.97','37.2382','0.18183','3740:0 3742:0 '),\n('3742','shmv1396','530','3520','3749','67','70','0','-2769.22','1301.12','33.2111','3.48993','3741:0 3743:0 3745:0 '),\n('3743','shmv1397','530','3520','3749','67','70','0','-2721.9','1224.71','33.0771','5.26886','3742:0 3744:0 '),\n('3744','shmv1398','530','3520','3749','67','70','0','-2817.63','1365.79','38.5145','5.53669','3743:0 3745:0 '),\n('3745','shmv1399','530','3520','3749','67','70','0','-2766.14','1383.17','37.6732','0.325571','3744:0 3742:0 '),\n('3746','shmv1400','530','3520','3743','67','70','0','-3280.76','3002.45','141.658','1.22092','3586:0 3747:0 '),\n('3747','shmv1401','530','3520','3743','67','70','0','-3273.62','3077.71','139.787','0.31771','3746:0 3748:0 '),\n('3748','shmv1402','530','3520','3743','67','70','0','-3211.67','3079.46','126.239','5.52566','3747:0 3749:0 '),\n('3749','shmv1403','530','3520','3743','67','70','0','-3143.09','3024.9','104.296','5.41086','3584:0 3748:0 '),\n('3750','shmv1405','530','3520','3752','67','70','0','-3656.3','2553.97','77.5087','0.0120506','3601:0 3605:0 '),\n('3751','shmv1406','530','3520','3750','67','70','0','-2941.74','1589.4','40.8211','2.08903','3634:0 3752:0 '),\n('3752','shmv1407','530','3520','3750','67','70','0','-2978.15','1677.35','67.3118','2.1715','3751:0 3753:0 '),\n('3753','shmv1408','530','3520','3750','67','70','0','-3032.93','1672.83','67.4735','3.60878','3752:0 3754:0 3757:0 '),\n('3754','shmv1409','530','3520','3750','67','70','0','-3131.22','1754.16','79.6664','2.79589','3753:0 3755:0 '),\n('3755','shmv1410','530','3520','3750','67','70','0','-3191.61','1765.69','88.3304','2.95297','3754:0 3756:0 '),\n('3756','shmv1411','530','3520','3520','67','70','0','-3345.81','1700.42','95.7466','5.65474','3755:0 3757:0 '),\n('3757','shmv1412','530','3520','3520','67','70','0','-3188.39','1586.02','63.3792','0.565352','3756:0 3753:0 3758:0 3760:0 '),\n('3758','shmv1413','530','3520','3520','67','70','0','-3052.53','1476.53','17.9049','2.50057','3757:0 3759:0 '),\n('3759','shmv1414','530','3520','3520','67','70','0','-3107.69','1379.15','12.0022','4.19702','3758:0 '),\n('3760','shmv1415','530','3520','3750','67','70','0','-3103.19','1550.28','39.5694','2.77978','3757:0 3761:0 '),\n('3761','shmv1416','530','3520','3520','67','70','0','-3196.31','1501.96','57.1479','2.95256','3760:0 3762:0 '),\n('3762','shmv1417','530','3520','3747','67','70','0','-3282.99','1527.47','52.2295','5.92921','3761:0 3763:0 '),\n('3763','shmv1418','530','3520','3747','67','70','0','-3394.49','1550.46','48.1579','2.93214','3762:0 3764:0 '),\n('3764','shmv1419','530','3520','3747','67','70','0','-3500.47','1622.81','43.8418','3.38295','3763:0 3765:0 '),\n('3765','shmv1420','530','3520','3747','67','70','0','-3693.06','1558.48','46.9758','1.02649','3764:0 3766:0 '),\n('3766','shmv1421','530','3520','3747','67','70','0','-3828.74','1475.85','43.1674','4.10996','3765:0 3767:0 '),\n('3767','shmv1422','530','3520','3747','67','70','0','-3888.12','1398.74','43.6642','4.04478','3766:0 3768:0 '),\n('3768','shmv1423','530','3520','3747','67','70','0','-3858.68','1336.7','42.2274','4.47911','3767:0 3769:0 '),\n('3769','shmv1424','530','3520','3747','67','70','0','-3883.95','1244.97','42.1164','4.44376','3768:0 3770:0 3771:0 '),\n('3770','shmv1425','530','3520','3520','67','70','0','-3774.38','1225.16','84.9138','6.04598','3769:0 '),\n('3771','shmv1426','530','3520','3520','67','70','0','-3969.44','1164.97','46.6673','5.0878','3769:0 3621:0 '),\n('3772','shmv1427','530','3520','3753','67','70','0','-3423.61','1074.97','42.8376','3.2539','3732:0 3773:0 '),\n('3773','shmv1428','530','3520','3520','67','70','0','-3574.75','1067.86','40.499','3.19107','3772:0 3774:0 '),\n('3774','shmv1429','530','3520','3821','67','70','0','-3680.33','1058.59','68.153','2.90833','3773:0 3775:0 3776:0 '),\n('3775','shmv1430','530','3520','3821','67','70','0','-3760.76','1068.11','70.1361','6.14809','3774:0 '),\n('3776','shmv1431','530','3520','3520','67','70','0','-3642.27','894.441','45.4124','5.92247','3774:0 3777:0 '),\n('3777','shmv1432','530','3520','3520','67','70','0','-3522.57','841.492','-2.90146','4.68834','3776:0 3778:0 '),\n('3778','shmv1433','530','3520','3520','67','70','0','-3522.09','776.814','-14.2281','4.71976','3777:0 3624:0 '),\n('3779','bt001','571','3537','4129','68','73','5','2817.61','6168.46','85.5727','3.94245','3780:0 '),\n('3780','bt002','571','3537','4020','68','73','5','2726.11','6082.88','72.3512','3.45943','3779:0 3781:0 '),\n('3781','bt003','571','3537','4020','68','73','0','2604.99','6083.81','53.2961','2.26563','3780:0 3782:0 3832:0 '),\n('3782','bt004','571','3537','4020','68','73','0','2505.63','6178.07','53.1691','5.59574','3781:0 3783:0 3839:0 '),\n('3783','bt005','571','3537','4130','68','73','0','2589.16','6313.74','86.8706','0.137219','3782:0 3784:0 3832:0 '),\n('3784','bt006','571','3537','3537','68','73','0','2818.32','6342.97','101.266','3.15078','3783:0 3785:0 3791:0 '),\n('3785','bt007','571','3537','3537','68','73','0','2823.08','6550.12','55.029','4.6077','3784:0 3786:0 3790:0 '),\n('3786','bt008','571','3537','4106','68','73','0','2946.88','6730.38','13.9226','0.998791','3785:0 3787:0 3788:0 '),\n('3787','bt009','571','3537','4106','68','73','0','3100','6716.93','0.818624','2.88374','3786:0 '),\n('3788','bt010','571','3537','4106','68','73','0','2769.6','6817.13','0.382068','5.63656','3786:0 3789:0 '),\n('3789','bt011','571','3537','4031','68','73','0','2511.71','6709.76','8.65944','0.559735','3788:0 3790:0 '),\n('3790','bt012','571','3537','4130','68','73','0','2598.94','6513.07','41.9513','4.98704','3789:0 3785:0 '),\n('3791','bt013','571','3537','3537','68','73','0','2977.63','6387.87','96.0276','3.55919','3784:0 3792:0 '),\n('3792','bt014','571','3537','3537','68','73','0','3117.74','6401.57','85.8869','4.84331','3791:0 3793:0 '),\n('3793','bt015','571','3537','3537','68','73','0','3146.95','6242.85','96.6515','5.78972','3792:0 3794:0 '),\n('3794','bt016','571','3537','4105','68','73','0','3332.48','6165.54','75.7667','2.87983','3793:0 '),\n('3795','bt017','571','3537','3537','68','73','0','3270.88','5961.4','84.9677','4.81845','3796:0 3797:0 3826:0 '),\n('3796','bt018','571','3537','3537','68','73','1','3624.25','5933.39','136.215','3.44596','3797:0 3795:0 '),\n('3797','bt019','571','3537','4109','68','73','0','3297.83','5691.4','59.3737','4.58728','3796:0 3798:0 3795:0 '),\n('3798','bt020','571','3537','3537','68','73','0','3304.79','5470.21','55.3479','4.73257','3797:0 3799:0 3852:0 '),\n('3799','bt021','571','3537','3537','68','73','0','3482.47','5425.21','50.7507','1.49045','3798:0 3800:0 '),\n('3800','bt022','571','3537','3537','68','73','0','3532.8','5540.21','65.5113','4.20635','3799:0 3801:0 3937:0 '),\n('3801','bt023','571','3537','3537','68','73','0','3504.09','5638.44','63.5206','1.09146','3800:0 3802:0 3937:0 '),\n('3802','bt024','571','3537','3537','68','73','0','3651.69','5686.01','66.2432','0.569961','3801:0 3803:0 3937:0 '),\n('3803','bt025','571','3537','3537','68','73','0','3809.81','5773.85','68.3307','0.134065','3802:0 3804:0 3937:0 '),\n('3804','bt026','571','3537','4127','68','73','0','3969.32','5781.55','74.0472','0.432523','3803:0 3805:0 3896:0 '),\n('3805','bt027','571','3537','3537','68','73','0','4170.05','5855.36','62.8346','0.137999','3804:0 3806:0 3816:0 3819:0 '),\n('3806','bt028','571','3537','3537','68','73','0','4324.68','6015.4','25.5474','1.07655','3805:0 3807:0 '),\n('3807','bt029','571','3537','4099','68','73','0','4401.85','6148.33','0.553693','4.54723','3806:0 3808:0 '),\n('3808','bt030','571','3537','4033','68','73','0','4287.27','6236.78','0.383892','3.29845','3807:0 3809:0 '),\n('3809','bt031','571','3537','4033','68','73','0','4184.73','6193.42','9.12228','1.7952','3808:0 3810:0 '),\n('3810','bt032','571','3537','4033','68','73','0','4149.36','6252.75','30.8789','2.52797','3809:0 3811:0 3812:0 '),\n('3811','bt033','571','3537','4097','68','73','0','4056.14','6303.43','25.1363','1.18887','3810:0 '),\n('3812','bt034','571','3537','4097','68','73','0','4052.65','6367.67','27.4251','1.08833','3810:0 3813:0 3815:0 '),\n('3813','bt035','571','3537','4097','68','73','0','3991.71','6304.02','8.08314','0.901407','3812:0 '),\n('3814','bt036','571','3537','4097','68','73','0','3854.4','6397.67','24.5748','5.34115','3815:0 '),\n('3815','bt037','571','3537','4097','68','73','0','3960.88','6426.15','11.3447','0.519589','3812:0 3814:0 '),\n('3816','bt038','571','3537','4134','68','73','0','4404.37','5906.55','55.8142','0.126085','3805:0 3817:0 3818:0 '),\n('3817','bt039','571','3537','4132','68','73','0','4547.19','6017.64','76.7052','4.37901','3816:0 '),\n('3818','bt040','571','3537','4122','68','73','5','4484.77','5763.64','79.4306','1.41963','3816:0 3819:0 '),\n('3819','bt041','571','3537','4133','68','73','0','4321.96','5776.59','72.5697','2.66048','3818:0 3805:0 '),\n('3820','bt042','571','3537','4032','68','73','3','2227.28','5312.07','10.5729','1.23497','3821:0 3851:0 '),\n('3821','bt043','571','3537','4101','68','73','0','2273.96','5439.49','1.81269','1.1525','3820:0 3822:0 3833:0 3916:0 '),\n('3822','bt044','571','3537','4101','68','73','0','2418.25','5390.85','3.76168','0.12363','3821:0 3823:0 '),\n('3823','bt045','571','3537','3537','68','73','0','2601.94','5522.47','38.0963','6.28036','3822:0 3824:0 3833:0 3840:0 3848:0 '),\n('3824','bt046','571','3537','3537','68','73','0','2887.65','5415.26','58.4905','5.60492','3823:0 3852:0 3859:0 '),\n('3825','bt047','571','3537','4021','68','73','0','2976.39','5660.32','52.2738','1.38733','3826:0 '),\n('3826','bt048','571','3537','4021','68','73','0','3019.96','5816.72','88.3166','0.8297','3825:0 3827:0 3795:0 '),\n('3827','bt049','571','3537','4020','68','73','0','2993.07','5973.66','112.995','5.04023','3826:0 3828:0 '),\n('3828','bt050','571','3537','4129','68','73','0','2915.6','6074.59','78.0969','1.4863','3827:0 3829:0 3844:0 '),\n('3829','bt051','571','3537','4020','68','73','0','2970.01','6149.83','61.7495','2.0298','3828:0 3830:0 '),\n('3830','bt052','571','3537','4020','68','73','0','2899.1','6282.26','61.4057','2.97228','3829:0 3831:0 '),\n('3831','bt053','571','3537','4020','68','73','0','2773.74','6303.56','77.083','3.07674','3830:0 3832:0 '),\n('3832','bt054','571','3537','4020','68','73','0','2654.28','6218.95','38.8344','4.55721','3831:0 3781:0 3783:0 '),\n('3833','bt055','571','3537','3537','68','73','0','2316.99','5624.68','36.408','5.33239','3823:0 3821:0 3834:0 '),\n('3834','bt056','571','3537','3537','68','73','0','2143.16','5781.38','58.7998','1.77058','3833:0 3837:0 '),\n('3835','bt057','571','3537','4028','68','73','0','1868.5','5774.99','0.860459','1.34802','3917:0 '),\n('3836','bt058','571','3537','4028','68','73','0','1923.91','6030.9','10.7946','1.48154','3837:0 3918:0 '),\n('3837','bt059','571','3537','3537','68','73','0','2116.07','6079.06','52.9292','3.89037','3836:0 3834:0 3838:0 3846:0 '),\n('3838','bt060','571','3537','4021','68','73','0','2104.14','6314.43','60.0072','0.106311','3837:0 3839:0 '),\n('3839','bt061','571','3537','4021','68','73','0','2357.04','6208.05','40.7146','2.64945','3838:0 3782:0 '),\n('3840','bt062','571','3537','4022','68','73','0','2647.51','5693.12','46.7099','1.50275','3823:0 3841:0 '),\n('3841','bt063','571','3537','4022','68','73','0','2631.68','5852.04','45.3245','5.86957','3840:0 3842:0 '),\n('3842','bt064','571','3537','4022','68','73','0','2763.87','5811.38','59.8902','6.23478','3841:0 3843:0 '),\n('3843','bt065','571','3537','4021','68','73','0','2848.66','5818.04','101.625','5.91276','3842:0 3844:0 3845:0 '),\n('3844','bt066','571','3537','4020','68','73','0','2837.49','5974.58','114.197','5.01191','3843:0 3828:0 '),\n('3845','bt067','571','3537','4021','68','73','0','2607.08','5956.42','94.4153','5.56483','3843:0 3846:0 3847:0 '),\n('3846','bt068','571','3537','4022','68','73','0','2327.62','5973.77','98.5945','4.36317','3837:0 3845:0 '),\n('3847','bt069','571','3537','4022','68','73','0','2489.14','5813.21','139.945','0.867364','3845:0 '),\n('3848','bt070','571','3537','4111','68','73','0','2684.66','5308.92','31.1745','1.9606','3823:0 3849:0 '),\n('3849','bt071','571','3537','4111','68','73','0','2495.15','5199.97','32.4263','0.802134','3848:0 3850:0 '),\n('3850','bt072','571','3537','4032','68','73','0','2416.87','5247.86','1.88448','3.32877','3849:0 3851:0 '),\n('3851','bt073','571','3537','4032','68','73','3','2334.99','5249.7','9.01216','2.3698','3820:0 3850:0 '),\n('3852','bt074','571','3537','3537','68','73','0','3128.49','5378.84','58.5466','0.00337601','3824:0 3798:0 3853:0 3859:0 '),\n('3853','bt075','571','3537','3537','68','73','0','3264.11','5285.37','39.4799','3.97355','3852:0 3854:0 3891:0 '),\n('3854','bt076','571','3537','4043','68','73','0','3152.24','5121.1','38.3072','4.18325','3853:0 3855:0 3860:0 3891:0 '),\n('3855','bt077','571','3537','4043','68','73','0','2949.22','5102.38','35.483','3.44497','3856:0 3859:0 3854:0 '),\n('3856','bt078','571','3537','4043','68','73','0','2736.6','5010.38','28.1472','3.12924','3855:0 3857:0 '),\n('3857','bt079','571','3537','4115','68','73','0','2737.31','5202.71','29.0469','0.938766','3856:0 3858:0 3859:0 '),\n('3858','bt080','571','3537','4115','68','73','0','2535.47','5082.9','7.68824','3.5887','3857:0 '),\n('3859','bt081','571','3537','3537','68','73','0','2918.19','5295.64','60.2339','1.05579','3824:0 3855:0 3857:0 3852:0 '),\n('3860','bt082','571','3537','4041','68','73','0','3128.73','4853.66','2.08073','1.16652','3854:0 3861:0 '),\n('3861','bt083','571','3537','4041','68','73','0','3050.52','4655.31','2.27362','4.47304','3860:0 3862:0 '),\n('3862','bt084','571','3537','4043','68','73','0','3249.06','4558.38','29.5811','5.62916','3861:0 3863:0 '),\n('3863','bt085','571','3537','4043','68','73','0','3284.24','4264.38','24.2109','5.22075','3862:0 3864:0 3938:0 '),\n('3864','bt086','571','3537','4037','68','73','4','3412.42','4072.4','16.8945','0.69685','3863:0 3865:0 3866:0 3873:0 3939:0 '),\n('3865','bt087','571','3537','4037','68','73','5','3463.15','4158.38','17.1932','1.45869','3864:0 '),\n('3866','bt088','571','3537','4043','68','73','0','3662.21','3965.65','26.4976','5.18541','3864:0 3867:0 3878:0 '),\n('3867','bt089','571','3537','4125','68','73','0','3676.8','3741.97','49.5236','5.32678','3866:0 3868:0 3878:0 '),\n('3868','bt090','571','3537','4125','68','73','0','3823.07','3647','46.2292','5.63701','3867:0 3869:0 3871:0 3872:0 '),\n('3869','bt091','571','3537','4135','68','73','0','4026.86','3532.95','104.358','5.75874','3868:0 3870:0 3872:0 '),\n('3870','bt092','571','3537','4125','68','73','0','3935.56','3404.04','80.8418','5.58987','3869:0 3871:0 '),\n('3871','bt093','571','3537','4125','68','73','0','3825.9','3505.46','64.8278','1.04239','3868:0 3870:0 '),\n('3872','bt094','571','3537','4125','68','73','0','3966.88','3721.48','61.9247','4.14707','3868:0 3869:0 '),\n('3873','bt095','571','3537','4042','68','73','0','3416.97','3883.04','26.1293','5.22225','3864:0 3874:0 3939:0 '),\n('3874','bt096','571','3537','4042','68','73','0','3450.42','3652.26','27.974','2.1592','3873:0 3875:0 3940:0 '),\n('3875','bt097','571','3537','4042','68','73','0','3456.33','3430.49','17.996','4.9827','3874:0 3876:0 '),\n('3876','bt098','571','3537','4042','68','73','0','3518.4','3187.54','25.0806','4.80206','3875:0 3877:0 '),\n('3877','bt099','571','65','4478','68','73','0','3572.51','3037.08','26.2165','3.86352','3876:0 4109:0 '),\n('3878','bt100','571','3537','3537','68','73','0','3907.42','4000.44','45.1941','4.47613','3866:0 3867:0 3879:0 '),\n('3879','bt101','571','3537','3537','68','73','0','4042.02','4199.98','49.6907','0.696007','3878:0 3880:0 '),\n('3880','bt102','571','3537','3537','68','73','0','4186.94','4464.21','27.3466','1.05336','3879:0 3881:0 '),\n('3881','bt103','571','3537','4119','68','73','0','4191.29','4697.78','12.0312','2.68463','3880:0 3882:0 3883:0 3884:0 3908:0 '),\n('3882','bt104','571','3537','4118','68','73','0','4358.92','4576.58','16.3385','5.84976','3881:0 '),\n('3883','bt105','571','3537','4036','68','73','0','3992.84','4812.66','11.7213','5.55524','3881:0 '),\n('3884','bt106','571','3537','4119','68','73','0','3978.85','4564.24','-2.51875','3.44252','3881:0 3885:0 3914:0 '),\n('3885','bt107','571','3537','4117','68','73','0','3699.55','4487.54','-0.818554','2.97836','3884:0 3886:0 '),\n('3886','bt108','571','3537','4117','68','73','0','3443.04','4422.46','-0.530089','0.645731','3885:0 3887:0 '),\n('3887','bt109','571','3537','4035','68','73','0','3568.75','4584.96','-13.5973','0.527922','3886:0 3888:0 '),\n('3888','bt110','571','3537','4035','68','73','0','3686.72','4734.84','-12.073','1.14839','3887:0 3889:0 3915:0 '),\n('3889','bt111','571','3537','4035','68','73','0','3703.7','4927.72','-12.9951','2.73489','3888:0 3890:0 3912:0 '),\n('3890','bt112','571','3537','4116','68','73','0','3479.66','5024.98','-1.50934','2.71133','3889:0 3891:0 '),\n('3891','bt113','571','3537','4116','68','73','0','3344.22','5119.48','13.0385','2.55424','3890:0 3853:0 3854:0 3892:0 '),\n('3892','bt114','571','3537','4116','68','73','0','3589.81','5076.79','13.0073','6.10424','3891:0 3893:0 '),\n('3893','bt115','571','3537','3537','68','73','0','3668.09','5254.47','34.8015','1.05413','3892:0 3894:0 3911:0 '),\n('3894','bt116','571','3537','3537','68','73','0','3717.74','5416.1','41.956','1.99268','3893:0 3895:0 3937:0 '),\n('3895','bt117','571','3537','3537','68','73','0','3919.2','5534.82','36.9202','0.89312','3894:0 3896:0 '),\n('3896','bt118','571','3537','3537','68','73','0','4101.61','5617.94','41.1963','5.88275','3895:0 3804:0 3897:0 '),\n('3897','bt119','571','3537','3537','68','73','0','4252.89','5577.24','46.4033','5.33689','3896:0 3898:0 3903:0 '),\n('3898','bt120','571','3537','4123','68','73','0','4429.17','5431.27','38.6653','5.43664','3897:0 3899:0 '),\n('3899','bt121','571','3537','4123','68','73','0','4389.18','5365.34','1.39626','5.27172','3898:0 3900:0 '),\n('3900','bt122','571','3537','4123','68','73','0','4489.75','5395.86','-16.0358','0.830292','3899:0 3901:0 '),\n('3901','bt123','571','3537','4123','68','73','0','4444.7','5327.16','-22.3982','5.89611','3900:0 3902:0 '),\n('3902','bt124','571','3537','4123','68','73','0','4542.22','5322.8','-31.8246','3.56034','3901:0 '),\n('3903','bt125','571','3537','4123','68','73','0','4522.99','5561.63','52.4235','6.06731','3897:0 3904:0 4644:0 '),\n('3904','bt126','571','3537','4123','68','73','0','4530.95','5430.29','84.8166','1.59052','3903:0 3905:0 '),\n('3905','bt127','571','3537','4123','68','73','0','4525.48','5247.8','73.7381','4.37083','3904:0 3906:0 '),\n('3906','bt128','571','3537','4123','68','73','0','4475.24','5066.41','51.9566','0.934718','3905:0 3907:0 '),\n('3907','bt129','571','3537','4123','68','73','0','4378.74','5017.74','24.8345','2.46704','3906:0 3908:0 3909:0 '),\n('3908','bt130','571','3537','3537','68','73','0','4344.7','4804.82','24.8231','4.24124','3907:0 3881:0 '),\n('3909','bt131','571','3537','4116','68','73','0','4205.12','5146.23','13.0876','5.95813','3907:0 3910:0 '),\n('3910','bt132','571','3537','4108','68','73','3','4060.38','5267.77','24.7438','5.56545','3909:0 3911:0 '),\n('3911','bt133','571','3537','4116','68','73','0','3893.4','5186.84','13.0414','3.37026','3910:0 3893:0 3912:0 '),\n('3912','bt134','571','3537','4116','68','73','0','3840.13','5037.99','-1.50988','0.413233','3911:0 3889:0 3913:0 '),\n('3913','bt135','571','3537','4035','68','73','0','3925.28','4915.39','-12.887','4.60333','3912:0 3914:0 '),\n('3914','bt136','571','3537','4035','68','73','0','3887.73','4693.73','-12.995','4.14386','3913:0 3884:0 3915:0 '),\n('3915','bt137','571','3537','4035','68','73','0','3732.85','4647.89','-12.6525','0.821628','3914:0 3888:0 '),\n('3916','bt138','571','3537','4101','68','73','0','2084.44','5480.67','0.253263','0.428928','3821:0 3917:0 '),\n('3917','bt139','571','3537','3537','68','73','0','1935.03','5589.92','0.355845','5.97934','3916:0 3835:0 '),\n('3918','bt140','571','3537','4029','68','73','0','1494.92','5829.11','1.38787','4.0072','3836:0 3919:0 '),\n('3919','bt141','571','3537','4029','68','73','0','1384.5','5858.44','15.4001','4.19177','3918:0 3920:0 '),\n('3920','bt142','571','3537','4029','68','73','0','1449.43','5734.18','1.3254','1.10514','3919:0 3921:0 '),\n('3921','bt143','571','3537','4029','68','73','0','1402.52','5714.94','23.5628','4.00326','3920:0 3922:0 '),\n('3922','bt144','571','3537','4029','68','73','0','1316.7','5605.69','5.52566','5.40127','3921:0 '),\n('3923','bt145','571','3537','4024','68','73','0','4152.49','7034.79','165.636','2.43875','3924:0 3936:0 '),\n('3924','bt146','571','3537','4024','68','73','0','3999','7159.1','167.793','0.0786215','3923:0 3925:0 '),\n('3925','bt147','571','3537','4024','68','73','0','3840.49','7254.47','172.045','3.52653','3924:0 3926:0 3928:0 '),\n('3926','bt148','571','3537','4024','68','73','0','3676.61','7110.41','160.171','4.50434','3925:0 3927:0 3929:0 '),\n('3927','bt149','571','3537','4024','68','73','0','3597.15','7199.39','221.934','1.51276','3926:0 3928:0 3929:0 '),\n('3928','bt150','571','3537','4024','68','73','0','3751.72','7333.67','208.956','0.378648','3927:0 3925:0 '),\n('3929','bt151','571','3537','4024','68','73','0','3611.29','6969.11','170.734','1.15225','3926:0 3927:0 3930:0 '),\n('3930','bt152','571','3537','4024','68','73','0','3644.46','6805.44','166.924','3.99932','3929:0 3931:0 '),\n('3931','bt153','571','3537','4121','68','73','1','3587.41','6661.1','195.429','4.60014','3930:0 3932:0 '),\n('3932','bt154','571','3537','4024','68','73','0','3749.63','6602.97','169.446','3.8658','3931:0 3933:0 3935:0 '),\n('3933','bt155','571','3537','4024','68','73','0','3912.17','6596.2','168.227','0.700643','3932:0 3934:0 '),\n('3934','bt156','571','3537','4024','68','73','0','3971.08','6785.73','156.758','4.88682','3933:0 3935:0 3936:0 '),\n('3935','bt157','571','3537','4024','68','73','0','3826.86','6694.29','152.782','4.14698','3934:0 3932:0 '),\n('3936','bt158','571','3537','4024','68','73','0','4074.45','6887.11','166.976','1.01716','3923:0 3934:0 '),\n('3937','bt159','571','3537','4039','68','73','0','3663.21','5603.77','32.8151','3.07099','3800:0 3801:0 3802:0 3803:0 3894:0 '),\n('3938','bt160','571','3537','4113','68','73','1','2913.96','4067.33','1.63263','0.498753','3863:0 3939:0 '),\n('3939','bt161','571','3537','4138','68','73','3','3111.58','3838.69','22.5558','0.795238','3864:0 3873:0 3940:0 3938:0 '),\n('3940','bt162','571','3537','4138','68','73','0','3323.93','3770.67','24.5945','5.57327','3939:0 3874:0 '),\n('3941','hf163','571','495','3998','68','73','3','1418.1','-3190.73','162.344','4.57189','3942:0 '),\n('3942','hf164','571','495','3998','68','73','2','1365.12','-3385.23','185.736','4.52084','3941:0 3943:0 '),\n('3943','hf165','571','495','4048','68','73','0','1219.72','-3550.97','164.966','4.23495','3942:0 3944:0 '),\n('3944','hf166','571','495','4048','68','73','0','1121.91','-3657.07','156.248','4.07787','3943:0 3945:0 3985:0 '),\n('3945','hf167','571','495','4048','68','73','0','1046.11','-3833.51','162.833','4.6512','3944:0 3946:0 3958:0 3985:0 '),\n('3946','hf168','571','495','4048','68','73','0','920.447','-4015.29','170.279','3.21786','3945:0 3947:0 3958:0 '),\n('3947','hf169','571','495','3992','68','73','0','694.778','-3872.94','246.328','2.73877','3946:0 3948:0 '),\n('3948','hf170','571','495','495','68','73','0','507.763','-4025.28','259.283','4.81221','3947:0 3949:0 '),\n('3949','hf171','571','495','4260','68','73','0','397.137','-4223.42','249.354','3.78334','3948:0 3950:0 3979:0 '),\n('3950','hf172','571','495','495','68','73','0','222.582','-4391.88','248.592','4.40773','3949:0 3951:0 4086:0 '),\n('3951','hf173','571','495','3991','68','73','0','253.033','-4572.61','240.212','5.55441','3950:0 3952:0 4082:0 '),\n('3952','hf174','571','495','3991','68','73','5','371.97','-4633.54','245.156','2.78588','3951:0 3953:0 3957:0 4085:0 '),\n('3953','hf175','571','495','3991','68','73','4','407.209','-4712.58','228.909','5.83714','3952:0 3954:0 '),\n('3954','hf176','571','495','3991','68','73','0','510.661','-4763.01','208.318','0.924468','3953:0 3955:0 4082:0 '),\n('3955','hf177','571','495','495','68','73','0','628.585','-4581.53','203.482','0.904833','3954:0 3956:0 '),\n('3956','hf178','571','495','3991','68','73','0','460.455','-4423.52','211.022','2.64078','3955:0 3957:0 3979:0 '),\n('3957','hf179','571','495','3991','68','73','4','383.884','-4495.8','236.504','4.36866','3956:0 3952:0 '),\n('3958','hf180','571','495','495','68','73','0','1081.71','-4036.81','154.348','4.76135','3945:0 3946:0 3985:0 '),\n('3959','hf181','571','495','495','68','73','0','1215.66','-4263.51','149.864','5.26401','3960:0 '),\n('3960','hf182','571','495','495','68','73','0','1258.74','-4522.15','173.24','3.83852','3959:0 3961:0 '),\n('3961','hf183','571','495','495','68','73','0','1124.26','-4644.36','183.694','3.62646','3960:0 3962:0 '),\n('3962','hf184','571','495','495','68','73','0','857.223','-4730.31','113.82','0.273598','3961:0 3963:0 '),\n('3963','hf185','571','495','495','68','73','0','706.968','-4825.12','79.1984','4.0553','3962:0 3964:0 '),\n('3964','hf186','571','495','3981','68','73','2','634.301','-4890.02','28.6664','4.92709','3963:0 3965:0 3978:0 '),\n('3965','hf187','571','495','3981','68','73','2','682.36','-4963','6.24529','0.414974','3964:0 3966:0 3978:0 '),\n('3966','hf188','571','495','3982','68','73','0','854.979','-4933.54','4.27721','0.230407','3965:0 3967:0 '),\n('3967','hf189','571','495','3982','68','73','0','1039.98','-4925.08','9.42985','0.387488','3966:0 3968:0 '),\n('3968','hf190','571','495','3982','68','73','0','945.95','-4873.37','4.59329','0.540618','3967:0 3969:0 '),\n('3969','hf191','571','495','3982','68','73','0','1068.1','-4819.17','26.6749','3.6728','3968:0 3970:0 '),\n('3970','hf192','571','495','3983','68','73','0','1158.2','-4813.94','28.9399','0.405537','3969:0 3971:0 '),\n('3971','hf193','571','495','3983','68','73','0','1104.87','-4804.91','-6.8197','0.572031','3970:0 3972:0 '),\n('3972','hf194','571','495','3983','1','60','0','980.459','-4819.09','-72.4413','0.31677','3971:0 3973:0 '),\n('3973','hf195','571','495','3983','68','73','0','841.596','-4863.98','-72.4161','5.00561','3972:0 3974:0 3975:0 '),\n('3974','hf196','571','495','3983','68','73','0','875.874','-4966.04','-72.4404','1.87186','3973:0 '),\n('3975','hf197','571','495','495','68','73','0','795.673','-4726.51','-96.2356','1.47131','3973:0 3976:0 '),\n('3976','hf198','571','495','3983','68','73','0','835.937','-4866.89','-115.736','2.10747','3975:0 3977:0 '),\n('3977','hf199','571','495','3983','68','73','0','945.547','-4827.44','-116.158','0.281421','3976:0 '),\n('3978','hf200','571','495','3981','68','73','3','554.553','-4986.67','10.1867','0.251579','3964:0 3965:0 '),\n('3979','hf201','571','495','495','68','73','0','628.213','-4255.8','210.916','3.49527','3949:0 3956:0 3980:0 '),\n('3980','hf202','571','495','3994','68','73','0','765.99','-4299.85','185.031','3.00833','3979:0 3981:0 '),\n('3981','hf203','571','495','3994','68','73','0','798.758','-4362.47','161.294','4.9679','3980:0 3982:0 '),\n('3982','hf204','571','495','3994','68','73','0','902.1','-4478.73','144.331','5.55301','3981:0 3983:0 3984:0 '),\n('3983','hf205','571','495','3994','68','73','0','1004.65','-4395.88','150.922','4.0804','3982:0 3984:0 '),\n('3984','hf206','571','495','3994','68','73','0','909.858','-4395.54','139.649','4.34665','3983:0 3982:0 '),\n('3985','hf207','571','495','4048','68','73','0','1203.65','-3825.84','142.684','1.05976','3944:0 3945:0 3958:0 3986:0 '),\n('3986','hf208','571','495','495','68','73','0','1408.56','-3737.55','135.962','1.67629','3985:0 3987:0 '),\n('3987','hf209','571','495','495','68','73','0','1558.28','-3740.43','144.691','0.00336027','3986:0 3988:0 '),\n('3988','hf210','571','495','495','68','73','1','1706.02','-3730.74','148.901','3.19209','3987:0 3989:0 4027:0 '),\n('3989','hf211','571','495','495','68','73','0','1803.26','-3895.57','170.472','0.273537','3988:0 3990:0 '),\n('3990','hf212','571','495','495','68','73','0','1949.63','-3842.81','173.777','1.70846','3989:0 3991:0 '),\n('3991','hf213','571','495','4068','68','73','0','2008.1','-3689.61','173.671','1.9378','3990:0 3992:0 '),\n('3992','hf214','571','495','4068','68','73','0','1967.39','-3604.53','158.109','5.18071','3991:0 3993:0 4031:0 '),\n('3993','hf215','571','495','495','68','73','0','2096.74','-3545.48','153.897','6.17032','3992:0 3994:0 '),\n('3994','hf216','571','495','495','68','73','0','2318.6','-3583.13','165.228','0.334813','3993:0 3995:0 '),\n('3995','hf217','571','495','4006','68','73','0','2535.68','-3475.65','183.975','0.49582','3994:0 3996:0 3999:0 '),\n('3996','hf218','571','495','4006','68','73','0','2624.04','-3562.9','205.26','5.49331','3995:0 3997:0 3999:0 '),\n('3997','hf219','571','495','4006','68','73','0','2727.06','-3698.08','221.722','5.46582','3996:0 3998:0 '),\n('3998','hf220','571','495','4065','68','73','0','2838.83','-3844.63','244.563','5.37','3997:0 '),\n('3999','hf221','571','495','4006','68','73','0','2613.9','-3384.95','183','4.543','3995:0 3996:0 4000:0 4001:0 '),\n('4000','hf222','571','495','4006','68','73','0','2724.44','-3424.92','224.685','0.694536','3999:0 '),\n('4001','hf223','571','495','4054','68','73','0','2578.54','-3191.48','141.337','1.90327','3999:0 4002:0 '),\n('4002','hf224','571','495','495','68','73','0','2515.29','-2957.64','111.213','1.93861','4001:0 4003:0 4011:0 4318:0 '),\n('4003','hf225','571','495','4054','68','73','0','2301.09','-3135.29','143.7','3.73482','4002:0 4004:0 4010:0 '),\n('4004','hf226','571','495','4054','68','73','0','2243.04','-3261.92','151.734','2.70201','4003:0 4005:0 '),\n('4005','hf227','571','495','3999','68','73','0','2145.39','-3331.7','144.475','1.2019','4004:0 4006:0 '),\n('4006','hf228','571','495','3999','68','73','0','2086.44','-3330','104.792','3.06722','4005:0 4007:0 '),\n('4007','hf229','571','495','3999','68','73','0','1983.23','-3286.99','111.741','1.78624','4006:0 4008:0 '),\n('4008','hf230','571','495','3999','68','73','0','2045.23','-3172.46','139.784','4.15736','4007:0 4009:0 '),\n('4009','hf231','571','495','4062','68','73','5','2094.18','-2981.02','144.898','4.45895','4008:0 4010:0 '),\n('4010','hf232','571','495','495','68','73','0','2264.88','-3015.48','135.084','5.19722','4009:0 4003:0 '),\n('4011','hf233','571','495','495','68','73','0','2606.41','-2825.71','69.3506','1.32522','4002:0 4012:0 4318:0 '),\n('4012','hf234','571','495','4070','68','73','0','2558.46','-2678.02','3.25504','5.60171','4011:0 4013:0 4322:0 '),\n('4013','hf235','571','495','4070','68','73','0','2430.12','-2758.92','5.62901','3.37275','4012:0 4014:0 '),\n('4014','hf236','571','495','4070','68','73','0','2281.27','-2774.11','4.91082','0.329327','4013:0 4015:0 '),\n('4015','hf237','571','495','4070','68','73','0','2153.11','-2770.66','4.86218','3.08765','4014:0 4016:0 '),\n('4016','hf238','571','495','4070','68','73','0','1967.15','-2762.53','3.5219','3.17561','4015:0 4017:0 '),\n('4017','hf239','571','495','4070','68','73','0','1835.91','-2814.57','3.48005','3.54396','4016:0 4018:0 '),\n('4018','hf240','571','495','4070','68','73','0','1677.38','-2975.29','3.95501','4.155','4017:0 4019:0 '),\n('4019','hf241','571','495','4071','68','73','0','1576.78','-3123.46','2.99581','4.44402','4018:0 4020:0 4029:0 '),\n('4020','hf242','571','495','4071','68','73','0','1609.87','-3258.66','3.34169','4.86186','4019:0 4021:0 '),\n('4021','hf243','571','495','4071','68','73','0','1629.47','-3440.1','29.9326','3.35783','4020:0 4022:0 4030:0 '),\n('4022','hf244','571','495','4071','68','73','0','1490.07','-3428.63','88.8301','0.0332379','4021:0 4023:0 '),\n('4023','hf245','571','495','4071','68','73','0','1554.39','-3419.81','97.6795','4.70636','4022:0 4024:0 4026:0 4028:0 '),\n('4024','hf246','571','495','4071','68','73','0','1638.14','-3283.78','76.0526','5.23256','4023:0 4025:0 '),\n('4025','hf247','571','495','4071','68','73','0','1772.14','-3327.31','81.7587','4.30737','4024:0 '),\n('4026','hf248','571','495','4071','68','73','0','1641.48','-3512.7','92.7675','1.7077','4023:0 4027:0 '),\n('4027','hf249','571','495','495','68','73','0','1670.45','-3682.65','149.579','1.75245','4026:0 3988:0 4028:0 '),\n('4028','hf250','571','495','4071','68','73','0','1565.95','-3550.52','112.177','1.48387','4027:0 4023:0 '),\n('4029','hf251','571','495','495','68','73','0','1489.29','-3099.07','39.9696','5.34802','4019:0 4030:0 '),\n('4030','hf252','571','495','4071','68','73','0','1511.33','-3269.6','74.5615','0.545315','4029:0 4021:0 '),\n('4031','hf253','571','495','495','68','73','0','2104.47','-3840.68','209.54','2.27867','3992:0 4032:0 '),\n('4032','hf254','571','495','4002','68','73','0','2068.75','-4073.32','236.821','4.87048','4031:0 4033:0 4039:0 '),\n('4033','hf255','571','495','4002','68','73','0','1987.13','-4141.88','216.964','3.23293','4032:0 4034:0 '),\n('4034','hf256','571','495','4002','68','73','0','1838.02','-4120.86','223.042','2.70435','4033:0 4035:0 4038:0 '),\n('4035','hf257','571','495','4002','68','73','0','1672.75','-4022.82','249.031','3.18894','4034:0 4036:0 '),\n('4036','hf258','571','495','4002','68','73','0','1693.59','-4091.47','270.671','4.86183','4035:0 4037:0 '),\n('4037','hf259','571','495','4002','68','73','0','1644.9','-4213.64','258.417','6.27555','4036:0 4038:0 '),\n('4038','hf260','571','495','4002','68','73','0','1773.12','-4215.36','238.947','0.851593','4037:0 4034:0 '),\n('4039','hf261','571','495','495','68','73','0','2130.43','-4316.44','219.989','1.40137','4032:0 4040:0 '),\n('4040','hf262','571','495','495','68','73','0','2183.63','-4535.73','216.514','4.86106','4039:0 4041:0 '),\n('4041','hf263','571','495','495','68','73','0','2377.58','-4396.75','228.263','0.804472','4040:0 4042:0 '),\n('4042','hf264','571','495','495','68','73','0','2551.09','-4320.92','279.902','6.10198','4041:0 4043:0 '),\n('4043','hf265','571','495','4018','68','73','5','2613.73','-4366.35','276.555','2.42318','4042:0 4044:0 '),\n('4044','hf266','571','495','4018','68','73','4','2716.59','-4368.81','272.672','5.25063','4043:0 4045:0 '),\n('4045','hf267','571','495','495','68','73','0','2797.23','-4621.23','277.95','5.09748','4044:0 4046:0 4352:0 '),\n('4046','hf268','571','495','495','68','73','0','2607.42','-4744.93','256.769','3.77173','4045:0 4047:0 '),\n('4047','hf269','571','495','495','68','73','0','2455.43','-4885.82','260.773','3.54789','4046:0 4048:0 4051:0 '),\n('4048','hf270','571','495','495','68','73','3','2431.15','-4962.71','273.723','1.34484','4047:0 4049:0 '),\n('4049','hf271','571','495','4003','68','73','2','2510.75','-4994.59','283.35','2.79784','4048:0 4050:0 '),\n('4050','hf272','571','495','4003','68','73','2','2456.13','-5113.98','277.313','4.08197','4049:0 '),\n('4051','hf273','571','495','495','68','73','0','2232.27','-4879.42','237.068','0.178543','4047:0 4052:0 '),\n('4052','hf274','571','495','495','68','73','0','2035.15','-4874.68','210.788','3.93982','4051:0 4053:0 4056:0 '),\n('4053','hf275','571','495','495','68','73','0','1888.77','-4884.63','168.445','3.11672','4052:0 4054:0 '),\n('4054','hf276','571','495','4059','68','73','0','1712.12','-4879.28','126.121','3.13635','4053:0 4055:0 '),\n('4055','hf277','571','495','4059','68','73','0','1563','-4951.92','143.133','4.04662','4054:0 '),\n('4056','hf278','571','495','495','68','73','0','1915.43','-5076.01','179.861','4.59721','4052:0 4057:0 '),\n('4057','hf279','571','495','495','68','73','0','1824.95','-5278.57','182.601','4.39143','4056:0 4058:0 4064:0 '),\n('4058','hf280','571','495','4061','68','73','0','1965.2','-5427.02','202.866','6.04468','4057:0 4059:0 '),\n('4059','hf281','571','495','4061','68','73','0','2137.38','-5461.32','239.114','6.25123','4058:0 4060:0 '),\n('4060','hf282','571','495','4061','68','73','0','2177.05','-5614.25','226.937','4.76369','4059:0 4061:0 4397:0 '),\n('4061','hf283','571','495','4061','68','73','0','2173.72','-5813.08','225.029','3.53925','4060:0 4062:0 4397:0 '),\n('4062','hf284','571','495','4061','68','73','0','1978.82','-5763.87','223.278','2.62034','4061:0 4063:0 '),\n('4063','hf285','571','495','4061','68','73','0','1834.38','-5629.13','215.972','1.48308','4062:0 4064:0 '),\n('4064','hf286','571','495','495','68','73','1','1667.21','-5453.46','197.385','2.72951','4063:0 4057:0 4065:0 4068:0 '),\n('4065','hf287','571','495','4001','68','73','0','1532.35','-5419.75','189.418','2.63761','4064:0 4066:0 '),\n('4066','hf288','571','495','4001','68','73','0','1486.1','-5319.6','195.08','1.17912','4065:0 4067:0 '),\n('4067','hf289','571','495','4001','68','73','0','1504.6','-5264.18','206.615','0.745568','4066:0 '),\n('4068','hf290','571','495','495','68','73','0','1492.09','-5524.43','200.456','3.74892','4064:0 4069:0 4072:0 '),\n('4069','hf291','571','495','4403','68','73','0','1532.33','-5613.29','226.19','4.85477','4068:0 4070:0 '),\n('4070','hf292','571','495','4402','68','73','4','1541.33','-5689.58','248.356','1.64643','4069:0 4071:0 '),\n('4071','hf293','571','495','495','68','73','5','1631.27','-5779.62','258.389','2.51272','4070:0 '),\n('4072','hf294','571','495','495','68','73','0','1394.07','-5574.59','205.361','0.236628','4068:0 4073:0 '),\n('4073','hf295','571','495','495','68','73','0','1234.61','-5679.7','225.93','3.5408','4072:0 4074:0 4104:0 '),\n('4074','hf296','571','495','3984','68','73','0','1037.41','-5697.06','228.706','3.34052','4073:0 4075:0 4108:0 '),\n('4075','hf297','571','495','495','68','73','0','877.228','-5789.41','249.962','3.77328','4074:0 4076:0 '),\n('4076','hf298','571','495','495','68','73','0','739.705','-5863.89','287.056','4.11336','4075:0 4077:0 '),\n('4077','hf299','571','495','495','68','73','3','483.188','-5922.44','308.68','1.33265','4076:0 4078:0 '),\n('4078','hf300','571','495','495','68','73','0','513.926','-5588.33','281.883','2.6321','4077:0 4079:0 '),\n('4079','hf301','571','495','495','68','73','0','342.715','-5438.85','298.648','2.30775','4078:0 4080:0 '),\n('4080','hf302','571','495','495','68','73','0','221.35','-5242.73','299.653','1.84436','4079:0 4081:0 '),\n('4081','hf303','571','495','4057','68','73','0','161.173','-4925.94','298.444','1.79331','4080:0 4082:0 4083:0 4085:0 '),\n('4082','hf304','571','495','495','68','73','0','285.533','-4807.39','248.989','1.63624','4081:0 3951:0 3954:0 '),\n('4083','hf305','571','495','4057','68','73','0','-28.8267','-4914.36','302.775','3.12851','4081:0 4084:0 '),\n('4084','hf306','571','495','4057','68','73','0','-143.121','-5118.6','323.883','1.16107','4083:0 '),\n('4085','hf307','571','495','495','68','73','0','115.019','-4716.56','289.321','1.68335','4081:0 3952:0 4086:0 '),\n('4086','hf308','571','495','495','68','73','0','156.917','-4507.79','256.612','1.23411','4085:0 3950:0 '),\n('4087','hf309','571','495','3988','68','73','1','778.297','-2898.22','7.01161','4.8391','4088:0 '),\n('4088','hf310','571','495','3987','68','73','0','741.908','-3049.69','25.2093','3.79609','4087:0 4089:0 4092:0 4093:0 4094:0 4095:0 '),\n('4089','hf311','571','495','3987','68','73','0','590.131','-3156.57','40.1902','3.94689','4088:0 4090:0 4099:0 '),\n('4090','hf312','571','495','3987','68','73','0','471.48','-3318.84','48.7074','3.51255','4089:0 4091:0 '),\n('4091','hf313','571','495','3987','68','73','0','386.081','-3089.98','71.2014','1.81688','4090:0 4092:0 '),\n('4092','hf314','571','495','3987','68','73','0','508.887','-3028.15','24.4901','2.16561','4091:0 4088:0 '),\n('4093','hf315','571','495','3987','68','73','0','986.117','-3034.77','57.92','0.46364','4088:0 4094:0 '),\n('4094','hf316','571','495','3987','68','73','0','749.692','-3240.83','24.9581','2.15066','4088:0 4093:0 4097:0 '),\n('4095','hf317','571','495','3987','68','73','0','675.991','-3161.57','61.349','1.00634','4088:0 4096:0 '),\n('4096','hf318','571','495','3987','68','73','0','677.454','-3393.96','67.7866','4.88621','4095:0 '),\n('4097','hf319','571','495','3987','68','73','0','566.586','-3287.72','26.0315','4.65294','4094:0 4098:0 '),\n('4098','hf320','571','495','4226','68','73','0','551.1','-3494.05','3.24654','4.58853','4097:0 '),\n('4099','hf321','571','495','3987','68','73','0','370.473','-3216.41','23.421','3.95629','4089:0 4100:0 '),\n('4100','hf322','571','495','4474','68','73','0','223.035','-3291.75','0.0638989','3.59893','4099:0 4101:0 '),\n('4101','hf323','571','495','4474','68','73','0','114.305','-3330.69','0.616794','0.370948','4100:0 4102:0 '),\n('4102','hf324','571','495','3989','68','73','0','-16.534','-3453.36','32.7157','1.36763','4101:0 4103:0 '),\n('4103','hf325','571','495','3990','68','73','0','-130.721','-3573.93','3.18551','1.92133','4102:0 '),\n('4104','hf326','571','495','495','68','73','0','1337.07','-5914.2','292.65','4.10948','4073:0 4105:0 '),\n('4105','hf327','571','495','4005','68','73','0','1323.93','-6111.92','266.982','3.40577','4104:0 4106:0 '),\n('4106','hf328','571','495','4005','68','73','0','1181.44','-6169.63','232.169','2.26694','4105:0 4107:0 '),\n('4107','hf329','571','495','4005','68','73','0','1118.44','-6156.85','260.616','1.64883','4106:0 4108:0 '),\n('4108','hf330','571','495','495','68','73','0','1131.33','-5884.77','271.705','2.04153','4107:0 4074:0 '),\n('4109','db331','571','65','4478','70','74','0','3509.64','2944.69','24.9497','4.10306','3877:0 '),\n('4110','db332','571','65','65','70','74','0','3526.72','2777.23','49.7018','4.66854','4111:0 4267:0 4274:0 '),\n('4111','db333','571','65','4157','70','74','0','3369.46','2655.03','38.9276','4.90416','4110:0 4112:0 '),\n('4112','db334','571','65','4157','70','74','0','3440.83','2477.55','45.9125','4.61748','4111:0 4113:0 '),\n('4113','db335','571','65','4157','70','74','0','3395.92','2379.05','36.7537','2.28876','4112:0 4114:0 '),\n('4114','db336','571','65','4157','70','74','0','3343.5','2223.35','29.9841','5.39185','4113:0 4116:0 4115:0 '),\n('4115','db337','571','65','65','70','74','3','3489.08','1998.02','64.8654','1.46526','4114:0 4116:0 4260:0 '),\n('4116','db338','571','65','4160','70','74','0','3228.78','1905.36','132.824','3.97029','4117:0 4114:0 4115:0 '),\n('4117','db339','571','65','4160','70','74','0','2981.37','1896.75','127.972','2.94456','4116:0 4118:0 '),\n('4118','db340','571','65','4160','70','74','0','2800.15','1812.41','147.093','5.30074','4117:0 4119:0 '),\n('4119','db341','571','65','4160','70','74','0','2944.01','1641.57','152.165','4.64493','4118:0 4120:0 '),\n('4120','db342','571','65','4153','70','74','0','2869.62','1469.27','157.603','5.17349','4119:0 4121:0 '),\n('4121','db343','571','65','4153','70','74','0','2927.17','1282.72','151.277','5.62666','4120:0 4122:0 '),\n('4122','db344','571','65','4153','70','74','0','3121.27','1266.58','158.478','3.9082','4121:0 4123:0 4128:0 '),\n('4123','db345','571','65','4154','70','74','0','3098.59','1055.28','114.785','4.75643','4122:0 4124:0 4127:0 '),\n('4124','db346','571','65','4152','70','74','0','3015.6','886.551','57.0023','3.13067','4123:0 4125:0 4127:0 '),\n('4125','db347','571','65','4152','70','74','0','2864.53','878.189','19.1406','2.82436','4124:0 4126:0 '),\n('4126','db348','571','65','4152','70','74','1','2657.93','892.145','4.37495','3.30424','4125:0 '),\n('4127','db349','571','65','4154','70','74','0','3216.12','884.158','119.499','2.58873','4123:0 4124:0 4128:0 '),\n('4128','db350','571','65','4154','70','74','0','3342.09','1163.09','140.364','0.88363','4122:0 4127:0 4129:0 '),\n('4129','db351','571','65','4154','70','74','0','3499.57','1159.74','129.579','0.224683','4128:0 4130:0 4254:0 '),\n('4130','db352','571','65','4254','70','74','0','3512.34','930.529','67.6824','4.436','4129:0 4131:0 '),\n('4131','db353','571','65','4254','70','74','0','3439.05','725.86','74.9159','3.52022','4130:0 4132:0 '),\n('4132','db354','571','65','4254','70','74','0','3383.4','548.065','79.6602','4.13597','4131:0 4133:0 '),\n('4133','db355','571','65','4254','70','74','0','3284.71','349.551','72.0866','4.38102','4132:0 4134:0 '),\n('4134','db356','571','65','4254','70','74','0','3258.62','161.424','74.762','4.63863','4133:0 4135:0 '),\n('4135','db357','571','65','4254','70','74','0','3199.28','-65.6434','75.8214','5.73582','4134:0 4136:0 '),\n('4136','db358','571','65','4254','70','74','0','3396.24','-138.385','72.6226','6.16308','4135:0 4137:0 4222:0 '),\n('4137','db359','571','65','4176','70','74','0','3614.83','-219.548','59.6726','5.91567','4136:0 4138:0 '),\n('4138','db360','571','65','4254','70','74','0','3790.53','-250.696','72.8378','0.182258','4137:0 4221:0 '),\n('4139','db361','571','65','4254','70','74','0','3996.13','-105.238','55.0057','0.538831','4140:0 '),\n('4140','db362','571','65','4254','70','74','0','4209.42','-149.468','68.6085','5.25672','4139:0 4141:0 '),\n('4141','db363','571','65','4254','70','74','0','4346.6','-340.238','86.1907','5.65727','4140:0 4185:0 '),\n('4142','db364','571','65','4254','70','74','0','4531.54','-157.776','94.5998','0.726543','4143:0 '),\n('4143','db365','571','65','4253','70','74','0','4529.69','-5.32293','72.4325','1.1538','4142:0 4144:0 '),\n('4144','db366','571','65','4187','70','74','0','4719.33','26.5065','64.7658','0.68649','4143:0 4145:0 '),\n('4145','db367','571','65','4187','70','74','0','4857.73','152.013','95.1974','0.64722','4144:0 4146:0 4148:0 '),\n('4146','db368','571','65','4187','70','74','0','5023.32','291.159','160.107','0.61659','4145:0 4147:0 '),\n('4147','db369','571','65','4187','70','74','0','5185.63','203.224','194.36','2.54081','4146:0 4631:0 '),\n('4148','db370','571','65','4187','70','74','0','4916.98','373.751','114.702','2.28006','4145:0 4149:0 '),\n('4149','db371','571','65','4396','70','74','0','4715.84','582.426','121.086','2.36646','4148:0 4150:0 4182:0 '),\n('4150','db372','571','65','4254','70','74','0','4669.25','828.097','110.706','2.44265','4151:0 4179:0 4149:0 '),\n('4151','db373','571','65','4254','70','74','0','4441.38','887.155','84.3941','2.82121','4150:0 4152:0 4153:0 '),\n('4152','db374','571','65','4254','70','74','0','4443.49','662.985','67.5233','2.64843','4151:0 4153:0 '),\n('4153','db375','571','65','4254','70','74','0','4350.16','761.448','67.5378','5.48843','4152:0 4151:0 4154:0 '),\n('4154','db376','571','65','4173','70','74','0','4171.02','645.93','64.3628','5.72325','4153:0 4155:0 '),\n('4155','db377','571','65','4173','70','74','0','4234.66','525','11.3008','1.28578','4154:0 4156:0 '),\n('4156','db378','571','65','4173','70','74','0','4325.75','527.107','-8.31338','5.11853','4155:0 4157:0 '),\n('4157','db379','571','65','4173','70','74','0','4340.91','393.399','-6.35666','0.319745','4156:0 4158:0 '),\n('4158','db380','571','65','4173','70','74','0','4445.71','448.569','48.7618','3.60429','4157:0 4159:0 '),\n('4159','db381','571','65','4254','70','74','0','4396.23','306.166','44.9454','3.30034','4158:0 4160:0 '),\n('4160','db382','571','65','4254','70','74','0','4238.24','300.479','69.4901','3.54617','4159:0 4161:0 '),\n('4161','db383','571','65','4254','70','74','0','4069.57','365.886','52.151','2.76941','4160:0 4162:0 '),\n('4162','db384','571','65','4254','70','74','0','3905.43','429.963','42.0653','2.76941','4161:0 4163:0 '),\n('4163','db385','571','65','4254','70','74','0','3784.72','555.764','65.4753','2.52593','4162:0 4164:0 '),\n('4164','db386','571','65','4254','70','74','0','3856.57','647.11','62.7715','2.10102','4163:0 4165:0 '),\n('4165','db387','571','65','4254','70','74','0','3750.11','814.498','76.6706','1.69811','4164:0 4166:0 4169:0 '),\n('4166','db388','571','65','4168','70','74','0','3669.68','935.971','55.9559','1.74995','4165:0 4167:0 '),\n('4167','db389','571','65','4168','70','74','0','3656.82','1058.49','58.5011','5.83088','4166:0 4168:0 '),\n('4168','db390','571','65','4168','70','74','0','3822.88','1076.68','57.7067','4.99837','4167:0 4169:0 '),\n('4169','db391','571','65','4168','70','74','0','3851.01','940.099','56.0659','4.66535','4168:0 4165:0 4170:0 '),\n('4170','db392','571','65','4254','70','74','0','4005.33','1003','53.2598','6.17489','4169:0 4171:0 '),\n('4171','db393','571','65','4254','70','74','0','4142.41','981.525','78.4202','0.463487','4170:0 4172:0 '),\n('4172','db394','571','65','4254','70','74','0','4305.2','1039.06','63.1545','6.25972','4171:0 4173:0 '),\n('4173','db395','571','65','65','70','74','0','4276.99','1183.3','141.02','6.17961','4172:0 4174:0 '),\n('4174','db396','571','65','65','70','74','0','4489.67','1187.53','136.792','1.18448','4173:0 4175:0 4179:0 '),\n('4175','db397','571','65','4169','70','74','2','4570.48','1377.12','189.542','1.18173','4174:0 4176:0 '),\n('4176','db398','571','65','4169','70','74','3','4589.48','1435.55','189.222','0.103772','4175:0 4177:0 4178:0 '),\n('4177','db399','571','65','4169','70','74','2','4621.53','1507.35','204.751','1.03447','4176:0 '),\n('4178','db400','571','65','4171','70','74','2','4711.55','1446.21','175.428','5.44841','4176:0 '),\n('4179','db401','571','65','65','70','74','0','4690.88','1098.68','123.008','2.0861','4180:0 4174:0 4150:0 '),\n('4180','db402','571','65','4170','70','74','4','4841.36','1140.74','171.495','1.04781','4181:0 4179:0 '),\n('4181','db403','571','65','4170','70','74','5','4947.98','1224.66','225.705','1.29599','4180:0 '),\n('4182','db404','571','65','4230','70','74','0','4857.56','636.316','157.933','3.35764','4183:0 4149:0 '),\n('4183','db405','571','65','4230','70','74','0','4919.39','858.686','179.409','4.72424','4182:0 4184:0 '),\n('4184','db406','571','65','4230','70','74','0','5115.8','1070.31','223.911','0.494084','4183:0 '),\n('4185','db407','571','65','65','70','74','0','4361.47','-666.576','126.529','4.95513','4141:0 4186:0 4190:0 '),\n('4186','db408','571','65','4193','70','74','0','4506.23','-611.765','138.674','0.191691','4185:0 4187:0 '),\n('4187','db409','571','65','4193','70','74','0','4635.8','-532.061','166.561','4.05115','4186:0 4188:0 '),\n('4188','db410','571','65','4193','70','74','0','4701.77','-386.751','178.452','4.03308','4187:0 4189:0 '),\n('4189','db411','571','65','65','70','74','0','4744.71','-265.341','170.449','0.542767','4188:0 '),\n('4190','db412','571','65','65','70','74','0','4381.74','-907.37','164.196','4.73833','4185:0 4191:0 '),\n('4191','db413','571','65','65','70','74','0','4453.65','-1048.77','166.994','5.44283','4190:0 4192:0 4193:0 '),\n('4192','db414','571','65','4191','70','74','1','4598.46','-1084.15','165.481','5.41142','4191:0 4197:0 '),\n('4193','db415','571','65','65','70','74','0','4459.56','-1263.85','163.284','4.29694','4191:0 4194:0 4198:0 4199:0 '),\n('4194','db416','571','65','4194','70','74','0','4561.66','-1361.99','156.723','5.94234','4193:0 4195:0 '),\n('4195','db417','571','65','4194','70','74','0','4677.53','-1359.08','162.34','2.13944','4194:0 4196:0 4451:0 '),\n('4196','db418','571','65','4194','70','74','0','4810.96','-1263.2','168.051','2.83451','4195:0 4197:0 '),\n('4197','db419','571','65','65','70','74','0','4682.42','-1190.97','164.492','2.29651','4196:0 4192:0 '),\n('4198','db420','571','65','65','70','74','0','4426.84','-1508.64','159.241','4.50584','4193:0 4276:0 '),\n('4199','db421','571','65','65','70','74','0','4306.11','-1358.64','159.518','2.56747','4193:0 4200:0 '),\n('4200','db422','571','65','4189','70','74','0','4174.24','-1186.41','145.827','2.02005','4199:0 4201:0 '),\n('4201','db423','571','65','4189','70','74','0','4007.83','-1254.48','133.053','2.98923','4200:0 4202:0 '),\n('4202','db424','571','65','65','70','74','0','3870.4','-1277.63','147.246','3.74243','4201:0 4203:0 4211:0 '),\n('4203','db425','571','65','4188','70','74','0','3760.87','-1379.1','135.314','4.06287','4202:0 4204:0 '),\n('4204','db426','571','65','4188','70','74','0','3749.27','-1504.65','141.102','2.59496','4203:0 4205:0 '),\n('4205','db427','571','65','4188','70','74','0','3628.59','-1546.14','118.335','2.62324','4204:0 4206:0 '),\n('4206','db428','571','65','4188','70','74','0','3581.08','-1357.67','107.693','1.20402','4205:0 4207:0 '),\n('4207','db429','571','65','4188','70','74','0','3627.72','-1237','112.462','1.20323','4206:0 4208:0 '),\n('4208','db430','571','65','4188','70','74','0','3662.83','-1064.27','125.377','1.29591','4207:0 4209:0 '),\n('4209','db431','571','65','4188','70','74','0','3755.72','-1010.08','121.509','5.72713','4208:0 4210:0 4212:0 '),\n('4210','db432','571','65','4188','70','74','0','3850.53','-1132.6','122.334','6.27534','4209:0 4211:0 '),\n('4211','db433','571','65','65','70','74','0','3942.27','-1148.57','140.166','4.29771','4210:0 4202:0 '),\n('4212','db434','571','65','4177','70','74','0','3746.15','-891.172','162.614','2.06089','4209:0 4213:0 4216:0 '),\n('4213','db435','571','65','4177','70','74','0','3650.12','-879.646','162.72','3.17459','4212:0 4214:0 '),\n('4214','db436','571','65','4177','70','74','2','3590.79','-835.238','172.37','1.65563','4213:0 4215:0 4240:0 '),\n('4215','db437','571','65','4243','70','74','0','3599.65','-781.467','147.621','0.0926948','4214:0 '),\n('4216','db438','571','65','4177','70','74','3','3768.81','-779.501','195.937','4.02283','4212:0 4217:0 '),\n('4217','db439','571','65','4177','70','74','2','3925.37','-698.927','241.206','0.865546','4216:0 4218:0 '),\n('4218','db440','571','65','4175','70','74','0','3986.58','-553.999','216.076','2.58635','4217:0 4219:0 '),\n('4219','db441','571','65','4254','70','74','0','3809.46','-473.161','169.556','2.73087','4218:0 4220:0 '),\n('4220','db442','571','65','65','70','74','0','3724.29','-439.939','157.058','3.21388','4219:0 4221:0 '),\n('4221','db443','571','65','4254','70','74','0','3784.04','-368.672','97.0346','1.91644','4220:0 4138:0 '),\n('4222','db444','571','65','4254','70','74','0','3263.75','-275.159','91.4928','3.40319','4136:0 4223:0 '),\n('4223','db445','571','65','65','70','74','0','3244.55','-472.809','140.618','1.83632','4222:0 4224:0 4234:0 '),\n('4224','db446','571','65','65','70','74','0','3148.48','-604.869','113.192','1.5842','4223:0 4225:0 4237:0 '),\n('4225','db447','571','65','4180','70','74','0','2993.93','-429.733','123.402','2.59501','4224:0 4226:0 '),\n('4226','db448','571','65','4180','70','74','0','2867.29','-384.503','112.462','2.7623','4225:0 4227:0 4233:0 '),\n('4227','db449','571','65','4180','70','74','0','2773.28','-465.739','116.162','4.48387','4226:0 4228:0 '),\n('4228','db450','571','65','4180','70','74','0','2687.72','-431.283','71.3279','2.92957','4227:0 4229:0 '),\n('4229','db451','571','65','4181','70','74','0','2536.4','-415.378','2.90773','1.58496','4228:0 4230:0 4253:0 '),\n('4230','db452','571','65','4181','70','74','0','2612.51','-244.345','1.72779','6.26044','4229:0 4231:0 '),\n('4231','db453','571','65','4180','70','74','0','2656.87','-171.598','62.2241','1.32029','4230:0 4232:0 '),\n('4232','db454','571','65','4180','70','74','0','2737.23','-100.56','114.159','4.23648','4231:0 4233:0 '),\n('4233','db455','571','65','4180','70','74','0','2792.04','-264.842','132.149','5.26534','4232:0 4226:0 '),\n('4234','db456','571','65','4186','70','74','5','3231.05','-661.255','166.734','1.42239','4223:0 4235:0 '),\n('4235','db457','571','65','4186','70','74','4','3272.19','-751.348','168.143','4.40298','4234:0 4236:0 '),\n('4236','db458','571','65','65','70','74','0','3325.52','-1005.39','123.604','2.0507','4235:0 4237:0 4238:0 4249:0 '),\n('4237','db459','571','65','65','70','74','0','3207.68','-802.517','112.975','2.23134','4236:0 4224:0 '),\n('4238','db460','571','65','65','70','74','0','3400.63','-1169.43','112.122','5.78762','4236:0 4239:0 4241:0 '),\n('4239','db461','571','65','65','70','74','0','3494.11','-1049.52','124.775','0.832553','4238:0 4240:0 '),\n('4240','db462','571','65','4177','70','74','2','3600.71','-914.48','156.552','1.53549','4239:0 4214:0 '),\n('4241','db463','571','65','65','70','74','0','3235.06','-1355.04','70.8979','3.83276','4238:0 4242:0 '),\n('4242','db464','571','65','4257','70','74','0','3180.86','-1542.39','40.4347','4.7124','4241:0 4243:0 4277:0 '),\n('4243','db465','571','65','4241','70','74','0','3051.36','-1392.98','57.3848','2.94133','4242:0 4244:0 '),\n('4244','db466','571','65','4241','70','74','0','2889.8','-1432.73','58.3338','3.04186','4243:0 4245:0 '),\n('4245','db467','571','65','4241','70','74','0','2772.55','-1373.06','40.6788','6.18974','4244:0 4246:0 '),\n('4246','db468','571','65','4185','70','74','0','2882.77','-1303.94','6.48389','1.04459','4245:0 4247:0 '),\n('4247','db469','571','65','4185','70','74','0','2938.22','-1169.74','6.81704','5.99025','4246:0 4248:0 4250:0 '),\n('4248','db470','571','65','4185','70','74','0','3085.09','-1193.85','12.4717','5.4876','4247:0 4249:0 '),\n('4249','db471','571','65','4185','70','74','0','3180.57','-1059.52','44.9918','0.29769','4248:0 4236:0 '),\n('4250','db472','571','65','4185','70','74','0','2929.48','-986.506','4.6099','1.77817','4247:0 4251:0 '),\n('4251','db473','571','65','4185','70','74','0','2865.52','-836.167','15.7438','2.35701','4250:0 4252:0 '),\n('4252','db474','571','65','4185','70','74','0','2691.63','-707.31','8.95638','2.62875','4251:0 4253:0 '),\n('4253','db475','571','65','4181','70','74','0','2662.91','-565.045','4.97671','2.87851','4252:0 4229:0 '),\n('4254','db476','571','65','65','70','74','0','3597.9','1391.95','92.2854','0.792481','4129:0 4255:0 '),\n('4255','db477','571','65','4165','70','74','4','3768.55','1529.38','86.92','0.415486','4254:0 4256:0 '),\n('4256','db478','571','65','4165','70','74','5','3841.3','1533.41','89.7247','1.82685','4255:0 4257:0 '),\n('4257','db479','571','65','4165','70','74','4','3890.52','1637.61','96.2566','0.644815','4256:0 4258:0 '),\n('4258','db480','571','65','65','70','74','0','4003.51','1741.08','142.414','3.8728','4257:0 4259:0 '),\n('4259','db481','571','65','65','70','74','0','3800.66','1801.11','107.946','0.35893','4258:0 4260:0 4273:0 '),\n('4260','db482','571','65','65','70','74','0','3642.7','1910.26','75.9736','1.69646','4259:0 4261:0 4115:0 '),\n('4261','db483','571','65','65','70','74','0','3615.88','2050.78','74.6297','1.7962','4260:0 4262:0 4265:0 '),\n('4262','db484','571','65','4164','70','74','0','3709.48','2144.81','53.4192','3.56571','4261:0 4263:0 4264:0 '),\n('4263','db485','571','65','4164','70','74','0','3706.64','2076.92','21.8594','1.15533','4262:0 4264:0 '),\n('4264','db486','571','65','4164','70','74','0','3772.34','2169.36','27.3597','4.8828','4263:0 4262:0 '),\n('4265','db487','571','65','65','70','74','0','3638.81','2223.64','76.3879','1.34851','4261:0 4266:0 '),\n('4266','db488','571','65','65','70','74','0','3608.56','2424.79','84.7521','0.47515','4265:0 4267:0 '),\n('4267','db489','571','65','65','70','74','0','3667.57','2606.35','104.934','2.34754','4266:0 4110:0 4268:0 '),\n('4268','db490','571','65','65','70','74','0','3821.64','2594.47','138.086','5.63442','4267:0 4269:0 '),\n('4269','db491','571','65','4163','70','74','0','3877.75','2397.8','152.255','5.33596','4268:0 4270:0 '),\n('4270','db492','571','65','4163','70','74','0','4003.82','2286.07','153.425','6.19125','4269:0 4271:0 '),\n('4271','db493','571','65','4163','70','74','0','4084.73','2159.31','153.682','4.48536','4270:0 4272:0 '),\n('4272','db494','571','65','4163','70','74','0','3961.11','2124.54','131.41','3.85941','4271:0 4273:0 '),\n('4273','db495','571','65','65','70','74','0','3825.91','1954.77','104.913','4.14765','4272:0 4259:0 '),\n('4274','db496','571','65','4151','70','74','4','3706.43','2835.58','88.7151','0.419359','4110:0 4275:0 '),\n('4275','db497','571','65','4151','70','74','5','3828.74','2884','90.3388','0.171959','4274:0 '),\n('4276','gh498','571','394','394','72','76','0','4412.91','-1618.03','162.125','4.64085','4198:0 4289:0 '),\n('4277','gh499','571','394','394','72','76','0','3182.34','-1659.02','38.7919','4.89218','4242:0 4278:0 '),\n('4278','gh500','571','394','394','72','76','0','3170.1','-1849.63','70.0118','5.13957','4277:0 4279:0 '),\n('4279','gh501','571','394','4236','72','76','0','3193.69','-1991.71','85.0008','6.13546','4278:0 4280:0 4306:0 '),\n('4280','gh502','571','394','394','72','76','0','3351.7','-1957.7','116.26','3.20042','4279:0 4281:0 4302:0 '),\n('4281','gh503','571','394','394','72','76','0','3506.14','-1975.54','165.694','5.76004','4280:0 4282:0 4301:0 '),\n('4282','gh504','571','394','394','72','76','0','3654.24','-2134.59','147.89','4.94165','4281:0 4283:0 4331:0 '),\n('4283','gh505','571','394','394','72','76','0','3768.13','-2266.2','173.421','6.00979','4282:0 4284:0 4297:0 4331:0 '),\n('4284','gh506','571','394','394','72','76','0','3965.13','-2347.84','213.634','6.13467','4283:0 4285:0 4446:0 '),\n('4285','gh507','571','394','394','72','76','0','4179.57','-2348.21','225.457','0.204908','4284:0 4286:0 4435:0 '),\n('4286','gh508','571','394','394','72','76','0','4360.95','-2316.79','201.282','0.15857','4285:0 4287:0 4296:0 '),\n('4287','gh509','571','394','394','72','76','0','4456.7','-2146.34','174.126','1.54558','4286:0 4288:0 '),\n('4288','gh510','571','394','394','72','76','0','4445.16','-1972.91','158.144','1.95792','4287:0 4289:0 '),\n('4289','gh511','571','394','394','72','76','0','4441.13','-1782.37','162.404','1.80319','4288:0 4276:0 4290:0 '),\n('4290','gh512','571','394','394','72','76','0','4395.14','-1892.04','161.168','3.62925','4289:0 4291:0 '),\n('4291','gh513','571','394','4209','72','76','0','4294.12','-1906.66','197.755','3.31587','4290:0 4292:0 4293:0 4294:0 '),\n('4292','gh514','571','394','4209','72','76','0','4245.43','-2019.66','235.391','1.60371','4291:0 '),\n('4293','gh515','571','394','4209','72','76','0','4219.61','-1824.36','202.548','2.41267','4291:0 '),\n('4294','gh516','571','394','4209','72','76','0','4141.35','-1993.19','212.874','4.66597','4291:0 4295:0 '),\n('4295','gh517','571','394','4209','72','76','0','4200.73','-2152.09','218.191','0.0124693','4294:0 4296:0 '),\n('4296','gh518','571','394','394','72','76','0','4337.91','-2212.2','191.313','5.10972','4295:0 4286:0 '),\n('4297','gh519','571','394','394','72','76','0','3919.84','-2211.56','210.955','0.375331','4283:0 4298:0 '),\n('4298','gh520','571','394','394','72','76','0','3841.19','-2055.11','210.168','1.65396','4297:0 4299:0 '),\n('4299','gh521','571','394','394','72','76','0','3817.14','-1865.71','214.679','1.96419','4298:0 4300:0 '),\n('4300','gh522','571','394','394','72','76','0','3654.79','-1866.78','173.387','2.8674','4299:0 4301:0 '),\n('4301','gh523','571','394','394','72','76','0','3559.72','-1897.37','155.876','3.47686','4300:0 4281:0 '),\n('4302','gh524','571','394','394','72','76','0','3387.84','-2133.26','124.553','5.44191','4280:0 4303:0 '),\n('4303','gh525','571','394','4206','72','76','4','3345.18','-2217.45','119.375','3.61665','4302:0 4304:0 '),\n('4304','gh526','571','394','4206','72','76','5','3256.98','-2231.76','116.09','1.0425','4303:0 4305:0 '),\n('4305','gh527','571','394','394','72','76','0','3086.49','-2267.46','94.942','1.73561','4304:0 4306:0 4314:0 '),\n('4306','gh528','571','394','394','72','76','0','3084.66','-2084.36','87.6685','1.27615','4305:0 4279:0 4307:0 '),\n('4307','gh529','571','394','394','72','76','0','2953.2','-1963.36','51.3225','2.81396','4306:0 4308:0 '),\n('4308','gh530','571','394','4242','72','76','0','2828.38','-1917.21','9.14124','2.88465','4307:0 4309:0 4310:0 '),\n('4309','gh531','571','394','4242','72','76','0','2698.31','-2040.99','3.89624','0.465604','4308:0 4313:0 '),\n('4310','gh532','571','394','4242','72','76','0','2755.77','-1781.45','5.41989','5.167','4308:0 4311:0 '),\n('4311','gh533','571','394','4242','72','76','0','2565.61','-1807.96','9.92644','3.51374','4310:0 4312:0 '),\n('4312','gh534','571','394','4242','72','76','0','2542.58','-1990.88','8.43344','5.20077','4311:0 4313:0 '),\n('4313','gh535','571','394','4242','72','76','0','2617','-2122.41','7.0106','0.525292','4312:0 4309:0 '),\n('4314','gh536','571','394','394','72','76','0','3111.6','-2469.39','60.839','4.64079','4305:0 4315:0 '),\n('4315','gh537','571','394','394','72','76','0','3050.93','-2690.26','65.2339','4.32742','4314:0 4316:0 '),\n('4316','gh538','571','394','394','72','76','0','2996.43','-2911.54','99.7541','3.55929','4315:0 4317:0 4323:0 '),\n('4317','gh539','571','394','394','72','76','0','2806.9','-2891.38','64.0493','3.18937','4316:0 4318:0 '),\n('4318','gh540','571','394','394','72','76','0','2688.1','-2877.41','68.4325','1.86676','4319:0 4317:0 4011:0 4002:0 '),\n('4319','gh541','571','394','4207','72','76','0','2863.15','-2691.55','84.6612','0.692585','4320:0 4318:0 '),\n('4320','gh542','571','394','4207','72','76','0','2913.28','-2523.08','77.2727','2.2516','4319:0 4321:0 '),\n('4321','gh543','571','394','4207','72','76','0','2759.62','-2433.25','39.5256','4.18681','4320:0 4322:0 '),\n('4322','gh544','571','394','394','72','76','0','2655.99','-2570.44','12.8707','0.715349','4321:0 4012:0 '),\n('4323','gh545','571','394','4240','72','76','0','3159.97','-2966.67','125.976','5.16462','4316:0 4324:0 '),\n('4324','gh546','571','394','394','72','76','0','3229.99','-3097.97','155.647','5.16069','4323:0 4325:0 4333:0 '),\n('4325','gh547','571','394','394','72','76','0','3347.86','-2939.95','194.535','0.886556','4324:0 4326:0 '),\n('4326','gh548','571','394','4204','72','76','3','3409.22','-2819.78','200.664','5.07272','4325:0 4327:0 '),\n('4327','gh549','571','394','394','72','76','0','3563.32','-2837.92','196.693','3.21211','4326:0 4328:0 '),\n('4328','gh550','571','394','394','72','76','0','3639.37','-2888.65','220.844','1.05698','4327:0 4329:0 4332:0 4432:0 '),\n('4329','gh551','571','394','394','72','76','0','3750.73','-2701.59','175.222','0.808005','4328:0 4330:0 4448:0 '),\n('4330','gh552','571','394','394','72','76','0','3701.9','-2499.94','160.171','2.01988','4329:0 4331:0 '),\n('4331','gh553','571','394','394','72','76','0','3667.41','-2329.55','156.4','0.83785','4330:0 4283:0 4282:0 '),\n('4332','gh554','571','394','394','72','76','0','3567.56','-3072.84','238.573','4.01871','4328:0 4333:0 4334:0 '),\n('4333','gh555','571','394','394','72','76','0','3355.89','-3183.89','200.874','2.94663','4332:0 4324:0 '),\n('4334','gh556','571','394','394','72','76','0','3543.08','-3277.22','242.517','4.88658','4332:0 4335:0 '),\n('4335','gh557','571','394','394','72','76','0','3676.96','-3469.09','242.035','5.54866','4334:0 4336:0 4429:0 '),\n('4336','gh558','571','394','394','72','76','0','3696.59','-3688.31','209.189','4.55906','4335:0 4337:0 '),\n('4337','gh559','571','394','394','72','76','0','3728.04','-3862.81','183.316','0.164743','4336:0 4338:0 4340:0 4347:0 '),\n('4338','gh560','571','394','4215','72','76','0','3590.62','-3901.08','196.64','2.77227','4337:0 4339:0 '),\n('4339','gh561','571','394','4215','72','76','0','3525.9','-3755.42','228.317','2.26176','4338:0 '),\n('4340','gh562','571','394','395','72','76','0','3841.06','-3743.21','175.461','6.13141','4337:0 4341:0 '),\n('4341','gh563','571','394','395','72','76','0','3974.14','-3774.46','151.082','6.17382','4340:0 4342:0 '),\n('4342','gh564','571','394','395','72','76','0','4052.02','-3740.14','220.288','4.50485','4341:0 4343:0 '),\n('4343','gh565','571','394','395','72','76','0','4135.39','-3710.81','180.991','2.0819','4342:0 4344:0 '),\n('4344','gh566','571','394','395','72','76','0','4194.15','-3814.05','181.668','4.59518','4343:0 4345:0 '),\n('4345','gh567','571','394','395','72','76','0','4181.7','-3982.87','170.498','4.5402','4344:0 4346:0 4409:0 '),\n('4346','gh568','571','394','394','72','76','0','4024.2','-4043.93','176.713','3.04794','4345:0 4347:0 4409:0 '),\n('4347','gh569','571','394','394','72','76','0','3787.44','-3987.74','181.678','2.65995','4346:0 4337:0 4348:0 '),\n('4348','gh570','571','394','394','72','76','0','3718.3','-4188.38','192.248','4.50249','4347:0 4349:0 4356:0 '),\n('4349','gh571','571','394','394','72','76','0','3545.36','-4300.26','227.855','3.59221','4348:0 4350:0 '),\n('4350','gh572','571','394','394','72','76','0','3375.07','-4408.72','245.826','4.29907','4349:0 4351:0 4353:0 '),\n('4351','gh573','571','394','4480','72','76','0','3261.77','-4590.54','305.739','3.95742','4350:0 4352:0 '),\n('4352','gh574','571','394','4480','72','76','0','3089.14','-4641.2','316.308','3.35188','4351:0 4045:0 '),\n('4353','gh575','571','394','4218','72','76','0','3502.07','-4548.51','221.433','3.38171','4350:0 4354:0 '),\n('4354','gh576','571','394','394','72','76','0','3656.98','-4455.52','184.363','5.84315','4353:0 4355:0 '),\n('4355','gh577','571','394','394','72','76','0','3731.98','-4511.53','193.763','0.757702','4354:0 4356:0 '),\n('4356','gh578','571','394','394','72','76','5','3851.11','-4369.54','192.918','1.37424','4355:0 4348:0 4357:0 '),\n('4357','gh579','571','394','4205','72','76','0','3939.37','-4409.34','238.255','4.98392','4356:0 4358:0 '),\n('4358','gh580','571','394','4205','72','76','0','4062.37','-4401.54','260.429','0.235388','4357:0 4359:0 4408:0 4410:0 '),\n('4359','gh581','571','394','394','72','76','0','4171.31','-4502.24','219.959','1.1284','4358:0 4360:0 '),\n('4360','gh582','571','394','4205','72','76','0','4003.62','-4566.46','195.348','3.13431','4359:0 4361:0 '),\n('4361','gh583','571','394','394','72','76','0','4008.13','-4692.66','141.153','5.45436','4360:0 4362:0 '),\n('4362','gh584','571','394','4231','72','76','0','4082.28','-4754.21','96.3716','4.76714','4361:0 4363:0 '),\n('4363','gh585','571','394','4249','72','76','0','4193.08','-4880.87','42.4572','3.89614','4362:0 4364:0 4374:0 4382:0 '),\n('4364','gh586','571','394','4249','72','76','0','4317.27','-4702.62','75.8335','0.62967','4363:0 4365:0 '),\n('4365','gh587','571','394','4249','72','76','0','4444.07','-4566.46','104.898','1.65462','4364:0 4366:0 '),\n('4366','gh588','571','394','4249','72','76','0','4428.45','-4387.5','151.381','1.08913','4365:0 4367:0 '),\n('4367','gh589','571','394','4159','72','76','0','4438.72','-4286.42','161.56','6.09212','4366:0 4368:0 4420:0 '),\n('4368','gh590','571','394','4249','72','76','0','4621.51','-4357.67','181.183','5.95781','4367:0 4369:0 '),\n('4369','gh591','571','394','4221','72','76','0','4732.05','-4454.6','194.355','5.45673','4368:0 4370:0 '),\n('4370','gh592','571','394','4221','72','76','0','4820.92','-4522.91','200.404','5.83294','4369:0 4371:0 '),\n('4371','gh593','571','394','4221','72','76','0','4909.98','-4586.39','219.616','4.43492','4370:0 4372:0 '),\n('4372','gh594','571','394','4221','72','76','0','4984.98','-4692.79','219.491','5.1245','4371:0 4373:0 '),\n('4373','gh595','571','394','4221','72','76','0','5041.25','-4817','219.501','2.53662','4372:0 '),\n('4374','gh596','571','394','4212','72','76','0','4339.89','-4870.51','34.7802','0.17335','4363:0 4375:0 '),\n('4375','gh597','571','394','4216','72','76','0','4474.49','-4921.22','14.201','5.96566','4374:0 4376:0 4377:0 '),\n('4376','gh598','571','394','4212','72','76','0','4518.04','-5017.36','3.25924','5.12764','4375:0 '),\n('4377','gh599','571','394','4216','72','76','0','4569.4','-4865.21','47.9919','0.149002','4375:0 4378:0 4379:0 4380:0 '),\n('4378','gh600','571','394','4216','72','76','0','4707.48','-4794.55','47.992','5.06167','4377:0 4379:0 '),\n('4379','gh601','571','394','4216','72','76','0','4708.25','-4910.12','47.9928','1.36166','4377:0 4378:0 '),\n('4380','gh602','571','394','4216','72','76','0','4744.53','-4859.91','26.2962','0.387759','4377:0 4381:0 '),\n('4381','gh603','571','394','4216','72','76','0','4816.99','-4789.4','25.4718','0.872349','4380:0 '),\n('4382','gh604','571','394','4249','72','76','0','4022.33','-4997.21','41.214','3.78223','4363:0 4383:0 4391:0 '),\n('4383','gh605','571','394','4249','72','76','0','3816.35','-5011.96','106.526','3.31727','4382:0 4384:0 4392:0 '),\n('4384','gh606','571','394','4220','72','76','0','3646.81','-5000.53','175.852','4.1867','4383:0 4385:0 '),\n('4385','gh607','571','394','4220','72','76','0','3524.22','-5120.65','233.744','2.61591','4384:0 4386:0 4389:0 '),\n('4386','gh608','571','394','4220','72','76','0','3419.01','-4995.77','285.739','2.5845','4385:0 4387:0 '),\n('4387','gh609','571','394','4220','72','76','0','3356.74','-5082.19','325.289','3.94009','4386:0 4388:0 '),\n('4388','gh610','571','394','4220','72','76','0','3310.99','-5122.5','340.978','1.36004','4387:0 '),\n('4389','gh611','571','394','4220','72','76','0','3433.34','-5250.17','269.339','1.01289','4385:0 4390:0 '),\n('4390','gh612','571','394','4220','72','76','0','3407.12','-5388.15','267.856','1.78573','4389:0 '),\n('4391','gh613','571','394','4212','72','76','0','4006.9','-5232.47','7.75033','1.18098','4382:0 4402:0 '),\n('4392','gh614','571','394','394','72','76','0','3757.96','-5153.08','119.324','4.14823','4383:0 4393:0 '),\n('4393','gh615','571','394','394','72','76','0','3598.76','-5357.93','139.869','4.05555','4392:0 4394:0 '),\n('4394','gh616','571','394','4213','72','76','0','3443.06','-5490.97','198.431','3.26623','4393:0 4395:0 '),\n('4395','gh617','571','394','4213','72','76','0','3274.45','-5572.3','213.641','3.71783','4394:0 4396:0 '),\n('4396','gh618','571','394','4213','72','76','0','3100.03','-5709.35','220.326','3.74532','4395:0 4401:0 '),\n('4397','hf619','571','495','4061','68','73','0','2323.35','-5813.06','251.394','3.16805','4060:0 4061:0 4398:0 '),\n('4398','hf620','571','495','495','68','73','0','2519.29','-5851.8','276.256','4.73492','4397:0 4399:0 '),\n('4399','hf621','571','495','495','68','73','0','2703.09','-5953.52','271.511','6.11722','4398:0 4400:0 '),\n('4400','hf622','571','495','4252','68','73','0','2849.67','-5840.96','273.44','0.629637','4399:0 4401:0 '),\n('4401','hf623','571','495','4252','68','73','0','3003.04','-5779.08','254.433','0.523608','4400:0 4396:0 '),\n('4402','gh624','571','394','4212','72','76','0','4153.59','-5224.2','7.42476','6.08423','4391:0 4403:0 '),\n('4403','gh625','571','394','4212','72','76','0','4327.94','-5342.7','4.49671','5.82112','4402:0 4404:0 '),\n('4404','gh626','571','394','4244','72','76','0','4543.08','-5485.22','2.18391','5.50775','4403:0 4405:0 '),\n('4405','gh627','571','394','4244','72','76','0','4695.42','-5635.74','77.5219','4.55742','4404:0 4406:0 '),\n('4406','gh628','571','394','4245','72','76','0','4616.66','-5660.81','114.593','4.22877','4405:0 4407:0 '),\n('4407','gh629','571','394','4245','72','76','0','4593.57','-5707.41','184.506','1.02041','4406:0 '),\n('4408','gh630','571','394','394','72','76','0','4113.47','-4233.27','243.732','1.89258','4358:0 4409:0 '),\n('4409','gh631','571','394','394','72','76','1','4125.58','-4095.14','182.823','2.77224','4408:0 4346:0 4345:0 '),\n('4410','gh632','571','394','394','72','76','0','4172.63','-4310.2','238.733','2.85314','4358:0 4411:0 '),\n('4411','gh633','571','394','394','72','76','0','4326.78','-4119.6','193.825','0.547988','4410:0 4412:0 '),\n('4412','gh634','571','394','394','72','76','0','4486.09','-3977.4','186.997','5.61774','4411:0 4413:0 4422:0 '),\n('4413','gh635','571','394','394','72','76','0','4625.2','-4092.13','199.11','2.30728','4412:0 4414:0 '),\n('4414','gh636','571','394','394','72','76','0','4734.83','-4181.86','231.297','2.31358','4413:0 4415:0 '),\n('4415','gh637','571','394','394','72','76','0','4906.69','-4306.46','257.585','0.692519','4414:0 4416:0 4449:0 '),\n('4416','gh638','571','394','4214','72','76','0','5016.3','-4437.54','278.117','5.31851','4415:0 4417:0 '),\n('4417','gh639','571','394','4214','72','76','0','5101.89','-4569.13','283.736','5.11902','4416:0 4418:0 '),\n('4418','gh640','571','394','4214','72','76','0','5193.65','-4729.96','293.156','5.98138','4417:0 4419:0 '),\n('4419','gh641','571','394','4214','72','76','0','5380.16','-4761.41','305.589','6.26491','4418:0 '),\n('4420','gh642','571','394','4159','72','76','2','4508.01','-4224.81','167.488','4.05322','4367:0 4421:0 '),\n('4421','gh643','571','394','4159','72','76','3','4593.24','-4223.94','178.654','3.05419','4420:0 '),\n('4422','gh644','571','394','394','72','76','0','4397.58','-3823.41','207.663','1.98605','4412:0 4423:0 '),\n('4423','gh645','571','394','4235','72','76','0','4363.62','-3661.89','253.292','1.03572','4422:0 4424:0 4426:0 '),\n('4424','gh646','571','394','4270','72','76','0','4464.25','-3523.69','231.349','0.662651','4423:0 4425:0 '),\n('4425','gh647','571','394','4270','72','76','0','4540.35','-3448.14','226.932','0.666578','4424:0 4450:0 '),\n('4426','gh648','571','394','394','72','76','0','4254.62','-3537.34','262.169','3.11545','4423:0 4427:0 '),\n('4427','gh649','571','394','394','72','76','0','4082.82','-3452.53','279.273','2.96073','4426:0 4428:0 '),\n('4428','gh650','571','394','4267','72','76','0','4017.93','-3398.46','291.406','1.89652','4427:0 4429:0 4430:0 '),\n('4429','gh651','571','394','394','72','76','0','3805.22','-3452.83','276.397','3.26311','4428:0 4335:0 '),\n('4430','gh652','571','394','394','72','76','0','3927.34','-3218.24','296.696','2.32848','4428:0 4431:0 4438:0 '),\n('4431','gh653','571','394','394','72','76','0','3809.69','-3057.95','274.256','2.59945','4430:0 4432:0 4445:0 '),\n('4432','gh654','571','394','394','72','76','0','3727.35','-2986.21','236.602','2.62301','4431:0 4328:0 4433:0 '),\n('4433','gh655','571','394','4203','72','76','0','3799.13','-2875.46','222.297','0.855862','4432:0 4434:0 '),\n('4434','gh656','571','394','394','72','76','0','3912.6','-2792.74','176.353','3.96212','4433:0 '),\n('4435','gh657','571','394','4199','72','76','0','4204.22','-2467.24','229.848','5.58004','4285:0 4436:0 4437:0 '),\n('4436','gh658','571','394','4199','72','76','1','4355.92','-2485.04','242.225','3.56707','4435:0 4437:0 '),\n('4437','gh659','571','394','4199','72','76','0','4320.51','-2585.42','246.459','1.97429','4436:0 4435:0 '),\n('4438','gh660','571','394','4222','72','76','0','4055.91','-3147.98','278.056','5.70496','4430:0 4439:0 '),\n('4439','gh661','571','394','4222','72','76','0','4250.54','-3177.85','307.936','0.898319','4438:0 4440:0 '),\n('4440','gh662','571','394','4222','72','76','0','4326.86','-3320.66','310.551','0.546446','4439:0 4441:0 '),\n('4441','gh663','571','394','4222','72','76','0','4447.75','-3199.73','313.463','2.16044','4440:0 4442:0 '),\n('4442','gh664','571','394','4222','72','76','0','4418.84','-2984.71','309.349','1.76303','4441:0 4443:0 '),\n('4443','gh665','571','394','4222','72','76','0','4226.67','-2862.19','281.474','3.5718','4442:0 4444:0 '),\n('4444','gh666','571','394','4222','72','76','0','4035.13','-2946.41','276.096','3.8946','4443:0 4445:0 '),\n('4445','gh667','571','394','4222','72','76','0','3928.19','-3008.94','275.401','3.52703','4444:0 4431:0 '),\n('4446','gh668','571','394','394','72','76','0','3974.25','-2486.57','216.336','4.66038','4284:0 4447:0 '),\n('4447','gh669','571','394','4202','72','76','0','3933.08','-2603.19','206.74','5.22586','4446:0 4448:0 '),\n('4448','gh670','571','394','394','72','76','0','3783','-2602.59','191.183','4.81351','4447:0 4329:0 '),\n('4449','zd671','571','66','66','73','77','0','5075.22','-4157.1','351.671','0.704319','4415:0 4576:0 4577:0 '),\n('4450','zd672','571','66','66','73','77','0','4642.75','-3362.88','292.419','0.845695','4425:0 4516:0 '),\n('4451','zd673','571','66','66','73','77','0','4845.51','-1504.94','248.946','5.30284','4195:0 4452:0 '),\n('4452','zd674','571','66','66','73','77','0','4915.37','-1688.61','248.309','4.74834','4451:0 4453:0 '),\n('4453','zd675','571','66','66','73','77','0','4913.71','-1902.76','248.309','4.71615','4452:0 4454:0 4456:0 '),\n('4454','zd676','571','66','66','73','77','0','4907.24','-2149.46','248.308','4.51509','4453:0 4455:0 4456:0 '),\n('4455','zd677','571','66','4316','73','77','0','4935.58','-2282.22','243.077','5.02638','4454:0 4492:0 '),\n('4456','zd678','571','66','66','73','77','0','4948.85','-2047.71','248.309','0.0634512','4454:0 4453:0 4457:0 '),\n('4457','zd679','571','66','66','73','77','0','5154.72','-2050.3','248.297','1.1198','4456:0 4458:0 4488:0 4489:0 '),\n('4458','zd680','571','66','66','73','77','0','5198.14','-1908','243.765','1.97824','4457:0 4459:0 '),\n('4459','zd681','571','66','4311','73','77','0','5168.01','-1763.65','243.57','1.69157','4458:0 4460:0 '),\n('4460','zd682','571','66','4311','73','77','0','5227.64','-1629.23','235.86','1.70729','4459:0 4461:0 '),\n('4461','zd683','571','66','66','73','77','0','5202.17','-1444.6','235.3','1.67195','4460:0 4462:0 4463:0 '),\n('4462','zd684','571','66','4312','73','77','1','5228.85','-1333.15','242.312','5.2078','4461:0 4463:0 '),\n('4463','zd685','571','66','66','73','77','0','5369.86','-1421.32','236.955','3.0236','4462:0 4461:0 4464:0 '),\n('4464','zd686','571','66','66','73','77','0','5446.59','-1338.52','239.221','4.34385','4463:0 4465:0 4466:0 4486:0 '),\n('4465','zd687','571','66','66','73','77','0','5443.61','-1214.88','247.443','1.55882','4464:0 4607:0 '),\n('4466','zd688','571','66','4313','73','77','0','5555.66','-1397.11','239.86','2.99374','4464:0 4467:0 '),\n('4467','zd689','571','66','4313','73','77','0','5695.79','-1400.51','234.446','5.54941','4466:0 4468:0 4481:0 '),\n('4468','zd690','571','66','4313','73','77','0','5775.25','-1545.64','229.906','6.10312','4467:0 4469:0 4481:0 '),\n('4469','zd691','571','66','4469','73','77','0','5886.45','-1638.86','237.734','5.61617','4468:0 4470:0 4482:0 '),\n('4470','zd692','571','66','4469','73','77','0','5972.87','-1716.32','231.167','5.38055','4469:0 4471:0 '),\n('4471','zd693','571','66','4469','73','77','0','6050.18','-1854.06','239.866','4.90932','4470:0 4472:0 '),\n('4472','zd694','571','66','4315','73','77','0','6083.8','-1956.71','235.309','5.74812','4471:0 4473:0 4475:0 '),\n('4473','zd695','571','66','4315','73','77','0','6239.25','-1977.17','235.732','4.86297','4472:0 4474:0 '),\n('4474','zd696','571','66','4315','73','77','0','6209.7','-2182.71','236.212','3.31259','4473:0 4475:0 '),\n('4475','zd697','571','66','4315','73','77','0','6062.56','-2208.12','234.275','1.69703','4474:0 4472:0 4476:0 '),\n('4476','zd698','571','66','4315','73','77','0','5846.96','-2232.9','236.499','3.12253','4475:0 4477:0 '),\n('4477','zd699','571','66','4468','73','77','0','5680.87','-2213.84','239.83','3.10525','4476:0 4478:0 4483:0 '),\n('4478','zd700','571','66','4468','73','77','0','5565.53','-2198.52','235.496','1.86432','4477:0 4479:0 '),\n('4479','zd701','571','66','4468','73','77','0','5571.97','-1996.67','237.88','1.26977','4478:0 4480:0 4483:0 4484:0 '),\n('4480','zd702','571','66','4468','73','77','0','5653.64','-1810.94','236.435','1.32868','4479:0 4481:0 4482:0 '),\n('4481','zd703','571','66','4313','73','77','0','5609.8','-1610.43','237.022','0.732563','4480:0 4468:0 4467:0 '),\n('4482','zd704','571','66','4468','73','77','0','5833.14','-1759.05','233.346','1.1936','4480:0 4469:0 4483:0 '),\n('4483','zd705','571','66','4468','73','77','0','5766.32','-1991.79','235.993','4.71376','4482:0 4477:0 4479:0 '),\n('4484','zd706','571','66','66','73','77','0','5444.04','-1955.64','248.222','4.72161','4479:0 4485:0 4487:0 4488:0 '),\n('4485','zd707','571','66','66','73','77','0','5446.88','-1747.93','248.337','1.71275','4484:0 4486:0 '),\n('4486','zd708','571','66','66','73','77','0','5445.34','-1527.93','248.26','1.56823','4485:0 4464:0 '),\n('4487','zd709','571','66','66','73','77','0','5449.03','-2186.49','248.309','4.69804','4484:0 4493:0 '),\n('4488','zd710','571','66','66','73','77','0','5286.44','-2043.61','246.138','3.10918','4484:0 4457:0 '),\n('4489','zd711','571','66','4317','73','77','1','5168.98','-2192.3','236.538','5.78582','4457:0 4490:0 '),\n('4490','zd712','571','66','66','73','77','0','5057.15','-2200.22','244.382','3.79877','4489:0 4491:0 '),\n('4491','zd713','571','66','66','73','77','0','5039.31','-2353.08','242.172','3.30084','4490:0 4492:0 '),\n('4492','zd714','571','66','4316','73','77','0','4870.93','-2382.92','234.006','2.40312','4491:0 4455:0 '),\n('4493','zd715','571','66','4275','73','77','0','5451.23','-2302.91','297.236','1.61772','4487:0 4494:0 4495:0 4522:0 '),\n('4494','zd716','571','66','4275','73','77','0','5448.61','-2517.18','292.419','4.61951','4493:0 4495:0 4511:0 4522:0 '),\n('4495','zd717','571','66','4275','73','77','0','5555.82','-2440.17','290.942','2.83587','4494:0 4493:0 4496:0 4522:0 '),\n('4496','zd718','571','66','4318','73','77','0','5688.46','-2430.58','287.55','3.11862','4495:0 4497:0 '),\n('4497','zd719','571','66','4294','73','77','0','5806.54','-2342.64','290.484','5.7662','4496:0 4498:0 '),\n('4498','zd720','571','66','4294','73','77','0','5929.41','-2434.64','292.384','5.92563','4497:0 4499:0 '),\n('4499','zd721','571','66','4294','73','77','0','6095.28','-2375.23','290.191','0.345376','4498:0 4500:0 '),\n('4500','zd722','571','66','4276','73','77','0','6180.98','-2386.29','307.72','4.9046','4499:0 4501:0 '),\n('4501','zd723','571','66','4276','73','77','0','6189.69','-2520.06','304.709','4.73102','4500:0 4502:0 4507:0 '),\n('4502','zd724','571','66','4276','73','77','0','6265.08','-2506.2','302.978','4.68313','4501:0 4503:0 '),\n('4503','zd725','571','66','4276','73','77','0','6245.94','-2735.34','302.749','3.45398','4502:0 4504:0 4505:0 '),\n('4504','zd726','571','66','4276','73','77','0','6057.61','-2737.89','302.8','1.51562','4503:0 4506:0 '),\n('4505','zd727','571','66','66','73','77','0','6297.01','-2862.98','293.934','2.17613','4503:0 '),\n('4506','zd728','571','66','66','73','77','0','6048.63','-2898.7','296.891','3.34009','4504:0 '),\n('4507','zd729','571','66','4276','73','77','0','6198.47','-2622.9','293.162','1.74809','4501:0 4508:0 '),\n('4508','zd730','571','66','4276','73','77','0','6057.09','-2616.09','302.748','3.26077','4507:0 4509:0 '),\n('4509','zd731','571','66','66','73','77','0','5884.73','-2617.57','292.418','3.15396','4508:0 4510:0 '),\n('4510','zd732','571','66','66','73','77','0','5672.49','-2619.11','292.418','3.13825','4509:0 4511:0 4523:0 '),\n('4511','zd733','571','66','4275','73','77','1','5457.16','-2620.72','306.551','1.83449','4510:0 4494:0 4512:0 '),\n('4512','zd734','571','66','66','73','77','0','5332.55','-2708.7','292.419','3.89224','4511:0 4513:0 4520:0 '),\n('4513','zd735','571','66','66','73','77','0','5189.96','-2843.82','292.419','5.47639','4512:0 4514:0 4517:0 4519:0 4520:0 '),\n('4514','zd736','571','66','66','73','77','0','5035.14','-2975.52','292.29','3.86318','4513:0 4515:0 4519:0 4529:0 '),\n('4515','zd737','571','66','66','73','77','0','4891.99','-3121.16','292.419','3.92601','4514:0 4516:0 4532:0 '),\n('4516','zd738','571','66','66','73','77','0','4770.68','-3237.29','292.419','3.91659','4515:0 4450:0 4533:0 '),\n('4517','zd739','571','66','66','73','77','0','5358.22','-3018.37','292.42','5.50546','4513:0 4518:0 4529:0 '),\n('4518','zd740','571','66','66','73','77','0','5504.36','-3161.64','327.623','5.5251','4517:0 4528:0 4537:0 '),\n('4519','zd741','571','66','4278','73','77','0','4997.42','-2791.64','287.647','5.40334','4514:0 4513:0 4520:0 '),\n('4520','zd742','571','66','4278','73','77','0','5158.28','-2673.27','288.27','0.638333','4519:0 4512:0 4513:0 4521:0 '),\n('4521','zd743','571','66','66','73','77','0','5256.37','-2555.92','288.451','1.56824','4520:0 4522:0 '),\n('4522','zd744','571','66','4275','73','77','0','5338.16','-2432.94','289.035','0.00530624','4521:0 4494:0 4493:0 4495:0 '),\n('4523','zd745','571','66','4280','73','77','0','5779.01','-2690.72','276.583','2.21778','4510:0 4524:0 '),\n('4524','zd746','571','66','4320','73','77','0','5721.5','-2843.26','274.479','3.99436','4523:0 4525:0 4527:0 '),\n('4525','zd747','571','66','4320','73','77','1','5795.09','-3017.85','286.307','5.12926','4524:0 4526:0 '),\n('4526','zd748','571','66','4320','73','77','0','5829.57','-3089.62','343.078','5.24393','4525:0 4542:0 '),\n('4527','zd749','571','66','4280','73','77','0','5611.83','-2947.53','274.379','3.44223','4524:0 4528:0 '),\n('4528','zd750','571','66','4280','73','77','0','5467.65','-3021.98','288.17','4.29281','4527:0 4518:0 '),\n('4529','zd751','571','66','4279','73','77','0','5183.53','-3158.14','271.373','0.983891','4517:0 4514:0 4530:0 '),\n('4530','zd752','571','66','4279','73','77','0','5277.96','-3280.48','281.073','4.24508','4529:0 4531:0 '),\n('4531','zd753','571','66','4279','73','77','0','5170.84','-3397.25','289.096','2.18261','4530:0 4532:0 4534:0 '),\n('4532','zd754','571','66','4279','73','77','0','5037.17','-3252.81','278.555','2.42609','4531:0 4515:0 '),\n('4533','zd755','571','66','4299','73','77','0','4868.35','-3381.36','292.891','5.68473','4516:0 4534:0 '),\n('4534','zd756','571','66','4299','73','77','0','5062.51','-3481.16','289.586','4.38568','4533:0 4531:0 4535:0 '),\n('4535','zd757','571','66','4299','73','77','0','5037.37','-3645.39','298.622','4.61344','4534:0 4536:0 '),\n('4536','zd758','571','66','4299','73','77','0','5087.62','-3673.69','368.159','1.40275','4535:0 '),\n('4537','zd759','571','66','66','73','77','0','5653.1','-3291.77','372.841','5.39966','4518:0 4538:0 4542:0 4573:0 '),\n('4538','zd760','571','66','4323','73','77','0','5760.12','-3480.35','382.038','4.42027','4537:0 4539:0 4542:0 4573:0 '),\n('4539','zd761','571','66','4323','73','77','1','5763.21','-3592.34','386.495','5.18723','4538:0 4540:0 '),\n('4540','zd762','571','66','66','73','77','0','5805.54','-3730.07','371.987','2.07548','4539:0 4541:0 4558:0 4568:0 '),\n('4541','zd763','571','66','66','73','77','0','5926.35','-3596.12','371.987','2.21685','4540:0 4542:0 4559:0 '),\n('4542','zd764','571','66','66','73','77','0','5852.16','-3456.19','373.499','0.462273','4537:0 4541:0 4538:0 4543:0 4526:0 '),\n('4543','zd765','571','66','4327','73','77','0','6015.43','-3354.83','351.334','0.898171','4542:0 4544:0 4546:0 '),\n('4544','zd766','571','66','4327','73','77','0','6064.66','-3220.41','351.084','5.24378','4543:0 4545:0 '),\n('4545','zd767','571','66','4327','73','77','0','6170.15','-3269.78','354.099','4.83851','4544:0 4546:0 4550:0 '),\n('4546','zd768','571','66','4327','73','77','0','6123.58','-3376.38','350.427','3.6502','4545:0 4543:0 4547:0 '),\n('4547','zd769','571','66','4328','73','77','0','6121.57','-3498.34','384.702','6.11321','4546:0 4549:0 4548:0 '),\n('4548','zd770','571','66','4328','73','77','0','6262.56','-3570.42','383.729','4.01857','4547:0 4549:0 4556:0 '),\n('4549','zd771','571','66','4328','73','77','0','6183.8','-3653.66','384.553','1.57362','4547:0 4548:0 4559:0 '),\n('4550','zd772','571','66','4321','73','77','0','6322.87','-3285.06','388.539','6.26715','4545:0 4551:0 4555:0 4556:0 '),\n('4551','zd773','571','66','4321','73','77','0','6411.23','-3132.08','389.357','0.676679','4550:0 4552:0 '),\n('4552','zd774','571','66','4321','73','77','0','6573.73','-3100.58','392.875','3.25828','4551:0 4553:0 '),\n('4553','zd775','571','66','4321','73','77','0','6591.66','-3194.21','412.812','2.18937','4552:0 4554:0 '),\n('4554','zd776','571','66','4321','73','77','0','6440.64','-3192.66','402.475','4.61546','4553:0 4555:0 '),\n('4555','zd777','571','66','4321','73','77','0','6464.24','-3278.19','402.912','0.40965','4554:0 4550:0 '),\n('4556','zd778','571','66','4321','73','77','0','6447.03','-3450.35','388.772','5.0215','4550:0 4557:0 4548:0 '),\n('4557','zd779','571','66','66','73','77','0','6351.61','-3625.18','379.474','1.56496','4556:0 '),\n('4558','zd780','571','66','4326','73','77','0','5890.65','-3784.26','361.962','2.65353','4540:0 4559:0 4560:0 '),\n('4559','zd781','571','66','66','73','77','0','6002.17','-3684.49','371.988','2.91507','4558:0 4541:0 4549:0 4581:0 '),\n('4560','zd782','571','66','66','73','77','0','5871.01','-3998.48','364.264','5.0278','4558:0 4561:0 '),\n('4561','zd783','571','66','4371','73','77','0','5936.71','-4166.52','353.36','6.12894','4560:0 4562:0 4564:0 4565:0 '),\n('4562','zd784','571','66','4371','73','77','0','6121.47','-4241.02','320.493','2.98578','4561:0 4563:0 '),\n('4563','zd785','571','66','4371','73','77','0','6077.47','-4432.62','362.867','1.61132','4562:0 4564:0 '),\n('4564','zd786','571','66','4371','73','77','0','5913.09','-4334','361.983','1.57991','4561:0 4563:0 '),\n('4565','zd787','571','66','4325','73','77','0','5789.33','-4263.74','371.348','4.26205','4561:0 4566:0 '),\n('4566','zd788','571','66','4325','73','77','0','5716.79','-4325.83','373.993','4.5605','4565:0 4567:0 4580:0 '),\n('4567','zd789','571','66','4325','73','77','0','5716.89','-4120.29','353.305','1.62547','4566:0 4568:0 4580:0 '),\n('4568','zd790','571','66','66','73','77','0','5706.28','-3833.4','371.987','0.940598','4567:0 4540:0 4569:0 '),\n('4569','zd791','571','66','66','73','77','0','5537.84','-3840.96','372.119','2.47998','4568:0 4570:0 4571:0 '),\n('4570','zd792','571','66','4322','73','77','0','5351.53','-3648.35','361.961','2.27578','4569:0 4571:0 4572:0 4574:0 '),\n('4571','zd793','571','66','4322','73','77','0','5343.06','-3764.54','373.087','0.190553','4569:0 4570:0 '),\n('4572','zd794','571','66','66','73','77','0','5524.4','-3572.01','365.432','0.730907','4570:0 4573:0 '),\n('4573','zd795','571','66','4324','73','77','0','5626.9','-3422.21','363.833','0.990089','4572:0 4537:0 4538:0 '),\n('4574','zd796','571','66','4322','73','77','0','5153.32','-3723.32','360.396','4.07514','4570:0 4575:0 '),\n('4575','zd797','571','66','4322','73','77','0','5076.21','-3849.59','356.664','4.99406','4574:0 4576:0 '),\n('4576','zd798','571','66','66','73','77','0','5136.04','-4040.57','355.425','5.10401','4575:0 4449:0 4577:0 '),\n('4577','zd799','571','66','66','73','77','0','5278.78','-4177.66','363.104','2.86954','4576:0 4449:0 4578:0 '),\n('4578','zd800','571','66','66','73','77','0','5437.96','-4288.78','363.086','5.803','4577:0 4579:0 4580:0 '),\n('4579','zd801','571','66','66','73','77','0','5440.87','-4452.18','379.545','5.85562','4578:0 '),\n('4580','zd802','571','66','4325','73','77','0','5627.9','-4207.17','364.009','5.93258','4578:0 4567:0 4566:0 '),\n('4581','zd803','571','66','66','73','77','0','6164.11','-3834.22','436.687','5.57209','4559:0 4582:0 '),\n('4582','zd804','571','66','66','73','77','0','6297.28','-3979.47','456.92','5.47784','4581:0 4583:0 '),\n('4583','zd805','571','66','66','73','77','0','6443.44','-4126.1','462.301','5.40087','4582:0 4584:0 4594:0 '),\n('4584','zd806','571','66','4329','73','77','0','6406.23','-4295.64','457.247','4.84558','4583:0 4585:0 4593:0 '),\n('4585','zd807','571','66','66','73','77','0','6273.9','-4442.23','450.834','3.83242','4584:0 4586:0 4589:0 '),\n('4586','zd808','571','66','4329','73','77','0','6178.17','-4399.01','456.879','1.41967','4585:0 4587:0 '),\n('4587','zd809','571','66','4329','73','77','0','6227.62','-4232.4','436.632','4.94847','4586:0 4588:0 '),\n('4588','zd810','571','66','4329','73','77','0','6214.01','-4138.28','447.456','5.0066','4587:0 '),\n('4589','zd811','571','66','4373','73','77','0','6412.14','-4626.89','453.335','2.16502','4585:0 4590:0 '),\n('4590','zd812','571','66','4375','73','77','0','6602.74','-4663.95','450.613','0.474835','4589:0 4591:0 4605:0 '),\n('4591','zd813','571','66','4375','73','77','0','6698.48','-4568.11','450.518','2.11632','4590:0 4592:0 '),\n('4592','zd814','571','66','4375','73','77','0','6638.09','-4503.12','485.547','2.39985','4591:0 4593:0 '),\n('4593','zd815','571','66','4373','73','77','0','6532.06','-4368.66','450.654','5.95377','4592:0 4584:0 4594:0 '),\n('4594','zd816','571','66','66','73','77','0','6586.21','-4259.92','452.582','2.52315','4593:0 4583:0 4595:0 '),\n('4595','zd817','571','66','66','73','77','0','6681.53','-4181.26','455.784','5.78336','4594:0 4596:0 4603:0 '),\n('4596','zd818','571','66','66','73','77','0','6821.02','-4227.92','452.785','0.387671','4595:0 4597:0 4603:0 '),\n('4597','zd819','571','66','4579','73','77','1','6899.77','-4113.21','467.355','4.92777','4596:0 4598:0 '),\n('4598','zd820','571','66','66','73','77','0','7055.14','-4222.88','450.363','3.95496','4597:0 4599:0 '),\n('4599','zd821','571','66','66','73','77','0','7139.88','-4413.45','457.062','4.921','4598:0 4600:0 '),\n('4600','zd822','571','66','4375','73','77','0','7003.8','-4522.32','450.519','3.23161','4599:0 4601:0 '),\n('4601','zd823','571','66','4375','73','77','0','6879.7','-4603.96','452.922','4.36494','4600:0 4602:0 4604:0 '),\n('4602','zd824','571','66','4375','73','77','0','6779.05','-4455.52','441.057','2.48784','4601:0 4603:0 '),\n('4603','zd825','571','66','4375','73','77','0','6738.67','-4314.66','450.026','0.835357','4602:0 4596:0 4595:0 '),\n('4604','zd826','571','66','4375','73','77','0','6817.32','-4743.11','450.661','4.44034','4601:0 4605:0 '),\n('4605','zd827','571','66','66','73','77','0','6680.31','-4847.44','452.584','2.08415','4604:0 4590:0 4606:0 '),\n('4606','zd828','571','66','4375','73','77','0','6841.86','-4987.38','451.036','5.56582','4605:0 '),\n('4607','cs829','571','2817','4557','74','78','0','5438.42','-1075.94','181.63','1.64666','4465:0 4608:0 4611:0 4613:0 '),\n('4608','cs830','571','2817','4554','74','78','0','5414.79','-913.179','165.857','1.65453','4607:0 4609:0 '),\n('4609','cs831','571','2817','4557','74','78','0','5529.65','-840.32','161.565','0.178767','4608:0 4610:0 4612:0 4624:0 '),\n('4610','cs832','571','2817','4557','74','78','0','5646.92','-907.293','186.362','5.31056','4609:0 4611:0 '),\n('4611','cs833','571','2817','4557','74','78','0','5531.5','-987.127','191.383','0.576966','4607:0 4610:0 '),\n('4612','cs834','571','2817','4558','74','78','5','5605.93','-749.995','199.49','1.05213','4609:0 '),\n('4613','cs835','571','2817','4554','74','78','0','5331.06','-914.795','170.103','1.60977','4607:0 4614:0 '),\n('4614','cs836','571','2817','4554','74','78','0','5307.84','-750.937','162.904','2.08886','4613:0 4615:0 '),\n('4615','cs837','571','2817','4557','74','78','0','5179.88','-711.115','164.986','1.15816','4614:0 4616:0 4618:0 '),\n('4616','cs838','571','2817','2817','74','78','2','5082.9','-704.384','186.517','6.16508','4615:0 4617:0 '),\n('4617','cs839','571','2817','4559','74','78','3','5062.59','-611.621','218.683','5.43466','4616:0 '),\n('4618','cs840','571','2817','4557','74','78','0','5185.33','-555.375','158.496','1.08748','4615:0 4619:0 '),\n('4619','cs841','571','2817','4557','74','78','0','5212.12','-335.385','163.451','1.20529','4618:0 4620:0 '),\n('4620','cs842','571','2817','4557','74','78','0','5329.19','-218.838','166.128','0.232181','4619:0 4621:0 4629:0 '),\n('4621','cs843','571','2817','4557','74','78','0','5520.69','-188.647','157.616','0.0751006','4620:0 4622:0 4629:0 '),\n('4622','cs844','571','2817','4557','74','78','0','5672.16','-264.918','167.932','5.74096','4621:0 4623:0 4625:0 4720:0 '),\n('4623','cs845','571','2817','4557','74','78','0','5583.23','-439.368','154.644','4.20158','4622:0 4624:0 '),\n('4624','cs846','571','2817','4554','74','78','0','5498.08','-612.708','152.463','4.75686','4623:0 4609:0 '),\n('4625','cs847','571','2817','4553','74','78','0','5679.51','-108.805','178.045','1.46212','4622:0 4626:0 4855:0 '),\n('4626','cs848','571','2817','4553','74','78','0','5720.75','54.3693','171.054','1.38122','4625:0 4627:0 4628:0 4643:0 '),\n('4627','cs849','571','2817','4553','74','78','0','5765.22','181.998','182.874','0.613098','4626:0 '),\n('4628','cs850','571','2817','4553','74','78','0','5544.73','121.881','150.263','4.18823','4626:0 4629:0 '),\n('4629','cs851','571','2817','4553','74','78','0','5414.2','-47.7746','149.795','3.91334','4628:0 4621:0 4620:0 4630:0 '),\n('4630','cs852','571','2817','2817','74','78','0','5354.31','126.368','161.642','2.27029','4629:0 4631:0 4632:0 '),\n('4631','cs853','571','2817','2817','74','78','0','5257.75','154.168','191.769','2.73995','4630:0 4147:0 '),\n('4632','cs854','571','2817','2817','74','78','0','5423.58','292.611','156.85','1.48646','4630:0 4633:0 '),\n('4633','cs855','571','2817','2817','74','78','0','5436.65','406.464','167.948','1.52965','4632:0 4634:0 4642:0 '),\n('4634','cs856','571','2817','4555','74','78','0','5332.71','578.052','182.7','1.3333','4633:0 4635:0 '),\n('4635','cs857','571','2817','4555','74','78','0','5471.03','710.798','171.741','0.739547','4634:0 4636:0 '),\n('4636','cs858','571','2817','2817','74','78','0','5519.14','908.014','167.988','1.35608','4635:0 4637:0 4638:0 '),\n('4637','cs859','571','2817','4556','74','78','1','5706.15','1006.05','174.48','3.67458','4636:0 '),\n('4638','cs860','571','2817','2817','74','78','0','5682.36','825.06','156.036','5.32233','4636:0 4639:0 '),\n('4639','cs861','571','2817','2817','74','78','0','5849.61','885.831','160.066','0.393957','4638:0 4640:0 '),\n('4640','cs862','571','2817','4553','74','78','0','5854.17','706.025','164.715','4.73956','4639:0 4641:0 '),\n('4641','cs863','571','2817','4553','74','78','0','5740.73','555.099','158.091','4.03271','4640:0 4642:0 '),\n('4642','cs864','571','2817','4553','74','78','0','5615.21','410.65','156.222','3.51042','4641:0 4633:0 4643:0 '),\n('4643','cs865','571','2817','4553','74','78','0','5676.64','245.015','166.802','4.93592','4642:0 4626:0 '),\n('4644','sb866','571','3711','4483','74','78','0','4671.5','5526.35','34.4275','0.54946','3903:0 4645:0 '),\n('4645','sb867','571','3711','3711','74','78','0','4892.01','5531.93','-71.5606','0.0389507','4644:0 4646:0 4674:0 '),\n('4646','sb868','571','3711','4289','74','78','0','4952.39','5739.79','-75.5644','1.2249','4645:0 4647:0 '),\n('4647','sb869','571','3711','4289','74','78','0','5130.17','5883.3','-75.7286','0.492126','4646:0 4648:0 '),\n('4648','sb870','571','3711','4289','74','78','0','5325.13','5886.98','-68.7967','0.00281286','4647:0 4649:0 4675:0 '),\n('4649','sb871','571','3711','4285','74','78','0','5507.19','5934.35','-51.6289','6.11243','4648:0 4650:0 '),\n('4650','sb872','571','3711','3711','74','78','0','5713','5871.42','-60.4173','5.97499','4649:0 4651:0 4714:0 '),\n('4651','sb873','571','3711','4289','74','78','0','5882.95','5730.44','-63.8448','5.56737','4650:0 4652:0 '),\n('4652','sb874','571','3711','4289','74','78','0','6018.42','5571.93','-74.0181','5.18095','4651:0 4653:0 4703:0 '),\n('4653','sb875','571','3711','4385','74','78','0','6082.5','5353.27','-92.7974','4.70422','4652:0 4654:0 4702:0 '),\n('4654','sb876','571','3711','3711','74','78','0','6268.69','5300.48','-100.197','0.380579','4653:0 4655:0 '),\n('4655','sb877','571','3711','3711','74','78','0','6450.25','5197.28','-64.1861','5.49824','4654:0 4656:0 '),\n('4656','sb878','571','3711','4376','74','78','0','6507.21','4992.87','-60.1724','4.97202','4655:0 4657:0 4696:0 '),\n('4657','sb879','571','3711','3711','74','78','0','6524.26','4794.34','-58.974','4.36726','4656:0 4658:0 '),\n('4658','sb880','571','3711','4368','74','78','0','6443.53','4602.81','-66.2857','4.55104','4657:0 4659:0 4695:0 4697:0 '),\n('4659','sb881','571','3711','4368','74','78','0','6405.01','4366.1','-47.8041','3.90309','4658:0 4660:0 4694:0 4695:0 '),\n('4660','sb882','571','3711','3711','74','78','0','6226.59','4265.96','-45.1729','3.55594','4659:0 4661:0 4694:0 '),\n('4661','sb883','571','3711','4283','74','78','0','6111.71','4134.4','-48.7024','4.20861','4660:0 4662:0 '),\n('4662','sb884','571','3711','4283','74','78','0','6038.48','4009.63','-42.6825','4.13556','4661:0 4663:0 '),\n('4663','sb885','571','3711','4283','74','78','0','5938.28','3889.47','-35.5353','3.47426','4662:0 4664:0 4692:0 '),\n('4664','sb886','571','3711','4283','74','78','0','5785.88','3776.91','-41.0442','3.94','4663:0 4665:0 4692:0 4693:0 '),\n('4665','sb887','571','3711','3711','74','78','0','5624.29','3606.52','-21.7442','3.13811','4664:0 4666:0 4693:0 '),\n('4666','sb888','571','3711','4283','74','78','0','5488.8','3794.13','-58.7714','2.25061','4665:0 4667:0 '),\n('4667','sb889','571','3711','4387','74','78','0','5337.73','3917.13','-70.8363','2.57655','4666:0 4668:0 4688:0 4689:0 '),\n('4668','sb890','571','3711','3711','74','78','0','5220.59','4104.15','-78.9241','2.09588','4667:0 4669:0 4687:0 '),\n('4669','sb891','571','3711','3711','74','78','0','5146.69','4294.33','-99.9765','1.80057','4668:0 4670:0 4686:0 '),\n('4670','sb892','571','3711','3711','74','78','1','5110.31','4494.04','-98.6996','1.66941','4669:0 4671:0 '),\n('4671','sb893','571','3711','3711','74','78','0','5098.19','4704.21','-133.607','2.04248','4670:0 4672:0 4681:0 '),\n('4672','sb894','571','3711','3711','74','78','0','4975.85','4879.83','-101.866','1.73853','4671:0 4673:0 4682:0 '),\n('4673','sb895','571','3711','3711','74','78','0','4881.56','5059.86','-91.1009','1.00104','4672:0 4674:0 '),\n('4674','sb896','571','3711','3711','74','78','0','4917.13','5259.43','-92.7846','1.6058','4673:0 4645:0 4718:0 '),\n('4675','sb897','571','3711','3711','74','78','0','5325.03','5694.77','-87.1296','4.35079','4648:0 4676:0 '),\n('4676','sb898','571','3711','4288','74','78','0','5283.58','5529.21','-98.5324','4.62568','4675:0 4677:0 '),\n('4677','sb899','571','3711','3711','74','78','0','5296.26','5368.21','-119.485','5.45035','4676:0 4678:0 4715:0 '),\n('4678','sb900','571','3711','4293','74','78','0','5334.1','5156.57','-135.744','4.8503','4677:0 4679:0 '),\n('4679','sb901','571','3711','4293','74','78','0','5316.24','4983.73','-135.985','4.21805','4678:0 4680:0 4719:0 '),\n('4680','sb902','571','3711','4293','74','78','0','5263.3','4836.68','-132.956','4.22984','4679:0 4681:0 '),\n('4681','sb903','571','3711','4293','74','78','0','5171.92','4761.28','-134.094','3.64315','4680:0 4671:0 '),\n('4682','sb904','571','3711','3711','74','78','0','4906.61','4752.07','-80.9517','3.99658','4672:0 4683:0 '),\n('4683','sb905','571','3711','4388','74','78','0','4784.59','4651.45','-67.3646','4.27774','4682:0 4684:0 '),\n('4684','sb906','571','3711','4388','74','78','0','4776.89','4461.82','-65.79','0.115909','4683:0 4685:0 '),\n('4685','sb907','571','3711','3711','74','78','0','4858.79','4312.13','-51.668','4.56127','4684:0 4686:0 '),\n('4686','sb908','571','3711','4304','74','78','0','5008.15','4265.85','-85.0377','2.88757','4685:0 4669:0 '),\n('4687','sb909','571','3711','4303','74','78','0','5141.4','4002.05','-61.6423','4.65002','4668:0 4688:0 '),\n('4688','sb910','571','3711','3711','74','78','0','5236.32','3820.55','-29.2583','0.629582','4687:0 4667:0 '),\n('4689','sb911','571','3711','4283','74','78','0','5426.13','4100.88','-86.7674','1.1935','4667:0 4690:0 '),\n('4690','sb912','571','3711','4283','74','78','0','5555.95','4256','-102.563','0.234915','4689:0 4691:0 4710:0 '),\n('4691','sb913','571','3711','4283','74','78','0','5713.23','4134.64','-89.7735','5.05333','4690:0 4692:0 '),\n('4692','sb914','571','3711','4283','74','78','0','5757.78','3962.65','-74.4666','5.33842','4691:0 4663:0 4664:0 '),\n('4693','sb915','571','3711','4297','74','78','0','5782.35','3632.67','-13.2643','3.22964','4664:0 4665:0 '),\n('4694','sb916','571','3711','3711','74','78','0','6360.37','4223.67','-44.0521','1.79237','4659:0 4660:0 '),\n('4695','sb917','571','3711','4368','74','78','0','6543.56','4456.6','-47.1567','2.3712','4659:0 4658:0 '),\n('4696','sb918','571','3711','4376','74','78','0','6354.19','4873.76','-84.2341','5.19234','4656:0 4697:0 '),\n('4697','sb919','571','3711','3711','74','78','0','6357.09','4685.34','-78.5111','5.19313','4696:0 4658:0 4698:0 '),\n('4698','sb920','571','3711','3711','74','78','0','6208.52','4590.1','-92.1573','3.70988','4697:0 4699:0 '),\n('4699','sb921','571','3711','3711','74','78','0','6025.9','4686.81','-95.5438','1.9176','4698:0 4700:0 '),\n('4700','sb922','571','3711','3711','74','78','0','5994.9','4894.76','-99.8287','1.31128','4699:0 4701:0 '),\n('4701','sb923','571','3711','4385','74','78','0','5981.34','5089.26','-100.986','1.44401','4700:0 4702:0 '),\n('4702','sb924','571','3711','4391','74','78','0','5939.08','5277.6','-99.1834','0.521168','4701:0 4653:0 4703:0 4704:0 '),\n('4703','sb925','571','3711','4391','74','78','0','5903.46','5420.52','-94.3184','1.13064','4702:0 4652:0 '),\n('4704','sb926','571','3711','4293','74','78','0','5830.14','5100.16','-132.628','3.78921','4702:0 4705:0 '),\n('4705','sb927','571','3711','4293','74','78','0','5680.53','5002.31','-134.988','3.89916','4704:0 4706:0 '),\n('4706','sb928','571','3711','4293','74','78','0','5699.45','4825.48','-137.014','5.40319','4705:0 4707:0 '),\n('4707','sb929','571','3711','4293','74','78','0','5769.89','4694.83','-130.521','4.6445','4706:0 4708:0 '),\n('4708','sb930','571','3711','4293','74','78','0','5768.78','4519.94','-133.978','4.9029','4707:0 4709:0 '),\n('4709','sb931','571','3711','4293','74','78','0','5638.21','4442.49','-138.205','3.53632','4708:0 4710:0 4711:0 '),\n('4710','sb932','571','3711','4293','74','78','0','5520.96','4384.34','-134.132','5.02072','4709:0 4690:0 '),\n('4711','sb933','571','3711','4293','74','78','1','5647.9','4579.12','-137.584','3.59247','4709:0 4712:0 '),\n('4712','sb934','571','3711','4293','74','78','0','5559.82','4670.56','-135.523','1.45736','4711:0 4713:0 '),\n('4713','sb935','571','3711','4383','74','78','5','5497.21','4748.71','-193.716','5.27047','4712:0 '),\n('4714','sb936','571','3711','4284','74','78','1','5575.69','5751.97','-74.7038','0.766207','4650:0 4717:0 '),\n('4715','sb937','571','3711','4285','74','78','0','5456.52','5353.98','-134.279','6.15248','4677:0 4716:0 '),\n('4716','sb938','571','3711','3711','74','78','0','5648.23','5302.27','-121.201','1.53199','4715:0 4717:0 '),\n('4717','sb939','571','3711','3711','74','78','0','5580.86','5590.13','-92.6294','1.61445','4716:0 4714:0 '),\n('4718','sb940','571','3711','3711','74','78','0','5041.36','5069.92','-110.999','5.98282','4674:0 4719:0 '),\n('4719','sb941','571','3711','4293','74','78','0','5202.57','5018.06','-134.206','5.92392','4718:0 4679:0 '),\n('4720','sp942','571','67','67','76','80','0','5752.46','-354.53','205.676','5.2249','4622:0 4721:0 '),\n('4721','sp943','571','67','4419','76','80','0','5903.83','-485.757','296.6','6.0849','4720:0 4722:0 '),\n('4722','sp944','571','67','4419','76','80','0','6079.55','-564.659','370.689','5.9286','4721:0 4723:0 4735:0 4736:0 '),\n('4723','sp945','571','67','4419','76','80','0','6182.6','-758.333','400.203','4.95','4722:0 4724:0 4734:0 '),\n('4724','sp946','571','67','4419','76','80','0','6143.85','-967.832','398.945','4.41828','4723:0 4725:0 4726:0 '),\n('4725','sp947','571','67','4418','76','80','1','6122.51','-1083.62','402.604','1.60263','4724:0 '),\n('4726','sp948','571','67','4419','76','80','0','6273.81','-1034.37','412.299','5.98122','4724:0 4727:0 4737:0 '),\n('4727','sp949','571','67','4462','76','80','0','6444.88','-1034.29','429.644','6.27654','4726:0 4728:0 '),\n('4728','sp950','571','67','4462','76','80','0','6611.36','-1016.67','427.636','0.199126','4727:0 4729:0 4730:0 '),\n('4729','sp951','571','67','4462','76','80','0','6639.97','-1111.4','427.1','3.18364','4728:0 '),\n('4730','sp952','571','67','4462','76','80','0','6673.93','-1219.13','398.841','5.0403','4728:0 4731:0 4732:0 '),\n('4731','sp953','571','67','4462','76','80','0','6592.21','-1275.82','392.991','5.05994','4730:0 '),\n('4732','sp954','571','67','4462','76','80','0','6697.35','-1426.2','388.747','4.94449','4730:0 4733:0 '),\n('4733','sp955','571','67','4462','76','80','0','6795.01','-1512.06','359.911','5.79979','4732:0 '),\n('4734','sp956','571','67','4419','76','80','0','6324.13','-838.805','407.569','0.335772','4723:0 '),\n('4735','sp957','571','67','4419','76','80','0','6232.08','-626.646','414.707','2.81842','4722:0 '),\n('4736','sp958','571','67','4419','76','80','0','6146.68','-346.08','436.33','4.09626','4722:0 '),\n('4737','sp959','571','67','4419','76','80','0','6257','-1198.57','428.281','5.0293','4726:0 4738:0 4739:0 '),\n('4738','sp960','571','67','4460','76','80','0','6297.61','-1350.75','426.332','4.79525','4737:0 4745:0 '),\n('4739','sp961','571','67','4460','76','80','0','6393.21','-1222.32','429.226','4.92092','4737:0 4740:0 '),\n('4740','sp962','571','67','4419','76','80','0','6471.87','-1383.27','479.473','4.04521','4739:0 4741:0 '),\n('4741','sp963','571','67','4421','76','80','0','6345.12','-1517.97','434.126','3.78838','4740:0 4742:0 '),\n('4742','sp964','571','67','4421','76','80','0','6349.58','-1586.52','428.04','5.62228','4741:0 4743:0 4745:0 '),\n('4743','sp965','571','67','4421','76','80','0','6455.08','-1685.64','435.366','5.95606','4742:0 4744:0 '),\n('4744','sp966','571','67','4421','76','80','0','6462.41','-1739.78','484.912','2.47281','4743:0 '),\n('4745','sp967','571','67','4421','76','80','0','6232.83','-1499.78','419.118','0.960144','4742:0 4738:0 '),\n('4746','sp968','571','67','4484','76','80','1','8455.31','-325.265','906.979','2.46809','4747:0 '),\n('4747','sp969','571','67','4484','76','80','0','8485.73','-279.992','850.711','1.97722','4746:0 4748:0 '),\n('4748','sp970','571','67','4436','76','80','0','8483.73','-136.842','797.392','1.57038','4747:0 4749:0 4752:0 '),\n('4749','sp971','571','67','4436','76','80','0','8481.05','57.8398','786.425','1.56174','4748:0 4750:0 '),\n('4750','sp972','571','67','4436','76','80','0','8468.58','226.668','788.805','1.98979','4749:0 4751:0 '),\n('4751','sp973','571','67','4436','76','80','0','8317.77','105.355','824.229','4.03339','4750:0 4752:0 '),\n('4752','sp974','571','67','4436','76','80','0','8313.08','-91.3043','827.379','4.66407','4751:0 4748:0 4753:0 4765:0 '),\n('4753','sp975','571','67','4435','76','80','0','8202.06','-202.29','871.634','4.01769','4752:0 4754:0 4756:0 '),\n('4754','sp976','571','67','4435','76','80','0','8237.33','-247.278','952.88','3.24408','4753:0 4755:0 '),\n('4755','sp977','571','67','4435','76','80','0','8092.31','-403.116','964.773','0.843118','4754:0 '),\n('4756','sp978','571','67','4435','76','80','0','8040.6','-222.79','846.911','3.84806','4753:0 4757:0 '),\n('4757','sp979','571','67','4435','76','80','0','7945.56','-368.7','884.037','5.26884','4756:0 4758:0 4759:0 4761:0 '),\n('4758','sp980','571','67','4435','76','80','0','7953.58','-524.527','913.45','5.63719','4757:0 4783:0 '),\n('4759','sp981','571','67','4435','76','80','0','8056.94','-415.927','981.568','4.73712','4757:0 4760:0 '),\n('4760','sp982','571','67','4435','76','80','0','8116.43','-385.365','981.611','0.510895','4759:0 '),\n('4761','sp983','571','67','4436','76','80','0','7847.85','-252.132','885.258','1.43374','4757:0 4762:0 4770:0 '),\n('4762','sp984','571','67','4436','76','80','0','7851.3','-120.4','880.754','2.3126','4761:0 4763:0 '),\n('4763','sp985','571','67','4486','76','80','0','7796.32','-44.5017','882.083','4.37664','4762:0 4764:0 '),\n('4764','sp986','571','67','4486','76','80','0','7737.47','-4.97132','866.565','4.27297','4763:0 '),\n('4765','sp987','571','67','4434','76','80','0','8078.57','-32.5271','869.499','2.49247','4752:0 4766:0 '),\n('4766','sp988','571','67','4434','76','80','0','8168.23','99.4058','898.859','1.3183','4765:0 4767:0 '),\n('4767','sp989','571','67','4434','76','80','0','7974.07','-6.90656','961.657','1.27039','4766:0 4768:0 '),\n('4768','sp990','571','67','4434','76','80','0','7950.02','93.3063','1028.03','0.358544','4767:0 4769:0 '),\n('4769','sp991','571','67','4434','76','80','0','7756.08','70.5513','1009.34','2.07228','4768:0 '),\n('4770','sp992','571','67','4436','76','80','0','7731.17','-155.37','873.081','2.5828','4761:0 4771:0 '),\n('4771','sp993','571','67','67','76','80','0','7531.71','-82.1077','837.076','3.3682','4770:0 4772:0 '),\n('4772','sp994','571','67','4424','76','80','0','7365.61','-62.5754','778.928','3.05011','4771:0 4773:0 4777:0 '),\n('4773','sp995','571','67','4424','76','80','0','7426.39','97.7694','770.976','6.19485','4772:0 4774:0 '),\n('4774','sp996','571','67','4499','76','80','0','7491.52','288.222','774.525','2.91503','4773:0 4775:0 '),\n('4775','sp997','571','67','4424','76','80','0','7352.12','248.002','774.191','5.46442','4774:0 4776:0 '),\n('4776','sp998','571','67','4424','76','80','0','7358.47','144.777','783.476','4.25726','4775:0 4777:0 '),\n('4777','sp999','571','67','4424','76','80','0','7260.89','6.23937','773.777','4.18657','4776:0 4772:0 4778:0 '),\n('4778','sp1000','571','67','4424','76','80','0','7178.24','-109.916','772.616','4.20384','4777:0 4779:0 4782:0 '),\n('4779','sp1001','571','67','4452','76','80','0','7066.53','-147.905','785.381','3.57396','4778:0 4780:0 '),\n('4780','sp1002','571','67','4453','76','80','0','6959.39','-173.873','763.88','2.97313','4779:0 4781:0 '),\n('4781','sp1003','571','67','4453','76','80','0','6782.97','-67.7557','738.941','2.11233','4780:0 '),\n('4782','sp1004','571','67','4452','76','80','0','7090.4','-308.701','774.099','4.51251','4778:0 '),\n('4783','sp1005','571','67','67','76','80','0','8123.18','-622.333','945.418','5.51782','4758:0 4784:0 '),\n('4784','sp1006','571','67','4446','76','80','0','8249.28','-737.261','923.975','5.57986','4783:0 4785:0 '),\n('4785','sp1007','571','67','4446','76','80','0','8264.89','-900.437','923.875','2.77599','4784:0 4786:0 4788:0 '),\n('4786','sp1008','571','67','4485','76','80','0','8140.52','-817.38','956.118','4.95861','4785:0 4787:0 '),\n('4787','sp1009','571','67','4485','76','80','0','8148.76','-940.656','956.955','0.816413','4786:0 '),\n('4788','sp1010','571','67','4446','76','80','0','8178.94','-1015.84','926.187','5.46676','4785:0 4789:0 '),\n('4789','sp1011','571','67','4446','76','80','0','8330.55','-1186.57','924.477','5.49032','4788:0 '),\n('4790','sp1012','571','67','4441','76','80','4','7798.27','-2842.24','1219.51','2.4704','4791:0 4792:0 '),\n('4791','sp1013','571','67','4441','76','80','5','7804.98','-2945.31','1256.79','1.43524','4790:0 '),\n('4792','sp1014','571','67','4441','76','80','0','7866.14','-2800.43','1136.14','2.6746','4790:0 4793:0 4808:0 '),\n('4793','sp1015','571','67','4444','76','80','0','7974.26','-2941.67','1137.82','0.286989','4792:0 4794:0 '),\n('4794','sp1016','571','67','4444','76','80','0','8053.32','-2899.02','1136.35','5.48632','4793:0 4795:0 4799:0 '),\n('4795','sp1017','571','67','67','76','80','0','8303.1','-2938.59','1067.71','2.65574','4794:0 4796:0 '),\n('4796','sp1018','571','67','4488','76','80','0','8126.19','-2813.7','1044.76','1.21375','4795:0 4797:0 4798:0 '),\n('4797','sp1019','571','67','4488','76','80','0','8235.54','-2730.69','1035.47','6.08244','4796:0 4798:0 '),\n('4798','sp1020','571','67','4488','76','80','0','8268.8','-2840.55','1051.57','2.98168','4797:0 4796:0 '),\n('4799','sp1021','571','67','4444','76','80','0','8178.4','-2765.96','1137.8','1.58369','4794:0 4800:0 '),\n('4800','sp1022','571','67','4444','76','80','0','8192.81','-2569.46','1145.92','1.28524','4799:0 4801:0 4807:0 '),\n('4801','sp1023','571','67','4446','76','80','0','8213.34','-2399.15','1136.06','1.39441','4800:0 4802:0 '),\n('4802','sp1024','571','67','4446','76','80','0','8146.87','-2304.3','1157.9','3.14664','4801:0 4803:0 4804:0 '),\n('4803','sp1025','571','67','4446','76','80','0','8041.79','-2401.8','1157.91','1.83659','4802:0 4804:0 4805:0 '),\n('4804','sp1026','571','67','4446','76','80','0','7981.22','-2241.64','1157.87','2.17589','4803:0 4802:0 '),\n('4805','sp1027','571','67','4446','76','80','0','7920.25','-2449.09','1137.97','1.81145','4803:0 4806:0 4809:0 '),\n('4806','sp1028','571','67','4444','76','80','0','7924.11','-2571.76','1159.29','2.58976','4805:0 4807:0 '),\n('4807','sp1029','571','67','4444','76','80','0','8046.59','-2635.79','1135.01','6.18452','4806:0 4800:0 4808:0 '),\n('4808','sp1030','571','67','4463','76','80','0','7915.54','-2719.76','1135.12','3.80869','4807:0 4792:0 '),\n('4809','sp1031','571','67','4446','76','80','0','7902.91','-2332.91','1153.05','3.63118','4805:0 4810:0 '),\n('4810','sp1032','571','67','4442','76','80','0','7759.44','-2386.38','1077.61','2.84264','4809:0 4811:0 '),\n('4811','sp1033','571','67','4442','76','80','0','7670.97','-2282.57','1010.94','2.45387','4810:0 4812:0 '),\n('4812','sp1034','571','67','4442','76','80','0','7541.71','-2363.06','867.728','2.12164','4811:0 4813:0 '),\n('4813','sp1035','571','67','4442','76','80','0','7465.67','-2485.65','760.441','0.00970542','4812:0 4814:0 4827:0 '),\n('4814','sp1036','571','67','4438','76','80','0','7327.84','-2537.89','748.903','4.00974','4813:0 4815:0 4827:0 '),\n('4815','sp1037','571','67','4438','76','80','0','7348.8','-2768.24','766.138','4.91922','4814:0 4816:0 '),\n('4816','sp1038','571','67','4438','76','80','0','7348.82','-2958.97','838.738','4.70872','4815:0 4817:0 4826:0 '),\n('4817','sp1039','571','67','4439','76','80','0','7229.61','-3136.68','837.486','4.08826','4816:0 4818:0 4826:0 '),\n('4818','sp1040','571','67','4495','76','80','0','7202.51','-3334.74','843.826','4.6883','4817:0 4819:0 '),\n('4819','sp1041','571','67','4439','76','80','0','7368.35','-3244.03','851.789','5.98892','4818:0 4820:0 '),\n('4820','sp1042','571','67','4439','76','80','0','7555.15','-3237.78','842.017','0.160478','4819:0 4821:0 '),\n('4821','sp1043','571','67','4440','76','80','0','7723.64','-3278.88','863.372','5.73209','4820:0 4822:0 '),\n('4822','sp1044','571','67','4440','76','80','0','7843.39','-3412.02','865.974','6.25831','4821:0 4823:0 '),\n('4823','sp1045','571','67','4440','76','80','0','8007.01','-3282.63','865.574','2.51589','4822:0 4824:0 '),\n('4824','sp1046','571','67','4440','76','80','0','7854.16','-3160.4','864.749','3.02718','4823:0 4825:0 '),\n('4825','sp1047','571','67','4440','76','80','0','7635.61','-3117.6','867.091','3.3971','4824:0 4826:0 '),\n('4826','sp1048','571','67','4439','76','80','0','7437.01','-3083.87','837.452','2.68239','4825:0 4816:0 4817:0 '),\n('4827','sp1049','571','67','4437','76','80','0','7293.97','-2399.5','753.5','6.25517','4814:0 4813:0 4828:0 '),\n('4828','sp1050','571','67','4437','76','80','0','7210.78','-2258.23','756.519','2.1766','4827:0 4829:0 '),\n('4829','sp1051','571','67','4437','76','80','0','7094.38','-2114.84','759.283','2.32896','4828:0 4830:0 '),\n('4830','sp1052','571','67','4437','76','80','0','7071.57','-1957.32','769.29','1.71086','4829:0 4831:0 '),\n('4831','sp1053','571','67','4422','76','80','0','7047.94','-1819.05','822.822','1.51843','4830:0 4832:0 '),\n('4832','sp1054','571','67','4422','76','80','0','7016.16','-1682.12','819.647','1.56948','4831:0 4833:0 4834:0 4841:0 '),\n('4833','sp1055','571','67','4422','76','80','0','6952.92','-1523.53','837.796','1.58755','4832:0 4834:0 4835:0 '),\n('4834','sp1056','571','67','4422','76','80','0','6876.88','-1688.13','820.475','5.87424','4833:0 4832:0 '),\n('4835','sp1057','571','67','4425','76','80','0','6933.96','-1355.59','831.143','1.62444','4833:0 4836:0 '),\n('4836','sp1058','571','67','4425','76','80','0','6927.88','-1275.08','819.873','1.80979','4835:0 4837:0 '),\n('4837','sp1059','571','67','4423','76','80','0','6891.54','-1120.83','801.801','2.04934','4836:0 4838:0 4840:0 '),\n('4838','sp1060','571','67','4423','76','80','0','6874.8','-994.702','800.05','1.94645','4837:0 4839:0 '),\n('4839','sp1061','571','67','4423','76','80','0','6713.98','-1032.73','766.307','5.25848','4838:0 4840:0 '),\n('4840','sp1062','571','67','4423','76','80','0','6823.44','-1136.74','794.362','1.42024','4839:0 4837:0 '),\n('4841','sp1063','571','67','4422','76','80','0','7059.17','-1565.01','830.127','1.02674','4832:0 4842:0 '),\n('4842','sp1064','571','67','4432','76','80','1','7107.06','-1444.92','924.841','0.0175042','4841:0 4843:0 4854:0 '),\n('4843','sp1065','571','67','4432','76','80','0','7224.43','-1369.92','917.332','1.04952','4842:0 4844:0 '),\n('4844','sp1066','571','67','4432','76','80','0','7304.81','-1229.95','912.257','1.04952','4843:0 4845:0 '),\n('4845','sp1067','571','67','4473','76','80','0','7277.74','-1094.09','938.898','4.08901','4844:0 4846:0 4847:0 '),\n('4846','sp1068','571','67','4473','76','80','0','7159.16','-1203.13','929.255','3.39314','4845:0 '),\n('4847','sp1069','571','67','4432','76','80','0','7276.68','-952.788','919.235','1.31654','4845:0 4848:0 '),\n('4848','sp1070','571','67','4432','76','80','0','7442.11','-871.692','910.159','0.46203','4847:0 4849:0 '),\n('4849','sp1071','571','67','4432','76','80','0','7617.15','-899.183','911.902','5.67158','4848:0 4850:0 '),\n('4850','sp1072','571','67','4432','76','80','0','7731.32','-1040.44','920.428','5.0087','4849:0 4851:0 '),\n('4851','sp1073','571','67','4432','76','80','0','7620.47','-1211.71','928.587','4.24765','4850:0 4852:0 '),\n('4852','sp1074','571','67','4432','76','80','0','7523.4','-1365.25','935.317','3.55807','4851:0 4853:0 '),\n('4853','sp1075','571','67','4432','76','80','0','7392.6','-1463.43','928.011','4.00967','4852:0 4854:0 '),\n('4854','sp1076','571','67','4536','76','80','0','7307.54','-1573.81','942.399','2.34934','4853:0 4842:0 '),\n('4855','cs1077','571','2817','2817','76','80','0','5850.58','-134.972','227.342','6.13811','4625:0 4856:0 '),\n('4856','ic1078','571','210','4501','77','80','0','5971.83','-162.754','303.817','0.106256','4855:0 4857:0 '),\n('4857','ic1079','571','210','4501','77','80','1','6141.12','-52.066','381.591','0.738502','4856:0 4858:0 '),\n('4858','ic1080','571','210','4501','77','80','0','6194.51','34.1853','380.232','0.656035','4857:0 4859:0 4861:0 '),\n('4859','ic1081','571','210','4504','77','80','0','6172.36','156.629','374.276','0.907363','4858:0 4860:0 '),\n('4860','ic1082','571','210','4504','77','80','0','6379.33','179.484','392.956','0.48639','4859:0 4861:0 4862:0 '),\n('4861','ic1083','571','210','4501','77','80','0','6302.14','95.8391','390.823','3.94214','4860:0 4858:0 '),\n('4862','ic1084','571','210','4505','77','80','0','6510.94','285.541','400.181','0.224064','4860:0 4863:0 '),\n('4863','ic1085','571','210','4505','77','80','0','6561.12','378.976','420.028','1.01575','4862:0 4864:0 4865:0 '),\n('4864','ic1086','571','210','4506','77','80','0','6586.56','556.561','402.946','1.2011','4863:0 4865:0 4866:0 '),\n('4865','ic1087','571','210','4506','77','80','0','6708.22','403.424','412.114','3.63504','4864:0 4863:0 4870:0 '),\n('4866','ic1088','571','210','4506','77','80','0','6723.06','690.867','407.835','0.367783','4864:0 4867:0 4897:0 '),\n('4867','ic1089','571','210','4506','77','80','0','6907.33','730.085','420.328','0.313591','4866:0 4868:0 4892:0 '),\n('4868','ic1090','571','210','4506','77','80','0','6968.03','622.605','462.269','4.11884','4867:0 4869:0 4871:0 '),\n('4869','ic1091','571','210','4506','77','80','0','6892.8','465.906','471.697','4.29869','4868:0 '),\n('4870','ic1092','571','210','4506','77','80','0','6802.58','551.703','425.103','0.960751','4865:0 '),\n('4871','ic1093','571','210','4506','77','80','0','7175.08','588.447','498.301','5.6747','4868:0 4872:0 4873:0 '),\n('4872','ic1094','571','210','4506','77','80','0','7078.72','503.754','527.049','0.380329','4871:0 '),\n('4873','ic1095','571','210','4593','77','80','0','7262.77','707.458','487.068','0.969396','4871:0 4874:0 '),\n('4874','ic1096','571','210','210','77','80','0','7380.79','847.639','456.611','1.04794','4873:0 4875:0 '),\n('4875','ic1097','571','210','4533','77','80','0','7556.82','768.81','478.284','6.18915','4874:0 4876:0 4877:0 '),\n('4876','ic1098','571','210','4533','77','80','0','7584.83','947.602','480.255','1.08485','4875:0 4877:0 '),\n('4877','ic1099','571','210','4533','77','80','0','7712.14','808.936','478.443','2.68156','4876:0 4875:0 4878:0 '),\n('4878','ic1100','571','210','4533','77','80','0','7860.07','894.491','452.788','0.0928901','4877:0 4879:0 4888:0 4891:0 '),\n('4879','ic1101','571','210','4533','77','80','0','8034.56','793.581','473.244','0.0151296','4878:0 4880:0 '),\n('4880','ic1102','571','210','4658','77','80','0','8220.62','796.211','504.283','0.00650024','4879:0 4881:0 '),\n('4881','ic1103','571','210','4658','77','80','0','8374.24','796.938','547.919','6.10983','4880:0 4882:0 4887:0 '),\n('4882','ic1104','571','210','4669','77','80','0','8423.03','930.654','544.674','1.16574','4881:0 4883:0 '),\n('4883','ic1105','571','210','4658','77','80','1','8522.2','1039.69','548.104','0.757338','4882:0 4884:0 '),\n('4884','ic1106','571','210','4658','77','80','0','8609.95','905.31','545.094','5.03776','4883:0 4885:0 '),\n('4885','ic1107','571','210','4658','77','80','3','8585.78','716.794','547.469','4.14555','4884:0 4886:0 '),\n('4886','ic1108','571','210','4658','77','80','0','8489.61','581.224','559.708','4.17226','4885:0 4887:0 '),\n('4887','ic1109','571','210','4658','77','80','5','8440.59','706.692','547.293','2.35563','4886:0 4881:0 '),\n('4888','ic1110','571','210','4533','77','80','0','7765.83','995.585','447.266','2.83001','4878:0 4889:0 '),\n('4889','ic1111','571','210','4533','77','80','0','7711.5','1167.13','440.596','0.808391','4888:0 4890:0 '),\n('4890','ic1112','571','210','4533','77','80','0','7859.21','1231.56','441.972','0.590053','4889:0 4891:0 4921:0 '),\n('4891','ic1113','571','210','4533','77','80','0','7895.54','1042.03','450.717','4.64349','4890:0 4878:0 '),\n('4892','ic1114','571','210','4508','77','80','0','6955.49','874.331','402.675','1.29769','4867:0 4893:0 '),\n('4893','ic1115','571','210','4508','77','80','0','7020.59','1065.06','402.857','1.32832','4892:0 4894:0 '),\n('4894','ic1116','571','210','4508','77','80','0','6957.22','1339.68','398.602','1.97863','4893:0 4895:0 '),\n('4895','ic1117','571','210','4508','77','80','0','6833.49','1460.28','390.712','1.81761','4894:0 4896:0 '),\n('4896','ic1118','571','210','210','77','80','0','6826.51','1619.37','389.033','4.69297','4895:0 '),\n('4897','ic1119','571','210','4507','77','80','0','6666.86','830.852','365.983','2.48285','4866:0 4898:0 '),\n('4898','ic1120','571','210','4507','77','80','0','6599.05','917.605','308.63','2.05873','4897:0 4899:0 '),\n('4899','ic1121','571','210','4507','77','80','0','6597.42','1025.81','280.105','1.11625','4898:0 4900:0 4904:0 '),\n('4900','ic1122','571','210','4507','77','80','0','6559.27','1194.84','276.689','2.19853','4899:0 4901:0 '),\n('4901','ic1123','571','210','4507','77','80','0','6688.4','1234.6','276.432','6.14281','4900:0 4902:0 '),\n('4902','ic1124','571','210','4507','77','80','0','6863.13','1227.79','282.996','5.66451','4901:0 4903:0 4905:0 '),\n('4903','ic1125','571','210','4507','77','80','0','6896.72','1042.62','305.673','4.53274','4902:0 4904:0 4905:0 '),\n('4904','ic1126','571','210','4507','77','80','0','6726.14','1037','288.797','3.31459','4903:0 4899:0 '),\n('4905','ic1127','571','210','4508','77','80','0','7001.55','1212.52','307.249','0.331647','4903:0 4902:0 4906:0 4907:0 '),\n('4906','ic1128','571','210','4537','77','80','0','7135.37','1189.66','298.703','5.1862','4905:0 4915:0 '),\n('4907','ic1129','571','210','4508','77','80','0','7048.99','1354.24','304.707','4.93802','4905:0 4908:0 '),\n('4908','ic1130','571','210','4537','77','80','0','7186.05','1411.54','315.97','0.428269','4907:0 4909:0 5003:0 '),\n('4909','ic1131','571','210','4537','77','80','0','7349.91','1448.05','320.323','0.242915','4908:0 4910:0 5003:0 '),\n('4910','ic1132','571','210','4537','77','80','0','7474.88','1490.17','330.932','0.611267','4909:0 4911:0 '),\n('4911','ic1133','571','210','4537','77','80','0','7573.73','1609.11','345.106','1.19325','4910:0 4912:0 4916:0 '),\n('4912','ic1134','571','210','4537','77','80','0','7721.75','1522.15','349.093','5.66688','4911:0 4913:0 4920:0 '),\n('4913','ic1135','571','210','4537','77','80','0','7720.3','1336.02','354.115','4.43774','4912:0 4914:0 4922:0 '),\n('4914','ic1136','571','210','4537','77','80','0','7534.59','1265.76','334.056','2.73578','4913:0 4915:0 '),\n('4915','ic1137','571','210','4537','77','80','0','7314','1220.63','315.76','3.35624','4914:0 4906:0 '),\n('4916','ic1138','571','210','4509','77','80','0','7577.1','1786.78','359.583','1.47521','4911:0 4917:0 '),\n('4917','ic1139','571','210','4509','77','80','0','7669.29','1945.97','367.174','1.15084','4916:0 4918:0 4927:0 '),\n('4918','ic1140','571','210','4509','77','80','0','7873.9','1929.78','365.964','6.20016','4917:0 4919:0 4923:0 '),\n('4919','ic1141','571','210','4509','77','80','0','7887.76','1725.17','368.82','4.09059','4918:0 4920:0 '),\n('4920','ic1142','571','210','4509','77','80','0','7765','1638.88','350.579','4.75974','4919:0 4912:0 '),\n('4921','ic1143','571','210','210','77','80','0','7920.44','1374.41','452.53','1.61423','4890:0 4922:0 '),\n('4922','ic1144','571','210','4537','77','80','0','7822.59','1365.97','388.481','3.40023','4921:0 4913:0 '),\n('4923','ic1145','571','210','4510','77','80','0','7809.24','2060.92','392.033','1.58203','4918:0 4924:0 '),\n('4924','ic1146','571','210','4540','77','80','0','7858.11','2248.57','376.618','1.4603','4923:0 4925:0 '),\n('4925','ic1147','571','210','4540','77','80','0','7823.2','2412.9','388.323','1.80744','4924:0 4926:0 '),\n('4926','ic1148','571','210','4540','77','80','0','7793.72','2597.47','402.105','1.67392','4925:0 4938:0 '),\n('4927','ic1149','571','210','4510','77','80','0','7699.75','2069.29','391.653','1.65822','4917:0 4928:0 '),\n('4928','ic1150','571','210','4540','77','80','0','7652.21','2249.08','368.676','2.35408','4927:0 4929:0 '),\n('4929','ic1151','571','210','4540','77','80','0','7521.07','2342.93','375.359','2.52294','4928:0 4930:0 '),\n('4930','ic1152','571','210','4523','77','80','0','7369.4','2442.13','391.045','2.44441','4929:0 4931:0 4939:0 '),\n('4931','ic1153','571','210','4523','77','80','0','7198.45','2497.03','404.398','2.97341','4930:0 4932:0 4939:0 '),\n('4932','ic1154','571','210','4523','77','80','0','7035.47','2497.06','410.594','3.37789','4931:0 4933:0 '),\n('4933','ic1155','571','210','4523','77','80','0','7014.72','2665.38','400.29','1.87621','4932:0 4934:0 '),\n('4934','ic1156','571','210','4523','77','80','0','7013.48','2866.37','424.885','1.59347','4933:0 4935:0 '),\n('4935','ic1157','571','210','4523','77','80','0','7165.04','2990.37','441.491','6.14878','4934:0 4936:0 '),\n('4936','ic1158','571','210','4523','77','80','0','7332.14','2917.95','423.697','5.78906','4935:0 4937:0 4939:0 4940:0 '),\n('4937','ic1159','571','210','4540','77','80','0','7502.18','2817.76','419.764','5.68225','4936:0 4938:0 4939:0 '),\n('4938','ic1160','571','210','4516','77','80','0','7710.23','2726.49','412.219','5.21495','4937:0 4926:0 5009:0 '),\n('4939','ic1161','571','210','4523','77','80','0','7307.93','2711.18','396.859','4.63376','4937:0 4930:0 4931:0 4936:0 '),\n('4940','ic1162','571','210','210','77','80','0','7358.64','3080.68','476.932','1.77884','4936:0 4941:0 '),\n('4941','ic1163','571','210','210','77','80','0','7199','3207.31','545.531','1.97125','4940:0 4942:0 '),\n('4942','ic1164','571','210','210','77','80','0','7139.56','3362.03','669.633','2.10878','4941:0 4943:0 '),\n('4943','ic1165','571','210','4531','77','80','0','6985.22','3466.47','708.57','2.8337','4942:0 4944:0 4974:0 '),\n('4944','ic1166','571','210','4531','77','80','0','6890.27','3530.05','708.606','5.39253','4943:0 4945:0 '),\n('4945','ic1167','571','210','4531','77','80','0','6830.55','3590.9','740.056','5.22131','4944:0 4946:0 '),\n('4946','ic1168','571','210','4496','77','80','0','6868.76','3731.57','755.294','4.54431','4945:0 4947:0 '),\n('4947','ic1169','571','210','4496','77','80','0','7002.18','3880.5','610.484','1.63677','4946:0 4948:0 4949:0 4951:0 '),\n('4948','ic1170','571','210','4496','77','80','0','6831.56','3987.86','615.968','2.45046','4947:0 4949:0 '),\n('4949','ic1171','571','210','4496','77','80','0','6897.56','3919.65','615.975','4.57026','4948:0 4947:0 4950:0 '),\n('4950','ic1172','571','210','4528','77','80','0','6814.18','3788.63','621.07','1.05954','4949:0 '),\n('4951','ic1173','571','210','4496','77','80','0','7138.52','3955.81','581.785','5.65333','4947:0 4952:0 5020:0 5022:0 '),\n('4952','ic1174','571','210','4498','77','80','0','7284.9','3836.51','604.369','5.59993','4951:0 4953:0 '),\n('4953','ic1175','571','210','4498','77','80','0','7410.57','3732.09','627.678','5.65962','4952:0 4954:0 '),\n('4954','ic1176','571','210','4526','77','80','0','7512.15','3660.34','623.332','6.01697','4953:0 4955:0 4973:0 '),\n('4955','ic1177','571','210','4526','77','80','0','7593.36','3544.42','655.937','5.07214','4954:0 4956:0 '),\n('4956','ic1178','571','210','4526','77','80','0','7671','3432.93','656.192','2.35151','4955:0 4957:0 '),\n('4957','ic1179','571','210','4526','77','80','0','7795.77','3500.91','658.351','0.992774','4956:0 4958:0 4959:0 4971:0 '),\n('4958','ic1180','571','210','4526','77','80','0','7883.18','3469.31','671.838','6.04917','4957:0 '),\n('4959','ic1181','571','210','4526','77','80','0','7919.33','3582.64','631.477','0.58594','4957:0 4960:0 '),\n('4960','ic1182','571','210','4524','77','80','0','8041.43','3526.53','654.716','6.08922','4959:0 4961:0 4968:0 '),\n('4961','ic1183','571','210','4524','77','80','0','8187.82','3610.43','658.019','0.290628','4960:0 4962:0 '),\n('4962','ic1184','571','210','4524','77','80','0','8317.43','3535.48','657.912','4.87265','4961:0 4963:0 '),\n('4963','ic1185','571','210','4524','77','80','0','8248.7','3338.48','654.291','5.09882','4962:0 4964:0 4968:0 '),\n('4964','ic1186','571','210','4496','77','80','0','8311.26','3170.17','618.951','5.16165','4963:0 4965:0 '),\n('4965','ic1187','571','210','4497','77','80','0','8430.96','3102.38','588.141','4.91819','4964:0 4966:0 '),\n('4966','ic1188','571','210','4492','77','80','0','8426.9','2947.18','602.293','4.77996','4965:0 4967:0 '),\n('4967','ic1189','571','210','4492','77','80','0','8429.04','2879.47','606.259','1.76717','4966:0 '),\n('4968','ic1190','571','210','4524','77','80','0','8105.02','3418.73','672.247','3.83984','4960:0 4963:0 4969:0 '),\n('4969','ic1191','571','210','4525','77','80','0','7990.63','3300.15','676.112','3.81628','4968:0 4970:0 '),\n('4970','ic1192','571','210','4525','77','80','0','7944.78','3251.88','632.818','3.79665','4969:0 '),\n('4971','ic1193','571','210','4526','77','80','0','7848.54','3632.5','653.393','4.16107','4957:0 4972:0 '),\n('4972','ic1194','571','210','4526','77','80','0','7717.96','3673.53','653.297','3.444','4971:0 4973:0 '),\n('4973','ic1195','571','210','4526','77','80','0','7617.43','3670.12','634.89','3.02774','4972:0 4954:0 '),\n('4974','ic1196','571','210','4531','77','80','0','6853.09','3478.09','692.779','3.04894','4943:0 4975:0 4976:0 4977:0 '),\n('4975','ic1197','571','210','4531','77','80','0','6714.63','3539.45','668.964','2.71907','4974:0 4977:0 '),\n('4976','ic1198','571','210','4531','77','80','0','6719.14','3429.9','682.197','3.43144','4974:0 4977:0 5024:0 '),\n('4977','ic1199','571','210','4531','77','80','0','6774.33','3483.53','672.159','3.05053','4974:0 4976:0 4975:0 4978:0 '),\n('4978','ic1200','571','210','4531','77','80','0','6549.04','3449.66','598.005','3.34505','4977:0 4979:0 '),\n('4979','ic1201','571','210','4531','77','80','0','6461.08','3286.15','631.506','5.01716','4978:0 4980:0 '),\n('4980','ic1202','571','210','4531','77','80','0','6452.51','3119.45','657.481','1.45066','4979:0 4981:0 '),\n('4981','ic1203','571','210','4518','77','80','0','6526.9','3000.14','651.117','4.87342','4980:0 4982:0 '),\n('4982','ic1204','571','210','4518','77','80','0','6547.7','2810.28','651.117','4.72026','4981:0 4983:0 '),\n('4983','ic1205','571','210','4518','77','80','0','6524.74','2581.76','651.117','4.51292','4982:0 4984:0 '),\n('4984','ic1206','571','210','4518','77','80','0','6630.74','2328.4','651.585','5.06506','4983:0 4985:0 '),\n('4985','ic1207','571','210','4518','77','80','0','6619.16','2134.02','651.118','4.86635','4984:0 4986:0 '),\n('4986','ic1208','571','210','4520','77','80','0','6609.61','1940.41','652.242','3.77073','4985:0 4987:0 4990:0 '),\n('4987','ic1209','571','210','4520','77','80','0','6436.2','1960.49','631.376','3.19739','4986:0 4988:0 '),\n('4988','ic1210','571','210','4520','77','80','0','6238.67','1930.65','631.948','3.56731','4987:0 4989:0 '),\n('4989','ic1211','571','210','4520','77','80','0','6075.08','1919.83','632.648','3.19032','4988:0 '),\n('4990','ic1212','571','210','4520','77','80','0','6546.79','1812.75','629.551','4.65274','4986:0 4991:0 4992:0 '),\n('4991','ic1213','571','210','4520','77','80','0','6556.05','1624.57','633.228','4.76113','4990:0 4992:0 '),\n('4992','ic1214','571','210','4520','77','80','0','6590.03','1684.23','628.876','3.70395','4991:0 4990:0 4993:0 '),\n('4993','ic1215','571','210','4513','77','80','0','6728.5','1651.46','572.96','1.13099','4992:0 4994:0 '),\n('4994','ic1216','571','210','4513','77','80','0','6809.4','1726.92','556.264','3.80763','4993:0 4995:0 4996:0 '),\n('4995','ic1217','571','210','4513','77','80','0','6812.51','1821.36','578.354','4.77131','4994:0 '),\n('4996','ic1218','571','210','4513','77','80','0','6952.4','1697.92','518.536','2.9209','4994:0 4997:0 '),\n('4997','ic1219','571','210','4513','77','80','0','7031.52','1779.42','506.019','1.12469','4996:0 4998:0 5000:0 '),\n('4998','ic1220','571','210','4514','77','80','0','7025.43','1902.07','528.077','5.0187','4997:0 4999:0 '),\n('4999','ic1221','571','210','4514','77','80','0','6960.52','2014.43','520.864','4.66919','4998:0 '),\n('5000','ic1222','571','210','4513','77','80','0','7201.98','1696.05','469.261','2.30668','4997:0 5001:0 5004:0 5005:0 '),\n('5001','ic1223','571','210','210','77','80','0','7348.32','1642.76','429.984','1.78832','5000:0 5002:0 '),\n('5002','ic1224','571','210','210','77','80','0','7214.66','1585.03','379.979','5.44591','5001:0 5003:0 '),\n('5003','ic1225','571','210','4537','77','80','0','7281.16','1492.2','326.379','1.64772','5002:0 4909:0 4908:0 5004:0 '),\n('5004','ic1226','571','210','210','77','80','0','7331.27','1765.54','456.844','3.80914','5003:0 5000:0 '),\n('5005','ic1227','571','210','4513','77','80','0','7136.03','1876.5','532.96','4.77911','5000:0 5006:0 '),\n('5006','ic1228','571','210','4513','77','80','0','7224.2','1973.83','570.931','1.27072','5005:0 5007:0 5008:0 '),\n('5007','ic1229','571','210','4513','77','80','1','7242.67','2168.33','565.646','4.69493','5006:0 '),\n('5008','ic1230','571','210','4513','77','80','0','7100.09','2122.12','621.203','4.3801','5006:0 '),\n('5009','ic1231','571','210','4540','77','80','0','7682.15','2851.03','469.055','2.77003','4938:0 5010:0 '),\n('5010','ic1232','571','210','4517','77','80','0','7685.31','3002.19','541.332','0.921987','5009:0 5011:0 '),\n('5011','ic1233','571','210','4517','77','80','0','7702.82','3078.43','557.351','5.63045','5010:0 5012:0 5019:0 '),\n('5012','ic1234','571','210','4517','77','80','0','7843.82','2935.68','517.933','0.541764','5011:0 5013:0 '),\n('5013','ic1235','571','210','4517','77','80','0','7934.47','2994.97','541.057','3.56948','5012:0 5014:0 '),\n('5014','ic1236','571','210','4517','77','80','0','8021.28','2971.58','563.405','2.3317','5013:0 5015:0 '),\n('5015','ic1237','571','210','4517','77','80','0','8106.95','2852.61','559.292','5.73169','5014:0 5016:0 5025:0 '),\n('5016','ic1238','571','210','4477','77','80','0','8243','2776.54','640.775','6.08434','5015:0 5017:0 '),\n('5017','ic1239','571','210','4477','77','80','0','8383.84','2730.79','655.094','5.79375','5016:0 5018:0 '),\n('5018','ic1240','571','210','4477','77','80','1','8508.77','2673.5','652.354','5.83302','5017:0 '),\n('5019','ic1241','571','210','4517','77','80','0','7575.23','3170.11','577.394','5.58719','5011:0 '),\n('5020','ic1242','571','210','4496','77','80','0','6971.39','3981.75','552.612','5.94612','4951:0 5021:0 '),\n('5021','ic1243','571','210','4496','77','80','0','6934.59','4194.33','535.202','1.79686','5020:0 '),\n('5022','ic1244','571','210','4496','77','80','0','7162.84','4153.53','633.939','2.91213','4951:0 5023:0 '),\n('5023','ic1245','571','210','4496','77','80','0','7019.95','4225.08','665.892','2.06625','5022:0 '),\n('5024','ic1246','571','210','4531','77','80','0','6545.08','3321.6','665.004','4.0596','4976:0 '),\n('5025','ic1247','571','210','210','77','80','0','8061.74','2755.35','542.008','4.48453','5015:0 5026:0 '),\n('5026','ic1248','571','210','210','77','80','0','8077.07','2597.13','519.549','4.54375','5025:0 5027:0 '),\n('5027','ic1249','571','210','4510','77','80','0','8103.98','2410.6','490.587','4.97494','5026:0 5028:0 '),\n('5028','ic1250','571','210','4510','77','80','0','8060.18','2339.25','484.62','3.25413','5027:0 5029:0 '),\n('5029','ic1251','571','210','4510','77','80','0','7982.84','2214.78','500.312','4.5092','5028:0 5030:0 5031:0 '),\n('5030','ic1252','571','210','4510','77','80','0','8163.01','2189.09','499.737','3.33032','5029:0 '),\n('5031','ic1253','571','210','4510','77','80','0','7986.6','2067','499.729','3.00752','5029:0 5032:0 5035:0 '),\n('5032','ic1254','571','210','4510','77','80','0','8120.19','1962.29','501.671','5.88521','5031:0 5033:0 '),\n('5033','ic1255','571','210','4510','77','80','0','8204.78','1874.81','514.771','1.36602','5032:0 5034:0 '),\n('5034','ic1256','571','210','4510','77','80','0','8179.12','2049.72','550.596','2.65329','5033:0 '),\n('5035','ic1257','571','210','4510','77','80','0','7751.59','2060.95','499.864','3.22507','5031:0 5036:0 '),\n('5036','ic1258','571','210','4510','77','80','0','7549.16','2067.17','500.312','3.28947','5035:0 5037:0 5038:0 '),\n('5037','ic1259','571','210','4510','77','80','0','7438.58','2146.13','500.312','2.65644','5036:0 '),\n('5038','ic1260','571','210','4510','77','80','0','7492.17','1991.36','500.301','0.996881','5036:0 ');\n"
  },
  {
    "path": "AC/SQL/updates/world/2023_06_16_00_creature_template_npcbot_wander_nodes.sql",
    "content": "--\nUPDATE `creature_template_npcbot_wander_nodes` SET `flags`='4' WHERE (`id`='28'); -- Razor Hill: make Horde-only\n-- Durotar canyon (Drygulch Ravine)\nUPDATE `creature_template_npcbot_wander_nodes` SET `flags`='0' WHERE `id` IN ('66','1372','1373','1374','1375','1376','1377','1378','1380','1381','1382','1383','1384','1385','1401');\nUPDATE `creature_template_npcbot_wander_nodes` SET `flags`='1' WHERE (`id`='419'); -- RefugePointeExitS: allow neutral spawns\nUPDATE `creature_template_npcbot_wander_nodes` SET `flags`='1' WHERE (`id`='505'); -- LochS: allow neutral spawns\nUPDATE `creature_template_npcbot_wander_nodes` SET `flags`='1' WHERE (`id`='1071'); -- AshenvaleC_hub11: allow neutral spawns\nUPDATE `creature_template_npcbot_wander_nodes` SET `flags`='1' WHERE (`id`='1379'); -- DurotarCanyon1: allow neutral spawns\nUPDATE `creature_template_npcbot_wander_nodes` SET `flags`='1' WHERE (`id`='1739'); -- DesolaceN34: allow neutral spawns\n"
  },
  {
    "path": "AC/SQL/updates/world/2023_06_18_01_creature_template_npcbot_disabled_items.sql",
    "content": "--\nDROP TABLE IF EXISTS `creature_template_npcbot_disabled_items`;\nCREATE TABLE `creature_template_npcbot_disabled_items` (\n  `id` int(10) unsigned NOT NULL DEFAULT '0',\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n"
  },
  {
    "path": "AC/SQL/updates/world/2023_06_19_00_creature_template_npcbot_disabled_items.sql",
    "content": "--\nINSERT IGNORE INTO `creature_template_npcbot_disabled_items` (`id`) VALUES\n('77'),\n('1046'),\n('1047'),\n('1170'),\n('1174'),\n('1354'),\n('1719'),\n('2811'),\n('2812'),\n('2814'),\n('3068'),\n('3271'),\n('3333'),\n('3436'),\n('3883'),\n('3885'),\n('3886'),\n('3887'),\n('3888'),\n('3933'),\n('3935'),\n('4193'),\n('4616'),\n('4657'),\n('4664'),\n('4667'),\n('4670'),\n('4673'),\n('4902'),\n('4934'),\n('4950'),\n('4955'),\n('4956'),\n('5040'),\n('5294'),\n('5295'),\n('5296'),\n('5297'),\n('5298'),\n('5607'),\n('12755'),\n('13242'),\n('14363'),\n('14597'),\n('14609'),\n('14691'),\n('14696'),\n('15888'),\n('15889'),\n('22391'),\n('23553');\n"
  },
  {
    "path": "AC/SQL/updates/world/2023_06_19_01_creature_template.sql",
    "content": "--\nUPDATE `creature_template` SET `speed_walk` = 1.0, `speed_run` = 1.0 WHERE `entry` > 70000 AND (`flags_extra`&0x8E000000) = 0x8E000000 AND `speed_run` > 1.0;\n"
  },
  {
    "path": "AC/SQL/updates/world/2023_06_24_00_creature_template_npcbot_wander_nodes.sql",
    "content": "--\nSET @WP_START = 5039;\nSET @WP_END   = 5087;\n\nDELETE FROM `creature_template_npcbot_wander_nodes` WHERE `id` BETWEEN @WP_START AND @WP_END;\nINSERT INTO `creature_template_npcbot_wander_nodes`(`id`,`name`,`mapid`,`zoneid`,`areaid`,`minlevel`,`maxlevel`,`flags`,`x`,`y`,`z`,`o`,`links`) VALUES\n('5039', 'AlteracValleySpawnA', '30', '2597', '2597', '50', '80', '3', '801.027', '-493.883', '99.6917', '3.08066', '5040:0 '),\n('5040', 'AlteracValleyStartA1', '30', '2597', '3299', '50', '80', '2', '717.929', '-475.351', '75.1276', '2.10478', '5041:0 5079:0 '),\n('5041', 'AlteracValleyStartA2', '30', '2597', '3299', '50', '80', '34', '664.972', '-400.377', '68.7491', '2.43269', '5042:0 5077:0 '),\n('5042', 'AlteracValleyStartA3', '30', '2597', '3299', '50', '80', '2', '610.827', '-388.879', '66.5562', '3.30843', '5043:0 '),\n('5043', 'AlteracValleyStartA4', '30', '2597', '2597', '50', '80', '2', '463.128', '-438.201', '33.0107', '2.75865', '5044:0 '),\n('5044', 'AlteracValleyHubA1', '30', '2597', '2597', '50', '80', '0', '401.785', '-393.695', '-1.05733', '2.60355', '5045:0 5084:0 '),\n('5045', 'AlteracValleyBunker2', '30', '2597', '3304', '50', '80', '0', '221.727', '-412.006', '41.1425', '2.14206', '5046:0 5047:0 5044:0 '),\n('5046', 'AlteracValleyBunker2Inside', '30', '2597', '3304', '50', '80', '146', '204.453', '-359.47', '56.3831', '2.20687', '5045:0 '),\n('5047', 'AlteracValleyGYA1', '30', '2597', '3302', '50', '80', '128', '76.8322', '-399.172', '45.7006', '1.69996', '5045:0 5048:0 5049:0 5050:0 '),\n('5048', 'AlteracValleyBelinda', '30', '2597', '2958', '50', '80', '0', '-36.1268', '-290.741', '15.0786', '3.0354', '5047:0 '),\n('5049', 'AlteracValleyCN', '30', '2597', '2597', '50', '80', '0', '-133.7', '-368.866', '8.47712', '6.00431', '5047:0 5052:0 5087:0 '),\n('5050', 'AlteracValleyBunker1Inside', '30', '2597', '3305', '50', '80', '146', '-151.384', '-442.049', '40.3942', '1.08956', '5047:0 '),\n('5051', 'AlteracValleyGYC', '30', '2597', '3301', '50', '80', '128', '-200.494', '-109.396', '78.5207', '4.95373', '5087:0 5086:0 '),\n('5052', 'AlteracValleyCS1', '30', '2597', '3057', '50', '80', '0', '-262.759', '-292.49', '6.80088', '5.73925', '5049:0 5053:0 '),\n('5053', 'AlteracValleyCS2', '30', '2597', '3057', '50', '80', '0', '-473.131', '-273.873', '24.7318', '3.74628', '5052:0 5054:0 5086:0 '),\n('5054', 'AlteracValleyCS3', '30', '2597', '2597', '50', '80', '32', '-525.235', '-353.849', '37.0353', '4.37461', '5055:0 5053:0 '),\n('5055', 'AlteracValleyCS4', '30', '2597', '2597', '50', '80', '0', '-601.467', '-320.914', '51.7167', '6.08664', '5054:0 5056:0 '),\n('5056', 'AlteracValleyGYH1', '30', '2597', '2597', '50', '80', '128', '-615.967', '-397.593', '60.6924', '0.333583', '5055:0 5057:0 5058:0 5059:0 '),\n('5057', 'AlteracValleyTower1Inside', '30', '2597', '2977', '50', '80', '148', '-569.205', '-264.746', '75.0088', '2.58769', '5056:0 '),\n('5058', 'AlteracValleyGalvangar', '30', '2597', '2977', '50', '80', '0', '-536.858', '-168.875', '57.0098', '2.75262', '5056:0 '),\n('5059', 'AlteracValleyTower2', '30', '2597', '2962', '50', '80', '0', '-715.985', '-350.671', '66.8321', '2.63482', '5056:0 5060:0 5061:0 '),\n('5060', 'AlteracValleyTower2Inside', '30', '2597', '2962', '50', '80', '148', '-767.615', '-361.296', '90.8949', '4.27041', '5059:0 '),\n('5061', 'AlteracValleyGYH2', '30', '2597', '2597', '50', '80', '128', '-1083.95', '-341.705', '55.3047', '0.111719', '5059:0 5064:0 5082:0 '),\n('5062', 'AlteracValleyStartH1', '30', '2597', '2597', '50', '80', '4', '-1144.38', '-442.064', '56.7427', '0.904973', '5061:0 '),\n('5063', 'AlteracValleySpawnH', '30', '2597', '2597', '50', '80', '5', '-1386.53', '-549.064', '55.0284', '0.628112', '5062:0 '),\n('5064', 'AlteracValleyBaseH1', '30', '2597', '2961', '50', '80', '0', '-1241.61', '-363.466', '59.6773', '2.10074', '5061:0 5065:0 '),\n('5065', 'AlteracValleyBaseH2', '30', '2597', '2961', '50', '80', '0', '-1210.4', '-252.908', '72.7007', '3.07856', '5064:0 5066:0 '),\n('5066', 'AlteracValleyBaseH3', '30', '2597', '2978', '50', '80', '0', '-1286.08', '-289.551', '89.091', '3.10996', '5065:0 5067:0 '),\n('5067', 'AlteracValleyGYH3', '30', '2597', '2978', '50', '80', '128', '-1404.13', '-312.526', '89.4075', '1.4783', '5066:0 5068:0 5069:0 5070:0 '),\n('5068', 'AlteracValleyTower3Inside', '30', '2597', '2978', '50', '80', '148', '-1301.34', '-267.703', '114.151', '0.219693', '5067:0 '),\n('5069', 'AlteracValleyTower4Inside', '30', '2597', '2978', '50', '80', '148', '-1304.35', '-313.854', '113.867', '5.07738', '5067:0 '),\n('5070', 'AlteracValleyDrekthar', '30', '2597', '4407', '50', '80', '276', '-1367.71', '-227.007', '98.4255', '2.09366', '5067:0 '),\n('5071', 'AlteracValleyGYA2', '30', '2597', '3303', '50', '80', '128', '664.375', '-295.432', '30.2906', '1.6334', '5072:0 5080:0 5084:0 '),\n('5072', 'AlteracValleyBaseA1', '30', '2597', '2959', '50', '80', '0', '628.165', '-209.132', '39.032', '1.71587', '5073:0 5071:0 '),\n('5073', 'AlteracValleyGYA3', '30', '2597', '2959', '50', '80', '128', '635.165', '-28.286', '46.6157', '4.25874', '5072:0 5074:0 5075:0 5076:0 '),\n('5074', 'AlteracValleyBunker3Inside', '30', '2597', '2959', '50', '80', '146', '672.521', '-142.475', '63.6551', '4.09365', '5073:0 '),\n('5075', 'AlteracValleyBunker4Inside', '30', '2597', '2959', '50', '80', '146', '555.611', '-77.7777', '51.9336', '1.81992', '5073:0 '),\n('5076', 'AlteracValleyVanndar', '30', '2597', '4408', '50', '80', '274', '712.208', '-13.5129', '50.1354', '0.288398', '5073:0 '),\n('5077', 'AlteracValleyShortcutA1', '30', '2597', '3303', '50', '80', '34', '668.321', '-376.13', '30.4499', '1.65697', '5071:0 '),\n('5078', 'AlteracValleyShortcutH1', '30', '2597', '2597', '50', '80', '36', '-550.621', '-356.862', '50.2404', '5.33475', '5054:0 '),\n('5079', 'AlteracValleyMineA1', '30', '2597', '2957', '50', '80', '34', '774.881', '-363.728', '78.8805', '1.75712', '5080:0 '),\n('5080', 'AlteracValleyMineA2', '30', '2597', '2957', '50', '80', '32', '776.68', '-313.432', '54.4907', '0.0135369', '5081:0 5071:0 '),\n('5081', 'AlteracValleyMineA3', '30', '2597', '2957', '50', '80', '512', '870.508', '-436.928', '51.1438', '5.59377', '5080:0 '),\n('5082', 'AlteracValleyMineH1', '30', '2597', '2963', '50', '80', '0', '-964.106', '-216.1', '69.4372', '0.822477', '5061:0 5083:0 '),\n('5083', 'AlteracValleyMineH2', '30', '2597', '2963', '50', '80', '512', '-857.468', '-102.82', '65.0282', '0.681106', '5082:0 '),\n('5084', 'AlteracValleyAuxA1', '30', '2597', '2597', '50', '80', '0', '517.454', '-327.563', '-1.03301', '0.235552', '5044:0 5071:0 '),\n('5085', 'AlteracValleyIcebloodGY', '30', '2597', '3300', '50', '80', '0', '-531.167', '-405.06', '49.5441', '2.83719', '5056:0 5078:0 '),\n('5086', 'AlteracValleyGYCS', '30', '2597', '3057', '50', '80', '0', '-296.163', '-118.723', '18.4795', '0.58704', '5051:0 5053:0 '),\n('5087', 'AlteracValleyGYCN', '30', '2597', '2597', '50', '80', '0', '-154.952', '-231.949', '10.0454', '1.75925', '5049:0 5051:0 ');\n"
  },
  {
    "path": "AC/SQL/updates/world/2023_06_26_00_creature_template_npcbot_wander_nodes.sql",
    "content": "--\nDELETE FROM `creature_template_npcbot_wander_nodes` WHERE `id` IN (2396,2406);\nINSERT INTO `creature_template_npcbot_wander_nodes`(`id`,`name`,`mapid`,`zoneid`,`areaid`,`minlevel`,`maxlevel`,`flags`,`x`,`y`,`z`,`o`,`links`) VALUES\n('2396','ArathiBasinSpawnA','529','3358','3417','20','80','3','1289.51','1286.41','-14.466','3.89804','2397:0 '),\n('2406','ArathiBasinSpawnH','529','3358','3418','20','80','5','704.074','704.457','-16.4305','0.79572','2407:0 ');\n"
  },
  {
    "path": "AC/SQL/updates/world/2023_07_01_00_creature_template_npcbot_disabled_items.sql",
    "content": "-- Test items: 'LK ARENA ...', 'LK Arena ...', 'LK Honor ...' (SELECT entry,name FROM item_template WHERE name LIKE 'LK %';)\nINSERT IGNORE INTO `creature_template_npcbot_disabled_items` (`id`) VALUES\n('42000'),\n('42019'),\n('41995'),\n('42007'),\n('42013'),\n('40650'),\n('41900'),\n('41911'),\n('42083');\n"
  },
  {
    "path": "AC/SQL/updates/world/2023_08_13_00_creature_template_npcbot_appearance.sql",
    "content": "--\nALTER TABLE `creature_template_npcbot_appearance` MODIFY COLUMN `name*` char(100) DEFAULT 'unk' COMMENT 'unused', CHARSET=utf8mb4;\n"
  },
  {
    "path": "AC/SQL/updates/world/2024_03_12_00_npc_text.sql",
    "content": "--\nSET @LOCALIZED_STRINGS_START = 70673;\nSET @LOCALIZED_STRINGS_END   = 70673;\n\nDELETE FROM `npc_text` WHERE ID BETWEEN @LOCALIZED_STRINGS_START and @LOCALIZED_STRINGS_END;\nINSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n(70673,'Heal target health threshold','-1');\n"
  },
  {
    "path": "AC/SQL/updates/world/2024_03_18_00_npc_text.sql",
    "content": "--\nUPDATE `npc_text` SET `text0_0`='You exceed max npcbots for your level (%u)' WHERE (`ID`='70532');\n"
  },
  {
    "path": "AC/SQL/updates/world/2024_03_19_00_npc_text.sql",
    "content": "--\nSET @LOCALIZED_STRINGS_START = 70674;\nSET @LOCALIZED_STRINGS_END   = 70684;\n\nDELETE FROM `npc_text` WHERE ID BETWEEN @LOCALIZED_STRINGS_START and @LOCALIZED_STRINGS_END;\nINSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n(70674,'I need a portal','-1'),\n(70675,'Stormwind','-1'),\n(70676,'Ironforge','-1'),\n(70677,'Darnassus','-1'),\n(70678,'Exodar','-1'),\n(70679,'Orgrimmar','-1'),\n(70680,'Undercity','-1'),\n(70681,'Thunder Bluff','-1'),\n(70682,'Silvermoon','-1'),\n(70683,'Shattrath','-1'),\n(70684,'Dalaran','-1');\n"
  },
  {
    "path": "AC/SQL/updates/world/2024_05_21_00_command.sql",
    "content": "DELETE FROM `command` WHERE ISNULL(`help`) AND `name` IN ('npcbot add','npcbot command','npcbot command follow','npcbot command follow only','npcbot command nocast','npcbot command nogossip','npcbot command nolongcast','npcbot command rebind','npcbot command standstill','npcbot command stopfully','npcbot command unbind','npcbot command walk','npcbot createnew','npcbot delete','npcbot delete free','npcbot delete id','npcbot distance','npcbot distance attack','npcbot distance attack long','npcbot distance attack short','npcbot dump','npcbot dump load','npcbot dump write','npcbot go','npcbot gs','npcbot hide','npcbot info','npcbot kill','npcbot list spawned','npcbot list spawned free','npcbot lookup','npcbot move','npcbot order','npcbot order cast','npcbot recall','npcbot recall spawns','npcbot recall teleport','npcbot reloadconfig','npcbot remove','npcbot revive','npcbot sendto','npcbot sendto last','npcbot sendto point','npcbot sendto point set','npcbot set','npcbot set faction','npcbot set owner','npcbot set spec','npcbot show','npcbot spawn','npcbot suicide','npcbot unhide','npcbot useonbot item','npcbot useonbot spell','npcbot vehicle','npcbot vehicle eject','npcbot wp add','npcbot wp del','npcbot wp go','npcbot wp info','npcbot wp links','npcbot wp list','npcbot wp list all','npcbot wp move','npcbot wp setflags','npcbot wp setflags z','npcbot wp setlevels','npcbot wp setlevels z','npcbot wp setlinks','npcbot wp setname','npcbot wp spawnall');\nINSERT IGNORE INTO `command` (`name`,`security`,`help`) VALUES\n('npcbot add', '2', NULL),\n('npcbot command', '0', NULL),\n('npcbot command follow', '0', NULL),\n('npcbot command follow only', '0', NULL),\n('npcbot command nocast', '0', NULL),\n('npcbot command nogossip', '0', NULL),\n('npcbot command nolongcast', '0', NULL),\n('npcbot command rebind', '0', NULL),\n('npcbot command standstill', '0', NULL),\n('npcbot command stopfully', '0', NULL),\n('npcbot command unbind', '0', NULL),\n('npcbot command walk', '0', NULL),\n('npcbot createnew', '3', NULL),\n('npcbot delete', '2', NULL),\n('npcbot delete free', '2', NULL),\n('npcbot delete id', '2', NULL),\n('npcbot distance', '0', NULL),\n('npcbot distance attack', '0', NULL),\n('npcbot distance attack long', '0', NULL),\n('npcbot distance attack short', '0', NULL),\n('npcbot dump', '0', NULL),\n('npcbot dump load', '3', NULL),\n('npcbot dump write', '3', NULL),\n('npcbot go', '2', NULL),\n('npcbot gs', '0', NULL),\n('npcbot hide', '0', NULL),\n('npcbot info', '0', NULL),\n('npcbot kill', '0', NULL),\n('npcbot list spawned', '2', NULL),\n('npcbot list spawned free', '2', NULL),\n('npcbot lookup', '2', NULL),\n('npcbot move', '2', NULL),\n('npcbot order', '0', NULL),\n('npcbot order cast', '0', NULL),\n('npcbot recall', '0', NULL),\n('npcbot recall spawns', '0', NULL),\n('npcbot recall teleport', '0', NULL),\n('npcbot reloadconfig', '2', NULL),\n('npcbot remove', '2', NULL),\n('npcbot revive', '2', NULL),\n('npcbot sendto', '0', NULL),\n('npcbot sendto last', '0', NULL),\n('npcbot sendto point', '0', NULL),\n('npcbot sendto point set', '0', NULL),\n('npcbot set', '0', NULL),\n('npcbot set faction', '2', NULL),\n('npcbot set owner', '2', NULL),\n('npcbot set spec', '2', NULL),\n('npcbot show', '0', NULL),\n('npcbot spawn', '2', NULL),\n('npcbot suicide', '0', NULL),\n('npcbot unhide', '0', NULL),\n('npcbot useonbot item', '0', NULL),\n('npcbot useonbot spell', '0', NULL),\n('npcbot vehicle', '0', NULL),\n('npcbot vehicle eject', '0', NULL),\n('npcbot wp add', '2', NULL),\n('npcbot wp del', '2', NULL),\n('npcbot wp go', '2', NULL),\n('npcbot wp info', '2', NULL),\n('npcbot wp links', '2', NULL),\n('npcbot wp list', '2', NULL),\n('npcbot wp list all', '2', NULL),\n('npcbot wp move', '2', NULL),\n('npcbot wp setflags', '2', NULL),\n('npcbot wp setflags z', '2', NULL),\n('npcbot wp setlevels', '2', NULL),\n('npcbot wp setlevels z', '2', NULL),\n('npcbot wp setlinks', '2', NULL),\n('npcbot wp setname', '2', NULL),\n('npcbot wp spawnall', '2', NULL);\n"
  },
  {
    "path": "AC/SQL/updates/world/2024_05_29_00_command.sql",
    "content": "--\nINSERT IGNORE INTO `command` (`name`,`security`,`help`) VALUES\n('npcbot log clear', '3', NULL);\n"
  },
  {
    "path": "AC/SQL/updates/world/2024_08_14_00_npc_text.sql",
    "content": "--\nSET @LOCALIZED_STRINGS_START = 70685;\nSET @LOCALIZED_STRINGS_END   = 70685;\n\nDELETE FROM `npc_text` WHERE ID BETWEEN @LOCALIZED_STRINGS_START and @LOCALIZED_STRINGS_END;\nINSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n(@LOCALIZED_STRINGS_START,'You exceed max npcbots for your account (%u >= %u)','-1');\n"
  },
  {
    "path": "AC/SQL/updates/world/2024_08_14_01_npc_text.sql",
    "content": "--\nUPDATE `npc_text` SET `text0_0` = REPLACE(`text0_0`, '%s', '{}') WHERE ID IN (70438,70527,70528,70529,70530,70531,70535,70543,70552,70553);\nUPDATE `npc_text` SET `text0_0` = REPLACE(`text0_0`, '%u', '{}') WHERE ID IN (70532,70534,70535,70685);\n"
  },
  {
    "path": "AC/SQL/updates/world/2024_08_15_00_command.sql",
    "content": "--\nINSERT IGNORE INTO `command` (`name`,`security`,`help`) VALUES\n('npcbot free', '2', NULL);\n"
  },
  {
    "path": "AC/SQL/updates/world/2024_08_31_00_command.sql",
    "content": "--\nINSERT IGNORE INTO `command` (`name`,`security`,`help`) VALUES\n('npcbot order pull', '0', NULL);\n"
  },
  {
    "path": "AC/SQL/updates/world/2024_10_21_00_npc_text.sql",
    "content": "--\nSET @LOCALIZED_STRINGS_START = 70686;\nSET @LOCALIZED_STRINGS_END   = 70686;\n\nDELETE FROM `npc_text` WHERE ID BETWEEN @LOCALIZED_STRINGS_START and @LOCALIZED_STRINGS_END;\nINSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n(@LOCALIZED_STRINGS_START,'<Set for all bots>','-1');\n"
  },
  {
    "path": "AC/SQL/updates/world/2024_10_27_00_command.sql",
    "content": "--\nINSERT IGNORE INTO `command` (`name`,`security`,`help`) VALUES\n('npcbot wp setweights', '2', NULL);\n"
  },
  {
    "path": "AC/SQL/updates/world/2024_10_31_creature_template_wander_nodes.sql",
    "content": "--\nDELETE FROM `creature_template_npcbot_wander_nodes` WHERE `id` BETWEEN 2372 AND 5095;\nINSERT INTO `creature_template_npcbot_wander_nodes` (`id`,`name`,`mapid`,`zoneid`,`areaid`,`minlevel`,`maxlevel`,`flags`,`x`,`y`,`z`,`o`,`links`) VALUES\n('2372', 'hellfire001', '530', '3483', '3804', '60', '63', '0', '-88.1661', '1757.73', '61.4158', '2.30551', '2373:0 2376:0 '),\n('2373', 'hellfire002', '530', '3483', '3804', '60', '63', '0', '-130.83', '1837.76', '78.4899', '5.22012', '2372:0 2374:0 2376:0 '),\n('2374', 'hellfire003', '530', '3483', '3542', '60', '63', '0', '-228.144', '1920.56', '96.8968', '1.90495', '2373:0 2375:0 2376:0 '),\n('2375', 'hellfire004', '530', '3483', '3542', '60', '63', '1', '-207.846', '2150.92', '80.3185', '1.58606', '2374:0 2396:0 2407:0 '),\n('2376', 'hellfire005', '530', '3483', '3804', '60', '63', '0', '-320.252', '1725.48', '60.1535', '0.383608', '2372:0 2373:0 2374:0 2377:0 '),\n('2377', 'hellfire006', '530', '3483', '3804', '60', '63', '0', '-443.68', '1809.38', '64.2507', '6.17593', '2376:0 2378:0 '),\n('2378', 'hellfire007', '530', '3483', '3815', '60', '63', '0', '-614.482', '1855.41', '72.3221', '2.91339', '2377:0 2379:0 '),\n('2379', 'hellfire008', '530', '3483', '3483', '60', '63', '0', '-772.087', '1924.89', '51.3142', '3.69486', '2378:0 2380:0 2381:0 '),\n('2380', 'hellfire009', '530', '3483', '3582', '60', '63', '0', '-890.066', '1889.54', '71.6232', '2.99193', '2379:0 '),\n('2381', 'hellfire010', '530', '3483', '3483', '60', '63', '0', '-665.15', '2133.08', '41.0304', '6.09818', '2379:0 2382:0 '),\n('2382', 'hellfire011', '530', '3483', '3483', '60', '63', '0', '-830.651', '2170.3', '10.6442', '6.00392', '2381:0 2383:0 '),\n('2383', 'hellfire012', '530', '3483', '3582', '60', '63', '0', '-1044.48', '2221.12', '18.1881', '2.68955', '2382:0 2384:0 2386:0 '),\n('2384', 'hellfire013', '530', '3483', '3582', '60', '63', '0', '-1060.21', '2075.54', '65.7492', '1.53579', '2383:0 2385:0 '),\n('2385', 'hellfire014', '530', '3483', '3582', '60', '63', '0', '-1136.98', '1968.35', '74.7199', '4.3593', '2384:0 '),\n('2386', 'hellfire015', '530', '3483', '3483', '60', '63', '0', '-1116.71', '2366.85', '26.2', '1.55936', '2383:0 2387:0 '),\n('2387', 'hellfire016', '530', '3483', '3483', '60', '63', '0', '-1209.75', '2517.59', '48.9283', '1.97249', '2386:0 '),\n('2388', 'hellfire017', '530', '3483', '3483', '60', '63', '0', '-927.061', '2680.73', '24.4655', '4.225', '2389:0 2392:0 '),\n('2389', 'hellfire018', '530', '3483', '3483', '60', '63', '0', '-991.176', '2930.18', '4.1955', '4.89571', '2388:0 2412:0 2413:0 '),\n('2390', 'hellfire019', '530', '3483', '3483', '60', '63', '0', '-652.576', '2459.81', '56.8494', '0.00658825', '2391:0 2392:0 '),\n('2391', 'hellfire020', '530', '3483', '3483', '60', '63', '0', '-382.816', '2594.23', '50.224', '3.72781', '2390:0 '),\n('2392', 'hellfire021', '530', '3483', '3538', '60', '63', '3', '-721.67', '2675.81', '95.7509', '0.770785', '2388:0 2390:0 '),\n('2393', 'hellfire022', '530', '3483', '3483', '60', '63', '0', '-449.715', '2925.64', '21.2132', '0.32312', '2394:0 '),\n('2394', 'hellfire023', '530', '3483', '3483', '60', '63', '0', '-593.071', '2998.53', '15.8438', '0.017592', '2393:0 2395:0 '),\n('2395', 'hellfire024', '530', '3483', '3483', '60', '63', '0', '-749.912', '3117.85', '4.88152', '5.75179', '2394:0 2412:0 2453:0 '),\n('2396', 'hellfire025', '530', '3483', '3483', '60', '63', '0', '-80.7943', '2320.17', '65.6333', '4.50299', '2375:0 2397:0 2400:0 2407:0 '),\n('2397', 'hellfire026', '530', '3483', '3483', '60', '63', '0', '18.4377', '2469.36', '53.639', '4.22811', '2396:0 2398:0 2400:0 '),\n('2398', 'hellfire027', '530', '3483', '3536', '60', '63', '4', '33.0662', '2661.07', '75.7738', '3.89274', '2397:0 2399:0 '),\n('2399', 'hellfire028', '530', '3483', '3536', '60', '63', '5', '221.743', '2789.93', '121.175', '3.98307', '2398:0 2450:0 '),\n('2400', 'hellfire029', '530', '3483', '3793', '60', '63', '0', '158.425', '2334.4', '54.1841', '5.04414', '2396:0 2397:0 2401:0 '),\n('2401', 'hellfire030', '530', '3483', '3793', '60', '63', '0', '270.62', '2240.47', '56.9978', '2.96989', '2400:0 2402:0 '),\n('2402', 'hellfire031', '530', '3483', '3793', '60', '63', '0', '255.635', '2040.2', '31.817', '2.78925', '2401:0 2403:0 '),\n('2403', 'hellfire032', '530', '3483', '3483', '60', '63', '0', '446.912', '2049.26', '99.1622', '3.3783', '2402:0 2404:0 '),\n('2404', 'hellfire033', '530', '3483', '3483', '60', '63', '0', '442.066', '2351.62', '123.026', '4.69385', '2403:0 2405:0 '),\n('2405', 'hellfire034', '530', '3483', '3483', '60', '63', '0', '438.394', '2661.09', '177.718', '4.90591', '2404:0 2406:0 '),\n('2406', 'hellfire035', '530', '3483', '3549', '60', '63', '0', '549.636', '2796.65', '217.8', '4.31374', '2405:0 '),\n('2407', 'hellfire036', '530', '3483', '3542', '60', '63', '0', '-220.959', '2363', '37.4537', '1.6049', '2375:0 2396:0 2408:0 '),\n('2408', 'hellfire037', '530', '3483', '3542', '60', '63', '0', '-248.594', '2648.76', '-11.9763', '4.88786', '2407:0 2409:0 '),\n('2409', 'hellfire038', '530', '3483', '3542', '60', '63', '0', '-270.052', '2895.86', '-55.0992', '4.86824', '2408:0 2410:0 2411:0 '),\n('2410', 'hellfire039', '530', '3483', '3545', '60', '63', '0', '-371.638', '3039.8', '-63.8946', '5.60259', '2409:0 '),\n('2411', 'hellfire040', '530', '3483', '3545', '60', '63', '0', '-243.298', '3044.75', '-65.4235', '4.48185', '2409:0 '),\n('2412', 'hellfire041', '530', '3483', '3483', '60', '63', '0', '-930.007', '3088.24', '16.9479', '0.133084', '2389:0 2395:0 2413:0 2420:0 '),\n('2413', 'hellfire042', '530', '3483', '3483', '60', '63', '0', '-1233.86', '3071.59', '29.2379', '5.81622', '2412:0 2389:0 2414:0 2416:0 '),\n('2414', 'hellfire043', '530', '3483', '3796', '60', '63', '0', '-1370.5', '2890.29', '-26.0325', '3.35557', '2413:0 2415:0 '),\n('2415', 'hellfire044', '530', '3483', '3546', '60', '63', '0', '-1257.98', '2677.11', '1.84108', '2.88824', '2414:0 '),\n('2416', 'hellfire045', '530', '3483', '3483', '60', '63', '0', '-1343.14', '3305.78', '47.482', '2.24265', '2413:0 2417:0 '),\n('2417', 'hellfire046', '530', '3483', '3765', '60', '63', '0', '-1519.57', '3487.42', '30.3847', '2.18217', '2416:0 2418:0 '),\n('2418', 'hellfire047', '530', '3483', '3765', '60', '63', '0', '-1621.55', '3645.56', '31.4811', '1.74235', '2417:0 2419:0 '),\n('2419', 'hellfire048', '530', '3483', '3765', '60', '63', '0', '-1680.38', '3854.3', '36.4441', '1.97326', '2418:0 2738:0 '),\n('2420', 'hellfire049', '530', '3483', '3483', '60', '63', '0', '-1003.35', '3339.19', '79.143', '4.83211', '2412:0 2421:0 '),\n('2421', 'hellfire050', '530', '3483', '3483', '60', '63', '0', '-866.12', '3482.05', '93.6018', '3.97209', '2420:0 2422:0 '),\n('2422', 'hellfire051', '530', '3483', '3543', '60', '63', '0', '-842.626', '3645.6', '31.4407', '5.28056', '2421:0 2423:0 '),\n('2423', 'hellfire052', '530', '3483', '3543', '60', '63', '0', '-578.854', '3725.85', '28.9962', '3.4176', '2422:0 2424:0 '),\n('2424', 'hellfire053', '530', '3483', '3543', '60', '63', '0', '-629.058', '3954.17', '28.9952', '4.88236', '2423:0 2425:0 2426:0 2428:0 '),\n('2425', 'hellfire054', '530', '3483', '3483', '60', '63', '0', '-503.474', '4084.93', '51.2172', '4.03729', '2424:0 2428:0 2435:0 '),\n('2426', 'hellfire055', '530', '3483', '3543', '60', '63', '0', '-841.235', '4095.51', '32.9704', '5.79579', '2424:0 2427:0 2428:0 2431:0 '),\n('2427', 'hellfire056', '530', '3483', '3483', '60', '63', '0', '-950.497', '4184.92', '29.5337', '3.20635', '2426:0 2429:0 2431:0 '),\n('2428', 'hellfire057', '530', '3483', '3554', '60', '63', '5', '-659.228', '4167.05', '67.8382', '3.41684', '2424:0 2425:0 2426:0 2435:0 '),\n('2429', 'hellfire058', '530', '3483', '3556', '60', '63', '0', '-1174.94', '4209.88', '20.9412', '0.188851', '2427:0 2430:0 '),\n('2430', 'hellfire059', '530', '3483', '3798', '60', '63', '0', '-1287.84', '4075.76', '93.8567', '5.93954', '2429:0 '),\n('2431', 'hellfire060', '530', '3483', '3483', '60', '63', '0', '-1036.95', '4000.75', '83.0333', '2.90005', '2426:0 2427:0 2432:0 '),\n('2432', 'hellfire061', '530', '3483', '3483', '60', '63', '0', '-891.162', '4017.27', '84.496', '3.16788', '2431:0 2433:0 '),\n('2433', 'hellfire062', '530', '3483', '3543', '60', '63', '0', '-799.397', '3955.75', '91.0415', '2.42568', '2432:0 2434:0 '),\n('2434', 'hellfire063', '530', '3483', '3483', '60', '63', '0', '-766.496', '3789.21', '113.362', '1.77223', '2433:0 '),\n('2435', 'hellfire064', '530', '3483', '3483', '60', '63', '0', '-593.759', '4335.47', '52.0515', '4.60437', '2428:0 2425:0 2436:0 '),\n('2436', 'hellfire065', '530', '3483', '3483', '60', '63', '0', '-336.014', '4367.15', '59.658', '3.93679', '2435:0 2437:0 2463:0 '),\n('2437', 'hellfire066', '530', '3483', '3483', '60', '63', '0', '-202.4', '4447.51', '42.6762', '3.81506', '2436:0 2438:0 2460:0 2463:0 '),\n('2438', 'hellfire067', '530', '3483', '3483', '60', '63', '0', '-100.749', '4241.25', '83.9687', '2.24269', '2437:0 2439:0 2441:0 2443:0 2459:0 '),\n('2439', 'hellfire068', '530', '3483', '3552', '60', '63', '2', '63.0268', '4335.15', '96.8814', '6.21365', '2438:0 2440:0 2441:0 '),\n('2440', 'hellfire069', '530', '3483', '3552', '60', '63', '3', '215.545', '4332.38', '119.241', '2.95661', '2439:0 '),\n('2441', 'hellfire070', '530', '3483', '3483', '60', '63', '0', '39.4389', '4153.06', '71.524', '1.85939', '2438:0 2439:0 2442:0 2443:0 2459:0 '),\n('2442', 'hellfire071', '530', '3483', '3483', '60', '63', '0', '150.282', '3945.51', '79.661', '2.2835', '2441:0 2443:0 2469:0 '),\n('2443', 'hellfire072', '530', '3483', '3483', '60', '63', '0', '-96.2588', '3960.84', '99.7364', '0.521852', '2438:0 2442:0 2441:0 2444:0 2459:0 '),\n('2444', 'hellfire073', '530', '3483', '3669', '60', '63', '0', '-120.509', '3779.67', '72.1233', '1.75885', '2443:0 2445:0 '),\n('2445', 'hellfire074', '530', '3483', '3553', '60', '63', '0', '-61.6848', '3514.21', '73.5858', '5.1667', '2444:0 2446:0 2448:0 2452:0 '),\n('2446', 'hellfire075', '530', '3483', '3553', '60', '63', '0', '318.42', '3476.5', '61.5198', '2.95581', '2445:0 2447:0 '),\n('2447', 'hellfire076', '530', '3483', '3553', '60', '63', '0', '383.974', '3310.89', '74.522', '1.91516', '2446:0 '),\n('2448', 'hellfire077', '530', '3483', '3483', '60', '63', '0', '-44.2798', '3288.99', '27.2629', '1.47534', '2445:0 2449:0 2452:0 '),\n('2449', 'hellfire078', '530', '3483', '3483', '60', '63', '0', '-43.1353', '3087.28', '-1.55873', '1.59942', '2448:0 2450:0 '),\n('2450', 'hellfire079', '530', '3483', '3483', '60', '63', '0', '312.814', '2983.21', '19.5651', '2.81914', '2399:0 2449:0 2451:0 '),\n('2451', 'hellfire080', '530', '3483', '3799', '60', '63', '0', '459.167', '3040.66', '17.0606', '3.687', '2450:0 '),\n('2452', 'hellfire081', '530', '3483', '3670', '60', '63', '0', '-182.907', '3456.14', '39.4587', '0.671851', '2445:0 2448:0 '),\n('2453', 'hellfire082', '530', '3483', '3671', '60', '63', '0', '-567.836', '3269.14', '15.2208', '4.86979', '2395:0 2454:0 '),\n('2454', 'hellfire083', '530', '3483', '3671', '60', '63', '0', '-549.666', '3476.52', '45.226', '4.64597', '2453:0 2455:0 2456:0 '),\n('2455', 'hellfire084', '530', '3483', '3671', '60', '63', '0', '-445.867', '3462.18', '37.6671', '2.82071', '2454:0 '),\n('2456', 'hellfire085', '530', '3483', '3669', '60', '63', '0', '-452.212', '3658.72', '45.9024', '0.816375', '2454:0 2457:0 '),\n('2457', 'hellfire086', '530', '3483', '3483', '60', '63', '0', '-378.049', '3871.34', '62.3491', '4.48419', '2456:0 2458:0 '),\n('2458', 'hellfire087', '530', '3483', '3669', '60', '63', '0', '-294.007', '3742.96', '51.9568', '2.11386', '2457:0 2459:0 '),\n('2459', 'hellfire088', '530', '3483', '3483', '60', '63', '0', '-203.95', '4100.77', '98.2207', '5.35677', '2438:0 2441:0 2443:0 2458:0 '),\n('2460', 'hellfire089', '530', '3483', '3483', '60', '63', '1', '-249.051', '4768.73', '14.6773', '1.56722', '2437:0 2461:0 2462:0 2463:0 2466:0 2467:0 '),\n('2461', 'hellfire090', '530', '3483', '3797', '60', '63', '0', '13.8026', '4691.45', '41.6534', '6.21284', '2460:0 2467:0 '),\n('2462', 'hellfire091', '530', '3483', '3551', '60', '63', '0', '-556.09', '4800.17', '34.169', '3.11602', '2460:0 2463:0 2466:0 '),\n('2463', 'hellfire092', '530', '3483', '3483', '60', '63', '0', '-412.14', '4578.53', '39.0585', '2.37774', '2460:0 2436:0 2437:0 2462:0 2466:0 '),\n('2464', 'hellfire093', '530', '3483', '3800', '60', '63', '0', '-259.551', '5042.36', '65.21', '1.36455', '2465:0 2471:0 '),\n('2465', 'hellfire094', '530', '3483', '3795', '60', '63', '0', '-403.556', '4975.22', '40.4154', '0.508468', '2464:0 2466:0 '),\n('2466', 'hellfire095', '530', '3483', '3795', '60', '63', '0', '-417.252', '4788.73', '19.9639', '2.94399', '2463:0 2460:0 2462:0 2465:0 '),\n('2467', 'hellfire096', '530', '3483', '3797', '60', '63', '0', '-68.76', '4846.8', '50.753', '4.86823', '2460:0 2461:0 2468:0 '),\n('2468', 'hellfire097', '530', '3483', '3797', '60', '63', '0', '173.831', '4854.22', '77.6594', '3.44272', '2467:0 '),\n('2469', 'hellfire098', '530', '3483', '3483', '60', '63', '0', '335.776', '4014.33', '100.063', '3.83622', '2442:0 2470:0 '),\n('2470', 'hellfire099', '530', '3483', '3483', '60', '63', '0', '353.816', '3871.24', '144.979', '1.47611', '2469:0 '),\n('2471', 'hellfire100', '530', '3483', '3800', '60', '63', '0', '-234.311', '5165.64', '83.9852', '4.49598', '2464:0 2472:0 '),\n('2472', 'zangar101', '530', '3521', '3521', '61', '64', '0', '-271.021', '5303.67', '41.8812', '4.77871', '2471:0 2473:0 '),\n('2473', 'zangar102', '530', '3521', '3565', '61', '64', '1', '-220.592', '5436.56', '21.669', '5.30379', '2472:0 2474:0 2475:0 '),\n('2474', 'zangar103', '530', '3521', '3521', '61', '64', '0', '-84.4992', '5395.31', '22.3401', '3.21027', '2473:0 2613:0 '),\n('2475', 'zangar104', '530', '3521', '3521', '61', '64', '0', '-395.049', '5385.52', '18.5881', '6.06676', '2473:0 2476:0 '),\n('2476', 'zangar105', '530', '3521', '3521', '61', '64', '0', '-535.462', '5435.61', '20.9825', '5.81938', '2475:0 2477:0 '),\n('2477', 'zangar106', '530', '3521', '3521', '61', '64', '0', '-672.658', '5367.99', '22.9724', '0.237551', '2476:0 2478:0 '),\n('2478', 'zangar107', '530', '3521', '3641', '61', '64', '0', '-758.891', '5282.57', '17.6121', '1.72588', '2477:0 2479:0 '),\n('2479', 'zangar108', '530', '3521', '3641', '61', '64', '0', '-813.122', '5198.88', '19.1746', '1.05202', '2478:0 2480:0 '),\n('2480', 'zangar109', '530', '3521', '3641', '61', '64', '0', '-976.189', '5260.97', '19.0927', '6.05108', '2479:0 2481:0 2626:0 '),\n('2481', 'zangar110', '530', '3521', '3521', '61', '64', '0', '-934.208', '5419.78', '22.8095', '4.46851', '2480:0 2482:0 2626:0 '),\n('2482', 'zangar111', '530', '3521', '3521', '61', '64', '0', '-966.5', '5606.91', '22.0137', '4.97508', '2481:0 2483:0 '),\n('2483', 'zangar112', '530', '3521', '3521', '61', '64', '0', '-912.293', '5682.09', '21.6937', '5.08504', '2482:0 2484:0 '),\n('2484', 'zangar113', '530', '3521', '3521', '61', '64', '0', '-913.195', '5896.44', '20.1725', '4.59652', '2483:0 2485:0 2488:0 '),\n('2485', 'zangar114', '530', '3521', '3521', '61', '64', '0', '-909.682', '6045.49', '19.7314', '4.59651', '2484:0 2486:0 2488:0 2489:0 '),\n('2486', 'zangar115', '530', '3521', '3521', '61', '64', '0', '-1037.12', '6091.11', '19.5931', '5.89242', '2485:0 2487:0 '),\n('2487', 'zangar116', '530', '3521', '3521', '61', '64', '0', '-1163.58', '6201.43', '53.0219', '5.61282', '2486:0 2625:0 '),\n('2488', 'zangar117', '530', '3521', '3841', '61', '64', '0', '-796.58', '5918.23', '22.3409', '2.31415', '2484:0 2485:0 2489:0 '),\n('2489', 'zangar118', '530', '3521', '3521', '61', '64', '0', '-701.347', '6013.97', '22.3146', '3.22521', '2488:0 2485:0 2490:0 2491:0 '),\n('2490', 'zangar119', '530', '3521', '3841', '61', '64', '0', '-592.408', '5933.75', '20.813', '5.51464', '2489:0 2491:0 '),\n('2491', 'zangar120', '530', '3521', '3521', '61', '64', '0', '-504.59', '6048.64', '23.1686', '4.20775', '2490:0 2489:0 2492:0 '),\n('2492', 'zangar121', '530', '3521', '3841', '61', '64', '0', '-495.325', '5854.59', '20.3458', '2.52376', '2491:0 2493:0 '),\n('2493', 'zangar122', '530', '3521', '3521', '61', '64', '0', '-318.55', '6013.33', '23.3657', '3.50315', '2492:0 2494:0 2608:0 '),\n('2494', 'zangar123', '530', '3521', '3819', '61', '64', '0', '-352.699', '6158.62', '21.7844', '4.91293', '2493:0 2495:0 2608:0 '),\n('2495', 'zangar124', '530', '3521', '3819', '61', '64', '0', '-338.739', '6298.09', '21.04', '4.63411', '2494:0 2496:0 '),\n('2496', 'zangar125', '530', '3521', '3819', '61', '64', '0', '-409.277', '6401.64', '21.9404', '0.801373', '2495:0 2497:0 2500:0 '),\n('2497', 'zangar126', '530', '3521', '3819', '61', '64', '0', '-230.832', '6354.36', '21.7058', '3.81024', '2496:0 2498:0 '),\n('2498', 'zangar127', '530', '3521', '3659', '61', '64', '0', '-139.857', '6456.59', '20.0973', '3.85658', '2497:0 2499:0 2607:0 '),\n('2499', 'zangar128', '530', '3521', '3659', '61', '64', '0', '-269.671', '6613.48', '23.0533', '4.34353', '2498:0 2500:0 '),\n('2500', 'zangar129', '530', '3521', '3659', '61', '64', '0', '-383.175', '6598.68', '22.9642', '4.52024', '2496:0 2499:0 2501:0 '),\n('2501', 'zangar130', '530', '3521', '3659', '61', '64', '0', '-215.725', '6703.55', '20.6145', '4.19588', '2500:0 2502:0 2503:0 '),\n('2502', 'zangar131', '530', '3521', '3659', '61', '64', '0', '-63.9463', '6759.2', '20.4434', '3.22986', '2501:0 2503:0 2509:0 '),\n('2503', 'zangar132', '530', '3521', '3659', '61', '64', '0', '-261.475', '6823.98', '21.6241', '5.85702', '2501:0 2502:0 2504:0 '),\n('2504', 'zangar133', '530', '3521', '3642', '61', '64', '0', '-208.234', '6950.07', '20.1839', '0.893301', '2503:0 2505:0 '),\n('2505', 'zangar134', '530', '3521', '3642', '61', '64', '0', '-126.36', '7041.34', '18.9083', '3.86997', '2504:0 2506:0 '),\n('2506', 'zangar135', '530', '3521', '3642', '61', '64', '0', '-50.056', '7132.44', '19.2134', '4.60817', '2505:0 2507:0 '),\n('2507', 'zangar136', '530', '3521', '3521', '61', '64', '0', '64.7648', '7212.88', '22.0782', '0.46519', '2506:0 2508:0 2516:0 2517:0 2528:0 '),\n('2508', 'zangar137', '530', '3521', '3521', '61', '64', '0', '44.854', '7014.88', '23.4767', '1.78543', '2507:0 2509:0 '),\n('2509', 'zangar138', '530', '3521', '3521', '61', '64', '0', '43.5835', '6871.99', '22.3894', '4.7567', '2508:0 2502:0 2510:0 2511:0 '),\n('2510', 'zangar139', '530', '3521', '3521', '61', '64', '0', '157.048', '6719.99', '20.4444', '2.3259', '2509:0 2511:0 2595:0 '),\n('2511', 'zangar140', '530', '3521', '3720', '61', '64', '0', '223.784', '6824.17', '25.6438', '3.74197', '2509:0 2510:0 2512:0 2595:0 '),\n('2512', 'zangar141', '530', '3521', '3720', '61', '64', '0', '234.681', '6926.14', '23.7418', '4.49203', '2511:0 2513:0 '),\n('2513', 'zangar142', '530', '3521', '3720', '61', '64', '0', '212.404', '7079.58', '35.2277', '4.69231', '2512:0 2514:0 '),\n('2514', 'zangar143', '530', '3521', '3720', '61', '64', '0', '220.362', '7208.94', '25.1738', '4.71196', '2513:0 2515:0 '),\n('2515', 'zangar144', '530', '3521', '3720', '61', '64', '0', '336.506', '7340.86', '41.5461', '4.13471', '2514:0 2516:0 2587:0 '),\n('2516', 'zangar145', '530', '3521', '3720', '61', '64', '0', '157.889', '7365.75', '22.1067', '6.02358', '2507:0 2515:0 2517:0 '),\n('2517', 'zangar146', '530', '3521', '3521', '61', '64', '0', '63.1597', '7443.51', '22.1993', '5.2932', '2507:0 2516:0 2518:0 2528:0 '),\n('2518', 'zangar147', '530', '3521', '3521', '61', '64', '0', '115.528', '7547.02', '21.6598', '4.53135', '2517:0 2519:0 2523:0 '),\n('2519', 'zangar148', '530', '3521', '3521', '61', '64', '0', '118.141', '7658.13', '21.5634', '4.72141', '2518:0 2520:0 2523:0 2529:0 2587:0 '),\n('2520', 'zangar149', '530', '3521', '3521', '61', '64', '4', '246.937', '7753.08', '23.1428', '3.93445', '2519:0 2521:0 2523:0 2529:0 2587:0 '),\n('2521', 'zangar150', '530', '3521', '3645', '61', '64', '5', '264.306', '7863.47', '23.7956', '4.64131', '2520:0 2522:0 2523:0 2529:0 '),\n('2522', 'zangar151', '530', '3521', '3521', '61', '64', '4', '449.39', '7844.62', '22.0319', '3.04694', '2521:0 2569:0 '),\n('2523', 'zangar152', '530', '3521', '3521', '61', '64', '0', '81.5617', '7740.29', '21.6356', '3.14119', '2518:0 2519:0 2520:0 2521:0 2524:0 2529:0 '),\n('2524', 'zangar153', '530', '3521', '3521', '61', '64', '0', '-28.0868', '7736.24', '20.5893', '6.25922', '2523:0 2525:0 2529:0 2536:0 '),\n('2525', 'zangar154', '530', '3521', '3521', '61', '64', '0', '-170.551', '7601.35', '23.3202', '0.757515', '2524:0 2526:0 2535:0 '),\n('2526', 'zangar155', '530', '3521', '3521', '61', '64', '0', '-174.825', '7443.51', '21.9702', '1.57433', '2525:0 2527:0 2528:0 '),\n('2527', 'zangar156', '530', '3521', '3642', '61', '64', '0', '-120.981', '7305.7', '23.422', '1.77461', '2526:0 2528:0 '),\n('2528', 'zangar157', '530', '3521', '3521', '61', '64', '0', '-20.2426', '7327.37', '23.7348', '2.19481', '2527:0 2526:0 2517:0 2507:0 '),\n('2529', 'zangar158', '530', '3521', '3521', '61', '64', '0', '84.0333', '7841.91', '22.0373', '4.55886', '2519:0 2520:0 2521:0 2523:0 2524:0 2530:0 '),\n('2530', 'zangar159', '530', '3521', '3521', '61', '64', '0', '65.13', '7971.37', '21.6779', '4.89266', '2529:0 2531:0 '),\n('2531', 'zangar160', '530', '3521', '3521', '61', '64', '0', '43.5829', '8117.3', '22.3841', '4.94372', '2530:0 2532:0 2552:0 '),\n('2532', 'zangar161', '530', '3521', '3521', '61', '64', '0', '-49.1017', '8195.83', '23.1999', '5.71343', '2531:0 2533:0 2537:0 2541:0 '),\n('2533', 'zangar162', '530', '3521', '3646', '61', '64', '0', '-209.87', '8126.35', '19.9595', '0.261968', '2532:0 2534:0 2536:0 2537:0 '),\n('2534', 'zangar163', '530', '3521', '3646', '61', '64', '0', '-261.772', '7885.5', '18.5845', '1.41258', '2533:0 2535:0 2536:0 '),\n('2535', 'zangar164', '530', '3521', '3521', '61', '64', '0', '-259.719', '7720.02', '20.8878', '1.65605', '2525:0 2534:0 '),\n('2536', 'zangar165', '530', '3521', '3646', '61', '64', '0', '-98.2706', '7905.01', '21.2267', '4.92567', '2524:0 2533:0 2534:0 '),\n('2537', 'zangar166', '530', '3521', '3521', '61', '64', '0', '-180.804', '8271.58', '22.3452', '2.13749', '2532:0 2533:0 2538:0 2541:0 '),\n('2538', 'zangar167', '530', '3521', '3521', '61', '64', '0', '-280.916', '8401.01', '22.613', '5.34193', '2537:0 2539:0 '),\n('2539', 'zangar168', '530', '3521', '3521', '61', '64', '0', '-414.115', '8416.71', '22.9544', '6.2098', '2538:0 2540:0 2903:0 '),\n('2540', 'zangar169', '530', '3521', '3521', '61', '64', '0', '-208.705', '8507.09', '22.1101', '4.05625', '2539:0 2541:0 '),\n('2541', 'zangar170', '530', '3521', '3521', '61', '64', '0', '-76.6423', '8339.54', '20.5708', '1.28772', '2537:0 2532:0 2540:0 2542:0 '),\n('2542', 'zangar171', '530', '3521', '3521', '61', '64', '0', '2.14825', '8447.62', '24.0799', '1.18326', '2541:0 2543:0 2550:0 '),\n('2543', 'zangar172', '530', '3521', '3647', '61', '64', '0', '-67.5414', '8574.38', '21.4033', '5.22493', '2542:0 2544:0 2550:0 '),\n('2544', 'zangar173', '530', '3521', '3647', '61', '64', '0', '-131.783', '8711.6', '20.1378', '5.16367', '2543:0 2545:0 '),\n('2545', 'zangar174', '530', '3521', '3647', '61', '64', '0', '-58.2395', '8845.13', '19.6236', '4.45683', '2544:0 2546:0 '),\n('2546', 'zangar175', '530', '3521', '3647', '61', '64', '0', '-158.14', '8998.32', '22.6743', '5.39853', '2545:0 2547:0 '),\n('2547', 'zangar176', '530', '3521', '3521', '61', '64', '0', '49.2289', '8919.95', '22.8353', '4.08298', '2546:0 2548:0 2566:0 '),\n('2548', 'zangar177', '530', '3521', '3658', '61', '64', '0', '191.332', '8791.02', '22.5064', '3.15621', '2547:0 2549:0 '),\n('2549', 'zangar178', '530', '3521', '3658', '61', '64', '0', '100.838', '8633.77', '22.3518', '1.01992', '2548:0 2550:0 '),\n('2550', 'zangar179', '530', '3521', '3521', '61', '64', '0', '46.3545', '8528.92', '21.3211', '3.67772', '2542:0 2543:0 2549:0 2551:0 '),\n('2551', 'zangar180', '530', '3521', '3521', '61', '64', '1', '201.143', '8506.92', '24.4625', '4.24664', '2550:0 2552:0 '),\n('2552', 'zangar181', '530', '3521', '3656', '61', '64', '0', '176.313', '8271.1', '19.3723', '2.275', '2531:0 2551:0 2553:0 '),\n('2553', 'zangar182', '530', '3521', '3656', '61', '64', '0', '285.943', '8219.3', '20.2926', '3.15229', '2552:0 2554:0 '),\n('2554', 'zangar183', '530', '3521', '3656', '61', '64', '0', '386.339', '8346.33', '22.789', '4.31625', '2553:0 2555:0 '),\n('2555', 'zangar184', '530', '3521', '3656', '61', '64', '0', '494.267', '8437.25', '21.4802', '4.07671', '2554:0 2556:0 2563:0 2567:0 '),\n('2556', 'zangar185', '530', '3521', '3656', '61', '64', '0', '608.933', '8508.26', '22.3504', '3.55914', '2555:0 2557:0 2563:0 '),\n('2557', 'zangar186', '530', '3521', '3521', '61', '64', '0', '742.61', '8532.55', '22.4318', '3.26227', '2556:0 2558:0 2562:0 2563:0 '),\n('2558', 'zangar187', '530', '3521', '3521', '61', '64', '0', '895.923', '8416.01', '24.0337', '2.57898', '2557:0 2559:0 '),\n('2559', 'zangar188', '530', '3521', '3650', '61', '64', '0', '1075.84', '8407.67', '22.4904', '3.12875', '2558:0 2560:0 2561:0 2574:0 '),\n('2560', 'zangar189', '530', '3521', '3650', '61', '64', '0', '1227.41', '8505.09', '22.644', '3.70367', '2559:0 2561:0 2575:0 '),\n('2561', 'zangar190', '530', '3521', '3650', '61', '64', '0', '1037.11', '8556.71', '23.1526', '5.52971', '2559:0 2560:0 2562:0 '),\n('2562', 'zangar191', '530', '3521', '3521', '61', '64', '0', '838.679', '8631.92', '21.121', '3.9', '2561:0 2557:0 '),\n('2563', 'zangar192', '530', '3521', '3657', '61', '64', '0', '532.243', '8648.7', '20.2148', '1.72209', '2555:0 2556:0 2557:0 2564:0 '),\n('2564', 'zangar193', '530', '3521', '3521', '61', '64', '0', '500.585', '8831.78', '29.9762', '3.31252', '2563:0 2565:0 '),\n('2565', 'zangar194', '530', '3521', '3521', '61', '64', '0', '312.939', '8988.81', '29.3602', '2.17448', '2564:0 2566:0 '),\n('2566', 'zangar195', '530', '3521', '3521', '61', '64', '0', '153.844', '9001.52', '20.6373', '4.20787', '2547:0 2565:0 '),\n('2567', 'zangar196', '530', '3521', '3643', '61', '64', '0', '634.189', '8249.73', '20.9802', '4.23537', '2555:0 2568:0 '),\n('2568', 'zangar197', '530', '3521', '3643', '61', '64', '0', '610.771', '8068.12', '19.5665', '1.60114', '2567:0 2569:0 2571:0 '),\n('2569', 'zangar198', '530', '3521', '3667', '61', '64', '0', '579.736', '7860.06', '21.923', '1.46997', '2522:0 2568:0 2570:0 '),\n('2570', 'zangar199', '530', '3521', '3667', '61', '64', '0', '737.751', '7895.31', '21.9665', '6.19807', '2569:0 2571:0 '),\n('2571', 'zangar200', '530', '3521', '3521', '61', '64', '0', '787.048', '8075.83', '19.8301', '1.19115', '2568:0 2570:0 2572:0 '),\n('2572', 'zangar201', '530', '3521', '3667', '61', '64', '0', '940.179', '8075.93', '22.3322', '3.07219', '2571:0 2573:0 2579:0 '),\n('2573', 'zangar202', '530', '3521', '3667', '61', '64', '0', '1079.94', '8078.99', '22.0839', '3.44134', '2572:0 2574:0 2578:0 '),\n('2574', 'zangar203', '530', '3521', '3640', '61', '64', '0', '1142.01', '8208.94', '18.3815', '1.68911', '2559:0 2573:0 2578:0 '),\n('2575', 'zangar204', '530', '3521', '3650', '61', '64', '0', '1365.27', '8597.28', '20.4376', '3.62905', '2560:0 2576:0 '),\n('2576', 'zangar205', '530', '3521', '3650', '61', '64', '0', '1473.46', '8617.75', '-19.2604', '3.20336', '2575:0 2577:0 '),\n('2577', 'zangar206', '530', '3521', '3651', '61', '64', '0', '1617.83', '8604.6', '-25.7602', '3.11932', '2576:0 '),\n('2578', 'zangar207', '530', '3521', '3521', '61', '64', '0', '1204.46', '7994.66', '23.5559', '2.79496', '2573:0 2574:0 2579:0 '),\n('2579', 'zangar208', '530', '3521', '3667', '61', '64', '0', '985.581', '7906.61', '21.9749', '1.94279', '2572:0 2578:0 2580:0 '),\n('2580', 'zangar209', '530', '3521', '3667', '61', '64', '0', '924.71', '7759.51', '22.2632', '4.47963', '2579:0 2581:0 '),\n('2581', 'zangar210', '530', '3521', '3667', '61', '64', '0', '972.886', '7540.98', '20.6745', '5.06474', '2580:0 2582:0 '),\n('2582', 'zangar211', '530', '3521', '3766', '61', '64', '3', '1008.04', '7381.67', '36.2454', '2.67557', '2581:0 2583:0 3077:0 '),\n('2583', 'zangar212', '530', '3521', '3521', '61', '64', '2', '888.478', '7369.16', '20.9021', '3.3785', '2582:0 2584:0 2588:0 '),\n('2584', 'zangar213', '530', '3521', '3521', '61', '64', '0', '749.898', '7401.62', '22.0246', '0.295815', '2583:0 2585:0 2588:0 '),\n('2585', 'zangar214', '530', '3521', '3653', '61', '64', '0', '578.096', '7540.84', '19.4559', '5.3043', '2584:0 2586:0 '),\n('2586', 'zangar215', '530', '3521', '3653', '61', '64', '0', '453.399', '7459.1', '23.6644', '2.9591', '2585:0 2587:0 '),\n('2587', 'zangar216', '530', '3521', '3521', '61', '64', '0', '301.56', '7502.53', '18.7007', '4.88489', '2515:0 2586:0 2520:0 2519:0 '),\n('2588', 'zangar217', '530', '3521', '3653', '61', '64', '0', '723.766', '7219.4', '18.4476', '1.52104', '2583:0 2584:0 2589:0 '),\n('2589', 'zangar218', '530', '3521', '3653', '61', '64', '0', '828.704', '7046.99', '21.9746', '5.47316', '2588:0 2590:0 '),\n('2590', 'zangar219', '530', '3521', '3521', '61', '64', '0', '813.291', '6859.8', '21.1175', '4.5346', '2589:0 2591:0 '),\n('2591', 'zangar220', '530', '3521', '3521', '61', '64', '0', '786.813', '6686.79', '19.6235', '4.77415', '2590:0 2592:0 '),\n('2592', 'zangar221', '530', '3521', '3521', '61', '64', '0', '739.145', '6548.18', '21.4284', '2.68185', '2591:0 2593:0 2600:0 '),\n('2593', 'zangar222', '530', '3521', '3653', '61', '64', '0', '533.697', '6616.1', '23.4617', '5.98523', '2592:0 2594:0 2600:0 '),\n('2594', 'zangar223', '530', '3521', '3521', '61', '64', '0', '392.669', '6497.59', '21.0234', '1.88546', '2593:0 2595:0 2596:0 2600:0 '),\n('2595', 'zangar224', '530', '3521', '3521', '61', '64', '0', '309.995', '6655.73', '21.2137', '5.01134', '2510:0 2594:0 2511:0 '),\n('2596', 'zangar225', '530', '3521', '3521', '61', '64', '0', '377.938', '6282.83', '22.023', '4.47492', '2594:0 2597:0 '),\n('2597', 'zangar226', '530', '3521', '3521', '61', '64', '0', '413.817', '6144.54', '22.2423', '1.89569', '2596:0 2598:0 2603:0 '),\n('2598', 'zangar227', '530', '3521', '3521', '61', '64', '0', '588.059', '6075.05', '22.5742', '2.63553', '2597:0 2599:0 2601:0 2624:0 '),\n('2599', 'zangar228', '530', '3521', '3818', '61', '64', '0', '603.408', '6285.69', '21.8038', '4.64065', '2598:0 2600:0 2601:0 '),\n('2600', 'zangar229', '530', '3521', '3653', '61', '64', '0', '621.81', '6442.18', '20.5988', '2.00643', '2592:0 2593:0 2594:0 2599:0 '),\n('2601', 'zangar230', '530', '3521', '3521', '61', '64', '0', '691.526', '6136.65', '24.626', '4.02491', '2598:0 2599:0 2602:0 2972:0 '),\n('2602', 'zangar231', '530', '3521', '3521', '61', '64', '0', '718.677', '6010.01', '23.0266', '4.85273', '2601:0 2624:0 2972:0 '),\n('2603', 'zangar232', '530', '3521', '3644', '61', '64', '3', '284.699', '5949', '26.4296', '1.71192', '2597:0 2604:0 2611:0 '),\n('2604', 'zangar233', '530', '3521', '3521', '61', '64', '2', '171.4', '6095.69', '21.4396', '5.75672', '2603:0 2605:0 2608:0 2611:0 '),\n('2605', 'zangar234', '530', '3521', '3521', '61', '64', '0', '220.592', '6179.94', '22.7879', '2.4926', '2604:0 2606:0 '),\n('2606', 'zangar235', '530', '3521', '3521', '61', '64', '0', '109.112', '6307.6', '20.5752', '2.47375', '2605:0 2607:0 2608:0 '),\n('2607', 'zangar236', '530', '3521', '3659', '61', '64', '0', '-2.05183', '6372.4', '21.196', '6.01275', '2498:0 2606:0 '),\n('2608', 'zangar237', '530', '3521', '3521', '61', '64', '0', '-101.637', '6148.49', '20.9712', '3.74609', '2493:0 2494:0 2606:0 2604:0 2609:0 '),\n('2609', 'zangar238', '530', '3521', '3521', '61', '64', '0', '-95.8529', '5919.89', '21.912', '1.45665', '2608:0 2610:0 '),\n('2610', 'zangar239', '530', '3521', '3521', '61', '64', '0', '13.2803', '5837.85', '22.8222', '2.53657', '2609:0 2611:0 '),\n('2611', 'zangar240', '530', '3521', '3521', '61', '64', '0', '151.585', '5801.02', '22.4062', '1.73938', '2603:0 2604:0 2610:0 2612:0 '),\n('2612', 'zangar241', '530', '3521', '3521', '61', '64', '0', '12.867', '5638.72', '21.5024', '0.850312', '2611:0 2613:0 '),\n('2613', 'zangar242', '530', '3521', '3521', '61', '64', '0', '48.9274', '5481.91', '21.872', '2.08181', '2474:0 2612:0 2614:0 2616:0 '),\n('2614', 'zangar243', '530', '3521', '3521', '61', '64', '4', '71.9609', '5332.54', '21.9147', '5.20377', '2613:0 2615:0 2616:0 '),\n('2615', 'zangar244', '530', '3521', '3718', '61', '64', '5', '85.2911', '5223.84', '22.6669', '1.80693', '2614:0 '),\n('2616', 'zangar245', '530', '3521', '3648', '61', '64', '0', '158.923', '5429.39', '21.7352', '4.09636', '2614:0 2613:0 2617:0 '),\n('2617', 'zangar246', '530', '3521', '3648', '61', '64', '0', '315.219', '5408.5', '20.9134', '6.16588', '2616:0 2618:0 2619:0 '),\n('2618', 'zangar247', '530', '3521', '3648', '61', '64', '0', '377.232', '5291.67', '16.6948', '0.491381', '2617:0 2619:0 '),\n('2619', 'zangar248', '530', '3521', '3648', '61', '64', '0', '610.457', '5425.64', '-14.6579', '4.20083', '2617:0 2618:0 2620:0 2621:0 2622:0 '),\n('2620', 'zangar249', '530', '3521', '3648', '61', '64', '0', '820.719', '5482.54', '9.38793', '3.43975', '2619:0 2621:0 '),\n('2621', 'zangar250', '530', '3521', '3648', '61', '64', '0', '675.579', '5207.73', '-0.430108', '1.71187', '2619:0 2620:0 '),\n('2622', 'zangar251', '530', '3521', '3648', '61', '64', '0', '581.932', '5617.72', '21.5502', '1.58306', '2619:0 2623:0 '),\n('2623', 'zangar252', '530', '3521', '3521', '61', '64', '0', '549.492', '5772.45', '23.2954', '1.1668', '2622:0 2624:0 '),\n('2624', 'zangar253', '530', '3521', '3521', '61', '64', '0', '569.447', '5936.2', '20.4341', '1.13146', '2623:0 2602:0 2598:0 2972:0 '),\n('2625', 'nagrand254', '530', '3521', '3521', '61', '64', '0', '-1293.68', '6268.96', '47.863', '5.30897', '2487:0 2927:0 '),\n('2626', 'zangar255', '530', '3521', '3521', '61', '64', '0', '-1072.75', '5374.44', '23.0643', '3.2316', '2480:0 2481:0 2627:0 '),\n('2627', 'tero256', '530', '3519', '3519', '61', '64', '0', '-1193.26', '5326.41', '32.1568', '3.76253', '2626:0 2628:0 '),\n('2628', 'tero257', '530', '3519', '3519', '61', '64', '0', '-1352.86', '5166.19', '60.3214', '0.730896', '2627:0 2629:0 '),\n('2629', 'tero258', '530', '3519', '3519', '61', '64', '0', '-1481.09', '5196.68', '44.2804', '2.26164', '2628:0 2630:0 '),\n('2630', 'tero259', '530', '3703', '3703', '61', '64', '0', '-1562.26', '5219.05', '26.8104', '5.79513', '2629:0 2631:0 '),\n('2631', 'tero260', '530', '3703', '3703', '61', '64', '0', '-1646.24', '5089.63', '9.06231', '3.96908', '2630:0 2632:0 2633:0 '),\n('2632', 'tero261', '530', '3519', '3519', '62', '65', '0', '-1504.23', '5007.75', '-5.38562', '2.6182', '2631:0 '),\n('2633', 'tero262', '530', '3703', '3703', '62', '65', '0', '-1767.61', '5061.37', '7.70519', '3.4303', '2631:0 2634:0 '),\n('2634', 'tero263', '530', '3703', '3703', '62', '65', '0', '-1923.14', '5054.44', '19.4908', '2.72737', '2633:0 2635:0 2636:0 2741:0 '),\n('2635', 'tero264', '530', '3519', '3519', '62', '65', '0', '-1970.49', '4974.82', '28.2638', '4.09397', '2634:0 2724:0 2741:0 '),\n('2636', 'tero265', '530', '3703', '3703', '62', '65', '0', '-2043.23', '5134.06', '8.27497', '5.68597', '2634:0 2637:0 2741:0 '),\n('2637', 'tero266', '530', '3519', '3519', '62', '65', '0', '-2181.58', '5096.17', '-21.1362', '0.23923', '2636:0 2638:0 2639:0 2640:0 2741:0 '),\n('2638', 'tero267', '530', '3519', '3519', '62', '65', '0', '-2216.99', '4909.63', '1.39859', '1.40554', '2637:0 2741:0 '),\n('2639', 'tero268', '530', '3519', '3519', '62', '65', '0', '-2303.98', '5268.43', '-9.97572', '5.28148', '2637:0 2640:0 2641:0 2644:0 '),\n('2640', 'tero269', '530', '3519', '3682', '62', '65', '0', '-2344.61', '5051.57', '-2.04758', '0.266708', '2639:0 2637:0 2644:0 '),\n('2641', 'tero270', '530', '3519', '3677', '62', '65', '0', '-2431.44', '5399.92', '1.64547', '5.51947', '2639:0 2642:0 '),\n('2642', 'tero271', '530', '3519', '3519', '62', '65', '0', '-2521.64', '5210.06', '1.76945', '1.04896', '2641:0 2643:0 2645:0 '),\n('2643', 'tero272', '530', '3519', '3682', '62', '65', '0', '-2502.78', '5113.56', '7.96009', '6.26007', '2642:0 2644:0 2645:0 '),\n('2644', 'tero273', '530', '3519', '3519', '62', '65', '0', '-2359.81', '5159.68', '-3.26821', '3.01403', '2643:0 2639:0 2640:0 '),\n('2645', 'tero274', '530', '3519', '3519', '62', '65', '0', '-2640.66', '5114.54', '-2.29', '3.12004', '2642:0 2643:0 2646:0 '),\n('2646', 'tero275', '530', '3519', '3887', '62', '65', '1', '-2764.32', '5083.04', '-6.61069', '4.7576', '2645:0 2647:0 2648:0 '),\n('2647', 'tero276', '530', '3519', '3697', '62', '65', '0', '-2753.24', '4900.43', '-9.77721', '1.5139', '2646:0 2648:0 2650:0 '),\n('2648', 'tero277', '530', '3519', '3697', '62', '65', '0', '-2924.05', '5077.7', '-21.4831', '6.27734', '2647:0 2646:0 2649:0 2650:0 '),\n('2649', 'tero278', '530', '3519', '3697', '62', '65', '0', '-2988.38', '5242.11', '-18.2224', '5.09376', '2648:0 2691:0 2693:0 '),\n('2650', 'tero279', '530', '3519', '3697', '62', '65', '0', '-2927.67', '4884.87', '-20.3937', '1.65765', '2647:0 2648:0 2651:0 '),\n('2651', 'tero280', '530', '3519', '3891', '62', '65', '0', '-2833.33', '4763.19', '-3.82034', '2.17758', '2650:0 2652:0 '),\n('2652', 'tero281', '530', '3519', '3891', '62', '65', '0', '-2735.66', '4761.53', '-7.97762', '3.14205', '2651:0 2653:0 '),\n('2653', 'tero282', '530', '3519', '3697', '62', '65', '0', '-2927.04', '4629.03', '-20.1141', '1.04898', '2652:0 2654:0 2655:0 2657:0 '),\n('2654', 'tero283', '530', '3519', '3697', '62', '65', '0', '-2792.58', '4548.65', '-5.17792', '2.36688', '2653:0 '),\n('2655', 'tero284', '530', '3519', '3697', '62', '65', '0', '-3098.66', '4626.88', '-20.2418', '0.186611', '2653:0 2656:0 2661:0 '),\n('2656', 'tero285', '530', '3519', '3697', '62', '65', '0', '-3111.3', '4451.66', '-21.8624', '1.72364', '2655:0 2657:0 '),\n('2657', 'tero286', '530', '3519', '3697', '62', '65', '0', '-2978.71', '4453.52', '-19.1914', '1.37334', '2656:0 2653:0 2658:0 2716:0 '),\n('2658', 'tero287', '530', '3519', '3697', '62', '65', '0', '-3124.74', '4312.73', '-13.4977', '1.36941', '2657:0 2659:0 2698:0 '),\n('2659', 'tero288', '530', '3519', '3697', '62', '65', '0', '-3343.1', '4318.47', '-21.2101', '0.0703571', '2658:0 2660:0 2662:0 2698:0 '),\n('2660', 'tero289', '530', '3519', '3697', '62', '65', '0', '-3251.81', '4540.47', '-21.009', '4.41204', '2659:0 2661:0 2663:0 '),\n('2661', 'tero290', '530', '3519', '3688', '62', '65', '0', '-3251.45', '4665.87', '-22.0178', '5.15817', '2660:0 2655:0 '),\n('2662', 'tero291', '530', '3519', '3892', '62', '65', '0', '-3461.56', '4373.44', '-11.6911', '5.77627', '2659:0 2663:0 2664:0 '),\n('2663', 'tero292', '530', '3519', '3697', '62', '65', '0', '-3412.64', '4543.05', '-19.8323', '4.37513', '2662:0 2660:0 2664:0 '),\n('2664', 'tero293', '530', '3519', '3697', '62', '65', '0', '-3615.55', '4423.5', '-15.264', '6.23338', '2662:0 2663:0 2665:0 2666:0 '),\n('2665', 'tero294', '530', '3519', '3885', '62', '65', '0', '-3737.19', '4335.92', '3.0303', '0.715952', '2664:0 2666:0 '),\n('2666', 'tero295', '530', '3519', '3697', '62', '65', '0', '-3717.12', '4553.09', '-15.395', '5.41343', '2664:0 2665:0 2667:0 '),\n('2667', 'tero296', '530', '3519', '3886', '62', '65', '0', '-3751.58', '4692.08', '-17.1029', '5.18959', '2666:0 2668:0 2671:0 '),\n('2668', 'tero297', '530', '3519', '3688', '62', '65', '0', '-3628.23', '4736.46', '-22.1214', '3.39967', '2667:0 2669:0 '),\n('2669', 'tero298', '530', '3519', '3688', '62', '65', '0', '-3683.64', '4880.37', '-22.2453', '4.85659', '2668:0 2670:0 '),\n('2670', 'tero299', '530', '3519', '3697', '62', '65', '0', '-3787.46', '5013.52', '-20.1657', '5.31998', '2669:0 2671:0 2672:0 '),\n('2671', 'tero300', '530', '3519', '3697', '62', '65', '0', '-3875.72', '4882.7', '-35.8103', '0.180317', '2670:0 2667:0 '),\n('2672', 'tero301', '530', '3519', '3697', '62', '65', '0', '-3756.44', '5163.25', '-22.4721', '4.73093', '2670:0 2674:0 2673:0 '),\n('2673', 'tero302', '530', '3519', '3697', '62', '65', '1', '-3750.45', '5404.46', '-3.33481', '1.38198', '2672:0 2674:0 2675:0 '),\n('2674', 'tero303', '530', '3519', '3894', '62', '65', '0', '-3634.78', '5300.46', '-21.1377', '3.63217', '2672:0 2675:0 2695:0 2673:0 '),\n('2675', 'tero304', '530', '3519', '3697', '62', '65', '0', '-3670.35', '5445.73', '-4.16488', '5.0239', '2674:0 2676:0 2695:0 2673:0 '),\n('2676', 'tero305', '530', '3519', '3697', '62', '65', '0', '-3645.73', '5559.5', '-2.14497', '4.56524', '2675:0 2677:0 '),\n('2677', 'tero306', '530', '3519', '3686', '62', '65', '0', '-3642.69', '5710.06', '-2.77685', '4.68385', '2676:0 2678:0 2679:0 '),\n('2678', 'tero307', '530', '3519', '3519', '62', '65', '0', '-3501.7', '5745.82', '0.234953', '3.52538', '2677:0 2684:0 '),\n('2679', 'tero308', '530', '3519', '3519', '62', '65', '0', '-3733.98', '5830.74', '-2.74856', '5.14723', '2677:0 2680:0 '),\n('2680', 'tero309', '530', '3519', '3519', '62', '65', '0', '-3787.12', '5986.43', '-1.72887', '4.96659', '2679:0 2681:0 '),\n('2681', 'tero310', '530', '3519', '3519', '62', '65', '0', '-3628.51', '6056.29', '-3.33948', '3.46806', '2680:0 2682:0 '),\n('2682', 'tero311', '530', '3519', '3519', '62', '65', '0', '-3508.49', '6174.6', '4.08676', '3.93145', '2681:0 2683:0 '),\n('2683', 'tero312', '530', '3519', '3519', '62', '65', '0', '-3378.56', '5998.98', '-6.51004', '2.27505', '2682:0 2684:0 2685:0 2696:0 '),\n('2684', 'tero313', '530', '3519', '3519', '62', '65', '0', '-3476.42', '5902.44', '-30.7079', '0.739594', '2683:0 2678:0 2685:0 '),\n('2685', 'tero314', '530', '3519', '3519', '62', '65', '0', '-3285.32', '5879.96', '-19.0985', '2.70702', '2684:0 2683:0 2686:0 2696:0 '),\n('2686', 'tero315', '530', '3519', '3519', '62', '65', '0', '-3364.14', '5789.3', '-1.76223', '1.10479', '2685:0 2687:0 2696:0 '),\n('2687', 'tero316', '530', '3519', '3697', '62', '65', '0', '-3305.33', '5740.49', '0.884062', '4.92025', '2686:0 2688:0 2696:0 '),\n('2688', 'tero317', '530', '3519', '3697', '62', '65', '0', '-3286.23', '5602.34', '-6.97428', '4.90454', '2687:0 2689:0 '),\n('2689', 'tero318', '530', '3519', '3697', '62', '65', '0', '-3117.93', '5582.45', '-7.6733', '6.23185', '2688:0 2690:0 2693:0 '),\n('2690', 'tero319', '530', '3519', '3697', '62', '65', '0', '-2973.64', '5517.8', '-7.12772', '5.62318', '2689:0 2691:0 2693:0 '),\n('2691', 'tero320', '530', '3519', '3697', '62', '65', '0', '-2940.15', '5358.09', '-13.875', '4.96972', '2690:0 2649:0 2692:0 2693:0 '),\n('2692', 'tero321', '530', '3519', '3697', '62', '65', '0', '-2795.19', '5341.13', '-2.81699', '5.23676', '2691:0 '),\n('2693', 'tero322', '530', '3519', '3697', '62', '65', '0', '-3141.55', '5381.37', '-22.1389', '0.524372', '2649:0 2689:0 2690:0 2691:0 2694:0 '),\n('2694', 'tero323', '530', '3519', '3697', '62', '65', '0', '-3327.94', '5329.47', '-18.7903', '0.115962', '2693:0 2695:0 '),\n('2695', 'tero324', '530', '3519', '3697', '62', '65', '0', '-3499.7', '5387.05', '-17.1808', '2.91198', '2694:0 2674:0 2675:0 '),\n('2696', 'tero325', '530', '3519', '3519', '62', '65', '0', '-3184.45', '5888', '2.6866', '3.28897', '2683:0 2685:0 2686:0 2687:0 2697:0 2777:0 '),\n('2697', 'tero326', '530', '3519', '3519', '62', '65', '0', '-3032.12', '5978.81', '4.34466', '3.72093', '2696:0 2777:0 '),\n('2698', 'tero327', '530', '3519', '3697', '62', '65', '0', '-3134.88', '4193.43', '-7.28336', '1.29796', '2658:0 2659:0 2699:0 '),\n('2699', 'tero328', '530', '3519', '3697', '62', '65', '0', '-3028.19', '4178.94', '-0.0653765', '2.95906', '2698:0 2700:0 '),\n('2700', 'tero329', '530', '3519', '3519', '62', '65', '0', '-2977.23', '4157.96', '8.11812', '3.04232', '2699:0 2701:0 '),\n('2701', 'tero330', '530', '3519', '3684', '62', '65', '3', '-2960.39', '4073.83', '2.27582', '5.22886', '2700:0 2702:0 '),\n('2702', 'tero331', '530', '3519', '3684', '62', '65', '3', '-2931.59', '3983.95', '-0.908721', '4.85187', '2701:0 2703:0 '),\n('2703', 'tero332', '530', '3519', '3519', '62', '65', '2', '-2826.95', '3982.66', '1.7483', '3.08078', '2702:0 2704:0 '),\n('2704', 'tero333', '530', '3519', '3519', '62', '65', '0', '-2775.95', '3939.94', '2.93918', '0.30046', '2703:0 2705:0 '),\n('2705', 'tero334', '530', '3519', '3519', '62', '65', '0', '-2653.89', '3959.73', '4.49025', '3.42242', '2704:0 2706:0 2745:0 '),\n('2706', 'tero335', '530', '3519', '3519', '62', '65', '0', '-2556.49', '4106.29', '1.74147', '4.38846', '2705:0 2707:0 2744:0 '),\n('2707', 'tero336', '530', '3519', '3519', '62', '65', '0', '-2371.13', '4150.23', '2.76251', '3.40672', '2706:0 2708:0 2717:0 '),\n('2708', 'tero337', '530', '3519', '3519', '62', '65', '0', '-2284.4', '4192.35', '1.1876', '3.57951', '2707:0 2709:0 2717:0 '),\n('2709', 'tero338', '530', '3519', '3675', '62', '65', '0', '-2258.83', '4242.98', '1.82659', '4.04289', '2708:0 2710:0 2717:0 '),\n('2710', 'tero339', '530', '3519', '3519', '62', '65', '0', '-2454.44', '4246.04', '1.04828', '6.28128', '2709:0 2711:0 '),\n('2711', 'tero340', '530', '3519', '3519', '62', '65', '4', '-2553.08', '4300.19', '21.2595', '5.70952', '2710:0 2712:0 '),\n('2712', 'tero341', '530', '3519', '3683', '62', '65', '5', '-2594.46', '4387.9', '29.7655', '5.39144', '2711:0 2713:0 '),\n('2713', 'tero342', '530', '3519', '3683', '62', '65', '5', '-2656.03', '4422.89', '36.1553', '5.66241', '2712:0 2714:0 '),\n('2714', 'tero343', '530', '3519', '3683', '62', '65', '4', '-2719.28', '4376.75', '22.1052', '0.28636', '2713:0 2715:0 '),\n('2715', 'tero344', '530', '3519', '3697', '62', '65', '0', '-2834.82', '4335.44', '5.95973', '3.39654', '2714:0 2716:0 '),\n('2716', 'tero345', '530', '3519', '3697', '62', '65', '0', '-2909.54', '4349.69', '0.308415', '2.08492', '2715:0 2657:0 '),\n('2717', 'tero346', '530', '3519', '3675', '62', '65', '0', '-2170.52', '4243.01', '5.56803', '3.39654', '2707:0 2708:0 2709:0 2718:0 2776:0 '),\n('2718', 'tero347', '530', '3519', '3675', '62', '65', '0', '-2148.84', '4189.65', '7.46099', '4.90842', '2717:0 2719:0 2720:0 2776:0 '),\n('2719', 'tero348', '530', '3519', '3519', '62', '65', '0', '-2169.46', '4024.43', '0.27975', '4.58248', '2718:0 2742:0 2747:0 '),\n('2720', 'tero349', '530', '3519', '3675', '62', '65', '0', '-2043.89', '4276.14', '4.85305', '3.85599', '2718:0 2721:0 2734:0 2776:0 '),\n('2721', 'tero350', '530', '3519', '3519', '62', '65', '0', '-2003.56', '4443.33', '7.66134', '1.22491', '2720:0 2722:0 2734:0 2739:0 2776:0 '),\n('2722', 'tero351', '530', '3519', '3674', '62', '65', '0', '-1957.79', '4600.09', '4.55853', '1.42126', '2721:0 2723:0 2731:0 2734:0 2739:0 '),\n('2723', 'tero352', '530', '3519', '3674', '62', '65', '0', '-1958.96', '4765.62', '-1.86355', '1.51943', '2722:0 2724:0 2739:0 2741:0 '),\n('2724', 'tero353', '530', '3519', '3519', '62', '65', '0', '-1920.31', '4893.8', '2.58999', '4.29189', '2723:0 2635:0 2725:0 2741:0 '),\n('2725', 'tero354', '530', '3519', '3674', '62', '65', '0', '-1767.42', '4808.53', '10.9381', '2.60326', '2724:0 2726:0 '),\n('2726', 'tero355', '530', '3519', '3519', '62', '65', '0', '-1610.9', '4687.94', '-0.462587', '3.37452', '2725:0 2727:0 '),\n('2727', 'tero356', '530', '3519', '3519', '62', '65', '0', '-1438.54', '4646.53', '23.7191', '3.09413', '2726:0 2728:0 '),\n('2728', 'tero357', '530', '3519', '3689', '62', '65', '0', '-1505.3', '4470.55', '41.7643', '1.30342', '2727:0 2729:0 2733:0 '),\n('2729', 'tero358', '530', '3519', '3674', '62', '65', '0', '-1652.18', '4568.13', '2.67411', '5.85088', '2728:0 2730:0 '),\n('2730', 'tero359', '530', '3519', '3674', '62', '65', '0', '-1796.78', '4588.16', '10.9079', '6.12577', '2729:0 2731:0 2732:0 2734:0 '),\n('2731', 'tero360', '530', '3519', '3674', '62', '65', '0', '-1895.32', '4551.89', '11.162', '0.506242', '2730:0 2722:0 2732:0 2734:0 2739:0 '),\n('2732', 'tero361', '530', '3519', '3689', '62', '65', '0', '-1732.56', '4448.64', '2.34425', '5.26889', '2731:0 2730:0 2733:0 2734:0 '),\n('2733', 'tero362', '530', '3519', '3689', '62', '65', '0', '-1608.22', '4353.23', '36.5945', '1.16519', '2732:0 2728:0 '),\n('2734', 'tero363', '530', '3519', '3519', '62', '65', '0', '-1921.27', '4373.25', '1.92765', '2.16501', '2720:0 2721:0 2722:0 2730:0 2731:0 2732:0 2735:0 2776:0 '),\n('2735', 'tero364', '530', '3519', '3519', '62', '65', '0', '-1840.29', '4219.11', '25.1803', '2.004', '2734:0 2736:0 2776:0 '),\n('2736', 'tero365', '530', '3519', '3519', '62', '65', '0', '-1752.97', '4184.94', '57.0737', '5.13381', '2735:0 2737:0 2776:0 '),\n('2737', 'tero366', '530', '3519', '3858', '62', '65', '0', '-1716.88', '4074.81', '63.5817', '4.67042', '2736:0 2738:0 '),\n('2738', 'tero367', '530', '3519', '3858', '62', '65', '0', '-1691.82', '3935.7', '48.2267', '4.84636', '2737:0 2419:0 '),\n('2739', 'tero368', '530', '3519', '3519', '62', '65', '0', '-2102.76', '4635.13', '-7.65692', '2.95747', '2721:0 2722:0 2723:0 2731:0 2740:0 '),\n('2740', 'tero369', '530', '3519', '3519', '62', '65', '0', '-2257.36', '4704.28', '-0.0780256', '1.2021', '2739:0 '),\n('2741', 'tero370', '530', '3519', '3519', '62', '65', '0', '-2070.88', '4924.17', '13.5597', '3.10277', '2634:0 2635:0 2636:0 2637:0 2638:0 2723:0 2724:0 '),\n('2742', 'tero371', '530', '3519', '3519', '62', '65', '0', '-2246.8', '3880.41', '2.21742', '1.23746', '2719:0 2743:0 2747:0 '),\n('2743', 'tero372', '530', '3519', '3519', '62', '65', '0', '-2340.28', '3972.87', '-13.2572', '5.73387', '2742:0 2744:0 2747:0 '),\n('2744', 'tero373', '530', '3519', '3519', '62', '65', '0', '-2488.61', '4019.54', '0.242718', '5.94199', '2743:0 2706:0 2746:0 '),\n('2745', 'tero374', '530', '3519', '3860', '62', '65', '0', '-2554.91', '3912.09', '9.61175', '2.80825', '2705:0 2746:0 '),\n('2746', 'tero375', '530', '3519', '3860', '62', '65', '0', '-2485.03', '3909.12', '5.70774', '1.75582', '2745:0 2744:0 '),\n('2747', 'tero376', '530', '3519', '3519', '62', '65', '0', '-2259.61', '3793.94', '0.912792', '1.33958', '2719:0 2742:0 2743:0 2748:0 2771:0 '),\n('2748', 'tero377', '530', '3519', '3519', '62', '65', '0', '-2386.92', '3640.31', '1.09836', '4.00208', '2747:0 2749:0 2758:0 '),\n('2749', 'tero378', '530', '3519', '3519', '62', '65', '0', '-2479.53', '3552.42', '1.40969', '5.89488', '2748:0 2750:0 2759:0 '),\n('2750', 'tero379', '530', '3519', '3519', '62', '65', '0', '-2345.97', '3468.35', '-9.89249', '2.70223', '2749:0 2751:0 2759:0 '),\n('2751', 'tero380', '530', '3519', '3519', '62', '65', '0', '-2312.38', '3409.64', '-11.2993', '4.48901', '2750:0 2752:0 '),\n('2752', 'tero381', '530', '3519', '3681', '62', '65', '0', '-2354.51', '3272.69', '-1.60544', '1.28851', '2751:0 2753:0 '),\n('2753', 'tero382', '530', '3519', '3681', '62', '65', '0', '-2370.38', '3203.41', '-1.58182', '4.34763', '2752:0 2754:0 2762:0 '),\n('2754', 'tero383', '530', '3519', '3681', '62', '65', '0', '-2266.46', '3160.45', '-5.07597', '2.81611', '2753:0 2755:0 '),\n('2755', 'tero384', '530', '3519', '3519', '62', '65', '0', '-2151', '3259.96', '-30.9173', '0.993986', '2754:0 2756:0 '),\n('2756', 'tero385', '530', '3519', '3519', '62', '65', '0', '-2122.05', '3416.4', '-46.8967', '4.54007', '2755:0 2757:0 2771:0 '),\n('2757', 'tero386', '530', '3519', '3519', '62', '65', '0', '-2185.17', '3533.98', '-39.5174', '5.06236', '2756:0 2758:0 2771:0 '),\n('2758', 'tero387', '530', '3519', '3519', '62', '65', '0', '-2281.3', '3632.39', '-12.7757', '5.10555', '2757:0 2748:0 2771:0 '),\n('2759', 'tero388', '530', '3519', '3519', '62', '65', '0', '-2591.73', '3492.79', '0.37378', '0.569874', '2749:0 2750:0 2760:0 '),\n('2760', 'tero389', '530', '3519', '3519', '62', '65', '0', '-2706.59', '3361.89', '-0.445352', '4.0649', '2759:0 2761:0 2763:0 2764:0 '),\n('2761', 'tero390', '530', '3519', '3519', '62', '65', '0', '-2599.6', '3260.29', '1.92252', '2.39202', '2760:0 2762:0 2763:0 '),\n('2762', 'tero391', '530', '3519', '3519', '62', '65', '0', '-2474.91', '3212.52', '3.71098', '0.644506', '2761:0 2753:0 '),\n('2763', 'tero392', '530', '3519', '3519', '62', '65', '0', '-2789.26', '3261.1', '5.82088', '0.813367', '2760:0 2761:0 3534:0 '),\n('2764', 'tero393', '530', '3519', '3685', '62', '65', '0', '-2834.79', '3413.38', '-40.4077', '5.88312', '2760:0 2765:0 2770:0 '),\n('2765', 'tero394', '530', '3519', '3519', '62', '65', '0', '-2792.39', '3494.53', '-29.9885', '3.12636', '2764:0 2766:0 '),\n('2766', 'tero395', '530', '3519', '3685', '62', '65', '0', '-2893.22', '3498.45', '-28.8532', '2.48233', '2765:0 2767:0 '),\n('2767', 'tero396', '530', '3519', '3685', '62', '65', '0', '-2966.27', '3553.99', '-6.76611', '5.48021', '2766:0 2768:0 '),\n('2768', 'tero397', '530', '3519', '3685', '62', '65', '0', '-2986.16', '3462.38', '0.040144', '1.25475', '2767:0 2769:0 '),\n('2769', 'tero398', '530', '3519', '3685', '62', '65', '0', '-2966.04', '3366.93', '-1.18287', '0.0020256', '2768:0 2770:0 '),\n('2770', 'tero399', '530', '3519', '3519', '62', '65', '0', '-2877.47', '3356.32', '-19.7096', '2.96298', '2769:0 2764:0 '),\n('2771', 'tero400', '530', '3519', '3519', '62', '65', '0', '-2096.95', '3654.03', '-54.8181', '4.15287', '2747:0 2756:0 2757:0 2758:0 2772:0 '),\n('2772', 'tero401', '530', '3519', '3519', '62', '65', '0', '-2064.06', '3807.53', '1.04682', '4.11754', '2771:0 2773:0 '),\n('2773', 'tero402', '530', '3519', '3676', '62', '65', '0', '-1908.63', '3920.4', '-2.85436', '0.610731', '2772:0 2774:0 2775:0 '),\n('2774', 'tero403', '530', '3519', '3519', '62', '65', '0', '-1975.78', '4077.99', '-0.0257859', '4.60841', '2773:0 2775:0 2776:0 '),\n('2775', 'tero404', '530', '3519', '3676', '62', '65', '0', '-2060.38', '3925.05', '-0.749629', '0.524347', '2774:0 2773:0 '),\n('2776', 'tero405', '530', '3519', '3519', '62', '65', '0', '-1932.67', '4229.67', '0.0246133', '4.45526', '2717:0 2718:0 2720:0 2721:0 2734:0 2735:0 2736:0 2774:0 '),\n('2777', 'nag406', '530', '3518', '3788', '62', '65', '0', '-2979.16', '5983.95', '6.75645', '5.87684', '2696:0 2697:0 2778:0 '),\n('2778', 'nag407', '530', '3518', '3788', '64', '67', '0', '-2903.9', '5958.93', '14.5613', '0.547909', '2777:0 2779:0 '),\n('2779', 'nag408', '530', '3518', '3788', '64', '67', '0', '-2695.32', '6074.17', '39.2839', '0.398684', '2778:0 2780:0 '),\n('2780', 'nag409', '530', '3518', '3518', '64', '67', '0', '-2642.01', '6196.52', '35.4889', '4.38459', '2779:0 2781:0 2784:0 '),\n('2781', 'nag410', '530', '3518', '3610', '64', '67', '0', '-2584.26', '6153', '22.5432', '1.45591', '2780:0 2782:0 2832:0 '),\n('2782', 'nag411', '530', '3518', '3518', '64', '67', '0', '-2469.6', '6354.46', '29.3999', '3.93692', '2781:0 2783:0 2802:0 2822:0 '),\n('2783', 'nag412', '530', '3518', '3518', '64', '67', '0', '-2598.81', '6353.52', '38.4982', '4.67519', '2782:0 2784:0 2802:0 '),\n('2784', 'nag413', '530', '3518', '3518', '64', '67', '0', '-2647.16', '6298.81', '39.1645', '4.36889', '2783:0 2780:0 2785:0 '),\n('2785', 'nag414', '530', '3518', '3518', '64', '67', '0', '-2698.48', '6403.1', '37.6375', '5.24131', '2784:0 2786:0 '),\n('2786', 'nag416', '530', '3518', '3637', '64', '67', '0', '-2811.55', '6437.45', '63.1489', '2.87099', '2787:0 2788:0 2792:0 2785:0 '),\n('2787', 'nag417', '530', '3518', '3637', '64', '67', '0', '-2883.12', '6557.15', '51.9561', '5.05205', '2786:0 2790:0 2793:0 '),\n('2788', 'nag418', '530', '3518', '3637', '64', '67', '0', '-2866.92', '6391.89', '80.9253', '0.732363', '2786:0 2789:0 '),\n('2789', 'nag419', '530', '3518', '3637', '64', '67', '0', '-2947.68', '6377.55', '94.6931', '0.234009', '2788:0 2790:0 2791:0 '),\n('2790', 'nag420', '530', '3518', '3637', '64', '67', '0', '-2933.99', '6526.24', '74.3112', '5.85317', '2787:0 2789:0 '),\n('2791', 'nag421', '530', '3518', '3637', '64', '67', '0', '-2858.26', '6300.73', '73.5168', '2.16181', '2789:0 2792:0 '),\n('2792', 'nag422', '530', '3518', '3637', '64', '67', '0', '-2800.78', '6320.06', '63.9422', '1.52171', '2791:0 2786:0 '),\n('2793', 'nag423', '530', '3518', '3518', '64', '67', '0', '-2813.58', '6624.23', '27.952', '0.826629', '2787:0 2794:0 2797:0 '),\n('2794', 'nag424', '530', '3518', '3518', '64', '67', '0', '-2876.27', '6701.94', '18.9403', '5.46206', '2793:0 2795:0 '),\n('2795', 'nag425', '530', '3518', '3518', '64', '67', '0', '-2695.5', '6579.52', '23.3102', '2.71395', '2794:0 2796:0 '),\n('2796', 'nag426', '530', '3518', '3518', '64', '67', '0', '-2618.02', '6729.9', '-1.1338', '4.0884', '2795:0 2797:0 '),\n('2797', 'nag427', '530', '3518', '3518', '64', '67', '0', '-2762.9', '6813.59', '-4.67732', '4.5989', '2793:0 2796:0 2798:0 2933:0 '),\n('2798', 'nag428', '530', '3518', '3518', '64', '67', '0', '-2754.65', '6993.51', '-7.49834', '4.92564', '2797:0 2799:0 2933:0 2934:0 '),\n('2799', 'nag429', '530', '3518', '3518', '64', '67', '0', '-2554.45', '7061.91', '-8.95898', '0.31535', '2798:0 2800:0 2803:0 '),\n('2800', 'nag430', '530', '3518', '3518', '64', '67', '0', '-2401.18', '6918.47', '-1.9365', '5.18482', '2799:0 2801:0 2803:0 2814:0 2825:0 '),\n('2801', 'nag431', '530', '3518', '3518', '64', '67', '0', '-2443.4', '6718.82', '0.5495', '4.75286', '2800:0 2802:0 2824:0 '),\n('2802', 'nag432', '530', '3518', '3518', '64', '67', '0', '-2465.96', '6485.46', '18.388', '4.48583', '2801:0 2782:0 2783:0 '),\n('2803', 'nag433', '530', '3518', '3518', '64', '67', '0', '-2495.17', '7067.29', '-6.61379', '5.16519', '2799:0 2800:0 2804:0 2814:0 '),\n('2804', 'nag434', '530', '3518', '3518', '64', '67', '2', '-2545.1', '7142.88', '17.2089', '5.26259', '2803:0 2805:0 '),\n('2805', 'nag435', '530', '3518', '3626', '64', '67', '3', '-2587.61', '7240.05', '13.2805', '5.09373', '2804:0 2806:0 2807:0 '),\n('2806', 'nag436', '530', '3518', '3626', '64', '67', '2', '-2552.46', '7299.13', '13.4929', '4.96416', '2805:0 2809:0 '),\n('2807', 'nag437', '530', '3518', '3626', '64', '67', '2', '-2670.89', '7210.11', '23.8723', '0.310654', '2805:0 2808:0 '),\n('2808', 'nag438', '530', '3518', '3626', '64', '67', '3', '-2655.58', '7280.08', '30.7964', '4.57931', '2807:0 '),\n('2809', 'nag439', '530', '3518', '3626', '64', '67', '2', '-2487.77', '7333.59', '-15.1601', '0.389211', '2806:0 2810:0 '),\n('2810', 'nag440', '530', '3518', '3518', '64', '67', '2', '-2287.49', '7419.75', '-15.9035', '3.46169', '2809:0 2811:0 2867:0 '),\n('2811', 'nag441', '530', '3518', '3518', '64', '67', '0', '-2167.73', '7320.37', '-34.5989', '5.71198', '2810:0 2866:0 2812:0 '),\n('2812', 'nag443', '530', '3518', '3705', '64', '67', '0', '-2271.92', '7267.29', '-57.0529', '4.8127', '2813:0 2811:0 '),\n('2813', 'nag444', '530', '3518', '3705', '64', '67', '0', '-2261.19', '7161.5', '-56.5907', '4.81663', '2814:0 2815:0 2812:0 '),\n('2814', 'nag445', '530', '3518', '3518', '64', '67', '0', '-2347.48', '7041.26', '-12.5344', '2.817', '2813:0 2800:0 2803:0 '),\n('2815', 'nag447', '530', '3518', '3705', '64', '67', '0', '-2116.24', '7209.42', '-112.779', '5.97431', '2813:0 2816:0 '),\n('2816', 'nag448', '530', '3518', '3705', '64', '67', '0', '-1904.26', '7175.34', '-92.9691', '3.12725', '2817:0 2815:0 '),\n('2817', 'nag449', '530', '3518', '3705', '64', '67', '0', '-1985.26', '6900.65', '-85.609', '5.34993', '2816:0 2818:0 '),\n('2818', 'nag450', '530', '3518', '3518', '64', '67', '0', '-1848.57', '6696.54', '-53.151', '5.40883', '2817:0 2819:0 2826:0 '),\n('2819', 'nag451', '530', '3518', '3518', '64', '67', '0', '-1730.63', '6547.09', '19.5667', '5.00434', '2818:0 2820:0 2826:0 2839:0 2843:0 '),\n('2820', 'nag452', '530', '3518', '3518', '64', '67', '0', '-1929.46', '6510.46', '16.1863', '2.96231', '2819:0 2821:0 2839:0 2928:0 '),\n('2821', 'nag453', '530', '3518', '3638', '64', '67', '0', '-2134.61', '6517.76', '14.0285', '6.16673', '2820:0 2822:0 2823:0 2839:0 '),\n('2822', 'nag454', '530', '3518', '3518', '64', '67', '0', '-2312.35', '6407.62', '22.8307', '0.6603', '2821:0 2782:0 2823:0 '),\n('2823', 'nag455', '530', '3518', '3518', '64', '67', '0', '-2275.72', '6586.73', '3.55526', '5.16535', '2822:0 2821:0 2824:0 2831:0 '),\n('2824', 'nag456', '530', '3518', '3518', '64', '67', '0', '-2337.25', '6706.87', '-0.736603', '5.08052', '2823:0 2801:0 '),\n('2825', 'nag457', '530', '3518', '3518', '64', '67', '0', '-2230.6', '6874.1', '-6.45156', '5.78973', '2800:0 '),\n('2826', 'nag458', '530', '3518', '3518', '64', '67', '0', '-1596.41', '6719.35', '6.94102', '2.95446', '2819:0 2818:0 2827:0 2843:0 '),\n('2827', 'nag459', '530', '3518', '3518', '64', '67', '0', '-1749.49', '6887.02', '-31.8672', '3.0919', '2826:0 2828:0 2856:0 '),\n('2828', 'nag460', '530', '3518', '3705', '64', '67', '0', '-2033.22', '6893.42', '-39.0869', '0.112087', '2827:0 2829:0 '),\n('2829', 'nag461', '530', '3518', '3638', '64', '67', '0', '-2099.87', '6812.26', '-29.9742', '0.936751', '2828:0 2830:0 '),\n('2830', 'nag462', '530', '3518', '3638', '64', '67', '0', '-2097.69', '6747.79', '-3.22856', '3.89457', '2829:0 2831:0 '),\n('2831', 'nag463', '530', '3518', '3638', '64', '67', '0', '-2181.79', '6690.97', '-0.800369', '0.623385', '2830:0 2823:0 '),\n('2832', 'nag464', '530', '3518', '3610', '64', '67', '0', '-2569.73', '6270.11', '18.4891', '5.91894', '2781:0 2833:0 '),\n('2833', 'nag465', '530', '3518', '3610', '64', '67', '0', '-2480.31', '6262.64', '30.7263', '5.11194', '2832:0 2834:0 '),\n('2834', 'nag466', '530', '3518', '3610', '64', '67', '0', '-2447.6', '6170.75', '50.9756', '3.42333', '2833:0 2835:0 '),\n('2835', 'nag467', '530', '3518', '3610', '64', '67', '0', '-2505.35', '6175.86', '59.938', '5.6892', '2834:0 2836:0 '),\n('2836', 'nag468', '530', '3518', '3610', '64', '67', '0', '-2439.68', '6122.93', '84.0967', '2.43372', '2835:0 2837:0 '),\n('2837', 'nag469', '530', '3518', '3610', '64', '67', '0', '-2332.91', '6161.97', '53.5534', '0.177271', '2836:0 2838:0 '),\n('2838', 'nag470', '530', '3518', '3610', '64', '67', '0', '-2259.12', '6100.84', '76.839', '2.48242', '2837:0 '),\n('2839', 'nag471', '530', '3518', '3518', '64', '67', '0', '-1938.01', '6408.13', '38.4565', '3.95504', '2819:0 2820:0 2821:0 2840:0 2928:0 '),\n('2840', 'nag472', '530', '3518', '3518', '64', '67', '0', '-2080.87', '6349.27', '43.0054', '5.9188', '2839:0 2841:0 2928:0 '),\n('2841', 'nag473', '530', '3518', '3634', '64', '67', '0', '-1853.87', '6319.73', '46.4678', '2.96543', '2840:0 2842:0 2928:0 '),\n('2842', 'nag474', '530', '3518', '3518', '64', '67', '0', '-1699.25', '6393.14', '40.5718', '0.499271', '2841:0 2843:0 2927:0 '),\n('2843', 'nag475', '530', '3518', '3518', '64', '67', '0', '-1534.13', '6557.83', '19.5951', '2.01038', '2826:0 2842:0 2819:0 2844:0 2927:0 '),\n('2844', 'nag476', '530', '3518', '3518', '64', '67', '0', '-1482.81', '6727.6', '24.7441', '1.27603', '2843:0 2845:0 '),\n('2845', 'nag477', '530', '3518', '3518', '64', '67', '0', '-1390.93', '6854.77', '28.5326', '0.624149', '2844:0 2856:0 2853:0 '),\n('2846', 'nag480', '530', '3518', '3613', '64', '67', '4', '-1409.34', '7112.02', '33.814', '1.09183', '2847:0 2853:0 '),\n('2847', 'nag481', '530', '3518', '3613', '64', '67', '5', '-1329.62', '7212.68', '33.1588', '0.853479', '2846:0 2848:0 2855:0 '),\n('2848', 'nag482', '530', '3518', '3613', '64', '67', '4', '-1270.74', '7314.59', '33.6816', '4.21027', '2847:0 2849:0 '),\n('2849', 'nag483', '530', '3518', '3613', '64', '67', '4', '-1220.36', '7373.07', '33.23', '4.20635', '2848:0 2850:0 2851:0 '),\n('2850', 'nag484', '530', '3518', '3518', '64', '67', '0', '-1212.08', '7477.88', '22.0868', '1.54857', '2849:0 2862:0 2926:0 '),\n('2851', 'nag485', '530', '3518', '3613', '64', '67', '4', '-1182.14', '7317.1', '34.1095', '4.44589', '2849:0 2852:0 '),\n('2852', 'nag486', '530', '3518', '3613', '64', '67', '4', '-1195.71', '7212.96', '50.7515', '1.47708', '2851:0 2854:0 '),\n('2853', 'nag487', '530', '3518', '3613', '64', '67', '4', '-1266.65', '6971.73', '37.8915', '2.73527', '2845:0 2846:0 2854:0 '),\n('2854', 'nag488', '530', '3518', '3613', '64', '67', '5', '-1222.4', '7167.59', '57.2656', '4.44744', '2852:0 2855:0 2853:0 '),\n('2855', 'nag489', '530', '3518', '3613', '64', '67', '4', '-1276.87', '7200.65', '48.3758', '5.06006', '2847:0 2854:0 '),\n('2856', 'nag491', '530', '3518', '3518', '64', '67', '0', '-1550.75', '6994.79', '2.3684', '5.6216', '2845:0 2827:0 2857:0 '),\n('2857', 'nag492', '530', '3518', '3518', '64', '67', '0', '-1663.57', '7019.01', '0.239528', '1.55716', '2856:0 2858:0 2864:0 '),\n('2858', 'nag493', '530', '3518', '3518', '64', '67', '0', '-1624.79', '7247.01', '1.99533', '4.52597', '2857:0 2859:0 2864:0 '),\n('2859', 'nag494', '530', '3518', '3518', '64', '67', '0', '-1561.04', '7386.09', '1.02012', '0.650024', '2858:0 2860:0 2863:0 '),\n('2860', 'nag495', '530', '3518', '3518', '64', '67', '0', '-1369.87', '7525.98', '8.40119', '6.06534', '2859:0 2861:0 2968:0 '),\n('2861', 'nag496', '530', '3518', '3628', '64', '67', '0', '-1342.35', '7749.72', '-4.85434', '4.51025', '2860:0 2862:0 2959:0 '),\n('2862', 'nag497', '530', '3518', '3518', '64', '67', '0', '-1244.21', '7675', '9.34848', '4.90297', '2861:0 2850:0 2919:0 '),\n('2863', 'nag498', '530', '3518', '3518', '64', '67', '0', '-1822.25', '7460.83', '-6.36199', '6.02215', '2859:0 2864:0 2971:0 '),\n('2864', 'nag499', '530', '3518', '3518', '64', '67', '0', '-1788.32', '7255.55', '-7.10964', '1.73702', '2863:0 2858:0 2857:0 2865:0 '),\n('2865', 'nag500', '530', '3518', '3518', '64', '67', '0', '-1876.28', '7247.82', '-15.0226', '2.58134', '2864:0 2866:0 '),\n('2866', 'nag501', '530', '3518', '3518', '64', '67', '0', '-2010.2', '7318.56', '-33.8028', '5.83525', '2865:0 2811:0 '),\n('2867', 'nag502', '530', '3518', '3518', '64', '67', '0', '-2284.88', '7613.96', '-8.38883', '4.91632', '2810:0 2868:0 2869:0 2882:0 '),\n('2868', 'nag503', '530', '3518', '3518', '64', '67', '0', '-2110.77', '7507.01', '-30.9661', '2.75255', '2867:0 '),\n('2869', 'nag504', '530', '3518', '3518', '64', '67', '0', '-2280.53', '7760.34', '-25.2768', '3.08634', '2867:0 2870:0 2882:0 2953:0 '),\n('2870', 'nag505', '530', '3518', '3631', '64', '67', '0', '-2202.48', '7982.31', '-19.9501', '4.31156', '2869:0 2871:0 2884:0 2953:0 '),\n('2871', 'nag506', '530', '3518', '3518', '64', '67', '0', '-2164.5', '8163.38', '-23.2432', '1.37024', '2870:0 2872:0 2884:0 2949:0 '),\n('2872', 'nag507', '530', '3518', '3518', '64', '67', '0', '-2186.27', '8355.19', '-20.7293', '1.74723', '2871:0 2873:0 2885:0 2949:0 '),\n('2873', 'nag508', '530', '3518', '3518', '64', '67', '0', '-2261.53', '8552.19', '-18.4527', '1.93573', '2872:0 2874:0 2885:0 2886:0 2887:0 '),\n('2874', 'nag509', '530', '3518', '3631', '64', '67', '0', '-2454.9', '8618.3', '-25.5244', '2.80359', '2873:0 2875:0 2886:0 '),\n('2875', 'nag510', '530', '3518', '3518', '64', '67', '0', '-2638.28', '8663.06', '-21.4046', '2.94104', '2874:0 2876:0 2886:0 '),\n('2876', 'nag511', '530', '3518', '3631', '64', '67', '0', '-2824.97', '8623.37', '-27.21', '4.0995', '2875:0 2877:0 '),\n('2877', 'nag512', '530', '3518', '3518', '64', '67', '0', '-2867.65', '8450.08', '-30.1391', '4.44507', '2876:0 2878:0 '),\n('2878', 'nag513', '530', '3518', '3631', '64', '67', '0', '-2899.04', '8250.79', '-34.7269', '4.57858', '2877:0 2879:0 '),\n('2879', 'nag514', '530', '3518', '3518', '64', '67', '0', '-2888.4', '8048.68', '-26.7216', '5.47001', '2878:0 2880:0 '),\n('2880', 'nag515', '530', '3518', '3518', '64', '67', '0', '-2777.53', '7867.47', '-33.0086', '5.33648', '2879:0 2881:0 2938:0 '),\n('2881', 'nag516', '530', '3518', '3518', '64', '67', '0', '-2646.42', '7719.28', '-30.5333', '5.53675', '2880:0 2882:0 2883:0 2938:0 '),\n('2882', 'nag517', '530', '3518', '3518', '64', '67', '0', '-2469.37', '7698.03', '-17.5014', '0.0114679', '2869:0 2881:0 2867:0 2883:0 '),\n('2883', 'nag518', '530', '3518', '3631', '64', '67', '0', '-2548.6', '7872.59', '-53.4948', '1.39927', '2882:0 2881:0 2884:0 '),\n('2884', 'nag519', '530', '3518', '3631', '64', '67', '0', '-2377.16', '8119.54', '-42.3084', '5.94673', '2883:0 2870:0 2871:0 2885:0 '),\n('2885', 'nag520', '530', '3518', '3631', '64', '67', '0', '-2383.8', '8337.19', '-39.2254', '0.68063', '2884:0 2872:0 2873:0 2886:0 '),\n('2886', 'nag521', '530', '3518', '3631', '64', '67', '0', '-2489.29', '8499.84', '-36.8544', '3.07375', '2885:0 2874:0 2873:0 2875:0 '),\n('2887', 'nag522', '530', '3518', '3518', '64', '67', '0', '-2206.87', '8693.03', '-3.10935', '4.27148', '2873:0 2888:0 2939:0 '),\n('2888', 'nag523', '530', '3518', '3518', '64', '67', '1', '-2042.46', '8705.35', '18.0019', '0.174061', '2887:0 2889:0 '),\n('2889', 'nag524', '530', '3518', '3518', '64', '67', '0', '-1841.7', '8722.11', '25.2892', '5.96245', '2888:0 2890:0 '),\n('2890', 'nag525', '530', '3518', '3518', '64', '67', '0', '-1640.31', '8750.19', '32.1406', '6.19414', '2889:0 2891:0 2913:0 2941:0 '),\n('2891', 'nag526', '530', '3518', '3518', '64', '67', '0', '-1515.41', '8730.96', '27.2727', '5.36163', '2890:0 2892:0 2913:0 2894:0 '),\n('2892', 'nag527', '530', '3518', '3518', '64', '67', '0', '-1371.92', '8548.95', '11.8041', '3.728', '2891:0 2893:0 2898:0 2904:0 '),\n('2893', 'nag528', '530', '3518', '3622', '64', '67', '0', '-1460.34', '8490.57', '4.09139', '0.714427', '2892:0 2897:0 2965:0 '),\n('2894', 'nag530', '530', '3518', '3622', '64', '67', '0', '-1570.36', '8600.16', '4.98091', '3.67147', '2891:0 2895:0 2897:0 '),\n('2895', 'nag531', '530', '3518', '3622', '64', '67', '0', '-1642.07', '8541.56', '-12.6482', '5.37185', '2896:0 2894:0 '),\n('2896', 'nag532', '530', '3518', '3622', '64', '67', '0', '-1595.85', '8476.21', '-11.7076', '0.541643', '2895:0 2897:0 '),\n('2897', 'nag533', '530', '3518', '3622', '64', '67', '0', '-1526.1', '8519.38', '1.01318', '3.57721', '2896:0 2893:0 2894:0 '),\n('2898', 'nag534', '530', '3518', '3518', '64', '67', '0', '-1207.6', '8431.13', '20.2568', '5.9334', '2892:0 2899:0 2904:0 '),\n('2899', 'nag535', '530', '3518', '3518', '64', '67', '0', '-1095.6', '8405.41', '20.4451', '5.79204', '2898:0 2900:0 2904:0 '),\n('2900', 'nag536', '530', '3518', '3518', '64', '67', '0', '-953.793', '8333.32', '22.8678', '0.0193606', '2899:0 2901:0 2916:0 '),\n('2901', 'nag537', '530', '3518', '3518', '64', '67', '0', '-745.188', '8393.11', '33.9484', '0.313885', '2900:0 2902:0 '),\n('2902', 'nag538', '530', '3518', '3763', '64', '67', '0', '-588.034', '8447.14', '64.625', '6.12976', '2901:0 2903:0 '),\n('2903', 'nag539', '530', '3518', '3763', '64', '67', '0', '-494.831', '8433.32', '38.1295', '6.07479', '2902:0 2539:0 '),\n('2904', 'nag540', '530', '3518', '3518', '64', '67', '0', '-1168.9', '8591.89', '36.759', '1.21709', '2892:0 2898:0 2899:0 2905:0 2915:0 '),\n('2905', 'nag541', '530', '3518', '3617', '64', '67', '0', '-1067.77', '8749.39', '84.4276', '1.60586', '2904:0 2906:0 '),\n('2906', 'nag542', '530', '3518', '3617', '64', '67', '0', '-1080.66', '8823.02', '100.874', '1.41736', '2905:0 2907:0 '),\n('2907', 'nag543', '530', '3518', '3617', '64', '67', '0', '-1090.98', '8945.42', '103.447', '0.588767', '2906:0 2908:0 '),\n('2908', 'nag544', '530', '3518', '3617', '64', '67', '0', '-963.69', '8887.28', '146.6', '3.44055', '2907:0 2909:0 '),\n('2909', 'nag545', '530', '3518', '3617', '64', '67', '0', '-868.709', '8940.17', '156.257', '5.74571', '2908:0 2910:0 '),\n('2910', 'nag546', '530', '3518', '3617', '64', '67', '0', '-752.326', '8861.16', '182.978', '4.2134', '2909:0 2911:0 2912:0 '),\n('2911', 'nag547', '530', '3518', '3617', '64', '67', '0', '-651.777', '8791', '201.252', '0.180777', '2910:0 '),\n('2912', 'nag553', '530', '3518', '3617', '64', '67', '0', '-902.893', '8685.38', '170.054', '1.29602', '2910:0 '),\n('2913', 'nag554', '530', '3518', '3625', '64', '67', '0', '-1431.81', '8885.86', '36.9729', '1.07333', '2890:0 2891:0 2914:0 2948:0 '),\n('2914', 'nag555', '530', '3518', '3625', '64', '67', '0', '-1305.49', '8958.42', '58.5828', '5.24728', '2913:0 2915:0 '),\n('2915', 'nag556', '530', '3518', '3518', '64', '67', '0', '-1225.12', '8803.57', '39.6271', '4.88207', '2914:0 2904:0 '),\n('2916', 'nag557', '530', '3518', '3518', '64', '67', '0', '-968.504', '8169.97', '14.3663', '5.25514', '2900:0 2917:0 '),\n('2917', 'nag558', '530', '3518', '3518', '64', '67', '0', '-917.128', '8072.21', '21.4411', '5.19624', '2916:0 2918:0 2920:0 '),\n('2918', 'nag559', '530', '3518', '3518', '64', '67', '0', '-1020.93', '7945.51', '22.9619', '4.026', '2917:0 2919:0 2920:0 '),\n('2919', 'nag560', '530', '3518', '3518', '64', '67', '0', '-1146.56', '7828.51', '14.0417', '4.1548', '2918:0 2862:0 '),\n('2920', 'nag561', '530', '3518', '3616', '64', '67', '0', '-852.563', '7887.28', '40.6401', '4.6339', '2917:0 2918:0 2921:0 '),\n('2921', 'nag562', '530', '3518', '3616', '64', '67', '0', '-830.358', '7797.91', '38.3027', '4.69279', '2920:0 2922:0 '),\n('2922', 'nag563', '530', '3518', '3616', '64', '67', '0', '-829.954', '7695.84', '37.7371', '5.2465', '2921:0 2923:0 '),\n('2923', 'nag564', '530', '3518', '3616', '64', '67', '0', '-783.358', '7540.05', '60.9113', '5.00303', '2922:0 2924:0 '),\n('2924', 'nag565', '530', '3518', '3518', '64', '67', '0', '-763.166', '7451.73', '58.8323', '4.56714', '2923:0 2925:0 '),\n('2925', 'nag566', '530', '3518', '3518', '64', '67', '0', '-933.691', '7394.83', '34.4282', '3.14949', '2924:0 2926:0 '),\n('2926', 'nag567', '530', '3518', '3518', '64', '67', '0', '-1090.44', '7395.57', '33.0234', '2.48583', '2925:0 2850:0 '),\n('2927', 'nag568', '530', '3518', '3518', '64', '67', '1', '-1409.72', '6385.4', '38.2999', '5.37255', '2625:0 2842:0 2843:0 '),\n('2928', 'nag569', '530', '3518', '3634', '64', '67', '0', '-2075.76', '6274.62', '62.3128', '0.289453', '2820:0 2839:0 2840:0 2841:0 2929:0 '),\n('2929', 'nag571', '530', '3518', '3518', '64', '67', '0', '-2094.97', '6179.79', '87.9183', '1.00219', '2928:0 2930:0 '),\n('2930', 'nag572', '530', '3518', '3761', '64', '67', '0', '-2030.06', '6071.21', '119.672', '4.93705', '2931:0 2929:0 '),\n('2931', 'nag573', '530', '3518', '3761', '64', '67', '0', '-2001.22', '5972.22', '151.597', '6.26043', '2930:0 2932:0 '),\n('2932', 'nag574', '530', '3518', '3761', '64', '67', '0', '-1946.52', '5928.39', '150.948', '1.91915', '2931:0 '),\n('2933', 'nag575', '530', '3518', '3518', '64', '67', '0', '-2897.91', '6988.92', '-35.6052', '0.23407', '2797:0 2798:0 2934:0 '),\n('2934', 'nag576', '530', '3518', '3518', '64', '67', '0', '-2847.89', '7102.5', '-8.05767', '2.77876', '2933:0 2798:0 2935:0 '),\n('2935', 'nag577', '530', '3518', '3518', '64', '67', '0', '-2912.74', '7175.13', '-2.27885', '1.70277', '2934:0 2936:0 '),\n('2936', 'nag578', '530', '3518', '3518', '64', '67', '0', '-2935.1', '7301.43', '3.27707', '1.53784', '2935:0 2937:0 '),\n('2937', 'nag579', '530', '3518', '3518', '64', '67', '0', '-2902.48', '7467.17', '2.79586', '1.43181', '2936:0 2938:0 '),\n('2938', 'nag580', '530', '3518', '3518', '64', '67', '0', '-2802.19', '7645.35', '-6.45531', '0.870248', '2937:0 2880:0 2881:0 '),\n('2939', 'nag581', '530', '3518', '3633', '64', '67', '0', '-2196.09', '8827.81', '16.1506', '4.59461', '2887:0 2940:0 '),\n('2940', 'nag582', '530', '3518', '3633', '64', '67', '0', '-2071.65', '8894.1', '28.0157', '0.506613', '2939:0 2941:0 '),\n('2941', 'nag583', '530', '3518', '3518', '64', '67', '0', '-1884.01', '8889.41', '36.2099', '5.7138', '2890:0 2940:0 2942:0 '),\n('2942', 'nag584', '530', '3518', '3518', '64', '67', '0', '-1916.54', '9091.13', '52.9111', '1.74753', '2941:0 2943:0 '),\n('2943', 'nag585', '530', '3518', '3624', '64', '67', '0', '-1849.22', '9237.75', '70.9999', '5.57243', '2942:0 2944:0 '),\n('2944', 'nag586', '530', '3518', '3624', '64', '67', '0', '-1755.41', '9160.76', '79.5049', '5.59599', '2943:0 2945:0 '),\n('2945', 'nag587', '530', '3518', '3518', '64', '67', '0', '-1651.3', '9137.62', '86.3008', '5.99261', '2944:0 2946:0 '),\n('2946', 'nag588', '530', '3518', '3518', '64', '67', '0', '-1545.69', '9099.13', '82.8122', '5.48996', '2945:0 2947:0 '),\n('2947', 'nag589', '530', '3518', '3625', '64', '67', '0', '-1448.69', '9002.9', '57.299', '5.25434', '2946:0 2948:0 '),\n('2948', 'nag590', '530', '3518', '3625', '64', '67', '0', '-1419.87', '8948.03', '58.9144', '6.12613', '2947:0 2913:0 '),\n('2949', 'nag591', '530', '3518', '3518', '64', '67', '0', '-2052.37', '8225.22', '-6.54776', '2.94922', '2871:0 2872:0 2950:0 '),\n('2950', 'nag592', '530', '3518', '3518', '64', '67', '0', '-1986.35', '8210.53', '0.797534', '4.84989', '2949:0 2951:0 2954:0 '),\n('2951', 'nag593', '530', '3518', '3518', '64', '67', '0', '-2024.61', '8154.98', '1.25254', '4.1077', '2950:0 2952:0 '),\n('2952', 'nag594', '530', '3518', '3518', '64', '67', '0', '-2103.83', '8063.36', '2.18912', '4.10771', '2951:0 2953:0 '),\n('2953', 'nag595', '530', '3518', '3518', '64', '67', '0', '-2156.48', '7911.49', '-11.2008', '4.37866', '2952:0 2870:0 2869:0 '),\n('2954', 'nag596', '530', '3518', '3628', '64', '67', '0', '-1840.26', '7999.74', '-24.7446', '2.3484', '2950:0 2955:0 '),\n('2955', 'nag597', '530', '3518', '3628', '64', '67', '0', '-1746.01', '7996.18', '-27.0075', '3.06865', '2954:0 2956:0 '),\n('2956', 'nag598', '530', '3518', '3628', '64', '67', '0', '-1653.08', '7993.42', '-26.6535', '6.25344', '2955:0 2960:0 '),\n('2957', 'nag600', '530', '3518', '3628', '64', '67', '0', '-1550.22', '7929.2', '-21.6393', '6.03352', '2958:0 2960:0 '),\n('2958', 'nag601', '530', '3518', '3628', '64', '67', '0', '-1483.84', '7905.42', '-19.2864', '5.65261', '2957:0 2959:0 '),\n('2959', 'nag602', '530', '3518', '3628', '64', '67', '0', '-1404.2', '7842.35', '-18.1886', '5.40914', '2958:0 2861:0 '),\n('2960', 'nag603', '530', '3518', '3628', '64', '67', '0', '-1554.58', '7990.68', '-21.1856', '3.99937', '2956:0 2957:0 2961:0 2962:0 '),\n('2961', 'nag604', '530', '3518', '3628', '64', '67', '0', '-1601.1', '7865.59', '-22.0744', '4.70386', '2966:0 2960:0 '),\n('2962', 'nag605', '530', '3518', '3628', '64', '67', '0', '-1478.18', '8079.45', '-21.4921', '0.88839', '2963:0 2960:0 '),\n('2963', 'nag606', '530', '3518', '3518', '64', '67', '0', '-1517.43', '8229.34', '-15.3084', '1.82694', '2962:0 2964:0 '),\n('2964', 'nag607', '530', '3518', '3622', '64', '67', '0', '-1508.91', '8347.15', '-12.1475', '1.98089', '2963:0 2965:0 '),\n('2965', 'nag608', '530', '3518', '3622', '64', '67', '0', '-1502.91', '8432.5', '-0.939562', '0.853047', '2964:0 2893:0 '),\n('2966', 'nag609', '530', '3518', '3628', '64', '67', '0', '-1604.12', '7762.81', '-21.7436', '1.48608', '2961:0 2967:0 2969:0 '),\n('2967', 'nag610', '530', '3518', '3518', '64', '67', '0', '-1587.52', '7621.15', '-10.2326', '4.91826', '2966:0 2968:0 2969:0 '),\n('2968', 'nag611', '530', '3518', '3518', '64', '67', '0', '-1475.29', '7596.72', '-5.21911', '5.69972', '2967:0 2860:0 2969:0 '),\n('2969', 'nag612', '530', '3518', '3628', '64', '67', '0', '-1647.6', '7686.9', '-14.3996', '0.653543', '2967:0 2968:0 2966:0 2970:0 '),\n('2970', 'nag613', '530', '3518', '3518', '64', '67', '0', '-1703.41', '7669.14', '-14.3192', '3.85013', '2969:0 2971:0 '),\n('2971', 'nag614', '530', '3518', '3518', '64', '67', '0', '-1781.28', '7605.53', '-8.7957', '3.82657', '2970:0 2863:0 '),\n('2972', 'zang615', '530', '3521', '3521', '64', '67', '0', '794.211', '5932.33', '57.6977', '1.47191', '2601:0 2602:0 2624:0 2973:0 '),\n('2973', 'zang616', '530', '3521', '3521', '64', '67', '0', '820.771', '6049.46', '79.8283', '4.84129', '2972:0 2974:0 '),\n('2974', 'bedg617', '530', '3522', '3767', '65', '70', '0', '882.952', '5919.73', '115.632', '0.505885', '2973:0 2975:0 '),\n('2975', 'bedg618', '530', '3522', '3767', '65', '70', '0', '942.091', '5960.21', '121.279', '0.600133', '2974:0 2976:0 '),\n('2976', 'bedg619', '530', '3522', '3522', '65', '70', '0', '1067.62', '6060.89', '132.716', '0.256129', '2975:0 2977:0 '),\n('2977', 'bedg620', '530', '3522', '3522', '65', '70', '0', '1132.44', '6081.19', '153.605', '5.97461', '2976:0 2978:0 '),\n('2978', 'bedg621', '530', '3522', '3522', '65', '70', '0', '1202.41', '6057.05', '164.269', '5.95105', '2977:0 2979:0 '),\n('2979', 'bedg622', '530', '3522', '3522', '65', '70', '0', '1278.35', '5993.43', '168.127', '5.58584', '2978:0 2980:0 '),\n('2980', 'bedg623', '530', '3522', '3522', '65', '70', '0', '1406.14', '6036.86', '152.292', '0.476827', '2979:0 2981:0 '),\n('2981', 'bedg624', '530', '3522', '3522', '65', '70', '0', '1466.01', '6069.6', '133.93', '6.17882', '2980:0 2982:0 '),\n('2982', 'bedg625', '530', '3522', '3522', '65', '70', '0', '1591.09', '6047.48', '128.651', '6.21023', '2981:0 2983:0 '),\n('2983', 'bedg626', '530', '3522', '3768', '65', '70', '0', '1713.44', '6043.35', '143.923', '6.2495', '2982:0 2984:0 3003:0 '),\n('2984', 'bedg627', '530', '3522', '3768', '65', '70', '0', '1762.72', '5869.71', '155.631', '4.98895', '2983:0 2985:0 3003:0 '),\n('2985', 'bedg628', '530', '3522', '3833', '65', '70', '0', '1802.41', '5792.15', '188.129', '6.12384', '2984:0 2986:0 '),\n('2986', 'bedg629', '530', '3522', '3833', '65', '70', '0', '1865.39', '5786.05', '215.307', '4.78866', '2985:0 2987:0 '),\n('2987', 'bedg631', '530', '3522', '3833', '65', '70', '0', '1882.59', '5668.18', '256.167', '1.82379', '2988:0 2991:0 2986:0 '),\n('2988', 'bedg632', '530', '3522', '3833', '65', '70', '0', '2046.5', '5630.87', '263.828', '6.03743', '2987:0 2989:0 2990:0 2991:0 2994:0 '),\n('2989', 'bedg633', '530', '3522', '3922', '65', '70', '0', '2186.78', '5679.45', '267.903', '1.53317', '2988:0 3190:0 '),\n('2990', 'bedg634', '530', '3522', '3833', '65', '70', '0', '2078.91', '5730.76', '265.935', '3.74408', '2988:0 2991:0 '),\n('2991', 'bedg635', '530', '3522', '3833', '65', '70', '0', '1986.76', '5663.91', '265.451', '5.29919', '2990:0 2988:0 2987:0 2992:0 '),\n('2992', 'bedg636', '530', '3522', '3918', '65', '70', '0', '1882.53', '5595.86', '256.211', '0.429695', '2991:0 2993:0 '),\n('2993', 'bedg637', '530', '3522', '3918', '65', '70', '3', '1913.85', '5539.89', '265.641', '4.76903', '2992:0 2994:0 '),\n('2994', 'bedg638', '530', '3522', '3918', '65', '70', '3', '1980.47', '5572.14', '258.131', '2.97243', '2993:0 2988:0 2995:0 '),\n('2995', 'bedg639', '530', '3522', '3833', '65', '70', '0', '1818.29', '5603', '261.471', '3.82655', '2994:0 2996:0 3002:0 '),\n('2996', 'bedg640', '530', '3522', '3918', '65', '70', '0', '1800.72', '5550.99', '267.48', '2.61311', '2995:0 2997:0 3001:0 '),\n('2997', 'bedg641', '530', '3522', '3919', '65', '70', '0', '1708.89', '5566.11', '265.641', '3.36316', '2996:0 3001:0 3189:0 '),\n('2998', 'bedg643', '530', '3522', '3919', '65', '70', '0', '1564.28', '5423.88', '265.088', '1.83317', '2999:0 3189:0 '),\n('2999', 'bedg644', '530', '3522', '3919', '65', '70', '0', '1534.04', '5541.59', '258.021', '1.3761', '2998:0 3000:0 '),\n('3000', 'bedg645', '530', '3522', '3919', '65', '70', '0', '1599.86', '5605.47', '266.783', '0.413989', '2999:0 3001:0 '),\n('3001', 'bedg646', '530', '3522', '3919', '65', '70', '0', '1692.34', '5649.63', '265.597', '5.29918', '3000:0 2997:0 2996:0 3002:0 '),\n('3002', 'bedg647', '530', '3522', '3919', '65', '70', '0', '1775.77', '5678.9', '267.502', '5.25597', '2995:0 3001:0 '),\n('3003', 'bedg648', '530', '3522', '3768', '65', '70', '0', '1827.31', '6004.38', '138.57', '2.3814', '2983:0 2984:0 3004:0 '),\n('3004', 'bedg649', '530', '3522', '3768', '65', '70', '0', '1934.89', '5992.25', '140.661', '0.472881', '3003:0 3005:0 3041:0 '),\n('3005', 'bedg650', '530', '3522', '3768', '65', '70', '0', '2035.37', '6038.3', '145.555', '3.92079', '3004:0 3006:0 3041:0 '),\n('3006', 'bedg651', '530', '3522', '3768', '65', '70', '0', '2098.1', '5939.59', '137.134', '5.31486', '3005:0 3007:0 3041:0 '),\n('3007', 'bedg652', '530', '3522', '3831', '65', '70', '0', '2140.78', '5883.29', '138.074', '5.36983', '3006:0 3008:0 '),\n('3008', 'bedg653', '530', '3522', '3831', '65', '70', '0', '2169.87', '5811.41', '120.231', '1.97692', '3007:0 3009:0 '),\n('3009', 'bedg654', '530', '3522', '3831', '65', '70', '0', '2156.44', '5731.77', '120.753', '4.55303', '3008:0 3010:0 '),\n('3010', 'bedg655', '530', '3522', '3831', '65', '70', '0', '2209.5', '5671.79', '127.813', '5.09887', '3009:0 3011:0 '),\n('3011', 'bedg656', '530', '3522', '3831', '65', '70', '0', '2242.52', '5586.84', '144.63', '4.98106', '3010:0 3012:0 '),\n('3012', 'bedg657', '530', '3522', '3831', '65', '70', '0', '2242.64', '5516.54', '161.969', '4.74938', '3011:0 3013:0 '),\n('3013', 'bedg658', '530', '3522', '3831', '65', '70', '0', '2266.32', '5460.89', '147.107', '3.73228', '3012:0 3014:0 3015:0 '),\n('3014', 'bedg659', '530', '3522', '3831', '65', '70', '0', '2243.22', '5409.52', '144.241', '3.16286', '3015:0 3013:0 '),\n('3015', 'bedg660', '530', '3522', '3831', '65', '70', '0', '2184.26', '5427.04', '144.314', '3.26496', '3014:0 3016:0 3013:0 '),\n('3016', 'bedg661', '530', '3522', '3831', '65', '70', '0', '2056.91', '5452.67', '144.871', '3.87757', '3015:0 3017:0 '),\n('3017', 'bedg662', '530', '3522', '3831', '65', '70', '0', '1986.16', '5372.79', '148.912', '3.58305', '3016:0 3018:0 '),\n('3018', 'bedg663', '530', '3522', '3831', '65', '70', '0', '1869.19', '5342.55', '144.553', '3.39455', '3017:0 3019:0 '),\n('3019', 'bedg664', '530', '3522', '3831', '65', '70', '0', '1844.86', '5256.68', '138.071', '1.36038', '3018:0 3020:0 '),\n('3020', 'bedg666', '530', '3522', '3831', '65', '70', '0', '1882.44', '5202', '150.044', '6.2809', '3019:0 3021:0 '),\n('3021', 'bedg668', '530', '3522', '3831', '65', '70', '0', '1942.47', '5157.81', '163.104', '1.47426', '3020:0 3022:0 '),\n('3022', 'bedg670', '530', '3522', '3831', '65', '70', '0', '1859.25', '5091.18', '146.37', '4.69048', '3021:0 3023:0 '),\n('3023', 'bedg672', '530', '3522', '3831', '65', '70', '0', '1892.19', '4998.98', '146.563', '5.3777', '3024:0 3022:0 '),\n('3024', 'bedg673', '530', '3522', '3827', '65', '70', '0', '1882.75', '4918.05', '144.661', '4.59623', '3023:0 3025:0 3033:0 '),\n('3025', 'bedg674', '530', '3522', '3827', '65', '70', '0', '1970.05', '4876.31', '143.046', '5.83716', '3024:0 3026:0 3032:0 '),\n('3026', 'bedg675', '530', '3522', '3844', '65', '70', '0', '2066.28', '4886.71', '148.962', '0.107673', '3025:0 3027:0 '),\n('3027', 'bedg676', '530', '3522', '3844', '65', '70', '0', '2113.18', '4914.06', '149.085', '6.14739', '3026:0 3028:0 '),\n('3028', 'bedg677', '530', '3522', '3827', '65', '70', '0', '2197.61', '4955.01', '153.824', '2.65786', '3027:0 3029:0 3186:0 '),\n('3029', 'bedg678', '530', '3522', '3844', '65', '70', '5', '2122.42', '4767.11', '145.442', '4.39595', '3028:0 3030:0 3031:0 '),\n('3030', 'bedg679', '530', '3522', '3844', '65', '70', '5', '2051.79', '4712.94', '149.377', '4.14775', '3029:0 '),\n('3031', 'bedg680', '530', '3522', '3844', '65', '70', '4', '2045.43', '4756.7', '142.832', '3.24454', '3029:0 3032:0 '),\n('3032', 'bedg681', '530', '3522', '3827', '65', '70', '0', '1924.25', '4753.97', '143.374', '3.15815', '3031:0 3025:0 3033:0 '),\n('3033', 'bedg682', '530', '3522', '3827', '65', '70', '0', '1818.76', '4741.32', '143.599', '3.17386', '3032:0 3034:0 3035:0 3024:0 '),\n('3034', 'bedg683', '530', '3522', '3783', '65', '70', '0', '1763.5', '4636.75', '148.572', '2.17246', '3035:0 3033:0 '),\n('3035', 'bedg684', '530', '3522', '3827', '65', '70', '0', '1721.08', '4751.46', '141.246', '2.47877', '3034:0 3036:0 3033:0 '),\n('3036', 'bedg685', '530', '3522', '3827', '65', '70', '0', '1671.81', '4805.51', '144.067', '1.15537', '3035:0 3037:0 '),\n('3037', 'bedg686', '530', '3522', '3827', '65', '70', '0', '1716.64', '4889.56', '168.716', '1.08076', '3036:0 3038:0 '),\n('3038', 'bedg690', '530', '3522', '3779', '65', '70', '0', '1764.57', '5020.59', '169.786', '2.98533', '3037:0 3039:0 '),\n('3039', 'bedg691', '530', '3522', '3779', '65', '70', '0', '1689.52', '5029.67', '171.17', '6.17405', '3040:0 3038:0 '),\n('3040', 'bedg692', '530', '3522', '3779', '65', '70', '0', '1644.1', '5086.59', '174.824', '5.08627', '3039:0 '),\n('3041', 'bedg693', '530', '3522', '3768', '65', '70', '0', '2051.36', '6085.99', '147.268', '1.58417', '3004:0 3005:0 3006:0 3042:0 3048:0 '),\n('3042', 'bedg694', '530', '3522', '3768', '65', '70', '0', '2163.29', '6091.67', '144.685', '6.16931', '3041:0 3043:0 3047:0 '),\n('3043', 'bedg695', '530', '3522', '3769', '65', '70', '5', '2276.18', '6049.52', '143.141', '5.80411', '3042:0 3044:0 '),\n('3044', 'bedg696', '530', '3522', '3769', '65', '70', '4', '2338.36', '6031.21', '142.438', '2.8196', '3043:0 3045:0 '),\n('3045', 'bedg697', '530', '3522', '3769', '65', '70', '5', '2384.95', '6054.49', '138.162', '1.60222', '3044:0 3046:0 '),\n('3046', 'bedg698', '530', '3522', '3768', '65', '70', '0', '2372.13', '6149.95', '128.725', '3.20443', '3045:0 3047:0 3114:0 '),\n('3047', 'bedg699', '530', '3522', '3768', '65', '70', '0', '2265.65', '6155.81', '138.179', '3.41256', '3046:0 3042:0 '),\n('3048', 'bedg700', '530', '3522', '3768', '65', '70', '0', '2028.28', '6216.03', '134.538', '4.67706', '3041:0 3049:0 '),\n('3049', 'bedg701', '530', '3522', '3771', '65', '70', '0', '2041.4', '6592.18', '135.807', '3.54607', '3048:0 3050:0 3056:0 '),\n('3050', 'bedg702', '530', '3522', '3772', '65', '70', '3', '2066.72', '6735.02', '154.854', '4.59066', '3049:0 3051:0 3055:0 '),\n('3051', 'bedg703', '530', '3522', '3772', '65', '70', '2', '1972.28', '6779.92', '162.128', '1.46478', '3050:0 3052:0 '),\n('3052', 'bedg704', '530', '3522', '3772', '65', '70', '2', '1959.55', '6842.15', '158.876', '3.29476', '3051:0 3053:0 3059:0 '),\n('3053', 'bedg705', '530', '3522', '3772', '65', '70', '3', '2065.72', '6849.09', '172.562', '0.0589211', '3052:0 3054:0 '),\n('3054', 'bedg706', '530', '3522', '3772', '65', '70', '2', '2135.82', '6829.36', '173.431', '4.65351', '3053:0 3055:0 '),\n('3055', 'bedg707', '530', '3522', '3772', '65', '70', '2', '2140.28', '6753.83', '165.006', '3.40472', '3054:0 3050:0 '),\n('3056', 'bedg708', '530', '3522', '3771', '65', '70', '0', '1952.24', '6615.86', '143.542', '5.85751', '3049:0 3057:0 3058:0 '),\n('3057', 'bedg709', '530', '3522', '3771', '65', '70', '0', '1869.68', '6608.28', '143.783', '2.00906', '3056:0 3058:0 '),\n('3058', 'bedg710', '530', '3522', '3771', '65', '70', '0', '1867.3', '6714.18', '142.554', '2.81017', '3056:0 3057:0 3059:0 '),\n('3059', 'bedg711', '530', '3522', '3771', '65', '70', '0', '1794.79', '6806.46', '137.334', '0.147653', '3058:0 3052:0 3060:0 3079:0 '),\n('3060', 'bedg712', '530', '3522', '3782', '65', '70', '0', '1698.35', '6823.85', '136.031', '2.50777', '3059:0 3061:0 3066:0 3067:0 '),\n('3061', 'bedg713', '530', '3522', '3782', '65', '70', '0', '1660.38', '6861.71', '142.107', '2.01886', '3060:0 3062:0 '),\n('3062', 'bedg714', '530', '3522', '3782', '65', '70', '0', '1628.86', '6909.46', '152.556', '2.54312', '3061:0 3063:0 '),\n('3063', 'bedg715', '530', '3522', '3782', '65', '70', '0', '1565.97', '6934.47', '157.679', '0.579622', '3062:0 3064:0 '),\n('3064', 'bedg716', '530', '3522', '3782', '65', '70', '0', '1642.57', '6995.64', '157.952', '6.01458', '3063:0 3065:0 '),\n('3065', 'bedg717', '530', '3522', '3782', '65', '70', '0', '1706.57', '6967.44', '152.552', '5.15456', '3064:0 3066:0 '),\n('3066', 'bedg718', '530', '3522', '3782', '65', '70', '0', '1749.11', '6892.32', '140.635', '4.05192', '3065:0 3060:0 '),\n('3067', 'bedg719', '530', '3522', '3782', '65', '70', '0', '1636.12', '6812.12', '131.714', '0.187751', '3060:0 3068:0 3078:0 '),\n('3068', 'bedg720', '530', '3522', '3782', '65', '70', '0', '1569.95', '6826.69', '128.23', '3.23117', '3067:0 3069:0 '),\n('3069', 'bedg721', '530', '3522', '3522', '65', '70', '0', '1487.42', '6820.82', '107.218', '2.83454', '3068:0 3070:0 '),\n('3070', 'bedg722', '530', '3522', '3522', '65', '70', '0', '1418.63', '6847.18', '110.541', '2.77564', '3069:0 3071:0 '),\n('3071', 'bedg723', '530', '3522', '3522', '65', '70', '0', '1357.84', '6881.95', '95.233', '5.88189', '3070:0 3072:0 '),\n('3072', 'bedg724', '530', '3522', '3522', '65', '70', '0', '1305.01', '6962.51', '93.0961', '3.03875', '3071:0 3073:0 '),\n('3073', 'bedg725', '530', '3522', '3522', '65', '70', '0', '1224.71', '6978.54', '90.3881', '2.59893', '3072:0 3074:0 '),\n('3074', 'bedg726', '530', '3522', '3522', '65', '70', '0', '1145.67', '7048.89', '113.579', '2.41436', '3073:0 3075:0 '),\n('3075', 'bedg727', '530', '3522', '3522', '65', '70', '2', '1107.87', '7095.02', '122.35', '3.18012', '3074:0 3076:0 '),\n('3076', 'bedg728', '530', '3522', '3770', '65', '70', '2', '1053.11', '7098.72', '116.217', '0.376251', '3075:0 3077:0 '),\n('3077', 'bedg729', '530', '3522', '3770', '65', '70', '2', '1020.4', '7173.65', '86.2439', '1.66823', '3076:0 2582:0 '),\n('3078', 'bedg730', '530', '3522', '3824', '65', '70', '0', '1647.1', '6732.39', '116.704', '4.75248', '3067:0 3079:0 '),\n('3079', 'bedg731', '530', '3522', '3771', '65', '70', '0', '1740.86', '6736.89', '134.249', '0.774434', '3078:0 3059:0 3080:0 '),\n('3080', 'bedg732', '530', '3522', '3824', '65', '70', '0', '1628.32', '6690.04', '108.29', '6.13869', '3079:0 3081:0 '),\n('3081', 'bedg733', '530', '3522', '3824', '65', '70', '0', '1723.61', '6678.08', '87.8644', '5.8481', '3080:0 3082:0 '),\n('3082', 'bedg734', '530', '3522', '3824', '65', '70', '0', '1772.91', '6642.19', '74.5483', '2.51408', '3081:0 3083:0 '),\n('3083', 'bedg735', '530', '3522', '3824', '65', '70', '0', '1619.66', '6621.4', '33.3376', '3.64899', '3082:0 3084:0 '),\n('3084', 'bedg736', '530', '3522', '3824', '65', '70', '0', '1761.7', '6532.98', '4.13407', '5.72636', '3083:0 3085:0 3217:0 '),\n('3085', 'bedg737', '530', '3522', '3824', '65', '70', '0', '1936.85', '6455.82', '1.98027', '5.87558', '3084:0 3086:0 3215:0 '),\n('3086', 'bedg738', '530', '3522', '3824', '65', '70', '0', '2158.79', '6394.21', '-10.3376', '6.01302', '3085:0 3087:0 '),\n('3087', 'bedg739', '530', '3522', '3931', '65', '70', '0', '2352.32', '6410.86', '-10.3378', '0.246553', '3086:0 3088:0 3090:0 '),\n('3088', 'bedg740', '530', '3522', '3773', '65', '70', '0', '2401.13', '6465.38', '3.57212', '0.140524', '3087:0 3089:0 '),\n('3089', 'bedg741', '530', '3522', '3773', '65', '70', '0', '2489.83', '6479', '-6.94094', '0.898433', '3088:0 3090:0 3091:0 '),\n('3090', 'bedg742', '530', '3522', '3931', '65', '70', '0', '2486.13', '6407.7', '-10.338', '3.05435', '3089:0 3087:0 3097:0 '),\n('3091', 'bedg743', '530', '3522', '3773', '65', '70', '0', '2546.35', '6560.09', '1.844', '4.13898', '3089:0 3092:0 3093:0 3094:0 3096:0 '),\n('3092', 'bedg744', '530', '3522', '3773', '65', '70', '0', '2667.31', '6519.19', '0.94932', '5.95717', '3091:0 '),\n('3093', 'bedg745', '530', '3522', '3773', '65', '70', '0', '2613.6', '6682.32', '23.1547', '1.02881', '3091:0 3096:0 '),\n('3094', 'bedg746', '530', '3522', '3773', '65', '70', '0', '2376.02', '6637.4', '10.9828', '6.02394', '3091:0 3095:0 '),\n('3095', 'bedg747', '530', '3522', '3773', '65', '70', '0', '2482.22', '6684.55', '0.72676', '5.48987', '3094:0 3096:0 '),\n('3096', 'bedg748', '530', '3522', '3773', '65', '70', '0', '2570.07', '6610.1', '7.6561', '4.0683', '3095:0 3091:0 3093:0 '),\n('3097', 'bedg749', '530', '3522', '3931', '65', '70', '0', '2625.59', '6357.13', '-10.3379', '0.0313585', '3090:0 3098:0 3104:0 '),\n('3098', 'bedg750', '530', '3522', '3862', '65', '70', '0', '2747.24', '6390.91', '2.251', '5.27782', '3097:0 3099:0 '),\n('3099', 'bedg751', '530', '3522', '3862', '65', '70', '0', '2871.51', '6233.27', '11.692', '5.37992', '3098:0 3100:0 3104:0 '),\n('3100', 'bedg752', '530', '3522', '3862', '65', '70', '0', '2980.33', '6146.77', '4.99801', '5.25426', '3099:0 3101:0 '),\n('3101', 'bedg753', '530', '3522', '3826', '65', '70', '0', '3036.46', '6073.22', '0.772358', '5.36224', '3100:0 3102:0 '),\n('3102', 'bedg754', '530', '3522', '3826', '65', '70', '0', '3098.88', '6022.32', '1.18446', '4.5042', '3101:0 3103:0 '),\n('3103', 'bedg755', '530', '3522', '3826', '65', '70', '0', '3081.27', '5967.39', '-10.3385', '2.55249', '3102:0 3104:0 3108:0 '),\n('3104', 'bedg756', '530', '3522', '3825', '65', '70', '0', '2759.83', '6108.29', '-10.3396', '6.08285', '3099:0 3103:0 3097:0 3105:0 3111:0 '),\n('3105', 'bedg757', '530', '3522', '3825', '65', '70', '1', '2685.12', '5895.26', '-16.1123', '4.71862', '3104:0 3106:0 '),\n('3106', 'bedg758', '530', '3522', '3825', '65', '70', '0', '2687.78', '5785.12', '-16.8636', '4.73433', '3105:0 3107:0 '),\n('3107', 'bedg759', '530', '3522', '3904', '65', '70', '0', '2695.75', '5583.37', '-10.6374', '4.75001', '3106:0 '),\n('3108', 'bedg760', '530', '3522', '3826', '65', '70', '0', '3126.83', '5854.78', '-10.3341', '5.52444', '3103:0 3109:0 3110:0 '),\n('3109', 'bedg761', '530', '3522', '3826', '65', '70', '0', '3287.4', '5738.99', '-10.3325', '5.79933', '3108:0 3110:0 3115:0 '),\n('3110', 'bedg762', '530', '3522', '3826', '65', '70', '0', '3281.88', '5854.49', '-1.4584', '3.21929', '3109:0 3108:0 3115:0 '),\n('3111', 'bedg763', '530', '3522', '3825', '65', '70', '0', '2582.1', '6136.86', '24.0804', '4.49162', '3104:0 3112:0 '),\n('3112', 'bedg765', '530', '3522', '3825', '65', '70', '0', '2521.32', '6015.69', '84.9349', '2.22967', '3111:0 3113:0 '),\n('3113', 'bedg767', '530', '3522', '3768', '65', '70', '0', '2494.15', '6124.82', '111.3', '1.62492', '3114:0 3112:0 '),\n('3114', 'bedg768', '530', '3522', '3768', '65', '70', '0', '2427.5', '6152.5', '122.621', '2.74804', '3113:0 3046:0 '),\n('3115', 'bedg769', '530', '3522', '3826', '65', '70', '0', '3383.33', '5729.17', '-10.3389', '3.41014', '3109:0 3110:0 3116:0 3117:0 3126:0 '),\n('3116', 'bedg770', '530', '3522', '3777', '65', '70', '0', '3452.63', '5809.98', '1.12407', '0.865436', '3115:0 3118:0 '),\n('3117', 'bedg771', '530', '3522', '3826', '65', '70', '0', '3520', '5691.54', '-10.3386', '6.05377', '3115:0 3118:0 '),\n('3118', 'bedg772', '530', '3522', '3777', '65', '70', '0', '3523.18', '5795.46', '1.6669', '1.53041', '3117:0 3116:0 3119:0 '),\n('3119', 'bedg773', '530', '3522', '3826', '65', '70', '0', '3589.57', '5684.17', '-10.2714', '6.25066', '3118:0 3120:0 '),\n('3120', 'bedg774', '530', '3522', '3774', '65', '70', '0', '3660.48', '5491.29', '-20.7025', '5.0647', '3119:0 3125:0 '),\n('3121', 'bedg775', '530', '3522', '3774', '65', '70', '0', '3641.58', '5308.33', '-20.5148', '5.3867', '3122:0 3125:0 '),\n('3122', 'bedg776', '530', '3522', '3774', '65', '70', '0', '3587.11', '5221.49', '14.2925', '1.80371', '3123:0 3121:0 '),\n('3123', 'bedg777', '530', '3522', '3774', '65', '70', '0', '3438.2', '5241.29', '-6.61032', '0.307527', '3122:0 '),\n('3124', 'bedg779', '530', '3522', '3774', '65', '70', '0', '3593.15', '5382.62', '-9.51038', '0.0970404', '3125:0 '),\n('3125', 'bedg780', '530', '3522', '3774', '65', '70', '0', '3651.06', '5374.99', '-20.2357', '1.49502', '3124:0 3120:0 3121:0 '),\n('3126', 'bedg781', '530', '3522', '3826', '65', '70', '0', '3233.27', '5636.21', '38.3515', '5.69295', '3115:0 3127:0 '),\n('3127', 'bedg782', '530', '3522', '3826', '65', '70', '0', '3303.69', '5597.03', '55.3332', '6.0071', '3126:0 3128:0 '),\n('3128', 'bedg783', '530', '3522', '3826', '65', '70', '0', '3374.58', '5579.62', '85.0975', '4.19284', '3127:0 3129:0 '),\n('3129', 'bedg784', '530', '3522', '3828', '65', '70', '0', '3306.73', '5468.57', '141.818', '6.03852', '3128:0 3130:0 3133:0 '),\n('3130', 'bedg785', '530', '3522', '3828', '65', '70', '0', '3389.48', '5461.86', '145.745', '4.75047', '3129:0 3131:0 '),\n('3131', 'bedg786', '530', '3522', '3829', '65', '70', '0', '3363.88', '5342.13', '147.792', '3.91795', '3130:0 3132:0 '),\n('3132', 'bedg787', '530', '3522', '3829', '65', '70', '0', '3286', '5287.73', '147.247', '2.3825', '3131:0 3133:0 3136:0 '),\n('3133', 'bedg788', '530', '3522', '3828', '65', '70', '0', '3187.06', '5468.2', '146.95', '2.07226', '3132:0 3129:0 3134:0 '),\n('3134', 'bedg789', '530', '3522', '3828', '65', '70', '0', '3116.13', '5482.01', '145.293', '4.71905', '3133:0 3135:0 3137:0 '),\n('3135', 'bedg790', '530', '3522', '3829', '65', '70', '0', '3130.15', '5332.98', '148.604', '4.94682', '3134:0 3136:0 '),\n('3136', 'bedg791', '530', '3522', '3829', '65', '70', '0', '3215.6', '5360.26', '142.29', '5.42984', '3135:0 3132:0 '),\n('3137', 'bedg792', '530', '3522', '3828', '65', '70', '0', '2956.95', '5583.27', '146.351', '5.04498', '3134:0 3138:0 3140:0 '),\n('3138', 'bedg793', '530', '3522', '3952', '65', '70', '0', '2952.85', '5779.65', '134.692', '1.27116', '3137:0 3139:0 '),\n('3139', 'bedg794', '530', '3522', '3952', '65', '70', '0', '3050.1', '5991.54', '130.725', '1.20636', '3138:0 3192:0 '),\n('3140', 'bedg795', '530', '3522', '3951', '65', '70', '1', '2949.59', '5525.69', '144.16', '2.62095', '3137:0 3141:0 '),\n('3141', 'bedg796', '530', '3522', '3828', '65', '70', '0', '2915.37', '5365.92', '147.713', '1.64902', '3140:0 3142:0 '),\n('3142', 'bedg797', '530', '3522', '3867', '65', '70', '0', '2973.41', '5294.89', '183.643', '6.14688', '3141:0 3143:0 '),\n('3143', 'bedg798', '530', '3522', '3867', '65', '70', '0', '3038.23', '5281.8', '219.214', '4.54468', '3142:0 3144:0 '),\n('3144', 'bedg799', '530', '3522', '3867', '65', '70', '0', '3021.8', '5214.18', '250.296', '5.00414', '3143:0 3145:0 '),\n('3145', 'bedg800', '530', '3522', '3867', '65', '70', '0', '3082.54', '5063.01', '264.326', '4.87847', '3144:0 3146:0 3165:0 3166:0 '),\n('3146', 'bedg801', '530', '3522', '3867', '65', '70', '0', '3099.95', '4980.23', '265.505', '6.22935', '3145:0 3147:0 3172:0 3175:0 '),\n('3147', 'bedg802', '530', '3522', '3867', '65', '70', '0', '3304.97', '4970.79', '264.838', '5.68742', '3146:0 3148:0 3164:0 '),\n('3148', 'bedg803', '530', '3522', '3867', '65', '70', '0', '3434.24', '4937.21', '262.546', '5.47143', '3147:0 3149:0 3163:0 3164:0 '),\n('3149', 'bedg804', '530', '3522', '3867', '65', '70', '0', '3574.68', '4758.04', '240.131', '5.37718', '3148:0 3150:0 3156:0 '),\n('3150', 'bedg805', '530', '3522', '3863', '65', '70', '0', '3564.29', '4641.89', '228.617', '3.77105', '3149:0 3151:0 '),\n('3151', 'bedg806', '530', '3522', '3863', '65', '70', '0', '3459.92', '4594.26', '206.487', '3.08147', '3150:0 3152:0 3153:0 '),\n('3152', 'bedg807', '530', '3522', '3962', '65', '70', '0', '3346.24', '4594.8', '221.66', '2.70055', '3151:0 '),\n('3153', 'bedg808', '530', '3522', '3863', '65', '70', '0', '3393.49', '4543.75', '179.957', '4.49519', '3151:0 3154:0 '),\n('3154', 'bedg809', '530', '3522', '3863', '65', '70', '0', '3360.85', '4462.38', '157.372', '4.73472', '3153:0 3155:0 3223:0 '),\n('3155', 'bedg810', '530', '3522', '3863', '65', '70', '0', '3368.28', '4367.62', '122.375', '1.75021', '3154:0 3223:0 '),\n('3156', 'bedg811', '530', '3522', '3866', '65', '70', '0', '3701.21', '4770.37', '244.343', '1.75806', '3149:0 3157:0 '),\n('3157', 'bedg812', '530', '3522', '3866', '65', '70', '0', '3761.47', '4802.74', '254.61', '1.73842', '3156:0 3158:0 '),\n('3158', 'bedg813', '530', '3522', '3866', '65', '70', '0', '3738.29', '4879.52', '256.491', '2.75944', '3157:0 3159:0 '),\n('3159', 'bedg814', '530', '3522', '3866', '65', '70', '0', '3668.47', '4898.18', '260.046', '1.56956', '3158:0 3160:0 '),\n('3160', 'bedg815', '530', '3522', '3866', '65', '70', '0', '3668.33', '5008.48', '266.738', '4.7465', '3159:0 3161:0 3162:0 '),\n('3161', 'bedg816', '530', '3522', '3866', '65', '70', '0', '3732.68', '5010.06', '273.797', '4.86824', '3160:0 '),\n('3162', 'bedg817', '530', '3522', '3866', '65', '70', '0', '3581.65', '5022.38', '265.138', '6.01885', '3160:0 3163:0 '),\n('3163', 'bedg818', '530', '3522', '3866', '65', '70', '0', '3523.16', '4984.99', '269.146', '3.77261', '3162:0 3148:0 '),\n('3164', 'bedg819', '530', '3522', '3867', '65', '70', '0', '3312.28', '5066.6', '254.195', '4.73865', '3147:0 3148:0 3165:0 '),\n('3165', 'bedg820', '530', '3522', '3867', '65', '70', '0', '3243.07', '5149.71', '260.466', '2.97621', '3164:0 3145:0 '),\n('3166', 'bedg821', '530', '3522', '3942', '65', '70', '0', '2961.39', '5151.76', '265.026', '5.66383', '3145:0 3167:0 3171:0 '),\n('3167', 'bedg822', '530', '3522', '3942', '65', '70', '0', '2940.58', '5217.19', '264.835', '2.79713', '3166:0 3168:0 '),\n('3168', 'bedg823', '530', '3522', '3942', '65', '70', '0', '2844.64', '5234.99', '267.298', '3.70426', '3167:0 3169:0 '),\n('3169', 'bedg824', '530', '3522', '3942', '65', '70', '0', '2724.25', '5157.06', '265.076', '3.71605', '3168:0 3170:0 3176:0 '),\n('3170', 'bedg825', '530', '3522', '3867', '65', '70', '0', '2816.5', '5099.67', '265.683', '5.72666', '3169:0 3171:0 '),\n('3171', 'bedg826', '530', '3522', '3867', '65', '70', '0', '2900.18', '5096.37', '265.127', '0.775502', '3166:0 3170:0 3172:0 3175:0 '),\n('3172', 'bedg827', '530', '3522', '3787', '65', '70', '0', '2929.12', '4947.5', '266.731', '4.91062', '3146:0 3171:0 3173:0 3175:0 '),\n('3173', 'bedg828', '530', '3522', '3787', '65', '70', '0', '2898.72', '4782.92', '277.957', '4.52971', '3172:0 3174:0 '),\n('3174', 'bedg829', '530', '3522', '3787', '65', '70', '0', '2984.26', '4824.35', '278.892', '1.56875', '3173:0 3175:0 '),\n('3175', 'bedg830', '530', '3522', '3787', '65', '70', '0', '2852.35', '4933.54', '267.974', '6.12327', '3174:0 3172:0 3146:0 3171:0 '),\n('3176', 'bedg831', '530', '3522', '3833', '65', '70', '0', '2545.57', '5293.37', '266.598', '6.1005', '3169:0 3177:0 3191:0 '),\n('3177', 'bedg832', '530', '3522', '3833', '65', '70', '0', '2456.71', '5321.66', '264.923', '2.73899', '3176:0 3178:0 3184:0 3191:0 '),\n('3178', 'bedg833', '530', '3522', '3833', '65', '70', '0', '2282.88', '5171.44', '264.676', '3.69325', '3177:0 3179:0 3184:0 '),\n('3179', 'bedg834', '530', '3522', '3953', '65', '70', '0', '2194.7', '5122.32', '258.602', '4.28623', '3178:0 3180:0 '),\n('3180', 'bedg835', '530', '3522', '3953', '65', '70', '0', '2189.16', '5051.76', '252.603', '2.1395', '3179:0 3181:0 '),\n('3181', 'bedg836', '530', '3522', '3953', '65', '70', '0', '2116.51', '5085.08', '256.974', '5.94279', '3180:0 3182:0 3185:0 '),\n('3182', 'bedg837', '530', '3522', '3953', '65', '70', '0', '2090.4', '5162.61', '265.04', '2.37496', '3181:0 3183:0 3187:0 '),\n('3183', 'bedg838', '530', '3522', '3953', '65', '70', '0', '2063.34', '5235.11', '265.179', '0.122197', '3182:0 3184:0 '),\n('3184', 'bedg839', '530', '3522', '3833', '65', '70', '0', '2316.24', '5243.18', '261.206', '0.031876', '3183:0 3178:0 3177:0 '),\n('3185', 'bedg840', '530', '3522', '3953', '65', '70', '0', '2089.3', '5022.57', '223.769', '0.835746', '3181:0 3186:0 '),\n('3186', 'bedg841', '530', '3522', '3953', '65', '70', '0', '2164.72', '5005.6', '178.623', '5.23199', '3185:0 3028:0 '),\n('3187', 'bedg842', '530', '3522', '3953', '65', '70', '0', '1740.09', '5133.27', '265.058', '3.33132', '3182:0 3188:0 '),\n('3188', 'bedg843', '530', '3522', '3919', '65', '70', '0', '1674.61', '5254.04', '265.321', '1.92546', '3187:0 3189:0 '),\n('3189', 'bedg844', '530', '3522', '3919', '65', '70', '0', '1612.29', '5464.5', '265.941', '1.8587', '3188:0 2998:0 2997:0 '),\n('3190', 'bedg845', '530', '3522', '3833', '65', '70', '0', '2395.42', '5588.73', '267.895', '5.88623', '2989:0 3191:0 '),\n('3191', 'bedg846', '530', '3522', '3833', '65', '70', '0', '2397.69', '5390.93', '264.287', '4.72385', '3190:0 3177:0 3176:0 '),\n('3192', 'bedg847', '530', '3522', '3954', '65', '70', '0', '3094.62', '6101.88', '130.589', '1.3065', '3139:0 3193:0 '),\n('3193', 'bedg848', '530', '3522', '3954', '65', '70', '0', '3120.37', '6181.58', '137.697', '1.30738', '3192:0 3194:0 '),\n('3194', 'bedg849', '530', '3522', '3954', '65', '70', '0', '3147.57', '6248.67', '124.212', '0.486635', '3193:0 3195:0 '),\n('3195', 'bedg850', '530', '3522', '3954', '65', '70', '0', '3217.19', '6289.41', '124.654', '1.62939', '3194:0 3196:0 '),\n('3196', 'bedg851', '530', '3522', '3954', '65', '70', '0', '3215.71', '6365.94', '119.805', '1.02856', '3195:0 3197:0 '),\n('3197', 'bedg852', '530', '3522', '3954', '65', '70', '0', '3279.94', '6464.48', '149.929', '0.887189', '3196:0 3198:0 '),\n('3198', 'bedg853', '530', '3522', '3830', '65', '70', '0', '3323.9', '6505.86', '159.443', '0.796868', '3197:0 3199:0 3214:0 '),\n('3199', 'bedg854', '530', '3522', '3781', '65', '70', '0', '3488.68', '6673.14', '148.361', '0.895043', '3198:0 3200:0 3214:0 '),\n('3200', 'bedg855', '530', '3522', '3781', '65', '70', '0', '3566.67', '6807.32', '137.289', '2.01031', '3199:0 3201:0 3210:0 '),\n('3201', 'bedg856', '530', '3522', '3830', '65', '70', '0', '3446.01', '7089.42', '152.831', '1.97497', '3200:0 3202:0 3204:0 3205:0 '),\n('3202', 'bedg857', '530', '3522', '3830', '65', '70', '0', '3286.14', '7143.51', '168.873', '3.41617', '3201:0 3203:0 '),\n('3203', 'bedg858', '530', '3522', '3830', '65', '70', '0', '3303.87', '6962.97', '164.125', '0.482707', '3202:0 3204:0 '),\n('3204', 'bedg859', '530', '3522', '3830', '65', '70', '0', '3360.25', '6980.78', '163.409', '0.305992', '3203:0 3201:0 '),\n('3205', 'bedg860', '530', '3522', '3903', '65', '70', '0', '3481.37', '7222.76', '141.365', '1.30345', '3201:0 3206:0 '),\n('3206', 'bedg861', '530', '3522', '3903', '65', '70', '0', '3590.93', '7211.94', '137.85', '5.43858', '3205:0 3207:0 '),\n('3207', 'bedg862', '530', '3522', '3903', '65', '70', '0', '3641.59', '7154.45', '142.814', '5.19904', '3206:0 3208:0 '),\n('3208', 'bedg863', '530', '3522', '3903', '65', '70', '0', '3697.31', '7047.11', '149.054', '4.94771', '3207:0 3209:0 '),\n('3209', 'bedg864', '530', '3522', '3830', '65', '70', '0', '3765.97', '6838.37', '141.277', '4.82598', '3208:0 3210:0 '),\n('3210', 'bedg865', '530', '3522', '3781', '65', '70', '0', '3736.74', '6702.81', '136.262', '4.17018', '3200:0 3209:0 3211:0 '),\n('3211', 'bedg866', '530', '3522', '3781', '65', '70', '0', '3630.09', '6582.49', '134.163', '3.31724', '3210:0 3212:0 '),\n('3212', 'bedg867', '530', '3522', '3781', '65', '70', '0', '3502.63', '6555.2', '131.654', '3.74921', '3211:0 3213:0 '),\n('3213', 'bedg868', '530', '3522', '3830', '65', '70', '0', '3447.34', '6507.7', '134.998', '3.17979', '3212:0 3214:0 '),\n('3214', 'bedg869', '530', '3522', '3830', '65', '70', '0', '3367.73', '6538.54', '150.282', '2.78317', '3198:0 3213:0 3199:0 '),\n('3215', 'bedg870', '530', '3522', '3824', '65', '70', '0', '1832.55', '6314.24', '0.000980531', '2.39439', '3085:0 3216:0 '),\n('3216', 'bedg871', '530', '3522', '3824', '65', '70', '0', '1739.41', '6384.91', '-10.3385', '3.01878', '3215:0 3217:0 '),\n('3217', 'bedg872', '530', '3522', '3776', '65', '70', '0', '1654.93', '6407.76', '-10.1815', '2.87741', '3216:0 3084:0 3218:0 '),\n('3218', 'bedg873', '530', '3522', '3776', '65', '70', '0', '1604.99', '6316.74', '1.22794', '4.18509', '3217:0 3219:0 '),\n('3219', 'bedg874', '530', '3522', '3824', '65', '70', '0', '1475.3', '6532.8', '-10.3385', '5.60273', '3218:0 3220:0 '),\n('3220', 'bedg876', '530', '3522', '3778', '65', '70', '0', '1361.1', '6534.43', '6.43101', '6.15055', '3219:0 3221:0 '),\n('3221', 'bedg877', '530', '3522', '3778', '65', '70', '0', '1339.54', '6590.17', '-8.16829', '2.78314', '3222:0 3220:0 '),\n('3222', 'bedg878', '530', '3522', '3778', '65', '70', '0', '1355.69', '6688.28', '-22.7054', '2.60447', '3221:0 '),\n('3223', 'net880', '530', '3523', '3868', '67', '70', '0', '3385.12', '4257.44', '122.681', '4.84713', '3154:0 3155:0 3224:0 '),\n('3224', 'net881', '530', '3523', '3523', '67', '70', '0', '3394.02', '4139.94', '151.096', '1.574', '3223:0 3225:0 '),\n('3225', 'net883', '530', '3523', '3523', '67', '70', '0', '3433.77', '4036.61', '177.446', '4.57617', '3226:0 3224:0 '),\n('3226', 'net884', '530', '3523', '3523', '67', '70', '0', '3443.07', '3946.93', '166.449', '4.15205', '3225:0 3227:0 '),\n('3227', 'net885', '530', '3523', '3523', '67', '70', '0', '3403.88', '3894.6', '153.082', '3.72008', '3226:0 3228:0 '),\n('3228', 'net886', '530', '3523', '3523', '67', '70', '0', '3356.69', '3870.95', '144.623', '4.91389', '3227:0 3229:0 3238:0 3239:0 '),\n('3229', 'net887', '530', '3523', '3523', '67', '70', '0', '3379', '3814.14', '142.822', '4.46228', '3228:0 3230:0 '),\n('3230', 'net888', '530', '3523', '3725', '67', '70', '0', '3356.46', '3730.03', '141.12', '5.51863', '3229:0 3231:0 '),\n('3231', 'net889', '530', '3523', '3725', '67', '70', '0', '3395.58', '3698.26', '144.989', '5.91132', '3230:0 3232:0 '),\n('3232', 'net890', '530', '3523', '3725', '67', '70', '0', '3463.55', '3674.25', '150.706', '4.98848', '3231:0 3233:0 '),\n('3233', 'net891', '530', '3523', '3725', '67', '70', '0', '3489.72', '3601.83', '158.293', '4.35231', '3232:0 3234:0 '),\n('3234', 'net892', '530', '3523', '3725', '67', '70', '0', '3537.5', '3575.94', '135.389', '2.48697', '3233:0 3235:0 '),\n('3235', 'net893', '530', '3523', '3725', '67', '70', '0', '3582.4', '3548.11', '124.35', '1.42276', '3234:0 3236:0 '),\n('3236', 'net894', '530', '3523', '3721', '67', '70', '0', '3601.15', '3625.27', '127.148', '2.16889', '3235:0 3237:0 '),\n('3237', 'net895', '530', '3523', '3725', '67', '70', '0', '3506.7', '3744.78', '141.004', '1.82724', '3236:0 3238:0 '),\n('3238', 'net896', '530', '3523', '3523', '67', '70', '0', '3492.41', '3820.83', '138.898', '2.78542', '3237:0 3228:0 '),\n('3239', 'net897', '530', '3523', '3523', '67', '70', '0', '3288.33', '3814.38', '139.103', '3.2089', '3228:0 3240:0 '),\n('3240', 'net898', '530', '3523', '3523', '67', '70', '0', '3228.8', '3802.26', '137.833', '3.34242', '3239:0 3241:0 3272:0 3273:0 '),\n('3241', 'net899', '530', '3523', '3712', '67', '70', '0', '3127.16', '3690.44', '142.929', '3.42881', '3240:0 3272:0 3273:0 3278:0 '),\n('3242', 'net903', '530', '3523', '3712', '67', '70', '0', '2999.35', '3698.08', '144.031', '2.76314', '3243:0 3269:0 3277:0 3270:0 '),\n('3243', 'net904', '530', '3523', '3712', '67', '70', '0', '2922.84', '3722.08', '143.833', '1.69299', '3244:0 3242:0 '),\n('3244', 'net905', '530', '3523', '3523', '67', '70', '0', '2885.06', '3679.8', '140.256', '0.687686', '3243:0 3245:0 '),\n('3245', 'net906', '530', '3523', '3523', '67', '70', '0', '2816.99', '3697.81', '120.765', '3.2795', '3244:0 3246:0 '),\n('3246', 'net907', '530', '3523', '3523', '67', '70', '0', '2757.67', '3673.48', '134.526', '2.26241', '3245:0 3247:0 3290:0 '),\n('3247', 'net908', '530', '3523', '3729', '67', '70', '0', '2719.32', '3721.32', '139.083', '3.091', '3246:0 3248:0 '),\n('3248', 'net909', '530', '3523', '3729', '67', '70', '0', '2639.32', '3732.64', '144.622', '2.23884', '3247:0 3249:0 '),\n('3249', 'net910', '530', '3523', '3729', '67', '70', '0', '2585.42', '3776.42', '143.482', '2.4509', '3248:0 3250:0 3293:0 '),\n('3250', 'net911', '530', '3523', '3729', '67', '70', '0', '2514.06', '3815.49', '129.888', '2.12889', '3249:0 3251:0 '),\n('3251', 'net912', '530', '3523', '3729', '67', '70', '0', '2508.94', '3883.67', '132.691', '1.6655', '3250:0 3252:0 '),\n('3252', 'net913', '530', '3523', '3729', '67', '70', '0', '2477.31', '4067.17', '130.201', '5.03879', '3251:0 3253:0 '),\n('3253', 'net914', '530', '3523', '3523', '67', '70', '0', '2545.65', '4202.77', '136.176', '0.542382', '3252:0 3254:0 '),\n('3254', 'net915', '530', '3523', '3523', '67', '70', '0', '2609.03', '4303.08', '140.386', '0.000453472', '3253:0 3255:0 '),\n('3255', 'net916', '530', '3523', '3726', '67', '70', '0', '2747.27', '4290.97', '151.997', '6.19723', '3254:0 3256:0 '),\n('3256', 'net917', '530', '3523', '3726', '67', '70', '0', '2895.85', '4349.05', '157.653', '4.53219', '3255:0 3257:0 '),\n('3257', 'net918', '530', '3523', '3726', '67', '70', '0', '2865.03', '4280.18', '159.366', '5.10554', '3256:0 3258:0 '),\n('3258', 'net919', '530', '3523', '3726', '67', '70', '0', '2890.62', '4215.62', '164.008', '5.09376', '3257:0 3259:0 3266:0 '),\n('3259', 'net920', '530', '3523', '3726', '67', '70', '0', '2940.62', '4199.62', '164.007', '0.322464', '3258:0 3260:0 3265:0 '),\n('3260', 'net921', '530', '3523', '3726', '67', '70', '0', '2999.27', '4224.49', '160.851', '0.401004', '3259:0 3261:0 '),\n('3261', 'net922', '530', '3523', '3726', '67', '70', '0', '3026.75', '4163.73', '153.291', '4.74035', '3260:0 3262:0 '),\n('3262', 'net923', '530', '3523', '3726', '67', '70', '0', '3010.04', '4106.05', '150.967', '4.08455', '3261:0 3263:0 '),\n('3263', 'net924', '530', '3523', '3726', '67', '70', '0', '2977.7', '4033.08', '148.218', '1.89329', '3262:0 3264:0 3267:0 '),\n('3264', 'net925', '530', '3523', '3726', '67', '70', '0', '2939.58', '4099.08', '162.599', '2.04252', '3263:0 3265:0 '),\n('3265', 'net926', '530', '3523', '3726', '67', '70', '0', '2918.39', '4149.56', '164.008', '1.96398', '3264:0 3259:0 3266:0 '),\n('3266', 'net927', '530', '3523', '3726', '67', '70', '0', '2870.91', '4167.67', '164.007', '1.92863', '3265:0 3258:0 '),\n('3267', 'net928', '530', '3523', '3523', '67', '70', '0', '2982.92', '3921.89', '146.316', '1.62627', '3263:0 3268:0 '),\n('3268', 'net929', '530', '3523', '3523', '67', '70', '0', '3051.56', '3890.86', '143.683', '5.83993', '3267:0 3269:0 '),\n('3269', 'net930', '530', '3523', '3712', '67', '70', '0', '3039.6', '3790.04', '145.363', '4.28485', '3268:0 3271:0 3242:0 '),\n('3270', 'net931', '530', '3523', '3712', '67', '70', '0', '3064.35', '3704.05', '142.478', '3.15387', '3242:0 3278:0 '),\n('3271', 'net932', '530', '3523', '3523', '67', '70', '0', '3092.9', '3822.62', '142.74', '5.9106', '3269:0 3272:0 '),\n('3272', 'net933', '530', '3523', '3523', '67', '70', '0', '3125.95', '3779.17', '142.072', '0.118293', '3271:0 3241:0 3240:0 '),\n('3273', 'net934', '530', '3523', '3523', '67', '70', '0', '3196.76', '3711.71', '129.813', '5.90669', '3241:0 3240:0 3274:0 '),\n('3274', 'net935', '530', '3523', '3523', '67', '70', '0', '3253.35', '3630.84', '126.607', '3.66438', '3273:0 3275:0 '),\n('3275', 'net936', '530', '3523', '3523', '67', '70', '0', '3139.27', '3579.06', '142.77', '3.24419', '3274:0 3276:0 '),\n('3276', 'net937', '530', '3523', '3712', '67', '70', '0', '3046.95', '3595.34', '143.235', '1.59486', '3275:0 3279:0 3278:0 '),\n('3277', 'net938', '530', '3523', '3712', '1', '60', '0', '2935.94', '3648.71', '132.577', '0.379446', '3242:0 3278:0 '),\n('3278', 'net939', '530', '3523', '3712', '67', '70', '1', '3062.95', '3645.68', '144.33', '5.51596', '3241:0 3276:0 3277:0 3270:0 '),\n('3279', 'net940', '530', '3523', '3523', '67', '70', '0', '3016.58', '3539.17', '143.581', '3.54657', '3276:0 3280:0 3294:0 '),\n('3280', 'net941', '530', '3523', '3523', '67', '70', '0', '2859.55', '3471.67', '136.322', '0.389269', '3279:0 3281:0 3288:0 '),\n('3281', 'net942', '530', '3523', '3723', '67', '70', '0', '2805.81', '3360.76', '144.743', '4.68931', '3280:0 3282:0 '),\n('3282', 'net944', '530', '3523', '3723', '67', '70', '0', '2802.57', '3251.58', '147.597', '1.60466', '3281:0 3283:0 '),\n('3283', 'net945', '530', '3523', '3723', '67', '70', '0', '2769.35', '3153.34', '149.314', '2.61194', '3284:0 3282:0 '),\n('3284', 'net946', '530', '3523', '3723', '67', '70', '0', '2713.25', '3168.67', '147.073', '4.21416', '3283:0 3285:0 '),\n('3285', 'net947', '530', '3523', '3721', '67', '70', '0', '2645.59', '3055.71', '123.459', '0.911553', '3284:0 3286:0 3301:0 3302:0 '),\n('3286', 'net948', '530', '3523', '3723', '67', '70', '0', '2635.1', '3154.85', '135.257', '1.35923', '3285:0 3287:0 '),\n('3287', 'net949', '530', '3523', '3523', '67', '70', '0', '2617.24', '3347.94', '142.696', '1.66554', '3286:0 3288:0 3291:0 '),\n('3288', 'net950', '530', '3523', '3523', '67', '70', '0', '2742.84', '3444.31', '140.23', '4.12776', '3287:0 3280:0 3289:0 '),\n('3289', 'net951', '530', '3523', '3523', '67', '70', '0', '2704.66', '3571.67', '134.738', '5.57132', '3288:0 3290:0 '),\n('3290', 'net952', '530', '3523', '3523', '67', '70', '0', '2828.97', '3612.56', '157.278', '2.2157', '3289:0 3246:0 '),\n('3291', 'net953', '530', '3523', '3721', '67', '70', '0', '2522.14', '3469.45', '130.706', '1.47151', '3287:0 3292:0 '),\n('3292', 'net954', '530', '3523', '3523', '67', '70', '0', '2544.17', '3592.01', '138.626', '1.39297', '3291:0 3293:0 '),\n('3293', 'net955', '530', '3523', '3721', '67', '70', '0', '2528.36', '3697.54', '134.608', '0.964924', '3292:0 3249:0 '),\n('3294', 'net956', '530', '3523', '3523', '67', '70', '0', '3051.39', '3455.12', '118.577', '4.822', '3279:0 3295:0 '),\n('3295', 'net957', '530', '3523', '3523', '67', '70', '0', '3057.51', '3309.81', '106.678', '5.00264', '3294:0 3296:0 '),\n('3296', 'net958', '530', '3523', '3721', '67', '70', '0', '3103.15', '3197.03', '101.208', '5.67416', '3295:0 3297:0 3298:0 '),\n('3297', 'net959', '530', '3523', '3721', '67', '70', '0', '3221.06', '3114.67', '102.79', '5.68986', '3296:0 3339:0 3340:0 '),\n('3298', 'net960', '530', '3523', '3921', '67', '70', '0', '2987.27', '3194.73', '134.342', '4.05624', '3296:0 3299:0 '),\n('3299', 'net961', '530', '3523', '3921', '67', '70', '0', '2929.07', '3149.43', '147.291', '1.12512', '3298:0 3300:0 '),\n('3300', 'net962', '530', '3523', '3721', '67', '70', '0', '2829.63', '2992.81', '120.478', '2.75876', '3299:0 3301:0 '),\n('3301', 'net963', '530', '3523', '3721', '67', '70', '0', '2726.18', '3015.49', '121.825', '2.99045', '3300:0 3285:0 '),\n('3302', 'net964', '530', '3523', '3721', '67', '70', '0', '2519.49', '2940.34', '119.757', '3.88108', '3285:0 3303:0 '),\n('3303', 'net965', '530', '3523', '3730', '67', '70', '0', '2455.26', '2867.95', '131.925', '4.34839', '3302:0 3304:0 3308:0 '),\n('3304', 'net966', '530', '3523', '3730', '67', '70', '0', '2531.85', '2827', '126.995', '4.61936', '3305:0 3303:0 '),\n('3305', 'net967', '530', '3523', '3730', '67', '70', '0', '2555.92', '2738.68', '119.45', '1.55822', '3304:0 3306:0 3330:0 '),\n('3306', 'net970', '530', '3523', '3730', '67', '70', '0', '2501.34', '2718.83', '131.657', '2.74617', '3307:0 3305:0 3329:0 '),\n('3307', 'net971', '530', '3523', '3730', '67', '70', '0', '2440.85', '2747.78', '134.493', '2.69511', '3308:0 3310:0 3306:0 '),\n('3308', 'net972', '530', '3523', '3730', '67', '70', '0', '2424.83', '2798.75', '134.493', '1.0929', '3307:0 3309:0 3303:0 '),\n('3309', 'net973', '530', '3523', '3730', '67', '70', '0', '2364.39', '2781.17', '133.656', '5.81904', '3308:0 3310:0 '),\n('3310', 'net974', '530', '3523', '3730', '67', '70', '0', '2392.65', '2726.98', '134.491', '5.0199', '3307:0 3309:0 3311:0 '),\n('3311', 'net975', '530', '3523', '3730', '67', '70', '0', '2364.76', '2665.91', '130.977', '1.12433', '3310:0 3312:0 '),\n('3312', 'net976', '530', '3523', '3523', '67', '70', '0', '2326', '2600.19', '126.548', '4.98456', '3311:0 3313:0 '),\n('3313', 'net977', '530', '3523', '3523', '67', '70', '0', '2287.03', '2439.79', '104.053', '4.47406', '3312:0 3314:0 '),\n('3314', 'net978', '530', '3523', '3523', '67', '70', '0', '2336.37', '2367.16', '115.816', '5.18877', '3313:0 3327:0 3315:0 '),\n('3315', 'net979', '530', '3523', '3523', '67', '70', '0', '2310.67', '2271.59', '98.2741', '5.2673', '3314:0 3316:0 3321:0 '),\n('3316', 'net981', '530', '3523', '3935', '67', '70', '0', '2246.67', '2310.26', '89.8977', '3.71223', '3317:0 3326:0 3315:0 '),\n('3317', 'net982', '530', '3523', '3934', '67', '70', '0', '2176.86', '2262.3', '76.0387', '4.01068', '3316:0 3318:0 3326:0 '),\n('3318', 'net983', '530', '3523', '3934', '67', '70', '0', '2119.56', '2206.31', '71.3039', '6.1607', '3317:0 3319:0 '),\n('3319', 'net984', '530', '3523', '3934', '67', '70', '0', '2180.34', '2173.31', '71.6002', '5.61288', '3318:0 3320:0 '),\n('3320', 'net985', '530', '3523', '3934', '67', '70', '0', '2233.52', '2115.22', '71.2016', '2.29655', '3319:0 3321:0 '),\n('3321', 'net987', '530', '3523', '3934', '67', '70', '0', '2294.17', '2189.49', '93.5883', '6.28047', '3322:0 3315:0 3320:0 '),\n('3322', 'net990', '530', '3523', '3934', '67', '70', '0', '2353.3', '2183.05', '89.3993', '6.15874', '3321:0 3323:0 '),\n('3323', 'net991', '530', '3523', '3879', '67', '70', '0', '2411.12', '2183.37', '89.9985', '4.94529', '3322:0 3324:0 '),\n('3324', 'net992', '530', '3523', '3879', '67', '70', '0', '2523.75', '2185.83', '102.693', '5.98201', '3323:0 3325:0 '),\n('3325', 'net993', '530', '3523', '3879', '67', '70', '0', '2484.6', '2033.27', '88.1469', '4.36606', '3324:0 '),\n('3326', 'net997', '530', '3523', '3935', '67', '70', '0', '2183.73', '2382.64', '98.0661', '5.72675', '3316:0 3317:0 '),\n('3327', 'net999', '530', '3523', '3837', '67', '70', '0', '2400.24', '2395.93', '142.613', '3.9737', '3328:0 3314:0 '),\n('3328', 'net1000', '530', '3523', '3837', '67', '70', '0', '2482.84', '2424.13', '134.571', '3.45533', '3327:0 3329:0 '),\n('3329', 'net1001', '530', '3523', '3523', '67', '70', '0', '2516.55', '2638.79', '129.583', '6.18383', '3328:0 3306:0 3330:0 '),\n('3330', 'net1003', '530', '3523', '3523', '67', '70', '0', '2599.94', '2630.3', '129.384', '5.99453', '3305:0 3329:0 3331:0 '),\n('3331', 'net1004', '530', '3523', '3721', '67', '70', '0', '2697.9', '2608.37', '102.479', '0.0883238', '3332:0 3330:0 '),\n('3332', 'net1005', '530', '3523', '3721', '67', '70', '0', '2824.9', '2626.19', '104.537', '0.139375', '3331:0 3333:0 '),\n('3333', 'net1006', '530', '3523', '3523', '67', '70', '0', '2944.38', '2624.27', '115.88', '6.27726', '3332:0 3334:0 '),\n('3334', 'net1007', '530', '3523', '3523', '67', '70', '0', '3044.31', '2606.49', '109.94', '6.10839', '3333:0 3335:0 3364:0 '),\n('3335', 'net1008', '530', '3523', '3523', '67', '70', '0', '3088.57', '2759.93', '115.588', '1.28997', '3334:0 3336:0 '),\n('3336', 'net1009', '530', '3523', '3523', '67', '70', '0', '3181.15', '2839.31', '132.63', '0.00191784', '3335:0 3337:0 '),\n('3337', 'net1010', '530', '3523', '3877', '67', '70', '0', '3314.68', '2857.1', '140.864', '0.174705', '3336:0 3338:0 3348:0 '),\n('3338', 'net1011', '530', '3523', '3523', '67', '70', '0', '3251.04', '2889.15', '139.525', '5.61752', '3337:0 3339:0 '),\n('3339', 'net1012', '530', '3523', '3523', '67', '70', '0', '3260.45', '2979.53', '133.71', '1.72431', '3338:0 3297:0 '),\n('3340', 'net1013', '530', '3523', '3721', '67', '70', '0', '3328.19', '3109.33', '123.938', '0.003479', '3297:0 3341:0 '),\n('3341', 'net1014', '530', '3523', '3721', '67', '70', '0', '3467.09', '3253.66', '100.83', '0.804579', '3340:0 3342:0 '),\n('3342', 'net1015', '530', '3523', '3523', '67', '70', '0', '3558.21', '3192.19', '105.717', '5.68976', '3341:0 3343:0 '),\n('3343', 'net1016', '530', '3523', '3877', '67', '70', '0', '3523.96', '3113.12', '130.592', '4.30353', '3342:0 3344:0 '),\n('3344', 'net1017', '530', '3523', '3877', '67', '70', '0', '3511.13', '3048.77', '142.826', '5.09678', '3343:0 3345:0 '),\n('3345', 'net1018', '530', '3523', '3877', '67', '70', '0', '3536.43', '3000.68', '143.097', '5.20281', '3344:0 3349:0 3346:0 '),\n('3346', 'net1020', '530', '3523', '3877', '67', '70', '0', '3646.43', '3045.04', '123.609', '0.195882', '3345:0 3347:0 '),\n('3347', 'net1021', '530', '3523', '3523', '67', '70', '0', '3924.41', '3119.4', '115.634', '0.278359', '3480:0 3346:0 '),\n('3348', 'net1022', '530', '3523', '3877', '67', '70', '1', '3410.82', '2878.14', '142.972', '0.18804', '3337:0 3349:0 3350:0 '),\n('3349', 'net1023', '530', '3523', '3877', '67', '70', '0', '3473.27', '2973.11', '143.266', '0.989146', '3348:0 3345:0 '),\n('3350', 'net1024', '530', '3523', '3877', '67', '70', '0', '3472.55', '2819.87', '145.201', '4.69465', '3348:0 3351:0 '),\n('3351', 'net1025', '530', '3523', '3523', '67', '70', '0', '3576.26', '2719.73', '151.525', '3.15525', '3350:0 3352:0 '),\n('3352', 'net1026', '530', '3523', '3523', '67', '70', '0', '3439.56', '2608.19', '150.833', '0.802981', '3351:0 3353:0 '),\n('3353', 'net1027', '530', '3523', '3523', '67', '70', '0', '3372.76', '2617.96', '145.564', '2.25596', '3352:0 3354:0 3357:0 '),\n('3354', 'net1028', '530', '3523', '3727', '67', '70', '0', '3328.76', '2674.02', '157.504', '3.71287', '3353:0 3355:0 '),\n('3355', 'net1029', '530', '3523', '3727', '67', '70', '0', '3250.52', '2628.38', '139.888', '2.91962', '3354:0 3356:0 '),\n('3356', 'net1030', '530', '3523', '3523', '67', '70', '0', '3285.42', '2563.6', '113.658', '4.09772', '3355:0 3357:0 '),\n('3357', 'net1031', '530', '3523', '3523', '67', '70', '0', '3352.87', '2536.5', '95.7401', '1.21138', '3353:0 3356:0 3358:0 '),\n('3358', 'net1033', '530', '3523', '3728', '67', '70', '0', '3246.86', '2379.03', '91.5897', '4.38044', '3357:0 3359:0 '),\n('3359', 'net1035', '530', '3523', '3728', '67', '70', '0', '3241.13', '2272.31', '99.5301', '4.56501', '3358:0 3360:0 '),\n('3360', 'net1037', '530', '3523', '3728', '67', '70', '0', '3202.86', '2140.94', '138.867', '1.63547', '3377:0 3359:0 3361:0 '),\n('3361', 'net1039', '530', '3523', '3728', '67', '70', '0', '3162.82', '2326.75', '134.887', '1.78864', '3360:0 3362:0 '),\n('3362', 'net1040', '530', '3523', '3728', '67', '70', '0', '3160.48', '2406.47', '131.04', '1.60014', '3363:0 3361:0 '),\n('3363', 'net1041', '530', '3523', '3728', '67', '70', '0', '3113.17', '2449.04', '120.183', '2.1774', '3362:0 3364:0 '),\n('3364', 'net1042', '530', '3523', '3728', '67', '70', '0', '3069.26', '2504.52', '114.18', '1.78077', '3363:0 3334:0 3365:0 '),\n('3365', 'net1043', '530', '3523', '3734', '67', '70', '0', '3083.75', '2363.04', '144.526', '4.81242', '3364:0 3366:0 '),\n('3366', 'net1044', '530', '3523', '3734', '67', '70', '0', '3085.33', '2294.83', '150.494', '4.74173', '3365:0 3367:0 3373:0 '),\n('3367', 'net1045', '530', '3523', '3734', '67', '70', '0', '3125.61', '2238.22', '150.562', '3.67359', '3366:0 3368:0 '),\n('3368', 'net1046', '530', '3523', '3734', '67', '70', '0', '3074.15', '2209.78', '161.33', '3.55578', '3367:0 3369:0 '),\n('3369', 'net1047', '530', '3523', '3734', '67', '70', '0', '3017.03', '2183.87', '165.329', '3.55578', '3368:0 3370:0 3372:0 '),\n('3370', 'net1048', '530', '3523', '3734', '67', '70', '0', '2998.08', '2133.47', '165.328', '4.35295', '3369:0 3371:0 3374:0 '),\n('3371', 'net1049', '530', '3523', '3734', '67', '70', '0', '2946.6', '2153.28', '165.328', '2.77429', '3370:0 3372:0 '),\n('3372', 'net1050', '530', '3523', '3734', '67', '70', '0', '2965.73', '2206.06', '165.328', '1.22313', '3371:0 3369:0 3373:0 '),\n('3373', 'net1051', '530', '3523', '3734', '67', '70', '0', '2936.31', '2281.19', '161.738', '6.1684', '3366:0 3372:0 '),\n('3374', 'net1054', '530', '3523', '3734', '67', '70', '0', '3024.32', '2073.46', '161.904', '5.51533', '3370:0 3375:0 '),\n('3375', 'net1055', '530', '3523', '3728', '67', '70', '0', '3109.36', '1996.97', '143.897', '5.55067', '3374:0 3376:0 '),\n('3376', 'net1056', '530', '3523', '3728', '67', '70', '0', '3166.19', '1968.36', '143.636', '5.79022', '3375:0 3377:0 3378:0 '),\n('3377', 'net1057', '530', '3523', '3728', '67', '70', '0', '3200.13', '2051.68', '140.786', '4.08789', '3376:0 3360:0 '),\n('3378', 'net1058', '530', '3523', '3728', '67', '70', '0', '3152.12', '1897.92', '143.899', '6.07689', '3376:0 3379:0 3381:0 '),\n('3379', 'net1059', '530', '3523', '3728', '67', '70', '0', '3101.78', '1824.2', '144.391', '4.03094', '3380:0 3378:0 '),\n('3380', 'net1060', '530', '3523', '3728', '67', '70', '1', '3001.93', '1820.1', '139.674', '3.72463', '3379:0 '),\n('3381', 'net1061', '530', '3523', '3728', '67', '70', '0', '3242.1', '1874.48', '139.223', '3.2581', '3378:0 3382:0 '),\n('3382', 'net1062', '530', '3523', '3721', '67', '70', '0', '3356.3', '1846.42', '102.117', '6.15621', '3381:0 3383:0 '),\n('3383', 'net1063', '530', '3523', '3721', '67', '70', '0', '3493.95', '1840.83', '95.7573', '0.214661', '3382:0 3384:0 '),\n('3384', 'net1064', '530', '3523', '3735', '67', '70', '0', '3613.29', '1892.38', '114.291', '3.62722', '3383:0 3413:0 3414:0 '),\n('3385', 'net1066', '530', '3523', '3736', '67', '70', '0', '3865.27', '1760.4', '212.947', '0.885387', '3386:0 3410:0 '),\n('3386', 'net1067', '530', '3523', '3736', '67', '70', '0', '3913.4', '1809.95', '227.674', '2.24413', '3385:0 3396:0 3387:0 '),\n('3387', 'net1070', '530', '3523', '3736', '67', '70', '0', '3881.31', '1918.58', '254.223', '0.97178', '3386:0 3388:0 '),\n('3388', 'net1071', '530', '3523', '3736', '67', '70', '0', '3915.93', '1973.35', '257.813', '1.00712', '3389:0 3391:0 3387:0 '),\n('3389', 'net1072', '530', '3523', '3736', '67', '70', '0', '3903.14', '2024.48', '257.813', '1.77289', '3388:0 3390:0 '),\n('3390', 'net1073', '530', '3523', '3736', '67', '70', '0', '3959.61', '2037.62', '257.813', '0.233506', '3389:0 3391:0 3392:0 '),\n('3391', 'net1074', '530', '3523', '3736', '67', '70', '0', '3969.45', '1982.24', '257.813', '4.86736', '3390:0 3388:0 '),\n('3392', 'net1075', '530', '3523', '3736', '67', '70', '0', '3996.64', '2094.06', '254.332', '0.975711', '3390:0 3393:0 '),\n('3393', 'net1077', '530', '3523', '3736', '67', '70', '0', '4094.87', '2029.53', '236.513', '5.17366', '3392:0 3394:0 '),\n('3394', 'net1078', '530', '3523', '3736', '67', '70', '0', '4145.6', '1950.14', '225.805', '2.1106', '3397:0 3395:0 3393:0 '),\n('3395', 'net1079', '530', '3523', '3736', '67', '70', '0', '4106.82', '1883.96', '228.654', '3.273', '3394:0 3396:0 '),\n('3396', 'net1081', '530', '3523', '3736', '67', '70', '0', '3993.09', '1800.64', '228.295', '3.01381', '3386:0 3395:0 '),\n('3397', 'net1082', '530', '3523', '3736', '67', '70', '0', '4192.46', '2017.97', '187.695', '1.85243', '3394:0 3398:0 '),\n('3398', 'net1083', '530', '3523', '3736', '67', '70', '0', '4174.2', '2071.5', '164.367', '1.33406', '3397:0 3399:0 '),\n('3399', 'net1084', '530', '3523', '3735', '67', '70', '0', '4198.79', '2173.44', '151.336', '1.33406', '3398:0 3400:0 3401:0 3431:0 '),\n('3400', 'net1085', '530', '3523', '3735', '67', '70', '0', '4292.53', '2293.49', '122.367', '0.595787', '3399:0 3432:0 '),\n('3401', 'net1086', '530', '3523', '3854', '67', '70', '0', '4247.96', '2110.73', '144.575', '4.7741', '3399:0 3402:0 '),\n('3402', 'net1087', '530', '3523', '3735', '67', '70', '0', '4252.18', '1989.35', '136.107', '4.82514', '3401:0 3403:0 '),\n('3403', 'net1088', '530', '3523', '3735', '67', '70', '0', '4268.67', '1894.47', '138.946', '4.87226', '3402:0 3404:0 3407:0 '),\n('3404', 'net1089', '530', '3523', '3735', '67', '70', '0', '4299.75', '1730.52', '113.615', '4.18507', '3403:0 3405:0 '),\n('3405', 'net1090', '530', '3523', '3735', '67', '70', '0', '4113.8', '1674.62', '130.483', '2.68103', '3404:0 3406:0 '),\n('3406', 'net1091', '530', '3523', '3735', '67', '70', '0', '4046.36', '1742.75', '145.812', '2.35116', '3405:0 3407:0 3408:0 '),\n('3407', 'net1092', '530', '3523', '3735', '67', '70', '0', '4181.61', '1781.88', '136.718', '0.423012', '3406:0 3403:0 '),\n('3408', 'net1093', '530', '3523', '3735', '67', '70', '0', '3930.55', '1683.62', '139.355', '3.27165', '3406:0 3409:0 '),\n('3409', 'net1094', '530', '3523', '3735', '67', '70', '0', '3819.95', '1651.37', '133.174', '2.01794', '3408:0 3411:0 3410:0 '),\n('3410', 'net1095', '530', '3523', '3735', '67', '70', '0', '3785.44', '1751.5', '175.377', '2.55396', '3385:0 3409:0 3413:0 '),\n('3411', 'net1097', '530', '3523', '3735', '67', '70', '0', '3779.17', '1581.07', '120.895', '1.36998', '3409:0 3412:0 '),\n('3412', 'net1098', '530', '3523', '3735', '67', '70', '0', '3710.46', '1647.45', '128.67', '1.14614', '3411:0 3413:0 '),\n('3413', 'net1099', '530', '3523', '3735', '67', '70', '0', '3682.83', '1822.97', '129.53', '5.05546', '3412:0 3384:0 3410:0 '),\n('3414', 'net1100', '530', '3523', '3735', '67', '70', '0', '3551.83', '1960.87', '89.9501', '1.23472', '3384:0 3415:0 3416:0 '),\n('3415', 'net1101', '530', '3523', '3735', '67', '70', '0', '3582.85', '2061.58', '97.1173', '1.30541', '3414:0 '),\n('3416', 'net1102', '530', '3523', '3735', '67', '70', '0', '3654.98', '2151.19', '121.699', '1.26065', '3414:0 3417:0 '),\n('3417', 'net1103', '530', '3523', '3735', '67', '70', '0', '3647.05', '2320.07', '95.0628', '1.67298', '3416:0 3418:0 '),\n('3418', 'net1104', '530', '3523', '3735', '67', '70', '0', '3753.6', '2270.39', '127.706', '5.84031', '3417:0 3419:0 '),\n('3419', 'net1105', '530', '3523', '3735', '67', '70', '0', '3743.54', '2216.22', '132.261', '5.08632', '3418:0 3420:0 '),\n('3420', 'net1106', '530', '3523', '3880', '67', '70', '0', '3752.43', '2164.28', '140.754', '4.1949', '3419:0 3421:0 3427:0 '),\n('3421', 'net1107', '530', '3523', '3880', '67', '70', '0', '3712.58', '2091.74', '151.686', '5.93062', '3420:0 3422:0 '),\n('3422', 'net1108', '530', '3523', '3880', '67', '70', '0', '3791.21', '2078.46', '153.464', '0.004788', '3421:0 3423:0 '),\n('3423', 'net1109', '530', '3523', '3880', '67', '70', '0', '3833.37', '2045.96', '145.651', '5.41226', '3422:0 3424:0 '),\n('3424', 'net1110', '530', '3523', '3880', '67', '70', '0', '3890.34', '2027.56', '147.129', '1.10633', '3423:0 3425:0 '),\n('3425', 'net1112', '530', '3523', '3880', '67', '70', '0', '3911.03', '2086.24', '156.158', '1.07294', '3424:0 3426:0 '),\n('3426', 'net1113', '530', '3523', '3880', '67', '70', '0', '3942.19', '2139.62', '160.422', '6.24086', '3425:0 '),\n('3427', 'net1114', '530', '3523', '3735', '67', '70', '0', '3790.48', '2245.91', '149.586', '4.56011', '3420:0 3428:0 '),\n('3428', 'net1115', '530', '3523', '3735', '67', '70', '0', '3843.92', '2279.21', '153.861', '2.84204', '3427:0 3429:0 '),\n('3429', 'net1116', '530', '3523', '3735', '67', '70', '0', '3944.34', '2283.35', '158.599', '6.04059', '3428:0 3430:0 '),\n('3430', 'net1117', '530', '3523', '3735', '67', '70', '0', '4063.98', '2226.19', '164.346', '5.41228', '3429:0 3431:0 '),\n('3431', 'net1119', '530', '3523', '3735', '67', '70', '0', '4123.87', '2142.65', '157.701', '2.91076', '3399:0 3430:0 '),\n('3432', 'net1121', '530', '3523', '3741', '67', '70', '0', '4466.87', '2397.83', '122.968', '0.527102', '3400:0 3433:0 '),\n('3433', 'net1122', '530', '3523', '3741', '67', '70', '0', '4530.13', '2410.14', '141.874', '5.42799', '3432:0 3434:0 3438:0 '),\n('3434', 'net1123', '530', '3523', '3741', '67', '70', '0', '4566.37', '2316.31', '146.43', '5.07457', '3433:0 3435:0 '),\n('3435', 'net1124', '530', '3523', '3741', '67', '70', '0', '4632.34', '2295.23', '162.104', '1.47351', '3434:0 3436:0 '),\n('3436', 'net1125', '530', '3523', '3741', '67', '70', '0', '4622.3', '2365.33', '187.361', '1.96046', '3435:0 3437:0 '),\n('3437', 'net1126', '530', '3523', '3741', '67', '70', '0', '4729.92', '2383.24', '198.355', '3.24458', '3436:0 '),\n('3438', 'net1127', '530', '3523', '3741', '67', '70', '0', '4575.52', '2543.12', '194.543', '0.915856', '3433:0 3439:0 '),\n('3439', 'net1128', '530', '3523', '3741', '67', '70', '0', '4579.8', '2608.07', '196.971', '1.06115', '3438:0 3440:0 '),\n('3440', 'net1129', '530', '3523', '3741', '67', '70', '0', '4616.02', '2682.15', '187.718', '1.52847', '3439:0 3441:0 '),\n('3441', 'net1130', '530', '3523', '3523', '67', '70', '0', '4613.1', '2774.93', '159.097', '0.786306', '3440:0 3442:0 3461:0 '),\n('3442', 'net1131', '530', '3523', '3523', '67', '70', '0', '4581.46', '2841.92', '146.738', '1.62271', '3441:0 3443:0 3462:0 '),\n('3443', 'net1132', '530', '3523', '3523', '67', '70', '0', '4623.84', '2957.12', '144.621', '1.21823', '3442:0 3444:0 3463:0 '),\n('3444', 'net1133', '530', '3523', '3850', '67', '70', '0', '4760.8', '2985.3', '129.535', '0.205073', '3443:0 3445:0 '),\n('3445', 'net1134', '530', '3523', '3850', '67', '70', '0', '4849.32', '2917.43', '146.288', '5.62826', '3444:0 3446:0 '),\n('3446', 'net1135', '530', '3523', '3874', '67', '70', '0', '4916.97', '2942.46', '157.256', '0.212934', '3445:0 3447:0 '),\n('3447', 'net1136', '530', '3523', '3850', '67', '70', '0', '4803.44', '3004.17', '134.11', '2.64374', '3446:0 3448:0 '),\n('3448', 'net1137', '530', '3523', '3523', '67', '70', '0', '4689.74', '3022.54', '131.238', '0.00480604', '3447:0 3449:0 '),\n('3449', 'net1138', '530', '3523', '3523', '67', '70', '0', '4770.95', '3072.84', '120.927', '0.216864', '3448:0 3450:0 '),\n('3450', 'net1139', '530', '3523', '3523', '67', '70', '0', '4841.73', '3077.92', '111.914', '5.77749', '3449:0 3451:0 3533:0 '),\n('3451', 'net1140', '530', '3523', '3874', '67', '70', '0', '4921.37', '3026.16', '99.5096', '5.7068', '3450:0 3452:0 '),\n('3452', 'net1141', '530', '3523', '3874', '67', '70', '0', '5030.73', '3015.92', '91.2729', '6.18983', '3451:0 3453:0 '),\n('3453', 'net1142', '530', '3523', '3874', '67', '70', '0', '5047.36', '2928.45', '88.8179', '4.9057', '3452:0 3454:0 '),\n('3454', 'net1143', '530', '3523', '3874', '67', '70', '0', '4988.68', '2838.26', '81.9239', '3.64121', '3453:0 3455:0 '),\n('3455', 'net1144', '530', '3523', '3850', '67', '70', '0', '4907.06', '2817.68', '91.5802', '3.63336', '3454:0 3456:0 '),\n('3456', 'net1145', '530', '3523', '3850', '67', '70', '0', '4903.41', '2721.51', '83.4709', '4.33629', '3455:0 3457:0 '),\n('3457', 'net1146', '530', '3523', '3850', '67', '70', '0', '4844.82', '2634.49', '94.0377', '2.49061', '3456:0 3458:0 '),\n('3458', 'net1147', '530', '3523', '3850', '67', '70', '0', '4803.14', '2703.36', '87.3788', '2.22751', '3457:0 3459:0 '),\n('3459', 'net1148', '530', '3523', '3850', '67', '70', '0', '4741.03', '2771.78', '92.6406', '2.30998', '3458:0 3460:0 '),\n('3460', 'net1149', '530', '3523', '3850', '67', '70', '0', '4719.31', '2848.51', '113.113', '1.8623', '3459:0 3461:0 '),\n('3461', 'net1150', '530', '3523', '3850', '67', '70', '0', '4656.43', '2805.22', '134.562', '3.22497', '3460:0 3441:0 '),\n('3462', 'net1151', '530', '3523', '3876', '67', '70', '0', '4484.96', '2804.2', '139.481', '1.71701', '3442:0 3484:0 '),\n('3463', 'net1152', '530', '3523', '3740', '67', '70', '0', '4590.85', '3169.73', '146.93', '4.87431', '3443:0 3464:0 3465:0 3470:0 3523:0 '),\n('3464', 'net1153', '530', '3523', '3740', '67', '70', '0', '4693.85', '3149.86', '170.153', '5.31804', '3463:0 3465:0 '),\n('3465', 'net1154', '530', '3523', '3740', '1', '60', '0', '4655.8', '3065', '169.231', '2.59665', '3464:0 3463:0 3466:0 '),\n('3466', 'net1155', '530', '3523', '3740', '67', '70', '0', '4685.7', '3259.51', '173.132', '2.39442', '3465:0 3467:0 3469:0 '),\n('3467', 'net1156', '530', '3523', '3740', '67', '70', '0', '4776.31', '3293.39', '196.421', '1.55207', '3466:0 3468:0 '),\n('3468', 'net1157', '530', '3523', '3740', '67', '70', '0', '4732.45', '3359.96', '201.252', '3.83758', '3467:0 3469:0 '),\n('3469', 'net1158', '530', '3523', '3740', '67', '70', '0', '4630.74', '3310.08', '170.694', '5.45551', '3468:0 3466:0 '),\n('3470', 'net1159', '530', '3523', '3523', '67', '70', '0', '4397.77', '3265.13', '143.404', '2.67128', '3463:0 3471:0 3475:0 3476:0 3523:0 3487:0 '),\n('3471', 'net1160', '530', '3523', '3739', '67', '70', '0', '4463.52', '3434.86', '167.212', '1.19866', '3470:0 3472:0 3475:0 '),\n('3472', 'net1161', '530', '3523', '3739', '67', '70', '0', '4387.49', '3412.69', '167.78', '2.42782', '3471:0 3473:0 '),\n('3473', 'net1162', '530', '3523', '3739', '67', '70', '0', '4350.61', '3471.82', '175.837', '4.81542', '3472:0 3474:0 '),\n('3474', 'net1163', '530', '3523', '3739', '67', '70', '0', '4364.97', '3377.13', '154.103', '0.876653', '3473:0 3475:0 '),\n('3475', 'net1164', '530', '3523', '3739', '67', '70', '0', '4427.16', '3339.99', '152.658', '0.896303', '3474:0 3470:0 3471:0 '),\n('3476', 'net1165', '530', '3523', '3738', '67', '70', '0', '4313.76', '3185.04', '161.274', '0.774559', '3470:0 3477:0 '),\n('3477', 'net1166', '530', '3523', '3738', '67', '70', '1', '4231.39', '3159.2', '178.712', '0.566429', '3476:0 3478:0 '),\n('3478', 'net1167', '530', '3523', '3738', '67', '70', '0', '4178.63', '3151.63', '175.35', '3.55094', '3477:0 3479:0 '),\n('3479', 'net1168', '530', '3523', '3738', '67', '70', '0', '4098.18', '3118.59', '159.275', '3.31924', '3478:0 3480:0 '),\n('3480', 'net1169', '530', '3523', '3738', '67', '70', '0', '4000.86', '3107.64', '138.035', '3.24856', '3479:0 3347:0 3481:0 '),\n('3481', 'net1170', '530', '3523', '3875', '67', '70', '0', '4031.23', '3259.48', '139.947', '1.37536', '3480:0 3482:0 '),\n('3482', 'net1171', '530', '3523', '3875', '67', '70', '0', '4071.98', '3372.71', '141.877', '5.11779', '3481:0 3483:0 3489:0 '),\n('3483', 'net1172', '530', '3523', '3875', '67', '70', '0', '4151.5', '3229.24', '196.056', '3.95933', '3482:0 '),\n('3484', 'net1173', '530', '3523', '3876', '67', '70', '0', '4466.66', '2879.42', '140.619', '2.91867', '3462:0 3485:0 '),\n('3485', 'net1174', '530', '3523', '3876', '67', '70', '0', '4370.42', '2904.8', '148.304', '2.95794', '3484:0 3486:0 '),\n('3486', 'net1175', '530', '3523', '3876', '67', '70', '0', '4330.52', '2945.08', '132.085', '5.41232', '3485:0 '),\n('3487', 'net1176', '530', '3523', '3523', '67', '70', '0', '4301.84', '3317.13', '147.441', '2.74981', '3470:0 3488:0 '),\n('3488', 'net1178', '530', '3523', '3523', '67', '70', '0', '4181.61', '3456.1', '144.034', '2.38458', '3489:0 3487:0 '),\n('3489', 'net1179', '530', '3523', '3875', '67', '70', '0', '4137.43', '3393.24', '142.177', '3.93968', '3488:0 3482:0 3490:0 '),\n('3490', 'net1180', '530', '3523', '3523', '67', '70', '0', '4138.78', '3496.33', '135.37', '2.48591', '3489:0 3491:0 3517:0 '),\n('3491', 'net1181', '530', '3523', '3852', '67', '70', '0', '4091.57', '3538.26', '117.689', '1.98718', '3490:0 3492:0 '),\n('3492', 'net1182', '530', '3523', '3852', '67', '70', '0', '4069.39', '3591.81', '114.31', '2.34453', '3491:0 3493:0 '),\n('3493', 'net1183', '530', '3523', '3722', '67', '70', '0', '3910.13', '3724.58', '112.828', '2.44664', '3492:0 3494:0 '),\n('3494', 'net1184', '530', '3523', '3722', '67', '70', '0', '3891.58', '3773.08', '119.636', '1.37064', '3493:0 3495:0 3510:0 '),\n('3495', 'net1185', '530', '3523', '3722', '67', '70', '0', '3908.92', '3833.69', '129.749', '1.2921', '3494:0 3496:0 '),\n('3496', 'net1186', '530', '3523', '3722', '67', '70', '0', '3990.07', '3844.3', '168.636', '3.74058', '3495:0 3497:0 '),\n('3497', 'net1188', '530', '3523', '3722', '67', '70', '0', '3883.22', '3936.25', '179.58', '1.96754', '3496:0 3498:0 '),\n('3498', 'net1189', '530', '3523', '3722', '67', '70', '0', '3884.07', '3990.71', '182.988', '1.21356', '3499:0 3509:0 3497:0 '),\n('3499', 'net1190', '530', '3523', '3722', '67', '70', '0', '3912.9', '4038.34', '190.499', '6.07518', '3498:0 3500:0 '),\n('3500', 'net1191', '530', '3523', '3722', '67', '70', '0', '3973.04', '4023.83', '194.227', '6.0634', '3499:0 3501:0 3503:0 '),\n('3501', 'net1192', '530', '3523', '3722', '67', '70', '0', '4018.79', '4051.87', '194.227', '0.549902', '3500:0 3502:0 3506:0 '),\n('3502', 'net1193', '530', '3523', '3722', '67', '70', '0', '4047.95', '4004.82', '194.226', '3.89178', '3501:0 3503:0 '),\n('3503', 'net1194', '530', '3523', '3722', '67', '70', '0', '4001.04', '3975.21', '194.226', '3.74256', '3502:0 3500:0 3504:0 '),\n('3504', 'net1195', '530', '3523', '3722', '67', '70', '0', '3987.35', '3916.16', '191.701', '4.48476', '3503:0 3505:0 '),\n('3505', 'net1196', '530', '3523', '3722', '67', '70', '0', '4046.25', '3890.47', '189.426', '0.432092', '3504:0 '),\n('3506', 'net1197', '530', '3523', '3722', '67', '70', '0', '4034.82', '4111.42', '191.69', '4.44076', '3501:0 3507:0 '),\n('3507', 'net1198', '530', '3523', '3722', '67', '70', '0', '4009.09', '4170.41', '196.566', '3.6907', '3506:0 3508:0 '),\n('3508', 'net1199', '530', '3523', '3722', '67', '70', '0', '3913.64', '4108.63', '193.142', '4.23262', '3507:0 3509:0 '),\n('3509', 'net1200', '530', '3523', '3722', '67', '70', '0', '3881.18', '4041.13', '183.645', '4.80596', '3508:0 3498:0 '),\n('3510', 'net1202', '530', '3523', '3722', '67', '70', '0', '3793.14', '3905.54', '108.811', '1.48529', '3494:0 3511:0 '),\n('3511', 'net1203', '530', '3523', '3881', '67', '70', '0', '3802.78', '4013.52', '122.041', '4.63866', '3512:0 3510:0 '),\n('3512', 'net1204', '530', '3523', '3881', '67', '70', '0', '3873.36', '4009.36', '122.335', '5.89452', '3511:0 3513:0 '),\n('3513', 'net1205', '530', '3523', '3881', '67', '70', '0', '3925.68', '3980.18', '123.291', '0.96222', '3512:0 3514:0 '),\n('3514', 'net1206', '530', '3523', '3881', '67', '70', '0', '3946.32', '4028.85', '115.31', '5.07772', '3513:0 3515:0 '),\n('3515', 'net1207', '530', '3523', '3881', '67', '70', '0', '4034.51', '3981.16', '124.954', '0.0315266', '3514:0 3516:0 '),\n('3516', 'net1208', '530', '3523', '3881', '67', '70', '0', '4093.15', '3979.78', '116.913', '6.25973', '3515:0 '),\n('3517', 'net1209', '530', '3523', '3523', '67', '70', '0', '4192.46', '3560.85', '141.75', '3.80144', '3490:0 3518:0 '),\n('3518', 'net1210', '530', '3523', '3721', '67', '70', '0', '4226.42', '3607.77', '132.686', '0.593084', '3517:0 3519:0 '),\n('3519', 'net1212', '530', '3523', '3721', '67', '70', '0', '4313.98', '3676.81', '118.894', '5.57251', '3518:0 3520:0 '),\n('3520', 'net1213', '530', '3523', '3523', '67', '70', '0', '4402.34', '3609.63', '125.622', '5.65104', '3521:0 3519:0 '),\n('3521', 'net1214', '530', '3523', '3523', '67', '70', '0', '4488.77', '3626.57', '104.723', '0.252208', '3520:0 3522:0 '),\n('3522', 'net1215', '530', '3523', '3721', '67', '70', '0', '4533.39', '3589.74', '117.794', '5.57721', '3521:0 '),\n('3523', 'net1216', '530', '3523', '3740', '67', '70', '0', '4515.18', '3245.18', '144.362', '1.06117', '3463:0 3470:0 3524:0 '),\n('3524', 'net1217', '530', '3523', '3740', '67', '70', '0', '4540.26', '3296.59', '134.776', '0.813774', '3523:0 3525:0 '),\n('3525', 'net1218', '530', '3523', '3523', '67', '70', '0', '4586.71', '3342.4', '125.714', '0.566373', '3524:0 3526:0 '),\n('3526', 'net1219', '530', '3523', '3523', '67', '70', '0', '4668.88', '3392.34', '110.519', '0.444637', '3525:0 3527:0 '),\n('3527', 'net1220', '530', '3523', '3900', '67', '70', '0', '4744.11', '3423.26', '102.517', '0.629205', '3526:0 3528:0 '),\n('3528', 'net1221', '530', '3523', '3900', '67', '70', '0', '4791.18', '3452.42', '102.703', '5.32589', '3527:0 3529:0 '),\n('3529', 'net1222', '530', '3523', '3523', '67', '70', '0', '4831.57', '3384.27', '122', '4.79967', '3528:0 3530:0 '),\n('3530', 'net1223', '530', '3523', '3523', '67', '70', '0', '4850.84', '3313.75', '131.13', '3.99465', '3529:0 3531:0 '),\n('3531', 'net1224', '530', '3523', '3523', '67', '70', '0', '4816.07', '3269.64', '149.703', '0.982658', '3530:0 3532:0 '),\n('3532', 'net1225', '530', '3523', '3523', '67', '70', '0', '4832.65', '3173.12', '139.44', '1.878', '3531:0 3533:0 '),\n('3533', 'net1226', '530', '3523', '3523', '67', '70', '0', '4806.1', '3117.37', '139.757', '4.67009', '3532:0 3450:0 '),\n('3534', 'shmv1227', '530', '3520', '3520', '67', '70', '0', '-2866.67', '3174.8', '12.0966', '4.03472', '2763:0 3535:0 '),\n('3535', 'shmv1228', '530', '3520', '3520', '67', '70', '0', '-2919.41', '3080.6', '39.7651', '0.776879', '3534:0 3536:0 '),\n('3536', 'shmv1229', '530', '3520', '3520', '67', '70', '0', '-2912.13', '3021.5', '54.1235', '3.61375', '3535:0 3537:0 '),\n('3537', 'shmv1230', '530', '3520', '3520', '67', '70', '0', '-3025.35', '2947.82', '86.1102', '3.93969', '3536:0 3538:0 '),\n('3538', 'shmv1231', '530', '3520', '3743', '67', '70', '0', '-3075.55', '2877.97', '82.0334', '3.71192', '3537:0 3539:0 3546:0 3703:0 '),\n('3539', 'shmv1232', '530', '3520', '3743', '67', '70', '0', '-3179.64', '2866.95', '94.9902', '2.90296', '3538:0 3540:0 '),\n('3540', 'shmv1233', '530', '3520', '3743', '67', '70', '0', '-3236.04', '2882.68', '114.136', '3.1857', '3539:0 3541:0 3700:0 '),\n('3541', 'shmv1234', '530', '3520', '3743', '67', '70', '0', '-3367.61', '2868.56', '158.738', '3.24853', '3540:0 3542:0 3545:0 '),\n('3542', 'shmv1235', '530', '3520', '3743', '67', '70', '0', '-3404.24', '2930.17', '169.88', '0.354339', '3541:0 3543:0 '),\n('3543', 'shmv1236', '530', '3520', '3743', '67', '70', '0', '-3346.8', '2955.36', '169.88', '0.413244', '3542:0 3544:0 '),\n('3544', 'shmv1237', '530', '3520', '3743', '67', '70', '0', '-3375.43', '3001.18', '170.817', '2.12933', '3543:0 3545:0 '),\n('3545', 'shmv1238', '530', '3520', '3743', '67', '70', '0', '-3444.14', '2938.58', '172.959', '3.88077', '3544:0 3541:0 '),\n('3546', 'shmv1239', '530', '3520', '3520', '67', '70', '0', '-3181.96', '2718.28', '68.7275', '4.12424', '3538:0 3547:0 3556:0 '),\n('3547', 'shmv1240', '530', '3520', '3744', '67', '70', '0', '-3176.94', '2562.78', '61.0113', '0.102998', '3546:0 3548:0 3557:0 '),\n('3548', 'shmv1241', '530', '3520', '3744', '67', '70', '5', '-3111.48', '2564.12', '61.7347', '0.0205314', '3547:0 3549:0 '),\n('3549', 'shmv1242', '530', '3520', '3744', '67', '70', '5', '-3059.25', '2507.74', '62.9718', '4.55621', '3548:0 3550:0 '),\n('3550', 'shmv1243', '530', '3520', '3744', '67', '70', '4', '-3069.01', '2436.27', '63.7223', '4.4227', '3549:0 3551:0 '),\n('3551', 'shmv1244', '530', '3520', '3520', '67', '70', '0', '-3123.06', '2321.13', '59.93', '3.60981', '3550:0 3552:0 3558:0 '),\n('3552', 'shmv1245', '530', '3520', '3520', '67', '70', '0', '-3231.28', '2289.35', '59.5698', '4.92143', '3551:0 3553:0 3606:0 '),\n('3553', 'shmv1246', '530', '3520', '3520', '67', '70', '0', '-3462.86', '2282.37', '63.8282', '3.30352', '3552:0 3554:0 3559:0 '),\n('3554', 'shmv1247', '530', '3520', '3949', '67', '70', '0', '-3455.95', '2462.16', '58.5579', '1.65025', '3553:0 3555:0 3606:0 '),\n('3555', 'shmv1248', '530', '3520', '3520', '67', '70', '0', '-3483.53', '2605.88', '62.0554', '4.92536', '3554:0 3556:0 3704:0 '),\n('3556', 'shmv1249', '530', '3520', '3520', '67', '70', '0', '-3301.81', '2669.56', '57.3856', '0.154061', '3555:0 3546:0 3557:0 '),\n('3557', 'shmv1250', '530', '3520', '3744', '67', '70', '0', '-3199.36', '2470.72', '62.1645', '2.00446', '3556:0 3547:0 3558:0 '),\n('3558', 'shmv1251', '530', '3520', '3520', '67', '70', '0', '-3210.03', '2392.06', '61.8107', '5.34555', '3551:0 3557:0 '),\n('3559', 'shmv1252', '530', '3520', '3520', '67', '70', '0', '-3690.32', '2310.79', '78.5618', '6.17099', '3553:0 3560:0 3566:0 3704:0 '),\n('3560', 'shmv1253', '530', '3520', '3752', '67', '70', '0', '-3792.84', '2478.03', '79.8242', '1.51751', '3559:0 3561:0 3565:0 '),\n('3561', 'shmv1254', '530', '3520', '3752', '67', '70', '0', '-3790.89', '2565.75', '91.2376', '1.68244', '3560:0 3562:0 3563:0 '),\n('3562', 'shmv1255', '530', '3520', '3752', '67', '70', '0', '-3793.32', '2666.77', '101.912', '1.6471', '3561:0 '),\n('3563', 'shmv1256', '530', '3520', '3752', '67', '70', '0', '-4020.54', '2670.54', '126.986', '4.24676', '3561:0 3564:0 '),\n('3564', 'shmv1257', '530', '3520', '3752', '67', '70', '0', '-4064.49', '2549.64', '134.278', '5.45704', '3563:0 3565:0 '),\n('3565', 'shmv1258', '530', '3520', '3752', '67', '70', '0', '-3950.4', '2473.76', '116.781', '0.0024457', '3564:0 3560:0 '),\n('3566', 'shmv1259', '530', '3520', '3745', '67', '70', '0', '-3762.45', '2127.89', '76.7131', '3.78807', '3559:0 3567:0 3570:0 '),\n('3567', 'shmv1260', '530', '3520', '3745', '67', '70', '2', '-3882.03', '2033.78', '96.002', '2.18978', '3566:0 3568:0 3570:0 '),\n('3568', 'shmv1261', '530', '3520', '3745', '67', '70', '3', '-3952.84', '2136.12', '98.2022', '2.21727', '3567:0 3569:0 '),\n('3569', 'shmv1262', '530', '3520', '3745', '67', '70', '3', '-3972.41', '2203.81', '101.676', '5.04862', '3568:0 '),\n('3570', 'shmv1263', '530', '3520', '3520', '67', '70', '0', '-3769.55', '1947.31', '94.6509', '4.07473', '3566:0 3567:0 3571:0 '),\n('3571', 'shmv1264', '530', '3520', '3520', '67', '70', '0', '-3890.57', '1771.31', '96.9587', '3.89017', '3570:0 3572:0 3607:0 '),\n('3572', 'shmv1265', '530', '3520', '3520', '67', '70', '0', '-4052.33', '1643.87', '94.7068', '4.5499', '3571:0 3573:0 '),\n('3573', 'shmv1266', '530', '3520', '3520', '67', '70', '0', '-4057.55', '1395.83', '83.9803', '4.95438', '3572:0 3574:0 3618:0 3633:0 '),\n('3574', 'shmv1267', '530', '3520', '3520', '67', '70', '0', '-4028.73', '1253.84', '79.0241', '1.89525', '3573:0 3575:0 '),\n('3575', 'shmv1268', '530', '3520', '3520', '67', '70', '0', '-3956.14', '1083.59', '27.6555', '5.11538', '3574:0 3576:0 3638:0 3725:0 '),\n('3576', 'shmv1269', '530', '3520', '3520', '67', '70', '0', '-3882.17', '883.51', '18.5293', '4.46743', '3575:0 3577:0 3639:0 '),\n('3577', 'shmv1270', '530', '3520', '3520', '67', '70', '0', '-3840.27', '741.517', '11.8649', '0.0181477', '3576:0 3578:0 3639:0 '),\n('3578', 'shmv1271', '530', '3520', '3520', '67', '70', '0', '-3586.49', '737.497', '-11.4566', '0.0534906', '3577:0 3579:0 3581:0 3732:0 '),\n('3579', 'shmv1272', '530', '3520', '3520', '67', '70', '0', '-3561.52', '586.272', '10.6201', '4.78552', '3578:0 3580:0 3647:0 3659:0 '),\n('3580', 'shmv1273', '530', '3520', '3520', '67', '70', '0', '-3569.67', '423.902', '28.3305', '4.75019', '3579:0 '),\n('3581', 'shmv1274', '530', '3520', '3520', '67', '70', '0', '-3346.71', '753.909', '-26.6716', '0.0849111', '3578:0 3582:0 3683:0 '),\n('3582', 'shmv1275', '530', '3520', '3520', '67', '70', '0', '-3232.2', '784.314', '-19.8198', '0.00243998', '3581:0 3583:0 '),\n('3583', 'shmv1276', '530', '3520', '3754', '67', '70', '0', '-3120.7', '799.898', '-22.5484', '1.24337', '3582:0 3584:0 3671:0 '),\n('3584', 'shmv1277', '530', '3520', '3520', '67', '70', '0', '-3121.46', '1102.68', '20.44', '1.2473', '3583:0 3585:0 3671:0 '),\n('3585', 'shmv1278', '530', '3520', '3753', '67', '70', '0', '-3106.91', '1197.3', '22.976', '1.40439', '3584:0 3586:0 3679:0 3680:0 '),\n('3586', 'shmv1279', '530', '3520', '3520', '67', '70', '0', '-3026.37', '1314.44', '8.68562', '0.968488', '3585:0 3587:0 3687:0 '),\n('3587', 'shmv1280', '530', '3520', '3520', '67', '70', '0', '-2904.03', '1491.38', '14.8027', '0.960634', '3586:0 3588:0 '),\n('3588', 'shmv1281', '530', '3520', '3750', '67', '70', '0', '-2867.58', '1577.53', '15.2282', '2.85737', '3587:0 3589:0 3705:0 '),\n('3589', 'shmv1282', '530', '3520', '3750', '67', '70', '0', '-2824.65', '1682.74', '22.3429', '1.17662', '3588:0 3590:0 '),\n('3590', 'shmv1283', '530', '3520', '3750', '67', '70', '0', '-2886.26', '1742.5', '43.8502', '2.40576', '3589:0 3591:0 '),\n('3591', 'shmv1284', '530', '3520', '3520', '67', '70', '0', '-2975.68', '1908', '104.519', '2.08612', '3590:0 3592:0 '),\n('3592', 'shmv1285', '530', '3520', '3520', '67', '70', '0', '-3102.48', '1972.24', '105.605', '0.868752', '3591:0 3593:0 3596:0 '),\n('3593', 'shmv1286', '530', '3520', '3520', '67', '70', '0', '-3180.63', '2099.72', '75.4619', '0.291484', '3592:0 3594:0 3597:0 '),\n('3594', 'shmv1287', '530', '3520', '3933', '67', '70', '0', '-3042.81', '2156.41', '79.2338', '0.393586', '3593:0 3595:0 '),\n('3595', 'shmv1288', '530', '3520', '3933', '67', '70', '0', '-3015.9', '2104.22', '90.4026', '4.71721', '3594:0 3596:0 '),\n('3596', 'shmv1289', '530', '3520', '3933', '67', '70', '0', '-3017.6', '2046.19', '96.9335', '3.75903', '3595:0 3592:0 '),\n('3597', 'shmv1290', '530', '3520', '3748', '67', '70', '0', '-3265.68', '2066.96', '73.9146', '4.35987', '3593:0 3606:0 3598:0 '),\n('3598', 'shmv1291', '530', '3520', '3748', '67', '70', '0', '-3287.9', '1978.44', '52.6152', '2.07043', '3597:0 3602:0 '),\n('3599', 'shmv1294', '530', '3520', '3748', '67', '70', '0', '-3389.68', '1984.65', '24.8931', '1.53832', '3600:0 3602:0 '),\n('3600', 'shmv1295', '530', '3520', '3748', '67', '70', '0', '-3405.52', '2054.01', '15.1476', '3.06395', '3601:0 3599:0 '),\n('3601', 'shmv1296', '530', '3520', '3748', '67', '70', '0', '-3321.42', '2125.97', '3.08638', '2.40814', '3600:0 '),\n('3602', 'shmv1297', '530', '3520', '3748', '67', '70', '0', '-3343.59', '2008.19', '32.1771', '2.00758', '3603:0 3599:0 3598:0 '),\n('3603', 'shmv1298', '530', '3520', '3748', '67', '70', '0', '-3419.14', '2114.58', '34.4588', '2.18822', '3602:0 3604:0 '),\n('3604', 'shmv1299', '530', '3520', '3748', '67', '70', '0', '-3495.43', '2186.55', '33.5276', '5.96992', '3603:0 3605:0 '),\n('3605', 'shmv1301', '530', '3520', '3748', '67', '70', '0', '-3410.98', '2272.59', '33.8565', '1.54813', '3604:0 '),\n('3606', 'shmv1302', '530', '3520', '3949', '67', '70', '0', '-3336.88', '2207.97', '74.9806', '2.06645', '3597:0 3552:0 3554:0 '),\n('3607', 'shmv1303', '530', '3520', '3932', '67', '70', '0', '-4003.29', '1878.34', '76.5277', '5.50491', '3571:0 3608:0 '),\n('3608', 'shmv1304', '530', '3520', '3932', '67', '70', '0', '-4085.04', '1923.15', '77.0726', '5.10829', '3607:0 3609:0 '),\n('3609', 'shmv1305', '530', '3520', '3932', '67', '70', '0', '-4058.27', '1821.93', '84.9857', '4.00088', '3608:0 3610:0 '),\n('3610', 'shmv1306', '530', '3520', '3932', '67', '70', '0', '-4103.15', '1784.26', '103.457', '4.80985', '3609:0 3611:0 '),\n('3611', 'shmv1307', '530', '3520', '3932', '67', '70', '0', '-4195.07', '1861.58', '109.916', '5.5167', '3610:0 3612:0 '),\n('3612', 'shmv1308', '530', '3520', '3822', '67', '70', '0', '-4334.08', '1789.5', '144.816', '3.61996', '3611:0 3613:0 '),\n('3613', 'shmv1309', '530', '3520', '3822', '67', '70', '0', '-4420.11', '1797.35', '157.396', '4.44855', '3612:0 3614:0 3622:0 '),\n('3614', 'shmv1310', '530', '3520', '3822', '67', '70', '0', '-4448.82', '1724.98', '158.876', '4.33467', '3613:0 3615:0 3620:0 '),\n('3615', 'shmv1311', '530', '3520', '3822', '67', '70', '0', '-4383.86', '1707.44', '156.573', '5.0533', '3614:0 3616:0 '),\n('3616', 'shmv1312', '530', '3520', '3822', '67', '70', '0', '-4361', '1640.49', '156.748', '5.04152', '3615:0 3617:0 3619:0 '),\n('3617', 'shmv1313', '530', '3520', '3822', '67', '70', '0', '-4252.69', '1521.47', '129.453', '5.45072', '3616:0 3618:0 3626:0 '),\n('3618', 'shmv1314', '530', '3520', '3822', '67', '70', '0', '-4141.51', '1512.19', '103.518', '6.20863', '3617:0 3573:0 '),\n('3619', 'shmv1315', '530', '3520', '3822', '67', '70', '0', '-4423.22', '1575.75', '164.241', '3.96398', '3616:0 3620:0 '),\n('3620', 'shmv1316', '530', '3520', '3822', '67', '70', '0', '-4491.12', '1668.12', '165.043', '2.20469', '3619:0 3614:0 3621:0 '),\n('3621', 'shmv1317', '530', '3520', '3822', '67', '70', '0', '-4564.8', '1670.31', '174.579', '3.11182', '3620:0 '),\n('3622', 'shmv1318', '530', '3520', '3520', '67', '70', '0', '-4426.81', '1860.99', '159.258', '2.50232', '3613:0 3623:0 '),\n('3623', 'shmv1319', '530', '3520', '3930', '67', '70', '0', '-4488.03', '1934.26', '144.075', '1.12787', '3622:0 3624:0 '),\n('3624', 'shmv1320', '530', '3520', '3930', '67', '70', '0', '-4450.04', '1988.33', '105.344', '2.32482', '3623:0 3625:0 '),\n('3625', 'shmv1321', '530', '3520', '3930', '67', '70', '0', '-4500.91', '2022.31', '100.196', '4.19013', '3624:0 '),\n('3626', 'shmv1323', '530', '3520', '3929', '67', '70', '0', '-4234.47', '1405.21', '129.348', '4.72107', '3617:0 3627:0 '),\n('3627', 'shmv1324', '530', '3520', '3929', '67', '70', '0', '-4309.54', '1384.96', '143.997', '3.08352', '3626:0 3628:0 '),\n('3628', 'shmv1325', '530', '3520', '3950', '67', '70', '0', '-4558.9', '1328.47', '135.392', '6.27616', '3627:0 3629:0 '),\n('3629', 'shmv1326', '530', '3520', '3929', '67', '70', '0', '-4452.67', '1313.79', '113.624', '0.000826359', '3628:0 3630:0 '),\n('3630', 'shmv1327', '530', '3520', '3929', '67', '70', '0', '-4318.73', '1322.33', '73.5928', '6.21333', '3629:0 3631:0 3634:0 '),\n('3631', 'shmv1328', '530', '3520', '3929', '67', '70', '0', '-4226.21', '1305.14', '56.0568', '6.20155', '3630:0 3632:0 '),\n('3632', 'shmv1329', '530', '3520', '3929', '67', '70', '0', '-4117.45', '1299.67', '52.606', '1.29281', '3631:0 3633:0 '),\n('3633', 'shmv1330', '530', '3520', '3520', '67', '70', '0', '-4096.52', '1451.91', '87.6478', '5.2198', '3632:0 3573:0 '),\n('3634', 'shmv1331', '530', '3520', '3929', '67', '70', '0', '-4403.59', '1300.45', '84.0575', '3.42125', '3630:0 3635:0 '),\n('3635', 'shmv1332', '530', '3520', '3520', '67', '70', '0', '-4511.47', '1203.3', '34.9082', '3.43695', '3634:0 3636:0 '),\n('3636', 'shmv1333', '530', '3520', '3945', '67', '70', '0', '-4641.99', '1163.55', '-14.0182', '0.205018', '3635:0 3637:0 '),\n('3637', 'shmv1334', '530', '3520', '3945', '67', '70', '0', '-4660.62', '1088.53', '0.90432', '5.98162', '3636:0 '),\n('3638', 'shmv1335', '530', '3520', '3938', '67', '70', '1', '-4090.85', '1104.54', '41.0582', '5.28662', '3575:0 3639:0 '),\n('3639', 'shmv1336', '530', '3520', '3758', '67', '70', '0', '-4110.45', '861.06', '9.26995', '4.56397', '3638:0 3576:0 3577:0 3640:0 '),\n('3640', 'shmv1337', '530', '3520', '3939', '67', '70', '0', '-4149.68', '586.65', '8.64057', '4.66214', '3639:0 3641:0 '),\n('3641', 'shmv1338', '530', '3520', '3939', '67', '70', '0', '-4184.61', '489.528', '29.5585', '1.24958', '3642:0 3643:0 3640:0 '),\n('3642', 'shmv1339', '530', '3520', '3939', '67', '70', '0', '-4114.39', '424.914', '34.9882', '2.74575', '3641:0 '),\n('3643', 'shmv1341', '530', '3520', '3939', '67', '70', '0', '-4224.07', '420.493', '51.1341', '1.46947', '3641:0 3644:0 '),\n('3644', 'shmv1342', '530', '3520', '3939', '67', '70', '0', '-4299.45', '334.074', '109.437', '3.99453', '3643:0 3645:0 '),\n('3645', 'shmv1344', '530', '3520', '3939', '67', '70', '0', '-4202.19', '250.869', '124.805', '2.69862', '3644:0 3646:0 '),\n('3646', 'shmv1345', '530', '3520', '3939', '67', '70', '0', '-4203.68', '345.854', '115.285', '1.493', '3645:0 '),\n('3647', 'shmv1346', '530', '3520', '3520', '67', '70', '0', '-3501.72', '557.894', '16.7235', '0.323666', '3579:0 3648:0 '),\n('3648', 'shmv1347', '530', '3520', '3757', '67', '70', '0', '-3426.99', '580.376', '42.2179', '5.95105', '3647:0 3649:0 '),\n('3649', 'shmv1348', '530', '3520', '3757', '67', '70', '0', '-3327.45', '544.282', '74.5225', '4.63944', '3648:0 3650:0 '),\n('3650', 'shmv1349', '530', '3520', '3757', '67', '70', '0', '-3333.62', '454.382', '99.8124', '6.05315', '3649:0 3651:0 3658:0 '),\n('3651', 'shmv1350', '530', '3520', '3757', '67', '70', '0', '-3228.24', '439.514', '104.731', '3.31604', '3650:0 3652:0 '),\n('3652', 'shmv1351', '530', '3520', '3757', '67', '70', '0', '-3392.06', '415.921', '103.96', '4.61195', '3651:0 3653:0 3658:0 '),\n('3653', 'shmv1352', '530', '3520', '3757', '67', '70', '0', '-3390.43', '293.527', '103.961', '4.72583', '3652:0 3654:0 '),\n('3654', 'shmv1353', '530', '3520', '3757', '67', '70', '0', '-3337.54', '294.86', '116.382', '1.36824', '3653:0 3655:0 '),\n('3655', 'shmv1354', '530', '3520', '3757', '67', '70', '0', '-3324.03', '371.217', '120.458', '5.9746', '3654:0 3656:0 '),\n('3656', 'shmv1355', '530', '3520', '3757', '67', '70', '0', '-3231.77', '337.352', '127.504', '4.49021', '3655:0 3657:0 '),\n('3657', 'shmv1356', '530', '3520', '3757', '67', '70', '0', '-3239.92', '279.443', '137.131', '4.57267', '3656:0 '),\n('3658', 'shmv1357', '530', '3520', '3757', '67', '70', '0', '-3416.2', '459.709', '103.935', '5.91964', '3650:0 3652:0 '),\n('3659', 'shmv1358', '530', '3520', '3756', '67', '70', '0', '-3685.39', '550.038', '35.0742', '2.93905', '3579:0 3660:0 '),\n('3660', 'shmv1359', '530', '3520', '3756', '67', '70', '0', '-3813.8', '565.02', '71.7251', '4.91432', '3659:0 3661:0 '),\n('3661', 'shmv1360', '530', '3520', '3756', '67', '70', '0', '-3802.41', '461.803', '99.9172', '4.68655', '3660:0 3662:0 3670:0 '),\n('3662', 'shmv1361', '530', '3520', '3756', '67', '70', '0', '-3896.83', '442.087', '104.97', '6.26668', '3661:0 3663:0 '),\n('3663', 'shmv1362', '530', '3520', '3756', '67', '70', '0', '-3719.39', '417.216', '104.061', '2.6833', '3662:0 3664:0 3670:0 '),\n('3664', 'shmv1363', '530', '3520', '3756', '67', '70', '0', '-3732.23', '295.716', '104.066', '3.10939', '3663:0 3665:0 '),\n('3665', 'shmv1364', '530', '3520', '3756', '67', '70', '0', '-3786.92', '297.908', '116.455', '3.10153', '3664:0 3666:0 '),\n('3666', 'shmv1365', '530', '3520', '3756', '67', '70', '0', '-3812.37', '248.065', '120.604', '1.80405', '3665:0 3667:0 '),\n('3667', 'shmv1366', '530', '3520', '3756', '67', '70', '0', '-3838.38', '357.549', '120.582', '1.80405', '3666:0 3668:0 '),\n('3668', 'shmv1367', '530', '3520', '3756', '67', '70', '0', '-3904.87', '343.016', '127.62', '4.76657', '3667:0 3669:0 '),\n('3669', 'shmv1368', '530', '3520', '3756', '67', '70', '0', '-3890.45', '282.542', '137.239', '3.8665', '3668:0 '),\n('3670', 'shmv1369', '530', '3520', '3756', '67', '70', '0', '-3719.66', '475.869', '104.038', '4.2914', '3663:0 3661:0 '),\n('3671', 'shmv1370', '530', '3520', '3754', '67', '70', '0', '-3124.49', '886.832', '-14.3889', '1.56135', '3583:0 3584:0 3672:0 '),\n('3672', 'shmv1371', '530', '3520', '3754', '67', '70', '1', '-3061.33', '830.398', '-10.215', '4.92836', '3671:0 3673:0 '),\n('3673', 'shmv1372', '530', '3520', '3520', '67', '70', '0', '-3030.95', '544.921', '-1.12904', '0.00390148', '3672:0 3674:0 '),\n('3674', 'shmv1373', '530', '3520', '3520', '67', '70', '0', '-2881.37', '547.854', '-13.197', '0.0196085', '3673:0 3675:0 '),\n('3675', 'shmv1374', '530', '3520', '3520', '67', '70', '0', '-2744.62', '677.917', '-16.4588', '1.42468', '3674:0 3676:0 '),\n('3676', 'shmv1375', '530', '3520', '3520', '67', '70', '0', '-2720.25', '857.215', '-3.3875', '4.54664', '3675:0 3677:0 '),\n('3677', 'shmv1376', '530', '3520', '3520', '67', '70', '0', '-2768.24', '985.559', '-2.57223', '2.06085', '3676:0 3678:0 '),\n('3678', 'shmv1377', '530', '3520', '3520', '67', '70', '0', '-2871.08', '1130.08', '8.92665', '3.16433', '3677:0 3679:0 '),\n('3679', 'shmv1378', '530', '3520', '3520', '67', '70', '0', '-2984.92', '1134.44', '-3.92959', '2.62712', '3678:0 3585:0 '),\n('3680', 'shmv1379', '530', '3520', '3753', '67', '70', '0', '-3245.6', '1189.8', '59.4774', '4.33927', '3585:0 3681:0 3685:0 '),\n('3681', 'shmv1380', '530', '3520', '3753', '67', '70', '0', '-3222.89', '1092.48', '64.7857', '6.14175', '3680:0 3682:0 3685:0 3686:0 '),\n('3682', 'shmv1381', '530', '3520', '3753', '67', '70', '0', '-3292.57', '985.163', '40.7467', '5.15608', '3681:0 3684:0 '),\n('3683', 'shmv1382', '530', '3520', '3753', '67', '70', '0', '-3344.18', '870.1', '-14.6762', '4.80342', '3581:0 3684:0 '),\n('3684', 'shmv1383', '530', '3520', '3753', '67', '70', '0', '-3205.87', '897.037', '49.1172', '0.192352', '3683:0 3682:0 '),\n('3685', 'shmv1384', '530', '3520', '3753', '67', '70', '0', '-3399.1', '1175.31', '50.0129', '3.15252', '3680:0 3681:0 3686:0 '),\n('3686', 'shmv1385', '530', '3520', '3753', '67', '70', '0', '-3335.34', '1043.32', '47.1116', '0.383668', '3681:0 3685:0 3726:0 '),\n('3687', 'shmv1386', '530', '3520', '3749', '67', '70', '0', '-2929.04', '1324.33', '7.92349', '5.43769', '3586:0 3688:0 '),\n('3688', 'shmv1387', '530', '3520', '3749', '67', '70', '0', '-2845.89', '1301.54', '6.02801', '3.20519', '3687:0 3689:0 '),\n('3689', 'shmv1388', '530', '3520', '3749', '67', '70', '0', '-2847.46', '1231.33', '6.78906', '1.62065', '3688:0 3690:0 '),\n('3690', 'shmv1390', '530', '3520', '3749', '67', '70', '0', '-2732.51', '1138.3', '2.89233', '2.40802', '3689:0 3691:0 '),\n('3691', 'shmv1391', '530', '3520', '3749', '67', '70', '0', '-2634.08', '1230.04', '11.146', '1.86804', '3692:0 3690:0 '),\n('3692', 'shmv1392', '530', '3520', '3749', '67', '70', '0', '-2651.9', '1282.45', '26.4813', '3.01869', '3691:0 3693:0 '),\n('3693', 'shmv1393', '530', '3520', '3749', '67', '70', '0', '-2710.39', '1300.75', '33.7332', '1.28218', '3692:0 3694:0 '),\n('3694', 'shmv1394', '530', '3520', '3749', '67', '70', '0', '-2690.89', '1361.98', '35.0836', '6.28124', '3693:0 3695:0 '),\n('3695', 'shmv1395', '530', '3520', '3749', '67', '70', '0', '-2617.04', '1355.97', '37.2382', '0.18183', '3694:0 3696:0 '),\n('3696', 'shmv1396', '530', '3520', '3749', '67', '70', '0', '-2769.22', '1301.12', '33.2111', '3.48993', '3695:0 3697:0 3699:0 '),\n('3697', 'shmv1397', '530', '3520', '3749', '67', '70', '0', '-2721.9', '1224.71', '33.0771', '5.26886', '3696:0 3698:0 '),\n('3698', 'shmv1398', '530', '3520', '3749', '67', '70', '0', '-2817.63', '1365.79', '38.5145', '5.53669', '3697:0 3699:0 '),\n('3699', 'shmv1399', '530', '3520', '3749', '67', '70', '0', '-2766.14', '1383.17', '37.6732', '0.325571', '3698:0 3696:0 '),\n('3700', 'shmv1400', '530', '3520', '3743', '67', '70', '0', '-3280.76', '3002.45', '141.658', '1.22092', '3540:0 3701:0 '),\n('3701', 'shmv1401', '530', '3520', '3743', '67', '70', '0', '-3273.62', '3077.71', '139.787', '0.31771', '3700:0 3702:0 '),\n('3702', 'shmv1402', '530', '3520', '3743', '67', '70', '0', '-3211.67', '3079.46', '126.239', '5.52566', '3701:0 3703:0 '),\n('3703', 'shmv1403', '530', '3520', '3743', '67', '70', '0', '-3143.09', '3024.9', '104.296', '5.41086', '3538:0 3702:0 '),\n('3704', 'shmv1405', '530', '3520', '3752', '67', '70', '0', '-3656.3', '2553.97', '77.5087', '0.0120506', '3555:0 3559:0 '),\n('3705', 'shmv1406', '530', '3520', '3750', '67', '70', '0', '-2941.74', '1589.4', '40.8211', '2.08903', '3588:0 3706:0 '),\n('3706', 'shmv1407', '530', '3520', '3750', '67', '70', '0', '-2978.15', '1677.35', '67.3118', '2.1715', '3705:0 3707:0 '),\n('3707', 'shmv1408', '530', '3520', '3750', '67', '70', '0', '-3032.93', '1672.83', '67.4735', '3.60878', '3706:0 3708:0 3711:0 '),\n('3708', 'shmv1409', '530', '3520', '3750', '67', '70', '0', '-3131.22', '1754.16', '79.6664', '2.79589', '3707:0 3709:0 '),\n('3709', 'shmv1410', '530', '3520', '3750', '67', '70', '0', '-3191.61', '1765.69', '88.3304', '2.95297', '3708:0 3710:0 '),\n('3710', 'shmv1411', '530', '3520', '3520', '67', '70', '0', '-3345.81', '1700.42', '95.7466', '5.65474', '3709:0 3711:0 '),\n('3711', 'shmv1412', '530', '3520', '3520', '67', '70', '0', '-3188.39', '1586.02', '63.3792', '0.565352', '3710:0 3707:0 3712:0 3714:0 '),\n('3712', 'shmv1413', '530', '3520', '3520', '67', '70', '0', '-3052.53', '1476.53', '17.9049', '2.50057', '3711:0 3713:0 '),\n('3713', 'shmv1414', '530', '3520', '3520', '67', '70', '0', '-3107.69', '1379.15', '12.0022', '4.19702', '3712:0 '),\n('3714', 'shmv1415', '530', '3520', '3750', '67', '70', '0', '-3103.19', '1550.28', '39.5694', '2.77978', '3711:0 3715:0 '),\n('3715', 'shmv1416', '530', '3520', '3520', '67', '70', '0', '-3196.31', '1501.96', '57.1479', '2.95256', '3714:0 3716:0 '),\n('3716', 'shmv1417', '530', '3520', '3747', '67', '70', '0', '-3282.99', '1527.47', '52.2295', '5.92921', '3715:0 3717:0 '),\n('3717', 'shmv1418', '530', '3520', '3747', '67', '70', '0', '-3394.49', '1550.46', '48.1579', '2.93214', '3716:0 3718:0 '),\n('3718', 'shmv1419', '530', '3520', '3747', '67', '70', '0', '-3500.47', '1622.81', '43.8418', '3.38295', '3717:0 3719:0 '),\n('3719', 'shmv1420', '530', '3520', '3747', '67', '70', '0', '-3693.06', '1558.48', '46.9758', '1.02649', '3718:0 3720:0 '),\n('3720', 'shmv1421', '530', '3520', '3747', '67', '70', '0', '-3828.74', '1475.85', '43.1674', '4.10996', '3719:0 3721:0 '),\n('3721', 'shmv1422', '530', '3520', '3747', '67', '70', '0', '-3888.12', '1398.74', '43.6642', '4.04478', '3720:0 3722:0 '),\n('3722', 'shmv1423', '530', '3520', '3747', '67', '70', '0', '-3858.68', '1336.7', '42.2274', '4.47911', '3721:0 3723:0 '),\n('3723', 'shmv1424', '530', '3520', '3747', '67', '70', '0', '-3883.95', '1244.97', '42.1164', '4.44376', '3722:0 3724:0 3725:0 '),\n('3724', 'shmv1425', '530', '3520', '3520', '67', '70', '0', '-3774.38', '1225.16', '84.9138', '6.04598', '3723:0 '),\n('3725', 'shmv1426', '530', '3520', '3520', '67', '70', '0', '-3969.44', '1164.97', '46.6673', '5.0878', '3723:0 3575:0 '),\n('3726', 'shmv1427', '530', '3520', '3753', '67', '70', '0', '-3423.61', '1074.97', '42.8376', '3.2539', '3686:0 3727:0 '),\n('3727', 'shmv1428', '530', '3520', '3520', '67', '70', '0', '-3574.75', '1067.86', '40.499', '3.19107', '3726:0 3728:0 '),\n('3728', 'shmv1429', '530', '3520', '3821', '67', '70', '0', '-3680.33', '1058.59', '68.153', '2.90833', '3727:0 3729:0 3730:0 '),\n('3729', 'shmv1430', '530', '3520', '3821', '67', '70', '0', '-3760.76', '1068.11', '70.1361', '6.14809', '3728:0 '),\n('3730', 'shmv1431', '530', '3520', '3520', '67', '70', '0', '-3642.27', '894.441', '45.4124', '5.92247', '3728:0 3731:0 '),\n('3731', 'shmv1432', '530', '3520', '3520', '67', '70', '0', '-3522.57', '841.492', '-2.90146', '4.68834', '3730:0 3732:0 '),\n('3732', 'shmv1433', '530', '3520', '3520', '67', '70', '0', '-3522.09', '776.814', '-14.2281', '4.71976', '3731:0 3578:0 '),\n('3733', 'bt001', '571', '3537', '4129', '68', '73', '5', '2817.61', '6168.46', '85.5727', '3.94245', '3734:0 '),\n('3734', 'bt002', '571', '3537', '4020', '68', '73', '5', '2726.11', '6082.88', '72.3512', '3.45943', '3733:0 3735:0 '),\n('3735', 'bt003', '571', '3537', '4020', '68', '73', '0', '2604.99', '6083.81', '53.2961', '2.26563', '3734:0 3736:0 3786:0 '),\n('3736', 'bt004', '571', '3537', '4020', '68', '73', '0', '2505.63', '6178.07', '53.1691', '5.59574', '3735:0 3737:0 3793:0 '),\n('3737', 'bt005', '571', '3537', '4130', '68', '73', '0', '2589.16', '6313.74', '86.8706', '0.137219', '3736:0 3738:0 3786:0 '),\n('3738', 'bt006', '571', '3537', '3537', '68', '73', '0', '2818.32', '6342.97', '101.266', '3.15078', '3737:0 3739:0 3745:0 '),\n('3739', 'bt007', '571', '3537', '3537', '68', '73', '0', '2823.08', '6550.12', '55.029', '4.6077', '3738:0 3740:0 3744:0 '),\n('3740', 'bt008', '571', '3537', '4106', '68', '73', '0', '2946.88', '6730.38', '13.9226', '0.998791', '3739:0 3741:0 3742:0 '),\n('3741', 'bt009', '571', '3537', '4106', '68', '73', '0', '3100', '6716.93', '0.818624', '2.88374', '3740:0 '),\n('3742', 'bt010', '571', '3537', '4106', '68', '73', '0', '2769.6', '6817.13', '0.382068', '5.63656', '3740:0 3743:0 '),\n('3743', 'bt011', '571', '3537', '4031', '68', '73', '0', '2511.71', '6709.76', '8.65944', '0.559735', '3742:0 3744:0 '),\n('3744', 'bt012', '571', '3537', '4130', '68', '73', '0', '2598.94', '6513.07', '41.9513', '4.98704', '3743:0 3739:0 '),\n('3745', 'bt013', '571', '3537', '3537', '68', '73', '0', '2977.63', '6387.87', '96.0276', '3.55919', '3738:0 3746:0 '),\n('3746', 'bt014', '571', '3537', '3537', '68', '73', '0', '3117.74', '6401.57', '85.8869', '4.84331', '3745:0 3747:0 '),\n('3747', 'bt015', '571', '3537', '3537', '68', '73', '0', '3146.95', '6242.85', '96.6515', '5.78972', '3746:0 3748:0 '),\n('3748', 'bt016', '571', '3537', '4105', '68', '73', '0', '3332.48', '6165.54', '75.7667', '2.87983', '3747:0 '),\n('3749', 'bt017', '571', '3537', '3537', '68', '73', '0', '3270.88', '5961.4', '84.9677', '4.81845', '3750:0 3751:0 3780:0 '),\n('3750', 'bt018', '571', '3537', '3537', '68', '73', '1', '3624.25', '5933.39', '136.215', '3.44596', '3751:0 3749:0 '),\n('3751', 'bt019', '571', '3537', '4109', '68', '73', '0', '3297.83', '5691.4', '59.3737', '4.58728', '3750:0 3752:0 3749:0 '),\n('3752', 'bt020', '571', '3537', '3537', '68', '73', '0', '3304.79', '5470.21', '55.3479', '4.73257', '3751:0 3753:0 3806:0 '),\n('3753', 'bt021', '571', '3537', '3537', '68', '73', '0', '3482.47', '5425.21', '50.7507', '1.49045', '3752:0 3754:0 '),\n('3754', 'bt022', '571', '3537', '3537', '68', '73', '0', '3532.8', '5540.21', '65.5113', '4.20635', '3753:0 3755:0 3891:0 '),\n('3755', 'bt023', '571', '3537', '3537', '68', '73', '0', '3504.09', '5638.44', '63.5206', '1.09146', '3754:0 3756:0 3891:0 '),\n('3756', 'bt024', '571', '3537', '3537', '68', '73', '0', '3651.69', '5686.01', '66.2432', '0.569961', '3755:0 3757:0 3891:0 '),\n('3757', 'bt025', '571', '3537', '3537', '68', '73', '0', '3809.81', '5773.85', '68.3307', '0.134065', '3756:0 3758:0 3891:0 '),\n('3758', 'bt026', '571', '3537', '4127', '68', '73', '0', '3969.32', '5781.55', '74.0472', '0.432523', '3757:0 3759:0 3850:0 '),\n('3759', 'bt027', '571', '3537', '3537', '68', '73', '0', '4170.05', '5855.36', '62.8346', '0.137999', '3758:0 3760:0 3770:0 3773:0 '),\n('3760', 'bt028', '571', '3537', '3537', '68', '73', '0', '4324.68', '6015.4', '25.5474', '1.07655', '3759:0 3761:0 '),\n('3761', 'bt029', '571', '3537', '4099', '68', '73', '0', '4401.85', '6148.33', '0.553693', '4.54723', '3760:0 3762:0 '),\n('3762', 'bt030', '571', '3537', '4033', '68', '73', '0', '4287.27', '6236.78', '0.383892', '3.29845', '3761:0 3763:0 '),\n('3763', 'bt031', '571', '3537', '4033', '68', '73', '0', '4184.73', '6193.42', '9.12228', '1.7952', '3762:0 3764:0 '),\n('3764', 'bt032', '571', '3537', '4033', '68', '73', '0', '4149.36', '6252.75', '30.8789', '2.52797', '3763:0 3765:0 3766:0 '),\n('3765', 'bt033', '571', '3537', '4097', '68', '73', '0', '4056.14', '6303.43', '25.1363', '1.18887', '3764:0 '),\n('3766', 'bt034', '571', '3537', '4097', '68', '73', '0', '4052.65', '6367.67', '27.4251', '1.08833', '3764:0 3767:0 3769:0 '),\n('3767', 'bt035', '571', '3537', '4097', '68', '73', '0', '3991.71', '6304.02', '8.08314', '0.901407', '3766:0 '),\n('3768', 'bt036', '571', '3537', '4097', '68', '73', '0', '3854.4', '6397.67', '24.5748', '5.34115', '3769:0 '),\n('3769', 'bt037', '571', '3537', '4097', '68', '73', '0', '3960.88', '6426.15', '11.3447', '0.519589', '3766:0 3768:0 '),\n('3770', 'bt038', '571', '3537', '4134', '68', '73', '0', '4404.37', '5906.55', '55.8142', '0.126085', '3759:0 3771:0 3772:0 '),\n('3771', 'bt039', '571', '3537', '4132', '68', '73', '0', '4547.19', '6017.64', '76.7052', '4.37901', '3770:0 '),\n('3772', 'bt040', '571', '3537', '4122', '68', '73', '5', '4484.77', '5763.64', '79.4306', '1.41963', '3770:0 3773:0 '),\n('3773', 'bt041', '571', '3537', '4133', '68', '73', '0', '4321.96', '5776.59', '72.5697', '2.66048', '3772:0 3759:0 '),\n('3774', 'bt042', '571', '3537', '4032', '68', '73', '3', '2227.28', '5312.07', '10.5729', '1.23497', '3775:0 3805:0 '),\n('3775', 'bt043', '571', '3537', '4101', '68', '73', '0', '2273.96', '5439.49', '1.81269', '1.1525', '3774:0 3776:0 3787:0 3870:0 '),\n('3776', 'bt044', '571', '3537', '4101', '68', '73', '0', '2418.25', '5390.85', '3.76168', '0.12363', '3775:0 3777:0 '),\n('3777', 'bt045', '571', '3537', '3537', '68', '73', '0', '2601.94', '5522.47', '38.0963', '6.28036', '3776:0 3778:0 3787:0 3794:0 3802:0 '),\n('3778', 'bt046', '571', '3537', '3537', '68', '73', '0', '2887.65', '5415.26', '58.4905', '5.60492', '3777:0 3806:0 3813:0 '),\n('3779', 'bt047', '571', '3537', '4021', '68', '73', '0', '2976.39', '5660.32', '52.2738', '1.38733', '3780:0 '),\n('3780', 'bt048', '571', '3537', '4021', '68', '73', '0', '3019.96', '5816.72', '88.3166', '0.8297', '3779:0 3781:0 3749:0 '),\n('3781', 'bt049', '571', '3537', '4020', '68', '73', '0', '2993.07', '5973.66', '112.995', '5.04023', '3780:0 3782:0 '),\n('3782', 'bt050', '571', '3537', '4129', '68', '73', '0', '2915.6', '6074.59', '78.0969', '1.4863', '3781:0 3783:0 3798:0 '),\n('3783', 'bt051', '571', '3537', '4020', '68', '73', '0', '2970.01', '6149.83', '61.7495', '2.0298', '3782:0 3784:0 '),\n('3784', 'bt052', '571', '3537', '4020', '68', '73', '0', '2899.1', '6282.26', '61.4057', '2.97228', '3783:0 3785:0 '),\n('3785', 'bt053', '571', '3537', '4020', '68', '73', '0', '2773.74', '6303.56', '77.083', '3.07674', '3784:0 3786:0 '),\n('3786', 'bt054', '571', '3537', '4020', '68', '73', '0', '2654.28', '6218.95', '38.8344', '4.55721', '3785:0 3735:0 3737:0 '),\n('3787', 'bt055', '571', '3537', '3537', '68', '73', '0', '2316.99', '5624.68', '36.408', '5.33239', '3777:0 3775:0 3788:0 '),\n('3788', 'bt056', '571', '3537', '3537', '68', '73', '0', '2143.16', '5781.38', '58.7998', '1.77058', '3787:0 3791:0 '),\n('3789', 'bt057', '571', '3537', '4028', '68', '73', '0', '1868.5', '5774.99', '0.860459', '1.34802', '3871:0 '),\n('3790', 'bt058', '571', '3537', '4028', '68', '73', '0', '1923.91', '6030.9', '10.7946', '1.48154', '3791:0 3872:0 '),\n('3791', 'bt059', '571', '3537', '3537', '68', '73', '0', '2116.07', '6079.06', '52.9292', '3.89037', '3790:0 3788:0 3792:0 3800:0 '),\n('3792', 'bt060', '571', '3537', '4021', '68', '73', '0', '2104.14', '6314.43', '60.0072', '0.106311', '3791:0 3793:0 '),\n('3793', 'bt061', '571', '3537', '4021', '68', '73', '0', '2357.04', '6208.05', '40.7146', '2.64945', '3792:0 3736:0 '),\n('3794', 'bt062', '571', '3537', '4022', '68', '73', '0', '2647.51', '5693.12', '46.7099', '1.50275', '3777:0 3795:0 '),\n('3795', 'bt063', '571', '3537', '4022', '68', '73', '0', '2631.68', '5852.04', '45.3245', '5.86957', '3794:0 3796:0 '),\n('3796', 'bt064', '571', '3537', '4022', '68', '73', '0', '2763.87', '5811.38', '59.8902', '6.23478', '3795:0 3797:0 '),\n('3797', 'bt065', '571', '3537', '4021', '68', '73', '0', '2848.66', '5818.04', '101.625', '5.91276', '3796:0 3798:0 3799:0 '),\n('3798', 'bt066', '571', '3537', '4020', '68', '73', '0', '2837.49', '5974.58', '114.197', '5.01191', '3797:0 3782:0 '),\n('3799', 'bt067', '571', '3537', '4021', '68', '73', '0', '2607.08', '5956.42', '94.4153', '5.56483', '3797:0 3800:0 3801:0 '),\n('3800', 'bt068', '571', '3537', '4022', '68', '73', '0', '2327.62', '5973.77', '98.5945', '4.36317', '3791:0 3799:0 '),\n('3801', 'bt069', '571', '3537', '4022', '68', '73', '0', '2489.14', '5813.21', '139.945', '0.867364', '3799:0 '),\n('3802', 'bt070', '571', '3537', '4111', '68', '73', '0', '2684.66', '5308.92', '31.1745', '1.9606', '3777:0 3803:0 '),\n('3803', 'bt071', '571', '3537', '4111', '68', '73', '0', '2495.15', '5199.97', '32.4263', '0.802134', '3802:0 3804:0 '),\n('3804', 'bt072', '571', '3537', '4032', '68', '73', '0', '2416.87', '5247.86', '1.88448', '3.32877', '3803:0 3805:0 '),\n('3805', 'bt073', '571', '3537', '4032', '68', '73', '3', '2334.99', '5249.7', '9.01216', '2.3698', '3774:0 3804:0 '),\n('3806', 'bt074', '571', '3537', '3537', '68', '73', '0', '3128.49', '5378.84', '58.5466', '0.00337601', '3778:0 3752:0 3807:0 3813:0 '),\n('3807', 'bt075', '571', '3537', '3537', '68', '73', '0', '3264.11', '5285.37', '39.4799', '3.97355', '3806:0 3808:0 3845:0 '),\n('3808', 'bt076', '571', '3537', '4043', '68', '73', '0', '3152.24', '5121.1', '38.3072', '4.18325', '3807:0 3809:0 3814:0 3845:0 '),\n('3809', 'bt077', '571', '3537', '4043', '68', '73', '0', '2949.22', '5102.38', '35.483', '3.44497', '3810:0 3813:0 3808:0 '),\n('3810', 'bt078', '571', '3537', '4043', '68', '73', '0', '2736.6', '5010.38', '28.1472', '3.12924', '3809:0 3811:0 '),\n('3811', 'bt079', '571', '3537', '4115', '68', '73', '0', '2737.31', '5202.71', '29.0469', '0.938766', '3810:0 3812:0 3813:0 '),\n('3812', 'bt080', '571', '3537', '4115', '68', '73', '0', '2535.47', '5082.9', '7.68824', '3.5887', '3811:0 '),\n('3813', 'bt081', '571', '3537', '3537', '68', '73', '0', '2918.19', '5295.64', '60.2339', '1.05579', '3778:0 3809:0 3811:0 3806:0 '),\n('3814', 'bt082', '571', '3537', '4041', '68', '73', '0', '3128.73', '4853.66', '2.08073', '1.16652', '3808:0 3815:0 '),\n('3815', 'bt083', '571', '3537', '4041', '68', '73', '0', '3050.52', '4655.31', '2.27362', '4.47304', '3814:0 3816:0 '),\n('3816', 'bt084', '571', '3537', '4043', '68', '73', '0', '3249.06', '4558.38', '29.5811', '5.62916', '3815:0 3817:0 '),\n('3817', 'bt085', '571', '3537', '4043', '68', '73', '0', '3284.24', '4264.38', '24.2109', '5.22075', '3816:0 3818:0 3892:0 '),\n('3818', 'bt086', '571', '3537', '4037', '68', '73', '4', '3412.42', '4072.4', '16.8945', '0.69685', '3817:0 3819:0 3820:0 3827:0 3893:0 '),\n('3819', 'bt087', '571', '3537', '4037', '68', '73', '5', '3463.15', '4158.38', '17.1932', '1.45869', '3818:0 '),\n('3820', 'bt088', '571', '3537', '4043', '68', '73', '0', '3662.21', '3965.65', '26.4976', '5.18541', '3818:0 3821:0 3832:0 '),\n('3821', 'bt089', '571', '3537', '4125', '68', '73', '0', '3676.8', '3741.97', '49.5236', '5.32678', '3820:0 3822:0 3832:0 '),\n('3822', 'bt090', '571', '3537', '4125', '68', '73', '0', '3823.07', '3647', '46.2292', '5.63701', '3821:0 3823:0 3825:0 3826:0 '),\n('3823', 'bt091', '571', '3537', '4135', '68', '73', '0', '4026.86', '3532.95', '104.358', '5.75874', '3822:0 3824:0 3826:0 '),\n('3824', 'bt092', '571', '3537', '4125', '68', '73', '0', '3935.56', '3404.04', '80.8418', '5.58987', '3823:0 3825:0 '),\n('3825', 'bt093', '571', '3537', '4125', '68', '73', '0', '3825.9', '3505.46', '64.8278', '1.04239', '3822:0 3824:0 '),\n('3826', 'bt094', '571', '3537', '4125', '68', '73', '0', '3966.88', '3721.48', '61.9247', '4.14707', '3822:0 3823:0 '),\n('3827', 'bt095', '571', '3537', '4042', '68', '73', '0', '3416.97', '3883.04', '26.1293', '5.22225', '3818:0 3828:0 3893:0 '),\n('3828', 'bt096', '571', '3537', '4042', '68', '73', '0', '3450.42', '3652.26', '27.974', '2.1592', '3827:0 3829:0 3894:0 '),\n('3829', 'bt097', '571', '3537', '4042', '68', '73', '0', '3456.33', '3430.49', '17.996', '4.9827', '3828:0 3830:0 '),\n('3830', 'bt098', '571', '3537', '4042', '68', '73', '0', '3518.4', '3187.54', '25.0806', '4.80206', '3829:0 3831:0 '),\n('3831', 'bt099', '571', '65', '4478', '68', '73', '0', '3572.51', '3037.08', '26.2165', '3.86352', '3830:0 4063:0 '),\n('3832', 'bt100', '571', '3537', '3537', '68', '73', '0', '3907.42', '4000.44', '45.1941', '4.47613', '3820:0 3821:0 3833:0 '),\n('3833', 'bt101', '571', '3537', '3537', '68', '73', '0', '4042.02', '4199.98', '49.6907', '0.696007', '3832:0 3834:0 '),\n('3834', 'bt102', '571', '3537', '3537', '68', '73', '0', '4186.94', '4464.21', '27.3466', '1.05336', '3833:0 3835:0 '),\n('3835', 'bt103', '571', '3537', '4119', '68', '73', '0', '4191.29', '4697.78', '12.0312', '2.68463', '3834:0 3836:0 3837:0 3838:0 3862:0 '),\n('3836', 'bt104', '571', '3537', '4118', '68', '73', '0', '4358.92', '4576.58', '16.3385', '5.84976', '3835:0 '),\n('3837', 'bt105', '571', '3537', '4036', '68', '73', '0', '3992.84', '4812.66', '11.7213', '5.55524', '3835:0 '),\n('3838', 'bt106', '571', '3537', '4119', '68', '73', '0', '3978.85', '4564.24', '-2.51875', '3.44252', '3835:0 3839:0 3868:0 '),\n('3839', 'bt107', '571', '3537', '4117', '68', '73', '0', '3699.55', '4487.54', '-0.818554', '2.97836', '3838:0 3840:0 '),\n('3840', 'bt108', '571', '3537', '4117', '68', '73', '0', '3443.04', '4422.46', '-0.530089', '0.645731', '3839:0 3841:0 '),\n('3841', 'bt109', '571', '3537', '4035', '68', '73', '0', '3568.75', '4584.96', '-13.5973', '0.527922', '3840:0 3842:0 '),\n('3842', 'bt110', '571', '3537', '4035', '68', '73', '0', '3686.72', '4734.84', '-12.073', '1.14839', '3841:0 3843:0 3869:0 '),\n('3843', 'bt111', '571', '3537', '4035', '68', '73', '0', '3703.7', '4927.72', '-12.9951', '2.73489', '3842:0 3844:0 3866:0 '),\n('3844', 'bt112', '571', '3537', '4116', '68', '73', '0', '3479.66', '5024.98', '-1.50934', '2.71133', '3843:0 3845:0 '),\n('3845', 'bt113', '571', '3537', '4116', '68', '73', '0', '3344.22', '5119.48', '13.0385', '2.55424', '3844:0 3807:0 3808:0 3846:0 '),\n('3846', 'bt114', '571', '3537', '4116', '68', '73', '0', '3589.81', '5076.79', '13.0073', '6.10424', '3845:0 3847:0 '),\n('3847', 'bt115', '571', '3537', '3537', '68', '73', '0', '3668.09', '5254.47', '34.8015', '1.05413', '3846:0 3848:0 3865:0 '),\n('3848', 'bt116', '571', '3537', '3537', '68', '73', '0', '3717.74', '5416.1', '41.956', '1.99268', '3847:0 3849:0 3891:0 '),\n('3849', 'bt117', '571', '3537', '3537', '68', '73', '0', '3919.2', '5534.82', '36.9202', '0.89312', '3848:0 3850:0 '),\n('3850', 'bt118', '571', '3537', '3537', '68', '73', '0', '4101.61', '5617.94', '41.1963', '5.88275', '3849:0 3758:0 3851:0 '),\n('3851', 'bt119', '571', '3537', '3537', '68', '73', '0', '4252.89', '5577.24', '46.4033', '5.33689', '3850:0 3852:0 3857:0 '),\n('3852', 'bt120', '571', '3537', '4123', '68', '73', '0', '4429.17', '5431.27', '38.6653', '5.43664', '3851:0 3853:0 '),\n('3853', 'bt121', '571', '3537', '4123', '68', '73', '0', '4389.18', '5365.34', '1.39626', '5.27172', '3852:0 3854:0 '),\n('3854', 'bt122', '571', '3537', '4123', '68', '73', '0', '4489.75', '5395.86', '-16.0358', '0.830292', '3853:0 3855:0 '),\n('3855', 'bt123', '571', '3537', '4123', '68', '73', '0', '4444.7', '5327.16', '-22.3982', '5.89611', '3854:0 3856:0 '),\n('3856', 'bt124', '571', '3537', '4123', '68', '73', '0', '4542.22', '5322.8', '-31.8246', '3.56034', '3855:0 '),\n('3857', 'bt125', '571', '3537', '4123', '68', '73', '0', '4522.99', '5561.63', '52.4235', '6.06731', '3851:0 3858:0 4598:0 '),\n('3858', 'bt126', '571', '3537', '4123', '68', '73', '0', '4530.95', '5430.29', '84.8166', '1.59052', '3857:0 3859:0 '),\n('3859', 'bt127', '571', '3537', '4123', '68', '73', '0', '4525.48', '5247.8', '73.7381', '4.37083', '3858:0 3860:0 '),\n('3860', 'bt128', '571', '3537', '4123', '68', '73', '0', '4475.24', '5066.41', '51.9566', '0.934718', '3859:0 3861:0 '),\n('3861', 'bt129', '571', '3537', '4123', '68', '73', '0', '4378.74', '5017.74', '24.8345', '2.46704', '3860:0 3862:0 3863:0 '),\n('3862', 'bt130', '571', '3537', '3537', '68', '73', '0', '4344.7', '4804.82', '24.8231', '4.24124', '3861:0 3835:0 '),\n('3863', 'bt131', '571', '3537', '4116', '68', '73', '0', '4205.12', '5146.23', '13.0876', '5.95813', '3861:0 3864:0 '),\n('3864', 'bt132', '571', '3537', '4108', '68', '73', '3', '4060.38', '5267.77', '24.7438', '5.56545', '3863:0 3865:0 '),\n('3865', 'bt133', '571', '3537', '4116', '68', '73', '0', '3893.4', '5186.84', '13.0414', '3.37026', '3864:0 3847:0 3866:0 '),\n('3866', 'bt134', '571', '3537', '4116', '68', '73', '0', '3840.13', '5037.99', '-1.50988', '0.413233', '3865:0 3843:0 3867:0 '),\n('3867', 'bt135', '571', '3537', '4035', '68', '73', '0', '3925.28', '4915.39', '-12.887', '4.60333', '3866:0 3868:0 '),\n('3868', 'bt136', '571', '3537', '4035', '68', '73', '0', '3887.73', '4693.73', '-12.995', '4.14386', '3867:0 3838:0 3869:0 '),\n('3869', 'bt137', '571', '3537', '4035', '68', '73', '0', '3732.85', '4647.89', '-12.6525', '0.821628', '3868:0 3842:0 '),\n('3870', 'bt138', '571', '3537', '4101', '68', '73', '0', '2084.44', '5480.67', '0.253263', '0.428928', '3775:0 3871:0 '),\n('3871', 'bt139', '571', '3537', '3537', '68', '73', '0', '1935.03', '5589.92', '0.355845', '5.97934', '3870:0 3789:0 '),\n('3872', 'bt140', '571', '3537', '4029', '68', '73', '0', '1494.92', '5829.11', '1.38787', '4.0072', '3790:0 3873:0 '),\n('3873', 'bt141', '571', '3537', '4029', '68', '73', '0', '1384.5', '5858.44', '15.4001', '4.19177', '3872:0 3874:0 '),\n('3874', 'bt142', '571', '3537', '4029', '68', '73', '0', '1449.43', '5734.18', '1.3254', '1.10514', '3873:0 3875:0 '),\n('3875', 'bt143', '571', '3537', '4029', '68', '73', '0', '1402.52', '5714.94', '23.5628', '4.00326', '3874:0 3876:0 '),\n('3876', 'bt144', '571', '3537', '4029', '68', '73', '0', '1316.7', '5605.69', '5.52566', '5.40127', '3875:0 '),\n('3877', 'bt145', '571', '3537', '4024', '68', '73', '0', '4152.49', '7034.79', '165.636', '2.43875', '3878:0 3890:0 '),\n('3878', 'bt146', '571', '3537', '4024', '68', '73', '0', '3999', '7159.1', '167.793', '0.0786215', '3877:0 3879:0 '),\n('3879', 'bt147', '571', '3537', '4024', '68', '73', '0', '3840.49', '7254.47', '172.045', '3.52653', '3878:0 3880:0 3882:0 '),\n('3880', 'bt148', '571', '3537', '4024', '68', '73', '0', '3676.61', '7110.41', '160.171', '4.50434', '3879:0 3881:0 3883:0 '),\n('3881', 'bt149', '571', '3537', '4024', '68', '73', '0', '3597.15', '7199.39', '221.934', '1.51276', '3880:0 3882:0 3883:0 '),\n('3882', 'bt150', '571', '3537', '4024', '68', '73', '0', '3751.72', '7333.67', '208.956', '0.378648', '3881:0 3879:0 '),\n('3883', 'bt151', '571', '3537', '4024', '68', '73', '0', '3611.29', '6969.11', '170.734', '1.15225', '3880:0 3881:0 3884:0 '),\n('3884', 'bt152', '571', '3537', '4024', '68', '73', '0', '3644.46', '6805.44', '166.924', '3.99932', '3883:0 3885:0 '),\n('3885', 'bt153', '571', '3537', '4121', '68', '73', '1', '3587.41', '6661.1', '195.429', '4.60014', '3884:0 3886:0 '),\n('3886', 'bt154', '571', '3537', '4024', '68', '73', '0', '3749.63', '6602.97', '169.446', '3.8658', '3885:0 3887:0 3889:0 '),\n('3887', 'bt155', '571', '3537', '4024', '68', '73', '0', '3912.17', '6596.2', '168.227', '0.700643', '3886:0 3888:0 '),\n('3888', 'bt156', '571', '3537', '4024', '68', '73', '0', '3971.08', '6785.73', '156.758', '4.88682', '3887:0 3889:0 3890:0 '),\n('3889', 'bt157', '571', '3537', '4024', '68', '73', '0', '3826.86', '6694.29', '152.782', '4.14698', '3888:0 3886:0 '),\n('3890', 'bt158', '571', '3537', '4024', '68', '73', '0', '4074.45', '6887.11', '166.976', '1.01716', '3877:0 3888:0 '),\n('3891', 'bt159', '571', '3537', '4039', '68', '73', '0', '3663.21', '5603.77', '32.8151', '3.07099', '3754:0 3755:0 3756:0 3757:0 3848:0 '),\n('3892', 'bt160', '571', '3537', '4113', '68', '73', '1', '2913.96', '4067.33', '1.63263', '0.498753', '3817:0 3893:0 '),\n('3893', 'bt161', '571', '3537', '4138', '68', '73', '3', '3111.58', '3838.69', '22.5558', '0.795238', '3818:0 3827:0 3894:0 3892:0 '),\n('3894', 'bt162', '571', '3537', '4138', '68', '73', '0', '3323.93', '3770.67', '24.5945', '5.57327', '3893:0 3828:0 '),\n('3895', 'hf163', '571', '495', '3998', '68', '73', '3', '1418.1', '-3190.73', '162.344', '4.57189', '3896:0 '),\n('3896', 'hf164', '571', '495', '3998', '68', '73', '2', '1365.12', '-3385.23', '185.736', '4.52084', '3895:0 3897:0 '),\n('3897', 'hf165', '571', '495', '4048', '68', '73', '0', '1219.72', '-3550.97', '164.966', '4.23495', '3896:0 3898:0 '),\n('3898', 'hf166', '571', '495', '4048', '68', '73', '0', '1121.91', '-3657.07', '156.248', '4.07787', '3897:0 3899:0 3939:0 '),\n('3899', 'hf167', '571', '495', '4048', '68', '73', '0', '1046.11', '-3833.51', '162.833', '4.6512', '3898:0 3900:0 3912:0 3939:0 '),\n('3900', 'hf168', '571', '495', '4048', '68', '73', '0', '920.447', '-4015.29', '170.279', '3.21786', '3899:0 3901:0 3912:0 '),\n('3901', 'hf169', '571', '495', '3992', '68', '73', '0', '694.778', '-3872.94', '246.328', '2.73877', '3900:0 3902:0 '),\n('3902', 'hf170', '571', '495', '495', '68', '73', '0', '507.763', '-4025.28', '259.283', '4.81221', '3901:0 3903:0 '),\n('3903', 'hf171', '571', '495', '4260', '68', '73', '0', '397.137', '-4223.42', '249.354', '3.78334', '3902:0 3904:0 3933:0 '),\n('3904', 'hf172', '571', '495', '495', '68', '73', '0', '222.582', '-4391.88', '248.592', '4.40773', '3903:0 3905:0 4040:0 '),\n('3905', 'hf173', '571', '495', '3991', '68', '73', '0', '253.033', '-4572.61', '240.212', '5.55441', '3904:0 3906:0 4036:0 '),\n('3906', 'hf174', '571', '495', '3991', '68', '73', '5', '371.97', '-4633.54', '245.156', '2.78588', '3905:0 3907:0 3911:0 4039:0 '),\n('3907', 'hf175', '571', '495', '3991', '68', '73', '4', '407.209', '-4712.58', '228.909', '5.83714', '3906:0 3908:0 '),\n('3908', 'hf176', '571', '495', '3991', '68', '73', '0', '510.661', '-4763.01', '208.318', '0.924468', '3907:0 3909:0 4036:0 '),\n('3909', 'hf177', '571', '495', '495', '68', '73', '0', '628.585', '-4581.53', '203.482', '0.904833', '3908:0 3910:0 '),\n('3910', 'hf178', '571', '495', '3991', '68', '73', '0', '460.455', '-4423.52', '211.022', '2.64078', '3909:0 3911:0 3933:0 '),\n('3911', 'hf179', '571', '495', '3991', '68', '73', '4', '383.884', '-4495.8', '236.504', '4.36866', '3910:0 3906:0 '),\n('3912', 'hf180', '571', '495', '495', '68', '73', '0', '1081.71', '-4036.81', '154.348', '4.76135', '3899:0 3900:0 3939:0 '),\n('3913', 'hf181', '571', '495', '495', '68', '73', '0', '1215.66', '-4263.51', '149.864', '5.26401', '3914:0 '),\n('3914', 'hf182', '571', '495', '495', '68', '73', '0', '1258.74', '-4522.15', '173.24', '3.83852', '3913:0 3915:0 '),\n('3915', 'hf183', '571', '495', '495', '68', '73', '0', '1124.26', '-4644.36', '183.694', '3.62646', '3914:0 3916:0 '),\n('3916', 'hf184', '571', '495', '495', '68', '73', '0', '857.223', '-4730.31', '113.82', '0.273598', '3915:0 3917:0 '),\n('3917', 'hf185', '571', '495', '495', '68', '73', '0', '706.968', '-4825.12', '79.1984', '4.0553', '3916:0 3918:0 '),\n('3918', 'hf186', '571', '495', '3981', '68', '73', '2', '634.301', '-4890.02', '28.6664', '4.92709', '3917:0 3919:0 3932:0 '),\n('3919', 'hf187', '571', '495', '3981', '68', '73', '2', '682.36', '-4963', '6.24529', '0.414974', '3918:0 3920:0 3932:0 '),\n('3920', 'hf188', '571', '495', '3982', '68', '73', '0', '854.979', '-4933.54', '4.27721', '0.230407', '3919:0 3921:0 '),\n('3921', 'hf189', '571', '495', '3982', '68', '73', '0', '1039.98', '-4925.08', '9.42985', '0.387488', '3920:0 3922:0 '),\n('3922', 'hf190', '571', '495', '3982', '68', '73', '0', '945.95', '-4873.37', '4.59329', '0.540618', '3921:0 3923:0 '),\n('3923', 'hf191', '571', '495', '3982', '68', '73', '0', '1068.1', '-4819.17', '26.6749', '3.6728', '3922:0 3924:0 '),\n('3924', 'hf192', '571', '495', '3983', '68', '73', '0', '1158.2', '-4813.94', '28.9399', '0.405537', '3923:0 3925:0 '),\n('3925', 'hf193', '571', '495', '3983', '68', '73', '0', '1104.87', '-4804.91', '-6.8197', '0.572031', '3924:0 3926:0 '),\n('3926', 'hf194', '571', '495', '3983', '1', '60', '0', '980.459', '-4819.09', '-72.4413', '0.31677', '3925:0 3927:0 '),\n('3927', 'hf195', '571', '495', '3983', '68', '73', '0', '841.596', '-4863.98', '-72.4161', '5.00561', '3926:0 3928:0 3929:0 '),\n('3928', 'hf196', '571', '495', '3983', '68', '73', '0', '875.874', '-4966.04', '-72.4404', '1.87186', '3927:0 '),\n('3929', 'hf197', '571', '495', '495', '68', '73', '0', '795.673', '-4726.51', '-96.2356', '1.47131', '3927:0 3930:0 '),\n('3930', 'hf198', '571', '495', '3983', '68', '73', '0', '835.937', '-4866.89', '-115.736', '2.10747', '3929:0 3931:0 '),\n('3931', 'hf199', '571', '495', '3983', '68', '73', '0', '945.547', '-4827.44', '-116.158', '0.281421', '3930:0 '),\n('3932', 'hf200', '571', '495', '3981', '68', '73', '3', '554.553', '-4986.67', '10.1867', '0.251579', '3918:0 3919:0 '),\n('3933', 'hf201', '571', '495', '495', '68', '73', '0', '628.213', '-4255.8', '210.916', '3.49527', '3903:0 3910:0 3934:0 '),\n('3934', 'hf202', '571', '495', '3994', '68', '73', '0', '765.99', '-4299.85', '185.031', '3.00833', '3933:0 3935:0 '),\n('3935', 'hf203', '571', '495', '3994', '68', '73', '0', '798.758', '-4362.47', '161.294', '4.9679', '3934:0 3936:0 '),\n('3936', 'hf204', '571', '495', '3994', '68', '73', '0', '902.1', '-4478.73', '144.331', '5.55301', '3935:0 3937:0 3938:0 '),\n('3937', 'hf205', '571', '495', '3994', '68', '73', '0', '1004.65', '-4395.88', '150.922', '4.0804', '3936:0 3938:0 '),\n('3938', 'hf206', '571', '495', '3994', '68', '73', '0', '909.858', '-4395.54', '139.649', '4.34665', '3937:0 3936:0 '),\n('3939', 'hf207', '571', '495', '4048', '68', '73', '0', '1203.65', '-3825.84', '142.684', '1.05976', '3898:0 3899:0 3912:0 3940:0 '),\n('3940', 'hf208', '571', '495', '495', '68', '73', '0', '1408.56', '-3737.55', '135.962', '1.67629', '3939:0 3941:0 '),\n('3941', 'hf209', '571', '495', '495', '68', '73', '0', '1558.28', '-3740.43', '144.691', '0.00336027', '3940:0 3942:0 '),\n('3942', 'hf210', '571', '495', '495', '68', '73', '1', '1706.02', '-3730.74', '148.901', '3.19209', '3941:0 3943:0 3981:0 '),\n('3943', 'hf211', '571', '495', '495', '68', '73', '0', '1803.26', '-3895.57', '170.472', '0.273537', '3942:0 3944:0 '),\n('3944', 'hf212', '571', '495', '495', '68', '73', '0', '1949.63', '-3842.81', '173.777', '1.70846', '3943:0 3945:0 '),\n('3945', 'hf213', '571', '495', '4068', '68', '73', '0', '2008.1', '-3689.61', '173.671', '1.9378', '3944:0 3946:0 '),\n('3946', 'hf214', '571', '495', '4068', '68', '73', '0', '1967.39', '-3604.53', '158.109', '5.18071', '3945:0 3947:0 3985:0 '),\n('3947', 'hf215', '571', '495', '495', '68', '73', '0', '2096.74', '-3545.48', '153.897', '6.17032', '3946:0 3948:0 '),\n('3948', 'hf216', '571', '495', '495', '68', '73', '0', '2318.6', '-3583.13', '165.228', '0.334813', '3947:0 3949:0 '),\n('3949', 'hf217', '571', '495', '4006', '68', '73', '0', '2535.68', '-3475.65', '183.975', '0.49582', '3948:0 3950:0 3953:0 '),\n('3950', 'hf218', '571', '495', '4006', '68', '73', '0', '2624.04', '-3562.9', '205.26', '5.49331', '3949:0 3951:0 3953:0 '),\n('3951', 'hf219', '571', '495', '4006', '68', '73', '0', '2727.06', '-3698.08', '221.722', '5.46582', '3950:0 3952:0 '),\n('3952', 'hf220', '571', '495', '4065', '68', '73', '0', '2838.83', '-3844.63', '244.563', '5.37', '3951:0 '),\n('3953', 'hf221', '571', '495', '4006', '68', '73', '0', '2613.9', '-3384.95', '183', '4.543', '3949:0 3950:0 3954:0 3955:0 '),\n('3954', 'hf222', '571', '495', '4006', '68', '73', '0', '2724.44', '-3424.92', '224.685', '0.694536', '3953:0 '),\n('3955', 'hf223', '571', '495', '4054', '68', '73', '0', '2578.54', '-3191.48', '141.337', '1.90327', '3953:0 3956:0 '),\n('3956', 'hf224', '571', '495', '495', '68', '73', '0', '2515.29', '-2957.64', '111.213', '1.93861', '3955:0 3957:0 3965:0 4272:0 '),\n('3957', 'hf225', '571', '495', '4054', '68', '73', '0', '2301.09', '-3135.29', '143.7', '3.73482', '3956:0 3958:0 3964:0 '),\n('3958', 'hf226', '571', '495', '4054', '68', '73', '0', '2243.04', '-3261.92', '151.734', '2.70201', '3957:0 3959:0 '),\n('3959', 'hf227', '571', '495', '3999', '68', '73', '0', '2145.39', '-3331.7', '144.475', '1.2019', '3958:0 3960:0 '),\n('3960', 'hf228', '571', '495', '3999', '68', '73', '0', '2086.44', '-3330', '104.792', '3.06722', '3959:0 3961:0 '),\n('3961', 'hf229', '571', '495', '3999', '68', '73', '0', '1983.23', '-3286.99', '111.741', '1.78624', '3960:0 3962:0 '),\n('3962', 'hf230', '571', '495', '3999', '68', '73', '0', '2045.23', '-3172.46', '139.784', '4.15736', '3961:0 3963:0 '),\n('3963', 'hf231', '571', '495', '4062', '68', '73', '5', '2094.18', '-2981.02', '144.898', '4.45895', '3962:0 3964:0 '),\n('3964', 'hf232', '571', '495', '495', '68', '73', '0', '2264.88', '-3015.48', '135.084', '5.19722', '3963:0 3957:0 '),\n('3965', 'hf233', '571', '495', '495', '68', '73', '0', '2606.41', '-2825.71', '69.3506', '1.32522', '3956:0 3966:0 4272:0 '),\n('3966', 'hf234', '571', '495', '4070', '68', '73', '0', '2558.46', '-2678.02', '3.25504', '5.60171', '3965:0 3967:0 4276:0 '),\n('3967', 'hf235', '571', '495', '4070', '68', '73', '0', '2430.12', '-2758.92', '5.62901', '3.37275', '3966:0 3968:0 '),\n('3968', 'hf236', '571', '495', '4070', '68', '73', '0', '2281.27', '-2774.11', '4.91082', '0.329327', '3967:0 3969:0 '),\n('3969', 'hf237', '571', '495', '4070', '68', '73', '0', '2153.11', '-2770.66', '4.86218', '3.08765', '3968:0 3970:0 '),\n('3970', 'hf238', '571', '495', '4070', '68', '73', '0', '1967.15', '-2762.53', '3.5219', '3.17561', '3969:0 3971:0 '),\n('3971', 'hf239', '571', '495', '4070', '68', '73', '0', '1835.91', '-2814.57', '3.48005', '3.54396', '3970:0 3972:0 '),\n('3972', 'hf240', '571', '495', '4070', '68', '73', '0', '1677.38', '-2975.29', '3.95501', '4.155', '3971:0 3973:0 '),\n('3973', 'hf241', '571', '495', '4071', '68', '73', '0', '1576.78', '-3123.46', '2.99581', '4.44402', '3972:0 3974:0 3983:0 '),\n('3974', 'hf242', '571', '495', '4071', '68', '73', '0', '1609.87', '-3258.66', '3.34169', '4.86186', '3973:0 3975:0 '),\n('3975', 'hf243', '571', '495', '4071', '68', '73', '0', '1629.47', '-3440.1', '29.9326', '3.35783', '3974:0 3976:0 3984:0 '),\n('3976', 'hf244', '571', '495', '4071', '68', '73', '0', '1490.07', '-3428.63', '88.8301', '0.0332379', '3975:0 3977:0 '),\n('3977', 'hf245', '571', '495', '4071', '68', '73', '0', '1554.39', '-3419.81', '97.6795', '4.70636', '3976:0 3978:0 3980:0 3982:0 '),\n('3978', 'hf246', '571', '495', '4071', '68', '73', '0', '1638.14', '-3283.78', '76.0526', '5.23256', '3977:0 3979:0 '),\n('3979', 'hf247', '571', '495', '4071', '68', '73', '0', '1772.14', '-3327.31', '81.7587', '4.30737', '3978:0 '),\n('3980', 'hf248', '571', '495', '4071', '68', '73', '0', '1641.48', '-3512.7', '92.7675', '1.7077', '3977:0 3981:0 '),\n('3981', 'hf249', '571', '495', '495', '68', '73', '0', '1670.45', '-3682.65', '149.579', '1.75245', '3980:0 3942:0 3982:0 '),\n('3982', 'hf250', '571', '495', '4071', '68', '73', '0', '1565.95', '-3550.52', '112.177', '1.48387', '3981:0 3977:0 '),\n('3983', 'hf251', '571', '495', '495', '68', '73', '0', '1489.29', '-3099.07', '39.9696', '5.34802', '3973:0 3984:0 '),\n('3984', 'hf252', '571', '495', '4071', '68', '73', '0', '1511.33', '-3269.6', '74.5615', '0.545315', '3983:0 3975:0 '),\n('3985', 'hf253', '571', '495', '495', '68', '73', '0', '2104.47', '-3840.68', '209.54', '2.27867', '3946:0 3986:0 '),\n('3986', 'hf254', '571', '495', '4002', '68', '73', '0', '2068.75', '-4073.32', '236.821', '4.87048', '3985:0 3987:0 3993:0 '),\n('3987', 'hf255', '571', '495', '4002', '68', '73', '0', '1987.13', '-4141.88', '216.964', '3.23293', '3986:0 3988:0 '),\n('3988', 'hf256', '571', '495', '4002', '68', '73', '0', '1838.02', '-4120.86', '223.042', '2.70435', '3987:0 3989:0 3992:0 '),\n('3989', 'hf257', '571', '495', '4002', '68', '73', '0', '1672.75', '-4022.82', '249.031', '3.18894', '3988:0 3990:0 '),\n('3990', 'hf258', '571', '495', '4002', '68', '73', '0', '1693.59', '-4091.47', '270.671', '4.86183', '3989:0 3991:0 '),\n('3991', 'hf259', '571', '495', '4002', '68', '73', '0', '1644.9', '-4213.64', '258.417', '6.27555', '3990:0 3992:0 '),\n('3992', 'hf260', '571', '495', '4002', '68', '73', '0', '1773.12', '-4215.36', '238.947', '0.851593', '3991:0 3988:0 '),\n('3993', 'hf261', '571', '495', '495', '68', '73', '0', '2130.43', '-4316.44', '219.989', '1.40137', '3986:0 3994:0 '),\n('3994', 'hf262', '571', '495', '495', '68', '73', '0', '2183.63', '-4535.73', '216.514', '4.86106', '3993:0 3995:0 '),\n('3995', 'hf263', '571', '495', '495', '68', '73', '0', '2377.58', '-4396.75', '228.263', '0.804472', '3994:0 3996:0 '),\n('3996', 'hf264', '571', '495', '495', '68', '73', '0', '2551.09', '-4320.92', '279.902', '6.10198', '3995:0 3997:0 '),\n('3997', 'hf265', '571', '495', '4018', '68', '73', '5', '2613.73', '-4366.35', '276.555', '2.42318', '3996:0 3998:0 '),\n('3998', 'hf266', '571', '495', '4018', '68', '73', '4', '2716.59', '-4368.81', '272.672', '5.25063', '3997:0 3999:0 '),\n('3999', 'hf267', '571', '495', '495', '68', '73', '0', '2797.23', '-4621.23', '277.95', '5.09748', '3998:0 4000:0 4306:0 '),\n('4000', 'hf268', '571', '495', '495', '68', '73', '0', '2607.42', '-4744.93', '256.769', '3.77173', '3999:0 4001:0 '),\n('4001', 'hf269', '571', '495', '495', '68', '73', '0', '2455.43', '-4885.82', '260.773', '3.54789', '4000:0 4002:0 4005:0 '),\n('4002', 'hf270', '571', '495', '495', '68', '73', '3', '2431.15', '-4962.71', '273.723', '1.34484', '4001:0 4003:0 '),\n('4003', 'hf271', '571', '495', '4003', '68', '73', '2', '2510.75', '-4994.59', '283.35', '2.79784', '4002:0 4004:0 '),\n('4004', 'hf272', '571', '495', '4003', '68', '73', '2', '2456.13', '-5113.98', '277.313', '4.08197', '4003:0 '),\n('4005', 'hf273', '571', '495', '495', '68', '73', '0', '2232.27', '-4879.42', '237.068', '0.178543', '4001:0 4006:0 '),\n('4006', 'hf274', '571', '495', '495', '68', '73', '0', '2035.15', '-4874.68', '210.788', '3.93982', '4005:0 4007:0 4010:0 '),\n('4007', 'hf275', '571', '495', '495', '68', '73', '0', '1888.77', '-4884.63', '168.445', '3.11672', '4006:0 4008:0 '),\n('4008', 'hf276', '571', '495', '4059', '68', '73', '0', '1712.12', '-4879.28', '126.121', '3.13635', '4007:0 4009:0 '),\n('4009', 'hf277', '571', '495', '4059', '68', '73', '0', '1563', '-4951.92', '143.133', '4.04662', '4008:0 '),\n('4010', 'hf278', '571', '495', '495', '68', '73', '0', '1915.43', '-5076.01', '179.861', '4.59721', '4006:0 4011:0 '),\n('4011', 'hf279', '571', '495', '495', '68', '73', '0', '1824.95', '-5278.57', '182.601', '4.39143', '4010:0 4012:0 4018:0 '),\n('4012', 'hf280', '571', '495', '4061', '68', '73', '0', '1965.2', '-5427.02', '202.866', '6.04468', '4011:0 4013:0 '),\n('4013', 'hf281', '571', '495', '4061', '68', '73', '0', '2137.38', '-5461.32', '239.114', '6.25123', '4012:0 4014:0 '),\n('4014', 'hf282', '571', '495', '4061', '68', '73', '0', '2177.05', '-5614.25', '226.937', '4.76369', '4013:0 4015:0 4351:0 '),\n('4015', 'hf283', '571', '495', '4061', '68', '73', '0', '2173.72', '-5813.08', '225.029', '3.53925', '4014:0 4016:0 4351:0 '),\n('4016', 'hf284', '571', '495', '4061', '68', '73', '0', '1978.82', '-5763.87', '223.278', '2.62034', '4015:0 4017:0 '),\n('4017', 'hf285', '571', '495', '4061', '68', '73', '0', '1834.38', '-5629.13', '215.972', '1.48308', '4016:0 4018:0 '),\n('4018', 'hf286', '571', '495', '495', '68', '73', '1', '1667.21', '-5453.46', '197.385', '2.72951', '4017:0 4011:0 4019:0 4022:0 '),\n('4019', 'hf287', '571', '495', '4001', '68', '73', '0', '1532.35', '-5419.75', '189.418', '2.63761', '4018:0 4020:0 '),\n('4020', 'hf288', '571', '495', '4001', '68', '73', '0', '1486.1', '-5319.6', '195.08', '1.17912', '4019:0 4021:0 '),\n('4021', 'hf289', '571', '495', '4001', '68', '73', '0', '1504.6', '-5264.18', '206.615', '0.745568', '4020:0 '),\n('4022', 'hf290', '571', '495', '495', '68', '73', '0', '1492.09', '-5524.43', '200.456', '3.74892', '4018:0 4023:0 4026:0 '),\n('4023', 'hf291', '571', '495', '4403', '68', '73', '0', '1532.33', '-5613.29', '226.19', '4.85477', '4022:0 4024:0 '),\n('4024', 'hf292', '571', '495', '4402', '68', '73', '4', '1541.33', '-5689.58', '248.356', '1.64643', '4023:0 4025:0 '),\n('4025', 'hf293', '571', '495', '495', '68', '73', '5', '1631.27', '-5779.62', '258.389', '2.51272', '4024:0 '),\n('4026', 'hf294', '571', '495', '495', '68', '73', '0', '1394.07', '-5574.59', '205.361', '0.236628', '4022:0 4027:0 '),\n('4027', 'hf295', '571', '495', '495', '68', '73', '0', '1234.61', '-5679.7', '225.93', '3.5408', '4026:0 4028:0 4058:0 '),\n('4028', 'hf296', '571', '495', '3984', '68', '73', '0', '1037.41', '-5697.06', '228.706', '3.34052', '4027:0 4029:0 4062:0 '),\n('4029', 'hf297', '571', '495', '495', '68', '73', '0', '877.228', '-5789.41', '249.962', '3.77328', '4028:0 4030:0 '),\n('4030', 'hf298', '571', '495', '495', '68', '73', '0', '739.705', '-5863.89', '287.056', '4.11336', '4029:0 4031:0 '),\n('4031', 'hf299', '571', '495', '495', '68', '73', '3', '483.188', '-5922.44', '308.68', '1.33265', '4030:0 4032:0 '),\n('4032', 'hf300', '571', '495', '495', '68', '73', '0', '513.926', '-5588.33', '281.883', '2.6321', '4031:0 4033:0 '),\n('4033', 'hf301', '571', '495', '495', '68', '73', '0', '342.715', '-5438.85', '298.648', '2.30775', '4032:0 4034:0 '),\n('4034', 'hf302', '571', '495', '495', '68', '73', '0', '221.35', '-5242.73', '299.653', '1.84436', '4033:0 4035:0 '),\n('4035', 'hf303', '571', '495', '4057', '68', '73', '0', '161.173', '-4925.94', '298.444', '1.79331', '4034:0 4036:0 4037:0 4039:0 '),\n('4036', 'hf304', '571', '495', '495', '68', '73', '0', '285.533', '-4807.39', '248.989', '1.63624', '4035:0 3905:0 3908:0 '),\n('4037', 'hf305', '571', '495', '4057', '68', '73', '0', '-28.8267', '-4914.36', '302.775', '3.12851', '4035:0 4038:0 '),\n('4038', 'hf306', '571', '495', '4057', '68', '73', '0', '-143.121', '-5118.6', '323.883', '1.16107', '4037:0 '),\n('4039', 'hf307', '571', '495', '495', '68', '73', '0', '115.019', '-4716.56', '289.321', '1.68335', '4035:0 3906:0 4040:0 '),\n('4040', 'hf308', '571', '495', '495', '68', '73', '0', '156.917', '-4507.79', '256.612', '1.23411', '4039:0 3904:0 '),\n('4041', 'hf309', '571', '495', '3988', '68', '73', '1', '778.297', '-2898.22', '7.01161', '4.8391', '4042:0 '),\n('4042', 'hf310', '571', '495', '3987', '68', '73', '0', '741.908', '-3049.69', '25.2093', '3.79609', '4041:0 4043:0 4046:0 4047:0 4048:0 4049:0 '),\n('4043', 'hf311', '571', '495', '3987', '68', '73', '0', '590.131', '-3156.57', '40.1902', '3.94689', '4042:0 4044:0 4053:0 '),\n('4044', 'hf312', '571', '495', '3987', '68', '73', '0', '471.48', '-3318.84', '48.7074', '3.51255', '4043:0 4045:0 '),\n('4045', 'hf313', '571', '495', '3987', '68', '73', '0', '386.081', '-3089.98', '71.2014', '1.81688', '4044:0 4046:0 '),\n('4046', 'hf314', '571', '495', '3987', '68', '73', '0', '508.887', '-3028.15', '24.4901', '2.16561', '4045:0 4042:0 '),\n('4047', 'hf315', '571', '495', '3987', '68', '73', '0', '986.117', '-3034.77', '57.92', '0.46364', '4042:0 4048:0 '),\n('4048', 'hf316', '571', '495', '3987', '68', '73', '0', '749.692', '-3240.83', '24.9581', '2.15066', '4042:0 4047:0 4051:0 '),\n('4049', 'hf317', '571', '495', '3987', '68', '73', '0', '675.991', '-3161.57', '61.349', '1.00634', '4042:0 4050:0 '),\n('4050', 'hf318', '571', '495', '3987', '68', '73', '0', '677.454', '-3393.96', '67.7866', '4.88621', '4049:0 '),\n('4051', 'hf319', '571', '495', '3987', '68', '73', '0', '566.586', '-3287.72', '26.0315', '4.65294', '4048:0 4052:0 '),\n('4052', 'hf320', '571', '495', '4226', '68', '73', '0', '551.1', '-3494.05', '3.24654', '4.58853', '4051:0 '),\n('4053', 'hf321', '571', '495', '3987', '68', '73', '0', '370.473', '-3216.41', '23.421', '3.95629', '4043:0 4054:0 '),\n('4054', 'hf322', '571', '495', '4474', '68', '73', '0', '223.035', '-3291.75', '0.0638989', '3.59893', '4053:0 4055:0 '),\n('4055', 'hf323', '571', '495', '4474', '68', '73', '0', '114.305', '-3330.69', '0.616794', '0.370948', '4054:0 4056:0 '),\n('4056', 'hf324', '571', '495', '3989', '68', '73', '0', '-16.534', '-3453.36', '32.7157', '1.36763', '4055:0 4057:0 '),\n('4057', 'hf325', '571', '495', '3990', '68', '73', '0', '-130.721', '-3573.93', '3.18551', '1.92133', '4056:0 '),\n('4058', 'hf326', '571', '495', '495', '68', '73', '0', '1337.07', '-5914.2', '292.65', '4.10948', '4027:0 4059:0 '),\n('4059', 'hf327', '571', '495', '4005', '68', '73', '0', '1323.93', '-6111.92', '266.982', '3.40577', '4058:0 4060:0 '),\n('4060', 'hf328', '571', '495', '4005', '68', '73', '0', '1181.44', '-6169.63', '232.169', '2.26694', '4059:0 4061:0 '),\n('4061', 'hf329', '571', '495', '4005', '68', '73', '0', '1118.44', '-6156.85', '260.616', '1.64883', '4060:0 4062:0 '),\n('4062', 'hf330', '571', '495', '495', '68', '73', '0', '1131.33', '-5884.77', '271.705', '2.04153', '4061:0 4028:0 '),\n('4063', 'db331', '571', '65', '4478', '70', '74', '0', '3509.64', '2944.69', '24.9497', '4.10306', '3831:0 '),\n('4064', 'db332', '571', '65', '65', '70', '74', '0', '3526.72', '2777.23', '49.7018', '4.66854', '4065:0 4221:0 4228:0 '),\n('4065', 'db333', '571', '65', '4157', '70', '74', '0', '3369.46', '2655.03', '38.9276', '4.90416', '4064:0 4066:0 '),\n('4066', 'db334', '571', '65', '4157', '70', '74', '0', '3440.83', '2477.55', '45.9125', '4.61748', '4065:0 4067:0 '),\n('4067', 'db335', '571', '65', '4157', '70', '74', '0', '3395.92', '2379.05', '36.7537', '2.28876', '4066:0 4068:0 '),\n('4068', 'db336', '571', '65', '4157', '70', '74', '0', '3343.5', '2223.35', '29.9841', '5.39185', '4067:0 4070:0 4069:0 '),\n('4069', 'db337', '571', '65', '65', '70', '74', '3', '3489.08', '1998.02', '64.8654', '1.46526', '4068:0 4070:0 4214:0 '),\n('4070', 'db338', '571', '65', '4160', '70', '74', '0', '3228.78', '1905.36', '132.824', '3.97029', '4071:0 4068:0 4069:0 '),\n('4071', 'db339', '571', '65', '4160', '70', '74', '0', '2981.37', '1896.75', '127.972', '2.94456', '4070:0 4072:0 '),\n('4072', 'db340', '571', '65', '4160', '70', '74', '0', '2800.15', '1812.41', '147.093', '5.30074', '4071:0 4073:0 '),\n('4073', 'db341', '571', '65', '4160', '70', '74', '0', '2944.01', '1641.57', '152.165', '4.64493', '4072:0 4074:0 '),\n('4074', 'db342', '571', '65', '4153', '70', '74', '0', '2869.62', '1469.27', '157.603', '5.17349', '4073:0 4075:0 '),\n('4075', 'db343', '571', '65', '4153', '70', '74', '0', '2927.17', '1282.72', '151.277', '5.62666', '4074:0 4076:0 '),\n('4076', 'db344', '571', '65', '4153', '70', '74', '0', '3121.27', '1266.58', '158.478', '3.9082', '4075:0 4077:0 4082:0 '),\n('4077', 'db345', '571', '65', '4154', '70', '74', '0', '3098.59', '1055.28', '114.785', '4.75643', '4076:0 4078:0 4081:0 '),\n('4078', 'db346', '571', '65', '4152', '70', '74', '0', '3015.6', '886.551', '57.0023', '3.13067', '4077:0 4079:0 4081:0 '),\n('4079', 'db347', '571', '65', '4152', '70', '74', '0', '2864.53', '878.189', '19.1406', '2.82436', '4078:0 4080:0 '),\n('4080', 'db348', '571', '65', '4152', '70', '74', '1', '2657.93', '892.145', '4.37495', '3.30424', '4079:0 '),\n('4081', 'db349', '571', '65', '4154', '70', '74', '0', '3216.12', '884.158', '119.499', '2.58873', '4077:0 4078:0 4082:0 '),\n('4082', 'db350', '571', '65', '4154', '70', '74', '0', '3342.09', '1163.09', '140.364', '0.88363', '4076:0 4081:0 4083:0 '),\n('4083', 'db351', '571', '65', '4154', '70', '74', '0', '3499.57', '1159.74', '129.579', '0.224683', '4082:0 4084:0 4208:0 '),\n('4084', 'db352', '571', '65', '4254', '70', '74', '0', '3512.34', '930.529', '67.6824', '4.436', '4083:0 4085:0 '),\n('4085', 'db353', '571', '65', '4254', '70', '74', '0', '3439.05', '725.86', '74.9159', '3.52022', '4084:0 4086:0 '),\n('4086', 'db354', '571', '65', '4254', '70', '74', '0', '3383.4', '548.065', '79.6602', '4.13597', '4085:0 4087:0 '),\n('4087', 'db355', '571', '65', '4254', '70', '74', '0', '3284.71', '349.551', '72.0866', '4.38102', '4086:0 4088:0 '),\n('4088', 'db356', '571', '65', '4254', '70', '74', '0', '3258.62', '161.424', '74.762', '4.63863', '4087:0 4089:0 '),\n('4089', 'db357', '571', '65', '4254', '70', '74', '0', '3199.28', '-65.6434', '75.8214', '5.73582', '4088:0 4090:0 '),\n('4090', 'db358', '571', '65', '4254', '70', '74', '0', '3396.24', '-138.385', '72.6226', '6.16308', '4089:0 4091:0 4176:0 '),\n('4091', 'db359', '571', '65', '4176', '70', '74', '0', '3614.83', '-219.548', '59.6726', '5.91567', '4090:0 4092:0 '),\n('4092', 'db360', '571', '65', '4254', '70', '74', '0', '3790.53', '-250.696', '72.8378', '0.182258', '4091:0 4175:0 '),\n('4093', 'db361', '571', '65', '4254', '70', '74', '0', '3996.13', '-105.238', '55.0057', '0.538831', '4094:0 '),\n('4094', 'db362', '571', '65', '4254', '70', '74', '0', '4209.42', '-149.468', '68.6085', '5.25672', '4093:0 4095:0 '),\n('4095', 'db363', '571', '65', '4254', '70', '74', '0', '4346.6', '-340.238', '86.1907', '5.65727', '4094:0 4139:0 '),\n('4096', 'db364', '571', '65', '4254', '70', '74', '0', '4531.54', '-157.776', '94.5998', '0.726543', '4097:0 '),\n('4097', 'db365', '571', '65', '4253', '70', '74', '0', '4529.69', '-5.32293', '72.4325', '1.1538', '4096:0 4098:0 '),\n('4098', 'db366', '571', '65', '4187', '70', '74', '0', '4719.33', '26.5065', '64.7658', '0.68649', '4097:0 4099:0 '),\n('4099', 'db367', '571', '65', '4187', '70', '74', '0', '4857.73', '152.013', '95.1974', '0.64722', '4098:0 4100:0 4102:0 '),\n('4100', 'db368', '571', '65', '4187', '70', '74', '0', '5023.32', '291.159', '160.107', '0.61659', '4099:0 4101:0 '),\n('4101', 'db369', '571', '65', '4187', '70', '74', '0', '5185.63', '203.224', '194.36', '2.54081', '4100:0 4585:0 '),\n('4102', 'db370', '571', '65', '4187', '70', '74', '0', '4916.98', '373.751', '114.702', '2.28006', '4099:0 4103:0 '),\n('4103', 'db371', '571', '65', '4396', '70', '74', '0', '4715.84', '582.426', '121.086', '2.36646', '4102:0 4104:0 4136:0 '),\n('4104', 'db372', '571', '65', '4254', '70', '74', '0', '4669.25', '828.097', '110.706', '2.44265', '4105:0 4133:0 4103:0 '),\n('4105', 'db373', '571', '65', '4254', '70', '74', '0', '4441.38', '887.155', '84.3941', '2.82121', '4104:0 4106:0 4107:0 '),\n('4106', 'db374', '571', '65', '4254', '70', '74', '0', '4443.49', '662.985', '67.5233', '2.64843', '4105:0 4107:0 '),\n('4107', 'db375', '571', '65', '4254', '70', '74', '0', '4350.16', '761.448', '67.5378', '5.48843', '4106:0 4105:0 4108:0 '),\n('4108', 'db376', '571', '65', '4173', '70', '74', '0', '4171.02', '645.93', '64.3628', '5.72325', '4107:0 4109:0 '),\n('4109', 'db377', '571', '65', '4173', '70', '74', '0', '4234.66', '525', '11.3008', '1.28578', '4108:0 4110:0 '),\n('4110', 'db378', '571', '65', '4173', '70', '74', '0', '4325.75', '527.107', '-8.31338', '5.11853', '4109:0 4111:0 '),\n('4111', 'db379', '571', '65', '4173', '70', '74', '0', '4340.91', '393.399', '-6.35666', '0.319745', '4110:0 4112:0 '),\n('4112', 'db380', '571', '65', '4173', '70', '74', '0', '4445.71', '448.569', '48.7618', '3.60429', '4111:0 4113:0 '),\n('4113', 'db381', '571', '65', '4254', '70', '74', '0', '4396.23', '306.166', '44.9454', '3.30034', '4112:0 4114:0 '),\n('4114', 'db382', '571', '65', '4254', '70', '74', '0', '4238.24', '300.479', '69.4901', '3.54617', '4113:0 4115:0 '),\n('4115', 'db383', '571', '65', '4254', '70', '74', '0', '4069.57', '365.886', '52.151', '2.76941', '4114:0 4116:0 '),\n('4116', 'db384', '571', '65', '4254', '70', '74', '0', '3905.43', '429.963', '42.0653', '2.76941', '4115:0 4117:0 '),\n('4117', 'db385', '571', '65', '4254', '70', '74', '0', '3784.72', '555.764', '65.4753', '2.52593', '4116:0 4118:0 '),\n('4118', 'db386', '571', '65', '4254', '70', '74', '0', '3856.57', '647.11', '62.7715', '2.10102', '4117:0 4119:0 '),\n('4119', 'db387', '571', '65', '4254', '70', '74', '0', '3750.11', '814.498', '76.6706', '1.69811', '4118:0 4120:0 4123:0 '),\n('4120', 'db388', '571', '65', '4168', '70', '74', '0', '3669.68', '935.971', '55.9559', '1.74995', '4119:0 4121:0 '),\n('4121', 'db389', '571', '65', '4168', '70', '74', '0', '3656.82', '1058.49', '58.5011', '5.83088', '4120:0 4122:0 '),\n('4122', 'db390', '571', '65', '4168', '70', '74', '0', '3822.88', '1076.68', '57.7067', '4.99837', '4121:0 4123:0 '),\n('4123', 'db391', '571', '65', '4168', '70', '74', '0', '3851.01', '940.099', '56.0659', '4.66535', '4122:0 4119:0 4124:0 '),\n('4124', 'db392', '571', '65', '4254', '70', '74', '0', '4005.33', '1003', '53.2598', '6.17489', '4123:0 4125:0 '),\n('4125', 'db393', '571', '65', '4254', '70', '74', '0', '4142.41', '981.525', '78.4202', '0.463487', '4124:0 4126:0 '),\n('4126', 'db394', '571', '65', '4254', '70', '74', '0', '4305.2', '1039.06', '63.1545', '6.25972', '4125:0 4127:0 '),\n('4127', 'db395', '571', '65', '65', '70', '74', '0', '4276.99', '1183.3', '141.02', '6.17961', '4126:0 4128:0 '),\n('4128', 'db396', '571', '65', '65', '70', '74', '0', '4489.67', '1187.53', '136.792', '1.18448', '4127:0 4129:0 4133:0 '),\n('4129', 'db397', '571', '65', '4169', '70', '74', '2', '4570.48', '1377.12', '189.542', '1.18173', '4128:0 4130:0 '),\n('4130', 'db398', '571', '65', '4169', '70', '74', '3', '4589.48', '1435.55', '189.222', '0.103772', '4129:0 4131:0 4132:0 '),\n('4131', 'db399', '571', '65', '4169', '70', '74', '2', '4621.53', '1507.35', '204.751', '1.03447', '4130:0 '),\n('4132', 'db400', '571', '65', '4171', '70', '74', '2', '4711.55', '1446.21', '175.428', '5.44841', '4130:0 '),\n('4133', 'db401', '571', '65', '65', '70', '74', '0', '4690.88', '1098.68', '123.008', '2.0861', '4134:0 4128:0 4104:0 '),\n('4134', 'db402', '571', '65', '4170', '70', '74', '4', '4841.36', '1140.74', '171.495', '1.04781', '4135:0 4133:0 '),\n('4135', 'db403', '571', '65', '4170', '70', '74', '5', '4947.98', '1224.66', '225.705', '1.29599', '4134:0 '),\n('4136', 'db404', '571', '65', '4230', '70', '74', '0', '4857.56', '636.316', '157.933', '3.35764', '4137:0 4103:0 '),\n('4137', 'db405', '571', '65', '4230', '70', '74', '0', '4919.39', '858.686', '179.409', '4.72424', '4136:0 4138:0 '),\n('4138', 'db406', '571', '65', '4230', '70', '74', '0', '5115.8', '1070.31', '223.911', '0.494084', '4137:0 '),\n('4139', 'db407', '571', '65', '65', '70', '74', '0', '4361.47', '-666.576', '126.529', '4.95513', '4095:0 4140:0 4144:0 '),\n('4140', 'db408', '571', '65', '4193', '70', '74', '0', '4506.23', '-611.765', '138.674', '0.191691', '4139:0 4141:0 '),\n('4141', 'db409', '571', '65', '4193', '70', '74', '0', '4635.8', '-532.061', '166.561', '4.05115', '4140:0 4142:0 '),\n('4142', 'db410', '571', '65', '4193', '70', '74', '0', '4701.77', '-386.751', '178.452', '4.03308', '4141:0 4143:0 '),\n('4143', 'db411', '571', '65', '65', '70', '74', '0', '4744.71', '-265.341', '170.449', '0.542767', '4142:0 '),\n('4144', 'db412', '571', '65', '65', '70', '74', '0', '4381.74', '-907.37', '164.196', '4.73833', '4139:0 4145:0 '),\n('4145', 'db413', '571', '65', '65', '70', '74', '0', '4453.65', '-1048.77', '166.994', '5.44283', '4144:0 4146:0 4147:0 '),\n('4146', 'db414', '571', '65', '4191', '70', '74', '1', '4598.46', '-1084.15', '165.481', '5.41142', '4145:0 4151:0 '),\n('4147', 'db415', '571', '65', '65', '70', '74', '0', '4459.56', '-1263.85', '163.284', '4.29694', '4145:0 4148:0 4152:0 4153:0 '),\n('4148', 'db416', '571', '65', '4194', '70', '74', '0', '4561.66', '-1361.99', '156.723', '5.94234', '4147:0 4149:0 '),\n('4149', 'db417', '571', '65', '4194', '70', '74', '0', '4677.53', '-1359.08', '162.34', '2.13944', '4148:0 4150:0 4405:0 '),\n('4150', 'db418', '571', '65', '4194', '70', '74', '0', '4810.96', '-1263.2', '168.051', '2.83451', '4149:0 4151:0 '),\n('4151', 'db419', '571', '65', '65', '70', '74', '0', '4682.42', '-1190.97', '164.492', '2.29651', '4150:0 4146:0 '),\n('4152', 'db420', '571', '65', '65', '70', '74', '0', '4426.84', '-1508.64', '159.241', '4.50584', '4147:0 4230:0 '),\n('4153', 'db421', '571', '65', '65', '70', '74', '0', '4306.11', '-1358.64', '159.518', '2.56747', '4147:0 4154:0 '),\n('4154', 'db422', '571', '65', '4189', '70', '74', '0', '4174.24', '-1186.41', '145.827', '2.02005', '4153:0 4155:0 '),\n('4155', 'db423', '571', '65', '4189', '70', '74', '0', '4007.83', '-1254.48', '133.053', '2.98923', '4154:0 4156:0 '),\n('4156', 'db424', '571', '65', '65', '70', '74', '0', '3870.4', '-1277.63', '147.246', '3.74243', '4155:0 4157:0 4165:0 '),\n('4157', 'db425', '571', '65', '4188', '70', '74', '0', '3760.87', '-1379.1', '135.314', '4.06287', '4156:0 4158:0 '),\n('4158', 'db426', '571', '65', '4188', '70', '74', '0', '3749.27', '-1504.65', '141.102', '2.59496', '4157:0 4159:0 '),\n('4159', 'db427', '571', '65', '4188', '70', '74', '0', '3628.59', '-1546.14', '118.335', '2.62324', '4158:0 4160:0 '),\n('4160', 'db428', '571', '65', '4188', '70', '74', '0', '3581.08', '-1357.67', '107.693', '1.20402', '4159:0 4161:0 '),\n('4161', 'db429', '571', '65', '4188', '70', '74', '0', '3627.72', '-1237', '112.462', '1.20323', '4160:0 4162:0 '),\n('4162', 'db430', '571', '65', '4188', '70', '74', '0', '3662.83', '-1064.27', '125.377', '1.29591', '4161:0 4163:0 '),\n('4163', 'db431', '571', '65', '4188', '70', '74', '0', '3755.72', '-1010.08', '121.509', '5.72713', '4162:0 4164:0 4166:0 '),\n('4164', 'db432', '571', '65', '4188', '70', '74', '0', '3850.53', '-1132.6', '122.334', '6.27534', '4163:0 4165:0 '),\n('4165', 'db433', '571', '65', '65', '70', '74', '0', '3942.27', '-1148.57', '140.166', '4.29771', '4164:0 4156:0 '),\n('4166', 'db434', '571', '65', '4177', '70', '74', '0', '3746.15', '-891.172', '162.614', '2.06089', '4163:0 4167:0 4170:0 '),\n('4167', 'db435', '571', '65', '4177', '70', '74', '0', '3650.12', '-879.646', '162.72', '3.17459', '4166:0 4168:0 '),\n('4168', 'db436', '571', '65', '4177', '70', '74', '2', '3590.79', '-835.238', '172.37', '1.65563', '4167:0 4169:0 4194:0 '),\n('4169', 'db437', '571', '65', '4243', '70', '74', '0', '3599.65', '-781.467', '147.621', '0.0926948', '4168:0 '),\n('4170', 'db438', '571', '65', '4177', '70', '74', '3', '3768.81', '-779.501', '195.937', '4.02283', '4166:0 4171:0 '),\n('4171', 'db439', '571', '65', '4177', '70', '74', '2', '3925.37', '-698.927', '241.206', '0.865546', '4170:0 4172:0 '),\n('4172', 'db440', '571', '65', '4175', '70', '74', '0', '3986.58', '-553.999', '216.076', '2.58635', '4171:0 4173:0 '),\n('4173', 'db441', '571', '65', '4254', '70', '74', '0', '3809.46', '-473.161', '169.556', '2.73087', '4172:0 4174:0 '),\n('4174', 'db442', '571', '65', '65', '70', '74', '0', '3724.29', '-439.939', '157.058', '3.21388', '4173:0 4175:0 '),\n('4175', 'db443', '571', '65', '4254', '70', '74', '0', '3784.04', '-368.672', '97.0346', '1.91644', '4174:0 4092:0 '),\n('4176', 'db444', '571', '65', '4254', '70', '74', '0', '3263.75', '-275.159', '91.4928', '3.40319', '4090:0 4177:0 '),\n('4177', 'db445', '571', '65', '65', '70', '74', '0', '3244.55', '-472.809', '140.618', '1.83632', '4176:0 4178:0 4188:0 '),\n('4178', 'db446', '571', '65', '65', '70', '74', '0', '3148.48', '-604.869', '113.192', '1.5842', '4177:0 4179:0 4191:0 '),\n('4179', 'db447', '571', '65', '4180', '70', '74', '0', '2993.93', '-429.733', '123.402', '2.59501', '4178:0 4180:0 '),\n('4180', 'db448', '571', '65', '4180', '70', '74', '0', '2867.29', '-384.503', '112.462', '2.7623', '4179:0 4181:0 4187:0 '),\n('4181', 'db449', '571', '65', '4180', '70', '74', '0', '2773.28', '-465.739', '116.162', '4.48387', '4180:0 4182:0 '),\n('4182', 'db450', '571', '65', '4180', '70', '74', '0', '2687.72', '-431.283', '71.3279', '2.92957', '4181:0 4183:0 '),\n('4183', 'db451', '571', '65', '4181', '70', '74', '0', '2536.4', '-415.378', '2.90773', '1.58496', '4182:0 4184:0 4207:0 '),\n('4184', 'db452', '571', '65', '4181', '70', '74', '0', '2612.51', '-244.345', '1.72779', '6.26044', '4183:0 4185:0 '),\n('4185', 'db453', '571', '65', '4180', '70', '74', '0', '2656.87', '-171.598', '62.2241', '1.32029', '4184:0 4186:0 '),\n('4186', 'db454', '571', '65', '4180', '70', '74', '0', '2737.23', '-100.56', '114.159', '4.23648', '4185:0 4187:0 '),\n('4187', 'db455', '571', '65', '4180', '70', '74', '0', '2792.04', '-264.842', '132.149', '5.26534', '4186:0 4180:0 '),\n('4188', 'db456', '571', '65', '4186', '70', '74', '5', '3231.05', '-661.255', '166.734', '1.42239', '4177:0 4189:0 '),\n('4189', 'db457', '571', '65', '4186', '70', '74', '4', '3272.19', '-751.348', '168.143', '4.40298', '4188:0 4190:0 '),\n('4190', 'db458', '571', '65', '65', '70', '74', '0', '3325.52', '-1005.39', '123.604', '2.0507', '4189:0 4191:0 4192:0 4203:0 '),\n('4191', 'db459', '571', '65', '65', '70', '74', '0', '3207.68', '-802.517', '112.975', '2.23134', '4190:0 4178:0 '),\n('4192', 'db460', '571', '65', '65', '70', '74', '0', '3400.63', '-1169.43', '112.122', '5.78762', '4190:0 4193:0 4195:0 '),\n('4193', 'db461', '571', '65', '65', '70', '74', '0', '3494.11', '-1049.52', '124.775', '0.832553', '4192:0 4194:0 '),\n('4194', 'db462', '571', '65', '4177', '70', '74', '2', '3600.71', '-914.48', '156.552', '1.53549', '4193:0 4168:0 '),\n('4195', 'db463', '571', '65', '65', '70', '74', '0', '3235.06', '-1355.04', '70.8979', '3.83276', '4192:0 4196:0 '),\n('4196', 'db464', '571', '65', '4257', '70', '74', '0', '3180.86', '-1542.39', '40.4347', '4.7124', '4195:0 4197:0 4231:0 '),\n('4197', 'db465', '571', '65', '4241', '70', '74', '0', '3051.36', '-1392.98', '57.3848', '2.94133', '4196:0 4198:0 '),\n('4198', 'db466', '571', '65', '4241', '70', '74', '0', '2889.8', '-1432.73', '58.3338', '3.04186', '4197:0 4199:0 '),\n('4199', 'db467', '571', '65', '4241', '70', '74', '0', '2772.55', '-1373.06', '40.6788', '6.18974', '4198:0 4200:0 '),\n('4200', 'db468', '571', '65', '4185', '70', '74', '0', '2882.77', '-1303.94', '6.48389', '1.04459', '4199:0 4201:0 '),\n('4201', 'db469', '571', '65', '4185', '70', '74', '0', '2938.22', '-1169.74', '6.81704', '5.99025', '4200:0 4202:0 4204:0 '),\n('4202', 'db470', '571', '65', '4185', '70', '74', '0', '3085.09', '-1193.85', '12.4717', '5.4876', '4201:0 4203:0 '),\n('4203', 'db471', '571', '65', '4185', '70', '74', '0', '3180.57', '-1059.52', '44.9918', '0.29769', '4202:0 4190:0 '),\n('4204', 'db472', '571', '65', '4185', '70', '74', '0', '2929.48', '-986.506', '4.6099', '1.77817', '4201:0 4205:0 '),\n('4205', 'db473', '571', '65', '4185', '70', '74', '0', '2865.52', '-836.167', '15.7438', '2.35701', '4204:0 4206:0 '),\n('4206', 'db474', '571', '65', '4185', '70', '74', '0', '2691.63', '-707.31', '8.95638', '2.62875', '4205:0 4207:0 '),\n('4207', 'db475', '571', '65', '4181', '70', '74', '0', '2662.91', '-565.045', '4.97671', '2.87851', '4206:0 4183:0 '),\n('4208', 'db476', '571', '65', '65', '70', '74', '0', '3597.9', '1391.95', '92.2854', '0.792481', '4083:0 4209:0 '),\n('4209', 'db477', '571', '65', '4165', '70', '74', '4', '3768.55', '1529.38', '86.92', '0.415486', '4208:0 4210:0 '),\n('4210', 'db478', '571', '65', '4165', '70', '74', '5', '3841.3', '1533.41', '89.7247', '1.82685', '4209:0 4211:0 '),\n('4211', 'db479', '571', '65', '4165', '70', '74', '4', '3890.52', '1637.61', '96.2566', '0.644815', '4210:0 4212:0 '),\n('4212', 'db480', '571', '65', '65', '70', '74', '0', '4003.51', '1741.08', '142.414', '3.8728', '4211:0 4213:0 '),\n('4213', 'db481', '571', '65', '65', '70', '74', '0', '3800.66', '1801.11', '107.946', '0.35893', '4212:0 4214:0 4227:0 '),\n('4214', 'db482', '571', '65', '65', '70', '74', '0', '3642.7', '1910.26', '75.9736', '1.69646', '4213:0 4215:0 4069:0 '),\n('4215', 'db483', '571', '65', '65', '70', '74', '0', '3615.88', '2050.78', '74.6297', '1.7962', '4214:0 4216:0 4219:0 '),\n('4216', 'db484', '571', '65', '4164', '70', '74', '0', '3709.48', '2144.81', '53.4192', '3.56571', '4215:0 4217:0 4218:0 '),\n('4217', 'db485', '571', '65', '4164', '70', '74', '0', '3706.64', '2076.92', '21.8594', '1.15533', '4216:0 4218:0 '),\n('4218', 'db486', '571', '65', '4164', '70', '74', '0', '3772.34', '2169.36', '27.3597', '4.8828', '4217:0 4216:0 '),\n('4219', 'db487', '571', '65', '65', '70', '74', '0', '3638.81', '2223.64', '76.3879', '1.34851', '4215:0 4220:0 '),\n('4220', 'db488', '571', '65', '65', '70', '74', '0', '3608.56', '2424.79', '84.7521', '0.47515', '4219:0 4221:0 '),\n('4221', 'db489', '571', '65', '65', '70', '74', '0', '3667.57', '2606.35', '104.934', '2.34754', '4220:0 4064:0 4222:0 '),\n('4222', 'db490', '571', '65', '65', '70', '74', '0', '3821.64', '2594.47', '138.086', '5.63442', '4221:0 4223:0 '),\n('4223', 'db491', '571', '65', '4163', '70', '74', '0', '3877.75', '2397.8', '152.255', '5.33596', '4222:0 4224:0 '),\n('4224', 'db492', '571', '65', '4163', '70', '74', '0', '4003.82', '2286.07', '153.425', '6.19125', '4223:0 4225:0 '),\n('4225', 'db493', '571', '65', '4163', '70', '74', '0', '4084.73', '2159.31', '153.682', '4.48536', '4224:0 4226:0 '),\n('4226', 'db494', '571', '65', '4163', '70', '74', '0', '3961.11', '2124.54', '131.41', '3.85941', '4225:0 4227:0 '),\n('4227', 'db495', '571', '65', '65', '70', '74', '0', '3825.91', '1954.77', '104.913', '4.14765', '4226:0 4213:0 '),\n('4228', 'db496', '571', '65', '4151', '70', '74', '4', '3706.43', '2835.58', '88.7151', '0.419359', '4064:0 4229:0 '),\n('4229', 'db497', '571', '65', '4151', '70', '74', '5', '3828.74', '2884', '90.3388', '0.171959', '4228:0 '),\n('4230', 'gh498', '571', '394', '394', '72', '76', '0', '4412.91', '-1618.03', '162.125', '4.64085', '4152:0 4243:0 '),\n('4231', 'gh499', '571', '394', '394', '72', '76', '0', '3182.34', '-1659.02', '38.7919', '4.89218', '4196:0 4232:0 '),\n('4232', 'gh500', '571', '394', '394', '72', '76', '0', '3170.1', '-1849.63', '70.0118', '5.13957', '4231:0 4233:0 '),\n('4233', 'gh501', '571', '394', '4236', '72', '76', '0', '3193.69', '-1991.71', '85.0008', '6.13546', '4232:0 4234:0 4260:0 '),\n('4234', 'gh502', '571', '394', '394', '72', '76', '0', '3351.7', '-1957.7', '116.26', '3.20042', '4233:0 4235:0 4256:0 '),\n('4235', 'gh503', '571', '394', '394', '72', '76', '0', '3506.14', '-1975.54', '165.694', '5.76004', '4234:0 4236:0 4255:0 '),\n('4236', 'gh504', '571', '394', '394', '72', '76', '0', '3654.24', '-2134.59', '147.89', '4.94165', '4235:0 4237:0 4285:0 '),\n('4237', 'gh505', '571', '394', '394', '72', '76', '0', '3768.13', '-2266.2', '173.421', '6.00979', '4236:0 4238:0 4251:0 4285:0 '),\n('4238', 'gh506', '571', '394', '394', '72', '76', '0', '3965.13', '-2347.84', '213.634', '6.13467', '4237:0 4239:0 4400:0 '),\n('4239', 'gh507', '571', '394', '394', '72', '76', '0', '4179.57', '-2348.21', '225.457', '0.204908', '4238:0 4240:0 4389:0 '),\n('4240', 'gh508', '571', '394', '394', '72', '76', '0', '4360.95', '-2316.79', '201.282', '0.15857', '4239:0 4241:0 4250:0 '),\n('4241', 'gh509', '571', '394', '394', '72', '76', '0', '4456.7', '-2146.34', '174.126', '1.54558', '4240:0 4242:0 '),\n('4242', 'gh510', '571', '394', '394', '72', '76', '0', '4445.16', '-1972.91', '158.144', '1.95792', '4241:0 4243:0 '),\n('4243', 'gh511', '571', '394', '394', '72', '76', '0', '4441.13', '-1782.37', '162.404', '1.80319', '4242:0 4230:0 4244:0 '),\n('4244', 'gh512', '571', '394', '394', '72', '76', '0', '4395.14', '-1892.04', '161.168', '3.62925', '4243:0 4245:0 '),\n('4245', 'gh513', '571', '394', '4209', '72', '76', '0', '4294.12', '-1906.66', '197.755', '3.31587', '4244:0 4246:0 4247:0 4248:0 '),\n('4246', 'gh514', '571', '394', '4209', '72', '76', '0', '4245.43', '-2019.66', '235.391', '1.60371', '4245:0 '),\n('4247', 'gh515', '571', '394', '4209', '72', '76', '0', '4219.61', '-1824.36', '202.548', '2.41267', '4245:0 '),\n('4248', 'gh516', '571', '394', '4209', '72', '76', '0', '4141.35', '-1993.19', '212.874', '4.66597', '4245:0 4249:0 '),\n('4249', 'gh517', '571', '394', '4209', '72', '76', '0', '4200.73', '-2152.09', '218.191', '0.0124693', '4248:0 4250:0 '),\n('4250', 'gh518', '571', '394', '394', '72', '76', '0', '4337.91', '-2212.2', '191.313', '5.10972', '4249:0 4240:0 '),\n('4251', 'gh519', '571', '394', '394', '72', '76', '0', '3919.84', '-2211.56', '210.955', '0.375331', '4237:0 4252:0 '),\n('4252', 'gh520', '571', '394', '394', '72', '76', '0', '3841.19', '-2055.11', '210.168', '1.65396', '4251:0 4253:0 '),\n('4253', 'gh521', '571', '394', '394', '72', '76', '0', '3817.14', '-1865.71', '214.679', '1.96419', '4252:0 4254:0 '),\n('4254', 'gh522', '571', '394', '394', '72', '76', '0', '3654.79', '-1866.78', '173.387', '2.8674', '4253:0 4255:0 '),\n('4255', 'gh523', '571', '394', '394', '72', '76', '0', '3559.72', '-1897.37', '155.876', '3.47686', '4254:0 4235:0 '),\n('4256', 'gh524', '571', '394', '394', '72', '76', '0', '3387.84', '-2133.26', '124.553', '5.44191', '4234:0 4257:0 '),\n('4257', 'gh525', '571', '394', '4206', '72', '76', '4', '3345.18', '-2217.45', '119.375', '3.61665', '4256:0 4258:0 '),\n('4258', 'gh526', '571', '394', '4206', '72', '76', '5', '3256.98', '-2231.76', '116.09', '1.0425', '4257:0 4259:0 '),\n('4259', 'gh527', '571', '394', '394', '72', '76', '0', '3086.49', '-2267.46', '94.942', '1.73561', '4258:0 4260:0 4268:0 '),\n('4260', 'gh528', '571', '394', '394', '72', '76', '0', '3084.66', '-2084.36', '87.6685', '1.27615', '4259:0 4233:0 4261:0 '),\n('4261', 'gh529', '571', '394', '394', '72', '76', '0', '2953.2', '-1963.36', '51.3225', '2.81396', '4260:0 4262:0 '),\n('4262', 'gh530', '571', '394', '4242', '72', '76', '0', '2828.38', '-1917.21', '9.14124', '2.88465', '4261:0 4263:0 4264:0 '),\n('4263', 'gh531', '571', '394', '4242', '72', '76', '0', '2698.31', '-2040.99', '3.89624', '0.465604', '4262:0 4267:0 '),\n('4264', 'gh532', '571', '394', '4242', '72', '76', '0', '2755.77', '-1781.45', '5.41989', '5.167', '4262:0 4265:0 '),\n('4265', 'gh533', '571', '394', '4242', '72', '76', '0', '2565.61', '-1807.96', '9.92644', '3.51374', '4264:0 4266:0 '),\n('4266', 'gh534', '571', '394', '4242', '72', '76', '0', '2542.58', '-1990.88', '8.43344', '5.20077', '4265:0 4267:0 '),\n('4267', 'gh535', '571', '394', '4242', '72', '76', '0', '2617', '-2122.41', '7.0106', '0.525292', '4266:0 4263:0 '),\n('4268', 'gh536', '571', '394', '394', '72', '76', '0', '3111.6', '-2469.39', '60.839', '4.64079', '4259:0 4269:0 '),\n('4269', 'gh537', '571', '394', '394', '72', '76', '0', '3050.93', '-2690.26', '65.2339', '4.32742', '4268:0 4270:0 '),\n('4270', 'gh538', '571', '394', '394', '72', '76', '0', '2996.43', '-2911.54', '99.7541', '3.55929', '4269:0 4271:0 4277:0 '),\n('4271', 'gh539', '571', '394', '394', '72', '76', '0', '2806.9', '-2891.38', '64.0493', '3.18937', '4270:0 4272:0 '),\n('4272', 'gh540', '571', '394', '394', '72', '76', '0', '2688.1', '-2877.41', '68.4325', '1.86676', '4273:0 4271:0 3965:0 3956:0 '),\n('4273', 'gh541', '571', '394', '4207', '72', '76', '0', '2863.15', '-2691.55', '84.6612', '0.692585', '4274:0 4272:0 '),\n('4274', 'gh542', '571', '394', '4207', '72', '76', '0', '2913.28', '-2523.08', '77.2727', '2.2516', '4273:0 4275:0 '),\n('4275', 'gh543', '571', '394', '4207', '72', '76', '0', '2759.62', '-2433.25', '39.5256', '4.18681', '4274:0 4276:0 '),\n('4276', 'gh544', '571', '394', '394', '72', '76', '0', '2655.99', '-2570.44', '12.8707', '0.715349', '4275:0 3966:0 '),\n('4277', 'gh545', '571', '394', '4240', '72', '76', '0', '3159.97', '-2966.67', '125.976', '5.16462', '4270:0 4278:0 '),\n('4278', 'gh546', '571', '394', '394', '72', '76', '0', '3229.99', '-3097.97', '155.647', '5.16069', '4277:0 4279:0 4287:0 '),\n('4279', 'gh547', '571', '394', '394', '72', '76', '0', '3347.86', '-2939.95', '194.535', '0.886556', '4278:0 4280:0 '),\n('4280', 'gh548', '571', '394', '4204', '72', '76', '3', '3409.22', '-2819.78', '200.664', '5.07272', '4279:0 4281:0 '),\n('4281', 'gh549', '571', '394', '394', '72', '76', '0', '3563.32', '-2837.92', '196.693', '3.21211', '4280:0 4282:0 '),\n('4282', 'gh550', '571', '394', '394', '72', '76', '0', '3639.37', '-2888.65', '220.844', '1.05698', '4281:0 4283:0 4286:0 4386:0 '),\n('4283', 'gh551', '571', '394', '394', '72', '76', '0', '3750.73', '-2701.59', '175.222', '0.808005', '4282:0 4284:0 4402:0 '),\n('4284', 'gh552', '571', '394', '394', '72', '76', '0', '3701.9', '-2499.94', '160.171', '2.01988', '4283:0 4285:0 '),\n('4285', 'gh553', '571', '394', '394', '72', '76', '0', '3667.41', '-2329.55', '156.4', '0.83785', '4284:0 4237:0 4236:0 '),\n('4286', 'gh554', '571', '394', '394', '72', '76', '0', '3567.56', '-3072.84', '238.573', '4.01871', '4282:0 4287:0 4288:0 '),\n('4287', 'gh555', '571', '394', '394', '72', '76', '0', '3355.89', '-3183.89', '200.874', '2.94663', '4286:0 4278:0 '),\n('4288', 'gh556', '571', '394', '394', '72', '76', '0', '3543.08', '-3277.22', '242.517', '4.88658', '4286:0 4289:0 '),\n('4289', 'gh557', '571', '394', '394', '72', '76', '0', '3676.96', '-3469.09', '242.035', '5.54866', '4288:0 4290:0 4383:0 '),\n('4290', 'gh558', '571', '394', '394', '72', '76', '0', '3696.59', '-3688.31', '209.189', '4.55906', '4289:0 4291:0 '),\n('4291', 'gh559', '571', '394', '394', '72', '76', '0', '3728.04', '-3862.81', '183.316', '0.164743', '4290:0 4292:0 4294:0 4301:0 '),\n('4292', 'gh560', '571', '394', '4215', '72', '76', '0', '3590.62', '-3901.08', '196.64', '2.77227', '4291:0 4293:0 '),\n('4293', 'gh561', '571', '394', '4215', '72', '76', '0', '3525.9', '-3755.42', '228.317', '2.26176', '4292:0 '),\n('4294', 'gh562', '571', '394', '395', '72', '76', '0', '3841.06', '-3743.21', '175.461', '6.13141', '4291:0 4295:0 '),\n('4295', 'gh563', '571', '394', '395', '72', '76', '0', '3974.14', '-3774.46', '151.082', '6.17382', '4294:0 4296:0 '),\n('4296', 'gh564', '571', '394', '395', '72', '76', '0', '4052.02', '-3740.14', '220.288', '4.50485', '4295:0 4297:0 '),\n('4297', 'gh565', '571', '394', '395', '72', '76', '0', '4135.39', '-3710.81', '180.991', '2.0819', '4296:0 4298:0 '),\n('4298', 'gh566', '571', '394', '395', '72', '76', '0', '4194.15', '-3814.05', '181.668', '4.59518', '4297:0 4299:0 '),\n('4299', 'gh567', '571', '394', '395', '72', '76', '0', '4181.7', '-3982.87', '170.498', '4.5402', '4298:0 4300:0 4363:0 '),\n('4300', 'gh568', '571', '394', '394', '72', '76', '0', '4024.2', '-4043.93', '176.713', '3.04794', '4299:0 4301:0 4363:0 '),\n('4301', 'gh569', '571', '394', '394', '72', '76', '0', '3787.44', '-3987.74', '181.678', '2.65995', '4300:0 4291:0 4302:0 '),\n('4302', 'gh570', '571', '394', '394', '72', '76', '0', '3718.3', '-4188.38', '192.248', '4.50249', '4301:0 4303:0 4310:0 '),\n('4303', 'gh571', '571', '394', '394', '72', '76', '0', '3545.36', '-4300.26', '227.855', '3.59221', '4302:0 4304:0 '),\n('4304', 'gh572', '571', '394', '394', '72', '76', '0', '3375.07', '-4408.72', '245.826', '4.29907', '4303:0 4305:0 4307:0 '),\n('4305', 'gh573', '571', '394', '4480', '72', '76', '0', '3261.77', '-4590.54', '305.739', '3.95742', '4304:0 4306:0 '),\n('4306', 'gh574', '571', '394', '4480', '72', '76', '0', '3089.14', '-4641.2', '316.308', '3.35188', '4305:0 3999:0 '),\n('4307', 'gh575', '571', '394', '4218', '72', '76', '0', '3502.07', '-4548.51', '221.433', '3.38171', '4304:0 4308:0 '),\n('4308', 'gh576', '571', '394', '394', '72', '76', '0', '3656.98', '-4455.52', '184.363', '5.84315', '4307:0 4309:0 '),\n('4309', 'gh577', '571', '394', '394', '72', '76', '0', '3731.98', '-4511.53', '193.763', '0.757702', '4308:0 4310:0 '),\n('4310', 'gh578', '571', '394', '394', '72', '76', '5', '3851.11', '-4369.54', '192.918', '1.37424', '4309:0 4302:0 4311:0 '),\n('4311', 'gh579', '571', '394', '4205', '72', '76', '0', '3939.37', '-4409.34', '238.255', '4.98392', '4310:0 4312:0 '),\n('4312', 'gh580', '571', '394', '4205', '72', '76', '0', '4062.37', '-4401.54', '260.429', '0.235388', '4311:0 4313:0 4362:0 4364:0 '),\n('4313', 'gh581', '571', '394', '394', '72', '76', '0', '4171.31', '-4502.24', '219.959', '1.1284', '4312:0 4314:0 '),\n('4314', 'gh582', '571', '394', '4205', '72', '76', '0', '4003.62', '-4566.46', '195.348', '3.13431', '4313:0 4315:0 '),\n('4315', 'gh583', '571', '394', '394', '72', '76', '0', '4008.13', '-4692.66', '141.153', '5.45436', '4314:0 4316:0 '),\n('4316', 'gh584', '571', '394', '4231', '72', '76', '0', '4082.28', '-4754.21', '96.3716', '4.76714', '4315:0 4317:0 '),\n('4317', 'gh585', '571', '394', '4249', '72', '76', '0', '4193.08', '-4880.87', '42.4572', '3.89614', '4316:0 4318:0 4328:0 4336:0 '),\n('4318', 'gh586', '571', '394', '4249', '72', '76', '0', '4317.27', '-4702.62', '75.8335', '0.62967', '4317:0 4319:0 '),\n('4319', 'gh587', '571', '394', '4249', '72', '76', '0', '4444.07', '-4566.46', '104.898', '1.65462', '4318:0 4320:0 '),\n('4320', 'gh588', '571', '394', '4249', '72', '76', '0', '4428.45', '-4387.5', '151.381', '1.08913', '4319:0 4321:0 '),\n('4321', 'gh589', '571', '394', '4159', '72', '76', '0', '4438.72', '-4286.42', '161.56', '6.09212', '4320:0 4322:0 4374:0 '),\n('4322', 'gh590', '571', '394', '4249', '72', '76', '0', '4621.51', '-4357.67', '181.183', '5.95781', '4321:0 4323:0 '),\n('4323', 'gh591', '571', '394', '4221', '72', '76', '0', '4732.05', '-4454.6', '194.355', '5.45673', '4322:0 4324:0 '),\n('4324', 'gh592', '571', '394', '4221', '72', '76', '0', '4820.92', '-4522.91', '200.404', '5.83294', '4323:0 4325:0 '),\n('4325', 'gh593', '571', '394', '4221', '72', '76', '0', '4909.98', '-4586.39', '219.616', '4.43492', '4324:0 4326:0 '),\n('4326', 'gh594', '571', '394', '4221', '72', '76', '0', '4984.98', '-4692.79', '219.491', '5.1245', '4325:0 4327:0 '),\n('4327', 'gh595', '571', '394', '4221', '72', '76', '0', '5041.25', '-4817', '219.501', '2.53662', '4326:0 '),\n('4328', 'gh596', '571', '394', '4212', '72', '76', '0', '4339.89', '-4870.51', '34.7802', '0.17335', '4317:0 4329:0 '),\n('4329', 'gh597', '571', '394', '4216', '72', '76', '0', '4474.49', '-4921.22', '14.201', '5.96566', '4328:0 4330:0 4331:0 '),\n('4330', 'gh598', '571', '394', '4212', '72', '76', '0', '4518.04', '-5017.36', '3.25924', '5.12764', '4329:0 '),\n('4331', 'gh599', '571', '394', '4216', '72', '76', '0', '4569.4', '-4865.21', '47.9919', '0.149002', '4329:0 4332:0 4333:0 4334:0 '),\n('4332', 'gh600', '571', '394', '4216', '72', '76', '0', '4707.48', '-4794.55', '47.992', '5.06167', '4331:0 4333:0 '),\n('4333', 'gh601', '571', '394', '4216', '72', '76', '0', '4708.25', '-4910.12', '47.9928', '1.36166', '4331:0 4332:0 '),\n('4334', 'gh602', '571', '394', '4216', '72', '76', '0', '4744.53', '-4859.91', '26.2962', '0.387759', '4331:0 4335:0 '),\n('4335', 'gh603', '571', '394', '4216', '72', '76', '0', '4816.99', '-4789.4', '25.4718', '0.872349', '4334:0 '),\n('4336', 'gh604', '571', '394', '4249', '72', '76', '0', '4022.33', '-4997.21', '41.214', '3.78223', '4317:0 4337:0 4345:0 '),\n('4337', 'gh605', '571', '394', '4249', '72', '76', '0', '3816.35', '-5011.96', '106.526', '3.31727', '4336:0 4338:0 4346:0 '),\n('4338', 'gh606', '571', '394', '4220', '72', '76', '0', '3646.81', '-5000.53', '175.852', '4.1867', '4337:0 4339:0 '),\n('4339', 'gh607', '571', '394', '4220', '72', '76', '0', '3524.22', '-5120.65', '233.744', '2.61591', '4338:0 4340:0 4343:0 '),\n('4340', 'gh608', '571', '394', '4220', '72', '76', '0', '3419.01', '-4995.77', '285.739', '2.5845', '4339:0 4341:0 '),\n('4341', 'gh609', '571', '394', '4220', '72', '76', '0', '3356.74', '-5082.19', '325.289', '3.94009', '4340:0 4342:0 '),\n('4342', 'gh610', '571', '394', '4220', '72', '76', '0', '3310.99', '-5122.5', '340.978', '1.36004', '4341:0 '),\n('4343', 'gh611', '571', '394', '4220', '72', '76', '0', '3433.34', '-5250.17', '269.339', '1.01289', '4339:0 4344:0 '),\n('4344', 'gh612', '571', '394', '4220', '72', '76', '0', '3407.12', '-5388.15', '267.856', '1.78573', '4343:0 '),\n('4345', 'gh613', '571', '394', '4212', '72', '76', '0', '4006.9', '-5232.47', '7.75033', '1.18098', '4336:0 4356:0 '),\n('4346', 'gh614', '571', '394', '394', '72', '76', '0', '3757.96', '-5153.08', '119.324', '4.14823', '4337:0 4347:0 '),\n('4347', 'gh615', '571', '394', '394', '72', '76', '0', '3598.76', '-5357.93', '139.869', '4.05555', '4346:0 4348:0 '),\n('4348', 'gh616', '571', '394', '4213', '72', '76', '0', '3443.06', '-5490.97', '198.431', '3.26623', '4347:0 4349:0 '),\n('4349', 'gh617', '571', '394', '4213', '72', '76', '0', '3274.45', '-5572.3', '213.641', '3.71783', '4348:0 4350:0 '),\n('4350', 'gh618', '571', '394', '4213', '72', '76', '0', '3100.03', '-5709.35', '220.326', '3.74532', '4349:0 4355:0 '),\n('4351', 'hf619', '571', '495', '4061', '68', '73', '0', '2323.35', '-5813.06', '251.394', '3.16805', '4014:0 4015:0 4352:0 '),\n('4352', 'hf620', '571', '495', '495', '68', '73', '0', '2519.29', '-5851.8', '276.256', '4.73492', '4351:0 4353:0 '),\n('4353', 'hf621', '571', '495', '495', '68', '73', '0', '2703.09', '-5953.52', '271.511', '6.11722', '4352:0 4354:0 '),\n('4354', 'hf622', '571', '495', '4252', '68', '73', '0', '2849.67', '-5840.96', '273.44', '0.629637', '4353:0 4355:0 '),\n('4355', 'hf623', '571', '495', '4252', '68', '73', '0', '3003.04', '-5779.08', '254.433', '0.523608', '4354:0 4350:0 '),\n('4356', 'gh624', '571', '394', '4212', '72', '76', '0', '4153.59', '-5224.2', '7.42476', '6.08423', '4345:0 4357:0 '),\n('4357', 'gh625', '571', '394', '4212', '72', '76', '0', '4327.94', '-5342.7', '4.49671', '5.82112', '4356:0 4358:0 '),\n('4358', 'gh626', '571', '394', '4244', '72', '76', '0', '4543.08', '-5485.22', '2.18391', '5.50775', '4357:0 4359:0 '),\n('4359', 'gh627', '571', '394', '4244', '72', '76', '0', '4695.42', '-5635.74', '77.5219', '4.55742', '4358:0 4360:0 '),\n('4360', 'gh628', '571', '394', '4245', '72', '76', '0', '4616.66', '-5660.81', '114.593', '4.22877', '4359:0 4361:0 '),\n('4361', 'gh629', '571', '394', '4245', '72', '76', '0', '4593.57', '-5707.41', '184.506', '1.02041', '4360:0 '),\n('4362', 'gh630', '571', '394', '394', '72', '76', '0', '4113.47', '-4233.27', '243.732', '1.89258', '4312:0 4363:0 '),\n('4363', 'gh631', '571', '394', '394', '72', '76', '1', '4125.58', '-4095.14', '182.823', '2.77224', '4362:0 4300:0 4299:0 '),\n('4364', 'gh632', '571', '394', '394', '72', '76', '0', '4172.63', '-4310.2', '238.733', '2.85314', '4312:0 4365:0 '),\n('4365', 'gh633', '571', '394', '394', '72', '76', '0', '4326.78', '-4119.6', '193.825', '0.547988', '4364:0 4366:0 '),\n('4366', 'gh634', '571', '394', '394', '72', '76', '0', '4486.09', '-3977.4', '186.997', '5.61774', '4365:0 4367:0 4376:0 '),\n('4367', 'gh635', '571', '394', '394', '72', '76', '0', '4625.2', '-4092.13', '199.11', '2.30728', '4366:0 4368:0 '),\n('4368', 'gh636', '571', '394', '394', '72', '76', '0', '4734.83', '-4181.86', '231.297', '2.31358', '4367:0 4369:0 '),\n('4369', 'gh637', '571', '394', '394', '72', '76', '0', '4906.69', '-4306.46', '257.585', '0.692519', '4368:0 4370:0 4403:0 '),\n('4370', 'gh638', '571', '394', '4214', '72', '76', '0', '5016.3', '-4437.54', '278.117', '5.31851', '4369:0 4371:0 '),\n('4371', 'gh639', '571', '394', '4214', '72', '76', '0', '5101.89', '-4569.13', '283.736', '5.11902', '4370:0 4372:0 '),\n('4372', 'gh640', '571', '394', '4214', '72', '76', '0', '5193.65', '-4729.96', '293.156', '5.98138', '4371:0 4373:0 '),\n('4373', 'gh641', '571', '394', '4214', '72', '76', '0', '5380.16', '-4761.41', '305.589', '6.26491', '4372:0 '),\n('4374', 'gh642', '571', '394', '4159', '72', '76', '2', '4508.01', '-4224.81', '167.488', '4.05322', '4321:0 4375:0 '),\n('4375', 'gh643', '571', '394', '4159', '72', '76', '3', '4593.24', '-4223.94', '178.654', '3.05419', '4374:0 '),\n('4376', 'gh644', '571', '394', '394', '72', '76', '0', '4397.58', '-3823.41', '207.663', '1.98605', '4366:0 4377:0 '),\n('4377', 'gh645', '571', '394', '4235', '72', '76', '0', '4363.62', '-3661.89', '253.292', '1.03572', '4376:0 4378:0 4380:0 '),\n('4378', 'gh646', '571', '394', '4270', '72', '76', '0', '4464.25', '-3523.69', '231.349', '0.662651', '4377:0 4379:0 '),\n('4379', 'gh647', '571', '394', '4270', '72', '76', '0', '4540.35', '-3448.14', '226.932', '0.666578', '4378:0 4404:0 '),\n('4380', 'gh648', '571', '394', '394', '72', '76', '0', '4254.62', '-3537.34', '262.169', '3.11545', '4377:0 4381:0 '),\n('4381', 'gh649', '571', '394', '394', '72', '76', '0', '4082.82', '-3452.53', '279.273', '2.96073', '4380:0 4382:0 '),\n('4382', 'gh650', '571', '394', '4267', '72', '76', '0', '4017.93', '-3398.46', '291.406', '1.89652', '4381:0 4383:0 4384:0 '),\n('4383', 'gh651', '571', '394', '394', '72', '76', '0', '3805.22', '-3452.83', '276.397', '3.26311', '4382:0 4289:0 '),\n('4384', 'gh652', '571', '394', '394', '72', '76', '0', '3927.34', '-3218.24', '296.696', '2.32848', '4382:0 4385:0 4392:0 '),\n('4385', 'gh653', '571', '394', '394', '72', '76', '0', '3809.69', '-3057.95', '274.256', '2.59945', '4384:0 4386:0 4399:0 '),\n('4386', 'gh654', '571', '394', '394', '72', '76', '0', '3727.35', '-2986.21', '236.602', '2.62301', '4385:0 4282:0 4387:0 '),\n('4387', 'gh655', '571', '394', '4203', '72', '76', '0', '3799.13', '-2875.46', '222.297', '0.855862', '4386:0 4388:0 '),\n('4388', 'gh656', '571', '394', '394', '72', '76', '0', '3912.6', '-2792.74', '176.353', '3.96212', '4387:0 '),\n('4389', 'gh657', '571', '394', '4199', '72', '76', '0', '4204.22', '-2467.24', '229.848', '5.58004', '4239:0 4390:0 4391:0 '),\n('4390', 'gh658', '571', '394', '4199', '72', '76', '1', '4355.92', '-2485.04', '242.225', '3.56707', '4389:0 4391:0 '),\n('4391', 'gh659', '571', '394', '4199', '72', '76', '0', '4320.51', '-2585.42', '246.459', '1.97429', '4390:0 4389:0 '),\n('4392', 'gh660', '571', '394', '4222', '72', '76', '0', '4055.91', '-3147.98', '278.056', '5.70496', '4384:0 4393:0 '),\n('4393', 'gh661', '571', '394', '4222', '72', '76', '0', '4250.54', '-3177.85', '307.936', '0.898319', '4392:0 4394:0 '),\n('4394', 'gh662', '571', '394', '4222', '72', '76', '0', '4326.86', '-3320.66', '310.551', '0.546446', '4393:0 4395:0 '),\n('4395', 'gh663', '571', '394', '4222', '72', '76', '0', '4447.75', '-3199.73', '313.463', '2.16044', '4394:0 4396:0 '),\n('4396', 'gh664', '571', '394', '4222', '72', '76', '0', '4418.84', '-2984.71', '309.349', '1.76303', '4395:0 4397:0 '),\n('4397', 'gh665', '571', '394', '4222', '72', '76', '0', '4226.67', '-2862.19', '281.474', '3.5718', '4396:0 4398:0 '),\n('4398', 'gh666', '571', '394', '4222', '72', '76', '0', '4035.13', '-2946.41', '276.096', '3.8946', '4397:0 4399:0 '),\n('4399', 'gh667', '571', '394', '4222', '72', '76', '0', '3928.19', '-3008.94', '275.401', '3.52703', '4398:0 4385:0 '),\n('4400', 'gh668', '571', '394', '394', '72', '76', '0', '3974.25', '-2486.57', '216.336', '4.66038', '4238:0 4401:0 '),\n('4401', 'gh669', '571', '394', '4202', '72', '76', '0', '3933.08', '-2603.19', '206.74', '5.22586', '4400:0 4402:0 '),\n('4402', 'gh670', '571', '394', '394', '72', '76', '0', '3783', '-2602.59', '191.183', '4.81351', '4401:0 4283:0 '),\n('4403', 'zd671', '571', '66', '66', '73', '77', '0', '5075.22', '-4157.1', '351.671', '0.704319', '4369:0 4530:0 4531:0 '),\n('4404', 'zd672', '571', '66', '66', '73', '77', '0', '4642.75', '-3362.88', '292.419', '0.845695', '4379:0 4470:0 '),\n('4405', 'zd673', '571', '66', '66', '73', '77', '0', '4845.51', '-1504.94', '248.946', '5.30284', '4149:0 4406:0 '),\n('4406', 'zd674', '571', '66', '66', '73', '77', '0', '4915.37', '-1688.61', '248.309', '4.74834', '4405:0 4407:0 '),\n('4407', 'zd675', '571', '66', '66', '73', '77', '0', '4913.71', '-1902.76', '248.309', '4.71615', '4406:0 4408:0 4410:0 '),\n('4408', 'zd676', '571', '66', '66', '73', '77', '0', '4907.24', '-2149.46', '248.308', '4.51509', '4407:0 4409:0 4410:0 '),\n('4409', 'zd677', '571', '66', '4316', '73', '77', '0', '4935.58', '-2282.22', '243.077', '5.02638', '4408:0 4446:0 '),\n('4410', 'zd678', '571', '66', '66', '73', '77', '0', '4948.85', '-2047.71', '248.309', '0.0634512', '4408:0 4407:0 4411:0 '),\n('4411', 'zd679', '571', '66', '66', '73', '77', '0', '5154.72', '-2050.3', '248.297', '1.1198', '4410:0 4412:0 4442:0 4443:0 '),\n('4412', 'zd680', '571', '66', '66', '73', '77', '0', '5198.14', '-1908', '243.765', '1.97824', '4411:0 4413:0 '),\n('4413', 'zd681', '571', '66', '4311', '73', '77', '0', '5168.01', '-1763.65', '243.57', '1.69157', '4412:0 4414:0 '),\n('4414', 'zd682', '571', '66', '4311', '73', '77', '0', '5227.64', '-1629.23', '235.86', '1.70729', '4413:0 4415:0 '),\n('4415', 'zd683', '571', '66', '66', '73', '77', '0', '5202.17', '-1444.6', '235.3', '1.67195', '4414:0 4416:0 4417:0 '),\n('4416', 'zd684', '571', '66', '4312', '73', '77', '1', '5228.85', '-1333.15', '242.312', '5.2078', '4415:0 4417:0 '),\n('4417', 'zd685', '571', '66', '66', '73', '77', '0', '5369.86', '-1421.32', '236.955', '3.0236', '4416:0 4415:0 4418:0 '),\n('4418', 'zd686', '571', '66', '66', '73', '77', '0', '5446.59', '-1338.52', '239.221', '4.34385', '4417:0 4419:0 4420:0 4440:0 '),\n('4419', 'zd687', '571', '66', '66', '73', '77', '0', '5443.61', '-1214.88', '247.443', '1.55882', '4418:0 4561:0 '),\n('4420', 'zd688', '571', '66', '4313', '73', '77', '0', '5555.66', '-1397.11', '239.86', '2.99374', '4418:0 4421:0 '),\n('4421', 'zd689', '571', '66', '4313', '73', '77', '0', '5695.79', '-1400.51', '234.446', '5.54941', '4420:0 4422:0 4435:0 '),\n('4422', 'zd690', '571', '66', '4313', '73', '77', '0', '5775.25', '-1545.64', '229.906', '6.10312', '4421:0 4423:0 4435:0 '),\n('4423', 'zd691', '571', '66', '4469', '73', '77', '0', '5886.45', '-1638.86', '237.734', '5.61617', '4422:0 4424:0 4436:0 '),\n('4424', 'zd692', '571', '66', '4469', '73', '77', '0', '5972.87', '-1716.32', '231.167', '5.38055', '4423:0 4425:0 '),\n('4425', 'zd693', '571', '66', '4469', '73', '77', '0', '6050.18', '-1854.06', '239.866', '4.90932', '4424:0 4426:0 '),\n('4426', 'zd694', '571', '66', '4315', '73', '77', '0', '6083.8', '-1956.71', '235.309', '5.74812', '4425:0 4427:0 4429:0 '),\n('4427', 'zd695', '571', '66', '4315', '73', '77', '0', '6239.25', '-1977.17', '235.732', '4.86297', '4426:0 4428:0 '),\n('4428', 'zd696', '571', '66', '4315', '73', '77', '0', '6209.7', '-2182.71', '236.212', '3.31259', '4427:0 4429:0 '),\n('4429', 'zd697', '571', '66', '4315', '73', '77', '0', '6062.56', '-2208.12', '234.275', '1.69703', '4428:0 4426:0 4430:0 '),\n('4430', 'zd698', '571', '66', '4315', '73', '77', '0', '5846.96', '-2232.9', '236.499', '3.12253', '4429:0 4431:0 '),\n('4431', 'zd699', '571', '66', '4468', '73', '77', '0', '5680.87', '-2213.84', '239.83', '3.10525', '4430:0 4432:0 4437:0 '),\n('4432', 'zd700', '571', '66', '4468', '73', '77', '0', '5565.53', '-2198.52', '235.496', '1.86432', '4431:0 4433:0 '),\n('4433', 'zd701', '571', '66', '4468', '73', '77', '0', '5571.97', '-1996.67', '237.88', '1.26977', '4432:0 4434:0 4437:0 4438:0 '),\n('4434', 'zd702', '571', '66', '4468', '73', '77', '0', '5653.64', '-1810.94', '236.435', '1.32868', '4433:0 4435:0 4436:0 '),\n('4435', 'zd703', '571', '66', '4313', '73', '77', '0', '5609.8', '-1610.43', '237.022', '0.732563', '4434:0 4422:0 4421:0 '),\n('4436', 'zd704', '571', '66', '4468', '73', '77', '0', '5833.14', '-1759.05', '233.346', '1.1936', '4434:0 4423:0 4437:0 '),\n('4437', 'zd705', '571', '66', '4468', '73', '77', '0', '5766.32', '-1991.79', '235.993', '4.71376', '4436:0 4431:0 4433:0 '),\n('4438', 'zd706', '571', '66', '66', '73', '77', '0', '5444.04', '-1955.64', '248.222', '4.72161', '4433:0 4439:0 4441:0 4442:0 '),\n('4439', 'zd707', '571', '66', '66', '73', '77', '0', '5446.88', '-1747.93', '248.337', '1.71275', '4438:0 4440:0 '),\n('4440', 'zd708', '571', '66', '66', '73', '77', '0', '5445.34', '-1527.93', '248.26', '1.56823', '4439:0 4418:0 '),\n('4441', 'zd709', '571', '66', '66', '73', '77', '0', '5449.03', '-2186.49', '248.309', '4.69804', '4438:0 4447:0 '),\n('4442', 'zd710', '571', '66', '66', '73', '77', '0', '5286.44', '-2043.61', '246.138', '3.10918', '4438:0 4411:0 '),\n('4443', 'zd711', '571', '66', '4317', '73', '77', '1', '5168.98', '-2192.3', '236.538', '5.78582', '4411:0 4444:0 '),\n('4444', 'zd712', '571', '66', '66', '73', '77', '0', '5057.15', '-2200.22', '244.382', '3.79877', '4443:0 4445:0 '),\n('4445', 'zd713', '571', '66', '66', '73', '77', '0', '5039.31', '-2353.08', '242.172', '3.30084', '4444:0 4446:0 '),\n('4446', 'zd714', '571', '66', '4316', '73', '77', '0', '4870.93', '-2382.92', '234.006', '2.40312', '4445:0 4409:0 '),\n('4447', 'zd715', '571', '66', '4275', '73', '77', '0', '5451.23', '-2302.91', '297.236', '1.61772', '4441:0 4448:0 4449:0 4476:0 '),\n('4448', 'zd716', '571', '66', '4275', '73', '77', '0', '5448.61', '-2517.18', '292.419', '4.61951', '4447:0 4449:0 4465:0 4476:0 '),\n('4449', 'zd717', '571', '66', '4275', '73', '77', '0', '5555.82', '-2440.17', '290.942', '2.83587', '4448:0 4447:0 4450:0 4476:0 '),\n('4450', 'zd718', '571', '66', '4318', '73', '77', '0', '5688.46', '-2430.58', '287.55', '3.11862', '4449:0 4451:0 '),\n('4451', 'zd719', '571', '66', '4294', '73', '77', '0', '5806.54', '-2342.64', '290.484', '5.7662', '4450:0 4452:0 '),\n('4452', 'zd720', '571', '66', '4294', '73', '77', '0', '5929.41', '-2434.64', '292.384', '5.92563', '4451:0 4453:0 '),\n('4453', 'zd721', '571', '66', '4294', '73', '77', '0', '6095.28', '-2375.23', '290.191', '0.345376', '4452:0 4454:0 '),\n('4454', 'zd722', '571', '66', '4276', '73', '77', '0', '6180.98', '-2386.29', '307.72', '4.9046', '4453:0 4455:0 '),\n('4455', 'zd723', '571', '66', '4276', '73', '77', '0', '6189.69', '-2520.06', '304.709', '4.73102', '4454:0 4456:0 4461:0 '),\n('4456', 'zd724', '571', '66', '4276', '73', '77', '0', '6265.08', '-2506.2', '302.978', '4.68313', '4455:0 4457:0 '),\n('4457', 'zd725', '571', '66', '4276', '73', '77', '0', '6245.94', '-2735.34', '302.749', '3.45398', '4456:0 4458:0 4459:0 '),\n('4458', 'zd726', '571', '66', '4276', '73', '77', '0', '6057.61', '-2737.89', '302.8', '1.51562', '4457:0 4460:0 '),\n('4459', 'zd727', '571', '66', '66', '73', '77', '0', '6297.01', '-2862.98', '293.934', '2.17613', '4457:0 '),\n('4460', 'zd728', '571', '66', '66', '73', '77', '0', '6048.63', '-2898.7', '296.891', '3.34009', '4458:0 '),\n('4461', 'zd729', '571', '66', '4276', '73', '77', '0', '6198.47', '-2622.9', '293.162', '1.74809', '4455:0 4462:0 '),\n('4462', 'zd730', '571', '66', '4276', '73', '77', '0', '6057.09', '-2616.09', '302.748', '3.26077', '4461:0 4463:0 '),\n('4463', 'zd731', '571', '66', '66', '73', '77', '0', '5884.73', '-2617.57', '292.418', '3.15396', '4462:0 4464:0 '),\n('4464', 'zd732', '571', '66', '66', '73', '77', '0', '5672.49', '-2619.11', '292.418', '3.13825', '4463:0 4465:0 4477:0 '),\n('4465', 'zd733', '571', '66', '4275', '73', '77', '1', '5457.16', '-2620.72', '306.551', '1.83449', '4464:0 4448:0 4466:0 '),\n('4466', 'zd734', '571', '66', '66', '73', '77', '0', '5332.55', '-2708.7', '292.419', '3.89224', '4465:0 4467:0 4474:0 '),\n('4467', 'zd735', '571', '66', '66', '73', '77', '0', '5189.96', '-2843.82', '292.419', '5.47639', '4466:0 4468:0 4471:0 4473:0 4474:0 '),\n('4468', 'zd736', '571', '66', '66', '73', '77', '0', '5035.14', '-2975.52', '292.29', '3.86318', '4467:0 4469:0 4473:0 4483:0 '),\n('4469', 'zd737', '571', '66', '66', '73', '77', '0', '4891.99', '-3121.16', '292.419', '3.92601', '4468:0 4470:0 4486:0 '),\n('4470', 'zd738', '571', '66', '66', '73', '77', '0', '4770.68', '-3237.29', '292.419', '3.91659', '4469:0 4404:0 4487:0 '),\n('4471', 'zd739', '571', '66', '66', '73', '77', '0', '5358.22', '-3018.37', '292.42', '5.50546', '4467:0 4472:0 4483:0 '),\n('4472', 'zd740', '571', '66', '66', '73', '77', '0', '5504.36', '-3161.64', '327.623', '5.5251', '4471:0 4482:0 4491:0 '),\n('4473', 'zd741', '571', '66', '4278', '73', '77', '0', '4997.42', '-2791.64', '287.647', '5.40334', '4468:0 4467:0 4474:0 '),\n('4474', 'zd742', '571', '66', '4278', '73', '77', '0', '5158.28', '-2673.27', '288.27', '0.638333', '4473:0 4466:0 4467:0 4475:0 '),\n('4475', 'zd743', '571', '66', '66', '73', '77', '0', '5256.37', '-2555.92', '288.451', '1.56824', '4474:0 4476:0 '),\n('4476', 'zd744', '571', '66', '4275', '73', '77', '0', '5338.16', '-2432.94', '289.035', '0.00530624', '4475:0 4448:0 4447:0 4449:0 '),\n('4477', 'zd745', '571', '66', '4280', '73', '77', '0', '5779.01', '-2690.72', '276.583', '2.21778', '4464:0 4478:0 '),\n('4478', 'zd746', '571', '66', '4320', '73', '77', '0', '5721.5', '-2843.26', '274.479', '3.99436', '4477:0 4479:0 4481:0 '),\n('4479', 'zd747', '571', '66', '4320', '73', '77', '1', '5795.09', '-3017.85', '286.307', '5.12926', '4478:0 4480:0 '),\n('4480', 'zd748', '571', '66', '4320', '73', '77', '0', '5829.57', '-3089.62', '343.078', '5.24393', '4479:0 4496:0 '),\n('4481', 'zd749', '571', '66', '4280', '73', '77', '0', '5611.83', '-2947.53', '274.379', '3.44223', '4478:0 4482:0 '),\n('4482', 'zd750', '571', '66', '4280', '73', '77', '0', '5467.65', '-3021.98', '288.17', '4.29281', '4481:0 4472:0 '),\n('4483', 'zd751', '571', '66', '4279', '73', '77', '0', '5183.53', '-3158.14', '271.373', '0.983891', '4471:0 4468:0 4484:0 '),\n('4484', 'zd752', '571', '66', '4279', '73', '77', '0', '5277.96', '-3280.48', '281.073', '4.24508', '4483:0 4485:0 '),\n('4485', 'zd753', '571', '66', '4279', '73', '77', '0', '5170.84', '-3397.25', '289.096', '2.18261', '4484:0 4486:0 4488:0 '),\n('4486', 'zd754', '571', '66', '4279', '73', '77', '0', '5037.17', '-3252.81', '278.555', '2.42609', '4485:0 4469:0 '),\n('4487', 'zd755', '571', '66', '4299', '73', '77', '0', '4868.35', '-3381.36', '292.891', '5.68473', '4470:0 4488:0 '),\n('4488', 'zd756', '571', '66', '4299', '73', '77', '0', '5062.51', '-3481.16', '289.586', '4.38568', '4487:0 4485:0 4489:0 '),\n('4489', 'zd757', '571', '66', '4299', '73', '77', '0', '5037.37', '-3645.39', '298.622', '4.61344', '4488:0 4490:0 '),\n('4490', 'zd758', '571', '66', '4299', '73', '77', '0', '5087.62', '-3673.69', '368.159', '1.40275', '4489:0 '),\n('4491', 'zd759', '571', '66', '66', '73', '77', '0', '5653.1', '-3291.77', '372.841', '5.39966', '4472:0 4492:0 4496:0 4527:0 '),\n('4492', 'zd760', '571', '66', '4323', '73', '77', '0', '5760.12', '-3480.35', '382.038', '4.42027', '4491:0 4493:0 4496:0 4527:0 '),\n('4493', 'zd761', '571', '66', '4323', '73', '77', '1', '5763.21', '-3592.34', '386.495', '5.18723', '4492:0 4494:0 '),\n('4494', 'zd762', '571', '66', '66', '73', '77', '0', '5805.54', '-3730.07', '371.987', '2.07548', '4493:0 4495:0 4512:0 4522:0 '),\n('4495', 'zd763', '571', '66', '66', '73', '77', '0', '5926.35', '-3596.12', '371.987', '2.21685', '4494:0 4496:0 4513:0 '),\n('4496', 'zd764', '571', '66', '66', '73', '77', '0', '5852.16', '-3456.19', '373.499', '0.462273', '4491:0 4495:0 4492:0 4497:0 4480:0 '),\n('4497', 'zd765', '571', '66', '4327', '73', '77', '0', '6015.43', '-3354.83', '351.334', '0.898171', '4496:0 4498:0 4500:0 '),\n('4498', 'zd766', '571', '66', '4327', '73', '77', '0', '6064.66', '-3220.41', '351.084', '5.24378', '4497:0 4499:0 '),\n('4499', 'zd767', '571', '66', '4327', '73', '77', '0', '6170.15', '-3269.78', '354.099', '4.83851', '4498:0 4500:0 4504:0 '),\n('4500', 'zd768', '571', '66', '4327', '73', '77', '0', '6123.58', '-3376.38', '350.427', '3.6502', '4499:0 4497:0 4501:0 '),\n('4501', 'zd769', '571', '66', '4328', '73', '77', '0', '6121.57', '-3498.34', '384.702', '6.11321', '4500:0 4503:0 4502:0 '),\n('4502', 'zd770', '571', '66', '4328', '73', '77', '0', '6262.56', '-3570.42', '383.729', '4.01857', '4501:0 4503:0 4510:0 '),\n('4503', 'zd771', '571', '66', '4328', '73', '77', '0', '6183.8', '-3653.66', '384.553', '1.57362', '4501:0 4502:0 4513:0 '),\n('4504', 'zd772', '571', '66', '4321', '73', '77', '0', '6322.87', '-3285.06', '388.539', '6.26715', '4499:0 4505:0 4509:0 4510:0 '),\n('4505', 'zd773', '571', '66', '4321', '73', '77', '0', '6411.23', '-3132.08', '389.357', '0.676679', '4504:0 4506:0 '),\n('4506', 'zd774', '571', '66', '4321', '73', '77', '0', '6573.73', '-3100.58', '392.875', '3.25828', '4505:0 4507:0 '),\n('4507', 'zd775', '571', '66', '4321', '73', '77', '0', '6591.66', '-3194.21', '412.812', '2.18937', '4506:0 4508:0 '),\n('4508', 'zd776', '571', '66', '4321', '73', '77', '0', '6440.64', '-3192.66', '402.475', '4.61546', '4507:0 4509:0 '),\n('4509', 'zd777', '571', '66', '4321', '73', '77', '0', '6464.24', '-3278.19', '402.912', '0.40965', '4508:0 4504:0 '),\n('4510', 'zd778', '571', '66', '4321', '73', '77', '0', '6447.03', '-3450.35', '388.772', '5.0215', '4504:0 4511:0 4502:0 '),\n('4511', 'zd779', '571', '66', '66', '73', '77', '0', '6351.61', '-3625.18', '379.474', '1.56496', '4510:0 '),\n('4512', 'zd780', '571', '66', '4326', '73', '77', '0', '5890.65', '-3784.26', '361.962', '2.65353', '4494:0 4513:0 4514:0 '),\n('4513', 'zd781', '571', '66', '66', '73', '77', '0', '6002.17', '-3684.49', '371.988', '2.91507', '4512:0 4495:0 4503:0 4535:0 '),\n('4514', 'zd782', '571', '66', '66', '73', '77', '0', '5871.01', '-3998.48', '364.264', '5.0278', '4512:0 4515:0 '),\n('4515', 'zd783', '571', '66', '4371', '73', '77', '0', '5936.71', '-4166.52', '353.36', '6.12894', '4514:0 4516:0 4518:0 4519:0 '),\n('4516', 'zd784', '571', '66', '4371', '73', '77', '0', '6121.47', '-4241.02', '320.493', '2.98578', '4515:0 4517:0 '),\n('4517', 'zd785', '571', '66', '4371', '73', '77', '0', '6077.47', '-4432.62', '362.867', '1.61132', '4516:0 4518:0 '),\n('4518', 'zd786', '571', '66', '4371', '73', '77', '0', '5913.09', '-4334', '361.983', '1.57991', '4515:0 4517:0 '),\n('4519', 'zd787', '571', '66', '4325', '73', '77', '0', '5789.33', '-4263.74', '371.348', '4.26205', '4515:0 4520:0 '),\n('4520', 'zd788', '571', '66', '4325', '73', '77', '0', '5716.79', '-4325.83', '373.993', '4.5605', '4519:0 4521:0 4534:0 '),\n('4521', 'zd789', '571', '66', '4325', '73', '77', '0', '5716.89', '-4120.29', '353.305', '1.62547', '4520:0 4522:0 4534:0 '),\n('4522', 'zd790', '571', '66', '66', '73', '77', '0', '5706.28', '-3833.4', '371.987', '0.940598', '4521:0 4494:0 4523:0 '),\n('4523', 'zd791', '571', '66', '66', '73', '77', '0', '5537.84', '-3840.96', '372.119', '2.47998', '4522:0 4524:0 4525:0 '),\n('4524', 'zd792', '571', '66', '4322', '73', '77', '0', '5351.53', '-3648.35', '361.961', '2.27578', '4523:0 4525:0 4526:0 4528:0 '),\n('4525', 'zd793', '571', '66', '4322', '73', '77', '0', '5343.06', '-3764.54', '373.087', '0.190553', '4523:0 4524:0 '),\n('4526', 'zd794', '571', '66', '66', '73', '77', '0', '5524.4', '-3572.01', '365.432', '0.730907', '4524:0 4527:0 '),\n('4527', 'zd795', '571', '66', '4324', '73', '77', '0', '5626.9', '-3422.21', '363.833', '0.990089', '4526:0 4491:0 4492:0 '),\n('4528', 'zd796', '571', '66', '4322', '73', '77', '0', '5153.32', '-3723.32', '360.396', '4.07514', '4524:0 4529:0 '),\n('4529', 'zd797', '571', '66', '4322', '73', '77', '0', '5076.21', '-3849.59', '356.664', '4.99406', '4528:0 4530:0 '),\n('4530', 'zd798', '571', '66', '66', '73', '77', '0', '5136.04', '-4040.57', '355.425', '5.10401', '4529:0 4403:0 4531:0 '),\n('4531', 'zd799', '571', '66', '66', '73', '77', '0', '5278.78', '-4177.66', '363.104', '2.86954', '4530:0 4403:0 4532:0 '),\n('4532', 'zd800', '571', '66', '66', '73', '77', '0', '5437.96', '-4288.78', '363.086', '5.803', '4531:0 4533:0 4534:0 '),\n('4533', 'zd801', '571', '66', '66', '73', '77', '0', '5440.87', '-4452.18', '379.545', '5.85562', '4532:0 '),\n('4534', 'zd802', '571', '66', '4325', '73', '77', '0', '5627.9', '-4207.17', '364.009', '5.93258', '4532:0 4521:0 4520:0 '),\n('4535', 'zd803', '571', '66', '66', '73', '77', '0', '6164.11', '-3834.22', '436.687', '5.57209', '4513:0 4536:0 '),\n('4536', 'zd804', '571', '66', '66', '73', '77', '0', '6297.28', '-3979.47', '456.92', '5.47784', '4535:0 4537:0 '),\n('4537', 'zd805', '571', '66', '66', '73', '77', '0', '6443.44', '-4126.1', '462.301', '5.40087', '4536:0 4538:0 4548:0 '),\n('4538', 'zd806', '571', '66', '4329', '73', '77', '0', '6406.23', '-4295.64', '457.247', '4.84558', '4537:0 4539:0 4547:0 '),\n('4539', 'zd807', '571', '66', '66', '73', '77', '0', '6273.9', '-4442.23', '450.834', '3.83242', '4538:0 4540:0 4543:0 '),\n('4540', 'zd808', '571', '66', '4329', '73', '77', '0', '6178.17', '-4399.01', '456.879', '1.41967', '4539:0 4541:0 '),\n('4541', 'zd809', '571', '66', '4329', '73', '77', '0', '6227.62', '-4232.4', '436.632', '4.94847', '4540:0 4542:0 '),\n('4542', 'zd810', '571', '66', '4329', '73', '77', '0', '6214.01', '-4138.28', '447.456', '5.0066', '4541:0 '),\n('4543', 'zd811', '571', '66', '4373', '73', '77', '0', '6412.14', '-4626.89', '453.335', '2.16502', '4539:0 4544:0 '),\n('4544', 'zd812', '571', '66', '4375', '73', '77', '0', '6602.74', '-4663.95', '450.613', '0.474835', '4543:0 4545:0 4559:0 '),\n('4545', 'zd813', '571', '66', '4375', '73', '77', '0', '6698.48', '-4568.11', '450.518', '2.11632', '4544:0 4546:0 '),\n('4546', 'zd814', '571', '66', '4375', '73', '77', '0', '6638.09', '-4503.12', '485.547', '2.39985', '4545:0 4547:0 '),\n('4547', 'zd815', '571', '66', '4373', '73', '77', '0', '6532.06', '-4368.66', '450.654', '5.95377', '4546:0 4538:0 4548:0 '),\n('4548', 'zd816', '571', '66', '66', '73', '77', '0', '6586.21', '-4259.92', '452.582', '2.52315', '4547:0 4537:0 4549:0 '),\n('4549', 'zd817', '571', '66', '66', '73', '77', '0', '6681.53', '-4181.26', '455.784', '5.78336', '4548:0 4550:0 4557:0 '),\n('4550', 'zd818', '571', '66', '66', '73', '77', '0', '6821.02', '-4227.92', '452.785', '0.387671', '4549:0 4551:0 4557:0 '),\n('4551', 'zd819', '571', '66', '4579', '73', '77', '1', '6899.77', '-4113.21', '467.355', '4.92777', '4550:0 4552:0 '),\n('4552', 'zd820', '571', '66', '66', '73', '77', '0', '7055.14', '-4222.88', '450.363', '3.95496', '4551:0 4553:0 '),\n('4553', 'zd821', '571', '66', '66', '73', '77', '0', '7139.88', '-4413.45', '457.062', '4.921', '4552:0 4554:0 '),\n('4554', 'zd822', '571', '66', '4375', '73', '77', '0', '7003.8', '-4522.32', '450.519', '3.23161', '4553:0 4555:0 '),\n('4555', 'zd823', '571', '66', '4375', '73', '77', '0', '6879.7', '-4603.96', '452.922', '4.36494', '4554:0 4556:0 4558:0 '),\n('4556', 'zd824', '571', '66', '4375', '73', '77', '0', '6779.05', '-4455.52', '441.057', '2.48784', '4555:0 4557:0 '),\n('4557', 'zd825', '571', '66', '4375', '73', '77', '0', '6738.67', '-4314.66', '450.026', '0.835357', '4556:0 4550:0 4549:0 '),\n('4558', 'zd826', '571', '66', '4375', '73', '77', '0', '6817.32', '-4743.11', '450.661', '4.44034', '4555:0 4559:0 '),\n('4559', 'zd827', '571', '66', '66', '73', '77', '0', '6680.31', '-4847.44', '452.584', '2.08415', '4558:0 4544:0 4560:0 '),\n('4560', 'zd828', '571', '66', '4375', '73', '77', '0', '6841.86', '-4987.38', '451.036', '5.56582', '4559:0 '),\n('4561', 'cs829', '571', '2817', '4557', '74', '78', '0', '5438.42', '-1075.94', '181.63', '1.64666', '4419:0 4562:0 4565:0 4567:0 '),\n('4562', 'cs830', '571', '2817', '4554', '74', '78', '0', '5414.79', '-913.179', '165.857', '1.65453', '4561:0 4563:0 '),\n('4563', 'cs831', '571', '2817', '4557', '74', '78', '0', '5529.65', '-840.32', '161.565', '0.178767', '4562:0 4564:0 4566:0 4578:0 '),\n('4564', 'cs832', '571', '2817', '4557', '74', '78', '0', '5646.92', '-907.293', '186.362', '5.31056', '4563:0 4565:0 '),\n('4565', 'cs833', '571', '2817', '4557', '74', '78', '0', '5531.5', '-987.127', '191.383', '0.576966', '4561:0 4564:0 '),\n('4566', 'cs834', '571', '2817', '4558', '74', '78', '5', '5605.93', '-749.995', '199.49', '1.05213', '4563:0 '),\n('4567', 'cs835', '571', '2817', '4554', '74', '78', '0', '5331.06', '-914.795', '170.103', '1.60977', '4561:0 4568:0 '),\n('4568', 'cs836', '571', '2817', '4554', '74', '78', '0', '5307.84', '-750.937', '162.904', '2.08886', '4567:0 4569:0 '),\n('4569', 'cs837', '571', '2817', '4557', '74', '78', '0', '5179.88', '-711.115', '164.986', '1.15816', '4568:0 4570:0 4572:0 '),\n('4570', 'cs838', '571', '2817', '2817', '74', '78', '2', '5082.9', '-704.384', '186.517', '6.16508', '4569:0 4571:0 '),\n('4571', 'cs839', '571', '2817', '4559', '74', '78', '3', '5062.59', '-611.621', '218.683', '5.43466', '4570:0 '),\n('4572', 'cs840', '571', '2817', '4557', '74', '78', '0', '5185.33', '-555.375', '158.496', '1.08748', '4569:0 4573:0 '),\n('4573', 'cs841', '571', '2817', '4557', '74', '78', '0', '5212.12', '-335.385', '163.451', '1.20529', '4572:0 4574:0 '),\n('4574', 'cs842', '571', '2817', '4557', '74', '78', '0', '5329.19', '-218.838', '166.128', '0.232181', '4573:0 4575:0 4583:0 '),\n('4575', 'cs843', '571', '2817', '4557', '74', '78', '0', '5520.69', '-188.647', '157.616', '0.0751006', '4574:0 4576:0 4583:0 '),\n('4576', 'cs844', '571', '2817', '4557', '74', '78', '0', '5672.16', '-264.918', '167.932', '5.74096', '4575:0 4577:0 4579:0 4674:0 '),\n('4577', 'cs845', '571', '2817', '4557', '74', '78', '0', '5583.23', '-439.368', '154.644', '4.20158', '4576:0 4578:0 '),\n('4578', 'cs846', '571', '2817', '4554', '74', '78', '0', '5498.08', '-612.708', '152.463', '4.75686', '4577:0 4563:0 '),\n('4579', 'cs847', '571', '2817', '4553', '74', '78', '0', '5679.51', '-108.805', '178.045', '1.46212', '4576:0 4580:0 4809:0 '),\n('4580', 'cs848', '571', '2817', '4553', '74', '78', '0', '5720.75', '54.3693', '171.054', '1.38122', '4579:0 4581:0 4582:0 4597:0 '),\n('4581', 'cs849', '571', '2817', '4553', '74', '78', '0', '5765.22', '181.998', '182.874', '0.613098', '4580:0 '),\n('4582', 'cs850', '571', '2817', '4553', '74', '78', '0', '5544.73', '121.881', '150.263', '4.18823', '4580:0 4583:0 '),\n('4583', 'cs851', '571', '2817', '4553', '74', '78', '0', '5414.2', '-47.7746', '149.795', '3.91334', '4582:0 4575:0 4574:0 4584:0 '),\n('4584', 'cs852', '571', '2817', '2817', '74', '78', '0', '5354.31', '126.368', '161.642', '2.27029', '4583:0 4585:0 4586:0 '),\n('4585', 'cs853', '571', '2817', '2817', '74', '78', '0', '5257.75', '154.168', '191.769', '2.73995', '4584:0 4101:0 '),\n('4586', 'cs854', '571', '2817', '2817', '74', '78', '0', '5423.58', '292.611', '156.85', '1.48646', '4584:0 4587:0 '),\n('4587', 'cs855', '571', '2817', '2817', '74', '78', '0', '5436.65', '406.464', '167.948', '1.52965', '4586:0 4588:0 4596:0 '),\n('4588', 'cs856', '571', '2817', '4555', '74', '78', '0', '5332.71', '578.052', '182.7', '1.3333', '4587:0 4589:0 '),\n('4589', 'cs857', '571', '2817', '4555', '74', '78', '0', '5471.03', '710.798', '171.741', '0.739547', '4588:0 4590:0 '),\n('4590', 'cs858', '571', '2817', '2817', '74', '78', '0', '5519.14', '908.014', '167.988', '1.35608', '4589:0 4591:0 4592:0 '),\n('4591', 'cs859', '571', '2817', '4556', '74', '78', '1', '5706.15', '1006.05', '174.48', '3.67458', '4590:0 '),\n('4592', 'cs860', '571', '2817', '2817', '74', '78', '0', '5682.36', '825.06', '156.036', '5.32233', '4590:0 4593:0 '),\n('4593', 'cs861', '571', '2817', '2817', '74', '78', '0', '5849.61', '885.831', '160.066', '0.393957', '4592:0 4594:0 '),\n('4594', 'cs862', '571', '2817', '4553', '74', '78', '0', '5854.17', '706.025', '164.715', '4.73956', '4593:0 4595:0 '),\n('4595', 'cs863', '571', '2817', '4553', '74', '78', '0', '5740.73', '555.099', '158.091', '4.03271', '4594:0 4596:0 '),\n('4596', 'cs864', '571', '2817', '4553', '74', '78', '0', '5615.21', '410.65', '156.222', '3.51042', '4595:0 4587:0 4597:0 '),\n('4597', 'cs865', '571', '2817', '4553', '74', '78', '0', '5676.64', '245.015', '166.802', '4.93592', '4596:0 4580:0 '),\n('4598', 'sb866', '571', '3711', '4483', '74', '78', '0', '4671.5', '5526.35', '34.4275', '0.54946', '3857:0 4599:0 '),\n('4599', 'sb867', '571', '3711', '3711', '74', '78', '0', '4892.01', '5531.93', '-71.5606', '0.0389507', '4598:0 4600:0 4628:0 '),\n('4600', 'sb868', '571', '3711', '4289', '74', '78', '0', '4952.39', '5739.79', '-75.5644', '1.2249', '4599:0 4601:0 '),\n('4601', 'sb869', '571', '3711', '4289', '74', '78', '0', '5130.17', '5883.3', '-75.7286', '0.492126', '4600:0 4602:0 '),\n('4602', 'sb870', '571', '3711', '4289', '74', '78', '0', '5325.13', '5886.98', '-68.7967', '0.00281286', '4601:0 4603:0 4629:0 '),\n('4603', 'sb871', '571', '3711', '4285', '74', '78', '0', '5507.19', '5934.35', '-51.6289', '6.11243', '4602:0 4604:0 '),\n('4604', 'sb872', '571', '3711', '3711', '74', '78', '0', '5713', '5871.42', '-60.4173', '5.97499', '4603:0 4605:0 4668:0 '),\n('4605', 'sb873', '571', '3711', '4289', '74', '78', '0', '5882.95', '5730.44', '-63.8448', '5.56737', '4604:0 4606:0 '),\n('4606', 'sb874', '571', '3711', '4289', '74', '78', '0', '6018.42', '5571.93', '-74.0181', '5.18095', '4605:0 4607:0 4657:0 '),\n('4607', 'sb875', '571', '3711', '4385', '74', '78', '0', '6082.5', '5353.27', '-92.7974', '4.70422', '4606:0 4608:0 4656:0 '),\n('4608', 'sb876', '571', '3711', '3711', '74', '78', '0', '6268.69', '5300.48', '-100.197', '0.380579', '4607:0 4609:0 '),\n('4609', 'sb877', '571', '3711', '3711', '74', '78', '0', '6450.25', '5197.28', '-64.1861', '5.49824', '4608:0 4610:0 '),\n('4610', 'sb878', '571', '3711', '4376', '74', '78', '0', '6507.21', '4992.87', '-60.1724', '4.97202', '4609:0 4611:0 4650:0 '),\n('4611', 'sb879', '571', '3711', '3711', '74', '78', '0', '6524.26', '4794.34', '-58.974', '4.36726', '4610:0 4612:0 '),\n('4612', 'sb880', '571', '3711', '4368', '74', '78', '0', '6443.53', '4602.81', '-66.2857', '4.55104', '4611:0 4613:0 4649:0 4651:0 '),\n('4613', 'sb881', '571', '3711', '4368', '74', '78', '0', '6405.01', '4366.1', '-47.8041', '3.90309', '4612:0 4614:0 4648:0 4649:0 '),\n('4614', 'sb882', '571', '3711', '3711', '74', '78', '0', '6226.59', '4265.96', '-45.1729', '3.55594', '4613:0 4615:0 4648:0 '),\n('4615', 'sb883', '571', '3711', '4283', '74', '78', '0', '6111.71', '4134.4', '-48.7024', '4.20861', '4614:0 4616:0 '),\n('4616', 'sb884', '571', '3711', '4283', '74', '78', '0', '6038.48', '4009.63', '-42.6825', '4.13556', '4615:0 4617:0 '),\n('4617', 'sb885', '571', '3711', '4283', '74', '78', '0', '5938.28', '3889.47', '-35.5353', '3.47426', '4616:0 4618:0 4646:0 '),\n('4618', 'sb886', '571', '3711', '4283', '74', '78', '0', '5785.88', '3776.91', '-41.0442', '3.94', '4617:0 4619:0 4646:0 4647:0 '),\n('4619', 'sb887', '571', '3711', '3711', '74', '78', '0', '5624.29', '3606.52', '-21.7442', '3.13811', '4618:0 4620:0 4647:0 '),\n('4620', 'sb888', '571', '3711', '4283', '74', '78', '0', '5488.8', '3794.13', '-58.7714', '2.25061', '4619:0 4621:0 '),\n('4621', 'sb889', '571', '3711', '4387', '74', '78', '0', '5337.73', '3917.13', '-70.8363', '2.57655', '4620:0 4622:0 4642:0 4643:0 '),\n('4622', 'sb890', '571', '3711', '3711', '74', '78', '0', '5220.59', '4104.15', '-78.9241', '2.09588', '4621:0 4623:0 4641:0 '),\n('4623', 'sb891', '571', '3711', '3711', '74', '78', '0', '5146.69', '4294.33', '-99.9765', '1.80057', '4622:0 4624:0 4640:0 '),\n('4624', 'sb892', '571', '3711', '3711', '74', '78', '1', '5110.31', '4494.04', '-98.6996', '1.66941', '4623:0 4625:0 '),\n('4625', 'sb893', '571', '3711', '3711', '74', '78', '0', '5098.19', '4704.21', '-133.607', '2.04248', '4624:0 4626:0 4635:0 '),\n('4626', 'sb894', '571', '3711', '3711', '74', '78', '0', '4975.85', '4879.83', '-101.866', '1.73853', '4625:0 4627:0 4636:0 '),\n('4627', 'sb895', '571', '3711', '3711', '74', '78', '0', '4881.56', '5059.86', '-91.1009', '1.00104', '4626:0 4628:0 '),\n('4628', 'sb896', '571', '3711', '3711', '74', '78', '0', '4917.13', '5259.43', '-92.7846', '1.6058', '4627:0 4599:0 4672:0 '),\n('4629', 'sb897', '571', '3711', '3711', '74', '78', '0', '5325.03', '5694.77', '-87.1296', '4.35079', '4602:0 4630:0 '),\n('4630', 'sb898', '571', '3711', '4288', '74', '78', '0', '5283.58', '5529.21', '-98.5324', '4.62568', '4629:0 4631:0 '),\n('4631', 'sb899', '571', '3711', '3711', '74', '78', '0', '5296.26', '5368.21', '-119.485', '5.45035', '4630:0 4632:0 4669:0 '),\n('4632', 'sb900', '571', '3711', '4293', '74', '78', '0', '5334.1', '5156.57', '-135.744', '4.8503', '4631:0 4633:0 '),\n('4633', 'sb901', '571', '3711', '4293', '74', '78', '0', '5316.24', '4983.73', '-135.985', '4.21805', '4632:0 4634:0 4673:0 '),\n('4634', 'sb902', '571', '3711', '4293', '74', '78', '0', '5263.3', '4836.68', '-132.956', '4.22984', '4633:0 4635:0 '),\n('4635', 'sb903', '571', '3711', '4293', '74', '78', '0', '5171.92', '4761.28', '-134.094', '3.64315', '4634:0 4625:0 '),\n('4636', 'sb904', '571', '3711', '3711', '74', '78', '0', '4906.61', '4752.07', '-80.9517', '3.99658', '4626:0 4637:0 '),\n('4637', 'sb905', '571', '3711', '4388', '74', '78', '0', '4784.59', '4651.45', '-67.3646', '4.27774', '4636:0 4638:0 '),\n('4638', 'sb906', '571', '3711', '4388', '74', '78', '0', '4776.89', '4461.82', '-65.79', '0.115909', '4637:0 4639:0 '),\n('4639', 'sb907', '571', '3711', '3711', '74', '78', '0', '4858.79', '4312.13', '-51.668', '4.56127', '4638:0 4640:0 '),\n('4640', 'sb908', '571', '3711', '4304', '74', '78', '0', '5008.15', '4265.85', '-85.0377', '2.88757', '4639:0 4623:0 '),\n('4641', 'sb909', '571', '3711', '4303', '74', '78', '0', '5141.4', '4002.05', '-61.6423', '4.65002', '4622:0 4642:0 '),\n('4642', 'sb910', '571', '3711', '3711', '74', '78', '0', '5236.32', '3820.55', '-29.2583', '0.629582', '4641:0 4621:0 '),\n('4643', 'sb911', '571', '3711', '4283', '74', '78', '0', '5426.13', '4100.88', '-86.7674', '1.1935', '4621:0 4644:0 '),\n('4644', 'sb912', '571', '3711', '4283', '74', '78', '0', '5555.95', '4256', '-102.563', '0.234915', '4643:0 4645:0 4664:0 '),\n('4645', 'sb913', '571', '3711', '4283', '74', '78', '0', '5713.23', '4134.64', '-89.7735', '5.05333', '4644:0 4646:0 '),\n('4646', 'sb914', '571', '3711', '4283', '74', '78', '0', '5757.78', '3962.65', '-74.4666', '5.33842', '4645:0 4617:0 4618:0 '),\n('4647', 'sb915', '571', '3711', '4297', '74', '78', '0', '5782.35', '3632.67', '-13.2643', '3.22964', '4618:0 4619:0 '),\n('4648', 'sb916', '571', '3711', '3711', '74', '78', '0', '6360.37', '4223.67', '-44.0521', '1.79237', '4613:0 4614:0 '),\n('4649', 'sb917', '571', '3711', '4368', '74', '78', '0', '6543.56', '4456.6', '-47.1567', '2.3712', '4613:0 4612:0 '),\n('4650', 'sb918', '571', '3711', '4376', '74', '78', '0', '6354.19', '4873.76', '-84.2341', '5.19234', '4610:0 4651:0 '),\n('4651', 'sb919', '571', '3711', '3711', '74', '78', '0', '6357.09', '4685.34', '-78.5111', '5.19313', '4650:0 4612:0 4652:0 '),\n('4652', 'sb920', '571', '3711', '3711', '74', '78', '0', '6208.52', '4590.1', '-92.1573', '3.70988', '4651:0 4653:0 '),\n('4653', 'sb921', '571', '3711', '3711', '74', '78', '0', '6025.9', '4686.81', '-95.5438', '1.9176', '4652:0 4654:0 '),\n('4654', 'sb922', '571', '3711', '3711', '74', '78', '0', '5994.9', '4894.76', '-99.8287', '1.31128', '4653:0 4655:0 '),\n('4655', 'sb923', '571', '3711', '4385', '74', '78', '0', '5981.34', '5089.26', '-100.986', '1.44401', '4654:0 4656:0 '),\n('4656', 'sb924', '571', '3711', '4391', '74', '78', '0', '5939.08', '5277.6', '-99.1834', '0.521168', '4655:0 4607:0 4657:0 4658:0 '),\n('4657', 'sb925', '571', '3711', '4391', '74', '78', '0', '5903.46', '5420.52', '-94.3184', '1.13064', '4656:0 4606:0 '),\n('4658', 'sb926', '571', '3711', '4293', '74', '78', '0', '5830.14', '5100.16', '-132.628', '3.78921', '4656:0 4659:0 '),\n('4659', 'sb927', '571', '3711', '4293', '74', '78', '0', '5680.53', '5002.31', '-134.988', '3.89916', '4658:0 4660:0 '),\n('4660', 'sb928', '571', '3711', '4293', '74', '78', '0', '5699.45', '4825.48', '-137.014', '5.40319', '4659:0 4661:0 '),\n('4661', 'sb929', '571', '3711', '4293', '74', '78', '0', '5769.89', '4694.83', '-130.521', '4.6445', '4660:0 4662:0 '),\n('4662', 'sb930', '571', '3711', '4293', '74', '78', '0', '5768.78', '4519.94', '-133.978', '4.9029', '4661:0 4663:0 '),\n('4663', 'sb931', '571', '3711', '4293', '74', '78', '0', '5638.21', '4442.49', '-138.205', '3.53632', '4662:0 4664:0 4665:0 '),\n('4664', 'sb932', '571', '3711', '4293', '74', '78', '0', '5520.96', '4384.34', '-134.132', '5.02072', '4663:0 4644:0 '),\n('4665', 'sb933', '571', '3711', '4293', '74', '78', '1', '5647.9', '4579.12', '-137.584', '3.59247', '4663:0 4666:0 '),\n('4666', 'sb934', '571', '3711', '4293', '74', '78', '0', '5559.82', '4670.56', '-135.523', '1.45736', '4665:0 4667:0 '),\n('4667', 'sb935', '571', '3711', '4383', '74', '78', '5', '5497.21', '4748.71', '-193.716', '5.27047', '4666:0 '),\n('4668', 'sb936', '571', '3711', '4284', '74', '78', '1', '5575.69', '5751.97', '-74.7038', '0.766207', '4604:0 4671:0 '),\n('4669', 'sb937', '571', '3711', '4285', '74', '78', '0', '5456.52', '5353.98', '-134.279', '6.15248', '4631:0 4670:0 '),\n('4670', 'sb938', '571', '3711', '3711', '74', '78', '0', '5648.23', '5302.27', '-121.201', '1.53199', '4669:0 4671:0 '),\n('4671', 'sb939', '571', '3711', '3711', '74', '78', '0', '5580.86', '5590.13', '-92.6294', '1.61445', '4670:0 4668:0 '),\n('4672', 'sb940', '571', '3711', '3711', '74', '78', '0', '5041.36', '5069.92', '-110.999', '5.98282', '4628:0 4673:0 '),\n('4673', 'sb941', '571', '3711', '4293', '74', '78', '0', '5202.57', '5018.06', '-134.206', '5.92392', '4672:0 4633:0 '),\n('4674', 'sp942', '571', '67', '67', '76', '80', '0', '5752.46', '-354.53', '205.676', '5.2249', '4576:0 4675:0 '),\n('4675', 'sp943', '571', '67', '4419', '76', '80', '0', '5903.83', '-485.757', '296.6', '6.0849', '4674:0 4676:0 '),\n('4676', 'sp944', '571', '67', '4419', '76', '80', '0', '6079.55', '-564.659', '370.689', '5.9286', '4675:0 4677:0 4689:0 4690:0 '),\n('4677', 'sp945', '571', '67', '4419', '76', '80', '0', '6182.6', '-758.333', '400.203', '4.95', '4676:0 4678:0 4688:0 '),\n('4678', 'sp946', '571', '67', '4419', '76', '80', '0', '6143.85', '-967.832', '398.945', '4.41828', '4677:0 4679:0 4680:0 '),\n('4679', 'sp947', '571', '67', '4418', '76', '80', '1', '6122.51', '-1083.62', '402.604', '1.60263', '4678:0 '),\n('4680', 'sp948', '571', '67', '4419', '76', '80', '0', '6273.81', '-1034.37', '412.299', '5.98122', '4678:0 4681:0 4691:0 '),\n('4681', 'sp949', '571', '67', '4462', '76', '80', '0', '6444.88', '-1034.29', '429.644', '6.27654', '4680:0 4682:0 '),\n('4682', 'sp950', '571', '67', '4462', '76', '80', '0', '6611.36', '-1016.67', '427.636', '0.199126', '4681:0 4683:0 4684:0 '),\n('4683', 'sp951', '571', '67', '4462', '76', '80', '0', '6639.97', '-1111.4', '427.1', '3.18364', '4682:0 '),\n('4684', 'sp952', '571', '67', '4462', '76', '80', '0', '6673.93', '-1219.13', '398.841', '5.0403', '4682:0 4685:0 4686:0 '),\n('4685', 'sp953', '571', '67', '4462', '76', '80', '0', '6592.21', '-1275.82', '392.991', '5.05994', '4684:0 '),\n('4686', 'sp954', '571', '67', '4462', '76', '80', '0', '6697.35', '-1426.2', '388.747', '4.94449', '4684:0 4687:0 '),\n('4687', 'sp955', '571', '67', '4462', '76', '80', '0', '6795.01', '-1512.06', '359.911', '5.79979', '4686:0 '),\n('4688', 'sp956', '571', '67', '4419', '76', '80', '0', '6324.13', '-838.805', '407.569', '0.335772', '4677:0 '),\n('4689', 'sp957', '571', '67', '4419', '76', '80', '0', '6232.08', '-626.646', '414.707', '2.81842', '4676:0 '),\n('4690', 'sp958', '571', '67', '4419', '76', '80', '0', '6146.68', '-346.08', '436.33', '4.09626', '4676:0 '),\n('4691', 'sp959', '571', '67', '4419', '76', '80', '0', '6257', '-1198.57', '428.281', '5.0293', '4680:0 4692:0 4693:0 '),\n('4692', 'sp960', '571', '67', '4460', '76', '80', '0', '6297.61', '-1350.75', '426.332', '4.79525', '4691:0 4699:0 '),\n('4693', 'sp961', '571', '67', '4460', '76', '80', '0', '6393.21', '-1222.32', '429.226', '4.92092', '4691:0 4694:0 '),\n('4694', 'sp962', '571', '67', '4419', '76', '80', '0', '6471.87', '-1383.27', '479.473', '4.04521', '4693:0 4695:0 '),\n('4695', 'sp963', '571', '67', '4421', '76', '80', '0', '6345.12', '-1517.97', '434.126', '3.78838', '4694:0 4696:0 '),\n('4696', 'sp964', '571', '67', '4421', '76', '80', '0', '6349.58', '-1586.52', '428.04', '5.62228', '4695:0 4697:0 4699:0 '),\n('4697', 'sp965', '571', '67', '4421', '76', '80', '0', '6455.08', '-1685.64', '435.366', '5.95606', '4696:0 4698:0 '),\n('4698', 'sp966', '571', '67', '4421', '76', '80', '0', '6462.41', '-1739.78', '484.912', '2.47281', '4697:0 '),\n('4699', 'sp967', '571', '67', '4421', '76', '80', '0', '6232.83', '-1499.78', '419.118', '0.960144', '4696:0 4692:0 '),\n('4700', 'sp968', '571', '67', '4484', '76', '80', '1', '8455.31', '-325.265', '906.979', '2.46809', '4701:0 '),\n('4701', 'sp969', '571', '67', '4484', '76', '80', '0', '8485.73', '-279.992', '850.711', '1.97722', '4700:0 4702:0 '),\n('4702', 'sp970', '571', '67', '4436', '76', '80', '0', '8483.73', '-136.842', '797.392', '1.57038', '4701:0 4703:0 4706:0 '),\n('4703', 'sp971', '571', '67', '4436', '76', '80', '0', '8481.05', '57.8398', '786.425', '1.56174', '4702:0 4704:0 '),\n('4704', 'sp972', '571', '67', '4436', '76', '80', '0', '8468.58', '226.668', '788.805', '1.98979', '4703:0 4705:0 '),\n('4705', 'sp973', '571', '67', '4436', '76', '80', '0', '8317.77', '105.355', '824.229', '4.03339', '4704:0 4706:0 '),\n('4706', 'sp974', '571', '67', '4436', '76', '80', '0', '8313.08', '-91.3043', '827.379', '4.66407', '4705:0 4702:0 4707:0 4719:0 '),\n('4707', 'sp975', '571', '67', '4435', '76', '80', '0', '8202.06', '-202.29', '871.634', '4.01769', '4706:0 4708:0 4710:0 '),\n('4708', 'sp976', '571', '67', '4435', '76', '80', '0', '8237.33', '-247.278', '952.88', '3.24408', '4707:0 4709:0 '),\n('4709', 'sp977', '571', '67', '4435', '76', '80', '0', '8092.31', '-403.116', '964.773', '0.843118', '4708:0 '),\n('4710', 'sp978', '571', '67', '4435', '76', '80', '0', '8040.6', '-222.79', '846.911', '3.84806', '4707:0 4711:0 '),\n('4711', 'sp979', '571', '67', '4435', '76', '80', '0', '7945.56', '-368.7', '884.037', '5.26884', '4710:0 4712:0 4713:0 4715:0 '),\n('4712', 'sp980', '571', '67', '4435', '76', '80', '0', '7953.58', '-524.527', '913.45', '5.63719', '4711:0 4737:0 '),\n('4713', 'sp981', '571', '67', '4435', '76', '80', '0', '8056.94', '-415.927', '981.568', '4.73712', '4711:0 4714:0 '),\n('4714', 'sp982', '571', '67', '4435', '76', '80', '0', '8116.43', '-385.365', '981.611', '0.510895', '4713:0 '),\n('4715', 'sp983', '571', '67', '4436', '76', '80', '0', '7847.85', '-252.132', '885.258', '1.43374', '4711:0 4716:0 4724:0 '),\n('4716', 'sp984', '571', '67', '4436', '76', '80', '0', '7851.3', '-120.4', '880.754', '2.3126', '4715:0 4717:0 '),\n('4717', 'sp985', '571', '67', '4486', '76', '80', '0', '7796.32', '-44.5017', '882.083', '4.37664', '4716:0 4718:0 '),\n('4718', 'sp986', '571', '67', '4486', '76', '80', '0', '7737.47', '-4.97132', '866.565', '4.27297', '4717:0 '),\n('4719', 'sp987', '571', '67', '4434', '76', '80', '0', '8078.57', '-32.5271', '869.499', '2.49247', '4706:0 4720:0 '),\n('4720', 'sp988', '571', '67', '4434', '76', '80', '0', '8168.23', '99.4058', '898.859', '1.3183', '4719:0 4721:0 '),\n('4721', 'sp989', '571', '67', '4434', '76', '80', '0', '7974.07', '-6.90656', '961.657', '1.27039', '4720:0 4722:0 '),\n('4722', 'sp990', '571', '67', '4434', '76', '80', '0', '7950.02', '93.3063', '1028.03', '0.358544', '4721:0 4723:0 '),\n('4723', 'sp991', '571', '67', '4434', '76', '80', '0', '7756.08', '70.5513', '1009.34', '2.07228', '4722:0 '),\n('4724', 'sp992', '571', '67', '4436', '76', '80', '0', '7731.17', '-155.37', '873.081', '2.5828', '4715:0 4725:0 '),\n('4725', 'sp993', '571', '67', '67', '76', '80', '0', '7531.71', '-82.1077', '837.076', '3.3682', '4724:0 4726:0 '),\n('4726', 'sp994', '571', '67', '4424', '76', '80', '0', '7365.61', '-62.5754', '778.928', '3.05011', '4725:0 4727:0 4731:0 '),\n('4727', 'sp995', '571', '67', '4424', '76', '80', '0', '7426.39', '97.7694', '770.976', '6.19485', '4726:0 4728:0 '),\n('4728', 'sp996', '571', '67', '4499', '76', '80', '0', '7491.52', '288.222', '774.525', '2.91503', '4727:0 4729:0 '),\n('4729', 'sp997', '571', '67', '4424', '76', '80', '0', '7352.12', '248.002', '774.191', '5.46442', '4728:0 4730:0 '),\n('4730', 'sp998', '571', '67', '4424', '76', '80', '0', '7358.47', '144.777', '783.476', '4.25726', '4729:0 4731:0 '),\n('4731', 'sp999', '571', '67', '4424', '76', '80', '0', '7260.89', '6.23937', '773.777', '4.18657', '4730:0 4726:0 4732:0 '),\n('4732', 'sp1000', '571', '67', '4424', '76', '80', '0', '7178.24', '-109.916', '772.616', '4.20384', '4731:0 4733:0 4736:0 '),\n('4733', 'sp1001', '571', '67', '4452', '76', '80', '0', '7066.53', '-147.905', '785.381', '3.57396', '4732:0 4734:0 '),\n('4734', 'sp1002', '571', '67', '4453', '76', '80', '0', '6959.39', '-173.873', '763.88', '2.97313', '4733:0 4735:0 '),\n('4735', 'sp1003', '571', '67', '4453', '76', '80', '0', '6782.97', '-67.7557', '738.941', '2.11233', '4734:0 '),\n('4736', 'sp1004', '571', '67', '4452', '76', '80', '0', '7090.4', '-308.701', '774.099', '4.51251', '4732:0 '),\n('4737', 'sp1005', '571', '67', '67', '76', '80', '0', '8123.18', '-622.333', '945.418', '5.51782', '4712:0 4738:0 '),\n('4738', 'sp1006', '571', '67', '4446', '76', '80', '0', '8249.28', '-737.261', '923.975', '5.57986', '4737:0 4739:0 '),\n('4739', 'sp1007', '571', '67', '4446', '76', '80', '0', '8264.89', '-900.437', '923.875', '2.77599', '4738:0 4740:0 4742:0 '),\n('4740', 'sp1008', '571', '67', '4485', '76', '80', '0', '8140.52', '-817.38', '956.118', '4.95861', '4739:0 4741:0 '),\n('4741', 'sp1009', '571', '67', '4485', '76', '80', '0', '8148.76', '-940.656', '956.955', '0.816413', '4740:0 '),\n('4742', 'sp1010', '571', '67', '4446', '76', '80', '0', '8178.94', '-1015.84', '926.187', '5.46676', '4739:0 4743:0 '),\n('4743', 'sp1011', '571', '67', '4446', '76', '80', '0', '8330.55', '-1186.57', '924.477', '5.49032', '4742:0 '),\n('4744', 'sp1012', '571', '67', '4441', '76', '80', '4', '7798.27', '-2842.24', '1219.51', '2.4704', '4745:0 4746:0 '),\n('4745', 'sp1013', '571', '67', '4441', '76', '80', '5', '7804.98', '-2945.31', '1256.79', '1.43524', '4744:0 '),\n('4746', 'sp1014', '571', '67', '4441', '76', '80', '0', '7866.14', '-2800.43', '1136.14', '2.6746', '4744:0 4747:0 4762:0 '),\n('4747', 'sp1015', '571', '67', '4444', '76', '80', '0', '7974.26', '-2941.67', '1137.82', '0.286989', '4746:0 4748:0 '),\n('4748', 'sp1016', '571', '67', '4444', '76', '80', '0', '8053.32', '-2899.02', '1136.35', '5.48632', '4747:0 4749:0 4753:0 '),\n('4749', 'sp1017', '571', '67', '67', '76', '80', '0', '8303.1', '-2938.59', '1067.71', '2.65574', '4748:0 4750:0 '),\n('4750', 'sp1018', '571', '67', '4488', '76', '80', '0', '8126.19', '-2813.7', '1044.76', '1.21375', '4749:0 4751:0 4752:0 '),\n('4751', 'sp1019', '571', '67', '4488', '76', '80', '0', '8235.54', '-2730.69', '1035.47', '6.08244', '4750:0 4752:0 '),\n('4752', 'sp1020', '571', '67', '4488', '76', '80', '0', '8268.8', '-2840.55', '1051.57', '2.98168', '4751:0 4750:0 '),\n('4753', 'sp1021', '571', '67', '4444', '76', '80', '0', '8178.4', '-2765.96', '1137.8', '1.58369', '4748:0 4754:0 '),\n('4754', 'sp1022', '571', '67', '4444', '76', '80', '0', '8192.81', '-2569.46', '1145.92', '1.28524', '4753:0 4755:0 4761:0 '),\n('4755', 'sp1023', '571', '67', '4446', '76', '80', '0', '8213.34', '-2399.15', '1136.06', '1.39441', '4754:0 4756:0 '),\n('4756', 'sp1024', '571', '67', '4446', '76', '80', '0', '8146.87', '-2304.3', '1157.9', '3.14664', '4755:0 4757:0 4758:0 '),\n('4757', 'sp1025', '571', '67', '4446', '76', '80', '0', '8041.79', '-2401.8', '1157.91', '1.83659', '4756:0 4758:0 4759:0 '),\n('4758', 'sp1026', '571', '67', '4446', '76', '80', '0', '7981.22', '-2241.64', '1157.87', '2.17589', '4757:0 4756:0 '),\n('4759', 'sp1027', '571', '67', '4446', '76', '80', '0', '7920.25', '-2449.09', '1137.97', '1.81145', '4757:0 4760:0 4763:0 '),\n('4760', 'sp1028', '571', '67', '4444', '76', '80', '0', '7924.11', '-2571.76', '1159.29', '2.58976', '4759:0 4761:0 '),\n('4761', 'sp1029', '571', '67', '4444', '76', '80', '0', '8046.59', '-2635.79', '1135.01', '6.18452', '4760:0 4754:0 4762:0 '),\n('4762', 'sp1030', '571', '67', '4463', '76', '80', '0', '7915.54', '-2719.76', '1135.12', '3.80869', '4761:0 4746:0 '),\n('4763', 'sp1031', '571', '67', '4446', '76', '80', '0', '7902.91', '-2332.91', '1153.05', '3.63118', '4759:0 4764:0 '),\n('4764', 'sp1032', '571', '67', '4442', '76', '80', '0', '7759.44', '-2386.38', '1077.61', '2.84264', '4763:0 4765:0 '),\n('4765', 'sp1033', '571', '67', '4442', '76', '80', '0', '7670.97', '-2282.57', '1010.94', '2.45387', '4764:0 4766:0 '),\n('4766', 'sp1034', '571', '67', '4442', '76', '80', '0', '7541.71', '-2363.06', '867.728', '2.12164', '4765:0 4767:0 '),\n('4767', 'sp1035', '571', '67', '4442', '76', '80', '0', '7465.67', '-2485.65', '760.441', '0.00970542', '4766:0 4768:0 4781:0 '),\n('4768', 'sp1036', '571', '67', '4438', '76', '80', '0', '7327.84', '-2537.89', '748.903', '4.00974', '4767:0 4769:0 4781:0 '),\n('4769', 'sp1037', '571', '67', '4438', '76', '80', '0', '7348.8', '-2768.24', '766.138', '4.91922', '4768:0 4770:0 '),\n('4770', 'sp1038', '571', '67', '4438', '76', '80', '0', '7348.82', '-2958.97', '838.738', '4.70872', '4769:0 4771:0 4780:0 '),\n('4771', 'sp1039', '571', '67', '4439', '76', '80', '0', '7229.61', '-3136.68', '837.486', '4.08826', '4770:0 4772:0 4780:0 '),\n('4772', 'sp1040', '571', '67', '4495', '76', '80', '0', '7202.51', '-3334.74', '843.826', '4.6883', '4771:0 4773:0 '),\n('4773', 'sp1041', '571', '67', '4439', '76', '80', '0', '7368.35', '-3244.03', '851.789', '5.98892', '4772:0 4774:0 '),\n('4774', 'sp1042', '571', '67', '4439', '76', '80', '0', '7555.15', '-3237.78', '842.017', '0.160478', '4773:0 4775:0 '),\n('4775', 'sp1043', '571', '67', '4440', '76', '80', '0', '7723.64', '-3278.88', '863.372', '5.73209', '4774:0 4776:0 '),\n('4776', 'sp1044', '571', '67', '4440', '76', '80', '0', '7843.39', '-3412.02', '865.974', '6.25831', '4775:0 4777:0 '),\n('4777', 'sp1045', '571', '67', '4440', '76', '80', '0', '8007.01', '-3282.63', '865.574', '2.51589', '4776:0 4778:0 '),\n('4778', 'sp1046', '571', '67', '4440', '76', '80', '0', '7854.16', '-3160.4', '864.749', '3.02718', '4777:0 4779:0 '),\n('4779', 'sp1047', '571', '67', '4440', '76', '80', '0', '7635.61', '-3117.6', '867.091', '3.3971', '4778:0 4780:0 '),\n('4780', 'sp1048', '571', '67', '4439', '76', '80', '0', '7437.01', '-3083.87', '837.452', '2.68239', '4779:0 4770:0 4771:0 '),\n('4781', 'sp1049', '571', '67', '4437', '76', '80', '0', '7293.97', '-2399.5', '753.5', '6.25517', '4768:0 4767:0 4782:0 '),\n('4782', 'sp1050', '571', '67', '4437', '76', '80', '0', '7210.78', '-2258.23', '756.519', '2.1766', '4781:0 4783:0 '),\n('4783', 'sp1051', '571', '67', '4437', '76', '80', '0', '7094.38', '-2114.84', '759.283', '2.32896', '4782:0 4784:0 '),\n('4784', 'sp1052', '571', '67', '4437', '76', '80', '0', '7071.57', '-1957.32', '769.29', '1.71086', '4783:0 4785:0 '),\n('4785', 'sp1053', '571', '67', '4422', '76', '80', '0', '7047.94', '-1819.05', '822.822', '1.51843', '4784:0 4786:0 '),\n('4786', 'sp1054', '571', '67', '4422', '76', '80', '0', '7016.16', '-1682.12', '819.647', '1.56948', '4785:0 4787:0 4788:0 4795:0 '),\n('4787', 'sp1055', '571', '67', '4422', '76', '80', '0', '6952.92', '-1523.53', '837.796', '1.58755', '4786:0 4788:0 4789:0 '),\n('4788', 'sp1056', '571', '67', '4422', '76', '80', '0', '6876.88', '-1688.13', '820.475', '5.87424', '4787:0 4786:0 '),\n('4789', 'sp1057', '571', '67', '4425', '76', '80', '0', '6933.96', '-1355.59', '831.143', '1.62444', '4787:0 4790:0 '),\n('4790', 'sp1058', '571', '67', '4425', '76', '80', '0', '6927.88', '-1275.08', '819.873', '1.80979', '4789:0 4791:0 '),\n('4791', 'sp1059', '571', '67', '4423', '76', '80', '0', '6891.54', '-1120.83', '801.801', '2.04934', '4790:0 4792:0 4794:0 '),\n('4792', 'sp1060', '571', '67', '4423', '76', '80', '0', '6874.8', '-994.702', '800.05', '1.94645', '4791:0 4793:0 '),\n('4793', 'sp1061', '571', '67', '4423', '76', '80', '0', '6713.98', '-1032.73', '766.307', '5.25848', '4792:0 4794:0 '),\n('4794', 'sp1062', '571', '67', '4423', '76', '80', '0', '6823.44', '-1136.74', '794.362', '1.42024', '4793:0 4791:0 '),\n('4795', 'sp1063', '571', '67', '4422', '76', '80', '0', '7059.17', '-1565.01', '830.127', '1.02674', '4786:0 4796:0 '),\n('4796', 'sp1064', '571', '67', '4432', '76', '80', '1', '7107.06', '-1444.92', '924.841', '0.0175042', '4795:0 4797:0 4808:0 '),\n('4797', 'sp1065', '571', '67', '4432', '76', '80', '0', '7224.43', '-1369.92', '917.332', '1.04952', '4796:0 4798:0 '),\n('4798', 'sp1066', '571', '67', '4432', '76', '80', '0', '7304.81', '-1229.95', '912.257', '1.04952', '4797:0 4799:0 '),\n('4799', 'sp1067', '571', '67', '4473', '76', '80', '0', '7277.74', '-1094.09', '938.898', '4.08901', '4798:0 4800:0 4801:0 '),\n('4800', 'sp1068', '571', '67', '4473', '76', '80', '0', '7159.16', '-1203.13', '929.255', '3.39314', '4799:0 '),\n('4801', 'sp1069', '571', '67', '4432', '76', '80', '0', '7276.68', '-952.788', '919.235', '1.31654', '4799:0 4802:0 '),\n('4802', 'sp1070', '571', '67', '4432', '76', '80', '0', '7442.11', '-871.692', '910.159', '0.46203', '4801:0 4803:0 '),\n('4803', 'sp1071', '571', '67', '4432', '76', '80', '0', '7617.15', '-899.183', '911.902', '5.67158', '4802:0 4804:0 '),\n('4804', 'sp1072', '571', '67', '4432', '76', '80', '0', '7731.32', '-1040.44', '920.428', '5.0087', '4803:0 4805:0 '),\n('4805', 'sp1073', '571', '67', '4432', '76', '80', '0', '7620.47', '-1211.71', '928.587', '4.24765', '4804:0 4806:0 '),\n('4806', 'sp1074', '571', '67', '4432', '76', '80', '0', '7523.4', '-1365.25', '935.317', '3.55807', '4805:0 4807:0 '),\n('4807', 'sp1075', '571', '67', '4432', '76', '80', '0', '7392.6', '-1463.43', '928.011', '4.00967', '4806:0 4808:0 '),\n('4808', 'sp1076', '571', '67', '4536', '76', '80', '0', '7307.54', '-1573.81', '942.399', '2.34934', '4807:0 4796:0 '),\n('4809', 'cs1077', '571', '2817', '2817', '76', '80', '0', '5850.58', '-134.972', '227.342', '6.13811', '4579:0 4810:0 '),\n('4810', 'ic1078', '571', '210', '4501', '77', '80', '0', '5971.83', '-162.754', '303.817', '0.106256', '4809:0 4811:0 '),\n('4811', 'ic1079', '571', '210', '4501', '77', '80', '1', '6141.12', '-52.066', '381.591', '0.738502', '4810:0 4812:0 '),\n('4812', 'ic1080', '571', '210', '4501', '77', '80', '0', '6194.51', '34.1853', '380.232', '0.656035', '4811:0 4813:0 4815:0 '),\n('4813', 'ic1081', '571', '210', '4504', '77', '80', '0', '6172.36', '156.629', '374.276', '0.907363', '4812:0 4814:0 '),\n('4814', 'ic1082', '571', '210', '4504', '77', '80', '0', '6379.33', '179.484', '392.956', '0.48639', '4813:0 4815:0 4816:0 '),\n('4815', 'ic1083', '571', '210', '4501', '77', '80', '0', '6302.14', '95.8391', '390.823', '3.94214', '4814:0 4812:0 '),\n('4816', 'ic1084', '571', '210', '4505', '77', '80', '0', '6510.94', '285.541', '400.181', '0.224064', '4814:0 4817:0 '),\n('4817', 'ic1085', '571', '210', '4505', '77', '80', '0', '6561.12', '378.976', '420.028', '1.01575', '4816:0 4818:0 4819:0 '),\n('4818', 'ic1086', '571', '210', '4506', '77', '80', '0', '6586.56', '556.561', '402.946', '1.2011', '4817:0 4819:0 4820:0 '),\n('4819', 'ic1087', '571', '210', '4506', '77', '80', '0', '6708.22', '403.424', '412.114', '3.63504', '4818:0 4817:0 4824:0 '),\n('4820', 'ic1088', '571', '210', '4506', '77', '80', '0', '6723.06', '690.867', '407.835', '0.367783', '4818:0 4821:0 4851:0 '),\n('4821', 'ic1089', '571', '210', '4506', '77', '80', '0', '6907.33', '730.085', '420.328', '0.313591', '4820:0 4822:0 4846:0 '),\n('4822', 'ic1090', '571', '210', '4506', '77', '80', '0', '6968.03', '622.605', '462.269', '4.11884', '4821:0 4823:0 4825:0 '),\n('4823', 'ic1091', '571', '210', '4506', '77', '80', '0', '6892.8', '465.906', '471.697', '4.29869', '4822:0 '),\n('4824', 'ic1092', '571', '210', '4506', '77', '80', '0', '6802.58', '551.703', '425.103', '0.960751', '4819:0 '),\n('4825', 'ic1093', '571', '210', '4506', '77', '80', '0', '7175.08', '588.447', '498.301', '5.6747', '4822:0 4826:0 4827:0 '),\n('4826', 'ic1094', '571', '210', '4506', '77', '80', '0', '7078.72', '503.754', '527.049', '0.380329', '4825:0 '),\n('4827', 'ic1095', '571', '210', '4593', '77', '80', '0', '7262.77', '707.458', '487.068', '0.969396', '4825:0 4828:0 '),\n('4828', 'ic1096', '571', '210', '210', '77', '80', '0', '7380.79', '847.639', '456.611', '1.04794', '4827:0 4829:0 '),\n('4829', 'ic1097', '571', '210', '4533', '77', '80', '0', '7556.82', '768.81', '478.284', '6.18915', '4828:0 4830:0 4831:0 '),\n('4830', 'ic1098', '571', '210', '4533', '77', '80', '0', '7584.83', '947.602', '480.255', '1.08485', '4829:0 4831:0 '),\n('4831', 'ic1099', '571', '210', '4533', '77', '80', '0', '7712.14', '808.936', '478.443', '2.68156', '4830:0 4829:0 4832:0 '),\n('4832', 'ic1100', '571', '210', '4533', '77', '80', '0', '7860.07', '894.491', '452.788', '0.0928901', '4831:0 4833:0 4842:0 4845:0 '),\n('4833', 'ic1101', '571', '210', '4533', '77', '80', '0', '8034.56', '793.581', '473.244', '0.0151296', '4832:0 4834:0 '),\n('4834', 'ic1102', '571', '210', '4658', '77', '80', '0', '8220.62', '796.211', '504.283', '0.00650024', '4833:0 4835:0 '),\n('4835', 'ic1103', '571', '210', '4658', '77', '80', '0', '8374.24', '796.938', '547.919', '6.10983', '4834:0 4836:0 4841:0 '),\n('4836', 'ic1104', '571', '210', '4669', '77', '80', '0', '8423.03', '930.654', '544.674', '1.16574', '4835:0 4837:0 '),\n('4837', 'ic1105', '571', '210', '4658', '77', '80', '1', '8522.2', '1039.69', '548.104', '0.757338', '4836:0 4838:0 '),\n('4838', 'ic1106', '571', '210', '4658', '77', '80', '0', '8609.95', '905.31', '545.094', '5.03776', '4837:0 4839:0 '),\n('4839', 'ic1107', '571', '210', '4658', '77', '80', '3', '8585.78', '716.794', '547.469', '4.14555', '4838:0 4840:0 '),\n('4840', 'ic1108', '571', '210', '4658', '77', '80', '0', '8489.61', '581.224', '559.708', '4.17226', '4839:0 4841:0 '),\n('4841', 'ic1109', '571', '210', '4658', '77', '80', '5', '8440.59', '706.692', '547.293', '2.35563', '4840:0 4835:0 '),\n('4842', 'ic1110', '571', '210', '4533', '77', '80', '0', '7765.83', '995.585', '447.266', '2.83001', '4832:0 4843:0 '),\n('4843', 'ic1111', '571', '210', '4533', '77', '80', '0', '7711.5', '1167.13', '440.596', '0.808391', '4842:0 4844:0 '),\n('4844', 'ic1112', '571', '210', '4533', '77', '80', '0', '7859.21', '1231.56', '441.972', '0.590053', '4843:0 4845:0 4875:0 '),\n('4845', 'ic1113', '571', '210', '4533', '77', '80', '0', '7895.54', '1042.03', '450.717', '4.64349', '4844:0 4832:0 '),\n('4846', 'ic1114', '571', '210', '4508', '77', '80', '0', '6955.49', '874.331', '402.675', '1.29769', '4821:0 4847:0 '),\n('4847', 'ic1115', '571', '210', '4508', '77', '80', '0', '7020.59', '1065.06', '402.857', '1.32832', '4846:0 4848:0 '),\n('4848', 'ic1116', '571', '210', '4508', '77', '80', '0', '6957.22', '1339.68', '398.602', '1.97863', '4847:0 4849:0 '),\n('4849', 'ic1117', '571', '210', '4508', '77', '80', '0', '6833.49', '1460.28', '390.712', '1.81761', '4848:0 4850:0 '),\n('4850', 'ic1118', '571', '210', '210', '77', '80', '0', '6826.51', '1619.37', '389.033', '4.69297', '4849:0 '),\n('4851', 'ic1119', '571', '210', '4507', '77', '80', '0', '6666.86', '830.852', '365.983', '2.48285', '4820:0 4852:0 '),\n('4852', 'ic1120', '571', '210', '4507', '77', '80', '0', '6599.05', '917.605', '308.63', '2.05873', '4851:0 4853:0 '),\n('4853', 'ic1121', '571', '210', '4507', '77', '80', '0', '6597.42', '1025.81', '280.105', '1.11625', '4852:0 4854:0 4858:0 '),\n('4854', 'ic1122', '571', '210', '4507', '77', '80', '0', '6559.27', '1194.84', '276.689', '2.19853', '4853:0 4855:0 '),\n('4855', 'ic1123', '571', '210', '4507', '77', '80', '0', '6688.4', '1234.6', '276.432', '6.14281', '4854:0 4856:0 '),\n('4856', 'ic1124', '571', '210', '4507', '77', '80', '0', '6863.13', '1227.79', '282.996', '5.66451', '4855:0 4857:0 4859:0 '),\n('4857', 'ic1125', '571', '210', '4507', '77', '80', '0', '6896.72', '1042.62', '305.673', '4.53274', '4856:0 4858:0 4859:0 '),\n('4858', 'ic1126', '571', '210', '4507', '77', '80', '0', '6726.14', '1037', '288.797', '3.31459', '4857:0 4853:0 '),\n('4859', 'ic1127', '571', '210', '4508', '77', '80', '0', '7001.55', '1212.52', '307.249', '0.331647', '4857:0 4856:0 4860:0 4861:0 '),\n('4860', 'ic1128', '571', '210', '4537', '77', '80', '0', '7135.37', '1189.66', '298.703', '5.1862', '4859:0 4869:0 '),\n('4861', 'ic1129', '571', '210', '4508', '77', '80', '0', '7048.99', '1354.24', '304.707', '4.93802', '4859:0 4862:0 '),\n('4862', 'ic1130', '571', '210', '4537', '77', '80', '0', '7186.05', '1411.54', '315.97', '0.428269', '4861:0 4863:0 4957:0 '),\n('4863', 'ic1131', '571', '210', '4537', '77', '80', '0', '7349.91', '1448.05', '320.323', '0.242915', '4862:0 4864:0 4957:0 '),\n('4864', 'ic1132', '571', '210', '4537', '77', '80', '0', '7474.88', '1490.17', '330.932', '0.611267', '4863:0 4865:0 '),\n('4865', 'ic1133', '571', '210', '4537', '77', '80', '0', '7573.73', '1609.11', '345.106', '1.19325', '4864:0 4866:0 4870:0 '),\n('4866', 'ic1134', '571', '210', '4537', '77', '80', '0', '7721.75', '1522.15', '349.093', '5.66688', '4865:0 4867:0 4874:0 '),\n('4867', 'ic1135', '571', '210', '4537', '77', '80', '0', '7720.3', '1336.02', '354.115', '4.43774', '4866:0 4868:0 4876:0 '),\n('4868', 'ic1136', '571', '210', '4537', '77', '80', '0', '7534.59', '1265.76', '334.056', '2.73578', '4867:0 4869:0 '),\n('4869', 'ic1137', '571', '210', '4537', '77', '80', '0', '7314', '1220.63', '315.76', '3.35624', '4868:0 4860:0 '),\n('4870', 'ic1138', '571', '210', '4509', '77', '80', '0', '7577.1', '1786.78', '359.583', '1.47521', '4865:0 4871:0 '),\n('4871', 'ic1139', '571', '210', '4509', '77', '80', '0', '7669.29', '1945.97', '367.174', '1.15084', '4870:0 4872:0 4881:0 '),\n('4872', 'ic1140', '571', '210', '4509', '77', '80', '0', '7873.9', '1929.78', '365.964', '6.20016', '4871:0 4873:0 4877:0 '),\n('4873', 'ic1141', '571', '210', '4509', '77', '80', '0', '7887.76', '1725.17', '368.82', '4.09059', '4872:0 4874:0 '),\n('4874', 'ic1142', '571', '210', '4509', '77', '80', '0', '7765', '1638.88', '350.579', '4.75974', '4873:0 4866:0 '),\n('4875', 'ic1143', '571', '210', '210', '77', '80', '0', '7920.44', '1374.41', '452.53', '1.61423', '4844:0 4876:0 '),\n('4876', 'ic1144', '571', '210', '4537', '77', '80', '0', '7822.59', '1365.97', '388.481', '3.40023', '4875:0 4867:0 '),\n('4877', 'ic1145', '571', '210', '4510', '77', '80', '0', '7809.24', '2060.92', '392.033', '1.58203', '4872:0 4878:0 '),\n('4878', 'ic1146', '571', '210', '4540', '77', '80', '0', '7858.11', '2248.57', '376.618', '1.4603', '4877:0 4879:0 '),\n('4879', 'ic1147', '571', '210', '4540', '77', '80', '0', '7823.2', '2412.9', '388.323', '1.80744', '4878:0 4880:0 '),\n('4880', 'ic1148', '571', '210', '4540', '77', '80', '0', '7793.72', '2597.47', '402.105', '1.67392', '4879:0 4892:0 '),\n('4881', 'ic1149', '571', '210', '4510', '77', '80', '0', '7699.75', '2069.29', '391.653', '1.65822', '4871:0 4882:0 '),\n('4882', 'ic1150', '571', '210', '4540', '77', '80', '0', '7652.21', '2249.08', '368.676', '2.35408', '4881:0 4883:0 '),\n('4883', 'ic1151', '571', '210', '4540', '77', '80', '0', '7521.07', '2342.93', '375.359', '2.52294', '4882:0 4884:0 '),\n('4884', 'ic1152', '571', '210', '4523', '77', '80', '0', '7369.4', '2442.13', '391.045', '2.44441', '4883:0 4885:0 4893:0 '),\n('4885', 'ic1153', '571', '210', '4523', '77', '80', '0', '7198.45', '2497.03', '404.398', '2.97341', '4884:0 4886:0 4893:0 '),\n('4886', 'ic1154', '571', '210', '4523', '77', '80', '0', '7035.47', '2497.06', '410.594', '3.37789', '4885:0 4887:0 '),\n('4887', 'ic1155', '571', '210', '4523', '77', '80', '0', '7014.72', '2665.38', '400.29', '1.87621', '4886:0 4888:0 '),\n('4888', 'ic1156', '571', '210', '4523', '77', '80', '0', '7013.48', '2866.37', '424.885', '1.59347', '4887:0 4889:0 '),\n('4889', 'ic1157', '571', '210', '4523', '77', '80', '0', '7165.04', '2990.37', '441.491', '6.14878', '4888:0 4890:0 '),\n('4890', 'ic1158', '571', '210', '4523', '77', '80', '0', '7332.14', '2917.95', '423.697', '5.78906', '4889:0 4891:0 4893:0 4894:0 '),\n('4891', 'ic1159', '571', '210', '4540', '77', '80', '0', '7502.18', '2817.76', '419.764', '5.68225', '4890:0 4892:0 4893:0 '),\n('4892', 'ic1160', '571', '210', '4516', '77', '80', '0', '7710.23', '2726.49', '412.219', '5.21495', '4891:0 4880:0 4963:0 '),\n('4893', 'ic1161', '571', '210', '4523', '77', '80', '0', '7307.93', '2711.18', '396.859', '4.63376', '4891:0 4884:0 4885:0 4890:0 '),\n('4894', 'ic1162', '571', '210', '210', '77', '80', '0', '7358.64', '3080.68', '476.932', '1.77884', '4890:0 4895:0 '),\n('4895', 'ic1163', '571', '210', '210', '77', '80', '0', '7199', '3207.31', '545.531', '1.97125', '4894:0 4896:0 '),\n('4896', 'ic1164', '571', '210', '210', '77', '80', '0', '7139.56', '3362.03', '669.633', '2.10878', '4895:0 4897:0 '),\n('4897', 'ic1165', '571', '210', '4531', '77', '80', '0', '6985.22', '3466.47', '708.57', '2.8337', '4896:0 4898:0 4928:0 '),\n('4898', 'ic1166', '571', '210', '4531', '77', '80', '0', '6890.27', '3530.05', '708.606', '5.39253', '4897:0 4899:0 '),\n('4899', 'ic1167', '571', '210', '4531', '77', '80', '0', '6830.55', '3590.9', '740.056', '5.22131', '4898:0 4900:0 '),\n('4900', 'ic1168', '571', '210', '4496', '77', '80', '0', '6868.76', '3731.57', '755.294', '4.54431', '4899:0 4901:0 '),\n('4901', 'ic1169', '571', '210', '4496', '77', '80', '0', '7002.18', '3880.5', '610.484', '1.63677', '4900:0 4902:0 4903:0 4905:0 '),\n('4902', 'ic1170', '571', '210', '4496', '77', '80', '0', '6831.56', '3987.86', '615.968', '2.45046', '4901:0 4903:0 '),\n('4903', 'ic1171', '571', '210', '4496', '77', '80', '0', '6897.56', '3919.65', '615.975', '4.57026', '4902:0 4901:0 4904:0 '),\n('4904', 'ic1172', '571', '210', '4528', '77', '80', '0', '6814.18', '3788.63', '621.07', '1.05954', '4903:0 '),\n('4905', 'ic1173', '571', '210', '4496', '77', '80', '0', '7138.52', '3955.81', '581.785', '5.65333', '4901:0 4906:0 4974:0 4976:0 '),\n('4906', 'ic1174', '571', '210', '4498', '77', '80', '0', '7284.9', '3836.51', '604.369', '5.59993', '4905:0 4907:0 '),\n('4907', 'ic1175', '571', '210', '4498', '77', '80', '0', '7410.57', '3732.09', '627.678', '5.65962', '4906:0 4908:0 '),\n('4908', 'ic1176', '571', '210', '4526', '77', '80', '0', '7512.15', '3660.34', '623.332', '6.01697', '4907:0 4909:0 4927:0 '),\n('4909', 'ic1177', '571', '210', '4526', '77', '80', '0', '7593.36', '3544.42', '655.937', '5.07214', '4908:0 4910:0 '),\n('4910', 'ic1178', '571', '210', '4526', '77', '80', '0', '7671', '3432.93', '656.192', '2.35151', '4909:0 4911:0 '),\n('4911', 'ic1179', '571', '210', '4526', '77', '80', '0', '7795.77', '3500.91', '658.351', '0.992774', '4910:0 4912:0 4913:0 4925:0 '),\n('4912', 'ic1180', '571', '210', '4526', '77', '80', '0', '7883.18', '3469.31', '671.838', '6.04917', '4911:0 '),\n('4913', 'ic1181', '571', '210', '4526', '77', '80', '0', '7919.33', '3582.64', '631.477', '0.58594', '4911:0 4914:0 '),\n('4914', 'ic1182', '571', '210', '4524', '77', '80', '0', '8041.43', '3526.53', '654.716', '6.08922', '4913:0 4915:0 4922:0 '),\n('4915', 'ic1183', '571', '210', '4524', '77', '80', '0', '8187.82', '3610.43', '658.019', '0.290628', '4914:0 4916:0 '),\n('4916', 'ic1184', '571', '210', '4524', '77', '80', '0', '8317.43', '3535.48', '657.912', '4.87265', '4915:0 4917:0 '),\n('4917', 'ic1185', '571', '210', '4524', '77', '80', '0', '8248.7', '3338.48', '654.291', '5.09882', '4916:0 4918:0 4922:0 '),\n('4918', 'ic1186', '571', '210', '4496', '77', '80', '0', '8311.26', '3170.17', '618.951', '5.16165', '4917:0 4919:0 '),\n('4919', 'ic1187', '571', '210', '4497', '77', '80', '0', '8430.96', '3102.38', '588.141', '4.91819', '4918:0 4920:0 '),\n('4920', 'ic1188', '571', '210', '4492', '77', '80', '0', '8426.9', '2947.18', '602.293', '4.77996', '4919:0 4921:0 '),\n('4921', 'ic1189', '571', '210', '4492', '77', '80', '0', '8429.04', '2879.47', '606.259', '1.76717', '4920:0 '),\n('4922', 'ic1190', '571', '210', '4524', '77', '80', '0', '8105.02', '3418.73', '672.247', '3.83984', '4914:0 4917:0 4923:0 '),\n('4923', 'ic1191', '571', '210', '4525', '77', '80', '0', '7990.63', '3300.15', '676.112', '3.81628', '4922:0 4924:0 '),\n('4924', 'ic1192', '571', '210', '4525', '77', '80', '0', '7944.78', '3251.88', '632.818', '3.79665', '4923:0 '),\n('4925', 'ic1193', '571', '210', '4526', '77', '80', '0', '7848.54', '3632.5', '653.393', '4.16107', '4911:0 4926:0 '),\n('4926', 'ic1194', '571', '210', '4526', '77', '80', '0', '7717.96', '3673.53', '653.297', '3.444', '4925:0 4927:0 '),\n('4927', 'ic1195', '571', '210', '4526', '77', '80', '0', '7617.43', '3670.12', '634.89', '3.02774', '4926:0 4908:0 '),\n('4928', 'ic1196', '571', '210', '4531', '77', '80', '0', '6853.09', '3478.09', '692.779', '3.04894', '4897:0 4929:0 4930:0 4931:0 '),\n('4929', 'ic1197', '571', '210', '4531', '77', '80', '0', '6714.63', '3539.45', '668.964', '2.71907', '4928:0 4931:0 '),\n('4930', 'ic1198', '571', '210', '4531', '77', '80', '0', '6719.14', '3429.9', '682.197', '3.43144', '4928:0 4931:0 4978:0 '),\n('4931', 'ic1199', '571', '210', '4531', '77', '80', '0', '6774.33', '3483.53', '672.159', '3.05053', '4928:0 4930:0 4929:0 4932:0 '),\n('4932', 'ic1200', '571', '210', '4531', '77', '80', '0', '6549.04', '3449.66', '598.005', '3.34505', '4931:0 4933:0 '),\n('4933', 'ic1201', '571', '210', '4531', '77', '80', '0', '6461.08', '3286.15', '631.506', '5.01716', '4932:0 4934:0 '),\n('4934', 'ic1202', '571', '210', '4531', '77', '80', '0', '6452.51', '3119.45', '657.481', '1.45066', '4933:0 4935:0 '),\n('4935', 'ic1203', '571', '210', '4518', '77', '80', '0', '6526.9', '3000.14', '651.117', '4.87342', '4934:0 4936:0 '),\n('4936', 'ic1204', '571', '210', '4518', '77', '80', '0', '6547.7', '2810.28', '651.117', '4.72026', '4935:0 4937:0 '),\n('4937', 'ic1205', '571', '210', '4518', '77', '80', '0', '6524.74', '2581.76', '651.117', '4.51292', '4936:0 4938:0 '),\n('4938', 'ic1206', '571', '210', '4518', '77', '80', '0', '6630.74', '2328.4', '651.585', '5.06506', '4937:0 4939:0 '),\n('4939', 'ic1207', '571', '210', '4518', '77', '80', '0', '6619.16', '2134.02', '651.118', '4.86635', '4938:0 4940:0 '),\n('4940', 'ic1208', '571', '210', '4520', '77', '80', '0', '6609.61', '1940.41', '652.242', '3.77073', '4939:0 4941:0 4944:0 '),\n('4941', 'ic1209', '571', '210', '4520', '77', '80', '0', '6436.2', '1960.49', '631.376', '3.19739', '4940:0 4942:0 '),\n('4942', 'ic1210', '571', '210', '4520', '77', '80', '0', '6238.67', '1930.65', '631.948', '3.56731', '4941:0 4943:0 '),\n('4943', 'ic1211', '571', '210', '4520', '77', '80', '0', '6075.08', '1919.83', '632.648', '3.19032', '4942:0 '),\n('4944', 'ic1212', '571', '210', '4520', '77', '80', '0', '6546.79', '1812.75', '629.551', '4.65274', '4940:0 4945:0 4946:0 '),\n('4945', 'ic1213', '571', '210', '4520', '77', '80', '0', '6556.05', '1624.57', '633.228', '4.76113', '4944:0 4946:0 '),\n('4946', 'ic1214', '571', '210', '4520', '77', '80', '0', '6590.03', '1684.23', '628.876', '3.70395', '4945:0 4944:0 4947:0 '),\n('4947', 'ic1215', '571', '210', '4513', '77', '80', '0', '6728.5', '1651.46', '572.96', '1.13099', '4946:0 4948:0 '),\n('4948', 'ic1216', '571', '210', '4513', '77', '80', '0', '6809.4', '1726.92', '556.264', '3.80763', '4947:0 4949:0 4950:0 '),\n('4949', 'ic1217', '571', '210', '4513', '77', '80', '0', '6812.51', '1821.36', '578.354', '4.77131', '4948:0 '),\n('4950', 'ic1218', '571', '210', '4513', '77', '80', '0', '6952.4', '1697.92', '518.536', '2.9209', '4948:0 4951:0 '),\n('4951', 'ic1219', '571', '210', '4513', '77', '80', '0', '7031.52', '1779.42', '506.019', '1.12469', '4950:0 4952:0 4954:0 '),\n('4952', 'ic1220', '571', '210', '4514', '77', '80', '0', '7025.43', '1902.07', '528.077', '5.0187', '4951:0 4953:0 '),\n('4953', 'ic1221', '571', '210', '4514', '77', '80', '0', '6960.52', '2014.43', '520.864', '4.66919', '4952:0 '),\n('4954', 'ic1222', '571', '210', '4513', '77', '80', '0', '7201.98', '1696.05', '469.261', '2.30668', '4951:0 4955:0 4958:0 4959:0 '),\n('4955', 'ic1223', '571', '210', '210', '77', '80', '0', '7348.32', '1642.76', '429.984', '1.78832', '4954:0 4956:0 '),\n('4956', 'ic1224', '571', '210', '210', '77', '80', '0', '7214.66', '1585.03', '379.979', '5.44591', '4955:0 4957:0 '),\n('4957', 'ic1225', '571', '210', '4537', '77', '80', '0', '7281.16', '1492.2', '326.379', '1.64772', '4956:0 4863:0 4862:0 4958:0 '),\n('4958', 'ic1226', '571', '210', '210', '77', '80', '0', '7331.27', '1765.54', '456.844', '3.80914', '4957:0 4954:0 '),\n('4959', 'ic1227', '571', '210', '4513', '77', '80', '0', '7136.03', '1876.5', '532.96', '4.77911', '4954:0 4960:0 '),\n('4960', 'ic1228', '571', '210', '4513', '77', '80', '0', '7224.2', '1973.83', '570.931', '1.27072', '4959:0 4961:0 4962:0 '),\n('4961', 'ic1229', '571', '210', '4513', '77', '80', '1', '7242.67', '2168.33', '565.646', '4.69493', '4960:0 '),\n('4962', 'ic1230', '571', '210', '4513', '77', '80', '0', '7100.09', '2122.12', '621.203', '4.3801', '4960:0 '),\n('4963', 'ic1231', '571', '210', '4540', '77', '80', '0', '7682.15', '2851.03', '469.055', '2.77003', '4892:0 4964:0 '),\n('4964', 'ic1232', '571', '210', '4517', '77', '80', '0', '7685.31', '3002.19', '541.332', '0.921987', '4963:0 4965:0 '),\n('4965', 'ic1233', '571', '210', '4517', '77', '80', '0', '7702.82', '3078.43', '557.351', '5.63045', '4964:0 4966:0 4973:0 '),\n('4966', 'ic1234', '571', '210', '4517', '77', '80', '0', '7843.82', '2935.68', '517.933', '0.541764', '4965:0 4967:0 '),\n('4967', 'ic1235', '571', '210', '4517', '77', '80', '0', '7934.47', '2994.97', '541.057', '3.56948', '4966:0 4968:0 '),\n('4968', 'ic1236', '571', '210', '4517', '77', '80', '0', '8021.28', '2971.58', '563.405', '2.3317', '4967:0 4969:0 '),\n('4969', 'ic1237', '571', '210', '4517', '77', '80', '0', '8106.95', '2852.61', '559.292', '5.73169', '4968:0 4970:0 4979:0 '),\n('4970', 'ic1238', '571', '210', '4477', '77', '80', '0', '8243', '2776.54', '640.775', '6.08434', '4969:0 4971:0 '),\n('4971', 'ic1239', '571', '210', '4477', '77', '80', '0', '8383.84', '2730.79', '655.094', '5.79375', '4970:0 4972:0 '),\n('4972', 'ic1240', '571', '210', '4477', '77', '80', '1', '8508.77', '2673.5', '652.354', '5.83302', '4971:0 '),\n('4973', 'ic1241', '571', '210', '4517', '77', '80', '0', '7575.23', '3170.11', '577.394', '5.58719', '4965:0 '),\n('4974', 'ic1242', '571', '210', '4496', '77', '80', '0', '6971.39', '3981.75', '552.612', '5.94612', '4905:0 4975:0 '),\n('4975', 'ic1243', '571', '210', '4496', '77', '80', '0', '6934.59', '4194.33', '535.202', '1.79686', '4974:0 '),\n('4976', 'ic1244', '571', '210', '4496', '77', '80', '0', '7162.84', '4153.53', '633.939', '2.91213', '4905:0 4977:0 '),\n('4977', 'ic1245', '571', '210', '4496', '77', '80', '0', '7019.95', '4225.08', '665.892', '2.06625', '4976:0 '),\n('4978', 'ic1246', '571', '210', '4531', '77', '80', '0', '6545.08', '3321.6', '665.004', '4.0596', '4930:0 '),\n('4979', 'ic1247', '571', '210', '210', '77', '80', '0', '8061.74', '2755.35', '542.008', '4.48453', '4969:0 4980:0 '),\n('4980', 'ic1248', '571', '210', '210', '77', '80', '0', '8077.07', '2597.13', '519.549', '4.54375', '4979:0 4981:0 '),\n('4981', 'ic1249', '571', '210', '4510', '77', '80', '0', '8103.98', '2410.6', '490.587', '4.97494', '4980:0 4982:0 '),\n('4982', 'ic1250', '571', '210', '4510', '77', '80', '0', '8060.18', '2339.25', '484.62', '3.25413', '4981:0 4983:0 '),\n('4983', 'ic1251', '571', '210', '4510', '77', '80', '0', '7982.84', '2214.78', '500.312', '4.5092', '4982:0 4984:0 4985:0 '),\n('4984', 'ic1252', '571', '210', '4510', '77', '80', '0', '8163.01', '2189.09', '499.737', '3.33032', '4983:0 '),\n('4985', 'ic1253', '571', '210', '4510', '77', '80', '0', '7986.6', '2067', '499.729', '3.00752', '4983:0 4986:0 4989:0 '),\n('4986', 'ic1254', '571', '210', '4510', '77', '80', '0', '8120.19', '1962.29', '501.671', '5.88521', '4985:0 4987:0 '),\n('4987', 'ic1255', '571', '210', '4510', '77', '80', '0', '8204.78', '1874.81', '514.771', '1.36602', '4986:0 4988:0 '),\n('4988', 'ic1256', '571', '210', '4510', '77', '80', '0', '8179.12', '2049.72', '550.596', '2.65329', '4987:0 '),\n('4989', 'ic1257', '571', '210', '4510', '77', '80', '0', '7751.59', '2060.95', '499.864', '3.22507', '4985:0 4990:0 '),\n('4990', 'ic1258', '571', '210', '4510', '77', '80', '0', '7549.16', '2067.17', '500.312', '3.28947', '4989:0 4991:0 4992:0 '),\n('4991', 'ic1259', '571', '210', '4510', '77', '80', '0', '7438.58', '2146.13', '500.312', '2.65644', '4990:0 '),\n('4992', 'ic1260', '571', '210', '4510', '77', '80', '0', '7492.17', '1991.36', '500.301', '0.996881', '4990:0 '),\n('4993', 'WarsongGulchSpawnA1', '489', '3277', '4571', '10', '80', '251', '1535.77', '1481.37', '352.109', '0.188495', '4996:0 5020:0 '),\n('4994', 'WarsongGulchAInside1', '489', '3277', '3321', '10', '80', '0', '1479.77', '1456.5', '362.546', '6.24394', '4995:0 5020:0 5000:0 '),\n('4995', 'WarsongGulchAInside2', '489', '3277', '4571', '10', '80', '32', '1530.85', '1468.31', '362.665', '3.14825', '4993:0 '),\n('4996', 'WarsongGulchAInside3', '489', '3277', '3321', '10', '80', '0', '1471.13', '1454.77', '342.795', '6.27608', '4997:0 5001:0 4993:0 '),\n('4997', 'WarsongGulchAInside4', '489', '3277', '3321', '10', '80', '36', '1522.96', '1457.18', '373.688', '1.69647', '4995:0 '),\n('4998', 'WarsongGulchAInside5', '489', '3277', '3321', '10', '80', '34', '1397.56', '1566.08', '343.126', '4.09978', '5018:0 '),\n('4999', 'WarsongGulchAInside6', '489', '3277', '3321', '10', '80', '34', '1422.41', '1527.05', '342.47', '3.08073', '5017:0 '),\n('5000', 'WarsongGulchAInside7', '489', '3277', '3321', '10', '80', '0', '1398.06', '1394.26', '337.292', '3.63638', '5012:0 4994:0 5011:0 5013:0 5014:0 5022:0 '),\n('5001', 'WarsongGulchAInside8', '489', '3277', '3321', '10', '80', '0', '1350.63', '1462.19', '323.48', '6.23998', '4996:0 5011:0 5012:0 5013:0 5014:0 5022:0 '),\n('5002', 'WarsongGulchSpawnH1', '489', '3277', '4572', '10', '80', '253', '919.418', '1434.62', '345.695', '3.13216', '5005:0 5019:0 '),\n('5003', 'WarsongGulchHInside1', '489', '3277', '3320', '10', '80', '0', '974.016', '1460.64', '356.184', '6.0456', '5004:0 5009:0 5019:0 '),\n('5004', 'WarsongGulchHInside2', '489', '3277', '4572', '10', '80', '32', '925.907', '1451.62', '355.856', '5.79629', '5002:0 '),\n('5005', 'WarsongGulchHInside3', '489', '3277', '3320', '10', '80', '0', '983.244', '1461.02', '336.019', '0.412332', '5006:0 5002:0 5010:0 '),\n('5006', 'WarsongGulchHInside4', '489', '3277', '3320', '10', '80', '34', '931.587', '1460.23', '367.604', '1.31163', '5004:0 '),\n('5007', 'WarsongGulchHInside5', '489', '3277', '3320', '10', '80', '36', '1071.48', '1375.61', '339.77', '5.94986', '5016:0 '),\n('5008', 'WarsongGulchHInside6', '489', '3277', '3320', '10', '80', '36', '1056.79', '1399.58', '338.281', '6.09319', '5015:0 '),\n('5009', 'WarsongGulchHInside7', '489', '3277', '3320', '10', '80', '0', '1047.02', '1538', '333.504', '0.447699', '5013:0 5003:0 5011:0 5012:0 5014:0 5023:0 '),\n('5010', 'WarsongGulchHInside8', '489', '3277', '3320', '10', '80', '0', '1124.69', '1463.21', '315.869', '3.32571', '5005:0 5011:0 5012:0 5013:0 5014:0 5023:0 '),\n('5011', 'WarsongGulchMid1', '489', '3277', '3277', '10', '80', '0', '1236.54', '1542.18', '306.233', '4.86553', '5001:0 5010:0 5023:0 5009:0 '),\n('5012', 'WarsongGulchMid2', '489', '3277', '3277', '10', '80', '0', '1226.74', '1479.78', '307.286', '3.2221', '5001:0 5022:0 5010:0 5023:0 5009:0 '),\n('5013', 'WarsongGulchMid3', '489', '3277', '3277', '10', '80', '0', '1263.56', '1400.5', '310.369', '3.07681', '5000:0 5001:0 5022:0 5010:0 5023:0 '),\n('5014', 'WarsongGulchMid4', '489', '3277', '3277', '10', '80', '0', '1225.87', '1335.88', '312.589', '0.771655', '5000:0 5001:0 5022:0 5010:0 '),\n('5015', 'WarsongGulchCliffH1', '489', '3277', '3320', '10', '80', '36', '1069.83', '1398.92', '324.032', '3.19735', '5010:0 5012:0 5013:0 5014:0 5024:0 '),\n('5016', 'WarsongGulchCliffH2', '489', '3277', '3320', '10', '80', '36', '1081.68', '1369.7', '321.199', '2.78226', '5010:0 5012:0 5013:0 5014:0 5024:0 '),\n('5017', 'WarsongGulchCliffA1', '489', '3277', '3321', '10', '80', '34', '1406.26', '1532.45', '324.559', '6.09621', '5001:0 5011:0 5012:0 5013:0 5021:0 '),\n('5018', 'WarsongGulchCliffA2', '489', '3277', '3321', '10', '80', '34', '1385.08', '1571.34', '321.478', '5.74278', '5001:0 5011:0 5012:0 5013:0 5021:0 '),\n('5019', 'WarsongGulchHInside9', '489', '3277', '3320', '10', '80', '0', '956.507', '1421.77', '345.527', '2.11349', '5007:0 5008:0 5002:0 5003:0 '),\n('5020', 'WarsongGulchAInside9', '489', '3277', '3321', '10', '80', '0', '1500.52', '1493.83', '352.198', '4.62677', '4998:0 4999:0 4993:0 4994:0 '),\n('5021', 'WarsongGulchBuffNW', '489', '3277', '3277', '10', '80', '2048', '1318.7', '1550.35', '313.235', '2.83923', '5011:0 5012:0 5013:0 '),\n('5022', 'WarsongGulchBuffNE', '489', '3277', '3277', '10', '80', '4096', '1320.61', '1380.27', '314.891', '4.10568', '5000:0 5001:0 5012:0 5013:0 5014:0 '),\n('5023', 'WarsongGulchBuffSW', '489', '3277', '3277', '10', '80', '16384', '1138.3', '1558.94', '306.906', '0.653861', '5010:0 5011:0 5012:0 5013:0 5009:0 '),\n('5024', 'WarsongGulchBuffSE', '489', '3277', '3277', '10', '80', '8192', '1111.58', '1352.73', '316.565', '2.66841', '5012:0 5013:0 5014:0 '),\n('5025', 'ArathiBasinSpawnA', '529', '3358', '3417', '20', '80', '3', '1289.51', '1286.41', '-14.466', '3.89804', '5026:0 '),\n('5026', 'ArathiBasinStartA', '529', '3358', '3358', '20', '80', '0', '1241.32', '1228.52', '-40.2271', '4.12149', '5040:0 5027:0 '),\n('5027', 'ArathiBasinStables', '529', '3358', '3424', '20', '80', '128', '1168.45', '1204.15', '-56.582', '6.24992', '5026:0 5028:0 '),\n('5028', 'ArathiBasinStablesBridge', '529', '3358', '3358', '20', '80', '0', '1088.6', '1223.56', '-53.4783', '0.143443', '5029:0 5027:0 5032:0 '),\n('5029', 'ArathiBasinMillLow1', '529', '3358', '3358', '20', '80', '0', '988.277', '1179.75', '-50.2717', '5.04236', '5028:0 5030:0 5045:0 '),\n('5030', 'ArathiBasinMillLow2', '529', '3358', '3358', '20', '80', '0', '890.451', '1109.94', '-56.335', '4.04097', '5029:0 5031:0 '),\n('5031', 'ArathiBasinMillLow3', '529', '3358', '3358', '20', '80', '0', '845.513', '978.663', '-60.2139', '0.977914', '5030:0 5037:0 5044:0 '),\n('5032', 'ArathiBasinMillUp1', '529', '3358', '3358', '20', '80', '0', '939.139', '1227.33', '-23.8137', '3.6404', '5028:0 5033:0 '),\n('5033', 'ArathiBasinMill', '529', '3358', '3422', '20', '80', '136', '852.619', '1151.8', '11.5342', '0.752077', '5034:0 5032:0 '),\n('5034', 'ArathiBasinMillUp2', '529', '3358', '3422', '20', '80', '0', '783.565', '1047.78', '-26.1072', '1.57478', '5033:0 5037:0 '),\n('5035', 'ArathiBasinSpawnH', '529', '3358', '3418', '20', '80', '5', '704.074', '704.457', '-16.4305', '0.79572', '5036:0 '),\n('5036', 'ArathiBasinStartH', '529', '3358', '3358', '20', '80', '0', '748.646', '759.099', '-41.5104', '0.818832', '5038:0 5037:0 '),\n('5037', 'ArathiBasinFarm', '529', '3358', '3420', '20', '80', '128', '809.5', '872.547', '-56.7509', '1.20759', '5034:0 5036:0 5031:0 '),\n('5038', 'ArathiBasinFarmBridge', '529', '3358', '3420', '20', '80', '0', '864.499', '771.902', '-51.7236', '0.695112', '5036:0 5039:0 '),\n('5039', 'ArathiBasinMineForkSE', '529', '3358', '3358', '20', '80', '0', '956.739', '804.522', '-61.6094', '0.524283', '5038:0 5041:0 5043:0 '),\n('5040', 'ArathiBasinMineForkNW', '529', '3358', '3358', '20', '80', '0', '1221.3', '1088.37', '-59.7666', '4.47091', '5041:0 5026:0 5042:0 '),\n('5041', 'ArathiBasinMine', '529', '3358', '3423', '20', '80', '136', '1151.72', '846.381', '-110.525', '2.55257', '5040:0 5039:0 '),\n('5042', 'ArathiBasinMineUp1', '529', '3358', '3358', '20', '80', '0', '1156.61', '991.63', '-63.6154', '2.3307', '5040:0 5043:0 5045:0 '),\n('5043', 'ArathiBasinMineUp2', '529', '3358', '3358', '20', '80', '0', '1040.93', '882.871', '-61.8051', '2.33458', '5039:0 5044:0 5042:0 '),\n('5044', 'ArathiBasinBlacksmithForkS', '529', '3358', '3421', '20', '80', '0', '922.673', '999.161', '-55.5623', '5.49188', '5031:0 5043:0 5046:0 5045:0 '),\n('5045', 'ArathiBasinBlacksmithForkN', '529', '3358', '3421', '20', '80', '0', '1050.68', '999.89', '-50.4064', '5.62341', '5029:0 5042:0 5044:0 5046:0 '),\n('5046', 'ArathiBasinBlacksmith', '529', '3358', '3421', '20', '80', '136', '979.258', '1043.34', '-44.3749', '0.106003', '5044:0 5045:0 '),\n('5047', 'AlteracValleySpawnA', '30', '2597', '2597', '50', '80', '3', '801.027', '-493.883', '99.6917', '3.08066', '5048:0 '),\n('5048', 'AlteracValleyStartA1', '30', '2597', '3299', '50', '80', '2', '717.929', '-475.351', '75.1276', '2.10478', '5049:0 5087:0 '),\n('5049', 'AlteracValleyStartA2', '30', '2597', '3299', '50', '80', '34', '664.972', '-400.377', '68.7491', '2.43269', '5050:0 5085:0 '),\n('5050', 'AlteracValleyStartA3', '30', '2597', '3299', '50', '80', '2', '610.827', '-388.879', '66.5562', '3.30843', '5051:0 '),\n('5051', 'AlteracValleyStartA4', '30', '2597', '2597', '50', '80', '2', '463.128', '-438.201', '33.0107', '2.75865', '5052:0 '),\n('5052', 'AlteracValleyHubA1', '30', '2597', '2597', '50', '80', '0', '401.785', '-393.695', '-1.05733', '2.60355', '5053:0 5092:0 '),\n('5053', 'AlteracValleyBunker2', '30', '2597', '3304', '50', '80', '0', '221.727', '-412.006', '41.1425', '2.14206', '5054:0 5055:0 5052:0 '),\n('5054', 'AlteracValleyBunker2Inside', '30', '2597', '3304', '50', '80', '146', '204.453', '-359.47', '56.3831', '2.20687', '5053:0 '),\n('5055', 'AlteracValleyGYA1', '30', '2597', '3302', '50', '80', '128', '76.8322', '-399.172', '45.7006', '1.69996', '5053:0 5056:0 5057:0 5058:0 '),\n('5056', 'AlteracValleyBelinda', '30', '2597', '2958', '50', '80', '0', '-36.1268', '-290.741', '15.0786', '3.0354', '5055:0 '),\n('5057', 'AlteracValleyCN', '30', '2597', '2597', '50', '80', '0', '-133.7', '-368.866', '8.47712', '6.00431', '5055:0 5060:0 5095:0 '),\n('5058', 'AlteracValleyBunker1Inside', '30', '2597', '3305', '50', '80', '146', '-151.384', '-442.049', '40.3942', '1.08956', '5055:0 '),\n('5059', 'AlteracValleyGYC', '30', '2597', '3301', '50', '80', '128', '-200.494', '-109.396', '78.5207', '4.95373', '5095:0 5094:0 '),\n('5060', 'AlteracValleyCS1', '30', '2597', '3057', '50', '80', '0', '-262.759', '-292.49', '6.80088', '5.73925', '5057:0 5061:0 '),\n('5061', 'AlteracValleyCS2', '30', '2597', '3057', '50', '80', '0', '-473.131', '-273.873', '24.7318', '3.74628', '5060:0 5062:0 5094:0 '),\n('5062', 'AlteracValleyCS3', '30', '2597', '2597', '50', '80', '32', '-525.235', '-353.849', '37.0353', '4.37461', '5063:0 5061:0 '),\n('5063', 'AlteracValleyCS4', '30', '2597', '2597', '50', '80', '0', '-601.467', '-320.914', '51.7167', '6.08664', '5062:0 5064:0 '),\n('5064', 'AlteracValleyGYH1', '30', '2597', '2597', '50', '80', '128', '-615.967', '-397.593', '60.6924', '0.333583', '5063:0 5065:0 5066:0 5067:0 '),\n('5065', 'AlteracValleyTower1Inside', '30', '2597', '2977', '50', '80', '148', '-569.205', '-264.746', '75.0088', '2.58769', '5064:0 '),\n('5066', 'AlteracValleyGalvangar', '30', '2597', '2977', '50', '80', '0', '-536.858', '-168.875', '57.0098', '2.75262', '5064:0 '),\n('5067', 'AlteracValleyTower2', '30', '2597', '2962', '50', '80', '0', '-715.985', '-350.671', '66.8321', '2.63482', '5064:0 5068:0 5069:0 '),\n('5068', 'AlteracValleyTower2Inside', '30', '2597', '2962', '50', '80', '148', '-767.615', '-361.296', '90.8949', '4.27041', '5067:0 '),\n('5069', 'AlteracValleyGYH2', '30', '2597', '2597', '50', '80', '128', '-1083.95', '-341.705', '55.3047', '0.111719', '5067:0 5072:0 5090:0 '),\n('5070', 'AlteracValleyStartH1', '30', '2597', '2597', '50', '80', '4', '-1144.38', '-442.064', '56.7427', '0.904973', '5069:0 '),\n('5071', 'AlteracValleySpawnH', '30', '2597', '2597', '50', '80', '5', '-1386.53', '-549.064', '55.0284', '0.628112', '5070:0 '),\n('5072', 'AlteracValleyBaseH1', '30', '2597', '2961', '50', '80', '0', '-1241.61', '-363.466', '59.6773', '2.10074', '5069:0 5073:0 '),\n('5073', 'AlteracValleyBaseH2', '30', '2597', '2961', '50', '80', '0', '-1210.4', '-252.908', '72.7007', '3.07856', '5072:0 5074:0 '),\n('5074', 'AlteracValleyBaseH3', '30', '2597', '2978', '50', '80', '0', '-1286.08', '-289.551', '89.091', '3.10996', '5073:0 5075:0 '),\n('5075', 'AlteracValleyGYH3', '30', '2597', '2978', '50', '80', '128', '-1404.13', '-312.526', '89.4075', '1.4783', '5074:0 5076:0 5077:0 5078:0 '),\n('5076', 'AlteracValleyTower3Inside', '30', '2597', '2978', '50', '80', '148', '-1301.34', '-267.703', '114.151', '0.219693', '5075:0 '),\n('5077', 'AlteracValleyTower4Inside', '30', '2597', '2978', '50', '80', '148', '-1304.35', '-313.854', '113.867', '5.07738', '5075:0 '),\n('5078', 'AlteracValleyDrekthar', '30', '2597', '4407', '50', '80', '276', '-1367.71', '-227.007', '98.4255', '2.09366', '5075:0 '),\n('5079', 'AlteracValleyGYA2', '30', '2597', '3303', '50', '80', '128', '664.375', '-295.432', '30.2906', '1.6334', '5080:0 5088:0 5092:0 '),\n('5080', 'AlteracValleyBaseA1', '30', '2597', '2959', '50', '80', '0', '628.165', '-209.132', '39.032', '1.71587', '5081:0 5079:0 '),\n('5081', 'AlteracValleyGYA3', '30', '2597', '2959', '50', '80', '128', '635.165', '-28.286', '46.6157', '4.25874', '5080:0 5082:0 5083:0 5084:0 '),\n('5082', 'AlteracValleyBunker3Inside', '30', '2597', '2959', '50', '80', '146', '672.521', '-142.475', '63.6551', '4.09365', '5081:0 '),\n('5083', 'AlteracValleyBunker4Inside', '30', '2597', '2959', '50', '80', '146', '555.611', '-77.7777', '51.9336', '1.81992', '5081:0 '),\n('5084', 'AlteracValleyVanndar', '30', '2597', '4408', '50', '80', '274', '712.208', '-13.5129', '50.1354', '0.288398', '5081:0 '),\n('5085', 'AlteracValleyShortcutA1', '30', '2597', '3303', '50', '80', '34', '668.321', '-376.13', '30.4499', '1.65697', '5079:0 '),\n('5086', 'AlteracValleyShortcutH1', '30', '2597', '2597', '50', '80', '36', '-550.621', '-356.862', '50.2404', '5.33475', '5062:0 '),\n('5087', 'AlteracValleyMineA1', '30', '2597', '2957', '50', '80', '34', '774.881', '-363.728', '78.8805', '1.75712', '5088:0 '),\n('5088', 'AlteracValleyMineA2', '30', '2597', '2957', '50', '80', '32', '776.68', '-313.432', '54.4907', '0.0135369', '5089:0 5079:0 '),\n('5089', 'AlteracValleyMineA3', '30', '2597', '2957', '50', '80', '512', '870.508', '-436.928', '51.1438', '5.59377', '5088:0 '),\n('5090', 'AlteracValleyMineH1', '30', '2597', '2963', '50', '80', '0', '-964.106', '-216.1', '69.4372', '0.822477', '5069:0 5091:0 '),\n('5091', 'AlteracValleyMineH2', '30', '2597', '2963', '50', '80', '512', '-857.468', '-102.82', '65.0282', '0.681106', '5090:0 '),\n('5092', 'AlteracValleyAuxA1', '30', '2597', '2597', '50', '80', '0', '517.454', '-327.563', '-1.03301', '0.235552', '5052:0 5079:0 '),\n('5093', 'AlteracValleyIcebloodGY', '30', '2597', '3300', '50', '80', '0', '-531.167', '-405.06', '49.5441', '2.83719', '5064:0 5086:0 '),\n('5094', 'AlteracValleyGYCS', '30', '2597', '3057', '50', '80', '0', '-296.163', '-118.723', '18.4795', '0.58704', '5059:0 5061:0 '),\n('5095', 'AlteracValleyGYCN', '30', '2597', '2597', '50', '80', '0', '-154.952', '-231.949', '10.0454', '1.75925', '5057:0 5059:0 ');\n"
  },
  {
    "path": "AC/SQL/updates/world/2024_11_01_creature_template_wander_nodes.sql",
    "content": "--\nDELETE FROM `creature_template_npcbot_wander_nodes` WHERE `id` BETWEEN 5025 AND 5106;\nINSERT INTO `creature_template_npcbot_wander_nodes` (`id`,`name`,`mapid`,`zoneid`,`areaid`,`minlevel`,`maxlevel`,`flags`,`x`,`y`,`z`,`o`,`links`) VALUES\n('5025', 'ArathiBasinSpawnA', '529', '3358', '3417', '20', '80', '19', '1289.51', '1286.41', '-14.466', '3.89804', '5026:0 '),\n('5026', 'ArathiBasinStartA', '529', '3358', '3358', '20', '80', '0', '1241.32', '1228.52', '-40.2271', '4.12149', '5025:0 5027:0 5028:0 5040:0 '),\n('5027', 'ArathiBasinStables', '529', '3358', '3424', '20', '80', '128', '1168.45', '1204.15', '-56.582', '6.24992', '5028:0 5040:0 5054:0 5026:0 '),\n('5028', 'ArathiBasinStablesBridge', '529', '3358', '3358', '20', '80', '0', '1088.6', '1223.56', '-53.4783', '0.143443', '5029:0 5032:0 5027:0 5026:0 '),\n('5029', 'ArathiBasinMillLow1', '529', '3358', '3358', '20', '80', '0', '988.277', '1179.75', '-50.2717', '5.04236', '5028:0 5030:0 5045:0 5032:0 '),\n('5030', 'ArathiBasinMillLow2', '529', '3358', '3358', '20', '80', '0', '894.665', '1107.2', '-57.5224', '0.784845', '5029:0 5031:0 '),\n('5031', 'ArathiBasinMillLow3', '529', '3358', '3358', '20', '80', '0', '827.933', '976.767', '-54.503', '0.786809', '5030:0 5034:0 5037:0 5044:0 '),\n('5032', 'ArathiBasinMillUp1', '529', '3358', '3358', '20', '80', '0', '945.567', '1228.54', '-27.3493', '5.38137', '5028:0 5029:0 5056:0 '),\n('5033', 'ArathiBasinMill', '529', '3358', '3422', '20', '80', '128', '859.442', '1146.07', '11.648', '2.38114', '5057:0 5056:0 5053:0 '),\n('5034', 'ArathiBasinMillUp2', '529', '3358', '3422', '20', '80', '0', '782.036', '1026.34', '-36.027', '5.5934', '5037:0 5031:0 5057:0 '),\n('5035', 'ArathiBasinSpawnH', '529', '3358', '3418', '20', '80', '21', '704.074', '704.457', '-16.4305', '0.79572', '5036:0 '),\n('5036', 'ArathiBasinStartH', '529', '3358', '3358', '20', '80', '0', '758.421', '762.987', '-43.2233', '0.712183', '5037:0 5035:0 5038:0 '),\n('5037', 'ArathiBasinFarm', '529', '3358', '3420', '20', '80', '128', '809.518', '872.639', '-56.7354', '0.10154', '5034:0 5036:0 5038:0 5052:0 5039:0 5031:0 '),\n('5038', 'ArathiBasinFarmBridge', '529', '3358', '3420', '20', '80', '0', '864.632', '772.771', '-51.793', '3.98729', '5036:0 5037:0 5039:0 '),\n('5039', 'ArathiBasinMineForkSE', '529', '3358', '3358', '20', '80', '0', '956.739', '804.522', '-61.6094', '0.524283', '5037:0 5038:0 5043:0 5050:0 '),\n('5040', 'ArathiBasinMineForkNW', '529', '3358', '3358', '20', '80', '0', '1221.3', '1088.37', '-59.7666', '4.47091', '5042:0 5027:0 5048:0 5026:0 '),\n('5041', 'ArathiBasinMine', '529', '3358', '3423', '20', '80', '128', '1151.72', '846.381', '-110.525', '2.55257', '5051:0 5048:0 5050:0 '),\n('5042', 'ArathiBasinMineUp1', '529', '3358', '3358', '20', '80', '0', '1147.72', '998.593', '-63.7325', '3.58672', '5040:0 5043:0 5045:0 5047:0 '),\n('5043', 'ArathiBasinMineUp2', '529', '3358', '3358', '20', '80', '0', '1040.93', '882.871', '-61.8051', '2.33458', '5044:0 5042:0 5049:0 5039:0 '),\n('5044', 'ArathiBasinBlacksmithForkS', '529', '3358', '3421', '20', '80', '0', '947.881', '1005.66', '-48.5412', '3.2392', '5043:0 5046:0 5045:0 5031:0 '),\n('5045', 'ArathiBasinBlacksmithForkN', '529', '3358', '3421', '20', '80', '0', '1025.4', '999.605', '-46.1926', '2.74243', '5029:0 5042:0 5044:0 5046:0 '),\n('5046', 'ArathiBasinBlacksmith', '529', '3358', '3421', '20', '80', '128', '979.258', '1043.34', '-44.3749', '0.106003', '5044:0 5045:0 5055:0 '),\n('5047', 'ArathiBasinMineCliff1', '529', '3358', '3358', '20', '80', '65544', '1164', '966.548', '-66.2884', '2.12191', '5048:0 5042:0 '),\n('5048', 'ArathiBasinMineDrop1', '529', '3358', '3358', '20', '80', '131072', '1180.76', '949.456', '-97.1403', '2.75853', '5040:0 5041:0 5050:0 '),\n('5049', 'ArathiBasinMineCliff2', '529', '3358', '3358', '20', '80', '65544', '1075.94', '851.303', '-65.9095', '2.44001', '5050:0 5043:0 '),\n('5050', 'ArathiBasinMineDrop2', '529', '3358', '3358', '20', '80', '131072', '1089.48', '842.85', '-102.208', '2.56371', '5039:0 5041:0 5048:0 '),\n('5051', 'ArathiBasinMineBuff', '529', '3358', '3423', '20', '80', '16392', '1148.7', '816.306', '-98.4955', '1.60396', '5041:0 '),\n('5052', 'ArathiBasinFarmBuff', '529', '3358', '3420', '20', '80', '4104', '815.759', '842.924', '-56.5402', '5.98651', '5037:0 '),\n('5053', 'ArathiBasinMillBuff', '529', '3358', '3422', '20', '80', '8200', '810.493', '1184', '11.9217', '5.57811', '5033:0 '),\n('5054', 'ArathiBasinStablesBuff', '529', '3358', '3424', '20', '80', '2056', '1184.4', '1185.75', '-56.3632', '5.47167', '5027:0 '),\n('5055', 'ArathiBasinBlacksmithBuff', '529', '3358', '3421', '20', '80', '32776', '989.914', '1008.62', '-42.6033', '2.21464', '5046:0 '),\n('5056', 'ArathiBasinMillUp3', '529', '3358', '3422', '20', '80', '0', '874.487', '1198.33', '8.83505', '3.90873', '5032:0 5033:0 5057:0 '),\n('5057', 'ArathiBasinMillUp4', '529', '3358', '3422', '20', '80', '0', '797.429', '1127.41', '9.63979', '0.623809', '5033:0 5034:0 5056:0 '),\n('5058', 'AlteracValleySpawnA', '30', '2597', '2597', '50', '80', '3', '801.027', '-493.883', '99.6917', '3.08066', '5059:0 '),\n('5059', 'AlteracValleyStartA1', '30', '2597', '3299', '50', '80', '2', '717.929', '-475.351', '75.1276', '2.10478', '5060:0 5098:0 '),\n('5060', 'AlteracValleyStartA2', '30', '2597', '3299', '50', '80', '34', '664.972', '-400.377', '68.7491', '2.43269', '5061:0 5096:0 '),\n('5061', 'AlteracValleyStartA3', '30', '2597', '3299', '50', '80', '2', '610.827', '-388.879', '66.5562', '3.30843', '5062:0 '),\n('5062', 'AlteracValleyStartA4', '30', '2597', '2597', '50', '80', '2', '463.128', '-438.201', '33.0107', '2.75865', '5063:0 '),\n('5063', 'AlteracValleyHubA1', '30', '2597', '2597', '50', '80', '0', '401.785', '-393.695', '-1.05733', '2.60355', '5064:0 5103:0 '),\n('5064', 'AlteracValleyBunker2', '30', '2597', '3304', '50', '80', '0', '221.727', '-412.006', '41.1425', '2.14206', '5065:0 5066:0 5063:0 '),\n('5065', 'AlteracValleyBunker2Inside', '30', '2597', '3304', '50', '80', '146', '204.453', '-359.47', '56.3831', '2.20687', '5064:0 '),\n('5066', 'AlteracValleyGYA1', '30', '2597', '3302', '50', '80', '128', '76.8322', '-399.172', '45.7006', '1.69996', '5064:0 5067:0 5068:0 5069:0 '),\n('5067', 'AlteracValleyBelinda', '30', '2597', '2958', '50', '80', '0', '-36.1268', '-290.741', '15.0786', '3.0354', '5066:0 '),\n('5068', 'AlteracValleyCN', '30', '2597', '2597', '50', '80', '0', '-133.7', '-368.866', '8.47712', '6.00431', '5066:0 5071:0 5106:0 '),\n('5069', 'AlteracValleyBunker1Inside', '30', '2597', '3305', '50', '80', '146', '-151.384', '-442.049', '40.3942', '1.08956', '5066:0 '),\n('5070', 'AlteracValleyGYC', '30', '2597', '3301', '50', '80', '128', '-200.494', '-109.396', '78.5207', '4.95373', '5106:0 5105:0 '),\n('5071', 'AlteracValleyCS1', '30', '2597', '3057', '50', '80', '0', '-262.759', '-292.49', '6.80088', '5.73925', '5068:0 5072:0 '),\n('5072', 'AlteracValleyCS2', '30', '2597', '3057', '50', '80', '0', '-473.131', '-273.873', '24.7318', '3.74628', '5071:0 5073:0 5105:0 '),\n('5073', 'AlteracValleyCS3', '30', '2597', '2597', '50', '80', '32', '-525.235', '-353.849', '37.0353', '4.37461', '5074:0 5072:0 '),\n('5074', 'AlteracValleyCS4', '30', '2597', '2597', '50', '80', '0', '-601.467', '-320.914', '51.7167', '6.08664', '5073:0 5075:0 '),\n('5075', 'AlteracValleyGYH1', '30', '2597', '2597', '50', '80', '128', '-615.967', '-397.593', '60.6924', '0.333583', '5074:0 5076:0 5077:0 5078:0 '),\n('5076', 'AlteracValleyTower1Inside', '30', '2597', '2977', '50', '80', '148', '-569.205', '-264.746', '75.0088', '2.58769', '5075:0 '),\n('5077', 'AlteracValleyGalvangar', '30', '2597', '2977', '50', '80', '0', '-536.858', '-168.875', '57.0098', '2.75262', '5075:0 '),\n('5078', 'AlteracValleyTower2', '30', '2597', '2962', '50', '80', '0', '-715.985', '-350.671', '66.8321', '2.63482', '5075:0 5079:0 5080:0 '),\n('5079', 'AlteracValleyTower2Inside', '30', '2597', '2962', '50', '80', '148', '-767.615', '-361.296', '90.8949', '4.27041', '5078:0 '),\n('5080', 'AlteracValleyGYH2', '30', '2597', '2597', '50', '80', '128', '-1083.95', '-341.705', '55.3047', '0.111719', '5078:0 5083:0 5101:0 '),\n('5081', 'AlteracValleyStartH1', '30', '2597', '2597', '50', '80', '4', '-1144.38', '-442.064', '56.7427', '0.904973', '5080:0 '),\n('5082', 'AlteracValleySpawnH', '30', '2597', '2597', '50', '80', '5', '-1386.53', '-549.064', '55.0284', '0.628112', '5081:0 '),\n('5083', 'AlteracValleyBaseH1', '30', '2597', '2961', '50', '80', '0', '-1241.61', '-363.466', '59.6773', '2.10074', '5080:0 5084:0 '),\n('5084', 'AlteracValleyBaseH2', '30', '2597', '2961', '50', '80', '0', '-1210.4', '-252.908', '72.7007', '3.07856', '5083:0 5085:0 '),\n('5085', 'AlteracValleyBaseH3', '30', '2597', '2978', '50', '80', '0', '-1286.08', '-289.551', '89.091', '3.10996', '5084:0 5086:0 '),\n('5086', 'AlteracValleyGYH3', '30', '2597', '2978', '50', '80', '128', '-1404.13', '-312.526', '89.4075', '1.4783', '5085:0 5087:0 5088:0 5089:0 '),\n('5087', 'AlteracValleyTower3Inside', '30', '2597', '2978', '50', '80', '148', '-1301.34', '-267.703', '114.151', '0.219693', '5086:0 '),\n('5088', 'AlteracValleyTower4Inside', '30', '2597', '2978', '50', '80', '148', '-1304.35', '-313.854', '113.867', '5.07738', '5086:0 '),\n('5089', 'AlteracValleyDrekthar', '30', '2597', '4407', '50', '80', '276', '-1367.71', '-227.007', '98.4255', '2.09366', '5086:0 '),\n('5090', 'AlteracValleyGYA2', '30', '2597', '3303', '50', '80', '128', '664.375', '-295.432', '30.2906', '1.6334', '5091:0 5099:0 5103:0 '),\n('5091', 'AlteracValleyBaseA1', '30', '2597', '2959', '50', '80', '0', '628.165', '-209.132', '39.032', '1.71587', '5092:0 5090:0 '),\n('5092', 'AlteracValleyGYA3', '30', '2597', '2959', '50', '80', '128', '635.165', '-28.286', '46.6157', '4.25874', '5091:0 5093:0 5094:0 5095:0 '),\n('5093', 'AlteracValleyBunker3Inside', '30', '2597', '2959', '50', '80', '146', '672.521', '-142.475', '63.6551', '4.09365', '5092:0 '),\n('5094', 'AlteracValleyBunker4Inside', '30', '2597', '2959', '50', '80', '146', '555.611', '-77.7777', '51.9336', '1.81992', '5092:0 '),\n('5095', 'AlteracValleyVanndar', '30', '2597', '4408', '50', '80', '274', '712.208', '-13.5129', '50.1354', '0.288398', '5092:0 '),\n('5096', 'AlteracValleyShortcutA1', '30', '2597', '3303', '50', '80', '34', '668.321', '-376.13', '30.4499', '1.65697', '5090:0 '),\n('5097', 'AlteracValleyShortcutH1', '30', '2597', '2597', '50', '80', '36', '-550.621', '-356.862', '50.2404', '5.33475', '5073:0 '),\n('5098', 'AlteracValleyMineA1', '30', '2597', '2957', '50', '80', '34', '774.881', '-363.728', '78.8805', '1.75712', '5099:0 '),\n('5099', 'AlteracValleyMineA2', '30', '2597', '2957', '50', '80', '32', '776.68', '-313.432', '54.4907', '0.0135369', '5100:0 5090:0 '),\n('5100', 'AlteracValleyMineA3', '30', '2597', '2957', '50', '80', '512', '870.508', '-436.928', '51.1438', '5.59377', '5099:0 '),\n('5101', 'AlteracValleyMineH1', '30', '2597', '2963', '50', '80', '0', '-964.106', '-216.1', '69.4372', '0.822477', '5080:0 5102:0 '),\n('5102', 'AlteracValleyMineH2', '30', '2597', '2963', '50', '80', '512', '-857.468', '-102.82', '65.0282', '0.681106', '5101:0 '),\n('5103', 'AlteracValleyAuxA1', '30', '2597', '2597', '50', '80', '0', '517.454', '-327.563', '-1.03301', '0.235552', '5063:0 5090:0 '),\n('5104', 'AlteracValleyIcebloodGY', '30', '2597', '3300', '50', '80', '0', '-531.167', '-405.06', '49.5441', '2.83719', '5075:0 5097:0 '),\n('5105', 'AlteracValleyGYCS', '30', '2597', '3057', '50', '80', '0', '-296.163', '-118.723', '18.4795', '0.58704', '5070:0 5072:0 '),\n('5106', 'AlteracValleyGYCN', '30', '2597', '2597', '50', '80', '0', '-154.952', '-231.949', '10.0454', '1.75925', '5068:0 5070:0 ');\n"
  },
  {
    "path": "AC/SQL/updates/world/2024_11_04_creature_template_wander_nodes.sql",
    "content": "--\nDELETE FROM `creature_template_npcbot_wander_nodes` WHERE `id` BETWEEN 5058 AND 5110;\nINSERT INTO `creature_template_npcbot_wander_nodes` (`id`,`name`,`mapid`,`zoneid`,`areaid`,`minlevel`,`maxlevel`,`flags`,`x`,`y`,`z`,`o`,`links`) VALUES\n('5058', 'AlteracValleySpawnA', '30', '2597', '2597', '50', '80', '3', '801.027', '-493.883', '99.6917', '3.08066', '5059:0 '),\n('5059', 'AlteracValleyStartA1', '30', '2597', '3299', '50', '80', '2', '717.929', '-475.351', '75.1276', '2.10478', '5060:0 5098:0 '),\n('5060', 'AlteracValleyStartA2', '30', '2597', '3299', '50', '80', '65538', '664.972', '-400.377', '68.7491', '2.43269', '5061:0 5098:0 '),\n('5061', 'AlteracValleyStartA3', '30', '2597', '3299', '50', '80', '10', '610.827', '-388.879', '66.5562', '3.30843', '5062:0 5060:0 '),\n('5062', 'AlteracValleyStartA4', '30', '2597', '2597', '50', '80', '10', '463.128', '-438.201', '33.0107', '2.75865', '5063:0 '),\n('5063', 'AlteracValleyHubA1', '30', '2597', '2597', '50', '80', '8', '401.785', '-393.695', '-1.05733', '2.60355', '5064:0 5103:0 '),\n('5064', 'AlteracValleyBunker2', '30', '2597', '3304', '50', '80', '8', '221.727', '-412.006', '41.1425', '2.14206', '5065:0 5066:0 5063:0 '),\n('5065', 'AlteracValleyBunker2Inside', '30', '2597', '3304', '50', '80', '146', '204.453', '-359.47', '56.3831', '2.20687', '5064:0 '),\n('5066', 'AlteracValleyGYA1', '30', '2597', '3302', '50', '80', '136', '76.8322', '-399.172', '45.7006', '1.69996', '5064:0 5067:0 5068:0 5069:0 5109:0 '),\n('5067', 'AlteracValleyBelinda', '30', '2597', '2958', '50', '80', '1042', '-36.1268', '-290.741', '15.0786', '3.0354', '5066:0 '),\n('5068', 'AlteracValleyCN', '30', '2597', '2597', '50', '80', '8', '-63.4528', '-374.738', '13.4643', '2.01653', '5066:0 5071:0 5106:0 5107:0 '),\n('5069', 'AlteracValleyBunker1Inside', '30', '2597', '3305', '50', '80', '146', '-151.384', '-442.049', '40.3942', '1.08956', '5066:0 '),\n('5070', 'AlteracValleyGYC', '30', '2597', '3301', '50', '80', '136', '-200.494', '-109.396', '78.5207', '4.95373', '5106:0 5105:0 '),\n('5071', 'AlteracValleyCS1', '30', '2597', '3057', '50', '80', '8', '-255.035', '-296.856', '6.68142', '5.07206', '5068:0 5072:0 '),\n('5072', 'AlteracValleyCS2', '30', '2597', '3057', '50', '80', '8', '-473.131', '-273.873', '24.7318', '3.74628', '5071:0 5105:0 5107:0 5108:0 5073:0 '),\n('5073', 'AlteracValleyCS3', '30', '2597', '2597', '50', '80', '32', '-525.235', '-353.849', '37.0353', '4.37461', '5072:0 5074:0 5110:0 '),\n('5074', 'AlteracValleyCS4', '30', '2597', '2597', '50', '80', '8', '-601.467', '-320.914', '51.7167', '6.08664', '5075:0 5073:0 '),\n('5075', 'AlteracValleyGYH1', '30', '2597', '2597', '50', '80', '136', '-615.967', '-397.593', '60.6924', '0.333583', '5074:0 5076:0 5077:0 5078:0 '),\n('5076', 'AlteracValleyTower1Inside', '30', '2597', '2977', '50', '80', '148', '-569.205', '-264.746', '75.0088', '2.58769', '5075:0 '),\n('5077', 'AlteracValleyGalvangar', '30', '2597', '2977', '50', '80', '1044', '-536.858', '-168.875', '57.0098', '2.75262', '5075:0 '),\n('5078', 'AlteracValleyTower2', '30', '2597', '2962', '50', '80', '8', '-715.985', '-350.671', '66.8321', '2.63482', '5075:0 5079:0 5080:0 '),\n('5079', 'AlteracValleyTower2Inside', '30', '2597', '2962', '50', '80', '148', '-767.615', '-361.296', '90.8949', '4.27041', '5078:0 '),\n('5080', 'AlteracValleyGYH2', '30', '2597', '2597', '50', '80', '136', '-1083.95', '-341.705', '55.3047', '0.111719', '5078:0 5083:0 5101:0 '),\n('5081', 'AlteracValleyStartH1', '30', '2597', '2597', '50', '80', '4', '-1144.38', '-442.064', '56.7427', '0.904973', '5080:0 '),\n('5082', 'AlteracValleySpawnH', '30', '2597', '2597', '50', '80', '5', '-1386.53', '-549.064', '55.0284', '0.628112', '5081:0 '),\n('5083', 'AlteracValleyBaseH1', '30', '2597', '2961', '50', '80', '8', '-1241.61', '-363.466', '59.6773', '2.10074', '5080:0 5084:0 '),\n('5084', 'AlteracValleyBaseH2', '30', '2597', '2961', '50', '80', '8', '-1210.4', '-252.908', '72.7007', '3.07856', '5083:0 5085:0 '),\n('5085', 'AlteracValleyBaseH3', '30', '2597', '2978', '50', '80', '8', '-1286.08', '-289.551', '89.091', '3.10996', '5084:0 5086:0 '),\n('5086', 'AlteracValleyGYH3', '30', '2597', '2978', '50', '80', '136', '-1404.13', '-312.526', '89.4075', '1.4783', '5085:0 5087:0 5088:0 5089:0 '),\n('5087', 'AlteracValleyTower3Inside', '30', '2597', '2978', '50', '80', '148', '-1301.34', '-267.703', '114.151', '0.219693', '5086:0 '),\n('5088', 'AlteracValleyTower4Inside', '30', '2597', '2978', '50', '80', '148', '-1304.35', '-313.854', '113.867', '5.07738', '5086:0 '),\n('5089', 'AlteracValleyDrekthar', '30', '2597', '4407', '50', '80', '276', '-1367.71', '-227.007', '98.4255', '2.09366', '5086:0 '),\n('5090', 'AlteracValleyGYA2', '30', '2597', '3303', '50', '80', '136', '664.375', '-295.432', '30.2906', '1.6334', '5091:0 5099:0 5103:0 '),\n('5091', 'AlteracValleyBaseA1', '30', '2597', '2959', '50', '80', '8', '628.165', '-209.132', '39.032', '1.71587', '5092:0 5090:0 '),\n('5092', 'AlteracValleyGYA3', '30', '2597', '2959', '50', '80', '136', '635.165', '-28.286', '46.6157', '4.25874', '5091:0 5093:0 5094:0 5095:0 '),\n('5093', 'AlteracValleyBunker3Inside', '30', '2597', '2959', '50', '80', '146', '672.521', '-142.475', '63.6551', '4.09365', '5092:0 '),\n('5094', 'AlteracValleyBunker4Inside', '30', '2597', '2959', '50', '80', '146', '555.611', '-77.7777', '51.9336', '1.81992', '5092:0 '),\n('5095', 'AlteracValleyVanndar', '30', '2597', '4408', '50', '80', '274', '712.208', '-13.5129', '50.1354', '0.288398', '5092:0 '),\n('5096', 'AlteracValleyShortcutA1', '30', '2597', '3303', '50', '80', '131074', '668.321', '-376.13', '30.4499', '1.65697', '5090:0 '),\n('5097', 'AlteracValleyShortcutH1', '30', '2597', '2597', '50', '80', '32', '-550.621', '-356.862', '50.2404', '5.33475', '5073:0 '),\n('5098', 'AlteracValleyMineA1', '30', '2597', '2957', '50', '80', '65538', '774.881', '-363.728', '78.8805', '1.75712', '5099:0 5060:0 '),\n('5099', 'AlteracValleyMineA2', '30', '2597', '2957', '50', '80', '131072', '776.68', '-313.432', '54.4907', '0.0135369', '5100:0 5090:0 '),\n('5100', 'AlteracValleyMineA3', '30', '2597', '2957', '50', '80', '512', '870.508', '-436.928', '51.1438', '5.59377', '5099:0 '),\n('5101', 'AlteracValleyMineH1', '30', '2597', '2963', '50', '80', '8', '-964.106', '-216.1', '69.4372', '0.822477', '5080:0 5102:0 '),\n('5102', 'AlteracValleyMineH2', '30', '2597', '2963', '50', '80', '512', '-853.987', '-98.7783', '67.5444', '6.16727', '5101:0 '),\n('5103', 'AlteracValleyAuxA1', '30', '2597', '2597', '50', '80', '8', '517.454', '-327.563', '-1.03301', '0.235552', '5063:0 5090:0 '),\n('5104', 'AlteracValleyIcebloodGY', '30', '2597', '3300', '50', '80', '0', '-531.167', '-405.06', '49.5441', '2.83719', '5075:0 5097:0 '),\n('5105', 'AlteracValleyGYCS', '30', '2597', '3057', '50', '80', '8', '-311.905', '-130.479', '14.734', '0.412742', '5070:0 5106:0 5072:0 '),\n('5106', 'AlteracValleyGYCN', '30', '2597', '2597', '50', '80', '8', '-143.447', '-249.084', '6.68667', '1.83233', '5068:0 5070:0 5105:0 5108:0 5109:0 '),\n('5107', 'AlteracValleyCS5', '30', '2597', '3057', '50', '80', '8', '-228.16', '-372.069', '9.52872', '3.05359', '5068:0 5110:0 5072:0 '),\n('5108', 'AlteracValleyCS6', '30', '2597', '3057', '50', '80', '8', '-276.653', '-212.64', '7.9686', '3.4754', '5106:0 5072:0 '),\n('5109', 'AlteracValleyCNE', '30', '2597', '2958', '50', '80', '0', '72.783', '-254.66', '17.9217', '3.41296', '5066:0 5106:0 '),\n('5110', 'AlteracValleyCS7', '30', '2597', '3057', '1', '60', '8', '-336.807', '-401.764', '10.041', '0.0278354', '5107:0 5073:0 ');\n"
  },
  {
    "path": "AC/SQL/updates/world/2024_11_05_creature_template_wander_nodes.sql",
    "content": "--\nUPDATE `creature_template_npcbot_wander_nodes` SET `minlevel`='50', `maxlevel`='80' WHERE `id`='5110';\n"
  },
  {
    "path": "AC/SQL/updates/world/2024_11_07_creature_template_wander_nodes.sql",
    "content": "--\nDELETE FROM `creature_template_npcbot_wander_nodes` WHERE `id` BETWEEN 5111 AND 5146;\nINSERT INTO `creature_template_npcbot_wander_nodes` (`id`,`name`,`mapid`,`zoneid`,`areaid`,`minlevel`,`maxlevel`,`flags`,`x`,`y`,`z`,`o`,`links`) VALUES\n('5111', 'EyeOfTheStormSpawnA', '566', '3820', '3820', '60', '80', '3', '2523.45', '1596.62', '1269.24', '3.03123', '5112:0 5113:0 '),\n('5112', 'EyeOfTheStormSpawnA1', '566', '3820', '3820', '60', '80', '65538', '2496.81', '1612.95', '1255.15', '2.81918', '5114:0 '),\n('5113', 'EyeOfTheStormSpawnA2', '566', '3820', '3820', '60', '80', '65538', '2499.13', '1579.21', '1257.44', '3.44945', '5115:0 '),\n('5114', 'EyeOfTheStormStartA1', '566', '3820', '3820', '60', '80', '131074', '2471.65', '1621.06', '1215.96', '2.97233', '5116:0 '),\n('5115', 'EyeOfTheStormStartA2', '566', '3820', '3820', '60', '80', '131074', '2473.83', '1571', '1213.66', '3.45534', '5117:0 '),\n('5116', 'EyeOfTheStormStartA3', '566', '3820', '3820', '60', '80', '2', '2425.5', '1615.75', '1187.87', '0.156239', '5118:0 5119:0 '),\n('5117', 'EyeOfTheStormStartA4', '566', '3820', '3820', '60', '80', '2', '2417.92', '1560.53', '1185.04', '0.233193', '5119:0 5120:0 '),\n('5118', 'EyeOfTheStormForkNW', '566', '3820', '3869', '60', '80', '8', '2279.22', '1660.34', '1165.68', '0.589394', '5119:0 5121:0 5136:0 '),\n('5119', 'EyeOfTheStormForkN', '566', '3820', '3820', '60', '80', '8', '2275.68', '1577.95', '1165.37', '2.88866', '5120:0 5135:0 5144:0 5118:0 5145:0 '),\n('5120', 'EyeOfTheStormForkNE', '566', '3820', '3871', '60', '80', '8', '2285.71', '1469.1', '1181.66', '5.18595', '5119:0 5122:0 5137:0 '),\n('5121', 'EyeOfTheStormBridgeWN', '566', '3820', '3869', '60', '80', '8', '2220.37', '1754.67', '1152.16', '4.67543', '5133:0 5136:0 5118:0 '),\n('5122', 'EyeOfTheStormBridgeEN', '566', '3820', '3871', '60', '80', '8', '2234.95', '1402.23', '1177.94', '3.26368', '5134:0 5120:0 5137:0 '),\n('5123', 'EyeOfTheStormSpawnH', '566', '3820', '3820', '60', '80', '5', '1807.99', '1539.31', '1267.53', '0.120124', '5124:0 5125:0 '),\n('5124', 'EyeOfTheStormSpawnH1', '566', '3820', '3820', '60', '80', '65540', '1831.62', '1557.48', '1255.46', '0.46766', '5127:0 '),\n('5125', 'EyeOfTheStormSpawnH2', '566', '3820', '3820', '60', '80', '65540', '1833.06', '1524.15', '1255.31', '5.93795', '5126:0 '),\n('5126', 'EyeOfTheStormStartH1', '566', '3820', '3820', '60', '80', '131076', '1856.01', '1515.9', '1219.47', '5.93795', '5128:0 '),\n('5127', 'EyeOfTheStormStartH2', '566', '3820', '3820', '60', '80', '131076', '1855.89', '1566.34', '1214.69', '0.34985', '5129:0 '),\n('5128', 'EyeOfTheStormStartH3', '566', '3820', '3820', '60', '80', '4', '1925.07', '1519.35', '1181.58', '0.00431252', '5130:0 5131:0 '),\n('5129', 'EyeOfTheStormStartH4', '566', '3820', '3820', '60', '80', '4', '1937.55', '1593.16', '1178.75', '3.0124', '5131:0 5132:0 '),\n('5130', 'EyeOfTheStormForkSE', '566', '3820', '3870', '60', '80', '8', '2059.13', '1468.67', '1165.76', '4.64205', '5131:0 5134:0 5139:0 '),\n('5131', 'EyeOfTheStormForkSC', '566', '3820', '3820', '60', '80', '8', '2075.02', '1548.37', '1160.58', '0.138568', '5132:0 5135:0 5144:0 5130:0 5146:0 '),\n('5132', 'EyeOfTheStormForkSW', '566', '3820', '3820', '60', '80', '8', '2047.2', '1663.97', '1173.93', '1.64971', '5131:0 5133:0 5138:0 '),\n('5133', 'EyeOfTheStormBridgeWS', '566', '3820', '3872', '60', '80', '8', '2099.21', '1735.01', '1170.54', '0.0965541', '5121:0 5132:0 5138:0 '),\n('5134', 'EyeOfTheStormBridgeES', '566', '3820', '3870', '60', '80', '8', '2110.22', '1381.67', '1162.48', '0.00426722', '5122:0 5139:0 5130:0 '),\n('5135', 'EyeOfTheStormFlagC', '566', '3820', '3820', '60', '80', '262280', '2174.59', '1568.74', '1159.96', '0.248524', '5119:0 5131:0 '),\n('5136', 'EyeOfTheStormFlagNW', '566', '3820', '3869', '60', '80', '72', '2284.84', '1731', '1189.89', '1.72509', '5121:0 5140:0 5118:0 '),\n('5137', 'EyeOfTheStormFlagNE', '566', '3820', '3871', '60', '80', '72', '2286.49', '1402.29', '1197.1', '4.74102', '5120:0 5122:0 5141:0 '),\n('5138', 'EyeOfTheStormFlagSW', '566', '3820', '3872', '60', '80', '72', '2044.01', '1729.74', '1189.86', '1.56605', '5132:0 5133:0 5142:0 '),\n('5139', 'EyeOfTheStormFlagSE', '566', '3820', '3870', '60', '80', '72', '2048.47', '1393.69', '1194.36', '4.79796', '5134:0 5143:0 5130:0 '),\n('5140', 'EyeOfTheStormBuffNW', '566', '3820', '3820', '60', '80', '2056', '2283.56', '1748.26', '1189.71', '3.13137', '5136:0 '),\n('5141', 'EyeOfTheStormBuffNE', '566', '3820', '3820', '60', '80', '4104', '2302.56', '1391.69', '1197.79', '5.33441', '5137:0 '),\n('5142', 'EyeOfTheStormBuffSW', '566', '3820', '3820', '60', '80', '8200', '2046.47', '1749.34', '1190.02', '1.65874', '5138:0 '),\n('5143', 'EyeOfTheStormBuffSE', '566', '3820', '3870', '60', '80', '16392', '2050.3', '1372.75', '1194.56', '4.89851', '5139:0 '),\n('5144', 'EyeOfTheStormFlagCBottom', '566', '3820', '3820', '60', '80', '8', '2178.98', '1538.52', '1129.18', '1.72942', '5119:0 5131:0 '),\n('5145', 'EyeOfTheStormLockA', '566', '3820', '3820', '60', '80', '524', '2423.64', '1588.87', '1188.15', '0.101702', '5119:0 '),\n('5146', 'EyeOfTheStormLockH', '566', '3820', '3820', '60', '80', '522', '1908.01', '1542.98', '1188.84', '3.26882', '5131:0 ');\n"
  },
  {
    "path": "AC/SQL/updates/world/2024_11_11_00_npc_text.sql",
    "content": "--\nSET @LOCALIZED_STRINGS_START = 70553;\nSET @LOCALIZED_STRINGS_END   = 70553;\n\nDELETE FROM `npc_text` WHERE ID BETWEEN @LOCALIZED_STRINGS_START and @LOCALIZED_STRINGS_END;\nINSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n(@LOCALIZED_STRINGS_START,'Bank is full','-1');\n"
  },
  {
    "path": "AC/SQL/updates/world/2024_11_11_01_npc_text.sql",
    "content": "--\nSET @LOCALIZED_STRINGS_START = 70687;\nSET @LOCALIZED_STRINGS_END   = 70688;\n\nDELETE FROM `npc_text` WHERE ID BETWEEN @LOCALIZED_STRINGS_START and @LOCALIZED_STRINGS_END;\nINSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n(@LOCALIZED_STRINGS_START+0,' (gear bank)','-1'),\n(@LOCALIZED_STRINGS_START+1,'Not enough gear bank space to store %u item(s) (%u / %u)!','-1');\n"
  },
  {
    "path": "AC/SQL/updates/world/2024_11_13_00_npc_text.sql",
    "content": "--\nSET @LOCALIZED_STRINGS_START = 70689;\nSET @LOCALIZED_STRINGS_END   = 70693;\n\nDELETE FROM `npc_text` WHERE ID BETWEEN @LOCALIZED_STRINGS_START and @LOCALIZED_STRINGS_END;\nINSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n(@LOCALIZED_STRINGS_START+0,'Equipment sets','-1'),\n(@LOCALIZED_STRINGS_START+1,'Create','-1'),\n(@LOCALIZED_STRINGS_START+2,'Delete','-1'),\n(@LOCALIZED_STRINGS_START+3,'Equip','-1'),\n(@LOCALIZED_STRINGS_START+4,'missing','-1');\n"
  },
  {
    "path": "AC/SQL/updates/world/2026_01_07_creature_template_wander_nodes.sql",
    "content": "DELIMITER $$\nCREATE PROCEDURE tmpAddColumnIfNotExists( IN p_column_name    VARCHAR(64), IN p_add_statement  TEXT )\nBEGIN\n    IF NOT EXISTS (\n        SELECT 1\n        FROM INFORMATION_SCHEMA.COLUMNS\n        WHERE TABLE_SCHEMA = DATABASE()\n          AND TABLE_NAME = 'creature_template_npcbot_wander_nodes'\n          AND COLUMN_NAME = p_column_name\n    ) THEN\n        SET @sql = CONCAT( 'ALTER TABLE `creature_template_npcbot_wander_nodes` ', p_add_statement );\n\n        PREPARE stmt FROM @sql;\n        EXECUTE stmt;\n        DEALLOCATE PREPARE stmt;\n    END IF;\nEND$$\nDELIMITER ;\n\nCALL tmpAddColumnIfNotExists( 'minwaittime', 'ADD `minwaittime` INT UNSIGNED NOT NULL DEFAULT 3000 AFTER `maxlevel`' );\nCALL tmpAddColumnIfNotExists( 'maxwaittime', 'ADD `maxwaittime` INT UNSIGNED NOT NULL DEFAULT 7000 AFTER `minwaittime`' );\nCALL tmpAddColumnIfNotExists( 'proximity', 'ADD `proximity` FLOAT NOT NULL DEFAULT 0 AFTER `maxwaittime`' );\n\nDROP PROCEDURE tmpAddColumnIfNotExists;\n"
  },
  {
    "path": "AC/SQL/updates/world/2026_01_15_00_npc_text.sql",
    "content": "--\nSET @LOCALIZED_STRINGS_START = 70694;\nSET @LOCALIZED_STRINGS_END   = 70700;\n\nDELETE FROM `npc_text` WHERE ID BETWEEN @LOCALIZED_STRINGS_START and @LOCALIZED_STRINGS_END;\nINSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n(@LOCALIZED_STRINGS_START+0,'Manage ownership...','-1'),\n(@LOCALIZED_STRINGS_START+1,'<Add owner>','-1'),\n(@LOCALIZED_STRINGS_START+2,'WARNING: by sharing ownership over your bot you give another player FULL control over their inventory, roles and all other settings (including sharing them with others)','-1'),\n(@LOCALIZED_STRINGS_START+3,'<Remove owner>','-1'),\n(@LOCALIZED_STRINGS_START+4,'Owners limit exceeded','-1'),\n(@LOCALIZED_STRINGS_START+5,'Shared with','-1'),\n(@LOCALIZED_STRINGS_START+6,'Owner','-1');\n"
  },
  {
    "path": "AC/SQL/updates/world/2026_03_12_creature_template_wander_nodes.sql",
    "content": "--\n-- NorthCoastC: make horde-only\nUPDATE `creature_template_npcbot_wander_nodes` SET `flags`=`flags`|4 WHERE (`id`='283');\n-- DurotarCanyon1_8: make horde-only\nUPDATE `creature_template_npcbot_wander_nodes` SET `flags`=`flags`|4 WHERE (`id`='1379');\n"
  },
  {
    "path": "NPCBots.patch",
    "content": " .circleci/config.yml                               |   156 -\n .github/workflows/clang-build.yml                  |    80 +\n .github/workflows/gcc-build.yml                    |     7 +\n .github/workflows/issue-closer.yml                 |    16 -\n .github/workflows/pr-labeler.yml                   |    14 -\n .github/workflows/windown-build.yml                |   102 +\n README.md                                          |    45 +-\n appveyor.yml                                       |    44 -\n sql/Bots/locales/deDE/npc_text_locale.sql          |   409 +\n sql/Bots/locales/esES/npc_text_locale.sql          |   382 +\n sql/Bots/locales/esMX/npc_text_locale.sql          |   382 +\n sql/Bots/locales/ruRU/npc_text_locale.sql          |   380 +\n sql/Bots/locales/zhCN/creature_template_locale.sql |   742 +\n sql/Bots/locales/zhCN/npc_text_locale.sql          |   410 +\n sql/Bots/locales/zhTW/npc_text_locale.sql          |   410 +\n sql/base/auth_npcbots.sql                          |     0\n sql/base/characters_npcbots.sql                    |   187 +\n sql/base/world_npcbots.sql                         |  5938 +++++\n sql/custom/auth/.gitignore                         |     1 -\n .../auth/npcbot_2021_09_14_00_rbac_permissions.sql |    39 +\n ...pcbot_2021_09_14_01_rbac_linked_permissions.sql |    39 +\n .../auth/npcbot_2021_12_29_00_rbac_permissions.sql |     7 +\n ...pcbot_2021_12_29_01_rbac_linked_permissions.sql |     7 +\n .../auth/npcbot_2022_06_24_00_rbac_permissions.sql |     7 +\n ...pcbot_2022_06_24_01_rbac_linked_permissions.sql |     7 +\n .../auth/npcbot_2022_07_04_00_rbac_permissions.sql |     7 +\n ...pcbot_2022_07_04_01_rbac_linked_permissions.sql |     7 +\n .../auth/npcbot_2022_11_30_00_rbac_permissions.sql |     7 +\n .../npcbot_2022_11_30_rbac_linked_permissions.sql  |     7 +\n ...pcbot_2023_08_12_00_rbac_linked_permissions.sql |     2 +\n sql/custom/characters/.dummy                       |     0\n sql/custom/characters/.gitignore                   |     1 -\n sql/custom/world/.gitignore                        |     1 -\n sql/custom/world/2026_03_28_00_command.sql         |     2 +\n sql/custom/world/npcbot_2000_00_00_00_command.sql  |    77 +\n ...cbot_2000_00_00_00_creature_classlevelstats.sql |   609 +\n ...pcbot_2000_00_00_00_creature_equip_template.sql |   323 +\n .../npcbot_2000_00_00_00_creature_template.sql     |   373 +\n sql/custom/world/npcbot_2000_00_00_00_npc_text.sql |   430 +\n src/common/Utilities/EventProcessor.h              |     1 +\n .../Database/Implementation/CharacterDatabase.cpp  |    32 +\n .../Database/Implementation/CharacterDatabase.h    |    27 +\n .../Database/Implementation/WorldDatabase.cpp      |     5 +\n .../Database/Implementation/WorldDatabase.h        |     5 +\n src/server/database/Updater/DBUpdater.cpp          |    48 +\n src/server/database/Updater/DBUpdater.h            |     4 +\n src/server/game/AI/CoreAI/UnitAI.cpp               |     3 +\n src/server/game/AI/NpcBots/bot_Events.h            |    80 +\n src/server/game/AI/NpcBots/bot_GridNotifiers.h     |  1385 ++\n src/server/game/AI/NpcBots/bot_InstanceEvents.h    |    51 +\n src/server/game/AI/NpcBots/bot_ai.cpp              | 21547 +++++++++++++++++++\n src/server/game/AI/NpcBots/bot_ai.h                |   860 +\n src/server/game/AI/NpcBots/bot_archmage_ai.cpp     |   391 +\n src/server/game/AI/NpcBots/bot_bm_ai.cpp           |   941 +\n src/server/game/AI/NpcBots/bot_crypt_lord_ai.cpp   |   825 +\n src/server/game/AI/NpcBots/bot_dark_ranger_ai.cpp  |   599 +\n src/server/game/AI/NpcBots/bot_death_knight_ai.cpp |  2148 ++\n src/server/game/AI/NpcBots/bot_dreadlord_ai.cpp    |   535 +\n src/server/game/AI/NpcBots/bot_druid_ai.cpp        |  2987 +++\n src/server/game/AI/NpcBots/bot_hunter_ai.cpp       |  2239 ++\n src/server/game/AI/NpcBots/bot_mage_ai.cpp         |  1852 ++\n src/server/game/AI/NpcBots/bot_necromancer_ai.cpp  |   751 +\n src/server/game/AI/NpcBots/bot_paladin_ai.cpp      |  2633 +++\n src/server/game/AI/NpcBots/bot_priest_ai.cpp       |  2018 ++\n src/server/game/AI/NpcBots/bot_rogue_ai.cpp        |  2054 ++\n src/server/game/AI/NpcBots/bot_sea_witch_ai.cpp    |   776 +\n src/server/game/AI/NpcBots/bot_shaman_ai.cpp       |  2871 +++\n src/server/game/AI/NpcBots/bot_spellbreaker_ai.cpp |   605 +\n src/server/game/AI/NpcBots/bot_sphynx_ai.cpp       |   560 +\n src/server/game/AI/NpcBots/bot_warlock_ai.cpp      |  2120 ++\n src/server/game/AI/NpcBots/bot_warrior_ai.cpp      |  2192 ++\n src/server/game/AI/NpcBots/botcommands.cpp         |  4942 +++++\n src/server/game/AI/NpcBots/botcommon.h             |   678 +\n src/server/game/AI/NpcBots/botconfig.cpp           |  1344 ++\n src/server/game/AI/NpcBots/botconfig.h             |   142 +\n src/server/game/AI/NpcBots/botdatamgr.cpp          |  3489 +++\n src/server/game/AI/NpcBots/botdatamgr.h            |   273 +\n src/server/game/AI/NpcBots/botdefine.h             |    33 +\n src/server/game/AI/NpcBots/botdpstracker.cpp       |    99 +\n src/server/game/AI/NpcBots/botdpstracker.h         |    45 +\n src/server/game/AI/NpcBots/botdump.cpp             |  1008 +\n src/server/game/AI/NpcBots/botdump.h               |    49 +\n src/server/game/AI/NpcBots/botgearscore.cpp        |   147 +\n src/server/game/AI/NpcBots/botgearscore.h          |    16 +\n src/server/game/AI/NpcBots/botgiver.cpp            |   298 +\n src/server/game/AI/NpcBots/botgossip.h             |   153 +\n src/server/game/AI/NpcBots/botlog.cpp              |    83 +\n src/server/game/AI/NpcBots/botlog.h                |    35 +\n src/server/game/AI/NpcBots/botmgr.cpp              |  2120 ++\n src/server/game/AI/NpcBots/botmgr.h                |   291 +\n src/server/game/AI/NpcBots/botspell.cpp            |  2096 ++\n src/server/game/AI/NpcBots/botspell.h              |   322 +\n src/server/game/AI/NpcBots/bottext.h               |   441 +\n src/server/game/AI/NpcBots/botwanderful.cpp        |   455 +\n src/server/game/AI/NpcBots/botwanderful.h          |   241 +\n src/server/game/AI/NpcBots/bpet_ai.cpp             |  2571 +++\n src/server/game/AI/NpcBots/bpet_ai.h               |   200 +\n src/server/game/AI/NpcBots/bpet_archmage.cpp       |   151 +\n src/server/game/AI/NpcBots/bpet_crypt_lord.cpp     |   383 +\n src/server/game/AI/NpcBots/bpet_dark_ranger.cpp    |   220 +\n src/server/game/AI/NpcBots/bpet_death_knight.cpp   |   191 +\n src/server/game/AI/NpcBots/bpet_dreadlord.cpp      |   163 +\n src/server/game/AI/NpcBots/bpet_druid.cpp          |   146 +\n src/server/game/AI/NpcBots/bpet_hunter.cpp         |  1000 +\n src/server/game/AI/NpcBots/bpet_mage.cpp           |   177 +\n src/server/game/AI/NpcBots/bpet_necromancer.cpp    |   199 +\n src/server/game/AI/NpcBots/bpet_priest.cpp         |   172 +\n src/server/game/AI/NpcBots/bpet_sea_witch.cpp      |   251 +\n src/server/game/AI/NpcBots/bpet_shaman.cpp         |   191 +\n src/server/game/AI/NpcBots/bpet_warlock.cpp        |   410 +\n src/server/game/AI/NpcBots/lib/botlogtraits.h      |    53 +\n src/server/game/AI/NpcBots/lib/bottraits.h         |   158 +\n src/server/game/AI/SmartScripts/SmartScript.cpp    |     3 +\n src/server/game/Accounts/RBAC.h                    |    39 +\n src/server/game/Battlegrounds/Arena.cpp            |    90 +\n src/server/game/Battlegrounds/Arena.h              |     9 +\n src/server/game/Battlegrounds/Battleground.cpp     |   562 +\n src/server/game/Battlegrounds/Battleground.h       |    39 +\n src/server/game/Battlegrounds/BattlegroundMgr.h    |     5 +\n .../game/Battlegrounds/BattlegroundQueue.cpp       |   156 +\n src/server/game/Battlegrounds/BattlegroundQueue.h  |     4 +\n .../game/Battlegrounds/Zones/BattlegroundAB.cpp    |   251 +\n .../game/Battlegrounds/Zones/BattlegroundAB.h      |    12 +\n .../game/Battlegrounds/Zones/BattlegroundAV.cpp    |   356 +\n .../game/Battlegrounds/Zones/BattlegroundAV.h      |    23 +\n .../game/Battlegrounds/Zones/BattlegroundEY.cpp    |   486 +\n .../game/Battlegrounds/Zones/BattlegroundEY.h      |    18 +\n .../game/Battlegrounds/Zones/BattlegroundWS.cpp    |   451 +\n .../game/Battlegrounds/Zones/BattlegroundWS.h      |    14 +\n src/server/game/Combat/CombatManager.cpp           |    58 +\n src/server/game/Combat/ThreatManager.cpp           |    21 +\n src/server/game/Conditions/ConditionMgr.cpp        |    47 +\n src/server/game/DataStores/DBCStores.cpp           |     4 +-\n src/server/game/DataStores/DBCStores.h             |     2 +-\n src/server/game/DungeonFinding/LFGMgr.cpp          |   157 +\n src/server/game/DungeonFinding/LFGScripts.cpp      |    13 +\n src/server/game/Entities/Creature/Creature.cpp     |   594 +\n src/server/game/Entities/Creature/Creature.h       |    91 +\n src/server/game/Entities/Creature/CreatureData.h   |    24 +-\n .../game/Entities/Creature/TemporarySummon.cpp     |    36 +\n src/server/game/Entities/GameObject/GameObject.cpp |    96 +\n src/server/game/Entities/Object/Object.cpp         |   249 +-\n src/server/game/Entities/Object/Object.h           |    10 +-\n src/server/game/Entities/Player/KillRewarder.cpp   |    71 +\n src/server/game/Entities/Player/KillRewarder.h     |     4 +\n src/server/game/Entities/Player/Player.cpp         |   193 +\n src/server/game/Entities/Player/Player.h           |    24 +\n src/server/game/Entities/Totem/Totem.cpp           |    25 +\n src/server/game/Entities/Unit/StatSystem.cpp       |    54 +-\n src/server/game/Entities/Unit/Unit.cpp             |   984 +\n src/server/game/Entities/Unit/Unit.h               |    15 +-\n src/server/game/Entities/Vehicle/Vehicle.cpp       |    42 +\n src/server/game/Globals/ObjectMgr.cpp              |    97 +\n src/server/game/Globals/ObjectMgr.h                |    21 +\n src/server/game/Grids/Notifiers/GridNotifiers.h    |     4 +\n src/server/game/Groups/Group.cpp                   |   371 +-\n src/server/game/Groups/Group.h                     |    17 +\n src/server/game/Groups/GroupMgr.cpp                |     7 +\n src/server/game/Groups/GroupRefManager.h           |    11 +\n src/server/game/Groups/GroupReference.cpp          |    20 +\n src/server/game/Groups/GroupReference.h            |    20 +\n src/server/game/Handlers/BattleGroundHandler.cpp   |   124 +\n src/server/game/Handlers/GroupHandler.cpp          |    40 +\n src/server/game/Handlers/ItemHandler.cpp           |    13 +\n src/server/game/Handlers/LootHandler.cpp           |    50 +\n src/server/game/Handlers/QueryHandler.cpp          |    40 +\n src/server/game/Handlers/SpellHandler.cpp          |   109 +\n src/server/game/Instances/InstanceScript.cpp       |    40 +\n src/server/game/Instances/InstanceScript.h         |     7 +\n src/server/game/Maps/Map.cpp                       |    76 +\n src/server/game/Maps/MapManager.cpp                |    17 +\n src/server/game/Movement/MotionMaster.cpp          |    20 +\n .../MovementGenerators/FollowMovementGenerator.cpp |    12 +\n src/server/game/Movement/Spline/MoveSplineInit.cpp |     5 +\n src/server/game/OutdoorPvP/OutdoorPvP.cpp          |    17 +\n src/server/game/Scripting/ScriptMgr.cpp            |     8 +\n src/server/game/Scripting/ScriptMgr.h              |     2 +\n src/server/game/Server/WorldSession.cpp            |    18 +\n src/server/game/Spells/Auras/SpellAuraEffects.cpp  |   118 +\n src/server/game/Spells/Auras/SpellAuras.cpp        |    55 +\n src/server/game/Spells/Spell.cpp                   |   301 +\n src/server/game/Spells/Spell.h                     |     3 +\n src/server/game/Spells/SpellEffects.cpp            |   249 +\n src/server/game/Spells/SpellInfo.cpp               |    65 +\n src/server/game/Spells/SpellInfo.h                 |    29 +\n src/server/game/Spells/SpellMgr.cpp                |    12 +\n src/server/scripts/Commands/cs_npc.cpp             |    31 +\n .../CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp  |     5 +\n .../BattleForMountHyjal/hyjal_trash.cpp            |     8 +\n .../boss_icecrown_gunship_battle.cpp               |    28 +\n .../Northrend/IcecrownCitadel/boss_sindragosa.cpp  |    29 +\n .../IcecrownCitadel/instance_icecrown_citadel.cpp  |    30 +\n .../Northrend/Naxxramas/boss_four_horsemen.cpp     |     4 +-\n .../Ulduar/HallsOfLightning/boss_volkhan.cpp       |     5 +\n .../Outland/BlackTemple/boss_warlord_najentus.cpp  |    16 +\n src/server/scripts/Pet/pet_dk.cpp                  |    27 +\n src/server/scripts/Spells/spell_dk.cpp             |    17 +\n src/server/scripts/Spells/spell_druid.cpp          |    65 +\n src/server/scripts/Spells/spell_generic.cpp        |    37 +\n src/server/scripts/Spells/spell_hunter.cpp         |    16 +\n src/server/scripts/Spells/spell_item.cpp           |    28 +\n src/server/scripts/Spells/spell_mage.cpp           |     6 +\n src/server/scripts/Spells/spell_paladin.cpp        |    64 +\n src/server/scripts/Spells/spell_priest.cpp         |    12 +\n src/server/scripts/Spells/spell_rogue.cpp          |    56 +\n src/server/scripts/Spells/spell_shaman.cpp         |   127 +\n src/server/scripts/Spells/spell_warlock.cpp        |     9 +\n src/server/scripts/Spells/spell_warrior.cpp        |     9 +\n src/server/shared/DataStores/DBCStructure.h        |     9 +-\n src/server/shared/DataStores/DBCfmt.h              |     2 +-\n src/server/shared/SharedDefines.h                  |     7 +\n src/server/worldserver/worldserver.conf.dist       |   765 +\n 212 files changed, 98696 insertions(+), 284 deletions(-)\n delete mode 100644 .circleci/config.yml\n create mode 100644 .github/workflows/clang-build.yml\n delete mode 100644 .github/workflows/issue-closer.yml\n delete mode 100644 .github/workflows/pr-labeler.yml\n create mode 100644 .github/workflows/windown-build.yml\n delete mode 100644 appveyor.yml\n create mode 100644 sql/Bots/locales/deDE/npc_text_locale.sql\n create mode 100644 sql/Bots/locales/esES/npc_text_locale.sql\n create mode 100644 sql/Bots/locales/esMX/npc_text_locale.sql\n create mode 100644 sql/Bots/locales/ruRU/npc_text_locale.sql\n create mode 100644 sql/Bots/locales/zhCN/creature_template_locale.sql\n create mode 100644 sql/Bots/locales/zhCN/npc_text_locale.sql\n create mode 100644 sql/Bots/locales/zhTW/npc_text_locale.sql\n create mode 100644 sql/base/auth_npcbots.sql\n create mode 100644 sql/base/characters_npcbots.sql\n create mode 100644 sql/base/world_npcbots.sql\n delete mode 100644 sql/custom/auth/.gitignore\n create mode 100644 sql/custom/auth/npcbot_2021_09_14_00_rbac_permissions.sql\n create mode 100644 sql/custom/auth/npcbot_2021_09_14_01_rbac_linked_permissions.sql\n create mode 100644 sql/custom/auth/npcbot_2021_12_29_00_rbac_permissions.sql\n create mode 100644 sql/custom/auth/npcbot_2021_12_29_01_rbac_linked_permissions.sql\n create mode 100644 sql/custom/auth/npcbot_2022_06_24_00_rbac_permissions.sql\n create mode 100644 sql/custom/auth/npcbot_2022_06_24_01_rbac_linked_permissions.sql\n create mode 100644 sql/custom/auth/npcbot_2022_07_04_00_rbac_permissions.sql\n create mode 100644 sql/custom/auth/npcbot_2022_07_04_01_rbac_linked_permissions.sql\n create mode 100644 sql/custom/auth/npcbot_2022_11_30_00_rbac_permissions.sql\n create mode 100644 sql/custom/auth/npcbot_2022_11_30_rbac_linked_permissions.sql\n create mode 100644 sql/custom/auth/npcbot_2023_08_12_00_rbac_linked_permissions.sql\n create mode 100644 sql/custom/characters/.dummy\n delete mode 100644 sql/custom/characters/.gitignore\n delete mode 100644 sql/custom/world/.gitignore\n create mode 100644 sql/custom/world/2026_03_28_00_command.sql\n create mode 100644 sql/custom/world/npcbot_2000_00_00_00_command.sql\n create mode 100644 sql/custom/world/npcbot_2000_00_00_00_creature_classlevelstats.sql\n create mode 100644 sql/custom/world/npcbot_2000_00_00_00_creature_equip_template.sql\n create mode 100644 sql/custom/world/npcbot_2000_00_00_00_creature_template.sql\n create mode 100644 sql/custom/world/npcbot_2000_00_00_00_npc_text.sql\n create mode 100644 src/server/game/AI/NpcBots/bot_Events.h\n create mode 100644 src/server/game/AI/NpcBots/bot_GridNotifiers.h\n create mode 100644 src/server/game/AI/NpcBots/bot_InstanceEvents.h\n create mode 100644 src/server/game/AI/NpcBots/bot_ai.cpp\n create mode 100644 src/server/game/AI/NpcBots/bot_ai.h\n create mode 100644 src/server/game/AI/NpcBots/bot_archmage_ai.cpp\n create mode 100644 src/server/game/AI/NpcBots/bot_bm_ai.cpp\n create mode 100644 src/server/game/AI/NpcBots/bot_crypt_lord_ai.cpp\n create mode 100644 src/server/game/AI/NpcBots/bot_dark_ranger_ai.cpp\n create mode 100644 src/server/game/AI/NpcBots/bot_death_knight_ai.cpp\n create mode 100644 src/server/game/AI/NpcBots/bot_dreadlord_ai.cpp\n create mode 100644 src/server/game/AI/NpcBots/bot_druid_ai.cpp\n create mode 100644 src/server/game/AI/NpcBots/bot_hunter_ai.cpp\n create mode 100644 src/server/game/AI/NpcBots/bot_mage_ai.cpp\n create mode 100644 src/server/game/AI/NpcBots/bot_necromancer_ai.cpp\n create mode 100644 src/server/game/AI/NpcBots/bot_paladin_ai.cpp\n create mode 100644 src/server/game/AI/NpcBots/bot_priest_ai.cpp\n create mode 100644 src/server/game/AI/NpcBots/bot_rogue_ai.cpp\n create mode 100644 src/server/game/AI/NpcBots/bot_sea_witch_ai.cpp\n create mode 100644 src/server/game/AI/NpcBots/bot_shaman_ai.cpp\n create mode 100644 src/server/game/AI/NpcBots/bot_spellbreaker_ai.cpp\n create mode 100644 src/server/game/AI/NpcBots/bot_sphynx_ai.cpp\n create mode 100644 src/server/game/AI/NpcBots/bot_warlock_ai.cpp\n create mode 100644 src/server/game/AI/NpcBots/bot_warrior_ai.cpp\n create mode 100644 src/server/game/AI/NpcBots/botcommands.cpp\n create mode 100644 src/server/game/AI/NpcBots/botcommon.h\n create mode 100644 src/server/game/AI/NpcBots/botconfig.cpp\n create mode 100644 src/server/game/AI/NpcBots/botconfig.h\n create mode 100644 src/server/game/AI/NpcBots/botdatamgr.cpp\n create mode 100644 src/server/game/AI/NpcBots/botdatamgr.h\n create mode 100644 src/server/game/AI/NpcBots/botdefine.h\n create mode 100644 src/server/game/AI/NpcBots/botdpstracker.cpp\n create mode 100644 src/server/game/AI/NpcBots/botdpstracker.h\n create mode 100644 src/server/game/AI/NpcBots/botdump.cpp\n create mode 100644 src/server/game/AI/NpcBots/botdump.h\n create mode 100644 src/server/game/AI/NpcBots/botgearscore.cpp\n create mode 100644 src/server/game/AI/NpcBots/botgearscore.h\n create mode 100644 src/server/game/AI/NpcBots/botgiver.cpp\n create mode 100644 src/server/game/AI/NpcBots/botgossip.h\n create mode 100644 src/server/game/AI/NpcBots/botlog.cpp\n create mode 100644 src/server/game/AI/NpcBots/botlog.h\n create mode 100644 src/server/game/AI/NpcBots/botmgr.cpp\n create mode 100644 src/server/game/AI/NpcBots/botmgr.h\n create mode 100644 src/server/game/AI/NpcBots/botspell.cpp\n create mode 100644 src/server/game/AI/NpcBots/botspell.h\n create mode 100644 src/server/game/AI/NpcBots/bottext.h\n create mode 100644 src/server/game/AI/NpcBots/botwanderful.cpp\n create mode 100644 src/server/game/AI/NpcBots/botwanderful.h\n create mode 100644 src/server/game/AI/NpcBots/bpet_ai.cpp\n create mode 100644 src/server/game/AI/NpcBots/bpet_ai.h\n create mode 100644 src/server/game/AI/NpcBots/bpet_archmage.cpp\n create mode 100644 src/server/game/AI/NpcBots/bpet_crypt_lord.cpp\n create mode 100644 src/server/game/AI/NpcBots/bpet_dark_ranger.cpp\n create mode 100644 src/server/game/AI/NpcBots/bpet_death_knight.cpp\n create mode 100644 src/server/game/AI/NpcBots/bpet_dreadlord.cpp\n create mode 100644 src/server/game/AI/NpcBots/bpet_druid.cpp\n create mode 100644 src/server/game/AI/NpcBots/bpet_hunter.cpp\n create mode 100644 src/server/game/AI/NpcBots/bpet_mage.cpp\n create mode 100644 src/server/game/AI/NpcBots/bpet_necromancer.cpp\n create mode 100644 src/server/game/AI/NpcBots/bpet_priest.cpp\n create mode 100644 src/server/game/AI/NpcBots/bpet_sea_witch.cpp\n create mode 100644 src/server/game/AI/NpcBots/bpet_shaman.cpp\n create mode 100644 src/server/game/AI/NpcBots/bpet_warlock.cpp\n create mode 100644 src/server/game/AI/NpcBots/lib/botlogtraits.h\n create mode 100644 src/server/game/AI/NpcBots/lib/bottraits.h\n\ndiff --git a/.circleci/config.yml b/.circleci/config.yml\ndeleted file mode 100644\nindex f83a427b49..0000000000\n--- a/.circleci/config.yml\n+++ /dev/null\n@@ -1,156 +0,0 @@\n-version: 2\n-jobs:\n-  codestyle_and_sql:\n-    docker:\n-      - image: trinitycore/circle-ci:debian-12-builder\n-        auth:\n-          username: $DOCKERHUB_USERNAME\n-          password: $DOCKERHUB_PASSWORD\n-      - image: cimg/mysql:8.0\n-        auth:\n-          username: $DOCKERHUB_USERNAME\n-          password: $DOCKERHUB_PASSWORD\n-        environment:\n-          MYSQL_ALLOW_EMPTY_PASSWORD: yes\n-          MYSQL_ROOT_PASSWORD: ''\n-          MYSQL_DATABASE: test_mysql\n-    steps:\n-      - run:\n-          name: Checkout\n-          command: |\n-            /scripts/checkout.sh\n-      - run:\n-          name: Codestyle checks\n-          command: |\n-            chmod +x contrib/check_codestyle.sh\n-            ./contrib/check_codestyle.sh\n-      - run:\n-          name: SQL checks\n-          command: |\n-            chmod +x contrib/check_updates.sh\n-            dockerize -wait tcp://127.0.0.1:3306 -timeout 120s\n-            mysql -h 127.0.0.1 -uroot < sql/create/create_mysql.sql\n-            mysql -h 127.0.0.1 -uroot auth < sql/base/auth_database.sql\n-            ./contrib/check_updates.sh auth 3.3.5 auth 127.0.0.1\n-            mysql -h 127.0.0.1 -uroot characters < sql/base/characters_database.sql\n-            ./contrib/check_updates.sh characters 3.3.5 characters 127.0.0.1\n-            mysql -h 127.0.0.1 -uroot world < sql/base/dev/world_database.sql\n-            cat sql/updates/world/3.3.5/*.sql | mysql -h 127.0.0.1 -uroot world\n-  pch:\n-    docker:\n-      - image: trinitycore/circle-ci:debian-12-builder\n-        auth:\n-          username: $DOCKERHUB_USERNAME\n-          password: $DOCKERHUB_PASSWORD\n-    steps:\n-      - run:\n-          name: Checkout\n-          command: |\n-            /scripts/checkout.sh\n-      - run:\n-          name: Setup\n-          command: |\n-            mkdir bin\n-            cd bin\n-            if [ \"$DOCKERHUB_PUSH_IMAGES\" == \"TRUE\" ]; then\n-              cmake ../ -DWITH_WARNINGS=1 -DWITH_COREDEBUG=0 -DUSE_COREPCH=1 -DUSE_SCRIPTPCH=1 -DTOOLS=1 -DSCRIPTS=static -DSERVERS=1 -DNOJEM=0 -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS=\"-Werror\" -DCMAKE_CXX_FLAGS=\"-Werror\" -DCMAKE_INSTALL_PREFIX=check_install -DCMAKE_INSTALL_RPATH=\\$ORIGIN/../lib -DBUILD_TESTING=1\n-            else\n-              cmake ../ -DWITH_WARNINGS=1 -DWITH_COREDEBUG=0 -DUSE_COREPCH=1 -DUSE_SCRIPTPCH=1 -DTOOLS=1 -DSCRIPTS=static -DSERVERS=1 -DNOJEM=0 -DCMAKE_BUILD_TYPE=Debug -DCMAKE_C_FLAGS=\"-Werror\" -DCMAKE_CXX_FLAGS=\"-Werror\" -DCMAKE_C_FLAGS_DEBUG=\"-DNDEBUG\" -DCMAKE_CXX_FLAGS_DEBUG=\"-DNDEBUG\" -DCMAKE_INSTALL_PREFIX=check_install -DCMAKE_INSTALL_RPATH=\\$ORIGIN/../lib -DBUILD_TESTING=1\n-            fi\n-            cd ..\n-      - run:\n-          name: Build\n-          command: |\n-            cd bin\n-            make -j 4 -k && make install\n-      - run:\n-          name: Unit tests\n-          command: |\n-            cd bin\n-            make test\n-      - run:\n-          name: Check executables\n-          command: |\n-            cd bin/check_install/bin\n-            ./authserver --version\n-            ./worldserver --version\n-      - setup_remote_docker:\n-          version: default\n-      - run:\n-          name: Create docker images\n-          command: |\n-            cd bin/check_install\n-            cp -r ../../contrib/Docker/* .\n-            cp -r ../../sql ./sql\n-            image_prefix=$(echo $CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJECT_REPONAME | tr '[:upper:]' '[:lower:]')\n-            echo $image_prefix\n-            docker build --file Dockerfile --force-rm --tag $image_prefix:$CIRCLE_SHA1 --tag $image_prefix:$(echo $CIRCLE_BRANCH | tr '/' '-' | tr '[:upper:]' '[:lower:]') .\n-            docker save $image_prefix | gzip > ../../docker.tar.gz\n-            if [ \"$DOCKERHUB_PUSH_IMAGES\" == \"TRUE\" ]; then\n-              if [ \"$CIRCLE_BRANCH\" == \"3.3.5\" ] || [ \"$CIRCLE_BRANCH\" == \"master\" ] || [ \"$CIRCLE_BRANCH\" == \"wotlk_classic\" ]; then\n-                docker login -u $DOCKERHUB_USERNAME -p $DOCKERHUB_PASSWORD\n-                echo \"Pushing docker image to dockerhub\"\n-                docker push --all-tags $image_prefix\n-              fi\n-            fi\n-      - store_artifacts:\n-          path: docker.tar.gz\n-  nopch:\n-    docker:\n-      - image: trinitycore/circle-ci:debian-12-builder\n-        auth:\n-          username: $DOCKERHUB_USERNAME\n-          password: $DOCKERHUB_PASSWORD\n-    steps:\n-      - run:\n-          name: Requirements\n-          command: |\n-            sudo mkdir -p /root/.ccache\n-            sudo chown -Rv circleci:circleci /root\n-      - run:\n-          name: Checkout\n-          command: |\n-            /scripts/checkout.sh\n-      - restore_cache:\n-          keys:\n-            - 3.3.5-nopch-{{ .Branch }}-{{ .Revision }}\n-            - 3.3.5-nopch-{{ .Branch }}\n-            - 3.3.5-nopch-3.3.5\n-      - run:\n-          name: Setup\n-          command: |\n-            export CCACHE_MAXSIZE=\"1G\"\n-            export CC=\"ccache clang\"\n-            export CXX=\"ccache clang++\"\n-            export CCACHE_CPP2=yes\n-            export USE_CCACHE=1\n-            export PATH=/usr/lib/ccache:$PATH\n-            export CCACHE_DIR=$HOME/.ccache\n-            ccache -z\n-            ccache -s\n-            git config user.email \"circleci@build.bot\" && git config user.name \"Circle CI\"\n-            $CXX --version\n-            mkdir bin\n-            cd bin\n-            cmake ../ -DWITH_WARNINGS=1 -DWITH_COREDEBUG=0 -DUSE_COREPCH=0 -DUSE_SCRIPTPCH=0 -DTOOLS=1 -DSCRIPTS=dynamic -DSERVERS=1 -DNOJEM=0 -DCMAKE_BUILD_TYPE=Debug -DCMAKE_C_FLAGS=\"-Werror\" -DCMAKE_CXX_FLAGS=\"-Werror\" -DCMAKE_C_FLAGS_DEBUG=\"-DNDEBUG\" -DCMAKE_CXX_FLAGS_DEBUG=\"-DNDEBUG\" -DCMAKE_INSTALL_PREFIX=check_install\n-            cd ..\n-      - run:\n-          name: Build\n-          command: |\n-            cd bin\n-            make -j 4 -k && make install\n-            ccache -s\n-            cd check_install/bin\n-            ./authserver --version\n-            ./worldserver --version\n-      - save_cache:\n-          key: 3.3.5-nopch-{{ .Branch }}-{{ .Revision }}\n-          paths:\n-            - /home/circleci/.ccache\n-workflows:\n-  version: 2\n-  build_all:\n-    jobs:\n-      - codestyle_and_sql\n-      - pch\n-      - nopch\ndiff --git a/.github/workflows/clang-build.yml b/.github/workflows/clang-build.yml\nnew file mode 100644\nindex 0000000000..632bbc85fa\n--- /dev/null\n+++ b/.github/workflows/clang-build.yml\n@@ -0,0 +1,80 @@\n+name: Clang\n+\n+on:\n+  push:\n+    branches:\n+      - 'npcbots_3.3.5'\n+      - 'CI'\n+  pull_request:\n+\n+concurrency:\n+  group: ${{ github.head_ref }} || concat(${{ github.ref }}, ${{ github.workflow }})\n+  cancel-in-progress: true\n+\n+jobs:\n+  build:\n+    runs-on: ubuntu-22.04\n+    strategy:\n+      matrix:\n+        include:\n+          - cc: clang-15\n+            cxx: clang++-15\n+            pch: 1\n+            launcher: \n+          - cc: clang-15\n+            cxx: clang++-15\n+            pch: 0\n+            launcher: ccache\n+    steps:\n+    - uses: actions/checkout@v4\n+    - name: Set strings cache\n+      id: strings\n+      shell: bash\n+      run: |\n+        echo \"build-start=$EPOCHSECONDS\" >> \"$GITHUB_OUTPUT\"\n+        echo \"build-output-dir=${{ github.workspace }}/bin\" >> \"$GITHUB_OUTPUT\"\n+        echo \"ccache-key-prefix=ubuntu-${{ matrix.cc }}-${{ github.base_ref || github.ref_name }}\" >> \"$GITHUB_OUTPUT\"\n+    - name: Dependencies\n+      run: |\n+        sudo apt-get update && sudo apt-get install -yq ccache libboost-dev libboost-filesystem-dev libboost-locale-dev libboost-program-options-dev libboost-regex-dev libboost-thread-dev libssl-dev libreadline-dev zlib1g-dev libbz2-dev\n+    - name: Restore nopch cache\n+      id: ccache-restore\n+      if: ${{ matrix.pch == '0' }}\n+      uses: actions/cache@v4\n+      with:\n+        path: ${{ github.workspace }}/.ccache\n+        key: ${{ steps.strings.outputs.ccache-key-prefix }}-${{ github.ref_name }}-${{ github.sha }}\n+        restore-keys: |\n+          ${{ steps.strings.outputs.ccache-key-prefix }}-${{ github.ref_name }}-\n+          ${{ steps.strings.outputs.ccache-key-prefix }}-\n+    - name: Setup\n+      env:\n+        CMAKE_BUILD_TYPE: Debug\n+        CMAKE_C_COMPILER_LAUNCHER: ${{ matrix.launcher }}\n+        CMAKE_CXX_COMPILER_LAUNCHER: ${{ matrix.launcher }}\n+        CC: /usr/bin/${{ matrix.cc }}\n+        CXX: /usr/bin/${{ matrix.cxx }}\n+      run: >\n+        cmake -GNinja -S ${{ github.workspace }} -B ${{ steps.strings.outputs.build-output-dir }}\n+        -DWITH_WARNINGS=1 -DWITH_WARNINGS_AS_ERRORS=1 -DWITH_COREDEBUG=0 -DUSE_COREPCH=${{ matrix.pch }} -DUSE_SCRIPTPCH=${{ matrix.pch }} -DTOOLS=1 -DSCRIPTS=dynamic -DSERVERS=1 -DNOJEM=0\n+        -DCMAKE_C_FLAGS_DEBUG=\"-DNDEBUG -g0\" -DCMAKE_CXX_FLAGS_DEBUG=\"-DNDEBUG -g0\"\n+        -DCMAKE_INSTALL_PREFIX=check_install -DBUILD_TESTING=1\n+    - name: Build\n+      env:\n+        CCACHE_BASEDIR: ${{ github.workspace }}\n+        CCACHE_DIR: ${{ github.workspace }}/.ccache\n+        CCACHE_CPP2: 1\n+      run: |\n+        ccache -z\n+        cmake --build ${{ steps.strings.outputs.build-output-dir }}\n+        ccache -s\n+        ccache --evict-older-than $(($EPOCHSECONDS - ${{ steps.strings.outputs.build-start }}))s\n+    - name: Unit tests\n+      run: |\n+        cmake --build ${{ steps.strings.outputs.build-output-dir }} --target test\n+    - name: Check executables\n+      run: |\n+        cmake --install ${{ steps.strings.outputs.build-output-dir }}\n+        cd ${{ github.workspace }}/check_install/bin\n+        ./authserver --version\n+        ./worldserver --version\ndiff --git a/.github/workflows/gcc-build.yml b/.github/workflows/gcc-build.yml\nindex 1f6ade7000..2becfb5fa7 100644\n--- a/.github/workflows/gcc-build.yml\n+++ b/.github/workflows/gcc-build.yml\n@@ -2,8 +2,15 @@ name: GCC\n \n on:\n   push:\n+    branches:\n+      - 'npcbots_3.3.5'\n+      - 'CI'\n   pull_request:\n \n+concurrency:\n+  group: ${{ github.head_ref }} || concat(${{ github.ref }}, ${{ github.workflow }})\n+  cancel-in-progress: true\n+\n jobs:\n   build:\n     runs-on: ubuntu-22.04\ndiff --git a/.github/workflows/issue-closer.yml b/.github/workflows/issue-closer.yml\ndeleted file mode 100644\nindex 9ec8b28c5d..0000000000\n--- a/.github/workflows/issue-closer.yml\n+++ /dev/null\n@@ -1,16 +0,0 @@\n-on:\n-  push:\n-    branches:\n-      - 3.3.5\n-\n-jobs:\n-  issue_closer:\n-    if: github.repository == 'TrinityCore/TrinityCore'\n-    runs-on: ubuntu-latest\n-    name: Issue Closer\n-    steps:\n-    - name: Issue Closer\n-      id: issue-closer\n-      uses: TrinityCore/GitHub-Actions@issue-closer-prod\n-      with:\n-        token: ${{ secrets.GITHUB_TOKEN }}\n\\ No newline at end of file\ndiff --git a/.github/workflows/pr-labeler.yml b/.github/workflows/pr-labeler.yml\ndeleted file mode 100644\nindex 88cfc15b40..0000000000\n--- a/.github/workflows/pr-labeler.yml\n+++ /dev/null\n@@ -1,14 +0,0 @@\n-on:\n-  pull_request_target:\n-    types: [opened]\n-\n-jobs:\n-  pr_labeler:\n-    runs-on: ubuntu-latest\n-    name: Pull Request Labeler\n-    steps:\n-    - name: Pull Request Labeler\n-      id: pr-labeler\n-      uses: TrinityCore/GitHub-Actions@pr-labeler-prod\n-      with:\n-        token: ${{ secrets.GITHUB_TOKEN }}\ndiff --git a/.github/workflows/windown-build.yml b/.github/workflows/windown-build.yml\nnew file mode 100644\nindex 0000000000..6a46662c48\n--- /dev/null\n+++ b/.github/workflows/windown-build.yml\n@@ -0,0 +1,102 @@\n+name: Windows\n+\n+on:\n+  push:\n+    branches:\n+      - 'npcbots_3.3.5'\n+      - 'CI'\n+  pull_request:\n+\n+concurrency:\n+  group: ${{ github.head_ref }} || concat(${{ github.ref }}, ${{ github.workflow }})\n+  cancel-in-progress: true\n+\n+jobs:\n+  build:\n+    runs-on: windows-latest\n+    env:\n+      CMAKE_BUILD_TYPE: RelWithDebInfo\n+      MYSQL_ROOT_DIR: C:/Program Files/MySQL/MySQL Server 8.0\n+      OPENSSL_ROOT_DIR: C:/libs/openssl\n+    steps:\n+    - uses: actions/checkout@v5\n+\n+    - name: Set reusable strings\n+      id: strings\n+      shell: bash\n+      run: |\n+        echo \"build-output-dir=${{ github.workspace }}/build\" >> \"$GITHUB_OUTPUT\"\n+\n+    - name: Get current OpenSSL version\n+      id: openssl-info\n+      run: |\n+        $VersionsUrl = \"https://api.github.com/repos/slproweb/opensslhashes/contents/win32_openssl_hashes.json\"\n+        $Headers = @{\n+          Accept=\"application/vnd.github.raw+json\"\n+          Authorization=\"Bearer ${{ secrets.GITHUB_TOKEN }}\"\n+        }\n+        $openSSL = (Invoke-RestMethod $VersionsUrl -Headers $Headers).files.PSObject.Properties |\n+          Select-Object -ExpandProperty Value |\n+          Where-Object { $_.arch -eq 'INTEL' } |\n+          Where-Object { $_.bits -eq '64' } |\n+          Where-Object { $_.light -eq $false } |\n+          Where-Object { $_.installer  -eq 'exe' } |\n+          Sort-Object -Descending @{ Expression = { [version]$_.basever } } |\n+          Select-Object -First 1\n+        [System.String]::Format(\"cache-key=openssl-{0}-win-{1}-{2}\", $openSSL.basever, $openSSL.arch, $openSSL.bits) >> $env:GITHUB_OUTPUT\n+        [System.String]::Format(\"url={0}\", $openSSL.url) >> $env:GITHUB_OUTPUT\n+\n+    - name: Cache OpenSSL\n+      id: cache-openssl\n+      uses: actions/cache@v4\n+      with:\n+        path: ${{ env.OPENSSL_ROOT_DIR }}\n+        key: ${{ steps.openssl-info.outputs.cache-key }}\n+\n+    - name: Download and install Openssl 3.x\n+      if: ${{ steps.cache-openssl.outputs.cache-hit != 'true' }}\n+      run: |\n+        (New-Object System.Net.WebClient).DownloadFile(\"${{ steps.openssl-info.outputs.url }}\", \"${{ env.TEMP }}\\openssl.exe\")\n+        Start-Process -Wait -FilePath \"${{ env.TEMP }}\\openssl.exe\" \"/SILENT\",\"/SP-\",\"/SUPPRESSMSGBOXES\",/DIR=${{ env.OPENSSL_ROOT_DIR }}\n+\n+        # Quick Openssl install test\n+        & ${{ env.OPENSSL_ROOT_DIR }}/bin/openssl.exe version\n+\n+    - name: Download and install Boost\n+      uses: MarkusJx/install-boost@v2\n+      id: install-boost\n+      with:\n+        boost_version: 1.84.0\n+        link: static\n+        platform_version: 2022\n+        toolset: msvc\n+\n+    - name: Initialize Visual Studio Environment\n+      uses: egor-tensin/vs-shell@v2\n+      with:\n+        arch: x64\n+\n+    - name: Configure CMake\n+      env:\n+        BOOST_ROOT: ${{ steps.install-boost.outputs.BOOST_ROOT }}\n+      run: >\n+        cmake -GNinja -S ${{ github.workspace }} -B ${{ steps.strings.outputs.build-output-dir }}\n+        -DWITH_WARNINGS_AS_ERRORS=ON -DTOOLS=ON\n+\n+    - name: Build\n+      run: |\n+        cmake --build ${{ steps.strings.outputs.build-output-dir }}\n+\n+    - name: Copy Dependencies\n+      run: |\n+        cd ${{ steps.strings.outputs.build-output-dir }}/bin/${{ env.CMAKE_BUILD_TYPE }}\n+        copy \"${{ env.MYSQL_ROOT_DIR }}/lib/libmysql.dll\" libmysql.dll\n+        copy \"${{ env.OPENSSL_ROOT_DIR }}/bin/libssl-3-x64.dll\" libssl-3-x64.dll\n+        copy \"${{ env.OPENSSL_ROOT_DIR }}/bin/libcrypto-3-x64.dll\" libcrypto-3-x64.dll\n+        copy \"${{ env.OPENSSL_ROOT_DIR }}/bin/legacy.dll\" legacy.dll\n+      \n+    - name: Check binaries\n+      run: |\n+        cd ${{ steps.strings.outputs.build-output-dir }}/bin/${{ env.CMAKE_BUILD_TYPE }}\n+        ./authserver --version\n+        ./worldserver --version\ndiff --git a/README.md b/README.md\nindex 99a4cce683..6ccb683011 100644\n--- a/README.md\n+++ b/README.md\n@@ -1,7 +1,5 @@\n # ![logo](https://trinitycore.org/images/logo2.png) TrinityCore (3.3.5)\n \n-[![Average time to resolve an issue](https://isitmaintained.com/badge/resolution/TrinityCore/TrinityCore.svg)](https://isitmaintained.com/project/TrinityCore/TrinityCore \"Average time to resolve an issue\") [![Percentage of issues still open](https://isitmaintained.com/badge/open/TrinityCore/TrinityCore.svg)](https://isitmaintained.com/project/TrinityCore/TrinityCore \"Percentage of issues still open\")\n-\n --------------\n \n \n@@ -19,13 +17,12 @@\n \n ## Build Status\n \n-master | 3.3.5 | cata_classic\n-:------------: | :------------: | :------------:\n-[![master Build Status](https://circleci.com/gh/TrinityCore/TrinityCore/tree/master.svg?style=shield)](https://circleci.com/gh/TrinityCore/TrinityCore/tree/master) | [![3.3.5 Build Status](https://circleci.com/gh/TrinityCore/TrinityCore/tree/3.3.5.svg?style=shield)](https://circleci.com/gh/TrinityCore/TrinityCore/tree/3.3.5) | [![cata_classic Build Status](https://circleci.com/gh/TrinityCore/TrinityCore/tree/cata_classic.svg?style=shield)](https://circleci.com/gh/TrinityCore/TrinityCore/tree/cata_classic)\n-[![master Build status](https://ci.appveyor.com/api/projects/status/54d0u1fxe50ad80o/branch/master?svg=true)](https://ci.appveyor.com/project/DDuarte/trinitycore/branch/master) | [![Build status](https://ci.appveyor.com/api/projects/status/54d0u1fxe50ad80o/branch/3.3.5?svg=true)](https://ci.appveyor.com/project/DDuarte/trinitycore/branch/3.3.5) | [![Build status](https://ci.appveyor.com/api/projects/status/54d0u1fxe50ad80o/branch/cata_classic?svg=true)](https://ci.appveyor.com/project/DDuarte/trinitycore/branch/cata_classic)\n-[![master GCC Build status](https://github.com/TrinityCore/TrinityCore/actions/workflows/gcc-build.yml/badge.svg?branch=master&event=push)](https://github.com/TrinityCore/TrinityCore/actions?query=workflow%3AGCC+branch%3Amaster+event%3Apush) | [![3.3.5 GCC Build status](https://github.com/TrinityCore/TrinityCore/actions/workflows/gcc-build.yml/badge.svg?branch=3.3.5&event=push)](https://github.com/TrinityCore/TrinityCore/actions?query=workflow%3AGCC+branch%3A3.3.5+event%3Apush) | [![cata_classic GCC Build status](https://github.com/TrinityCore/TrinityCore/actions/workflows/gcc-build.yml/badge.svg?branch=cata_classic&event=push)](https://github.com/TrinityCore/TrinityCore/actions?query=workflow%3AGCC+branch%3Acata_classic+event%3Apush)\n-[![master macOS arm64 Build status](https://github.com/TrinityCore/TrinityCore/actions/workflows/macos-arm-build.yml/badge.svg?branch=master&event=push)](https://github.com/TrinityCore/TrinityCore/actions?query=workflow%3AGCC+branch%3Amaster+event%3Apush) | | [![cata_classic macOS arm64 Build status](https://github.com/TrinityCore/TrinityCore/actions/workflows/macos-arm-build.yml/badge.svg?branch=cata_classic&event=push)](https://github.com/TrinityCore/TrinityCore/actions?query=workflow%3AGCC+branch%3Acata_classic+event%3Apush)\n-[![Coverity Scan Build Status](https://scan.coverity.com/projects/435/badge.svg)](https://scan.coverity.com/projects/435) | [![Coverity Scan Build Status](https://scan.coverity.com/projects/4656/badge.svg)](https://scan.coverity.com/projects/4656) |\n+[![Fetch status](https://github.com/trickerer/NPCBots-cron/actions/workflows/automerge.yml/badge.svg)](https://github.com/trickerer/NPCBots-cron/actions/workflows/automerge.yml)\n+\n+3.3.5\n+:------------:\n+[![GCC](https://github.com/trickerer/TrinityCore-3.3.5-with-NPCBots/actions/workflows/gcc-build.yml/badge.svg)](https://github.com/trickerer/TrinityCore-3.3.5-with-NPCBots/actions/workflows/gcc-build.yml)\n+[![Build status](https://ci.appveyor.com/api/projects/status/jck8c86eiti50v26/branch/npcbots_3.3.5?svg=true)](https://ci.appveyor.com/project/trickerer/trinitycore-3-3-5-with-npcbots/branch/npcbots_3.3.5)\n \n ## Introduction\n \n@@ -36,13 +33,9 @@ based on the code of that project with extensive changes over time to optimize,\n improve and cleanup the codebase at the same time as improving the in-game\n mechanics and functionality.\n \n-It is completely open source; community involvement is highly encouraged.\n-\n-If you wish to contribute ideas or code, please visit our site linked below or\n-make pull requests to our [Github repository](https://github.com/TrinityCore/TrinityCore/pulls).\n+[NPCBots](https://github.com/trickerer/Trinity-Bots) is TrinityCore mod.\n \n-For further information on the TrinityCore project, please visit our project\n-website at [TrinityCore.org](https://www.trinitycore.org).\n+It is completely open source; community involvement is highly encouraged.\n \n ## Requirements\n \n@@ -53,27 +46,22 @@ Windows, Linux and macOS.\n \n ## Install\n \n-Detailed installation guides are available in the [wiki](https://trinitycore.info/en/home) for\n+Detailed TrinityCore installation guides are available in the [wiki](https://trinitycore.info/en/home) for\n Windows, Linux and macOS.\n+NPCBots installation guide is available in the [NPCBots Readme](https://github.com/trickerer/Trinity-Bots#npcbot-mod-installation).\n \n \n ## Reporting issues\n \n-Issues can be reported via the [Github issue tracker](https://github.com/TrinityCore/TrinityCore/labels/Branch-3.3.5a).\n+NPCBots issues can be reported via the [Github issue tracker](https://github.com/trickerer/Trinity-Bots/issues/).\n \n Please take the time to review existing issues before submitting your own to\n prevent duplicates.\n \n-In addition, thoroughly read through the [issue tracker guide](https://community.trinitycore.org/topic/37-the-trinitycore-issuetracker-and-you/) to ensure\n-your report contains the required information. Incorrect or poorly formed\n-reports are wasteful and are subject to deletion.\n-\n \n ## Submitting fixes\n \n-C++ fixes are submitted as pull requests via Github. For more information on how to\n-properly submit a pull request, read the [how-to: maintain a remote fork](https://community.trinitycore.org/topic/9002-howto-maintain-a-remote-fork-for-pull-requests-tortoisegit/).\n-For SQL only fixes, open a ticket; if a bug report exists for the bug, post on an existing ticket.\n+C++ fixes are submitted as [pull requests](https://github.com/trickerer/TrinityCore-3.3.5-with-NPCBots/pulls).\n \n \n ## Copyright\n@@ -90,7 +78,8 @@ Read file [AUTHORS](AUTHORS).\n \n ## Links\n \n-* [Website](https://www.trinitycore.org)\n-* [Wiki](https://www.trinitycore.info)\n-* [Forums](https://talk.trinitycore.org/)\n-* [Discord](https://discord.trinitycore.org/)\n+* [NPCBots Readme](https://github.com/trickerer/Trinity-Bots/)\n+* [TrinityCore Website](https://www.trinitycore.org)\n+* [TrinityCore Wiki](https://www.trinitycore.info)\n+* [TrinityCore Forums](https://talk.trinitycore.org/)\n+* [TrinityCore Discord](https://discord.trinitycore.org/)\ndiff --git a/appveyor.yml b/appveyor.yml\ndeleted file mode 100644\nindex 515937d18a..0000000000\n--- a/appveyor.yml\n+++ /dev/null\n@@ -1,44 +0,0 @@\n-version: 1.0.{build}\n-image: Visual Studio 2022\n-clone_depth: 1\n-init:\n-- ps: ''\n-environment:\n-  BOOST_ROOT: C:\\Libraries\\boost_1_85_0\n-  MYSQL_ROOT_DIR: C:\\Program Files\\MySQL\\MySQL Server 8.0\n-  OPENSSL_ROOT_DIR: C:\\OpenSSL-v32-Win64\n-build_script:\n-- cmd: >-\n-    git config user.email \"appveyor@build.bot\" && git config user.name \"AppVeyor\"\n-\n-    md build && cd build\n-\n-    cmake -G\"Visual Studio 17 2022\" -A x64 -DSCRIPTS=dynamic -DTOOLS=True -DCMAKE_CXX_FLAGS=\" /DWIN32 /D_WINDOWS /W3 /GR /EHsc /WX\" -DCMAKE_C_FLAGS=\"/DWIN32 /D_WINDOWS /W3 /WX\" ..\n-\n-    \"C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\MSBuild\\Current\\Bin\\MSBuild.exe\" /nologo /m:2 /p:Configuration=RelWithDebInfo /p:Platform=\"X64\" /verbosity:minimal /logger:\"C:\\Program Files\\AppVeyor\\BuildAgent\\Appveyor.MSBuildLogger.dll\" \"TrinityCore.sln\"\n-\n-    cd bin\\RelWithDebInfo\\\n-\n-    copy \"%MYSQL_ROOT_DIR%\\lib\\libmysql.dll\" libmysql.dll\n-\n-    copy \"%OPENSSL_ROOT_DIR%\\libssl-3-x64.dll\" libssl-3-x64.dll\n-\n-    copy \"%OPENSSL_ROOT_DIR%\\libcrypto-3-x64.dll\" libcrypto-3-x64.dll\n-\n-    copy \"%OPENSSL_ROOT_DIR%\\bin\\legacy.dll\" legacy.dll\n-\n-    cd ..\n-\n-    7z a TrinityCoreWin64VS2022.zip .\\RelWithDebInfo\\*\n-\n-    del /F /Q /S \"RelWithDebInfo\\*.pdb\" > NUL\n-\n-    7z a TrinityCoreWin64VS2022NoSymbols.zip .\\RelWithDebInfo\\*\n-\n-test: off\n-artifacts:\n-- path: build\\bin\\TrinityCoreWin64VS2022.zip\n-  name: TrinityCoreWin64VS2022\n-\n-- path: build\\bin\\TrinityCoreWin64VS2022NoSymbols.zip\n-  name: TrinityCoreWin64VS2022NoSymbols\ndiff --git a/sql/Bots/locales/deDE/npc_text_locale.sql b/sql/Bots/locales/deDE/npc_text_locale.sql\nnew file mode 100644\nindex 0000000000..d2a6f6be4c\n--- /dev/null\n+++ b/sql/Bots/locales/deDE/npc_text_locale.sql\n@@ -0,0 +1,409 @@\n+DELETE FROM `npc_text_locale` WHERE `Locale`='deDE' AND `ID` BETWEEN '70000' AND '71000';\n+INSERT INTO `npc_text_locale` (`ID`, `Locale`, `Text0_0`, `Text0_1`, `Text1_0`, `Text1_1`, `Text2_0`, `Text2_1`, `Text3_0`, `Text3_1`, `Text4_0`, `Text4_1`, `Text5_0`, `Text5_1`, `Text6_0`, `Text6_1`, `Text7_0`, `Text7_1`)\n+VALUES\n+('70001','deDE','Ich lebe nur um dem Meister zu dienen.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70002','deDE','Brauchst du etwas?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70003','deDE','Sterbliche... Normalerweise töte ich Abschaum wie euch auf den ersten Blick.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70004','deDE','<Du siehst etwas, das ein Obsidian-Zerstörer sein soll. Dieser sieht jedoch anders aus, beschädigt und verblasst, und er reagiert nicht auf deine Anwesenheit. Du erinnerst dich, dass die Geißel irgendwann in der Vergangenheit ihre eigenen Versionen davon benutzt haben. Wie zum Teufel ist es hierher gekommen? Nach einer weiteren Untersuchung bemerkst du eine Öffnung auf dem Rücken der Kreatur.>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70005','deDE','<Obsidischan-Zerstörer starrt dich an und gibt ein leises Knurren von sich.>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70006','deDE','Bist du überrascht, Sterblicher? Als unbedeutenderer Nathrezim muss ich mir Verbündete suchen. Du siehst aus, als könntest du mich zumindest unterhalten.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70007','deDE','Was ist es diesmal, Sterblicher?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70008','deDE','Kannst du mich einfach in Ruhe lassen? <seufz>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70009','deDE','Was nun?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70010','deDE','<Du siehst eine ausgemergelte Naga-Matrone. Sie sieht müde und schwach aus und vermeidet es, dich anzusehen.>$B$BS-s-s-spare die Worte, Sterblicher...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70011','deDE','Habe ich wieder meine Haare durcheinander gebracht? <Sie bürstet ihr \"Haar\">$B...Nein, habe ich nicht. Was ist es dann?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70012','deDE','<Der vom Kampf vernarbte Gruftlord steht vor dir, er ist offensichtlich unkontrolliert. Ohne seinen Meister hat dieser mächtige untote nerubische Fürst den größten Teil seiner Macht verloren>$B$BWas wird es sein, kleine Kreatur? Dein Fleisch wird wie jedes andere sein...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70013','deDE','Ich verzehre die Lebenden und die Toten.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70101','deDE','|cffff3300Klingenmeister|r$b|cffdd6600-=Warcraft III Tribut=-|r$B$B \"Ein Elite-Schwertkämpfer, ehemaliges Mitglied des Clans der Brennenden Klinge, jetzt ein Elite-Kämpfer der Horde\".$B$BHauptattribut: Beweglichkeit.$B$BNetherlauf (Windlauf). Ermöglicht es dem Blademaster, unsichtbar zu werden und sich für eine bestimmte Zeit schneller zu bewegen. Wenn der Klingenmeister eine Einheit angreift, um die Unsichtbarkeit zu durchbrechen, verursacht er zusätzlichen Schaden.$B$BSpiegelbild. Verwirrt den Feind, indem er Illusionen des Klingenmeisters erzeugt und alle auf den Klingenmeister wirkende Zauber bannt.$B$BKritischer Schlag (passiv). Gewährt eine 15%ige Chance, mit seinen Angriffen das 2(3,4)-fache des normalen Schadens als kritisch zu verursachen.$B$BKlingensturm (NYI). Gewährt Immunität gegen Magie und fügt allen umstehenden Feinden Schaden zu.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70102','deDE','|cff9900ccObsidian Zerstörer|r$b|cffdd6600-=Warcraft III Tribut=-|r$B$B \"Ein geflügeltes Monstrum aus Obsidian mit unstillbarem Hunger nach Magie\". $B$BHohe Rüstung, sehr hohe Resistenzen, teilweise immun gegen Magie, verliert mit der Zeit Mana und profitiert nicht von passiven Manaregenerationseffekten, Kettenhemd/Plattenrüstung, zwei Zauberstäbe, verursacht Schattenzauber-Schaden, kein physischer Angriff, kann keine Gegner angreifen, die sich nicht in der Nähe befinden, während er sich bewegt, Zauberkraft-Bonus: 50% Angriffskraft + 200% Intellekt + Zauberstab-Schaden.$B$BMagie verschlingen. Entfernt bis zu 2 magische Effekte von Gegnern, bis zu 2 magische Effekte und bis zu 2 Flüche von Verbündeten und Schaden verursachende beschworene Einheiten im Umkreis von 20 Metern. Jeder gebannte Effekt stellt 20% Mana und 5% Gesundheit wieder her, 7 Sekunden Abklingzeit.$B$BSchattenschlag. Verstärkter Angriff, der erhöhten Splash-Schaden verursacht.$B$BMana entziehen. Entzieht einer zufälligen befreundeten Einheit das gesamte Mana (begrenzt durch den Manapool des Zaubernden).$B$BMana auffrischen. Versorgt umstehende Gruppen- und Schlachtzugsmitglieder im Umkreis von 25 Metern mit 3% ihres maximalen Manas, wobei das Mana des Zaubernden annulliert wird, 3 Sekunden Abklingzeit.$B$BRegenerierende Aura. Heilt Gruppen- und Schlachtzugsmitglieder im Umkreis von 25 Metern um 3% ihrer maximalen Gesundheit und macht das Mana des Zaubernden zunichte, 3 Sekunden Abklingzeit.$B$BSchattenrüstung (passiv). Stellt Mana in Höhe eines Prozentsatzes des erlittenen Schadens wieder her.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70103','deDE','|cff0000ddErzmagier|r$b|cffdd6600-=Warcraft III Tribut=-|r$B$BSZauberschaden um 35% reduziert, teilweise immun gegen Kontrolleffekte, Stoffrüstung, verursacht Feuerzauber/Frostzauber Schaden, kein physischer Angriff, Zaubermachtbonus: 100% Intelligenz. Hauptattribut: Intelligenz.$B$BBlizzard. Ein typischer Blizzard, nur etwas mächtiger, 6 Sekunden Abklingzeit.$B$BWasserelementar beschwören. Beschwört ein Wasserelementar, das die Feinde des Erzmagiers 1 Minute lang angreift, 20 Sekunden Abklingzeit.$B$BBrillianz Aura. Erhöht das maximale Mana um 10% und erhöht die Manaregeneration von Gruppen- und Schlachtzugsmitgliedern im Umkreis von 40 Metern erheblich.$B$BMassenteleport. NYI.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70104','deDE','|cff9900ccSchreckenslord|r$b|cffdd6600-=Warcraft III Tribut=-|r$B$B\"|Unglaublich mächtiger Dämon, der die Macht der Finsternis und geistige Beherrschung ausübt\".$B$BHohe Rüstung, hohe Resistenzen, teilweise immun gegen Kontrolleffekte, erlittener Schaden beschleunigt die Wiederaufladung von Zaubern, Plattenrüstung, verursacht Nahkampf-/Schattenzauberschaden, Bonusschaden gegen kampfunfähige Ziele, Bonus auf Zaubermacht: 200% Stärke. Hauptattribut: Stärke.$B$BAasschwarm. Schickt eine Horde Fledermäuse in Kombination mit Chaos Magie, um Gegnern in einem sehr großen Frontalkegel Schaden zuzufügen, kann nicht kritisch sein, 10 Sekunden Abklingzeit.$B$BSchlaf. Versetzt das gegnerische Ziel für 60 Sekunden in Schlaf und ermöglicht es, dass der nächste physische Angriff auf dieses Ziel die Rüstung umgeht, direkter verursachter Schaden weckt das Ziel auf, 6 Sekunden Abklingzeit.$B$BVampirische Aura. Erhöht physischen kritischen Schaden um 5% und heilt Gruppen- und Schlachtzugsmitglieder im Umkreis von 40 Metern um einen bestimmten Prozentsatz (100% für den Schreckenslord und 25% für alle anderen) des durch physische Nahkampfangriffe und Aasschwarm verursachten Schadens, keine Bedrohung.$B$BSBeschwörung eines Höllendieners. Ruft einen Höllendiener vom Himmel, der Schaden verursacht und gegnerische Einheiten betäubt. Der Höllendiener ist sehr resistent gegen Magie und hält 180 Sekunden lang, 180 Sekunden Abklingzeit.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70105','deDE','|cff0000ddZauberbrecher|r$b|cffdd6600-=Warcraft III Tribut=-|r$B$B\"Ein elfischer Krieger, der darauf trainiert ist, magische Energien zu unterbrechen und zu verzerren\".$B$BSZauberschaden um 75% reduziert, teilweise immun gegen Kontrolleffekte, Rüstungsabzug -30%, Ketten-/Panzerrüstung, verursacht Nahkampf-/Arkanschaden, Zaubermachtbonus: 200% Stärke. Hauptattribut: Stärke.$B$BMagie stehlen (Zauberraub). Stiehlt einem Feind einen nützlichen Zauber und wendet ihn auf einen Verbündeten in der Nähe an oder entfernt einen negativen Zauber von einem Verbündeten und wendet ihn auf einen Feind in der Nähe an, wirkt auf Magie- und Fluch-Effekte, 2 Sekunden Abklingzeit.$B$BRückkopplung (passiv). Erfolgreiche Nahkampfangriffe verbrennen das Mana des Ziels in Höhe des verursachten Schadens (erhöht durch Zaubermacht) und verursachen arkanen Schaden. Wenn das Mana des Ziels aufgebraucht ist, verursachen die Nahkampfangriffe von Zauberbrecher dreifachen Schaden mit erhöhter Chance auf einen kritischen Treffer. Wenn das Ziel kein Mana hat, erhält der Zauberbrecher Mana in Höhe von 25% des verursachten Schadens.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70106','deDE','|cff9900ccDunkler Waldläufer|r$b|cffdd6600-=Warcraft III Tribut=-|r$B$B\"Ein ehemaliger Waldläufer von Quel Thalas, der gewaltsam von den Toten auferweckt wurde.\"$B$BSZauberschaden um 35% reduziert, untot, teilweise immun gegen Kontrolleffekte, Leder-/Stoffrüstung, verursacht physischen/zauberhaften Schattenschaden, haftet an Schatten und stellt keine Bedrohung dar, Zauberkraftbonus: 50% Intelligenz. Hauptattribut: Beweglichkeit.$B$BStille. Bringt einen Gegner und bis zu 4 Ziele in der Nähe 8 Sekunden lang zum Schweigen, 15 Sekunden Abklingzeit.$B$BBSchwarzer Pfeil. Feuert einen verfluchten Pfeil ab, der 150% Waffenschaden und zusätzlichen Schattenzauberschaden über Zeit verursacht. Wenn das betroffene Ziel durch den Schaden des dunklen Waldläufers stirbt, spawnen aus der Leiche dunkle Schergen (maximal 5 Schergen, 80 Sekunden Dauer, funktioniert nur bei Humanoiden, Bestien und Drachenkin). Verursacht fünfmal mehr Schaden, wenn das Ziel weniger als 20% Gesundheit hat.$B$BLebensentzug. Entzieht einem Feind 5 Sekunden lang jede Sekunde Leben und heilt den dunklen Waldläufer für 200% der entzogenen Menge.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70107','deDE','|cff9900ccTotenbeschwörer|r$b|cffdd6600-=Warcraft III / Diablo II Tribut=-|r$B$BSZauberschaden um 20% reduziert, teilweise immun gegen Kontrolleffekte, Stoffrüstung, verursacht Zauberschattenschaden, kein physischer Angriff, Zaubermachtbonus: 100% Intelligenz. Hauptattribut: Intelligenz.$B$BRaise Dead. Erweckt 2 Skelette aus einer Leiche (maximal 6 Skelette, 65 Sekunden Dauer, funktioniert nur bei Humanoiden, Bestien und Drachenkin).$B$BUnheilige Raserei. Erhöht das Nahkampfangriffstempo des Ziels um 75%, entzieht ihm aber ständig Lebenspunkte. Hält 45 Sekunden lang an. Kann nicht abgebrochen werden. Wird auf Stufe 30 freigeschaltet.$B$BCorpse Explosion. Lässt eine Leiche explodieren und fügt allen umstehenden Gegnern Schaden in Höhe von 35% bis 75% der maximalen Lebenspunkte der toten Einheit zu (abhängig von der Stufe des Nekromanten). Dieser Schaden erzeugt keine Bedrohung. Wird auf Stufe 40 freigeschaltet.$B$BCVerkrüppeln. Verringert das Bewegungstempo, das Nahkampfangriffstempo und die Gesamtstärke des Ziels 60 Sekunden lang um 50%. Wird auf Stufe 50 freigeschaltet.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70108','deDE','|cff0000ddMeereshexe|r$b|cffdd6600-=Warcraft III Tribut=-|r$B$B\"Eine bösartige, schuppige Meeresbewohnerin, die oft mit dem Aufkommen gewaltiger Stürme in Verbindung gebracht wird.\" $B$BSZauberschaden um 30% reduziert, teilweise immun gegen Kontrolleffekte, Stoffrüstung, verursacht physischen Schaden, Zauberfrost und Zaubersturm, Angriffskraftbonus: Beweglichkeit x2, Zauberkraftbonus: 200% Intelligenz. Hauptattribut: Intelligenz.$B$BGabelblitzschlag. Ruft einen Blitzkegel herbei, um Feinden Schaden zuzufügen. Trifft 2 bis alle Ziele (je nach Stufe der Meerhexe) und betäubt sie 2 Sekunden lang. Dieser Schaden erzeugt keine Bedrohung.$B$BFrostpfeile. Durchtränkt Pfeile mit Frostzauber für zusätzlichen Schaden und verlangsamt die Bewegungs-, Angriffs- und Wirkgeschwindigkeit des Ziels um 30% bis 70% (abhängig von der Stufe der Meereshexe).$B$BMana-Schild. Erzeugt einen Schild, der 100% des eingehenden (nicht gemilderten) Schadens absorbiert, indem er das Mana der Meerhexe verwendet. Die Wirkung reicht von 1 Schaden pro 10 Mana bis 10 Schaden pro 1 Mana (je nach Stufe der Meereshexe).$B$BTornado. Beschwört einen heftigen Tornado, der gegnerische Einheiten in der Nähe beschädigt und verlangsamt, manchmal sogar komplett außer Gefecht setzt. Der Tornado wächst im Freien mit der Zeit und erhöht den verursachten Schaden und den Wirkungsbereich, schrumpft aber in geschlossenen Räumen und löst sich schnell auf. Wird auf Stufe 60 freigeschaltet.$B$BNaga (Passiv). Schwimmgeschwindigkeit, Schaden und Ausweichchance werden im Wasser stark erhöht.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70109','deDE','|cff9900ccGruftlord|r$b|cffdd6600-=Warcraft III Tribut=-|r$B$B\"Uraltes Ungetüm, einst einer der Könige von Azjol-Nerub, jetzt ein untotes Monster in den Reihen der mächtigsten Krieger des Lichkönigs\".$B$BSehr hohe Rüstung, erhöhte Resistenzen, teilweise immun gegen Steuerungseffekte, immun gegen Gifteffekte, Kettenhemd/Plattenrüstung, verursacht Nahkampf-/Zauberschattenschaden, Zauberkraftbonus: 200% Stärke. Hauptattribut: Stärke.$B$BImpale. Der Gruftlord schlägt mit seinen massiven Klauen auf den Boden und schießt Stacheln in einem frontalen Kegel aus, die Schaden verursachen und feindliche Einheiten in die Luft schleudern, um sie zu betäuben. Wird auf Stufe 20 freigeschaltet.$B$BSpitzenpanzer. Der Chitinpanzer des Crypt Lords erhöht die Schadensresistenz und fügt gegnerischen Nahkämpfern 15% bis 50% Schaden zu.$B$BAaskäfer. Der Gruftlord generiert aus der frischen Leiche eines Feindes einen Aaskäfer, der seine Feinde angreift. Die Käfer sind permanent, regenerieren aber keine Gesundheit und es können nur 6 gleichzeitig kontrolliert werden. Höhere Stufen erlauben es dem Gruftlord, mächtigere Käfer zu beschwören. Wird auf Stufe 10 freigeschaltet.$B$BLKäferschwarm. Der Gruftlord lässt einen Schwarm von 20-40 (hängt von der Stufe des Crypt Lords ab) wütenden Heuschrecken frei, die in der Nähe befindliche feindliche Einheiten beißen und zerreißen, wodurch deren Bewegungs- und Angriffsfähigkeit eingeschränkt wird. Während sie das gegnerische Fleisch verzehren, wandeln sie es in eine Substanz um, die dem Gruftlord bei seiner Rückkehr Trefferpunkte zurückgibt. Wird auf Stufe 40 freigeschaltet.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70201','deDE','Es gibt immer Leute, die bereit sind, für Geld zu töten.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70202','deDE','Söldner sind immer gefragt. Hier ist, was im Moment verfügbar ist:',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70203','deDE','Söldner sind immer gefragt. Hier ist, was im Moment verfügbar ist:',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70204','deDE','Im Moment scheint niemand verfügbar zu sein, schauen Sie später noch einmal nach.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70300','deDE','Stirb!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70301','deDE','Belebe dich wieder',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70302','deDE','Wiederbelebe  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70303','deDE','dein bot',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70304','deDE',' Bot',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70305','deDE','Ich kann noch kein Wasser herbeizaubern',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70306','deDE','Ich kann noch kein Essen herbeizaubern',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70307','deDE','Ich kann das jetzt nicht tun',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70308','deDE','Bitte sehr...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70309','deDE','Deaktiviert',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70310','deDE','Noch nicht bereit',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70311','deDE','Ungültiger Objekttyp',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70312','deDE','Fehlgeschlagen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70313','deDE','Erledigt',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70314','deDE','Ich bin nicht gestaltgewandelt',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70315','deDE','Ich habe keinen Gesundheitsstein',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70316','deDE','Ich kann noch keine Gesundheitssteine erstellen!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70317','deDE','WTF Ich kann keine Schlösser knacken!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70318','deDE','Mein Fähigkeitslevel ist nicht hoch genug',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70319','deDE','Ich ändere meine Talente zu ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70320','deDE','Waffen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70321','deDE','Furor',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70322','deDE','Schutz',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70323','deDE','Vergeltung',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70324','deDE','Tierherrschaft',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70325','deDE','Treffsicherheit',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70326','deDE','Überleben',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70327','deDE','Meucheln',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70328','deDE','Kampf',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70329','deDE','Täuschung',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70330','deDE','Disziplin',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70331','deDE','Heilig',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70332','deDE','Schatten',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70333','deDE','Blut',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70334','deDE','Frost',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70335','deDE','Unheilig',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70336','deDE','Elementar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70337','deDE','Verstärkung',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70338','deDE','Wiederherstellung',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70339','deDE','Arkan',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70340','deDE','Feuer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70341','deDE','Gebrechen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70342','deDE','Dämonologie',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70343','deDE','Zerstörung',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70344','deDE','Gleichgewicht',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70345','deDE','Widlheit',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70346','deDE','Unbekannt',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70347','deDE','Verschwinde, Schwächling',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70348','deDE',' ist nicht überzeugt',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70349','deDE','Ich werde meine Zeit nicht mit irgendetwas verschwenden.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70350','deDE','NYI',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70351','deDE','NYI',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70352','deDE','NYI',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70353','deDE','Ich bin bereit',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70354','deDE','Geh weg. Ich diene meinem Herrn  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70355','deDE','unbekannt',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70356','deDE',' auf dich!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70357','deDE',' auf mich!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70358','deDE',' auf ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70359','deDE',' benutzt!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70360','deDE','bot tank',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70361','deDE','Klasse',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70362','deDE','Spieler',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70363','deDE','Meister',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70364','deDE','nichts',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70365','deDE','Rang',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70366','deDE','Talent',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70367','deDE','Passiv',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70368','deDE','versteckt',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70369','deDE','bekannt',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70370','deDE','Fähigkeit',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70371','deDE','Str',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70372','deDE','Bew',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70373','deDE','Aus',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70374','deDE','Int',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70375','deDE','Wil',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70376','deDE','unk stat',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70377','deDE','Gesamt',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70378','deDE','Nahkampf AP',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70379','deDE','Distanz AP',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70380','deDE','Rüstung',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70381','deDE','Krit',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70382','deDE','Verteidigung',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70383','deDE','Verfehlen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70384','deDE','Ausweichen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70385','deDE','Parrieren',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70386','deDE','Blocken',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70387','deDE','Blockwert',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70388','deDE','Schaden erhalten Nahkampf',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70389','deDE','Schaden erhalten Zauber',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70390','deDE','Schadensreichweite Waffenhand',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70391','deDE','Schadensmultiplikator Waffenhand',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70392','deDE','Angriffszeit Waffenahnd',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70393','deDE','Schadensreichweite Schildhand',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70394','deDE','Schadensmultiplikator Schildhand',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70395','deDE','Angriffszeit Schildhand',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70396','deDE','Schadensreichweite Distanz',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70397','deDE','SchadensmultiplikatorDistanz',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70398','deDE','Angriffszeit Distanz',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70399','deDE','min',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70400','deDE','max',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70401','deDE','DPS',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70402','deDE','Grundlegende HP',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70403','deDE','Gesamt HP',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70404','deDE','Grundlegendes Mana',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70405','deDE','Gesamt Mana',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70406','deDE','Aktuelles Mana',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70407','deDE','Zaubermacht',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70408','deDE','Leben alle 5 Sekunden bonus',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70409','deDE','Mana alle 5 Sekunden ohne Zaubern',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70410','deDE','Mana alle 5 Sekunden beim Zaubern',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70411','deDE','Tempo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70412','deDE','Trefferwertung',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70413','deDE','Waffenkunde',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70414','deDE','Rüstungsdurchschlag',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70415','deDE','Zauberdurchschlag',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70416','deDE','%',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70417','deDE','Heilig',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70418','deDE','Feuer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70419','deDE','Natur',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70420','deDE','Frost',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70421','deDE','Schatten',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70422','deDE','Arkan',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70423','deDE','Resistenz',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70424','deDE','Befehlszustand',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70425','deDE','Folgen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70426','deDE','Angreifen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70427','deDE','Warten',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70428','deDE','Zurücksetzen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70429','deDE','Vollständig stoppen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70430','deDE','Folgeabstand',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70431','deDE','Spezifikation',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70432','deDE','Hauptaufgabe des Bots',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70433','deDE','Bot Sammelrolle',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70434','deDE','PvP Tötungen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70435','deDE','Spieler',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70436','deDE','Gestorben ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70437','deDE',' mal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70438','deDE','%s (Bot) beruhigt sich wieder',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70439','deDE','<Debug>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70440','deDE','Bist du sicher, dass du es riskieren willst  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70441','deDE',' Aufmerksamkeit?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70442','deDE','<Geld einwerfen>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70443','deDE','Möchtest du anlocken ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70444','deDE','<Versuche ein Angebot zu machen>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70445','deDE','Möchtest du folgendes anheuern ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70446','deDE','<Bot anheuern>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70447','deDE','Ausrüstung verwalten...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70448','deDE','Rollen verwalten...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70449','deDE','Formation verwalten...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70450','deDE','Fähigkeiten verwalten...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70451','deDE','Talente verwalten...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70452','deDE','Verbrauchsgüter geben...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70453','deDE','<Gruppe erstellen>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70454','deDE','<Gruppe erstellen (alle Bots)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70455','deDE','<Zur Gruppe hinzufügen>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70456','deDE','<Alle Bots zur Gruppe hinzufügen>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70457','deDE','<Aus der Gruppe entfernen>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70458','deDE','Folge mir',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70459','deDE','Halte deine Position',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70460','deDE','Bleibe hier und tue nichts',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70461','deDE','Ich brauche Essen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70462','deDE','Ich brauche was zu trinken',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70463','deDE','Ich brauche einen gedeckten Tisch',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70464','deDE','Hilf mir ein Schloss zu knacken',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70465','deDE','Ich brauche einen Gesundheitsstein',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70466','deDE','Ich brauche einen Seelenbrunnen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70467','deDE','Frische deine Gifte auf',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70468','deDE','<Gift auswählen (Waffenhand)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70469','deDE','<Gift auswählen (Schildhand)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70470','deDE','Ich möchte Verzauberungen erneuern',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70471','deDE','<Verzauberung auswählen (Waffenhand)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70472','deDE','<Verzauberung auswählen (Schildhand)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70473','deDE','Entferne deine Gestaltwandlung',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70474','deDE','<Haustierart auswählen>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70475','deDE','Du bist entlassen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70476','deDE','Willst du aufgeben ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70477','deDE','Du wirst es vielleicht bereuen...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70478','deDE','Reiß dich zusammen, verdammt noch mal!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70479','deDE','<Studiere die Kreatur>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70480','deDE','Vergiss es',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70481','deDE','Distanz',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70482','deDE','ZURÜCK',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70483','deDE','<Automatisch>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70484','deDE','<Nichts>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70485','deDE','Zufällig (Gerissenheit)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70486','deDE','Zufällig (Wildheit)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70487','deDE','Zufällig (Zähigkeit)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70488','deDE','Zeig mir deine Ausrüstung',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70489','deDE','Automatisch anlegen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70490','deDE','Waffenhand',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70491','deDE','Schildhand',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70492','deDE','Distanz',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70493','deDE','Relikt',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70494','deDE','Kopf',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70495','deDE','Schultern',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70496','deDE','Brust',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70497','deDE','Tailie',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70498','deDE','Beine',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70499','deDE','Füße',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70500','deDE','Handgelenke',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70501','deDE','Hände',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70502','deDE','Rücken',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70503','deDE','Hemd',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70504','deDE','Finger 1',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70505','deDE','Finger 2',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70506','deDE','Schmuck 1',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70507','deDE','Schmuck 2',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70508','deDE','Hals',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70509','deDE','Alles ablegen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70510','deDE','Ausrüstung aktualisieren (nur Visuell)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70511','deDE','nur Visuell',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70512','deDE','Ausgerüstet',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70513','deDE','nichts',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70514','deDE','Verwende deine alte Ausrüstung',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70515','deDE','Ablegen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70516','deDE','Hm... Ich habe nichts, was ich dir geben könnte.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70517','deDE','Sammeln',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70518','deDE','Fähigkeiten Status',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70519','deDE','Erlaubte Fähigkeiten verwalten',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70520','deDE','Benutze ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70521','deDE','Aktualisieren',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70522','deDE','Schaden',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70523','deDE','Kontrolle',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70524','deDE','Heiler',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70525','deDE','Anderes',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70526','deDE',' macht ein knirschendes Geräusch und beginnt zu folgen  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70527','deDE','%s wird sich dir erst anschließen, wenn sein Besitzer ihn entlässt',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70528','deDE','%s wird sich dir erst anschließen, wenn du Stufe 60 erreicht hast.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70529','deDE','%s wird sich dir erst anschließen, wenn du Stufe 55 erreicht hast.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70530','deDE','%s wird sich dir erst anschließen, wenn du Stufe 40 erreicht hast.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70531','deDE','%s wird sich dir erst anschließen, wenn du Stufe 20 erreicht hast.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70532','deDE','Du hast die maximale Anzahl an Npcbots für dein Level überschritten (%u)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70533','deDE','Sie haben nicht genug Geld',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70534','deDE','Du kannst nicht mehr Bots dieser Klasse haben! %u von %u',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70535','deDE','Ausrüstung in Slot %u (%s) kann nicht zurückgesetzt werden! Bot kann nicht entlassen werden!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70536','deDE','aktuell',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70537','deDE','Angriffsdistanz',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70538','deDE','Angriffe aus kurzer Entfernung',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70539','deDE','Angriffe aus großer Entfernung',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70540','deDE','Exakt',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70541','deDE','Buff entfernen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70542','deDE','Lege deinen Krafttyp fest',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70543','deDE','Kann %s aus irgendeinem dummen Grund nicht ausrüsten! Versenden per Post',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70544','deDE','Tank',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70545','deDE','Distanz',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70546','deDE','Bergbauer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70547','deDE','Kräuterkundler',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70548','deDE','Kürschner',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70549','deDE','Ingenieur',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70550','deDE','Besitz des Bots abgelaufen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70551','deDE','Das NpcBot-System ist derzeit deaktiviert. Bitte kontaktiere die Administration.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70552','deDE','%s wird sich Ihnen nicht anschließen, hat bereits einen Meister: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70553','deDE','%s kann Ihnen nicht beitreten, wenn Sie sich teleportieren wollen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70554','deDE','Aspekt',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70555','deDE','des Affen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70556','deDE','des Falken',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70557','deDE','des Geparden',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70558','deDE','der Viper',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70559','deDE','des Wildtiers',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70560','deDE','des Rudels',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70561','deDE','der Wildnis',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70562','deDE','des Drachenfalken',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70563','deDE','kein Aspekt',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70564','deDE','Aura',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70565','deDE','der Hingabe',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70566','deDE','der Konzentration',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70567','deDE','des Feuerwiderstands',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70568','deDE','des Frostwiderstands',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70569','deDE','des Schattenwiderstands',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70570','deDE','der Vergeltung',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70571','deDE','des Kreuzfahrers',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70572','deDE','Keine Aura',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70573','deDE','Verkrüppelndes Gift',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70574','deDE','Sofort wirkendes Gift',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70575','deDE','Tödliches Gift',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70576','deDE','Wundgift',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70577','deDE','Gedankenbenebelndes Gift',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70578','deDE','Narkotisierendes Gift',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70579','deDE','Nichts',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70580','deDE','Flammenzunge',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70581','deDE','Frostbrand',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70582','deDE','Windzorn',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70583','deDE','Lebensgeister',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70584','deDE','Ich brauche deine Dienste',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70585','deDE','Du hast zuviele Bots',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70586','deDE','Möchtest du diesen Bot anheuern? ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70587','deDE',' ist im Moment etwas beschäftigt, versuchen Sie es später noch einmal.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70588','deDE','Ein Vergnügen, mit Ihnen Geschäfte zu machen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70589','deDE','Krieger',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70590','deDE','Paladine',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70591','deDE','Magier',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70592','deDE','Priester',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70593','deDE','Hexenmeister',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70594','deDE','Druiden',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70595','deDE','Todesritter',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70596','deDE','Schurken',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70597','deDE','Schamanen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70598','deDE','Jäger',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70599','deDE','Klingenmeister',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70600','deDE','Zerstörer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70601','deDE','Erzmagier',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70602','deDE','Schreckenslords',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70603','deDE','Zauberbrecher',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70604','deDE','Dunkle Waldläufer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70605','deDE','Krieger',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70606','deDE','Paladin',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70607','deDE','Magier',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70608','deDE','Priester',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70609','deDE','Hexenmeister',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70610','deDE','Druide',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70611','deDE','Todesritter',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70612','deDE','Schurke',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70613','deDE','Schamane',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70614','deDE','Jäger',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70615','deDE','Klingenmeister',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70616','deDE','Zerstörer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70617','deDE','Erzmagier',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70618','deDE','Schreckenslord',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70619','deDE','Zauberbrecher',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70620','deDE','Dunkler Waldläufer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70621','deDE','Männlich',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70622','deDE','Weiblich',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70623','deDE','Mensch',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70624','deDE','Orc',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70625','deDE','Zwerg',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70626','deDE','Nachtelf',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70627','deDE','Untote',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70628','deDE','Tauren',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70629','deDE','Gnom',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70630','deDE','Troll',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70631','deDE','Blutelf',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70632','deDE','Draenei',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70633','deDE','Unbekannt',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70634','deDE','Plündern',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70635','deDE','|cff9d9d9dSchlecht|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70636','deDE','|cffffffffGewöhnlich|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70637','deDE','|cff1eff00Außergewöhnlich|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70638','deDE','|cff0070ddSelten|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70639','deDE','|cffa335eeEpisch|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70640','deDE','|cffff8000Legendär|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70641','deDE','Kampfbeginn verhalten',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70642','deDE','Verzögerung des Angriffs um',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70643','deDE','Verzögerung der Heilung um',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70644','deDE','s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70645','deDE','Off-Tank',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70646','deDE','Totenbeschwörers',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70647','deDE','Totenbeschwörer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70648','deDE','Angriffswinkel',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70649','deDE','Normal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70650','deDE','Frontales AOE vermeiden',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70651','deDE','NYI',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70652','deDE','Bist du sicher, dass das klappt? Es sollte besser das beste Wasser der Welt sein...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70653','deDE','Es scheint, als könnten Sie wirklich einen Schluck frisches Wasser gebrauchen.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70654','deDE','Meereshexes',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70655','deDE','Meereshexe',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70656','deDE','Mana pro Schaden',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70657','deDE','Schaden pro Mana',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70658','deDE','TransfiguTransmogrifikation...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70659','deDE','Kampfpositionierung DEAKTIVIEREN',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70660','deDE','Vorrangiges Ziel',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70661','deDE','Bot Ausrüstungsbank...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70662','deDE','Gegenstände einlagern...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70663','deDE','Gegenstände entnehmen...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70664','deDE','Bank ist leer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70665','deDE','Vorherige Seite',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70666','deDE','Nächste Seite',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70667','deDE','Willst du wirklich so viel Geld ausgeben, damit der Gruftlord sich wieder bewegt?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70668','deDE','Ich bezweifle, dass ihr in eurem jetzigen Zustand viel Schaden anrichten könnt, aber ich bin bereit, euch zu führen und euch dabei zu helfen, eure Kräfte wiederherzustellen.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70669','deDE','Gruftlords',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70670','deDE','Gruftlord',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70671','deDE','Reflektieren',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70672','deDE','Heuschrecken',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70673','deDE','Gesundheitsschwelle des Ziels heilen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70674','deDE','Ich benötige ein Portal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70675','deDE','Sturmwind',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70676','deDE','Eisenschmiede',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70680','deDE','Unterstadt',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70681','deDE','Donnerfels',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70682','deDE','Silbermond',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);\ndiff --git a/sql/Bots/locales/esES/npc_text_locale.sql b/sql/Bots/locales/esES/npc_text_locale.sql\nnew file mode 100644\nindex 0000000000..8e0f8b2eac\n--- /dev/null\n+++ b/sql/Bots/locales/esES/npc_text_locale.sql\n@@ -0,0 +1,382 @@\n+DELETE FROM `npc_text_locale` WHERE `Locale`='esES' AND `ID` BETWEEN '70000' AND '71000';\n+INSERT INTO `npc_text_locale` (`ID`, `Locale`, `Text0_0`, `Text0_1`, `Text1_0`, `Text1_1`, `Text2_0`, `Text2_1`, `Text3_0`, `Text3_1`, `Text4_0`, `Text4_1`, `Text5_0`, `Text5_1`, `Text6_0`, `Text6_1`, `Text7_0`, `Text7_1`)\n+VALUES\n+('70001','esES','Vivo solo para servir a mi dueño.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70002','esES','¿Necesitas algo?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70003','esES','Mortales... normalmente mato a miserables como tú a la vista.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70004','esES','<Ves lo que se supone que es un destructor de obsidiana. Sin embargo, este se ve diferente, dañado y descolorido, y no reacciona a tu presencia. Recuerdas que la Plaga ha estado usando sus propias versiones de esos en algún momento en el pasado. ¿Cómo diablos terminó aquí? Después de un examen más detallado, notas una abertura en la espalda de la criatura.>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70005','esES','<El Destructor de obsidiana te mira fijamente y emite un gruñido bajo.>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70006','esES','¿Estás sorprendido, mortal? Como nathrezim menor, tengo que recurrir a buscar aliados. Parece que podrías divertirme al menos.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70007','esES','¿Qué pasa ahora, mortal?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70008','esES','¿Puedes dejarme en paz? <suspiro>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70009','esES','¿Ahora que?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70101','esES','|cffff3300Blademaster|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\"An elite swordsman, former member of Burning Blade clan, now an elite fighter within the Horde\".$B$BMain attribute: Agility.$B$BNetherwalk (Windwalk). Allows Blademaster to become invisible, and move faster for a set amount of time. When the Blademaster attacks a unit to break invisibility, he will deal bonus damage.$B$BMirror Image. Confuses the enemy by creating illusions of the Blademaster and dispelling all magic from the Blademaster.$B$BCritical Strike (passive). Gives a 15% chance to deal critical x2(x3,x4) times normal damage on his attacks.$B$BBladestorm (NIY). Grants immunity to magic and deals damage to all surrounding enemies.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70102','esES','|cff9900ccObsidian Destroyer|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\"An obsidian winged monstrocity with insatiable hunger for magic\".$B$BHigh armor, very high resistances, partially immune to magic, loses mana over time and doesnt benefit from passive mana regeneration effects, mail/plate armor, dual-wielding wands, deals spellshadow damage, no physical attack, cannot attack enemies not in front while moving, spell power bonus: 50% attack power + 200% intellect + wands damage.$B$BDevour Magic. Dispels up to 2 magic effects from enemies, up to 2 magic effects and up to 2 curses from allies and damaging summoned units in 20 yards area. Every dispelled effect restores 20% mana and 5% health, 7 seconds cooldown.$B$BShadow Blast. Empowered attack that deals increased splash damage.$B$BDrain Mana. Drains all mana (limited by casters mana pool) from a random friendly unit.$B$BReplenish Mana. Energizes surrounding party and raid members within 25 yards for 2% of their maximum mana nullifying casters mana, affects up to 10 targets, 3 seconds cooldown.$B$BRegenerating Aura. Heals surrounding party and raid members within 25 yards for 3% of their maximum health nullifying casters mana, affects up to 10 targets, 3 seconds cooldown.$B$BShadow Armor (passive). Restores mana equal to a percentage of damage taken.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70103','esES','|cff0000ddArchmage|r$b|cffdd6600-=Warcraft III tribute=-|r$B$BSpell damage taken reduced by 35%, partially immune to control effects, cloth armor, deals spellsfire/spellfrost damage, no physical attack, spell power bonus: 100% intellect. Main attribute: Intellect.$B$BBlizzard. Your typical blizzard, just a little more powerful, 6 seconds cooldown.$B$BSummon Water Elemental. Summons a water elemental to attack archmage enemies for 1 min, 20 seconds cooldown.$B$BBrilliance Aura. Increases maximum mana by 10% and greatly increases mana regeneration of party and raid members within 40 yards.$B$BMass Teleport. NIY.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70104','esES','|cff9900ccDreadlord|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\"Incredibly powerful demon who wields power of darkness and mental domination\".$B$BHigh armor, high resistances, partially immune to control effects, damage taken speeds up spells recharge, plate armor, deals melee/spellshadow damage, bonus damage against incapacitated targets, spell power bonus: 200% strength. Main attribute: Strength.$B$BCarrion Swarm. Sends a horde of bats combined with chaotic magic to damage enemies in a very large frontal cone, cannot crit, 10 seconds cooldown.$B$BSleep. Puts the enemy target to sleep for 60 seconds and allows next physical attack on that target to bypass armor, direct damage caused will awaken the target, 6 seconds cooldown.$B$BVampiric Aura. Increases physical critical damage by 5% and heals party and raid members within 40 yards for a percentage (100% for Dreadlord and 25% for everyone else) of damage done by melee physical attacks and Carrion Swarm, no threat.$B$BSummon Infernal Servant. Calls an infernal down from the sky dealing damage and stunning enemy units, infernal is very resistant to magic and lasts 180 seconds, 180 seconds cooldown.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70105','esES','|cff0000ddSpell Breaker|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\"An elven warrior trained to disrupt and contort magical energies\".$B$BSpell damage taken reduced by 75%, partially immune to control effects, armor penalty -30%, mail/plate armor, deals melee/arcane damage, spell power bonus: 200% strength. Main attribute: Strength.$B$BSteal Magic (Spellsteal). Steals a benefical spell from an enemy and applies it to a nearby ally or removes a negative spell from an ally and applies it to a nearby enemy, affects magic and curse effects, 3 seconds cooldown.$B$BFeedback (passive). Successful melee attacks burn target mana equal to damage caused (increased by spellpower) dealing arcane damage. If target is drained, Spell Breaker melee attacks will do triple damage with increased critical strike chance',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70106','esES','|cff9900ccDark Ranger|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\"A former ranger of Quel thalas forcibly raised from the dead\".$B$BSpell damage taken reduced by 35%, undead, partially immune to control effects, leather/cloth armor, deals physical/spellshadow damage, stick to shadows and generates no threat, spell power bonus: 50% intellect. Main attribute: Agility.$B$BSilence. Silences an enemy and up to 4 nearby targets for 8 seconds, 15 seconds cooldown.$B$BBlack Arrow. Fires a cursed arrow dealing 150% weapon damage and additional spellshadow damage over time. If affected target dies from Dark Ranger damage, Dark Minion will spawn from the corpse (maximum 5 Minions, 80 seconds duration, only works on humanoids, beasts and dragonkin). Deals five times more damage if target is under 20% health.$B$BDrain Life. Drains health from an enemy every second for 5 seconds, healing Dark Ranger for 200% of the drained amount.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70201','esES','Siempre hay tipos dispuestos a matar por dinero.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70202','esES','Estos son los bots que están disponibles en este momento: ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70203','esES','Estos son los bots que están disponibles en este momento: ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70204','esES','Parece que no hay nadie disponible en este momento, vuelve más tarde.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70300','esES','¡Muere!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70301','esES','Resucitandote',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70302','esES','Resucitando ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70303','esES','tu bot',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70304','esES',' bot',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70305','esES','Todavía no puedo crear agua',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70306','esES','Todavía no puedo crear comida',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70307','esES','No puedo hacerlo ahora',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70308','esES','Aquí tienes...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70309','esES','Desactivado',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70310','esES','No está listo todavía',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70311','esES','Tipo de objeto no válido',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70312','esES','Fallido',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70313','esES','Vale',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70314','esES','No estoy en ninguna forma',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70315','esES','No tengo piedra de salud',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70316','esES','¡Aún no puedo crear piedras de salud!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70317','esES','¡WTF, no tengo forzar cerraduras!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70318','esES','Mi nivel de habilidad no es alto',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70319','esES','Cambiando mi talento a ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70320','esES','Armas',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70321','esES','Furia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70322','esES','Protección',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70323','esES','Retribución',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70324','esES','Maestro de bestias',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70325','esES','Punteria',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70326','esES','Supervivencia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70327','esES','Asesinato',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70328','esES','Combate',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70329','esES','Sutileza',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70330','esES','Disciplina',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70331','esES','Sagrado',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70332','esES','Sombra',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70333','esES','Sangre',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70334','esES','Escarcha',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70335','esES','Profano',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70336','esES','Elemental',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70337','esES','Mejora',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70338','esES','Restauración',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70339','esES','Arcano',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70340','esES','Fuego',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70341','esES','Aflición',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70342','esES','Demologia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70343','esES','Destrucción',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70344','esES','Equilibrio',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70345','esES','Combate feral',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70346','esES','Unknown',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70347','esES','Vete, debilucho',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70348','esES',' no está convencido',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70349','esES','No voy a perder el tiempo en nada',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70350','esES','NIY',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70351','esES','NIY',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70352','esES','NIY',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70353','esES','Estoy listo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70354','esES','Vete, sirvo a mi dueño ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70355','esES','unknown',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70356','esES',' en ti!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70357','esES',' en mí mismo!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70358','esES',' en ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70359','esES',' usado!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70360','esES','bot tank',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70361','esES','clase',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70362','esES','jugador',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70363','esES','dueño',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70364','esES','ninguno',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70365','esES','Rango',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70366','esES','talento',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70367','esES','pasivo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70368','esES','oculto',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70369','esES','conocido',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70370','esES','habilidad',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70371','esES','str',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70372','esES','agi',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70373','esES','sta',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70374','esES','int',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70375','esES','spi',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70376','esES','unk stat',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70377','esES','total',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70378','esES','Melee AP',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70379','esES','Ranged AP',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70380','esES','armadura',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70381','esES','crit',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70382','esES','defensa',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70383','esES','miss',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70384','esES','evasión',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70385','esES','parry',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70386','esES','bloqueo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70387','esES','valor de bloqueo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70388','esES','Daño recibido cuerpo a cuerpo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70389','esES','Daño recibido de hechizos',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70390','esES','Rango de daño mano principal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70391','esES','Daño múltiple mano principal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70392','esES','Tiempo de ataque mano principal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70393','esES','Rango de daño de mano secundaria',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70394','esES','Daño múltiple mano secundaria',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70395','esES','Tiempo de ataque mano secundaria',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70396','esES','Rango de daño a distancia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70397','esES','Daño a distancia múltiple',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70398','esES','Tiempo de ataque a distancia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70399','esES','min',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70400','esES','max',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70401','esES','DPS',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70402','esES','base hp',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70403','esES','total hp',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70404','esES','base mana',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70405','esES','total mana',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70406','esES','mana actual',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70407','esES','poder de hechizos',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70408','esES','health regen_5 bonus',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70409','esES','mana regen_5 no cast',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70410','esES','mana regen_5 casting',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70411','esES','haste',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70412','esES','hit',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70413','esES','pericia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70414','esES','penetración de armadura',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70415','esES','penetración de hechizos',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70416','esES','%',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70417','esES','sagrado',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70418','esES','fuego',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70419','esES','naturaleza',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70420','esES','escarcha',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70421','esES','sombra',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70422','esES','arcano',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70423','esES','Resistencia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70424','esES','Estados de comando',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70425','esES','Seguir',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70426','esES','Ataque',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70427','esES','Quédate',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70428','esES','Reiniciar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70429','esES','Parar por completo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70430','esES','Distancia de seguimiento',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70431','esES','Especificaciones',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70432','esES','Rol principal del bot',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70433','esES','Rol de recoleción del bot',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70434','esES','Muertes PvP',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70435','esES','jugadores',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70436','esES','Murió ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70437','esES',' veces',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70438','esES','%s (bot) se calma',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70439','esES','<Debug>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70440','esES','¿Estás seguro de que quieres arriesgarte a dibujar ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70441','esES',' atención?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70442','esES','<Insertar Moneda>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70443','esES','Quieres atraer ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70444','esES','<Intenta hacer una ofrenda>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70445','esES','Quieres contratar a ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70446','esES','<Contratar Bot>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70447','esES','Administrar equipamiento...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70448','esES','Administrar rol...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70449','esES','Administrar formación...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70450','esES','Administrar habilidades...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70451','esES','Administrar talentos...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70452','esES','Dar consumibles...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70453','esES','<Crear grupo>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70454','esES','<Crear grupo (Todos los bots)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70455','esES','<Añadir al grupo>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70456','esES','<Añadir todos los bots al grupo>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70457','esES','<Quitar del grupo>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70458','esES','¡Sigueme!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70459','esES','¡Mantén tu posición!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70460','esES','¡Quédate aquí, no hagas nada!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70461','esES','Necesito comida',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70462','esES','Necesito agua',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70463','esES','Necesito una mesa de refrigerios',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70464','esES','Ayúdame a abrir esta cerradura',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70465','esES','Necesito una piedra de salud',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70466','esES','Necesito un pozo de alma',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70467','esES','Necesito que actualices tus venenos',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70468','esES','<Elegir veneno (Mano Principal)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70469','esES','<Elegir veneno (Mano Sencundaria)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70470','esES','Necesito que actualices tus encantamientos',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70471','esES','<Elegir encantamiento (Mano Principal)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70472','esES','<Elegir encantamiento (Mano Secundaria)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70473','esES','Necesito que te quites el cambio de forma',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70474','esES','<Elegir tipo de mascota>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70475','esES','Despedir',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70476','esES','Despedir a ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70477','esES','Puede que te arrepientas...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70478','esES','!Tranquilizaté!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70479','esES','<Estudia a la criatura>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70480','esES','Nada',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70481','esES','Distancia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70482','esES','ATRÁS',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70483','esES','<auto>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70484','esES','<ninguna>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70485','esES','Aleatoria (Astucia)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70486','esES','Aleatoria (Ferocidad)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70487','esES','Aleatoria (Tenacidad)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70488','esES','Muéstrame tu inventario',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70489','esES','Auto-equipar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70490','esES','Mano Principal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70491','esES','Mano Secundaria',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70492','esES','A distancia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70493','esES','Reliquia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70494','esES','Cabeza',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70495','esES','Hombros',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70496','esES','Pecho',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70497','esES','Cintura',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70498','esES','Piernas',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70499','esES','Pies',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70500','esES','Brazales',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70501','esES','Guantes',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70502','esES','Capa',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70503','esES','Camisa',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70504','esES','Anillo1...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70505','esES','Anillo2...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70506','esES','Abalorio1',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70507','esES','Abalorio2',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70508','esES','Collar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70509','esES','Desequipar todo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70510','esES','Actualizar equipamiento (Visual)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70511','esES','Solo visual',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70512','esES','Equipado',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70513','esES','nada',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70514','esES','Usa tu equipamiento antiguo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70515','esES','Desequipar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70516','esES','Mmmm... no tengo nada que darte',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70517','esES','Recolectar material',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70518','esES','Estado de las habilidades',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70519','esES','Administrar habilidades disponibles',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70520','esES','Usar ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70521','esES','Actualizar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70522','esES','Daño',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70523','esES','Control',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70524','esES','Healer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70525','esES','Otros',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70526','esES',' hace un ruido chirriante y comienza a seguir ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70527','esES','%s no se unira a ti hasta que su dueño no lo despida.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70528','esES','%s no se unira a ti hasta que seas nivel 60',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70529','esES','%s no se unira a ti hasta que seas nivel 55',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70530','esES','%s no se unira a ti hasta que seas nivel 40',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70531','esES','%s no se unira a ti hasta que seas nivel 20',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70532','esES','Superas el número máximo de bots (%u)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70533','esES','No tienes suficiente dinero',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70534','esES','¡No puedes tener más bots de esa clase! %u de %u ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70535','esES','¡No se puede reiniciar el equipamiento en el slot %u (%s)! ¡No se puede despedir el bot!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70536','esES','actual',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70537','esES','Distancia de ataque',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70538','esES','Ataques de corto alcance',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70539','esES','Ataques de largo alcance',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70540','esES','Exacto',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70541','esES','Eliminar Buff',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70542','esES','Fija tu tipo de poder',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70543','esES','¡No se puede desequipar a %s por alguna razón! Enviando por correo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70544','esES','Tank',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70545','esES','A distancia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70546','esES','Mineria',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70547','esES','Herbolistaeria',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70548','esES','Desollar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70549','esES','Ingeniería',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70550','esES','El contrato del bot expiró',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70551','esES','Los NPCBot están deshabilitado actualmente.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70552','esES','%s No se unira a ti, ya tiene un dueño: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70553','esES','%s no puede unirse mientras estás a punto de teletransportarte',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70554','esES','Aspecto',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70555','esES','de Mono',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70556','esES','de Halcón',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70557','esES','de Guepardo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70558','esES','de Víbora',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70559','esES','de la Bestia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70560','esES','de la Manada',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70561','esES','de lo Salvaje',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70562','esES','de Dracohalcón',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70563','esES','Sin Aspecto',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70564','esES','Aura',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70565','esES','de Devoción',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70566','esES','de Concentración',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70567','esES','de Resistencia al fuego',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70568','esES','de Resistencia a la escarcha',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70569','esES','de Resistencia a las sombras',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70570','esES','de Reprensión',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70571','esES','de Cruzado',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70572','esES','Sin Aura',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70573','esES','Veneno entorpecedor',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70574','esES','Veneno instantáneo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70575','esES','Veneno mortal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70576','esES','Veneno hiriente',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70577','esES','Veneno de aturdimiento mental',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70578','esES','Veneno anestésico',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70579','esES','Nada',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70580','esES','Lengua de fuego',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70581','esES','Estigma de escarcha',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70582','esES','Viento furioso',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70583','esES','Vida terrestre',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70584','esES','Necesito tus servicios',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70585','esES','Tienes demasiados bots',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70586','esES','Quieres contratar a ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70587','esES',' está ocupado en este momento, vuelve a intentarlo más tarde.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70588','esES','Un placer hacer negocios contigo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70589','esES','Guerreros',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70590','esES','Paladines',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70591','esES','Magos',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70592','esES','Sacerdotes',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70593','esES','Brujos',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70594','esES','Druidas',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70595','esES','Caballeros de la Muerte',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70596','esES','Picaros',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70597','esES','Chamanes',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70598','esES','Cazadores',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70599','esES','Blademasters',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70600','esES','Destroyers',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70601','esES','Archmagi',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70602','esES','Dreadlords',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70603','esES','Spell Breakers',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70604','esES','Dark Rangers',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70605','esES','Guerrero',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70606','esES','Paladin',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70607','esES','Mago',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70608','esES','Sacerdote',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70609','esES','Brujo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70610','esES','Druida',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70611','esES','Caballero de la Muerte',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70612','esES','Picaro',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70613','esES','Chaman',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70614','esES','Cazador',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70615','esES','Blademaster',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70616','esES','Destroyer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70617','esES','Archmage',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70618','esES','Dreadlord',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70619','esES','Spell Breaker',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70620','esES','Dark Ranger',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70621','esES','Hombre',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70622','esES','Mujer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70623','esES','Humano',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70624','esES','Orco',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70625','esES','Enano',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70626','esES','Elfo de la noche',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70627','esES','No-muerto',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70628','esES','Tauren',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70629','esES','Gnomo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70630','esES','Troll',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70631','esES','Elfo de sangre',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70632','esES','Draenei',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70633','esES','Unknown',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70634','esES','Saquear',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70635','esES','|cff9d9d9dBasura|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70636','esES','|cffffffffComún|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70637','esES','|cff1eff00Poco común|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70638','esES','|cff0070ddRaro|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70639','esES','|cffa335eeÉpico|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70640','esES','|cffff8000Legendario|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70641','esES','Elige un comprtamineto',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70642','esES','Retrasa el ataque a',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70643','esES','Retrasa la sanación a',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70644','esES','s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70645','esES','Off-Tank',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70646','esES','Necromancers',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70647','esES','Necromancer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70648','esES','Ángulo de ataque',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70649','esES','Normal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70650','esES','Evitar AOE frontal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70652','esES','¿Estás seguro de que esto va a funcionar? Más vale que sea la mejor agua del mundo...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70653','esES','Parece que realmente te vendría bien un trago de agua fresca.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70654','esES','Brujas del mar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70655','esES','Bruja de mar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70656','esES','Maná por daño',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70657','esES','Daño por maná',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70658','esES','Transfiguración...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70659','esES','DESACTIVAR el posicionamiento de combate',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70660','esES','Objetivo prioritario',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);\ndiff --git a/sql/Bots/locales/esMX/npc_text_locale.sql b/sql/Bots/locales/esMX/npc_text_locale.sql\nnew file mode 100644\nindex 0000000000..d71d858238\n--- /dev/null\n+++ b/sql/Bots/locales/esMX/npc_text_locale.sql\n@@ -0,0 +1,382 @@\n+DELETE FROM `npc_text_locale` WHERE `Locale`='esMX' AND `ID` BETWEEN '70000' AND '71000';\n+INSERT INTO `npc_text_locale` (`ID`, `Locale`, `Text0_0`, `Text0_1`, `Text1_0`, `Text1_1`, `Text2_0`, `Text2_1`, `Text3_0`, `Text3_1`, `Text4_0`, `Text4_1`, `Text5_0`, `Text5_1`, `Text6_0`, `Text6_1`, `Text7_0`, `Text7_1`)\n+VALUES\n+('70001','esMX','Vivo solo para servir a mi dueño.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70002','esMX','¿Necesitas algo?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70003','esMX','Mortales... normalmente mato a miserables como tú a la vista.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70004','esMX','<Ves lo que se supone que es un destructor de obsidiana. Sin embargo, este se ve diferente, dañado y descolorido, y no reacciona a tu presencia. Recuerdas que la Plaga ha estado usando sus propias versiones de esos en algún momento en el pasado. ¿Cómo diablos terminó aquí? Después de un examen más detallado, notas una abertura en la espalda de la criatura.>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70005','esMX','<El Destructor de obsidiana te mira fijamente y emite un gruñido bajo.>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70006','esMX','¿Estás sorprendido, mortal? Como nathrezim menor, tengo que recurrir a buscar aliados. Parece que podrías divertirme al menos.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70007','esMX','¿Qué pasa ahora, mortal?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70008','esMX','¿Puedes dejarme en paz? <suspiro>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70009','esMX','¿Ahora que?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70101','esMX','|cffff3300Blademaster|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\"An elite swordsman, former member of Burning Blade clan, now an elite fighter within the Horde\".$B$BMain attribute: Agility.$B$BNetherwalk (Windwalk). Allows Blademaster to become invisible, and move faster for a set amount of time. When the Blademaster attacks a unit to break invisibility, he will deal bonus damage.$B$BMirror Image. Confuses the enemy by creating illusions of the Blademaster and dispelling all magic from the Blademaster.$B$BCritical Strike (passive). Gives a 15% chance to deal critical x2(x3,x4) times normal damage on his attacks.$B$BBladestorm (NIY). Grants immunity to magic and deals damage to all surrounding enemies.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70102','esMX','|cff9900ccObsidian Destroyer|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\"An obsidian winged monstrocity with insatiable hunger for magic\".$B$BHigh armor, very high resistances, partially immune to magic, loses mana over time and doesnt benefit from passive mana regeneration effects, mail/plate armor, dual-wielding wands, deals spellshadow damage, no physical attack, cannot attack enemies not in front while moving, spell power bonus: 50% attack power + 200% intellect + wands damage.$B$BDevour Magic. Dispels up to 2 magic effects from enemies, up to 2 magic effects and up to 2 curses from allies and damaging summoned units in 20 yards area. Every dispelled effect restores 20% mana and 5% health, 7 seconds cooldown.$B$BShadow Blast. Empowered attack that deals increased splash damage.$B$BDrain Mana. Drains all mana (limited by casters mana pool) from a random friendly unit.$B$BReplenish Mana. Energizes surrounding party and raid members within 25 yards for 2% of their maximum mana nullifying casters mana, affects up to 10 targets, 3 seconds cooldown.$B$BRegenerating Aura. Heals surrounding party and raid members within 25 yards for 3% of their maximum health nullifying casters mana, affects up to 10 targets, 3 seconds cooldown.$B$BShadow Armor (passive). Restores mana equal to a percentage of damage taken.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70103','esMX','|cff0000ddArchmage|r$b|cffdd6600-=Warcraft III tribute=-|r$B$BSpell damage taken reduced by 35%, partially immune to control effects, cloth armor, deals spellsfire/spellfrost damage, no physical attack, spell power bonus: 100% intellect. Main attribute: Intellect.$B$BBlizzard. Your typical blizzard, just a little more powerful, 6 seconds cooldown.$B$BSummon Water Elemental. Summons a water elemental to attack archmage enemies for 1 min, 20 seconds cooldown.$B$BBrilliance Aura. Increases maximum mana by 10% and greatly increases mana regeneration of party and raid members within 40 yards.$B$BMass Teleport. NIY.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70104','esMX','|cff9900ccDreadlord|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\"Incredibly powerful demon who wields power of darkness and mental domination\".$B$BHigh armor, high resistances, partially immune to control effects, damage taken speeds up spells recharge, plate armor, deals melee/spellshadow damage, bonus damage against incapacitated targets, spell power bonus: 200% strength. Main attribute: Strength.$B$BCarrion Swarm. Sends a horde of bats combined with chaotic magic to damage enemies in a very large frontal cone, cannot crit, 10 seconds cooldown.$B$BSleep. Puts the enemy target to sleep for 60 seconds and allows next physical attack on that target to bypass armor, direct damage caused will awaken the target, 6 seconds cooldown.$B$BVampiric Aura. Increases physical critical damage by 5% and heals party and raid members within 40 yards for a percentage (100% for Dreadlord and 25% for everyone else) of damage done by melee physical attacks and Carrion Swarm, no threat.$B$BSummon Infernal Servant. Calls an infernal down from the sky dealing damage and stunning enemy units, infernal is very resistant to magic and lasts 180 seconds, 180 seconds cooldown.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70105','esMX','|cff0000ddSpell Breaker|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\"An elven warrior trained to disrupt and contort magical energies\".$B$BSpell damage taken reduced by 75%, partially immune to control effects, armor penalty -30%, mail/plate armor, deals melee/arcane damage, spell power bonus: 200% strength. Main attribute: Strength.$B$BSteal Magic (Spellsteal). Steals a benefical spell from an enemy and applies it to a nearby ally or removes a negative spell from an ally and applies it to a nearby enemy, affects magic and curse effects, 3 seconds cooldown.$B$BFeedback (passive). Successful melee attacks burn target mana equal to damage caused (increased by spellpower) dealing arcane damage. If target is drained, Spell Breaker melee attacks will do triple damage with increased critical strike chance',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70106','esMX','|cff9900ccDark Ranger|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\"A former ranger of Quel thalas forcibly raised from the dead\".$B$BSpell damage taken reduced by 35%, undead, partially immune to control effects, leather/cloth armor, deals physical/spellshadow damage, stick to shadows and generates no threat, spell power bonus: 50% intellect. Main attribute: Agility.$B$BSilence. Silences an enemy and up to 4 nearby targets for 8 seconds, 15 seconds cooldown.$B$BBlack Arrow. Fires a cursed arrow dealing 150% weapon damage and additional spellshadow damage over time. If affected target dies from Dark Ranger damage, Dark Minion will spawn from the corpse (maximum 5 Minions, 80 seconds duration, only works on humanoids, beasts and dragonkin). Deals five times more damage if target is under 20% health.$B$BDrain Life. Drains health from an enemy every second for 5 seconds, healing Dark Ranger for 200% of the drained amount.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70201','esMX','Siempre hay tipos dispuestos a matar por dinero.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70202','esMX','Estos son los bots que están disponibles en este momento: ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70203','esMX','Estos son los bots que están disponibles en este momento: ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70204','esMX','Parece que no hay nadie disponible en este momento, vuelve más tarde.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70300','esMX','¡Muere!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70301','esMX','Resucitandote',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70302','esMX','Resucitando ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70303','esMX','tu bot',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70304','esMX',' bot',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70305','esMX','Todavía no puedo crear agua',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70306','esMX','Todavía no puedo crear comida',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70307','esMX','No puedo hacerlo ahora',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70308','esMX','Aquí tienes...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70309','esMX','Desactivado',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70310','esMX','No está listo todavía',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70311','esMX','Tipo de objeto no válido',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70312','esMX','Fallido',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70313','esMX','Vale',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70314','esMX','No estoy en ninguna forma',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70315','esMX','No tengo piedra de salud',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70316','esMX','¡Aún no puedo crear piedras de salud!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70317','esMX','¡WTF, no tengo forzar cerraduras!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70318','esMX','Mi nivel de habilidad no es alto',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70319','esMX','Cambiando mi talento a ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70320','esMX','Armas',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70321','esMX','Furia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70322','esMX','Protección',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70323','esMX','Retribución',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70324','esMX','Maestro de bestias',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70325','esMX','Punteria',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70326','esMX','Supervivencia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70327','esMX','Asesinato',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70328','esMX','Combate',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70329','esMX','Sutileza',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70330','esMX','Disciplina',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70331','esMX','Sagrado',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70332','esMX','Sombra',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70333','esMX','Sangre',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70334','esMX','Escarcha',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70335','esMX','Profano',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70336','esMX','Elemental',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70337','esMX','Mejora',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70338','esMX','Restauración',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70339','esMX','Arcano',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70340','esMX','Fuego',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70341','esMX','Aflición',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70342','esMX','Demologia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70343','esMX','Destrucción',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70344','esMX','Equilibrio',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70345','esMX','Combate feral',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70346','esMX','Unknown',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70347','esMX','Vete, debilucho',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70348','esMX',' no está convencido',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70349','esMX','No voy a perder el tiempo en nada',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70350','esMX','NIY',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70351','esMX','NIY',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70352','esMX','NIY',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70353','esMX','Estoy listo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70354','esMX','Vete, sirvo a mi dueño ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70355','esMX','unknown',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70356','esMX',' en ti!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70357','esMX',' en mí mismo!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70358','esMX',' en ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70359','esMX',' usado!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70360','esMX','bot tank',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70361','esMX','clase',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70362','esMX','jugador',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70363','esMX','dueño',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70364','esMX','ninguno',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70365','esMX','Rango',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70366','esMX','talento',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70367','esMX','pasivo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70368','esMX','oculto',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70369','esMX','conocido',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70370','esMX','habilidad',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70371','esMX','str',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70372','esMX','agi',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70373','esMX','sta',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70374','esMX','int',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70375','esMX','spi',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70376','esMX','unk stat',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70377','esMX','total',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70378','esMX','Melee AP',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70379','esMX','Ranged AP',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70380','esMX','armadura',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70381','esMX','crit',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70382','esMX','defensa',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70383','esMX','miss',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70384','esMX','evasión',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70385','esMX','parry',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70386','esMX','bloqueo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70387','esMX','valor de bloqueo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70388','esMX','Daño recibido cuerpo a cuerpo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70389','esMX','Daño recibido de hechizos',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70390','esMX','Rango de daño mano principal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70391','esMX','Daño múltiple mano principal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70392','esMX','Tiempo de ataque mano principal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70393','esMX','Rango de daño de mano secundaria',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70394','esMX','Daño múltiple mano secundaria',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70395','esMX','Tiempo de ataque mano secundaria',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70396','esMX','Rango de daño a distancia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70397','esMX','Daño a distancia múltiple',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70398','esMX','Tiempo de ataque a distancia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70399','esMX','min',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70400','esMX','max',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70401','esMX','DPS',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70402','esMX','base hp',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70403','esMX','total hp',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70404','esMX','base mana',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70405','esMX','total mana',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70406','esMX','mana actual',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70407','esMX','poder de hechizos',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70408','esMX','health regen_5 bonus',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70409','esMX','mana regen_5 no cast',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70410','esMX','mana regen_5 casting',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70411','esMX','haste',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70412','esMX','hit',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70413','esMX','pericia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70414','esMX','penetración de armadura',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70415','esMX','penetración de hechizos',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70416','esMX','%',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70417','esMX','sagrado',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70418','esMX','fuego',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70419','esMX','naturaleza',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70420','esMX','escarcha',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70421','esMX','sombra',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70422','esMX','arcano',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70423','esMX','Resistencia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70424','esMX','Estados de comando',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70425','esMX','Seguir',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70426','esMX','Ataque',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70427','esMX','Quédate',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70428','esMX','Reiniciar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70429','esMX','Parar por completo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70430','esMX','Distancia de seguimiento',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70431','esMX','Especificaciones',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70432','esMX','Rol principal del bot',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70433','esMX','Rol de recoleción del bot',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70434','esMX','Muertes PvP',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70435','esMX','jugadores',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70436','esMX','Murió ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70437','esMX',' veces',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70438','esMX','%s (bot) se calma',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70439','esMX','<Debug>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70440','esMX','¿Estás seguro de que quieres arriesgarte a dibujar ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70441','esMX',' atención?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70442','esMX','<Insertar Moneda>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70443','esMX','Quieres atraer ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70444','esMX','<Intenta hacer una ofrenda>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70445','esMX','Quieres contratar a ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70446','esMX','<Contratar Bot>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70447','esMX','Administrar equipamiento...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70448','esMX','Administrar rol...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70449','esMX','Administrar formación...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70450','esMX','Administrar habilidades...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70451','esMX','Administrar talentos...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70452','esMX','Dar consumibles...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70453','esMX','<Crear grupo>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70454','esMX','<Crear grupo (Todos los bots)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70455','esMX','<Añadir al grupo>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70456','esMX','<Añadir todos los bots al grupo>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70457','esMX','<Quitar del grupo>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70458','esMX','¡Sigueme!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70459','esMX','¡Mantén tu posición!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70460','esMX','¡Quédate aquí, no hagas nada!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70461','esMX','Necesito comida',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70462','esMX','Necesito agua',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70463','esMX','Necesito una mesa de refrigerios',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70464','esMX','Ayúdame a abrir esta cerradura',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70465','esMX','Necesito una piedra de salud',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70466','esMX','Necesito un pozo de alma',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70467','esMX','Necesito que actualices tus venenos',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70468','esMX','<Elegir veneno (Mano Principal)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70469','esMX','<Elegir veneno (Mano Sencundaria)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70470','esMX','Necesito que actualices tus encantamientos',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70471','esMX','<Elegir encantamiento (Mano Principal)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70472','esMX','<Elegir encantamiento (Mano Secundaria)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70473','esMX','Necesito que te quites el cambio de forma',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70474','esMX','<Elegir tipo de mascota>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70475','esMX','Despedir',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70476','esMX','Despedir a ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70477','esMX','Puede que te arrepientas...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70478','esMX','!Tranquilizaté!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70479','esMX','<Estudia a la criatura>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70480','esMX','Nada',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70481','esMX','Distancia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70482','esMX','ATRÁS',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70483','esMX','<auto>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70484','esMX','<ninguna>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70485','esMX','Aleatoria (Astucia)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70486','esMX','Aleatoria (Ferocidad)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70487','esMX','Aleatoria (Tenacidad)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70488','esMX','Muéstrame tu inventario',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70489','esMX','Auto-equipar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70490','esMX','Mano Principal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70491','esMX','Mano Secundaria',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70492','esMX','A distancia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70493','esMX','Reliquia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70494','esMX','Cabeza',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70495','esMX','Hombros',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70496','esMX','Pecho',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70497','esMX','Cintura',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70498','esMX','Piernas',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70499','esMX','Pies',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70500','esMX','Brazales',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70501','esMX','Guantes',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70502','esMX','Capa',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70503','esMX','Camisa',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70504','esMX','Anillo1...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70505','esMX','Anillo2...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70506','esMX','Abalorio1',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70507','esMX','Abalorio2',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70508','esMX','Collar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70509','esMX','Desequipar todo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70510','esMX','Actualizar equipamiento (Visual)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70511','esMX','Solo visual',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70512','esMX','Equipado',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70513','esMX','nada',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70514','esMX','Usa tu equipamiento antiguo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70515','esMX','Desequipar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70516','esMX','Mmmm... no tengo nada que darte',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70517','esMX','Recolectar material',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70518','esMX','Estado de las habilidades',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70519','esMX','Administrar habilidades disponibles',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70520','esMX','Usar ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70521','esMX','Actualizar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70522','esMX','Daño',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70523','esMX','Control',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70524','esMX','Healer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70525','esMX','Otros',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70526','esMX',' hace un ruido chirriante y comienza a seguir ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70527','esMX','%s no se unira a ti hasta que su dueño no lo despida.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70528','esMX','%s no se unira a ti hasta que seas nivel 60',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70529','esMX','%s no se unira a ti hasta que seas nivel 55',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70530','esMX','%s no se unira a ti hasta que seas nivel 40',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70531','esMX','%s no se unira a ti hasta que seas nivel 20',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70532','esMX','Superas el número máximo de bots (%u)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70533','esMX','No tienes suficiente dinero',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70534','esMX','¡No puedes tener más bots de esa clase! %u de %u ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70535','esMX','¡No se puede reiniciar el equipamiento en el slot %u (%s)! ¡No se puede despedir el bot!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70536','esMX','actual',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70537','esMX','Distancia de ataque',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70538','esMX','Ataques de corto alcance',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70539','esMX','Ataques de largo alcance',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70540','esMX','Exacto',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70541','esMX','Eliminar Buff',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70542','esMX','Fija tu tipo de poder',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70543','esMX','¡No se puede desequipar a %s por alguna razón! Enviando por correo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70544','esMX','Tank',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70545','esMX','A distancia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70546','esMX','Mineria',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70547','esMX','Herbolistaeria',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70548','esMX','Desollar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70549','esMX','Ingeniería',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70550','esMX','El contrato del bot expiró',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70551','esMX','Los NPCBot están deshabilitado actualmente.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70552','esMX','%s No se unira a ti, ya tiene un dueño: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70553','esMX','%s no puede unirse mientras estás a punto de teletransportarte',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70554','esMX','Aspecto',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70555','esMX','de Mono',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70556','esMX','de Halcón',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70557','esMX','de Guepardo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70558','esMX','de Víbora',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70559','esMX','de la Bestia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70560','esMX','de la Manada',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70561','esMX','de lo Salvaje',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70562','esMX','de Dracohalcón',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70563','esMX','Sin Aspecto',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70564','esMX','Aura',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70565','esMX','de Devoción',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70566','esMX','de Concentración',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70567','esMX','de Resistencia al fuego',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70568','esMX','de Resistencia a la escarcha',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70569','esMX','de Resistencia a las sombras',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70570','esMX','de Reprensión',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70571','esMX','de Cruzado',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70572','esMX','Sin Aura',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70573','esMX','Veneno entorpecedor',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70574','esMX','Veneno instantáneo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70575','esMX','Veneno mortal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70576','esMX','Veneno hiriente',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70577','esMX','Veneno de aturdimiento mental',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70578','esMX','Veneno anestésico',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70579','esMX','Nada',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70580','esMX','Lengua de fuego',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70581','esMX','Estigma de escarcha',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70582','esMX','Viento furioso',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70583','esMX','Vida terrestre',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70584','esMX','Necesito tus servicios',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70585','esMX','Tienes demasiados bots',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70586','esMX','Quieres contratar a ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70587','esMX',' está ocupado en este momento, vuelve a intentarlo más tarde.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70588','esMX','Un placer hacer negocios contigo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70589','esMX','Guerreros',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70590','esMX','Paladines',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70591','esMX','Magos',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70592','esMX','Sacerdotes',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70593','esMX','Brujos',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70594','esMX','Druidas',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70595','esMX','Caballeros de la Muerte',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70596','esMX','Picaros',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70597','esMX','Chamanes',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70598','esMX','Cazadores',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70599','esMX','Blademasters',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70600','esMX','Destroyers',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70601','esMX','Archmagi',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70602','esMX','Dreadlords',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70603','esMX','Spell Breakers',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70604','esMX','Dark Rangers',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70605','esMX','Guerrero',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70606','esMX','Paladin',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70607','esMX','Mago',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70608','esMX','Sacerdote',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70609','esMX','Brujo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70610','esMX','Druida',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70611','esMX','Caballero de la Muerte',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70612','esMX','Picaro',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70613','esMX','Chaman',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70614','esMX','Cazador',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70615','esMX','Blademaster',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70616','esMX','Destroyer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70617','esMX','Archmage',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70618','esMX','Dreadlord',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70619','esMX','Spell Breaker',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70620','esMX','Dark Ranger',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70621','esMX','Hombre',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70622','esMX','Mujer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70623','esMX','Humano',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70624','esMX','Orco',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70625','esMX','Enano',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70626','esMX','Elfo de la noche',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70627','esMX','No-muerto',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70628','esMX','Tauren',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70629','esMX','Gnomo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70630','esMX','Troll',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70631','esMX','Elfo de sangre',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70632','esMX','Draenei',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70633','esMX','Unknown',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70634','esMX','Saquear',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70635','esMX','|cff9d9d9dBasura|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70636','esMX','|cffffffffComún|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70637','esMX','|cff1eff00Poco común|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70638','esMX','|cff0070ddRaro|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70639','esMX','|cffa335eeÉpico|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70640','esMX','|cffff8000Legendario|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70641','esMX','Elige un comprtamineto',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70642','esMX','Retrasa el ataque a',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70643','esMX','Retrasa la sanación a',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70644','esMX','s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70645','esMX','Off-Tank',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70646','esMX','Necromancers',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70647','esMX','Necromancer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70648','esMX','Ángulo de ataque',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70649','esMX','Normal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70650','esMX','Evitar AOE frontal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70652','esMX','¿Estás seguro de que esto va a funcionar? Más vale que sea la mejor agua del mundo...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70653','esMX','Parece que realmente te vendría bien un trago de agua fresca.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70654','esMX','Brujas del mar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70655','esMX','Bruja de mar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70656','esMX','Maná por daño',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70657','esMX','Daño por maná',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70658','esMX','Transfiguración...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70659','esMX','DESACTIVAR el posicionamiento de combate',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70660','esMX','Objetivo prioritario',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);\ndiff --git a/sql/Bots/locales/ruRU/npc_text_locale.sql b/sql/Bots/locales/ruRU/npc_text_locale.sql\nnew file mode 100644\nindex 0000000000..015aca79bf\n--- /dev/null\n+++ b/sql/Bots/locales/ruRU/npc_text_locale.sql\n@@ -0,0 +1,380 @@\n+DELETE FROM `npc_text_locale` WHERE `Locale`='ruRU' AND `ID` BETWEEN '70000' AND '71000';\n+INSERT INTO `npc_text_locale` (`ID`, `Locale`, `Text0_0`, `Text0_1`, `Text1_0`, `Text1_1`, `Text2_0`, `Text2_1`, `Text3_0`, `Text3_1`, `Text4_0`, `Text4_1`, `Text5_0`, `Text5_1`, `Text6_0`, `Text6_1`, `Text7_0`, `Text7_1`)\n+VALUES\n+('70001', 'ruRU', 'Я живу только для того, чтобы служить хозяину!', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70002', 'ruRU', 'Тебе что-то нужно?', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70003', 'ruRU', 'Смертные... обычно я убиваю тварей вроде тебя как только увижу!', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70004', 'ruRU', '<Перед вами, похоже, обсидиановый разрушитель. Этот, впрочем, выглядит иначе, поврежденный и поблекший, он не реагирует на ваше присутствие. Вам помнится Плеть когда-то давно использовала таких. Как, черт возьми, он оказался здесь? При дальнейшем осмотре вы замечаете щель на его спине.>', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70005', 'ruRU', '<Обсидиановый Разрушитель смотрит на вас и издает глубокий рычащий звук.>', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70006', 'ruRU', 'Ты удивлен, смертный? Как низший натрезим, я вынужден прибегать к поиску союзников. Ты выглядишь так, будто сможешь меня хотя бы развлечь.', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70007', 'ruRU', 'Ну что ещё, смертный?', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70008', 'ruRU', 'Ты можешь просто оставить меня в покое? <вздох>', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70009', 'ruRU', 'Что теперь?', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70010', 'ruRU', '<Вы видите истощенную предводительницу наг. Она выглядит усталой и слабой, и пытается не смотреть на вас.>$B$BНе нуж-жно с-с-слов, с-с-смертный...', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70011', 'ruRU', 'У меня опять что-то не так с-с причёс-ской? <Она расчесывает свои \"волосы\">$B... Нет, вс-сё в порядке. Так в чём же дело?', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70101', 'ruRU', '|cffff3300Мастер Клинка|r$b|cffdd6600-=отсылка к Warcraft III=-|r$B$B\"Элитный мечник, бывший член клана Пылающего Клинка, ныне элитный воин ​​Орды\".$B$BОсновная характеристика: Ловкость.$B$BПуть Пустоты (Прогулка с ветром). Позволяет Мастеру клинка становиться невидимым и двигаться быстрее в течение определенного времени. Если Мастер клинка атакует врага, выходя из невидимости, он наносит дополнительный урон.$B$BЗеркальное изображение. Сбивает противника с толку, создавая иллюзию Мастера клинка и рассеивая всю магию Мастера клинка.$B$BКритический удар (пассивный). Дает 15% шанс нанести критический урон в 2(3,4) раза больше обычного при атаках.$B$BВихрь клинков (NIY). Дает иммунитет к магии и наносит урон всем окружающим врагам.$B$B', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70102', 'ruRU', '|cff9900ccОбсидиановый Разрушитель|r$b|cffdd6600-=отсылка к Warcraft III=-|r$B$B\"Крылатое чудовище из обсидиана, обладающее ненасытной жаждой магии\".$B$BКрепкая броня, очень высокое сопротивление, частичный иммунитет к магии, постоянно теряет ману, пассивные эффекты регенерации маны для него бесполезны, кольчужная/латная броня, использует жезлы в обоих руках, наносит урон темной магией, нет физической атаки, не может атаковать во время перемещения, бонус к силе заклинаний: 50% силы атаки + 200% интеллекта + урон жезлов.$B$BПожирание магии. Снимает до 2 магических эффектов с врагов, до 2 магических эффектов и до 2 проклятий с союзников и наносит урон призванным юнитам в радиусе 20 м. Каждый развеянный эффект восстанавливает 20% маны и 5% здоровья, время восстановления 7 секунд.$B$BТеневой взрыв. Усиленная атака, наносящая повышенный урон по площади.$B$BВытягивание маны. Вытягивает всю ману (ограниченную запасом маны заклинателя) из случайного дружественного юнита.$B$BПополнить запасы маны. Восполняет манну окружающим участникав группы и рейда в радиусе 25 ярдов на 3% от их максимального запаса, сводя на нет ману заклинателя, время восстановления 3 секунды.$B$BАура восстановления. Исцеляет окружающих членов группы и рейда в радиусе 25 м на 3% от их максимального запаса здоровья, сводя на нет ману заклинателя, время восстановления 3 секунды.$B$BТемная броня (пассивная). Восстанавливает ману в размере процента от полученного урона.$B$B', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70103', 'ruRU', '|cff0000ddАрхимаг|r$b|cffdd6600-=отсылка к Warcraft III=-|r$B$B Получаемый урон от заклинаний уменьшен на 35%, частично невосприимчив к эффектам контроля, тканевая броня, наносит урон от магии огня/льда, нет физической атаки, бонус к силе заклинаний: 100% интеллекта. Основная характеристика: Интеллект.$B$BСнежная буря. Обычная снежная буря, только немного мощнее, время восстановления 6 секунд.$B$BПризыв элементаля воды. Призывает элементаля воды, который атакует врагов архимага. Время восстановления: 1 мин., 20 сек.$B$BАура великолепия. Увеличивает максимальный запас маны на 10% и значительно увеличивает регенерацию маны участников группы и рейда в радиусе 40 м.$B$BM Массовая телепортация. NIY.$B$B', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70104', 'ruRU', '|cff9900ccПовелитель Ужаса|r$b|cffdd6600-=отсылка к Warcraft III=-|r$B$B\"Невероятно могущественный демон, владеющий силами тьмы и управления разумом\".$B$BКрепкая броня, высокое сопротивление, частичная невосприимчивость к эффектам контроля, получаемый урон ускоряет перезарядку заклинаний, латная броня, наносит урон в ближнем бою а также урон от темной магии, дополнительный урон по целям выведенным из равновесия, бонус к силе заклинаний: 200% силы. Основная характеристика: Сила.$B$BТемная Стая. Посылает стаю летучих мышей наносящих урон от магии в конусе перед собой, не может нанести критический урон, время восстановления 10 секунд.$B$BСон. Погружает вражескую цель в сон на 60 секунд и позволяет при наненсения урона следующей физической атаке этой цели игнорировать ее броню, нанесенный прямой урон пробудит цель, время восстановления 6 секунд.$B$BАура вампиризма. Увеличивает физический критический урон на 5% и исцеляет членов группы и рейда в радиусе 40 м в процентном соотношении (100% для Повелителя ужаса и 25% для всех остальных) от урона, нанесенного физическими атаками в ближнем бою и Темной Стаей, без угрозы.$B$BПризыв Инфернала. Призывает инфернала с неба на 180 секунд, нанося урон и оглушая врагов, инфернал очень устойчив к магии, время восстановления 180 секунд.$B$B', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70105', 'ruRU', '|cff0000ddРазрушитель Заклинаний|r$b|cffdd6600-=отсылка к Warcraft III=-|r$B$B\"Эльфийский воин, специально обученный разрушать и искажать магию\".$B$BУрон, получаемый от заклинаний, уменьшен на 75%, частично невосприимчив к эффектам контроля, штраф за броню -30%, кольчужная/латная броня, наносит урон в ближнем бою и урон от тайной магии, бонус к силе заклинаний: 200% силы. Основная характеристика: Сила.$B$BПохищение Магии. Похищает полезное заклинание у врага и передаёт его ближайшему союзнику или снимает отрицательное заклинание с союзника на ближайшего врага, влияет на эффекты магии и проклятия, время восстановления 2 секунды.$B$BСожжение Маны (пассивная). Успешные атаки ближнего боя сжигают ману цели, равную нанесенному урону (увеличенному силой заклинаний), нанося урон от тайной магии. Если мана цели исчерпана, атаки ближнего боя Разрушителя Заклинаний будут наносить тройной урон с повышенным шансом критического удара. Если у цели нет маны, Разрушитель Заклинаний восполнит ману в количестве 25% от нанесенного урона.$B$B', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70106', 'ruRU', '|cff9900ccТемная Охотница|r$b|cffdd6600-=отсылка к Warcraft III=-|r$B$B\"Бывшая охотница Кель\\'Таласа, насильно возвращённая из мира мёртвых\".$B$B Получаемый урон от заклинаний уменьшен на 35%, нежить, частично невосприимчива к эффектам контроля, кожаная/тканевая броня, наносит физический урон/урон от темной магии, придерживается теней и не генерирует угрозы, бонус к силе заклинаний: 50% интеллекта. Основное характеристика: Ловкость.$B$BБезмолвие. Заставляет врага и до 4 его ближайших друзей замолчать на 8 секунд, теряя возможность применять заклинания, время восстановления 15 секунд.$B$BЧерная стрела. Выпускает проклятую стрелу, наносящую 150% урона от оружия и дополнительный урон от темной магии каждые несколько секунд. Если цель умирает от урона Темной Охотницы, она превратится в Тёмного Приспешника (максимум 5 приспешников, продолжительность 80 секунд, срабатывает только на гуманоидах, зверях и драконах). Наносит пятикратный урон, если у цели меньше 20% здоровья.$B$Bпохищение Жизни. Высасывает здоровье врага каждую секунду в течение 5 секунд, исцеляя Темную Охотницу на 200% от похищенного количества.$B$B', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70107', 'ruRU', '|cff9900ccНекромант|r$b|cffdd6600-=отсылка к Warcraft III / Diablo II=-|r$B$BПолучаемый урон от заклинаний уменьшен на 20%, частично невосприимчив к эффектам контроля, тканевая броня, наносит урон от темной магии, нет физической атаки, бонус к силе заклинаний: интеллект 100%. Основная характеристика: Интеллект.$B$BВоскрешение Мертвых. Поднимает 2 скелета из трупа (максимум 6 скелетов, продолжительность 65 секунд, работает только с гуманоидами, зверями и драконами).$B$BНечестивое Бешенство. Увеличивает скорость атаки цели в ближнем бою на 75%, но постоянно истощает здоровье. Длится 45 секунд. Не может быть отменено. Разблокируется на 30 уровне.$B$BВзрыв Трупа. Заставляет труп взорваться, нанося урон в размере от 35% до 75% от максимального здоровья мертвого существа (зависит от уровня Некроманта) всем окружающим врагам. Этот урон не генерирует угрозы. Разблокируется на 40 уровне.$B$BУвечье. Снижает скорость передвижения цели, скорость атаки в ближнем бою и общую силу на 50% на 60 секунд. Разблокируется на уровне 50.$B$B', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70108', 'ruRU', '|cff0000ddМорская Ведьма|r$b|cffdd6600-=отсылка к Warcraft III=-|r$B$B\"Грозная колдунья наг, часто ассоциирующаяся с приходом ужасных штормов\".$B$BПолучаемый урон от заклинаний уменьшен на 30%, частично невосприимчив к эффектам контроля, тканевая броня, наносит физический урон/урон от магии льда, бонус к силе атаки: ловкость x2, бонус к силе заклинаний: 200% к интеллекту. Основная характеристика: Интеллект.$B$BРаздвоенная молния. Вызывает разветвлённую молнию, наносящую урон врагам. Поражает от 2 до всех целей (в зависимости от уровня Морской Ведьмы), оглушая их на 2 секунды. Этот урон не создает угрозы.$B$BЛедяные Стрелы. Наполняет стрелу магическим морозом для дополнительного урона, снижая скорость движения цели, скорость атаки и произнесения заклинаний на 30-70% (в зависимости от уровня Морской ведьмы).$B$BЩит Маны. Создает щит, который поглощает 100% входящего (не смягченного) урона, используя ману Морской Ведьмы. Эффект варьируется от 1 единицы урона за 10 единиц маны до 10 единиц урона за 1 единицу ману (в зависимости от уровня Морской Ведьмы).$B$BТорнадо. Вызывает яростный торнадо, который наносит урон и замедляет ближайших врагов, иногда полностью выводя их из строя. На открытом пространстве Торнадо со временем разрастается, увеличивая наносимый урон и область действия, но в закрытом помещении уменьшается и быстро рассеивается. Разблокируется на уровне 60.$B$BНага (пассивный эффект). Скорость плавания, урон и шанс уклонения значительно увеличиваются в воде.$B$B', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70201', 'ruRU', 'Всегда найдутся чуваки, готовые убить за деньги.', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70202', 'ruRU', 'Наёмники востребованы всегда. Вот кто доступен прямо сейчас.', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70203', 'ruRU', 'Наёмники востребованы всегда. Вот кто доступен прямо сейчас.', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70204', 'ruRU', 'Похоже сейчас никого нет, проверь позже.', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70300', 'ruRU', 'Умри!', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70301', 'ruRU', 'Воскрешаю тебя', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70302', 'ruRU', 'Воскрешаю ', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70303', 'ruRU', 'твой бот', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70304', 'ruRU', ' бот', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70305', 'ruRU', 'Я пока не могу применить заклинание создания воды', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70306', 'ruRU', 'Я пока не могу применить заклинание создания еды', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70307', 'ruRU', 'Я не могу сделать это сейчас', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70308', 'ruRU', 'Во-о-от...', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70309', 'ruRU', 'Отключено', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70310', 'ruRU', 'Ещё не готово', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70311', 'ruRU', 'Неверный тип объекта', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70312', 'ruRU', 'Не удалось', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70313', 'ruRU', 'Готово', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70314', 'ruRU', 'Я не изменил форму', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70315', 'ruRU', 'У меня нет камня здоровья', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70316', 'ruRU', 'Я пока не могу создавать камни здоровья!', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70317', 'ruRU', 'WTF у меня нет отмычек!', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70318', 'ruRU', 'Мой уровень навыка недостаточно высок', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70319', 'ruRU', 'Меняю специализацию на ', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70320', 'ruRU', 'Оружие', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70321', 'ruRU', 'Неистовство', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70322', 'ruRU', 'Защита', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70323', 'ruRU', 'Воздаяние', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70324', 'ruRU', 'Повелитель зверей', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70325', 'ruRU', 'Стрельба', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70326', 'ruRU', 'Выживание', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70327', 'ruRU', 'Ликвидация', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70328', 'ruRU', 'Бой', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70329', 'ruRU', 'Скрытность', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70330', 'ruRU', 'Послушание', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70331', 'ruRU', 'Свет', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70332', 'ruRU', 'Тьма', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70333', 'ruRU', 'Кровь', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70334', 'ruRU', 'Лёд', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70335', 'ruRU', 'Нечестивость', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70336', 'ruRU', 'Стихии', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70337', 'ruRU', 'Совершенствование', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70338', 'ruRU', 'Исцеление', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70339', 'ruRU', 'Тайная магия', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70340', 'ruRU', 'Огонь', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70341', 'ruRU', 'Колдовство', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70342', 'ruRU', 'Демонология', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70343', 'ruRU', 'Разрушение', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70344', 'ruRU', 'Баланс', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70345', 'ruRU', 'Сила зверя', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70346', 'ruRU', 'Неизвестно', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70347', 'ruRU', 'Проваливай, слабак', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70348', 'ruRU', ' не убеждён', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70349', 'ruRU', 'Я не собираюсь тратить свое время на всякую ерунду', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70353', 'ruRU', 'Я готов', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70354', 'ruRU', 'Уходи. Я служу своему хозяину ', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70355', 'ruRU', 'неизвестный', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70356', 'ruRU', ' на тебя!', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70357', 'ruRU', ' на себя!', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70358', 'ruRU', ' на ', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70359', 'ruRU', ' использовано!', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70360', 'ruRU', 'бот-танк', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70361', 'ruRU', 'класс', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70362', 'ruRU', 'игрок', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70363', 'ruRU', 'владелец', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70364', 'ruRU', 'никто', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70365', 'ruRU', 'Уровень', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70366', 'ruRU', 'талант', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70367', 'ruRU', 'пассивный', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70368', 'ruRU', 'скрытый', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70369', 'ruRU', 'изучен', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70370', 'ruRU', 'способность', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70371', 'ruRU', 'сила', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70372', 'ruRU', 'ловкость', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70373', 'ruRU', 'выносливость', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70374', 'ruRU', 'интеллект', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70375', 'ruRU', 'дух', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70376', 'ruRU', 'неизвестный стат', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70377', 'ruRU', 'всего', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70378', 'ruRU', 'Сила атаки ближний бой', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70379', 'ruRU', 'Сила атаки дальний бой', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70380', 'ruRU', 'броня', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70381', 'ruRU', 'крит', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70382', 'ruRU', 'защита', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70383', 'ruRU', 'промах', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70384', 'ruRU', 'уклонение', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70385', 'ruRU', 'парирование', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70386', 'ruRU', 'блок', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70387', 'ruRU', 'показатель блокирования', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70388', 'ruRU', 'Получаемый урон в ближнем бою', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70389', 'ruRU', 'Получаемый урон от заклинаний', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70390', 'ruRU', 'Разброс урона оружия в правой руке', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70391', 'ruRU', 'Множитель урона оружия в правой руке', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70392', 'ruRU', 'Скорость атаки оружием в правой руке', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70393', 'ruRU', 'Разброс урон оружия в левой руке', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70394', 'ruRU', 'Множитель урона оружия в левой руке', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70395', 'ruRU', 'Скорость атаки оружием в левой руке', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70396', 'ruRU', 'Разброс урона оружия дальнего боя', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70397', 'ruRU', 'Множитель урона оружия дальнего боя', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70398', 'ruRU', 'Скорость атаки оружием дальнего боя', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70399', 'ruRU', 'минимум', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70400', 'ruRU', 'максимум', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70402', 'ruRU', 'базовый уровень здоровья', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70403', 'ruRU', 'всего здоровья', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70404', 'ruRU', 'базовый уровень маны', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70405', 'ruRU', 'всего маны', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70406', 'ruRU', 'текущий запас маны', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70407', 'ruRU', 'сила заклинаний', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70408', 'ruRU', 'бонус регенерации здоровья_5', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70409', 'ruRU', 'регенерация маны_5 без использования заклинания', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70410', 'ruRU', 'регенерация маны_5 при использовании заклинания', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70411', 'ruRU', 'скорость', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70412', 'ruRU', 'меткость', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70413', 'ruRU', 'мастерство', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70414', 'ruRU', 'пробивание брони', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70415', 'ruRU', 'проникновение заклинаний', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70416', 'ruRU', 'проц.', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70417', 'ruRU', 'святлая магия', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70418', 'ruRU', 'магия огня', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70419', 'ruRU', 'силы природы', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70420', 'ruRU', 'магия льда', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70421', 'ruRU', 'темная магия', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70422', 'ruRU', 'тайная магия', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70423', 'ruRU', 'Сопротивление', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70424', 'ruRU', 'Состояния команд', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70425', 'ruRU', 'Следовать', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70426', 'ruRU', 'Атаковать', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70427', 'ruRU', 'Стоять', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70428', 'ruRU', 'Сброс', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70429', 'ruRU', 'Полная остановка', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70430', 'ruRU', 'Дистанция следования', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70431', 'ruRU', 'Специализация', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70432', 'ruRU', 'Маска ролей ботов (главная)', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70433', 'ruRU', 'Маска ролей ботов (сбор)', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70434', 'ruRU', 'PvP-убийства', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70435', 'ruRU', 'игроки', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70436', 'ruRU', 'Умер ', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70437', 'ruRU', ' раз', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70438', 'ruRU', '%s (бот) успокаивается', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70439', 'ruRU', '<Отладка>', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70440', 'ruRU', 'Вы уверены, что хотите рискнуть, привлекая внимание ', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70441', 'ruRU', '?', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70442', 'ruRU', '<Вставить монету>', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70443', 'ruRU', 'Вы хотите приманить ', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70444', 'ruRU', '<Попробовать сделать подношение>', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70445', 'ruRU', 'Вы хотите нанять ', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70446', 'ruRU', '<Нанять бота>', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70447', 'ruRU', 'Снаряжение...', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70448', 'ruRU', 'Роли...', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70449', 'ruRU', 'Построение...', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70450', 'ruRU', 'Способности...', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70451', 'ruRU', 'Специализация...', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70452', 'ruRU', 'Дать использовать...', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70453', 'ruRU', '<Создать группу>', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70454', 'ruRU', '<Создать группу (все боты)>', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70455', 'ruRU', '<Добавить в группу>', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70456', 'ruRU', '<Добавить всех ботов в группу>', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70457', 'ruRU', '<Удалить из группы>', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70458', 'ruRU', 'Следуй за мной', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70459', 'ruRU', 'Удерживай позицию', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70460', 'ruRU', 'Стой здесь и ничего не делай', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70461', 'ruRU', 'Мне нужна еда', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70462', 'ruRU', 'Мне нужна вода', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70463', 'ruRU', 'Мне нужен стол с едой', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70464', 'ruRU', 'Помоги мне взломать замок', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70465', 'ruRU', 'Мне нужен камень здоровья', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70466', 'ruRU', 'Мне нужен источник душ', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70467', 'ruRU', 'Мне нужно, чтобы ты обновил яды', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70468', 'ruRU', '<Выберите яд (правая рука)>', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70469', 'ruRU', '<Выберите яд (левая рука)>', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70470', 'ruRU', 'Мне нужно, чтобы ты обновил чары', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70471', 'ruRU', '<Выберите чары (правая рука)>', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70472', 'ruRU', '<Выберите чары (левая рука)>', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70473', 'ruRU', 'Мне нужно, чтобы ты вышел из формы', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70474', 'ruRU', '<Выбрать тип питомца>', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70475', 'ruRU', 'Свободен отсюда', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70476', 'ruRU', 'Вы действительно хотите уволить ', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70477', 'ruRU', 'Вы можете пожалеть об этом...', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70478', 'ruRU', 'Соберись, тряпка', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70479', 'ruRU', '<Рассмотреть существо>', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70480', 'ruRU', 'Ладно, не важно', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70481', 'ruRU', 'дист.', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70482', 'ruRU', 'НАЗАД', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70483', 'ruRU', '<Авто>', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70484', 'ruRU', '<Нет>', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70485', 'ruRU', 'Случайный (Хитрость)', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70486', 'ruRU', 'Случайный (Свирепость)', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70487', 'ruRU', 'Случайный (Упорство)', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70488', 'ruRU', 'Покажи мне свой инвентарь', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70489', 'ruRU', 'Автовыбор', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70490', 'ruRU', 'Правая рука', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70491', 'ruRU', 'Левая рука', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70492', 'ruRU', 'Дальний бой', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70493', 'ruRU', 'Реликвия', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70494', 'ruRU', 'Голова', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70495', 'ruRU', 'Плечи', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70496', 'ruRU', 'Грудь', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70497', 'ruRU', 'Пояс', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70498', 'ruRU', 'Ноги', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70499', 'ruRU', 'Ступни', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70500', 'ruRU', 'Запястья', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70501', 'ruRU', 'Кисти рук', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70502', 'ruRU', 'Спина', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70503', 'ruRU', 'Рубашка', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70504', 'ruRU', 'Палец1', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70505', 'ruRU', 'Палец2', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70506', 'ruRU', 'Аксессуар1', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70507', 'ruRU', 'Аксессуар2', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70508', 'ruRU', 'Шея', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70509', 'ruRU', 'Снять все', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70510', 'ruRU', 'Обновить внешний вид', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70511', 'ruRU', 'только внешний вид', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70512', 'ruRU', 'Надето', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70513', 'ruRU', 'ничего', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70514', 'ruRU', 'Используй свое старое cнаряжение', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70515', 'ruRU', 'Снять', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70516', 'ruRU', 'Хм... мне нечего тебе дать', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70517', 'ruRU', 'Сбор ингредиентов', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70518', 'ruRU', 'Статус способностей', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70519', 'ruRU', 'Разрешённые способности', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70520', 'ruRU', 'Используй ', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70521', 'ruRU', 'Обновить', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70522', 'ruRU', 'Урон', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70523', 'ruRU', 'Контроль', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70524', 'ruRU', 'Лечение', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70525', 'ruRU', 'Другое', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70526', 'ruRU', ' издает скрежет и начинает следовать за ', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70527', 'ruRU', '%s не присоединится к вам, пока владелец не уволит', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70528', 'ruRU', '%s не присоединится к вам, пока вы не достигнете 60-го уровня', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70529', 'ruRU', '%s не присоединится к вам, пока вы не достигнете 55-го уровня', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70530', 'ruRU', '%s не присоединится к вам, пока вы не достигнете 40-го уровня', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70531', 'ruRU', '%s не присоединится к вам, пока вы не достигнете 20-го уровня', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70532', 'ruRU', 'Вы превысили максимальное количество ботов (%u)', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70533', 'ruRU', 'У вас недостаточно денег', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70534', 'ruRU', 'У вас не может быть больше ботов этого класса! %u из %u', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70535', 'ruRU', 'Не удается сбросить снаряжение в слоте %u (%s)! Не могу уволить бота!', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70536', 'ruRU', 'сейчас', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70537', 'ruRU', 'Дистанция атаки', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70538', 'ruRU', 'Короткая дистанция', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70539', 'ruRU', 'Длинная дистанция', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70540', 'ruRU', 'Заданная', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70541', 'ruRU', 'Снять бафф', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70542', 'ruRU', 'Исправь тип энергии', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70543', 'ruRU', 'Не могу снять %s по какой-то идиотской причине! Отправляю по почте', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70544', 'ruRU', 'Танк', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70545', 'ruRU', 'Дальний бой', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70546', 'ruRU', 'Горное дело', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70547', 'ruRU', 'Травничество', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70548', 'ruRU', 'Снятие шкур', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70549', 'ruRU', 'Инженерное дело', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70550', 'ruRU', 'Срок владения ботом истек из-за бездействия', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70551', 'ruRU', 'Система NpcBot в данный момент отключена. Пожалуйста, обратитесь к администратору', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70552', 'ruRU', '%s не присоединится к вам, уже есть владелец: %s', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70553', 'ruRU', '%s не может присоединиться к вам: телепортируется', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70554', 'ruRU', 'Дух', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70555', 'ruRU', 'Обезьяна', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70556', 'ruRU', 'Ястреб', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70557', 'ruRU', 'Гепард', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70558', 'ruRU', 'Гадюка', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70559', 'ruRU', 'Зверь', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70560', 'ruRU', 'Стая', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70561', 'ruRU', 'Дикий', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70562', 'ruRU', 'Дракондор', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70563', 'ruRU', 'Нет духа', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70564', 'ruRU', 'Аура', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70565', 'ruRU', 'Благочестие', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70566', 'ruRU', 'Сосредоточенность', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70567', 'ruRU', 'Защита от огня', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70568', 'ruRU', 'Защита от магии льда', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70569', 'ruRU', 'Защита от темной магии', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70570', 'ruRU', 'Воздаяние', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70571', 'ruRU', 'Воин света', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70572', 'ruRU', 'Нет ауры', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70573', 'ruRU', 'Калечащий', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70574', 'ruRU', 'Быстродействующий', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70575', 'ruRU', 'Смертельный', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70576', 'ruRU', 'Нейтрализующий', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70577', 'ruRU', 'Дурманящий', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70578', 'ruRU', 'Анестезирующий', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70579', 'ruRU', 'Ничего', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70580', 'ruRU', 'Языки пламени', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70581', 'ruRU', 'Ледяное клеймо', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70582', 'ruRU', 'Неистовство ветра', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70583', 'ruRU', 'Жизнь земли', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70584', 'ruRU', 'Мне нужны твои услуги', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70585', 'ruRU', 'У тебя слишком много ботов', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70586', 'ruRU', 'Вы хотите нанять ', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70587', 'ruRU', ' сейчас немного занят, повторите попытку позже.', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70588', 'ruRU', 'Приятно иметь с тобой дело', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70589', 'ruRU', 'Воины', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70590', 'ruRU', 'Паладины', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70591', 'ruRU', 'Маги', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70592', 'ruRU', 'Жрецы', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70593', 'ruRU', 'Чернокнижники', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70594', 'ruRU', 'Друиды', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70595', 'ruRU', 'Рыцари Смерти', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70596', 'ruRU', 'Разбойники', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70597', 'ruRU', 'Шаманы', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70598', 'ruRU', 'Охотники', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70599', 'ruRU', 'Мастера Клинка', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70600', 'ruRU', 'Разрушители', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70601', 'ruRU', 'Архимаги', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70602', 'ruRU', 'Повелители Ужаса', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70603', 'ruRU', 'Разрушители Заклинаний', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70604', 'ruRU', 'Тёмные Охотницы', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70605', 'ruRU', 'Воин', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70606', 'ruRU', 'Паладин', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70607', 'ruRU', 'Маг', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70608', 'ruRU', 'Жрец', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70609', 'ruRU', 'Чернокнижник', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70610', 'ruRU', 'Друид', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70611', 'ruRU', 'Рыцарь смерти', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70612', 'ruRU', 'Разбойник', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70613', 'ruRU', 'Шаман', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70614', 'ruRU', 'Охотник', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70615', 'ruRU', 'Мастер Клинка', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70616', 'ruRU', 'Разрушитель', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70617', 'ruRU', 'Архимаг', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70618', 'ruRU', 'Повелитель Ужаса', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70619', 'ruRU', 'Разрушитель Заклинаний', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70620', 'ruRU', 'Темная Охотница', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70621', 'ruRU', 'Мужчина', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70622', 'ruRU', 'Женщина', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70623', 'ruRU', 'Человек', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70624', 'ruRU', 'Орк', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70625', 'ruRU', 'Гном', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70626', 'ruRU', 'Ночной эльф', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70627', 'ruRU', 'Нежить', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70628', 'ruRU', 'Таурен', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70629', 'ruRU', 'Гном', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70630', 'ruRU', 'Тролль', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70631', 'ruRU', 'Эльф крови', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70632', 'ruRU', 'Дреней', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70633', 'ruRU', 'Неизвестно', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70634', 'ruRU', 'Сбор добычи', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70635', 'ruRU', '|cff9d9d9dПлохой|r', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70636', 'ruRU', '|cffffffffОбычный|r', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70637', 'ruRU', '|cff1eff00Необычный|r', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70638', 'ruRU', '|cff0070ddРедкий|r', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70639', 'ruRU', '|cffa335eeЭпический|r', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70640', 'ruRU', '|cffff8000Легендарный|r', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70641', 'ruRU', 'Активное действие', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70642', 'ruRU', 'Задержка атаки на', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70643', 'ruRU', 'Задержка лечения на', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70644', 'ruRU', 'с', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70645', 'ruRU', 'Off-танк (второй танк)', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70646', 'ruRU', 'Некроманты', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70647', 'ruRU', 'Некромант', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70648', 'ruRU', 'Позиционирование в дальнем бою', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70649', 'ruRU', 'Обычное', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70650', 'ruRU', 'Избегать фронтального АОЕ', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70652', 'ruRU', 'Вы уверены, что это сработает? Это должна быть самая лучшая вода в мире...', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70653', 'ruRU', 'Похоже, тебе не помешает хороший глоток свежей воды.', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70654', 'ruRU', 'Морские Ведьмы', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70655', 'ruRU', 'Морская Ведьма', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70656', 'ruRU', 'Маны на единицу урона', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70657', 'ruRU', 'Урона на еденицу маны', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),\n+('70658', 'ruRU', 'Трансмогрификация...', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\ndiff --git a/sql/Bots/locales/zhCN/creature_template_locale.sql b/sql/Bots/locales/zhCN/creature_template_locale.sql\nnew file mode 100644\nindex 0000000000..59fd943711\n--- /dev/null\n+++ b/sql/Bots/locales/zhCN/creature_template_locale.sql\n@@ -0,0 +1,742 @@\n+DELETE FROM `creature_template_locale` WHERE `entry`=70595 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70595, 'zhCN', '蝗虫', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70594 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70594, 'zhCN', '腐尸甲虫', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70593 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70593, 'zhCN', '腐尸甲虫', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70592 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70592, 'zhCN', '腐尸甲虫', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70591 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70591, 'zhCN', '荷鲁斯明', '机动 地穴领主', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70590 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70590, 'zhCN', '阿拉克-阿拉姆', '机动 地穴领主', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70589 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70589, 'zhCN', '翡若斯', '机动 地穴领主', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70588 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70588, 'zhCN', '厄努比洛斯', '机动 地穴领主', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70587 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70587, 'zhCN', '图坦阿拉克', '机动 地穴领主', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70586 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70586, 'zhCN', '龙卷风', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70585 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70585, 'zhCN', '恰利布迪沙', '机动 深渊海巫', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70584 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70584, 'zhCN', '灰云', '机动 深渊海巫', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70583 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70583, 'zhCN', '小丽', '机动 深渊海巫', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70582 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70582, 'zhCN', '毒蛇娜', '机动 深渊海巫', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70581 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70581, 'zhCN', '康德拉', '机动 深渊海巫', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70580 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70580, 'zhCN', '骷髅', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70579 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70579, 'zhCN', '德罗萨姆', '机动 死灵法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70578 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70578, 'zhCN', '丰磨', '机动 死灵法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70577 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70577, 'zhCN', '赫克斯尔', '机动 死灵法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70576 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70576, 'zhCN', '罗希克', '机动 死灵法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70575 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70575, 'zhCN', '帕卡', '机动 死灵法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70574 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70574, 'zhCN', '黑暗使徒', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70573 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70573, 'zhCN', '暗影使徒', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70572 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70572, 'zhCN', '丽拉', '机动 黑暗游侠', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70571 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70571, 'zhCN', '达莉丝', '机动 黑暗游侠', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70570 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70570, 'zhCN', '伊娃', '机动 黑暗游侠', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70569 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70569, 'zhCN', '谭', '机动 黑暗游侠', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70568 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70568, 'zhCN', '玛拉', '机动 黑暗游侠', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70567 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70567, 'zhCN', '涅什达', '机动 破法者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70566 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70566, 'zhCN', '丹斯德', '机动 破法者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70565 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70565, 'zhCN', '凯尔诺', '机动 破法者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70564 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70564, 'zhCN', '纳森', '机动 破法者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70563 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70563, 'zhCN', '伊诺尔', '机动 破法者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70562 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70562, 'zhCN', '炼狱', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70561 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70561, 'zhCN', '拉马罗特', '机动 恐惧魔王', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70560 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70560, 'zhCN', '罗特修斯', '机动 恐惧魔王', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70559 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70559, 'zhCN', '扎拉蒙', '机动 恐惧魔王', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70558 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70558, 'zhCN', '恶魔罗斯', '机动 恐惧魔王', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70557 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70557, 'zhCN', '尼罗斯', '机动 恐惧魔王', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70556 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70556, 'zhCN', '水元素', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70555 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70555, 'zhCN', '迪崔', '机动 高阶法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70554 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70554, 'zhCN', '阿默', '机动 殁境神蚀者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70553 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70553, 'zhCN', '欧西斯', '机动 殁境神蚀者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70552 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70552, 'zhCN', '剑圣', '机动 剑圣', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70551 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70551, 'zhCN', '戈克拉马托', '机动 剑圣', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70545 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70545, 'zhCN', '树人', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70544 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70544, 'zhCN', '水元素', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70543 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70543, 'zhCN', '灵狼', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70542 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70542, 'zhCN', '暗影恶魔', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70538 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70538, 'zhCN', '升起食尸鬼', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70537 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70537, 'zhCN', '虫子', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70536 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70536, 'zhCN', '犀牛', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70535 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70535, 'zhCN', '魔暴龙', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70534 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70534, 'zhCN', '核心犬', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70533 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70533, 'zhCN', '灵兽', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70532 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70532, 'zhCN', '奇美拉', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70531 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70531, 'zhCN', '蛰鞭兽', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70530 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70530, 'zhCN', '扭曲潜行者', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70529 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70529, 'zhCN', '鳄鱼兽', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70528 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70528, 'zhCN', '螃蟹', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70527 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70527, 'zhCN', '猪', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70526 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70526, 'zhCN', '熊', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70525 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70525, 'zhCN', '大猩猩', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70524 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70524, 'zhCN', '乌龟', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70523 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70523, 'zhCN', '天蝎灵', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70522 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70522, 'zhCN', '特罗莫斯', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70521 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70521, 'zhCN', '黄蜂', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70520 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70520, 'zhCN', '鬣狗', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70519 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70519, 'zhCN', '猫', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70518 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70518, 'zhCN', '高大步行者', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70517 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70517, 'zhCN', '狼', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70516 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70516, 'zhCN', '猛禽', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70515 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70515, 'zhCN', '腐肉鸟', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70514 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70514, 'zhCN', '孢子蝙', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70513 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70513, 'zhCN', '虚空鳐', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70512 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70512, 'zhCN', '龙鹰', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70511 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70511, 'zhCN', '毁灭者', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70510 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70510, 'zhCN', '风蛇', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70509 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70509, 'zhCN', '蝙蝠', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70508 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70508, 'zhCN', '掠食之鸟', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70507 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70507, 'zhCN', '毒蛇', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70506 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70506, 'zhCN', '蜘蛛', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70505 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70505, 'zhCN', '恶魔卫士', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70504 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70504, 'zhCN', '邪能猎犬', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70503 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70503, 'zhCN', '魅魔', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70502 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70502, 'zhCN', '虚空行者', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70501 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70501, 'zhCN', '小恶魔', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70465 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70465, 'zhCN', '史蒂芬', '机动 死亡骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70464 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70464, 'zhCN', '曼陀罗', '机动 死亡骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70463 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70463, 'zhCN', '佐贝', '机动 死亡骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70462 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70462, 'zhCN', '克洛克', '机动 死亡骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70461 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70461, 'zhCN', '伊利丽额', '机动 死亡骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70460 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70460, 'zhCN', '乌佐', '机动 死亡骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70459 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70459, 'zhCN', '星澈', '机动 死亡骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70458 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70458, 'zhCN', '阿莉', '机动 死亡骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70457 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70457, 'zhCN', '维瑞思', '机动 死亡骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70456 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70456, 'zhCN', '银缕', '机动 死亡骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70455 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70455, 'zhCN', '岚克雷', '机动 死亡骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70454 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70454, 'zhCN', '缪妮克斯', '机动 死亡骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70453 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70453, 'zhCN', '维伦', '机动 死亡骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70452 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70452, 'zhCN', '音风', '机动 死亡骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70451 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70451, 'zhCN', '苏西', '机动 死亡骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70418 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70418, 'zhCN', '夏兰尼斯', '机动 德鲁伊', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70417 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70417, 'zhCN', '哈琳', '机动 德鲁伊', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70416 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70416, 'zhCN', '洛加纳尔', '机动 德鲁伊', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70415 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70415, 'zhCN', '高林', '机动 德鲁伊', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70414 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70414, 'zhCN', '杰诺斯', '机动 德鲁伊', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70413 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70413, 'zhCN', '曼德林', '机动 德鲁伊', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70412 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70412, 'zhCN', '瑟里德兰', '机动 德鲁伊', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70411 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70411, 'zhCN', '谢尔德拉斯', '机动 德鲁伊', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70410 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70410, 'zhCN', '费勒里安', '机动 德鲁伊', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70409 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70409, 'zhCN', '丹纳萨利安', '机动 德鲁伊', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70408 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70408, 'zhCN', '玛斯兰吉尔', '机动 德鲁伊', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70407 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70407, 'zhCN', '卡尔', '机动 德鲁伊', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70406 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70406, 'zhCN', '马丹特', '机动 德鲁伊', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70405 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70405, 'zhCN', '珍雅', '机动 德鲁伊', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70404 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70404, 'zhCN', '嘉特', '机动 德鲁伊', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70403 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70403, 'zhCN', '凯姆', '机动 德鲁伊', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70402 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70402, 'zhCN', '希尔', '机动 德鲁伊', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70401 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70401, 'zhCN', '图拉克', '机动 德鲁伊', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70377 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70377, 'zhCN', '巴巴加亚', '机动 术士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70376 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70376, 'zhCN', '赞尼恩', '机动 术士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70375 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70375, 'zhCN', '复仇者', '机动 术士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70374 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70374, 'zhCN', '阿拉玛', '机动 术士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70373 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70373, 'zhCN', '赛洛尼斯', '机动 术士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70372 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70372, 'zhCN', '泰莉拉琳', '机动 术士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70371 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70371, 'zhCN', '金瑞兹', '机动 术士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70370 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70370, 'zhCN', '桑达尔', '机动 术士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70369 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70369, 'zhCN', '厄伊', '机动 术士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70368 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70368, 'zhCN', '亚历山大', '机动 术士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70367 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70367, 'zhCN', '荆棘霜', '机动 术士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70366 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70366, 'zhCN', '蓟心', '机动 术士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70365 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70365, 'zhCN', '理查德', '机动 术士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70364 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70364, 'zhCN', '路德', '机动 术士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70363 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70363, 'zhCN', '卡尔', '机动 术士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70362 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70362, 'zhCN', '泽弗洛斯', '机动 术士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70361 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70361, 'zhCN', '米尔凯', '机动 术士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70360 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70360, 'zhCN', '格洛达', '机动 术士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70359 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70359, 'zhCN', '杜古如', '机动 术士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70358 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70358, 'zhCN', '纳托克', '机动 术士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70357 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70357, 'zhCN', '鲁珀', '机动 术士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70356 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70356, 'zhCN', '马克西米利安', '机动 术士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70355 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70355, 'zhCN', '卡托什', '机动 术士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70354 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70354, 'zhCN', '马克西米利安', '机动 术士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70353 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70353, 'zhCN', '德米赛特', '机动 术士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70352 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70352, 'zhCN', '阿拉玛', '机动 术士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70351 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70351, 'zhCN', '杜瑟拉', '机动 术士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70336 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70336, 'zhCN', '德里克', '机动 法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70335 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70335, 'zhCN', '巴蒂', '机动 法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70334 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70334, 'zhCN', '哈南', '机动 法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70333 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70333, 'zhCN', '半葵', '机动 法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70332 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70332, 'zhCN', '华兰斯', '机动 法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70331 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70331, 'zhCN', '伊迪拉', '机动 法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70330 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70330, 'zhCN', '纳林思', '机动 法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70329 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70329, 'zhCN', '因特芬', '机动 法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70328 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70328, 'zhCN', '奎萨思', '机动 法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70327 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70327, 'zhCN', '泽达娜', '机动 法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70326 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70326, 'zhCN', '瓦拉图', '机动 法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70325 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70325, 'zhCN', '嘉瑞德', '机动 法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70324 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70324, 'zhCN', '朱莉', '机动 法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70323 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70323, 'zhCN', '丁克', '机动 法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70322 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70322, 'zhCN', '优瑟妮', '机动 法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70321 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70321, 'zhCN', '迪诺', '机动 法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70320 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70320, 'zhCN', '麦亚', '机动 法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70319 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70319, 'zhCN', '恩尤', '机动 法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70318 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70318, 'zhCN', '菲佛德', '机动 法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70317 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70317, 'zhCN', '恩图瓦', '机动 法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70316 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70316, 'zhCN', '洁娜', '机动 法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70315 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70315, 'zhCN', '尼特尔伯', '机动 法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70314 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70314, 'zhCN', '朱莉', '机动 法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70313 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70313, 'zhCN', '彬克', '机动 法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70312 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70312, 'zhCN', '安娜斯塔西娅', '机动 法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70311 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70311, 'zhCN', '皮尔斯', '机动 法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70310 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70310, 'zhCN', '瑟斯顿', '机动 法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70309 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70309, 'zhCN', '乌尔辛', '机动 法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70308 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70308, 'zhCN', '什姆', '机动 法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70307 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70307, 'zhCN', '肯', '机动 法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70306 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70306, 'zhCN', '伊莎贝拉', '机动 法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70305 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70305, 'zhCN', '魔姬', '机动 法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70304 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70304, 'zhCN', '玛瑞克', '机动 法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70303 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70303, 'zhCN', '玛吉诺', '机动 法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70302 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70302, 'zhCN', '赞迪玛', '机动 法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70301 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70301, 'zhCN', '凯尔登', '机动 法师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70268 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70268, 'zhCN', '贾瓦德', '机动 萨满', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70267 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70267, 'zhCN', '幽蓝', '机动 萨满', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70265 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70265, 'zhCN', '舒拉', '机动 萨满', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70261 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70261, 'zhCN', '萨戈恩', '机动 萨满', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70260 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70260, 'zhCN', '思安德', '机动 萨满', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70259 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70259, 'zhCN', '卡德里斯', '机动 萨满', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70258 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70258, 'zhCN', '斯沃特', '机动 萨满', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70257 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70257, 'zhCN', '采莎', '机动 萨满', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70256 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70256, 'zhCN', '楠琳', '机动 萨满', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70255 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70255, 'zhCN', '米拉', '机动 萨满', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70254 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70254, 'zhCN', '贝拉姆', '机动 萨满', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70253 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70253, 'zhCN', '腾格', '机动 萨满', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70252 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70252, 'zhCN', '思琳', '机动 萨满', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70251 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70251, 'zhCN', '哈罗姆', '机动 萨满', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70240 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70240, 'zhCN', '法拉特', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70239 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70239, 'zhCN', '伊兹密尔', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70238 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70238, 'zhCN', '谷万', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70237 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70237, 'zhCN', '凯德莫斯', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70236 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70236, 'zhCN', '贝莱斯特拉', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70235 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70235, 'zhCN', '洛西兰', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70234 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70234, 'zhCN', '艾尔德雷', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70233 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70233, 'zhCN', '沙尔顿', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70232 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70232, 'zhCN', '波纳里斯', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70231 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70231, 'zhCN', '竞技场', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70230 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70230, 'zhCN', '若涵', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70229 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70229, 'zhCN', '艾莉西娅', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70228 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70228, 'zhCN', '娜拉', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70227 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70227, 'zhCN', '乌尔奇奥', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70226 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70226, 'zhCN', '席雅拉', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70225 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70225, 'zhCN', '泽尤斯', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70224 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70224, 'zhCN', '约书亚', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70223 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70223, 'zhCN', '本杰明', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70222 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70222, 'zhCN', '托尔德伦', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70221 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70221, 'zhCN', '布雷娜', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70220 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70220, 'zhCN', '西奥德鲁斯', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70219 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70219, 'zhCN', '拉撒路', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70218 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70218, 'zhCN', '兰开斯特', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70217 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70217, 'zhCN', '拉莉娅', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70216 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70216, 'zhCN', '杨迪儿', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70215 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70215, 'zhCN', '阿斯塔丽', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70214 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70214, 'zhCN', '肯杰', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70213 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70213, 'zhCN', '泰津', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70212 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70212, 'zhCN', '罗娜', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70211 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70211, 'zhCN', '珊达', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70210 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70210, 'zhCN', '科布', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70209 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70209, 'zhCN', '马拉凯', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70208 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70208, 'zhCN', '迈尔斯', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70207 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70207, 'zhCN', '贝丽', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70206 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70206, 'zhCN', '迪斯滕', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70205 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70205, 'zhCN', '马克森', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70204 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70204, 'zhCN', '枝根', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70203 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70203, 'zhCN', '若青', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70202 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70202, 'zhCN', '罗芮娜', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70201 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70201, 'zhCN', '安妮塔', '机动 牧师', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70181 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70181, 'zhCN', '涅莉森', '机动 潜行者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70180 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70180, 'zhCN', '艾拉拉', '机动 潜行者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70179 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70179, 'zhCN', '泽兰尼斯', '机动 潜行者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70178 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70178, 'zhCN', '坦娜莉娅', '机动 潜行者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70177 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70177, 'zhCN', '卡丽尔', '机动 潜行者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70176 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70176, 'zhCN', '托尼', '机动 潜行者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70175 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70175, 'zhCN', '法拉德', '机动 潜行者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70174 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70174, 'zhCN', '芬瑟维克', '机动 潜行者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70173 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70173, 'zhCN', '奥米尔', '机动 潜行者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70172 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70172, 'zhCN', '霍尔夫丹', '机动 潜行者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70171 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70171, 'zhCN', '格雷戈里', '机动 潜行者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70170 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70170, 'zhCN', '迈尔斯', '机动 潜行者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70169 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70169, 'zhCN', '凯琳', '机动 潜行者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70168 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70168, 'zhCN', '安尼莎', '机动 潜行者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70167 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70167, 'zhCN', '艾瑞昂', '机动 潜行者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70166 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70166, 'zhCN', '思娜', '机动 潜行者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70165 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70165, 'zhCN', '简诺', '机动 潜行者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70164 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70164, 'zhCN', '弗拉洪', '机动 潜行者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70163 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70163, 'zhCN', '深石', '机动 潜行者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70162 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70162, 'zhCN', '奥莫克', '机动 潜行者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70161 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70161, 'zhCN', '盖斯特', '机动 潜行者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70160 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70160, 'zhCN', '卡普拉', '机动 潜行者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70159 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70159, 'zhCN', '鲁瓦格', '机动 潜行者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70158 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70158, 'zhCN', '玛丽安', '机动 潜行者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70157 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70157, 'zhCN', '大卫', '机动 潜行者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70156 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70156, 'zhCN', '伊恩', '机动 潜行者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70155 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70155, 'zhCN', '猎獭', '机动 潜行者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70154 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70154, 'zhCN', '奥斯本', '机动 潜行者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70153 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70153, 'zhCN', '凯琳', '机动 潜行者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70152 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70152, 'zhCN', '索尔姆', '机动 潜行者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70151 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70151, 'zhCN', '乔里克', '机动 潜行者', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70139 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70139, 'zhCN', '杀手', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70138 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70138, 'zhCN', '沃德', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70137 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70137, 'zhCN', '阿克特翁', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70136 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70136, 'zhCN', '德蕾米丝', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70135 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70135, 'zhCN', '赞迪娜', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70134 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70134, 'zhCN', '奥尼纳丝', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70133 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70133, 'zhCN', '塔娜', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70132 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70132, 'zhCN', '凯尔内', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70131 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70131, 'zhCN', '汉诺维亚', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70130 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70130, 'zhCN', '萨琳娜', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70129 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70129, 'zhCN', '达格', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70128 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70128, 'zhCN', '阿伦达', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70127 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70127, 'zhCN', '托尔芬', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70126 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70126, 'zhCN', '乌尔菲尔', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70125 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70125, 'zhCN', '恩瑞斯', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70124 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70124, 'zhCN', '凯布鲁斯', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70123 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70123, 'zhCN', '雷格努斯', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70122 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70122, 'zhCN', '奥尔明', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70121 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70121, 'zhCN', '德拉', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70120 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70120, 'zhCN', '多里昂', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70119 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70119, 'zhCN', '约卡斯特', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70118 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70118, 'zhCN', '洁娜', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70117 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70117, 'zhCN', '丹拉尔', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70116 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70116, 'zhCN', '达扎拉', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70115 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70115, 'zhCN', '艾安娜', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70114 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70114, 'zhCN', '思安杜尔', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70113 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70113, 'zhCN', '索兹朱尔', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70112 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70112, 'zhCN', '奥玛克', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70111 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70111, 'zhCN', '索费雷', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70110 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70110, 'zhCN', '杰尚', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70109 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70109, 'zhCN', '尧', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70108 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70108, 'zhCN', '兰卡', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70107 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70107, 'zhCN', '优瑞', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70106 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70106, 'zhCN', '霍尔特', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70105 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70105, 'zhCN', '凯瑞', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70104 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70104, 'zhCN', '克拉格', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70103 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70103, 'zhCN', '格里夫', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70102 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70102, 'zhCN', '奥格罗姆', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70101 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70101, 'zhCN', '索尔加斯', '机动 猎人', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70100 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70100, 'zhCN', '深海对话触发器', '', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70074 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70074, 'zhCN', '如云', '机动 圣骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70073 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70073, 'zhCN', '烈焰者', '机动 圣骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70072 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70072, 'zhCN', '希莎', '机动 圣骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70071 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70071, 'zhCN', '乔勒', '机动 圣骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70070 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70070, 'zhCN', '图拉斯', '机动 圣骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70069 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70069, 'zhCN', '卡万', '机动 圣骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70068 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70068, 'zhCN', '巴屯', '机动 圣骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70067 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70067, 'zhCN', '巴奇', '机动 圣骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70066 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70066, 'zhCN', '艾瑟丽丝', '机动 圣骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70065 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70065, 'zhCN', '欧瑟兰', '机动 圣骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70064 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70064, 'zhCN', '奥瑞隆', '机动 圣骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70063 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70063, 'zhCN', '娜琳', '机动 圣骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70062 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70062, 'zhCN', '杰斯汀', '机动 圣骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70061 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70061, 'zhCN', '卡曼', '机动 圣骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70060 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70060, 'zhCN', '凯瑟琳', '机动 圣骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70059 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70059, 'zhCN', '亚瑟', '机动 圣骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70058 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70058, 'zhCN', '布兰德尔', '机动 圣骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70057 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70057, 'zhCN', '贝尔德鲁克', '机动 圣骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70056 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70056, 'zhCN', '瓦尔加', '机动 圣骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70055 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70055, 'zhCN', '阿萨尔', '机动 圣骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70054 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70054, 'zhCN', '格雷森', '机动 圣骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70053 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70053, 'zhCN', '威廉', '机动 圣骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70052 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70052, 'zhCN', '溴盐', '机动 圣骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70051 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70051, 'zhCN', '山缪尔', '机动 圣骑士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70038 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70038, 'zhCN', '凯丽娅', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70037 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70037, 'zhCN', '卡茲', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70036 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70036, 'zhCN', '如娜', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70035 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70035, 'zhCN', '贝霍玛', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70034 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70034, 'zhCN', '阿霍南', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70033 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70033, 'zhCN', '柯蕊', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70032 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70032, 'zhCN', '均糖', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70031 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70031, 'zhCN', '达纳斯', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70030 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70030, 'zhCN', '伊莎', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70029 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70029, 'zhCN', '吴', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70028 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70028, 'zhCN', '毕尔邦', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70027 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70027, 'zhCN', '凯尔夫', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70026 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70026, 'zhCN', '巴尔图斯', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70025 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70025, 'zhCN', '安琪拉', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70024 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70024, 'zhCN', '克里斯', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70023 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70023, 'zhCN', '西尔丹爱尔', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70022 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70022, 'zhCN', '阿丽亚思塔', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70021 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70021, 'zhCN', '凯拉', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70020 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70020, 'zhCN', '爱丽西娅', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70019 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70019, 'zhCN', '泽尔马克', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70018 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70018, 'zhCN', '索热克', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70017 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70017, 'zhCN', '格雷兹', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70016 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70016, 'zhCN', '塔尔肖', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70015 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70015, 'zhCN', '方儿', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70014 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70014, 'zhCN', '克兰', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70013 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70013, 'zhCN', '哈鲁特', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70012 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70012, 'zhCN', '柯尔', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70011 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70011, 'zhCN', '萨克', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70010 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70010, 'zhCN', '托姆', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70009 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70009, 'zhCN', '奥斯汀', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70008 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70008, 'zhCN', '丹娜', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70007 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70007, 'zhCN', '凯尔斯特拉姆', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70006 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70006, 'zhCN', '格兰尼斯', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70005 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70005, 'zhCN', '马洛什', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70004 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70004, 'zhCN', '安德尔', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70003 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70003, 'zhCN', '丽娜', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70002 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70002, 'zhCN', '思兰', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70001 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70001, 'zhCN', '莱恩', '机动 战士', NULL);\n+DELETE FROM `creature_template_locale` WHERE `entry`=70000 AND `locale`='zhCN';\n+INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70000, 'zhCN', '拉格雷塔', '机动雇佣兵 首领', NULL);\ndiff --git a/sql/Bots/locales/zhCN/npc_text_locale.sql b/sql/Bots/locales/zhCN/npc_text_locale.sql\nnew file mode 100644\nindex 0000000000..f31b23a401\n--- /dev/null\n+++ b/sql/Bots/locales/zhCN/npc_text_locale.sql\n@@ -0,0 +1,410 @@\n+DELETE FROM `npc_text_locale` WHERE `Locale`='zhCN' AND `ID` BETWEEN '70000' AND '71000';\n+INSERT INTO `npc_text_locale` (`ID`, `Locale`, `Text0_0`, `Text0_1`, `Text1_0`, `Text1_1`, `Text2_0`, `Text2_1`, `Text3_0`, `Text3_1`, `Text4_0`, `Text4_1`, `Text5_0`, `Text5_1`, `Text6_0`, `Text6_1`, `Text7_0`, `Text7_1`)\n+VALUES\n+('70001','zhCN','我愿意为你奉献一切。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70002','zhCN','你需要什么吗？',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70003','zhCN','凡人,通常情况下,我会立刻杀了你这混蛋！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70004','zhCN','<你看着这个黑曜石毁灭者。它看起来有点与众不同,它并没有因为你的伤害而消失,在仔细检查过后,你注意到它的背部有一个小口。>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70005','zhCN','<毁灭者盯着你,发出低沉的咆哮。>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70006','zhCN','你惊讶吗,凡人？作为一名纳斯雷兹姆,我不得不寻求盟友,你看起来至少可以逗我开心。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70007','zhCN','现在怎么样了,凡人？',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70008','zhCN','你就不能让我一个人静一静吗？ <唉。。。>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70009','zhCN','现在如何？',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70101','zhCN','|cffff3300剑圣|r$b|cffdd6600-=致敬魔兽争霸III=-|r$B$B\\\\\\\"剑圣,以前是燃烧之刃家族的成员,现在是部落中的精锐战士\\\".$B$B主要属性:敏捷.$B$B疾风步.让剑圣隐形,并在一段时间内移动得更快.当剑圣攻击一个单位以打破隐身状态时,他将造成额外的伤害.$B$B镜像.制造剑圣幻象迷惑敌人,并驱散剑圣的所有魔法.$B$B爆击(被动).有15%的几率在他的攻击中造成致命的x2(x3,x4)倍的正常伤害.$B$B剑刃风暴. 给予魔法免疫并对周围所有敌人造成伤害.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70102','zhCN','|cff9900cc黑曜石毁灭者|r$b|cffdd6600-=致敬魔兽争霸III=-|r$B$B\\\\\\\"黑曜石毁灭者,对魔法有着无法满足的渴望\\\\\\\".$B$B高护甲,非常高的抵抗力,部分免疫魔法,随着时间的推移失去法力\\\\并且不受益于被动法力再生效果,板甲,双持魔杖,造成暗影法术伤害,没有物理攻击\\\\法术伤害加成:50%攻击力+200% 智力增加魔杖伤害.$B$B吞噬魔法.从敌人身上驱散最多2个魔法效果,从盟友身上驱散最多2个魔法效果和最多2个诅咒,并在20码范围内伤害召唤单位.每次驱散效果回复20%法力和5%生命,7秒冷却.$B$B暗影爆炸.强化攻击,增加飞溅伤害.$B$B吸取法力.从随机友方单位吸取所有法力(受施法者法力限制).$B$B补充法力.给周围15码范围内的团队和团队成员通电,使其法力值达到最大值的1%,影响最多10个目标,冷却3秒.$B$B再生光环.治疗周围15码范围内的团队和团队成员,使其生命值降低施法者法力上限的2%,最多影响10个目标,冷却3秒.$B$B暗影护甲(被动).恢复相当于所受伤害百分比的法力值.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70103','zhCN','|cff0000dd大魔导师|r$b|cffdd6600-=致敬魔兽争霸III=-|r$B$B\\\\\\\"大法师,无法用言语来形容的暴雪亲儿子\\\\\\\".$B$B法术伤害降低35%,部分免疫控制效果,布甲,造成火/冰法术伤害,无物理攻击,法术能量加成:100%智力.主要属性:智力.$B$B暴风雪!典型的暴风雪,只是稍微强大一点,6秒冷却.召唤水元素攻击大法师的敌人1分钟,冷却20秒.$B$B光辉光环.增加10%的法力上限,大大提高40码范围内己方和队友的法力回复.$B$B大规模传送.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70104','zhCN','|cff9900cc恐惧魔王|r$b|cffdd6600-=致敬魔兽争霸III=-|r$B$B\\\\\\\"恐惧魔王,拥有黑暗力量和精神控制力的强大恶魔\\\\\\\".$B$B高护甲,高抵抗,部分免疫控制效果,所受伤害加速法术能量,板甲,造成近战/暗影法术伤害,对瘫痪目标造成额外伤害,法术能量加成:200%力量.主要属性:力量.$B$B腐蚀虫群.派一大群蝙蝠与混乱魔法结合,对面前锥形范围的敌人造成伤害,无法暴击,冷却10秒.$B$B沉睡.使敌方目标睡眠60秒,并允许下次对该目标的物理攻击忽视护甲,造成的直接伤害将唤醒目标,冷却6秒.$B$B吸血鬼的光环.增加5%的物理暴击伤害,治疗40码范围内的团队和突袭成员受到近战物理攻击和腐肉群伤害的百分比(恐惧领主100%,其他人25%),没有威胁.$B$B召唤地狱恶魔.召唤一个来自天空的恶魔,恶魔对魔法有很强的抵抗力并且持续180秒,180秒的冷却时间.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70105','zhCN','|cff0000dd破法者|r$b|cffdd6600-=致敬魔兽争霸III=-|r$B$B\\\\\\\"破法者,一个被训练来破坏和扭曲魔法能量的精灵战士\\\\\\\".$B$B法术伤害减少75%,部分免疫控制效果,护甲降低-30%,板甲,近战/奥术伤害,法术能量加成:200%力量.主要属性:力量.$B$B魔法偷取.从敌人身上偷取一个有益的法术并施于附近的盟友,或者从盟友身上移除一个消极的法术并施于附近的敌人,影响魔法和诅咒效果,3秒冷却.$B$B能量窃取(被动).成功的近战攻击消耗目标的法力,相当于造成的伤害(由法术力增加),造成奥术伤害.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70106','zhCN','|cff9900cc黑暗游侠|r$b|cffdd6600-=致敬魔兽争霸III=-|r$B$B\\\\\\\"黑暗游侠,强行起死回生的奎尔萨拉斯的前游侠\\\\\\\".$B$B法术伤害减少35%,不死系,部分免疫控制效果,皮甲/布甲,造成物理/暗影法术伤害,不产生威胁,法术力量加成:50%智力.主要属性:敏捷.$B$B沉默.使一个敌人和最多4个附近目标沉默8秒,15秒冷却.$B$B黑箭.射出一支诅咒之箭,造成150%武器伤害和额外的暗影伤害.如果受影响的目标死于黑暗游侠的伤害,黑暗仆从将从尸体中产生(最多5个仆从,持续时间80秒,只对人形、野兽和龙类有效).如果目标生命低于20%,造成5倍伤害.$B$B吸取生命.每秒吸取一个敌人的生命值,持续5秒,治疗黑暗游侠消耗生命值的200%.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70107','zhCN','|cff9900cc死灵法师|r$b|cffdd6600-=魔兽争霸III / 暗黑破坏神II致敬=-|r$B$B受到的法术伤害减少20%,部分免疫控制效果,布甲,造成暗影法术伤害,没有物理攻击,法术强度加成: 智力的100%。主属性: 智力。$B$B复活死者: 从尸体上复活2个骷髅(最多6个骷髅,持续65秒,只对人型生物、野兽和龙类有效)。$B$B邪恶狂热: 增加目标的近战攻击速度75%,但持续消耗生命。持续45秒。不能取消。30级解锁。$B$B尸体爆炸。让尸体爆炸,对周围所有敌人造成相当于死亡单位最大生命值35%至75%的伤害(取决于死灵法师的等级)。这种伤害不产生威胁。40级解锁。$B$B残废: 减少目标的移动速度、近战攻击速度和总力量50%,持续60秒。50级解锁。$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70108','zhCN','|cff0000dd海巫|r$b|cffdd6600-=魔兽争霸III致敬=-|r$B$B\"海洋中的凶猛鳞皮居民,常与巨大风暴的到来联系在一起。\"$B$B受到的法术伤害减少30%,部分免疫控制效果,布甲,造成物理/冰霜法术/风暴法术伤害,攻击力加成: 敏捷x2,法术强度加成: 智力的200%。主属性: 智力。$B$B分叉闪电: 召唤一道闪电锥,伤害敌人。从2到所有目标(取决于海巫的等级),使它们昏迷2秒。这种伤害不产生威胁。$B$B冰霜箭。用冰霜法术为箭矢增加额外伤害,减慢目标的移动、攻击和施法速度30%至70%(取决于海巫的等级)。$B$B法力护盾: 创造一个护盾,使用海巫的法力吸收100%的(未减免的)进来伤害。效果范围从每10法力吸收1伤害到每1法力吸收10伤害(取决于海巫的等级)。$B$B龙卷风: 召唤一个猛烈的龙卷风,伤害并减慢附近敌方单位的速度,有时完全使它们失去行动能力。龙卷风在户外随时间增长,增加伤害和影响区域,但在室内缩小,迅速消散。60级解锁。$B$B娜迦(被动): 在水中游泳速度、伤害和躲避几率大幅提升。$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70109','zhCN','|cff9900cc地穴领主|r$b|cffdd6600-=魔兽争霸III致敬=-|r$B$B\"古老的庞然大物,曾是艾泽拉斯之王之一,现在是巫妖王麾下最强大的亡灵战士之一。\"$B$B高度护甲,增加的抗性,部分免疫控制效果,免疫基于毒素的效果,锁甲/板甲,造成近战/暗影法术伤害,法术强度加成: 力量的200%。主属性: 力量。$B$B穿刺。地穴领主用他巨大的爪子猛击地面,向前锥形射出尖刺,造成伤害并将敌方单位掀入空中,使他们晕眩。20级解锁。$B$B刺甲: 地穴领主的几丁质护甲增加伤害抗性,并将15%至50%的伤害反弹给近战攻击者。$B$B腐尸甲虫。地穴领主从敌人的新鲜尸体上产生一个腐尸甲虫来攻击他的敌人。甲虫是永久的,但不会恢复生命值,一次最多控制6个。更高等级允许地穴领主召唤更强大的甲虫。10级解锁。$B$B蝗虫群: 地穴领主释放一群20-40只(取决于地穴领主的等级)愤怒的蝗虫,啃咬并撕扯附近的敌方单位,减少他们的移动或攻击能力。当它们啃食敌人肉体时,它们将其转化为一种物质,当它们返回时恢复地穴领主的生命值。40级解锁。$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70201','zhCN','并不总是有人愿意为钱去卖命！',NULL,'我们的服务遍布艾泽拉斯的每个角落！',NULL,'很高兴为您服务,我这里有最能打的家伙！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70202','zhCN','雇佣兵向来十分抢手；以下是现在你能雇佣的人: ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70203','zhCN','雇佣兵向来十分抢手；以下是现在你能雇佣的人: ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70204','zhCN','看来现在没有空闲的雇佣兵,你过些时候再来看看吧。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70300','zhCN','去死！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70301','zhCN','正在复活你！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70302','zhCN','正在复活 ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70303','zhCN','你的机器人',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70304','zhCN','的机器人',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70305','zhCN','我现在还不能制造魔法水',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70306','zhCN','我现在还不能制造魔法食物',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70307','zhCN','我还不能那样做',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70308','zhCN','给你...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70309','zhCN','已禁用',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70310','zhCN','还没有准备好',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70311','zhCN','无效的物品类型',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70312','zhCN','失败',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70313','zhCN','完成',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70314','zhCN','我没有变形',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70315','zhCN','我没有治疗石',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70316','zhCN','我还不能制造治疗石',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70317','zhCN','搞什么鬼,我没有锁可开！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70318','zhCN','我的技能等级还不够高',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70319','zhCN','正在将我的天赋切换为',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70320','zhCN','武器',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70321','zhCN','狂怒',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70322','zhCN','防护',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70323','zhCN','惩戒',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70324','zhCN','野兽控制',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70325','zhCN','射击',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70326','zhCN','生存',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70327','zhCN','刺杀',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70328','zhCN','战斗',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70329','zhCN','敏锐',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70330','zhCN','戒律',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70331','zhCN','神圣',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70332','zhCN','暗影',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70333','zhCN','鲜血',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70334','zhCN','冰霜',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70335','zhCN','邪恶',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70336','zhCN','元素',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70337','zhCN','增强',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70338','zhCN','恢复',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70339','zhCN','奥术',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70340','zhCN','火焰',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70341','zhCN','痛苦',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70342','zhCN','恶魔学识',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70343','zhCN','毁灭',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70344','zhCN','平衡',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70345','zhCN','野性战斗',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70346','zhCN','未知',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70347','zhCN','滚开！ 懦夫。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70348','zhCN',' 不方便。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70349','zhCN','我不会把我宝贵的时间浪费在这些琐事上！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70350','zhCN','NIY',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70351','zhCN','NIY',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70352','zhCN','NIY',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70353','zhCN','我准备好了',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70354','zhCN','走开！我已经有雇主了！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70355','zhCN','未知',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70356','zhCN','在你身上！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70357','zhCN','在我身上！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70358','zhCN',' 对 ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70359','zhCN',' 已使用！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70360','zhCN','坦克机器人',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70361','zhCN','职业',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70362','zhCN','玩家',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70363','zhCN','雇主',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70364','zhCN','无',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70365','zhCN','级别',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70366','zhCN','天赋',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70367','zhCN','被动',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70368','zhCN','隐藏',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70369','zhCN','已知',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70370','zhCN','能力',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70371','zhCN','力量',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70372','zhCN','敏捷',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70373','zhCN','耐力',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70374','zhCN','智力',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70375','zhCN','精神',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70376','zhCN','未知属性',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70377','zhCN','共',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70378','zhCN','近战攻击强度',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70379','zhCN','远程攻击强度',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70380','zhCN','护甲',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70381','zhCN','暴击',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70382','zhCN','防御',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70383','zhCN','未命中',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70384','zhCN','躲闪',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70385','zhCN','招架',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70386','zhCN','格挡',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70387','zhCN','盾牌格挡值',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70388','zhCN','近战防御',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70389','zhCN','法术防御',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70390','zhCN','主手攻击伤害范围',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70391','zhCN','主手攻击伤害加成',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70392','zhCN','主手攻击速度',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70393','zhCN','副手攻击伤害范围',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70394','zhCN','副手攻击伤害加成',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70395','zhCN','副手攻击速度',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70396','zhCN','远程攻击伤害范围',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70397','zhCN','远程攻击伤害加成',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70398','zhCN','远程攻击速度',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70399','zhCN','最小',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70400','zhCN','最大',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70401','zhCN','输出',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70402','zhCN','基础生命值',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70403','zhCN','最大生命值',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70404','zhCN','基础法力值',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70405','zhCN','最大法力值',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70406','zhCN','当前法力值',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70407','zhCN','法术强度',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70408','zhCN','每5秒恢复生命',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70409','zhCN','非施法状态: 每5秒回复法力值',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70410','zhCN','施法状态: 每5秒回复法力值',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70411','zhCN','急速',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70412','zhCN','命中',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70413','zhCN','专精',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70414','zhCN','物理 护甲穿透',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70415','zhCN','法术 护甲穿透',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70416','zhCN','%',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70417','zhCN','神圣',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70418','zhCN','火焰',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70419','zhCN','自然',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70420','zhCN','冰霜',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70421','zhCN','暗影',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70422','zhCN','奥术',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70423','zhCN','抗性',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70424','zhCN','指令状态',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70425','zhCN','跟随',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70426','zhCN','攻击',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70427','zhCN','停留',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70428','zhCN','重置',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70429','zhCN','完全停止',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70430','zhCN','跟随距离',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70431','zhCN','天赋',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70432','zhCN','机器人主职务',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70433','zhCN','机器人材料采集',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70434','zhCN','PvP 杀敌',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70435','zhCN','玩家',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70436','zhCN','已死亡 ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70437','zhCN',' 次',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70438','zhCN','%s (机器人)渐渐冷静了下来。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70439','zhCN','<Debug调试>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70440','zhCN','你真的想冒险引起',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70441','zhCN','对你的注意？',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70442','zhCN','<请投币>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70443','zhCN','你想吸引',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70444','zhCN','<试着发出邀请...>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70445','zhCN','你想雇佣',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70446','zhCN','<雇佣机器人>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70447','zhCN','机器人 装备 管理...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70448','zhCN','机器人 职责 管理...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70449','zhCN','机器人 队形 管理...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70450','zhCN','机器人 技能 管理...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70451','zhCN','机器人 天赋 管理...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70452','zhCN','使用消耗品、合剂等...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70453','zhCN','<创建队伍>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70454','zhCN','<创建队伍(所有机器人)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70455','zhCN','<加入队伍>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70456','zhCN','<将所有机器人加入队伍>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70457','zhCN','<移出队伍>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70458','zhCN','跟着我！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70459','zhCN','原地守候！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70460','zhCN','停下来,什么也别做！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70461','zhCN','给我一些食物',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70462','zhCN','给我一些水',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70463','zhCN','召唤一个魔法餐桌！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70464','zhCN','帮我开个锁',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70465','zhCN','给我一颗治疗石',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70466','zhCN','召唤一个灵魂之井！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70467','zhCN','给你的武器重新上毒...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70468','zhCN','<选择毒药 (主手武器)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70469','zhCN','<选择毒药 (副手武器)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70470','zhCN','元素武器附魔...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70471','zhCN','<选择附魔 (主手武器)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70472','zhCN','<选择附魔 (副手武器)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70473','zhCN','取消你的变形形态',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70474','zhCN','<选择宠物类型>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70475','zhCN','你被解雇了！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70476','zhCN','你确定要解雇',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70477','zhCN','你可别后悔...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70478','zhCN','该死的,振作起来！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70479','zhCN','<职业介绍>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70480','zhCN','没事了',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70481','zhCN','距离',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70482','zhCN','返回',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70483','zhCN','<自动>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70484','zhCN','<解散宠物>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70485','zhCN','召唤随机宠物 (狡诈型)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70486','zhCN','召唤随机宠物 (残暴型)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70487','zhCN','召唤随机宠物 (坚韧型)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70488','zhCN','让我看看你的装备',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70489','zhCN','自动筛选可用装备...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70490','zhCN','主手武器...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70491','zhCN','副手武器...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70492','zhCN','远程武器...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70493','zhCN','圣物...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70494','zhCN','头部...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70495','zhCN','肩部...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70496','zhCN','胸部...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70497','zhCN','腰带...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70498','zhCN','腿部...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70499','zhCN','脚...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70500','zhCN','手腕...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70501','zhCN','手...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70502','zhCN','披风...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70503','zhCN','衬衣...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70504','zhCN','戒指1...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70505','zhCN','戒指2...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70506','zhCN','饰品1...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70507','zhCN','饰品2...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70508','zhCN','颈部...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70509','zhCN','卸下全部装备(退回到背包)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70510','zhCN','刷新机器人外观',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70511','zhCN','只有外观,无实际效果',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70512','zhCN','已装备',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70513','zhCN','没有可供选择的装备',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70514','zhCN','使用你的旧装备',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70515','zhCN','卸下这件装备',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70516','zhCN','额...我没有适合你的装备了...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70517','zhCN','收集材料',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70518','zhCN','技能状态...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70519','zhCN','管理可用技能...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70520','zhCN','使用 ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70521','zhCN','刷新',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70522','zhCN','伤害类技能...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70523','zhCN','控制类技能...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70524','zhCN','治疗类技能...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70525','zhCN','其他技能...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70526','zhCN',' 发出了一阵摩擦声,并开始跟随着 ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70527','zhCN','在他的雇主把他解雇之前, %s不能加入你的队伍。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70528','zhCN','在你到达60级以前, %s不会加入你们',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70529','zhCN','在你到达55级以前, %s不会加入你们',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70530','zhCN','在你到达40级以前, %s不会加入你们',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70531','zhCN','在你到达20级以前, %s不会加入你们',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70532','zhCN','你最多只能招募%u个机器人！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70533','zhCN','你没有足够的现金',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70534','zhCN','你最多只能招募%u位%u。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70535','zhCN','无法退还装备 %u (%s)! 无法解雇机器人！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70536','zhCN','当前设定',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70537','zhCN','攻击距离',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70538','zhCN','最小远程攻击距离...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70539','zhCN','最大远程攻击距离...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70540','zhCN','设定攻击距离',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70541','zhCN','移除增益魔法...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70542','zhCN','修正属性...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70543','zhCN','因为某些原因,无法卸下 %s 这件装备将发到你的邮箱。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70544','zhCN','坦克',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70545','zhCN','远程',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70546','zhCN','采矿',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70547','zhCN','草药',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70548','zhCN','剥皮',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70549','zhCN','工程学',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70550','zhCN','由于长时间未上线,已自动解除雇佣状态。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70551','zhCN','机器人系统已被禁用,请联系管理员。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70552','zhCN','%s 不能假如你的队伍,已经有雇主了: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70553','zhCN','%s 正在传送中,不能加入你的队伍',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70554','zhCN','守护',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70555','zhCN','灵猴',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70556','zhCN','雄鹰守护',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70557','zhCN','猎豹守护',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70558','zhCN','蝰蛇守护',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70559','zhCN','野兽守护',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70560','zhCN','豹群守护',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70561','zhCN','野性守护',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70562','zhCN','龙鹰守护',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70563','zhCN','无守护',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70564','zhCN','光环',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70565','zhCN','虔诚',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70566','zhCN','专注',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70567','zhCN','火焰抗性',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70568','zhCN','冰霜抗性',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70569','zhCN','暗影抗性',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70570','zhCN','惩戒',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70571','zhCN','十字军',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70572','zhCN','无光环',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70573','zhCN','减速药膏',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70574','zhCN','速效药膏',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70575','zhCN','致命药膏',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70576','zhCN','致伤药膏',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70577','zhCN','麻痹药膏',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70578','zhCN','麻醉药膏',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70579','zhCN','无',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70580','zhCN','火舌武器',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70581','zhCN','冰封武器',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70582','zhCN','风怒武器',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70583','zhCN','大地生命武器',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70584','zhCN','我需要你的服务。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70585','zhCN','你不能再雇佣更多的机器人了。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70586','zhCN','你希望雇佣',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70587','zhCN','现在正在忙着,请稍后再试。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70588','zhCN','很高兴和你进行交易。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70589','zhCN','战士',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70590','zhCN','圣骑士',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70591','zhCN','法师',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70592','zhCN','牧师',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70593','zhCN','术士',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70594','zhCN','德鲁伊',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70595','zhCN','死亡骑士',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70596','zhCN','盗贼',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70597','zhCN','萨满',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70598','zhCN','猎人',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70599','zhCN','剑圣',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70600','zhCN','黑曜石毁灭者',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70601','zhCN','大法师',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70602','zhCN','恐惧魔王',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70603','zhCN','破法者',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70604','zhCN','黑暗游侠',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70605','zhCN','战士',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70606','zhCN','圣骑士',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70607','zhCN','法师',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70608','zhCN','牧师',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70609','zhCN','术士',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70610','zhCN','德鲁伊',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70611','zhCN','死亡骑士',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70612','zhCN','盗贼',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70613','zhCN','萨满',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70614','zhCN','猎人',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70615','zhCN','剑圣',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70616','zhCN','黑曜石毁灭者',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70617','zhCN','大法师',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70618','zhCN','恐惧魔王',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70619','zhCN','破法者',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70620','zhCN','黑暗游侠',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70621','zhCN','男',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70622','zhCN','女',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70623','zhCN','人类',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70624','zhCN','兽人',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70625','zhCN','矮人',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70626','zhCN','暗夜精灵',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70627','zhCN','亡灵',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70628','zhCN','牛头人',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70629','zhCN','侏儒',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70630','zhCN','地精',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70631','zhCN','血精灵',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70632','zhCN','德莱尼',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70633','zhCN','未知',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70634','zhCN','自动拾取',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70635','zhCN','|cff9d9d9d灰色|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70636','zhCN','|cffffffff白色|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70637','zhCN','|cff1eff00绿色|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70638','zhCN','|cff0070dd蓝色|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70639','zhCN','|cffa335ee紫色|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70640','zhCN','|cffff8000橙色|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70641','zhCN','参与行为',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70642','zhCN','|延迟攻击时间|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70643','zhCN','|延迟治疗时间|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70644','zhCN','|秒|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70645','zhCN','|副坦克|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70646','zhCN','|亡灵法师们|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70647','zhCN','|亡灵法师|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70648','zhCN','|攻击方向|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70649','zhCN','|正常|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70650','zhCN','|避免正面AOE|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70651','zhCN','|NIY|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70652','zhCN','|你确定这会奏效吗？最好是世界上最好的水....|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70653','zhCN','|看来你真的需要喝点淡水。|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70654','zhCN','|海女巫们|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70655','zhCN','|海女巫|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70656','zhCN','|每点伤害的法力|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70657','zhCN','|每点魔法的伤害|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70658','zhCN','幻化...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70659','zhCN','禁用战斗定位',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70660','zhCN','优先目标',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70661','zhCN','机器人装备银行...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70662','zhCN','存款项目...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70663','zhCN','撤回物品...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70664','zhCN','银行是空的',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70665','zhCN','前一页',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70666','zhCN','下一页',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70667','zhCN','你真的想花这么多钱让地穴领主再次动起来吗？',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70668','zhCN','我很怀疑你现在的状态,但我愿意带领你并帮助你恢复力量。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70669','zhCN','地穴领主们|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70670','zhCN','|地穴领主|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70671','zhCN','反射',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70672','zhCN','蝗虫',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70673','zhCN','治疗目标生命阈值',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70674','zhCN','我需要传送门',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70675','zhCN','暴风城',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70676','zhCN','铁炉堡',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70677','zhCN','达纳苏斯',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70678','zhCN','埃索达',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70679','zhCN','奥格瑞玛',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70680','zhCN','幽暗城',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70681','zhCN','雷霆崖',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70682','zhCN','银月城',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70683','zhCN','沙塔斯城',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70684','zhCN','达拉然',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);\n\\ No newline at end of file\ndiff --git a/sql/Bots/locales/zhTW/npc_text_locale.sql b/sql/Bots/locales/zhTW/npc_text_locale.sql\nnew file mode 100644\nindex 0000000000..755337d834\n--- /dev/null\n+++ b/sql/Bots/locales/zhTW/npc_text_locale.sql\n@@ -0,0 +1,410 @@\n+DELETE FROM `npc_text_locale` WHERE `Locale`='zhTW' AND `ID` BETWEEN '70000' AND '71000';\n+INSERT INTO `npc_text_locale` (`ID`, `Locale`, `Text0_0`, `Text0_1`, `Text1_0`, `Text1_1`, `Text2_0`, `Text2_1`, `Text3_0`, `Text3_1`, `Text4_0`, `Text4_1`, `Text5_0`, `Text5_1`, `Text6_0`, `Text6_1`, `Text7_0`, `Text7_1`)\n+VALUES\n+('70001','zhTW','我願意為你奉獻一切。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70002','zhTW','你需要什麼嗎？',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70003','zhTW','凡人，通常情況下，我會立刻殺了你這混蛋！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70004','zhTW','<你看著這個黑曜石毀滅者。它看起來有點與眾不同，它並沒有因為你的傷害而消失，在仔細檢查過後，你注意到它的背部有一個小口。>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70005','zhTW','<毀滅者盯著你，發出低沉的咆哮。>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70006','zhTW','你驚訝嗎，凡人？作為一名納斯雷茲姆，我不得不尋求盟友，你看起來至少可以逗我開心。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70007','zhTW','現在怎麼樣了，凡人？',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70008','zhTW','你就不能讓我一個人靜一靜嗎？ <唉...>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70009','zhTW','現在如何？',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70101','zhTW','|cffff3300劍聖|r$b|cffdd6600-=致敬魔獸爭霸III=-|r$B$B\\\\\\\"劍聖,以前是燃燒之刃家族的成員,現在是部落中的精銳戰士\\\".$B$B主要屬性:敏捷.$B$B疾風步.讓劍聖隱形,並在一段時間內移動得更快.當劍聖攻擊一個單位以打破隱身狀態時,他將造成額外的傷害.$B$B鏡像.製造劍聖幻象迷惑敵人,並驅散劍聖的所有魔法.$B$B爆擊(被動).有15%的機率在他的攻擊中造成致命的x2(x3,x4)倍的正常傷害.$B$B劍刃風暴. 給予魔法免疫並對周圍所有敵人造成傷害.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70102','zhTW','|cff9900cc黑曜石毀滅者|r$b|cffdd6600-=致敬魔獸爭霸III=-|r$B$B\\\\\\\"黑曜石毀滅者,對魔法有著無法滿足的渴望\\\\\\\".$B$B高護甲,非常高的抵抗力,部分免疫魔法,隨著時間的推移失去法力\\\\並且不受益於被動法力再生效果,鎧甲,雙持魔杖,造成暗影法術傷害,沒有物理攻擊\\\\法術傷害加成:50%攻擊力+200% 智力增加魔杖傷害.$B$B吞噬魔法.從敵人身上驅散最多2個魔法效果,從盟友身上驅散最多2個魔法效果和最多2個詛咒,並在20碼範圍內傷害召喚單位.每次驅散效果回復20%法力和5%生命,7秒冷卻.$B$B暗影爆炸.強化攻擊,增加飛濺傷害.$B$B吸取法力.從隨機友方單位吸取所有法力(受施法者法力限制).$B$B補充法力.給周圍15碼範圍內的團隊和團隊成員通電,使其法力值達到最大值的1%,影響最多10個目標,冷卻3秒.$B$B再生光環.治療周圍15碼範圍內的團隊和團隊成員,使其生命值降低施法者法力上限的2%,最多影響10個目標,冷卻3秒.$B$B暗影護甲(被動).恢復相當於所受傷害百分比的法力值.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70103','zhTW','|cff0000dd大魔導師|r$b|cffdd6600-=致敬魔獸爭霸III=-|r$B$B\\\\\\\"大法師,無法用言語來形容的暴雪親兒子\\\\\\\".$B$B法術傷害降低35%,部分免疫控制效果,布甲,造成火/冰法術傷害,無物理攻擊,法術能量加成:100%智力.主要屬性:智力.$B$B暴風雪！典型的暴風雪,只是稍微強大一點,6秒冷卻.召喚水元素攻擊大法師的敵人1分鐘,冷卻20秒.$B$B光輝光環.增加10%的法力上限,大大提高40碼範圍內己方和隊友的法力回復.$B$B大規模傳送.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70104','zhTW','|cff9900cc恐懼魔王|r$b|cffdd6600-=致敬魔獸爭霸III=-|r$B$B\\\\\\\"恐懼魔王,擁有黑暗力量和精神控制力的強大惡魔\\\\\\\".$B$B高護甲,高抵抗,部分免疫控制效果,所受傷害加速法術能量,鎧甲,造成近戰/暗影法術傷害,對癱瘓目標造成額外傷害,法術能量加成:200%力量.主要屬性:力量.$B$B腐蝕蟲群.派一大群蝙蝠與混亂魔法結合,對面前錐形範圍的敵人造成傷害,無法暴擊,冷卻10秒.$B$B沉睡.使敵方目標睡眠60秒,並允許下次對該目標的物理攻擊忽視護甲,造成的直接傷害將喚醒目標,冷卻6秒.$B$B吸血鬼的光環.增加5%的物理暴擊傷害,治療40碼範圍內的團隊和突襲成員受到近戰物理攻擊和腐肉群傷害的百分比(驚懼領主100%,其他人25%),沒有威脅.$B$B召喚地獄惡魔.召喚一個來自天空的惡魔,惡魔對魔法有很強的抵抗力並且持續180秒,180秒的冷卻時間.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70105','zhTW','|cff0000dd破法者|r$b|cffdd6600-=致敬魔獸爭霸III=-|r$B$B\\\\\\\"破法者,一個被訓練來破壞和扭曲魔法能量的精靈戰士\\\\\\\".$B$B法術傷害減少75%,部分免疫控制效果,護甲降低-30%,鎧甲,近戰/秘法傷害,法術能量加成:200%力量.主要屬性:力量.$B$B魔法偷取.從敵人身上偷取一個有益的法術並施於附近的盟友,或者從盟友身上移除一個消極的法術並施於附近的敵人,影響魔法和詛咒效果,3秒冷卻.$B$B能量竊取(被動).成功的近戰攻擊消耗目標的法力,相當於造成的傷害(由法術力增加),造成秘法傷害.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70106','zhTW','|cff9900cc黑暗遊俠|r$b|cffdd6600-=致敬魔獸爭霸III=-|r$B$B\\\\\\\"黑暗遊俠,強行起死回生的奎爾薩拉斯的前遊俠\\\\\\\".$B$B法術傷害減少35%,不死系,部分免疫控制效果,皮甲/布甲,造成物理/暗影法術傷害,不產生威脅,法術力量加成:50%智力.主要屬性:敏捷.$B$B沉默.使一個敵人和最多4個附近目標沉默8秒,15秒冷卻.$B$B黑箭.射出一支詛咒之箭,造成150%武器傷害和額外的暗影傷害.如果受影響的目標死於黑暗遊俠的傷害,黑暗僕從將從屍體中產生(最多5個僕從,持續時間80秒,只對人形、野獸和龍類有效).如果目標生命低於20%,造成5倍傷害.$B$B吸取生命.每秒吸取一個敵人的生命值,持續5秒,治療黑暗遊俠消耗生命值的200%.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70107','zhTW','|cff9900cc死靈法師|r$b|cffdd6600-=魔獸爭霸III / 暗黑破壞神II致敬=-|r$B$B受到的法術傷害減少20%,部分免疫控制效果,布甲,造成暗影法術傷害,沒有物理攻擊,法術強度加成: 智力的100%。主屬性: 智力。$B$B復活死者: 從屍體上復活2個骷髏(最多6個骷髏,持續65秒,只對人型生物、野獸和龍類有效)。$B$B邪惡狂熱: 增加目標的近戰攻擊速度75%,但持續消耗生命。持續45秒。不能取消。30級解鎖。$B$B屍體爆炸。讓屍體爆炸,對周圍所有敵人造成相當於死亡單位最大生命值35%至75%的傷害(取決於死靈法師的等級)。這種傷害不產生威脅。40級解鎖。$B$B殘廢: 減少目標的移動速度、近戰攻擊速度和總力量50%,持續60秒。50級解鎖。$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70108','zhTW','|cff0000dd海巫|r$b|cffdd6600-=魔獸爭霸III致敬=-|r$B$B\"海洋中的凶猛鱗皮居民,常與巨大風暴的到來聯繫在一起。\"$B$B受到的法術傷害減少30%,部分免疫控制效果,布甲,造成物理/冰霜法術/風暴法術傷害,攻擊力加成: 敏捷x2,法術強度加成: 智力的200%。主屬性: 智力。$B$B分叉閃電: 召喚一道閃電錐,傷害敵人。從2到所有目標(取決於海巫的等級),使它們昏迷2秒。這種傷害不產生威脅。$B$B冰霜箭。用冰霜法術為箭矢增加額外傷害,減慢目標的移動、攻擊和施法速度30%至70%(取決於海巫的等級)。$B$B法力護盾: 創造一個護盾,使用海巫的法力吸收100%的(未減免的)進來傷害。效果範圍從每10法力吸收1傷害到每1法力吸收10傷害(取決於海巫的等級)。$B$B龍捲風: 召喚一個猛烈的龍捲風,傷害並減慢附近敵方單位的速度,有時完全使它們失去行動能力。龍捲風在戶外隨時間增長,增加傷害和影響區域,但在室內縮小,迅速消散。60級解鎖。$B$B娜迦(被動): 在水中游泳速度、傷害和躲避機率大幅提升。$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70109','zhTW','|cff9900cc地穴領主|r$b|cffdd6600-=魔獸爭霸III致敬=-|r$B$B\"古老的龐然大物,曾是艾澤拉斯之王之一,現在是巫妖王麾下最強大的亡靈戰士之一。\"$B$B高度護甲,增加的抗性,部分免疫控制效果,免疫基於毒素的效果,鎖甲/板甲,造成近戰/暗影法術傷害,法術強度加成: 力量的200%。主屬性: 力量。$B$B穿刺。地穴領主用他巨大的爪子猛擊地面,向前錐形射出尖刺,造成傷害並將敵方單位掀入空中,使他們暈眩。20級解鎖。$B$B刺甲: 地穴領主的幾丁質護甲增加傷害抗性,並將15%至50%的傷害反彈給近戰攻擊者。$B$B腐屍甲蟲。地穴領主從敵人的新鮮屍體上產生一個腐屍甲蟲來攻擊他的敵人。甲蟲是永久的,但不會恢復生命值,一次最多控制6個。更高等級允許地穴領主召喚更強大的甲蟲。10級解鎖。$B$B蝗蟲群: 地穴領主釋放一群20-40隻(取決於地穴領主的等級)憤怒的蝗蟲,啃咬並撕扯附近的敵方單位,減少他們的移動或攻擊能力。當它們啃食敵人肉體時,它們將其轉化為一種物質,當它們返回時恢復地穴領主的生命值。40級解鎖。$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70201','zhTW','並不總是有人願意為錢去賣命！',NULL,'我們的服務遍布艾澤拉斯的每個角落！',NULL,'很高興為您服務，我這里有最能打的傢伙！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70202','zhTW','雇傭兵向來十分搶手；以下是現在你能雇傭的人：',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70203','zhTW','雇傭兵向來十分搶手；以下是現在你能雇傭的人：',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70204','zhTW','看來現在沒有空閒的雇傭兵，你過些時候再來看看吧。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70300','zhTW','去死！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70301','zhTW','正在復活你！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70302','zhTW','正在復活 ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70303','zhTW','你的機器人',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70304','zhTW','的機器人',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70305','zhTW','我現在還不能製造魔法水',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70306','zhTW','我現在還不能製造魔法食物',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70307','zhTW','我還不能那樣做',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70308','zhTW','給你...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70309','zhTW','已禁用',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70310','zhTW','還沒有準備好',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70311','zhTW','無效的物品類型',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70312','zhTW','失敗',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70313','zhTW','完成',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70314','zhTW','我沒有變形',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70315','zhTW','我沒有治療石',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70316','zhTW','我還不能製造治療石',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70317','zhTW','搞什麼鬼，我沒有鎖可開！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70318','zhTW','我的技能等級還不夠高',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70319','zhTW','正在將我的天賦切換為',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70320','zhTW','武器',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70321','zhTW','狂怒',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70322','zhTW','防護',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70323','zhTW','懲戒',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70324','zhTW','野獸控制',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70325','zhTW','射擊',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70326','zhTW','生存',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70327','zhTW','刺殺',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70328','zhTW','戰鬥',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70329','zhTW','敏銳',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70330','zhTW','戒律',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70331','zhTW','神聖',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70332','zhTW','暗影',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70333','zhTW','鮮血',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70334','zhTW','冰霜',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70335','zhTW','邪惡',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70336','zhTW','元素',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70337','zhTW','增強',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70338','zhTW','恢復',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70339','zhTW','秘法',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70340','zhTW','火焰',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70341','zhTW','痛苦',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70342','zhTW','惡魔學識',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70343','zhTW','毀滅',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70344','zhTW','平衡',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70345','zhTW','野性戰鬥',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70346','zhTW','未知',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70347','zhTW','滾開！ 懦夫。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70348','zhTW',' 不方便。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70349','zhTW','我不會把我寶貴的時間浪費在這些瑣事上！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70350','zhTW','NIY',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70351','zhTW','NIY',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70352','zhTW','NIY',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70353','zhTW','我準備好了',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70354','zhTW','走開！我已經有雇主了！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70355','zhTW','未知',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70356','zhTW','在你身上！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70357','zhTW','在我身上！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70358','zhTW',' 對 ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70359','zhTW',' 已使用！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70360','zhTW','坦克機器人',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70361','zhTW','職業',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70362','zhTW','玩家',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70363','zhTW','雇主',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70364','zhTW','無',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70365','zhTW','級別',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70366','zhTW','天賦',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70367','zhTW','被動',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70368','zhTW','隱藏',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70369','zhTW','已知',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70370','zhTW','能力',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70371','zhTW','力量',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70372','zhTW','敏捷',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70373','zhTW','耐力',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70374','zhTW','智力',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70375','zhTW','精神',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70376','zhTW','未知屬性',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70377','zhTW','共',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70378','zhTW','近戰攻擊強度',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70379','zhTW','遠程攻擊強度',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70380','zhTW','護甲',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70381','zhTW','暴擊',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70382','zhTW','防禦',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70383','zhTW','未命中',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70384','zhTW','躲閃',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70385','zhTW','招架',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70386','zhTW','格擋',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70387','zhTW','盾牌格擋值',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70388','zhTW','近戰防禦',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70389','zhTW','法術防禦',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70390','zhTW','主手攻擊傷害範圍',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70391','zhTW','主手攻擊傷害加成',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70392','zhTW','主手攻擊速度',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70393','zhTW','副手攻擊傷害範圍',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70394','zhTW','副手攻擊傷害加成',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70395','zhTW','副手攻擊速度',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70396','zhTW','遠程攻擊傷害範圍',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70397','zhTW','遠程攻擊傷害加成',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70398','zhTW','遠程攻擊速度',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70399','zhTW','最小',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70400','zhTW','最大',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70401','zhTW','輸出',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70402','zhTW','基礎生命值',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70403','zhTW','最大生命值',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70404','zhTW','基礎法力值',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70405','zhTW','最大法力值',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70406','zhTW','當前法力值',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70407','zhTW','法術強度',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70408','zhTW','每5秒恢復生命',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70409','zhTW','非施法狀態：每5秒回復法力值',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70410','zhTW','施法狀態：每5秒回復法力值',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70411','zhTW','急速',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70412','zhTW','命中',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70413','zhTW','專精',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70414','zhTW','物理 護甲穿透',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70415','zhTW','法術 護甲穿透',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70416','zhTW','%',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70417','zhTW','神聖',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70418','zhTW','火焰',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70419','zhTW','自然',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70420','zhTW','冰霜',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70421','zhTW','暗影',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70422','zhTW','秘法',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70423','zhTW','抗性',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70424','zhTW','指令狀態',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70425','zhTW','跟隨',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70426','zhTW','攻擊',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70427','zhTW','停留',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70428','zhTW','重置',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70429','zhTW','完全停止',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70430','zhTW','跟隨距離',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70431','zhTW','天賦',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70432','zhTW','機器人主職務',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70433','zhTW','機器人材料採集',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70434','zhTW','PvP 殺敵',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70435','zhTW','玩家',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70436','zhTW','已死亡 ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70437','zhTW',' 次',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70438','zhTW','%s （機器人）漸漸冷靜了下來。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70439','zhTW','<Debug調試>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70440','zhTW','你真的想冒險引起',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70441','zhTW','對你的注意？',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70442','zhTW','<請投幣>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70443','zhTW','你想吸引',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70444','zhTW','<試著發出邀請...>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70445','zhTW','你想雇傭',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70446','zhTW','<雇傭機器人>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70447','zhTW','機器人 裝備 管理...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70448','zhTW','機器人 職責 管理...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70449','zhTW','機器人 隊形 管理...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70450','zhTW','機器人 技能 管理...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70451','zhTW','機器人 天賦 管理...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70452','zhTW','使用消耗品、合劑等...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70453','zhTW','<創建隊伍>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70454','zhTW','<創建隊伍（所有機器人）>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70455','zhTW','<加入隊伍>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70456','zhTW','<將所有機器人加入隊伍>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70457','zhTW','<移出隊伍>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70458','zhTW','跟著我！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70459','zhTW','原地守候！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70460','zhTW','停下來，什麼也別做！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70461','zhTW','給我一些食物',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70462','zhTW','給我一些水',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70463','zhTW','召喚一個魔法餐桌！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70464','zhTW','幫我開個鎖',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70465','zhTW','給我一顆治療石',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70466','zhTW','召喚一個靈魂之井！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70467','zhTW','給你的武器重新上毒...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70468','zhTW','<選擇毒藥 （主手武器）>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70469','zhTW','<選擇毒藥 （副手武器）>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70470','zhTW','元素武器附魔...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70471','zhTW','<選擇附魔 （主手武器）>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70472','zhTW','<選擇附魔 （副手武器）>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70473','zhTW','取消你的變形形態',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70474','zhTW','<選擇寵物類型>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70475','zhTW','你被解雇了！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70476','zhTW','你確定要解雇',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70477','zhTW','你可別後悔...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70478','zhTW','該死的，振作起來！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70479','zhTW','<職業介紹>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70480','zhTW','沒事了',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70481','zhTW','距離',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70482','zhTW','返回',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70483','zhTW','<自動>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70484','zhTW','<解散寵物>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70485','zhTW','召喚隨機寵物 (狡詐型)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70486','zhTW','召喚隨機寵物 (殘暴型)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70487','zhTW','召喚隨機寵物 (堅韌型)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70488','zhTW','讓我看看你的裝備',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70489','zhTW','自動篩選可用裝備...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70490','zhTW','主手武器...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70491','zhTW','副手武器...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70492','zhTW','遠程武器...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70493','zhTW','聖物...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70494','zhTW','頭部...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70495','zhTW','肩部...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70496','zhTW','胸部...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70497','zhTW','腰帶...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70498','zhTW','腿部...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70499','zhTW','腳...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70500','zhTW','手腕...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70501','zhTW','手...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70502','zhTW','披風...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70503','zhTW','襯衣...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70504','zhTW','戒指1...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70505','zhTW','戒指2...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70506','zhTW','飾品1...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70507','zhTW','飾品2...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70508','zhTW','頸部...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70509','zhTW','卸下全部裝備（退回到背包）',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70510','zhTW','刷新機器人外觀',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70511','zhTW','只有外觀，無實際效果',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70512','zhTW','已裝備',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70513','zhTW','沒有可供選擇的裝備',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70514','zhTW','使用你的舊裝備',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70515','zhTW','卸下這件裝備',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70516','zhTW','額...我沒有適合你的裝備了...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70517','zhTW','收集材料',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70518','zhTW','技能狀態...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70519','zhTW','管理可用技能...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70520','zhTW','使用 ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70521','zhTW','刷新',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70522','zhTW','傷害類技能...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70523','zhTW','控制類技能...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70524','zhTW','治療類技能...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70525','zhTW','其他技能...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70526','zhTW',' 發出了一陣摩擦聲，並開始跟隨著 ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70527','zhTW','在他的雇主把他解雇之前， %s不能加入你的隊伍。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70528','zhTW','在你到達60級以前， %s不會加入你們',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70529','zhTW','在你到達55級以前， %s不會加入你們',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70530','zhTW','在你到達40級以前， %s不會加入你們',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70531','zhTW','在你到達20級以前， %s不會加入你們',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70532','zhTW','你最多只能招募%u個機器人！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70533','zhTW','你沒有足夠的現金',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70534','zhTW','你最多只能招募%u位%u。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70535','zhTW','無法退還裝備 %u (%s)! 無法解雇機器人！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70536','zhTW','當前設定',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70537','zhTW','攻擊距離',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70538','zhTW','最小遠程攻擊距離...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70539','zhTW','最大遠程攻擊距離...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70540','zhTW','設定攻擊距離',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70541','zhTW','移除增益魔法...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70542','zhTW','修正屬性...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70543','zhTW','因為某些原因，無法卸下 %s 這件裝備將發到你的郵箱。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70544','zhTW','坦克',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70545','zhTW','遠程',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70546','zhTW','採礦',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70547','zhTW','草藥',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70548','zhTW','剝皮',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70549','zhTW','工程學',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70550','zhTW','由於長時間未上線，已自動解除雇傭狀態。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70551','zhTW','機器人系統已被停用，請聯系管理員。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70552','zhTW','%s 不能假如你的隊伍，已經有雇主了：%s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70553','zhTW','%s 正在傳送中，不能加入你的隊伍',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70554','zhTW','守護',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70555','zhTW','靈猴',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70556','zhTW','雄鷹守護',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70557','zhTW','獵豹守護',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70558','zhTW','蝮蛇守護',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70559','zhTW','野獸守護',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70560','zhTW','豹群守護',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70561','zhTW','野性守護',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70562','zhTW','龍鷹守護',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70563','zhTW','無守護',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70564','zhTW','光環',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70565','zhTW','虔誠',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70566','zhTW','專注',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70567','zhTW','火焰抗性',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70568','zhTW','冰霜抗性',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70569','zhTW','暗影抗性',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70570','zhTW','懲戒',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70571','zhTW','十字軍',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70572','zhTW','無光環',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70573','zhTW','減速藥膏',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70574','zhTW','速效藥膏',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70575','zhTW','致命藥膏',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70576','zhTW','致傷藥膏',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70577','zhTW','麻痹藥膏',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70578','zhTW','麻醉藥膏',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70579','zhTW','無',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70580','zhTW','火舌武器',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70581','zhTW','冰封武器',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70582','zhTW','風怒武器',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70583','zhTW','大地生命武器',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70584','zhTW','我需要你的服務。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70585','zhTW','你不能再雇傭更多的機器人了。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70586','zhTW','你希望雇傭',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70587','zhTW','現在正在忙著，請稍後再試。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70588','zhTW','很高興和你進行交易。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70589','zhTW','戰士',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70590','zhTW','聖騎士',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70591','zhTW','法師',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70592','zhTW','牧師',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70593','zhTW','術士',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70594','zhTW','德魯伊',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70595','zhTW','死亡騎士',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70596','zhTW','盜賊',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70597','zhTW','薩滿',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70598','zhTW','獵人',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70599','zhTW','劍聖',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70600','zhTW','黑曜石毀滅者',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70601','zhTW','大法師',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70602','zhTW','恐懼魔王',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70603','zhTW','破法者',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70604','zhTW','黑暗遊俠',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70605','zhTW','戰士',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70606','zhTW','聖騎士',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70607','zhTW','法師',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70608','zhTW','牧師',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70609','zhTW','術士',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70610','zhTW','德魯伊',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70611','zhTW','死亡騎士',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70612','zhTW','盜賊',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70613','zhTW','薩滿',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70614','zhTW','獵人',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70615','zhTW','劍聖',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70616','zhTW','黑曜石毀滅者',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70617','zhTW','大法師',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70618','zhTW','恐懼魔王',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70619','zhTW','破法者',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70620','zhTW','黑暗遊俠',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70621','zhTW','男',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70622','zhTW','女',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70623','zhTW','人類',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70624','zhTW','獸人',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70625','zhTW','矮人',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70626','zhTW','夜精靈',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70627','zhTW','不死族',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70628','zhTW','牛頭人',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70629','zhTW','地精',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70630','zhTW','食人妖',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70631','zhTW','血精靈',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70632','zhTW','德萊尼',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70633','zhTW','未知',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70634','zhTW','自動拾取',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70635','zhTW','|cff9d9d9d灰色|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70636','zhTW','|cffffffff白色|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70637','zhTW','|cff1eff00綠色|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70638','zhTW','|cff0070dd藍色|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70639','zhTW','|cffa335ee紫色|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70640','zhTW','|cffff8000橙色|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70641','zhTW','參與行為',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70642','zhTW','|延遲攻擊時間|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70643','zhTW','|延遲治療時間|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70644','zhTW','|秒|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70645','zhTW','|副坦克|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70646','zhTW','|死靈法師們|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70647','zhTW','|死靈法師|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70648','zhTW','|攻擊方向|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70649','zhTW','|正常|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70650','zhTW','|避免正面AOE|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70651','zhTW','|NIY|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70652','zhTW','|你確定這會奏效嗎？最好是世界上最好的水....|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70653','zhTW','|看來你真的需要喝點淡水。|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70654','zhTW','|海女巫們|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70655','zhTW','|海女巫|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70656','zhTW','|每點傷害的法力|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70657','zhTW','|每點魔法的傷害|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70658','zhTW','幻化...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70659','zhTW','禁用戰鬥定位',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70660','zhTW','優先目標',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70661','zhTW','機器人裝備銀行...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70662','zhTW','存款項目...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70663','zhTW','撤回物品...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70664','zhTW','銀行是空的',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70665','zhTW','前一頁',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70666','zhTW','下一頁',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70667','zhTW','你真的想花這麼多錢讓地窟領主再次動起來嗎？',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70668','zhTW','我很懷疑你現在的狀態,但我願意帶領你並幫助你恢復力量。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70669','zhTW','地窟領主們|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70670','zhTW','|地窟領主|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70671','zhTW','反射',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70672','zhTW','蝗蟲',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70673','zhTW','治療目標生命閾值',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70674','zhTW','我需要傳送門',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70675','zhTW','暴風城',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70676','zhTW','鐵爐堡',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70677','zhTW','達納蘇斯',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70678','zhTW','艾克索達',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70679','zhTW','奧格瑞瑪',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70680','zhTW','幽暗城',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70681','zhTW','雷霆崖',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70682','zhTW','銀月城',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70683','zhTW','沙塔斯城',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n+('70684','zhTW','達拉然',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);\ndiff --git a/sql/base/auth_npcbots.sql b/sql/base/auth_npcbots.sql\nnew file mode 100644\nindex 0000000000..e69de29bb2\ndiff --git a/sql/base/characters_npcbots.sql b/sql/base/characters_npcbots.sql\nnew file mode 100644\nindex 0000000000..00d585bd46\n--- /dev/null\n+++ b/sql/base/characters_npcbots.sql\n@@ -0,0 +1,187 @@\n+\n+/*Table structure for table `characters_npcbot` */\n+\n+DROP TABLE IF EXISTS `characters_npcbot`;\n+\n+CREATE TABLE `characters_npcbot` (\n+  `entry` int unsigned NOT NULL COMMENT 'creature_template.entry',\n+  `owner` int unsigned NOT NULL DEFAULT '0' COMMENT 'characters.guid (lowguid)',\n+  `roles` int unsigned NOT NULL COMMENT 'bitmask: tank(1),dps(2),heal(4),ranged(8)',\n+  `spec` tinyint unsigned NOT NULL DEFAULT '1',\n+  `faction` int unsigned NOT NULL DEFAULT '35',\n+  `hire_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n+  `shared_owners` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,\n+  `equipMhEx` int unsigned NOT NULL DEFAULT '0',\n+  `equipOhEx` int unsigned NOT NULL DEFAULT '0',\n+  `equipRhEx` int unsigned NOT NULL DEFAULT '0',\n+  `equipHead` int unsigned NOT NULL DEFAULT '0',\n+  `equipShoulders` int unsigned NOT NULL DEFAULT '0',\n+  `equipChest` int unsigned NOT NULL DEFAULT '0',\n+  `equipWaist` int unsigned NOT NULL DEFAULT '0',\n+  `equipLegs` int unsigned NOT NULL DEFAULT '0',\n+  `equipFeet` int unsigned NOT NULL DEFAULT '0',\n+  `equipWrist` int unsigned NOT NULL DEFAULT '0',\n+  `equipHands` int unsigned NOT NULL DEFAULT '0',\n+  `equipBack` int unsigned NOT NULL DEFAULT '0',\n+  `equipBody` int unsigned NOT NULL DEFAULT '0',\n+  `equipFinger1` int unsigned NOT NULL DEFAULT '0',\n+  `equipFinger2` int unsigned NOT NULL DEFAULT '0',\n+  `equipTrinket1` int unsigned NOT NULL DEFAULT '0',\n+  `equipTrinket2` int unsigned NOT NULL DEFAULT '0',\n+  `equipNeck` int unsigned NOT NULL DEFAULT '0',\n+  `spells_disabled` longtext COLLATE utf8mb4_unicode_ci,\n+  `miscvalues` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,\n+  PRIMARY KEY (`entry`)\n+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n+\n+/*Data for the table `characters_npcbot` */\n+\n+/*Table structure for table `characters_npcbot_gear_set` */\n+\n+DROP TABLE IF EXISTS `characters_npcbot_gear_set`;\n+\n+CREATE TABLE `characters_npcbot_gear_set` (\n+  `owner` int unsigned NOT NULL DEFAULT '0',\n+  `set_id` tinyint unsigned NOT NULL DEFAULT '0',\n+  `set_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n+  PRIMARY KEY (`owner`,`set_id`)\n+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Bot equipment sets system';\n+\n+/*Data for the table `characters_npcbot_gear_set` */\n+\n+/*Table structure for table `characters_npcbot_gear_set_item` */\n+\n+DROP TABLE IF EXISTS `characters_npcbot_gear_set_item`;\n+\n+CREATE TABLE `characters_npcbot_gear_set_item` (\n+  `owner` int unsigned NOT NULL DEFAULT '0',\n+  `set_id` tinyint unsigned NOT NULL DEFAULT '0',\n+  `slot` tinyint unsigned NOT NULL DEFAULT '0',\n+  `item_id` mediumint unsigned NOT NULL DEFAULT '0',\n+  PRIMARY KEY (`owner`,`set_id`,`slot`)\n+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Bot equipment sets system';\n+\n+/*Data for the table `characters_npcbot_gear_set_item` */\n+\n+/*Table structure for table `characters_npcbot_gear_storage` */\n+\n+DROP TABLE IF EXISTS `characters_npcbot_gear_storage`;\n+\n+CREATE TABLE `characters_npcbot_gear_storage` (\n+  `guid` int unsigned NOT NULL DEFAULT '0',\n+  `item_guid` int unsigned NOT NULL DEFAULT '0',\n+  PRIMARY KEY (`item_guid`),\n+  KEY `existing_player` (`guid`),\n+  CONSTRAINT `characters_npcbot_gear_storage_ibfk_1` FOREIGN KEY (`item_guid`) REFERENCES `item_instance` (`guid`) ON DELETE CASCADE ON UPDATE CASCADE,\n+  CONSTRAINT `existing_player` FOREIGN KEY (`guid`) REFERENCES `characters` (`guid`) ON DELETE CASCADE ON UPDATE CASCADE\n+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Bot item storage system';\n+\n+/*Data for the table `characters_npcbot_gear_storage` */\n+\n+/*Table structure for table `characters_npcbot_group_member` */\n+\n+DROP TABLE IF EXISTS `characters_npcbot_group_member`;\n+\n+CREATE TABLE `characters_npcbot_group_member` (\n+  `guid` int unsigned NOT NULL,\n+  `entry` int unsigned NOT NULL,\n+  `memberFlags` tinyint unsigned NOT NULL DEFAULT '0',\n+  `subgroup` tinyint unsigned NOT NULL DEFAULT '0',\n+  `roles` tinyint unsigned NOT NULL DEFAULT '0',\n+  PRIMARY KEY (`entry`)\n+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;\n+\n+/*Data for the table `characters_npcbot_group_member` */\n+\n+/*Table structure for table `characters_npcbot_logs` */\n+\n+DROP TABLE IF EXISTS `characters_npcbot_logs`;\n+\n+CREATE TABLE `characters_npcbot_logs` (\n+  `id` bigint unsigned NOT NULL AUTO_INCREMENT,\n+  `entry` int unsigned NOT NULL DEFAULT '0',\n+  `owner` int NOT NULL DEFAULT '-1',\n+  `mapid` int NOT NULL DEFAULT '-1',\n+  `inmap` tinyint NOT NULL DEFAULT '-1',\n+  `inworld` tinyint NOT NULL DEFAULT '-1',\n+  `type` smallint unsigned NOT NULL DEFAULT '0',\n+  `param1` varchar(51) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,\n+  `param2` varchar(51) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,\n+  `param3` varchar(51) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,\n+  `param4` varchar(51) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,\n+  `param5` varchar(51) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,\n+  `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,\n+  PRIMARY KEY (`id`)\n+) ENGINE=InnoDB AUTO_INCREMENT=552981 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;\n+\n+/*Data for the table `characters_npcbot_logs` */\n+\n+/*Table structure for table `characters_npcbot_settings` */\n+\n+DROP TABLE IF EXISTS `characters_npcbot_settings`;\n+\n+CREATE TABLE `characters_npcbot_settings` (\n+  `owner` int unsigned NOT NULL,\n+  `dist_follow` tinyint unsigned NOT NULL DEFAULT '30',\n+  `dist_attack` tinyint unsigned NOT NULL DEFAULT '0',\n+  `attack_range_mode` tinyint unsigned NOT NULL DEFAULT '1',\n+  `attack_angle_mode` tinyint unsigned NOT NULL DEFAULT '1',\n+  `engage_delay_dps` int unsigned NOT NULL DEFAULT '0',\n+  `engage_delay_heal` int unsigned NOT NULL DEFAULT '0',\n+  `flags` int unsigned NOT NULL DEFAULT '0',\n+  PRIMARY KEY (`owner`)\n+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;\n+\n+/*Data for the table `characters_npcbot_settings` */\n+\n+/*Table structure for table `characters_npcbot_stats` */\n+\n+DROP TABLE IF EXISTS `characters_npcbot_stats`;\n+\n+CREATE TABLE `characters_npcbot_stats` (\n+  `entry` int unsigned NOT NULL DEFAULT '0',\n+  `maxhealth` int unsigned NOT NULL DEFAULT '0',\n+  `maxpower` int unsigned NOT NULL DEFAULT '0',\n+  `strength` int unsigned NOT NULL DEFAULT '0',\n+  `agility` int unsigned NOT NULL DEFAULT '0',\n+  `stamina` int unsigned NOT NULL DEFAULT '0',\n+  `intellect` int unsigned NOT NULL DEFAULT '0',\n+  `spirit` int unsigned NOT NULL DEFAULT '0',\n+  `armor` int unsigned NOT NULL DEFAULT '0',\n+  `defense` int unsigned NOT NULL DEFAULT '0',\n+  `resHoly` int unsigned NOT NULL DEFAULT '0',\n+  `resFire` int unsigned NOT NULL DEFAULT '0',\n+  `resNature` int unsigned NOT NULL DEFAULT '0',\n+  `resFrost` int unsigned NOT NULL DEFAULT '0',\n+  `resShadow` int unsigned NOT NULL DEFAULT '0',\n+  `resArcane` int unsigned NOT NULL DEFAULT '0',\n+  `blockPct` float unsigned NOT NULL DEFAULT '0',\n+  `dodgePct` float unsigned NOT NULL DEFAULT '0',\n+  `parryPct` float unsigned NOT NULL DEFAULT '0',\n+  `critPct` float unsigned NOT NULL DEFAULT '0',\n+  `attackPower` int unsigned NOT NULL DEFAULT '0',\n+  `spellPower` int unsigned NOT NULL DEFAULT '0',\n+  `spellPen` int unsigned NOT NULL DEFAULT '0',\n+  `hastePct` float unsigned NOT NULL DEFAULT '0',\n+  `hitBonusPct` float unsigned NOT NULL DEFAULT '0',\n+  `expertise` int unsigned NOT NULL DEFAULT '0',\n+  `armorPenPct` float unsigned NOT NULL DEFAULT '0',\n+  PRIMARY KEY (`entry`)\n+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;\n+\n+/*Data for the table `characters_npcbot_stats` */\n+\n+/*Table structure for table `characters_npcbot_transmog` */\n+\n+DROP TABLE IF EXISTS `characters_npcbot_transmog`;\n+\n+CREATE TABLE `characters_npcbot_transmog` (\n+  `entry` int unsigned NOT NULL,\n+  `slot` tinyint unsigned NOT NULL,\n+  `item_id` int unsigned NOT NULL DEFAULT '0',\n+  `fake_id` int NOT NULL DEFAULT '-1',\n+  PRIMARY KEY (`entry`,`slot`),\n+  CONSTRAINT `bot_id` FOREIGN KEY (`entry`) REFERENCES `characters_npcbot` (`entry`) ON DELETE CASCADE ON UPDATE CASCADE\n+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;\n+\n+/*Data for the table `characters_npcbot_transmog` */\n\\ No newline at end of file\ndiff --git a/sql/base/world_npcbots.sql b/sql/base/world_npcbots.sql\nnew file mode 100644\nindex 0000000000..7622cdab43\n--- /dev/null\n+++ b/sql/base/world_npcbots.sql\n@@ -0,0 +1,5938 @@\n+\n+/*Table structure for table `creature_template_npcbot_appearance` */\n+\n+DROP TABLE IF EXISTS `creature_template_npcbot_appearance`;\n+\n+CREATE TABLE `creature_template_npcbot_appearance` (\n+  `entry` mediumint unsigned NOT NULL AUTO_INCREMENT,\n+  `name*` char(100) DEFAULT 'unk' COMMENT 'unused',\n+  `gender` tinyint unsigned NOT NULL DEFAULT '0',\n+  `skin` tinyint unsigned NOT NULL DEFAULT '0',\n+  `face` tinyint unsigned NOT NULL DEFAULT '0',\n+  `hair` tinyint unsigned NOT NULL DEFAULT '0',\n+  `haircolor` tinyint unsigned NOT NULL DEFAULT '0',\n+  `features` tinyint unsigned NOT NULL DEFAULT '0',\n+  PRIMARY KEY (`entry`)\n+) ENGINE=InnoDB AUTO_INCREMENT=70556 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;\n+\n+/*Data for the table `creature_template_npcbot_appearance` */\n+\n+LOCK TABLES `creature_template_npcbot_appearance` WRITE;\n+\n+INSERT INTO `creature_template_npcbot_appearance`(`entry`,`name*`,`gender`,`skin`,`face`,`hair`,`haircolor`,`features`) VALUES\n+(70001,'Llane',0,3,0,1,1,6),\n+(70002,'Thran',0,0,0,4,5,4),\n+(70003,'Lyria',1,3,4,6,4,0),\n+(70004,'Ander',0,1,11,1,7,6),\n+(70005,'Malosh',0,7,0,5,5,5),\n+(70006,'Granis',0,0,2,9,4,4),\n+(70007,'Kelstrum',0,5,4,2,2,2),\n+(70008,'Dannal',0,1,0,8,5,0),\n+(70009,'Austil',0,4,1,8,1,7),\n+(70010,'Torm',0,7,1,2,0,2),\n+(70011,'Sark',0,0,3,7,0,5),\n+(70012,'Ker',1,4,0,0,0,1),\n+(70013,'Harutt',0,1,3,7,0,4),\n+(70014,'Krang',0,5,2,6,2,0),\n+(70015,'Frang',0,0,4,1,1,3),\n+(70016,'Tarshaw',0,3,3,1,0,7),\n+(70017,'Grezz',0,3,5,1,0,3),\n+(70018,'Sorek',0,2,1,3,1,6),\n+(70019,'Zel\\'mak',0,1,0,4,8,1),\n+(70020,'Alyissia',1,5,1,5,2,0),\n+(70021,'Kyra',1,6,8,4,6,1),\n+(70022,'Arias\\'ta',1,0,6,3,4,1),\n+(70023,'Sildanair',1,3,0,2,4,2),\n+(70024,'Chris',0,3,2,2,2,10),\n+(70025,'Angela',1,2,7,3,8,6),\n+(70026,'Baltus',0,0,0,1,8,1),\n+(70027,'Kelv',0,5,1,7,3,1),\n+(70028,'Bilban',0,2,2,2,7,1),\n+(70029,'Wu',0,4,5,1,0,8),\n+(70030,'Ilsa',1,5,6,7,3,4),\n+(70031,'Darnath',0,7,8,3,0,0),\n+(70032,'Evencane',0,5,9,2,4,2),\n+(70033,'Kore',0,4,0,2,1,6),\n+(70034,'Ahonan',0,6,1,1,6,5),\n+(70035,'Behomat',0,4,8,3,6,3),\n+(70036,'Ruada',1,1,2,1,6,0),\n+(70037,'Kazi',1,1,2,3,3,0),\n+(70038,'Kerra',1,2,0,2,2,0),\n+(70051,'Sammuel',0,9,11,6,2,7),\n+(70052,'Bromos',0,6,4,2,9,1),\n+(70053,'Wilhelm',0,4,2,2,1,6),\n+(70054,'Grayson',0,3,2,2,0,2),\n+(70055,'Azar',0,2,4,3,1,6),\n+(70056,'Valgar',0,4,3,0,0,0),\n+(70057,'Beldruk',0,4,6,2,4,2),\n+(70058,'Brandur',0,5,4,1,1,3),\n+(70059,'Arthur',0,1,0,1,5,2),\n+(70060,'Katherine',1,1,3,2,4,0),\n+(70061,'Karman',0,3,11,10,5,8),\n+(70062,'Jesthenis',0,4,0,0,0,0),\n+(70063,'Noellene',1,0,1,1,1,0),\n+(70064,'Aurelon',0,8,0,0,0,0),\n+(70065,'Osselan',0,8,1,1,2,0),\n+(70066,'Ithelis',0,9,2,2,2,0),\n+(70067,'Bachi',0,3,0,10,1,0),\n+(70068,'Baatun',0,6,4,3,0,7),\n+(70069,'Kavaan',0,2,5,5,6,4),\n+(70070,'Tullas',1,0,9,9,2,0),\n+(70071,'Jol',1,0,8,8,6,0),\n+(70072,'Cyssa',1,4,1,7,6,0),\n+(70073,'Pyreanor',0,3,3,2,7,1),\n+(70074,'Rukua',1,5,8,4,4,1),\n+(70101,'Thorgas',0,4,5,8,4,8),\n+(70102,'Ogromm',0,4,4,3,1,4),\n+(70103,'Grif',0,0,1,5,4,4),\n+(70104,'Kragg',0,7,4,3,2,2),\n+(70105,'Kary',1,2,1,1,2,1),\n+(70106,'Holt',0,18,3,4,0,3),\n+(70107,'Urek',0,4,2,2,1,1),\n+(70108,'Lanka',0,4,2,2,1,2),\n+(70109,'Yaw',0,1,1,5,2,2),\n+(70110,'Jen\\'shan',1,3,0,2,6,3),\n+(70111,'Thotar',0,0,3,3,1,9),\n+(70112,'Ormak',0,5,8,1,0,5),\n+(70113,'Xor\\'juul',0,2,3,2,0,1),\n+(70114,'Sian\\'dur',1,2,4,1,2,4),\n+(70115,'Ayanna',1,5,0,6,5,8),\n+(70116,'Dazalar',0,8,0,6,2,3),\n+(70117,'Danlaar',0,0,0,3,6,0),\n+(70118,'Jeen\\'ra',1,7,2,1,4,1),\n+(70119,'Jocaste',1,6,1,1,6,1),\n+(70120,'Dorion',0,4,6,5,0,5),\n+(70121,'Daera',1,0,3,12,4,0),\n+(70122,'Olmin',0,3,1,2,2,4),\n+(70123,'Regnus',0,3,9,1,4,2),\n+(70124,'Kaerbrus',0,2,0,0,2,2),\n+(70125,'Einris',1,1,1,5,4,0),\n+(70126,'Ulfir',0,6,2,5,8,1),\n+(70127,'Thorfin',0,2,2,5,4,7),\n+(70128,'Alenndaar',0,2,6,3,2,2),\n+(70129,'Dargh',0,3,1,1,4,4),\n+(70130,'Sallina',1,4,2,1,1,0),\n+(70131,'Hannovia',1,0,2,2,1,0),\n+(70132,'Keilnei',1,7,5,2,4,1),\n+(70133,'Tana',1,8,1,1,2,0),\n+(70134,'Oninath',0,0,0,0,0,0),\n+(70135,'Zandine',1,8,0,1,4,0),\n+(70136,'Deremiis',0,11,0,5,6,7),\n+(70137,'Acteon',0,2,0,0,0,0),\n+(70138,'Vord',0,11,0,5,6,7),\n+(70139,'Killac',0,11,0,5,6,7),\n+(70151,'Jorik',0,3,0,11,1,2),\n+(70152,'Solm',0,7,8,4,9,6),\n+(70153,'Keryn',1,4,4,7,0,0),\n+(70154,'Osborne',0,4,9,9,0,1),\n+(70155,'Hogral',0,6,7,10,5,7),\n+(70156,'Ian',0,5,9,9,1,6),\n+(70157,'David',0,4,2,1,1,1),\n+(70158,'Marion',1,5,2,3,5,7),\n+(70159,'Rwag',0,0,0,0,0,0),\n+(70160,'Kaplak',0,3,5,0,0,3),\n+(70161,'Gest',0,4,0,2,0,1),\n+(70162,'Ormok',0,3,8,4,0,3),\n+(70163,'Shenthul',0,3,0,5,5,1),\n+(70164,'Frahun',0,2,1,3,5,4),\n+(70165,'Jannok',0,3,2,4,5,3),\n+(70166,'Syurna',1,0,3,5,4,0),\n+(70167,'Erion',0,5,0,3,4,3),\n+(70168,'Anishar',0,5,6,4,6,5),\n+(70169,'Carolyn',1,0,6,3,1,7),\n+(70170,'Miles',0,0,0,1,9,8),\n+(70171,'Gregory',0,3,7,8,4,14),\n+(70172,'Hulfdan',0,8,8,8,5,6),\n+(70173,'Ormyr',0,0,6,4,4,4),\n+(70174,'Fenthwick',0,0,2,2,5,0),\n+(70175,'Fahrad',0,3,0,9,4,2),\n+(70176,'Tony',0,3,0,1,0,2),\n+(70177,'Kariel',0,1,0,0,0,0),\n+(70178,'Tannaria',1,2,2,0,2,0),\n+(70179,'Zelanis',0,0,1,1,1,0),\n+(70180,'Elara',1,2,2,1,4,0),\n+(70181,'Nerisen',0,1,1,2,1,0),\n+(70201,'Anetta',1,0,9,14,5,0),\n+(70202,'Laurena',1,0,1,4,5,0),\n+(70203,'Josetta',1,1,3,17,2,0),\n+(70204,'Branstock',0,2,7,1,8,0),\n+(70205,'Maxan',0,2,0,6,1,5),\n+(70206,'Duesten',0,0,9,5,1,0),\n+(70207,'Beryl',0,0,0,0,0,12),\n+(70208,'Miles',0,0,2,7,9,2),\n+(70209,'Malakai',0,4,3,2,6,8),\n+(70210,'Cobb',0,5,6,6,4,14),\n+(70211,'Shanda',1,1,0,2,7,4),\n+(70212,'Laurna',1,0,7,0,2,4),\n+(70213,'Tai\\'jin',1,0,3,1,6,5),\n+(70214,'Ken\\'jai',0,5,2,4,3,0),\n+(70215,'Astarii',1,0,0,0,0,0),\n+(70216,'Jandria',1,1,1,5,3,0),\n+(70217,'Lariia',1,0,3,3,6,0),\n+(70218,'Lankester',0,2,0,9,4,16),\n+(70219,'Lazarus',0,0,0,6,6,14),\n+(70220,'Theodrus',0,2,6,5,7,4),\n+(70221,'Braenna',1,0,1,1,0,0),\n+(70222,'Toldren',0,4,1,3,3,10),\n+(70223,'Benjamin',0,9,11,0,0,8),\n+(70224,'Joshua',0,3,0,1,1,8),\n+(70225,'Zayus',0,2,0,3,1,4),\n+(70226,'X\\'yera',0,2,1,2,4,4),\n+(70227,'Ur\\'kyo',0,0,2,2,3,2),\n+(70228,'Nara',1,0,7,4,1,3),\n+(70229,'Alathea',1,4,3,0,4,5),\n+(70230,'Rohan',0,0,9,4,7,5),\n+(70231,'Arena',1,0,2,2,1,0),\n+(70232,'Ponaris',0,1,0,1,2,0),\n+(70233,'Zalduun',0,9,0,0,0,0),\n+(70234,'Aldrae',0,3,1,1,1,0),\n+(70235,'Lotheolan',0,8,8,1,2,0),\n+(70236,'Belestra',1,4,0,1,3,0),\n+(70237,'Caedmos',0,4,0,0,4,3),\n+(70238,'Guvan',0,12,0,5,6,4),\n+(70239,'Izmir',0,7,0,4,6,6),\n+(70240,'Fallat',0,7,1,4,6,6),\n+(70251,'Haromm',0,0,3,5,0,6),\n+(70252,'Siln',1,10,1,3,2,1),\n+(70253,'Tigor',0,13,2,2,2,1),\n+(70254,'Beram',0,10,0,2,0,5),\n+(70255,'Meela',1,8,1,3,0,0),\n+(70256,'Narm',0,17,0,6,1,4),\n+(70257,'Shikrik',1,3,4,5,1,1),\n+(70258,'Swart',0,0,4,5,0,7),\n+(70259,'Kardris',1,0,4,7,0,6),\n+(70260,'Sian\\'tsu',1,3,3,3,1,3),\n+(70261,'Sagorne',0,6,1,1,1,2),\n+(70265,'Sulaa',1,7,2,2,4,6),\n+(70267,'Umbrua',1,1,7,5,5,1),\n+(70268,'Javad',0,4,1,6,0,1),\n+(70301,'Khelden',0,7,5,7,0,5),\n+(70302,'Zaldimar',0,2,10,11,9,3),\n+(70303,'Maginor',0,1,9,8,7,4),\n+(70304,'Marryk',0,0,4,6,7,1),\n+(70305,'Magis',0,1,5,4,6,4),\n+(70306,'Isabella',1,2,0,7,1,5),\n+(70307,'Cain',0,0,0,7,1,10),\n+(70308,'Shymm',0,5,6,6,5,12),\n+(70309,'Ursyn',1,0,5,9,1,7),\n+(70310,'Thurston',0,4,1,5,5,1),\n+(70311,'Pierce',0,0,2,5,8,2),\n+(70312,'Anastasia',1,2,7,3,8,5),\n+(70313,'Bink',1,2,1,1,6,0),\n+(70314,'Juli',1,1,5,5,3,0),\n+(70315,'Nittlebur',0,0,4,0,7,6),\n+(70316,'Jennea',1,5,4,5,4,4),\n+(70317,'Un\\'Thuwa',0,1,2,1,3,4),\n+(70318,'Pephredo',1,0,4,1,2,5),\n+(70319,'Enyo',1,3,4,4,0,0),\n+(70320,'Mai\\'ah',1,1,2,1,1,5),\n+(70321,'Deino',1,2,0,3,3,2),\n+(70322,'Uthel\\'nay',0,3,4,2,3,0),\n+(70323,'Dink',0,1,3,2,6,1),\n+(70324,'Julia',1,2,6,2,0,0),\n+(70325,'Garridel',1,3,1,2,2,0),\n+(70326,'Valaatu',1,9,6,7,6,5),\n+(70327,'Zaedana',1,3,2,2,1,0),\n+(70328,'Quithas',0,2,3,1,1,0),\n+(70329,'Inethven',0,0,0,0,3,0),\n+(70330,'Narinth',1,0,2,2,0,0),\n+(70331,'Edirah',1,5,0,5,3,0),\n+(70332,'Valustraa',1,5,5,9,6,5),\n+(70333,'Semid',0,8,9,8,0,7),\n+(70334,'Harnan',0,8,8,7,1,3),\n+(70335,'Bati',1,8,1,2,1,0),\n+(70336,'Derek',0,5,3,3,1,5),\n+(70351,'Drusilla',1,0,10,4,0,0),\n+(70352,'Alamar',0,2,2,3,2,5),\n+(70353,'Demisette',1,0,9,2,0,0),\n+(70354,'Maximillian',0,1,10,6,0,6),\n+(70355,'Kartosh',0,0,7,0,1,6),\n+(70356,'Maximillion',0,5,0,9,5,5),\n+(70357,'Rupert',0,0,0,0,0,8),\n+(70358,'Nartok',0,0,6,4,0,1),\n+(70359,'Dhugru',0,5,6,4,3,9),\n+(70360,'Grol\\'dar',0,3,2,3,1,2),\n+(70361,'Mirket',1,5,3,7,0,5),\n+(70362,'Zevrost',0,3,7,5,5,9),\n+(70363,'Kaal',0,3,1,4,2,3),\n+(70364,'Luther',0,4,9,0,0,0),\n+(70365,'Richard',0,5,5,0,0,0),\n+(70366,'Thistleheart',0,3,2,6,3,0),\n+(70367,'Briarthorn',0,0,6,1,0,3),\n+(70368,'Alexander',0,0,10,11,0,6),\n+(70369,'Ursula',1,1,4,18,3,6),\n+(70370,'Sandahl',0,4,2,11,1,6),\n+(70371,'Gimrizz',0,2,5,2,0,3),\n+(70372,'Teli\\'Larien',0,0,0,0,0,0),\n+(70373,'Celoenus',0,0,0,2,0,0),\n+(70374,'Alamma',0,0,1,0,0,0),\n+(70375,'Talionia',1,0,2,1,2,0),\n+(70376,'Zanien',0,0,0,0,3,0),\n+(70377,'Babagaya',1,0,6,0,3,0),\n+(70401,'Turak',0,4,3,5,0,5),\n+(70402,'Sheal',1,7,0,3,1,1),\n+(70403,'Kym',1,9,2,3,0,0),\n+(70404,'Gart',0,13,1,3,2,2),\n+(70405,'Gennia',1,9,3,0,1,3),\n+(70406,'Mardant',0,1,1,2,0,4),\n+(70407,'Kal',0,2,2,4,4,2),\n+(70408,'Mathrengyl',0,5,0,2,6,3),\n+(70409,'Denatharion',0,4,8,3,2,5),\n+(70410,'Fylerian',0,2,1,4,5,0),\n+(70411,'Sheldras',0,0,3,2,2,4),\n+(70412,'Theridran',0,2,1,3,7,3),\n+(70413,'Maldryn',0,2,8,5,4,0),\n+(70414,'Jannos',0,5,3,2,1,5),\n+(70415,'Golhine',0,0,2,6,0,4),\n+(70416,'Loganaar',0,2,1,1,0,1),\n+(70417,'Harene',1,6,0,3,2,4),\n+(70418,'Shalannius',0,4,3,0,4,5),\n+(70451,'Siouxsie',1,9,9,3,4,9),\n+(70452,'Imhadria',1,10,8,6,1,0),\n+(70453,'Vaelen',0,16,9,11,9,8),\n+(70454,'Mynx',1,10,0,17,11,0),\n+(70455,'Lankral',0,6,13,16,12,4),\n+(70456,'Sliver',0,10,11,11,6,0),\n+(70457,'Vereth',0,4,0,8,9,10),\n+(70458,'Arly',1,7,9,2,8,4),\n+(70459,'Setaal',1,14,12,15,9,2),\n+(70460,'Uzo',0,8,7,8,9,18),\n+(70461,'Illyrie',1,9,11,1,12,0),\n+(70462,'Crok',0,11,9,10,7,3),\n+(70463,'Zor\\'be',0,8,7,6,9,18),\n+(70464,'Datura',1,10,11,11,18,0),\n+(70465,'Stefan',0,10,12,6,12,2),\n+(70555,'Detrae',0,3,12,11,19,4);\n+\n+UNLOCK TABLES;\n+\n+/*Table structure for table `creature_template_npcbot_disabled_items` */\n+\n+DROP TABLE IF EXISTS `creature_template_npcbot_disabled_items`;\n+\n+CREATE TABLE `creature_template_npcbot_disabled_items` (\n+  `id` int unsigned NOT NULL DEFAULT '0',\n+  PRIMARY KEY (`id`)\n+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n+\n+/*Data for the table `creature_template_npcbot_disabled_items` */\n+\n+LOCK TABLES `creature_template_npcbot_disabled_items` WRITE;\n+\n+INSERT INTO `creature_template_npcbot_disabled_items`(`id`) VALUES\n+(77),\n+(1046),\n+(1047),\n+(1170),\n+(1174),\n+(1354),\n+(1719),\n+(2811),\n+(2812),\n+(2814),\n+(3068),\n+(3271),\n+(3333),\n+(3436),\n+(3883),\n+(3885),\n+(3886),\n+(3887),\n+(3888),\n+(3933),\n+(3935),\n+(4193),\n+(4616),\n+(4657),\n+(4664),\n+(4667),\n+(4670),\n+(4673),\n+(4902),\n+(4934),\n+(4950),\n+(4955),\n+(4956),\n+(5040),\n+(5294),\n+(5295),\n+(5296),\n+(5297),\n+(5298),\n+(5607),\n+(12755),\n+(13242),\n+(14363),\n+(14597),\n+(14609),\n+(14691),\n+(14696),\n+(15888),\n+(15889),\n+(22391),\n+(23553),\n+(40650),\n+(41900),\n+(41911),\n+(41995),\n+(42000),\n+(42007),\n+(42013),\n+(42019),\n+(42083);\n+\n+UNLOCK TABLES;\n+\n+/*Table structure for table `creature_template_npcbot_extras` */\n+\n+DROP TABLE IF EXISTS `creature_template_npcbot_extras`;\n+\n+CREATE TABLE `creature_template_npcbot_extras` (\n+  `entry` mediumint unsigned NOT NULL,\n+  `class` tinyint unsigned NOT NULL DEFAULT '1',\n+  `race` tinyint unsigned NOT NULL DEFAULT '1',\n+  PRIMARY KEY (`entry`)\n+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;\n+\n+/*Data for the table `creature_template_npcbot_extras` */\n+\n+LOCK TABLES `creature_template_npcbot_extras` WRITE;\n+\n+INSERT INTO `creature_template_npcbot_extras`(`entry`,`class`,`race`) VALUES\n+(70001,1,1),\n+(70002,1,3),\n+(70003,1,1),\n+(70004,1,3),\n+(70005,1,2),\n+(70006,1,3),\n+(70007,1,3),\n+(70008,1,5),\n+(70009,1,5),\n+(70010,1,6),\n+(70011,1,6),\n+(70012,1,6),\n+(70013,1,6),\n+(70014,1,6),\n+(70015,1,2),\n+(70016,1,2),\n+(70017,1,2),\n+(70018,1,2),\n+(70019,1,8),\n+(70020,1,4),\n+(70021,1,4),\n+(70022,1,4),\n+(70023,1,4),\n+(70024,1,5),\n+(70025,1,5),\n+(70026,1,5),\n+(70027,1,3),\n+(70028,1,7),\n+(70029,1,1),\n+(70030,1,1),\n+(70031,1,4),\n+(70032,1,1),\n+(70033,1,11),\n+(70034,1,11),\n+(70035,1,11),\n+(70036,1,11),\n+(70037,1,11),\n+(70038,1,10),\n+(70051,2,1),\n+(70052,2,3),\n+(70053,2,1),\n+(70054,2,1),\n+(70055,2,3),\n+(70056,2,3),\n+(70057,2,3),\n+(70058,2,3),\n+(70059,2,1),\n+(70060,2,1),\n+(70061,2,1),\n+(70062,2,10),\n+(70063,2,10),\n+(70064,2,11),\n+(70065,2,10),\n+(70066,2,10),\n+(70067,2,10),\n+(70068,2,11),\n+(70069,2,11),\n+(70070,2,11),\n+(70071,2,11),\n+(70072,2,10),\n+(70073,2,10),\n+(70074,2,11),\n+(70101,3,3),\n+(70102,3,2),\n+(70103,3,3),\n+(70104,3,2),\n+(70105,3,6),\n+(70106,3,6),\n+(70107,3,6),\n+(70108,3,6),\n+(70109,3,6),\n+(70110,3,8),\n+(70111,3,2),\n+(70112,3,2),\n+(70113,3,8),\n+(70114,3,8),\n+(70115,3,4),\n+(70116,3,4),\n+(70117,3,4),\n+(70118,3,4),\n+(70119,3,4),\n+(70120,3,4),\n+(70121,3,3),\n+(70122,3,3),\n+(70123,3,3),\n+(70124,3,4),\n+(70125,3,3),\n+(70126,3,3),\n+(70127,3,3),\n+(70128,3,4),\n+(70129,3,3),\n+(70130,3,10),\n+(70131,3,10),\n+(70132,3,11),\n+(70133,3,10),\n+(70134,3,10),\n+(70135,3,10),\n+(70136,3,11),\n+(70137,3,11),\n+(70138,3,11),\n+(70139,3,11),\n+(70151,4,1),\n+(70152,4,3),\n+(70153,4,1),\n+(70154,4,1),\n+(70155,4,3),\n+(70156,4,1),\n+(70157,4,5),\n+(70158,4,5),\n+(70159,4,2),\n+(70160,4,2),\n+(70161,4,2),\n+(70162,4,2),\n+(70163,4,8),\n+(70164,4,4),\n+(70165,4,4),\n+(70166,4,4),\n+(70167,4,4),\n+(70168,4,4),\n+(70169,4,5),\n+(70170,4,5),\n+(70171,4,5),\n+(70172,4,3),\n+(70173,4,3),\n+(70174,4,7),\n+(70175,4,1),\n+(70176,4,1),\n+(70177,4,10),\n+(70178,4,10),\n+(70179,4,10),\n+(70180,4,10),\n+(70181,4,10),\n+(70201,5,1),\n+(70202,5,1),\n+(70203,5,1),\n+(70204,5,3),\n+(70205,5,3),\n+(70206,5,5),\n+(70207,5,5),\n+(70208,5,5),\n+(70209,5,5),\n+(70210,5,5),\n+(70211,5,4),\n+(70212,5,4),\n+(70213,5,8),\n+(70214,5,8),\n+(70215,5,4),\n+(70216,5,4),\n+(70217,5,4),\n+(70218,5,5),\n+(70219,5,5),\n+(70220,5,3),\n+(70221,5,3),\n+(70222,5,3),\n+(70223,5,1),\n+(70224,5,1),\n+(70225,5,8),\n+(70226,5,8),\n+(70227,5,8),\n+(70228,5,4),\n+(70229,5,4),\n+(70230,5,3),\n+(70231,5,10),\n+(70232,5,10),\n+(70233,5,11),\n+(70234,5,10),\n+(70235,5,10),\n+(70236,5,10),\n+(70237,5,11),\n+(70238,5,11),\n+(70239,5,11),\n+(70240,5,11),\n+(70251,7,2),\n+(70252,7,6),\n+(70253,7,6),\n+(70254,7,6),\n+(70255,7,6),\n+(70256,7,6),\n+(70257,7,2),\n+(70258,7,2),\n+(70259,7,2),\n+(70260,7,8),\n+(70261,7,6),\n+(70265,7,11),\n+(70267,7,11),\n+(70268,7,11),\n+(70301,8,1),\n+(70302,8,1),\n+(70303,8,1),\n+(70304,8,7),\n+(70305,8,7),\n+(70306,8,5),\n+(70307,8,5),\n+(70308,8,5),\n+(70309,8,5),\n+(70310,8,5),\n+(70311,8,5),\n+(70312,8,5),\n+(70313,8,7),\n+(70314,8,7),\n+(70315,8,7),\n+(70316,8,1),\n+(70317,8,8),\n+(70318,8,8),\n+(70319,8,8),\n+(70320,8,8),\n+(70321,8,8),\n+(70322,8,8),\n+(70323,8,7),\n+(70324,8,10),\n+(70325,8,10),\n+(70326,8,11),\n+(70327,8,10),\n+(70328,8,10),\n+(70329,8,10),\n+(70330,8,10),\n+(70331,8,11),\n+(70332,8,11),\n+(70333,8,11),\n+(70334,8,11),\n+(70335,8,11),\n+(70336,8,5),\n+(70351,9,1),\n+(70352,9,7),\n+(70353,9,1),\n+(70354,9,1),\n+(70355,9,2),\n+(70356,9,5),\n+(70357,9,5),\n+(70358,9,2),\n+(70359,9,2),\n+(70360,9,2),\n+(70361,9,2),\n+(70362,9,2),\n+(70363,9,2),\n+(70364,9,5),\n+(70365,9,5),\n+(70366,9,7),\n+(70367,9,7),\n+(70368,9,1),\n+(70369,9,1),\n+(70370,9,1),\n+(70371,9,7),\n+(70372,9,10),\n+(70373,9,10),\n+(70374,9,10),\n+(70375,9,10),\n+(70376,9,10),\n+(70377,9,7),\n+(70401,11,6),\n+(70402,11,6),\n+(70403,11,6),\n+(70404,11,6),\n+(70405,11,6),\n+(70406,11,4),\n+(70407,11,4),\n+(70408,11,4),\n+(70409,11,4),\n+(70410,11,4),\n+(70411,11,4),\n+(70412,11,4),\n+(70413,11,4),\n+(70414,11,6),\n+(70415,11,4),\n+(70416,11,4),\n+(70417,11,6),\n+(70418,11,4),\n+(70451,6,4),\n+(70452,6,10),\n+(70453,6,11),\n+(70454,6,10),\n+(70455,6,1),\n+(70456,6,10),\n+(70457,6,5),\n+(70458,6,7),\n+(70459,6,11),\n+(70460,6,8),\n+(70461,6,4),\n+(70462,6,2),\n+(70463,6,8),\n+(70464,6,10),\n+(70465,6,1),\n+(70501,0,0),\n+(70502,0,0),\n+(70503,0,0),\n+(70504,0,0),\n+(70505,0,0),\n+(70506,0,0),\n+(70507,0,0),\n+(70508,0,0),\n+(70509,0,0),\n+(70510,0,0),\n+(70511,0,0),\n+(70512,0,0),\n+(70513,0,0),\n+(70514,0,0),\n+(70515,0,0),\n+(70516,0,0),\n+(70517,0,0),\n+(70518,0,0),\n+(70519,0,0),\n+(70520,0,0),\n+(70521,0,0),\n+(70522,0,0),\n+(70523,0,0),\n+(70524,0,0),\n+(70525,0,0),\n+(70526,0,0),\n+(70527,0,0),\n+(70528,0,0),\n+(70529,0,0),\n+(70530,0,0),\n+(70531,0,0),\n+(70532,0,0),\n+(70533,0,0),\n+(70534,0,0),\n+(70535,0,0),\n+(70536,0,0),\n+(70537,0,0),\n+(70538,0,0),\n+(70542,0,0),\n+(70543,0,0),\n+(70544,0,0),\n+(70545,0,0),\n+(70551,12,15),\n+(70552,12,15),\n+(70553,13,15),\n+(70554,13,15),\n+(70555,14,1),\n+(70556,0,0),\n+(70557,15,15),\n+(70558,15,15),\n+(70559,15,15),\n+(70560,15,15),\n+(70561,15,15),\n+(70562,0,0),\n+(70563,16,15),\n+(70564,16,15),\n+(70565,16,15),\n+(70566,16,15),\n+(70567,16,15),\n+(70568,17,10),\n+(70569,17,10),\n+(70570,17,10),\n+(70571,17,10),\n+(70572,17,10),\n+(70573,0,15),\n+(70574,0,15),\n+(70575,18,1),\n+(70576,18,1),\n+(70577,18,1),\n+(70578,18,1),\n+(70579,18,1),\n+(70580,0,15),\n+(70581,19,13),\n+(70582,19,13),\n+(70583,19,13),\n+(70584,19,13),\n+(70585,19,13),\n+(70587,20,15),\n+(70588,20,15),\n+(70589,20,15),\n+(70590,20,15),\n+(70591,20,15),\n+(70592,0,15),\n+(70593,0,15),\n+(70594,0,15),\n+(70595,0,15);\n+\n+UNLOCK TABLES;\n+\n+/*Table structure for table `creature_template_npcbot_wander_nodes` */\n+\n+DROP TABLE IF EXISTS `creature_template_npcbot_wander_nodes`;\n+\n+CREATE TABLE `creature_template_npcbot_wander_nodes` (\n+  `id` int unsigned NOT NULL,\n+  `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'RENAME_ME',\n+  `mapid` smallint unsigned NOT NULL DEFAULT '0',\n+  `zoneid` int unsigned NOT NULL DEFAULT '0',\n+  `areaid` int unsigned NOT NULL DEFAULT '0',\n+  `minlevel` tinyint unsigned NOT NULL DEFAULT '0',\n+  `maxlevel` tinyint unsigned NOT NULL DEFAULT '0',\n+  `minwaittime` int unsigned NOT NULL DEFAULT '3000',\n+  `maxwaittime` int unsigned NOT NULL DEFAULT '7000',\n+  `proximity` float NOT NULL DEFAULT '0',\n+  `flags` int unsigned NOT NULL DEFAULT '0',\n+  `x` float NOT NULL DEFAULT '0',\n+  `y` float NOT NULL DEFAULT '0',\n+  `z` float NOT NULL DEFAULT '0',\n+  `o` float NOT NULL DEFAULT '0',\n+  `links` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,\n+  PRIMARY KEY (`id`)\n+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Bot Wander Map';\n+\n+/*Data for the table `creature_template_npcbot_wander_nodes` */\n+\n+LOCK TABLES `creature_template_npcbot_wander_nodes` WRITE;\n+\n+INSERT INTO `creature_template_npcbot_wander_nodes`(`id`,`name`,`mapid`,`zoneid`,`areaid`,`minlevel`,`maxlevel`,`minwaittime`,`maxwaittime`,`proximity`,`flags`,`x`,`y`,`z`,`o`,`links`) VALUES\n+(1,'Anvilmar',0,1,132,1,5,3000,7000,0,2,-6077.84,384.826,393.598,4.63263,'542:0 '),\n+(2,'Brill',0,85,159,1,10,3000,7000,0,5,2249.85,278.414,34.1142,5.11546,'18:0 277:0 278:0 279:0 281:0 '),\n+(3,'Darkshire',0,10,42,18,30,3000,7000,0,3,-10560.6,-1182.34,27.9637,3.1803,'783:0 784:0 787:0 788:0 789:0 '),\n+(4,'Deathknell',0,85,154,1,10,3000,7000,0,5,1879.83,1588.2,90.1725,5.25172,'295:0 296:0 '),\n+(5,'Dun Algaz',0,11,836,18,30,3000,7000,0,0,-4245.13,-2356.42,204.034,3.9477,'483:0 '),\n+(6,'Dun Modr',0,11,205,18,30,3000,7000,0,0,-2610.26,-2350.56,81.5918,1.1263,'444:0 '),\n+(7,'Goldshire',0,12,87,1,10,3000,7000,0,3,-9480.09,63.5218,56.1755,3.4173,'88:0 71:0 16:0 42:0 72:0 710:0 709:0 714:0 717:0 '),\n+(8,'Ironforge',0,1,809,1,10,3000,7000,0,2,-5023.64,-831.425,495.319,5.37056,'559:0 560:0 '),\n+(9,'Kharanos',0,1,131,1,10,3000,7000,0,3,-5501.22,-472.604,408.453,2.4002,'537:0 545:0 557:0 '),\n+(10,'Lakeshire',0,44,69,13,25,3000,7000,0,3,-9235.12,-2145.54,71.2121,5.71383,'665:0 666:0 '),\n+(11,'Menethil Harbor',0,11,150,18,30,3000,7000,0,3,-3672.7,-828.455,9.89925,3.18444,'476:0 477:0 478:0 '),\n+(12,'Moonbrook',0,40,20,8,20,3000,7000,0,2,-11017.1,1510.17,43.1667,2.58627,'737:0 738:0 736:0 747:0 '),\n+(13,'Northshire Abbey',0,12,9,1,10,3000,7000,0,3,-8900.51,-116.199,81.8499,0.369434,'710:0 70:0 73:0 '),\n+(14,'Raven Hill',0,10,94,18,30,3000,7000,0,0,-10805.5,291.025,30.9282,3.92422,'751:0 753:0 754:0 755:0 766:0 '),\n+(15,'Sentinel Hill',0,40,108,8,20,3000,7000,0,3,-10509.5,1047.74,60.519,5.20046,'741:0 742:0 745:0 746:0 736:0 750:0 '),\n+(16,'Stormwind City',0,12,12,1,10,3000,7000,0,2,-9153.77,364.057,90.151,5.16709,'42:0 710:0 712:0 7:0 '),\n+(17,'The Sepulcher',0,130,228,8,20,3000,7000,0,5,470.768,1589.82,126.632,5.16292,'305:0 '),\n+(18,'Undercity',0,85,153,1,10,3000,7000,0,5,1885.94,236.924,58.0313,3.1016,'2:0 285:0 '),\n+(19,'Thelsamar',0,38,144,8,20,3000,7000,0,3,-5334.7,-3015.26,324.2,1.73643,'503:0 504:0 '),\n+(20,'Southshore',0,267,271,18,30,3000,7000,0,3,-803.031,-531.727,15.9656,1.39359,'362:0 363:0 376:0 384:0 385:0 356:0 '),\n+(21,'Tarren Mill',0,267,272,18,30,3000,7000,0,5,-27.0354,-900.562,55.9602,4.57301,'378:0 380:0 379:0 384:0 '),\n+(22,'Refuge Pointe',0,45,320,28,40,3000,7000,0,3,-1280.81,-2466.89,34.7175,5.16384,'78:0 416:0 419:0 '),\n+(23,'Hammerfall',0,45,321,28,40,3000,7000,0,5,-955.494,-3540.82,56.7101,3.23882,'438:0 '),\n+(24,'Kargath',0,3,340,33,45,3000,7000,0,5,-6625,-2152.82,249.141,4.5492,'594:0 598:0 '),\n+(25,'Angor Fortress',0,3,338,33,45,3000,7000,0,0,-6392.65,-3158,299.765,4.68826,'608:0 620:0 '),\n+(26,'Bloodhoof Village',1,215,222,1,10,3000,7000,0,5,-2383.39,-343.878,-0.729101,4.63375,'1817:0 1818:0 1819:0 '),\n+(27,'Camp Narache',1,215,221,1,10,3000,7000,0,5,-2886.88,-207.003,54.8208,5.16976,'1825:0 1826:0 '),\n+(28,'Razor Hill',1,14,362,1,10,3000,7000,0,4,311.158,-4740.49,9.58476,2.69842,'1401:0 1402:0 1409:0 '),\n+(29,'The Den',1,14,363,1,10,3000,7000,0,0,-604.098,-4202.92,38.7281,1.10189,'1431:0 '),\n+(30,'Orgrimmar',1,14,14,1,10,3000,7000,0,5,1429.15,-4364.86,25.4626,0.273189,'1361:0 '),\n+(31,'Senjin Village',1,14,367,1,10,3000,7000,0,0,-827.631,-4901.78,19.7839,0.842982,'1413:0 1419:0 1420:0 1421:0 1422:0 '),\n+(32,'The Crossroads',1,17,380,8,25,3000,7000,0,5,-456.721,-2653.33,95.6449,4.9548,'1487:0 1490:0 1526:0 1535:0 '),\n+(33,'Aldrassil',1,141,256,1,4,3000,7000,0,2,10318.8,828.943,1326.38,0.947904,'972:0 62:0 974:0 '),\n+(34,'Dolanaar',1,141,186,1,10,3000,7000,0,3,9809.39,956.34,1308.79,0.244923,'981:0 983:0 985:0 '),\n+(35,'Ratchet',1,17,392,8,25,3000,7000,0,0,-949.408,-3670.31,9.21524,5.18454,'1475:0 1562:0 1484:0 1618:0 '),\n+(36,'Booty Bay',0,33,35,33,45,3000,7000,0,0,-14308.8,440.139,25.5878,0.828079,'959:0 960:0 961:0 '),\n+(37,'Gromgol Base Camp',0,33,117,33,45,3000,7000,0,5,-12416.5,185.125,1.83125,6.17782,'904:0 900:0 908:0 '),\n+(38,'Astranaar',1,331,415,18,30,3000,7000,0,3,2687.8,-420.338,107.402,0.195851,'1056:0 1055:0 '),\n+(39,'Stonetalon Peak',1,406,467,18,25,3000,7000,0,3,2693.45,1481.51,235.304,5.88192,'1692:0 1694:0 1690:0 '),\n+(40,'Thalanaar',1,357,489,23,35,3000,7000,0,3,-4496.36,-778.473,-40.558,2.54579,'2014:0 2019:0 2020:0 2021:0 '),\n+(41,'Freewind Post',1,400,484,23,35,3000,7000,0,4,-5429.82,-2388.59,89.4787,2.85815,'2104:0 2105:0 '),\n+(42,'Mirror Lake',0,12,92,1,10,3000,7000,0,2,-9389.26,458.427,38.2852,2.4529,'72:0 16:0 88:0 7:0 '),\n+(44,'Drywhisker Gorge',0,45,318,28,40,3000,7000,0,0,-1014.22,-3827.39,145.41,2.59534,'440:0 '),\n+(45,'Sun Rock Retreat',1,406,460,13,25,3000,7000,0,4,946.771,895.865,106.952,1.46258,'1662:0 1663:0 '),\n+(46,'Temple of Zin-Malor',1,16,1223,43,54,3000,7000,0,0,3549.15,-5359.12,188.348,1.22969,'1325:0 '),\n+(48,'Uthers Tomb',0,28,196,48,56,3000,7000,0,0,1021.5,-1809.43,77.1448,3.5376,'271:0 '),\n+(50,'Whitereach Post',1,400,2237,23,35,3000,7000,0,0,-4917.35,-1375.5,-52.612,3.05417,'2034:0 2036:0 2038:0 2040:0 '),\n+(51,'Stonard',0,8,75,33,45,3000,7000,0,5,-10445,-3261.11,20.179,5.57373,'828:0 829:0 830:0 '),\n+(52,'Gadgetzan',1,440,976,38,50,3000,7000,0,0,-7145.2,-3724,8.49316,4.91643,'2144:0 2146:0 2147:0 '),\n+(53,'Camp Mojache',1,357,1099,38,50,3000,7000,0,4,-4402.29,263.941,25.2783,4.51526,'1995:0 1996:0 1997:0 '),\n+(54,'Theramore Isle',1,15,513,33,45,3000,7000,0,2,-3702.55,-4393.17,15.8191,0.332538,'1882:0 1883:0 '),\n+(55,'Aerie Peak',0,47,348,38,50,3000,7000,0,0,151.003,-2052.21,117.992,6.03287,'82:0 386:0 387:0 388:0 '),\n+(56,'Everlook',1,618,2255,53,60,3000,7000,0,0,6726.4,-4671.8,720.854,3.62348,'1218:0 1240:0 '),\n+(57,'Shadowprey Village',1,405,2408,31,40,3000,7000,0,5,-1591.76,3150,62.5296,3.57741,'1792:0 '),\n+(58,'Feathermoon Stronghold',1,357,1116,38,50,3000,7000,0,3,-4377.97,3297.09,28.7853,5.12409,'1940:0 1941:0 1939:0 '),\n+(59,'Auberdine',1,148,442,8,20,3000,7000,0,0,6300.77,315.841,22.9342,5.97913,'993:0 994:0 1008:0 1010:0 1011:0 1012:0 '),\n+(60,'Nijels Point',1,405,608,28,40,3000,7000,0,3,164.433,1335.57,197.473,2.41439,'1716:0 '),\n+(62,'Shadowthread Cave',1,141,257,1,4,3000,7000,0,2,10749.1,923.327,1336.99,6.25796,'33:0 972:0 973:0 '),\n+(63,'Fel Rock',1,141,258,1,10,3000,7000,0,2,10038.9,1030.06,1329.12,0.362337,'983:0 984:0 '),\n+(64,'Banethil Barrow Den',1,141,736,4,10,3000,7000,0,2,9972.27,1541.52,1308.75,3.05312,'985:0 986:0 987:0 '),\n+(66,'DurotarCanyon1_1',1,14,410,1,10,3000,7000,0,0,622.608,-4563.33,7.7631,0.614446,'1372:0 1373:0 1374:0 '),\n+(67,'Torkren Farm',1,14,2979,1,10,3000,7000,0,0,723.247,-4242.04,17.2031,4.54537,'1372:0 1373:0 1385:0 1392:0 1400:0 '),\n+(69,'Ironbands Compound',0,1,716,1,10,3000,7000,0,2,-5858.7,-2004.1,401.648,0.478922,'523:0 528:0 '),\n+(70,'Echo Ridge Mine',0,12,34,1,10,3000,7000,0,2,-8691.38,-113.152,89.09,5.86134,'73:0 13:0 711:0 '),\n+(71,'Maclure Vineyards',0,12,64,1,10,3000,7000,0,2,-9948.39,69.1568,33.3005,5.49869,'72:0 7:0 714:0 716:0 '),\n+(72,'Stonefield Farm',0,12,63,1,10,3000,7000,0,2,-9901.14,378.19,35.2801,5.75613,'71:0 7:0 42:0 88:0 713:0 714:0 717:0 '),\n+(73,'Northshire Vineyards',0,12,59,1,10,3000,7000,0,2,-9067.35,-333.965,73.4519,1.09469,'70:0 13:0 '),\n+(74,'Tower of Ilgalar',0,44,96,18,25,3000,7000,0,0,-9282.21,-3330.43,115.604,1.41034,'683:0 685:0 686:0 '),\n+(75,'Renders Rock',0,44,998,13,25,3000,7000,0,0,-8677.89,-2302.91,155.917,1.18325,'661:0 662:0 '),\n+(76,'Spirit Den',0,33,1742,33,45,3000,7000,0,0,-13751.4,-18.3165,44.0002,0.851192,'964:0 '),\n+(77,'Rethban Caverns',0,44,98,13,25,3000,7000,0,2,-8976.38,-2016.83,136.063,1.26142,'670:0 671:0 '),\n+(78,'Boulderfist Outpost',0,45,1858,28,40,3000,7000,0,0,-1183.46,-2180.67,55.5524,1.6849,'22:0 415:0 416:0 419:0 '),\n+(79,'Groshgok Compound',0,41,2937,50,60,3000,7000,0,0,-11094.7,-2311.06,117.13,4.77931,'800:0 803:0 804:0 '),\n+(80,'Stagalbog Cave',0,8,1817,33,45,3000,7000,0,0,-10775.6,-3747.85,22.347,3.74768,'186:0 825:0 824:0 826:0 828:0 832:0 '),\n+(81,'The Tower of Arathor',0,45,324,28,40,3000,7000,0,0,-1760.68,-1537.05,64.8696,2.02383,'425:0 '),\n+(82,'Wildhammer Keep',0,47,349,38,50,3000,7000,0,3,250.073,-2203.83,125.172,0.474207,'55:0 387:0 388:0 '),\n+(83,'Night Webs Hollow',0,85,155,1,10,3000,7000,0,4,2053.22,1802.16,99.8006,1.83635,'295:0 '),\n+(84,'Terrorweb Tunnel',0,139,2626,53,60,3000,7000,0,0,3035.33,-2773.9,100.473,5.05065,'215:0 243:0 '),\n+(85,'Browman Mill',0,139,2269,53,60,3000,7000,0,0,2475.41,-5143.98,77.5041,5.20031,'234:0 211:0 '),\n+(86,'Uldaman',0,3,1337,33,45,3000,7000,0,0,-6092.01,-3179.35,255.852,5.9237,'621:0 '),\n+(87,'Dustbelch Grotto',0,3,347,33,45,3000,7000,0,0,-7299.86,-2270.26,244.599,3.07308,'595:0 '),\n+(88,'Westbrook Garrison',0,12,120,1,10,3000,7000,0,2,-9671.96,690.134,36.5414,5.31336,'72:0 42:0 713:0 7:0 717:0 '),\n+(89,'Jasperlode Mine',0,12,54,1,10,3000,7000,0,0,-9194.18,-610.205,60.7892,0.426731,'701:0 702:0 707:0 708:0 '),\n+(91,'Algaz Station',0,38,925,8,20,3000,7000,0,0,-4880.26,-2723,328.908,0.873682,'485:0 486:0 487:0 500:0 502:0 '),\n+(92,'Grim Batol',0,11,1037,61,70,3000,7000,0,0,-4130,-3468.16,259.76,0.014411,'454:0 '),\n+(93,'Venture Co. Mine',1,215,215,1,10,3000,7000,0,4,-1466.09,-994.107,148.38,4.09562,'1868:0 '),\n+(94,'Blackwood Den',1,148,455,8,20,3000,7000,0,0,4626.07,40.557,68.8626,1.32329,'95:0 999:0 1003:0 1006:0 '),\n+(95,'WindbendRiverS',1,148,454,8,20,3000,7000,0,0,5014.05,224.988,33.2141,0.194282,'996:0 999:0 1005:0 94:0 1006:0 '),\n+(96,'Cliffspring Falls',1,148,445,8,20,3000,7000,0,0,6878.37,-656.215,84.4074,3.85022,'1019:0 1020:0 1021:0 '),\n+(98,'Wailing Caverns',1,17,718,8,25,3000,7000,0,0,-868.365,-2044.69,81.6627,1.16842,'1539:0 1540:0 1557:0 1614:0 '),\n+(99,'Shady Rest Inn',1,15,403,33,45,3000,7000,0,0,-3695.7,-2558.8,61.0548,1.48476,'1872:0 1873:0 1904:0 '),\n+(100,'Darkmist Cavern',1,15,499,33,45,3000,7000,0,0,-2829.79,-2722.81,36.7883,2.20851,'187:0 102:0 1902:0 '),\n+(101,'North Point Tower',1,15,504,33,45,3000,7000,0,2,-2869.79,-3419.99,39.3517,3.30334,'102:0 1875:0 1877:0 1878:0 1902:0 '),\n+(102,'Bluefen',1,15,507,33,45,3000,7000,0,0,-2695.87,-3011.4,41.88,2.01726,'100:0 187:0 1874:0 101:0 1875:0 1902:0 '),\n+(103,'Lost Point',1,15,506,33,45,3000,7000,0,0,-3917.65,-2833.95,42.7963,4.55319,'1873:0 1904:0 1907:0 1908:0 1909:0 '),\n+(104,'Tidefury Cove',1,15,517,33,45,3000,7000,0,0,-4414.52,-4100.84,6.37542,0.28057,'106:0 1912:0 '),\n+(105,'Stonemaul Ruins',1,15,508,33,45,3000,7000,0,0,-4346.02,-3321.15,34.2542,6.16796,'106:0 233:0 1906:0 1907:0 1909:0 '),\n+(106,'Onyxias Lair',1,15,511,33,45,3000,7000,0,0,-4638.56,-3708.98,38.6239,2.33441,'233:0 105:0 1910:0 1911:0 104:0 '),\n+(107,'Emberstrifes Den',1,15,2158,33,45,3000,7000,0,0,-4956.66,-3850.19,43.6067,2.10466,'1910:0 1911:0 '),\n+(108,'Bloodfen Burrow',1,15,498,33,45,3000,7000,0,0,-4335.04,-2639.53,38.0638,1.30845,'1908:0 1909:0 '),\n+(109,'Sentry Point',1,15,503,33,45,3000,7000,0,0,-3410.26,-4186.35,10.7187,3.27073,'1881:0 1882:0 '),\n+(110,'Swamplight Manor',1,15,497,33,45,3000,7000,0,0,-2949.47,-3893.5,35.0303,1.23141,'1877:0 1878:0 1879:0 1880:0 '),\n+(111,'Marshals Refuge',1,490,541,46,56,3000,7000,0,1,-6112.07,-1130.95,-187.426,1.5835,'2245:0 2246:0 '),\n+(112,'Fungal Rock',1,490,542,46,56,3000,7000,0,0,-6383.04,-1806.79,-266.123,6.01903,'2249:0 2250:0 2251:0 '),\n+(113,'Wavestrider Beach',1,440,988,38,50,3000,7000,0,0,-7619.63,-4828.43,0.668867,3.36332,'2157:0 2158:0 2159:0 2160:0 '),\n+(114,'Uldum',1,440,989,44,55,3000,7000,0,0,-9473.22,-2749.02,15.4728,5.89777,'2193:0 2194:0 2195:0 '),\n+(115,'Darkcloud Pinnacle',1,400,2097,23,35,3000,7000,0,0,-5086.21,-1919.44,88.1806,6.15461,'2071:0 2077:0 2078:0 '),\n+(116,'Roguefeather Den',1,400,487,23,35,3000,7000,0,0,-5462.36,-1633.26,30.0036,4.16001,'2056:0 2057:0 '),\n+(117,'Mirage Raceway',1,400,2240,23,35,3000,7000,0,0,-6239.42,-3973.12,-58.7501,5.06259,'122:0 123:0 2136:0 2137:0 118:0 2138:0 '),\n+(118,'The Rustmaul Digsite',1,400,479,23,35,3000,7000,0,0,-6490.61,-3449.15,-58.7821,3.58106,'117:0 123:0 2138:0 2139:0 '),\n+(119,'Splithoof Hold',1,400,1557,23,35,3000,7000,0,0,-5071.33,-2349.27,-53.6634,5.48527,'2084:0 2094:0 2112:0 '),\n+(121,'Ironstone Camp',1,400,3037,23,35,3000,7000,0,0,-5813.18,-3421.49,-50.9325,2.44381,'2131:0 2133:0 122:0 2134:0 2138:0 '),\n+(122,'Weazels Crater',1,400,3038,23,35,3000,7000,0,0,-5880.19,-3796.15,-59.9445,0.25844,'121:0 2133:0 2134:0 2136:0 117:0 2138:0 '),\n+(123,'Tahonda Ruins',1,400,3039,23,35,3000,7000,0,0,-6569.91,-3894.97,-58.7495,0.100017,'117:0 2137:0 118:0 2138:0 2140:0 '),\n+(124,'Rolands Doom',0,10,2161,24,30,3000,7000,0,0,-11045.3,-1130.98,38.585,3.65547,'780:0 781:0 '),\n+(127,'Maraudon',1,405,2100,33,40,3000,7000,0,0,-1421.88,2905.15,136.781,1.31624,'1786:0 1787:0 '),\n+(128,'Ghost Walker Post',1,405,597,28,40,3000,7000,0,4,-1258.05,1699.26,89.9098,0.914953,'1765:0 1766:0 1769:0 1776:0 '),\n+(129,'Scrabblescrews Camp',1,405,2617,31,40,3000,7000,0,0,-1407.87,1493.13,60.8875,4.75641,'1749:0 1750:0 1764:0 1769:0 1770:0 1777:0 1778:0 '),\n+(130,'Valley of Bones',1,405,2657,33,40,3000,7000,0,0,-2323.83,1355.6,63.5887,1.00444,'1812:0 1813:0 '),\n+(131,'Rage Scar Hold',1,357,1115,38,50,3000,7000,0,0,-3839.01,1752.22,143.122,4.59397,'1927:0 1928:0 '),\n+(132,'Ruins of Solarsal',1,357,1117,38,50,3000,7000,0,2,-4932.61,3653.2,12.2193,0.301741,'1940:0 1941:0 140:0 '),\n+(133,'Ravaged Twilight Camp',1,1377,3100,53,60,3000,7000,0,0,-6206.25,1766.95,17.464,4.2566,'2318:0 2319:0 '),\n+(134,'Twilight Post',1,1377,3098,55,60,3000,7000,0,0,-6753.94,1661.67,6.34336,0.541008,'2319:0 2320:0 2321:0 2322:0 '),\n+(135,'Twilight Outpost',1,1377,3099,55,60,3000,7000,0,0,-7929.11,1833.28,4.86506,0.733634,'2336:0 2337:0 2338:0 '),\n+(136,'Woodpaw Hills',1,357,2519,38,50,3000,7000,0,0,-4867.47,196.488,57.1639,3.31322,'1991:0 1992:0 '),\n+(137,'Lariss Pavillion',1,357,2518,38,50,3000,7000,0,0,-4097.42,96.644,76.2811,5.8877,'2004:0 2006:0 2007:0 '),\n+(138,'Slither Rock',0,46,2419,48,56,3000,7000,0,0,-7653.86,-2991.1,135.917,1.62615,'648:0 650:0 652:0 '),\n+(139,'Flame Crest',0,46,251,48,56,3000,7000,0,5,-7486.64,-2184.45,166.505,5.87909,'646:0 '),\n+(140,'Shalzarus Lair',1,357,3117,38,50,3000,7000,0,0,-5418.89,3677.45,4.7662,3.81836,'132:0 1942:0 '),\n+(142,'Timbermaw Hold',1,618,618,53,60,3000,7000,0,0,6889.31,-2300.49,584.754,3.03017,'1196:0 1202:0 '),\n+(143,'The Ruins of KelTheril',1,618,2252,53,60,3000,7000,0,0,6430.1,-4328.62,666.714,0.935105,'1216:0 '),\n+(144,'Dun Mandarr',1,618,2248,53,60,3000,7000,0,0,5667.17,-4495.06,769.144,0.689558,'1255:0 1258:0 1259:0 1260:0 '),\n+(145,'Talrendis Point',1,16,3137,43,54,3000,7000,0,3,2689.78,-3854.8,103.228,5.51976,'1270:0 '),\n+(147,'Moon Horror Den',1,618,3139,53,60,3000,7000,0,0,7122.72,-4596.74,637.499,3.77862,'1225:0 '),\n+(148,'Timbermaw Hold',1,361,1769,46,56,3000,7000,0,0,6811.82,-2090.36,625.019,5.71392,'1148:0 1196:0 '),\n+(149,'Irontree Cavern',1,361,1768,46,56,3000,7000,0,0,6464.49,-1502.77,438.462,4.97283,'1142:0 1143:0 1183:0 1184:0 '),\n+(150,'Bloodvenom Post',1,361,1997,46,56,3000,7000,0,5,5070.53,-333.931,367.077,5.98328,'1164:0 '),\n+(151,'Sishir Canyon',1,406,2541,13,25,3000,7000,0,0,599.482,622.34,74.9622,3.1924,'1645:0 '),\n+(152,'Cragpool Lake',1,406,463,13,25,3000,7000,0,0,1491.34,85.8624,11.9254,3.12763,'1649:0 1650:0 1651:0 1652:0 '),\n+(153,'Windshear Mine',1,406,461,13,25,3000,7000,0,0,981.949,-358.9,14.3123,3.71479,'1648:0 1654:0 1655:0 '),\n+(154,'The Talondeep Path',1,406,1277,13,25,3000,7000,0,0,1531.94,-576.57,67.9212,5.18318,'1653:0 1655:0 168:0 '),\n+(155,'The Talon Den',1,406,468,18,25,3000,7000,0,4,2416.89,1792.39,393.641,3.36062,'1692:0 1693:0 '),\n+(156,'The Ruins of OrdilAran',1,331,412,18,30,3000,7000,0,0,3476.85,-104.536,2.98631,5.31466,'157:0 1029:0 1031:0 1033:0 '),\n+(157,'Bathrans Haunt',1,331,411,18,30,3000,7000,0,0,3827.37,-161.305,-0.60768,3.24941,'1028:0 156:0 '),\n+(158,'Zoramgar Outpost',1,331,2897,18,30,3000,7000,0,5,3362.22,1010.16,3.59814,2.49558,'1035:0 1036:0 1037:0 '),\n+(159,'Falfarren River',1,331,433,18,30,3000,7000,0,0,2247.11,-2187.63,105.176,0.680699,'1078:0 1079:0 '),\n+(160,'Xavian',1,331,429,18,30,3000,7000,0,0,2931.82,-2808,212.839,0.056247,'1080:0 1081:0 1085:0 '),\n+(161,'Forest Song',1,331,2358,18,30,3000,7000,0,3,2936.03,-3270.73,159.15,3.69459,'1085:0 1091:0 1093:0 '),\n+(162,'Demon Fall Canyon',1,331,435,18,30,3000,7000,0,0,1708.23,-3157.86,94.4801,5.70126,'1099:0 1100:0 1104:0 '),\n+(163,'Silverwing Outpost',1,331,2360,18,30,3000,7000,0,0,1776.04,-2061.14,106.556,1.50326,'1109:0 '),\n+(164,'The DorDanil Barrow Den',1,331,432,18,30,3000,7000,0,0,1776.92,-2583.5,85.9882,3.82761,'169:0 1113:0 1115:0 1117:0 '),\n+(165,'Silverwind Refuge',1,331,420,18,30,3000,7000,0,0,2141.6,-1189.65,96.7733,3.54353,'1063:0 1064:0 1066:0 '),\n+(166,'Greenpaw Village',1,331,2359,18,30,3000,7000,0,0,2274.68,-1460.01,90.2583,4.48209,'1066:0 1068:0 1069:0 '),\n+(167,'Bloodtooth Camp',1,331,2357,18,30,3000,7000,0,0,1668.68,-1469.31,140.228,5.79562,'1067:0 '),\n+(168,'The Talondeep Path',1,406,1277,13,25,3000,7000,0,0,1941.31,-740.96,113.545,2.12791,'154:0 1063:0 '),\n+(169,'Warsong Labor Camp',1,331,3177,18,30,3000,7000,0,0,1575.91,-2463.94,98.549,2.24558,'164:0 1110:0 '),\n+(170,'Aridens Camp',0,41,2560,50,60,3000,7000,0,0,-10443.3,-2141.1,90.7796,5.92189,'801:0 '),\n+(171,'Deadwind Ravine',0,41,2558,50,60,3000,7000,0,0,-10607.9,-1904.89,117.201,2.66188,'798:0 799:0 '),\n+(172,'Sleeping Gorge',0,41,2938,50,60,3000,7000,0,0,-10740.7,-1951.45,121.127,3.69664,'800:0 801:0 '),\n+(173,'Chillwind Camp',0,28,3197,48,56,3000,7000,0,3,940.955,-1419.2,66.7723,0.796556,'271:0 272:0 334:0 '),\n+(174,'Camp Taurajo',1,17,378,8,25,3000,7000,0,5,-2353.97,-1913.23,95.7826,0.204344,'1550:0 1551:0 1553:0 1554:0 1584:0 1585:0 1814:0 '),\n+(175,'Splintertree Post',1,331,431,18,30,3000,7000,0,5,2251.83,-2538.3,90.4185,6.01297,'1113:0 1114:0 '),\n+(177,'Bones of Grakkarond',1,1377,3257,53,60,3000,7000,0,0,-7228.09,854.674,-1.38994,1.38965,'2323:0 2324:0 2335:0 2343:0 2348:0 2349:0 2350:0 '),\n+(178,'Woodpaw Den',1,357,2520,38,50,3000,7000,0,0,-4775.84,905.452,142.986,4.17326,'1980:0 '),\n+(179,'Revantusk Village',0,47,3317,38,50,3000,7000,0,5,-573.459,-4590.51,10.4122,3.48476,'407:0 '),\n+(180,'Thorium Point',0,51,1446,43,54,3000,7000,0,0,-6521.12,-1190.02,309.255,4.39589,'590:0 '),\n+(183,'The Weeping Cave',0,28,198,48,56,3000,7000,0,0,2249.61,-2389.63,59.8017,5.27414,'244:0 255:0 256:0 '),\n+(184,'Valors Rest',1,1377,3077,50,60,3000,7000,0,0,-6382.38,-308.522,-1.89701,4.0769,'2292:0 2293:0 '),\n+(185,'Yojamba Isle',0,33,3357,33,45,3000,7000,0,0,-11838,1268.18,1.74176,4.79629,'894:0 887:0 895:0 896:0 '),\n+(186,'Misty Reed Post',0,8,1978,33,45,3000,7000,0,4,-10854.8,-4093.43,21.7429,5.03063,'825:0 80:0 826:0 '),\n+(187,'Brackenwall Village',1,15,496,33,45,3000,7000,0,5,-3113.73,-2860.5,34.4097,2.94207,'1873:0 100:0 102:0 '),\n+(188,'Cenarion Hold',1,1377,3425,53,60,3000,7000,0,3,-6886.15,718.398,42.798,6.10305,'2305:0 2306:0 '),\n+(189,'Twilight Base Camp',1,1377,2739,53,60,3000,7000,0,0,-6969.25,1167.66,12.8483,1.06764,'2322:0 2323:0 2324:0 2325:0 2335:0 '),\n+(191,'Twilights Run',1,1377,3446,55,60,3000,7000,0,0,-6332.81,164.268,6.01109,2.33216,'2295:0 2296:0 2297:0 2299:0 '),\n+(192,'Ortells Hideout',1,1377,2744,53,60,3000,7000,0,0,-7601.34,285.736,2.83228,0.367888,'2349:0 2357:0 2358:0 '),\n+(193,'Bronzebeard Encampment',1,1377,3427,53,60,3000,7000,0,0,-7993.44,1118.16,-1.76652,1.00873,'2339:0 2340:0 2341:0 2344:0 2347:0 2346:0 '),\n+(196,'BLC1',0,4,4,43,54,3000,7000,0,0,-11202.2,-3034.46,6.232,1.13173,'839:0 841:0 845:0 852:0 854:0 '),\n+(199,'Under Attack - Eastern Plaguelands',0,139,2258,53,60,3000,7000,0,0,2492.32,-3803.41,177.692,4.09879,'248:0 '),\n+(200,'Ivars Patch',0,130,239,8,20,3000,7000,0,4,1233.05,1214.28,52.5845,3.07876,'201:0 298:0 299:0 303:0 '),\n+(201,'Valgans Field',0,130,227,8,20,3000,7000,0,4,908.754,1255.63,45.9684,0.575633,'299:0 302:0 303:0 200:0 '),\n+(211,'Eastwall Tower - Horde',0,139,2271,53,60,3000,7000,0,0,2550.77,-4783.57,109.501,5.47479,'85:0 235:0 237:0 250:0 '),\n+(215,'Plaguewood Tower - Horde, Progressing',0,139,4067,53,60,3000,7000,0,0,2991.34,-3045.27,119.143,2.65173,'84:0 241:0 242:0 '),\n+(220,'Northpass Tower - Horde, Contested',0,139,2275,53,60,3000,7000,0,0,3168.41,-4356.58,138.976,4.89792,'236:0 237:0 238:0 '),\n+(230,'Crown Guard Tower - Alliance',0,139,2263,53,60,3000,7000,0,0,1861.6,-3701.08,160.834,4.34226,'248:0 247:0 249:0 2369:0 '),\n+(233,'Mudsprocket',1,15,4010,33,45,3000,7000,0,1,-4601.09,-3173.17,38.4677,3.21013,'1909:0 106:0 105:0 1911:0 '),\n+(234,'LightsHopeChapel',0,139,2268,53,60,3000,7000,0,1,2207.38,-5321.35,92.2225,0.203619,'85:0 252:0 '),\n+(235,'BlackwoodLake',0,139,2624,53,60,3000,7000,0,0,2464.31,-4192.32,86.7625,5.25334,'211:0 236:0 250:0 '),\n+(236,'EPL_hubN1',0,139,139,53,60,3000,7000,0,0,2895.84,-4274.37,91.0774,2.94428,'220:0 235:0 237:0 240:0 '),\n+(237,'Northdale',0,139,2272,53,60,3000,7000,0,0,2939.45,-4922.8,110.201,2.76758,'236:0 211:0 220:0 238:0 '),\n+(238,'ZulMasharEntrance',0,139,2273,53,60,3000,7000,0,0,3243.57,-4728.42,157.177,1.67982,'237:0 220:0 239:0 '),\n+(239,'MazraAlor',0,139,2274,53,60,3000,7000,0,0,3446.77,-4987,196.046,5.53613,'238:0 '),\n+(240,'PlaguewoodEast',0,139,2277,53,60,3000,7000,0,0,3031.09,-3786.79,119.967,4.37961,'236:0 241:0 242:0 '),\n+(241,'PlaguewoodSouth',0,139,2277,53,60,3000,7000,0,0,2764.18,-3442.19,97.1331,4.24216,'215:0 240:0 242:0 '),\n+(242,'PlaguewoodCenter',0,139,2277,53,60,3000,7000,0,0,3137.26,-3403.95,139.517,0.937594,'215:0 240:0 241:0 '),\n+(243,'TerrorweTunnelWest',0,139,2619,53,60,3000,7000,0,0,2724.41,-2453.2,66.836,5.42496,'244:0 84:0 '),\n+(244,'ThondorilRiverSouth',0,139,2619,53,60,3000,7000,0,0,2417.75,-2469.65,72.4504,0.00296164,'183:0 243:0 245:0 '),\n+(245,'EPL_hubSW',0,139,139,53,60,3000,7000,0,0,2076.2,-2853.69,86.3391,0.879086,'244:0 246:0 248:0 255:0 '),\n+(246,'EPL_hubSWRoad',0,139,139,53,60,3000,7000,0,0,1811.3,-3046.98,75.4985,1.09939,'245:0 247:0 255:0 '),\n+(247,'Undercroft',0,139,2261,53,60,3000,7000,0,0,1600.37,-3283.08,91.4858,0.567285,'246:0 230:0 '),\n+(248,'EPL_hubSW2',0,139,139,53,60,3000,7000,0,0,2175.83,-3487.76,123.024,5.90406,'199:0 230:0 245:0 '),\n+(249,'EPL_SRoad',0,139,139,53,60,3000,7000,0,0,1841.76,-4088.5,101.961,5.05584,'230:0 250:0 '),\n+(250,'CorinsCrossing',0,139,2264,53,60,3000,7000,0,0,2074.45,-4556.23,73.5772,0.745981,'211:0 235:0 249:0 251:0 252:0 '),\n+(251,'ScarletBaseCamp',0,139,2265,53,60,3000,7000,0,0,1656.05,-4826.35,87.7738,0.384695,'250:0 252:0 253:0 '),\n+(252,'PestilentScar',0,139,2622,53,60,3000,7000,0,0,2013.6,-4964.85,73.6116,5.58402,'234:0 250:0 251:0 253:0 '),\n+(253,'TyrshandEntrance',0,139,2266,53,60,3000,7000,0,0,1690.77,-5201.46,74.6226,4.83788,'251:0 252:0 254:0 '),\n+(254,'Tyrshand',0,139,2266,53,60,3000,7000,0,0,1609.91,-5528.27,111.168,4.2076,'253:0 '),\n+(255,'ThondorilRiverBridge',0,139,2619,53,60,3000,7000,0,0,1924.72,-2608.2,62.8109,4.6761,'183:0 245:0 246:0 256:0 '),\n+(256,'GahrronWithering',0,28,201,48,56,3000,7000,0,0,1768.07,-2280.14,59.7087,0.010807,'183:0 255:0 257:0 258:0 '),\n+(257,'WritingHaunt',0,28,202,48,56,3000,7000,0,0,1506.64,-1862.76,59.0986,5.271,'256:0 258:0 259:0 266:0 269:0 '),\n+(258,'WPL_hubC2',0,28,28,48,56,3000,7000,0,0,1760.12,-1779.45,64.8245,4.87437,'256:0 257:0 259:0 260:0 266:0 269:0 '),\n+(259,'DalsonTears',0,28,200,48,56,3000,7000,0,0,1864.12,-1558.81,59.2668,3.44495,'257:0 258:0 260:0 266:0 267:0 269:0 '),\n+(260,'WPL_hubN1',0,28,28,48,56,3000,7000,0,0,2122.47,-1665.81,64.0458,5.36013,'258:0 259:0 261:0 262:0 '),\n+(261,'NorthridgeLumberCamp',0,28,192,48,56,3000,7000,0,0,2421.88,-1647.26,103.541,5.77835,'260:0 '),\n+(262,'WPL_hubN2',0,28,28,48,56,3000,7000,0,0,2425.99,-1947.45,109.098,4.71217,'260:0 263:0 '),\n+(263,'HearthglenTower',0,28,28,48,56,3000,7000,0,0,2701.43,-1944.23,107.238,0.832291,'262:0 265:0 '),\n+(264,'Hearthglen',0,28,203,48,56,3000,7000,0,0,2924.12,-1426.31,150.782,1.09736,'265:0 '),\n+(265,'HearthglenEntrance',0,28,190,48,56,3000,7000,0,0,2782.62,-1612.54,129.551,0.826396,'264:0 263:0 '),\n+(266,'WPL_hubC1',0,28,28,48,56,3000,7000,0,0,1680.03,-1358.64,69.8578,5.02985,'268:0 257:0 258:0 259:0 267:0 269:0 270:0 274:0 '),\n+(267,'FelstoneField',0,28,199,48,56,3000,7000,0,0,1795.08,-1188.53,59.8914,5.54821,'268:0 259:0 266:0 269:0 273:0 274:0 '),\n+(268,'AndorhalW',0,28,193,48,56,3000,7000,0,0,1336.99,-1272.01,57.8614,2.26525,'266:0 267:0 269:0 270:0 272:0 '),\n+(269,'AndorhalNE',0,28,193,48,56,3000,7000,0,0,1540.11,-1606.19,65.1216,5.937,'257:0 258:0 259:0 266:0 267:0 268:0 270:0 '),\n+(270,'AndorhalEntranceSE',0,28,197,48,56,3000,7000,0,0,1294.98,-1678.78,62.5727,3.83801,'268:0 266:0 269:0 271:0 '),\n+(271,'SorrowHillCR',0,28,197,48,56,3000,7000,0,0,1162.78,-1758.3,60.6308,3.04279,'48:0 173:0 270:0 334:0 '),\n+(272,'AndorhalEntranceSW',0,28,28,48,56,3000,7000,0,0,1214.59,-1145.63,60.8962,5.48342,'268:0 173:0 334:0 '),\n+(273,'Bulwark',0,28,813,48,56,3000,7000,0,5,1718.17,-802.509,57.5466,1.68044,'267:0 274:0 275:0 276:0 '),\n+(274,'WPL_hubE',0,28,813,48,56,3000,7000,0,0,1663.85,-956.731,69.3084,0.651574,'266:0 267:0 273:0 '),\n+(275,'TG_hubSE',0,85,85,1,10,3000,7000,0,4,1806.63,-369.504,32.3876,6.02566,'273:0 276:0 277:0 '),\n+(276,'BalnirFarmstead',0,85,165,6,10,3000,7000,0,4,2029.54,-432.459,35.4011,5.30269,'273:0 275:0 277:0 '),\n+(277,'TG_hubC2',0,85,85,1,10,3000,7000,0,4,2029.86,-87.8105,35.5077,4.49765,'2:0 275:0 276:0 '),\n+(278,'BrillEntrance',0,85,159,1,10,3000,7000,0,4,2296.05,429.197,35.7333,5.74799,'2:0 279:0 285:0 297:0 '),\n+(279,'GarrensHauntGraves',0,85,85,4,10,3000,7000,0,4,2599.87,521.024,17.2769,5.97968,'2:0 278:0 280:0 281:0 '),\n+(280,'GarrensHaunt',0,85,164,6,10,3000,7000,0,4,2883.52,376.589,25.8553,5.87914,'279:0 281:0 284:0 '),\n+(281,'BrightwaterLake',0,85,85,1,10,3000,7000,0,4,2634.44,79.5244,31.089,6.13244,'2:0 279:0 280:0 282:0 284:0 '),\n+(282,'NorthCoastE',0,85,168,7,10,3000,7000,0,4,3032.54,-341.266,5.44748,2.52746,'281:0 283:0 '),\n+(283,'NorthCoastC',0,85,168,1,10,3000,7000,0,5,2935.15,41.7046,6.92148,4.82869,'282:0 284:0 '),\n+(284,'NorthCoastW',0,85,168,1,10,3000,7000,0,4,2984.21,388.32,7.96326,4.49688,'280:0 281:0 283:0 '),\n+(285,'ColdHearthManor',0,85,166,1,10,3000,7000,0,4,2107.98,617.879,35.0405,0.497239,'278:0 18:0 286:0 287:0 297:0 '),\n+(286,'TG_hubC1',0,85,85,1,10,3000,7000,0,0,2204.7,1063.28,28.6853,4.1572,'285:0 287:0 288:0 292:0 294:0 '),\n+(287,'CrusadersOutpost',0,85,85,1,10,3000,7000,0,0,1797.65,703.831,48.147,1.54771,'286:0 285:0 297:0 '),\n+(288,'TG_hubNE',0,85,85,1,10,3000,7000,0,4,2446.9,1082.07,58.5203,0.911539,'286:0 289:0 292:0 293:0 294:0 '),\n+(289,'AgamandMillsEntrance',0,85,157,4,10,3000,7000,0,4,2701.33,937.571,110.912,0.173269,'288:0 290:0 291:0 '),\n+(290,'AgamandMillsW',0,85,157,6,10,3000,7000,0,4,2889.98,1065.92,105.434,5.38438,'289:0 291:0 '),\n+(291,'AgamandMillsE',0,85,157,6,10,3000,7000,0,4,2973.71,619.932,93.8373,1.31013,'289:0 290:0 '),\n+(292,'SollidenFarmstead',0,85,156,1,10,3000,7000,0,4,2329.03,1407.79,33.3337,0.622907,'286:0 288:0 293:0 294:0 '),\n+(293,'CrusadersOutpost',0,85,85,1,10,3000,7000,0,4,2430.28,1585.02,37.0619,0.587566,'288:0 292:0 '),\n+(294,'UndeadStartExit',0,85,85,5,10,3000,7000,0,4,2197.51,1192.39,31.5497,5.11342,'288:0 286:0 292:0 295:0 '),\n+(295,'UndeadStartEnd',0,85,154,1,10,3000,7000,0,4,2061.91,1418.99,63.8379,5.30978,'294:0 83:0 4:0 296:0 '),\n+(296,'UndeadStartE',0,85,154,1,10,3000,7000,0,4,1805.3,1351.42,87.1354,0.232168,'295:0 4:0 '),\n+(297,'TH_exitS',0,85,85,7,12,3000,7000,0,4,1642.09,555.658,33.4922,2.88878,'278:0 285:0 287:0 298:0 '),\n+(298,'ShiningStrandN',0,130,927,8,14,3000,7000,0,4,1331.69,679.903,40.5373,1.02387,'297:0 200:0 '),\n+(299,'DeadField',0,130,240,8,20,3000,7000,0,4,1076.06,1545.35,28.6412,4.79771,'201:0 300:0 301:0 302:0 303:0 200:0 '),\n+(300,'SkitteringDark',0,130,226,8,20,3000,7000,0,4,1271.34,1974.49,17.8502,4.31862,'299:0 301:0 '),\n+(301,'NorthTidesHollow',0,130,305,8,20,3000,7000,0,4,833.25,1880.5,21.9868,5.06279,'299:0 300:0 '),\n+(302,'SPF_hubC1',0,130,130,8,20,3000,7000,0,4,867.729,1518.72,35.2045,0.160734,'201:0 299:0 303:0 304:0 '),\n+(303,'SPF_hubC2',0,130,130,8,20,3000,7000,0,4,934.532,1356.51,43.5579,3.0887,'201:0 299:0 302:0 200:0 305:0 '),\n+(304,'SPF_hubC3',0,130,130,8,20,3000,7000,0,4,736.764,1449.26,64.4284,0.457609,'302:0 305:0 306:0 '),\n+(305,'SPF_hubC4',0,130,130,8,20,3000,7000,0,4,587.903,1352.93,90.6192,0.359403,'303:0 304:0 306:0 17:0 313:0 '),\n+(306,'DecrepitFerry',0,130,237,13,20,3000,7000,0,4,664.305,1021.48,45.3265,5.10911,'304:0 305:0 307:0 '),\n+(307,'FenrisIsle',0,130,172,15,20,3000,7000,0,4,704.961,674.359,43.3624,1.57874,'306:0 308:0 311:0 '),\n+(308,'FenrisIsleSE',0,130,172,15,20,3000,7000,0,4,653.059,335.097,35.0481,1.33722,'307:0 309:0 '),\n+(309,'FenrisIsleE',0,130,232,16,20,3000,7000,0,4,866.03,78.8803,34.2361,2.23258,'308:0 310:0 '),\n+(310,'DawningIsles',0,130,232,17,22,3000,7000,0,4,1199.57,370.42,34.3257,3.13185,'309:0 '),\n+(311,'FenrisKeep',0,130,172,8,20,3000,7000,0,4,1013.6,734.689,59.2651,3.23986,'307:0 '),\n+(312,'DeepElemMineFork',0,130,213,8,20,3000,7000,0,4,271.231,1110.33,80.2136,5.99661,'313:0 314:0 317:0 318:0 '),\n+(313,'SPF_hubC5',0,130,130,8,20,3000,7000,0,4,385.877,1253.37,80.2878,0.320144,'305:0 312:0 315:0 '),\n+(314,'DeepElemMine',0,130,213,8,20,3000,7000,0,4,376.82,1082.54,106.396,3.03959,'312:0 '),\n+(315,'SPF_hubC6',0,130,130,8,20,3000,7000,0,4,194.263,1268.01,72.8331,6.23812,'313:0 316:0 317:0 318:0 '),\n+(316,'OlsensFarthing',0,130,229,8,20,3000,7000,0,4,171.155,1487.65,114.395,4.84404,'315:0 '),\n+(317,'SPF_DalaranCamp1',0,130,130,8,20,3000,7000,0,4,-50.4703,1331.43,60.9321,5.92005,'315:0 312:0 318:0 319:0 323:0 '),\n+(318,'SPF_hubS1',0,130,130,8,20,3000,7000,0,4,-132.172,1170.25,63.4384,0.508657,'315:0 317:0 312:0 319:0 323:0 326:0 '),\n+(319,'AmberhillEntrance',0,130,233,11,20,3000,7000,0,4,-131.822,896.74,65.831,1.54539,'317:0 318:0 320:0 321:0 323:0 325:0 '),\n+(320,'AmberhillHall',0,130,233,13,20,3000,7000,0,4,-141.972,812.61,63.737,1.09457,'319:0 '),\n+(321,'AmberhillFarms',0,130,233,15,20,3000,7000,0,4,88.1028,694.265,60.6053,2.4376,'322:0 319:0 '),\n+(322,'AmberhillMurlocCamp',0,130,130,15,20,3000,7000,0,4,434.265,696.251,33.7837,3.19747,'321:0 '),\n+(323,'SPF_hubS2',0,130,130,8,20,3000,7000,0,4,-330.828,1311.68,37.1012,1.70757,'317:0 318:0 319:0 324:0 326:0 327:0 '),\n+(324,'PyrewoodVillage',0,130,204,8,20,3000,7000,0,4,-383.772,1597.45,16.8392,4.90611,'323:0 '),\n+(325,'SPF_exitSE',0,130,130,15,20,3000,7000,0,4,-543.136,724.877,91.2236,0.975962,'319:0 326:0 357:0 '),\n+(326,'SPF_hubS3',0,130,130,8,20,3000,7000,0,4,-503.287,1113.31,76.93,0.514545,'318:0 323:0 325:0 '),\n+(327,'GreymaneWall',0,130,230,8,20,3000,7000,0,4,-744.895,1522.56,15.5245,5.84742,'323:0 '),\n+(328,'DandredsFold',0,36,1682,35,40,3000,7000,0,0,1235.47,-274.821,40.3856,4.48552,'329:0 '),\n+(329,'UplandsN',0,36,284,28,40,3000,7000,0,0,1085.27,-663.59,87.8456,1.24773,'328:0 330:0 '),\n+(330,'UplandsS',0,36,284,28,40,3000,7000,0,0,958.693,-748.597,114.797,4.04964,'329:0 331:0 335:0 '),\n+(331,'Strahnbard',0,36,280,28,40,3000,7000,0,0,683.909,-963.157,164.301,0.671641,'330:0 332:0 343:0 '),\n+(332,'AM_hubE1',0,36,36,28,40,3000,7000,0,0,615.654,-1043.7,168.11,0.331968,'331:0 333:0 381:0 '),\n+(333,'AM_hubE2',0,36,1684,36,42,3000,7000,0,0,641.277,-1429.39,84.6042,5.55291,'332:0 334:0 '),\n+(334,'ChillwindCampRoad',0,28,3197,48,56,3000,7000,0,0,966.365,-1511.29,75.4645,2.81971,'173:0 271:0 272:0 333:0 '),\n+(335,'SlaughterHollowNE',0,36,283,28,40,3000,7000,0,0,802.9,-628.854,149.733,3.01018,'330:0 336:0 337:0 '),\n+(336,'SlaughterHollowN',0,36,283,28,40,3000,7000,0,0,835.191,-445.445,134.228,4.48673,'335:0 '),\n+(337,'SlaughterHollowC',0,36,281,28,40,3000,7000,0,0,620.637,-522.586,179.928,5.73159,'335:0 338:0 343:0 '),\n+(338,'RuinsOfAlterac',0,36,281,28,40,3000,7000,0,0,631.058,-371.491,154.481,2.42898,'340:0 337:0 339:0 '),\n+(339,'RuinsOfAlteracSW',0,36,281,28,40,3000,7000,0,0,500.776,-173.116,151.449,5.19357,'340:0 338:0 341:0 '),\n+(340,'RuinsOfAlteracSE',0,36,281,28,40,3000,7000,0,0,397.344,-248.661,161.727,5.94755,'338:0 339:0 '),\n+(341,'RuinsOfAlteracE',0,36,281,28,40,3000,7000,0,0,573.088,-14.3215,142.366,3.66008,'339:0 342:0 '),\n+(342,'RuinsOfAlteracSSW',0,36,1683,28,40,3000,7000,0,0,252.323,-82.4394,141.544,0.263228,'341:0 344:0 '),\n+(343,'RuinsOfAlteracE',0,36,1357,28,40,3000,7000,0,0,493.629,-621.553,172.877,0.602885,'331:0 337:0 344:0 345:0 380:0 '),\n+(344,'RuinsOfAlteracS',0,36,1683,28,40,3000,7000,0,0,141.788,-316.452,150.648,1.12125,'342:0 343:0 346:0 '),\n+(345,'CorrahnsDagger',0,36,1679,28,40,3000,7000,0,0,-45.3608,-581.074,153.724,5.82187,'343:0 346:0 380:0 '),\n+(346,'CorrahnsDaggerFork',0,36,1679,28,40,3000,7000,0,0,57.1052,-405.389,132.108,2.70582,'344:0 345:0 347:0 385:0 '),\n+(347,'Headland',0,36,1680,28,40,3000,7000,0,0,-163.833,-293.019,151.411,0.123425,'346:0 348:0 '),\n+(348,'GavinsNaze',0,36,1677,28,40,3000,7000,0,0,-63.0062,-197.056,131.24,2.72704,'347:0 349:0 350:0 355:0 '),\n+(349,'GavinsNazeTop',0,36,1677,28,40,3000,7000,0,0,-125.184,-59.9939,147.694,5.63693,'348:0 350:0 '),\n+(350,'GavinsNazeW',0,36,279,28,40,3000,7000,0,0,68.1015,-53.44,99.6287,3.99152,'348:0 349:0 351:0 352:0 353:0 '),\n+(351,'DalaranCraterN',0,36,279,28,40,3000,7000,0,4,466.751,167.322,41.9053,3.38088,'350:0 352:0 '),\n+(352,'DalaranCraterS',0,36,279,28,40,3000,7000,0,4,90.2654,237.935,43.2902,5.2894,'351:0 350:0 353:0 354:0 '),\n+(353,'LordamereInternmentCamp',0,36,278,28,40,3000,7000,0,4,-90.5356,218.366,53.2755,6.11997,'352:0 350:0 354:0 '),\n+(354,'HillsbradFieldsC',0,267,286,18,30,3000,7000,0,4,-499.681,78.0454,56.6165,0.278575,'352:0 353:0 356:0 355:0 '),\n+(355,'HillsbradFieldsE',0,267,286,18,30,3000,7000,0,0,-437.039,-135.243,56.2029,2.13409,'354:0 356:0 348:0 385:0 '),\n+(356,'HillsbradFieldsSRoad',0,267,267,18,30,3000,7000,0,0,-639.845,-98.2014,47.262,0.172558,'20:0 358:0 360:0 354:0 355:0 361:0 385:0 357:0 '),\n+(357,'SouthPointTower',0,267,285,18,30,3000,7000,0,5,-613.976,388.915,83.0604,2.91123,'325:0 356:0 358:0 '),\n+(358,'WesternStrandW',0,267,295,18,30,3000,7000,0,0,-979.029,273.179,7.90667,5.62479,'356:0 359:0 357:0 '),\n+(359,'WesternStrandSW',0,267,295,18,30,3000,7000,0,0,-1128.84,276.704,0.0000662804,5.89576,'358:0 360:0 '),\n+(360,'WesternStrandS',0,267,295,18,30,3000,7000,0,0,-1156.55,7.61478,0.00000548363,6.16081,'359:0 356:0 361:0 '),\n+(361,'WesternStrandS',0,267,295,18,30,3000,7000,0,0,-1102.38,-114.03,0.0000309944,0.148599,'362:0 360:0 356:0 '),\n+(362,'WesternStrandE',0,267,271,18,30,3000,7000,0,0,-962.262,-506.545,2.13023,1.90396,'361:0 363:0 20:0 '),\n+(363,'SouthshoreS',0,267,271,18,30,3000,7000,0,0,-974.276,-592.998,0.229758,0.372044,'362:0 364:0 20:0 '),\n+(364,'EasternStrandW',0,267,294,18,30,3000,7000,0,0,-1012.85,-790.213,9.01406,5.30042,'363:0 365:0 368:0 376:0 '),\n+(365,'EasternStrandC',0,267,294,18,30,3000,7000,0,0,-1183.14,-847.579,1.43171,6.18988,'364:0 366:0 '),\n+(366,'EasternStrandS',0,267,294,18,30,3000,7000,0,0,-1311.64,-1052.47,18.2271,0.929683,'365:0 367:0 368:0 '),\n+(367,'DunGarok',0,267,290,18,30,3000,7000,0,4,-1256.01,-1190.37,38.9786,2.03514,'366:0 368:0 376:0 '),\n+(368,'DunGarokRoad',0,267,267,18,30,3000,7000,0,0,-1049.49,-1239.84,53.3175,1.75045,'364:0 366:0 367:0 369:0 373:0 '),\n+(369,'HillsbradFoothillsExitSE',0,267,267,18,30,3000,7000,0,0,-784.955,-1512.45,56.6724,1.97822,'370:0 368:0 373:0 410:0 '),\n+(370,'HillsbradFoothillsExitE',0,267,275,18,30,3000,7000,0,0,-594.279,-1721.03,62.3187,2.25507,'369:0 371:0 411:0 '),\n+(371,'DurnholdeNE',0,267,275,18,30,3000,7000,0,0,-383.173,-1720.01,90.0634,3.41784,'372:0 370:0 '),\n+(372,'DurnholdeNNE',0,267,275,18,30,3000,7000,0,0,-316.76,-1609.34,86.0559,5.49914,'371:0 377:0 386:0 '),\n+(373,'DurnholdeS',0,267,267,18,30,3000,7000,0,0,-669.891,-1326.66,66.6887,5.65621,'376:0 374:0 368:0 369:0 383:0 '),\n+(374,'DurnholdeInside',0,267,275,18,30,3000,7000,0,0,-518.661,-1435.16,64.889,2.5637,'373:0 375:0 '),\n+(375,'DurnholdeInsideDeep',0,267,275,18,30,3000,7000,0,0,-512.473,-1541.62,67.1947,1.69387,'374:0 '),\n+(376,'NethanderStead',0,267,289,18,30,3000,7000,0,0,-915.831,-926.49,31.1754,1.19711,'364:0 367:0 373:0 383:0 20:0 '),\n+(377,'DurnholdeN',0,267,275,18,30,3000,7000,0,0,-298.033,-1310.71,76.9034,4.69017,'372:0 378:0 383:0 '),\n+(378,'DurnholdeNN',0,267,267,18,30,3000,7000,0,0,-37.1467,-1296.59,83.7166,3.13705,'377:0 21:0 '),\n+(379,'TarrenMillN',0,267,267,18,30,3000,7000,0,4,188.047,-974.547,75.5356,0.0209713,'21:0 381:0 '),\n+(380,'GallowsCorner',0,36,1357,28,40,3000,7000,0,0,324.254,-615.115,145.246,3.03887,'343:0 345:0 21:0 382:0 '),\n+(381,'SoferasCorner',0,36,36,28,40,3000,7000,0,0,461.934,-926.633,129.374,2.72668,'379:0 332:0 382:0 '),\n+(382,'SoferasNaze',0,36,1678,28,40,3000,7000,0,0,248.314,-839.928,146.333,0.818164,'381:0 380:0 '),\n+(383,'HFH_bridge',0,267,267,18,30,3000,7000,0,0,-487.607,-967.55,34.4918,4.54488,'377:0 376:0 373:0 384:0 '),\n+(384,'DarrowHillE',0,267,267,18,30,3000,7000,0,0,-323.998,-672.57,54.6417,3.9048,'21:0 383:0 385:0 20:0 '),\n+(385,'DarrowHillW',0,267,1056,18,30,3000,7000,0,0,-332.483,-447.42,58.4647,0.297842,'346:0 355:0 356:0 384:0 20:0 '),\n+(386,'HinterlandsEntrance',0,47,47,38,50,3000,7000,0,0,-77.4076,-1845.63,143.116,2.46164,'372:0 55:0 '),\n+(387,'ZunWatha',0,47,352,38,50,3000,7000,0,0,-11.9998,-2493.37,119.659,1.99629,'55:0 82:0 388:0 391:0 '),\n+(388,'QuelDanilS',0,47,47,38,50,3000,7000,0,0,65.3995,-2664.2,111.823,5.20269,'55:0 82:0 387:0 389:0 390:0 391:0 392:0 '),\n+(389,'QuelDanil',0,47,350,38,50,3000,7000,0,4,210.196,-2789.46,122.156,1.50935,'388:0 390:0 392:0 '),\n+(390,'HL_hubW',0,47,47,38,50,3000,7000,0,0,132.208,-2876.17,116.583,1.69588,'388:0 389:0 392:0 393:0 397:0 398:0 '),\n+(391,'BogensLedge',0,47,1887,38,50,3000,7000,0,0,-198.398,-2585.67,120.378,6.18051,'387:0 388:0 393:0 '),\n+(392,'HiriWatha',0,47,1885,38,50,3000,7000,0,0,-35.4616,-2815.33,122.143,0.435323,'389:0 390:0 388:0 393:0 '),\n+(393,'ShadraAlorEntrance',0,47,47,38,50,3000,7000,0,0,-160.179,-2955.33,115.773,1.96371,'391:0 392:0 390:0 395:0 394:0 396:0 398:0 400:0 '),\n+(394,'ShadraAlorE',0,47,353,38,50,3000,7000,0,0,-366.126,-2955.41,89.39,6.27554,'393:0 395:0 396:0 '),\n+(395,'ShadraAlorS',0,47,353,38,50,3000,7000,0,0,-455.461,-2839.4,105.834,6.08704,'393:0 394:0 396:0 '),\n+(396,'ShadraAlorW',0,47,353,38,50,3000,7000,0,0,-296.621,-2833,96.7074,5.15045,'393:0 395:0 394:0 '),\n+(397,'AgolWatha',0,47,1884,38,50,3000,7000,0,0,397.177,-3352.2,123.451,2.24644,'390:0 398:0 399:0 '),\n+(398,'CreepingRun',0,47,1886,38,50,3000,7000,0,0,116.576,-3466.05,107.658,1.12922,'393:0 397:0 390:0 399:0 400:0 401:0 '),\n+(399,'SkulkRock',0,47,351,38,50,3000,7000,0,0,363.014,-3796.73,171.76,1.54745,'397:0 398:0 401:0 404:0 '),\n+(400,'AltarOfZul',0,47,355,38,50,3000,7000,0,0,-147.861,-3319.03,121.957,3.93113,'393:0 398:0 '),\n+(401,'HL_hubC',0,47,47,38,50,3000,7000,0,0,109.926,-3922.75,136.697,0.948588,'398:0 399:0 402:0 403:0 404:0 '),\n+(402,'JinthaAlor',0,47,354,38,50,3000,7000,0,0,-217.196,-4159.98,118.665,0.453769,'401:0 403:0 '),\n+(403,'OverlookCliffsS',0,47,307,38,50,3000,7000,0,0,-150.233,-4250.21,120.905,4.17653,'401:0 402:0 405:0 '),\n+(404,'SeradaneBridge',0,47,351,38,50,3000,7000,0,0,472.513,-3907.18,113.731,5.88677,'399:0 401:0 409:0 '),\n+(405,'OverlookCliffsRampTop',0,47,307,38,50,3000,7000,0,0,-243.665,-4377.48,105.997,0.98978,'403:0 406:0 '),\n+(406,'OverlookCliffsRampBottom',0,47,307,38,50,3000,7000,0,0,-3.15739,-4629.26,13.899,2.27391,'405:0 407:0 408:0 '),\n+(407,'RevantuskOutside',0,47,307,38,50,3000,7000,0,0,-355.789,-4475.87,11.3783,0.924997,'406:0 179:0 '),\n+(408,'OverlookCliffsEnd',0,47,307,38,50,3000,7000,0,0,133.371,-4745.73,2.05405,2.27392,'406:0 '),\n+(409,'Seradane',0,47,356,60,80,3000,7000,0,0,755.958,-4011.61,92.8808,5.95432,'404:0 '),\n+(410,'ArathiExitNW',0,45,334,28,40,3000,7000,0,0,-889.426,-1677.32,57.6111,1.06053,'369:0 411:0 412:0 414:0 '),\n+(411,'ArathiExitN',0,45,45,28,40,3000,7000,0,0,-684.458,-1831.3,53.3946,0.936824,'370:0 410:0 412:0 413:0 '),\n+(412,'ArathiCW',0,45,45,28,40,3000,7000,0,0,-863.176,-1785.9,39.6302,5.66886,'410:0 411:0 413:0 414:0 '),\n+(413,'NorthfoldManor',0,45,313,28,40,3000,7000,0,0,-822.895,-2039.83,34.4558,1.25884,'411:0 412:0 415:0 '),\n+(414,'Arathi_hubW',0,45,45,28,40,3000,7000,0,0,-1190.48,-1731.63,56.3674,6.26181,'410:0 412:0 415:0 420:0 '),\n+(415,'NorthfoldManor',0,45,313,28,40,3000,7000,0,0,-933.512,-2120.29,56.5869,2.05011,'78:0 413:0 414:0 416:0 '),\n+(416,'RefugePointeExitN',0,45,315,28,40,3000,7000,0,0,-1158.07,-2706.9,52.0215,2.18796,'78:0 22:0 415:0 417:0 418:0 419:0 435:0 '),\n+(417,'DabyrieFarmstead',0,45,45,28,40,3000,7000,0,0,-1091.19,-2856.55,42.4006,1.78073,'416:0 418:0 435:0 436:0 '),\n+(418,'ArathiCO',0,45,336,28,40,3000,7000,0,0,-1352.09,-2738.95,59.0948,6.08275,'416:0 417:0 419:0 431:0 432:0 435:0 '),\n+(419,'RefugePointeExitS',0,45,45,28,40,3000,7000,0,1,-1466.43,-2424.6,57.8277,5.98262,'22:0 78:0 416:0 418:0 420:0 427:0 429:0 431:0 '),\n+(420,'StromgardeRoad',0,45,45,28,40,3000,7000,0,0,-1323.01,-1833.39,63.6564,0.712589,'421:0 414:0 419:0 427:0 '),\n+(421,'StromgardeInside',0,45,324,28,40,3000,7000,0,0,-1576.29,-1800.48,67.6512,3.46934,'422:0 423:0 424:0 420:0 '),\n+(422,'StromgardeKeep',0,45,324,28,40,3000,7000,0,0,-1660.06,-1803.63,83.0724,6.27321,'421:0 426:0 '),\n+(423,'StromgardeE',0,45,324,28,40,3000,7000,0,0,-1602.44,-1922.26,67.2707,1.50115,'421:0 '),\n+(424,'StromgardeW1',0,45,324,28,40,3000,7000,0,0,-1596.2,-1745.56,67.3627,5.09826,'421:0 425:0 '),\n+(425,'StromgardeW2',0,45,324,28,40,3000,7000,0,0,-1720.34,-1736.69,52.4064,6.26851,'424:0 81:0 '),\n+(426,'StromgardeKeepSide',0,45,324,28,40,3000,7000,0,0,-1681.32,-1933.25,80.6272,1.35821,'422:0 '),\n+(427,'ArathiCI',0,45,335,28,40,3000,7000,0,0,-1517.62,-2100.44,22.3405,4.92548,'419:0 420:0 428:0 '),\n+(428,'ThandolRoadN',0,45,45,28,40,3000,7000,0,0,-1995.23,-2466.74,78.7992,0.837489,'427:0 429:0 441:0 '),\n+(429,'ArathiRoadSmid',0,45,45,28,40,3000,7000,0,0,-1763.42,-2422.8,59.5627,0.9015,'419:0 428:0 431:0 430:0 '),\n+(430,'BoulderfistHall',0,45,316,28,40,3000,7000,0,0,-1941.13,-2794.22,85.7724,0.38314,'429:0 431:0 432:0 '),\n+(431,'Arathi_hubE1',0,45,45,28,40,3000,7000,0,0,-1570.23,-2675.51,35.6533,6.03014,'419:0 418:0 429:0 432:0 435:0 430:0 '),\n+(432,'Arathi_hubE2',0,45,317,28,40,3000,7000,0,0,-1705.19,-3021.39,31.689,0.310091,'433:0 418:0 431:0 434:0 430:0 '),\n+(433,'WitherbarkVillage',0,45,317,28,40,3000,7000,0,0,-1867.12,-3365.42,56.1179,1.07782,'432:0 '),\n+(434,'GoshekFarm',0,45,314,28,40,3000,7000,0,0,-1526.14,-3075.57,14.1487,2.82925,'432:0 435:0 '),\n+(435,'Arathi_hubNE1',0,45,45,28,40,3000,7000,0,0,-1297.32,-3141.76,34.9289,1.25489,'416:0 417:0 418:0 431:0 434:0 436:0 438:0 '),\n+(436,'Arathi_hubNE2',0,45,45,28,40,3000,7000,0,0,-1005.91,-3313.55,55.2766,2.32737,'435:0 417:0 437:0 438:0 '),\n+(437,'ArathiCE',0,45,333,28,40,3000,7000,0,0,-839.717,-3280.93,78.5616,3.98495,'436:0 438:0 '),\n+(438,'HammerfallEntrance',0,45,321,28,40,3000,7000,0,0,-1164.53,-3558.81,50.1497,1.47167,'435:0 436:0 437:0 23:0 439:0 '),\n+(439,'DrywhiskerGorgeOutside',0,45,318,28,40,3000,7000,0,0,-1086,-3696.31,81.3913,2.10981,'438:0 440:0 '),\n+(440,'DrywhiskerGorgeEntrance',0,45,318,28,40,3000,7000,0,0,-1083.95,-3820.83,128.504,1.71515,'439:0 44:0 '),\n+(441,'ArathiRoadSbottom',0,45,880,28,40,3000,7000,0,0,-2248.64,-2487.38,80.1236,4.70713,'428:0 442:0 443:0 '),\n+(442,'ThandolSpanCamp',0,45,45,28,40,3000,7000,0,0,-2249.4,-2633.38,78.816,1.44851,'441:0 '),\n+(443,'ThandolSpanS',0,11,881,18,30,3000,7000,0,0,-2478.16,-2506.16,78.5672,0.110205,'441:0 444:0 '),\n+(444,'DunModrCamp',0,11,881,18,30,3000,7000,0,0,-2609.79,-2494.69,80.9667,1.57693,'443:0 6:0 445:0 '),\n+(445,'Wetlands_hubN1',0,11,11,18,30,3000,7000,0,0,-2937.95,-2470.57,26.6988,6.13028,'444:0 446:0 447:0 461:0 462:0 '),\n+(446,'DaggerforgeHill',0,11,1016,18,30,3000,7000,0,0,-2859.63,-2907.96,33.1564,1.54551,'445:0 448:0 449:0 '),\n+(447,'WL_hubC1',0,11,11,18,30,3000,7000,0,0,-3206.06,-2452.65,10.0327,5.76822,'445:0 448:0 455:0 461:0 462:0 '),\n+(448,'Greenwarden',0,11,1025,18,30,3000,7000,0,0,-3254.89,-2726.4,9.41813,1.21683,'446:0 447:0 449:0 455:0 458:0 '),\n+(449,'WL_hubE1',0,11,11,18,30,3000,7000,0,0,-3421.46,-3088.4,22.5006,4.5862,'446:0 448:0 450:0 451:0 455:0 456:0 '),\n+(450,'RaptorRidge',0,11,1017,23,30,3000,7000,0,0,-3132.51,-3240.98,63.5747,2.76015,'449:0 451:0 '),\n+(451,'DragonmawGates',0,11,1038,61,70,3000,7000,0,0,-3452,-3659.86,58.5533,1.08333,'449:0 450:0 452:0 '),\n+(452,'DragonmawGatesI1',0,11,1038,61,70,3000,7000,0,0,-3594.66,-4056.85,113.625,1.23963,'451:0 453:0 '),\n+(453,'DragonmawGatesI2',0,11,1038,61,70,3000,7000,0,0,-3956.61,-4019.52,170.857,6.00896,'452:0 454:0 '),\n+(454,'DragonmawGatesI3',0,11,1037,61,70,3000,7000,0,0,-4145.01,-3662.88,204.651,5.17056,'92:0 453:0 '),\n+(455,'WL_hubS1',0,11,1020,18,30,3000,7000,0,0,-3777.35,-2817.99,12.647,0.508038,'447:0 448:0 449:0 456:0 457:0 '),\n+(456,'MosshideFen',0,11,1020,18,30,3000,7000,0,0,-3913.48,-3043.47,11.7092,0.398469,'449:0 455:0 457:0 '),\n+(457,'ThelgenRock',0,11,1021,18,30,3000,7000,0,0,-3921.58,-2647.27,36.3203,4.94005,'455:0 456:0 479:0 '),\n+(458,'AngerfangEnampmentE',0,11,1036,18,30,3000,7000,0,0,-3503.17,-2440.43,48.2306,5.48001,'448:0 459:0 '),\n+(459,'AngerfangEnampmentW',0,11,1036,18,30,3000,7000,0,0,-3354.34,-2190.82,45.3521,1.88565,'458:0 460:0 461:0 '),\n+(460,'AngerfangEnampmentTop',0,11,1036,18,30,3000,7000,0,0,-3458.4,-2008.76,119.804,5.31784,'459:0 '),\n+(461,'WL_hubW1',0,11,11,18,30,3000,7000,0,0,-3186.98,-2117.49,15.8054,4.81126,'445:0 447:0 459:0 462:0 463:0 467:0 '),\n+(462,'IronbeardsTomb',0,11,309,18,30,3000,7000,0,0,-2861.94,-2217.72,29.2628,4.06121,'445:0 447:0 461:0 463:0 464:0 '),\n+(463,'MosshideWest',0,11,11,18,30,3000,7000,0,0,-2916.55,-1848.65,10.201,4.36986,'461:0 462:0 464:0 465:0 466:0 467:0 '),\n+(464,'BaradinBayN',0,11,1023,18,30,3000,7000,0,5,-2598.33,-1745.42,10.159,4.05766,'462:0 463:0 465:0 466:0 '),\n+(465,'BaradinBayNW',0,11,298,18,30,3000,7000,0,0,-2723.52,-1348.51,9.75282,4.1578,'464:0 463:0 466:0 474:0 '),\n+(466,'BaradinBayW',0,11,1022,18,30,3000,7000,0,0,-2951.24,-1112.1,9.14625,2.36904,'464:0 463:0 465:0 474:0 475:0 476:0 '),\n+(467,'WhelgarsOutside',0,11,1024,18,30,3000,7000,0,0,-3208.01,-1693.31,8.6748,4.04314,'461:0 463:0 468:0 473:0 474:0 '),\n+(468,'WhelgarsEntrance',0,11,118,18,30,3000,7000,0,0,-3328.04,-1856.79,25.9266,3.14189,'467:0 469:0 470:0 '),\n+(469,'WhelgarsBottom',0,11,118,18,30,3000,7000,0,0,-3540.59,-1803.75,24.3572,5.93869,'468:0 '),\n+(470,'WhelgarsRamp',0,11,118,18,30,3000,7000,0,0,-3370.49,-1931.82,63.5201,0.805329,'468:0 471:0 '),\n+(471,'WhelgarsRampTop',0,11,118,18,30,3000,7000,0,0,-3471.16,-1925.52,113.829,3.80162,'470:0 472:0 '),\n+(472,'WhelgarsCave',0,11,118,18,30,3000,7000,0,0,-3569.75,-1976.96,117.678,0.449137,'471:0 '),\n+(473,'BlueChannelMarsh',0,11,1018,18,30,3000,7000,0,0,-3582.96,-1324.33,9.39017,5.56012,'467:0 474:0 476:0 '),\n+(474,'BluegillMarsh',0,11,1022,18,30,3000,7000,0,0,-3135.95,-1301.23,7.27194,1.32132,'465:0 466:0 467:0 473:0 475:0 476:0 '),\n+(475,'BaradinBayS',0,11,298,18,30,3000,7000,0,0,-3202.27,-925.946,8.88303,5.67636,'466:0 474:0 476:0 '),\n+(476,'MenethilHarborRoad',0,11,1022,18,30,3000,7000,0,2,-3333.27,-1053.79,8.28482,2.51317,'11:0 466:0 473:0 474:0 475:0 '),\n+(477,'MenethilBayS',0,11,298,18,30,3000,7000,0,2,-3909.27,-638.054,4.91793,5.35238,'11:0 '),\n+(478,'MenethilBayN',0,11,298,18,30,3000,7000,0,2,-3732.25,-581.622,4.65228,4.77512,'11:0 '),\n+(479,'DunAlgazBottom',0,11,836,18,30,3000,7000,0,0,-4086.88,-2624.69,43.3702,1.60133,'457:0 480:0 '),\n+(480,'DunAlgazMid1',0,11,836,18,30,3000,7000,0,0,-4092.37,-2403.53,100.01,4.74881,'479:0 481:0 '),\n+(481,'DunAlgazMid2',0,11,836,18,30,3000,7000,0,0,-3994.82,-2377.44,120.415,3.60017,'480:0 482:0 '),\n+(482,'DunAlgazMid3',0,11,836,18,30,3000,7000,0,0,-4070,-2464.84,155.161,3.20551,'481:0 483:0 '),\n+(483,'DunAlgazMid4',0,11,836,18,30,3000,7000,0,0,-4418.61,-2470.44,212.203,0.00303268,'482:0 5:0 484:0 '),\n+(484,'DunAlgazMid5',0,11,836,18,30,3000,7000,0,0,-4453.35,-2691.02,268.159,1.48548,'483:0 485:0 '),\n+(485,'DunAlgazTop',0,38,837,8,20,3000,7000,0,0,-4741.84,-2699.03,325.269,6.26389,'484:0 91:0 487:0 488:0 '),\n+(486,'NorthGatePassBottom',0,38,838,8,20,3000,7000,0,2,-4797.55,-2537.41,354.11,2.07534,'91:0 524:0 '),\n+(487,'SilverStreamMine',0,38,149,8,20,3000,7000,0,2,-4801.44,-2968.22,321.735,1.63004,'91:0 485:0 488:0 '),\n+(488,'StonewroughDamW',0,38,146,8,20,3000,7000,0,2,-4676.63,-3184.73,310.249,2.0836,'487:0 485:0 489:0 '),\n+(489,'StonewroughDamC',0,38,146,8,20,3000,7000,0,2,-4761.78,-3306.52,310.258,4.81285,'488:0 490:0 '),\n+(490,'StonewroughDamE',0,38,146,8,20,3000,7000,0,2,-4680.9,-3464.1,310.208,3.57506,'489:0 491:0 '),\n+(491,'TheLochNE',0,38,38,8,20,3000,7000,0,2,-4859.79,-3631.09,306.481,2.35809,'490:0 492:0 495:0 496:0 497:0 '),\n+(492,'MogroshStronghold',0,38,143,8,20,3000,7000,0,2,-4884.91,-3956.61,298.791,3.26837,'491:0 493:0 494:0 495:0 '),\n+(493,'MogroshStrongholdTop',0,38,143,8,20,3000,7000,0,2,-4853.52,-4046.55,315.354,1.54756,'492:0 '),\n+(494,'LochModanE',0,38,38,8,20,3000,7000,0,2,-5200.93,-4080.99,324.555,1.53421,'492:0 495:0 512:0 '),\n+(495,'LochModanC2',0,38,38,8,20,3000,7000,0,2,-5358.15,-3755.11,304.073,5.92655,'491:0 492:0 494:0 496:0 506:0 512:0 '),\n+(496,'LochIsleE',0,38,38,8,20,3000,7000,0,2,-4983.21,-3478.31,305.5,4.76612,'491:0 495:0 497:0 498:0 '),\n+(497,'LochIsleW',0,38,38,8,20,3000,7000,0,2,-4869.1,-3302.75,307.516,3.90807,'491:0 496:0 498:0 '),\n+(498,'LochIsleS',0,38,38,8,20,3000,7000,0,2,-5031.68,-3316.94,298.701,5.51616,'497:0 496:0 499:0 '),\n+(499,'LochC1',0,38,556,8,20,3000,7000,0,2,-5138.3,-3125.08,302.046,2.10361,'498:0 502:0 '),\n+(500,'LochW1',0,38,38,8,20,3000,7000,0,2,-5067.56,-2665.82,323.188,6.27801,'91:0 501:0 502:0 '),\n+(501,'LochW2',0,38,38,8,20,3000,7000,0,2,-5383.73,-2741.02,362.182,0.255963,'500:0 502:0 503:0 '),\n+(502,'LochW3',0,38,38,8,20,3000,7000,0,0,-5215.01,-2861.61,336.947,0.715418,'91:0 499:0 500:0 501:0 503:0 '),\n+(503,'ThelsamarEntrance',0,38,38,8,20,3000,7000,0,0,-5405.86,-2884.97,342.8,0.491581,'501:0 502:0 19:0 504:0 515:0 '),\n+(504,'LochC3',0,38,144,8,20,3000,7000,0,0,-5441.5,-3109.22,349.359,0.721317,'503:0 19:0 505:0 '),\n+(505,'LochS',0,38,38,8,20,3000,7000,0,1,-5860.82,-3292.84,292.88,5.93047,'504:0 506:0 621:0 '),\n+(506,'IronbandsExcavationOutside',0,38,142,8,20,3000,7000,0,2,-5617.55,-3680.57,313.913,2.11697,'495:0 505:0 507:0 509:0 '),\n+(507,'IronbandsExcavationSW',0,38,142,8,20,3000,7000,0,2,-5787.94,-3777.91,328.169,4.57725,'506:0 508:0 510:0 '),\n+(508,'IronbandsExcavationInside1',0,38,142,8,20,3000,7000,0,2,-5722.82,-3946.06,324.917,2.02667,'507:0 509:0 '),\n+(509,'IronbandsExcavationInside2',0,38,142,8,20,3000,7000,0,2,-5578.49,-3926.28,327.498,1.64379,'506:0 508:0 '),\n+(510,'LochCornerSE',0,38,147,8,20,3000,7000,0,2,-5843.55,-4145.23,387.605,1.3532,'507:0 511:0 512:0 '),\n+(511,'FastriderLodgeEntrance',0,38,147,8,20,3000,7000,0,2,-5555.41,-4251.75,380.644,2.87687,'510:0 512:0 513:0 '),\n+(512,'LochModanSE',0,38,147,8,20,3000,7000,0,2,-5553.71,-4104.44,372.683,1.01823,'494:0 495:0 510:0 511:0 '),\n+(513,'FarstriderLodge',0,38,147,8,20,3000,7000,0,2,-5621.61,-4334.97,403.763,0.951478,'511:0 514:0 '),\n+(514,'FarstriderLodgeInside',0,38,147,8,20,3000,7000,0,3,-5674.26,-4247.48,407.006,5.29276,'513:0 '),\n+(515,'LochModanSW1',0,38,38,8,20,3000,7000,0,2,-5673.4,-2775.82,363.022,5.89359,'503:0 516:0 519:0 '),\n+(516,'StonesplinterValley1',0,38,923,8,20,3000,7000,0,2,-5878.01,-2909.13,366.788,0.558766,'515:0 517:0 518:0 '),\n+(517,'StonesplinterValley2',0,38,923,8,20,3000,7000,0,2,-6057.08,-3024.86,403.365,0.541086,'516:0 '),\n+(518,'StonesplinterValley3',0,38,923,8,20,3000,7000,0,2,-6077.12,-2770.04,413.566,5.71294,'516:0 '),\n+(519,'LochModanSW2',0,38,924,8,20,3000,7000,0,2,-5804.6,-2605.8,316.201,6.15474,'515:0 520:0 521:0 '),\n+(520,'LochModanSW3',0,38,924,8,20,3000,7000,0,2,-6029.33,-2496.11,310.016,2.1924,'519:0 561:0 '),\n+(521,'SouthGatePassBottom',0,38,839,8,20,3000,7000,0,2,-5690.63,-2589.07,346.087,0.415367,'519:0 522:0 '),\n+(522,'SouthGateOutpost',0,1,806,1,10,3000,7000,0,0,-5520.09,-2399.78,400.417,2.27487,'521:0 523:0 '),\n+(523,'SouthGatePassTop',0,1,805,1,10,3000,7000,0,2,-5636.7,-2242.95,424.761,5.34381,'522:0 527:0 69:0 '),\n+(524,'NorthGatePassTop1',0,1,808,1,10,3000,7000,0,2,-4911.88,-2330.69,408.794,5.22601,'486:0 525:0 '),\n+(525,'NorthGatePassBottom2',0,1,808,1,10,3000,7000,0,2,-5204.26,-2288.4,400.984,2.97781,'524:0 526:0 '),\n+(526,'NorthGatePassTop2',0,1,807,1,10,3000,7000,0,2,-5294.53,-2180,423.003,2.8011,'525:0 527:0 '),\n+(527,'DunMoroghPassFork',0,1,1,1,10,3000,7000,0,2,-5515.28,-2008.17,399.376,4.60752,'526:0 523:0 528:0 '),\n+(528,'DunMoroghE1',0,1,1,1,10,3000,7000,0,2,-5509.11,-1798.18,397.338,5.99176,'527:0 69:0 529:0 '),\n+(529,'GolBolarFork',0,1,1,1,10,3000,7000,0,2,-5611.84,-1487.57,399.057,5.05517,'528:0 530:0 533:0 '),\n+(530,'GolBolarCamp',0,1,134,1,10,3000,7000,0,2,-5711.36,-1562.28,383.568,2.84075,'529:0 531:0 '),\n+(531,'GolBolarQuarry1',0,1,134,1,10,3000,7000,0,2,-5849.25,-1514.03,358.812,5.96152,'530:0 532:0 '),\n+(532,'GolBolarQuarry2',0,1,134,1,10,3000,7000,0,2,-5737.17,-1683.52,362.196,6.04595,'531:0 '),\n+(533,'TundridHills',0,1,804,1,10,3000,7000,0,2,-5651.13,-1033.73,410.816,4.75985,'529:0 534:0 536:0 556:0 '),\n+(534,'Vagash1',0,1,1,1,10,3000,7000,0,2,-5422.73,-1195.14,450.063,2.06791,'533:0 535:0 '),\n+(535,'Vagash2',0,1,803,1,10,3000,7000,0,2,-5417.7,-1264.17,446.78,2.22146,'534:0 '),\n+(536,'DunMoroghS1',0,1,1,1,10,3000,7000,0,2,-5892.71,-628.276,400.121,5.26175,'533:0 537:0 '),\n+(537,'DwarfGnomeStartExit1',0,1,1,1,10,3000,7000,0,2,-5975.18,-476.82,406.774,5.36188,'536:0 9:0 538:0 '),\n+(538,'DwarfGnomeStartExit2',0,1,1,1,10,3000,7000,0,2,-6013.25,-224.693,412.196,4.79638,'537:0 539:0 '),\n+(539,'DwarfGnomeStartExit3',0,1,800,1,10,3000,7000,0,2,-5890.34,69.4737,372.157,4.07706,'538:0 540:0 545:0 546:0 '),\n+(540,'ColdridgePass1',0,1,800,1,10,3000,7000,0,2,-6066.08,42.2314,408.342,0.120498,'539:0 541:0 '),\n+(541,'ColdridgePass2',0,1,800,4,10,3000,7000,0,2,-6231.65,125.6,430.753,5.63871,'540:0 542:0 '),\n+(542,'DwarfGnomeStart1',0,1,132,1,10,3000,7000,0,3,-6261.08,369.552,383.537,4.94484,'541:0 1:0 543:0 544:0 '),\n+(543,'DwarfGnomeStart2',0,1,132,1,10,3000,7000,0,2,-6482.65,496.244,386.328,5.80485,'542:0 544:0 '),\n+(544,'DwarfGnomeStart3',0,1,132,1,10,3000,7000,0,2,-6269.69,741.137,386.893,4.77403,'542:0 543:0 '),\n+(545,'GrizzledDen',0,1,136,1,10,3000,7000,0,2,-5690.95,-281.229,364.314,5.54297,'539:0 9:0 '),\n+(546,'DunMoroghSW1',0,1,1,1,10,3000,7000,0,2,-5756.39,127.948,368.817,4.07511,'539:0 547:0 548:0 '),\n+(547,'OldIcebeard',0,1,801,1,10,3000,7000,0,2,-5602.44,-28.5472,416.22,2.31387,'546:0 '),\n+(548,'DunMoroghW1',0,1,135,1,10,3000,7000,0,2,-5661.62,365.277,393.274,4.27146,'546:0 549:0 550:0 551:0 '),\n+(549,'FrostmaneHold',0,1,135,1,10,3000,7000,0,2,-5549.4,568.067,394.761,1.30462,'548:0 551:0 '),\n+(550,'GnomereganS',0,1,133,1,10,3000,7000,0,2,-5183.81,585.068,404.291,4.35,'548:0 551:0 '),\n+(551,'IceflowLake',0,1,211,1,10,3000,7000,0,2,-5250.86,115.774,394.041,2.85773,'548:0 549:0 550:0 552:0 555:0 '),\n+(552,'ShimmerRidge1',0,1,802,1,10,3000,7000,0,2,-5266.4,-149.752,437.903,6.01894,'551:0 553:0 '),\n+(553,'ShimmerRidge2',0,1,802,1,10,3000,7000,0,2,-5088.11,-166.104,442.035,0.727311,'552:0 554:0 555:0 '),\n+(554,'ShimmerRidge3',0,1,802,1,10,3000,7000,0,2,-5043,-267.85,441.4,2.19994,'553:0 '),\n+(555,'ShimmerRidge4',0,1,802,1,10,3000,7000,0,2,-5021.64,-132.237,411.899,3.77858,'553:0 551:0 '),\n+(556,'DunmoroghC1',0,1,1,1,10,3000,7000,0,2,-5391.34,-928.482,393.467,4.06525,'533:0 557:0 '),\n+(557,'IronforgeRamp',0,1,1,1,10,3000,7000,0,2,-5259.37,-493.579,386.436,3.14828,'556:0 9:0 558:0 '),\n+(558,'IronforgeRampMid',0,1,809,1,10,3000,7000,0,2,-5197.66,-730.697,445.722,5.89324,'557:0 559:0 '),\n+(559,'IronforgeRampTop',0,1,809,1,10,3000,7000,0,2,-5060.46,-745.984,480.27,3.47972,'558:0 8:0 '),\n+(560,'IronforgeBank',0,1537,1537,1,10,3000,7000,0,3,-4909.88,-969.761,501.463,5.46481,'8:0 '),\n+(561,'SGgate',0,51,1959,43,54,3000,7000,0,0,-6413.58,-2007.56,244.634,2.74852,'520:0 562:0 563:0 '),\n+(562,'DustfireValleyMid',0,51,1959,43,54,3000,7000,0,0,-6590.48,-1884.27,245.713,1.74321,'561:0 580:0 585:0 '),\n+(563,'SGexitE',0,51,51,43,54,3000,7000,0,0,-6906.38,-1818.59,241.661,5.89992,'561:0 564:0 566:0 593:0 '),\n+(564,'GrimesiltDigSite',0,51,247,43,54,3000,7000,0,0,-7019.65,-1698.57,241.667,5.46992,'563:0 565:0 566:0 567:0 568:0 '),\n+(565,'TannerCamp',0,51,1958,43,54,3000,7000,0,0,-7225.75,-1752.49,244.286,0.924438,'564:0 566:0 567:0 568:0 '),\n+(566,'SGtower4',0,51,1444,43,54,3000,7000,0,0,-6980,-1505.92,242.742,3.93841,'563:0 564:0 565:0 567:0 568:0 '),\n+(567,'SGtower3',0,51,1444,43,54,3000,7000,0,0,-7036.7,-1320.2,244.272,4.7631,'565:0 564:0 566:0 568:0 '),\n+(568,'SGsouth1',0,51,1444,43,54,3000,7000,0,0,-7155.86,-1317.76,242.155,5.03211,'565:0 569:0 567:0 564:0 566:0 '),\n+(569,'BRM_SG1',0,51,1445,43,54,3000,7000,0,0,-7215.95,-1057.94,242.73,1.72755,'571:0 568:0 570:0 572:0 573:0 '),\n+(570,'BRM_SG2',0,25,25,46,60,3000,7000,0,0,-7399.25,-1106.95,278.077,0.229401,'569:0 622:0 '),\n+(571,'SGwest1',0,51,51,43,54,3000,7000,0,0,-7085,-941.753,268.272,4.123,'569:0 572:0 573:0 '),\n+(572,'SGtower2',0,51,51,43,54,3000,7000,0,0,-7001.07,-1109.84,243.97,2.78587,'571:0 569:0 573:0 '),\n+(573,'SGwest2',0,51,51,43,54,3000,7000,0,0,-6974.99,-1007.32,241.667,3.29324,'571:0 569:0 572:0 574:0 588:0 '),\n+(574,'CauldronRampTop',0,51,246,43,54,3000,7000,0,0,-6974.25,-1172.02,228.781,3.87051,'573:0 575:0 '),\n+(575,'CauldronRampMid1',0,51,246,43,54,3000,7000,0,0,-7024.61,-1220.88,207.974,5.71816,'574:0 576:0 '),\n+(576,'CauldronRampMid2',0,51,246,43,54,3000,7000,0,0,-6955.19,-1270.62,180.686,0.528642,'575:0 577:0 581:0 '),\n+(577,'CauldronRampBottom',0,51,246,43,54,3000,7000,0,0,-6866.28,-1410.17,172.855,2.20156,'576:0 578:0 '),\n+(578,'CauldronRamp2Bottom',0,51,246,43,54,3000,7000,0,0,-6712.76,-1610.77,196.339,2.17329,'577:0 579:0 '),\n+(579,'CauldronRamp2Mid',0,51,246,43,54,3000,7000,0,0,-6668.28,-1664.76,229.053,1.92432,'578:0 580:0 '),\n+(580,'CauldronRamp2Top',0,51,246,43,54,3000,7000,0,0,-6680,-1730.07,255.913,4.54363,'562:0 579:0 '),\n+(581,'SlagPit1',0,51,1443,43,54,3000,7000,0,0,-6850.01,-1218.8,177.395,3.61294,'576:0 582:0 '),\n+(582,'SlagPit2',0,51,1443,43,54,3000,7000,0,0,-6764.59,-1174.15,187.213,1.12951,'581:0 583:0 '),\n+(583,'SlagPit3',0,51,1443,43,54,3000,7000,0,0,-6439.47,-1311.02,180.938,2.63197,'582:0 584:0 '),\n+(584,'SlagPit4',0,51,1443,43,54,3000,7000,0,0,-6631.29,-1289.33,208.714,0.00481129,'583:0 '),\n+(585,'SG_hubN1',0,51,51,43,54,3000,7000,0,0,-6686.77,-1347.22,247.961,4.79378,'562:0 586:0 588:0 589:0 '),\n+(586,'CauldronTopN',0,51,246,43,54,3000,7000,0,0,-6862.1,-1188.37,240.366,5.51045,'585:0 '),\n+(587,'FirewatchRidgeBottom',0,51,1442,43,54,3000,7000,0,0,-6612.66,-860.886,244.297,0.237204,'588:0 589:0 591:0 '),\n+(588,'FirewatchRidgeS',0,51,1442,43,54,3000,7000,0,0,-6817.17,-866.771,248.462,4.87941,'573:0 585:0 587:0 '),\n+(589,'ThoriumPointRampBottom',0,51,1442,43,54,3000,7000,0,0,-6608.41,-1025.59,244.328,1.21161,'587:0 585:0 590:0 '),\n+(590,'ThoriumPointRampTop',0,51,1446,43,54,3000,7000,0,1,-6473.64,-1104.63,303.285,2.64303,'589:0 180:0 '),\n+(591,'FirewatchRidgeTop1',0,51,1442,43,54,3000,7000,0,0,-6473.38,-887.709,324.088,3.80543,'587:0 592:0 '),\n+(592,'FirewatchRidgeTop2',0,51,1442,43,54,3000,7000,0,0,-6502.46,-1018.74,344.372,1.2407,'591:0 '),\n+(593,'SGexitEmid',0,51,51,43,54,3000,7000,0,0,-6952.2,-2064.74,282.478,5.11429,'563:0 594:0 '),\n+(594,'BLexitW',0,3,3,33,45,3000,7000,0,0,-6885.86,-2233.35,242.64,0.361067,'593:0 595:0 24:0 '),\n+(595,'ApocryphansRest',0,3,337,33,45,3000,7000,0,0,-6892.26,-2477.47,247.238,1.71982,'594:0 87:0 596:0 597:0 600:0 601:0 602:0 '),\n+(596,'CampCaggS',0,3,344,33,45,3000,7000,0,0,-7270.91,-2407.34,268.195,5.1163,'595:0 597:0 '),\n+(597,'CampCaggE',0,3,3,33,45,3000,7000,0,0,-7140.34,-2650.51,243.568,0.467924,'595:0 596:0 602:0 603:0 '),\n+(598,'KargathE',0,3,3,33,45,3000,7000,0,0,-6600.53,-2373.56,254.037,0.026153,'600:0 599:0 24:0 '),\n+(599,'KargathNE',0,3,3,33,45,3000,7000,0,0,-6431.02,-2454.24,321.326,3.51922,'598:0 600:0 '),\n+(600,'DustbowlW',0,3,1878,33,45,3000,7000,0,0,-6718.55,-2572.24,241.801,0.471881,'595:0 598:0 599:0 601:0 602:0 '),\n+(601,'DustbowlNE',0,3,1878,33,45,3000,7000,0,0,-6653.03,-2889.09,241.667,2.73974,'595:0 600:0 602:0 620:0 '),\n+(602,'BL_hubC',0,3,1879,33,45,3000,7000,0,0,-6902.56,-2958.24,244.772,1.67356,'600:0 597:0 601:0 595:0 608:0 603:0 '),\n+(603,'AgmondsendS',0,3,345,33,45,3000,7000,0,0,-7141.97,-3251.77,246.326,0.774282,'597:0 602:0 604:0 605:0 607:0 '),\n+(604,'BL_elemsS',0,3,3,33,45,3000,7000,0,0,-7319.09,-3144.54,317.901,5.93436,'603:0 '),\n+(605,'AgmondsEnd',0,3,345,33,45,3000,7000,0,0,-7033.01,-3313.39,238.277,2.5061,'603:0 606:0 607:0 609:0 '),\n+(606,'BL_elemsSE',0,3,3,33,45,3000,7000,0,0,-7339.37,-3450.9,320.961,0.385524,'605:0 '),\n+(607,'CampBoff',0,3,342,33,45,3000,7000,0,0,-7039.11,-3655.92,244.152,1.66966,'603:0 605:0 608:0 609:0 '),\n+(608,'BL_hubN1',0,3,1877,33,45,3000,7000,0,0,-6667.51,-3285.91,241.069,2.14484,'25:0 602:0 607:0 609:0 620:0 '),\n+(609,'BL_hubNE1',0,3,1898,33,45,3000,7000,0,0,-6775.23,-3555.53,245.004,5.79028,'605:0 607:0 608:0 610:0 617:0 620:0 '),\n+(610,'LethlorRavineEntranceS',0,3,339,38,45,3000,7000,0,0,-6742.54,-3895.6,264.574,1.61394,'609:0 611:0 '),\n+(611,'LethlorRavineS',0,3,339,38,45,3000,7000,0,0,-7002.17,-3938.58,263.889,5.47219,'610:0 612:0 '),\n+(612,'LethlorRavineC',0,3,339,38,45,3000,7000,0,0,-6820.98,-4135.08,263.933,2.32276,'611:0 613:0 '),\n+(613,'LethlorRavineN',0,3,339,38,45,3000,7000,0,0,-6424.74,-4106.41,263.889,3.0143,'612:0 614:0 '),\n+(614,'LethlorRavineNW',0,3,339,38,45,3000,7000,0,0,-6513.4,-4004.6,264.394,5.30492,'613:0 615:0 '),\n+(615,'LethlorRavineEntranceN',0,3,339,38,45,3000,7000,0,0,-6396.09,-3976.18,268.618,3.37284,'614:0 616:0 '),\n+(616,'LethlorRavineExitN',0,3,1898,38,45,3000,7000,0,0,-6467.07,-3837.32,315.608,5.41801,'615:0 617:0 '),\n+(617,'CampKoshS',0,3,1898,33,45,3000,7000,0,0,-6360.66,-3685.6,245.154,4.17511,'616:0 609:0 618:0 619:0 '),\n+(618,'CampKosh',0,3,341,33,45,3000,7000,0,0,-6249.45,-3750.01,243.041,2.72409,'617:0 619:0 '),\n+(619,'HammertoesDigsite',0,3,346,33,45,3000,7000,0,0,-6349.91,-3447.28,241.681,0.369852,'617:0 618:0 620:0 621:0 '),\n+(620,'BL_hubN2',0,3,338,33,45,3000,7000,0,0,-6494.59,-3248.21,242.617,1.06886,'25:0 601:0 608:0 609:0 619:0 '),\n+(621,'MakersTerrace',0,3,1897,33,45,3000,7000,0,0,-6056.99,-3302.11,258.645,3.45646,'86:0 505:0 619:0 '),\n+(622,'BRM_SG3',0,25,25,46,60,3000,7000,0,0,-7496.19,-1063.83,264.543,4.72301,'570:0 623:0 628:0 '),\n+(623,'BRM_chain1',0,25,25,46,60,3000,7000,0,0,-7501.48,-1151.43,269.644,1.34305,'622:0 624:0 627:0 '),\n+(624,'BRM_chain2',0,25,25,46,60,3000,7000,0,0,-7599.78,-1110.62,249.93,1.94977,'623:0 625:0 '),\n+(625,'BRM_chain3',0,25,25,46,60,3000,7000,0,0,-7523.43,-1048.09,180.912,0.471264,'624:0 626:0 '),\n+(626,'BRM_chain4',0,25,25,46,60,3000,7000,0,0,-7383.99,-1012.09,173.658,3.00809,'625:0 '),\n+(627,'BRM_BRS1',0,25,25,46,60,3000,7000,0,0,-7609.9,-1226.43,233.401,0.518375,'623:0 628:0 '),\n+(628,'BRM_BS1',0,25,25,46,60,3000,7000,0,0,-7697.61,-1089.8,217.609,3.00611,'627:0 622:0 629:0 '),\n+(629,'BRM_BS2',0,25,25,46,60,3000,7000,0,0,-7769.06,-1129.81,215.084,0.38328,'628:0 630:0 '),\n+(630,'BRM_BS3',0,25,25,46,60,3000,7000,0,0,-7993.75,-1138.96,163.061,0.128021,'629:0 631:0 637:0 639:0 641:0 '),\n+(631,'DracodarNW',0,46,2421,48,56,3000,7000,0,0,-7968.74,-817.038,131.202,4.58672,'630:0 632:0 636:0 '),\n+(632,'AltarOfStormsRoad',0,46,46,48,56,3000,7000,0,0,-7803.25,-717,176.761,6.28318,'631:0 633:0 '),\n+(633,'AltarOfStormsFork',0,46,255,48,56,3000,7000,0,0,-7679.67,-712.976,183.628,3.3461,'632:0 634:0 635:0 '),\n+(634,'AltarOfStormsVendor',0,46,255,48,56,3000,7000,0,0,-7644.75,-636.535,200.452,4.00749,'633:0 '),\n+(635,'AltarOfStorms1',0,46,255,48,56,3000,7000,0,0,-7626.75,-709.048,183.359,5.20123,'633:0 2368:0 '),\n+(636,'DracodarW',0,46,2421,48,56,3000,7000,0,0,-8170.67,-727.141,135.21,5.81979,'631:0 637:0 '),\n+(637,'DracodarS',0,46,2421,48,56,3000,7000,0,0,-8255.07,-1040.7,147.3,0.143321,'630:0 636:0 638:0 639:0 '),\n+(638,'DracodarS_hill1',0,46,2421,48,56,3000,7000,0,0,-8419.15,-933.413,214.705,5.70788,'637:0 '),\n+(639,'DracodarSE',0,46,46,48,56,3000,7000,0,0,-8254.03,-1168.68,144.64,0.0510463,'630:0 637:0 640:0 641:0 '),\n+(640,'DracodarS_hill2',0,46,46,48,56,3000,7000,0,0,-8431.62,-1227.92,207.816,0.498725,'639:0 '),\n+(641,'DracodarHub',0,46,46,48,56,3000,7000,0,0,-8073.86,-1401.78,132.05,4.03301,'630:0 639:0 642:0 644:0 645:0 '),\n+(642,'BlackrockStrongholdOutside',0,46,46,48,56,3000,7000,0,0,-7757.29,-1591.7,133.263,1.43923,'641:0 643:0 644:0 646:0 '),\n+(643,'BlackrockStrongholdInside',0,46,252,48,56,3000,7000,0,0,-7698.11,-1443.02,139.787,4.00159,'642:0 '),\n+(644,'PillarOfAshS',0,46,46,48,56,3000,7000,0,0,-8232.79,-1737.58,147.888,6.17911,'641:0 642:0 645:0 658:0 '),\n+(645,'PillarOfAshE',0,46,253,48,56,3000,7000,0,0,-8102.12,-1922.65,134.695,1.31201,'641:0 644:0 646:0 647:0 658:0 '),\n+(646,'ThaurissanNW',0,46,250,48,56,3000,7000,0,0,-7704.8,-2045.32,133.437,1.61634,'642:0 645:0 139:0 647:0 648:0 '),\n+(647,'DreadmaulRockW',0,46,249,48,56,3000,7000,0,0,-7971.45,-2449.46,130.882,1.47692,'646:0 645:0 648:0 652:0 654:0 658:0 659:0 660:0 '),\n+(648,'DreadmaulRockNW',0,46,249,48,56,3000,7000,0,0,-7665.96,-2453.95,147.044,2.94798,'647:0 646:0 138:0 649:0 654:0 '),\n+(649,'DreadmaulRockNE',0,46,249,48,56,3000,7000,0,0,-7765.85,-2707.5,172.836,1.14313,'648:0 650:0 655:0 '),\n+(650,'DreadmaulRockSE',0,46,2420,48,56,3000,7000,0,0,-8161.75,-2869.02,134.8,0.000368118,'649:0 138:0 651:0 652:0 659:0 '),\n+(651,'MorgansVigil',0,46,2418,48,56,3000,7000,0,3,-8379.57,-2741.96,186.492,6.13436,'650:0 652:0 659:0 '),\n+(652,'DreadmaulRockTop1',0,46,249,48,56,3000,7000,0,0,-7971.64,-2664.1,198.213,2.32517,'647:0 650:0 651:0 138:0 653:0 '),\n+(653,'DreadmaulRockTop2',0,46,249,48,56,3000,7000,0,0,-7873.63,-2613.13,221.072,2.92403,'652:0 '),\n+(654,'DreadmaulRockNWW',0,46,249,48,56,3000,7000,0,0,-7776.13,-2493.23,160.084,5.03518,'648:0 647:0 '),\n+(655,'DreadmaulRockInside1',0,46,249,48,56,3000,7000,0,0,-7848.98,-2661.75,172.955,1.73534,'649:0 656:0 657:0 '),\n+(656,'DreadmaulRockInside2',0,46,249,48,56,3000,7000,0,0,-7961.48,-2603.36,173.834,6.08133,'655:0 '),\n+(657,'DreadmaulRockInside3',0,46,249,48,56,3000,7000,0,0,-7975.04,-2695.45,157.958,5.80842,'655:0 '),\n+(658,'DreadmaulPassW',0,46,46,48,56,3000,7000,0,0,-8216.14,-2308.1,151.442,1.03911,'644:0 645:0 647:0 659:0 '),\n+(659,'DreadmaulPassN',0,46,46,48,56,3000,7000,0,0,-8150.16,-2629.44,133.659,1.18246,'647:0 650:0 651:0 658:0 660:0 '),\n+(660,'DreadmaulPass',0,46,2417,48,56,3000,7000,0,0,-8431.68,-2546.4,133.207,6.07628,'647:0 659:0 661:0 '),\n+(661,'RedridgeExitN',0,44,44,13,25,3000,7000,0,0,-8900,-2574.56,131.851,0.152413,'660:0 75:0 663:0 '),\n+(662,'RendersRockInside',0,44,998,13,25,3000,7000,0,0,-8738.68,-2205.37,149.754,2.59501,'75:0 '),\n+(663,'AlthersMillEntrance',0,44,97,13,25,3000,7000,0,0,-9153.73,-2628.6,109.561,0.156359,'661:0 664:0 690:0 '),\n+(664,'RedridgeHub1',0,44,44,13,25,3000,7000,0,0,-9099.79,-2451.23,120.464,0.197585,'663:0 665:0 667:0 669:0 '),\n+(665,'RedridgeBridgeN',0,44,69,13,25,3000,7000,0,2,-9287.68,-2284.47,67.5443,5.81789,'664:0 10:0 672:0 673:0 '),\n+(666,'RedridgeW',0,44,44,13,25,3000,7000,0,2,-9312.11,-1873.26,82.1473,5.08747,'10:0 672:0 '),\n+(667,'RedridgeCanyons1',0,44,95,13,25,3000,7000,0,2,-8916.14,-2305.07,134.682,3.96044,'664:0 668:0 670:0 '),\n+(668,'RedridgeCanyons2',0,44,95,13,25,3000,7000,0,2,-8864.57,-2150.9,133.327,3.71892,'667:0 669:0 670:0 '),\n+(669,'RedridgeCanyons3',0,44,69,13,25,3000,7000,0,2,-9145.97,-2198.54,119.516,4.7478,'668:0 664:0 670:0 '),\n+(670,'RedridgeCanyons4',0,44,95,13,25,3000,7000,0,2,-9135.91,-2029.37,127.775,5.01877,'667:0 668:0 669:0 77:0 '),\n+(671,'RethbanCavernsInside',0,44,98,13,25,3000,7000,0,0,-8826.83,-1947.01,133.091,2.11555,'77:0 '),\n+(672,'RedridgeBridgeS',0,44,44,13,25,3000,7000,0,2,-9503.49,-2289.12,74.7234,1.13183,'665:0 666:0 674:0 675:0 '),\n+(673,'EverstillN',0,44,68,13,25,3000,7000,0,2,-9263.45,-2458.04,56.1636,1.20646,'665:0 '),\n+(674,'ThreeCorners',0,44,1002,13,25,3000,7000,0,0,-9607.09,-2055.97,65.077,4.99696,'672:0 675:0 692:0 693:0 694:0 '),\n+(675,'RedridgeS1',0,44,1001,13,25,3000,7000,0,0,-9713.82,-2284.16,63.9369,5.46531,'672:0 674:0 676:0 677:0 '),\n+(676,'RedridgeS2',0,44,68,13,25,3000,7000,0,0,-9620.32,-2514.61,59.4453,0.974015,'675:0 677:0 '),\n+(677,'RedridgeS3',0,44,1001,13,25,3000,7000,0,0,-9624.96,-2717.09,56.3955,1.53951,'676:0 675:0 678:0 679:0 691:0 '),\n+(678,'StonewatchS',0,44,70,18,25,3000,7000,0,0,-9468.55,-3007.78,135.551,1.52185,'677:0 689:0 '),\n+(679,'RedridgeS4',0,44,997,13,25,3000,7000,0,0,-9751.37,-3185.18,58.6091,5.63735,'677:0 680:0 681:0 '),\n+(680,'RedridgeE1',0,44,997,13,25,3000,7000,0,0,-9611,-3315.1,49.8404,2.09716,'679:0 681:0 682:0 683:0 684:0 '),\n+(681,'RedridgeE2',0,44,71,13,25,3000,7000,0,0,-9499.43,-3249.9,50.6,3.02197,'679:0 680:0 '),\n+(682,'RedridgeE3',0,44,44,18,25,3000,7000,0,2,-9598.71,-3503.57,121.964,2.30923,'680:0 683:0 '),\n+(683,'RedridgeE4',0,44,71,18,25,3000,7000,0,1,-9465.03,-3460.8,116.076,2.91242,'680:0 682:0 74:0 684:0 '),\n+(684,'RedridgeE5',0,44,71,18,25,3000,7000,0,0,-9469.61,-3328.04,5.51622,4.94268,'680:0 683:0 '),\n+(685,'RedridgeNE',0,44,1000,18,25,3000,7000,0,0,-9116.4,-3271.35,104.33,2.00332,'74:0 686:0 687:0 '),\n+(686,'RedridgeE6',0,44,1000,18,25,3000,7000,0,0,-9317.33,-3210.41,107.191,5.54352,'685:0 74:0 687:0 '),\n+(687,'StonewatchFork',0,44,70,18,25,3000,7000,0,0,-9195.1,-3020.88,94.6252,4.57746,'686:0 685:0 688:0 689:0 690:0 '),\n+(688,'StonewatchTower',0,44,999,18,25,3000,7000,0,0,-9297.56,-2958.62,128.754,5.64364,'687:0 689:0 '),\n+(689,'StonewatchTop',0,44,2099,18,25,3000,7000,0,0,-9364.92,-3072.52,164.756,3.2698,'687:0 688:0 678:0 '),\n+(690,'AlthersMillCenter',0,44,97,13,25,3000,7000,0,0,-9215.61,-2770.74,89.3399,4.66193,'687:0 663:0 '),\n+(691,'EverstillE',0,44,44,13,25,3000,7000,0,0,-9457.68,-2870.36,85.486,2.24488,'677:0 '),\n+(692,'ThreeCornersCamp1',0,44,1002,13,25,3000,7000,0,0,-9472.89,-1956.22,83.561,4.19346,'674:0 693:0 694:0 '),\n+(693,'RedridgeExitW1',0,44,1002,13,25,3000,7000,0,2,-9620.34,-1809.71,51.8565,1.49408,'692:0 674:0 694:0 696:0 '),\n+(694,'RedridgeExitW2',0,44,1002,13,25,3000,7000,0,0,-9831.1,-1766.69,23.8242,2.51983,'692:0 674:0 693:0 695:0 792:0 '),\n+(695,'ElwynnHubS1',0,12,798,1,10,3000,7000,0,2,-9928.36,-1115.12,24.1788,6.21189,'705:0 704:0 694:0 696:0 706:0 '),\n+(696,'ElwynnHubE1',0,12,12,1,10,3000,7000,0,2,-9659.48,-1341.54,48.8561,4.72993,'693:0 697:0 698:0 704:0 695:0 '),\n+(697,'EastvaleLC1',0,12,88,1,10,3000,7000,0,2,-9405,-1343.43,50.0284,2.89799,'696:0 698:0 699:0 '),\n+(698,'StoneCairnLakeSE',0,12,86,1,10,3000,7000,0,2,-9299.52,-1180.36,69.4951,3.31622,'696:0 697:0 699:0 701:0 797:0 '),\n+(699,'StoneCairnLakeNE',0,12,86,1,10,3000,7000,0,2,-8956.22,-1264.96,77.7779,2.94511,'700:0 697:0 698:0 797:0 '),\n+(700,'StoneCairnLakeNW',0,12,86,1,10,3000,7000,0,2,-8860.62,-826.796,71.9141,4.57088,'699:0 701:0 797:0 '),\n+(701,'StoneCairnLakeSW',0,12,12,1,10,3000,7000,0,2,-9355.59,-802.598,64.4981,0.692979,'89:0 700:0 708:0 698:0 705:0 706:0 707:0 797:0 '),\n+(702,'JasperlodeMineInside1',0,12,54,1,10,3000,7000,0,2,-9125.33,-585.357,58.3507,3.90606,'89:0 703:0 '),\n+(703,'JasperlodeMineInside2',0,12,54,1,10,3000,7000,0,2,-9049.44,-618.138,53.1456,4.05725,'702:0 '),\n+(704,'ElwynnHubE2',0,12,12,1,10,3000,7000,0,2,-9613.79,-1100.85,40.5009,4.62273,'696:0 705:0 695:0 '),\n+(705,'ElwynnHubE3',0,12,12,1,10,3000,7000,0,2,-9618.95,-1024.81,40.4731,4.99973,'704:0 695:0 701:0 706:0 707:0 '),\n+(706,'BrackwellPumpkinPatch',0,12,62,1,10,3000,7000,0,2,-9777.88,-877.924,39.5328,5.4101,'705:0 701:0 695:0 707:0 '),\n+(707,'ElwynnHubC1',0,12,12,1,10,3000,7000,0,2,-9609.57,-527.364,55.1285,4.48725,'89:0 708:0 701:0 705:0 706:0 716:0 '),\n+(708,'CrystalLakeE',0,12,18,1,10,3000,7000,0,2,-9464.16,-422.645,58.9952,3.63313,'89:0 701:0 707:0 709:0 '),\n+(709,'CrystalLakeW',0,12,18,1,10,3000,7000,0,2,-9470.07,-173.045,59.9322,4.58858,'708:0 710:0 7:0 '),\n+(710,'NorthshireExit',0,12,12,1,10,3000,7000,0,2,-9133.8,-66.2742,82.4151,1.35237,'709:0 16:0 13:0 7:0 '),\n+(711,'EchoRidgeMineInside',0,12,34,1,10,3000,7000,0,2,-8560.22,-214.447,85.0045,2.95145,'70:0 '),\n+(712,'TradeDistrict',0,1519,1519,1,10,3000,7000,0,3,-8794.44,645.505,94.4595,3.54245,'16:0 '),\n+(713,'ForestsEdgeS',0,12,60,1,10,3000,7000,0,2,-10070.2,658.114,37.3319,5.88491,'72:0 88:0 717:0 '),\n+(714,'FargodeepMineOutside',0,12,57,1,10,3000,7000,0,2,-9868.23,221.066,14.0194,6.19474,'7:0 71:0 72:0 715:0 '),\n+(715,'FargodeepMineInside',0,12,57,1,10,3000,7000,0,2,-9779.25,104.966,4.57989,3.01191,'714:0 '),\n+(716,'ElwynnHubS2',0,12,12,1,10,3000,7000,0,2,-9808.32,-269.092,40.0067,5.15408,'71:0 707:0 '),\n+(717,'ElwynnExitW',0,12,60,1,10,3000,7000,0,2,-9747.07,741.601,25.5892,4.55914,'7:0 88:0 72:0 713:0 718:0 '),\n+(718,'WestfallExitNE',0,40,916,8,20,3000,7000,0,2,-9853.3,918.261,30.2216,5.34454,'717:0 719:0 745:0 746:0 '),\n+(719,'Longshore1',0,40,2,8,20,3000,7000,0,2,-9616.19,1059.16,5.79699,0.013632,'720:0 718:0 745:0 '),\n+(720,'Longshore2',0,40,2,8,20,3000,7000,0,2,-9634.2,1389.29,9.09694,4.71817,'719:0 721:0 '),\n+(721,'Longshore3',0,40,2,8,20,3000,7000,0,2,-9648.12,1575.23,3.54258,4.75547,'720:0 722:0 '),\n+(722,'Longshore4',0,40,2,8,20,3000,7000,0,2,-9776.1,1654.24,11.5179,2.15188,'721:0 723:0 742:0 743:0 '),\n+(723,'Longshore5',0,40,2,8,20,3000,7000,0,2,-9985.75,1913.6,4.86301,5.35756,'722:0 724:0 742:0 '),\n+(724,'Longshore6',0,40,2,8,20,3000,7000,0,2,-10334,2061.94,3.69692,5.05125,'723:0 725:0 739:0 '),\n+(725,'Longshore7',0,40,2,8,20,3000,7000,0,2,-10695.4,2102.07,8.28685,6.14098,'724:0 726:0 738:0 '),\n+(726,'Longshore8',0,40,2,8,20,3000,7000,0,2,-10975.2,2108.77,-0.213533,6.27058,'725:0 727:0 737:0 '),\n+(727,'Longshore9',0,40,2,8,20,3000,7000,0,2,-11307.8,1926.18,9.26031,4.25015,'726:0 728:0 '),\n+(728,'Longshore10',0,40,2,8,20,3000,7000,0,2,-11466.2,1725.82,8.61195,0.641238,'727:0 729:0 '),\n+(729,'DaggerHillsW',0,40,920,8,20,3000,7000,0,2,-11264.1,1714.56,39.9062,4.76851,'728:0 730:0 737:0 '),\n+(730,'DaggerHillsC1',0,40,920,8,20,3000,7000,0,2,-11258.8,1470.77,88.9353,4.93148,'729:0 731:0 '),\n+(731,'DaggerHillsC2',0,40,920,8,20,3000,7000,0,2,-11211.1,1297.89,91.1699,1.90966,'730:0 732:0 733:0 '),\n+(732,'DaggerHillsNook',0,40,920,8,20,3000,7000,0,2,-11235.2,1182.36,91.6522,1.1871,'731:0 733:0 '),\n+(733,'DaggerHillsE',0,40,920,8,20,3000,7000,0,2,-11062.7,1163.02,43.0261,2.75789,'736:0 732:0 731:0 734:0 735:0 750:0 '),\n+(734,'DustPlains',0,40,922,8,20,3000,7000,0,2,-11152,739.176,32.5228,1.40505,'733:0 735:0 750:0 '),\n+(735,'DeadAcre',0,40,917,8,20,3000,7000,0,2,-10770.8,864.294,33.1505,2.913,'736:0 733:0 734:0 746:0 750:0 '),\n+(736,'WestfallHubC1',0,40,40,8,20,3000,7000,0,2,-10842.5,1196.94,34.875,1.14192,'12:0 15:0 735:0 733:0 738:0 741:0 750:0 '),\n+(737,'DemontsPlace',0,40,921,8,20,3000,7000,0,2,-11087.9,1894.97,35.4372,5.06105,'726:0 729:0 12:0 738:0 '),\n+(738,'AlexstonFarmstead',0,40,219,8,20,3000,7000,0,2,-10615,1671.77,41.41,4.1441,'737:0 725:0 12:0 741:0 742:0 736:0 '),\n+(739,'GoldCoastQuarry',0,40,113,8,20,3000,7000,0,2,-10403.7,1909.99,9.96272,4.64675,'724:0 740:0 741:0 '),\n+(740,'GoldCoastQuarryInside',0,40,113,8,20,3000,7000,0,2,-10575.3,1990.25,-8.03668,3.01509,'739:0 '),\n+(741,'WestfallHubC2',0,40,40,8,20,3000,7000,0,2,-10495.4,1349.24,42.6842,1.76042,'738:0 739:0 15:0 742:0 745:0 736:0 '),\n+(742,'WestfallHubC3',0,40,918,8,20,3000,7000,0,2,-10274.9,1408.84,38.9079,3.90454,'741:0 738:0 723:0 722:0 15:0 743:0 745:0 '),\n+(743,'JangolodeMine',0,40,111,8,20,3000,7000,0,2,-10017,1466.37,41.0745,6.08639,'742:0 722:0 744:0 745:0 '),\n+(744,'JangolodeMineInside',0,40,111,8,20,3000,7000,0,2,-9887.11,1427.15,40.0346,0.896887,'743:0 '),\n+(745,'SaldeansFarm',0,40,107,8,20,3000,7000,0,2,-10154.1,1116.55,36.8816,1.65283,'15:0 718:0 719:0 741:0 742:0 743:0 746:0 '),\n+(746,'WestfallHubE1',0,40,40,8,20,3000,7000,0,2,-10333.7,859.579,39.774,0.563072,'15:0 718:0 735:0 745:0 752:0 '),\n+(747,'DefiasHideout',0,1581,1581,15,22,3000,7000,0,2,-11112,1483.69,32.39,3.56723,'12:0 748:0 '),\n+(748,'Deadmines1',0,1581,1581,15,22,3000,7000,0,2,-11252.8,1533.82,28.6803,0.814416,'747:0 749:0 '),\n+(749,'Deadmines2',0,1581,1581,15,22,3000,7000,0,2,-11214.4,1638.37,27.2613,1.55073,'748:0 '),\n+(750,'WestfallExitSE',0,40,40,8,20,3000,7000,0,2,-10870.3,667.353,30.8385,4.48578,'733:0 734:0 735:0 736:0 15:0 751:0 '),\n+(751,'DuskwoodExitW',0,10,10,18,30,3000,7000,0,0,-10857.5,557.367,30.4883,6.27453,'750:0 752:0 14:0 753:0 755:0 '),\n+(752,'HushedBankN',0,10,1097,18,30,3000,7000,0,0,-10326.3,623.959,26.42,3.17024,'746:0 751:0 757:0 758:0 763:0 '),\n+(753,'AddlesSteadW',0,10,536,23,30,3000,7000,0,1,-11054.9,270.776,25.2035,6.01338,'751:0 14:0 754:0 '),\n+(754,'AddlesSteadE',0,10,536,18,30,3000,7000,0,0,-10997.4,179.443,30.4059,1.04377,'753:0 14:0 766:0 '),\n+(755,'RHCemetaryS',0,10,492,18,30,3000,7000,0,0,-10587.6,294.965,31.0441,0.0129175,'751:0 14:0 756:0 757:0 765:0 766:0 '),\n+(756,'RHCemetaryNE',0,10,492,24,30,3000,7000,0,0,-10398,201.223,34.2462,5.21064,'755:0 757:0 758:0 762:0 764:0 765:0 '),\n+(757,'RHCemetaryW',0,10,492,22,30,3000,7000,0,0,-10427.4,409.679,46.6267,4.40525,'752:0 755:0 756:0 758:0 759:0 '),\n+(758,'RHCemetaryN',0,10,243,24,30,3000,7000,0,0,-10308.2,348.036,59.693,3.07006,'752:0 757:0 756:0 '),\n+(759,'DawningWoodCatacombs1',0,10,2098,18,30,3000,7000,0,0,-10261.5,383.964,10.414,2.92673,'757:0 760:0 '),\n+(760,'DawningWoodCatacombs2',0,10,2098,18,30,3000,7000,0,0,-10234.6,284.99,2.79944,4.82935,'759:0 761:0 '),\n+(761,'DawningWoodCatacombs3',0,10,2098,18,30,3000,7000,0,0,-10220.1,166.144,0.047382,3.23144,'760:0 762:0 '),\n+(762,'DawningWoodCatacombs4',0,10,2098,18,30,3000,7000,0,0,-10338.4,136.513,4.82896,0.380849,'756:0 761:0 '),\n+(763,'DuskwoodNW1',0,10,799,18,30,3000,7000,0,0,-10173.2,350.099,32.3759,4.62356,'752:0 764:0 '),\n+(764,'DuskwoodNW2',0,10,799,18,30,3000,7000,0,0,-10183.8,-55.3832,27.6626,5.67208,'763:0 756:0 765:0 793:0 '),\n+(765,'DuskwoodC1',0,10,10,18,30,3000,7000,0,0,-10482,-16.5716,51.5694,0.81242,'764:0 755:0 756:0 766:0 '),\n+(766,'DuskwoodC2',0,10,10,18,30,3000,7000,0,0,-10750.8,67.4617,28.3337,1.80202,'765:0 755:0 14:0 754:0 767:0 '),\n+(767,'DuskwoodC3',0,10,10,18,30,3000,7000,0,0,-10910.1,-371.894,39.8351,3.06651,'766:0 768:0 769:0 773:0 774:0 775:0 779:0 795:0 '),\n+(768,'DuskwoodExitS',0,10,10,18,30,3000,7000,0,0,-11268.2,-368.936,61.3823,6.14723,'767:0 858:0 '),\n+(769,'VulGolOgreMound1',0,10,93,24,30,3000,7000,0,0,-11005.9,-176.407,14.5532,5.12818,'767:0 770:0 771:0 '),\n+(770,'VulGolOgreMound2',0,10,93,24,30,3000,7000,0,0,-10959.3,-38.5543,13.6432,4.44096,'769:0 771:0 '),\n+(771,'VulGolOgreMound3',0,10,93,24,30,3000,7000,0,0,-11083.6,-80.7448,16.7954,5.39522,'769:0 770:0 772:0 '),\n+(772,'VulGolOgreMoundInside',0,10,93,24,30,3000,7000,0,0,-11234.1,-172.07,4.22438,4.5174,'771:0 '),\n+(773,'YorgenFarmsteadW',0,10,245,24,30,3000,7000,0,0,-11096.9,-452.028,32.1764,4.54422,'767:0 774:0 '),\n+(774,'YorgenFarmsteadE',0,10,245,24,30,3000,7000,0,0,-11052.8,-598.054,29.3447,1.47723,'767:0 773:0 776:0 '),\n+(775,'DuskwoodC4',0,10,10,18,30,3000,7000,0,0,-10908,-739.892,54.8364,0.583838,'767:0 776:0 778:0 779:0 '),\n+(776,'RottingOrchardW',0,10,241,18,30,3000,7000,0,0,-10986.3,-770.892,55.1122,1.55183,'774:0 775:0 777:0 778:0 '),\n+(777,'RottingOrchardS',0,10,241,18,30,3000,7000,0,0,-11103.5,-891.729,62.1149,0.69773,'776:0 778:0 '),\n+(778,'DuskwoodC5',0,10,10,18,30,3000,7000,0,0,-10823,-837.935,55.75,1.63037,'775:0 776:0 777:0 779:0 780:0 '),\n+(779,'DuskwoodC6',0,10,10,18,30,3000,7000,0,0,-10768,-644.008,42.2621,2.90859,'767:0 775:0 778:0 786:0 '),\n+(780,'DuskwoodE1',0,10,42,18,30,3000,7000,0,0,-10757.1,-1156.72,24.9918,1.69202,'778:0 124:0 782:0 783:0 '),\n+(781,'RolandsDoomInside',0,10,2161,24,30,3000,7000,0,0,-11157.5,-1167.04,42.5151,0.315576,'124:0 '),\n+(782,'TranquilGardensCemetery',0,10,121,18,30,3000,7000,0,0,-11023.4,-1315.7,53.1833,6.14911,'780:0 783:0 '),\n+(783,'DuskwoodE2',0,10,10,18,30,3000,7000,0,0,-10813.8,-1366.37,42.2527,0.00140238,'780:0 782:0 3:0 784:0 794:0 '),\n+(784,'DarkshireExitE',0,10,10,18,30,3000,7000,0,0,-10539.7,-1338.09,48.0906,1.65268,'785:0 783:0 3:0 '),\n+(785,'DuskwoodExitE',0,10,10,18,30,3000,7000,0,0,-10442.9,-1486.98,73.8977,5.13748,'784:0 798:0 '),\n+(786,'DuskwoodC7',0,10,242,24,30,3000,7000,0,0,-10451.9,-825.607,50.4132,2.61635,'779:0 787:0 788:0 793:0 '),\n+(787,'DuskwoodC8',0,10,242,24,30,3000,7000,0,0,-10647.9,-908.344,50.934,5.93661,'786:0 3:0 788:0 '),\n+(788,'DuskwoodNE1',0,10,242,18,30,3000,7000,0,0,-10219.2,-1021.98,31.9202,2.92658,'786:0 787:0 3:0 789:0 790:0 793:0 '),\n+(789,'ManorMismantle',0,10,1098,24,30,3000,7000,0,0,-10332.7,-1264.03,35.3024,1.53643,'788:0 3:0 790:0 '),\n+(790,'DuskwoodNE2',0,10,10,18,30,3000,7000,0,0,-10181.4,-1145.35,24.304,3.28393,'788:0 789:0 791:0 793:0 '),\n+(791,'DuskwoodNE3',0,10,10,18,30,3000,7000,0,0,-10067.1,-1379.68,29.9246,1.99195,'790:0 792:0 '),\n+(792,'DuskwoodExitNE',0,10,10,18,30,3000,7000,0,0,-9963.01,-1637.21,27.2574,2.08816,'694:0 791:0 '),\n+(793,'DuskwoodN',0,10,799,18,30,3000,7000,0,0,-10020.5,-660.012,39.1578,1.66406,'790:0 788:0 764:0 786:0 '),\n+(794,'Naraxis',0,10,10,18,30,3000,7000,0,0,-10619.4,-1502.44,90.534,3.1465,'783:0 '),\n+(795,'TwilightGroveEntrance',0,10,10,50,60,3000,7000,0,0,-10718.7,-425.681,126.691,0.442773,'767:0 796:0 '),\n+(796,'TwilightGrove',0,10,856,50,60,3000,7000,0,0,-10419.3,-421.597,45.6561,3.03852,'795:0 '),\n+(797,'HeroesVigil',0,12,56,1,10,3000,7000,0,0,-9101.04,-1034.1,72.9837,5.20227,'698:0 699:0 700:0 701:0 '),\n+(798,'DWPExitW',0,41,2697,50,60,3000,7000,0,0,-10464.2,-1734.78,86.7801,1.49361,'785:0 171:0 802:0 '),\n+(799,'DeadwindRavineSW',0,41,2558,50,60,3000,7000,0,0,-10919.4,-1957.74,114.777,4.67839,'171:0 800:0 '),\n+(800,'TheViceW',0,41,2561,50,60,3000,7000,0,0,-10843.3,-2118.87,121.161,1.51324,'799:0 172:0 79:0 '),\n+(801,'DWPExitE',0,41,2938,50,60,3000,7000,0,0,-10593.5,-2125.78,90.9212,3.83802,'172:0 170:0 802:0 811:0 '),\n+(802,'DeadsmansCrossingE',0,41,41,50,60,3000,7000,0,0,-10437,-2037.61,94.6245,1.59492,'798:0 801:0 810:0 '),\n+(803,'GroshgokCompoundInside',0,41,2937,50,60,3000,7000,0,0,-11169.4,-2483.11,105.139,0.944598,'79:0 '),\n+(804,'KarazhanOutskirts',0,41,2562,50,60,3000,7000,0,0,-11148.9,-2130,55.9803,1.2403,'79:0 805:0 806:0 '),\n+(805,'Karazhan',0,41,2562,50,60,3000,7000,0,0,-11115.2,-2008.72,48.4017,4.31317,'804:0 806:0 '),\n+(806,'KarazhanCellarEntrance',0,41,2837,50,60,3000,7000,0,0,-11173.4,-2033.69,47.0759,0.798522,'804:0 805:0 807:0 '),\n+(807,'KarazhanCellar1',0,41,2837,50,60,3000,7000,0,0,-11100.4,-1963.77,1.93936,4.49657,'806:0 808:0 '),\n+(808,'KarazhanCellar2',0,41,2837,50,60,3000,7000,0,0,-11159.5,-1898.41,-17.7918,6.21463,'807:0 809:0 '),\n+(809,'KarazhanCellar3',0,41,2837,50,60,3000,7000,0,0,-11033.9,-1910.04,-32.9889,4.98353,'808:0 '),\n+(810,'DeadmansCrossingBottom',0,41,41,50,60,3000,7000,0,0,-10282.6,-2019.49,51.0186,2.21028,'802:0 '),\n+(811,'SSExitW',0,8,8,33,45,3000,7000,0,0,-10546.2,-2376.39,84.2413,1.87648,'801:0 812:0 '),\n+(812,'SSW1',0,8,8,33,45,3000,7000,0,0,-10381.8,-2424.26,52.7345,2.75809,'811:0 813:0 '),\n+(813,'SSW2',0,8,8,33,45,3000,7000,0,0,-10427.8,-2549.06,24.1947,5.68762,'812:0 814:0 830:0 '),\n+(814,'IthariusCaveOutside',0,8,1777,33,45,3000,7000,0,0,-10561.3,-2508.68,22.0709,5.83489,'813:0 815:0 816:0 '),\n+(815,'IthariusCave',0,8,1777,33,45,3000,7000,0,0,-10677.4,-2531.21,28.912,6.2649,'814:0 '),\n+(816,'SSCRW1',0,8,1780,33,45,3000,7000,0,0,-10387.5,-2710.03,21.6778,1.56036,'814:0 817:0 818:0 819:0 830:0 '),\n+(817,'MistyValley',0,8,116,33,45,3000,7000,0,0,-10110,-2413.91,29.9136,4.35049,'816:0 818:0 '),\n+(818,'SSW3',0,8,8,33,45,3000,7000,0,0,-10320.4,-2794.27,21.9908,1.07734,'817:0 816:0 819:0 820:0 829:0 830:0 '),\n+(819,'Harborage',0,8,657,33,45,3000,7000,0,2,-10113,-2807.71,22.1444,3.06047,'818:0 816:0 820:0 829:0 '),\n+(820,'SSN1',0,8,1798,33,45,3000,7000,0,0,-10099.4,-3266.23,20.4381,1.58785,'818:0 819:0 821:0 827:0 828:0 829:0 '),\n+(821,'SSN2',0,8,76,33,45,3000,7000,0,0,-9974.74,-3687.45,21.6788,2.09247,'820:0 822:0 823:0 827:0 828:0 829:0 '),\n+(822,'SSNE1',0,8,2403,33,45,3000,7000,0,0,-9634.53,-3969.85,0.0000146627,2.75613,'821:0 823:0 '),\n+(823,'SSNE2',0,8,300,33,45,3000,7000,0,0,-10034.8,-4306.49,1.78832,0.101491,'822:0 821:0 824:0 826:0 827:0 '),\n+(824,'SSE',0,8,300,33,45,3000,7000,0,0,-10512,-4371.71,6.04597,6.27469,'823:0 825:0 80:0 826:0 827:0 '),\n+(825,'SSSE',0,8,300,33,45,3000,7000,0,0,-11038.3,-4116.28,1.98503,5.82703,'186:0 824:0 80:0 '),\n+(826,'PoolOfTearsE',0,8,1778,33,45,3000,7000,0,0,-10444.5,-4087.57,23.9872,1.47592,'80:0 186:0 823:0 824:0 827:0 '),\n+(827,'PoolOfTearsN',0,8,8,33,45,3000,7000,0,0,-10147.3,-3802.05,22.1649,2.27113,'820:0 821:0 823:0 824:0 826:0 828:0 829:0 '),\n+(828,'PoolOfTearsW',0,8,8,33,45,3000,7000,0,0,-10377.4,-3577.61,22.0023,3.94206,'820:0 821:0 827:0 80:0 51:0 829:0 '),\n+(829,'SSC',0,8,1798,33,45,3000,7000,0,0,-10292.9,-3192.2,22.1489,5.69742,'818:0 819:0 820:0 821:0 827:0 828:0 51:0 830:0 '),\n+(830,'SSExitS',0,8,8,33,45,3000,7000,0,0,-10553.9,-3043.33,24.794,0.0857489,'813:0 816:0 818:0 829:0 51:0 831:0 '),\n+(831,'SSExitSS',0,4,4,43,54,3000,7000,0,0,-10690.8,-2978.8,37.8508,5.87412,'830:0 834:0 '),\n+(832,'StagalbogInside1',0,8,1817,33,45,3000,7000,0,0,-10966.8,-3697.03,11.0105,4.21105,'80:0 833:0 '),\n+(833,'StagalbogInside2',0,8,1817,33,45,3000,7000,0,0,-10894.6,-3613.42,16.0499,6.1176,'832:0 '),\n+(834,'BLExitN',0,4,4,43,54,3000,7000,0,0,-10811.4,-2992.21,41.134,0.16765,'831:0 835:0 839:0 846:0 '),\n+(835,'BLNW1',0,4,1437,43,54,3000,7000,0,0,-11009.6,-2785.5,4.70615,5.63206,'834:0 836:0 839:0 840:0 '),\n+(836,'DreadmaulHoldEntrance',0,4,1437,43,54,3000,7000,0,0,-10916.9,-2714.76,7.63624,3.85903,'835:0 837:0 838:0 '),\n+(837,'DreadmaulHoldRight',0,4,1437,43,54,3000,7000,0,0,-10814.2,-2705.35,8.14439,3.20125,'836:0 838:0 '),\n+(838,'DreadmaulHoldLeft',0,4,1437,43,54,3000,7000,0,0,-10859.8,-2615.61,8.07541,4.52661,'836:0 837:0 '),\n+(839,'BLNW2',0,4,4,43,54,3000,7000,0,0,-11080.5,-2903.3,9.18506,0.371865,'835:0 834:0 196:0 '),\n+(840,'BLW1',0,4,4,43,54,3000,7000,0,0,-11268.2,-2725.08,11.1047,5.91718,'835:0 841:0 842:0 '),\n+(841,'DreadmaulPost',0,4,1439,43,54,3000,7000,0,0,-11528.8,-2858.71,8.50437,6.19557,'840:0 196:0 842:0 856:0 '),\n+(842,'BLAltarOfStormsBottom',0,4,4,43,54,3000,7000,0,0,-11501.6,-2718.85,5.65372,0.900431,'840:0 841:0 843:0 856:0 '),\n+(843,'BLAltarOfStormsMid',0,4,4,47,54,3000,7000,0,0,-11381.5,-2566.03,75.8033,3.74358,'842:0 844:0 '),\n+(844,'BLAltarOfStormsTop',0,4,1441,47,54,3000,7000,0,1,-11255.9,-2556.41,97.0494,2.9896,'843:0 '),\n+(845,'BLE1',0,4,4,43,54,3000,7000,0,0,-11149.6,-3232.6,8.07553,2.30354,'196:0 846:0 850:0 '),\n+(846,'NethergardeOutside',0,4,1438,43,54,3000,7000,0,0,-10961.7,-3200.5,45.5708,0.954623,'834:0 845:0 847:0 '),\n+(847,'NethergardeInside1',0,4,1438,43,54,3000,7000,0,2,-11008.9,-3340.48,64.7225,4.78147,'846:0 848:0 '),\n+(848,'NethergardeInside2',0,4,1438,43,54,3000,7000,0,3,-10993.2,-3453.24,64.8707,3.21459,'847:0 849:0 '),\n+(849,'NethergardeInside3',0,4,1438,43,54,3000,7000,0,2,-11112.2,-3438.11,79.0946,6.1402,'848:0 '),\n+(850,'BLE2',0,4,1440,43,54,3000,7000,0,0,-11310.9,-3410.18,7.46828,4.16649,'845:0 851:0 852:0 '),\n+(851,'BLE2Inside',0,4,1440,43,54,3000,7000,0,0,-11225.8,-3486.48,8.69295,2.17551,'850:0 '),\n+(852,'BLE3',0,4,4,43,54,3000,7000,0,0,-11438.8,-3304.34,7.30604,5.76674,'196:0 850:0 853:0 854:0 '),\n+(853,'BLSE',0,4,72,43,54,3000,7000,0,0,-11632.5,-3381.23,14.577,0.215935,'852:0 854:0 855:0 '),\n+(854,'BLS1',0,4,4,43,54,3000,7000,0,0,-11607.8,-3099.85,7.81021,5.30924,'196:0 852:0 853:0 855:0 '),\n+(855,'BLS2',0,4,72,43,54,3000,7000,0,0,-11765.8,-2959.84,7.91609,5.25623,'853:0 854:0 856:0 2370:0 '),\n+(856,'BLS3',0,4,4,43,54,3000,7000,0,0,-11716.6,-2785.99,8.27783,3.20635,'855:0 841:0 842:0 857:0 '),\n+(857,'TaintedScar1',0,4,73,55,60,3000,7000,0,0,-11907.8,-2658.64,-2.15637,5.48008,'856:0 '),\n+(858,'SVExitN',0,33,33,33,45,3000,7000,0,0,-11362.1,-380.82,64.9035,0.170793,'768:0 859:0 '),\n+(859,'SVExitNFork',0,33,33,33,45,3000,7000,0,0,-11397.1,-284.376,58.1739,3.29667,'858:0 860:0 861:0 '),\n+(860,'RebelCamp',0,33,99,33,45,3000,7000,0,3,-11314.2,-182.813,75.1397,3.66777,'859:0 '),\n+(861,'SVEntranceN',0,33,33,33,45,3000,7000,0,0,-11511.9,-302.586,38.7986,0.353382,'859:0 863:0 864:0 862:0 '),\n+(862,'NesingwarysExpeditionCamp',0,33,100,33,45,3000,7000,0,1,-11616,-50.0157,10.9823,4.49439,'861:0 879:0 880:0 881:0 901:0 902:0 907:0 '),\n+(863,'SVNBridge1N',0,33,33,33,45,3000,7000,0,0,-11604.1,-282.333,37.221,5.64107,'861:0 879:0 '),\n+(864,'SVNHubN1',0,33,33,33,45,3000,7000,0,0,-11643.7,-473.703,17.1608,0.3141,'861:0 865:0 873:0 '),\n+(865,'KurzensCompound',0,33,101,33,45,3000,7000,0,0,-11604,-644.056,29.157,3.77181,'864:0 866:0 872:0 '),\n+(866,'TheStockpile1',0,33,106,33,45,3000,7000,0,0,-11461.5,-750.28,30.6105,4.24893,'865:0 867:0 '),\n+(867,'TheStockpile2',0,33,106,33,45,3000,7000,0,0,-11514.8,-845.839,22.0076,3.08261,'866:0 868:0 869:0 '),\n+(868,'TheStockpile3',0,33,106,33,45,3000,7000,0,0,-11418.4,-794.929,14.9653,3.89354,'867:0 '),\n+(869,'TheStockpile4',0,33,106,33,45,3000,7000,0,0,-11506.4,-946.763,29.2275,0.414209,'867:0 870:0 '),\n+(870,'TheStockpile5',0,33,106,33,45,3000,7000,0,0,-11406.8,-896.737,18.0813,0.89682,'869:0 871:0 '),\n+(871,'TheStockpile6',0,33,106,33,45,3000,7000,0,0,-11337.1,-985.396,27.3203,1.9202,'870:0 '),\n+(872,'SVNHubN2',0,33,33,33,45,3000,7000,0,0,-11729.7,-799.127,29.6214,0.89486,'865:0 873:0 875:0 913:0 '),\n+(873,'VentureCoBaseCamp',0,33,1760,33,45,3000,7000,0,0,-11959.6,-531.751,11.3978,5.11834,'872:0 864:0 874:0 875:0 913:0 '),\n+(874,'SVNHub1',0,33,33,33,45,3000,7000,0,0,-12225,-546.002,28.8839,0.0407319,'873:0 875:0 911:0 913:0 915:0 '),\n+(875,'SVE1',0,33,33,33,45,3000,7000,0,0,-12149.1,-965.968,32.4681,1.43677,'872:0 873:0 874:0 876:0 878:0 913:0 '),\n+(876,'MoshoggOgreMound',0,33,105,33,45,3000,7000,0,0,-12352.7,-972.262,13.1171,5.38338,'875:0 877:0 878:0 913:0 '),\n+(877,'MoshoggOgreMoundInside',0,33,105,33,45,3000,7000,0,0,-12364,-1147.48,0.104103,2.92311,'876:0 '),\n+(878,'MoshoggOgreMoundUpper',0,33,105,33,45,3000,7000,0,0,-12466.5,-881.644,39.1084,5.72306,'875:0 876:0 914:0 918:0 '),\n+(879,'SVNBridge1C',0,33,33,33,45,3000,7000,0,0,-11710.1,-210.005,39.5643,5.90174,'863:0 880:0 862:0 '),\n+(880,'SVNBridge1S',0,33,33,33,45,3000,7000,0,0,-11818.3,-43.4252,39.7487,5.27146,'879:0 862:0 903:0 905:0 907:0 '),\n+(881,'SVNHubW1',0,33,33,33,45,3000,7000,0,0,-11518.9,255.102,25.1192,4.23669,'862:0 882:0 883:0 901:0 '),\n+(882,'SVNHubW2',0,33,33,33,45,3000,7000,0,0,-11502.5,373.117,53.2392,3.3217,'881:0 883:0 '),\n+(883,'ZulKundaNE',0,33,33,33,45,3000,7000,0,0,-11650.7,401.397,42.8581,5.68183,'881:0 882:0 884:0 889:0 890:0 '),\n+(884,'ZulKundaE',0,33,33,33,45,3000,7000,0,0,-11785.5,436.17,47.4037,6.2807,'883:0 885:0 889:0 899:0 '),\n+(885,'ZulKundaSE',0,33,33,33,45,3000,7000,0,0,-11863.3,560.263,47.0214,5.06137,'884:0 886:0 887:0 889:0 '),\n+(886,'ZulKundaS',0,33,33,33,45,3000,7000,0,0,-11831.5,711.922,45.1329,4.4252,'885:0 888:0 '),\n+(887,'SavageCoastNW1',0,33,301,33,45,3000,7000,0,0,-11924.1,793.032,3.06387,4.97496,'885:0 894:0 185:0 897:0 898:0 '),\n+(888,'ZulKunda1',0,33,102,33,45,3000,7000,0,0,-11690.4,742.837,49.7495,3.41987,'886:0 889:0 891:0 '),\n+(889,'ZulKunda2',0,33,102,33,45,3000,7000,0,0,-11694.8,565.959,49.7011,1.34053,'883:0 884:0 885:0 888:0 890:0 891:0 '),\n+(890,'ZulKunda3',0,33,102,33,45,3000,7000,0,0,-11550.4,601.183,50.5784,3.11945,'883:0 889:0 891:0 '),\n+(891,'ZulKunda4',0,33,102,33,45,3000,7000,0,0,-11622.9,760.15,39.7329,0.007312,'888:0 889:0 890:0 892:0 893:0 '),\n+(892,'ZulKunda5',0,33,102,33,45,3000,7000,0,0,-11528.7,724.898,59.4101,3.50037,'891:0 '),\n+(893,'ZulKundaW',0,33,122,33,45,3000,7000,0,0,-11572.6,840.524,8.14386,2.72086,'891:0 894:0 '),\n+(894,'SavageCoastNW2',0,33,122,33,45,3000,7000,0,0,-11692.5,954.651,3.70656,5.00441,'893:0 887:0 185:0 897:0 '),\n+(895,'YojambaIsleW',0,33,3357,33,45,3000,7000,0,0,-11810.6,1364.62,0.0261903,4.46053,'185:0 '),\n+(896,'YojambaIsleN',0,33,3357,33,45,3000,7000,0,0,-11748.3,1318.44,5.22585,2.37531,'185:0 '),\n+(897,'VileReefIsle',0,33,301,33,45,3000,7000,0,0,-12154.2,871.091,18.6659,5.996,'894:0 887:0 '),\n+(898,'SavageCoastW1',0,33,301,33,45,3000,7000,0,0,-12016.1,440.588,3.35169,0.661185,'887:0 899:0 900:0 '),\n+(899,'SVNWHub1',0,33,33,33,45,3000,7000,0,0,-11888.7,290.463,12.6077,0.998902,'898:0 884:0 900:0 901:0 902:0 903:0 '),\n+(900,'SavageCoastW2',0,33,33,33,45,3000,7000,0,0,-12196.8,238.239,2.19021,4.81004,'898:0 899:0 904:0 37:0 '),\n+(901,'SVNHunW3',0,33,100,33,45,3000,7000,0,0,-11656.6,59.5536,17.3151,1.50941,'899:0 881:0 862:0 902:0 '),\n+(902,'TkashiRuins',0,33,126,33,45,3000,7000,0,0,-11843.2,59.0602,14.1655,3.34528,'899:0 901:0 862:0 903:0 905:0 '),\n+(903,'KalaiRuins',0,33,125,33,45,3000,7000,0,0,-12069.3,66.3927,-5.18214,3.5436,'902:0 899:0 880:0 904:0 906:0 '),\n+(904,'SVNHub2',0,33,33,33,45,3000,7000,0,0,-12283.3,28.601,18.2879,0.246879,'903:0 900:0 37:0 912:0 '),\n+(905,'SVNBridge2N',0,33,33,33,45,3000,7000,0,0,-11907.9,-50.0313,39.7259,0.870484,'902:0 880:0 906:0 907:0 '),\n+(906,'SVNBridge2S',0,33,33,33,45,3000,7000,0,0,-12090.1,-139.679,35.2928,0.399245,'903:0 905:0 910:0 '),\n+(907,'SVCHub1',0,33,33,33,45,3000,7000,0,0,-11853.5,-167.599,15.3333,0.51312,'862:0 880:0 905:0 '),\n+(908,'SavageCoastW3',0,33,301,33,45,3000,7000,0,0,-12543.1,74.9728,0.873061,0.513523,'37:0 912:0 '),\n+(909,'SavageCoastW4',0,33,1578,33,45,3000,7000,0,0,-12691.2,142.464,3.092,5.80512,'921:0 924:0 925:0 936:0 '),\n+(910,'SVNBridge3W',0,33,33,33,45,3000,7000,0,0,-12171.4,-240.719,29.8621,0.766786,'906:0 911:0 912:0 '),\n+(911,'SVNBridge3E',0,33,33,33,45,3000,7000,0,0,-12157.4,-431.52,30.3485,1.45204,'874:0 910:0 913:0 '),\n+(912,'MizjahRuins',0,33,129,33,45,3000,7000,0,0,-12468.7,-147.093,13.8431,5.95827,'904:0 908:0 910:0 916:0 '),\n+(913,'SVNHub3',0,33,1740,33,45,3000,7000,0,0,-12127.6,-649.027,14.8876,2.30225,'874:0 876:0 911:0 873:0 875:0 872:0 '),\n+(914,'BaliamahRuins',0,33,127,33,45,3000,7000,0,0,-12540.7,-734.478,39.4424,6.20568,'878:0 915:0 917:0 918:0 '),\n+(915,'SVNHub4',0,33,33,33,45,3000,7000,0,0,-12417,-580.502,11.0755,6.10556,'914:0 874:0 916:0 '),\n+(916,'SVNHub5',0,33,33,33,45,3000,7000,0,0,-12522,-370.721,12.7107,0.882666,'912:0 915:0 917:0 921:0 '),\n+(917,'ZiatajaiRuins',0,33,128,33,45,3000,7000,0,0,-12701.1,-464.07,30.0552,6.19787,'914:0 916:0 918:0 920:0 '),\n+(918,'ZulMamweN',0,33,33,33,45,3000,7000,0,0,-12776.9,-784.489,63.0348,0.421265,'878:0 914:0 917:0 919:0 '),\n+(919,'ZulMamweC',0,33,103,33,45,3000,7000,0,0,-12985.7,-833.459,69.9343,0.193503,'918:0 920:0 '),\n+(920,'ZulMamweW',0,33,103,33,45,3000,7000,0,0,-12943.6,-608.837,53.0521,6.05178,'917:0 919:0 '),\n+(921,'SVSHub1',0,33,33,33,45,3000,7000,0,0,-12826,-301.024,9.96047,5.46666,'916:0 922:0 909:0 925:0 '),\n+(922,'SVSVentureCoMine1',0,33,33,33,45,3000,7000,0,0,-12978,-452.477,53.6008,5.60214,'921:0 923:0 '),\n+(923,'SVSVentureCoMine2',0,33,33,33,45,3000,7000,0,0,-13088.9,-466.483,47.2022,3.61705,'922:0 '),\n+(924,'GurubashiArenaOuterN',0,33,1577,33,45,3000,7000,0,0,-12949,251.702,18.4183,2.2214,'909:0 937:0 '),\n+(925,'STCHub1',0,33,1577,33,45,3000,7000,0,0,-13136.8,-184.248,-3.10173,5.92455,'909:0 921:0 926:0 929:0 '),\n+(926,'CrystalveinMine1',0,33,310,33,45,3000,7000,0,0,-13322.7,-420.202,15.4509,2.04861,'925:0 927:0 928:0 929:0 '),\n+(927,'CrystalveinMine2',0,33,310,33,45,3000,7000,0,0,-13158.5,-564.518,4.64271,0.568135,'926:0 928:0 '),\n+(928,'CrystalveinMine3',0,33,310,33,45,3000,7000,0,0,-13170,-467.696,3.57551,3.1305,'926:0 927:0 '),\n+(929,'STCHub2',0,33,1577,33,45,3000,7000,0,0,-13246.3,-110.492,19.5979,5.04296,'926:0 925:0 930:0 '),\n+(930,'GurubashiOuterSE',0,33,1741,33,45,3000,7000,0,0,-13280.6,57.3154,17.1498,4.95263,'929:0 931:0 932:0 933:0 934:0 '),\n+(931,'GurubashiOuterSSE',0,33,1741,33,45,3000,7000,0,0,-13402.5,96.0163,23.7905,6.03724,'930:0 932:0 933:0 934:0 935:0 943:0 944:0 '),\n+(932,'RuinsOfJubuwal',0,33,477,33,45,3000,7000,0,0,-13382.8,-24.5642,22.0332,0.894086,'930:0 931:0 '),\n+(933,'GurubashiArenaInside1',0,33,2177,33,45,3000,7000,0,0,-13216,312.587,21.8574,3.50161,'930:0 931:0 934:0 '),\n+(934,'GurubashiArenaInside2',0,33,2177,33,45,3000,7000,0,0,-13163.8,257.166,21.8574,3.62531,'930:0 931:0 933:0 '),\n+(935,'STCHub3',0,33,1577,33,45,3000,7000,0,0,-13475.6,312.292,31.942,5.22555,'931:0 938:0 942:0 '),\n+(936,'SSavageCoast1',0,33,1578,33,45,3000,7000,0,0,-12862.3,459.666,6.403,4.74253,'909:0 937:0 '),\n+(937,'GurubashiArenaOuterW',0,33,1741,33,45,3000,7000,0,0,-13076.6,428.328,24.6507,6.12678,'924:0 936:0 938:0 '),\n+(938,'GurubashiArenaOuterSW',0,33,1577,33,45,3000,7000,0,0,-13273.2,479.65,3.7542,5.77924,'935:0 937:0 939:0 940:0 '),\n+(939,'BloodsailCompoundW',0,33,1739,33,45,3000,7000,0,0,-13331.9,777.87,2.16424,3.85895,'938:0 940:0 941:0 '),\n+(940,'BloodsailCompoundC',0,33,1739,33,45,3000,7000,0,0,-13470.3,687.069,8.46535,3.18977,'938:0 939:0 941:0 '),\n+(941,'SSavageCoast2',0,33,1578,33,45,3000,7000,0,0,-13705.9,620.54,10.152,3.17013,'939:0 940:0 966:0 968:0 '),\n+(942,'STCHub4',0,33,1577,33,45,3000,7000,0,0,-13618.7,330.576,43.7429,5.59271,'935:0 943:0 968:0 '),\n+(943,'STCHub5',0,33,1577,33,45,3000,7000,0,0,-13719.1,129.331,23.7103,3.72188,'931:0 942:0 944:0 964:0 965:0 '),\n+(944,'STCHub6',0,33,1577,33,45,3000,7000,0,0,-13572.2,-93.8439,42.7481,1.44857,'931:0 943:0 945:0 '),\n+(945,'RuinsOfAboraz',0,33,311,33,45,3000,7000,0,0,-13627.7,-351.772,12.434,1.10692,'944:0 946:0 '),\n+(946,'CrystalShore1',0,33,302,33,45,3000,7000,0,0,-13867.2,-89.5993,18.4363,2.92315,'945:0 947:0 964:0 '),\n+(947,'CrystalShore2',0,33,302,33,45,3000,7000,0,0,-14086.6,-142.781,3.55938,1.30916,'946:0 948:0 '),\n+(948,'WildShore1',0,33,43,33,45,3000,7000,0,0,-14260.2,-15.7846,3.81308,5.84287,'947:0 949:0 '),\n+(949,'WildShore2',0,33,43,33,45,3000,7000,0,0,-14293.2,109.305,7.5176,0.82025,'948:0 950:0 962:0 '),\n+(950,'WildShore3',0,33,43,33,45,3000,7000,0,0,-14585.8,177.319,2.91916,6.15507,'949:0 951:0 952:0 955:0 958:0 '),\n+(951,'WildShore4',0,33,43,33,45,3000,7000,0,0,-14708.6,511.328,2.52661,5.16547,'950:0 952:0 '),\n+(952,'WildShoreShips1',0,33,43,33,45,3000,7000,0,0,-14894,302.458,3.67936,4.08476,'950:0 951:0 953:0 954:0 955:0 '),\n+(953,'WildShoreShips1Left',0,33,43,33,45,3000,7000,0,0,-14940,357.129,0.221882,0.0694,'952:0 '),\n+(954,'WildShoreShips1Right',0,33,43,33,45,3000,7000,0,0,-15009.9,266.91,0.198072,0.0485881,'952:0 '),\n+(955,'WildShoreShips2',0,33,43,33,45,3000,7000,0,0,-14843.8,75.9812,2.07268,0.570875,'950:0 952:0 956:0 957:0 '),\n+(956,'WildShoreShips2Center',0,33,43,33,45,3000,7000,0,0,-14926.8,110.764,0.2001,4.9102,'955:0 '),\n+(957,'JagueroIsle1',0,33,297,33,45,3000,7000,0,0,-14817.1,-427.547,1.62653,0.804531,'955:0 958:0 '),\n+(958,'JagueroIsle2',0,33,297,33,45,3000,7000,0,0,-14556.9,-277.709,10.043,3.68499,'950:0 957:0 '),\n+(959,'BootyBayW',0,33,35,33,45,3000,7000,0,0,-14300.4,523.178,8.69884,4.45859,'36:0 960:0 '),\n+(960,'BootyBayS',0,33,35,33,45,3000,7000,0,1,-14462.8,467.081,15.1246,5.4423,'36:0 959:0 '),\n+(961,'BootyBayEntrance',0,33,1577,33,45,3000,7000,0,0,-14249.5,333.168,24.6767,2.49077,'36:0 962:0 967:0 '),\n+(962,'STCHub7',0,33,1577,33,45,3000,7000,0,0,-14217.2,239.309,20.2817,3.77098,'949:0 961:0 963:0 '),\n+(963,'STCHub8',0,33,1577,33,45,3000,7000,0,0,-14073.6,266.586,17.42,5.16308,'962:0 964:0 965:0 '),\n+(964,'MistvaleValley',0,33,1737,33,45,3000,7000,0,0,-13952.8,86.1666,15.8298,5.2161,'76:0 943:0 946:0 963:0 '),\n+(965,'STCHub9',0,33,1577,33,45,3000,7000,0,0,-13879.6,258.837,17.7662,5.83459,'943:0 963:0 '),\n+(966,'SSavageCoast3',0,33,1578,33,45,3000,7000,0,0,-13908.6,676.67,10.0579,5.32409,'967:0 941:0 969:0 '),\n+(967,'SSavageCoast4',0,33,1578,33,45,3000,7000,0,0,-14050.8,500.109,2.8225,0.635261,'961:0 966:0 '),\n+(968,'SSavageCoast5',0,33,1578,33,45,3000,7000,0,0,-13683.6,505.174,34.349,3.2526,'941:0 942:0 969:0 970:0 '),\n+(969,'SSavageCoast6',0,33,1577,33,45,3000,7000,0,0,-13859.9,575.635,44.9464,6.06235,'966:0 968:0 '),\n+(970,'SSavageCoast7',0,33,1577,33,45,3000,7000,0,0,-13849.3,494.156,89.7643,5.84244,'968:0 971:0 '),\n+(971,'SSavageCoast8',0,33,1738,33,45,3000,7000,0,0,-13806.7,377.83,94.1372,2.10198,'970:0 '),\n+(972,'Shadowglen',1,141,188,1,4,3000,7000,0,2,10281,1001.05,1342.98,5.96933,'33:0 62:0 '),\n+(973,'ShadowthreadCaveInside',1,141,257,1,10,3000,7000,0,2,10936.3,951.018,1322.87,0.852457,'62:0 '),\n+(974,'ShadowglenExit1',1,141,188,1,10,3000,7000,0,2,10236.2,699.749,1353.3,3.24203,'33:0 975:0 '),\n+(975,'ShadowglenExit2',1,141,141,1,10,3000,7000,0,2,9988.41,591.889,1315.9,0.829698,'974:0 976:0 983:0 '),\n+(976,'StarbreezeVillage',1,141,260,1,10,3000,7000,0,2,9825.13,399.226,1308.15,0.857567,'975:0 977:0 978:0 '),\n+(977,'StarbreezeBackyard',1,141,141,1,10,3000,7000,0,2,10038.9,286.037,1323.77,1.89429,'976:0 '),\n+(978,'TeldrassilS1',1,141,141,1,10,3000,7000,0,2,9396.17,568.108,1320.55,0.244948,'976:0 979:0 '),\n+(979,'TeldrassilS2',1,141,141,1,10,3000,7000,0,2,9232.75,931.478,1321.37,5.94693,'978:0 980:0 '),\n+(980,'TeldrassilS3',1,141,141,1,10,3000,7000,0,2,9171.08,1419.38,1320.31,5.13404,'979:0 981:0 '),\n+(981,'TeldrassilHubS1',1,141,141,1,10,3000,7000,0,2,9352.14,1496.95,1274.46,0.140488,'980:0 982:0 34:0 988:0 '),\n+(982,'GnarlpineHold',1,141,261,5,10,3000,7000,0,2,9106.12,1796.37,1324.94,4.59408,'981:0 '),\n+(983,'DolanaarRoadE',1,141,141,1,10,3000,7000,0,2,9883.36,802.735,1309.84,1.38768,'975:0 63:0 34:0 '),\n+(984,'FelRockInside',1,141,258,1,10,3000,7000,0,2,10112.3,1195.5,1312.02,5.06294,'63:0 '),\n+(985,'DolanaarRoadW',1,141,141,1,10,3000,7000,0,2,9956.16,1248.6,1307.74,2.3227,'34:0 64:0 989:0 '),\n+(986,'BanethilBarrowDenInside',1,141,262,4,10,3000,7000,0,2,9759.16,1553.23,1264.26,3.07786,'64:0 '),\n+(987,'TeldrassilHubW1',1,141,141,1,10,3000,7000,0,2,10032.9,1820.23,1320.1,4.58073,'64:0 988:0 989:0 990:0 992:0 '),\n+(988,'PoolsOfArlithrien',1,141,478,1,10,3000,7000,0,2,9596.69,1802.05,1293.91,5.64964,'981:0 987:0 '),\n+(989,'TeldrassilHubW2',1,141,141,1,10,3000,7000,0,2,10162.3,1440.21,1325.14,3.89821,'985:0 987:0 '),\n+(990,'OracleGladeRoad',1,141,141,4,10,3000,7000,0,2,10352,1874.33,1324.48,6.02465,'987:0 991:0 '),\n+(991,'OracleGlade',1,141,264,1,10,3000,7000,0,2,10884.7,2071.72,1327.43,2.94589,'990:0 '),\n+(992,'DarnassusEntrance',1,1657,1657,1,60,3000,7000,0,3,9945.1,2019.66,1351.87,4.64235,'987:0 '),\n+(993,'AuberdineSpawn',1,148,442,8,20,3000,7000,0,3,6553.45,522.918,11.8561,3.67005,'59:0 994:0 '),\n+(994,'LongWash1',1,148,453,8,20,3000,7000,0,2,6232.15,537.866,7.35703,5.18,'59:0 993:0 995:0 1008:0 '),\n+(995,'LongWash2',1,148,2077,8,20,3000,7000,0,2,5552.17,453.898,19.6886,6.27955,'994:0 996:0 1005:0 1008:0 '),\n+(996,'TwilightShore1',1,148,2078,14,20,3000,7000,0,2,5012.98,536.041,5.96794,4.54499,'995:0 997:0 1005:0 95:0 '),\n+(997,'TwilightShore2',1,148,2078,14,20,3000,7000,0,2,4688.48,865.878,2.79823,2.76606,'996:0 998:0 999:0 '),\n+(998,'TwilightShore3',1,148,2078,14,20,3000,7000,0,2,4503.92,906.145,4.30626,5.45958,'997:0 1002:0 1038:0 '),\n+(999,'RemtravelsExcavation',1,148,450,8,20,3000,7000,0,2,4714.44,550.759,26.823,1.95474,'997:0 1000:0 95:0 94:0 '),\n+(1000,'RemtravelsExcavationInside1',1,148,450,14,20,3000,7000,0,2,4620.8,642.65,6.43919,5.10026,'999:0 1001:0 '),\n+(1001,'RemtravelsExcavationInside2',1,148,450,14,20,3000,7000,0,2,4567.99,561.83,1.27184,0.69615,'1000:0 '),\n+(1002,'DarkshoreExitSW',1,148,2077,8,20,3000,7000,0,2,4243.34,412.704,58.3351,0.245327,'998:0 1003:0 1027:0 '),\n+(1003,'DarkshoreExitFork',1,148,2077,8,20,3000,7000,0,2,4395.16,213.188,52.2559,2.29326,'1002:0 1004:0 94:0 1006:0 '),\n+(1004,'DarkshoreExitSE',1,148,2077,8,20,3000,7000,0,2,4141.67,41.4988,23.6074,3.67163,'1003:0 1028:0 '),\n+(1005,'WindbendRiverN',1,148,2077,8,20,3000,7000,0,2,5261.19,254.236,30.0406,3.18665,'995:0 996:0 95:0 1008:0 1009:0 '),\n+(1006,'MastersGlaiveRoad',1,148,2077,8,20,3000,7000,0,2,4568.13,285.307,57.6068,1.63547,'94:0 95:0 1003:0 1007:0 '),\n+(1007,'MastersGlaive',1,148,449,8,20,3000,7000,0,2,4541.58,449.011,32.0175,5.01071,'1006:0 '),\n+(1008,'AmetharanRoad',1,148,2077,8,20,3000,7000,0,2,5720.14,311.438,20.1904,4.41184,'59:0 994:0 995:0 1005:0 1009:0 1010:0 '),\n+(1009,'Ametharan',1,148,447,8,20,3000,7000,0,2,5586.01,84.3345,27.1266,1.57459,'1005:0 1008:0 1010:0 '),\n+(1010,'AmetharanN',1,148,447,8,20,3000,7000,0,2,5801.69,83.785,34.5622,2.98046,'59:0 1008:0 1009:0 1011:0 '),\n+(1011,'DarkshoreMoonkins',1,148,148,8,20,3000,7000,0,2,6267.1,23.9018,32.4976,3.19251,'59:0 1010:0 1012:0 1013:0 '),\n+(1012,'DarkshoreNRoad1',1,148,148,8,20,3000,7000,0,2,6568,183.3,33.0481,3.37511,'59:0 1011:0 1013:0 1014:0 '),\n+(1013,'BashalAran',1,148,446,8,20,3000,7000,0,2,6724.32,-182.155,32.4813,2.68198,'1011:0 1012:0 1014:0 '),\n+(1014,'DarkshoreNRoad2',1,148,148,8,20,3000,7000,0,2,6818.81,102.669,19.5599,2.84101,'1012:0 1013:0 1015:0 '),\n+(1015,'DarkshoreNRoad3',1,148,148,8,20,3000,7000,0,2,6851.5,-74.339,19.6655,5.58399,'1014:0 1016:0 1022:0 '),\n+(1016,'DarkshoreNRoad4',1,148,148,8,20,3000,7000,0,2,7119.42,-81.8027,14.4199,3.09232,'1015:0 1017:0 1022:0 '),\n+(1017,'DarkshoreNRoad5',1,148,148,8,20,3000,7000,0,2,7256.24,-291.22,21.0422,4.79468,'1016:0 1018:0 1022:0 '),\n+(1018,'DarkshoreNRoad6',1,148,148,8,20,3000,7000,0,2,7251.65,-503.552,27.2626,1.57453,'1017:0 1019:0 1023:0 1026:0 1024:0 '),\n+(1019,'CliffspringFalls1',1,148,445,8,20,3000,7000,0,2,6945.23,-647.544,58.2647,0.698808,'1018:0 96:0 1022:0 '),\n+(1020,'CliffspringFallsInside1',1,148,445,8,20,3000,7000,0,2,6751.15,-678.916,69.6518,0.322209,'96:0 '),\n+(1021,'CliffspringFallsInside2',1,148,445,8,20,3000,7000,0,2,6801.08,-758.228,69.6369,1.04478,'96:0 '),\n+(1022,'CliffspringRiverCamp',1,148,456,8,20,3000,7000,0,2,6874.54,-444.951,41.5568,5.10331,'1015:0 1016:0 1017:0 1019:0 '),\n+(1023,'TowerOfAlthalaxx',1,148,444,14,20,3000,7000,0,2,7134.02,-794.131,67.6245,1.1665,'1018:0 1024:0 '),\n+(1024,'RuinsOfMathystra1',1,148,443,14,20,3000,7000,0,2,7266.69,-945.767,35.1327,5.29378,'1018:0 1023:0 1025:0 1026:0 '),\n+(1025,'RuinsOfMathystra2',1,148,443,14,20,3000,7000,0,2,7600.47,-1097.96,49.7759,2.73731,'1026:0 1024:0 '),\n+(1026,'RuinsOfMathystra3',1,148,443,14,20,3000,7000,0,2,7493.36,-767.521,12.9545,3.62677,'1018:0 1025:0 1024:0 '),\n+(1027,'ZoramStrandFork',1,331,331,18,30,3000,7000,0,2,3817.2,679.137,5.10897,5.73165,'1002:0 1035:0 1036:0 1039:0 '),\n+(1028,'AshenvaleNW_hub1',1,331,331,18,30,3000,7000,0,0,3974.7,-4.75098,16.9651,0.475045,'157:0 1004:0 1029:0 '),\n+(1029,'AshenvaleNW_hub2',1,331,331,18,30,3000,7000,0,0,3657.91,209.708,2.09702,5.65554,'156:0 1028:0 1030:0 1031:0 '),\n+(1030,'AshenvaleNW_hub3',1,331,331,18,30,3000,7000,0,0,3467.65,456.674,-1.34147,5.28246,'1029:0 1031:0 1032:0 1033:0 1035:0 '),\n+(1031,'AshenvaleNW_hub4',1,331,413,18,30,3000,7000,0,0,3455.92,219.392,12.6662,4.49903,'156:0 1029:0 1030:0 1033:0 '),\n+(1032,'AshenvaleNW_hub5',1,331,441,18,30,3000,7000,0,0,3249.97,704.667,5.38086,5.25498,'1030:0 1034:0 '),\n+(1033,'MaestrasPost',1,331,413,18,30,3000,7000,0,0,3259.03,232.17,11.012,5.89391,'156:0 1030:0 1031:0 1034:0 1040:0 '),\n+(1034,'LakeFalathim',1,331,441,18,30,3000,7000,0,0,3042.8,537.807,4.22352,5.78789,'1032:0 1033:0 '),\n+(1035,'ZoramStrandExit',1,331,331,18,30,3000,7000,0,0,3657.05,656.795,4.96231,0.51393,'158:0 1027:0 1030:0 1036:0 '),\n+(1036,'ZoramStrandC',1,331,414,18,30,3000,7000,0,0,3801.56,849.009,0.513784,2.44601,'158:0 1027:0 1035:0 1037:0 1039:0 '),\n+(1037,'ZoramStrandS',1,331,414,18,30,3000,7000,0,0,3530.82,1106.94,3.5186,5.37358,'158:0 1036:0 '),\n+(1038,'ZoramStrandNWIsle',1,331,414,18,30,3000,7000,0,0,4170.75,1326.83,19.2012,4.42522,'998:0 1039:0 '),\n+(1039,'ZoramStrandN',1,331,414,18,30,3000,7000,0,0,4069.2,824.531,3.14713,3.15877,'1027:0 1036:0 1038:0 '),\n+(1040,'MaestraHighway1',1,331,413,18,30,3000,7000,0,0,3098.29,226.932,38.2729,0.113369,'1033:0 1041:0 '),\n+(1041,'MaestraHighway2',1,331,413,18,30,3000,7000,0,0,3010.21,148.647,65.398,0.16052,'1040:0 1042:0 '),\n+(1042,'MaestraHighway3',1,331,331,18,30,3000,7000,0,0,2859.2,196.478,94.7169,5.92141,'1041:0 1043:0 '),\n+(1043,'MaestraHighway4',1,331,331,18,30,3000,7000,0,0,2812.81,41.9868,95.6736,1.28951,'1042:0 1044:0 1058:0 '),\n+(1044,'ThistlefurVillageExit',1,331,331,18,30,3000,7000,0,0,2868.2,-73.4622,101.174,1.57029,'1043:0 1045:0 1046:0 1056:0 1058:0 '),\n+(1045,'ThistlefurVillageRoad1',1,331,331,18,30,3000,7000,0,0,3135.26,-172.008,106.895,2.338,'1044:0 1046:0 1047:0 1051:0 '),\n+(1046,'ThistlefurVillageRoad2',1,331,331,18,30,3000,7000,0,0,3105.59,-62.1211,99.9184,3.67319,'1044:0 1045:0 '),\n+(1047,'ThistlefurVillage1',1,331,2301,18,30,3000,7000,0,0,3406.44,-322.711,134.117,2.65215,'1045:0 1048:0 '),\n+(1048,'ThistlefurVillage2',1,331,2301,18,30,3000,7000,0,0,3405.57,-442.447,153.072,1.32875,'1047:0 1049:0 1051:0 '),\n+(1049,'ThistlefurVillage3',1,331,2301,18,30,3000,7000,0,0,3502.9,-501.921,187.011,2.83083,'1048:0 1050:0 '),\n+(1050,'ThistlefurVillage4',1,331,2301,18,30,3000,7000,0,0,3340.18,-745.556,165.112,0.56888,'1049:0 '),\n+(1051,'ThistlefurVillage5',1,331,331,18,30,3000,7000,0,0,3151.47,-574.826,152.496,0.537465,'1045:0 1048:0 1052:0 '),\n+(1052,'IrisLakeFork',1,331,424,18,30,3000,7000,0,0,2898.98,-769.452,163.783,4.51548,'1051:0 1053:0 1054:0 1055:0 '),\n+(1053,'IrisLake',1,331,424,18,30,3000,7000,0,0,2942.58,-1048.01,198.163,1.57223,'1052:0 '),\n+(1054,'AshenvaleC_hub1',1,331,331,18,30,3000,7000,0,0,2507.45,-866.571,135.152,0.193841,'1052:0 1055:0 1065:0 '),\n+(1055,'AshenvaleC_hub2',1,331,415,18,30,3000,7000,0,0,2438.14,-533.1,114.408,0.47461,'38:0 1052:0 1054:0 1057:0 1059:0 '),\n+(1056,'AshenvaleC_hub3',1,331,415,18,30,3000,7000,0,2,2850.97,-220.421,105.829,4.13457,'38:0 1044:0 '),\n+(1057,'AshenvaleC_hub4h',1,331,415,18,30,3000,7000,0,0,2496.08,-368.618,107.608,4.35054,'1055:0 1058:0 '),\n+(1058,'AshenvaleC_hub5h',1,331,415,18,30,3000,7000,0,0,2723.63,-97.6203,94.1401,0.260605,'1043:0 1044:0 1057:0 1060:0 '),\n+(1059,'RuinsOfStardust',1,331,418,18,30,3000,7000,0,0,2078.15,-208.159,97.3023,6.04115,'1055:0 1063:0 '),\n+(1060,'FireScarShrine1',1,331,417,18,30,3000,7000,0,0,2256.66,75.4186,101.15,2.42832,'1058:0 1061:0 '),\n+(1061,'FireScarShrine2',1,331,417,18,30,3000,7000,0,0,2216.37,200.114,132.147,0.0014348,'1060:0 1062:0 '),\n+(1062,'FireScarShrine3',1,331,417,18,30,3000,7000,0,0,2267.87,408.396,133.106,0.831985,'1061:0 '),\n+(1063,'MystralLakeW',1,331,421,18,30,3000,7000,0,0,2023,-843.478,97.5457,1.65663,'1064:0 1059:0 165:0 168:0 '),\n+(1064,'MystralLakeC',1,331,421,18,30,3000,7000,0,0,1984.95,-1113.44,95.5274,1.49563,'1063:0 165:0 1067:0 '),\n+(1065,'AshenvaleC_hub6',1,331,331,18,30,3000,7000,0,0,2450.24,-1258.76,125.028,2.45577,'1054:0 1066:0 1068:0 1071:0 '),\n+(1066,'AshenvaleC_hub7',1,331,331,18,30,3000,7000,0,0,2235.23,-1257.52,78.4907,4.80606,'166:0 1065:0 165:0 '),\n+(1067,'AshenvaleC_hub8',1,331,331,18,30,3000,7000,0,0,1948.15,-1576.73,62.1809,2.79343,'167:0 1064:0 1069:0 '),\n+(1068,'AshenvaleC_hub9',1,331,426,18,30,3000,7000,0,0,2312.84,-1688.24,121.859,1.16373,'166:0 1065:0 1072:0 1074:0 '),\n+(1069,'AshenvaleC_hub10',1,331,331,18,30,3000,7000,0,0,2066.34,-1671.01,66.4345,2.13565,'166:0 1067:0 1070:0 '),\n+(1070,'AshenvaleE_hub1',1,331,2457,18,30,3000,7000,0,0,2042.45,-1869.26,98.5045,1.0065,'1069:0 1074:0 1106:0 '),\n+(1071,'AshenvaleC_hub11',1,331,331,18,30,3000,7000,0,1,2610.58,-1273.73,147.484,1.45233,'1065:0 1072:0 '),\n+(1072,'AshenvaleC_hub12',1,331,426,18,30,3000,7000,0,0,2492.08,-1690.32,135.531,1.25401,'1068:0 1071:0 1073:0 '),\n+(1073,'AshenvaleC_hub13',1,331,2457,18,30,3000,7000,0,0,2524.32,-1885.69,143.053,1.82734,'1072:0 1074:0 1075:0 '),\n+(1074,'AshenvaleC_hub14',1,331,2457,18,30,3000,7000,0,0,2243.34,-1738.27,110.775,5.1594,'1068:0 1073:0 1070:0 '),\n+(1075,'AshenvaleExitN1',1,331,2457,18,30,3000,7000,0,0,2722.91,-1983,158.23,2.65788,'1073:0 1076:0 1078:0 '),\n+(1076,'AshenvaleExitN2',1,331,2457,18,30,3000,7000,0,0,3188.58,-1706.76,164.247,3.95184,'1075:0 1077:0 '),\n+(1077,'AshenvaleExitN3',1,331,2457,18,30,3000,7000,0,0,3297.65,-1543.44,164.945,5.56976,'1076:0 1118:0 '),\n+(1078,'AshenvaleC_hub14',1,331,2457,18,30,3000,7000,0,0,2434.66,-2007.27,137.863,5.44996,'159:0 1075:0 '),\n+(1079,'FalfarenRiverN1',1,331,433,18,30,3000,7000,0,0,2635.78,-2457.48,169.635,2.50866,'159:0 1080:0 1086:0 '),\n+(1080,'FalfarenRiverN2',1,331,433,18,30,3000,7000,0,0,2714.01,-2536.19,182.43,2.13757,'1079:0 1081:0 160:0 '),\n+(1081,'NightRunE',1,331,428,18,30,3000,7000,0,0,2790.65,-2428.46,206.042,3.93612,'1080:0 1082:0 160:0 '),\n+(1082,'NightRun',1,331,428,18,30,3000,7000,0,0,2635.93,-2273.51,202.702,5.29878,'1081:0 1083:0 1084:0 '),\n+(1083,'NightRunC',1,331,428,18,30,3000,7000,0,0,2508.34,-2113.14,200.284,6.10971,'1082:0 1084:0 '),\n+(1084,'NightRunW1',1,331,428,18,30,3000,7000,0,0,2796.44,-2157.58,201.403,3.2489,'1082:0 1083:0 '),\n+(1085,'ForestSongEntranceW',1,331,2358,18,30,3000,7000,0,0,2816.28,-3116.79,176.969,1.10278,'160:0 161:0 1088:0 1089:0 '),\n+(1086,'AshenvaleE_hub2',1,331,2457,18,30,3000,7000,0,0,2468.98,-2717.07,150.406,4.36767,'1079:0 1087:0 1114:0 '),\n+(1087,'AshenvaleE_hub3',1,331,2457,18,30,3000,7000,0,0,2544.03,-2863.47,160.596,1.768,'1086:0 1088:0 '),\n+(1088,'SatyrnaarEntrance',1,331,2457,18,30,3000,7000,0,0,2634.38,-3046.12,161.142,6.24673,'1085:0 1087:0 1089:0 1090:0 1096:0 '),\n+(1089,'Satyrnaar',1,331,430,18,30,3000,7000,0,0,2728.6,-2942.91,140.775,5.09219,'1085:0 1088:0 '),\n+(1090,'AshenvaleE_hub4',1,331,2457,18,30,3000,7000,0,0,2718.15,-3174.63,154.002,4.95083,'1088:0 1091:0 '),\n+(1091,'AshenvaleE_hub5',1,331,2457,18,30,3000,7000,0,0,2747.9,-3325.14,129.722,0.481917,'161:0 1090:0 1092:0 1096:0 1097:0 '),\n+(1092,'AshenvaleE_hub6',1,331,2457,18,30,3000,7000,0,0,2858.75,-3503.4,106.63,0.432834,'1091:0 1093:0 1095:0 '),\n+(1093,'BoughShadowEntrance',1,331,2358,18,30,3000,7000,0,0,3097.87,-3414.65,140.149,2.35511,'161:0 1092:0 1094:0 '),\n+(1094,'BoughShadow',1,331,438,50,60,3000,7000,0,0,3193.56,-3715.88,121.867,1.87405,'1093:0 '),\n+(1095,'AshenvaleExitE1',1,331,2457,18,30,3000,7000,0,0,2885.88,-3697.95,96.0233,1.45779,'1092:0 1269:0 '),\n+(1096,'WarsongLumberCampW1',1,331,437,18,30,3000,7000,0,0,2228.79,-3249.63,101.566,0.607582,'1088:0 1091:0 1097:0 1099:0 '),\n+(1097,'WarsongLumberCampE1',1,331,437,18,30,3000,7000,0,0,2451.74,-3379.23,102.331,4.70735,'1091:0 1096:0 1098:0 1356:0 '),\n+(1098,'KargathiaKeep',1,331,2637,18,30,3000,7000,0,2,2437.92,-3546.25,98.3118,2.20389,'1097:0 '),\n+(1099,'FelfireHillFork',1,331,434,18,30,3000,7000,0,0,2080.86,-3145.14,101.473,3.35095,'1116:0 162:0 1096:0 1356:0 '),\n+(1100,'DemonFallRidgeW1',1,331,436,18,30,3000,7000,0,0,1674.45,-3019.31,126.383,5.53436,'162:0 1101:0 '),\n+(1101,'DemonFallRidgeW2',1,331,436,18,30,3000,7000,0,0,1590.49,-2969.19,181.724,5.65806,'1100:0 1102:0 '),\n+(1102,'DemonFallRidgeW3',1,331,436,18,30,3000,7000,0,0,1540.54,-2824.95,181.724,2.53218,'1101:0 1103:0 '),\n+(1103,'DemonFallRidgeW4',1,331,436,18,30,3000,7000,0,0,1461.22,-2803.04,146.324,2.97199,'1102:0 '),\n+(1104,'DemonFallRidgeE1',1,331,435,18,30,3000,7000,0,0,1627.48,-3316.31,144.676,0.784629,'162:0 1105:0 '),\n+(1105,'DemonFallRidgeE2',1,331,435,18,30,3000,7000,0,0,1721.33,-3476.04,144.293,2.30437,'1104:0 '),\n+(1106,'AshenvaleE_hub7',1,331,433,18,30,3000,7000,0,0,1988.27,-1943.15,97.1296,1.1247,'1070:0 1107:0 '),\n+(1107,'AshenvaleE_hub8',1,331,2457,18,30,3000,7000,0,0,1962.79,-2012.8,96.2461,1.06579,'1106:0 1108:0 '),\n+(1108,'AshenvaleE_hub9',1,331,2457,18,30,3000,7000,0,0,1921.52,-2170.42,94.4681,2.67153,'1107:0 1109:0 1113:0 '),\n+(1109,'AshenvaleE_hub10',1,331,2457,18,30,3000,7000,0,0,1650,-2198.36,90.4962,0.191633,'163:0 1108:0 1110:0 1111:0 1112:0 '),\n+(1110,'AshenvaleExitSh',1,331,2457,18,30,3000,7000,0,0,1372.44,-2259.8,89.962,3.46083,'1111:0 1109:0 1112:0 169:0 1518:0 '),\n+(1111,'AshenvaleExitSa',1,17,1703,8,25,3000,7000,0,2,1283.04,-2337.27,95.7661,5.44005,'1109:0 1110:0 1519:0 '),\n+(1112,'AshenvaleE_hub11',1,331,422,18,30,3000,7000,0,0,1407.02,-2005.8,95.7095,5.15141,'1109:0 1110:0 '),\n+(1113,'SplintertreePostRoadW',1,331,431,18,30,3000,7000,0,0,1994.45,-2424.98,91.2477,1.28488,'164:0 175:0 1108:0 1114:0 '),\n+(1114,'SplintertreePostFork',1,331,2457,18,30,3000,7000,0,0,2176.5,-2659.1,114.31,6.03653,'175:0 1086:0 1113:0 1115:0 '),\n+(1115,'SplintertreePostRoadE',1,331,2457,18,30,3000,7000,0,0,2082.36,-2724.41,108.011,0.790059,'164:0 1114:0 1116:0 '),\n+(1116,'FelfireHillBridgeW',1,331,434,18,30,3000,7000,0,0,2039.97,-2914.67,108.448,1.43407,'1099:0 1115:0 1356:0 '),\n+(1117,'DorDanilarrowDenInside',1,331,432,18,30,3000,7000,0,0,1800.96,-2749.28,74.2595,4.55915,'164:0 '),\n+(1118,'FelwoodExitS',1,361,361,46,56,3000,7000,0,0,3743.81,-1481.83,196.177,3.29581,'1077:0 1119:0 '),\n+(1119,'EmeraldSanctuaryFork',1,361,2479,46,56,3000,7000,0,0,3880.67,-1320.46,216.16,2.5595,'1118:0 1120:0 1123:0 1124:0 '),\n+(1120,'DeadwoodVillage1',1,361,1761,46,56,3000,7000,0,0,3687.18,-1161.35,207.07,5.5283,'1119:0 1121:0 1122:0 '),\n+(1121,'DeadwoodVillage2',1,361,1761,46,56,3000,7000,0,0,3530.84,-1083.16,232.998,0.383932,'1120:0 1122:0 '),\n+(1122,'DeadwoodVillage3',1,361,361,46,56,3000,7000,0,0,3799.15,-1018.83,233.051,3.60798,'1120:0 1121:0 1124:0 1149:0 '),\n+(1123,'EmeraldSanctuary',1,361,2479,46,56,3000,7000,0,1,4008.37,-1323.24,254.74,2.01756,'1119:0 1124:0 '),\n+(1124,'FelwoodRoad1',1,361,361,46,56,3000,7000,0,0,3917.77,-1102.56,251.192,4.86854,'1119:0 1122:0 1123:0 1125:0 1149:0 '),\n+(1125,'FelwoodRoad2',1,361,361,46,56,3000,7000,0,0,4111.01,-1000.91,273.994,3.79844,'1124:0 1126:0 1149:0 1155:0 '),\n+(1126,'FelwoodRoad3',1,361,361,46,56,3000,7000,0,0,4217.57,-895.05,283.719,4.15774,'1125:0 1127:0 1149:0 1156:0 1157:0 1158:0 '),\n+(1127,'FelwoodRoad4',1,361,361,46,56,3000,7000,0,0,4284.53,-848.098,284.982,3.75914,'1126:0 1128:0 '),\n+(1128,'FelwoodRoad5',1,361,361,46,56,3000,7000,0,0,4421.12,-848.39,292.935,3.21525,'1127:0 1129:0 1157:0 '),\n+(1129,'FelwoodRoad6',1,361,361,46,56,3000,7000,0,0,4543.91,-853.393,298.894,3.13867,'1128:0 1130:0 '),\n+(1130,'FelwoodRoad7',1,361,361,46,56,3000,7000,0,0,4626.9,-811.164,299.948,3.55493,'1129:0 1131:0 1158:0 '),\n+(1131,'FelwoodRoad8',1,361,361,46,56,3000,7000,0,0,4816.57,-743.65,300.125,3.49799,'1130:0 1132:0 1162:0 '),\n+(1132,'FelwoodRoad9',1,361,361,46,56,3000,7000,0,0,4924.41,-736.286,307.085,3.21525,'1131:0 1133:0 1161:0 '),\n+(1133,'FelwoodRoad10',1,361,361,46,56,3000,7000,0,0,5067.29,-754.16,325.077,3.06602,'1132:0 1134:0 1162:0 '),\n+(1134,'FelwoodRoad11',1,361,361,46,56,3000,7000,0,0,5190.8,-721.312,342.065,3.32245,'1133:0 1135:0 1163:0 '),\n+(1135,'FelwoodRoad12',1,361,1765,46,56,3000,7000,0,0,5321.67,-714.318,345.44,3.1693,'1134:0 1136:0 1175:0 '),\n+(1136,'FelwoodRoad13',1,361,361,46,56,3000,7000,0,0,5528.6,-586.974,357.722,3.70533,'1135:0 1137:0 1175:0 1176:0 '),\n+(1137,'FelwoodRoad14',1,361,361,46,56,3000,7000,0,0,5829.53,-657.626,373.409,2.93956,'1136:0 1138:0 1176:0 1177:0 '),\n+(1138,'FelwoodRoad15',1,361,361,46,56,3000,7000,0,0,6212.38,-740.556,409.705,2.87084,'1137:0 1139:0 '),\n+(1139,'FelwoodRoad16',1,361,361,46,56,3000,7000,0,0,6248.94,-853.467,415.845,1.8714,'1138:0 1140:0 1180:0 1188:0 '),\n+(1140,'FelwoodRoad17',1,361,361,46,56,3000,7000,0,0,6316.22,-1000.95,421.045,1.77912,'1139:0 1141:0 1181:0 '),\n+(1141,'FelwoodRoad18',1,361,361,46,56,3000,7000,0,0,6517.96,-1128.86,435.787,2.40548,'1140:0 1142:0 1187:0 '),\n+(1142,'FelwoodRoad19',1,361,361,46,56,3000,7000,0,0,6589.42,-1238.14,446.438,2.19734,'1141:0 1143:0 1181:0 149:0 '),\n+(1143,'FelwoodRoad20',1,361,361,46,56,3000,7000,0,0,6642.07,-1424.29,466.141,1.83997,'1142:0 1144:0 149:0 1190:0 '),\n+(1144,'FelwoodRoad21',1,361,361,46,56,3000,7000,0,0,6582.2,-1624.29,494.577,1.32358,'1143:0 1145:0 1190:0 '),\n+(1145,'FelwoodRoad22',1,361,361,46,56,3000,7000,0,0,6510.95,-1745.71,510.835,1.13311,'1144:0 1146:0 1183:0 '),\n+(1146,'FelwoodRoad23',1,361,361,46,56,3000,7000,0,0,6528.61,-1901.05,539.009,1.63379,'1145:0 1147:0 1191:0 1193:0 '),\n+(1147,'FelwoodRoad24',1,361,361,46,56,3000,7000,0,0,6558.12,-2008.36,559.656,1.52776,'1146:0 1148:0 1193:0 '),\n+(1148,'FelwoodRoad25',1,361,361,46,56,3000,7000,0,0,6560.77,-2085.29,574.689,1.48063,'1147:0 1191:0 148:0 '),\n+(1149,'JadefireGlenEntrance',1,361,361,46,56,3000,7000,0,0,3926.58,-911.03,268.957,1.31568,'1122:0 1124:0 1125:0 1126:0 1150:0 1157:0 '),\n+(1150,'JadefireGlen1',1,361,2480,46,56,3000,7000,0,0,3811.45,-783.703,310.11,5.52543,'1149:0 1151:0 1152:0 1153:0 '),\n+(1151,'JadefireGlen2',1,361,2480,46,56,3000,7000,0,0,3718.85,-847.307,312.709,0.532263,'1150:0 '),\n+(1152,'JadefireGlen3',1,361,2480,46,56,3000,7000,0,0,3912.89,-762.669,314.637,3.43039,'1150:0 '),\n+(1153,'JadefireGlen4',1,361,2480,46,56,3000,7000,0,0,3856.5,-672.112,328.888,4.11173,'1150:0 1154:0 '),\n+(1154,'JadefireGlen5',1,361,2480,46,56,3000,7000,0,0,4036.91,-552.243,344.95,3.72492,'1153:0 '),\n+(1155,'FelwoodSide1_1',1,361,361,46,56,3000,7000,0,0,4213.32,-1147.96,320.929,1.94598,'1125:0 1156:0 '),\n+(1156,'FelwoodSide1_2',1,361,361,46,56,3000,7000,0,0,4310.85,-1068.85,323.86,2.16393,'1126:0 1155:0 '),\n+(1157,'FelwoodSide2_1',1,361,361,46,56,3000,7000,0,0,4140.08,-676.318,285.659,4.10583,'1126:0 1128:0 1149:0 '),\n+(1158,'RuinsOfConstellas1',1,361,2481,46,56,3000,7000,0,0,4508.94,-658.169,260.072,5.34478,'1126:0 1130:0 1159:0 '),\n+(1159,'RuinsOfConstellas2',1,361,2481,46,56,3000,7000,0,0,4578.21,-555.417,290.438,2.46629,'1158:0 1160:0 '),\n+(1160,'RuinsOfConstellas3',1,361,2481,46,56,3000,7000,0,0,4580.93,-222.976,301.195,4.57508,'1159:0 '),\n+(1161,'Jaedenar1',1,361,1763,46,56,3000,7000,0,0,4922.62,-656.651,308.014,3.98916,'1132:0 1162:0 '),\n+(1162,'Jaedenar2',1,361,1763,46,56,3000,7000,0,0,4883.95,-595.824,308.56,5.16136,'1131:0 1133:0 1161:0 1163:0 1165:0 1166:0 '),\n+(1163,'BloodvenomPostEntrance',1,361,361,46,56,3000,7000,0,0,5228.11,-538.087,328.617,3.14997,'1134:0 1162:0 1164:0 '),\n+(1164,'BloodvenomPost',1,361,1997,46,56,3000,7000,0,0,5222.93,-365.293,325.373,4.62848,'150:0 1163:0 '),\n+(1165,'ShrineOfTheDeceiver',1,361,1771,46,56,3000,7000,0,0,4783.38,-551.646,274.445,4.62258,'1162:0 '),\n+(1166,'Jaedenar3',1,361,1763,46,56,3000,7000,0,0,4729.93,-453.696,349.944,4.46628,'1162:0 1167:0 '),\n+(1167,'Jaedenar4',1,361,1763,46,56,3000,7000,0,0,4856.52,-382.228,350.288,4.8845,'1166:0 1168:0 '),\n+(1168,'ShadowHold1',1,361,1770,46,56,3000,7000,0,0,4986.27,-445.68,316.676,5.65694,'1167:0 1169:0 '),\n+(1169,'ShadowHold2',1,361,1770,46,56,3000,7000,0,0,5098.64,-485.812,296.677,4.68186,'1168:0 1170:0 '),\n+(1170,'ShadowHold3',1,361,1770,46,56,3000,7000,0,0,5178.54,-485.604,301.227,5.33099,'1169:0 1171:0 '),\n+(1171,'ShadowHold4',1,361,1770,46,56,3000,7000,0,0,5275.41,-671.399,253.46,3.4162,'1170:0 1172:0 '),\n+(1172,'ShadowHold5',1,361,1770,46,56,3000,7000,0,0,5339.64,-532.836,254.255,4.57192,'1171:0 1173:0 1174:0 '),\n+(1173,'ShadowHold6',1,361,1770,46,56,3000,7000,0,0,5427.58,-486.39,248.303,2.98345,'1172:0 '),\n+(1174,'ShadowHold7',1,361,1770,46,56,3000,7000,0,0,5435.52,-425.111,272.429,5.11384,'1172:0 '),\n+(1175,'ShatterScarVale1',1,361,1766,46,56,3000,7000,0,0,5476.34,-722.154,342.284,2.91904,'1135:0 1136:0 1176:0 1178:0 '),\n+(1176,'ShatterScarVale2',1,361,1766,46,56,3000,7000,0,0,5601.44,-768.8,344.125,2.60488,'1136:0 1137:0 1175:0 1178:0 '),\n+(1177,'ShatterScarVale3',1,361,1766,46,56,3000,7000,0,0,5560.13,-1032.72,379.177,1.06354,'1137:0 1178:0 1179:0 '),\n+(1178,'ShatterScarVale4',1,361,1766,46,56,3000,7000,0,0,5457.81,-881.575,366.112,0.423435,'1175:0 1176:0 1177:0 '),\n+(1179,'ShatterScarVale5',1,361,1766,46,56,3000,7000,0,0,5754.61,-1189.42,406.559,5.86624,'1177:0 1180:0 '),\n+(1180,'IrontreeWoods1',1,361,1767,46,56,3000,7000,0,0,6121.79,-1182.38,370.89,3.93611,'1139:0 1179:0 1181:0 1182:0 '),\n+(1181,'IrontreeWoods2',1,361,1767,46,56,3000,7000,0,0,6394.76,-1179.55,386.014,6.27855,'1140:0 1142:0 1180:0 '),\n+(1182,'IrontreeWoods3',1,361,1767,46,56,3000,7000,0,0,6130.52,-1612.09,477.459,1.51512,'1180:0 1183:0 '),\n+(1183,'IrontreeWoods4',1,361,1767,46,56,3000,7000,0,0,6296.99,-1561.48,453.656,3.98913,'1145:0 1182:0 149:0 '),\n+(1184,'IrontreeCavern1',1,361,1768,46,56,3000,7000,0,0,6352.66,-1649.89,424.433,0.128896,'149:0 1185:0 1186:0 '),\n+(1185,'IrontreeCavern2',1,361,1768,46,56,3000,7000,0,0,6439.2,-1697.67,413.417,3.51397,'1184:0 '),\n+(1186,'IrontreeCavern3',1,361,1768,46,56,3000,7000,0,0,6348.65,-1752.82,421.668,2.4419,'1184:0 '),\n+(1187,'JadefireRun1',1,361,2618,46,56,3000,7000,0,0,6621.19,-889.352,485.149,4.30328,'1141:0 1188:0 '),\n+(1188,'JadefireRun2',1,361,2618,46,56,3000,7000,0,0,6459.98,-779.685,474.056,3.5611,'1139:0 1187:0 1189:0 '),\n+(1189,'JadefireRun3',1,361,2618,46,56,3000,7000,0,0,6292.94,-589.199,467.536,5.59331,'1188:0 '),\n+(1190,'FelwoodSide3_1',1,361,361,46,56,3000,7000,0,0,6839.58,-1594.78,491.498,3.27443,'1143:0 1144:0 '),\n+(1191,'TalonbranchGladeEntrance',1,361,1998,46,56,3000,7000,0,0,6265.97,-1990.07,570.371,0.397118,'1146:0 1148:0 1192:0 '),\n+(1192,'TalonbranchGlade',1,361,1998,46,56,3000,7000,0,3,6170.94,-1933.43,569.997,5.3569,'1191:0 '),\n+(1193,'FelpawVillage1',1,361,1762,46,56,3000,7000,0,0,6806.95,-1993.95,564.972,2.74938,'1146:0 1147:0 1194:0 1195:0 '),\n+(1194,'FelpawVillage2',1,361,1762,46,56,3000,7000,0,0,6789.17,-1850.3,554.16,4.19844,'1193:0 1195:0 '),\n+(1195,'FelpawVillage3',1,361,1762,46,56,3000,7000,0,0,6929.55,-1812.01,575.12,3.87447,'1193:0 1194:0 '),\n+(1196,'TimbermawHoldInside',1,361,1769,46,56,3000,7000,0,0,7017.44,-2122.43,586.887,0.262027,'142:0 148:0 1197:0 '),\n+(1197,'MoongladeExitS',1,493,493,46,60,3000,7000,0,0,7409.39,-2177.56,520.829,3.84148,'1196:0 1198:0 1199:0 '),\n+(1198,'MoongladeFlightH',1,493,493,46,60,3000,7000,0,5,7479.01,-2119.01,492.215,1.99187,'1197:0 1199:0 '),\n+(1199,'MoongladeMainRoad1',1,493,493,46,60,3000,7000,0,0,7621.21,-2207.23,468.939,2.73996,'1197:0 1198:0 1200:0 '),\n+(1200,'MoongladeMainRoad2',1,493,493,46,60,3000,7000,0,0,7521.64,-2483.68,454.141,1.37142,'1199:0 1201:0 '),\n+(1201,'MoongladeFlightA',1,493,493,46,60,3000,7000,0,3,7441.03,-2497.31,462.16,0.100638,'1200:0 '),\n+(1202,'FrostfireHotSprings1',1,618,2246,53,60,3000,7000,0,0,6669.75,-2350.35,569.688,6.11089,'142:0 1203:0 1204:0 1205:0 '),\n+(1203,'FrostfireHotSprings2',1,618,618,53,60,3000,7000,0,0,6516.03,-2438.96,575.469,0.575811,'1202:0 1204:0 1205:0 1206:0 '),\n+(1204,'FrostfireHotSprings3',1,618,2246,53,60,3000,7000,0,0,6739.97,-2534.28,547.608,2.35473,'1202:0 1203:0 1205:0 1206:0 1207:0 '),\n+(1205,'FrostfireHotSprings4',1,618,2246,53,60,3000,7000,0,0,6844.94,-2510.17,562.168,2.83383,'1202:0 1203:0 1204:0 1207:0 '),\n+(1206,'WinterspringWRoad1',1,618,618,53,60,3000,7000,0,0,6552.68,-2761.31,569.286,1.6412,'1203:0 1204:0 1208:0 1209:0 '),\n+(1207,'FrostfireHotSprings5',1,618,2246,53,60,3000,7000,0,0,6778.35,-2683.46,542.964,1.10124,'1204:0 1205:0 '),\n+(1208,'WinterspringWRoad2',1,618,618,53,60,3000,7000,0,0,6544.07,-3009.5,594.631,1.59877,'1206:0 1209:0 1211:0 1213:0 '),\n+(1209,'TimbermawPost1',1,618,2243,53,60,3000,7000,0,0,6443.26,-2975.94,574.619,1.46329,'1206:0 1208:0 1210:0 '),\n+(1210,'TimbermawPost2',1,618,2243,53,60,3000,7000,0,0,6501.28,-3395.1,596.264,1.54182,'1209:0 1212:0 '),\n+(1211,'WinterspringWRoad3',1,618,618,53,60,3000,7000,0,0,6612.45,-3218.46,610.975,1.85402,'1208:0 1212:0 1213:0 '),\n+(1212,'WinterspringWRoad4',1,618,618,53,60,3000,7000,0,0,6645.3,-3475.9,667.925,1.61251,'1210:0 1211:0 1214:0 '),\n+(1213,'FrostfireHotSprings6',1,618,2246,53,60,3000,7000,0,0,6782.88,-3070.45,577.01,3.04979,'1208:0 1211:0 '),\n+(1214,'WinterspringWRoad5',1,618,618,53,60,3000,7000,0,0,6657.52,-3668.1,695.82,1.56341,'1212:0 1215:0 1216:0 1221:0 '),\n+(1215,'WinterspringWRoad6',1,618,2252,53,60,3000,7000,0,0,6397.07,-3892.14,680.982,0.597365,'1214:0 1216:0 1217:0 '),\n+(1216,'LakeKeltheril',1,618,2251,53,60,3000,7000,0,0,6536.55,-4131.94,665.606,1.20213,'1214:0 1215:0 143:0 1218:0 '),\n+(1217,'Mazthoril1',1,618,2245,53,60,3000,7000,0,0,6183.02,-4265.44,745.257,1.04309,'1215:0 1218:0 1219:0 '),\n+(1218,'EverlookFork1',1,618,2255,53,60,3000,7000,0,0,6655.73,-4560.81,717.041,1.46131,'56:0 1216:0 1217:0 1239:0 1240:0 '),\n+(1219,'Mazthoril2',1,618,2245,53,60,3000,7000,0,0,5991.6,-4416.44,712.225,0.648425,'1217:0 1220:0 1255:0 1259:0 '),\n+(1220,'Mazthoril3',1,618,2245,53,60,3000,7000,0,0,6111.88,-4459.18,665.247,2.8927,'1219:0 1254:0 1255:0 '),\n+(1221,'WinterspringCFork',1,618,618,53,60,3000,7000,0,0,6913.24,-4134.15,695.074,1.72442,'1214:0 1222:0 1224:0 1225:0 '),\n+(1222,'WinterspringNRoad1',1,618,618,53,60,3000,7000,0,0,7189.47,-4145.52,708.652,2.01894,'1221:0 1223:0 1224:0 1225:0 1226:0 '),\n+(1223,'StarfallVillage1',1,618,2253,53,60,3000,7000,0,2,7163.35,-3949.34,749.855,4.52632,'1222:0 1224:0 '),\n+(1224,'StarfallVillage2',1,618,2253,53,60,3000,7000,0,2,7095.04,-4017.7,744.806,3.57795,'1221:0 1222:0 1223:0 '),\n+(1225,'WinterspringN_hub1',1,618,618,53,60,3000,7000,0,0,7243.63,-4428.68,637.464,1.30573,'147:0 1221:0 1222:0 1235:0 '),\n+(1226,'WinterspringNRoad2',1,618,618,53,60,3000,7000,0,0,7437.77,-4106.34,703.256,3.39493,'1222:0 1227:0 1231:0 1233:0 '),\n+(1227,'WinterspringNRoad3',1,618,2241,53,60,3000,7000,0,0,7658.36,-4006.12,703.193,3.60307,'1226:0 1228:0 1229:0 1230:0 '),\n+(1228,'FrostsaberRock',1,618,2241,53,60,3000,7000,0,0,8080.15,-3838.54,691.237,3.49507,'1227:0 1229:0 1230:0 '),\n+(1229,'FrostsaberRockSide1',1,618,2241,53,60,3000,7000,0,0,7601.67,-3828.53,689.193,5.16206,'1227:0 1228:0 '),\n+(1230,'FrostsaberRockSide2',1,618,2241,53,60,3000,7000,0,0,7960.17,-4207.36,694.89,1.05442,'1227:0 1228:0 1231:0 1232:0 '),\n+(1231,'FrostsaberRockSide3',1,618,2241,53,60,3000,7000,0,0,7696.88,-4240.08,674.756,0.182632,'1226:0 1230:0 1232:0 1233:0 '),\n+(1232,'FrostsaberRockSide4',1,618,2241,53,60,3000,7000,0,0,7898.77,-4343.01,714.863,1.26058,'1230:0 1231:0 1234:0 '),\n+(1233,'WinterspringN_hub2',1,618,618,53,60,3000,7000,0,0,7541.26,-4433.34,604.622,1.91639,'1226:0 1231:0 1234:0 1235:0 '),\n+(1234,'WinterspringN_hub3',1,618,618,53,60,3000,7000,0,0,7841.47,-4633.94,711.459,1.96351,'1232:0 1233:0 '),\n+(1235,'WinterspringN_hub4',1,618,618,53,60,3000,7000,0,0,7409.79,-4690.69,629.373,2.1363,'1225:0 1233:0 1236:0 1238:0 '),\n+(1236,'WinterspringN_hub5',1,618,618,53,60,3000,7000,0,0,7593.76,-4979.89,701.375,2.05382,'1235:0 1237:0 1238:0 '),\n+(1237,'HiddenGrove',1,618,2242,53,60,3000,7000,0,0,7765.82,-4824.05,695.683,4.13316,'1236:0 '),\n+(1238,'WinterfallVillage1',1,618,2244,53,60,3000,7000,0,0,7043.19,-4998.21,715.354,0.445711,'1235:0 1236:0 1243:0 '),\n+(1239,'EverlookFork2',1,618,2255,53,60,3000,7000,0,0,6611.3,-4739.92,698.015,0.695072,'1218:0 1241:0 1247:0 1254:0 '),\n+(1240,'EverlookFlightH',1,618,2255,53,60,3000,7000,0,5,6816.77,-4612.99,710.669,6.21445,'56:0 1218:0 1242:0 '),\n+(1241,'EverlookFlightA',1,618,2255,53,60,3000,7000,0,3,6790.08,-4744.29,701.5,3.20441,'1239:0 1242:0 '),\n+(1242,'WinterspringN_hub6',1,618,618,53,60,3000,7000,0,0,6927.32,-4786.97,694.458,2.5918,'1240:0 1241:0 1243:0 '),\n+(1243,'WinterfallVillageOutside',1,618,2244,53,60,3000,7000,0,0,6939.52,-5010.6,692.554,1.59042,'1238:0 1242:0 1244:0 '),\n+(1244,'WinterfallVillage2',1,618,2244,53,60,3000,7000,0,0,6808.46,-5094.96,695.933,0.427246,'1243:0 1245:0 '),\n+(1245,'WinterfallVillage3',1,618,2244,53,60,3000,7000,0,0,6729.74,-5155.43,735.364,6.18029,'1244:0 1246:0 '),\n+(1246,'WinterfallVillage4',1,618,2244,53,60,3000,7000,0,0,6716.73,-5241.35,779.049,1.49343,'1245:0 '),\n+(1247,'IceThistleHills1',1,618,2247,53,60,3000,7000,0,0,6422.5,-5063.45,747.183,0.955424,'1239:0 1248:0 1249:0 '),\n+(1248,'IceThistleHills2',1,618,2247,53,60,3000,7000,0,0,6075.66,-5048.11,793.011,6.23722,'1247:0 1255:0 '),\n+(1249,'IceThistleHillsCave1',1,618,2247,53,60,3000,7000,0,0,6558.26,-5114.63,770.071,4.80583,'1247:0 1250:0 '),\n+(1250,'IceThistleHillsCave2',1,618,2247,53,60,3000,7000,0,0,6647.69,-5270.98,753.532,0.248568,'1249:0 1251:0 1252:0 '),\n+(1251,'IceThistleHillsCave3',1,618,2247,53,60,3000,7000,0,0,6547.52,-5279.93,751.433,0.29569,'1250:0 '),\n+(1252,'IceThistleHillsCave4',1,618,2247,53,60,3000,7000,0,0,6591.19,-5377.61,757.91,2.11585,'1250:0 1253:0 '),\n+(1253,'IceThistleHillsCave5',1,618,2247,53,60,3000,7000,0,0,6749.19,-5302.24,746.013,3.42748,'1252:0 '),\n+(1254,'WinterspringSFork',1,618,618,53,60,3000,7000,0,0,6181.52,-4918.26,736.9,1.70352,'1220:0 1239:0 1255:0 '),\n+(1255,'WinterspringSRoad1',1,618,618,53,60,3000,7000,0,0,5738.96,-4759.97,772.327,5.63249,'144:0 1219:0 1220:0 1248:0 1254:0 1256:0 1258:0 '),\n+(1256,'OwlWingThicket1',1,618,2250,53,60,3000,7000,0,0,5704.51,-4972.1,807.203,1.24015,'1255:0 1257:0 '),\n+(1257,'OwlWingThicket2',1,618,2250,53,60,3000,7000,0,0,5516.17,-4932.2,843.306,5.86024,'1256:0 '),\n+(1258,'WinterspringSRoad2',1,618,618,53,60,3000,7000,0,0,5542.21,-4699,784.197,5.83863,'144:0 1255:0 1263:0 '),\n+(1259,'DunMandarrW',1,618,2248,53,60,3000,7000,0,0,5726.18,-4420.5,778.036,0.0455333,'144:0 1219:0 '),\n+(1260,'FrostwhisperGorge1',1,618,2249,53,60,3000,7000,0,0,5376.4,-4513.45,720.025,0.126024,'144:0 1261:0 '),\n+(1261,'FrostwhisperGorge2',1,618,2249,53,60,3000,7000,0,0,5296.85,-4663.41,691.461,1.09206,'1260:0 1262:0 '),\n+(1262,'FrostwhisperGorge3',1,618,2249,53,60,3000,7000,0,0,5259.63,-4868.84,691.501,1.4769,'1261:0 '),\n+(1263,'FrostwhisperGorgeBridge1',1,618,618,53,60,3000,7000,0,0,5329.29,-4753.88,815.467,6.28158,'1258:0 1264:0 '),\n+(1264,'FrostwhisperGorgeBridge2',1,618,618,53,60,3000,7000,0,1,5184.44,-4704.74,823.398,6.16966,'1263:0 1265:0 '),\n+(1265,'DarkwhisperGorge1',1,618,618,53,60,3000,7000,0,0,5076.75,-4593.36,846.068,5.72001,'1264:0 1266:0 1267:0 1268:0 '),\n+(1266,'DarkwhisperGorge2',1,618,2249,53,60,3000,7000,0,0,5094.49,-4876.76,867.355,1.66931,'1265:0 '),\n+(1267,'DarkwhisperGorge3',1,618,2249,53,60,3000,7000,0,0,5323.19,-4418.49,854.383,3.62103,'1265:0 '),\n+(1268,'DarkwhisperGorge4',1,618,2256,53,60,3000,7000,0,0,4938.26,-4535.16,855.372,3.64264,'1265:0 '),\n+(1269,'AzsharaExitW',1,16,878,43,54,3000,7000,0,0,2800.83,-3813.24,83.7107,0.929092,'1095:0 1270:0 '),\n+(1270,'TalrendisPointRoad',1,16,3137,43,54,3000,7000,0,0,2749.62,-3926.91,89.3218,0.361656,'1269:0 145:0 1271:0 1273:0 '),\n+(1271,'ShadowsongShrine1',1,16,878,43,54,3000,7000,0,0,2935.67,-3982.68,124.392,2.73551,'1270:0 1272:0 '),\n+(1272,'ShadowsongShrine2',1,16,1235,43,54,3000,7000,0,0,2850.78,-4024.75,140.874,0.32041,'1271:0 '),\n+(1273,'AzsharaRoad1',1,16,16,43,54,3000,7000,0,0,2815.94,-4122.46,94.8896,2.21715,'1270:0 1274:0 1279:0 '),\n+(1274,'AzsharaRoad2',1,16,16,43,54,3000,7000,0,0,2941.29,-4227.56,95.186,2.45278,'1273:0 1275:0 1280:0 '),\n+(1275,'AzsharaRoad3',1,16,16,43,54,3000,7000,0,0,3057.29,-4322.31,90.9214,2.58827,'1274:0 1276:0 1280:0 '),\n+(1276,'AzsharaRoad4',1,16,16,43,54,3000,7000,0,0,3229.99,-4491.16,92.7121,1.9737,'1275:0 1277:0 1280:0 1284:0 '),\n+(1277,'AzsharaRoad5',1,16,16,43,54,3000,7000,0,0,3333.33,-4589.69,92.2964,2.31141,'1276:0 1278:0 1283:0 1286:0 1326:0 '),\n+(1278,'AzsharaRoad6',1,16,16,43,54,3000,7000,0,0,3451.9,-4750.56,108.662,2.10326,'1277:0 1286:0 1287:0 1288:0 1324:0 1327:0 '),\n+(1279,'AzsharaE1',1,16,16,43,54,3000,7000,0,0,2997.33,-4106.35,99.9666,3.2087,'1273:0 1280:0 1283:0 '),\n+(1280,'AzsharaE2',1,16,1236,43,54,3000,7000,0,0,3118.77,-4225.25,100.015,2.98486,'1274:0 1275:0 1276:0 1279:0 1281:0 1283:0 '),\n+(1281,'AzsharaE3',1,16,1236,43,54,3000,7000,0,0,3300.36,-4275.9,126.16,2.80817,'1280:0 1282:0 '),\n+(1282,'AzsharaE4',1,16,1236,43,54,3000,7000,0,0,3271.81,-4373.57,125.961,1.43765,'1281:0 '),\n+(1283,'AzsharaE5',1,16,1236,43,54,3000,7000,0,0,3373.1,-4206.33,105.482,3.57,'1277:0 1279:0 1280:0 1284:0 1285:0 '),\n+(1284,'AzsharaE6',1,16,16,43,54,3000,7000,0,0,3582.46,-4138.13,104.333,3.80758,'1276:0 1283:0 1285:0 '),\n+(1285,'Valormok',1,16,1237,43,54,3000,7000,0,5,3613.75,-4414.24,112.731,2.85922,'1283:0 1284:0 1286:0 '),\n+(1286,'AzsharaE7',1,16,16,43,54,3000,7000,0,0,3590.09,-4639.97,116.675,1.6988,'1277:0 1278:0 1285:0 1287:0 '),\n+(1287,'AzsharaE8',1,16,1224,43,54,3000,7000,0,0,3744.78,-4813.74,138.923,2.88199,'1278:0 1286:0 1289:0 '),\n+(1288,'AzsharaE9',1,16,1221,43,54,3000,7000,0,0,3499.39,-4902.72,144.155,1.64696,'1278:0 1289:0 '),\n+(1289,'AzsharaE10',1,16,1221,43,54,3000,7000,0,0,3759.42,-4967.77,142.273,2.79364,'1287:0 1288:0 1290:0 '),\n+(1290,'AzsharaN1',1,16,1216,43,54,3000,7000,0,0,4036.22,-5259.02,107.607,2.29688,'1289:0 1291:0 1292:0 1322:0 '),\n+(1291,'AzsharaN2',1,16,1216,43,54,3000,7000,0,0,4056.25,-5430.36,110.698,6.13747,'1290:0 1294:0 1293:0 1322:0 '),\n+(1292,'AzsharaN3',1,16,1216,43,54,3000,7000,0,0,4443.1,-5422.68,110.062,2.83485,'1290:0 1293:0 '),\n+(1293,'AzsharaN4',1,16,1225,43,54,3000,7000,0,0,4501.55,-5509.11,112.466,2.9016,'1291:0 1292:0 1294:0 1295:0 '),\n+(1294,'AzsharaN5',1,16,1225,43,54,3000,7000,0,0,4344.93,-5684.07,101.657,1.91789,'1291:0 1293:0 1296:0 1297:0 1322:0 '),\n+(1295,'AzsharaN6',1,16,1219,43,54,3000,7000,0,0,4731.82,-5683.23,101.157,2.58744,'1293:0 1296:0 1297:0 '),\n+(1296,'AzsharaN7',1,16,1220,43,54,3000,7000,0,0,4463.44,-6017.87,99.0046,1.97484,'1294:0 1295:0 1299:0 1300:0 '),\n+(1297,'AzsharaN8',1,16,1219,43,54,3000,7000,0,0,4794.73,-5948.23,94.5572,2.9291,'1294:0 1295:0 1298:0 1300:0 '),\n+(1298,'AzsharaN9',1,16,1219,43,54,3000,7000,0,0,4752.23,-6324.43,112.261,1.52126,'1297:0 1300:0 1301:0 '),\n+(1299,'AzsharaN10',1,16,1220,43,54,3000,7000,0,0,4304.26,-6172.26,132.068,0.476687,'1296:0 1300:0 '),\n+(1300,'AzsharaN11',1,16,1220,43,54,3000,7000,0,0,4483.15,-6277.92,109.808,2.02983,'1296:0 1297:0 1298:0 1299:0 1302:0 '),\n+(1301,'AzsharaN12',1,16,1219,43,54,3000,7000,0,0,4815.57,-6641.1,96.3628,1.82366,'1298:0 1302:0 1304:0 '),\n+(1302,'AzsharaN13',1,16,1219,43,54,3000,7000,0,0,4579.43,-6593.47,100.233,1.80599,'1300:0 1301:0 1303:0 '),\n+(1303,'AzsharaN14',1,16,2497,43,54,3000,7000,0,0,4335.22,-6872.83,94.6868,0.889033,'1302:0 1304:0 1305:0 1306:0 '),\n+(1304,'AzsharaN15',1,16,2497,43,54,3000,7000,0,0,4772.55,-7077.06,93.7659,1.50753,'1301:0 1303:0 1306:0 1308:0 '),\n+(1305,'AzsharaN16',1,16,1228,43,54,3000,7000,0,0,4163.23,-7077.25,104.42,0.918482,'1303:0 '),\n+(1306,'AzsharaN17',1,16,2497,43,54,3000,7000,0,0,4378.53,-7190.76,114.567,1.36616,'1303:0 1304:0 1307:0 '),\n+(1307,'AzsharaN18',1,16,2497,43,54,3000,7000,0,0,4547.1,-7477.55,77.7456,1.89042,'1306:0 1308:0 1312:0 1313:0 '),\n+(1308,'AzsharaN19',1,16,2497,43,54,3000,7000,0,0,4697.79,-7545.77,76.1055,2.41466,'1304:0 1307:0 1309:0 1311:0 '),\n+(1309,'AzsharaN20',1,16,1230,43,54,3000,7000,0,0,4879.55,-7649.88,-0.264126,2.8859,'1308:0 1310:0 1311:0 '),\n+(1310,'AzsharaN21',1,16,1230,43,54,3000,7000,0,0,4981.1,-7379.41,2.45741,4.29372,'1309:0 '),\n+(1311,'AzsharaN22',1,16,1230,43,54,3000,7000,0,0,4636.23,-7784.83,-0.404812,0.517923,'1308:0 1309:0 1312:0 1313:0 '),\n+(1312,'AzsharaN23',1,16,1229,43,54,3000,7000,0,0,4265.54,-7853.88,3.0357,0.839938,'1307:0 1311:0 1313:0 '),\n+(1313,'AzsharaN24',1,16,1228,43,54,3000,7000,0,0,4328.17,-7549.27,10.4959,5.60927,'1307:0 1311:0 1312:0 1314:0 1316:0 '),\n+(1314,'AzsharaN25',1,16,1228,43,54,3000,7000,0,0,4248.34,-7195.83,18.9926,3.96189,'1313:0 1315:0 '),\n+(1315,'AzsharaN26',1,16,1226,43,54,3000,7000,0,0,4103.25,-7187.96,10.5715,6.16297,'1314:0 1316:0 1317:0 '),\n+(1316,'AzsharaN27',1,16,1226,43,54,3000,7000,0,0,4038.51,-7321.54,1.12717,0.769242,'1313:0 1315:0 1317:0 '),\n+(1317,'AzsharaN28',1,16,1226,43,54,3000,7000,0,0,3934.81,-7205.7,26.486,5.91163,'1315:0 1316:0 1318:0 1320:0 1321:0 '),\n+(1318,'TempleOfArkkoran1',1,16,1226,43,54,3000,7000,0,0,3807.79,-7280.66,26.4812,1.14034,'1317:0 1319:0 '),\n+(1319,'TempleOfArkkoran2',1,16,1226,43,54,3000,7000,0,0,3768.46,-7134.44,26.4806,5.96857,'1318:0 1320:0 '),\n+(1320,'TempleOfArkkoran3',1,16,1226,43,54,3000,7000,0,0,3902.48,-7060.61,26.4811,4.31335,'1317:0 1319:0 '),\n+(1321,'TempleOfArkkoran4',1,16,1226,43,54,3000,7000,0,0,3858.12,-7171.88,24.03,5.83506,'1317:0 '),\n+(1322,'AzsharaRamp1Top',1,16,1225,43,54,3000,7000,0,0,4108.38,-5554.42,99.4778,1.77221,'1290:0 1291:0 1294:0 1323:0 '),\n+(1323,'AzsharaRamp1Bottom',1,16,1228,43,54,3000,7000,0,0,3897.1,-5695.14,17.2205,0.46452,'1322:0 1341:0 1342:0 '),\n+(1324,'AzsharaC1',1,16,1221,43,54,3000,7000,0,0,3389.18,-4881.96,119.527,0.94754,'1278:0 1325:0 '),\n+(1325,'AzsharaC2',1,16,1221,43,54,3000,7000,0,0,3548.39,-5142.38,83.2368,2.40053,'1324:0 1326:0 1328:0 46:0 1332:0 '),\n+(1326,'AzsharaC3',1,16,1221,43,54,3000,7000,0,0,3353.2,-4996.79,88.9565,1.84487,'1277:0 1325:0 '),\n+(1327,'AzsharaC4',1,16,1233,43,54,3000,7000,0,0,3111.76,-5099.04,133.69,0.892567,'1278:0 1328:0 1343:0 1344:0 '),\n+(1328,'AzsharaC5',1,16,1221,43,54,3000,7000,0,0,3288.43,-5313.47,92.0357,2.24738,'1325:0 1327:0 1329:0 '),\n+(1329,'AzsharaC6',1,16,1221,43,54,3000,7000,0,0,3069.52,-5522.7,98.46,0.58232,'1328:0 1330:0 1343:0 '),\n+(1330,'AzsharaC7',1,16,1231,43,54,3000,7000,0,0,3063.44,-5615.53,60.2217,1.67206,'1329:0 1331:0 1338:0 '),\n+(1331,'AzsharaC8',1,16,1231,43,54,3000,7000,0,0,3004.41,-5699.66,35.8993,0.918073,'1330:0 1334:0 '),\n+(1332,'AzsharaC9',1,16,1221,43,54,3000,7000,0,0,3744.95,-5305.2,85.9123,2.48299,'1325:0 1333:0 '),\n+(1333,'AzsharaC10',1,16,1228,43,54,3000,7000,0,0,3658.05,-5517.8,24.2321,1.28329,'1332:0 1339:0 1340:0 1341:0 '),\n+(1334,'AzsharaC11',1,16,1231,43,54,3000,7000,0,0,3087.73,-5859.39,-0.161575,2.13546,'1331:0 1335:0 1338:0 '),\n+(1335,'AzsharaC12',1,16,1231,43,54,3000,7000,0,0,2934.41,-5884.56,25.8109,0.120912,'1334:0 1336:0 '),\n+(1336,'AzsharaC13',1,16,1231,43,54,3000,7000,0,0,2980.62,-6084.05,0.213247,2.38089,'1335:0 1337:0 '),\n+(1337,'AzsharaC14',1,16,1231,43,54,3000,7000,0,0,2846.38,-6166.7,3.60284,0.643192,'1336:0 '),\n+(1338,'AzsharaC15',1,16,1231,43,54,3000,7000,0,0,3226.36,-5673.24,15.8216,3.93007,'1330:0 1334:0 1339:0 1340:0 '),\n+(1339,'AzsharaC16',1,16,1231,43,54,3000,7000,0,0,3427.33,-5505.43,26.9806,5.26131,'1333:0 1338:0 1340:0 1341:0 '),\n+(1340,'AzsharaC17',1,16,1231,43,54,3000,7000,0,0,3475.44,-5753.95,11.6531,1.76236,'1333:0 1338:0 1339:0 1341:0 '),\n+(1341,'AzsharaC18',1,16,1228,43,54,3000,7000,0,0,3704.73,-5723.53,4.41024,0.254392,'1323:0 1333:0 1339:0 1340:0 1342:0 '),\n+(1342,'AzsharaC19',1,16,1228,43,54,3000,7000,0,0,3948.84,-5885.08,8.49314,2.09811,'1323:0 1341:0 '),\n+(1343,'AzsharaS1',1,16,1234,43,54,3000,7000,0,0,2887.1,-5407.2,110.727,1.29111,'1327:0 1329:0 1344:0 1347:0 1346:0 '),\n+(1344,'AzsharaS2',1,16,1234,43,54,3000,7000,0,0,2671.51,-5134.67,110.162,6.23323,'1327:0 1343:0 1345:0 '),\n+(1345,'AzsharaS3',1,16,1234,43,54,3000,7000,0,0,2476.44,-5345.72,112.668,0.747221,'1344:0 1346:0 '),\n+(1346,'AzsharaS4',1,16,16,43,54,3000,7000,0,0,2551.54,-5739.78,99.3784,1.5499,'1343:0 1345:0 1347:0 1348:0 '),\n+(1347,'AzsharaS5',1,16,16,43,54,3000,7000,0,0,2773.38,-5801.37,102.296,1.23417,'1343:0 1346:0 '),\n+(1348,'AzsharaS6',1,16,16,43,54,3000,7000,0,0,2497.05,-6122.14,101.12,1.55774,'1346:0 1349:0 '),\n+(1349,'AzsharaS7',1,16,16,43,54,3000,7000,0,0,2591.64,-6535.29,102.94,1.79136,'1348:0 1350:0 1351:0 '),\n+(1350,'AzsharaS8',1,16,16,43,54,3000,7000,0,0,2738.28,-6626.16,105.229,0.130243,'1349:0 '),\n+(1351,'AzsharaS9',1,16,1232,43,54,3000,7000,0,0,2530.76,-6691.49,105.655,1.22588,'1349:0 1352:0 1353:0 '),\n+(1352,'AzsharaS10',1,16,1232,43,54,3000,7000,0,0,2594.6,-6859.47,124.355,1.98575,'1351:0 '),\n+(1353,'AzsharaS11',1,16,1232,43,54,3000,7000,0,0,2469.22,-6950.98,112.622,1.32995,'1351:0 1354:0 '),\n+(1354,'AzsharaS12',1,16,1232,43,54,3000,7000,0,0,2290.99,-6837.2,120.824,5.67516,'1353:0 1355:0 '),\n+(1355,'AzsharaS13',1,16,1232,43,54,3000,7000,0,0,2245.13,-6620.49,130.493,5.82242,'1354:0 '),\n+(1356,'NightsongWoodsSE',1,331,2457,18,30,3000,7000,0,0,2031.76,-3416.6,92.6375,6.12481,'1097:0 1099:0 1116:0 1357:0 '),\n+(1357,'SouthfuryRiver1',1,331,879,18,30,3000,7000,0,0,2157.71,-3580.65,40.0791,2.2096,'1356:0 1358:0 '),\n+(1358,'SouthfuryRiver2',1,331,879,18,30,3000,7000,0,0,1982.59,-3613.01,40.3535,1.3378,'1357:0 1359:0 '),\n+(1359,'SouthfuryRiver3',1,331,879,18,30,3000,7000,0,4,1751.38,-3745.84,39.7381,3.16817,'1358:0 1360:0 '),\n+(1360,'OrgrimmarExitW',1,17,815,8,25,3000,7000,0,4,1641.94,-3837.63,50.7719,5.47332,'1359:0 1454:0 '),\n+(1361,'DurotarN_hub1',1,14,14,1,10,3000,7000,0,4,1290.89,-4391.75,26.2836,3.73994,'30:0 1362:0 1377:0 1385:0 1386:0 '),\n+(1362,'DurotarN_hub2',1,14,14,1,10,3000,7000,0,4,1341.58,-4623.78,24.2112,1.68496,'1361:0 1363:0 1365:0 1377:0 '),\n+(1363,'SkullRock1',1,14,817,1,10,3000,7000,0,4,1448.11,-4879.66,11.5034,1.9029,'1362:0 1364:0 1365:0 '),\n+(1364,'SkullRock2',1,14,817,1,10,3000,7000,0,4,1445.58,-4687.97,-5.65162,4.9365,'1363:0 '),\n+(1365,'DurotarN_hub3',1,14,14,1,10,3000,7000,0,4,1100.2,-4908.62,14.577,0.165201,'1362:0 1363:0 1366:0 1367:0 '),\n+(1366,'DurotarN_hub4',1,14,375,1,10,3000,7000,0,4,985.89,-5115.68,1.41706,1.16658,'1365:0 1367:0 '),\n+(1367,'DurotarN_hub5',1,14,14,1,10,3000,7000,0,4,809.043,-4957.4,16.2794,2.83475,'1365:0 1366:0 1368:0 1370:0 '),\n+(1368,'DustwindCave1',1,14,14,1,10,3000,7000,0,4,778.919,-4756.62,37.5488,4.94158,'1367:0 1369:0 1370:0 '),\n+(1369,'DustwindCave2',1,14,371,1,10,3000,7000,0,4,931.181,-4715.15,19.9519,2.6443,'1368:0 '),\n+(1370,'DurotarN_hub6',1,14,14,1,10,3000,7000,0,4,512.237,-4785.91,29.1897,1.93467,'1367:0 1368:0 1371:0 1407:0 '),\n+(1371,'DurotarN_hub7',1,14,14,1,10,3000,7000,0,4,438.776,-4564.65,52.1313,5.05391,'1370:0 1372:0 1400:0 1403:0 '),\n+(1372,'DurotarN_hub8',1,14,14,1,10,3000,7000,0,0,599.139,-4404.63,18.4833,5.05392,'1371:0 66:0 67:0 1400:0 1403:0 '),\n+(1373,'DurotarCanyon1_2',1,14,410,1,10,3000,7000,0,0,754.968,-4457.2,15.6687,1.93155,'66:0 67:0 '),\n+(1374,'DurotarCanyon1_3',1,14,14,1,10,3000,7000,0,0,720.095,-4682.12,-6.58629,2.1711,'66:0 1375:0 1401:0 '),\n+(1375,'DurotarCanyon1_4',1,14,14,1,10,3000,7000,0,0,762.27,-4587.67,0.395604,5.89975,'1374:0 1376:0 1384:0 '),\n+(1376,'DurotarCanyon1_5',1,14,410,1,10,3000,7000,0,0,909.793,-4623.59,17.4591,2.58341,'1375:0 1377:0 1378:0 '),\n+(1377,'DurotarCanyon1_6',1,14,14,1,10,3000,7000,0,0,1089.79,-4544.84,18.7912,3.37862,'1361:0 1362:0 1376:0 1385:0 '),\n+(1378,'DurotarCanyon1_7',1,14,410,1,10,3000,7000,0,0,846.499,-4687.15,10.6635,4.45069,'1376:0 1379:0 '),\n+(1379,'DurotarCanyon1_8',1,14,370,1,10,3000,7000,0,5,822.93,-4819.09,11.1622,1.25216,'1378:0 1380:0 '),\n+(1380,'DurotarCanyon1_9',1,14,370,1,10,3000,7000,0,0,922.247,-4823.86,14.833,3.04091,'1379:0 1381:0 1382:0 '),\n+(1381,'DurotarCanyon1_10',1,14,370,1,10,3000,7000,0,0,984.82,-4668.01,26.8858,4.65295,'1380:0 '),\n+(1382,'DurotarCanyon1_11',1,14,370,1,10,3000,7000,0,0,1028.11,-4807.86,13.422,1.33267,'1380:0 1383:0 '),\n+(1383,'DurotarCanyon1_12',1,14,370,1,10,3000,7000,0,0,1112.67,-4667.33,19.0025,5.6445,'1382:0 '),\n+(1384,'DurotarCanyon1_13',1,14,14,1,10,3000,7000,0,0,863.608,-4507.22,5.89497,4.47623,'1375:0 1385:0 '),\n+(1385,'DurotarCanyon1_14',1,14,14,1,10,3000,7000,0,0,1076.54,-4421.72,18.043,3.13516,'67:0 1361:0 1377:0 1384:0 1387:0 '),\n+(1386,'RocktuskFarm',1,14,1296,1,10,3000,7000,0,4,1261.75,-4189.97,25.9612,5.01817,'1361:0 1387:0 1388:0 '),\n+(1387,'DurotarN_hub9',1,14,14,1,10,3000,7000,0,4,1103.69,-4095.77,17.1414,5.61704,'1385:0 1386:0 1388:0 1389:0 '),\n+(1388,'DurotarN_hub10',1,14,14,1,10,3000,7000,0,4,1240.84,-3994.36,19.8563,4.64119,'1386:0 1387:0 1389:0 1452:0 1453:0 '),\n+(1389,'DurotarN_hub11',1,14,814,1,10,3000,7000,0,4,932.462,-3903.15,18.4923,5.69476,'1387:0 1388:0 1390:0 1391:0 1451:0 1452:0 '),\n+(1390,'DurotarN_hub12',1,14,14,1,10,3000,7000,0,4,554.028,-3867,21.5181,6.15421,'1389:0 1391:0 1392:0 1405:0 1406:0 '),\n+(1391,'DurotarN_hub13',1,14,14,1,10,3000,7000,0,4,484.992,-4008.81,21.634,0.40509,'1389:0 1390:0 1392:0 1400:0 1405:0 1406:0 '),\n+(1392,'DurotarCanyon2_1',1,14,14,1,10,3000,7000,0,4,621.087,-4034.14,5.79289,6.22882,'67:0 1390:0 1391:0 1393:0 1400:0 '),\n+(1393,'DurotarCanyon2_2',1,14,369,1,10,3000,7000,0,4,805.35,-4026.74,-8.81716,3.20306,'1392:0 1394:0 1398:0 '),\n+(1394,'DurotarCanyon2_3',1,14,369,1,10,3000,7000,0,4,924.692,-4010.46,-13.3326,3.34246,'1393:0 1395:0 '),\n+(1395,'DurotarCanyon2_4',1,14,369,1,10,3000,7000,0,4,969.211,-4144.86,-6.8125,2.00533,'1394:0 1396:0 1397:0 '),\n+(1396,'DurotarCanyon2_5',1,14,369,1,10,3000,7000,0,4,858.51,-4186.73,-13.9605,0.410964,'1395:0 '),\n+(1397,'DurotarCanyon2_6',1,14,369,1,10,3000,7000,0,4,955.695,-4276.78,-6.40429,1.49874,'1395:0 '),\n+(1398,'DurotarCanyon2_7',1,14,369,1,10,3000,7000,0,4,832.014,-4096.6,-12.8537,2.28805,'1393:0 1399:0 '),\n+(1399,'DurotarCanyon2_8',1,14,369,1,10,3000,7000,0,4,733.597,-4112.95,-9.91997,0.344189,'1398:0 '),\n+(1400,'RazormaneGrounds',1,14,816,1,10,3000,7000,0,4,394.471,-4227.01,25.6721,6.10902,'67:0 1371:0 1372:0 1391:0 1392:0 1403:0 1404:0 '),\n+(1401,'DurotarCanyon1_15',1,14,14,1,10,3000,7000,0,0,618.018,-4729.15,-9.7302,0.530719,'1374:0 28:0 '),\n+(1402,'DurotarRoadW1',1,14,14,1,10,3000,7000,0,4,229.555,-4564.93,14.4257,4.87206,'28:0 1403:0 1409:0 1437:0 '),\n+(1403,'DurotarRoadW2',1,14,14,1,10,3000,7000,0,4,311.231,-4367.13,23.2866,0.650496,'1371:0 1372:0 1400:0 1402:0 1404:0 1437:0 1440:0 '),\n+(1404,'DurotarRoadW3',1,14,14,1,10,3000,7000,0,4,290.25,-4093.37,30.0616,4.8897,'1400:0 1403:0 1405:0 1440:0 1441:0 1443:0 '),\n+(1405,'DurotarRoadW4',1,14,14,1,10,3000,7000,0,4,289.101,-3928.87,32.0584,5.95001,'1390:0 1391:0 1404:0 1406:0 1441:0 1443:0 '),\n+(1406,'DurotarWBridge',1,14,814,1,10,3000,7000,0,4,317.731,-3805.25,24.3367,6.02659,'1390:0 1391:0 1405:0 1443:0 1449:0 '),\n+(1407,'DurotarS_hub1',1,14,14,1,10,3000,7000,0,4,250.862,-4982.03,19.1509,0.356019,'1370:0 1408:0 1409:0 1410:0 1414:0 '),\n+(1408,'DurotarS_hub2',1,14,373,1,10,3000,7000,0,4,274.781,-5126.02,4.75879,2.02892,'1407:0 1414:0 '),\n+(1409,'DurotarRoadS1',1,14,14,1,10,3000,7000,0,4,119.098,-4745.19,15.4912,5.09591,'28:0 1402:0 1407:0 1410:0 1414:0 1415:0 '),\n+(1410,'DurotarRoadS2',1,14,14,1,10,3000,7000,0,4,-99.4238,-4745.37,21.6208,0.102741,'1407:0 1409:0 1411:0 1414:0 '),\n+(1411,'DurotarRoadS3',1,14,14,1,10,3000,7000,0,4,-278.577,-4798.87,28.7297,0.267683,'1410:0 1412:0 1414:0 1415:0 '),\n+(1412,'DurotarRoadS4',1,14,14,1,10,3000,7000,0,4,-448.465,-4791.29,35.8497,6.27205,'1411:0 1413:0 '),\n+(1413,'DurotarRoadS5',1,14,14,1,10,3000,7000,0,4,-640.871,-4736.39,33.6569,6.15227,'1412:0 31:0 1419:0 1421:0 1422:0 1429:0 '),\n+(1414,'TirigardeKeep1',1,14,372,1,10,3000,7000,0,4,-84.5912,-5061.01,15.5227,0.185219,'1407:0 1408:0 1409:0 1410:0 1411:0 1415:0 '),\n+(1415,'TirigardeKeep2',1,14,372,1,10,3000,7000,0,4,-198.068,-5050.76,20.9866,3.49606,'1409:0 1411:0 1414:0 1416:0 1417:0 '),\n+(1416,'TirigardeKeep3',1,14,372,1,10,3000,7000,0,4,-225.492,-5115.3,49.3248,1.51096,'1415:0 '),\n+(1417,'TirigardeKeep4',1,14,372,1,10,3000,7000,0,4,-321.717,-5084.89,21.2127,0.285748,'1415:0 1418:0 '),\n+(1418,'TirigardeKeep5',1,14,373,1,10,3000,7000,0,4,-291.897,-5186.7,20.4791,1.8644,'1417:0 '),\n+(1419,'DurotarS_hub3',1,14,393,1,10,3000,7000,0,4,-716.008,-5088.67,9.54796,1.34603,'31:0 1413:0 1420:0 1444:0 '),\n+(1420,'DurotarS_hub4',1,14,393,1,10,3000,7000,0,4,-920.843,-4982.52,11.1974,5.87385,'31:0 1419:0 1421:0 1422:0 1445:0 '),\n+(1421,'DurotarS_hub5',1,14,393,1,10,3000,7000,0,4,-1100.19,-4784.19,8.13918,5.95632,'31:0 1413:0 1420:0 1422:0 '),\n+(1422,'DurotarCanyon3_1',1,14,14,1,10,3000,7000,0,4,-978.237,-4704.6,20.1681,1.62878,'31:0 1413:0 1420:0 1421:0 1423:0 '),\n+(1423,'DurotarCanyon3_2',1,14,366,1,10,3000,7000,0,4,-986.47,-4574.42,25.5859,4.28734,'1422:0 1424:0 1425:0 1427:0 '),\n+(1424,'DurotarCanyon3_3',1,14,366,1,10,3000,7000,0,4,-1067.61,-4604.24,25.8221,3.64331,'1423:0 '),\n+(1425,'DurotarCanyon3_4',1,14,366,1,10,3000,7000,0,4,-1047.58,-4451.84,27.4603,4.97458,'1423:0 1426:0 '),\n+(1426,'DurotarCanyon3_5',1,14,366,1,10,3000,7000,0,4,-965.059,-4407.81,29.5222,3.58441,'1425:0 '),\n+(1427,'DurotarCanyon3_6',1,14,366,1,10,3000,7000,0,4,-981.936,-4503.15,25.7079,1.87618,'1423:0 1428:0 '),\n+(1428,'DurotarCanyon3_7',1,14,366,1,10,3000,7000,0,4,-904.997,-4477.99,29.6937,3.30756,'1427:0 '),\n+(1429,'ValleyOfTrials1',1,14,363,1,10,3000,7000,0,4,-603.24,-4597.62,41.2213,4.5544,'1413:0 1430:0 '),\n+(1430,'ValleyOfTrials2',1,14,363,1,10,3000,7000,0,4,-580.729,-4526.65,41.4449,4.54262,'1429:0 1431:0 '),\n+(1431,'ValleyOfTrials3',1,14,363,1,10,3000,7000,0,4,-589.381,-4297.57,37.9694,5.56165,'1430:0 29:0 1432:0 1433:0 1434:0 1436:0 '),\n+(1432,'ValleyOfTrials4',1,14,363,1,10,3000,7000,0,4,-746.092,-4261.15,43.9991,6.03879,'1431:0 '),\n+(1433,'ValleyOfTrials5',1,14,363,1,10,3000,7000,0,4,-409.694,-4455.21,51.0433,2.32778,'1431:0 1434:0 1436:0 '),\n+(1434,'ValleyOfTrials6',1,14,363,1,10,3000,7000,0,4,-197.604,-4331.89,68.4747,3.01697,'1431:0 1433:0 1435:0 1436:0 '),\n+(1435,'ValleyOfTrials7',1,14,365,1,10,3000,7000,0,4,-87.1332,-4210.24,49.4149,4.1067,'1434:0 '),\n+(1436,'ValleyOfTrials8',1,14,363,1,10,3000,7000,0,4,-403.018,-4206.27,53.0641,5.51453,'1431:0 1433:0 1434:0 '),\n+(1437,'DurotarSW_hub1',1,14,816,1,10,3000,7000,0,4,162.168,-4433.07,35.4298,5.87386,'1402:0 1403:0 1438:0 1439:0 '),\n+(1438,'DurotarSW_hub2',1,14,816,1,10,3000,7000,0,4,80.4142,-4475.95,43.2596,0.578313,'1437:0 1439:0 '),\n+(1439,'DurotarSW_hub3',1,14,816,1,10,3000,7000,0,4,107.992,-4332.41,52.3223,5.13559,'1437:0 1438:0 1440:0 '),\n+(1440,'DurotarSW_hub4',1,14,816,1,10,3000,7000,0,4,29.2317,-4205.25,67.7773,5.8385,'1403:0 1404:0 1439:0 1441:0 '),\n+(1441,'DurotarSW_hub5',1,14,14,1,10,3000,7000,0,4,-53.7095,-4041.71,67.3331,0.00298548,'1404:0 1405:0 1440:0 1442:0 1443:0 '),\n+(1442,'DurotarSW_hub6',1,14,814,1,10,3000,7000,0,4,-173.855,-3864.96,35.2069,5.30244,'1441:0 1443:0 1476:0 1474:0 '),\n+(1443,'DurotarSW_hub7',1,14,14,1,10,3000,7000,0,4,72.4652,-3876.98,41.5453,3.44105,'1404:0 1405:0 1406:0 1441:0 1442:0 1474:0 '),\n+(1444,'EchoIsles1',1,14,368,1,10,3000,7000,0,4,-808.575,-5363.62,2.20208,1.32598,'1419:0 1445:0 1448:0 '),\n+(1445,'EchoIsles2',1,14,368,1,10,3000,7000,0,4,-1142.01,-5152.05,1.44042,0.283367,'1420:0 1444:0 1446:0 '),\n+(1446,'EchoIsles3',1,14,368,1,10,3000,7000,0,4,-1236.39,-5359.85,5.43454,0.742817,'1445:0 1447:0 1448:0 '),\n+(1447,'EchoIsles4',1,14,368,1,10,3000,7000,0,4,-1232.75,-5606.75,4.85907,1.49091,'1446:0 1448:0 '),\n+(1448,'EchoIsles5',1,14,368,1,10,3000,7000,0,4,-1035.61,-5519.3,7.91372,2.83395,'1444:0 1446:0 1447:0 '),\n+(1449,'BarrensNWBridge',1,17,17,8,25,3000,7000,0,4,313.815,-3718.22,26.5065,4.61206,'1406:0 1450:0 '),\n+(1450,'BarrensNW1',1,17,379,8,25,3000,7000,0,4,319.615,-3637.99,27.1854,4.5885,'1449:0 1451:0 1473:0 1474:0 '),\n+(1451,'BarrensNW2',1,17,17,8,25,3000,7000,0,4,824.833,-3721.02,27.1993,3.19834,'1389:0 1450:0 1452:0 '),\n+(1452,'BarrensNW3',1,17,17,8,25,3000,7000,0,0,1017.81,-3739.15,27.7416,5.18933,'1388:0 1389:0 1451:0 1453:0 1455:0 1459:0 '),\n+(1453,'BarrensNW4',1,17,17,8,25,3000,7000,0,4,1260.21,-3830.17,30.3266,3.3515,'1388:0 1452:0 1454:0 '),\n+(1454,'BarrensNW5',1,17,815,8,25,3000,7000,0,4,1550.39,-3863.76,40.7872,0.119578,'1360:0 1453:0 '),\n+(1455,'BarrensNW6',1,17,381,12,25,3000,7000,0,0,1205.41,-3622.44,82.8357,4.34975,'1452:0 1456:0 1457:0 '),\n+(1456,'BarrensNW7',1,17,381,12,25,3000,7000,0,0,1348.99,-3642.47,111.642,2.66035,'1455:0 1457:0 '),\n+(1457,'BarrensNW8',1,17,381,12,25,3000,7000,0,0,1351.11,-3571.19,92.4931,1.99552,'1455:0 1456:0 1458:0 '),\n+(1458,'BarrensNW9',1,17,381,8,25,3000,7000,0,0,1340.7,-3455.1,93.8483,3.69787,'1457:0 '),\n+(1459,'BarrensNW10',1,17,17,12,25,3000,7000,0,0,1103.13,-3455.42,87.1314,4.31322,'1452:0 1460:0 1462:0 1465:0 '),\n+(1460,'BarrensNW11',1,17,17,12,25,3000,7000,0,0,724.802,-3585.11,91.2962,0.655228,'1459:0 1461:0 '),\n+(1461,'BarrensNW12',1,17,17,8,25,3000,7000,0,0,383.869,-3439.47,95.2678,5.6425,'1460:0 1470:0 1471:0 '),\n+(1462,'BarrensNW13',1,17,17,12,25,3000,7000,0,0,1223.08,-3084.31,93.9201,4.30731,'1459:0 1463:0 1464:0 1466:0 '),\n+(1463,'BarrensNW14',1,17,17,18,25,3000,7000,0,0,1229.76,-2928.45,141.696,4.49974,'1462:0 1464:0 '),\n+(1464,'BarrensNW15',1,17,17,12,25,3000,7000,0,0,1012.81,-2999.42,92.4922,0.109361,'1462:0 1463:0 1465:0 1466:0 1467:0 1469:0 '),\n+(1465,'BarrensNW16',1,17,382,12,25,3000,7000,0,0,955.029,-3084.95,93.7057,5.40099,'1459:0 1464:0 1466:0 '),\n+(1466,'BarrensNW17',1,17,382,12,25,3000,7000,0,0,1020.82,-3080.5,105.204,1.82743,'1462:0 1464:0 1465:0 '),\n+(1467,'BarrensNW18',1,17,17,8,25,3000,7000,0,0,898.48,-2740.8,99.757,5.46973,'1464:0 1468:0 1469:0 '),\n+(1468,'BarrensNW19',1,17,17,8,25,3000,7000,0,0,803.624,-2654.79,91.6669,5.87813,'1467:0 1469:0 1496:0 1497:0 '),\n+(1469,'BarrensNW20',1,17,17,8,25,3000,7000,0,0,605.003,-2881.18,91.6679,0.109375,'1464:0 1467:0 1468:0 1470:0 1471:0 1493:0 1496:0 '),\n+(1470,'BarrensNW21',1,17,17,8,25,3000,7000,0,0,470.698,-3149.25,95.5705,1.16378,'1461:0 1469:0 1471:0 1472:0 '),\n+(1471,'BarrensNW22',1,17,17,8,25,3000,7000,0,0,382.399,-3074.79,91.8682,5.88794,'1461:0 1469:0 1470:0 1472:0 1477:0 '),\n+(1472,'BarrensNW23',1,17,17,8,25,3000,7000,0,0,146.635,-3204.39,80.1468,0.405853,'1470:0 1471:0 1473:0 1474:0 1477:0 1478:0 1479:0 '),\n+(1473,'BarrensNW24',1,17,17,8,25,3000,7000,0,0,204.31,-3418.93,30.6025,4.75106,'1450:0 1472:0 1474:0 '),\n+(1474,'BarrensNW25',1,17,17,8,25,3000,7000,0,0,18.7822,-3604.62,27.213,0.267903,'1442:0 1443:0 1450:0 1472:0 1473:0 1476:0 '),\n+(1475,'BarrensNW26',1,17,391,8,25,3000,7000,0,0,-701.915,-3931.25,25.2456,2.31781,'35:0 1476:0 '),\n+(1476,'BarrensNW27',1,17,17,8,25,3000,7000,0,0,-364.212,-3750.15,28.5958,0.262038,'1442:0 1475:0 1474:0 '),\n+(1477,'BarrensNW28',1,17,17,8,25,3000,7000,0,0,111.71,-2964.41,95.9003,5.8816,'1471:0 1472:0 1478:0 1491:0 1492:0 '),\n+(1478,'BarrensNW29',1,17,1699,8,25,3000,7000,0,0,-7.39568,-3036.98,91.6667,5.57137,'1472:0 1477:0 1479:0 1480:0 1489:0 1491:0 '),\n+(1479,'BarrensNW30',1,17,1699,8,25,3000,7000,0,0,-80.6494,-3175.83,92.6429,0.527153,'1472:0 1478:0 1480:0 '),\n+(1480,'BarrensNW31',1,17,1699,8,25,3000,7000,0,0,-43.7595,-3360.78,91.6672,1.44018,'1478:0 1479:0 1481:0 '),\n+(1481,'BarrensNW32',1,17,1699,8,25,3000,7000,0,0,-298.484,-3473.6,91.6745,0.415233,'1480:0 1482:0 1483:0 '),\n+(1482,'BarrensNW33',1,17,17,8,25,3000,7000,0,0,-636.173,-3699.63,92.7051,0.694045,'1481:0 1483:0 '),\n+(1483,'BarrensNW34',1,17,17,8,25,3000,7000,0,0,-807.155,-3308.81,91.6657,5.92872,'1482:0 1481:0 1485:0 1486:0 1484:0 '),\n+(1484,'BarrensNW35',1,17,17,8,25,3000,7000,0,0,-1029.31,-3412.99,75.3336,4.91947,'35:0 1483:0 1485:0 1563:0 '),\n+(1485,'BarrensNW36',1,17,17,8,25,3000,7000,0,0,-949.557,-3245.5,94.7159,4.38735,'1483:0 1486:0 1536:0 1538:0 1484:0 1563:0 '),\n+(1486,'BarrensNW37',1,17,17,8,25,3000,7000,0,0,-679.296,-2946.69,95.7877,4.08497,'1487:0 1488:0 1483:0 1485:0 1535:0 1536:0 1537:0 1539:0 '),\n+(1487,'BarrensNW38',1,17,17,8,25,3000,7000,0,0,-494.28,-2779.02,91.6669,0.741136,'1486:0 32:0 1488:0 '),\n+(1488,'BarrensNW39',1,17,1699,8,25,3000,7000,0,0,-242.594,-2859.38,91.9719,3.12681,'1486:0 1487:0 1489:0 1490:0 1491:0 '),\n+(1489,'BarrensNW40',1,17,1699,8,25,3000,7000,0,0,-191.258,-3014.29,91.6673,2.33356,'1478:0 1488:0 1491:0 '),\n+(1490,'BarrensNW41',1,17,458,8,25,3000,7000,0,0,-264.197,-2688.78,95.0971,4.53071,'32:0 1488:0 1491:0 1525:0 '),\n+(1491,'BarrensNW42',1,17,17,8,25,3000,7000,0,0,72.2048,-2789.84,95.8713,3.29567,'1490:0 1488:0 1489:0 1477:0 1478:0 1492:0 1525:0 '),\n+(1492,'BarrensNW43',1,17,458,8,25,3000,7000,0,0,205.138,-2695.31,91.667,3.68445,'1477:0 1491:0 1493:0 1494:0 1495:0 '),\n+(1493,'BarrensNW44',1,17,458,8,25,3000,7000,0,0,400.957,-2643.1,91.667,3.49596,'1469:0 1492:0 1494:0 1496:0 '),\n+(1494,'BarrensNW45',1,17,17,8,25,3000,7000,0,0,266.964,-2535.13,91.6658,3.36441,'1492:0 1493:0 1495:0 '),\n+(1495,'BarrensNW46',1,17,17,8,25,3000,7000,0,0,78.9108,-2561.24,92.6826,5.54193,'1492:0 1494:0 1524:0 '),\n+(1496,'BarrensNW47',1,17,458,8,25,3000,7000,0,0,575.696,-2568.22,95.8126,5.44179,'1468:0 1469:0 1493:0 1497:0 '),\n+(1497,'BarrensNW48',1,17,458,8,25,3000,7000,0,0,687.068,-2366.64,91.6681,4.22717,'1468:0 1496:0 1498:0 1499:0 '),\n+(1498,'BarrensNW49',1,17,458,8,25,3000,7000,0,0,804.041,-2282.18,91.6685,3.41822,'1497:0 1499:0 1500:0 1519:0 '),\n+(1499,'BarrensNW50',1,17,17,12,25,3000,7000,0,0,703.606,-2031.77,91.6667,4.72591,'1497:0 1498:0 1500:0 1509:0 1510:0 '),\n+(1500,'BarrensNW51',1,17,17,12,25,3000,7000,0,0,529.014,-2166.69,94.5542,0.545634,'1498:0 1499:0 1501:0 '),\n+(1501,'DreadmistPeak1',1,17,384,12,25,3000,7000,0,0,459.817,-2082.78,138.447,5.5015,'1500:0 1502:0 1504:0 '),\n+(1502,'DreadmistPeak2',1,17,384,12,25,3000,7000,0,0,375.749,-2068.56,138.668,6.1259,'1501:0 1503:0 '),\n+(1503,'DreadmistPeak3',1,17,384,12,25,3000,7000,0,0,324.847,-1976.99,98.671,5.27963,'1502:0 1510:0 1520:0 '),\n+(1504,'DreadmistPeak4',1,17,384,12,25,3000,7000,0,0,417.639,-2212.21,181.222,1.37424,'1501:0 1505:0 '),\n+(1505,'DreadmistPeak5',1,17,384,12,25,3000,7000,0,0,307.073,-2144.55,210.989,5.7273,'1504:0 1506:0 1507:0 '),\n+(1506,'DreadmistPeak6',1,17,2138,12,25,3000,7000,0,0,319.238,-2233.42,211.954,1.68053,'1505:0 '),\n+(1507,'DreadmistPeak7',1,17,384,8,25,3000,7000,0,0,353.055,-2209.97,222.18,1.93971,'1505:0 1508:0 '),\n+(1508,'DreadmistPeak8',1,17,384,17,25,3000,7000,0,0,322.312,-2277.26,243.384,1.42331,'1507:0 '),\n+(1509,'BarrensNW52',1,17,17,12,25,3000,7000,0,0,583.146,-1755.46,92.9558,1.45863,'1499:0 1510:0 1511:0 '),\n+(1510,'BarrensNW53',1,17,17,8,25,3000,7000,0,0,372.587,-1848.86,91.6675,6.01198,'1503:0 1499:0 1509:0 1520:0 1521:0 1522:0 '),\n+(1511,'BarrensNW54',1,17,383,12,25,3000,7000,0,0,535.439,-1429.14,91.6668,4.989,'1509:0 1512:0 1514:0 1515:0 1516:0 '),\n+(1512,'BarrensNW55',1,17,383,12,25,3000,7000,0,0,709.638,-1260.36,91.682,3.91105,'1511:0 1513:0 '),\n+(1513,'BarrensNW56',1,17,383,12,25,3000,7000,0,0,817.064,-1365.59,91.871,2.68583,'1512:0 '),\n+(1514,'BarrensNW57',1,17,383,12,25,3000,7000,0,0,532.937,-1155.43,91.6668,4.67093,'1511:0 '),\n+(1515,'BarrensNW58',1,17,383,12,25,3000,7000,0,0,296.616,-1482.58,91.6668,0.139182,'1511:0 1517:0 1516:0 1520:0 '),\n+(1516,'BarrensNW59',1,17,383,12,25,3000,7000,0,0,300.682,-1617.75,91.6668,0.681106,'1511:0 1515:0 1517:0 1520:0 '),\n+(1517,'BarrensNW60',1,17,17,8,25,3000,7000,0,0,42.8186,-1528.23,91.6728,3.42876,'1515:0 1516:0 1520:0 1523:0 1531:0 1533:0 '),\n+(1518,'BarrensExitN1h',1,17,1703,8,25,3000,7000,0,4,1261.05,-2223.39,92.0335,0.0904736,'1110:0 1519:0 '),\n+(1519,'BarrensExitN2',1,17,1703,8,25,3000,7000,0,0,1157.98,-2338.54,92.3068,2.80599,'1111:0 1498:0 1518:0 '),\n+(1520,'BarrensNW61',1,17,17,8,25,3000,7000,0,0,242.384,-1748.46,91.6668,5.32751,'1503:0 1510:0 1515:0 1516:0 1517:0 1521:0 '),\n+(1521,'BarrensNW62',1,17,17,8,25,3000,7000,0,0,130.568,-1864.4,92.6122,0.169403,'1510:0 1520:0 1522:0 1523:0 '),\n+(1522,'BarrensNW63',1,17,386,8,25,3000,7000,0,0,132.261,-1980.79,93.8709,0.723104,'1510:0 1521:0 1524:0 1528:0 '),\n+(1523,'BarrensNW64',1,17,17,8,25,3000,7000,0,0,-136.632,-1764.4,93.1031,0.640629,'1517:0 1521:0 1524:0 1528:0 1529:0 1530:0 1531:0 '),\n+(1524,'BarrensNW65',1,17,17,8,25,3000,7000,0,0,-73.4923,-2214.29,92.1839,1.03725,'1495:0 1522:0 1523:0 1527:0 1528:0 '),\n+(1525,'BarrensNW66',1,17,17,8,25,3000,7000,0,0,-246.525,-2527.3,91.7286,5.22342,'1490:0 1491:0 1527:0 1526:0 1528:0 '),\n+(1526,'BarrensNW67',1,17,380,8,25,3000,7000,0,4,-349.471,-2524,95.5815,4.46591,'32:0 1525:0 1527:0 '),\n+(1527,'BarrensNW68',1,17,17,8,25,3000,7000,0,0,-344.921,-2376.03,92.3735,5.15509,'1524:0 1525:0 1526:0 1528:0 1534:0 '),\n+(1528,'BarrensNW69',1,17,17,8,25,3000,7000,0,0,-281.4,-2113.94,95.7902,6.18005,'1522:0 1523:0 1524:0 1525:0 1527:0 1529:0 '),\n+(1529,'BarrensNW70',1,17,17,8,25,3000,7000,0,0,-430.244,-1826.78,95.7877,0.218878,'1523:0 1528:0 1530:0 1557:0 '),\n+(1530,'BarrensNW71',1,17,17,8,25,3000,7000,0,0,-515.745,-1537.11,91.6677,5.10603,'1523:0 1529:0 1531:0 1532:0 1557:0 '),\n+(1531,'BarrensNW72',1,17,17,8,25,3000,7000,0,0,-343.855,-1488.98,92.6671,5.38288,'1517:0 1523:0 1530:0 1532:0 '),\n+(1532,'BarrensExitW1h',1,17,1702,8,25,3000,7000,0,4,-390.512,-1368.33,91.7005,4.15177,'1530:0 1531:0 1533:0 '),\n+(1533,'BarrensExitW2h',1,17,17,13,25,3000,7000,0,0,-245.782,-1071.05,33.877,5.35494,'1517:0 1532:0 1619:0 1621:0 '),\n+(1534,'BarrensC1',1,17,17,8,25,3000,7000,0,0,-554.876,-2457.12,91.7172,0.415224,'1527:0 1535:0 '),\n+(1535,'BarrensC2',1,17,458,8,25,3000,7000,0,0,-733.228,-2616.64,95.7878,6.07401,'32:0 1486:0 1534:0 1536:0 1537:0 1539:0 '),\n+(1536,'BarrensC3',1,17,388,8,25,3000,7000,0,0,-1088.78,-2943.42,93.188,0.309157,'1485:0 1486:0 1535:0 1537:0 1538:0 1539:0 1563:0 '),\n+(1537,'BarrensC4',1,17,388,8,25,3000,7000,0,0,-1234.76,-2828.43,94.4675,5.62828,'1486:0 1535:0 1536:0 1542:0 1543:0 '),\n+(1538,'BarrensC5',1,17,17,8,25,3000,7000,0,0,-1482.86,-2989.48,91.6667,0.000901222,'1485:0 1536:0 1542:0 1543:0 1546:0 1545:0 1544:0 1563:0 '),\n+(1539,'BarrensC6',1,17,458,8,25,3000,7000,0,0,-950.333,-2486.75,94.2879,5.17669,'98:0 1486:0 1535:0 1536:0 1540:0 1541:0 '),\n+(1540,'BarrensC7',1,17,387,8,25,3000,7000,0,0,-1024.84,-2164.71,84.5132,0.52637,'98:0 1539:0 1541:0 '),\n+(1541,'BarrensC8',1,17,17,8,25,3000,7000,0,0,-1117.92,-2388.71,94.9693,5.93383,'1539:0 1540:0 1542:0 1556:0 '),\n+(1542,'BarrensC9',1,17,458,8,25,3000,7000,0,0,-1390.23,-2505.64,95.7878,4.84017,'1537:0 1538:0 1541:0 1543:0 1555:0 '),\n+(1543,'BarrensC10',1,17,458,8,25,3000,7000,0,0,-1623.03,-2514.87,91.6709,0.0433447,'1537:0 1538:0 1542:0 1546:0 1555:0 1544:0 '),\n+(1544,'BarrensC11',1,17,17,8,25,3000,7000,0,0,-1811.46,-3139.58,82.9337,0.885322,'1571:0 1545:0 1538:0 1543:0 1546:0 1568:0 1613:0 '),\n+(1545,'BarrensC12',1,17,1698,14,25,3000,7000,0,0,-1907.03,-2804.32,92.2989,1.69465,'1538:0 1546:0 1547:0 1548:0 1544:0 '),\n+(1546,'BarrensC13',1,17,1157,8,25,3000,7000,0,0,-1711.88,-2559.16,91.6722,0.463532,'1538:0 1543:0 1545:0 1548:0 1549:0 1544:0 '),\n+(1547,'BarrensC14',1,17,1698,14,25,3000,7000,0,0,-2248.79,-2613.16,92.2697,5.81799,'1545:0 1548:0 1550:0 1551:0 '),\n+(1548,'BarrensC15',1,17,1698,14,25,3000,7000,0,0,-2094.77,-2532.69,91.9084,5.93581,'1545:0 1546:0 1547:0 1549:0 1550:0 1551:0 1583:0 '),\n+(1549,'BarrensC16',1,17,1157,8,25,3000,7000,0,0,-1876.87,-2436.12,95.4993,5.38799,'1546:0 1548:0 1551:0 1552:0 1555:0 '),\n+(1550,'BarrensC17',1,17,1157,8,25,3000,7000,0,0,-2277.85,-2179.6,95.7945,5.15236,'174:0 1547:0 1548:0 1551:0 1552:0 1554:0 1583:0 1585:0 '),\n+(1551,'BarrensC18',1,17,1157,8,25,3000,7000,0,0,-2101.34,-2220.57,95.7877,5.73158,'174:0 1547:0 1548:0 1549:0 1550:0 1552:0 '),\n+(1552,'BarrensC19',1,17,1700,14,25,3000,7000,0,0,-1909.45,-2038.55,92.9508,3.72685,'1549:0 1550:0 1551:0 1553:0 1554:0 1555:0 1560:0 '),\n+(1553,'BarrensC20',1,17,1700,14,25,3000,7000,0,0,-2121.99,-1733.9,91.6668,3.88196,'174:0 1552:0 1554:0 1560:0 1584:0 '),\n+(1554,'BarrensC21',1,17,1700,14,25,3000,7000,0,0,-2085.34,-1938.99,95.871,2.79616,'174:0 1550:0 1552:0 1553:0 1560:0 '),\n+(1555,'BarrensC22',1,17,17,14,25,3000,7000,0,0,-1638.12,-2190.4,92.6765,5.08558,'1542:0 1543:0 1549:0 1552:0 1556:0 1558:0 1561:0 '),\n+(1556,'BarrensC23',1,17,17,8,25,3000,7000,0,0,-1266.05,-2043.5,92.6438,3.55996,'1541:0 1555:0 1557:0 1558:0 '),\n+(1557,'BarrensC24',1,17,17,8,25,3000,7000,0,0,-926.196,-1839.83,92.0056,5.03258,'98:0 1529:0 1530:0 1556:0 1558:0 '),\n+(1558,'BarrensC25',1,17,1700,14,25,3000,7000,0,0,-1425.03,-1796.65,92.0678,5.31103,'1555:0 1556:0 1557:0 1559:0 1561:0 '),\n+(1559,'BarrensC26',1,17,1700,14,25,3000,7000,0,0,-1440.3,-1560.56,95.9826,0.920663,'1558:0 1561:0 '),\n+(1560,'BarrensC27',1,17,1700,14,25,3000,7000,0,0,-1871.3,-1875.92,93.6595,4.45692,'1552:0 1553:0 1554:0 1561:0 '),\n+(1561,'BarrensC28',1,17,1700,14,25,3000,7000,0,0,-1612.86,-1781.52,91.7801,1.78067,'1555:0 1558:0 1559:0 1560:0 '),\n+(1562,'BarrensC29',1,17,391,8,25,3000,7000,0,0,-1376.36,-3840.81,18.7024,0.388567,'35:0 1565:0 1569:0 '),\n+(1563,'BarrensC30',1,17,17,8,25,3000,7000,0,0,-1136.17,-3317.73,91.835,0.363033,'1484:0 1485:0 1536:0 1538:0 1564:0 '),\n+(1564,'BarrensC31',1,17,17,8,25,3000,7000,0,0,-1232.04,-3640.85,93.8864,1.23286,'1563:0 1565:0 '),\n+(1565,'BarrensC32',1,17,17,12,25,3000,7000,0,0,-1358.56,-3651.68,91.8621,5.3562,'1562:0 1564:0 1566:0 '),\n+(1566,'BarrensC33',1,17,17,12,25,3000,7000,0,0,-1611.42,-3708.07,89.8631,0.284498,'1565:0 1567:0 1568:0 '),\n+(1567,'BarrensC34',1,17,17,12,25,3000,7000,0,0,-1630.78,-3593.7,93.0714,4.90264,'1566:0 1568:0 '),\n+(1568,'BarrensC35',1,17,17,12,25,3000,7000,0,0,-1755.9,-3578.38,93.1759,5.92169,'1544:0 1566:0 1567:0 '),\n+(1569,'BarrensC36',1,17,391,8,25,3000,7000,0,0,-1644.33,-3851.75,13.843,0.197311,'1562:0 1570:0 '),\n+(1570,'BarrensC37',1,17,385,8,25,3000,7000,0,0,-1877.52,-3684.16,8.56349,5.68766,'1569:0 1571:0 1572:0 1575:0 '),\n+(1571,'BarrensC38',1,17,385,8,25,3000,7000,0,0,-1962.03,-3412.38,56.1606,4.99848,'1544:0 1570:0 '),\n+(1572,'BarrensC39',1,17,385,8,25,3000,7000,0,0,-2093.49,-3786.65,1.11667,0.38229,'1570:0 1573:0 '),\n+(1573,'BarrensC40',1,17,385,33,45,3000,7000,0,0,-2168.16,-3893.99,0.105911,2.3988,'1572:0 1574:0 1900:0 '),\n+(1574,'BarrensC41',1,17,385,33,45,3000,7000,0,0,-2296.44,-3875.08,0.411085,0.0838384,'1573:0 1896:0 1900:0 '),\n+(1575,'NorthwatchHold1',1,17,385,12,25,3000,7000,0,4,-2006.43,-3674.7,21.8223,5.27337,'1570:0 1576:0 '),\n+(1576,'NorthwatchHold2',1,17,385,12,25,3000,7000,0,4,-2014.16,-3558.11,22.9401,4.40551,'1575:0 1577:0 '),\n+(1577,'NorthwatchHold3',1,17,385,12,25,3000,7000,0,4,-2105.62,-3592.85,59.4242,0.125087,'1576:0 1578:0 1579:0 '),\n+(1578,'NorthwatchHold4',1,17,385,8,25,3000,7000,0,4,-2106.59,-3663.32,96.1895,0.928159,'1577:0 '),\n+(1579,'NorthwatchHold5',1,17,385,12,25,3000,7000,0,4,-2186.42,-3696.81,90.2787,1.00002,'1577:0 1580:0 1581:0 '),\n+(1580,'NorthwatchHold6',1,17,385,12,25,3000,7000,0,4,-2222.08,-3775.47,130.862,0.551559,'1579:0 '),\n+(1581,'NorthwatchHold7',1,17,385,12,25,3000,7000,0,4,-2146.93,-3560.64,91.6658,4.29007,'1579:0 1582:0 '),\n+(1582,'NorthwatchHold8',1,17,385,12,25,3000,7000,0,4,-2088.88,-3507.98,130.084,4.00692,'1581:0 '),\n+(1583,'BarrensS1',1,17,1156,18,25,3000,7000,0,0,-2489.54,-2427.29,91.7094,6.28066,'1548:0 1550:0 1585:0 1586:0 '),\n+(1584,'BarrensS2',1,17,1156,18,25,3000,7000,0,0,-2509.21,-1790.84,91.6888,0.117235,'174:0 1553:0 1585:0 1586:0 1587:0 '),\n+(1585,'BarrensS3',1,17,1157,18,25,3000,7000,0,0,-2496.45,-2147.95,95.7846,6.25905,'174:0 1550:0 1583:0 1584:0 1586:0 '),\n+(1586,'BarrensS4',1,17,1157,18,25,3000,7000,0,0,-2759.08,-2184.15,95.793,0.0131506,'1583:0 1584:0 1585:0 1587:0 '),\n+(1587,'BarrensS5',1,17,1157,18,25,3000,7000,0,0,-2945.71,-2047.99,95.7879,0.507956,'1584:0 1586:0 1588:0 1589:0 1591:0 '),\n+(1588,'BarrensS6',1,17,1157,18,25,3000,7000,0,0,-3285.06,-2049.93,92.2466,6.10862,'1587:0 1589:0 1590:0 1591:0 1593:0 1594:0 1596:0 '),\n+(1589,'BarrensS7',1,17,390,18,25,3000,7000,0,0,-3079.79,-1941.98,94.9653,3.28119,'1587:0 1588:0 1590:0 '),\n+(1590,'BarrensS8',1,17,390,18,25,3000,7000,0,0,-3131.93,-1680.95,92.0185,4.74203,'1588:0 1589:0 '),\n+(1591,'BarrensS9',1,17,390,18,25,3000,7000,0,0,-3131.04,-2171.34,93.5897,1.45786,'1587:0 1588:0 1592:0 1596:0 '),\n+(1592,'BarrensS10',1,17,390,18,25,3000,7000,0,0,-3110.95,-2348.03,94.3578,1.81325,'1591:0 '),\n+(1593,'BarrensS11',1,17,1156,18,25,3000,7000,0,0,-3458.57,-1830.89,91.667,5.2042,'1588:0 1595:0 '),\n+(1594,'BarrensS12',1,17,1157,18,25,3000,7000,0,0,-3481.33,-2051.77,96.4547,0.0284251,'1588:0 1595:0 1596:0 '),\n+(1595,'BarrensS13',1,17,1157,18,25,3000,7000,0,0,-3653.21,-2015.41,91.6668,0.540897,'1593:0 1594:0 1596:0 1597:0 1599:0 1600:0 '),\n+(1596,'BarrensS14',1,17,1156,18,25,3000,7000,0,0,-3651.34,-2318.77,91.6674,0.625316,'1595:0 1588:0 1591:0 1594:0 1597:0 1607:0 1872:0 '),\n+(1597,'BarrensS15',1,17,1157,18,25,3000,7000,0,0,-3840.72,-2048.27,91.6821,6.27935,'1595:0 1596:0 1598:0 1599:0 1600:0 1607:0 '),\n+(1598,'BarrensS16',1,17,1157,18,25,3000,7000,0,0,-4067.36,-2048.82,91.6672,6.16353,'1597:0 1601:0 1602:0 1607:0 1610:0 '),\n+(1599,'BarrensS17',1,17,1701,18,25,3000,7000,0,0,-3730.53,-1594.06,93.2113,4.82441,'1595:0 1597:0 1600:0 1601:0 '),\n+(1600,'BarrensS18',1,17,1701,18,25,3000,7000,0,0,-3894.71,-1618.14,91.6668,0.128916,'1595:0 1597:0 1599:0 1601:0 '),\n+(1601,'BarrensS19',1,17,1701,18,25,3000,7000,0,0,-4039.89,-1841.83,94.2054,0.676733,'1598:0 1599:0 1600:0 1602:0 '),\n+(1602,'BarrensS20',1,17,1157,18,25,3000,7000,0,0,-4188.61,-1914.07,91.6668,5.68758,'1598:0 1601:0 1603:0 '),\n+(1603,'BarrensS21',1,17,1157,18,25,3000,7000,0,0,-4356.79,-1884.72,89.6352,5.97818,'1602:0 1604:0 1606:0 '),\n+(1604,'BarrensS22',1,17,1157,18,25,3000,7000,0,0,-4478.66,-1866.94,86.1087,1.26186,'1603:0 1605:0 '),\n+(1605,'BarrensRFK1',1,17,1717,18,25,3000,7000,0,0,-4476,-1686.51,81.5791,4.60765,'1604:0 '),\n+(1606,'BarrensRFD1',1,17,1316,30,40,3000,7000,0,0,-4487.33,-2054.23,75.9531,5.76807,'1603:0 '),\n+(1607,'BaelModan1',1,17,359,18,25,3000,7000,0,4,-3989.77,-2218.81,95.0004,6.06065,'1596:0 1597:0 1598:0 1608:0 '),\n+(1608,'BaelModan2',1,17,359,18,25,3000,7000,0,4,-4109.4,-2315.19,125.071,0.600164,'1607:0 1609:0 '),\n+(1609,'BaelModan3',1,17,2157,8,25,3000,7000,0,4,-4073.79,-2368.19,108.909,2.02644,'1608:0 '),\n+(1610,'BaelModan4',1,17,359,18,25,3000,7000,0,4,-4176.57,-2101.49,72.6592,0.294635,'1598:0 1611:0 '),\n+(1611,'BaelModan5',1,17,359,18,25,3000,7000,0,4,-4071.12,-2157.56,50.3844,2.75686,'1610:0 1612:0 '),\n+(1612,'BaelModan6',1,17,359,18,25,3000,7000,0,4,-4223.35,-2272.53,60.9001,0.575407,'1611:0 '),\n+(1613,'RaptorGrounds',1,17,1697,12,25,3000,7000,0,0,-2042.89,-3229.73,91.8767,0.499641,'1544:0 '),\n+(1614,'BarrensWC1',1,718,718,8,20,3000,7000,0,0,-692.325,-2048.77,65.8045,0.216115,'98:0 1615:0 '),\n+(1615,'BarrensWC2',1,718,718,12,25,3000,7000,0,0,-580.407,-2042.49,57.4486,4.80284,'1614:0 1616:0 '),\n+(1616,'BarrensWC3',1,718,718,12,25,3000,7000,0,0,-677.272,-2203.72,25.3109,0.830688,'1615:0 1617:0 '),\n+(1617,'BarrensWC4',1,718,718,12,25,3000,7000,0,0,-638.458,-2387.33,25.6848,1.69853,'1616:0 '),\n+(1618,'RatchetSpawn',1,17,392,8,20,3000,7000,0,1,-1057.17,-3641.62,23.878,5.32863,'35:0 '),\n+(1619,'BarrensExitW2_1a',1,17,17,13,25,3000,7000,0,2,-365.7,-970.989,26.4604,0.0515498,'1533:0 1620:0 '),\n+(1620,'BarrensExitW2_2',1,17,17,13,25,3000,7000,0,2,-257.953,-835.045,8.42398,4.38694,'1619:0 1621:0 1622:0 '),\n+(1621,'STMExitE',1,406,469,13,25,3000,7000,0,4,-231.912,-777.297,7.15901,4.25107,'1533:0 1620:0 1622:0 '),\n+(1622,'StonetalonSE1',1,406,469,13,25,3000,7000,0,0,-183.878,-696.708,0.285728,4.19806,'1620:0 1621:0 1623:0 '),\n+(1623,'StonetalonSE2',1,406,2538,13,25,3000,7000,0,0,7.63915,-645.484,-33.8698,3.50887,'1622:0 1624:0 1625:0 1626:0 1630:0 '),\n+(1624,'StonetalonSE3',1,406,469,13,25,3000,7000,0,0,-21.452,-771.961,1.19909,1.25477,'1623:0 1625:0 '),\n+(1625,'StonetalonSE4',1,406,469,13,25,3000,7000,0,0,173.964,-863.908,2.87119,2.42107,'1623:0 1624:0 '),\n+(1626,'StonetalonSE5',1,406,2537,13,25,3000,7000,0,0,127.03,-646.104,-0.157034,3.15149,'1623:0 1627:0 '),\n+(1627,'StonetalonSE6',1,406,2537,13,25,3000,7000,0,0,102.577,-522.122,3.25329,4.9677,'1626:0 1628:0 1629:0 '),\n+(1628,'StonetalonSE7',1,406,2537,13,25,3000,7000,0,0,219.214,-475.456,21.9453,3.60701,'1627:0 1629:0 '),\n+(1629,'StonetalonSE8',1,406,469,13,25,3000,7000,0,0,104.777,-261.978,5.20105,5.15819,'1627:0 1628:0 1632:0 1633:0 '),\n+(1630,'StonetalonSE9',1,406,2538,13,25,3000,7000,0,0,-62.1728,-442.081,-37.1112,5.01095,'1623:0 1631:0 '),\n+(1631,'StonetalonSE10',1,406,469,13,25,3000,7000,0,0,-29.9825,-291.416,-5.66732,4.59076,'1630:0 1632:0 '),\n+(1632,'StonetalonSE11',1,406,2539,13,25,3000,7000,0,0,-2.18294,-227.074,15.1619,4.29231,'1629:0 1631:0 1633:0 1640:0 '),\n+(1633,'StonetalonSE12',1,406,1076,13,25,3000,7000,0,0,59.7029,-127.555,15.3056,4.18039,'1629:0 1632:0 1634:0 '),\n+(1634,'StonetalonSE13',1,406,1076,13,25,3000,7000,0,0,109.545,-71.7213,22.4065,2.6092,'1633:0 1635:0 1641:0 '),\n+(1635,'StonetalonSE14',1,406,2540,13,25,3000,7000,0,0,23.5805,-29.4616,31.6752,5.8097,'1634:0 1636:0 '),\n+(1636,'StonetalonSE15',1,406,2540,13,25,3000,7000,0,0,-14.5426,41.0345,49.7486,5.30902,'1635:0 1637:0 '),\n+(1637,'StonetalonSE16',1,406,2540,13,25,3000,7000,0,0,-152.111,135.096,48.9698,5.51519,'1636:0 1638:0 '),\n+(1638,'StonetalonSE17',1,406,3157,13,25,3000,7000,0,0,-114.052,239.055,102.383,4.22518,'1637:0 1639:0 '),\n+(1639,'StonetalonSE18',1,406,3157,13,25,3000,7000,0,0,2.62312,403.85,101.011,3.79714,'1638:0 '),\n+(1640,'StonetalonSE19',1,406,2539,13,25,3000,7000,0,5,-235.218,-347.587,20.2574,0.490614,'1632:0 '),\n+(1641,'StonetalonSE20',1,406,1076,13,25,3000,7000,0,0,197.073,203.918,52.5873,4.43331,'1634:0 1642:0 '),\n+(1642,'StonetalonSE21',1,406,1076,13,25,3000,7000,0,0,274.453,322.855,41.911,4.60022,'1641:0 1643:0 '),\n+(1643,'StonetalonSE22',1,406,1076,13,25,3000,7000,0,0,447.877,347.349,47.8893,3.28665,'1642:0 1644:0 1646:0 '),\n+(1644,'StonetalonSE23',1,406,2541,13,25,3000,7000,0,0,426.687,491.945,98.4352,4.79266,'1643:0 1645:0 '),\n+(1645,'StonetalonSE24',1,406,2541,13,25,3000,7000,0,0,465.249,636.071,69.1319,4.43923,'1644:0 151:0 '),\n+(1646,'StonetalonSE25',1,406,1076,13,25,3000,7000,0,0,547.002,317.026,51.4155,2.61083,'1643:0 1647:0 1660:0 '),\n+(1647,'StonetalonSE26',1,406,461,13,25,3000,7000,0,0,944.851,205.469,22.8061,2.8916,'1646:0 1648:0 1649:0 1650:0 '),\n+(1648,'StonetalonE1',1,406,636,13,25,3000,7000,0,0,1111.38,-250.367,-1.11603,1.94521,'1647:0 153:0 1649:0 1651:0 1655:0 '),\n+(1649,'StonetalonE2',1,406,636,13,25,3000,7000,0,0,1154.28,55.6527,1.56437,2.89789,'1647:0 1648:0 152:0 1650:0 1651:0 1655:0 '),\n+(1650,'StonetalonE3',1,406,461,13,25,3000,7000,0,0,1307.08,338.017,30.2635,3.38681,'152:0 1647:0 1649:0 1651:0 '),\n+(1651,'StonetalonE4',1,406,461,13,25,3000,7000,0,0,1299.88,-37.5445,6.46784,2.5696,'152:0 1648:0 1649:0 1650:0 1655:0 '),\n+(1652,'StonetalonE5',1,406,463,13,25,3000,7000,0,0,1596.92,-164.112,37.8,1.7689,'152:0 1653:0 1656:0 '),\n+(1653,'StonetalonE6',1,406,461,13,25,3000,7000,0,0,1503.38,-325.077,23.7601,0.679167,'154:0 1652:0 1655:0 '),\n+(1654,'StonetalonE7',1,406,461,13,25,3000,7000,0,0,1239.88,-573.82,14.7456,2.30493,'153:0 1655:0 '),\n+(1655,'StonetalonE8',1,406,461,13,25,3000,7000,0,0,1274.45,-389.01,15.6582,4.91048,'153:0 154:0 1648:0 1649:0 1651:0 1653:0 1654:0 '),\n+(1656,'StonetalonE9',1,406,463,13,25,3000,7000,0,0,1689.34,-66.4877,90.3719,1.43312,'1652:0 1657:0 '),\n+(1657,'StonetalonE10',1,406,463,13,25,3000,7000,0,0,1683.31,88.067,136.952,4.78089,'1656:0 1658:0 '),\n+(1658,'StonetalonE11',1,406,463,13,25,3000,7000,0,0,1607.48,98.5127,98.5487,1.23875,'1657:0 1659:0 '),\n+(1659,'StonetalonE12',1,406,463,13,25,3000,7000,0,0,1607.14,183.852,104.64,5.9099,'1658:0 '),\n+(1660,'StonetalonC1',1,406,1076,13,25,3000,7000,0,0,741.152,432.351,64.3987,3.6401,'1646:0 1661:0 1662:0 '),\n+(1661,'StonetalonC2',1,406,1076,13,25,3000,7000,0,3,734.898,323.955,63.5237,1.26623,'1660:0 1662:0 '),\n+(1662,'StonetalonC3',1,406,1076,13,25,3000,7000,0,0,911.255,644.216,97.0932,4.02886,'1660:0 1661:0 45:0 1670:0 '),\n+(1663,'StonetalonC4',1,406,460,13,25,3000,7000,0,5,967.945,1059.83,107.154,4.48637,'45:0 1664:0 '),\n+(1664,'StonetalonC5',1,406,460,20,25,3000,7000,0,4,857.673,1068.45,134.552,6.12668,'1663:0 1665:0 '),\n+(1665,'StonetalonC6',1,406,406,20,25,3000,7000,0,4,770.751,1128.86,184.567,5.69273,'1664:0 1666:0 '),\n+(1666,'StonetalonC7',1,406,406,20,25,3000,7000,0,4,763.22,1201.45,167.109,4.77383,'1665:0 1667:0 '),\n+(1667,'StonetalonC8',1,406,406,20,25,3000,7000,0,4,612.567,1230.12,105.052,5.96764,'1666:0 1668:0 '),\n+(1668,'StonetalonC9',1,406,465,20,25,3000,7000,0,4,639.837,1320.23,57.7872,0.670119,'1667:0 1669:0 '),\n+(1669,'StonetalonC10',1,406,465,20,25,3000,7000,0,0,717.122,1407.26,-11.3895,4.23973,'1668:0 1698:0 1699:0 1703:0 '),\n+(1670,'StonetalonC11',1,406,1076,16,25,3000,7000,0,0,1254.55,723.188,177.709,3.60317,'1662:0 1671:0 1677:0 '),\n+(1671,'StonetalonC12',1,406,406,18,25,3000,7000,0,2,1149.35,812.103,216.145,0.074743,'1670:0 1672:0 '),\n+(1672,'StonetalonC13',1,406,406,18,25,3000,7000,0,2,1174.45,1039.29,211.338,4.51028,'1671:0 1673:0 '),\n+(1673,'StonetalonC14',1,406,406,18,25,3000,7000,0,2,1150.98,1125.82,230.66,4.8323,'1672:0 1674:0 '),\n+(1674,'StonetalonC15',1,406,406,18,25,3000,7000,0,2,1185.65,1218.77,221.734,4.2727,'1673:0 1675:0 '),\n+(1675,'StonetalonC16',1,406,406,18,25,3000,7000,0,2,1120.4,1212.75,204.833,0.0197749,'1674:0 1676:0 '),\n+(1676,'StonetalonC17',1,406,406,18,25,3000,7000,0,2,1150.62,1371.11,126.775,4.37873,'1675:0 1697:0 '),\n+(1677,'StonetalonC18',1,406,464,16,25,3000,7000,0,0,1370.73,733.802,156.258,3.23598,'1670:0 1678:0 1681:0 '),\n+(1678,'StonetalonC19',1,406,464,16,25,3000,7000,0,0,1446.65,663,145.249,2.57819,'1677:0 1679:0 1680:0 '),\n+(1679,'StonetalonC20',1,406,464,16,25,3000,7000,0,0,1553.51,543.727,164.574,2.16586,'1678:0 1680:0 '),\n+(1680,'StonetalonC21',1,406,464,16,25,3000,7000,0,0,1584.31,756.555,132.915,4.49848,'1678:0 1679:0 1681:0 1686:0 '),\n+(1681,'StonetalonC22',1,406,464,16,25,3000,7000,0,0,1440.45,891.877,138.324,4.65164,'1677:0 1680:0 1682:0 1683:0 '),\n+(1682,'StonetalonC23',1,406,464,16,25,3000,7000,0,0,1361.44,1063.47,166.157,5.2289,'1681:0 1683:0 '),\n+(1683,'StonetalonC24',1,406,464,16,25,3000,7000,0,0,1500.8,1046.96,144.855,4.37673,'1681:0 1682:0 1684:0 1685:0 '),\n+(1684,'StonetalonC25',1,406,464,16,25,3000,7000,0,0,1668.56,1003.04,136.669,2.88249,'1683:0 1685:0 1686:0 1687:0 '),\n+(1685,'StonetalonC26',1,406,406,16,25,3000,7000,0,0,1533.39,1167.23,150.198,5.27402,'1683:0 1684:0 1695:0 '),\n+(1686,'StonetalonC27',1,406,464,16,25,3000,7000,0,0,1837.17,772.144,145.217,3.08276,'1680:0 1684:0 1687:0 '),\n+(1687,'StonetalonC28',1,406,464,16,25,3000,7000,0,0,1832.42,946.127,147.601,2.87658,'1684:0 1686:0 1688:0 '),\n+(1688,'StonetalonN1',1,406,406,16,25,3000,7000,0,0,2089.45,985.763,224.629,0.496822,'1687:0 1689:0 1690:0 '),\n+(1689,'StonetalonN2',1,406,467,16,25,3000,7000,0,0,2389.72,1113.13,305.081,3.60307,'1688:0 '),\n+(1690,'StonetalonN3',1,406,467,16,25,3000,7000,0,0,2406.02,1262.32,293.173,4.48076,'39:0 1688:0 1691:0 1694:0 '),\n+(1691,'StonetalonN4',1,406,467,16,25,3000,7000,0,0,2308.04,1474.22,278.518,5.29758,'1692:0 1694:0 1690:0 '),\n+(1692,'StonetalonN5',1,406,468,16,25,3000,7000,0,0,2455.85,1706.87,321.807,3.7366,'1691:0 155:0 39:0 1694:0 '),\n+(1693,'StonetalonN6',1,406,468,16,25,3000,7000,0,4,2502.8,1923.14,341.618,4.8177,'155:0 '),\n+(1694,'StonetalonN7',1,406,467,18,25,3000,7000,0,0,2490.31,1474.07,262.723,0.177969,'39:0 1691:0 1692:0 1690:0 '),\n+(1695,'StonetalonW1',1,406,406,18,25,3000,7000,0,0,1531.08,1382.61,154.485,3.40792,'1685:0 1696:0 '),\n+(1696,'StonetalonW2',1,406,406,18,25,3000,7000,0,0,1396,1443.1,122.505,3.64354,'1695:0 1697:0 '),\n+(1697,'StonetalonW3',1,406,406,18,25,3000,7000,0,0,1250.91,1480.82,78.0749,3.62587,'1676:0 1696:0 1698:0 '),\n+(1698,'StonetalonW4',1,406,465,20,25,3000,7000,0,0,926.026,1574.39,-15.7829,5.87604,'1669:0 1697:0 1702:0 1703:0 '),\n+(1699,'StonetalonW5',1,406,465,20,25,3000,7000,0,0,546.937,1540.31,-5.73179,5.59329,'1669:0 1700:0 1703:0 '),\n+(1700,'StonetalonW6',1,406,465,20,25,3000,7000,0,0,498.082,1756.93,4.7637,5.0278,'1699:0 1701:0 1703:0 1704:0 '),\n+(1701,'StonetalonW7',1,406,465,20,25,3000,7000,0,0,684.965,1869.36,-7.54489,3.9518,'1700:0 1702:0 1703:0 '),\n+(1702,'StonetalonW8',1,406,465,20,25,3000,7000,0,0,905.075,1799.18,-4.36236,2.8974,'1698:0 1701:0 1703:0 '),\n+(1703,'StonetalonW9',1,406,465,20,25,3000,7000,0,0,709.779,1654.47,-27.9084,0.454811,'1669:0 1698:0 1699:0 1700:0 1701:0 1702:0 '),\n+(1704,'STMExitSW',1,406,465,20,25,3000,7000,0,0,386.19,1791.83,40.6481,5.89762,'1700:0 1705:0 '),\n+(1705,'DesolaceExitN',1,405,405,28,40,3000,7000,0,0,254.286,1837.65,86.6541,5.89961,'1704:0 1706:0 '),\n+(1706,'DesolaceN1',1,405,405,28,40,3000,7000,0,0,136.31,1790.75,86.2292,4.91001,'1705:0 1707:0 1708:0 1709:0 '),\n+(1707,'DesolaceN2',1,405,405,28,40,3000,7000,0,0,174.958,1580.05,166.08,3.19588,'1706:0 1708:0 '),\n+(1708,'DesolaceN3',1,405,405,28,40,3000,7000,0,0,-43.4822,1503,100.016,0.657084,'1706:0 1707:0 1709:0 1711:0 1712:0 1713:0 '),\n+(1709,'DesolaceN4',1,405,599,28,40,3000,7000,0,0,-240.456,1624.18,94.7617,2.12576,'1706:0 1708:0 1710:0 1711:0 1712:0 '),\n+(1710,'DesolaceN5',1,405,599,28,40,3000,7000,0,0,-478.435,1651.62,103.311,6.16664,'1709:0 1711:0 1724:0 1727:0 '),\n+(1711,'DesolaceN6',1,405,405,28,40,3000,7000,0,0,-519.027,1436.95,89.0591,0.360579,'1708:0 1709:0 1710:0 1712:0 1723:0 1743:0 1744:0 1745:0 '),\n+(1712,'DesolaceN7',1,405,405,28,40,3000,7000,0,0,-262.519,1170.51,90.2776,1.81553,'1708:0 1709:0 1711:0 1713:0 1717:0 1720:0 1723:0 '),\n+(1713,'DesolaceN8',1,405,405,28,40,3000,7000,0,0,-68.2755,1158.91,90.8663,1.88621,'1708:0 1712:0 1714:0 1717:0 1720:0 '),\n+(1714,'DesolaceN9',1,405,608,28,40,3000,7000,0,2,24.7744,1218.69,134.023,3.19194,'1713:0 1715:0 '),\n+(1715,'DesolaceN10',1,405,608,28,40,3000,7000,0,2,166.996,1219.58,166.116,3.12321,'1714:0 1716:0 '),\n+(1716,'DesolaceN11',1,405,608,28,40,3000,7000,0,2,222.502,1276.25,189.878,5.01405,'1715:0 60:0 '),\n+(1717,'DesolaceN12',1,405,603,28,40,3000,7000,0,0,-37.1114,929.567,91.722,2.17957,'1712:0 1713:0 1718:0 1720:0 1721:0 '),\n+(1718,'DesolaceN13',1,405,603,28,40,3000,7000,0,0,7.08753,779.096,91.8455,4.34648,'1717:0 1719:0 '),\n+(1719,'DesolaceN14',1,405,603,28,40,3000,7000,0,0,-67.217,604.321,91.3718,1.59562,'1718:0 1720:0 1721:0 '),\n+(1720,'DesolaceN15',1,405,603,28,40,3000,7000,0,0,-319.285,898.298,89.3548,5.81712,'1712:0 1713:0 1717:0 1719:0 1721:0 1722:0 1723:0 '),\n+(1721,'DesolaceN16',1,405,603,28,40,3000,7000,0,0,-88.9887,771.679,132.892,1.27553,'1717:0 1719:0 1720:0 '),\n+(1722,'DesolaceN17',1,405,405,28,40,3000,7000,0,0,-524.771,816.278,91.0366,0.333055,'1720:0 1723:0 1744:0 '),\n+(1723,'DesolaceN18',1,405,405,28,40,3000,7000,0,0,-518.678,1099.09,93.063,6.1992,'1711:0 1712:0 1720:0 1722:0 1744:0 1745:0 '),\n+(1724,'DesolaceN19',1,405,599,28,40,3000,7000,0,0,-433.656,1712.56,127.171,4.07939,'1710:0 1725:0 1726:0 '),\n+(1725,'DesolaceN20',1,405,599,28,40,3000,7000,0,0,-346.92,1761.61,138.371,0.287887,'1724:0 '),\n+(1726,'DesolaceN21',1,405,599,28,40,3000,7000,0,0,-409.361,1865.43,127.463,4.65667,'1724:0 '),\n+(1727,'DesolaceN22',1,405,599,28,40,3000,7000,0,0,-557.524,1836.01,96.4213,5.15932,'1710:0 1728:0 1743:0 '),\n+(1728,'DesolaceN23',1,405,405,28,40,3000,7000,0,0,-596.61,2002.61,88.4432,6.14696,'1727:0 1729:0 1730:0 1731:0 1742:0 1743:0 '),\n+(1729,'DesolaceN24',1,405,405,28,40,3000,7000,0,0,-409.395,2019.53,98.1479,3.16245,'1728:0 1730:0 1731:0 '),\n+(1730,'DesolaceN25',1,405,598,28,40,3000,7000,0,0,-362.318,2211.47,90.4702,1.2127,'1728:0 1729:0 1731:0 1732:0 1733:0 '),\n+(1731,'DesolaceN26',1,405,2405,28,40,3000,7000,0,0,-574.499,2247.88,89.8498,5.11024,'1728:0 1729:0 1730:0 1732:0 1738:0 1741:0 1742:0 1772:0 '),\n+(1732,'DesolaceN27',1,405,2405,28,40,3000,7000,0,0,-436.581,2351.38,60.8605,4.01462,'1730:0 1731:0 1734:0 1735:0 '),\n+(1733,'DesolaceN28',1,405,598,28,40,3000,7000,0,0,-45.3846,2199.95,94.7517,3.10159,'1730:0 '),\n+(1734,'DesolaceN29',1,405,598,28,40,3000,7000,0,0,-223.597,2401.87,19.3117,3.25671,'1732:0 1735:0 '),\n+(1735,'DesolaceN30',1,405,598,28,40,3000,7000,0,0,-240.439,2492.2,1.43883,3.79864,'1732:0 1734:0 1736:0 1737:0 '),\n+(1736,'DesolaceN31',1,405,2405,28,40,3000,7000,0,0,-370.369,2605.96,1.54797,5.56185,'1735:0 1739:0 '),\n+(1737,'DesolaceN32',1,405,2406,31,40,3000,7000,0,0,263.113,2974.68,2.07535,3.87325,'1735:0 '),\n+(1738,'DesolaceN33',1,405,2405,28,40,3000,7000,0,0,-601.969,2431.57,74.1931,4.86205,'1731:0 1739:0 1741:0 '),\n+(1739,'DesolaceN34',1,405,2405,28,40,3000,7000,0,1,-502.176,2576.74,18.2199,4.19054,'1736:0 1738:0 1740:0 '),\n+(1740,'DesolaceN35',1,405,598,28,40,3000,7000,0,0,-719.849,2595.3,58.3371,6.23453,'1739:0 1741:0 '),\n+(1741,'DesolaceN36',1,405,405,31,40,3000,7000,0,0,-750.951,2392.96,91.9055,1.38273,'1731:0 1738:0 1740:0 1742:0 1770:0 1772:0 '),\n+(1742,'DesolaceN37',1,405,405,28,40,3000,7000,0,0,-759.272,2036.09,91.7138,1.7715,'1728:0 1731:0 1741:0 1770:0 1771:0 '),\n+(1743,'DesolaceN38',1,405,405,28,40,3000,7000,0,0,-785.037,1666.3,90.7953,3.33248,'1711:0 1727:0 1728:0 1745:0 1769:0 1770:0 '),\n+(1744,'DesolaceN39',1,405,609,28,40,3000,7000,0,0,-796.298,1079.33,90.2949,6.11672,'1711:0 1722:0 1723:0 1745:0 1746:0 1747:0 '),\n+(1745,'DesolaceN40',1,405,405,28,40,3000,7000,0,0,-754.549,1363.26,88.5616,5.47467,'1711:0 1723:0 1743:0 1744:0 1769:0 '),\n+(1746,'DesolaceN41',1,405,609,28,40,3000,7000,0,0,-897.587,897.096,95.0181,0.982181,'1744:0 1747:0 1748:0 '),\n+(1747,'DesolaceC1',1,405,405,28,40,3000,7000,0,0,-1125.97,1230.91,93.7933,5.43931,'1744:0 1746:0 1748:0 1749:0 1769:0 '),\n+(1748,'DesolaceC2',1,405,405,28,40,3000,7000,0,0,-1391.67,958.264,89.5921,0.552166,'1746:0 1747:0 1750:0 1751:0 '),\n+(1749,'DesolaceC3',1,405,405,28,40,3000,7000,0,0,-1427.18,1225.61,103.863,0.133931,'1747:0 129:0 1750:0 '),\n+(1750,'DesolaceC4',1,405,604,28,40,3000,7000,0,0,-1577.16,1114.97,90.6547,0.632647,'129:0 1748:0 1749:0 1751:0 1760:0 1762:0 '),\n+(1751,'DesolaceC5',1,405,604,28,40,3000,7000,0,0,-1631.55,978.868,90.3134,0.0954253,'1748:0 1750:0 1752:0 1759:0 1760:0 '),\n+(1752,'DesolaceC6',1,405,604,34,40,3000,7000,0,0,-1672.96,839.546,93.6943,1.409,'1751:0 1753:0 '),\n+(1753,'DesolaceC7',1,405,604,34,40,3000,7000,0,0,-1824.57,798.663,103.148,0.209302,'1752:0 1754:0 '),\n+(1754,'DesolaceC8',1,405,2198,34,40,3000,7000,0,0,-1847.21,666.041,107.727,1.26565,'1753:0 1755:0 1756:0 '),\n+(1755,'DesolaceC9',1,405,2198,34,40,3000,7000,0,0,-1837.82,584.775,136.457,1.64775,'1754:0 '),\n+(1756,'DesolaceC10',1,405,2198,34,40,3000,7000,0,0,-2020.93,674.999,118.726,6.26783,'1754:0 1757:0 '),\n+(1757,'DesolaceC11',1,405,2198,34,40,3000,7000,0,0,-2022.56,589.179,143.38,5.31357,'1756:0 1758:0 '),\n+(1758,'DesolaceC12',1,405,2198,34,40,3000,7000,0,0,-1933.59,514.493,164.939,2.49988,'1757:0 '),\n+(1759,'DesolaceC13',1,405,604,28,40,3000,7000,0,0,-1799.06,928.096,91.3039,0.218297,'1751:0 1760:0 1762:0 '),\n+(1760,'DesolaceC14',1,405,604,28,40,3000,7000,0,0,-1889.74,1110.04,92.5553,5.97134,'1750:0 1751:0 1759:0 1761:0 1762:0 '),\n+(1761,'DesolaceC15',1,405,405,31,40,3000,7000,0,0,-1897.9,1372.61,61.1381,4.74417,'1760:0 1762:0 1764:0 1777:0 1811:0 1813:0 '),\n+(1762,'DesolaceC16',1,405,604,28,40,3000,7000,0,0,-1749.34,1214.45,91.3952,0.204553,'1750:0 1759:0 1760:0 1761:0 1763:0 '),\n+(1763,'DesolaceC17',1,405,405,28,40,3000,7000,0,0,-1569.77,1277.99,87.9315,3.56017,'1762:0 1764:0 '),\n+(1764,'DesolaceC18',1,405,405,31,40,3000,7000,0,0,-1699.9,1433.42,61.6894,0.112268,'129:0 1761:0 1763:0 '),\n+(1765,'DesolaceC19',1,405,597,28,40,3000,7000,0,4,-1335.75,1704.43,89.9029,5.8932,'128:0 '),\n+(1766,'DesolaceC20',1,405,597,28,40,3000,7000,0,4,-1199.03,1771.37,99.5835,4.08873,'128:0 1767:0 '),\n+(1767,'DesolaceC21',1,405,597,28,40,3000,7000,0,4,-1157.92,1848.6,99.595,4.17119,'1766:0 1768:0 '),\n+(1768,'DesolaceC22',1,405,597,28,40,3000,7000,0,4,-1151.69,1938.33,88.8694,1.73253,'1767:0 '),\n+(1769,'DesolaceC23',1,405,405,31,40,3000,7000,0,0,-1193.57,1475.36,61.1112,4.30472,'128:0 129:0 1743:0 1745:0 1747:0 1770:0 1777:0 '),\n+(1770,'DesolaceC24',1,405,405,31,40,3000,7000,0,0,-1051.16,1759.04,62.2132,3.91398,'129:0 1741:0 1742:0 1743:0 1769:0 1771:0 1776:0 '),\n+(1771,'DesolaceC25',1,405,405,31,40,3000,7000,0,0,-1096.46,2045.41,58.5175,4.84859,'1742:0 1770:0 1772:0 1775:0 '),\n+(1772,'DesolaceC26',1,405,405,31,40,3000,7000,0,0,-1095.17,2383.16,92.5366,5.96779,'1731:0 1741:0 1771:0 1773:0 '),\n+(1773,'DesolaceC27',1,405,405,31,40,3000,7000,0,0,-1419.73,2331.31,91.8161,0.0556962,'1772:0 1774:0 1778:0 1779:0 1798:0 '),\n+(1774,'DesolaceC28',1,405,596,31,40,3000,7000,0,0,-1340.98,2101.55,63.5443,1.99366,'1773:0 1775:0 1776:0 1778:0 '),\n+(1775,'DesolaceC29',1,405,596,31,40,3000,7000,0,0,-1225.31,2021.97,59.0277,2.34708,'1771:0 1774:0 1776:0 '),\n+(1776,'DesolaceC30',1,405,596,31,40,3000,7000,0,0,-1362.19,1917.79,50.1441,0.929436,'128:0 1770:0 1774:0 1775:0 1777:0 '),\n+(1777,'DesolaceC31',1,405,405,31,40,3000,7000,0,0,-1575.89,1726.59,58.925,5.73608,'129:0 1761:0 1769:0 1776:0 1778:0 1809:0 1810:0 '),\n+(1778,'DesolaceC32',1,405,405,31,40,3000,7000,0,0,-1561.67,1991.32,61.6415,0.949069,'129:0 1773:0 1774:0 1777:0 1809:0 '),\n+(1779,'DesolaceC33',1,405,607,33,40,3000,7000,0,0,-1371.99,2554.03,108.02,4.4441,'1773:0 1780:0 1781:0 '),\n+(1780,'DesolaceC34',1,405,607,33,40,3000,7000,0,0,-1392.44,2659.84,112.065,5.41015,'1779:0 1781:0 '),\n+(1781,'DesolaceC35',1,405,607,33,40,3000,7000,0,0,-1251.49,2685.06,111.557,3.5193,'1779:0 1780:0 1782:0 1783:0 '),\n+(1782,'DesolaceC36',1,405,607,33,40,3000,7000,0,0,-1123.21,2688.52,111.831,2.59448,'1781:0 1783:0 '),\n+(1783,'DesolaceC37',1,405,607,33,40,3000,7000,0,0,-1161.95,2795.33,122.835,2.23711,'1781:0 1782:0 1784:0 1785:0 '),\n+(1784,'DesolaceC38',1,405,607,33,40,3000,7000,0,0,-1067.79,2918.91,179.121,3.97481,'1783:0 '),\n+(1785,'DesolaceC39',1,405,607,33,40,3000,7000,0,0,-1289.84,2920.03,113.966,5.30998,'1783:0 1786:0 '),\n+(1786,'DesolaceC40',1,405,607,33,40,3000,7000,0,0,-1360.57,2783.12,113.08,5.63201,'1785:0 127:0 1787:0 '),\n+(1787,'DesolaceC41',1,405,607,33,40,3000,7000,0,0,-1422.79,2793.13,111.697,0.937294,'127:0 1786:0 1788:0 '),\n+(1788,'DesolaceC42',1,405,607,33,40,3000,7000,0,0,-1470.51,2717.61,112.426,0.907843,'1787:0 1789:0 '),\n+(1789,'DesolaceC43',1,405,607,33,40,3000,7000,0,0,-1526.76,2740.76,111.941,5.60649,'1788:0 1790:0 '),\n+(1790,'DesolaceC44',1,405,607,33,40,3000,7000,0,0,-1487.94,2839.33,111.17,4.34789,'1789:0 1791:0 '),\n+(1791,'DesolaceC45',1,405,607,33,40,3000,7000,0,0,-1571.53,2902.93,112.301,5.73411,'1790:0 1794:0 '),\n+(1792,'DesolaceC46',1,405,2408,31,40,3000,7000,0,4,-1727.84,3103.88,35.0044,5.61552,'57:0 1793:0 '),\n+(1793,'DesolaceC47',1,405,598,31,40,3000,7000,0,4,-1841.75,3013.22,11.277,0.475075,'1792:0 1794:0 1795:0 '),\n+(1794,'DesolaceC48',1,405,598,31,40,3000,7000,0,0,-1852.69,2854.14,50.9586,0.237108,'1791:0 1795:0 1793:0 1796:0 1797:0 '),\n+(1795,'DesolaceC49',1,405,598,31,40,3000,7000,0,0,-1990.78,2803.76,56.2314,0.896844,'1794:0 1793:0 1796:0 1797:0 '),\n+(1796,'DesolaceS1',1,405,606,28,40,3000,7000,0,0,-2002.35,2610.23,62.383,1.22083,'1794:0 1795:0 1797:0 1799:0 1800:0 '),\n+(1797,'DesolaceS2',1,405,405,28,40,3000,7000,0,0,-1772.22,2471.83,73.3018,5.67404,'1794:0 1795:0 1796:0 1798:0 1800:0 '),\n+(1798,'DesolaceS3',1,405,405,31,40,3000,7000,0,0,-1592.19,2396.96,91.4972,2.81715,'1773:0 1797:0 1799:0 '),\n+(1799,'DesolaceS4',1,405,405,31,40,3000,7000,0,0,-1797.31,2149.68,62.4428,1.77847,'1796:0 1798:0 1800:0 1809:0 '),\n+(1800,'DesolaceS5',1,405,606,28,40,3000,7000,0,0,-1967.47,2474.94,61.5806,1.35043,'1796:0 1797:0 1799:0 1801:0 1803:0 '),\n+(1801,'DesolaceS6',1,405,606,28,40,3000,7000,0,0,-2098.84,2409.19,61.4027,3.19808,'1800:0 1802:0 1803:0 '),\n+(1802,'DesolaceExitS',1,405,405,28,40,3000,7000,0,0,-2402.61,2363.59,108.604,0.107536,'1801:0 1913:0 '),\n+(1803,'DesolaceS7',1,405,602,33,40,3000,7000,0,0,-2145.67,2180.6,67.6286,1.21495,'1800:0 1801:0 1804:0 1806:0 '),\n+(1804,'DesolaceS8',1,405,602,33,40,3000,7000,0,0,-2190.56,1992.71,64.0673,1.30332,'1803:0 1805:0 '),\n+(1805,'DesolaceS9',1,405,602,33,40,3000,7000,0,0,-2171.01,1903.5,66.9158,1.58018,'1804:0 1807:0 '),\n+(1806,'DesolaceS10',1,405,602,33,40,3000,7000,0,0,-1981.74,2045.99,59.3955,2.2831,'1803:0 1808:0 1809:0 '),\n+(1807,'DesolaceS11',1,405,602,33,40,3000,7000,0,0,-2096.65,1787.92,57.1531,1.95912,'1805:0 1808:0 1811:0 '),\n+(1808,'DesolaceS12',1,405,602,33,40,3000,7000,0,0,-1982.92,1838.14,63.409,3.36694,'1806:0 1807:0 1810:0 '),\n+(1809,'DesolaceS13',1,405,602,33,40,3000,7000,0,0,-1815.92,1988.94,59.0664,1.39951,'1777:0 1778:0 1799:0 1806:0 '),\n+(1810,'DesolaceS14',1,405,602,33,40,3000,7000,0,0,-1765.64,1678.32,60.7555,0.438962,'1777:0 1808:0 1811:0 '),\n+(1811,'DesolaceS15',1,405,405,31,40,3000,7000,0,0,-2062.67,1679.65,60.5781,5.56172,'1761:0 1807:0 1810:0 1812:0 '),\n+(1812,'DesolaceS16',1,405,2657,33,40,3000,7000,0,0,-2225.06,1577.55,60.1882,0.421288,'130:0 1811:0 '),\n+(1813,'DesolaceS17',1,405,2657,33,40,3000,7000,0,0,-2153.93,1293.66,63.9415,0.29169,'130:0 1761:0 '),\n+(1814,'MulgoreExitE',1,215,215,1,10,3000,7000,0,4,-2345.37,-1484.97,40.0713,4.66713,'174:0 1815:0 '),\n+(1815,'Mulgore1',1,215,215,1,10,3000,7000,0,4,-2440.53,-1200.03,-9.30534,1.55892,'1814:0 1816:0 1865:0 1869:0 '),\n+(1816,'Mulgore2',1,215,215,1,10,3000,7000,0,4,-2371.49,-904.809,-9.42438,4.38439,'1815:0 1817:0 1865:0 1866:0 1869:0 '),\n+(1817,'Mulgore3',1,215,215,1,10,3000,7000,0,4,-2311.97,-607.857,-9.42454,4.65338,'1816:0 26:0 1818:0 1819:0 1869:0 '),\n+(1818,'Mulgore4',1,215,223,1,10,3000,7000,0,4,-2105.91,-429.602,-6.83183,3.82086,'26:0 1817:0 1846:0 '),\n+(1819,'Mulgore5',1,215,215,1,10,3000,7000,0,4,-2475.36,-501.699,-9.42479,5.94732,'26:0 1817:0 1820:0 1869:0 '),\n+(1820,'Mulgore6',1,215,215,1,10,3000,7000,0,4,-2628.95,-190.942,-9.21765,5.24046,'1819:0 1821:0 1843:0 1844:0 1869:0 '),\n+(1821,'Mulgore7',1,215,215,1,10,3000,7000,0,4,-2844.69,184.459,62.1599,5.51927,'1820:0 1822:0 1843:0 1844:0 '),\n+(1822,'Mulgore8',1,215,215,1,10,3000,7000,0,4,-2993.74,194.655,71.8138,0.231569,'1821:0 1823:0 '),\n+(1823,'Mulgore9',1,215,220,1,10,3000,7000,0,4,-3072.38,82.3203,78.0188,1.03857,'1822:0 1824:0 '),\n+(1824,'Mulgore10',1,215,220,1,10,3000,7000,0,4,-3137.17,-93.9051,45.0213,1.34488,'1823:0 1825:0 1842:0 '),\n+(1825,'Mulgore11',1,215,220,1,10,3000,7000,0,4,-3063.95,-239.512,50.6424,1.85735,'1824:0 27:0 1842:0 '),\n+(1826,'Mulgore12',1,215,220,1,10,3000,7000,0,4,-2891.86,-697.729,45.2768,1.58442,'27:0 1827:0 1842:0 '),\n+(1827,'Mulgore13',1,215,220,1,10,3000,7000,0,4,-3261.33,-846.251,48.8421,0.235503,'1826:0 1828:0 1830:0 1841:0 1842:0 '),\n+(1828,'Mulgore14',1,215,220,1,10,3000,7000,0,4,-3366.64,-1016.68,109.367,6.12009,'1827:0 1829:0 '),\n+(1829,'Mulgore15',1,215,358,1,10,3000,7000,0,4,-3224,-1083.1,88.5366,2.85872,'1828:0 1830:0 '),\n+(1830,'Mulgore16',1,215,358,1,10,3000,7000,0,4,-3119.41,-1033.45,49.7491,3.46937,'1827:0 1829:0 1831:0 1832:0 '),\n+(1831,'Mulgore17',1,215,358,1,10,3000,7000,0,4,-3063.5,-1162.46,66.0398,0.149071,'1830:0 1832:0 1833:0 '),\n+(1832,'Mulgore18',1,215,358,1,10,3000,7000,0,4,-2991.05,-1001.3,57.8123,3.50664,'1830:0 1831:0 '),\n+(1833,'Mulgore19',1,215,358,1,10,3000,7000,0,4,-2989.95,-1155.46,58.1984,3.50469,'1831:0 1834:0 1837:0 '),\n+(1834,'Mulgore20',1,215,358,1,10,3000,7000,0,4,-2907.83,-1077.93,55.9333,3.94844,'1833:0 1835:0 1837:0 '),\n+(1835,'Mulgore21',1,215,358,1,10,3000,7000,0,4,-2844.44,-1016.64,56.9403,4.16051,'1834:0 1836:0 '),\n+(1836,'Mulgore22',1,215,358,1,10,3000,7000,0,4,-2854.01,-1100.12,90.8135,0.692983,'1835:0 '),\n+(1837,'Mulgore23',1,215,358,1,10,3000,7000,0,4,-2883.85,-1231.28,72.9943,1.82985,'1833:0 1834:0 1838:0 1840:0 '),\n+(1838,'Mulgore24',1,215,358,1,10,3000,7000,0,4,-3026.45,-1229.87,71.6597,6.01404,'1837:0 1839:0 '),\n+(1839,'Mulgore25',1,215,358,1,10,3000,7000,0,4,-2970.92,-1323.02,80.5074,1.92996,'1838:0 1840:0 '),\n+(1840,'Mulgore26',1,215,358,1,10,3000,7000,0,4,-2895.78,-1325.44,95.4793,2.24804,'1837:0 1839:0 '),\n+(1841,'Mulgore27',1,215,220,1,10,3000,7000,0,4,-3440.17,-866.836,69.6282,6.24768,'1827:0 1842:0 '),\n+(1842,'Mulgore28',1,215,220,1,10,3000,7000,0,4,-3367.33,-495.02,69.8435,4.71616,'1824:0 1825:0 1826:0 1827:0 1841:0 '),\n+(1843,'Mulgore29',1,215,818,1,10,3000,7000,0,4,-2404.86,217.609,48.1932,3.41043,'1820:0 1821:0 1844:0 1845:0 1847:0 1870:0 '),\n+(1844,'Mulgore30',1,215,215,1,10,3000,7000,0,4,-2261.05,-69.3042,-1.37537,2.79193,'1820:0 1821:0 1843:0 1845:0 1846:0 1847:0 '),\n+(1845,'Mulgore31',1,215,215,1,10,3000,7000,0,4,-1909.74,216.749,46.1874,3.10216,'1843:0 1844:0 1847:0 1848:0 1849:0 1871:0 '),\n+(1846,'Mulgore32',1,215,223,1,10,3000,7000,0,4,-2045.76,-343.178,-6.87874,4.09177,'1818:0 1844:0 1847:0 1862:0 1863:0 '),\n+(1847,'Mulgore33',1,215,215,1,10,3000,7000,0,4,-1920.69,-119.003,-11.7465,4.00341,'1843:0 1844:0 1845:0 1846:0 1848:0 1862:0 '),\n+(1848,'Mulgore34',1,215,215,1,10,3000,7000,0,4,-1668.96,-1.5923,-11.6961,3.52429,'1845:0 1847:0 1849:0 1850:0 1862:0 '),\n+(1849,'Mulgore35',1,215,215,1,10,3000,7000,0,5,-1427.28,82.3261,15.7467,3.85023,'1845:0 1848:0 1850:0 '),\n+(1850,'Mulgore36',1,215,215,1,10,3000,7000,0,4,-1347.57,320.413,8.78348,0.441607,'1848:0 1849:0 1851:0 1852:0 '),\n+(1851,'Mulgore37',1,1638,1638,1,10,3000,7000,0,4,-1148.06,245.946,40.6026,3.4811,'1850:0 1852:0 1853:0 1854:0 '),\n+(1852,'Mulgore38',1,215,215,1,10,3000,7000,0,4,-996.688,514.659,49.632,4.10942,'1850:0 1851:0 '),\n+(1853,'Mulgore39',1,215,215,1,10,3000,7000,0,4,-751.74,38.1612,-20.8616,2.04343,'1851:0 1854:0 1856:0 1855:0 '),\n+(1854,'Mulgore40',1,215,215,1,10,3000,7000,0,4,-927.854,10.2372,12.3669,2.39686,'1851:0 1853:0 1856:0 1855:0 '),\n+(1855,'Mulgore41',1,215,819,1,10,3000,7000,0,4,-561.426,-405.799,30.6454,1.96489,'1853:0 1854:0 1856:0 1857:0 '),\n+(1856,'Mulgore42',1,215,215,1,10,3000,7000,0,4,-901.7,-443.722,-39.0694,1.58907,'1853:0 1854:0 1855:0 1857:0 1861:0 '),\n+(1857,'Mulgore43',1,215,820,1,10,3000,7000,0,4,-924.517,-801.42,-5.66428,4.78761,'1855:0 1856:0 1858:0 1860:0 1861:0 '),\n+(1858,'Mulgore44',1,215,225,1,10,3000,7000,0,4,-956.811,-1082.75,42.1933,1.43395,'1857:0 1859:0 '),\n+(1859,'Mulgore45',1,215,225,1,10,3000,7000,0,4,-1099.12,-1152.59,50.0739,0.809557,'1858:0 1860:0 '),\n+(1860,'Mulgore46',1,215,820,1,10,3000,7000,0,4,-1365.16,-841.737,-8.11366,5.8636,'1857:0 1859:0 1861:0 1862:0 1863:0 '),\n+(1861,'Mulgore47',1,215,820,1,10,3000,7000,0,4,-1254.38,-429.801,-44.919,0.114484,'1856:0 1857:0 1860:0 1862:0 '),\n+(1862,'Mulgore48',1,215,820,1,10,3000,7000,0,4,-1600.99,-429.634,-38.9597,5.5357,'1846:0 1847:0 1848:0 1860:0 1861:0 1863:0 1864:0 '),\n+(1863,'Mulgore49',1,215,820,1,10,3000,7000,0,4,-1742.71,-749.243,-8.79196,6.02461,'1846:0 1860:0 1862:0 1864:0 1865:0 1866:0 '),\n+(1864,'Mulgore50',1,215,224,1,10,3000,7000,0,4,-1925.81,-713.913,3.65139,0.842938,'1862:0 1863:0 1865:0 1866:0 '),\n+(1865,'Mulgore51',1,215,215,1,10,3000,7000,0,4,-2111.14,-877.576,-5.68659,6.00889,'1815:0 1816:0 1863:0 1864:0 1866:0 '),\n+(1866,'Mulgore52',1,215,360,1,10,3000,7000,0,4,-1975.78,-1068.43,47.7644,0.687805,'1816:0 1863:0 1864:0 1865:0 1867:0 '),\n+(1867,'Mulgore53',1,215,360,1,10,3000,7000,0,4,-1884.66,-1112.51,92.8851,6.08152,'1866:0 1868:0 '),\n+(1868,'Mulgore54',1,215,360,1,10,3000,7000,0,4,-1584.13,-1092.53,103.917,3.87848,'1867:0 93:0 '),\n+(1869,'Mulgore55',1,215,215,1,10,3000,7000,0,4,-2751.82,-857.915,4.54324,5.9912,'1815:0 1816:0 1817:0 1819:0 1820:0 '),\n+(1870,'Mulgore56',1,215,818,1,10,3000,7000,0,4,-2369.44,444.618,66.6944,2.44118,'1843:0 '),\n+(1871,'Mulgore57',1,215,404,1,10,3000,7000,0,4,-1938.35,454.865,133.59,5.01926,'1845:0 '),\n+(1872,'DWMExitW',1,15,15,33,45,3000,7000,0,0,-3684.38,-2471.41,78.489,4.65716,'1596:0 99:0 '),\n+(1873,'DustwallowC1',1,15,15,33,45,3000,7000,0,0,-3476.61,-2710.46,33.3673,2.4724,'99:0 187:0 1903:0 1904:0 103:0 '),\n+(1874,'BlackhoofVillage',1,15,512,33,45,3000,7000,0,0,-2455.85,-3159.6,35.8624,3.43489,'102:0 1875:0 '),\n+(1875,'DustwallowN1',1,15,15,33,45,3000,7000,0,0,-2686.37,-3372.62,34.5997,0.845044,'101:0 102:0 1874:0 1876:0 1877:0 1902:0 '),\n+(1876,'DustwallowN2',1,15,15,33,45,3000,7000,0,0,-2562.07,-3486.87,34.2695,2.37303,'1875:0 1877:0 '),\n+(1877,'DustwallowN3',1,15,15,33,45,3000,7000,0,0,-2671.59,-3675.6,30.8794,2.00782,'101:0 110:0 1875:0 1876:0 1878:0 1879:0 1894:0 '),\n+(1878,'DustwallowN4',1,15,502,33,45,3000,7000,0,0,-2914.27,-3675.73,33.4338,1.38735,'101:0 110:0 1877:0 1879:0 1880:0 '),\n+(1879,'DustwallowN5',1,15,502,33,45,3000,7000,0,0,-2802.66,-3997.22,36.7838,2.19983,'110:0 1877:0 1878:0 1880:0 1892:0 '),\n+(1880,'DustwallowN6',1,15,502,33,45,3000,7000,0,0,-3155.95,-3974.68,29.251,1.17881,'110:0 1878:0 1879:0 1881:0 1887:0 '),\n+(1881,'DustwallowN7',1,15,15,33,45,3000,7000,0,0,-3305.97,-4095.97,23.4925,0.654559,'109:0 1880:0 '),\n+(1882,'DustwallowN8',1,15,15,33,45,3000,7000,0,0,-3491.34,-4245.46,7.816,1.17292,'109:0 54:0 1884:0 1912:0 '),\n+(1883,'TheramoreInn',1,15,513,33,45,3000,7000,0,3,-3627.66,-4472.85,17.4714,0.218669,'54:0 '),\n+(1884,'DustwallowCoastN1',1,15,518,33,45,3000,7000,0,0,-3458.13,-4377.69,0.755389,2.14564,'1882:0 1885:0 '),\n+(1885,'DustwallowCoastN2',1,15,518,33,45,3000,7000,0,0,-3329.33,-4289.33,1.48119,3.70268,'1884:0 1886:0 '),\n+(1886,'DustwallowCoastN3',1,15,518,33,45,3000,7000,0,0,-3142.27,-4215.25,0.891156,0.280307,'1885:0 1887:0 1897:0 '),\n+(1887,'DustwallowCoastN4',1,15,518,33,45,3000,7000,0,0,-2985.17,-4207.51,1.60007,3.33747,'1880:0 1886:0 1888:0 1897:0 '),\n+(1888,'DustwallowCoastN5',1,15,518,33,45,3000,7000,0,0,-2802.02,-4220.5,1.16157,3.12737,'1889:0 1887:0 1897:0 1898:0 '),\n+(1889,'DustwallowCoastN6',1,15,518,33,45,3000,7000,0,0,-2682.96,-4150.2,0.491195,3.24911,'1888:0 1890:0 1898:0 '),\n+(1890,'DustwallowCoastN7',1,15,518,33,45,3000,7000,0,0,-2644.79,-4076.96,0.24736,4.12678,'1889:0 1891:0 1892:0 1893:0 '),\n+(1891,'DustwallowCoastN8',1,15,518,33,45,3000,7000,0,0,-2634.51,-3970.05,1.40599,4.46647,'1890:0 1892:0 1893:0 1894:0 '),\n+(1892,'DustwallowCoastN9',1,15,518,33,45,3000,7000,0,0,-2678.39,-4014.18,4.97984,2.78377,'1879:0 1890:0 1891:0 '),\n+(1893,'DustwallowCoastN10',1,15,518,33,45,3000,7000,0,0,-2559.21,-4015.96,9.99785,3.70856,'1890:0 1891:0 1899:0 '),\n+(1894,'DustwallowCoastN11',1,15,518,33,45,3000,7000,0,0,-2607.14,-3826.64,6.27917,4.49985,'1877:0 1891:0 1895:0 '),\n+(1895,'DustwallowCoastN12',1,15,518,33,45,3000,7000,0,0,-2466.63,-3818.63,2.61691,3.22358,'1896:0 1894:0 1899:0 1900:0 '),\n+(1896,'DustwallowCoastN13',1,17,385,33,45,3000,7000,0,0,-2395.84,-3763.83,5.73158,5.36182,'1574:0 1895:0 '),\n+(1897,'DustwallowCoastN14',1,15,518,33,45,3000,7000,0,0,-3001.64,-4378.46,9.05538,1.1933,'1886:0 1887:0 1888:0 '),\n+(1898,'DustwallowCoastN15',1,15,518,33,45,3000,7000,0,0,-2662.99,-4255.03,3.90542,2.70126,'1888:0 1889:0 1901:0 '),\n+(1899,'DustwallowCoastN16',1,15,518,33,45,3000,7000,0,0,-2408.96,-4080.5,3.33986,2.28499,'1893:0 1895:0 1900:0 1901:0 '),\n+(1900,'DustwallowCoastN17',1,15,518,33,45,3000,7000,0,0,-2302.1,-4086.25,16.0641,1.37353,'1573:0 1574:0 1895:0 1899:0 1901:0 '),\n+(1901,'DustwallowCoastN18',1,15,518,33,45,3000,7000,0,0,-2291.73,-4303.19,4.72444,2.85793,'1898:0 1899:0 1900:0 '),\n+(1902,'DustwallowN9',1,15,15,33,45,3000,7000,0,0,-2942.4,-3252.27,31.3912,5.0692,'100:0 101:0 102:0 1875:0 1903:0 '),\n+(1903,'DustwallowC2',1,15,15,33,45,3000,7000,0,0,-3285.02,-3185.79,32.3767,5.19094,'1873:0 1902:0 1904:0 1905:0 '),\n+(1904,'DustwallowC3',1,15,2302,33,45,3000,7000,0,0,-3645.37,-3105.83,35.4956,0.749902,'99:0 1873:0 1903:0 1905:0 1907:0 103:0 '),\n+(1905,'DustwallowC4',1,15,4046,33,45,3000,7000,0,0,-3692.77,-3428.45,36.5831,1.67942,'1903:0 1904:0 1906:0 1907:0 '),\n+(1906,'DustwallowC5',1,15,501,33,45,3000,7000,0,0,-4023.01,-3761.02,42.2472,0.725162,'1905:0 1907:0 105:0 '),\n+(1907,'DustwallowC6',1,15,4049,33,45,3000,7000,0,0,-4017.64,-3385.66,38.3117,5.35312,'1904:0 1905:0 1906:0 103:0 105:0 '),\n+(1908,'DustwallowC7',1,15,510,33,45,3000,7000,0,0,-4230.28,-2794.11,27.7681,6.16323,'103:0 108:0 1909:0 '),\n+(1909,'DustwallowS1',1,15,509,33,45,3000,7000,0,0,-4392.92,-2968.72,72.0173,1.4685,'103:0 108:0 1908:0 233:0 105:0 '),\n+(1910,'DustwallowS2',1,15,511,33,45,3000,7000,0,0,-4652.75,-3983.64,63.5063,1.62756,'106:0 107:0 '),\n+(1911,'DustwallowS3',1,15,511,33,45,3000,7000,0,0,-4869.31,-3443.39,39.4441,0.620287,'106:0 107:0 233:0 '),\n+(1912,'DustwallowCoastS1',1,15,516,33,45,3000,7000,0,0,-3990.53,-4144.75,15.8765,3.0059,'104:0 1882:0 '),\n+(1913,'FeralasN1',1,357,1114,38,50,3000,7000,0,0,-2571.82,2244.63,96.3995,0.543668,'1802:0 1914:0 '),\n+(1914,'FeralasN2',1,357,1114,38,50,3000,7000,0,0,-2742,2335.99,62.5691,5.81565,'1913:0 1915:0 1920:0 1921:0 '),\n+(1915,'FeralasN3',1,357,1114,38,50,3000,7000,0,0,-2829.93,2719.49,74.7843,5.10291,'1914:0 1916:0 1920:0 '),\n+(1916,'FeralasN4',1,357,1114,38,50,3000,7000,0,0,-3032.68,2638.14,54.8507,0.249148,'1915:0 1917:0 1920:0 '),\n+(1917,'FeralasN5',1,357,1119,38,50,3000,7000,0,0,-3246.59,2815.94,85.1355,5.88045,'1916:0 1918:0 '),\n+(1918,'FeralasN6',1,357,1119,38,50,3000,7000,0,0,-3570.32,2569.75,80.1298,0.734128,'1917:0 1919:0 1923:0 '),\n+(1919,'FeralasN7',1,357,1119,38,50,3000,7000,0,0,-3349.08,2217.29,32.4203,2.18908,'1918:0 1920:0 1922:0 '),\n+(1920,'FeralasN8',1,357,1119,38,50,3000,7000,0,0,-2939.01,2249.46,45.7452,1.87688,'1914:0 1915:0 1916:0 1919:0 1921:0 '),\n+(1921,'FeralasN9',1,357,1111,50,60,3000,7000,0,0,-2867.51,1894.77,52.6495,3.09033,'1914:0 1920:0 '),\n+(1922,'FeralasN10',1,357,1119,38,50,3000,7000,0,0,-3464.98,2077.93,40.3195,0.882963,'1919:0 1923:0 1925:0 1926:0 '),\n+(1923,'FeralasN11',1,357,1119,38,50,3000,7000,0,0,-3508.95,2343.43,61.5171,1.82151,'1918:0 1922:0 1924:0 '),\n+(1924,'FeralasN12',1,357,1119,38,50,3000,7000,0,0,-3582.9,2225.74,39.1949,3.55134,'1923:0 1925:0 '),\n+(1925,'FeralasN13',1,357,1119,38,50,3000,7000,0,0,-3677.85,2192.02,79.5813,5.92325,'1922:0 1924:0 1929:0 '),\n+(1926,'FeralasN14',1,357,1119,38,50,3000,7000,0,0,-3902.37,1958.83,79.7325,5.2537,'1922:0 1927:0 1931:0 '),\n+(1927,'FeralasN15',1,357,1115,38,50,3000,7000,0,0,-3845.14,1829.16,124.075,1.98644,'1926:0 131:0 '),\n+(1928,'FeralasN16',1,357,1115,38,50,3000,7000,0,0,-3896.35,1647.85,117.592,4.8178,'131:0 '),\n+(1929,'FeralasN17',1,357,1119,38,50,3000,7000,0,0,-3899.54,2080.79,120.315,0.496151,'1925:0 1930:0 '),\n+(1930,'FeralasN18',1,357,1119,38,50,3000,7000,0,0,-4106.11,2126.23,91.7704,5.83686,'1929:0 1931:0 1932:0 '),\n+(1931,'FeralasN19',1,357,1119,38,50,3000,7000,0,0,-4171.24,2101.97,88.0788,0.490217,'1926:0 1930:0 1943:0 '),\n+(1932,'FeralasCoast1',1,357,1108,38,50,3000,7000,0,0,-4118.28,2330.97,2.19033,5.05932,'1930:0 1933:0 1935:0 '),\n+(1933,'FeralasCoast2',1,357,1108,38,50,3000,7000,0,0,-4052.79,2718.62,0.6784,4.75105,'1932:0 1934:0 1939:0 '),\n+(1934,'FeralasCoast3',1,357,1108,38,50,3000,7000,0,0,-3843.41,3064.54,7.61114,4.17574,'1933:0 '),\n+(1935,'FeralasCoast4',1,357,1108,38,50,3000,7000,0,0,-4379.47,2356.68,-0.331094,5.57371,'1932:0 1936:0 1937:0 1939:0 1944:0 '),\n+(1936,'FeralasCoast5',1,357,1108,38,50,3000,7000,0,0,-4743.36,2004.49,5.62754,0.704225,'1935:0 1937:0 1950:0 '),\n+(1937,'FeralasCoast6',1,357,1108,38,50,3000,7000,0,0,-4901.88,2189.77,1.21295,5.78972,'1935:0 1936:0 1938:0 '),\n+(1938,'FeralasCoast7',1,357,1108,38,50,3000,7000,0,0,-5436.32,2245.93,4.15669,6.02534,'1937:0 '),\n+(1939,'FeathermoonCoast',1,357,1116,38,50,3000,7000,0,2,-4396.44,3096.49,-0.543116,1.686,'58:0 1933:0 1935:0 '),\n+(1940,'SardorIsle1',1,357,1117,38,50,3000,7000,0,2,-4874.91,3238.84,9.84719,0.996823,'58:0 132:0 1941:0 '),\n+(1941,'SardorIsle2',1,357,1120,38,50,3000,7000,0,2,-4509.12,3541.55,19.5222,3.63969,'58:0 132:0 1940:0 '),\n+(1942,'ShalzarusLairInside',1,357,3117,38,50,3000,7000,0,0,-5628.12,3481.23,0.291859,1.03412,'140:0 '),\n+(1943,'FeralasC1',1,357,1108,38,50,3000,7000,0,0,-4354.27,2114.61,65.9115,3.94793,'1931:0 1944:0 '),\n+(1944,'FeralasC2',1,357,1108,38,50,3000,7000,0,0,-4459.61,2051.49,45.6382,0.749398,'1935:0 1943:0 1945:0 '),\n+(1945,'FeralasC3',1,357,1108,38,50,3000,7000,0,0,-4587.74,2020.12,49.7424,0.107333,'1944:0 1946:0 '),\n+(1946,'FeralasC4',1,357,1108,38,50,3000,7000,0,0,-4669.12,1941.38,71.209,4.65283,'1945:0 1947:0 '),\n+(1947,'FeralasC5',1,357,1136,38,50,3000,7000,0,0,-4689.38,1793.15,92.5165,3.59252,'1946:0 1948:0 1951:0 '),\n+(1948,'FeralasC6',1,357,1136,38,50,3000,7000,0,0,-4548.77,1825.47,91.6009,4.86489,'1947:0 1949:0 '),\n+(1949,'FeralasC7',1,357,2577,38,50,3000,7000,0,0,-4570.42,1333.99,110.276,1.57406,'1948:0 1952:0 1966:0 '),\n+(1950,'FeralasC8',1,357,1136,38,50,3000,7000,0,0,-4774.62,1706.39,79.0617,1.25399,'1936:0 1951:0 '),\n+(1951,'FeralasC9',1,357,1136,38,50,3000,7000,0,0,-4747.41,1601.96,83.6922,1.48372,'1947:0 1950:0 1952:0 1953:0 '),\n+(1952,'FeralasC10',1,357,1136,38,50,3000,7000,0,0,-4850.91,1315.71,81.0286,0.264391,'1949:0 1951:0 1966:0 '),\n+(1953,'FeralasC11',1,357,1105,38,50,3000,7000,0,0,-4984.77,1575.59,59.7078,0.164254,'1951:0 1954:0 1956:0 1964:0 '),\n+(1954,'FeralasC12',1,357,1105,38,50,3000,7000,0,0,-4932.88,1723.53,64.1127,4.66263,'1953:0 1955:0 '),\n+(1955,'FeralasC13',1,357,1105,38,50,3000,7000,0,0,-5149.79,1759.34,78.4796,0.706951,'1954:0 '),\n+(1956,'FeralasC14',1,357,1136,38,50,3000,7000,0,0,-5121.12,1597.3,62.6844,6.11245,'1953:0 1957:0 1964:0 '),\n+(1957,'FeralasC15',1,357,1136,38,50,3000,7000,0,0,-5312.41,1586.43,50.2301,2.5919,'1956:0 1958:0 1961:0 1964:0 '),\n+(1958,'FeralasC16',1,357,1106,38,50,3000,7000,0,0,-5747.35,1698.84,93.4873,6.16546,'1957:0 1959:0 '),\n+(1959,'FeralasC17',1,357,2522,38,50,3000,7000,0,0,-5765.25,1224.11,66.4458,1.50412,'1958:0 1960:0 '),\n+(1960,'FeralasC18',1,357,2522,38,50,3000,7000,0,0,-5550.63,1116.69,56.7549,0.496841,'1959:0 1961:0 '),\n+(1961,'FeralasC19',1,357,2522,38,50,3000,7000,0,0,-5461.46,1368.9,22.0332,4.46507,'1957:0 1960:0 1962:0 1964:0 '),\n+(1962,'FeralasC20',1,357,2522,38,50,3000,7000,0,0,-5595.89,1373.16,54.1263,3.31838,'1961:0 1963:0 '),\n+(1963,'FeralasC21',1,357,2522,38,50,3000,7000,0,0,-5687.79,1413.51,73.2559,3.3773,'1962:0 '),\n+(1964,'FeralasC22',1,357,2522,38,50,3000,7000,0,0,-5109.82,1250.83,51.7218,2.34252,'1953:0 1956:0 1957:0 1961:0 1965:0 '),\n+(1965,'FeralasC23',1,357,2522,38,50,3000,7000,0,0,-4947.18,1144.74,76.4718,2.43362,'1964:0 1966:0 '),\n+(1966,'FeralasC24',1,357,1136,38,50,3000,7000,0,0,-4819.41,1182.67,88.2722,1.88973,'1949:0 1952:0 1965:0 1967:0 '),\n+(1967,'FeralasC25',1,357,2521,38,50,3000,7000,0,0,-4850.75,1054.39,94.6178,1.13575,'1966:0 1968:0 '),\n+(1968,'FeralasC26',1,357,357,38,50,3000,7000,0,0,-4701.43,1002.11,106.384,2.81258,'1967:0 1969:0 1972:0 '),\n+(1969,'FeralasC27',1,357,357,38,50,3000,7000,0,0,-4686.71,913.041,90.3337,1.80138,'1968:0 1970:0 '),\n+(1970,'FeralasC28',1,357,357,38,50,3000,7000,0,0,-4641.48,856.356,83.6012,2.41398,'1969:0 1971:0 '),\n+(1971,'FeralasC29',1,357,357,38,50,3000,7000,0,0,-4679.42,716.437,75.2356,1.09647,'1970:0 1974:0 1981:0 '),\n+(1972,'FeralasC30',1,357,357,38,50,3000,7000,0,0,-4555.72,884.281,58.0988,3.21115,'1968:0 1973:0 '),\n+(1973,'FeralasC31',1,357,357,38,50,3000,7000,0,0,-4505.93,684.371,66.7637,1.78171,'1972:0 1974:0 1975:0 1976:0 '),\n+(1974,'FeralasE1',1,357,357,38,50,3000,7000,0,0,-4659.39,623.64,52.4147,4.96061,'1971:0 1973:0 1975:0 1978:0 2006:0 '),\n+(1975,'FeralasE2',1,357,357,38,50,3000,7000,0,0,-4635.27,542.675,37.1032,1.8524,'1973:0 1974:0 1976:0 1981:0 1993:0 1994:0 1995:0 '),\n+(1976,'FeralasE3',1,357,357,38,50,3000,7000,0,0,-4390.02,604.52,62.0106,2.9598,'1973:0 1975:0 1977:0 1995:0 2006:0 '),\n+(1977,'FeralasE4',1,357,1100,38,50,3000,7000,0,0,-4212.24,655.545,69.8097,3.6706,'1976:0 2005:0 2006:0 '),\n+(1978,'FeralasE5',1,357,2519,38,50,3000,7000,0,0,-4898.74,674.126,43.55,1.02185,'1974:0 1979:0 1981:0 1982:0 '),\n+(1979,'FeralasE6',1,357,2519,38,50,3000,7000,0,0,-4953.5,761.759,82.878,5.39652,'1978:0 1980:0 '),\n+(1980,'FeralasE7',1,357,2520,38,50,3000,7000,0,0,-4845.02,785.634,113.891,1.35172,'1979:0 178:0 '),\n+(1981,'FeralasE8',1,357,2519,38,50,3000,7000,0,0,-4880.52,558.22,12.8999,1.88775,'1971:0 1975:0 1978:0 1993:0 1994:0 '),\n+(1982,'FeralasE9',1,357,2519,38,50,3000,7000,0,0,-5149.35,692.713,54.9213,6.26831,'1978:0 1983:0 1994:0 '),\n+(1983,'FeralasE10',1,357,1101,38,50,3000,7000,0,0,-5319.6,478.232,53.9695,0.898155,'1982:0 1984:0 1994:0 '),\n+(1984,'FeralasE11',1,357,1101,38,50,3000,7000,0,0,-5163.07,220.677,54.4074,1.30064,'1983:0 1985:0 1986:0 1987:0 1988:0 1991:0 '),\n+(1985,'FeralasE12',1,357,1101,38,50,3000,7000,0,0,-5302,428.292,8.41442,3.73933,'1984:0 '),\n+(1986,'FeralasE13',1,357,1101,38,50,3000,7000,0,0,-5384.3,261.887,20.4496,0.905996,'1984:0 '),\n+(1987,'FeralasE14',1,357,1101,38,50,3000,7000,0,0,-5265.18,-4.42852,15.1479,1.56377,'1984:0 '),\n+(1988,'FeralasE15',1,357,1101,38,50,3000,7000,0,0,-5343.63,67.4607,28.7204,3.66077,'1984:0 1989:0 1990:0 '),\n+(1989,'FeralasE16',1,357,1101,38,50,3000,7000,0,0,-5450.99,119.201,27.5633,6.28204,'1988:0 '),\n+(1990,'FeralasE17',1,357,1101,38,50,3000,7000,0,0,-5340.47,-23.1596,18.5077,1.41062,'1988:0 '),\n+(1991,'FeralasE18',1,357,2519,38,50,3000,7000,0,0,-4991.17,205.185,56.0523,2.62992,'1984:0 136:0 1992:0 1994:0 '),\n+(1992,'FeralasE19',1,357,1137,38,50,3000,7000,0,0,-4866.29,339.413,26.1994,4.53453,'136:0 1991:0 1993:0 1994:0 1999:0 '),\n+(1993,'FeralasE20',1,357,357,38,50,3000,7000,0,0,-4722.79,464.496,31.986,3.94744,'1975:0 1981:0 1992:0 '),\n+(1994,'FeralasE21',1,357,2519,38,50,3000,7000,0,0,-5009.99,424.997,15.1355,0.648747,'1975:0 1981:0 1982:0 1983:0 1991:0 1992:0 '),\n+(1995,'FeralasE22',1,357,357,38,50,3000,7000,0,4,-4578.16,370.868,33.8808,1.77815,'1975:0 1976:0 53:0 2006:0 '),\n+(1996,'FeralasE23',1,357,1099,38,50,3000,7000,0,5,-4481.74,227.782,48.3927,0.264285,'53:0 '),\n+(1997,'FeralasE24',1,357,1099,38,50,3000,7000,0,4,-4376.3,121.922,32.6793,1.76165,'53:0 1998:0 '),\n+(1998,'FeralasE25',1,357,1137,38,50,3000,7000,0,4,-4328.21,-19.6833,60.5124,1.72631,'1997:0 2003:0 '),\n+(1999,'FeralasE26',1,357,357,38,50,3000,7000,0,0,-4659.2,184.738,43.8095,4.93936,'1992:0 2000:0 '),\n+(2000,'FeralasE27',1,357,357,38,50,3000,7000,0,0,-4603.74,66.3705,89.2353,5.28101,'1999:0 2001:0 '),\n+(2001,'FeralasE28',1,357,357,38,50,3000,7000,0,0,-4564.62,-31.7688,90.9571,1.80758,'2000:0 2002:0 '),\n+(2002,'FeralasE29',1,357,357,38,50,3000,7000,0,0,-4446.96,-44.7766,57.3336,5.9427,'2001:0 2003:0 2009:0 '),\n+(2003,'FeralasE30',1,357,1137,38,50,3000,7000,0,0,-4300.16,-85.5649,62.2238,2.29256,'1998:0 2002:0 2004:0 2007:0 2008:0 '),\n+(2004,'FeralasE31',1,357,2518,38,50,3000,7000,0,0,-4205.65,113.809,55.5058,4.08129,'2003:0 2006:0 137:0 '),\n+(2005,'FeralasE32',1,357,1100,38,50,3000,7000,0,0,-4133.72,537.891,69.2153,3.29981,'1977:0 2006:0 '),\n+(2006,'FeralasE33',1,357,357,38,50,3000,7000,0,0,-4279.19,459.305,53.0559,3.87904,'1974:0 1976:0 1977:0 1995:0 2004:0 2005:0 137:0 '),\n+(2007,'FeralasE34',1,357,1137,38,50,3000,7000,0,0,-4106.63,-81.3584,57.9545,3.10739,'2003:0 137:0 2008:0 '),\n+(2008,'FeralasE35',1,357,1137,38,50,3000,7000,0,0,-4234.2,-193.867,59.9266,1.9823,'2003:0 2007:0 2010:0 2017:0 '),\n+(2009,'FeralasE36',1,357,1137,38,50,3000,7000,0,0,-4457.62,-347.118,42.7385,1.56603,'2002:0 2010:0 2013:0 '),\n+(2010,'FeralasE37',1,357,1137,38,50,3000,7000,0,0,-4279.38,-302.439,53.8359,3.38225,'2008:0 2009:0 2011:0 '),\n+(2011,'FeralasE38',1,357,1137,38,50,3000,7000,0,0,-4304.01,-380.254,42.9873,1.37949,'2010:0 2012:0 '),\n+(2012,'FeralasE39',1,357,1137,38,50,3000,7000,0,0,-4323.94,-518.378,18.8016,1.66222,'2011:0 2013:0 2015:0 '),\n+(2013,'FeralasE40',1,357,1137,38,50,3000,7000,0,0,-4484.94,-528.383,12.6689,1.34413,'2009:0 2012:0 2014:0 '),\n+(2014,'FeralasE41',1,357,1137,38,50,3000,7000,0,0,-4483.85,-680.591,-13.4172,2.0451,'2013:0 40:0 2019:0 '),\n+(2015,'FeralasE42',1,357,1137,38,50,3000,7000,0,0,-4357.69,-582.597,3.62467,1.18115,'2012:0 2016:0 '),\n+(2016,'FeralasE43',1,357,1137,38,50,3000,7000,0,0,-4283.62,-657.145,-16.5908,4.73115,'2015:0 2019:0 '),\n+(2017,'FeralasE44',1,357,1137,38,50,3000,7000,0,0,-4097.49,-507.444,10.4313,4.54463,'2008:0 2018:0 '),\n+(2018,'FeralasE45',1,357,1137,38,50,3000,7000,0,0,-4189.57,-767.003,-39.6189,2.74803,'2017:0 2019:0 2023:0 '),\n+(2019,'FeralasE46',1,357,1137,38,50,3000,7000,0,0,-4273.71,-763.178,-44.585,1.5287,'40:0 2014:0 2016:0 2018:0 2020:0 '),\n+(2020,'ThousandNeedlesW1',1,400,400,23,35,3000,7000,0,0,-4400.82,-883.395,-57.6691,2.28464,'40:0 2019:0 2022:0 2024:0 '),\n+(2021,'ThousandNeedlesW2',1,400,400,23,35,3000,7000,0,0,-4635.23,-913.058,-56.816,0.876811,'40:0 2022:0 2030:0 '),\n+(2022,'ThousandNeedlesW3',1,400,400,23,35,3000,7000,0,0,-4526.31,-1003.24,-57.3019,0.841468,'2020:0 2021:0 2024:0 2025:0 '),\n+(2023,'ThousandNeedlesW4',1,400,400,23,35,3000,7000,0,0,-4265.7,-975.548,-52.6163,1.36572,'2018:0 2024:0 '),\n+(2024,'ThousandNeedlesW5',1,400,400,23,35,3000,7000,0,0,-4345.17,-1001.19,-55.4334,0.859138,'2020:0 2022:0 2023:0 2026:0 '),\n+(2025,'ThousandNeedlesW6',1,400,400,23,35,3000,7000,0,0,-4577.79,-1063.18,-51.9676,0.682426,'2022:0 2026:0 2027:0 '),\n+(2026,'ThousandNeedlesW7',1,400,480,23,35,3000,7000,0,0,-4478.86,-1145.77,-53.883,1.10654,'2024:0 2025:0 2028:0 '),\n+(2027,'ThousandNeedlesW8',1,400,400,23,35,3000,7000,0,0,-4653.89,-1114.06,-54.8856,5.97601,'2025:0 2028:0 2029:0 '),\n+(2028,'ThousandNeedlesW9',1,400,480,23,35,3000,7000,0,0,-4608.02,-1288.85,-51.0977,0.870926,'2026:0 2027:0 2033:0 2037:0 '),\n+(2029,'ThousandNeedlesW10',1,400,400,23,35,3000,7000,0,0,-4726.44,-1099.89,-54.2582,6.07616,'2027:0 2030:0 2033:0 '),\n+(2030,'ThousandNeedlesW11',1,400,400,23,35,3000,7000,0,0,-4790.74,-1025.56,-58.7304,0.476274,'2021:0 2029:0 2031:0 2058:0 '),\n+(2031,'ThousandNeedlesW12',1,400,400,23,35,3000,7000,0,0,-4923.35,-1082.53,-50.209,0.562663,'2030:0 2032:0 2035:0 '),\n+(2032,'ThousandNeedlesW13',1,400,400,23,35,3000,7000,0,0,-4838.39,-1191.4,-49.6151,2.08829,'2031:0 2033:0 2034:0 '),\n+(2033,'ThousandNeedlesW14',1,400,400,23,35,3000,7000,0,0,-4768.1,-1216.56,-52.8083,3.08574,'2028:0 2029:0 2032:0 2036:0 '),\n+(2034,'ThousandNeedlesW15',1,400,400,23,35,3000,7000,0,0,-4942.46,-1263.31,-48.5414,1.36768,'2032:0 2035:0 50:0 '),\n+(2035,'ThousandNeedlesW16',1,400,400,23,35,3000,7000,0,0,-5066.47,-1194.08,-55.537,0.71973,'2031:0 2034:0 2039:0 '),\n+(2036,'ThousandNeedlesW17',1,400,400,23,35,3000,7000,0,0,-4769.77,-1352.68,-49.836,1.52869,'50:0 2033:0 2037:0 2040:0 '),\n+(2037,'ThousandNeedlesW18',1,400,400,23,35,3000,7000,0,0,-4652.8,-1464.98,-50.872,2.47901,'2028:0 2036:0 2041:0 2043:0 '),\n+(2038,'ThousandNeedlesW19',1,400,400,23,35,3000,7000,0,0,-5074.73,-1410.96,-52.2312,0.222955,'50:0 2039:0 2048:0 '),\n+(2039,'ThousandNeedlesW20',1,400,400,23,35,3000,7000,0,0,-5194.18,-1406.79,-50.3763,0.764877,'2035:0 2038:0 2050:0 '),\n+(2040,'ThousandNeedlesW21',1,400,400,23,35,3000,7000,0,0,-4891.87,-1456.05,-51.236,1.07118,'50:0 2036:0 2042:0 2048:0 '),\n+(2041,'ThousandNeedlesW22',1,400,400,23,35,3000,7000,0,0,-4757,-1501.21,-28.7948,0.370198,'2037:0 2042:0 '),\n+(2042,'ThousandNeedlesW23',1,400,400,23,35,3000,7000,0,0,-4811.64,-1556.31,-50.0359,0.963171,'2040:0 2041:0 2043:0 2046:0 '),\n+(2043,'ThousandNeedlesW24',1,400,400,23,35,3000,7000,0,0,-4661.22,-1624.56,-25.4573,1.73482,'2037:0 2042:0 2044:0 '),\n+(2044,'ThousandNeedlesW25',1,400,400,23,35,3000,7000,0,0,-4624.13,-1730.14,-31.5621,1.85852,'2043:0 2045:0 '),\n+(2045,'ThousandNeedlesW26',1,400,485,23,35,3000,7000,0,0,-4691.02,-1824.75,-56.5207,1.01619,'2044:0 2047:0 2081:0 '),\n+(2046,'ThousandNeedlesW27',1,400,400,23,35,3000,7000,0,0,-4811.86,-1670.4,-51.0873,1.72892,'2042:0 2047:0 2052:0 '),\n+(2047,'ThousandNeedlesW28',1,400,2097,23,35,3000,7000,0,0,-4783.23,-1788.72,-49.3172,1.42261,'2045:0 2046:0 2051:0 '),\n+(2048,'ThousandNeedlesW29',1,400,400,23,35,3000,7000,0,0,-4982.42,-1560.83,-47.125,1.17787,'2038:0 2040:0 2049:0 2052:0 '),\n+(2049,'ThousandNeedlesW30',1,400,400,23,35,3000,7000,0,0,-5165.39,-1577.56,-54.4116,0.343386,'2048:0 2050:0 2054:0 '),\n+(2050,'ThousandNeedlesW31',1,400,483,23,35,3000,7000,0,0,-5295.65,-1509.76,-56.4121,0.573119,'2039:0 2049:0 2055:0 '),\n+(2051,'ThousandNeedlesW32',1,400,2097,23,35,3000,7000,0,0,-4855.93,-1831.87,-51.9183,1.28194,'2047:0 2052:0 2079:0 2080:0 '),\n+(2052,'ThousandNeedlesW33',1,400,400,23,35,3000,7000,0,0,-4969.52,-1717.69,-61.5435,1.6491,'2046:0 2048:0 2051:0 2053:0 '),\n+(2053,'ThousandNeedlesW34',1,400,400,23,35,3000,7000,0,0,-5061.47,-1763.65,-66.1325,0.36653,'2052:0 2054:0 2068:0 '),\n+(2054,'ThousandNeedlesW35',1,400,400,23,35,3000,7000,0,0,-5173.45,-1717.17,-61.8311,6.25112,'2049:0 2053:0 2055:0 2086:0 2087:0 '),\n+(2055,'ThousandNeedlesW36',1,400,483,23,35,3000,7000,0,0,-5372.83,-1603.26,-55.6282,0.975215,'2050:0 2054:0 2056:0 2087:0 2088:0 '),\n+(2056,'ThousandNeedlesW37',1,400,483,23,35,3000,7000,0,0,-5472.25,-1702.35,2.75952,1.04984,'2055:0 116:0 '),\n+(2057,'ThousandNeedlesW38',1,400,487,23,35,3000,7000,0,0,-5593.3,-1588.57,6.36415,0.366532,'116:0 '),\n+(2058,'ThousandNeedlesW39',1,400,482,23,35,3000,7000,0,0,-4950.58,-1058.58,-14.0026,1.23243,'2030:0 2059:0 '),\n+(2059,'ThousandNeedlesW40',1,400,482,23,35,3000,7000,0,0,-4980.25,-980.015,-4.94507,5.09659,'2058:0 2060:0 2062:0 2061:0 '),\n+(2060,'ThousandNeedlesW41',1,400,482,23,35,3000,7000,0,0,-4876.43,-922.254,-5.58887,3.87725,'2059:0 2062:0 2061:0 '),\n+(2061,'ThousandNeedlesW42',1,400,482,23,35,3000,7000,0,0,-5005.39,-842.193,-5.46968,5.01411,'2059:0 2060:0 2062:0 '),\n+(2062,'ThousandNeedlesW43',1,400,482,23,35,3000,7000,0,0,-5051.17,-927.317,-5.60775,4.14232,'2059:0 2060:0 2061:0 2063:0 2064:0 '),\n+(2063,'ThousandNeedlesW44',1,400,482,23,35,3000,7000,0,0,-5166.88,-896.379,-5.07889,5.92361,'2062:0 '),\n+(2064,'ThousandNeedlesW45',1,400,482,23,35,3000,7000,0,0,-5091.13,-1008.99,-5.23615,3.78733,'2062:0 2065:0 '),\n+(2065,'ThousandNeedlesW46',1,400,482,23,35,3000,7000,0,0,-5126.17,-1095.6,50.5447,1.11501,'2064:0 2066:0 '),\n+(2066,'ThousandNeedlesW47',1,400,482,23,35,3000,7000,0,0,-5191.66,-1142.08,49.8328,4.3371,'2065:0 2067:0 '),\n+(2067,'ThousandNeedlesW48',1,400,482,23,35,3000,7000,0,0,-5186.85,-1242.42,53.7882,2.36968,'2066:0 '),\n+(2068,'DarkcloudPinnacle1',1,400,2097,23,35,3000,7000,0,0,-5005.12,-1890.45,3.66479,1.83561,'2053:0 2069:0 '),\n+(2069,'DarkcloudPinnacle2',1,400,2097,23,35,3000,7000,0,0,-4901.08,-1867.77,34.9781,3.58507,'2068:0 2070:0 '),\n+(2070,'DarkcloudPinnacle3',1,400,2097,23,35,3000,7000,0,0,-4776.06,-1872.74,90.3879,3.04316,'2069:0 2071:0 '),\n+(2071,'DarkcloudPinnacle4',1,400,2097,23,35,3000,7000,0,0,-4876.74,-1978.26,91.8746,0.720343,'2070:0 2072:0 115:0 '),\n+(2072,'DarkcloudPinnacle5',1,400,2097,23,35,3000,7000,0,0,-4915.54,-2071.05,84.7897,4.93989,'2071:0 2073:0 2076:0 '),\n+(2073,'DarkcloudPinnacle6',1,400,2097,23,35,3000,7000,0,0,-4831.42,-2151.41,81.6488,1.60588,'2072:0 2074:0 2075:0 '),\n+(2074,'DarkcloudPinnacle7',1,400,2097,23,35,3000,7000,0,0,-4748.26,-2111.8,83.523,4.04415,'2073:0 '),\n+(2075,'DarkcloudPinnacle8',1,400,400,23,35,3000,7000,0,0,-4842.57,-2213.19,85.1857,5.94087,'2073:0 '),\n+(2076,'DarkcloudPinnacle9',1,400,2097,23,35,3000,7000,0,0,-5016.1,-2107.74,83.8605,6.28252,'2072:0 '),\n+(2077,'DarkcloudPinnacle10',1,400,2097,23,35,3000,7000,0,0,-5170.08,-2145.09,93.7072,3.77318,'115:0 '),\n+(2078,'DarkcloudPinnacle11',1,400,2097,23,35,3000,7000,0,0,-4921.47,-1843.98,80.8273,3.6318,'115:0 '),\n+(2079,'ThousandNeedlesC1',1,400,2097,23,35,3000,7000,0,0,-4970.93,-1895.26,-42.399,2.08851,'2051:0 2080:0 '),\n+(2080,'ThousandNeedlesC2',1,400,2097,23,35,3000,7000,0,0,-4870.6,-1904.88,-51.5857,2.74235,'2051:0 2079:0 2082:0 '),\n+(2081,'ThousandNeedlesC3',1,400,2097,23,35,3000,7000,0,0,-4709.18,-1916.95,-45.1441,1.27365,'2045:0 2082:0 '),\n+(2082,'ThousandNeedlesC4',1,400,2097,23,35,3000,7000,0,0,-4776.72,-1989.22,-60.8744,1.12639,'2080:0 2081:0 2083:0 '),\n+(2083,'ThousandNeedlesC5',1,400,2097,23,35,3000,7000,0,0,-4881.01,-2128.55,-44.1711,3.78849,'2082:0 2084:0 '),\n+(2084,'ThousandNeedlesC6',1,400,481,23,35,3000,7000,0,0,-5057.5,-2264.52,-53.5104,0.73918,'2083:0 2085:0 2094:0 119:0 '),\n+(2085,'ThousandNeedlesC7',1,400,2097,23,35,3000,7000,0,0,-5086.72,-2103.07,-39.7408,4.73175,'2084:0 2086:0 '),\n+(2086,'ThousandNeedlesC8',1,400,400,23,35,3000,7000,0,0,-5241.22,-1991.69,-60.4397,4.88884,'2054:0 2085:0 2090:0 2094:0 '),\n+(2087,'ThousandNeedlesC9',1,400,483,23,35,3000,7000,0,0,-5343.03,-1806.64,-52.2102,0.525945,'2054:0 2055:0 2089:0 '),\n+(2088,'ThousandNeedlesC10',1,400,483,23,35,3000,7000,0,0,-5473.39,-1743.1,-18.0835,0.979516,'2055:0 2089:0 '),\n+(2089,'ThousandNeedlesC11',1,400,483,23,35,3000,7000,0,0,-5533.01,-1878.93,-58.2063,1.19746,'2087:0 2088:0 2090:0 2092:0 '),\n+(2090,'ThousandNeedlesC12',1,400,400,23,35,3000,7000,0,0,-5432.97,-2043.66,-64.7738,6.26721,'2086:0 2089:0 2091:0 '),\n+(2091,'ThousandNeedlesC13',1,400,400,23,35,3000,7000,0,0,-5465.16,-2122.43,-60.3274,1.03645,'2090:0 2092:0 2095:0 '),\n+(2092,'ThousandNeedlesC14',1,400,400,23,35,3000,7000,0,0,-5599.58,-2073.33,-64.8276,0.983438,'2089:0 2091:0 2093:0 '),\n+(2093,'ThousandNeedlesC15',1,400,400,23,35,3000,7000,0,0,-5667.81,-2212.47,-58.1306,1.11303,'2092:0 2096:0 2106:0 '),\n+(2094,'ThousandNeedlesC16',1,400,400,23,35,3000,7000,0,0,-5287.5,-2195.62,-54.0753,0.741926,'2084:0 2086:0 2095:0 2097:0 119:0 '),\n+(2095,'ThousandNeedlesC17',1,400,400,23,35,3000,7000,0,0,-5426.32,-2213.81,-58.3051,6.2613,'2091:0 2094:0 2096:0 2097:0 '),\n+(2096,'ThousandNeedlesC18',1,400,400,23,35,3000,7000,0,0,-5522.8,-2260.72,-59.6581,0.457222,'2093:0 2095:0 2098:0 '),\n+(2097,'ThousandNeedlesC19',1,400,400,23,35,3000,7000,0,0,-5326.39,-2315.08,-42.353,1.99266,'2094:0 2095:0 2098:0 2110:0 '),\n+(2098,'ThousandNeedlesC20',1,400,484,23,35,3000,7000,0,4,-5535.61,-2362.59,-50.5979,1.14639,'2096:0 2097:0 2099:0 2107:0 '),\n+(2099,'ThousandNeedlesC21',1,400,484,23,35,3000,7000,0,4,-5649.75,-2375.72,2.56609,6.22399,'2098:0 2100:0 '),\n+(2100,'ThousandNeedlesC22',1,400,484,23,35,3000,7000,0,4,-5656.57,-2454.18,0.642997,4.88096,'2099:0 2101:0 '),\n+(2101,'ThousandNeedlesC23',1,400,484,23,35,3000,7000,0,4,-5604.75,-2490.4,30.4679,0.258887,'2100:0 2102:0 '),\n+(2102,'ThousandNeedlesC24',1,400,484,23,35,3000,7000,0,4,-5527.14,-2463.43,30.6774,2.88172,'2101:0 2103:0 '),\n+(2103,'ThousandNeedlesC25',1,400,484,23,35,3000,7000,0,4,-5474.04,-2382.59,57.2742,4.1305,'2102:0 2104:0 '),\n+(2104,'ThousandNeedlesC26',1,400,484,23,35,3000,7000,0,4,-5424.92,-2272.98,82.5255,4.55855,'2103:0 41:0 '),\n+(2105,'ThousandNeedlesC27',1,400,484,23,35,3000,7000,0,5,-5477.21,-2454.4,89.2838,1.45228,'41:0 '),\n+(2106,'ThousandNeedlesC28',1,400,400,23,35,3000,7000,0,0,-5735.44,-2408.6,-53.3532,0.767009,'2093:0 2107:0 2108:0 '),\n+(2107,'ThousandNeedlesC29',1,400,484,23,35,3000,7000,0,0,-5587.73,-2442.35,-50.4618,1.40318,'2098:0 2106:0 2109:0 '),\n+(2108,'ThousandNeedlesC30',1,400,400,23,35,3000,7000,0,0,-5685.83,-2597.38,-56.0596,2.12378,'2106:0 2109:0 2119:0 '),\n+(2109,'ThousandNeedlesC31',1,400,484,23,35,3000,7000,0,0,-5520.25,-2555.03,-56.5953,1.46797,'2107:0 2108:0 2111:0 2118:0 '),\n+(2110,'ThousandNeedlesC32',1,400,484,23,35,3000,7000,0,0,-5309.22,-2432.88,-43.4182,2.04524,'2097:0 2111:0 2112:0 '),\n+(2111,'ThousandNeedlesC33',1,400,400,23,35,3000,7000,0,4,-5357.57,-2551.14,-55.4342,1.46403,'2109:0 2110:0 2113:0 2115:0 '),\n+(2112,'ThousandNeedlesC34',1,400,400,23,35,3000,7000,0,0,-5163.1,-2464.2,-52.5964,1.02224,'119:0 2110:0 2113:0 '),\n+(2113,'ThousandNeedlesC35',1,400,400,23,35,3000,7000,0,0,-5168.45,-2584.79,-50.393,1.73498,'2111:0 2112:0 2114:0 '),\n+(2114,'ThousandNeedlesC36',1,400,400,23,35,3000,7000,0,0,-5206.18,-2701.85,-49.9805,1.80567,'2113:0 2115:0 2116:0 '),\n+(2115,'ThousandNeedlesC37',1,400,400,23,35,3000,7000,0,0,-5338.74,-2645.97,-45.5587,1.67019,'2111:0 2114:0 2117:0 '),\n+(2116,'ThousandNeedlesC38',1,400,2303,23,35,3000,7000,0,0,-5338.36,-2841.96,-55.7141,1.17145,'2114:0 2117:0 2120:0 2123:0 '),\n+(2117,'ThousandNeedlesC39',1,400,400,23,35,3000,7000,0,0,-5400.44,-2696.1,-41.6368,5.12985,'2115:0 2116:0 2118:0 '),\n+(2118,'ThousandNeedlesC40',1,400,400,23,35,3000,7000,0,0,-5508.15,-2681.27,-49.789,6.27849,'2109:0 2117:0 2119:0 '),\n+(2119,'ThousandNeedlesC41',1,400,400,23,35,3000,7000,0,0,-5557.86,-2761.38,-53.7029,2.24548,'2108:0 2118:0 2121:0 '),\n+(2120,'ThousandNeedlesC42',1,400,2303,23,35,3000,7000,0,0,-5427.21,-2905.53,-56.1528,0.737522,'2116:0 2121:0 2122:0 '),\n+(2121,'ThousandNeedlesC43',1,400,400,23,35,3000,7000,0,0,-5557.61,-2850.74,-55.2145,1.22644,'2119:0 2120:0 2124:0 '),\n+(2122,'ThousandNeedlesC44',1,400,2303,23,35,3000,7000,0,0,-5449.75,-3008,-48.4049,1.26768,'2120:0 2123:0 2125:0 '),\n+(2123,'ThousandNeedlesC45',1,400,2303,23,35,3000,7000,0,0,-5324.57,-3065.64,-49.0275,2.62249,'2116:0 2122:0 2127:0 '),\n+(2124,'ThousandNeedlesC46',1,400,400,23,35,3000,7000,0,0,-5623.73,-2943.53,-50.4623,1.05563,'2121:0 2125:0 2126:0 '),\n+(2125,'ThousandNeedlesC47',1,400,400,23,35,3000,7000,0,0,-5602.92,-3056.82,-51.9701,1.71732,'2122:0 2124:0 2126:0 2130:0 '),\n+(2126,'ThousandNeedlesC48',1,400,400,23,35,3000,7000,0,0,-5718.6,-3126.82,-37.7719,1.04973,'2124:0 2125:0 2131:0 '),\n+(2127,'ThousandNeedlesC49',1,400,400,23,35,3000,7000,0,0,-5328.41,-3207.34,-47.4244,5.04348,'2123:0 2128:0 2129:0 '),\n+(2128,'ThousandNeedlesC50',1,400,400,23,35,3000,7000,0,0,-5464.87,-3276.04,-34.1317,0.525478,'2127:0 2129:0 2130:0 '),\n+(2129,'ThousandNeedlesC51',1,400,400,23,35,3000,7000,0,0,-5455.25,-3387.53,-41.6009,1.22056,'2127:0 2128:0 2132:0 '),\n+(2130,'ThousandNeedlesC52',1,400,400,23,35,3000,7000,0,0,-5569.49,-3268.7,-44.3082,1.72125,'2125:0 2128:0 2131:0 2133:0 '),\n+(2131,'ThousandNeedlesC53',1,400,400,23,35,3000,7000,0,0,-5740.95,-3216.87,-41.218,1.17932,'2126:0 2130:0 121:0 '),\n+(2132,'ThousandNeedlesC54',1,400,439,23,35,3000,7000,0,0,-5553.99,-3514.19,-56.2254,0.918174,'2129:0 2133:0 2134:0 '),\n+(2133,'ThousandNeedlesC55',1,400,439,23,35,3000,7000,0,0,-5650.38,-3490.29,-57.2333,1.16557,'121:0 2130:0 2132:0 122:0 2134:0 '),\n+(2134,'ThousandNeedlesE1',1,400,2240,23,35,3000,7000,0,0,-5619.93,-3820.34,-58.7494,1.7723,'121:0 122:0 2132:0 2133:0 2135:0 2136:0 '),\n+(2135,'ThousandNeedlesE2',1,400,439,23,35,3000,7000,0,0,-5645.47,-4214.99,-58.7498,1.71339,'2134:0 2136:0 '),\n+(2136,'ThousandNeedlesE3',1,400,2240,23,35,3000,7000,0,0,-5936.34,-4266.6,-58.7493,0.65899,'122:0 2134:0 2135:0 117:0 2137:0 '),\n+(2137,'ThousandNeedlesE4',1,400,2240,23,35,3000,7000,0,0,-6405.27,-4240.86,-58.749,0.861231,'117:0 123:0 2136:0 '),\n+(2138,'ThousandNeedlesE5',1,400,439,23,35,3000,7000,0,0,-6173.94,-3567.25,-58.7497,5.13183,'117:0 118:0 121:0 122:0 123:0 '),\n+(2139,'ThousandNeedlesE6',1,400,439,23,35,3000,7000,0,0,-6638.63,-3654.02,-58.7493,0.631484,'118:0 2141:0 '),\n+(2140,'ThousandNeedlesE7',1,400,439,23,35,3000,7000,0,0,-6660.6,-3797.14,-58.5293,2.97002,'123:0 2141:0 '),\n+(2141,'ThousandNeedlesE8',1,400,439,23,35,3000,7000,0,0,-6820.59,-3759.56,21.2097,1.72713,'2139:0 2140:0 2142:0 '),\n+(2142,'TanarisExitN1',1,440,440,38,50,3000,7000,0,0,-6890.93,-3772.75,52.9557,0.201496,'2141:0 2143:0 '),\n+(2143,'TanarisExitN2',1,440,440,38,50,3000,7000,0,0,-6952.74,-3716.92,43.1345,3.42359,'2142:0 2144:0 2145:0 '),\n+(2144,'GadgetzanH1',1,440,976,38,50,3000,7000,0,5,-7047.86,-3764.87,11.4018,3.75207,'2143:0 52:0 2147:0 2148:0 2149:0 2166:0 '),\n+(2145,'GadgetzanA1',1,440,976,38,50,3000,7000,0,2,-7182.58,-3638.57,11.2417,5.95314,'2143:0 2146:0 2165:0 2166:0 '),\n+(2146,'GadgetzanA2',1,440,976,38,50,3000,7000,0,3,-7232.4,-3740.53,8.47838,5.52708,'2145:0 52:0 2147:0 2148:0 2165:0 2166:0 '),\n+(2147,'GadgetzanS',1,440,976,38,50,3000,7000,0,1,-7160.74,-3844,8.72832,1.31539,'52:0 2144:0 2146:0 '),\n+(2148,'Tanaris1',1,440,440,38,50,3000,7000,0,0,-7236.3,-4040.94,11.0963,1.40179,'2144:0 2146:0 2149:0 2150:0 2158:0 2161:0 2165:0 '),\n+(2149,'Tanaris2',1,440,1937,38,50,3000,7000,0,0,-7012.17,-4180.07,10.8027,2.40318,'2144:0 2148:0 2150:0 2151:0 2152:0 '),\n+(2150,'Tanaris3',1,440,440,38,50,3000,7000,0,0,-7183.44,-4321.24,9.48149,1.28398,'2148:0 2149:0 2151:0 2152:0 2157:0 2158:0 '),\n+(2151,'Tanaris4',1,440,1937,38,50,3000,7000,0,0,-6915.38,-4366.17,11.3936,2.18522,'2149:0 2150:0 2152:0 '),\n+(2152,'Tanaris5',1,440,440,38,50,3000,7000,0,0,-7083.47,-4512.85,8.48356,1.53726,'2149:0 2150:0 2151:0 2153:0 2157:0 2158:0 '),\n+(2153,'Tanaris6',1,440,977,38,50,3000,7000,0,0,-6965.03,-4691.43,8.43736,2.08705,'2152:0 2154:0 2155:0 2156:0 2157:0 '),\n+(2154,'Tanaris7',1,440,977,38,50,3000,7000,0,0,-6745.21,-4852.73,0.167925,2.76838,'2153:0 2155:0 '),\n+(2155,'Tanaris8',1,440,977,38,50,3000,7000,0,0,-6936.98,-4872.05,0.71439,1.89659,'2153:0 2154:0 2156:0 '),\n+(2156,'Tanaris9',1,440,988,38,50,3000,7000,0,0,-7135.69,-4833.99,0.699453,1.36644,'2153:0 2155:0 2157:0 '),\n+(2157,'Tanaris10',1,440,985,38,50,3000,7000,0,0,-7326.32,-4666.64,8.78219,0.194235,'2150:0 2152:0 2153:0 2156:0 2158:0 113:0 '),\n+(2158,'Tanaris11',1,440,985,38,50,3000,7000,0,0,-7455.84,-4410.59,11.5646,0.58301,'2148:0 2150:0 2152:0 2157:0 113:0 2160:0 2161:0 '),\n+(2159,'Tanaris12',1,440,988,40,50,3000,7000,0,0,-7777.85,-4943.31,6.30343,4.78293,'113:0 2160:0 2210:0 '),\n+(2160,'Tanaris13',1,440,985,38,50,3000,7000,0,0,-7765.82,-4633.67,11.3435,5.2954,'113:0 2158:0 2159:0 2161:0 2162:0 '),\n+(2161,'Tanaris14',1,440,1938,38,50,3000,7000,0,0,-7816.44,-4067.72,9.39531,5.57225,'2148:0 2158:0 2160:0 2162:0 2163:0 2164:0 2165:0 '),\n+(2162,'Tanaris15',1,440,440,40,50,3000,7000,0,0,-8124.61,-4381.44,10.6814,6.10827,'2160:0 2161:0 2163:0 2206:0 '),\n+(2163,'Tanaris16',1,440,440,40,50,3000,7000,0,0,-8211.49,-4018.52,10.2243,5.89032,'2161:0 2162:0 2164:0 2205:0 2209:0 '),\n+(2164,'Tanaris17',1,440,1938,38,50,3000,7000,0,0,-7957.98,-3774.76,42.6206,4.73579,'2161:0 2163:0 2165:0 2173:0 '),\n+(2165,'Tanaris18',1,440,440,38,50,3000,7000,0,0,-7532.17,-3671.41,9.08631,5.75681,'2145:0 2146:0 2148:0 2161:0 2164:0 2166:0 2172:0 2173:0 '),\n+(2166,'Tanaris19',1,440,440,38,50,3000,7000,0,0,-7149.95,-3429.64,10.9479,4.73187,'2144:0 2145:0 2146:0 2165:0 2167:0 2170:0 2172:0 '),\n+(2167,'Tanaris20',1,440,979,38,50,3000,7000,0,0,-6944.47,-3147.06,30.6034,1.0405,'2166:0 2168:0 2169:0 2170:0 '),\n+(2168,'Tanaris21',1,440,978,38,50,3000,7000,0,0,-6847.43,-2908.93,8.88901,4.55712,'2167:0 2169:0 2170:0 '),\n+(2169,'Tanaris22',1,440,979,38,50,3000,7000,0,0,-6994.4,-2790.52,8.87793,5.49763,'2167:0 2168:0 2170:0 2171:0 '),\n+(2170,'Tanaris23',1,440,979,38,50,3000,7000,0,0,-7181.29,-3008.99,31.1598,2.12434,'2166:0 2167:0 2168:0 2169:0 2171:0 2172:0 '),\n+(2171,'Tanaris24',1,440,982,40,50,3000,7000,0,0,-7405.37,-2656.15,12.3269,5.64056,'2169:0 2170:0 2172:0 2174:0 2175:0 '),\n+(2172,'Tanaris25',1,440,979,38,50,3000,7000,0,0,-7432.96,-3165.88,11.6881,0.195781,'2165:0 2166:0 2170:0 2171:0 2173:0 2174:0 '),\n+(2173,'Tanaris26',1,440,1939,38,50,3000,7000,0,0,-7856.78,-3289.98,68.7512,5.401,'2164:0 2165:0 2172:0 2174:0 2184:0 2187:0 '),\n+(2174,'Tanaris27',1,440,982,40,50,3000,7000,0,0,-7689.14,-2835.54,14.0257,3.79487,'2171:0 2172:0 2173:0 2175:0 2179:0 2182:0 2184:0 '),\n+(2175,'Tanaris28',1,440,982,44,55,3000,7000,0,0,-7757.78,-2516.52,8.85209,5.79567,'2171:0 2174:0 2176:0 2177:0 2178:0 2179:0 2183:0 '),\n+(2176,'Tanaris29',1,440,982,38,50,3000,7000,0,0,-7885.89,-2645.63,-56.7571,1.76264,'2175:0 '),\n+(2177,'Tanaris30',1,440,982,38,50,3000,7000,0,0,-7691.97,-2600,-56.5855,2.87594,'2175:0 '),\n+(2178,'Tanaris31',1,440,982,38,50,3000,7000,0,0,-7867.56,-2503.34,-45.915,6.01951,'2175:0 '),\n+(2179,'Tanaris32',1,440,982,44,55,3000,7000,0,0,-8024.98,-2496.1,4.7767,5.76032,'2174:0 2175:0 2180:0 2181:0 2182:0 '),\n+(2180,'Tanaris33',1,440,982,38,50,3000,7000,0,0,-7961.12,-2608.77,-51.3402,2.94075,'2181:0 2179:0 '),\n+(2181,'Tanaris34',1,440,982,38,50,3000,7000,0,0,-7948.03,-2388.48,-27.27,2.48522,'2180:0 2179:0 '),\n+(2182,'Tanaris35',1,440,982,44,55,3000,7000,0,0,-8192.63,-2678.87,9.10516,6.208,'2174:0 2179:0 2183:0 2185:0 '),\n+(2183,'Tanaris36',1,440,982,40,50,3000,7000,0,0,-8237.94,-2283.21,9.47101,5.21841,'2175:0 2182:0 2188:0 2189:0 2190:0 '),\n+(2184,'Tanaris37',1,440,1939,40,50,3000,7000,0,0,-8080.23,-2940.32,41.1249,5.97434,'2173:0 2174:0 2185:0 2186:0 2187:0 '),\n+(2185,'Tanaris38',1,440,983,40,50,3000,7000,0,0,-8463.57,-2772.2,16.342,6.04503,'2182:0 2184:0 2186:0 2187:0 2190:0 '),\n+(2186,'Tanaris39',1,440,983,40,50,3000,7000,0,0,-8572.13,-2989.04,10.5515,0.775002,'2184:0 2185:0 2187:0 2190:0 2194:0 2196:0 '),\n+(2187,'Tanaris40',1,440,983,40,50,3000,7000,0,0,-8349.72,-3161.78,10.5974,1.38762,'2173:0 2184:0 2185:0 2186:0 '),\n+(2188,'Tanaris41',1,440,440,44,55,3000,7000,0,0,-8568.73,-2090.66,8.81721,5.96256,'2183:0 2189:0 2220:0 '),\n+(2189,'Tanaris42',1,440,980,44,55,3000,7000,0,0,-8728.04,-2264.78,8.87691,0.109387,'2183:0 2188:0 2190:0 2191:0 2192:0 '),\n+(2190,'Tanaris43',1,440,440,40,50,3000,7000,0,0,-8780.75,-2536.53,12.5632,1.2757,'2183:0 2185:0 2186:0 2189:0 2192:0 2194:0 '),\n+(2191,'Tanaris44',1,440,980,44,55,3000,7000,0,0,-9113.86,-2138.28,14.5526,5.80156,'2189:0 2192:0 '),\n+(2192,'Tanaris45',1,440,440,44,55,3000,7000,0,0,-9078.5,-2368.44,15.1243,6.03129,'2189:0 2190:0 2191:0 2193:0 2194:0 '),\n+(2193,'Tanaris46',1,440,440,40,50,3000,7000,0,0,-9394.76,-2441.52,12.341,0.162396,'2192:0 114:0 2194:0 '),\n+(2194,'Tanaris47',1,440,992,40,50,3000,7000,0,0,-9166,-2942.59,27.3153,4.4055,'114:0 2186:0 2190:0 2192:0 2193:0 2195:0 2196:0 '),\n+(2195,'Tanaris48',1,440,992,40,50,3000,7000,0,0,-9259.98,-3213.55,17.6595,1.63894,'114:0 2194:0 2196:0 2197:0 2198:0 '),\n+(2196,'Tanaris49',1,440,984,40,50,3000,7000,0,0,-8891.65,-3316.57,17.9459,2.09054,'2186:0 2194:0 2195:0 2197:0 2198:0 '),\n+(2197,'Tanaris50',1,440,981,44,55,3000,7000,0,0,-8891.37,-3634.86,9.8928,2.97216,'2195:0 2196:0 2198:0 2199:0 2204:0 2205:0 '),\n+(2198,'Tanaris51',1,440,440,40,50,3000,7000,0,0,-9376.51,-3525.65,10.4557,1.04009,'2195:0 2196:0 2197:0 2199:0 '),\n+(2199,'Tanaris52',1,440,981,44,55,3000,7000,0,0,-9238.88,-3842.23,16.1398,6.21782,'2197:0 2198:0 2200:0 2201:0 2204:0 '),\n+(2200,'Tanaris53',1,440,981,44,55,3000,7000,0,0,-9122.46,-4119.91,14.5657,1.92562,'2199:0 2202:0 2203:0 2204:0 '),\n+(2201,'Tanaris54',1,440,981,38,50,3000,7000,0,0,-9448.09,-4056.48,-45.7265,1.70179,'2199:0 '),\n+(2202,'Tanaris55',1,440,981,38,50,3000,7000,0,0,-9058.94,-4138.03,-30.5429,1.76658,'2200:0 '),\n+(2203,'Tanaris56',1,440,981,38,50,3000,7000,0,0,-9239.16,-3990.68,-38.2526,5.54632,'2200:0 '),\n+(2204,'Tanaris57',1,440,981,44,55,3000,7000,0,0,-8846.97,-4120.67,11.0961,2.09647,'2197:0 2199:0 2200:0 2205:0 2209:0 '),\n+(2205,'Tanaris58',1,440,440,40,50,3000,7000,0,0,-8582.56,-3848.15,27.4666,3.85733,'2163:0 2197:0 2204:0 2209:0 '),\n+(2206,'Tanaris59',1,440,440,40,50,3000,7000,0,0,-8436.38,-4485.59,9.98615,0.059917,'2162:0 2207:0 2209:0 '),\n+(2207,'Tanaris60',1,440,1940,44,50,3000,7000,0,0,-8543.26,-4792.62,0.74885,2.08624,'2206:0 2208:0 2371:0 '),\n+(2208,'Tanaris61',1,440,1940,44,50,3000,7000,0,0,-8731.47,-4651.05,6.22094,6.04857,'2207:0 2209:0 '),\n+(2209,'Tanaris62',1,440,981,40,50,3000,7000,0,0,-8636.73,-4274.81,14.2733,1.53645,'2163:0 2204:0 2205:0 2206:0 2208:0 '),\n+(2210,'Tanaris63',1,440,1336,40,50,3000,7000,0,0,-7834.45,-5044.24,4.58704,0.700017,'2159:0 2211:0 '),\n+(2211,'Tanaris64',1,440,1336,40,50,3000,7000,0,0,-7869.58,-5185.77,0.738081,3.22506,'2210:0 2212:0 2213:0 2215:0 '),\n+(2212,'Tanaris65',1,440,1336,40,50,3000,7000,0,0,-8043.72,-5139.25,11.1577,5.95236,'2211:0 '),\n+(2213,'Tanaris66',1,440,1336,40,50,3000,7000,0,0,-7985.53,-5405.09,1.12058,1.11823,'2211:0 2214:0 2215:0 2216:0 '),\n+(2214,'Tanaris67',1,440,1336,40,50,3000,7000,0,0,-7957.94,-5481.79,0.207866,2.5025,'2213:0 '),\n+(2215,'Tanaris68',1,440,1336,40,50,3000,7000,0,0,-7979.86,-5272.84,0.574685,0.762833,'2211:0 2213:0 2216:0 2217:0 2218:0 2219:0 '),\n+(2216,'Tanaris69',1,440,1336,40,50,3000,7000,0,0,-8057.83,-5349.53,19.8843,5.57338,'2213:0 2215:0 '),\n+(2217,'Tanaris70',1,440,1336,40,50,3000,7000,0,0,-8101.51,-5296.31,2.11654,0.146278,'2215:0 '),\n+(2218,'Tanaris71',1,440,1336,40,50,3000,7000,0,0,-8088.86,-5238.43,1.94444,6.18206,'2215:0 '),\n+(2219,'Tanaris72',1,440,1336,40,50,3000,7000,0,0,-8005.83,-5204.31,4.73672,1.59535,'2215:0 '),\n+(2220,'TanarisExitSW',1,440,440,44,55,3000,7000,0,0,-8243.03,-2079.74,-95.586,0.052021,'2188:0 2221:0 '),\n+(2221,'Ungoro1',1,490,490,44,56,3000,7000,0,0,-8066.01,-2098.76,-168.295,6.18792,'2220:0 2222:0 '),\n+(2222,'Ungoro2',1,490,490,44,56,3000,7000,0,0,-7916.41,-2142.07,-238.077,0.49967,'2221:0 2223:0 '),\n+(2223,'Ungoro3',1,490,490,44,56,3000,7000,0,0,-7864.72,-2099.17,-266.094,3.40762,'2222:0 2224:0 2260:0 '),\n+(2224,'Ungoro4',1,490,1942,44,56,3000,7000,0,0,-7934.33,-2040.71,-267.978,5.68527,'2223:0 2225:0 '),\n+(2225,'Ungoro5',1,490,1942,44,56,3000,7000,0,0,-7884.5,-1843.96,-274.777,4.70158,'2224:0 2226:0 2260:0 2261:0 '),\n+(2226,'Ungoro6',1,490,540,46,56,3000,7000,0,0,-8088.18,-1491.28,-269.655,5.9268,'2225:0 2227:0 2228:0 2261:0 '),\n+(2227,'Ungoro7',1,490,490,46,56,3000,7000,0,0,-8249.65,-1584.9,-198.819,0.538974,'2226:0 2229:0 '),\n+(2228,'Ungoro8',1,490,540,46,56,3000,7000,0,0,-8064.8,-1172.37,-270.687,4.96077,'2226:0 2229:0 2232:0 '),\n+(2229,'Ungoro9',1,490,540,46,56,3000,7000,0,0,-7866.69,-1345.21,-274.102,2.63992,'2227:0 2228:0 2230:0 2231:0 2232:0 2261:0 2262:0 2265:0 '),\n+(2230,'Ungoro10',1,490,490,46,56,3000,7000,0,0,-7978.25,-1085.08,-328.506,4.68783,'2229:0 '),\n+(2231,'Ungoro11',1,490,540,46,56,3000,7000,0,0,-8110.2,-1212.13,-336.702,6.17813,'2229:0 '),\n+(2232,'Ungoro12',1,490,539,48,56,3000,7000,0,0,-7862.94,-1011.26,-266.988,4.49344,'2228:0 2229:0 2233:0 2234:0 2262:0 '),\n+(2233,'Ungoro13',1,490,539,48,56,3000,7000,0,0,-7893.05,-604.125,-260.044,4.74085,'2232:0 2234:0 2235:0 '),\n+(2234,'Ungoro14',1,490,539,48,56,3000,7000,0,0,-7779.84,-752.864,-268.32,4.3658,'2232:0 2233:0 2235:0 2262:0 2263:0 '),\n+(2235,'Ungoro15',1,490,543,48,56,3000,7000,0,0,-7516.02,-568.085,-272.224,3.45867,'2233:0 2234:0 2236:0 2240:0 2263:0 '),\n+(2236,'Ungoro16',1,490,543,48,56,3000,7000,0,0,-7357.96,-423.47,-270.864,3.80227,'2235:0 2237:0 2238:0 '),\n+(2237,'Ungoro17',1,490,543,48,56,3000,7000,0,0,-7453.5,-224.428,-202.131,5.11585,'2236:0 '),\n+(2238,'Ungoro18',1,490,543,48,56,3000,7000,0,0,-7065.02,-412.024,-271.337,3.13271,'2236:0 2239:0 2240:0 '),\n+(2239,'Ungoro19',1,490,490,48,56,3000,7000,0,0,-6942.78,-227.898,-200.477,4.11643,'2238:0 '),\n+(2240,'Ungoro20',1,490,543,48,56,3000,7000,0,0,-7057.61,-568.049,-272.117,3.13074,'2235:0 2238:0 2241:0 2273:0 2275:0 '),\n+(2241,'Ungoro21',1,490,490,46,56,3000,7000,0,0,-6819.88,-500.077,-273.734,4.04377,'2240:0 2242:0 2273:0 '),\n+(2242,'Ungoro22',1,490,490,46,56,3000,7000,0,0,-6621.16,-628.631,-271.06,2.65557,'2241:0 2243:0 2273:0 2289:0 '),\n+(2243,'Ungoro23',1,490,490,46,56,3000,7000,0,0,-6516.77,-714.125,-272.04,4.8802,'2242:0 2244:0 2271:0 '),\n+(2244,'Ungoro24',1,490,538,46,56,3000,7000,0,0,-6357.05,-1044.55,-271.024,2.01939,'2243:0 2245:0 2247:0 '),\n+(2245,'Ungoro25',1,490,541,46,56,3000,7000,0,0,-6247.33,-1096.9,-216.374,2.3198,'111:0 2244:0 2246:0 '),\n+(2246,'Ungoro26',1,490,541,46,56,3000,7000,0,0,-6263.44,-1146.22,-245.676,0.70581,'111:0 2245:0 2247:0 '),\n+(2247,'Ungoro27',1,490,538,46,56,3000,7000,0,0,-6307.92,-1177.22,-269.521,1.78377,'2244:0 2246:0 2248:0 '),\n+(2248,'Ungoro28',1,490,538,46,56,3000,7000,0,0,-6416.8,-1325.76,-272.118,0.908046,'2247:0 2249:0 2270:0 2271:0 '),\n+(2249,'Ungoro29',1,490,538,46,56,3000,7000,0,0,-6394.87,-1511.09,-269.907,1.76217,'2248:0 112:0 2251:0 2269:0 2270:0 2271:0 '),\n+(2250,'Ungoro30',1,490,542,46,56,3000,7000,0,0,-6359.08,-1992.29,-276.383,1.21435,'112:0 '),\n+(2251,'Ungoro31',1,490,538,46,56,3000,7000,0,0,-6575.48,-1808.43,-271.11,0.413242,'112:0 2249:0 2252:0 2253:0 2269:0 2270:0 '),\n+(2252,'Ungoro32',1,490,490,46,56,3000,7000,0,0,-6527.29,-2027.48,-271.963,1.5501,'2251:0 2253:0 '),\n+(2253,'Ungoro33',1,490,490,46,56,3000,7000,0,0,-6834.73,-2083.14,-267.953,0.248293,'2251:0 2252:0 2254:0 2267:0 2269:0 '),\n+(2254,'Ungoro34',1,490,1942,46,56,3000,7000,0,0,-7068.84,-2256.36,-271.191,0.560497,'2253:0 2255:0 2256:0 2267:0 '),\n+(2255,'Ungoro35',1,490,1943,46,56,3000,7000,0,0,-6944.44,-2436.79,-201.566,2.1097,'2254:0 '),\n+(2256,'Ungoro36',1,490,1942,46,56,3000,7000,0,0,-7266.48,-2293,-268.44,0.00677204,'2254:0 2257:0 '),\n+(2257,'Ungoro37',1,490,1942,44,56,3000,7000,0,0,-7476.48,-2263.22,-266.534,5.76177,'2256:0 2258:0 2259:0 '),\n+(2258,'Ungoro38',1,490,1942,46,56,3000,7000,0,0,-7419.79,-2422.73,-214.477,1.54419,'2257:0 '),\n+(2259,'Ungoro39',1,490,1942,44,56,3000,7000,0,0,-7613.45,-2129.98,-272.086,5.58506,'2257:0 2260:0 2266:0 '),\n+(2260,'Ungoro40',1,490,1942,44,56,3000,7000,0,0,-7787.58,-1962.82,-272.166,5.62628,'2223:0 2225:0 2259:0 2261:0 2266:0 '),\n+(2261,'Ungoro41',1,490,1942,46,56,3000,7000,0,0,-7685.24,-1654.69,-272.216,4.29698,'2225:0 2226:0 2229:0 2260:0 2265:0 2266:0 '),\n+(2262,'Ungoro42',1,490,490,48,56,3000,7000,0,0,-7724.44,-1062.81,-269.408,1.8701,'2229:0 2232:0 2234:0 2263:0 2264:0 '),\n+(2263,'Ungoro43',1,490,539,48,56,3000,7000,0,0,-7524.61,-811.974,-269.097,2.63781,'2234:0 2235:0 2262:0 2264:0 2276:0 '),\n+(2264,'Ungoro44',1,490,490,46,56,3000,7000,0,0,-7536.49,-1136.09,-271.668,2.21958,'2262:0 2263:0 2265:0 2276:0 '),\n+(2265,'Ungoro45',1,490,490,46,56,3000,7000,0,0,-7540.94,-1440.28,-272.37,1.75227,'2229:0 2261:0 2264:0 2268:0 '),\n+(2266,'Ungoro46',1,490,1942,44,56,3000,7000,0,0,-7481.25,-1864.35,-272.185,3.61563,'2259:0 2260:0 2261:0 2267:0 '),\n+(2267,'Ungoro47',1,490,1942,46,56,3000,7000,0,0,-7196.2,-1804.18,-272.191,4.61501,'2253:0 2254:0 2266:0 2268:0 '),\n+(2268,'Ungoro48',1,490,537,46,56,3000,7000,0,0,-7052.38,-1597.57,-270.962,3.20599,'2265:0 2267:0 2269:0 2270:0 2272:0 2279:0 2280:0 '),\n+(2269,'Ungoro49',1,490,538,46,56,3000,7000,0,0,-6864.28,-1691.91,-271.236,0.290198,'2249:0 2251:0 2253:0 2268:0 2270:0 '),\n+(2270,'Ungoro50',1,490,538,46,56,3000,7000,0,0,-6742.71,-1481.45,-270.728,0.152749,'2248:0 2249:0 2251:0 2268:0 2269:0 2271:0 2272:0 '),\n+(2271,'Ungoro51',1,490,538,46,56,3000,7000,0,0,-6687.22,-1202.84,-270.132,5.43062,'2243:0 2248:0 2249:0 2270:0 2272:0 2274:0 2275:0 '),\n+(2272,'Ungoro52',1,490,537,48,56,3000,7000,0,0,-6971.9,-1359.19,-272.023,5.74869,'2268:0 2270:0 2271:0 2280:0 '),\n+(2273,'Ungoro53',1,490,490,46,56,3000,7000,0,0,-6905.86,-744.591,-271.912,1.82168,'2240:0 2241:0 2242:0 2274:0 2275:0 '),\n+(2274,'Ungoro54',1,490,490,46,56,3000,7000,0,0,-6713.26,-889.582,-269.981,2.47553,'2271:0 2273:0 2275:0 '),\n+(2275,'Ungoro55',1,490,490,46,56,3000,7000,0,0,-7071.75,-971.188,-268.921,1.5625,'2240:0 2271:0 2273:0 2274:0 2276:0 '),\n+(2276,'Ungoro56',1,490,537,48,56,3000,7000,0,0,-7262.04,-1142.55,-256.214,3.05082,'2263:0 2264:0 2275:0 2277:0 '),\n+(2277,'Ungoro57',1,490,537,48,56,3000,7000,0,0,-7276.34,-1237.12,-242.301,0.11537,'2276:0 2278:0 2286:0 '),\n+(2278,'Ungoro58',1,490,537,48,56,3000,7000,0,0,-7196.58,-1221.48,-206.377,2.70522,'2277:0 '),\n+(2279,'Ungoro59',1,490,537,48,56,3000,7000,0,0,-7139.11,-1460.35,-240.441,5.44625,'2268:0 '),\n+(2280,'Ungoro60',1,490,537,48,56,3000,7000,0,0,-6995.92,-1426.86,-263.362,1.61744,'2268:0 2272:0 2281:0 '),\n+(2281,'Ungoro61',1,490,537,48,56,3000,7000,0,0,-7087.82,-1424.62,-235.604,0.254778,'2280:0 2282:0 '),\n+(2282,'Ungoro62',1,490,537,48,56,3000,7000,0,0,-7094.67,-1371.27,-215.077,4.51555,'2281:0 2283:0 '),\n+(2283,'Ungoro63',1,490,537,48,56,3000,7000,0,0,-7151.31,-1318.52,-184.389,0.761355,'2282:0 2284:0 2285:0 '),\n+(2284,'Ungoro64',1,490,537,48,56,3000,7000,0,0,-7093.52,-1298.11,-185.557,3.52203,'2283:0 '),\n+(2285,'Ungoro65',1,490,537,48,56,3000,7000,0,0,-7193.59,-1360.95,-184.286,6.25914,'2283:0 '),\n+(2286,'Ungoro66',1,490,537,48,56,3000,7000,0,0,-7288.45,-1306.18,-240.621,1.48982,'2277:0 2287:0 '),\n+(2287,'Ungoro67',1,490,537,48,56,3000,7000,0,0,-7220.03,-1431,-231.915,2.60313,'2286:0 2288:0 '),\n+(2288,'Ungoro68',1,490,537,48,56,3000,7000,0,0,-7328.61,-1466.63,-241.155,0.211588,'2287:0 '),\n+(2289,'Ungoro69',1,490,490,50,56,3000,7000,0,0,-6487.3,-527.418,-240.618,3.68697,'2242:0 2290:0 '),\n+(2290,'Ungoro70',1,490,490,50,56,3000,7000,0,0,-6221.83,-588.48,-118.307,2.76414,'2289:0 2291:0 '),\n+(2291,'Ungoro71',1,490,490,50,56,3000,7000,0,0,-6222.04,-471.141,-64.8223,4.41936,'2290:0 2292:0 '),\n+(2292,'Silithus1',1,1377,1377,50,60,3000,7000,0,0,-6290.28,-372.309,-0.180207,5.29035,'2291:0 184:0 '),\n+(2293,'Silithus2',1,1377,1377,50,60,3000,7000,0,0,-6723.42,16.99,1.33043,2.60703,'184:0 2294:0 2295:0 2296:0 '),\n+(2294,'Silithus3',1,1377,2738,50,60,3000,7000,0,0,-7058.45,311.497,7.73577,5.31076,'2293:0 2295:0 2304:0 2350:0 2351:0 2352:0 2353:0 '),\n+(2295,'Silithus4',1,1377,1377,50,60,3000,7000,0,0,-6775.62,325.939,7.96733,4.88272,'191:0 2293:0 2294:0 2296:0 2304:0 2350:0 '),\n+(2296,'Silithus5',1,1377,1377,53,60,3000,7000,0,0,-6480.77,427.825,2.85797,3.86957,'191:0 2293:0 2295:0 2299:0 2304:0 2311:0 '),\n+(2297,'Silithus6',1,1377,3446,53,60,3000,7000,0,0,-6249.14,4.14336,6.27956,4.62356,'191:0 2298:0 '),\n+(2298,'Silithus7',1,1377,3446,53,60,3000,7000,0,0,-6303.03,23.7784,-8.51367,4.98288,'2297:0 '),\n+(2299,'Silithus8',1,1377,1377,53,60,3000,7000,0,0,-6325.77,679.48,7.83164,4.56898,'191:0 2296:0 2300:0 2304:0 2311:0 '),\n+(2300,'Silithus9',1,1377,2742,53,60,3000,7000,0,0,-6512.68,1140.49,5.52295,5.13838,'2299:0 2301:0 2311:0 2317:0 2322:0 2323:0 '),\n+(2301,'Silithus10',1,1377,2742,53,60,3000,7000,0,0,-6376.67,1003.32,-29.6361,5.81971,'2300:0 2302:0 2303:0 '),\n+(2302,'Silithus11',1,1377,2742,53,60,3000,7000,0,0,-6233.34,982.199,-44.8168,2.95104,'2301:0 2303:0 '),\n+(2303,'Silithus12',1,1377,2742,53,60,3000,7000,0,0,-6264.39,1180.37,-17.4845,2.70757,'2301:0 2302:0 '),\n+(2304,'Silithus13',1,1377,3425,50,60,3000,7000,0,0,-6806.63,645.151,14.4502,4.36084,'2294:0 2295:0 2296:0 2299:0 2305:0 2350:0 2351:0 '),\n+(2305,'Silithus14',1,1377,3425,53,60,3000,7000,0,0,-6809.1,722.467,39.8123,2.17349,'2304:0 2306:0 188:0 '),\n+(2306,'Silithus15',1,1377,3425,53,60,3000,7000,0,0,-6835.28,767.676,43.3803,5.14818,'2305:0 188:0 2307:0 2308:0 2309:0 2310:0 '),\n+(2307,'Silithus16',1,1377,3425,53,60,3000,7000,0,5,-6754.01,823.51,57.2677,3.58719,'2306:0 '),\n+(2308,'Silithus17',1,1377,3425,53,60,3000,7000,0,1,-6739.83,766.866,128.438,3.03271,'2306:0 '),\n+(2309,'Silithus18',1,1377,3425,53,60,3000,7000,0,0,-6767.97,869.849,23.6798,5.43995,'2306:0 2310:0 2311:0 '),\n+(2310,'Silithus19',1,1377,3425,53,60,3000,7000,0,0,-6882.21,862.037,35.6652,6.05845,'2306:0 2309:0 2323:0 '),\n+(2311,'Silithus20',1,1377,2742,53,60,3000,7000,0,0,-6689.89,843.881,1.63418,4.68008,'2296:0 2299:0 2300:0 2309:0 2312:0 2313:0 '),\n+(2312,'Silithus21',1,1377,2742,53,60,3000,7000,0,0,-6610.39,1133.65,-47.8484,4.53085,'2311:0 '),\n+(2313,'Silithus22',1,1377,2742,53,60,3000,7000,0,0,-6560.42,848.396,-19.7968,5.5872,'2311:0 2314:0 2315:0 2316:0 '),\n+(2314,'Silithus23',1,1377,2742,53,60,3000,7000,0,0,-6485.94,926.037,-42.1164,4.07923,'2313:0 '),\n+(2315,'Silithus24',1,1377,2742,53,60,3000,7000,0,0,-6592.71,755.859,-52.6973,0.303426,'2313:0 '),\n+(2316,'Silithus25',1,1377,2742,53,60,3000,7000,0,0,-6626.24,951.29,-53.3026,5.44387,'2313:0 '),\n+(2317,'Silithus26',1,1377,2742,53,60,3000,7000,0,0,-6416.82,1332.7,1.61694,4.0223,'2300:0 2318:0 2322:0 '),\n+(2318,'Silithus27',1,1377,2740,53,60,3000,7000,0,0,-6260.69,1633.49,6.1983,4.14011,'2317:0 2319:0 133:0 '),\n+(2319,'Silithus28',1,1377,1377,53,60,3000,7000,0,0,-6412.61,1879.6,4.97151,5.48313,'2318:0 133:0 2320:0 134:0 '),\n+(2320,'Silithus29',1,1377,1377,53,60,3000,7000,0,0,-6709.78,1906.69,5.58306,6.01956,'2319:0 2321:0 134:0 '),\n+(2321,'Silithus30',1,1377,2743,53,60,3000,7000,0,0,-6952.45,1684.29,2.49135,0.649405,'2320:0 134:0 2322:0 2325:0 '),\n+(2322,'Silithus31',1,1377,1377,53,60,3000,7000,0,0,-6798.69,1359.48,2.84112,2.99187,'134:0 189:0 2300:0 2317:0 2321:0 2325:0 '),\n+(2323,'Silithus32',1,1377,1377,53,60,3000,7000,0,0,-6935.53,933.15,20.0826,5.50711,'177:0 189:0 2300:0 2310:0 2324:0 2351:0 '),\n+(2324,'Silithus33',1,1377,1377,53,60,3000,7000,0,0,-7170.32,969.526,1.6856,0.846154,'177:0 189:0 2323:0 2335:0 2343:0 '),\n+(2325,'Silithus34',1,1377,2743,55,60,3000,7000,0,0,-7102.06,1490.93,6.9342,0.374927,'189:0 2321:0 2322:0 2326:0 '),\n+(2326,'Silithus35',1,1377,2743,55,60,3000,7000,0,0,-7227.39,1476.62,-3.4765,1.83774,'2325:0 2327:0 2335:0 2336:0 '),\n+(2327,'Silithus36',1,1377,2743,55,60,3000,7000,0,0,-7304.89,1624.78,-30.4609,5.43684,'2326:0 2328:0 2329:0 2330:0 '),\n+(2328,'Silithus37',1,1377,2743,55,60,3000,7000,0,0,-7466.84,1605.7,-50.256,4.1959,'2327:0 2331:0 '),\n+(2329,'Silithus38',1,1377,2743,55,60,3000,7000,0,0,-7434.92,1813.75,-46.5685,5.83934,'2327:0 2332:0 '),\n+(2330,'Silithus39',1,1377,2743,55,60,3000,7000,0,0,-7246.4,1714.88,-63.0024,4.43346,'2327:0 2333:0 2334:0 '),\n+(2331,'Silithus40',1,1377,1377,53,60,3000,7000,0,0,-7396.76,1242.93,-84.3036,3.00401,'2328:0 '),\n+(2332,'Silithus41',1,1377,2743,53,60,3000,7000,0,0,-7611.96,1707.51,-36.9118,0.00770472,'2329:0 '),\n+(2333,'Silithus42',1,1377,2743,53,60,3000,7000,0,0,-7390.74,1717.46,-92.9352,5.54673,'2330:0 '),\n+(2334,'Silithus43',1,1377,2743,53,60,3000,7000,0,0,-7320.18,1835.39,-90.5829,0.977671,'2330:0 '),\n+(2335,'Silithus44',1,1377,1377,53,60,3000,7000,0,0,-7395.86,1200.83,3.1343,6.21237,'177:0 189:0 2324:0 2326:0 2336:0 2341:0 2342:0 2343:0 '),\n+(2336,'Silithus45',1,1377,2743,53,60,3000,7000,0,0,-7467.85,1375.97,4.32407,0.317961,'2326:0 2335:0 135:0 2337:0 2341:0 2342:0 '),\n+(2337,'Silithus46',1,1377,1377,53,60,3000,7000,0,0,-7741.83,1415.69,0.628408,1.87894,'135:0 2336:0 2338:0 2339:0 2340:0 '),\n+(2338,'Silithus47',1,1377,1377,53,60,3000,7000,0,0,-7929.26,1491.4,-6.62955,0.141247,'135:0 2337:0 2339:0 '),\n+(2339,'Silithus48',1,1377,1377,53,60,3000,7000,0,0,-7951.61,1381.21,2.92482,0.094128,'193:0 2337:0 2338:0 2340:0 '),\n+(2340,'Silithus49',1,1377,1377,53,60,3000,7000,0,0,-7884.95,1305.55,-9.32275,1.92018,'193:0 2337:0 2339:0 2341:0 '),\n+(2341,'Silithus50',1,1377,1377,53,60,3000,7000,0,0,-7724.06,1121.13,1.90701,2.14991,'193:0 2335:0 2336:0 2340:0 2342:0 2347:0 '),\n+(2342,'Silithus51',1,1377,1377,53,60,3000,7000,0,0,-7614.56,1040.35,4.34335,2.37375,'2335:0 2336:0 2341:0 2343:0 2347:0 2348:0 '),\n+(2343,'Silithus52',1,1377,1377,53,60,3000,7000,0,0,-7446.46,1011.04,1.56245,2.60898,'177:0 2324:0 2335:0 2342:0 2348:0 '),\n+(2344,'Silithus53',1,1377,3427,53,60,3000,7000,0,0,-8071.74,1080.25,7.69378,0.464863,'193:0 2345:0 '),\n+(2345,'Silithus54',1,1377,1377,55,60,3000,7000,0,0,-8049.18,988.938,42.0219,2.43622,'2344:0 '),\n+(2346,'Silithus55',1,1377,2744,55,60,3000,7000,0,0,-8023.11,662.371,-12.5444,1.51572,'193:0 2359:0 '),\n+(2347,'Silithus56',1,1377,2744,53,60,3000,7000,0,0,-7855.36,863.831,-4.99768,1.56248,'193:0 2341:0 2342:0 2348:0 '),\n+(2348,'Silithus57',1,1377,1377,53,60,3000,7000,0,0,-7512.58,878.283,-2.19269,1.08534,'177:0 2342:0 2343:0 2347:0 2349:0 2350:0 '),\n+(2349,'Silithus58',1,1377,1377,53,60,3000,7000,0,0,-7412.18,577.662,-7.35207,4.30862,'177:0 2348:0 2355:0 2357:0 192:0 2359:0 '),\n+(2350,'Silithus59',1,1377,1377,53,60,3000,7000,0,0,-7177.07,574.409,1.58818,2.04744,'177:0 2294:0 2295:0 2304:0 2348:0 2351:0 2352:0 2355:0 '),\n+(2351,'Silithus60',1,1377,3097,53,60,3000,7000,0,0,-6922.48,666.906,11.4539,0.176223,'2294:0 2304:0 2323:0 2350:0 '),\n+(2352,'Silithus61',1,1377,2738,50,60,3000,7000,0,0,-7078.09,417.604,8.20627,4.43703,'2294:0 2350:0 2353:0 '),\n+(2353,'Silithus62',1,1377,2738,50,60,3000,7000,0,0,-7146.41,350.222,26.2951,0.0509645,'2294:0 2352:0 2354:0 2356:0 '),\n+(2354,'Silithus63',1,1377,2738,50,60,3000,7000,0,0,-7259.78,328.568,47.9494,0.00187492,'2353:0 2356:0 2357:0 '),\n+(2355,'Silithus64',1,1377,2738,50,60,3000,7000,0,0,-7283.42,473.511,11.4843,5.52991,'2349:0 2350:0 2356:0 2357:0 '),\n+(2356,'Silithus65',1,1377,2738,50,60,3000,7000,0,0,-7183.12,437.593,64.3972,4.38322,'2353:0 2354:0 2355:0 '),\n+(2357,'Silithus66',1,1377,2738,50,60,3000,7000,0,0,-7342.29,338.615,9.9245,1.29662,'2349:0 2354:0 2355:0 192:0 '),\n+(2358,'Silithus67',1,1377,2744,53,60,3000,7000,0,0,-7815.08,208.412,5.58908,6.15627,'192:0 '),\n+(2359,'Silithus68',1,1377,2744,55,60,3000,7000,0,0,-7734.1,629.157,-47.1739,6.08166,'2349:0 2360:0 2361:0 2346:0 '),\n+(2360,'Silithus69',1,1377,2744,55,60,3000,7000,0,0,-7803.61,427.995,-36.2971,1.11402,'2359:0 2361:0 2362:0 '),\n+(2361,'Silithus70',1,1377,2744,55,60,3000,7000,0,0,-7937.51,488.881,-34.8964,5.632,'2359:0 2360:0 2365:0 2366:0 '),\n+(2362,'Silithus71',1,1377,2744,55,60,3000,7000,0,0,-7860.7,346.797,-48.3413,1.79141,'2360:0 2363:0 2364:0 '),\n+(2363,'Silithus72',1,1377,2744,53,60,3000,7000,0,0,-7708.29,262.213,-42.7965,5.31941,'2362:0 '),\n+(2364,'Silithus73',1,1377,2744,53,60,3000,7000,0,0,-7678.37,284.795,-37.2732,5.97131,'2362:0 '),\n+(2365,'Silithus74',1,1377,1377,53,60,3000,7000,0,0,-8294.16,376.133,-94.7165,0.44759,'2361:0 '),\n+(2366,'Silithus75',1,1377,2744,53,60,3000,7000,0,0,-8140.13,753.793,-85.1582,5.97285,'2361:0 2367:0 '),\n+(2367,'Silithus76',1,1377,1377,53,60,3000,7000,0,0,-8313.26,729.325,-74.3037,4.85955,'2366:0 '),\n+(2368,'AltarOfStorms2',0,46,255,48,56,3000,7000,0,1,-7605.65,-798.145,190.852,3.45765,'635:0 '),\n+(2369,'Darrowshire',0,139,2262,53,60,3000,7000,0,1,1416.41,-3653.3,82.0183,4.38389,'230:0 '),\n+(2370,'BLS4H',0,4,72,43,54,3000,7000,0,5,-11896.1,-3084.13,31.0889,0.713907,'855:0 '),\n+(2371,'TanarisSpawnAll',1,440,1940,44,50,3000,7000,0,1,-8319.94,-5071.72,4.11589,2.25351,'2207:0 '),\n+(2372,'hellfire001',530,3483,3804,60,63,3000,7000,0,0,-88.1661,1757.73,61.4158,2.30551,'2373:0 2376:0 '),\n+(2373,'hellfire002',530,3483,3804,60,63,3000,7000,0,0,-130.83,1837.76,78.4899,5.22012,'2372:0 2374:0 2376:0 '),\n+(2374,'hellfire003',530,3483,3542,60,63,3000,7000,0,0,-228.144,1920.56,96.8968,1.90495,'2373:0 2375:0 2376:0 '),\n+(2375,'hellfire004',530,3483,3542,60,63,3000,7000,0,1,-207.846,2150.92,80.3185,1.58606,'2374:0 2396:0 2407:0 '),\n+(2376,'hellfire005',530,3483,3804,60,63,3000,7000,0,0,-320.252,1725.48,60.1535,0.383608,'2372:0 2373:0 2374:0 2377:0 '),\n+(2377,'hellfire006',530,3483,3804,60,63,3000,7000,0,0,-443.68,1809.38,64.2507,6.17593,'2376:0 2378:0 '),\n+(2378,'hellfire007',530,3483,3815,60,63,3000,7000,0,0,-614.482,1855.41,72.3221,2.91339,'2377:0 2379:0 '),\n+(2379,'hellfire008',530,3483,3483,60,63,3000,7000,0,0,-772.087,1924.89,51.3142,3.69486,'2378:0 2380:0 2381:0 '),\n+(2380,'hellfire009',530,3483,3582,60,63,3000,7000,0,0,-890.066,1889.54,71.6232,2.99193,'2379:0 '),\n+(2381,'hellfire010',530,3483,3483,60,63,3000,7000,0,0,-665.15,2133.08,41.0304,6.09818,'2379:0 2382:0 '),\n+(2382,'hellfire011',530,3483,3483,60,63,3000,7000,0,0,-830.651,2170.3,10.6442,6.00392,'2381:0 2383:0 '),\n+(2383,'hellfire012',530,3483,3582,60,63,3000,7000,0,0,-1044.48,2221.12,18.1881,2.68955,'2382:0 2384:0 2386:0 '),\n+(2384,'hellfire013',530,3483,3582,60,63,3000,7000,0,0,-1060.21,2075.54,65.7492,1.53579,'2383:0 2385:0 '),\n+(2385,'hellfire014',530,3483,3582,60,63,3000,7000,0,0,-1136.98,1968.35,74.7199,4.3593,'2384:0 '),\n+(2386,'hellfire015',530,3483,3483,60,63,3000,7000,0,0,-1116.71,2366.85,26.2,1.55936,'2383:0 2387:0 '),\n+(2387,'hellfire016',530,3483,3483,60,63,3000,7000,0,0,-1209.75,2517.59,48.9283,1.97249,'2386:0 '),\n+(2388,'hellfire017',530,3483,3483,60,63,3000,7000,0,0,-927.061,2680.73,24.4655,4.225,'2389:0 2392:0 '),\n+(2389,'hellfire018',530,3483,3483,60,63,3000,7000,0,0,-991.176,2930.18,4.1955,4.89571,'2388:0 2412:0 2413:0 '),\n+(2390,'hellfire019',530,3483,3483,60,63,3000,7000,0,0,-652.576,2459.81,56.8494,0.00658825,'2391:0 2392:0 '),\n+(2391,'hellfire020',530,3483,3483,60,63,3000,7000,0,0,-382.816,2594.23,50.224,3.72781,'2390:0 '),\n+(2392,'hellfire021',530,3483,3538,60,63,3000,7000,0,3,-721.67,2675.81,95.7509,0.770785,'2388:0 2390:0 '),\n+(2393,'hellfire022',530,3483,3483,60,63,3000,7000,0,0,-449.715,2925.64,21.2132,0.32312,'2394:0 '),\n+(2394,'hellfire023',530,3483,3483,60,63,3000,7000,0,0,-593.071,2998.53,15.8438,0.017592,'2393:0 2395:0 '),\n+(2395,'hellfire024',530,3483,3483,60,63,3000,7000,0,0,-749.912,3117.85,4.88152,5.75179,'2394:0 2412:0 2453:0 '),\n+(2396,'hellfire025',530,3483,3483,60,63,3000,7000,0,0,-80.7943,2320.17,65.6333,4.50299,'2375:0 2397:0 2400:0 2407:0 '),\n+(2397,'hellfire026',530,3483,3483,60,63,3000,7000,0,0,18.4377,2469.36,53.639,4.22811,'2396:0 2398:0 2400:0 '),\n+(2398,'hellfire027',530,3483,3536,60,63,3000,7000,0,4,33.0662,2661.07,75.7738,3.89274,'2397:0 2399:0 '),\n+(2399,'hellfire028',530,3483,3536,60,63,3000,7000,0,5,221.743,2789.93,121.175,3.98307,'2398:0 2450:0 '),\n+(2400,'hellfire029',530,3483,3793,60,63,3000,7000,0,0,158.425,2334.4,54.1841,5.04414,'2396:0 2397:0 2401:0 '),\n+(2401,'hellfire030',530,3483,3793,60,63,3000,7000,0,0,270.62,2240.47,56.9978,2.96989,'2400:0 2402:0 '),\n+(2402,'hellfire031',530,3483,3793,60,63,3000,7000,0,0,255.635,2040.2,31.817,2.78925,'2401:0 2403:0 '),\n+(2403,'hellfire032',530,3483,3483,60,63,3000,7000,0,0,446.912,2049.26,99.1622,3.3783,'2402:0 2404:0 '),\n+(2404,'hellfire033',530,3483,3483,60,63,3000,7000,0,0,442.066,2351.62,123.026,4.69385,'2403:0 2405:0 '),\n+(2405,'hellfire034',530,3483,3483,60,63,3000,7000,0,0,438.394,2661.09,177.718,4.90591,'2404:0 2406:0 '),\n+(2406,'hellfire035',530,3483,3549,60,63,3000,7000,0,0,549.636,2796.65,217.8,4.31374,'2405:0 '),\n+(2407,'hellfire036',530,3483,3542,60,63,3000,7000,0,0,-220.959,2363,37.4537,1.6049,'2375:0 2396:0 2408:0 '),\n+(2408,'hellfire037',530,3483,3542,60,63,3000,7000,0,0,-248.594,2648.76,-11.9763,4.88786,'2407:0 2409:0 '),\n+(2409,'hellfire038',530,3483,3542,60,63,3000,7000,0,0,-270.052,2895.86,-55.0992,4.86824,'2408:0 2410:0 2411:0 '),\n+(2410,'hellfire039',530,3483,3545,60,63,3000,7000,0,0,-371.638,3039.8,-63.8946,5.60259,'2409:0 '),\n+(2411,'hellfire040',530,3483,3545,60,63,3000,7000,0,0,-243.298,3044.75,-65.4235,4.48185,'2409:0 '),\n+(2412,'hellfire041',530,3483,3483,60,63,3000,7000,0,0,-930.007,3088.24,16.9479,0.133084,'2389:0 2395:0 2413:0 2420:0 '),\n+(2413,'hellfire042',530,3483,3483,60,63,3000,7000,0,0,-1233.86,3071.59,29.2379,5.81622,'2412:0 2389:0 2414:0 2416:0 '),\n+(2414,'hellfire043',530,3483,3796,60,63,3000,7000,0,0,-1370.5,2890.29,-26.0325,3.35557,'2413:0 2415:0 '),\n+(2415,'hellfire044',530,3483,3546,60,63,3000,7000,0,0,-1257.98,2677.11,1.84108,2.88824,'2414:0 '),\n+(2416,'hellfire045',530,3483,3483,60,63,3000,7000,0,0,-1343.14,3305.78,47.482,2.24265,'2413:0 2417:0 '),\n+(2417,'hellfire046',530,3483,3765,60,63,3000,7000,0,0,-1519.57,3487.42,30.3847,2.18217,'2416:0 2418:0 '),\n+(2418,'hellfire047',530,3483,3765,60,63,3000,7000,0,0,-1621.55,3645.56,31.4811,1.74235,'2417:0 2419:0 '),\n+(2419,'hellfire048',530,3483,3765,60,63,3000,7000,0,0,-1680.38,3854.3,36.4441,1.97326,'2418:0 2738:0 '),\n+(2420,'hellfire049',530,3483,3483,60,63,3000,7000,0,0,-1003.35,3339.19,79.143,4.83211,'2412:0 2421:0 '),\n+(2421,'hellfire050',530,3483,3483,60,63,3000,7000,0,0,-866.12,3482.05,93.6018,3.97209,'2420:0 2422:0 '),\n+(2422,'hellfire051',530,3483,3543,60,63,3000,7000,0,0,-842.626,3645.6,31.4407,5.28056,'2421:0 2423:0 '),\n+(2423,'hellfire052',530,3483,3543,60,63,3000,7000,0,0,-578.854,3725.85,28.9962,3.4176,'2422:0 2424:0 '),\n+(2424,'hellfire053',530,3483,3543,60,63,3000,7000,0,0,-629.058,3954.17,28.9952,4.88236,'2423:0 2425:0 2426:0 2428:0 '),\n+(2425,'hellfire054',530,3483,3483,60,63,3000,7000,0,0,-503.474,4084.93,51.2172,4.03729,'2424:0 2428:0 2435:0 '),\n+(2426,'hellfire055',530,3483,3543,60,63,3000,7000,0,0,-841.235,4095.51,32.9704,5.79579,'2424:0 2427:0 2428:0 2431:0 '),\n+(2427,'hellfire056',530,3483,3483,60,63,3000,7000,0,0,-950.497,4184.92,29.5337,3.20635,'2426:0 2429:0 2431:0 '),\n+(2428,'hellfire057',530,3483,3554,60,63,3000,7000,0,5,-659.228,4167.05,67.8382,3.41684,'2424:0 2425:0 2426:0 2435:0 '),\n+(2429,'hellfire058',530,3483,3556,60,63,3000,7000,0,0,-1174.94,4209.88,20.9412,0.188851,'2427:0 2430:0 '),\n+(2430,'hellfire059',530,3483,3798,60,63,3000,7000,0,0,-1287.84,4075.76,93.8567,5.93954,'2429:0 '),\n+(2431,'hellfire060',530,3483,3483,60,63,3000,7000,0,0,-1036.95,4000.75,83.0333,2.90005,'2426:0 2427:0 2432:0 '),\n+(2432,'hellfire061',530,3483,3483,60,63,3000,7000,0,0,-891.162,4017.27,84.496,3.16788,'2431:0 2433:0 '),\n+(2433,'hellfire062',530,3483,3543,60,63,3000,7000,0,0,-799.397,3955.75,91.0415,2.42568,'2432:0 2434:0 '),\n+(2434,'hellfire063',530,3483,3483,60,63,3000,7000,0,0,-766.496,3789.21,113.362,1.77223,'2433:0 '),\n+(2435,'hellfire064',530,3483,3483,60,63,3000,7000,0,0,-593.759,4335.47,52.0515,4.60437,'2428:0 2425:0 2436:0 '),\n+(2436,'hellfire065',530,3483,3483,60,63,3000,7000,0,0,-336.014,4367.15,59.658,3.93679,'2435:0 2437:0 2463:0 '),\n+(2437,'hellfire066',530,3483,3483,60,63,3000,7000,0,0,-202.4,4447.51,42.6762,3.81506,'2436:0 2438:0 2460:0 2463:0 '),\n+(2438,'hellfire067',530,3483,3483,60,63,3000,7000,0,0,-100.749,4241.25,83.9687,2.24269,'2437:0 2439:0 2441:0 2443:0 2459:0 '),\n+(2439,'hellfire068',530,3483,3552,60,63,3000,7000,0,2,63.0268,4335.15,96.8814,6.21365,'2438:0 2440:0 2441:0 '),\n+(2440,'hellfire069',530,3483,3552,60,63,3000,7000,0,3,215.545,4332.38,119.241,2.95661,'2439:0 '),\n+(2441,'hellfire070',530,3483,3483,60,63,3000,7000,0,0,39.4389,4153.06,71.524,1.85939,'2438:0 2439:0 2442:0 2443:0 2459:0 '),\n+(2442,'hellfire071',530,3483,3483,60,63,3000,7000,0,0,150.282,3945.51,79.661,2.2835,'2441:0 2443:0 2469:0 '),\n+(2443,'hellfire072',530,3483,3483,60,63,3000,7000,0,0,-96.2588,3960.84,99.7364,0.521852,'2438:0 2442:0 2441:0 2444:0 2459:0 '),\n+(2444,'hellfire073',530,3483,3669,60,63,3000,7000,0,0,-120.509,3779.67,72.1233,1.75885,'2443:0 2445:0 '),\n+(2445,'hellfire074',530,3483,3553,60,63,3000,7000,0,0,-61.6848,3514.21,73.5858,5.1667,'2444:0 2446:0 2448:0 2452:0 '),\n+(2446,'hellfire075',530,3483,3553,60,63,3000,7000,0,0,318.42,3476.5,61.5198,2.95581,'2445:0 2447:0 '),\n+(2447,'hellfire076',530,3483,3553,60,63,3000,7000,0,0,383.974,3310.89,74.522,1.91516,'2446:0 '),\n+(2448,'hellfire077',530,3483,3483,60,63,3000,7000,0,0,-44.2798,3288.99,27.2629,1.47534,'2445:0 2449:0 2452:0 '),\n+(2449,'hellfire078',530,3483,3483,60,63,3000,7000,0,0,-43.1353,3087.28,-1.55873,1.59942,'2448:0 2450:0 '),\n+(2450,'hellfire079',530,3483,3483,60,63,3000,7000,0,0,312.814,2983.21,19.5651,2.81914,'2399:0 2449:0 2451:0 '),\n+(2451,'hellfire080',530,3483,3799,60,63,3000,7000,0,0,459.167,3040.66,17.0606,3.687,'2450:0 '),\n+(2452,'hellfire081',530,3483,3670,60,63,3000,7000,0,0,-182.907,3456.14,39.4587,0.671851,'2445:0 2448:0 '),\n+(2453,'hellfire082',530,3483,3671,60,63,3000,7000,0,0,-567.836,3269.14,15.2208,4.86979,'2395:0 2454:0 '),\n+(2454,'hellfire083',530,3483,3671,60,63,3000,7000,0,0,-549.666,3476.52,45.226,4.64597,'2453:0 2455:0 2456:0 '),\n+(2455,'hellfire084',530,3483,3671,60,63,3000,7000,0,0,-445.867,3462.18,37.6671,2.82071,'2454:0 '),\n+(2456,'hellfire085',530,3483,3669,60,63,3000,7000,0,0,-452.212,3658.72,45.9024,0.816375,'2454:0 2457:0 '),\n+(2457,'hellfire086',530,3483,3483,60,63,3000,7000,0,0,-378.049,3871.34,62.3491,4.48419,'2456:0 2458:0 '),\n+(2458,'hellfire087',530,3483,3669,60,63,3000,7000,0,0,-294.007,3742.96,51.9568,2.11386,'2457:0 2459:0 '),\n+(2459,'hellfire088',530,3483,3483,60,63,3000,7000,0,0,-203.95,4100.77,98.2207,5.35677,'2438:0 2441:0 2443:0 2458:0 '),\n+(2460,'hellfire089',530,3483,3483,60,63,3000,7000,0,1,-249.051,4768.73,14.6773,1.56722,'2437:0 2461:0 2462:0 2463:0 2466:0 2467:0 '),\n+(2461,'hellfire090',530,3483,3797,60,63,3000,7000,0,0,13.8026,4691.45,41.6534,6.21284,'2460:0 2467:0 '),\n+(2462,'hellfire091',530,3483,3551,60,63,3000,7000,0,0,-556.09,4800.17,34.169,3.11602,'2460:0 2463:0 2466:0 '),\n+(2463,'hellfire092',530,3483,3483,60,63,3000,7000,0,0,-412.14,4578.53,39.0585,2.37774,'2460:0 2436:0 2437:0 2462:0 2466:0 '),\n+(2464,'hellfire093',530,3483,3800,60,63,3000,7000,0,0,-259.551,5042.36,65.21,1.36455,'2465:0 2471:0 '),\n+(2465,'hellfire094',530,3483,3795,60,63,3000,7000,0,0,-403.556,4975.22,40.4154,0.508468,'2464:0 2466:0 '),\n+(2466,'hellfire095',530,3483,3795,60,63,3000,7000,0,0,-417.252,4788.73,19.9639,2.94399,'2463:0 2460:0 2462:0 2465:0 '),\n+(2467,'hellfire096',530,3483,3797,60,63,3000,7000,0,0,-68.76,4846.8,50.753,4.86823,'2460:0 2461:0 2468:0 '),\n+(2468,'hellfire097',530,3483,3797,60,63,3000,7000,0,0,173.831,4854.22,77.6594,3.44272,'2467:0 '),\n+(2469,'hellfire098',530,3483,3483,60,63,3000,7000,0,0,335.776,4014.33,100.063,3.83622,'2442:0 2470:0 '),\n+(2470,'hellfire099',530,3483,3483,60,63,3000,7000,0,0,353.816,3871.24,144.979,1.47611,'2469:0 '),\n+(2471,'hellfire100',530,3483,3800,60,63,3000,7000,0,0,-234.311,5165.64,83.9852,4.49598,'2464:0 2472:0 '),\n+(2472,'zangar101',530,3521,3521,61,64,3000,7000,0,0,-271.021,5303.67,41.8812,4.77871,'2471:0 2473:0 '),\n+(2473,'zangar102',530,3521,3565,61,64,3000,7000,0,1,-220.592,5436.56,21.669,5.30379,'2472:0 2474:0 2475:0 '),\n+(2474,'zangar103',530,3521,3521,61,64,3000,7000,0,0,-84.4992,5395.31,22.3401,3.21027,'2473:0 2613:0 '),\n+(2475,'zangar104',530,3521,3521,61,64,3000,7000,0,0,-395.049,5385.52,18.5881,6.06676,'2473:0 2476:0 '),\n+(2476,'zangar105',530,3521,3521,61,64,3000,7000,0,0,-535.462,5435.61,20.9825,5.81938,'2475:0 2477:0 '),\n+(2477,'zangar106',530,3521,3521,61,64,3000,7000,0,0,-672.658,5367.99,22.9724,0.237551,'2476:0 2478:0 '),\n+(2478,'zangar107',530,3521,3641,61,64,3000,7000,0,0,-758.891,5282.57,17.6121,1.72588,'2477:0 2479:0 '),\n+(2479,'zangar108',530,3521,3641,61,64,3000,7000,0,0,-813.122,5198.88,19.1746,1.05202,'2478:0 2480:0 '),\n+(2480,'zangar109',530,3521,3641,61,64,3000,7000,0,0,-976.189,5260.97,19.0927,6.05108,'2479:0 2481:0 2626:0 '),\n+(2481,'zangar110',530,3521,3521,61,64,3000,7000,0,0,-934.208,5419.78,22.8095,4.46851,'2480:0 2482:0 2626:0 '),\n+(2482,'zangar111',530,3521,3521,61,64,3000,7000,0,0,-966.5,5606.91,22.0137,4.97508,'2481:0 2483:0 '),\n+(2483,'zangar112',530,3521,3521,61,64,3000,7000,0,0,-912.293,5682.09,21.6937,5.08504,'2482:0 2484:0 '),\n+(2484,'zangar113',530,3521,3521,61,64,3000,7000,0,0,-913.195,5896.44,20.1725,4.59652,'2483:0 2485:0 2488:0 '),\n+(2485,'zangar114',530,3521,3521,61,64,3000,7000,0,0,-909.682,6045.49,19.7314,4.59651,'2484:0 2486:0 2488:0 2489:0 '),\n+(2486,'zangar115',530,3521,3521,61,64,3000,7000,0,0,-1037.12,6091.11,19.5931,5.89242,'2485:0 2487:0 '),\n+(2487,'zangar116',530,3521,3521,61,64,3000,7000,0,0,-1163.58,6201.43,53.0219,5.61282,'2486:0 2625:0 '),\n+(2488,'zangar117',530,3521,3841,61,64,3000,7000,0,0,-796.58,5918.23,22.3409,2.31415,'2484:0 2485:0 2489:0 '),\n+(2489,'zangar118',530,3521,3521,61,64,3000,7000,0,0,-701.347,6013.97,22.3146,3.22521,'2488:0 2485:0 2490:0 2491:0 '),\n+(2490,'zangar119',530,3521,3841,61,64,3000,7000,0,0,-592.408,5933.75,20.813,5.51464,'2489:0 2491:0 '),\n+(2491,'zangar120',530,3521,3521,61,64,3000,7000,0,0,-504.59,6048.64,23.1686,4.20775,'2490:0 2489:0 2492:0 '),\n+(2492,'zangar121',530,3521,3841,61,64,3000,7000,0,0,-495.325,5854.59,20.3458,2.52376,'2491:0 2493:0 '),\n+(2493,'zangar122',530,3521,3521,61,64,3000,7000,0,0,-318.55,6013.33,23.3657,3.50315,'2492:0 2494:0 2608:0 '),\n+(2494,'zangar123',530,3521,3819,61,64,3000,7000,0,0,-352.699,6158.62,21.7844,4.91293,'2493:0 2495:0 2608:0 '),\n+(2495,'zangar124',530,3521,3819,61,64,3000,7000,0,0,-338.739,6298.09,21.04,4.63411,'2494:0 2496:0 '),\n+(2496,'zangar125',530,3521,3819,61,64,3000,7000,0,0,-409.277,6401.64,21.9404,0.801373,'2495:0 2497:0 2500:0 '),\n+(2497,'zangar126',530,3521,3819,61,64,3000,7000,0,0,-230.832,6354.36,21.7058,3.81024,'2496:0 2498:0 '),\n+(2498,'zangar127',530,3521,3659,61,64,3000,7000,0,0,-139.857,6456.59,20.0973,3.85658,'2497:0 2499:0 2607:0 '),\n+(2499,'zangar128',530,3521,3659,61,64,3000,7000,0,0,-269.671,6613.48,23.0533,4.34353,'2498:0 2500:0 '),\n+(2500,'zangar129',530,3521,3659,61,64,3000,7000,0,0,-383.175,6598.68,22.9642,4.52024,'2496:0 2499:0 2501:0 '),\n+(2501,'zangar130',530,3521,3659,61,64,3000,7000,0,0,-215.725,6703.55,20.6145,4.19588,'2500:0 2502:0 2503:0 '),\n+(2502,'zangar131',530,3521,3659,61,64,3000,7000,0,0,-63.9463,6759.2,20.4434,3.22986,'2501:0 2503:0 2509:0 '),\n+(2503,'zangar132',530,3521,3659,61,64,3000,7000,0,0,-261.475,6823.98,21.6241,5.85702,'2501:0 2502:0 2504:0 '),\n+(2504,'zangar133',530,3521,3642,61,64,3000,7000,0,0,-208.234,6950.07,20.1839,0.893301,'2503:0 2505:0 '),\n+(2505,'zangar134',530,3521,3642,61,64,3000,7000,0,0,-126.36,7041.34,18.9083,3.86997,'2504:0 2506:0 '),\n+(2506,'zangar135',530,3521,3642,61,64,3000,7000,0,0,-50.056,7132.44,19.2134,4.60817,'2505:0 2507:0 '),\n+(2507,'zangar136',530,3521,3521,61,64,3000,7000,0,0,64.7648,7212.88,22.0782,0.46519,'2506:0 2508:0 2516:0 2517:0 2528:0 '),\n+(2508,'zangar137',530,3521,3521,61,64,3000,7000,0,0,44.854,7014.88,23.4767,1.78543,'2507:0 2509:0 '),\n+(2509,'zangar138',530,3521,3521,61,64,3000,7000,0,0,43.5835,6871.99,22.3894,4.7567,'2508:0 2502:0 2510:0 2511:0 '),\n+(2510,'zangar139',530,3521,3521,61,64,3000,7000,0,0,157.048,6719.99,20.4444,2.3259,'2509:0 2511:0 2595:0 '),\n+(2511,'zangar140',530,3521,3720,61,64,3000,7000,0,0,223.784,6824.17,25.6438,3.74197,'2509:0 2510:0 2512:0 2595:0 '),\n+(2512,'zangar141',530,3521,3720,61,64,3000,7000,0,0,234.681,6926.14,23.7418,4.49203,'2511:0 2513:0 '),\n+(2513,'zangar142',530,3521,3720,61,64,3000,7000,0,0,212.404,7079.58,35.2277,4.69231,'2512:0 2514:0 '),\n+(2514,'zangar143',530,3521,3720,61,64,3000,7000,0,0,220.362,7208.94,25.1738,4.71196,'2513:0 2515:0 '),\n+(2515,'zangar144',530,3521,3720,61,64,3000,7000,0,0,336.506,7340.86,41.5461,4.13471,'2514:0 2516:0 2587:0 '),\n+(2516,'zangar145',530,3521,3720,61,64,3000,7000,0,0,157.889,7365.75,22.1067,6.02358,'2507:0 2515:0 2517:0 '),\n+(2517,'zangar146',530,3521,3521,61,64,3000,7000,0,0,63.1597,7443.51,22.1993,5.2932,'2507:0 2516:0 2518:0 2528:0 '),\n+(2518,'zangar147',530,3521,3521,61,64,3000,7000,0,0,115.528,7547.02,21.6598,4.53135,'2517:0 2519:0 2523:0 '),\n+(2519,'zangar148',530,3521,3521,61,64,3000,7000,0,0,118.141,7658.13,21.5634,4.72141,'2518:0 2520:0 2523:0 2529:0 2587:0 '),\n+(2520,'zangar149',530,3521,3521,61,64,3000,7000,0,4,246.937,7753.08,23.1428,3.93445,'2519:0 2521:0 2523:0 2529:0 2587:0 '),\n+(2521,'zangar150',530,3521,3645,61,64,3000,7000,0,5,264.306,7863.47,23.7956,4.64131,'2520:0 2522:0 2523:0 2529:0 '),\n+(2522,'zangar151',530,3521,3521,61,64,3000,7000,0,4,449.39,7844.62,22.0319,3.04694,'2521:0 2569:0 '),\n+(2523,'zangar152',530,3521,3521,61,64,3000,7000,0,0,81.5617,7740.29,21.6356,3.14119,'2518:0 2519:0 2520:0 2521:0 2524:0 2529:0 '),\n+(2524,'zangar153',530,3521,3521,61,64,3000,7000,0,0,-28.0868,7736.24,20.5893,6.25922,'2523:0 2525:0 2529:0 2536:0 '),\n+(2525,'zangar154',530,3521,3521,61,64,3000,7000,0,0,-170.551,7601.35,23.3202,0.757515,'2524:0 2526:0 2535:0 '),\n+(2526,'zangar155',530,3521,3521,61,64,3000,7000,0,0,-174.825,7443.51,21.9702,1.57433,'2525:0 2527:0 2528:0 '),\n+(2527,'zangar156',530,3521,3642,61,64,3000,7000,0,0,-120.981,7305.7,23.422,1.77461,'2526:0 2528:0 '),\n+(2528,'zangar157',530,3521,3521,61,64,3000,7000,0,0,-20.2426,7327.37,23.7348,2.19481,'2527:0 2526:0 2517:0 2507:0 '),\n+(2529,'zangar158',530,3521,3521,61,64,3000,7000,0,0,84.0333,7841.91,22.0373,4.55886,'2519:0 2520:0 2521:0 2523:0 2524:0 2530:0 '),\n+(2530,'zangar159',530,3521,3521,61,64,3000,7000,0,0,65.13,7971.37,21.6779,4.89266,'2529:0 2531:0 '),\n+(2531,'zangar160',530,3521,3521,61,64,3000,7000,0,0,43.5829,8117.3,22.3841,4.94372,'2530:0 2532:0 2552:0 '),\n+(2532,'zangar161',530,3521,3521,61,64,3000,7000,0,0,-49.1017,8195.83,23.1999,5.71343,'2531:0 2533:0 2537:0 2541:0 '),\n+(2533,'zangar162',530,3521,3646,61,64,3000,7000,0,0,-209.87,8126.35,19.9595,0.261968,'2532:0 2534:0 2536:0 2537:0 '),\n+(2534,'zangar163',530,3521,3646,61,64,3000,7000,0,0,-261.772,7885.5,18.5845,1.41258,'2533:0 2535:0 2536:0 '),\n+(2535,'zangar164',530,3521,3521,61,64,3000,7000,0,0,-259.719,7720.02,20.8878,1.65605,'2525:0 2534:0 '),\n+(2536,'zangar165',530,3521,3646,61,64,3000,7000,0,0,-98.2706,7905.01,21.2267,4.92567,'2524:0 2533:0 2534:0 '),\n+(2537,'zangar166',530,3521,3521,61,64,3000,7000,0,0,-180.804,8271.58,22.3452,2.13749,'2532:0 2533:0 2538:0 2541:0 '),\n+(2538,'zangar167',530,3521,3521,61,64,3000,7000,0,0,-280.916,8401.01,22.613,5.34193,'2537:0 2539:0 '),\n+(2539,'zangar168',530,3521,3521,61,64,3000,7000,0,0,-414.115,8416.71,22.9544,6.2098,'2538:0 2540:0 2903:0 '),\n+(2540,'zangar169',530,3521,3521,61,64,3000,7000,0,0,-208.705,8507.09,22.1101,4.05625,'2539:0 2541:0 '),\n+(2541,'zangar170',530,3521,3521,61,64,3000,7000,0,0,-76.6423,8339.54,20.5708,1.28772,'2537:0 2532:0 2540:0 2542:0 '),\n+(2542,'zangar171',530,3521,3521,61,64,3000,7000,0,0,2.14825,8447.62,24.0799,1.18326,'2541:0 2543:0 2550:0 '),\n+(2543,'zangar172',530,3521,3647,61,64,3000,7000,0,0,-67.5414,8574.38,21.4033,5.22493,'2542:0 2544:0 2550:0 '),\n+(2544,'zangar173',530,3521,3647,61,64,3000,7000,0,0,-131.783,8711.6,20.1378,5.16367,'2543:0 2545:0 '),\n+(2545,'zangar174',530,3521,3647,61,64,3000,7000,0,0,-58.2395,8845.13,19.6236,4.45683,'2544:0 2546:0 '),\n+(2546,'zangar175',530,3521,3647,61,64,3000,7000,0,0,-158.14,8998.32,22.6743,5.39853,'2545:0 2547:0 '),\n+(2547,'zangar176',530,3521,3521,61,64,3000,7000,0,0,49.2289,8919.95,22.8353,4.08298,'2546:0 2548:0 2566:0 '),\n+(2548,'zangar177',530,3521,3658,61,64,3000,7000,0,0,191.332,8791.02,22.5064,3.15621,'2547:0 2549:0 '),\n+(2549,'zangar178',530,3521,3658,61,64,3000,7000,0,0,100.838,8633.77,22.3518,1.01992,'2548:0 2550:0 '),\n+(2550,'zangar179',530,3521,3521,61,64,3000,7000,0,0,46.3545,8528.92,21.3211,3.67772,'2542:0 2543:0 2549:0 2551:0 '),\n+(2551,'zangar180',530,3521,3521,61,64,3000,7000,0,1,201.143,8506.92,24.4625,4.24664,'2550:0 2552:0 '),\n+(2552,'zangar181',530,3521,3656,61,64,3000,7000,0,0,176.313,8271.1,19.3723,2.275,'2531:0 2551:0 2553:0 '),\n+(2553,'zangar182',530,3521,3656,61,64,3000,7000,0,0,285.943,8219.3,20.2926,3.15229,'2552:0 2554:0 '),\n+(2554,'zangar183',530,3521,3656,61,64,3000,7000,0,0,386.339,8346.33,22.789,4.31625,'2553:0 2555:0 '),\n+(2555,'zangar184',530,3521,3656,61,64,3000,7000,0,0,494.267,8437.25,21.4802,4.07671,'2554:0 2556:0 2563:0 2567:0 '),\n+(2556,'zangar185',530,3521,3656,61,64,3000,7000,0,0,608.933,8508.26,22.3504,3.55914,'2555:0 2557:0 2563:0 '),\n+(2557,'zangar186',530,3521,3521,61,64,3000,7000,0,0,742.61,8532.55,22.4318,3.26227,'2556:0 2558:0 2562:0 2563:0 '),\n+(2558,'zangar187',530,3521,3521,61,64,3000,7000,0,0,895.923,8416.01,24.0337,2.57898,'2557:0 2559:0 '),\n+(2559,'zangar188',530,3521,3650,61,64,3000,7000,0,0,1075.84,8407.67,22.4904,3.12875,'2558:0 2560:0 2561:0 2574:0 '),\n+(2560,'zangar189',530,3521,3650,61,64,3000,7000,0,0,1227.41,8505.09,22.644,3.70367,'2559:0 2561:0 2575:0 '),\n+(2561,'zangar190',530,3521,3650,61,64,3000,7000,0,0,1037.11,8556.71,23.1526,5.52971,'2559:0 2560:0 2562:0 '),\n+(2562,'zangar191',530,3521,3521,61,64,3000,7000,0,0,838.679,8631.92,21.121,3.9,'2561:0 2557:0 '),\n+(2563,'zangar192',530,3521,3657,61,64,3000,7000,0,0,532.243,8648.7,20.2148,1.72209,'2555:0 2556:0 2557:0 2564:0 '),\n+(2564,'zangar193',530,3521,3521,61,64,3000,7000,0,0,500.585,8831.78,29.9762,3.31252,'2563:0 2565:0 '),\n+(2565,'zangar194',530,3521,3521,61,64,3000,7000,0,0,312.939,8988.81,29.3602,2.17448,'2564:0 2566:0 '),\n+(2566,'zangar195',530,3521,3521,61,64,3000,7000,0,0,153.844,9001.52,20.6373,4.20787,'2547:0 2565:0 '),\n+(2567,'zangar196',530,3521,3643,61,64,3000,7000,0,0,634.189,8249.73,20.9802,4.23537,'2555:0 2568:0 '),\n+(2568,'zangar197',530,3521,3643,61,64,3000,7000,0,0,610.771,8068.12,19.5665,1.60114,'2567:0 2569:0 2571:0 '),\n+(2569,'zangar198',530,3521,3667,61,64,3000,7000,0,0,579.736,7860.06,21.923,1.46997,'2522:0 2568:0 2570:0 '),\n+(2570,'zangar199',530,3521,3667,61,64,3000,7000,0,0,737.751,7895.31,21.9665,6.19807,'2569:0 2571:0 '),\n+(2571,'zangar200',530,3521,3521,61,64,3000,7000,0,0,787.048,8075.83,19.8301,1.19115,'2568:0 2570:0 2572:0 '),\n+(2572,'zangar201',530,3521,3667,61,64,3000,7000,0,0,940.179,8075.93,22.3322,3.07219,'2571:0 2573:0 2579:0 '),\n+(2573,'zangar202',530,3521,3667,61,64,3000,7000,0,0,1079.94,8078.99,22.0839,3.44134,'2572:0 2574:0 2578:0 '),\n+(2574,'zangar203',530,3521,3640,61,64,3000,7000,0,0,1142.01,8208.94,18.3815,1.68911,'2559:0 2573:0 2578:0 '),\n+(2575,'zangar204',530,3521,3650,61,64,3000,7000,0,0,1365.27,8597.28,20.4376,3.62905,'2560:0 2576:0 '),\n+(2576,'zangar205',530,3521,3650,61,64,3000,7000,0,0,1473.46,8617.75,-19.2604,3.20336,'2575:0 2577:0 '),\n+(2577,'zangar206',530,3521,3651,61,64,3000,7000,0,0,1617.83,8604.6,-25.7602,3.11932,'2576:0 '),\n+(2578,'zangar207',530,3521,3521,61,64,3000,7000,0,0,1204.46,7994.66,23.5559,2.79496,'2573:0 2574:0 2579:0 '),\n+(2579,'zangar208',530,3521,3667,61,64,3000,7000,0,0,985.581,7906.61,21.9749,1.94279,'2572:0 2578:0 2580:0 '),\n+(2580,'zangar209',530,3521,3667,61,64,3000,7000,0,0,924.71,7759.51,22.2632,4.47963,'2579:0 2581:0 '),\n+(2581,'zangar210',530,3521,3667,61,64,3000,7000,0,0,972.886,7540.98,20.6745,5.06474,'2580:0 2582:0 '),\n+(2582,'zangar211',530,3521,3766,61,64,3000,7000,0,3,1008.04,7381.67,36.2454,2.67557,'2581:0 2583:0 3077:0 '),\n+(2583,'zangar212',530,3521,3521,61,64,3000,7000,0,2,888.478,7369.16,20.9021,3.3785,'2582:0 2584:0 2588:0 '),\n+(2584,'zangar213',530,3521,3521,61,64,3000,7000,0,0,749.898,7401.62,22.0246,0.295815,'2583:0 2585:0 2588:0 '),\n+(2585,'zangar214',530,3521,3653,61,64,3000,7000,0,0,578.096,7540.84,19.4559,5.3043,'2584:0 2586:0 '),\n+(2586,'zangar215',530,3521,3653,61,64,3000,7000,0,0,453.399,7459.1,23.6644,2.9591,'2585:0 2587:0 '),\n+(2587,'zangar216',530,3521,3521,61,64,3000,7000,0,0,301.56,7502.53,18.7007,4.88489,'2515:0 2586:0 2520:0 2519:0 '),\n+(2588,'zangar217',530,3521,3653,61,64,3000,7000,0,0,723.766,7219.4,18.4476,1.52104,'2583:0 2584:0 2589:0 '),\n+(2589,'zangar218',530,3521,3653,61,64,3000,7000,0,0,828.704,7046.99,21.9746,5.47316,'2588:0 2590:0 '),\n+(2590,'zangar219',530,3521,3521,61,64,3000,7000,0,0,813.291,6859.8,21.1175,4.5346,'2589:0 2591:0 '),\n+(2591,'zangar220',530,3521,3521,61,64,3000,7000,0,0,786.813,6686.79,19.6235,4.77415,'2590:0 2592:0 '),\n+(2592,'zangar221',530,3521,3521,61,64,3000,7000,0,0,739.145,6548.18,21.4284,2.68185,'2591:0 2593:0 2600:0 '),\n+(2593,'zangar222',530,3521,3653,61,64,3000,7000,0,0,533.697,6616.1,23.4617,5.98523,'2592:0 2594:0 2600:0 '),\n+(2594,'zangar223',530,3521,3521,61,64,3000,7000,0,0,392.669,6497.59,21.0234,1.88546,'2593:0 2595:0 2596:0 2600:0 '),\n+(2595,'zangar224',530,3521,3521,61,64,3000,7000,0,0,309.995,6655.73,21.2137,5.01134,'2510:0 2594:0 2511:0 '),\n+(2596,'zangar225',530,3521,3521,61,64,3000,7000,0,0,377.938,6282.83,22.023,4.47492,'2594:0 2597:0 '),\n+(2597,'zangar226',530,3521,3521,61,64,3000,7000,0,0,413.817,6144.54,22.2423,1.89569,'2596:0 2598:0 2603:0 '),\n+(2598,'zangar227',530,3521,3521,61,64,3000,7000,0,0,588.059,6075.05,22.5742,2.63553,'2597:0 2599:0 2601:0 2624:0 '),\n+(2599,'zangar228',530,3521,3818,61,64,3000,7000,0,0,603.408,6285.69,21.8038,4.64065,'2598:0 2600:0 2601:0 '),\n+(2600,'zangar229',530,3521,3653,61,64,3000,7000,0,0,621.81,6442.18,20.5988,2.00643,'2592:0 2593:0 2594:0 2599:0 '),\n+(2601,'zangar230',530,3521,3521,61,64,3000,7000,0,0,691.526,6136.65,24.626,4.02491,'2598:0 2599:0 2602:0 2972:0 '),\n+(2602,'zangar231',530,3521,3521,61,64,3000,7000,0,0,718.677,6010.01,23.0266,4.85273,'2601:0 2624:0 2972:0 '),\n+(2603,'zangar232',530,3521,3644,61,64,3000,7000,0,3,284.699,5949,26.4296,1.71192,'2597:0 2604:0 2611:0 '),\n+(2604,'zangar233',530,3521,3521,61,64,3000,7000,0,2,171.4,6095.69,21.4396,5.75672,'2603:0 2605:0 2608:0 2611:0 '),\n+(2605,'zangar234',530,3521,3521,61,64,3000,7000,0,0,220.592,6179.94,22.7879,2.4926,'2604:0 2606:0 '),\n+(2606,'zangar235',530,3521,3521,61,64,3000,7000,0,0,109.112,6307.6,20.5752,2.47375,'2605:0 2607:0 2608:0 '),\n+(2607,'zangar236',530,3521,3659,61,64,3000,7000,0,0,-2.05183,6372.4,21.196,6.01275,'2498:0 2606:0 '),\n+(2608,'zangar237',530,3521,3521,61,64,3000,7000,0,0,-101.637,6148.49,20.9712,3.74609,'2493:0 2494:0 2606:0 2604:0 2609:0 '),\n+(2609,'zangar238',530,3521,3521,61,64,3000,7000,0,0,-95.8529,5919.89,21.912,1.45665,'2608:0 2610:0 '),\n+(2610,'zangar239',530,3521,3521,61,64,3000,7000,0,0,13.2803,5837.85,22.8222,2.53657,'2609:0 2611:0 '),\n+(2611,'zangar240',530,3521,3521,61,64,3000,7000,0,0,151.585,5801.02,22.4062,1.73938,'2603:0 2604:0 2610:0 2612:0 '),\n+(2612,'zangar241',530,3521,3521,61,64,3000,7000,0,0,12.867,5638.72,21.5024,0.850312,'2611:0 2613:0 '),\n+(2613,'zangar242',530,3521,3521,61,64,3000,7000,0,0,48.9274,5481.91,21.872,2.08181,'2474:0 2612:0 2614:0 2616:0 '),\n+(2614,'zangar243',530,3521,3521,61,64,3000,7000,0,4,71.9609,5332.54,21.9147,5.20377,'2613:0 2615:0 2616:0 '),\n+(2615,'zangar244',530,3521,3718,61,64,3000,7000,0,5,85.2911,5223.84,22.6669,1.80693,'2614:0 '),\n+(2616,'zangar245',530,3521,3648,61,64,3000,7000,0,0,158.923,5429.39,21.7352,4.09636,'2614:0 2613:0 2617:0 '),\n+(2617,'zangar246',530,3521,3648,61,64,3000,7000,0,0,315.219,5408.5,20.9134,6.16588,'2616:0 2618:0 2619:0 '),\n+(2618,'zangar247',530,3521,3648,61,64,3000,7000,0,0,377.232,5291.67,16.6948,0.491381,'2617:0 2619:0 '),\n+(2619,'zangar248',530,3521,3648,61,64,3000,7000,0,0,610.457,5425.64,-14.6579,4.20083,'2617:0 2618:0 2620:0 2621:0 2622:0 '),\n+(2620,'zangar249',530,3521,3648,61,64,3000,7000,0,0,820.719,5482.54,9.38793,3.43975,'2619:0 2621:0 '),\n+(2621,'zangar250',530,3521,3648,61,64,3000,7000,0,0,675.579,5207.73,-0.430108,1.71187,'2619:0 2620:0 '),\n+(2622,'zangar251',530,3521,3648,61,64,3000,7000,0,0,581.932,5617.72,21.5502,1.58306,'2619:0 2623:0 '),\n+(2623,'zangar252',530,3521,3521,61,64,3000,7000,0,0,549.492,5772.45,23.2954,1.1668,'2622:0 2624:0 '),\n+(2624,'zangar253',530,3521,3521,61,64,3000,7000,0,0,569.447,5936.2,20.4341,1.13146,'2623:0 2602:0 2598:0 2972:0 '),\n+(2625,'nagrand254',530,3521,3521,61,64,3000,7000,0,0,-1293.68,6268.96,47.863,5.30897,'2487:0 2927:0 '),\n+(2626,'zangar255',530,3521,3521,61,64,3000,7000,0,0,-1072.75,5374.44,23.0643,3.2316,'2480:0 2481:0 2627:0 '),\n+(2627,'tero256',530,3519,3519,61,64,3000,7000,0,0,-1193.26,5326.41,32.1568,3.76253,'2626:0 2628:0 '),\n+(2628,'tero257',530,3519,3519,61,64,3000,7000,0,0,-1352.86,5166.19,60.3214,0.730896,'2627:0 2629:0 '),\n+(2629,'tero258',530,3519,3519,61,64,3000,7000,0,0,-1481.09,5196.68,44.2804,2.26164,'2628:0 2630:0 '),\n+(2630,'tero259',530,3703,3703,61,64,3000,7000,0,0,-1562.26,5219.05,26.8104,5.79513,'2629:0 2631:0 '),\n+(2631,'tero260',530,3703,3703,61,64,3000,7000,0,0,-1646.24,5089.63,9.06231,3.96908,'2630:0 2632:0 2633:0 '),\n+(2632,'tero261',530,3519,3519,62,65,3000,7000,0,0,-1504.23,5007.75,-5.38562,2.6182,'2631:0 '),\n+(2633,'tero262',530,3703,3703,62,65,3000,7000,0,0,-1767.61,5061.37,7.70519,3.4303,'2631:0 2634:0 '),\n+(2634,'tero263',530,3703,3703,62,65,3000,7000,0,0,-1923.14,5054.44,19.4908,2.72737,'2633:0 2635:0 2636:0 2741:0 '),\n+(2635,'tero264',530,3519,3519,62,65,3000,7000,0,0,-1970.49,4974.82,28.2638,4.09397,'2634:0 2724:0 2741:0 '),\n+(2636,'tero265',530,3703,3703,62,65,3000,7000,0,0,-2043.23,5134.06,8.27497,5.68597,'2634:0 2637:0 2741:0 '),\n+(2637,'tero266',530,3519,3519,62,65,3000,7000,0,0,-2181.58,5096.17,-21.1362,0.23923,'2636:0 2638:0 2639:0 2640:0 2741:0 '),\n+(2638,'tero267',530,3519,3519,62,65,3000,7000,0,0,-2216.99,4909.63,1.39859,1.40554,'2637:0 2741:0 '),\n+(2639,'tero268',530,3519,3519,62,65,3000,7000,0,0,-2303.98,5268.43,-9.97572,5.28148,'2637:0 2640:0 2641:0 2644:0 '),\n+(2640,'tero269',530,3519,3682,62,65,3000,7000,0,0,-2344.61,5051.57,-2.04758,0.266708,'2639:0 2637:0 2644:0 '),\n+(2641,'tero270',530,3519,3677,62,65,3000,7000,0,0,-2431.44,5399.92,1.64547,5.51947,'2639:0 2642:0 '),\n+(2642,'tero271',530,3519,3519,62,65,3000,7000,0,0,-2521.64,5210.06,1.76945,1.04896,'2641:0 2643:0 2645:0 '),\n+(2643,'tero272',530,3519,3682,62,65,3000,7000,0,0,-2502.78,5113.56,7.96009,6.26007,'2642:0 2644:0 2645:0 '),\n+(2644,'tero273',530,3519,3519,62,65,3000,7000,0,0,-2359.81,5159.68,-3.26821,3.01403,'2643:0 2639:0 2640:0 '),\n+(2645,'tero274',530,3519,3519,62,65,3000,7000,0,0,-2640.66,5114.54,-2.29,3.12004,'2642:0 2643:0 2646:0 '),\n+(2646,'tero275',530,3519,3887,62,65,3000,7000,0,1,-2764.32,5083.04,-6.61069,4.7576,'2645:0 2647:0 2648:0 '),\n+(2647,'tero276',530,3519,3697,62,65,3000,7000,0,0,-2753.24,4900.43,-9.77721,1.5139,'2646:0 2648:0 2650:0 '),\n+(2648,'tero277',530,3519,3697,62,65,3000,7000,0,0,-2924.05,5077.7,-21.4831,6.27734,'2647:0 2646:0 2649:0 2650:0 '),\n+(2649,'tero278',530,3519,3697,62,65,3000,7000,0,0,-2988.38,5242.11,-18.2224,5.09376,'2648:0 2691:0 2693:0 '),\n+(2650,'tero279',530,3519,3697,62,65,3000,7000,0,0,-2927.67,4884.87,-20.3937,1.65765,'2647:0 2648:0 2651:0 '),\n+(2651,'tero280',530,3519,3891,62,65,3000,7000,0,0,-2833.33,4763.19,-3.82034,2.17758,'2650:0 2652:0 '),\n+(2652,'tero281',530,3519,3891,62,65,3000,7000,0,0,-2735.66,4761.53,-7.97762,3.14205,'2651:0 2653:0 '),\n+(2653,'tero282',530,3519,3697,62,65,3000,7000,0,0,-2927.04,4629.03,-20.1141,1.04898,'2652:0 2654:0 2655:0 2657:0 '),\n+(2654,'tero283',530,3519,3697,62,65,3000,7000,0,0,-2792.58,4548.65,-5.17792,2.36688,'2653:0 '),\n+(2655,'tero284',530,3519,3697,62,65,3000,7000,0,0,-3098.66,4626.88,-20.2418,0.186611,'2653:0 2656:0 2661:0 '),\n+(2656,'tero285',530,3519,3697,62,65,3000,7000,0,0,-3111.3,4451.66,-21.8624,1.72364,'2655:0 2657:0 '),\n+(2657,'tero286',530,3519,3697,62,65,3000,7000,0,0,-2978.71,4453.52,-19.1914,1.37334,'2656:0 2653:0 2658:0 2716:0 '),\n+(2658,'tero287',530,3519,3697,62,65,3000,7000,0,0,-3124.74,4312.73,-13.4977,1.36941,'2657:0 2659:0 2698:0 '),\n+(2659,'tero288',530,3519,3697,62,65,3000,7000,0,0,-3343.1,4318.47,-21.2101,0.0703571,'2658:0 2660:0 2662:0 2698:0 '),\n+(2660,'tero289',530,3519,3697,62,65,3000,7000,0,0,-3251.81,4540.47,-21.009,4.41204,'2659:0 2661:0 2663:0 '),\n+(2661,'tero290',530,3519,3688,62,65,3000,7000,0,0,-3251.45,4665.87,-22.0178,5.15817,'2660:0 2655:0 '),\n+(2662,'tero291',530,3519,3892,62,65,3000,7000,0,0,-3461.56,4373.44,-11.6911,5.77627,'2659:0 2663:0 2664:0 '),\n+(2663,'tero292',530,3519,3697,62,65,3000,7000,0,0,-3412.64,4543.05,-19.8323,4.37513,'2662:0 2660:0 2664:0 '),\n+(2664,'tero293',530,3519,3697,62,65,3000,7000,0,0,-3615.55,4423.5,-15.264,6.23338,'2662:0 2663:0 2665:0 2666:0 '),\n+(2665,'tero294',530,3519,3885,62,65,3000,7000,0,0,-3737.19,4335.92,3.0303,0.715952,'2664:0 2666:0 '),\n+(2666,'tero295',530,3519,3697,62,65,3000,7000,0,0,-3717.12,4553.09,-15.395,5.41343,'2664:0 2665:0 2667:0 '),\n+(2667,'tero296',530,3519,3886,62,65,3000,7000,0,0,-3751.58,4692.08,-17.1029,5.18959,'2666:0 2668:0 2671:0 '),\n+(2668,'tero297',530,3519,3688,62,65,3000,7000,0,0,-3628.23,4736.46,-22.1214,3.39967,'2667:0 2669:0 '),\n+(2669,'tero298',530,3519,3688,62,65,3000,7000,0,0,-3683.64,4880.37,-22.2453,4.85659,'2668:0 2670:0 '),\n+(2670,'tero299',530,3519,3697,62,65,3000,7000,0,0,-3787.46,5013.52,-20.1657,5.31998,'2669:0 2671:0 2672:0 '),\n+(2671,'tero300',530,3519,3697,62,65,3000,7000,0,0,-3875.72,4882.7,-35.8103,0.180317,'2670:0 2667:0 '),\n+(2672,'tero301',530,3519,3697,62,65,3000,7000,0,0,-3756.44,5163.25,-22.4721,4.73093,'2670:0 2674:0 2673:0 '),\n+(2673,'tero302',530,3519,3697,62,65,3000,7000,0,1,-3750.45,5404.46,-3.33481,1.38198,'2672:0 2674:0 2675:0 '),\n+(2674,'tero303',530,3519,3894,62,65,3000,7000,0,0,-3634.78,5300.46,-21.1377,3.63217,'2672:0 2675:0 2695:0 2673:0 '),\n+(2675,'tero304',530,3519,3697,62,65,3000,7000,0,0,-3670.35,5445.73,-4.16488,5.0239,'2674:0 2676:0 2695:0 2673:0 '),\n+(2676,'tero305',530,3519,3697,62,65,3000,7000,0,0,-3645.73,5559.5,-2.14497,4.56524,'2675:0 2677:0 '),\n+(2677,'tero306',530,3519,3686,62,65,3000,7000,0,0,-3642.69,5710.06,-2.77685,4.68385,'2676:0 2678:0 2679:0 '),\n+(2678,'tero307',530,3519,3519,62,65,3000,7000,0,0,-3501.7,5745.82,0.234953,3.52538,'2677:0 2684:0 '),\n+(2679,'tero308',530,3519,3519,62,65,3000,7000,0,0,-3733.98,5830.74,-2.74856,5.14723,'2677:0 2680:0 '),\n+(2680,'tero309',530,3519,3519,62,65,3000,7000,0,0,-3787.12,5986.43,-1.72887,4.96659,'2679:0 2681:0 '),\n+(2681,'tero310',530,3519,3519,62,65,3000,7000,0,0,-3628.51,6056.29,-3.33948,3.46806,'2680:0 2682:0 '),\n+(2682,'tero311',530,3519,3519,62,65,3000,7000,0,0,-3508.49,6174.6,4.08676,3.93145,'2681:0 2683:0 '),\n+(2683,'tero312',530,3519,3519,62,65,3000,7000,0,0,-3378.56,5998.98,-6.51004,2.27505,'2682:0 2684:0 2685:0 2696:0 '),\n+(2684,'tero313',530,3519,3519,62,65,3000,7000,0,0,-3476.42,5902.44,-30.7079,0.739594,'2683:0 2678:0 2685:0 '),\n+(2685,'tero314',530,3519,3519,62,65,3000,7000,0,0,-3285.32,5879.96,-19.0985,2.70702,'2684:0 2683:0 2686:0 2696:0 '),\n+(2686,'tero315',530,3519,3519,62,65,3000,7000,0,0,-3364.14,5789.3,-1.76223,1.10479,'2685:0 2687:0 2696:0 '),\n+(2687,'tero316',530,3519,3697,62,65,3000,7000,0,0,-3305.33,5740.49,0.884062,4.92025,'2686:0 2688:0 2696:0 '),\n+(2688,'tero317',530,3519,3697,62,65,3000,7000,0,0,-3286.23,5602.34,-6.97428,4.90454,'2687:0 2689:0 '),\n+(2689,'tero318',530,3519,3697,62,65,3000,7000,0,0,-3117.93,5582.45,-7.6733,6.23185,'2688:0 2690:0 2693:0 '),\n+(2690,'tero319',530,3519,3697,62,65,3000,7000,0,0,-2973.64,5517.8,-7.12772,5.62318,'2689:0 2691:0 2693:0 '),\n+(2691,'tero320',530,3519,3697,62,65,3000,7000,0,0,-2940.15,5358.09,-13.875,4.96972,'2690:0 2649:0 2692:0 2693:0 '),\n+(2692,'tero321',530,3519,3697,62,65,3000,7000,0,0,-2795.19,5341.13,-2.81699,5.23676,'2691:0 '),\n+(2693,'tero322',530,3519,3697,62,65,3000,7000,0,0,-3141.55,5381.37,-22.1389,0.524372,'2649:0 2689:0 2690:0 2691:0 2694:0 '),\n+(2694,'tero323',530,3519,3697,62,65,3000,7000,0,0,-3327.94,5329.47,-18.7903,0.115962,'2693:0 2695:0 '),\n+(2695,'tero324',530,3519,3697,62,65,3000,7000,0,0,-3499.7,5387.05,-17.1808,2.91198,'2694:0 2674:0 2675:0 '),\n+(2696,'tero325',530,3519,3519,62,65,3000,7000,0,0,-3184.45,5888,2.6866,3.28897,'2683:0 2685:0 2686:0 2687:0 2697:0 2777:0 '),\n+(2697,'tero326',530,3519,3519,62,65,3000,7000,0,0,-3032.12,5978.81,4.34466,3.72093,'2696:0 2777:0 '),\n+(2698,'tero327',530,3519,3697,62,65,3000,7000,0,0,-3134.88,4193.43,-7.28336,1.29796,'2658:0 2659:0 2699:0 '),\n+(2699,'tero328',530,3519,3697,62,65,3000,7000,0,0,-3028.19,4178.94,-0.0653765,2.95906,'2698:0 2700:0 '),\n+(2700,'tero329',530,3519,3519,62,65,3000,7000,0,0,-2977.23,4157.96,8.11812,3.04232,'2699:0 2701:0 '),\n+(2701,'tero330',530,3519,3684,62,65,3000,7000,0,3,-2960.39,4073.83,2.27582,5.22886,'2700:0 2702:0 '),\n+(2702,'tero331',530,3519,3684,62,65,3000,7000,0,3,-2931.59,3983.95,-0.908721,4.85187,'2701:0 2703:0 '),\n+(2703,'tero332',530,3519,3519,62,65,3000,7000,0,2,-2826.95,3982.66,1.7483,3.08078,'2702:0 2704:0 '),\n+(2704,'tero333',530,3519,3519,62,65,3000,7000,0,0,-2775.95,3939.94,2.93918,0.30046,'2703:0 2705:0 '),\n+(2705,'tero334',530,3519,3519,62,65,3000,7000,0,0,-2653.89,3959.73,4.49025,3.42242,'2704:0 2706:0 2745:0 '),\n+(2706,'tero335',530,3519,3519,62,65,3000,7000,0,0,-2556.49,4106.29,1.74147,4.38846,'2705:0 2707:0 2744:0 '),\n+(2707,'tero336',530,3519,3519,62,65,3000,7000,0,0,-2371.13,4150.23,2.76251,3.40672,'2706:0 2708:0 2717:0 '),\n+(2708,'tero337',530,3519,3519,62,65,3000,7000,0,0,-2284.4,4192.35,1.1876,3.57951,'2707:0 2709:0 2717:0 '),\n+(2709,'tero338',530,3519,3675,62,65,3000,7000,0,0,-2258.83,4242.98,1.82659,4.04289,'2708:0 2710:0 2717:0 '),\n+(2710,'tero339',530,3519,3519,62,65,3000,7000,0,0,-2454.44,4246.04,1.04828,6.28128,'2709:0 2711:0 '),\n+(2711,'tero340',530,3519,3519,62,65,3000,7000,0,4,-2553.08,4300.19,21.2595,5.70952,'2710:0 2712:0 '),\n+(2712,'tero341',530,3519,3683,62,65,3000,7000,0,5,-2594.46,4387.9,29.7655,5.39144,'2711:0 2713:0 '),\n+(2713,'tero342',530,3519,3683,62,65,3000,7000,0,5,-2656.03,4422.89,36.1553,5.66241,'2712:0 2714:0 '),\n+(2714,'tero343',530,3519,3683,62,65,3000,7000,0,4,-2719.28,4376.75,22.1052,0.28636,'2713:0 2715:0 '),\n+(2715,'tero344',530,3519,3697,62,65,3000,7000,0,0,-2834.82,4335.44,5.95973,3.39654,'2714:0 2716:0 '),\n+(2716,'tero345',530,3519,3697,62,65,3000,7000,0,0,-2909.54,4349.69,0.308415,2.08492,'2715:0 2657:0 '),\n+(2717,'tero346',530,3519,3675,62,65,3000,7000,0,0,-2170.52,4243.01,5.56803,3.39654,'2707:0 2708:0 2709:0 2718:0 2776:0 '),\n+(2718,'tero347',530,3519,3675,62,65,3000,7000,0,0,-2148.84,4189.65,7.46099,4.90842,'2717:0 2719:0 2720:0 2776:0 '),\n+(2719,'tero348',530,3519,3519,62,65,3000,7000,0,0,-2169.46,4024.43,0.27975,4.58248,'2718:0 2742:0 2747:0 '),\n+(2720,'tero349',530,3519,3675,62,65,3000,7000,0,0,-2043.89,4276.14,4.85305,3.85599,'2718:0 2721:0 2734:0 2776:0 '),\n+(2721,'tero350',530,3519,3519,62,65,3000,7000,0,0,-2003.56,4443.33,7.66134,1.22491,'2720:0 2722:0 2734:0 2739:0 2776:0 '),\n+(2722,'tero351',530,3519,3674,62,65,3000,7000,0,0,-1957.79,4600.09,4.55853,1.42126,'2721:0 2723:0 2731:0 2734:0 2739:0 '),\n+(2723,'tero352',530,3519,3674,62,65,3000,7000,0,0,-1958.96,4765.62,-1.86355,1.51943,'2722:0 2724:0 2739:0 2741:0 '),\n+(2724,'tero353',530,3519,3519,62,65,3000,7000,0,0,-1920.31,4893.8,2.58999,4.29189,'2723:0 2635:0 2725:0 2741:0 '),\n+(2725,'tero354',530,3519,3674,62,65,3000,7000,0,0,-1767.42,4808.53,10.9381,2.60326,'2724:0 2726:0 '),\n+(2726,'tero355',530,3519,3519,62,65,3000,7000,0,0,-1610.9,4687.94,-0.462587,3.37452,'2725:0 2727:0 '),\n+(2727,'tero356',530,3519,3519,62,65,3000,7000,0,0,-1438.54,4646.53,23.7191,3.09413,'2726:0 2728:0 '),\n+(2728,'tero357',530,3519,3689,62,65,3000,7000,0,0,-1505.3,4470.55,41.7643,1.30342,'2727:0 2729:0 2733:0 '),\n+(2729,'tero358',530,3519,3674,62,65,3000,7000,0,0,-1652.18,4568.13,2.67411,5.85088,'2728:0 2730:0 '),\n+(2730,'tero359',530,3519,3674,62,65,3000,7000,0,0,-1796.78,4588.16,10.9079,6.12577,'2729:0 2731:0 2732:0 2734:0 '),\n+(2731,'tero360',530,3519,3674,62,65,3000,7000,0,0,-1895.32,4551.89,11.162,0.506242,'2730:0 2722:0 2732:0 2734:0 2739:0 '),\n+(2732,'tero361',530,3519,3689,62,65,3000,7000,0,0,-1732.56,4448.64,2.34425,5.26889,'2731:0 2730:0 2733:0 2734:0 '),\n+(2733,'tero362',530,3519,3689,62,65,3000,7000,0,0,-1608.22,4353.23,36.5945,1.16519,'2732:0 2728:0 '),\n+(2734,'tero363',530,3519,3519,62,65,3000,7000,0,0,-1921.27,4373.25,1.92765,2.16501,'2720:0 2721:0 2722:0 2730:0 2731:0 2732:0 2735:0 2776:0 '),\n+(2735,'tero364',530,3519,3519,62,65,3000,7000,0,0,-1840.29,4219.11,25.1803,2.004,'2734:0 2736:0 2776:0 '),\n+(2736,'tero365',530,3519,3519,62,65,3000,7000,0,0,-1752.97,4184.94,57.0737,5.13381,'2735:0 2737:0 2776:0 '),\n+(2737,'tero366',530,3519,3858,62,65,3000,7000,0,0,-1716.88,4074.81,63.5817,4.67042,'2736:0 2738:0 '),\n+(2738,'tero367',530,3519,3858,62,65,3000,7000,0,0,-1691.82,3935.7,48.2267,4.84636,'2737:0 2419:0 '),\n+(2739,'tero368',530,3519,3519,62,65,3000,7000,0,0,-2102.76,4635.13,-7.65692,2.95747,'2721:0 2722:0 2723:0 2731:0 2740:0 '),\n+(2740,'tero369',530,3519,3519,62,65,3000,7000,0,0,-2257.36,4704.28,-0.0780256,1.2021,'2739:0 '),\n+(2741,'tero370',530,3519,3519,62,65,3000,7000,0,0,-2070.88,4924.17,13.5597,3.10277,'2634:0 2635:0 2636:0 2637:0 2638:0 2723:0 2724:0 '),\n+(2742,'tero371',530,3519,3519,62,65,3000,7000,0,0,-2246.8,3880.41,2.21742,1.23746,'2719:0 2743:0 2747:0 '),\n+(2743,'tero372',530,3519,3519,62,65,3000,7000,0,0,-2340.28,3972.87,-13.2572,5.73387,'2742:0 2744:0 2747:0 '),\n+(2744,'tero373',530,3519,3519,62,65,3000,7000,0,0,-2488.61,4019.54,0.242718,5.94199,'2743:0 2706:0 2746:0 '),\n+(2745,'tero374',530,3519,3860,62,65,3000,7000,0,0,-2554.91,3912.09,9.61175,2.80825,'2705:0 2746:0 '),\n+(2746,'tero375',530,3519,3860,62,65,3000,7000,0,0,-2485.03,3909.12,5.70774,1.75582,'2745:0 2744:0 '),\n+(2747,'tero376',530,3519,3519,62,65,3000,7000,0,0,-2259.61,3793.94,0.912792,1.33958,'2719:0 2742:0 2743:0 2748:0 2771:0 '),\n+(2748,'tero377',530,3519,3519,62,65,3000,7000,0,0,-2386.92,3640.31,1.09836,4.00208,'2747:0 2749:0 2758:0 '),\n+(2749,'tero378',530,3519,3519,62,65,3000,7000,0,0,-2479.53,3552.42,1.40969,5.89488,'2748:0 2750:0 2759:0 '),\n+(2750,'tero379',530,3519,3519,62,65,3000,7000,0,0,-2345.97,3468.35,-9.89249,2.70223,'2749:0 2751:0 2759:0 '),\n+(2751,'tero380',530,3519,3519,62,65,3000,7000,0,0,-2312.38,3409.64,-11.2993,4.48901,'2750:0 2752:0 '),\n+(2752,'tero381',530,3519,3681,62,65,3000,7000,0,0,-2354.51,3272.69,-1.60544,1.28851,'2751:0 2753:0 '),\n+(2753,'tero382',530,3519,3681,62,65,3000,7000,0,0,-2370.38,3203.41,-1.58182,4.34763,'2752:0 2754:0 2762:0 '),\n+(2754,'tero383',530,3519,3681,62,65,3000,7000,0,0,-2266.46,3160.45,-5.07597,2.81611,'2753:0 2755:0 '),\n+(2755,'tero384',530,3519,3519,62,65,3000,7000,0,0,-2151,3259.96,-30.9173,0.993986,'2754:0 2756:0 '),\n+(2756,'tero385',530,3519,3519,62,65,3000,7000,0,0,-2122.05,3416.4,-46.8967,4.54007,'2755:0 2757:0 2771:0 '),\n+(2757,'tero386',530,3519,3519,62,65,3000,7000,0,0,-2185.17,3533.98,-39.5174,5.06236,'2756:0 2758:0 2771:0 '),\n+(2758,'tero387',530,3519,3519,62,65,3000,7000,0,0,-2281.3,3632.39,-12.7757,5.10555,'2757:0 2748:0 2771:0 '),\n+(2759,'tero388',530,3519,3519,62,65,3000,7000,0,0,-2591.73,3492.79,0.37378,0.569874,'2749:0 2750:0 2760:0 '),\n+(2760,'tero389',530,3519,3519,62,65,3000,7000,0,0,-2706.59,3361.89,-0.445352,4.0649,'2759:0 2761:0 2763:0 2764:0 '),\n+(2761,'tero390',530,3519,3519,62,65,3000,7000,0,0,-2599.6,3260.29,1.92252,2.39202,'2760:0 2762:0 2763:0 '),\n+(2762,'tero391',530,3519,3519,62,65,3000,7000,0,0,-2474.91,3212.52,3.71098,0.644506,'2761:0 2753:0 '),\n+(2763,'tero392',530,3519,3519,62,65,3000,7000,0,0,-2789.26,3261.1,5.82088,0.813367,'2760:0 2761:0 3534:0 '),\n+(2764,'tero393',530,3519,3685,62,65,3000,7000,0,0,-2834.79,3413.38,-40.4077,5.88312,'2760:0 2765:0 2770:0 '),\n+(2765,'tero394',530,3519,3519,62,65,3000,7000,0,0,-2792.39,3494.53,-29.9885,3.12636,'2764:0 2766:0 '),\n+(2766,'tero395',530,3519,3685,62,65,3000,7000,0,0,-2893.22,3498.45,-28.8532,2.48233,'2765:0 2767:0 '),\n+(2767,'tero396',530,3519,3685,62,65,3000,7000,0,0,-2966.27,3553.99,-6.76611,5.48021,'2766:0 2768:0 '),\n+(2768,'tero397',530,3519,3685,62,65,3000,7000,0,0,-2986.16,3462.38,0.040144,1.25475,'2767:0 2769:0 '),\n+(2769,'tero398',530,3519,3685,62,65,3000,7000,0,0,-2966.04,3366.93,-1.18287,0.0020256,'2768:0 2770:0 '),\n+(2770,'tero399',530,3519,3519,62,65,3000,7000,0,0,-2877.47,3356.32,-19.7096,2.96298,'2769:0 2764:0 '),\n+(2771,'tero400',530,3519,3519,62,65,3000,7000,0,0,-2096.95,3654.03,-54.8181,4.15287,'2747:0 2756:0 2757:0 2758:0 2772:0 '),\n+(2772,'tero401',530,3519,3519,62,65,3000,7000,0,0,-2064.06,3807.53,1.04682,4.11754,'2771:0 2773:0 '),\n+(2773,'tero402',530,3519,3676,62,65,3000,7000,0,0,-1908.63,3920.4,-2.85436,0.610731,'2772:0 2774:0 2775:0 '),\n+(2774,'tero403',530,3519,3519,62,65,3000,7000,0,0,-1975.78,4077.99,-0.0257859,4.60841,'2773:0 2775:0 2776:0 '),\n+(2775,'tero404',530,3519,3676,62,65,3000,7000,0,0,-2060.38,3925.05,-0.749629,0.524347,'2774:0 2773:0 '),\n+(2776,'tero405',530,3519,3519,62,65,3000,7000,0,0,-1932.67,4229.67,0.0246133,4.45526,'2717:0 2718:0 2720:0 2721:0 2734:0 2735:0 2736:0 2774:0 '),\n+(2777,'nag406',530,3518,3788,62,65,3000,7000,0,0,-2979.16,5983.95,6.75645,5.87684,'2696:0 2697:0 2778:0 '),\n+(2778,'nag407',530,3518,3788,64,67,3000,7000,0,0,-2903.9,5958.93,14.5613,0.547909,'2777:0 2779:0 '),\n+(2779,'nag408',530,3518,3788,64,67,3000,7000,0,0,-2695.32,6074.17,39.2839,0.398684,'2778:0 2780:0 '),\n+(2780,'nag409',530,3518,3518,64,67,3000,7000,0,0,-2642.01,6196.52,35.4889,4.38459,'2779:0 2781:0 2784:0 '),\n+(2781,'nag410',530,3518,3610,64,67,3000,7000,0,0,-2584.26,6153,22.5432,1.45591,'2780:0 2782:0 2832:0 '),\n+(2782,'nag411',530,3518,3518,64,67,3000,7000,0,0,-2469.6,6354.46,29.3999,3.93692,'2781:0 2783:0 2802:0 2822:0 '),\n+(2783,'nag412',530,3518,3518,64,67,3000,7000,0,0,-2598.81,6353.52,38.4982,4.67519,'2782:0 2784:0 2802:0 '),\n+(2784,'nag413',530,3518,3518,64,67,3000,7000,0,0,-2647.16,6298.81,39.1645,4.36889,'2783:0 2780:0 2785:0 '),\n+(2785,'nag414',530,3518,3518,64,67,3000,7000,0,0,-2698.48,6403.1,37.6375,5.24131,'2784:0 2786:0 '),\n+(2786,'nag416',530,3518,3637,64,67,3000,7000,0,0,-2811.55,6437.45,63.1489,2.87099,'2787:0 2788:0 2792:0 2785:0 '),\n+(2787,'nag417',530,3518,3637,64,67,3000,7000,0,0,-2883.12,6557.15,51.9561,5.05205,'2786:0 2790:0 2793:0 '),\n+(2788,'nag418',530,3518,3637,64,67,3000,7000,0,0,-2866.92,6391.89,80.9253,0.732363,'2786:0 2789:0 '),\n+(2789,'nag419',530,3518,3637,64,67,3000,7000,0,0,-2947.68,6377.55,94.6931,0.234009,'2788:0 2790:0 2791:0 '),\n+(2790,'nag420',530,3518,3637,64,67,3000,7000,0,0,-2933.99,6526.24,74.3112,5.85317,'2787:0 2789:0 '),\n+(2791,'nag421',530,3518,3637,64,67,3000,7000,0,0,-2858.26,6300.73,73.5168,2.16181,'2789:0 2792:0 '),\n+(2792,'nag422',530,3518,3637,64,67,3000,7000,0,0,-2800.78,6320.06,63.9422,1.52171,'2791:0 2786:0 '),\n+(2793,'nag423',530,3518,3518,64,67,3000,7000,0,0,-2813.58,6624.23,27.952,0.826629,'2787:0 2794:0 2797:0 '),\n+(2794,'nag424',530,3518,3518,64,67,3000,7000,0,0,-2876.27,6701.94,18.9403,5.46206,'2793:0 2795:0 '),\n+(2795,'nag425',530,3518,3518,64,67,3000,7000,0,0,-2695.5,6579.52,23.3102,2.71395,'2794:0 2796:0 '),\n+(2796,'nag426',530,3518,3518,64,67,3000,7000,0,0,-2618.02,6729.9,-1.1338,4.0884,'2795:0 2797:0 '),\n+(2797,'nag427',530,3518,3518,64,67,3000,7000,0,0,-2762.9,6813.59,-4.67732,4.5989,'2793:0 2796:0 2798:0 2933:0 '),\n+(2798,'nag428',530,3518,3518,64,67,3000,7000,0,0,-2754.65,6993.51,-7.49834,4.92564,'2797:0 2799:0 2933:0 2934:0 '),\n+(2799,'nag429',530,3518,3518,64,67,3000,7000,0,0,-2554.45,7061.91,-8.95898,0.31535,'2798:0 2800:0 2803:0 '),\n+(2800,'nag430',530,3518,3518,64,67,3000,7000,0,0,-2401.18,6918.47,-1.9365,5.18482,'2799:0 2801:0 2803:0 2814:0 2825:0 '),\n+(2801,'nag431',530,3518,3518,64,67,3000,7000,0,0,-2443.4,6718.82,0.5495,4.75286,'2800:0 2802:0 2824:0 '),\n+(2802,'nag432',530,3518,3518,64,67,3000,7000,0,0,-2465.96,6485.46,18.388,4.48583,'2801:0 2782:0 2783:0 '),\n+(2803,'nag433',530,3518,3518,64,67,3000,7000,0,0,-2495.17,7067.29,-6.61379,5.16519,'2799:0 2800:0 2804:0 2814:0 '),\n+(2804,'nag434',530,3518,3518,64,67,3000,7000,0,2,-2545.1,7142.88,17.2089,5.26259,'2803:0 2805:0 '),\n+(2805,'nag435',530,3518,3626,64,67,3000,7000,0,3,-2587.61,7240.05,13.2805,5.09373,'2804:0 2806:0 2807:0 '),\n+(2806,'nag436',530,3518,3626,64,67,3000,7000,0,2,-2552.46,7299.13,13.4929,4.96416,'2805:0 2809:0 '),\n+(2807,'nag437',530,3518,3626,64,67,3000,7000,0,2,-2670.89,7210.11,23.8723,0.310654,'2805:0 2808:0 '),\n+(2808,'nag438',530,3518,3626,64,67,3000,7000,0,3,-2655.58,7280.08,30.7964,4.57931,'2807:0 '),\n+(2809,'nag439',530,3518,3626,64,67,3000,7000,0,2,-2487.77,7333.59,-15.1601,0.389211,'2806:0 2810:0 '),\n+(2810,'nag440',530,3518,3518,64,67,3000,7000,0,2,-2287.49,7419.75,-15.9035,3.46169,'2809:0 2811:0 2867:0 '),\n+(2811,'nag441',530,3518,3518,64,67,3000,7000,0,0,-2167.73,7320.37,-34.5989,5.71198,'2810:0 2866:0 2812:0 '),\n+(2812,'nag443',530,3518,3705,64,67,3000,7000,0,0,-2271.92,7267.29,-57.0529,4.8127,'2813:0 2811:0 '),\n+(2813,'nag444',530,3518,3705,64,67,3000,7000,0,0,-2261.19,7161.5,-56.5907,4.81663,'2814:0 2815:0 2812:0 '),\n+(2814,'nag445',530,3518,3518,64,67,3000,7000,0,0,-2347.48,7041.26,-12.5344,2.817,'2813:0 2800:0 2803:0 '),\n+(2815,'nag447',530,3518,3705,64,67,3000,7000,0,0,-2116.24,7209.42,-112.779,5.97431,'2813:0 2816:0 '),\n+(2816,'nag448',530,3518,3705,64,67,3000,7000,0,0,-1904.26,7175.34,-92.9691,3.12725,'2817:0 2815:0 '),\n+(2817,'nag449',530,3518,3705,64,67,3000,7000,0,0,-1985.26,6900.65,-85.609,5.34993,'2816:0 2818:0 '),\n+(2818,'nag450',530,3518,3518,64,67,3000,7000,0,0,-1848.57,6696.54,-53.151,5.40883,'2817:0 2819:0 2826:0 '),\n+(2819,'nag451',530,3518,3518,64,67,3000,7000,0,0,-1730.63,6547.09,19.5667,5.00434,'2818:0 2820:0 2826:0 2839:0 2843:0 '),\n+(2820,'nag452',530,3518,3518,64,67,3000,7000,0,0,-1929.46,6510.46,16.1863,2.96231,'2819:0 2821:0 2839:0 2928:0 '),\n+(2821,'nag453',530,3518,3638,64,67,3000,7000,0,0,-2134.61,6517.76,14.0285,6.16673,'2820:0 2822:0 2823:0 2839:0 '),\n+(2822,'nag454',530,3518,3518,64,67,3000,7000,0,0,-2312.35,6407.62,22.8307,0.6603,'2821:0 2782:0 2823:0 '),\n+(2823,'nag455',530,3518,3518,64,67,3000,7000,0,0,-2275.72,6586.73,3.55526,5.16535,'2822:0 2821:0 2824:0 2831:0 '),\n+(2824,'nag456',530,3518,3518,64,67,3000,7000,0,0,-2337.25,6706.87,-0.736603,5.08052,'2823:0 2801:0 '),\n+(2825,'nag457',530,3518,3518,64,67,3000,7000,0,0,-2230.6,6874.1,-6.45156,5.78973,'2800:0 '),\n+(2826,'nag458',530,3518,3518,64,67,3000,7000,0,0,-1596.41,6719.35,6.94102,2.95446,'2819:0 2818:0 2827:0 2843:0 '),\n+(2827,'nag459',530,3518,3518,64,67,3000,7000,0,0,-1749.49,6887.02,-31.8672,3.0919,'2826:0 2828:0 2856:0 '),\n+(2828,'nag460',530,3518,3705,64,67,3000,7000,0,0,-2033.22,6893.42,-39.0869,0.112087,'2827:0 2829:0 '),\n+(2829,'nag461',530,3518,3638,64,67,3000,7000,0,0,-2099.87,6812.26,-29.9742,0.936751,'2828:0 2830:0 '),\n+(2830,'nag462',530,3518,3638,64,67,3000,7000,0,0,-2097.69,6747.79,-3.22856,3.89457,'2829:0 2831:0 '),\n+(2831,'nag463',530,3518,3638,64,67,3000,7000,0,0,-2181.79,6690.97,-0.800369,0.623385,'2830:0 2823:0 '),\n+(2832,'nag464',530,3518,3610,64,67,3000,7000,0,0,-2569.73,6270.11,18.4891,5.91894,'2781:0 2833:0 '),\n+(2833,'nag465',530,3518,3610,64,67,3000,7000,0,0,-2480.31,6262.64,30.7263,5.11194,'2832:0 2834:0 '),\n+(2834,'nag466',530,3518,3610,64,67,3000,7000,0,0,-2447.6,6170.75,50.9756,3.42333,'2833:0 2835:0 '),\n+(2835,'nag467',530,3518,3610,64,67,3000,7000,0,0,-2505.35,6175.86,59.938,5.6892,'2834:0 2836:0 '),\n+(2836,'nag468',530,3518,3610,64,67,3000,7000,0,0,-2439.68,6122.93,84.0967,2.43372,'2835:0 2837:0 '),\n+(2837,'nag469',530,3518,3610,64,67,3000,7000,0,0,-2332.91,6161.97,53.5534,0.177271,'2836:0 2838:0 '),\n+(2838,'nag470',530,3518,3610,64,67,3000,7000,0,0,-2259.12,6100.84,76.839,2.48242,'2837:0 '),\n+(2839,'nag471',530,3518,3518,64,67,3000,7000,0,0,-1938.01,6408.13,38.4565,3.95504,'2819:0 2820:0 2821:0 2840:0 2928:0 '),\n+(2840,'nag472',530,3518,3518,64,67,3000,7000,0,0,-2080.87,6349.27,43.0054,5.9188,'2839:0 2841:0 2928:0 '),\n+(2841,'nag473',530,3518,3634,64,67,3000,7000,0,0,-1853.87,6319.73,46.4678,2.96543,'2840:0 2842:0 2928:0 '),\n+(2842,'nag474',530,3518,3518,64,67,3000,7000,0,0,-1699.25,6393.14,40.5718,0.499271,'2841:0 2843:0 2927:0 '),\n+(2843,'nag475',530,3518,3518,64,67,3000,7000,0,0,-1534.13,6557.83,19.5951,2.01038,'2826:0 2842:0 2819:0 2844:0 2927:0 '),\n+(2844,'nag476',530,3518,3518,64,67,3000,7000,0,0,-1482.81,6727.6,24.7441,1.27603,'2843:0 2845:0 '),\n+(2845,'nag477',530,3518,3518,64,67,3000,7000,0,0,-1390.93,6854.77,28.5326,0.624149,'2844:0 2856:0 2853:0 '),\n+(2846,'nag480',530,3518,3613,64,67,3000,7000,0,4,-1409.34,7112.02,33.814,1.09183,'2847:0 2853:0 '),\n+(2847,'nag481',530,3518,3613,64,67,3000,7000,0,5,-1329.62,7212.68,33.1588,0.853479,'2846:0 2848:0 2855:0 '),\n+(2848,'nag482',530,3518,3613,64,67,3000,7000,0,4,-1270.74,7314.59,33.6816,4.21027,'2847:0 2849:0 '),\n+(2849,'nag483',530,3518,3613,64,67,3000,7000,0,4,-1220.36,7373.07,33.23,4.20635,'2848:0 2850:0 2851:0 '),\n+(2850,'nag484',530,3518,3518,64,67,3000,7000,0,0,-1212.08,7477.88,22.0868,1.54857,'2849:0 2862:0 2926:0 '),\n+(2851,'nag485',530,3518,3613,64,67,3000,7000,0,4,-1182.14,7317.1,34.1095,4.44589,'2849:0 2852:0 '),\n+(2852,'nag486',530,3518,3613,64,67,3000,7000,0,4,-1195.71,7212.96,50.7515,1.47708,'2851:0 2854:0 '),\n+(2853,'nag487',530,3518,3613,64,67,3000,7000,0,4,-1266.65,6971.73,37.8915,2.73527,'2845:0 2846:0 2854:0 '),\n+(2854,'nag488',530,3518,3613,64,67,3000,7000,0,5,-1222.4,7167.59,57.2656,4.44744,'2852:0 2855:0 2853:0 '),\n+(2855,'nag489',530,3518,3613,64,67,3000,7000,0,4,-1276.87,7200.65,48.3758,5.06006,'2847:0 2854:0 '),\n+(2856,'nag491',530,3518,3518,64,67,3000,7000,0,0,-1550.75,6994.79,2.3684,5.6216,'2845:0 2827:0 2857:0 '),\n+(2857,'nag492',530,3518,3518,64,67,3000,7000,0,0,-1663.57,7019.01,0.239528,1.55716,'2856:0 2858:0 2864:0 '),\n+(2858,'nag493',530,3518,3518,64,67,3000,7000,0,0,-1624.79,7247.01,1.99533,4.52597,'2857:0 2859:0 2864:0 '),\n+(2859,'nag494',530,3518,3518,64,67,3000,7000,0,0,-1561.04,7386.09,1.02012,0.650024,'2858:0 2860:0 2863:0 '),\n+(2860,'nag495',530,3518,3518,64,67,3000,7000,0,0,-1369.87,7525.98,8.40119,6.06534,'2859:0 2861:0 2968:0 '),\n+(2861,'nag496',530,3518,3628,64,67,3000,7000,0,0,-1342.35,7749.72,-4.85434,4.51025,'2860:0 2862:0 2959:0 '),\n+(2862,'nag497',530,3518,3518,64,67,3000,7000,0,0,-1244.21,7675,9.34848,4.90297,'2861:0 2850:0 2919:0 '),\n+(2863,'nag498',530,3518,3518,64,67,3000,7000,0,0,-1822.25,7460.83,-6.36199,6.02215,'2859:0 2864:0 2971:0 '),\n+(2864,'nag499',530,3518,3518,64,67,3000,7000,0,0,-1788.32,7255.55,-7.10964,1.73702,'2863:0 2858:0 2857:0 2865:0 '),\n+(2865,'nag500',530,3518,3518,64,67,3000,7000,0,0,-1876.28,7247.82,-15.0226,2.58134,'2864:0 2866:0 '),\n+(2866,'nag501',530,3518,3518,64,67,3000,7000,0,0,-2010.2,7318.56,-33.8028,5.83525,'2865:0 2811:0 '),\n+(2867,'nag502',530,3518,3518,64,67,3000,7000,0,0,-2284.88,7613.96,-8.38883,4.91632,'2810:0 2868:0 2869:0 2882:0 '),\n+(2868,'nag503',530,3518,3518,64,67,3000,7000,0,0,-2110.77,7507.01,-30.9661,2.75255,'2867:0 '),\n+(2869,'nag504',530,3518,3518,64,67,3000,7000,0,0,-2280.53,7760.34,-25.2768,3.08634,'2867:0 2870:0 2882:0 2953:0 '),\n+(2870,'nag505',530,3518,3631,64,67,3000,7000,0,0,-2202.48,7982.31,-19.9501,4.31156,'2869:0 2871:0 2884:0 2953:0 '),\n+(2871,'nag506',530,3518,3518,64,67,3000,7000,0,0,-2164.5,8163.38,-23.2432,1.37024,'2870:0 2872:0 2884:0 2949:0 '),\n+(2872,'nag507',530,3518,3518,64,67,3000,7000,0,0,-2186.27,8355.19,-20.7293,1.74723,'2871:0 2873:0 2885:0 2949:0 '),\n+(2873,'nag508',530,3518,3518,64,67,3000,7000,0,0,-2261.53,8552.19,-18.4527,1.93573,'2872:0 2874:0 2885:0 2886:0 2887:0 '),\n+(2874,'nag509',530,3518,3631,64,67,3000,7000,0,0,-2454.9,8618.3,-25.5244,2.80359,'2873:0 2875:0 2886:0 '),\n+(2875,'nag510',530,3518,3518,64,67,3000,7000,0,0,-2638.28,8663.06,-21.4046,2.94104,'2874:0 2876:0 2886:0 '),\n+(2876,'nag511',530,3518,3631,64,67,3000,7000,0,0,-2824.97,8623.37,-27.21,4.0995,'2875:0 2877:0 '),\n+(2877,'nag512',530,3518,3518,64,67,3000,7000,0,0,-2867.65,8450.08,-30.1391,4.44507,'2876:0 2878:0 '),\n+(2878,'nag513',530,3518,3631,64,67,3000,7000,0,0,-2899.04,8250.79,-34.7269,4.57858,'2877:0 2879:0 '),\n+(2879,'nag514',530,3518,3518,64,67,3000,7000,0,0,-2888.4,8048.68,-26.7216,5.47001,'2878:0 2880:0 '),\n+(2880,'nag515',530,3518,3518,64,67,3000,7000,0,0,-2777.53,7867.47,-33.0086,5.33648,'2879:0 2881:0 2938:0 '),\n+(2881,'nag516',530,3518,3518,64,67,3000,7000,0,0,-2646.42,7719.28,-30.5333,5.53675,'2880:0 2882:0 2883:0 2938:0 '),\n+(2882,'nag517',530,3518,3518,64,67,3000,7000,0,0,-2469.37,7698.03,-17.5014,0.0114679,'2869:0 2881:0 2867:0 2883:0 '),\n+(2883,'nag518',530,3518,3631,64,67,3000,7000,0,0,-2548.6,7872.59,-53.4948,1.39927,'2882:0 2881:0 2884:0 '),\n+(2884,'nag519',530,3518,3631,64,67,3000,7000,0,0,-2377.16,8119.54,-42.3084,5.94673,'2883:0 2870:0 2871:0 2885:0 '),\n+(2885,'nag520',530,3518,3631,64,67,3000,7000,0,0,-2383.8,8337.19,-39.2254,0.68063,'2884:0 2872:0 2873:0 2886:0 '),\n+(2886,'nag521',530,3518,3631,64,67,3000,7000,0,0,-2489.29,8499.84,-36.8544,3.07375,'2885:0 2874:0 2873:0 2875:0 '),\n+(2887,'nag522',530,3518,3518,64,67,3000,7000,0,0,-2206.87,8693.03,-3.10935,4.27148,'2873:0 2888:0 2939:0 '),\n+(2888,'nag523',530,3518,3518,64,67,3000,7000,0,1,-2042.46,8705.35,18.0019,0.174061,'2887:0 2889:0 '),\n+(2889,'nag524',530,3518,3518,64,67,3000,7000,0,0,-1841.7,8722.11,25.2892,5.96245,'2888:0 2890:0 '),\n+(2890,'nag525',530,3518,3518,64,67,3000,7000,0,0,-1640.31,8750.19,32.1406,6.19414,'2889:0 2891:0 2913:0 2941:0 '),\n+(2891,'nag526',530,3518,3518,64,67,3000,7000,0,0,-1515.41,8730.96,27.2727,5.36163,'2890:0 2892:0 2913:0 2894:0 '),\n+(2892,'nag527',530,3518,3518,64,67,3000,7000,0,0,-1371.92,8548.95,11.8041,3.728,'2891:0 2893:0 2898:0 2904:0 '),\n+(2893,'nag528',530,3518,3622,64,67,3000,7000,0,0,-1460.34,8490.57,4.09139,0.714427,'2892:0 2897:0 2965:0 '),\n+(2894,'nag530',530,3518,3622,64,67,3000,7000,0,0,-1570.36,8600.16,4.98091,3.67147,'2891:0 2895:0 2897:0 '),\n+(2895,'nag531',530,3518,3622,64,67,3000,7000,0,0,-1642.07,8541.56,-12.6482,5.37185,'2896:0 2894:0 '),\n+(2896,'nag532',530,3518,3622,64,67,3000,7000,0,0,-1595.85,8476.21,-11.7076,0.541643,'2895:0 2897:0 '),\n+(2897,'nag533',530,3518,3622,64,67,3000,7000,0,0,-1526.1,8519.38,1.01318,3.57721,'2896:0 2893:0 2894:0 '),\n+(2898,'nag534',530,3518,3518,64,67,3000,7000,0,0,-1207.6,8431.13,20.2568,5.9334,'2892:0 2899:0 2904:0 '),\n+(2899,'nag535',530,3518,3518,64,67,3000,7000,0,0,-1095.6,8405.41,20.4451,5.79204,'2898:0 2900:0 2904:0 '),\n+(2900,'nag536',530,3518,3518,64,67,3000,7000,0,0,-953.793,8333.32,22.8678,0.0193606,'2899:0 2901:0 2916:0 '),\n+(2901,'nag537',530,3518,3518,64,67,3000,7000,0,0,-745.188,8393.11,33.9484,0.313885,'2900:0 2902:0 '),\n+(2902,'nag538',530,3518,3763,64,67,3000,7000,0,0,-588.034,8447.14,64.625,6.12976,'2901:0 2903:0 '),\n+(2903,'nag539',530,3518,3763,64,67,3000,7000,0,0,-494.831,8433.32,38.1295,6.07479,'2902:0 2539:0 '),\n+(2904,'nag540',530,3518,3518,64,67,3000,7000,0,0,-1168.9,8591.89,36.759,1.21709,'2892:0 2898:0 2899:0 2905:0 2915:0 '),\n+(2905,'nag541',530,3518,3617,64,67,3000,7000,0,0,-1067.77,8749.39,84.4276,1.60586,'2904:0 2906:0 '),\n+(2906,'nag542',530,3518,3617,64,67,3000,7000,0,0,-1080.66,8823.02,100.874,1.41736,'2905:0 2907:0 '),\n+(2907,'nag543',530,3518,3617,64,67,3000,7000,0,0,-1090.98,8945.42,103.447,0.588767,'2906:0 2908:0 '),\n+(2908,'nag544',530,3518,3617,64,67,3000,7000,0,0,-963.69,8887.28,146.6,3.44055,'2907:0 2909:0 '),\n+(2909,'nag545',530,3518,3617,64,67,3000,7000,0,0,-868.709,8940.17,156.257,5.74571,'2908:0 2910:0 '),\n+(2910,'nag546',530,3518,3617,64,67,3000,7000,0,0,-752.326,8861.16,182.978,4.2134,'2909:0 2911:0 2912:0 '),\n+(2911,'nag547',530,3518,3617,64,67,3000,7000,0,0,-651.777,8791,201.252,0.180777,'2910:0 '),\n+(2912,'nag553',530,3518,3617,64,67,3000,7000,0,0,-902.893,8685.38,170.054,1.29602,'2910:0 '),\n+(2913,'nag554',530,3518,3625,64,67,3000,7000,0,0,-1431.81,8885.86,36.9729,1.07333,'2890:0 2891:0 2914:0 2948:0 '),\n+(2914,'nag555',530,3518,3625,64,67,3000,7000,0,0,-1305.49,8958.42,58.5828,5.24728,'2913:0 2915:0 '),\n+(2915,'nag556',530,3518,3518,64,67,3000,7000,0,0,-1225.12,8803.57,39.6271,4.88207,'2914:0 2904:0 '),\n+(2916,'nag557',530,3518,3518,64,67,3000,7000,0,0,-968.504,8169.97,14.3663,5.25514,'2900:0 2917:0 '),\n+(2917,'nag558',530,3518,3518,64,67,3000,7000,0,0,-917.128,8072.21,21.4411,5.19624,'2916:0 2918:0 2920:0 '),\n+(2918,'nag559',530,3518,3518,64,67,3000,7000,0,0,-1020.93,7945.51,22.9619,4.026,'2917:0 2919:0 2920:0 '),\n+(2919,'nag560',530,3518,3518,64,67,3000,7000,0,0,-1146.56,7828.51,14.0417,4.1548,'2918:0 2862:0 '),\n+(2920,'nag561',530,3518,3616,64,67,3000,7000,0,0,-852.563,7887.28,40.6401,4.6339,'2917:0 2918:0 2921:0 '),\n+(2921,'nag562',530,3518,3616,64,67,3000,7000,0,0,-830.358,7797.91,38.3027,4.69279,'2920:0 2922:0 '),\n+(2922,'nag563',530,3518,3616,64,67,3000,7000,0,0,-829.954,7695.84,37.7371,5.2465,'2921:0 2923:0 '),\n+(2923,'nag564',530,3518,3616,64,67,3000,7000,0,0,-783.358,7540.05,60.9113,5.00303,'2922:0 2924:0 '),\n+(2924,'nag565',530,3518,3518,64,67,3000,7000,0,0,-763.166,7451.73,58.8323,4.56714,'2923:0 2925:0 '),\n+(2925,'nag566',530,3518,3518,64,67,3000,7000,0,0,-933.691,7394.83,34.4282,3.14949,'2924:0 2926:0 '),\n+(2926,'nag567',530,3518,3518,64,67,3000,7000,0,0,-1090.44,7395.57,33.0234,2.48583,'2925:0 2850:0 '),\n+(2927,'nag568',530,3518,3518,64,67,3000,7000,0,1,-1409.72,6385.4,38.2999,5.37255,'2625:0 2842:0 2843:0 '),\n+(2928,'nag569',530,3518,3634,64,67,3000,7000,0,0,-2075.76,6274.62,62.3128,0.289453,'2820:0 2839:0 2840:0 2841:0 2929:0 '),\n+(2929,'nag571',530,3518,3518,64,67,3000,7000,0,0,-2094.97,6179.79,87.9183,1.00219,'2928:0 2930:0 '),\n+(2930,'nag572',530,3518,3761,64,67,3000,7000,0,0,-2030.06,6071.21,119.672,4.93705,'2931:0 2929:0 '),\n+(2931,'nag573',530,3518,3761,64,67,3000,7000,0,0,-2001.22,5972.22,151.597,6.26043,'2930:0 2932:0 '),\n+(2932,'nag574',530,3518,3761,64,67,3000,7000,0,0,-1946.52,5928.39,150.948,1.91915,'2931:0 '),\n+(2933,'nag575',530,3518,3518,64,67,3000,7000,0,0,-2897.91,6988.92,-35.6052,0.23407,'2797:0 2798:0 2934:0 '),\n+(2934,'nag576',530,3518,3518,64,67,3000,7000,0,0,-2847.89,7102.5,-8.05767,2.77876,'2933:0 2798:0 2935:0 '),\n+(2935,'nag577',530,3518,3518,64,67,3000,7000,0,0,-2912.74,7175.13,-2.27885,1.70277,'2934:0 2936:0 '),\n+(2936,'nag578',530,3518,3518,64,67,3000,7000,0,0,-2935.1,7301.43,3.27707,1.53784,'2935:0 2937:0 '),\n+(2937,'nag579',530,3518,3518,64,67,3000,7000,0,0,-2902.48,7467.17,2.79586,1.43181,'2936:0 2938:0 '),\n+(2938,'nag580',530,3518,3518,64,67,3000,7000,0,0,-2802.19,7645.35,-6.45531,0.870248,'2937:0 2880:0 2881:0 '),\n+(2939,'nag581',530,3518,3633,64,67,3000,7000,0,0,-2196.09,8827.81,16.1506,4.59461,'2887:0 2940:0 '),\n+(2940,'nag582',530,3518,3633,64,67,3000,7000,0,0,-2071.65,8894.1,28.0157,0.506613,'2939:0 2941:0 '),\n+(2941,'nag583',530,3518,3518,64,67,3000,7000,0,0,-1884.01,8889.41,36.2099,5.7138,'2890:0 2940:0 2942:0 '),\n+(2942,'nag584',530,3518,3518,64,67,3000,7000,0,0,-1916.54,9091.13,52.9111,1.74753,'2941:0 2943:0 '),\n+(2943,'nag585',530,3518,3624,64,67,3000,7000,0,0,-1849.22,9237.75,70.9999,5.57243,'2942:0 2944:0 '),\n+(2944,'nag586',530,3518,3624,64,67,3000,7000,0,0,-1755.41,9160.76,79.5049,5.59599,'2943:0 2945:0 '),\n+(2945,'nag587',530,3518,3518,64,67,3000,7000,0,0,-1651.3,9137.62,86.3008,5.99261,'2944:0 2946:0 '),\n+(2946,'nag588',530,3518,3518,64,67,3000,7000,0,0,-1545.69,9099.13,82.8122,5.48996,'2945:0 2947:0 '),\n+(2947,'nag589',530,3518,3625,64,67,3000,7000,0,0,-1448.69,9002.9,57.299,5.25434,'2946:0 2948:0 '),\n+(2948,'nag590',530,3518,3625,64,67,3000,7000,0,0,-1419.87,8948.03,58.9144,6.12613,'2947:0 2913:0 '),\n+(2949,'nag591',530,3518,3518,64,67,3000,7000,0,0,-2052.37,8225.22,-6.54776,2.94922,'2871:0 2872:0 2950:0 '),\n+(2950,'nag592',530,3518,3518,64,67,3000,7000,0,0,-1986.35,8210.53,0.797534,4.84989,'2949:0 2951:0 2954:0 '),\n+(2951,'nag593',530,3518,3518,64,67,3000,7000,0,0,-2024.61,8154.98,1.25254,4.1077,'2950:0 2952:0 '),\n+(2952,'nag594',530,3518,3518,64,67,3000,7000,0,0,-2103.83,8063.36,2.18912,4.10771,'2951:0 2953:0 '),\n+(2953,'nag595',530,3518,3518,64,67,3000,7000,0,0,-2156.48,7911.49,-11.2008,4.37866,'2952:0 2870:0 2869:0 '),\n+(2954,'nag596',530,3518,3628,64,67,3000,7000,0,0,-1840.26,7999.74,-24.7446,2.3484,'2950:0 2955:0 '),\n+(2955,'nag597',530,3518,3628,64,67,3000,7000,0,0,-1746.01,7996.18,-27.0075,3.06865,'2954:0 2956:0 '),\n+(2956,'nag598',530,3518,3628,64,67,3000,7000,0,0,-1653.08,7993.42,-26.6535,6.25344,'2955:0 2960:0 '),\n+(2957,'nag600',530,3518,3628,64,67,3000,7000,0,0,-1550.22,7929.2,-21.6393,6.03352,'2958:0 2960:0 '),\n+(2958,'nag601',530,3518,3628,64,67,3000,7000,0,0,-1483.84,7905.42,-19.2864,5.65261,'2957:0 2959:0 '),\n+(2959,'nag602',530,3518,3628,64,67,3000,7000,0,0,-1404.2,7842.35,-18.1886,5.40914,'2958:0 2861:0 '),\n+(2960,'nag603',530,3518,3628,64,67,3000,7000,0,0,-1554.58,7990.68,-21.1856,3.99937,'2956:0 2957:0 2961:0 2962:0 '),\n+(2961,'nag604',530,3518,3628,64,67,3000,7000,0,0,-1601.1,7865.59,-22.0744,4.70386,'2966:0 2960:0 '),\n+(2962,'nag605',530,3518,3628,64,67,3000,7000,0,0,-1478.18,8079.45,-21.4921,0.88839,'2963:0 2960:0 '),\n+(2963,'nag606',530,3518,3518,64,67,3000,7000,0,0,-1517.43,8229.34,-15.3084,1.82694,'2962:0 2964:0 '),\n+(2964,'nag607',530,3518,3622,64,67,3000,7000,0,0,-1508.91,8347.15,-12.1475,1.98089,'2963:0 2965:0 '),\n+(2965,'nag608',530,3518,3622,64,67,3000,7000,0,0,-1502.91,8432.5,-0.939562,0.853047,'2964:0 2893:0 '),\n+(2966,'nag609',530,3518,3628,64,67,3000,7000,0,0,-1604.12,7762.81,-21.7436,1.48608,'2961:0 2967:0 2969:0 '),\n+(2967,'nag610',530,3518,3518,64,67,3000,7000,0,0,-1587.52,7621.15,-10.2326,4.91826,'2966:0 2968:0 2969:0 '),\n+(2968,'nag611',530,3518,3518,64,67,3000,7000,0,0,-1475.29,7596.72,-5.21911,5.69972,'2967:0 2860:0 2969:0 '),\n+(2969,'nag612',530,3518,3628,64,67,3000,7000,0,0,-1647.6,7686.9,-14.3996,0.653543,'2967:0 2968:0 2966:0 2970:0 '),\n+(2970,'nag613',530,3518,3518,64,67,3000,7000,0,0,-1703.41,7669.14,-14.3192,3.85013,'2969:0 2971:0 '),\n+(2971,'nag614',530,3518,3518,64,67,3000,7000,0,0,-1781.28,7605.53,-8.7957,3.82657,'2970:0 2863:0 '),\n+(2972,'zang615',530,3521,3521,64,67,3000,7000,0,0,794.211,5932.33,57.6977,1.47191,'2601:0 2602:0 2624:0 2973:0 '),\n+(2973,'zang616',530,3521,3521,64,67,3000,7000,0,0,820.771,6049.46,79.8283,4.84129,'2972:0 2974:0 '),\n+(2974,'bedg617',530,3522,3767,65,70,3000,7000,0,0,882.952,5919.73,115.632,0.505885,'2973:0 2975:0 '),\n+(2975,'bedg618',530,3522,3767,65,70,3000,7000,0,0,942.091,5960.21,121.279,0.600133,'2974:0 2976:0 '),\n+(2976,'bedg619',530,3522,3522,65,70,3000,7000,0,0,1067.62,6060.89,132.716,0.256129,'2975:0 2977:0 '),\n+(2977,'bedg620',530,3522,3522,65,70,3000,7000,0,0,1132.44,6081.19,153.605,5.97461,'2976:0 2978:0 '),\n+(2978,'bedg621',530,3522,3522,65,70,3000,7000,0,0,1202.41,6057.05,164.269,5.95105,'2977:0 2979:0 '),\n+(2979,'bedg622',530,3522,3522,65,70,3000,7000,0,0,1278.35,5993.43,168.127,5.58584,'2978:0 2980:0 '),\n+(2980,'bedg623',530,3522,3522,65,70,3000,7000,0,0,1406.14,6036.86,152.292,0.476827,'2979:0 2981:0 '),\n+(2981,'bedg624',530,3522,3522,65,70,3000,7000,0,0,1466.01,6069.6,133.93,6.17882,'2980:0 2982:0 '),\n+(2982,'bedg625',530,3522,3522,65,70,3000,7000,0,0,1591.09,6047.48,128.651,6.21023,'2981:0 2983:0 '),\n+(2983,'bedg626',530,3522,3768,65,70,3000,7000,0,0,1713.44,6043.35,143.923,6.2495,'2982:0 2984:0 3003:0 '),\n+(2984,'bedg627',530,3522,3768,65,70,3000,7000,0,0,1762.72,5869.71,155.631,4.98895,'2983:0 2985:0 3003:0 '),\n+(2985,'bedg628',530,3522,3833,65,70,3000,7000,0,0,1802.41,5792.15,188.129,6.12384,'2984:0 2986:0 '),\n+(2986,'bedg629',530,3522,3833,65,70,3000,7000,0,0,1865.39,5786.05,215.307,4.78866,'2985:0 2987:0 '),\n+(2987,'bedg631',530,3522,3833,65,70,3000,7000,0,0,1882.59,5668.18,256.167,1.82379,'2988:0 2991:0 2986:0 '),\n+(2988,'bedg632',530,3522,3833,65,70,3000,7000,0,0,2046.5,5630.87,263.828,6.03743,'2987:0 2989:0 2990:0 2991:0 2994:0 '),\n+(2989,'bedg633',530,3522,3922,65,70,3000,7000,0,0,2186.78,5679.45,267.903,1.53317,'2988:0 3190:0 '),\n+(2990,'bedg634',530,3522,3833,65,70,3000,7000,0,0,2078.91,5730.76,265.935,3.74408,'2988:0 2991:0 '),\n+(2991,'bedg635',530,3522,3833,65,70,3000,7000,0,0,1986.76,5663.91,265.451,5.29919,'2990:0 2988:0 2987:0 2992:0 '),\n+(2992,'bedg636',530,3522,3918,65,70,3000,7000,0,0,1882.53,5595.86,256.211,0.429695,'2991:0 2993:0 '),\n+(2993,'bedg637',530,3522,3918,65,70,3000,7000,0,3,1913.85,5539.89,265.641,4.76903,'2992:0 2994:0 '),\n+(2994,'bedg638',530,3522,3918,65,70,3000,7000,0,3,1980.47,5572.14,258.131,2.97243,'2993:0 2988:0 2995:0 '),\n+(2995,'bedg639',530,3522,3833,65,70,3000,7000,0,0,1818.29,5603,261.471,3.82655,'2994:0 2996:0 3002:0 '),\n+(2996,'bedg640',530,3522,3918,65,70,3000,7000,0,0,1800.72,5550.99,267.48,2.61311,'2995:0 2997:0 3001:0 '),\n+(2997,'bedg641',530,3522,3919,65,70,3000,7000,0,0,1708.89,5566.11,265.641,3.36316,'2996:0 3001:0 3189:0 '),\n+(2998,'bedg643',530,3522,3919,65,70,3000,7000,0,0,1564.28,5423.88,265.088,1.83317,'2999:0 3189:0 '),\n+(2999,'bedg644',530,3522,3919,65,70,3000,7000,0,0,1534.04,5541.59,258.021,1.3761,'2998:0 3000:0 '),\n+(3000,'bedg645',530,3522,3919,65,70,3000,7000,0,0,1599.86,5605.47,266.783,0.413989,'2999:0 3001:0 '),\n+(3001,'bedg646',530,3522,3919,65,70,3000,7000,0,0,1692.34,5649.63,265.597,5.29918,'3000:0 2997:0 2996:0 3002:0 '),\n+(3002,'bedg647',530,3522,3919,65,70,3000,7000,0,0,1775.77,5678.9,267.502,5.25597,'2995:0 3001:0 '),\n+(3003,'bedg648',530,3522,3768,65,70,3000,7000,0,0,1827.31,6004.38,138.57,2.3814,'2983:0 2984:0 3004:0 '),\n+(3004,'bedg649',530,3522,3768,65,70,3000,7000,0,0,1934.89,5992.25,140.661,0.472881,'3003:0 3005:0 3041:0 '),\n+(3005,'bedg650',530,3522,3768,65,70,3000,7000,0,0,2035.37,6038.3,145.555,3.92079,'3004:0 3006:0 3041:0 '),\n+(3006,'bedg651',530,3522,3768,65,70,3000,7000,0,0,2098.1,5939.59,137.134,5.31486,'3005:0 3007:0 3041:0 '),\n+(3007,'bedg652',530,3522,3831,65,70,3000,7000,0,0,2140.78,5883.29,138.074,5.36983,'3006:0 3008:0 '),\n+(3008,'bedg653',530,3522,3831,65,70,3000,7000,0,0,2169.87,5811.41,120.231,1.97692,'3007:0 3009:0 '),\n+(3009,'bedg654',530,3522,3831,65,70,3000,7000,0,0,2156.44,5731.77,120.753,4.55303,'3008:0 3010:0 '),\n+(3010,'bedg655',530,3522,3831,65,70,3000,7000,0,0,2209.5,5671.79,127.813,5.09887,'3009:0 3011:0 '),\n+(3011,'bedg656',530,3522,3831,65,70,3000,7000,0,0,2242.52,5586.84,144.63,4.98106,'3010:0 3012:0 '),\n+(3012,'bedg657',530,3522,3831,65,70,3000,7000,0,0,2242.64,5516.54,161.969,4.74938,'3011:0 3013:0 '),\n+(3013,'bedg658',530,3522,3831,65,70,3000,7000,0,0,2266.32,5460.89,147.107,3.73228,'3012:0 3014:0 3015:0 '),\n+(3014,'bedg659',530,3522,3831,65,70,3000,7000,0,0,2243.22,5409.52,144.241,3.16286,'3015:0 3013:0 '),\n+(3015,'bedg660',530,3522,3831,65,70,3000,7000,0,0,2184.26,5427.04,144.314,3.26496,'3014:0 3016:0 3013:0 '),\n+(3016,'bedg661',530,3522,3831,65,70,3000,7000,0,0,2056.91,5452.67,144.871,3.87757,'3015:0 3017:0 '),\n+(3017,'bedg662',530,3522,3831,65,70,3000,7000,0,0,1986.16,5372.79,148.912,3.58305,'3016:0 3018:0 '),\n+(3018,'bedg663',530,3522,3831,65,70,3000,7000,0,0,1869.19,5342.55,144.553,3.39455,'3017:0 3019:0 '),\n+(3019,'bedg664',530,3522,3831,65,70,3000,7000,0,0,1844.86,5256.68,138.071,1.36038,'3018:0 3020:0 '),\n+(3020,'bedg666',530,3522,3831,65,70,3000,7000,0,0,1882.44,5202,150.044,6.2809,'3019:0 3021:0 '),\n+(3021,'bedg668',530,3522,3831,65,70,3000,7000,0,0,1942.47,5157.81,163.104,1.47426,'3020:0 3022:0 '),\n+(3022,'bedg670',530,3522,3831,65,70,3000,7000,0,0,1859.25,5091.18,146.37,4.69048,'3021:0 3023:0 '),\n+(3023,'bedg672',530,3522,3831,65,70,3000,7000,0,0,1892.19,4998.98,146.563,5.3777,'3024:0 3022:0 '),\n+(3024,'bedg673',530,3522,3827,65,70,3000,7000,0,0,1882.75,4918.05,144.661,4.59623,'3023:0 3025:0 3033:0 '),\n+(3025,'bedg674',530,3522,3827,65,70,3000,7000,0,0,1970.05,4876.31,143.046,5.83716,'3024:0 3026:0 3032:0 '),\n+(3026,'bedg675',530,3522,3844,65,70,3000,7000,0,0,2066.28,4886.71,148.962,0.107673,'3025:0 3027:0 '),\n+(3027,'bedg676',530,3522,3844,65,70,3000,7000,0,0,2113.18,4914.06,149.085,6.14739,'3026:0 3028:0 '),\n+(3028,'bedg677',530,3522,3827,65,70,3000,7000,0,0,2197.61,4955.01,153.824,2.65786,'3027:0 3029:0 3186:0 '),\n+(3029,'bedg678',530,3522,3844,65,70,3000,7000,0,5,2122.42,4767.11,145.442,4.39595,'3028:0 3030:0 3031:0 '),\n+(3030,'bedg679',530,3522,3844,65,70,3000,7000,0,5,2051.79,4712.94,149.377,4.14775,'3029:0 '),\n+(3031,'bedg680',530,3522,3844,65,70,3000,7000,0,4,2045.43,4756.7,142.832,3.24454,'3029:0 3032:0 '),\n+(3032,'bedg681',530,3522,3827,65,70,3000,7000,0,0,1924.25,4753.97,143.374,3.15815,'3031:0 3025:0 3033:0 '),\n+(3033,'bedg682',530,3522,3827,65,70,3000,7000,0,0,1818.76,4741.32,143.599,3.17386,'3032:0 3034:0 3035:0 3024:0 '),\n+(3034,'bedg683',530,3522,3783,65,70,3000,7000,0,0,1763.5,4636.75,148.572,2.17246,'3035:0 3033:0 '),\n+(3035,'bedg684',530,3522,3827,65,70,3000,7000,0,0,1721.08,4751.46,141.246,2.47877,'3034:0 3036:0 3033:0 '),\n+(3036,'bedg685',530,3522,3827,65,70,3000,7000,0,0,1671.81,4805.51,144.067,1.15537,'3035:0 3037:0 '),\n+(3037,'bedg686',530,3522,3827,65,70,3000,7000,0,0,1716.64,4889.56,168.716,1.08076,'3036:0 3038:0 '),\n+(3038,'bedg690',530,3522,3779,65,70,3000,7000,0,0,1764.57,5020.59,169.786,2.98533,'3037:0 3039:0 '),\n+(3039,'bedg691',530,3522,3779,65,70,3000,7000,0,0,1689.52,5029.67,171.17,6.17405,'3040:0 3038:0 '),\n+(3040,'bedg692',530,3522,3779,65,70,3000,7000,0,0,1644.1,5086.59,174.824,5.08627,'3039:0 '),\n+(3041,'bedg693',530,3522,3768,65,70,3000,7000,0,0,2051.36,6085.99,147.268,1.58417,'3004:0 3005:0 3006:0 3042:0 3048:0 '),\n+(3042,'bedg694',530,3522,3768,65,70,3000,7000,0,0,2163.29,6091.67,144.685,6.16931,'3041:0 3043:0 3047:0 '),\n+(3043,'bedg695',530,3522,3769,65,70,3000,7000,0,5,2276.18,6049.52,143.141,5.80411,'3042:0 3044:0 '),\n+(3044,'bedg696',530,3522,3769,65,70,3000,7000,0,4,2338.36,6031.21,142.438,2.8196,'3043:0 3045:0 '),\n+(3045,'bedg697',530,3522,3769,65,70,3000,7000,0,5,2384.95,6054.49,138.162,1.60222,'3044:0 3046:0 '),\n+(3046,'bedg698',530,3522,3768,65,70,3000,7000,0,0,2372.13,6149.95,128.725,3.20443,'3045:0 3047:0 3114:0 '),\n+(3047,'bedg699',530,3522,3768,65,70,3000,7000,0,0,2265.65,6155.81,138.179,3.41256,'3046:0 3042:0 '),\n+(3048,'bedg700',530,3522,3768,65,70,3000,7000,0,0,2028.28,6216.03,134.538,4.67706,'3041:0 3049:0 '),\n+(3049,'bedg701',530,3522,3771,65,70,3000,7000,0,0,2041.4,6592.18,135.807,3.54607,'3048:0 3050:0 3056:0 '),\n+(3050,'bedg702',530,3522,3772,65,70,3000,7000,0,3,2066.72,6735.02,154.854,4.59066,'3049:0 3051:0 3055:0 '),\n+(3051,'bedg703',530,3522,3772,65,70,3000,7000,0,2,1972.28,6779.92,162.128,1.46478,'3050:0 3052:0 '),\n+(3052,'bedg704',530,3522,3772,65,70,3000,7000,0,2,1959.55,6842.15,158.876,3.29476,'3051:0 3053:0 3059:0 '),\n+(3053,'bedg705',530,3522,3772,65,70,3000,7000,0,3,2065.72,6849.09,172.562,0.0589211,'3052:0 3054:0 '),\n+(3054,'bedg706',530,3522,3772,65,70,3000,7000,0,2,2135.82,6829.36,173.431,4.65351,'3053:0 3055:0 '),\n+(3055,'bedg707',530,3522,3772,65,70,3000,7000,0,2,2140.28,6753.83,165.006,3.40472,'3054:0 3050:0 '),\n+(3056,'bedg708',530,3522,3771,65,70,3000,7000,0,0,1952.24,6615.86,143.542,5.85751,'3049:0 3057:0 3058:0 '),\n+(3057,'bedg709',530,3522,3771,65,70,3000,7000,0,0,1869.68,6608.28,143.783,2.00906,'3056:0 3058:0 '),\n+(3058,'bedg710',530,3522,3771,65,70,3000,7000,0,0,1867.3,6714.18,142.554,2.81017,'3056:0 3057:0 3059:0 '),\n+(3059,'bedg711',530,3522,3771,65,70,3000,7000,0,0,1794.79,6806.46,137.334,0.147653,'3058:0 3052:0 3060:0 3079:0 '),\n+(3060,'bedg712',530,3522,3782,65,70,3000,7000,0,0,1698.35,6823.85,136.031,2.50777,'3059:0 3061:0 3066:0 3067:0 '),\n+(3061,'bedg713',530,3522,3782,65,70,3000,7000,0,0,1660.38,6861.71,142.107,2.01886,'3060:0 3062:0 '),\n+(3062,'bedg714',530,3522,3782,65,70,3000,7000,0,0,1628.86,6909.46,152.556,2.54312,'3061:0 3063:0 '),\n+(3063,'bedg715',530,3522,3782,65,70,3000,7000,0,0,1565.97,6934.47,157.679,0.579622,'3062:0 3064:0 '),\n+(3064,'bedg716',530,3522,3782,65,70,3000,7000,0,0,1642.57,6995.64,157.952,6.01458,'3063:0 3065:0 '),\n+(3065,'bedg717',530,3522,3782,65,70,3000,7000,0,0,1706.57,6967.44,152.552,5.15456,'3064:0 3066:0 '),\n+(3066,'bedg718',530,3522,3782,65,70,3000,7000,0,0,1749.11,6892.32,140.635,4.05192,'3065:0 3060:0 '),\n+(3067,'bedg719',530,3522,3782,65,70,3000,7000,0,0,1636.12,6812.12,131.714,0.187751,'3060:0 3068:0 3078:0 '),\n+(3068,'bedg720',530,3522,3782,65,70,3000,7000,0,0,1569.95,6826.69,128.23,3.23117,'3067:0 3069:0 '),\n+(3069,'bedg721',530,3522,3522,65,70,3000,7000,0,0,1487.42,6820.82,107.218,2.83454,'3068:0 3070:0 '),\n+(3070,'bedg722',530,3522,3522,65,70,3000,7000,0,0,1418.63,6847.18,110.541,2.77564,'3069:0 3071:0 '),\n+(3071,'bedg723',530,3522,3522,65,70,3000,7000,0,0,1357.84,6881.95,95.233,5.88189,'3070:0 3072:0 '),\n+(3072,'bedg724',530,3522,3522,65,70,3000,7000,0,0,1305.01,6962.51,93.0961,3.03875,'3071:0 3073:0 '),\n+(3073,'bedg725',530,3522,3522,65,70,3000,7000,0,0,1224.71,6978.54,90.3881,2.59893,'3072:0 3074:0 '),\n+(3074,'bedg726',530,3522,3522,65,70,3000,7000,0,0,1145.67,7048.89,113.579,2.41436,'3073:0 3075:0 '),\n+(3075,'bedg727',530,3522,3522,65,70,3000,7000,0,2,1107.87,7095.02,122.35,3.18012,'3074:0 3076:0 '),\n+(3076,'bedg728',530,3522,3770,65,70,3000,7000,0,2,1053.11,7098.72,116.217,0.376251,'3075:0 3077:0 '),\n+(3077,'bedg729',530,3522,3770,65,70,3000,7000,0,2,1020.4,7173.65,86.2439,1.66823,'3076:0 2582:0 '),\n+(3078,'bedg730',530,3522,3824,65,70,3000,7000,0,0,1647.1,6732.39,116.704,4.75248,'3067:0 3079:0 '),\n+(3079,'bedg731',530,3522,3771,65,70,3000,7000,0,0,1740.86,6736.89,134.249,0.774434,'3078:0 3059:0 3080:0 '),\n+(3080,'bedg732',530,3522,3824,65,70,3000,7000,0,0,1628.32,6690.04,108.29,6.13869,'3079:0 3081:0 '),\n+(3081,'bedg733',530,3522,3824,65,70,3000,7000,0,0,1723.61,6678.08,87.8644,5.8481,'3080:0 3082:0 '),\n+(3082,'bedg734',530,3522,3824,65,70,3000,7000,0,0,1772.91,6642.19,74.5483,2.51408,'3081:0 3083:0 '),\n+(3083,'bedg735',530,3522,3824,65,70,3000,7000,0,0,1619.66,6621.4,33.3376,3.64899,'3082:0 3084:0 '),\n+(3084,'bedg736',530,3522,3824,65,70,3000,7000,0,0,1761.7,6532.98,4.13407,5.72636,'3083:0 3085:0 3217:0 '),\n+(3085,'bedg737',530,3522,3824,65,70,3000,7000,0,0,1936.85,6455.82,1.98027,5.87558,'3084:0 3086:0 3215:0 '),\n+(3086,'bedg738',530,3522,3824,65,70,3000,7000,0,0,2158.79,6394.21,-10.3376,6.01302,'3085:0 3087:0 '),\n+(3087,'bedg739',530,3522,3931,65,70,3000,7000,0,0,2352.32,6410.86,-10.3378,0.246553,'3086:0 3088:0 3090:0 '),\n+(3088,'bedg740',530,3522,3773,65,70,3000,7000,0,0,2401.13,6465.38,3.57212,0.140524,'3087:0 3089:0 '),\n+(3089,'bedg741',530,3522,3773,65,70,3000,7000,0,0,2489.83,6479,-6.94094,0.898433,'3088:0 3090:0 3091:0 '),\n+(3090,'bedg742',530,3522,3931,65,70,3000,7000,0,0,2486.13,6407.7,-10.338,3.05435,'3089:0 3087:0 3097:0 '),\n+(3091,'bedg743',530,3522,3773,65,70,3000,7000,0,0,2546.35,6560.09,1.844,4.13898,'3089:0 3092:0 3093:0 3094:0 3096:0 '),\n+(3092,'bedg744',530,3522,3773,65,70,3000,7000,0,0,2667.31,6519.19,0.94932,5.95717,'3091:0 '),\n+(3093,'bedg745',530,3522,3773,65,70,3000,7000,0,0,2613.6,6682.32,23.1547,1.02881,'3091:0 3096:0 '),\n+(3094,'bedg746',530,3522,3773,65,70,3000,7000,0,0,2376.02,6637.4,10.9828,6.02394,'3091:0 3095:0 '),\n+(3095,'bedg747',530,3522,3773,65,70,3000,7000,0,0,2482.22,6684.55,0.72676,5.48987,'3094:0 3096:0 '),\n+(3096,'bedg748',530,3522,3773,65,70,3000,7000,0,0,2570.07,6610.1,7.6561,4.0683,'3095:0 3091:0 3093:0 '),\n+(3097,'bedg749',530,3522,3931,65,70,3000,7000,0,0,2625.59,6357.13,-10.3379,0.0313585,'3090:0 3098:0 3104:0 '),\n+(3098,'bedg750',530,3522,3862,65,70,3000,7000,0,0,2747.24,6390.91,2.251,5.27782,'3097:0 3099:0 '),\n+(3099,'bedg751',530,3522,3862,65,70,3000,7000,0,0,2871.51,6233.27,11.692,5.37992,'3098:0 3100:0 3104:0 '),\n+(3100,'bedg752',530,3522,3862,65,70,3000,7000,0,0,2980.33,6146.77,4.99801,5.25426,'3099:0 3101:0 '),\n+(3101,'bedg753',530,3522,3826,65,70,3000,7000,0,0,3036.46,6073.22,0.772358,5.36224,'3100:0 3102:0 '),\n+(3102,'bedg754',530,3522,3826,65,70,3000,7000,0,0,3098.88,6022.32,1.18446,4.5042,'3101:0 3103:0 '),\n+(3103,'bedg755',530,3522,3826,65,70,3000,7000,0,0,3081.27,5967.39,-10.3385,2.55249,'3102:0 3104:0 3108:0 '),\n+(3104,'bedg756',530,3522,3825,65,70,3000,7000,0,0,2759.83,6108.29,-10.3396,6.08285,'3099:0 3103:0 3097:0 3105:0 3111:0 '),\n+(3105,'bedg757',530,3522,3825,65,70,3000,7000,0,1,2685.12,5895.26,-16.1123,4.71862,'3104:0 3106:0 '),\n+(3106,'bedg758',530,3522,3825,65,70,3000,7000,0,0,2687.78,5785.12,-16.8636,4.73433,'3105:0 3107:0 '),\n+(3107,'bedg759',530,3522,3904,65,70,3000,7000,0,0,2695.75,5583.37,-10.6374,4.75001,'3106:0 '),\n+(3108,'bedg760',530,3522,3826,65,70,3000,7000,0,0,3126.83,5854.78,-10.3341,5.52444,'3103:0 3109:0 3110:0 '),\n+(3109,'bedg761',530,3522,3826,65,70,3000,7000,0,0,3287.4,5738.99,-10.3325,5.79933,'3108:0 3110:0 3115:0 '),\n+(3110,'bedg762',530,3522,3826,65,70,3000,7000,0,0,3281.88,5854.49,-1.4584,3.21929,'3109:0 3108:0 3115:0 '),\n+(3111,'bedg763',530,3522,3825,65,70,3000,7000,0,0,2582.1,6136.86,24.0804,4.49162,'3104:0 3112:0 '),\n+(3112,'bedg765',530,3522,3825,65,70,3000,7000,0,0,2521.32,6015.69,84.9349,2.22967,'3111:0 3113:0 '),\n+(3113,'bedg767',530,3522,3768,65,70,3000,7000,0,0,2494.15,6124.82,111.3,1.62492,'3114:0 3112:0 '),\n+(3114,'bedg768',530,3522,3768,65,70,3000,7000,0,0,2427.5,6152.5,122.621,2.74804,'3113:0 3046:0 '),\n+(3115,'bedg769',530,3522,3826,65,70,3000,7000,0,0,3383.33,5729.17,-10.3389,3.41014,'3109:0 3110:0 3116:0 3117:0 3126:0 '),\n+(3116,'bedg770',530,3522,3777,65,70,3000,7000,0,0,3452.63,5809.98,1.12407,0.865436,'3115:0 3118:0 '),\n+(3117,'bedg771',530,3522,3826,65,70,3000,7000,0,0,3520,5691.54,-10.3386,6.05377,'3115:0 3118:0 '),\n+(3118,'bedg772',530,3522,3777,65,70,3000,7000,0,0,3523.18,5795.46,1.6669,1.53041,'3117:0 3116:0 3119:0 '),\n+(3119,'bedg773',530,3522,3826,65,70,3000,7000,0,0,3589.57,5684.17,-10.2714,6.25066,'3118:0 3120:0 '),\n+(3120,'bedg774',530,3522,3774,65,70,3000,7000,0,0,3660.48,5491.29,-20.7025,5.0647,'3119:0 3125:0 '),\n+(3121,'bedg775',530,3522,3774,65,70,3000,7000,0,0,3641.58,5308.33,-20.5148,5.3867,'3122:0 3125:0 '),\n+(3122,'bedg776',530,3522,3774,65,70,3000,7000,0,0,3587.11,5221.49,14.2925,1.80371,'3123:0 3121:0 '),\n+(3123,'bedg777',530,3522,3774,65,70,3000,7000,0,0,3438.2,5241.29,-6.61032,0.307527,'3122:0 '),\n+(3124,'bedg779',530,3522,3774,65,70,3000,7000,0,0,3593.15,5382.62,-9.51038,0.0970404,'3125:0 '),\n+(3125,'bedg780',530,3522,3774,65,70,3000,7000,0,0,3651.06,5374.99,-20.2357,1.49502,'3124:0 3120:0 3121:0 '),\n+(3126,'bedg781',530,3522,3826,65,70,3000,7000,0,0,3233.27,5636.21,38.3515,5.69295,'3115:0 3127:0 '),\n+(3127,'bedg782',530,3522,3826,65,70,3000,7000,0,0,3303.69,5597.03,55.3332,6.0071,'3126:0 3128:0 '),\n+(3128,'bedg783',530,3522,3826,65,70,3000,7000,0,0,3374.58,5579.62,85.0975,4.19284,'3127:0 3129:0 '),\n+(3129,'bedg784',530,3522,3828,65,70,3000,7000,0,0,3306.73,5468.57,141.818,6.03852,'3128:0 3130:0 3133:0 '),\n+(3130,'bedg785',530,3522,3828,65,70,3000,7000,0,0,3389.48,5461.86,145.745,4.75047,'3129:0 3131:0 '),\n+(3131,'bedg786',530,3522,3829,65,70,3000,7000,0,0,3363.88,5342.13,147.792,3.91795,'3130:0 3132:0 '),\n+(3132,'bedg787',530,3522,3829,65,70,3000,7000,0,0,3286,5287.73,147.247,2.3825,'3131:0 3133:0 3136:0 '),\n+(3133,'bedg788',530,3522,3828,65,70,3000,7000,0,0,3187.06,5468.2,146.95,2.07226,'3132:0 3129:0 3134:0 '),\n+(3134,'bedg789',530,3522,3828,65,70,3000,7000,0,0,3116.13,5482.01,145.293,4.71905,'3133:0 3135:0 3137:0 '),\n+(3135,'bedg790',530,3522,3829,65,70,3000,7000,0,0,3130.15,5332.98,148.604,4.94682,'3134:0 3136:0 '),\n+(3136,'bedg791',530,3522,3829,65,70,3000,7000,0,0,3215.6,5360.26,142.29,5.42984,'3135:0 3132:0 '),\n+(3137,'bedg792',530,3522,3828,65,70,3000,7000,0,0,2956.95,5583.27,146.351,5.04498,'3134:0 3138:0 3140:0 '),\n+(3138,'bedg793',530,3522,3952,65,70,3000,7000,0,0,2952.85,5779.65,134.692,1.27116,'3137:0 3139:0 '),\n+(3139,'bedg794',530,3522,3952,65,70,3000,7000,0,0,3050.1,5991.54,130.725,1.20636,'3138:0 3192:0 '),\n+(3140,'bedg795',530,3522,3951,65,70,3000,7000,0,1,2949.59,5525.69,144.16,2.62095,'3137:0 3141:0 '),\n+(3141,'bedg796',530,3522,3828,65,70,3000,7000,0,0,2915.37,5365.92,147.713,1.64902,'3140:0 3142:0 '),\n+(3142,'bedg797',530,3522,3867,65,70,3000,7000,0,0,2973.41,5294.89,183.643,6.14688,'3141:0 3143:0 '),\n+(3143,'bedg798',530,3522,3867,65,70,3000,7000,0,0,3038.23,5281.8,219.214,4.54468,'3142:0 3144:0 '),\n+(3144,'bedg799',530,3522,3867,65,70,3000,7000,0,0,3021.8,5214.18,250.296,5.00414,'3143:0 3145:0 '),\n+(3145,'bedg800',530,3522,3867,65,70,3000,7000,0,0,3082.54,5063.01,264.326,4.87847,'3144:0 3146:0 3165:0 3166:0 '),\n+(3146,'bedg801',530,3522,3867,65,70,3000,7000,0,0,3099.95,4980.23,265.505,6.22935,'3145:0 3147:0 3172:0 3175:0 '),\n+(3147,'bedg802',530,3522,3867,65,70,3000,7000,0,0,3304.97,4970.79,264.838,5.68742,'3146:0 3148:0 3164:0 '),\n+(3148,'bedg803',530,3522,3867,65,70,3000,7000,0,0,3434.24,4937.21,262.546,5.47143,'3147:0 3149:0 3163:0 3164:0 '),\n+(3149,'bedg804',530,3522,3867,65,70,3000,7000,0,0,3574.68,4758.04,240.131,5.37718,'3148:0 3150:0 3156:0 '),\n+(3150,'bedg805',530,3522,3863,65,70,3000,7000,0,0,3564.29,4641.89,228.617,3.77105,'3149:0 3151:0 '),\n+(3151,'bedg806',530,3522,3863,65,70,3000,7000,0,0,3459.92,4594.26,206.487,3.08147,'3150:0 3152:0 3153:0 '),\n+(3152,'bedg807',530,3522,3962,65,70,3000,7000,0,0,3346.24,4594.8,221.66,2.70055,'3151:0 '),\n+(3153,'bedg808',530,3522,3863,65,70,3000,7000,0,0,3393.49,4543.75,179.957,4.49519,'3151:0 3154:0 '),\n+(3154,'bedg809',530,3522,3863,65,70,3000,7000,0,0,3360.85,4462.38,157.372,4.73472,'3153:0 3155:0 3223:0 '),\n+(3155,'bedg810',530,3522,3863,65,70,3000,7000,0,0,3368.28,4367.62,122.375,1.75021,'3154:0 3223:0 '),\n+(3156,'bedg811',530,3522,3866,65,70,3000,7000,0,0,3701.21,4770.37,244.343,1.75806,'3149:0 3157:0 '),\n+(3157,'bedg812',530,3522,3866,65,70,3000,7000,0,0,3761.47,4802.74,254.61,1.73842,'3156:0 3158:0 '),\n+(3158,'bedg813',530,3522,3866,65,70,3000,7000,0,0,3738.29,4879.52,256.491,2.75944,'3157:0 3159:0 '),\n+(3159,'bedg814',530,3522,3866,65,70,3000,7000,0,0,3668.47,4898.18,260.046,1.56956,'3158:0 3160:0 '),\n+(3160,'bedg815',530,3522,3866,65,70,3000,7000,0,0,3668.33,5008.48,266.738,4.7465,'3159:0 3161:0 3162:0 '),\n+(3161,'bedg816',530,3522,3866,65,70,3000,7000,0,0,3732.68,5010.06,273.797,4.86824,'3160:0 '),\n+(3162,'bedg817',530,3522,3866,65,70,3000,7000,0,0,3581.65,5022.38,265.138,6.01885,'3160:0 3163:0 '),\n+(3163,'bedg818',530,3522,3866,65,70,3000,7000,0,0,3523.16,4984.99,269.146,3.77261,'3162:0 3148:0 '),\n+(3164,'bedg819',530,3522,3867,65,70,3000,7000,0,0,3312.28,5066.6,254.195,4.73865,'3147:0 3148:0 3165:0 '),\n+(3165,'bedg820',530,3522,3867,65,70,3000,7000,0,0,3243.07,5149.71,260.466,2.97621,'3164:0 3145:0 '),\n+(3166,'bedg821',530,3522,3942,65,70,3000,7000,0,0,2961.39,5151.76,265.026,5.66383,'3145:0 3167:0 3171:0 '),\n+(3167,'bedg822',530,3522,3942,65,70,3000,7000,0,0,2940.58,5217.19,264.835,2.79713,'3166:0 3168:0 '),\n+(3168,'bedg823',530,3522,3942,65,70,3000,7000,0,0,2844.64,5234.99,267.298,3.70426,'3167:0 3169:0 '),\n+(3169,'bedg824',530,3522,3942,65,70,3000,7000,0,0,2724.25,5157.06,265.076,3.71605,'3168:0 3170:0 3176:0 '),\n+(3170,'bedg825',530,3522,3867,65,70,3000,7000,0,0,2816.5,5099.67,265.683,5.72666,'3169:0 3171:0 '),\n+(3171,'bedg826',530,3522,3867,65,70,3000,7000,0,0,2900.18,5096.37,265.127,0.775502,'3166:0 3170:0 3172:0 3175:0 '),\n+(3172,'bedg827',530,3522,3787,65,70,3000,7000,0,0,2929.12,4947.5,266.731,4.91062,'3146:0 3171:0 3173:0 3175:0 '),\n+(3173,'bedg828',530,3522,3787,65,70,3000,7000,0,0,2898.72,4782.92,277.957,4.52971,'3172:0 3174:0 '),\n+(3174,'bedg829',530,3522,3787,65,70,3000,7000,0,0,2984.26,4824.35,278.892,1.56875,'3173:0 3175:0 '),\n+(3175,'bedg830',530,3522,3787,65,70,3000,7000,0,0,2852.35,4933.54,267.974,6.12327,'3174:0 3172:0 3146:0 3171:0 '),\n+(3176,'bedg831',530,3522,3833,65,70,3000,7000,0,0,2545.57,5293.37,266.598,6.1005,'3169:0 3177:0 3191:0 '),\n+(3177,'bedg832',530,3522,3833,65,70,3000,7000,0,0,2456.71,5321.66,264.923,2.73899,'3176:0 3178:0 3184:0 3191:0 '),\n+(3178,'bedg833',530,3522,3833,65,70,3000,7000,0,0,2282.88,5171.44,264.676,3.69325,'3177:0 3179:0 3184:0 '),\n+(3179,'bedg834',530,3522,3953,65,70,3000,7000,0,0,2194.7,5122.32,258.602,4.28623,'3178:0 3180:0 '),\n+(3180,'bedg835',530,3522,3953,65,70,3000,7000,0,0,2189.16,5051.76,252.603,2.1395,'3179:0 3181:0 '),\n+(3181,'bedg836',530,3522,3953,65,70,3000,7000,0,0,2116.51,5085.08,256.974,5.94279,'3180:0 3182:0 3185:0 '),\n+(3182,'bedg837',530,3522,3953,65,70,3000,7000,0,0,2090.4,5162.61,265.04,2.37496,'3181:0 3183:0 3187:0 '),\n+(3183,'bedg838',530,3522,3953,65,70,3000,7000,0,0,2063.34,5235.11,265.179,0.122197,'3182:0 3184:0 '),\n+(3184,'bedg839',530,3522,3833,65,70,3000,7000,0,0,2316.24,5243.18,261.206,0.031876,'3183:0 3178:0 3177:0 '),\n+(3185,'bedg840',530,3522,3953,65,70,3000,7000,0,0,2089.3,5022.57,223.769,0.835746,'3181:0 3186:0 '),\n+(3186,'bedg841',530,3522,3953,65,70,3000,7000,0,0,2164.72,5005.6,178.623,5.23199,'3185:0 3028:0 '),\n+(3187,'bedg842',530,3522,3953,65,70,3000,7000,0,0,1740.09,5133.27,265.058,3.33132,'3182:0 3188:0 '),\n+(3188,'bedg843',530,3522,3919,65,70,3000,7000,0,0,1674.61,5254.04,265.321,1.92546,'3187:0 3189:0 '),\n+(3189,'bedg844',530,3522,3919,65,70,3000,7000,0,0,1612.29,5464.5,265.941,1.8587,'3188:0 2998:0 2997:0 '),\n+(3190,'bedg845',530,3522,3833,65,70,3000,7000,0,0,2395.42,5588.73,267.895,5.88623,'2989:0 3191:0 '),\n+(3191,'bedg846',530,3522,3833,65,70,3000,7000,0,0,2397.69,5390.93,264.287,4.72385,'3190:0 3177:0 3176:0 '),\n+(3192,'bedg847',530,3522,3954,65,70,3000,7000,0,0,3094.62,6101.88,130.589,1.3065,'3139:0 3193:0 '),\n+(3193,'bedg848',530,3522,3954,65,70,3000,7000,0,0,3120.37,6181.58,137.697,1.30738,'3192:0 3194:0 '),\n+(3194,'bedg849',530,3522,3954,65,70,3000,7000,0,0,3147.57,6248.67,124.212,0.486635,'3193:0 3195:0 '),\n+(3195,'bedg850',530,3522,3954,65,70,3000,7000,0,0,3217.19,6289.41,124.654,1.62939,'3194:0 3196:0 '),\n+(3196,'bedg851',530,3522,3954,65,70,3000,7000,0,0,3215.71,6365.94,119.805,1.02856,'3195:0 3197:0 '),\n+(3197,'bedg852',530,3522,3954,65,70,3000,7000,0,0,3279.94,6464.48,149.929,0.887189,'3196:0 3198:0 '),\n+(3198,'bedg853',530,3522,3830,65,70,3000,7000,0,0,3323.9,6505.86,159.443,0.796868,'3197:0 3199:0 3214:0 '),\n+(3199,'bedg854',530,3522,3781,65,70,3000,7000,0,0,3488.68,6673.14,148.361,0.895043,'3198:0 3200:0 3214:0 '),\n+(3200,'bedg855',530,3522,3781,65,70,3000,7000,0,0,3566.67,6807.32,137.289,2.01031,'3199:0 3201:0 3210:0 '),\n+(3201,'bedg856',530,3522,3830,65,70,3000,7000,0,0,3446.01,7089.42,152.831,1.97497,'3200:0 3202:0 3204:0 3205:0 '),\n+(3202,'bedg857',530,3522,3830,65,70,3000,7000,0,0,3286.14,7143.51,168.873,3.41617,'3201:0 3203:0 '),\n+(3203,'bedg858',530,3522,3830,65,70,3000,7000,0,0,3303.87,6962.97,164.125,0.482707,'3202:0 3204:0 '),\n+(3204,'bedg859',530,3522,3830,65,70,3000,7000,0,0,3360.25,6980.78,163.409,0.305992,'3203:0 3201:0 '),\n+(3205,'bedg860',530,3522,3903,65,70,3000,7000,0,0,3481.37,7222.76,141.365,1.30345,'3201:0 3206:0 '),\n+(3206,'bedg861',530,3522,3903,65,70,3000,7000,0,0,3590.93,7211.94,137.85,5.43858,'3205:0 3207:0 '),\n+(3207,'bedg862',530,3522,3903,65,70,3000,7000,0,0,3641.59,7154.45,142.814,5.19904,'3206:0 3208:0 '),\n+(3208,'bedg863',530,3522,3903,65,70,3000,7000,0,0,3697.31,7047.11,149.054,4.94771,'3207:0 3209:0 '),\n+(3209,'bedg864',530,3522,3830,65,70,3000,7000,0,0,3765.97,6838.37,141.277,4.82598,'3208:0 3210:0 '),\n+(3210,'bedg865',530,3522,3781,65,70,3000,7000,0,0,3736.74,6702.81,136.262,4.17018,'3200:0 3209:0 3211:0 '),\n+(3211,'bedg866',530,3522,3781,65,70,3000,7000,0,0,3630.09,6582.49,134.163,3.31724,'3210:0 3212:0 '),\n+(3212,'bedg867',530,3522,3781,65,70,3000,7000,0,0,3502.63,6555.2,131.654,3.74921,'3211:0 3213:0 '),\n+(3213,'bedg868',530,3522,3830,65,70,3000,7000,0,0,3447.34,6507.7,134.998,3.17979,'3212:0 3214:0 '),\n+(3214,'bedg869',530,3522,3830,65,70,3000,7000,0,0,3367.73,6538.54,150.282,2.78317,'3198:0 3213:0 3199:0 '),\n+(3215,'bedg870',530,3522,3824,65,70,3000,7000,0,0,1832.55,6314.24,0.000980531,2.39439,'3085:0 3216:0 '),\n+(3216,'bedg871',530,3522,3824,65,70,3000,7000,0,0,1739.41,6384.91,-10.3385,3.01878,'3215:0 3217:0 '),\n+(3217,'bedg872',530,3522,3776,65,70,3000,7000,0,0,1654.93,6407.76,-10.1815,2.87741,'3216:0 3084:0 3218:0 '),\n+(3218,'bedg873',530,3522,3776,65,70,3000,7000,0,0,1604.99,6316.74,1.22794,4.18509,'3217:0 3219:0 '),\n+(3219,'bedg874',530,3522,3824,65,70,3000,7000,0,0,1475.3,6532.8,-10.3385,5.60273,'3218:0 3220:0 '),\n+(3220,'bedg876',530,3522,3778,65,70,3000,7000,0,0,1361.1,6534.43,6.43101,6.15055,'3219:0 3221:0 '),\n+(3221,'bedg877',530,3522,3778,65,70,3000,7000,0,0,1339.54,6590.17,-8.16829,2.78314,'3222:0 3220:0 '),\n+(3222,'bedg878',530,3522,3778,65,70,3000,7000,0,0,1355.69,6688.28,-22.7054,2.60447,'3221:0 '),\n+(3223,'net880',530,3523,3868,67,70,3000,7000,0,0,3385.12,4257.44,122.681,4.84713,'3154:0 3155:0 3224:0 '),\n+(3224,'net881',530,3523,3523,67,70,3000,7000,0,0,3394.02,4139.94,151.096,1.574,'3223:0 3225:0 '),\n+(3225,'net883',530,3523,3523,67,70,3000,7000,0,0,3433.77,4036.61,177.446,4.57617,'3226:0 3224:0 '),\n+(3226,'net884',530,3523,3523,67,70,3000,7000,0,0,3443.07,3946.93,166.449,4.15205,'3225:0 3227:0 '),\n+(3227,'net885',530,3523,3523,67,70,3000,7000,0,0,3403.88,3894.6,153.082,3.72008,'3226:0 3228:0 '),\n+(3228,'net886',530,3523,3523,67,70,3000,7000,0,0,3356.69,3870.95,144.623,4.91389,'3227:0 3229:0 3238:0 3239:0 '),\n+(3229,'net887',530,3523,3523,67,70,3000,7000,0,0,3379,3814.14,142.822,4.46228,'3228:0 3230:0 '),\n+(3230,'net888',530,3523,3725,67,70,3000,7000,0,0,3356.46,3730.03,141.12,5.51863,'3229:0 3231:0 '),\n+(3231,'net889',530,3523,3725,67,70,3000,7000,0,0,3395.58,3698.26,144.989,5.91132,'3230:0 3232:0 '),\n+(3232,'net890',530,3523,3725,67,70,3000,7000,0,0,3463.55,3674.25,150.706,4.98848,'3231:0 3233:0 '),\n+(3233,'net891',530,3523,3725,67,70,3000,7000,0,0,3489.72,3601.83,158.293,4.35231,'3232:0 3234:0 '),\n+(3234,'net892',530,3523,3725,67,70,3000,7000,0,0,3537.5,3575.94,135.389,2.48697,'3233:0 3235:0 '),\n+(3235,'net893',530,3523,3725,67,70,3000,7000,0,0,3582.4,3548.11,124.35,1.42276,'3234:0 3236:0 '),\n+(3236,'net894',530,3523,3721,67,70,3000,7000,0,0,3601.15,3625.27,127.148,2.16889,'3235:0 3237:0 '),\n+(3237,'net895',530,3523,3725,67,70,3000,7000,0,0,3506.7,3744.78,141.004,1.82724,'3236:0 3238:0 '),\n+(3238,'net896',530,3523,3523,67,70,3000,7000,0,0,3492.41,3820.83,138.898,2.78542,'3237:0 3228:0 '),\n+(3239,'net897',530,3523,3523,67,70,3000,7000,0,0,3288.33,3814.38,139.103,3.2089,'3228:0 3240:0 '),\n+(3240,'net898',530,3523,3523,67,70,3000,7000,0,0,3228.8,3802.26,137.833,3.34242,'3239:0 3241:0 3272:0 3273:0 '),\n+(3241,'net899',530,3523,3712,67,70,3000,7000,0,0,3127.16,3690.44,142.929,3.42881,'3240:0 3272:0 3273:0 3278:0 '),\n+(3242,'net903',530,3523,3712,67,70,3000,7000,0,0,2999.35,3698.08,144.031,2.76314,'3243:0 3269:0 3277:0 3270:0 '),\n+(3243,'net904',530,3523,3712,67,70,3000,7000,0,0,2922.84,3722.08,143.833,1.69299,'3244:0 3242:0 '),\n+(3244,'net905',530,3523,3523,67,70,3000,7000,0,0,2885.06,3679.8,140.256,0.687686,'3243:0 3245:0 '),\n+(3245,'net906',530,3523,3523,67,70,3000,7000,0,0,2816.99,3697.81,120.765,3.2795,'3244:0 3246:0 '),\n+(3246,'net907',530,3523,3523,67,70,3000,7000,0,0,2757.67,3673.48,134.526,2.26241,'3245:0 3247:0 3290:0 '),\n+(3247,'net908',530,3523,3729,67,70,3000,7000,0,0,2719.32,3721.32,139.083,3.091,'3246:0 3248:0 '),\n+(3248,'net909',530,3523,3729,67,70,3000,7000,0,0,2639.32,3732.64,144.622,2.23884,'3247:0 3249:0 '),\n+(3249,'net910',530,3523,3729,67,70,3000,7000,0,0,2585.42,3776.42,143.482,2.4509,'3248:0 3250:0 3293:0 '),\n+(3250,'net911',530,3523,3729,67,70,3000,7000,0,0,2514.06,3815.49,129.888,2.12889,'3249:0 3251:0 '),\n+(3251,'net912',530,3523,3729,67,70,3000,7000,0,0,2508.94,3883.67,132.691,1.6655,'3250:0 3252:0 '),\n+(3252,'net913',530,3523,3729,67,70,3000,7000,0,0,2477.31,4067.17,130.201,5.03879,'3251:0 3253:0 '),\n+(3253,'net914',530,3523,3523,67,70,3000,7000,0,0,2545.65,4202.77,136.176,0.542382,'3252:0 3254:0 '),\n+(3254,'net915',530,3523,3523,67,70,3000,7000,0,0,2609.03,4303.08,140.386,0.000453472,'3253:0 3255:0 '),\n+(3255,'net916',530,3523,3726,67,70,3000,7000,0,0,2747.27,4290.97,151.997,6.19723,'3254:0 3256:0 '),\n+(3256,'net917',530,3523,3726,67,70,3000,7000,0,0,2895.85,4349.05,157.653,4.53219,'3255:0 3257:0 '),\n+(3257,'net918',530,3523,3726,67,70,3000,7000,0,0,2865.03,4280.18,159.366,5.10554,'3256:0 3258:0 '),\n+(3258,'net919',530,3523,3726,67,70,3000,7000,0,0,2890.62,4215.62,164.008,5.09376,'3257:0 3259:0 3266:0 '),\n+(3259,'net920',530,3523,3726,67,70,3000,7000,0,0,2940.62,4199.62,164.007,0.322464,'3258:0 3260:0 3265:0 '),\n+(3260,'net921',530,3523,3726,67,70,3000,7000,0,0,2999.27,4224.49,160.851,0.401004,'3259:0 3261:0 '),\n+(3261,'net922',530,3523,3726,67,70,3000,7000,0,0,3026.75,4163.73,153.291,4.74035,'3260:0 3262:0 '),\n+(3262,'net923',530,3523,3726,67,70,3000,7000,0,0,3010.04,4106.05,150.967,4.08455,'3261:0 3263:0 '),\n+(3263,'net924',530,3523,3726,67,70,3000,7000,0,0,2977.7,4033.08,148.218,1.89329,'3262:0 3264:0 3267:0 '),\n+(3264,'net925',530,3523,3726,67,70,3000,7000,0,0,2939.58,4099.08,162.599,2.04252,'3263:0 3265:0 '),\n+(3265,'net926',530,3523,3726,67,70,3000,7000,0,0,2918.39,4149.56,164.008,1.96398,'3264:0 3259:0 3266:0 '),\n+(3266,'net927',530,3523,3726,67,70,3000,7000,0,0,2870.91,4167.67,164.007,1.92863,'3265:0 3258:0 '),\n+(3267,'net928',530,3523,3523,67,70,3000,7000,0,0,2982.92,3921.89,146.316,1.62627,'3263:0 3268:0 '),\n+(3268,'net929',530,3523,3523,67,70,3000,7000,0,0,3051.56,3890.86,143.683,5.83993,'3267:0 3269:0 '),\n+(3269,'net930',530,3523,3712,67,70,3000,7000,0,0,3039.6,3790.04,145.363,4.28485,'3268:0 3271:0 3242:0 '),\n+(3270,'net931',530,3523,3712,67,70,3000,7000,0,0,3064.35,3704.05,142.478,3.15387,'3242:0 3278:0 '),\n+(3271,'net932',530,3523,3523,67,70,3000,7000,0,0,3092.9,3822.62,142.74,5.9106,'3269:0 3272:0 '),\n+(3272,'net933',530,3523,3523,67,70,3000,7000,0,0,3125.95,3779.17,142.072,0.118293,'3271:0 3241:0 3240:0 '),\n+(3273,'net934',530,3523,3523,67,70,3000,7000,0,0,3196.76,3711.71,129.813,5.90669,'3241:0 3240:0 3274:0 '),\n+(3274,'net935',530,3523,3523,67,70,3000,7000,0,0,3253.35,3630.84,126.607,3.66438,'3273:0 3275:0 '),\n+(3275,'net936',530,3523,3523,67,70,3000,7000,0,0,3139.27,3579.06,142.77,3.24419,'3274:0 3276:0 '),\n+(3276,'net937',530,3523,3712,67,70,3000,7000,0,0,3046.95,3595.34,143.235,1.59486,'3275:0 3279:0 3278:0 '),\n+(3277,'net938',530,3523,3712,1,60,3000,7000,0,0,2935.94,3648.71,132.577,0.379446,'3242:0 3278:0 '),\n+(3278,'net939',530,3523,3712,67,70,3000,7000,0,1,3062.95,3645.68,144.33,5.51596,'3241:0 3276:0 3277:0 3270:0 '),\n+(3279,'net940',530,3523,3523,67,70,3000,7000,0,0,3016.58,3539.17,143.581,3.54657,'3276:0 3280:0 3294:0 '),\n+(3280,'net941',530,3523,3523,67,70,3000,7000,0,0,2859.55,3471.67,136.322,0.389269,'3279:0 3281:0 3288:0 '),\n+(3281,'net942',530,3523,3723,67,70,3000,7000,0,0,2805.81,3360.76,144.743,4.68931,'3280:0 3282:0 '),\n+(3282,'net944',530,3523,3723,67,70,3000,7000,0,0,2802.57,3251.58,147.597,1.60466,'3281:0 3283:0 '),\n+(3283,'net945',530,3523,3723,67,70,3000,7000,0,0,2769.35,3153.34,149.314,2.61194,'3284:0 3282:0 '),\n+(3284,'net946',530,3523,3723,67,70,3000,7000,0,0,2713.25,3168.67,147.073,4.21416,'3283:0 3285:0 '),\n+(3285,'net947',530,3523,3721,67,70,3000,7000,0,0,2645.59,3055.71,123.459,0.911553,'3284:0 3286:0 3301:0 3302:0 '),\n+(3286,'net948',530,3523,3723,67,70,3000,7000,0,0,2635.1,3154.85,135.257,1.35923,'3285:0 3287:0 '),\n+(3287,'net949',530,3523,3523,67,70,3000,7000,0,0,2617.24,3347.94,142.696,1.66554,'3286:0 3288:0 3291:0 '),\n+(3288,'net950',530,3523,3523,67,70,3000,7000,0,0,2742.84,3444.31,140.23,4.12776,'3287:0 3280:0 3289:0 '),\n+(3289,'net951',530,3523,3523,67,70,3000,7000,0,0,2704.66,3571.67,134.738,5.57132,'3288:0 3290:0 '),\n+(3290,'net952',530,3523,3523,67,70,3000,7000,0,0,2828.97,3612.56,157.278,2.2157,'3289:0 3246:0 '),\n+(3291,'net953',530,3523,3721,67,70,3000,7000,0,0,2522.14,3469.45,130.706,1.47151,'3287:0 3292:0 '),\n+(3292,'net954',530,3523,3523,67,70,3000,7000,0,0,2544.17,3592.01,138.626,1.39297,'3291:0 3293:0 '),\n+(3293,'net955',530,3523,3721,67,70,3000,7000,0,0,2528.36,3697.54,134.608,0.964924,'3292:0 3249:0 '),\n+(3294,'net956',530,3523,3523,67,70,3000,7000,0,0,3051.39,3455.12,118.577,4.822,'3279:0 3295:0 '),\n+(3295,'net957',530,3523,3523,67,70,3000,7000,0,0,3057.51,3309.81,106.678,5.00264,'3294:0 3296:0 '),\n+(3296,'net958',530,3523,3721,67,70,3000,7000,0,0,3103.15,3197.03,101.208,5.67416,'3295:0 3297:0 3298:0 '),\n+(3297,'net959',530,3523,3721,67,70,3000,7000,0,0,3221.06,3114.67,102.79,5.68986,'3296:0 3339:0 3340:0 '),\n+(3298,'net960',530,3523,3921,67,70,3000,7000,0,0,2987.27,3194.73,134.342,4.05624,'3296:0 3299:0 '),\n+(3299,'net961',530,3523,3921,67,70,3000,7000,0,0,2929.07,3149.43,147.291,1.12512,'3298:0 3300:0 '),\n+(3300,'net962',530,3523,3721,67,70,3000,7000,0,0,2829.63,2992.81,120.478,2.75876,'3299:0 3301:0 '),\n+(3301,'net963',530,3523,3721,67,70,3000,7000,0,0,2726.18,3015.49,121.825,2.99045,'3300:0 3285:0 '),\n+(3302,'net964',530,3523,3721,67,70,3000,7000,0,0,2519.49,2940.34,119.757,3.88108,'3285:0 3303:0 '),\n+(3303,'net965',530,3523,3730,67,70,3000,7000,0,0,2455.26,2867.95,131.925,4.34839,'3302:0 3304:0 3308:0 '),\n+(3304,'net966',530,3523,3730,67,70,3000,7000,0,0,2531.85,2827,126.995,4.61936,'3305:0 3303:0 '),\n+(3305,'net967',530,3523,3730,67,70,3000,7000,0,0,2555.92,2738.68,119.45,1.55822,'3304:0 3306:0 3330:0 '),\n+(3306,'net970',530,3523,3730,67,70,3000,7000,0,0,2501.34,2718.83,131.657,2.74617,'3307:0 3305:0 3329:0 '),\n+(3307,'net971',530,3523,3730,67,70,3000,7000,0,0,2440.85,2747.78,134.493,2.69511,'3308:0 3310:0 3306:0 '),\n+(3308,'net972',530,3523,3730,67,70,3000,7000,0,0,2424.83,2798.75,134.493,1.0929,'3307:0 3309:0 3303:0 '),\n+(3309,'net973',530,3523,3730,67,70,3000,7000,0,0,2364.39,2781.17,133.656,5.81904,'3308:0 3310:0 '),\n+(3310,'net974',530,3523,3730,67,70,3000,7000,0,0,2392.65,2726.98,134.491,5.0199,'3307:0 3309:0 3311:0 '),\n+(3311,'net975',530,3523,3730,67,70,3000,7000,0,0,2364.76,2665.91,130.977,1.12433,'3310:0 3312:0 '),\n+(3312,'net976',530,3523,3523,67,70,3000,7000,0,0,2326,2600.19,126.548,4.98456,'3311:0 3313:0 '),\n+(3313,'net977',530,3523,3523,67,70,3000,7000,0,0,2287.03,2439.79,104.053,4.47406,'3312:0 3314:0 '),\n+(3314,'net978',530,3523,3523,67,70,3000,7000,0,0,2336.37,2367.16,115.816,5.18877,'3313:0 3327:0 3315:0 '),\n+(3315,'net979',530,3523,3523,67,70,3000,7000,0,0,2310.67,2271.59,98.2741,5.2673,'3314:0 3316:0 3321:0 '),\n+(3316,'net981',530,3523,3935,67,70,3000,7000,0,0,2246.67,2310.26,89.8977,3.71223,'3317:0 3326:0 3315:0 '),\n+(3317,'net982',530,3523,3934,67,70,3000,7000,0,0,2176.86,2262.3,76.0387,4.01068,'3316:0 3318:0 3326:0 '),\n+(3318,'net983',530,3523,3934,67,70,3000,7000,0,0,2119.56,2206.31,71.3039,6.1607,'3317:0 3319:0 '),\n+(3319,'net984',530,3523,3934,67,70,3000,7000,0,0,2180.34,2173.31,71.6002,5.61288,'3318:0 3320:0 '),\n+(3320,'net985',530,3523,3934,67,70,3000,7000,0,0,2233.52,2115.22,71.2016,2.29655,'3319:0 3321:0 '),\n+(3321,'net987',530,3523,3934,67,70,3000,7000,0,0,2294.17,2189.49,93.5883,6.28047,'3322:0 3315:0 3320:0 '),\n+(3322,'net990',530,3523,3934,67,70,3000,7000,0,0,2353.3,2183.05,89.3993,6.15874,'3321:0 3323:0 '),\n+(3323,'net991',530,3523,3879,67,70,3000,7000,0,0,2411.12,2183.37,89.9985,4.94529,'3322:0 3324:0 '),\n+(3324,'net992',530,3523,3879,67,70,3000,7000,0,0,2523.75,2185.83,102.693,5.98201,'3323:0 3325:0 '),\n+(3325,'net993',530,3523,3879,67,70,3000,7000,0,0,2484.6,2033.27,88.1469,4.36606,'3324:0 '),\n+(3326,'net997',530,3523,3935,67,70,3000,7000,0,0,2183.73,2382.64,98.0661,5.72675,'3316:0 3317:0 '),\n+(3327,'net999',530,3523,3837,67,70,3000,7000,0,0,2400.24,2395.93,142.613,3.9737,'3328:0 3314:0 '),\n+(3328,'net1000',530,3523,3837,67,70,3000,7000,0,0,2482.84,2424.13,134.571,3.45533,'3327:0 3329:0 '),\n+(3329,'net1001',530,3523,3523,67,70,3000,7000,0,0,2516.55,2638.79,129.583,6.18383,'3328:0 3306:0 3330:0 '),\n+(3330,'net1003',530,3523,3523,67,70,3000,7000,0,0,2599.94,2630.3,129.384,5.99453,'3305:0 3329:0 3331:0 '),\n+(3331,'net1004',530,3523,3721,67,70,3000,7000,0,0,2697.9,2608.37,102.479,0.0883238,'3332:0 3330:0 '),\n+(3332,'net1005',530,3523,3721,67,70,3000,7000,0,0,2824.9,2626.19,104.537,0.139375,'3331:0 3333:0 '),\n+(3333,'net1006',530,3523,3523,67,70,3000,7000,0,0,2944.38,2624.27,115.88,6.27726,'3332:0 3334:0 '),\n+(3334,'net1007',530,3523,3523,67,70,3000,7000,0,0,3044.31,2606.49,109.94,6.10839,'3333:0 3335:0 3364:0 '),\n+(3335,'net1008',530,3523,3523,67,70,3000,7000,0,0,3088.57,2759.93,115.588,1.28997,'3334:0 3336:0 '),\n+(3336,'net1009',530,3523,3523,67,70,3000,7000,0,0,3181.15,2839.31,132.63,0.00191784,'3335:0 3337:0 '),\n+(3337,'net1010',530,3523,3877,67,70,3000,7000,0,0,3314.68,2857.1,140.864,0.174705,'3336:0 3338:0 3348:0 '),\n+(3338,'net1011',530,3523,3523,67,70,3000,7000,0,0,3251.04,2889.15,139.525,5.61752,'3337:0 3339:0 '),\n+(3339,'net1012',530,3523,3523,67,70,3000,7000,0,0,3260.45,2979.53,133.71,1.72431,'3338:0 3297:0 '),\n+(3340,'net1013',530,3523,3721,67,70,3000,7000,0,0,3328.19,3109.33,123.938,0.003479,'3297:0 3341:0 '),\n+(3341,'net1014',530,3523,3721,67,70,3000,7000,0,0,3467.09,3253.66,100.83,0.804579,'3340:0 3342:0 '),\n+(3342,'net1015',530,3523,3523,67,70,3000,7000,0,0,3558.21,3192.19,105.717,5.68976,'3341:0 3343:0 '),\n+(3343,'net1016',530,3523,3877,67,70,3000,7000,0,0,3523.96,3113.12,130.592,4.30353,'3342:0 3344:0 '),\n+(3344,'net1017',530,3523,3877,67,70,3000,7000,0,0,3511.13,3048.77,142.826,5.09678,'3343:0 3345:0 '),\n+(3345,'net1018',530,3523,3877,67,70,3000,7000,0,0,3536.43,3000.68,143.097,5.20281,'3344:0 3349:0 3346:0 '),\n+(3346,'net1020',530,3523,3877,67,70,3000,7000,0,0,3646.43,3045.04,123.609,0.195882,'3345:0 3347:0 '),\n+(3347,'net1021',530,3523,3523,67,70,3000,7000,0,0,3924.41,3119.4,115.634,0.278359,'3480:0 3346:0 '),\n+(3348,'net1022',530,3523,3877,67,70,3000,7000,0,1,3410.82,2878.14,142.972,0.18804,'3337:0 3349:0 3350:0 '),\n+(3349,'net1023',530,3523,3877,67,70,3000,7000,0,0,3473.27,2973.11,143.266,0.989146,'3348:0 3345:0 '),\n+(3350,'net1024',530,3523,3877,67,70,3000,7000,0,0,3472.55,2819.87,145.201,4.69465,'3348:0 3351:0 '),\n+(3351,'net1025',530,3523,3523,67,70,3000,7000,0,0,3576.26,2719.73,151.525,3.15525,'3350:0 3352:0 '),\n+(3352,'net1026',530,3523,3523,67,70,3000,7000,0,0,3439.56,2608.19,150.833,0.802981,'3351:0 3353:0 '),\n+(3353,'net1027',530,3523,3523,67,70,3000,7000,0,0,3372.76,2617.96,145.564,2.25596,'3352:0 3354:0 3357:0 '),\n+(3354,'net1028',530,3523,3727,67,70,3000,7000,0,0,3328.76,2674.02,157.504,3.71287,'3353:0 3355:0 '),\n+(3355,'net1029',530,3523,3727,67,70,3000,7000,0,0,3250.52,2628.38,139.888,2.91962,'3354:0 3356:0 '),\n+(3356,'net1030',530,3523,3523,67,70,3000,7000,0,0,3285.42,2563.6,113.658,4.09772,'3355:0 3357:0 '),\n+(3357,'net1031',530,3523,3523,67,70,3000,7000,0,0,3352.87,2536.5,95.7401,1.21138,'3353:0 3356:0 3358:0 '),\n+(3358,'net1033',530,3523,3728,67,70,3000,7000,0,0,3246.86,2379.03,91.5897,4.38044,'3357:0 3359:0 '),\n+(3359,'net1035',530,3523,3728,67,70,3000,7000,0,0,3241.13,2272.31,99.5301,4.56501,'3358:0 3360:0 '),\n+(3360,'net1037',530,3523,3728,67,70,3000,7000,0,0,3202.86,2140.94,138.867,1.63547,'3377:0 3359:0 3361:0 '),\n+(3361,'net1039',530,3523,3728,67,70,3000,7000,0,0,3162.82,2326.75,134.887,1.78864,'3360:0 3362:0 '),\n+(3362,'net1040',530,3523,3728,67,70,3000,7000,0,0,3160.48,2406.47,131.04,1.60014,'3363:0 3361:0 '),\n+(3363,'net1041',530,3523,3728,67,70,3000,7000,0,0,3113.17,2449.04,120.183,2.1774,'3362:0 3364:0 '),\n+(3364,'net1042',530,3523,3728,67,70,3000,7000,0,0,3069.26,2504.52,114.18,1.78077,'3363:0 3334:0 3365:0 '),\n+(3365,'net1043',530,3523,3734,67,70,3000,7000,0,0,3083.75,2363.04,144.526,4.81242,'3364:0 3366:0 '),\n+(3366,'net1044',530,3523,3734,67,70,3000,7000,0,0,3085.33,2294.83,150.494,4.74173,'3365:0 3367:0 3373:0 '),\n+(3367,'net1045',530,3523,3734,67,70,3000,7000,0,0,3125.61,2238.22,150.562,3.67359,'3366:0 3368:0 '),\n+(3368,'net1046',530,3523,3734,67,70,3000,7000,0,0,3074.15,2209.78,161.33,3.55578,'3367:0 3369:0 '),\n+(3369,'net1047',530,3523,3734,67,70,3000,7000,0,0,3017.03,2183.87,165.329,3.55578,'3368:0 3370:0 3372:0 '),\n+(3370,'net1048',530,3523,3734,67,70,3000,7000,0,0,2998.08,2133.47,165.328,4.35295,'3369:0 3371:0 3374:0 '),\n+(3371,'net1049',530,3523,3734,67,70,3000,7000,0,0,2946.6,2153.28,165.328,2.77429,'3370:0 3372:0 '),\n+(3372,'net1050',530,3523,3734,67,70,3000,7000,0,0,2965.73,2206.06,165.328,1.22313,'3371:0 3369:0 3373:0 '),\n+(3373,'net1051',530,3523,3734,67,70,3000,7000,0,0,2936.31,2281.19,161.738,6.1684,'3366:0 3372:0 '),\n+(3374,'net1054',530,3523,3734,67,70,3000,7000,0,0,3024.32,2073.46,161.904,5.51533,'3370:0 3375:0 '),\n+(3375,'net1055',530,3523,3728,67,70,3000,7000,0,0,3109.36,1996.97,143.897,5.55067,'3374:0 3376:0 '),\n+(3376,'net1056',530,3523,3728,67,70,3000,7000,0,0,3166.19,1968.36,143.636,5.79022,'3375:0 3377:0 3378:0 '),\n+(3377,'net1057',530,3523,3728,67,70,3000,7000,0,0,3200.13,2051.68,140.786,4.08789,'3376:0 3360:0 '),\n+(3378,'net1058',530,3523,3728,67,70,3000,7000,0,0,3152.12,1897.92,143.899,6.07689,'3376:0 3379:0 3381:0 '),\n+(3379,'net1059',530,3523,3728,67,70,3000,7000,0,0,3101.78,1824.2,144.391,4.03094,'3380:0 3378:0 '),\n+(3380,'net1060',530,3523,3728,67,70,3000,7000,0,1,3001.93,1820.1,139.674,3.72463,'3379:0 '),\n+(3381,'net1061',530,3523,3728,67,70,3000,7000,0,0,3242.1,1874.48,139.223,3.2581,'3378:0 3382:0 '),\n+(3382,'net1062',530,3523,3721,67,70,3000,7000,0,0,3356.3,1846.42,102.117,6.15621,'3381:0 3383:0 '),\n+(3383,'net1063',530,3523,3721,67,70,3000,7000,0,0,3493.95,1840.83,95.7573,0.214661,'3382:0 3384:0 '),\n+(3384,'net1064',530,3523,3735,67,70,3000,7000,0,0,3613.29,1892.38,114.291,3.62722,'3383:0 3413:0 3414:0 '),\n+(3385,'net1066',530,3523,3736,67,70,3000,7000,0,0,3865.27,1760.4,212.947,0.885387,'3386:0 3410:0 '),\n+(3386,'net1067',530,3523,3736,67,70,3000,7000,0,0,3913.4,1809.95,227.674,2.24413,'3385:0 3396:0 3387:0 '),\n+(3387,'net1070',530,3523,3736,67,70,3000,7000,0,0,3881.31,1918.58,254.223,0.97178,'3386:0 3388:0 '),\n+(3388,'net1071',530,3523,3736,67,70,3000,7000,0,0,3915.93,1973.35,257.813,1.00712,'3389:0 3391:0 3387:0 '),\n+(3389,'net1072',530,3523,3736,67,70,3000,7000,0,0,3903.14,2024.48,257.813,1.77289,'3388:0 3390:0 '),\n+(3390,'net1073',530,3523,3736,67,70,3000,7000,0,0,3959.61,2037.62,257.813,0.233506,'3389:0 3391:0 3392:0 '),\n+(3391,'net1074',530,3523,3736,67,70,3000,7000,0,0,3969.45,1982.24,257.813,4.86736,'3390:0 3388:0 '),\n+(3392,'net1075',530,3523,3736,67,70,3000,7000,0,0,3996.64,2094.06,254.332,0.975711,'3390:0 3393:0 '),\n+(3393,'net1077',530,3523,3736,67,70,3000,7000,0,0,4094.87,2029.53,236.513,5.17366,'3392:0 3394:0 '),\n+(3394,'net1078',530,3523,3736,67,70,3000,7000,0,0,4145.6,1950.14,225.805,2.1106,'3397:0 3395:0 3393:0 '),\n+(3395,'net1079',530,3523,3736,67,70,3000,7000,0,0,4106.82,1883.96,228.654,3.273,'3394:0 3396:0 '),\n+(3396,'net1081',530,3523,3736,67,70,3000,7000,0,0,3993.09,1800.64,228.295,3.01381,'3386:0 3395:0 '),\n+(3397,'net1082',530,3523,3736,67,70,3000,7000,0,0,4192.46,2017.97,187.695,1.85243,'3394:0 3398:0 '),\n+(3398,'net1083',530,3523,3736,67,70,3000,7000,0,0,4174.2,2071.5,164.367,1.33406,'3397:0 3399:0 '),\n+(3399,'net1084',530,3523,3735,67,70,3000,7000,0,0,4198.79,2173.44,151.336,1.33406,'3398:0 3400:0 3401:0 3431:0 '),\n+(3400,'net1085',530,3523,3735,67,70,3000,7000,0,0,4292.53,2293.49,122.367,0.595787,'3399:0 3432:0 '),\n+(3401,'net1086',530,3523,3854,67,70,3000,7000,0,0,4247.96,2110.73,144.575,4.7741,'3399:0 3402:0 '),\n+(3402,'net1087',530,3523,3735,67,70,3000,7000,0,0,4252.18,1989.35,136.107,4.82514,'3401:0 3403:0 '),\n+(3403,'net1088',530,3523,3735,67,70,3000,7000,0,0,4268.67,1894.47,138.946,4.87226,'3402:0 3404:0 3407:0 '),\n+(3404,'net1089',530,3523,3735,67,70,3000,7000,0,0,4299.75,1730.52,113.615,4.18507,'3403:0 3405:0 '),\n+(3405,'net1090',530,3523,3735,67,70,3000,7000,0,0,4113.8,1674.62,130.483,2.68103,'3404:0 3406:0 '),\n+(3406,'net1091',530,3523,3735,67,70,3000,7000,0,0,4046.36,1742.75,145.812,2.35116,'3405:0 3407:0 3408:0 '),\n+(3407,'net1092',530,3523,3735,67,70,3000,7000,0,0,4181.61,1781.88,136.718,0.423012,'3406:0 3403:0 '),\n+(3408,'net1093',530,3523,3735,67,70,3000,7000,0,0,3930.55,1683.62,139.355,3.27165,'3406:0 3409:0 '),\n+(3409,'net1094',530,3523,3735,67,70,3000,7000,0,0,3819.95,1651.37,133.174,2.01794,'3408:0 3411:0 3410:0 '),\n+(3410,'net1095',530,3523,3735,67,70,3000,7000,0,0,3785.44,1751.5,175.377,2.55396,'3385:0 3409:0 3413:0 '),\n+(3411,'net1097',530,3523,3735,67,70,3000,7000,0,0,3779.17,1581.07,120.895,1.36998,'3409:0 3412:0 '),\n+(3412,'net1098',530,3523,3735,67,70,3000,7000,0,0,3710.46,1647.45,128.67,1.14614,'3411:0 3413:0 '),\n+(3413,'net1099',530,3523,3735,67,70,3000,7000,0,0,3682.83,1822.97,129.53,5.05546,'3412:0 3384:0 3410:0 '),\n+(3414,'net1100',530,3523,3735,67,70,3000,7000,0,0,3551.83,1960.87,89.9501,1.23472,'3384:0 3415:0 3416:0 '),\n+(3415,'net1101',530,3523,3735,67,70,3000,7000,0,0,3582.85,2061.58,97.1173,1.30541,'3414:0 '),\n+(3416,'net1102',530,3523,3735,67,70,3000,7000,0,0,3654.98,2151.19,121.699,1.26065,'3414:0 3417:0 '),\n+(3417,'net1103',530,3523,3735,67,70,3000,7000,0,0,3647.05,2320.07,95.0628,1.67298,'3416:0 3418:0 '),\n+(3418,'net1104',530,3523,3735,67,70,3000,7000,0,0,3753.6,2270.39,127.706,5.84031,'3417:0 3419:0 '),\n+(3419,'net1105',530,3523,3735,67,70,3000,7000,0,0,3743.54,2216.22,132.261,5.08632,'3418:0 3420:0 '),\n+(3420,'net1106',530,3523,3880,67,70,3000,7000,0,0,3752.43,2164.28,140.754,4.1949,'3419:0 3421:0 3427:0 '),\n+(3421,'net1107',530,3523,3880,67,70,3000,7000,0,0,3712.58,2091.74,151.686,5.93062,'3420:0 3422:0 '),\n+(3422,'net1108',530,3523,3880,67,70,3000,7000,0,0,3791.21,2078.46,153.464,0.004788,'3421:0 3423:0 '),\n+(3423,'net1109',530,3523,3880,67,70,3000,7000,0,0,3833.37,2045.96,145.651,5.41226,'3422:0 3424:0 '),\n+(3424,'net1110',530,3523,3880,67,70,3000,7000,0,0,3890.34,2027.56,147.129,1.10633,'3423:0 3425:0 '),\n+(3425,'net1112',530,3523,3880,67,70,3000,7000,0,0,3911.03,2086.24,156.158,1.07294,'3424:0 3426:0 '),\n+(3426,'net1113',530,3523,3880,67,70,3000,7000,0,0,3942.19,2139.62,160.422,6.24086,'3425:0 '),\n+(3427,'net1114',530,3523,3735,67,70,3000,7000,0,0,3790.48,2245.91,149.586,4.56011,'3420:0 3428:0 '),\n+(3428,'net1115',530,3523,3735,67,70,3000,7000,0,0,3843.92,2279.21,153.861,2.84204,'3427:0 3429:0 '),\n+(3429,'net1116',530,3523,3735,67,70,3000,7000,0,0,3944.34,2283.35,158.599,6.04059,'3428:0 3430:0 '),\n+(3430,'net1117',530,3523,3735,67,70,3000,7000,0,0,4063.98,2226.19,164.346,5.41228,'3429:0 3431:0 '),\n+(3431,'net1119',530,3523,3735,67,70,3000,7000,0,0,4123.87,2142.65,157.701,2.91076,'3399:0 3430:0 '),\n+(3432,'net1121',530,3523,3741,67,70,3000,7000,0,0,4466.87,2397.83,122.968,0.527102,'3400:0 3433:0 '),\n+(3433,'net1122',530,3523,3741,67,70,3000,7000,0,0,4530.13,2410.14,141.874,5.42799,'3432:0 3434:0 3438:0 '),\n+(3434,'net1123',530,3523,3741,67,70,3000,7000,0,0,4566.37,2316.31,146.43,5.07457,'3433:0 3435:0 '),\n+(3435,'net1124',530,3523,3741,67,70,3000,7000,0,0,4632.34,2295.23,162.104,1.47351,'3434:0 3436:0 '),\n+(3436,'net1125',530,3523,3741,67,70,3000,7000,0,0,4622.3,2365.33,187.361,1.96046,'3435:0 3437:0 '),\n+(3437,'net1126',530,3523,3741,67,70,3000,7000,0,0,4729.92,2383.24,198.355,3.24458,'3436:0 '),\n+(3438,'net1127',530,3523,3741,67,70,3000,7000,0,0,4575.52,2543.12,194.543,0.915856,'3433:0 3439:0 '),\n+(3439,'net1128',530,3523,3741,67,70,3000,7000,0,0,4579.8,2608.07,196.971,1.06115,'3438:0 3440:0 '),\n+(3440,'net1129',530,3523,3741,67,70,3000,7000,0,0,4616.02,2682.15,187.718,1.52847,'3439:0 3441:0 '),\n+(3441,'net1130',530,3523,3523,67,70,3000,7000,0,0,4613.1,2774.93,159.097,0.786306,'3440:0 3442:0 3461:0 '),\n+(3442,'net1131',530,3523,3523,67,70,3000,7000,0,0,4581.46,2841.92,146.738,1.62271,'3441:0 3443:0 3462:0 '),\n+(3443,'net1132',530,3523,3523,67,70,3000,7000,0,0,4623.84,2957.12,144.621,1.21823,'3442:0 3444:0 3463:0 '),\n+(3444,'net1133',530,3523,3850,67,70,3000,7000,0,0,4760.8,2985.3,129.535,0.205073,'3443:0 3445:0 '),\n+(3445,'net1134',530,3523,3850,67,70,3000,7000,0,0,4849.32,2917.43,146.288,5.62826,'3444:0 3446:0 '),\n+(3446,'net1135',530,3523,3874,67,70,3000,7000,0,0,4916.97,2942.46,157.256,0.212934,'3445:0 3447:0 '),\n+(3447,'net1136',530,3523,3850,67,70,3000,7000,0,0,4803.44,3004.17,134.11,2.64374,'3446:0 3448:0 '),\n+(3448,'net1137',530,3523,3523,67,70,3000,7000,0,0,4689.74,3022.54,131.238,0.00480604,'3447:0 3449:0 '),\n+(3449,'net1138',530,3523,3523,67,70,3000,7000,0,0,4770.95,3072.84,120.927,0.216864,'3448:0 3450:0 '),\n+(3450,'net1139',530,3523,3523,67,70,3000,7000,0,0,4841.73,3077.92,111.914,5.77749,'3449:0 3451:0 3533:0 '),\n+(3451,'net1140',530,3523,3874,67,70,3000,7000,0,0,4921.37,3026.16,99.5096,5.7068,'3450:0 3452:0 '),\n+(3452,'net1141',530,3523,3874,67,70,3000,7000,0,0,5030.73,3015.92,91.2729,6.18983,'3451:0 3453:0 '),\n+(3453,'net1142',530,3523,3874,67,70,3000,7000,0,0,5047.36,2928.45,88.8179,4.9057,'3452:0 3454:0 '),\n+(3454,'net1143',530,3523,3874,67,70,3000,7000,0,0,4988.68,2838.26,81.9239,3.64121,'3453:0 3455:0 '),\n+(3455,'net1144',530,3523,3850,67,70,3000,7000,0,0,4907.06,2817.68,91.5802,3.63336,'3454:0 3456:0 '),\n+(3456,'net1145',530,3523,3850,67,70,3000,7000,0,0,4903.41,2721.51,83.4709,4.33629,'3455:0 3457:0 '),\n+(3457,'net1146',530,3523,3850,67,70,3000,7000,0,0,4844.82,2634.49,94.0377,2.49061,'3456:0 3458:0 '),\n+(3458,'net1147',530,3523,3850,67,70,3000,7000,0,0,4803.14,2703.36,87.3788,2.22751,'3457:0 3459:0 '),\n+(3459,'net1148',530,3523,3850,67,70,3000,7000,0,0,4741.03,2771.78,92.6406,2.30998,'3458:0 3460:0 '),\n+(3460,'net1149',530,3523,3850,67,70,3000,7000,0,0,4719.31,2848.51,113.113,1.8623,'3459:0 3461:0 '),\n+(3461,'net1150',530,3523,3850,67,70,3000,7000,0,0,4656.43,2805.22,134.562,3.22497,'3460:0 3441:0 '),\n+(3462,'net1151',530,3523,3876,67,70,3000,7000,0,0,4484.96,2804.2,139.481,1.71701,'3442:0 3484:0 '),\n+(3463,'net1152',530,3523,3740,67,70,3000,7000,0,0,4590.85,3169.73,146.93,4.87431,'3443:0 3464:0 3465:0 3470:0 3523:0 '),\n+(3464,'net1153',530,3523,3740,67,70,3000,7000,0,0,4693.85,3149.86,170.153,5.31804,'3463:0 3465:0 '),\n+(3465,'net1154',530,3523,3740,1,60,3000,7000,0,0,4655.8,3065,169.231,2.59665,'3464:0 3463:0 3466:0 '),\n+(3466,'net1155',530,3523,3740,67,70,3000,7000,0,0,4685.7,3259.51,173.132,2.39442,'3465:0 3467:0 3469:0 '),\n+(3467,'net1156',530,3523,3740,67,70,3000,7000,0,0,4776.31,3293.39,196.421,1.55207,'3466:0 3468:0 '),\n+(3468,'net1157',530,3523,3740,67,70,3000,7000,0,0,4732.45,3359.96,201.252,3.83758,'3467:0 3469:0 '),\n+(3469,'net1158',530,3523,3740,67,70,3000,7000,0,0,4630.74,3310.08,170.694,5.45551,'3468:0 3466:0 '),\n+(3470,'net1159',530,3523,3523,67,70,3000,7000,0,0,4397.77,3265.13,143.404,2.67128,'3463:0 3471:0 3475:0 3476:0 3523:0 3487:0 '),\n+(3471,'net1160',530,3523,3739,67,70,3000,7000,0,0,4463.52,3434.86,167.212,1.19866,'3470:0 3472:0 3475:0 '),\n+(3472,'net1161',530,3523,3739,67,70,3000,7000,0,0,4387.49,3412.69,167.78,2.42782,'3471:0 3473:0 '),\n+(3473,'net1162',530,3523,3739,67,70,3000,7000,0,0,4350.61,3471.82,175.837,4.81542,'3472:0 3474:0 '),\n+(3474,'net1163',530,3523,3739,67,70,3000,7000,0,0,4364.97,3377.13,154.103,0.876653,'3473:0 3475:0 '),\n+(3475,'net1164',530,3523,3739,67,70,3000,7000,0,0,4427.16,3339.99,152.658,0.896303,'3474:0 3470:0 3471:0 '),\n+(3476,'net1165',530,3523,3738,67,70,3000,7000,0,0,4313.76,3185.04,161.274,0.774559,'3470:0 3477:0 '),\n+(3477,'net1166',530,3523,3738,67,70,3000,7000,0,1,4231.39,3159.2,178.712,0.566429,'3476:0 3478:0 '),\n+(3478,'net1167',530,3523,3738,67,70,3000,7000,0,0,4178.63,3151.63,175.35,3.55094,'3477:0 3479:0 '),\n+(3479,'net1168',530,3523,3738,67,70,3000,7000,0,0,4098.18,3118.59,159.275,3.31924,'3478:0 3480:0 '),\n+(3480,'net1169',530,3523,3738,67,70,3000,7000,0,0,4000.86,3107.64,138.035,3.24856,'3479:0 3347:0 3481:0 '),\n+(3481,'net1170',530,3523,3875,67,70,3000,7000,0,0,4031.23,3259.48,139.947,1.37536,'3480:0 3482:0 '),\n+(3482,'net1171',530,3523,3875,67,70,3000,7000,0,0,4071.98,3372.71,141.877,5.11779,'3481:0 3483:0 3489:0 '),\n+(3483,'net1172',530,3523,3875,67,70,3000,7000,0,0,4151.5,3229.24,196.056,3.95933,'3482:0 '),\n+(3484,'net1173',530,3523,3876,67,70,3000,7000,0,0,4466.66,2879.42,140.619,2.91867,'3462:0 3485:0 '),\n+(3485,'net1174',530,3523,3876,67,70,3000,7000,0,0,4370.42,2904.8,148.304,2.95794,'3484:0 3486:0 '),\n+(3486,'net1175',530,3523,3876,67,70,3000,7000,0,0,4330.52,2945.08,132.085,5.41232,'3485:0 '),\n+(3487,'net1176',530,3523,3523,67,70,3000,7000,0,0,4301.84,3317.13,147.441,2.74981,'3470:0 3488:0 '),\n+(3488,'net1178',530,3523,3523,67,70,3000,7000,0,0,4181.61,3456.1,144.034,2.38458,'3489:0 3487:0 '),\n+(3489,'net1179',530,3523,3875,67,70,3000,7000,0,0,4137.43,3393.24,142.177,3.93968,'3488:0 3482:0 3490:0 '),\n+(3490,'net1180',530,3523,3523,67,70,3000,7000,0,0,4138.78,3496.33,135.37,2.48591,'3489:0 3491:0 3517:0 '),\n+(3491,'net1181',530,3523,3852,67,70,3000,7000,0,0,4091.57,3538.26,117.689,1.98718,'3490:0 3492:0 '),\n+(3492,'net1182',530,3523,3852,67,70,3000,7000,0,0,4069.39,3591.81,114.31,2.34453,'3491:0 3493:0 '),\n+(3493,'net1183',530,3523,3722,67,70,3000,7000,0,0,3910.13,3724.58,112.828,2.44664,'3492:0 3494:0 '),\n+(3494,'net1184',530,3523,3722,67,70,3000,7000,0,0,3891.58,3773.08,119.636,1.37064,'3493:0 3495:0 3510:0 '),\n+(3495,'net1185',530,3523,3722,67,70,3000,7000,0,0,3908.92,3833.69,129.749,1.2921,'3494:0 3496:0 '),\n+(3496,'net1186',530,3523,3722,67,70,3000,7000,0,0,3990.07,3844.3,168.636,3.74058,'3495:0 3497:0 '),\n+(3497,'net1188',530,3523,3722,67,70,3000,7000,0,0,3883.22,3936.25,179.58,1.96754,'3496:0 3498:0 '),\n+(3498,'net1189',530,3523,3722,67,70,3000,7000,0,0,3884.07,3990.71,182.988,1.21356,'3499:0 3509:0 3497:0 '),\n+(3499,'net1190',530,3523,3722,67,70,3000,7000,0,0,3912.9,4038.34,190.499,6.07518,'3498:0 3500:0 '),\n+(3500,'net1191',530,3523,3722,67,70,3000,7000,0,0,3973.04,4023.83,194.227,6.0634,'3499:0 3501:0 3503:0 '),\n+(3501,'net1192',530,3523,3722,67,70,3000,7000,0,0,4018.79,4051.87,194.227,0.549902,'3500:0 3502:0 3506:0 '),\n+(3502,'net1193',530,3523,3722,67,70,3000,7000,0,0,4047.95,4004.82,194.226,3.89178,'3501:0 3503:0 '),\n+(3503,'net1194',530,3523,3722,67,70,3000,7000,0,0,4001.04,3975.21,194.226,3.74256,'3502:0 3500:0 3504:0 '),\n+(3504,'net1195',530,3523,3722,67,70,3000,7000,0,0,3987.35,3916.16,191.701,4.48476,'3503:0 3505:0 '),\n+(3505,'net1196',530,3523,3722,67,70,3000,7000,0,0,4046.25,3890.47,189.426,0.432092,'3504:0 '),\n+(3506,'net1197',530,3523,3722,67,70,3000,7000,0,0,4034.82,4111.42,191.69,4.44076,'3501:0 3507:0 '),\n+(3507,'net1198',530,3523,3722,67,70,3000,7000,0,0,4009.09,4170.41,196.566,3.6907,'3506:0 3508:0 '),\n+(3508,'net1199',530,3523,3722,67,70,3000,7000,0,0,3913.64,4108.63,193.142,4.23262,'3507:0 3509:0 '),\n+(3509,'net1200',530,3523,3722,67,70,3000,7000,0,0,3881.18,4041.13,183.645,4.80596,'3508:0 3498:0 '),\n+(3510,'net1202',530,3523,3722,67,70,3000,7000,0,0,3793.14,3905.54,108.811,1.48529,'3494:0 3511:0 '),\n+(3511,'net1203',530,3523,3881,67,70,3000,7000,0,0,3802.78,4013.52,122.041,4.63866,'3512:0 3510:0 '),\n+(3512,'net1204',530,3523,3881,67,70,3000,7000,0,0,3873.36,4009.36,122.335,5.89452,'3511:0 3513:0 '),\n+(3513,'net1205',530,3523,3881,67,70,3000,7000,0,0,3925.68,3980.18,123.291,0.96222,'3512:0 3514:0 '),\n+(3514,'net1206',530,3523,3881,67,70,3000,7000,0,0,3946.32,4028.85,115.31,5.07772,'3513:0 3515:0 '),\n+(3515,'net1207',530,3523,3881,67,70,3000,7000,0,0,4034.51,3981.16,124.954,0.0315266,'3514:0 3516:0 '),\n+(3516,'net1208',530,3523,3881,67,70,3000,7000,0,0,4093.15,3979.78,116.913,6.25973,'3515:0 '),\n+(3517,'net1209',530,3523,3523,67,70,3000,7000,0,0,4192.46,3560.85,141.75,3.80144,'3490:0 3518:0 '),\n+(3518,'net1210',530,3523,3721,67,70,3000,7000,0,0,4226.42,3607.77,132.686,0.593084,'3517:0 3519:0 '),\n+(3519,'net1212',530,3523,3721,67,70,3000,7000,0,0,4313.98,3676.81,118.894,5.57251,'3518:0 3520:0 '),\n+(3520,'net1213',530,3523,3523,67,70,3000,7000,0,0,4402.34,3609.63,125.622,5.65104,'3521:0 3519:0 '),\n+(3521,'net1214',530,3523,3523,67,70,3000,7000,0,0,4488.77,3626.57,104.723,0.252208,'3520:0 3522:0 '),\n+(3522,'net1215',530,3523,3721,67,70,3000,7000,0,0,4533.39,3589.74,117.794,5.57721,'3521:0 '),\n+(3523,'net1216',530,3523,3740,67,70,3000,7000,0,0,4515.18,3245.18,144.362,1.06117,'3463:0 3470:0 3524:0 '),\n+(3524,'net1217',530,3523,3740,67,70,3000,7000,0,0,4540.26,3296.59,134.776,0.813774,'3523:0 3525:0 '),\n+(3525,'net1218',530,3523,3523,67,70,3000,7000,0,0,4586.71,3342.4,125.714,0.566373,'3524:0 3526:0 '),\n+(3526,'net1219',530,3523,3523,67,70,3000,7000,0,0,4668.88,3392.34,110.519,0.444637,'3525:0 3527:0 '),\n+(3527,'net1220',530,3523,3900,67,70,3000,7000,0,0,4744.11,3423.26,102.517,0.629205,'3526:0 3528:0 '),\n+(3528,'net1221',530,3523,3900,67,70,3000,7000,0,0,4791.18,3452.42,102.703,5.32589,'3527:0 3529:0 '),\n+(3529,'net1222',530,3523,3523,67,70,3000,7000,0,0,4831.57,3384.27,122,4.79967,'3528:0 3530:0 '),\n+(3530,'net1223',530,3523,3523,67,70,3000,7000,0,0,4850.84,3313.75,131.13,3.99465,'3529:0 3531:0 '),\n+(3531,'net1224',530,3523,3523,67,70,3000,7000,0,0,4816.07,3269.64,149.703,0.982658,'3530:0 3532:0 '),\n+(3532,'net1225',530,3523,3523,67,70,3000,7000,0,0,4832.65,3173.12,139.44,1.878,'3531:0 3533:0 '),\n+(3533,'net1226',530,3523,3523,67,70,3000,7000,0,0,4806.1,3117.37,139.757,4.67009,'3532:0 3450:0 '),\n+(3534,'shmv1227',530,3520,3520,67,70,3000,7000,0,0,-2866.67,3174.8,12.0966,4.03472,'2763:0 3535:0 '),\n+(3535,'shmv1228',530,3520,3520,67,70,3000,7000,0,0,-2919.41,3080.6,39.7651,0.776879,'3534:0 3536:0 '),\n+(3536,'shmv1229',530,3520,3520,67,70,3000,7000,0,0,-2912.13,3021.5,54.1235,3.61375,'3535:0 3537:0 '),\n+(3537,'shmv1230',530,3520,3520,67,70,3000,7000,0,0,-3025.35,2947.82,86.1102,3.93969,'3536:0 3538:0 '),\n+(3538,'shmv1231',530,3520,3743,67,70,3000,7000,0,0,-3075.55,2877.97,82.0334,3.71192,'3537:0 3539:0 3546:0 3703:0 '),\n+(3539,'shmv1232',530,3520,3743,67,70,3000,7000,0,0,-3179.64,2866.95,94.9902,2.90296,'3538:0 3540:0 '),\n+(3540,'shmv1233',530,3520,3743,67,70,3000,7000,0,0,-3236.04,2882.68,114.136,3.1857,'3539:0 3541:0 3700:0 '),\n+(3541,'shmv1234',530,3520,3743,67,70,3000,7000,0,0,-3367.61,2868.56,158.738,3.24853,'3540:0 3542:0 3545:0 '),\n+(3542,'shmv1235',530,3520,3743,67,70,3000,7000,0,0,-3404.24,2930.17,169.88,0.354339,'3541:0 3543:0 '),\n+(3543,'shmv1236',530,3520,3743,67,70,3000,7000,0,0,-3346.8,2955.36,169.88,0.413244,'3542:0 3544:0 '),\n+(3544,'shmv1237',530,3520,3743,67,70,3000,7000,0,0,-3375.43,3001.18,170.817,2.12933,'3543:0 3545:0 '),\n+(3545,'shmv1238',530,3520,3743,67,70,3000,7000,0,0,-3444.14,2938.58,172.959,3.88077,'3544:0 3541:0 '),\n+(3546,'shmv1239',530,3520,3520,67,70,3000,7000,0,0,-3181.96,2718.28,68.7275,4.12424,'3538:0 3547:0 3556:0 '),\n+(3547,'shmv1240',530,3520,3744,67,70,3000,7000,0,0,-3176.94,2562.78,61.0113,0.102998,'3546:0 3548:0 3557:0 '),\n+(3548,'shmv1241',530,3520,3744,67,70,3000,7000,0,5,-3111.48,2564.12,61.7347,0.0205314,'3547:0 3549:0 '),\n+(3549,'shmv1242',530,3520,3744,67,70,3000,7000,0,5,-3059.25,2507.74,62.9718,4.55621,'3548:0 3550:0 '),\n+(3550,'shmv1243',530,3520,3744,67,70,3000,7000,0,4,-3069.01,2436.27,63.7223,4.4227,'3549:0 3551:0 '),\n+(3551,'shmv1244',530,3520,3520,67,70,3000,7000,0,0,-3123.06,2321.13,59.93,3.60981,'3550:0 3552:0 3558:0 '),\n+(3552,'shmv1245',530,3520,3520,67,70,3000,7000,0,0,-3231.28,2289.35,59.5698,4.92143,'3551:0 3553:0 3606:0 '),\n+(3553,'shmv1246',530,3520,3520,67,70,3000,7000,0,0,-3462.86,2282.37,63.8282,3.30352,'3552:0 3554:0 3559:0 '),\n+(3554,'shmv1247',530,3520,3949,67,70,3000,7000,0,0,-3455.95,2462.16,58.5579,1.65025,'3553:0 3555:0 3606:0 '),\n+(3555,'shmv1248',530,3520,3520,67,70,3000,7000,0,0,-3483.53,2605.88,62.0554,4.92536,'3554:0 3556:0 3704:0 '),\n+(3556,'shmv1249',530,3520,3520,67,70,3000,7000,0,0,-3301.81,2669.56,57.3856,0.154061,'3555:0 3546:0 3557:0 '),\n+(3557,'shmv1250',530,3520,3744,67,70,3000,7000,0,0,-3199.36,2470.72,62.1645,2.00446,'3556:0 3547:0 3558:0 '),\n+(3558,'shmv1251',530,3520,3520,67,70,3000,7000,0,0,-3210.03,2392.06,61.8107,5.34555,'3551:0 3557:0 '),\n+(3559,'shmv1252',530,3520,3520,67,70,3000,7000,0,0,-3690.32,2310.79,78.5618,6.17099,'3553:0 3560:0 3566:0 3704:0 '),\n+(3560,'shmv1253',530,3520,3752,67,70,3000,7000,0,0,-3792.84,2478.03,79.8242,1.51751,'3559:0 3561:0 3565:0 '),\n+(3561,'shmv1254',530,3520,3752,67,70,3000,7000,0,0,-3790.89,2565.75,91.2376,1.68244,'3560:0 3562:0 3563:0 '),\n+(3562,'shmv1255',530,3520,3752,67,70,3000,7000,0,0,-3793.32,2666.77,101.912,1.6471,'3561:0 '),\n+(3563,'shmv1256',530,3520,3752,67,70,3000,7000,0,0,-4020.54,2670.54,126.986,4.24676,'3561:0 3564:0 '),\n+(3564,'shmv1257',530,3520,3752,67,70,3000,7000,0,0,-4064.49,2549.64,134.278,5.45704,'3563:0 3565:0 '),\n+(3565,'shmv1258',530,3520,3752,67,70,3000,7000,0,0,-3950.4,2473.76,116.781,0.0024457,'3564:0 3560:0 '),\n+(3566,'shmv1259',530,3520,3745,67,70,3000,7000,0,0,-3762.45,2127.89,76.7131,3.78807,'3559:0 3567:0 3570:0 '),\n+(3567,'shmv1260',530,3520,3745,67,70,3000,7000,0,2,-3882.03,2033.78,96.002,2.18978,'3566:0 3568:0 3570:0 '),\n+(3568,'shmv1261',530,3520,3745,67,70,3000,7000,0,3,-3952.84,2136.12,98.2022,2.21727,'3567:0 3569:0 '),\n+(3569,'shmv1262',530,3520,3745,67,70,3000,7000,0,3,-3972.41,2203.81,101.676,5.04862,'3568:0 '),\n+(3570,'shmv1263',530,3520,3520,67,70,3000,7000,0,0,-3769.55,1947.31,94.6509,4.07473,'3566:0 3567:0 3571:0 '),\n+(3571,'shmv1264',530,3520,3520,67,70,3000,7000,0,0,-3890.57,1771.31,96.9587,3.89017,'3570:0 3572:0 3607:0 '),\n+(3572,'shmv1265',530,3520,3520,67,70,3000,7000,0,0,-4052.33,1643.87,94.7068,4.5499,'3571:0 3573:0 '),\n+(3573,'shmv1266',530,3520,3520,67,70,3000,7000,0,0,-4057.55,1395.83,83.9803,4.95438,'3572:0 3574:0 3618:0 3633:0 '),\n+(3574,'shmv1267',530,3520,3520,67,70,3000,7000,0,0,-4028.73,1253.84,79.0241,1.89525,'3573:0 3575:0 '),\n+(3575,'shmv1268',530,3520,3520,67,70,3000,7000,0,0,-3956.14,1083.59,27.6555,5.11538,'3574:0 3576:0 3638:0 3725:0 '),\n+(3576,'shmv1269',530,3520,3520,67,70,3000,7000,0,0,-3882.17,883.51,18.5293,4.46743,'3575:0 3577:0 3639:0 '),\n+(3577,'shmv1270',530,3520,3520,67,70,3000,7000,0,0,-3840.27,741.517,11.8649,0.0181477,'3576:0 3578:0 3639:0 '),\n+(3578,'shmv1271',530,3520,3520,67,70,3000,7000,0,0,-3586.49,737.497,-11.4566,0.0534906,'3577:0 3579:0 3581:0 3732:0 '),\n+(3579,'shmv1272',530,3520,3520,67,70,3000,7000,0,0,-3561.52,586.272,10.6201,4.78552,'3578:0 3580:0 3647:0 3659:0 '),\n+(3580,'shmv1273',530,3520,3520,67,70,3000,7000,0,0,-3569.67,423.902,28.3305,4.75019,'3579:0 '),\n+(3581,'shmv1274',530,3520,3520,67,70,3000,7000,0,0,-3346.71,753.909,-26.6716,0.0849111,'3578:0 3582:0 3683:0 '),\n+(3582,'shmv1275',530,3520,3520,67,70,3000,7000,0,0,-3232.2,784.314,-19.8198,0.00243998,'3581:0 3583:0 '),\n+(3583,'shmv1276',530,3520,3754,67,70,3000,7000,0,0,-3120.7,799.898,-22.5484,1.24337,'3582:0 3584:0 3671:0 '),\n+(3584,'shmv1277',530,3520,3520,67,70,3000,7000,0,0,-3121.46,1102.68,20.44,1.2473,'3583:0 3585:0 3671:0 '),\n+(3585,'shmv1278',530,3520,3753,67,70,3000,7000,0,0,-3106.91,1197.3,22.976,1.40439,'3584:0 3586:0 3679:0 3680:0 '),\n+(3586,'shmv1279',530,3520,3520,67,70,3000,7000,0,0,-3026.37,1314.44,8.68562,0.968488,'3585:0 3587:0 3687:0 '),\n+(3587,'shmv1280',530,3520,3520,67,70,3000,7000,0,0,-2904.03,1491.38,14.8027,0.960634,'3586:0 3588:0 '),\n+(3588,'shmv1281',530,3520,3750,67,70,3000,7000,0,0,-2867.58,1577.53,15.2282,2.85737,'3587:0 3589:0 3705:0 '),\n+(3589,'shmv1282',530,3520,3750,67,70,3000,7000,0,0,-2824.65,1682.74,22.3429,1.17662,'3588:0 3590:0 '),\n+(3590,'shmv1283',530,3520,3750,67,70,3000,7000,0,0,-2886.26,1742.5,43.8502,2.40576,'3589:0 3591:0 '),\n+(3591,'shmv1284',530,3520,3520,67,70,3000,7000,0,0,-2975.68,1908,104.519,2.08612,'3590:0 3592:0 '),\n+(3592,'shmv1285',530,3520,3520,67,70,3000,7000,0,0,-3102.48,1972.24,105.605,0.868752,'3591:0 3593:0 3596:0 '),\n+(3593,'shmv1286',530,3520,3520,67,70,3000,7000,0,0,-3180.63,2099.72,75.4619,0.291484,'3592:0 3594:0 3597:0 '),\n+(3594,'shmv1287',530,3520,3933,67,70,3000,7000,0,0,-3042.81,2156.41,79.2338,0.393586,'3593:0 3595:0 '),\n+(3595,'shmv1288',530,3520,3933,67,70,3000,7000,0,0,-3015.9,2104.22,90.4026,4.71721,'3594:0 3596:0 '),\n+(3596,'shmv1289',530,3520,3933,67,70,3000,7000,0,0,-3017.6,2046.19,96.9335,3.75903,'3595:0 3592:0 '),\n+(3597,'shmv1290',530,3520,3748,67,70,3000,7000,0,0,-3265.68,2066.96,73.9146,4.35987,'3593:0 3606:0 3598:0 '),\n+(3598,'shmv1291',530,3520,3748,67,70,3000,7000,0,0,-3287.9,1978.44,52.6152,2.07043,'3597:0 3602:0 '),\n+(3599,'shmv1294',530,3520,3748,67,70,3000,7000,0,0,-3389.68,1984.65,24.8931,1.53832,'3600:0 3602:0 '),\n+(3600,'shmv1295',530,3520,3748,67,70,3000,7000,0,0,-3405.52,2054.01,15.1476,3.06395,'3601:0 3599:0 '),\n+(3601,'shmv1296',530,3520,3748,67,70,3000,7000,0,0,-3321.42,2125.97,3.08638,2.40814,'3600:0 '),\n+(3602,'shmv1297',530,3520,3748,67,70,3000,7000,0,0,-3343.59,2008.19,32.1771,2.00758,'3603:0 3599:0 3598:0 '),\n+(3603,'shmv1298',530,3520,3748,67,70,3000,7000,0,0,-3419.14,2114.58,34.4588,2.18822,'3602:0 3604:0 '),\n+(3604,'shmv1299',530,3520,3748,67,70,3000,7000,0,0,-3495.43,2186.55,33.5276,5.96992,'3603:0 3605:0 '),\n+(3605,'shmv1301',530,3520,3748,67,70,3000,7000,0,0,-3410.98,2272.59,33.8565,1.54813,'3604:0 '),\n+(3606,'shmv1302',530,3520,3949,67,70,3000,7000,0,0,-3336.88,2207.97,74.9806,2.06645,'3597:0 3552:0 3554:0 '),\n+(3607,'shmv1303',530,3520,3932,67,70,3000,7000,0,0,-4003.29,1878.34,76.5277,5.50491,'3571:0 3608:0 '),\n+(3608,'shmv1304',530,3520,3932,67,70,3000,7000,0,0,-4085.04,1923.15,77.0726,5.10829,'3607:0 3609:0 '),\n+(3609,'shmv1305',530,3520,3932,67,70,3000,7000,0,0,-4058.27,1821.93,84.9857,4.00088,'3608:0 3610:0 '),\n+(3610,'shmv1306',530,3520,3932,67,70,3000,7000,0,0,-4103.15,1784.26,103.457,4.80985,'3609:0 3611:0 '),\n+(3611,'shmv1307',530,3520,3932,67,70,3000,7000,0,0,-4195.07,1861.58,109.916,5.5167,'3610:0 3612:0 '),\n+(3612,'shmv1308',530,3520,3822,67,70,3000,7000,0,0,-4334.08,1789.5,144.816,3.61996,'3611:0 3613:0 '),\n+(3613,'shmv1309',530,3520,3822,67,70,3000,7000,0,0,-4420.11,1797.35,157.396,4.44855,'3612:0 3614:0 3622:0 '),\n+(3614,'shmv1310',530,3520,3822,67,70,3000,7000,0,0,-4448.82,1724.98,158.876,4.33467,'3613:0 3615:0 3620:0 '),\n+(3615,'shmv1311',530,3520,3822,67,70,3000,7000,0,0,-4383.86,1707.44,156.573,5.0533,'3614:0 3616:0 '),\n+(3616,'shmv1312',530,3520,3822,67,70,3000,7000,0,0,-4361,1640.49,156.748,5.04152,'3615:0 3617:0 3619:0 '),\n+(3617,'shmv1313',530,3520,3822,67,70,3000,7000,0,0,-4252.69,1521.47,129.453,5.45072,'3616:0 3618:0 3626:0 '),\n+(3618,'shmv1314',530,3520,3822,67,70,3000,7000,0,0,-4141.51,1512.19,103.518,6.20863,'3617:0 3573:0 '),\n+(3619,'shmv1315',530,3520,3822,67,70,3000,7000,0,0,-4423.22,1575.75,164.241,3.96398,'3616:0 3620:0 '),\n+(3620,'shmv1316',530,3520,3822,67,70,3000,7000,0,0,-4491.12,1668.12,165.043,2.20469,'3619:0 3614:0 3621:0 '),\n+(3621,'shmv1317',530,3520,3822,67,70,3000,7000,0,0,-4564.8,1670.31,174.579,3.11182,'3620:0 '),\n+(3622,'shmv1318',530,3520,3520,67,70,3000,7000,0,0,-4426.81,1860.99,159.258,2.50232,'3613:0 3623:0 '),\n+(3623,'shmv1319',530,3520,3930,67,70,3000,7000,0,0,-4488.03,1934.26,144.075,1.12787,'3622:0 3624:0 '),\n+(3624,'shmv1320',530,3520,3930,67,70,3000,7000,0,0,-4450.04,1988.33,105.344,2.32482,'3623:0 3625:0 '),\n+(3625,'shmv1321',530,3520,3930,67,70,3000,7000,0,0,-4500.91,2022.31,100.196,4.19013,'3624:0 '),\n+(3626,'shmv1323',530,3520,3929,67,70,3000,7000,0,0,-4234.47,1405.21,129.348,4.72107,'3617:0 3627:0 '),\n+(3627,'shmv1324',530,3520,3929,67,70,3000,7000,0,0,-4309.54,1384.96,143.997,3.08352,'3626:0 3628:0 '),\n+(3628,'shmv1325',530,3520,3950,67,70,3000,7000,0,0,-4558.9,1328.47,135.392,6.27616,'3627:0 3629:0 '),\n+(3629,'shmv1326',530,3520,3929,67,70,3000,7000,0,0,-4452.67,1313.79,113.624,0.000826359,'3628:0 3630:0 '),\n+(3630,'shmv1327',530,3520,3929,67,70,3000,7000,0,0,-4318.73,1322.33,73.5928,6.21333,'3629:0 3631:0 3634:0 '),\n+(3631,'shmv1328',530,3520,3929,67,70,3000,7000,0,0,-4226.21,1305.14,56.0568,6.20155,'3630:0 3632:0 '),\n+(3632,'shmv1329',530,3520,3929,67,70,3000,7000,0,0,-4117.45,1299.67,52.606,1.29281,'3631:0 3633:0 '),\n+(3633,'shmv1330',530,3520,3520,67,70,3000,7000,0,0,-4096.52,1451.91,87.6478,5.2198,'3632:0 3573:0 '),\n+(3634,'shmv1331',530,3520,3929,67,70,3000,7000,0,0,-4403.59,1300.45,84.0575,3.42125,'3630:0 3635:0 '),\n+(3635,'shmv1332',530,3520,3520,67,70,3000,7000,0,0,-4511.47,1203.3,34.9082,3.43695,'3634:0 3636:0 '),\n+(3636,'shmv1333',530,3520,3945,67,70,3000,7000,0,0,-4641.99,1163.55,-14.0182,0.205018,'3635:0 3637:0 '),\n+(3637,'shmv1334',530,3520,3945,67,70,3000,7000,0,0,-4660.62,1088.53,0.90432,5.98162,'3636:0 '),\n+(3638,'shmv1335',530,3520,3938,67,70,3000,7000,0,1,-4090.85,1104.54,41.0582,5.28662,'3575:0 3639:0 '),\n+(3639,'shmv1336',530,3520,3758,67,70,3000,7000,0,0,-4110.45,861.06,9.26995,4.56397,'3638:0 3576:0 3577:0 3640:0 '),\n+(3640,'shmv1337',530,3520,3939,67,70,3000,7000,0,0,-4149.68,586.65,8.64057,4.66214,'3639:0 3641:0 '),\n+(3641,'shmv1338',530,3520,3939,67,70,3000,7000,0,0,-4184.61,489.528,29.5585,1.24958,'3642:0 3643:0 3640:0 '),\n+(3642,'shmv1339',530,3520,3939,67,70,3000,7000,0,0,-4114.39,424.914,34.9882,2.74575,'3641:0 '),\n+(3643,'shmv1341',530,3520,3939,67,70,3000,7000,0,0,-4224.07,420.493,51.1341,1.46947,'3641:0 3644:0 '),\n+(3644,'shmv1342',530,3520,3939,67,70,3000,7000,0,0,-4299.45,334.074,109.437,3.99453,'3643:0 3645:0 '),\n+(3645,'shmv1344',530,3520,3939,67,70,3000,7000,0,0,-4202.19,250.869,124.805,2.69862,'3644:0 3646:0 '),\n+(3646,'shmv1345',530,3520,3939,67,70,3000,7000,0,0,-4203.68,345.854,115.285,1.493,'3645:0 '),\n+(3647,'shmv1346',530,3520,3520,67,70,3000,7000,0,0,-3501.72,557.894,16.7235,0.323666,'3579:0 3648:0 '),\n+(3648,'shmv1347',530,3520,3757,67,70,3000,7000,0,0,-3426.99,580.376,42.2179,5.95105,'3647:0 3649:0 '),\n+(3649,'shmv1348',530,3520,3757,67,70,3000,7000,0,0,-3327.45,544.282,74.5225,4.63944,'3648:0 3650:0 '),\n+(3650,'shmv1349',530,3520,3757,67,70,3000,7000,0,0,-3333.62,454.382,99.8124,6.05315,'3649:0 3651:0 3658:0 '),\n+(3651,'shmv1350',530,3520,3757,67,70,3000,7000,0,0,-3228.24,439.514,104.731,3.31604,'3650:0 3652:0 '),\n+(3652,'shmv1351',530,3520,3757,67,70,3000,7000,0,0,-3392.06,415.921,103.96,4.61195,'3651:0 3653:0 3658:0 '),\n+(3653,'shmv1352',530,3520,3757,67,70,3000,7000,0,0,-3390.43,293.527,103.961,4.72583,'3652:0 3654:0 '),\n+(3654,'shmv1353',530,3520,3757,67,70,3000,7000,0,0,-3337.54,294.86,116.382,1.36824,'3653:0 3655:0 '),\n+(3655,'shmv1354',530,3520,3757,67,70,3000,7000,0,0,-3324.03,371.217,120.458,5.9746,'3654:0 3656:0 '),\n+(3656,'shmv1355',530,3520,3757,67,70,3000,7000,0,0,-3231.77,337.352,127.504,4.49021,'3655:0 3657:0 '),\n+(3657,'shmv1356',530,3520,3757,67,70,3000,7000,0,0,-3239.92,279.443,137.131,4.57267,'3656:0 '),\n+(3658,'shmv1357',530,3520,3757,67,70,3000,7000,0,0,-3416.2,459.709,103.935,5.91964,'3650:0 3652:0 '),\n+(3659,'shmv1358',530,3520,3756,67,70,3000,7000,0,0,-3685.39,550.038,35.0742,2.93905,'3579:0 3660:0 '),\n+(3660,'shmv1359',530,3520,3756,67,70,3000,7000,0,0,-3813.8,565.02,71.7251,4.91432,'3659:0 3661:0 '),\n+(3661,'shmv1360',530,3520,3756,67,70,3000,7000,0,0,-3802.41,461.803,99.9172,4.68655,'3660:0 3662:0 3670:0 '),\n+(3662,'shmv1361',530,3520,3756,67,70,3000,7000,0,0,-3896.83,442.087,104.97,6.26668,'3661:0 3663:0 '),\n+(3663,'shmv1362',530,3520,3756,67,70,3000,7000,0,0,-3719.39,417.216,104.061,2.6833,'3662:0 3664:0 3670:0 '),\n+(3664,'shmv1363',530,3520,3756,67,70,3000,7000,0,0,-3732.23,295.716,104.066,3.10939,'3663:0 3665:0 '),\n+(3665,'shmv1364',530,3520,3756,67,70,3000,7000,0,0,-3786.92,297.908,116.455,3.10153,'3664:0 3666:0 '),\n+(3666,'shmv1365',530,3520,3756,67,70,3000,7000,0,0,-3812.37,248.065,120.604,1.80405,'3665:0 3667:0 '),\n+(3667,'shmv1366',530,3520,3756,67,70,3000,7000,0,0,-3838.38,357.549,120.582,1.80405,'3666:0 3668:0 '),\n+(3668,'shmv1367',530,3520,3756,67,70,3000,7000,0,0,-3904.87,343.016,127.62,4.76657,'3667:0 3669:0 '),\n+(3669,'shmv1368',530,3520,3756,67,70,3000,7000,0,0,-3890.45,282.542,137.239,3.8665,'3668:0 '),\n+(3670,'shmv1369',530,3520,3756,67,70,3000,7000,0,0,-3719.66,475.869,104.038,4.2914,'3663:0 3661:0 '),\n+(3671,'shmv1370',530,3520,3754,67,70,3000,7000,0,0,-3124.49,886.832,-14.3889,1.56135,'3583:0 3584:0 3672:0 '),\n+(3672,'shmv1371',530,3520,3754,67,70,3000,7000,0,1,-3061.33,830.398,-10.215,4.92836,'3671:0 3673:0 '),\n+(3673,'shmv1372',530,3520,3520,67,70,3000,7000,0,0,-3030.95,544.921,-1.12904,0.00390148,'3672:0 3674:0 '),\n+(3674,'shmv1373',530,3520,3520,67,70,3000,7000,0,0,-2881.37,547.854,-13.197,0.0196085,'3673:0 3675:0 '),\n+(3675,'shmv1374',530,3520,3520,67,70,3000,7000,0,0,-2744.62,677.917,-16.4588,1.42468,'3674:0 3676:0 '),\n+(3676,'shmv1375',530,3520,3520,67,70,3000,7000,0,0,-2720.25,857.215,-3.3875,4.54664,'3675:0 3677:0 '),\n+(3677,'shmv1376',530,3520,3520,67,70,3000,7000,0,0,-2768.24,985.559,-2.57223,2.06085,'3676:0 3678:0 '),\n+(3678,'shmv1377',530,3520,3520,67,70,3000,7000,0,0,-2871.08,1130.08,8.92665,3.16433,'3677:0 3679:0 '),\n+(3679,'shmv1378',530,3520,3520,67,70,3000,7000,0,0,-2984.92,1134.44,-3.92959,2.62712,'3678:0 3585:0 '),\n+(3680,'shmv1379',530,3520,3753,67,70,3000,7000,0,0,-3245.6,1189.8,59.4774,4.33927,'3585:0 3681:0 3685:0 '),\n+(3681,'shmv1380',530,3520,3753,67,70,3000,7000,0,0,-3222.89,1092.48,64.7857,6.14175,'3680:0 3682:0 3685:0 3686:0 '),\n+(3682,'shmv1381',530,3520,3753,67,70,3000,7000,0,0,-3292.57,985.163,40.7467,5.15608,'3681:0 3684:0 '),\n+(3683,'shmv1382',530,3520,3753,67,70,3000,7000,0,0,-3344.18,870.1,-14.6762,4.80342,'3581:0 3684:0 '),\n+(3684,'shmv1383',530,3520,3753,67,70,3000,7000,0,0,-3205.87,897.037,49.1172,0.192352,'3683:0 3682:0 '),\n+(3685,'shmv1384',530,3520,3753,67,70,3000,7000,0,0,-3399.1,1175.31,50.0129,3.15252,'3680:0 3681:0 3686:0 '),\n+(3686,'shmv1385',530,3520,3753,67,70,3000,7000,0,0,-3335.34,1043.32,47.1116,0.383668,'3681:0 3685:0 3726:0 '),\n+(3687,'shmv1386',530,3520,3749,67,70,3000,7000,0,0,-2929.04,1324.33,7.92349,5.43769,'3586:0 3688:0 '),\n+(3688,'shmv1387',530,3520,3749,67,70,3000,7000,0,0,-2845.89,1301.54,6.02801,3.20519,'3687:0 3689:0 '),\n+(3689,'shmv1388',530,3520,3749,67,70,3000,7000,0,0,-2847.46,1231.33,6.78906,1.62065,'3688:0 3690:0 '),\n+(3690,'shmv1390',530,3520,3749,67,70,3000,7000,0,0,-2732.51,1138.3,2.89233,2.40802,'3689:0 3691:0 '),\n+(3691,'shmv1391',530,3520,3749,67,70,3000,7000,0,0,-2634.08,1230.04,11.146,1.86804,'3692:0 3690:0 '),\n+(3692,'shmv1392',530,3520,3749,67,70,3000,7000,0,0,-2651.9,1282.45,26.4813,3.01869,'3691:0 3693:0 '),\n+(3693,'shmv1393',530,3520,3749,67,70,3000,7000,0,0,-2710.39,1300.75,33.7332,1.28218,'3692:0 3694:0 '),\n+(3694,'shmv1394',530,3520,3749,67,70,3000,7000,0,0,-2690.89,1361.98,35.0836,6.28124,'3693:0 3695:0 '),\n+(3695,'shmv1395',530,3520,3749,67,70,3000,7000,0,0,-2617.04,1355.97,37.2382,0.18183,'3694:0 3696:0 '),\n+(3696,'shmv1396',530,3520,3749,67,70,3000,7000,0,0,-2769.22,1301.12,33.2111,3.48993,'3695:0 3697:0 3699:0 '),\n+(3697,'shmv1397',530,3520,3749,67,70,3000,7000,0,0,-2721.9,1224.71,33.0771,5.26886,'3696:0 3698:0 '),\n+(3698,'shmv1398',530,3520,3749,67,70,3000,7000,0,0,-2817.63,1365.79,38.5145,5.53669,'3697:0 3699:0 '),\n+(3699,'shmv1399',530,3520,3749,67,70,3000,7000,0,0,-2766.14,1383.17,37.6732,0.325571,'3698:0 3696:0 '),\n+(3700,'shmv1400',530,3520,3743,67,70,3000,7000,0,0,-3280.76,3002.45,141.658,1.22092,'3540:0 3701:0 '),\n+(3701,'shmv1401',530,3520,3743,67,70,3000,7000,0,0,-3273.62,3077.71,139.787,0.31771,'3700:0 3702:0 '),\n+(3702,'shmv1402',530,3520,3743,67,70,3000,7000,0,0,-3211.67,3079.46,126.239,5.52566,'3701:0 3703:0 '),\n+(3703,'shmv1403',530,3520,3743,67,70,3000,7000,0,0,-3143.09,3024.9,104.296,5.41086,'3538:0 3702:0 '),\n+(3704,'shmv1405',530,3520,3752,67,70,3000,7000,0,0,-3656.3,2553.97,77.5087,0.0120506,'3555:0 3559:0 '),\n+(3705,'shmv1406',530,3520,3750,67,70,3000,7000,0,0,-2941.74,1589.4,40.8211,2.08903,'3588:0 3706:0 '),\n+(3706,'shmv1407',530,3520,3750,67,70,3000,7000,0,0,-2978.15,1677.35,67.3118,2.1715,'3705:0 3707:0 '),\n+(3707,'shmv1408',530,3520,3750,67,70,3000,7000,0,0,-3032.93,1672.83,67.4735,3.60878,'3706:0 3708:0 3711:0 '),\n+(3708,'shmv1409',530,3520,3750,67,70,3000,7000,0,0,-3131.22,1754.16,79.6664,2.79589,'3707:0 3709:0 '),\n+(3709,'shmv1410',530,3520,3750,67,70,3000,7000,0,0,-3191.61,1765.69,88.3304,2.95297,'3708:0 3710:0 '),\n+(3710,'shmv1411',530,3520,3520,67,70,3000,7000,0,0,-3345.81,1700.42,95.7466,5.65474,'3709:0 3711:0 '),\n+(3711,'shmv1412',530,3520,3520,67,70,3000,7000,0,0,-3188.39,1586.02,63.3792,0.565352,'3710:0 3707:0 3712:0 3714:0 '),\n+(3712,'shmv1413',530,3520,3520,67,70,3000,7000,0,0,-3052.53,1476.53,17.9049,2.50057,'3711:0 3713:0 '),\n+(3713,'shmv1414',530,3520,3520,67,70,3000,7000,0,0,-3107.69,1379.15,12.0022,4.19702,'3712:0 '),\n+(3714,'shmv1415',530,3520,3750,67,70,3000,7000,0,0,-3103.19,1550.28,39.5694,2.77978,'3711:0 3715:0 '),\n+(3715,'shmv1416',530,3520,3520,67,70,3000,7000,0,0,-3196.31,1501.96,57.1479,2.95256,'3714:0 3716:0 '),\n+(3716,'shmv1417',530,3520,3747,67,70,3000,7000,0,0,-3282.99,1527.47,52.2295,5.92921,'3715:0 3717:0 '),\n+(3717,'shmv1418',530,3520,3747,67,70,3000,7000,0,0,-3394.49,1550.46,48.1579,2.93214,'3716:0 3718:0 '),\n+(3718,'shmv1419',530,3520,3747,67,70,3000,7000,0,0,-3500.47,1622.81,43.8418,3.38295,'3717:0 3719:0 '),\n+(3719,'shmv1420',530,3520,3747,67,70,3000,7000,0,0,-3693.06,1558.48,46.9758,1.02649,'3718:0 3720:0 '),\n+(3720,'shmv1421',530,3520,3747,67,70,3000,7000,0,0,-3828.74,1475.85,43.1674,4.10996,'3719:0 3721:0 '),\n+(3721,'shmv1422',530,3520,3747,67,70,3000,7000,0,0,-3888.12,1398.74,43.6642,4.04478,'3720:0 3722:0 '),\n+(3722,'shmv1423',530,3520,3747,67,70,3000,7000,0,0,-3858.68,1336.7,42.2274,4.47911,'3721:0 3723:0 '),\n+(3723,'shmv1424',530,3520,3747,67,70,3000,7000,0,0,-3883.95,1244.97,42.1164,4.44376,'3722:0 3724:0 3725:0 '),\n+(3724,'shmv1425',530,3520,3520,67,70,3000,7000,0,0,-3774.38,1225.16,84.9138,6.04598,'3723:0 '),\n+(3725,'shmv1426',530,3520,3520,67,70,3000,7000,0,0,-3969.44,1164.97,46.6673,5.0878,'3723:0 3575:0 '),\n+(3726,'shmv1427',530,3520,3753,67,70,3000,7000,0,0,-3423.61,1074.97,42.8376,3.2539,'3686:0 3727:0 '),\n+(3727,'shmv1428',530,3520,3520,67,70,3000,7000,0,0,-3574.75,1067.86,40.499,3.19107,'3726:0 3728:0 '),\n+(3728,'shmv1429',530,3520,3821,67,70,3000,7000,0,0,-3680.33,1058.59,68.153,2.90833,'3727:0 3729:0 3730:0 '),\n+(3729,'shmv1430',530,3520,3821,67,70,3000,7000,0,0,-3760.76,1068.11,70.1361,6.14809,'3728:0 '),\n+(3730,'shmv1431',530,3520,3520,67,70,3000,7000,0,0,-3642.27,894.441,45.4124,5.92247,'3728:0 3731:0 '),\n+(3731,'shmv1432',530,3520,3520,67,70,3000,7000,0,0,-3522.57,841.492,-2.90146,4.68834,'3730:0 3732:0 '),\n+(3732,'shmv1433',530,3520,3520,67,70,3000,7000,0,0,-3522.09,776.814,-14.2281,4.71976,'3731:0 3578:0 '),\n+(3733,'bt001',571,3537,4129,68,73,3000,7000,0,5,2817.61,6168.46,85.5727,3.94245,'3734:0 '),\n+(3734,'bt002',571,3537,4020,68,73,3000,7000,0,5,2726.11,6082.88,72.3512,3.45943,'3733:0 3735:0 '),\n+(3735,'bt003',571,3537,4020,68,73,3000,7000,0,0,2604.99,6083.81,53.2961,2.26563,'3734:0 3736:0 3786:0 '),\n+(3736,'bt004',571,3537,4020,68,73,3000,7000,0,0,2505.63,6178.07,53.1691,5.59574,'3735:0 3737:0 3793:0 '),\n+(3737,'bt005',571,3537,4130,68,73,3000,7000,0,0,2589.16,6313.74,86.8706,0.137219,'3736:0 3738:0 3786:0 '),\n+(3738,'bt006',571,3537,3537,68,73,3000,7000,0,0,2818.32,6342.97,101.266,3.15078,'3737:0 3739:0 3745:0 '),\n+(3739,'bt007',571,3537,3537,68,73,3000,7000,0,0,2823.08,6550.12,55.029,4.6077,'3738:0 3740:0 3744:0 '),\n+(3740,'bt008',571,3537,4106,68,73,3000,7000,0,0,2946.88,6730.38,13.9226,0.998791,'3739:0 3741:0 3742:0 '),\n+(3741,'bt009',571,3537,4106,68,73,3000,7000,0,0,3100,6716.93,0.818624,2.88374,'3740:0 '),\n+(3742,'bt010',571,3537,4106,68,73,3000,7000,0,0,2769.6,6817.13,0.382068,5.63656,'3740:0 3743:0 '),\n+(3743,'bt011',571,3537,4031,68,73,3000,7000,0,0,2511.71,6709.76,8.65944,0.559735,'3742:0 3744:0 '),\n+(3744,'bt012',571,3537,4130,68,73,3000,7000,0,0,2598.94,6513.07,41.9513,4.98704,'3743:0 3739:0 '),\n+(3745,'bt013',571,3537,3537,68,73,3000,7000,0,0,2977.63,6387.87,96.0276,3.55919,'3738:0 3746:0 '),\n+(3746,'bt014',571,3537,3537,68,73,3000,7000,0,0,3117.74,6401.57,85.8869,4.84331,'3745:0 3747:0 '),\n+(3747,'bt015',571,3537,3537,68,73,3000,7000,0,0,3146.95,6242.85,96.6515,5.78972,'3746:0 3748:0 '),\n+(3748,'bt016',571,3537,4105,68,73,3000,7000,0,0,3332.48,6165.54,75.7667,2.87983,'3747:0 '),\n+(3749,'bt017',571,3537,3537,68,73,3000,7000,0,0,3270.88,5961.4,84.9677,4.81845,'3750:0 3751:0 3780:0 '),\n+(3750,'bt018',571,3537,3537,68,73,3000,7000,0,1,3624.25,5933.39,136.215,3.44596,'3751:0 3749:0 '),\n+(3751,'bt019',571,3537,4109,68,73,3000,7000,0,0,3297.83,5691.4,59.3737,4.58728,'3750:0 3752:0 3749:0 '),\n+(3752,'bt020',571,3537,3537,68,73,3000,7000,0,0,3304.79,5470.21,55.3479,4.73257,'3751:0 3753:0 3806:0 '),\n+(3753,'bt021',571,3537,3537,68,73,3000,7000,0,0,3482.47,5425.21,50.7507,1.49045,'3752:0 3754:0 '),\n+(3754,'bt022',571,3537,3537,68,73,3000,7000,0,0,3532.8,5540.21,65.5113,4.20635,'3753:0 3755:0 3891:0 '),\n+(3755,'bt023',571,3537,3537,68,73,3000,7000,0,0,3504.09,5638.44,63.5206,1.09146,'3754:0 3756:0 3891:0 '),\n+(3756,'bt024',571,3537,3537,68,73,3000,7000,0,0,3651.69,5686.01,66.2432,0.569961,'3755:0 3757:0 3891:0 '),\n+(3757,'bt025',571,3537,3537,68,73,3000,7000,0,0,3809.81,5773.85,68.3307,0.134065,'3756:0 3758:0 3891:0 '),\n+(3758,'bt026',571,3537,4127,68,73,3000,7000,0,0,3969.32,5781.55,74.0472,0.432523,'3757:0 3759:0 3850:0 '),\n+(3759,'bt027',571,3537,3537,68,73,3000,7000,0,0,4170.05,5855.36,62.8346,0.137999,'3758:0 3760:0 3770:0 3773:0 '),\n+(3760,'bt028',571,3537,3537,68,73,3000,7000,0,0,4324.68,6015.4,25.5474,1.07655,'3759:0 3761:0 '),\n+(3761,'bt029',571,3537,4099,68,73,3000,7000,0,0,4401.85,6148.33,0.553693,4.54723,'3760:0 3762:0 '),\n+(3762,'bt030',571,3537,4033,68,73,3000,7000,0,0,4287.27,6236.78,0.383892,3.29845,'3761:0 3763:0 '),\n+(3763,'bt031',571,3537,4033,68,73,3000,7000,0,0,4184.73,6193.42,9.12228,1.7952,'3762:0 3764:0 '),\n+(3764,'bt032',571,3537,4033,68,73,3000,7000,0,0,4149.36,6252.75,30.8789,2.52797,'3763:0 3765:0 3766:0 '),\n+(3765,'bt033',571,3537,4097,68,73,3000,7000,0,0,4056.14,6303.43,25.1363,1.18887,'3764:0 '),\n+(3766,'bt034',571,3537,4097,68,73,3000,7000,0,0,4052.65,6367.67,27.4251,1.08833,'3764:0 3767:0 3769:0 '),\n+(3767,'bt035',571,3537,4097,68,73,3000,7000,0,0,3991.71,6304.02,8.08314,0.901407,'3766:0 '),\n+(3768,'bt036',571,3537,4097,68,73,3000,7000,0,0,3854.4,6397.67,24.5748,5.34115,'3769:0 '),\n+(3769,'bt037',571,3537,4097,68,73,3000,7000,0,0,3960.88,6426.15,11.3447,0.519589,'3766:0 3768:0 '),\n+(3770,'bt038',571,3537,4134,68,73,3000,7000,0,0,4404.37,5906.55,55.8142,0.126085,'3759:0 3771:0 3772:0 '),\n+(3771,'bt039',571,3537,4132,68,73,3000,7000,0,0,4547.19,6017.64,76.7052,4.37901,'3770:0 '),\n+(3772,'bt040',571,3537,4122,68,73,3000,7000,0,5,4484.77,5763.64,79.4306,1.41963,'3770:0 3773:0 '),\n+(3773,'bt041',571,3537,4133,68,73,3000,7000,0,0,4321.96,5776.59,72.5697,2.66048,'3772:0 3759:0 '),\n+(3774,'bt042',571,3537,4032,68,73,3000,7000,0,3,2227.28,5312.07,10.5729,1.23497,'3775:0 3805:0 '),\n+(3775,'bt043',571,3537,4101,68,73,3000,7000,0,0,2273.96,5439.49,1.81269,1.1525,'3774:0 3776:0 3787:0 3870:0 '),\n+(3776,'bt044',571,3537,4101,68,73,3000,7000,0,0,2418.25,5390.85,3.76168,0.12363,'3775:0 3777:0 '),\n+(3777,'bt045',571,3537,3537,68,73,3000,7000,0,0,2601.94,5522.47,38.0963,6.28036,'3776:0 3778:0 3787:0 3794:0 3802:0 '),\n+(3778,'bt046',571,3537,3537,68,73,3000,7000,0,0,2887.65,5415.26,58.4905,5.60492,'3777:0 3806:0 3813:0 '),\n+(3779,'bt047',571,3537,4021,68,73,3000,7000,0,0,2976.39,5660.32,52.2738,1.38733,'3780:0 '),\n+(3780,'bt048',571,3537,4021,68,73,3000,7000,0,0,3019.96,5816.72,88.3166,0.8297,'3779:0 3781:0 3749:0 '),\n+(3781,'bt049',571,3537,4020,68,73,3000,7000,0,0,2993.07,5973.66,112.995,5.04023,'3780:0 3782:0 '),\n+(3782,'bt050',571,3537,4129,68,73,3000,7000,0,0,2915.6,6074.59,78.0969,1.4863,'3781:0 3783:0 3798:0 '),\n+(3783,'bt051',571,3537,4020,68,73,3000,7000,0,0,2970.01,6149.83,61.7495,2.0298,'3782:0 3784:0 '),\n+(3784,'bt052',571,3537,4020,68,73,3000,7000,0,0,2899.1,6282.26,61.4057,2.97228,'3783:0 3785:0 '),\n+(3785,'bt053',571,3537,4020,68,73,3000,7000,0,0,2773.74,6303.56,77.083,3.07674,'3784:0 3786:0 '),\n+(3786,'bt054',571,3537,4020,68,73,3000,7000,0,0,2654.28,6218.95,38.8344,4.55721,'3785:0 3735:0 3737:0 '),\n+(3787,'bt055',571,3537,3537,68,73,3000,7000,0,0,2316.99,5624.68,36.408,5.33239,'3777:0 3775:0 3788:0 '),\n+(3788,'bt056',571,3537,3537,68,73,3000,7000,0,0,2143.16,5781.38,58.7998,1.77058,'3787:0 3791:0 '),\n+(3789,'bt057',571,3537,4028,68,73,3000,7000,0,0,1868.5,5774.99,0.860459,1.34802,'3871:0 '),\n+(3790,'bt058',571,3537,4028,68,73,3000,7000,0,0,1923.91,6030.9,10.7946,1.48154,'3791:0 3872:0 '),\n+(3791,'bt059',571,3537,3537,68,73,3000,7000,0,0,2116.07,6079.06,52.9292,3.89037,'3790:0 3788:0 3792:0 3800:0 '),\n+(3792,'bt060',571,3537,4021,68,73,3000,7000,0,0,2104.14,6314.43,60.0072,0.106311,'3791:0 3793:0 '),\n+(3793,'bt061',571,3537,4021,68,73,3000,7000,0,0,2357.04,6208.05,40.7146,2.64945,'3792:0 3736:0 '),\n+(3794,'bt062',571,3537,4022,68,73,3000,7000,0,0,2647.51,5693.12,46.7099,1.50275,'3777:0 3795:0 '),\n+(3795,'bt063',571,3537,4022,68,73,3000,7000,0,0,2631.68,5852.04,45.3245,5.86957,'3794:0 3796:0 '),\n+(3796,'bt064',571,3537,4022,68,73,3000,7000,0,0,2763.87,5811.38,59.8902,6.23478,'3795:0 3797:0 '),\n+(3797,'bt065',571,3537,4021,68,73,3000,7000,0,0,2848.66,5818.04,101.625,5.91276,'3796:0 3798:0 3799:0 '),\n+(3798,'bt066',571,3537,4020,68,73,3000,7000,0,0,2837.49,5974.58,114.197,5.01191,'3797:0 3782:0 '),\n+(3799,'bt067',571,3537,4021,68,73,3000,7000,0,0,2607.08,5956.42,94.4153,5.56483,'3797:0 3800:0 3801:0 '),\n+(3800,'bt068',571,3537,4022,68,73,3000,7000,0,0,2327.62,5973.77,98.5945,4.36317,'3791:0 3799:0 '),\n+(3801,'bt069',571,3537,4022,68,73,3000,7000,0,0,2489.14,5813.21,139.945,0.867364,'3799:0 '),\n+(3802,'bt070',571,3537,4111,68,73,3000,7000,0,0,2684.66,5308.92,31.1745,1.9606,'3777:0 3803:0 '),\n+(3803,'bt071',571,3537,4111,68,73,3000,7000,0,0,2495.15,5199.97,32.4263,0.802134,'3802:0 3804:0 '),\n+(3804,'bt072',571,3537,4032,68,73,3000,7000,0,0,2416.87,5247.86,1.88448,3.32877,'3803:0 3805:0 '),\n+(3805,'bt073',571,3537,4032,68,73,3000,7000,0,3,2334.99,5249.7,9.01216,2.3698,'3774:0 3804:0 '),\n+(3806,'bt074',571,3537,3537,68,73,3000,7000,0,0,3128.49,5378.84,58.5466,0.00337601,'3778:0 3752:0 3807:0 3813:0 '),\n+(3807,'bt075',571,3537,3537,68,73,3000,7000,0,0,3264.11,5285.37,39.4799,3.97355,'3806:0 3808:0 3845:0 '),\n+(3808,'bt076',571,3537,4043,68,73,3000,7000,0,0,3152.24,5121.1,38.3072,4.18325,'3807:0 3809:0 3814:0 3845:0 '),\n+(3809,'bt077',571,3537,4043,68,73,3000,7000,0,0,2949.22,5102.38,35.483,3.44497,'3810:0 3813:0 3808:0 '),\n+(3810,'bt078',571,3537,4043,68,73,3000,7000,0,0,2736.6,5010.38,28.1472,3.12924,'3809:0 3811:0 '),\n+(3811,'bt079',571,3537,4115,68,73,3000,7000,0,0,2737.31,5202.71,29.0469,0.938766,'3810:0 3812:0 3813:0 '),\n+(3812,'bt080',571,3537,4115,68,73,3000,7000,0,0,2535.47,5082.9,7.68824,3.5887,'3811:0 '),\n+(3813,'bt081',571,3537,3537,68,73,3000,7000,0,0,2918.19,5295.64,60.2339,1.05579,'3778:0 3809:0 3811:0 3806:0 '),\n+(3814,'bt082',571,3537,4041,68,73,3000,7000,0,0,3128.73,4853.66,2.08073,1.16652,'3808:0 3815:0 '),\n+(3815,'bt083',571,3537,4041,68,73,3000,7000,0,0,3050.52,4655.31,2.27362,4.47304,'3814:0 3816:0 '),\n+(3816,'bt084',571,3537,4043,68,73,3000,7000,0,0,3249.06,4558.38,29.5811,5.62916,'3815:0 3817:0 '),\n+(3817,'bt085',571,3537,4043,68,73,3000,7000,0,0,3284.24,4264.38,24.2109,5.22075,'3816:0 3818:0 3892:0 '),\n+(3818,'bt086',571,3537,4037,68,73,3000,7000,0,4,3412.42,4072.4,16.8945,0.69685,'3817:0 3819:0 3820:0 3827:0 3893:0 '),\n+(3819,'bt087',571,3537,4037,68,73,3000,7000,0,5,3463.15,4158.38,17.1932,1.45869,'3818:0 '),\n+(3820,'bt088',571,3537,4043,68,73,3000,7000,0,0,3662.21,3965.65,26.4976,5.18541,'3818:0 3821:0 3832:0 '),\n+(3821,'bt089',571,3537,4125,68,73,3000,7000,0,0,3676.8,3741.97,49.5236,5.32678,'3820:0 3822:0 3832:0 '),\n+(3822,'bt090',571,3537,4125,68,73,3000,7000,0,0,3823.07,3647,46.2292,5.63701,'3821:0 3823:0 3825:0 3826:0 '),\n+(3823,'bt091',571,3537,4135,68,73,3000,7000,0,0,4026.86,3532.95,104.358,5.75874,'3822:0 3824:0 3826:0 '),\n+(3824,'bt092',571,3537,4125,68,73,3000,7000,0,0,3935.56,3404.04,80.8418,5.58987,'3823:0 3825:0 '),\n+(3825,'bt093',571,3537,4125,68,73,3000,7000,0,0,3825.9,3505.46,64.8278,1.04239,'3822:0 3824:0 '),\n+(3826,'bt094',571,3537,4125,68,73,3000,7000,0,0,3966.88,3721.48,61.9247,4.14707,'3822:0 3823:0 '),\n+(3827,'bt095',571,3537,4042,68,73,3000,7000,0,0,3416.97,3883.04,26.1293,5.22225,'3818:0 3828:0 3893:0 '),\n+(3828,'bt096',571,3537,4042,68,73,3000,7000,0,0,3450.42,3652.26,27.974,2.1592,'3827:0 3829:0 3894:0 '),\n+(3829,'bt097',571,3537,4042,68,73,3000,7000,0,0,3456.33,3430.49,17.996,4.9827,'3828:0 3830:0 '),\n+(3830,'bt098',571,3537,4042,68,73,3000,7000,0,0,3518.4,3187.54,25.0806,4.80206,'3829:0 3831:0 '),\n+(3831,'bt099',571,65,4478,68,73,3000,7000,0,0,3572.51,3037.08,26.2165,3.86352,'3830:0 4063:0 '),\n+(3832,'bt100',571,3537,3537,68,73,3000,7000,0,0,3907.42,4000.44,45.1941,4.47613,'3820:0 3821:0 3833:0 '),\n+(3833,'bt101',571,3537,3537,68,73,3000,7000,0,0,4042.02,4199.98,49.6907,0.696007,'3832:0 3834:0 '),\n+(3834,'bt102',571,3537,3537,68,73,3000,7000,0,0,4186.94,4464.21,27.3466,1.05336,'3833:0 3835:0 '),\n+(3835,'bt103',571,3537,4119,68,73,3000,7000,0,0,4191.29,4697.78,12.0312,2.68463,'3834:0 3836:0 3837:0 3838:0 3862:0 '),\n+(3836,'bt104',571,3537,4118,68,73,3000,7000,0,0,4358.92,4576.58,16.3385,5.84976,'3835:0 '),\n+(3837,'bt105',571,3537,4036,68,73,3000,7000,0,0,3992.84,4812.66,11.7213,5.55524,'3835:0 '),\n+(3838,'bt106',571,3537,4119,68,73,3000,7000,0,0,3978.85,4564.24,-2.51875,3.44252,'3835:0 3839:0 3868:0 '),\n+(3839,'bt107',571,3537,4117,68,73,3000,7000,0,0,3699.55,4487.54,-0.818554,2.97836,'3838:0 3840:0 '),\n+(3840,'bt108',571,3537,4117,68,73,3000,7000,0,0,3443.04,4422.46,-0.530089,0.645731,'3839:0 3841:0 '),\n+(3841,'bt109',571,3537,4035,68,73,3000,7000,0,0,3568.75,4584.96,-13.5973,0.527922,'3840:0 3842:0 '),\n+(3842,'bt110',571,3537,4035,68,73,3000,7000,0,0,3686.72,4734.84,-12.073,1.14839,'3841:0 3843:0 3869:0 '),\n+(3843,'bt111',571,3537,4035,68,73,3000,7000,0,0,3703.7,4927.72,-12.9951,2.73489,'3842:0 3844:0 3866:0 '),\n+(3844,'bt112',571,3537,4116,68,73,3000,7000,0,0,3479.66,5024.98,-1.50934,2.71133,'3843:0 3845:0 '),\n+(3845,'bt113',571,3537,4116,68,73,3000,7000,0,0,3344.22,5119.48,13.0385,2.55424,'3844:0 3807:0 3808:0 3846:0 '),\n+(3846,'bt114',571,3537,4116,68,73,3000,7000,0,0,3589.81,5076.79,13.0073,6.10424,'3845:0 3847:0 '),\n+(3847,'bt115',571,3537,3537,68,73,3000,7000,0,0,3668.09,5254.47,34.8015,1.05413,'3846:0 3848:0 3865:0 '),\n+(3848,'bt116',571,3537,3537,68,73,3000,7000,0,0,3717.74,5416.1,41.956,1.99268,'3847:0 3849:0 3891:0 '),\n+(3849,'bt117',571,3537,3537,68,73,3000,7000,0,0,3919.2,5534.82,36.9202,0.89312,'3848:0 3850:0 '),\n+(3850,'bt118',571,3537,3537,68,73,3000,7000,0,0,4101.61,5617.94,41.1963,5.88275,'3849:0 3758:0 3851:0 '),\n+(3851,'bt119',571,3537,3537,68,73,3000,7000,0,0,4252.89,5577.24,46.4033,5.33689,'3850:0 3852:0 3857:0 '),\n+(3852,'bt120',571,3537,4123,68,73,3000,7000,0,0,4429.17,5431.27,38.6653,5.43664,'3851:0 3853:0 '),\n+(3853,'bt121',571,3537,4123,68,73,3000,7000,0,0,4389.18,5365.34,1.39626,5.27172,'3852:0 3854:0 '),\n+(3854,'bt122',571,3537,4123,68,73,3000,7000,0,0,4489.75,5395.86,-16.0358,0.830292,'3853:0 3855:0 '),\n+(3855,'bt123',571,3537,4123,68,73,3000,7000,0,0,4444.7,5327.16,-22.3982,5.89611,'3854:0 3856:0 '),\n+(3856,'bt124',571,3537,4123,68,73,3000,7000,0,0,4542.22,5322.8,-31.8246,3.56034,'3855:0 '),\n+(3857,'bt125',571,3537,4123,68,73,3000,7000,0,0,4522.99,5561.63,52.4235,6.06731,'3851:0 3858:0 4598:0 '),\n+(3858,'bt126',571,3537,4123,68,73,3000,7000,0,0,4530.95,5430.29,84.8166,1.59052,'3857:0 3859:0 '),\n+(3859,'bt127',571,3537,4123,68,73,3000,7000,0,0,4525.48,5247.8,73.7381,4.37083,'3858:0 3860:0 '),\n+(3860,'bt128',571,3537,4123,68,73,3000,7000,0,0,4475.24,5066.41,51.9566,0.934718,'3859:0 3861:0 '),\n+(3861,'bt129',571,3537,4123,68,73,3000,7000,0,0,4378.74,5017.74,24.8345,2.46704,'3860:0 3862:0 3863:0 '),\n+(3862,'bt130',571,3537,3537,68,73,3000,7000,0,0,4344.7,4804.82,24.8231,4.24124,'3861:0 3835:0 '),\n+(3863,'bt131',571,3537,4116,68,73,3000,7000,0,0,4205.12,5146.23,13.0876,5.95813,'3861:0 3864:0 '),\n+(3864,'bt132',571,3537,4108,68,73,3000,7000,0,3,4060.38,5267.77,24.7438,5.56545,'3863:0 3865:0 '),\n+(3865,'bt133',571,3537,4116,68,73,3000,7000,0,0,3893.4,5186.84,13.0414,3.37026,'3864:0 3847:0 3866:0 '),\n+(3866,'bt134',571,3537,4116,68,73,3000,7000,0,0,3840.13,5037.99,-1.50988,0.413233,'3865:0 3843:0 3867:0 '),\n+(3867,'bt135',571,3537,4035,68,73,3000,7000,0,0,3925.28,4915.39,-12.887,4.60333,'3866:0 3868:0 '),\n+(3868,'bt136',571,3537,4035,68,73,3000,7000,0,0,3887.73,4693.73,-12.995,4.14386,'3867:0 3838:0 3869:0 '),\n+(3869,'bt137',571,3537,4035,68,73,3000,7000,0,0,3732.85,4647.89,-12.6525,0.821628,'3868:0 3842:0 '),\n+(3870,'bt138',571,3537,4101,68,73,3000,7000,0,0,2084.44,5480.67,0.253263,0.428928,'3775:0 3871:0 '),\n+(3871,'bt139',571,3537,3537,68,73,3000,7000,0,0,1935.03,5589.92,0.355845,5.97934,'3870:0 3789:0 '),\n+(3872,'bt140',571,3537,4029,68,73,3000,7000,0,0,1494.92,5829.11,1.38787,4.0072,'3790:0 3873:0 '),\n+(3873,'bt141',571,3537,4029,68,73,3000,7000,0,0,1384.5,5858.44,15.4001,4.19177,'3872:0 3874:0 '),\n+(3874,'bt142',571,3537,4029,68,73,3000,7000,0,0,1449.43,5734.18,1.3254,1.10514,'3873:0 3875:0 '),\n+(3875,'bt143',571,3537,4029,68,73,3000,7000,0,0,1402.52,5714.94,23.5628,4.00326,'3874:0 3876:0 '),\n+(3876,'bt144',571,3537,4029,68,73,3000,7000,0,0,1316.7,5605.69,5.52566,5.40127,'3875:0 '),\n+(3877,'bt145',571,3537,4024,68,73,3000,7000,0,0,4152.49,7034.79,165.636,2.43875,'3878:0 3890:0 '),\n+(3878,'bt146',571,3537,4024,68,73,3000,7000,0,0,3999,7159.1,167.793,0.0786215,'3877:0 3879:0 '),\n+(3879,'bt147',571,3537,4024,68,73,3000,7000,0,0,3840.49,7254.47,172.045,3.52653,'3878:0 3880:0 3882:0 '),\n+(3880,'bt148',571,3537,4024,68,73,3000,7000,0,0,3676.61,7110.41,160.171,4.50434,'3879:0 3881:0 3883:0 '),\n+(3881,'bt149',571,3537,4024,68,73,3000,7000,0,0,3597.15,7199.39,221.934,1.51276,'3880:0 3882:0 3883:0 '),\n+(3882,'bt150',571,3537,4024,68,73,3000,7000,0,0,3751.72,7333.67,208.956,0.378648,'3881:0 3879:0 '),\n+(3883,'bt151',571,3537,4024,68,73,3000,7000,0,0,3611.29,6969.11,170.734,1.15225,'3880:0 3881:0 3884:0 '),\n+(3884,'bt152',571,3537,4024,68,73,3000,7000,0,0,3644.46,6805.44,166.924,3.99932,'3883:0 3885:0 '),\n+(3885,'bt153',571,3537,4121,68,73,3000,7000,0,1,3587.41,6661.1,195.429,4.60014,'3884:0 3886:0 '),\n+(3886,'bt154',571,3537,4024,68,73,3000,7000,0,0,3749.63,6602.97,169.446,3.8658,'3885:0 3887:0 3889:0 '),\n+(3887,'bt155',571,3537,4024,68,73,3000,7000,0,0,3912.17,6596.2,168.227,0.700643,'3886:0 3888:0 '),\n+(3888,'bt156',571,3537,4024,68,73,3000,7000,0,0,3971.08,6785.73,156.758,4.88682,'3887:0 3889:0 3890:0 '),\n+(3889,'bt157',571,3537,4024,68,73,3000,7000,0,0,3826.86,6694.29,152.782,4.14698,'3888:0 3886:0 '),\n+(3890,'bt158',571,3537,4024,68,73,3000,7000,0,0,4074.45,6887.11,166.976,1.01716,'3877:0 3888:0 '),\n+(3891,'bt159',571,3537,4039,68,73,3000,7000,0,0,3663.21,5603.77,32.8151,3.07099,'3754:0 3755:0 3756:0 3757:0 3848:0 '),\n+(3892,'bt160',571,3537,4113,68,73,3000,7000,0,1,2913.96,4067.33,1.63263,0.498753,'3817:0 3893:0 '),\n+(3893,'bt161',571,3537,4138,68,73,3000,7000,0,3,3111.58,3838.69,22.5558,0.795238,'3818:0 3827:0 3894:0 3892:0 '),\n+(3894,'bt162',571,3537,4138,68,73,3000,7000,0,0,3323.93,3770.67,24.5945,5.57327,'3893:0 3828:0 '),\n+(3895,'hf163',571,495,3998,68,73,3000,7000,0,3,1418.1,-3190.73,162.344,4.57189,'3896:0 '),\n+(3896,'hf164',571,495,3998,68,73,3000,7000,0,2,1365.12,-3385.23,185.736,4.52084,'3895:0 3897:0 '),\n+(3897,'hf165',571,495,4048,68,73,3000,7000,0,0,1219.72,-3550.97,164.966,4.23495,'3896:0 3898:0 '),\n+(3898,'hf166',571,495,4048,68,73,3000,7000,0,0,1121.91,-3657.07,156.248,4.07787,'3897:0 3899:0 3939:0 '),\n+(3899,'hf167',571,495,4048,68,73,3000,7000,0,0,1046.11,-3833.51,162.833,4.6512,'3898:0 3900:0 3912:0 3939:0 '),\n+(3900,'hf168',571,495,4048,68,73,3000,7000,0,0,920.447,-4015.29,170.279,3.21786,'3899:0 3901:0 3912:0 '),\n+(3901,'hf169',571,495,3992,68,73,3000,7000,0,0,694.778,-3872.94,246.328,2.73877,'3900:0 3902:0 '),\n+(3902,'hf170',571,495,495,68,73,3000,7000,0,0,507.763,-4025.28,259.283,4.81221,'3901:0 3903:0 '),\n+(3903,'hf171',571,495,4260,68,73,3000,7000,0,0,397.137,-4223.42,249.354,3.78334,'3902:0 3904:0 3933:0 '),\n+(3904,'hf172',571,495,495,68,73,3000,7000,0,0,222.582,-4391.88,248.592,4.40773,'3903:0 3905:0 4040:0 '),\n+(3905,'hf173',571,495,3991,68,73,3000,7000,0,0,253.033,-4572.61,240.212,5.55441,'3904:0 3906:0 4036:0 '),\n+(3906,'hf174',571,495,3991,68,73,3000,7000,0,5,371.97,-4633.54,245.156,2.78588,'3905:0 3907:0 3911:0 4039:0 '),\n+(3907,'hf175',571,495,3991,68,73,3000,7000,0,4,407.209,-4712.58,228.909,5.83714,'3906:0 3908:0 '),\n+(3908,'hf176',571,495,3991,68,73,3000,7000,0,0,510.661,-4763.01,208.318,0.924468,'3907:0 3909:0 4036:0 '),\n+(3909,'hf177',571,495,495,68,73,3000,7000,0,0,628.585,-4581.53,203.482,0.904833,'3908:0 3910:0 '),\n+(3910,'hf178',571,495,3991,68,73,3000,7000,0,0,460.455,-4423.52,211.022,2.64078,'3909:0 3911:0 3933:0 '),\n+(3911,'hf179',571,495,3991,68,73,3000,7000,0,4,383.884,-4495.8,236.504,4.36866,'3910:0 3906:0 '),\n+(3912,'hf180',571,495,495,68,73,3000,7000,0,0,1081.71,-4036.81,154.348,4.76135,'3899:0 3900:0 3939:0 '),\n+(3913,'hf181',571,495,495,68,73,3000,7000,0,0,1215.66,-4263.51,149.864,5.26401,'3914:0 '),\n+(3914,'hf182',571,495,495,68,73,3000,7000,0,0,1258.74,-4522.15,173.24,3.83852,'3913:0 3915:0 '),\n+(3915,'hf183',571,495,495,68,73,3000,7000,0,0,1124.26,-4644.36,183.694,3.62646,'3914:0 3916:0 '),\n+(3916,'hf184',571,495,495,68,73,3000,7000,0,0,857.223,-4730.31,113.82,0.273598,'3915:0 3917:0 '),\n+(3917,'hf185',571,495,495,68,73,3000,7000,0,0,706.968,-4825.12,79.1984,4.0553,'3916:0 3918:0 '),\n+(3918,'hf186',571,495,3981,68,73,3000,7000,0,2,634.301,-4890.02,28.6664,4.92709,'3917:0 3919:0 3932:0 '),\n+(3919,'hf187',571,495,3981,68,73,3000,7000,0,2,682.36,-4963,6.24529,0.414974,'3918:0 3920:0 3932:0 '),\n+(3920,'hf188',571,495,3982,68,73,3000,7000,0,0,854.979,-4933.54,4.27721,0.230407,'3919:0 3921:0 '),\n+(3921,'hf189',571,495,3982,68,73,3000,7000,0,0,1039.98,-4925.08,9.42985,0.387488,'3920:0 3922:0 '),\n+(3922,'hf190',571,495,3982,68,73,3000,7000,0,0,945.95,-4873.37,4.59329,0.540618,'3921:0 3923:0 '),\n+(3923,'hf191',571,495,3982,68,73,3000,7000,0,0,1068.1,-4819.17,26.6749,3.6728,'3922:0 3924:0 '),\n+(3924,'hf192',571,495,3983,68,73,3000,7000,0,0,1158.2,-4813.94,28.9399,0.405537,'3923:0 3925:0 '),\n+(3925,'hf193',571,495,3983,68,73,3000,7000,0,0,1104.87,-4804.91,-6.8197,0.572031,'3924:0 3926:0 '),\n+(3926,'hf194',571,495,3983,1,60,3000,7000,0,0,980.459,-4819.09,-72.4413,0.31677,'3925:0 3927:0 '),\n+(3927,'hf195',571,495,3983,68,73,3000,7000,0,0,841.596,-4863.98,-72.4161,5.00561,'3926:0 3928:0 3929:0 '),\n+(3928,'hf196',571,495,3983,68,73,3000,7000,0,0,875.874,-4966.04,-72.4404,1.87186,'3927:0 '),\n+(3929,'hf197',571,495,495,68,73,3000,7000,0,0,795.673,-4726.51,-96.2356,1.47131,'3927:0 3930:0 '),\n+(3930,'hf198',571,495,3983,68,73,3000,7000,0,0,835.937,-4866.89,-115.736,2.10747,'3929:0 3931:0 '),\n+(3931,'hf199',571,495,3983,68,73,3000,7000,0,0,945.547,-4827.44,-116.158,0.281421,'3930:0 '),\n+(3932,'hf200',571,495,3981,68,73,3000,7000,0,3,554.553,-4986.67,10.1867,0.251579,'3918:0 3919:0 '),\n+(3933,'hf201',571,495,495,68,73,3000,7000,0,0,628.213,-4255.8,210.916,3.49527,'3903:0 3910:0 3934:0 '),\n+(3934,'hf202',571,495,3994,68,73,3000,7000,0,0,765.99,-4299.85,185.031,3.00833,'3933:0 3935:0 '),\n+(3935,'hf203',571,495,3994,68,73,3000,7000,0,0,798.758,-4362.47,161.294,4.9679,'3934:0 3936:0 '),\n+(3936,'hf204',571,495,3994,68,73,3000,7000,0,0,902.1,-4478.73,144.331,5.55301,'3935:0 3937:0 3938:0 '),\n+(3937,'hf205',571,495,3994,68,73,3000,7000,0,0,1004.65,-4395.88,150.922,4.0804,'3936:0 3938:0 '),\n+(3938,'hf206',571,495,3994,68,73,3000,7000,0,0,909.858,-4395.54,139.649,4.34665,'3937:0 3936:0 '),\n+(3939,'hf207',571,495,4048,68,73,3000,7000,0,0,1203.65,-3825.84,142.684,1.05976,'3898:0 3899:0 3912:0 3940:0 '),\n+(3940,'hf208',571,495,495,68,73,3000,7000,0,0,1408.56,-3737.55,135.962,1.67629,'3939:0 3941:0 '),\n+(3941,'hf209',571,495,495,68,73,3000,7000,0,0,1558.28,-3740.43,144.691,0.00336027,'3940:0 3942:0 '),\n+(3942,'hf210',571,495,495,68,73,3000,7000,0,1,1706.02,-3730.74,148.901,3.19209,'3941:0 3943:0 3981:0 '),\n+(3943,'hf211',571,495,495,68,73,3000,7000,0,0,1803.26,-3895.57,170.472,0.273537,'3942:0 3944:0 '),\n+(3944,'hf212',571,495,495,68,73,3000,7000,0,0,1949.63,-3842.81,173.777,1.70846,'3943:0 3945:0 '),\n+(3945,'hf213',571,495,4068,68,73,3000,7000,0,0,2008.1,-3689.61,173.671,1.9378,'3944:0 3946:0 '),\n+(3946,'hf214',571,495,4068,68,73,3000,7000,0,0,1967.39,-3604.53,158.109,5.18071,'3945:0 3947:0 3985:0 '),\n+(3947,'hf215',571,495,495,68,73,3000,7000,0,0,2096.74,-3545.48,153.897,6.17032,'3946:0 3948:0 '),\n+(3948,'hf216',571,495,495,68,73,3000,7000,0,0,2318.6,-3583.13,165.228,0.334813,'3947:0 3949:0 '),\n+(3949,'hf217',571,495,4006,68,73,3000,7000,0,0,2535.68,-3475.65,183.975,0.49582,'3948:0 3950:0 3953:0 '),\n+(3950,'hf218',571,495,4006,68,73,3000,7000,0,0,2624.04,-3562.9,205.26,5.49331,'3949:0 3951:0 3953:0 '),\n+(3951,'hf219',571,495,4006,68,73,3000,7000,0,0,2727.06,-3698.08,221.722,5.46582,'3950:0 3952:0 '),\n+(3952,'hf220',571,495,4065,68,73,3000,7000,0,0,2838.83,-3844.63,244.563,5.37,'3951:0 '),\n+(3953,'hf221',571,495,4006,68,73,3000,7000,0,0,2613.9,-3384.95,183,4.543,'3949:0 3950:0 3954:0 3955:0 '),\n+(3954,'hf222',571,495,4006,68,73,3000,7000,0,0,2724.44,-3424.92,224.685,0.694536,'3953:0 '),\n+(3955,'hf223',571,495,4054,68,73,3000,7000,0,0,2578.54,-3191.48,141.337,1.90327,'3953:0 3956:0 '),\n+(3956,'hf224',571,495,495,68,73,3000,7000,0,0,2515.29,-2957.64,111.213,1.93861,'3955:0 3957:0 3965:0 4272:0 '),\n+(3957,'hf225',571,495,4054,68,73,3000,7000,0,0,2301.09,-3135.29,143.7,3.73482,'3956:0 3958:0 3964:0 '),\n+(3958,'hf226',571,495,4054,68,73,3000,7000,0,0,2243.04,-3261.92,151.734,2.70201,'3957:0 3959:0 '),\n+(3959,'hf227',571,495,3999,68,73,3000,7000,0,0,2145.39,-3331.7,144.475,1.2019,'3958:0 3960:0 '),\n+(3960,'hf228',571,495,3999,68,73,3000,7000,0,0,2086.44,-3330,104.792,3.06722,'3959:0 3961:0 '),\n+(3961,'hf229',571,495,3999,68,73,3000,7000,0,0,1983.23,-3286.99,111.741,1.78624,'3960:0 3962:0 '),\n+(3962,'hf230',571,495,3999,68,73,3000,7000,0,0,2045.23,-3172.46,139.784,4.15736,'3961:0 3963:0 '),\n+(3963,'hf231',571,495,4062,68,73,3000,7000,0,5,2094.18,-2981.02,144.898,4.45895,'3962:0 3964:0 '),\n+(3964,'hf232',571,495,495,68,73,3000,7000,0,0,2264.88,-3015.48,135.084,5.19722,'3963:0 3957:0 '),\n+(3965,'hf233',571,495,495,68,73,3000,7000,0,0,2606.41,-2825.71,69.3506,1.32522,'3956:0 3966:0 4272:0 '),\n+(3966,'hf234',571,495,4070,68,73,3000,7000,0,0,2558.46,-2678.02,3.25504,5.60171,'3965:0 3967:0 4276:0 '),\n+(3967,'hf235',571,495,4070,68,73,3000,7000,0,0,2430.12,-2758.92,5.62901,3.37275,'3966:0 3968:0 '),\n+(3968,'hf236',571,495,4070,68,73,3000,7000,0,0,2281.27,-2774.11,4.91082,0.329327,'3967:0 3969:0 '),\n+(3969,'hf237',571,495,4070,68,73,3000,7000,0,0,2153.11,-2770.66,4.86218,3.08765,'3968:0 3970:0 '),\n+(3970,'hf238',571,495,4070,68,73,3000,7000,0,0,1967.15,-2762.53,3.5219,3.17561,'3969:0 3971:0 '),\n+(3971,'hf239',571,495,4070,68,73,3000,7000,0,0,1835.91,-2814.57,3.48005,3.54396,'3970:0 3972:0 '),\n+(3972,'hf240',571,495,4070,68,73,3000,7000,0,0,1677.38,-2975.29,3.95501,4.155,'3971:0 3973:0 '),\n+(3973,'hf241',571,495,4071,68,73,3000,7000,0,0,1576.78,-3123.46,2.99581,4.44402,'3972:0 3974:0 3983:0 '),\n+(3974,'hf242',571,495,4071,68,73,3000,7000,0,0,1609.87,-3258.66,3.34169,4.86186,'3973:0 3975:0 '),\n+(3975,'hf243',571,495,4071,68,73,3000,7000,0,0,1629.47,-3440.1,29.9326,3.35783,'3974:0 3976:0 3984:0 '),\n+(3976,'hf244',571,495,4071,68,73,3000,7000,0,0,1490.07,-3428.63,88.8301,0.0332379,'3975:0 3977:0 '),\n+(3977,'hf245',571,495,4071,68,73,3000,7000,0,0,1554.39,-3419.81,97.6795,4.70636,'3976:0 3978:0 3980:0 3982:0 '),\n+(3978,'hf246',571,495,4071,68,73,3000,7000,0,0,1638.14,-3283.78,76.0526,5.23256,'3977:0 3979:0 '),\n+(3979,'hf247',571,495,4071,68,73,3000,7000,0,0,1772.14,-3327.31,81.7587,4.30737,'3978:0 '),\n+(3980,'hf248',571,495,4071,68,73,3000,7000,0,0,1641.48,-3512.7,92.7675,1.7077,'3977:0 3981:0 '),\n+(3981,'hf249',571,495,495,68,73,3000,7000,0,0,1670.45,-3682.65,149.579,1.75245,'3980:0 3942:0 3982:0 '),\n+(3982,'hf250',571,495,4071,68,73,3000,7000,0,0,1565.95,-3550.52,112.177,1.48387,'3981:0 3977:0 '),\n+(3983,'hf251',571,495,495,68,73,3000,7000,0,0,1489.29,-3099.07,39.9696,5.34802,'3973:0 3984:0 '),\n+(3984,'hf252',571,495,4071,68,73,3000,7000,0,0,1511.33,-3269.6,74.5615,0.545315,'3983:0 3975:0 '),\n+(3985,'hf253',571,495,495,68,73,3000,7000,0,0,2104.47,-3840.68,209.54,2.27867,'3946:0 3986:0 '),\n+(3986,'hf254',571,495,4002,68,73,3000,7000,0,0,2068.75,-4073.32,236.821,4.87048,'3985:0 3987:0 3993:0 '),\n+(3987,'hf255',571,495,4002,68,73,3000,7000,0,0,1987.13,-4141.88,216.964,3.23293,'3986:0 3988:0 '),\n+(3988,'hf256',571,495,4002,68,73,3000,7000,0,0,1838.02,-4120.86,223.042,2.70435,'3987:0 3989:0 3992:0 '),\n+(3989,'hf257',571,495,4002,68,73,3000,7000,0,0,1672.75,-4022.82,249.031,3.18894,'3988:0 3990:0 '),\n+(3990,'hf258',571,495,4002,68,73,3000,7000,0,0,1693.59,-4091.47,270.671,4.86183,'3989:0 3991:0 '),\n+(3991,'hf259',571,495,4002,68,73,3000,7000,0,0,1644.9,-4213.64,258.417,6.27555,'3990:0 3992:0 '),\n+(3992,'hf260',571,495,4002,68,73,3000,7000,0,0,1773.12,-4215.36,238.947,0.851593,'3991:0 3988:0 '),\n+(3993,'hf261',571,495,495,68,73,3000,7000,0,0,2130.43,-4316.44,219.989,1.40137,'3986:0 3994:0 '),\n+(3994,'hf262',571,495,495,68,73,3000,7000,0,0,2183.63,-4535.73,216.514,4.86106,'3993:0 3995:0 '),\n+(3995,'hf263',571,495,495,68,73,3000,7000,0,0,2377.58,-4396.75,228.263,0.804472,'3994:0 3996:0 '),\n+(3996,'hf264',571,495,495,68,73,3000,7000,0,0,2551.09,-4320.92,279.902,6.10198,'3995:0 3997:0 '),\n+(3997,'hf265',571,495,4018,68,73,3000,7000,0,5,2613.73,-4366.35,276.555,2.42318,'3996:0 3998:0 '),\n+(3998,'hf266',571,495,4018,68,73,3000,7000,0,4,2716.59,-4368.81,272.672,5.25063,'3997:0 3999:0 '),\n+(3999,'hf267',571,495,495,68,73,3000,7000,0,0,2797.23,-4621.23,277.95,5.09748,'3998:0 4000:0 4306:0 '),\n+(4000,'hf268',571,495,495,68,73,3000,7000,0,0,2607.42,-4744.93,256.769,3.77173,'3999:0 4001:0 '),\n+(4001,'hf269',571,495,495,68,73,3000,7000,0,0,2455.43,-4885.82,260.773,3.54789,'4000:0 4002:0 4005:0 '),\n+(4002,'hf270',571,495,495,68,73,3000,7000,0,3,2431.15,-4962.71,273.723,1.34484,'4001:0 4003:0 '),\n+(4003,'hf271',571,495,4003,68,73,3000,7000,0,2,2510.75,-4994.59,283.35,2.79784,'4002:0 4004:0 '),\n+(4004,'hf272',571,495,4003,68,73,3000,7000,0,2,2456.13,-5113.98,277.313,4.08197,'4003:0 '),\n+(4005,'hf273',571,495,495,68,73,3000,7000,0,0,2232.27,-4879.42,237.068,0.178543,'4001:0 4006:0 '),\n+(4006,'hf274',571,495,495,68,73,3000,7000,0,0,2035.15,-4874.68,210.788,3.93982,'4005:0 4007:0 4010:0 '),\n+(4007,'hf275',571,495,495,68,73,3000,7000,0,0,1888.77,-4884.63,168.445,3.11672,'4006:0 4008:0 '),\n+(4008,'hf276',571,495,4059,68,73,3000,7000,0,0,1712.12,-4879.28,126.121,3.13635,'4007:0 4009:0 '),\n+(4009,'hf277',571,495,4059,68,73,3000,7000,0,0,1563,-4951.92,143.133,4.04662,'4008:0 '),\n+(4010,'hf278',571,495,495,68,73,3000,7000,0,0,1915.43,-5076.01,179.861,4.59721,'4006:0 4011:0 '),\n+(4011,'hf279',571,495,495,68,73,3000,7000,0,0,1824.95,-5278.57,182.601,4.39143,'4010:0 4012:0 4018:0 '),\n+(4012,'hf280',571,495,4061,68,73,3000,7000,0,0,1965.2,-5427.02,202.866,6.04468,'4011:0 4013:0 '),\n+(4013,'hf281',571,495,4061,68,73,3000,7000,0,0,2137.38,-5461.32,239.114,6.25123,'4012:0 4014:0 '),\n+(4014,'hf282',571,495,4061,68,73,3000,7000,0,0,2177.05,-5614.25,226.937,4.76369,'4013:0 4015:0 4351:0 '),\n+(4015,'hf283',571,495,4061,68,73,3000,7000,0,0,2173.72,-5813.08,225.029,3.53925,'4014:0 4016:0 4351:0 '),\n+(4016,'hf284',571,495,4061,68,73,3000,7000,0,0,1978.82,-5763.87,223.278,2.62034,'4015:0 4017:0 '),\n+(4017,'hf285',571,495,4061,68,73,3000,7000,0,0,1834.38,-5629.13,215.972,1.48308,'4016:0 4018:0 '),\n+(4018,'hf286',571,495,495,68,73,3000,7000,0,1,1667.21,-5453.46,197.385,2.72951,'4017:0 4011:0 4019:0 4022:0 '),\n+(4019,'hf287',571,495,4001,68,73,3000,7000,0,0,1532.35,-5419.75,189.418,2.63761,'4018:0 4020:0 '),\n+(4020,'hf288',571,495,4001,68,73,3000,7000,0,0,1486.1,-5319.6,195.08,1.17912,'4019:0 4021:0 '),\n+(4021,'hf289',571,495,4001,68,73,3000,7000,0,0,1504.6,-5264.18,206.615,0.745568,'4020:0 '),\n+(4022,'hf290',571,495,495,68,73,3000,7000,0,0,1492.09,-5524.43,200.456,3.74892,'4018:0 4023:0 4026:0 '),\n+(4023,'hf291',571,495,4403,68,73,3000,7000,0,0,1532.33,-5613.29,226.19,4.85477,'4022:0 4024:0 '),\n+(4024,'hf292',571,495,4402,68,73,3000,7000,0,4,1541.33,-5689.58,248.356,1.64643,'4023:0 4025:0 '),\n+(4025,'hf293',571,495,495,68,73,3000,7000,0,5,1631.27,-5779.62,258.389,2.51272,'4024:0 '),\n+(4026,'hf294',571,495,495,68,73,3000,7000,0,0,1394.07,-5574.59,205.361,0.236628,'4022:0 4027:0 '),\n+(4027,'hf295',571,495,495,68,73,3000,7000,0,0,1234.61,-5679.7,225.93,3.5408,'4026:0 4028:0 4058:0 '),\n+(4028,'hf296',571,495,3984,68,73,3000,7000,0,0,1037.41,-5697.06,228.706,3.34052,'4027:0 4029:0 4062:0 '),\n+(4029,'hf297',571,495,495,68,73,3000,7000,0,0,877.228,-5789.41,249.962,3.77328,'4028:0 4030:0 '),\n+(4030,'hf298',571,495,495,68,73,3000,7000,0,0,739.705,-5863.89,287.056,4.11336,'4029:0 4031:0 '),\n+(4031,'hf299',571,495,495,68,73,3000,7000,0,3,483.188,-5922.44,308.68,1.33265,'4030:0 4032:0 '),\n+(4032,'hf300',571,495,495,68,73,3000,7000,0,0,513.926,-5588.33,281.883,2.6321,'4031:0 4033:0 '),\n+(4033,'hf301',571,495,495,68,73,3000,7000,0,0,342.715,-5438.85,298.648,2.30775,'4032:0 4034:0 '),\n+(4034,'hf302',571,495,495,68,73,3000,7000,0,0,221.35,-5242.73,299.653,1.84436,'4033:0 4035:0 '),\n+(4035,'hf303',571,495,4057,68,73,3000,7000,0,0,161.173,-4925.94,298.444,1.79331,'4034:0 4036:0 4037:0 4039:0 '),\n+(4036,'hf304',571,495,495,68,73,3000,7000,0,0,285.533,-4807.39,248.989,1.63624,'4035:0 3905:0 3908:0 '),\n+(4037,'hf305',571,495,4057,68,73,3000,7000,0,0,-28.8267,-4914.36,302.775,3.12851,'4035:0 4038:0 '),\n+(4038,'hf306',571,495,4057,68,73,3000,7000,0,0,-143.121,-5118.6,323.883,1.16107,'4037:0 '),\n+(4039,'hf307',571,495,495,68,73,3000,7000,0,0,115.019,-4716.56,289.321,1.68335,'4035:0 3906:0 4040:0 '),\n+(4040,'hf308',571,495,495,68,73,3000,7000,0,0,156.917,-4507.79,256.612,1.23411,'4039:0 3904:0 '),\n+(4041,'hf309',571,495,3988,68,73,3000,7000,0,1,778.297,-2898.22,7.01161,4.8391,'4042:0 '),\n+(4042,'hf310',571,495,3987,68,73,3000,7000,0,0,741.908,-3049.69,25.2093,3.79609,'4041:0 4043:0 4046:0 4047:0 4048:0 4049:0 '),\n+(4043,'hf311',571,495,3987,68,73,3000,7000,0,0,590.131,-3156.57,40.1902,3.94689,'4042:0 4044:0 4053:0 '),\n+(4044,'hf312',571,495,3987,68,73,3000,7000,0,0,471.48,-3318.84,48.7074,3.51255,'4043:0 4045:0 '),\n+(4045,'hf313',571,495,3987,68,73,3000,7000,0,0,386.081,-3089.98,71.2014,1.81688,'4044:0 4046:0 '),\n+(4046,'hf314',571,495,3987,68,73,3000,7000,0,0,508.887,-3028.15,24.4901,2.16561,'4045:0 4042:0 '),\n+(4047,'hf315',571,495,3987,68,73,3000,7000,0,0,986.117,-3034.77,57.92,0.46364,'4042:0 4048:0 '),\n+(4048,'hf316',571,495,3987,68,73,3000,7000,0,0,749.692,-3240.83,24.9581,2.15066,'4042:0 4047:0 4051:0 '),\n+(4049,'hf317',571,495,3987,68,73,3000,7000,0,0,675.991,-3161.57,61.349,1.00634,'4042:0 4050:0 '),\n+(4050,'hf318',571,495,3987,68,73,3000,7000,0,0,677.454,-3393.96,67.7866,4.88621,'4049:0 '),\n+(4051,'hf319',571,495,3987,68,73,3000,7000,0,0,566.586,-3287.72,26.0315,4.65294,'4048:0 4052:0 '),\n+(4052,'hf320',571,495,4226,68,73,3000,7000,0,0,551.1,-3494.05,3.24654,4.58853,'4051:0 '),\n+(4053,'hf321',571,495,3987,68,73,3000,7000,0,0,370.473,-3216.41,23.421,3.95629,'4043:0 4054:0 '),\n+(4054,'hf322',571,495,4474,68,73,3000,7000,0,0,223.035,-3291.75,0.0638989,3.59893,'4053:0 4055:0 '),\n+(4055,'hf323',571,495,4474,68,73,3000,7000,0,0,114.305,-3330.69,0.616794,0.370948,'4054:0 4056:0 '),\n+(4056,'hf324',571,495,3989,68,73,3000,7000,0,0,-16.534,-3453.36,32.7157,1.36763,'4055:0 4057:0 '),\n+(4057,'hf325',571,495,3990,68,73,3000,7000,0,0,-130.721,-3573.93,3.18551,1.92133,'4056:0 '),\n+(4058,'hf326',571,495,495,68,73,3000,7000,0,0,1337.07,-5914.2,292.65,4.10948,'4027:0 4059:0 '),\n+(4059,'hf327',571,495,4005,68,73,3000,7000,0,0,1323.93,-6111.92,266.982,3.40577,'4058:0 4060:0 '),\n+(4060,'hf328',571,495,4005,68,73,3000,7000,0,0,1181.44,-6169.63,232.169,2.26694,'4059:0 4061:0 '),\n+(4061,'hf329',571,495,4005,68,73,3000,7000,0,0,1118.44,-6156.85,260.616,1.64883,'4060:0 4062:0 '),\n+(4062,'hf330',571,495,495,68,73,3000,7000,0,0,1131.33,-5884.77,271.705,2.04153,'4061:0 4028:0 '),\n+(4063,'db331',571,65,4478,70,74,3000,7000,0,0,3509.64,2944.69,24.9497,4.10306,'3831:0 '),\n+(4064,'db332',571,65,65,70,74,3000,7000,0,0,3526.72,2777.23,49.7018,4.66854,'4065:0 4221:0 4228:0 '),\n+(4065,'db333',571,65,4157,70,74,3000,7000,0,0,3369.46,2655.03,38.9276,4.90416,'4064:0 4066:0 '),\n+(4066,'db334',571,65,4157,70,74,3000,7000,0,0,3440.83,2477.55,45.9125,4.61748,'4065:0 4067:0 '),\n+(4067,'db335',571,65,4157,70,74,3000,7000,0,0,3395.92,2379.05,36.7537,2.28876,'4066:0 4068:0 '),\n+(4068,'db336',571,65,4157,70,74,3000,7000,0,0,3343.5,2223.35,29.9841,5.39185,'4067:0 4070:0 4069:0 '),\n+(4069,'db337',571,65,65,70,74,3000,7000,0,3,3489.08,1998.02,64.8654,1.46526,'4068:0 4070:0 4214:0 '),\n+(4070,'db338',571,65,4160,70,74,3000,7000,0,0,3228.78,1905.36,132.824,3.97029,'4071:0 4068:0 4069:0 '),\n+(4071,'db339',571,65,4160,70,74,3000,7000,0,0,2981.37,1896.75,127.972,2.94456,'4070:0 4072:0 '),\n+(4072,'db340',571,65,4160,70,74,3000,7000,0,0,2800.15,1812.41,147.093,5.30074,'4071:0 4073:0 '),\n+(4073,'db341',571,65,4160,70,74,3000,7000,0,0,2944.01,1641.57,152.165,4.64493,'4072:0 4074:0 '),\n+(4074,'db342',571,65,4153,70,74,3000,7000,0,0,2869.62,1469.27,157.603,5.17349,'4073:0 4075:0 '),\n+(4075,'db343',571,65,4153,70,74,3000,7000,0,0,2927.17,1282.72,151.277,5.62666,'4074:0 4076:0 '),\n+(4076,'db344',571,65,4153,70,74,3000,7000,0,0,3121.27,1266.58,158.478,3.9082,'4075:0 4077:0 4082:0 '),\n+(4077,'db345',571,65,4154,70,74,3000,7000,0,0,3098.59,1055.28,114.785,4.75643,'4076:0 4078:0 4081:0 '),\n+(4078,'db346',571,65,4152,70,74,3000,7000,0,0,3015.6,886.551,57.0023,3.13067,'4077:0 4079:0 4081:0 '),\n+(4079,'db347',571,65,4152,70,74,3000,7000,0,0,2864.53,878.189,19.1406,2.82436,'4078:0 4080:0 '),\n+(4080,'db348',571,65,4152,70,74,3000,7000,0,1,2657.93,892.145,4.37495,3.30424,'4079:0 '),\n+(4081,'db349',571,65,4154,70,74,3000,7000,0,0,3216.12,884.158,119.499,2.58873,'4077:0 4078:0 4082:0 '),\n+(4082,'db350',571,65,4154,70,74,3000,7000,0,0,3342.09,1163.09,140.364,0.88363,'4076:0 4081:0 4083:0 '),\n+(4083,'db351',571,65,4154,70,74,3000,7000,0,0,3499.57,1159.74,129.579,0.224683,'4082:0 4084:0 4208:0 '),\n+(4084,'db352',571,65,4254,70,74,3000,7000,0,0,3512.34,930.529,67.6824,4.436,'4083:0 4085:0 '),\n+(4085,'db353',571,65,4254,70,74,3000,7000,0,0,3439.05,725.86,74.9159,3.52022,'4084:0 4086:0 '),\n+(4086,'db354',571,65,4254,70,74,3000,7000,0,0,3383.4,548.065,79.6602,4.13597,'4085:0 4087:0 '),\n+(4087,'db355',571,65,4254,70,74,3000,7000,0,0,3284.71,349.551,72.0866,4.38102,'4086:0 4088:0 '),\n+(4088,'db356',571,65,4254,70,74,3000,7000,0,0,3258.62,161.424,74.762,4.63863,'4087:0 4089:0 '),\n+(4089,'db357',571,65,4254,70,74,3000,7000,0,0,3199.28,-65.6434,75.8214,5.73582,'4088:0 4090:0 '),\n+(4090,'db358',571,65,4254,70,74,3000,7000,0,0,3396.24,-138.385,72.6226,6.16308,'4089:0 4091:0 4176:0 '),\n+(4091,'db359',571,65,4176,70,74,3000,7000,0,0,3614.83,-219.548,59.6726,5.91567,'4090:0 4092:0 '),\n+(4092,'db360',571,65,4254,70,74,3000,7000,0,0,3790.53,-250.696,72.8378,0.182258,'4091:0 4175:0 '),\n+(4093,'db361',571,65,4254,70,74,3000,7000,0,0,3996.13,-105.238,55.0057,0.538831,'4094:0 '),\n+(4094,'db362',571,65,4254,70,74,3000,7000,0,0,4209.42,-149.468,68.6085,5.25672,'4093:0 4095:0 '),\n+(4095,'db363',571,65,4254,70,74,3000,7000,0,0,4346.6,-340.238,86.1907,5.65727,'4094:0 4139:0 '),\n+(4096,'db364',571,65,4254,70,74,3000,7000,0,0,4531.54,-157.776,94.5998,0.726543,'4097:0 '),\n+(4097,'db365',571,65,4253,70,74,3000,7000,0,0,4529.69,-5.32293,72.4325,1.1538,'4096:0 4098:0 '),\n+(4098,'db366',571,65,4187,70,74,3000,7000,0,0,4719.33,26.5065,64.7658,0.68649,'4097:0 4099:0 '),\n+(4099,'db367',571,65,4187,70,74,3000,7000,0,0,4857.73,152.013,95.1974,0.64722,'4098:0 4100:0 4102:0 '),\n+(4100,'db368',571,65,4187,70,74,3000,7000,0,0,5023.32,291.159,160.107,0.61659,'4099:0 4101:0 '),\n+(4101,'db369',571,65,4187,70,74,3000,7000,0,0,5185.63,203.224,194.36,2.54081,'4100:0 4585:0 '),\n+(4102,'db370',571,65,4187,70,74,3000,7000,0,0,4916.98,373.751,114.702,2.28006,'4099:0 4103:0 '),\n+(4103,'db371',571,65,4396,70,74,3000,7000,0,0,4715.84,582.426,121.086,2.36646,'4102:0 4104:0 4136:0 '),\n+(4104,'db372',571,65,4254,70,74,3000,7000,0,0,4669.25,828.097,110.706,2.44265,'4105:0 4133:0 4103:0 '),\n+(4105,'db373',571,65,4254,70,74,3000,7000,0,0,4441.38,887.155,84.3941,2.82121,'4104:0 4106:0 4107:0 '),\n+(4106,'db374',571,65,4254,70,74,3000,7000,0,0,4443.49,662.985,67.5233,2.64843,'4105:0 4107:0 '),\n+(4107,'db375',571,65,4254,70,74,3000,7000,0,0,4350.16,761.448,67.5378,5.48843,'4106:0 4105:0 4108:0 '),\n+(4108,'db376',571,65,4173,70,74,3000,7000,0,0,4171.02,645.93,64.3628,5.72325,'4107:0 4109:0 '),\n+(4109,'db377',571,65,4173,70,74,3000,7000,0,0,4234.66,525,11.3008,1.28578,'4108:0 4110:0 '),\n+(4110,'db378',571,65,4173,70,74,3000,7000,0,0,4325.75,527.107,-8.31338,5.11853,'4109:0 4111:0 '),\n+(4111,'db379',571,65,4173,70,74,3000,7000,0,0,4340.91,393.399,-6.35666,0.319745,'4110:0 4112:0 '),\n+(4112,'db380',571,65,4173,70,74,3000,7000,0,0,4445.71,448.569,48.7618,3.60429,'4111:0 4113:0 '),\n+(4113,'db381',571,65,4254,70,74,3000,7000,0,0,4396.23,306.166,44.9454,3.30034,'4112:0 4114:0 '),\n+(4114,'db382',571,65,4254,70,74,3000,7000,0,0,4238.24,300.479,69.4901,3.54617,'4113:0 4115:0 '),\n+(4115,'db383',571,65,4254,70,74,3000,7000,0,0,4069.57,365.886,52.151,2.76941,'4114:0 4116:0 '),\n+(4116,'db384',571,65,4254,70,74,3000,7000,0,0,3905.43,429.963,42.0653,2.76941,'4115:0 4117:0 '),\n+(4117,'db385',571,65,4254,70,74,3000,7000,0,0,3784.72,555.764,65.4753,2.52593,'4116:0 4118:0 '),\n+(4118,'db386',571,65,4254,70,74,3000,7000,0,0,3856.57,647.11,62.7715,2.10102,'4117:0 4119:0 '),\n+(4119,'db387',571,65,4254,70,74,3000,7000,0,0,3750.11,814.498,76.6706,1.69811,'4118:0 4120:0 4123:0 '),\n+(4120,'db388',571,65,4168,70,74,3000,7000,0,0,3669.68,935.971,55.9559,1.74995,'4119:0 4121:0 '),\n+(4121,'db389',571,65,4168,70,74,3000,7000,0,0,3656.82,1058.49,58.5011,5.83088,'4120:0 4122:0 '),\n+(4122,'db390',571,65,4168,70,74,3000,7000,0,0,3822.88,1076.68,57.7067,4.99837,'4121:0 4123:0 '),\n+(4123,'db391',571,65,4168,70,74,3000,7000,0,0,3851.01,940.099,56.0659,4.66535,'4122:0 4119:0 4124:0 '),\n+(4124,'db392',571,65,4254,70,74,3000,7000,0,0,4005.33,1003,53.2598,6.17489,'4123:0 4125:0 '),\n+(4125,'db393',571,65,4254,70,74,3000,7000,0,0,4142.41,981.525,78.4202,0.463487,'4124:0 4126:0 '),\n+(4126,'db394',571,65,4254,70,74,3000,7000,0,0,4305.2,1039.06,63.1545,6.25972,'4125:0 4127:0 '),\n+(4127,'db395',571,65,65,70,74,3000,7000,0,0,4276.99,1183.3,141.02,6.17961,'4126:0 4128:0 '),\n+(4128,'db396',571,65,65,70,74,3000,7000,0,0,4489.67,1187.53,136.792,1.18448,'4127:0 4129:0 4133:0 '),\n+(4129,'db397',571,65,4169,70,74,3000,7000,0,2,4570.48,1377.12,189.542,1.18173,'4128:0 4130:0 '),\n+(4130,'db398',571,65,4169,70,74,3000,7000,0,3,4589.48,1435.55,189.222,0.103772,'4129:0 4131:0 4132:0 '),\n+(4131,'db399',571,65,4169,70,74,3000,7000,0,2,4621.53,1507.35,204.751,1.03447,'4130:0 '),\n+(4132,'db400',571,65,4171,70,74,3000,7000,0,2,4711.55,1446.21,175.428,5.44841,'4130:0 '),\n+(4133,'db401',571,65,65,70,74,3000,7000,0,0,4690.88,1098.68,123.008,2.0861,'4134:0 4128:0 4104:0 '),\n+(4134,'db402',571,65,4170,70,74,3000,7000,0,4,4841.36,1140.74,171.495,1.04781,'4135:0 4133:0 '),\n+(4135,'db403',571,65,4170,70,74,3000,7000,0,5,4947.98,1224.66,225.705,1.29599,'4134:0 '),\n+(4136,'db404',571,65,4230,70,74,3000,7000,0,0,4857.56,636.316,157.933,3.35764,'4137:0 4103:0 '),\n+(4137,'db405',571,65,4230,70,74,3000,7000,0,0,4919.39,858.686,179.409,4.72424,'4136:0 4138:0 '),\n+(4138,'db406',571,65,4230,70,74,3000,7000,0,0,5115.8,1070.31,223.911,0.494084,'4137:0 '),\n+(4139,'db407',571,65,65,70,74,3000,7000,0,0,4361.47,-666.576,126.529,4.95513,'4095:0 4140:0 4144:0 '),\n+(4140,'db408',571,65,4193,70,74,3000,7000,0,0,4506.23,-611.765,138.674,0.191691,'4139:0 4141:0 '),\n+(4141,'db409',571,65,4193,70,74,3000,7000,0,0,4635.8,-532.061,166.561,4.05115,'4140:0 4142:0 '),\n+(4142,'db410',571,65,4193,70,74,3000,7000,0,0,4701.77,-386.751,178.452,4.03308,'4141:0 4143:0 '),\n+(4143,'db411',571,65,65,70,74,3000,7000,0,0,4744.71,-265.341,170.449,0.542767,'4142:0 '),\n+(4144,'db412',571,65,65,70,74,3000,7000,0,0,4381.74,-907.37,164.196,4.73833,'4139:0 4145:0 '),\n+(4145,'db413',571,65,65,70,74,3000,7000,0,0,4453.65,-1048.77,166.994,5.44283,'4144:0 4146:0 4147:0 '),\n+(4146,'db414',571,65,4191,70,74,3000,7000,0,1,4598.46,-1084.15,165.481,5.41142,'4145:0 4151:0 '),\n+(4147,'db415',571,65,65,70,74,3000,7000,0,0,4459.56,-1263.85,163.284,4.29694,'4145:0 4148:0 4152:0 4153:0 '),\n+(4148,'db416',571,65,4194,70,74,3000,7000,0,0,4561.66,-1361.99,156.723,5.94234,'4147:0 4149:0 '),\n+(4149,'db417',571,65,4194,70,74,3000,7000,0,0,4677.53,-1359.08,162.34,2.13944,'4148:0 4150:0 4405:0 '),\n+(4150,'db418',571,65,4194,70,74,3000,7000,0,0,4810.96,-1263.2,168.051,2.83451,'4149:0 4151:0 '),\n+(4151,'db419',571,65,65,70,74,3000,7000,0,0,4682.42,-1190.97,164.492,2.29651,'4150:0 4146:0 '),\n+(4152,'db420',571,65,65,70,74,3000,7000,0,0,4426.84,-1508.64,159.241,4.50584,'4147:0 4230:0 '),\n+(4153,'db421',571,65,65,70,74,3000,7000,0,0,4306.11,-1358.64,159.518,2.56747,'4147:0 4154:0 '),\n+(4154,'db422',571,65,4189,70,74,3000,7000,0,0,4174.24,-1186.41,145.827,2.02005,'4153:0 4155:0 '),\n+(4155,'db423',571,65,4189,70,74,3000,7000,0,0,4007.83,-1254.48,133.053,2.98923,'4154:0 4156:0 '),\n+(4156,'db424',571,65,65,70,74,3000,7000,0,0,3870.4,-1277.63,147.246,3.74243,'4155:0 4157:0 4165:0 '),\n+(4157,'db425',571,65,4188,70,74,3000,7000,0,0,3760.87,-1379.1,135.314,4.06287,'4156:0 4158:0 '),\n+(4158,'db426',571,65,4188,70,74,3000,7000,0,0,3749.27,-1504.65,141.102,2.59496,'4157:0 4159:0 '),\n+(4159,'db427',571,65,4188,70,74,3000,7000,0,0,3628.59,-1546.14,118.335,2.62324,'4158:0 4160:0 '),\n+(4160,'db428',571,65,4188,70,74,3000,7000,0,0,3581.08,-1357.67,107.693,1.20402,'4159:0 4161:0 '),\n+(4161,'db429',571,65,4188,70,74,3000,7000,0,0,3627.72,-1237,112.462,1.20323,'4160:0 4162:0 '),\n+(4162,'db430',571,65,4188,70,74,3000,7000,0,0,3662.83,-1064.27,125.377,1.29591,'4161:0 4163:0 '),\n+(4163,'db431',571,65,4188,70,74,3000,7000,0,0,3755.72,-1010.08,121.509,5.72713,'4162:0 4164:0 4166:0 '),\n+(4164,'db432',571,65,4188,70,74,3000,7000,0,0,3850.53,-1132.6,122.334,6.27534,'4163:0 4165:0 '),\n+(4165,'db433',571,65,65,70,74,3000,7000,0,0,3942.27,-1148.57,140.166,4.29771,'4164:0 4156:0 '),\n+(4166,'db434',571,65,4177,70,74,3000,7000,0,0,3746.15,-891.172,162.614,2.06089,'4163:0 4167:0 4170:0 '),\n+(4167,'db435',571,65,4177,70,74,3000,7000,0,0,3650.12,-879.646,162.72,3.17459,'4166:0 4168:0 '),\n+(4168,'db436',571,65,4177,70,74,3000,7000,0,2,3590.79,-835.238,172.37,1.65563,'4167:0 4169:0 4194:0 '),\n+(4169,'db437',571,65,4243,70,74,3000,7000,0,0,3599.65,-781.467,147.621,0.0926948,'4168:0 '),\n+(4170,'db438',571,65,4177,70,74,3000,7000,0,3,3768.81,-779.501,195.937,4.02283,'4166:0 4171:0 '),\n+(4171,'db439',571,65,4177,70,74,3000,7000,0,2,3925.37,-698.927,241.206,0.865546,'4170:0 4172:0 '),\n+(4172,'db440',571,65,4175,70,74,3000,7000,0,0,3986.58,-553.999,216.076,2.58635,'4171:0 4173:0 '),\n+(4173,'db441',571,65,4254,70,74,3000,7000,0,0,3809.46,-473.161,169.556,2.73087,'4172:0 4174:0 '),\n+(4174,'db442',571,65,65,70,74,3000,7000,0,0,3724.29,-439.939,157.058,3.21388,'4173:0 4175:0 '),\n+(4175,'db443',571,65,4254,70,74,3000,7000,0,0,3784.04,-368.672,97.0346,1.91644,'4174:0 4092:0 '),\n+(4176,'db444',571,65,4254,70,74,3000,7000,0,0,3263.75,-275.159,91.4928,3.40319,'4090:0 4177:0 '),\n+(4177,'db445',571,65,65,70,74,3000,7000,0,0,3244.55,-472.809,140.618,1.83632,'4176:0 4178:0 4188:0 '),\n+(4178,'db446',571,65,65,70,74,3000,7000,0,0,3148.48,-604.869,113.192,1.5842,'4177:0 4179:0 4191:0 '),\n+(4179,'db447',571,65,4180,70,74,3000,7000,0,0,2993.93,-429.733,123.402,2.59501,'4178:0 4180:0 '),\n+(4180,'db448',571,65,4180,70,74,3000,7000,0,0,2867.29,-384.503,112.462,2.7623,'4179:0 4181:0 4187:0 '),\n+(4181,'db449',571,65,4180,70,74,3000,7000,0,0,2773.28,-465.739,116.162,4.48387,'4180:0 4182:0 '),\n+(4182,'db450',571,65,4180,70,74,3000,7000,0,0,2687.72,-431.283,71.3279,2.92957,'4181:0 4183:0 '),\n+(4183,'db451',571,65,4181,70,74,3000,7000,0,0,2536.4,-415.378,2.90773,1.58496,'4182:0 4184:0 4207:0 '),\n+(4184,'db452',571,65,4181,70,74,3000,7000,0,0,2612.51,-244.345,1.72779,6.26044,'4183:0 4185:0 '),\n+(4185,'db453',571,65,4180,70,74,3000,7000,0,0,2656.87,-171.598,62.2241,1.32029,'4184:0 4186:0 '),\n+(4186,'db454',571,65,4180,70,74,3000,7000,0,0,2737.23,-100.56,114.159,4.23648,'4185:0 4187:0 '),\n+(4187,'db455',571,65,4180,70,74,3000,7000,0,0,2792.04,-264.842,132.149,5.26534,'4186:0 4180:0 '),\n+(4188,'db456',571,65,4186,70,74,3000,7000,0,5,3231.05,-661.255,166.734,1.42239,'4177:0 4189:0 '),\n+(4189,'db457',571,65,4186,70,74,3000,7000,0,4,3272.19,-751.348,168.143,4.40298,'4188:0 4190:0 '),\n+(4190,'db458',571,65,65,70,74,3000,7000,0,0,3325.52,-1005.39,123.604,2.0507,'4189:0 4191:0 4192:0 4203:0 '),\n+(4191,'db459',571,65,65,70,74,3000,7000,0,0,3207.68,-802.517,112.975,2.23134,'4190:0 4178:0 '),\n+(4192,'db460',571,65,65,70,74,3000,7000,0,0,3400.63,-1169.43,112.122,5.78762,'4190:0 4193:0 4195:0 '),\n+(4193,'db461',571,65,65,70,74,3000,7000,0,0,3494.11,-1049.52,124.775,0.832553,'4192:0 4194:0 '),\n+(4194,'db462',571,65,4177,70,74,3000,7000,0,2,3600.71,-914.48,156.552,1.53549,'4193:0 4168:0 '),\n+(4195,'db463',571,65,65,70,74,3000,7000,0,0,3235.06,-1355.04,70.8979,3.83276,'4192:0 4196:0 '),\n+(4196,'db464',571,65,4257,70,74,3000,7000,0,0,3180.86,-1542.39,40.4347,4.7124,'4195:0 4197:0 4231:0 '),\n+(4197,'db465',571,65,4241,70,74,3000,7000,0,0,3051.36,-1392.98,57.3848,2.94133,'4196:0 4198:0 '),\n+(4198,'db466',571,65,4241,70,74,3000,7000,0,0,2889.8,-1432.73,58.3338,3.04186,'4197:0 4199:0 '),\n+(4199,'db467',571,65,4241,70,74,3000,7000,0,0,2772.55,-1373.06,40.6788,6.18974,'4198:0 4200:0 '),\n+(4200,'db468',571,65,4185,70,74,3000,7000,0,0,2882.77,-1303.94,6.48389,1.04459,'4199:0 4201:0 '),\n+(4201,'db469',571,65,4185,70,74,3000,7000,0,0,2938.22,-1169.74,6.81704,5.99025,'4200:0 4202:0 4204:0 '),\n+(4202,'db470',571,65,4185,70,74,3000,7000,0,0,3085.09,-1193.85,12.4717,5.4876,'4201:0 4203:0 '),\n+(4203,'db471',571,65,4185,70,74,3000,7000,0,0,3180.57,-1059.52,44.9918,0.29769,'4202:0 4190:0 '),\n+(4204,'db472',571,65,4185,70,74,3000,7000,0,0,2929.48,-986.506,4.6099,1.77817,'4201:0 4205:0 '),\n+(4205,'db473',571,65,4185,70,74,3000,7000,0,0,2865.52,-836.167,15.7438,2.35701,'4204:0 4206:0 '),\n+(4206,'db474',571,65,4185,70,74,3000,7000,0,0,2691.63,-707.31,8.95638,2.62875,'4205:0 4207:0 '),\n+(4207,'db475',571,65,4181,70,74,3000,7000,0,0,2662.91,-565.045,4.97671,2.87851,'4206:0 4183:0 '),\n+(4208,'db476',571,65,65,70,74,3000,7000,0,0,3597.9,1391.95,92.2854,0.792481,'4083:0 4209:0 '),\n+(4209,'db477',571,65,4165,70,74,3000,7000,0,4,3768.55,1529.38,86.92,0.415486,'4208:0 4210:0 '),\n+(4210,'db478',571,65,4165,70,74,3000,7000,0,5,3841.3,1533.41,89.7247,1.82685,'4209:0 4211:0 '),\n+(4211,'db479',571,65,4165,70,74,3000,7000,0,4,3890.52,1637.61,96.2566,0.644815,'4210:0 4212:0 '),\n+(4212,'db480',571,65,65,70,74,3000,7000,0,0,4003.51,1741.08,142.414,3.8728,'4211:0 4213:0 '),\n+(4213,'db481',571,65,65,70,74,3000,7000,0,0,3800.66,1801.11,107.946,0.35893,'4212:0 4214:0 4227:0 '),\n+(4214,'db482',571,65,65,70,74,3000,7000,0,0,3642.7,1910.26,75.9736,1.69646,'4213:0 4215:0 4069:0 '),\n+(4215,'db483',571,65,65,70,74,3000,7000,0,0,3615.88,2050.78,74.6297,1.7962,'4214:0 4216:0 4219:0 '),\n+(4216,'db484',571,65,4164,70,74,3000,7000,0,0,3709.48,2144.81,53.4192,3.56571,'4215:0 4217:0 4218:0 '),\n+(4217,'db485',571,65,4164,70,74,3000,7000,0,0,3706.64,2076.92,21.8594,1.15533,'4216:0 4218:0 '),\n+(4218,'db486',571,65,4164,70,74,3000,7000,0,0,3772.34,2169.36,27.3597,4.8828,'4217:0 4216:0 '),\n+(4219,'db487',571,65,65,70,74,3000,7000,0,0,3638.81,2223.64,76.3879,1.34851,'4215:0 4220:0 '),\n+(4220,'db488',571,65,65,70,74,3000,7000,0,0,3608.56,2424.79,84.7521,0.47515,'4219:0 4221:0 '),\n+(4221,'db489',571,65,65,70,74,3000,7000,0,0,3667.57,2606.35,104.934,2.34754,'4220:0 4064:0 4222:0 '),\n+(4222,'db490',571,65,65,70,74,3000,7000,0,0,3821.64,2594.47,138.086,5.63442,'4221:0 4223:0 '),\n+(4223,'db491',571,65,4163,70,74,3000,7000,0,0,3877.75,2397.8,152.255,5.33596,'4222:0 4224:0 '),\n+(4224,'db492',571,65,4163,70,74,3000,7000,0,0,4003.82,2286.07,153.425,6.19125,'4223:0 4225:0 '),\n+(4225,'db493',571,65,4163,70,74,3000,7000,0,0,4084.73,2159.31,153.682,4.48536,'4224:0 4226:0 '),\n+(4226,'db494',571,65,4163,70,74,3000,7000,0,0,3961.11,2124.54,131.41,3.85941,'4225:0 4227:0 '),\n+(4227,'db495',571,65,65,70,74,3000,7000,0,0,3825.91,1954.77,104.913,4.14765,'4226:0 4213:0 '),\n+(4228,'db496',571,65,4151,70,74,3000,7000,0,4,3706.43,2835.58,88.7151,0.419359,'4064:0 4229:0 '),\n+(4229,'db497',571,65,4151,70,74,3000,7000,0,5,3828.74,2884,90.3388,0.171959,'4228:0 '),\n+(4230,'gh498',571,394,394,72,76,3000,7000,0,0,4412.91,-1618.03,162.125,4.64085,'4152:0 4243:0 '),\n+(4231,'gh499',571,394,394,72,76,3000,7000,0,0,3182.34,-1659.02,38.7919,4.89218,'4196:0 4232:0 '),\n+(4232,'gh500',571,394,394,72,76,3000,7000,0,0,3170.1,-1849.63,70.0118,5.13957,'4231:0 4233:0 '),\n+(4233,'gh501',571,394,4236,72,76,3000,7000,0,0,3193.69,-1991.71,85.0008,6.13546,'4232:0 4234:0 4260:0 '),\n+(4234,'gh502',571,394,394,72,76,3000,7000,0,0,3351.7,-1957.7,116.26,3.20042,'4233:0 4235:0 4256:0 '),\n+(4235,'gh503',571,394,394,72,76,3000,7000,0,0,3506.14,-1975.54,165.694,5.76004,'4234:0 4236:0 4255:0 '),\n+(4236,'gh504',571,394,394,72,76,3000,7000,0,0,3654.24,-2134.59,147.89,4.94165,'4235:0 4237:0 4285:0 '),\n+(4237,'gh505',571,394,394,72,76,3000,7000,0,0,3768.13,-2266.2,173.421,6.00979,'4236:0 4238:0 4251:0 4285:0 '),\n+(4238,'gh506',571,394,394,72,76,3000,7000,0,0,3965.13,-2347.84,213.634,6.13467,'4237:0 4239:0 4400:0 '),\n+(4239,'gh507',571,394,394,72,76,3000,7000,0,0,4179.57,-2348.21,225.457,0.204908,'4238:0 4240:0 4389:0 '),\n+(4240,'gh508',571,394,394,72,76,3000,7000,0,0,4360.95,-2316.79,201.282,0.15857,'4239:0 4241:0 4250:0 '),\n+(4241,'gh509',571,394,394,72,76,3000,7000,0,0,4456.7,-2146.34,174.126,1.54558,'4240:0 4242:0 '),\n+(4242,'gh510',571,394,394,72,76,3000,7000,0,0,4445.16,-1972.91,158.144,1.95792,'4241:0 4243:0 '),\n+(4243,'gh511',571,394,394,72,76,3000,7000,0,0,4441.13,-1782.37,162.404,1.80319,'4242:0 4230:0 4244:0 '),\n+(4244,'gh512',571,394,394,72,76,3000,7000,0,0,4395.14,-1892.04,161.168,3.62925,'4243:0 4245:0 '),\n+(4245,'gh513',571,394,4209,72,76,3000,7000,0,0,4294.12,-1906.66,197.755,3.31587,'4244:0 4246:0 4247:0 4248:0 '),\n+(4246,'gh514',571,394,4209,72,76,3000,7000,0,0,4245.43,-2019.66,235.391,1.60371,'4245:0 '),\n+(4247,'gh515',571,394,4209,72,76,3000,7000,0,0,4219.61,-1824.36,202.548,2.41267,'4245:0 '),\n+(4248,'gh516',571,394,4209,72,76,3000,7000,0,0,4141.35,-1993.19,212.874,4.66597,'4245:0 4249:0 '),\n+(4249,'gh517',571,394,4209,72,76,3000,7000,0,0,4200.73,-2152.09,218.191,0.0124693,'4248:0 4250:0 '),\n+(4250,'gh518',571,394,394,72,76,3000,7000,0,0,4337.91,-2212.2,191.313,5.10972,'4249:0 4240:0 '),\n+(4251,'gh519',571,394,394,72,76,3000,7000,0,0,3919.84,-2211.56,210.955,0.375331,'4237:0 4252:0 '),\n+(4252,'gh520',571,394,394,72,76,3000,7000,0,0,3841.19,-2055.11,210.168,1.65396,'4251:0 4253:0 '),\n+(4253,'gh521',571,394,394,72,76,3000,7000,0,0,3817.14,-1865.71,214.679,1.96419,'4252:0 4254:0 '),\n+(4254,'gh522',571,394,394,72,76,3000,7000,0,0,3654.79,-1866.78,173.387,2.8674,'4253:0 4255:0 '),\n+(4255,'gh523',571,394,394,72,76,3000,7000,0,0,3559.72,-1897.37,155.876,3.47686,'4254:0 4235:0 '),\n+(4256,'gh524',571,394,394,72,76,3000,7000,0,0,3387.84,-2133.26,124.553,5.44191,'4234:0 4257:0 '),\n+(4257,'gh525',571,394,4206,72,76,3000,7000,0,4,3345.18,-2217.45,119.375,3.61665,'4256:0 4258:0 '),\n+(4258,'gh526',571,394,4206,72,76,3000,7000,0,5,3256.98,-2231.76,116.09,1.0425,'4257:0 4259:0 '),\n+(4259,'gh527',571,394,394,72,76,3000,7000,0,0,3086.49,-2267.46,94.942,1.73561,'4258:0 4260:0 4268:0 '),\n+(4260,'gh528',571,394,394,72,76,3000,7000,0,0,3084.66,-2084.36,87.6685,1.27615,'4259:0 4233:0 4261:0 '),\n+(4261,'gh529',571,394,394,72,76,3000,7000,0,0,2953.2,-1963.36,51.3225,2.81396,'4260:0 4262:0 '),\n+(4262,'gh530',571,394,4242,72,76,3000,7000,0,0,2828.38,-1917.21,9.14124,2.88465,'4261:0 4263:0 4264:0 '),\n+(4263,'gh531',571,394,4242,72,76,3000,7000,0,0,2698.31,-2040.99,3.89624,0.465604,'4262:0 4267:0 '),\n+(4264,'gh532',571,394,4242,72,76,3000,7000,0,0,2755.77,-1781.45,5.41989,5.167,'4262:0 4265:0 '),\n+(4265,'gh533',571,394,4242,72,76,3000,7000,0,0,2565.61,-1807.96,9.92644,3.51374,'4264:0 4266:0 '),\n+(4266,'gh534',571,394,4242,72,76,3000,7000,0,0,2542.58,-1990.88,8.43344,5.20077,'4265:0 4267:0 '),\n+(4267,'gh535',571,394,4242,72,76,3000,7000,0,0,2617,-2122.41,7.0106,0.525292,'4266:0 4263:0 '),\n+(4268,'gh536',571,394,394,72,76,3000,7000,0,0,3111.6,-2469.39,60.839,4.64079,'4259:0 4269:0 '),\n+(4269,'gh537',571,394,394,72,76,3000,7000,0,0,3050.93,-2690.26,65.2339,4.32742,'4268:0 4270:0 '),\n+(4270,'gh538',571,394,394,72,76,3000,7000,0,0,2996.43,-2911.54,99.7541,3.55929,'4269:0 4271:0 4277:0 '),\n+(4271,'gh539',571,394,394,72,76,3000,7000,0,0,2806.9,-2891.38,64.0493,3.18937,'4270:0 4272:0 '),\n+(4272,'gh540',571,394,394,72,76,3000,7000,0,0,2688.1,-2877.41,68.4325,1.86676,'4273:0 4271:0 3965:0 3956:0 '),\n+(4273,'gh541',571,394,4207,72,76,3000,7000,0,0,2863.15,-2691.55,84.6612,0.692585,'4274:0 4272:0 '),\n+(4274,'gh542',571,394,4207,72,76,3000,7000,0,0,2913.28,-2523.08,77.2727,2.2516,'4273:0 4275:0 '),\n+(4275,'gh543',571,394,4207,72,76,3000,7000,0,0,2759.62,-2433.25,39.5256,4.18681,'4274:0 4276:0 '),\n+(4276,'gh544',571,394,394,72,76,3000,7000,0,0,2655.99,-2570.44,12.8707,0.715349,'4275:0 3966:0 '),\n+(4277,'gh545',571,394,4240,72,76,3000,7000,0,0,3159.97,-2966.67,125.976,5.16462,'4270:0 4278:0 '),\n+(4278,'gh546',571,394,394,72,76,3000,7000,0,0,3229.99,-3097.97,155.647,5.16069,'4277:0 4279:0 4287:0 '),\n+(4279,'gh547',571,394,394,72,76,3000,7000,0,0,3347.86,-2939.95,194.535,0.886556,'4278:0 4280:0 '),\n+(4280,'gh548',571,394,4204,72,76,3000,7000,0,3,3409.22,-2819.78,200.664,5.07272,'4279:0 4281:0 '),\n+(4281,'gh549',571,394,394,72,76,3000,7000,0,0,3563.32,-2837.92,196.693,3.21211,'4280:0 4282:0 '),\n+(4282,'gh550',571,394,394,72,76,3000,7000,0,0,3639.37,-2888.65,220.844,1.05698,'4281:0 4283:0 4286:0 4386:0 '),\n+(4283,'gh551',571,394,394,72,76,3000,7000,0,0,3750.73,-2701.59,175.222,0.808005,'4282:0 4284:0 4402:0 '),\n+(4284,'gh552',571,394,394,72,76,3000,7000,0,0,3701.9,-2499.94,160.171,2.01988,'4283:0 4285:0 '),\n+(4285,'gh553',571,394,394,72,76,3000,7000,0,0,3667.41,-2329.55,156.4,0.83785,'4284:0 4237:0 4236:0 '),\n+(4286,'gh554',571,394,394,72,76,3000,7000,0,0,3567.56,-3072.84,238.573,4.01871,'4282:0 4287:0 4288:0 '),\n+(4287,'gh555',571,394,394,72,76,3000,7000,0,0,3355.89,-3183.89,200.874,2.94663,'4286:0 4278:0 '),\n+(4288,'gh556',571,394,394,72,76,3000,7000,0,0,3543.08,-3277.22,242.517,4.88658,'4286:0 4289:0 '),\n+(4289,'gh557',571,394,394,72,76,3000,7000,0,0,3676.96,-3469.09,242.035,5.54866,'4288:0 4290:0 4383:0 '),\n+(4290,'gh558',571,394,394,72,76,3000,7000,0,0,3696.59,-3688.31,209.189,4.55906,'4289:0 4291:0 '),\n+(4291,'gh559',571,394,394,72,76,3000,7000,0,0,3728.04,-3862.81,183.316,0.164743,'4290:0 4292:0 4294:0 4301:0 '),\n+(4292,'gh560',571,394,4215,72,76,3000,7000,0,0,3590.62,-3901.08,196.64,2.77227,'4291:0 4293:0 '),\n+(4293,'gh561',571,394,4215,72,76,3000,7000,0,0,3525.9,-3755.42,228.317,2.26176,'4292:0 '),\n+(4294,'gh562',571,394,395,72,76,3000,7000,0,0,3841.06,-3743.21,175.461,6.13141,'4291:0 4295:0 '),\n+(4295,'gh563',571,394,395,72,76,3000,7000,0,0,3974.14,-3774.46,151.082,6.17382,'4294:0 4296:0 '),\n+(4296,'gh564',571,394,395,72,76,3000,7000,0,0,4052.02,-3740.14,220.288,4.50485,'4295:0 4297:0 '),\n+(4297,'gh565',571,394,395,72,76,3000,7000,0,0,4135.39,-3710.81,180.991,2.0819,'4296:0 4298:0 '),\n+(4298,'gh566',571,394,395,72,76,3000,7000,0,0,4194.15,-3814.05,181.668,4.59518,'4297:0 4299:0 '),\n+(4299,'gh567',571,394,395,72,76,3000,7000,0,0,4181.7,-3982.87,170.498,4.5402,'4298:0 4300:0 4363:0 '),\n+(4300,'gh568',571,394,394,72,76,3000,7000,0,0,4024.2,-4043.93,176.713,3.04794,'4299:0 4301:0 4363:0 '),\n+(4301,'gh569',571,394,394,72,76,3000,7000,0,0,3787.44,-3987.74,181.678,2.65995,'4300:0 4291:0 4302:0 '),\n+(4302,'gh570',571,394,394,72,76,3000,7000,0,0,3718.3,-4188.38,192.248,4.50249,'4301:0 4303:0 4310:0 '),\n+(4303,'gh571',571,394,394,72,76,3000,7000,0,0,3545.36,-4300.26,227.855,3.59221,'4302:0 4304:0 '),\n+(4304,'gh572',571,394,394,72,76,3000,7000,0,0,3375.07,-4408.72,245.826,4.29907,'4303:0 4305:0 4307:0 '),\n+(4305,'gh573',571,394,4480,72,76,3000,7000,0,0,3261.77,-4590.54,305.739,3.95742,'4304:0 4306:0 '),\n+(4306,'gh574',571,394,4480,72,76,3000,7000,0,0,3089.14,-4641.2,316.308,3.35188,'4305:0 3999:0 '),\n+(4307,'gh575',571,394,4218,72,76,3000,7000,0,0,3502.07,-4548.51,221.433,3.38171,'4304:0 4308:0 '),\n+(4308,'gh576',571,394,394,72,76,3000,7000,0,0,3656.98,-4455.52,184.363,5.84315,'4307:0 4309:0 '),\n+(4309,'gh577',571,394,394,72,76,3000,7000,0,0,3731.98,-4511.53,193.763,0.757702,'4308:0 4310:0 '),\n+(4310,'gh578',571,394,394,72,76,3000,7000,0,5,3851.11,-4369.54,192.918,1.37424,'4309:0 4302:0 4311:0 '),\n+(4311,'gh579',571,394,4205,72,76,3000,7000,0,0,3939.37,-4409.34,238.255,4.98392,'4310:0 4312:0 '),\n+(4312,'gh580',571,394,4205,72,76,3000,7000,0,0,4062.37,-4401.54,260.429,0.235388,'4311:0 4313:0 4362:0 4364:0 '),\n+(4313,'gh581',571,394,394,72,76,3000,7000,0,0,4171.31,-4502.24,219.959,1.1284,'4312:0 4314:0 '),\n+(4314,'gh582',571,394,4205,72,76,3000,7000,0,0,4003.62,-4566.46,195.348,3.13431,'4313:0 4315:0 '),\n+(4315,'gh583',571,394,394,72,76,3000,7000,0,0,4008.13,-4692.66,141.153,5.45436,'4314:0 4316:0 '),\n+(4316,'gh584',571,394,4231,72,76,3000,7000,0,0,4082.28,-4754.21,96.3716,4.76714,'4315:0 4317:0 '),\n+(4317,'gh585',571,394,4249,72,76,3000,7000,0,0,4193.08,-4880.87,42.4572,3.89614,'4316:0 4318:0 4328:0 4336:0 '),\n+(4318,'gh586',571,394,4249,72,76,3000,7000,0,0,4317.27,-4702.62,75.8335,0.62967,'4317:0 4319:0 '),\n+(4319,'gh587',571,394,4249,72,76,3000,7000,0,0,4444.07,-4566.46,104.898,1.65462,'4318:0 4320:0 '),\n+(4320,'gh588',571,394,4249,72,76,3000,7000,0,0,4428.45,-4387.5,151.381,1.08913,'4319:0 4321:0 '),\n+(4321,'gh589',571,394,4159,72,76,3000,7000,0,0,4438.72,-4286.42,161.56,6.09212,'4320:0 4322:0 4374:0 '),\n+(4322,'gh590',571,394,4249,72,76,3000,7000,0,0,4621.51,-4357.67,181.183,5.95781,'4321:0 4323:0 '),\n+(4323,'gh591',571,394,4221,72,76,3000,7000,0,0,4732.05,-4454.6,194.355,5.45673,'4322:0 4324:0 '),\n+(4324,'gh592',571,394,4221,72,76,3000,7000,0,0,4820.92,-4522.91,200.404,5.83294,'4323:0 4325:0 '),\n+(4325,'gh593',571,394,4221,72,76,3000,7000,0,0,4909.98,-4586.39,219.616,4.43492,'4324:0 4326:0 '),\n+(4326,'gh594',571,394,4221,72,76,3000,7000,0,0,4984.98,-4692.79,219.491,5.1245,'4325:0 4327:0 '),\n+(4327,'gh595',571,394,4221,72,76,3000,7000,0,0,5041.25,-4817,219.501,2.53662,'4326:0 '),\n+(4328,'gh596',571,394,4212,72,76,3000,7000,0,0,4339.89,-4870.51,34.7802,0.17335,'4317:0 4329:0 '),\n+(4329,'gh597',571,394,4216,72,76,3000,7000,0,0,4474.49,-4921.22,14.201,5.96566,'4328:0 4330:0 4331:0 '),\n+(4330,'gh598',571,394,4212,72,76,3000,7000,0,0,4518.04,-5017.36,3.25924,5.12764,'4329:0 '),\n+(4331,'gh599',571,394,4216,72,76,3000,7000,0,0,4569.4,-4865.21,47.9919,0.149002,'4329:0 4332:0 4333:0 4334:0 '),\n+(4332,'gh600',571,394,4216,72,76,3000,7000,0,0,4707.48,-4794.55,47.992,5.06167,'4331:0 4333:0 '),\n+(4333,'gh601',571,394,4216,72,76,3000,7000,0,0,4708.25,-4910.12,47.9928,1.36166,'4331:0 4332:0 '),\n+(4334,'gh602',571,394,4216,72,76,3000,7000,0,0,4744.53,-4859.91,26.2962,0.387759,'4331:0 4335:0 '),\n+(4335,'gh603',571,394,4216,72,76,3000,7000,0,0,4816.99,-4789.4,25.4718,0.872349,'4334:0 '),\n+(4336,'gh604',571,394,4249,72,76,3000,7000,0,0,4022.33,-4997.21,41.214,3.78223,'4317:0 4337:0 4345:0 '),\n+(4337,'gh605',571,394,4249,72,76,3000,7000,0,0,3816.35,-5011.96,106.526,3.31727,'4336:0 4338:0 4346:0 '),\n+(4338,'gh606',571,394,4220,72,76,3000,7000,0,0,3646.81,-5000.53,175.852,4.1867,'4337:0 4339:0 '),\n+(4339,'gh607',571,394,4220,72,76,3000,7000,0,0,3524.22,-5120.65,233.744,2.61591,'4338:0 4340:0 4343:0 '),\n+(4340,'gh608',571,394,4220,72,76,3000,7000,0,0,3419.01,-4995.77,285.739,2.5845,'4339:0 4341:0 '),\n+(4341,'gh609',571,394,4220,72,76,3000,7000,0,0,3356.74,-5082.19,325.289,3.94009,'4340:0 4342:0 '),\n+(4342,'gh610',571,394,4220,72,76,3000,7000,0,0,3310.99,-5122.5,340.978,1.36004,'4341:0 '),\n+(4343,'gh611',571,394,4220,72,76,3000,7000,0,0,3433.34,-5250.17,269.339,1.01289,'4339:0 4344:0 '),\n+(4344,'gh612',571,394,4220,72,76,3000,7000,0,0,3407.12,-5388.15,267.856,1.78573,'4343:0 '),\n+(4345,'gh613',571,394,4212,72,76,3000,7000,0,0,4006.9,-5232.47,7.75033,1.18098,'4336:0 4356:0 '),\n+(4346,'gh614',571,394,394,72,76,3000,7000,0,0,3757.96,-5153.08,119.324,4.14823,'4337:0 4347:0 '),\n+(4347,'gh615',571,394,394,72,76,3000,7000,0,0,3598.76,-5357.93,139.869,4.05555,'4346:0 4348:0 '),\n+(4348,'gh616',571,394,4213,72,76,3000,7000,0,0,3443.06,-5490.97,198.431,3.26623,'4347:0 4349:0 '),\n+(4349,'gh617',571,394,4213,72,76,3000,7000,0,0,3274.45,-5572.3,213.641,3.71783,'4348:0 4350:0 '),\n+(4350,'gh618',571,394,4213,72,76,3000,7000,0,0,3100.03,-5709.35,220.326,3.74532,'4349:0 4355:0 '),\n+(4351,'hf619',571,495,4061,68,73,3000,7000,0,0,2323.35,-5813.06,251.394,3.16805,'4014:0 4015:0 4352:0 '),\n+(4352,'hf620',571,495,495,68,73,3000,7000,0,0,2519.29,-5851.8,276.256,4.73492,'4351:0 4353:0 '),\n+(4353,'hf621',571,495,495,68,73,3000,7000,0,0,2703.09,-5953.52,271.511,6.11722,'4352:0 4354:0 '),\n+(4354,'hf622',571,495,4252,68,73,3000,7000,0,0,2849.67,-5840.96,273.44,0.629637,'4353:0 4355:0 '),\n+(4355,'hf623',571,495,4252,68,73,3000,7000,0,0,3003.04,-5779.08,254.433,0.523608,'4354:0 4350:0 '),\n+(4356,'gh624',571,394,4212,72,76,3000,7000,0,0,4153.59,-5224.2,7.42476,6.08423,'4345:0 4357:0 '),\n+(4357,'gh625',571,394,4212,72,76,3000,7000,0,0,4327.94,-5342.7,4.49671,5.82112,'4356:0 4358:0 '),\n+(4358,'gh626',571,394,4244,72,76,3000,7000,0,0,4543.08,-5485.22,2.18391,5.50775,'4357:0 4359:0 '),\n+(4359,'gh627',571,394,4244,72,76,3000,7000,0,0,4695.42,-5635.74,77.5219,4.55742,'4358:0 4360:0 '),\n+(4360,'gh628',571,394,4245,72,76,3000,7000,0,0,4616.66,-5660.81,114.593,4.22877,'4359:0 4361:0 '),\n+(4361,'gh629',571,394,4245,72,76,3000,7000,0,0,4593.57,-5707.41,184.506,1.02041,'4360:0 '),\n+(4362,'gh630',571,394,394,72,76,3000,7000,0,0,4113.47,-4233.27,243.732,1.89258,'4312:0 4363:0 '),\n+(4363,'gh631',571,394,394,72,76,3000,7000,0,1,4125.58,-4095.14,182.823,2.77224,'4362:0 4300:0 4299:0 '),\n+(4364,'gh632',571,394,394,72,76,3000,7000,0,0,4172.63,-4310.2,238.733,2.85314,'4312:0 4365:0 '),\n+(4365,'gh633',571,394,394,72,76,3000,7000,0,0,4326.78,-4119.6,193.825,0.547988,'4364:0 4366:0 '),\n+(4366,'gh634',571,394,394,72,76,3000,7000,0,0,4486.09,-3977.4,186.997,5.61774,'4365:0 4367:0 4376:0 '),\n+(4367,'gh635',571,394,394,72,76,3000,7000,0,0,4625.2,-4092.13,199.11,2.30728,'4366:0 4368:0 '),\n+(4368,'gh636',571,394,394,72,76,3000,7000,0,0,4734.83,-4181.86,231.297,2.31358,'4367:0 4369:0 '),\n+(4369,'gh637',571,394,394,72,76,3000,7000,0,0,4906.69,-4306.46,257.585,0.692519,'4368:0 4370:0 4403:0 '),\n+(4370,'gh638',571,394,4214,72,76,3000,7000,0,0,5016.3,-4437.54,278.117,5.31851,'4369:0 4371:0 '),\n+(4371,'gh639',571,394,4214,72,76,3000,7000,0,0,5101.89,-4569.13,283.736,5.11902,'4370:0 4372:0 '),\n+(4372,'gh640',571,394,4214,72,76,3000,7000,0,0,5193.65,-4729.96,293.156,5.98138,'4371:0 4373:0 '),\n+(4373,'gh641',571,394,4214,72,76,3000,7000,0,0,5380.16,-4761.41,305.589,6.26491,'4372:0 '),\n+(4374,'gh642',571,394,4159,72,76,3000,7000,0,2,4508.01,-4224.81,167.488,4.05322,'4321:0 4375:0 '),\n+(4375,'gh643',571,394,4159,72,76,3000,7000,0,3,4593.24,-4223.94,178.654,3.05419,'4374:0 '),\n+(4376,'gh644',571,394,394,72,76,3000,7000,0,0,4397.58,-3823.41,207.663,1.98605,'4366:0 4377:0 '),\n+(4377,'gh645',571,394,4235,72,76,3000,7000,0,0,4363.62,-3661.89,253.292,1.03572,'4376:0 4378:0 4380:0 '),\n+(4378,'gh646',571,394,4270,72,76,3000,7000,0,0,4464.25,-3523.69,231.349,0.662651,'4377:0 4379:0 '),\n+(4379,'gh647',571,394,4270,72,76,3000,7000,0,0,4540.35,-3448.14,226.932,0.666578,'4378:0 4404:0 '),\n+(4380,'gh648',571,394,394,72,76,3000,7000,0,0,4254.62,-3537.34,262.169,3.11545,'4377:0 4381:0 '),\n+(4381,'gh649',571,394,394,72,76,3000,7000,0,0,4082.82,-3452.53,279.273,2.96073,'4380:0 4382:0 '),\n+(4382,'gh650',571,394,4267,72,76,3000,7000,0,0,4017.93,-3398.46,291.406,1.89652,'4381:0 4383:0 4384:0 '),\n+(4383,'gh651',571,394,394,72,76,3000,7000,0,0,3805.22,-3452.83,276.397,3.26311,'4382:0 4289:0 '),\n+(4384,'gh652',571,394,394,72,76,3000,7000,0,0,3927.34,-3218.24,296.696,2.32848,'4382:0 4385:0 4392:0 '),\n+(4385,'gh653',571,394,394,72,76,3000,7000,0,0,3809.69,-3057.95,274.256,2.59945,'4384:0 4386:0 4399:0 '),\n+(4386,'gh654',571,394,394,72,76,3000,7000,0,0,3727.35,-2986.21,236.602,2.62301,'4385:0 4282:0 4387:0 '),\n+(4387,'gh655',571,394,4203,72,76,3000,7000,0,0,3799.13,-2875.46,222.297,0.855862,'4386:0 4388:0 '),\n+(4388,'gh656',571,394,394,72,76,3000,7000,0,0,3912.6,-2792.74,176.353,3.96212,'4387:0 '),\n+(4389,'gh657',571,394,4199,72,76,3000,7000,0,0,4204.22,-2467.24,229.848,5.58004,'4239:0 4390:0 4391:0 '),\n+(4390,'gh658',571,394,4199,72,76,3000,7000,0,1,4355.92,-2485.04,242.225,3.56707,'4389:0 4391:0 '),\n+(4391,'gh659',571,394,4199,72,76,3000,7000,0,0,4320.51,-2585.42,246.459,1.97429,'4390:0 4389:0 '),\n+(4392,'gh660',571,394,4222,72,76,3000,7000,0,0,4055.91,-3147.98,278.056,5.70496,'4384:0 4393:0 '),\n+(4393,'gh661',571,394,4222,72,76,3000,7000,0,0,4250.54,-3177.85,307.936,0.898319,'4392:0 4394:0 '),\n+(4394,'gh662',571,394,4222,72,76,3000,7000,0,0,4326.86,-3320.66,310.551,0.546446,'4393:0 4395:0 '),\n+(4395,'gh663',571,394,4222,72,76,3000,7000,0,0,4447.75,-3199.73,313.463,2.16044,'4394:0 4396:0 '),\n+(4396,'gh664',571,394,4222,72,76,3000,7000,0,0,4418.84,-2984.71,309.349,1.76303,'4395:0 4397:0 '),\n+(4397,'gh665',571,394,4222,72,76,3000,7000,0,0,4226.67,-2862.19,281.474,3.5718,'4396:0 4398:0 '),\n+(4398,'gh666',571,394,4222,72,76,3000,7000,0,0,4035.13,-2946.41,276.096,3.8946,'4397:0 4399:0 '),\n+(4399,'gh667',571,394,4222,72,76,3000,7000,0,0,3928.19,-3008.94,275.401,3.52703,'4398:0 4385:0 '),\n+(4400,'gh668',571,394,394,72,76,3000,7000,0,0,3974.25,-2486.57,216.336,4.66038,'4238:0 4401:0 '),\n+(4401,'gh669',571,394,4202,72,76,3000,7000,0,0,3933.08,-2603.19,206.74,5.22586,'4400:0 4402:0 '),\n+(4402,'gh670',571,394,394,72,76,3000,7000,0,0,3783,-2602.59,191.183,4.81351,'4401:0 4283:0 '),\n+(4403,'zd671',571,66,66,73,77,3000,7000,0,0,5075.22,-4157.1,351.671,0.704319,'4369:0 4530:0 4531:0 '),\n+(4404,'zd672',571,66,66,73,77,3000,7000,0,0,4642.75,-3362.88,292.419,0.845695,'4379:0 4470:0 '),\n+(4405,'zd673',571,66,66,73,77,3000,7000,0,0,4845.51,-1504.94,248.946,5.30284,'4149:0 4406:0 '),\n+(4406,'zd674',571,66,66,73,77,3000,7000,0,0,4915.37,-1688.61,248.309,4.74834,'4405:0 4407:0 '),\n+(4407,'zd675',571,66,66,73,77,3000,7000,0,0,4913.71,-1902.76,248.309,4.71615,'4406:0 4408:0 4410:0 '),\n+(4408,'zd676',571,66,66,73,77,3000,7000,0,0,4907.24,-2149.46,248.308,4.51509,'4407:0 4409:0 4410:0 '),\n+(4409,'zd677',571,66,4316,73,77,3000,7000,0,0,4935.58,-2282.22,243.077,5.02638,'4408:0 4446:0 '),\n+(4410,'zd678',571,66,66,73,77,3000,7000,0,0,4948.85,-2047.71,248.309,0.0634512,'4408:0 4407:0 4411:0 '),\n+(4411,'zd679',571,66,66,73,77,3000,7000,0,0,5154.72,-2050.3,248.297,1.1198,'4410:0 4412:0 4442:0 4443:0 '),\n+(4412,'zd680',571,66,66,73,77,3000,7000,0,0,5198.14,-1908,243.765,1.97824,'4411:0 4413:0 '),\n+(4413,'zd681',571,66,4311,73,77,3000,7000,0,0,5168.01,-1763.65,243.57,1.69157,'4412:0 4414:0 '),\n+(4414,'zd682',571,66,4311,73,77,3000,7000,0,0,5227.64,-1629.23,235.86,1.70729,'4413:0 4415:0 '),\n+(4415,'zd683',571,66,66,73,77,3000,7000,0,0,5202.17,-1444.6,235.3,1.67195,'4414:0 4416:0 4417:0 '),\n+(4416,'zd684',571,66,4312,73,77,3000,7000,0,1,5228.85,-1333.15,242.312,5.2078,'4415:0 4417:0 '),\n+(4417,'zd685',571,66,66,73,77,3000,7000,0,0,5369.86,-1421.32,236.955,3.0236,'4416:0 4415:0 4418:0 '),\n+(4418,'zd686',571,66,66,73,77,3000,7000,0,0,5446.59,-1338.52,239.221,4.34385,'4417:0 4419:0 4420:0 4440:0 '),\n+(4419,'zd687',571,66,66,73,77,3000,7000,0,0,5443.61,-1214.88,247.443,1.55882,'4418:0 4561:0 '),\n+(4420,'zd688',571,66,4313,73,77,3000,7000,0,0,5555.66,-1397.11,239.86,2.99374,'4418:0 4421:0 '),\n+(4421,'zd689',571,66,4313,73,77,3000,7000,0,0,5695.79,-1400.51,234.446,5.54941,'4420:0 4422:0 4435:0 '),\n+(4422,'zd690',571,66,4313,73,77,3000,7000,0,0,5775.25,-1545.64,229.906,6.10312,'4421:0 4423:0 4435:0 '),\n+(4423,'zd691',571,66,4469,73,77,3000,7000,0,0,5886.45,-1638.86,237.734,5.61617,'4422:0 4424:0 4436:0 '),\n+(4424,'zd692',571,66,4469,73,77,3000,7000,0,0,5972.87,-1716.32,231.167,5.38055,'4423:0 4425:0 '),\n+(4425,'zd693',571,66,4469,73,77,3000,7000,0,0,6050.18,-1854.06,239.866,4.90932,'4424:0 4426:0 '),\n+(4426,'zd694',571,66,4315,73,77,3000,7000,0,0,6083.8,-1956.71,235.309,5.74812,'4425:0 4427:0 4429:0 '),\n+(4427,'zd695',571,66,4315,73,77,3000,7000,0,0,6239.25,-1977.17,235.732,4.86297,'4426:0 4428:0 '),\n+(4428,'zd696',571,66,4315,73,77,3000,7000,0,0,6209.7,-2182.71,236.212,3.31259,'4427:0 4429:0 '),\n+(4429,'zd697',571,66,4315,73,77,3000,7000,0,0,6062.56,-2208.12,234.275,1.69703,'4428:0 4426:0 4430:0 '),\n+(4430,'zd698',571,66,4315,73,77,3000,7000,0,0,5846.96,-2232.9,236.499,3.12253,'4429:0 4431:0 '),\n+(4431,'zd699',571,66,4468,73,77,3000,7000,0,0,5680.87,-2213.84,239.83,3.10525,'4430:0 4432:0 4437:0 '),\n+(4432,'zd700',571,66,4468,73,77,3000,7000,0,0,5565.53,-2198.52,235.496,1.86432,'4431:0 4433:0 '),\n+(4433,'zd701',571,66,4468,73,77,3000,7000,0,0,5571.97,-1996.67,237.88,1.26977,'4432:0 4434:0 4437:0 4438:0 '),\n+(4434,'zd702',571,66,4468,73,77,3000,7000,0,0,5653.64,-1810.94,236.435,1.32868,'4433:0 4435:0 4436:0 '),\n+(4435,'zd703',571,66,4313,73,77,3000,7000,0,0,5609.8,-1610.43,237.022,0.732563,'4434:0 4422:0 4421:0 '),\n+(4436,'zd704',571,66,4468,73,77,3000,7000,0,0,5833.14,-1759.05,233.346,1.1936,'4434:0 4423:0 4437:0 '),\n+(4437,'zd705',571,66,4468,73,77,3000,7000,0,0,5766.32,-1991.79,235.993,4.71376,'4436:0 4431:0 4433:0 '),\n+(4438,'zd706',571,66,66,73,77,3000,7000,0,0,5444.04,-1955.64,248.222,4.72161,'4433:0 4439:0 4441:0 4442:0 '),\n+(4439,'zd707',571,66,66,73,77,3000,7000,0,0,5446.88,-1747.93,248.337,1.71275,'4438:0 4440:0 '),\n+(4440,'zd708',571,66,66,73,77,3000,7000,0,0,5445.34,-1527.93,248.26,1.56823,'4439:0 4418:0 '),\n+(4441,'zd709',571,66,66,73,77,3000,7000,0,0,5449.03,-2186.49,248.309,4.69804,'4438:0 4447:0 '),\n+(4442,'zd710',571,66,66,73,77,3000,7000,0,0,5286.44,-2043.61,246.138,3.10918,'4438:0 4411:0 '),\n+(4443,'zd711',571,66,4317,73,77,3000,7000,0,1,5168.98,-2192.3,236.538,5.78582,'4411:0 4444:0 '),\n+(4444,'zd712',571,66,66,73,77,3000,7000,0,0,5057.15,-2200.22,244.382,3.79877,'4443:0 4445:0 '),\n+(4445,'zd713',571,66,66,73,77,3000,7000,0,0,5039.31,-2353.08,242.172,3.30084,'4444:0 4446:0 '),\n+(4446,'zd714',571,66,4316,73,77,3000,7000,0,0,4870.93,-2382.92,234.006,2.40312,'4445:0 4409:0 '),\n+(4447,'zd715',571,66,4275,73,77,3000,7000,0,0,5451.23,-2302.91,297.236,1.61772,'4441:0 4448:0 4449:0 4476:0 '),\n+(4448,'zd716',571,66,4275,73,77,3000,7000,0,0,5448.61,-2517.18,292.419,4.61951,'4447:0 4449:0 4465:0 4476:0 '),\n+(4449,'zd717',571,66,4275,73,77,3000,7000,0,0,5555.82,-2440.17,290.942,2.83587,'4448:0 4447:0 4450:0 4476:0 '),\n+(4450,'zd718',571,66,4318,73,77,3000,7000,0,0,5688.46,-2430.58,287.55,3.11862,'4449:0 4451:0 '),\n+(4451,'zd719',571,66,4294,73,77,3000,7000,0,0,5806.54,-2342.64,290.484,5.7662,'4450:0 4452:0 '),\n+(4452,'zd720',571,66,4294,73,77,3000,7000,0,0,5929.41,-2434.64,292.384,5.92563,'4451:0 4453:0 '),\n+(4453,'zd721',571,66,4294,73,77,3000,7000,0,0,6095.28,-2375.23,290.191,0.345376,'4452:0 4454:0 '),\n+(4454,'zd722',571,66,4276,73,77,3000,7000,0,0,6180.98,-2386.29,307.72,4.9046,'4453:0 4455:0 '),\n+(4455,'zd723',571,66,4276,73,77,3000,7000,0,0,6189.69,-2520.06,304.709,4.73102,'4454:0 4456:0 4461:0 '),\n+(4456,'zd724',571,66,4276,73,77,3000,7000,0,0,6265.08,-2506.2,302.978,4.68313,'4455:0 4457:0 '),\n+(4457,'zd725',571,66,4276,73,77,3000,7000,0,0,6245.94,-2735.34,302.749,3.45398,'4456:0 4458:0 4459:0 '),\n+(4458,'zd726',571,66,4276,73,77,3000,7000,0,0,6057.61,-2737.89,302.8,1.51562,'4457:0 4460:0 '),\n+(4459,'zd727',571,66,66,73,77,3000,7000,0,0,6297.01,-2862.98,293.934,2.17613,'4457:0 '),\n+(4460,'zd728',571,66,66,73,77,3000,7000,0,0,6048.63,-2898.7,296.891,3.34009,'4458:0 '),\n+(4461,'zd729',571,66,4276,73,77,3000,7000,0,0,6198.47,-2622.9,293.162,1.74809,'4455:0 4462:0 '),\n+(4462,'zd730',571,66,4276,73,77,3000,7000,0,0,6057.09,-2616.09,302.748,3.26077,'4461:0 4463:0 '),\n+(4463,'zd731',571,66,66,73,77,3000,7000,0,0,5884.73,-2617.57,292.418,3.15396,'4462:0 4464:0 '),\n+(4464,'zd732',571,66,66,73,77,3000,7000,0,0,5672.49,-2619.11,292.418,3.13825,'4463:0 4465:0 4477:0 '),\n+(4465,'zd733',571,66,4275,73,77,3000,7000,0,1,5457.16,-2620.72,306.551,1.83449,'4464:0 4448:0 4466:0 '),\n+(4466,'zd734',571,66,66,73,77,3000,7000,0,0,5332.55,-2708.7,292.419,3.89224,'4465:0 4467:0 4474:0 '),\n+(4467,'zd735',571,66,66,73,77,3000,7000,0,0,5189.96,-2843.82,292.419,5.47639,'4466:0 4468:0 4471:0 4473:0 4474:0 '),\n+(4468,'zd736',571,66,66,73,77,3000,7000,0,0,5035.14,-2975.52,292.29,3.86318,'4467:0 4469:0 4473:0 4483:0 '),\n+(4469,'zd737',571,66,66,73,77,3000,7000,0,0,4891.99,-3121.16,292.419,3.92601,'4468:0 4470:0 4486:0 '),\n+(4470,'zd738',571,66,66,73,77,3000,7000,0,0,4770.68,-3237.29,292.419,3.91659,'4469:0 4404:0 4487:0 '),\n+(4471,'zd739',571,66,66,73,77,3000,7000,0,0,5358.22,-3018.37,292.42,5.50546,'4467:0 4472:0 4483:0 '),\n+(4472,'zd740',571,66,66,73,77,3000,7000,0,0,5504.36,-3161.64,327.623,5.5251,'4471:0 4482:0 4491:0 '),\n+(4473,'zd741',571,66,4278,73,77,3000,7000,0,0,4997.42,-2791.64,287.647,5.40334,'4468:0 4467:0 4474:0 '),\n+(4474,'zd742',571,66,4278,73,77,3000,7000,0,0,5158.28,-2673.27,288.27,0.638333,'4473:0 4466:0 4467:0 4475:0 '),\n+(4475,'zd743',571,66,66,73,77,3000,7000,0,0,5256.37,-2555.92,288.451,1.56824,'4474:0 4476:0 '),\n+(4476,'zd744',571,66,4275,73,77,3000,7000,0,0,5338.16,-2432.94,289.035,0.00530624,'4475:0 4448:0 4447:0 4449:0 '),\n+(4477,'zd745',571,66,4280,73,77,3000,7000,0,0,5779.01,-2690.72,276.583,2.21778,'4464:0 4478:0 '),\n+(4478,'zd746',571,66,4320,73,77,3000,7000,0,0,5721.5,-2843.26,274.479,3.99436,'4477:0 4479:0 4481:0 '),\n+(4479,'zd747',571,66,4320,73,77,3000,7000,0,1,5795.09,-3017.85,286.307,5.12926,'4478:0 4480:0 '),\n+(4480,'zd748',571,66,4320,73,77,3000,7000,0,0,5829.57,-3089.62,343.078,5.24393,'4479:0 4496:0 '),\n+(4481,'zd749',571,66,4280,73,77,3000,7000,0,0,5611.83,-2947.53,274.379,3.44223,'4478:0 4482:0 '),\n+(4482,'zd750',571,66,4280,73,77,3000,7000,0,0,5467.65,-3021.98,288.17,4.29281,'4481:0 4472:0 '),\n+(4483,'zd751',571,66,4279,73,77,3000,7000,0,0,5183.53,-3158.14,271.373,0.983891,'4471:0 4468:0 4484:0 '),\n+(4484,'zd752',571,66,4279,73,77,3000,7000,0,0,5277.96,-3280.48,281.073,4.24508,'4483:0 4485:0 '),\n+(4485,'zd753',571,66,4279,73,77,3000,7000,0,0,5170.84,-3397.25,289.096,2.18261,'4484:0 4486:0 4488:0 '),\n+(4486,'zd754',571,66,4279,73,77,3000,7000,0,0,5037.17,-3252.81,278.555,2.42609,'4485:0 4469:0 '),\n+(4487,'zd755',571,66,4299,73,77,3000,7000,0,0,4868.35,-3381.36,292.891,5.68473,'4470:0 4488:0 '),\n+(4488,'zd756',571,66,4299,73,77,3000,7000,0,0,5062.51,-3481.16,289.586,4.38568,'4487:0 4485:0 4489:0 '),\n+(4489,'zd757',571,66,4299,73,77,3000,7000,0,0,5037.37,-3645.39,298.622,4.61344,'4488:0 4490:0 '),\n+(4490,'zd758',571,66,4299,73,77,3000,7000,0,0,5087.62,-3673.69,368.159,1.40275,'4489:0 '),\n+(4491,'zd759',571,66,66,73,77,3000,7000,0,0,5653.1,-3291.77,372.841,5.39966,'4472:0 4492:0 4496:0 4527:0 '),\n+(4492,'zd760',571,66,4323,73,77,3000,7000,0,0,5760.12,-3480.35,382.038,4.42027,'4491:0 4493:0 4496:0 4527:0 '),\n+(4493,'zd761',571,66,4323,73,77,3000,7000,0,1,5763.21,-3592.34,386.495,5.18723,'4492:0 4494:0 '),\n+(4494,'zd762',571,66,66,73,77,3000,7000,0,0,5805.54,-3730.07,371.987,2.07548,'4493:0 4495:0 4512:0 4522:0 '),\n+(4495,'zd763',571,66,66,73,77,3000,7000,0,0,5926.35,-3596.12,371.987,2.21685,'4494:0 4496:0 4513:0 '),\n+(4496,'zd764',571,66,66,73,77,3000,7000,0,0,5852.16,-3456.19,373.499,0.462273,'4491:0 4495:0 4492:0 4497:0 4480:0 '),\n+(4497,'zd765',571,66,4327,73,77,3000,7000,0,0,6015.43,-3354.83,351.334,0.898171,'4496:0 4498:0 4500:0 '),\n+(4498,'zd766',571,66,4327,73,77,3000,7000,0,0,6064.66,-3220.41,351.084,5.24378,'4497:0 4499:0 '),\n+(4499,'zd767',571,66,4327,73,77,3000,7000,0,0,6170.15,-3269.78,354.099,4.83851,'4498:0 4500:0 4504:0 '),\n+(4500,'zd768',571,66,4327,73,77,3000,7000,0,0,6123.58,-3376.38,350.427,3.6502,'4499:0 4497:0 4501:0 '),\n+(4501,'zd769',571,66,4328,73,77,3000,7000,0,0,6121.57,-3498.34,384.702,6.11321,'4500:0 4503:0 4502:0 '),\n+(4502,'zd770',571,66,4328,73,77,3000,7000,0,0,6262.56,-3570.42,383.729,4.01857,'4501:0 4503:0 4510:0 '),\n+(4503,'zd771',571,66,4328,73,77,3000,7000,0,0,6183.8,-3653.66,384.553,1.57362,'4501:0 4502:0 4513:0 '),\n+(4504,'zd772',571,66,4321,73,77,3000,7000,0,0,6322.87,-3285.06,388.539,6.26715,'4499:0 4505:0 4509:0 4510:0 '),\n+(4505,'zd773',571,66,4321,73,77,3000,7000,0,0,6411.23,-3132.08,389.357,0.676679,'4504:0 4506:0 '),\n+(4506,'zd774',571,66,4321,73,77,3000,7000,0,0,6573.73,-3100.58,392.875,3.25828,'4505:0 4507:0 '),\n+(4507,'zd775',571,66,4321,73,77,3000,7000,0,0,6591.66,-3194.21,412.812,2.18937,'4506:0 4508:0 '),\n+(4508,'zd776',571,66,4321,73,77,3000,7000,0,0,6440.64,-3192.66,402.475,4.61546,'4507:0 4509:0 '),\n+(4509,'zd777',571,66,4321,73,77,3000,7000,0,0,6464.24,-3278.19,402.912,0.40965,'4508:0 4504:0 '),\n+(4510,'zd778',571,66,4321,73,77,3000,7000,0,0,6447.03,-3450.35,388.772,5.0215,'4504:0 4511:0 4502:0 '),\n+(4511,'zd779',571,66,66,73,77,3000,7000,0,0,6351.61,-3625.18,379.474,1.56496,'4510:0 '),\n+(4512,'zd780',571,66,4326,73,77,3000,7000,0,0,5890.65,-3784.26,361.962,2.65353,'4494:0 4513:0 4514:0 '),\n+(4513,'zd781',571,66,66,73,77,3000,7000,0,0,6002.17,-3684.49,371.988,2.91507,'4512:0 4495:0 4503:0 4535:0 '),\n+(4514,'zd782',571,66,66,73,77,3000,7000,0,0,5871.01,-3998.48,364.264,5.0278,'4512:0 4515:0 '),\n+(4515,'zd783',571,66,4371,73,77,3000,7000,0,0,5936.71,-4166.52,353.36,6.12894,'4514:0 4516:0 4518:0 4519:0 '),\n+(4516,'zd784',571,66,4371,73,77,3000,7000,0,0,6121.47,-4241.02,320.493,2.98578,'4515:0 4517:0 '),\n+(4517,'zd785',571,66,4371,73,77,3000,7000,0,0,6077.47,-4432.62,362.867,1.61132,'4516:0 4518:0 '),\n+(4518,'zd786',571,66,4371,73,77,3000,7000,0,0,5913.09,-4334,361.983,1.57991,'4515:0 4517:0 '),\n+(4519,'zd787',571,66,4325,73,77,3000,7000,0,0,5789.33,-4263.74,371.348,4.26205,'4515:0 4520:0 '),\n+(4520,'zd788',571,66,4325,73,77,3000,7000,0,0,5716.79,-4325.83,373.993,4.5605,'4519:0 4521:0 4534:0 '),\n+(4521,'zd789',571,66,4325,73,77,3000,7000,0,0,5716.89,-4120.29,353.305,1.62547,'4520:0 4522:0 4534:0 '),\n+(4522,'zd790',571,66,66,73,77,3000,7000,0,0,5706.28,-3833.4,371.987,0.940598,'4521:0 4494:0 4523:0 '),\n+(4523,'zd791',571,66,66,73,77,3000,7000,0,0,5537.84,-3840.96,372.119,2.47998,'4522:0 4524:0 4525:0 '),\n+(4524,'zd792',571,66,4322,73,77,3000,7000,0,0,5351.53,-3648.35,361.961,2.27578,'4523:0 4525:0 4526:0 4528:0 '),\n+(4525,'zd793',571,66,4322,73,77,3000,7000,0,0,5343.06,-3764.54,373.087,0.190553,'4523:0 4524:0 '),\n+(4526,'zd794',571,66,66,73,77,3000,7000,0,0,5524.4,-3572.01,365.432,0.730907,'4524:0 4527:0 '),\n+(4527,'zd795',571,66,4324,73,77,3000,7000,0,0,5626.9,-3422.21,363.833,0.990089,'4526:0 4491:0 4492:0 '),\n+(4528,'zd796',571,66,4322,73,77,3000,7000,0,0,5153.32,-3723.32,360.396,4.07514,'4524:0 4529:0 '),\n+(4529,'zd797',571,66,4322,73,77,3000,7000,0,0,5076.21,-3849.59,356.664,4.99406,'4528:0 4530:0 '),\n+(4530,'zd798',571,66,66,73,77,3000,7000,0,0,5136.04,-4040.57,355.425,5.10401,'4529:0 4403:0 4531:0 '),\n+(4531,'zd799',571,66,66,73,77,3000,7000,0,0,5278.78,-4177.66,363.104,2.86954,'4530:0 4403:0 4532:0 '),\n+(4532,'zd800',571,66,66,73,77,3000,7000,0,0,5437.96,-4288.78,363.086,5.803,'4531:0 4533:0 4534:0 '),\n+(4533,'zd801',571,66,66,73,77,3000,7000,0,0,5440.87,-4452.18,379.545,5.85562,'4532:0 '),\n+(4534,'zd802',571,66,4325,73,77,3000,7000,0,0,5627.9,-4207.17,364.009,5.93258,'4532:0 4521:0 4520:0 '),\n+(4535,'zd803',571,66,66,73,77,3000,7000,0,0,6164.11,-3834.22,436.687,5.57209,'4513:0 4536:0 '),\n+(4536,'zd804',571,66,66,73,77,3000,7000,0,0,6297.28,-3979.47,456.92,5.47784,'4535:0 4537:0 '),\n+(4537,'zd805',571,66,66,73,77,3000,7000,0,0,6443.44,-4126.1,462.301,5.40087,'4536:0 4538:0 4548:0 '),\n+(4538,'zd806',571,66,4329,73,77,3000,7000,0,0,6406.23,-4295.64,457.247,4.84558,'4537:0 4539:0 4547:0 '),\n+(4539,'zd807',571,66,66,73,77,3000,7000,0,0,6273.9,-4442.23,450.834,3.83242,'4538:0 4540:0 4543:0 '),\n+(4540,'zd808',571,66,4329,73,77,3000,7000,0,0,6178.17,-4399.01,456.879,1.41967,'4539:0 4541:0 '),\n+(4541,'zd809',571,66,4329,73,77,3000,7000,0,0,6227.62,-4232.4,436.632,4.94847,'4540:0 4542:0 '),\n+(4542,'zd810',571,66,4329,73,77,3000,7000,0,0,6214.01,-4138.28,447.456,5.0066,'4541:0 '),\n+(4543,'zd811',571,66,4373,73,77,3000,7000,0,0,6412.14,-4626.89,453.335,2.16502,'4539:0 4544:0 '),\n+(4544,'zd812',571,66,4375,73,77,3000,7000,0,0,6602.74,-4663.95,450.613,0.474835,'4543:0 4545:0 4559:0 '),\n+(4545,'zd813',571,66,4375,73,77,3000,7000,0,0,6698.48,-4568.11,450.518,2.11632,'4544:0 4546:0 '),\n+(4546,'zd814',571,66,4375,73,77,3000,7000,0,0,6638.09,-4503.12,485.547,2.39985,'4545:0 4547:0 '),\n+(4547,'zd815',571,66,4373,73,77,3000,7000,0,0,6532.06,-4368.66,450.654,5.95377,'4546:0 4538:0 4548:0 '),\n+(4548,'zd816',571,66,66,73,77,3000,7000,0,0,6586.21,-4259.92,452.582,2.52315,'4547:0 4537:0 4549:0 '),\n+(4549,'zd817',571,66,66,73,77,3000,7000,0,0,6681.53,-4181.26,455.784,5.78336,'4548:0 4550:0 4557:0 '),\n+(4550,'zd818',571,66,66,73,77,3000,7000,0,0,6821.02,-4227.92,452.785,0.387671,'4549:0 4551:0 4557:0 '),\n+(4551,'zd819',571,66,4579,73,77,3000,7000,0,1,6899.77,-4113.21,467.355,4.92777,'4550:0 4552:0 '),\n+(4552,'zd820',571,66,66,73,77,3000,7000,0,0,7055.14,-4222.88,450.363,3.95496,'4551:0 4553:0 '),\n+(4553,'zd821',571,66,66,73,77,3000,7000,0,0,7139.88,-4413.45,457.062,4.921,'4552:0 4554:0 '),\n+(4554,'zd822',571,66,4375,73,77,3000,7000,0,0,7003.8,-4522.32,450.519,3.23161,'4553:0 4555:0 '),\n+(4555,'zd823',571,66,4375,73,77,3000,7000,0,0,6879.7,-4603.96,452.922,4.36494,'4554:0 4556:0 4558:0 '),\n+(4556,'zd824',571,66,4375,73,77,3000,7000,0,0,6779.05,-4455.52,441.057,2.48784,'4555:0 4557:0 '),\n+(4557,'zd825',571,66,4375,73,77,3000,7000,0,0,6738.67,-4314.66,450.026,0.835357,'4556:0 4550:0 4549:0 '),\n+(4558,'zd826',571,66,4375,73,77,3000,7000,0,0,6817.32,-4743.11,450.661,4.44034,'4555:0 4559:0 '),\n+(4559,'zd827',571,66,66,73,77,3000,7000,0,0,6680.31,-4847.44,452.584,2.08415,'4558:0 4544:0 4560:0 '),\n+(4560,'zd828',571,66,4375,73,77,3000,7000,0,0,6841.86,-4987.38,451.036,5.56582,'4559:0 '),\n+(4561,'cs829',571,2817,4557,74,78,3000,7000,0,0,5438.42,-1075.94,181.63,1.64666,'4419:0 4562:0 4565:0 4567:0 '),\n+(4562,'cs830',571,2817,4554,74,78,3000,7000,0,0,5414.79,-913.179,165.857,1.65453,'4561:0 4563:0 '),\n+(4563,'cs831',571,2817,4557,74,78,3000,7000,0,0,5529.65,-840.32,161.565,0.178767,'4562:0 4564:0 4566:0 4578:0 '),\n+(4564,'cs832',571,2817,4557,74,78,3000,7000,0,0,5646.92,-907.293,186.362,5.31056,'4563:0 4565:0 '),\n+(4565,'cs833',571,2817,4557,74,78,3000,7000,0,0,5531.5,-987.127,191.383,0.576966,'4561:0 4564:0 '),\n+(4566,'cs834',571,2817,4558,74,78,3000,7000,0,5,5605.93,-749.995,199.49,1.05213,'4563:0 '),\n+(4567,'cs835',571,2817,4554,74,78,3000,7000,0,0,5331.06,-914.795,170.103,1.60977,'4561:0 4568:0 '),\n+(4568,'cs836',571,2817,4554,74,78,3000,7000,0,0,5307.84,-750.937,162.904,2.08886,'4567:0 4569:0 '),\n+(4569,'cs837',571,2817,4557,74,78,3000,7000,0,0,5179.88,-711.115,164.986,1.15816,'4568:0 4570:0 4572:0 '),\n+(4570,'cs838',571,2817,2817,74,78,3000,7000,0,2,5082.9,-704.384,186.517,6.16508,'4569:0 4571:0 '),\n+(4571,'cs839',571,2817,4559,74,78,3000,7000,0,3,5062.59,-611.621,218.683,5.43466,'4570:0 '),\n+(4572,'cs840',571,2817,4557,74,78,3000,7000,0,0,5185.33,-555.375,158.496,1.08748,'4569:0 4573:0 '),\n+(4573,'cs841',571,2817,4557,74,78,3000,7000,0,0,5212.12,-335.385,163.451,1.20529,'4572:0 4574:0 '),\n+(4574,'cs842',571,2817,4557,74,78,3000,7000,0,0,5329.19,-218.838,166.128,0.232181,'4573:0 4575:0 4583:0 '),\n+(4575,'cs843',571,2817,4557,74,78,3000,7000,0,0,5520.69,-188.647,157.616,0.0751006,'4574:0 4576:0 4583:0 '),\n+(4576,'cs844',571,2817,4557,74,78,3000,7000,0,0,5672.16,-264.918,167.932,5.74096,'4575:0 4577:0 4579:0 4674:0 '),\n+(4577,'cs845',571,2817,4557,74,78,3000,7000,0,0,5583.23,-439.368,154.644,4.20158,'4576:0 4578:0 '),\n+(4578,'cs846',571,2817,4554,74,78,3000,7000,0,0,5498.08,-612.708,152.463,4.75686,'4577:0 4563:0 '),\n+(4579,'cs847',571,2817,4553,74,78,3000,7000,0,0,5679.51,-108.805,178.045,1.46212,'4576:0 4580:0 4809:0 '),\n+(4580,'cs848',571,2817,4553,74,78,3000,7000,0,0,5720.75,54.3693,171.054,1.38122,'4579:0 4581:0 4582:0 4597:0 '),\n+(4581,'cs849',571,2817,4553,74,78,3000,7000,0,0,5765.22,181.998,182.874,0.613098,'4580:0 '),\n+(4582,'cs850',571,2817,4553,74,78,3000,7000,0,0,5544.73,121.881,150.263,4.18823,'4580:0 4583:0 '),\n+(4583,'cs851',571,2817,4553,74,78,3000,7000,0,0,5414.2,-47.7746,149.795,3.91334,'4582:0 4575:0 4574:0 4584:0 '),\n+(4584,'cs852',571,2817,2817,74,78,3000,7000,0,0,5354.31,126.368,161.642,2.27029,'4583:0 4585:0 4586:0 '),\n+(4585,'cs853',571,2817,2817,74,78,3000,7000,0,0,5257.75,154.168,191.769,2.73995,'4584:0 4101:0 '),\n+(4586,'cs854',571,2817,2817,74,78,3000,7000,0,0,5423.58,292.611,156.85,1.48646,'4584:0 4587:0 '),\n+(4587,'cs855',571,2817,2817,74,78,3000,7000,0,0,5436.65,406.464,167.948,1.52965,'4586:0 4588:0 4596:0 '),\n+(4588,'cs856',571,2817,4555,74,78,3000,7000,0,0,5332.71,578.052,182.7,1.3333,'4587:0 4589:0 '),\n+(4589,'cs857',571,2817,4555,74,78,3000,7000,0,0,5471.03,710.798,171.741,0.739547,'4588:0 4590:0 '),\n+(4590,'cs858',571,2817,2817,74,78,3000,7000,0,0,5519.14,908.014,167.988,1.35608,'4589:0 4591:0 4592:0 '),\n+(4591,'cs859',571,2817,4556,74,78,3000,7000,0,1,5706.15,1006.05,174.48,3.67458,'4590:0 '),\n+(4592,'cs860',571,2817,2817,74,78,3000,7000,0,0,5682.36,825.06,156.036,5.32233,'4590:0 4593:0 '),\n+(4593,'cs861',571,2817,2817,74,78,3000,7000,0,0,5849.61,885.831,160.066,0.393957,'4592:0 4594:0 '),\n+(4594,'cs862',571,2817,4553,74,78,3000,7000,0,0,5854.17,706.025,164.715,4.73956,'4593:0 4595:0 '),\n+(4595,'cs863',571,2817,4553,74,78,3000,7000,0,0,5740.73,555.099,158.091,4.03271,'4594:0 4596:0 '),\n+(4596,'cs864',571,2817,4553,74,78,3000,7000,0,0,5615.21,410.65,156.222,3.51042,'4595:0 4587:0 4597:0 '),\n+(4597,'cs865',571,2817,4553,74,78,3000,7000,0,0,5676.64,245.015,166.802,4.93592,'4596:0 4580:0 '),\n+(4598,'sb866',571,3711,4483,74,78,3000,7000,0,0,4671.5,5526.35,34.4275,0.54946,'3857:0 4599:0 '),\n+(4599,'sb867',571,3711,3711,74,78,3000,7000,0,0,4892.01,5531.93,-71.5606,0.0389507,'4598:0 4600:0 4628:0 '),\n+(4600,'sb868',571,3711,4289,74,78,3000,7000,0,0,4952.39,5739.79,-75.5644,1.2249,'4599:0 4601:0 '),\n+(4601,'sb869',571,3711,4289,74,78,3000,7000,0,0,5130.17,5883.3,-75.7286,0.492126,'4600:0 4602:0 '),\n+(4602,'sb870',571,3711,4289,74,78,3000,7000,0,0,5325.13,5886.98,-68.7967,0.00281286,'4601:0 4603:0 4629:0 '),\n+(4603,'sb871',571,3711,4285,74,78,3000,7000,0,0,5507.19,5934.35,-51.6289,6.11243,'4602:0 4604:0 '),\n+(4604,'sb872',571,3711,3711,74,78,3000,7000,0,0,5713,5871.42,-60.4173,5.97499,'4603:0 4605:0 4668:0 '),\n+(4605,'sb873',571,3711,4289,74,78,3000,7000,0,0,5882.95,5730.44,-63.8448,5.56737,'4604:0 4606:0 '),\n+(4606,'sb874',571,3711,4289,74,78,3000,7000,0,0,6018.42,5571.93,-74.0181,5.18095,'4605:0 4607:0 4657:0 '),\n+(4607,'sb875',571,3711,4385,74,78,3000,7000,0,0,6082.5,5353.27,-92.7974,4.70422,'4606:0 4608:0 4656:0 '),\n+(4608,'sb876',571,3711,3711,74,78,3000,7000,0,0,6268.69,5300.48,-100.197,0.380579,'4607:0 4609:0 '),\n+(4609,'sb877',571,3711,3711,74,78,3000,7000,0,0,6450.25,5197.28,-64.1861,5.49824,'4608:0 4610:0 '),\n+(4610,'sb878',571,3711,4376,74,78,3000,7000,0,0,6507.21,4992.87,-60.1724,4.97202,'4609:0 4611:0 4650:0 '),\n+(4611,'sb879',571,3711,3711,74,78,3000,7000,0,0,6524.26,4794.34,-58.974,4.36726,'4610:0 4612:0 '),\n+(4612,'sb880',571,3711,4368,74,78,3000,7000,0,0,6443.53,4602.81,-66.2857,4.55104,'4611:0 4613:0 4649:0 4651:0 '),\n+(4613,'sb881',571,3711,4368,74,78,3000,7000,0,0,6405.01,4366.1,-47.8041,3.90309,'4612:0 4614:0 4648:0 4649:0 '),\n+(4614,'sb882',571,3711,3711,74,78,3000,7000,0,0,6226.59,4265.96,-45.1729,3.55594,'4613:0 4615:0 4648:0 '),\n+(4615,'sb883',571,3711,4283,74,78,3000,7000,0,0,6111.71,4134.4,-48.7024,4.20861,'4614:0 4616:0 '),\n+(4616,'sb884',571,3711,4283,74,78,3000,7000,0,0,6038.48,4009.63,-42.6825,4.13556,'4615:0 4617:0 '),\n+(4617,'sb885',571,3711,4283,74,78,3000,7000,0,0,5938.28,3889.47,-35.5353,3.47426,'4616:0 4618:0 4646:0 '),\n+(4618,'sb886',571,3711,4283,74,78,3000,7000,0,0,5785.88,3776.91,-41.0442,3.94,'4617:0 4619:0 4646:0 4647:0 '),\n+(4619,'sb887',571,3711,3711,74,78,3000,7000,0,0,5624.29,3606.52,-21.7442,3.13811,'4618:0 4620:0 4647:0 '),\n+(4620,'sb888',571,3711,4283,74,78,3000,7000,0,0,5488.8,3794.13,-58.7714,2.25061,'4619:0 4621:0 '),\n+(4621,'sb889',571,3711,4387,74,78,3000,7000,0,0,5337.73,3917.13,-70.8363,2.57655,'4620:0 4622:0 4642:0 4643:0 '),\n+(4622,'sb890',571,3711,3711,74,78,3000,7000,0,0,5220.59,4104.15,-78.9241,2.09588,'4621:0 4623:0 4641:0 '),\n+(4623,'sb891',571,3711,3711,74,78,3000,7000,0,0,5146.69,4294.33,-99.9765,1.80057,'4622:0 4624:0 4640:0 '),\n+(4624,'sb892',571,3711,3711,74,78,3000,7000,0,1,5110.31,4494.04,-98.6996,1.66941,'4623:0 4625:0 '),\n+(4625,'sb893',571,3711,3711,74,78,3000,7000,0,0,5098.19,4704.21,-133.607,2.04248,'4624:0 4626:0 4635:0 '),\n+(4626,'sb894',571,3711,3711,74,78,3000,7000,0,0,4975.85,4879.83,-101.866,1.73853,'4625:0 4627:0 4636:0 '),\n+(4627,'sb895',571,3711,3711,74,78,3000,7000,0,0,4881.56,5059.86,-91.1009,1.00104,'4626:0 4628:0 '),\n+(4628,'sb896',571,3711,3711,74,78,3000,7000,0,0,4917.13,5259.43,-92.7846,1.6058,'4627:0 4599:0 4672:0 '),\n+(4629,'sb897',571,3711,3711,74,78,3000,7000,0,0,5325.03,5694.77,-87.1296,4.35079,'4602:0 4630:0 '),\n+(4630,'sb898',571,3711,4288,74,78,3000,7000,0,0,5283.58,5529.21,-98.5324,4.62568,'4629:0 4631:0 '),\n+(4631,'sb899',571,3711,3711,74,78,3000,7000,0,0,5296.26,5368.21,-119.485,5.45035,'4630:0 4632:0 4669:0 '),\n+(4632,'sb900',571,3711,4293,74,78,3000,7000,0,0,5334.1,5156.57,-135.744,4.8503,'4631:0 4633:0 '),\n+(4633,'sb901',571,3711,4293,74,78,3000,7000,0,0,5316.24,4983.73,-135.985,4.21805,'4632:0 4634:0 4673:0 '),\n+(4634,'sb902',571,3711,4293,74,78,3000,7000,0,0,5263.3,4836.68,-132.956,4.22984,'4633:0 4635:0 '),\n+(4635,'sb903',571,3711,4293,74,78,3000,7000,0,0,5171.92,4761.28,-134.094,3.64315,'4634:0 4625:0 '),\n+(4636,'sb904',571,3711,3711,74,78,3000,7000,0,0,4906.61,4752.07,-80.9517,3.99658,'4626:0 4637:0 '),\n+(4637,'sb905',571,3711,4388,74,78,3000,7000,0,0,4784.59,4651.45,-67.3646,4.27774,'4636:0 4638:0 '),\n+(4638,'sb906',571,3711,4388,74,78,3000,7000,0,0,4776.89,4461.82,-65.79,0.115909,'4637:0 4639:0 '),\n+(4639,'sb907',571,3711,3711,74,78,3000,7000,0,0,4858.79,4312.13,-51.668,4.56127,'4638:0 4640:0 '),\n+(4640,'sb908',571,3711,4304,74,78,3000,7000,0,0,5008.15,4265.85,-85.0377,2.88757,'4639:0 4623:0 '),\n+(4641,'sb909',571,3711,4303,74,78,3000,7000,0,0,5141.4,4002.05,-61.6423,4.65002,'4622:0 4642:0 '),\n+(4642,'sb910',571,3711,3711,74,78,3000,7000,0,0,5236.32,3820.55,-29.2583,0.629582,'4641:0 4621:0 '),\n+(4643,'sb911',571,3711,4283,74,78,3000,7000,0,0,5426.13,4100.88,-86.7674,1.1935,'4621:0 4644:0 '),\n+(4644,'sb912',571,3711,4283,74,78,3000,7000,0,0,5555.95,4256,-102.563,0.234915,'4643:0 4645:0 4664:0 '),\n+(4645,'sb913',571,3711,4283,74,78,3000,7000,0,0,5713.23,4134.64,-89.7735,5.05333,'4644:0 4646:0 '),\n+(4646,'sb914',571,3711,4283,74,78,3000,7000,0,0,5757.78,3962.65,-74.4666,5.33842,'4645:0 4617:0 4618:0 '),\n+(4647,'sb915',571,3711,4297,74,78,3000,7000,0,0,5782.35,3632.67,-13.2643,3.22964,'4618:0 4619:0 '),\n+(4648,'sb916',571,3711,3711,74,78,3000,7000,0,0,6360.37,4223.67,-44.0521,1.79237,'4613:0 4614:0 '),\n+(4649,'sb917',571,3711,4368,74,78,3000,7000,0,0,6543.56,4456.6,-47.1567,2.3712,'4613:0 4612:0 '),\n+(4650,'sb918',571,3711,4376,74,78,3000,7000,0,0,6354.19,4873.76,-84.2341,5.19234,'4610:0 4651:0 '),\n+(4651,'sb919',571,3711,3711,74,78,3000,7000,0,0,6357.09,4685.34,-78.5111,5.19313,'4650:0 4612:0 4652:0 '),\n+(4652,'sb920',571,3711,3711,74,78,3000,7000,0,0,6208.52,4590.1,-92.1573,3.70988,'4651:0 4653:0 '),\n+(4653,'sb921',571,3711,3711,74,78,3000,7000,0,0,6025.9,4686.81,-95.5438,1.9176,'4652:0 4654:0 '),\n+(4654,'sb922',571,3711,3711,74,78,3000,7000,0,0,5994.9,4894.76,-99.8287,1.31128,'4653:0 4655:0 '),\n+(4655,'sb923',571,3711,4385,74,78,3000,7000,0,0,5981.34,5089.26,-100.986,1.44401,'4654:0 4656:0 '),\n+(4656,'sb924',571,3711,4391,74,78,3000,7000,0,0,5939.08,5277.6,-99.1834,0.521168,'4655:0 4607:0 4657:0 4658:0 '),\n+(4657,'sb925',571,3711,4391,74,78,3000,7000,0,0,5903.46,5420.52,-94.3184,1.13064,'4656:0 4606:0 '),\n+(4658,'sb926',571,3711,4293,74,78,3000,7000,0,0,5830.14,5100.16,-132.628,3.78921,'4656:0 4659:0 '),\n+(4659,'sb927',571,3711,4293,74,78,3000,7000,0,0,5680.53,5002.31,-134.988,3.89916,'4658:0 4660:0 '),\n+(4660,'sb928',571,3711,4293,74,78,3000,7000,0,0,5699.45,4825.48,-137.014,5.40319,'4659:0 4661:0 '),\n+(4661,'sb929',571,3711,4293,74,78,3000,7000,0,0,5769.89,4694.83,-130.521,4.6445,'4660:0 4662:0 '),\n+(4662,'sb930',571,3711,4293,74,78,3000,7000,0,0,5768.78,4519.94,-133.978,4.9029,'4661:0 4663:0 '),\n+(4663,'sb931',571,3711,4293,74,78,3000,7000,0,0,5638.21,4442.49,-138.205,3.53632,'4662:0 4664:0 4665:0 '),\n+(4664,'sb932',571,3711,4293,74,78,3000,7000,0,0,5520.96,4384.34,-134.132,5.02072,'4663:0 4644:0 '),\n+(4665,'sb933',571,3711,4293,74,78,3000,7000,0,1,5647.9,4579.12,-137.584,3.59247,'4663:0 4666:0 '),\n+(4666,'sb934',571,3711,4293,74,78,3000,7000,0,0,5559.82,4670.56,-135.523,1.45736,'4665:0 4667:0 '),\n+(4667,'sb935',571,3711,4383,74,78,3000,7000,0,5,5497.21,4748.71,-193.716,5.27047,'4666:0 '),\n+(4668,'sb936',571,3711,4284,74,78,3000,7000,0,1,5575.69,5751.97,-74.7038,0.766207,'4604:0 4671:0 '),\n+(4669,'sb937',571,3711,4285,74,78,3000,7000,0,0,5456.52,5353.98,-134.279,6.15248,'4631:0 4670:0 '),\n+(4670,'sb938',571,3711,3711,74,78,3000,7000,0,0,5648.23,5302.27,-121.201,1.53199,'4669:0 4671:0 '),\n+(4671,'sb939',571,3711,3711,74,78,3000,7000,0,0,5580.86,5590.13,-92.6294,1.61445,'4670:0 4668:0 '),\n+(4672,'sb940',571,3711,3711,74,78,3000,7000,0,0,5041.36,5069.92,-110.999,5.98282,'4628:0 4673:0 '),\n+(4673,'sb941',571,3711,4293,74,78,3000,7000,0,0,5202.57,5018.06,-134.206,5.92392,'4672:0 4633:0 '),\n+(4674,'sp942',571,67,67,76,80,3000,7000,0,0,5752.46,-354.53,205.676,5.2249,'4576:0 4675:0 '),\n+(4675,'sp943',571,67,4419,76,80,3000,7000,0,0,5903.83,-485.757,296.6,6.0849,'4674:0 4676:0 '),\n+(4676,'sp944',571,67,4419,76,80,3000,7000,0,0,6079.55,-564.659,370.689,5.9286,'4675:0 4677:0 4689:0 4690:0 '),\n+(4677,'sp945',571,67,4419,76,80,3000,7000,0,0,6182.6,-758.333,400.203,4.95,'4676:0 4678:0 4688:0 '),\n+(4678,'sp946',571,67,4419,76,80,3000,7000,0,0,6143.85,-967.832,398.945,4.41828,'4677:0 4679:0 4680:0 '),\n+(4679,'sp947',571,67,4418,76,80,3000,7000,0,1,6122.51,-1083.62,402.604,1.60263,'4678:0 '),\n+(4680,'sp948',571,67,4419,76,80,3000,7000,0,0,6273.81,-1034.37,412.299,5.98122,'4678:0 4681:0 4691:0 '),\n+(4681,'sp949',571,67,4462,76,80,3000,7000,0,0,6444.88,-1034.29,429.644,6.27654,'4680:0 4682:0 '),\n+(4682,'sp950',571,67,4462,76,80,3000,7000,0,0,6611.36,-1016.67,427.636,0.199126,'4681:0 4683:0 4684:0 '),\n+(4683,'sp951',571,67,4462,76,80,3000,7000,0,0,6639.97,-1111.4,427.1,3.18364,'4682:0 '),\n+(4684,'sp952',571,67,4462,76,80,3000,7000,0,0,6673.93,-1219.13,398.841,5.0403,'4682:0 4685:0 4686:0 '),\n+(4685,'sp953',571,67,4462,76,80,3000,7000,0,0,6592.21,-1275.82,392.991,5.05994,'4684:0 '),\n+(4686,'sp954',571,67,4462,76,80,3000,7000,0,0,6697.35,-1426.2,388.747,4.94449,'4684:0 4687:0 '),\n+(4687,'sp955',571,67,4462,76,80,3000,7000,0,0,6795.01,-1512.06,359.911,5.79979,'4686:0 '),\n+(4688,'sp956',571,67,4419,76,80,3000,7000,0,0,6324.13,-838.805,407.569,0.335772,'4677:0 '),\n+(4689,'sp957',571,67,4419,76,80,3000,7000,0,0,6232.08,-626.646,414.707,2.81842,'4676:0 '),\n+(4690,'sp958',571,67,4419,76,80,3000,7000,0,0,6146.68,-346.08,436.33,4.09626,'4676:0 '),\n+(4691,'sp959',571,67,4419,76,80,3000,7000,0,0,6257,-1198.57,428.281,5.0293,'4680:0 4692:0 4693:0 '),\n+(4692,'sp960',571,67,4460,76,80,3000,7000,0,0,6297.61,-1350.75,426.332,4.79525,'4691:0 4699:0 '),\n+(4693,'sp961',571,67,4460,76,80,3000,7000,0,0,6393.21,-1222.32,429.226,4.92092,'4691:0 4694:0 '),\n+(4694,'sp962',571,67,4419,76,80,3000,7000,0,0,6471.87,-1383.27,479.473,4.04521,'4693:0 4695:0 '),\n+(4695,'sp963',571,67,4421,76,80,3000,7000,0,0,6345.12,-1517.97,434.126,3.78838,'4694:0 4696:0 '),\n+(4696,'sp964',571,67,4421,76,80,3000,7000,0,0,6349.58,-1586.52,428.04,5.62228,'4695:0 4697:0 4699:0 '),\n+(4697,'sp965',571,67,4421,76,80,3000,7000,0,0,6455.08,-1685.64,435.366,5.95606,'4696:0 4698:0 '),\n+(4698,'sp966',571,67,4421,76,80,3000,7000,0,0,6462.41,-1739.78,484.912,2.47281,'4697:0 '),\n+(4699,'sp967',571,67,4421,76,80,3000,7000,0,0,6232.83,-1499.78,419.118,0.960144,'4696:0 4692:0 '),\n+(4700,'sp968',571,67,4484,76,80,3000,7000,0,1,8455.31,-325.265,906.979,2.46809,'4701:0 '),\n+(4701,'sp969',571,67,4484,76,80,3000,7000,0,0,8485.73,-279.992,850.711,1.97722,'4700:0 4702:0 '),\n+(4702,'sp970',571,67,4436,76,80,3000,7000,0,0,8483.73,-136.842,797.392,1.57038,'4701:0 4703:0 4706:0 '),\n+(4703,'sp971',571,67,4436,76,80,3000,7000,0,0,8481.05,57.8398,786.425,1.56174,'4702:0 4704:0 '),\n+(4704,'sp972',571,67,4436,76,80,3000,7000,0,0,8468.58,226.668,788.805,1.98979,'4703:0 4705:0 '),\n+(4705,'sp973',571,67,4436,76,80,3000,7000,0,0,8317.77,105.355,824.229,4.03339,'4704:0 4706:0 '),\n+(4706,'sp974',571,67,4436,76,80,3000,7000,0,0,8313.08,-91.3043,827.379,4.66407,'4705:0 4702:0 4707:0 4719:0 '),\n+(4707,'sp975',571,67,4435,76,80,3000,7000,0,0,8202.06,-202.29,871.634,4.01769,'4706:0 4708:0 4710:0 '),\n+(4708,'sp976',571,67,4435,76,80,3000,7000,0,0,8237.33,-247.278,952.88,3.24408,'4707:0 4709:0 '),\n+(4709,'sp977',571,67,4435,76,80,3000,7000,0,0,8092.31,-403.116,964.773,0.843118,'4708:0 '),\n+(4710,'sp978',571,67,4435,76,80,3000,7000,0,0,8040.6,-222.79,846.911,3.84806,'4707:0 4711:0 '),\n+(4711,'sp979',571,67,4435,76,80,3000,7000,0,0,7945.56,-368.7,884.037,5.26884,'4710:0 4712:0 4713:0 4715:0 '),\n+(4712,'sp980',571,67,4435,76,80,3000,7000,0,0,7953.58,-524.527,913.45,5.63719,'4711:0 4737:0 '),\n+(4713,'sp981',571,67,4435,76,80,3000,7000,0,0,8056.94,-415.927,981.568,4.73712,'4711:0 4714:0 '),\n+(4714,'sp982',571,67,4435,76,80,3000,7000,0,0,8116.43,-385.365,981.611,0.510895,'4713:0 '),\n+(4715,'sp983',571,67,4436,76,80,3000,7000,0,0,7847.85,-252.132,885.258,1.43374,'4711:0 4716:0 4724:0 '),\n+(4716,'sp984',571,67,4436,76,80,3000,7000,0,0,7851.3,-120.4,880.754,2.3126,'4715:0 4717:0 '),\n+(4717,'sp985',571,67,4486,76,80,3000,7000,0,0,7796.32,-44.5017,882.083,4.37664,'4716:0 4718:0 '),\n+(4718,'sp986',571,67,4486,76,80,3000,7000,0,0,7737.47,-4.97132,866.565,4.27297,'4717:0 '),\n+(4719,'sp987',571,67,4434,76,80,3000,7000,0,0,8078.57,-32.5271,869.499,2.49247,'4706:0 4720:0 '),\n+(4720,'sp988',571,67,4434,76,80,3000,7000,0,0,8168.23,99.4058,898.859,1.3183,'4719:0 4721:0 '),\n+(4721,'sp989',571,67,4434,76,80,3000,7000,0,0,7974.07,-6.90656,961.657,1.27039,'4720:0 4722:0 '),\n+(4722,'sp990',571,67,4434,76,80,3000,7000,0,0,7950.02,93.3063,1028.03,0.358544,'4721:0 4723:0 '),\n+(4723,'sp991',571,67,4434,76,80,3000,7000,0,0,7756.08,70.5513,1009.34,2.07228,'4722:0 '),\n+(4724,'sp992',571,67,4436,76,80,3000,7000,0,0,7731.17,-155.37,873.081,2.5828,'4715:0 4725:0 '),\n+(4725,'sp993',571,67,67,76,80,3000,7000,0,0,7531.71,-82.1077,837.076,3.3682,'4724:0 4726:0 '),\n+(4726,'sp994',571,67,4424,76,80,3000,7000,0,0,7365.61,-62.5754,778.928,3.05011,'4725:0 4727:0 4731:0 '),\n+(4727,'sp995',571,67,4424,76,80,3000,7000,0,0,7426.39,97.7694,770.976,6.19485,'4726:0 4728:0 '),\n+(4728,'sp996',571,67,4499,76,80,3000,7000,0,0,7491.52,288.222,774.525,2.91503,'4727:0 4729:0 '),\n+(4729,'sp997',571,67,4424,76,80,3000,7000,0,0,7352.12,248.002,774.191,5.46442,'4728:0 4730:0 '),\n+(4730,'sp998',571,67,4424,76,80,3000,7000,0,0,7358.47,144.777,783.476,4.25726,'4729:0 4731:0 '),\n+(4731,'sp999',571,67,4424,76,80,3000,7000,0,0,7260.89,6.23937,773.777,4.18657,'4730:0 4726:0 4732:0 '),\n+(4732,'sp1000',571,67,4424,76,80,3000,7000,0,0,7178.24,-109.916,772.616,4.20384,'4731:0 4733:0 4736:0 '),\n+(4733,'sp1001',571,67,4452,76,80,3000,7000,0,0,7066.53,-147.905,785.381,3.57396,'4732:0 4734:0 '),\n+(4734,'sp1002',571,67,4453,76,80,3000,7000,0,0,6959.39,-173.873,763.88,2.97313,'4733:0 4735:0 '),\n+(4735,'sp1003',571,67,4453,76,80,3000,7000,0,0,6782.97,-67.7557,738.941,2.11233,'4734:0 '),\n+(4736,'sp1004',571,67,4452,76,80,3000,7000,0,0,7090.4,-308.701,774.099,4.51251,'4732:0 '),\n+(4737,'sp1005',571,67,67,76,80,3000,7000,0,0,8123.18,-622.333,945.418,5.51782,'4712:0 4738:0 '),\n+(4738,'sp1006',571,67,4446,76,80,3000,7000,0,0,8249.28,-737.261,923.975,5.57986,'4737:0 4739:0 '),\n+(4739,'sp1007',571,67,4446,76,80,3000,7000,0,0,8264.89,-900.437,923.875,2.77599,'4738:0 4740:0 4742:0 '),\n+(4740,'sp1008',571,67,4485,76,80,3000,7000,0,0,8140.52,-817.38,956.118,4.95861,'4739:0 4741:0 '),\n+(4741,'sp1009',571,67,4485,76,80,3000,7000,0,0,8148.76,-940.656,956.955,0.816413,'4740:0 '),\n+(4742,'sp1010',571,67,4446,76,80,3000,7000,0,0,8178.94,-1015.84,926.187,5.46676,'4739:0 4743:0 '),\n+(4743,'sp1011',571,67,4446,76,80,3000,7000,0,0,8330.55,-1186.57,924.477,5.49032,'4742:0 '),\n+(4744,'sp1012',571,67,4441,76,80,3000,7000,0,4,7798.27,-2842.24,1219.51,2.4704,'4745:0 4746:0 '),\n+(4745,'sp1013',571,67,4441,76,80,3000,7000,0,5,7804.98,-2945.31,1256.79,1.43524,'4744:0 '),\n+(4746,'sp1014',571,67,4441,76,80,3000,7000,0,0,7866.14,-2800.43,1136.14,2.6746,'4744:0 4747:0 4762:0 '),\n+(4747,'sp1015',571,67,4444,76,80,3000,7000,0,0,7974.26,-2941.67,1137.82,0.286989,'4746:0 4748:0 '),\n+(4748,'sp1016',571,67,4444,76,80,3000,7000,0,0,8053.32,-2899.02,1136.35,5.48632,'4747:0 4749:0 4753:0 '),\n+(4749,'sp1017',571,67,67,76,80,3000,7000,0,0,8303.1,-2938.59,1067.71,2.65574,'4748:0 4750:0 '),\n+(4750,'sp1018',571,67,4488,76,80,3000,7000,0,0,8126.19,-2813.7,1044.76,1.21375,'4749:0 4751:0 4752:0 '),\n+(4751,'sp1019',571,67,4488,76,80,3000,7000,0,0,8235.54,-2730.69,1035.47,6.08244,'4750:0 4752:0 '),\n+(4752,'sp1020',571,67,4488,76,80,3000,7000,0,0,8268.8,-2840.55,1051.57,2.98168,'4751:0 4750:0 '),\n+(4753,'sp1021',571,67,4444,76,80,3000,7000,0,0,8178.4,-2765.96,1137.8,1.58369,'4748:0 4754:0 '),\n+(4754,'sp1022',571,67,4444,76,80,3000,7000,0,0,8192.81,-2569.46,1145.92,1.28524,'4753:0 4755:0 4761:0 '),\n+(4755,'sp1023',571,67,4446,76,80,3000,7000,0,0,8213.34,-2399.15,1136.06,1.39441,'4754:0 4756:0 '),\n+(4756,'sp1024',571,67,4446,76,80,3000,7000,0,0,8146.87,-2304.3,1157.9,3.14664,'4755:0 4757:0 4758:0 '),\n+(4757,'sp1025',571,67,4446,76,80,3000,7000,0,0,8041.79,-2401.8,1157.91,1.83659,'4756:0 4758:0 4759:0 '),\n+(4758,'sp1026',571,67,4446,76,80,3000,7000,0,0,7981.22,-2241.64,1157.87,2.17589,'4757:0 4756:0 '),\n+(4759,'sp1027',571,67,4446,76,80,3000,7000,0,0,7920.25,-2449.09,1137.97,1.81145,'4757:0 4760:0 4763:0 '),\n+(4760,'sp1028',571,67,4444,76,80,3000,7000,0,0,7924.11,-2571.76,1159.29,2.58976,'4759:0 4761:0 '),\n+(4761,'sp1029',571,67,4444,76,80,3000,7000,0,0,8046.59,-2635.79,1135.01,6.18452,'4760:0 4754:0 4762:0 '),\n+(4762,'sp1030',571,67,4463,76,80,3000,7000,0,0,7915.54,-2719.76,1135.12,3.80869,'4761:0 4746:0 '),\n+(4763,'sp1031',571,67,4446,76,80,3000,7000,0,0,7902.91,-2332.91,1153.05,3.63118,'4759:0 4764:0 '),\n+(4764,'sp1032',571,67,4442,76,80,3000,7000,0,0,7759.44,-2386.38,1077.61,2.84264,'4763:0 4765:0 '),\n+(4765,'sp1033',571,67,4442,76,80,3000,7000,0,0,7670.97,-2282.57,1010.94,2.45387,'4764:0 4766:0 '),\n+(4766,'sp1034',571,67,4442,76,80,3000,7000,0,0,7541.71,-2363.06,867.728,2.12164,'4765:0 4767:0 '),\n+(4767,'sp1035',571,67,4442,76,80,3000,7000,0,0,7465.67,-2485.65,760.441,0.00970542,'4766:0 4768:0 4781:0 '),\n+(4768,'sp1036',571,67,4438,76,80,3000,7000,0,0,7327.84,-2537.89,748.903,4.00974,'4767:0 4769:0 4781:0 '),\n+(4769,'sp1037',571,67,4438,76,80,3000,7000,0,0,7348.8,-2768.24,766.138,4.91922,'4768:0 4770:0 '),\n+(4770,'sp1038',571,67,4438,76,80,3000,7000,0,0,7348.82,-2958.97,838.738,4.70872,'4769:0 4771:0 4780:0 '),\n+(4771,'sp1039',571,67,4439,76,80,3000,7000,0,0,7229.61,-3136.68,837.486,4.08826,'4770:0 4772:0 4780:0 '),\n+(4772,'sp1040',571,67,4495,76,80,3000,7000,0,0,7202.51,-3334.74,843.826,4.6883,'4771:0 4773:0 '),\n+(4773,'sp1041',571,67,4439,76,80,3000,7000,0,0,7368.35,-3244.03,851.789,5.98892,'4772:0 4774:0 '),\n+(4774,'sp1042',571,67,4439,76,80,3000,7000,0,0,7555.15,-3237.78,842.017,0.160478,'4773:0 4775:0 '),\n+(4775,'sp1043',571,67,4440,76,80,3000,7000,0,0,7723.64,-3278.88,863.372,5.73209,'4774:0 4776:0 '),\n+(4776,'sp1044',571,67,4440,76,80,3000,7000,0,0,7843.39,-3412.02,865.974,6.25831,'4775:0 4777:0 '),\n+(4777,'sp1045',571,67,4440,76,80,3000,7000,0,0,8007.01,-3282.63,865.574,2.51589,'4776:0 4778:0 '),\n+(4778,'sp1046',571,67,4440,76,80,3000,7000,0,0,7854.16,-3160.4,864.749,3.02718,'4777:0 4779:0 '),\n+(4779,'sp1047',571,67,4440,76,80,3000,7000,0,0,7635.61,-3117.6,867.091,3.3971,'4778:0 4780:0 '),\n+(4780,'sp1048',571,67,4439,76,80,3000,7000,0,0,7437.01,-3083.87,837.452,2.68239,'4779:0 4770:0 4771:0 '),\n+(4781,'sp1049',571,67,4437,76,80,3000,7000,0,0,7293.97,-2399.5,753.5,6.25517,'4768:0 4767:0 4782:0 '),\n+(4782,'sp1050',571,67,4437,76,80,3000,7000,0,0,7210.78,-2258.23,756.519,2.1766,'4781:0 4783:0 '),\n+(4783,'sp1051',571,67,4437,76,80,3000,7000,0,0,7094.38,-2114.84,759.283,2.32896,'4782:0 4784:0 '),\n+(4784,'sp1052',571,67,4437,76,80,3000,7000,0,0,7071.57,-1957.32,769.29,1.71086,'4783:0 4785:0 '),\n+(4785,'sp1053',571,67,4422,76,80,3000,7000,0,0,7047.94,-1819.05,822.822,1.51843,'4784:0 4786:0 '),\n+(4786,'sp1054',571,67,4422,76,80,3000,7000,0,0,7016.16,-1682.12,819.647,1.56948,'4785:0 4787:0 4788:0 4795:0 '),\n+(4787,'sp1055',571,67,4422,76,80,3000,7000,0,0,6952.92,-1523.53,837.796,1.58755,'4786:0 4788:0 4789:0 '),\n+(4788,'sp1056',571,67,4422,76,80,3000,7000,0,0,6876.88,-1688.13,820.475,5.87424,'4787:0 4786:0 '),\n+(4789,'sp1057',571,67,4425,76,80,3000,7000,0,0,6933.96,-1355.59,831.143,1.62444,'4787:0 4790:0 '),\n+(4790,'sp1058',571,67,4425,76,80,3000,7000,0,0,6927.88,-1275.08,819.873,1.80979,'4789:0 4791:0 '),\n+(4791,'sp1059',571,67,4423,76,80,3000,7000,0,0,6891.54,-1120.83,801.801,2.04934,'4790:0 4792:0 4794:0 '),\n+(4792,'sp1060',571,67,4423,76,80,3000,7000,0,0,6874.8,-994.702,800.05,1.94645,'4791:0 4793:0 '),\n+(4793,'sp1061',571,67,4423,76,80,3000,7000,0,0,6713.98,-1032.73,766.307,5.25848,'4792:0 4794:0 '),\n+(4794,'sp1062',571,67,4423,76,80,3000,7000,0,0,6823.44,-1136.74,794.362,1.42024,'4793:0 4791:0 '),\n+(4795,'sp1063',571,67,4422,76,80,3000,7000,0,0,7059.17,-1565.01,830.127,1.02674,'4786:0 4796:0 '),\n+(4796,'sp1064',571,67,4432,76,80,3000,7000,0,1,7107.06,-1444.92,924.841,0.0175042,'4795:0 4797:0 4808:0 '),\n+(4797,'sp1065',571,67,4432,76,80,3000,7000,0,0,7224.43,-1369.92,917.332,1.04952,'4796:0 4798:0 '),\n+(4798,'sp1066',571,67,4432,76,80,3000,7000,0,0,7304.81,-1229.95,912.257,1.04952,'4797:0 4799:0 '),\n+(4799,'sp1067',571,67,4473,76,80,3000,7000,0,0,7277.74,-1094.09,938.898,4.08901,'4798:0 4800:0 4801:0 '),\n+(4800,'sp1068',571,67,4473,76,80,3000,7000,0,0,7159.16,-1203.13,929.255,3.39314,'4799:0 '),\n+(4801,'sp1069',571,67,4432,76,80,3000,7000,0,0,7276.68,-952.788,919.235,1.31654,'4799:0 4802:0 '),\n+(4802,'sp1070',571,67,4432,76,80,3000,7000,0,0,7442.11,-871.692,910.159,0.46203,'4801:0 4803:0 '),\n+(4803,'sp1071',571,67,4432,76,80,3000,7000,0,0,7617.15,-899.183,911.902,5.67158,'4802:0 4804:0 '),\n+(4804,'sp1072',571,67,4432,76,80,3000,7000,0,0,7731.32,-1040.44,920.428,5.0087,'4803:0 4805:0 '),\n+(4805,'sp1073',571,67,4432,76,80,3000,7000,0,0,7620.47,-1211.71,928.587,4.24765,'4804:0 4806:0 '),\n+(4806,'sp1074',571,67,4432,76,80,3000,7000,0,0,7523.4,-1365.25,935.317,3.55807,'4805:0 4807:0 '),\n+(4807,'sp1075',571,67,4432,76,80,3000,7000,0,0,7392.6,-1463.43,928.011,4.00967,'4806:0 4808:0 '),\n+(4808,'sp1076',571,67,4536,76,80,3000,7000,0,0,7307.54,-1573.81,942.399,2.34934,'4807:0 4796:0 '),\n+(4809,'cs1077',571,2817,2817,76,80,3000,7000,0,0,5850.58,-134.972,227.342,6.13811,'4579:0 4810:0 '),\n+(4810,'ic1078',571,210,4501,77,80,3000,7000,0,0,5971.83,-162.754,303.817,0.106256,'4809:0 4811:0 '),\n+(4811,'ic1079',571,210,4501,77,80,3000,7000,0,1,6141.12,-52.066,381.591,0.738502,'4810:0 4812:0 '),\n+(4812,'ic1080',571,210,4501,77,80,3000,7000,0,0,6194.51,34.1853,380.232,0.656035,'4811:0 4813:0 4815:0 '),\n+(4813,'ic1081',571,210,4504,77,80,3000,7000,0,0,6172.36,156.629,374.276,0.907363,'4812:0 4814:0 '),\n+(4814,'ic1082',571,210,4504,77,80,3000,7000,0,0,6379.33,179.484,392.956,0.48639,'4813:0 4815:0 4816:0 '),\n+(4815,'ic1083',571,210,4501,77,80,3000,7000,0,0,6302.14,95.8391,390.823,3.94214,'4814:0 4812:0 '),\n+(4816,'ic1084',571,210,4505,77,80,3000,7000,0,0,6510.94,285.541,400.181,0.224064,'4814:0 4817:0 '),\n+(4817,'ic1085',571,210,4505,77,80,3000,7000,0,0,6561.12,378.976,420.028,1.01575,'4816:0 4818:0 4819:0 '),\n+(4818,'ic1086',571,210,4506,77,80,3000,7000,0,0,6586.56,556.561,402.946,1.2011,'4817:0 4819:0 4820:0 '),\n+(4819,'ic1087',571,210,4506,77,80,3000,7000,0,0,6708.22,403.424,412.114,3.63504,'4818:0 4817:0 4824:0 '),\n+(4820,'ic1088',571,210,4506,77,80,3000,7000,0,0,6723.06,690.867,407.835,0.367783,'4818:0 4821:0 4851:0 '),\n+(4821,'ic1089',571,210,4506,77,80,3000,7000,0,0,6907.33,730.085,420.328,0.313591,'4820:0 4822:0 4846:0 '),\n+(4822,'ic1090',571,210,4506,77,80,3000,7000,0,0,6968.03,622.605,462.269,4.11884,'4821:0 4823:0 4825:0 '),\n+(4823,'ic1091',571,210,4506,77,80,3000,7000,0,0,6892.8,465.906,471.697,4.29869,'4822:0 '),\n+(4824,'ic1092',571,210,4506,77,80,3000,7000,0,0,6802.58,551.703,425.103,0.960751,'4819:0 '),\n+(4825,'ic1093',571,210,4506,77,80,3000,7000,0,0,7175.08,588.447,498.301,5.6747,'4822:0 4826:0 4827:0 '),\n+(4826,'ic1094',571,210,4506,77,80,3000,7000,0,0,7078.72,503.754,527.049,0.380329,'4825:0 '),\n+(4827,'ic1095',571,210,4593,77,80,3000,7000,0,0,7262.77,707.458,487.068,0.969396,'4825:0 4828:0 '),\n+(4828,'ic1096',571,210,210,77,80,3000,7000,0,0,7380.79,847.639,456.611,1.04794,'4827:0 4829:0 '),\n+(4829,'ic1097',571,210,4533,77,80,3000,7000,0,0,7556.82,768.81,478.284,6.18915,'4828:0 4830:0 4831:0 '),\n+(4830,'ic1098',571,210,4533,77,80,3000,7000,0,0,7584.83,947.602,480.255,1.08485,'4829:0 4831:0 '),\n+(4831,'ic1099',571,210,4533,77,80,3000,7000,0,0,7712.14,808.936,478.443,2.68156,'4830:0 4829:0 4832:0 '),\n+(4832,'ic1100',571,210,4533,77,80,3000,7000,0,0,7860.07,894.491,452.788,0.0928901,'4831:0 4833:0 4842:0 4845:0 '),\n+(4833,'ic1101',571,210,4533,77,80,3000,7000,0,0,8034.56,793.581,473.244,0.0151296,'4832:0 4834:0 '),\n+(4834,'ic1102',571,210,4658,77,80,3000,7000,0,0,8220.62,796.211,504.283,0.00650024,'4833:0 4835:0 '),\n+(4835,'ic1103',571,210,4658,77,80,3000,7000,0,0,8374.24,796.938,547.919,6.10983,'4834:0 4836:0 4841:0 '),\n+(4836,'ic1104',571,210,4669,77,80,3000,7000,0,0,8423.03,930.654,544.674,1.16574,'4835:0 4837:0 '),\n+(4837,'ic1105',571,210,4658,77,80,3000,7000,0,1,8522.2,1039.69,548.104,0.757338,'4836:0 4838:0 '),\n+(4838,'ic1106',571,210,4658,77,80,3000,7000,0,0,8609.95,905.31,545.094,5.03776,'4837:0 4839:0 '),\n+(4839,'ic1107',571,210,4658,77,80,3000,7000,0,3,8585.78,716.794,547.469,4.14555,'4838:0 4840:0 '),\n+(4840,'ic1108',571,210,4658,77,80,3000,7000,0,0,8489.61,581.224,559.708,4.17226,'4839:0 4841:0 '),\n+(4841,'ic1109',571,210,4658,77,80,3000,7000,0,5,8440.59,706.692,547.293,2.35563,'4840:0 4835:0 '),\n+(4842,'ic1110',571,210,4533,77,80,3000,7000,0,0,7765.83,995.585,447.266,2.83001,'4832:0 4843:0 '),\n+(4843,'ic1111',571,210,4533,77,80,3000,7000,0,0,7711.5,1167.13,440.596,0.808391,'4842:0 4844:0 '),\n+(4844,'ic1112',571,210,4533,77,80,3000,7000,0,0,7859.21,1231.56,441.972,0.590053,'4843:0 4845:0 4875:0 '),\n+(4845,'ic1113',571,210,4533,77,80,3000,7000,0,0,7895.54,1042.03,450.717,4.64349,'4844:0 4832:0 '),\n+(4846,'ic1114',571,210,4508,77,80,3000,7000,0,0,6955.49,874.331,402.675,1.29769,'4821:0 4847:0 '),\n+(4847,'ic1115',571,210,4508,77,80,3000,7000,0,0,7020.59,1065.06,402.857,1.32832,'4846:0 4848:0 '),\n+(4848,'ic1116',571,210,4508,77,80,3000,7000,0,0,6957.22,1339.68,398.602,1.97863,'4847:0 4849:0 '),\n+(4849,'ic1117',571,210,4508,77,80,3000,7000,0,0,6833.49,1460.28,390.712,1.81761,'4848:0 4850:0 '),\n+(4850,'ic1118',571,210,210,77,80,3000,7000,0,0,6826.51,1619.37,389.033,4.69297,'4849:0 '),\n+(4851,'ic1119',571,210,4507,77,80,3000,7000,0,0,6666.86,830.852,365.983,2.48285,'4820:0 4852:0 '),\n+(4852,'ic1120',571,210,4507,77,80,3000,7000,0,0,6599.05,917.605,308.63,2.05873,'4851:0 4853:0 '),\n+(4853,'ic1121',571,210,4507,77,80,3000,7000,0,0,6597.42,1025.81,280.105,1.11625,'4852:0 4854:0 4858:0 '),\n+(4854,'ic1122',571,210,4507,77,80,3000,7000,0,0,6559.27,1194.84,276.689,2.19853,'4853:0 4855:0 '),\n+(4855,'ic1123',571,210,4507,77,80,3000,7000,0,0,6688.4,1234.6,276.432,6.14281,'4854:0 4856:0 '),\n+(4856,'ic1124',571,210,4507,77,80,3000,7000,0,0,6863.13,1227.79,282.996,5.66451,'4855:0 4857:0 4859:0 '),\n+(4857,'ic1125',571,210,4507,77,80,3000,7000,0,0,6896.72,1042.62,305.673,4.53274,'4856:0 4858:0 4859:0 '),\n+(4858,'ic1126',571,210,4507,77,80,3000,7000,0,0,6726.14,1037,288.797,3.31459,'4857:0 4853:0 '),\n+(4859,'ic1127',571,210,4508,77,80,3000,7000,0,0,7001.55,1212.52,307.249,0.331647,'4857:0 4856:0 4860:0 4861:0 '),\n+(4860,'ic1128',571,210,4537,77,80,3000,7000,0,0,7135.37,1189.66,298.703,5.1862,'4859:0 4869:0 '),\n+(4861,'ic1129',571,210,4508,77,80,3000,7000,0,0,7048.99,1354.24,304.707,4.93802,'4859:0 4862:0 '),\n+(4862,'ic1130',571,210,4537,77,80,3000,7000,0,0,7186.05,1411.54,315.97,0.428269,'4861:0 4863:0 4957:0 '),\n+(4863,'ic1131',571,210,4537,77,80,3000,7000,0,0,7349.91,1448.05,320.323,0.242915,'4862:0 4864:0 4957:0 '),\n+(4864,'ic1132',571,210,4537,77,80,3000,7000,0,0,7474.88,1490.17,330.932,0.611267,'4863:0 4865:0 '),\n+(4865,'ic1133',571,210,4537,77,80,3000,7000,0,0,7573.73,1609.11,345.106,1.19325,'4864:0 4866:0 4870:0 '),\n+(4866,'ic1134',571,210,4537,77,80,3000,7000,0,0,7721.75,1522.15,349.093,5.66688,'4865:0 4867:0 4874:0 '),\n+(4867,'ic1135',571,210,4537,77,80,3000,7000,0,0,7720.3,1336.02,354.115,4.43774,'4866:0 4868:0 4876:0 '),\n+(4868,'ic1136',571,210,4537,77,80,3000,7000,0,0,7534.59,1265.76,334.056,2.73578,'4867:0 4869:0 '),\n+(4869,'ic1137',571,210,4537,77,80,3000,7000,0,0,7314,1220.63,315.76,3.35624,'4868:0 4860:0 '),\n+(4870,'ic1138',571,210,4509,77,80,3000,7000,0,0,7577.1,1786.78,359.583,1.47521,'4865:0 4871:0 '),\n+(4871,'ic1139',571,210,4509,77,80,3000,7000,0,0,7669.29,1945.97,367.174,1.15084,'4870:0 4872:0 4881:0 '),\n+(4872,'ic1140',571,210,4509,77,80,3000,7000,0,0,7873.9,1929.78,365.964,6.20016,'4871:0 4873:0 4877:0 '),\n+(4873,'ic1141',571,210,4509,77,80,3000,7000,0,0,7887.76,1725.17,368.82,4.09059,'4872:0 4874:0 '),\n+(4874,'ic1142',571,210,4509,77,80,3000,7000,0,0,7765,1638.88,350.579,4.75974,'4873:0 4866:0 '),\n+(4875,'ic1143',571,210,210,77,80,3000,7000,0,0,7920.44,1374.41,452.53,1.61423,'4844:0 4876:0 '),\n+(4876,'ic1144',571,210,4537,77,80,3000,7000,0,0,7822.59,1365.97,388.481,3.40023,'4875:0 4867:0 '),\n+(4877,'ic1145',571,210,4510,77,80,3000,7000,0,0,7809.24,2060.92,392.033,1.58203,'4872:0 4878:0 '),\n+(4878,'ic1146',571,210,4540,77,80,3000,7000,0,0,7858.11,2248.57,376.618,1.4603,'4877:0 4879:0 '),\n+(4879,'ic1147',571,210,4540,77,80,3000,7000,0,0,7823.2,2412.9,388.323,1.80744,'4878:0 4880:0 '),\n+(4880,'ic1148',571,210,4540,77,80,3000,7000,0,0,7793.72,2597.47,402.105,1.67392,'4879:0 4892:0 '),\n+(4881,'ic1149',571,210,4510,77,80,3000,7000,0,0,7699.75,2069.29,391.653,1.65822,'4871:0 4882:0 '),\n+(4882,'ic1150',571,210,4540,77,80,3000,7000,0,0,7652.21,2249.08,368.676,2.35408,'4881:0 4883:0 '),\n+(4883,'ic1151',571,210,4540,77,80,3000,7000,0,0,7521.07,2342.93,375.359,2.52294,'4882:0 4884:0 '),\n+(4884,'ic1152',571,210,4523,77,80,3000,7000,0,0,7369.4,2442.13,391.045,2.44441,'4883:0 4885:0 4893:0 '),\n+(4885,'ic1153',571,210,4523,77,80,3000,7000,0,0,7198.45,2497.03,404.398,2.97341,'4884:0 4886:0 4893:0 '),\n+(4886,'ic1154',571,210,4523,77,80,3000,7000,0,0,7035.47,2497.06,410.594,3.37789,'4885:0 4887:0 '),\n+(4887,'ic1155',571,210,4523,77,80,3000,7000,0,0,7014.72,2665.38,400.29,1.87621,'4886:0 4888:0 '),\n+(4888,'ic1156',571,210,4523,77,80,3000,7000,0,0,7013.48,2866.37,424.885,1.59347,'4887:0 4889:0 '),\n+(4889,'ic1157',571,210,4523,77,80,3000,7000,0,0,7165.04,2990.37,441.491,6.14878,'4888:0 4890:0 '),\n+(4890,'ic1158',571,210,4523,77,80,3000,7000,0,0,7332.14,2917.95,423.697,5.78906,'4889:0 4891:0 4893:0 4894:0 '),\n+(4891,'ic1159',571,210,4540,77,80,3000,7000,0,0,7502.18,2817.76,419.764,5.68225,'4890:0 4892:0 4893:0 '),\n+(4892,'ic1160',571,210,4516,77,80,3000,7000,0,0,7710.23,2726.49,412.219,5.21495,'4891:0 4880:0 4963:0 '),\n+(4893,'ic1161',571,210,4523,77,80,3000,7000,0,0,7307.93,2711.18,396.859,4.63376,'4891:0 4884:0 4885:0 4890:0 '),\n+(4894,'ic1162',571,210,210,77,80,3000,7000,0,0,7358.64,3080.68,476.932,1.77884,'4890:0 4895:0 '),\n+(4895,'ic1163',571,210,210,77,80,3000,7000,0,0,7199,3207.31,545.531,1.97125,'4894:0 4896:0 '),\n+(4896,'ic1164',571,210,210,77,80,3000,7000,0,0,7139.56,3362.03,669.633,2.10878,'4895:0 4897:0 '),\n+(4897,'ic1165',571,210,4531,77,80,3000,7000,0,0,6985.22,3466.47,708.57,2.8337,'4896:0 4898:0 4928:0 '),\n+(4898,'ic1166',571,210,4531,77,80,3000,7000,0,0,6890.27,3530.05,708.606,5.39253,'4897:0 4899:0 '),\n+(4899,'ic1167',571,210,4531,77,80,3000,7000,0,0,6830.55,3590.9,740.056,5.22131,'4898:0 4900:0 '),\n+(4900,'ic1168',571,210,4496,77,80,3000,7000,0,0,6868.76,3731.57,755.294,4.54431,'4899:0 4901:0 '),\n+(4901,'ic1169',571,210,4496,77,80,3000,7000,0,0,7002.18,3880.5,610.484,1.63677,'4900:0 4902:0 4903:0 4905:0 '),\n+(4902,'ic1170',571,210,4496,77,80,3000,7000,0,0,6831.56,3987.86,615.968,2.45046,'4901:0 4903:0 '),\n+(4903,'ic1171',571,210,4496,77,80,3000,7000,0,0,6897.56,3919.65,615.975,4.57026,'4902:0 4901:0 4904:0 '),\n+(4904,'ic1172',571,210,4528,77,80,3000,7000,0,0,6814.18,3788.63,621.07,1.05954,'4903:0 '),\n+(4905,'ic1173',571,210,4496,77,80,3000,7000,0,0,7138.52,3955.81,581.785,5.65333,'4901:0 4906:0 4974:0 4976:0 '),\n+(4906,'ic1174',571,210,4498,77,80,3000,7000,0,0,7284.9,3836.51,604.369,5.59993,'4905:0 4907:0 '),\n+(4907,'ic1175',571,210,4498,77,80,3000,7000,0,0,7410.57,3732.09,627.678,5.65962,'4906:0 4908:0 '),\n+(4908,'ic1176',571,210,4526,77,80,3000,7000,0,0,7512.15,3660.34,623.332,6.01697,'4907:0 4909:0 4927:0 '),\n+(4909,'ic1177',571,210,4526,77,80,3000,7000,0,0,7593.36,3544.42,655.937,5.07214,'4908:0 4910:0 '),\n+(4910,'ic1178',571,210,4526,77,80,3000,7000,0,0,7671,3432.93,656.192,2.35151,'4909:0 4911:0 '),\n+(4911,'ic1179',571,210,4526,77,80,3000,7000,0,0,7795.77,3500.91,658.351,0.992774,'4910:0 4912:0 4913:0 4925:0 '),\n+(4912,'ic1180',571,210,4526,77,80,3000,7000,0,0,7883.18,3469.31,671.838,6.04917,'4911:0 '),\n+(4913,'ic1181',571,210,4526,77,80,3000,7000,0,0,7919.33,3582.64,631.477,0.58594,'4911:0 4914:0 '),\n+(4914,'ic1182',571,210,4524,77,80,3000,7000,0,0,8041.43,3526.53,654.716,6.08922,'4913:0 4915:0 4922:0 '),\n+(4915,'ic1183',571,210,4524,77,80,3000,7000,0,0,8187.82,3610.43,658.019,0.290628,'4914:0 4916:0 '),\n+(4916,'ic1184',571,210,4524,77,80,3000,7000,0,0,8317.43,3535.48,657.912,4.87265,'4915:0 4917:0 '),\n+(4917,'ic1185',571,210,4524,77,80,3000,7000,0,0,8248.7,3338.48,654.291,5.09882,'4916:0 4918:0 4922:0 '),\n+(4918,'ic1186',571,210,4496,77,80,3000,7000,0,0,8311.26,3170.17,618.951,5.16165,'4917:0 4919:0 '),\n+(4919,'ic1187',571,210,4497,77,80,3000,7000,0,0,8430.96,3102.38,588.141,4.91819,'4918:0 4920:0 '),\n+(4920,'ic1188',571,210,4492,77,80,3000,7000,0,0,8426.9,2947.18,602.293,4.77996,'4919:0 4921:0 '),\n+(4921,'ic1189',571,210,4492,77,80,3000,7000,0,0,8429.04,2879.47,606.259,1.76717,'4920:0 '),\n+(4922,'ic1190',571,210,4524,77,80,3000,7000,0,0,8105.02,3418.73,672.247,3.83984,'4914:0 4917:0 4923:0 '),\n+(4923,'ic1191',571,210,4525,77,80,3000,7000,0,0,7990.63,3300.15,676.112,3.81628,'4922:0 4924:0 '),\n+(4924,'ic1192',571,210,4525,77,80,3000,7000,0,0,7944.78,3251.88,632.818,3.79665,'4923:0 '),\n+(4925,'ic1193',571,210,4526,77,80,3000,7000,0,0,7848.54,3632.5,653.393,4.16107,'4911:0 4926:0 '),\n+(4926,'ic1194',571,210,4526,77,80,3000,7000,0,0,7717.96,3673.53,653.297,3.444,'4925:0 4927:0 '),\n+(4927,'ic1195',571,210,4526,77,80,3000,7000,0,0,7617.43,3670.12,634.89,3.02774,'4926:0 4908:0 '),\n+(4928,'ic1196',571,210,4531,77,80,3000,7000,0,0,6853.09,3478.09,692.779,3.04894,'4897:0 4929:0 4930:0 4931:0 '),\n+(4929,'ic1197',571,210,4531,77,80,3000,7000,0,0,6714.63,3539.45,668.964,2.71907,'4928:0 4931:0 '),\n+(4930,'ic1198',571,210,4531,77,80,3000,7000,0,0,6719.14,3429.9,682.197,3.43144,'4928:0 4931:0 4978:0 '),\n+(4931,'ic1199',571,210,4531,77,80,3000,7000,0,0,6774.33,3483.53,672.159,3.05053,'4928:0 4930:0 4929:0 4932:0 '),\n+(4932,'ic1200',571,210,4531,77,80,3000,7000,0,0,6549.04,3449.66,598.005,3.34505,'4931:0 4933:0 '),\n+(4933,'ic1201',571,210,4531,77,80,3000,7000,0,0,6461.08,3286.15,631.506,5.01716,'4932:0 4934:0 '),\n+(4934,'ic1202',571,210,4531,77,80,3000,7000,0,0,6452.51,3119.45,657.481,1.45066,'4933:0 4935:0 '),\n+(4935,'ic1203',571,210,4518,77,80,3000,7000,0,0,6526.9,3000.14,651.117,4.87342,'4934:0 4936:0 '),\n+(4936,'ic1204',571,210,4518,77,80,3000,7000,0,0,6547.7,2810.28,651.117,4.72026,'4935:0 4937:0 '),\n+(4937,'ic1205',571,210,4518,77,80,3000,7000,0,0,6524.74,2581.76,651.117,4.51292,'4936:0 4938:0 '),\n+(4938,'ic1206',571,210,4518,77,80,3000,7000,0,0,6630.74,2328.4,651.585,5.06506,'4937:0 4939:0 '),\n+(4939,'ic1207',571,210,4518,77,80,3000,7000,0,0,6619.16,2134.02,651.118,4.86635,'4938:0 4940:0 '),\n+(4940,'ic1208',571,210,4520,77,80,3000,7000,0,0,6609.61,1940.41,652.242,3.77073,'4939:0 4941:0 4944:0 '),\n+(4941,'ic1209',571,210,4520,77,80,3000,7000,0,0,6436.2,1960.49,631.376,3.19739,'4940:0 4942:0 '),\n+(4942,'ic1210',571,210,4520,77,80,3000,7000,0,0,6238.67,1930.65,631.948,3.56731,'4941:0 4943:0 '),\n+(4943,'ic1211',571,210,4520,77,80,3000,7000,0,0,6075.08,1919.83,632.648,3.19032,'4942:0 '),\n+(4944,'ic1212',571,210,4520,77,80,3000,7000,0,0,6546.79,1812.75,629.551,4.65274,'4940:0 4945:0 4946:0 '),\n+(4945,'ic1213',571,210,4520,77,80,3000,7000,0,0,6556.05,1624.57,633.228,4.76113,'4944:0 4946:0 '),\n+(4946,'ic1214',571,210,4520,77,80,3000,7000,0,0,6590.03,1684.23,628.876,3.70395,'4945:0 4944:0 4947:0 '),\n+(4947,'ic1215',571,210,4513,77,80,3000,7000,0,0,6728.5,1651.46,572.96,1.13099,'4946:0 4948:0 '),\n+(4948,'ic1216',571,210,4513,77,80,3000,7000,0,0,6809.4,1726.92,556.264,3.80763,'4947:0 4949:0 4950:0 '),\n+(4949,'ic1217',571,210,4513,77,80,3000,7000,0,0,6812.51,1821.36,578.354,4.77131,'4948:0 '),\n+(4950,'ic1218',571,210,4513,77,80,3000,7000,0,0,6952.4,1697.92,518.536,2.9209,'4948:0 4951:0 '),\n+(4951,'ic1219',571,210,4513,77,80,3000,7000,0,0,7031.52,1779.42,506.019,1.12469,'4950:0 4952:0 4954:0 '),\n+(4952,'ic1220',571,210,4514,77,80,3000,7000,0,0,7025.43,1902.07,528.077,5.0187,'4951:0 4953:0 '),\n+(4953,'ic1221',571,210,4514,77,80,3000,7000,0,0,6960.52,2014.43,520.864,4.66919,'4952:0 '),\n+(4954,'ic1222',571,210,4513,77,80,3000,7000,0,0,7201.98,1696.05,469.261,2.30668,'4951:0 4955:0 4958:0 4959:0 '),\n+(4955,'ic1223',571,210,210,77,80,3000,7000,0,0,7348.32,1642.76,429.984,1.78832,'4954:0 4956:0 '),\n+(4956,'ic1224',571,210,210,77,80,3000,7000,0,0,7214.66,1585.03,379.979,5.44591,'4955:0 4957:0 '),\n+(4957,'ic1225',571,210,4537,77,80,3000,7000,0,0,7281.16,1492.2,326.379,1.64772,'4956:0 4863:0 4862:0 4958:0 '),\n+(4958,'ic1226',571,210,210,77,80,3000,7000,0,0,7331.27,1765.54,456.844,3.80914,'4957:0 4954:0 '),\n+(4959,'ic1227',571,210,4513,77,80,3000,7000,0,0,7136.03,1876.5,532.96,4.77911,'4954:0 4960:0 '),\n+(4960,'ic1228',571,210,4513,77,80,3000,7000,0,0,7224.2,1973.83,570.931,1.27072,'4959:0 4961:0 4962:0 '),\n+(4961,'ic1229',571,210,4513,77,80,3000,7000,0,1,7242.67,2168.33,565.646,4.69493,'4960:0 '),\n+(4962,'ic1230',571,210,4513,77,80,3000,7000,0,0,7100.09,2122.12,621.203,4.3801,'4960:0 '),\n+(4963,'ic1231',571,210,4540,77,80,3000,7000,0,0,7682.15,2851.03,469.055,2.77003,'4892:0 4964:0 '),\n+(4964,'ic1232',571,210,4517,77,80,3000,7000,0,0,7685.31,3002.19,541.332,0.921987,'4963:0 4965:0 '),\n+(4965,'ic1233',571,210,4517,77,80,3000,7000,0,0,7702.82,3078.43,557.351,5.63045,'4964:0 4966:0 4973:0 '),\n+(4966,'ic1234',571,210,4517,77,80,3000,7000,0,0,7843.82,2935.68,517.933,0.541764,'4965:0 4967:0 '),\n+(4967,'ic1235',571,210,4517,77,80,3000,7000,0,0,7934.47,2994.97,541.057,3.56948,'4966:0 4968:0 '),\n+(4968,'ic1236',571,210,4517,77,80,3000,7000,0,0,8021.28,2971.58,563.405,2.3317,'4967:0 4969:0 '),\n+(4969,'ic1237',571,210,4517,77,80,3000,7000,0,0,8106.95,2852.61,559.292,5.73169,'4968:0 4970:0 4979:0 '),\n+(4970,'ic1238',571,210,4477,77,80,3000,7000,0,0,8243,2776.54,640.775,6.08434,'4969:0 4971:0 '),\n+(4971,'ic1239',571,210,4477,77,80,3000,7000,0,0,8383.84,2730.79,655.094,5.79375,'4970:0 4972:0 '),\n+(4972,'ic1240',571,210,4477,77,80,3000,7000,0,1,8508.77,2673.5,652.354,5.83302,'4971:0 '),\n+(4973,'ic1241',571,210,4517,77,80,3000,7000,0,0,7575.23,3170.11,577.394,5.58719,'4965:0 '),\n+(4974,'ic1242',571,210,4496,77,80,3000,7000,0,0,6971.39,3981.75,552.612,5.94612,'4905:0 4975:0 '),\n+(4975,'ic1243',571,210,4496,77,80,3000,7000,0,0,6934.59,4194.33,535.202,1.79686,'4974:0 '),\n+(4976,'ic1244',571,210,4496,77,80,3000,7000,0,0,7162.84,4153.53,633.939,2.91213,'4905:0 4977:0 '),\n+(4977,'ic1245',571,210,4496,77,80,3000,7000,0,0,7019.95,4225.08,665.892,2.06625,'4976:0 '),\n+(4978,'ic1246',571,210,4531,77,80,3000,7000,0,0,6545.08,3321.6,665.004,4.0596,'4930:0 '),\n+(4979,'ic1247',571,210,210,77,80,3000,7000,0,0,8061.74,2755.35,542.008,4.48453,'4969:0 4980:0 '),\n+(4980,'ic1248',571,210,210,77,80,3000,7000,0,0,8077.07,2597.13,519.549,4.54375,'4979:0 4981:0 '),\n+(4981,'ic1249',571,210,4510,77,80,3000,7000,0,0,8103.98,2410.6,490.587,4.97494,'4980:0 4982:0 '),\n+(4982,'ic1250',571,210,4510,77,80,3000,7000,0,0,8060.18,2339.25,484.62,3.25413,'4981:0 4983:0 '),\n+(4983,'ic1251',571,210,4510,77,80,3000,7000,0,0,7982.84,2214.78,500.312,4.5092,'4982:0 4984:0 4985:0 '),\n+(4984,'ic1252',571,210,4510,77,80,3000,7000,0,0,8163.01,2189.09,499.737,3.33032,'4983:0 '),\n+(4985,'ic1253',571,210,4510,77,80,3000,7000,0,0,7986.6,2067,499.729,3.00752,'4983:0 4986:0 4989:0 '),\n+(4986,'ic1254',571,210,4510,77,80,3000,7000,0,0,8120.19,1962.29,501.671,5.88521,'4985:0 4987:0 '),\n+(4987,'ic1255',571,210,4510,77,80,3000,7000,0,0,8204.78,1874.81,514.771,1.36602,'4986:0 4988:0 '),\n+(4988,'ic1256',571,210,4510,77,80,3000,7000,0,0,8179.12,2049.72,550.596,2.65329,'4987:0 '),\n+(4989,'ic1257',571,210,4510,77,80,3000,7000,0,0,7751.59,2060.95,499.864,3.22507,'4985:0 4990:0 '),\n+(4990,'ic1258',571,210,4510,77,80,3000,7000,0,0,7549.16,2067.17,500.312,3.28947,'4989:0 4991:0 4992:0 '),\n+(4991,'ic1259',571,210,4510,77,80,3000,7000,0,0,7438.58,2146.13,500.312,2.65644,'4990:0 '),\n+(4992,'ic1260',571,210,4510,77,80,3000,7000,0,0,7492.17,1991.36,500.301,0.996881,'4990:0 '),\n+(4993,'WarsongGulchSpawnA1',489,3277,4571,10,80,3000,7000,0,251,1535.77,1481.37,352.109,0.188495,'4996:0 5020:0 '),\n+(4994,'WarsongGulchAInside1',489,3277,3321,10,80,3000,7000,0,0,1479.77,1456.5,362.546,6.24394,'4995:0 5020:0 5000:0 '),\n+(4995,'WarsongGulchAInside2',489,3277,4571,10,80,3000,7000,0,32,1530.85,1468.31,362.665,3.14825,'4993:0 '),\n+(4996,'WarsongGulchAInside3',489,3277,3321,10,80,3000,7000,0,0,1471.13,1454.77,342.795,6.27608,'4997:0 5001:0 4993:0 '),\n+(4997,'WarsongGulchAInside4',489,3277,3321,10,80,3000,7000,0,36,1522.96,1457.18,373.688,1.69647,'4995:0 '),\n+(4998,'WarsongGulchAInside5',489,3277,3321,10,80,3000,7000,0,34,1397.56,1566.08,343.126,4.09978,'5018:0 '),\n+(4999,'WarsongGulchAInside6',489,3277,3321,10,80,3000,7000,0,34,1422.41,1527.05,342.47,3.08073,'5017:0 '),\n+(5000,'WarsongGulchAInside7',489,3277,3321,10,80,3000,7000,0,0,1398.06,1394.26,337.292,3.63638,'5012:0 4994:0 5011:0 5013:0 5014:0 5022:0 '),\n+(5001,'WarsongGulchAInside8',489,3277,3321,10,80,3000,7000,0,0,1350.63,1462.19,323.48,6.23998,'4996:0 5011:0 5012:0 5013:0 5014:0 5022:0 '),\n+(5002,'WarsongGulchSpawnH1',489,3277,4572,10,80,3000,7000,0,253,919.418,1434.62,345.695,3.13216,'5005:0 5019:0 '),\n+(5003,'WarsongGulchHInside1',489,3277,3320,10,80,3000,7000,0,0,974.016,1460.64,356.184,6.0456,'5004:0 5009:0 5019:0 '),\n+(5004,'WarsongGulchHInside2',489,3277,4572,10,80,3000,7000,0,32,925.907,1451.62,355.856,5.79629,'5002:0 '),\n+(5005,'WarsongGulchHInside3',489,3277,3320,10,80,3000,7000,0,0,983.244,1461.02,336.019,0.412332,'5006:0 5002:0 5010:0 '),\n+(5006,'WarsongGulchHInside4',489,3277,3320,10,80,3000,7000,0,34,931.587,1460.23,367.604,1.31163,'5004:0 '),\n+(5007,'WarsongGulchHInside5',489,3277,3320,10,80,3000,7000,0,36,1071.48,1375.61,339.77,5.94986,'5016:0 '),\n+(5008,'WarsongGulchHInside6',489,3277,3320,10,80,3000,7000,0,36,1056.79,1399.58,338.281,6.09319,'5015:0 '),\n+(5009,'WarsongGulchHInside7',489,3277,3320,10,80,3000,7000,0,0,1047.02,1538,333.504,0.447699,'5013:0 5003:0 5011:0 5012:0 5014:0 5023:0 '),\n+(5010,'WarsongGulchHInside8',489,3277,3320,10,80,3000,7000,0,0,1124.69,1463.21,315.869,3.32571,'5005:0 5011:0 5012:0 5013:0 5014:0 5023:0 '),\n+(5011,'WarsongGulchMid1',489,3277,3277,10,80,3000,7000,0,0,1236.54,1542.18,306.233,4.86553,'5001:0 5010:0 5023:0 5009:0 '),\n+(5012,'WarsongGulchMid2',489,3277,3277,10,80,3000,7000,0,0,1226.74,1479.78,307.286,3.2221,'5001:0 5022:0 5010:0 5023:0 5009:0 '),\n+(5013,'WarsongGulchMid3',489,3277,3277,10,80,3000,7000,0,0,1263.56,1400.5,310.369,3.07681,'5000:0 5001:0 5022:0 5010:0 5023:0 '),\n+(5014,'WarsongGulchMid4',489,3277,3277,10,80,3000,7000,0,0,1225.87,1335.88,312.589,0.771655,'5000:0 5001:0 5022:0 5010:0 '),\n+(5015,'WarsongGulchCliffH1',489,3277,3320,10,80,3000,7000,0,36,1069.83,1398.92,324.032,3.19735,'5010:0 5012:0 5013:0 5014:0 5024:0 '),\n+(5016,'WarsongGulchCliffH2',489,3277,3320,10,80,3000,7000,0,36,1081.68,1369.7,321.199,2.78226,'5010:0 5012:0 5013:0 5014:0 5024:0 '),\n+(5017,'WarsongGulchCliffA1',489,3277,3321,10,80,3000,7000,0,34,1406.26,1532.45,324.559,6.09621,'5001:0 5011:0 5012:0 5013:0 5021:0 '),\n+(5018,'WarsongGulchCliffA2',489,3277,3321,10,80,3000,7000,0,34,1385.08,1571.34,321.478,5.74278,'5001:0 5011:0 5012:0 5013:0 5021:0 '),\n+(5019,'WarsongGulchHInside9',489,3277,3320,10,80,3000,7000,0,0,956.507,1421.77,345.527,2.11349,'5007:0 5008:0 5002:0 5003:0 '),\n+(5020,'WarsongGulchAInside9',489,3277,3321,10,80,3000,7000,0,0,1500.52,1493.83,352.198,4.62677,'4998:0 4999:0 4993:0 4994:0 '),\n+(5021,'WarsongGulchBuffNW',489,3277,3277,10,80,3000,7000,0,2048,1318.7,1550.35,313.235,2.83923,'5011:0 5012:0 5013:0 '),\n+(5022,'WarsongGulchBuffNE',489,3277,3277,10,80,3000,7000,0,4096,1320.61,1380.27,314.891,4.10568,'5000:0 5001:0 5012:0 5013:0 5014:0 '),\n+(5023,'WarsongGulchBuffSW',489,3277,3277,10,80,3000,7000,0,16384,1138.3,1558.94,306.906,0.653861,'5010:0 5011:0 5012:0 5013:0 5009:0 '),\n+(5024,'WarsongGulchBuffSE',489,3277,3277,10,80,3000,7000,0,8192,1111.58,1352.73,316.565,2.66841,'5012:0 5013:0 5014:0 '),\n+(5025,'ArathiBasinSpawnA',529,3358,3417,20,80,3000,7000,0,19,1289.51,1286.41,-14.466,3.89804,'5026:0 '),\n+(5026,'ArathiBasinStartA',529,3358,3358,20,80,3000,7000,0,0,1241.32,1228.52,-40.2271,4.12149,'5025:0 5027:0 5028:0 5040:0 '),\n+(5027,'ArathiBasinStables',529,3358,3424,20,80,3000,7000,0,128,1168.45,1204.15,-56.582,6.24992,'5028:0 5040:0 5054:0 5026:0 '),\n+(5028,'ArathiBasinStablesBridge',529,3358,3358,20,80,3000,7000,0,0,1088.6,1223.56,-53.4783,0.143443,'5029:0 5032:0 5027:0 5026:0 '),\n+(5029,'ArathiBasinMillLow1',529,3358,3358,20,80,3000,7000,0,0,988.277,1179.75,-50.2717,5.04236,'5028:0 5030:0 5045:0 5032:0 '),\n+(5030,'ArathiBasinMillLow2',529,3358,3358,20,80,3000,7000,0,0,894.665,1107.2,-57.5224,0.784845,'5029:0 5031:0 '),\n+(5031,'ArathiBasinMillLow3',529,3358,3358,20,80,3000,7000,0,0,827.933,976.767,-54.503,0.786809,'5030:0 5034:0 5037:0 5044:0 '),\n+(5032,'ArathiBasinMillUp1',529,3358,3358,20,80,3000,7000,0,0,945.567,1228.54,-27.3493,5.38137,'5028:0 5029:0 5056:0 '),\n+(5033,'ArathiBasinMill',529,3358,3422,20,80,3000,7000,0,128,859.442,1146.07,11.648,2.38114,'5057:0 5056:0 5053:0 '),\n+(5034,'ArathiBasinMillUp2',529,3358,3422,20,80,3000,7000,0,0,782.036,1026.34,-36.027,5.5934,'5037:0 5031:0 5057:0 '),\n+(5035,'ArathiBasinSpawnH',529,3358,3418,20,80,3000,7000,0,21,704.074,704.457,-16.4305,0.79572,'5036:0 '),\n+(5036,'ArathiBasinStartH',529,3358,3358,20,80,3000,7000,0,0,758.421,762.987,-43.2233,0.712183,'5037:0 5035:0 5038:0 '),\n+(5037,'ArathiBasinFarm',529,3358,3420,20,80,3000,7000,0,128,809.518,872.639,-56.7354,0.10154,'5034:0 5036:0 5038:0 5052:0 5039:0 5031:0 '),\n+(5038,'ArathiBasinFarmBridge',529,3358,3420,20,80,3000,7000,0,0,864.632,772.771,-51.793,3.98729,'5036:0 5037:0 5039:0 '),\n+(5039,'ArathiBasinMineForkSE',529,3358,3358,20,80,3000,7000,0,0,956.739,804.522,-61.6094,0.524283,'5037:0 5038:0 5043:0 5050:0 '),\n+(5040,'ArathiBasinMineForkNW',529,3358,3358,20,80,3000,7000,0,0,1221.3,1088.37,-59.7666,4.47091,'5042:0 5027:0 5048:0 5026:0 '),\n+(5041,'ArathiBasinMine',529,3358,3423,20,80,3000,7000,0,128,1151.72,846.381,-110.525,2.55257,'5051:0 5048:0 5050:0 '),\n+(5042,'ArathiBasinMineUp1',529,3358,3358,20,80,3000,7000,0,0,1147.72,998.593,-63.7325,3.58672,'5040:0 5043:0 5045:0 5047:0 '),\n+(5043,'ArathiBasinMineUp2',529,3358,3358,20,80,3000,7000,0,0,1040.93,882.871,-61.8051,2.33458,'5044:0 5042:0 5049:0 5039:0 '),\n+(5044,'ArathiBasinBlacksmithForkS',529,3358,3421,20,80,3000,7000,0,0,947.881,1005.66,-48.5412,3.2392,'5043:0 5046:0 5045:0 5031:0 '),\n+(5045,'ArathiBasinBlacksmithForkN',529,3358,3421,20,80,3000,7000,0,0,1025.4,999.605,-46.1926,2.74243,'5029:0 5042:0 5044:0 5046:0 '),\n+(5046,'ArathiBasinBlacksmith',529,3358,3421,20,80,3000,7000,0,128,979.258,1043.34,-44.3749,0.106003,'5044:0 5045:0 5055:0 '),\n+(5047,'ArathiBasinMineCliff1',529,3358,3358,20,80,3000,7000,0,65544,1164,966.548,-66.2884,2.12191,'5048:0 5042:0 '),\n+(5048,'ArathiBasinMineDrop1',529,3358,3358,20,80,3000,7000,0,131072,1180.76,949.456,-97.1403,2.75853,'5040:0 5041:0 5050:0 '),\n+(5049,'ArathiBasinMineCliff2',529,3358,3358,20,80,3000,7000,0,65544,1075.94,851.303,-65.9095,2.44001,'5050:0 5043:0 '),\n+(5050,'ArathiBasinMineDrop2',529,3358,3358,20,80,3000,7000,0,131072,1089.48,842.85,-102.208,2.56371,'5039:0 5041:0 5048:0 '),\n+(5051,'ArathiBasinMineBuff',529,3358,3423,20,80,3000,7000,0,16392,1148.7,816.306,-98.4955,1.60396,'5041:0 '),\n+(5052,'ArathiBasinFarmBuff',529,3358,3420,20,80,3000,7000,0,4104,815.759,842.924,-56.5402,5.98651,'5037:0 '),\n+(5053,'ArathiBasinMillBuff',529,3358,3422,20,80,3000,7000,0,8200,810.493,1184,11.9217,5.57811,'5033:0 '),\n+(5054,'ArathiBasinStablesBuff',529,3358,3424,20,80,3000,7000,0,2056,1184.4,1185.75,-56.3632,5.47167,'5027:0 '),\n+(5055,'ArathiBasinBlacksmithBuff',529,3358,3421,20,80,3000,7000,0,32776,989.914,1008.62,-42.6033,2.21464,'5046:0 '),\n+(5056,'ArathiBasinMillUp3',529,3358,3422,20,80,3000,7000,0,0,874.487,1198.33,8.83505,3.90873,'5032:0 5033:0 5057:0 '),\n+(5057,'ArathiBasinMillUp4',529,3358,3422,20,80,3000,7000,0,0,797.429,1127.41,9.63979,0.623809,'5033:0 5034:0 5056:0 '),\n+(5058,'AlteracValleySpawnA',30,2597,2597,50,80,3000,7000,0,3,801.027,-493.883,99.6917,3.08066,'5059:0 '),\n+(5059,'AlteracValleyStartA1',30,2597,3299,50,80,3000,7000,0,2,717.929,-475.351,75.1276,2.10478,'5060:0 5098:0 '),\n+(5060,'AlteracValleyStartA2',30,2597,3299,50,80,3000,7000,0,65538,664.972,-400.377,68.7491,2.43269,'5061:0 5098:0 '),\n+(5061,'AlteracValleyStartA3',30,2597,3299,50,80,3000,7000,0,10,610.827,-388.879,66.5562,3.30843,'5062:0 5060:0 '),\n+(5062,'AlteracValleyStartA4',30,2597,2597,50,80,3000,7000,0,10,463.128,-438.201,33.0107,2.75865,'5063:0 '),\n+(5063,'AlteracValleyHubA1',30,2597,2597,50,80,3000,7000,0,8,401.785,-393.695,-1.05733,2.60355,'5064:0 5103:0 '),\n+(5064,'AlteracValleyBunker2',30,2597,3304,50,80,3000,7000,0,8,221.727,-412.006,41.1425,2.14206,'5065:0 5066:0 5063:0 '),\n+(5065,'AlteracValleyBunker2Inside',30,2597,3304,50,80,3000,7000,0,146,204.453,-359.47,56.3831,2.20687,'5064:0 '),\n+(5066,'AlteracValleyGYA1',30,2597,3302,50,80,3000,7000,0,136,76.8322,-399.172,45.7006,1.69996,'5064:0 5067:0 5068:0 5069:0 5109:0 '),\n+(5067,'AlteracValleyBelinda',30,2597,2958,50,80,3000,7000,0,1042,-36.1268,-290.741,15.0786,3.0354,'5066:0 '),\n+(5068,'AlteracValleyCN',30,2597,2597,50,80,3000,7000,0,8,-63.4528,-374.738,13.4643,2.01653,'5066:0 5071:0 5106:0 5107:0 '),\n+(5069,'AlteracValleyBunker1Inside',30,2597,3305,50,80,3000,7000,0,146,-151.384,-442.049,40.3942,1.08956,'5066:0 '),\n+(5070,'AlteracValleyGYC',30,2597,3301,50,80,3000,7000,0,136,-200.494,-109.396,78.5207,4.95373,'5106:0 5105:0 '),\n+(5071,'AlteracValleyCS1',30,2597,3057,50,80,3000,7000,0,8,-255.035,-296.856,6.68142,5.07206,'5068:0 5072:0 '),\n+(5072,'AlteracValleyCS2',30,2597,3057,50,80,3000,7000,0,8,-473.131,-273.873,24.7318,3.74628,'5071:0 5105:0 5107:0 5108:0 5073:0 '),\n+(5073,'AlteracValleyCS3',30,2597,2597,50,80,3000,7000,0,32,-525.235,-353.849,37.0353,4.37461,'5072:0 5074:0 5110:0 '),\n+(5074,'AlteracValleyCS4',30,2597,2597,50,80,3000,7000,0,8,-601.467,-320.914,51.7167,6.08664,'5075:0 5073:0 '),\n+(5075,'AlteracValleyGYH1',30,2597,2597,50,80,3000,7000,0,136,-615.967,-397.593,60.6924,0.333583,'5074:0 5076:0 5077:0 5078:0 '),\n+(5076,'AlteracValleyTower1Inside',30,2597,2977,50,80,3000,7000,0,148,-569.205,-264.746,75.0088,2.58769,'5075:0 '),\n+(5077,'AlteracValleyGalvangar',30,2597,2977,50,80,3000,7000,0,1044,-536.858,-168.875,57.0098,2.75262,'5075:0 '),\n+(5078,'AlteracValleyTower2',30,2597,2962,50,80,3000,7000,0,8,-715.985,-350.671,66.8321,2.63482,'5075:0 5079:0 5080:0 '),\n+(5079,'AlteracValleyTower2Inside',30,2597,2962,50,80,3000,7000,0,148,-767.615,-361.296,90.8949,4.27041,'5078:0 '),\n+(5080,'AlteracValleyGYH2',30,2597,2597,50,80,3000,7000,0,136,-1083.95,-341.705,55.3047,0.111719,'5078:0 5083:0 5101:0 '),\n+(5081,'AlteracValleyStartH1',30,2597,2597,50,80,3000,7000,0,4,-1144.38,-442.064,56.7427,0.904973,'5080:0 '),\n+(5082,'AlteracValleySpawnH',30,2597,2597,50,80,3000,7000,0,5,-1386.53,-549.064,55.0284,0.628112,'5081:0 '),\n+(5083,'AlteracValleyBaseH1',30,2597,2961,50,80,3000,7000,0,8,-1241.61,-363.466,59.6773,2.10074,'5080:0 5084:0 '),\n+(5084,'AlteracValleyBaseH2',30,2597,2961,50,80,3000,7000,0,8,-1210.4,-252.908,72.7007,3.07856,'5083:0 5085:0 '),\n+(5085,'AlteracValleyBaseH3',30,2597,2978,50,80,3000,7000,0,8,-1286.08,-289.551,89.091,3.10996,'5084:0 5086:0 '),\n+(5086,'AlteracValleyGYH3',30,2597,2978,50,80,3000,7000,0,136,-1404.13,-312.526,89.4075,1.4783,'5085:0 5087:0 5088:0 5089:0 '),\n+(5087,'AlteracValleyTower3Inside',30,2597,2978,50,80,3000,7000,0,148,-1301.34,-267.703,114.151,0.219693,'5086:0 '),\n+(5088,'AlteracValleyTower4Inside',30,2597,2978,50,80,3000,7000,0,148,-1304.35,-313.854,113.867,5.07738,'5086:0 '),\n+(5089,'AlteracValleyDrekthar',30,2597,4407,50,80,3000,7000,0,276,-1367.71,-227.007,98.4255,2.09366,'5086:0 '),\n+(5090,'AlteracValleyGYA2',30,2597,3303,50,80,3000,7000,0,136,664.375,-295.432,30.2906,1.6334,'5091:0 5099:0 5103:0 '),\n+(5091,'AlteracValleyBaseA1',30,2597,2959,50,80,3000,7000,0,8,628.165,-209.132,39.032,1.71587,'5092:0 5090:0 '),\n+(5092,'AlteracValleyGYA3',30,2597,2959,50,80,3000,7000,0,136,635.165,-28.286,46.6157,4.25874,'5091:0 5093:0 5094:0 5095:0 '),\n+(5093,'AlteracValleyBunker3Inside',30,2597,2959,50,80,3000,7000,0,146,672.521,-142.475,63.6551,4.09365,'5092:0 '),\n+(5094,'AlteracValleyBunker4Inside',30,2597,2959,50,80,3000,7000,0,146,555.611,-77.7777,51.9336,1.81992,'5092:0 '),\n+(5095,'AlteracValleyVanndar',30,2597,4408,50,80,3000,7000,0,274,712.208,-13.5129,50.1354,0.288398,'5092:0 '),\n+(5096,'AlteracValleyShortcutA1',30,2597,3303,50,80,3000,7000,0,131074,668.321,-376.13,30.4499,1.65697,'5090:0 '),\n+(5097,'AlteracValleyShortcutH1',30,2597,2597,50,80,3000,7000,0,32,-550.621,-356.862,50.2404,5.33475,'5073:0 '),\n+(5098,'AlteracValleyMineA1',30,2597,2957,50,80,3000,7000,0,65538,774.881,-363.728,78.8805,1.75712,'5099:0 5060:0 '),\n+(5099,'AlteracValleyMineA2',30,2597,2957,50,80,3000,7000,0,131072,776.68,-313.432,54.4907,0.0135369,'5100:0 5090:0 '),\n+(5100,'AlteracValleyMineA3',30,2597,2957,50,80,3000,7000,0,512,870.508,-436.928,51.1438,5.59377,'5099:0 '),\n+(5101,'AlteracValleyMineH1',30,2597,2963,50,80,3000,7000,0,8,-964.106,-216.1,69.4372,0.822477,'5080:0 5102:0 '),\n+(5102,'AlteracValleyMineH2',30,2597,2963,50,80,3000,7000,0,512,-853.987,-98.7783,67.5444,6.16727,'5101:0 '),\n+(5103,'AlteracValleyAuxA1',30,2597,2597,50,80,3000,7000,0,8,517.454,-327.563,-1.03301,0.235552,'5063:0 5090:0 '),\n+(5104,'AlteracValleyIcebloodGY',30,2597,3300,50,80,3000,7000,0,0,-531.167,-405.06,49.5441,2.83719,'5075:0 5097:0 '),\n+(5105,'AlteracValleyGYCS',30,2597,3057,50,80,3000,7000,0,8,-311.905,-130.479,14.734,0.412742,'5070:0 5106:0 5072:0 '),\n+(5106,'AlteracValleyGYCN',30,2597,2597,50,80,3000,7000,0,8,-143.447,-249.084,6.68667,1.83233,'5068:0 5070:0 5105:0 5108:0 5109:0 '),\n+(5107,'AlteracValleyCS5',30,2597,3057,50,80,3000,7000,0,8,-228.16,-372.069,9.52872,3.05359,'5068:0 5110:0 5072:0 '),\n+(5108,'AlteracValleyCS6',30,2597,3057,50,80,3000,7000,0,8,-276.653,-212.64,7.9686,3.4754,'5106:0 5072:0 '),\n+(5109,'AlteracValleyCNE',30,2597,2958,50,80,3000,7000,0,0,72.783,-254.66,17.9217,3.41296,'5066:0 5106:0 '),\n+(5110,'AlteracValleyCS7',30,2597,3057,50,80,3000,7000,0,8,-336.807,-401.764,10.041,0.0278354,'5107:0 5073:0 '),\n+(5111,'EyeOfTheStormSpawnA',566,3820,3820,60,80,3000,7000,0,3,2523.45,1596.62,1269.24,3.03123,'5112:0 5113:0 '),\n+(5112,'EyeOfTheStormSpawnA1',566,3820,3820,60,80,3000,7000,0,65538,2496.81,1612.95,1255.15,2.81918,'5114:0 '),\n+(5113,'EyeOfTheStormSpawnA2',566,3820,3820,60,80,3000,7000,0,65538,2499.13,1579.21,1257.44,3.44945,'5115:0 '),\n+(5114,'EyeOfTheStormStartA1',566,3820,3820,60,80,3000,7000,0,131074,2471.65,1621.06,1215.96,2.97233,'5116:0 '),\n+(5115,'EyeOfTheStormStartA2',566,3820,3820,60,80,3000,7000,0,131074,2473.83,1571,1213.66,3.45534,'5117:0 '),\n+(5116,'EyeOfTheStormStartA3',566,3820,3820,60,80,3000,7000,0,2,2425.5,1615.75,1187.87,0.156239,'5118:0 5119:0 '),\n+(5117,'EyeOfTheStormStartA4',566,3820,3820,60,80,3000,7000,0,2,2417.92,1560.53,1185.04,0.233193,'5119:0 5120:0 '),\n+(5118,'EyeOfTheStormForkNW',566,3820,3869,60,80,3000,7000,0,8,2279.22,1660.34,1165.68,0.589394,'5119:0 5121:0 5136:0 '),\n+(5119,'EyeOfTheStormForkN',566,3820,3820,60,80,3000,7000,0,8,2275.68,1577.95,1165.37,2.88866,'5120:0 5135:0 5144:0 5118:0 5145:0 '),\n+(5120,'EyeOfTheStormForkNE',566,3820,3871,60,80,3000,7000,0,8,2285.71,1469.1,1181.66,5.18595,'5119:0 5122:0 5137:0 '),\n+(5121,'EyeOfTheStormBridgeWN',566,3820,3869,60,80,3000,7000,0,8,2220.37,1754.67,1152.16,4.67543,'5133:0 5136:0 5118:0 '),\n+(5122,'EyeOfTheStormBridgeEN',566,3820,3871,60,80,3000,7000,0,8,2234.95,1402.23,1177.94,3.26368,'5134:0 5120:0 5137:0 '),\n+(5123,'EyeOfTheStormSpawnH',566,3820,3820,60,80,3000,7000,0,5,1807.99,1539.31,1267.53,0.120124,'5124:0 5125:0 '),\n+(5124,'EyeOfTheStormSpawnH1',566,3820,3820,60,80,3000,7000,0,65540,1831.62,1557.48,1255.46,0.46766,'5127:0 '),\n+(5125,'EyeOfTheStormSpawnH2',566,3820,3820,60,80,3000,7000,0,65540,1833.06,1524.15,1255.31,5.93795,'5126:0 '),\n+(5126,'EyeOfTheStormStartH1',566,3820,3820,60,80,3000,7000,0,131076,1856.01,1515.9,1219.47,5.93795,'5128:0 '),\n+(5127,'EyeOfTheStormStartH2',566,3820,3820,60,80,3000,7000,0,131076,1855.89,1566.34,1214.69,0.34985,'5129:0 '),\n+(5128,'EyeOfTheStormStartH3',566,3820,3820,60,80,3000,7000,0,4,1925.07,1519.35,1181.58,0.00431252,'5130:0 5131:0 '),\n+(5129,'EyeOfTheStormStartH4',566,3820,3820,60,80,3000,7000,0,4,1937.55,1593.16,1178.75,3.0124,'5131:0 5132:0 '),\n+(5130,'EyeOfTheStormForkSE',566,3820,3870,60,80,3000,7000,0,8,2059.13,1468.67,1165.76,4.64205,'5131:0 5134:0 5139:0 '),\n+(5131,'EyeOfTheStormForkSC',566,3820,3820,60,80,3000,7000,0,8,2075.02,1548.37,1160.58,0.138568,'5132:0 5135:0 5144:0 5130:0 5146:0 '),\n+(5132,'EyeOfTheStormForkSW',566,3820,3820,60,80,3000,7000,0,8,2047.2,1663.97,1173.93,1.64971,'5131:0 5133:0 5138:0 '),\n+(5133,'EyeOfTheStormBridgeWS',566,3820,3872,60,80,3000,7000,0,8,2099.21,1735.01,1170.54,0.0965541,'5121:0 5132:0 5138:0 '),\n+(5134,'EyeOfTheStormBridgeES',566,3820,3870,60,80,3000,7000,0,8,2110.22,1381.67,1162.48,0.00426722,'5122:0 5139:0 5130:0 '),\n+(5135,'EyeOfTheStormFlagC',566,3820,3820,60,80,3000,7000,0,262280,2174.59,1568.74,1159.96,0.248524,'5119:0 5131:0 '),\n+(5136,'EyeOfTheStormFlagNW',566,3820,3869,60,80,3000,7000,0,72,2284.84,1731,1189.89,1.72509,'5121:0 5140:0 5118:0 '),\n+(5137,'EyeOfTheStormFlagNE',566,3820,3871,60,80,3000,7000,0,72,2286.49,1402.29,1197.1,4.74102,'5120:0 5122:0 5141:0 '),\n+(5138,'EyeOfTheStormFlagSW',566,3820,3872,60,80,3000,7000,0,72,2044.01,1729.74,1189.86,1.56605,'5132:0 5133:0 5142:0 '),\n+(5139,'EyeOfTheStormFlagSE',566,3820,3870,60,80,3000,7000,0,72,2048.47,1393.69,1194.36,4.79796,'5134:0 5143:0 5130:0 '),\n+(5140,'EyeOfTheStormBuffNW',566,3820,3820,60,80,3000,7000,0,2056,2283.56,1748.26,1189.71,3.13137,'5136:0 '),\n+(5141,'EyeOfTheStormBuffNE',566,3820,3820,60,80,3000,7000,0,4104,2302.56,1391.69,1197.79,5.33441,'5137:0 '),\n+(5142,'EyeOfTheStormBuffSW',566,3820,3820,60,80,3000,7000,0,8200,2046.47,1749.34,1190.02,1.65874,'5138:0 '),\n+(5143,'EyeOfTheStormBuffSE',566,3820,3870,60,80,3000,7000,0,16392,2050.3,1372.75,1194.56,4.89851,'5139:0 '),\n+(5144,'EyeOfTheStormFlagCBottom',566,3820,3820,60,80,3000,7000,0,8,2178.98,1538.52,1129.18,1.72942,'5119:0 5131:0 '),\n+(5145,'EyeOfTheStormLockA',566,3820,3820,60,80,3000,7000,0,524,2423.64,1588.87,1188.15,0.101702,'5119:0 '),\n+(5146,'EyeOfTheStormLockH',566,3820,3820,60,80,3000,7000,0,522,1908.01,1542.98,1188.84,3.26882,'5131:0 ');\n+\n+UNLOCK TABLES;\n+\n+/*Table structure for table `creature_template_outfits` */\n+\n+DROP TABLE IF EXISTS `creature_template_outfits`;\n+\n+CREATE TABLE `creature_template_outfits` (\n+  `entry` int unsigned NOT NULL,\n+  `race` tinyint unsigned NOT NULL DEFAULT '1',\n+  `gender` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '0 for male, 1 for female',\n+  `skin` tinyint unsigned NOT NULL DEFAULT '0',\n+  `face` tinyint unsigned NOT NULL DEFAULT '0',\n+  `hair` tinyint unsigned NOT NULL DEFAULT '0',\n+  `haircolor` tinyint unsigned NOT NULL DEFAULT '0',\n+  `facialhair` tinyint unsigned NOT NULL DEFAULT '0',\n+  `head` int unsigned NOT NULL DEFAULT '0',\n+  `shoulders` int unsigned NOT NULL DEFAULT '0',\n+  `body` int unsigned NOT NULL DEFAULT '0',\n+  `chest` int unsigned NOT NULL DEFAULT '0',\n+  `waist` int unsigned NOT NULL DEFAULT '0',\n+  `legs` int unsigned NOT NULL DEFAULT '0',\n+  `feet` int unsigned NOT NULL DEFAULT '0',\n+  `wrists` int unsigned NOT NULL DEFAULT '0',\n+  `hands` int unsigned NOT NULL DEFAULT '0',\n+  `back` int unsigned NOT NULL DEFAULT '0',\n+  `tabard` int unsigned NOT NULL DEFAULT '0',\n+  PRIMARY KEY (`entry`)\n+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;\n+\n+/*Data for the table `creature_template_outfits` */\n+\n+LOCK TABLES `creature_template_outfits` WRITE;\n+\n+INSERT INTO `creature_template_outfits`(`entry`,`race`,`gender`,`skin`,`face`,`hair`,`haircolor`,`facialhair`,`head`,`shoulders`,`body`,`chest`,`waist`,`legs`,`feet`,`wrists`,`hands`,`back`,`tabard`) VALUES\n+(70551,2,0,0,14,9,7,5,0,0,0,0,59194,64674,0,36248,0,0,0),\n+(70552,2,0,0,14,9,7,5,0,0,0,0,59194,64674,0,36248,0,0,0);\n+\n+UNLOCK TABLES;\n\\ No newline at end of file\ndiff --git a/sql/custom/auth/.gitignore b/sql/custom/auth/.gitignore\ndeleted file mode 100644\nindex d1b811b7de..0000000000\n--- a/sql/custom/auth/.gitignore\n+++ /dev/null\n@@ -1 +0,0 @@\n-*.sql\ndiff --git a/sql/custom/auth/npcbot_2021_09_14_00_rbac_permissions.sql b/sql/custom/auth/npcbot_2021_09_14_00_rbac_permissions.sql\nnew file mode 100644\nindex 0000000000..5a9cb73097\n--- /dev/null\n+++ b/sql/custom/auth/npcbot_2021_09_14_00_rbac_permissions.sql\n@@ -0,0 +1,39 @@\n+--\n+SET @PERMISSION_START = 70001;\n+SET @PERMISSION_END   = 70033;\n+\n+DELETE FROM `rbac_permissions` WHERE id BETWEEN @PERMISSION_START AND @PERMISSION_END;\n+INSERT INTO `rbac_permissions` (`id`,`name`) VALUES\n+('70001','Command: npcbot'),\n+('70002','Command: npcbot add'),\n+('70003','Command: npcbot remove'),\n+('70004','Command: npcbot spawn'),\n+('70005','Command: npcbot move'),\n+('70006','Command: npcbot delete'),\n+('70007','Command: npcbot lookup'),\n+('70008','Command: npcbot revive'),\n+('70009','Command: npcbot reloadconfig'),\n+('70010','Command: npcbot info'),\n+('70011','Command: npcbot hide'),\n+('70012','Command: npcbot unhide'),\n+('70013','Command: npcbot recall'),\n+('70014','Command: npcbot kill'),\n+('70015','Command: npcbot debug raid'),\n+('70016','Command: npcbot debug mount'),\n+('70017','Command: npcbot debug spellvisual'),\n+('70018','Command: npcbot debug states'),\n+('70019','Command: npcbot toggle flags'),\n+('70020','Command: npcbot set faction'),\n+('70021','Command: npcbot set owner'),\n+('70022','Command: npcbot set spec'),\n+('70023','Command: npcbot command standstill'),\n+('70024','Command: npcbot command stopfully'),\n+('70025','Command: npcbot command follow'),\n+('70026','Command: npcbot distance attack short'),\n+('70027','Command: npcbot distance attack long'),\n+('70028','Command: npcbot distance attack'),\n+('70029','Command: npcbot distance'),\n+('70030','Command: npcbot order cast'),\n+('70031','Command: npcbot vehicle eject'),\n+('70032','Command: npcbot dump load'),\n+('70033','Command: npcbot dump write');\ndiff --git a/sql/custom/auth/npcbot_2021_09_14_01_rbac_linked_permissions.sql b/sql/custom/auth/npcbot_2021_09_14_01_rbac_linked_permissions.sql\nnew file mode 100644\nindex 0000000000..555828ce0d\n--- /dev/null\n+++ b/sql/custom/auth/npcbot_2021_09_14_01_rbac_linked_permissions.sql\n@@ -0,0 +1,39 @@\n+--\n+SET @PERMISSION_START = 70001;\n+SET @PERMISSION_END   = 70033;\n+\n+DELETE FROM `rbac_linked_permissions` WHERE linkedId BETWEEN @PERMISSION_START AND @PERMISSION_END;\n+INSERT INTO `rbac_linked_permissions` (`id`,`linkedId`) VALUES\n+('199','70001'),\n+('197','70002'),\n+('197','70003'),\n+('197','70004'),\n+('197','70005'),\n+('197','70006'),\n+('197','70007'),\n+('197','70008'),\n+('197','70009'),\n+('199','70010'),\n+('199','70011'),\n+('199','70012'),\n+('199','70013'),\n+('199','70014'),\n+('197','70015'),\n+('197','70016'),\n+('197','70017'),\n+('197','70018'),\n+('197','70019'),\n+('197','70020'),\n+('197','70021'),\n+('197','70022'),\n+('199','70023'),\n+('199','70024'),\n+('199','70025'),\n+('199','70026'),\n+('199','70027'),\n+('199','70028'),\n+('199','70029'),\n+('199','70030'),\n+('199','70031'),\n+('196','70032'),\n+('196','70033');\ndiff --git a/sql/custom/auth/npcbot_2021_12_29_00_rbac_permissions.sql b/sql/custom/auth/npcbot_2021_12_29_00_rbac_permissions.sql\nnew file mode 100644\nindex 0000000000..30491065a6\n--- /dev/null\n+++ b/sql/custom/auth/npcbot_2021_12_29_00_rbac_permissions.sql\n@@ -0,0 +1,7 @@\n+--\n+SET @PERMISSION_START = 70034;\n+SET @PERMISSION_END   = 70034;\n+\n+DELETE FROM `rbac_permissions` WHERE id BETWEEN @PERMISSION_START AND @PERMISSION_END;\n+INSERT INTO `rbac_permissions` (`id`,`name`) VALUES\n+('70034','Command: npcbot spawned');\ndiff --git a/sql/custom/auth/npcbot_2021_12_29_01_rbac_linked_permissions.sql b/sql/custom/auth/npcbot_2021_12_29_01_rbac_linked_permissions.sql\nnew file mode 100644\nindex 0000000000..5b960ef797\n--- /dev/null\n+++ b/sql/custom/auth/npcbot_2021_12_29_01_rbac_linked_permissions.sql\n@@ -0,0 +1,7 @@\n+--\n+SET @PERMISSION_START = 70034;\n+SET @PERMISSION_END   = 70034;\n+\n+DELETE FROM `rbac_linked_permissions` WHERE linkedId BETWEEN @PERMISSION_START AND @PERMISSION_END;\n+INSERT INTO `rbac_linked_permissions` (`id`,`linkedId`) VALUES\n+('196','70034');\ndiff --git a/sql/custom/auth/npcbot_2022_06_24_00_rbac_permissions.sql b/sql/custom/auth/npcbot_2022_06_24_00_rbac_permissions.sql\nnew file mode 100644\nindex 0000000000..916767c49b\n--- /dev/null\n+++ b/sql/custom/auth/npcbot_2022_06_24_00_rbac_permissions.sql\n@@ -0,0 +1,7 @@\n+--\n+SET @PERMISSION_START = 70035;\n+SET @PERMISSION_END   = 70035;\n+\n+DELETE FROM `rbac_permissions` WHERE id BETWEEN @PERMISSION_START AND @PERMISSION_END;\n+INSERT INTO `rbac_permissions` (`id`,`name`) VALUES\n+('70035','Command: npcbot command walk');\ndiff --git a/sql/custom/auth/npcbot_2022_06_24_01_rbac_linked_permissions.sql b/sql/custom/auth/npcbot_2022_06_24_01_rbac_linked_permissions.sql\nnew file mode 100644\nindex 0000000000..a62f6925d7\n--- /dev/null\n+++ b/sql/custom/auth/npcbot_2022_06_24_01_rbac_linked_permissions.sql\n@@ -0,0 +1,7 @@\n+--\n+SET @PERMISSION_START = 70035;\n+SET @PERMISSION_END   = 70035;\n+\n+DELETE FROM `rbac_linked_permissions` WHERE linkedId BETWEEN @PERMISSION_START AND @PERMISSION_END;\n+INSERT INTO `rbac_linked_permissions` (`id`,`linkedId`) VALUES\n+('199','70035');\ndiff --git a/sql/custom/auth/npcbot_2022_07_04_00_rbac_permissions.sql b/sql/custom/auth/npcbot_2022_07_04_00_rbac_permissions.sql\nnew file mode 100644\nindex 0000000000..deac7ed3e2\n--- /dev/null\n+++ b/sql/custom/auth/npcbot_2022_07_04_00_rbac_permissions.sql\n@@ -0,0 +1,7 @@\n+--\n+SET @PERMISSION_START = 70036;\n+SET @PERMISSION_END   = 70036;\n+\n+DELETE FROM `rbac_permissions` WHERE id BETWEEN @PERMISSION_START AND @PERMISSION_END;\n+INSERT INTO `rbac_permissions` (`id`,`name`) VALUES\n+('70036','Command: npcbot createnew');\ndiff --git a/sql/custom/auth/npcbot_2022_07_04_01_rbac_linked_permissions.sql b/sql/custom/auth/npcbot_2022_07_04_01_rbac_linked_permissions.sql\nnew file mode 100644\nindex 0000000000..dac351bef1\n--- /dev/null\n+++ b/sql/custom/auth/npcbot_2022_07_04_01_rbac_linked_permissions.sql\n@@ -0,0 +1,7 @@\n+--\n+SET @PERMISSION_START = 70036;\n+SET @PERMISSION_END   = 70036;\n+\n+DELETE FROM `rbac_linked_permissions` WHERE linkedId BETWEEN @PERMISSION_START AND @PERMISSION_END;\n+INSERT INTO `rbac_linked_permissions` (`id`,`linkedId`) VALUES\n+('196','70036');\ndiff --git a/sql/custom/auth/npcbot_2022_11_30_00_rbac_permissions.sql b/sql/custom/auth/npcbot_2022_11_30_00_rbac_permissions.sql\nnew file mode 100644\nindex 0000000000..9a02a53a5d\n--- /dev/null\n+++ b/sql/custom/auth/npcbot_2022_11_30_00_rbac_permissions.sql\n@@ -0,0 +1,7 @@\n+--\n+SET @PERMISSION_START = 70037;\n+SET @PERMISSION_END   = 70037;\n+\n+DELETE FROM `rbac_permissions` WHERE id BETWEEN @PERMISSION_START AND @PERMISSION_END;\n+INSERT INTO `rbac_permissions` (`id`,`name`) VALUES\n+('70037','Command: npcbot sendto');\ndiff --git a/sql/custom/auth/npcbot_2022_11_30_rbac_linked_permissions.sql b/sql/custom/auth/npcbot_2022_11_30_rbac_linked_permissions.sql\nnew file mode 100644\nindex 0000000000..840f9898f3\n--- /dev/null\n+++ b/sql/custom/auth/npcbot_2022_11_30_rbac_linked_permissions.sql\n@@ -0,0 +1,7 @@\n+--\n+SET @PERMISSION_START = 70037;\n+SET @PERMISSION_END   = 70037;\n+\n+DELETE FROM `rbac_linked_permissions` WHERE linkedId BETWEEN @PERMISSION_START AND @PERMISSION_END;\n+INSERT INTO `rbac_linked_permissions` (`id`,`linkedId`) VALUES\n+('199','70037');\ndiff --git a/sql/custom/auth/npcbot_2023_08_12_00_rbac_linked_permissions.sql b/sql/custom/auth/npcbot_2023_08_12_00_rbac_linked_permissions.sql\nnew file mode 100644\nindex 0000000000..9957ad5577\n--- /dev/null\n+++ b/sql/custom/auth/npcbot_2023_08_12_00_rbac_linked_permissions.sql\n@@ -0,0 +1,2 @@\n+--\n+UPDATE `rbac_linked_permissions` SET `id`='197' WHERE (`id`='196') AND (`linkedId`='70034');\ndiff --git a/sql/custom/characters/.dummy b/sql/custom/characters/.dummy\nnew file mode 100644\nindex 0000000000..e69de29bb2\ndiff --git a/sql/custom/characters/.gitignore b/sql/custom/characters/.gitignore\ndeleted file mode 100644\nindex d1b811b7de..0000000000\n--- a/sql/custom/characters/.gitignore\n+++ /dev/null\n@@ -1 +0,0 @@\n-*.sql\ndiff --git a/sql/custom/world/.gitignore b/sql/custom/world/.gitignore\ndeleted file mode 100644\nindex d1b811b7de..0000000000\n--- a/sql/custom/world/.gitignore\n+++ /dev/null\n@@ -1 +0,0 @@\n-*.sql\ndiff --git a/sql/custom/world/2026_03_28_00_command.sql b/sql/custom/world/2026_03_28_00_command.sql\nnew file mode 100644\nindex 0000000000..a72457e6e7\n--- /dev/null\n+++ b/sql/custom/world/2026_03_28_00_command.sql\n@@ -0,0 +1,2 @@\n+--\n+DELETE FROM `command` WHERE (`name`='npcbot reloadconfig');\ndiff --git a/sql/custom/world/npcbot_2000_00_00_00_command.sql b/sql/custom/world/npcbot_2000_00_00_00_command.sql\nnew file mode 100644\nindex 0000000000..b3d19e5e5d\n--- /dev/null\n+++ b/sql/custom/world/npcbot_2000_00_00_00_command.sql\n@@ -0,0 +1,77 @@\n+--\n+INSERT IGNORE INTO `command`(`name`,`help`) VALUES\n+('npcbot add',NULL),\n+('npcbot command',NULL),\n+('npcbot command follow',NULL),\n+('npcbot command follow only',NULL),\n+('npcbot command nocast',NULL),\n+('npcbot command nogossip',NULL),\n+('npcbot command nolongcast',NULL),\n+('npcbot command rebind',NULL),\n+('npcbot command standstill',NULL),\n+('npcbot command stopfully',NULL),\n+('npcbot command unbind',NULL),\n+('npcbot command walk',NULL),\n+('npcbot createnew',NULL),\n+('npcbot delete',NULL),\n+('npcbot delete free',NULL),\n+('npcbot delete id',NULL),\n+('npcbot distance',NULL),\n+('npcbot distance attack',NULL),\n+('npcbot distance attack long',NULL),\n+('npcbot distance attack short',NULL),\n+('npcbot dump',NULL),\n+('npcbot dump load',NULL),\n+('npcbot dump write',NULL),\n+('npcbot free',NULL),\n+('npcbot go',NULL),\n+('npcbot gs',NULL),\n+('npcbot hide',NULL),\n+('npcbot info',NULL),\n+('npcbot kill',NULL),\n+('npcbot list spawned',NULL),\n+('npcbot list spawned free',NULL),\n+('npcbot log clear',NULL),\n+('npcbot lookup',NULL),\n+('npcbot move',NULL),\n+('npcbot order',NULL),\n+('npcbot order cast',NULL),\n+('npcbot order pull',NULL),\n+('npcbot recall',NULL),\n+('npcbot recall spawns',NULL),\n+('npcbot recall teleport',NULL),\n+('npcbot reloadconfig',NULL),\n+('npcbot remove',NULL),\n+('npcbot revive',NULL),\n+('npcbot sendto',NULL),\n+('npcbot sendto last',NULL),\n+('npcbot sendto point',NULL),\n+('npcbot sendto point set',NULL),\n+('npcbot set',NULL),\n+('npcbot set faction',NULL),\n+('npcbot set owner',NULL),\n+('npcbot set spec',NULL),\n+('npcbot show',NULL),\n+('npcbot spawn',NULL),\n+('npcbot suicide',NULL),\n+('npcbot unhide',NULL),\n+('npcbot useonbot item',NULL),\n+('npcbot useonbot spell',NULL),\n+('npcbot vehicle',NULL),\n+('npcbot vehicle eject',NULL),\n+('npcbot wp add',NULL),\n+('npcbot wp del',NULL),\n+('npcbot wp go',NULL),\n+('npcbot wp info',NULL),\n+('npcbot wp links',NULL),\n+('npcbot wp list',NULL),\n+('npcbot wp list all',NULL),\n+('npcbot wp move',NULL),\n+('npcbot wp setflags',NULL),\n+('npcbot wp setflags z',NULL),\n+('npcbot wp setlevels',NULL),\n+('npcbot wp setlevels z',NULL),\n+('npcbot wp setlinks',NULL),\n+('npcbot wp setname',NULL),\n+('npcbot wp setweights',NULL),\n+('npcbot wp spawnall',NULL);\n\\ No newline at end of file\ndiff --git a/sql/custom/world/npcbot_2000_00_00_00_creature_classlevelstats.sql b/sql/custom/world/npcbot_2000_00_00_00_creature_classlevelstats.sql\nnew file mode 100644\nindex 0000000000..9a4aed17f1\n--- /dev/null\n+++ b/sql/custom/world/npcbot_2000_00_00_00_creature_classlevelstats.sql\n@@ -0,0 +1,609 @@\n+--\n+SET @CLASS_HUNTER  = 3;\n+SET @CLASS_PRIEST  = 5;\n+SET @CLASS_DK      = 6;\n+SET @CLASS_SHAMAN  = 7;\n+SET @CLASS_WARLOCK = 9;\n+SET @CLASS_DRUID   = 11;\n+DELETE FROM `creature_classlevelstats` WHERE `class` IN (@CLASS_HUNTER,@CLASS_PRIEST,@CLASS_DK,@CLASS_SHAMAN,@CLASS_WARLOCK,@CLASS_DRUID) AND `level` BETWEEN '1' AND '100';\n+INSERT INTO `creature_classlevelstats` (`level`,`class`,`basehp0`,`basehp1`,`basehp2`,`basemana`,`basearmor`,`attackpower`,`rangedattackpower`,`damage_base`,`damage_exp1`,`damage_exp2`,`comment`) VALUES\n+('1', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('1', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('1', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('1', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('1', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('1', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('2', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('2', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('2', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('2', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('2', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('2', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('3', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('3', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('3', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('3', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('3', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('3', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('4', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('4', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('4', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('4', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('4', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('4', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('5', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('5', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('5', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('5', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('5', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('5', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('6', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('6', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('6', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('6', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('6', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('6', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('7', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('7', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('7', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('7', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('7', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('7', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('8', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('8', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('8', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('8', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('8', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('8', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('9', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('9', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('9', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('9', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('9', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('9', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('10', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('10', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('10', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('10', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('10', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('10', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('11', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('11', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('11', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('11', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('11', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('11', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('12', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('12', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('12', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('12', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('12', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('12', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('13', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('13', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('13', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('13', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('13', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('13', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('14', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('14', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('14', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('14', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('14', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('14', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('15', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('15', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('15', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('15', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('15', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('15', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('16', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('16', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('16', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('16', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('16', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('16', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('17', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('17', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('17', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('17', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('17', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('17', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('18', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('18', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('18', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('18', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('18', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('18', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('19', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('19', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('19', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('19', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('19', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('19', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('20', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('20', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('20', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('20', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('20', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('20', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('21', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('21', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('21', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('21', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('21', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('21', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('22', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('22', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('22', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('22', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('22', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('22', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('23', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('23', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('23', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('23', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('23', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('23', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('24', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('24', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('24', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('24', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('24', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('24', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('25', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('25', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('25', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('25', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('25', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('25', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('26', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('26', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('26', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('26', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('26', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('26', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('27', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('27', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('27', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('27', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('27', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('27', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('28', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('28', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('28', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('28', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('28', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('28', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('29', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('29', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('29', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('29', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('29', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('29', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('30', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('30', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('30', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('30', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('30', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('30', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('31', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('31', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('31', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('31', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('31', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('31', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('32', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('32', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('32', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('32', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('32', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('32', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('33', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('33', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('33', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('33', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('33', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('33', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('34', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('34', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('34', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('34', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('34', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('34', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('35', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('35', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('35', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('35', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('35', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('35', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('36', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('36', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('36', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('36', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('36', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('36', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('37', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('37', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('37', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('37', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('37', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('37', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('38', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('38', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('38', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('38', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('38', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('38', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('39', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('39', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('39', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('39', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('39', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('39', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('40', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('40', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('40', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('40', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('40', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('40', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('41', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('41', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('41', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('41', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('41', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('41', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('42', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('42', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('42', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('42', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('42', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('42', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('43', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('43', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('43', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('43', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('43', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('43', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('44', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('44', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('44', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('44', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('44', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('44', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('45', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('45', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('45', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('45', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('45', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('45', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('46', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('46', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('46', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('46', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('46', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('46', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('47', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('47', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('47', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('47', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('47', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('47', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('48', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('48', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('48', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('48', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('48', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('48', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('49', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('49', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('49', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('49', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('49', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('49', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('50', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('50', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('50', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('50', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('50', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('50', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('51', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('51', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('51', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('51', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('51', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('51', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('52', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('52', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('52', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('52', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('52', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('52', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('53', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('53', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('53', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('53', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('53', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('53', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('54', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('54', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('54', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('54', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('54', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('54', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('55', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('55', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('55', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('55', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('55', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('55', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('56', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('56', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('56', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('56', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('56', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('56', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('57', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('57', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('57', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('57', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('57', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('57', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('58', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('58', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('58', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('58', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('58', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('58', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('59', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('59', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('59', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('59', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('59', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('59', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('60', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('60', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('60', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('60', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('60', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('60', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('61', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('61', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('61', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('61', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('61', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('61', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('62', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('62', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('62', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('62', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('62', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('62', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('63', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('63', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('63', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('63', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('63', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('63', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('64', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('64', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('64', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('64', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('64', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('64', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('65', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('65', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('65', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('65', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('65', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('65', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('66', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('66', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('66', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('66', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('66', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('66', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('67', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('67', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('67', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('67', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('67', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('67', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('68', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('68', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('68', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('68', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('68', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('68', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('69', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('69', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('69', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('69', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('69', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('69', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('70', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('70', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('70', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('70', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('70', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('70', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('71', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('71', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('71', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('71', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('71', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('71', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('72', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('72', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('72', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('72', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('72', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('72', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('73', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('73', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('73', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('73', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('73', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('73', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('74', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('74', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('74', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('74', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('74', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('74', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('75', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('75', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('75', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('75', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('75', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('75', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('76', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('76', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('76', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('76', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('76', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('76', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('77', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('77', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('77', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('77', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('77', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('77', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('78', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('78', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('78', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('78', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('78', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('78', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('79', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('79', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('79', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('79', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('79', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('79', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('80', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('80', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('80', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('80', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('80', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('80', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('81', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('81', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('81', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('81', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('81', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('81', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('82', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('82', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('82', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('82', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('82', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('82', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('83', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('83', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('83', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('83', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('83', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('83', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('84', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('84', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('84', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('84', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('84', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('84', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('85', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('85', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('85', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('85', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('85', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('85', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('86', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('86', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('86', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('86', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('86', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('86', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('87', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('87', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('87', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('87', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('87', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('87', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('88', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('88', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('88', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('88', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('88', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('88', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('89', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('89', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('89', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('89', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('89', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('89', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('90', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('90', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('90', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('90', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('90', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('90', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('91', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('91', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('91', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('91', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('91', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('91', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('92', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('92', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('92', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('92', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('92', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('92', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('93', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('93', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('93', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('93', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('93', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('93', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('94', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('94', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('94', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('94', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('94', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('94', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('95', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('95', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('95', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('95', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('95', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('95', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('96', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('96', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('96', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('96', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('96', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('96', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('97', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('97', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('97', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('97', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('97', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('97', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('98', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('98', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('98', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('98', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('98', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('98', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('99', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('99', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('99', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('99', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('99', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('99', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('100', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('100', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('100', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('100', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('100', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n+('100', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL);\n\\ No newline at end of file\ndiff --git a/sql/custom/world/npcbot_2000_00_00_00_creature_equip_template.sql b/sql/custom/world/npcbot_2000_00_00_00_creature_equip_template.sql\nnew file mode 100644\nindex 0000000000..e0e7049d2c\n--- /dev/null\n+++ b/sql/custom/world/npcbot_2000_00_00_00_creature_equip_template.sql\n@@ -0,0 +1,323 @@\n+--\n+DELETE FROM `creature_equip_template` WHERE `CreatureID` IN (70001,70002,70003,70004,70005,70006,70007,70008,70009,70010,70011,70012,70013,70014,70015,70016,70017,70018,70019,70020,70021,70022,70023,70024,70025,70026,70027,70028,70029,70030,70031,70032,70033,70034,70035,70036,70037,70038,70051,70052,70053,70054,70055,70056,70057,70058,70059,70060,70061,70062,70063,70064,70065,70066,70067,70068,70069,70070,70071,70072,70073,70074,70101,70102,70103,70104,70105,70106,70107,70108,70109,70110,70111,70112,70113,70114,70115,70116,70117,70118,70119,70120,70121,70122,70123,70124,70125,70126,70127,70128,70129,70130,70131,70132,70133,70134,70135,70136,70137,70138,70139,70151,70152,70153,70154,70155,70156,70157,70158,70159,70160,70161,70162,70163,70164,70165,70166,70167,70168,70169,70170,70171,70172,70173,70174,70175,70176,70177,70178,70179,70180,70181,70201,70202,70203,70204,70205,70206,70207,70208,70209,70210,70211,70212,70213,70214,70215,70216,70217,70218,70219,70220,70221,70222,70223,70224,70225,70226,70227,70228,70229,70230,70231,70232,70233,70234,70235,70236,70237,70238,70239,70240,70251,70252,70253,70254,70255,70256,70257,70258,70259,70260,70261,70265,70267,70268,70301,70302,70303,70304,70305,70306,70307,70308,70309,70310,70311,70312,70313,70314,70315,70316,70317,70318,70319,70320,70321,70322,70323,70324,70325,70326,70327,70328,70329,70330,70331,70332,70333,70334,70335,70336,70351,70352,70353,70354,70355,70356,70357,70358,70359,70360,70361,70362,70363,70364,70365,70366,70367,70368,70369,70370,70371,70372,70373,70374,70375,70376,70377,70401,70402,70403,70404,70405,70406,70407,70408,70409,70410,70411,70412,70413,70414,70415,70416,70417,70418,70451,70452,70453,70454,70455,70456,70457,70458,70459,70460,70461,70462,70463,70464,70465,70551,70552,70553,70554,70555,70557,70558,70559,70560,70561,70563,70564,70565,70566,70567,70568,70569,70570,70571,70572,70573,70574,70575,70576,70577,70578,70579,70580,70581,70582,70583,70584,70585,70587,70588,70589,70590,70591);\n+INSERT INTO `creature_equip_template` (`CreatureID`,`ID`,`ItemID1`,`ItemID2`,`ItemID3`,`VerifiedBuild`) VALUES\n+(70001,1,2497,0,0,-1),\n+(70002,1,2483,0,0,-1),\n+(70003,1,2497,0,0,-1),\n+(70004,1,2483,0,0,-1),\n+(70005,1,2483,0,0,-1),\n+(70006,1,2483,0,0,-1),\n+(70007,1,2483,0,0,-1),\n+(70008,1,2497,0,0,-1),\n+(70009,1,2497,0,0,-1),\n+(70010,1,2361,0,0,-1),\n+(70011,1,2361,0,0,-1),\n+(70012,1,2361,0,0,-1),\n+(70013,1,2361,0,0,-1),\n+(70014,1,2361,0,0,-1),\n+(70015,1,2483,0,0,-1),\n+(70016,1,2483,0,0,-1),\n+(70017,1,2483,0,0,-1),\n+(70018,1,2483,0,0,-1),\n+(70019,1,2497,0,0,-1),\n+(70020,1,2497,0,0,-1),\n+(70021,1,2497,0,0,-1),\n+(70022,1,2497,0,0,-1),\n+(70023,1,2497,0,0,-1),\n+(70024,1,2497,0,0,-1),\n+(70025,1,2497,0,0,-1),\n+(70026,1,2497,0,0,-1),\n+(70027,1,2483,0,0,-1),\n+(70028,1,2497,0,0,-1),\n+(70029,1,2497,0,0,-1),\n+(70030,1,2497,0,0,-1),\n+(70031,1,2497,0,0,-1),\n+(70032,1,2497,0,0,-1),\n+(70033,1,2497,0,0,-1),\n+(70034,1,2497,0,0,-1),\n+(70035,1,2497,0,0,-1),\n+(70036,1,2497,0,0,-1),\n+(70037,1,2497,0,0,-1),\n+(70038,1,2497,0,0,-1),\n+(70051,1,2488,7188,0,-1),\n+(70052,1,2488,7188,0,-1),\n+(70053,1,2488,7188,0,-1),\n+(70054,1,2488,7188,0,-1),\n+(70055,1,2488,7188,0,-1),\n+(70056,1,2488,7188,0,-1),\n+(70057,1,2488,7188,0,-1),\n+(70058,1,2488,7188,0,-1),\n+(70059,1,2488,7188,0,-1),\n+(70060,1,2488,7188,0,-1),\n+(70061,1,2488,7188,0,-1),\n+(70062,1,2488,20841,0,-1),\n+(70063,1,2488,20841,0,-1),\n+(70064,1,2488,7188,0,-1),\n+(70065,1,2488,20841,0,-1),\n+(70066,1,2488,20841,0,-1),\n+(70067,1,2488,20841,0,-1),\n+(70068,1,2488,7188,0,-1),\n+(70069,1,2488,7188,0,-1),\n+(70070,1,2488,7188,0,-1),\n+(70071,1,2488,7188,0,-1),\n+(70072,1,2488,20841,0,-1),\n+(70073,1,2488,20841,0,-1),\n+(70074,1,2488,7188,0,-1),\n+(70101,1,12282,0,2506,-1),\n+(70102,1,12282,0,2506,-1),\n+(70103,1,12282,0,2506,-1),\n+(70104,1,12282,0,2506,-1),\n+(70105,1,12282,0,2506,-1),\n+(70106,1,12282,0,2506,-1),\n+(70107,1,12282,0,2506,-1),\n+(70108,1,12282,0,2506,-1),\n+(70109,1,12282,0,2506,-1),\n+(70110,1,12282,0,2506,-1),\n+(70111,1,12282,0,2506,-1),\n+(70112,1,12282,0,2506,-1),\n+(70113,1,12282,0,2506,-1),\n+(70114,1,12282,0,2506,-1),\n+(70115,1,12282,0,2506,-1),\n+(70116,1,12282,0,2506,-1),\n+(70117,1,12282,0,2506,-1),\n+(70118,1,12282,0,2506,-1),\n+(70119,1,12282,0,2506,-1),\n+(70120,1,12282,0,2506,-1),\n+(70121,1,12282,0,2506,-1),\n+(70122,1,12282,0,2506,-1),\n+(70123,1,12282,0,2506,-1),\n+(70124,1,12282,0,2506,-1),\n+(70125,1,12282,0,2506,-1),\n+(70126,1,12282,0,2506,-1),\n+(70127,1,12282,0,2506,-1),\n+(70128,1,12282,0,2506,-1),\n+(70129,1,12282,0,2506,-1),\n+(70130,1,12282,0,2506,-1),\n+(70131,1,12282,0,2506,-1),\n+(70132,1,12282,0,2506,-1),\n+(70133,1,12282,0,2506,-1),\n+(70134,1,12282,0,2506,-1),\n+(70135,1,12282,0,2506,-1),\n+(70136,1,12282,0,2506,-1),\n+(70137,1,12282,0,2506,-1),\n+(70138,1,12282,0,2506,-1),\n+(70139,1,12282,0,2506,-1),\n+(70151,1,2092,3296,25873,-1),\n+(70152,1,2131,2484,25873,-1),\n+(70153,1,2092,3296,25873,-1),\n+(70154,1,2131,2484,25873,-1),\n+(70155,1,2092,3296,25873,-1),\n+(70156,1,2131,2484,25873,-1),\n+(70157,1,2092,3296,25873,-1),\n+(70158,1,2131,2484,25873,-1),\n+(70159,1,2092,3296,25873,-1),\n+(70160,1,2131,2484,25873,-1),\n+(70161,1,2092,3296,25873,-1),\n+(70162,1,2131,2484,25873,-1),\n+(70163,1,2092,3296,25873,-1),\n+(70164,1,2131,2484,25873,-1),\n+(70165,1,2092,3296,25873,-1),\n+(70166,1,2131,2484,25873,-1),\n+(70167,1,2092,3296,25873,-1),\n+(70168,1,2131,2484,25873,-1),\n+(70169,1,2092,3296,25873,-1),\n+(70170,1,2131,2484,25873,-1),\n+(70171,1,2092,3296,25873,-1),\n+(70172,1,2131,2484,25873,-1),\n+(70173,1,2092,3296,25873,-1),\n+(70174,1,2131,2484,25873,-1),\n+(70175,1,2092,3296,25873,-1),\n+(70176,1,2131,2484,25873,-1),\n+(70177,1,2092,3296,25873,-1),\n+(70178,1,2131,2484,25873,-1),\n+(70179,1,2092,3296,25873,-1),\n+(70180,1,2131,2484,25873,-1),\n+(70181,1,2092,3296,25873,-1),\n+(70201,1,1388,0,0,-1),\n+(70202,1,1388,0,0,-1),\n+(70203,1,1388,0,0,-1),\n+(70204,1,1388,0,0,-1),\n+(70205,1,1388,0,0,-1),\n+(70206,1,1388,0,0,-1),\n+(70207,1,1388,0,0,-1),\n+(70208,1,1388,0,0,-1),\n+(70209,1,1388,0,0,-1),\n+(70210,1,1388,0,0,-1),\n+(70211,1,1388,0,0,-1),\n+(70212,1,1388,0,0,-1),\n+(70213,1,1388,0,0,-1),\n+(70214,1,1388,0,0,-1),\n+(70215,1,1388,0,0,-1),\n+(70216,1,1388,0,0,-1),\n+(70217,1,1388,0,0,-1),\n+(70218,1,1388,0,0,-1),\n+(70219,1,1388,0,0,-1),\n+(70220,1,1388,0,0,-1),\n+(70221,1,1388,0,0,-1),\n+(70222,1,1388,0,0,-1),\n+(70223,1,1388,0,0,-1),\n+(70224,1,1388,0,0,-1),\n+(70225,1,1388,0,0,-1),\n+(70226,1,1388,0,0,-1),\n+(70227,1,1388,0,0,-1),\n+(70228,1,1388,0,0,-1),\n+(70229,1,1388,0,0,-1),\n+(70230,1,1388,0,0,-1),\n+(70231,1,1388,0,0,-1),\n+(70232,1,1388,0,0,-1),\n+(70233,1,1388,0,0,-1),\n+(70234,1,1388,0,0,-1),\n+(70235,1,1388,0,0,-1),\n+(70236,1,1388,0,0,-1),\n+(70237,1,1388,0,0,-1),\n+(70238,1,1388,0,0,-1),\n+(70239,1,1388,0,0,-1),\n+(70240,1,1388,0,0,-1),\n+(70251,1,15903,0,0,-1),\n+(70252,1,15903,0,0,-1),\n+(70253,1,15903,0,0,-1),\n+(70254,1,15903,0,0,-1),\n+(70255,1,15903,0,0,-1),\n+(70256,1,15903,0,0,-1),\n+(70257,1,15903,0,0,-1),\n+(70258,1,15903,0,0,-1),\n+(70259,1,15903,0,0,-1),\n+(70260,1,15903,0,0,-1),\n+(70261,1,15903,0,0,-1),\n+(70265,1,15903,0,0,-1),\n+(70267,1,15903,0,0,-1),\n+(70268,1,15903,0,0,-1),\n+(70301,1,2132,0,0,-1),\n+(70302,1,2132,0,0,-1),\n+(70303,1,2132,0,0,-1),\n+(70304,1,2132,0,0,-1),\n+(70305,1,2132,0,0,-1),\n+(70306,1,2132,0,0,-1),\n+(70307,1,2132,0,0,-1),\n+(70308,1,2132,0,0,-1),\n+(70309,1,2132,0,0,-1),\n+(70310,1,2132,0,0,-1),\n+(70311,1,2132,0,0,-1),\n+(70312,1,2132,0,0,-1),\n+(70313,1,2132,0,0,-1),\n+(70314,1,2132,0,0,-1),\n+(70315,1,2132,0,0,-1),\n+(70316,1,2132,0,0,-1),\n+(70317,1,2132,0,0,-1),\n+(70318,1,2132,0,0,-1),\n+(70319,1,2132,0,0,-1),\n+(70320,1,2132,0,0,-1),\n+(70321,1,2132,0,0,-1),\n+(70322,1,2132,0,0,-1),\n+(70323,1,2132,0,0,-1),\n+(70324,1,2132,0,0,-1),\n+(70325,1,2132,0,0,-1),\n+(70326,1,2132,0,0,-1),\n+(70327,1,2132,0,0,-1),\n+(70328,1,2132,0,0,-1),\n+(70329,1,2132,0,0,-1),\n+(70330,1,2132,0,0,-1),\n+(70331,1,2132,0,0,-1),\n+(70332,1,2132,0,0,-1),\n+(70333,1,2132,0,0,-1),\n+(70334,1,2132,0,0,-1),\n+(70335,1,2132,0,0,-1),\n+(70336,1,2132,0,0,-1),\n+(70351,1,3661,0,0,-1),\n+(70352,1,3661,0,0,-1),\n+(70353,1,3661,0,0,-1),\n+(70354,1,3661,0,0,-1),\n+(70355,1,3661,0,0,-1),\n+(70356,1,3661,0,0,-1),\n+(70357,1,3661,0,0,-1),\n+(70358,1,3661,0,0,-1),\n+(70359,1,3661,0,0,-1),\n+(70360,1,3661,0,0,-1),\n+(70361,1,3661,0,0,-1),\n+(70362,1,3661,0,0,-1),\n+(70363,1,3661,0,0,-1),\n+(70364,1,3661,0,0,-1),\n+(70365,1,3661,0,0,-1),\n+(70366,1,3661,0,0,-1),\n+(70367,1,3661,0,0,-1),\n+(70368,1,3661,0,0,-1),\n+(70369,1,3661,0,0,-1),\n+(70370,1,3661,0,0,-1),\n+(70371,1,3661,0,0,-1),\n+(70372,1,3661,0,0,-1),\n+(70373,1,3661,0,0,-1),\n+(70374,1,3661,0,0,-1),\n+(70375,1,3661,0,0,-1),\n+(70376,1,3661,0,0,-1),\n+(70377,1,3661,0,0,-1),\n+(70401,1,3327,0,0,-1),\n+(70402,1,3327,0,0,-1),\n+(70403,1,3327,0,0,-1),\n+(70404,1,3327,0,0,-1),\n+(70405,1,3327,0,0,-1),\n+(70406,1,3327,0,0,-1),\n+(70407,1,3327,0,0,-1),\n+(70408,1,3327,0,0,-1),\n+(70409,1,3327,0,0,-1),\n+(70410,1,3327,0,0,-1),\n+(70411,1,3327,0,0,-1),\n+(70412,1,3327,0,0,-1),\n+(70413,1,3327,0,0,-1),\n+(70414,1,3327,0,0,-1),\n+(70415,1,3327,0,0,-1),\n+(70416,1,3327,0,0,-1),\n+(70417,1,3327,0,0,-1),\n+(70418,1,3327,0,0,-1),\n+(70451,1,38633,0,0,-1),\n+(70452,1,38633,0,0,-1),\n+(70453,1,38633,0,0,-1),\n+(70454,1,38633,0,0,-1),\n+(70455,1,38633,0,0,-1),\n+(70456,1,38633,0,0,-1),\n+(70457,1,38633,0,0,-1),\n+(70458,1,38633,0,0,-1),\n+(70459,1,38633,0,0,-1),\n+(70460,1,38633,0,0,-1),\n+(70461,1,38633,0,0,-1),\n+(70462,1,38633,0,0,-1),\n+(70463,1,38633,0,0,-1),\n+(70464,1,38633,0,0,-1),\n+(70465,1,38633,0,0,-1),\n+(70551,1,24044,0,0,-1),\n+(70552,1,24044,0,0,-1),\n+(70553,1,5208,5208,0,-1),\n+(70554,1,5208,5208,0,-1),\n+(70555,1,25917,0,0,-1),\n+(70557,1,0,0,0,-1),\n+(70558,1,0,0,0,-1),\n+(70559,1,0,0,0,-1),\n+(70560,1,0,0,0,-1),\n+(70561,1,0,0,0,-1),\n+(70563,1,0,0,0,-1),\n+(70564,1,0,0,0,-1),\n+(70565,1,0,0,0,-1),\n+(70566,1,0,0,0,-1),\n+(70567,1,0,0,0,-1),\n+(70568,1,20849,0,34529,-1),\n+(70569,1,20849,0,34529,-1),\n+(70570,1,20849,0,34529,-1),\n+(70571,1,20849,0,34529,-1),\n+(70572,1,20849,0,34529,-1),\n+(70573,1,3935,15648,0,-1),\n+(70574,1,3935,15648,0,-1),\n+(70575,1,13937,0,0,-1),\n+(70576,1,13937,0,0,-1),\n+(70577,1,13937,0,0,-1),\n+(70578,1,13937,0,0,-1),\n+(70579,1,13937,0,0,-1),\n+(70580,1,3935,15648,0,-1),\n+(70581,1,20852,20852,17069,-1),\n+(70582,1,20852,20852,17069,-1),\n+(70583,1,20852,20852,17069,-1),\n+(70584,1,20852,20852,17069,-1),\n+(70585,1,20852,20852,17069,-1),\n+(70587,1,0,0,0,-1),\n+(70588,1,0,0,0,-1),\n+(70589,1,0,0,0,-1),\n+(70590,1,0,0,0,-1),\n+(70591,1,0,0,0,-1);\n\\ No newline at end of file\ndiff --git a/sql/custom/world/npcbot_2000_00_00_00_creature_template.sql b/sql/custom/world/npcbot_2000_00_00_00_creature_template.sql\nnew file mode 100644\nindex 0000000000..24356690de\n--- /dev/null\n+++ b/sql/custom/world/npcbot_2000_00_00_00_creature_template.sql\n@@ -0,0 +1,373 @@\n+--\n+DELETE FROM `creature_template` WHERE `entry` IN (70000,70001,70002,70003,70004,70005,70006,70007,70008,70009,70010,70011,70012,70013,70014,70015,70016,70017,70018,70019,70020,70021,70022,70023,70024,70025,70026,70027,70028,70029,70030,70031,70032,70033,70034,70035,70036,70037,70038,70051,70052,70053,70054,70055,70056,70057,70058,70059,70060,70061,70062,70063,70064,70065,70066,70067,70068,70069,70070,70071,70072,70073,70074,70101,70102,70103,70104,70105,70106,70107,70108,70109,70110,70111,70112,70113,70114,70115,70116,70117,70118,70119,70120,70121,70122,70123,70124,70125,70126,70127,70128,70129,70130,70131,70132,70133,70134,70135,70136,70137,70138,70139,70151,70152,70153,70154,70155,70156,70157,70158,70159,70160,70161,70162,70163,70164,70165,70166,70167,70168,70169,70170,70171,70172,70173,70174,70175,70176,70177,70178,70179,70180,70181,70201,70202,70203,70204,70205,70206,70207,70208,70209,70210,70211,70212,70213,70214,70215,70216,70217,70218,70219,70220,70221,70222,70223,70224,70225,70226,70227,70228,70229,70230,70231,70232,70233,70234,70235,70236,70237,70238,70239,70240,70251,70252,70253,70254,70255,70256,70257,70258,70259,70260,70261,70265,70267,70268,70301,70302,70303,70304,70305,70306,70307,70308,70309,70310,70311,70312,70313,70314,70315,70316,70317,70318,70319,70320,70321,70322,70323,70324,70325,70326,70327,70328,70329,70330,70331,70332,70333,70334,70335,70336,70351,70352,70353,70354,70355,70356,70357,70358,70359,70360,70361,70362,70363,70364,70365,70366,70367,70368,70369,70370,70371,70372,70373,70374,70375,70376,70377,70401,70402,70403,70404,70405,70406,70407,70408,70409,70410,70411,70412,70413,70414,70415,70416,70417,70418,70451,70452,70453,70454,70455,70456,70457,70458,70459,70460,70461,70462,70463,70464,70465,70501,70502,70503,70504,70505,70506,70507,70508,70509,70510,70511,70512,70513,70514,70515,70516,70517,70518,70519,70520,70521,70522,70523,70524,70525,70526,70527,70528,70529,70530,70531,70532,70533,70534,70535,70536,70537,70538,70542,70543,70544,70545,70551,70552,70553,70554,70555,70556,70557,70558,70559,70560,70561,70562,70563,70564,70565,70566,70567,70568,70569,70570,70571,70572,70573,70574,70575,70576,70577,70578,70579,70580,70581,70582,70583,70584,70585,70586,70587,70588,70589,70590,70591,70592,70593,70594,70595);\n+INSERT INTO `creature_template` (`entry`,`difficulty_entry_1`,`difficulty_entry_2`,`difficulty_entry_3`,`KillCredit1`,`KillCredit2`,`modelid1`,`modelid2`,`modelid3`,`modelid4`,`name`,`subname`,`IconName`,`gossip_menu_id`,`minlevel`,`maxlevel`,`exp`,`faction`,`npcflag`,`speed_walk`,`speed_run`,`scale`,`rank`,`dmgschool`,`BaseAttackTime`,`RangeAttackTime`,`BaseVariance`,`RangeVariance`,`unit_class`,`unit_flags`,`unit_flags2`,`dynamicflags`,`family`,`type`,`type_flags`,`lootid`,`pickpocketloot`,`skinloot`,`PetSpellDataId`,`VehicleId`,`mingold`,`maxgold`,`AIName`,`MovementType`,`HoverHeight`,`HealthModifier`,`ManaModifier`,`ArmorModifier`,`DamageModifier`,`ExperienceModifier`,`RacialLeader`,`movementId`,`RegenHealth`,`mechanic_immune_mask`,`spell_school_immune_mask`,`flags_extra`,`ScriptName`,`StringId`,`VerifiedBuild`) VALUES\n+(70000,0,0,0,0,0,27541,0,0,0,'Lagretta','Bots for hire','',0,83,83,2,35,1,1.4,1.14286,0.7,4,0,0,0,1,1,1,33088,2048,0,0,0,0,0,0,0,0,0,0,0,'',0,1,4.8,1,1,1,1,0,0,1,0,0,0,'script_bot_giver',NULL,-1),\n+(70001,0,0,0,0,0,3343,0,0,0,'Llane','Warrior Bot','',0,80,80,2,35,1,1,1,1,0,0,3400,2000,1,1,1,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'warrior_bot',NULL,-1),\n+(70002,0,0,0,0,0,3399,0,0,0,'Thran','Warrior Bot','',0,80,80,2,35,1,1,1,1,0,0,3400,2000,1,1,1,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'warrior_bot',NULL,-1),\n+(70003,0,0,0,0,0,1300,0,0,0,'Lyria','Warrior Bot','',0,80,80,2,35,1,1,1,1,0,0,3400,2000,1,1,1,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'warrior_bot',NULL,-1),\n+(70004,0,0,0,0,0,3431,0,0,0,'Ander','Warrior Bot','',0,80,80,2,35,1,1,1,1,0,0,3400,2000,1,1,1,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'warrior_bot',NULL,-1),\n+(70005,0,0,0,0,0,4556,0,0,0,'Malosh','Warrior Bot','',0,80,80,2,35,1,1,1,1,0,0,3400,2000,1,1,1,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'warrior_bot',NULL,-1),\n+(70006,0,0,0,0,0,3431,0,0,0,'Granis','Warrior Bot','',0,80,80,2,35,1,1,1,1,0,0,3400,2000,1,1,1,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'warrior_bot',NULL,-1),\n+(70007,0,0,0,0,0,3053,0,0,0,'Kelstrum','Warrior Bot','',0,80,80,2,35,1,1,1,1,0,0,3400,2000,1,1,1,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'warrior_bot',NULL,-1),\n+(70008,0,0,0,0,0,1578,0,0,0,'Dannal','Warrior Bot','',0,80,80,2,35,1,1,1,1,0,0,3400,2000,1,1,1,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'warrior_bot',NULL,-1),\n+(70009,0,0,0,0,0,1599,0,0,0,'Austil','Warrior Bot','',0,80,80,2,35,1,1,1,1,0,0,3400,2000,1,1,1,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'warrior_bot',NULL,-1),\n+(70010,0,0,0,0,0,2103,0,0,0,'Torm','Warrior Bot','',0,80,80,2,35,1,1,1,1,0,0,3400,2000,1,1,1,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'warrior_bot',NULL,-1),\n+(70011,0,0,0,0,0,2096,0,0,0,'Sark','Warrior Bot','',0,80,80,2,35,1,1,1,1,0,0,3400,2000,1,1,1,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'warrior_bot',NULL,-1),\n+(70012,0,0,0,0,0,2113,0,0,0,'Ker','Warrior Bot','',0,80,80,2,35,1,1,1,1,0,0,3400,2000,1,1,1,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'warrior_bot',NULL,-1),\n+(70013,0,0,0,0,0,3793,0,0,0,'Harutt','Warrior Bot','',0,80,80,2,35,1,1,1,1,0,0,3400,2000,1,1,1,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'warrior_bot',NULL,-1),\n+(70014,0,0,0,0,0,3794,0,0,0,'Krang','Warrior Bot','',0,80,80,2,35,1,1,1,1,0,0,3400,2000,1,1,1,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'warrior_bot',NULL,-1),\n+(70015,0,0,0,0,0,1880,0,0,0,'Frang','Warrior Bot','',0,80,80,2,35,1,1,1,1,0,0,3400,2000,1,1,1,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'warrior_bot',NULL,-1),\n+(70016,0,0,0,0,0,3743,0,0,0,'Tarshaw','Warrior Bot','',0,80,80,2,35,1,1,1,1,0,0,3400,2000,1,1,1,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'warrior_bot',NULL,-1),\n+(70017,0,0,0,0,0,1374,0,0,0,'Grezz','Warrior Bot','',0,80,80,2,35,1,1,1,1,0,0,3400,2000,1,1,1,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'warrior_bot',NULL,-1),\n+(70018,0,0,0,0,0,1375,0,0,0,'Sorek','Warrior Bot','',0,80,80,2,35,1,1,1,1,0,0,3400,2000,1,1,1,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'warrior_bot',NULL,-1),\n+(70019,0,0,0,0,0,4242,0,0,0,'Zel\\'mak','Warrior Bot','',0,80,80,2,35,1,1,1,1,0,0,3400,2000,1,1,1,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'warrior_bot',NULL,-1),\n+(70020,0,0,0,0,0,1721,0,0,0,'Alyissia','Warrior Bot','',0,80,80,2,35,1,1,1,1,0,0,3400,2000,1,1,1,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'warrior_bot',NULL,-1),\n+(70021,0,0,0,0,0,1707,0,0,0,'Kyra','Warrior Bot','',0,80,80,2,35,1,1,1,1,0,0,3400,2000,1,1,1,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'warrior_bot',NULL,-1),\n+(70022,0,0,0,0,0,2196,0,0,0,'Arias\\'ta','Warrior Bot','',0,80,80,2,35,1,1,1,1,0,0,3400,2000,1,1,1,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'warrior_bot',NULL,-1),\n+(70023,0,0,0,0,0,2198,0,0,0,'Sildanair','Warrior Bot','',0,80,80,2,35,1,1,1,1,0,0,3400,2000,1,1,1,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'warrior_bot',NULL,-1),\n+(70024,0,0,0,0,0,2620,0,0,0,'Chris','Warrior Bot','',0,80,80,2,35,1,1,1,1,0,0,3400,2000,1,1,1,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'warrior_bot',NULL,-1),\n+(70025,0,0,0,0,0,2658,0,0,0,'Angela','Warrior Bot','',0,80,80,2,35,1,1,1,1,0,0,3400,2000,1,1,1,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'warrior_bot',NULL,-1),\n+(70026,0,0,0,0,0,2614,0,0,0,'Baltus','Warrior Bot','',0,80,80,2,35,1,1,1,1,0,0,3400,2000,1,1,1,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'warrior_bot',NULL,-1),\n+(70027,0,0,0,0,0,3054,0,0,0,'Kelv','Warrior Bot','',0,80,80,2,35,1,1,1,1,0,0,3400,2000,1,1,1,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'warrior_bot',NULL,-1),\n+(70028,0,0,0,0,0,3055,0,0,0,'Bilban','Warrior Bot','',0,80,80,2,35,1,1,1,1,0,0,3400,2000,1,1,1,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'warrior_bot',NULL,-1),\n+(70029,0,0,0,0,0,3280,0,0,0,'Wu','Warrior Bot','',0,80,80,2,35,1,1,1,1,0,0,3400,2000,1,1,1,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'warrior_bot',NULL,-1),\n+(70030,0,0,0,0,0,3287,0,0,0,'Ilsa','Warrior Bot','',0,80,80,2,35,1,1,1,1,0,0,3400,2000,1,1,1,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'warrior_bot',NULL,-1),\n+(70031,0,0,0,0,0,6071,0,0,0,'Darnath','Warrior Bot','',0,80,80,2,35,1,1,1,1,0,0,3400,2000,1,1,1,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'warrior_bot',NULL,-1),\n+(70032,0,0,0,0,0,11037,0,0,0,'Evencane','Warrior Bot','',0,80,80,2,35,1,1,1,1,0,0,3400,2000,1,1,1,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'warrior_bot',NULL,-1),\n+(70033,0,0,0,0,0,16226,0,0,0,'Kore','Warrior Bot','',0,80,80,2,35,1,1,1,1,0,0,3400,2000,1,1,1,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'warrior_bot',NULL,-1),\n+(70034,0,0,0,0,0,17212,0,0,0,'Ahonan','Warrior Bot','',0,80,80,2,35,1,1,1,1,0,0,3400,2000,1,1,1,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'warrior_bot',NULL,-1),\n+(70035,0,0,0,0,0,17213,0,0,0,'Behomat','Warrior Bot','',0,80,80,2,35,1,1,1,1,0,0,3400,2000,1,1,1,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'warrior_bot',NULL,-1),\n+(70036,0,0,0,0,0,17215,0,0,0,'Ruada','Warrior Bot','',0,80,80,2,35,1,1,1,1,0,0,3400,2000,1,1,1,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'warrior_bot',NULL,-1),\n+(70037,0,0,0,0,0,17214,0,0,0,'Kazi','Warrior Bot','',0,80,80,2,35,1,1,1,1,0,0,3400,2000,1,1,1,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'warrior_bot',NULL,-1),\n+(70038,0,0,0,0,0,17211,0,0,0,'Kerra','Warrior Bot','',0,80,80,2,35,1,1,1,1,0,0,3400,2000,1,1,1,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'warrior_bot',NULL,-1),\n+(70051,0,0,0,0,0,3346,0,0,0,'Sammuel','Paladin Bot','',0,80,80,2,35,1,1,1,1,0,0,2300,2000,1,1,2,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'paladin_bot',NULL,-1),\n+(70052,0,0,0,0,0,3393,0,0,0,'Bromos','Paladin Bot','',0,80,80,2,35,1,1,1,1,0,0,2300,2000,1,1,2,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'paladin_bot',NULL,-1),\n+(70053,0,0,0,0,0,1299,0,0,0,'Wilhelm','Paladin Bot','',0,80,80,2,35,1,1,1,1,0,0,2300,2000,1,1,2,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'paladin_bot',NULL,-1),\n+(70054,0,0,0,0,0,1499,0,0,0,'Grayson','Paladin Bot','',0,80,80,2,35,1,1,1,1,0,0,2300,2000,1,1,2,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'paladin_bot',NULL,-1),\n+(70055,0,0,0,0,0,1622,0,0,0,'Azar','Paladin Bot','',0,80,80,2,35,1,1,1,1,0,0,2300,2000,1,1,2,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'paladin_bot',NULL,-1),\n+(70056,0,0,0,0,0,3089,0,0,0,'Valgar','Paladin Bot','',0,80,80,2,35,1,1,1,1,0,0,2300,2000,1,1,2,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'paladin_bot',NULL,-1),\n+(70057,0,0,0,0,0,3088,0,0,0,'Beldruk','Paladin Bot','',0,80,80,2,35,1,1,1,1,0,0,2300,2000,1,1,2,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'paladin_bot',NULL,-1),\n+(70058,0,0,0,0,0,3087,0,0,0,'Brandur','Paladin Bot','',0,80,80,2,35,1,1,1,1,0,0,2300,2000,1,1,2,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'paladin_bot',NULL,-1),\n+(70059,0,0,0,0,0,3284,0,0,0,'Arthur','Paladin Bot','',0,80,80,2,35,1,1,1,1,0,0,2300,2000,1,1,2,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'paladin_bot',NULL,-1),\n+(70060,0,0,0,0,0,3289,0,0,0,'Katherine','Paladin Bot','',0,80,80,2,35,1,1,1,1,0,0,2300,2000,1,1,2,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'paladin_bot',NULL,-1),\n+(70061,0,0,0,0,0,7356,0,0,0,'Karman','Paladin Bot','',0,80,80,2,35,1,1,1,1,0,0,2300,2000,1,1,2,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'paladin_bot',NULL,-1),\n+(70062,0,0,0,0,0,15521,0,0,0,'Jesthenis','Paladin Bot','',0,80,80,2,35,1,1,1,1,0,0,2300,2000,1,1,2,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'paladin_bot',NULL,-1),\n+(70063,0,0,0,0,0,16685,0,0,0,'Noellene','Paladin Bot','',0,80,80,2,35,1,1,1,1,0,0,2300,2000,1,1,2,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'paladin_bot',NULL,-1),\n+(70064,0,0,0,0,0,16224,0,0,0,'Aurelon','Paladin Bot','',0,80,80,2,35,1,1,1,1,0,0,2300,2000,1,1,2,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'paladin_bot',NULL,-1),\n+(70065,0,0,0,0,0,16815,0,0,0,'Osselan','Paladin Bot','',0,80,80,2,35,1,1,1,1,0,0,2300,2000,1,1,2,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'paladin_bot',NULL,-1),\n+(70066,0,0,0,0,0,16811,0,0,0,'Ithelis','Paladin Bot','',0,80,80,2,35,1,1,1,1,0,0,2300,2000,1,1,2,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'paladin_bot',NULL,-1),\n+(70067,0,0,0,0,0,16829,0,0,0,'Bachi','Paladin Bot','',0,80,80,2,35,1,1,1,1,0,0,2300,2000,1,1,2,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'paladin_bot',NULL,-1),\n+(70068,0,0,0,0,0,17225,0,0,0,'Baatun','Paladin Bot','',0,80,80,2,35,1,1,1,1,0,0,2300,2000,1,1,2,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'paladin_bot',NULL,-1),\n+(70069,0,0,0,0,0,17227,0,0,0,'Kavaan','Paladin Bot','',0,80,80,2,35,1,1,1,1,0,0,2300,2000,1,1,2,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'paladin_bot',NULL,-1),\n+(70070,0,0,0,0,0,17234,0,0,0,'Tullas','Paladin Bot','',0,80,80,2,35,1,1,1,1,0,0,2300,2000,1,1,2,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'paladin_bot',NULL,-1),\n+(70071,0,0,0,0,0,17226,0,0,0,'Jol','Paladin Bot','',0,80,80,2,35,1,1,1,1,0,0,2300,2000,1,1,2,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'paladin_bot',NULL,-1),\n+(70072,0,0,0,0,0,19596,0,0,0,'Cyssa','Paladin Bot','',0,80,80,2,35,1,1,1,1,0,0,2300,2000,1,1,2,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'paladin_bot',NULL,-1),\n+(70073,0,0,0,0,0,21264,0,0,0,'Pyreanor','Paladin Bot','',0,80,80,2,35,1,1,1,1,0,0,2300,2000,1,1,2,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'paladin_bot',NULL,-1),\n+(70074,0,0,0,0,0,29735,0,0,0,'Rukua','Paladin Bot','',0,80,80,2,35,1,1,1,1,0,0,2300,2000,1,1,2,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'paladin_bot',NULL,-1),\n+(70101,0,0,0,0,0,3395,0,0,0,'Thorgas','Hunter Bot','',0,80,80,2,35,1,1,1,1,0,0,2800,2000,1,1,3,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'hunter_bot',NULL,-1),\n+(70102,0,0,0,0,0,4560,0,0,0,'Ogromm','Hunter Bot','',0,80,80,2,35,1,1,1,1,0,0,2800,2000,1,1,3,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'hunter_bot',NULL,-1),\n+(70103,0,0,0,0,0,3558,0,0,0,'Grif','Hunter Bot','',0,80,80,2,35,1,1,1,1,0,0,2800,2000,1,1,3,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'hunter_bot',NULL,-1),\n+(70104,0,0,0,0,0,4372,0,0,0,'Kragg','Hunter Bot','',0,80,80,2,35,1,1,1,1,0,0,2800,2000,1,1,3,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'hunter_bot',NULL,-1),\n+(70105,0,0,0,0,0,2112,0,0,0,'Kary','Hunter Bot','',0,80,80,2,35,1,1,1,1,0,0,2800,2000,1,1,3,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'hunter_bot',NULL,-1),\n+(70106,0,0,0,0,0,2087,0,0,0,'Holt','Hunter Bot','',0,80,80,2,35,1,1,1,1,0,0,2800,2000,1,1,3,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'hunter_bot',NULL,-1),\n+(70107,0,0,0,0,0,2105,0,0,0,'Urek','Hunter Bot','',0,80,80,2,35,1,1,1,1,0,0,2800,2000,1,1,3,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'hunter_bot',NULL,-1),\n+(70108,0,0,0,0,0,3810,0,0,0,'Lanka','Hunter Bot','',0,80,80,2,35,1,1,1,1,0,0,2800,2000,1,1,3,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'hunter_bot',NULL,-1),\n+(70109,0,0,0,0,0,3811,0,0,0,'Yaw','Hunter Bot','',0,80,80,2,35,1,1,1,1,0,0,2800,2000,1,1,3,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'hunter_bot',NULL,-1),\n+(70110,0,0,0,0,0,1882,0,0,0,'Jen\\'shan','Hunter Bot','',0,80,80,2,35,1,1,1,1,0,0,2800,2000,1,1,3,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'hunter_bot',NULL,-1),\n+(70111,0,0,0,0,0,3744,0,0,0,'Thotar','Hunter Bot','',0,80,80,2,35,1,1,1,1,0,0,2800,2000,1,1,3,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'hunter_bot',NULL,-1),\n+(70112,0,0,0,0,0,1373,0,0,0,'Ormak','Hunter Bot','',0,80,80,2,35,1,1,1,1,0,0,2800,2000,1,1,3,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'hunter_bot',NULL,-1),\n+(70113,0,0,0,0,0,4239,0,0,0,'Xor\\'juul','Hunter Bot','',0,80,80,2,35,1,1,1,1,0,0,2800,2000,1,1,3,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'hunter_bot',NULL,-1),\n+(70114,0,0,0,0,0,4241,0,0,0,'Sian\\'dur','Hunter Bot','',0,80,80,2,35,1,1,1,1,0,0,2800,2000,1,1,3,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'hunter_bot',NULL,-1),\n+(70115,0,0,0,0,0,1723,0,0,0,'Ayanna','Hunter Bot','',0,80,80,2,35,1,1,1,1,0,0,2800,2000,1,1,3,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'hunter_bot',NULL,-1),\n+(70116,0,0,0,0,0,1703,0,0,0,'Dazalar','Hunter Bot','',0,80,80,2,35,1,1,1,1,0,0,2800,2000,1,1,3,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'hunter_bot',NULL,-1),\n+(70117,0,0,0,0,0,2066,0,0,0,'Danlaar','Hunter Bot','',0,80,80,2,35,1,1,1,1,0,0,2800,2000,1,1,3,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'hunter_bot',NULL,-1),\n+(70118,0,0,0,0,0,2205,0,0,0,'Jeen\\'ra','Hunter Bot','',0,80,80,2,35,1,1,1,1,0,0,2800,2000,1,1,3,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'hunter_bot',NULL,-1),\n+(70119,0,0,0,0,0,2206,0,0,0,'Jocaste','Hunter Bot','',0,80,80,2,35,1,1,1,1,0,0,2800,2000,1,1,3,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'hunter_bot',NULL,-1),\n+(70120,0,0,0,0,0,2251,0,0,0,'Dorion','Hunter Bot','',0,80,80,2,35,1,1,1,1,0,0,2800,2000,1,1,3,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'hunter_bot',NULL,-1),\n+(70121,0,0,0,0,0,3056,0,0,0,'Daera','Hunter Bot','',0,80,80,2,35,1,1,1,1,0,0,2800,2000,1,1,3,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'hunter_bot',NULL,-1),\n+(70122,0,0,0,0,0,3072,0,0,0,'Olmin','Hunter Bot','',0,80,80,2,35,1,1,1,1,0,0,2800,2000,1,1,3,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'hunter_bot',NULL,-1),\n+(70123,0,0,0,0,0,3073,0,0,0,'Regnus','Hunter Bot','',0,80,80,2,35,1,1,1,1,0,0,2800,2000,1,1,3,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'hunter_bot',NULL,-1),\n+(70124,0,0,0,0,0,3299,0,0,0,'Kaerbrus','Hunter Bot','',0,80,80,2,35,1,1,1,1,0,0,2800,2000,1,1,3,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'hunter_bot',NULL,-1),\n+(70125,0,0,0,0,0,3312,0,0,0,'Einris','Hunter Bot','',0,80,80,2,35,1,1,1,1,0,0,2800,2000,1,1,3,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'hunter_bot',NULL,-1),\n+(70126,0,0,0,0,0,3309,0,0,0,'Ulfir','Hunter Bot','',0,80,80,2,35,1,1,1,1,0,0,2800,2000,1,1,3,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'hunter_bot',NULL,-1),\n+(70127,0,0,0,0,0,3310,0,0,0,'Thorfin','Hunter Bot','',0,80,80,2,35,1,1,1,1,0,0,2800,2000,1,1,3,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'hunter_bot',NULL,-1),\n+(70128,0,0,0,0,0,7538,0,0,0,'Alenndaar','Hunter Bot','',0,80,80,2,35,1,1,1,1,0,0,2800,2000,1,1,3,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'hunter_bot',NULL,-1),\n+(70129,0,0,0,0,0,10245,0,0,0,'Dargh','Hunter Bot','',0,80,80,2,35,1,1,1,1,0,0,2800,2000,1,1,3,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'hunter_bot',NULL,-1),\n+(70130,0,0,0,0,0,15520,0,0,0,'Sallina','Hunter Bot','',0,80,80,2,35,1,1,1,1,0,0,2800,2000,1,1,3,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'hunter_bot',NULL,-1),\n+(70131,0,0,0,0,0,16681,0,0,0,'Hannovia','Hunter Bot','',0,80,80,2,35,1,1,1,1,0,0,2800,2000,1,1,3,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'hunter_bot',NULL,-1),\n+(70132,0,0,0,0,0,16222,0,0,0,'Keilnei','Hunter Bot','',0,80,80,2,35,1,1,1,1,0,0,2800,2000,1,1,3,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'hunter_bot',NULL,-1),\n+(70133,0,0,0,0,0,16778,0,0,0,'Tana','Hunter Bot','',0,80,80,2,35,1,1,1,1,0,0,2800,2000,1,1,3,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'hunter_bot',NULL,-1),\n+(70134,0,0,0,0,0,16816,0,0,0,'Oninath','Hunter Bot','',0,80,80,2,35,1,1,1,1,0,0,2800,2000,1,1,3,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'hunter_bot',NULL,-1),\n+(70135,0,0,0,0,0,16802,0,0,0,'Zandine','Hunter Bot','',0,80,80,2,35,1,1,1,1,0,0,2800,2000,1,1,3,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'hunter_bot',NULL,-1),\n+(70136,0,0,0,0,0,17434,0,0,0,'Deremiis','Hunter Bot','',0,80,80,2,35,1,1,1,1,0,0,2800,2000,1,1,3,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'hunter_bot',NULL,-1),\n+(70137,0,0,0,0,0,16860,0,0,0,'Acteon','Hunter Bot','',0,80,80,2,35,1,1,1,1,0,0,2800,2000,1,1,3,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'hunter_bot',NULL,-1),\n+(70138,0,0,0,0,0,17511,0,0,0,'Vord','Hunter Bot','',0,80,80,2,35,1,1,1,1,0,0,2800,2000,1,1,3,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'hunter_bot',NULL,-1),\n+(70139,0,0,0,0,0,17488,0,0,0,'Killac','Hunter bot','',0,80,80,2,35,1,1,1,1,0,0,2800,2000,1,1,3,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'hunter_bot',NULL,-1),\n+(70151,0,0,0,0,0,3351,0,0,0,'Jorik','Rogue Bot','',0,80,80,2,35,1,1,1,1,0,0,1600,2000,1,1,4,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'rogue_bot',NULL,-1),\n+(70152,0,0,0,0,0,3407,0,0,0,'Solm','Rogue Bot','',0,80,80,2,35,1,1,1,1,0,0,1600,2000,1,1,4,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'rogue_bot',NULL,-1),\n+(70153,0,0,0,0,0,1297,0,0,0,'Keryn','Rogue Bot','',0,80,80,2,35,1,1,1,1,0,0,1600,2000,1,1,4,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'rogue_bot',NULL,-1),\n+(70154,0,0,0,0,0,1507,0,0,0,'Osborne','Rogue Bot','',0,80,80,2,35,1,1,1,1,0,0,1600,2000,1,1,4,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'rogue_bot',NULL,-1),\n+(70155,0,0,0,0,0,3436,0,0,0,'Hogral','Rogue Bot','',0,80,80,2,35,1,1,1,1,0,0,1600,2000,1,1,4,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'rogue_bot',NULL,-1),\n+(70156,0,0,0,0,0,5146,0,0,0,'Ian','Rogue Bot','',0,80,80,2,35,1,1,1,1,0,0,1600,2000,1,1,4,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'rogue_bot',NULL,-1),\n+(70157,0,0,0,0,0,1580,0,0,0,'David','Rogue Bot','',0,80,80,2,35,1,1,1,1,0,0,1600,2000,1,1,4,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'rogue_bot',NULL,-1),\n+(70158,0,0,0,0,0,1603,0,0,0,'Marion','Rogue Bot','',0,80,80,2,35,1,1,1,1,0,0,1600,2000,1,1,4,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'rogue_bot',NULL,-1),\n+(70159,0,0,0,0,0,1886,0,0,0,'Rwag','Rogue Bot','',0,80,80,2,35,1,1,1,1,0,0,1600,2000,1,1,4,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'rogue_bot',NULL,-1),\n+(70160,0,0,0,0,0,3749,0,0,0,'Kaplak','Rogue Bot','',0,80,80,2,35,1,1,1,1,0,0,1600,2000,1,1,4,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'rogue_bot',NULL,-1),\n+(70161,0,0,0,0,0,1327,0,0,0,'Gest','Rogue Bot','',0,80,80,2,35,1,1,1,1,0,0,1600,2000,1,1,4,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'rogue_bot',NULL,-1),\n+(70162,0,0,0,0,0,1328,0,0,0,'Ormok','Rogue Bot','',0,80,80,2,35,1,1,1,1,0,0,1600,2000,1,1,4,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'rogue_bot',NULL,-1),\n+(70163,0,0,0,0,0,4360,0,0,0,'Shenthul','Rogue Bot','',0,80,80,2,35,1,1,1,1,0,0,1600,2000,1,1,4,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'rogue_bot',NULL,-1),\n+(70164,0,0,0,0,0,1725,0,0,0,'Frahun','Rogue Bot','',0,80,80,2,35,1,1,1,1,0,0,1600,2000,1,1,4,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'rogue_bot',NULL,-1),\n+(70165,0,0,0,0,0,1704,0,0,0,'Jannok','Rogue Bot','',0,80,80,2,35,1,1,1,1,0,0,1600,2000,1,1,4,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'rogue_bot',NULL,-1),\n+(70166,0,0,0,0,0,2231,0,0,0,'Syurna','Rogue Bot','',0,80,80,2,35,1,1,1,1,0,0,1600,2000,1,1,4,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'rogue_bot',NULL,-1),\n+(70167,0,0,0,0,0,2252,0,0,0,'Erion','Rogue Bot','',0,80,80,2,35,1,1,1,1,0,0,1600,2000,1,1,4,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'rogue_bot',NULL,-1),\n+(70168,0,0,0,0,0,2243,0,0,0,'Anishar','Rogue Bot','',0,80,80,2,35,1,1,1,1,0,0,1600,2000,1,1,4,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'rogue_bot',NULL,-1),\n+(70169,0,0,0,0,0,2659,0,0,0,'Carolyn','Rogue Bot','',0,80,80,2,35,1,1,1,1,0,0,1600,2000,1,1,4,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'rogue_bot',NULL,-1),\n+(70170,0,0,0,0,0,2639,0,0,0,'Miles','Rogue Bot','',0,80,80,2,35,1,1,1,1,0,0,1600,2000,1,1,4,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'rogue_bot',NULL,-1),\n+(70171,0,0,0,0,0,2631,0,0,0,'Gregory','Rogue Bot','',0,80,80,2,35,1,1,1,1,0,0,1600,2000,1,1,4,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'rogue_bot',NULL,-1),\n+(70172,0,0,0,0,0,3101,0,0,0,'Hulfdan','Rogue Bot','',0,80,80,2,35,1,1,1,1,0,0,1600,2000,1,1,4,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'rogue_bot',NULL,-1),\n+(70173,0,0,0,0,0,3100,0,0,0,'Ormyr','Rogue Bot','',0,80,80,2,35,1,1,1,1,0,0,1600,2000,1,1,4,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'rogue_bot',NULL,-1),\n+(70174,0,0,0,0,0,3113,0,0,0,'Fenthwick','Rogue Bot','',0,80,80,2,35,1,1,1,1,0,0,1600,2000,1,1,4,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'rogue_bot',NULL,-1),\n+(70175,0,0,0,0,0,5528,0,0,0,'Fahrad','Rogue Bot','',0,80,80,2,35,1,1,1,1,0,0,1600,2000,1,1,4,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'rogue_bot',NULL,-1),\n+(70176,0,0,0,0,0,13171,0,0,0,'Tony','Rogue Bot','',0,80,80,2,35,1,1,1,1,0,0,1600,2000,1,1,4,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'rogue_bot',NULL,-1),\n+(70177,0,0,0,0,0,15519,0,0,0,'Kariel','Rogue Bot','',0,80,80,2,35,1,1,1,1,0,0,1600,2000,1,1,4,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'rogue_bot',NULL,-1),\n+(70178,0,0,0,0,0,16689,0,0,0,'Tannaria','Rogue Bot','',0,80,80,2,35,1,1,1,1,0,0,1600,2000,1,1,4,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'rogue_bot',NULL,-1),\n+(70179,0,0,0,0,0,16767,0,0,0,'Zelanis','Rogue Bot','',0,80,80,2,35,1,1,1,1,0,0,1600,2000,1,1,4,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'rogue_bot',NULL,-1),\n+(70180,0,0,0,0,0,16798,0,0,0,'Elara','Rogue Bot','',0,80,80,2,35,1,1,1,1,0,0,1600,2000,1,1,4,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'rogue_bot',NULL,-1),\n+(70181,0,0,0,0,0,16818,0,0,0,'Nerisen','Rogue Bot','',0,80,80,2,35,1,1,1,1,0,0,1600,2000,1,1,4,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'rogue_bot',NULL,-1),\n+(70201,0,0,0,0,0,3344,0,0,0,'Anetta','Priest Bot','',0,80,80,2,35,1,1,1,1,0,0,3600,2000,1,1,5,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'priest_bot',NULL,-1),\n+(70202,0,0,0,0,0,1495,0,0,0,'Laurena','Priest Bot','',0,80,80,2,35,1,1,1,1,0,0,3600,2000,1,1,5,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'priest_bot',NULL,-1),\n+(70203,0,0,0,0,0,1295,0,0,0,'Josetta','Priest Bot','',0,80,80,2,35,1,1,1,1,0,0,3600,2000,1,1,5,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'priest_bot',NULL,-1),\n+(70204,0,0,0,0,0,3401,0,0,0,'Branstock','Priest Bot','',0,80,80,2,35,1,1,1,1,0,0,3600,2000,1,1,5,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'priest_bot',NULL,-1),\n+(70205,0,0,0,0,0,3429,0,0,0,'Maxan','Priest Bot','',0,80,80,2,35,1,1,1,1,0,0,3600,2000,1,1,5,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'priest_bot',NULL,-1),\n+(70206,0,0,0,0,0,1579,0,0,0,'Duesten','Priest Bot','',0,80,80,2,35,1,1,1,1,0,0,3600,2000,1,1,5,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'priest_bot',NULL,-1),\n+(70207,0,0,0,0,0,1602,0,0,0,'Beryl','Priest Bot','',0,80,80,2,35,1,1,1,1,0,0,3600,2000,1,1,5,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'priest_bot',NULL,-1),\n+(70208,0,0,0,0,0,2139,0,0,0,'Miles','Priest Bot','',0,80,80,2,35,1,1,1,1,0,0,3600,2000,1,1,5,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'priest_bot',NULL,-1),\n+(70209,0,0,0,0,0,2138,0,0,0,'Malakai','Priest Bot','',0,80,80,2,35,1,1,1,1,0,0,3600,2000,1,1,5,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'priest_bot',NULL,-1),\n+(70210,0,0,0,0,0,2137,0,0,0,'Cobb','Priest Bot','',0,80,80,2,35,1,1,1,1,0,0,3600,2000,1,1,5,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'priest_bot',NULL,-1),\n+(70211,0,0,0,0,0,1733,0,0,0,'Shanda','Priest Bot','',0,80,80,2,35,1,1,1,1,0,0,3600,2000,1,1,5,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'priest_bot',NULL,-1),\n+(70212,0,0,0,0,0,1708,0,0,0,'Laurna','Priest Bot','',0,80,80,2,35,1,1,1,1,0,0,3600,2000,1,1,5,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'priest_bot',NULL,-1),\n+(70213,0,0,0,0,0,1897,0,0,0,'Tai\\'jin','Priest Bot','',0,80,80,2,35,1,1,1,1,0,0,3600,2000,1,1,5,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'priest_bot',NULL,-1),\n+(70214,0,0,0,0,0,4068,0,0,0,'Ken\\'jai','Priest Bot','',0,80,80,2,35,1,1,1,1,0,0,3600,2000,1,1,5,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'priest_bot',NULL,-1),\n+(70215,0,0,0,0,0,2200,0,0,0,'Astarii','Priest Bot','',0,80,80,2,35,1,1,1,1,0,0,3600,2000,1,1,5,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'priest_bot',NULL,-1),\n+(70216,0,0,0,0,0,2201,0,0,0,'Jandria','Priest Bot','',0,80,80,2,35,1,1,1,1,0,0,3600,2000,1,1,5,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'priest_bot',NULL,-1),\n+(70217,0,0,0,0,0,2202,0,0,0,'Lariia','Priest Bot','',0,80,80,2,35,1,1,1,1,0,0,3600,2000,1,1,5,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'priest_bot',NULL,-1),\n+(70218,0,0,0,0,0,2626,0,0,0,'Lankester','Priest Bot','',0,80,80,2,35,1,1,1,1,0,0,3600,2000,1,1,5,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'priest_bot',NULL,-1),\n+(70219,0,0,0,0,0,2618,0,0,0,'Lazarus','Priest Bot','',0,80,80,2,35,1,1,1,1,0,0,3600,2000,1,1,5,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'priest_bot',NULL,-1),\n+(70220,0,0,0,0,0,3086,0,0,0,'Theodrus','Priest Bot','',0,80,80,2,35,1,1,1,1,0,0,3600,2000,1,1,5,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'priest_bot',NULL,-1),\n+(70221,0,0,0,0,0,3066,0,0,0,'Braenna','Priest Bot','',0,80,80,2,35,1,1,1,1,0,0,3600,2000,1,1,5,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'priest_bot',NULL,-1),\n+(70222,0,0,0,0,0,3085,0,0,0,'Toldren','Priest Bot','',0,80,80,2,35,1,1,1,1,0,0,3600,2000,1,1,5,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'priest_bot',NULL,-1),\n+(70223,0,0,0,0,0,3282,0,0,0,'Benjamin','Priest Bot','',0,80,80,2,35,1,1,1,1,0,0,3600,2000,1,1,5,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'priest_bot',NULL,-1),\n+(70224,0,0,0,0,0,3283,0,0,0,'Joshua','Priest Bot','',0,80,80,2,35,1,1,1,1,0,0,3600,2000,1,1,5,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'priest_bot',NULL,-1),\n+(70225,0,0,0,0,0,4690,0,0,0,'Zayus','Priest Bot','',0,80,80,2,35,1,1,1,1,0,0,3600,2000,1,1,5,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'priest_bot',NULL,-1),\n+(70226,0,0,0,0,0,10473,0,0,0,'X\\'yera','Priest Bot','',0,80,80,2,35,1,1,1,1,0,0,3600,2000,1,1,5,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'priest_bot',NULL,-1),\n+(70227,0,0,0,0,0,4711,0,0,0,'Ur\\'kyo','Priest Bot','',0,80,80,2,35,1,1,1,1,0,0,3600,2000,1,1,5,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'priest_bot',NULL,-1),\n+(70228,0,0,0,0,0,11044,0,0,0,'Nara','Priest Bot','',0,80,80,2,35,1,1,1,1,0,0,3600,2000,1,1,5,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'priest_bot',NULL,-1),\n+(70229,0,0,0,0,0,11048,0,0,0,'Alathea','Priest Bot','',0,80,80,2,35,1,1,1,1,0,0,3600,2000,1,1,5,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'priest_bot',NULL,-1),\n+(70230,0,0,0,0,0,11053,0,0,0,'Rohan','Priest Bot','',0,80,80,2,35,1,1,1,1,0,0,3600,2000,1,1,5,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'priest_bot',NULL,-1),\n+(70231,0,0,0,0,0,15518,0,0,0,'Arena','Priest Bot','',0,80,80,2,35,1,1,1,1,0,0,3600,2000,1,1,5,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'priest_bot',NULL,-1),\n+(70232,0,0,0,0,0,16707,0,0,0,'Ponaris','Priest Bot','',0,80,80,2,35,1,1,1,1,0,0,3600,2000,1,1,5,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'priest_bot',NULL,-1),\n+(70233,0,0,0,0,0,16225,0,0,0,'Zalduun','Priest Bot','',0,80,80,2,35,1,1,1,1,0,0,3600,2000,1,1,5,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'priest_bot',NULL,-1),\n+(70234,0,0,0,0,0,16788,0,0,0,'Aldrae','Priest Bot','',0,80,80,2,35,1,1,1,1,0,0,3600,2000,1,1,5,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'priest_bot',NULL,-1),\n+(70235,0,0,0,0,0,16817,0,0,0,'Lotheolan','Priest Bot','',0,80,80,2,35,1,1,1,1,0,0,3600,2000,1,1,5,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'priest_bot',NULL,-1),\n+(70236,0,0,0,0,0,16795,0,0,0,'Belestra','Priest Bot','',0,80,80,2,35,1,1,1,1,0,0,3600,2000,1,1,5,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'priest_bot',NULL,-1),\n+(70237,0,0,0,0,0,17247,0,0,0,'Caedmos','Priest Bot','',0,80,80,2,35,1,1,1,1,0,0,3600,2000,1,1,5,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'priest_bot',NULL,-1),\n+(70238,0,0,0,0,0,17232,0,0,0,'Guvan','Priest Bot','',0,80,80,2,35,1,1,1,1,0,0,3600,2000,1,1,5,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'priest_bot',NULL,-1),\n+(70239,0,0,0,0,0,17249,0,0,0,'Izmir','Priest Bot','',0,80,80,2,35,1,1,1,1,0,0,3600,2000,1,1,5,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'priest_bot',NULL,-1),\n+(70240,0,0,0,0,0,17248,0,0,0,'Fallat','Priest Bot','',0,80,80,2,35,1,1,1,1,0,0,3600,2000,1,1,5,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'priest_bot',NULL,-1),\n+(70251,0,0,0,0,0,4552,0,0,0,'Haromm','Shaman Bot','',0,80,80,2,35,1,1,1,1,0,0,2600,2000,1,1,7,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'shaman_bot',NULL,-1),\n+(70252,0,0,0,0,0,2123,0,0,0,'Siln','Shaman Bot','',0,80,80,2,35,1,1,1,1,0,0,2600,2000,1,1,7,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'shaman_bot',NULL,-1),\n+(70253,0,0,0,0,0,2102,0,0,0,'Tigor','Shaman Bot','',0,80,80,2,35,1,1,1,1,0,0,2600,2000,1,1,7,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'shaman_bot',NULL,-1),\n+(70254,0,0,0,0,0,2082,0,0,0,'Beram','Shaman Bot','',0,80,80,2,35,1,1,1,1,0,0,2600,2000,1,1,7,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'shaman_bot',NULL,-1),\n+(70255,0,0,0,0,0,10180,0,0,0,'Meela','Shaman Bot','',0,80,80,2,35,1,1,1,1,0,0,2600,2000,1,1,7,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'shaman_bot',NULL,-1),\n+(70256,0,0,0,0,0,3816,0,0,0,'Narm','Shaman Bot','',0,80,80,2,35,1,1,1,1,0,0,2600,2000,1,1,7,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'shaman_bot',NULL,-1),\n+(70257,0,0,0,0,0,1878,0,0,0,'Shikrik','Shaman Bot','',0,80,80,2,35,1,1,1,1,0,0,2600,2000,1,1,7,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'shaman_bot',NULL,-1),\n+(70258,0,0,0,0,0,3746,0,0,0,'Swart','Shaman Bot','',0,80,80,2,35,1,1,1,1,0,0,2600,2000,1,1,7,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'shaman_bot',NULL,-1),\n+(70259,0,0,0,0,0,1360,0,0,0,'Kardris','Shaman Bot','',0,80,80,2,35,1,1,1,1,0,0,2600,2000,1,1,7,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'shaman_bot',NULL,-1),\n+(70260,0,0,0,0,0,4231,0,0,0,'Sian\\'tsu','Shaman Bot','',0,80,80,2,35,1,1,1,1,0,0,2600,2000,1,1,7,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'shaman_bot',NULL,-1),\n+(70261,0,0,0,0,0,13341,0,0,0,'Sagorne','Shaman Bot','',0,80,80,2,35,1,1,1,1,0,0,2600,2000,1,1,7,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'shaman_bot',NULL,-1),\n+(70265,0,0,0,0,0,16914,0,0,0,'Sulaa','Shaman Bot','',0,80,80,2,35,1,1,1,1,0,0,2600,2000,1,1,7,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'shaman_bot',NULL,-1),\n+(70267,0,0,0,0,0,19598,0,0,0,'Umbrua','Shaman Bot','',0,80,80,2,35,1,1,1,1,0,0,2600,2000,1,1,7,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'shaman_bot',NULL,-1),\n+(70268,0,0,0,0,0,21265,0,0,0,'Javad','Shaman Bot','',0,80,80,2,35,1,1,1,1,0,0,2600,2000,1,1,7,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'shaman_bot',NULL,-1),\n+(70301,0,0,0,0,0,5001,0,0,0,'Khelden','Mage Bot','',0,80,80,2,35,1,1,1,1,0,0,3800,2000,1,1,8,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'mage_bot',NULL,-1),\n+(70302,0,0,0,0,0,1294,0,0,0,'Zaldimar','Mage Bot','',0,80,80,2,35,1,1,1,1,0,0,3800,2000,1,1,8,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'mage_bot',NULL,-1),\n+(70303,0,0,0,0,0,1484,0,0,0,'Maginor','Mage Bot','',0,80,80,2,35,1,1,1,1,0,0,3800,2000,1,1,8,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'mage_bot',NULL,-1),\n+(70304,0,0,0,0,0,10216,0,0,0,'Marryk','Mage Bot','',0,80,80,2,35,1,1,1,1,0,0,3800,2000,1,1,8,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'mage_bot',NULL,-1),\n+(70305,0,0,0,0,0,10215,0,0,0,'Magis','Mage Bot','',0,80,80,2,35,1,1,1,1,0,0,3800,2000,1,1,8,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'mage_bot',NULL,-1),\n+(70306,0,0,0,0,0,1592,0,0,0,'Isabella','Mage Bot','',0,80,80,2,35,1,1,1,1,0,0,3800,2000,1,1,8,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'mage_bot',NULL,-1),\n+(70307,0,0,0,0,0,1600,0,0,0,'Cain','Mage Bot','',0,80,80,2,35,1,1,1,1,0,0,3800,2000,1,1,8,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'mage_bot',NULL,-1),\n+(70308,0,0,0,0,0,2134,0,0,0,'Shymm','Mage Bot','',0,80,80,2,35,1,1,1,1,0,0,3800,2000,1,1,8,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'mage_bot',NULL,-1),\n+(70309,0,0,0,0,0,6058,0,0,0,'Ursyn','Mage Bot','',0,80,80,2,35,1,1,1,1,0,0,3800,2000,1,1,8,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'mage_bot',NULL,-1),\n+(70310,0,0,0,0,0,2135,0,0,0,'Thurston','Mage Bot','',0,80,80,2,35,1,1,1,1,0,0,3800,2000,1,1,8,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'mage_bot',NULL,-1),\n+(70311,0,0,0,0,0,2644,0,0,0,'Pierce','Mage Bot','',0,80,80,2,35,1,1,1,1,0,0,3800,2000,1,1,8,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'mage_bot',NULL,-1),\n+(70312,0,0,0,0,0,2657,0,0,0,'Anastasia','Mage Bot','',0,80,80,2,35,1,1,1,1,0,0,3800,2000,1,1,8,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'mage_bot',NULL,-1),\n+(70313,0,0,0,0,0,3108,0,0,0,'Bink','Mage Bot','',0,80,80,2,35,1,1,1,1,0,0,3800,2000,1,1,8,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'mage_bot',NULL,-1),\n+(70314,0,0,0,0,0,10214,0,0,0,'Juli','Mage Bot','',0,80,80,2,35,1,1,1,1,0,0,3800,2000,1,1,8,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'mage_bot',NULL,-1),\n+(70315,0,0,0,0,0,3109,0,0,0,'Nittlebur','Mage Bot','',0,80,80,2,35,1,1,1,1,0,0,3800,2000,1,1,8,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'mage_bot',NULL,-1),\n+(70316,0,0,0,0,0,3292,0,0,0,'Jennea','Mage Bot','',0,80,80,2,35,1,1,1,1,0,0,3800,2000,1,1,8,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'mage_bot',NULL,-1),\n+(70317,0,0,0,0,0,10171,0,0,0,'Un\\'Thuwa','Mage Bot','',0,80,80,2,35,1,1,1,1,0,0,3800,2000,1,1,8,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'mage_bot',NULL,-1),\n+(70318,0,0,0,0,0,4524,0,0,0,'Pephredo','Mage Bot','',0,80,80,2,35,1,1,1,1,0,0,3800,2000,1,1,8,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'mage_bot',NULL,-1),\n+(70319,0,0,0,0,0,4522,0,0,0,'Enyo','Mage Bot','',0,80,80,2,35,1,1,1,1,0,0,3800,2000,1,1,8,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'mage_bot',NULL,-1),\n+(70320,0,0,0,0,0,4526,0,0,0,'Mai\\'ah','Mage Bot','',0,80,80,2,35,1,1,1,1,0,0,3800,2000,1,1,8,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'mage_bot',NULL,-1),\n+(70321,0,0,0,0,0,4523,0,0,0,'Deino','Mage Bot','',0,80,80,2,35,1,1,1,1,0,0,3800,2000,1,1,8,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'mage_bot',NULL,-1),\n+(70322,0,0,0,0,0,6060,0,0,0,'Uthel\\'nay','Mage Bot','',0,80,80,2,35,1,1,1,1,0,0,3800,2000,1,1,8,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'mage_bot',NULL,-1),\n+(70323,0,0,0,0,0,6072,0,0,0,'Dink','Mage Bot','',0,80,80,2,35,1,1,1,1,0,0,3800,2000,1,1,8,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'mage_bot',NULL,-1),\n+(70324,0,0,0,0,0,15522,0,0,0,'Julia','Mage Bot','',0,80,80,2,35,1,1,1,1,0,0,3800,2000,1,1,8,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'mage_bot',NULL,-1),\n+(70325,0,0,0,0,0,16680,0,0,0,'Garridel','Mage Bot','',0,80,80,2,35,1,1,1,1,0,0,3800,2000,1,1,8,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'mage_bot',NULL,-1),\n+(70326,0,0,0,0,0,16223,0,0,0,'Valaatu','Mage Bot','',0,80,80,2,35,1,1,1,1,0,0,3800,2000,1,1,8,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'mage_bot',NULL,-1),\n+(70327,0,0,0,0,0,16781,0,0,0,'Zaedana','Mage Bot','',0,80,80,2,35,1,1,1,1,0,0,3800,2000,1,1,8,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'mage_bot',NULL,-1),\n+(70328,0,0,0,0,0,16824,0,0,0,'Quithas','Mage Bot','',0,80,80,2,35,1,1,1,1,0,0,3800,2000,1,1,8,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'mage_bot',NULL,-1),\n+(70329,0,0,0,0,0,16809,0,0,0,'Inethven','Mage Bot','',0,80,80,2,35,1,1,1,1,0,0,3800,2000,1,1,8,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'mage_bot',NULL,-1),\n+(70330,0,0,0,0,0,16777,0,0,0,'Narinth','Mage Bot','',0,80,80,2,35,1,1,1,1,0,0,3800,2000,1,1,8,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'mage_bot',NULL,-1),\n+(70331,0,0,0,0,0,17242,0,0,0,'Edirah','Mage Bot','',0,80,80,2,35,1,1,1,1,0,0,3800,2000,1,1,8,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'mage_bot',NULL,-1),\n+(70332,0,0,0,0,0,16856,0,0,0,'Valustraa','Mage Bot','',0,80,80,2,35,1,1,1,1,0,0,3800,2000,1,1,8,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'mage_bot',NULL,-1),\n+(70333,0,0,0,0,0,17233,0,0,0,'Semid','Mage Bot','',0,80,80,2,35,1,1,1,1,0,0,3800,2000,1,1,8,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'mage_bot',NULL,-1),\n+(70334,0,0,0,0,0,17243,0,0,0,'Harnan','Mage Bot','',0,80,80,2,35,1,1,1,1,0,0,3800,2000,1,1,8,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'mage_bot',NULL,-1),\n+(70335,0,0,0,0,0,17241,0,0,0,'Bati','Mage Bot','',0,80,80,2,35,1,1,1,1,0,0,3800,2000,1,1,8,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'mage_bot',NULL,-1),\n+(70336,0,0,0,0,0,11466,0,0,0,'Derek','Mage Bot','',0,80,80,2,35,1,1,1,1,0,0,3800,2000,1,1,8,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'mage_bot',NULL,-1),\n+(70351,0,0,0,0,0,3345,0,0,0,'Drusilla','Warlock Bot','',0,80,80,2,35,1,1,1,1,0,0,3500,2000,1,1,9,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'warlock_bot',NULL,-1),\n+(70352,0,0,0,0,0,1930,0,0,0,'Alamar','Warlock Bot','',0,80,80,2,35,1,1,1,1,0,0,3500,2000,1,1,9,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'warlock_bot',NULL,-1),\n+(70353,0,0,0,0,0,1469,0,0,0,'Demisette','Warlock Bot','',0,80,80,2,35,1,1,1,1,0,0,3500,2000,1,1,9,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'warlock_bot',NULL,-1),\n+(70354,0,0,0,0,0,3271,0,0,0,'Maximillian','Warlock Bot','',0,80,80,2,35,1,1,1,1,0,0,3500,2000,1,1,9,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'warlock_bot',NULL,-1),\n+(70355,0,0,0,0,0,4567,0,0,0,'Kartosh','Warlock Bot','',0,80,80,2,35,1,1,1,1,0,0,3500,2000,1,1,9,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'warlock_bot',NULL,-1),\n+(70356,0,0,0,0,0,1581,0,0,0,'Maximillion','Warlock Bot','',0,80,80,2,35,1,1,1,1,0,0,3500,2000,1,1,9,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'warlock_bot',NULL,-1),\n+(70357,0,0,0,0,0,1604,0,0,0,'Rupert','Warlock Bot','',0,80,80,2,35,1,1,1,1,0,0,3500,2000,1,1,9,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'warlock_bot',NULL,-1),\n+(70358,0,0,0,0,0,1884,0,0,0,'Nartok','Warlock Bot','',0,80,80,2,35,1,1,1,1,0,0,3500,2000,1,1,9,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'warlock_bot',NULL,-1),\n+(70359,0,0,0,0,0,3745,0,0,0,'Dhugru','Warlock Bot','',0,80,80,2,35,1,1,1,1,0,0,3500,2000,1,1,9,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'warlock_bot',NULL,-1),\n+(70360,0,0,0,0,0,1324,0,0,0,'Grol\\'dar','Warlock Bot','',0,80,80,2,35,1,1,1,1,0,0,3500,2000,1,1,9,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'warlock_bot',NULL,-1),\n+(70361,0,0,0,0,0,1325,0,0,0,'Mirket','Warlock Bot','',0,80,80,2,35,1,1,1,1,0,0,3500,2000,1,1,9,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'warlock_bot',NULL,-1),\n+(70362,0,0,0,0,0,1326,0,0,0,'Zevrost','Warlock Bot','',0,80,80,2,35,1,1,1,1,0,0,3500,2000,1,1,9,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'warlock_bot',NULL,-1),\n+(70363,0,0,0,0,0,2675,0,0,0,'Kaal','Warlock Bot','',0,80,80,2,35,1,1,1,1,0,0,3500,2000,1,1,9,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'warlock_bot',NULL,-1),\n+(70364,0,0,0,0,0,2637,0,0,0,'Luther','Warlock Bot','',0,80,80,2,35,1,1,1,1,0,0,3500,2000,1,1,9,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'warlock_bot',NULL,-1),\n+(70365,0,0,0,0,0,2646,0,0,0,'Richard','Warlock Bot','',0,80,80,2,35,1,1,1,1,0,0,3500,2000,1,1,9,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'warlock_bot',NULL,-1),\n+(70366,0,0,0,0,0,3115,0,0,0,'Thistleheart','Warlock Bot','',0,80,80,2,35,1,1,1,1,0,0,3500,2000,1,1,9,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'warlock_bot',NULL,-1),\n+(70367,0,0,0,0,0,3116,0,0,0,'Briarthorn','Warlock Bot','',0,80,80,2,35,1,1,1,1,0,0,3500,2000,1,1,9,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'warlock_bot',NULL,-1),\n+(70368,0,0,0,0,0,3122,0,0,0,'Alexander','Warlock Bot','',0,80,80,2,35,1,1,1,1,0,0,3500,2000,1,1,9,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'warlock_bot',NULL,-1),\n+(70369,0,0,0,0,0,3291,0,0,0,'Ursula','Warlock Bot','',0,80,80,2,35,1,1,1,1,0,0,3500,2000,1,1,9,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'warlock_bot',NULL,-1),\n+(70370,0,0,0,0,0,3286,0,0,0,'Sandahl','Warlock Bot','',0,80,80,2,35,1,1,1,1,0,0,3500,2000,1,1,9,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'warlock_bot',NULL,-1),\n+(70371,0,0,0,0,0,3607,0,0,0,'Gimrizz','Warlock Bot','',0,80,80,2,35,1,1,1,1,0,0,3500,2000,1,1,9,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'warlock_bot',NULL,-1),\n+(70372,0,0,0,0,0,15524,0,0,0,'Teli\\'Larien','Warlock Bot','',0,80,80,2,35,1,1,1,1,0,0,3500,2000,1,1,9,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'warlock_bot',NULL,-1),\n+(70373,0,0,0,0,0,16700,0,0,0,'Celoenus','Warlock Bot','',0,80,80,2,35,1,1,1,1,0,0,3500,2000,1,1,9,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'warlock_bot',NULL,-1),\n+(70374,0,0,0,0,0,16787,0,0,0,'Alamma','Warlock Bot','',0,80,80,2,35,1,1,1,1,0,0,3500,2000,1,1,9,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'warlock_bot',NULL,-1),\n+(70375,0,0,0,0,0,16800,0,0,0,'Talionia','Warlock Bot','',0,80,80,2,35,1,1,1,1,0,0,3500,2000,1,1,9,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'warlock_bot',NULL,-1),\n+(70376,0,0,0,0,0,16831,0,0,0,'Zanien','Warlock Bot','',0,80,80,2,35,1,1,1,1,0,0,3500,2000,1,1,9,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'warlock_bot',NULL,-1),\n+(70377,0,0,0,0,0,21604,0,0,0,'Babagaya','Warlock Bot','',0,80,80,2,35,1,1,1,1,0,0,3500,2000,1,1,9,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'warlock_bot',NULL,-1),\n+(70401,0,0,0,0,0,2106,0,0,0,'Turak','Druid Bot','',0,80,80,2,35,1,1,1,1,0,0,2200,2000,1,1,11,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'druid_bot',NULL,-1),\n+(70402,0,0,0,0,0,2121,0,0,0,'Sheal','Druid Bot','',0,80,80,2,35,1,1,1,1,0,0,2200,2000,1,1,11,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'druid_bot',NULL,-1),\n+(70403,0,0,0,0,0,2115,0,0,0,'Kym','Druid Bot','',0,80,80,2,35,1,1,1,1,0,0,2200,2000,1,1,11,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'druid_bot',NULL,-1),\n+(70404,0,0,0,0,0,3819,0,0,0,'Gart','Druid Bot','',0,80,80,2,35,1,1,1,1,0,0,2200,2000,1,1,11,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'druid_bot',NULL,-1),\n+(70405,0,0,0,0,0,10734,0,0,0,'Gennia','Druid Bot','',0,80,80,2,35,1,1,1,1,0,0,2200,2000,1,1,11,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'druid_bot',NULL,-1),\n+(70406,0,0,0,0,0,1732,0,0,0,'Mardant','Druid Bot','',0,80,80,2,35,1,1,1,1,0,0,2200,2000,1,1,11,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'druid_bot',NULL,-1),\n+(70407,0,0,0,0,0,1706,0,0,0,'Kal','Druid Bot','',0,80,80,2,35,1,1,1,1,0,0,2200,2000,1,1,11,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'druid_bot',NULL,-1),\n+(70408,0,0,0,0,0,2261,0,0,0,'Mathrengyl','Druid Bot','',0,80,80,2,35,1,1,1,1,0,0,2200,2000,1,1,11,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'druid_bot',NULL,-1),\n+(70409,0,0,0,0,0,2250,0,0,0,'Denatharion','Druid Bot','',0,80,80,2,35,1,1,1,1,0,0,2200,2000,1,1,11,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'druid_bot',NULL,-1),\n+(70410,0,0,0,0,0,2255,0,0,0,'Fylerian','Druid Bot','',0,80,80,2,35,1,1,1,1,0,0,2200,2000,1,1,11,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'druid_bot',NULL,-1),\n+(70411,0,0,0,0,0,3300,0,0,0,'Sheldras','Druid Bot','',0,80,80,2,35,1,1,1,1,0,0,2200,2000,1,1,11,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'druid_bot',NULL,-1),\n+(70412,0,0,0,0,0,3301,0,0,0,'Theridran','Druid Bot','',0,80,80,2,35,1,1,1,1,0,0,2200,2000,1,1,11,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'druid_bot',NULL,-1),\n+(70413,0,0,0,0,0,3302,0,0,0,'Maldryn','Druid Bot','',0,80,80,2,35,1,1,1,1,0,0,2200,2000,1,1,11,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'druid_bot',NULL,-1),\n+(70414,0,0,0,0,0,7357,0,0,0,'Jannos','Druid Bot','',0,80,80,2,35,1,1,1,1,0,0,2200,2000,1,1,11,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'druid_bot',NULL,-1),\n+(70415,0,0,0,0,0,10738,0,0,0,'Golhine','Druid Bot','',0,80,80,2,35,1,1,1,1,0,0,2200,2000,1,1,11,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'druid_bot',NULL,-1),\n+(70416,0,0,0,0,0,12053,0,0,0,'Loganaar','Druid Bot','',0,80,80,2,35,1,1,1,1,0,0,2200,2000,1,1,11,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'druid_bot',NULL,-1),\n+(70417,0,0,0,0,0,16739,0,0,0,'Harene','Druid Bot','',0,80,80,2,35,1,1,1,1,0,0,2200,2000,1,1,11,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'druid_bot',NULL,-1),\n+(70418,0,0,0,0,0,16858,0,0,0,'Shalannius','Druid Bot','',0,80,80,2,35,1,1,1,1,0,0,2200,2000,1,1,11,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'druid_bot',NULL,-1),\n+(70451,0,0,0,0,0,24935,0,0,0,'Siouxsie','Death Knight Bot','',0,80,80,2,35,1,1,1,1,0,0,3300,2000,1,1,6,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'death_knight_bot',NULL,-1),\n+(70452,0,0,0,0,0,26939,0,0,0,'Imhadria','Death Knight Bot','',0,80,80,2,35,1,1,1,1,0,0,3300,2000,1,1,6,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'death_knight_bot',NULL,-1),\n+(70453,0,0,0,0,0,26854,0,0,0,'Vaelen','Death Knight Bot','',0,80,80,2,35,1,1,1,1,0,0,3300,2000,1,1,6,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'death_knight_bot',NULL,-1),\n+(70454,0,0,0,0,0,28039,0,0,0,'Mynx','Death Knight Bot','',0,80,80,2,35,1,1,1,1,0,0,3300,2000,1,1,6,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'death_knight_bot',NULL,-1),\n+(70455,0,0,0,0,0,26688,0,0,0,'Lankral','Death Knight Bot','',0,80,80,2,35,1,1,1,1,0,0,3300,2000,1,1,6,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'death_knight_bot',NULL,-1),\n+(70456,0,0,0,0,0,26195,0,0,0,'Sliver','Death Knight Bot','',0,80,80,2,35,1,1,1,1,0,0,3300,2000,1,1,6,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'death_knight_bot',NULL,-1),\n+(70457,0,0,0,0,0,27402,0,0,0,'Vereth','Death Knight Bot','',0,80,80,2,35,1,1,1,1,0,0,3300,2000,1,1,6,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'death_knight_bot',NULL,-1),\n+(70458,0,0,0,0,0,27189,0,0,0,'Arly','Death Knight Bot','',0,80,80,2,35,1,1,1,1,0,0,3300,2000,1,1,6,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'death_knight_bot',NULL,-1),\n+(70459,0,0,0,0,0,26217,0,0,0,'Setaal','Death Knight Bot','',0,80,80,2,35,1,1,1,1,0,0,3300,2000,1,1,6,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'death_knight_bot',NULL,-1),\n+(70460,0,0,0,0,0,26222,0,0,0,'Uzo','Death Knight Bot','',0,80,80,2,35,1,1,1,1,0,0,3300,2000,1,1,6,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'death_knight_bot',NULL,-1),\n+(70461,0,0,0,0,0,28842,0,0,0,'Illyrie','Death Knight Bot','',0,80,80,2,35,1,1,1,1,0,0,3300,2000,1,1,6,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'death_knight_bot',NULL,-1),\n+(70462,0,0,0,0,0,28837,0,0,0,'Crok','Death Knight Bot','',0,80,80,2,35,1,1,1,1,0,0,3300,2000,1,1,6,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'death_knight_bot',NULL,-1),\n+(70463,0,0,0,0,0,28840,0,0,0,'Zor\\'be','Death Knight Bot','',0,80,80,2,35,1,1,1,1,0,0,3300,2000,1,1,6,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'death_knight_bot',NULL,-1),\n+(70464,0,0,0,0,0,25512,0,0,0,'Datura','Death Knight Bot','',0,80,80,2,35,1,1,1,1,0,0,3300,2000,1,1,6,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'death_knight_bot',NULL,-1),\n+(70465,0,0,0,0,0,25500,0,0,0,'Stefan','Death Knight Bot','',0,80,80,2,35,1,1,1,1,0,0,3300,2000,1,1,6,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'death_knight_bot',NULL,-1),\n+(70501,0,0,0,0,0,4449,0,0,0,'Imp',NULL,'',0,80,80,2,35,0,1.2,1.3,1,0,0,2000,2000,1,1,8,0,0,0,0,3,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,1,0,2316304496,'warlock_pet_bot',NULL,-1),\n+(70502,0,0,0,0,0,1132,0,0,0,'Voidwalker',NULL,'',0,80,80,2,35,0,1.2,1.3,1,0,0,2000,2000,1,1,8,0,0,0,0,3,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,1,0,2316304496,'warlock_pet_bot',NULL,-1),\n+(70503,0,0,0,0,0,4162,0,0,0,'Succubus',NULL,'',0,80,80,2,35,0,1.2,1.3,1,0,0,2000,2000,1,1,8,0,0,0,0,3,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,1,0,2316304496,'warlock_pet_bot',NULL,-1),\n+(70504,0,0,0,0,0,850,0,0,0,'Felhunter',NULL,'',0,80,80,2,35,0,1.2,1.3,1,0,0,2000,2000,1,1,8,0,0,0,0,3,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,1,0,2316304496,'warlock_pet_bot',NULL,-1),\n+(70505,0,0,0,0,0,14255,0,0,0,'Felguard',NULL,'',0,80,80,2,35,0,1.2,1.3,1,0,0,2000,2000,1,1,8,0,0,0,0,3,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,1,0,2316304496,'warlock_pet_bot',NULL,-1),\n+(70506,0,0,0,0,0,368,0,0,0,'Spider',NULL,'',0,80,80,2,35,0,1.2,1.3,1,0,0,2000,2000,1,1,1,0,0,0,0,1,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2316304496,'hunter_pet_bot',NULL,-1),\n+(70507,0,0,0,0,0,4312,0,0,0,'Serpent',NULL,'',0,80,80,2,35,0,1.2,1.3,1,0,0,2000,2000,1,1,1,0,0,0,0,1,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2316304496,'hunter_pet_bot',NULL,-1),\n+(70508,0,0,0,0,0,16724,0,0,0,'Bird of Prey',NULL,'',0,80,80,2,35,0,1.2,1.3,1,0,0,2000,2000,1,1,1,0,0,0,0,1,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2316304496,'hunter_pet_bot',NULL,-1),\n+(70509,0,0,0,0,0,8808,0,0,0,'Bat',NULL,'',0,80,80,2,35,0,1.2,1.3,1,0,0,2000,2000,1,1,1,0,0,0,0,1,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2316304496,'hunter_pet_bot',NULL,-1),\n+(70510,0,0,0,0,0,17562,0,0,0,'Wind Serpent',NULL,'',0,80,80,2,35,0,1.2,1.3,1,0,0,2000,2000,1,1,1,0,0,0,0,1,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2316304496,'hunter_pet_bot',NULL,-1),\n+(70511,0,0,0,0,0,20308,0,0,0,'Ravager',NULL,'',0,80,80,2,35,0,1.2,1.3,1,0,0,2000,2000,1,1,1,0,0,0,0,1,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2316304496,'hunter_pet_bot',NULL,-1),\n+(70512,0,0,0,0,0,17545,0,0,0,'Dragonhawk',NULL,'',0,80,80,2,35,0,1.2,1.3,1,0,0,2000,2000,1,1,1,0,0,0,0,1,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2316304496,'hunter_pet_bot',NULL,-1),\n+(70513,0,0,0,0,0,19405,0,0,0,'Nether Ray',NULL,'',0,80,80,2,35,0,1.2,1.3,1,0,0,2000,2000,1,1,1,0,0,0,0,1,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2316304496,'hunter_pet_bot',NULL,-1),\n+(70514,0,0,0,0,0,17753,0,0,0,'Sporebat',NULL,'',0,80,80,2,35,0,1.2,1.3,1,0,0,2000,2000,1,1,1,0,0,0,0,1,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2316304496,'hunter_pet_bot',NULL,-1),\n+(70515,0,0,0,0,0,15590,0,0,0,'Carrion Bird',NULL,'',0,80,80,2,35,0,1.2,1.3,1,0,0,2000,2000,1,1,1,0,0,0,0,1,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2316304496,'hunter_pet_bot',NULL,-1),\n+(70516,0,0,0,0,0,11319,0,0,0,'Raptor',NULL,'',0,80,80,2,35,0,1.2,1.3,1,0,0,2000,2000,1,1,1,0,0,0,0,1,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2316304496,'hunter_pet_bot',NULL,-1),\n+(70517,0,0,0,0,0,741,0,0,0,'Wolf',NULL,'',0,80,80,2,35,0,1.2,1.3,1,0,0,2000,2000,1,1,1,0,0,0,0,1,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2316304496,'hunter_pet_bot',NULL,-1),\n+(70518,0,0,0,0,0,1220,0,0,0,'Tallstrider',NULL,'',0,80,80,2,35,0,1.2,1.3,1,0,0,2000,2000,1,1,1,0,0,0,0,1,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2316304496,'hunter_pet_bot',NULL,-1),\n+(70519,0,0,0,0,0,321,0,0,0,'Cat',NULL,'',0,80,80,2,35,0,1.2,1.3,1,0,0,2000,2000,1,1,1,0,0,0,0,1,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2316304496,'hunter_pet_bot',NULL,-1),\n+(70520,0,0,0,0,0,2714,0,0,0,'Hyena',NULL,'',0,80,80,2,35,0,1.2,1.3,1,0,0,2000,2000,1,1,1,0,0,0,0,1,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2316304496,'hunter_pet_bot',NULL,-1),\n+(70521,0,0,0,0,0,29113,0,0,0,'Wasp',NULL,'',0,80,80,2,35,0,1.2,1.3,1,0,0,2000,2000,1,1,1,0,0,0,0,1,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2316304496,'hunter_pet_bot',NULL,-1),\n+(70522,0,0,0,0,0,17798,0,0,0,'Teromoth',NULL,'',0,80,80,2,35,0,1.2,1.3,1,0,0,2000,2000,1,1,1,0,0,0,0,1,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2316304496,'hunter_pet_bot',NULL,-1),\n+(70523,0,0,0,0,0,20790,0,0,0,'Scorpid',NULL,'',0,80,80,2,35,0,1.2,1.3,1,0,0,2000,2000,1,1,1,0,0,0,0,1,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2316304496,'hunter_pet_bot',NULL,-1),\n+(70524,0,0,0,0,0,1244,0,0,0,'Turtle',NULL,'',0,80,80,2,35,0,1.2,1.3,1,0,0,2000,2000,1,1,1,0,0,0,0,1,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2316304496,'hunter_pet_bot',NULL,-1),\n+(70525,0,0,0,0,0,809,0,0,0,'Gorilla',NULL,'',0,80,80,2,35,0,1.2,1.3,1,0,0,2000,2000,1,1,1,0,0,0,0,1,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2316304496,'hunter_pet_bot',NULL,-1),\n+(70526,0,0,0,0,0,706,0,0,0,'Bear',NULL,'',0,80,80,2,35,0,1.2,1.3,1,0,0,2000,2000,1,1,1,0,0,0,0,1,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2316304496,'hunter_pet_bot',NULL,-1),\n+(70527,0,0,0,0,0,381,0,0,0,'Boar',NULL,'',0,80,80,2,35,0,1.2,1.3,1,0,0,2000,2000,1,1,1,0,0,0,0,1,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2316304496,'hunter_pet_bot',NULL,-1),\n+(70528,0,0,0,0,0,1938,0,0,0,'Crab',NULL,'',0,80,80,2,35,0,1.2,1.3,1,0,0,2000,2000,1,1,1,0,0,0,0,1,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2316304496,'hunter_pet_bot',NULL,-1),\n+(70529,0,0,0,0,0,1250,0,0,0,'Crocolisk',NULL,'',0,80,80,2,35,0,1.2,1.3,1,0,0,2000,2000,1,1,1,0,0,0,0,1,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2316304496,'hunter_pet_bot',NULL,-1),\n+(70530,0,0,0,0,0,19998,0,0,0,'Warp Stalker',NULL,'',0,80,80,2,35,0,1.2,1.3,1,0,0,2000,2000,1,1,1,0,0,0,0,1,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2316304496,'hunter_pet_bot',NULL,-1),\n+(70531,0,0,0,0,0,11087,0,0,0,'Silithid',NULL,'',0,80,80,2,35,0,1.2,1.3,1,0,0,2000,2000,1,1,1,0,0,0,0,1,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2316304496,'hunter_pet_bot',NULL,-1),\n+(70532,0,0,0,0,0,10810,0,0,0,'Chimaera',NULL,'',0,80,80,2,35,0,1.2,1.3,1,0,0,2000,2000,1,1,1,0,0,0,0,1,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2316304496,'hunter_pet_bot',NULL,-1),\n+(70533,0,0,0,0,0,29673,0,0,0,'Spirit Beast',NULL,'',0,80,80,2,35,0,1.2,1.3,1,0,0,2000,2000,1,1,1,0,0,0,0,1,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2316304496,'hunter_pet_bot',NULL,-1),\n+(70534,0,0,0,0,0,12168,0,0,0,'Core Hound',NULL,'',0,80,80,2,35,0,1.2,1.3,1,0,0,2000,2000,1,1,1,0,0,0,0,1,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2316304496,'hunter_pet_bot',NULL,-1),\n+(70535,0,0,0,0,0,5239,0,0,0,'Devilsaur',NULL,'',0,80,80,2,35,0,1.2,1.3,1,0,0,2000,2000,1,1,1,0,0,0,0,1,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2316304496,'hunter_pet_bot',NULL,-1),\n+(70536,0,0,0,0,0,26279,0,0,0,'Rhino',NULL,'',0,80,80,2,35,0,1.2,1.3,1,0,0,2000,2000,1,1,1,0,0,0,0,1,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2316304496,'hunter_pet_bot',NULL,-1),\n+(70537,0,0,0,0,0,13212,0,0,0,'Worm',NULL,'',0,80,80,2,35,0,1.2,1.3,1,0,0,2000,2000,1,1,1,0,0,0,0,1,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2316304496,'hunter_pet_bot',NULL,-1),\n+(70538,0,0,0,0,0,24994,24993,24992,24995,'Risen Ghoul',NULL,'',0,80,80,2,35,0,1.2,1.3,1,0,0,2000,2000,1,1,8,0,0,0,0,6,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2316304496,'deathknight_pet_bot',NULL,-1),\n+(70542,0,0,0,0,0,19110,0,0,0,'Shadowfiend',NULL,'',0,80,80,2,35,0,1.2,1.3,1,0,5,1500,1500,1,1,2,0,0,0,0,10,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2316304496,'priest_pet_bot',NULL,-1),\n+(70543,0,0,0,0,0,21114,0,0,0,'Spirit Wolf',NULL,'',0,80,80,2,35,0,1.2,1.3,1,0,0,1500,1500,1,1,1,0,0,0,0,1,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2316304496,'shaman_pet_bot',NULL,-1),\n+(70544,0,0,0,0,0,525,0,0,0,'Water Elemental',NULL,'',0,80,80,2,35,0,1.2,1.3,1,0,0,2000,2000,1,1,8,0,0,0,0,4,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2316304496,'mage_pet_bot',NULL,-1),\n+(70545,0,0,0,0,0,18922,0,0,0,'Treant',NULL,'',0,80,80,2,35,0,1.2,1.3,1,0,0,2000,2000,1,1,1,0,0,0,0,4,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2316304496,'druid_pet_bot',NULL,-1),\n+(70551,0,0,0,0,0,17659,0,0,0,'Gorkramato','Blademaster Bot','',0,81,81,2,35,1,1,1,1,4,0,1940,1940,1,1,1,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,1,0,2383413368,'blademaster_bot',NULL,-1),\n+(70552,0,0,0,0,0,17659,0,0,0,'Mirror Image (Blademaster)','Blademaster bot','',0,81,81,2,35,1,1,1,1,4,0,1940,1940,1,1,1,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,1,0,2383413368,'blademaster_bot',NULL,-1),\n+(70553,0,0,0,0,0,15343,0,0,0,'Osis','Obsidian Destroyer Bot','',0,83,83,2,35,1,1,1,0.7,2,0,1350,1350,1,1,9,0,32,0,0,10,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'sphynx_bot',NULL,-1),\n+(70554,0,0,0,0,0,15343,0,0,0,'Amot','Obsidian Destroyer Bot','',0,83,83,2,35,1,1,1,0.7,2,0,1350,1350,1,1,9,0,32,0,0,10,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'sphynx_bot',NULL,-1),\n+(70555,0,0,0,0,0,6769,0,0,0,'Detrae','Archmage Bot','',0,81,81,2,35,1,1,1,1,4,0,1420,1420,1,1,8,0,32,0,0,7,6144,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'archmage_bot',NULL,-1),\n+(70556,0,0,0,0,0,5561,0,0,0,'Water Elemental',NULL,'',0,81,81,2,35,0,1.2,1.3,1.3,0,0,1500,1500,1,1,1,0,0,0,0,4,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2316304496,'archmage_pet_bot',NULL,-1),\n+(70557,0,0,0,0,0,348,0,0,0,'Neroth','Dreadlord Bot','',0,83,83,2,35,1,1,1,1.2,2,0,2600,2600,1,1,9,0,32,0,0,3,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'dreadlord_bot',NULL,-1),\n+(70558,0,0,0,0,0,348,0,0,0,'Fearoth','Dreadlord Bot','',0,83,83,2,35,1,1,1,1.2,2,0,2600,2600,1,1,9,0,32,0,0,3,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'dreadlord_bot',NULL,-1),\n+(70559,0,0,0,0,0,348,0,0,0,'Zalamon','Dreadlord Bot','',0,83,83,2,35,1,1,1,1.2,2,0,2600,2600,1,1,9,0,32,0,0,3,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'dreadlord_bot',NULL,-1),\n+(70560,0,0,0,0,0,348,0,0,0,'Lotthicus','Dreadlord Bot','',0,83,83,2,35,1,1,1,1.2,2,0,2600,2600,1,1,9,0,32,0,0,3,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'dreadlord_bot',NULL,-1),\n+(70561,0,0,0,0,0,348,0,0,0,'Ramarot','Dreadlord Bot','',0,83,83,2,35,1,1,1,1.2,2,0,2600,2600,1,1,9,0,32,0,0,3,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'dreadlord_bot',NULL,-1),\n+(70562,0,0,0,0,0,169,0,0,0,'Infernal',NULL,'',0,83,83,2,35,0,1.2,1.3,1.5,0,2,1350,1350,1,1,1,0,0,0,0,3,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2316304496,'dreadlord_pet_bot',NULL,-1),\n+(70563,0,0,0,0,0,15511,0,0,0,'Eanor','Spell Breaker Bot','',0,81,81,2,35,1,1,1,1.1,4,0,1900,1900,1,1,2,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'spellbreaker_bot',NULL,-1),\n+(70564,0,0,0,0,0,15511,0,0,0,'Narsen','Spell Breaker Bot','',0,81,81,2,35,1,1,1,1.1,4,0,1900,1900,1,1,2,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'spellbreaker_bot',NULL,-1),\n+(70565,0,0,0,0,0,15511,0,0,0,'Caelnor','Spell Breaker Bot','',0,81,81,2,35,1,1,1,1.1,4,0,1900,1900,1,1,2,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'spellbreaker_bot',NULL,-1),\n+(70566,0,0,0,0,0,15511,0,0,0,'Daenste','Spell Breaker Bot','',0,81,81,2,35,1,1,1,1.1,4,0,1900,1900,1,1,2,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'spellbreaker_bot',NULL,-1),\n+(70567,0,0,0,0,0,15511,0,0,0,'Neshdar','Spell Breaker Bot','',0,81,81,2,35,1,1,1,1.1,4,0,1900,1900,1,1,2,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'spellbreaker_bot',NULL,-1),\n+(70568,0,0,0,0,0,30072,0,0,0,'Mara','Dark Ranger Bot','',0,82,82,2,35,1,1,1,1,2,0,2000,2000,1,1,6,0,32,0,0,6,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'dark_ranger_bot',NULL,-1),\n+(70569,0,0,0,0,0,30072,0,0,0,'Tani','Dark Ranger Bot','',0,82,82,2,35,1,1,1,1,2,0,2000,2000,1,1,6,0,32,0,0,6,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'dark_ranger_bot',NULL,-1),\n+(70570,0,0,0,0,0,30072,0,0,0,'Eva','Dark Ranger Bot','',0,82,82,2,35,1,1,1,1,2,0,2000,2000,1,1,6,0,32,0,0,6,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'dark_ranger_bot',NULL,-1),\n+(70571,0,0,0,0,0,30072,0,0,0,'Darise','Dark Ranger Bot','',0,82,82,2,35,1,1,1,1,2,0,2000,2000,1,1,6,0,32,0,0,6,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'dark_ranger_bot',NULL,-1),\n+(70572,0,0,0,0,0,30072,0,0,0,'Lyra','Dark Ranger Bot','',0,82,82,2,35,1,1,1,1,2,0,2000,2000,1,1,6,0,32,0,0,6,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'dark_ranger_bot',NULL,-1),\n+(70573,0,0,0,0,0,30363,0,0,0,'Dark Minion',NULL,'',0,83,83,2,35,0,1.2,1.3,0.8,0,0,2000,2000,1,1,1,0,0,0,0,6,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2316304480,'dark_ranger_pet_bot',NULL,-1),\n+(70574,0,0,0,0,0,30363,0,0,0,'Dark Minion',NULL,'',0,83,83,2,35,0,1.2,1.3,0.9,1,0,2000,2000,1,1,1,0,0,0,0,6,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2316304480,'dark_ranger_pet_bot',NULL,-1),\n+(70575,0,0,0,0,0,23277,0,0,0,'Prakar','Necromancer Bot','',0,82,82,2,35,1,1,1,1,1,0,1800,1800,1,1,9,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'necromancer_bot',NULL,-1),\n+(70576,0,0,0,0,0,23277,0,0,0,'Rothik','Necromancer Bot','',0,82,82,2,35,1,1,1,1,1,0,1800,1800,1,1,9,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'necromancer_bot',NULL,-1),\n+(70577,0,0,0,0,0,23277,0,0,0,'Hexir','Necromancer Bot','',0,82,82,2,35,1,1,1,1,1,0,1800,1800,1,1,9,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'necromancer_bot',NULL,-1),\n+(70578,0,0,0,0,0,23277,0,0,0,'Fikhar','Necromancer Bot','',0,82,82,2,35,1,1,1,1,1,0,1800,1800,1,1,9,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'necromancer_bot',NULL,-1),\n+(70579,0,0,0,0,0,23277,0,0,0,'Drothum','Necromancer Bot','',0,82,82,2,35,1,1,1,1,1,0,1800,1800,1,1,9,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'necromancer_bot',NULL,-1),\n+(70580,0,0,0,0,0,200,0,0,0,'Skeleton',NULL,'',0,82,82,2,35,0,1.2,1.3,1.1,0,0,2000,2000,1,1,1,0,0,0,0,6,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2316304480,'necromancer_pet_bot',NULL,-1),\n+(70581,0,0,0,0,0,20748,0,0,0,'Kondra','Sea Witch Bot','',0,83,83,2,35,1,1,1,0.5,2,0,1900,1900,1,1,8,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'sea_witch_bot',NULL,-1),\n+(70582,0,0,0,0,0,20748,0,0,0,'Serpentra','Sea Witch Bot','',0,83,83,2,35,1,1,1,0.5,2,0,1900,1900,1,1,8,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'sea_witch_bot',NULL,-1),\n+(70583,0,0,0,0,0,20748,0,0,0,'Serena','Sea Witch Bot','',0,83,83,2,35,1,1,1,0.5,2,0,1900,1900,1,1,8,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'sea_witch_bot',NULL,-1),\n+(70584,0,0,0,0,0,20748,0,0,0,'Asprah','Sea Witch Bot','',0,83,83,2,35,1,1,1,0.5,2,0,1900,1900,1,1,8,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'sea_witch_bot',NULL,-1),\n+(70585,0,0,0,0,0,20748,0,0,0,'Charib\\'dishal','Sea Witch Bot','',0,83,83,2,35,1,1,1,0.5,2,0,1900,1900,1,1,8,0,32,0,0,7,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'sea_witch_bot',NULL,-1),\n+(70586,0,0,0,0,0,20211,0,0,0,'Tornado','','',0,83,83,2,35,0,0.9,0.9,3,1,0,2000,2000,1,1,1,33554432,32768,0,0,4,33554432,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2852134912,'sea_witch_pet_bot',NULL,-1),\n+(70587,0,0,0,0,0,27395,0,0,0,'Tuten\\'arak','Crypt Lord Bot','',0,83,83,2,35,1,1,1,0.5,2,0,1900,1900,1,1,1,0,32,0,0,6,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'crypt_lord_bot',NULL,-1),\n+(70588,0,0,0,0,0,27395,0,0,0,'Anubiros','Crypt Lord Bot','',0,83,83,2,35,1,1,1,0.5,2,0,1900,1900,1,1,1,0,32,0,0,6,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'crypt_lord_bot',NULL,-1),\n+(70589,0,0,0,0,0,27395,0,0,0,'Nephri\\'thos','Crypt Lord Bot','',0,83,83,2,35,1,1,1,0.5,2,0,1900,1900,1,1,1,0,32,0,0,6,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'crypt_lord_bot',NULL,-1),\n+(70590,0,0,0,0,0,27395,0,0,0,'Arak-arahm','Crypt Lord Bot','',0,83,83,2,35,1,1,1,0.5,2,0,1900,1900,1,1,1,0,32,0,0,6,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'crypt_lord_bot',NULL,-1),\n+(70591,0,0,0,0,0,27395,0,0,0,'Horus\\'aman','Crypt Lord Bot','',0,83,83,2,35,1,1,1,0.5,2,0,1900,1900,1,1,1,0,32,0,0,6,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2383413360,'crypt_lord_bot',NULL,-1),\n+(70592,0,0,0,0,0,11094,0,0,0,'Carrion Beetle','','',0,83,83,2,35,0,1.05,1.05,0.5,0,0,1500,1500,1,1,1,0,0,0,0,6,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2316304480,'crypt_lord_pet_bot',NULL,-1),\n+(70593,0,0,0,0,0,11094,0,0,0,'Carrion Beetle','','',0,83,83,2,35,0,1.05,1.05,0.7,0,0,1500,1500,1,1,1,0,0,0,0,6,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2316304480,'crypt_lord_pet_bot',NULL,-1),\n+(70594,0,0,0,0,0,11094,0,0,0,'Carrion Beetle','','',0,83,83,2,35,0,1.05,1.05,0.9,0,0,1500,1500,1,1,1,0,0,0,0,6,4096,0,0,0,0,0,0,0,'',0,1,1,1,1,1,1,0,0,0,0,0,2316304480,'crypt_lord_pet_bot',NULL,-1),\n+(70595,0,0,0,0,0,19252,0,0,0,'Locust','','',0,83,83,2,35,0,1.4,1.4,0.25,1,0,1200,1200,1,1,1,33554432,0,0,0,6,4096,0,0,0,0,0,0,0,'',0,2,1,1,1,1,1,0,0,0,0,0,2852266016,'crypt_lord_pet_bot',NULL,-1);\n\\ No newline at end of file\ndiff --git a/sql/custom/world/npcbot_2000_00_00_00_npc_text.sql b/sql/custom/world/npcbot_2000_00_00_00_npc_text.sql\nnew file mode 100644\nindex 0000000000..6856cc3634\n--- /dev/null\n+++ b/sql/custom/world/npcbot_2000_00_00_00_npc_text.sql\n@@ -0,0 +1,430 @@\n+--\n+DELETE FROM `npc_text` WHERE `ID` IN (70001,70002,70003,70004,70005,70006,70007,70008,70009,70010,70011,70012,70013,70101,70102,70103,70104,70105,70106,70107,70108,70109,70201,70202,70203,70204,70300,70301,70302,70303,70304,70305,70306,70307,70308,70309,70310,70311,70312,70313,70314,70315,70316,70317,70318,70319,70320,70321,70322,70323,70324,70325,70326,70327,70328,70329,70330,70331,70332,70333,70334,70335,70336,70337,70338,70339,70340,70341,70342,70343,70344,70345,70346,70347,70348,70349,70350,70351,70352,70353,70354,70355,70356,70357,70358,70359,70360,70361,70362,70363,70364,70365,70366,70367,70368,70369,70370,70371,70372,70373,70374,70375,70376,70377,70378,70379,70380,70381,70382,70383,70384,70385,70386,70387,70388,70389,70390,70391,70392,70393,70394,70395,70396,70397,70398,70399,70400,70401,70402,70403,70404,70405,70406,70407,70408,70409,70410,70411,70412,70413,70414,70415,70416,70417,70418,70419,70420,70421,70422,70423,70424,70425,70426,70427,70428,70429,70430,70431,70432,70433,70434,70435,70436,70437,70438,70439,70440,70441,70442,70443,70444,70445,70446,70447,70448,70449,70450,70451,70452,70453,70454,70455,70456,70457,70458,70459,70460,70461,70462,70463,70464,70465,70466,70467,70468,70469,70470,70471,70472,70473,70474,70475,70476,70477,70478,70479,70480,70481,70482,70483,70484,70485,70486,70487,70488,70489,70490,70491,70492,70493,70494,70495,70496,70497,70498,70499,70500,70501,70502,70503,70504,70505,70506,70507,70508,70509,70510,70511,70512,70513,70514,70515,70516,70517,70518,70519,70520,70521,70522,70523,70524,70525,70526,70527,70528,70529,70530,70531,70532,70533,70534,70535,70536,70537,70538,70539,70540,70541,70542,70543,70544,70545,70546,70547,70548,70549,70550,70551,70552,70553,70554,70555,70556,70557,70558,70559,70560,70561,70562,70563,70564,70565,70566,70567,70568,70569,70570,70571,70572,70573,70574,70575,70576,70577,70578,70579,70580,70581,70582,70583,70584,70585,70586,70587,70588,70589,70590,70591,70592,70593,70594,70595,70596,70597,70598,70599,70600,70601,70602,70603,70604,70605,70606,70607,70608,70609,70610,70611,70612,70613,70614,70615,70616,70617,70618,70619,70620,70621,70622,70623,70624,70625,70626,70627,70628,70629,70630,70631,70632,70633,70634,70635,70636,70637,70638,70639,70640,70641,70642,70643,70644,70645,70646,70647,70648,70649,70650,70651,70652,70653,70654,70655,70656,70657,70658,70659,70660,70661,70662,70663,70664,70665,70666,70667,70668,70669,70670,70671,70672,70673,70674,70675,70676,70677,70678,70679,70680,70681,70682,70683,70684,70685,70686,70687,70688,70689,70690,70691,70692,70693,70694,70695,70696,70697,70698,70699,70700);\n+INSERT INTO `npc_text`(`ID`,`text0_0`,`text0_1`,`BroadcastTextID0`,`lang0`,`Probability0`,`EmoteDelay0_0`,`Emote0_0`,`EmoteDelay0_1`,`Emote0_1`,`EmoteDelay0_2`,`Emote0_2`,`text1_0`,`text1_1`,`BroadcastTextID1`,`lang1`,`Probability1`,`EmoteDelay1_0`,`Emote1_0`,`EmoteDelay1_1`,`Emote1_1`,`EmoteDelay1_2`,`Emote1_2`,`text2_0`,`text2_1`,`BroadcastTextID2`,`lang2`,`Probability2`,`EmoteDelay2_0`,`Emote2_0`,`EmoteDelay2_1`,`Emote2_1`,`EmoteDelay2_2`,`Emote2_2`,`text3_0`,`text3_1`,`BroadcastTextID3`,`lang3`,`Probability3`,`EmoteDelay3_0`,`Emote3_0`,`EmoteDelay3_1`,`Emote3_1`,`EmoteDelay3_2`,`Emote3_2`,`text4_0`,`text4_1`,`BroadcastTextID4`,`lang4`,`Probability4`,`EmoteDelay4_0`,`Emote4_0`,`EmoteDelay4_1`,`Emote4_1`,`EmoteDelay4_2`,`Emote4_2`,`text5_0`,`text5_1`,`BroadcastTextID5`,`lang5`,`Probability5`,`EmoteDelay5_0`,`Emote5_0`,`EmoteDelay5_1`,`Emote5_1`,`EmoteDelay5_2`,`Emote5_2`,`text6_0`,`text6_1`,`BroadcastTextID6`,`lang6`,`Probability6`,`EmoteDelay6_0`,`Emote6_0`,`EmoteDelay6_1`,`Emote6_1`,`EmoteDelay6_2`,`Emote6_2`,`text7_0`,`text7_1`,`BroadcastTextID7`,`lang7`,`Probability7`,`EmoteDelay7_0`,`Emote7_0`,`EmoteDelay7_1`,`Emote7_1`,`EmoteDelay7_2`,`Emote7_2`,`VerifiedBuild`) VALUES\n+(70001,'I live only to serve the master.',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70002,'You need something?',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70003,'Mortals... usually I kill wretches like you at sight.',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70004,'<You see what is supposed to be an obsidian destroyer. This one looks different though, damaged and faded, and does not react to your presence. You recall the Scourge have been using their own versions of those at some point in the past. How the hell did it end up here? After further examination you notice an opening on creature\\'s back.>',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70005,'<Obsidian Destroyer stares at you and makes a low growling sound.>',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70006,'Are you surprised, mortal? As a lesser nathrezim I have to resort to seeking out allies. You look like you could amuse me at least.',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70007,'What is it now, mortal?',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70008,'Can you just leave me be? <sigh>',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70009,'Now what?',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70010,'<You see an emaciated naga matron. She looks tired and weak, and avoids looking at you.>$B$BS-s-s-spare the words, mortal...',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70011,'Did I mess-s-s-s up my hair again? <She brushes her \\\"hair\\\">$B...No, I didn\\'t. Then what is it?',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70012,'<Battle-scarred Crypt Lord stands before you, he is obviously uncontrolled. Without master this mighty undead nerubian lord has lost most of his power>$B$BWhat will it be, tiny creature? Your flesh will do like any other...',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70013,'I consume the living and the dead.',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70101,'|cffff3300Blademaster|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\\\"An elite swordsman, former member of Burning Blade clan, now an elite fighter within the Horde\\\".$B$BMain attribute: Agility.$B$BNetherwalk (Windwalk). Allows Blademaster to become invisible, and move faster for a set amount of time. When the Blademaster attacks a unit to break invisibility, he will deal bonus damage.$B$BMirror Image. Confuses the enemy by creating illusions of the Blademaster and dispelling all magic from the Blademaster.$B$BCritical Strike (passive). Gives a 15% chance to deal critical x2(x3,x4) times normal damage on his attacks.$B$BBladestorm (NIY). Grants immunity to magic and deals damage to all surrounding enemies.$B$B',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70102,'|cff9900ccObsidian Destroyer|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\\\"An obsidian winged monstrocity with insatiable hunger for magic\\\".$B$BHigh armor, very high resistances, partially immune to magic, loses mana over time and doesn\\'t benefit from passive mana regeneration effects, mail/plate armor, dual-wielding wands, deals spellshadow damage, no physical attack, cannot attack enemies not in front while moving, spell power bonus: 50% attack power + 200% intellect + wands damage.$B$BDevour Magic. Dispels up to 2 magic effects from enemies, up to 2 magic effects and up to 2 curses from allies and damaging summoned units in 20 yards area. Every dispelled effect restores 20% mana and 5% health, 7 seconds cooldown.$B$BShadow Blast. Empowered attack that deals increased splash damage.$B$BDrain Mana. Drains all mana (limited by caster\\'s mana pool) from a random friendly unit.$B$BReplenish Mana. Energizes surrounding party and raid members within 25 yards for 3% of their maximum mana nullifying caster\\'s mana, 3 seconds cooldown.$B$BRegenerating Aura. Heals surrounding party and raid members within 25 yards for 3% of their maximum health nullifying caster\\'s mana, 3 seconds cooldown.$B$BShadow Armor (passive). Restores mana equal to a percentage of damage taken.$B$B',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70103,'|cff0000ddArchmage|r$b|cffdd6600-=Warcraft III tribute=-|r$B$BSpell damage taken reduced by 35%, partially immune to control effects, cloth armor, deals spellsfire/spellfrost damage, no physical attack, spell power bonus: 100% intellect. Main attribute: Intellect.$B$BBlizzard. Your typical blizzard, just a little more powerful, 6 seconds cooldown.$B$BSummon Water Elemental. Summons a water elemental to attack archmage\\'s enemies for 1 min, 20 seconds cooldown.$B$BBrilliance Aura. Increases maximum mana by 10% and greatly increases mana regeneration of party and raid members within 40 yards.$B$BMass Teleport. NIY.$B$B',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70104,'|cff9900ccDreadlord|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\\\"Incredibly powerful demon who wields power of darkness and mental domination\\\".$B$BHigh armor, high resistances, partially immune to control effects, damage taken speeds up spells recharge, plate armor, deals melee/spellshadow damage, bonus damage against incapacitated targets, spell power bonus: 200% strength. Main attribute: Strength.$B$BCarrion Swarm. Sends a horde of bats combined with chaotic magic to damage enemies in a very large frontal cone, cannot crit, 10 seconds cooldown.$B$BSleep. Puts the enemy target to sleep for 60 seconds and allows next physical attack on that target to bypass armor, direct damage caused will awaken the target, 6 seconds cooldown.$B$BVampiric Aura. Increases physical critical damage by 5% and heals party and raid members within 40 yards for a percentage (100% for Dreadlord and 25% for everyone else) of damage done by melee physical attacks and Carrion Swarm, no threat.$B$BSummon Infernal Servant. Calls an infernal down from the sky dealing damage and stunning enemy units, infernal is very resistant to magic and lasts 180 seconds, 180 seconds cooldown.$B$B',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70105,'|cff0000ddSpell Breaker|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\\\"An elven warrior trained to disrupt and contort magical energies\\\".$B$BSpell damage taken reduced by 75%, partially immune to control effects, armor penalty -30%, mail/plate armor, deals melee/arcane damage, spell power bonus: 200% strength. Main attribute: Strength.$B$BSteal Magic (Spellsteal). Steals a benefical spell from an enemy and applies it to a nearby ally or removes a negative spell from an ally and applies it to a nearby enemy, affects magic and curse effects, 2 seconds cooldown.$B$BFeedback (passive). Successful melee attacks burn target\\'s mana equal to damage caused (increased by spellpower) dealing arcane damage. If target\\'s mana is depleted, Spell Breaker\\'s melee attacks will do triple damage with increased critical strike chance. If target does not have mana, Spell Breaker will gain mana equal to 25% of damage dealt.$B$B',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70106,'|cff9900ccDark Ranger|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\\\"A former ranger of Quel\\'thalas forcibly raised from the dead\\\".$B$BSpell damage taken reduced by 35%, undead, partially immune to control effects, leather/cloth armor, deals physical/spellshadow damage, stick to shadows and generates no threat, spell power bonus: 50% intellect. Main attribute: Agility.$B$BSilence. Silences an enemy and up to 4 nearby targets for 8 seconds, 15 seconds cooldown.$B$BBlack Arrow. Fires a cursed arrow dealing 150% weapon damage and additional spellshadow damage over time. If affected target dies from Dark Ranger\\'s damage, Dark Minion will spawn from the corpse (maximum 5 Minions, 80 seconds duration, only works on humanoids, beasts and dragonkin). Deals five times more damage if target is under 20% health.$B$BDrain Life. Drains health from an enemy every second for 5 seconds, healing Dark Ranger for 200% of the drained amount.$B$B',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70107,'|cff9900ccNecromancer|r$b|cffdd6600-=Warcraft III / Diablo II tribute=-|r$B$BSpell damage taken reduced by 20%, partially immune to control effects, cloth armor, deals spellshadow damage, no physical attack, spell power bonus: 100% intellect. Main attribute: Intellect.$B$BRaise Dead. Raises 2 Skeletons from a corpse (maximum 6 Skeletons, 65 seconds duration, only works on humanoids, beasts and dragonkin).$B$BUnholy Frenzy. Increases target\\'s melee attack speed by 75%, but constantly drains health. Lasts 45 seconds. Cannot be cancelled. Unlocked at level 30.$B$BCorpse Explosion. Causes a corpse to explode, dealing damage equal to 35% to 75% of dead unit\\'s maximum health (depends on Necromancer\\'s level) to all surrounding enemies. This damage generates no threat. Unlocked at level 40.$B$BCripple. Reduces target\\'s movement speed, melee attack speed and total strength by 50% for 60 seconds. Unlocked at level 50.$B$B',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70108,'|cff0000ddSea Witch|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\\\"A vicious scaly denizen of ocean often associated with the coming of prodigious storms\\\".$B$BSpell damage taken reduced by 30%, partially immune to control effects, cloth armor, deals physical/spellfrost/spellstorm damage, attack power bonus: agility x2, spell power bonus: 200% intellect. Main attribute: Intellect.$B$BForked Lightning. Calls forth a cone of lightning to damage enemies. Hits from 2 to all targets (depending on Sea Witch\\'s level), stunning them for 2 seconds. This damage generates no threat.$B$BFrost Arrows. Imbues arrow with spellfrost for extra damage, slowing target\\'s movement, attack and casting speed by 30% to 70% (depending on Sea Witch\\'s level).$B$BMana Shield. Creates a shield that absorbs 100% incoming (non-mitigated) damage by using Sea Witch\\'s mana. Effect ranges from 1 damage per 10 mana to 10 damage per 1 mana (depending on Sea Witch\\'s level).$B$BTornado. Summons a fierce tornado that damages and slows nearby enemy units, sometimes incapacitating them completely. Tornado grows over time outdoors, increasing damage dealt and area of effect, but shrinks indoors, dissipating quickly. Unlocked at level 60.$B$BNaga (Passive). Swim speed, damage and dodge chance are greatly increased while in water.$B$B',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70109,'|cff9900ccCrypt Lord|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\\\"Ancient behemoth, once one of the kings of Azjol-Nerub, now an undead monster within ranks of Lich King\\'s mightiest warriors\\\".$B$BVery high armor, increased resistances, partially immune to control effects, immune to poison-based effects, mail/plate armor, deals melee/spellshadow damage, spell power bonus: 200% strength. Main attribute: Strength.$B$BImpale. Crypt Lord slams the ground with his massive claws, shooting spikes out in a frontal cone, dealing damage and hurling enemy units into the air in their wake, stunning them. Unlocked at level 20.$B$BSpiked Carapace. Crypt Lord\\'s chitinous armor increases damage resistance and returns 15% to 50% damage to enemy melee attackers.$B$BCarrion Beetles. Crypt Lord progenerates a Carrion Beetle from a fresh corpse of an enemy to attack his enemies. Beetles are permanent but do not regenerate health and only 6 can be controlled at a time. Higher levels allow Crypt Lord to summon more powerful beetles. Unlocked at level 10.$B$BLocust Swarm. Crypt Lord releases a swarm of 20-40 (depends on Crypt Lord\\'s level) angry locusts that bite and tear at nearby enemy units, reducing their ability to move or attack. As they chew the enemy flesh, they convert it into a substance that restores hit points to the Crypt Lord when they return. Unlocked at level 40.$B$B',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70201,'There are always dudes ready to kill for money.',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70202,'Mercenaries are always in demand. Here is what available right now.',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70203,'Mercenaries are always in demand. Here is what available right now.',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70204,'Seems like there is nobody available right now, check again later.',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70300,'Die!',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70301,'Rezzing You',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70302,'Rezzing ',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70303,'your bot',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70304,'\\'s bot',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70305,'I can\\'t conjure water yet',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70306,'I can\\'t conjure food yet',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70307,'I can\\'t do it right now',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70308,'Here you go...',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70309,'Disabled',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70310,'Not ready yet',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70311,'Invalid object type',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70312,'Failed',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70313,'Done',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70314,'I am not shapeshifted',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70315,'I don\\'t have a healthstone',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70316,'I can\\'t create healthstones yet!',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70317,'WTF I don\\'t have lockpicking!',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70318,'My skill level in not high enough',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70319,'Changing my spec to ',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70320,'Arms',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70321,'Fury',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70322,'Protection',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70323,'Retribution',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70324,'Beast Mastery',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70325,'Marksmanship',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70326,'Survival',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70327,'Assassination',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70328,'Combat',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70329,'Subtlety',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70330,'Discipline',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70331,'Holy',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70332,'Shadow',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70333,'Blood',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70334,'Frost',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70335,'Unholy',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70336,'Elemental',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70337,'Enhancement',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70338,'Restoration',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70339,'Arcane',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70340,'Fire',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70341,'Affliction',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70342,'Demonology',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70343,'Destruction',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70344,'Balance',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70345,'Feral Combat',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70346,'Unknown',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70347,'Go away, weakling',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70348,' is not convinced',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70349,'I am not going to waste my time on just anything',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70350,'NIY',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70351,'NIY',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70352,'NIY',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70353,'I am ready',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70354,'Go away. I serve my master ',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70355,'unknown',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70356,' on You!',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70357,' on myself!',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70358,' on ',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70359,' used!',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70360,'bot tank',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70361,'class',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70362,'player',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70363,'master',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70364,'none',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70365,'Rank',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70366,'talent',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70367,'passive',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70368,'hidden',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70369,'known',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70370,'ability',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70371,'str',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70372,'agi',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70373,'sta',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70374,'int',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70375,'spi',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70376,'unk stat',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70377,'total',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70378,'Melee AP',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70379,'Ranged AP',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70380,'armor',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70381,'crit',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70382,'defense',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70383,'miss',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70384,'dodge',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70385,'parry',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70386,'block',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70387,'block value',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70388,'Damage taken melee',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70389,'Damage taken spell',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70390,'Damage range mainhand',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70391,'Damage mult mainhand',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70392,'Attack time mainhand',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70393,'Damage range offhand',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70394,'Damage mult offhand',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70395,'Attack time offhand',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70396,'Damage range ranged',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70397,'Damage mult ranged',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70398,'Attack time ranged',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70399,'min',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70400,'max',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70401,'DPS',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70402,'base hp',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70403,'total hp',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70404,'base mana',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70405,'total mana',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70406,'current mana',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70407,'spell power',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70408,'health regen_5 bonus',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70409,'mana regen_5 no cast',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70410,'mana regen_5 casting',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70411,'haste',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70412,'hit',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70413,'expertise',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70414,'armor penetration',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70415,'spell penetration',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70416,'pct',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70417,'holy',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70418,'fire',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70419,'nature',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70420,'frost',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70421,'shadow',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70422,'arcane',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70423,'Resistance',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70424,'Command states',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70425,'Follow',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70426,'Attack',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70427,'Stay',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70428,'Reset',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70429,'FullStop',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70430,'Follow distance',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70431,'Spec',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70432,'Bot roles mask main',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70433,'Bot roles mask gathering',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70434,'PvP kills',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70435,'players',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70436,'Died ',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70437,' times',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70438,'%s (bot) calms down',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70439,'<Debug>',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70440,'Are you sure you want to risk drawing ',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70441,'\\'s attention?',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70442,'<Insert Coin>',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70443,'Do you want to entice ',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70444,'<Try to make an offering>',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70445,'Do you wish to hire ',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70446,'<Hire bot>',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70447,'Manage equipment...',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70448,'Manage roles...',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70449,'Manage formation...',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70450,'Manage abilities...',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70451,'Manage talents...',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70452,'Give consumable...',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70453,'<Create group>',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70454,'<Create group (all bots)>',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70455,'<Add to group>',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70456,'<Add all bots to group>',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70457,'<Remove from group>',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70458,'Follow me',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70459,'Hold your position',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70460,'Stay here and don\\'t do anything',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70461,'I need food',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70462,'I need water',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70463,'I need a refreshment table',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70464,'Help me pick a lock',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70465,'I need your your healthstone',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70466,'I need a soulwell',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70467,'I need you to refresh poisons',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70468,'<Choose poison (Main Hand)>',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70469,'<Choose poison (Offhand)>',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70470,'I need you to refresh enchants',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70471,'<Choose enchant (Main Hand)>',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70472,'<Choose enchant (Offhand)>',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70473,'I need you to remove shapeshift',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70474,'<Choose pet type>',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70475,'You are dismissed',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70476,'Are you going to abandon ',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70477,'You may regret it...',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70478,'Pull yourself together, damnit',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70479,'<Study the creature>',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70480,'Nevermind',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70481,'dist',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70482,'BACK',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70483,'<Auto>',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70484,'<None>',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70485,'Random (Cunning)',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70486,'Random (Ferocity)',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70487,'Random (Tenacity)',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70488,'Show me your inventory',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70489,'Auto-equip',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70490,'Main hand',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70491,'Off-hand',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70492,'Ranged',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70493,'Relic',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70494,'Head',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70495,'Shoulders',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70496,'Chest',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70497,'Waist',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70498,'Legs',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70499,'Feet',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70500,'Wrist',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70501,'Hands',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70502,'Back',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70503,'Shirt',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70504,'Finger1',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70505,'Finger2',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70506,'Trinket1',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70507,'Trinket2',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70508,'Neck',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70509,'Unequip all',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70510,'Update visual',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70511,'visual only',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70512,'Equipped',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70513,'nothing',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70514,'Use your old equipment',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70515,'Unequip it',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70516,'Hm... I have nothing to give you',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70517,'Gathering',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70518,'Abilities status',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70519,'Manage allowed abilities',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70520,'Use ',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70521,'Update',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70522,'Damage',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70523,'Control',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70524,'Heal',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70525,'Other',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70526,' makes a grinding sound and begins to follow ',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70527,'%s will not join you until dismissed by the owner',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70528,'%s will not join you until you are level 60',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70529,'%s will not join you until you are level 55',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70530,'%s will not join you until you are level 40',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70531,'%s will not join you until you are level 20',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70532,'You exceed max npcbots for your level (%u)',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70533,'You don\\'t have enough money',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70534,'You cannot have more bots of that class! %u of %u',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70535,'Cannot reset equipment in slot %u (%s)! Cannot dismiss bot!',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70536,'current',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70537,'Attack distance',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70538,'Short range attacks',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70539,'Long range attacks',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70540,'Exact',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70541,'Remove buff',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70542,'Fix your power type',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70543,'Cannot unequip %s for some stupid reason! Sending through mail',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70544,'Tank',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70545,'Ranged',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70546,'Miner',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70547,'Herbalist',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70548,'Skinner',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70549,'Engineer',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70550,'Bot ownership expired',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70551,'NpcBot system is currently disabled. Please contact administration.',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70552,'%s will not join you, already has master: %s',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70553,'Bank is full',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70554,'Aspect',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70555,'Monkey',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70556,'Hawk',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70557,'Cheetah',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70558,'Viper',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70559,'Beast',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70560,'Pack',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70561,'Wild',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70562,'Dragonhawk',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70563,'No Aspect',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70564,'Aura',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70565,'Devotion',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70566,'Concentration',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70567,'Fire Resistance',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70568,'Frost Resistance',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70569,'Shadow Resistance',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70570,'Retribution',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70571,'Crusader',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70572,'No Aura',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70573,'Crippling',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70574,'Instant',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70575,'Deadly',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70576,'Wound',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70577,'Mind-Numbing',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70578,'Anesthetic',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70579,'Nothing',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70580,'Flametongue',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70581,'Frostbrand',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70582,'Windfury',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70583,'Earthliving',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70584,'I need your services',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70585,'You have too many bots',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70586,'Do you wish to hire ',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70587,' is a bit busy at the moment, try again later.',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70588,'Pleasure doing business with you',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70589,'Warriors',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70590,'Paladins',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70591,'Mages',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70592,'Priests',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70593,'Warlocks',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70594,'Druids',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70595,'Death Knights',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70596,'Rogues',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70597,'Shamans',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70598,'Hunters',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70599,'Blademasters',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70600,'Destroyers',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70601,'Archmagi',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70602,'Dreadlords',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70603,'Spell Breakers',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70604,'Dark Rangers',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70605,'Warrior',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70606,'Paladin',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70607,'Mage',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70608,'Priest',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70609,'Warlock',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70610,'Druid',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70611,'Death Knight',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70612,'Rogue',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70613,'Shaman',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70614,'Hunter',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70615,'Blademaster',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70616,'Destroyer',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70617,'Archmage',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70618,'Dreadlord',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70619,'Spell Breaker',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70620,'Dark Ranger',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70621,'Male',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70622,'Female',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70623,'Human',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70624,'Orc',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70625,'Dwarf',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70626,'Night Elf',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70627,'Undead',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70628,'Tauren',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70629,'Gnome',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70630,'Troll',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70631,'Blood Elf',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70632,'Draenei',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70633,'Unknown',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70634,'Looting',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70635,'|cff9d9d9dPoor|r',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70636,'|cffffffffCommon|r',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70637,'|cff1eff00Uncommon|r',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70638,'|cff0070ddRare|r',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70639,'|cffa335eeEpic|r',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70640,'|cffff8000Legendary|r',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70641,'Engage behavior',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70642,'Delay attack by',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70643,'Delay healing by',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70644,'s',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70645,'Off-Tank',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70646,'Necromancers',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70647,'Necromancer',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70648,'Attack angle',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70649,'Normal',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70650,'Avoid frontal AOE',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70651,'NIY',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70652,'Are you sure this is gonna work? It\\'s better be the best water in the world...',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70653,'Seems like you could really use a drink of fresh water.',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70654,'Sea Witches',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70655,'Sea Witch',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70656,'Mana per damage',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70657,'Damage per mana',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70658,'Transmogrification...',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL),\n+(70659,'DISABLE combat positioning',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70660,'Priority target',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70661,'Bot gear bank...',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70662,'Deposit items...',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70663,'Withdraw items...',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70664,'Bank is empty',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70665,'Previous page',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70666,'Next page',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70667,'Do you really want to spend all this money to make Crypt Lord move again?',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70668,'I doubt your ability to do much harm in your current state, but I am willing to lead you and help you restore your powers.',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70669,'Crypt Lords',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70670,'Crypt Lord',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70671,'Reflect',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70672,'Locusts',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70673,'Heal target health threshold',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70674,'I need a portal',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70675,'Stormwind',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70676,'Ironforge',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70677,'Darnassus',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70678,'Exodar',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70679,'Orgrimmar',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70680,'Undercity',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70681,'Thunder Bluff',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70682,'Silvermoon',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70683,'Shattrath',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70684,'Dalaran',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70685,'You exceed max npcbots for your account (%u >= %u)',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70686,'<Set for all bots>',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70687,' (gear bank)',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70688,'Not enough gear bank space to store %u item(s) (%u / %u)!',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70689,'Equipment sets',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70690,'Create',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70691,'Delete',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70692,'Equip',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70693,'missing',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70694,'Manage ownership...',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70695,'<Add owner>',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70696,'WARNING: by sharing ownership over your bot you give another player FULL control over their inventory, roles and all other settings (including sharing them with others)',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70697,'<Remove owner>',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70698,'Owners limit exceeded',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70699,'Shared with',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1),\n+(70700,'Owner',NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,-1);\n\\ No newline at end of file\ndiff --git a/src/common/Utilities/EventProcessor.h b/src/common/Utilities/EventProcessor.h\nindex 5cb5108689..7d55d09eb8 100644\n--- a/src/common/Utilities/EventProcessor.h\n+++ b/src/common/Utilities/EventProcessor.h\n@@ -56,6 +56,7 @@ class TC_COMMON_API BasicEvent\n \n         // Aborts the event at the next update tick\n         void ScheduleAbort();\n+        bool IsActive() const { return m_abortState == AbortState::STATE_RUNNING; }\n \n     private:\n         void SetAborted();\ndiff --git a/src/server/database/Database/Implementation/CharacterDatabase.cpp b/src/server/database/Database/Implementation/CharacterDatabase.cpp\nindex e482a58577..a8de4e2d6f 100644\n--- a/src/server/database/Database/Implementation/CharacterDatabase.cpp\n+++ b/src/server/database/Database/Implementation/CharacterDatabase.cpp\n@@ -590,6 +590,38 @@ void CharacterDatabaseConnection::DoPrepareStatements()\n \n     // DeserterTracker\n     PrepareStatement(CHAR_INS_DESERTER_TRACK, \"INSERT INTO battleground_deserters (guid, type, datetime) VALUES (?, ?, NOW())\", CONNECTION_ASYNC);\n+\n+    // NPCBots\n+    PrepareStatement(CHAR_UPD_NPCBOT_OWNER, \"UPDATE characters_npcbot SET owner = ?, hire_time = FROM_UNIXTIME(?) WHERE entry = ?\", CONNECTION_ASYNC);\n+    PrepareStatement(CHAR_UPD_NPCBOT_OWNER_ALL, \"UPDATE characters_npcbot SET owner = ?, hire_time = FROM_UNIXTIME(?) WHERE owner = ?\", CONNECTION_ASYNC);\n+    PrepareStatement(CHAR_UPD_NPCBOT_ROLES, \"UPDATE characters_npcbot SET roles = ? WHERE entry = ?\", CONNECTION_ASYNC);\n+    PrepareStatement(CHAR_SEL_NPCBOT_EQUIP_BY_ITEM_INSTANCE, \"SELECT creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomPropertyId, durability, playedTime, text, guid, itemEntry, owner_guid \"\n+        \"FROM item_instance WHERE guid IN (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\", CONNECTION_SYNCH);\n+    PrepareStatement(CHAR_UPD_NPCBOT_EQUIP, \"UPDATE characters_npcbot SET equipMhEx = ?, equipOhEx = ?, equipRhEx = ?, \"\n+        \"equipHead = ?, equipShoulders = ?, equipChest = ?, equipWaist = ?, equipLegs = ?, equipFeet = ?, equipWrist = ?, equipHands = ?, equipBack = ?, equipBody = ?, equipFinger1 = ?, equipFinger2 = ?, equipTrinket1 = ?, equipTrinket2 = ?, equipNeck = ? WHERE entry = ?\", CONNECTION_ASYNC);\n+    PrepareStatement(CHAR_UPD_NPCBOT_EQUIP_RESET_ALL, \"UPDATE characters_npcbot SET equipMhEx = 0, equipOhEx = 0, equipRhEx = 0, \"\n+        \"equipHead = 0, equipShoulders = 0, equipChest = 0, equipWaist = 0, equipLegs = 0, equipFeet = 0, equipWrist = 0, equipHands = 0, equipBack = 0, equipBody = 0, equipFinger1 = 0, equipFinger2 = 0, equipTrinket1 = 0, equipTrinket2 = 0, equipNeck = 0 WHERE owner = ?\", CONNECTION_ASYNC);\n+    PrepareStatement(CHAR_DEL_NPCBOT, \"DELETE FROM characters_npcbot WHERE entry = ?\", CONNECTION_ASYNC);\n+    PrepareStatement(CHAR_INS_NPCBOT, \"INSERT INTO characters_npcbot (entry, roles, spec, faction) VALUES (?, ?, ?, ?)\", CONNECTION_ASYNC);\n+    PrepareStatement(CHAR_UPD_NPCBOT_FACTION, \"UPDATE characters_npcbot SET faction = ? WHERE entry = ?\", CONNECTION_ASYNC);\n+    PrepareStatement(CHAR_UPD_NPCBOT_SPEC, \"UPDATE characters_npcbot SET spec = ? WHERE entry = ?\", CONNECTION_ASYNC);\n+    PrepareStatement(CHAR_UPD_NPCBOT_SHARED_OWNERS, \"UPDATE characters_npcbot SET shared_owners = ? WHERE entry = ?\", CONNECTION_ASYNC);\n+    PrepareStatement(CHAR_UPD_NPCBOT_SHARED_OWNERS_ALL, \"UPDATE characters_npcbot SET shared_owners = NULL WHERE owner = ?\", CONNECTION_ASYNC);\n+    PrepareStatement(CHAR_UPD_NPCBOT_DISABLED_SPELLS, \"UPDATE characters_npcbot SET spells_disabled = ? WHERE entry = ?\", CONNECTION_ASYNC);\n+    PrepareStatement(CHAR_UPD_NPCBOT_MISCVALUES, \"UPDATE characters_npcbot SET miscvalues = ? WHERE entry = ?\", CONNECTION_ASYNC);\n+    PrepareStatement(CHAR_REP_NPCBOT_STATS, \"REPLACE INTO characters_npcbot_stats \"\n+        \"(entry, maxhealth, maxpower, strength, agility, stamina, intellect, spirit, armor, defense, resHoly, resFire, resNature, resFrost, resShadow, resArcane, blockPct, dodgePct, parryPct, critPct, attackPower, spellPower, spellPen, hastePct, hitBonusPct, expertise, armorPenPct) VALUES \"\n+        \"(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\", CONNECTION_ASYNC);\n+    PrepareStatement(CHAR_REP_NPCBOT_TRANSMOG, \"REPLACE INTO characters_npcbot_transmog (entry, slot, item_id, fake_id) VALUES (?, ?, ?, ?)\", CONNECTION_ASYNC);\n+    PrepareStatement(CHAR_DEL_NPCBOT_TRANSMOG, \"DELETE FROM characters_npcbot_transmog WHERE entry = ?\", CONNECTION_ASYNC);\n+    PrepareStatement(CHAR_DEL_NPCBOT_TRANSMOG_ALL, \"DELETE FROM characters_npcbot_transmog WHERE entry IN (SELECT entry FROM characters_npcbot WHERE owner = ?)\", CONNECTION_ASYNC);\n+    PrepareStatement(CHAR_INS_NPCBOT_GROUP_MEMBER, \"INSERT INTO characters_npcbot_group_member (guid, entry, memberFlags, subgroup, roles) VALUES(?, ?, ?, ?, ?)\", CONNECTION_ASYNC);\n+    PrepareStatement(CHAR_DEL_NPCBOT_GROUP_MEMBER, \"DELETE FROM characters_npcbot_group_member WHERE entry = ?\", CONNECTION_ASYNC);\n+    PrepareStatement(CHAR_DEL_NPCBOT_GROUP_MEMBER_ALL, \"DELETE FROM characters_npcbot_group_member WHERE guid = ?\", CONNECTION_ASYNC);\n+    PrepareStatement(CHAR_UPD_NPCBOT_GROUP_MEMBER_FLAG, \"UPDATE characters_npcbot_group_member SET memberFlags = ? WHERE entry = ?\", CONNECTION_ASYNC);\n+    PrepareStatement(CHAR_INS_NPCBOT_LOG, \"INSERT INTO characters_npcbot_logs (entry, owner, mapid, inmap, inworld, type, param1, param2, param3, param4, param5) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\", CONNECTION_ASYNC);\n+    PrepareStatement(CHAR_SEL_NPCBOT_ACC_BOT_COUNT, \"SELECT COUNT(entry) FROM characters_npcbot WHERE owner IN (SELECT guid FROM characters WHERE account = ?);\", CONNECTION_SYNCH);\n+    // End NPCBots\n }\n \n CharacterDatabaseConnection::CharacterDatabaseConnection(MySQLConnectionInfo& connInfo) : MySQLConnection(connInfo)\ndiff --git a/src/server/database/Database/Implementation/CharacterDatabase.h b/src/server/database/Database/Implementation/CharacterDatabase.h\nindex 72f58f6ada..0a5413005a 100644\n--- a/src/server/database/Database/Implementation/CharacterDatabase.h\n+++ b/src/server/database/Database/Implementation/CharacterDatabase.h\n@@ -506,6 +506,33 @@ enum CharacterDatabaseStatements : uint32\n \n     CHAR_INS_DESERTER_TRACK,\n \n+    // NPCBot\n+    CHAR_UPD_NPCBOT_OWNER,\n+    CHAR_UPD_NPCBOT_OWNER_ALL,\n+    CHAR_UPD_NPCBOT_ROLES,\n+    CHAR_SEL_NPCBOT_EQUIP_BY_ITEM_INSTANCE,\n+    CHAR_UPD_NPCBOT_EQUIP,\n+    CHAR_UPD_NPCBOT_EQUIP_RESET_ALL,\n+    CHAR_DEL_NPCBOT,\n+    CHAR_INS_NPCBOT,\n+    CHAR_UPD_NPCBOT_FACTION,\n+    CHAR_UPD_NPCBOT_SPEC,\n+    CHAR_UPD_NPCBOT_SHARED_OWNERS,\n+    CHAR_UPD_NPCBOT_SHARED_OWNERS_ALL,\n+    CHAR_UPD_NPCBOT_DISABLED_SPELLS,\n+    CHAR_UPD_NPCBOT_MISCVALUES,\n+    CHAR_REP_NPCBOT_STATS,\n+    CHAR_REP_NPCBOT_TRANSMOG,\n+    CHAR_DEL_NPCBOT_TRANSMOG,\n+    CHAR_DEL_NPCBOT_TRANSMOG_ALL,\n+    CHAR_INS_NPCBOT_GROUP_MEMBER,\n+    CHAR_DEL_NPCBOT_GROUP_MEMBER,\n+    CHAR_DEL_NPCBOT_GROUP_MEMBER_ALL,\n+    CHAR_UPD_NPCBOT_GROUP_MEMBER_FLAG,\n+    CHAR_INS_NPCBOT_LOG,\n+    CHAR_SEL_NPCBOT_ACC_BOT_COUNT,\n+    // End NPCBot\n+\n     MAX_CHARACTERDATABASE_STATEMENTS\n };\n \ndiff --git a/src/server/database/Database/Implementation/WorldDatabase.cpp b/src/server/database/Database/Implementation/WorldDatabase.cpp\nindex b0b6580dda..c1a82e699c 100644\n--- a/src/server/database/Database/Implementation/WorldDatabase.cpp\n+++ b/src/server/database/Database/Implementation/WorldDatabase.cpp\n@@ -94,6 +94,11 @@ void WorldDatabaseConnection::DoPrepareStatements()\n     PrepareStatement(WORLD_UPD_GAMEOBJECT_ZONE_AREA_DATA, \"UPDATE gameobject SET zoneId = ?, areaId = ? WHERE guid = ?\", CONNECTION_ASYNC);\n     PrepareStatement(WORLD_DEL_SPAWNGROUP_MEMBER, \"DELETE FROM spawn_group WHERE spawnType = ? AND spawnId = ?\", CONNECTION_ASYNC);\n     PrepareStatement(WORLD_DEL_GAMEOBJECT_ADDON, \"DELETE FROM gameobject_addon WHERE guid = ?\", CONNECTION_ASYNC);\n+\n+    //npcbot\n+    PrepareStatement(WORLD_UPD_NPCBOT_NAME, \"UPDATE creature_template SET name = ? WHERE entry = ?\", CONNECTION_SYNCH);\n+    PrepareStatement(WORLD_REP_NPCBOT_APPEARANCE, \"REPLACE INTO creature_template_npcbot_appearance VALUES (?, ?, ?, ?, ?, ?, ?, ?)\", CONNECTION_SYNCH);\n+    //end npcbot\n }\n \n WorldDatabaseConnection::WorldDatabaseConnection(MySQLConnectionInfo& connInfo) : MySQLConnection(connInfo)\ndiff --git a/src/server/database/Database/Implementation/WorldDatabase.h b/src/server/database/Database/Implementation/WorldDatabase.h\nindex 7f7db1df65..9d3b1de9a4 100644\n--- a/src/server/database/Database/Implementation/WorldDatabase.h\n+++ b/src/server/database/Database/Implementation/WorldDatabase.h\n@@ -101,6 +101,11 @@ enum WorldDatabaseStatements : uint32\n     WORLD_DEL_SPAWNGROUP_MEMBER,\n     WORLD_DEL_GAMEOBJECT_ADDON,\n \n+    //npcbot\n+    WORLD_UPD_NPCBOT_NAME,\n+    WORLD_REP_NPCBOT_APPEARANCE,\n+    //end npcbot\n+\n     MAX_WORLDDATABASE_STATEMENTS\n };\n \ndiff --git a/src/server/database/Updater/DBUpdater.cpp b/src/server/database/Updater/DBUpdater.cpp\nindex 683d32f3ff..4b9e8f5959 100644\n--- a/src/server/database/Updater/DBUpdater.cpp\n+++ b/src/server/database/Updater/DBUpdater.cpp\n@@ -157,6 +157,24 @@ BaseLocation DBUpdater<T>::GetBaseLocationType()\n     return LOCATION_REPOSITORY;\n }\n \n+// npcbot\n+template<>\n+std::string DBUpdater<LoginDatabaseConnection>::GetBaseNPCBotFile()\n+{\n+    return BuiltInConfig::GetSourceDirectory() + \"/sql/base/auth_npcbots.sql\";\n+}\n+template<>\n+std::string DBUpdater<CharacterDatabaseConnection>::GetBaseNPCBotFile()\n+{\n+    return BuiltInConfig::GetSourceDirectory() + \"/sql/base/characters_npcbots.sql\";\n+}\n+template<>\n+std::string DBUpdater<WorldDatabaseConnection>::GetBaseNPCBotFile()\n+{\n+    return BuiltInConfig::GetSourceDirectory() + \"/sql/base/world_npcbots.sql\";\n+}\n+//end npcbot\n+\n template<class T>\n bool DBUpdater<T>::Create(DatabaseWorkerPool<T>& pool)\n {\n@@ -261,6 +279,16 @@ bool DBUpdater<T>::Populate(DatabaseWorkerPool<T>& pool)\n \n     TC_LOG_INFO(\"sql.updates\", \"Database {} is empty, auto populating it...\", DBUpdater<T>::GetTableName());\n \n+    //npcbot\n+    Path const nbase(DBUpdater<T>::GetBaseNPCBotFile());\n+    if (!exists(nbase))\n+    {\n+        TC_LOG_ERROR(\"sql.updates\", \">> [NPCBots] Base file \\\"{}\\\" is missing. Try fixing it by cloning the source again.\",\n+            nbase.generic_string());\n+        return false;\n+    }\n+    //end npcbot\n+\n     std::string const p = DBUpdater<T>::GetBaseFile();\n     if (p.empty())\n     {\n@@ -304,6 +332,26 @@ bool DBUpdater<T>::Populate(DatabaseWorkerPool<T>& pool)\n     }\n \n     TC_LOG_INFO(\"sql.updates\", \">> Done!\");\n+\n+    //npcbot\n+    if (!exists(nbase))\n+    {\n+        TC_LOG_ERROR(\"sql.updates\", \">> [NPCBots] Base file \\\"{}\\\" is missing. You'll have to apply it manually!\",\n+            nbase.generic_string());\n+        return false;\n+    }\n+    TC_LOG_INFO(\"sql.updates\", \">> [NPCBots] Applying \\'{}\\'...\", nbase.generic_string());\n+    try\n+    {\n+        ApplyFile(pool, nbase);\n+    }\n+    catch (UpdateException&)\n+    {\n+        return false;\n+    }\n+    TC_LOG_INFO(\"sql.updates\", \">> Done!\");\n+    //end npcbot\n+\n     return true;\n }\n \ndiff --git a/src/server/database/Updater/DBUpdater.h b/src/server/database/Updater/DBUpdater.h\nindex 691777e39e..15ff3be635 100644\n--- a/src/server/database/Updater/DBUpdater.h\n+++ b/src/server/database/Updater/DBUpdater.h\n@@ -74,6 +74,10 @@ public:\n \n     static std::string GetBaseFile();\n \n+    //npcbot\n+    static std::string GetBaseNPCBotFile();\n+    //end npcbot\n+\n     static bool IsEnabled(uint32 const updateMask);\n \n     static BaseLocation GetBaseLocationType();\ndiff --git a/src/server/game/AI/CoreAI/UnitAI.cpp b/src/server/game/AI/CoreAI/UnitAI.cpp\nindex 7488279f37..eabe8c16e7 100644\n--- a/src/server/game/AI/CoreAI/UnitAI.cpp\n+++ b/src/server/game/AI/CoreAI/UnitAI.cpp\n@@ -344,6 +344,9 @@ bool DefaultTargetSelector::operator()(Unit const* target) const\n         return false;\n \n     if (_playerOnly && (target->GetTypeId() != TYPEID_PLAYER))\n+        //npcbot: allow to target bots\n+        //if (!(target->GetTypeId() == TYPEID_UNIT && target->ToCreature()->IsNPCBot()))\n+        //end npcbot\n         return false;\n \n     if (_dist > 0.0f && !_me->IsWithinCombatRange(target, _dist))\ndiff --git a/src/server/game/AI/NpcBots/bot_Events.h b/src/server/game/AI/NpcBots/bot_Events.h\nnew file mode 100644\nindex 0000000000..779e5a6a3c\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bot_Events.h\n@@ -0,0 +1,80 @@\n+#ifndef BOT_EVENTS_H_\n+#define BOT_EVENTS_H_\n+\n+#include \"EventProcessor.h\"\n+\n+/*\n+Name: bot_Events\n+%Complete: ???\n+Comment: Custom event types for NPCBot system by Trickerer (onlysuffering@gmail.com)\n+Category: creature_cripts/custom/bots/events\n+\n+Notes:\n+All events must be executed through botAI\n+*/\n+\n+//Teleport home: near or far, only used for free bots\n+class TeleportHomeEvent : public BasicEvent\n+{\n+    friend class bot_ai;\n+protected:\n+    TeleportHomeEvent(bot_ai* ai, bool reset) : _ai(ai), _reset(reset) {}\n+    ~TeleportHomeEvent() {}\n+\n+    TeleportHomeEvent(TeleportHomeEvent const&) = delete;\n+\n+    bool Execute(uint64 /*e_time*/, uint32 /*p_time*/) override\n+    {\n+        _ai->TeleportHome(_reset);\n+        return true;\n+    }\n+\n+private:\n+    bot_ai* _ai;\n+    bool _reset;\n+};\n+//Delayed teleport finish: adds bot back to world on new location\n+class TeleportFinishEvent : public BasicEvent\n+{\n+    friend class bot_ai;\n+    friend class BotMgr;\n+protected:\n+    TeleportFinishEvent(bot_ai* ai, bool reset) : _ai(ai), _reset(reset) {}\n+    ~TeleportFinishEvent() {}\n+\n+    TeleportFinishEvent(TeleportFinishEvent const&) = delete;\n+\n+    //Execute is always called while creature is out of world so ai is never deleted\n+    bool Execute(uint64 /*e_time*/, uint32 /*p_time*/) override\n+    {\n+        _ai->FinishTeleport(_reset);\n+        return true;\n+    }\n+\n+private:\n+    bot_ai* _ai;\n+    bool _reset;\n+};\n+//Await state removal\n+class AwaitStateRemovalEvent : public BasicEvent\n+{\n+    friend class bot_ai;\n+protected:\n+    AwaitStateRemovalEvent(bot_ai* ai, uint8 state) : _ai(ai), _state(state) {}\n+    ~AwaitStateRemovalEvent() = default;\n+\n+    AwaitStateRemovalEvent(AwaitStateRemovalEvent const&) = delete;\n+\n+    //Execute is always called while creature is out of world so ai is never deleted\n+    bool Execute(uint64 /*e_time*/, uint32 /*p_time*/) override\n+    {\n+        _ai->EventRemoveBotAwaitState(_state);\n+        return true;\n+    }\n+\n+private:\n+    bot_ai* _ai;\n+    const uint8 _state;\n+};\n+\n+#endif\ndiff --git a/src/server/game/AI/NpcBots/bot_GridNotifiers.h b/src/server/game/AI/NpcBots/bot_GridNotifiers.h\nnew file mode 100644\nindex 0000000000..ab7468460a\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bot_GridNotifiers.h\n@@ -0,0 +1,1385 @@\n+#ifndef BOT_GRIDNOTIFIERS_H\n+#define BOT_GRIDNOTIFIERS_H\n+\n+#include \"bot_ai.h\"\n+#include \"botspell.h\"\n+#include \"Corpse.h\"\n+#include \"Creature.h\"\n+#include \"DBCStores.h\"\n+#include \"DynamicObject.h\"\n+#include \"GameObject.h\"\n+#include \"Group.h\"\n+#include \"ObjectAccessor.h\"\n+#include \"Player.h\"\n+#include \"Spell.h\"\n+#include \"SpellAuras.h\"\n+#include \"SpellMgr.h\"\n+#include \"Vehicle.h\"\n+/*\n+Name: bot_GridNotifiers\n+%Complete: 99+\n+Comment: Custom grid notifiers for Bot system by Trickerer (onlysuffering@gmail.com)\n+Category: creature_cripts/custom/bots/grids\n+*/\n+\n+extern bool _botPvP;\n+\n+template<class Check>\n+struct Unit2LastSearcher\n+{\n+    Unit* &i_result1;\n+    Unit* &i_result2;\n+    Check& i_check;\n+\n+    Unit2LastSearcher(Unit* &result1, Unit* &result2, Check& check)\n+        : i_result1(result1), i_result2(result2), i_check(check) { }\n+\n+    void Visit(CreatureMapType &m)\n+    {\n+        for (auto const& d : m)\n+        {\n+            switch (static_cast<uint32>(i_check(d.GetSource())))\n+            {\n+                case 1: i_result1 = d.GetSource(); break;\n+                case 2: i_result2 = d.GetSource(); break;\n+                default:                           break;\n+            }\n+        }\n+    }\n+\n+    void Visit(PlayerMapType &m)\n+    {\n+        for (auto const& d : m)\n+        {\n+            switch (static_cast<uint32>(i_check(d.GetSource())))\n+            {\n+                case 1: i_result1 = d.GetSource(); break;\n+                case 2: i_result2 = d.GetSource(); break;\n+                default:                           break;\n+            }\n+        }\n+    }\n+\n+    template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) { }\n+};\n+\n+class ImmunityShieldDispelTargetCheck\n+{\n+    public:\n+        explicit ImmunityShieldDispelTargetCheck(Unit const* unit, float dist, bot_ai const* m_ai) :\n+        me(unit), range(dist), ai(m_ai) { }\n+        bool operator()(Unit const* u)\n+        {\n+            if (!_botPvP && me->IsPvP() && u->IsControlledByPlayer())\n+                return false;\n+            if (!u->IsInCombat())\n+                return false;\n+            if (!u->InSamePhase(me))\n+                return false;\n+            if (!me->IsWithinDistInMap(u, range))\n+                return false;\n+            if (!u->isTargetableForAttack())\n+                return false;\n+            //if (ai->InDuel(u))\n+            //    return false;\n+            if (!ai->IsInBotParty(u->GetVictim()))\n+                return false;\n+            if (!u->HasAuraWithMechanic(1u<<MECHANIC_IMMUNE_SHIELD))\n+                return false;\n+\n+            if (!u->IsWithinLOSInMap(me, LINEOFSIGHT_ALL_CHECKS, VMAP::ModelIgnoreFlags::M2))\n+                return false;\n+\n+            return true;\n+        }\n+    private:\n+        Unit const* me;\n+        float range;\n+        bot_ai const* ai;\n+};\n+\n+class NearestHostileUnitCheck\n+{\n+    enum : uint32 {\n+        INVALID         = 0,\n+        VALID_PRIMARY   = 1,\n+        VALID_SECONDARY = 2\n+    };\n+\n+    public:\n+        NearestHostileUnitCheck(NearestHostileUnitCheck const&) = delete;\n+        explicit NearestHostileUnitCheck(Unit const* unit, float dist, bool magic, bot_ai const* m_ai, bool targetCCed, bool withSecondary) :\n+        me(unit), m_range(dist), byspell(magic), ai(m_ai), AttackCCed(targetCCed), checkSecondary(withSecondary)\n+        { free = ai->IAmFree(); berserk = free && (ai->IsWanderer() || unit->GetFaction() == FACTION_TEMPLATE_NEUTRAL_HOSTILE); }\n+        explicit NearestHostileUnitCheck(Unit const* unit, float dist, bool magic, bot_ai const* m_ai) :\n+        NearestHostileUnitCheck(unit, dist, magic, m_ai, true, false)\n+        {}\n+        uint32 operator()(Unit const* u)\n+        {\n+            if (u == me)\n+                return INVALID;\n+            if (!me->IsWithinDistInMap(u, m_range, !berserk))\n+                return INVALID;\n+            if (berserk && std::fabs(me->GetPositionZ() - u->GetPositionZ()) > (m_range * 0.25f + 5.0f))\n+                return INVALID;\n+            if (me->HasUnitState(UNIT_STATE_ROOT) && (ai->HasRole(BOT_ROLE_RANGED) == me->IsWithinDistInMap(u, 8.f)))\n+                return INVALID;\n+            if (!berserk && !u->IsInCombat())\n+                return INVALID;\n+            //if (ai->InDuel(u))\n+            //    return false;\n+            if (!AttackCCed && (u->HasUnitState(UNIT_STATE_CONFUSED | UNIT_STATE_STUNNED | UNIT_STATE_FLEEING | UNIT_STATE_DISTRACTED | UNIT_STATE_CONFUSED_MOVE | UNIT_STATE_FLEEING_MOVE)))\n+                return INVALID;//do not allow CCed units if checked\n+            //if (u->HasUnitState(UNIT_STATE_CASTING) && (u->IsPlayer() || u->IsPet()))\n+            //    for (uint8 i = 0; i != CURRENT_MAX_SPELL; ++i)\n+            //        if (Spell* spell = u->GetCurrentSpell(i))\n+            //            if (ai->IsInBotParty(spell->m_targets.GetUnitTarget()))\n+            //                return true;\n+            if (!berserk && !ai->IsInBotParty(u->GetVictim()))\n+                return INVALID;\n+\n+            if (free && !berserk && u->IsControlledByPlayer() && !u->IsInCombat())\n+                return INVALID;\n+\n+            if (!u->IsWithinLOSInMap(me, LINEOFSIGHT_ALL_CHECKS))\n+                return INVALID;\n+\n+            uint32 res = VALID_PRIMARY;\n+            if (!ai->CanBotAttack(u, byspell))\n+            {\n+                if (checkSecondary && ai->CanBotAttack(u, byspell, checkSecondary))\n+                    res = VALID_SECONDARY;\n+                else\n+                    return INVALID;\n+            }\n+\n+            m_range = me->GetDistance(u);   // use found unit range as new range limit for next check\n+            return res;\n+        }\n+    private:\n+        Unit const* me;\n+        float m_range;\n+        bool byspell;\n+        bot_ai const* ai;\n+        bool AttackCCed;\n+        bool checkSecondary;\n+        bool free;\n+        bool berserk;\n+};\n+\n+class NearbyHostileVehicleTargetCheck\n+{\n+    public:\n+        explicit NearbyHostileVehicleTargetCheck(Unit const* unit, float dist, bot_ai const* m_ai) : veh(unit), m_range(dist), ai(m_ai) { }\n+        bool operator()(Unit const* u)\n+        {\n+            if (u == veh)\n+                return false;\n+            if (!veh->IsWithinDistInMap(u, m_range))\n+                return false;\n+            if (!u->IsInCombat())\n+                return false;\n+            if (!_botPvP && veh->IsPvP() && u->IsControlledByPlayer())\n+                return false;\n+            //if (!veh->IsValidAttackTarget(u))\n+            //    return false;\n+            //if (!u->isTargetableForAttack(false))\n+            //    return false;\n+            //if (ai->IsInBotParty(u))\n+            //    return false;\n+            if (!ai->IsInBotParty(u->GetVictim()))\n+                return false;\n+            if (u->GetReactionTo(veh) >= REP_NEUTRAL)\n+                return false;\n+            //if (!u->IsWithinLOSInMap(veh))\n+            //    return false;\n+\n+            return true;\n+        }\n+    private:\n+        Unit const* veh;\n+        float m_range;\n+        bot_ai const* ai;\n+};\n+\n+class HostileDispelTargetCheck\n+{\n+    public:\n+        explicit HostileDispelTargetCheck(Unit const* unit, float dist = 30, bool stealable = false, bot_ai const* m_ai = nullptr) :\n+        me(unit), m_range(dist), checksteal(stealable), ai(m_ai) { }\n+        bool operator()(Unit const* u) const\n+        {\n+            if (!_botPvP && me->IsPvP() && u->IsControlledByPlayer())\n+                return false;\n+            if (u->IsInCombat() &&\n+                u->InSamePhase(me) &&\n+                u->IsWithinDistInMap(me, m_range) &&\n+                u->isTargetableForAttack() &&\n+                //!ai->InDuel(u) &&\n+                (!ai->IsInBotParty(u) || ai->IsInHeroicOrRaid()) &&\n+                (ai->IsInBotParty(u->GetVictim()) || me->GetVictim() == u))\n+            {\n+                if (!checksteal && u->GetEntry() == 25744 && !u->GetOwnedAuras().empty()) // Sunwell - Dark Fiend\n+                    return true;\n+\n+                if (checksteal)\n+                {\n+                    if (u->IsImmunedToSpell(sSpellMgr->GetSpellInfo(30449), me))\n+                        return false; //immune to steal\n+                }\n+                else if (ai->GetBotClass() == BOT_CLASS_SHAMAN)\n+                {\n+                    if (u->IsImmunedToSpell(sSpellMgr->GetSpellInfo(370), me))\n+                        return false; //immune to purge\n+                }\n+                //else if (ai->GetBotClass() == BOT_CLASS_PRIEST)\n+                //{\n+                //    if (me->GetLevel() < 70 && u->IsImmunedToSpell(sSpellMgr->GetSpellInfo(527), me))\n+                //        return false; //immune to dispel magic\n+                //}\n+\n+                for (auto const& [_, auraApp] : u->GetAppliedAuras())\n+                {\n+                   SpellInfo const*  Info = auraApp->GetBase()->GetSpellInfo();\n+                    if (auraApp->IsPositive() && Info->Dispel == DISPEL_MAGIC &&\n+                        !(Info->Attributes & (SPELL_ATTR0_PASSIVE | SPELL_ATTR0_HIDDEN_CLIENTSIDE)) &&\n+                        !(checksteal && (Info->AttributesEx4 & SPELL_ATTR4_NOT_STEALABLE)))\n+                    {\n+                        uint32 id = Info->Id;\n+                        if (id != 20050 && id != 20052 && id != 20053 && //Vengeance\n+                            id != 50447 && id != 50448 && id != 50449) //Bloody Vengeance\n+                            return true;\n+                    }\n+                }\n+\n+                //Unit::AuraMap const &Auras = u->GetOwnedAuras();\n+                //SpellInfo const* Info;\n+                //uint32 id;\n+                //for (Unit::AuraMap::const_iterator itr = Auras.begin(); itr != Auras.end(); ++itr)\n+                //{\n+                //    Aura* aura = itr->second;\n+                //    Info = aura->GetSpellInfo();\n+                //    if (Info->Dispel != DISPEL_MAGIC) continue;\n+                //    id = Info->Id;\n+                //    if (id == 20050 || id == 20052 || id == 20053 || //Vengeance\n+                //        id == 50447 || id == 50448 || id == 50449) //Bloody Vengeance\n+                //        continue;\n+                //    if (Info->Attributes & (SPELL_ATTR0_PASSIVE | SPELL_ATTR0_HIDDEN_CLIENTSIDE)) continue;\n+                //    //if (Info->AttributesEx & SPELL_ATTR1_DONT_DISPLAY_IN_AURA_BAR) continue;\n+                //    if (checksteal && (Info->AttributesEx4 & SPELL_ATTR4_NOT_STEALABLE)) continue;\n+                //    AuraApplication const* aurApp = aura->GetApplicationOfTarget(u->GetGUID());\n+                //    if (aurApp && aurApp->IsPositive())\n+                //        return true;\n+                //}\n+            }\n+            return false;\n+        }\n+    private:\n+        Unit const* me;\n+        float m_range;\n+        bool checksteal;\n+        bot_ai const* ai;\n+};\n+\n+class AffectedTargetCheck\n+{\n+    public:\n+        explicit AffectedTargetCheck(ObjectGuid casterguid, float dist, uint32 spellId, Player const* groupCheck = 0, uint8 hostileCheckType = 0) :\n+        caster(casterguid), m_range(dist), spell(spellId), checker(groupCheck), needhostile(hostileCheckType) { }\n+        bool operator()(Unit const* u) const\n+        {\n+            if (!u->IsAlive())\n+                return false;\n+            if (!caster.IsEmpty() && u->HasUnitFlag(UNIT_FLAG_UNINTERACTIBLE))\n+                return false;\n+            if (!checker->IsWithinDistInMap(u, m_range))\n+                return false;\n+            if (needhostile == 0 && !u->IsHostileTo(checker)) return false;\n+            //else if (needhostile == 1 && !(gr && gr->IsMember(u->GetGUID()) && u->IsPlayer())) return false;\n+            //else if (needhostile == 2 && !(gr && gr->IsMember(u->GetGUID()))) return false;\n+            else if (needhostile == 3 && !u->IsFriendlyTo(checker)) return false;\n+            else if (needhostile == 4 && !(u->IsPlayer() && u->IsFriendlyTo(checker))) return false;\n+\n+            //if (u->HasAura(spell, caster)\n+            //    return true;\n+\n+            for (auto const& [spell_id, auraApp] : u->GetAppliedAuras())\n+            {\n+                if (spell_id == spell)\n+                    if (caster.IsEmpty() || auraApp->GetBase()->GetCasterGUID() == caster)\n+                        return true;\n+            }\n+            return false;\n+        }\n+    private:\n+        ObjectGuid const caster;\n+        float m_range;\n+        uint32 const spell;\n+        Player const* checker;\n+        uint8 needhostile;\n+};\n+\n+class PolyUnitCheck\n+{\n+    public:\n+        explicit PolyUnitCheck(Unit const* unit, float dist) : me(unit), m_range(dist) {}\n+        bool operator()(Unit const* u) const\n+        {\n+            if (!_botPvP && me->IsPvP() && u->IsControlledByPlayer())\n+                return false;\n+            if (!me->GetVictim() || u == me->GetVictim())\n+                return false;\n+            if (!me->IsWithinDistInMap(u, m_range))\n+                return false;\n+            if (!u->IsInCombat() || !u->IsAlive() || !u->GetVictim())\n+                return false;\n+            if (u->GetCreatureType() != CREATURE_TYPE_HUMANOID &&\n+                u->GetCreatureType() != CREATURE_TYPE_BEAST)\n+                return false;\n+            if (me->GetDistance(u) < 6 || me->GetVictim()->GetDistance(u) < 5 ||\n+                (me->ToCreature()->GetBotClass() == BOT_CLASS_MAGE && u->GetHealthPct() < 70))\n+                return false;\n+            if (!u->InSamePhase(me))\n+                return false;\n+            if (!u->isTargetableForAttack())\n+                return false;\n+            if (!u->IsVisible() || u->IsTotem())\n+                return false;\n+            if (me->ToCreature()->GetBotClass() == BOT_CLASS_MAGE ? !u->getAttackers().empty() : u->getAttackers().size() > 1)\n+                return false;\n+            if (!u->IsHostileTo(me))\n+                return false;\n+            if (u->IsPolymorphed() ||\n+                u->IsFrozen() ||\n+                u->IsRooted() ||\n+                u->HasAuraType(SPELL_AURA_PERIODIC_DAMAGE) ||\n+                u->HasAuraType(SPELL_AURA_MOD_PACIFY) ||\n+                u->HasAuraType(SPELL_AURA_MOD_PACIFY_SILENCE) ||\n+                u->HasAuraTypeWithFamilyFlags(SPELL_AURA_MOD_STUN, SPELLFAMILY_PALADIN, 0x4))\n+                return false;\n+\n+            if (me->ToCreature()->GetBotClass() == BOT_CLASS_MAGE && !u->IsImmunedToSpell(sSpellMgr->GetSpellInfo(118), me))//Polymorph\n+                return true;\n+            if (me->ToCreature()->GetBotClass() == BOT_CLASS_SHAMAN && !u->IsImmunedToSpell(sSpellMgr->GetSpellInfo(51514), me))//Hex\n+                return true;\n+\n+            return false;\n+        }\n+    private:\n+        Unit const* me;\n+        float m_range;\n+};\n+\n+class FearUnitCheck\n+{\n+    public:\n+        explicit FearUnitCheck(Unit const* unit, float dist, bot_ai const* ai) : me(unit), m_range(dist), m_ai(ai) {}\n+        bool operator()(Unit const* u) const\n+        {\n+            if (!_botPvP && me->IsPvP() && u->IsControlledByPlayer())\n+                return false;\n+            if (!u->IsAlive())\n+                return false;\n+            if (!u->IsInCombat())\n+                return false;\n+            if (!u->InSamePhase(me))\n+                return false;\n+            if (u->HasUnitState(UNIT_STATE_CONFUSED | UNIT_STATE_STUNNED | UNIT_STATE_FLEEING | UNIT_STATE_DISTRACTED | UNIT_STATE_CONFUSED_MOVE | UNIT_STATE_FLEEING_MOVE))\n+                return false;\n+            if (u->IsFeared())\n+                return false;\n+            if (u->HasAuraType(SPELL_AURA_MOD_PACIFY) || u->HasAuraType(SPELL_AURA_MOD_PACIFY_SILENCE))\n+                return false;\n+            if (!me->IsWithinDistInMap(u, m_range))\n+                return false;\n+            if (!u->IsVisible() || u->IsTotem())\n+                return false;\n+            if (u->GetCreatureType() == CREATURE_TYPE_UNDEAD)\n+                return false;\n+            if (u->GetCreatureType() != CREATURE_TYPE_BEAST &&\n+                me->ToCreature()->GetBotClass() == BOT_CLASS_HUNTER)\n+                return false;\n+            if (!u->isTargetableForAttack())\n+                return false;\n+            if (u->getAttackers().size() > 2)\n+                return false;\n+            if (!m_ai->IsInBotParty(u->GetVictim()))\n+                return false;\n+            if (u->GetDiminishing(DIMINISHING_FEAR) > DIMINISHING_LEVEL_3)\n+                return false;\n+            if (u->GetReactionTo(me) > REP_NEUTRAL)\n+                return false;\n+\n+            if (me->ToCreature()->GetBotClass() == BOT_CLASS_WARLOCK &&\n+                !u->IsImmunedToSpell(sSpellMgr->GetSpellInfo(5782), me))//fear rank1\n+                return true;\n+            if (me->ToCreature()->GetBotClass() == BOT_CLASS_HUNTER &&\n+                !u->IsImmunedToSpell(sSpellMgr->GetSpellInfo(1513), me))//scare beast rank1\n+                return true;\n+\n+            return false;\n+        }\n+    private:\n+        Unit const* me;\n+        float m_range;\n+        bot_ai const* m_ai;\n+};\n+\n+class StunUnitCheck\n+{\n+    public:\n+        explicit StunUnitCheck(Unit const* unit, float dist = 20) : me(unit), m_range(dist) {}\n+        bool operator()(Unit const* u) const\n+        {\n+            if (!_botPvP && me->IsPvP() && u->IsControlledByPlayer())\n+                return false;\n+            if (!u->IsAlive())\n+                return false;\n+            if (!u->IsInCombat())\n+                return false;\n+            if (!u->InSamePhase(me))\n+                return false;\n+            if (u->HasUnitState(UNIT_STATE_CONFUSED | UNIT_STATE_STUNNED | UNIT_STATE_FLEEING | UNIT_STATE_DISTRACTED | UNIT_STATE_CONFUSED_MOVE | UNIT_STATE_FLEEING_MOVE))\n+                return false;\n+            if (u->HasAuraType(SPELL_AURA_MOD_PACIFY) || u->HasAuraType(SPELL_AURA_MOD_PACIFY_SILENCE))\n+                return false;\n+            if (!me->IsWithinDistInMap(u, m_range))\n+                return false;\n+            if (!u->IsVisible() || u->IsTotem())\n+                return false;\n+            if (!u->isTargetableForAttack())\n+                return false;\n+            if (!u->getAttackers().empty())\n+                return false;\n+            if (me->ToCreature()->GetBotClass() != BOT_CLASS_DREADLORD && u->HasAuraType(SPELL_AURA_PERIODIC_DAMAGE))\n+                return false;\n+            if (me->ToCreature()->GetBotClass() == BOT_CLASS_HUNTER && me->GetTarget() == u->GetGUID())//auto shot\n+                return false;\n+            if (u->GetReactionTo(me) > REP_NEUTRAL)\n+                return false;\n+            if (me->ToCreature()->GetBotClass() == BOT_CLASS_PALADIN &&\n+                !(u->GetCreatureType() == CREATURE_TYPE_HUMANOID ||\n+                u->GetCreatureType() == CREATURE_TYPE_DEMON ||\n+                u->GetCreatureType() == CREATURE_TYPE_DRAGONKIN ||\n+                u->GetCreatureType() == CREATURE_TYPE_GIANT ||\n+                u->GetCreatureType() == CREATURE_TYPE_UNDEAD))\n+                return false;\n+            if (me->ToCreature()->GetBotClass() == BOT_CLASS_DRUID &&\n+                !(u->GetCreatureType() == CREATURE_TYPE_BEAST ||\n+                u->GetCreatureType() == CREATURE_TYPE_DRAGONKIN))\n+                return false;\n+            if (me->ToCreature()->GetBotClass() == BOT_CLASS_PALADIN && me->GetDistance(u) < 10)//prevent break due to AOE damage\n+                return false;\n+            if (me->ToCreature()->GetBotClass() == BOT_CLASS_PALADIN &&\n+                !u->IsImmunedToSpell(sSpellMgr->GetSpellInfo(20066), me))//repentance\n+                return true;\n+            if (me->ToCreature()->GetBotClass() == BOT_CLASS_HUNTER &&\n+                !u->IsImmunedToSpell(sSpellMgr->GetSpellInfo(60210), me))//freezing arrow effect\n+                return true;\n+            if (me->ToCreature()->GetBotClass() == BOT_CLASS_HUNTER &&\n+                !u->IsImmunedToSpell(sSpellMgr->GetSpellInfo(19386), me))//wyvern sting rank 1\n+                return true;\n+            if (me->ToCreature()->GetBotClass() == BOT_CLASS_HUNTER &&\n+                !u->IsImmunedToSpell(sSpellMgr->GetSpellInfo(1991), me))//scatter shot\n+                return true;\n+            if (me->ToCreature()->GetBotClass() == BOT_CLASS_ROGUE &&\n+                !u->IsImmunedToSpell(sSpellMgr->GetSpellInfo(2094), me))//blind\n+                return true;\n+            if (me->ToCreature()->GetBotClass() == BOT_CLASS_WARLOCK &&\n+                u->GetCreatureType() == CREATURE_TYPE_HUMANOID &&\n+                (u->GetVictim() || u->IsControlledByPlayer()) &&\n+                !u->IsImmunedToSpell(sSpellMgr->GetSpellInfo(6358), me))//seduction\n+                return true;\n+            if (me->ToCreature()->GetBotClass() == BOT_CLASS_DREADLORD &&\n+                u->GetCreatureType() != CREATURE_TYPE_UNDEAD &&\n+                !u->IsImmunedToSpell(sSpellMgr->GetSpellInfo(SPELL_SLEEP), me))\n+                return true;\n+\n+            return false;\n+        }\n+    private:\n+        Unit const* me;\n+        float m_range;\n+};\n+\n+class UndeadCCUnitCheck\n+{\n+    public:\n+        explicit UndeadCCUnitCheck(Unit const* unit, float dist, bot_ai const* ai, uint32 spell, bool unattacked) :\n+        me(unit), m_range(dist), m_ai(ai), m_spellId(spell), _unattacked(unattacked) { }\n+        bool operator()(Unit const* u) const\n+        {\n+            if (!_botPvP && me->IsPvP() && u->IsControlledByPlayer())\n+                return false;\n+            if (!me->IsWithinDistInMap(u, m_range))\n+                return false;\n+            if (!u->InSamePhase(me))\n+                return false;\n+            if (!u->IsInCombat())\n+                return false;\n+            if (!u->IsAlive())\n+                return false;\n+            if (!u->isTargetableForAttack())\n+                return false;\n+            if (!u->IsVisible())\n+                return false;\n+            if (_unattacked && !u->getAttackers().empty())\n+                return false;\n+            if (u->HasUnitState(UNIT_STATE_CONFUSED | UNIT_STATE_STUNNED | UNIT_STATE_FLEEING | UNIT_STATE_DISTRACTED | UNIT_STATE_CONFUSED_MOVE | UNIT_STATE_FLEEING_MOVE))\n+                return false;\n+            if (u->HasAuraType(SPELL_AURA_MOD_PACIFY) || u->HasAuraType(SPELL_AURA_MOD_PACIFY_SILENCE))\n+                return false;\n+            if (me->ToCreature()->GetBotClass() == BOT_CLASS_PRIEST &&\n+                !(u->GetCreatureType() == CREATURE_TYPE_UNDEAD && !u->HasAuraType(SPELL_AURA_PERIODIC_DAMAGE)))\n+                return false;\n+            if (me->ToCreature()->GetBotClass() == BOT_CLASS_PALADIN &&\n+                u->GetCreatureType() != CREATURE_TYPE_UNDEAD && u->GetCreatureType() != CREATURE_TYPE_DEMON)\n+                return false;\n+            if (me->ToCreature()->GetBotClass() == BOT_CLASS_WARLOCK &&\n+                ((u->GetCreatureType() != CREATURE_TYPE_DEMON && u->GetCreatureType() != CREATURE_TYPE_ELEMENTAL) ||\n+                m_ai->IsPointedAnyAttackTarget(u)))\n+                return false;\n+            if (u->GetVictim() && !m_ai->IsInBotParty(u->GetVictim()))\n+                return false;\n+            if (u->GetReactionTo(me) > REP_NEUTRAL)\n+                return false;\n+            if (u->IsImmunedToSpell(sSpellMgr->GetSpellInfo(m_spellId)->TryGetSpellInfoOverride(me), me))\n+                return false;\n+            if (m_ai->IsPointedNoDPSTarget(u) && bot_ai::IsDamagingSpell(sSpellMgr->GetSpellInfo(m_spellId)->TryGetSpellInfoOverride(me)))\n+                return false;\n+\n+            return true;\n+        }\n+    private:\n+        Unit const* me;\n+        float m_range;\n+        bot_ai const* m_ai;\n+        uint32 m_spellId;\n+        bool _unattacked;\n+};\n+\n+class RootUnitCheck\n+{\n+    public:\n+        explicit RootUnitCheck(Unit const* unit, float dist, bot_ai const* ai, uint32 spell = 0) :\n+        me(unit), m_range(dist), m_ai(ai), m_spellId(spell) { if (!spell) return; }\n+        bool operator()(Unit const* u) const\n+        {\n+            if (!_botPvP && me->IsPvP() && u->IsControlledByPlayer())\n+                return false;\n+            if (u == me->GetVictim())\n+                return false;\n+            if (!u->IsAlive())\n+                return false;\n+            if (!u->IsInCombat())\n+                return false;\n+            if (!me->IsWithinDistInMap(u, m_range))\n+                return false;\n+            if (me->GetDistance(u) < 8)\n+                return false;\n+            if (!u->InSamePhase(me))\n+                return false;\n+            if (!u->IsVisible())\n+                return false;\n+            if (!u->isTargetableForAttack(false))\n+                return false;\n+            if (u->IsFrozen() || u->IsRooted())\n+                return false;\n+            if (!u->getAttackers().empty())\n+                return false;\n+            if (u->GetVictim() && !m_ai->IsInBotParty(u->GetVictim()))\n+                return false;\n+            if (u->GetReactionTo(me) > REP_NEUTRAL)\n+                return false;\n+            if (u->IsPolymorphed() ||\n+                u->HasAuraType(SPELL_AURA_MOD_PACIFY) ||\n+                u->HasAuraType(SPELL_AURA_MOD_PACIFY_SILENCE)/*hex*/ ||\n+                u->HasAuraTypeWithFamilyFlags(SPELL_AURA_MOD_STUN, SPELLFAMILY_PALADIN, 0x4)/*repentance*/ ||\n+                u->HasAuraTypeWithFamilyFlags(SPELL_AURA_MOD_STUN, SPELLFAMILY_PRIEST, 0x40000000)/*shackle undead*/)\n+                return false;\n+            if (m_ai->IsPointedNoDPSTarget(u) && bot_ai::IsDamagingSpell(sSpellMgr->GetSpellInfo(m_spellId)->TryGetSpellInfoOverride(me)))\n+                return false;\n+            if (!u->IsImmunedToSpell(sSpellMgr->GetSpellInfo(m_spellId)->TryGetSpellInfoOverride(me), me))\n+                return true;\n+\n+            return false;\n+        }\n+    private:\n+        Unit const* me;\n+        float m_range;\n+        bot_ai const* m_ai;\n+        uint32 m_spellId;\n+};\n+\n+class CastingUnitCheck\n+{\n+    public:\n+        explicit CastingUnitCheck(Unit const* unit, float mindist = 0.f, float maxdist = 30, uint32 spell = 0, uint8 minHpPct = 0) :\n+        me(unit), min_range(mindist), max_range(maxdist), m_spell(spell), m_minHpPct(minHpPct) {}\n+        bool operator()(Unit const* u) const\n+        {\n+            if (!u->IsAlive())\n+                return false;\n+            if (!u->InSamePhase(me))\n+                return false;\n+            if (!u->IsVisible() || u->IsTotem())\n+                return false;\n+            if (!u->GetTarget() && !u->IsInCombat())\n+                return false;\n+            if (!_botPvP && me->IsPvP() && u->IsControlledByPlayer())\n+                return false;\n+            if (u->HealthBelowPct(m_minHpPct))\n+                return false;\n+            if (min_range > 0.1f && me->GetDistance(u) < min_range)\n+                return false;\n+            if (!u->isTargetableForAttack(false))\n+                return false;\n+            //if (!m_friend && u->HasUnitFlag(UNIT_FLAG_SILENCED))//prevent double silence\n+            //    return false;\n+            if (!u->IsNonMeleeSpellCast(false,false,true))\n+                return false;\n+            if (!me->IsWithinDistInMap(u, max_range))\n+                return false;\n+            if (u->GetReactionTo(me) >= REP_FRIENDLY)\n+                return false;\n+            if (m_spell)\n+            {\n+                if ((m_spell == 5782 || //fear (warlock)\n+                    m_spell == 64044 || //fear (priest)\n+                    m_spell == SPELL_SLEEP) &&\n+                    u->GetCreatureType() == CREATURE_TYPE_UNDEAD)\n+                    return false;\n+                if (m_spell == 10326 && //turn evil\n+                    !(u->GetCreatureType() == CREATURE_TYPE_UNDEAD ||\n+                    u->GetCreatureType() == CREATURE_TYPE_DEMON))\n+                    return false;\n+                if (m_spell == 20066 && //repentance\n+                    !(u->GetCreatureType() == CREATURE_TYPE_HUMANOID ||\n+                    u->GetCreatureType() == CREATURE_TYPE_DEMON ||\n+                    u->GetCreatureType() == CREATURE_TYPE_DRAGONKIN ||\n+                    u->GetCreatureType() == CREATURE_TYPE_GIANT ||\n+                    u->GetCreatureType() == CREATURE_TYPE_UNDEAD))\n+                    return false;\n+                if (m_spell == 2637 && //hibernate\n+                    !(u->GetCreatureType() == CREATURE_TYPE_BEAST ||\n+                    u->GetCreatureType() == CREATURE_TYPE_DRAGONKIN))\n+                    return false;\n+                if (m_spell == 9484 && //shackle undead (priest)\n+                    u->GetCreatureType() != CREATURE_TYPE_UNDEAD)\n+                    return false;\n+\n+                SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(m_spell)->TryGetSpellInfoOverride(me);\n+                if (u->IsImmunedToSpell(spellInfo, me))\n+                    return false;\n+\n+                if (me->IsCreature() && me->ToCreature()->GetBotAI() && me->ToCreature()->GetBotAI()->IsPointedNoDPSTarget(u) &&\n+                    bot_ai::IsDamagingSpell(spellInfo))\n+                    return false;\n+\n+                if (!CastInterruptionCheck(u, spellInfo))\n+                    return false;\n+            }\n+\n+            return true;\n+        }\n+\n+        static bool CastInterruptionCheck(Unit const* u, SpellInfo const* spellInfo)\n+        {\n+            if (spellInfo->HasEffect(SPELL_EFFECT_INTERRUPT_CAST) && spellInfo->GetFirstRankSpell()->Id != 853) //hammer of justice\n+            {\n+                if (u->IsCreature() &&\n+                    (u->ToCreature()->GetCreatureTemplate()->MechanicImmuneMask & (1u << (MECHANIC_INTERRUPT - 1))))\n+                    return false;\n+\n+                for (uint8 i = CURRENT_FIRST_NON_MELEE_SPELL; i != CURRENT_AUTOREPEAT_SPELL; ++i)\n+                {\n+                    Spell const* curSpell = u->GetCurrentSpell(i);\n+                    if (!curSpell)\n+                        continue;\n+\n+                    //copied conditions from Spell::EffectInterruptCast\n+                    if (!((curSpell->getState() == SPELL_STATE_CASTING ||\n+                        (curSpell->getState() == SPELL_STATE_PREPARING && curSpell->GetCastTime() > 0.0f)) &&\n+                        curSpell->GetSpellInfo()->PreventionType == SPELL_PREVENTION_TYPE_SILENCE &&\n+                        ((i == CURRENT_GENERIC_SPELL && curSpell->GetSpellInfo()->InterruptFlags & SPELL_INTERRUPT_FLAG_INTERRUPT) ||\n+                        (i == CURRENT_CHANNELED_SPELL && curSpell->GetSpellInfo()->ChannelInterruptFlags & CHANNEL_INTERRUPT_FLAG_INTERRUPT))))\n+                        return false;\n+                }\n+            }\n+            bool silenceSpell = false;\n+            for (uint8 i = 0; i != MAX_SPELL_EFFECTS; ++i)\n+            {\n+                if (spellInfo->_effects[i].Effect == SPELL_EFFECT_APPLY_AURA &&\n+                    spellInfo->_effects[i].ApplyAuraName == SPELL_AURA_MOD_SILENCE)\n+                {\n+                    silenceSpell = true;\n+                    break;\n+                }\n+            }\n+            if (silenceSpell)\n+            {\n+                if (u->IsCreature() &&\n+                    (u->ToCreature()->GetCreatureTemplate()->MechanicImmuneMask & (1u << (MECHANIC_SILENCE - 1))))\n+                    return false;\n+\n+                for (uint8 i = CURRENT_FIRST_NON_MELEE_SPELL; i != CURRENT_AUTOREPEAT_SPELL; ++i)\n+                {\n+                    Spell const* curSpell = u->GetCurrentSpell(i);\n+                    if (curSpell && curSpell->GetSpellInfo()->PreventionType != SPELL_PREVENTION_TYPE_SILENCE)\n+                        return false;\n+                }\n+            }\n+\n+            return true; //do not check players and non-interrupt non-silence spells\n+        }\n+\n+    private:\n+        Unit const* me;\n+        float min_range, max_range;\n+        uint32 m_spell;\n+        uint8 m_minHpPct;\n+};\n+\n+class SecondEnemyCheck\n+{\n+    public:\n+        explicit SecondEnemyCheck(Unit const* unit, float dist, float splashdist, Unit const* currtarget, bot_ai const* m_ai) :\n+        me(unit), m_range(dist), m_splashrange(splashdist), mytar(currtarget), ai(m_ai) {}\n+        bool operator()(Unit const* u) const\n+        {\n+            if (!u->IsAlive())\n+                return false;\n+            if (!u->IsInCombat())\n+                return false;\n+            if (u == mytar)\n+                return false;//We need to find SECONDARY target\n+            if (u->isMoving() != mytar->isMoving())//only when both targets idle or both moving\n+                return false;\n+            if (!_botPvP && me->IsPvP() && u->IsControlledByPlayer())\n+                return false;\n+            if (!me->IsWithinDistInMap(u, m_range))//distance check\n+                return false;\n+            if (mytar->GetDistance(u) > m_splashrange)//not close enough to each other\n+                return false;\n+\n+            if (ai->CanBotAttack(u))\n+                return true;\n+\n+            return false;\n+        }\n+    private:\n+        Unit const* me;\n+        float m_range, m_splashrange;\n+        Unit const* mytar;\n+        bot_ai const* ai;\n+};\n+\n+class TranquilTargetCheck\n+{\n+    public:\n+        explicit TranquilTargetCheck(Unit const* unit, float mindist, float maxdist, bot_ai const* m_ai) :\n+        me(unit), min_range(mindist), max_range(maxdist), ai(m_ai) { }\n+        bool operator()(Unit const* u) const\n+        {\n+            if (!_botPvP && me->IsPvP() && u->IsControlledByPlayer())\n+                return false;\n+            if (u != me->GetVictim() &&//check hunter_bot::hunter_botAI::CheckTranquil(uint32)\n+                u->IsWithinDistInMap(me, max_range) &&\n+                u->GetDistance(me) > min_range &&\n+                u->IsAlive() &&\n+                u->InSamePhase(me) &&\n+                u->IsInCombat() &&\n+                u->isTargetableForAttack(false) &&\n+                u->IsVisible() &&\n+                ai->IsInBotParty(u->GetVictim()) &&\n+                u->GetReactionTo(me) <= REP_NEUTRAL)\n+            {\n+                if (u->IsImmunedToSpell(sSpellMgr->GetSpellInfo(19801), me))\n+                    return false;//immune to tranquilizing shot\n+                for (auto const& [_, aura] : u->GetOwnedAuras())\n+                {\n+                    SpellInfo const* Info = aura->GetSpellInfo();\n+                    if (Info->Dispel != DISPEL_MAGIC && Info->Dispel != DISPEL_ENRAGE) continue;\n+                    if (Info->Attributes & (SPELL_ATTR0_PASSIVE | SPELL_ATTR0_HIDDEN_CLIENTSIDE)) continue;\n+                    //if (Info->AttributesEx & SPELL_ATTR1_DONT_DISPLAY_IN_AURA_BAR) continue;\n+                    AuraApplication const* aurApp = aura->GetApplicationOfTarget(u->GetGUID());\n+                    if (aurApp && aurApp->IsPositive())\n+                        return true;\n+                }\n+            }\n+\n+            return false;\n+        }\n+    private:\n+        Unit const* me;\n+        float min_range, max_range;\n+        bot_ai const* ai;\n+};\n+\n+class NearbyHostileUnitCheck\n+{\n+    public:\n+        explicit NearbyHostileUnitCheck(Unit const* unit, float maxdist, bot_ai const* m_ai, uint8 CCoption, WorldObject const* source) :\n+        me(unit), max_range(maxdist), ai(m_ai), m_CCoption(CCoption), _source(source)\n+        {\n+            free = ai->IAmFree();\n+        }\n+        bool operator()(Unit const* u) const\n+        {\n+            if (u == me || u == _source)\n+                return false;\n+            if (/*!free && */!u->IsInCombat())\n+                return false;\n+            if (!u->InSamePhase(_source))\n+                return false;\n+            if ((m_CCoption & 1) && u->HasUnitState(UNIT_STATE_CONFUSED|UNIT_STATE_STUNNED|UNIT_STATE_FLEEING|UNIT_STATE_DISTRACTED|UNIT_STATE_CONFUSED_MOVE))\n+                return false;\n+            if ((m_CCoption & 2) && u->HasAuraType(SPELL_AURA_PERIODIC_DAMAGE))\n+                return false;\n+            if (me->HasUnitState(UNIT_STATE_ROOT) && (ai->HasRole(BOT_ROLE_RANGED) == me->IsWithinDistInMap(u, 8.f)))\n+                return false;\n+            if (!_botPvP && me->IsPvP() && u->IsControlledByPlayer())\n+                return false;\n+            if (u->GetCreatureType() == CREATURE_TYPE_CRITTER)\n+                return false;\n+            if (!_source->IsWithinDistInMap(u, max_range))\n+                return false;\n+            if (!free && !ai->CanBotAttack(u))\n+                return false;\n+            //if (ai->InDuel(u))\n+            //    return false;\n+\n+            if (!ai->IsInBotParty(u->GetVictim()))\n+                return false;\n+\n+            if (free)\n+            {\n+                if (u->IsControlledByPlayer())\n+                    return false;\n+                if (!me->IsValidAttackTarget(u) || !u->isTargetableForAttack(false))\n+                    return false;\n+            }\n+\n+            return true;\n+        }\n+    private:\n+        Unit const* me;\n+        float max_range;\n+        bot_ai const* ai;\n+        uint8 m_CCoption;\n+        bool free;\n+        WorldObject const* _source;\n+};\n+\n+class NearbyHostileUnitInConeCheck\n+{\n+    public:\n+        explicit NearbyHostileUnitInConeCheck(Unit const* unit, float maxdist, bot_ai const* m_ai) :\n+        me(unit), max_range(maxdist), ai(m_ai), cone(float(M_PI)/2)\n+        {\n+            free = ai->IAmFree();\n+        }\n+        bool operator()(Unit const* u) const\n+        {\n+            if (u == me)\n+                return false;\n+            //if (me->HasUnitState(UNIT_STATE_ROOT) && (ai->HasRole(BOT_ROLE_RANGED) == me->IsWithinDistInMap(u, 8.f)))\n+            //    return false;\n+            if (/*!free && */!u->IsInCombat())\n+                return false;\n+            if (!u->InSamePhase(me))\n+                return false;\n+            if (u->HasUnitState(UNIT_STATE_CONFUSED|UNIT_STATE_STUNNED|UNIT_STATE_FLEEING|UNIT_STATE_DISTRACTED|UNIT_STATE_CONFUSED_MOVE))\n+                return false;\n+            if (!free && !ai->CanBotAttack(u))\n+                return false;\n+            if (!_botPvP && me->IsPvP() && u->IsControlledByPlayer())\n+                return false;\n+            if (!me->IsWithinDistInMap(u, max_range))\n+                return false;\n+            if (!me->HasInArc(cone, u))\n+                return false;\n+            //if (ai->InDuel(u))\n+            //    return false;\n+\n+            if (!ai->IsInBotParty(u->GetVictim()))\n+                return false;\n+\n+            if (free)\n+            {\n+                if (u->IsControlledByPlayer())\n+                    return false;\n+                if (!me->IsValidAttackTarget(u) || !u->isTargetableForAttack(false))\n+                    return false;\n+            }\n+\n+            return true;\n+        }\n+    private:\n+        Unit const* me;\n+        float max_range;\n+        bot_ai const* ai;\n+        float cone;\n+        bool free;\n+};\n+\n+class NearbyFriendlyUnitCheck\n+{\n+    public:\n+        explicit NearbyFriendlyUnitCheck(Unit const* unit, float maxdist, bot_ai const* m_ai) : me(unit), max_range(maxdist), ai(m_ai) { }\n+        bool operator()(Unit const* u) const\n+        {\n+            if (u == me)\n+                return false;\n+            //if (!u->IsInCombat())\n+            //    return false;\n+            if (!u->IsAlive())\n+                return false;\n+            if (u->HasUnitState(UNIT_STATE_ISOLATED))\n+                return false;\n+            //if (u->IsTotem() || u->IsSummon())\n+            //    return false;\n+            if (!u->InSamePhase(me))\n+                return false;\n+            if (!me->IsWithinDistInMap(u, max_range))\n+                return false;\n+            //if (ai->InDuel(u))\n+            //    return false;\n+            if (!ai->IsInBotParty(u))\n+                return false;\n+            if (!me->CanSeeOrDetect(u))\n+                return false;\n+            if (!me->IsValidAssistTarget(u))\n+                return false;\n+\n+            return true;\n+        }\n+    private:\n+        Unit const* me;\n+        float max_range;\n+        bot_ai const* ai;\n+};\n+\n+class FarTauntUnitCheck\n+{\n+    public:\n+        explicit FarTauntUnitCheck(Unit const* unit, float maxdist, bool ally, bot_ai const* m_ai) :\n+        me(unit), max_range(maxdist), targetAlly(ally), ai(m_ai) { }\n+        bool operator()(Unit const* u) const\n+        {\n+            if (u == me)\n+                return false;\n+            if (!u->IsAlive())\n+                return false;\n+            if (!u->IsInCombat())\n+                return false;\n+            if (!u->InSamePhase(me))\n+                return false;\n+            if (u->HasUnitState(UNIT_STATE_CONFUSED|UNIT_STATE_STUNNED|UNIT_STATE_FLEEING|UNIT_STATE_DISTRACTED|UNIT_STATE_CONFUSED_MOVE))\n+                return false;\n+            if (u->HasAuraType(SPELL_AURA_MOD_PACIFY_SILENCE))\n+                return false;\n+            if (!u->GetVictim() || u->GetVictim() == me)\n+                return false;\n+            if (!u->CanHaveThreatList())\n+                return false;\n+            if (u->HasAuraType(SPELL_AURA_MOD_TAUNT))\n+                return false;\n+            if (!ai->IsInBotParty(u->GetVictim()))\n+                return false;\n+            if (ai->GetBotClass() == BOT_CLASS_WARRIOR && u->IsImmunedToSpell(sSpellMgr->GetSpellInfo(355), me))\n+                return false; //taunt\n+            else if (ai->GetBotClass() == BOT_CLASS_PALADIN && u->IsImmunedToSpell(sSpellMgr->GetSpellInfo(62124), me))\n+                return false; //HoR\n+            else if (ai->GetBotClass() == BOT_CLASS_DRUID && u->IsImmunedToSpell(sSpellMgr->GetSpellInfo(6795), me))\n+                return false; //Growl\n+\n+            if (!me->IsValidAttackTarget(u) || !u->isTargetableForAttack(false))\n+                return false;\n+\n+            if (me->GetDistance(targetAlly ? u->GetVictim() : u) > max_range)\n+                return false;\n+\n+            if (ai->IsTank(u->GetVictim()))\n+            {\n+                if (!ai->IsTank(me))\n+                    return false;\n+\n+                const bool isofftank = ai->IsOffTank(me);\n+                const bool vofftank = ai->IsOffTank(u->GetVictim());\n+                if (isofftank && (vofftank || !ai->IsPointedOffTankingTarget(u)))\n+                    return false;\n+                else if (!isofftank && vofftank && !ai->IsPointedTankingTarget(u))\n+                    return false;\n+            }\n+\n+            return true;\n+        }\n+    private:\n+        const Unit* const me;\n+        const float max_range;\n+        const bool targetAlly;\n+        const bot_ai* const ai;\n+};\n+\n+class ManaDrainUnitCheck\n+{\n+    public:\n+        explicit ManaDrainUnitCheck(Unit const* unit, float maxdist, bot_ai const* ai) : me(unit), max_range(maxdist), ai(ai)\n+        { maxPool = me->GetMaxPower(POWER_MANA) * 3 / 2; free = ai->IAmFree(); }\n+        bool operator()(Unit const* u)\n+        {\n+            if (!_botPvP && me->IsPvP() && u->IsControlledByPlayer())\n+                return false;\n+            if (u == me)\n+                return false;\n+            if (!u->IsAlive())\n+                return false;\n+            if (!u->IsInCombat())\n+                return false;\n+            if (!u->InSamePhase(me))\n+                return false;\n+            if (u->IsPlayer() && !u->HasUnitState(UNIT_STATE_CONFUSED|UNIT_STATE_STUNNED|UNIT_STATE_FLEEING|UNIT_STATE_DISTRACTED|UNIT_STATE_CONFUSED_MOVE))\n+                return false;\n+            //if (u->IsControlledByPlayer())\n+            //    return false;\n+            if (free)\n+            {\n+                if (!me->IsValidAttackTarget(u) || !u->isTargetableForAttack())\n+                    return false;\n+                if (ai->IsInBotParty(u))\n+                    return false;\n+            }\n+            //if (ai->InDuel(u))\n+            //    return false;\n+            if (u->GetPowerType() != POWER_MANA)\n+                return false;\n+            if (u->GetMaxPower(POWER_MANA) < maxPool)\n+                return false;\n+            if (u->GetPower(POWER_MANA)*10/(u->GetMaxPower(POWER_MANA)/10) < 15)\n+                return false;\n+            if (!me->HasInArc(float(M_PI)*0.5f, u))\n+                return false;\n+            if (me->GetDistance(u) > max_range)\n+                return false;\n+\n+            maxPool = u->GetMaxPower(POWER_MANA);\n+            return true;\n+        }\n+    private:\n+        Unit const* me;\n+        float max_range;\n+        bot_ai const* ai;\n+        uint32 maxPool;\n+        bool free;\n+};\n+\n+class NearbyRezTargetCheck\n+{\n+    public:\n+        explicit NearbyRezTargetCheck(Unit const* unit, float maxdist, bot_ai const* m_ai) : me(unit), max_range(maxdist), ai(m_ai) { }\n+        bool operator()(WorldObject const* u) const\n+        {\n+            if (u == me)\n+                return false;\n+            if (!u->IsPlayer() && !u->IsCorpse())\n+                return false;\n+            if (!u->InSamePhase(me))\n+                return false;\n+            if (!me->IsWithinDistInMap(u, max_range))\n+                return false;\n+            if (!me->CanSeeOrDetect(u))\n+                return false;\n+            if (Player const* p = u->IsPlayer() ? u->ToPlayer() : ObjectAccessor::FindPlayer(u->ToCorpse()->GetOwnerGUID()))\n+            {\n+                if (p->IsAlive())\n+                    return false;\n+                if (p->IsResurrectRequested())\n+                    return false;\n+                if (p->GetUInt32Value(PLAYER_SELF_RES_SPELL))\n+                    return false;\n+                if (!ai->IsInBotParty(p))\n+                    return false;\n+            }\n+            else\n+                return false;\n+\n+            return true;\n+        }\n+    private:\n+        Unit const* me;\n+        float max_range;\n+        bot_ai const* ai;\n+};\n+\n+class NearestLockedGameObjectInRangeCheck\n+{\n+public:\n+    NearestLockedGameObjectInRangeCheck(WorldObject const* unit, float range) : _unit(unit), _range(range) { }\n+    bool operator()(GameObject* go)\n+    {\n+        if (go->GetGOInfo()->GetLockId() &&\n+            !go->HasFlag(GO_FLAG_IN_USE) &&\n+            //go->getLootState() == GO_READY &&\n+            _unit->IsWithinDistInMap(go, _range))\n+        {\n+            _range = _unit->GetExactDist(go);\n+            return true;\n+        }\n+        return false;\n+    }\n+private:\n+    WorldObject const* _unit;\n+    float _range;\n+};\n+\n+class NearestVehicleWithEmptySeatInRangeCheck\n+{\n+public:\n+    NearestVehicleWithEmptySeatInRangeCheck(WorldObject const* unit, float range, Unit const* exveh) : _unit(unit), _range(range), _exveh(exveh)\n+    { ASSERT(_unit->isType(TYPEMASK_UNIT)); }\n+    bool operator()(Unit* u)\n+    {\n+        if (u->IsCreature() && u->IsVehicle() && u->IsAlive() && u != _exveh &&\n+            u->GetVehicleKit()->GetAvailableSeatCount() > 0 && _unit->IsWithinDistInMap(u, _range))\n+        {\n+            _range = _unit->GetExactDist(u);\n+            return true;\n+        }\n+        return false;\n+    }\n+private:\n+    WorldObject const* _unit;\n+    float _range;\n+    Unit const* _exveh; //only compare, may be NULL\n+};\n+\n+//Professions\n+class NearbyObjectBySkillCheck\n+{\n+public:\n+    NearbyObjectBySkillCheck(WorldObject const* checker, float const range, uint32 skillMask) :\n+      _checker(checker), _range(range), _skillMask(skillMask) { ASSERT(_checker->IsPlayer()); }\n+\n+    bool operator()(WorldObject const* ob)\n+    {\n+        if (!_checker->IsWithinDistInMap(ob, _range))\n+            return false;\n+\n+        if (GameObject const* go = ob->ToGameObject())\n+        {\n+            if (/*go->getLootState() == GO_READY && */go->isSpawned() && go->GetGOInfo()->GetLockId() &&\n+                go->IsLootAllowedFor(_checker->ToPlayer()) && _checker->CanSeeOrDetect(go) && _checker->ToPlayer()->HaveAtClient(ob))\n+            {\n+                if (LockEntry const* lockInfo = sLockStore.LookupEntry(go->GetGOInfo()->GetLockId()))\n+                {\n+                    for (uint8 i = 0; i != MAX_LOCK_CASE; ++i)\n+                    {\n+                        if (lockInfo->Type[i] == LOCK_KEY_SKILL &&\n+                            CheckSkill(SkillByLockType(LockType(lockInfo->Index[i]))) &&\n+                            lockInfo->Skill[i] <= MaxSkillForLevel(_checker->ToUnit()->GetLevel()))\n+                            return true;\n+                    }\n+                }\n+            }\n+        }\n+        else if (Creature const* cre = ob->ToCreature())\n+        {\n+            if (cre->IsVisible() && cre->getDeathState() == CORPSE && cre->HasUnitFlag(UNIT_FLAG_SKINNABLE) && cre->loot.isLooted() &&\n+                cre->isTappedBy(_checker->ToPlayer()) && CheckSkill(cre->GetCreatureTemplate()->GetRequiredLootSkill()))\n+            {\n+                if (int32(cre->GetLevel() < 20 ? (cre->GetLevel() - 10) * 10 : cre->GetLevel() * 5) <= int32(MaxSkillForLevel(_checker->ToUnit()->GetLevel())))\n+                    return true;\n+            }\n+        }\n+        return false;\n+    }\n+private:\n+    WorldObject const* _checker;\n+    float const _range;\n+    uint32 const _skillMask;\n+\n+    inline bool CheckSkill(SkillType const skill) const\n+    {\n+        switch (skill)\n+        {\n+            case SKILL_MINING:\n+                return (_skillMask & BOT_ROLE_GATHERING_MINING);\n+            case SKILL_HERBALISM:\n+                return (_skillMask & BOT_ROLE_GATHERING_HERBALISM);\n+            case SKILL_SKINNING:\n+                return (_skillMask & BOT_ROLE_GATHERING_SKINNING);\n+            case SKILL_ENGINEERING:\n+                return (_skillMask & BOT_ROLE_GATHERING_ENGINEERING);\n+            default:\n+                return false;\n+        }\n+    }\n+\n+    inline uint32 MaxSkillForLevel(uint8 const level) const\n+    {\n+        return\n+            level <= 20 ? 150 :\n+            level <= 40 ? 225 :\n+            level <= 60 ? 300 :\n+            level <= 70 ? 375 : 450;\n+\n+        //return level <= 60 ? level * 5 : 300 + (((level - 60) * 15) / 2);\n+    }\n+};\n+\n+//Autolooting\n+class NearbyLootableCreatureCheck\n+{\n+public:\n+    NearbyLootableCreatureCheck(WorldObject* checker, float const range) : _checker(checker), _range(range)\n+    { ASSERT(_checker->IsPlayer()); }\n+\n+    bool operator()(Unit const* unit)\n+    {\n+        if (Creature const* cre = unit->ToCreature())\n+            if (_checker->IsWithinDistInMap(cre, _range))\n+                return cre->IsVisible() && cre->getDeathState() == CORPSE &&\n+                    cre->HasDynamicFlag(UNIT_DYNFLAG_LOOTABLE) &&\n+                    _checker->ToPlayer()->isAllowedToLoot(cre);\n+        return false;\n+    }\n+private:\n+    WorldObject* _checker;\n+    float const _range;\n+};\n+\n+//AoE caster dynobject\n+class NearbyHostileAoEDynobjectCheck\n+{\n+    public:\n+        explicit NearbyHostileAoEDynobjectCheck(Unit const* unit, float maxdist) : _me(unit), _range(maxdist) { }\n+        bool operator()(WorldObject const* u) const\n+        {\n+            DynamicObject const* dObj = u->ToDynObject();\n+            if (!dObj || !dObj->GetSpellId() || !dObj->GetCaster())\n+                return false;\n+            if (dObj->GetByteValue(DYNAMICOBJECT_BYTES, 0) != DYNAMIC_OBJECT_AREA_SPELL)\n+                return false;\n+            if (!dObj->InSamePhase(_me))\n+                return false;\n+            if (!dObj->GetRadius())\n+                return false;\n+            if (!dObj->IsWithinDistInMap(_me, _range))\n+                return false;\n+            if (!dObj->GetCaster()->IsValidAttackTarget(_me))\n+                return false;\n+\n+            return true;\n+        }\n+    private:\n+        Unit const* _me;\n+        float _range;\n+};\n+\n+namespace BOTAI_PRED\n+{\n+    class HealTargetExclude\n+    {\n+        public:\n+            bool operator()(Unit const* target)\n+            {\n+                return target->IsSummon() || target->IsTotem() || (target->GetHealthPct() > 90 && target->GetMaxHealth() - target->GetHealth() < 500);\n+            }\n+    };\n+    class BuffTargetExclude\n+    {\n+        public:\n+            bool operator()(Unit const* target)\n+            {\n+                return target->IsSummon() || target->IsTotem();\n+            }\n+    };\n+    class DrainTargetExclude\n+    {\n+        public:\n+            bool operator()(Unit const* target)\n+            {\n+                return target->IsTotem() || target->GetPowerType() != POWER_MANA || target->GetPower(POWER_MANA) < 1000;\n+            }\n+    };\n+    class UnitExclude\n+    {\n+        public:\n+            UnitExclude(Unit const* unit) { _unit = unit; }\n+            bool operator()(Unit const* target)\n+            {\n+                return target == _unit;\n+            }\n+        private:\n+            Unit const* _unit;\n+    };\n+\n+    class AuraedTargetExclude\n+    {\n+        public:\n+            AuraedTargetExclude(uint32 spellId, uint8 minstacks = 0) : _spellId(spellId), _minstacks(minstacks) {}\n+            bool operator()(Unit const* target)\n+            {\n+                AuraApplication const* aurApp = target->GetAuraApplicationOfRankedSpell(_spellId);\n+                return aurApp && (!_minstacks || aurApp->GetBase()->GetStackAmount() >= _minstacks);\n+            }\n+        private:\n+            uint32 _spellId;\n+            uint8 _minstacks;\n+    };\n+\n+    class AuraedTargetExcludeByCaster\n+    {\n+        public:\n+            AuraedTargetExcludeByCaster(uint32 spellId, ObjectGuid caster, uint8 minstacks = 0) :\n+                _spellId(spellId), _caster(caster), _minstacks(minstacks) {}\n+            bool operator()(Unit const* target)\n+            {\n+                AuraApplication const* aurApp = target->GetAuraApplicationOfRankedSpell(_spellId, _caster);\n+                return aurApp && (!_minstacks || aurApp->GetBase()->GetStackAmount() >= _minstacks);\n+            }\n+        private:\n+            uint32 _spellId;\n+            ObjectGuid _caster;\n+            uint8 _minstacks;\n+    };\n+\n+    class HpPctAboveExclude\n+    {\n+        public:\n+        HpPctAboveExclude(float pct) : _pct(pct) {}\n+            bool operator()(Unit const* target)\n+            {\n+                return target->GetHealthPct() > _pct;\n+            }\n+        private:\n+            float _pct;\n+    };\n+\n+    class UnitCombatStateExclude\n+    {\n+        public:\n+        UnitCombatStateExclude(bool combat) : _combat(combat) {}\n+            bool operator()(Unit const* target)\n+            {\n+                return target->IsInCombat() == _combat;\n+            }\n+        private:\n+            bool _combat;\n+    };\n+\n+    class UnitLivingStateExclude\n+    {\n+        public:\n+        UnitLivingStateExclude(bool living) : _living(living) {}\n+            bool operator()(Unit const* target)\n+            {\n+                return target->IsAlive() == _living;\n+            }\n+        private:\n+            bool _living;\n+    };\n+};\n+\n+#endif\ndiff --git a/src/server/game/AI/NpcBots/bot_InstanceEvents.h b/src/server/game/AI/NpcBots/bot_InstanceEvents.h\nnew file mode 100644\nindex 0000000000..4a7e02868b\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bot_InstanceEvents.h\n@@ -0,0 +1,51 @@\n+#ifndef BOT_INSTANCE_EVENTS_H_\n+#define BOT_INSTANCE_EVENTS_H_\n+\n+#include \"EventProcessor.h\"\n+#include \"Position.h\"\n+\n+/*\n+Name: bot_InstanceEvents\n+%Complete: ???\n+Comment: Custom event types for NPCBot system by Trickerer (onlysuffering@gmail.com)\n+Category: creature_cripts/custom/bots/events\n+\n+Notes:\n+All events must be executed through botAI\n+*/\n+class InstanceScript;\n+\n+//Base for instance event -based events\n+class TC_GAME_API NpcBotInstanceEventBase : public BasicEvent\n+{\n+public:\n+    InstanceScript* GetScript() const { return _instance; }\n+    bool operator()() { return Execute(0, 0); }\n+\n+protected:\n+    NpcBotInstanceEventBase(InstanceScript* instance) : _instance(instance) {}\n+    ~NpcBotInstanceEventBase() = default;\n+    NpcBotInstanceEventBase(NpcBotInstanceEventBase const&) = delete;\n+\n+private:\n+    InstanceScript* _instance;\n+};\n+class TC_GAME_API FrozenThronePlatformDestructionEvent : public NpcBotInstanceEventBase\n+{\n+    friend class bot_ai;\n+    friend class instance_icecrown_citadel;\n+    friend class script_bot_commands;\n+\n+public:\n+    bool Execute(uint64 /*e_time*/, uint32 /*p_time*/) override;\n+\n+protected:\n+    FrozenThronePlatformDestructionEvent(InstanceScript* instance, Position&& platformPos) : NpcBotInstanceEventBase(instance), _platform_pos(std::move(platformPos)) {}\n+    ~FrozenThronePlatformDestructionEvent() = default;\n+    FrozenThronePlatformDestructionEvent(FrozenThronePlatformDestructionEvent const&) = delete;\n+\n+private:\n+    Position _platform_pos;\n+};\n+\n+#endif\ndiff --git a/src/server/game/AI/NpcBots/bot_ai.cpp b/src/server/game/AI/NpcBots/bot_ai.cpp\nnew file mode 100644\nindex 0000000000..8d01c869a5\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bot_ai.cpp\n@@ -0,0 +1,21547 @@\n+#include \"Battleground.h\"\n+#include \"BattlegroundAB.h\"\n+#include \"BattlegroundAV.h\"\n+#include \"BattlegroundEY.h\"\n+#include \"BattlegroundWS.h\"\n+#include \"bot_ai.h\"\n+#include \"bot_Events.h\"\n+#include \"bot_InstanceEvents.h\"\n+#include \"bot_GridNotifiers.h\"\n+#include \"botconfig.h\"\n+#include \"botdatamgr.h\"\n+#include \"botlog.h\"\n+#include \"botmgr.h\"\n+#include \"botgearscore.h\"\n+#include \"botgossip.h\"\n+#include \"botspell.h\"\n+#include \"bottext.h\"\n+#include \"botwanderful.h\"\n+#include \"bpet_ai.h\"\n+#include \"Bag.h\"\n+#include \"BattlegroundMgr.h\"\n+#include \"CellImpl.h\"\n+#include \"CharacterCache.h\"\n+#include \"CharacterDatabase.h\"\n+#include \"Chat.h\"\n+#include \"CommonHelpers.h\"\n+#include \"Containers.h\"\n+#include \"DatabaseEnv.h\"\n+#include \"DBCStores.h\"\n+#include \"GameEventMgr.h\"\n+#include \"GameObjectAI.h\"\n+#include \"GenericMovementGenerator.h\"\n+#include \"GossipDef.h\"\n+#include \"GridNotifiersImpl.h\"\n+#include \"InstanceScript.h\"\n+#include \"Item.h\"\n+#include \"LFGMgr.h\"\n+#include \"Log.h\"\n+#include \"Loot.h\"\n+#include \"LootMgr.h\"\n+#include \"Mail.h\"\n+#include \"MapManager.h\"\n+#include \"MotionMaster.h\"\n+#include \"ObjectMgr.h\"\n+#include \"PathGenerator.h\"\n+#include \"PointMovementGenerator.h\"\n+#include \"ScriptedGossip.h\"\n+#include \"ScriptMgr.h\"\n+#include \"SpellAuraEffects.h\"\n+#include \"TemporarySummon.h\"\n+#include \"Transport.h\"\n+#include \"World.h\"\n+\n+#include \"G3DPosition.hpp\"\n+/*\n+NpcBot System by Trickerer (https://github.com/trickerer/Trinity-Bots; onlysuffering@gmail.com)\n+Version 5.2.77a\n+Original idea: https://bitbucket.org/lordpsyan/trinitycore-patches/src/3b8b9072280e/Individual/11185-BOTS-NPCBots.patch\n+Notes:\n+Methods may have null arg1 (Unit*):\n+DamageTaken(Unit*, ), JustDied(Unit*, ), OwnerAttackedBy(Unit*, ), HealReceived(Unit*, )\n+Possibly others\n+Performance impact factors:\n+ - Containers for selection\n+ - GetDistance() instead of IsWithinDist() (extra sqrt)\n+ - std::ostringstream::str() instead of std::ostringstream::view()\n+*/\n+\n+#ifdef _MSC_VER\n+# pragma warning(push, 4)\n+#endif\n+\n+static constexpr GossipOptionIcon BOT_ICON_ON = GOSSIP_ICON_BATTLE;\n+static constexpr GossipOptionIcon BOT_ICON_OFF = GOSSIP_ICON_CHAT;\n+\n+static constexpr uint32 MAX_AMMO_LEVEL = 13;\n+static constexpr uint8 AmmoDPSForLevel[MAX_AMMO_LEVEL][2] =\n+{\n+    { 80, 91 },\n+    { 72, 67 },\n+    { 62, 43 },\n+    { 57, 26 },\n+    { 52, 17 },\n+    { 44, 15 },\n+    { 37, 12 },\n+    { 30,  8 },\n+    { 25,  7 },\n+    { 15,  4 },\n+    { 10,  3 },\n+    {  5,  2 },\n+    {  1,  1 }\n+};\n+static constexpr uint32 MAX_POTION_SPELLS = 8;\n+static constexpr uint32 MAX_FEAST_SPELLS = 11;\n+static constexpr uint32 ManaPotionSpells[MAX_POTION_SPELLS][2] =\n+{\n+    { 70, 43186 },\n+    { 55, 28499 },\n+    { 49, 17531 },\n+    { 41, 17530 },\n+    { 31, 11903 },\n+    { 22,  2023 },\n+    { 14,   438 },\n+    {  5,   437 }\n+};\n+static constexpr uint32 HealingPotionSpells[MAX_POTION_SPELLS][2] =\n+{\n+    { 70, 43185 },\n+    { 55, 28495 },\n+    { 45, 17534 },\n+    { 35,  4042 },\n+    { 21,  2024 },\n+    { 12,   441 },\n+    {  3,   440 },\n+    {  1,   439 }\n+};\n+static constexpr uint32 DrinkSpells[MAX_FEAST_SPELLS][2] =\n+{\n+    { 80, 57073 },\n+    { 75, 43183 },\n+    { 70, 43182 },\n+    { 65, 27089 },\n+    { 60, 34291 },\n+    { 45,  1137 },\n+    { 35,  1135 },\n+    { 25,  1133 },\n+    { 15,   432 },\n+    {  5,   431 },\n+    {  1,   430 }\n+};\n+static constexpr uint32 EatSpells[MAX_FEAST_SPELLS][2] =\n+{\n+    { 80, 45548 },\n+    { 75, 45548 },\n+    { 70, 43180 }, //req 65 but\n+    { 65, 35270 },\n+    { 55, 27094 },\n+    { 45,  1131 },\n+    { 35,  1129 },\n+    { 25,  1127 },\n+    { 15,   435 },\n+    {  5,   434 },\n+    {  1,   433 }\n+};\n+\n+struct TSpellSummary\n+{\n+    uint8 Targets; // set of enum SelectTarget\n+    uint8 Effects; // set of enum SelectEffect\n+};\n+extern TSpellSummary* SpellSummary;\n+\n+static void ApplyBotPercentModFloatVar(float &var, float val, bool apply)\n+{\n+    var *= (apply ? ((100.f + val) / 100.f) : (100.f / (100.f + val)));\n+}\n+\n+bot_ai::bot_ai(Creature* creature) : CreatureAI(creature),\n+    _botData(const_cast<NpcBotData*>(BotDataMgr::SelectNpcBotData(IsTempBot() ? creature->ToTempSummon()->GetSummonerGUID().GetEntry() : creature->GetEntry()))),\n+    _botExtras(BotDataMgr::SelectNpcBotExtras(creature->GetEntry()))\n+{\n+    _checkMasterTimer = urand(5000, 15000);\n+    _updateTimerLong = urand(15000, 25000);\n+    _updateTimerEx1 = urand(12000, 15000);\n+    _updateTimerEx2 = urand(8000, 12000);\n+\n+    ResetBotAI(BOTAI_RESET_INIT);\n+\n+    if (!IsTempBot())\n+        BotDataMgr::RegisterBot(me);\n+}\n+bot_ai::~bot_ai()\n+{\n+    BOT_LOG_INFO(\"npcbots\", \"bot_ai destructor call for {} ({})\", me->GetName(), me->GetEntry());\n+\n+    for (Item* item : _equips)\n+        delete item;\n+\n+    if (!IsTempBot())\n+        BotDataMgr::UnregisterBot(me);\n+}\n+\n+ObjectGuid::LowType bot_ai::GetBotOwnerGuid() const\n+{\n+    return _botData->owner;\n+}\n+bool bot_ai::HasSharedOwner(ObjectGuid::LowType guid_low) const\n+{\n+    return _botData->shared_owners.contains(guid_low);\n+}\n+bool bot_ai::HasOwner(ObjectGuid::LowType guid_low) const\n+{\n+    if (guid_low == _botData->owner)\n+        return true;\n+    if (HasSharedOwner(guid_low))\n+        return true;\n+    return false;\n+}\n+bool bot_ai::IsSharedBot() const\n+{\n+    return !IAmFree() && master->GetGUID().GetCounter() != _botData->owner && HasSharedOwner(master->GetGUID().GetCounter());\n+}\n+\n+//0-178\n+void bot_ai::GenerateRand()\n+{\n+    _rand = urand(0, IAmFree() ? 100 : 100 + (master->GetNpcBotsCount() - 1) * 2);\n+}\n+\n+const std::string& bot_ai::LocalizedNpcText(Player const* forPlayer, uint32 textId)\n+{\n+    LocaleConstant loc = forPlayer ? forPlayer->GetSession()->GetSessionDbLocaleIndex() : sWorld->GetDefaultDbcLocale();\n+\n+    if (GossipText const* nt = sObjectMgr->GetGossipText(textId))\n+    {\n+        std::wstring wnamepart;\n+        NpcTextLocale const* ntl = sObjectMgr->GetNpcTextLocale(textId);\n+        if (loc != DEFAULT_LOCALE && ntl && ntl->Text_0[0].size() > size_t(loc) && !ntl->Text_0[0][loc].empty() && Utf8FitTo(ntl->Text_0[0][loc], wnamepart))\n+            return ntl->Text_0[0][loc];\n+        else\n+            return nt->Options[0].Text_0;\n+    }\n+\n+    {\n+        static std::map<uint32, std::string> unk_botstrings;\n+\n+        if (!unk_botstrings.contains(textId))\n+        {\n+            BOT_LOG_ERROR(\"entities.player\", \"NPCBots: bot text string #{} is not localized, at least for {}\", textId, localeNames[loc]);\n+\n+            std::ostringstream msg;\n+            msg << (loc == DEFAULT_LOCALE ? \"<undefined string \" : \"<unlocalized string \") << textId << \">\";\n+            unk_botstrings[textId] = msg.str();\n+        }\n+\n+        return unk_botstrings[textId];\n+    }\n+}\n+\n+void bot_ai::InitializeAI()\n+{\n+    if (!me->GetSpawnId() && !IsTempBot())\n+        SetWanderer();\n+\n+    Reset();\n+}\n+\n+void bot_ai::BotSay(std::string_view text, Player const* target) const\n+{\n+    if (!target && master->IsPlayer())\n+        target = master;\n+    if (!target)\n+        return;\n+\n+    me->Say(text, LANG_UNIVERSAL, target);\n+}\n+void bot_ai::BotWhisper(std::string_view text, Player const* target) const\n+{\n+    if (!target && master->IsPlayer())\n+        target = master;\n+    if (!target)\n+        return;\n+\n+    //Problem : Unit::Whisper target argument is non-const for no reason\n+    me->Whisper(text, LANG_UNIVERSAL, const_cast<Player*>(target));\n+}\n+void bot_ai::BotYell(std::string_view text, Player const* /*target*/) const\n+{\n+    me->Yell(text, LANG_UNIVERSAL);\n+}\n+\n+void bot_ai::ReportSpellCast(uint32 spellId, const std::string& followedByString, Player const* target) const\n+{\n+    std::string spellName;\n+    _LocalizeSpell(target, spellName, spellId);\n+    BotWhisper(spellName + followedByString, target);\n+}\n+\n+bool bot_ai::SetBotOwner(Player* newowner)\n+{\n+    ASSERT(newowner, \"Trying to set NULL owner!!!\");\n+    ASSERT(newowner->GetGUID().IsPlayer(), \"Trying to set a non-player as owner!!!\");\n+\n+    //have master already\n+    if (master->GetGUID() != me->GetGUID())\n+    {\n+        BOT_LOG_ERROR(\"entities.player\", \"bot_ai::SetBotOwner(): bot {} (id: {}) has master {} while trying to set to {}...\",\n+            me->GetName(), me->GetEntry(), master->GetName(), newowner->GetName());\n+        return false;\n+    }\n+    if (!IAmFree())\n+    {\n+        BOT_LOG_ERROR(\"entities.player\", \"bot_ai::SetBotOwner(): minion bot {} (id: {}) IS NOT FREE (has master {}) while trying to set to {}\",\n+            me->GetName(), me->GetEntry(), master->GetName(), newowner->GetName());\n+        return false;\n+    }\n+\n+    if (newowner->GetBotMgr()->AddBot(me) & BOT_ADD_FATAL)\n+    {\n+        _checkMasterTimer += 30000;\n+        return false;\n+    }\n+\n+    spawned = false;\n+\n+    (const_cast<CreatureTemplate*>(me->GetCreatureTemplate()))->unit_flags2 &= ~(UNIT_FLAG2_ALLOW_ENEMY_INTERACT);\n+    me->ReplaceAllUnitFlags2(UnitFlags2(me->GetCreatureTemplate()->unit_flags2));\n+\n+    //recursive\n+    if (master->GetGUID() == newowner->GetGUID())\n+        return true;\n+\n+    master = newowner;\n+    _checkOwershipTimer = BotCfg::GetOwnershipExpireTime() ? CalculateOwnershipCheckTime() : 0;\n+\n+    return true;\n+}\n+//Check if should totally unlink from owner\n+void bot_ai::CheckOwnerExpiry()\n+{\n+    if (!BotCfg::GetOwnershipExpireTime())\n+        return; //disabled\n+\n+    if (IsTempBot() || !IAmFree())\n+        return;\n+\n+    if (_botData->owner == 0)\n+        return;\n+\n+    ObjectGuid ownerGuid = ObjectGuid::Create<HighGuid::Player>(_botData->owner);\n+    time_t timeNow = time(0);\n+    time_t expireTime = time_t(BotCfg::GetOwnershipExpireTime());\n+    time_t baseTimeStamp;\n+\n+    if (BotCfg::GetOwnershipExpireMode() == BOT_OWNERSHIP_EXPIRE_OFFLINE)\n+    {\n+        uint32 accId = sCharacterCache->GetCharacterAccountIdByGuid(ownerGuid);\n+        QueryResult result = accId ? CharacterDatabase.PQuery(\"SELECT MAX(logout_time) FROM characters WHERE account = {}\", accId) : nullptr;\n+\n+        Field* fields = result ? result->Fetch() : nullptr;\n+        time_t lastLoginTime = fields ? time_t(fields[0].GetUInt32()) : timeNow;\n+        baseTimeStamp = lastLoginTime;\n+    }\n+    else //if (BotCfg::GetOwnershipExpireMode() == BOT_OWNERSHIP_EXPIRE_HIRE)\n+    {\n+        baseTimeStamp = time_t(_botData->hire_time);\n+    }\n+\n+    //either expired or owner does not exist\n+    if (timeNow >= baseTimeStamp + expireTime)\n+    {\n+        std::string name = \"unknown\";\n+        sCharacterCache->GetCharacterNameByGuid(ownerGuid, name);\n+        BOT_LOG_DEBUG(\"npcbots\", \"{}'s (guid: {}) ownership over bot {} ({}) has expired!\", name, _botData->owner, me->GetName(), me->GetEntry());\n+\n+        //send all items back\n+        CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_NPCBOT_EQUIP_BY_ITEM_INSTANCE);\n+        //        0            1                2      3         4        5      6             7                 8           9           10    11    12         13\n+        //\"SELECT creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomPropertyId, durability, playedTime, text, guid, itemEntry, owner_guid \"\n+        //  \"FROM item_instance WHERE guid IN (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\", CONNECTION_SYNCH\n+\n+        for (auto i : NPCBots::index_array<uint8, BOT_INVENTORY_SIZE>)\n+            stmt->setUInt32(i, _botData->equips[i] ? _botData->equips[i] : std::numeric_limits<uint32>::max());\n+\n+        PreparedQueryResult iiresult = CharacterDatabase.Query(stmt);\n+        if (iiresult)\n+        {\n+            std::vector<Item*> items;\n+\n+            do\n+            {\n+                Field* fields2 = iiresult->Fetch();\n+                uint32 itemGuidLow = fields2[11].GetUInt32();\n+                uint32 itemId = fields2[12].GetUInt32();\n+                uint8 item_idx = std::numeric_limits<uint8>::max();\n+\n+                for (auto i : NPCBots::index_array<uint8, BOT_INVENTORY_SIZE>)\n+                {\n+                    if (_equips[i] && _equips[i]->GetEntry() == itemId)\n+                    {\n+                        item_idx = i;\n+                        break;\n+                    }\n+                }\n+                if (item_idx >= BOT_INVENTORY_SIZE)\n+                {\n+                    BOT_LOG_ERROR(\"npcbots\", \"bot_ai::CheckOwnerExpiry(): item id {} guid {} not found in bot's inventory!\\n{}\", itemId, itemGuidLow, me->GetGUID().ToString());\n+                    continue;\n+                }\n+\n+                items.push_back(_equips[item_idx]);\n+                _removeEquipment(item_idx);\n+\n+            } while (iiresult->NextRow());\n+\n+            CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();\n+            while (!items.empty())\n+            {\n+                static const std::string subject = LocalizedNpcText(nullptr, BOT_TEXT_OWNERSHIP_EXPIRED);\n+                MailDraft draft(subject, \"\");\n+                for (uint8 i = 0; !items.empty() && i < MAX_MAIL_ITEMS; ++i)\n+                {\n+                    Item* item = items.back();\n+                    items.pop_back();\n+                    item->SetOwnerGUID(ownerGuid);\n+                    item->FSetState(ITEM_CHANGED);\n+                    item->SaveToDB(trans);\n+                    draft.AddItem(item);\n+                }\n+                draft.SendMailTo(trans, MailReceiver(_botData->owner), MailSender(me, MAIL_STATIONERY_GM));\n+            }\n+            CharacterDatabase.CommitTransaction(trans);\n+\n+            for (auto slot : NPCBots::index_array<uint8, BOT_FIRST_NON_WEAPON_SLOT>)\n+                if (_resetEquipment(slot, ObjectGuid::Empty, false) != BotEquipResult::BOT_EQUIP_RESULT_OK) {}\n+\n+            BotDataMgr::UpdateNpcBotData(me->GetEntry(), NPCBOT_UPDATE_EQUIPS, _equips.data());\n+        }\n+\n+        //hard reset owner\n+        uint32 newOwner = 0;\n+        BotDataMgr::UpdateNpcBotData(me->GetEntry(), NPCBOT_UPDATE_OWNER, &newOwner);\n+        //...shared owners\n+        NpcBotData::SharedOwnersContainer sharedOwners{};\n+        BotDataMgr::UpdateNpcBotData(me->GetEntry(), NPCBOT_UPDATE_SHARED_OWNERS, &sharedOwners);\n+        //...spec\n+        uint8 spec = SelectSpecForClass(_botExtras->bclass);\n+        BotDataMgr::UpdateNpcBotData(me->GetEntry(), NPCBOT_UPDATE_SPEC, &spec);\n+        //...and roles\n+        uint32 roleMask = DefaultRolesForClass(_botExtras->bclass, spec);\n+        BotDataMgr::UpdateNpcBotData(me->GetEntry(), NPCBOT_UPDATE_ROLES, &roleMask);\n+\n+        if (Group* gr = GetGroup())\n+            gr->RemoveMember(me->GetGUID());\n+    }\n+}\n+\n+void bot_ai::InitUnitFlags()\n+{\n+    if (BotCfg::DisplayEquipment() && CanDisplayNonWeaponEquipmentChanges())\n+    {\n+        (const_cast<CreatureTemplate*>(me->GetCreatureTemplate()))->unit_flags2 |= UNIT_FLAG2_MIRROR_IMAGE;\n+        me->ReplaceAllUnitFlags2(UnitFlags2(me->GetCreatureTemplate()->unit_flags2));\n+    }\n+    (const_cast<CreatureMovementData&>(me->GetMovementTemplate())).Chase = CreatureChaseMovementType::CanWalk;\n+}\n+\n+void bot_ai::ResetBotAI(uint8 resetType)\n+{\n+    _botCommandState = 0;\n+    _botAwaitState = BOT_AWAIT_NONE;\n+    _reviveTimer = 0;\n+\n+    if (resetType & BOTAI_RESET_MASK_RESET_MASTER)\n+        master = reinterpret_cast<Player*>(me);\n+    if (resetType & BOTAI_RESET_MASK_ABANDON_MASTER)\n+        _rentTimer = 0;\n+    if (resetType == BOTAI_RESET_INIT || resetType == BOTAI_RESET_LOGOUT)\n+    {\n+        _checkOwershipTimer = (BotCfg::GetOwnershipExpireTime() && _botData->owner) ? (resetType == BOTAI_RESET_INIT) ? 1000 : CalculateOwnershipCheckTime() : 0;\n+        if (resetType == BOTAI_RESET_INIT)\n+            homepos.Relocate(me);\n+        else //if (resetType == BOTAI_RESET_LOGOUT)\n+            _saveStats();\n+    }\n+\n+    if (!IsWanderer() || BotMgr::IsWanderingWorldBot(me))\n+    {\n+        (const_cast<CreatureTemplate*>(me->GetCreatureTemplate()))->unit_flags2 |= (UNIT_FLAG2_ALLOW_ENEMY_INTERACT);\n+        me->ReplaceAllUnitFlags2(UnitFlags2(me->GetCreatureTemplate()->unit_flags2));\n+    }\n+\n+    if ((resetType == BOTAI_RESET_DISMISS || resetType == BOTAI_RESET_LOGOUT) && !IsTempBot())\n+    {\n+        if (resetType == BOTAI_RESET_DISMISS)\n+            ResetAllMiscValues();\n+        EnableAllSpells(resetType == BOTAI_RESET_DISMISS);\n+        InitRoles();\n+    }\n+\n+    //me->IsAIEnabled = true;\n+    canUpdate = true;\n+\n+    if (spawned)\n+        ReturnHome();\n+\n+    if (!me->IsInWorld() || resetType == BOTAI_RESET_FORCERECALL)\n+    {\n+        TeleportHomeStart(resetType != BOTAI_RESET_UNBIND);\n+    }\n+    else\n+    {\n+        _atHome = false;\n+        spawned = false;\n+        ResetContestedPvP();\n+    }\n+}\n+\n+bool bot_ai::_checkImmunities(Unit const* target, SpellInfo const* spellInfo) const\n+{\n+    return target && spellInfo && !target->IsImmunedToDamage(spellInfo);\n+}\n+\n+SpellCastResult bot_ai::CheckBotCast(Unit const* victim, uint32 spellId) const\n+{\n+    if (spellId == 0)\n+        return SPELL_FAILED_DONT_REPORT;\n+\n+    if (HasBotCommandState(BOT_COMMAND_NO_CAST | BOT_COMMAND_INACTION))\n+        return SPELL_FAILED_DONT_REPORT;\n+\n+    if (victim->IsPlayer() && victim->ToPlayer()->IsGameMaster())\n+        return SPELL_FAILED_BAD_TARGETS;\n+\n+    SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);\n+    if (!spellInfo)\n+        return SPELL_FAILED_DONT_REPORT;\n+\n+    spellInfo = spellInfo->TryGetSpellInfoOverride(me);\n+\n+    if (me->IsMounted() && !(spellInfo->Attributes & SPELL_ATTR0_CASTABLE_WHILE_MOUNTED))\n+        return SPELL_FAILED_NOT_MOUNTED;\n+\n+    if (spellInfo->IsChanneled() && HasBotCommandState(BOT_COMMAND_NO_CAST_LONG))\n+        return SPELL_FAILED_NOT_IDLE;\n+\n+    if (spellInfo->CastTimeEntry)\n+    {\n+        int32 castTime = spellInfo->CastTimeEntry->Base;\n+        if (castTime > 0)\n+            ApplyClassSpellCastTimeMods(spellInfo, castTime);\n+\n+        if (castTime > 0)\n+        {\n+            if (HasBotCommandState(BOT_COMMAND_NO_CAST_LONG) || (me->GetMap()->IsDungeon() && !CCed(me, true) && IsWithinAoERadius(*me)))\n+                return SPELL_FAILED_NOT_IDLE;\n+        }\n+    }\n+\n+    if (int32(me->GetPower(spellInfo->PowerType)) < spellInfo->CalcPowerCost(me, spellInfo->GetSchoolMask()))\n+        return SPELL_FAILED_NO_POWER;\n+\n+    if (!IsSpellReady(spellInfo->GetFirstRankSpell()->Id, lastdiff, false))\n+        return SPELL_FAILED_NOT_READY;\n+\n+    //if (victim->isType(TYPEMASK_UNIT) && InDuel(victim))\n+    //    return SPELL_FAILED_BAD_TARGETS;\n+\n+    if (!CanBotAttackOnVehicle())\n+        return SPELL_FAILED_CASTER_AURASTATE;\n+\n+    //forced to follow but not close enough to master\n+    if (!IAmFree() && !master->GetBotMgr()->GetBotAllowCombatPositioning())\n+    {\n+        Position mpos;\n+        _calculatePos(master, mpos);\n+\n+        if (me->GetDistance(mpos) > float(std::max<uint8>(5, master->GetBotMgr()->GetBotFollowDist() / 8)))\n+            return SPELL_FAILED_NOT_IDLE;\n+    }\n+\n+    //scaling aura\n+    if (victim->isType(TYPEMASK_UNIT) && victim != me &&\n+        !spellInfo->IsPassive() && spellInfo->SpellLevel && !spellInfo->IsChanneled() &&\n+        (victim->GetLevel() + 10) < int32(spellInfo->GetFirstRankSpell()->SpellLevel))\n+    {\n+        for (auto i : NPCBots::index_array<uint8, MAX_SPELL_EFFECTS>)\n+        {\n+            if (spellInfo->_effects[i].Effect == SPELL_EFFECT_APPLY_AURA && spellInfo->IsPositiveEffect(i))\n+            {\n+                //BOT_LOG_ERROR(\"scripts\", \"CheckBotCast(): deny cast of {} by {} on low-level target {} (lvl {})\",\n+                //    spellInfo->SpellName[0], me->GetName(), victim->GetName(), victim->GetLevel());\n+                return SPELL_FAILED_LOWLEVEL;\n+            }\n+        }\n+    }\n+\n+    //disarmed\n+    if (spellInfo->EquippedItemClass == ITEM_CLASS_WEAPON)\n+    {\n+        if (spellInfo->EquippedItemInventoryTypeMask != 0)\n+        {\n+            if ((spellInfo->EquippedItemInventoryTypeMask & (1u<<INVTYPE_WEAPONMAINHAND)) &&\n+                !me->CanUseAttackType(BASE_ATTACK))\n+                return SPELL_FAILED_EQUIPPED_ITEM_CLASS_MAINHAND;\n+            if ((spellInfo->EquippedItemInventoryTypeMask & (1u<<INVTYPE_WEAPONOFFHAND)) &&\n+                !me->CanUseAttackType(OFF_ATTACK))\n+                return SPELL_FAILED_EQUIPPED_ITEM_CLASS_OFFHAND;\n+            if ((spellInfo->EquippedItemInventoryTypeMask & ((1u<<INVTYPE_RANGED)|(1u<<INVTYPE_RANGEDRIGHT)|(1u<<INVTYPE_THROWN))) &&\n+                !me->CanUseAttackType(RANGED_ATTACK))\n+                return SPELL_FAILED_EQUIPPED_ITEM_CLASS;\n+        }\n+        else if (!me->CanUseAttackType(BASE_ATTACK))\n+            return SPELL_FAILED_EQUIPPED_ITEM_CLASS_MAINHAND;\n+    }\n+\n+    //immunities\n+    if (victim->isType(TYPEMASK_UNIT))\n+    {\n+        if (spellInfo->HasEffect(SPELL_EFFECT_HEAL) || spellInfo->HasAura(SPELL_AURA_PERIODIC_HEAL))\n+        {\n+            //banish or something\n+            Unit::AuraEffectList const& healPctEffects = victim->GetAuraEffectsByType(SPELL_AURA_MOD_HEALING_PCT);\n+            if (!healPctEffects.empty())\n+            {\n+                int32 castTime = spellInfo->CastTimeEntry ? spellInfo->CastTimeEntry->Base : 0;\n+                if (castTime)\n+                    ApplyClassSpellCastTimeMods(spellInfo, castTime);\n+                for (AuraEffect const* aeff : healPctEffects)\n+                    if (aeff->GetAmount() <= -100 && (!castTime || aeff->GetBase()->GetDuration() >= castTime))\n+                        return SPELL_FAILED_BAD_TARGETS;\n+            }\n+        }\n+        else if (//spells that ignore immunities\n+            spellId != 64382 && //shattering throw\n+            spellId != 32375 && //mass dispel\n+            !_checkImmunities(victim, spellInfo))\n+            return SPELL_FAILED_BAD_TARGETS;\n+    }\n+\n+    switch (_botclass)\n+    {\n+        case BOT_CLASS_PALADIN:\n+        case BOT_CLASS_MAGE:\n+        case BOT_CLASS_PRIEST:\n+        case BOT_CLASS_DRUID:\n+        case BOT_CLASS_WARLOCK:\n+        case BOT_CLASS_SHAMAN:\n+            if (Feasting() && !master->IsInCombat() && !master->HasAuraType(SPELL_AURA_PERIODIC_DAMAGE))\n+                return SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW;\n+            break;\n+        case BOT_CLASS_WARRIOR: //BladeStorm\n+        case BOT_CLASS_BM: //BladeStorm PLACEHOLDER\n+        case BOT_CLASS_ROGUE: //Killing Spree\n+            if (me->HasAuraType(SPELL_AURA_ALLOW_ONLY_ABILITY))\n+                return SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW;\n+            break;\n+        case BOT_CLASS_HUNTER:\n+        case BOT_CLASS_DEATH_KNIGHT:\n+        case BOT_CLASS_SPHYNX:\n+        case BOT_CLASS_ARCHMAGE:\n+        case BOT_CLASS_DREADLORD:\n+        case BOT_CLASS_SPELLBREAKER:\n+        case BOT_CLASS_DARK_RANGER:\n+        case BOT_CLASS_NECROMANCER:\n+        case BOT_CLASS_SEA_WITCH:\n+        case BOT_CLASS_CRYPT_LORD:\n+            break;\n+        default:\n+            BOT_LOG_ERROR(\"entities.player\", \"CheckBotCast(): Unknown bot class {}\", _botclass);\n+            break;\n+    }\n+\n+    return SPELL_CAST_OK;\n+}\n+\n+bool bot_ai::doCast(Unit* victim, uint32 spellId, bool triggered)\n+{\n+    return doCast(victim, spellId, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE);\n+}\n+\n+bool bot_ai::doCast(Unit* victim, uint32 spellId, TriggerCastFlags flags)\n+{\n+    if (spellId == 0) return false;\n+    if (!victim || !victim->IsInWorld() || me->GetMap() != victim->FindMap()) return false;\n+    if (IsCasting()) return false;\n+\n+    m_botSpellInfo = sSpellMgr->GetSpellInfo(spellId);\n+    if (!m_botSpellInfo)\n+        return false;\n+\n+    m_botSpellInfo = m_botSpellInfo->TryGetSpellInfoOverride(me);\n+\n+    //select aura level\n+    if (victim->isType(TYPEMASK_UNIT))\n+    {\n+        if (SpellInfo const* actualSpellInfo = m_botSpellInfo->GetAuraRankForLevel(victim->GetLevel()))\n+            m_botSpellInfo = actualSpellInfo;\n+\n+        if (!m_botSpellInfo->IsTargetingArea())\n+        {\n+            uint8 approximateAuraEffectMask = 0;\n+            uint8 nonAuraEffectMask = 0;\n+            for (auto i: NPCBots::index_array<uint8, MAX_SPELL_EFFECTS>)\n+            {\n+                if (m_botSpellInfo->_effects[i].IsAura())\n+                    approximateAuraEffectMask |= 1u << i;\n+                else if (m_botSpellInfo->_effects[i].IsEffect())\n+                    nonAuraEffectMask |= 1u << i;\n+            }\n+\n+            for (auto i: NPCBots::index_array<uint8, MAX_SPELL_EFFECTS>)\n+            {\n+                // check if target already has the same type, but more powerful aura\n+                if (!nonAuraEffectMask && (approximateAuraEffectMask & (1u << i)))\n+                    if (!victim->IsHighestExclusiveAuraEffect(m_botSpellInfo, AuraType(m_botSpellInfo->_effects[i].ApplyAuraName),\n+                        m_botSpellInfo->_effects[i].CalcValue(me, &m_botSpellInfo->_effects[i].BasePoints), approximateAuraEffectMask, false))\n+                        return false;\n+            }\n+        }\n+\n+        if ((flags & TRIGGERED_FULL_MASK) != TRIGGERED_FULL_MASK &&\n+            !(m_botSpellInfo->AttributesEx2 & SPELL_ATTR2_CAN_TARGET_NOT_IN_LOS) &&\n+            !IsInBotParty(victim) && !me->IsWithinLOSInMap(victim, LINEOFSIGHT_ALL_CHECKS, VMAP::ModelIgnoreFlags::M2))\n+            return false;\n+    }\n+\n+    //check wrong spell interruption attempts\n+    if (/*victim->isType(TYPEMASK_UNIT) && */!HasBotCommandState(BOT_COMMAND_ISSUED_ORDER) &&\n+        !CastingUnitCheck::CastInterruptionCheck(victim, m_botSpellInfo))\n+        return false;\n+\n+    //for debug only\n+    if (victim->isType(TYPEMASK_UNIT) && victim->isDead())\n+    {\n+        if (victim->getDeathState() == DeathState::DEAD)\n+            BOT_LOG_DEBUG(\"npcbots\", \"bot_ai::doCast(): {} (bot class {}) tried to cast spell {} on a DEAD target {}\", me->GetName(), _botclass, spellId, victim->GetName());\n+        else if (!(m_botSpellInfo->AttributesEx2 & SPELL_ATTR2_CAN_TARGET_DEAD) &&\n+            !m_botSpellInfo->HasEffect(SPELL_EFFECT_RESURRECT) &&\n+            !m_botSpellInfo->HasEffect(SPELL_EFFECT_RESURRECT_NEW) &&\n+            !m_botSpellInfo->HasEffect(SPELL_EFFECT_SELF_RESURRECT))\n+            BOT_LOG_DEBUG(\"npcbots\", \"bot_ai::doCast(): {} (bot class {}) tried to cast spell {} on a CORPSE target {}\", me->GetName(), _botclass, spellId, victim->GetName());\n+        //return false;\n+    }\n+\n+    //spells with cast time\n+    if (me->isMoving() && !(flags & TRIGGERED_CAST_DIRECTLY) && !m_botSpellInfo->IsAutoRepeatRangedSpell() && (m_botSpellInfo->InterruptFlags & SPELL_INTERRUPT_FLAG_MOVEMENT) &&\n+        !m_botSpellInfo->HasAttribute(SPELL_ATTR0_ON_NEXT_SWING))\n+    {\n+        int32 cast_time;\n+        if (m_botSpellInfo->IsChanneled())\n+            cast_time = m_botSpellInfo->GetDuration();\n+        else\n+        {\n+            cast_time = int32(m_botSpellInfo->CalcCastTime());\n+            me->ModSpellCastTime(m_botSpellInfo, cast_time);\n+        }\n+\n+        if (cast_time > 0)\n+        {\n+            if (!HasBotCommandState(BOT_COMMAND_ISSUED_ORDER))\n+            {\n+                if (JumpingOrFalling() || HasBotCommandState(BOT_COMMAND_STAY))\n+                    return false;\n+                if (!me->GetVictim() && me->IsInWorld() && (me->GetMap()->IsRaid() || me->GetMap()->IsHeroic()) &&\n+                    !m_botSpellInfo->HasAura(SPELL_AURA_MOUNTED))\n+                    return false;\n+                if (!m_botSpellInfo->HasEffect(SPELL_EFFECT_HEAL) && Rand() > (IAmFree() ? 80 : 50))\n+                    return false;\n+            }\n+\n+            me->BotStopMovement();\n+        }\n+    }\n+\n+    if ((!victim->isType(TYPEMASK_UNIT) || IsInBotParty(victim)) && !victim->IsWithinLOSInMap(me, LINEOFSIGHT_ALL_CHECKS, VMAP::ModelIgnoreFlags::M2) &&\n+        !HasBotCommandState(BOT_COMMAND_STAY) && !me->GetVehicle())\n+    {\n+        if (!IAmFree())\n+        {\n+            if (me->GetDistance(victim) > 10.f)\n+            {\n+                Position pos = victim->GetPosition();\n+                //victim->GetPosition(&pos);\n+                BotMovement(BOT_MOVE_POINT, &pos);\n+                //me->GetMotionMaster()->MovePoint(me->GetMapId(), pos);\n+            }\n+            else\n+                me->Relocate(victim);\n+        }\n+        else\n+            return false;\n+    }\n+\n+    //remove shapeshifts manually to restore powers/stats\n+    if (me->GetShapeshiftForm() != FORM_NONE)\n+    {\n+        if (m_botSpellInfo->CheckShapeshift(me->GetShapeshiftForm()) != SPELL_CAST_OK)\n+            if (!removeShapeshiftForm())\n+                return false;\n+    }\n+\n+    //CHECKS PASSED, NOW DO IT\n+\n+    if (me->GetStandState() == UNIT_STAND_STATE_SIT && !(m_botSpellInfo->Attributes & SPELL_ATTR0_CASTABLE_WHILE_SITTING))\n+    {\n+        if (!doMana && me->HasInterruptFlag(AURA_INTERRUPT_FLAG_NOT_SEATED))\n+            UpdateMana();\n+\n+        feast_health = false;\n+        feast_mana = false;\n+        me->SetStandState(UNIT_STAND_STATE_STAND);\n+    }\n+\n+    //debug\n+    //BOT_LOG_ERROR(\"entities.player\", \"CheckBotCast(): {} ({}) by {} on {}\", m_botSpellInfo->SpellName[0], spellId, me->GetName(), victim->GetName());\n+\n+    bool triggered = !!(flags & TRIGGERED_CAST_DIRECTLY);\n+    SpellCastTargets targets;\n+    targets.SetUnitTarget(victim);\n+    Spell* spell = new Spell(me, m_botSpellInfo, flags);\n+    spell->prepare(targets); //sets current spell if succeed\n+/*\n+    SpellCastResult result = spell->CheckCast(true);\n+    if (result != SPELL_CAST_OK)\n+        BOT_LOG_ERROR(\"entities.player\", \"doCast(): {} ({}) by {} on {} failed with {}\",\n+        m_botSpellInfo->SpellName[0], spellId, me->GetName(), victim->GetName(), uint32(result));\n+*/\n+    bool casted = triggered; //triggered casts are casted immediately\n+    for (auto i: NPCBots::index_array<uint8, CURRENT_MAX_SPELL>)\n+    {\n+        if (me->GetCurrentSpell(i) == spell)\n+        {\n+            casted = true;\n+            break;\n+        }\n+    }\n+\n+    if (!casted)\n+    {\n+        //failed to cast\n+        if (HasBotCommandState(BOT_COMMAND_ISSUED_ORDER) &&\n+            !_orders.empty() && _orders.front()._type == BOT_ORDER_SPELLCAST &&\n+            _orders.front().params.spellCastParams.baseSpell == m_botSpellInfo->GetFirstRankSpell()->Id)\n+        {\n+            if (DEBUG_BOT_ORDERS)\n+                BOT_LOG_ERROR(\"entities.player\", \"doCast(): ordered spell {} is not casted!\", m_botSpellInfo->Id);\n+            CancelOrder(_orders.front());\n+        }\n+\n+        return false;\n+    }\n+\n+    if (triggered)\n+        return true;\n+    if (m_botSpellInfo->IsPassive() || m_botSpellInfo->IsCooldownStartedOnEvent())\n+        return true;\n+    if (!m_botSpellInfo->StartRecoveryCategory || !m_botSpellInfo->StartRecoveryTime)\n+        return true;\n+\n+    float gcd = float(m_botSpellInfo->StartRecoveryTime);\n+\n+    ApplyBotSpellGlobalCooldownMods(m_botSpellInfo, gcd);\n+    //Apply haste to cooldown\n+    if (haste && m_botSpellInfo->StartRecoveryCategory == 133 && m_botSpellInfo->StartRecoveryTime == 1500 &&\n+        m_botSpellInfo->DmgClass != SPELL_DAMAGE_CLASS_MELEE && m_botSpellInfo->DmgClass != SPELL_DAMAGE_CLASS_RANGED &&\n+        !(m_botSpellInfo->Attributes & (SPELL_ATTR0_REQ_AMMO|SPELL_ATTR0_ABILITY)))\n+        ApplyBotPercentModFloatVar(gcd, float(haste), false);\n+\n+    //if cast time is lower than 1.5 sec it also reduces gcd but only if not instant\n+    if (m_botSpellInfo->CastTimeEntry)\n+    {\n+        if (int32 castTime = m_botSpellInfo->CastTimeEntry->Base)\n+        {\n+            if (castTime > 0)\n+            {\n+                ApplyClassSpellCastTimeMods(m_botSpellInfo, castTime);\n+                if (castTime < gcd)\n+                    gcd = float(castTime);\n+            }\n+        }\n+    }\n+\n+    GC_Timer = uint32(gcd);\n+    //global cd cannot be less than 1000 ms\n+    GC_Timer = std::max<uint32>(GC_Timer, 1000);\n+    //global cd cannot be greater than 1500 ms\n+    GC_Timer = std::min<uint32>(GC_Timer, 1500);\n+\n+    return true;\n+}\n+//Follow point calculation\n+void bot_ai::_calculatePos(Unit const* followUnit, Position& pos, float* speed/* = nullptr*/) const\n+{\n+    Player const* player = followUnit->ToPlayer();\n+    uint8 followdist = !player ? BotMgr::GetBotFollowDistMax() / 2 : player->GetBotMgr()->GetBotFollowDist();\n+    float mydist, angle;\n+\n+    if (HasRole(BOT_ROLE_TANK) && !IsTank(followUnit))\n+    {\n+        uint8 tanks = player != master ? 10 : std::max<uint8>(1, player->GetBotMgr()->GetNpcBotsCountByRole(BOT_ROLE_TANK));\n+        uint8 slot = player != master ? urand(0, 9) : player->GetBotMgr()->GetNpcBotSlotByRole(BOT_ROLE_TANK, me);\n+        angle = float(M_PI) / 6.0f; //max bias (left of right) //total arc is angle * 2\n+        angle = (angle / tanks) * (slot - (slot % 2)); //bias\n+        if (slot % 2) angle *= -1.f; //bias interchange\n+        mydist = 3.5f;\n+    }\n+    else if (HasRole(BOT_ROLE_RANGED))\n+    {\n+        uint8 rangeds = player != master ? 20 : std::max<uint8>(1, player->GetBotMgr()->GetNpcBotsCountByRole(BOT_ROLE_RANGED));\n+        uint8 slot = player != master ? urand(0, 19) : player->GetBotMgr()->GetNpcBotSlotByRole(BOT_ROLE_RANGED, me);\n+        angle = float(M_PI) / 3.5f; //max bias (left of right) //total arc is angle * 2\n+        angle = (angle / rangeds) * (slot - (slot % 2)); //bias\n+        if (slot % 2) angle *= -1.f; //bias interchange\n+        angle += float(M_PI); //behind\n+        mydist = 1.0f;\n+    }\n+    else if (HasRole(BOT_ROLE_DPS))\n+    {\n+        uint8 dpss = player != master ? 20 : std::max<uint8>(1, player->GetBotMgr()->GetNpcBotsCountByRole(BOT_ROLE_DPS));\n+        uint8 slot = player != master ? urand(0, 19) : player->GetBotMgr()->GetNpcBotSlotByRole(BOT_ROLE_DPS, me);\n+        angle = float(M_PI) / 7.5f; //max bias (left of right) //total arc is angle * 2\n+        angle = (angle / dpss) * (slot); //bias\n+        if (slot % 2) angle *= -1.f; //bias interchange\n+        angle += float(((slot % 4) < 2) ? (M_PI/2.f) : -(M_PI/2.f)); //sides\n+        mydist = 2.0f;\n+    }\n+    else\n+    {\n+        angle = float((me->GetEntry() % 2) ? (M_PI/2.f) : -(M_PI/2.f));\n+        mydist = 0.5f;\n+    }\n+\n+    mydist += std::max<int32>(int32(followdist) - 30, 5) / 7.f; //1.f-10.f\n+    mydist = std::max<float>(mydist - 2.f, 0.0f); //get bots closer\n+\n+    if (me->GetVehicle())\n+        mydist *= 2.f;\n+\n+    Position mpos;\n+    Unit const* bmover = me->GetVehicle() ? me->GetVehicleBase() : me;\n+    Unit const* mmover = followUnit->GetVehicle() ? followUnit->GetVehicleBase() : followUnit;\n+    uint32 movFlags = mmover->m_movementInfo.GetMovementFlags();\n+    float size = bmover->GetCombatReach() * 2;\n+    if (bmover->CanFly())\n+    {\n+        angle += mmover->GetOrientation();\n+        float &x = mpos.m_positionX, &y = mpos.m_positionY, &z = mpos.m_positionZ;\n+        bool over = false;\n+        for (uint8 i = 0; i != 5 + over; ++i)\n+        {\n+            if (over)\n+            {\n+                mydist *= 0.2f;\n+                break;\n+            }\n+            mmover->GetNearPoint(bmover, x, y, z, mydist, angle);\n+            if (!followUnit->IsWithinLOS(x,y,z)) //try to get much closer to follow unit\n+            {\n+                mydist *= 0.4f - float(i*0.07f);\n+                size *= 0.1f;\n+                if (size < 0.1)\n+                    size = 0.f;\n+            }\n+            else\n+                over = true;\n+        }\n+    }\n+    else\n+        mpos = mmover->GetFirstCollisionPosition(mydist+size, angle);\n+\n+    if ((movFlags & MOVEMENTFLAG_FORWARD) && !(movFlags & MOVEMENTFLAG_FALLING_FAR))\n+    {\n+        float const aheadDist = std::max<float>(followdist * 0.08f, 6.f);\n+        float tx = mpos.m_positionX + aheadDist * std::cos(mmover->GetOrientation());\n+        float ty = mpos.m_positionY + aheadDist * std::sin(mmover->GetOrientation());\n+        float tz = mpos.m_positionZ;\n+        if (!bmover->CanFly())\n+            bmover->UpdateAllowedPositionZ(tx, ty, tz);\n+        if (mmover->IsWithinLOS(tx, ty, tz))\n+            mpos.Relocate(tx, ty, tz);\n+    }\n+\n+    if (me->GetPositionZ() < mpos.GetPositionZ())\n+        mpos.m_positionZ += 0.5f; //prevent going underground while moving\n+\n+    if (speed && !IAmFree() && player == master)\n+    {\n+        const float posdist = bmover->GetDistance(mpos);\n+        if (mmover->IsWalking() || HasBotCommandState(BOT_COMMAND_WALK))\n+        {\n+            const float basewalkspeed = bmover->GetSpeed(MOVE_WALK);\n+            *speed = basewalkspeed;\n+            if (!HasBotCommandState(BOT_COMMAND_WALK) && posdist > 10.0f && bmover->GetDistance(mmover) > 10.0f)\n+                *speed = bmover->GetSpeed(MOVE_RUN);\n+            else if (posdist > 7.5f)\n+                *speed = basewalkspeed * 1.15f;\n+        }\n+        else\n+        {\n+            const float baserunspeed = bmover->GetSpeed(MOVE_RUN);\n+            if (posdist > 50.0f)\n+                *speed = baserunspeed * 2.0f;\n+            else if (posdist > 30.0f)\n+                *speed = baserunspeed * 1.5f;\n+            else if (posdist > 10.0f)\n+                *speed = baserunspeed * 1.25f;\n+        }\n+    }\n+\n+    pos.Relocate(mpos);\n+\n+    //         TTT\n+    //      m       m\n+    //     m    M    m\n+    //      m       m\n+    //        rrrrr\n+    //\n+    //M - master (followUnit)\n+    //T - bot tank (ROLE_TANK)\n+    //r - ranged (ROLE_RANGED)\n+    //m - melee (ROLE_DPS)\n+}\n+// Movement set\n+// Uses MovePoint() for following instead of MoveFollow()\n+// This helps bots overcome a bug with fanthom walls on grid borders blocking pathing\n+void bot_ai::BotMovement(BotMovementType type, Position const* pos, Unit* target, bool generatePath, float speed) const\n+{\n+    Vehicle* veh = me->GetVehicle();\n+    VehicleSeatEntry const* seat = veh ? veh->GetSeatForPassenger(me) : nullptr;\n+    bool canControl = seat ? (seat->Flags & VEHICLE_SEAT_FLAG_CAN_CONTROL) : false;\n+    Unit* mover = canControl ? veh->GetBase() : !veh ? me : nullptr;\n+    if (!mover)\n+        return;\n+\n+    switch (type)\n+    {\n+        case BOT_MOVE_CHASE:\n+            ASSERT(target);\n+            mover->GetMotionMaster()->MoveChase(target, {}, ChaseAngle(target->GetRelativeAngle(me), float(target->IsPlayer() ? M_PI * 2.0 : M_PI / 8.0)));\n+            break;\n+        case BOT_MOVE_POINT:\n+            mover->GetMotionMaster()->Add(new PointMovementGenerator<Creature>(1, pos->m_positionX, pos->m_positionY, pos->m_positionZ, generatePath, speed));\n+            break;\n+        case BOT_MOVE_JUMP:\n+            mover->GetMotionMaster()->MoveJump(pos->m_positionX, pos->m_positionY, pos->m_positionZ, mover->GetAbsoluteAngle(pos),\n+                22.0f, mover->GetExactDist2d(pos) * Movement::gravity / (22.0f * 2.0f), 1, true);\n+            break;\n+        default:\n+            BOT_LOG_ERROR(\"scripts\", \"BotMovement: unhandled bot movement type {}\", uint32(type));\n+            return;\n+    }\n+}\n+bool bot_ai::CanBotMoveVehicle() const\n+{\n+    if (VehicleSeatEntry const* seat = me->GetVehicle() ? me->GetVehicle()->GetSeatForPassenger(me) : nullptr)\n+        return seat->Flags & VEHICLE_SEAT_FLAG_CAN_CONTROL;\n+\n+    return false;\n+}\n+void bot_ai::MoveToSendPosition(Position const& mpos)\n+{\n+    EventRemoveBotAwaitState(BOT_AWAIT_SEND);\n+    if (me->GetExactDist(mpos) <= 70.0f && !CCed(me, true))\n+    {\n+        SetBotCommandState(BOT_COMMAND_STAY);\n+        BotMovement(BOT_MOVE_POINT, &mpos, nullptr, false);\n+        if (botPet && !CCed(botPet, true))\n+        {\n+            botPet->GetBotPetAI()->SetBotCommandState(BOT_COMMAND_STAY);\n+            botPet->GetMotionMaster()->MovePoint(me->GetMapId(), mpos, false);\n+        }\n+        sendlastpos.Relocate(me);\n+        BotWhisper(\"Moving to position!\");\n+    }\n+    else\n+        BotWhisper(\"Position is too far away!\");\n+}\n+void bot_ai::MoveToSendPosition(uint32 point_id)\n+{\n+    MoveToSendPosition(sendpos[point_id]);\n+}\n+void bot_ai::MarkSendPosition(uint32 point_id)\n+{\n+    sendpos[point_id].Relocate(me);\n+}\n+\n+void bot_ai::SetBotAwaitState(uint8 state)\n+{\n+    if (HasBotAwaitState(state))\n+        return;\n+\n+    if (!me->IsAlive())\n+        return;\n+\n+    _botAwaitState |= state;\n+\n+    AbortAwaitStateRemoval();\n+    awaitStateRemEvent = new AwaitStateRemovalEvent(this, state);\n+    Events.AddEvent(awaitStateRemEvent, Events.CalculateTime(30s));\n+}\n+\n+void bot_ai::EventRemoveBotAwaitState(uint8 state)\n+{\n+    AbortAwaitStateRemoval();\n+    RemoveBotAwaitState(state);\n+}\n+\n+void bot_ai::AbortAwaitStateRemoval()\n+{\n+    if (awaitStateRemEvent)\n+    {\n+        if (awaitStateRemEvent->IsActive())\n+            awaitStateRemEvent->ScheduleAbort();\n+        awaitStateRemEvent = nullptr;\n+    }\n+}\n+\n+void bot_ai::SetBotCommandState(uint32 st, bool force, Position* newpos, float* speed/* = nullptr*/)\n+{\n+    if (!(st & (BOT_COMMAND_UNBIND | BOT_COMMAND_INACTION)))\n+    {\n+        if (!me->IsAlive() || JumpingOrFalling())\n+            return;\n+    }\n+\n+    Vehicle const* veh = me->GetVehicle();\n+    VehicleSeatEntry const* seat = veh ? veh->GetSeatForPassenger(me) : nullptr;\n+    bool canControl = seat ? (seat->Flags & VEHICLE_SEAT_FLAG_CAN_CONTROL) : false;\n+    Unit* mover = canControl ? veh->GetBase() : !veh ? me : nullptr;\n+    if (mover)\n+    {\n+        if ((st & BOT_COMMAND_FOLLOW) && !IsChanneling() &&\n+            (force || (!mover->isMoving() && !IsCasting() && master->IsAlive() && !Feasting())))\n+        {\n+            if (!me->IsInMap(master)) return;\n+            if (CCed(mover, true)/* || master->HasUnitState(UNIT_STATE_FLEEING)*/) return;\n+            float myspeed = 0.0f;\n+            if (!newpos)\n+            {\n+                ASSERT(!IAmFree());\n+                _calculatePos(master, movepos, &myspeed);\n+            }\n+            else\n+            {\n+                movepos.m_positionX = newpos->m_positionX;\n+                movepos.m_positionY = newpos->m_positionY;\n+                movepos.m_positionZ = newpos->m_positionZ;\n+            }\n+            if (me->GetStandState() == UNIT_STAND_STATE_SIT && !Feasting())\n+                me->SetStandState(UNIT_STAND_STATE_STAND);\n+            if (IsShootingWand())\n+                me->InterruptSpell(CURRENT_AUTOREPEAT_SPELL);\n+            BotMovement(BOT_MOVE_POINT, &movepos, nullptr, true, speed ? *speed : myspeed);\n+            //me->GetMotionMaster()->MovePoint(master->GetMapId(), pos);\n+            //me->GetMotionMaster()->MoveFollow(master, mydist, angle);\n+            RemoveBotCommandState(BOT_COMMAND_STAY | BOT_COMMAND_FULLSTOP | BOT_COMMAND_ATTACK | BOT_COMMAND_COMBATRESET);\n+        }\n+        else if (st & BOT_COMMAND_MASK_NOCAST_ANY)\n+        {\n+            uint32 removeMask = BOT_COMMAND_MASK_NOCAST_ANY & GetBotCommandState();\n+            st &= ~removeMask;\n+            RemoveBotCommandState(removeMask);\n+            me->InterruptNonMeleeSpells(false);\n+            if (mover != me->ToUnit())\n+                mover->InterruptNonMeleeSpells(false);\n+        }\n+        else if (st & BOT_COMMAND_INACTION)\n+        {\n+            uint32 removeMask = BOT_COMMAND_INACTION & GetBotCommandState();\n+            st &= ~removeMask;\n+            RemoveBotCommandState(removeMask | BOT_COMMAND_MASK_NOCAST_ANY | BOT_COMMAND_STAY | BOT_COMMAND_FULLSTOP | BOT_COMMAND_ATTACK | BOT_COMMAND_COMBATRESET);\n+            me->AttackStop();\n+            me->InterruptNonMeleeSpells(true);\n+            if (mover != me->ToUnit())\n+            {\n+                mover->AttackStop();\n+                mover->InterruptNonMeleeSpells(true);\n+            }\n+            opponent = nullptr;\n+        }\n+        else if (st & BOT_COMMAND_FULLSTOP)\n+        {\n+            RemoveBotCommandState(BOT_COMMAND_FOLLOW | BOT_COMMAND_STAY | BOT_COMMAND_ATTACK);\n+            me->AttackStop();\n+            me->InterruptNonMeleeSpells(true);\n+            if (mover != me->ToUnit())\n+            {\n+                mover->AttackStop();\n+                mover->InterruptNonMeleeSpells(true);\n+            }\n+            opponent = nullptr;\n+            if (mover->isMoving())\n+                mover->ToCreature()->BotStopMovement();\n+        }\n+        else if (st & BOT_COMMAND_STAY)\n+        {\n+            RemoveBotCommandState(BOT_COMMAND_FOLLOW | BOT_COMMAND_FULLSTOP);\n+            if (mover->isMoving())\n+                mover->ToCreature()->BotStopMovement();\n+        }\n+        else if (st & BOT_COMMAND_ATTACK)\n+        {\n+            RemoveBotCommandState(BOT_COMMAND_FOLLOW);\n+        }\n+        else if (st & BOT_COMMAND_COMBATRESET)\n+        {\n+            RemoveBotCommandState(BOT_COMMAND_ATTACK);\n+        }\n+    }\n+\n+    _botCommandState |= st;\n+}\n+\n+void bot_ai::RemoveBotCommandState(uint32 st)\n+{\n+    _botCommandState &= ~st;\n+}\n+\n+bool bot_ai::IsPointedTarget(Unit const* target, uint8 targetFlags) const\n+{\n+    if (Group const* gr = (IAmFree() ? nullptr : master->GetGroup()))\n+        if (targetFlags)\n+            for (auto i: NPCBots::index_array<uint8, TARGET_ICONS_COUNT>)\n+                if (targetFlags & GroupIconsFlags[i])\n+                    if (target->GetGUID() == gr->GetTargetIcons()[i])\n+                        return true;\n+\n+    return false;\n+}\n+bool bot_ai::IsPointedHealTarget(Unit const* target) const\n+{\n+    return IsPointedTarget(target, BotCfg::GetHealTargetIconFlags());\n+}\n+bool bot_ai::IsPointedTankingTarget(Unit const* target) const\n+{\n+    return IsPointedTarget(target, BotCfg::GetTankTargetIconFlags());\n+}\n+bool bot_ai::IsPointedOffTankingTarget(Unit const* target) const\n+{\n+    return IsPointedTarget(target, BotCfg::GetOffTankTargetIconFlags());\n+}\n+//unused\n+bool bot_ai::IsPointedDPSTarget(Unit const* target) const\n+{\n+    return IsPointedTarget(target, BotCfg::GetDPSTargetIconFlags());\n+}\n+//unused\n+bool bot_ai::IsPointedRangedDPSTarget(Unit const* target) const\n+{\n+    return IsPointedTarget(target, BotCfg::GetRangedDPSTargetIconFlags());\n+}\n+bool bot_ai::IsPointedNoDPSTarget(Unit const* target) const\n+{\n+    return IsPointedTarget(target, BotCfg::GetNoDPSTargetIconFlags());\n+}\n+bool bot_ai::IsPointedAnyAttackTarget(Unit const* target) const\n+{\n+    return IsPointedTarget(target, BotCfg::GetOffTankTargetIconFlags() | BotCfg::GetDPSTargetIconFlags() | BotCfg::GetRangedDPSTargetIconFlags());\n+}\n+// Buffs And Heal (really)\n+// Priority as follows: 1) heal players 2) buff players 3) heal bots 4) buff bots\n+// Priority adjustments to be considered\n+void bot_ai::BuffAndHealGroup(uint32 diff)\n+{\n+    if (GC_Timer > diff) return;\n+    if (me->IsMounted() && !IsWanderer()) return;\n+    if (IsCasting() || Feasting()) return;\n+\n+    if (IAmFree())\n+    {\n+        if (BuffTarget(me, diff))\n+            return;\n+\n+        if (HealTarget(me, diff))\n+            return;\n+\n+        if (me->GetFaction() == FACTION_TEMPLATE_NEUTRAL_HOSTILE || me->HasAura(BERSERK))\n+            return;\n+\n+        std::list<Unit*> targets2;\n+        GetNearbyFriendlyTargetsList(targets2, 30);\n+        std::erase_if(targets2, BOTAI_PRED::BuffTargetExclude());\n+        std::erase_if(targets2, [this](Unit const* unit) {\n+            return !unit->IsPlayer() && !(IsWanderer() && unit->IsNPCBot() && unit->ToCreature()->GetBotAI()->IsWanderer());\n+        });\n+        if (!targets2.empty() && BuffTarget(targets2.size() == 1 ? targets2.front() : Bcore::Containers::SelectRandomContainerElement(targets2), diff))\n+            return;\n+        for (Unit* heal_target : targets2)\n+            if (GetHealthPCT(heal_target) < 95 && urand(1, 100) <= (30 + 30*uint32(!!GetBG())) && HealTarget(heal_target, diff))\n+                break;\n+\n+        return;\n+    }\n+\n+    Group const* pGroup = master->GetGroup();\n+    uint8 hppctthreshold = GetHealHpPctThreshold();\n+    if (!pGroup)\n+    {\n+        //heals\n+        if (HasRole(BOT_ROLE_HEAL))\n+        {\n+            std::list<Unit*> targets3;\n+            if (master->IsAlive() && !master->HasUnitState(UNIT_STATE_ISOLATED) && GetHealthPCT(master) <= hppctthreshold && me->GetDistance(master) < 40)\n+                targets3.push_back(master);\n+            if (master->GetVehicleBase() && !(master->GetVehicleBase()->IsCreature() &&\n+                master->GetVehicleCreatureBase()->GetCreatureTemplate()->type == CREATURE_TYPE_MECHANICAL) &&\n+                !master->GetVehicleBase()->HasUnitState(UNIT_STATE_ISOLATED) && GetHealthPCT(master->GetVehicleBase()) <= hppctthreshold &&\n+                me->GetDistance(master->GetVehicleBase()) < 40)\n+                targets3.push_back(master->GetVehicleBase());\n+            for (auto const& [_, bot] : *master->GetBotMgr()->GetBotMap())\n+            {\n+                if (!(!bot->IsInWorld() || me->GetMap() != bot->FindMap() || !bot->IsAlive() || bot->HasUnitState(UNIT_STATE_ISOLATED) ||\n+                    bot->ToCreature()->IsTempBot() || me->GetDistance(bot) > 40 ||\n+                    (GetHealthPCT(bot) > hppctthreshold && !IsTank(bot))))\n+                    targets3.push_back(bot);\n+\n+                Unit* bpet = bot->GetBotsPet();\n+\n+                if (!(!bpet || !bpet->IsAlive() || bpet->HasUnitState(UNIT_STATE_ISOLATED) || me->GetDistance(bpet) > 40 || GetHealthPCT(bpet) > hppctthreshold))\n+                    targets3.push_back(bpet);\n+\n+                Unit* veh = bot->GetVehicleBase();\n+                if (veh && !(veh->IsCreature() && veh->ToCreature()->GetCreatureTemplate()->type == CREATURE_TYPE_MECHANICAL) &&\n+                    !veh->HasUnitState(UNIT_STATE_ISOLATED) && GetHealthPCT(veh) <= hppctthreshold && me->GetDistance(veh) < 40)\n+                    targets3.push_back(veh);\n+            }\n+            for (Unit* c : master->m_Controlled)\n+            {\n+                if (!c->IsInWorld() || me->GetMap() != c->FindMap() || !c->IsAlive() || c->HasUnitState(UNIT_STATE_ISOLATED) ||\n+                    c->IsTotem() || c->GetEntry() == SHAMAN_EARTH_ELEMENTAL || me->GetDistance(c) > 40 ||\n+                    (GetHealthPCT(c) > hppctthreshold && !IsTank(c)))\n+                    continue;\n+\n+                targets3.push_back(c);\n+            }\n+\n+            if (!targets3.empty() && HealTarget(Bcore::Containers::SelectRandomContainerElement(targets3), diff))\n+                return;\n+        }\n+        //buffs\n+        std::list<Unit*> targets4;\n+        if (master->IsAlive() && me->GetDistance(master) < 30)\n+            targets4.push_back(master);\n+        for (auto const& [_, bot] : *master->GetBotMgr()->GetBotMap())\n+        {\n+            if (!(!bot->IsInWorld() || me->GetMap() != bot->FindMap() || !bot->IsAlive() || bot->HasUnitState(UNIT_STATE_ISOLATED) ||\n+                bot->IsTotem() || me->GetDistance(bot) > 30))\n+                targets4.push_back(bot);\n+\n+            //u = itr->second->GetBotsPet();\n+\n+            //if (!(!u || !u->IsAlive() || u->HasUnitState(UNIT_STATE_ISOLATED) || me->GetDistance(u) > 30))\n+            //    targets4.push_back(u);\n+        }\n+        for (Unit* c : master->m_Controlled)\n+        {\n+            if (!c || !c->IsPet() || me->GetMap() != c->FindMap() || !c->IsAlive() || c->HasUnitState(UNIT_STATE_ISOLATED) ||\n+                c->IsTotem() || me->GetDistance(c) > 30) continue;\n+\n+            targets4.push_back(c);\n+        }\n+\n+        if (!targets4.empty() && BuffTarget(Bcore::Containers::SelectRandomContainerElement(targets4), diff))\n+            return;\n+\n+        return;\n+    }\n+    bool Bots = false;\n+    //heals\n+    if (HasRole(BOT_ROLE_HEAL))\n+    {\n+        std::list<Unit*> targets5;\n+        for (GroupReference const* itr = pGroup->GetFirstMember(); itr != nullptr; itr = itr->next())\n+        {\n+            Player* tPlayer = itr->GetSource();\n+            if (tPlayer == nullptr) continue;\n+            if (me->GetMap() != tPlayer->FindMap()) continue;\n+            if (tPlayer->HaveBot() && !Bots)\n+                Bots = true;\n+            if (!tPlayer->IsAlive() || tPlayer->HasUnitState(UNIT_STATE_ISOLATED)) continue;\n+            if (me->GetDistance(tPlayer) > 40) continue;\n+            if (GetHealthPCT(tPlayer) <= hppctthreshold || IsTank(tPlayer))\n+                targets5.push_back(tPlayer);\n+            if (tPlayer->GetVehicleBase() && !(tPlayer->GetVehicleBase()->IsCreature() &&\n+                tPlayer->GetVehicleCreatureBase()->GetCreatureTemplate()->type == CREATURE_TYPE_MECHANICAL) &&\n+                !tPlayer->GetVehicleBase()->HasUnitState(UNIT_STATE_ISOLATED) && GetHealthPCT(tPlayer->GetVehicleBase()) <= hppctthreshold &&\n+                me->GetDistance(tPlayer->GetVehicleBase()) < 40)\n+                targets5.push_back(tPlayer->GetVehicleBase());\n+        }\n+        if (Bots)\n+        {\n+            for (GroupReference const* itr = pGroup->GetFirstMember(); itr != nullptr; itr = itr->next())\n+            {\n+                Player const* tPlayer = itr->GetSource();\n+                if (tPlayer == nullptr) continue;\n+                if (me->GetMap() != tPlayer->FindMap()) continue;\n+\n+                if (tPlayer->HaveBot())\n+                {\n+                    for (auto const& [_, bot] : *tPlayer->GetBotMgr()->GetBotMap())\n+                    {\n+                        if (!(!bot->IsInWorld() || me->GetMap() != bot->FindMap() || !bot->IsAlive() || bot->HasUnitState(UNIT_STATE_ISOLATED) ||\n+                            bot->ToCreature()->IsTempBot() || me->GetDistance(bot) > 40 ||\n+                            (GetHealthPCT(bot) > hppctthreshold && !IsTank(bot))))\n+                            targets5.push_back(bot);\n+\n+                        Unit* bpet = bot->GetBotsPet();\n+\n+                        if (!(!bpet || !bpet->IsAlive() || bpet->HasUnitState(UNIT_STATE_ISOLATED) || me->GetDistance(bpet) > 40 || GetHealthPCT(bpet) > hppctthreshold))\n+                            targets5.push_back(bpet);\n+\n+                        Unit* veh = bot->GetVehicleBase();\n+                        if (veh && !(veh->IsCreature() && veh->ToCreature()->GetCreatureTemplate()->type == CREATURE_TYPE_MECHANICAL) &&\n+                            !veh->HasUnitState(UNIT_STATE_ISOLATED) && GetHealthPCT(veh) <= hppctthreshold && me->GetDistance(veh) < 40)\n+                            targets5.push_back(veh);\n+                    }\n+                }\n+                for (Unit* c : tPlayer->m_Controlled)\n+                {\n+                    if (!c || !c->IsInWorld() || me->GetMap() != c->FindMap() || !c->IsAlive() || c->HasUnitState(UNIT_STATE_ISOLATED) ||\n+                        c->IsTotem() || c->GetEntry() == SHAMAN_EARTH_ELEMENTAL || me->GetDistance(c) > 40 ||\n+                        (GetHealthPCT(c) > hppctthreshold && !IsTank(c)))\n+                        continue;\n+\n+                    targets5.push_back(c);\n+                }\n+            }\n+        }\n+\n+        //check if we have pointed heal target\n+        for (auto i : NPCBots::index_array<uint8, TARGET_ICONS_COUNT>)\n+        {\n+            if (BotCfg::GetHealTargetIconFlags() & GroupIconsFlags[i])\n+            {\n+                if (ObjectGuid guid = pGroup->GetTargetIcons()[i]; !guid.IsEmpty())\n+                {\n+                    if (Unit* unit = ObjectAccessor::GetUnit(*me, guid))\n+                    {\n+                        if (unit->IsAlive() && !unit->HasUnitState(UNIT_STATE_ISOLATED) && me->GetMap() == unit->FindMap() && me->GetDistance(unit) < 40 &&\n+                            !unit->IsFullHealth() && master->GetVictim() != unit && !IsInBotParty(unit->GetVictim()) &&\n+                            unit->GetEntry() != SHAMAN_EARTH_ELEMENTAL &&\n+                            !(unit->IsCreature() && unit->ToCreature()->GetCreatureTemplate()->type == CREATURE_TYPE_MECHANICAL) &&\n+                            unit->GetReactionTo(master) >= REP_NEUTRAL)\n+                        {\n+                            targets5.push_back(unit);\n+                        }\n+                    }\n+                }\n+            }\n+        }\n+        if (!targets5.empty() && HealTarget(Bcore::Containers::SelectRandomContainerElement(targets5), diff))\n+            return;\n+    }\n+    //buffs\n+    std::list<Unit*> targets6;\n+    for (GroupReference const* itr = pGroup->GetFirstMember(); itr != nullptr; itr = itr->next())\n+    {\n+        Player* tPlayer = itr->GetSource();\n+        if (tPlayer == nullptr) continue;\n+        if (me->GetMap() != tPlayer->FindMap()) continue;\n+        if (tPlayer->HaveBot() && !Bots)\n+            Bots = true;\n+        if (!tPlayer->IsAlive() || tPlayer->HasUnitState(UNIT_STATE_ISOLATED)) continue;\n+        if (me->GetDistance(tPlayer) > 30) continue;\n+        targets6.push_back(tPlayer);\n+    }\n+    if (Bots)\n+    {\n+        for (GroupReference const* itr = pGroup->GetFirstMember(); itr != nullptr; itr = itr->next())\n+        {\n+            Player const* tPlayer = itr->GetSource();\n+            if (tPlayer == nullptr) continue;\n+            if (me->GetMap() != tPlayer->FindMap()) continue;\n+\n+            if (tPlayer->HaveBot())\n+            {\n+                for (auto const& [_, bot] : *tPlayer->GetBotMgr()->GetBotMap())\n+                {\n+                    if (!(!bot->IsInWorld() || me->GetMap() != bot->FindMap() || !bot->IsAlive() || bot->HasUnitState(UNIT_STATE_ISOLATED) ||\n+                        bot->IsTotem() || me->GetDistance(bot) > 30))\n+                        targets6.push_back(bot);\n+\n+                    //u = bitr->second->GetBotsPet();\n+\n+                    //if (!(!u || !u->IsAlive() || u->HasUnitState(UNIT_STATE_ISOLATED) || me->GetDistance(u) > 30))\n+                    //    targets6.push_back(u);\n+                }\n+            }\n+            for (Unit* c : tPlayer->m_Controlled)\n+            {\n+                if (!c || !c->IsPet() || me->GetMap() != c->FindMap() || !c->IsAlive() || c->HasUnitState(UNIT_STATE_ISOLATED) ||\n+                    c->IsTotem() || me->GetDistance(c) > 30) continue;\n+\n+                targets6.push_back(c);\n+            }\n+        }\n+    }\n+\n+    if (!targets6.empty() && BuffTarget(Bcore::Containers::SelectRandomContainerElement(targets6), diff))\n+        return;\n+}\n+// Attempt to resurrect dead players and bots\n+// Target is either bot, player or player corpse\n+// no need to check global cooldown\n+void bot_ai::ResurrectGroup(uint32 spell_id)\n+{\n+    if (!spell_id || Rand() > 10)\n+        return;\n+\n+    SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spell_id);\n+    ASSERT(spellInfo);\n+    spellInfo = spellInfo->TryGetSpellInfoOverride(me);\n+    if (int32(me->GetPower(spellInfo->PowerType)) < spellInfo->CalcPowerCost(me, spellInfo->GetSchoolMask()))\n+        return;\n+\n+    //BOT_LOG_ERROR(\"entities.player\", \"ResurrectGroup by {}\", me->GetName());\n+\n+    if (IAmFree())\n+    {\n+        if (me->GetFaction() == FACTION_TEMPLATE_NEUTRAL_HOSTILE || me->HasAura(BERSERK))\n+            return;\n+\n+        WorldObject* playerOrCorpse = GetNearbyRezTarget();\n+        if (!playerOrCorpse)\n+            return;\n+\n+        if (!playerOrCorpse->IsWithinLOSInMap(me, LINEOFSIGHT_ALL_CHECKS, VMAP::ModelIgnoreFlags::M2))\n+            me->Relocate(*playerOrCorpse);\n+\n+        Unit* target = playerOrCorpse->IsPlayer() ? playerOrCorpse->ToUnit() : (Unit*)playerOrCorpse->ToCorpse();\n+        if (doCast(target, spell_id)) //rezzing it\n+        {\n+            if (Player const* player = playerOrCorpse->IsPlayer() ? playerOrCorpse->ToPlayer() : ObjectAccessor::FindPlayer(playerOrCorpse->ToCorpse()->GetOwnerGUID()))\n+                BotWhisper(LocalizedNpcText(player, BOT_TEXT_REZZING_YOU), player);\n+        }\n+\n+        return;\n+    }\n+\n+    Group const* group = master->GetGroup();\n+    std::vector<Creature*> bottargets;\n+    if (!group)\n+    {\n+        Player* player = master;\n+        if (!player->IsAlive() && !player->IsResurrectRequested() && !player->GetUInt32Value(PLAYER_SELF_RES_SPELL))\n+        {\n+            Unit* target = player->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_GHOST) ? player->ToUnit() : (Unit*)player->GetCorpse();\n+            if (target && target->IsInWorld() && me->GetMap() == target->FindMap() &&\n+                !player->GetBotMgr()->IsBeingResurrected(target))\n+            {\n+                if (me->GetDistance(target) > 30 && !HasBotCommandState(BOT_COMMAND_STAY) && !me->GetVehicle())\n+                {\n+                    BotMovement(BOT_MOVE_POINT, target);\n+                    //me->GetMotionMaster()->MovePoint(master->GetMapId(), *target);\n+                    return;\n+                }\n+                else if (me->GetDistance(target) < 15 && !target->IsWithinLOSInMap(me, LINEOFSIGHT_ALL_CHECKS, VMAP::ModelIgnoreFlags::M2))\n+                    me->Relocate(*target);\n+\n+                if (doCast(target, spell_id))//rezzing it\n+                {\n+                    BotWhisper(LocalizedNpcText(player, BOT_TEXT_REZZING_YOU));\n+                    return;\n+                }\n+            }\n+        }\n+\n+        for (auto const& [_, bot] : *player->GetBotMgr()->GetBotMap())\n+        {\n+            if (!bot || !bot->IsInWorld() || bot->IsAlive()) continue;\n+            if (bot->GetBotAI()->GetReviveTimer() < 15000 || bot->GetBotAI()->GetSelfRezSpell()) continue;\n+            if (me->GetDistance(bot) < 30 && bot->IsWithinLOSInMap(me, LINEOFSIGHT_ALL_CHECKS, VMAP::ModelIgnoreFlags::M2) &&\n+                !player->GetBotMgr()->IsBeingResurrected(bot))\n+                bottargets.push_back(bot);\n+        }\n+    }\n+    else\n+    {\n+        bool Bots = false;\n+        for (GroupReference const* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())\n+        {\n+            Player* player = itr->GetSource();\n+            if (!player || player->FindMap() != me->GetMap()) continue;\n+            if (!Bots && player->HaveBot())\n+                Bots = true;\n+            if (player->IsAlive() || player->IsResurrectRequested() || player->GetUInt32Value(PLAYER_SELF_RES_SPELL)) continue;\n+\n+            Unit* target = player->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_GHOST) ? player->ToUnit() : (Unit*)player->GetCorpse();\n+\n+            if (!target || !target->IsInWorld()) continue;\n+            if (target->GetTypeId() != player->GetTypeId() && me->GetMap() != target->FindMap()) continue;\n+            if (master->GetBotMgr()->IsBeingResurrected(target)) return;\n+            if (me->GetDistance(target) > 30 && !HasBotCommandState(BOT_COMMAND_STAY) && !me->GetVehicle())\n+            {\n+                if (player == master)\n+                {\n+                    BotMovement(BOT_MOVE_POINT, target);\n+                    //me->GetMotionMaster()->MovePoint(me->GetMapId(), *target);\n+                    return;\n+                }\n+                continue;\n+            }\n+            else if (me->GetDistance(target) < 15 && !target->IsWithinLOSInMap(me, LINEOFSIGHT_ALL_CHECKS, VMAP::ModelIgnoreFlags::M2))\n+                me->Relocate(*target);\n+\n+            if (doCast(target, spell_id))//rezzing it\n+            {\n+                BotWhisper(LocalizedNpcText(player, BOT_TEXT_REZZING_YOU), player);\n+                if (player != master)\n+                    BotWhisper(LocalizedNpcText(master, BOT_TEXT_REZZING_) + player->GetName());\n+                return;\n+            }\n+        }\n+\n+        if (!Bots)\n+            return;\n+\n+        for (GroupReference const* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())\n+        {\n+            Player const* player = itr->GetSource();\n+            if (!player || player->FindMap() != me->GetMap() || !player->HaveBot()) continue;\n+\n+            for (auto const& [_, bot] : *player->GetBotMgr()->GetBotMap())\n+            {\n+                if (!bot || !bot->IsInWorld() || bot->IsAlive()) continue;\n+                if (bot->GetBotAI()->GetReviveTimer() < 15000 || bot->GetBotAI()->GetSelfRezSpell()) continue;\n+                if (me->GetDistance(bot) < 30 && bot->IsWithinLOSInMap(me, LINEOFSIGHT_ALL_CHECKS, VMAP::ModelIgnoreFlags::M2) &&\n+                    !player->GetBotMgr()->IsBeingResurrected(bot))\n+                    bottargets.push_back(bot);\n+            }\n+        }\n+    }\n+\n+    //BOT_LOG_ERROR(\"entities.unit\", \"ResurrectGroup: {} found {} targets\", me->GetName(), uint32(bottargets.size()));\n+\n+    if (bottargets.empty())\n+        return;\n+\n+    Unit* target = bottargets.size() < 2u ? bottargets.front() : Bcore::Containers::SelectRandomContainerElement(bottargets);\n+\n+    if (doCast(target, spell_id))\n+    {\n+        Player const* targetOwner = target->ToCreature()->GetBotOwner();\n+        if (targetOwner != master)\n+        {\n+            std::ostringstream rezstr;\n+            rezstr << LocalizedNpcText(targetOwner, BOT_TEXT_REZZING_) << target->GetName() << \" (\" << LocalizedNpcText(targetOwner, BOT_TEXT_YOUR_BOT) << \")\";\n+            BotWhisper(rezstr.view(), targetOwner);\n+            rezstr.str(\"\");\n+            rezstr << LocalizedNpcText(master, BOT_TEXT_REZZING_) << target->GetName() << \" (\" << targetOwner->GetName() << LocalizedNpcText(master, BOT_TEXT__S_BOT) << \")\";\n+            BotWhisper(rezstr.view());\n+        }\n+        else\n+            BotWhisper(LocalizedNpcText(master, BOT_TEXT_REZZING_) + target->GetName());\n+\n+        return;\n+    }\n+}\n+// CURES\n+//cycle through the group sending members for cure\n+void bot_ai::CureGroup(uint32 cureSpell, uint32 diff)\n+{\n+    if (!cureSpell) return;\n+    if (GC_Timer > diff) return;\n+    if (me->IsMounted()) return;\n+    if (IsTank() && me->GetVictim() && me->GetMap()->IsRaid()) return;\n+    if (IsCasting()) return;\n+\n+    Group const* pGroup = !IAmFree() ? master->GetGroup() : me->GetBotGroup();\n+    std::list<Unit*> targets;\n+    if (IAmFree() && (!IsWanderer() || !pGroup || me->IsInCombat()))\n+    {\n+        if (_canCureTarget(me, cureSpell))\n+            targets.push_back(me);\n+        if (botPet && !me->IsInCombat() && _canCureTarget(botPet, cureSpell))\n+            targets.push_back(botPet);\n+\n+        if (!(me->GetFaction() == FACTION_TEMPLATE_NEUTRAL_HOSTILE || me->HasAura(BERSERK)))\n+        {\n+            std::list<Unit*> targets1;\n+            GetNearbyFriendlyTargetsList(targets1, 30);\n+            for (Unit* target : targets1)\n+                if ((target->IsPlayer() || target->ToPet()) && _canCureTarget(target, cureSpell))\n+                    targets.push_back(target);\n+        }\n+\n+        if (!targets.empty())\n+        {\n+            if (doCast(Bcore::Containers::SelectRandomContainerElement(targets), cureSpell))\n+                return;\n+        }\n+\n+        return;\n+    }\n+\n+    if (!me->GetMap()->IsRaid() && Rand() > 35)\n+        return;\n+\n+    //BOT_LOG_ERROR(\"entities.player\", \"{}: CureGroup() on {}\", me->GetName(), pTarget->GetName());\n+    if (!pGroup)\n+    {\n+        if (_canCureTarget(master, cureSpell))\n+            targets.push_back(master);\n+\n+        for (auto const& [_, bot] : *master->GetBotMgr()->GetBotMap())\n+        {\n+            if (!bot || !bot->IsInWorld() || me->GetMap() != bot->FindMap() || !bot->IsAlive()) continue;\n+            if (_canCureTarget(bot, cureSpell))\n+                targets.push_back(bot);\n+        }\n+\n+        for (Unit* c : master->m_Controlled)\n+        {\n+            if (!c || !c->IsPet() || !c->IsAlive() || me->GetDistance(c) > 30) continue;\n+\n+            if (_canCureTarget(c, cureSpell))\n+                targets.push_back(c);\n+        }\n+    }\n+    else\n+    {\n+        bool Bots = false;\n+        for (GroupReference const* itr = pGroup->GetFirstMember(); itr != nullptr; itr = itr->next())\n+        {\n+            Player* tPlayer = itr->GetSource();\n+            if (!tPlayer || (!tPlayer->IsAlive() && !tPlayer->HaveBot())) continue;\n+            if (!tPlayer->IsInWorld() || tPlayer->IsBeingTeleported()) continue;\n+            if (me->GetMap() != tPlayer->FindMap()) continue;\n+            if (!Bots && tPlayer->HaveBot())\n+                Bots = true;\n+            if (_canCureTarget(tPlayer, cureSpell))\n+                targets.push_back(tPlayer);\n+        }\n+        if (!Bots) return;\n+        for (GroupReference const* itr = pGroup->GetFirstMember(); itr != nullptr; itr = itr->next())\n+        {\n+            Player* tPlayer = itr->GetSource();\n+            if (tPlayer == nullptr) continue;\n+            if (!tPlayer->IsInWorld() || tPlayer->IsBeingTeleported()) continue;\n+            if (me->GetMap() != tPlayer->FindMap()) continue;\n+\n+            if (tPlayer->HaveBot())\n+            {\n+                for (auto const& [_, bot] : *tPlayer->GetBotMgr()->GetBotMap())\n+                {\n+                    if (!bot || !bot->IsInWorld() || me->GetMap() != bot->FindMap() || !bot->IsAlive()) continue;\n+                    if (_canCureTarget(bot, cureSpell))\n+                        targets.push_back(bot);\n+                }\n+            }\n+\n+            if (!me->IsInCombat())\n+            {\n+                for (Unit* c : tPlayer->m_Controlled)\n+                {\n+                    if (!c || !c->IsPet() || !c->IsAlive() || me->GetDistance(c) > 30) continue;\n+\n+                    if (_canCureTarget(c, cureSpell))\n+                        targets.push_back(c);\n+                }\n+            }\n+        }\n+    }\n+\n+    if (!targets.empty())\n+    {\n+        if (doCast(Bcore::Containers::SelectRandomContainerElement(targets), cureSpell))\n+            return;\n+    }\n+}\n+\n+// determines if unit has something to cure\n+bool bot_ai::_canCureTarget(Unit const* target, uint32 cureSpell) const\n+{\n+    if (me->GetLevel() < 10 || target->GetLevel() < 10) return false;\n+    if (target->HasUnitState(UNIT_STATE_ISOLATED)) return false;\n+    if (target->IsCreature() && target->ToCreature()->IsTempBot()) return false;\n+    if (target->HasAuraType(SPELL_AURA_MOD_POSSESS) && !IsInBotParty(target)) return false;\n+\n+    SpellInfo const* info = sSpellMgr->GetSpellInfo(cureSpell);\n+    if (!info)\n+        return false;\n+    info = info->TryGetSpellInfoOverride(me);\n+\n+    if (me->GetDistance(target) > CalcSpellMaxRange(cureSpell, false))\n+        return false;\n+\n+    uint32 dispelMask = 0;\n+    for (auto i : NPCBots::index_array<uint8, MAX_SPELL_EFFECTS>)\n+        if (info->_effects[i].Effect == SPELL_EFFECT_DISPEL)\n+            dispelMask |= SpellInfo::GetDispelMask(DispelType(info->_effects[i].MiscValue));\n+\n+    //SpellBreaker addins\n+    if (cureSpell == SPELL_STEAL_MAGIC)\n+        dispelMask |= (1u<<DISPEL_MAGIC) | (1u<<DISPEL_CURSE);\n+\n+    if (dispelMask == 0)\n+        return false;\n+\n+    std::list<Aura const*> dispel_list;\n+    _getBotDispellableAuraList(target, dispelMask, dispel_list);\n+\n+    return !(dispel_list.empty());\n+}\n+\n+void bot_ai::_getBotDispellableAuraList(Unit const* target, uint32 dispelMask, std::list<Aura const*> &dispelList) const\n+{\n+    //Unholy Blight prevents diseases from being dispelled\n+    if ((dispelMask & (1u<<DISPEL_DISEASE)) &&\n+        target->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DEATHKNIGHT, 1494, 0))\n+        dispelMask &= ~(1u<<DISPEL_DISEASE);\n+\n+    for (auto const& [_, aura] : target->GetOwnedAuras())\n+    {\n+        if (aura->IsPassive())\n+            continue;\n+\n+        AuraApplication const* aurApp = aura->GetApplicationOfTarget(target->GetGUID());\n+        if (!aurApp)\n+            continue;\n+\n+        if (aura->GetSpellInfo()->GetDispelMask() & dispelMask)\n+        {\n+            //do not dispel positive auras from enemies and negative ones from friends\n+            if (aurApp->IsPositive() == target->IsFriendlyTo(me))\n+                continue;\n+\n+            //skip Vampiric Touch to prevent being CCed just heal it out\n+            if (HasRole(BOT_ROLE_HEAL) && aura->GetSpellInfo()->IsRankOf(sSpellMgr->GetSpellInfo(34914)))\n+                continue;\n+\n+            if (((aura->GetSpellInfo()->AttributesEx7 & SPELL_ATTR7_DISPEL_CHARGES) ? aura->GetCharges() : aura->GetStackAmount()) > 0)\n+                dispelList.push_back(aura);\n+        }\n+    }\n+}\n+// Check if can cast some spell out of main rotation to use up target's spell reflection charges\n+// Supposed to check instant non-damaging spells but these checks are not performed (Shaman, Priest)\n+bool bot_ai::CanRemoveReflectSpells(Unit const* target, uint32 spellId) const\n+{\n+    if (!target || !spellId)\n+        return false;\n+\n+    if (!target->HasAuraType(SPELL_AURA_REFLECT_SPELLS) && !target->HasAuraType(SPELL_AURA_REFLECT_SPELLS_SCHOOL))\n+        return false;\n+\n+    SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);\n+    if (!spellInfo)\n+        return false;\n+    spellInfo = spellInfo->TryGetSpellInfoOverride(me);\n+\n+    if (!spellInfo->IsPositive() && spellInfo->DmgClass == SPELL_DAMAGE_CLASS_MAGIC &&\n+        !(spellInfo->Attributes & SPELL_ATTR0_ABILITY) && !(spellInfo->AttributesEx & SPELL_ATTR1_CANT_BE_REFLECTED) &&\n+        !(spellInfo->Attributes & SPELL_ATTR0_UNAFFECTED_BY_INVULNERABILITY))\n+    {\n+        //bool directDamage = false;\n+        //for (uint8 i = 0; i != MAX_SPELL_EFFECTS; ++i)\n+        //{\n+        //    if (spellInfo->_effects[i].TargetA.GetTarget() == TARGET_UNIT_TARGET_ENEMY)\n+        //    {\n+        //        if (spellInfo->_effects[i].IsEffect(SPELL_EFFECT_SCHOOL_DAMAGE) ||\n+        //            spellInfo->_effects[i].IsAura(SPELL_AURA_PERIODIC_DAMAGE) ||\n+        //            spellInfo->_effects[i].IsAura(SPELL_AURA_PERIODIC_LEECH) ||\n+        //            spellInfo->_effects[i].IsAura(SPELL_AURA_MOD_SPEED_SLOW_ALL) ||//Icy Touch\n+        //            spellInfo->_effects[i].IsAura(SPELL_AURA_HASTE_SPELLS))//Slow\n+        //        {\n+        //            directDamage = true;\n+        //            break;\n+        //        }\n+        //    }\n+        //}\n+        //if (directDamage)\n+        //{\n+            for (AuraEffect const* aeff : target->GetAuraEffectsByType(SPELL_AURA_REFLECT_SPELLS))\n+            {\n+                //All existing SPELL_AURA_REFLECT_SPELLS spells have at least amount 50\n+                if (aeff->GetBase()->IsUsingCharges() &&\n+                    aeff->GetBase()->GetCharges() <= target->getAttackers().size() * (aeff->GetBase()->GetDuration() / 1000) / 4)\n+                    return true;\n+            }\n+\n+            for (AuraEffect const* aeff : target->GetAuraEffectsByType(SPELL_AURA_REFLECT_SPELLS_SCHOOL))\n+            {\n+                if (aeff->GetBase()->IsUsingCharges() &&\n+                    aeff->GetAmount() >= 50 && (aeff->GetMiscValue() & spellInfo->GetSchoolMask()) &&\n+                    aeff->GetBase()->GetCharges() <= (aeff->GetBase()->GetDuration() / 1000) / 4)\n+                    return true;\n+            }\n+        //}\n+    }\n+\n+    return false;\n+}\n+//LIST AURAS\n+// Debug: Returns bot's info to called player\n+void bot_ai::_listAuras(Player const* player, Unit const* unit) const\n+{\n+    //if (player->GetSession()->GetSecurity() == SEC_PLAYER) return;\n+    if (!player->IsGameMaster() && (IAmFree() || !IsInBotParty(player))) return;\n+    if (!IsInBotParty(unit)) return;\n+    ChatHandler ch(player->GetSession());\n+    std::ostringstream botstring;\n+    botstring.setf(std::ios_base::fixed);\n+    uint32 const bot_pet_player_class = unit->IsPlayer() ? unit->GetClass() : unit->ToCreature()->GetBotAI()->GetBotClass();\n+    botstring << unit->GetName() << \" (\" << LocalizedNpcText(player, BOT_TEXT_CLASS) << \": \" << uint32(bot_pet_player_class) << \"), \";\n+    if (unit->IsPlayer())\n+        botstring << LocalizedNpcText(player, BOT_TEXT_PLAYER);\n+    else if (unit->IsNPCBot())\n+    {\n+        bot_ai const* ai = unit->ToCreature()->GetBotAI();\n+        botstring << LocalizedNpcText(player, BOT_TEXT_MASTER) << \": \";\n+        Player const* owner = ai->GetBotOwner();\n+        botstring << (owner != unit ? owner->GetName() : LocalizedNpcText(player, BOT_TEXT_NONE));\n+    }\n+    uint8 locale = player->GetSession()->GetSessionDbcLocale();\n+    for (auto const& [_, aura] : unit->GetOwnedAuras())\n+    {\n+        SpellInfo const* spellInfo = aura->GetSpellInfo();\n+        if (!spellInfo)\n+            continue;\n+        spellInfo = spellInfo->TryGetSpellInfoOverride(me);\n+        uint32 id = spellInfo->Id;\n+        SpellInfo const* learnSpellInfo = sSpellMgr->GetSpellInfo(spellInfo->_effects[0].TriggerSpell);\n+        std::string_view name{ spellInfo->SpellName[locale] };\n+        botstring << \"\\n\" << id << \" - |cffffffff|Hspell:\" << id << \"|h[\" << name;\n+        botstring << ' ' << localeNames[locale] << \"]|h|r\";\n+        uint32 talentcost = GetTalentSpellCost(id);\n+        uint32 rank = 0;\n+        if (talentcost > 0 && (spellInfo->GetNextRankSpell() || spellInfo->GetPrevRankSpell()))\n+            rank = talentcost;\n+        else if (learnSpellInfo && (spellInfo->GetNextRankSpell() || spellInfo->GetPrevRankSpell()))\n+            rank = spellInfo->GetRank();\n+        else if (spellInfo->GetNextRankSpell() || spellInfo->GetPrevRankSpell())\n+            rank = spellInfo->GetRank();\n+        if (rank > 0)\n+            botstring << \" \" << LocalizedNpcText(player, BOT_TEXT_RANK) << \" \" << rank;\n+        if (talentcost > 0)\n+            botstring << \" [\" << LocalizedNpcText(player, BOT_TEXT_TALENT) << \"]\";\n+        if (spellInfo->IsPassive())\n+            botstring << \" [\" << LocalizedNpcText(player, BOT_TEXT_PASSIVE) << \"]\";\n+        if ((spellInfo->Attributes & SPELL_ATTR0_HIDDEN_CLIENTSIDE) ||\n+            (spellInfo->AttributesEx & SPELL_ATTR1_DONT_DISPLAY_IN_AURA_BAR))\n+            botstring << \" [\" << LocalizedNpcText(player, BOT_TEXT_HIDDEN) << \"]\";\n+        if (unit->IsPlayer() && unit->ToPlayer()->HasSpell(id))\n+            botstring << \" [\" << LocalizedNpcText(player, BOT_TEXT_KNOWN) << \"]\";\n+        else if (unit == me && GetSpell(spellInfo->GetFirstRankSpell()->Id))\n+            botstring << \" [\" << LocalizedNpcText(player, BOT_TEXT_ABILITY) << \"]\";\n+    }\n+    botstring.precision(1);\n+    for (auto i : NPCBots::index_array<uint8, MAX_STATS>)\n+    {\n+        std::string mystat;\n+        switch (i)\n+        {\n+            case STAT_STRENGTH: mystat = LocalizedNpcText(player, BOT_TEXT_STAT_STR); break;\n+            case STAT_AGILITY: mystat = LocalizedNpcText(player, BOT_TEXT_STAT_AGI); break;\n+            case STAT_STAMINA: mystat = LocalizedNpcText(player, BOT_TEXT_STAT_STA); break;\n+            case STAT_INTELLECT: mystat = LocalizedNpcText(player, BOT_TEXT_STAT_INT); break;\n+            case STAT_SPIRIT: mystat = LocalizedNpcText(player, BOT_TEXT_STAT_SPI); break;\n+            default: mystat = LocalizedNpcText(player, BOT_TEXT_STAT_UNK); break;\n+        }\n+        //ch.PSendSysMessage(\"base %s: {}\", mystat, unit->GetCreateStat(Stats(i));\n+        float totalstat = unit->GetTotalStatValue(Stats(i));\n+        //ch.PSendSysMessage(\"base total %s: {}\", mystat, totalstat);\n+        if (unit == me)\n+        {\n+            BotStatMods t = MAX_BOT_ITEM_MOD;\n+            switch (i)\n+            {\n+                case STAT_STRENGTH:     t = BOT_STAT_MOD_STRENGTH;  break;\n+                case STAT_AGILITY:      t = BOT_STAT_MOD_AGILITY;   break;\n+                case STAT_STAMINA:      t = BOT_STAT_MOD_STAMINA;   break;\n+                case STAT_INTELLECT:    t = BOT_STAT_MOD_INTELLECT; break;\n+                case STAT_SPIRIT:       t = BOT_STAT_MOD_SPIRIT;    break;\n+                default:                                            break;\n+            }\n+\n+            if (t < MAX_BOT_ITEM_MOD)\n+                totalstat = GetTotalBotStat(t);\n+        }\n+        botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_TOTAL) << \" \" << mystat << \": \" << float(totalstat);\n+    }\n+    botstring.precision(2);\n+    botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_MELEE_AP) << \": \" << int32(unit->GetTotalAttackPowerValue(BASE_ATTACK));\n+    botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_RANGED_AP) << \": \" << int32(unit->GetTotalAttackPowerValue(RANGED_ATTACK));\n+    botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_ARMOR) << \": \" << uint32(unit->GetArmor());\n+    botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_CRIT) << \": \" << float(unit->GetUnitCriticalChanceDone(BASE_ATTACK));\n+    botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_DEFENSE) << \": \" << uint32(unit->GetDefenseSkillValue());\n+    botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_MISS) << \": \" << float(unit->GetUnitMissChance());\n+    botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_DODGE) << \": \" << float(unit->GetUnitDodgeChance(BASE_ATTACK, me));\n+    botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_PARRY) << \": \" << float(unit->GetUnitParryChance(BASE_ATTACK, me));\n+    botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_BLOCK) << \": \" << float(unit->GetUnitBlockChance(BASE_ATTACK, me));\n+    botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_BLOCKVALUE) << \": \" << uint32(unit->GetShieldBlockValue());\n+    botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_DMG_TAKEN_MELEE) << \": \" << float(dmg_taken_phy * unit->GetTotalAuraMultiplierByMiscMask(SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, SPELL_SCHOOL_MASK_NORMAL));\n+    botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_DMG_TAKEN_SPELL) << \": \" << float(dmg_taken_mag * unit->GetTotalAuraMultiplierByMiscMask(SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, SPELL_SCHOOL_MASK_MAGIC));\n+\n+    //float resilience_base = unit->GetMeleeCritChanceReduction();\n+    //botstring << \"\\n\" << \"Resilience pct\" << \": -\" << resilience_base << \" / -\" << float(resilience_base * 2.2f) << \" / -\" << float(resilience_base * 2.0f);\n+\n+    WeaponAttackType type = BASE_ATTACK;\n+    float attSpeed = (unit->GetAttackTime(type) * unit->m_modAttackSpeedPct[type])/1000.f;\n+    botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_DMG_RANGE_MAINHAND) << \": \" << LocalizedNpcText(player, BOT_TEXT_MIN) << \": \" << int32(unit->GetFloatValue(UNIT_FIELD_MINDAMAGE)) << \", \" << LocalizedNpcText(player, BOT_TEXT_MAX) << \": \" << int32(unit->GetFloatValue(UNIT_FIELD_MAXDAMAGE) + 1.f);\n+    botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_DMG_MULT_MAINHAND) << \": \" << float(unit->GetPctModifierValue(UNIT_MOD_DAMAGE_MAINHAND, BASE_PCT)*unit->GetPctModifierValue(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_PCT));\n+    botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_ATTACK_TIME_MAINHAND) << \": \" << float(attSpeed)\n+        << \" (\" << float(((unit->GetFloatValue(UNIT_FIELD_MINDAMAGE) + unit->GetFloatValue(UNIT_FIELD_MAXDAMAGE)) / 2) / attSpeed) << \" \" << LocalizedNpcText(player, BOT_TEXT_DPS) << \")\";\n+    if (unit->haveOffhandWeapon())\n+    {\n+        type = OFF_ATTACK;\n+        attSpeed = (unit->GetAttackTime(type) * unit->m_modAttackSpeedPct[type])/1000.f;\n+        botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_DMG_RANGE_OFFHAND) << \": \" << LocalizedNpcText(player, BOT_TEXT_MIN) << \": \" << int32(unit->GetFloatValue(UNIT_FIELD_MINOFFHANDDAMAGE)) << \", \" << LocalizedNpcText(player, BOT_TEXT_MAX) << \": \" << int32(unit->GetFloatValue(UNIT_FIELD_MAXOFFHANDDAMAGE) + 1.f);\n+        botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_DMG_MULT_OFFHAND) << \": \" << float(unit->GetPctModifierValue(UNIT_MOD_DAMAGE_OFFHAND, BASE_PCT)*unit->GetPctModifierValue(UNIT_MOD_DAMAGE_OFFHAND, TOTAL_PCT));\n+        botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_ATTACK_TIME_OFFHAND) << \": \" << float(attSpeed)\n+            << \" (\" << float(((unit->GetFloatValue(UNIT_FIELD_MINOFFHANDDAMAGE) + unit->GetFloatValue(UNIT_FIELD_MAXOFFHANDDAMAGE)) / 2) / attSpeed) << \" \" << LocalizedNpcText(player, BOT_TEXT_DPS) << \")\";\n+    }\n+    if (unit != me ||\n+        (me->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + uint32(BOT_SLOT_RANGED)) &&\n+        _botclass != BOT_CLASS_PALADIN &&\n+        _botclass != BOT_CLASS_DEATH_KNIGHT &&\n+        _botclass != BOT_CLASS_DRUID &&\n+        _botclass != BOT_CLASS_SHAMAN))\n+    {\n+        type = RANGED_ATTACK;\n+        attSpeed = (unit->GetAttackTime(type) * unit->m_modAttackSpeedPct[type])/1000.f;\n+        botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_DMG_RANGE_RANGED) << \": \" << LocalizedNpcText(player, BOT_TEXT_MIN) << \": \" << int32(unit->GetFloatValue(UNIT_FIELD_MINRANGEDDAMAGE)) << \", \" << LocalizedNpcText(player, BOT_TEXT_MAX) << \": \" << int32(unit->GetFloatValue(UNIT_FIELD_MAXRANGEDDAMAGE) + 1.f);\n+        botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_DMG_MULT_RANGED) << \": \" << float(unit->GetPctModifierValue(UNIT_MOD_DAMAGE_RANGED, BASE_PCT)*unit->GetPctModifierValue(UNIT_MOD_DAMAGE_RANGED, TOTAL_PCT));\n+        botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_ATTACK_TIME_RANGED) << \": \" << float(attSpeed)\n+            << \" (\" << float(((unit->GetFloatValue(UNIT_FIELD_MINRANGEDDAMAGE) + unit->GetFloatValue(UNIT_FIELD_MAXRANGEDDAMAGE)) / 2) / attSpeed) << \" \" << LocalizedNpcText(player, BOT_TEXT_DPS) << \")\";\n+    }\n+    botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_BASE_HP) << \": \" << int32(unit->GetCreateHealth());\n+    botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_TOTAL_HP) << \": \" << int32(unit->GetMaxHealth());\n+    botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_BASE_MP) << \": \" << int32(unit->GetCreateMana());\n+    botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_TOTAL_MP) << \": \" << int32(unit->GetMaxPower(POWER_MANA));\n+    if (unit->GetMaxPower(POWER_MANA) > 1 && unit->GetPowerType() != POWER_MANA)\n+        botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_CURR_MP) << \": \" << int32(unit->GetPower(POWER_MANA));\n+\n+    if (unit == me)\n+    {\n+        botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_SPELLPOWER) << \": \" << int32(me->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_MAGIC));\n+        botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_REGEN_HP) << \": \" << int32(_getTotalBotStat(BOT_STAT_MOD_HEALTH_REGEN));\n+        if (me->GetMaxPower(POWER_MANA) > 1)\n+        {\n+            botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_REGEN_MP_CAST) << \": \" << float((_botclass == BOT_CLASS_SPHYNX ? -1.f : 1.f) * me->GetFloatValue(UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER) * sWorld->getRate(RATE_POWER_MANA) * 5.0f);\n+            botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_REGEN_MP_NOCAST) << \": \" << float((_botclass == BOT_CLASS_SPHYNX ? -1.f : 1.f) * me->GetFloatValue(UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER) * sWorld->getRate(RATE_POWER_MANA) * 5.0f);\n+        }\n+        int32 bot_expertise = expertise + me->GetTotalAuraModifier(SPELL_AURA_MOD_EXPERTISE);\n+        botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_HASTE) << \": \" << (haste >= 0 ? \"+\" : \"-\") << float(haste) << \" \" << LocalizedNpcText(player, BOT_TEXT_PCT);\n+        botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_HIT) << \": +\" << float(hit) << \" \" << LocalizedNpcText(player, BOT_TEXT_PCT);\n+        botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_EXPERTISE) << \": \" << int32(bot_expertise) << \" (-\" << float(float(bot_expertise) * 0.25f) << \" \" << LocalizedNpcText(player, BOT_TEXT_PCT) << \")\";\n+        botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_ARMOR_PEN) << \": \" << float(me->GetCreatureArmorPenetrationCoef()) << \" \" << LocalizedNpcText(player, BOT_TEXT_PCT);\n+        botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_SPELL_PEN) << \": \" << uint32(spellpen) + uint32(std::abs(me->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_TARGET_RESISTANCE, SPELL_SCHOOL_MASK_MAGIC)));\n+\n+        for (uint8 i = SPELL_SCHOOL_HOLY; i != MAX_SPELL_SCHOOL; ++i)\n+        {\n+            uint32 curresist = me->GetResistance(SpellSchools(i)) + resistbonus[i-1];\n+\n+            std::string resist;\n+            switch (i)\n+            {\n+                case 1: resist = LocalizedNpcText(player, BOT_TEXT_HOLY);   break;\n+                case 2: resist = LocalizedNpcText(player, BOT_TEXT_FIRE);   break;\n+                case 3: resist = LocalizedNpcText(player, BOT_TEXT_NATURE); break;\n+                case 4: resist = LocalizedNpcText(player, BOT_TEXT_FROST);  break;\n+                case 5: resist = LocalizedNpcText(player, BOT_TEXT_SHADOW); break;\n+                case 6: resist = LocalizedNpcText(player, BOT_TEXT_ARCANE); break;\n+            }\n+            botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_RESISTANCE) << \": \" << resist << \": \" << uint32(curresist);\n+        }\n+\n+        auto scores = GetBotGearScores();\n+        botstring << \"\\nGear score total: \" << scores.first << \", avg: \" << scores.second;\n+\n+        botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_COMMAND_STATES) << \"(\" << GetBotCommandState() << \"):\";\n+        if (HasBotCommandState(BOT_COMMAND_FOLLOW))\n+            botstring << \" \" << LocalizedNpcText(player, BOT_TEXT_COMMAND_FOLLOW);\n+        if (HasBotCommandState(BOT_COMMAND_ATTACK))\n+            botstring << \" \" << LocalizedNpcText(player, BOT_TEXT_COMMAND_ATTACK);\n+        if (HasBotCommandState(BOT_COMMAND_STAY))\n+            botstring << \" \" << LocalizedNpcText(player, BOT_TEXT_COMMAND_STAY);\n+        if (HasBotCommandState(BOT_COMMAND_COMBATRESET))\n+            botstring << \" \" << LocalizedNpcText(player, BOT_TEXT_COMMAND_RESET);\n+        if (HasBotCommandState(BOT_COMMAND_FULLSTOP))\n+            botstring << \" \" << LocalizedNpcText(player, BOT_TEXT_COMMAND_FULLSTOP);\n+        if (!IAmFree())\n+            botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_FOLLOW_DISTANCE) << \": \" << uint32(master->GetBotMgr()->GetBotFollowDist());\n+\n+        if (_botclass < BOT_CLASS_EX_START)\n+            botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_SPEC) << \": \" << uint32(_spec);\n+\n+        if (IsWanderer())\n+            botstring << \"\\n_baseLevel: \" << uint32(_baseLevel);\n+\n+        botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_BOT_ROLEMASK_MAIN) << \": \" << uint32(_roleMask & BOT_ROLE_MASK_MAIN);\n+        botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_BOT_ROLEMASK_GATHERING) << \": \" << uint32(_roleMask & BOT_ROLE_MASK_GATHERING);\n+\n+        botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_PVP_KILLS) << \": \" << uint32(_pvpKillsCount) << \", \" << LocalizedNpcText(player, BOT_TEXT_PLAYERS) << \": \" << uint32(_playerKillsCount) << \", \" << LocalizedNpcText(player, BOT_TEXT_TOTAL) << \": \" << uint32(_killsCount);\n+        botstring << \"\\n\" << LocalizedNpcText(player, BOT_TEXT_DIED_) << uint32(_deathsCount) << LocalizedNpcText(player, BOT_TEXT__TIMES);\n+\n+        //debug\n+        botstring << \"\\n_lastWMOAreaId: \" << uint32(_lastWMOAreaId);\n+        botstring << \"\\nGCD: \" << uint32(GC_Timer);\n+        //botstring << \"\\nPotion CD: \" << uint32(_potionTimer);\n+        //botstring << \"\\ncurrent Engage timer: \" << GetEngageTimer();\n+        //for (uint32 i = 0; i != 148; ++i)\n+        //{\n+        //    float val = me->GetFloatValue(i);\n+        //    ch.PSendSysMessage(\"Float value at %u: {}\", i, val);\n+        //}\n+\n+        //ch.PSendSysMessage(\"healTargetIconFlags: %u\", healTargetIconFlags);\n+\n+        //ch.PSendSysMessage(\"Roles:\");\n+        //for (uint32 i = BOT_MAX_ROLE; i != BOT_ROLE_NONE; i >>= 1)\n+        //{\n+        //    if (_roleMask & i)\n+        //    {\n+        //        switch (i)\n+        //        {\n+        //            case BOT_ROLE_TANK:\n+        //                ch.PSendSysMessage(\"BOT_ROLE_TANK\");\n+        //                break;\n+        //            case BOT_ROLE_DPS:\n+        //                ch.PSendSysMessage(\"BOT_ROLE_DPS\");\n+        //                break;\n+        //            case BOT_ROLE_HEAL:\n+        //                ch.PSendSysMessage(\"BOT_ROLE_HEAL\");\n+        //                break;\n+        //            //case BOT_ROLE_MELEE:\n+        //            //    ch.PSendSysMessage(\"BOT_ROLE_MELEE\");\n+        //            //    break;\n+        //            case BOT_ROLE_RANGED:\n+        //                ch.PSendSysMessage(\"BOT_ROLE_RANGED\");\n+        //                break;\n+        //        }\n+        //    }\n+        //}\n+\n+        //ch.PSendSysMessage(\"Stat bonuses:\");\n+        //for (uint8 i = 0; i != MAX_BOT_ITEM_MOD; ++i)\n+        //{\n+        //    int32 val = 0;\n+        //    uint32 const a = i;\n+        //    for (uint8 j = 0; j != BOT_INVENTORY_SIZE; ++j)\n+        //        val += static_cast<BotStat>(_stats[j])[a];\n+\n+        //    if (val != 0)\n+        //        ch.PSendSysMessage(\"Item mod %u: bonus = %i\", i, val);\n+        //}\n+    }\n+\n+    ch.SendSysMessage(botstring.view());\n+}\n+//SetStats\n+// Health, Armor, Powers, Combat Ratings, and global update setup\n+void bot_ai::SetStats(bool force)\n+{\n+    if (IsTempBot() && !force)\n+        return;\n+\n+    shouldUpdateStats = false;\n+\n+    uint8 myclass = _botclass;\n+    if (myclass == BOT_CLASS_DRUID && GetBotStance() != BOT_STANCE_NONE)\n+        myclass = GetBotStance();\n+\n+    uint8 mylevel = std::min<uint8>(master->GetLevel(), DEFAULT_MAX_LEVEL);\n+    if (IsWanderer())\n+    {\n+        if (_baseLevel == 0) //this only happens once\n+        {\n+            mylevel = urand(me->GetCreatureTemplate()->minlevel, me->GetCreatureTemplate()->maxlevel);\n+            mylevel += BotDataMgr::GetLevelBonusForBotRank(me->GetCreatureTemplate()->rank);\n+            _baseLevel = std::max<uint8>(mylevel, BotDataMgr::GetMinLevelForBotClass(_botclass));\n+            if (me->GetMap()->IsBattlegroundOrArena())\n+                BOT_LOG_DEBUG(\"npcbots\", \"BG bot {} id {} selected level {}...\", me->GetName(), me->GetEntry(), uint32(_baseLevel));\n+            else\n+                BOT_LOG_DEBUG(\"npcbots\", \"Wandering bot {} id {} selected level {}...\", me->GetName(), me->GetEntry(), uint32(_baseLevel));\n+        }\n+        else if (me->GetMap()->GetEntry()->IsContinent())\n+        {\n+            uint8 mapmaxlevel = BotDataMgr::GetMaxLevelForMapId(me->GetMap()->GetEntry()->ID);\n+            mapmaxlevel += BotDataMgr::GetLevelBonusForBotRank(me->GetCreatureTemplate()->rank);\n+            //TODO: experience system for levelups\n+            mylevel = std::max<uint8>(mylevel, std::min<uint8>(_baseLevel + uint8(uint32(float(_killsCount) * BotCfg::GetBotWandererXPGainMod()) / (mylevel * 20)), mapmaxlevel));\n+        }\n+    }\n+    else\n+        mylevel += BotDataMgr::GetLevelBonusForBotRank(me->GetCreatureTemplate()->rank);\n+\n+    mylevel = std::min<uint8>(mylevel, DEFAULT_MAX_LEVEL + 3);\n+\n+    //Do not remove this code\n+    mylevel = std::max<uint8>(mylevel, BotDataMgr::GetMinLevelForBotClass(_botclass));\n+\n+    //LEVEL\n+    if (me->GetLevel() != mylevel)\n+    {\n+        if (me->GetLevel() > mylevel)\n+            UnsummonAll(false);\n+\n+        me->SetLevel(mylevel);\n+        force = true; //reinit spells/passives/other\n+    }\n+    if (force)\n+    {\n+        InitPowers();\n+        InitSpells(); //this must stay before class passives\n+        ApplyClassPassives();\n+\n+        PlayerLevelInfo info;\n+        sObjectMgr->GetPlayerLevelInfo(GetPlayerRace(), GetPlayerClass(), std::min<uint8>(mylevel, DEFAULT_MAX_LEVEL), &info);\n+        for (auto i : NPCBots::index_array<uint8, MAX_STATS>)\n+            me->SetCreateStat(Stats(i), info.stats[i]);\n+    }\n+\n+    switch (myclass)\n+    {\n+        case BOT_CLASS_WARRIOR:\n+        case BOT_CLASS_DEATH_KNIGHT:\n+        case BOT_CLASS_PALADIN:\n+        case BOT_CLASS_ROGUE:\n+        case BOT_CLASS_HUNTER:\n+        case BOT_CLASS_SHAMAN:\n+        case BOT_CLASS_DRUID:\n+        case BOT_CLASS_MAGE:\n+        case BOT_CLASS_PRIEST:\n+        case BOT_CLASS_WARLOCK:\n+        case DRUID_BEAR_FORM:\n+        case DRUID_CAT_FORM:\n+        case DRUID_MOONKIN_FORM:\n+        case DRUID_TREE_FORM:\n+        case DRUID_TRAVEL_FORM:\n+        case DRUID_AQUATIC_FORM:\n+        case DRUID_FLIGHT_FORM:\n+        case BOT_CLASS_BM:\n+        case BOT_CLASS_SPHYNX:\n+        case BOT_CLASS_ARCHMAGE:\n+        case BOT_CLASS_DREADLORD:\n+        case BOT_CLASS_SPELLBREAKER:\n+        case BOT_CLASS_DARK_RANGER:\n+        case BOT_CLASS_NECROMANCER:\n+        case BOT_CLASS_SEA_WITCH:\n+        case BOT_CLASS_CRYPT_LORD:\n+            break;\n+\n+        default:\n+            BOT_LOG_ERROR(\"entities.player\", \"minion_ai: *etStats():Init - unknown bot class {}, real class: {}, _botclass: {}\", myclass, GetPlayerClass(), _botclass);\n+            break;\n+    }\n+\n+    float value;\n+    float tempval;\n+    float ap_mod = 1.0f, armor_mod = 1.0f;\n+\n+    //DAMAGE PHYSICAL\n+    for (auto i : NPCBots::index_array<uint8, MAX_EQUIPMENT_ITEMS>)\n+    {\n+        float weap_damage_base_min = _getBotStat(i, BOT_STAT_MOD_DAMAGE_MIN);\n+        float weap_damage_base_max = _getBotStat(i, BOT_STAT_MOD_DAMAGE_MAX);\n+        me->SetBaseWeaponDamage(WeaponAttackType(BASE_ATTACK + i), MINDAMAGE, std::max<float>(weap_damage_base_min, 1.f));\n+        me->SetBaseWeaponDamage(WeaponAttackType(BASE_ATTACK + i), MAXDAMAGE, std::max<float>(weap_damage_base_max, 1.f));\n+    }\n+\n+    //Update Attack Time on main hand for shapeshifters\n+    //do not add me->GetShapeshiftForm() check here, need to change attack time after shapeshift removal too\n+    if (_botclass == BOT_CLASS_DRUID && RespectEquipsAttackTime())\n+    {\n+        uint32 delay;\n+        SpellShapeshiftFormEntry const* ssEntry = sSpellShapeshiftFormStore.LookupEntry(me->GetShapeshiftForm());\n+        if (!ssEntry || !ssEntry->CombatRoundTime)\n+            delay = _equips[BOT_SLOT_MAINHAND] ? _equips[BOT_SLOT_MAINHAND]->GetTemplate()->Delay : me->GetCreatureTemplate()->BaseAttackTime;\n+        else\n+            delay = ssEntry->CombatRoundTime;\n+\n+        me->SetAttackTime(BASE_ATTACK, delay);\n+    }\n+\n+    float atpower = float(me->GetLevel() * (/*IAmFree() ? 100 : */3)); //+8000/+240(legit) base ap at 80\n+    atpower += _getTotalBotStat(BOT_STAT_MOD_ATTACK_POWER);\n+\n+    float strmult, agimult;\n+    switch (myclass)\n+    {\n+        case BOT_CLASS_WARRIOR:\n+        case BOT_CLASS_PALADIN:\n+        case BOT_CLASS_DEATH_KNIGHT:\n+        case BOT_CLASS_DRUID:\n+            strmult = 2.f; agimult = 0.f; break;\n+        case BOT_CLASS_ROGUE:\n+        case BOT_CLASS_SHAMAN:\n+            strmult = 1.f; agimult = 1.f; break;\n+        case BOT_CLASS_HUNTER:\n+            strmult = 0.5f; agimult = 1.f;break; //until attack power is separated\n+        case BOT_CLASS_PRIEST:\n+        case BOT_CLASS_MAGE:\n+        case BOT_CLASS_WARLOCK:\n+            strmult = 1.f; agimult = 0.f; break;\n+        case DRUID_CAT_FORM:\n+            strmult = 2.f; agimult = 1.f; break;\n+        case DRUID_BEAR_FORM:\n+        case DRUID_MOONKIN_FORM:\n+        case DRUID_TREE_FORM:\n+        case DRUID_TRAVEL_FORM:\n+        case DRUID_AQUATIC_FORM:\n+        case DRUID_FLIGHT_FORM:\n+            strmult = 2.f; agimult = 0.f; break;\n+        case BOT_CLASS_BM:\n+            strmult = 0.f; agimult = 9.f; break;\n+        case BOT_CLASS_SPHYNX:\n+            strmult = 2.f; agimult = 0.f; break;\n+        case BOT_CLASS_ARCHMAGE:\n+            strmult = 0.f; agimult = 0.f; break;\n+        case BOT_CLASS_DREADLORD:\n+            strmult = 8.f; agimult = 0.f; break;\n+        case BOT_CLASS_SPELLBREAKER:\n+            strmult = 5.f; agimult = 0.f; break;\n+        case BOT_CLASS_DARK_RANGER:\n+            strmult = 0.f; agimult = 4.f; break;\n+        case BOT_CLASS_NECROMANCER:\n+            strmult = 0.f; agimult = 0.f; break;\n+        case BOT_CLASS_SEA_WITCH:\n+            strmult = 0.f; agimult = 2.f; break;\n+        case BOT_CLASS_CRYPT_LORD:\n+            strmult = 9.f; agimult = 0.f; break;\n+        default:\n+            BOT_LOG_ERROR(\"entities.player\", \"_MeleeDamageUpdate(): NIY myclass {}!\", uint32(myclass));\n+            strmult = 0.f; agimult = 0.f; break;\n+    }\n+\n+    atpower += (strmult != 0x0) ? strmult * _getTotalBotStat(BOT_STAT_MOD_STRENGTH) : 0.f;\n+    atpower += (agimult != 0x0) ? agimult * _getTotalBotStat(BOT_STAT_MOD_AGILITY) : 0.f;\n+\n+    //hunter Expose Weakness checked\n+    for (AuraEffect const* aeff : me->GetAuraEffectsByType(SPELL_AURA_MOD_ATTACK_POWER_OF_STAT_PERCENT))\n+        atpower += CalculatePct(me->GetStat(Stats(aeff->GetMiscValue())), aeff->GetAmount());\n+\n+    atpower += me->GetTotalAuraModifier(SPELL_AURA_MOD_ATTACK_POWER_OF_ARMOR);\n+\n+    //Unit::AuraEffectList const& mAPbyArmor = me->GetAuraEffectsByType(SPELL_AURA_MOD_ATTACK_POWER_OF_ARMOR);\n+    //for (Unit::AuraEffectList::const_iterator iter = mAPbyArmor.begin(); iter != mAPbyArmor.end(); ++iter)\n+    //    atpower += int32(me->GetArmor() / (*iter)->GetAmount());\n+\n+    //Handle mods\n+    if (_botclass == BOT_CLASS_DRUID)\n+    {\n+        //Heart of the Wild part 3\n+        if (mylevel >= 35 && myclass == DRUID_CAT_FORM && GetSpec() == BOT_SPEC_DRUID_FERAL)\n+            ap_mod *= 1.1f;\n+        //Protector of the Pack part 2\n+        if (mylevel >= 45 && myclass == DRUID_BEAR_FORM && GetSpec() == BOT_SPEC_DRUID_FERAL)\n+            ap_mod *= 1.06f;\n+    }\n+    if (_botclass == BOT_CLASS_ROGUE)\n+    {\n+        //Deadliness\n+        if (mylevel >= 35 && GetSpec() == BOT_SPEC_ROGUE_SUBTLETY)\n+            ap_mod *= 1.1f;\n+        //Savage Combat\n+        if (mylevel >= 50 && GetSpec() == BOT_SPEC_ROGUE_COMBAT)\n+            ap_mod *= 1.04f;\n+    }\n+    //from stats mods\n+    if (myclass == DRUID_BEAR_FORM || myclass == DRUID_CAT_FORM)\n+    {\n+        atpower += _getTotalBotStat(BOT_STAT_MOD_FERAL_ATTACK_POWER);\n+        //Predatory Strikes\n+        if (me->GetLevel() >= 25)\n+        {\n+            uint8 slot = BOT_SLOT_MAINHAND;\n+            atpower += 1.5f * me->GetLevel();\n+            atpower += 0.2f * (\n+                _getBotStat(slot, BOT_STAT_MOD_FERAL_ATTACK_POWER)\n+                + _getBotStat(slot, BOT_STAT_MOD_ATTACK_POWER)\n+                //+ _getBotStat(slot, BOT_STAT_MOD_RANGED_ATTACK_POWER)\n+                );\n+        }\n+    }\n+    if (_botclass == BOT_CLASS_HUNTER)\n+    {\n+        //Careful Aim\n+        if (me->GetLevel() >= 15)\n+            atpower += _getTotalBotStat(BOT_STAT_MOD_INTELLECT);\n+        //Hunter vs. Wild\n+        if (me->GetLevel() >= 30 && GetSpec() == BOT_SPEC_HUNTER_SURVIVAL)\n+            atpower += 0.3f * _getTotalBotStat(BOT_STAT_MOD_STAMINA);\n+    }\n+    if (_botclass == BOT_CLASS_SHAMAN)\n+    {\n+        //Mental Dexterity\n+        if (me->GetLevel() >= 30 && GetSpec() == BOT_SPEC_SHAMAN_ENHANCEMENT)\n+            atpower += _getTotalBotStat(BOT_STAT_MOD_INTELLECT);\n+    }\n+    if (_botclass == BOT_CLASS_DARK_RANGER)\n+    {\n+        atpower += 2.f * _getTotalBotStat(BOT_STAT_MOD_INTELLECT);\n+        if (me->GetLevel() >= 60)\n+            ap_mod *= 1.15f;\n+    }\n+    if (_botclass == BOT_CLASS_SEA_WITCH)\n+    {\n+        if (me->GetLevel() >= 20)\n+            atpower += 2.f * _getTotalBotStat(BOT_STAT_MOD_INTELLECT);\n+        else if (me->GetLevel() >= 10)\n+            atpower += 1.f * _getTotalBotStat(BOT_STAT_MOD_INTELLECT);\n+    }\n+\n+    atpower *= ap_mod;\n+    me->SetStatFlatModifier(UNIT_MOD_ATTACK_POWER, BASE_VALUE, atpower);\n+\n+    me->UpdateAttackPowerAndDamage();\n+    if (_botclass == BOT_CLASS_WARRIOR || _botclass == BOT_CLASS_HUNTER || _botclass == BOT_CLASS_ROGUE ||\n+        _botclass == BOT_CLASS_MAGE || _botclass == BOT_CLASS_PRIEST || _botclass == BOT_CLASS_WARLOCK ||\n+        _botclass == BOT_CLASS_DARK_RANGER || _botclass == BOT_CLASS_SEA_WITCH)\n+    {\n+        atpower += _getTotalBotStat(BOT_STAT_MOD_RANGED_ATTACK_POWER) * ap_mod;\n+        me->SetStatFlatModifier(UNIT_MOD_ATTACK_POWER_RANGED, BASE_VALUE, atpower);\n+        me->UpdateAttackPowerAndDamage(true);\n+    }\n+\n+    //ARMOR\n+    //value = IAmFree() ? 0 : me->GetLevel() * 10; //0/800 at 80\n+    value = 2.f * _getTotalBotStat(BOT_STAT_MOD_AGILITY);\n+    value += _getTotalBotStat(BOT_STAT_MOD_ARMOR);\n+\n+    if (mylevel >= 10)\n+    {\n+        //Toughness\n+        if (mylevel >= 20 && (_botclass == BOT_CLASS_WARRIOR || _botclass == BOT_CLASS_PALADIN || _botclass == BOT_CLASS_DEATH_KNIGHT))\n+            armor_mod += 0.1f;\n+        //Frost Presence\n+        if (GetBotStance() == DEATH_KNIGHT_FROST_PRESENCE)\n+            armor_mod += 0.6f;\n+        if (_botclass == BOT_CLASS_DRUID)\n+        {\n+            //Thick Hide\n+            if (mylevel >= 15)\n+                armor_mod += 0.1f;\n+            //Survival of the Fittest\n+            if (myclass == DRUID_BEAR_FORM)\n+                armor_mod += (GetSpec() == BOT_SPEC_DRUID_FERAL ? 0.33f : 0.0f) + (me->GetShapeshiftForm() == FORM_BEAR ? 1.8f : 3.7f);\n+            //Moonkin Form innate\n+            else if (myclass == DRUID_MOONKIN_FORM)\n+                armor_mod += 3.7f;\n+            //Improved Tree Form\n+            else if (myclass == DRUID_TREE_FORM)\n+                armor_mod += 2.0f;\n+            //Improved Barkskin\n+            //else if (myclass == DRUID_TRAVEL_FORM || GetBotStance() == BOT_STANCE_NONE)\n+            //    armor_mod += 1.6f;\n+        }\n+        if (_botclass == BOT_CLASS_HUNTER)\n+        {\n+            //Thick Hide\n+            if (mylevel >= 15)\n+                armor_mod += 0.1f;\n+        }\n+        if (_botclass == BOT_CLASS_MAGE)\n+        {\n+            //Arcane Fortitude\n+            if (mylevel >= 15)\n+                value += 1.5f * _getTotalBotStat(BOT_STAT_MOD_INTELLECT);\n+        }\n+        if (_botclass == BOT_CLASS_SPHYNX)\n+        {\n+            value += 5.f * _getTotalBotStat(BOT_STAT_MOD_INTELLECT);\n+            armor_mod += 0.5f;\n+        }\n+        if (_botclass == BOT_CLASS_ARCHMAGE)\n+        {\n+            value += 5.f * _getTotalBotStat(BOT_STAT_MOD_INTELLECT);\n+        }\n+        if (_botclass == BOT_CLASS_DREADLORD)\n+        {\n+            armor_mod += 0.5f;\n+        }\n+        if (_botclass == BOT_CLASS_SPELLBREAKER)\n+        {\n+            armor_mod += -0.3f; // reduce armor so cannot really tank\n+        }\n+        if (_botclass == BOT_CLASS_NECROMANCER)\n+        {\n+            value += 5.f * _getTotalBotStat(BOT_STAT_MOD_INTELLECT);\n+        }\n+        if (_botclass == BOT_CLASS_CRYPT_LORD)\n+        {\n+            armor_mod += mylevel >= 60 ? 1.0f : mylevel >= 40 ? 0.5f : mylevel >= 20 ? 0.25f : 0.125f;\n+        }\n+    }\n+\n+    value *= armor_mod;\n+    //Druid armor mods should not affect armor from weapons\n+    if (_botclass == BOT_CLASS_DRUID && _stats[BOT_SLOT_MAINHAND][BOT_STAT_MOD_ARMOR] != 0 && armor_mod > 1.f)\n+        value -= _stats[BOT_SLOT_MAINHAND][BOT_STAT_MOD_ARMOR] * (armor_mod - 1.f);\n+    me->SetStatFlatModifier(UNIT_MOD_ARMOR, BASE_VALUE, value);\n+    me->UpdateArmor(); //buffs will be processed here\n+\n+    //RESISTANCES\n+    //Do not store resistance bonuses directly lest we want calcs screwed up\n+    for (uint8 i = SPELL_SCHOOL_HOLY; i != MAX_SPELL_SCHOOL; ++i)\n+    {\n+        value = IAmFree() ? 0 : (GetBG() && GetBG()->isArena()) ? 0 : mylevel;\n+        value += _getTotalBotStat(BotStatMods(BOT_STAT_MOD_RESIST_HOLY + (i - 1)));\n+\n+        //res bonuses\n+        if (_botclass == BOT_CLASS_SPHYNX)\n+            value += mylevel * 5; //total 498 at 83\n+        if (_botclass == BOT_CLASS_DREADLORD)\n+            value += mylevel * 3; //total 332 at 83\n+        if (_botclass == BOT_CLASS_DARK_RANGER || _botclass == BOT_CLASS_SEA_WITCH || _botclass == BOT_CLASS_CRYPT_LORD)\n+            value += mylevel * 2; //total 249 at 83\n+\n+        resistbonus[i-1] = int32(value);\n+        //me->UpdateResistances(i);\n+    }\n+\n+    //DAMAGE TAKEN\n+    value = 1.0f;\n+    tempval = 1.0f;\n+\n+    //class-specified\n+    //Protector of the Pack part 1\n+    if (myclass == DRUID_BEAR_FORM && mylevel >= 45)\n+    {\n+        value -= 0.12f;\n+        tempval -= 0.12f;\n+    }\n+    //Deadened Nerves\n+    if (_botclass == BOT_CLASS_ROGUE && mylevel >= 45 && GetSpec() == BOT_SPEC_ROGUE_ASSASINATION)\n+    {\n+        value -= 0.06f;\n+        tempval -= 0.06f;\n+    }\n+    //Survival Instincts\n+    if (_botclass == BOT_CLASS_HUNTER && mylevel >= 15)\n+    {\n+        value -= 0.04f;\n+        tempval -= 0.04f;\n+    }\n+    //Spell Warding\n+    if (_botclass == BOT_CLASS_PRIEST && mylevel >= 15)\n+        tempval -= 0.1f;\n+    //Elemental Warding\n+    if (_botclass == BOT_CLASS_SHAMAN && mylevel >= 15)\n+    {\n+        value -= 0.06f;\n+        tempval -= 0.06f;\n+    }\n+    if (_botclass == BOT_CLASS_DEATH_KNIGHT)\n+    {\n+        //Magic Suppression (everything)\n+        if (mylevel >= 60 && GetSpec() == BOT_SPEC_DK_UNHOLY)\n+            tempval -= 0.06f;\n+        //Improved Frost Presence\n+        if (mylevel >= 61 && GetBotStance() == DEATH_KNIGHT_FROST_PRESENCE && GetSpec() == BOT_SPEC_DK_FROST)\n+        {\n+            value -= 0.02f;\n+            tempval -= 0.02f;\n+        }\n+    }\n+    if (_botclass == BOT_CLASS_WARLOCK)\n+    {\n+        //Molten Skin\n+        if (mylevel >= 15)\n+        {\n+            value -= 0.06f;\n+            tempval -= 0.06f;\n+        }\n+        //Master Demonologist part 2, Master Demonologist part 4\n+        if (mylevel >= 35 && GetSpec() == BOT_SPEC_WARLOCK_DEMONOLOGY && botPet && botPet->IsAlive())\n+        {\n+            if (GetAIMiscValue(BOTAI_MISC_PET_TYPE) == BOT_PET_VOIDWALKER)\n+                value -= 0.1f;\n+            else if (GetAIMiscValue(BOTAI_MISC_PET_TYPE) == BOT_PET_FELHUNTER)\n+                tempval -= 0.1f;\n+        }\n+    }\n+    //Frozen Core (everything), Prismatic Cloak part 1\n+    if (_botclass == BOT_CLASS_MAGE)\n+    {\n+        if (mylevel >= 30 && GetSpec() == BOT_SPEC_MAGE_FROST)\n+            tempval -= 0.06f;\n+        else if (mylevel >= 35 && GetSpec() == BOT_SPEC_MAGE_ARCANE)\n+        {\n+            value -= 0.06f;\n+            tempval -= 0.06f;\n+        }\n+    }\n+    if (_botclass == BOT_CLASS_SPHYNX)\n+    {\n+        value -= 0.33f;\n+        tempval -= 0.33f;\n+    }\n+    if (_botclass == BOT_CLASS_ARCHMAGE)\n+    {\n+        value -= 0.1f;\n+        tempval -= 0.35f;\n+    }\n+    if (_botclass == BOT_CLASS_DREADLORD)\n+    {\n+        value -= 0.15f;\n+        tempval -= 0.2f;\n+    }\n+    if (_botclass == BOT_CLASS_SPELLBREAKER)\n+    {\n+        value -= 0.2f;\n+        tempval -= 0.75f;\n+    }\n+    if (_botclass == BOT_CLASS_DARK_RANGER)\n+    {\n+        tempval -= 0.35f;\n+    }\n+    if (_botclass == BOT_CLASS_NECROMANCER)\n+    {\n+        tempval -= 0.2f;\n+    }\n+    if (_botclass == BOT_CLASS_SEA_WITCH)\n+    {\n+        tempval -= 0.3f;\n+    }\n+    if (_botclass == BOT_CLASS_CRYPT_LORD)\n+    {\n+        value -= 0.3f;\n+        tempval -= 0.15f;\n+    }\n+\n+    dmg_taken_phy = value;\n+    dmg_taken_mag = tempval;\n+\n+    //RESILIENCE\n+    value = 0.f;\n+\n+    tempval = std::max<float>(_getTotalBotStat(BOT_STAT_MOD_CRIT_TAKEN_MELEE_RATING), std::max<float>(_getTotalBotStat(BOT_STAT_MOD_CRIT_TAKEN_RANGED_RATING), _getTotalBotStat(BOT_STAT_MOD_CRIT_TAKEN_SPELL_RATING)));\n+    tempval += me->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_RATING, (1u << CR_CRIT_TAKEN_MELEE) | (1u << CR_CRIT_TAKEN_RANGED) | (1u << CR_CRIT_TAKEN_SPELL));\n+    value += tempval * std::max<float>(_getRatingMultiplier(CR_CRIT_TAKEN_MELEE), std::max<float>(_getRatingMultiplier(CR_CRIT_TAKEN_RANGED), _getRatingMultiplier(CR_CRIT_TAKEN_SPELL)));\n+\n+    resilience = value;\n+\n+    //HEALTH\n+    _OnHealthUpdate();\n+\n+    //HASTE\n+    if (haste)\n+    {\n+        //unapply old haste\n+        for (auto att : NPCBots::index_array<uint8, MAX_ATTACK>)\n+            me->ApplyAttackTimePercentMod(WeaponAttackType(att), float(haste), false);\n+        me->ApplyCastTimePercentMod(float(haste), false);\n+    }\n+\n+    value = IAmFree() ? std::max<int32>(int32(mylevel) - 50, 0) : 0; // +30%/+0% haste at 80\n+\n+    //25.5 HR = 1% haste at 80\n+    tempval = _getTotalBotStat(BOT_STAT_MOD_HASTE_MELEE_RATING) + _getTotalBotStat(BOT_STAT_MOD_HASTE_RANGED_RATING) + _getTotalBotStat(BOT_STAT_MOD_HASTE_SPELL_RATING) + _getTotalBotStat(BOT_STAT_MOD_HASTE_RATING);\n+    tempval += me->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_RATING, (1u << CR_HASTE_MELEE) | (1u << CR_HASTE_RANGED) | (1u << CR_HASTE_SPELL));\n+\n+    if (_botclass == BOT_CLASS_WARLOCK)\n+    {\n+        //Spellstone: just emulate the rating bonus\n+        uint8 ratingBonus;\n+        if      (mylevel >= 78) ratingBonus = 60;\n+        else if (mylevel >= 72) ratingBonus = 50;\n+        else if (mylevel >= 66) ratingBonus = 40;\n+        else if (mylevel >= 60) ratingBonus = 30;\n+        else if (mylevel >= 48) ratingBonus = 20;\n+        else if (mylevel >= 36) ratingBonus = 10;\n+        else                    ratingBonus = 0;\n+\n+        //Master Conjuror\n+        if (mylevel >= 30 && GetSpec() == BOT_SPEC_WARLOCK_DEMONOLOGY)\n+            ratingBonus *= 4;\n+\n+        tempval += (float)ratingBonus;\n+    }\n+\n+    value += tempval * ((_botclass == BOT_CLASS_HUNTER || _botclass == BOT_CLASS_DARK_RANGER || _botclass == BOT_CLASS_SEA_WITCH) ?\n+        _getRatingMultiplier(CR_HASTE_RANGED) :\n+        std::max<float>(_getRatingMultiplier(CR_HASTE_MELEE), _getRatingMultiplier(CR_HASTE_SPELL)));\n+\n+    //class-specific\n+    if (_botclass == BOT_CLASS_HUNTER)\n+    {\n+        value += 15.f; //innate ranged haste bonus 15% for hunters (still applies to all haste types)\n+        //Serpent's Swiftness\n+        if (mylevel >= 45 && GetSpec() == BOT_SPEC_HUNTER_BEASTMASTERY)\n+            value += 20.f;\n+    }\n+    if (_botclass == BOT_CLASS_ROGUE)\n+    {\n+        //Lightning Reflexes part 2\n+        if (mylevel >= 25 && GetSpec() == BOT_SPEC_ROGUE_COMBAT)\n+            value += 10.f;\n+    }\n+    if (_botclass == BOT_CLASS_PRIEST)\n+    {\n+        //Enlightenment part 2\n+        if (mylevel >= 35 && GetSpec() == BOT_SPEC_PRIEST_DISCIPLINE)\n+            value += 6.f;\n+    }\n+    if (_botclass == BOT_CLASS_MAGE)\n+    {\n+        //Netherwind Presence\n+        if (mylevel >= 55 && GetSpec() == BOT_SPEC_MAGE_ARCANE)\n+            value += 6.f;\n+    }\n+    if (_botclass >= BOT_CLASS_EX_START)\n+    {\n+        float haste_per_lvl;\n+        switch (_botclass)\n+        {\n+            case BOT_CLASS_BM:\n+            case BOT_CLASS_DREADLORD:\n+                haste_per_lvl = 0.875f;\n+                break;\n+            case BOT_CLASS_ARCHMAGE:\n+            case BOT_CLASS_DARK_RANGER:\n+            case BOT_CLASS_SEA_WITCH:\n+                haste_per_lvl = 0.5f;\n+                break;\n+            case BOT_CLASS_CRYPT_LORD:\n+                haste_per_lvl = 0.35f;\n+                break;\n+            default:\n+                haste_per_lvl = 0.25f;\n+                break;\n+        }\n+        value += mylevel * haste_per_lvl;\n+    }\n+\n+    haste = int32(value);\n+\n+    if (haste)\n+    {\n+        //apply new haste (using truncated value - gonna need it for unapply on next SetStats)\n+        for (auto att : NPCBots::index_array<uint8, MAX_ATTACK>)\n+            me->ApplyAttackTimePercentMod(WeaponAttackType(att), float(haste), true);\n+        me->ApplyCastTimePercentMod(float(haste), true);\n+    }\n+\n+    //HIT\n+    if (CanMiss())\n+    {\n+        value = float(IAmFree() ? mylevel / 8 : 0); // +10%/+0% at 80\n+        //32.5 HR = 1% hit at 80\n+        tempval = _getTotalBotStat(BOT_STAT_MOD_HIT_MELEE_RATING) + _getTotalBotStat(BOT_STAT_MOD_HIT_RANGED_RATING) + _getTotalBotStat(BOT_STAT_MOD_HIT_SPELL_RATING) + _getTotalBotStat(BOT_STAT_MOD_HIT_RATING);\n+        tempval += me->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_RATING, (1u << CR_HIT_MELEE) | (1u << CR_HIT_RANGED) | (1u << CR_HIT_SPELL));\n+        value += tempval * (_botclass == BOT_CLASS_HUNTER ? _getRatingMultiplier(CR_HIT_RANGED) : std::max<float>(_getRatingMultiplier(CR_HIT_MELEE), _getRatingMultiplier(CR_HIT_SPELL)));\n+\n+        //class-specific\n+        //Precision\n+        if (_botclass == BOT_CLASS_ROGUE && mylevel >= 15)\n+            value += 5.f;\n+        //Enlightened Judgements part 2,3\n+        if (_botclass == BOT_CLASS_PALADIN && GetSpec() == BOT_SPEC_PALADIN_HOLY && mylevel >= 55)\n+            value += 4.f;\n+        //Virulence part 1, Nerves of Cold Steel part 1\n+        if (_botclass == BOT_CLASS_DEATH_KNIGHT)\n+            value += 3.f;\n+        //Dual Wield Specialization\n+        if (_botclass == BOT_CLASS_SHAMAN && mylevel >= 40 && me->haveOffhandWeapon())\n+            value += 6.f;\n+        //Precision\n+        if (_botclass == BOT_CLASS_WARRIOR && mylevel >= 30 && GetSpec() == BOT_SPEC_WARRIOR_FURY)\n+            value += 3.f;\n+        //Focused Aim\n+        if (_botclass == BOT_CLASS_HUNTER && mylevel >= 10)\n+            value += 3.f;\n+        //Shadow Focus part 1\n+        if (_botclass == BOT_CLASS_PRIEST && mylevel >= 15)\n+            value += 3.f;\n+        //Arcane Focus part 1, Precision part 2\n+        if (_botclass == BOT_CLASS_MAGE && mylevel >= 10)\n+            value += mylevel >= 15 ? 6.f : 3.f;\n+        //Suppression\n+        if (_botclass == BOT_CLASS_WARLOCK && mylevel >= 10)\n+            value += 3.f;\n+\n+        hit = value;\n+    }\n+    else\n+        hit = 100.0f;\n+\n+    //ARMOR PENETRATION\n+    value = float(IAmFree() ? 5 + mylevel / 4 : 0); // 25%/0% at 80\n+    //? APR = 1% armor ignored at 80\n+    tempval = _getTotalBotStat(BOT_STAT_MOD_ARMOR_PENETRATION_RATING);\n+    tempval += me->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_RATING, (1u << CR_ARMOR_PENETRATION));\n+    value += tempval * _getRatingMultiplier(CR_ARMOR_PENETRATION);\n+\n+    //class-specific\n+    //Blood Gorged\n+    if (_botclass == BOT_CLASS_DEATH_KNIGHT && mylevel >= 64 && GetSpec() == BOT_SPEC_DK_BLOOD)\n+        value += 10.f;\n+\n+    if (_botclass == BOT_CLASS_DARK_RANGER)\n+        value += 50.f;\n+\n+    armor_pen = value;\n+\n+    //EXPERTISE\n+    value = float(IAmFree() ? mylevel / 2 : 0); // -10%/-0% at 80\n+    //~8.0 ER = 1 expertise at 80\n+    tempval = _getTotalBotStat(BOT_STAT_MOD_EXPERTISE_RATING);\n+    tempval += me->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_RATING, (1u << CR_EXPERTISE));\n+    value += tempval * _getRatingMultiplier(CR_EXPERTISE);\n+\n+    //class-specific\n+    //Weapon Expertise\n+    if (mylevel >= 35 && _botclass == BOT_CLASS_ROGUE && GetSpec() == BOT_SPEC_ROGUE_COMBAT)\n+        value += 10.f;\n+    //Combat Expertise\n+    if (mylevel >= 45 && _botclass == BOT_CLASS_PALADIN && GetSpec() == BOT_SPEC_PALADIN_PROTECTION)\n+        value += 6.f;\n+    if (_botclass == BOT_CLASS_WARRIOR)\n+    {\n+        //Vitality: 6, Strength of Arms: 4\n+        if (mylevel >= 45 && GetSpec() == BOT_SPEC_WARRIOR_PROTECTION)\n+            value += 10.f;\n+        else if (mylevel >= 40 && GetSpec() == BOT_SPEC_WARRIOR_ARMS)\n+            value += 4.f;\n+    }\n+    if (_botclass == BOT_CLASS_DEATH_KNIGHT)\n+    {\n+        //Tundra Stalker, Rage of Rivendare: 5\n+        //Veteral of the Third War part 3: 6\n+        if (mylevel >= 64 && GetSpec() == BOT_SPEC_DK_FROST)\n+            value += 5.f;\n+        else if (mylevel >= 64 && GetSpec() == BOT_SPEC_DK_UNHOLY)\n+            value += 5.f;\n+        else if (mylevel >= 59 && GetSpec() == BOT_SPEC_DK_BLOOD)\n+            value += 6.f;\n+    }\n+    if (_botclass == BOT_CLASS_DREADLORD)\n+    {\n+        value += 40.f;\n+    }\n+    if (_botclass == BOT_CLASS_CRYPT_LORD)\n+    {\n+        value += 20.f;\n+    }\n+\n+    expertise = value;\n+\n+    //CRIT\n+    if (CanCrit())\n+    {\n+        value = float(IAmFree() ? mylevel / 4 : 0); // +20%/+0% at 80\n+        tempval = value;\n+\n+        GtChanceToMeleeCritBaseEntry const* critBaseMelee  = sGtChanceToMeleeCritBaseStore.LookupEntry(GetPlayerClass()-1);\n+        GtChanceToMeleeCritEntry const* critRatioMelee = sGtChanceToMeleeCritStore.LookupEntry((GetPlayerClass()-1)*GT_MAX_LEVEL + mylevel-1);\n+        if (critBaseMelee && critRatioMelee)\n+            value += (critBaseMelee->Data + _getTotalBotStat(BOT_STAT_MOD_AGILITY) * critRatioMelee->Data) * 100.0f;\n+\n+        //crit from intellect\n+        GtChanceToSpellCritBaseEntry const* critBaseSpell  = sGtChanceToSpellCritBaseStore.LookupEntry(GetPlayerClass()-1);\n+        GtChanceToSpellCritEntry const* critRatioSpell = sGtChanceToSpellCritStore.LookupEntry((GetPlayerClass()-1)*GT_MAX_LEVEL + mylevel-1);\n+        if (critBaseSpell && critRatioSpell)\n+            tempval += (critBaseSpell->Data + _getTotalBotStat(BOT_STAT_MOD_INTELLECT) * critRatioSpell->Data) * 100.f;\n+\n+        value = std::max<float>(value, tempval);\n+\n+        //45 CR = 1% crit at 80\n+        tempval = _getTotalBotStat(BOT_STAT_MOD_CRIT_MELEE_RATING) + _getTotalBotStat(BOT_STAT_MOD_CRIT_RANGED_RATING) + _getTotalBotStat(BOT_STAT_MOD_CRIT_SPELL_RATING) + _getTotalBotStat(BOT_STAT_MOD_CRIT_RATING);\n+        tempval += me->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_RATING, (1u << CR_CRIT_MELEE) | (1u << CR_CRIT_RANGED) | (1u << CR_CRIT_SPELL));\n+\n+        //Molten Armor: 35% spirit to crit rating (+40% double-glyphed + 15% T9P2 bonus)\n+        if (_botclass == BOT_CLASS_MAGE && me->HasAuraTypeWithFamilyFlags(SPELL_AURA_MOD_RATING_FROM_STAT, SPELLFAMILY_MAGE, 0x40000))\n+            tempval += _getTotalBotStat(BOT_STAT_MOD_SPIRIT) * (mylevel >= 80 ? 0.9f : mylevel >= 70 ? 0.75f : 0.55f);\n+        //Firestone: just emulate the rating bonus\n+        if (_botclass == BOT_CLASS_WARLOCK)\n+        {\n+            uint8 ratingBonus;\n+            if      (mylevel >= 80) ratingBonus = 49;\n+            else if (mylevel >= 74) ratingBonus = 42;\n+            else if (mylevel >= 66) ratingBonus = 35;\n+            else if (mylevel >= 56) ratingBonus = 28;\n+            else if (mylevel >= 46) ratingBonus = 21;\n+            else if (mylevel >= 36) ratingBonus = 14;\n+            else if (mylevel >= 28) ratingBonus = 7;\n+            else                    ratingBonus = 0;\n+\n+            //Master Conjuror\n+            if (mylevel >= 30 && GetSpec() == BOT_SPEC_WARLOCK_DEMONOLOGY)\n+                ratingBonus *= 4;\n+\n+            tempval += (float)ratingBonus;\n+        }\n+\n+        value += tempval * (_botclass == BOT_CLASS_HUNTER ? _getRatingMultiplier(CR_CRIT_RANGED) : std::max<float>(_getRatingMultiplier(CR_CRIT_MELEE), _getRatingMultiplier(CR_CRIT_SPELL)));\n+\n+        //common crit talents\n+        if (mylevel >= 10 &&\n+            (_botclass != BOT_CLASS_MAGE && _botclass != BOT_CLASS_PRIEST &&\n+            _botclass != BOT_CLASS_DRUID && _botclass != BOT_CLASS_WARLOCK))\n+            value += 5.f;\n+\n+        //class-specific\n+        if (_botclass == BOT_CLASS_DRUID)\n+        {\n+            //Sharpened Claws\n+            if (mylevel >= 20 && (myclass == DRUID_CAT_FORM || myclass == DRUID_BEAR_FORM))\n+                value += 6.f;\n+        }\n+        if (_botclass == BOT_CLASS_ROGUE)\n+        {\n+            //Close Quarters Combat\n+            if (mylevel >= 20)\n+            {\n+                if (Item const* mainhand = _equips[BOT_SLOT_MAINHAND])\n+                {\n+                    if (mainhand->GetTemplate()->Class == ITEM_CLASS_WEAPON &&\n+                        (mainhand->GetTemplate()->SubClass == ITEM_SUBCLASS_WEAPON_DAGGER ||\n+                        mainhand->GetTemplate()->SubClass == ITEM_SUBCLASS_WEAPON_FIST_WEAPON))\n+                        value += 5.f;\n+                }\n+            }\n+        }\n+        if (_botclass == BOT_CLASS_PALADIN)\n+        {\n+            //Sanctity of Battle part 1\n+            if (mylevel >= 25 && GetSpec() == BOT_SPEC_PALADIN_RETRIBUTION)\n+                value += 3.f;\n+            //Combat Expertise\n+            if (mylevel >= 45 && GetSpec() == BOT_SPEC_PALADIN_PROTECTION)\n+                value += 6.f;\n+        }\n+        if (_botclass == BOT_CLASS_HUNTER)\n+        {\n+            //Killer Instinct\n+            if (mylevel >= 30 && GetSpec() == BOT_SPEC_HUNTER_BEASTMASTERY)\n+                value += 3.f;\n+            //Master Marksman\n+            if (mylevel >= 45 && GetSpec() == BOT_SPEC_HUNTER_MARKSMANSHIP)\n+                value += 5.f;\n+        }\n+        if (_botclass == BOT_CLASS_PRIEST)\n+        {\n+            //Focused Will part 1\n+            if (mylevel >= 40 && GetSpec() == BOT_SPEC_PRIEST_DISCIPLINE)\n+                value += 3.f;\n+        }\n+        if (_botclass == BOT_CLASS_DEATH_KNIGHT)\n+        {\n+            //Annihilation part 1\n+            if (mylevel >= 57)\n+                value += 3.f;\n+        }\n+        if (_botclass == BOT_CLASS_WARLOCK)\n+        {\n+            //Backlash\n+            if (mylevel >= 30)\n+                value += 3.f;\n+            //Demonic Tactics part 1, part 2 (me)\n+            if (mylevel >= 45 && GetSpec() == BOT_SPEC_WARLOCK_DEMONOLOGY)\n+                value += 10.f;\n+        }\n+        if (_botclass == BOT_CLASS_MAGE)\n+        {\n+            //Arcane Instability part 2\n+            if (mylevel >= 35 && GetSpec() == BOT_SPEC_MAGE_ARCANE)\n+                value += 3.f;\n+        }\n+        if (_botclass == BOT_CLASS_DREADLORD)\n+        {\n+            value = value * 2.f;\n+        }\n+        if (_botclass == BOT_CLASS_DARK_RANGER)\n+        {\n+            value += 20.f;\n+        }\n+\n+        if (BotCfg::IsBotStatsLimitsEnabled())\n+            crit = std::min<float>(value, BotCfg::GetBotStatLimitCrit());\n+        else\n+            crit = value;\n+\n+        if (crit < 0.0f)\n+            crit = 0.0f;\n+    }\n+    else\n+        crit = 0.0f;\n+\n+    //DEFENSE\n+    value = 0.f;\n+    tempval = _getTotalBotStat(BOT_STAT_MOD_DEFENSE_SKILL_RATING);\n+    tempval += me->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_RATING, (1u << CR_DEFENSE_SKILL));\n+    value += tempval * _getRatingMultiplier(CR_DEFENSE_SKILL);\n+    value += me->GetTotalAuraModifierByMiscValue(SPELL_AURA_MOD_SKILL, SKILL_DEFENSE);\n+    defense = mylevel * 5 + uint32(value); //truncate\n+\n+    float defbonus = defense - mylevel * 5; //difference\n+\n+    //PARRY\n+    if (CanParry())\n+    {\n+        value = 5.0f + float(IAmFree() ? mylevel / 8 : 0); // +10%/+0% at 80\n+\n+        if (mylevel >= 10)\n+        {\n+            //67 PR = 1% parry at 80\n+            tempval = _getTotalBotStat(BOT_STAT_MOD_PARRY_RATING);\n+            tempval += me->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_RATING, (1u << CR_PARRY));\n+\n+            //Forceful Deflection: 25% of strength goes to parry rating\n+            if (_botclass == BOT_CLASS_DEATH_KNIGHT/* && mylevel >= 55*/)\n+                tempval += _getTotalBotStat(BOT_STAT_MOD_STRENGTH) * 0.25f;\n+\n+            value += tempval * _getRatingMultiplier(CR_PARRY);\n+            //125 DR = 1% block/parry/dodge at 80\n+            value += defbonus * 0.04f;\n+        }\n+\n+        //Deflection (general)\n+        if ((_botclass == BOT_CLASS_WARRIOR || _botclass == BOT_CLASS_ROGUE || _botclass == BOT_CLASS_PALADIN) && mylevel >= 10)\n+            value += 5.0f;\n+        if (_botclass == BOT_CLASS_HUNTER && mylevel >= 20)\n+            value += 3.f;\n+\n+        if (_botclass == BOT_CLASS_SEA_WITCH)\n+            value += 25.f;\n+\n+        if (BotCfg::IsBotStatsLimitsEnabled())\n+            parry = std::min<float>(value, BotCfg::GetBotStatLimitParry());\n+        else\n+            parry = value;\n+\n+        if (parry < 0.0f)\n+            parry = 0.0f;\n+    }\n+    else\n+        parry = 0.0f;\n+\n+    //DODGE\n+    if (CanDodge())\n+    {\n+        value = 5.0f + float(IAmFree() ? mylevel / 8 : 0); // +10%/+0% at 80\n+\n+        if (GtChanceToMeleeCritEntry  const* dodgeRatio = sGtChanceToMeleeCritStore.LookupEntry((GetPlayerClass()-1)*GT_MAX_LEVEL + mylevel-1))\n+            value += _getTotalBotStat(BOT_STAT_MOD_AGILITY) * dodgeRatio->Data * 100.0f;\n+\n+        if (mylevel >= 10)\n+        {\n+            //53 DR = 1% dodge at 80\n+            tempval = _getTotalBotStat(BOT_STAT_MOD_DODGE_RATING);\n+            tempval += me->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_RATING, (1u << CR_DODGE));\n+            value += tempval * _getRatingMultiplier(CR_DODGE);\n+            //125 DR = 1% block/parry/dodge at 80\n+            value += defbonus * 0.04f;\n+        }\n+\n+        //evasion, anticipation (general)\n+        if ((_botclass == BOT_CLASS_WARRIOR || _botclass == BOT_CLASS_ROGUE || _botclass == BOT_CLASS_PALADIN ||\n+            _botclass == BOT_CLASS_DEATH_KNIGHT || _botclass == BOT_CLASS_SHAMAN) && mylevel >= 15)\n+            value += 5.0f;\n+\n+        //class-specific\n+        if (_botclass == BOT_CLASS_DRUID)\n+        {\n+            //Feral Swiftness\n+            if (mylevel >= 20 && (myclass == DRUID_CAT_FORM || myclass == DRUID_BEAR_FORM))\n+                value += 4.f;\n+        }\n+\n+        if (_botclass == BOT_CLASS_DARK_RANGER)\n+        {\n+            //base dodge 30%\n+            value += 30.f;\n+        }\n+\n+        if (_botclass == BOT_CLASS_SEA_WITCH && IsInContactWithWater())\n+        {\n+            //BOT_LOG_ERROR(\"scripts\", \"BOT_CLASS_SEA_WITCH dodge: {} now in water\", me->GetName());\n+            value += 50.f;\n+        }\n+\n+        if (BotCfg::IsBotStatsLimitsEnabled())\n+            dodge = std::min<float>(value, BotCfg::GetBotStatLimitDodge());\n+        else\n+            dodge = value;\n+\n+        if (dodge < 0.0f)\n+            dodge = 0.0f;\n+    }\n+    else\n+        dodge = 0.0f;\n+\n+    //BLOCK\n+    if (IsBlockingClass(_botclass))\n+    {\n+        value = 5.0f + float(IAmFree() ? mylevel / 4 : 0); // +20%/+0% at 80\n+\n+        //16.5 BR = 1% block at 80\n+        tempval = _getTotalBotStat(BOT_STAT_MOD_BLOCK_RATING);\n+        tempval += me->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_RATING, (1u << CR_BLOCK));\n+        value += tempval * _getRatingMultiplier(CR_BLOCK);\n+        //125 DR = 1% block/parry/dodge at 80\n+        value += defbonus * 0.04f;\n+\n+        //base block chance is capped at 75%\n+        if (BotCfg::IsBotStatsLimitsEnabled())\n+            block = std::min<float>(value, BotCfg::GetBotStatLimitBlock());\n+        else\n+            block = std::min<float>(value, 75.0f);\n+\n+        if (block < 0.0f)\n+            block = 0.0f;\n+\n+        //Spellbreaker wears tall shield so should always block\n+        if (_botclass == BOT_CLASS_SPELLBREAKER)\n+            block += 90.f;\n+\n+        //BLOCK VALUE\n+        //2 str = 1 block value\n+        value = 0.5f * _getTotalBotStat(BOT_STAT_MOD_STRENGTH) - 10.f;\n+        value += _getTotalBotStat(BOT_STAT_MOD_BLOCK_VALUE);\n+\n+        //Shield Mastery part 1\n+        if (_botclass == BOT_CLASS_WARRIOR && mylevel >= 20 && GetSpec() == BOT_SPEC_WARRIOR_PROTECTION)\n+            value *= 1.3f;\n+        //Redoubt handled in passives\n+        //if (mylevel >= 45 && _botclass == BOT_CLASS_PALADIN)\n+        //    value *= 1.3f;\n+\n+        blockvalue = std::max<float>(int32(value), 1.f);\n+    }\n+    //else\n+    //{\n+    //    block = 0.0f;\n+    //    blockvalue = 0;\n+    //}\n+\n+    //MANA\n+    _OnManaUpdate();\n+\n+    if (IsCastingClass(_botclass))\n+    {\n+        //SPELL PENETRATION\n+        value = IAmFree() ? mylevel : 0; // 80/0 at 80\n+        //~1 SPPR = 1 spell penetration\n+        value += _getTotalBotStat(BOT_STAT_MOD_SPELL_PENETRATION);\n+        spellpen = uint32(value);\n+\n+        //SPELL POWER\n+        value = /*IAmFree() ? std::max<int32>((int8(mylevel) - 30) * 40, 0) : */0; // +2000/+0 spp at 80\n+        value += _getTotalBotStat(BOT_STAT_MOD_SPELL_POWER);\n+\n+        //class-specified mods\n+        if (_botclass == BOT_CLASS_PALADIN && mylevel >= 50)\n+        {\n+            //Touched by the Light - 60% of strength to spell power\n+            if (GetSpec() == BOT_SPEC_PALADIN_PROTECTION)\n+                value += 0.6f * _getTotalBotStat(BOT_STAT_MOD_STRENGTH);\n+            //Sheath of Light - 30% attack power to spell power\n+            if (GetSpec() == BOT_SPEC_PALADIN_RETRIBUTION)\n+                value += 0.3f * me->GetTotalAttackPowerValue(BASE_ATTACK);\n+            //Holy Guidance - 20% Intellect to spell power\n+            if (GetSpec() == BOT_SPEC_PALADIN_HOLY)\n+                value += 0.2f * _getTotalBotStat(BOT_STAT_MOD_INTELLECT);\n+        }\n+        if (_botclass == BOT_CLASS_PRIEST && mylevel >= 30)\n+        {\n+            float totalSpi = _getTotalBotStat(BOT_STAT_MOD_SPIRIT);\n+            //Spiritual Guidance - 25% Spirit to spell power\n+            if (GetSpec() == BOT_SPEC_PRIEST_HOLY)\n+                value += 0.25f * totalSpi;\n+            //Twisted Faith - 20% Spirit to spell power\n+            else if (mylevel >= 55 && GetSpec() == BOT_SPEC_PRIEST_SHADOW)\n+                value += 0.2f * totalSpi;\n+            //Shadowy Insight (Glyph of Shadow)\n+            if (me->GetAuraEffect(SPELL_AURA_MOD_SPELL_DAMAGE_OF_STAT_PERCENT, SPELLFAMILY_GENERIC, 1499, 0))\n+                value += 0.3f * totalSpi;\n+        }\n+        if (_botclass == BOT_CLASS_SHAMAN && mylevel >= 50 && GetSpec() == BOT_SPEC_SHAMAN_ENHANCEMENT)\n+        {\n+            //Mental Quickness - 30% attack power to spell power (only enhancement)\n+            value += 0.3f * me->GetTotalAttackPowerValue(BASE_ATTACK);\n+        }\n+        if (_botclass == BOT_CLASS_DRUID && mylevel >= 30)\n+        {\n+            //Nurturing Instinct - 70% Agility to spell power\n+            value += 0.7f * _getTotalBotStat(BOT_STAT_MOD_AGILITY);\n+            //Lunar Guidance - 12% Intellect to spell power\n+            value += 0.12f * _getTotalBotStat(BOT_STAT_MOD_INTELLECT);\n+            //Improved Moonkin Form - 30% Spirit to spell power\n+            if (mylevel >= 40 && myclass == DRUID_MOONKIN_FORM)\n+                value += 0.3f * _getTotalBotStat(BOT_STAT_MOD_SPIRIT);\n+            //Improved Tree (of Life) Form - 15% Spirit to spell power\n+            if (mylevel >= 50 && myclass == DRUID_TREE_FORM)\n+                value += 0.15f * _getTotalBotStat(BOT_STAT_MOD_SPIRIT);\n+        }\n+        if (_botclass == BOT_CLASS_MAGE && mylevel >= 45 && GetSpec() == BOT_SPEC_MAGE_ARCANE)\n+        {\n+            //Mind Mastery - 15% Intellect to spell power\n+            value += 0.15f * _getTotalBotStat(BOT_STAT_MOD_INTELLECT);\n+        }\n+        if (_botclass == BOT_CLASS_WARLOCK)\n+        {\n+            if (me->GetAuraEffect(SPELL_AURA_MOD_SPELL_DAMAGE_OF_STAT_PERCENT, SPELLFAMILY_WARLOCK, 0x0, 0x20000000, 0x0))\n+            {\n+                //Fel Armor + Demonic Aegis - 39% Spirit to spell power\n+                value += 0.39f * _getTotalBotStat(BOT_STAT_MOD_SPIRIT);\n+            }\n+            //Demonic Knowledge\n+            if (botPet && botPet->IsAlive() && mylevel >= 40 && GetSpec() == BOT_SPEC_WARLOCK_DEMONOLOGY)\n+                value += 0.12f * botPet->GetStat(STAT_STAMINA) + botPet->GetStat(STAT_INTELLECT);\n+            //Glyph of Life Tap: 20% of spirit to spellpower\n+            if (me->GetAuraEffect(SPELL_AURA_MOD_SPELL_DAMAGE_OF_STAT_PERCENT, SPELLFAMILY_WARLOCK, 208, 0))\n+                value += 0.2f * _getTotalBotStat(BOT_STAT_MOD_SPIRIT);\n+        }\n+        if (_botclass == BOT_CLASS_SPHYNX)\n+        {\n+            //bonus from attack power (for tank) or intellect (ranged)\n+            value += 2.0f *_getTotalBotStat(BOT_STAT_MOD_INTELLECT);\n+            value += 0.5f * me->GetTotalAttackPowerValue(BASE_ATTACK);\n+            //from wands\n+            for (auto i : NPCBots::index_array<uint8, BOT_FIRST_NON_MELEE_SLOT>)\n+                if (ItemTemplate const* proto = _equips[i] ? _equips[i]->GetTemplate() : nullptr)\n+                    value += proto->getDPS() * 1.35f;\n+        }\n+        if (_botclass == BOT_CLASS_ARCHMAGE)\n+        {\n+            //bonus from intellect\n+            value += _getTotalBotStat(BOT_STAT_MOD_INTELLECT);\n+        }\n+        if (_botclass == BOT_CLASS_DREADLORD)\n+        {\n+            //bonus from strength\n+            value += 2.f * _getTotalBotStat(BOT_STAT_MOD_STRENGTH);\n+        }\n+        if (_botclass == BOT_CLASS_SPELLBREAKER)\n+        {\n+            //bonus from strength\n+            value += 2.f * _getTotalBotStat(BOT_STAT_MOD_STRENGTH);\n+        }\n+        if (_botclass == BOT_CLASS_DARK_RANGER)\n+        {\n+            //bonus from intellect\n+            value += 0.5f * _getTotalBotStat(BOT_STAT_MOD_INTELLECT);\n+        }\n+        if (_botclass == BOT_CLASS_NECROMANCER)\n+        {\n+            //bonus from intellect\n+            value += _getTotalBotStat(BOT_STAT_MOD_INTELLECT);\n+        }\n+        if (_botclass == BOT_CLASS_SEA_WITCH)\n+        {\n+            //bonus from intellect\n+            value += 2.f * _getTotalBotStat(BOT_STAT_MOD_INTELLECT);\n+        }\n+        if (_botclass == BOT_CLASS_CRYPT_LORD)\n+        {\n+            //bonus from strength\n+            value += 2.f * _getTotalBotStat(BOT_STAT_MOD_STRENGTH);\n+        }\n+\n+        spellpower = uint32(value);\n+    }\n+    //else\n+    //{\n+    //    spellpower = 0;\n+    //}\n+\n+    //if init or levelup\n+    if (force)\n+    {\n+        InitHeals();\n+        me->SetFullHealth();\n+        if (_botclass != BOT_CLASS_SPHYNX)\n+            me->SetPower(POWER_MANA, me->GetMaxPower(POWER_MANA));\n+\n+        if (BotMgr::IsWanderingWorldBot(me))\n+            me->ResetPlayerDamageReq();\n+    }\n+\n+    if (botPet)\n+        botPet->GetBotPetAI()->SetShouldUpdateStats();\n+}\n+\n+//Emotion-based action\n+void bot_ai::ReceiveEmote(Player* player, uint32 emote)\n+{\n+    switch (emote)\n+    {\n+        case TEXT_EMOTE_BONK:\n+            _listAuras(player, me);\n+            break;\n+        case TEXT_EMOTE_SALUTE:\n+            _listAuras(player, player);\n+            break;\n+        case TEXT_EMOTE_STAND:\n+            if (master != player)\n+            {\n+                me->HandleEmoteCommand(EMOTE_ONESHOT_RUDE);\n+                break;\n+            }\n+            SetBotCommandState(BOT_COMMAND_STAY);\n+            //BotWhisper(\"Standing Still.\", player);\n+            break;\n+        case TEXT_EMOTE_WAVE:\n+            if (master != player)\n+            {\n+                me->HandleEmoteCommand(EMOTE_ONESHOT_RUDE);\n+                break;\n+            }\n+            if (me->IsNonMeleeSpellCast(true))\n+                me->InterruptNonMeleeSpells(true);\n+            SetBotCommandState(BOT_COMMAND_FOLLOW, true);\n+            //BotWhisper(\"Following!\", player);\n+            break;\n+        case TEXT_EMOTE_TICKLE:\n+        {\n+            if (!player->IsGameMaster())\n+                break;\n+\n+            std::ostringstream report;\n+            report << \"Bot \" << me->GetName() << \" (\" << me->GetEntry() << \"), \"\n+                << \"owner: \" << _botData->owner << \", master guid: \" << master->GetGUID().ToString() << \", \"\n+                << \"command states: \" << _botCommandState << \", await states: \" << uint32(_botAwaitState);\n+\n+            report << \"\\nunit flags:\";\n+            for (UnitFlags uf : EnumUtils::Iterate<UnitFlags>())\n+                if (me->HasUnitFlag(uf))\n+                    report << \"\\n  \" << EnumUtils::ToString(uf).Title;\n+            report << \"\\nunit states:\";\n+            uint32 counter = 1;\n+            for (uint32 st = UNIT_STATE_DIED; st <= UNIT_STATE_FOLLOW_FORMATION_MOVE; st <<= 1u, ++counter)\n+                if (me->HasUnitState(st))\n+                    report << \"\\n  UNIT_STATE_\" << counter << \" (\" << st << \")\";\n+            report << \"\\nmovement flags:\";\n+            counter = 1;\n+            for (uint32 st = MOVEMENTFLAG_FORWARD; st <= MOVEMENTFLAG_HOVER; st <<= 1u, ++counter)\n+                if (me->HasUnitState(st))\n+                    report << \"\\n  MOVEMENTFLAG_\" << counter << \" (\" << st << \")\";\n+\n+            report << \"\\nProblems:\";\n+\n+            if (!me->IsNPCBot())\n+            {\n+                CreatureTemplate* ct = const_cast<CreatureTemplate*>(me->GetCreatureTemplate());\n+                report << \"\\n  npcbot flags missing (current: \" << ct->flags_extra << \", missing: \" << (CREATURE_FLAG_EXTRA_NPCBOT & ~ct->flags_extra) << \")! Forcing flags...\";\n+                ct->flags_extra |= CREATURE_FLAG_EXTRA_NPCBOT;\n+            }\n+            if (_botData->owner)\n+            {\n+                if (HasBotCommandState(BOT_COMMAND_UNBIND))\n+                {\n+                    report << \"\\n  unbound, re-binding...\";\n+                    RemoveBotCommandState(BOT_COMMAND_UNBIND);\n+                }\n+                bool invalid_master = false;\n+                if (master->GetGUID() == me->GetGUID())\n+                {\n+                    report << \"\\n  master->GetGUID() == me->GetGUID()\";\n+                    invalid_master = true;\n+                }\n+                if (master->GetGUID() == me->GetGUID())\n+                {\n+                    report << \"\\n  _botData->owner != master->GetGUID().GetRawValue()\";\n+                    invalid_master = true;\n+                }\n+                if (invalid_master)\n+                {\n+                    if (Player* real_owner = ObjectAccessor::FindPlayerByLowGUID(_botData->owner))\n+                    {\n+                        report << \"\\n  owner is in world by bot isn't owned by it\";\n+                        if (!SetBotOwner(real_owner))\n+                            report << \"\\n    (failed to set owner to '\" << real_owner->GetName() << \"'!)\";\n+                    }\n+                    else\n+                    {\n+                        ObjectGuid owner_guid = ObjectGuid::Create<HighGuid::Player>(_botData->owner);\n+                        real_owner = ObjectAccessor::FindConnectedPlayer(owner_guid);\n+                        if (real_owner)\n+                            report << \"\\n  owner is found (connected) but not in world!\";\n+                        else if (sCharacterCache->HasCharacterCacheEntry(owner_guid))\n+                            report << \"\\n  owner is found (logged out) but not in world!\";\n+                        else\n+                            report << \"\\n  owner is not found!!!\";\n+                    }\n+                }\n+            }\n+            if (!_atHome)\n+            {\n+                report << \"\\n  _atHome == false\";\n+                _atHome = true;\n+            }\n+            if (_evadeMode)\n+            {\n+                report << \"\\n  _evadeMode == true\";\n+                _evadeMode = false;\n+            }\n+            if ((me->HasUnitFlag(UNIT_FLAG_STUNNED) || me->HasUnitState(UNIT_STATE_STUNNED)) &&\n+                !me->HasAuraType(SPELL_AURA_MOD_STUN))\n+            {\n+                report << \"\\n  stunned but no aura\";\n+                me->ClearUnitState(UNIT_STATE_STUNNED);\n+                me->RemoveUnitFlag(UNIT_FLAG_STUNNED);\n+            }\n+            if ((me->HasUnitFlag(UNIT_FLAG_CONFUSED) || me->HasUnitState(UNIT_STATE_CONFUSED)) &&\n+                !me->HasAuraType(SPELL_AURA_MOD_CONFUSE))\n+            {\n+                report << \"\\n  confused but no aura\";\n+                me->ClearUnitState(UNIT_STATE_CONFUSED);\n+                me->RemoveUnitFlag(UNIT_FLAG_CONFUSED);\n+            }\n+            if ((me->HasUnitFlag(UNIT_FLAG_FLEEING) || me->HasUnitState(UNIT_STATE_FLEEING)) &&\n+                !me->HasAuraType(SPELL_AURA_MOD_FEAR))\n+            {\n+                report << \"\\n  feared but no aura\";\n+                me->ClearUnitState(UNIT_STATE_FLEEING);\n+                me->RemoveUnitFlag(UNIT_FLAG_FLEEING);\n+            }\n+            if (me->IsInCombat() && !me->GetVictim())\n+            {\n+                report << \"\\n  in combat but no target: attackers=\" << uint32(me->getAttackers().size());\n+                me->CombatStop(true);\n+            }\n+            if (IsDuringTeleport() && me->IsInWorld() && me->FindMap())\n+            {\n+                report << \"\\n  being teleported but in world & in map: home=\" << uint32(!!teleHomeEvent) << \", finish=\" << uint32(!!teleFinishEvent);\n+                AbortTeleport();\n+            }\n+            if (HasBotCommandState(BOT_COMMAND_ISSUED_ORDER))\n+            {\n+                report << \"\\n  pending orders that may have got stuck\";\n+                CancelAllOrders();\n+            }\n+            if (HasBotCommandState(BOT_COMMAND_NOGOSSIP))\n+            {\n+                report << \"\\n  forgotten NOGOSSIP command state\";\n+                RemoveBotCommandState(BOT_COMMAND_NOGOSSIP);\n+            }\n+            if (waitTimer > 10000)\n+            {\n+                report << \"\\n  wait timer overflow: \" << waitTimer;\n+                waitTimer = 0;\n+            }\n+\n+            me->BotStopMovement();\n+            me->TextEmote(LocalizedNpcText(player, BOT_TEXT_BOT_TICKLED));\n+            ChatHandler(player->GetSession()).SendSysMessage(report.view());\n+            break;\n+        }\n+        default:\n+            break;\n+    }\n+}\n+\n+//ISINBOTPARTY\n+//Returns group members (and their npcbots too)\n+//For now all your puppets are in your group automatically\n+bool bot_ai::IsInBotParty(Unit const* unit) const\n+{\n+    if (!unit)\n+        return false;\n+    if (unit == master || unit == me || unit == botPet)\n+        return true;\n+\n+    if (IAmFree())\n+    {\n+        if (me->GetFaction() == FACTION_TEMPLATE_NEUTRAL_HOSTILE || unit->GetFaction() == FACTION_TEMPLATE_NEUTRAL_HOSTILE)\n+            return false;\n+\n+        if (me->HasByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_FFA_PVP) ||\n+            unit->HasByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_FFA_PVP))\n+            return false;\n+\n+        return\n+            (unit->IsPlayer() || unit->ToCreature()->IsPet() || unit->ToCreature()->IsNPCBotOrPet()) &&\n+            (unit->GetFaction() == me->GetFaction() || (me->GetBotGroup() && me->GetBotGroup()->IsMember(unit->GetGUID())) ||\n+            (me->GetReactionTo(unit) >= REP_FRIENDLY && unit->GetReactionTo(me) >= REP_FRIENDLY));\n+    }\n+\n+    //cheap check\n+    if (Group const* gr = master->GetGroup())\n+    {\n+        //group member case\n+        if (gr->IsMember(unit->GetGUID()))\n+            return true;\n+        //pointed target case\n+        for (auto i : NPCBots::index_array<uint8, TARGET_ICONS_COUNT>)\n+            if ((BotCfg::GetHealTargetIconFlags() & GroupIconsFlags[i]) &&\n+                !((BotCfg::GetOffTankTargetIconFlags() | BotCfg::GetDPSTargetIconFlags() | BotCfg::GetRangedDPSTargetIconFlags()) & GroupIconsFlags[i]))\n+                if (unit->GetGUID() == gr->GetTargetIcons()[i])\n+                    return true;\n+    }\n+\n+    //Player-controlled creature case\n+    if (Creature const* cre = unit->ToCreature())\n+    {\n+        ObjectGuid ownerGuid = !unit->GetOwnerGUID().IsEmpty() ? unit->GetOwnerGUID() : unit->GetCreator() ? unit->GetCreator()->GetGUID() : ObjectGuid::Empty;\n+        if (!ownerGuid && unit->IsVehicle())\n+            ownerGuid = unit->GetCharmerGUID();\n+        //controlled by master\n+        if (ownerGuid == master->GetGUID())\n+            return true;\n+        //npcbot/npcbot's pet case\n+        if (cre->GetBotOwner() == master)\n+            return true;\n+        if (!ownerGuid.IsEmpty() && master->GetBotMgr()->GetBot(ownerGuid))\n+            return true;\n+        //controlled by group member\n+        //pets, minions, guardians etc.\n+        //bot pets too\n+        if (!ownerGuid.IsEmpty())\n+            if (Group const* gr = master->GetGroup())\n+                if (gr->IsMember(ownerGuid))\n+                    return true;\n+    }\n+\n+    return false;\n+}\n+\n+bool bot_ai::IsInBotParty(ObjectGuid guid) const\n+{\n+    if (!guid) return false;\n+    if (guid == master->GetGUID() || guid == me->GetGUID()) return true;\n+    if (master->GetVehicle() && guid == master->GetCharmedGUID()) return true;\n+    if (me->GetVehicle() && guid == me->GetCharmedGUID()) return true;\n+\n+    if (IAmFree())\n+    {\n+        if (me->HasByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_FFA_PVP))\n+            return false;\n+\n+        return !(me->GetVictim() && me->GetVictim()->GetGUID() == guid);\n+    }\n+\n+    //cheap check\n+    if (Group const* gr = master->GetGroup())\n+    {\n+        //group member case\n+        if (gr->IsMember(guid))\n+            return true;\n+        //pointed target case\n+        for (auto i : NPCBots::index_array<uint8, TARGET_ICONS_COUNT>)\n+            if ((BotCfg::GetHealTargetIconFlags() & GroupIconsFlags[i]) &&\n+                !((BotCfg::GetOffTankTargetIconFlags() | BotCfg::GetDPSTargetIconFlags()) & GroupIconsFlags[i]))\n+                if (guid == gr->GetTargetIcons()[i])\n+                    return true;\n+\n+        for (GroupReference const* ref = gr->GetFirstMember(); ref != nullptr; ref = ref->next())\n+        {\n+            Player const* p = ref->GetSource();\n+            if (p && (p->GetPetGUID() == guid || (p->GetVehicle() && p->GetCharmedGUID() == guid)))\n+                return true;\n+            if (p && p->HaveBot())\n+            {\n+                if (Creature const* bot = p->GetBotMgr()->GetBot(guid))\n+                    if (bot->GetGUID() == guid || (bot->GetBotsPet() && bot->GetBotsPet()->GetGUID() == guid) ||\n+                        (bot->GetVehicle() && bot->GetCharmedGUID() == guid))\n+                        return true;\n+            }\n+        }\n+    }\n+    else\n+    {\n+        if (master->GetPetGUID() == guid || (master->GetVehicle() && master->GetCharmedGUID() == guid))\n+            return true;\n+        if (Creature const* bot = master->GetBotMgr()->GetBot(guid))\n+            if (bot->GetGUID() == guid || (bot->GetBotsPet() && bot->GetBotsPet()->GetGUID() == guid) ||\n+                (bot->GetVehicle() && bot->GetCharmedGUID() == guid))\n+                return true;\n+    }\n+\n+    return false;\n+}\n+\n+//REFRESHAURA\n+//Applies/removes/reapplies aura\n+void bot_ai::RefreshAura(uint32 spellId, int8 count, Unit* target) const\n+{\n+    if (count < 0 || count > 1)\n+    {\n+        BOT_LOG_ERROR(\"entities.player\", \"bot_ai::RefreshAura(): count is out of bounds ({}) for bot {} (botclass: {}, entry: {})\",\n+            int32(count), me->GetName(), uint32(_botclass), me->GetEntry());\n+        return;\n+    }\n+\n+    if (!spellId)\n+    {\n+        BOT_LOG_ERROR(\"entities.player\", \"bot_ai::RefreshAura(): spellId is 0 for bot {} (botclass: {}, entry: {})\",\n+            me->GetName(), uint32(_botclass), me->GetEntry());\n+        return;\n+    }\n+\n+    SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);\n+    if (!spellInfo)\n+    {\n+        BOT_LOG_ERROR(\"entities.player\", \"bot_ai::RefreshAura(): Invalid spellInfo for spell {}! Bot - {} (botclass: {}, entry: {})\",\n+            spellId, me->GetName(), uint32(_botclass), me->GetEntry());\n+        return;\n+    }\n+    spellInfo = spellInfo->TryGetSpellInfoOverride(me);\n+\n+    if (!target)\n+        target = me;\n+\n+    target->RemoveAurasDueToSpell(spellId);\n+\n+    //for (int8 i = 0; i < count; ++i)\n+    if (count)\n+        target->AddAura(spellInfo, MAX_EFFECT_MASK, target);\n+}\n+\n+bool bot_ai::CanBotAttack(Unit const* target, int8 byspell, bool secondary) const\n+{\n+    if (!target)\n+        return false;\n+    if (HasBotCommandState(BOT_COMMAND_FULLSTOP | BOT_COMMAND_INACTION))\n+        return false;\n+    if (target->HasUnitState(UNIT_STATE_EVADE | UNIT_STATE_IN_FLIGHT))\n+        return false;\n+    if (target->IsCombatDisallowed())\n+        return false;\n+    if (!target->IsVisible())\n+        return false;\n+    if (!target->isTargetableForAttack(false))\n+        return false;\n+    if (!target->InSamePhase(me) && !CanSeeEveryone())\n+        return false;\n+    if (byspell != -1 && target->IsTotem())\n+        return false;\n+    if (target->CanHaveThreatList() && GetEngageTimer() > lastdiff)\n+        return false;\n+    if (!BotCfg::IsPvPEnabled() && me->IsPvP() && target->IsControlledByPlayer())\n+        return false;\n+    if (me->GetFaction() == 35 && IAmFree() && target->IsCreature() && target->GetVictim() != me)\n+        return false;\n+    if ((target->GetFaction() == 35 || target->GetFaction() == me->GetFaction()) && me->GetFaction() != FACTION_TEMPLATE_NEUTRAL_HOSTILE)\n+        return false;\n+    if (!CanBotAttackOnVehicle())\n+        return false;\n+    if (IsPointedNoDPSTarget(target))\n+        return false;\n+\n+    if (IsWanderer() && target->IsCreature() && target->GetVictim() != me)\n+    {\n+        if (BotCfg::EnableWanderingUntargetNpcQuestgiver() && target->IsQuestGiver())\n+            return false;\n+        if (BotCfg::EnableWanderingUntargetNpcFlightmaster() && target->IsTaxi())\n+            return false;\n+        //do not attack friendly targets in FFAPvP mode\n+        if (me->IsFFAPvP() && me->GetFaction() == FACTION_TEMPLATE_NEUTRAL_HOSTILE)\n+        {\n+            uint32 base_faction = BotDataMgr::GetDefaultFactionForBotRaceClass(GetBotClass(), me->GetRace());\n+            if (me->GetFaction() != base_faction && Unit::GetFactionReactionTo(sFactionTemplateStore.LookupEntry(base_faction), target) >= REP_FRIENDLY)\n+                return false;\n+        }\n+    }\n+\n+    if (IAmFree())\n+    {\n+        switch (target->GetEntry())\n+        {\n+            case 33229: case 33243: case 33272: // AT Training dummy targets\n+            case 4952: case 17578: case 24792: case 30527: case 31143: case 31144: case 31146: // training dummy\n+            case 32541: case 32542: case 32543: case 32545: case 32546: case 32547: case 32666: case 32667: // training dummy\n+            case 7668: case 7669: case 7670: case 7671: // Blasted Lands servants\n+                return false;\n+            case 21416: case 21709: case 21710: case 21711: // Shadowmoon Valley Broken element corruptors\n+                if (target->HasAuraTypeWithMiscvalue(SPELL_AURA_SCHOOL_IMMUNITY, 127))\n+                    return false;\n+                break;\n+            default:\n+                break;\n+        }\n+    }\n+\n+    bool pulling = IsLastOrder(BOT_ORDER_PULL, 0, target->GetGUID());\n+    uint8 followdist = IAmFree() ? BotMgr::GetBotFollowDistMax() : master->GetBotMgr()->GetBotFollowDist();\n+    float foldist = _getAttackDistance(float(followdist));\n+    if (!IAmFree() && IsRanged() && me->IsWithinLOSInMap(target, LINEOFSIGHT_ALL_CHECKS, VMAP::ModelIgnoreFlags::M2))\n+        _extendAttackRange(foldist);\n+\n+    uint32 mainMask;\n+    if (!byspell)\n+        mainMask = SPELL_SCHOOL_MASK_NORMAL;\n+    else\n+    {\n+        switch (_botclass)\n+        {\n+            case BOT_CLASS_PRIEST:      mainMask = SPELL_SCHOOL_MASK_SHADOW;                                                                break;\n+            case BOT_CLASS_SHAMAN:      mainMask = IsMelee() ? SPELL_SCHOOL_MASK_NORMAL : (SPELL_SCHOOL_MASK_FIRE|SPELL_SCHOOL_MASK_NATURE);break;\n+            case BOT_CLASS_MAGE:        mainMask = Rand() > 50 ? SPELL_SCHOOL_MASK_FIRE : SPELL_SCHOOL_MASK_FROST;                          break;\n+            case BOT_CLASS_WARLOCK:     mainMask = Rand() > 50 ? SPELL_SCHOOL_MASK_SHADOW : SPELL_SCHOOL_MASK_FIRE;                         break;\n+            case BOT_CLASS_DRUID:       mainMask = Rand() > 50 ? SPELL_SCHOOL_MASK_ARCANE : SPELL_SCHOOL_MASK_NATURE;                       break;\n+            case BOT_CLASS_SPHYNX:      mainMask = SPELL_SCHOOL_MASK_NONE;                                                                  break;\n+            case BOT_CLASS_ARCHMAGE:    mainMask = SPELL_SCHOOL_MASK_NONE;                                                                  break;\n+            case BOT_CLASS_DREADLORD:   mainMask = SPELL_SCHOOL_MASK_NONE;                                                                  break;\n+            case BOT_CLASS_SPELLBREAKER:mainMask = SPELL_SCHOOL_MASK_NONE;                                                                  break;\n+            case BOT_CLASS_DARK_RANGER: mainMask = SPELL_SCHOOL_MASK_NONE;                                                                  break;\n+            case BOT_CLASS_NECROMANCER: mainMask = SPELL_SCHOOL_MASK_NONE;                                                                  break;\n+            case BOT_CLASS_SEA_WITCH:   mainMask = SPELL_SCHOOL_MASK_NONE;                                                                  break;\n+            default:                    mainMask = SPELL_SCHOOL_MASK_NORMAL;                                                                break;\n+        }\n+    }\n+\n+    if (master->IsInCombat() || target->IsInCombat() || IsWanderer() || (IAmFree() && me->GetFaction() == FACTION_TEMPLATE_NEUTRAL_HOSTILE) || pulling)\n+    {\n+        //if master is killed pursue to the end)\n+        if (!master->IsAlive() || target->IsControlledByPlayer() || pulling || (followdist > 0 && (master->GetDistance(target) <= foldist || HasBotCommandState(BOT_COMMAND_STAY))))\n+        {\n+            //if stationery check own distance\n+            if (!HasBotCommandState(BOT_COMMAND_STAY) || ((!IsRanged() && !secondary) ? me->IsWithinMeleeRange(target) : me->GetDistance(target) <= foldist))\n+            {\n+                if (byspell == -1 || !mainMask || !target->IsImmunedToDamage(SpellSchoolMask(mainMask)))\n+                {\n+                    if (me->IsValidAttackTarget(target))\n+                    {\n+                        if (!IsInBotParty(target))\n+                            return true;\n+\n+                        //some friends need to be attacked when charmed\n+                        switch (target->HasAuraType(SPELL_AURA_MOD_CHARM) ? target->GetAuraEffectsByType(SPELL_AURA_MOD_CHARM).front()->GetId() : 0)\n+                        {\n+                            case 17244:\n+                            case 17246: //Possess (Baroness Anastari, Stratholme, 17244 -> 17246)\n+                                return true;\n+                            default:\n+                                break;\n+                        }\n+                    }\n+                }\n+            }\n+        }\n+    }\n+\n+    return false;\n+}\n+bool bot_ai::CanBotAttackOnVehicle() const\n+{\n+    if (VehicleSeatEntry const* seat = me->GetVehicle() ? me->GetVehicle()->GetSeatForPassenger(me) : nullptr)\n+        return seat->Flags & VEHICLE_SEAT_FLAG_CAN_ATTACK;\n+\n+    return true;\n+}\n+//GETVEHICLETARGET\n+//Returns attack target or 'no target'\n+//All code above 'x = _getVehicleTarget() call must not dereference opponent since it can be invalid\n+Unit* bot_ai::_getVehicleTarget(BotVehicleStrats /*strat*/) const\n+{\n+    ASSERT(!IAmFree());\n+    Creature* veh = me->GetVehicleCreatureBase();\n+    Creature* masterVeh = master->GetVehicleCreatureBase();\n+    ASSERT(veh);\n+    Unit* mmover = masterVeh ? masterVeh->ToUnit() : master->ToUnit();\n+    ObjectGuid curTarget = veh->GetTarget();\n+\n+    Unit* mytar = !curTarget.IsEmpty() ? ObjectAccessor::GetUnit(*veh, curTarget) : nullptr;\n+\n+    if (mytar && veh->HasAuraType(SPELL_AURA_MOD_TAUNT))\n+        return mytar;\n+\n+    Group const* gr = !IAmFree() ? master->GetGroup() : nullptr;\n+\n+    if (gr && IsOffTank())\n+    {\n+        Unit* tankTar = nullptr;\n+        for (auto i : NPCBots::index_array_rev<uint8, TARGET_ICONS_COUNT>)\n+        {\n+            if (BotCfg::GetOffTankTargetIconFlags() & GroupIconsFlags[i])\n+            {\n+                if (ObjectGuid guid = gr->GetTargetIcons()[i]; !guid.IsEmpty())\n+                {\n+                    if (mytar && mytar->GetGUID() == guid && mytar->GetVictim() == veh)\n+                        return mytar;\n+\n+                    if (Unit* unit = ObjectAccessor::GetUnit(*veh, guid))\n+                    {\n+                        if (unit->IsVisible() && unit->isTargetableForAttack(false) && veh->IsValidAttackTarget(unit) &&\n+                            unit->IsInCombat() && (CanSeeEveryone() || (veh->CanSeeOrDetect(unit) && unit->InSamePhase(veh))))\n+                        {\n+                            Unit* tempTar = tankTar ? tankTar : unit;\n+                            tankTar = unit;\n+                            Unit* tVic = unit->GetVictim();\n+                            if (!tVic || (tVic != veh && tVic->GetVictim() == unit && IsTank(tVic) && IsInBotParty(tVic)))\n+                            {\n+                                tankTar = tempTar;\n+                                continue;\n+                            }\n+                        }\n+                    }\n+                }\n+            }\n+        }\n+        if (tankTar)\n+            return tankTar;\n+    }\n+    if (gr)\n+    {\n+        for (auto i : NPCBots::index_array_rev<uint8, TARGET_ICONS_COUNT>)\n+        {\n+            if (ObjectGuid guid = gr->GetTargetIcons()[i]; !guid.IsEmpty())\n+            {\n+                if ((HasRole(BOT_ROLE_RANGED)|| HasVehicleRoleOverride(BOT_ROLE_RANGED)) &&\n+                    (BotCfg::GetRangedDPSTargetIconFlags() & GroupIconsFlags[i]))\n+                {\n+                    if (mytar && mytar->GetGUID() == guid)\n+                        return mytar;\n+\n+                    if (Unit* unit = ObjectAccessor::GetUnit(*me, guid))\n+                    {\n+                        if (unit->IsVisible() && unit->isTargetableForAttack(false) && me->IsValidAttackTarget(unit) &&\n+                            unit->IsInCombat() && (CanSeeEveryone() || (me->CanSeeOrDetect(unit) && unit->InSamePhase(me))))\n+                        {\n+                            //BOT_LOG_ERROR(\"entities.unit\", \"_getTarget: found dps icon target {}\", unit->GetName());\n+                            return unit;\n+                        }\n+                    }\n+                }\n+                if (BotCfg::GetDPSTargetIconFlags() & GroupIconsFlags[i])\n+                {\n+                    if (mytar && mytar->GetGUID() == guid)\n+                        return mytar;\n+\n+                    if (Unit* unit = ObjectAccessor::GetUnit(*veh, guid))\n+                    {\n+                        if (unit->IsVisible() && unit->isTargetableForAttack(false) && veh->IsValidAttackTarget(unit) &&\n+                            unit->IsInCombat() && (CanSeeEveryone() || (veh->CanSeeOrDetect(unit) && unit->InSamePhase(veh))))\n+                            return unit;\n+                    }\n+                }\n+            }\n+        }\n+    }\n+\n+    float followdist = float (master->GetBotMgr()->GetBotFollowDist() * 2);\n+    if (float distOverride = GetVehicleAttackDistanceOverride())\n+        followdist = distOverride * 2.f;\n+    if (mytar && mytar->IsCreature() && mytar->ToCreature()->GetCreatureTemplate()->rank == CREATURE_ELITE_WORLDBOSS)\n+        followdist *= 1.5f;\n+    else if (mmover->isMoving() && veh->GetMapId() == 578) //oculus\n+        followdist *= 0.5f;\n+\n+    if (mytar && (veh->IsInCombat() || mytar->IsInCombat()) &&\n+        (!masterVeh || !mmover->IsAlive() || mmover->GetDistance(mytar) < followdist) && veh->IsValidAttackTarget(mytar))\n+        return mytar;\n+\n+    if (mmover->IsAlive())\n+    {\n+        if (followdist == 0 || (mytar &&\n+            (mmover->GetDistance(mytar) > followdist || (mmover->GetDistance(mytar) > followdist * 0.75f && !mytar->IsWithinLOSInMap(veh)))))\n+        {\n+            //if (mytar)\n+            //{\n+            //    BOT_LOG_ERROR(\"scripts\", \"_getVehicleTarget {}'s veh is too far from master - lost target ({} > {})\",\n+            //        me->GetName(), veh->GetDistance(mmover), followdist);\n+            //}\n+            return nullptr;\n+        }\n+    }\n+\n+    //check targets around\n+    float maxdist = InitAttackRange(followdist, IsRanged());\n+    Unit* t = nullptr;\n+    NearbyHostileVehicleTargetCheck check(veh, maxdist, this);\n+    Bcore::UnitSearcher <NearbyHostileVehicleTargetCheck> searcher(veh, t, check);\n+    Cell::VisitAllObjects(veh, searcher, maxdist);\n+    //veh->VisitNearbyObject(maxdist, searcher);\n+\n+    return t;\n+}\n+//GETTARGET\n+//Returns attack target or 'no target' and distant check target or 'no target'\n+//All code above 'x = _getTarget() call must not dereference opponent or disttarget since it can be invalid\n+std::tuple<Unit*, Unit*> bot_ai::_getTargets(bool byspell, bool ranged, bool &reset) const\n+{\n+    //if (_evadeMode) //IAmFree() case only\n+    //    return { nullptr, nullptr };\n+\n+    if (!CanBotAttackOnVehicle())\n+        return { nullptr, nullptr };\n+\n+    Unit* mytar = me->GetVictim();\n+\n+    //check if no need to change target\n+    //BOT_LOG_ERROR(\"entities.player\", \"bot_ai::getTarget(): bot: {}\", me->GetName());\n+\n+    if (mytar && me->HasAuraType(SPELL_AURA_MOD_TAUNT))\n+        return { mytar, mytar };\n+\n+    //Immediate targets\n+    //orders\n+    if (!IAmFree() && HasOrders() && HasRole(BOT_ROLE_DPS) && !me->IsInCombat() && me->getAttackers().empty())\n+    {\n+        if (_orders.front()._type == BOT_ORDER_PULL)\n+        {\n+            ObjectGuid orderTargetGuid = _orders.front().params.pullParams.targetGuid;\n+            if (Unit* orderTarget = mytar && mytar->GetGUID() == orderTargetGuid ? mytar : ObjectAccessor::GetUnit(*me, orderTargetGuid))\n+            {\n+                if (CanBotAttack(orderTarget))\n+                    return { orderTarget, nullptr };\n+            }\n+        }\n+    }\n+\n+    //check charmed master\n+    if (!IAmFree() && master->HasAuraType(SPELL_AURA_MOD_CHARM))\n+    {\n+        switch (master->GetAuraEffectsByType(SPELL_AURA_MOD_CHARM).front()->GetId())\n+        {\n+            case 17244:\n+            case 17246: //Possess (Baroness Anastari, Stratholme, 17244 -> 17246)\n+                return { master, master };\n+            default:\n+                break;\n+        }\n+    }\n+\n+    //maps\n+    if (!IAmFree() && me->GetMap()->GetEntry() && !me->GetMap()->GetEntry()->IsWorldMap())\n+    {\n+        static const std::array WMOAreaGroupLashlayer = { 29476u }; // Halls of Strife\n+        static const std::array WMOAreaGroupMarrowgar = { 47833u }; // The Spire\n+        static const std::array WMOAreaGroupSindragosa = { 48066u }; // Frost Queen's Lair\n+        static const std::array WMOAreaGroupLichKing = { 50038u, 50040u }; // The Frozen Throne\n+\n+        static auto isInWMOArea = [this](auto const& ids) {\n+            for (auto wmoId : ids) {\n+                if (wmoId == _lastWMOAreaId)\n+                    return true;\n+            }\n+            return false;\n+        };\n+\n+        // Blackwing Lair\n+        if (me->GetMapId() == 469 && GetBotClass() == BOT_CLASS_ROGUE && !HasRole(BOT_ROLE_DPS) && me->HasStealthAura() && isInWMOArea(WMOAreaGroupLashlayer)) // BWL - Bloodlord Lashlayer\n+            return { nullptr, nullptr };\n+\n+        // Icecrown Citadel - Lord Marrowgar\n+        if (me->GetMapId() == 631 && isInWMOArea(WMOAreaGroupMarrowgar) && me->IsInCombat() && HasRole(BOT_ROLE_DPS) && !IsTank())\n+        {\n+            static const std::array BoneSpikeIds = { CREATURE_ICC_BONE_SPIKE1, CREATURE_ICC_BONE_SPIKE2, CREATURE_ICC_BONE_SPIKE3 };\n+\n+            auto boneSpikeCheck = [this, mydist = 50.f](Unit const* unit) mutable {\n+                if (!unit->IsAlive())\n+                    return false;\n+                for (uint32 bsId : BoneSpikeIds) {\n+                    if (unit->GetEntry() == bsId)  {\n+                        if (HasRole(BOT_ROLE_RANGED))\n+                            return true;\n+                        float dist = me->GetDistance2d(unit);\n+                        if (dist < mydist) {\n+                            mydist = dist;\n+                            return true;\n+                        }\n+                    }\n+                }\n+                return false;\n+            };\n+\n+            std::list<Creature*> cList;\n+            Bcore::CreatureListSearcher searcher(me, cList, boneSpikeCheck);\n+            Cell::VisitAllObjects(me, searcher, 50.f);\n+\n+            if (Creature* spike = cList.empty() ? nullptr : cList.size() == 1 ? cList.front() :\n+                Bcore::Containers::SelectRandomContainerElement(cList))\n+            {\n+                // Bone Spike is always attackable - no additional checks needed\n+                return { spike, nullptr };\n+            }\n+        }\n+\n+        // Icecrown Citadel - Sindragosa\n+        if (me->GetMapId() == 631 && isInWMOArea(WMOAreaGroupSindragosa)/* &&\n+            (!mytar || (mytar->GetEntry() != CREATURE_ICC_ICE_TOMB1 && mytar->GetEntry() != CREATURE_ICC_ICE_TOMB2 &&\n+            mytar->GetEntry() != CREATURE_ICC_ICE_TOMB3 && mytar->GetEntry() != CREATURE_ICC_ICE_TOMB4))*/)\n+        {\n+            static const std::array IceTombIds = { CREATURE_ICC_ICE_TOMB1, CREATURE_ICC_ICE_TOMB2, CREATURE_ICC_ICE_TOMB3, CREATURE_ICC_ICE_TOMB4 };\n+            static const std::array SindragosaIds = { CREATURE_ICC_SINDRAGOSA1, CREATURE_ICC_SINDRAGOSA2, CREATURE_ICC_SINDRAGOSA3, CREATURE_ICC_SINDRAGOSA4 };\n+\n+            static auto SiItCheck = [=](Unit const* unit) {\n+                if (unit->IsAlive())\n+                {\n+                    for (uint32 itId : IceTombIds)\n+                        if (unit->GetEntry() == itId)\n+                            return true;\n+                    for (uint32 siId : SindragosaIds)\n+                        if (unit->GetEntry() == siId)\n+                            return true;\n+                }\n+                return false;\n+            };\n+\n+            std::list<Creature*> cList;\n+            Bcore::CreatureListSearcher searcher(master, cList, SiItCheck);\n+            Cell::VisitAllObjects(me, searcher, 200.f);\n+\n+            if (!cList.empty())\n+            {\n+                Creature* sindragosa = nullptr;\n+                Creature* icetomb = nullptr;\n+                for (Creature* siit : cList)\n+                {\n+                    if (!icetomb)\n+                    {\n+                        for (uint32 itId : IceTombIds)\n+                        {\n+                            if (siit->GetEntry() == itId)\n+                            {\n+                                icetomb = siit;\n+                                break;\n+                            }\n+                        }\n+                    }\n+                    if (!sindragosa)\n+                    {\n+                        for (uint32 siId : SindragosaIds)\n+                        {\n+                            if (siit->GetEntry() == siId)\n+                            {\n+                                sindragosa = siit;\n+                                break;\n+                            }\n+                        }\n+                    }\n+                    else\n+                        break;\n+                }\n+\n+                if (icetomb)\n+                {\n+                    bool air_phase = sindragosa && sindragosa->GetReactState() == REACT_PASSIVE;\n+                    uint8 pct = GetHealthPCT(icetomb);\n+                    if (!air_phase || pct > 50)\n+                    {\n+                        if (air_phase || !IsTank())\n+                            return { icetomb, nullptr };\n+                    }\n+                    else if (mytar == icetomb || !master->GetVictim())\n+                    {\n+                        if (IsCasting())\n+                            me->InterruptNonMeleeSpells(false);\n+                        if (botPet && botPet->GetVictim())\n+                            botPet->AttackStop();\n+                        return { nullptr, nullptr };\n+                    }\n+                }\n+            }\n+        }\n+\n+        // Icecrown Citadel - The Lich King\n+        if (me->GetMapId() == 631 && isInWMOArea(WMOAreaGroupLichKing) && me->IsInCombat() && HasRole(BOT_ROLE_DPS) && HasRole(BOT_ROLE_RANGED) && !IsTank())\n+        {\n+            static const std::array IceSphereIds = { CREATURE_ICC_ICE_SPHERE1, CREATURE_ICC_ICE_SPHERE2, CREATURE_ICC_ICE_SPHERE3, CREATURE_ICC_ICE_SPHERE4 };\n+            static const std::array ValkyrShadowguardIds = { CREATURE_ICC_VALKYR_LK1, CREATURE_ICC_VALKYR_LK2, CREATURE_ICC_VALKYR_LK3, CREATURE_ICC_VALKYR_LK4 };\n+\n+            static auto valkyrCheck = [=](Unit const* unit) {\n+                for (uint32 vsId : ValkyrShadowguardIds) {\n+                    if (unit->IsAlive() && unit->GetEntry() == vsId && !unit->HasUnitFlag(UNIT_FLAG_UNINTERACTIBLE))\n+                        return true;\n+                }\n+                return false;\n+            };\n+\n+            Creature* valkyr = nullptr;\n+            Bcore::CreatureSearcher searcher(me, valkyr, valkyrCheck);\n+            Cell::VisitAllObjects(me, searcher, 50.f);\n+\n+            if (valkyr)\n+                return { valkyr, nullptr };\n+\n+            Unit const* usearcher = master->IsAlive() ? master->ToUnit() : me->ToUnit();\n+            auto iceSphereCheck = [this, usearcher = usearcher, mydist = 30.f](Unit const* unit) mutable {\n+                for (uint32 isId : IceSphereIds) {\n+                    if (unit->IsAlive() && unit->GetEntry() == isId) {\n+                        float dist = usearcher->GetDistance2d(unit);\n+                        if (dist < mydist && (HasRole(BOT_ROLE_RANGED) || dist < 7.f)) {\n+                            mydist = dist;\n+                            return true;\n+                        }\n+                    }\n+                }\n+                return false;\n+            };\n+\n+            Creature* sphere = nullptr;\n+            Bcore::CreatureLastSearcher searcher2(usearcher, sphere, iceSphereCheck);\n+            Cell::VisitAllObjects(usearcher, searcher2, 30.f);\n+\n+            if (sphere)\n+                return { sphere, nullptr };\n+        }\n+    }\n+\n+    Group const* gr = !IAmFree() ? master->GetGroup() : nullptr;\n+\n+    if (gr && IsOffTank())\n+    {\n+        if (_primaryIconTank >= 0 && BotCfg::GetOffTankTargetIconFlags() & (1u << _primaryIconTank))\n+        {\n+            if (ObjectGuid guid = gr->GetTargetIcons()[_primaryIconTank]; !guid.IsEmpty())\n+            {\n+                if (mytar && mytar->GetGUID() == guid)\n+                    return { mytar, mytar };\n+\n+                if (Unit* unit = ObjectAccessor::GetUnit(*me, guid))\n+                {\n+                    if (unit->IsVisible() && unit->isTargetableForAttack(false) && me->IsValidAttackTarget(unit) &&\n+                        (unit->IsInCombat() || me->IsInCombat() || master->IsInCombat()) && (CanSeeEveryone() || (me->CanSeeOrDetect(unit) && unit->InSamePhase(me))))\n+                    {\n+                        return { unit, unit };\n+                    }\n+                }\n+            }\n+        }\n+\n+        Unit* tankTar = nullptr;\n+        for (auto i : NPCBots::index_array_rev<uint8, TARGET_ICONS_COUNT>)\n+        {\n+            if (i == _primaryIconTank)\n+                continue;\n+\n+            if (BotCfg::GetOffTankTargetIconFlags() & GroupIconsFlags[i])\n+            {\n+                if (ObjectGuid guid = gr->GetTargetIcons()[i]; !guid.IsEmpty())\n+                {\n+                    if (mytar && mytar->GetGUID() == guid && mytar->GetVictim() == me)\n+                    {\n+                        //BOT_LOG_ERROR(\"entities.unit\", \"_getTarget: {} continues {}\", me->GetName(), mytar->GetName());\n+                        return { mytar, mytar };\n+                    }\n+\n+                    if (Unit* unit = ObjectAccessor::GetUnit(*me, guid))\n+                    {\n+                        if (unit->IsVisible() && unit->isTargetableForAttack(false) && me->IsValidAttackTarget(unit) &&\n+                            unit->IsInCombat() && (CanSeeEveryone() || (me->CanSeeOrDetect(unit) && unit->InSamePhase(me))))\n+                        {\n+                            //BOT_LOG_ERROR(\"entities.unit\", \"_getTarget: {} found new offtanking icon target {}\", me->GetName(), unit->GetName());\n+                            Unit* tempTar = tankTar ? tankTar : unit;\n+                            tankTar = unit;\n+                            Unit* tVic = unit->GetVictim();\n+                            if (!tVic || (tVic != me && tVic->GetVictim() == unit && IsTank(tVic) && IsInBotParty(tVic)))\n+                            {\n+                                //BOT_LOG_ERROR(\"entities.unit\", \"_getTarget: {} skipped {} ({})\", me->GetName(), unit->GetName(), tVic->GetName());\n+                                tankTar = tempTar;\n+                                continue;\n+                            }\n+                        }\n+                    }\n+                }\n+            }\n+        }\n+        if (tankTar)\n+        {\n+            //BOT_LOG_ERROR(\"entities.unit\", \"_getTarget: {} returning {}\", me->GetName(), tankTar->GetName());\n+            return { tankTar, tankTar };\n+        }\n+    }\n+    if (gr && IsTank())\n+    {\n+        if (_primaryIconTank >= 0 && BotCfg::GetTankTargetIconFlags() & (1u << _primaryIconTank))\n+        {\n+            if (ObjectGuid guid = gr->GetTargetIcons()[_primaryIconTank]; !guid.IsEmpty())\n+            {\n+                if (mytar && mytar->GetGUID() == guid)\n+                    return { mytar, mytar };\n+\n+                if (Unit* unit = ObjectAccessor::GetUnit(*me, guid))\n+                {\n+                    if (unit->IsVisible() && unit->isTargetableForAttack(false) && me->IsValidAttackTarget(unit) &&\n+                        (unit->IsInCombat() || me->IsInCombat() || master->IsInCombat()) && (CanSeeEveryone() || (me->CanSeeOrDetect(unit) && unit->InSamePhase(me))))\n+                    {\n+                        return { unit, unit };\n+                    }\n+                }\n+            }\n+        }\n+\n+        Unit* tankTar = nullptr;\n+        for (auto i : NPCBots::index_array_rev<uint8, TARGET_ICONS_COUNT>)\n+        {\n+            if (i == _primaryIconTank)\n+                continue;\n+\n+            if (BotCfg::GetTankTargetIconFlags() & GroupIconsFlags[i])\n+            {\n+                if (ObjectGuid guid = gr->GetTargetIcons()[i]; !guid.IsEmpty())\n+                {\n+                    if (mytar && mytar->GetGUID() == guid && mytar->GetVictim() == me)\n+                    {\n+                        //BOT_LOG_ERROR(\"entities.unit\", \"_getTarget: {} continues {}\", me->GetName(), mytar->GetName());\n+                        return { mytar, mytar };\n+                    }\n+\n+                    if (Unit* unit = ObjectAccessor::GetUnit(*me, guid))\n+                    {\n+                        if (unit->IsVisible() && unit->isTargetableForAttack(false) && me->IsValidAttackTarget(unit) &&\n+                            unit->IsInCombat() && (CanSeeEveryone() || (me->CanSeeOrDetect(unit) && unit->InSamePhase(me))))\n+                        {\n+                            //BOT_LOG_ERROR(\"entities.unit\", \"_getTarget: {} found new mtanking icon target {}\", me->GetName(), unit->GetName());\n+                            Unit* tempTar = tankTar ? tankTar : unit;\n+                            tankTar = unit;\n+                            Unit* tVic = unit->GetVictim();\n+                            if (!tVic || (tVic != me && tVic->GetVictim() == unit && IsTank(tVic) && IsInBotParty(tVic)))\n+                            {\n+                                //BOT_LOG_ERROR(\"entities.unit\", \"_getTarget: {} skipped {} ({})\", me->GetName(), unit->GetName(), tVic->GetName());\n+                                tankTar = tempTar;\n+                                continue;\n+                            }\n+                        }\n+                    }\n+                }\n+            }\n+        }\n+        if (tankTar)\n+        {\n+            //BOT_LOG_ERROR(\"entities.unit\", \"_getTarget: {} returning {}\", me->GetName(), tankTar->GetName());\n+            return { tankTar, tankTar };\n+        }\n+    }\n+    if (gr)\n+    {\n+        if (_primaryIconDamage >= 0)\n+        {\n+            uint32 iconMask = BotCfg::GetDPSTargetIconFlags();\n+            if (HasRole(BOT_ROLE_RANGED))\n+                iconMask |= BotCfg::GetRangedDPSTargetIconFlags();\n+            if (iconMask & (1u << _primaryIconDamage))\n+            {\n+                if (ObjectGuid guid = gr->GetTargetIcons()[_primaryIconDamage]; !guid.IsEmpty())\n+                {\n+                    if (mytar && mytar->GetGUID() == guid)\n+                        return { mytar, mytar };\n+\n+                    if (Unit* unit = ObjectAccessor::GetUnit(*me, guid))\n+                    {\n+                        if (unit->IsVisible() && unit->isTargetableForAttack(false) && me->IsValidAttackTarget(unit) &&\n+                            (unit->IsInCombat() || me->IsInCombat() || master->IsInCombat()) && (CanSeeEveryone() || (me->CanSeeOrDetect(unit) && unit->InSamePhase(me))))\n+                        {\n+                            return { unit, unit };\n+                        }\n+                    }\n+                }\n+            }\n+        }\n+\n+        for (auto i : NPCBots::index_array_rev<uint8, TARGET_ICONS_COUNT>)\n+        {\n+            if (i == _primaryIconDamage)\n+                continue;\n+\n+            if (ObjectGuid guid = gr->GetTargetIcons()[i]; !guid.IsEmpty())\n+            {\n+                if (HasRole(BOT_ROLE_RANGED) && (BotCfg::GetRangedDPSTargetIconFlags() & GroupIconsFlags[i]))\n+                {\n+                    if (mytar && mytar->GetGUID() == guid)\n+                        return { mytar, mytar };\n+\n+                    if (Unit* unit = ObjectAccessor::GetUnit(*me, guid))\n+                    {\n+                        if (unit->IsVisible() && unit->isTargetableForAttack(false) && me->IsValidAttackTarget(unit) &&\n+                            unit->IsInCombat() && (CanSeeEveryone() || (me->CanSeeOrDetect(unit) && unit->InSamePhase(me))))\n+                        {\n+                            //BOT_LOG_ERROR(\"entities.unit\", \"_getTarget: found rdps icon target {}\", unit->GetName());\n+                            return { unit, unit };\n+                        }\n+                    }\n+                }\n+                if (BotCfg::GetDPSTargetIconFlags() & GroupIconsFlags[i])\n+                {\n+                    if (mytar && mytar->GetGUID() == guid)\n+                        return { mytar, mytar };\n+\n+                    if (Unit* unit = ObjectAccessor::GetUnit(*me, guid))\n+                    {\n+                        if (unit->IsVisible() && unit->isTargetableForAttack(false) && me->IsValidAttackTarget(unit) &&\n+                            unit->IsInCombat() && (CanSeeEveryone() || (me->CanSeeOrDetect(unit) && unit->InSamePhase(me))))\n+                        {\n+                            //BOT_LOG_ERROR(\"entities.unit\", \"_getTarget: found dps icon target {}\", unit->GetName());\n+                            return { unit, unit };\n+                        }\n+                    }\n+                }\n+            }\n+        }\n+    }\n+\n+    Unit* u = master->GetVictim();\n+//Disabled due to a bug:\n+//when spell cast is finished target is immideately put in combat which makes bots attack immediately\n+//caster must be put in combat at spell launch\n+//but target must be put in combat at spell hit\n+/*\n+    if (!u && !IAmFree() && master->IsInCombat() && Rand() < 15)\n+    {\n+        for (uint8 i = CURRENT_FIRST_NON_MELEE_SPELL; i != CURRENT_MAX_SPELL; ++i)\n+        {\n+            if (Spell const* spell = master->GetCurrentSpell(CurrentSpellTypes(i)))\n+            {\n+                //if (spell->getState() == SPELL_STATE_FINISHED)\n+                //    continue;\n+\n+                if (mytar && spell->m_targets.GetUnitTargetGUID() == mytar->GetGUID())\n+                {\n+                    u = mytar;\n+                    break;\n+                }\n+\n+                //direct damaging spells\n+                if (!spell->GetSpellInfo()->IsPositive() &&\n+                    (spell->GetSpellInfo()->HasEffect(SPELL_EFFECT_WEAPON_DAMAGE) ||\n+                    spell->GetSpellInfo()->HasEffect(SPELL_EFFECT_SCHOOL_DAMAGE) ||\n+                    spell->GetSpellInfo()->HasEffect(SPELL_EFFECT_WEAPON_DAMAGE_NOSCHOOL)))\n+                {\n+                    Unit* victim = ObjectAccessor::GetUnit(*me, spell->m_targets.GetUnitTargetGUID());\n+                    if (victim && victim->IsInCombat())\n+                    {\n+                        u = victim;\n+                        break;\n+                    }\n+                }\n+            }\n+        }\n+    }\n+*/\n+    if (u && u == mytar && !IAmFree() && u->IsPlayer() && CanBotAttack(u, byspell))\n+    {\n+        //BOT_LOG_ERROR(\"entities.player\", \"bot {} continues attack common target {}\", me->GetName(), u->GetName());\n+        return { u, u };//forced\n+    }\n+    //Follow if...\n+    uint8 followdist = IAmFree() ? BotMgr::GetBotFollowDistMax() / 2 : master->GetBotMgr()->GetBotFollowDist();\n+    if (IsWanderer() && me->GetMap()->GetEntry()->IsBattlegroundOrArena())\n+        followdist += 30;\n+    float foldist = _getAttackDistance(float(followdist));\n+    if (!IAmFree() && IsRanged())\n+    {\n+        _extendAttackRange(foldist);\n+        //BOT_LOG_ERROR(\"entities.player\", \"bot {} ranged foldist {} spelldist {}\", me->GetName(), foldist, spelldist);\n+    }\n+    bool dropTarget = followdist == 0 && master->IsAlive();\n+    if (!dropTarget && (!u || IAmFree()) && master->IsAlive() && mytar && mytar == opponent)\n+    {\n+        dropTarget = !me->CanSeeOrDetect(mytar) || (IAmFree() ?\n+            me->GetDistance(mytar) > (IsWanderer() ? float(followdist + 10) : foldist) :\n+            HasBotCommandState(BOT_COMMAND_STAY) ?\n+            (!IsRanged() ? !me->IsWithinMeleeRange(mytar) : me->GetDistance(mytar) > foldist) :\n+            (master->GetDistance(mytar) > foldist || (master->GetDistance(mytar) > foldist * 0.75f && !mytar->IsWithinLOSInMap(me, LINEOFSIGHT_ALL_CHECKS, VMAP::ModelIgnoreFlags::M2))));\n+    }\n+    if (dropTarget)\n+    {\n+        //BOT_LOG_ERROR(\"entities.player\", \"bot {} cannot attack target {}, too far away or not in LoS\", me->GetName(), mytar ? mytar->GetName() : \"unk\");\n+        mytar = nullptr;\n+    }\n+\n+    if (u && !IAmFree() && (master->IsInCombat() || u->IsInCombat())/* && !InDuel(u)*/ && !IsInBotParty(u) && (BotCfg::IsPvPEnabled() || !u->IsControlledByPlayer()) &&\n+        (!HasBotCommandState(BOT_COMMAND_STAY) || (!IsRanged() ? me->IsWithinMeleeRange(u) : me->GetDistance(u) < foldist)))\n+    {\n+        //BOT_LOG_ERROR(\"entities.player\", \"bot {} starts attack master's target {}\", me->GetName(), u->GetName());\n+        return { u, u };\n+    }\n+\n+    bool canAttack = mytar && CanBotAttack(mytar, byspell);\n+    if (canAttack && (!IAmFree() || me->GetDistance(mytar) < float(BOT_MAX_CHASE_RANGE)) &&/* !InDuel(mytar) &&*/\n+        !(mytar->GetVictim() != nullptr && IsTank() && IsTank(mytar->GetVictim())))\n+    {\n+        //BOT_LOG_ERROR(\"entities.player\", \"bot {} continues attack its target {}\", me->GetName(), mytar->GetName());\n+        if (me->GetDistance(mytar) > (ranged ? 20.f : 5.f) && !HasBotCommandState(BOT_COMMAND_MASK_UNCHASE))\n+            reset = true;\n+        return { mytar, mytar };\n+    }\n+\n+    //check group\n+    if (!IAmFree())\n+    {\n+        if (!gr)\n+        {\n+            for (auto const& [_, bot] : *master->GetBotMgr()->GetBotMap())\n+            {\n+                if (!bot || bot == me || !bot->InSamePhase(me)) continue;\n+                if (IsTank() && IsTank(bot)) continue;\n+                u = bot->GetVictim();\n+                if (u && (bot->IsInCombat() || u->IsInCombat()) && CanBotAttack(u, byspell))\n+                {\n+                    //BOT_LOG_ERROR(\"entities.player\", \"bot {} hooked {}'s victim {}\", me->GetName(), bot->GetName(), u->GetName());\n+                    return { u, u };\n+                }\n+            }\n+        }\n+        else\n+        {\n+            for (GroupReference const* ref = gr->GetFirstMember(); ref != nullptr; ref = ref->next())\n+            {\n+                Player const* pl = ref->GetSource();\n+                if (!pl || !pl->IsInWorld() || pl->IsBeingTeleported()) continue;\n+                if (me->GetMap() != pl->FindMap() || !pl->InSamePhase(me)) continue;\n+                if (IsTank() && IsTank(pl)) continue;\n+                u = pl->GetVictim();\n+                if (u && pl != master && (pl->IsInCombat() || u->IsInCombat()) && CanBotAttack(u, byspell))\n+                {\n+                    //BOT_LOG_ERROR(\"entities.player\", \"bot {} hooked {}'s victim {}\", me->GetName(), pl->GetName(), u->GetName());\n+                    return { u, u };\n+                }\n+                if (!pl->HaveBot()) continue;\n+                for (auto const& [_, bot] : *pl->GetBotMgr()->GetBotMap())\n+                {\n+                    if (!bot || bot == me || !bot->InSamePhase(me)) continue;\n+                    if (!bot->IsInWorld()) continue;\n+                    if (me->GetMap() != bot->FindMap()) continue;\n+                    if (IsTank() && IsTank(bot)) continue;\n+                    u = bot->GetVictim();\n+                    if (u && (bot->IsInCombat() || u->IsInCombat()) && CanBotAttack(u, byspell))\n+                    {\n+                        //BOT_LOG_ERROR(\"entities.player\", \"bot {} hooked {}'s victim {}\", me->GetName(), bot->GetName(), u->GetName());\n+                        return { u, u };\n+                    }\n+                }\n+            }\n+        }\n+    }\n+    else if (!canAttack)\n+    {\n+        //check attackers\n+        u = nullptr;\n+        for (Unit* att : me->getAttackers())\n+            if (_canSwitchToTarget(u, att, byspell))\n+                u = att;\n+        if (!u && botPet)\n+            for (Unit* att : botPet->getAttackers())\n+                if (_canSwitchToTarget(u, att, byspell))\n+                    u = att;\n+        if (u)\n+            return { u, u };\n+    }\n+\n+    if (IAmFree() && IsWanderer() && !me->IsInCombat() && me->getAttackers().empty() && (evadeDelayTimer > 7500 || Feasting() || me->GetHealthPct() < 85.f))\n+        return { nullptr, nullptr };\n+\n+    //check targets around\n+    float maxdist = InitAttackRange(float(followdist + 10), ranged);\n+    std::array<std::pair<Unit*, float>, 2u> ts{};\n+    std::list<Unit*> unitList;\n+    NearestHostileUnitCheck check(me, maxdist, byspell, this);\n+    Bcore::UnitListSearcher searcher(master->ToUnit(), unitList, check);\n+    Cell::VisitAllObjects(HasBotCommandState(BOT_COMMAND_STAY) ? me->ToUnit() : master->ToUnit(), searcher, maxdist);\n+\n+    if (IAmFree())\n+    {\n+        decltype(unitList) closeList;\n+        if (IsWanderer())\n+        {\n+            //Try to prioritize flag carrier\n+            if (me->GetMap()->IsBattlegroundOrArena())\n+            {\n+                std::ranges::copy_if(unitList, std::back_inserter(closeList), [=, this](Unit const* fc) {\n+                    return IsFlagCarrier(fc) && CanBotAttack(fc, byspell);\n+                });\n+            }\n+\n+            std::erase_if(unitList, [this](Unit const* unit) {\n+                if (!unit->IsInCombatWith(me) && !(unit->IsNPCBot() && unit->ToCreature()->IsWandererBot()))\n+                {\n+                    if (unit->IsPlayer())\n+                    {\n+                        if (me->GetLevel() + 12 < unit->GetLevel())\n+                            return true;\n+                        if (unit->GetLevel() + 9 < me->GetLevel())\n+                            return true;\n+                    }\n+                    else\n+                    {\n+                        if (me->GetLevel() + (unit->ToCreature()->isElite() ? 3 : 6) < unit->GetLevel())\n+                            return true;\n+                        if (unit->GetLevel() + (unit->ToCreature()->isElite() ? 8 : 4) < me->GetLevel())\n+                            return true;\n+                        if (unit->IsCritter())\n+                            return true;\n+                    }\n+                }\n+                return false;\n+            });\n+        }\n+\n+        for (decltype(unitList)::iterator it = unitList.begin(); it != unitList.end();)\n+        {\n+            if (!CanBotAttack(*it, byspell))\n+                it = unitList.erase(it);\n+            else if (me->GetDistance(*it) < 15.f)\n+            {\n+                closeList.push_back(*it);\n+                it = unitList.erase(it);\n+            }\n+            else\n+                ++it;\n+        }\n+\n+        if (!closeList.empty())\n+        {\n+            ts[0].first = closeList.size() == 1 ? closeList.front() : Bcore::Containers::SelectRandomContainerElement(closeList);\n+            ts[0].second = me->GetDistance(ts[0].first);\n+        }\n+        else if (!unitList.empty())\n+        {\n+            ts[0].first = unitList.size() == 1 ? unitList.front() : Bcore::Containers::SelectRandomContainerElement(unitList);\n+            ts[0].second = me->GetDistance(ts[0].first);\n+        }\n+    }\n+    else\n+    {\n+        bool checkSecondary = !IsRanged() && HasBotCommandState(BOT_COMMAND_STAY);\n+        for (Unit* un : unitList)\n+        {\n+            std::size_t res = !CanBotAttack(un, byspell) ? (checkSecondary && CanBotAttack(un, byspell, checkSecondary)) ? 2 : 0 : 1;\n+            switch (res)\n+            {\n+                case 1: case 2:\n+                    if (!ts[res - 1].first || me->GetDistance(un) < ts[res - 1].second)\n+                        ts[res - 1] = { un, me->GetDistance(un) };\n+                    break;\n+                default:\n+                    break;\n+            }\n+        }\n+    }\n+    Unit* t1 = ts[0].first;\n+    Unit* t2 = ts[1].first;\n+\n+    Unit const* curtar = opponent ? opponent : disttarget ? disttarget : nullptr;\n+    if (t1 && curtar && t1 != curtar)\n+        reset = true;\n+\n+    //Allow free bots to ignore temp invulnerabilities if no other target is present\n+    if (IAmFree() && t1 == nullptr)\n+        t1 = mytar;\n+\n+    //if (t)\n+    //    BOT_LOG_ERROR(\"entities.player\", \"bot {} has found new target {}\", me->GetName(), t->GetName());\n+\n+    return { t1, t2 };\n+}\n+//'CanAttack' function\n+//Only called in class ai UpdateAI function\n+//Side effects: opponent, disttarget\n+bool bot_ai::CheckAttackTarget()\n+{\n+    if (IsDuringTeleport()/* || _evadeMode*/)\n+    {\n+        //me->AttackStop(); //already in CombatStop()\n+        me->CombatStop(true);\n+        return false;\n+    }\n+\n+    if (IAmFree() && Feasting())\n+        return false;\n+\n+    bool ranged = HasRole(BOT_ROLE_RANGED);\n+    bool byspell = false;\n+    bool reset = false;\n+\n+    switch (_botclass)\n+    {\n+        case BOT_CLASS_DRUID:\n+            switch (GetBotStance())\n+            {\n+                case DRUID_CAT_FORM:\n+                case DRUID_BEAR_FORM:\n+                    break;\n+                case DRUID_TREE_FORM:\n+                case DRUID_TRAVEL_FORM:\n+                case DRUID_AQUATIC_FORM:\n+                case DRUID_FLIGHT_FORM:\n+                    ranged = true;\n+                    break;\n+                case DRUID_MOONKIN_FORM:\n+                    byspell = true;\n+                    break;\n+                case BOT_STANCE_NONE:\n+                    byspell = ranged && HasRole(BOT_ROLE_DPS);\n+                    break;\n+                default:\n+                    BOT_LOG_ERROR(\"entities.player\", \"bot_ai::CheckAttackTarget(): druid has NYI bot stance {}\", uint32(GetBotStance()));\n+                    break;\n+            }\n+            break;\n+        case BOT_CLASS_PRIEST:\n+        case BOT_CLASS_MAGE:\n+        case BOT_CLASS_WARLOCK:\n+        case BOT_CLASS_SHAMAN:\n+            byspell = ranged && HasRole(BOT_ROLE_DPS);\n+            break;\n+        case BOT_CLASS_SPHYNX:\n+        case BOT_CLASS_ARCHMAGE:\n+        case BOT_CLASS_NECROMANCER:\n+            byspell = HasRole(BOT_ROLE_DPS);\n+            break;\n+        case BOT_CLASS_HUNTER:\n+        case BOT_CLASS_DEATH_KNIGHT:\n+        case BOT_CLASS_PALADIN:\n+        case BOT_CLASS_WARRIOR:\n+        case BOT_CLASS_ROGUE:\n+        case BOT_CLASS_BM:\n+        case BOT_CLASS_DREADLORD:\n+        case BOT_CLASS_SPELLBREAKER:\n+        case BOT_CLASS_DARK_RANGER:\n+        case BOT_CLASS_SEA_WITCH:\n+        case BOT_CLASS_CRYPT_LORD:\n+            break;\n+        default:\n+            BOT_LOG_ERROR(\"entities.player\", \"bot_ai: CheckAttackTarget() - unknown bot class {}\", _botclass);\n+            return false;\n+    }\n+\n+    std::tie(opponent, disttarget) = _getTargets(byspell, ranged, reset);\n+\n+    if (!opponent && !disttarget)\n+    {\n+        //BOT_LOG_ERROR(\"entities.player\", \"bot_ai: CheckAttackTarget() - bot {} lost target\", me->GetName());\n+        if (me->GetVictim() || me->IsInCombat()/* || !me->GetThreatManager().isThreatListEmpty()*/)\n+        {\n+            //BOT_LOG_ERROR(\"entities.player\", \"bot_ai: CheckAttackTarget() - bot {} Evades\", me->GetName());\n+            if (me->GetVictim())\n+                me->AttackStop();\n+            else if (me->IsInCombat())\n+                Evade();\n+        }\n+\n+        _lastTargetGuid = ObjectGuid::Empty;\n+        return false;\n+    }\n+\n+    Unit* mytar = opponent ? opponent : disttarget;\n+    //boss engage phase // CanHaveThreatList checks for typeid == UNIT\n+    if (GetEngageTimer() > lastdiff)\n+        return false;\n+    else if (!IsTank() && mytar != me->GetVictim() && mytar->GetVictim() && mytar->CanHaveThreatList() &&\n+        mytar->ToCreature()->GetCreatureTemplate()->rank == CREATURE_ELITE_WORLDBOSS && me->GetMap()->IsRaid())\n+    {\n+        uint32 threat = uint32(mytar->ToCreature()->GetThreatManager().GetThreat(mytar->GetVictim()));\n+        if (threat < std::min<uint32>(50000, mytar->GetVictim()->GetMaxHealth() / 2))\n+            return false;\n+    }\n+\n+    if (reset)\n+        SetBotCommandState(BOT_COMMAND_COMBATRESET);//reset AttackStart()\n+\n+    if (mytar != me->GetVictim())\n+        me->Attack(mytar, !ranged);\n+\n+    return true;\n+}\n+//IMMEDIATE TARGETS\n+bool bot_ai::ProcessImmediateNonAttackTarget()\n+{\n+    if ((me->GetMap()->GetEntry() && me->GetMap()->GetEntry()->IsWorldMap()) || IAmFree() || IsCasting())\n+        return false;\n+\n+    static constexpr std::array<uint32, 1> WMOAreaGroupLashlayer = { 29476 }; // Halls of Strife\n+    static constexpr std::array<uint32, 2> WMOAreaGroupMuru = { 41736, 42759 }; // Shrine of the Eclipse\n+    static constexpr std::array<uint32, 2> WMOAreaGroupNajentus = { 41129, 41130 }; // Karabor Sewers\n+    static constexpr std::array<uint32, 1> WMOAreaGroupVashj = { 37594 }; // Serpentshrine Cavern\n+    static constexpr std::array<uint32, 2> WMOAreaGroupSvalna = { 48061, 48335 }; // The Frostwing Halls\n+\n+    static auto isInWMOArea = [](auto lastWMO, auto const& ids) {\n+        for (auto wmoId : ids) {\n+            if (wmoId == lastWMO)\n+                return true;\n+        }\n+        return false;\n+    };\n+\n+    if (me->GetMapId() == 469 && GetBotClass() == BOT_CLASS_ROGUE && isInWMOArea(_lastWMOAreaId, WMOAreaGroupLashlayer)) // BWL - Bloodlord Lashlayer\n+    {\n+        static const uint32 SPELL_DISARM_TRAP_1 = 1842u;\n+\n+        if (!IsCasting() && IsSpellReady(SPELL_DISARM_TRAP_1, lastdiff, false) && (me->HasAuraType(SPELL_AURA_MOD_STEALTH) || IsSpellReady(1784, lastdiff, false)) && Rand() < 20) // Stealth\n+        {\n+            SpellInfo const* disarmTrapSpellInfo = sSpellMgr->AssertSpellInfo(SPELL_DISARM_TRAP_1);\n+            float max_range = disarmTrapSpellInfo->GetMaxRange();\n+            ApplyBotSpellRangeMods(disarmTrapSpellInfo, max_range);\n+\n+            std::list<GameObject*> goList;\n+            Bcore::AllGameObjectsWithEntryInRange check(me, 179784, max_range); // Suppression Device\n+            Bcore::GameObjectListSearcher<Bcore::AllGameObjectsWithEntryInRange> searcher(me, goList, check);\n+            Cell::VisitAllObjects(me, searcher, max_range);\n+\n+            std::erase_if(goList, [](GameObject const* gobject) { return gobject->HasFlag(GO_FLAG_NOT_SELECTABLE); });\n+\n+            if (GameObject* device = goList.empty() ? nullptr : goList.size() == 1u ? goList.front() : Bcore::Containers::SelectRandomContainerElement(goList))\n+            {\n+                if (me->HasAuraType(SPELL_AURA_MOD_STEALTH) || doCast(me, GetSpell(1784)))\n+                me->CastSpell(device, SPELL_DISARM_TRAP_1);\n+                return true;\n+            }\n+        }\n+    }\n+\n+    if (me->GetMapId() == 580 && isInWMOArea(_lastWMOAreaId, WMOAreaGroupMuru)) // Sunwell - M'uru\n+    {\n+        static const uint32 SPELL_PURGE_1 = 370u;\n+        static const uint32 SPELL_DISPEL_MAGIC_1 = 527u;\n+        uint32 dspell = 0;\n+        if (_botclass == BOT_CLASS_SHAMAN)\n+            dspell = SPELL_PURGE_1;\n+        else if (_botclass == BOT_CLASS_PRIEST)\n+            dspell = SPELL_DISPEL_MAGIC_1;\n+\n+        if (dspell && IsSpellReady(dspell, lastdiff))\n+        {\n+            std::list<Creature*> cList;\n+            Bcore::AllCreaturesOfEntryInRange check(me, 25744, 30.f); // Dark Fiend\n+            Bcore::CreatureListSearcher<Bcore::AllCreaturesOfEntryInRange> searcher(me, cList, check);\n+            Cell::VisitAllObjects(me, searcher, 30.f);\n+\n+            //Dark Fiends do not die instantly, remove purged ones\n+            std::erase_if(cList, Bcore::UnitAuraCheck(false, 45934)); // \"Dark Fiend\"\n+\n+            if (Unit* fiend = cList.empty() ? nullptr : cList.size() == 1u ? cList.front() :\n+                Bcore::Containers::SelectRandomContainerElement(cList))\n+            {\n+                if (CheckBotCast(fiend, GetSpell(dspell)) == SPELL_CAST_OK)\n+                    if (doCast(fiend, GetSpell(dspell)))\n+                        return true;\n+            }\n+        }\n+    }\n+    if (me->GetMapId() == 564 && isInWMOArea(_lastWMOAreaId, WMOAreaGroupNajentus) && Rand() < 10) // Black Temple - High Warlord Naj'entus\n+    {\n+        if (Group const* gr = master->GetGroup())\n+        {\n+            if (Rand() < 4)\n+            {\n+                InstanceScript* iscript = me->GetMap()->ToInstanceMap()->GetInstanceScript();\n+                Unit* najentus = iscript ? iscript->GetCreature(0) : nullptr; // boss_warlord_najentus.cpp::DATA_HIGH_WARLORD_NAJENTUS\n+\n+                if (najentus && najentus->HasAuraTypeWithMiscvalue(SPELL_AURA_SCHOOL_IMMUNITY, 127)) // Tidal Shield\n+                {\n+                    //Try to grab spines from corpses of dead players\n+                    std::vector<Player*> spiners;\n+                    for (GroupReference const* itr = gr->GetFirstMember(); itr != nullptr; itr = itr->next())\n+                    {\n+                        Player* pl = itr->GetSource();\n+                        if (pl && pl->IsInWorld() && me->GetMap() == pl->FindMap() && !pl->IsAlive() &&\n+                            me->GetDistance(pl) < 25.f && pl->HasItemCount(32408)) // Naj'entus Spine\n+                            spiners.push_back(pl);\n+                    }\n+\n+                    if (Player* pl = spiners.empty() ? nullptr : spiners.size() == 1u ? spiners.front() :\n+                        Bcore::Containers::SelectRandomContainerElement(spiners))\n+                    {\n+                        BotWhisper(\"Taking 1 Naj'entus Spine from you\");\n+                        me->CastSpell(najentus, 39948, true); // Hurl Spine\n+                        pl->DestroyItemCount(32408, 1, true); // Naj'entus Spine\n+                    }\n+                }\n+            }\n+\n+            std::vector<Unit*> spines;\n+            //Find and free impaled player (player gets the spine)\n+            for (GroupReference const* itr = gr->GetFirstMember(); itr != nullptr; itr = itr->next())\n+            {\n+                Player* pl = itr->GetSource();\n+                //We don't make bots run to player to \"click\" the spine, so range is rather big\n+                if (pl && pl->IsInWorld() && me->GetMap() == pl->FindMap())\n+                {\n+                    auto is_impaled = [this](Unit const* unit) -> bool {\n+                        return unit->IsAlive() && unit->HasUnitState(UNIT_STATE_STUNNED) &&\n+                            me->GetDistance(unit) < 25.f && unit->HasAura(39837); // \"Impaling Spine\"\n+                    };\n+\n+                    if (is_impaled(pl))\n+                        spines.push_back(pl->ToUnit());\n+                    if (pl->HaveBot())\n+                    {\n+                        for (auto const& [_, bot] : *pl->GetBotMgr()->GetBotMap())\n+                        {\n+                            if (bot && is_impaled(bot))\n+                                spines.push_back(bot->ToUnit());\n+                        }\n+                    }\n+                }\n+            }\n+\n+            if (Unit* u = spines.empty() ? nullptr : spines.size() == 1u ? spines.front() :\n+                Bcore::Containers::SelectRandomContainerElement(spines))\n+            {\n+                if (GameObject const* spine = u->GetFirstGameObjectById(185584)) // Naj'entus Spine\n+                {\n+                    Player* receiver = u->IsPlayer() ? u->ToPlayer() : master;\n+                    if (spine->AI() && spine->AI()->OnGossipHello(receiver))\n+                    {\n+                        // Item is created by spell 39956 Create Naj'entus Spine - cannot target dead, force add item\n+                        if (!receiver->IsAlive())\n+                            receiver->AddItem(32408, 1); // Naj'entus Spine\n+                        return true;\n+                    }\n+                }\n+            }\n+        }\n+    }\n+\n+    if (me->GetMapId() == 548 && isInWMOArea(_lastWMOAreaId, WMOAreaGroupVashj) && Rand() < 15) // Serpentshrine Cavern - Lady Vashj\n+    {\n+        uint32 alive_players = 0;\n+        std::vector<Player*> taintPlayers;\n+        for (MapReference const& ref : me->GetMap()->GetPlayers())\n+        {\n+            if (Player* player = ref.GetSource())\n+            {\n+                if (player->IsAlive())\n+                    ++alive_players;\n+                if (player->HasAuraType(SPELL_AURA_MOD_ROOT) && me->IsWithinDistInMap(player, 20.0f) &&\n+                    player->HasItemCount(31088, 1)) // Tainted Core\n+                    taintPlayers.push_back(player);\n+            }\n+        }\n+\n+        if (!taintPlayers.empty() && alive_players <= 1)\n+        {\n+#if defined(TRINITY_COMPILER)\n+            static const uint32 ShieldGeneratorTriggerNPC = 19870;\n+#elif defined(AC_COMPILER)\n+            static const uint32 ShieldGeneratorTriggerNPC = WORLD_TRIGGER;\n+#endif\n+            std::list<Creature*> cList;\n+            Bcore::AllCreaturesOfEntryInRange check(me, ShieldGeneratorTriggerNPC, 100.f); // Invis KV Shield Generator\n+            Bcore::CreatureListSearcher<Bcore::AllCreaturesOfEntryInRange> csearcher(me, cList, check);\n+            Cell::VisitAllObjects(me, csearcher, 100.f);\n+\n+            std::list<GameObject*> gList;\n+            auto is_shield_go = [](GameObject const* gobject) {\n+                switch (gobject->GetEntry())\n+                {\n+                    case 185051:\n+                    case 185052:\n+                    case 185053:\n+                    case 185054:\n+                        return true;\n+                    default:\n+                        return false;\n+                }\n+            };\n+            Bcore::GameObjectListSearcher gsearcher(me, gList, is_shield_go);\n+            Cell::VisitAllObjects(me, gsearcher, 100.f);\n+\n+            static const auto get_shield_creature = [](GameObject const* gobject, std::list<Creature*> const& clist) {\n+                Creature* c = nullptr;\n+                float mindist = 10.0f;\n+                for (Creature* creature : clist)\n+                {\n+                    float dist = gobject->GetDistance(creature);\n+                    if (dist < mindist)\n+                    {\n+                        c = creature;\n+                        mindist = dist;\n+                    }\n+                }\n+                return c;\n+            };\n+\n+            std::erase_if(gList, [&cList](GameObject const* gobject) {\n+                Creature const* c = get_shield_creature(gobject, cList);\n+                return !c || c->GetCurrentSpell(CURRENT_CHANNELED_SPELL) == nullptr;\n+            });\n+            std::erase_if(cList, [](Creature const* creature) {\n+                return creature->GetCurrentSpell(CURRENT_CHANNELED_SPELL) == nullptr;\n+            });\n+\n+            ASSERT(cList.size() == gList.size());\n+\n+            if (!gList.empty())\n+            {\n+                Player* player = taintPlayers.size() == 1u ? taintPlayers.front() : Bcore::Containers::SelectRandomContainerElement(taintPlayers);\n+                BotWhisper(\"Taking Tainted Core from you\");\n+                GameObject* go = gList.size() == 1u ? gList.front() : Bcore::Containers::SelectRandomContainerElement(gList);\n+#if defined(TRINITY_COMPILER)\n+                Item* item = player->GetItemByEntry(31088); // Tainted Core\n+                SpellCastTargets targets;\n+                targets.SetGOTarget(go);\n+                sScriptMgr->OnItemUse(player, item, targets);\n+#elif defined(AC_COMPILER)\n+                Creature* cre = get_shield_creature(go, cList);\n+                ASSERT(cre);\n+                cre->DespawnOrUnsummon(1);\n+                player->DestroyItemCount(31088, 1, true); // Tainted Core\n+#endif\n+                return true;\n+            }\n+        }\n+    }\n+\n+    if (me->GetMapId() == 631 && isInWMOArea(_lastWMOAreaId, WMOAreaGroupSvalna) && Rand() < 10) // Icecrown Citadel - Sister Svalna\n+    {\n+        if (Group const* gr = master->GetGroup())\n+        {\n+            if (Rand() < 4)\n+            {\n+                InstanceScript* iscript = me->GetMap()->ToInstanceMap()->GetInstanceScript();\n+                Creature* svalna = iscript ? iscript->GetCreature(9) : nullptr; // icecrown_citadel.h::DATA_SISTER_SVALNA\n+                if (!svalna)\n+                {\n+                    static const uint32 CREATURE_SISTER_SVALNA_N = 37126;\n+                    static const uint32 CREATURE_SISTER_SVALNA_H = 37126; //Acore - same id is used\n+                    Bcore::AllCreaturesOfEntryInRange check(master, me->GetMap()->IsHeroic() ? CREATURE_SISTER_SVALNA_H : CREATURE_SISTER_SVALNA_N, 60.f);\n+                    Bcore::CreatureSearcher<Bcore::AllCreaturesOfEntryInRange> searcher(master, svalna, check);\n+                    Cell::VisitAllObjects(master, searcher, 60.f);\n+                }\n+\n+                if (svalna && svalna->HasAuraTypeWithMiscvalue(SPELL_AURA_SCHOOL_IMMUNITY, 127)) // Aether Shield\n+                {\n+                    //Try to grab spears from corpses of dead players\n+                    std::vector<Player*> spearers;\n+                    for (GroupReference const* itr = gr->GetFirstMember(); itr != nullptr; itr = itr->next())\n+                    {\n+                        Player* pl = itr->GetSource();\n+                        if (pl && pl->IsInWorld() && me->GetMap() == pl->FindMap() && !pl->IsAlive() &&\n+                            me->GetDistance(pl) < 25.f && pl->HasItemCount(50307)) // Infernal Spear\n+                            spearers.push_back(pl);\n+                    }\n+\n+                    if (Player* pl = spearers.empty() ? nullptr : spearers.size() == 1u ? spearers.front() :\n+                        Bcore::Containers::SelectRandomContainerElement(spearers))\n+                    {\n+                        BotWhisper(\"Taking 1 Infernal Spear from you\");\n+                        me->CastSpell(svalna, 71466, true); // Hurl Spear\n+                        pl->DestroyItemCount(50307, 1, true); // Infernal Spear\n+                    }\n+                }\n+            }\n+\n+            auto is_impaled = [this](Unit const* unit) -> bool {\n+                return unit->IsAlive() && unit->HasUnitState(UNIT_STATE_STUNNED) &&\n+                    me->GetDistance(unit) < 25.f && unit->HasAura(71443); // \"Impaling Spear\"\n+            };\n+\n+            std::vector<Unit*> spears;\n+            //Find and free impaled player (player gets the spear)\n+            for (GroupReference const* itr = gr->GetFirstMember(); itr != nullptr; itr = itr->next())\n+            {\n+                Player* pl = itr->GetSource();\n+                //We don't make bots run to player to \"click\" the spine, so range is rather big\n+                if (pl && pl->IsInWorld() && me->GetMap() == pl->FindMap())\n+                {\n+\n+                    if (is_impaled(pl))\n+                        spears.push_back(pl->ToUnit());\n+                    if (pl->HaveBot())\n+                    {\n+                        for (auto const& [_, bot] : *pl->GetBotMgr()->GetBotMap())\n+                        {\n+                            if (bot && is_impaled(bot))\n+                                spears.push_back(bot->ToUnit());\n+                        }\n+                    }\n+                }\n+            }\n+\n+            if (Unit* u = spears.empty() ? nullptr : spears.size() == 1u ? spears.front() :\n+                Bcore::Containers::SelectRandomContainerElement(spears))\n+            {\n+                Creature* spear = nullptr;\n+                Bcore::NearestCreatureEntryWithLiveStateInObjectRangeCheck check(*u, 38248, true, 5.f);\n+                Bcore::CreatureSearcher<Bcore::NearestCreatureEntryWithLiveStateInObjectRangeCheck> searcher(u, spear, check);\n+                Cell::VisitAllObjects(u, searcher, 5.f);\n+\n+                if (spear)\n+                {\n+                    Player* receiver = u->IsPlayer() ? u->ToPlayer() : master;\n+                    me->CastSpell(spear, 71462, true); // \"Remove Spear\"\n+                    receiver->AddItem(50307, 1); // Infernal Spear\n+                    return true;\n+                }\n+            }\n+        }\n+    }\n+\n+    return false;\n+}\n+//POSITION\n+AoeSpotsVec const& bot_ai::GetAoeSpots() const\n+{\n+    return IAmFree() ? _aoeSpots : master->GetBotMgr()->GetAoeSpots();\n+}\n+\n+void bot_ai::CalculateAoeSpots(Unit const* unit, AoeSpotsVec& spots)\n+{\n+    spots.clear();\n+\n+    std::list<WorldObject*> doList;\n+    NearbyHostileAoEDynobjectCheck check(unit, 60.f);\n+    Bcore::WorldObjectListSearcher searcher(unit, doList, check, GRID_MAP_TYPE_MASK_DYNAMICOBJECT);\n+    Cell::VisitAllObjects(unit, searcher, 60.f);\n+\n+    //filter and add to list\n+    SpellInfo const* spellInfo;\n+    for (WorldObject const* wObj : doList)\n+    {\n+        DynamicObject const* dObj = wObj->ToDynObject();\n+        ASSERT_NODEBUGINFO(dObj);\n+        ASSERT_NODEBUGINFO(dObj->GetSpellId());\n+        spellInfo = sSpellMgr->GetSpellInfo(dObj->GetSpellId());\n+        if (IsPeriodicDynObjAOEDamage(spellInfo))\n+        {\n+            float radius = dObj->GetRadius() + DEFAULT_PLAYER_BOUNDING_RADIUS;\n+            radius += (unit->GetVehicle() ? unit->GetVehicleBase()->GetCombatReach() : DEFAULT_PLAYER_COMBAT_REACH) * 1.2f;\n+            spots.emplace_back(*dObj, radius);\n+        }\n+    }\n+\n+    if (unit->IsNPCBot() && unit->ToCreature()->IsFreeBot())\n+        return;\n+\n+    //Additional: aoe coming from spawned npcs\n+\n+    //Molten Core\n+    if (unit->GetMapId() == 409)\n+    {\n+        std::list<GameObject*> gListMC;\n+        Bcore::AllGameObjectsWithEntryInRange checkMC(unit, GAMEOBJECT_HOT_COAL, 60.f);\n+        Bcore::GameObjectListSearcher searcherMC(unit, gListMC, checkMC);\n+        Cell::VisitAllObjects(unit, searcherMC, 60.f);\n+\n+        if (!gListMC.empty())\n+        {\n+            float radius = 15.0f + DEFAULT_PLAYER_COMBAT_REACH;\n+            for (GameObject const* go : gListMC)\n+                spots.emplace_back(*go, radius);\n+        }\n+    }\n+    // Ruins of Ahn'Qiraj (AQ20) - Sand Trap avoidance\n+    else if (unit->GetMapId() == 509)\n+    {\n+        static const uint32 GO_SAND_TRAP = 180647; // Sand Trap\n+        std::list<GameObject*> sandTrapList;\n+        Bcore::AllGameObjectsWithEntryInRange trapCheck(unit, GO_SAND_TRAP, 60.f);\n+        Bcore::GameObjectListSearcher trapSearcher(unit, sandTrapList, trapCheck);\n+        Cell::VisitAllObjects(unit, trapSearcher, 40.f);\n+\n+        if (!sandTrapList.empty())\n+        {\n+            float radius = 12.0f + DEFAULT_PLAYER_COMBAT_REACH * 1.2f;\n+            for (GameObject const* go : sandTrapList)\n+                spots.emplace_back(*go, radius);\n+        }\n+    }\n+    //Temple of Ahn'Qiraj (AQ40) - Mutating bugs exploding\n+    else if (unit->GetMapId() == 531)\n+    {\n+        static const uint32 AURA_EXPLODE = 804;\n+        static const std::array<uint32, 2> MutatingBugIds = { 15316u, 15317u };\n+        std::list<Creature*> cList;\n+        auto bug_check = [](Creature const* c) {\n+            return c && c->IsAlive() && std::ranges::find(MutatingBugIds, c->GetEntry()) != MutatingBugIds.cend() && c->HasAura(AURA_EXPLODE);\n+        };\n+        Bcore::CreatureListSearcher bugSearcher(unit, cList, bug_check);\n+        Cell::VisitAllObjects(unit, bugSearcher, 60.f);\n+\n+        if (!cList.empty())\n+        {\n+            float explodeRadius = sSpellMgr->AssertSpellInfo(AURA_EXPLODE)->GetEffect(EFFECT_0).CalcRadius();\n+            float radius = explodeRadius + DEFAULT_PLAYER_COMBAT_REACH * 1.5f;\n+            for (Creature const* c : cList)\n+                spots.emplace_back(*c, radius);\n+        }\n+    }\n+    // The Blood Furnace - Proximity Bombs\n+    else if (unit->GetMapId() == 542)\n+    {\n+        std::list<GameObject*> proximityBombList;\n+        static const std::array<uint32, 2> ProximityBombIds = { GAMEOBJECT_PROXIMITY_BOMB_N, GAMEOBJECT_PROXIMITY_BOMB_N };\n+        auto bomb_check = [](GameObject const* go) { return go && std::ranges::find(ProximityBombIds, go->GetEntry()) != ProximityBombIds.cend(); };\n+        Bcore::GameObjectListSearcher bombSearcher(unit, proximityBombList, bomb_check);\n+        Cell::VisitAllObjects(unit, bombSearcher, 40.f);\n+\n+        if (!proximityBombList.empty())\n+        {\n+            for (GameObject const* go : proximityBombList)\n+            {\n+                float radius = 10.0f + DEFAULT_PLAYER_BOUNDING_RADIUS * go->GetObjectScale() + DEFAULT_PLAYER_COMBAT_REACH * 1.5f;\n+                spots.emplace_back(*go, radius);\n+            }\n+        }\n+    }\n+    // Hellfire Ramparts - Liquid Fire puddles\n+    if (unit->GetMapId() == 543) // Hellfire Ramparts\n+    {\n+        std::list<GameObject*> liquidFireList;\n+        static const std::array<uint32, 3> LiquidFireIds = { GAMEOBJECT_LIQUID_FIRE_1, GAMEOBJECT_LIQUID_FIRE_2, GAMEOBJECT_LIQUID_FIRE_3 };\n+        auto fire_check = [](GameObject const* go) { return go && std::ranges::find(LiquidFireIds, go->GetEntry()) != LiquidFireIds.cend(); };\n+        Bcore::GameObjectListSearcher fireSearcher(unit, liquidFireList, fire_check);\n+        Cell::VisitAllObjects(unit, fireSearcher, 40.f);\n+\n+        if (!liquidFireList.empty())\n+        {\n+            for (GameObject const* go : liquidFireList)\n+            {\n+                float radius = 10.0f + DEFAULT_PLAYER_BOUNDING_RADIUS * go->GetObjectScale() + DEFAULT_PLAYER_COMBAT_REACH * 1.5f;\n+                spots.emplace_back(*go, radius);\n+            }\n+        }\n+    }\n+    //Aucheai Crypts\n+    else if (unit->GetMapId() == 558)\n+    {\n+        Creature* creature = nullptr;\n+        static const auto focus_fire_check = [](Creature const* c) {\n+            return (c->GetEntry() == CREATURE_FOCUS_FIRE_N || c->GetEntry() == CREATURE_FOCUS_FIRE_H);\n+        };\n+        Bcore::CreatureSearcher searcher2(unit, creature, focus_fire_check);\n+        Cell::VisitAllObjects(unit, searcher2, 50.f);\n+\n+        if (creature)\n+        {\n+            spellInfo = sSpellMgr->GetSpellInfo(32302); //Fiery Blast\n+            float radius = spellInfo->GetEffect(EFFECT_0).CalcRadius() + DEFAULT_PLAYER_COMBAT_REACH * 2.0f;\n+            spots.emplace_back(*creature, radius);\n+        }\n+    }\n+    //The Eye of Eternity\n+    else if (unit->GetMapId() == 616 && unit->GetVehicle())\n+    {\n+        std::list<Creature*> cList;\n+        Bcore::AllCreaturesOfEntryInRange check2(unit->GetVehicleBase(), CREATURE_EOE_STATIC_FIELD, 60.f);\n+        Bcore::CreatureListSearcher<Bcore::AllCreaturesOfEntryInRange> searcher2(unit->GetVehicleBase(), cList, check2);\n+        //unit->GetVehicleBase()->VisitNearbyObject(60.f, searcher2);\n+        Cell::VisitAllObjects(unit->GetVehicleBase(), searcher2, 60.f);\n+\n+        spellInfo = sSpellMgr->GetSpellInfo(57429); //Static Field damage\n+        float radius = spellInfo->GetEffect(EFFECT_0).CalcRadius() + unit->GetVehicleBase()->GetCombatReach() * 1.2f;\n+        for (Creature const* c : cList)\n+            spots.emplace_back(*c, radius);\n+    }\n+    //Magister's Terrace\n+    else if (unit->GetMapId() == 585)\n+    {\n+        std::list<Creature*> cList;\n+        static const auto kael_aoe_check = [](Creature const* c) {\n+            return (c->GetEntry() == CREATURE_MT_PHOENIX || c->GetEntry() == CREATURE_MT_ARCANE_SPHERE_N || c->GetEntry() == CREATURE_MT_ARCANE_SPHERE_H);\n+        };\n+        Bcore::CreatureListSearcher searcher3(unit, cList, kael_aoe_check);\n+        Cell::VisitAllObjects(unit, searcher3, 40.f);\n+\n+        if (!cList.empty())\n+        {\n+            spellInfo = sSpellMgr->GetSpellInfo(44198); //Burn damage (44197 -> 44198)\n+            float radius = spellInfo->GetEffect(EFFECT_0).CalcRadius() + DEFAULT_PLAYER_COMBAT_REACH * 3.0f;\n+            for (Creature const* c : cList)\n+                spots.emplace_back(*c, radius);\n+        }\n+    }\n+    //Zul'Aman\n+    else if (unit->GetMapId() == 568)\n+    {\n+        std::list<Creature*> cList;\n+        Bcore::AllCreaturesOfEntryInRange check2(unit, CREATURE_ZA_FIRE_BOMB, 40.f);\n+        Bcore::CreatureListSearcher searcher2(unit, cList, check2);\n+        Cell::VisitAllObjects(unit, searcher2, 40.f);\n+\n+        if (!cList.empty())\n+        {\n+            spellInfo = sSpellMgr->GetSpellInfo(42630); //Fire Bomb\n+            float radius = spellInfo->GetEffect(EFFECT_0).CalcRadius() + DEFAULT_PLAYER_COMBAT_REACH * 1.2f;\n+            for (Creature const* c : cList)\n+                spots.emplace_back(*c, radius);\n+        }\n+    }\n+    //Uthgarde Keep\n+    else if (unit->GetMapId() == 574)\n+    {\n+        Creature* creature = nullptr;\n+        static const auto shadow_axe_check = [](Creature const* c) {\n+            return (c->GetEntry() == CREATURE_UK_SHADOW_AXE_N || c->GetEntry() == CREATURE_UK_SHADOW_AXE_H);\n+        };\n+        Bcore::CreatureSearcher searcher2(unit, creature, shadow_axe_check);\n+        Cell::VisitAllObjects(unit, searcher2, 40.f);\n+\n+        if (creature)\n+        {\n+            spellInfo = sSpellMgr->GetSpellInfo(42751); //Shadow Axe\n+            float radius = spellInfo->GetEffect(EFFECT_0).CalcRadius() + DEFAULT_PLAYER_COMBAT_REACH * 2.0f;\n+            spots.emplace_back(*creature, radius);\n+        }\n+    }\n+    //Icecrown Citadel\n+    else if (unit->GetMapId() == 631)\n+    {\n+        std::list<Creature*> cList;\n+        Bcore::AllCreaturesOfEntryInRange check2(unit, CREATURE_ICC_OOZE_PUDDLE, 50.f);\n+        Bcore::CreatureListSearcher searcher2(unit, cList, check2);\n+        Cell::VisitAllObjects(unit, searcher2, 50.f);\n+\n+        for (Creature const* c : cList)\n+        {\n+            float radius = c->GetObjectScale() * 2.5f + DEFAULT_PLAYER_COMBAT_REACH * 3.f; //grows\n+            spots.emplace_back(*c, radius);\n+        }\n+    }\n+\n+    //STUB\n+    //if (!unit->IsPlayer() || !unit->ToPlayer()->HaveBot())\n+    //    return;\n+\n+    //switch (unit->GetMapId())\n+    //{\n+    //    case 409: //Molten Core\n+    //        break;\n+    //    default:\n+    //        return;\n+    //}\n+\n+    //BotMap const* bmap = unit->ToPlayer()->GetBotMgr()->GetBotMap();\n+    //for (BotMap::const_iterator itr = bmap->begin(); itr != bmap->end(); ++itr)\n+    //{\n+    //    if (itr->second && itr->second->IsInWorld() && itr->second->IsAlive())\n+    //    {\n+    //        // Living Bomb\n+    //        if (unit->GetMapId() == 409 && !!itr->second->GetAuraEffect(SPELL_AURA_PERIODIC_TRIGGER_SPELL, SPELLFAMILY_GENERIC, 1646, 0))\n+    //            spots.push_back(AoeSpotsVec::value_type(itr->second->GetPosition(), 18.0));\n+    //    }\n+    //}\n+}\n+\n+AoeSafeSpotsVec bot_ai::CalculateAoeSafeSpots(Unit* target, float maxdist) const\n+{\n+    AoeSafeSpotsVec safespots;\n+    if (!GetAoeSpots().empty())\n+    {\n+        //find 200 safe spots\n+        const float distdelta = maxdist / 200.f;\n+        const float angledelta = float(M_PI) / 12.5f;\n+        float aoedist = 0.f;\n+        for ([[maybe_unused]] auto i : NPCBots::index_array<uint8, 8>)\n+        {\n+            float aoeangle = 0.0f;\n+            for ([[maybe_unused]] auto j : NPCBots::index_array<uint8, 25>)\n+            {\n+                aoedist += distdelta;\n+                aoeangle += angledelta;\n+\n+                Position ppos = target->GetFirstCollisionPosition(aoedist, Position::NormalizeOrientation(aoeangle - target->GetOrientation()));\n+                bool toofaraway = master->GetDistance(ppos) > maxdist;\n+\n+                if (!toofaraway && !IsWithinAoERadius(ppos))\n+                    safespots.push_back(ppos);\n+            }\n+        }\n+    }\n+    return safespots;\n+}\n+\n+bool bot_ai::IsPeriodicDynObjAOEDamage(SpellInfo const* spellInfo)\n+{\n+    if (!spellInfo->IsPositive())\n+    {\n+        for (auto i : NPCBots::index_array<uint8, MAX_SPELL_EFFECTS>)\n+        {\n+            if (spellInfo->_effects[i].Effect == SPELL_EFFECT_PERSISTENT_AREA_AURA &&\n+                spellInfo->_effects[i].ApplyAuraName != 0)\n+            {\n+                switch (spellInfo->_effects[i].ApplyAuraName)\n+                {\n+                    case SPELL_AURA_PERIODIC_DAMAGE:\n+                    case SPELL_AURA_PERIODIC_DAMAGE_PERCENT:\n+                    case SPELL_AURA_POWER_BURN:\n+                    case SPELL_AURA_PERIODIC_LEECH:\n+                    //Most of these are damaging spells\n+                    case SPELL_AURA_PERIODIC_TRIGGER_SPELL:\n+                    case SPELL_AURA_PERIODIC_TRIGGER_SPELL_WITH_VALUE:\n+                    //Scripted spells (mostly, some of these are wrong or not periodic damage)\n+                    case SPELL_AURA_PERIODIC_DUMMY:\n+                    //Channeled spells with SPELL_AURA_PERIODIC_TRIGGER_SPELL -> damage on TARGET_DEST_CHANNEL_TARGET (mostly)\n+                    case SPELL_AURA_DUMMY:\n+                        return true;\n+                    default:\n+                        break;\n+                }\n+            }\n+        }\n+    }\n+    return false;\n+}\n+bool bot_ai::IsWithinAoERadius(Position const& pos) const\n+{\n+    AoeSpotsVec const& spots = GetAoeSpots();\n+    if (!spots.empty())\n+    {\n+        Unit const* mover = me->GetVehicle() ? me->GetVehicleBase() : me;\n+        float cr_diff = mover->GetCombatReach() - DEFAULT_PLAYER_COMBAT_REACH;\n+        for (auto const& [apos, aradius] : spots)\n+            if (pos.GetExactDist(apos) - cr_diff < aradius)\n+                return true;\n+    }\n+\n+    return false;\n+}\n+//Returns attack range based on given range\n+//If mounted: 20%\n+//If ranged: 125%\n+//If master is dead: max range\n+//If wanderer: 65% max range\n+float bot_ai::InitAttackRange(float origRange, bool ranged) const\n+{\n+    if (IsWanderer())\n+    {\n+        origRange = sWorld->GetMaxVisibleDistanceOnContinents() * 0.65f;\n+        if (IsFlagCarrier(me))\n+            origRange *= 0.67f;\n+    }\n+    else if (!master->IsAlive())\n+        origRange = sWorld->GetMaxVisibleDistanceOnContinents();\n+    else if (me->HasAuraType(SPELL_AURA_MOUNTED))\n+        origRange *= 0.2f;\n+    else if (ranged)\n+        origRange *= 1.25f;\n+\n+    return origRange;\n+}\n+void bot_ai::_extendAttackRange(float& dist) const\n+{\n+    ASSERT(!IAmFree());\n+\n+    uint8 rangeMode = master->GetBotMgr()->GetBotAttackRangeMode();\n+    if (master->GetBotMgr()->GetBotFollowDist() > 0)\n+    {\n+        float spelldist;\n+        if (rangeMode == BOT_ATTACK_RANGE_EXACT)\n+            spelldist = master->GetBotMgr()->GetBotExactAttackRange();\n+        else\n+            spelldist = GetSpellAttackRange(rangeMode == BOT_ATTACK_RANGE_LONG);\n+        dist = std::max<float>(dist, spelldist * 0.5f + 4.f);\n+    }\n+}\n+bool bot_ai::_canSwitchToTarget(Unit const* from, Unit const* newTarget, int8 byspell) const\n+{\n+    if (newTarget && newTarget != me->GetVictim())\n+    {\n+        if (IAmFree())\n+        {\n+            if ((!from || me->GetDistance(newTarget) < me->GetDistance(from) - 10.0f || newTarget->GetHealth() < from->GetHealth()) &&\n+                CanBotAttack(newTarget, byspell))\n+                return true;\n+        }\n+        else if (!from && me->GetDistance(newTarget) < 0.75f * _getAttackDistance(float(master->GetBotMgr()->GetBotFollowDist())) &&\n+            CanBotAttack(newTarget, byspell))\n+            return true;\n+    }\n+\n+    return false;\n+}\n+//Ranged attack position\n+void bot_ai::CalculateAttackPos(Unit* target, Position& pos, bool& force) const\n+{\n+    uint8 followdist = IAmFree() ? BotMgr::GetBotFollowDistMax() : master->GetBotMgr()->GetBotFollowDist();\n+    uint8 rangeMode = IAmFree() ? uint8(BOT_ATTACK_RANGE_LONG) : master->GetBotMgr()->GetBotAttackRangeMode();\n+    uint8 exactRange = rangeMode != BOT_ATTACK_RANGE_EXACT || IAmFree() ? 255 : master->GetBotMgr()->GetBotExactAttackRange();\n+    uint8 angleMode = IAmFree() ? uint8(BOT_ATTACK_ANGLE_NORMAL) : master->GetBotMgr()->GetBotAttackAngleMode();\n+    float dist = (rangeMode == BOT_ATTACK_RANGE_EXACT) ? exactRange : GetSpellAttackRange(rangeMode == BOT_ATTACK_RANGE_LONG) - 5.f;\n+    float angle = target->GetAbsoluteAngle(me);\n+    if (_botclass == BOT_CLASS_SPHYNX && target->GetVictim() == me && me->GetExactDist(target) < 30.0f)\n+        dist = me->GetExactDist(target);\n+    if ((target->m_movementInfo.GetMovementFlags() & MOVEMENTFLAG_FORWARD) && target->HasInArc(float(M_PI)/1.5f, me))\n+        dist = std::min<float>(dist + 4.f, 30.f);\n+\n+    //if ranged try to acquire a position in the back (will be ignored if too far away from master)\n+    if (angleMode == BOT_ATTACK_ANGLE_AVOID_FRONTAL_AOE)\n+    {\n+        static const float rangedAngleDelta = float(M_PI) * 0.62f;\n+        if (HasRole(BOT_ROLE_RANGED) && !IAmFree() && !target->IsControlledByPlayer() && target->HasInArc(float(M_PI), me) &&\n+            (IsTank(master) || master->GetDistance(target) < 2.5f || !target->HasInArc(float(M_PI), master)))\n+            angle += (target->GetRelativeAngle(master) > 0.f) ? rangedAngleDelta : -rangedAngleDelta;\n+    }\n+\n+    float clockwise = (me->GetEntry() % 2) ? 1.f : -1.f;\n+    float angleDelta1 = ((IsTank(master) && !IsTank(me)) ? frand(float(M_PI)*0.40f, float(M_PI)*0.60f) : frand(0.0f, float(M_PI)*0.15f)) * clockwise;\n+    float angleDelta2 = frand(0.0f, float(M_PI)*0.08f) * clockwise;\n+\n+    Position ppos;\n+\n+    if (me->GetVehicle())\n+    {\n+        ASSERT(!IAmFree());\n+\n+        if (float vehdist = GetVehicleAttackDistanceOverride())\n+            dist = vehdist + 5.f;\n+\n+        uint8 posSlot = master->GetBotMgr()->GetNpcBotSlot(me);\n+        clockwise = (posSlot % 2) ? 1.f : -1.f;\n+\n+        Unit* angunit = target->GetVictim() ? target->GetVictim() : master->GetVehicle() ? master->GetVehicleBase() : master;\n+        if (angunit == me->GetVehicleBase() || angunit == me)\n+            angle = target->GetAbsoluteAngle(me->GetVehicleBase());\n+        else\n+            angle = target->GetAbsoluteAngle(angunit) + 0.5f * M_PI / master->GetNpcBotsCount() * posSlot * clockwise;\n+\n+        for (auto i : NPCBots::index_array<uint8, 4>)\n+        {\n+            if (me->GetVehicleBase()->CanFly())\n+            {\n+                //collision point bug, distance shinked to 0, so use GetNearPoint\n+                float &tx = ppos.m_positionX, &ty = ppos.m_positionY, &tz = ppos.m_positionZ;\n+                target->GetNearPoint(me->GetVehicleBase(), tx, ty, tz, dist, Position::NormalizeOrientation(angle));\n+                if (!target->IsWithinLOS(tx, ty, tz))\n+                    dist *= i >= 3 ? 0.2f : i >= 2 ? 0.5f : 0.75f;\n+            }\n+            else\n+                ppos = target->GetFirstCollisionPosition(dist, Position::NormalizeOrientation(angle - target->GetOrientation()));\n+            //target->GetNearPoint(me->GetVehicleBase(), x, y, z, 0.f, dist, Position::NormalizeOrientation(angle));\n+\n+            bool toofar = master->GetDistance(ppos) > (followdist > 30.f ? 60.f : followdist < 10 ? 20.f : float(followdist*2));\n+            bool isinaoe = (i == 0 && me->GetVehicleBase()->GetDistance(ppos) < 4.f && IsWithinAoERadius(*me->GetVehicleBase())) || IsWithinAoERadius(ppos);\n+            if (!toofar && !isinaoe)\n+                break;\n+\n+            if (toofar)\n+            {\n+                if (i >= 1)\n+                    angle += -(clockwise) * angleDelta1/* * i*/;\n+                if (i >= 2)\n+                    dist = std::max(0.f, dist - 5.f);\n+            }\n+            if (isinaoe)\n+            {\n+                //BOT_LOG_ERROR(\"scripts\", \"CalculateAttackPos {} veh skipped aoe pos\", me->GetName());\n+                if (me->GetVehicleBase()->CanFly())\n+                    ppos.m_positionZ += (master->GetPositionZ() < target->GetPositionZ()) ? -8.f : 8.f;\n+                else\n+                    angle += angleDelta2 * 2.f;\n+            }\n+        }\n+\n+        pos.Relocate(ppos);\n+        //pos.m_positionX = x;\n+        //pos.m_positionY = y;\n+        //pos.m_positionZ = z;\n+\n+        return;\n+    }\n+\n+    AoeSpotsVec const& aoespots = GetAoeSpots();\n+\n+    bool toofaraway;\n+\n+    if (!aoespots.empty())\n+    {\n+        ppos.Relocate(me);\n+        toofaraway = master->GetDistance(ppos) > (followdist > 38 ? 38.f : followdist < 20 ? 20.f : float(followdist));\n+        bool outoflos = !target->IsWithinLOS(ppos.m_positionX, ppos.m_positionY, ppos.m_positionZ);\n+        bool isinaoe = IsWithinAoERadius(ppos);\n+        bool canattack = HasRole(BOT_ROLE_RANGED) || me->IsWithinMeleeRangeAt(ppos, target);\n+        if (!toofaraway && !outoflos && !isinaoe && canattack)\n+        {\n+            //if (!aoespots.empty())\n+            //    BOT_LOG_ERROR(\"scripts\", \"CalculateAttackPos {} spot is still safe\", me->GetName());\n+\n+            pos.Relocate(ppos);\n+            return;\n+        }\n+    }\n+\n+    AoeSafeSpotsVec safespots = CalculateAoeSafeSpots(target, float(followdist));\n+\n+    bool angle_reset_to_master = false;\n+    uint8 collision_dist_max = IAmFree() ? 30 : 38;\n+    for (auto i : NPCBots::index_array<uint8, 5>)\n+    {\n+        ppos = target->GetFirstCollisionPosition(dist, Position::NormalizeOrientation(angle - target->GetOrientation()));\n+        toofaraway = master->GetDistance(ppos) > (followdist > collision_dist_max ? float(collision_dist_max) : followdist < 20 ? 20.f : float(followdist));\n+        if (!toofaraway)\n+            break;\n+\n+        if (!angle_reset_to_master)\n+        {\n+            angle_reset_to_master = true;\n+            angle = target->GetAbsoluteAngle(master);\n+        }\n+        else\n+            angle += angleDelta1;\n+\n+        if (i >= 1 && i <= 3)\n+            dist = std::max<float>(0.f, dist - 5.f);\n+    }\n+\n+    if (!safespots.empty())\n+    {\n+        //find closest safe spot\n+        Position const* closestPos = nullptr;\n+        Position const* closestAttackPos = nullptr;\n+        float minposdist = 100.f;\n+        float minattackposdist = 100.f;\n+        for (Position const& safepos : safespots)\n+        {\n+            float curdist = me->GetExactDist2d(safepos);\n+            if (curdist < minposdist)\n+            {\n+                closestPos = &safepos;\n+                minposdist = curdist;\n+            }\n+            if (curdist < minattackposdist &&\n+                (HasRole(BOT_ROLE_RANGED) ? (target->GetDistance(safepos) - me->GetCombatReach() < dist) : me->IsWithinMeleeRangeAt(safepos, target)))\n+            {\n+                closestAttackPos = &safepos;\n+                minattackposdist = curdist;\n+            }\n+        }\n+\n+        //BOT_LOG_ERROR(\"scripts\", \"CalculateAttackPos {} safe spots, chosen at dist {}\", uint32(safespots.size()), mindist);\n+        pos.Relocate(closestAttackPos ? closestAttackPos : closestPos ? closestPos : me);\n+        force = true;\n+        return;\n+    }\n+    else if (!aoespots.empty() && !IAmFree())\n+    {\n+        pos.Relocate(master);\n+        force = true;\n+        return;\n+    }\n+\n+    // Ranged bots that are being targeted should move towards a tank bot or towards the player\n+    if (!IAmFree() && !IsTank(me) && HasRole(BOT_ROLE_RANGED) && target->GetVictim() == me && !CCed(target))\n+    {\n+        std::vector<Unit const*> safetyTargets;\n+        if (Group const* gr = master->GetGroup())\n+        {\n+            for (GroupReference const* itr = gr->GetFirstMember(); itr != nullptr; itr = itr->next())\n+            {\n+                Player const* pl = itr->GetSource();\n+                if (!pl || !pl->IsInMap(me) || pl->GetDistance(me) > VISIBILITY_DISTANCE_NORMAL)\n+                    continue;\n+                if (pl->IsAlive() && !pl->HasUnitState(UNIT_STATE_ISOLATED) && IsTank(pl))\n+                    safetyTargets.push_back(pl);\n+                if (!pl->HaveBot())\n+                    continue;\n+                for (auto const& [_, c] : *pl->GetBotMgr()->GetBotMap())\n+                {\n+                    if (c && c->IsInWorld() && me->GetMap() == c->FindMap() && c->IsAlive() && !c->HasUnitState(UNIT_STATE_ISOLATED) && IsTank(c) && c->GetBotAI()->HasRole(BOT_ROLE_DPS))\n+                        safetyTargets.push_back(c);\n+                }\n+            }\n+        }\n+        else\n+        {\n+            for (auto const& [_, c] : *master->GetBotMgr()->GetBotMap())\n+            {\n+                if (c && c->IsInWorld() && me->GetMap() == c->FindMap() && c->IsAlive() && !c->HasUnitState(UNIT_STATE_ISOLATED) && IsTank(c) && c->GetBotAI()->HasRole(BOT_ROLE_DPS))\n+                    safetyTargets.push_back(c);\n+            }\n+        }\n+        if (safetyTargets.empty() && master->IsAlive())\n+            safetyTargets.push_back(master);\n+\n+        if (!safetyTargets.empty())\n+        {\n+            static const float ThresholdDistance = 1.5f;\n+            Unit const* moveTarget = safetyTargets.size() == 1u ? safetyTargets.front() : safetyTargets[me->GetEntry() % safetyTargets.size()];\n+            if (moveTarget->GetDistance(target) > ThresholdDistance && me->GetDistance(moveTarget) > ThresholdDistance * 2.0f)\n+            {\n+                float distanceMod = moveTarget->HasInArc(float(M_PI), target) ? 0.5f : -1.5f;\n+                pos.Relocate(moveTarget->GetFirstCollisionPosition(ThresholdDistance * distanceMod, Position::NormalizeOrientation(moveTarget->GetAbsoluteAngle(target) - moveTarget->GetOrientation())));\n+                force = true;\n+                return;\n+            }\n+        }\n+    }\n+\n+    pos.Relocate(ppos);\n+    if (!me->IsWithinLOSInMap(target, LINEOFSIGHT_ALL_CHECKS, VMAP::ModelIgnoreFlags::M2))\n+        force = true;\n+}\n+// Forces bot to chase opponent (if ranged then distance depends on follow distance)\n+void bot_ai::GetInPosition(bool force, Unit* newtarget, Position* mypos)\n+{\n+    Unit* mover = me->GetVehicle() ? me->GetVehicleBase() : me;\n+    if (HasBotCommandState(BOT_COMMAND_STAY))\n+        return;\n+    if (!IAmFree() && !master->GetBotMgr()->GetBotAllowCombatPositioning())\n+        return;\n+    if (CCed(mover, true) || (mover == me && JumpingOrFalling()))\n+        return;\n+    if (!newtarget)\n+        newtarget = me->GetVictim();\n+    if (!newtarget)\n+        return;\n+    if ((!newtarget->IsInCombat() || (mover->isMoving()/* && Rand() > 50*/)) && !force && !(_atHome && _evadeMode))\n+        return;\n+    if (IsCasting(mover))\n+        return;\n+    if (IsShootingWand(mover) && newtarget->GetVictim() == mover)\n+        return;\n+    if (UpdateImpossibleChase(newtarget))\n+        return;\n+    if (AdjustTankingPosition(newtarget))\n+        return;\n+\n+    if (!IAmFree() && master->GetBotMgr()->GetBotAttackRangeMode() == BOT_ATTACK_RANGE_EXACT &&\n+        master->GetBotMgr()->GetBotExactAttackRange() == 0)\n+    {\n+        attackpos.m_positionX = newtarget->GetPositionX() - frand(0.5f, 1.5f) * std::cos(me->GetAbsoluteAngle(newtarget));\n+        attackpos.m_positionY = newtarget->GetPositionY() - frand(0.5f, 1.5f) * std::sin(me->GetAbsoluteAngle(newtarget));\n+        attackpos.m_positionZ = newtarget->GetPositionZ();\n+        if (me->GetExactDist2d(&attackpos) > 3.5f)\n+            BotMovement(BOT_MOVE_POINT, &attackpos);\n+            //me->GetMotionMaster()->MovePoint(newtarget->GetMapId(), attackpos);\n+        return;\n+    }\n+\n+    uint8 followdist = IAmFree() ? BotMgr::GetBotFollowDistMax() : master->GetBotMgr()->GetBotFollowDist();\n+    if (IsRanged() || (!IAmFree() && !GetAoeSpots().empty()))\n+    {\n+        //do not allow constant runaway from player\n+        if (!force && newtarget->IsPlayer() &&\n+            me->GetDistance(newtarget) < float(6 + urand(followdist/4, followdist/3)))\n+            return;\n+\n+        if (!mypos)\n+            CalculateAttackPos(newtarget, attackpos, force);\n+        else\n+        {\n+            attackpos.m_positionX = mypos->m_positionX;\n+            attackpos.m_positionY = mypos->m_positionY;\n+            attackpos.m_positionZ = mypos->m_positionZ;\n+        }\n+        //BOT_LOG_ERROR(\"scripts\", \"GetInPosition {} to {} dist {}, to pos {}\", me->GetName(),\n+        //    newtarget->GetName(), me->GetExactDist2d(newtarget), me->GetExactDist2d(&attackpos));\n+        if (mover->GetExactDist2d(&attackpos) > (force ? 0.1f : 4.f))\n+        {\n+            BotMovement(BOT_MOVE_POINT, &attackpos);\n+            //me->GetMotionMaster()->MovePoint(newtarget->GetMapId(), attackpos);\n+            if (mover == me && !me->HasUnitState(UNIT_STATE_MELEE_ATTACKING) && CanBotAttackOnVehicle())\n+                me->SetInFront(newtarget);\n+            else if (!mover->HasUnitState(UNIT_STATE_MELEE_ATTACKING))\n+                mover->SetInFront(newtarget);\n+        }\n+    }\n+    else\n+    {\n+        if (!JumpingOrFalling() && ((!mover->HasUnitState(UNIT_STATE_CHASE) && !mover->isMoving()) || (!mover->HasUnitState(UNIT_STATE_CHASE_MOVE) && mover->GetDistance(newtarget) > 1.5f)))\n+            BotMovement(BOT_MOVE_CHASE, nullptr, newtarget);\n+            //me->GetMotionMaster()->MoveChase(newtarget);\n+    }\n+\n+    if (newtarget != me->GetVictim() && (mover == me || CanBotAttackOnVehicle()))\n+    {\n+        if (!me->Attack(newtarget, !HasRole(BOT_ROLE_RANGED)))\n+            me->SetInFront(newtarget);\n+    }\n+}\n+//Bots cannot dodge/parry from behind so try to condense enemies at front\n+//opponent is always valid\n+bool bot_ai::AdjustTankingPosition(Unit const* mytarget) const\n+{\n+    //problem: chasing unit is constantly moving. Whoever the hell did that\n+//    if (/*!IsTank() || */!me->IsInCombat() || me->isMoving() || IsCasting() ||\n+//        JumpingOrFalling() || CCed(me, true) || Rand() > 10 + 20*me->GetMap()->IsDungeon())\n+//        return;\n+    if (/*!IsTank() || */!me->IsInCombat() || IsCasting() || me->GetVehicle() ||\n+        JumpingOrFalling() || CCed(me, true) || Rand() > 10 + 20*me->GetMap()->IsDungeon() ||\n+        HasBotCommandState(BOT_COMMAND_MASK_UNMOVING))\n+        return false;\n+\n+    Unit::AttackerSet const& myattackers = me->getAttackers();\n+    if (myattackers.size() < 2)\n+        return false;\n+\n+    if (IsMelee())\n+    {\n+        if (!me->IsWithinMeleeRange(mytarget))\n+            return false;\n+    }\n+    else\n+    {\n+        uint8 rangeMode = IAmFree() ? uint8(BOT_ATTACK_RANGE_LONG) : master->GetBotMgr()->GetBotAttackRangeMode();\n+        uint8 exactRange = rangeMode != BOT_ATTACK_RANGE_EXACT || IAmFree() ? 255 : master->GetBotMgr()->GetBotExactAttackRange();\n+        float dist = (rangeMode == BOT_ATTACK_RANGE_EXACT) ? exactRange : GetSpellAttackRange(rangeMode == BOT_ATTACK_RANGE_LONG);\n+\n+        if (me->GetDistance(mytarget) > dist)\n+            return false;\n+    }\n+\n+    //BOT_LOG_ERROR(\"entities.player\", \"AdjustTankPosition() by {}\", me->GetName());\n+\n+    uint32 bCount = 0;\n+    for (Unit const* u : myattackers)\n+    {\n+        if (/*!CCed(u) && */u->IsWithinMeleeRange(me) && !me->HasInArc(float(M_PI), u))\n+            ++bCount;\n+            //if (++bCount)\n+            //    break;\n+    }\n+\n+    if (bCount == 0)\n+        return false;\n+\n+    //BOT_LOG_ERROR(\"entities.player\", \"AdjustTankPosition(): atts {}, behind {}\", uint32(myattackers.size()), bCount);\n+\n+    //calculate new position\n+    float x = me->GetPositionX();\n+    float y = me->GetPositionY();\n+    float z = me->GetPositionZ();\n+    float ori = CCed(mytarget, true) ? me->GetOrientation() + 0.75f * M_PI : me->GetOrientation();\n+    float const moveDist = -1.f * std::max<float>(mytarget->GetCombatReach(), 3.f);\n+    float moveX;\n+    float moveY;\n+    //bool move = false;\n+    for (auto i : NPCBots::index_array<uint32, 6>)\n+    {\n+        if (i)\n+        {\n+            ori = Position::NormalizeOrientation(ori + (i+1)*(M_PI*0.31f));\n+        }\n+\n+        //move back\n+        moveX = moveDist * std::cos(ori);\n+        moveY = moveDist * std::sin(ori);\n+\n+        Position ppos;\n+        ppos.Relocate(x+moveX, y+moveY, z);\n+        if (me->IsWithinLOS(x+moveX, y+moveY, z) && !IsWithinAoERadius(ppos))\n+            break;\n+\n+        if (i == 2u)\n+        {\n+            moveX *= 0.2f;\n+            moveY *= 0.2f;\n+        }\n+    }\n+\n+    x+= moveX;\n+    y+= moveY;\n+\n+    me->UpdateAllowedPositionZ(x, y, z);\n+    if (me->GetPositionZ() < z)\n+        z += 0.75f; //prevent going underground\n+\n+    //if (CCed(mytarget, true))\n+    //    me->AttackStop();\n+    //me->SetOrientation(ori);\n+    Position position;\n+    position.Relocate(x, y, z);\n+    BotMovement(BOT_MOVE_POINT, &position);\n+    //me->GetMotionMaster()->MovePoint(me->GetMapId(), x, y, z, false);\n+    return true;\n+}\n+\n+void bot_ai::CheckAttackState()\n+{\n+    if (me->GetVictim() && me->GetVictim()->IsAlive())\n+    {\n+        if (HasRole(BOT_ROLE_DPS) && !me->HasAuraType(SPELL_AURA_MOD_STEALTH) && !me->HasAuraType(SPELL_AURA_MOD_INVISIBILITY) &&\n+            !IsShootingWand())\n+            DoMeleeAttackIfReady();\n+    }\n+}\n+//Move behind current target if needed (avoid cleaves and dodges/parries, also rogues/ferals)\n+void bot_ai::MoveBehind(Unit const* target) const\n+{\n+    if (_moveBehindTimer > lastdiff || HasBotCommandState(BOT_COMMAND_MASK_UNMOVING) || HasRole(BOT_ROLE_RANGED) || JumpingOrFalling() ||\n+        /*(me->isMoving() && !target->IsPlayer()) ||*/\n+        me->GetVehicle() || (IsTank() && target->GetVictim() == me) || CCed(me, true) ||\n+        !target->IsWithinCombatRange(me, ATTACK_DISTANCE) || !target->HasInArc(float(M_PI), me))\n+        return;\n+\n+    const bool targetMe = target->GetVictim() == me;\n+    const bool cced = CCed(target);\n+    const bool isPlayer = target->IsPlayer();\n+\n+    if ((_botclass == BOT_CLASS_ROGUE || GetBotStance() == DRUID_CAT_FORM) ? (!targetMe || cced || isPlayer) : (!targetMe && (!cced || isPlayer)))\n+    {\n+        float myangle = Position::NormalizeOrientation(target->GetAbsoluteAngle(me) + float(M_PI));\n+        float mydist = me->GetCombatReach();\n+        Position position;\n+        target->GetNearPoint(me, position.m_positionX, position.m_positionY, position.m_positionZ, mydist, myangle);\n+\n+        if (IsWithinAoERadius(position))\n+            return;\n+\n+        BotMovement(BOT_MOVE_POINT, &position);\n+        const_cast<bot_ai*>(this)->_moveBehindTimer = urand(1000, (_botclass == BOT_CLASS_ROGUE || GetBotStance() == DRUID_CAT_FORM) ? 2000 : 4000);\n+    }\n+}\n+//MOUNT SUPPORT\n+uint32 bot_ai::_selectMountSpell() const\n+{\n+    uint8 minLevel60 = BotCfg::GetNpcBotMountLevel60();\n+    uint8 minLevel100 = BotCfg::GetNpcBotMountLevel100();\n+\n+    if (me->GetLevel() < minLevel60)\n+        return 0;\n+\n+    uint32 myMountSpellId = 0;\n+    uint32 masterMountSpellId = 0;\n+\n+    InstanceTemplate const* instt = sObjectMgr->GetInstanceTemplate(me->GetMap()->GetId());\n+    bool map_allows_mount = (!me->GetMap()->IsDungeon() || me->GetMap()->IsBattlegroundOrArena()) && (!instt || instt->AllowMount);\n+    if (!IAmFree() ? !master->IsMounted() : !(map_allows_mount && evadeDelayTimer < lastdiff * 2))\n+        return 0;\n+\n+    Unit::AuraEffectList const& mounts = master->GetAuraEffectsByType(SPELL_AURA_MOUNTED);\n+    int32 maxMountSpeed = !IAmFree() ? 0 : 999;\n+    const bool master_can_fly = master->CanFly();\n+    if (!IAmFree())\n+    {\n+        Aura const* mountAura = nullptr;\n+        for (AuraEffect const* meff : mounts)\n+        {\n+            for (auto i : NPCBots::index_array<uint8, MAX_SPELL_EFFECTS>)\n+            {\n+                AuraEffect const* maeff = meff->GetBase()->GetEffect(i);\n+                if (maeff && (maeff->GetSpellEffectInfo().IsAura(master_can_fly ? SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED : SPELL_AURA_MOD_INCREASE_MOUNTED_SPEED)) &&\n+                    maeff->GetAmount() > maxMountSpeed)\n+                {\n+                    maxMountSpeed = maeff->GetAmount();\n+                    mountAura = meff->GetBase();\n+                }\n+            }\n+        }\n+\n+        if (maxMountSpeed < 20)\n+            return 0;\n+\n+        masterMountSpellId = mountAura ? mountAura->GetId() : 0;\n+    }\n+\n+    //Winter Veil addition\n+    if (sGameEventMgr->IsActiveEvent(GAME_EVENT_WINTER_VEIL))\n+        myMountSpellId = master_can_fly ? REINDEER_FLY : REINDEER;\n+    if (!myMountSpellId && me->GetMapId() == 531) //Ahn'Qiraj\n+    {\n+        //Select AQ40 mount\n+        static const std::array<uint32, 4> QirajiMountSpellIds = { QIRAJI_BATTLE_TANK_1, QIRAJI_BATTLE_TANK_2, QIRAJI_BATTLE_TANK_3, QIRAJI_BATTLE_TANK_4 };\n+        //Count Black Qiraji Battle Tank too\n+        if (masterMountSpellId == 26656 || std::ranges::find(QirajiMountSpellIds, masterMountSpellId) != QirajiMountSpellIds.cend())\n+            myMountSpellId = QirajiMountSpellIds[me->GetEntry() % QirajiMountSpellIds.size()];\n+    }\n+\n+    if (!myMountSpellId)\n+    {\n+        using MountArray = std::array<uint32, NUM_MOUNTS_PER_SPEED>;\n+\n+        bool can_fly = !IAmFree() && master_can_fly; //(!instt && me->GetMap()->GetEntry()->ExpansionID > 0);\n+        bool useSlowMount = can_fly ? (me->GetLevel() < 70 || maxMountSpeed < 220) : (me->GetLevel() < minLevel100 || maxMountSpeed < 80);\n+\n+        if (!can_fly)\n+        {\n+            //Select by class\n+            switch (_botclass)\n+            {\n+                case BOT_CLASS_DARK_RANGER:\n+                    myMountSpellId = BOT_DARK_RANGER_MOUNT;\n+                    break;\n+                case BOT_CLASS_WARLOCK:\n+                    myMountSpellId = useSlowMount ? BOT_WARLOCK_MOUNT : BOT_WARLOCK_FAST_MOUNT;\n+                    break;\n+                case BOT_CLASS_PALADIN:\n+                    if (me->GetRace() == RACE_BLOODELF)\n+                        myMountSpellId = useSlowMount ? BOT_BE_PALLY_MOUNT : BOT_BE_PALLY_FAST_MOUNT;\n+                    else\n+                        myMountSpellId = useSlowMount ? BOT_ALLI_PALLY_MOUNT : BOT_ALLI_PALLY_FAST_MOUNT;\n+                    break;\n+                case BOT_CLASS_DEATH_KNIGHT:\n+                    myMountSpellId = BOT_DEATH_KNIGHT_MOUNT;\n+                    break;\n+                default:\n+                    break;\n+            }\n+            //Select by race\n+            if (!myMountSpellId)\n+            {\n+                static const MountArray MOUNTS_60_HUMAN = { BOT_MOUNT_HUMAN_60_1, BOT_MOUNT_HUMAN_60_2, BOT_MOUNT_HUMAN_60_3 };\n+                static const MountArray MOUNTS_60_ORC = { BOT_MOUNT_ORC_60_1, BOT_MOUNT_ORC_60_2, BOT_MOUNT_ORC_60_3 };\n+                static const MountArray MOUNTS_60_DWARF = { BOT_MOUNT_DWARF_60_1, BOT_MOUNT_DWARF_60_2, BOT_MOUNT_DWARF_60_3 };\n+                static const MountArray MOUNTS_60_NIGHTELF = { BOT_MOUNT_NIGHTELF_60_1, BOT_MOUNT_NIGHTELF_60_2, BOT_MOUNT_NIGHTELF_60_3 };\n+                static const MountArray MOUNTS_60_FORSAKEN = { BOT_MOUNT_FORSAKEN_60_1, BOT_MOUNT_FORSAKEN_60_2, BOT_MOUNT_FORSAKEN_60_3 };\n+                static const MountArray MOUNTS_60_TAUREN = { BOT_MOUNT_TAUREN_60_1, BOT_MOUNT_TAUREN_60_2, BOT_MOUNT_TAUREN_60_3 };\n+                static const MountArray MOUNTS_60_GNOME = { BOT_MOUNT_GNOME_60_1, BOT_MOUNT_GNOME_60_2, BOT_MOUNT_GNOME_60_3 };\n+                static const MountArray MOUNTS_60_TROLL = { BOT_MOUNT_TROLL_60_1, BOT_MOUNT_TROLL_60_2, BOT_MOUNT_TROLL_60_3 };\n+                static const MountArray MOUNTS_60_BLOODELF = { BOT_MOUNT_BLOODELF_60_1, BOT_MOUNT_BLOODELF_60_2, BOT_MOUNT_BLOODELF_60_3 };\n+                static const MountArray MOUNTS_60_DRAENEI = { BOT_MOUNT_DRAENEI_60_1, BOT_MOUNT_DRAENEI_60_2, BOT_MOUNT_DRAENEI_60_3 };\n+\n+                static const MountArray MOUNTS_100_HUMAN = { BOT_MOUNT_HUMAN_100_1, BOT_MOUNT_HUMAN_100_2, BOT_MOUNT_HUMAN_100_3 };\n+                static const MountArray MOUNTS_100_ORC = { BOT_MOUNT_ORC_100_1, BOT_MOUNT_ORC_100_2, BOT_MOUNT_ORC_100_3 };\n+                static const MountArray MOUNTS_100_DWARF = { BOT_MOUNT_DWARF_100_1, BOT_MOUNT_DWARF_100_2, BOT_MOUNT_DWARF_100_3 };\n+                static const MountArray MOUNTS_100_NIGHTELF = { BOT_MOUNT_NIGHTELF_100_1, BOT_MOUNT_NIGHTELF_100_2, BOT_MOUNT_NIGHTELF_100_3 };\n+                static const MountArray MOUNTS_100_FORSAKEN = { BOT_MOUNT_FORSAKEN_100_1, BOT_MOUNT_FORSAKEN_100_2, BOT_MOUNT_FORSAKEN_100_3 };\n+                static const MountArray MOUNTS_100_TAUREN = { BOT_MOUNT_TAUREN_100_1, BOT_MOUNT_TAUREN_100_2, BOT_MOUNT_TAUREN_100_3 };\n+                static const MountArray MOUNTS_100_GNOME = { BOT_MOUNT_GNOME_100_1, BOT_MOUNT_GNOME_100_2, BOT_MOUNT_GNOME_100_3 };\n+                static const MountArray MOUNTS_100_TROLL = { BOT_MOUNT_TROLL_100_1, BOT_MOUNT_TROLL_100_2, BOT_MOUNT_TROLL_100_3 };\n+                static const MountArray MOUNTS_100_BLOODELF = { BOT_MOUNT_BLOODELF_100_1, BOT_MOUNT_BLOODELF_100_2, BOT_MOUNT_BLOODELF_100_3 };\n+                static const MountArray MOUNTS_100_DRAENEI = { BOT_MOUNT_DRAENEI_100_1, BOT_MOUNT_DRAENEI_100_2, BOT_MOUNT_DRAENEI_100_3 };\n+\n+                Optional<MountArray> myMounts;\n+                switch (me->GetRace())\n+                {\n+                    case RACE_HUMAN:         myMounts = useSlowMount ? MOUNTS_60_HUMAN : MOUNTS_100_HUMAN;       break;\n+                    case RACE_ORC:           myMounts = useSlowMount ? MOUNTS_60_ORC : MOUNTS_100_ORC;           break;\n+                    case RACE_DWARF:         myMounts = useSlowMount ? MOUNTS_60_DWARF : MOUNTS_100_DWARF;       break;\n+                    case RACE_NIGHTELF:      myMounts = useSlowMount ? MOUNTS_60_NIGHTELF : MOUNTS_100_NIGHTELF; break;\n+                    case RACE_UNDEAD_PLAYER: myMounts = useSlowMount ? MOUNTS_60_FORSAKEN : MOUNTS_100_FORSAKEN; break;\n+                    case RACE_TAUREN:        myMounts = useSlowMount ? MOUNTS_60_TAUREN : MOUNTS_100_TAUREN;     break;\n+                    case RACE_GNOME:         myMounts = useSlowMount ? MOUNTS_60_GNOME : MOUNTS_100_GNOME;       break;\n+                    case RACE_TROLL:         myMounts = useSlowMount ? MOUNTS_60_TROLL : MOUNTS_100_TROLL;       break;\n+                    case RACE_BLOODELF:      myMounts = useSlowMount ? MOUNTS_60_BLOODELF : MOUNTS_100_BLOODELF; break;\n+                    case RACE_DRAENEI:       myMounts = useSlowMount ? MOUNTS_60_DRAENEI : MOUNTS_100_DRAENEI;   break;\n+                    default:                                                                                     break;\n+                }\n+\n+                if (myMounts)\n+                    myMountSpellId = (*myMounts)[me->GetEntry() % myMounts->size()];\n+            }\n+        }\n+        else //if (can_fly)\n+        {\n+            if (GetBotClass() == BOT_CLASS_DRUID && GetSpell(33943))\n+                myMountSpellId = useSlowMount ? 33943 : GetSpell(33943);\n+            else\n+            {\n+                static const MountArray MOUNTS_150_ALLIANCE = { BOT_MOUNT_FLY_ALLIANCE_150_1, BOT_MOUNT_FLY_ALLIANCE_150_2, BOT_MOUNT_FLY_ALLIANCE_150_3 };\n+                static const MountArray MOUNTS_150_HORDE = { BOT_MOUNT_FLY_HORDE_150_1, BOT_MOUNT_FLY_HORDE_150_2, BOT_MOUNT_FLY_HORDE_150_3 };\n+                static const MountArray MOUNTS_280_ALLIANCE = { BOT_MOUNT_FLY_ALLIANCE_280_1, BOT_MOUNT_FLY_ALLIANCE_280_2, BOT_MOUNT_FLY_ALLIANCE_280_3 };\n+                static const MountArray MOUNTS_280_HORDE = { BOT_MOUNT_FLY_HORDE_280_1, BOT_MOUNT_FLY_HORDE_280_2, BOT_MOUNT_FLY_HORDE_280_3 };\n+\n+                Optional<MountArray> myMounts;\n+                if (me->GetRaceMask() & RACEMASK_ALLIANCE)\n+                    myMounts = useSlowMount ? MOUNTS_150_ALLIANCE : MOUNTS_280_ALLIANCE;\n+                else if (me->GetRaceMask() & RACEMASK_HORDE)\n+                    myMounts = useSlowMount ? MOUNTS_150_HORDE : MOUNTS_280_HORDE;\n+\n+                if (myMounts)\n+                    myMountSpellId = (*myMounts)[me->GetEntry() % myMounts->size()];\n+            }\n+        }\n+    }\n+\n+    if (!myMountSpellId) // shouldn't happen normally\n+    {\n+        if (masterMountSpellId)\n+            myMountSpellId = masterMountSpellId;\n+        else if (!mounts.empty())\n+            myMountSpellId = mounts.front()->GetId();\n+    }\n+\n+    return myMountSpellId;\n+}\n+void bot_ai::_updateMountedState()\n+{\n+    bool aura = me->HasAuraType(SPELL_AURA_MOUNTED);\n+    bool mounted = me->IsMounted() && (_botclass != BOT_CLASS_ARCHMAGE || aura);\n+    bool template_fly = me->GetCreatureTemplate()->Movement.Flight != CreatureFlightMovementType::None;\n+    bool druid_fly = GetBotStance() == DRUID_FLIGHT_FORM;\n+    Unit const* victim = me->GetVictim();\n+\n+    //allow dismount\n+    if (!CanMount() && !aura && !mounted && !druid_fly)\n+        return;\n+\n+    if ((aura || mounted || template_fly || druid_fly) &&\n+        (!master->IsMounted() || aura != mounted || (!mounted && !druid_fly && template_fly) ||\n+            (me->IsInCombat() && (opponent || disttarget)) ||\n+            (IAmFree() && victim && me->IsWithinDist(victim, IsMelee() ? 5.0f : GetSpellAttackRange(true), false))))\n+    {\n+        if (druid_fly)\n+            removeShapeshiftForm();\n+        else\n+            DismountBot();\n+        return;\n+    }\n+\n+    if (druid_fly || me->IsMounted() || me->GetVehicle() || me->HasUnitMovementFlag(MOVEMENTFLAG_SWIMMING) || !IsOutdoors() ||\n+        master->IsInCombat() || me->IsInCombat() || me->GetVictim() || IsCasting() || IsFlagCarrier(me) ||\n+        (HasBotCommandState(BOT_COMMAND_STAY) && GetBG() && GetBG()->GetStatus() != STATUS_IN_PROGRESS))\n+        return;\n+\n+    if (IAmFree())\n+    {\n+        if (!IsWanderer() || me->GetLevel() < BotCfg::GetNpcBotMountLevel60() || me->HasAuraType(SPELL_AURA_PERIODIC_DAMAGE) ||\n+            Feasting() || GetHealthPCT(me) < 80 || (CanDrink() && me->GetMaxPower(POWER_MANA) > 1 && GetManaPCT(me) < 70))\n+            return;\n+    }\n+\n+    if (uint32 mount_spell_id = _selectMountSpell())\n+    {\n+        if (me->HasAuraType(SPELL_AURA_MOUNTED))\n+            me->RemoveAurasByType(SPELL_AURA_MOUNTED);\n+\n+        if (!((_botclass == BOT_CLASS_DRUID || _botclass == BOT_CLASS_SHAMAN) && me->GetShapeshiftForm() != FORM_NONE) || removeShapeshiftForm())\n+            doCast(me, mount_spell_id);\n+    }\n+}\n+//STANDSTATE\n+void bot_ai::_updateStandState() const\n+{\n+    if (IAmFree())\n+    {\n+        if (CanSit() && !IsWanderer())\n+        {\n+            if (_atHome && !_evadeMode && !me->IsInCombat() && !me->isMoving() &&\n+                me->IsStandState() && Rand() < 15)\n+            {\n+                uint16 mapid;\n+                Position pos;\n+                GetHomePosition(mapid, &pos);\n+                if (me->GetExactDist(&pos) < 5 && me->GetOrientation() == pos.GetOrientation())\n+                {\n+                    if (_botclass == BOT_CLASS_DRUID && me->GetShapeshiftForm() != FORM_NONE)\n+                        const_cast<bot_ai*>(this)->removeShapeshiftForm();\n+\n+                    me->SetStandState(UNIT_STAND_STATE_SIT);\n+                }\n+            }\n+        }\n+        else if (me->IsSitState() && !me->HasInterruptFlag(AURA_INTERRUPT_FLAG_NOT_SEATED))\n+            me->SetStandState(UNIT_STAND_STATE_STAND);\n+\n+        return;\n+    }\n+\n+    if (me->GetVehicle())\n+        return;\n+\n+    if ((master->GetStandState() == UNIT_STAND_STATE_STAND || !CanSit()) &&\n+        me->GetStandState() == UNIT_STAND_STATE_SIT &&\n+        !me->HasInterruptFlag(AURA_INTERRUPT_FLAG_NOT_SEATED))\n+        me->SetStandState(UNIT_STAND_STATE_STAND);\n+    if (CanSit() && !me->IsInCombat() && !me->isMoving() &&\n+        (master->GetStandState() == UNIT_STAND_STATE_SIT || me->HasInterruptFlag(AURA_INTERRUPT_FLAG_NOT_SEATED)) &&\n+        me->GetStandState() == UNIT_STAND_STATE_STAND)\n+        me->SetStandState(UNIT_STAND_STATE_SIT);\n+}\n+//RATIONS\n+void bot_ai::_updateRations()\n+{\n+    bool noFeast = me->IsInCombat() || (BotCfg::IsFoodInterruptedByMovement() && me->isMoving()) || me->GetVictim() || CCed(me) || IsFlagCarrier(me);\n+\n+    //check\n+    if (IAmFree() || !master->IsSitState())\n+    {\n+        if (feast_mana)\n+        {\n+            if (noFeast || me->IsStandState() || me->GetMaxPower(POWER_MANA) <= 1 || me->GetPower(POWER_MANA) >= me->GetMaxPower(POWER_MANA))\n+            {\n+                std::vector<uint32> spellIds;\n+                spellIds.reserve(4);\n+                for (auto const& [spellId, auraApp] : me->GetAppliedAuras())\n+                    if (auraApp->GetBase()->GetSpellInfo()->GetSpellSpecific() == SPELL_SPECIFIC_DRINK &&\n+                        !auraApp->GetBase()->GetSpellInfo()->HasAura(SPELL_AURA_PERIODIC_TRIGGER_SPELL)) //skip buffing food\n+                        spellIds.push_back(spellId);\n+                for (uint32 spellId : spellIds)\n+                    me->RemoveAurasDueToSpell(spellId);\n+                feast_mana = false;\n+                UpdateMana();\n+            }\n+        }\n+        if (feast_health)\n+        {\n+            if (noFeast || me->IsStandState() || me->GetHealth() >= me->GetMaxHealth())\n+            {\n+                std::vector<uint32> spellIds;\n+                spellIds.reserve(4);\n+                for (auto const& [spellId, auraApp] : me->GetAppliedAuras())\n+                    if (auraApp->GetBase()->GetSpellInfo()->GetSpellSpecific() == SPELL_SPECIFIC_FOOD &&\n+                        !auraApp->GetBase()->GetSpellInfo()->HasAura(SPELL_AURA_PERIODIC_TRIGGER_SPELL)) //skip buffing food\n+                        spellIds.push_back(spellId);\n+                for (uint32 spellId : spellIds)\n+                    me->RemoveAurasDueToSpell(spellId);\n+                feast_health = false;\n+            }\n+        }\n+    }\n+\n+    if (noFeast)\n+        return;\n+\n+    //drink\n+    if (!feast_mana && me->GetMaxPower(POWER_MANA) > 1 && !me->HasAuraType(SPELL_AURA_MOUNTED) && !me->isMoving() && CanDrink() &&\n+        !me->IsInCombat() && !me->GetVehicle() && !IsCasting() && GetManaPCT(me) < 75 && urand(0, 100) < 20)\n+    {\n+        me->CastSpell(me, GetRation(true), true);\n+    }\n+\n+    //eat\n+    if (!feast_health && !me->HasAuraType(SPELL_AURA_MOUNTED) && !me->isMoving() && CanEat() &&\n+        !me->IsInCombat() && !me->GetVehicle() && !IsCasting() && GetHealthPCT(me) < 80 && urand(0, 100) < 20)\n+    {\n+        me->CastSpell(me, GetRation(false), true);\n+    }\n+}\n+//Health and Powers regeneration\n+//Rage regen is handled inside class AI UpdateAI()\n+void bot_ai::Regenerate()\n+{\n+    regenTimer += lastdiff;\n+\n+    //every tick\n+    if (me->GetPowerType() == POWER_ENERGY)\n+        RegenerateEnergy();\n+\n+    if (regenTimer >= REGEN_CD)\n+    {\n+        regenTimer -= REGEN_CD;\n+        // Regen Health\n+        int32 baseRegen = int32(_getTotalBotStat(BOT_STAT_MOD_HEALTH_REGEN));\n+        if ((!me->IsInCombat() || me->IsPolymorphed() || CanRegenInCombat() || baseRegen > 0 ||\n+            me->HasAuraType(SPELL_AURA_MOD_REGEN_DURING_COMBAT) || me->HasAuraType(SPELL_AURA_MOD_HEALTH_REGEN_IN_COMBAT)) &&\n+            me->GetHealth() < me->GetMaxHealth())\n+        {\n+            int32 add = me->IsInCombat() ? 0 : IAmFree() && !me->GetVictim() ? me->GetMaxHealth() / 64 : 5 + me->GetCreateHealth() / 256;\n+            if (baseRegen > 0)\n+                add += std::max<int32>(baseRegen / 5, 1);\n+\n+            //cannot eat\n+            if (_botclass == BOT_CLASS_SPHYNX)\n+                add += me->GetMaxHealth() / 100; //1%\n+\n+            if (me->IsPolymorphed())\n+                add += me->GetMaxHealth() / 6;\n+            else if (!me->IsInCombat() || me->HasAuraType(SPELL_AURA_MOD_REGEN_DURING_COMBAT))\n+            {\n+                if (!me->IsInCombat())\n+                {\n+                    for (AuraEffect const* aeff : me->GetAuraEffectsByType(SPELL_AURA_MOD_HEALTH_REGEN_PERCENT))\n+                        AddPct(add, aeff->GetAmount());\n+\n+                    add += me->GetTotalAuraModifier(SPELL_AURA_MOD_REGEN) * REGEN_CD / 5000;\n+                }\n+                else if (me->HasAuraType(SPELL_AURA_MOD_REGEN_DURING_COMBAT))\n+                    ApplyPct(add, me->GetTotalAuraModifier(SPELL_AURA_MOD_REGEN_DURING_COMBAT));\n+            }\n+\n+            add += me->GetTotalAuraModifier(SPELL_AURA_MOD_HEALTH_REGEN_IN_COMBAT);\n+\n+            if (add < 0)\n+                add = 0;\n+\n+            me->ModifyHealth(add);\n+        }\n+\n+        // Regen Mana\n+        if (me->GetMaxPower(POWER_MANA) > 1 &&\n+            (me->GetPower(POWER_MANA) < me->GetMaxPower(POWER_MANA) || _botclass == BOT_CLASS_SPHYNX))\n+        {\n+            float addvalue;\n+            if (me->IsUnderLastManaUseEffect())\n+                addvalue = me->GetFloatValue(UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER);\n+            else\n+                addvalue = me->GetFloatValue(UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER);\n+\n+            addvalue *= sWorld->getRate(RATE_POWER_MANA) * float(REGEN_CD) * 0.001f; //regenTimer threshold / 1000\n+\n+            if (addvalue < 0.0f)\n+                addvalue = 0.0f;\n+\n+            if (_botclass == BOT_CLASS_SPHYNX)\n+                addvalue *= -1.f;\n+\n+            me->ModifyPower(POWER_MANA, int32(addvalue));\n+        }\n+    }\n+}\n+\n+void bot_ai::RegenerateEnergy()\n+{\n+    uint32 curValue = me->GetPower(POWER_ENERGY);\n+    uint32 maxValue = me->GetMaxPower(POWER_ENERGY);\n+\n+    if (curValue < maxValue)\n+    {\n+        float addvalue = 0.01f * lastdiff * sWorld->getRate(RATE_POWER_ENERGY); //10 per sec\n+        for (AuraEffect const* aeff : me->GetAuraEffectsByType(SPELL_AURA_MOD_POWER_REGEN_PERCENT))\n+            if (Powers(aeff->GetMiscValue()) == POWER_ENERGY)\n+                AddPct(addvalue, aeff->GetAmount());\n+\n+        //not present in db\n+        //addvalue += me->GetTotalAuraModifierByMiscValue(SPELL_AURA_MOD_POWER_REGEN, POWER_ENERGY) * lastdiff / 5000;\n+        //me->ModifyPower(POWER_ENERGY, int32(addvalue));\n+\n+        addvalue += _energyFraction;\n+\n+        if (addvalue == 0x0) //only if world rate for enegy is 0\n+            return;\n+\n+        uint32 integerValue = uint32(fabs(addvalue));\n+\n+        curValue += integerValue;\n+\n+        if (curValue > maxValue)\n+        {\n+            curValue = maxValue;\n+            _energyFraction = 0.f;\n+        }\n+        else\n+            _energyFraction = addvalue - float(integerValue);\n+\n+        if (curValue == maxValue || regenTimer >= REGEN_CD)\n+            me->SetPower(POWER_ENERGY, curValue);\n+        else\n+            me->UpdateUInt32Value(UNIT_FIELD_POWER1 + uint16(POWER_ENERGY), curValue);\n+    }\n+}\n+\n+bool bot_ai::Feasting() const\n+{\n+    if (!me->HasInterruptFlag(AURA_INTERRUPT_FLAG_NOT_SEATED))\n+        return false;\n+\n+    return\n+        me->IsSitState() &&\n+        (me->HasAuraType(SPELL_AURA_MOD_REGEN)       || me->HasAuraType(SPELL_AURA_OBS_MOD_HEALTH) ||\n+         me->HasAuraType(SPELL_AURA_MOD_POWER_REGEN) || me->HasAuraType(SPELL_AURA_OBS_MOD_POWER));\n+}\n+uint32 bot_ai::GetRation(bool drink) const\n+{\n+    for (auto i : NPCBots::index_array<uint8, MAX_FEAST_SPELLS>)\n+        if (me->GetLevel() >= (drink ? DrinkSpells[i][0] : EatSpells[i][0]))\n+            return (drink ? DrinkSpells[i][1] : EatSpells[i][1]);\n+\n+    return (drink ? DrinkSpells[0][1] : EatSpells[0][1]);\n+}\n+\n+void bot_ai::DrinkPotion(bool mana)\n+{\n+    if (IsCasting())\n+        return;\n+\n+    me->CastSpell(me, GetPotion(mana));\n+}\n+bool bot_ai::IsPotionReady() const\n+{\n+    return _potionTimer <= lastdiff;\n+}\n+uint32 bot_ai::GetPotion(bool mana) const\n+{\n+    for (auto i : NPCBots::index_array<uint8, MAX_POTION_SPELLS>)\n+        if (me->GetLevel() >= (mana ? ManaPotionSpells[i][0] : HealingPotionSpells[i][0]))\n+            return (mana ? ManaPotionSpells[i][1] : HealingPotionSpells[i][1]);\n+\n+    return (mana ? ManaPotionSpells[0][1] : HealingPotionSpells[0][1]);\n+}\n+bool bot_ai::IsPotionSpell(uint32 spellId) const\n+{\n+    return spellId == GetPotion(true) || spellId == GetPotion(false);\n+}\n+\n+static BotItemUseSpellTargeting SelectTargeTypetForItemSpell(uint32 spellId, Unit const* caster)\n+{\n+    SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);\n+    if (!spellInfo || spellInfo->CalcCastTime() > 1500)\n+        return BOT_ITEM_USE_SPELL_TARGET_NONE;\n+\n+    TSpellSummary const& sum = SpellSummary[spellId];\n+    if (sum.Effects & (1u << (SELECT_EFFECT_DAMAGE-1)))\n+    {\n+        if (sum.Targets & ((1u << (SELECT_TARGET_SINGLE_ENEMY-1)) | (1u << (SELECT_TARGET_ANY_ENEMY-1))))\n+            return BOT_ITEM_USE_SPELL_TARGET_ATTACKTARGET;\n+        else if (sum.Targets & (1u << (SELECT_TARGET_AOE_ENEMY-1)))\n+            return BOT_ITEM_USE_SPELL_TARGET_SELF;\n+    }\n+    else if (sum.Effects & (1u << (SELECT_EFFECT_HEALING-1)))\n+    {\n+        if (sum.Targets & ((1u << (SELECT_TARGET_SELF-1)) | (1u << (SELECT_TARGET_SINGLE_FRIEND-1)) | (1u << (SELECT_TARGET_AOE_FRIEND-1)) | (1u << (SELECT_TARGET_ANY_FRIEND-1))))\n+            if (caster->GetHealthPct() < 75.f)\n+                return BOT_ITEM_USE_SPELL_TARGET_SELF;\n+    }\n+    else if (sum.Effects & (1u << (SELECT_EFFECT_AURA-1)))\n+    {\n+        if (sum.Targets & ((1u << (SELECT_TARGET_SELF-1)) | (1u << (SELECT_TARGET_AOE_FRIEND-1)) | (1u << (SELECT_TARGET_AOE_ENEMY-1))))\n+            return BOT_ITEM_USE_SPELL_TARGET_SELF;\n+        else if (sum.Targets & ((1u << (SELECT_TARGET_SINGLE_FRIEND-1)) | (1u << (SELECT_TARGET_ANY_FRIEND-1))))\n+            return BOT_ITEM_USE_SPELL_TARGET_ALLY;\n+        else if (sum.Targets & ((1u << (SELECT_TARGET_SINGLE_ENEMY-1)) | (1u << (SELECT_TARGET_ANY_ENEMY-1))))\n+            return BOT_ITEM_USE_SPELL_TARGET_ATTACKTARGET;\n+    }\n+    else // if (sum.Effects == 0)\n+    {\n+        if (sum.Targets & ((1u << (SELECT_TARGET_SINGLE_ENEMY-1)) | (1u << (SELECT_TARGET_ANY_ENEMY-1))))\n+            return BOT_ITEM_USE_SPELL_TARGET_ATTACKTARGET;\n+        else if (sum.Targets & ((1u << (SELECT_TARGET_AOE_ENEMY-1)) | (1u << (SELECT_TARGET_SELF-1)) | (1u << (SELECT_TARGET_SINGLE_FRIEND-1)) | (1u << (SELECT_TARGET_AOE_FRIEND-1)) | (1u << (SELECT_TARGET_ANY_FRIEND-1))))\n+            return BOT_ITEM_USE_SPELL_TARGET_SELF;\n+        else // if (sum.Targets == 0)\n+            return BOT_ITEM_USE_SPELL_TARGET_SELF;\n+    }\n+\n+    return BOT_ITEM_USE_SPELL_TARGET_NONE;\n+}\n+bool bot_ai::IsUsableItem(Item const* item)\n+{\n+    if (ItemTemplate const* proto = item->GetTemplate())\n+    {\n+        for (auto const& itemSpell : proto->Spells)\n+        {\n+            if (itemSpell.SpellId != 0 && itemSpell.SpellTrigger == ITEM_SPELLTRIGGER_ON_USE)\n+                return true;\n+        }\n+    }\n+\n+    return false;\n+}\n+uint32 bot_ai::GetItemSpellCooldown(uint32 spellId) const\n+{\n+    for (Item const* item : _equips)\n+    {\n+        if (item && IsUsableItem(item))\n+        {\n+            ItemTemplate const* proto = item->GetTemplate();\n+            for (auto const& itemSpell : proto->Spells)\n+            {\n+                if (itemSpell.SpellId == decltype(itemSpell.SpellId)(spellId))\n+                    return itemSpell.SpellCooldown;\n+            }\n+        }\n+    }\n+\n+    return 0;\n+}\n+void bot_ai::CheckUsableItems(uint32 diff)\n+{\n+    if (!_usableItemSlotsMask || itemsAutouseTimer > diff || !me->IsInCombat() || IsCasting() || (!me->GetVictim() && me->getAttackers().empty()))\n+        return;\n+\n+    itemsAutouseTimer = urand(2500, 5500);\n+\n+    for (auto slot : NPCBots::index_array<uint8, BOT_INVENTORY_SIZE>)\n+    {\n+        if (_usableItemSlotsMask & (1ul << slot))\n+        {\n+            if (Item const* item = _equips[slot])\n+            {\n+                bool is_spell_ready = false;\n+                uint32 firstItemSpellId = 0;\n+                for (auto const& itemSpell : item->GetTemplate()->Spells)\n+                {\n+                    if (itemSpell.SpellId > 0 && itemSpell.SpellTrigger == ITEM_SPELLTRIGGER_ON_USE)\n+                    {\n+                        if (firstItemSpellId == 0)\n+                            firstItemSpellId = itemSpell.SpellId;\n+\n+                        if (IsSpellReady(itemSpell.SpellId, diff, false))\n+                            is_spell_ready = true;\n+                        else\n+                        {\n+                            is_spell_ready = false;\n+                            break;\n+                        }\n+                    }\n+                }\n+                if (!is_spell_ready)\n+                    continue;\n+\n+                uint32 targetType = SelectTargeTypetForItemSpell(firstItemSpellId, me);\n+                Unit* castTarget = nullptr;\n+                switch (targetType)\n+                {\n+                    case BOT_ITEM_USE_SPELL_TARGET_SELF:\n+                        castTarget = me;\n+                        break;\n+                    case BOT_ITEM_USE_SPELL_TARGET_ATTACKTARGET:\n+                        castTarget = me->GetVictim();\n+                        break;\n+                    case BOT_ITEM_USE_SPELL_TARGET_ALLY:\n+                        castTarget = me->GetNextRandomRaidMemberOrPet(10.f);\n+                        if (!castTarget)\n+                            castTarget = me;\n+                        break;\n+                    case BOT_ITEM_USE_SPELL_TARGET_NONE:\n+                    default:\n+                        break;\n+                }\n+\n+                //BOT_LOG_ERROR(\"scripts\", \"bot_ai::CheckUsableItems(): bot {}, slot {}, spell {}, target {}\",\n+                //    me->GetName(), uint32(slot), firstItemSpellId, targetType);\n+\n+                if (!castTarget)\n+                    continue;\n+\n+                SpellCastTargets targets;\n+                targets.SetUnitTarget(castTarget);\n+                _castBotItemUseSpell(item, targets);\n+\n+                // do not delay next check unless all items were checked\n+                if (slot < BOT_SLOT_TRINKET2)\n+                    itemsAutouseTimer = 0;\n+\n+                break;\n+            }\n+            else\n+                BOT_LOG_ERROR(\"scripts\", \"bot_ai::CheckUsableItems(): slot {} is in mask but no item exists in that slot!\", uint32(slot));\n+        }\n+    }\n+}\n+//check if our party players are in duel. if so - ignore them, their opponents and any bots they have\n+//Deprecated after 4c26c85\n+//bool bot_ai::InDuel(Unit const* target) const\n+//{\n+//    if (!target) return false;\n+//    bool isbot = target->IsCreature() && target->ToCreature()->IsNPCBot();\n+//    Player const* player = target->IsPlayer() ? target->ToPlayer() : isbot ? target->ToCreature()->GetBotOwner()->ToPlayer() : nullptr;\n+//    if (!player)\n+//    {\n+//        if (!target->IsControlledByPlayer())\n+//            return false;\n+//        player = target->GetCharmerOrOwnerPlayerOrPlayerItself();\n+//    }\n+//\n+//    return (player && player->duel && (IsInBotParty(player) || IsInBotParty(player->duel->opponent)));\n+//}\n+////////////////\n+//GRID SEARCHERS\n+////////////////\n+//Finds player or it's corpse for resurrection returned as WorldObject*\n+WorldObject* bot_ai::GetNearbyRezTarget(float dist) const\n+{\n+    std::list<WorldObject*> list;\n+\n+    NearbyRezTargetCheck check(me, dist, this);\n+    Bcore::WorldObjectListSearcher <NearbyRezTargetCheck> searcher(me, list, check);\n+    Cell::VisitWorldObjects(me, searcher, dist);\n+\n+    if (list.empty())\n+        return nullptr;\n+    if (list.size() == 1)\n+        return *list.begin();\n+\n+    return Bcore::Containers::SelectRandomContainerElement(list);\n+}\n+//Finds target for warrior's Shattering Throw\n+Unit* bot_ai::FindImmunityShieldDispelTarget(float dist) const\n+{\n+    //not checking range\n+    if (me->GetVictim() && me->GetVictim()->HasAuraWithMechanic(1u<<MECHANIC_IMMUNE_SHIELD))\n+        return me->GetVictim();\n+\n+    Unit* unit = nullptr;\n+\n+    ImmunityShieldDispelTargetCheck check(me, dist, this);\n+    Bcore::UnitSearcher <ImmunityShieldDispelTargetCheck> searcher(me, unit, check);\n+    Cell::VisitAllObjects(me, searcher, dist);\n+    //me->VisitNearbyObject(dist, searcher);\n+\n+    return unit;\n+}\n+//Used to find target for priest's dispels, mage's spellsteal and shaman's purge\n+//Returns dispellable/stealable 'Any Hostile Unit Attacking BotParty'\n+Unit* bot_ai::FindHostileDispelTarget(float dist, bool stealable) const\n+{\n+    std::list<Unit*> unitList;\n+\n+    HostileDispelTargetCheck check(me, dist, stealable, this);\n+    Bcore::UnitListSearcher <HostileDispelTargetCheck> searcher(me, unitList, check);\n+    Cell::VisitAllObjects(me, searcher, dist);\n+    //me->VisitNearbyObject(dist, searcher);\n+\n+    if (unitList.empty())\n+        return nullptr;\n+    if (unitList.size() == 1)\n+        return *unitList.begin();\n+\n+    return Bcore::Containers::SelectRandomContainerElement(unitList);\n+}\n+//Finds single target affected by given spell (and given caster if is)\n+//Can check:\n+//    hostile targets  (hostile = 0) <default>\n+// DEPRECATED our party players (hostile = 1)\n+// DEPRECATED our party members  (hostile = 2)\n+//    any friendly target (hostile = 3)\n+//    any friendly player (hostile = 4)\n+//    any target in range  (hostile = any other value)\n+Unit* bot_ai::FindAffectedTarget(uint32 spellId, ObjectGuid caster, float dist, uint8 hostile) const\n+{\n+    if (!spellId)\n+        return nullptr;\n+    if ((hostile == 2 || hostile == 1)/* && IAmFree()*/)\n+    {\n+        BOT_LOG_ERROR(\"entities.player\", \"bot_ai::FindAffectedTarget(): hostile = {} Setting to ALL...\", hostile);\n+        hostile = 255;\n+    }\n+    if (master->GetMap()->Instanceable())\n+        dist = DEFAULT_VISIBILITY_INSTANCE;\n+\n+    Unit* unit = nullptr;\n+\n+    AffectedTargetCheck check(caster, dist, spellId, master, hostile);\n+    Bcore::UnitSearcher <AffectedTargetCheck> searcher(master, unit, check);\n+    Cell::VisitAllObjects(me, searcher, dist);\n+    //me->VisitNearbyObject(dist, searcher);\n+\n+    return unit;\n+}\n+//Finds target for mage's polymorph or shaman's hex\n+Unit* bot_ai::FindPolyTarget(float dist) const\n+{\n+    std::list<Unit*> unitList;\n+\n+    PolyUnitCheck check(me, dist);\n+    Bcore::UnitListSearcher <PolyUnitCheck> searcher(me, unitList, check);\n+    Cell::VisitAllObjects(me, searcher, dist);\n+    //me->VisitNearbyObject(dist, searcher);\n+\n+    if (unitList.empty())\n+        return nullptr;\n+    if (unitList.size() == 1)\n+        return *unitList.begin();\n+    decltype(unitList)::const_iterator it = std::ranges::find_if(unitList, [this](Unit const* u) { return IsPointedNoDPSTarget(u); });\n+    if (it != unitList.cend())\n+        return *it;\n+\n+    return Bcore::Containers::SelectRandomContainerElement(unitList);\n+}\n+//Finds target for direct fear (warlock, hunter)\n+Unit* bot_ai::FindFearTarget(float dist) const\n+{\n+    std::list<Unit*> unitList;\n+\n+    FearUnitCheck check(me, dist, this);\n+    Bcore::UnitListSearcher <FearUnitCheck> searcher(me, unitList, check);\n+    Cell::VisitAllObjects(me, searcher, dist);\n+    //me->VisitNearbyObject(dist, searcher);\n+\n+    if (unitList.empty())\n+        return nullptr;\n+    if (unitList.size() == 1)\n+        return *unitList.begin();\n+    decltype(unitList)::const_iterator it = std::ranges::find_if(unitList, [this](Unit const* u) { return IsPointedNoDPSTarget(u); });\n+    if (it != unitList.cend())\n+        return *it;\n+\n+    return Bcore::Containers::SelectRandomContainerElement(unitList);\n+}\n+//Finds target for CC spells with MECHANIC_STUN\n+Unit* bot_ai::FindStunTarget(float dist) const\n+{\n+    std::list<Unit*> unitList;\n+\n+    StunUnitCheck check(me, dist);\n+    Bcore::UnitListSearcher <StunUnitCheck> searcher(me, unitList, check);\n+    Cell::VisitAllObjects(me, searcher, dist);\n+    //me->VisitNearbyObject(dist, searcher);\n+\n+    if (unitList.empty())\n+        return nullptr;\n+    if (unitList.size() == 1)\n+        return *unitList.begin();\n+    decltype(unitList)::const_iterator it = std::ranges::find_if(unitList, [this](Unit const* u) { return IsPointedNoDPSTarget(u); });\n+    if (it != unitList.cend())\n+        return *it;\n+\n+    return Bcore::Containers::SelectRandomContainerElement(unitList);\n+}\n+//Finds target for priest's shackles\n+Unit* bot_ai::FindUndeadCCTarget(float dist, uint32 spellId, bool unattacked) const\n+{\n+    if (!spellId)\n+        return nullptr;\n+\n+    std::list<Unit*> unitList;\n+\n+    UndeadCCUnitCheck check(me, dist, this, spellId, unattacked);\n+    Bcore::UnitListSearcher <UndeadCCUnitCheck> searcher(me, unitList, check);\n+    Cell::VisitAllObjects(me, searcher, dist);\n+    //me->VisitNearbyObject(dist, searcher);\n+\n+    if (unitList.empty())\n+        return nullptr;\n+    if (unitList.size() == 1)\n+        return *unitList.begin();\n+    decltype(unitList)::const_iterator it = std::ranges::find_if(unitList, [this](Unit const* u) { return IsPointedNoDPSTarget(u); });\n+    if (it != unitList.cend())\n+        return *it;\n+\n+    return Bcore::Containers::SelectRandomContainerElement(unitList);\n+}\n+//Finds target for druid's Entangling Roots\n+Unit* bot_ai::FindRootTarget(float dist, uint32 spellId) const\n+{\n+    if (!spellId)\n+        return nullptr;\n+\n+    std::list<Unit*> unitList;\n+\n+    RootUnitCheck check(me, dist, this, spellId);\n+    Bcore::UnitListSearcher <RootUnitCheck> searcher(me, unitList, check);\n+    Cell::VisitAllObjects(me, searcher, dist);\n+    //me->VisitNearbyObject(dist, searcher);\n+\n+    if (unitList.empty())\n+        return nullptr;\n+    if (unitList.size() == 1)\n+        return *unitList.begin();\n+    decltype(unitList)::const_iterator it = std::ranges::find_if(unitList, [this](Unit const* u) { return IsPointedNoDPSTarget(u); });\n+    if (it != unitList.cend())\n+        return *it;\n+\n+    return Bcore::Containers::SelectRandomContainerElement(unitList);\n+}\n+//Finds casting target (neutral or enemy)\n+//Can be used to get silence/interruption/reflect/grounding check\n+Unit* bot_ai::FindCastingTarget(float maxdist, float mindist, uint32 spellId, uint8 minHpPct) const\n+{\n+    std::list<Unit*> unitList;\n+\n+    CastingUnitCheck check(me, mindist, maxdist, spellId, minHpPct);\n+    Bcore::UnitListSearcher <CastingUnitCheck> searcher(me, unitList, check);\n+    Cell::VisitAllObjects(me, searcher, maxdist);\n+    //me->VisitNearbyObject(maxdist, searcher);\n+\n+    if (unitList.empty())\n+        return nullptr;\n+    if (unitList.size() == 1)\n+        return *unitList.begin();\n+    decltype(unitList)::const_iterator it = std::ranges::find_if(unitList, [this](Unit const* u) { return IsPointedNoDPSTarget(u); });\n+    if (it != unitList.cend())\n+        return *it;\n+\n+    return Bcore::Containers::SelectRandomContainerElement(unitList);\n+}\n+// Returns target for dest AOE spell (blizzard, hurricane, etc.) based on crowd size, movement state and direction\n+Unit* bot_ai::FindAOETarget(float dist, WorldObject const* src) const\n+{\n+    if (!src)\n+        src = me;\n+\n+    std::list<Unit*> unitList;\n+    GetNearbyTargetsList(unitList, dist, 0);\n+\n+    if (unitList.size() < 3)\n+        return nullptr;\n+\n+    Unit* unit = nullptr;\n+    float mydist = dist;\n+    for (Unit* u : unitList)\n+    {\n+        if (u->isMoving() && u->GetVictim() &&\n+            (u->GetDistance2d(u->GetVictim()->GetPositionX(), u->GetVictim()->GetPositionY()) > 7.5f ||\n+            !u->HasInArc(float(M_PI)*0.75f, u->GetVictim())))\n+            continue;\n+\n+        if (!unit && u->GetVictim() && u->GetDistance(u->GetVictim()) < dist * 0.334f)\n+        {\n+            unit = u;\n+            continue;\n+        }\n+        if (!unit)\n+        {\n+            float destDist = src->GetDistance(u->GetPositionX(), u->GetPositionY(), u->GetPositionZ());\n+            if (destDist < mydist)\n+            {\n+                mydist = destDist;\n+                unit = u;\n+            }\n+        }\n+        if (unit)\n+        {\n+            uint8 count = 0;\n+            for (Unit* u2 : unitList)\n+            {\n+                if (u2 != unit && u2->GetDistance2d(unit->GetPositionX(), unit->GetPositionY()) < 5.f)\n+                {\n+                    if (++count > 2)\n+                    {\n+                        if (src->GetDistance(u2) < src->GetDistance(unit) && unit->HasInArc(float(M_PI)/2, src))\n+                            unit = u2;\n+                        break;\n+                    }\n+                }\n+            }\n+            if (count > 2)\n+                break;\n+\n+            unit = nullptr;\n+        }\n+    }\n+\n+    return unit;\n+}\n+// Finds secondary target for spells like Cleave, Swipe, etc.\n+Unit* bot_ai::FindSplashTarget(float dist, Unit* To, float splashdist) const\n+{\n+    if (!To)\n+        To = me->GetVictim();\n+    if (!To)\n+        return nullptr;\n+\n+    if (me->GetDistance(To) > dist)\n+        return nullptr;\n+\n+    Unit* unit = nullptr;\n+\n+    SecondEnemyCheck check(me, dist, splashdist, To, this);\n+    Bcore::UnitSearcher <SecondEnemyCheck> searcher(me, unit, check);\n+    Cell::VisitAllObjects(me, searcher, dist);\n+    //me->VisitNearbyObject(dist, searcher);\n+\n+    return unit;\n+}\n+// Finds secondary target for AoE spells like Mind Sear (not damaging primary target)\n+Unit* bot_ai::FindSplashTarget(float dist, Unit* To, float splashdist, uint8 minTargets) const\n+{\n+    if (!To || minTargets < 1)\n+        return nullptr;\n+\n+    if (me->GetDistance(To) > dist)\n+        return nullptr;\n+\n+    std::list<Unit*> unitList;\n+\n+    SecondEnemyCheck check(me, dist, splashdist, To, this);\n+    Bcore::UnitListSearcher <SecondEnemyCheck> searcher(me, unitList, check);\n+    Cell::VisitAllObjects(me, searcher, dist);\n+    //me->VisitNearbyObject(dist, searcher);\n+\n+    if (uint8(unitList.size()) < minTargets)\n+        return nullptr;\n+    if (unitList.size() == 1)\n+        return *unitList.begin();\n+\n+    return Bcore::Containers::SelectRandomContainerElement(unitList);\n+}\n+//Finds target for hunter's Tranquilizing Shot (has dispellable magic or enrage effect)\n+Unit* bot_ai::FindTranquilTarget(float mindist, float maxdist) const\n+{\n+    Unit* unit = nullptr;\n+\n+    TranquilTargetCheck check(me, mindist, maxdist, this);\n+    Bcore::UnitSearcher <TranquilTargetCheck> searcher(me, unit, check);\n+    Cell::VisitAllObjects(me, searcher, maxdist);\n+    //me->VisitNearbyObject(maxdist, searcher);\n+\n+    return unit;\n+}\n+//Find target to cast taunt on\n+//In case of paladin's Righetoous Defense returns IsInBotParty() unit\n+Unit* bot_ai::FindDistantTauntTarget(float maxdist, bool ally) const\n+{\n+    std::list<Unit*> unitList;\n+\n+    FarTauntUnitCheck check(me, maxdist, ally, this);\n+    Bcore::UnitListSearcher <FarTauntUnitCheck> searcher(me, unitList, check);\n+    Cell::VisitAllObjects(me, searcher, maxdist);\n+    //me->VisitNearbyObject(maxdist, searcher);\n+\n+    if (unitList.empty())\n+        return nullptr;\n+\n+    Unit* unit = unitList.size() == 1 ? *unitList.begin() : Bcore::Containers::SelectRandomContainerElement(unitList);\n+    return ally ? unit->GetVictim() : unit;\n+}\n+//Finds target for Warlock's Mana Drain\n+//Returns nearby CCed unit with most mana\n+Unit* bot_ai::FindDrainTarget(float maxdist) const\n+{\n+    Unit* unit = nullptr;\n+\n+    ManaDrainUnitCheck check(me, maxdist, this);\n+    Bcore::UnitLastSearcher <ManaDrainUnitCheck> searcher(me, unit, check);\n+    Cell::VisitAllObjects(me, searcher, maxdist);\n+    //me->VisitNearbyObject(maxdist, searcher);\n+\n+    return unit;\n+}\n+//Finds all targets within given range\n+//used for finding targets for spells which need reasonable amount of targets (ex. Death Knight AOE spells)\n+//CCoption:= mask\n+//1 - not CCed\n+//2 - has no periodic damage auras (can be safely CCed)\n+void bot_ai::GetNearbyTargetsList(std::list<Unit*> &targets, float maxdist, uint8 CCoption, WorldObject const* source) const\n+{\n+    if (!source)\n+        source = me;\n+\n+    NearbyHostileUnitCheck check(me, maxdist, this, CCoption, source);\n+    Bcore::UnitListSearcher <NearbyHostileUnitCheck> searcher(me, targets, check);\n+    Cell::VisitAllObjects(me, searcher, maxdist);\n+    //me->VisitNearbyObject(maxdist, searcher);\n+}\n+//Find all targets within given range in cone in front of caster; angle is PI/2 (TC confirmed)\n+//used by mage Dragon's Breath and Cone of Cold spells\n+//also Swipe (Bear) and Swipe (Cat)\n+void bot_ai::GetNearbyTargetsInConeList(std::list<Unit*> &targets, float maxdist) const\n+{\n+    NearbyHostileUnitInConeCheck check(me, maxdist, this);\n+    Bcore::UnitListSearcher <NearbyHostileUnitInConeCheck> searcher(me, targets, check);\n+    Cell::VisitAllObjects(me, searcher, maxdist);\n+    //me->VisitNearbyObject(maxdist, searcher);\n+}\n+//Finds all friendly targets within given range\n+//used for finding targets to heal/buff for uncontrolled bots\n+void bot_ai::GetNearbyFriendlyTargetsList(std::list<Unit*> &targets, float maxdist) const\n+{\n+    NearbyFriendlyUnitCheck check(me, maxdist, this);\n+    Bcore::UnitListSearcher <NearbyFriendlyUnitCheck> searcher(me, targets, check);\n+    Cell::VisitAllObjects(me, searcher, maxdist);\n+    //me->VisitNearbyObject(maxdist, searcher);\n+}\n+//////////\n+//SPELLMAP\n+//////////\n+//Using first-rank spell as source, returns spellId of max rank allowed for given caster\n+//If you want bot to use this spell through doCast() go InitSpellMap(uint32) instead\n+uint32 bot_ai::InitSpell(Unit const* caster, uint32 spell)\n+{\n+    SpellInfo const* info = sSpellMgr->GetSpellInfo(spell);\n+    if (!info)\n+    {\n+        BOT_LOG_ERROR(\"entities.player\", \"InitSpell(): No SpellInfo found for spell {}\", spell);\n+        return 0; //weird spell with no info, disable it\n+    }\n+\n+    uint8 lvl = caster->GetLevel();\n+    if (lvl < info->BaseLevel) //only 1st rank spells check\n+        return 0; //cannot use this spell\n+\n+    if (SpellInfo const* spInfo = info->GetNextRankSpell())\n+    {\n+        if (lvl < spInfo->BaseLevel)\n+            return spell; //cannot use next rank, use this one\n+        else\n+            return InitSpell(caster, spInfo->Id); //can use next rank, forward check\n+    }\n+\n+    return spell; //max rank, use this\n+}\n+//Using first-rank spell as source, puts spell of max rank allowed for given caster in spellmap\n+void bot_ai::InitSpellMap(uint32 basespell, bool forceadd, bool forwardRank)\n+{\n+    SpellInfo const* info = sSpellMgr->GetSpellInfo(basespell);\n+    if (!info)\n+    {\n+        BOT_LOG_ERROR(\"entities.player\", \"bot_ai::InitSpellMap(): No SpellInfo found for base spell {}\", basespell);\n+        return; //invalid spell id\n+    }\n+    info = info->TryGetSpellInfoOverride(me);\n+\n+    uint8 lvl = me->GetLevel();\n+    uint32 spellId = forceadd ? basespell : 0;\n+\n+    while (info != nullptr && forwardRank && (forceadd || lvl >= info->BaseLevel))\n+    {\n+        spellId = info->Id; //can use this spell\n+        info = info->GetNextRankSpell(); //check next rank\n+    }\n+\n+    BotSpell& newSpell = _spells.try_emplace(basespell).first->second;\n+    newSpell.spellId = spellId;\n+\n+    if (_botData->disabled_spells.contains(basespell))\n+    {\n+        newSpell.enabled = false;\n+        //BOT_LOG_ERROR(\"entities.player\", \"bot_ai::InitSpellMap(): {} ({} -> {}) is disabled for {}!\",\n+        //    sSpellMgr->GetSpellInfo(basespell)->SpellName[0], basespell, spellId, me->GetName());\n+    }\n+}\n+//Using first-rank spell as source, return true if spell is inited\n+bool bot_ai::HasSpell(uint32 basespell) const\n+{\n+    decltype(_spells)::const_iterator itr = _spells.find(basespell);\n+    return itr != _spells.end() && (itr->second.spellId != 0);\n+}\n+//Using spell name as source, return first-rank spell if spell is inited\n+uint32 bot_ai::GetBaseSpell(std::string_view spell_name, LocaleConstant locale) const\n+{\n+    uint32 basespell = 0;\n+    std::wstring wname;\n+    if (Utf8toWStr(spell_name, wname))\n+    {\n+        wstrToLower(wname);\n+        for (auto const& [rank1_id, spell] : _spells)\n+        {\n+            //we ignore enabled state since this is exactly what we want\n+            if (spell.spellId == 0) //not init'ed\n+                continue;\n+            spell_name = sSpellMgr->GetSpellInfo(rank1_id)->SpellName[locale];\n+            std::wstring wcname;\n+            if (!Utf8toWStr(spell_name, wcname))\n+                continue;\n+            wstrToLower(wcname);\n+            if (wcname == wname)\n+            {\n+                basespell = rank1_id;\n+                break;\n+            }\n+        }\n+    }\n+\n+    return basespell;\n+}\n+//Using first-rank spell as source, return current spell id if inited and enabled\n+uint32 bot_ai::GetSpell(uint32 basespell) const\n+{\n+    decltype(_spells)::const_iterator itr = _spells.find(basespell);\n+    return itr != _spells.end() && (itr->second.enabled == true || IAmFree()) ? itr->second.spellId : 0;\n+}\n+//Using first-rank spell as source, returns cooldown on current spell\n+uint32 bot_ai::GetSpellCooldown(uint32 basespell) const\n+{\n+    decltype(_spells)::const_iterator itr = _spells.find(basespell);\n+    return itr != _spells.end() ? itr->second.cooldown : 0;\n+}\n+bool bot_ai::IsSpellReady(uint32 basespell, uint32 diff, bool checkGCD) const\n+{\n+    if (checkGCD && GC_Timer > diff)\n+        return false;\n+\n+    decltype(_spells)::const_iterator itr = _spells.find(basespell);\n+    return itr == _spells.end() ? true :\n+        ((itr->second.enabled == true || IAmFree() || IsLastOrder(BOT_ORDER_SPELLCAST, basespell)) &&\n+            itr->second.spellId != 0 && itr->second.cooldown <= diff);\n+}\n+//Using first-rank spell as source, sets cooldown for current spell\n+void bot_ai::SetSpellCooldown(uint32 basespell, uint32 msCooldown)\n+{\n+    //if (!msCooldown)\n+    //    return;\n+\n+    BotSpell& newSpell = _spells.try_emplace(basespell).first->second;\n+    newSpell.cooldown = msCooldown;\n+}\n+//Using first-rank spell as source, sets cooldown for spells of that category\n+void bot_ai::SetSpellCategoryCooldown(SpellInfo const* spellInfo, uint32 msCooldown)\n+{\n+    if (!msCooldown)\n+        return;\n+\n+    uint32 category = spellInfo->GetCategory();\n+    if (!category)\n+        category = spellInfo->StartRecoveryCategory;\n+    if (!category)\n+        return;\n+\n+    SpellInfo const* info;\n+    for (auto& [rank1_id, spell] : _spells)\n+    {\n+        //skip spell which has triggered this category cooldown\n+        if (rank1_id == spellInfo->Id && spell.cooldown >= msCooldown)\n+            continue;\n+\n+        info = sSpellMgr->GetSpellInfo(spell.spellId);\n+        info = info ? info->TryGetSpellInfoOverride(me) : info;\n+        if (info && rank1_id == spellInfo->Id && info->GetCategory() != category && info->StartRecoveryCategory != category)\n+        {\n+            //if (itr->first != 7814) // Lash of Pain\n+            {\n+                BOT_LOG_ERROR(\"scripts\", \"Warning: SetSpellCategoryCooldown: {} has baseId {} but category {}, not {}!\",\n+                    info->Id, rank1_id, info->GetCategory(), category);\n+            }\n+        }\n+        if (info && (info->GetCategory() == category || info->StartRecoveryCategory == category || rank1_id == spellInfo->Id) && spell.cooldown < msCooldown)\n+            spell.cooldown = msCooldown;\n+    }\n+}\n+//Handles spell cooldowns for spell with IsCooldownStartedOnEvent() == true\n+void bot_ai::ReleaseSpellCooldown(uint32 basespell)\n+{\n+    SpellInfo const* baseInfo = sSpellMgr->GetSpellInfo(basespell);\n+\n+    baseInfo = baseInfo->TryGetSpellInfoOverride(me);\n+\n+    if (!baseInfo->IsCooldownStartedOnEvent())\n+    {\n+        BOT_LOG_ERROR(\"spells\", \"bot_ai::ReleaseSpellCooldown is called for wrong spell {}!\", basespell);\n+        return;\n+    }\n+\n+    uint32 rec = baseInfo->RecoveryTime;\n+    uint32 catrec = baseInfo->CategoryRecoveryTime;\n+\n+    ApplyBotSpellCooldownMods(baseInfo, rec);\n+    ApplyBotSpellCategoryCooldownMods(baseInfo, catrec);\n+\n+    SetSpellCooldown(baseInfo->Id, rec > 0 ? rec : 0);\n+    SetSpellCategoryCooldown(baseInfo, catrec > 0 && !(baseInfo->AttributesEx6 & SPELL_ATTR6_IGNORE_CATEGORY_COOLDOWN_MODS) ? catrec : 0);\n+}\n+//Using first-rank spell as source, disables certain spell for this bot\n+void bot_ai::RemoveSpell(uint32 basespell)\n+{\n+    BotSpell& newSpell = _spells.try_emplace(basespell).first->second;\n+    newSpell.spellId = 0;\n+    newSpell.cooldown = 0;\n+}\n+//\n+//void bot_ai::RemoveAllSpells()\n+//{\n+//    for (BotSpellMap::const_iterator itr = _spells.begin(); itr != _spells.end(); ++itr)\n+//        itr->second->spellId = 0;\n+//}\n+void bot_ai::EnableAllSpells(bool save)\n+{\n+    if (save)\n+    {\n+        _botData->disabled_spells.clear();\n+        _saveDisabledSpells = true;\n+    }\n+\n+    for (auto& [rank1_id, spell] : _spells)\n+        spell.enabled = true;\n+}\n+//See CommonTimers(uint32)\n+void bot_ai::SpellTimers(uint32 diff)\n+{\n+    // spell must be initialized!!!\n+    for (auto& [rank1_id, spell] : _spells)\n+    {\n+        if (spell.cooldown >= diff)\n+            spell.cooldown -= diff;\n+        else if (spell.cooldown > 0)\n+            spell.cooldown = 0;\n+    }\n+}\n+uint32 bot_ai::RaceSpellForClass(uint8 myrace, uint8 myclass)\n+{\n+    switch (myrace)\n+    {\n+        case RACE_ORC:\n+            switch (myclass)\n+            {\n+                case BOT_CLASS_WARLOCK:\n+                    return RACIAL_BLOOD_FURY_WARLOCK;\n+                case BOT_CLASS_SHAMAN:\n+                    return RACIAL_BLOOD_FURY_SHAMAN;\n+                default:\n+                    return RACIAL_BLOOD_FURY_OTHERS;\n+            }\n+            break;\n+        case RACE_BLOODELF:\n+            switch (myclass)\n+            {\n+                case BOT_CLASS_DEATH_KNIGHT:\n+                    return RACIAL_ARCANE_TORRENT_DEATHKNIGHT;\n+                case BOT_CLASS_ROGUE:\n+                    return RACIAL_ARCANE_TORRENT_ROGUE;\n+                default:\n+                    return RACIAL_ARCANE_TORRENT_OTHERS;\n+            }\n+            break;\n+        case RACE_DRAENEI:\n+            switch (myclass)\n+            {\n+                case BOT_CLASS_WARRIOR:\n+                    return RACIAL_GIFT_OF_NAARU_WARRIOR;\n+                case BOT_CLASS_PALADIN:\n+                    return RACIAL_GIFT_OF_NAARU_PALADIN;\n+                case BOT_CLASS_HUNTER:\n+                    return RACIAL_GIFT_OF_NAARU_HUNTER;\n+                case BOT_CLASS_PRIEST:\n+                    return RACIAL_GIFT_OF_NAARU_PRIEST;\n+                case BOT_CLASS_DEATH_KNIGHT:\n+                    return RACIAL_GIFT_OF_NAARU_DEATHKNIGHT;\n+                case BOT_CLASS_SHAMAN:\n+                    return RACIAL_GIFT_OF_NAARU_SHAMAN;\n+                case BOT_CLASS_MAGE:\n+                    return RACIAL_GIFT_OF_NAARU_MAGE;\n+                default:\n+                    BOT_LOG_ERROR(\"entities.player\", \"RaceSpellForClass(): unknows race:class combo {}, {}\", uint32(myrace), uint32(myclass));\n+                    return 0;\n+            }\n+            break;\n+        default:\n+            BOT_LOG_ERROR(\"entities.player\", \"RaceSpellForClass(): unknows race:class combo {}, {}\", uint32(myrace), uint32(myclass));\n+            return 0;\n+    }\n+}\n+//Health magement for minions\n+//Including health calcs, set\n+void bot_ai::_OnHealthUpdate() const\n+{\n+    uint8 mylevel = master->GetLevel();\n+    PlayerClassLevelInfo classinfo;\n+    sObjectMgr->GetPlayerClassLevelInfo(GetPlayerClass(), std::min<uint8>(mylevel, DEFAULT_MAX_LEVEL), &classinfo);\n+\n+    //BOT_LOG_ERROR(\"entities.player\", \"_OnHealthUpdate(): updating bot {}\", me->GetName());\n+    bool fullhp = me->GetHealth() == me->GetMaxHealth();\n+    float pct = fullhp ? 100.f : me->GetHealthPct(); // needs for regeneration\n+    uint32 m_basehp = uint32(classinfo.basehealth * (BotMgr::IsWanderingWorldBot(me) ? BotCfg::GetBotWandererHPMod() : BotCfg::GetBotHPMod()));\n+    //BOT_LOG_ERROR(\"entities.player\", \"class base health: {}\", m_basehp);\n+    me->SetCreateHealth(m_basehp);\n+\n+    float stamValue = _getTotalBotStat(BOT_STAT_MOD_STAMINA);\n+\n+    stamValue -= std::min<float>(me->GetCreateStat(STAT_STAMINA), 20.f); //not a mistake\n+    stamValue = std::max<float>(stamValue, 0.f);\n+\n+    //BOT_LOG_ERROR(\"entities.player\", \"bot's stats to health add: Stamina ({}), value: {}\", stamValue, stamValue * 10.f);\n+    float hp_add = stamValue * 10.f + 20; //20 is not a mistake;\n+    //hp_add += IAmFree() ? mylevel * 375.f : 0; //+30000/+0 hp at 80\n+    hp_add += _getTotalBotStat(BOT_STAT_MOD_HEALTH);\n+    //BOT_LOG_ERROR(\"entities.player\", \"health to add after stam mod: {}\", hp_add);\n+    uint32 m_totalhp = m_basehp + int32(hp_add * (BotMgr::IsWanderingWorldBot(me) ? BotCfg::GetBotWandererHPMod() : BotCfg::GetBotHPMod()));\n+    //BOT_LOG_ERROR(\"entities.player\", \"total base health: {}\", m_totalhp);\n+\n+    //hp bonuses\n+    uint8 bonuspct = 0;\n+    //Endurance Training\n+    if (_botclass == BOT_CLASS_HUNTER && mylevel >= 10)\n+        bonuspct += 5;\n+    //Fel Vitality\n+    if (_botclass == BOT_CLASS_WARLOCK && mylevel >= 15)\n+        bonuspct += 3;\n+    //Sphynx bonus (some equip slots unavailable)\n+    if (_botclass == BOT_CLASS_SPHYNX)\n+        bonuspct += 50;\n+    //Dreadlord's / Crypt Lord's vitality\n+    if (_botclass == BOT_CLASS_DREADLORD || _botclass == BOT_CLASS_CRYPT_LORD)\n+        bonuspct += 20;\n+    if (bonuspct)\n+        m_totalhp = (m_totalhp * (100 + bonuspct)) / 100;\n+\n+    //m_totalhp = float(uint32(m_totalhp) - (uint32(m_totalhp) % 10));\n+    me->SetStatFlatModifier(UNIT_MOD_HEALTH, BASE_VALUE, float(m_totalhp) * BotCfg::GetBotHPModByLevel(me->GetLevel())); //replaces base hp at max lvl\n+    me->UpdateMaxHealth(); //will use our values we just set (update base health and buffs)\n+    //BOT_LOG_ERROR(\"entities.player\", \"overall hp: {}\", me->GetMaxHealth());\n+    me->SetHealth(fullhp ? me->GetMaxHealth() : uint32(0.5f + float(me->GetMaxHealth()) * pct / 100.f)); //restore pct\n+}\n+//Mana management for minions\n+//Including calcs and set\n+void bot_ai::_OnManaUpdate() const\n+{\n+    if (me->GetMaxPower(POWER_MANA) <= 1)\n+        return;\n+\n+    uint8 mylevel = master->GetLevel();\n+    PlayerClassLevelInfo classinfo;\n+    sObjectMgr->GetPlayerClassLevelInfo(GetPlayerClass(), std::min<uint8>(mylevel, DEFAULT_MAX_LEVEL), &classinfo);\n+\n+    //BOT_LOG_ERROR(\"entities.player\", \"_OnManaUpdate(): updating bot {}\", me->GetName());\n+    bool fullmana = me->GetPower(POWER_MANA) == me->GetMaxPower(POWER_MANA);\n+    float pct = fullmana ? 100.f : (float(me->GetPower(POWER_MANA)) * 100.f) / float(me->GetMaxPower(POWER_MANA));\n+    float m_basemana = classinfo.basemana;\n+    if (_botclass == BOT_CLASS_BM)\n+        m_basemana = float(BASE_MANA_1_BM) + float(BASE_MANA_10_BM - BASE_MANA_1_BM) * (mylevel/81.f);\n+    if (_botclass == BOT_CLASS_SPHYNX)\n+        m_basemana = BASE_MANA_SPHYNX;\n+    if (_botclass == BOT_CLASS_ARCHMAGE)\n+        m_basemana = float(BASE_MANA_1_ARCHMAGE) + float(BASE_MANA_10_ARCHMAGE - BASE_MANA_1_ARCHMAGE) * ((mylevel - 20)/81.f);\n+    if (_botclass == BOT_CLASS_DREADLORD)\n+        m_basemana = float(BASE_MANA_1_DREADLORD) + float(BASE_MANA_10_DREADLORD - BASE_MANA_1_DREADLORD) * ((mylevel - 60)/83.f);\n+    if (_botclass == BOT_CLASS_SPELLBREAKER)\n+        m_basemana = BASE_MANA_SPELLBREAKER;\n+    if (_botclass == BOT_CLASS_DARK_RANGER)\n+        m_basemana = float(BASE_MANA_1_DARK_RANGER) + float(BASE_MANA_10_DARK_RANGER - BASE_MANA_1_DARK_RANGER) * ((mylevel - 40)/82.f);\n+    if (_botclass == BOT_CLASS_NECROMANCER)\n+        m_basemana = BASE_MANA_NECROMANCER;\n+    if (_botclass == BOT_CLASS_SEA_WITCH)\n+        m_basemana = float(BASE_MANA_1_SEA_WITCH) + float(BASE_MANA_10_SEA_WITCH - BASE_MANA_1_SEA_WITCH) * (mylevel/83.f);\n+    if (_botclass == BOT_CLASS_CRYPT_LORD)\n+        m_basemana = float(BASE_MANA_1_CRYPT_LORD) + float(BASE_MANA_10_CRYPT_LORD - BASE_MANA_1_CRYPT_LORD) * (mylevel/83.f);\n+    //BOT_LOG_ERROR(\"entities.player\", \"classinfo base mana = {}\", m_basemana);\n+\n+    me->SetCreateMana(uint32(m_basemana));\n+\n+    float intValue = _getTotalBotStat(BOT_STAT_MOD_INTELLECT);\n+\n+    intValue -= std::min<float>(me->GetCreateStat(STAT_INTELLECT), 20.f); //not a mistake\n+    intValue = std::max<float>(intValue, 0.f);\n+\n+    float intMult = _botclass < BOT_CLASS_EX_START ? 15.f : IsHeroExClass(_botclass) ? 5.f : 1.5f;\n+\n+    m_basemana = intValue * intMult + 20.f; //20.f is not a mistake\n+    //m_basemana += IAmFree() ? mylevel * 50.f : 0; //+4000/+0 mana at 80\n+    m_basemana += _getTotalBotStat(BOT_STAT_MOD_MANA);\n+\n+    //mana bonuses\n+    uint8 bonuspct = 0;\n+    //Fel Vitality\n+    if (_botclass == BOT_CLASS_WARLOCK && mylevel >= 15)\n+        bonuspct += 3;\n+    if (bonuspct)\n+        m_basemana = (m_basemana * (100 + bonuspct)) / 100;\n+\n+    //m_basemana = float(uint32(m_basemana) - (uint32(m_basemana) % 5));\n+    me->SetStatFlatModifier(UNIT_MOD_MANA, BASE_VALUE, m_basemana * BotCfg::GetBotMPModByLevel(me->GetLevel()));\n+    me->UpdateMaxPower(POWER_MANA);\n+    me->SetPower(POWER_MANA, fullmana ? me->GetMaxPower(POWER_MANA) :\n+        uint32(0.5f + float(me->GetMaxPower(POWER_MANA)) * pct / 100.f)); //restore pct\n+\n+    _OnManaRegenUpdate();\n+}\n+//Mana regen for minions\n+void bot_ai::_OnManaRegenUpdate() const\n+{\n+    //regen_normal\n+    uint8 mylevel = me->GetLevel();\n+    float value = float((IAmFree() && _botclass != BOT_CLASS_SPHYNX) ? mylevel / 2 : 0); //200/0 mp5 at 80\n+\n+    float power_regen_mp5;\n+    int32 modManaRegenInterrupt;\n+    if (_botclass < BOT_CLASS_EX_START)\n+    {\n+        // Mana regen from spirit and intellect\n+        float spiregen = 0.001f;\n+        if (GtRegenMPPerSptEntry const* moreRatio = sGtRegenMPPerSptStore.LookupEntry((_botclass-1)*GT_MAX_LEVEL + mylevel-1))\n+            spiregen = moreRatio->Data * _getTotalBotStat(BOT_STAT_MOD_SPIRIT);\n+\n+        // PCT bonus from SPELL_AURA_MOD_POWER_REGEN_PERCENT aura on spirit base regen\n+        value += sqrt(_getTotalBotStat(BOT_STAT_MOD_INTELLECT)) * spiregen * me->GetTotalAuraMultiplierByMiscValue(SPELL_AURA_MOD_POWER_REGEN_PERCENT, POWER_MANA);\n+        // regen from SPELL_AURA_MOD_POWER_REGEN aura (per second)\n+        power_regen_mp5 = 0.2f * (me->GetTotalAuraModifierByMiscValue(SPELL_AURA_MOD_POWER_REGEN, POWER_MANA) + _getTotalBotStat(BOT_STAT_MOD_MANA_REGENERATION));\n+\n+        // bonus from SPELL_AURA_MOD_MANA_REGEN_FROM_STAT aura\n+        for (AuraEffect const* aeff : me->GetAuraEffectsByType(SPELL_AURA_MOD_MANA_REGEN_FROM_STAT))\n+            power_regen_mp5 += me->GetStat(Stats(aeff->GetMiscValue())) * aeff->GetAmount() * 0.002f; //per second\n+\n+        //bot also receive bonus from SPELL_AURA_MOD_POWER_REGEN_PERCENT for mp5 regen\n+        power_regen_mp5 *= me->GetTotalAuraMultiplierByMiscValue(SPELL_AURA_MOD_POWER_REGEN_PERCENT, POWER_MANA);\n+\n+        // Set regen rate in cast state apply only on spirit based regen\n+        modManaRegenInterrupt = std::min<int32>(100, me->GetTotalAuraModifier(SPELL_AURA_MOD_MANA_REGEN_INTERRUPT));\n+    }\n+    else\n+    {\n+        modManaRegenInterrupt = 100;\n+        power_regen_mp5 = 0.0f;\n+\n+        if (IsHeroExClass(_botclass))\n+        {\n+            float basemana;\n+            if (_botclass == BOT_CLASS_BM)\n+                basemana = BASE_MANA_1_BM;\n+            else if (_botclass == BOT_CLASS_ARCHMAGE)\n+                basemana = BASE_MANA_1_ARCHMAGE;\n+            else if (_botclass == BOT_CLASS_DREADLORD)\n+                basemana = BASE_MANA_1_DREADLORD;\n+            else if (_botclass == BOT_CLASS_DARK_RANGER)\n+                basemana = BASE_MANA_1_DARK_RANGER;\n+            else if (_botclass == BOT_CLASS_SEA_WITCH)\n+                basemana = BASE_MANA_1_SEA_WITCH;\n+            else if (_botclass == BOT_CLASS_CRYPT_LORD)\n+                basemana = BASE_MANA_1_CRYPT_LORD;\n+            else\n+                basemana = 0.f;\n+\n+            value = basemana * 0.0087f + 0.08f * GetTotalBotStat(BOT_STAT_MOD_INTELLECT);\n+            value += 0.2f * (me->GetTotalAuraModifierByMiscValue(SPELL_AURA_MOD_POWER_REGEN, POWER_MANA) + _getTotalBotStat(BOT_STAT_MOD_MANA_REGENERATION));\n+            value *= me->GetTotalAuraMultiplierByMiscValue(SPELL_AURA_MOD_POWER_REGEN_PERCENT, POWER_MANA);\n+\n+            //if (_botclass == BOT_CLASS_SEA_WITCH && me->HasAuraType(SPELL_AURA_MANA_SHIELD))\n+            //    modManaRegenInterrupt *= 0.25f;\n+        }\n+        else if (_botclass == BOT_CLASS_SPHYNX)\n+        {\n+            value = CalculatePct(me->GetCreateMana(), 2); //-2% basemana/sec\n+        }\n+        else if (_botclass == BOT_CLASS_SPELLBREAKER)\n+        {\n+            value = 4.f; //base 0.8/sec\n+            value += 0.2f * (me->GetTotalAuraModifierByMiscValue(SPELL_AURA_MOD_POWER_REGEN, POWER_MANA) + _getTotalBotStat(BOT_STAT_MOD_MANA_REGENERATION));\n+            value *= me->GetTotalAuraMultiplierByMiscValue(SPELL_AURA_MOD_POWER_REGEN_PERCENT, POWER_MANA);\n+        }\n+        else if (_botclass == BOT_CLASS_NECROMANCER)\n+        {\n+            value = 7.5f; //base 1.5/sec\n+            value += 0.2f * (me->GetTotalAuraModifierByMiscValue(SPELL_AURA_MOD_POWER_REGEN, POWER_MANA) + _getTotalBotStat(BOT_STAT_MOD_MANA_REGENERATION));\n+            value *= me->GetTotalAuraMultiplierByMiscValue(SPELL_AURA_MOD_POWER_REGEN_PERCENT, POWER_MANA);\n+        }\n+        else\n+            value = 0;\n+    }\n+\n+    //Unrelenting Storm, Dreamstate: 12% of intellect as mana regen always (divided by 5)\n+    if ((_botclass == BOT_CLASS_SHAMAN && GetSpec() == BOT_SPEC_SHAMAN_ELEMENTAL) ||\n+        (_botclass == BOT_CLASS_DRUID && GetSpec() == BOT_SPEC_DRUID_BALANCE))\n+        power_regen_mp5 += 0.024f * _getTotalBotStat(BOT_STAT_MOD_INTELLECT);\n+\n+    me->SetStatFloatValue(UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER, power_regen_mp5 + CalculatePct(value, modManaRegenInterrupt));\n+    me->SetStatFloatValue(UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER, power_regen_mp5 + value);\n+}\n+\n+void bot_ai::_UpdateWMOArea()\n+{\n+    _wmoAreaUpdateTimer = urand(7000, 9000);\n+\n+    uint32 mogpFlags;\n+    int32 adtId, rootId, groupId;\n+    me->GetMap()->GetAreaInfo(me->GetPhaseMask(), me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(),\n+        mogpFlags, adtId, rootId, groupId);\n+\n+    if (WMOAreaTableEntry const* wmoEntry = GetWMOAreaTableEntryByTripple(rootId, adtId, groupId))\n+    {\n+        _lastWMOAreaId = wmoEntry->ID;\n+        //BOT_LOG_ERROR(\"scripts\", \"_UpdateWMOArea(): bot {}: area {}, wmoarea {}\", me->GetName(), _lastAreaId, _lastWMOAreaId);\n+    }\n+}\n+\n+void bot_ai::_OnZoneUpdate(uint32 zoneId, uint32 areaId)\n+{\n+    ASSERT(me->IsInWorld());\n+\n+    _lastZoneId = zoneId;\n+\n+    SetGroupUpdateFlag(GROUP_UPDATE_FULL);\n+\n+    _OnAreaUpdate(areaId);\n+\n+    if (!IAmFree())\n+    {\n+        SpellAreaForAreaMapBounds saBounds = sSpellMgr->GetSpellAreaForAreaMapBounds(zoneId);\n+        for (SpellAreaForAreaMap::const_iterator itr = saBounds.first; itr != saBounds.second; ++itr)\n+        {\n+            if (itr->second->autocast && itr->second->IsFitToRequirements(master, zoneId, 0))\n+            {\n+                if (!me->HasAura(itr->second->spellId))\n+                    me->CastSpell(me, itr->second->spellId, true);\n+                if (botPet && !botPet->HasAura(itr->second->spellId))\n+                    botPet->CastSpell(botPet, itr->second->spellId, true);\n+            }\n+        }\n+    }\n+}\n+\n+void bot_ai::_OnAreaUpdate(uint32 areaId)\n+{\n+    ASSERT(me->IsInWorld());\n+\n+    _lastAreaId = areaId;\n+\n+    if (!IAmFree())\n+    {\n+        for (auto const& [spellId, aura] : me->GetOwnedAuras())\n+        {\n+            if (aura->GetSpellInfo()->HasAura(SPELL_AURA_MOUNTED))\n+                continue;\n+\n+            if (aura->GetSpellInfo()->CheckLocation(me->GetMapId(), _lastZoneId, areaId, master, false) != SPELL_CAST_OK)\n+            {\n+                //me->RemoveOwnedAura(iter);\n+                //we assume 1 aura at a time at most for area (once per 1.5 sec)\n+                me->RemoveAurasDueToSpell(spellId);\n+                if (botPet)\n+                    botPet->RemoveAurasDueToSpell(spellId);\n+                break;\n+            }\n+        }\n+\n+        SpellAreaForAreaMapBounds saBounds = sSpellMgr->GetSpellAreaForAreaMapBounds(areaId);\n+        for (SpellAreaForAreaMap::const_iterator itr = saBounds.first; itr != saBounds.second; ++itr)\n+        {\n+            if (itr->second->autocast && itr->second->IsFitToRequirements(master, _lastZoneId, 0))\n+            {\n+                if (!me->HasAura(itr->second->spellId))\n+                    me->CastSpell(me, itr->second->spellId, true);\n+                if (botPet && !botPet->HasAura(itr->second->spellId))\n+                    botPet->CastSpell(botPet, itr->second->spellId, true);\n+            }\n+        }\n+\n+        for (auto slot : NPCBots::index_array<uint8, BOT_FIRST_NON_WEAPON_SLOT>)\n+        {\n+            if (Item const* item = _equips[slot])\n+                if (item->IsLimitedToAnotherMapOrZone(me->GetMapId(), areaId))\n+                    if (_resetEquipment(slot, ObjectGuid::Empty, false) == BotEquipResult::BOT_EQUIP_RESULT_OK)\n+                        continue;\n+        }\n+    }\n+\n+    AreaTableEntry const* area = sAreaTableStore.LookupEntry(areaId);\n+    if (area && area->IsSanctuary())\n+    {\n+        if (!me->HasByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_SANCTUARY))\n+        {\n+            me->SetByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_SANCTUARY);\n+            me->CombatStop();\n+            if (botPet)\n+                botPet->CombatStop();\n+        }\n+    }\n+    else if (me->HasByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_SANCTUARY))\n+        me->RemoveByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_SANCTUARY);\n+}\n+\n+bool bot_ai::IsInHeroicOrRaid() const\n+{\n+    return me->FindMap() && (me->GetMap()->IsHeroic() || me->GetMap()->IsRaid());\n+}\n+\n+//SpellHit()... OnSpellHit()\n+void bot_ai::OnSpellHit(Unit* caster, SpellInfo const* spell)\n+{\n+    //uint32 const spellId = spell->Id;\n+\n+    if (!spell->IsPositive() && spell->GetMaxDuration() > 1000 && caster->IsControlledByPlayer() &&\n+        _botclass >= BOT_CLASS_EX_START)\n+    {\n+        //bots of W3 classes will not be easily CCed\n+        if (spell->HasAura(SPELL_AURA_MOD_STUN) || spell->HasAura(SPELL_AURA_MOD_CONFUSE) ||\n+            spell->HasAura(SPELL_AURA_MOD_PACIFY) || spell->HasAura(SPELL_AURA_MOD_ROOT))\n+        {\n+            if (Aura* cont = me->GetAura(spell->Id, caster->GetGUID()))\n+            {\n+                if (AuraApplication const* aurApp = cont->GetApplicationOfTarget(me->GetGUID()))\n+                {\n+                    if (!aurApp->IsPositive())\n+                    {\n+                        int32 dur = std::max<int32>(cont->GetMaxDuration() / 3, 1000);\n+                        cont->SetDuration(dur);\n+                        cont->SetMaxDuration(dur);\n+                    }\n+                }\n+            }\n+        }\n+    }\n+\n+    if (!HasBotCommandState(BOT_COMMAND_FULLSTOP | BOT_COMMAND_INACTION))\n+    {\n+        if (spell->HasAura(SPELL_AURA_MOD_TAUNT) || spell->HasEffect(SPELL_EFFECT_ATTACK_ME))\n+            if (caster && me->Attack(caster, !HasRole(BOT_ROLE_RANGED)))\n+            {}//me->GetMotionMaster()->MoveChase(caster);\n+    }\n+\n+    if (spell->GetSpellSpecific() == SPELL_SPECIFIC_DRINK)\n+    {\n+        feast_mana = true;\n+        UpdateMana();\n+        regenTimer = 0;\n+    }\n+    else if (spell->GetSpellSpecific() == SPELL_SPECIFIC_FOOD)\n+    {\n+        feast_health = true;\n+        regenTimer = 0;\n+    }\n+\n+    switch (spell->Id)\n+    {\n+        case WANDERER_HEARTHSTONE:\n+            if (IsWanderer())\n+            {\n+                Map* targetMap = (me->GetMap()->GetEntry()->IsContinent() && _travel_node_cur->GetMapId() != me->GetMap()->GetId()) ?\n+                    sMapMgr->CreateBaseMap(_travel_node_cur->GetMapId()) : me->GetMap();\n+                BotMgr::TeleportBot(me, targetMap, _travel_node_cur, true);\n+                _evadeCount = 0;\n+            }\n+            return;\n+        default:\n+            break;\n+    }\n+\n+    for (auto i : NPCBots::index_array<uint8, MAX_SPELL_EFFECTS>)\n+    {\n+        const auto auraname = spell->_effects[i].ApplyAuraName;\n+        //remove pet on mount\n+        if (auraname == SPELL_AURA_MOUNTED || (!spell->HasAura(SPELL_AURA_MOUNTED) && auraname == SPELL_AURA_MOD_INCREASE_VEHICLE_FLIGHT_SPEED))\n+        {\n+            //BOT_LOG_ERROR(\"entities.unit\", \"OnSpellHit: mount on {}\", me->GetName());\n+            if (master->HasAuraType(SPELL_AURA_MOD_INCREASE_VEHICLE_FLIGHT_SPEED) ||\n+                master->HasAuraType(SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED))\n+            {\n+                //BOT_LOG_ERROR(\"entities.unit\", \"OnSpellHit: modding flight speed\");\n+                UnsummonAll(false);\n+                const_cast<CreatureTemplate*>(me->GetCreatureTemplate())->Movement.Flight = CreatureFlightMovementType::DisableGravity;\n+                me->SetCanFly(true);\n+                me->SetDisableGravity(true);\n+                if (Aura* mount = me->GetAura(spell->Id))\n+                {\n+                    //BOT_LOG_ERROR(\"entities.unit\", \"OnSpellHit: found aura\");\n+                    for (uint8 j = 0; j != MAX_SPELL_EFFECTS; ++j)\n+                    {\n+                        if (spell->_effects[j].ApplyAuraName != SPELL_AURA_MOD_INCREASE_VEHICLE_FLIGHT_SPEED &&\n+                            spell->_effects[j].ApplyAuraName != SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED &&\n+                            spell->_effects[j].ApplyAuraName != SPELL_AURA_MOD_INCREASE_MOUNTED_SPEED &&\n+                            !(GetBotStance() == DRUID_FLIGHT_FORM && spell->_effects[j].ApplyAuraName == SPELL_AURA_MOD_INCREASE_SPEED))\n+                            continue;\n+                        if (AuraEffect* meff = mount->GetEffect(j))\n+                        {\n+                            meff->ChangeAmount(meff->GetAmount() * 3);\n+                        }\n+                    }\n+                }\n+                //me->SetSpeedRate(MOVE_FLIGHT, master->GetSpeedRate(MOVE_FLIGHT) * 1.37f);\n+                //me->SetSpeedRate(MOVE_RUN, master->GetSpeedRate(MOVE_FLIGHT) * 1.37f);\n+            }\n+            else\n+                me->SetSpeedRate(MOVE_RUN, master->GetSpeedRate(MOVE_RUN) * 1.1f);\n+        }\n+\n+        //update stats\n+        if (auraname == SPELL_AURA_MOD_STAT || auraname == SPELL_AURA_MOD_PERCENT_STAT ||\n+            auraname == SPELL_AURA_MOD_TOTAL_STAT_PERCENTAGE || auraname == SPELL_AURA_MOD_SKILL ||\n+            auraname == SPELL_AURA_MOD_ATTACK_POWER || auraname == SPELL_AURA_MOD_ATTACK_POWER_PCT ||\n+            auraname == SPELL_AURA_MOD_ATTACK_POWER_OF_STAT_PERCENT || auraname == SPELL_AURA_MOD_ATTACK_POWER_OF_ARMOR ||\n+            auraname == SPELL_AURA_MOD_SPELL_DAMAGE_OF_STAT_PERCENT ||\n+            auraname == SPELL_AURA_MOD_RATING || auraname == SPELL_AURA_MOD_RATING_FROM_STAT)\n+            shouldUpdateStats = true;\n+        else if (auraname == SPELL_AURA_MOD_INCREASE_HEALTH ||\n+            auraname == SPELL_AURA_MOD_INCREASE_HEALTH_2 ||\n+            auraname == SPELL_AURA_230 ||//SPELL_AURA_MOD_INCREASE_HEALTH_2 blood pact, commanding shout\n+            auraname == SPELL_AURA_MOD_INCREASE_HEALTH_PERCENT)\n+            UpdateHealth();\n+        else if (auraname == SPELL_AURA_MOD_INCREASE_ENERGY || auraname == SPELL_AURA_MOD_INCREASE_ENERGY_PERCENT)\n+            UpdateMana(); //Divine Hymn - max mana increase\n+\n+        uint32 const effect = spell->_effects[i].Effect;\n+        if (effect == SPELL_EFFECT_RESURRECT || effect == SPELL_EFFECT_RESURRECT_NEW || effect == SPELL_EFFECT_SELF_RESURRECT)\n+        {\n+            //resurrect effects are not handled for creatures\n+            if (!me->IsAlive())\n+            {\n+                uint32 health = 0;\n+                uint32 mana = 0;\n+                int32 damage = spell->_effects[i].BasePoints;\n+\n+                if (effect == SPELL_EFFECT_RESURRECT_NEW)\n+                {\n+                    //Glyph of Rebirth: resurrect with 100% health\n+                    if (spell->IsRankOf(sSpellMgr->GetSpellInfo(20484)))\n+                        health = me->GetMaxHealth();\n+                    else\n+                        health = damage;\n+                    mana = spell->_effects[i].MiscValue;\n+                }\n+                else if (damage < 0)\n+                {\n+                    health = uint32(-damage);\n+                    mana = spell->_effects[i].MiscValue;\n+                }\n+                else\n+                {\n+                    health = me->CountPctFromMaxHealth(damage);\n+                    if (me->GetMaxPower(POWER_MANA) > 1)\n+                        mana = CalculatePct(me->GetMaxPower(POWER_MANA), damage);\n+                }\n+\n+                BotMgr::ReviveBot(me, caster);\n+                _selfrez_spell_id = 0;\n+\n+                me->SetHealth(health);\n+                if (me->GetMaxPower(POWER_MANA) > 1)\n+                    me->SetPower(POWER_MANA, mana);\n+            }\n+        }\n+        //ravasaur poison (EffectEnchantHeldItem) for mh and oh\n+        if (effect == SPELL_EFFECT_ENCHANT_HELD_ITEM)\n+        {\n+            uint32 enchant_id = spell->_effects[i].MiscValue;\n+            if (!enchant_id)\n+                continue;\n+\n+            EnchantmentSlot slot = TEMP_ENCHANTMENT_SLOT;\n+            Item* weap = _equips[BOT_SLOT_MAINHAND];\n+            if (!weap || weap->GetEnchantmentId(slot))\n+                weap = _equips[BOT_SLOT_OFFHAND];\n+            if (!weap || weap->GetTemplate()->Class != ITEM_CLASS_WEAPON || weap->GetEnchantmentId(slot))\n+                continue;\n+\n+            int32 duration = spell->GetDuration();\n+            if (!duration)\n+                duration = 10; //10 sec default\n+\n+            if (!IAmFree())\n+                master->GetSession()->SendEnchantmentLog(me->GetGUID(), caster->GetGUID(), weap->GetEntry(), enchant_id);\n+\n+            weap->SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_ID_OFFSET, enchant_id);\n+            weap->SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_DURATION_OFFSET, duration * IN_MILLISECONDS);\n+            weap->SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_CHARGES_OFFSET, 0);\n+            ApplyItemBonuses(weap == _equips[BOT_SLOT_MAINHAND] ? BOT_SLOT_MAINHAND : BOT_SLOT_OFFHAND);\n+        }\n+    }\n+\n+    //TODO:\n+    if (/*!(spell->AttributesEx & SPELL_ATTR1_NO_THREAT) &&\n+        !(spell->AttributesEx3 & SPELL_ATTR3_NO_INITIAL_AGGRO) && !CCed(me) && */\n+        !me->GetVictim() &&\n+        (me->IsHostileTo(caster) || caster->IsHostileTo(me)))\n+    {\n+        //_atHome = false;\n+        if (!me->CanSeeOrDetect(caster))\n+        {\n+            if (_evadeMode)\n+                me->BotStopMovement();\n+        }\n+        else if (caster->IsInCombat() || me->IsInCombat())\n+            this->OwnerAttackedBy(caster);\n+        //if (_evadeMode == true && me->isMoving() && IAmFree())\n+    }\n+}\n+void bot_ai::OnSpellHitTarget(Unit* /*target*/, SpellInfo const* spell)\n+{\n+    if (me->GetVehicle())\n+    {\n+        uint32 spellId = spell->Id;\n+\n+        //Flame Spike, Revivify\n+        if (spellId == 56091 || spellId == 57090)\n+        {\n+            _vehcomboPoints = std::min(_vehcomboPoints + 1, 5);\n+            //BOT_LOG_ERROR(\"scripts\", \"OnBotSpellGo(): veh cp spell {} now cp {}\", curInfo->Id, uint32(_vehcomboPoints));\n+        }\n+        //Engulf in Flames, Life Burst, Flame Shield   moved to globalupdate\n+        if (spellId == 56092 || spellId == 57143 || spellId == 57108)\n+        {\n+            _vehcomboPoints = 0;\n+            //BOT_LOG_ERROR(\"scripts\", \"OnSpellHitTarget(): veh cp waster {}\", curInfo->Id);\n+        }\n+    }\n+}\n+//Update delay\n+//Skip UpdateAI cycles for randomization of bots' reaction and performance adjustments\n+bool bot_ai::Wait()\n+{\n+    if (waitTimer > lastdiff || !master->IsInWorld())\n+        return true;\n+\n+    if (IAmFree())\n+        waitTimer = (me->IsInCombat() || me->GetVictim() || IsCasting() || me->GetMap()->IsBattlegroundOrArena()) ? 500 : ((_rand + 100) * 20);\n+    else if (master->GetMap()->GetEntry()->IsWorldMap() && !me->IsInCombat() && !IsCasting())\n+        waitTimer = std::min<uint32>(uint32(50 * (master->GetNpcBotsCount() - 1) + _rand), 500);\n+    else\n+        waitTimer = _rand;\n+\n+    waitTimer += BotCfg::GetBaseUpdateDelay();\n+\n+    return false;\n+}\n+//Spell Mod Hooks\n+void bot_ai::ApplyBotDamageMultiplierMelee(uint32& damage, CalcDamageInfo& damageinfo) const\n+{\n+    //WHITE ATTACKS damage bonus\n+    damage *= BotCfg::GetBotDamageModByClass(GetBotClass());\n+    damage *= BotCfg::GetBotDamageModByLevel(me->GetLevel());\n+    ApplyClassDamageMultiplierMelee(damage, damageinfo);\n+}\n+void bot_ai::ApplyBotDamageMultiplierMelee(int32& damage, SpellNonMeleeDamage& damageinfo, SpellInfo const* spellInfo, WeaponAttackType attackType, bool iscrit) const\n+{\n+    //MELEE ABILITIES damage bonus (DMG_CLASS != DMG_CLASS_MAGIC)\n+    damage *= BotCfg::GetBotDamageModByClass(GetBotClass());\n+    damage *= BotCfg::GetBotDamageModByLevel(me->GetLevel());\n+    ApplyClassDamageMultiplierMeleeSpell(damage, damageinfo, spellInfo, attackType, iscrit);\n+}\n+void bot_ai::ApplyBotDamageMultiplierSpell(int32& damage, SpellNonMeleeDamage& damageinfo, SpellInfo const* spellInfo, WeaponAttackType attackType, bool iscrit) const\n+{\n+    //DAMAGE SPELLS damage bonus (DMG_CLASS_MAGIC)\n+    damage *= BotCfg::GetBotDamageModByClass(GetBotClass());\n+    damage *= BotCfg::GetBotDamageModByLevel(me->GetLevel());\n+    ApplyClassDamageMultiplierSpell(damage, damageinfo, spellInfo, attackType, iscrit);\n+}\n+void bot_ai::ApplyBotDamageMultiplierHeal(Unit const* victim, float& heal, SpellInfo const* spellInfo, DamageEffectType damagetype, uint32 stack) const\n+{\n+    //HEALING SPELLS amount bonus\n+    heal *= BotCfg::GetBotHealingModByLevel(me->GetLevel());\n+    ApplyClassDamageMultiplierHeal(victim, heal, spellInfo, damagetype, stack);\n+    heal = (heal * (BotMgr::IsWanderingWorldBot(me) ? BotCfg::GetBotWandererHealingMod() : BotCfg::GetBotHealingMod()));\n+}\n+void bot_ai::ApplyBotCritMultiplierAll(Unit const* victim, float& crit_chance, SpellInfo const* spellInfo, SpellSchoolMask schoolMask, WeaponAttackType attackType) const\n+{\n+    //ALL SPELLS crit bonus + base\n+    ApplyClassSpellCritMultiplierAll(victim, crit_chance, spellInfo, schoolMask, attackType);\n+    crit_chance += crit;\n+}\n+void bot_ai::ApplyBotSpellCostMods(SpellInfo const* spellInfo, int32& cost) const\n+{\n+    //ALL SPELLS power cost bonus\n+    ApplyClassSpellCostMods(spellInfo, cost);\n+}\n+void bot_ai::ApplyBotSpellCastTimeMods(SpellInfo const* spellInfo, int32& casttime) const\n+{\n+    //ALL SPELLS cast time bonus\n+    ApplyClassSpellCastTimeMods(spellInfo, casttime);\n+}\n+void bot_ai::ApplyBotSpellNotLoseCastTimeMods(SpellInfo const* spellInfo, int32& delayReduce) const\n+{\n+    //ALL SPELLS pushback reduce bonus\n+    ApplyClassSpellNotLoseCastTimeMods(spellInfo, delayReduce);\n+}\n+void bot_ai::ApplyBotSpellCooldownMods(SpellInfo const* spellInfo, uint32& cooldown) const\n+{\n+    //ALL SPELLS cooldown bonus\n+    ApplyClassSpellCooldownMods(spellInfo, cooldown);\n+}\n+void bot_ai::ApplyBotSpellCategoryCooldownMods(SpellInfo const* spellInfo, uint32& cooldown) const\n+{\n+    //ALL SPELLS category cooldown bonus\n+    ApplyClassSpellCategoryCooldownMods(spellInfo, cooldown);\n+}\n+void bot_ai::ApplyBotSpellGlobalCooldownMods(SpellInfo const* spellInfo, float& cooldown) const\n+{\n+    //ALL SPELLS global cooldown bonus\n+    ApplyClassSpellGlobalCooldownMods(spellInfo, cooldown);\n+}\n+void bot_ai::ApplyBotSpellRadiusMods(SpellInfo const* spellInfo, float& radius) const\n+{\n+    //ALL SPELLS radius bonus (not range)\n+    ApplyClassSpellRadiusMods(spellInfo, radius);\n+}\n+void bot_ai::ApplyBotSpellRangeMods(SpellInfo const* spellInfo, float& maxrange) const\n+{\n+    //ALL SPELLS range bonus\n+    ApplyClassSpellRangeMods(spellInfo, maxrange);\n+}\n+void bot_ai::ApplyBotSpellMaxTargetsMods(SpellInfo const* spellInfo, uint32& targets) const\n+{\n+    //ALL SPELLS max targets bonus\n+    ApplyClassSpellMaxTargetsMods(spellInfo, targets);\n+}\n+void bot_ai::ApplyBotSpellChanceOfSuccessMods(SpellInfo const* spellInfo, float& chance) const\n+{\n+    //ALL CLASS PROC_TRIGGER_SPELL SPELLS chance of success bonus\n+    ApplyClassSpellChanceOfSuccessMods(spellInfo, chance);\n+}\n+void bot_ai::ApplyBotEffectMods(SpellInfo const* spellInfo, uint8 effIndex, float& value) const\n+{\n+    //ALL SPELLS SPELLMOD_EFFECT_X bonus\n+    ApplyClassEffectMods(spellInfo, effIndex, value);\n+}\n+void bot_ai::ApplyBotThreatMods(SpellInfo const* spellInfo, float& threat) const\n+{\n+    //ALL threat mods\n+    ApplyClassThreatMods(spellInfo, threat);\n+}\n+void bot_ai::ApplyBotEffectValueMultiplierMods(SpellInfo const* spellInfo, SpellEffIndex effIndex, float& multiplier) const\n+{\n+    //ALL SPELLMOD_VALUE_MULTIPLIER mods\n+    ApplyClassEffectValueMultiplierMods(spellInfo, effIndex, multiplier);\n+}\n+//Spell Mod Utilities\n+float bot_ai::CalcSpellMaxRange(uint32 spellId, bool enemy) const\n+{\n+    SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);\n+    spellInfo = spellInfo->TryGetSpellInfoOverride(me);\n+\n+    float maxRange = spellInfo->GetMaxRange(!enemy);\n+    if (maxRange == 0x0)\n+        return maxRange;\n+\n+    ApplyClassSpellRangeMods(spellInfo, maxRange);\n+    return maxRange;\n+}\n+//////////\n+//GOSSIP//\n+//////////\n+//GossipHello\n+bool bot_ai::OnGossipHello(Player* player, uint32 /*option*/)\n+{\n+    if (!BotCfg::IsNpcBotModEnabled() || !(IsWanderer() ? BotCfg::IsWanderingClassEnabled(_botclass) : BotCfg::IsClassEnabled(_botclass)) ||\n+        IsTempBot() || me->IsInCombat() || CCed(me) || IsCasting() || IsDuringTeleport() ||\n+        HasBotCommandState(BOT_COMMAND_ISSUED_ORDER | BOT_COMMAND_NOGOSSIP) ||\n+        (me->GetVehicle() && me->GetVehicle()->GetBase()->IsInCombat()) ||\n+        (!player->IsGameMaster() && IsWanderer()))\n+    {\n+        player->PlayerTalkClass->SendCloseGossip();\n+        return true;\n+    }\n+\n+    if (me->isMoving())\n+        me->BotStopMovement();\n+\n+    evadeDelayTimer = std::max<decltype(evadeDelayTimer)>(evadeDelayTimer, 10000);\n+\n+    uint32 gossipTextId;\n+    if (!IAmFree())\n+    {\n+        if (_botclass == BOT_CLASS_SPHYNX)\n+            gossipTextId = GOSSIP_NORMAL_CUSTOM_SPHYNX;\n+        else if (_botclass == BOT_CLASS_DREADLORD)\n+            gossipTextId = GOSSIP_NORMAL_CUSTOM_DREADLORD;\n+        else if (_botclass == BOT_CLASS_DARK_RANGER)\n+            gossipTextId = GOSSIP_NORMAL_CUSTOM_DARKRANGER;\n+        else if (_botclass == BOT_CLASS_SEA_WITCH)\n+            gossipTextId = GOSSIP_NORMAL_CUSTOM_SEAWITCH;\n+        else if (_botclass == BOT_CLASS_CRYPT_LORD)\n+            gossipTextId = GOSSIP_NORMAL_CUSTOM_CRYPTLORD;\n+        else\n+            gossipTextId = GOSSIP_NORMAL_SERVE_MASTER;\n+    }\n+    else\n+    {\n+        if (_botclass == BOT_CLASS_SPHYNX)\n+            gossipTextId = GOSSIP_GREET_CUSTOM_SPHYNX;\n+        else if (_botclass == BOT_CLASS_DREADLORD)\n+            gossipTextId = GOSSIP_GREET_CUSTOM_DREADLORD;\n+        else if (_botclass == BOT_CLASS_DARK_RANGER)\n+            gossipTextId = GOSSIP_GREET_CUSTOM_DARKRANGER;\n+        else if (_botclass == BOT_CLASS_SEA_WITCH)\n+            gossipTextId = GOSSIP_GREET_CUSTOM_SEAWITCH;\n+        else if (_botclass == BOT_CLASS_CRYPT_LORD)\n+            gossipTextId = GOSSIP_GREET_CUSTOM_CRYPTLORD;\n+        else\n+            gossipTextId = GOSSIP_GREET_NEED_SMTH;\n+    }\n+\n+    bool menus = false;\n+\n+    const uint32 player_guidlow = player->GetGUID().GetCounter();\n+    const bool shared_owner = _botData->owner != player_guidlow && HasSharedOwner(player_guidlow);\n+\n+    if (player->IsGameMaster())\n+    {\n+        AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_DEBUG), GOSSIP_SENDER_DEBUG, GOSSIP_ACTION_INFO_DEF + 1);\n+        menus = true;\n+    }\n+\n+    if (player_guidlow != _botData->owner && IAmFree() && !IsWanderer())\n+    {\n+        uint32 cost = BotCfg::GetNpcBotCostHire(player->GetLevel(), _botclass);\n+\n+        int8 reason = 0;\n+        if (me->HasAura(BERSERK))\n+            reason = -1;\n+        if (!reason && _botData->owner)\n+            reason = 1;\n+        if (!reason && BotDataMgr::GetOwnedBotsCount(player->GetGUID()) >= BotCfg::GetMaxNpcBots(player->GetLevel()))\n+            reason = 2;\n+        if (!reason && !player->HasEnoughMoney(cost))\n+            reason = 3;\n+        if (!reason && BotCfg::GetMaxClassBots() && BotDataMgr::GetOwnedBotsCount(player->GetGUID(), me->GetClassMask()) >= BotCfg::GetMaxClassBots())\n+            reason = 4;\n+\n+        std::ostringstream message1;\n+        std::ostringstream message2;\n+        if (_botclass == BOT_CLASS_SPHYNX)\n+        {\n+            message1 << LocalizedNpcText(player, BOT_TEXT_HIREWARN_SPHYNX_1) << me->GetName() << LocalizedNpcText(player, BOT_TEXT_HIREWARN_SPHYNX_2);\n+            message2 << LocalizedNpcText(player, BOT_TEXT_HIREOPTION_SPHYNX);\n+        }\n+        else if (_botclass == BOT_CLASS_DREADLORD)\n+        {\n+            message1 << LocalizedNpcText(player, BOT_TEXT_HIREWARN_DREADLORD) << me->GetName() << '?';\n+            message2 << LocalizedNpcText(player, BOT_TEXT_HIREOPTION_DREADLORD);\n+        }\n+        else if (_botclass == BOT_CLASS_SEA_WITCH)\n+        {\n+            message1 << LocalizedNpcText(player, BOT_TEXT_HIREWARN_SEAWITCH);\n+            message2 << LocalizedNpcText(player, BOT_TEXT_HIREOPTION_SEAWITCH);\n+        }\n+        else if (_botclass == BOT_CLASS_CRYPT_LORD)\n+        {\n+            message1 << LocalizedNpcText(player, BOT_TEXT_HIREWARN_CRYPTLORD);\n+            message2 << LocalizedNpcText(player, BOT_TEXT_HIREOPTION_CRYPTLORD);\n+        }\n+        else\n+        {\n+            message1 << LocalizedNpcText(player, BOT_TEXT_HIREWARN_DEFAULT) << me->GetName() << '?';\n+            message2 << LocalizedNpcText(player, BOT_TEXT_HIREOPTION_DEFAULT);\n+        }\n+\n+        if (BotCfg::GetNpcBotCostRent(player->GetLevel(), _botclass))\n+            message1 << \"\\n(\" << BotCfg::GetNpcBotCostStr(player->GetLevel(), _botclass) << \")\";\n+\n+        if (!reason)\n+            player->PlayerTalkClass->GetGossipMenu().AddMenuItem(-1, GOSSIP_ICON_TAXI, message2.str(), GOSSIP_SENDER_HIRE, GOSSIP_ACTION_INFO_DEF + 0, message1.str(), cost, false);\n+        else\n+            AddGossipItemFor(player, GOSSIP_ICON_TAXI, message2.str(), GOSSIP_SENDER_HIRE, GOSSIP_ACTION_INFO_DEF + reason);\n+\n+        menus = true;\n+    }\n+\n+    if (_botData->owner)\n+    {\n+        Group const* gr = player->GetGroup();\n+\n+        if (player == master)\n+        {\n+            menus = true;\n+\n+            //general: equips, roles, distance, abilities, comsumables, group\n+            AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_MANAGE_EQUIPMENT), GOSSIP_SENDER_EQUIPMENT, GOSSIP_ACTION_INFO_DEF + 1);\n+            AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_MANAGE_ROLES), GOSSIP_SENDER_ROLES_MAIN, GOSSIP_ACTION_INFO_DEF + 1);\n+            AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_MANAGE_FORMATION), GOSSIP_SENDER_FORMATION, GOSSIP_ACTION_INFO_DEF + 1);\n+            AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_MANAGE_ABILITIES), GOSSIP_SENDER_ABILITIES, GOSSIP_ACTION_INFO_DEF + 1);\n+            if (_botclass < BOT_CLASS_EX_START)\n+            {\n+                if (me->GetLevel() >= 10)\n+                    AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_MANAGE_TALENTS), GOSSIP_SENDER_SPEC, GOSSIP_ACTION_INFO_DEF + 1);\n+                AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_GIVE_CONSUMABLE), GOSSIP_SENDER_USEITEM, GOSSIP_ACTION_INFO_DEF + 1);\n+            }\n+\n+            if (!gr)\n+            {\n+                AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_CREATE_GROUP), GOSSIP_SENDER_JOIN_GROUP, GOSSIP_ACTION_INFO_DEF + 1);\n+                if (player->GetNpcBotsCount() > 1)\n+                    AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_CREATE_GROUP_ALL), GOSSIP_SENDER_JOIN_GROUP, GOSSIP_ACTION_INFO_DEF + 2);\n+            }\n+            else if (!gr->IsMember(me->GetGUID()))\n+            {\n+                AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_ADD_TO_GROUP), GOSSIP_SENDER_JOIN_GROUP, GOSSIP_ACTION_INFO_DEF + 1);\n+                AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_ADD_TO_GROUP_ALL), GOSSIP_SENDER_JOIN_GROUP, GOSSIP_ACTION_INFO_DEF + 2);\n+            }\n+            else\n+                AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_REMOVE_FROM_GROUP), GOSSIP_SENDER_LEAVE_GROUP, GOSSIP_ACTION_INFO_DEF + 1);\n+\n+            //movement toggle\n+            if (HasBotCommandState(BOT_COMMAND_MASK_UNMOVING))\n+                AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_FOLLOW_ME), GOSSIP_SENDER_FOLLOWME, GOSSIP_ACTION_INFO_DEF + 1);\n+            if (!HasBotCommandState(BOT_COMMAND_STAY))\n+                AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_HOLD_POSITION), GOSSIP_SENDER_HOLDPOSITION, GOSSIP_ACTION_INFO_DEF + 1);\n+            if (!HasBotCommandState(BOT_COMMAND_FULLSTOP))\n+                AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_STAY_HERE), GOSSIP_SENDER_DONOTHING, GOSSIP_ACTION_INFO_DEF + 1);\n+        }\n+        if (player == master || (gr && gr->IsMember(master->GetGUID())))\n+        {\n+            //class-specific for party: mage rations, rogue lockpicking etc.\n+            //TODO: priest lightwell (manual only) maybe move into abilities\n+            switch (_botclass)\n+            {\n+                case BOT_CLASS_MAGE:\n+                {\n+                    AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_MAGE_FOOD), GOSSIP_SENDER_CLASS, GOSSIP_ACTION_INFO_DEF + 1);\n+                    AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_MAGE_DRINK), GOSSIP_SENDER_CLASS, GOSSIP_ACTION_INFO_DEF + 2);\n+                    if (me->GetLevel() >= 70)\n+                        AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_MAGE_TABLE), GOSSIP_SENDER_CLASS, GOSSIP_ACTION_INFO_DEF + 3);\n+                    menus = true;\n+                    break;\n+                }\n+                case BOT_CLASS_ROGUE:\n+                {\n+                    //Learned at 16\n+                    //Allow rogues to gain skill with bot's help\n+                    if (me->GetLevel() >= 16/* && !player->HasSkill(SKILL_LOCKPICKING)*/)\n+                    {\n+                        std::ostringstream msg;\n+                        msg << LocalizedNpcText(player, BOT_TEXT_ROGUE_PICKLOCK) << \" (\" << uint32(me->GetLevel() * 5) << \")\";\n+                        AddGossipItemFor(player, GOSSIP_ICON_CHAT, msg.str(), GOSSIP_SENDER_CLASS, GOSSIP_ACTION_INFO_DEF + 1);\n+                        menus = true;\n+                    }\n+                    break;\n+                }\n+                case BOT_CLASS_WARLOCK:\n+                {\n+                    AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_WARLOCK_HEALTHSTONE), GOSSIP_SENDER_CLASS, GOSSIP_ACTION_INFO_DEF + 1);\n+                    if (me->GetLevel() >= 68)\n+                        AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_WARLOCK_SOULWELL), GOSSIP_SENDER_CLASS, GOSSIP_ACTION_INFO_DEF + 3);\n+                    menus = true;\n+                    break;\n+                }\n+                default:\n+                    break;\n+            }\n+        }\n+        if (player == master)\n+        {\n+            //class-specific for owner: poisons, enchants, etc.\n+            switch (_botclass)\n+            {\n+                case BOT_CLASS_MAGE:\n+                {\n+                    if (me->GetLevel() >= 40)\n+                        AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_I_NEED_A_PORTAL), GOSSIP_SENDER_CLASS, GOSSIP_ACTION_INFO_DEF + 4);\n+                    break;\n+                }\n+                case BOT_CLASS_ROGUE:\n+                {\n+                    if (me->GetLevel() >= 20)\n+                    {\n+                        AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_ROGUE_POISON_REFRESH), GOSSIP_SENDER_CLASS, GOSSIP_ACTION_INFO_DEF + 2);\n+                        AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_ROGUE_POISON_MH), GOSSIP_SENDER_CLASS, GOSSIP_ACTION_INFO_DEF + 3);\n+                        Item const* oweap = _equips[BOT_SLOT_OFFHAND];\n+                        if (oweap && oweap->GetTemplate()->Class == ITEM_CLASS_WEAPON)\n+                            AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_ROGUE_POISON_OH), GOSSIP_SENDER_CLASS, GOSSIP_ACTION_INFO_DEF + 4);\n+                    }\n+                    break;\n+                }\n+                case BOT_CLASS_SHAMAN:\n+                {\n+                    if (me->GetLevel() >= 10)\n+                    {\n+                        AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_SHAMAN_ENCH_REFRESH), GOSSIP_SENDER_CLASS, GOSSIP_ACTION_INFO_DEF + 2);\n+                        AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_SHAMAN_ENCH_MH), GOSSIP_SENDER_CLASS, GOSSIP_ACTION_INFO_DEF + 3);\n+                        Item const* oweap = _equips[BOT_SLOT_OFFHAND];\n+                        if (oweap && oweap->GetTemplate()->Class == ITEM_CLASS_WEAPON)\n+                            AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_SHAMAN_ENCH_OH), GOSSIP_SENDER_CLASS, GOSSIP_ACTION_INFO_DEF + 4);\n+                    }\n+                    if (me->GetShapeshiftForm() != FORM_NONE)\n+                        AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_REMOVE_SHAPESHIFT), GOSSIP_SENDER_CLASS, GOSSIP_ACTION_INFO_DEF + 5);\n+                    break;\n+                }\n+                case BOT_CLASS_DRUID:\n+                {\n+                    if (me->GetShapeshiftForm() != FORM_NONE)\n+                        AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_REMOVE_SHAPESHIFT), GOSSIP_SENDER_CLASS, GOSSIP_ACTION_INFO_DEF + 1);\n+                    break;\n+                }\n+                case BOT_CLASS_HUNTER:\n+                {\n+                    if (me->GetLevel() >= 10)\n+                        AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_CHOOSE_PET_TYPE), GOSSIP_SENDER_CLASS, GOSSIP_ACTION_INFO_DEF + 2);\n+\n+                    break;\n+                }\n+                case BOT_CLASS_WARLOCK:\n+                {\n+                    AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_CHOOSE_PET_TYPE), GOSSIP_SENDER_CLASS, GOSSIP_ACTION_INFO_DEF + 2);\n+                    break;\n+                }\n+                default:\n+                    break;\n+            }\n+\n+            if (!shared_owner)\n+            {\n+                std::ostringstream astr;\n+                astr << LocalizedNpcText(player, BOT_TEXT_ABANDON_WARN_1) << me->GetName() << \"? \" << (BotCfg::IsEnrageOnDimissEnabled() ? LocalizedNpcText(player, BOT_TEXT_ABANDON_WARN_2) : \"\");\n+                player->PlayerTalkClass->GetGossipMenu().AddMenuItem(-1, GOSSIP_ICON_TAXI, LocalizedNpcText(player, BOT_TEXT_UR_DISMISSED),\n+                    GOSSIP_SENDER_DISMISS, GOSSIP_ACTION_INFO_DEF + 1, astr.str(), 0, false);\n+            }\n+\n+            if (BotCfg::IsSharedOwnerOptionEnabled(SharedOwnerOptionMask::SHARED_OWNER_OPTION_MASK_ENABLE))\n+                if (!shared_owner || BotCfg::IsSharedOwnerOptionEnabled(SharedOwnerOptionMask::SHARED_OWNER_OPTION_MASK_MANAGE_OWNERS))\n+                    AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_MANAGE_OWNERSHIP), GOSSIP_SENDER_OWNERSHIP, GOSSIP_ACTION_INFO_DEF + 1);\n+\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_PULL_URSELF), GOSSIP_SENDER_TROUBLESHOOTING, GOSSIP_ACTION_INFO_DEF + 1);\n+        }\n+    }\n+\n+    if (_botclass >= BOT_CLASS_EX_START)\n+    {\n+        menus = true;\n+        AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_STUDY_CREATURE), GOSSIP_SENDER_SCAN, GOSSIP_ACTION_INFO_DEF + 1);\n+    }\n+\n+    if (!menus)\n+    {\n+        player->PlayerTalkClass->SendCloseGossip();\n+        return true;\n+    }\n+\n+    AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_NEVERMIND), 0, GOSSIP_ACTION_INFO_DEF + 1);\n+    player->PlayerTalkClass->SendGossipMenu(gossipTextId, me->GetGUID());\n+    return true;\n+}\n+\n+//GossipSelect\n+bool bot_ai::OnGossipSelect(Player* player, Creature* creature/* == me*/, uint32 sender, uint32 action)\n+{\n+    if (!BotCfg::IsNpcBotModEnabled() || me->HasUnitState(UNIT_STATE_CASTING) || CCed(me) || HasBotCommandState(BOT_COMMAND_ISSUED_ORDER) ||\n+        (me->GetVehicle() && me->GetVehicle()->GetBase()->IsInCombat()))\n+    {\n+        player->PlayerTalkClass->SendCloseGossip();\n+        return true;\n+    }\n+\n+    if (me->isMoving())\n+        me->BotStopMovement();\n+\n+    evadeDelayTimer = std::max<decltype(evadeDelayTimer)>(evadeDelayTimer, 10000);\n+\n+    uint32 gossipTextId;\n+    if (!IAmFree())\n+    {\n+        if (_botclass == BOT_CLASS_SPHYNX)\n+            gossipTextId = GOSSIP_NORMAL_CUSTOM_SPHYNX;\n+        else if (_botclass == BOT_CLASS_DREADLORD)\n+            gossipTextId = GOSSIP_NORMAL_CUSTOM_DREADLORD;\n+        else if (_botclass == BOT_CLASS_DARK_RANGER)\n+            gossipTextId = GOSSIP_NORMAL_CUSTOM_DARKRANGER;\n+        else if (_botclass == BOT_CLASS_SEA_WITCH)\n+            gossipTextId = GOSSIP_NORMAL_CUSTOM_SEAWITCH;\n+        else if (_botclass == BOT_CLASS_CRYPT_LORD)\n+            gossipTextId = GOSSIP_NORMAL_CUSTOM_CRYPTLORD;\n+        else\n+            gossipTextId = GOSSIP_NORMAL_SERVE_MASTER;\n+    }\n+    else\n+    {\n+        if (_botclass == BOT_CLASS_SPHYNX)\n+            gossipTextId = GOSSIP_GREET_CUSTOM_SPHYNX;\n+        else if (_botclass == BOT_CLASS_DREADLORD)\n+            gossipTextId = GOSSIP_GREET_CUSTOM_DREADLORD;\n+        else if (_botclass == BOT_CLASS_DARK_RANGER)\n+            gossipTextId = GOSSIP_GREET_CUSTOM_DARKRANGER;\n+        else if (_botclass == BOT_CLASS_SEA_WITCH)\n+            gossipTextId = GOSSIP_GREET_CUSTOM_SEAWITCH;\n+        else if (_botclass == BOT_CLASS_CRYPT_LORD)\n+            gossipTextId = GOSSIP_GREET_CUSTOM_CRYPTLORD;\n+        else\n+            gossipTextId = GOSSIP_GREET_NEED_SMTH;\n+    }\n+\n+    player->PlayerTalkClass->ClearMenus();\n+    bool subMenu = false;\n+\n+    const ObjectGuid::LowType player_guidlow = player->GetGUID().GetCounter();\n+    const bool shared_owner = _botData->owner != player_guidlow && HasSharedOwner(player_guidlow);\n+\n+    switch (sender)\n+    {\n+        case 0: //any kind of fail\n+        {\n+            BotSay(\"...\", player);\n+            break;\n+        }\n+        case 1: //BACK: return to main menu\n+        {\n+            return bot_ai::OnGossipHello(player, 0);\n+        }\n+        case GOSSIP_SENDER_CLASS:\n+        {\n+            switch (_botclass)\n+            {\n+                case BOT_CLASS_MAGE:\n+                {\n+                    if (IsCasting())\n+                    {\n+                        player->SendEquipError(EQUIP_ERR_OBJECT_IS_BUSY, nullptr);\n+                        break;\n+                    }\n+\n+                    uint32 option = action - GOSSIP_ACTION_INFO_DEF;\n+                    if (option == 1 || option == 2) //food, water\n+                    {\n+                        //Prevent high-leveled consumables for low-level characters\n+                        Unit* checker;\n+                        if (player->GetLevel() < me->GetLevel())\n+                            checker = player;\n+                        else\n+                            checker = me;\n+\n+                        // Conjure Refreshment rank 1\n+                        uint32 food = InitSpell(checker, 42955);\n+                        bool iswater = (option == 2);\n+                        if (!food)\n+                        {\n+                            if (!iswater)// Conjure Food rank 1\n+                                food = InitSpell(checker, 587);\n+                            else// Conjure Water rank 1\n+                                food = InitSpell(checker, 5504);\n+                        }\n+                        if (!food)\n+                        {\n+                            BotWhisper(LocalizedNpcText(player, iswater ? BOT_TEXT_CANT_CONJURE_WATER_YET : BOT_TEXT_CANT_CONJURE_FOOD_YET), player);\n+                            break;\n+                        }\n+                        SpellInfo const* Info = sSpellMgr->GetSpellInfo(food);\n+                        Spell* foodspell = new Spell(me, Info, TRIGGERED_NONE, player->GetGUID());\n+                        SpellCastTargets targets;\n+                        targets.SetUnitTarget(player);\n+                        SpellCastResult result = me->IsMounted() || CCed(me) ? SPELL_FAILED_CUSTOM_ERROR : foodspell->CheckPetCast(player);\n+                        if (result != SPELL_CAST_OK)\n+                        {\n+                            foodspell->finish(false);\n+                            delete foodspell;\n+                            BotWhisper(LocalizedNpcText(player, BOT_TEXT_CANT_RIGHT_NOW), player);\n+                        }\n+                        else\n+                        {\n+                            aftercastTargetGuid = player->GetGUID();\n+                            foodspell->prepare(targets);\n+                            BotWhisper(LocalizedNpcText(player, BOT_TEXT_HERE_YOU_GO), player);\n+                        }\n+                        break;\n+                    }\n+                    else if (option == 3) //refreshment table\n+                    {\n+                        uint32 tableSpellId = GetSpell(43987); //Ritual of Refreshment\n+                        if (!tableSpellId)\n+                        {\n+                            BotWhisper(LocalizedNpcText(player, BOT_TEXT_DISABLED), player);\n+                            break;\n+                        }\n+                        if (!IsSpellReady(43987, GetLastDiff(), false))\n+                        {\n+                            BotWhisper(LocalizedNpcText(player, BOT_TEXT_NOT_READY_YET), player);\n+                            break;\n+                        }\n+                        uint32 tableGOForSpell = (tableSpellId == 43987 ? GO_REFRESHMENT_TABLE_1 : GO_REFRESHMENT_TABLE_2);\n+                        GameObjectTemplate const* goInfo = sObjectMgr->GetGameObjectTemplate(tableGOForSpell);\n+                        if (!goInfo)\n+                        {\n+                            BotWhisper(LocalizedNpcText(player, BOT_TEXT_INVALID_OBJECT_TYPE), player);\n+                            break;\n+                        }\n+                        float x,y,z;\n+                        me->GetClosePoint(x, y, z, me->GetCombatReach(), 0.f, 0.f);\n+                        QuaternionData rot = QuaternionData::fromEulerAnglesZYX(me->GetOrientation(), 0.f, 0.f);\n+\n+                        GameObject* table = new GameObject;\n+                        if (!table->Create(me->GetMap()->GenerateLowGuid<HighGuid::GameObject>(), tableGOForSpell, me->GetMap(),\n+                            me->GetPhaseMask(), Position(x,y,z,me->GetOrientation()), rot, 255, GO_STATE_READY))\n+                        {\n+                            delete table;\n+                            BotWhisper(LocalizedNpcText(player, BOT_TEXT_FAILED), player);\n+                            break;\n+                        }\n+\n+                        SetSpellCooldown(43987, 300000);\n+\n+                        table->SetRespawnTime(180);\n+                        //table->SetOwnerGUID(master->GetGUID());\n+                        master->AddGameObject(table);\n+                        table->SetSpellId(tableSpellId);\n+                        me->GetMap()->AddToMap(table);\n+\n+                        BotWhisper(LocalizedNpcText(player, BOT_TEXT_DONE), player);\n+                        break;\n+                    }\n+                    else if (option == 4) // portal\n+                    {\n+                        subMenu = true;\n+\n+                        if (player->GetTeamId() == TEAM_ALLIANCE)\n+                        {\n+                            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_STORMWIND), GOSSIP_SENDER_CLASS_ACTION1, GOSSIP_ACTION_INFO_DEF + uint32(PORTAL_STORMWIND));\n+                            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_IRONFORGE), GOSSIP_SENDER_CLASS_ACTION1, GOSSIP_ACTION_INFO_DEF + uint32(PORTAL_IRONFORGE));\n+                            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_DARNASSUS), GOSSIP_SENDER_CLASS_ACTION1, GOSSIP_ACTION_INFO_DEF + uint32(PORTAL_DARNASSUS));\n+                            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_EXORDAR), GOSSIP_SENDER_CLASS_ACTION1, GOSSIP_ACTION_INFO_DEF + uint32(PORTAL_EXODAR));\n+                            if (me->GetLevel() >= 65)\n+                                AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_SHATTRATH), GOSSIP_SENDER_CLASS_ACTION1, GOSSIP_ACTION_INFO_DEF + uint32(PORTAL_SHATTRATH_A));\n+                        }\n+                        else\n+                        {\n+                            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_ORGRIMMAR), GOSSIP_SENDER_CLASS_ACTION1, GOSSIP_ACTION_INFO_DEF + uint32(PORTAL_ORGRIMMAR));\n+                            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_UNDERCITY), GOSSIP_SENDER_CLASS_ACTION1, GOSSIP_ACTION_INFO_DEF + uint32(PORTAL_UNDERCITY));\n+                            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_THUNDER_BLUFF), GOSSIP_SENDER_CLASS_ACTION1, GOSSIP_ACTION_INFO_DEF + uint32(PORTAL_THUNDERBLUFF));\n+                            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_SILVERMOON), GOSSIP_SENDER_CLASS_ACTION1, GOSSIP_ACTION_INFO_DEF + uint32(PORTAL_SILVERMOON));\n+                            if (me->GetLevel() >= 65)\n+                                AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_SHATTRATH), GOSSIP_SENDER_CLASS_ACTION1, GOSSIP_ACTION_INFO_DEF + uint32(PORTAL_SHATTRATH_H));\n+                        }\n+                        if (me->GetLevel() >= 74)\n+                            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_DALARAN), GOSSIP_SENDER_CLASS_ACTION1, GOSSIP_ACTION_INFO_DEF + uint32(PORTAL_DALARAN));\n+                        AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_BACK), 1, GOSSIP_ACTION_INFO_DEF + 7);\n+                    }\n+                    break;\n+                }\n+                case BOT_CLASS_ROGUE:\n+                {\n+                    action -= GOSSIP_ACTION_INFO_DEF;\n+\n+                    if (action == 1)\n+                    {\n+                        // Pick Lock\n+                        subMenu = true;\n+\n+                        uint32 count = 0;\n+                        uint32 maxcounter = BOT_GOSSIP_MAX_ITEMS - 1; //BACK\n+\n+                        //1 Nearest gameobject\n+                        GameObject* obj = nullptr;\n+                        NearestLockedGameObjectInRangeCheck check(player, 4.f);\n+                        Bcore::GameObjectLastSearcher<NearestLockedGameObjectInRangeCheck> searcher(player, obj, check);\n+                        Cell::VisitAllObjects(player, searcher, 4.f);\n+                        //player->VisitNearbyGridObject(4.f, searcher);\n+                        if (obj)\n+                        {\n+                            std::ostringstream msg;\n+                            msg << obj->GetGOInfo()->name << \" (\" << LocalizedNpcText(player, BOT_TEXT_DISTANCE_SHORT) << \" = \" << player->GetExactDist(obj) << \")\";\n+                            AddGossipItemFor(player, GOSSIP_ICON_CHAT, msg.str(), GOSSIP_SENDER_CLASS_ACTION1, GOSSIP_ACTION_INFO_DEF + ++count);\n+                        }\n+\n+                        //2 Inventory\n+                        Item* item = nullptr;\n+                        LockEntry const* lockInfo;\n+\n+                        //backpack\n+                        for (uint8 i = INVENTORY_SLOT_ITEM_START; i != INVENTORY_SLOT_ITEM_END && count < maxcounter; ++i)\n+                        {\n+                            item = player->GetItemByPos(INVENTORY_SLOT_BAG_0, i);\n+                            if (item && item->IsLocked() && item->GetTemplate()->LockID)\n+                            {\n+                                lockInfo = sLockStore.LookupEntry(item->GetTemplate()->LockID);\n+                                if (!lockInfo)\n+                                    continue;\n+\n+                                for (auto j : NPCBots::index_array<uint8, MAX_LOCK_CASE>)\n+                                {\n+                                    if (lockInfo->Type[j] == LOCK_KEY_SKILL && lockInfo->Index[j] == LOCKTYPE_PICKLOCK &&\n+                                        lockInfo->Skill[j] <= uint32(15 + creature->GetLevel() * 5))\n+                                    {\n+                                        std::ostringstream name;\n+                                        _AddItemLink(player, item, name, false);\n+                                        AddGossipItemFor(player, GOSSIP_ICON_CHAT, name.str(), GOSSIP_SENDER_CLASS_ACTION1, GOSSIP_ACTION_INFO_DEF + item->GetGUID().GetCounter());\n+                                        ++count;\n+                                        break;\n+                                    }\n+                                }\n+                            }\n+                        }\n+                        //bags\n+                        for (uint8 i = INVENTORY_SLOT_BAG_START; i != INVENTORY_SLOT_BAG_END; ++i)\n+                        {\n+                            if (Bag const* bag = player->GetBagByPos(i))\n+                            {\n+                                for (uint32 j = 0; j != bag->GetBagSize() && count < maxcounter; ++j)\n+                                {\n+                                    item = player->GetItemByPos(i, j);\n+                                    if (item && item->IsLocked() && item->GetTemplate()->LockID)\n+                                    {\n+                                        lockInfo = sLockStore.LookupEntry(item->GetTemplate()->LockID);\n+                                        if (!lockInfo)\n+                                            continue;\n+\n+                                        for (auto k : NPCBots::index_array<uint8, MAX_LOCK_CASE>)\n+                                        {\n+                                            if (lockInfo->Type[k] == LOCK_KEY_SKILL && lockInfo->Index[k] == LOCKTYPE_PICKLOCK &&\n+                                                lockInfo->Skill[k] <= uint32(15 + creature->GetLevel() * 5))\n+                                            {\n+                                                std::ostringstream name;\n+                                                _AddItemLink(player, item, name, false);\n+                                                AddGossipItemFor(player, GOSSIP_ICON_CHAT, name.str(), GOSSIP_SENDER_CLASS_ACTION1, GOSSIP_ACTION_INFO_DEF + item->GetGUID().GetCounter());\n+                                                ++count;\n+                                                break;\n+                                            }\n+                                        }\n+                                    }\n+                                }\n+                            }\n+                        }\n+\n+                        AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_BACK), 1, GOSSIP_ACTION_INFO_DEF + ++count);\n+                    }\n+                    else if (action == 2)\n+                    {\n+                        //Clear poisons (autorefresh is in class ai DoNonCombatActions\n+                        RemoveItemClassEnchantments();\n+                    }\n+                    else if (action == 3)\n+                    {\n+                        subMenu = true;\n+                        bool isauto = GetAIMiscValue(BOTAI_MISC_ENCHANT_IS_AUTO_MH);\n+                        //Send list of available poisons on MH\n+                        for (uint32 i = BOTAI_MISC_ENCHANT_AVAILABLE_1; i <= BOTAI_MISC_ENCHANT_AVAILABLE_6; ++i)\n+                        {\n+                            uint32 possiblePoison = GetAIMiscValue(i);\n+                            if (uint32 possiblePoisonMaxRank = GetSpell(possiblePoison))\n+                            {\n+                                SpellInfo const* availableInfo = sSpellMgr->GetSpellInfo(possiblePoisonMaxRank);\n+                                uint32 curMHId = GetAIMiscValue(BOTAI_MISC_ENCHANT_CURRENT_MH);\n+                                bool same = possiblePoison == curMHId;\n+                                std::string spellName;\n+                                _LocalizeSpell(player, spellName, availableInfo->Id);\n+                                AddGossipItemFor(player, same ? GOSSIP_ICON_BATTLE : GOSSIP_ICON_CHAT, spellName, GOSSIP_SENDER_CLASS_ACTION2, GOSSIP_ACTION_INFO_DEF + possiblePoison);\n+                            }\n+                        }\n+                        AddGossipItemFor(player, isauto ? GOSSIP_ICON_BATTLE : GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_AUTO), GOSSIP_SENDER_CLASS_ACTION2, GOSSIP_ACTION_INFO_DEF + 0);\n+                        AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_BACK), 1, GOSSIP_ACTION_INFO_DEF + 1);\n+                    }\n+                    else if (action == 4)\n+                    {\n+                        subMenu = true;\n+                        bool isauto = GetAIMiscValue(BOTAI_MISC_ENCHANT_IS_AUTO_OH);\n+                        //Send list of available poisons on OH\n+                        for (uint32 i = BOTAI_MISC_ENCHANT_AVAILABLE_1; i <= BOTAI_MISC_ENCHANT_AVAILABLE_6; ++i)\n+                        {\n+                            uint32 possiblePoison = GetAIMiscValue(i);\n+                            if (uint32 possiblePoisonMaxRank = GetSpell(possiblePoison))\n+                            {\n+                                SpellInfo const* availableInfo = sSpellMgr->GetSpellInfo(possiblePoisonMaxRank);\n+                                uint32 curOHId = GetAIMiscValue(BOTAI_MISC_ENCHANT_CURRENT_OH);\n+                                bool same = possiblePoison == curOHId;\n+                                std::string spellName;\n+                                _LocalizeSpell(player, spellName, availableInfo->Id);\n+                                AddGossipItemFor(player, same ? GOSSIP_ICON_BATTLE : GOSSIP_ICON_CHAT, spellName, GOSSIP_SENDER_CLASS_ACTION3, GOSSIP_ACTION_INFO_DEF + possiblePoison);\n+                            }\n+                        }\n+                        AddGossipItemFor(player, isauto ? GOSSIP_ICON_BATTLE : GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_AUTO), GOSSIP_SENDER_CLASS_ACTION3, GOSSIP_ACTION_INFO_DEF + 0);\n+                        AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_BACK), 1, GOSSIP_ACTION_INFO_DEF + 1);\n+                    }\n+\n+                    break;\n+                }\n+                case BOT_CLASS_SHAMAN:\n+                {\n+                    action -= GOSSIP_ACTION_INFO_DEF;\n+\n+                    if (action == 2)\n+                    {\n+                        //Clear enchants (autorefresh is in class ai DoNonCombatActions\n+                        RemoveItemClassEnchantments();\n+                    }\n+                    else if (action == 3)\n+                    {\n+                        subMenu = true;\n+                        bool isauto = GetAIMiscValue(BOTAI_MISC_ENCHANT_IS_AUTO_MH);\n+                        //Send list of available enchants on MH\n+                        for (uint32 i = BOTAI_MISC_ENCHANT_AVAILABLE_1; i <= BOTAI_MISC_ENCHANT_AVAILABLE_5; ++i)\n+                        {\n+                            uint32 possibleEnchant = GetAIMiscValue(i);\n+                            if (uint32 possibleEcnhantMaxRank = GetSpell(possibleEnchant))\n+                            {\n+                                SpellInfo const* availableInfo = sSpellMgr->GetSpellInfo(possibleEcnhantMaxRank);\n+                                uint32 curMHId = GetAIMiscValue(BOTAI_MISC_ENCHANT_CURRENT_MH);\n+                                bool same = possibleEnchant == curMHId;\n+                                std::string spellName;\n+                                _LocalizeSpell(player, spellName, availableInfo->Id);\n+                                AddGossipItemFor(player, same ? GOSSIP_ICON_BATTLE : GOSSIP_ICON_CHAT, spellName, GOSSIP_SENDER_CLASS_ACTION2, GOSSIP_ACTION_INFO_DEF + possibleEnchant);\n+                            }\n+                        }\n+                        AddGossipItemFor(player, isauto ? GOSSIP_ICON_BATTLE : GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_AUTO), GOSSIP_SENDER_CLASS_ACTION2, GOSSIP_ACTION_INFO_DEF + 0);\n+                        AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_BACK), 1, GOSSIP_ACTION_INFO_DEF + 1);\n+                    }\n+                    else if (action == 4)\n+                    {\n+                        subMenu = true;\n+                        bool isauto = GetAIMiscValue(BOTAI_MISC_ENCHANT_IS_AUTO_OH);\n+                        //Send list of available enchants on OH\n+                        for (uint32 i = BOTAI_MISC_ENCHANT_AVAILABLE_1; i <= BOTAI_MISC_ENCHANT_AVAILABLE_5; ++i)\n+                        {\n+                            uint32 possibleEnchant = GetAIMiscValue(i);\n+                            if (uint32 possibleEcnhantMaxRank = GetSpell(possibleEnchant))\n+                            {\n+                                SpellInfo const* availableInfo = sSpellMgr->GetSpellInfo(possibleEcnhantMaxRank);\n+                                uint32 curOHId = GetAIMiscValue(BOTAI_MISC_ENCHANT_CURRENT_OH);\n+                                bool same = possibleEnchant == curOHId;\n+                                std::string spellName;\n+                                _LocalizeSpell(player, spellName, availableInfo->Id);\n+                                AddGossipItemFor(player, same ? GOSSIP_ICON_BATTLE : GOSSIP_ICON_CHAT, spellName, GOSSIP_SENDER_CLASS_ACTION3, GOSSIP_ACTION_INFO_DEF + possibleEnchant);\n+                            }\n+                        }\n+                        AddGossipItemFor(player, isauto ? GOSSIP_ICON_BATTLE : GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_AUTO), GOSSIP_SENDER_CLASS_ACTION3, GOSSIP_ACTION_INFO_DEF + 0);\n+                        AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_BACK), 1, GOSSIP_ACTION_INFO_DEF + 1);\n+                    }\n+                    else if (action == 5)\n+                    {\n+                        if (me->GetShapeshiftForm() == FORM_NONE)\n+                        {\n+                            BotWhisper(LocalizedNpcText(player, BOT_TEXT_NOT_SHAPESHIFTED), player);\n+                            break;\n+                        }\n+                        removeShapeshiftForm();\n+                    }\n+\n+                    break;\n+                }\n+                case BOT_CLASS_HUNTER:\n+                {\n+                    if (IsCasting())\n+                    {\n+                        player->SendEquipError(EQUIP_ERR_OBJECT_IS_BUSY, nullptr);\n+                        break;\n+                    }\n+\n+                    action -= GOSSIP_ACTION_INFO_DEF;\n+\n+                    if (action == 2)\n+                    {\n+                        subMenu = true;\n+                        uint32 curType = GetAIMiscValue(BOTAI_MISC_PET_TYPE);\n+                        for (uint32 i = BOTAI_MISC_PET_AVAILABLE_1; i <= BOTAI_MISC_PET_AVAILABLE_11; ++i)\n+                        {\n+                            if (uint32 possibleType = GetAIMiscValue(i))\n+                            {\n+                                std::string name;\n+                                if (possibleType == BOT_PET_CUNNING_START)\n+                                {\n+                                    name = LocalizedNpcText(player, BOT_TEXT_RANDOMPET_CUNNING);\n+                                    possibleType = urand(BOT_PET_CUNNING_START, BOT_PET_CUNNING_END);\n+                                }\n+                                else if (possibleType == BOT_PET_FEROCITY_START)\n+                                {\n+                                    name = LocalizedNpcText(player, BOT_TEXT_RANDOMPET_FEROCITY);\n+                                    possibleType = urand(BOT_PET_FEROCITY_START, BOT_PET_FEROCITY_END);\n+                                }\n+                                else if (possibleType == BOT_PET_TENACITY_START)\n+                                {\n+                                    name = LocalizedNpcText(player, BOT_TEXT_RANDOMPET_TENACITY);\n+                                    possibleType = urand(BOT_PET_TENACITY_START, BOT_PET_TENACITY_END);\n+                                }\n+                                else\n+                                {\n+                                    CreatureTemplate const* cinfo = sObjectMgr->GetCreatureTemplate(possibleType);\n+                                    ASSERT(cinfo);\n+                                    name = cinfo->Name;\n+                                }\n+                                bool same = possibleType == curType;\n+                                AddGossipItemFor(player, same ? GOSSIP_ICON_BATTLE : GOSSIP_ICON_CHAT, name, GOSSIP_SENDER_CLASS_ACTION4, GOSSIP_ACTION_INFO_DEF + possibleType);\n+                            }\n+                        }\n+                        bool noPet = curType == BOT_PET_INVALID;\n+                        AddGossipItemFor(player, noPet ? GOSSIP_ICON_BATTLE : GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_NONE2), GOSSIP_SENDER_CLASS_ACTION4, GOSSIP_ACTION_INFO_DEF + uint32(BOT_PET_INVALID));\n+                        AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_AUTO), GOSSIP_SENDER_CLASS_ACTION4, GOSSIP_ACTION_INFO_DEF + 0);\n+                        AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_BACK), 1, GOSSIP_ACTION_INFO_DEF + 1);\n+                    }\n+                    break;\n+                }\n+                case BOT_CLASS_WARLOCK:\n+                {\n+                    if (IsCasting())\n+                    {\n+                        player->SendEquipError(EQUIP_ERR_OBJECT_IS_BUSY, nullptr);\n+                        break;\n+                    }\n+\n+                    action -= GOSSIP_ACTION_INFO_DEF;\n+\n+                    if (action == 2)\n+                    {\n+                        subMenu = true;\n+                        uint32 curType = GetAIMiscValue(BOTAI_MISC_PET_TYPE);\n+                        for (uint32 i = BOTAI_MISC_PET_AVAILABLE_1; i <= BOTAI_MISC_PET_AVAILABLE_5; ++i)\n+                        {\n+                            if (uint32 possibleType = GetAIMiscValue(i))\n+                            {\n+                                CreatureTemplate const* cinfo = sObjectMgr->GetCreatureTemplate(possibleType);\n+                                ASSERT(cinfo);\n+                                bool same = possibleType == curType;\n+                                AddGossipItemFor(player, same ? GOSSIP_ICON_BATTLE : GOSSIP_ICON_CHAT, cinfo->Name, GOSSIP_SENDER_CLASS_ACTION4, GOSSIP_ACTION_INFO_DEF + possibleType);\n+                            }\n+                        }\n+                        bool noPet = curType == BOT_PET_INVALID;\n+                        AddGossipItemFor(player, noPet ? GOSSIP_ICON_BATTLE : GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_NONE2), GOSSIP_SENDER_CLASS_ACTION4, GOSSIP_ACTION_INFO_DEF + uint32(BOT_PET_INVALID));\n+                        AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_AUTO), GOSSIP_SENDER_CLASS_ACTION4, GOSSIP_ACTION_INFO_DEF + 0);\n+                        AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_BACK), 1, GOSSIP_ACTION_INFO_DEF + 1);\n+                    }\n+                    else if (action == 1)\n+                    {\n+                        if (GetAIMiscValue(6201) == 0)\n+                        {\n+                            BotWhisper(LocalizedNpcText(player, BOT_TEXT_NO_HEALTHSTONE), player);\n+                            break;\n+                        }\n+\n+                        //Prevent high-leveled healthstone for low-level characters\n+                        Unit* checker;\n+                        if (player->GetLevel() < me->GetLevel())\n+                            checker = player;\n+                        else\n+                            checker = me;\n+\n+                        static uint32 HealthStones[8] = { 19005,19007,19009,19011,19013,22105,36891,36894 };\n+                        uint32 spellId = InitSpell(me, 6201); //Create Healthstone Rank 1\n+                        SpellInfo const* spellInfo = spellId ? sSpellMgr->GetSpellInfo(spellId) : nullptr;\n+                        if (!spellInfo)\n+                        {\n+                            BotWhisper(LocalizedNpcText(player, BOT_TEXT_CANT_CREATE_HEALTHSTONE), player);\n+                            break;\n+                        }\n+\n+                        int8 i = spellInfo->GetRank() - 1;\n+                        for (; i != 0; --i)\n+                            if (ItemTemplate const* stone = sObjectMgr->GetItemTemplate(HealthStones[i]))\n+                                if (stone->RequiredLevel <= checker->GetLevel())\n+                                    break;\n+\n+                        //at least rank 1 (even if player is level 1)\n+                        ItemPosCountVec dest;\n+                        InventoryResult msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, HealthStones[i], 1);\n+                        if (msg != EQUIP_ERR_OK)\n+                        {\n+                            player->SendEquipError(msg, nullptr, nullptr, HealthStones[i]);\n+                            break;\n+                        }\n+                        Item* item = player->StoreNewItem(dest, HealthStones[i], true, 0);\n+                        if (!item)\n+                        {\n+                            player->SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND, nullptr, nullptr);\n+                            break;\n+                        }\n+\n+                        //remove healthstone\n+                        SetAIMiscValue(6201, 0);\n+\n+                        player->SendNewItem(item, 1, true, false, true);\n+                    }\n+                    else if (action == 3) //soulwell\n+                    {\n+                        uint32 wellSpellId = GetSpell(29893); //Ritual of Souls\n+                        if (!wellSpellId)\n+                        {\n+                            BotWhisper(LocalizedNpcText(player, BOT_TEXT_DISABLED), player);\n+                            break;\n+                        }\n+                        if (!IsSpellReady(29893, GetLastDiff(), false))\n+                        {\n+                            BotWhisper(LocalizedNpcText(player, BOT_TEXT_NOT_READY_YET), player);\n+                            break;\n+                        }\n+                        uint32 wellGOForSpell = (wellSpellId == 29893 ? GO_SOULWELL_1 : GO_SOULWELL_2);\n+                        GameObjectTemplate const* goInfo = sObjectMgr->GetGameObjectTemplate(wellGOForSpell);\n+                        if (!goInfo)\n+                        {\n+                            BotWhisper(LocalizedNpcText(player, BOT_TEXT_INVALID_OBJECT_TYPE), player);\n+                            break;\n+                        }\n+                        float x,y,z;\n+                        me->GetClosePoint(x, y, z, me->GetCombatReach(), 0.f, 0.f);\n+                        QuaternionData rot = QuaternionData::fromEulerAnglesZYX(me->GetOrientation(), 0.f, 0.f);\n+\n+                        GameObject* soulwell = new GameObject;\n+                        if (!soulwell->Create(me->GetMap()->GenerateLowGuid<HighGuid::GameObject>(), wellGOForSpell, me->GetMap(),\n+                            me->GetPhaseMask(), Position(x,y,z,me->GetOrientation()), rot, 255, GO_STATE_READY))\n+                        {\n+                            delete soulwell;\n+                            BotWhisper(LocalizedNpcText(player, BOT_TEXT_FAILED), player);\n+                            break;\n+                        }\n+\n+                        SetSpellCooldown(29893, 300000);\n+\n+                        soulwell->SetRespawnTime(180);\n+                        //soulwell->SetOwnerGUID(master->GetGUID());\n+                        master->AddGameObject(soulwell);\n+                        soulwell->SetSpellId(wellSpellId);\n+                        me->GetMap()->AddToMap(soulwell);\n+\n+                        BotWhisper(LocalizedNpcText(player, BOT_TEXT_DONE), player);\n+                        break;\n+                    }\n+                    break;\n+                }\n+                case BOT_CLASS_DRUID:\n+                {\n+                    if (IsCasting())\n+                    {\n+                        player->SendEquipError(EQUIP_ERR_OBJECT_IS_BUSY, nullptr);\n+                        break;\n+                    }\n+                    if (me->GetShapeshiftForm() == FORM_NONE)\n+                    {\n+                        BotWhisper(LocalizedNpcText(player, BOT_TEXT_NOT_SHAPESHIFTED), player);\n+                        break;\n+                    }\n+\n+                    removeShapeshiftForm();\n+                    break;\n+                }\n+\n+                default:\n+                    break;\n+            }\n+            break;\n+        }\n+        case GOSSIP_SENDER_CLASS_ACTION1:\n+        {\n+            switch (_botclass)\n+            {\n+                case BOT_CLASS_MAGE:\n+                {\n+                    if (!IsCasting())\n+                    {\n+                        uint32 portal_spell_id = action - GOSSIP_ACTION_INFO_DEF;\n+                        if (!portal_spell_id)\n+                            break;\n+\n+                        if (!IsSpellReady(portal_spell_id, lastdiff, false))\n+                        {\n+                            BotWhisper(LocalizedNpcText(player, BOT_TEXT_NOT_READY_YET), player);\n+                            return OnGossipSelect(player, creature, GOSSIP_SENDER_CLASS, GOSSIP_ACTION_INFO_DEF + 4);\n+                        }\n+\n+                        CastSpellExtraArgs args;\n+                        args.SetOriginalCaster(player->GetGUID());\n+                        me->CastSpell(me, portal_spell_id, args);\n+                    }\n+                    break;\n+                }\n+                case BOT_CLASS_ROGUE:\n+                {\n+                    if (!IsCasting())\n+                    {\n+                        // Pick Lock\n+                        uint32 picklock = InitSpell(me, 1804);\n+                        if (!picklock)\n+                        {\n+                            BotWhisper(LocalizedNpcText(player, BOT_TEXT_NO_LOCKPICKING), player);\n+                            break;\n+                        }\n+\n+                        SpellInfo const* Info = sSpellMgr->GetSpellInfo(picklock);\n+                        Spell* lockpickspell = new Spell(player, Info, TRIGGERED_NONE, me->GetGUID());\n+                        SpellCastTargets targets;\n+\n+                        if (action == GOSSIP_ACTION_INFO_DEF + 1)\n+                        {\n+                            //1 Nearest gameobject\n+                            GameObject* obj = nullptr;\n+                            NearestLockedGameObjectInRangeCheck check(player, 4.f);\n+                            Bcore::GameObjectLastSearcher<NearestLockedGameObjectInRangeCheck> searcher(player, obj, check);\n+                            Cell::VisitAllObjects(player, searcher, 4.f);\n+                            //player->VisitNearbyGridObject(4.f, searcher);\n+                            if (obj)\n+                            {\n+                                targets.SetGOTarget(obj);\n+                                lockpickspell->m_targets.SetGOTarget(obj); //for checkCast only\n+                            }\n+                        }\n+                        else\n+                        {\n+                            //2 Inventory\n+                            Item* item = nullptr;\n+                            uint32 guidLow = action - GOSSIP_ACTION_INFO_DEF;\n+\n+                            bool found = false;\n+                            //backpack\n+                            for (uint8 i = INVENTORY_SLOT_ITEM_START; i != INVENTORY_SLOT_ITEM_END; ++i)\n+                            {\n+                                item = player->GetItemByPos(INVENTORY_SLOT_BAG_0, i);\n+                                if (item && item->GetGUID().GetCounter() == guidLow)\n+                                {\n+                                    targets.SetItemTarget(item);\n+                                    lockpickspell->m_targets.SetItemTarget(item); //for checkCast only\n+                                    found = true;\n+                                    break;\n+                                }\n+                            }\n+                            //bags\n+                            if (!found)\n+                            {\n+                                for (uint8 i = INVENTORY_SLOT_BAG_START; i != INVENTORY_SLOT_BAG_END; ++i)\n+                                {\n+                                    if (Bag const* bag = player->GetBagByPos(i))\n+                                    {\n+                                        for (uint32 j = 0; j != bag->GetBagSize(); ++j)\n+                                        {\n+                                            item = player->GetItemByPos(i, j);\n+                                            if (item && item->GetGUID().GetCounter() == guidLow)\n+                                            {\n+                                                targets.SetItemTarget(item);\n+                                                lockpickspell->m_targets.SetItemTarget(item); //for checkCast only\n+                                                found = true;\n+                                                break;\n+                                            }\n+                                        }\n+                                    }\n+\n+                                    if (found)\n+                                        break;\n+                                }\n+                            }\n+                        }\n+\n+                        SpellCastResult result = me->IsMounted() || CCed(me) ? SPELL_FAILED_CUSTOM_ERROR : lockpickspell->CheckCast(false);\n+                        if (result != SPELL_CAST_OK)\n+                        {\n+                            lockpickspell->finish(false);\n+                            delete lockpickspell;\n+                            if (result == SPELL_FAILED_LOW_CASTLEVEL)\n+                                BotWhisper(LocalizedNpcText(player, BOT_TEXT_SKILL_LEVEL_TOO_LOW), player);\n+                            else\n+                                BotWhisper(LocalizedNpcText(player, BOT_TEXT_FAILED), player);\n+                        }\n+                        else\n+                        {\n+                            lockpickspell->prepare(targets);\n+                            //BotWhisper(\"Here...\", player);\n+                        }\n+                    }\n+                    return OnGossipSelect(player, creature, GOSSIP_SENDER_CLASS, GOSSIP_ACTION_INFO_DEF + 1);\n+                    //break;\n+                }\n+                default:\n+                    break;\n+            }\n+            break;\n+        }\n+        case GOSSIP_SENDER_CLASS_ACTION2: //set cur MH enchant\n+        {\n+            switch (_botclass)\n+            {\n+                case BOT_CLASS_ROGUE:\n+                {\n+                    uint32 baseId = action - GOSSIP_ACTION_INFO_DEF;\n+                    SetAIMiscValue(BOTAI_MISC_ENCHANT_CURRENT_MH, baseId);\n+                    break;\n+                }\n+                case BOT_CLASS_SHAMAN:\n+                {\n+                    uint32 baseId = action - GOSSIP_ACTION_INFO_DEF;\n+                    SetAIMiscValue(BOTAI_MISC_ENCHANT_CURRENT_MH, baseId);\n+                    break;\n+                }\n+            }\n+            return OnGossipHello(player, 0);\n+        }\n+        case GOSSIP_SENDER_CLASS_ACTION3: //set cur OH enchant\n+        {\n+            switch (_botclass)\n+            {\n+                case BOT_CLASS_ROGUE:\n+                {\n+                    uint32 baseId = action - GOSSIP_ACTION_INFO_DEF;\n+                    SetAIMiscValue(BOTAI_MISC_ENCHANT_CURRENT_OH, baseId);\n+                    break;\n+                }\n+                case BOT_CLASS_SHAMAN:\n+                {\n+                    uint32 baseId = action - GOSSIP_ACTION_INFO_DEF;\n+                    SetAIMiscValue(BOTAI_MISC_ENCHANT_CURRENT_OH, baseId);\n+                    break;\n+                }\n+            }\n+            return OnGossipHello(player, 0);\n+        }\n+        case GOSSIP_SENDER_CLASS_ACTION4: //set pet type\n+        {\n+            switch (_botclass)\n+            {\n+                case BOT_CLASS_HUNTER:\n+                {\n+                    uint32 petType = action - GOSSIP_ACTION_INFO_DEF;\n+                    SetAIMiscValue(BOTAI_MISC_PET_TYPE, petType);\n+                    break;\n+                }\n+                case BOT_CLASS_WARLOCK:\n+                {\n+                    uint32 petType = action - GOSSIP_ACTION_INFO_DEF;\n+                    SetAIMiscValue(BOTAI_MISC_PET_TYPE, petType);\n+                    break;\n+                }\n+            }\n+            return OnGossipHello(player, 0);\n+        }\n+        case GOSSIP_SENDER_MODEL_UPDATE:\n+        {\n+            if (Aura* trans = me->AddAura(MODEL_TRANSITION, me))\n+            {\n+                me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + uint32(BOT_SLOT_OFFHAND), 0); //debug: remove offhand visuals\n+                trans->SetDuration(500);\n+                trans->SetMaxDuration(500);\n+            }\n+            break;\n+        }\n+        case GOSSIP_SENDER_EQUIPMENT: //equips change s1: send what slots we can use\n+        {\n+            subMenu = true;\n+\n+            const bool can_change_equips = !shared_owner || BotCfg::IsSharedOwnerOptionEnabled(SharedOwnerOptionMask::SHARED_OWNER_OPTION_MASK_EQUIPMENT);\n+\n+            //show inventory\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_SHOW_INVENTORY), GOSSIP_SENDER_EQUIPMENT_LIST, GOSSIP_ACTION_INFO_DEF + 1);\n+\n+            //gear bank\n+            if (BotCfg::IsGearBankEnabled() && can_change_equips)\n+                AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_BOT_GEAR_BANK), GOSSIP_SENDER_EQUIPMENT_BANK_MENU, GOSSIP_ACTION_INFO_DEF + 1);\n+\n+            //auto-equip\n+            if (can_change_equips)\n+                AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_AUTOEQUIP) + \"...\", GOSSIP_SENDER_EQUIP_AUTOEQUIP, GOSSIP_ACTION_INFO_DEF + 1);\n+\n+            //weapons\n+            AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_SLOT_MH) + \"...\", GOSSIP_SENDER_EQUIPMENT_SHOW, GOSSIP_ACTION_INFO_DEF + uint32(BOT_SLOT_MAINHAND));\n+            if (_canUseOffHand())\n+                AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_SLOT_OH) + \"...\", GOSSIP_SENDER_EQUIPMENT_SHOW, GOSSIP_ACTION_INFO_DEF + uint32(BOT_SLOT_OFFHAND));\n+            if (_canUseRanged())\n+                AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_SLOT_RH) + \"...\", GOSSIP_SENDER_EQUIPMENT_SHOW, GOSSIP_ACTION_INFO_DEF + uint32(BOT_SLOT_RANGED));\n+            if (_canUseRelic())\n+                AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_SLOT_RELIC) + \"...\", GOSSIP_SENDER_EQUIPMENT_SHOW, GOSSIP_ACTION_INFO_DEF + uint32(BOT_SLOT_RANGED));\n+\n+            //armor\n+            AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_SLOT_HEAD) + \"...\", GOSSIP_SENDER_EQUIPMENT_SHOW, GOSSIP_ACTION_INFO_DEF + uint32(BOT_SLOT_HEAD));\n+            AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_SLOT_SHOULDERS) + \"...\", GOSSIP_SENDER_EQUIPMENT_SHOW, GOSSIP_ACTION_INFO_DEF + uint32(BOT_SLOT_SHOULDERS));\n+            AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_SLOT_CHEST) + \"...\", GOSSIP_SENDER_EQUIPMENT_SHOW, GOSSIP_ACTION_INFO_DEF + uint32(BOT_SLOT_CHEST));\n+            AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_SLOT_WAIST) + \"...\", GOSSIP_SENDER_EQUIPMENT_SHOW, GOSSIP_ACTION_INFO_DEF + uint32(BOT_SLOT_WAIST));\n+            AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_SLOT_LEGS) + \"...\", GOSSIP_SENDER_EQUIPMENT_SHOW, GOSSIP_ACTION_INFO_DEF + uint32(BOT_SLOT_LEGS));\n+            AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_SLOT_FEET) + \"...\", GOSSIP_SENDER_EQUIPMENT_SHOW, GOSSIP_ACTION_INFO_DEF + uint32(BOT_SLOT_FEET));\n+            AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_SLOT_WRIST) + \"...\", GOSSIP_SENDER_EQUIPMENT_SHOW, GOSSIP_ACTION_INFO_DEF + uint32(BOT_SLOT_WRIST));\n+            AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_SLOT_HANDS) + \"...\", GOSSIP_SENDER_EQUIPMENT_SHOW, GOSSIP_ACTION_INFO_DEF + uint32(BOT_SLOT_HANDS));\n+\n+            if (IsHumanoidClass(_botclass))\n+            {\n+                AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_SLOT_BACK) + \"...\", GOSSIP_SENDER_EQUIPMENT_SHOW, GOSSIP_ACTION_INFO_DEF + uint32(BOT_SLOT_BACK));\n+                AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_SLOT_SHIRT) + \"...\", GOSSIP_SENDER_EQUIPMENT_SHOW, GOSSIP_ACTION_INFO_DEF + uint32(BOT_SLOT_BODY));\n+                AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_SLOT_FINGER1) + \"...\", GOSSIP_SENDER_EQUIPMENT_SHOW, GOSSIP_ACTION_INFO_DEF + uint32(BOT_SLOT_FINGER1));\n+                AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_SLOT_FINGER2) + \"...\", GOSSIP_SENDER_EQUIPMENT_SHOW, GOSSIP_ACTION_INFO_DEF + uint32(BOT_SLOT_FINGER2));\n+                AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_SLOT_TRINKET1) + \"...\", GOSSIP_SENDER_EQUIPMENT_SHOW, GOSSIP_ACTION_INFO_DEF + uint32(BOT_SLOT_TRINKET1));\n+                AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_SLOT_TRINKET2) + \"...\", GOSSIP_SENDER_EQUIPMENT_SHOW, GOSSIP_ACTION_INFO_DEF + uint32(BOT_SLOT_TRINKET2));\n+                AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_SLOT_NECK) + \"...\", GOSSIP_SENDER_EQUIPMENT_SHOW, GOSSIP_ACTION_INFO_DEF + uint32(BOT_SLOT_NECK));\n+            }\n+\n+            if (can_change_equips)\n+            {\n+                AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_UNEQUIP_ALL), GOSSIP_SENDER_UNEQUIP_ALL,\n+                    GOSSIP_ACTION_INFO_DEF + 1, LocalizedNpcText(player, BOT_TEXT_UNEQUIP_ALL) + \"?\", 0, false);\n+\n+                if (BotCfg::IsGearBankEnabled())\n+                {\n+                    AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_UNEQUIP_ALL) + LocalizedNpcText(player, BOT_TEXT___GEAR_BANK_),\n+                        GOSSIP_SENDER_UNEQUIP_ALL_TO_GEARBANK, GOSSIP_ACTION_INFO_DEF + 1, LocalizedNpcText(player, BOT_TEXT_UNEQUIP_ALL) + LocalizedNpcText(player, BOT_TEXT___GEAR_BANK_) + \"?\", 0, false);\n+                }\n+\n+                if (creature->GetCreatureTemplate()->unit_flags2 & UNIT_FLAG2_MIRROR_IMAGE)\n+                    AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_UPDATE_VISUAL), GOSSIP_SENDER_MODEL_UPDATE, GOSSIP_ACTION_INFO_DEF + 1);\n+            }\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_BACK), 1, GOSSIP_ACTION_INFO_DEF + 1);\n+\n+            break;\n+        }\n+        case GOSSIP_SENDER_EQUIPMENT_LIST: //list inventory\n+        {\n+            //if (action - GOSSIP_ACTION_INFO_DEF != BOT_SLOT_NONE)\n+            //    break;\n+\n+            EquipmentInfo const* einfo = BotDataMgr::GetBotEquipmentInfo(me->GetEntry());\n+            for (auto slot : NPCBots::index_array<uint8, BOT_INVENTORY_SIZE>)\n+            {\n+                Item const* item = _equips[slot];\n+                if (!item) continue;\n+                std::ostringstream msg;\n+                _AddItemLink(player, item, msg/*, false*/);\n+                //uncomment if needed\n+                //msg << \" in slot \" << uint32(i) << \" (\" << _getNameForSlot(i + 1) << ')';\n+                if (slot <= BOT_SLOT_RANGED && einfo->ItemEntry[slot] == item->GetEntry())\n+                    msg << \" |cffe6cc80|h[!\" << LocalizedNpcText(player, BOT_TEXT_VISUALONLY) << \"!]|h|r\";\n+                BotWhisper(msg.view(), player);\n+            }\n+\n+            std::ostringstream msg2;\n+            msg2 << \"GS: \" << uint32(GetBotGearScores().first);\n+            BotWhisper(msg2.view(), player);\n+\n+            break;\n+        }\n+        case GOSSIP_SENDER_EQUIP_TRANSMOGRIFY_MHAND:     //0 - 1 main hand\n+        case GOSSIP_SENDER_EQUIP_TRANSMOGRIFY_OHAND:     //1 - 1 off hand\n+        case GOSSIP_SENDER_EQUIP_TRANSMOGRIFY_RANGED:    //2 - 1 ranged\n+        case GOSSIP_SENDER_EQUIP_TRANSMOGRIFY_HEAD:      //3 - 1 head\n+        case GOSSIP_SENDER_EQUIP_TRANSMOGRIFY_SHOULDERS: //4 - 1 shoulders\n+        case GOSSIP_SENDER_EQUIP_TRANSMOGRIFY_CHEST:     //5 - 1 chest\n+        case GOSSIP_SENDER_EQUIP_TRANSMOGRIFY_WAIST:     //6 - 1 waist\n+        case GOSSIP_SENDER_EQUIP_TRANSMOGRIFY_LEGS:      //7 - 1 legs\n+        case GOSSIP_SENDER_EQUIP_TRANSMOGRIFY_FEET:      //8 - 1 feet\n+        case GOSSIP_SENDER_EQUIP_TRANSMOGRIFY_WRIST:     //9 - 1 wrist\n+        case GOSSIP_SENDER_EQUIP_TRANSMOGRIFY_HANDS:     //10 - 1 hands\n+        case GOSSIP_SENDER_EQUIP_TRANSMOGRIFY_BACK:      //11 - 1 back\n+        case GOSSIP_SENDER_EQUIP_TRANSMOGRIFY_BODY:      //12 - 1 body\n+        {\n+            uint8 slot = sender - GOSSIP_SENDER_EQUIP_TRANSMOGRIFY;\n+            int32 itemId = (action == std::numeric_limits<uint32>::max()) ? -1 : int32(action);\n+            uint32 itemId_u = uint32(std::max<int32>(itemId, 0));\n+\n+            Item const* item = _equips[slot];\n+            ASSERT(item);\n+\n+            BotDataMgr::UpdateNpcBotTransmogData(me->GetEntry(), slot, item->GetEntry(), itemId);\n+\n+            if (slot <= BOT_SLOT_RANGED)\n+                me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + slot, itemId_u ? itemId_u : item->GetEntry());\n+\n+            return OnGossipSelect(player, creature, GOSSIP_SENDER_EQUIPMENT, GOSSIP_ACTION_INFO_DEF + 1);\n+        }\n+        case GOSSIP_SENDER_EQUIP_TRANSMOG_INFO:\n+        {\n+            uint8 slot = action - GOSSIP_ACTION_INFO_DEF;\n+\n+            NpcBotTransmogData const* tramsmogData = BotDataMgr::SelectNpcBotTransmogs(me->GetEntry());\n+            ASSERT(tramsmogData);\n+            ASSERT(tramsmogData->transmogs[slot].second >= 0);\n+\n+            uint32 item_id = uint32(tramsmogData->transmogs[slot].second);\n+            ItemTemplate const* proto = item_id ? sObjectMgr->GetItemTemplate(item_id) : nullptr;\n+            if (proto)\n+            {\n+                std::ostringstream msg;\n+                _AddItemTemplateLink(player, proto, msg);\n+                BotWhisper(msg.view(), player);\n+            }\n+\n+            //break; //no break here - return to menu\n+        }\n+        [[fallthrough]];\n+        case GOSSIP_SENDER_EQUIP_TRANSMOGS:\n+        {\n+            subMenu = true;\n+\n+            uint8 slot = action - GOSSIP_ACTION_INFO_DEF;\n+            Item const* item = _equips[slot];\n+            ASSERT(item);\n+\n+            std::set<uint32> itemList, idsList;\n+\n+            auto try_put_item = [player, slot, &itemList, &idsList, this](uint8 bag, uint8 bag_slot) {\n+                if (Item const* pItem = player->GetItemByPos(bag, bag_slot))\n+                {\n+                    if (IsValidTransmog(slot, pItem->GetTemplate()) && !idsList.contains(pItem->GetEntry()))\n+                    {\n+                        itemList.insert(pItem->GetGUID().GetCounter());\n+                        idsList.insert(pItem->GetEntry());\n+                    }\n+                }\n+            };\n+\n+            //s5.1: build list\n+            //s5.1.1: backpack\n+            for (uint8 i = INVENTORY_SLOT_ITEM_START; i != INVENTORY_SLOT_ITEM_END; ++i)\n+                try_put_item(INVENTORY_SLOT_BAG_0, i);\n+\n+            //s5.1.2: other bags\n+            for (uint8 i = INVENTORY_SLOT_BAG_START; i != INVENTORY_SLOT_BAG_END; ++i)\n+                if (Bag const* pBag = player->GetBagByPos(i))\n+                    for (uint32 j = 0; j != pBag->GetBagSize(); ++j)\n+                        try_put_item(i, j);\n+\n+            //s5.1.3: inventory\n+            for (uint8 i = EQUIPMENT_SLOT_START; i != EQUIPMENT_SLOT_END; ++i)\n+                try_put_item(INVENTORY_SLOT_BAG_0, i);\n+\n+            //s5.2: add gossips\n+            NpcBotTransmogData const* tramsmogData = BotDataMgr::SelectNpcBotTransmogs(me->GetEntry());\n+            if (tramsmogData && tramsmogData->transmogs[slot].first)\n+            {\n+                int32 item_id = tramsmogData->transmogs[slot].second;\n+                if (item_id >= 0)\n+                {\n+                    //s5.2.1.1: current\n+                    std::ostringstream msg;\n+                    if (item_id == 0)\n+                        msg << LocalizedNpcText(player, BOT_TEXT_HIDDEN);\n+                    else if (ItemTemplate const* proto = sObjectMgr->GetItemTemplate(uint32(item_id)))\n+                        _AddItemTemplateLink(player, proto, msg);\n+                    else\n+                        msg << '<' << LocalizedNpcText(player, BOT_TEXT_UNKNOWN) << \"(\" << item_id << \")>\";\n+\n+                    AddGossipItemFor(player, GOSSIP_ICON_BATTLE, msg.str(), GOSSIP_SENDER_EQUIP_TRANSMOG_INFO, GOSSIP_ACTION_INFO_DEF + slot);\n+\n+                    //s5.2.1.2a: reset\n+                    AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_NONE), GOSSIP_SENDER_EQUIP_TRANSMOGRIFY + slot, std::numeric_limits<uint32>::max());\n+                }\n+                else\n+                {\n+                    //s5.2.1.2b: None\n+                    AddGossipItemFor(player, GOSSIP_ICON_BATTLE, LocalizedNpcText(player, BOT_TEXT_NONE), GOSSIP_SENDER_EQUIP_TRANSMOGS, action);\n+                }\n+            }\n+\n+            //s5.2.1.2c: hide\n+            if (slot > BOT_SLOT_RANGED &&\n+                !(tramsmogData && tramsmogData->transmogs[slot].first && tramsmogData->transmogs[slot].second == 0))\n+                AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_HIDDEN), GOSSIP_SENDER_EQUIP_TRANSMOGRIFY + slot, 0);\n+\n+            if (!itemList.empty())\n+            {\n+                uint32 counter = 0;\n+                std::ostringstream name;\n+                const uint32 maxcounter = BOT_GOSSIP_MAX_ITEMS - 3; //current, reset, back\n+\n+                auto try_add_gossip = [player, slot, &counter, &name, this](uint8 bag, uint8 bag_slot, uint32 guidlow) {\n+                    Item const* pitem = player->GetItemByPos(bag, bag_slot);\n+                    if (pitem && pitem->GetGUID().GetCounter() == guidlow)\n+                    {\n+                        _AddItemLink(player, pitem, name);\n+                        AddGossipItemFor(player, GOSSIP_ICON_CHAT, name.str(), GOSSIP_SENDER_EQUIP_TRANSMOGRIFY + slot, pitem->GetEntry());\n+                        name.str(\"\");\n+                        ++counter;\n+                        return true;\n+                    }\n+                    return false;\n+                };\n+\n+                //s5.2.2: add items as gossip options\n+                for (std::set<uint32>::const_iterator itr = itemList.begin(); itr != itemList.end() && counter < maxcounter; ++itr)\n+                {\n+                    bool found = false;\n+                    for (uint8 i = INVENTORY_SLOT_ITEM_START; i != INVENTORY_SLOT_ITEM_END; ++i)\n+                    {\n+                        if (try_add_gossip(INVENTORY_SLOT_BAG_0, i, *itr))\n+                        {\n+                            found = true;\n+                            break;\n+                        }\n+                    }\n+\n+                    if (found)\n+                        continue;\n+\n+                    for (uint8 i = EQUIPMENT_SLOT_START; i != EQUIPMENT_SLOT_END; ++i)\n+                    {\n+                        if (try_add_gossip(INVENTORY_SLOT_BAG_0, i, *itr))\n+                        {\n+                            found = true;\n+                            break;\n+                        }\n+                    }\n+\n+                    if (found)\n+                        continue;\n+\n+                    for (uint8 i = INVENTORY_SLOT_BAG_START; i != INVENTORY_SLOT_BAG_END; ++i)\n+                    {\n+                        if (Bag const* pBag = player->GetBagByPos(i))\n+                        {\n+                            for (uint32 j = 0; j != pBag->GetBagSize(); ++j)\n+                            {\n+                                if (try_add_gossip(i, j, *itr))\n+                                {\n+                                    found = true;\n+                                    break;\n+                                }\n+                            }\n+                        }\n+\n+                        if (found)\n+                            break;\n+                    }\n+\n+                    if (found)\n+                        continue;\n+                }\n+            }\n+\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_BACK), GOSSIP_SENDER_EQUIPMENT, GOSSIP_ACTION_INFO_DEF + 2);\n+\n+            break;\n+        }\n+        case GOSSIP_SENDER_EQUIPMENT_INFO: //request equip item info\n+        {\n+            //GOSSIP ITEMS RESTRICTED\n+            //subMenu = true; //needed for return\n+\n+            EquipmentInfo const* einfo = BotDataMgr::GetBotEquipmentInfo(me->GetEntry());\n+            uint8 slot = action - GOSSIP_ACTION_INFO_DEF;\n+            Item const* item = _equips[slot];\n+            ASSERT(item);\n+\n+            std::ostringstream msg;\n+            _AddItemLink(player, item, msg, false);\n+\n+            if (slot <= BOT_SLOT_RANGED && einfo->ItemEntry[slot] == item->GetEntry())\n+                msg << \" |cffe6cc80|h[!\" << LocalizedNpcText(player, BOT_TEXT_VISUALONLY) << \"!]|h|r\";\n+\n+            msg << \" GS: \" << uint32(CalculateItemGearScore(item->GetTemplate(), me->GetEntry(), me->GetLevel(), GetBotClass(), GetSpec(), slot));\n+\n+            BotWhisper(msg.view(), player);\n+\n+            //break; //no break here - return to menu\n+        }\n+        [[fallthrough]];\n+        case GOSSIP_SENDER_EQUIPMENT_SHOW: //equips change s2: send list of equippable items\n+        {\n+            subMenu = true;\n+            const uint8 slot = action - GOSSIP_ACTION_INFO_DEF;\n+\n+            const bool can_change_equips = !shared_owner || BotCfg::IsSharedOwnerOptionEnabled(SharedOwnerOptionMask::SHARED_OWNER_OPTION_MASK_EQUIPMENT);\n+\n+            EquipmentInfo const* einfo = BotDataMgr::GetBotEquipmentInfo(me->GetEntry());\n+            std::set<uint32> itemList, idsList;\n+\n+            //s2.1: build list\n+            //s2.1.1: backpack\n+            if (can_change_equips)\n+            {\n+                auto try_put_item = [player, slot, einfo, &itemList, &idsList, this](uint8 bag, uint8 bag_slot) {\n+                    if (Item const* pItem = player->GetItemByPos(bag, bag_slot))\n+                    {\n+                        if (!std::ranges::any_of(einfo->ItemEntry, [=](uint32 eeid) { return eeid == pItem->GetEntry(); }) &&\n+                            _canEquip(pItem->GetTemplate(), slot, true, pItem) &&\n+                            (pItem->GetItemRandomPropertyId() == 0 || !idsList.contains(pItem->GetEntry())))\n+                        {\n+                            itemList.insert(pItem->GetGUID().GetCounter());\n+                            idsList.insert(pItem->GetEntry());\n+                        }\n+                    }\n+                };\n+\n+                for (uint8 i = INVENTORY_SLOT_ITEM_START; i != INVENTORY_SLOT_ITEM_END; ++i)\n+                    try_put_item(INVENTORY_SLOT_BAG_0, i);\n+\n+                //s2.1.2: other bags\n+                for (uint8 i = INVENTORY_SLOT_BAG_START; i != INVENTORY_SLOT_BAG_END; ++i)\n+                    if (Bag const* pBag = player->GetBagByPos(i))\n+                        for (uint32 j = 0; j != pBag->GetBagSize(); ++j)\n+                           try_put_item(i, j);\n+            }\n+\n+            //s2.2: add gossips\n+\n+            //s2.2.0 add current item (with return)\n+            std::ostringstream str;\n+            str << LocalizedNpcText(player, BOT_TEXT_EQUIPPED) << \": \";\n+            if (Item const* item = _equips[slot])\n+            {\n+                bool visual_only = slot <= BOT_SLOT_RANGED && einfo->ItemEntry[slot] == item->GetEntry();\n+\n+                _AddItemLink(player, item, str);\n+                if (visual_only)\n+                    str << \" |cffe6cc80|h[!\" << LocalizedNpcText(player, BOT_TEXT_VISUALONLY) << \"!]|h|r\";\n+\n+                str << \" GS: \" << uint32(CalculateItemGearScore(item->GetTemplate(), me->GetEntry(), me->GetLevel(), GetBotClass(), GetSpec(), slot));\n+\n+                AddGossipItemFor(player, GOSSIP_ICON_CHAT, str.str(), GOSSIP_SENDER_EQUIPMENT_INFO, action);\n+\n+                if (can_change_equips && !visual_only && BotCfg::DisplayEquipment() && BotCfg::IsTransmogEnabled() && slot < BOT_TRANSMOG_INVENTORY_SIZE && CanDisplayNonWeaponEquipmentChanges())\n+                    AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_TRANSMOGRIFICATION), GOSSIP_SENDER_EQUIP_TRANSMOGS, action);\n+            }\n+            else\n+            {\n+                str << LocalizedNpcText(player, BOT_TEXT_NOTHING);\n+                AddGossipItemFor(player, GOSSIP_ICON_CHAT, str.str(), GOSSIP_SENDER_EQUIPMENT_SHOW, action);\n+            }\n+\n+            if (can_change_equips && _equips[slot])\n+            {\n+                //s2.2.1 add unequip option if have weapon (GMs only)\n+                if (slot <= BOT_SLOT_RANGED)\n+                {\n+                    if (einfo->ItemEntry[slot] != 0)\n+                    {\n+                        AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_USE_OLD_EQUIPMENT), GOSSIP_SENDER_EQUIP_RESET, action);\n+                        if (BotCfg::IsGearBankEnabled())\n+                            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_USE_OLD_EQUIPMENT) + LocalizedNpcText(player, BOT_TEXT___GEAR_BANK_),\n+                                GOSSIP_SENDER_EQUIP_RESET_TO_GEARBANK, action);\n+                    }\n+                    else\n+                    {\n+                        AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_UNEQUIP), GOSSIP_SENDER_UNEQUIP, action);\n+                        if (BotCfg::IsGearBankEnabled())\n+                            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_UNEQUIP) + LocalizedNpcText(player, BOT_TEXT___GEAR_BANK_),\n+                                GOSSIP_SENDER_UNEQUIP_TO_GEARBANK, action);\n+                    }\n+                }\n+\n+                //s2.2.2 add unequip option for non-weapons\n+                if (slot > BOT_SLOT_RANGED)\n+                {\n+                    AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_UNEQUIP), GOSSIP_SENDER_UNEQUIP, action);\n+                    if (BotCfg::IsGearBankEnabled())\n+                        AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_UNEQUIP) + LocalizedNpcText(player, BOT_TEXT___GEAR_BANK_),\n+                            GOSSIP_SENDER_UNEQUIP_TO_GEARBANK, action);\n+                }\n+            }\n+\n+            //s2.2.3a: add an empty submenu with info if no items are found\n+            if (can_change_equips)\n+            {\n+                if (itemList.empty())\n+                {\n+                    AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_NOTHING_TO_GIVE), 0, GOSSIP_ACTION_INFO_DEF + 1);\n+                }\n+                else\n+                {\n+                    uint32 counter = 0;\n+                    const uint32 maxcounter = BOT_GOSSIP_MAX_ITEMS - 6; //unequip, unequip (gear bank), reset, current, transmog, back\n+                    std::ostringstream name;\n+\n+                    auto try_put_gossip = [player, slot, &name, &counter, this](uint8 bag, uint8 bag_slot, uint32 guidlow) {\n+                        if (Item const* pItem = player->GetItemByPos(bag, bag_slot); pItem && pItem->GetGUID().GetCounter() == guidlow)\n+                        {\n+                            _AddItemLink(player, pItem, name);\n+                            name << \" GS: \" << uint32(CalculateItemGearScore(pItem->GetTemplate(), me->GetEntry(), me->GetLevel(), GetBotClass(), GetSpec(), slot));\n+                            if (BotCfg::SendEquipListItems())\n+                                BotWhisper(name.view(), player);\n+                            AddGossipItemFor(player, GOSSIP_ICON_CHAT, name.str(), GOSSIP_SENDER_EQUIP + slot, GOSSIP_ACTION_INFO_DEF + pItem->GetGUID().GetCounter());\n+                            ++counter;\n+                            return true;\n+                        }\n+                        return false;\n+                    };\n+\n+                    //s2.2.3b: add items as gossip options\n+                    for (std::set<uint32>::const_iterator itr = itemList.begin(); itr != itemList.end() && counter < maxcounter; ++itr)\n+                    {\n+                        bool found = false;\n+                        for (uint8 i = INVENTORY_SLOT_ITEM_START; i != INVENTORY_SLOT_ITEM_END; ++i)\n+                        {\n+                            if (try_put_gossip(INVENTORY_SLOT_BAG_0, i, *itr))\n+                            {\n+                                found = true;\n+                                break;\n+                            }\n+                        }\n+\n+                        if (found)\n+                            continue;\n+\n+                        for (uint8 i = INVENTORY_SLOT_BAG_START; i != INVENTORY_SLOT_BAG_END; ++i)\n+                        {\n+                            if (Bag const* pBag = player->GetBagByPos(i))\n+                            {\n+                                for (uint32 j = 0; j != pBag->GetBagSize(); ++j)\n+                                {\n+                                    if (try_put_gossip(i, j, *itr))\n+                                    {\n+                                        found = true;\n+                                        break;\n+                                    }\n+                                }\n+                            }\n+\n+                            if (found)\n+                                break;\n+                        }\n+\n+                        if (found)\n+                            continue;\n+                    }\n+                }\n+            }\n+\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_BACK), GOSSIP_SENDER_EQUIPMENT, GOSSIP_ACTION_INFO_DEF + 2);\n+\n+            //BOT_LOG_ERROR(\"entities.player\", \"OnGossipSelect(bot): added {} item(s) to list of {} (requester: {})\",\n+            //    counter, me->GetName(), player->GetName());\n+\n+            break;\n+        }\n+        case GOSSIP_SENDER_UNEQUIP: //equips change s3: Unequip DEPRECATED\n+        {\n+            if (_unequip(action - GOSSIP_ACTION_INFO_DEF, player->GetGUID(), false) != BotEquipResult::BOT_EQUIP_RESULT_OK)\n+            {} //BotWhisper(\"Impossible...\", player);\n+            return OnGossipSelect(player, creature, GOSSIP_SENDER_EQUIPMENT, GOSSIP_ACTION_INFO_DEF + 1);\n+        }\n+        case GOSSIP_SENDER_UNEQUIP_TO_GEARBANK:\n+        {\n+            BotEquipResult unequip_result = _unequip(action - GOSSIP_ACTION_INFO_DEF, player->GetGUID(), true);\n+            if (unequip_result != BotEquipResult::BOT_EQUIP_RESULT_OK)\n+            {\n+                if (unequip_result == BotEquipResult::BOT_EQUIP_RESULT_FAIL_NO_BANK_SPACE)\n+                {\n+                    uint32 max_size = BotCfg::GetGearBankCapacity();\n+                    uint32 gb_size = BotDataMgr::GetBotBankItemsCount(player->GetGUID());\n+                    ChatHandler ch(player->GetSession());\n+                    ch.PSendSysMessage(bot_ai::LocalizedNpcText(player, BOT_TEXT_NOT_ENOUGH_GEAR_BANK_SPACE).c_str(), uint32(1), gb_size, max_size);\n+                }\n+                else\n+                    BotWhisper(LocalizedNpcText(player, BOT_TEXT_FAILED), player);\n+            }\n+            return OnGossipSelect(player, creature, GOSSIP_SENDER_EQUIPMENT, GOSSIP_ACTION_INFO_DEF + 1);\n+        }\n+        case GOSSIP_SENDER_UNEQUIP_ALL:\n+        {\n+            BotEquipResult unequip_all_result = UnEquipAll(player->GetGUID(), false);\n+            if (unequip_all_result != BotEquipResult::BOT_EQUIP_RESULT_OK)\n+                BotWhisper(LocalizedNpcText(player, BOT_TEXT_FAILED), player);\n+            else\n+                me->HandleEmoteCommand(EMOTE_ONESHOT_CRY);\n+            break;\n+        }\n+        case GOSSIP_SENDER_UNEQUIP_ALL_TO_GEARBANK:\n+        {\n+            BotEquipResult unequip_all_result = UnEquipAll(player->GetGUID(), true);\n+            if (unequip_all_result != BotEquipResult::BOT_EQUIP_RESULT_OK)\n+            {\n+                if (unequip_all_result == BotEquipResult::BOT_EQUIP_RESULT_FAIL_NO_BANK_SPACE)\n+                {\n+                    uint32 max_size = BotCfg::GetGearBankCapacity();\n+                    uint32 gb_size = BotDataMgr::GetBotBankItemsCount(player->GetGUID());\n+                    uint32 need_count = GetRealEquippedItemsCount();\n+                    ChatHandler ch(player->GetSession());\n+                    ch.PSendSysMessage(bot_ai::LocalizedNpcText(player, BOT_TEXT_NOT_ENOUGH_GEAR_BANK_SPACE).c_str(), need_count, gb_size, max_size);\n+                }\n+                else\n+                    BotWhisper(LocalizedNpcText(player, BOT_TEXT_FAILED), player);\n+            }\n+            else\n+                me->HandleEmoteCommand(EMOTE_ONESHOT_CRY);\n+            break;\n+        }\n+        //autoequips change s5b: AtoEquip item\n+        //base is GOSSIP_SENDER_EQUIP_AUTOEQUIP + 0...1...2... etc.\n+        case GOSSIP_SENDER_EQUIP_AUTOEQUIP_MHAND:     //0 - 1 main hand\n+        case GOSSIP_SENDER_EQUIP_AUTOEQUIP_OHAND:     //1 - 1 off hand\n+        case GOSSIP_SENDER_EQUIP_AUTOEQUIP_RANGED:    //2 - 1 ranged\n+        case GOSSIP_SENDER_EQUIP_AUTOEQUIP_HEAD:      //3 - 1 head\n+        case GOSSIP_SENDER_EQUIP_AUTOEQUIP_SHOULDERS: //4 - 1 shoulders\n+        case GOSSIP_SENDER_EQUIP_AUTOEQUIP_CHEST:     //5 - 1 chest\n+        case GOSSIP_SENDER_EQUIP_AUTOEQUIP_WAIST:     //6 - 1 waist\n+        case GOSSIP_SENDER_EQUIP_AUTOEQUIP_LEGS:      //7 - 1 legs\n+        case GOSSIP_SENDER_EQUIP_AUTOEQUIP_FEET:      //8 - 1 feet\n+        case GOSSIP_SENDER_EQUIP_AUTOEQUIP_WRIST:     //9 - 1 wrist\n+        case GOSSIP_SENDER_EQUIP_AUTOEQUIP_HANDS:     //10 - 1 hands\n+        case GOSSIP_SENDER_EQUIP_AUTOEQUIP_BACK:      //11 - 1 back\n+        case GOSSIP_SENDER_EQUIP_AUTOEQUIP_BODY:      //12 - 1 body\n+        case GOSSIP_SENDER_EQUIP_AUTOEQUIP_FINGER1:   //13 - 1 finger\n+        case GOSSIP_SENDER_EQUIP_AUTOEQUIP_FINGER2:   //14 - 2 finger\n+        case GOSSIP_SENDER_EQUIP_AUTOEQUIP_TRINKET1:  //15 - 1 trinket\n+        case GOSSIP_SENDER_EQUIP_AUTOEQUIP_TRINKET2:  //16 - 2 trinket\n+        case GOSSIP_SENDER_EQUIP_AUTOEQUIP_NECK:      //17 - 1 neck\n+        {\n+            Item* item = nullptr;\n+            uint32 guidLow = action - GOSSIP_ACTION_INFO_DEF;\n+\n+            bool found = false;\n+            for (uint8 i = INVENTORY_SLOT_ITEM_START; i != INVENTORY_SLOT_ITEM_END; ++i)\n+            {\n+                item = player->GetItemByPos(INVENTORY_SLOT_BAG_0, i);\n+                if (item && item->GetGUID().GetCounter() == guidLow)\n+                {\n+                    found = true;\n+                    break;\n+                }\n+            }\n+\n+            if (!found)\n+            {\n+                for (uint8 i = INVENTORY_SLOT_BAG_START; i != INVENTORY_SLOT_BAG_END; ++i)\n+                {\n+                    if (Bag const* pBag = player->GetBagByPos(i))\n+                    {\n+                        for (uint32 j = 0; j != pBag->GetBagSize(); ++j)\n+                        {\n+                            item = player->GetItemByPos(i, j);\n+                            if (item && item->GetGUID().GetCounter() == guidLow)\n+                            {\n+                                found = true;\n+                                break;\n+                            }\n+                        }\n+                    }\n+\n+                    if (found)\n+                        break;\n+                }\n+            }\n+\n+            if (found && _equip(sender - GOSSIP_SENDER_EQUIP_AUTOEQUIP_EQUIP, item, player->GetGUID(), false) == BotEquipResult::BOT_EQUIP_RESULT_OK){}\n+\n+            //break; //no break: update list\n+        }\n+        [[fallthrough]];\n+        case GOSSIP_SENDER_EQUIP_AUTOEQUIP:\n+        {\n+            subMenu = true;\n+\n+            EquipmentInfo const* einfo = BotDataMgr::GetBotEquipmentInfo(me->GetEntry());\n+            std::set<uint32> itemList, idsList;\n+\n+            auto can_equip = [this](Item const* item) {\n+                return std::ranges::any_of(NPCBots::index_array<uint8, BOT_INVENTORY_SIZE>, [=, this](uint8 slot) {\n+                    return _canEquip(item->GetTemplate(), slot, false, item);\n+                });\n+            };\n+\n+            auto try_put_item = [=, &itemList, &idsList](uint8 bag, uint8 bag_slot) {\n+                if (Item const* pItem = player->GetItemByPos(bag, bag_slot))\n+                {\n+                    if (!std::ranges::any_of(einfo->ItemEntry, [=](uint32 eeid) { return eeid == pItem->GetEntry(); }) &&\n+                        can_equip(pItem) && (pItem->GetItemRandomPropertyId() == 0 || !idsList.contains(pItem->GetEntry())))\n+                    {\n+                        itemList.insert(pItem->GetGUID().GetCounter());\n+                        idsList.insert(pItem->GetEntry());\n+                    }\n+                }\n+            };\n+\n+            //1: build list\n+            //1.1: backpack\n+            for (uint8 i = INVENTORY_SLOT_ITEM_START; i != INVENTORY_SLOT_ITEM_END; ++i)\n+                try_put_item(INVENTORY_SLOT_BAG_0, i);\n+\n+            //1.2: other bags\n+            for (uint8 i = INVENTORY_SLOT_BAG_START; i != INVENTORY_SLOT_BAG_END; ++i)\n+                if (Bag const* pBag = player->GetBagByPos(i))\n+                    for (uint32 j = 0; j != pBag->GetBagSize(); ++j)\n+                        try_put_item(i, j);\n+\n+            //2: add gossips\n+            if (itemList.empty())\n+            {\n+                AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_NOTHING_TO_GIVE), 0, GOSSIP_ACTION_INFO_DEF + 1);\n+            }\n+            else\n+            {\n+                uint32 counter = 0;\n+                const uint32 maxcounter = BOT_GOSSIP_MAX_ITEMS - 1; // back\n+                std::ostringstream name;\n+\n+                auto try_put_gossip = [=, &name, &counter, this](uint8 bag, uint8 bag_slot, uint32 guidlow) {\n+                    if (Item const* pItem = player->GetItemByPos(bag, bag_slot); pItem && pItem->GetGUID().GetCounter() == guidlow)\n+                        for (auto slot : NPCBots::index_array<uint8, BOT_INVENTORY_SIZE>)\n+                            if (_canEquip(pItem->GetTemplate(), slot, false, pItem))\n+                            {\n+                                //workaround for double slots\n+                                //if first slot is occupied and second slot is vacant use second slot\n+                                if ((1u << slot) & BOT_SLOT_MASK_FINGER1_OR_TRINKET1)\n+                                    if (_equips[slot] && _canEquip(pItem->GetTemplate(), slot + 1, false, pItem))\n+                                        ++slot;\n+                                _AddItemLink(player, pItem, name);\n+                                if (BotCfg::SendEquipListItems())\n+                                    BotWhisper(name.view(), player);\n+                                AddGossipItemFor(player, GOSSIP_ICON_CHAT, name.str(), GOSSIP_SENDER_EQUIP_AUTOEQUIP_EQUIP + slot, GOSSIP_ACTION_INFO_DEF + guidlow);\n+                                ++counter;\n+                                return true;\n+                            }\n+                    return false;\n+                };\n+\n+                //add items as gossip options\n+                for (std::set<uint32>::const_iterator itr = itemList.begin(); itr != itemList.end() && counter < maxcounter; ++itr)\n+                {\n+                    bool found = false;\n+                    for (uint8 i = INVENTORY_SLOT_ITEM_START; i != INVENTORY_SLOT_ITEM_END; ++i)\n+                    {\n+                        if (try_put_gossip(INVENTORY_SLOT_BAG_0, i, *itr))\n+                        {\n+                            found = true;\n+                            break;\n+                        }\n+                    }\n+\n+                    if (found)\n+                        continue;\n+\n+                    for (uint8 i = INVENTORY_SLOT_BAG_START; i != INVENTORY_SLOT_BAG_END; ++i)\n+                    {\n+                        if (Bag const* pBag = player->GetBagByPos(i))\n+                        {\n+                            for (uint32 j = 0; j != pBag->GetBagSize(); ++j)\n+                            {\n+                                if (try_put_gossip(i, j, *itr))\n+                                {\n+                                    found = true;\n+                                    break;\n+                                }\n+                            }\n+                        }\n+\n+                        if (found)\n+                            break;\n+                    }\n+\n+                    if (found)\n+                        continue;\n+                }\n+            }\n+\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_BACK), GOSSIP_SENDER_EQUIPMENT, GOSSIP_ACTION_INFO_DEF + 2);\n+            break;\n+        }\n+        case GOSSIP_SENDER_EQUIP_RESET: //equips change s4a: reset equipment\n+        {\n+            if (_resetEquipment(action - GOSSIP_ACTION_INFO_DEF, player->GetGUID(), false) != BotEquipResult::BOT_EQUIP_RESULT_OK)\n+                BotWhisper(LocalizedNpcText(player, BOT_TEXT_FAILED), player);\n+            return OnGossipSelect(player, creature, GOSSIP_SENDER_EQUIPMENT, GOSSIP_ACTION_INFO_DEF + 1);\n+        }\n+        case GOSSIP_SENDER_EQUIP_RESET_TO_GEARBANK: //equips change s4a: reset equipment\n+        {\n+            BotEquipResult reset_result = _resetEquipment(action - GOSSIP_ACTION_INFO_DEF, player->GetGUID(), true);\n+            if (reset_result != BotEquipResult::BOT_EQUIP_RESULT_OK)\n+            {\n+                if (reset_result == BotEquipResult::BOT_EQUIP_RESULT_FAIL_NO_BANK_SPACE)\n+                {\n+                    uint32 max_size = BotCfg::GetGearBankCapacity();\n+                    uint32 gb_size = BotDataMgr::GetBotBankItemsCount(player->GetGUID());\n+                    ChatHandler ch(player->GetSession());\n+                    ch.PSendSysMessage(bot_ai::LocalizedNpcText(player, BOT_TEXT_NOT_ENOUGH_GEAR_BANK_SPACE).c_str(), uint32(1), gb_size, max_size);\n+                }\n+                else\n+                    BotWhisper(LocalizedNpcText(player, BOT_TEXT_FAILED), player);\n+            }\n+            return OnGossipSelect(player, creature, GOSSIP_SENDER_EQUIPMENT, GOSSIP_ACTION_INFO_DEF + 1);\n+        }\n+        //equips change s4b: Equip item\n+        //base is GOSSIP_SENDER_EQUIP + 0...1...2... etc.\n+        case GOSSIP_SENDER_EQUIP_MHAND:     //0 - 1 main hand\n+        case GOSSIP_SENDER_EQUIP_OHAND:     //1 - 1 off hand\n+        case GOSSIP_SENDER_EQUIP_RANGED:    //2 - 1 ranged\n+        case GOSSIP_SENDER_EQUIP_HEAD:      //3 - 1 head\n+        case GOSSIP_SENDER_EQUIP_SHOULDERS: //4 - 1 shoulders\n+        case GOSSIP_SENDER_EQUIP_CHEST:     //5 - 1 chest\n+        case GOSSIP_SENDER_EQUIP_WAIST:     //6 - 1 waist\n+        case GOSSIP_SENDER_EQUIP_LEGS:      //7 - 1 legs\n+        case GOSSIP_SENDER_EQUIP_FEET:      //8 - 1 feet\n+        case GOSSIP_SENDER_EQUIP_WRIST:     //9 - 1 wrist\n+        case GOSSIP_SENDER_EQUIP_HANDS:     //10 - 1 hands\n+        case GOSSIP_SENDER_EQUIP_BACK:      //11 - 1 back\n+        case GOSSIP_SENDER_EQUIP_BODY:      //12 - 1 body\n+        case GOSSIP_SENDER_EQUIP_FINGER1:   //13 - 1 finger\n+        case GOSSIP_SENDER_EQUIP_FINGER2:   //14 - 1 finger\n+        case GOSSIP_SENDER_EQUIP_TRINKET1:  //15 - 1 trinket\n+        case GOSSIP_SENDER_EQUIP_TRINKET2:  //16 - 1 trinket\n+        case GOSSIP_SENDER_EQUIP_NECK:      //17 - 1 neck\n+        {\n+            Item* item = nullptr;\n+            uint32 guidLow = action - GOSSIP_ACTION_INFO_DEF;\n+\n+            bool found = false;\n+            for (uint8 i = INVENTORY_SLOT_ITEM_START; i != INVENTORY_SLOT_ITEM_END; ++i)\n+            {\n+                item = player->GetItemByPos(INVENTORY_SLOT_BAG_0, i);\n+                if (item && item->GetGUID().GetCounter() == guidLow)\n+                {\n+                    found = true;\n+                    break;\n+                }\n+            }\n+\n+            if (!found)\n+            {\n+                for (uint8 i = INVENTORY_SLOT_BAG_START; i != INVENTORY_SLOT_BAG_END; ++i)\n+                {\n+                    if (Bag const* pBag = player->GetBagByPos(i))\n+                    {\n+                        for (uint32 j = 0; j != pBag->GetBagSize(); ++j)\n+                        {\n+                            item = player->GetItemByPos(i, j);\n+                            if (item && item->GetGUID().GetCounter() == guidLow)\n+                            {\n+                                found = true;\n+                                break;\n+                            }\n+                        }\n+                    }\n+\n+                    if (found)\n+                        break;\n+                }\n+            }\n+\n+            if (found && _equip(sender - GOSSIP_SENDER_EQUIP, item, player->GetGUID(), false) == BotEquipResult::BOT_EQUIP_RESULT_OK){}\n+            return OnGossipSelect(player, creature, GOSSIP_SENDER_EQUIPMENT, GOSSIP_ACTION_INFO_DEF + 1);\n+        }\n+        case GOSSIP_SENDER_EQUIPMENT_BANK_DEPOSIT_ITEM:\n+        {\n+            ObjectGuid::LowType itemGuidLow = action - GOSSIP_ACTION_INFO_DEF;\n+            Item* item = player->GetItemByGuid(ObjectGuid::Create<HighGuid::Item>(itemGuidLow));\n+            if (!item)\n+            {\n+                BOT_LOG_ERROR(\"npcbots\", \"GOSSIP_SENDER_EQUIPMENT_BANK_DEPOSIT_ITEM: item {} not found on player {}! Cheater?\",\n+                    itemGuidLow, player->GetName());\n+                break;\n+            }\n+\n+            if (!BotDataMgr::CanDepositBotBankItemsCount(player->GetGUID(), 1))\n+            {\n+                BotWhisper(LocalizedNpcText(player, BOT_TEXT_BANK_IS_FULL), player);\n+                return OnGossipSelect(player, me, GOSSIP_SENDER_EQUIPMENT_BANK_MENU, action);\n+            }\n+\n+            BotDataMgr::DepositBotBankItem(player->GetGUID(), item);\n+            player->MoveItemFromInventory(item->GetBagSlot(), item->GetSlot(), true);\n+\n+            action = GOSSIP_ACTION_INFO_DEF; //return to page 0\n+            //break;\n+            [[fallthrough]];\n+        }\n+        case GOSSIP_SENDER_EQUIPMENT_BANK_DEPOSIT:\n+        {\n+            if (!BotDataMgr::CanDepositBotBankItemsCount(player->GetGUID(), 1))\n+            {\n+                BotWhisper(LocalizedNpcText(player, BOT_TEXT_BANK_IS_FULL), player);\n+                return OnGossipSelect(player, me, GOSSIP_SENDER_EQUIPMENT_BANK_MENU, action);\n+            }\n+\n+            subMenu = true;\n+            uint32 page = action - GOSSIP_ACTION_INFO_DEF;\n+            uint32 items_per_page = BOT_GOSSIP_MAX_ITEMS - 3; // prev page, back, next page\n+            uint32 counter = 0;\n+            uint32 can_add_count = 0;\n+            uint32 k = 0;\n+\n+            static const auto is_bot_equippable_item = [](ItemTemplate const* proto) {\n+                switch (proto->InventoryType)\n+                {\n+                    case INVTYPE_NON_EQUIP: case INVTYPE_BAG: case INVTYPE_TABARD: case INVTYPE_AMMO: case INVTYPE_QUIVER:\n+                        return false;\n+                    default:\n+                        return true;\n+                }\n+            };\n+\n+            //backpack\n+            for (uint8 i = INVENTORY_SLOT_ITEM_START; i != INVENTORY_SLOT_ITEM_END && can_add_count <= items_per_page; ++i)\n+            {\n+                if (Item const* pItem = player->GetItemByPos(INVENTORY_SLOT_BAG_0, i))\n+                {\n+                    if (is_bot_equippable_item(pItem->GetTemplate()))\n+                    {\n+                        ++k;\n+                        if (k <= page * items_per_page)\n+                            continue;\n+                        ++can_add_count;\n+                        if (counter >= items_per_page)\n+                            continue;\n+                        ++counter;\n+                        std::ostringstream name;\n+                        _AddItemLink(player, pItem, name);\n+                        AddGossipItemFor(player, GOSSIP_ICON_CHAT, name.str(), GOSSIP_SENDER_EQUIPMENT_BANK_DEPOSIT_ITEM, GOSSIP_ACTION_INFO_DEF + pItem->GetGUID().GetCounter());\n+                    }\n+                }\n+            }\n+\n+            //other bags\n+            for (uint8 i = INVENTORY_SLOT_BAG_START; i != INVENTORY_SLOT_BAG_END && can_add_count <= items_per_page; ++i)\n+            {\n+                Bag const* pBag = player->GetBagByPos(i);\n+                if (!pBag)\n+                    continue;\n+                for (uint32 j = 0; j != pBag->GetBagSize() && can_add_count <= items_per_page; ++j)\n+                {\n+                    Item const* pItem = player->GetItemByPos(i, j);\n+                    if (!pItem)\n+                        continue;\n+                    if (is_bot_equippable_item(pItem->GetTemplate()))\n+                    {\n+                        ++k;\n+                        if (k <= page * items_per_page)\n+                            continue;\n+                        ++can_add_count;\n+                        if (counter >= items_per_page)\n+                            continue;\n+                        ++counter;\n+                        std::ostringstream name;\n+                        _AddItemLink(player, pItem, name);\n+                        AddGossipItemFor(player, GOSSIP_ICON_CHAT, name.str(), GOSSIP_SENDER_EQUIPMENT_BANK_DEPOSIT_ITEM, GOSSIP_ACTION_INFO_DEF + pItem->GetGUID().GetCounter());\n+                    }\n+                }\n+            }\n+\n+            if (page > 0)\n+                AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_PREVIOUS_PAGE), GOSSIP_SENDER_EQUIPMENT_BANK_DEPOSIT, action - 1);\n+            if (can_add_count > items_per_page)\n+                AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_NEXT_PAGE), GOSSIP_SENDER_EQUIPMENT_BANK_DEPOSIT, action + 1);\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_BACK), GOSSIP_SENDER_EQUIPMENT_BANK_MENU, GOSSIP_ACTION_INFO_DEF + 1);\n+            break;\n+        }\n+        case GOSSIP_SENDER_EQUIPMENT_BANK_WITHDRAW_ITEM:\n+        {\n+            ObjectGuid::LowType itemGuidLow = action - GOSSIP_ACTION_INFO_DEF;\n+\n+            //BotBankItemContainer const& botBankItems = BotDataMgr::GetBotBankItems(player->GetGUID());\n+            //Item const* item = std::ranges::find_if(botBankItems, [guidLow = itemGuidLow](Item const* item) {\n+            //    return item->GetGUID().GetCounter() == guidLow;\n+            //});\n+            Item* item = BotDataMgr::WithdrawBotBankItem(player->GetGUID(), itemGuidLow);\n+            if (!item)\n+            {\n+                BOT_LOG_ERROR(\"npcbots\", \"GOSSIP_SENDER_EQUIPMENT_BANK_WITHDRAW_ITEM: item {} not found on player {}! Cheater?\",\n+                    itemGuidLow, player->GetName());\n+                break;\n+            }\n+\n+            ItemPosCountVec dest;\n+            uint32 no_space = 0;\n+            InventoryResult msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, item->GetEntry(), 1, &no_space);\n+            if (msg != EQUIP_ERR_OK)\n+            {\n+                std::ostringstream istr;\n+                _AddItemLink(player, item, istr, false);\n+                ChatHandler ch(player->GetSession());\n+                ch.PSendSysMessage(LocalizedNpcText(player, BOT_TEXT_CANT_UNEQUIP_MAILING).c_str(), istr.view().data());\n+\n+                item->SetOwnerGUID(player->GetGUID());\n+\n+                CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();\n+                item->FSetState(ITEM_CHANGED);\n+                item->SaveToDB(trans);\n+                MailDraft(istr.str(), \"\").AddItem(item).SendMailTo(trans, MailReceiver(player), MailSender(me));\n+                CharacterDatabase.CommitTransaction(trans);\n+\n+                player->SendEquipError(msg, nullptr, nullptr, item->GetEntry());\n+            }\n+            else\n+            {\n+                Item* pItem = player->StoreItem(dest, item, true);\n+                player->SendNewItem(pItem, 1, true, false, false);\n+            }\n+\n+            action = GOSSIP_ACTION_INFO_DEF; //return to page 0\n+            //break;\n+            [[fallthrough]];\n+        }\n+        case GOSSIP_SENDER_EQUIPMENT_BANK_WITHDRAW:\n+        {\n+            uint32 page = action - GOSSIP_ACTION_INFO_DEF;\n+            uint32 items_per_page = BOT_GOSSIP_MAX_ITEMS - 3; // page prev, page next, back\n+            uint32 counter = 0;\n+\n+            BotBankItemContainer const* botBankItems = BotDataMgr::GetBotBankItems(player->GetGUID());\n+            if (!botBankItems || botBankItems->empty())\n+            {\n+                BotWhisper(LocalizedNpcText(player, BOT_TEXT_BANK_IS_EMPTY), player);\n+                return OnGossipSelect(player, me, GOSSIP_SENDER_EQUIPMENT_BANK_MENU, action);\n+            }\n+\n+            subMenu = true;\n+\n+            BotBankItemContainer::const_iterator bcit = botBankItems->cbegin();\n+            size_t i = 0;\n+            for (; i < size_t(page * items_per_page) && i < botBankItems->size(); ++i, ++bcit); //advance to selected page\n+            for (; i < botBankItems->size() && counter < items_per_page; ++i, ++bcit)\n+            {\n+                Item const* item = *bcit;\n+                ++counter;\n+                std::ostringstream name;\n+                _AddItemLink(player, item, name);\n+                ItemTemplate const* proto = item->GetTemplate();\n+                uint8 slot = BOT_SLOT_BODY;\n+                if (GetBotClass() == BOT_CLASS_HUNTER)\n+                {\n+                    if (_canEquip(proto, BOT_SLOT_RANGED, true))\n+                        slot = BOT_SLOT_RANGED;\n+                    else if (_canEquip(proto, BOT_SLOT_MAINHAND, true))\n+                        slot = BOT_SLOT_MAINHAND;\n+                    else if (_canEquip(proto, BOT_SLOT_OFFHAND, true))\n+                        slot = BOT_SLOT_OFFHAND;\n+                }\n+                else if (GetBotClass() == BOT_CLASS_WARRIOR && _canEquip(proto, BOT_SLOT_MAINHAND, true))\n+                    slot = BOT_SLOT_MAINHAND;\n+\n+                name << \" GS: \" << uint32(CalculateItemGearScore(proto, me->GetEntry(), me->GetLevel(), GetBotClass(), GetSpec(), slot));\n+                AddGossipItemFor(player, GOSSIP_ICON_CHAT, name.str(), GOSSIP_SENDER_EQUIPMENT_BANK_WITHDRAW_ITEM, GOSSIP_ACTION_INFO_DEF + item->GetGUID().GetCounter());\n+            }\n+\n+            if (page > 0)\n+                AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_PREVIOUS_PAGE), GOSSIP_SENDER_EQUIPMENT_BANK_WITHDRAW, action - 1);\n+            if (uint32(botBankItems->size()) > (page + 1) * items_per_page)\n+                AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_NEXT_PAGE), GOSSIP_SENDER_EQUIPMENT_BANK_WITHDRAW, action + 1);\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_BACK), GOSSIP_SENDER_EQUIPMENT_BANK_MENU, GOSSIP_ACTION_INFO_DEF + 1);\n+            break;\n+        }\n+        case GOSSIP_SENDER_EQUIPMENT_BANK_SET_EQUIP:\n+        {\n+            uint32 set_id = uint8(action - GOSSIP_ACTION_INFO_DEF);\n+            NpcBotItemSet const* item_set = BotDataMgr::GetBotItemSet(player->GetGUID(), set_id);\n+            EquipmentInfo const* einfo = BotDataMgr::GetBotEquipmentInfo(me->GetEntry());\n+            BotBankItemContainer const* botBankItems = BotDataMgr::GetBotBankItems(player->GetGUID());\n+            auto const& itemset_items = item_set->items;\n+            uint8 unequip_count = GetRealEquippedItemsCount();\n+            uint8 equip_count = item_set->items_count();\n+\n+            std::array<Item*, BOT_INVENTORY_SIZE> items_to_equip{};\n+            std::array<Item*, BOT_INVENTORY_SIZE> items_to_unequip{};\n+\n+            bool all_same = true;\n+            std::array<bool, BOT_INVENTORY_SIZE> same_item_id{};\n+            for (uint8 i : NPCBots::index_array<uint8, BOT_INVENTORY_SIZE>)\n+            {\n+                Item const* item = _equips[i];\n+                same_item_id[i] = (item && (i > BOT_SLOT_RANGED || einfo->ItemEntry[i] != item->GetEntry())) ? (item->GetEntry() == itemset_items[i]) : !itemset_items[i];\n+                if (!same_item_id[i])\n+                    all_same = false;\n+            }\n+\n+            BotEquipResult check_res;\n+\n+            if (all_same)\n+                check_res = BotEquipResult::BOT_EQUIP_RESULT_OK;\n+            else if (!botBankItems)\n+                check_res = BotEquipResult::BOT_EQUIP_RESULT_FAIL_NO_ITEM;\n+            else if (BotCfg::GetGearBankCapacity() && int32(unequip_count - equip_count) > int32(BotCfg::GetGearBankCapacity() - botBankItems->size()))\n+                check_res = BotEquipResult::BOT_EQUIP_RESULT_FAIL_NO_BANK_SPACE;\n+            else\n+            {\n+                check_res = BotEquipResult::BOT_EQUIP_RESULT_OK;\n+                std::map<uint32 /*item_id*/, std::set<Item*>> available_items;\n+                for (Item* bitem : *botBankItems)\n+                    available_items[bitem->GetEntry()].insert(bitem);\n+\n+                bool weapons_checked = false;\n+                for (uint8 i : NPCBots::index_array<uint8, BOT_INVENTORY_SIZE>)\n+                {\n+                    if (check_res != BotEquipResult::BOT_EQUIP_RESULT_OK)\n+                        break;\n+\n+                    Item* item = _equips[i];\n+                    if (!same_item_id[i])\n+                    {\n+                        if (itemset_items[i])\n+                        {\n+                            ItemTemplate const* set_item_proto = sObjectMgr->GetItemTemplate(itemset_items[i]); // validated at load\n+                            if (!available_items.contains(itemset_items[i]) || available_items.at(itemset_items[i]).empty())\n+                                check_res = BotEquipResult::BOT_EQUIP_RESULT_FAIL_NO_ITEM;\n+                            else if (!_canEquip(set_item_proto, i, true, *available_items.at(itemset_items[i]).cbegin(), true))\n+                                check_res = BotEquipResult::BOT_EQUIP_RESULT_FAIL_CANT_EQUIP;\n+                            else\n+                            {\n+                                if (!weapons_checked && i <= BOT_SLOT_OFFHAND && itemset_items[BOT_SLOT_MAINHAND] && itemset_items[BOT_SLOT_OFFHAND])\n+                                {\n+                                    weapons_checked = true;\n+                                    ItemTemplate const* mh_proto = (i == BOT_SLOT_MAINHAND) ? set_item_proto : sObjectMgr->GetItemTemplate(itemset_items[BOT_SLOT_MAINHAND]);\n+                                    ItemTemplate const* oh_proto = (i == BOT_SLOT_OFFHAND) ? set_item_proto : sObjectMgr->GetItemTemplate(itemset_items[BOT_SLOT_OFFHAND]);\n+                                    if (!_canCombineWeapons(mh_proto, oh_proto))\n+                                        check_res = BotEquipResult::BOT_EQUIP_RESULT_FAIL_ITEM_CONFLICT;\n+                                }\n+                                auto ait = available_items.at(itemset_items[i]).begin();\n+                                items_to_equip[i] = *ait;\n+                                available_items.at(itemset_items[i]).erase(ait);\n+                            }\n+                        }\n+                        if (item && !items_to_equip[i])\n+                            items_to_unequip[i] = item;\n+                    }\n+                }\n+            }\n+\n+            if (all_same)\n+                me->HandleEmoteCommand(EMOTE_ONESHOT_CHICKEN);\n+            else if (check_res != BotEquipResult::BOT_EQUIP_RESULT_OK)\n+            {\n+                std::string err_code = Bcore::ToString(uint32(AsUnderlyingType(check_res)));\n+                BotWhisper(LocalizedNpcText(player, BOT_TEXT_FAILED) + \" (\" + err_code + \")\");\n+            }\n+            else\n+            {\n+                BotEquipResult all_res = BotEquipResult::BOT_EQUIP_RESULT_OK;\n+                for (uint8 i : NPCBots::index_array<uint8, BOT_INVENTORY_SIZE>)\n+                {\n+                    if (Item* item = items_to_equip[i])\n+                    {\n+                        BotEquipResult res = _equip(i, item, player->GetGUID(), true, true);\n+                        if (res != BotEquipResult::BOT_EQUIP_RESULT_OK)\n+                        {\n+                            all_res = res;\n+                            std::string err_code = Bcore::ToString(uint32(AsUnderlyingType(res)));\n+                            BotWhisper(LocalizedNpcText(player, BOT_TEXT_FAILED) + \" +\" + Bcore::ToString(uint32(i)) + \" (\" + err_code + \")\");\n+                            break;\n+                        }\n+                    }\n+                    if (items_to_unequip[i])\n+                    {\n+                        BotEquipResult res = _unequip(i, player->GetGUID(), true);\n+                        if (res != BotEquipResult::BOT_EQUIP_RESULT_OK)\n+                        {\n+                            std::string err_code = Bcore::ToString(uint32(AsUnderlyingType(res)));\n+                            BotWhisper(LocalizedNpcText(player, BOT_TEXT_FAILED) + \" -\" + Bcore::ToString(uint32(i)) + \" (\" + err_code + \")\");\n+                            break;\n+                        }\n+                    }\n+                }\n+                if (all_res == BotEquipResult::BOT_EQUIP_RESULT_OK)\n+                    BotWhisper(LocalizedNpcText(player, BOT_TEXT_EQUIPPED) + \" '\" + item_set->name + \"'!\");\n+            }\n+\n+            return OnGossipSelect(player, creature, GOSSIP_SENDER_EQUIPMENT_BANK_SETS_MENU, action);\n+        }\n+        case GOSSIP_SENDER_EQUIPMENT_BANK_SET_DELETE:\n+        {\n+            uint32 set_id = uint8(action - GOSSIP_ACTION_INFO_DEF);\n+\n+            BotDataMgr::DeleteBotItemSet(player->GetGUID(), static_cast<uint8>(set_id));\n+\n+            return OnGossipSelect(player, creature, GOSSIP_SENDER_EQUIPMENT_BANK_SETS_MENU, action);\n+        }\n+        case GOSSIP_SENDER_EQUIPMENT_BANK_MENU:\n+        {\n+            subMenu = true;\n+\n+            AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_DEPOSIT_ITEMS), GOSSIP_SENDER_EQUIPMENT_BANK_DEPOSIT, GOSSIP_ACTION_INFO_DEF + 0);\n+            AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_WITHDRAW_ITEMS), GOSSIP_SENDER_EQUIPMENT_BANK_WITHDRAW, GOSSIP_ACTION_INFO_DEF + 0);\n+            if (BotCfg::GetGearBankEquipmentSetsCount() > 0)\n+                AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_EQUIPMENT_SETS) + \"...\", GOSSIP_SENDER_EQUIPMENT_BANK_SETS_MENU, GOSSIP_ACTION_INFO_DEF + 0);\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_BACK), GOSSIP_SENDER_EQUIPMENT, GOSSIP_ACTION_INFO_DEF + 1);\n+            break;\n+        }\n+        case GOSSIP_SENDER_EQUIPMENT_BANK_SET_MENU_ITEM:\n+        {\n+            uint32 set_slot_packed = action - GOSSIP_ACTION_INFO_DEF;\n+            uint8 set_id = PAIR32_HIPART(set_slot_packed);\n+            uint8 slot = PAIR32_LOPART(set_slot_packed);\n+\n+            NpcBotItemSet const* itemSet = BotDataMgr::GetBotItemSet(player->GetGUID(), set_id);\n+            BotBankItemContainer const* botBankItems = BotDataMgr::GetBotBankItems(player->GetGUID());\n+\n+            uint32 item_id = itemSet->items[slot];\n+\n+            std::ostringstream msg;\n+            Item const* item = (_equips[slot] && _equips[slot]->GetEntry() == item_id) ? _equips[slot] : nullptr;\n+            if (!item && botBankItems)\n+            {\n+                BotBankItemContainer::const_iterator cit = std::ranges::find_if(*botBankItems, [=](Item const* item) { return item->GetEntry() == item_id; });\n+                if (cit != botBankItems->cend())\n+                    item = *cit;\n+            }\n+            if (item)\n+                _AddItemLink(player, item, msg);\n+            else\n+            {\n+                ItemTemplate const* proto = sObjectMgr->GetItemTemplate(item_id);\n+                _AddItemTemplateLink(player, proto, msg);\n+                msg << \" (\" << LocalizedNpcText(player, BOT_TEXT_MISSING) << ')';\n+            }\n+\n+            BotWhisper(msg.view(), player);\n+            //break;\n+            action = GOSSIP_ACTION_INFO_DEF + set_id;\n+        }\n+        [[fallthrough]];\n+        case GOSSIP_SENDER_EQUIPMENT_BANK_SET_MENU:\n+        {\n+            subMenu = true;\n+\n+            uint32 set_id = action - GOSSIP_ACTION_INFO_DEF;\n+            NpcBotItemSet const* itemSet = BotDataMgr::GetBotItemSet(player->GetGUID(), (uint8)set_id);\n+            BotBankItemContainer const* botBankItems = BotDataMgr::GetBotBankItems(player->GetGUID());\n+\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, \"<\" + LocalizedNpcText(player, BOT_TEXT_EQUIP) + \">\", GOSSIP_SENDER_EQUIPMENT_BANK_SET_EQUIP,\n+                GOSSIP_ACTION_INFO_DEF + set_id, LocalizedNpcText(player, BOT_TEXT_EQUIP) + \" '\" + itemSet->name + \"'?\", 0, false);\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, \"<\" + LocalizedNpcText(player, BOT_TEXT_DELETE) + \">\", GOSSIP_SENDER_EQUIPMENT_BANK_SET_DELETE,\n+                GOSSIP_ACTION_INFO_DEF + set_id, LocalizedNpcText(player, BOT_TEXT_DELETE) + \" '\" + itemSet->name + \"'?\", 0, false);\n+\n+            //list items\n+            float gs_total = 0.f;\n+            std::ostringstream ss;\n+            for (uint8 i : NPCBots::index_array<uint8, BOT_INVENTORY_SIZE>)\n+            {\n+                uint32 item_id = itemSet->items[i];\n+                if (item_id)\n+                {\n+                    ItemTemplate const* proto = sObjectMgr->GetItemTemplate(item_id);\n+                    GossipOptionIcon si_icon = GOSSIP_ICON_CHAT;\n+                    Item const* item = (_equips[i] && _equips[i]->GetEntry() == item_id) ? _equips[i] : nullptr;\n+                    if (!item && botBankItems)\n+                    {\n+                        BotBankItemContainer::const_iterator cit = std::ranges::find_if(*botBankItems, [=](Item const* item) { return item->GetEntry() == item_id; });\n+                        if (cit != botBankItems->cend())\n+                            item = *cit;\n+                    }\n+                    if (item)\n+                    {\n+                        _AddItemLink(player, item, ss);\n+                        float item_gs = CalculateItemGearScore(proto, me->GetEntry(), me->GetLevel(), GetBotClass(), GetSpec(), i);\n+                        gs_total += item_gs;\n+                        ss << \" GS: \" << uint32(item_gs);\n+                    }\n+                    else\n+                    {\n+                        si_icon = GOSSIP_ICON_BATTLE;\n+                        _AddItemTemplateLink(player, proto, ss);\n+                        ss << \" (\" << LocalizedNpcText(player, BOT_TEXT_MISSING) << ')';\n+                    }\n+                    uint32 set_slot_packed = MAKE_PAIR32(i, set_id);\n+                    AddGossipItemFor(player, si_icon, ss.str(), GOSSIP_SENDER_EQUIPMENT_BANK_SET_MENU_ITEM, GOSSIP_ACTION_INFO_DEF + set_slot_packed);\n+                    ss.str(\"\");\n+                }\n+            }\n+\n+            ss << \"GS: \" << uint32(gs_total);\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, ss.str(), GOSSIP_SENDER_EQUIPMENT_BANK_SET_MENU, action);\n+\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_BACK), GOSSIP_SENDER_EQUIPMENT_BANK_SETS_MENU, GOSSIP_ACTION_INFO_DEF + 1);\n+            break;\n+        }\n+        case GOSSIP_SENDER_EQUIPMENT_BANK_SETS_MENU:\n+        {\n+            subMenu = true;\n+\n+            if (BotDataMgr::GetBotItemSetsCount(player->GetGUID()) < BotCfg::GetGearBankEquipmentSetsCount())\n+                AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_CREATE) + \"...\", GOSSIP_SENDER_EQUIPMENT_BANK_SET_CREATE, GOSSIP_ACTION_INFO_DEF + 0, \"\", 0, true);\n+\n+            //list existing sets\n+            if (BotItemSetsArray const* itemSets = BotDataMgr::GetBotItemSets(player->GetGUID()))\n+            {\n+                for (uint8 i : NPCBots::index_array<uint8, MAX_BOT_EQUIPMENT_SETS>)\n+                {\n+                    NpcBotItemSet const& itemSet = itemSets->at(i);\n+                    if (!!itemSet)\n+                        AddGossipItemFor(player, GOSSIP_ICON_TALK, itemSet.name, GOSSIP_SENDER_EQUIPMENT_BANK_SET_MENU, GOSSIP_ACTION_INFO_DEF + uint32(i));\n+                }\n+            }\n+\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_BACK), GOSSIP_SENDER_EQUIPMENT_BANK_MENU, GOSSIP_ACTION_INFO_DEF + 1);\n+            break;\n+        }\n+        case GOSSIP_SENDER_ROLES_MAIN_TOGGLE: //ROLES 2: set/unset\n+        {\n+            ToggleRole(action - GOSSIP_ACTION_INFO_DEF, false);\n+\n+            [[fallthrough]];\n+            //break;\n+        }\n+        case GOSSIP_SENDER_ROLES_MAIN: //ROLES 1: list\n+        {\n+            subMenu = true;\n+\n+            if (IsHumanoidClass(_botclass))\n+                AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_GATHERING) + \"...\", GOSSIP_SENDER_ROLES_GATHERING, GOSSIP_ACTION_INFO_DEF + 1);\n+            AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_LOOTING) + \"...\", GOSSIP_SENDER_ROLES_LOOTING, GOSSIP_ACTION_INFO_DEF + 2);\n+\n+            uint32 role = BOT_ROLE_TANK;\n+            for (; role != BOT_MAX_ROLE; role <<= 1)\n+            {\n+                if (!(role & BOT_ROLE_MASK_MAIN)) //hidden\n+                    continue;\n+                if (role == BOT_ROLE_HEAL && !IsHealingClass(_botclass))\n+                    continue;\n+\n+                AddGossipItemFor(player, GetRoleIcon(role), LocalizedNpcText(player, GetRoleString(role)), GOSSIP_SENDER_ROLES_MAIN_TOGGLE, GOSSIP_ACTION_INFO_DEF + role);\n+            }\n+\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_BACK), 1, GOSSIP_ACTION_INFO_DEF + 1);\n+\n+            break;\n+        }\n+        case GOSSIP_SENDER_ROLES_GATHERING_TOGGLE:\n+        {\n+            ToggleRole(action - GOSSIP_ACTION_INFO_DEF, false);\n+\n+            [[fallthrough]];\n+            //break;\n+        }\n+        case GOSSIP_SENDER_ROLES_GATHERING:\n+        {\n+            subMenu = true;\n+\n+            uint32 role = BOT_ROLE_GATHERING_MINING;\n+            for (; role != BOT_MAX_ROLE; role <<= 1)\n+            {\n+                if (!(role & BOT_ROLE_MASK_GATHERING)) //hidden\n+                    continue;\n+\n+                AddGossipItemFor(player, GetRoleIcon(role), LocalizedNpcText(player, GetRoleString(role)), GOSSIP_SENDER_ROLES_GATHERING_TOGGLE, GOSSIP_ACTION_INFO_DEF + role);\n+            }\n+\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_BACK), GOSSIP_SENDER_ROLES_MAIN, GOSSIP_ACTION_INFO_DEF + 1);\n+\n+            break;\n+        }\n+        case GOSSIP_SENDER_ROLES_LOOTING_TOGGLE:\n+        {\n+            ToggleRole(action - GOSSIP_ACTION_INFO_DEF, false);\n+\n+            [[fallthrough]];\n+            //break;\n+        }\n+        case GOSSIP_SENDER_ROLES_LOOTING:\n+        {\n+            subMenu = true;\n+\n+            uint32 role = BOT_ROLE_AUTOLOOT;\n+            for (; role != BOT_MAX_ROLE; role <<= 1)\n+            {\n+                if (!(role & (BOT_ROLE_AUTOLOOT | BOT_ROLE_MASK_LOOTING)))\n+                    continue;\n+\n+                AddGossipItemFor(player, GetRoleIcon(role), LocalizedNpcText(player, GetRoleString(role)), GOSSIP_SENDER_ROLES_LOOTING_TOGGLE, GOSSIP_ACTION_INFO_DEF + role);\n+            }\n+\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_BACK), GOSSIP_SENDER_ROLES_MAIN, GOSSIP_ACTION_INFO_DEF + 1);\n+\n+            break;\n+        }\n+        case GOSSIP_SENDER_ABILITIES_USE:\n+        {\n+            if (uint32 basespell = action - GOSSIP_ACTION_INFO_DEF)\n+                //if (CheckBotCast(me, basespell, me->GetBotClass()) == SPELL_CAST_OK)\n+                    if (IsSpellReady(basespell, lastdiff, true))\n+                        doCast(player, GetSpell(basespell));\n+\n+            //break;\n+            action = GOSSIP_ACTION_INFO_DEF;\n+            [[fallthrough]];\n+        }\n+        case GOSSIP_SENDER_ABILITIES:\n+        {\n+            subMenu = true;\n+\n+            if (HasAbilitiesSpecifics())\n+                AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_ABILITIES_STATUS) + \"...\", GOSSIP_SENDER_ABILITIES_SPECIFICS_LIST, GOSSIP_ACTION_INFO_DEF + 1);\n+            AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_ALLOWED_ABILITIES) + \"...\", GOSSIP_SENDER_ABILITIES_USAGE_LIST, GOSSIP_ACTION_INFO_DEF + 2);\n+\n+            for (auto const& [rank1_id, spell] : _spells)\n+            {\n+                if (!CanUseManually(rank1_id)) continue;\n+                if (!IsSpellReady(rank1_id, lastdiff, false)) continue;\n+\n+                std::ostringstream name;\n+                name << LocalizedNpcText(player, BOT_TEXT_USE_);\n+                _AddSpellLink(player, sSpellMgr->AssertSpellInfo(rank1_id), name);\n+                AddGossipItemFor(player, GOSSIP_ICON_TRAINER, name.str(), GOSSIP_SENDER_ABILITIES_USE, GOSSIP_ACTION_INFO_DEF + rank1_id);\n+            }\n+\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_UPDATE), sender, action);\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_BACK), 1, GOSSIP_ACTION_INFO_DEF + 2);\n+\n+            break;\n+        }\n+        case GOSSIP_SENDER_ABILITIES_SPECIFICS_LIST:\n+        {\n+            subMenu = true;\n+\n+            std::list<std::string> specList;\n+            FillAbilitiesSpecifics(player, specList);\n+            for (std::string const& spec : specList)\n+                AddGossipItemFor(player, GOSSIP_ICON_CHAT, spec, GOSSIP_SENDER_ABILITIES, GOSSIP_ACTION_INFO_DEF);\n+\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_BACK), GOSSIP_SENDER_ABILITIES, GOSSIP_ACTION_INFO_DEF + 1);\n+\n+            break;\n+        }\n+        case GOSSIP_SENDER_ABILITIES_USAGE_TOGGLE_DAMAGE:\n+        case GOSSIP_SENDER_ABILITIES_USAGE_TOGGLE_CC:\n+        case GOSSIP_SENDER_ABILITIES_USAGE_TOGGLE_HEAL:\n+        case GOSSIP_SENDER_ABILITIES_USAGE_TOGGLE_SUPPORT:\n+        {\n+            uint32 basespell = action - GOSSIP_ACTION_INFO_DEF;\n+            for (auto& [rank1_id, spell] : _spells)\n+            {\n+                if (rank1_id == basespell)\n+                {\n+                    spell.enabled = !spell.enabled;\n+                    if (spell.enabled)\n+                        _botData->disabled_spells.erase(basespell);\n+                    else\n+                        _botData->disabled_spells.insert(basespell);\n+\n+                    _saveDisabledSpells = true;\n+                    break;\n+                }\n+            }\n+\n+            uint32 newSender;\n+            switch (sender)\n+            {\n+                case GOSSIP_SENDER_ABILITIES_USAGE_TOGGLE_DAMAGE:\n+                    newSender = GOSSIP_SENDER_ABILITIES_USAGE_LIST_DAMAGE;  break;\n+                case GOSSIP_SENDER_ABILITIES_USAGE_TOGGLE_CC:\n+                    newSender = GOSSIP_SENDER_ABILITIES_USAGE_LIST_CC;      break;\n+                case GOSSIP_SENDER_ABILITIES_USAGE_TOGGLE_HEAL:\n+                    newSender = GOSSIP_SENDER_ABILITIES_USAGE_LIST_HEAL;    break;\n+                case GOSSIP_SENDER_ABILITIES_USAGE_TOGGLE_SUPPORT:\n+                    newSender = GOSSIP_SENDER_ABILITIES_USAGE_LIST_SUPPORT; break;\n+                default:\n+                    ABORT();\n+            }\n+            sender = newSender;\n+        }\n+        [[fallthrough]];\n+        case GOSSIP_SENDER_ABILITIES_USAGE_LIST_DAMAGE:\n+        case GOSSIP_SENDER_ABILITIES_USAGE_LIST_CC:\n+        case GOSSIP_SENDER_ABILITIES_USAGE_LIST_HEAL:\n+        case GOSSIP_SENDER_ABILITIES_USAGE_LIST_SUPPORT:\n+        {\n+            subMenu = true;\n+\n+            uint32 toggleSender;\n+            std::vector<uint32> const* myspells;\n+            switch (sender)\n+            {\n+                case GOSSIP_SENDER_ABILITIES_USAGE_LIST_DAMAGE:\n+                    toggleSender = GOSSIP_SENDER_ABILITIES_USAGE_TOGGLE_DAMAGE;\n+                    myspells = GetDamagingSpellsList();\n+                    break;\n+                case GOSSIP_SENDER_ABILITIES_USAGE_LIST_CC:\n+                    toggleSender = GOSSIP_SENDER_ABILITIES_USAGE_TOGGLE_CC;\n+                    myspells = GetCCSpellsList();\n+                    break;\n+                case GOSSIP_SENDER_ABILITIES_USAGE_LIST_HEAL:\n+                    toggleSender = GOSSIP_SENDER_ABILITIES_USAGE_TOGGLE_HEAL;\n+                    myspells = GetHealingSpellsList();\n+                    break;\n+                case GOSSIP_SENDER_ABILITIES_USAGE_LIST_SUPPORT:\n+                    toggleSender = GOSSIP_SENDER_ABILITIES_USAGE_TOGGLE_SUPPORT;\n+                    myspells = GetSupportSpellsList();\n+                    break;\n+                default:\n+                    ABORT();\n+            }\n+\n+            ASSERT(myspells);\n+\n+            uint32 counter = 0;\n+            for (uint32 spellId : *myspells)\n+            {\n+                if (!HasSpell(spellId)) //not init'ed (cannot be used)\n+                    continue;\n+\n+                SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId); //always valid\n+                std::ostringstream name;\n+                _AddSpellLink(player, spellInfo, name);\n+\n+                GossipOptionIcon icon = (GetSpell(spellId) != 0) ? BOT_ICON_ON : BOT_ICON_OFF;\n+                AddGossipItemFor(player, icon, name.str(), toggleSender, GOSSIP_ACTION_INFO_DEF + spellId);\n+                if (++counter >= BOT_GOSSIP_MAX_ITEMS - 1) //back\n+                {\n+                    BOT_LOG_ERROR(\"scripts\", \"bot_ai: gossip abilities list overflow with sender {} for bot class {}!\",\n+                        sender, uint32(_botclass));\n+                    break;\n+                }\n+            }\n+\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_BACK), GOSSIP_SENDER_ABILITIES_USAGE_LIST, GOSSIP_ACTION_INFO_DEF + 2);\n+            break;\n+        }\n+        case GOSSIP_SENDER_ABILITIES_USAGE_LIST:\n+        {\n+            subMenu = true;\n+\n+            if (GetDamagingSpellsList())\n+                AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_DAMAGE) + \"...\", GOSSIP_SENDER_ABILITIES_USAGE_LIST_DAMAGE, GOSSIP_ACTION_INFO_DEF + 1);\n+            if (GetCCSpellsList())\n+                AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_CONTROL) + \"...\", GOSSIP_SENDER_ABILITIES_USAGE_LIST_CC, GOSSIP_ACTION_INFO_DEF + 2);\n+            if (GetHealingSpellsList())\n+                AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_HEAL) + \"...\", GOSSIP_SENDER_ABILITIES_USAGE_LIST_HEAL, GOSSIP_ACTION_INFO_DEF + 3);\n+            if (GetSupportSpellsList())\n+                AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_OTHER) + \"...\", GOSSIP_SENDER_ABILITIES_USAGE_LIST_SUPPORT, GOSSIP_ACTION_INFO_DEF + 4);\n+\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_BACK), GOSSIP_SENDER_ABILITIES, GOSSIP_ACTION_INFO_DEF + 5);\n+            break;\n+        }\n+        case GOSSIP_SENDER_SPEC_SET:\n+        {\n+            uint8 newSpec = action - GOSSIP_ACTION_INFO_DEF;\n+\n+            if (newSpec != _spec && newSpec >= BOT_SPEC_BEGIN && newSpec <= BOT_SPEC_END)\n+            {\n+                _newspec = newSpec;\n+                me->CastSpell(me, ACTIVATE_SPEC, false);\n+                BotWhisper(LocalizedNpcText(player, BOT_TEXT_CHANGING_MY_SPEC_TO_) + LocalizedNpcText(player, TextForSpec(_newspec)));\n+                break;\n+            }\n+        }\n+        [[fallthrough]];\n+        case GOSSIP_SENDER_SPEC:\n+        {\n+            subMenu = true;\n+\n+            uint8 specIndex;\n+            switch (_botclass)\n+            {\n+                case BOT_CLASS_WARRIOR:         specIndex = BOT_SPEC_WARRIOR_ARMS;          break;\n+                case BOT_CLASS_PALADIN:         specIndex = BOT_SPEC_PALADIN_HOLY;          break;\n+                case BOT_CLASS_HUNTER:          specIndex = BOT_SPEC_HUNTER_BEASTMASTERY;   break;\n+                case BOT_CLASS_ROGUE:           specIndex = BOT_SPEC_ROGUE_ASSASINATION;    break;\n+                case BOT_CLASS_PRIEST:          specIndex = BOT_SPEC_PRIEST_DISCIPLINE;     break;\n+                case BOT_CLASS_DEATH_KNIGHT:    specIndex = BOT_SPEC_DK_BLOOD;              break;\n+                case BOT_CLASS_SHAMAN:          specIndex = BOT_SPEC_SHAMAN_ELEMENTAL;      break;\n+                case BOT_CLASS_MAGE:            specIndex = BOT_SPEC_MAGE_ARCANE;           break;\n+                case BOT_CLASS_WARLOCK:         specIndex = BOT_SPEC_WARLOCK_AFFLICTION;    break;\n+                case BOT_CLASS_DRUID:           specIndex = BOT_SPEC_DRUID_BALANCE;         break;\n+                default:\n+                    BOT_LOG_ERROR(\"entities.unit\", \"bot_ai:GOSSIP_SENDER_SPEC called for class {} with no specs!\", uint32(_botclass));\n+                    return true;\n+            }\n+\n+            for (uint8 i = specIndex; i < specIndex + 3; ++i)\n+            {\n+                GossipOptionIcon icon = (GetSpec() == i) ? BOT_ICON_ON : BOT_ICON_OFF;\n+                AddGossipItemFor(player, icon, LocalizedNpcText(player, TextForSpec(i)), GOSSIP_SENDER_SPEC_SET, GOSSIP_ACTION_INFO_DEF + i);\n+            }\n+\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_BACK), 1, GOSSIP_ACTION_INFO_DEF + 2);\n+            break;\n+        }\n+        case GOSSIP_SENDER_USEITEM_USE:\n+        {\n+            if (uint32 guidLow = action - GOSSIP_ACTION_INFO_DEF)\n+            {\n+                Item const* item = nullptr;\n+                bool found = false;\n+                for (uint8 i = INVENTORY_SLOT_ITEM_START; i != INVENTORY_SLOT_ITEM_END; ++i)\n+                {\n+                    item = player->GetItemByPos(INVENTORY_SLOT_BAG_0, i);\n+                    if (item && item->GetGUID().GetCounter() == guidLow)\n+                    {\n+                        found = true;\n+                        break;\n+                    }\n+                }\n+\n+                if (!found)\n+                {\n+                    for (uint8 i = INVENTORY_SLOT_BAG_START; i != INVENTORY_SLOT_BAG_END; ++i)\n+                    {\n+                        if (Bag const* pBag = player->GetBagByPos(i))\n+                        {\n+                            for (uint32 j = 0; j != pBag->GetBagSize(); ++j)\n+                            {\n+                                item = player->GetItemByPos(i, j);\n+                                if (item && item->GetGUID().GetCounter() == guidLow)\n+                                {\n+                                    found = true;\n+                                    break;\n+                                }\n+                            }\n+                        }\n+\n+                        if (found)\n+                            break;\n+                    }\n+                }\n+\n+                if (found)\n+                {\n+                    ItemTemplate const* proto = item->GetTemplate();\n+                    // Learning (483 / 55884)\n+                    if (proto->Spells[0].SpellId == 483 || proto->Spells[0].SpellId == 55884)\n+                        break;\n+\n+                    // cast item spell\n+                    SpellCastTargets targets;\n+                    targets.SetUnitTarget(me);\n+                    _castBotItemUseSpell(item, targets);\n+                }\n+            }\n+\n+            //break;\n+            action = GOSSIP_ACTION_INFO_DEF;\n+            [[fallthrough]];\n+        }\n+        case GOSSIP_SENDER_USEITEM:\n+        {\n+            subMenu = true;\n+\n+            uint32 counter = 0;\n+            uint32 maxcounter = BOT_GOSSIP_MAX_ITEMS - 2; //update, back\n+\n+            static const auto is_consumable_item = [](Item const* item, Creature const* bot) {\n+                if (ItemTemplate const* proto = item ? item->GetTemplate() : nullptr)\n+                {\n+                    if (!(proto->Class != ITEM_CLASS_WEAPON && proto->Class != ITEM_CLASS_ARMOR &&\n+                        (proto->AllowableClass == 0 || (proto->AllowableClass & (1u << (bot->GetBotClass() - 1)))) &&\n+                        proto->RequiredSkill == 0 && proto->RequiredSpell == 0 && bot->GetLevel() >= proto->RequiredLevel))\n+                        return false;\n+                    bool has_spell = false;\n+                    for (auto const& ispell: proto->Spells)\n+                    {\n+                        if (ispell.SpellId != 0)\n+                        {\n+                            if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(ispell.SpellId))\n+                            {\n+                                if (spellInfo->IsPassive())\n+                                    continue;\n+                                bool valid_effect = true;\n+                                for (auto i : NPCBots::index_array<uint8, MAX_SPELL_EFFECTS>)\n+                                {\n+                                    SpellEffectInfo const& effect = spellInfo->GetEffect(SpellEffIndex(i));\n+                                    if (!effect.IsEffect())\n+                                        continue;\n+                                    if (effect.TargetA.GetTarget() != TARGET_UNIT_CASTER || effect.TargetB.GetTarget() != 0)\n+                                        valid_effect = false;\n+                                    else\n+                                    {\n+                                        switch (effect.Effect)\n+                                        {\n+                                            case SPELL_EFFECT_SUMMON:\n+                                            case SPELL_EFFECT_CREATE_ITEM:\n+                                                valid_effect = false;\n+                                                break;\n+                                            default:\n+                                                break;\n+                                        }\n+                                    }\n+                                }\n+                                if (!valid_effect)\n+                                    continue;\n+                                has_spell = true;\n+                            }\n+                        }\n+                    }\n+                    return has_spell;\n+                }\n+                return false;\n+            };\n+\n+            for (uint8 i = INVENTORY_SLOT_ITEM_START; i != INVENTORY_SLOT_ITEM_END; ++i)\n+            {\n+                Item const* item = player->GetItemByPos(INVENTORY_SLOT_BAG_0, i);\n+                if (is_consumable_item(item, me))\n+                {\n+                    std::ostringstream name;\n+                    _AddItemLink(player, item, name);\n+                    AddGossipItemFor(player, GOSSIP_ICON_CHAT, name.str(), GOSSIP_SENDER_USEITEM_USE, GOSSIP_ACTION_INFO_DEF + item->GetGUID().GetCounter());\n+                    ++counter; //no need to check max counter here\n+                }\n+            }\n+\n+            for (uint8 i = INVENTORY_SLOT_BAG_START; i != INVENTORY_SLOT_BAG_END; ++i)\n+            {\n+                if (Bag const* pBag = player->GetBagByPos(i))\n+                {\n+                    for (uint32 j = 0; j != pBag->GetBagSize() && counter < maxcounter; ++j)\n+                    {\n+                        Item const* item = player->GetItemByPos(i, j);\n+                        if (is_consumable_item(item, me))\n+                        {\n+                            std::ostringstream name;\n+                            _AddItemLink(player, item, name);\n+                            AddGossipItemFor(player, GOSSIP_ICON_CHAT, name.str(), GOSSIP_SENDER_USEITEM_USE, GOSSIP_ACTION_INFO_DEF + item->GetGUID().GetCounter());\n+                            ++counter;\n+                        }\n+                    }\n+                }\n+            }\n+\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_UPDATE), sender, action);\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_BACK), 1, GOSSIP_ACTION_INFO_DEF + 1);\n+\n+            break;\n+        }\n+        case GOSSIP_SENDER_HIRE:\n+        {\n+            int32 reason = action - GOSSIP_ACTION_INFO_DEF;\n+            if (!reason)\n+            {\n+                if (_botData->owner)\n+                {\n+                    //std::ostringstream ostr;\n+                    //std::string name;\n+                    //ostr << \"Go away. I serve my master \";\n+                    //if (sCharacterCache->GetCharacterNameByGuid(ObjectGuid(HighGuid::Player, _botData->owner), name))\n+                    //    ostr << name;\n+                    //else\n+                    //    ostr << \"unknown (\" << _botData->owner << ')';\n+                    //BotWhisper(ostr.view(), player);\n+                    ChatHandler ch(player->GetSession());\n+                    ch.PSendSysMessage(LocalizedNpcText(player, BOT_TEXT_HIREFAIL_OWNED).c_str(), me->GetName());\n+                    break;\n+                }\n+\n+                uint8 minlvl = BotDataMgr::GetMinLevelForBotClass(_botclass);\n+                if (player->GetLevel() < minlvl)\n+                {\n+                    ChatHandler ch(player->GetSession());\n+                    uint32 locStringId;\n+                    switch (minlvl)\n+                    {\n+                        case 55: locStringId = BOT_TEXT_HIREFAIL_LVL55; break;\n+                        case 20: locStringId = BOT_TEXT_HIREFAIL_LVL20; break;\n+                        case 40: locStringId = BOT_TEXT_HIREFAIL_LVL40; break;\n+                        case 60: locStringId = BOT_TEXT_HIREFAIL_LVL60; break;\n+                        default:\n+                            BOT_LOG_ERROR(\"scripts\", \"No message exists for min class level {}!\", uint32(minlvl));\n+                            locStringId = BOT_TEXT_HIREFAIL_LVL60;\n+                            break;\n+                    }\n+                    switch (_botclass)\n+                    {\n+                        case BOT_CLASS_DEATH_KNIGHT:\n+                            BotWhisper(LocalizedNpcText(player, BOT_TEXT_HIREDENY_DK), player);\n+                            break;\n+                        case BOT_CLASS_SPHYNX:\n+                            me->TextEmote(me->GetName() + LocalizedNpcText(player, BOT_TEXT_HIREDENY_SPHYNX));\n+                            break;\n+                        case BOT_CLASS_ARCHMAGE:\n+                            BotWhisper(LocalizedNpcText(player, BOT_TEXT_HIREDENY_ARCHMAGE), player);\n+                            break;\n+                    }\n+                    ch.PSendSysMessage(LocalizedNpcText(player, locStringId).c_str(), me->GetName());\n+                    break;\n+                }\n+\n+                if (uint32 maxBotsPerAccount = BotCfg::GetMaxAccountBots())\n+                {\n+                    uint32 accountBotsCount = BotDataMgr::GetAccountBotsCount(player->GetSession()->GetAccountId());\n+                    if (accountBotsCount >= maxBotsPerAccount)\n+                    {\n+                        ChatHandler ch(player->GetSession());\n+                        ch.PSendSysMessage(LocalizedNpcText(player, BOT_TEXT_HIREFAIL_MAXBOTS_ACCOUNT).c_str(), accountBotsCount, maxBotsPerAccount);\n+                        break;\n+                    }\n+                }\n+\n+                if (SetBotOwner(player))\n+                {\n+                    if (_botclass == BOT_CLASS_SPHYNX)\n+                        me->TextEmote(me->GetName() + LocalizedNpcText(player, BOT_TEXT_HIRE_EMOTE_SPHYNX) + player->GetName());\n+                    else\n+                        BotWhisper(LocalizedNpcText(player, BOT_TEXT_HIRE_SUCCESS), player);\n+                }\n+                else\n+                    BotSay(\"...\", player);\n+            }\n+            else if (reason == -1)\n+            {\n+                me->SetFaction(FACTION_TEMPLATE_NEUTRAL_HOSTILE);\n+                if (botPet)\n+                    botPet->SetFaction(FACTION_TEMPLATE_NEUTRAL_HOSTILE);\n+                BotYell(LocalizedNpcText(player, BOT_TEXT_DIE), player);\n+                me->Attack(player, true);\n+                break;\n+            }\n+            else\n+            {\n+                ChatHandler ch(player->GetSession());\n+                switch (reason)\n+                {\n+                    case 1: //has owner\n+                    {\n+                        std::ostringstream ostr;\n+                        std::string name;\n+                        ostr << LocalizedNpcText(player, BOT_TEXT_HIREDENY_MY_MASTER_IS_);\n+                        if (sCharacterCache->GetCharacterNameByGuid(ObjectGuid::Create<HighGuid::Player>(_botData->owner), name))\n+                            ostr << name;\n+                        else\n+                            ostr << LocalizedNpcText(player, BOT_TEXT_UNKNOWN) + \" (\" << _botData->owner << ')';\n+                        BotWhisper(ostr.view(), player);\n+                        ch.PSendSysMessage(LocalizedNpcText(player, BOT_TEXT_HIREFAIL_OWNED).c_str(), me->GetName());\n+                        break;\n+                    }\n+                    case 2: //max npcbots exceed\n+                        ch.PSendSysMessage(LocalizedNpcText(player, BOT_TEXT_HIREFAIL_MAXBOTS).c_str(), BotCfg::GetMaxNpcBots(player->GetLevel()));\n+                        BotSay(\"...\", player);\n+                        break;\n+                    case 3: //not enough money\n+                    {\n+                        std::ostringstream ostr;\n+                        ostr << LocalizedNpcText(player, BOT_TEXT_HIREFAIL_COST) << \" (\"\n+                            << BotCfg::GetNpcBotCostStr(player->GetLevel(), _botclass) << \")!\";\n+                        ch.SendSysMessage(ostr.view());\n+                        player->SendBuyError(BUY_ERR_NOT_ENOUGHT_MONEY, 0, 0, 0);\n+                        BotSay(\"...\", player);\n+                        break;\n+                    }\n+                    case 4: //class bots exceed\n+                    {\n+                        uint8 count = std::ranges::count_if(*player->GetBotMgr()->GetBotMap(), [botclass = GetBotClass()](BotMap::value_type const& kv) {\n+                            return kv.second->GetBotClass() == botclass;\n+                        });\n+\n+                        ch.PSendSysMessage(LocalizedNpcText(player, BOT_TEXT_HIREFAIL_MAXCLASSBOTS).c_str(), count, BotCfg::GetMaxClassBots());\n+                        BotSay(\"...\", player);\n+                        break;\n+                    }\n+                    default:\n+                        break;\n+                }\n+            }\n+            break;\n+        }\n+        case GOSSIP_SENDER_DISMISS:\n+        {\n+            BotMgr* mgr = player->GetBotMgr();\n+            //send items to owner -- Unequip all\n+            bool abort = false;\n+            for (auto i : NPCBots::index_array<uint8, BOT_INVENTORY_SIZE>)\n+            {\n+                BotEquipResult slot_result = i <= BOT_SLOT_RANGED ? _resetEquipment(i, player->GetGUID(), false) : _unequip(i, player->GetGUID(), false);\n+                if (slot_result != BotEquipResult::BOT_EQUIP_RESULT_OK)\n+                {\n+                    ChatHandler ch(player->GetSession());\n+                    ch.PSendSysMessage(LocalizedNpcText(player, BOT_TEXT_CANT_DISMISS_EQUIPMENT).c_str(), uint32(i), LocalizedNpcText(player, BOT_TEXT_SLOT_MH + i));\n+                    abort = true;\n+                    break;\n+                }\n+            }\n+\n+            if (abort)\n+                break;\n+\n+            mgr->RemoveBot(me->GetGUID(), BOT_REMOVE_DISMISS);\n+            if (BotCfg::IsEnrageOnDimissEnabled())\n+            {\n+                if (Aura* bers = me->AddAura(BERSERK, me))\n+                {\n+                    uint32 dur = 5 * MINUTE * IN_MILLISECONDS;\n+                    bers->SetDuration(dur);\n+                    bers->SetMaxDuration(dur);\n+                }\n+            }\n+            //if (urand(1,100) <= 25)\n+            //{\n+            //    me->SetFaction(FACTION_TEMPLATE_HATES_EVERYTHING_1);\n+            //    if (Creature* pet = GetBotsPet())\n+            //        pet->SetFaction(FACTION_TEMPLATE_HATES_EVERYTHING_1);\n+            //    BotSay(\"Fool...\", player);\n+            //    me->Attack(player, true);\n+            //}\n+            //else\n+                BotSay(\"...\", player);\n+\n+            break;\n+        }\n+        case GOSSIP_SENDER_OWNERSHIP:\n+        {\n+            subMenu = true;\n+            const uint8 MAX_SHARED_OWNERS_TO_SHOW = BOT_GOSSIP_MAX_ITEMS - 5; // add, remove, count, owner, \"...\"\n+            uint8 counter = 0;\n+\n+            if (!shared_owner || BotCfg::IsSharedOwnerOptionEnabled(SharedOwnerOptionMask::SHARED_OWNER_OPTION_MASK_ADD_OWNERS))\n+                player->PlayerTalkClass->GetGossipMenu().AddMenuItem(-1, GOSSIP_ICON_TABARD, LocalizedNpcText(player, BOT_TEXT_ADD_OWNER),\n+                    GOSSIP_SENDER_OWNERSHIP_ADD_PRE, GOSSIP_ACTION_INFO_DEF + 1, Bcore::StringFormat(\"{}{}\", LocalizedNpcText(player, BOT_TEXT_SHARED_BOT_WARN_ADD), \"!\"), 0, false);\n+            if (!shared_owner || BotCfg::IsSharedOwnerOptionEnabled(SharedOwnerOptionMask::SHARED_OWNER_OPTION_MASK_REMOVE_OWNERS))\n+                player->PlayerTalkClass->GetGossipMenu().AddMenuItem(-1, GOSSIP_ICON_TAXI, LocalizedNpcText(player, BOT_TEXT_REMOVE_OWNER),\n+                    GOSSIP_SENDER_OWNERSHIP_REMOVE, GOSSIP_ACTION_INFO_DEF + 1, {}, 0, true);\n+\n+\n+            CharacterCacheEntry const* char_entry = sCharacterCache->GetCharacterCacheByGuid(ObjectGuid::Create<HighGuid::Player>(_botData->owner));\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, Bcore::StringFormat(\"{}: {} ({})\",\n+                LocalizedNpcText(player, BOT_TEXT_OWNER), char_entry ? char_entry->Name : LocalizedNpcText(player, BOT_TEXT_UNKNOWN), _botData->owner), sender, action);\n+\n+            if (!_botData->shared_owners.empty())\n+            {\n+                AddGossipItemFor(player, GOSSIP_ICON_CHAT, Bcore::StringFormat(\"{} {} {}:\",\n+                    LocalizedNpcText(player, BOT_TEXT_SHARED_WITH), _botData->shared_owners.size(), LocalizedNpcText(player, BOT_TEXT_PLAYERS)), sender, action);\n+                for (uint32 guidlow : _botData->shared_owners)\n+                {\n+                    if (++counter > MAX_SHARED_OWNERS_TO_SHOW)\n+                    {\n+                        AddGossipItemFor(player, GOSSIP_ICON_CHAT, \"...\", sender, action);\n+                        break;\n+                    }\n+                    char_entry = sCharacterCache->GetCharacterCacheByGuid(ObjectGuid::Create<HighGuid::Player>(guidlow));\n+                    std::string showner_str = Bcore::StringFormat(\"{} ({})\", char_entry ? char_entry->Name : LocalizedNpcText(player, BOT_TEXT_UNKNOWN), guidlow);\n+                    AddGossipItemFor(player, GOSSIP_ICON_CHAT, showner_str, sender, action);\n+                }\n+            }\n+            break;\n+        }\n+        case GOSSIP_SENDER_OWNERSHIP_ADD_PRE:\n+        {\n+            subMenu = true;\n+            player->PlayerTalkClass->GetGossipMenu().AddMenuItem(-1, GOSSIP_ICON_TABARD, LocalizedNpcText(player, BOT_TEXT_ADD_OWNER),\n+                GOSSIP_SENDER_OWNERSHIP_ADD, GOSSIP_ACTION_INFO_DEF + 1, {}, 0, true);\n+            break;\n+        }\n+        case GOSSIP_SENDER_JOIN_GROUP:\n+        {\n+            uint32 option = action - GOSSIP_ACTION_INFO_DEF;\n+            switch (option)\n+            {\n+                case 1: //single bot\n+                    player->GetBotMgr()->AddBotToGroup(me);\n+                    break;\n+                case 2: //all bots\n+                {\n+                    for (auto const& [_, bot] : *player->GetBotMgr()->GetBotMap())\n+                        if (bot)\n+                            player->GetBotMgr()->AddBotToGroup(bot);\n+                    break;\n+                }\n+            }\n+            break;\n+        }\n+        case GOSSIP_SENDER_LEAVE_GROUP:\n+        {\n+            player->GetBotMgr()->RemoveBotFromGroup(me);\n+            break;\n+        }\n+        case GOSSIP_SENDER_HOLDPOSITION:\n+        {\n+            SetBotCommandState(BOT_COMMAND_STAY);\n+            //BotWhisper(\"Standing still\");\n+            break;\n+        }\n+        case GOSSIP_SENDER_DONOTHING:\n+        {\n+            SetBotCommandState(BOT_COMMAND_FULLSTOP);\n+            //BotWhisper(\"As you wish\");\n+            break;\n+        }\n+        case GOSSIP_SENDER_FOLLOWME:\n+        {\n+            SetBotCommandState(BOT_COMMAND_FOLLOW, true);\n+            //BotWhisper(\"Following\");\n+            break;\n+        }\n+        case GOSSIP_SENDER_FORMATION_TOGGLE_COMBAT_POSITIONING:\n+        {\n+            player->GetBotMgr()->SetBotAllowCombatPositioning(!player->GetBotMgr()->GetBotAllowCombatPositioning());\n+\n+            //break; //return to menu\n+        }\n+        [[fallthrough]];\n+        case GOSSIP_SENDER_FORMATION:\n+        {\n+            subMenu = true;\n+            std::ostringstream diststr;\n+            diststr << LocalizedNpcText(player, BOT_TEXT_FOLLOW_DISTANCE) << \" (\" << LocalizedNpcText(player, BOT_TEXT_CURRENT) << \": \" << uint32(master->GetBotMgr()->GetBotFollowDist()) << ')';\n+            player->PlayerTalkClass->GetGossipMenu().AddMenuItem(-1, GOSSIP_ICON_CHAT, diststr.str(),\n+                GOSSIP_SENDER_FORMATION_FOLLOW_DISTANCE_SET, GOSSIP_ACTION_INFO_DEF + 1, \"\", 0, true);\n+\n+            if (HasRole(BOT_ROLE_RANGED))\n+            {\n+                AddGossipItemFor(player, !player->GetBotMgr()->GetBotAllowCombatPositioning() ? GOSSIP_ICON_BATTLE : GOSSIP_ICON_CHAT,\n+                    LocalizedNpcText(player, BOT_TEXT_DISABLE_COMBAT_POSITIONING), GOSSIP_SENDER_FORMATION_TOGGLE_COMBAT_POSITIONING, GOSSIP_ACTION_INFO_DEF + 2);\n+                AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_ATTACK_DISTANCE) + \"...\", GOSSIP_SENDER_FORMATION_ATTACK_DISTANCE, GOSSIP_ACTION_INFO_DEF + 3);\n+                AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_ATTACK_ANGLE) + \"...\", GOSSIP_SENDER_FORMATION_ATTACK_ANGLE, GOSSIP_ACTION_INFO_DEF + 4);\n+            }\n+\n+            if (!HasRole(BOT_ROLE_TANK) && HasRole(BOT_ROLE_DPS | BOT_ROLE_HEAL))\n+                AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_ENGAGE_BEHAVIOR) + \"...\", GOSSIP_SENDER_ENGAGE_BEHAVIOR, GOSSIP_ACTION_INFO_DEF + 5);\n+\n+            if (player->GetGroup())\n+            {\n+                for (uint32 role = BOT_ROLE_TANK; !!(role & BOT_ROLE_MASK_MAIN); role <<= 1)\n+                {\n+                    if (role & (BOT_ROLE_TANK | BOT_ROLE_DPS) && HasRole(role))\n+                        AddGossipItemFor(player, GOSSIP_ICON_TALK, LocalizedNpcText(player, BOT_TEXT_PRIORITY_TARGET) + \" (\" + LocalizedNpcText(player, GetRoleString(role)) + \")...\", GOSSIP_SENDER_PRIORITY_TARGET, uint32(GOSSIP_ACTION_INFO_DEF) + role);\n+                }\n+            }\n+\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_BACK), 1, GOSSIP_ACTION_INFO_DEF + 6);\n+            break;\n+        }\n+        case GOSSIP_SENDER_FORMATION_ATTACK_DISTANCE_SET:\n+        {\n+            uint32 choice = action - GOSSIP_ACTION_INFO_DEF;\n+            if (choice == 1) //short\n+            {\n+                player->GetBotMgr()->SetBotAttackRangeMode(BOT_ATTACK_RANGE_SHORT);\n+            }\n+            else if (choice == 2) //long\n+            {\n+                player->GetBotMgr()->SetBotAttackRangeMode(BOT_ATTACK_RANGE_LONG);\n+            }\n+\n+            //break; //return to menu\n+        }\n+        [[fallthrough]];\n+        case GOSSIP_SENDER_FORMATION_ATTACK_DISTANCE:\n+        {\n+            subMenu = true;\n+\n+            uint8 mode = master->GetBotMgr()->GetBotAttackRangeMode();\n+            AddGossipItemFor(player, mode == BOT_ATTACK_RANGE_SHORT ? GOSSIP_ICON_BATTLE : GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_SHORT_RANGE_ATTACKS), GOSSIP_SENDER_FORMATION_ATTACK_DISTANCE_SET, GOSSIP_ACTION_INFO_DEF + 1);\n+            AddGossipItemFor(player, mode == BOT_ATTACK_RANGE_LONG ? GOSSIP_ICON_BATTLE : GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_LONG_RANGE_ATTACKS), GOSSIP_SENDER_FORMATION_ATTACK_DISTANCE_SET, GOSSIP_ACTION_INFO_DEF + 2);\n+\n+            std::ostringstream diststr;\n+            if (mode == BOT_ATTACK_RANGE_EXACT)\n+                diststr << LocalizedNpcText(player, BOT_TEXT_EXACT) << \" (\" << LocalizedNpcText(player, BOT_TEXT_CURRENT) << \": \" << uint32(master->GetBotMgr()->GetBotExactAttackRange()) << ')';\n+            else\n+                diststr << LocalizedNpcText(player, BOT_TEXT_EXACT) << \" (0-50)\";\n+            player->PlayerTalkClass->GetGossipMenu().AddMenuItem(-1, mode == BOT_ATTACK_RANGE_EXACT ? GOSSIP_ICON_BATTLE : GOSSIP_ICON_CHAT,\n+                diststr.str(), GOSSIP_SENDER_FORMATION_ATTACK_DISTANCE_SET, GOSSIP_ACTION_INFO_DEF + 3, \"\", 0, true);\n+\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_BACK), 1, GOSSIP_ACTION_INFO_DEF + 4);\n+            break;\n+        }\n+        case GOSSIP_SENDER_FORMATION_ATTACK_ANGLE_SET:\n+        {\n+            uint32 choice = action - GOSSIP_ACTION_INFO_DEF;\n+            if (choice == 1) //normal\n+            {\n+                player->GetBotMgr()->SetBotAttackAngleMode(BOT_ATTACK_ANGLE_NORMAL);\n+            }\n+            if (choice == 2) //avoid frontal aoe\n+            {\n+                player->GetBotMgr()->SetBotAttackAngleMode(BOT_ATTACK_ANGLE_AVOID_FRONTAL_AOE);\n+            }\n+\n+            //break; //return to menu\n+        }\n+        [[fallthrough]];\n+        case GOSSIP_SENDER_FORMATION_ATTACK_ANGLE:\n+        {\n+            subMenu = true;\n+\n+            uint8 mode = master->GetBotMgr()->GetBotAttackAngleMode();\n+            AddGossipItemFor(player, mode == BOT_ATTACK_ANGLE_NORMAL ? GOSSIP_ICON_BATTLE : GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_NORMAL), GOSSIP_SENDER_FORMATION_ATTACK_ANGLE_SET, GOSSIP_ACTION_INFO_DEF + 1);\n+            AddGossipItemFor(player, mode == BOT_ATTACK_ANGLE_AVOID_FRONTAL_AOE ? GOSSIP_ICON_BATTLE : GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_AVOID_FRONTAL_AOE), GOSSIP_SENDER_FORMATION_ATTACK_ANGLE_SET, GOSSIP_ACTION_INFO_DEF + 2);\n+\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_BACK), 1, GOSSIP_ACTION_INFO_DEF + 3);\n+            break;\n+        }\n+        case GOSSIP_SENDER_ENGAGE_BEHAVIOR:\n+        {\n+            subMenu = true;\n+\n+            if (HasRole(BOT_ROLE_DPS))\n+            {\n+                std::ostringstream delaystr;\n+                delaystr.setf(std::ios_base::fixed);\n+                delaystr.precision(2);\n+                delaystr << LocalizedNpcText(player, BOT_TEXT_DELAY_ATTACK_BY) << \": \" << float(player->GetBotMgr()->GetEngageDelayDPS() / 1000.f) << LocalizedNpcText(player, BOT_TEXT_SECOND_SHORT);\n+                player->PlayerTalkClass->GetGossipMenu().AddMenuItem(-1, GOSSIP_ICON_CHAT, delaystr.str(),\n+                    GOSSIP_SENDER_ENGAGE_DELAY_SET_ATTACK, GOSSIP_ACTION_INFO_DEF + 1, \"\", 0, true);\n+            }\n+            if (HasRole(BOT_ROLE_HEAL))\n+            {\n+                std::ostringstream delaystr;\n+                delaystr.setf(std::ios_base::fixed);\n+                delaystr.precision(2);\n+                delaystr << LocalizedNpcText(player, BOT_TEXT_DELAY_HEALING_BY) << \": \" << float(player->GetBotMgr()->GetEngageDelayHeal() / 1000.f) << LocalizedNpcText(player, BOT_TEXT_SECOND_SHORT);\n+                player->PlayerTalkClass->GetGossipMenu().AddMenuItem(-1, GOSSIP_ICON_CHAT, delaystr.str(), GOSSIP_SENDER_ENGAGE_DELAY_SET_HEALING, GOSSIP_ACTION_INFO_DEF + 2, \"\", 0, true);\n+                if (GetBotClass() != BOT_CLASS_SPHYNX)\n+                {\n+                    std::ostringstream thresholdstr;\n+                    thresholdstr << LocalizedNpcText(player, BOT_TEXT_HEAL_TARGET_HEALTH_THRESHOLD) << \": \" << uint32(GetHealHpPctThreshold()) << \"%\";\n+                    player->PlayerTalkClass->GetGossipMenu().AddMenuItem(-1, GOSSIP_ICON_TALK, thresholdstr.str(), GOSSIP_SENDER_HEAL_HEALTH_THRESHOLD_SET, GOSSIP_ACTION_INFO_DEF + 3, \"\", 0, true);\n+                }\n+            }\n+\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_BACK), 1, GOSSIP_ACTION_INFO_DEF + 4);\n+            break;\n+        }\n+        case GOSSIP_SENDER_HEAL_HEALTH_THRESHOLD_PROPAGATE:\n+        {\n+            uint8 threshold = GetHealHpPctThreshold();\n+            for (auto const& [_, bot] : *player->GetBotMgr()->GetBotMap()) // player === master\n+            {\n+                if (bot && bot != me && bot->GetBotAI() && bot->GetBotAI()->HasRole(BOT_ROLE_HEAL))\n+                    bot->GetBotAI()->SetHealHpPctThreshold(threshold);\n+            }\n+\n+            return OnGossipSelect(player, creature, GOSSIP_SENDER_ENGAGE_BEHAVIOR, action);\n+        }\n+        case GOSSIP_SENDER_PRIORITY_TARGET_SET_TANK:\n+        case GOSSIP_SENDER_PRIORITY_TARGET_SET_DPS:\n+        {\n+            Group const* gr = player->GetGroup();\n+            if (!gr)\n+                break;\n+\n+            uint32 role = sender - GOSSIP_SENDER_PRIORITY_TARGET;\n+            int8 icon = decltype(icon)(action - GOSSIP_ACTION_INFO_DEF);\n+\n+            switch (role)\n+            {\n+                case BOT_ROLE_TANK:\n+                    _primaryIconTank = icon;\n+                    break;\n+                case BOT_ROLE_DPS:\n+                    _primaryIconDamage = icon;\n+                    break;\n+                default:\n+                    break;\n+            }\n+\n+            //break;\n+            action = uint32(GOSSIP_ACTION_INFO_DEF) + role; //restore role value and return to the menu\n+        }\n+        [[fallthrough]];\n+        case GOSSIP_SENDER_PRIORITY_TARGET:\n+        {\n+            Group const* gr = player->GetGroup();\n+            if (!gr)\n+                break;\n+\n+            subMenu = true;\n+\n+            uint32 role = action - GOSSIP_ACTION_INFO_DEF;\n+            switch (role)\n+            {\n+                case BOT_ROLE_TANK:\n+                    for (auto i : NPCBots::index_array_rev<uint8, TARGET_ICONS_COUNT>)\n+                    {\n+                        bool prio = i == _primaryIconTank;\n+                        ObjectGuid guid = gr->GetTargetIcons()[i];\n+                        if (!guid.IsEmpty() && BotCfg::GetTankTargetIconFlags() & GroupIconsFlags[i])\n+                            AddGossipItemFor(player, prio ? GOSSIP_ICON_BATTLE : GOSSIP_ICON_CHAT, player->GetBotMgr()->GetTargetIconString(uint8(i)), GOSSIP_SENDER_PRIORITY_TARGET_SET_TANK, uint32(GOSSIP_ACTION_INFO_DEF) + uint32(i));\n+                    }\n+                    AddGossipItemFor(player, (_primaryIconTank == -1) ? GOSSIP_ICON_BATTLE : GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_NONE2), GOSSIP_SENDER_PRIORITY_TARGET_SET_TANK, uint32(GOSSIP_ACTION_INFO_DEF - 1));\n+                    break;\n+                case BOT_ROLE_DPS:\n+                    for (auto i : NPCBots::index_array_rev<uint8, TARGET_ICONS_COUNT>)\n+                    {\n+                        bool prio = i == _primaryIconDamage;\n+                        ObjectGuid guid = gr->GetTargetIcons()[i];\n+                        uint32 iconMask = BotCfg::GetDPSTargetIconFlags();\n+                        if (HasRole(BOT_ROLE_RANGED))\n+                            iconMask |= BotCfg::GetRangedDPSTargetIconFlags();\n+                        if (!guid.IsEmpty() && iconMask & GroupIconsFlags[i])\n+                            AddGossipItemFor(player, prio ? GOSSIP_ICON_BATTLE : GOSSIP_ICON_CHAT, player->GetBotMgr()->GetTargetIconString(uint8(i)), GOSSIP_SENDER_PRIORITY_TARGET_SET_DPS, uint32(GOSSIP_ACTION_INFO_DEF) + uint32(i));\n+                    }\n+                    AddGossipItemFor(player, (_primaryIconDamage == -1) ? GOSSIP_ICON_BATTLE : GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_NONE2), GOSSIP_SENDER_PRIORITY_TARGET_SET_DPS, uint32(GOSSIP_ACTION_INFO_DEF - 1));\n+                    break;\n+                default:\n+                    BotWhisper(\"unknown role \" + std::to_string(role));\n+                    break;\n+            }\n+\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_BACK), 1, GOSSIP_ACTION_INFO_DEF + 3);\n+            break;\n+        }\n+        case GOSSIP_SENDER_TROUBLESHOOTING_AURA:\n+        {\n+            uint32 spellId = action - GOSSIP_ACTION_INFO_DEF;\n+            for (auto const& [spell_id, aura] : me->GetOwnedAuras())\n+            {\n+                if (spell_id == spellId && aura->GetSpellInfo()->IsChanneled())\n+                    if (Spell const* curSpell = me->GetCurrentSpell(CURRENT_CHANNELED_SPELL))\n+                        if (curSpell->m_spellInfo->Id == spellId)\n+                            me->InterruptSpell(CURRENT_CHANNELED_SPELL);\n+\n+                //Debug\n+                //std::ostringstream msg;\n+                //msg << \"Removing \";\n+                //_AddSpellLink(player, info, msg);\n+                //msg << \" by \";\n+                //ObjectGuid casterGuid = itr->second->GetCasterGUID();\n+                //Unit* caster = casterGuid ? ObjectAccessor::GetUnit(*me, casterGuid) : nullptr;\n+                //if (caster)\n+                //{\n+                //    if (casterGuid == me->GetGUID())\n+                //        msg << \"me\";\n+                //    else\n+                //        msg << caster->GetName();\n+                //}\n+                //else\n+                //    msg << \"Unknown unit\";\n+                //BotWhisper(msg.view());\n+\n+                me->RemoveOwnedAura(spellId, ObjectGuid::Empty, 0, AURA_REMOVE_BY_CANCEL);\n+                break;\n+            }\n+\n+            //break;\n+            action = GOSSIP_ACTION_INFO_DEF + 2; //return to the list and update\n+        }\n+        [[fallthrough]];\n+        case GOSSIP_SENDER_TROUBLESHOOTING_FIX:\n+        {\n+            uint32 option = action - GOSSIP_ACTION_INFO_DEF;\n+            switch (option)\n+            {\n+                //MOVED TO RECEIVEEMOTE\n+                //case 1: //Bot is not mounting, not following while player is mounted\n+                //{\n+                //    //Reason: creature can sometimes retain UNIT_FLAG_X and UNIT_STATE_X\n+                //    //rare occasion, even for bots, you can still talk to them so yeah, stange\n+                //    if (me->HasUnitState(UNIT_STATE_STUNNED) && !me->HasAuraType(SPELL_AURA_MOD_STUN))\n+                //    {\n+                //        me->ClearUnitState(UNIT_STATE_STUNNED);\n+                //        me->RemoveUnitFlag(UNIT_FLAG_STUNNED);\n+                //    }\n+                //    if (me->HasUnitState(UNIT_STATE_CONFUSED) && !me->HasAuraType(SPELL_AURA_MOD_CONFUSE))\n+                //    {\n+                //        me->ClearUnitState(UNIT_STATE_CONFUSED);\n+                //        me->RemoveUnitFlag(UNIT_FLAG_CONFUSED);\n+                //    }\n+                //    break;\n+                //}\n+                case 2: //Remove a visible buff\n+                {\n+                    subMenu = true;\n+                    uint32 count = 0;\n+                    for (auto const& [spell_id, aura] : me->GetOwnedAuras())\n+                    {\n+                        SpellInfo const* info = aura->GetSpellInfo();\n+                        //spells we cannot remove\n+                        //1 passive, negative spells, hidden, locked, shapeshift / mount spells (no hook for that)\n+                        if (info->IsPassive() || !info->IsPositive())\n+                            continue;\n+                        if ((info->Attributes & (SPELL_ATTR0_CANT_CANCEL | SPELL_ATTR0_HIDDEN_CLIENTSIDE)) ||\n+                            (info->AttributesEx & SPELL_ATTR1_DONT_DISPLAY_IN_AURA_BAR))\n+                            continue;\n+                        if (info->HasAura(SPELL_AURA_MOD_SHAPESHIFT))\n+                            continue;\n+                        if (info->HasAura(SPELL_AURA_MOUNTED) && player->HasAura(info->Id))\n+                            continue;\n+                        //2 custom list\n+                        //2.1 Leader of the Pack AOE (supposed to be passive)\n+                        if (info->Id == 24932)\n+                            continue;\n+                        //2.2 Tree of Life AOE (supposed to be passive)\n+                        if (info->Id == 34123)\n+                            continue;\n+                        //2.3 Moonkin Aura AOE (supposed to be passive)\n+                        if (info->Id == 24907)\n+                            continue;\n+                        //2.4 Blood Pact AOE (supposed to be passive)\n+                        if (info->GetFirstRankSpell()->Id == 6307)\n+                            continue;\n+                        //2.5 Fel Intelligence AOE (supposed to be passive)\n+                        if (info->GetFirstRankSpell()->Id == 54424)\n+                            continue;\n+\n+                        std::ostringstream msg;\n+                        _AddSpellLink(player, info, msg);\n+                        AddGossipItemFor(player, GOSSIP_ICON_CHAT, msg.str(), GOSSIP_SENDER_TROUBLESHOOTING_AURA, GOSSIP_ACTION_INFO_DEF + spell_id);\n+\n+                        if (++count >= BOT_GOSSIP_MAX_ITEMS - 2) //update, back\n+                            break;\n+                    }\n+\n+                    AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_UPDATE), sender, action);\n+                    AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_BACK), 1, GOSSIP_ACTION_INFO_DEF + 1);\n+                    break;\n+                }\n+                case 3: //Fix Powers\n+                {\n+                    InitPowers();\n+                    break;\n+                }\n+                default:\n+                    //BotWhisper(\"Unknown action in GOSSIP_SENDER_TROUBLESHOOTING_FIX\", player);\n+                    break;\n+            }\n+            break;\n+        }\n+        case GOSSIP_SENDER_TROUBLESHOOTING:\n+        {\n+            subMenu = true;\n+            //AddGossipItemFor(player, GOSSIP_ICON_CHAT, \"Fix not mounting/following\", GOSSIP_SENDER_TROUBLESHOOTING_FIX, GOSSIP_ACTION_INFO_DEF + 1);\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_REMOVE_BUFF) + \"...\", GOSSIP_SENDER_TROUBLESHOOTING_FIX, GOSSIP_ACTION_INFO_DEF + 2);\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_FIX_POWER), GOSSIP_SENDER_TROUBLESHOOTING_FIX, GOSSIP_ACTION_INFO_DEF + 3);\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_BACK), 1, GOSSIP_ACTION_INFO_DEF + 4);\n+            break;\n+        }\n+        case GOSSIP_SENDER_DEBUG_ACTION:\n+        {\n+            //!!! player != owner !!!\n+            //DEBUG ACTIONS ARE NOT LOCALIZED\n+            bool close = true;\n+            switch (action - GOSSIP_ACTION_INFO_DEF)\n+            {\n+                case 1: //reset owner\n+                    if (!IAmFree())\n+                        master->GetBotMgr()->RemoveBot(me->GetGUID(), BOT_REMOVE_DISMISS);\n+                    else\n+                    {\n+                        uint32 newOwner = 0;\n+                        BotDataMgr::UpdateNpcBotData(me->GetEntry(), NPCBOT_UPDATE_OWNER, &newOwner);\n+                        NpcBotData::SharedOwnersContainer sharedOwners{};\n+                        BotDataMgr::UpdateNpcBotData(me->GetEntry(), NPCBOT_UPDATE_SHARED_OWNERS, &sharedOwners);\n+                        ResetBotAI(BOTAI_RESET_DISMISS);\n+                    }\n+                    break;\n+                case 2: //reset stats\n+                    spawned = false;\n+                    DefaultInit();\n+                    break;\n+                case 3: //list stats\n+                    close = false;\n+                    ReceiveEmote(player, TEXT_EMOTE_BONK);\n+                    break;\n+                case 4: //list roles\n+                {\n+                    close = false;\n+                    ChatHandler ch(player->GetSession());\n+                    ch.PSendSysMessage(\"%s's Roles:\", me->GetName());\n+                    for (uint32 i = BOT_MAX_ROLE; i != BOT_ROLE_NONE; i >>= 1)\n+                    {\n+                        if (_roleMask & i)\n+                        {\n+                            switch (i)\n+                            {\n+                                case BOT_ROLE_TANK:\n+                                    ch.SendSysMessage(\"BOT_ROLE_TANK\");\n+                                    break;\n+                                case BOT_ROLE_TANK_OFF:\n+                                    ch.SendSysMessage(\"BOT_ROLE_TANK_OFF\");\n+                                    break;\n+                                case BOT_ROLE_DPS:\n+                                    ch.SendSysMessage(\"BOT_ROLE_DPS\");\n+                                    break;\n+                                case BOT_ROLE_HEAL:\n+                                    ch.SendSysMessage(\"BOT_ROLE_HEAL\");\n+                                    break;\n+                                //case BOT_ROLE_MELEE:\n+                                //    ch.SendSysMessage(\"BOT_ROLE_MELEE\");\n+                                //    break;\n+                                case BOT_ROLE_RANGED:\n+                                    ch.SendSysMessage(\"BOT_ROLE_RANGED\");\n+                                    break;\n+                                case BOT_ROLE_PARTY:\n+                                    ch.SendSysMessage(\"BOT_ROLE_PARTY\");\n+                                    break;\n+                                default:\n+                                    ch.PSendSysMessage(\"BOT_ROLE_%u\",i);\n+                                    break;\n+                            }\n+                        }\n+                    }\n+                    break;\n+                }\n+                case 5: //list spells\n+                {\n+                    close = false;\n+                    ChatHandler ch(player->GetSession());\n+                    ch.PSendSysMessage(\"%s's Spells:\", me->GetName());\n+                    uint32 counter = 0;\n+                    for (auto const& [rank1_id, spell] : _spells)\n+                    {\n+                        //if (itr->second->spellId == 0)\n+                        //    continue;\n+\n+                        ++counter;\n+                        std::ostringstream sstr;\n+                        SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(rank1_id); //always valid\n+                        _AddSpellLink(player, spellInfo, sstr);\n+                        sstr << \" id: \" << spell.spellId << \", base: \" << rank1_id\n+                            << \", cd: \" << spell.cooldown << \", base: \" << std::max<uint32>(spellInfo->RecoveryTime, spellInfo->CategoryRecoveryTime);\n+                        if (spell.enabled == false)\n+                            sstr << \" (disabled)\";\n+                        ch.PSendSysMessage(\"%u) %s\", counter, sstr.view().data());\n+                    }\n+                    break;\n+                }\n+                case 6: //list owners\n+                {\n+                    close = false;\n+                    ChatHandler ch(player->GetSession());\n+                    ch.PSendSysMessage(\"%s's Owners:\", me->GetName());\n+                    uint32 counter = 0;\n+                    uint32 real_owner_guid = _botData->owner;\n+                    CharacterCacheEntry const* owner_entry = sCharacterCache->GetCharacterCacheByGuid(ObjectGuid::Create<HighGuid::Player>(real_owner_guid));\n+                    ch.PSendSysMessage(\"%u) %s (%u, main)\", ++counter, owner_entry ? owner_entry->Name : LocalizedNpcText(player, BOT_TEXT_UNKNOWN), real_owner_guid);\n+                    std::vector showners(_botData->shared_owners.cbegin(), _botData->shared_owners.cend());\n+                    std::ranges::sort(showners);\n+                    for (uint32 showner_guid : showners)\n+                    {\n+                        owner_entry = sCharacterCache->GetCharacterCacheByGuid(ObjectGuid::Create<HighGuid::Player>(showner_guid));\n+                        ch.PSendSysMessage(\"%u) %s (%u)\", ++counter, owner_entry ? owner_entry->Name : LocalizedNpcText(player, BOT_TEXT_UNKNOWN), showner_guid);\n+                    }\n+                    break;\n+                }\n+                case 7: // Show Waypoint Data\n+                {\n+                    ChatHandler ch(player->GetSession());\n+                    if (_travel_node_last && _travel_node_cur)\n+                    {\n+                        ch.PSendSysMessage(\"Waypoint node data:\");\n+                        ch.PSendSysMessage(\"Current: name:%s, id:%u, x:%.2f, y:%.2f, z:%.2f, proximity:%.2f\", _travel_node_last->GetName(), _travel_node_last->GetWPId(), _travel_node_last->GetPositionX(), _travel_node_last->GetPositionY(), _travel_node_last->GetPositionZ(), _travel_node_last->GetProximity());\n+                        ch.PSendSysMessage(\"Next: name:%s, id:%u, x:%.2f, y:%.2f, z:%.2f, proximity:%.2f\", _travel_node_cur->GetName(), _travel_node_cur->GetWPId(), _travel_node_cur->GetPositionX(), _travel_node_cur->GetPositionY(), _travel_node_cur->GetPositionZ(), _travel_node_cur->GetProximity());\n+                        ch.PSendSysMessage(\"Actual: x:%.2f, y:%.2f, z:%.2f, distance:%.2f\", me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetDistance(_travel_node_last->GetPosition()));\n+                    }\n+                    else\n+                        ch.PSendSysMessage(\"Waypoint data hasn't been created yet\");\n+                    break;\n+                }\n+                case 9: //reload config\n+                {\n+                    close = false;\n+                    BotCfg::ReloadConfig();\n+                    break;\n+                }\n+                default:\n+                    close = false;\n+                    break;\n+            }\n+            if (close)\n+                break;\n+        }\n+        [[fallthrough]];\n+        case GOSSIP_SENDER_DEBUG:\n+        {\n+            //!!! player != owner !!!\n+            subMenu = true;\n+\n+            std::ostringstream ostr;\n+            std::string name;\n+            ostr << \"Bot: \" << me->GetName()\n+                << \" (Id: \" << me->GetEntry()\n+                << \", guidlow: \" << me->GetGUID().GetCounter()\n+                << \", spec: \" << uint32(_spec) << '(' << LocalizedNpcText(player, TextForSpec(_spec)) << ')'\n+                << \", faction: \" << me->GetFaction()\n+                << \"). owner: \";\n+            if (_botData->owner && sCharacterCache->GetCharacterNameByGuid(ObjectGuid::Create<HighGuid::Player>(_botData->owner), name))\n+                ostr << name << \" (\" << _botData->owner << ')';\n+            else\n+                ostr << \"none\";\n+\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, ostr.str(), GOSSIP_SENDER_DEBUG_ACTION, GOSSIP_ACTION_INFO_DEF + 0);\n+\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, \"<Reset Owner>\", GOSSIP_SENDER_DEBUG_ACTION, GOSSIP_ACTION_INFO_DEF + 1);\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, \"<Reset Stats>\", GOSSIP_SENDER_DEBUG_ACTION, GOSSIP_ACTION_INFO_DEF + 2);\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, \"<List Stats>\", GOSSIP_SENDER_DEBUG_ACTION, GOSSIP_ACTION_INFO_DEF + 3);\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, \"<List Roles>\", GOSSIP_SENDER_DEBUG_ACTION, GOSSIP_ACTION_INFO_DEF + 4);\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, \"<List Spells>\", GOSSIP_SENDER_DEBUG_ACTION, GOSSIP_ACTION_INFO_DEF + 5);\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, \"<List Owners>\", GOSSIP_SENDER_DEBUG_ACTION, GOSSIP_ACTION_INFO_DEF + 6);\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, \"<Waypoint Data>\", GOSSIP_SENDER_DEBUG_ACTION, GOSSIP_ACTION_INFO_DEF + 7);\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, \"<List Items>\", GOSSIP_SENDER_EQUIPMENT_LIST, GOSSIP_ACTION_INFO_DEF + 1);\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, \"<Reload Config>\", GOSSIP_SENDER_DEBUG_ACTION, GOSSIP_ACTION_INFO_DEF + 9);\n+\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_BACK), 1, GOSSIP_ACTION_INFO_DEF + 1);\n+            break;\n+        }\n+        case GOSSIP_SENDER_SCAN:\n+        {\n+            subMenu = true;\n+\n+            switch (_botclass)\n+            {\n+                case BOT_CLASS_BM:\n+                    gossipTextId = GOSSIP_CLASSDESC_BM;\n+                    break;\n+                case BOT_CLASS_SPHYNX:\n+                    gossipTextId = GOSSIP_CLASSDESC_SPHYNX;\n+                    break;\n+                case BOT_CLASS_ARCHMAGE:\n+                    gossipTextId = GOSSIP_CLASSDESC_ARCHMAGE;\n+                    break;\n+                case BOT_CLASS_DREADLORD:\n+                    gossipTextId = GOSSIP_CLASSDESC_DREADLORD;\n+                    break;\n+                case BOT_CLASS_SPELLBREAKER:\n+                    gossipTextId = GOSSIP_CLASSDESC_SPELLBREAKER;\n+                    break;\n+                case BOT_CLASS_DARK_RANGER:\n+                    gossipTextId = GOSSIP_CLASSDESC_DARKRANGER;\n+                    break;\n+                case BOT_CLASS_NECROMANCER:\n+                    gossipTextId = GOSSIP_CLASSDESC_NECROMANCER;\n+                    break;\n+                case BOT_CLASS_SEA_WITCH:\n+                    gossipTextId = GOSSIP_CLASSDESC_SEAWITCH;\n+                    break;\n+                case BOT_CLASS_CRYPT_LORD:\n+                    gossipTextId = GOSSIP_CLASSDESC_CRYPTLORD;\n+                    break;\n+                default:\n+                    break;\n+            }\n+\n+            //AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_BACK), 1, GOSSIP_ACTION_INFO_DEF + 1);\n+\n+            break;\n+        }\n+        default:\n+            break;\n+    }\n+\n+    //if we add submenus send them else we should return\n+    if (subMenu)\n+        player->PlayerTalkClass->SendGossipMenu(gossipTextId, me->GetGUID());\n+    else\n+        player->PlayerTalkClass->SendCloseGossip();\n+\n+    return true;\n+}\n+\n+//GossipSelectCode\n+bool bot_ai::OnGossipSelectCode(Player* player, Creature* creature/* == me*/, uint32 sender, uint32 action, char const* code)\n+{\n+    if (!*code)\n+        return true;\n+\n+    if (!BotCfg::IsNpcBotModEnabled() || me->HasUnitState(UNIT_STATE_CASTING) || CCed(me) || IsDuringTeleport() ||\n+        HasBotCommandState(BOT_COMMAND_ISSUED_ORDER) ||\n+        (me->GetVehicle() && me->GetVehicle()->GetBase()->IsInCombat()))\n+    {\n+        player->PlayerTalkClass->SendCloseGossip();\n+        return true;\n+    }\n+\n+    uint32 gossipTextId;\n+    if (player->GetGUID().GetCounter() == _botData->owner || !IAmFree())\n+    {\n+        if (_botclass == BOT_CLASS_SPHYNX)\n+            gossipTextId = GOSSIP_NORMAL_CUSTOM_SPHYNX;\n+        else if (_botclass == BOT_CLASS_DREADLORD)\n+            gossipTextId = GOSSIP_NORMAL_CUSTOM_DREADLORD;\n+        else if (_botclass == BOT_CLASS_DARK_RANGER)\n+            gossipTextId = GOSSIP_NORMAL_CUSTOM_DARKRANGER;\n+        else if (_botclass == BOT_CLASS_SEA_WITCH)\n+            gossipTextId = GOSSIP_NORMAL_CUSTOM_SEAWITCH;\n+        else if (_botclass == BOT_CLASS_CRYPT_LORD)\n+            gossipTextId = GOSSIP_NORMAL_CUSTOM_CRYPTLORD;\n+        else\n+            gossipTextId = GOSSIP_NORMAL_SERVE_MASTER;\n+    }\n+    else\n+    {\n+        if (_botclass == BOT_CLASS_SPHYNX)\n+            gossipTextId = GOSSIP_GREET_CUSTOM_SPHYNX;\n+        else if (_botclass == BOT_CLASS_DREADLORD)\n+            gossipTextId = GOSSIP_GREET_CUSTOM_DREADLORD;\n+        else if (_botclass == BOT_CLASS_DARK_RANGER)\n+            gossipTextId = GOSSIP_GREET_CUSTOM_DARKRANGER;\n+        else if (_botclass == BOT_CLASS_SEA_WITCH)\n+            gossipTextId = GOSSIP_GREET_CUSTOM_SEAWITCH;\n+        else if (_botclass == BOT_CLASS_CRYPT_LORD)\n+            gossipTextId = GOSSIP_GREET_CUSTOM_CRYPTLORD;\n+        else\n+            gossipTextId = GOSSIP_GREET_NEED_SMTH;\n+    }\n+\n+    player->PlayerTalkClass->ClearMenus();\n+\n+    bool subMenu = false;\n+\n+    switch (sender)\n+    {\n+        case GOSSIP_SENDER_FORMATION_FOLLOW_DISTANCE_SET:\n+        {\n+            char* dist = strtok((char*)code, \"\");\n+            uint8 distance = (uint8)std::min<int32>(std::max<int32>(atoi(dist), 0), 100);\n+\n+            player->GetBotMgr()->SetBotFollowDist(distance);\n+\n+            player->PlayerTalkClass->SendCloseGossip();\n+            return OnGossipSelect(player, creature, GOSSIP_SENDER_FORMATION, action);\n+        }\n+        case GOSSIP_SENDER_FORMATION_ATTACK_DISTANCE_SET:\n+        {\n+            uint32 choice = action - GOSSIP_ACTION_INFO_DEF;\n+            if (choice == 3) //exact\n+            {\n+                char* dist = strtok((char*)code, \"\");\n+                uint8 distance = (uint8)std::min<int32>(std::max<int32>(atoi(dist), 0), 50);\n+\n+                player->GetBotMgr()->SetBotAttackRangeMode(BOT_ATTACK_RANGE_EXACT, distance);\n+            }\n+\n+            player->PlayerTalkClass->SendCloseGossip();\n+            return OnGossipSelect(player, creature, GOSSIP_SENDER_FORMATION_ATTACK_DISTANCE, action);\n+        }\n+        case GOSSIP_SENDER_ENGAGE_DELAY_SET_ATTACK:\n+        {\n+            char* dist = strtok((char*)code, \"\");\n+            float delay = std::min<float>(std::max<float>(atof(dist), 0.f), 10.f);\n+\n+            player->GetBotMgr()->SetEngageDelayDPS(uint32(delay * 1000));\n+\n+            player->PlayerTalkClass->SendCloseGossip();\n+            return OnGossipSelect(player, creature, GOSSIP_SENDER_ENGAGE_BEHAVIOR, action);\n+        }\n+        case GOSSIP_SENDER_ENGAGE_DELAY_SET_HEALING:\n+        {\n+            char* dist = strtok((char*)code, \"\");\n+            float delay = std::min<float>(std::max<float>(atof(dist), 0.f), 10.f);\n+\n+            player->GetBotMgr()->SetEngageDelayHeal(uint32(delay * 1000));\n+\n+            player->PlayerTalkClass->SendCloseGossip();\n+            return OnGossipSelect(player, creature, GOSSIP_SENDER_ENGAGE_BEHAVIOR, action);\n+        }\n+        case GOSSIP_SENDER_HEAL_HEALTH_THRESHOLD_SET:\n+        {\n+            subMenu = true;\n+\n+            char* dist = strtok((char*)code, \"\");\n+            float threshold = std::min<float>(std::max<float>(atof(dist), 0.f), 99.f);\n+\n+            SetHealHpPctThreshold(uint8(threshold));\n+\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_SET_FOR_ALL_EVERYONE), GOSSIP_SENDER_HEAL_HEALTH_THRESHOLD_PROPAGATE, GOSSIP_ACTION_INFO_DEF + 1);\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, LocalizedNpcText(player, BOT_TEXT_BACK), GOSSIP_SENDER_ENGAGE_BEHAVIOR, GOSSIP_ACTION_INFO_DEF + 2);\n+            break;\n+        }\n+        case GOSSIP_SENDER_EQUIPMENT_BANK_SET_CREATE:\n+        {\n+            std::string set_name(code);\n+\n+            if (!set_name.empty() && set_name.size() <= MAX_BOT_ITEM_SET_NAME_LENGTH && GetRealEquippedItemsCount() != 0)\n+            {\n+                EquipmentInfo const* einfo = BotDataMgr::GetBotEquipmentInfo(me->GetEntry());\n+                NpcBotItemSet& item_set = BotDataMgr::CreateNewBotItemSet(player->GetGUID());\n+\n+                item_set.name = std::move(set_name);\n+                for (uint8 i : NPCBots::index_array<uint8, BOT_INVENTORY_SIZE>)\n+                    if (Item const* item = _equips[i])\n+                        if (i > BOT_SLOT_RANGED || einfo->ItemEntry[i] != item->GetEntry())\n+                            item_set.items[i] = item->GetEntry();\n+            }\n+            else\n+                BotWhisper(LocalizedNpcText(player, BOT_TEXT_FAILED));\n+\n+            return OnGossipSelect(player, creature, GOSSIP_SENDER_EQUIPMENT_BANK_SETS_MENU, action);\n+        }\n+        case GOSSIP_SENDER_OWNERSHIP_ADD:\n+        {\n+            std::string name_or_guid{ code };\n+            ObjectGuid::LowType lowguid{};\n+\n+            if (Optional<decltype(lowguid)> lguid = Bcore::StringTo<decltype(lowguid)>(name_or_guid))\n+                lowguid = *lguid;\n+            else if (auto lg = normalizePlayerName(name_or_guid) ? sCharacterCache->GetCharacterGuidByName(name_or_guid) : ObjectGuid::Empty; lg != ObjectGuid::Empty)\n+                lowguid = lg.GetCounter();\n+\n+            if (!lowguid)\n+                BotWhisper(Bcore::StringFormat(\"{} ({} {} '{}')\", LocalizedNpcText(player, BOT_TEXT_FAILED), LocalizedNpcText(player, BOT_TEXT_UNKNOWN), LocalizedNpcText(player, BOT_TEXT_PLAYER), lowguid));\n+            else if (lowguid == _botData->owner)\n+                BotWhisper(LocalizedNpcText(player, BOT_TEXT_FAILED));\n+            else if (lowguid == player->GetGUID().GetCounter())\n+                BotWhisper(Bcore::StringFormat(\"{} ({} {})\", LocalizedNpcText(player, BOT_TEXT_FAILED), LocalizedNpcText(player, BOT_TEXT_CURRENT), LocalizedNpcText(player, BOT_TEXT_PLAYER)));\n+            else if (HasSharedOwner(lowguid))\n+                BotWhisper(LocalizedNpcText(player, BOT_TEXT_FAILED));\n+            else if (_botData->shared_owners.size() >= BotCfg::GetMaxSharedOwners())\n+                BotWhisper(Bcore::StringFormat(\"{} ({} >= {})!\", LocalizedNpcText(player, BOT_TEXT_OWNERS_LIMIT_EXCEEDED), _botData->shared_owners.size(), BotCfg::GetMaxSharedOwners()));\n+            else\n+            {\n+                _botData->shared_owners.insert(lowguid);\n+                BotDataMgr::UpdateNpcBotData(me->GetEntry(), NPCBOT_UPDATE_SHARED_OWNERS, &_botData->shared_owners);\n+            }\n+\n+            player->PlayerTalkClass->SendCloseGossip();\n+            return OnGossipSelect(player, creature, GOSSIP_SENDER_OWNERSHIP, action);\n+        }\n+        case GOSSIP_SENDER_OWNERSHIP_REMOVE:\n+        {\n+            std::string name_or_guid{ code };\n+            ObjectGuid::LowType lowguid{};\n+\n+            if (Optional<decltype(lowguid)> lguid = Bcore::StringTo<decltype(lowguid)>(name_or_guid))\n+                lowguid = *lguid;\n+            else if (auto lg = normalizePlayerName(name_or_guid) ? sCharacterCache->GetCharacterGuidByName(name_or_guid) : ObjectGuid::Empty; lg != ObjectGuid::Empty)\n+                lowguid = lg.GetCounter();\n+\n+            if (!lowguid)\n+                BotWhisper(Bcore::StringFormat(\"{} ({} {} '{}')\", LocalizedNpcText(player, BOT_TEXT_FAILED), LocalizedNpcText(player, BOT_TEXT_UNKNOWN), LocalizedNpcText(player, BOT_TEXT_PLAYER), lowguid));\n+            else if (!HasSharedOwner(lowguid))\n+                BotWhisper(LocalizedNpcText(player, BOT_TEXT_FAILED));\n+            else\n+            {\n+                const bool removing_self = lowguid == player->GetGUID().GetCounter();\n+                if (removing_self)\n+                    player->GetBotMgr()->RemoveBot(me->GetGUID(), BOT_REMOVE_BY_DEFAULT);\n+\n+                _botData->shared_owners.erase(lowguid);\n+                BotDataMgr::UpdateNpcBotData(me->GetEntry(), NPCBOT_UPDATE_SHARED_OWNERS, &_botData->shared_owners);\n+\n+                if (removing_self)\n+                    break;\n+            }\n+\n+            player->PlayerTalkClass->SendCloseGossip();\n+            return OnGossipSelect(player, creature, GOSSIP_SENDER_OWNERSHIP, action);\n+        }\n+        default:\n+            break;\n+    }\n+\n+    if (subMenu)\n+        player->PlayerTalkClass->SendGossipMenu(gossipTextId, me->GetGUID());\n+    else\n+        player->PlayerTalkClass->SendCloseGossip();\n+\n+    return true;\n+}\n+//PvP trinket for minions\n+void bot_ai::BreakCC(uint32 diff)\n+{\n+    if (_botclass < BOT_CLASS_EX_START && me->GetLevel() >= 60 && IsSpellReady(PVPTRINKET, diff, false) &&\n+        CCed(me, true) && (me->GetVictim() || !me->getAttackers().empty()) && Rand() < 20)\n+    {\n+        if (doCast(me, PVPTRINKET))\n+            return;\n+    }\n+\n+    uint8 myrace = me->GetRace();\n+\n+    //Racial 6) Every Man for Himself\n+    if (myrace == RACE_HUMAN && IsSpellReady(RACIAL_EVERY_MAN_FOR_HIMSELF, diff, false) && CCed(me, true) &&\n+        !me->HasAuraType(SPELL_AURA_MOD_STEALTH) &&\n+        (me->IsInCombat() || !me->getAttackers().empty()) && Rand() < 40 && !IsCasting() &&\n+        (me->GetLevel() < 60 || !IsSpellReady(PVPTRINKET, diff, false)))\n+    {\n+        if (doCast(me, RACIAL_EVERY_MAN_FOR_HIMSELF))\n+            return;\n+    }\n+    //Racial 5) Forsaken (Will of the Forsaken)\n+    if (myrace == RACE_UNDEAD_PLAYER && IsSpellReady(RACIAL_WILL_OF_THE_FORSAKEN, diff, false) &&\n+        (me->IsInCombat() || !me->getAttackers().empty()) && CCed(me) &&\n+        Rand() < 10 && !me->HasAuraType(SPELL_AURA_MOD_STEALTH) && !IsCasting() &&\n+        (me->GetLevel() < 60 || !IsSpellReady(PVPTRINKET, diff, false)) &&\n+        me->HasAuraWithMechanic((1u<<MECHANIC_CHARM)|(1u<<MECHANIC_FEAR)|(1u<<MECHANIC_SLEEP)))\n+    {\n+        if (doCast(me, RACIAL_WILL_OF_THE_FORSAKEN))\n+            return;\n+    }\n+    //Racial 7) Escape Artist\n+    if (me->GetRace() == RACE_GNOME && IsSpellReady(RACIAL_ESCAPE_ARTIST, diff, false) && CCed(me, true) &&\n+        !me->HasAuraType(SPELL_AURA_MOD_STEALTH) &&\n+        (me->IsInCombat() || !me->getAttackers().empty()) && Rand() < 40 && !IsCasting() &&\n+        (me->GetLevel() < 60 || !IsSpellReady(PVPTRINKET, diff, false)) &&\n+        me->HasAuraWithMechanic((1u<<MECHANIC_SNARE)|(1u<<MECHANIC_ROOT)))\n+    {\n+        if (doCast(me, RACIAL_ESCAPE_ARTIST))\n+            return;\n+    }\n+}\n+//Racial abilities\n+void bot_ai::CheckRacials(uint32 diff)\n+{\n+    //At this point checked CCed and pots\n+    uint8 myrace = me->GetRace();\n+    //Racial 1) Tauren (War Stomp)\n+    if (myrace == RACE_TAUREN && IsSpellReady(RACIAL_WARSTOMP, diff, false) &&\n+        (!IsTank() || me->GetShapeshiftForm() == FORM_NONE) &&\n+        Rand() < 20 && !me->HasAuraType(SPELL_AURA_MOD_STEALTH) && !IsCasting())\n+    {\n+        Unit const* u = me->SelectNearestTarget(7);\n+        if (u && u->IsInCombat() && !CCed(u) && u->isTargetableForAttack(false) && IsInBotParty(u->GetVictim()) && me->IsWithinLOSInMap(u))\n+        {\n+            if (doCast(me, RACIAL_WARSTOMP))\n+                return;\n+        }\n+    }\n+    //Racial 2) Orc (Blood Fury)\n+    if (myrace == RACE_ORC)\n+    {\n+        uint32 bloodFury = RaceSpellForClass(myrace, _botclass);\n+        if (IsSpellReady(bloodFury, diff, false) && me->GetVictim() && GetHealthPCT(me) > 35 && !CCed(me, true) &&\n+            (me->GetVictim()->GetHealth() > me->GetMaxHealth() / 2 || me->getAttackers().size() > 1) &&\n+            Rand() < 20 && !me->HasAuraType(SPELL_AURA_MOD_STEALTH) && !IsCasting())\n+        {\n+            if (doCast(me, bloodFury))\n+                return;\n+        }\n+    }\n+    //Racial 3) Dwarf (Stoneform)\n+    if (myrace == RACE_DWARF && IsSpellReady(RACIAL_STONEFORM, diff, false) && GetHealthPCT(me) < 80 &&\n+        Rand() < 10 && !me->HasAuraType(SPELL_AURA_MOD_STEALTH) && !IsCasting())\n+    {\n+        //Unholy Blight prevents diseases from being dispelled\n+        uint32 const dispelMask = me->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DEATHKNIGHT, 1494, 0) ?\n+            (1u<<DISPEL_POISON) : (1u<<DISPEL_DISEASE)|(1u<<DISPEL_POISON);\n+        uint8 count = 0;\n+        for (auto const& [spell_id, aura] : me->GetOwnedAuras())\n+        {\n+            if (aura->IsPassive())\n+                continue;\n+\n+            AuraApplication const* aurApp = aura->GetApplicationOfTarget(me->GetGUID());\n+            if (!aurApp)\n+                continue;\n+            if (aurApp->IsPositive())\n+                continue;\n+\n+            if ((aura->GetSpellInfo()->GetDispelMask() & dispelMask) ||\n+                aura->GetSpellInfo()->Mechanic == MECHANIC_BLEED)\n+                if (++count > 1)\n+                    break;\n+        }\n+\n+        if (count > 1 - 1*(me->IsInCombat()) && doCast(me, RACIAL_STONEFORM))\n+            return;\n+    }\n+    //Racial 4) Night Elf (Shadowmeld)\n+    if (myrace == RACE_NIGHTELF && IsSpellReady(RACIAL_SHADOWMELD, diff, false) && !me->IsInCombat() && me->GetVictim() &&\n+        me->GetVictim()->IsPlayer() && Rand() < 50 &&\n+        !me->HasAuraType(SPELL_AURA_MOD_STEALTH) && !IsCasting())\n+    {\n+        if (Spell const* spell = me->GetVictim()->GetCurrentSpell(CURRENT_GENERIC_SPELL))\n+        {\n+            if (spell->m_targets.GetUnitTarget() == me && spell->GetTimer() < 500 &&\n+                spell->GetSpellInfo()->HasEffect(SPELL_EFFECT_SCHOOL_DAMAGE))\n+                if (doCast(me, RACIAL_SHADOWMELD))\n+                    return;\n+        }\n+    }\n+    //Racial 8) Troll (Berserking)\n+    if (myrace == RACE_TROLL && IsSpellReady(RACIAL_BERSERKING, diff, false) && me->GetVictim() &&\n+        GetHealthPCT(me) > 35 && !CCed(me, true) &&\n+        (me->GetVictim()->GetHealth() > me->GetMaxHealth() / 2 || me->getAttackers().size() > 1) &&\n+        Rand() < 20 && !me->HasAuraType(SPELL_AURA_MOD_STEALTH) && !IsCasting())\n+    {\n+        if (doCast(me, RACIAL_BERSERKING))\n+            return;\n+    }\n+    //Racial 9) Blood Elf (Arcane Torrent)\n+    if (myrace == RACE_BLOODELF)\n+    {\n+        uint32 arcaneTorrent = RaceSpellForClass(myrace, _botclass);\n+        if (IsSpellReady(arcaneTorrent, diff, false) && !IsCasting() && !Feasting())\n+        {\n+            Unit const* victim = me->GetVictim();\n+            if (victim && victim->IsNonMeleeSpellCast(false, false, true) &&\n+                (me->GetVictim()->GetHealth() > me->GetHealth() / 4 || me->getAttackers().size() > 1) &&\n+                me->GetDistance(victim) < 7 && Rand() < 30 && !me->HasAuraType(SPELL_AURA_MOD_STEALTH))\n+            {\n+                if (Spell const* spell = victim->GetCurrentSpell(CURRENT_GENERIC_SPELL))\n+                {\n+                    if (IsInBotParty(spell->m_targets.GetUnitTargetGUID()) && spell->GetTimer() < 1000)\n+                        if (doCast(me, arcaneTorrent))\n+                            return;\n+                }\n+            }\n+            else if (GetManaPCT(me) < 25)\n+                if (doCast(me, arcaneTorrent))\n+                    return;\n+        }\n+    }\n+    //Racial 10) Draenei (Gift of The Naaru) - self only\n+    if (myrace == RACE_DRAENEI)\n+    {\n+        uint32 giftOfNaaru = RaceSpellForClass(myrace, _botclass);\n+        if (IsSpellReady(giftOfNaaru, diff, false) && (me->IsInCombat() || !me->getAttackers().empty()) &&\n+            GetHealthPCT(me) < 60 - 10*me->HasAuraType(SPELL_AURA_PERIODIC_HEAL) &&\n+            Rand() < 50 && !IsCasting())\n+        {\n+            if (doCast(me, giftOfNaaru))\n+                return;\n+        }\n+    }\n+}\n+//Force bots to start attack anyone who tries to DAMAGE me or master\n+//This means that anyone who attacks party will be attacked by whole bot party (see GetTarget())\n+void bot_ai::OnOwnerDamagedBy(Unit* attacker)\n+{\n+    if (HasBotCommandState(BOT_COMMAND_FULLSTOP | BOT_COMMAND_INACTION))\n+        return;\n+\n+    bool byspell = false;\n+    switch (_botclass)\n+    {\n+        case BOT_CLASS_DRUID:\n+            byspell = GetBotStance() == BOT_STANCE_NONE || GetBotStance() == DRUID_MOONKIN_FORM;\n+            break;\n+        case BOT_CLASS_PRIEST:\n+        case BOT_CLASS_MAGE:\n+        case BOT_CLASS_WARLOCK:\n+        case BOT_CLASS_SHAMAN:\n+        case BOT_CLASS_SPHYNX:\n+        case BOT_CLASS_ARCHMAGE:\n+            byspell = true;\n+            break;\n+        default:\n+            //BOT_LOG_ERROR(\"entities.player\", \"minion_ai: OnOwnerDamagedBy() - unknown bot class {}\", uint8(_botclass));\n+            break;\n+    }\n+\n+    if (!_canSwitchToTarget(me->GetVictim(), attacker, byspell))\n+        return;\n+\n+    SetBotCommandState(BOT_COMMAND_COMBATRESET); //reset AttackStart()\n+    me->Attack(attacker, !HasRole(BOT_ROLE_RANGED));\n+}\n+//force vehicle targeting and attack if vehicle is damaged\n+void bot_ai::OnOwnerVehicleDamagedBy(Unit* attacker)\n+{\n+    if (HasBotCommandState(BOT_COMMAND_FULLSTOP | BOT_COMMAND_INACTION))\n+        return;\n+\n+    Creature* veh = me->GetVehicleCreatureBase();\n+    if (!veh || (!veh->GetTarget().IsEmpty() && HasBotCommandState(BOT_COMMAND_ATTACK)) || !veh->IsValidAttackTarget(attacker))\n+        return;\n+\n+    veh->SetTarget(attacker->GetGUID());\n+    SetBotCommandState(BOT_COMMAND_ATTACK);\n+    me->GetVehicleBase()->Attack(attacker, false);\n+}\n+void bot_ai::OnAttackStop(Unit const* target)\n+{\n+    if (opponent == target)\n+        opponent = nullptr;\n+    if (disttarget == target)\n+        disttarget = nullptr;\n+}\n+//////////\n+///LOOT///\n+//////////\n+void bot_ai::SpawnKillReward(Player* looter) const\n+{\n+    if (!BotCfg::GetBotWandererKillRewardMoney() && !BotCfg::GetBotWandererKillRewardItemMaxCount())\n+        return;\n+\n+    if (!me->GetMap()->GetEntry()->IsContinent())\n+        return;\n+\n+    QuaternionData rotation = QuaternionData::fromEulerAnglesZYX(looter->GetOrientation(), 0.f, 0.f);\n+    GameObject* moneyBag = looter->SummonGameObject(GO_BOT_MONEY_BAG, *me, rotation, std::chrono::duration_cast<Seconds>(Milliseconds(REVIVE_TIMER_DEFAULT)));\n+    moneyBag->SetSpellId(GO_BOT_MONEY_BAG + me->GetEntry());\n+}\n+void bot_ai::FillKillReward(GameObject* go) const\n+{\n+    go->SetObjectScale(0.875f);\n+\n+    Loot& loot = go->loot;\n+\n+    loot.clear();\n+    loot.loot_type = LOOT_CORPSE;\n+\n+    uint32 basegold = BotCfg::GetBotWandererKillRewardMoney();\n+    uint32 maxitems = BotCfg::GetBotWandererKillRewardItemMaxCount();\n+    uint32 maxquality = BotCfg::GetBotWandererKillRewardItemMaxQuality();\n+\n+    if (!basegold && !maxitems)\n+        return;\n+\n+    if (basegold)\n+    {\n+        float lvl = float(std::min<uint8>(me->GetLevel(), DEFAULT_MAX_LEVEL));\n+        float gold = basegold;\n+        switch (me->GetLevel() / 10)\n+        {\n+            case 0: gold *= 0.100f; break;\n+            case 1: gold *= 0.125f; break;\n+            case 2: gold *= 0.175f; break;\n+            case 3: gold *= 0.225f; break;\n+            case 4: gold *= 0.300f; break;\n+            case 5: gold *= 0.400f; break;\n+            case 6: gold *= 0.550f; break;\n+            case 7: gold *= 0.750f; break;\n+            default:                break;\n+        }\n+        loot.gold = std::min<float>(std::max<float>(gold + _killsCount * gold * 0.04f - _deathsCount * gold * 0.4f, gold), gold * 10.0f) / float(DEFAULT_MAX_LEVEL) * lvl;\n+    }\n+\n+    if (maxitems)\n+    {\n+        std::vector<uint32> random_items;\n+        random_items.reserve(std::size(_equips));\n+        for (Item const* item : _equips)\n+        {\n+            if (item && item->GetTemplate()->Quality <= maxquality)\n+                random_items.push_back(item->GetEntry());\n+        }\n+        if (!random_items.empty())\n+        {\n+            Bcore::Containers::RandomResize(random_items, maxitems);\n+            for (uint32 itemd_id : random_items)\n+                loot.AddItem(LootStoreItem(itemd_id, 0, 100.0f, false, 0, 0, 1, 1));\n+        }\n+    }\n+}\n+uint32 bot_ai::_getLootQualityMask() const\n+{\n+    uint32 lootRoleMask = (_roleMask & BOT_ROLE_MASK_LOOTING);\n+    uint32 lootMask = 0;\n+\n+    if (lootRoleMask & BOT_ROLE_AUTOLOOT_POOR)\n+        lootMask |= (1u << ITEM_QUALITY_POOR);\n+    if (lootRoleMask & BOT_ROLE_AUTOLOOT_COMMON)\n+        lootMask |= (1u << ITEM_QUALITY_NORMAL);\n+    if (lootRoleMask & BOT_ROLE_AUTOLOOT_UNCOMMON)\n+        lootMask |= (1u << ITEM_QUALITY_UNCOMMON);\n+    if (lootRoleMask & BOT_ROLE_AUTOLOOT_RARE)\n+        lootMask |= (1u << ITEM_QUALITY_RARE);\n+    if (lootRoleMask & BOT_ROLE_AUTOLOOT_EPIC)\n+        lootMask |= (1u << ITEM_QUALITY_EPIC);\n+    if (lootRoleMask & BOT_ROLE_AUTOLOOT_LEGENDARY)\n+        lootMask |= (1u << ITEM_QUALITY_LEGENDARY);\n+\n+    return lootMask;\n+}\n+uint32 bot_ai::_getLootQualityThreshold() const\n+{\n+    uint32 lootThreshold;\n+    Group const* gr = master->GetGroup();\n+    if (!gr || gr->GetFirstMember()->next() == nullptr)\n+        lootThreshold = uint32(MAX_ITEM_QUALITY);\n+    else\n+    {\n+        switch (gr->GetLootMethod())\n+        {\n+            case GROUP_LOOT: case NEED_BEFORE_GREED: case MASTER_LOOT:\n+                lootThreshold = uint32(gr->GetLootThreshold()); break;\n+            default:\n+                lootThreshold = uint32(MAX_ITEM_QUALITY);       break;\n+        }\n+    }\n+\n+    return lootThreshold;\n+}\n+bool bot_ai::_canLootItemForPlayer(Player* player, Creature* creature, uint8 slot) const\n+{\n+    NotNormalLootItem* qitem = nullptr;\n+    NotNormalLootItem* ffaitem = nullptr;\n+    NotNormalLootItem* conditem = nullptr;\n+\n+    LootItem const* item = creature->loot.LootItemInSlot(slot, player, &qitem, &ffaitem, &conditem);\n+    if (!item || item->is_looted)\n+    {\n+        //BOT_LOG_ERROR(\"scripts\", \"can't loot item {}, no item\", slot);\n+        return false;\n+    }\n+\n+    if (!qitem && item->is_blocked)\n+    {\n+        //BOT_LOG_ERROR(\"scripts\", \"can't loot item {} ({}), blocked\", slot, item->itemid);\n+        return false;\n+    }\n+\n+    if (!item->rollWinnerGUID.IsEmpty() && item->rollWinnerGUID != player->GetGUID())\n+    {\n+        //BOT_LOG_ERROR(\"scripts\", \"can't loot item {} ({}), roll won\", slot, item->itemid);\n+        return false;\n+    }\n+\n+    ItemPosCountVec dest;\n+    if (player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, item->itemid, item->count) == EQUIP_ERR_OK)\n+        return true;\n+\n+    //BOT_LOG_ERROR(\"scripts\", \"can't loot item {} ({}), can't store\", slot, item->itemid);\n+    return false;\n+}\n+bool bot_ai::_canLootCreatureForPlayer(Player* player, Creature* creature, uint32 lootQualityMask, uint32 lootThreshold) const\n+{\n+    if (!player || master->GetMap() != player->FindMap()/* || !player->IsAlive() || !p->IsAtGroupRewardDistance(creature)*/)\n+        return false;\n+\n+    bool canLoot = false;\n+    uint8 slot = 0;\n+    for (LootItem const& loot_item : creature->loot.items)\n+    {\n+        ++slot;\n+\n+        if (loot_item.is_blocked || loot_item.is_looted)\n+        {\n+            //BOT_LOG_ERROR(\"scripts\", \"item {} is blocked\", i->itemid);\n+            continue;\n+        }\n+\n+        if (!loot_item.rollWinnerGUID.IsEmpty() && loot_item.rollWinnerGUID != player->GetGUID())\n+        {\n+            //BOT_LOG_ERROR(\"scripts\", \"can't loot item {} ({}), roll won\", slot, i->itemid);\n+            continue;\n+        }\n+\n+        ItemTemplate const* itemProto = sObjectMgr->GetItemTemplate(loot_item.itemid);\n+        if (!itemProto)\n+        {\n+            //BOT_LOG_ERROR(\"scripts\", \"no item proto for itemId {}\", i->itemid);\n+            return false;\n+        }\n+\n+        if (itemProto->Quality >= lootThreshold)\n+        {\n+            //BOT_LOG_ERROR(\"scripts\", \"item {} group quality threshold mismatch\", i->itemid);\n+            continue;\n+        }\n+\n+        if (!((1u << itemProto->Quality) & lootQualityMask))\n+        {\n+            //BOT_LOG_ERROR(\"scripts\", \"item {} lootQualityMask mismatch\", i->itemid);\n+            continue;\n+        }\n+\n+        if (_canLootItemForPlayer(player, creature, slot - 1) && loot_item.AllowedForPlayer(player))\n+        {\n+            canLoot = true;\n+            break;\n+        }\n+    }\n+    if (!canLoot)\n+    {\n+        NotNormalLootItemMap const& lootPlayerQuestItems = creature->loot.GetPlayerQuestItems();\n+        NotNormalLootItemMap::const_iterator q_itr = lootPlayerQuestItems.find(player->GetGUID());\n+        if (q_itr != lootPlayerQuestItems.end())\n+        {\n+            NotNormalLootItemList* q_list = q_itr->second;\n+            for (NotNormalLootItemList::const_iterator qi = q_list->begin(); qi != q_list->end(); ++qi)\n+            {\n+                LootItem* i = &creature->loot.quest_items[qi->index];\n+                if (i->is_looted || qi->is_looted)\n+                {\n+                    //BOT_LOG_ERROR(\"scripts\", \"item {} is looted\", i->itemid);\n+                    continue;\n+                }\n+\n+                if (!i->rollWinnerGUID.IsEmpty() && i->rollWinnerGUID != player->GetGUID())\n+                {\n+                    //BOT_LOG_ERROR(\"scripts\", \"can't loot item {} ({}), roll won\", slot, i->itemid);\n+                    continue;\n+                }\n+\n+                ItemTemplate const* itemProto = sObjectMgr->GetItemTemplate(i->itemid);\n+\n+                if (itemProto->Quality >= lootThreshold)\n+                {\n+                    //BOT_LOG_ERROR(\"scripts\", \"item {} group quality threshold mismatch\", i->itemid);\n+                    continue;\n+                }\n+\n+                if (!((1u << itemProto->Quality) & lootQualityMask))\n+                {\n+                    //BOT_LOG_ERROR(\"scripts\", \"item {} lootQualityMask mismatch\", i->itemid);\n+                    continue;\n+                }\n+\n+                uint8 qslot = uint8(creature->loot.items.size() + (qi - q_list->begin()));\n+\n+                if (_canLootItemForPlayer(player, creature, qslot) && i->AllowedForPlayer(player))\n+                {\n+                    canLoot = true;\n+                    break;\n+                }\n+            }\n+        }\n+    }\n+\n+    return canLoot;\n+}\n+bool bot_ai::_canLootCreature(Creature* creature) const\n+{\n+    if (creature->loot.gold)\n+        return true;\n+\n+    uint32 lootQualityMask = _getLootQualityMask();\n+    uint32 lootThreshold = _getLootQualityThreshold();\n+    //BOT_LOG_ERROR(\"scripts\", \"lootQualityMask {}, lootThreshold {}\", lootQualityMask, lootThreshold);\n+    bool canLootQuality = false;\n+\n+    //std::vector<LootItem> const& lootItems = loot->quest_items;\n+    for (LootItem const& qloot_item : creature->loot.quest_items)\n+    {\n+        ItemTemplate const* itemProto = sObjectMgr->GetItemTemplate(qloot_item.itemid);\n+        if (!itemProto)\n+        {\n+            //BOT_LOG_ERROR(\"scripts\", \"no item proto for itemId {}\", ci->itemid);\n+            return false;\n+        }\n+\n+        if (itemProto->Quality >= lootThreshold)\n+        {\n+            //BOT_LOG_ERROR(\"scripts\", \"item {} group quality threshold mismatch\", i->itemid);\n+            continue;\n+        }\n+\n+        if ((1u << itemProto->Quality) & lootQualityMask)\n+        {\n+            canLootQuality = true;\n+            break;\n+        }\n+    }\n+    if (!canLootQuality)\n+    {\n+        for (LootItem const& loot_item : creature->loot.items)\n+        {\n+            ItemTemplate const* itemProto = sObjectMgr->GetItemTemplate(loot_item.itemid);\n+            if (!itemProto)\n+            {\n+                //BOT_LOG_ERROR(\"scripts\", \"no item proto for itemId {}\", ci->itemid);\n+                return false;\n+            }\n+\n+            if (itemProto->Quality >= lootThreshold)\n+            {\n+                //BOT_LOG_ERROR(\"scripts\", \"item {} group quality threshold mismatch\", i->itemid);\n+                continue;\n+            }\n+\n+            if ((1u << itemProto->Quality) & lootQualityMask)\n+            {\n+                canLootQuality = true;\n+                break;\n+            }\n+        }\n+    }\n+\n+    if (!canLootQuality)\n+    {\n+        //BOT_LOG_ERROR(\"scripts\", \"can't loot by quality\");\n+        return false;\n+    }\n+\n+    bool canLootPlayers = false;\n+\n+    Group const* gr = master->GetGroup();\n+    if (!gr)\n+        canLootPlayers = _canLootCreatureForPlayer(master, creature, lootQualityMask, lootThreshold);\n+    else\n+    {\n+        for (GroupReference const* itr = gr->GetFirstMember(); itr != nullptr; itr = itr->next())\n+        {\n+            if (_canLootCreatureForPlayer(itr->GetSource(), creature, lootQualityMask, lootThreshold))\n+            {\n+                canLootPlayers = true;\n+                break;\n+            }\n+        }\n+    }\n+\n+    if (!canLootPlayers)\n+    {\n+        //BOT_LOG_ERROR(\"scripts\", \"can't loot by canLootPlayers\");\n+        return false;\n+    }\n+\n+    return true;\n+}\n+void bot_ai::_autoLootCreatureGold(Creature* creature) const\n+{\n+    Loot* loot = &creature->loot;\n+\n+    //sScriptMgr->OnBeforeLootMoney(master, loot);\n+    loot->NotifyMoneyRemoved();\n+    Group const* gr = master->GetGroup();\n+    if (!gr)\n+    {\n+        master->ModifyMoney(loot->gold);\n+        master->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LOOT_MONEY, loot->gold);\n+\n+        WorldPacket data(SMSG_LOOT_MONEY_NOTIFY, 4 + 1);\n+        data << uint32(loot->gold);\n+        data << uint8(1);   // \"You loot...\"\n+        master->GetSession()->SendPacket(&data);\n+    }\n+    else\n+    {\n+        std::vector<Player*> players;\n+        players.reserve(gr->GetMembersCount());\n+        for (GroupReference const* itr = gr->GetFirstMember(); itr != nullptr; itr = itr->next())\n+        {\n+            Player* p = itr->GetSource();\n+            if (p && p->IsAtGroupRewardDistance(creature))\n+                players.push_back(p);\n+        }\n+\n+        uint32 bots_count = 0;\n+        if (BotCfg::GetNpcBotMoneyShareEnabled())\n+        {\n+            for (GroupReference const* itr = gr->GetFirstMember(); itr != nullptr; itr = itr->next())\n+            {\n+                Player const* member = itr->GetSource();\n+                if (!member || !member->IsInMap(creature) || !member->HaveBot())\n+                    continue;\n+\n+                for (auto const& [guid, bot] : *member->GetBotMgr()->GetBotMap())\n+                {\n+                    if (bot && bot->IsAlive() && bot->IsInMap(creature) && (gr->IsMember(guid) || !BotCfg::GetNpcBotMoneyShareGroupOnly()) &&\n+                        (member->GetMap()->IsDungeon() || creature->GetDistance(bot) <= sWorld->getFloatConfig(CONFIG_GROUP_XP_DISTANCE)))\n+                        ++bots_count;\n+                }\n+            }\n+        }\n+\n+        uint32 sharers_count = uint32(players.size()) + bots_count;\n+        uint32 goldPerPlayer = uint32(loot->gold / sharers_count);\n+\n+        for (Player* player : players)\n+        {\n+            player->ModifyMoney(goldPerPlayer);\n+            player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LOOT_MONEY, goldPerPlayer);\n+\n+            WorldPacket data(SMSG_LOOT_MONEY_NOTIFY, 4 + 1);\n+            data << uint32(goldPerPlayer);\n+            data << uint8(sharers_count <= 1); // Controls the text displayed in chat. 0 is \"Your share is...\" and 1 is \"You loot...\"\n+            player->SendDirectMessage(&data);\n+        }\n+    }\n+\n+    loot->gold = 0;\n+\n+    if (loot->isLooted())\n+    {\n+        //BOT_LOG_ERROR(\"scripts\", \"creature gold is looted, releasing\");\n+        creature->AllLootRemovedFromCorpse();\n+        creature->RemoveDynamicFlag(UNIT_DYNFLAG_LOOTABLE);\n+        loot->clear();\n+    }\n+}\n+void bot_ai::_autoLootCreatureItems(Player* receiver, Creature* creature, uint32 lootQualityMask, uint32 lootThreshold) const\n+{\n+    uint8 slot = 0;\n+    for (LootItem const& loot_item : creature->loot.items)\n+    {\n+        ++slot;\n+\n+        if (loot_item.is_blocked || loot_item.is_looted)\n+        {\n+            //BOT_LOG_ERROR(\"scripts\", \"item {} is blocked\", loot_item.itemid);\n+            continue;\n+        }\n+\n+        if (!loot_item.rollWinnerGUID.IsEmpty() && loot_item.rollWinnerGUID != receiver->GetGUID())\n+        {\n+            //BOT_LOG_ERROR(\"scripts\", \"can't loot item {} ({}), roll won\", slot, loot_item.itemid);\n+            continue;\n+        }\n+\n+        ItemTemplate const* itemProto = sObjectMgr->GetItemTemplate(loot_item.itemid);\n+\n+        if (itemProto->Quality >= lootThreshold)\n+            continue;\n+        if (!((1u << itemProto->Quality) & lootQualityMask))\n+            continue;\n+\n+        if (_canLootItemForPlayer(receiver, creature, slot - 1) && loot_item.AllowedForPlayer(receiver))\n+        {\n+            //BOT_LOG_ERROR(\"scripts\", \"looting {} ({}), quality {}, threshold {}\",\n+            //    itemProto->Name1, itemProto->ItemId, itemProto->Quality, lootThreshold);\n+            receiver->StoreLootItem(slot - 1, &creature->loot);\n+        }\n+    }\n+\n+    NotNormalLootItemMap const& lootPlayerQuestItems = creature->loot.GetPlayerQuestItems();\n+    NotNormalLootItemMap::const_iterator q_itr = lootPlayerQuestItems.find(receiver->GetGUID());\n+    if (q_itr != lootPlayerQuestItems.end())\n+    {\n+        NotNormalLootItemList* q_list = q_itr->second;\n+        for (NotNormalLootItemList::const_iterator qi = q_list->begin(); qi != q_list->end(); ++qi)\n+        {\n+            LootItem const& i = creature->loot.quest_items[qi->index];\n+            if (i.is_looted || qi->is_looted)\n+            {\n+                //BOT_LOG_ERROR(\"scripts\", \"item {} is looted\", i->itemid);\n+                continue;\n+            }\n+\n+            if (!i.rollWinnerGUID.IsEmpty() && i.rollWinnerGUID != receiver->GetGUID())\n+            {\n+                //BOT_LOG_ERROR(\"scripts\", \"can't loot item {} ({}), roll won\", slot, i->itemid);\n+                continue;\n+            }\n+\n+            ItemTemplate const* itemProto = sObjectMgr->GetItemTemplate(i.itemid);\n+\n+            if (itemProto->Quality >= lootThreshold)\n+                continue;\n+            if (!((1u << itemProto->Quality) & lootQualityMask))\n+                continue;\n+\n+            //if (!receiver->HasQuestForItem(i->itemid))\n+            //    continue;\n+\n+            uint8 qslot = uint8(creature->loot.items.size() + (qi - q_list->begin()));\n+\n+            if (_canLootItemForPlayer(receiver, creature, qslot) && i.AllowedForPlayer(receiver))\n+                receiver->StoreLootItem(qslot, &creature->loot);\n+        }\n+    }\n+    if (creature->loot.isLooted())\n+    {\n+        //BOT_LOG_ERROR(\"scripts\", \"creature items is looted, releasing\");\n+        creature->AllLootRemovedFromCorpse();\n+        creature->RemoveDynamicFlag(UNIT_DYNFLAG_LOOTABLE);\n+        creature->loot.clear();\n+    }\n+}\n+void bot_ai::_autoLootCreature(Creature* creature)\n+{\n+    //money\n+    if (creature->loot.gold)\n+    {\n+        _autoLootCreatureGold(creature);\n+\n+        //nothing but gold was there\n+        if (creature->loot.empty())\n+            return;\n+    }\n+\n+    //items\n+    uint32 lootQualityMask = _getLootQualityMask();\n+    uint32 lootThreshold = _getLootQualityThreshold();\n+\n+    std::set<Player*> pLooters;\n+    Group* gr = master->GetGroup();\n+    if (!gr)\n+    {\n+        if (_canLootCreatureForPlayer(master, creature, lootQualityMask, lootThreshold))\n+            pLooters.insert(master);\n+    }\n+    else\n+    {\n+        for (GroupReference const* itr = gr->GetFirstMember(); itr != nullptr; itr = itr->next())\n+        {\n+            if (_canLootCreatureForPlayer(itr->GetSource(), creature, lootQualityMask, lootThreshold))\n+                pLooters.insert(itr->GetSource());\n+        }\n+    }\n+\n+    //creature->lootForBody = true;\n+\n+    if (gr && creature->loot.loot_type == LOOT_NONE)\n+    {\n+        switch (gr->GetLootMethod())\n+        {\n+            case GROUP_LOOT:        gr->GroupLoot(&creature->loot, creature);       break;\n+            case NEED_BEFORE_GREED: gr->NeedBeforeGreed(&creature->loot, creature); break;\n+            case MASTER_LOOT:       gr->MasterLoot(&creature->loot, creature);      break;\n+            default:                                                                break;\n+        }\n+    }\n+\n+    if (creature->loot.loot_type != LOOT_SKINNING)\n+        creature->loot.loot_type = LOOT_CORPSE;\n+\n+    Player* receiver = pLooters.size() == 1 ? *pLooters.begin() :\n+        !creature->loot.roundRobinPlayer.IsEmpty() ? ObjectAccessor::GetPlayer(*creature, creature->loot.roundRobinPlayer) : nullptr;\n+\n+    if (!receiver)\n+    {\n+        if (pLooters.empty())\n+            return;\n+\n+        ASSERT(pLooters.size() >= 2);\n+\n+        do\n+        {\n+            receiver = Bcore::Containers::SelectRandomContainerElement(pLooters);\n+        } while (receiver == _prevRRobin);\n+    }\n+\n+    _prevRRobin = receiver;\n+\n+    _autoLootCreatureItems(receiver, creature, lootQualityMask, lootThreshold);\n+}\n+//////////\n+//EQUIPS//\n+//////////\n+bool bot_ai::_canUseOffHand(ItemTemplate const* with/* = nullptr*/, bool ignore_mh/* = false*/) const\n+{\n+    //bm can on only equip in main hand\n+    if (_botclass == BOT_CLASS_BM)\n+        return false;\n+    //sphynx can grab anything\n+    if (_botclass == BOT_CLASS_SPHYNX)\n+        return true;\n+    //dreadlord / cryptlord can on only equip in main hand\n+    if (_botclass == BOT_CLASS_DREADLORD || _botclass == BOT_CLASS_CRYPT_LORD)\n+        return false;\n+    //staff-only classes\n+    if (_botclass == BOT_CLASS_ARCHMAGE || _botclass == BOT_CLASS_NECROMANCER)\n+        return false;\n+\n+    //warrior can wield any offhand with titan's grip\n+    if (_botclass == BOT_CLASS_WARRIOR && me->GetLevel() >= 60 && GetSpec() == BOT_SPEC_WARRIOR_FURY)\n+        return true;\n+\n+    if (ignore_mh)\n+        return true;\n+\n+    ItemTemplate const* protoMH = with ? with : _equips[BOT_SLOT_MAINHAND] ? _equips[BOT_SLOT_MAINHAND]->GetTemplate() : nullptr;\n+\n+    //no mainhand weapon OR\n+    //mainhand is an one-hand weapon\n+    if (!protoMH)\n+        return true;\n+\n+    if (protoMH->Class == ITEM_CLASS_WEAPON &&\n+        (protoMH->InventoryType == INVTYPE_WEAPON || protoMH->InventoryType == INVTYPE_WEAPONMAINHAND) &&\n+        (protoMH->SubClass == ITEM_SUBCLASS_WEAPON_AXE || protoMH->SubClass == ITEM_SUBCLASS_WEAPON_DAGGER ||\n+        protoMH->SubClass == ITEM_SUBCLASS_WEAPON_FIST_WEAPON || protoMH->SubClass == ITEM_SUBCLASS_WEAPON_MACE ||\n+        protoMH->SubClass == ITEM_SUBCLASS_WEAPON_SWORD))\n+        return true;\n+\n+    //NO\n+    return false;\n+}\n+\n+bool bot_ai::_canUseRanged() const\n+{\n+    return (_botclass == BOT_CLASS_HUNTER || _botclass == BOT_CLASS_ROGUE ||\n+        _botclass == BOT_CLASS_WARRIOR || _botclass == BOT_CLASS_PRIEST ||\n+        _botclass == BOT_CLASS_MAGE || _botclass == BOT_CLASS_WARLOCK ||\n+        _botclass == BOT_CLASS_DARK_RANGER || _botclass == BOT_CLASS_SEA_WITCH);\n+}\n+\n+bool bot_ai::_canUseRelic() const\n+{\n+    return (_botclass == BOT_CLASS_PALADIN || _botclass == BOT_CLASS_SHAMAN ||\n+        _botclass == BOT_CLASS_DRUID || _botclass == BOT_CLASS_DEATH_KNIGHT);\n+}\n+\n+bool bot_ai::_canCombineWeapons(ItemTemplate const* mh, ItemTemplate const* oh) const\n+{\n+    return _canEquip(mh, BOT_SLOT_MAINHAND, true, nullptr, true) && _canEquip(oh, BOT_SLOT_OFFHAND, true, nullptr, true) && _canUseOffHand(mh);\n+}\n+\n+bool bot_ai::_canEquip(ItemTemplate const* newProto, uint8 slot, bool ignoreItemLevel, Item const* newItem/* = nullptr*/, bool ignore_combine/* = false*/) const\n+{\n+    EquipmentInfo const* einfo = BotDataMgr::GetBotEquipmentInfo(me->GetEntry());\n+\n+    if (Item const* oldItem = _equips[slot])\n+    {\n+        ItemTemplate const* oldProto = oldItem->GetTemplate();\n+        //prevent reequipping same items\n+        if (newProto->ItemId == oldProto->ItemId && (!newItem || !newItem->GetItemRandomPropertyId()))\n+            return false;\n+        //prevent equipping worse items (only standard or not)\n+        if (!ignoreItemLevel)\n+            if (slot > BOT_SLOT_RANGED || einfo->ItemEntry[slot] != oldProto->ItemId)\n+                if (IAmFree() || !master->IsGameMaster())\n+                    if (_getItemGearStatScore(oldProto, slot, oldItem) > _getItemGearStatScore(newProto, slot, newItem))\n+                        return false;\n+    }\n+\n+    if (slot == BOT_SLOT_OFFHAND && !_canUseOffHand(nullptr, ignore_combine))\n+        return false;\n+\n+    //level requirements\n+    if (me->GetLevel() < newProto->RequiredLevel)\n+        return false;\n+\n+    //class requirements\n+    if (_botclass < BOT_CLASS_EX_START && !(newProto->AllowableClass & (1u<<(_botclass-1))))\n+        return false;\n+\n+    //skip race requirements\n+\n+    //inventory related conditions\n+    if (newProto->Class == ITEM_CLASS_WEAPON)\n+    {\n+        switch (slot)\n+        {\n+            case BOT_SLOT_MAINHAND:\n+                switch (_botclass)\n+                {\n+                    case BOT_CLASS_BM:\n+                        if (newProto->SubClass != ITEM_SUBCLASS_WEAPON_POLEARM &&\n+                            newProto->SubClass != ITEM_SUBCLASS_WEAPON_AXE2 &&\n+                            newProto->SubClass != ITEM_SUBCLASS_WEAPON_SWORD2)\n+                            return false;\n+                        break;\n+                    case BOT_CLASS_ARCHMAGE:\n+                    case BOT_CLASS_NECROMANCER:\n+                        if (newProto->SubClass != ITEM_SUBCLASS_WEAPON_STAFF)\n+                            return false;\n+                        break;\n+                    default:\n+                        break;\n+                }\n+                break;\n+            case BOT_SLOT_OFFHAND:\n+                if (newProto->SubClass == ITEM_SUBCLASS_WEAPON_POLEARM || newProto->SubClass == ITEM_SUBCLASS_WEAPON_STAFF)\n+                    return false;\n+                switch (_botclass)\n+                {\n+                    case BOT_CLASS_DEATH_KNIGHT:\n+                    case BOT_CLASS_ROGUE:\n+                        break;\n+                    case BOT_CLASS_WARRIOR:\n+                    case BOT_CLASS_HUNTER:\n+                        if (me->GetLevel() < 20)\n+                            return false;\n+                        break;\n+                    case BOT_CLASS_SHAMAN:\n+                        if (me->GetLevel() < 40 || _spec != BOT_SPEC_SHAMAN_ENHANCEMENT)\n+                            return false;\n+                        break;\n+                    case BOT_CLASS_SPHYNX:\n+                        break;\n+                    case BOT_CLASS_DARK_RANGER:\n+                        break;\n+                    case BOT_CLASS_SEA_WITCH:\n+                        break;\n+                    default:\n+                        return false;\n+                }\n+                break;\n+            case BOT_SLOT_RANGED:\n+                if (!_canUseRanged())\n+                    return false;\n+                break;\n+            default:\n+                return false;\n+        }\n+\n+        switch (newProto->InventoryType)\n+        {\n+            case INVTYPE_WEAPONMAINHAND:\n+                if (slot != BOT_SLOT_MAINHAND)\n+                    return false;\n+                break;\n+            case INVTYPE_WEAPONOFFHAND:\n+                if (slot != BOT_SLOT_OFFHAND)\n+                    return false;\n+                break;\n+            case INVTYPE_2HWEAPON:\n+                switch (_botclass)\n+                {\n+                    case BOT_CLASS_WARRIOR:\n+                        switch (slot)\n+                        {\n+                            case BOT_SLOT_OFFHAND:\n+                                if (me->GetLevel() < 60)\n+                                    return false;\n+                                break;\n+                            case BOT_SLOT_RANGED:\n+                                return false;\n+                            default:\n+                                break;\n+                        }\n+                        break;\n+                    case BOT_CLASS_SPHYNX:\n+                        break;\n+                    default:\n+                        if (slot != BOT_SLOT_MAINHAND)\n+                            return false;\n+                        break;\n+                }\n+                break;\n+            case INVTYPE_WEAPON:\n+                if (slot != BOT_SLOT_MAINHAND && slot != BOT_SLOT_OFFHAND)\n+                    return false;\n+                break;\n+            case INVTYPE_THROWN:\n+            case INVTYPE_RANGED:\n+                if (slot != BOT_SLOT_RANGED)\n+                    return false;\n+                break;\n+            case INVTYPE_RANGEDRIGHT:\n+                switch (_botclass)\n+                {\n+                    case BOT_CLASS_SPHYNX:\n+                        if (slot != BOT_SLOT_MAINHAND && slot != BOT_SLOT_OFFHAND)\n+                            return false;\n+                        break;\n+                    default:\n+                        if (slot != BOT_SLOT_RANGED)\n+                            return false;\n+                        break;\n+                }\n+                break;\n+            default:\n+                return false;\n+        }\n+\n+        switch (_botclass)\n+        {\n+            case BOT_CLASS_WARRIOR:\n+                switch (newProto->SubClass)\n+                {\n+                    case ITEM_SUBCLASS_WEAPON_AXE:\n+                    case ITEM_SUBCLASS_WEAPON_AXE2:\n+                    case ITEM_SUBCLASS_WEAPON_MACE:\n+                    case ITEM_SUBCLASS_WEAPON_MACE2:\n+                    case ITEM_SUBCLASS_WEAPON_SWORD:\n+                    case ITEM_SUBCLASS_WEAPON_SWORD2:\n+                    case ITEM_SUBCLASS_WEAPON_POLEARM:\n+                    case ITEM_SUBCLASS_WEAPON_STAFF:\n+                    case ITEM_SUBCLASS_WEAPON_FIST_WEAPON:\n+                    case ITEM_SUBCLASS_WEAPON_DAGGER:\n+                    case ITEM_SUBCLASS_WEAPON_BOW:\n+                    case ITEM_SUBCLASS_WEAPON_CROSSBOW:\n+                    case ITEM_SUBCLASS_WEAPON_GUN:\n+                    case ITEM_SUBCLASS_WEAPON_THROWN:\n+                    //case ITEM_SUBCLASS_WEAPON_WAND:\n+                        break;\n+                    default:\n+                        return false;\n+                }\n+                break;\n+            case BOT_CLASS_PALADIN:\n+            case BOT_CLASS_DEATH_KNIGHT:\n+                switch (newProto->SubClass)\n+                {\n+                    case ITEM_SUBCLASS_WEAPON_AXE:\n+                    case ITEM_SUBCLASS_WEAPON_AXE2:\n+                    case ITEM_SUBCLASS_WEAPON_MACE:\n+                    case ITEM_SUBCLASS_WEAPON_MACE2:\n+                    case ITEM_SUBCLASS_WEAPON_SWORD:\n+                    case ITEM_SUBCLASS_WEAPON_SWORD2:\n+                    case ITEM_SUBCLASS_WEAPON_POLEARM:\n+                        break;\n+                    default:\n+                        return false;\n+                }\n+                break;\n+            case BOT_CLASS_HUNTER:\n+                switch (newProto->SubClass)\n+                {\n+                    case ITEM_SUBCLASS_WEAPON_AXE:\n+                    case ITEM_SUBCLASS_WEAPON_AXE2:\n+                    //case ITEM_SUBCLASS_WEAPON_MACE:\n+                    //case ITEM_SUBCLASS_WEAPON_MACE2:\n+                    case ITEM_SUBCLASS_WEAPON_SWORD:\n+                    case ITEM_SUBCLASS_WEAPON_SWORD2:\n+                    case ITEM_SUBCLASS_WEAPON_POLEARM:\n+                    case ITEM_SUBCLASS_WEAPON_STAFF:\n+                    case ITEM_SUBCLASS_WEAPON_FIST_WEAPON:\n+                    case ITEM_SUBCLASS_WEAPON_DAGGER:\n+                    case ITEM_SUBCLASS_WEAPON_BOW:\n+                    case ITEM_SUBCLASS_WEAPON_CROSSBOW:\n+                    case ITEM_SUBCLASS_WEAPON_GUN:\n+                    //case ITEM_SUBCLASS_WEAPON_THROWN: //hunters can use thrown but bots can't, also pointless\n+                        break;\n+                    default:\n+                        return false;\n+                }\n+                break;\n+            case BOT_CLASS_ROGUE:\n+                switch (newProto->SubClass)\n+                {\n+                    case ITEM_SUBCLASS_WEAPON_AXE:\n+                    case ITEM_SUBCLASS_WEAPON_MACE:\n+                    case ITEM_SUBCLASS_WEAPON_SWORD:\n+                    case ITEM_SUBCLASS_WEAPON_FIST_WEAPON:\n+                    case ITEM_SUBCLASS_WEAPON_DAGGER:\n+                    case ITEM_SUBCLASS_WEAPON_BOW:\n+                    case ITEM_SUBCLASS_WEAPON_CROSSBOW:\n+                    case ITEM_SUBCLASS_WEAPON_GUN:\n+                    case ITEM_SUBCLASS_WEAPON_THROWN:\n+                        break;\n+                    default:\n+                        return false;\n+                }\n+                break;\n+            case BOT_CLASS_PRIEST:\n+                switch (newProto->SubClass)\n+                {\n+                    case ITEM_SUBCLASS_WEAPON_MACE:\n+                    case ITEM_SUBCLASS_WEAPON_STAFF:\n+                    case ITEM_SUBCLASS_WEAPON_DAGGER:\n+                    case ITEM_SUBCLASS_WEAPON_WAND:\n+                        break;\n+                    default:\n+                        return false;\n+                }\n+                break;\n+            case BOT_CLASS_MAGE:\n+            case BOT_CLASS_WARLOCK:\n+                switch (newProto->SubClass)\n+                {\n+                    case ITEM_SUBCLASS_WEAPON_SWORD:\n+                    case ITEM_SUBCLASS_WEAPON_STAFF:\n+                    case ITEM_SUBCLASS_WEAPON_DAGGER:\n+                    case ITEM_SUBCLASS_WEAPON_WAND:\n+                        break;\n+                    default:\n+                        return false;\n+                }\n+                break;\n+            case BOT_CLASS_DRUID:\n+                switch (newProto->SubClass)\n+                {\n+                    case ITEM_SUBCLASS_WEAPON_MACE:\n+                    case ITEM_SUBCLASS_WEAPON_MACE2:\n+                    case ITEM_SUBCLASS_WEAPON_POLEARM:\n+                    case ITEM_SUBCLASS_WEAPON_STAFF:\n+                    case ITEM_SUBCLASS_WEAPON_FIST_WEAPON:\n+                    case ITEM_SUBCLASS_WEAPON_DAGGER:\n+                        break;\n+                    default:\n+                        return false;\n+                }\n+                break;\n+            case BOT_CLASS_SHAMAN:\n+                switch (newProto->SubClass)\n+                {\n+                    case ITEM_SUBCLASS_WEAPON_AXE:\n+                    case ITEM_SUBCLASS_WEAPON_AXE2:\n+                    case ITEM_SUBCLASS_WEAPON_MACE:\n+                    case ITEM_SUBCLASS_WEAPON_MACE2:\n+                    case ITEM_SUBCLASS_WEAPON_STAFF:\n+                    case ITEM_SUBCLASS_WEAPON_FIST_WEAPON:\n+                    case ITEM_SUBCLASS_WEAPON_DAGGER:\n+                        break;\n+                    default:\n+                        return false;\n+                }\n+                break;\n+            case BOT_CLASS_BM:\n+                switch (newProto->SubClass)\n+                {\n+                    case ITEM_SUBCLASS_WEAPON_AXE2:\n+                    case ITEM_SUBCLASS_WEAPON_SWORD2:\n+                    case ITEM_SUBCLASS_WEAPON_POLEARM:\n+                        break;\n+                    default:\n+                        return false;\n+                }\n+                break;\n+            case BOT_CLASS_SPHYNX:\n+                switch (newProto->SubClass)\n+                {\n+                    case ITEM_SUBCLASS_WEAPON_WAND:\n+                        break;\n+                    default:\n+                        return false;\n+                }\n+                break;\n+            case BOT_CLASS_ARCHMAGE:\n+            case BOT_CLASS_NECROMANCER:\n+                switch (newProto->SubClass)\n+                {\n+                    case ITEM_SUBCLASS_WEAPON_STAFF:\n+                        break;\n+                    default:\n+                        return false;\n+                }\n+                break;\n+            case BOT_CLASS_DREADLORD:\n+            case BOT_CLASS_CRYPT_LORD:\n+                switch (newProto->SubClass)\n+                {\n+                    case ITEM_SUBCLASS_WEAPON_AXE:\n+                    case ITEM_SUBCLASS_WEAPON_AXE2:\n+                    case ITEM_SUBCLASS_WEAPON_MACE:\n+                    case ITEM_SUBCLASS_WEAPON_MACE2:\n+                    case ITEM_SUBCLASS_WEAPON_SWORD:\n+                    case ITEM_SUBCLASS_WEAPON_SWORD2:\n+                    case ITEM_SUBCLASS_WEAPON_POLEARM:\n+                    case ITEM_SUBCLASS_WEAPON_STAFF:\n+                    case ITEM_SUBCLASS_WEAPON_FIST_WEAPON:\n+                    case ITEM_SUBCLASS_WEAPON_DAGGER:\n+                        break;\n+                    default:\n+                        return false;\n+                }\n+                break;\n+            case BOT_CLASS_SPELLBREAKER:\n+                switch (newProto->SubClass)\n+                {\n+                    case ITEM_SUBCLASS_WEAPON_AXE:\n+                    case ITEM_SUBCLASS_WEAPON_MACE:\n+                    case ITEM_SUBCLASS_WEAPON_SWORD:\n+                    case ITEM_SUBCLASS_WEAPON_FIST_WEAPON:\n+                    case ITEM_SUBCLASS_WEAPON_DAGGER:\n+                        break;\n+                    default:\n+                        return false;\n+                }\n+                break;\n+            case BOT_CLASS_DARK_RANGER:\n+                switch (newProto->SubClass)\n+                {\n+                    case ITEM_SUBCLASS_WEAPON_SWORD:\n+                    case ITEM_SUBCLASS_WEAPON_DAGGER:\n+                    case ITEM_SUBCLASS_WEAPON_BOW:\n+                        break;\n+                    default:\n+                        return false;\n+                }\n+                break;\n+            case BOT_CLASS_SEA_WITCH:\n+                switch (newProto->SubClass)\n+                {\n+                    case ITEM_SUBCLASS_WEAPON_DAGGER:\n+                    case ITEM_SUBCLASS_WEAPON_BOW:\n+                        break;\n+                    default:\n+                        return false;\n+                }\n+                break;\n+            default:\n+                return false;\n+        }\n+\n+        return true;\n+    }\n+    else if (newProto->Class == ITEM_CLASS_ARMOR/* || newProto->Class == ITEM_CLASS_QUEST*/)\n+    {\n+        switch (newProto->InventoryType)\n+        {\n+            case INVTYPE_HEAD:\n+                if (slot != BOT_SLOT_HEAD)\n+                    return false;\n+                break;\n+            case INVTYPE_SHOULDERS:\n+                if (slot != BOT_SLOT_SHOULDERS)\n+                    return false;\n+                break;\n+            case INVTYPE_BODY:\n+                if (slot != BOT_SLOT_BODY)\n+                    return false;\n+                switch (_botclass)\n+                {\n+                    case BOT_CLASS_SPHYNX:\n+                        return false;\n+                    default:\n+                        break;\n+                }\n+                break;\n+            case INVTYPE_CHEST:\n+            case INVTYPE_ROBE:\n+                if (slot != BOT_SLOT_CHEST)\n+                    return false;\n+                break;\n+            case INVTYPE_WAIST:\n+                if (slot != BOT_SLOT_WAIST)\n+                    return false;\n+                break;\n+            case INVTYPE_LEGS:\n+                if (slot != BOT_SLOT_LEGS)\n+                    return false;\n+                break;\n+            case INVTYPE_FEET:\n+                if (slot != BOT_SLOT_FEET)\n+                    return false;\n+                break;\n+            case INVTYPE_WRISTS:\n+                if (slot != BOT_SLOT_WRIST)\n+                    return false;\n+                break;\n+            case INVTYPE_HANDS:\n+                if (slot != BOT_SLOT_HANDS)\n+                    return false;\n+                break;\n+            case INVTYPE_FINGER:\n+                if (slot != BOT_SLOT_FINGER1 && slot != BOT_SLOT_FINGER2)\n+                    return false;\n+                switch (_botclass)\n+                {\n+                    case BOT_CLASS_SPHYNX:\n+                        return false;\n+                    default:\n+                        break;\n+                }\n+                break;\n+            case INVTYPE_TRINKET:\n+                if (slot != BOT_SLOT_TRINKET1 && slot != BOT_SLOT_TRINKET2)\n+                    return false;\n+                switch (_botclass)\n+                {\n+                    case BOT_CLASS_SPHYNX:\n+                        return false;\n+                    default:\n+                        break;\n+                }\n+                break;\n+            case INVTYPE_NECK:\n+                if (slot != BOT_SLOT_NECK)\n+                    return false;\n+                switch (_botclass)\n+                {\n+                    case BOT_CLASS_SPHYNX:\n+                        return false;\n+                    default:\n+                        break;\n+                }\n+                break;\n+            case INVTYPE_CLOAK:\n+                if (slot != BOT_SLOT_BACK)\n+                    return false;\n+                switch (_botclass)\n+                {\n+                    case BOT_CLASS_SPHYNX:\n+                        return false;\n+                    default:\n+                        break;\n+                }\n+                break;\n+            case INVTYPE_HOLDABLE:\n+            case INVTYPE_SHIELD:\n+                if (slot != BOT_SLOT_OFFHAND)\n+                    return false;\n+                switch (_botclass)\n+                {\n+                    case BOT_CLASS_SPHYNX:\n+                        return false;\n+                    default:\n+                        break;\n+                }\n+                break;\n+            case INVTYPE_RELIC:\n+                if (slot != BOT_SLOT_RANGED)\n+                    return false;\n+                break;\n+            default:\n+                return false;\n+        }\n+\n+        switch (newProto->SubClass)\n+        {\n+            case ITEM_SUBCLASS_ARMOR_SHIELD:\n+                if (slot != BOT_SLOT_OFFHAND)\n+                    return false;\n+                switch (_botclass)\n+                {\n+                    case BOT_CLASS_SPELLBREAKER:\n+                        break;\n+                    case BOT_CLASS_WARRIOR:\n+                    case BOT_CLASS_PALADIN:\n+                    case BOT_CLASS_SHAMAN:\n+                        break;\n+                    default:\n+                        return false;\n+                }\n+                break;\n+            case ITEM_SUBCLASS_ARMOR_PLATE:\n+                switch (_botclass)\n+                {\n+                    case BOT_CLASS_BM:\n+                    case BOT_CLASS_SPHYNX:\n+                    case BOT_CLASS_DREADLORD:\n+                    case BOT_CLASS_SPELLBREAKER:\n+                    case BOT_CLASS_CRYPT_LORD:\n+                        break;\n+                    case BOT_CLASS_WARRIOR:\n+                    case BOT_CLASS_PALADIN:\n+                    case BOT_CLASS_DEATH_KNIGHT:\n+                        if (me->GetLevel() >= 40 || newProto->Quality == ITEM_QUALITY_HEIRLOOM)\n+                            break;\n+                        return false;\n+                    default:\n+                        return false;\n+                }\n+                break;\n+            case ITEM_SUBCLASS_ARMOR_MAIL:\n+                switch (_botclass)\n+                {\n+                    case BOT_CLASS_BM:\n+                    case BOT_CLASS_SPHYNX:\n+                    case BOT_CLASS_SPELLBREAKER:\n+                    case BOT_CLASS_CRYPT_LORD:\n+                        break;\n+                    case BOT_CLASS_WARRIOR:\n+                    case BOT_CLASS_PALADIN:\n+                    case BOT_CLASS_DEATH_KNIGHT:\n+                        break;\n+                    case BOT_CLASS_SHAMAN:\n+                    case BOT_CLASS_HUNTER:\n+                        if (me->GetLevel() >= 40 || newProto->Quality == ITEM_QUALITY_HEIRLOOM)\n+                            break;\n+                        return false;\n+                    default:\n+                        return false;\n+                }\n+                break;\n+            case ITEM_SUBCLASS_ARMOR_LEATHER:\n+                switch (_botclass)\n+                {\n+                    case BOT_CLASS_DARK_RANGER:\n+                        break;\n+                    case BOT_CLASS_WARRIOR:\n+                    case BOT_CLASS_PALADIN:\n+                    case BOT_CLASS_DEATH_KNIGHT:\n+                    case BOT_CLASS_BM:\n+                    case BOT_CLASS_SHAMAN:\n+                    case BOT_CLASS_HUNTER:\n+                    case BOT_CLASS_ROGUE:\n+                    case BOT_CLASS_DRUID:\n+                        break;\n+                    default:\n+                        return false;\n+                }\n+                break;\n+            case ITEM_SUBCLASS_ARMOR_CLOTH:\n+                switch (_botclass)\n+                {\n+                    case BOT_CLASS_SPHYNX:\n+                        return false;\n+                    case BOT_CLASS_DREADLORD:\n+                    case BOT_CLASS_SPELLBREAKER:\n+                    case BOT_CLASS_CRYPT_LORD:\n+                        if (newProto->InventoryType != INVTYPE_CLOAK)\n+                            return false;\n+                        break;\n+                    default:\n+                        break;\n+                }\n+                break;\n+            case ITEM_SUBCLASS_ARMOR_MISCELLANEOUS:\n+                switch (_botclass)\n+                {\n+                    case BOT_CLASS_SPHYNX:\n+                        return false;\n+                    default:\n+                        break;\n+                }\n+                break;\n+            case ITEM_SUBCLASS_ARMOR_LIBRAM:\n+                switch (_botclass)\n+                {\n+                    case BOT_CLASS_PALADIN:\n+                        break;\n+                    default:\n+                        return false;\n+                }\n+                break;\n+            case ITEM_SUBCLASS_ARMOR_IDOL:\n+                switch (_botclass)\n+                {\n+                    case BOT_CLASS_DRUID:\n+                        break;\n+                    default:\n+                        return false;\n+                }\n+                break;\n+            case ITEM_SUBCLASS_ARMOR_TOTEM:\n+                switch (_botclass)\n+                {\n+                    case BOT_CLASS_SHAMAN:\n+                        break;\n+                    default:\n+                        return false;\n+                }\n+                break;\n+            case ITEM_SUBCLASS_ARMOR_SIGIL:\n+                switch (_botclass)\n+                {\n+                    case BOT_CLASS_DEATH_KNIGHT:\n+                        break;\n+                    default:\n+                        return false;\n+                }\n+                break;\n+            default:\n+                return false;\n+        }\n+\n+        return true;\n+    }\n+\n+    return false;\n+}\n+\n+bool bot_ai::_isItemFitForWanderingBot(uint8 slot, ItemTemplate const* proto) const\n+{\n+    if (!_canEquip(proto, slot, true))\n+        return false;\n+\n+    auto item_stat_check = [](_ItemStat const& stat, uint32 wanted_stat) { return stat.ItemStatType == wanted_stat && stat.ItemStatValue > 0; };\n+    auto item_has_stat = [&item_stat_check](ItemTemplate const* itemProto, uint32 wanted_stat) {\n+        return std::ranges::any_of(itemProto->ItemStat, [=, &item_stat_check](_ItemStat const& stat) { return item_stat_check(stat, wanted_stat); });\n+    };\n+\n+    if (me->GetLevel() >= DEFAULT_MAX_LEVEL && me->GetMap()->IsBattlegroundOrArena() && Rand() < 50)\n+    {\n+        if (Rand() < 20 && proto->ItemLevel < 245)\n+            return false;\n+        if (Rand() < 10 && proto->ItemLevel < 264)\n+            return false;\n+\n+        switch (slot)\n+        {\n+            case BOT_SLOT_HEAD:\n+            case BOT_SLOT_SHOULDERS:\n+            case BOT_SLOT_CHEST:\n+            case BOT_SLOT_WAIST:\n+            case BOT_SLOT_LEGS:\n+            case BOT_SLOT_FEET:\n+            case BOT_SLOT_WRIST:\n+            case BOT_SLOT_HANDS:\n+                if (!item_has_stat(proto, ITEM_MOD_RESILIENCE_RATING))\n+                    return false;\n+                break;\n+            default:\n+                break;\n+        }\n+    }\n+\n+    switch (GetSpec())\n+    {\n+        case BOT_SPEC_WARRIOR_ARMS:\n+            switch (slot)\n+            {\n+                case BOT_SLOT_MAINHAND:\n+                    return proto->InventoryType == INVTYPE_2HWEAPON;\n+                default:\n+                    break;\n+            }\n+            break;\n+        case BOT_SPEC_WARRIOR_FURY:\n+            switch (slot)\n+            {\n+                case BOT_SLOT_MAINHAND:\n+                    return (me->GetLevel() < 60) ? (proto->InventoryType == INVTYPE_WEAPON || proto->InventoryType == INVTYPE_WEAPONMAINHAND) :\n+                        (proto->InventoryType == INVTYPE_2HWEAPON);\n+                case BOT_SLOT_OFFHAND:\n+                    return (me->GetLevel() < 60) ? (proto->InventoryType == INVTYPE_WEAPON || proto->InventoryType == INVTYPE_WEAPONOFFHAND) :\n+                        (proto->InventoryType == INVTYPE_2HWEAPON);\n+                default:\n+                    break;\n+            }\n+            break;\n+        case BOT_SPEC_WARRIOR_PROTECTION:\n+            switch (slot)\n+            {\n+                case BOT_SLOT_MAINHAND:\n+                    return proto->InventoryType == INVTYPE_WEAPON || proto->InventoryType == INVTYPE_WEAPONMAINHAND;\n+                case BOT_SLOT_OFFHAND:\n+                    return proto->InventoryType == INVTYPE_SHIELD;\n+                default:\n+                    break;\n+            }\n+            break;\n+        case BOT_SPEC_PALADIN_PROTECTION:\n+            switch (slot)\n+            {\n+                case BOT_SLOT_MAINHAND:\n+                    if (!(proto->InventoryType == INVTYPE_WEAPON || proto->InventoryType == INVTYPE_WEAPONMAINHAND))\n+                        return false;\n+                    if (me->GetLevel() < 70)\n+                        break;\n+                    return !item_has_stat(proto, ITEM_MOD_INTELLECT);\n+                case BOT_SLOT_OFFHAND:\n+                    if (!(proto->InventoryType == INVTYPE_SHIELD))\n+                        return false;\n+                    if (me->GetLevel() < 70)\n+                        break;\n+                    return !item_has_stat(proto, ITEM_MOD_INTELLECT);\n+                default:\n+                    break;\n+            }\n+            break;\n+        case BOT_SPEC_PALADIN_HOLY:\n+        case BOT_SPEC_SHAMAN_ELEMENTAL:\n+        case BOT_SPEC_SHAMAN_RESTORATION:\n+            switch (slot)\n+            {\n+                case BOT_SLOT_MAINHAND:\n+                    if (!(proto->InventoryType == INVTYPE_WEAPON || proto->InventoryType == INVTYPE_WEAPONMAINHAND))\n+                        return false;\n+                    if (me->GetLevel() < 70)\n+                        break;\n+                    return item_has_stat(proto, ITEM_MOD_INTELLECT);\n+                case BOT_SLOT_OFFHAND:\n+                    if (!(proto->InventoryType == INVTYPE_SHIELD))\n+                        return false;\n+                    if (me->GetLevel() < 70)\n+                        break;\n+                    return item_has_stat(proto, ITEM_MOD_INTELLECT);\n+                default:\n+                    if (me->GetLevel() < 70)\n+                        break;\n+                    return item_has_stat(proto, ITEM_MOD_INTELLECT);\n+            }\n+            break;\n+        case BOT_SPEC_PALADIN_RETRIBUTION:\n+            switch (slot)\n+            {\n+                case BOT_SLOT_MAINHAND:\n+                    return proto->InventoryType == INVTYPE_2HWEAPON;\n+                default:\n+                    break;\n+            }\n+            break;\n+        case BOT_SPEC_HUNTER_BEASTMASTERY:\n+        case BOT_SPEC_HUNTER_MARKSMANSHIP:\n+        case BOT_SPEC_HUNTER_SURVIVAL:\n+            switch (slot)\n+            {\n+                case BOT_SLOT_TRINKET1: case BOT_SLOT_TRINKET2:\n+                    break;\n+                default:\n+                    if (me->GetLevel() < 70)\n+                        break;\n+                    return item_has_stat(proto, ITEM_MOD_AGILITY);\n+                    break;\n+            }\n+            break;\n+        case BOT_SPEC_ROGUE_ASSASINATION:\n+            switch (slot)\n+            {\n+                case BOT_SLOT_MAINHAND: case BOT_SLOT_OFFHAND:\n+                    return proto->SubClass == ITEM_SUBCLASS_WEAPON_DAGGER;\n+                case BOT_SLOT_RANGED:\n+                    return me->GetLevel() < 64 || proto->SubClass == ITEM_SUBCLASS_WEAPON_THROWN;\n+                default:\n+                    break;\n+            }\n+            break;\n+        case BOT_SPEC_ROGUE_COMBAT:\n+            switch (slot)\n+            {\n+                case BOT_SLOT_MAINHAND: case BOT_SLOT_OFFHAND:\n+                    return proto->SubClass == ITEM_SUBCLASS_WEAPON_SWORD || proto->SubClass == ITEM_SUBCLASS_WEAPON_AXE;\n+                case BOT_SLOT_RANGED:\n+                    return me->GetLevel() < 64 || proto->SubClass == ITEM_SUBCLASS_WEAPON_THROWN;\n+                default:\n+                    break;\n+            }\n+            break;\n+        case BOT_SPEC_ROGUE_SUBTLETY:\n+            switch (slot)\n+            {\n+                case BOT_SLOT_MAINHAND: case BOT_SLOT_OFFHAND:\n+                    return proto->SubClass == ITEM_SUBCLASS_WEAPON_MACE;\n+                case BOT_SLOT_RANGED:\n+                    return me->GetLevel() < 64 || proto->SubClass == ITEM_SUBCLASS_WEAPON_THROWN;\n+                default:\n+                    break;\n+            }\n+            break;\n+        case BOT_SPEC_DK_FROST:\n+            switch (slot)\n+            {\n+                case BOT_SLOT_MAINHAND:\n+                    return me->GetLevel() < 61 || proto->InventoryType == INVTYPE_2HWEAPON;\n+                default:\n+                    break;\n+            }\n+            break;\n+        case BOT_SPEC_SHAMAN_ENHANCEMENT:\n+            switch (slot)\n+            {\n+                case BOT_SLOT_OFFHAND:\n+                    return proto->InventoryType == INVTYPE_WEAPON || proto->InventoryType == INVTYPE_WEAPONOFFHAND;\n+                case BOT_SLOT_TRINKET1: case BOT_SLOT_TRINKET2:\n+                    break;\n+                default:\n+                    if (me->GetLevel() < 70)\n+                        break;\n+                    return item_has_stat(proto, ITEM_MOD_AGILITY);\n+            }\n+            break;\n+        case BOT_SPEC_DRUID_FERAL:\n+            switch (slot)\n+            {\n+                case BOT_SLOT_TRINKET1: case BOT_SLOT_TRINKET2:\n+                    break;\n+                case BOT_SLOT_MAINHAND:\n+                    if (proto->InventoryType != INVTYPE_2HWEAPON)\n+                        return false;\n+                [[fallthrough]];\n+                default:\n+                    if (me->GetLevel() < 70)\n+                        break;\n+                    return item_has_stat(proto, ITEM_MOD_AGILITY);\n+            }\n+            break;\n+        case BOT_SPEC_DRUID_BALANCE:\n+            switch (slot)\n+            {\n+                case BOT_SLOT_TRINKET1: case BOT_SLOT_TRINKET2:\n+                    break;\n+                default:\n+                    if (me->GetLevel() < 70)\n+                        break;\n+                    return item_has_stat(proto, ITEM_MOD_INTELLECT);\n+            }\n+            break;\n+        default:\n+            break;\n+    }\n+\n+    return true;\n+}\n+\n+\n+void bot_ai::_removeEquipment(uint8 slot)\n+{\n+    Item* item = _equips[slot];\n+    if (!item)\n+        return; //already unequipped\n+\n+    _usableItemSlotsMask &= ~(1ul << slot);\n+\n+    RemoveItemBonuses(slot);\n+    ApplyItemSetBonuses(item, false);\n+\n+    if (slot == BOT_SLOT_OFFHAND)\n+    {\n+        if (me->CanDualWield())\n+            me->SetCanDualWield(false);\n+        if (!(me->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_NO_BLOCK))\n+            const_cast<CreatureTemplate*>(me->GetCreatureTemplate())->flags_extra |= CREATURE_FLAG_EXTRA_NO_BLOCK;\n+    }\n+\n+    _equips[slot] = nullptr;\n+}\n+\n+BotEquipResult bot_ai::_unequip(uint8 slot, ObjectGuid receiver, bool store_to_bank, bool on_equip_from_bank/* = false*/)\n+{\n+    EquipmentInfo const* einfo = BotDataMgr::GetBotEquipmentInfo(me->GetEntry());\n+\n+    Item* item = _equips[slot];\n+    if (!item)\n+        return BotEquipResult::BOT_EQUIP_RESULT_OK; //already unequipped\n+\n+    if (store_to_bank)\n+    {\n+        if (!receiver || IAmFree())\n+            return BotEquipResult::BOT_EQUIP_RESULT_FAIL_NO_RECEIVER;\n+        if (receiver != master->GetGUID())\n+            return BotEquipResult::BOT_EQUIP_RESULT_FAIL_INVALID_RECEIVER;\n+        if (!BotDataMgr::CanDepositBotBankItemsCount(receiver, on_equip_from_bank ? 0 : 1))\n+            return BotEquipResult::BOT_EQUIP_RESULT_FAIL_NO_BANK_SPACE;\n+    }\n+\n+    uint32 itemId = item->GetEntry();\n+\n+    BotLogger::Log(NPCBOT_LOG_UNEQUIP, me, uint32(slot), uint32(item->GetGUID().GetCounter()), uint32(itemId), uint32(receiver.GetCounter()));\n+\n+    // !! All errors must be returned BEFORE we remove equipment, we have to store dangling item somewhere and only return BOT_EQUIP_RESULT_OK !!\n+\n+    _removeEquipment(slot);\n+\n+    //hand old weapon to master\n+    if (!receiver.IsEmpty() && (slot > BOT_SLOT_RANGED || einfo->ItemEntry[slot] != itemId))\n+    {\n+        if (receiver == master->GetGUID())\n+        {\n+            ItemPosCountVec dest;\n+            uint32 no_space = 0;\n+\n+            if (store_to_bank)\n+            {\n+                BotDataMgr::DepositBotBankItem(receiver, item);\n+            }\n+            else if (master->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, itemId, 1, &no_space) != EQUIP_ERR_OK)\n+            {\n+                std::ostringstream istr;\n+                _AddItemLink(master, item, istr, false);\n+                ChatHandler ch(master->GetSession());\n+                ch.PSendSysMessage(LocalizedNpcText(master, BOT_TEXT_CANT_UNEQUIP_MAILING).c_str(), istr.view().data());\n+\n+                item->SetOwnerGUID(master->GetGUID());\n+\n+                CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();\n+                item->FSetState(ITEM_CHANGED);\n+                item->SaveToDB(trans);\n+                MailDraft(istr.str(), \"\").AddItem(item).SendMailTo(trans, MailReceiver(master), MailSender(me));\n+                CharacterDatabase.CommitTransaction(trans);\n+            }\n+            else\n+            {\n+                Item* pItem = master->StoreItem(dest, item, true);\n+                master->SendNewItem(pItem, 1, true, false, false);\n+            }\n+        }\n+        else\n+        {\n+            item->SetOwnerGUID(receiver);\n+\n+            CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();\n+            item->FSetState(ITEM_CHANGED);\n+            item->SaveToDB(trans);\n+            const std::string& subject = LocalizedNpcText(nullptr, BOT_TEXT_OWNERSHIP_EXPIRED);\n+            MailDraft(subject, \"\").AddItem(item).SendMailTo(trans, MailReceiver(receiver.GetCounter()), MailSender(me));\n+            CharacterDatabase.CommitTransaction(trans);\n+        }\n+    }\n+    else\n+    {\n+        //slot < BOT_SLOT_RANGED && einfo->ItemEntry[slot] == itemId\n+        //we have our standard weapon which we should get rid of\n+        //item->SetState(ITEM_REMOVED, master); //delete Item object\n+        delete item; //!Invalidated!\n+        //item = nullptr; //already in \"_updateEquips(slot, nullptr);\"\n+    }\n+\n+    if (slot <= BOT_SLOT_RANGED && CanChangeEquip(slot)) //weapons\n+    {\n+        me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + slot, 0);\n+        me->SetAttackTime(WeaponAttackType(slot), BASE_ATTACK_TIME); //without weapon\n+    }\n+\n+    _updateEquips(slot, nullptr);\n+\n+    return BotEquipResult::BOT_EQUIP_RESULT_OK;\n+}\n+\n+BotEquipResult bot_ai::_equip(uint8 slot, Item* newItem, ObjectGuid receiver, bool store_to_bank, bool from_bank/* = false*/)\n+{\n+    ASSERT(newItem);\n+\n+    EquipmentInfo const* einfo = BotDataMgr::GetBotEquipmentInfo(me->GetEntry());\n+    ItemTemplate const* proto = newItem->GetTemplate();\n+\n+    if (newItem->GetState() == ITEM_REMOVED)\n+    {\n+        BOT_LOG_ERROR(\"entities.player\",\n+            \"minion_ai::_equip(): player {} ({}) is trying to make bot {} (id: {}) equip item: {} (id: {}, {}) which has state ITEM_REMOVED!\",\n+            master->GetName(), master->GetGUID().ToString(), me->GetName(), me->GetEntry(), proto->Name1, proto->ItemId, newItem->GetGUID().ToString());\n+        return BotEquipResult::BOT_EQUIP_RESULT_FAIL_NO_ITEM;\n+    }\n+\n+    uint32 newItemId = newItem->GetEntry();\n+\n+    if (Item const* oldItem = _equips[slot])\n+    {\n+        //same id\n+        if (oldItem->GetEntry() == newItemId && !newItem->GetItemRandomPropertyId())\n+            return BotEquipResult::BOT_EQUIP_RESULT_FAIL_SAME_ID;\n+    }\n+\n+    BotEquipResult unequip_result = _unequip(slot, receiver, store_to_bank, from_bank);\n+    if (unequip_result != BotEquipResult::BOT_EQUIP_RESULT_OK)\n+        return unequip_result;\n+\n+    ObjectGuid itemGuid = newItem->GetGUID();\n+\n+    BotLogger::Log(NPCBOT_LOG_EQUIP, me, uint32(slot), uint32(itemGuid.GetCounter()), uint32(newItemId), uint32(receiver.GetCounter()));\n+\n+    if (!receiver.IsEmpty() && (slot > BOT_SLOT_RANGED || einfo->ItemEntry[slot] != newItemId))\n+    {\n+        ASSERT(receiver == master->GetGUID());\n+\n+        //cheating\n+        if ((!newItem->GetOwnerGUID().IsEmpty() && newItem->GetOwnerGUID() != master->GetGUID()) ||\n+            (from_bank ? !BotDataMgr::WithdrawBotBankItem(receiver, itemGuid.GetCounter()) : !master->HasItemCount(newItemId, 1)))\n+        {\n+            BOT_LOG_ERROR(\"entities.player\",\n+                \"bot_ai::_equip(): player {} ({}) is trying to make bot {} (id: {}) equip item: {} (id: {}, {}) but either does not have this item or does not own it (bank: {})\",\n+                master->GetName(), master->GetGUID().ToString(), me->GetName(), me->GetEntry(), proto->Name1, proto->ItemId, itemGuid.ToString(), uint32(from_bank));\n+            return BotEquipResult::BOT_EQUIP_RESULT_FAIL_NO_ITEM;\n+        }\n+\n+        if (!from_bank)\n+            master->MoveItemFromInventory(newItem->GetBagSlot(), newItem->GetSlot(), true);\n+    }\n+\n+    if (slot <= BOT_SLOT_RANGED)\n+    {\n+        if (CanChangeEquip(slot))\n+        {\n+            NpcBotTransmogData const* transmogData = BotDataMgr::SelectNpcBotTransmogs(me->GetEntry());\n+            if (einfo->ItemEntry[slot] != newItemId && transmogData && BotCfg::IsTransmogEnabled() && (transmogData->transmogs[slot].first == newItemId ||BotCfg::TransmogUseEquipmentSlots()) &&\n+                transmogData->transmogs[slot].second >= 0)\n+                me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + slot, uint32(transmogData->transmogs[slot].second));\n+            else\n+                me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + slot, newItemId);\n+        }\n+        uint32 delay =\n+            /*einfo->ItemEntry[slot] != newItemId || */RespectEquipsAttackTime() || slot == BOT_SLOT_OFFHAND ? proto->Delay :\n+            slot == BOT_SLOT_RANGED ? me->GetCreatureTemplate()->RangeAttackTime : me->GetCreatureTemplate()->BaseAttackTime;\n+        //attack time will be updated in SetStats() -> OnMeleeDamageUpdate()\n+        if (!me->IsInFeralForm())\n+            me->SetAttackTime(WeaponAttackType(slot), delay); //set attack speed\n+    }\n+\n+    if (IsUsableItem(newItem))\n+    {\n+        uint32 slotMask = 1ul << slot;\n+        ASSERT(!(_usableItemSlotsMask & slotMask));\n+        _usableItemSlotsMask |= slotMask;\n+    }\n+\n+    _updateEquips(slot, newItem);\n+\n+    //only for non-standard items\n+    if (slot > BOT_SLOT_RANGED || einfo->ItemEntry[slot] != newItemId)\n+        ApplyItemBonuses(slot);\n+    ApplyItemSetBonuses(newItem, true);\n+\n+    if (slot == BOT_SLOT_OFFHAND)\n+    {\n+        if (proto->Class == ITEM_CLASS_WEAPON)\n+        {\n+            if (!me->CanDualWield())\n+                me->SetCanDualWield(true);\n+        }\n+        else if (proto->Class == ITEM_CLASS_ARMOR && proto->SubClass == ITEM_SUBCLASS_ARMOR_SHIELD)\n+        {\n+            if (me->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_NO_BLOCK)\n+                const_cast<CreatureTemplate*>(me->GetCreatureTemplate())->flags_extra &= ~CREATURE_FLAG_EXTRA_NO_BLOCK;\n+        }\n+    }\n+    else if (slot == BOT_SLOT_MAINHAND)\n+    {\n+        if (proto->InventoryType == INVTYPE_2HWEAPON && !(_botclass == BOT_CLASS_WARRIOR && me->GetLevel() >= 60 && GetSpec() == BOT_SPEC_WARRIOR_FURY))\n+        {\n+            //if have incompatible offhand unequip it\n+            if (_equips[BOT_SLOT_OFFHAND] != nullptr)\n+                if (_unequip(BOT_SLOT_OFFHAND, receiver, store_to_bank) != BotEquipResult::BOT_EQUIP_RESULT_OK)\n+                    return BotEquipResult::BOT_EQUIP_RESULT_FAIL_LINKED_UNEQUIP_FAILED;\n+        }\n+        else if (_equips[BOT_SLOT_OFFHAND] == nullptr && einfo->ItemEntry[BOT_SLOT_OFFHAND])\n+            if (_resetEquipment(BOT_SLOT_OFFHAND, receiver, store_to_bank) != BotEquipResult::BOT_EQUIP_RESULT_OK)\n+                return BotEquipResult::BOT_EQUIP_RESULT_FAIL_LINKED_RESET_FAILED;\n+    }\n+\n+    //send info to class ai\n+    if (proto->Class == ITEM_CLASS_WEAPON)\n+    {\n+        if (slot == BOT_SLOT_MAINHAND)\n+        {\n+            SetAIMiscValue(BOTAI_MISC_DAGGER_MAINHAND, proto->SubClass == ITEM_SUBCLASS_WEAPON_DAGGER);\n+            SetAIMiscValue(BOTAI_MISC_ENCHANT_TIMER_MH, uint32(newItem->GetEnchantmentId(TEMP_ENCHANTMENT_SLOT) ? 0 : 1));\n+            SetAIMiscValue(BOTAI_MISC_WEAPON_SPEC, proto->SubClass);\n+        }\n+        if (slot == BOT_SLOT_OFFHAND)\n+        {\n+            SetAIMiscValue(BOTAI_MISC_DAGGER_OFFHAND, proto->SubClass == ITEM_SUBCLASS_WEAPON_DAGGER);\n+            SetAIMiscValue(BOTAI_MISC_ENCHANT_TIMER_OH, uint32(newItem->GetEnchantmentId(TEMP_ENCHANTMENT_SLOT) ? 0 : 1));\n+        }\n+    }\n+\n+    return BotEquipResult::BOT_EQUIP_RESULT_OK;\n+}\n+\n+void bot_ai::_updateEquips(uint8 slot, Item* item)\n+{\n+    _equips[slot] = item;\n+    BotDataMgr::UpdateNpcBotData(me->GetEntry(), NPCBOT_UPDATE_EQUIPS, _equips.data());\n+}\n+//Called from gossip menu only (applies only to weapons)\n+BotEquipResult bot_ai::_resetEquipment(uint8 slot, ObjectGuid receiver, bool store_to_bank)\n+{\n+    if (IsWanderer())\n+    {\n+        BOT_LOG_ERROR(\"scripts\", \"bot_ai::_resetEquipment() is called for wanderer bot {} ({}), slot {}!\",\n+            me->GetName(), me->GetEntry(), uint32(slot));\n+        return BotEquipResult::BOT_EQUIP_RESULT_FAIL_WANDERER;\n+    }\n+\n+    ASSERT(slot <= BOT_SLOT_RANGED);\n+\n+    EquipmentInfo const* einfo = BotDataMgr::GetBotEquipmentInfo(me->GetEntry());\n+    uint32 itemId = einfo->ItemEntry[slot];\n+    Item const* oldItem = _equips[slot];\n+\n+    BotLogger::Log(NPCBOT_LOG_EQUIP_RESET, me, uint32(slot), uint32(oldItem ? oldItem->GetGUID().GetCounter() : 0), uint32(oldItem ? oldItem->GetEntry() : 0), uint32(receiver.GetCounter()), uint32(itemId));\n+\n+    if (!itemId)\n+        return _unequip(slot, receiver, store_to_bank);\n+    else if (oldItem)\n+        if (oldItem->GetEntry() == itemId)\n+            return BotEquipResult::BOT_EQUIP_RESULT_OK;\n+\n+    if (slot == BOT_SLOT_MAINHAND && !(_botclass == BOT_CLASS_WARRIOR && me->GetLevel() >= 60 && GetSpec() == BOT_SPEC_WARRIOR_FURY))\n+    {\n+        if (ItemTemplate const* proto = sObjectMgr->GetItemTemplate(itemId))\n+        {\n+            if (proto->Class == ITEM_CLASS_WEAPON &&\n+                (proto->SubClass == ITEM_SUBCLASS_WEAPON_AXE2 || proto->SubClass == ITEM_SUBCLASS_WEAPON_MACE2 ||\n+                proto->SubClass == ITEM_SUBCLASS_WEAPON_SWORD2 || proto->SubClass == ITEM_SUBCLASS_WEAPON_POLEARM ||\n+                proto->SubClass == ITEM_SUBCLASS_WEAPON_STAFF || proto->SubClass == ITEM_SUBCLASS_WEAPON_SPEAR))\n+            {\n+                BotEquipResult unequip_offhand_result = _unequip(BOT_SLOT_OFFHAND, receiver, store_to_bank);\n+                if (unequip_offhand_result != BotEquipResult::BOT_EQUIP_RESULT_OK)\n+                    return BotEquipResult::BOT_EQUIP_RESULT_FAIL_LINKED_UNEQUIP_FAILED;\n+            }\n+        }\n+    }\n+\n+    //we have our standard weapon itemId which we should use to create new item\n+    Item* stItem = Item::CreateItem(itemId, 1, nullptr);\n+    ASSERT(stItem, \"Failed to create standard Item for bot!\");\n+\n+    BotEquipResult equip_result = _equip(slot, stItem, receiver, store_to_bank);\n+    if (equip_result != BotEquipResult::BOT_EQUIP_RESULT_OK)\n+    {\n+        BOT_LOG_ERROR(\"entities.player\", \"minion_ai::_resetEquipment(): player {} ({}) failed to reset equipment for bot {} (id: {}) in slot {}\",\n+            master->GetName(), master->GetGUID().ToString(), me->GetName(), me->GetEntry(), slot);\n+        return equip_result;\n+    }\n+    return BotEquipResult::BOT_EQUIP_RESULT_OK;\n+}\n+\n+void bot_ai::ApplyItemBonuses(uint8 slot)\n+{\n+    //ensurance to set zeros\n+    RemoveItemBonuses(slot);\n+\n+    Item* item = _equips[slot];\n+    if (!item)\n+        return;\n+\n+    ItemTemplate const* proto = sObjectMgr->GetItemTemplate(item->GetEntry());\n+    if (!proto)\n+        return;\n+\n+    ScalingStatDistributionEntry const* ssd = proto->ScalingStatDistribution ? sScalingStatDistributionStore.LookupEntry(proto->ScalingStatDistribution) : nullptr;\n+\n+    uint32 ssd_level = me->GetLevel();\n+    if (ssd && ssd_level > ssd->Maxlevel)\n+        ssd_level = ssd->Maxlevel;\n+\n+    ScalingStatValuesEntry const* ssv = proto->ScalingStatValue ? sScalingStatValuesStore.LookupEntry(ssd_level) : nullptr;\n+\n+    for (auto i : NPCBots::index_array<uint8, MAX_ITEM_PROTO_STATS>)\n+    {\n+        uint32 statType = 0;\n+        int32  val      = 0;\n+        if (ssd && ssv)\n+        {\n+            if (ssd->StatID[i] < 0)\n+                continue;\n+            statType = ssd->StatID[i];\n+            val = (ssv->getssdMultiplier(proto->ScalingStatValue) * ssd->Bonus[i]) / 10000;\n+        }\n+        else\n+        {\n+            if (i >= proto->StatsCount)\n+                continue;\n+            statType = proto->ItemStat[i].ItemStatType;\n+            val = proto->ItemStat[i].ItemStatValue;\n+        }\n+\n+        if (val == 0)\n+            continue;\n+\n+        _stats[slot][statType] += val;\n+    }\n+\n+    _stats[slot][BOT_STAT_MOD_RESIST_HOLY] += proto->HolyRes;\n+    _stats[slot][BOT_STAT_MOD_RESIST_FIRE] += proto->FireRes;\n+    _stats[slot][BOT_STAT_MOD_RESIST_NATURE] += proto->NatureRes;\n+    _stats[slot][BOT_STAT_MOD_RESIST_FROST] += proto->FrostRes;\n+    _stats[slot][BOT_STAT_MOD_RESIST_SHADOW] += proto->ShadowRes;\n+    _stats[slot][BOT_STAT_MOD_RESIST_ARCANE] += proto->ArcaneRes;\n+\n+    _stats[slot][BOT_STAT_MOD_ARMOR] += proto->Armor;\n+    _stats[slot][BOT_STAT_MOD_BLOCK_VALUE] += proto->Block;\n+\n+    EquipmentInfo const* einfo = BotDataMgr::GetBotEquipmentInfo(me->GetEntry());\n+    if (slot > BOT_SLOT_RANGED || item->GetEntry() != einfo->ItemEntry[slot])\n+    {\n+        if (ssv)\n+        {\n+            int32 extraDPS = ssv->getDPSMod(proto->ScalingStatValue);\n+            if (extraDPS)\n+            {\n+                float average = extraDPS * proto->Delay / 1000.0f;\n+                float mod = ssv->isTwoHand(proto->ScalingStatValue) ? 0.2f : 0.3f;\n+\n+                _stats[slot][BOT_STAT_MOD_DAMAGE_MIN] += (1.0f - mod) * average;\n+                _stats[slot][BOT_STAT_MOD_DAMAGE_MAX] += (1.0f + mod) * average;\n+            }\n+        }\n+        else\n+        {\n+            _stats[slot][BOT_STAT_MOD_DAMAGE_MIN] += proto->Damage[0].DamageMin + proto->Damage[1].DamageMin;\n+            _stats[slot][BOT_STAT_MOD_DAMAGE_MAX] += proto->Damage[0].DamageMax + proto->Damage[1].DamageMax;\n+        }\n+\n+        if (_botclass == BOT_CLASS_DRUID)\n+        {\n+            int32 dpsMod = 0;\n+            int32 feral_bonus = 0;\n+\n+            if (ssv)\n+            {\n+                dpsMod = ssv->getDPSMod(proto->ScalingStatValue);\n+                feral_bonus += ssv->getFeralBonus(proto->ScalingStatValue);\n+            }\n+\n+            feral_bonus += proto->getFeralBonus(dpsMod);\n+            if (feral_bonus)\n+                _stats[slot][BOT_STAT_MOD_FERAL_ATTACK_POWER] += feral_bonus;\n+                //ApplyFeralAPBonus(feral_bonus, apply);\n+        }\n+    }\n+\n+    ApplyItemEnchantments(item, slot);\n+    ApplyItemEquipSpells(item, true);\n+\n+    shouldUpdateStats = true;\n+}\n+\n+void bot_ai::RemoveItemBonuses(uint8 slot)\n+{\n+    Item* item = _equips[slot];\n+    if (!item)\n+        return;\n+\n+    ItemTemplate const* proto = sObjectMgr->GetItemTemplate(item->GetEntry());\n+    if (!proto)\n+        return;\n+\n+    for (auto i : NPCBots::index_array<uint8, MAX_BOT_ITEM_MOD>)\n+        _stats[slot][i] = 0;\n+\n+    RemoveItemEnchantments(item); //remove spells\n+    ApplyItemEquipSpells(item, false);\n+\n+    shouldUpdateStats = true;\n+}\n+\n+void bot_ai::ApplyItemEnchantments(Item* item, uint8 slot)\n+{\n+    for (auto i : NPCBots::index_array<uint8, MAX_ENCHANTMENT_SLOT>)\n+        ApplyItemEnchantment(item, EnchantmentSlot(i), slot);\n+}\n+\n+void bot_ai::ApplyItemEnchantment(Item* item, EnchantmentSlot eslot, uint8 slot)\n+{\n+    uint32 enchant_id = item->GetEnchantmentId(eslot);\n+    if (!enchant_id)\n+        return;\n+\n+    SpellItemEnchantmentEntry const* pEnchant = sSpellItemEnchantmentStore.LookupEntry(enchant_id);\n+    if (!pEnchant)\n+        return;\n+\n+    if (pEnchant->MinLevel > me->GetLevel())\n+        return;\n+\n+    uint32 enchant_display_type;\n+    uint32 enchant_amount;\n+    uint32 enchant_spell_id;\n+\n+    for (auto s : NPCBots::index_array<uint8, MAX_ITEM_ENCHANTMENT_EFFECTS>)\n+    {\n+        enchant_display_type = pEnchant->Effect[s];\n+        enchant_amount = pEnchant->EffectPointsMin[s];\n+        enchant_spell_id = pEnchant->EffectArg[s];\n+\n+        switch (enchant_display_type)\n+        {\n+            case ITEM_ENCHANTMENT_TYPE_DAMAGE:\n+                _stats[slot][BOT_STAT_MOD_DAMAGE_MIN] += enchant_amount;\n+                _stats[slot][BOT_STAT_MOD_DAMAGE_MAX] += enchant_amount;\n+                break;\n+            case ITEM_ENCHANTMENT_TYPE_EQUIP_SPELL:\n+                if (enchant_spell_id)\n+                {\n+                    int32 basepoints = 0;\n+                    // Random Property Exist - try found basepoints for spell (basepoints depends from item suffix factor)\n+                    if (item->GetItemRandomPropertyId())\n+                    {\n+                        ItemRandomSuffixEntry const* item_rand = sItemRandomSuffixStore.LookupEntry(abs(item->GetItemRandomPropertyId()));\n+                        if (item_rand)\n+                        {\n+                            // Search enchant_amount\n+                            for (auto k : NPCBots::index_array<uint8, MAX_ITEM_ENCHANTMENT_EFFECTS>)\n+                            {\n+                                if (item_rand->Enchantment[k] == enchant_id)\n+                                {\n+                                    basepoints = int32((item_rand->AllocationPct[k] * item->GetItemSuffixFactor()) / 10000);\n+                                    break;\n+                                }\n+                            }\n+                        }\n+                    }\n+                    // Cast custom spell vs all equal basepoints got from enchant_amount\n+                    CastSpellExtraArgs args(item);\n+                    if (basepoints)\n+                        for (auto i : NPCBots::index_array<uint8, MAX_SPELL_EFFECTS>)\n+                            args.AddSpellMod(SpellValueMod(SPELLVALUE_BASE_POINT0 + i), basepoints);\n+                    me->CastSpell(me, enchant_spell_id, args);\n+                }\n+                break;\n+            case ITEM_ENCHANTMENT_TYPE_RESISTANCE:\n+                if (!enchant_amount)\n+                {\n+                    ItemRandomSuffixEntry const* item_rand = sItemRandomSuffixStore.LookupEntry(abs(item->GetItemRandomPropertyId()));\n+                    if (item_rand)\n+                    {\n+                        for (auto k : NPCBots::index_array<uint8, MAX_ITEM_ENCHANTMENT_EFFECTS>)\n+                        {\n+                            if (item_rand->Enchantment[k] == enchant_id)\n+                            {\n+                                enchant_amount = uint32((item_rand->AllocationPct[k] * item->GetItemSuffixFactor()) / 10000);\n+                                break;\n+                            }\n+                        }\n+                    }\n+                }\n+                _stats[slot][BOT_STAT_MOD_RESISTANCE_START + enchant_spell_id] += enchant_amount;\n+                break;\n+            case ITEM_ENCHANTMENT_TYPE_STAT:\n+            {\n+                if (!enchant_amount)\n+                {\n+                    ItemRandomSuffixEntry const* item_rand_suffix = sItemRandomSuffixStore.LookupEntry(abs(item->GetItemRandomPropertyId()));\n+                    if (item_rand_suffix)\n+                    {\n+                        for (auto k : NPCBots::index_array<uint8, MAX_ITEM_ENCHANTMENT_EFFECTS>)\n+                        {\n+                            if (item_rand_suffix->Enchantment[k] == enchant_id)\n+                            {\n+                                enchant_amount = uint32((item_rand_suffix->AllocationPct[k] * item->GetItemSuffixFactor()) / 10000);\n+                                break;\n+                            }\n+                        }\n+                    }\n+                }\n+\n+                switch (enchant_spell_id)\n+                {\n+                    case ITEM_MOD_MANA:\n+                    case ITEM_MOD_HEALTH:\n+                    case ITEM_MOD_AGILITY:\n+                    case ITEM_MOD_STRENGTH:\n+                    case ITEM_MOD_INTELLECT:\n+                    case ITEM_MOD_SPIRIT:\n+                    case ITEM_MOD_STAMINA:\n+                    case ITEM_MOD_DEFENSE_SKILL_RATING:\n+                    case ITEM_MOD_DODGE_RATING:\n+                    case ITEM_MOD_PARRY_RATING:\n+                    case ITEM_MOD_BLOCK_RATING:\n+                    case ITEM_MOD_HIT_MELEE_RATING:\n+                    case ITEM_MOD_HIT_RANGED_RATING:\n+                    case ITEM_MOD_HIT_SPELL_RATING:\n+                    case ITEM_MOD_CRIT_MELEE_RATING:\n+                    case ITEM_MOD_CRIT_RANGED_RATING:\n+                    case ITEM_MOD_CRIT_SPELL_RATING:\n+                    //case ITEM_MOD_HIT_TAKEN_MELEE_RATING:\n+                    //case ITEM_MOD_HIT_TAKEN_RANGED_RATING:\n+                    //case ITEM_MOD_HIT_TAKEN_SPELL_RATING:\n+                    //case ITEM_MOD_CRIT_TAKEN_MELEE_RATING:\n+                    //case ITEM_MOD_CRIT_TAKEN_RANGED_RATING:\n+                    //case ITEM_MOD_CRIT_TAKEN_SPELL_RATING:\n+                    case ITEM_MOD_HASTE_MELEE_RATING:\n+                    case ITEM_MOD_HASTE_RANGED_RATING:\n+                    case ITEM_MOD_HASTE_SPELL_RATING:\n+                    case ITEM_MOD_HIT_RATING:\n+                    case ITEM_MOD_CRIT_RATING:\n+                    case ITEM_MOD_HASTE_RATING:\n+                    case ITEM_MOD_RESILIENCE_RATING:\n+                    case ITEM_MOD_EXPERTISE_RATING:\n+                    case ITEM_MOD_ATTACK_POWER:\n+                    case ITEM_MOD_RANGED_ATTACK_POWER:\n+                    case ITEM_MOD_MANA_REGENERATION:\n+                    case ITEM_MOD_ARMOR_PENETRATION_RATING:\n+                    case ITEM_MOD_SPELL_POWER:\n+                    case ITEM_MOD_HEALTH_REGEN:\n+                    case ITEM_MOD_SPELL_PENETRATION:\n+                    case ITEM_MOD_BLOCK_VALUE:\n+                    case ITEM_MOD_SPELL_HEALING_DONE:   // deprecated\n+                    case ITEM_MOD_SPELL_DAMAGE_DONE:    // deprecated\n+                        _stats[slot][enchant_spell_id] += enchant_amount;\n+                        break;\n+                    default:\n+                        break;\n+                }\n+                break;\n+            }\n+            case ITEM_ENCHANTMENT_TYPE_TOTEM:           // Shaman Rockbiter Weapon\n+            case ITEM_ENCHANTMENT_TYPE_USE_SPELL:\n+            case ITEM_ENCHANTMENT_TYPE_PRISMATIC_SOCKET:\n+                break;\n+            default:\n+                break;\n+        }\n+    }\n+}\n+\n+void bot_ai::RemoveItemEnchantments(Item const* item)\n+{\n+    for (auto i : NPCBots::index_array<uint8, MAX_ENCHANTMENT_SLOT>)\n+        RemoveItemEnchantment(item, EnchantmentSlot(i));\n+}\n+\n+void bot_ai::RemoveItemEnchantment(Item const* item, EnchantmentSlot eslot)\n+{\n+    uint32 enchant_id = item->GetEnchantmentId(eslot);\n+    if (!enchant_id)\n+        return;\n+\n+    SpellItemEnchantmentEntry const* pEnchant = sSpellItemEnchantmentStore.LookupEntry(enchant_id);\n+    if (!pEnchant)\n+        return;\n+\n+    ////skip level reqs\n+    //if (pEnchant->MinLevel > me->GetLevel())\n+    //    return;\n+\n+    uint32 enchant_display_type;\n+    //uint32 enchant_amount;\n+    uint32 enchant_spell_id;\n+\n+    for (auto s : NPCBots::index_array<uint8, MAX_ITEM_ENCHANTMENT_EFFECTS>)\n+    {\n+        enchant_display_type = pEnchant->Effect[s];\n+        //enchant_amount = pEnchant->EffectPointsMin[s];\n+        enchant_spell_id = pEnchant->EffectArg[s];\n+\n+        switch (enchant_display_type)\n+        {\n+            case ITEM_ENCHANTMENT_TYPE_DAMAGE:\n+                //Already removed in RemoveItemBonuses()\n+                break;\n+            case ITEM_ENCHANTMENT_TYPE_EQUIP_SPELL:\n+                if (enchant_spell_id)\n+                    me->RemoveAurasDueToItemSpell(enchant_spell_id, item->GetGUID());\n+                break;\n+            case ITEM_ENCHANTMENT_TYPE_RESISTANCE:\n+                //Already removed in RemoveItemBonuses()\n+                break;\n+            case ITEM_ENCHANTMENT_TYPE_STAT:\n+                //Already removed in RemoveItemBonuses()\n+                break;\n+            case ITEM_ENCHANTMENT_TYPE_TOTEM:           // Shaman Rockbiter Weapon\n+            case ITEM_ENCHANTMENT_TYPE_USE_SPELL:\n+            case ITEM_ENCHANTMENT_TYPE_PRISMATIC_SOCKET:\n+                break;\n+            default:\n+                break;\n+        }\n+    }\n+}\n+\n+void bot_ai::RemoveItemClassEnchantment(uint8 slot)\n+{\n+    uint8 eslot = TEMP_ENCHANTMENT_SLOT;\n+\n+    if (!GetAIMiscValue(slot == BOT_SLOT_MAINHAND ? BOTAI_MISC_ENCHANT_TIMER_MH : BOTAI_MISC_ENCHANT_TIMER_OH))\n+        return;\n+\n+    Item* weap = _equips[slot];\n+    if (!weap || !weap->GetEnchantmentId(EnchantmentSlot(eslot)))\n+        return;\n+\n+    RemoveItemEnchantment(weap, EnchantmentSlot(eslot));\n+\n+    for (auto s : NPCBots::index_array<uint8, MAX_ITEM_ENCHANTMENT_EFFECTS>)\n+        weap->SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + eslot*MAX_ENCHANTMENT_OFFSET + s, 0);\n+}\n+\n+void bot_ai::RemoveItemClassEnchantments()\n+{\n+    for (auto slot : NPCBots::index_array<uint8, BOT_FIRST_NON_MELEE_SLOT>)\n+        RemoveItemClassEnchantment(slot);\n+}\n+\n+void bot_ai::ApplyItemEquipSpells(Item* item, bool apply)\n+{\n+    if (!item)\n+        return;\n+\n+    ItemTemplate const* proto = item->GetTemplate();\n+    if (!proto)\n+        return;\n+\n+    for (auto i : NPCBots::index_array<uint8, MAX_ITEM_PROTO_SPELLS>)\n+    {\n+        _Spell const& spellData = proto->Spells[i];\n+\n+        if (!spellData.SpellId)\n+            continue;\n+\n+        // wrong triggering type\n+        if (apply && spellData.SpellTrigger != ITEM_SPELLTRIGGER_ON_EQUIP)\n+            continue;\n+\n+        // check if it is valid spell\n+        SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellData.SpellId);\n+        if (!spellInfo)\n+            continue;\n+\n+        //ApplyEquipSpell(spellproto, item, apply);\n+\n+        //if (apply)\n+        //    me->AddAura(spellInfo->Id, me);\n+        //else\n+        //    me->RemoveAura(spellInfo->Id);\n+\n+        CastSpellExtraArgs args(item);\n+        if (apply)\n+            me->CastSpell(me, spellInfo->Id, args);\n+        else\n+            me->RemoveAurasDueToItemSpell(spellInfo->Id, item->GetGUID());  // un-apply all spells, not only at-equipped\n+    }\n+}\n+\n+void bot_ai::ApplyItemEquipEnchantmentSpells(Item* item)\n+{\n+    for (auto e_slot : NPCBots::index_array<uint8, MAX_ENCHANTMENT_SLOT>)\n+    {\n+        uint32 enchant_id = item->GetEnchantmentId(EnchantmentSlot(e_slot));\n+        if (!enchant_id)\n+            continue;\n+        SpellItemEnchantmentEntry const* pEnchant = sSpellItemEnchantmentStore.LookupEntry(enchant_id);\n+        if (!pEnchant)\n+            continue;\n+        if (pEnchant->MinLevel > me->GetLevel())\n+            continue;\n+\n+        uint32 enchant_display_type;\n+        //uint32 enchant_amount;\n+        uint32 enchant_spell_id;\n+\n+        for (auto s : NPCBots::index_array<uint8, MAX_ITEM_ENCHANTMENT_EFFECTS>)\n+        {\n+            enchant_display_type = pEnchant->Effect[s];\n+            //enchant_amount = pEnchant->EffectPointsMin[s];\n+            enchant_spell_id = pEnchant->EffectArg[s];\n+\n+            switch (enchant_display_type)\n+            {\n+                case ITEM_ENCHANTMENT_TYPE_EQUIP_SPELL:\n+                {\n+                    if (!enchant_spell_id)\n+                        break;\n+                    int32 basepoints = 0;\n+                    // Random Property Exist - try found basepoints for spell (basepoints depends from item suffix factor)\n+                    if (item->GetItemRandomPropertyId())\n+                    {\n+                        ItemRandomSuffixEntry const* item_rand = sItemRandomSuffixStore.LookupEntry(abs(item->GetItemRandomPropertyId()));\n+                        if (item_rand)\n+                        {\n+                            // Search enchant_amount\n+                            for (auto k : NPCBots::index_array<uint8, MAX_ITEM_ENCHANTMENT_EFFECTS>)\n+                            {\n+                                if (item_rand->Enchantment[k] == enchant_id)\n+                                {\n+                                    basepoints = int32((item_rand->AllocationPct[k] * item->GetItemSuffixFactor()) / 10000);\n+                                    break;\n+                                }\n+                            }\n+                        }\n+                    }\n+                    // Cast custom spell vs all equal basepoints got from enchant_amount\n+                    CastSpellExtraArgs args(item);\n+                    if (basepoints)\n+                        for (auto i : NPCBots::index_array<uint8, MAX_SPELL_EFFECTS>)\n+                            args.AddSpellMod(SpellValueMod(SPELLVALUE_BASE_POINT0 + i), basepoints);\n+                    me->CastSpell(me, enchant_spell_id, args);\n+                    break;\n+                }\n+                default:\n+                    break;\n+            }\n+        }\n+    }\n+}\n+\n+void bot_ai::ApplyItemSetBonuses(Item* item, bool apply)\n+{\n+    if (item) //(un)equip, NOT from loops\n+    {\n+        ItemTemplate const* proto = item->GetTemplate();\n+        if (!proto)\n+            return;\n+\n+        uint32 setId = proto->ItemSet;\n+        if (!setId)\n+            return;\n+\n+        ItemSetEntry const* itemSet = sItemSetStore.LookupEntry(setId);\n+        if (!itemSet)\n+            return;\n+\n+        uint8 setItemCount = 0;\n+        for (auto slot : NPCBots::index_array<uint8, BOT_INVENTORY_SIZE>)\n+            if (_equips[slot] && _equips[slot]->GetTemplate()->ItemSet == setId)\n+                ++setItemCount; //same at equip and unequip\n+\n+        for (auto i : NPCBots::index_array<uint8, MAX_ITEM_SET_SPELLS>)\n+        {\n+            if (!itemSet->SetSpellID[i])\n+                continue;\n+            if (itemSet->SetThreshold[i] != setItemCount)\n+                continue;\n+\n+            SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(itemSet->SetSpellID[i]);\n+            if (!spellInfo)\n+                continue;\n+\n+            //BOT_LOG_ERROR(\"entities.player\", \"ApplyItemSetBonusesB: {}'s {}, {} ({}), {} ({}), icount {}\",\n+            //    me->GetName(), apply ? \"apply\" : \"remove\", itemSet->name[0], setId, spellInfo->SpellName[0], spellInfo->Id, uint32(setItemCount));\n+\n+            if (apply)\n+            {\n+                CastSpellExtraArgs args(item);\n+                me->CastSpell(me, spellInfo->Id, args);\n+            }\n+            else\n+                me->RemoveAurasDueToSpell(spellInfo->Id);           // un-apply spell (item set case)\n+        }\n+        return;\n+    }\n+\n+    //no item means all (init, reset, reset (lvl change))\n+    std::set<uint32> itemSets;\n+    for (auto slot : NPCBots::index_array<uint8, BOT_INVENTORY_SIZE>)\n+    {\n+        item = _equips[slot]; //intended: oveeride function argument value\n+        if (!item)\n+            continue;\n+\n+        ItemTemplate const* proto = item->GetTemplate();\n+        if (!proto)\n+            continue;\n+\n+        uint32 setId = proto->ItemSet;\n+        if (!setId)\n+            continue;\n+\n+        ItemSetEntry const* itemSet = sItemSetStore.LookupEntry(setId);\n+        if (!itemSet)\n+            continue;\n+\n+        itemSets.emplace(setId);\n+    }\n+\n+    for (uint32 item_set_id : itemSets)\n+    {\n+        ItemSetEntry const* itemSet = sItemSetStore.LookupEntry(item_set_id);\n+        uint8 setItemCount = std::ranges::count_if(_equips, [=](Item const* item) {\n+            return item && item->GetTemplate()->ItemSet == item_set_id;\n+        });\n+\n+        for (auto i : NPCBots::index_array<uint8, MAX_ITEM_SET_SPELLS>)\n+        {\n+            if (!itemSet->SetSpellID[i])\n+                continue;\n+            if (itemSet->SetThreshold[i] > setItemCount)\n+                continue;\n+\n+            SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(itemSet->SetSpellID[i]);\n+            if (!spellInfo)\n+                continue;\n+\n+            //BOT_LOG_ERROR(\"entities.player\", \"ApplyItemSetBonusesB (all): {}'s {}, {} ({}), {} ({}), c {}, req {}\",\n+            //    me->GetName(), apply ? \"apply\" : \"remove\", itemSet->name[0], *itr, spellInfo->SpellName[0], spellInfo->Id, uint32(setItemCount), itemSet->SetThreshold[j]);\n+\n+            if (apply)\n+            {\n+                CastSpellExtraArgs args(item);\n+                me->CastSpell(me, spellInfo->Id, args);\n+            }\n+            else\n+                me->RemoveAurasDueToSpell(spellInfo->Id);           // un-apply spell (item set case)\n+        }\n+    }\n+}\n+\n+void bot_ai::ApplyItemsSpells()\n+{\n+    for (auto slot : NPCBots::index_array<uint8, BOT_INVENTORY_SIZE>)\n+    {\n+        if (Item* item = _equips[slot])\n+        {\n+            ApplyItemEquipSpells(item, true); //item template spells\n+            ApplyItemEquipEnchantmentSpells(item); //item enchants\n+        }\n+    }\n+\n+    ApplyItemSetBonuses(nullptr, true); //item set bonuses\n+}\n+//stats bonuses from equipment\n+inline float bot_ai::_getBotStat(uint8 slot, BotStatMods stat) const\n+{\n+    return static_cast<float>(_stats[slot][stat]);\n+}\n+\n+float bot_ai::_getTotalBotStat(BotStatMods stat) const\n+{\n+    int32 value = 0;\n+    for (auto slot : NPCBots::index_array<uint8, BOT_INVENTORY_SIZE>)\n+        value += _stats[slot][stat];\n+\n+    uint8 lvl = me->GetLevel();\n+    Stats fstat = STAT_STRENGTH;\n+    UnitMods fmod = UNIT_MOD_END;\n+    float fpct = 0.0f;\n+    float fval = static_cast<float>(value);\n+\n+    switch (stat)\n+    {\n+        case BOT_STAT_MOD_STRENGTH:\n+            fstat = STAT_STRENGTH;\n+            fmod = UNIT_MOD_STAT_STRENGTH;\n+            switch (_botclass)\n+            {\n+                case BOT_CLASS_WARRIOR:\n+                    //Vitality, Strength of Arms\n+                    if (lvl >= 45 && GetSpec() == BOT_SPEC_WARRIOR_PROTECTION)\n+                        fpct += 0.06f;\n+                    if (lvl >= 40 && GetSpec() == BOT_SPEC_WARRIOR_ARMS)\n+                        fpct += 0.04f;\n+                    //Improved Berserker Stance part 1 (all stances)\n+                    if (lvl >= 45 && GetSpec() == BOT_SPEC_WARRIOR_FURY/* && GetBotStance() == WARRIOR_BERSERKER_STANCE*/)\n+                        fpct += 0.2f;\n+                    break;\n+                case BOT_CLASS_PALADIN:\n+                    //Divine Strength\n+                    if (lvl >= 10)\n+                        fpct += 0.15f;\n+                    break;\n+                case BOT_CLASS_DEATH_KNIGHT:\n+                    //Ravenous Dead part 1\n+                    //Endless Winter part 1\n+                    //Veteran of the Third War part 1\n+                    //Abomination's might part 2\n+                    if (lvl >= 56)\n+                        fpct += 0.03f;\n+                    if (lvl >= 58)\n+                        fpct += 0.04f;\n+                    if (lvl >= 59 && GetSpec() == BOT_SPEC_DK_BLOOD)\n+                        fpct += 0.06f;\n+                    if (lvl >= 60 && GetSpec() == BOT_SPEC_DK_BLOOD)\n+                        fpct += 0.02f;\n+                    //Frost Presence passive / Improved Frost Presence\n+                    if (lvl >= 61 && GetBotStance() == DEATH_KNIGHT_FROST_PRESENCE && GetSpec() == BOT_SPEC_DK_FROST)\n+                        fpct += 0.08f;\n+                    break;\n+                case BOT_CLASS_DRUID:\n+                    //Survival of the Fittest, Improved Mark of the Wild\n+                    if (lvl >= 35 && GetSpec() == BOT_SPEC_DRUID_FERAL)\n+                        fpct += 0.08f;\n+                    else if (lvl >= 10)\n+                        fpct += 0.02f;\n+                    break;\n+                default:\n+                    break;\n+            }\n+            break;\n+        case BOT_STAT_MOD_AGILITY:\n+            fstat = STAT_AGILITY;\n+            fmod = UNIT_MOD_STAT_AGILITY;\n+            switch (_botclass)\n+            {\n+                case BOT_CLASS_HUNTER:\n+                    //Combat Experience, Lightning Reflexes\n+                    if (lvl >= 35 && GetSpec() == BOT_SPEC_HUNTER_MARKSMANSHIP)\n+                        fpct += 0.04f;\n+                    if (lvl >= 35 && GetSpec() == BOT_SPEC_HUNTER_SURVIVAL)\n+                        fpct += 0.15f;\n+                    //Hunting Party\n+                    if (lvl >= 35 && GetSpec() == BOT_SPEC_HUNTER_SURVIVAL)\n+                        fpct += 0.03f;\n+                    break;\n+                case BOT_CLASS_ROGUE:\n+                    //Sinister Calling\n+                    if (lvl >= 45 && GetSpec() == BOT_SPEC_ROGUE_SUBTLETY)\n+                        fpct += 0.15f;\n+                    break;\n+                case BOT_CLASS_DRUID:\n+                    //Survival of the Fittest, Improved Mark of the Wild\n+                    if (lvl >= 35 && GetSpec() == BOT_SPEC_DRUID_FERAL)\n+                        fpct += 0.08f;\n+                    else if (lvl >= 10)\n+                        fpct += 0.02f;\n+                    break;\n+                default:\n+                    break;\n+            }\n+            break;\n+        case BOT_STAT_MOD_STAMINA:\n+            fstat = STAT_STAMINA;\n+            fmod = UNIT_MOD_STAT_STAMINA;\n+            switch (_botclass)\n+            {\n+                case BOT_CLASS_WARRIOR:\n+                    //Vitality, Strength of Arms\n+                    if (lvl >= 45 && GetSpec() == BOT_SPEC_WARRIOR_PROTECTION)\n+                        fpct += 0.09f;\n+                    if (lvl >= 40 && GetSpec() == BOT_SPEC_WARRIOR_ARMS)\n+                        fpct += 0.04f;\n+                    break;\n+                case BOT_CLASS_PALADIN:\n+                    //Combat Expertise, Sacred Duty\n+                    if (lvl >= 45 && GetSpec() == BOT_SPEC_PALADIN_PROTECTION)\n+                        fpct += 0.06f;\n+                    if (lvl >= 35 && GetSpec() == BOT_SPEC_PALADIN_PROTECTION)\n+                        fpct += 0.04f;\n+                    break;\n+                case BOT_CLASS_HUNTER:\n+                    //Survivalist\n+                    if (lvl >= 20)\n+                        fpct += 0.1f;\n+                    break;\n+                case BOT_CLASS_ROGUE:\n+                    //Lightning Reflexes part 2\n+                    if (lvl >= 25 && GetSpec() == BOT_SPEC_ROGUE_COMBAT)\n+                        fpct += 0.04f;\n+                    break;\n+                case BOT_CLASS_PRIEST:\n+                    //Improved Power Word: Fortitude\n+                    if (lvl >= 15)\n+                        fpct += 0.04f;\n+                    break;\n+                case BOT_CLASS_DEATH_KNIGHT:\n+                    //Veteran of the Third War part 2\n+                    if (lvl >= 59 && GetSpec() == BOT_SPEC_DK_BLOOD)\n+                        fpct += 0.03f;\n+                    break;\n+                case BOT_CLASS_WARLOCK:\n+                    //Demonic Embrace: 10% stam bonus\n+                    if (lvl >= 10)\n+                        fpct += 0.1f;\n+                    break;\n+                case BOT_CLASS_DRUID:\n+                    if (GetBotStance() == DRUID_BEAR_FORM)\n+                    {\n+                        //Bear form: stamina bonus base 25%\n+                        //Heart of the Wild: 10% stam bonus for bear\n+                        fpct += 0.25f;\n+                        if (lvl >= 35 && GetSpec() == BOT_SPEC_DRUID_FERAL)\n+                            fpct += 0.1f;\n+                    }\n+                    //Survival of the Fittest, Improved Mark of the Wild\n+                    if (lvl >= 35 && GetSpec() == BOT_SPEC_DRUID_FERAL)\n+                        fpct += 0.06f;\n+                    if (lvl >= 10)\n+                        fpct += 0.02f;\n+                    break;\n+                default:\n+                    break;\n+            }\n+            break;\n+        case BOT_STAT_MOD_INTELLECT:\n+            fstat = STAT_INTELLECT;\n+            fmod = UNIT_MOD_STAT_INTELLECT;\n+            switch (_botclass)\n+            {\n+                case BOT_CLASS_PALADIN:\n+                    //Divine Intellect\n+                    if (lvl >= 15)\n+                        fpct += 0.1f;\n+                    break;\n+                case BOT_CLASS_HUNTER:\n+                    //Combat Experience\n+                    if (lvl >= 35 && GetSpec() == BOT_SPEC_HUNTER_MARKSMANSHIP)\n+                        fpct += 0.04f;\n+                    break;\n+                case BOT_CLASS_MAGE:\n+                    //Arcane Mind\n+                    if (lvl >= 30 && GetSpec() == BOT_SPEC_MAGE_ARCANE)\n+                        fpct += 0.15f;\n+                    break;\n+                case BOT_CLASS_PRIEST:\n+                    //Mental Strength\n+                    if (lvl >= 30 && GetSpec() == BOT_SPEC_PRIEST_DISCIPLINE)\n+                        fpct += 0.15f;\n+                    break;\n+                case BOT_CLASS_SHAMAN:\n+                    //Ancestral Knowledge\n+                    if (lvl >= 10)\n+                        fpct += 0.1f;\n+                    break;\n+                case BOT_CLASS_DRUID:\n+                    //Survival of the Fittest, Improved Mark of the Wild\n+                    if (lvl >= 35 && GetSpec() == BOT_SPEC_DRUID_FERAL)\n+                        fpct += 0.08f;\n+                    else if (lvl >= 10)\n+                        fpct += 0.02f;\n+                    //Furor (Moonkin Form)\n+                    if (GetBotStance() == DRUID_MOONKIN_FORM)\n+                        fpct += 0.1f;\n+                    //Heart of the Wild: ferals only (tanks included)\n+                    if (lvl >= 35 && GetSpec() == BOT_SPEC_DRUID_FERAL)\n+                        fpct += 0.2f;\n+                    break;\n+                default:\n+                    break;\n+            }\n+            break;\n+        case BOT_STAT_MOD_SPIRIT:\n+            fstat = STAT_SPIRIT;\n+            fmod = UNIT_MOD_STAT_SPIRIT;\n+            switch (_botclass)\n+            {\n+                case BOT_CLASS_PRIEST:\n+                    //Spirit of Redemption part 1\n+                    if (lvl >= 30 && GetSpec() == BOT_SPEC_PRIEST_HOLY)\n+                        fpct += 0.05f;\n+                    //Enlightenment part 1\n+                    if (lvl >= 35 && GetSpec() == BOT_SPEC_PRIEST_DISCIPLINE)\n+                        fpct += 0.06f;\n+                    break;\n+                case BOT_CLASS_MAGE:\n+                    //Student of the Mind\n+                    if (lvl >= 20)\n+                        fpct += 0.1f;\n+                    break;\n+                case BOT_CLASS_DRUID:\n+                    //Survival of the Fittest, Improved Mark of the Wild\n+                    if (lvl >= 35 && GetSpec() == BOT_SPEC_DRUID_FERAL)\n+                        fpct += 0.08f;\n+                    else if (lvl >= 10)\n+                        fpct += 0.02f;\n+                    //Living Spirit\n+                    if (lvl >= 40 && GetSpec() == BOT_SPEC_DRUID_RESTORATION)\n+                        fpct += 0.15f;\n+                    break;\n+                default:\n+                    break;\n+            }\n+            break;\n+        default:\n+            break;\n+    }\n+\n+    if (fmod != UNIT_MOD_END)\n+    {\n+        fpct += me->GetPctModifierValue(fmod, TOTAL_PCT);\n+        fval *= fpct;\n+        fval += me->GetTotalStatValue(fstat);\n+    }\n+    return fval;\n+}\n+\n+float bot_ai::_getRatingMultiplier(CombatRating cr) const\n+{\n+    GtCombatRatingsEntry const* Rating = sGtCombatRatingsStore.LookupEntry(cr*GT_MAX_LEVEL + (me->GetLevel()-1));\n+    GtOCTClassCombatRatingScalarEntry const* classRating = sGtOCTClassCombatRatingScalarStore.LookupEntry((GetPlayerClass()-1)*GT_MAX_RATING + cr + 1);\n+    if (!Rating || !classRating)\n+        return 1.0f;\n+\n+    return classRating->Data / Rating->Data;\n+}\n+\n+float bot_ai::_getStatScore(uint8 stat) const\n+{\n+    static const float fone = 1.0f;\n+    static const float fzero = 0.0f;\n+\n+    float tankMod = IsTank() ? fone : fzero;\n+    float healMod = HasRole(BOT_ROLE_HEAL) ? fone : fzero;\n+    float castMod = IsCastingClass(_botclass) ? fone : fzero;\n+    float spiritMod = (_botclass == BOT_CLASS_PRIEST || _botclass == BOT_CLASS_MAGE || _botclass == BOT_CLASS_WARLOCK || (_botclass == BOT_CLASS_DRUID && _spec != BOT_SPEC_DRUID_FERAL)) ? fone : fzero;\n+    float dpsMod = HasRole(BOT_ROLE_DPS) ? fone : fzero;\n+    float meleeMod = !HasRole(BOT_ROLE_RANGED) ? fone : fzero;\n+    float manaMod = (_botclass == BOT_CLASS_DRUID || me->GetPowerType() == POWER_MANA) ? fone : fzero;\n+\n+    switch (stat)\n+    {\n+        case BOT_STAT_MOD_MANA:\n+            return 0.1f * manaMod;\n+        case BOT_STAT_MOD_HEALTH:\n+            return 0.1f;\n+        case BOT_STAT_MOD_AGILITY:\n+            return _botclass == BOT_CLASS_ROGUE ? 1.2f * dpsMod * meleeMod : (_botclass == BOT_CLASS_HUNTER ? 1.0f : 0.5f) * dpsMod;\n+        case BOT_STAT_MOD_STRENGTH:\n+            return (IsMeleeClass(_botclass) ? 1.0f : 0.5f) * dpsMod * meleeMod;\n+        case BOT_STAT_MOD_INTELLECT:\n+            return 1.0f * castMod;\n+        case BOT_STAT_MOD_SPIRIT:\n+            return 1.0f * spiritMod;\n+        case BOT_STAT_MOD_STAMINA:\n+            return IsTank() ? 2.0f : 1.0f;\n+        case BOT_STAT_MOD_DEFENSE_SKILL_RATING:\n+            return 2.0f * tankMod;\n+        case BOT_STAT_MOD_DODGE_RATING:\n+        case BOT_STAT_MOD_PARRY_RATING:\n+            return 2.0f * tankMod;\n+        case BOT_STAT_MOD_BLOCK_RATING:\n+            return CanBlock() ? 2.0f : 0.0f * tankMod;\n+        case BOT_STAT_MOD_BLOCK_VALUE:\n+            return CanBlock() ? 0.67f : 0.0f * tankMod;\n+        case BOT_STAT_MOD_HIT_TAKEN_RATING:\n+        case BOT_STAT_MOD_CRIT_TAKEN_RATING:\n+            return 1.0f * tankMod;\n+        case BOT_STAT_MOD_HIT_TAKEN_MELEE_RATING:\n+        case BOT_STAT_MOD_HIT_TAKEN_RANGED_RATING:\n+        case BOT_STAT_MOD_HIT_TAKEN_SPELL_RATING:\n+        case BOT_STAT_MOD_CRIT_TAKEN_MELEE_RATING:\n+        case BOT_STAT_MOD_CRIT_TAKEN_RANGED_RATING:\n+        case BOT_STAT_MOD_CRIT_TAKEN_SPELL_RATING:\n+            return 0.4f * tankMod;\n+        case BOT_STAT_MOD_ARMOR:\n+            return 0.05f * tankMod;\n+        case BOT_STAT_MOD_HIT_MELEE_RATING:\n+        case BOT_STAT_MOD_HIT_RANGED_RATING:\n+        case BOT_STAT_MOD_HIT_SPELL_RATING:\n+            return 1.0f * dpsMod;\n+        case BOT_STAT_MOD_CRIT_MELEE_RATING:\n+        case BOT_STAT_MOD_CRIT_RANGED_RATING:\n+        case BOT_STAT_MOD_CRIT_SPELL_RATING:\n+        case BOT_STAT_MOD_HASTE_MELEE_RATING:\n+        case BOT_STAT_MOD_HASTE_RANGED_RATING:\n+        case BOT_STAT_MOD_HASTE_SPELL_RATING:\n+        case BOT_STAT_MOD_HIT_RATING:\n+        case BOT_STAT_MOD_CRIT_RATING:\n+        case BOT_STAT_MOD_HASTE_RATING:\n+            return HasRole(BOT_ROLE_DPS|BOT_ROLE_HEAL) ? 1.0f : 0.0f;\n+        case BOT_STAT_MOD_EXPERTISE_RATING:\n+            return 2.0f * dpsMod * meleeMod;\n+        case BOT_STAT_MOD_ATTACK_POWER:\n+            return ((IsMeleeClass(_botclass) || _botclass == BOT_CLASS_HUNTER) ? 0.43f : 0.1f) * dpsMod;\n+        case BOT_STAT_MOD_RANGED_ATTACK_POWER:\n+            switch (_botclass)\n+            {\n+                case BOT_CLASS_HUNTER: case BOT_CLASS_DARK_RANGER: case BOT_CLASS_SEA_WITCH:    return 0.43f * dpsMod;\n+                case BOT_CLASS_PRIEST: case BOT_CLASS_MAGE: case BOT_CLASS_WARLOCK:             return 0.15f * dpsMod;\n+                default:                                                                        return 0.0f;\n+            }\n+        case BOT_STAT_MOD_FERAL_ATTACK_POWER:\n+            return GetSpec() == BOT_SPEC_DRUID_FERAL ? 0.43f : 0.0f;\n+        case BOT_STAT_MOD_SPELL_HEALING_DONE:\n+            return 1.25f * healMod;\n+        case BOT_STAT_MOD_SPELL_DAMAGE_DONE:\n+            return 1.25f * dpsMod * castMod;\n+        case BOT_STAT_MOD_MANA_REGENERATION:\n+            return _botclass == BOT_CLASS_SPHYNX ? 0.0f : 1.2f * manaMod;\n+        case BOT_STAT_MOD_ARMOR_PENETRATION_RATING:\n+            return 2.0f * dpsMod * meleeMod;\n+        case BOT_STAT_MOD_SPELL_POWER:\n+            return 1.25f * castMod;\n+        case BOT_STAT_MOD_HEALTH_REGEN:\n+            return 0.33f * tankMod;\n+        case BOT_STAT_MOD_SPELL_PENETRATION:\n+            return 1.2f * castMod * dpsMod;\n+        case BOT_STAT_MOD_DAMAGE_MIN:\n+        case BOT_STAT_MOD_DAMAGE_MAX:\n+            return ((IsMeleeClass(_botclass) || _botclass == BOT_CLASS_HUNTER) ? 0.33f : 0.0f) * dpsMod;\n+        case BOT_STAT_MOD_RESIST_HOLY:\n+        case BOT_STAT_MOD_RESIST_FIRE:\n+        case BOT_STAT_MOD_RESIST_NATURE:\n+        case BOT_STAT_MOD_RESIST_FROST:\n+        case BOT_STAT_MOD_RESIST_SHADOW:\n+        case BOT_STAT_MOD_RESIST_ARCANE:\n+            return IsTank() ? 1.25f : 0.25f;\n+        default:\n+            return 0.0f;\n+    }\n+}\n+\n+float bot_ai::_getItemGearStatScore(ItemTemplate const* iproto, uint8 forslot, Item const* item) const\n+{\n+    ItemTemplate const* proto = item ? sObjectMgr->GetItemTemplate(item->GetEntry()) : iproto;\n+    if (!proto)\n+        return 0.0f;\n+\n+    //BOT_LOG_ERROR(\"scripts\", \"_getItemGearScore for {} - {}\", proto->ItemId, proto->Name1);\n+\n+    std::remove_cvref_t<decltype(*std::cbegin(_stats))> istats{};\n+    //for (uint8 i = 0; i != MAX_BOT_ITEM_MOD; ++i)\n+    //    BOT_LOG_ERROR(\"scripts\", \"_getItemGearScore at {} {}\", uint32(i), istats[i]);\n+\n+    ScalingStatDistributionEntry const* ssd = proto->ScalingStatDistribution ? sScalingStatDistributionStore.LookupEntry(proto->ScalingStatDistribution) : NULL;\n+\n+    uint32 ssd_level = me->GetLevel();\n+    if (ssd && ssd_level > ssd->Maxlevel)\n+        ssd_level = ssd->Maxlevel;\n+\n+    ScalingStatValuesEntry const* ssv = proto->ScalingStatValue ? sScalingStatValuesStore.LookupEntry(ssd_level) : NULL;\n+\n+    for (auto i : NPCBots::index_array<uint8, MAX_ITEM_PROTO_STATS>)\n+    {\n+        uint32 statType = 0;\n+        int32  val      = 0;\n+        if (ssd && ssv)\n+        {\n+            if (ssd->StatID[i] < 0)\n+                continue;\n+            statType = ssd->StatID[i];\n+            val = (ssv->getssdMultiplier(proto->ScalingStatValue) * ssd->Bonus[i]) / 10000;\n+        }\n+        else\n+        {\n+            if (i >= proto->StatsCount)\n+                continue;\n+            statType = proto->ItemStat[i].ItemStatType;\n+            val = proto->ItemStat[i].ItemStatValue;\n+        }\n+\n+        if (val == 0)\n+            continue;\n+\n+        istats[statType] += val;\n+    }\n+\n+    istats[BOT_STAT_MOD_RESIST_HOLY] += proto->HolyRes;\n+    istats[BOT_STAT_MOD_RESIST_FIRE] += proto->FireRes;\n+    istats[BOT_STAT_MOD_RESIST_NATURE] += proto->NatureRes;\n+    istats[BOT_STAT_MOD_RESIST_FROST] += proto->FrostRes;\n+    istats[BOT_STAT_MOD_RESIST_SHADOW] += proto->ShadowRes;\n+    istats[BOT_STAT_MOD_RESIST_ARCANE] += proto->ArcaneRes;\n+\n+    istats[BOT_STAT_MOD_ARMOR] += proto->Armor;\n+    istats[BOT_STAT_MOD_BLOCK_VALUE] += proto->Block;\n+\n+    EquipmentInfo const* einfo = BotDataMgr::GetBotEquipmentInfo(me->GetEntry());\n+    if (forslot > BOT_SLOT_RANGED || proto->ItemId != einfo->ItemEntry[forslot])\n+    {\n+        if (ssv)\n+        {\n+            int32 extraDPS = ssv->getDPSMod(proto->ScalingStatValue);\n+            if (extraDPS)\n+            {\n+                float average = extraDPS * proto->Delay / 1000.0f;\n+                float mod = ssv->isTwoHand(proto->ScalingStatValue) ? 0.2f : 0.3f;\n+\n+                istats[BOT_STAT_MOD_DAMAGE_MIN] += (1.0f - mod) * average;\n+                istats[BOT_STAT_MOD_DAMAGE_MAX] += (1.0f + mod) * average;\n+            }\n+        }\n+        else\n+        {\n+            istats[BOT_STAT_MOD_DAMAGE_MIN] += proto->Damage[0].DamageMin + proto->Damage[1].DamageMin;\n+            istats[BOT_STAT_MOD_DAMAGE_MAX] += proto->Damage[0].DamageMax + proto->Damage[1].DamageMax;\n+        }\n+\n+        if (_botclass == BOT_CLASS_DRUID)\n+        {\n+            int32 dpsMod = 0;\n+            int32 feral_bonus = 0;\n+\n+            if (ssv)\n+            {\n+                dpsMod = ssv->getDPSMod(proto->ScalingStatValue);\n+                feral_bonus += ssv->getFeralBonus(proto->ScalingStatValue);\n+            }\n+\n+            feral_bonus += proto->getFeralBonus(dpsMod);\n+            if (feral_bonus)\n+                istats[BOT_STAT_MOD_FERAL_ATTACK_POWER] += feral_bonus;\n+        }\n+    }\n+\n+    if (item)\n+    {\n+        for (auto e_slot : NPCBots::index_array<uint8, MAX_ENCHANTMENT_SLOT>)\n+        {\n+            uint32 enchant_id = item->GetEnchantmentId(EnchantmentSlot(e_slot));\n+            if (!enchant_id)\n+                continue;\n+\n+            SpellItemEnchantmentEntry const* pEnchant = sSpellItemEnchantmentStore.LookupEntry(enchant_id);\n+            if (!pEnchant)\n+                continue;\n+\n+            for (auto s : NPCBots::index_array<uint8, MAX_ITEM_ENCHANTMENT_EFFECTS>)\n+            {\n+                uint32 enchant_display_type = pEnchant->Effect[s];\n+                uint32 enchant_amount = pEnchant->EffectPointsMin[s];\n+                uint32 enchant_spell_id = pEnchant->EffectArg[s];\n+\n+                switch (enchant_display_type)\n+                {\n+                    case ITEM_ENCHANTMENT_TYPE_DAMAGE:\n+                        istats[BOT_STAT_MOD_DAMAGE_MIN] += enchant_amount;\n+                        istats[BOT_STAT_MOD_DAMAGE_MAX] += enchant_amount;\n+                        break;\n+                    case ITEM_ENCHANTMENT_TYPE_RESISTANCE:\n+                        if (!enchant_amount)\n+                        {\n+                            ItemRandomSuffixEntry const* item_rand = sItemRandomSuffixStore.LookupEntry(abs(item->GetItemRandomPropertyId()));\n+                            if (item_rand)\n+                            {\n+                                for (auto k : NPCBots::index_array<uint8, MAX_ITEM_ENCHANTMENT_EFFECTS>)\n+                                {\n+                                    if (item_rand->Enchantment[k] == enchant_id)\n+                                    {\n+                                        enchant_amount = uint32((item_rand->AllocationPct[k] * item->GetItemSuffixFactor()) / 10000);\n+                                        break;\n+                                    }\n+                                }\n+                            }\n+                        }\n+                        istats[BOT_STAT_MOD_RESISTANCE_START + enchant_spell_id] += enchant_amount;\n+                        break;\n+                    case ITEM_ENCHANTMENT_TYPE_STAT:\n+                    {\n+                        if (!enchant_amount)\n+                        {\n+                            ItemRandomSuffixEntry const* item_rand_suffix = sItemRandomSuffixStore.LookupEntry(abs(item->GetItemRandomPropertyId()));\n+                            if (item_rand_suffix)\n+                            {\n+                                for (auto k : NPCBots::index_array<uint8, MAX_ITEM_ENCHANTMENT_EFFECTS>)\n+                                {\n+                                    if (item_rand_suffix->Enchantment[k] == enchant_id)\n+                                    {\n+                                        enchant_amount = uint32((item_rand_suffix->AllocationPct[k] * item->GetItemSuffixFactor()) / 10000);\n+                                        break;\n+                                    }\n+                                }\n+                            }\n+                        }\n+\n+                        switch (enchant_spell_id)\n+                        {\n+                            case ITEM_MOD_MANA:\n+                            case ITEM_MOD_HEALTH:\n+                            case ITEM_MOD_AGILITY:\n+                            case ITEM_MOD_STRENGTH:\n+                            case ITEM_MOD_INTELLECT:\n+                            case ITEM_MOD_SPIRIT:\n+                            case ITEM_MOD_STAMINA:\n+                            case ITEM_MOD_DEFENSE_SKILL_RATING:\n+                            case ITEM_MOD_DODGE_RATING:\n+                            case ITEM_MOD_PARRY_RATING:\n+                            case ITEM_MOD_BLOCK_RATING:\n+                            case ITEM_MOD_HIT_MELEE_RATING:\n+                            case ITEM_MOD_HIT_RANGED_RATING:\n+                            case ITEM_MOD_HIT_SPELL_RATING:\n+                            case ITEM_MOD_CRIT_MELEE_RATING:\n+                            case ITEM_MOD_CRIT_RANGED_RATING:\n+                            case ITEM_MOD_CRIT_SPELL_RATING:\n+                            case ITEM_MOD_HASTE_MELEE_RATING:\n+                            case ITEM_MOD_HASTE_RANGED_RATING:\n+                            case ITEM_MOD_HASTE_SPELL_RATING:\n+                            case ITEM_MOD_HIT_RATING:\n+                            case ITEM_MOD_CRIT_RATING:\n+                            case ITEM_MOD_HASTE_RATING:\n+                            case ITEM_MOD_RESILIENCE_RATING:\n+                            case ITEM_MOD_EXPERTISE_RATING:\n+                            case ITEM_MOD_ATTACK_POWER:\n+                            case ITEM_MOD_RANGED_ATTACK_POWER:\n+                            case ITEM_MOD_MANA_REGENERATION:\n+                            case ITEM_MOD_ARMOR_PENETRATION_RATING:\n+                            case ITEM_MOD_SPELL_POWER:\n+                            case ITEM_MOD_HEALTH_REGEN:\n+                            case ITEM_MOD_SPELL_PENETRATION:\n+                            case ITEM_MOD_BLOCK_VALUE:\n+                                istats[enchant_spell_id] += enchant_amount;\n+                                break;\n+                            default:\n+                                break;\n+                        }\n+                        break;\n+                    }\n+                }\n+            }\n+        }\n+    }\n+\n+    //for (uint8 i = 0; i != MAX_BOT_ITEM_MOD; ++i)\n+    //    BOT_LOG_ERROR(\"scripts\", \"_getItemGearScore total {} {}\", uint32(i), istats[i]);\n+\n+    //stats are fetched, not calculate\n+    float itemScore = 0.0f;\n+\n+    for (auto i : NPCBots::index_array<uint8, MAX_BOT_ITEM_MOD>)\n+        itemScore += istats[i] * _getStatScore(i);\n+\n+    float itemGearScore = CalculateItemGearScore(iproto, me->GetEntry(), me->GetLevel(), GetBotClass(), GetSpec(), forslot);\n+    itemScore += itemGearScore;\n+\n+    //BOT_LOG_ERROR(\"scripts\", \"_getItemGearScore total score {}\", itemScore);\n+    return itemScore;\n+}\n+\n+void bot_ai::_saveStats()\n+{\n+    NpcBotStats stats{\n+        .entry = me->GetEntry(),\n+        .maxhealth = me->GetMaxHealth(),\n+        .maxpower = me->GetMaxPower(_botclass == BOT_CLASS_DRUID ? POWER_MANA : me->GetPowerType()),\n+        .strength = static_cast<uint32>(0.5f + GetTotalBotStat(BOT_STAT_MOD_STRENGTH)),\n+        .agility = static_cast<uint32>(0.5f + GetTotalBotStat(BOT_STAT_MOD_AGILITY)),\n+        .stamina = static_cast<uint32>(0.5f + GetTotalBotStat(BOT_STAT_MOD_STAMINA)),\n+        .intellect = static_cast<uint32>(0.5f + GetTotalBotStat(BOT_STAT_MOD_INTELLECT)),\n+        .spirit = static_cast<uint32>(0.5f + GetTotalBotStat(BOT_STAT_MOD_SPIRIT)),\n+        .armor = me->GetArmor(),\n+        .defense = me->GetDefenseSkillValue(),\n+        .resHoly = static_cast<uint32>(std::max<int32>(0, me->GetResistance(SPELL_SCHOOL_HOLY) + resistbonus[SPELL_SCHOOL_HOLY-1])),\n+        .resFire = static_cast<uint32>(std::max<int32>(0, me->GetResistance(SPELL_SCHOOL_FIRE) + resistbonus[SPELL_SCHOOL_FIRE-1])),\n+        .resNature = static_cast<uint32>(std::max<int32>(0, me->GetResistance(SPELL_SCHOOL_NATURE) + resistbonus[SPELL_SCHOOL_NATURE-1])),\n+        .resFrost = static_cast<uint32>(std::max<int32>(0, me->GetResistance(SPELL_SCHOOL_FROST) + resistbonus[SPELL_SCHOOL_FROST-1])),\n+        .resShadow = static_cast<uint32>(std::max<int32>(0, me->GetResistance(SPELL_SCHOOL_SHADOW) + resistbonus[SPELL_SCHOOL_SHADOW-1])),\n+        .resArcane = static_cast<uint32>(std::max<int32>(0, me->GetResistance(SPELL_SCHOOL_ARCANE) + resistbonus[SPELL_SCHOOL_ARCANE-1])),\n+        .blockPct = me->GetUnitBlockChance(BASE_ATTACK, me),\n+        .dodgePct = me->GetUnitDodgeChance(BASE_ATTACK, me),\n+        .parryPct = me->GetUnitParryChance(BASE_ATTACK, me),\n+        .critPct = crit + me->GetTotalAuraModifier(SPELL_AURA_MOD_WEAPON_CRIT_PERCENT) + me->GetTotalAuraModifier(SPELL_AURA_MOD_CRIT_PCT),\n+        .attackPower = static_cast<uint32>(0.5f + me->GetTotalAttackPowerValue(BASE_ATTACK)),\n+        .spellPower = static_cast<uint32>(std::max<int32>(0, me->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_MAGIC))),\n+        .spellPen = spellpen,\n+        .hastePct = std::max<float>(haste, 0.f),\n+        .hitBonusPct = std::max<float>(hit, 0.f),\n+        .expertise = expertise,\n+        .armorPenPct = me->GetCreatureArmorPenetrationCoef()\n+    };\n+\n+    BotDataMgr::SaveNpcBotStats(stats);\n+}\n+\n+//!Copied from Player::CastItemUseSpell\n+void bot_ai::_castBotItemUseSpell(Item const* item, SpellCastTargets const& targets/*, uint8 cast_count, uint32 glyphIndex*/)\n+{\n+    ItemTemplate const* proto = item->GetTemplate();\n+\n+    // use triggered flag only for items with many spell casts and for not first cast\n+    uint8 count = 0;\n+\n+    // item spells casted at use\n+    SpellInfo const* spellInfo;\n+    for (auto i : NPCBots::index_array<uint8, MAX_ITEM_PROTO_SPELLS>)\n+    {\n+        _Spell const& spellData = proto->Spells[i];\n+        if (!spellData.SpellId || spellData.SpellTrigger != ITEM_SPELLTRIGGER_ON_USE)\n+            continue;\n+\n+        spellInfo = sSpellMgr->GetSpellInfo(spellData.SpellId);\n+        if (!spellInfo)\n+            continue;\n+\n+        Spell* spell = new Spell(me, spellInfo, (count > 0) ? TRIGGERED_FULL_MASK : TRIGGERED_NONE);\n+        //spell->m_CastItem = item; // DO NOT TAKE ITEM\n+        //spell->m_cast_count = cast_count;                   // set count of casts\n+        //spell->m_glyphIndex = glyphIndex;                   // glyph index\n+        spell->prepare(targets);\n+        ++count;\n+    }\n+\n+    // Item enchantments spells casted at use\n+    for (auto e_slot : NPCBots::index_array<uint8, MAX_ENCHANTMENT_SLOT>)\n+    {\n+        uint32 enchant_id = item->GetEnchantmentId(EnchantmentSlot(e_slot));\n+        SpellItemEnchantmentEntry const* pEnchant = sSpellItemEnchantmentStore.LookupEntry(enchant_id);\n+        if (!pEnchant)\n+            continue;\n+\n+        for (auto s : NPCBots::index_array<uint8, MAX_ITEM_ENCHANTMENT_EFFECTS>)\n+        {\n+            if (pEnchant->Effect[s] != ITEM_ENCHANTMENT_TYPE_USE_SPELL)\n+                continue;\n+\n+            spellInfo = sSpellMgr->GetSpellInfo(pEnchant->EffectArg[s]);\n+            if (!spellInfo)\n+                continue;\n+\n+            Spell* spell = new Spell(me, spellInfo, (count > 0) ? TRIGGERED_FULL_MASK : TRIGGERED_NONE);\n+            //spell->m_CastItem = item; // DO NOT TAKE ITEM\n+            //spell->m_cast_count = cast_count;               // set count of casts\n+            //spell->m_glyphIndex = glyphIndex;               // glyph index\n+            spell->prepare(targets);\n+            ++count;\n+        }\n+    }\n+}\n+\n+Item* bot_ai::GetEquipsByGuid(ObjectGuid itemGuid) const\n+{\n+    auto ci = std::ranges::find_if(_equips, [itemGuid](Item const* item) {\n+        return item && item->GetGUID() == itemGuid;\n+    });\n+\n+    return ci != std::cend(_equips) ? *ci : nullptr;\n+}\n+\n+uint32 bot_ai::GetEquipDisplayId(uint8 slot) const\n+{\n+    int32 displayId = -1;\n+    if (_equips[slot])\n+    {\n+        NpcBotTransmogData const* transmogData = BotDataMgr::SelectNpcBotTransmogs(me->GetEntry());\n+        if (transmogData && BotCfg::IsTransmogEnabled() &&\n+            (_equips[slot]->GetTemplate()->ItemId == transmogData->transmogs[slot].first || BotCfg::TransmogUseEquipmentSlots()))\n+        {\n+            int32 item_id = transmogData->transmogs[slot].second;\n+            if (item_id > 0)\n+            {\n+                if (ItemTemplate const* proto = sObjectMgr->GetItemTemplate(uint32(item_id)))\n+                {\n+                    displayId = proto->DisplayInfoID;\n+                }\n+                else\n+                {\n+                    BOT_LOG_ERROR(\"scripts\", \"bot_ai::GetEquipDisplayId(): invalid item Id {} for bot {} {} slot {}\",\n+                        item_id, me->GetEntry(), me->GetName(), uint32(slot));\n+                }\n+            }\n+            else\n+                displayId = item_id;\n+        }\n+        if (displayId == -1)\n+            displayId = int32(_equips[slot]->GetTemplate()->DisplayInfoID);\n+    }\n+\n+    return uint32(std::max<int32>(displayId, 0));\n+}\n+\n+BotEquipResult bot_ai::UnEquipAll(ObjectGuid receiver, bool store_to_bank)\n+{\n+    uint8 items_to_store_count = GetRealEquippedItemsCount();\n+    if (!items_to_store_count)\n+        return BotEquipResult::BOT_EQUIP_RESULT_OK;\n+\n+    if (store_to_bank)\n+    {\n+        if (!receiver || IAmFree())\n+            return BotEquipResult::BOT_EQUIP_RESULT_FAIL_NO_RECEIVER;\n+        if (!receiver.IsPlayer())\n+            return BotEquipResult::BOT_EQUIP_RESULT_FAIL_INVALID_RECEIVER;\n+        if (receiver.GetCounter() != _botData->owner)\n+            return BotEquipResult::BOT_EQUIP_RESULT_FAIL_INVALID_RECEIVER;\n+        if (!BotDataMgr::CanDepositBotBankItemsCount(receiver, items_to_store_count))\n+            return BotEquipResult::BOT_EQUIP_RESULT_FAIL_NO_BANK_SPACE;\n+    }\n+\n+    BotEquipResult suc = BotEquipResult::BOT_EQUIP_RESULT_OK;\n+    for (auto i : NPCBots::index_array<uint8, BOT_INVENTORY_SIZE>)\n+    {\n+        BotEquipResult slot_result = i <= BOT_SLOT_RANGED ? _resetEquipment(i, receiver, store_to_bank) : _unequip(i, receiver, store_to_bank);\n+        if (slot_result != BotEquipResult::BOT_EQUIP_RESULT_OK)\n+        {\n+            suc = slot_result;\n+            break;\n+        }\n+    }\n+\n+    return suc;\n+}\n+\n+uint8 bot_ai::GetRealEquippedItemsCount() const\n+{\n+    EquipmentInfo const* einfo = BotDataMgr::GetBotEquipmentInfo(me->GetEntry());\n+    return std::ranges::count_if(NPCBots::index_array<uint8, BOT_INVENTORY_SIZE>, [=, this](uint8 i) {\n+        return GetEquips(i) && (i > BOT_SLOT_RANGED || einfo->ItemEntry[i] != GetEquips(i)->GetEntry());\n+    });\n+}\n+\n+float bot_ai::GetAverageItemLevel() const\n+{\n+    float sum = 0.f;\n+    uint32 count = 0;\n+    for (auto i : NPCBots::index_array<uint8, BOT_INVENTORY_SIZE>)\n+    {\n+        if (_equips[i] && !(/*i == BOT_SLOT_TABARD || */i == BOT_SLOT_OFFHAND || i == BOT_SLOT_RANGED || i == BOT_SLOT_BODY))\n+        {\n+            if (ItemTemplate const* itemProto = _equips[i]->GetTemplate())\n+            {\n+                ++count;\n+                sum += itemProto->GetItemLevelIncludingQuality();\n+            }\n+        }\n+    }\n+\n+    return !count ? 0.f : (sum / float(count));\n+}\n+std::pair<float, float> bot_ai::GetBotGearScores() const\n+{\n+    return CalculateBotGearScore(me->GetEntry(), me->GetLevel(), GetBotClass(), GetSpec(), _equips.data());\n+}\n+/////////\n+//ROLES//\n+/////////\n+GossipOptionIcon bot_ai::GetRoleIcon(uint32 role) const\n+{\n+    return HasRole(role) ? BOT_ICON_ON : BOT_ICON_OFF;\n+}\n+\n+uint32 bot_ai::GetRoleString(uint32 role)\n+{\n+    switch (role)\n+    {\n+        case BOT_ROLE_TANK:                 return BOT_TEXT_TANK;\n+        case BOT_ROLE_TANK_OFF:             return BOT_TEXT_TANK_OFF;\n+        case BOT_ROLE_DPS:                  return BOT_TEXT_DPS;\n+        case BOT_ROLE_HEAL:                 return BOT_TEXT_HEAL;\n+        case BOT_ROLE_RANGED:               return BOT_TEXT_RANGED;\n+        case BOT_ROLE_GATHERING_MINING:     return BOT_TEXT_MINER;\n+        case BOT_ROLE_GATHERING_HERBALISM:  return BOT_TEXT_HERBALIST;\n+        case BOT_ROLE_GATHERING_SKINNING:   return BOT_TEXT_SKINNER;\n+        case BOT_ROLE_GATHERING_ENGINEERING:return BOT_TEXT_ENGINEER;\n+        case BOT_ROLE_AUTOLOOT:             return BOT_TEXT_LOOTING;\n+        case BOT_ROLE_AUTOLOOT_POOR:        return BOT_TEXT_POOR;\n+        case BOT_ROLE_AUTOLOOT_COMMON:      return BOT_TEXT_COMMON;\n+        case BOT_ROLE_AUTOLOOT_UNCOMMON:    return BOT_TEXT_UNCOMMON;\n+        case BOT_ROLE_AUTOLOOT_RARE:        return BOT_TEXT_RARE;\n+        case BOT_ROLE_AUTOLOOT_EPIC:        return BOT_TEXT_EPIC;\n+        case BOT_ROLE_AUTOLOOT_LEGENDARY:   return BOT_TEXT_LEGENDARY;\n+        default:                            return BOT_TEXT_UNKNOWN;\n+    }\n+}\n+\n+void bot_ai::ToggleRole(uint32 role, bool force)\n+{\n+    if (!force && roleTimer > lastdiff)\n+        return;\n+\n+    roleTimer = 350; //delay next attempt (prevent abuse)\n+\n+    if (HasRole(role))\n+    {\n+        //linked roles\n+        if (role & BOT_ROLE_TANK)\n+            role |= BOT_ROLE_TANK_OFF;\n+\n+        _roleMask &= ~role;\n+    }\n+    else\n+    {\n+        //linked roles\n+        if (role & BOT_ROLE_TANK_OFF)\n+            role |= BOT_ROLE_TANK;\n+\n+        _roleMask |= role;\n+    }\n+\n+    BotDataMgr::UpdateNpcBotData(me->GetEntry(), NPCBOT_UPDATE_ROLES, &_roleMask);\n+\n+    //Update passives\n+    shouldUpdateStats = true;\n+}\n+\n+uint32 bot_ai::DefaultRolesForClass(uint8 m_class, uint8 spec)\n+{\n+    uint32 roleMask = BOT_ROLE_DPS;\n+\n+    //if (bot_ai::IsHealingClass(m_class))\n+    //    roleMask |= BOT_ROLE_HEAL;\n+\n+    if (!bot_ai::IsMeleeClass(m_class))\n+    {\n+        switch (spec)\n+        {\n+            case BOT_SPEC_SHAMAN_ENHANCEMENT:\n+            case BOT_SPEC_DRUID_FERAL:\n+                break;\n+            default:\n+                roleMask |= BOT_ROLE_RANGED;\n+                break;\n+        }\n+    }\n+\n+    return roleMask;\n+}\n+\n+bool bot_ai::IsTank(Unit const* unit) const\n+{\n+    if (!unit || unit == me)\n+        return HasRole(BOT_ROLE_TANK);\n+\n+    if (Creature const* bot = unit->ToCreature())\n+        return bot->GetBotAI() && bot->GetBotAI()->HasRole(BOT_ROLE_TANK);\n+\n+    if (Player const* player = unit->ToPlayer())\n+    {\n+        if (Group const* gr = player->GetGroup())\n+        {\n+            if (gr->GetMemberFlags(unit->GetGUID()) & (MEMBER_FLAG_MAINTANK | MEMBER_FLAG_MAINASSIST))\n+                return true;\n+            if (gr->isLFGGroup() && sLFGMgr->GetRoles(unit->GetGUID()) & lfg::PLAYER_ROLE_TANK)\n+                return true;\n+        }\n+        switch (player->GetClass())\n+        {\n+            case CLASS_WARRIOR:\n+                if (player->GetShield() && Bcore::Helpers::Entity::GetPlayerSpecialization(player) == SPEC_WARRIOR_PROTECTION)\n+                    return true;\n+                break;\n+            case CLASS_PALADIN:\n+                if (player->GetShield() && Bcore::Helpers::Entity::GetPlayerSpecialization(player) == SPEC_PALADIN_PROTECTION)\n+                    return true;\n+                break;\n+            case CLASS_DRUID:\n+                if ((player->GetShapeshiftForm() == FORM_BEAR || player->GetShapeshiftForm() == FORM_DIREBEAR) &&\n+                    Bcore::Helpers::Entity::GetPlayerSpecialization(player) == SPEC_DRUID_FERAL)\n+                    return true;\n+                break;\n+            case CLASS_DEATH_KNIGHT:\n+                if (player->GetAuraEffect(SPELL_AURA_MOD_THREAT, SPELLFAMILY_DEATHKNIGHT, 0x8000, 0x0, 0x0) && player->GetRatingBonusValue(CR_DEFENSE_SKILL) > 0.0f)\n+                    return true;\n+                break;\n+            default:\n+                break;\n+        }\n+    }\n+\n+    return false;\n+}\n+\n+bool bot_ai::IsOffTank(Unit const* unit) const\n+{\n+    if (!unit || unit == me)\n+        return HasRole(BOT_ROLE_TANK_OFF);\n+\n+    if (Creature const* bot = unit->ToCreature())\n+        return bot->GetBotAI() && bot->GetBotAI()->HasRole(BOT_ROLE_TANK_OFF);\n+\n+    if (Player const* player = unit->ToPlayer())\n+    {\n+        if (Group const* gr = player->GetGroup())\n+        {\n+            if (gr->GetMemberFlags(unit->GetGUID()) & MEMBER_FLAG_MAINASSIST)\n+                return true;\n+        }\n+        switch (player->GetClass())\n+        {\n+            case CLASS_WARRIOR:\n+                if (player->GetShield() && Bcore::Helpers::Entity::GetPlayerSpecialization(player) == SPEC_WARRIOR_PROTECTION)\n+                    return true;\n+                break;\n+            case CLASS_PALADIN:\n+                if (player->GetShield() && Bcore::Helpers::Entity::GetPlayerSpecialization(player) == SPEC_PALADIN_PROTECTION)\n+                    return true;\n+                break;\n+            case CLASS_DRUID:\n+                if ((player->GetShapeshiftForm() == FORM_BEAR || player->GetShapeshiftForm() == FORM_DIREBEAR) &&\n+                    Bcore::Helpers::Entity::GetPlayerSpecialization(player) == SPEC_DRUID_FERAL)\n+                    return true;\n+                break;\n+            case CLASS_DEATH_KNIGHT:\n+                if (player->GetAuraEffect(SPELL_AURA_MOD_THREAT, SPELLFAMILY_DEATHKNIGHT, 0x8000, 0x0, 0x0) && player->GetRatingBonusValue(CR_DEFENSE_SKILL) > 0.0f)\n+                    return true;\n+                break;\n+            default:\n+                break;\n+        }\n+    }\n+\n+    return false;\n+}\n+\n+bool bot_ai::CCed(Unit const* target, bool root)\n+{\n+    return target ? target->HasUnitState(UNIT_STATE_CONFUSED | UNIT_STATE_STUNNED | UNIT_STATE_FLEEING | UNIT_STATE_DISTRACTED | UNIT_STATE_CONFUSED_MOVE | UNIT_STATE_FLEEING_MOVE) || (root && (target->HasUnitState(UNIT_STATE_ROOT) || target->IsFrozen() || target->IsRooted())) : true;\n+}\n+//AI initialization common\n+//Called at ai reset, level change (spawned = true)\n+void bot_ai::DefaultInit()\n+{\n+    //only once\n+    if (spawned)\n+        return;\n+\n+    spawned = true;\n+\n+    if (!firstspawn)\n+    {\n+        me->RemoveAllAurasExceptType(SPELL_AURA_CONTROL_VEHICLE);\n+        RemoveItemClassEnchantments(); //clear rogue poisons / shaman ecnhants\n+        ApplyItemsSpells(); //restore item equip spells\n+    }\n+    else\n+    {\n+        InitRace();\n+        ASSERT(!me->GetBotAI());\n+        ASSERT(!me->GetBotPetAI());\n+        me->SetBotAI(this);\n+        BotLogger::Log(NPCBOT_LOG_SPAWN, me);\n+    }\n+\n+    me->SetPvP(master->IsPvP() || IsWanderer());\n+    if (sWorld->IsFFAPvPRealm())\n+        me->SetByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_FFA_PVP);\n+    else if (IAmFree())\n+        me->SetByteFlag(UNIT_FIELD_BYTES_2, 1, 0);\n+\n+    InitSpec();\n+    InitRoles();\n+\n+    if (IsWanderer())\n+    {\n+        _travel_node_cur = ASSERT_NOTNULL(GetClosestWanderNode());\n+        if (firstspawn && BotMgr::IsWanderingWorldBot(me))\n+            StartPotionTimer();\n+    }\n+\n+    SetStats(true); // Class passives included\n+\n+    if (!IsTempBot())\n+        ApplyRacials();\n+\n+    if (firstspawn)\n+    {\n+        if (!IsTempBot())\n+        {\n+            InitFaction();\n+            InitEquips();\n+            InitMiscValues();\n+        }\n+\n+        firstspawn = false;\n+    }\n+}\n+\n+void bot_ai::ApplyRacials()\n+{\n+    uint8 myrace = me->GetRace();\n+    switch (myrace)\n+    {\n+        case RACE_HUMAN:\n+            RefreshAura(20598); //Human Spirit\n+            RefreshAura(20864); //Mace Specialization\n+            RefreshAura(20597); //Sword Specialization\n+            //RefreshAura(58985); //Perception pointless\n+            if (firstspawn)\n+                InitSpellMap(RACIAL_EVERY_MAN_FOR_HIMSELF, true, false);\n+            break;\n+        case RACE_ORC:\n+            RefreshAura(20573); //Hardiness\n+            RefreshAura(20574); //Axe Specialization\n+            //Blood Fury\n+            if (firstspawn)\n+                InitSpellMap(RaceSpellForClass(myrace, _botclass), true, false);\n+            break;\n+        case RACE_DWARF:\n+            RefreshAura(20595); //Gun Specialization\n+            RefreshAura(59224); //Mace Specialization\n+            RefreshAura(20596); //Frost Resistance\n+            if (firstspawn)\n+                InitSpellMap(RACIAL_STONEFORM, true, false);\n+            break;\n+        case RACE_NIGHTELF:\n+            RefreshAura(20583); //Nature Resistance\n+            RefreshAura(20582); //Quickness\n+            InitSpellMap(RACIAL_SHADOWMELD, true, false);\n+            break;\n+        case RACE_UNDEAD_PLAYER:\n+            RefreshAura(20579); //Shadow Resistance\n+            if (firstspawn)\n+                InitSpellMap(RACIAL_WILL_OF_THE_FORSAKEN, true, false);\n+            //cannibalize is skipped\n+            break;\n+        case RACE_TAUREN:\n+            RefreshAura(20550); //Endurance\n+            RefreshAura(20551); //Nature Resistance\n+            if (firstspawn)\n+                InitSpellMap(RACIAL_WARSTOMP, true, false);\n+            break;\n+        case RACE_GNOME:\n+            RefreshAura(20592); //Arcane Resistance\n+            RefreshAura(20591); //Expansive Mind\n+            if (firstspawn)\n+                InitSpellMap(RACIAL_ESCAPE_ARTIST, true, false);\n+            break;\n+        case RACE_TROLL:\n+            RefreshAura(20557); //Beast Slaying\n+            RefreshAura(20558); //Thrown Specialization\n+            RefreshAura(26290); //Bow Specialization\n+            RefreshAura(58943); //Da Voodoo Shuffle\n+            RefreshAura(20555); //Regeneration\n+            if (firstspawn)\n+                InitSpellMap(RACIAL_BERSERKING, true, false);\n+            break;\n+        case RACE_BLOODELF:\n+            RefreshAura(822); //Magic Resistance\n+            if (firstspawn)\n+                InitSpellMap(RaceSpellForClass(myrace, _botclass), true, false);\n+            break;\n+        case RACE_DRAENEI:\n+            RefreshAura(6562, uint8(!IAmFree())); //Heroic Presence (28878 is not present)\n+            RefreshAura(20579); //Shadow Resistance (universal since creatures do not lose cast time on damage anyways)\n+            if (firstspawn)\n+                InitSpellMap(RaceSpellForClass(myrace, _botclass), true, false);\n+            break;\n+        default:\n+            //BOT_LOG_ERROR(\"entities.player\", \"bot_ai::ApplyRacePassives(): unknown race {} for bot {} ({})\", uint32(me->GetRace()), me->GetName(), me->GetEntry());\n+            return;\n+    }\n+}\n+\n+void bot_ai::InitFaction()\n+{\n+    uint32 faction = _botData->faction;\n+\n+    //if (faction == FACTION_TEMPLATE_HATES_EVERYTHING_1)\n+    //    faction = 35;\n+\n+    me->SetFaction(faction);\n+    if (botPet)\n+        botPet->SetFaction(faction);\n+    const_cast<CreatureTemplate*>(me->GetCreatureTemplate())->faction = faction;\n+}\n+\n+void bot_ai::InitRace()\n+{\n+    me->SetByteValue(UNIT_FIELD_BYTES_0, 0, _botExtras->race); //set race\n+}\n+\n+void bot_ai::InitRoles()\n+{\n+    if (IsTempBot())\n+    {\n+        _roleMask = BOT_ROLE_DPS;\n+        return;\n+    }\n+    else if (IAmFree())\n+    {\n+        //default roles\n+        _roleMask = DefaultRolesForClass(_botclass, GetSpec());\n+        return;\n+    }\n+\n+    _roleMask = _botData->roles;\n+}\n+\n+void bot_ai::InitSpec()\n+{\n+    uint8 spec;\n+    if (IAmFree())\n+        spec = SelectSpecForClass(_botclass);\n+    else\n+    {\n+        spec = _botData->spec;\n+    }\n+\n+    //BOT_LOG_ERROR(\"entities.unit\", \"bot_ai::InitSpec(): bot {} class {} spec: {}\", me->GetEntry(), uint32(_botclass), uint32(spec));\n+\n+    if (spec < BOT_SPEC_BEGIN || spec > BOT_SPEC_END)\n+    {\n+        BOT_LOG_ERROR(\"entities.unit\", \"bot_ai::InitSpec(): spec ({}) is out of range for bot {}! Falling to default (1)...\",\n+            uint32(spec), me->GetEntry());\n+\n+        spec = BOT_SPEC_DEFAULT;\n+    }\n+\n+    SetSpec(spec, false);\n+}\n+\n+void bot_ai::SetSpec(uint8 spec, bool activate)\n+{\n+    ASSERT(spec >= BOT_SPEC_BEGIN && spec <= BOT_SPEC_END);\n+\n+    _spec = spec;\n+\n+    if (activate)\n+    {\n+        BotDataMgr::UpdateNpcBotData(me->GetEntry(), NPCBOT_UPDATE_SPEC, &spec);\n+\n+        UnsummonAll(false);\n+        removeShapeshiftForm();\n+        //from DefaultInit\n+        me->RemoveAllAurasExceptType(SPELL_AURA_CONTROL_VEHICLE);\n+        //RemoveItemClassEnchants();\n+        ApplyItemsSpells();\n+        ApplyRacials();\n+        //from SetStats\n+        //InitPowers();\n+        InitSpells();\n+        ApplyClassPassives();\n+        InitHeals();\n+\n+        me->SetPower(POWER_MANA, 0);\n+        me->SetPower(POWER_RAGE, 0);\n+        me->SetPower(POWER_ENERGY, 0);\n+    }\n+}\n+\n+uint8 bot_ai::GetSpec() const\n+{\n+    return me->GetLevel() < 10 ? uint8(BOT_SPEC_DEFAULT) : _spec;\n+}\n+\n+uint8 bot_ai::SelectSpecForClass(uint8 m_class)\n+{\n+    std::vector<uint8> specs;\n+    specs.reserve(3);\n+    switch (m_class)\n+    {\n+        case BOT_CLASS_WARRIOR: //any\n+            specs.push_back(BOT_SPEC_WARRIOR_ARMS);\n+            specs.push_back(BOT_SPEC_WARRIOR_FURY);\n+            specs.push_back(BOT_SPEC_WARRIOR_PROTECTION);\n+            break;\n+        case BOT_CLASS_PALADIN: //retri\n+            specs.push_back(BOT_SPEC_PALADIN_RETRIBUTION);\n+            break;\n+        case BOT_CLASS_HUNTER: //any\n+            specs.push_back(BOT_SPEC_HUNTER_BEASTMASTERY);\n+            specs.push_back(BOT_SPEC_HUNTER_MARKSMANSHIP);\n+            specs.push_back(BOT_SPEC_HUNTER_SURVIVAL);\n+            break;\n+        case BOT_CLASS_ROGUE: //any\n+            specs.push_back(BOT_SPEC_ROGUE_ASSASINATION);\n+            specs.push_back(BOT_SPEC_ROGUE_COMBAT);\n+            specs.push_back(BOT_SPEC_ROGUE_SUBTLETY);\n+            break;\n+        case BOT_CLASS_PRIEST: //discipline, shadow\n+            specs.push_back(BOT_SPEC_PRIEST_DISCIPLINE);\n+            specs.push_back(BOT_SPEC_PRIEST_SHADOW);\n+            break;\n+        case BOT_CLASS_DEATH_KNIGHT: //any\n+            specs.push_back(BOT_SPEC_DK_BLOOD);\n+            specs.push_back(BOT_SPEC_DK_FROST);\n+            specs.push_back(BOT_SPEC_DK_UNHOLY);\n+            break;\n+        case BOT_CLASS_SHAMAN: //elem, enh\n+            specs.push_back(BOT_SPEC_SHAMAN_ELEMENTAL);\n+            specs.push_back(BOT_SPEC_SHAMAN_ENHANCEMENT);\n+            break;\n+        case BOT_CLASS_MAGE: //fire, frost\n+            specs.push_back(BOT_SPEC_MAGE_FIRE);\n+            specs.push_back(BOT_SPEC_MAGE_FROST);\n+            break;\n+        case BOT_CLASS_WARLOCK: //affli, destr\n+            specs.push_back(BOT_SPEC_WARLOCK_AFFLICTION);\n+            specs.push_back(BOT_SPEC_WARLOCK_DESTRUCTION);\n+            break;\n+        case BOT_CLASS_DRUID: //balance, feral\n+            specs.push_back(BOT_SPEC_DRUID_BALANCE);\n+            specs.push_back(BOT_SPEC_DRUID_FERAL);\n+            break;\n+        default:\n+            specs.push_back(BOT_SPEC_DEFAULT);\n+            break;\n+    }\n+\n+    return specs.size() == 1 ? specs.front() : Bcore::Containers::SelectRandomContainerElement(specs);\n+}\n+\n+uint32 bot_ai::TextForSpec(uint8 spec)\n+{\n+    switch (spec)\n+    {\n+        case BOT_SPEC_WARRIOR_ARMS:         return BOT_TEXT_SPEC_ARMS;\n+        case BOT_SPEC_WARRIOR_FURY:         return BOT_TEXT_SPEC_FURY;\n+        case BOT_SPEC_WARRIOR_PROTECTION:   return BOT_TEXT_SPEC_PROTECTION;\n+        case BOT_SPEC_PALADIN_HOLY:         return BOT_TEXT_SPEC_HOLY;\n+        case BOT_SPEC_PALADIN_PROTECTION:   return BOT_TEXT_SPEC_PROTECTION;\n+        case BOT_SPEC_PALADIN_RETRIBUTION:  return BOT_TEXT_SPEC_RETRIBUTION;\n+        case BOT_SPEC_HUNTER_BEASTMASTERY:  return BOT_TEXT_SPEC_BEASTMASTERY;\n+        case BOT_SPEC_HUNTER_MARKSMANSHIP:  return BOT_TEXT_SPEC_MARKSMANSHIP;\n+        case BOT_SPEC_HUNTER_SURVIVAL:      return BOT_TEXT_SPEC_SURVIVAL;\n+        case BOT_SPEC_ROGUE_ASSASINATION:   return BOT_TEXT_SPEC_ASSASINATION;\n+        case BOT_SPEC_ROGUE_COMBAT:         return BOT_TEXT_SPEC_COMBAT;\n+        case BOT_SPEC_ROGUE_SUBTLETY:       return BOT_TEXT_SPEC_SUBTLETY;\n+        case BOT_SPEC_PRIEST_DISCIPLINE:    return BOT_TEXT_SPEC_DISCIPLINE;\n+        case BOT_SPEC_PRIEST_HOLY:          return BOT_TEXT_SPEC_HOLY;\n+        case BOT_SPEC_PRIEST_SHADOW:        return BOT_TEXT_SPEC_SHADOW;\n+        case BOT_SPEC_DK_BLOOD:             return BOT_TEXT_SPEC_BLOOD;\n+        case BOT_SPEC_DK_FROST:             return BOT_TEXT_SPEC_FROST;\n+        case BOT_SPEC_DK_UNHOLY:            return BOT_TEXT_SPEC_UNHOLY;\n+        case BOT_SPEC_SHAMAN_ELEMENTAL:     return BOT_TEXT_SPEC_ELEMENTAL;\n+        case BOT_SPEC_SHAMAN_ENHANCEMENT:   return BOT_TEXT_SPEC_ENHANCEMENT;\n+        case BOT_SPEC_SHAMAN_RESTORATION:   return BOT_TEXT_SPEC_RESTORATION;\n+        case BOT_SPEC_MAGE_ARCANE:          return BOT_TEXT_SPEC_ARCANE;\n+        case BOT_SPEC_MAGE_FIRE:            return BOT_TEXT_SPEC_FIRE;\n+        case BOT_SPEC_MAGE_FROST:           return BOT_TEXT_SPEC_FROST;\n+        case BOT_SPEC_WARLOCK_AFFLICTION:   return BOT_TEXT_SPEC_AFFLICTION;\n+        case BOT_SPEC_WARLOCK_DEMONOLOGY:   return BOT_TEXT_SPEC_DEMONOLOGY;\n+        case BOT_SPEC_WARLOCK_DESTRUCTION:  return BOT_TEXT_SPEC_DESTRUCTION;\n+        case BOT_SPEC_DRUID_BALANCE:        return BOT_TEXT_SPEC_BALANCE;\n+        case BOT_SPEC_DRUID_FERAL:          return BOT_TEXT_SPEC_FERAL;\n+        case BOT_SPEC_DRUID_RESTORATION:    return BOT_TEXT_SPEC_RESTORATION;\n+        case BOT_SPEC_DEFAULT: default:     return BOT_TEXT_SPEC_UNKNOWN;\n+    }\n+}\n+\n+bool bot_ai::IsValidSpecForClass(uint8 m_class, uint8 spec)\n+{\n+    switch (m_class)\n+    {\n+        case BOT_CLASS_WARRIOR:\n+            switch (spec)\n+            {\n+                case BOT_SPEC_WARRIOR_ARMS:\n+                case BOT_SPEC_WARRIOR_FURY:\n+                case BOT_SPEC_WARRIOR_PROTECTION:\n+                    return true;\n+                default:\n+                    break;\n+            }\n+            break;\n+        case BOT_CLASS_PALADIN:\n+            switch (spec)\n+            {\n+                case BOT_SPEC_PALADIN_HOLY:\n+                case BOT_SPEC_PALADIN_PROTECTION:\n+                case BOT_SPEC_PALADIN_RETRIBUTION:\n+                    return true;\n+                default:\n+                    break;\n+            }\n+            break;\n+        case BOT_CLASS_HUNTER:\n+            switch (spec)\n+            {\n+                case BOT_SPEC_HUNTER_BEASTMASTERY:\n+                case BOT_SPEC_HUNTER_MARKSMANSHIP:\n+                case BOT_SPEC_HUNTER_SURVIVAL:\n+                    return true;\n+                default:\n+                    break;\n+            }\n+            break;\n+        case BOT_CLASS_ROGUE:\n+            switch (spec)\n+            {\n+                case BOT_SPEC_ROGUE_ASSASINATION:\n+                case BOT_SPEC_ROGUE_COMBAT:\n+                case BOT_SPEC_ROGUE_SUBTLETY:\n+                    return true;\n+                default:\n+                    break;\n+            }\n+            break;\n+        case BOT_CLASS_PRIEST:\n+            switch (spec)\n+            {\n+                case BOT_SPEC_PRIEST_DISCIPLINE:\n+                case BOT_SPEC_PRIEST_HOLY:\n+                case BOT_SPEC_PRIEST_SHADOW:\n+                    return true;\n+                default:\n+                    break;\n+            }\n+            break;\n+        case BOT_CLASS_DEATH_KNIGHT:\n+            switch (spec)\n+            {\n+                case BOT_SPEC_DK_BLOOD:\n+                case BOT_SPEC_DK_FROST:\n+                case BOT_SPEC_DK_UNHOLY:\n+                    return true;\n+                default:\n+                    break;\n+            }\n+            break;\n+        case BOT_CLASS_SHAMAN:\n+            switch (spec)\n+            {\n+                case BOT_SPEC_SHAMAN_ELEMENTAL:\n+                case BOT_SPEC_SHAMAN_ENHANCEMENT:\n+                case BOT_SPEC_SHAMAN_RESTORATION:\n+                    return true;\n+                default:\n+                    break;\n+            }\n+            break;\n+        case BOT_CLASS_MAGE:\n+            switch (spec)\n+            {\n+                case BOT_SPEC_MAGE_ARCANE:\n+                case BOT_SPEC_MAGE_FIRE:\n+                case BOT_SPEC_MAGE_FROST:\n+                    return true;\n+                default:\n+                    break;\n+            }\n+            break;\n+        case BOT_CLASS_WARLOCK:\n+            switch (spec)\n+            {\n+                case BOT_SPEC_WARLOCK_AFFLICTION:\n+                case BOT_SPEC_WARLOCK_DEMONOLOGY:\n+                case BOT_SPEC_WARLOCK_DESTRUCTION:\n+                    return true;\n+                default:\n+                    break;\n+            }\n+            break;\n+        case BOT_CLASS_DRUID:\n+            switch (spec)\n+            {\n+                case BOT_SPEC_DRUID_BALANCE:\n+                case BOT_SPEC_DRUID_FERAL:\n+                case BOT_SPEC_DRUID_RESTORATION:\n+                    return true;\n+                default:\n+                    break;\n+            }\n+            break;\n+        case BOT_CLASS_BM:\n+        case BOT_CLASS_SPHYNX:\n+        case BOT_CLASS_ARCHMAGE:\n+        case BOT_CLASS_DREADLORD:\n+        case BOT_CLASS_SPELLBREAKER:\n+        case BOT_CLASS_DARK_RANGER:\n+        case BOT_CLASS_NECROMANCER:\n+        case BOT_CLASS_SEA_WITCH:\n+        case BOT_CLASS_CRYPT_LORD:\n+            return spec == BOT_SPEC_DEFAULT;\n+        default:\n+            break;\n+    }\n+    return false;\n+}\n+\n+void bot_ai::InitEquips()\n+{\n+    EquipmentInfo const* einfo = BotDataMgr::GetBotEquipmentInfo(me->GetEntry());\n+    ASSERT(einfo, \"Trying to spawn bot with no equip info!\");\n+\n+    if (IsWanderer())\n+    {\n+        auto fit_check = [this](uint8 slot, ItemTemplate const* proto) { return _isItemFitForWanderingBot(slot, proto); };\n+\n+        GenerateRand();\n+        uint8 lvl = me->GetLevel();\n+        std::ostringstream gss;\n+        gss << \"bot_ai::InitEquips(): Wanderer bot \" << me->GetName() << \" id \" << me->GetEntry() << ' ' << \"level \" << uint32(lvl) << \" generated gear:\";\n+        for (auto i : NPCBots::index_array<uint8, BOT_INVENTORY_SIZE>)\n+        {\n+            if (i == BOT_SLOT_OFFHAND && (!_canUseOffHand() || (lvl < 10 && IsCastingClass(_botclass))))\n+                continue;\n+            if ((i == BOT_SLOT_FINGER1 || i == BOT_SLOT_FINGER2 || i == BOT_SLOT_NECK || i == BOT_SLOT_SHOULDERS) && lvl < 20)\n+                continue;\n+            if ((i == BOT_SLOT_TRINKET1 || i == BOT_SLOT_TRINKET2 || i == BOT_SLOT_HEAD) && lvl < 30)\n+                continue;\n+\n+            Item* item = BotDataMgr::GenerateWanderingBotItem(i, _botclass, lvl, fit_check);\n+            if (!item)\n+            {\n+                if (i <= BOT_SLOT_RANGED && einfo->ItemEntry[i] != 0)\n+                {\n+                    BOT_LOG_WARN(\"npcbots\", \"Wanderer bot {} id {} level {} can't generate req gear in slot {}, generating standard item!\",\n+                        me->GetName(), me->GetEntry(), uint32(me->GetLevel()), uint32(i));\n+\n+                    item = Item::CreateItem(einfo->ItemEntry[i], 1);\n+                    ASSERT(item, \"Failed to init standard Item for wandering bot!\");\n+                    _equips[i] = item;\n+                }\n+            }\n+            else\n+            {\n+                _equips[i] = item;\n+                if (GetSpec() != BOT_SPEC_DEFAULT && BotDataMgr::GenerateWanderingBotItemEnchants(item, i, GetSpec())) {}\n+\n+                gss << \" [\" << uint32(i) << \"] \" << _equips[i]->GetTemplate()->Name1 << \" (\" << _equips[i]->GetEntry() << ')';\n+            }\n+        }\n+        BOT_LOG_TRACE(\"npcbots\", \"{}\", gss.str());\n+    }\n+    else\n+    {\n+        CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_NPCBOT_EQUIP_BY_ITEM_INSTANCE);\n+        //        0            1                2      3         4        5      6             7                 8           9           10    11    12         13\n+        //\"SELECT creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomPropertyId, durability, playedTime, text, guid, itemEntry, owner_guid \"\n+        //  \"FROM item_instance WHERE guid IN (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\", CONNECTION_SYNCH\n+\n+        std::array<uint32, BOT_INVENTORY_SIZE> assigned_item_guids{};\n+        for (auto i : NPCBots::index_array<uint8, BOT_INVENTORY_SIZE>)\n+        {\n+            stmt->setUInt32(i, _botData->equips[i]);\n+            assigned_item_guids[i] = _botData->equips[i];\n+        }\n+\n+        PreparedQueryResult iiresult = CharacterDatabase.Query(stmt);\n+\n+        if (!iiresult) //blank bot - fill with standard items\n+        {\n+            for (auto i : NPCBots::index_array<uint8, MAX_EQUIPMENT_ITEMS>)\n+            {\n+                uint32 itemId = einfo->ItemEntry[i];\n+                if (!itemId)\n+                    continue;\n+\n+                Item* item = Item::CreateItem(itemId, 1, nullptr);\n+                ASSERT(item, \"Failed to init standard Item for bot!\");\n+                _equips[i] = item;\n+            }\n+        }\n+        else\n+        {\n+            Field* fields2;\n+            do\n+            {\n+                fields2 = iiresult->Fetch();\n+                uint32 itemGuidLow = fields2[11].GetUInt32();\n+                uint32 itemId = fields2[12].GetUInt32();\n+                Item* item = new Item;\n+                ASSERT(item->LoadFromDB(itemGuidLow, ObjectGuid::Empty, fields2, itemId));\n+                //gonna find where to store our new item\n+                bool found = false;\n+                for (auto i : NPCBots::index_array<uint8, BOT_INVENTORY_SIZE>)\n+                {\n+                    if (_botData->equips[i] == itemGuidLow && !_equips[i])\n+                    {\n+                        _equips[i] = item;\n+                        found = true;\n+                        BotLogger::Log(NPCBOT_LOG_INIT_EQUIP, me, uint32(i), uint32(itemGuidLow), uint32(itemId));\n+                        break;\n+                    }\n+                }\n+                ASSERT(found);\n+                for (auto i : NPCBots::index_array<uint8, BOT_INVENTORY_SIZE>)\n+                {\n+                    if (assigned_item_guids[i] == itemGuidLow)\n+                        assigned_item_guids[i] = 0;\n+                }\n+\n+            } while (iiresult->NextRow());\n+        }\n+\n+        for (auto i : NPCBots::index_array<uint8, BOT_INVENTORY_SIZE>)\n+        {\n+            if (assigned_item_guids[i] != 0)\n+                BOT_LOG_ERROR(\"npcbots\", \"InitEquips: bot {} {} owner {} has item guid {} assigned to slot {} which doesn't exist in DB!\",\n+                    me->GetEntry(), me->GetName(), _botData->owner, assigned_item_guids[i], uint32(i));\n+        }\n+    }\n+\n+    //visualize\n+    for (auto i : NPCBots::index_array<uint8, BOT_FIRST_NON_WEAPON_SLOT>)\n+    {\n+        if (CanChangeEquip(i) && _equips[i])\n+        {\n+            NpcBotTransmogData const* transmogData = BotDataMgr::SelectNpcBotTransmogs(me->GetEntry());\n+            if (einfo->ItemEntry[i] != _equips[i]->GetEntry() && transmogData && BotCfg::IsTransmogEnabled() && (transmogData->transmogs[i].first == _equips[i]->GetEntry() || BotCfg::TransmogUseEquipmentSlots()))\n+                me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + i, uint32(std::max<int32>(transmogData->transmogs[i].second, 0)));\n+            else\n+                me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + i, _equips[i]->GetEntry());\n+        }\n+        else if (einfo->ItemEntry[i])\n+            me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + i, einfo->ItemEntry[i]);\n+    }\n+\n+    //apply weapons' parameters\n+    if (Item const* MH = _equips[BOT_SLOT_MAINHAND])\n+    {\n+        uint32 itemId = MH->GetEntry();\n+        if (einfo->ItemEntry[0] != itemId)\n+        {\n+            if (ItemTemplate const* proto = sObjectMgr->GetItemTemplate(itemId))\n+            {\n+                if (RespectEquipsAttackTime())\n+                    me->SetAttackTime(BASE_ATTACK, proto->Delay);\n+                ApplyItemBonuses(BOT_SLOT_MAINHAND);\n+            }\n+        }\n+    }\n+    if (Item const* OH = _equips[BOT_SLOT_OFFHAND])\n+    {\n+        uint32 itemId = OH->GetEntry();\n+        if (ItemTemplate const* proto = sObjectMgr->GetItemTemplate(itemId))\n+        {\n+            if (einfo->ItemEntry[1] != itemId)\n+                ApplyItemBonuses(BOT_SLOT_OFFHAND);\n+\n+            if (proto->Class == ITEM_CLASS_WEAPON)\n+            {\n+                if (RespectEquipsAttackTime())\n+                    me->SetAttackTime(OFF_ATTACK, proto->Delay);\n+                me->SetCanDualWield(true);\n+            }\n+            else if (proto->Class == ITEM_CLASS_ARMOR && proto->SubClass == ITEM_SUBCLASS_ARMOR_SHIELD)\n+            {\n+                if (me->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_NO_BLOCK)\n+                    const_cast<CreatureTemplate*>(me->GetCreatureTemplate())->flags_extra &= ~CREATURE_FLAG_EXTRA_NO_BLOCK;\n+            }\n+        }\n+    }\n+    if (Item const* RH = _equips[BOT_SLOT_RANGED])\n+    {\n+        uint32 itemId = RH->GetEntry();\n+        if (einfo->ItemEntry[2] != itemId)\n+        {\n+            if (ItemTemplate const* proto = sObjectMgr->GetItemTemplate(itemId))\n+            {\n+                if (proto->Class == ITEM_CLASS_WEAPON)\n+                    if (RespectEquipsAttackTime())\n+                        me->SetAttackTime(RANGED_ATTACK, proto->Delay);\n+\n+                ApplyItemBonuses(BOT_SLOT_RANGED);\n+            }\n+        }\n+    }\n+\n+    for (uint8 i = BOT_SLOT_RANGED + 1; i != BOT_INVENTORY_SIZE; ++i)\n+        ApplyItemBonuses(i);\n+\n+    ApplyItemSetBonuses(nullptr, true);\n+\n+    for (auto i : NPCBots::index_array<uint8, MAX_EQUIPMENT_ITEMS>)\n+    {\n+        if (_equips[i] == nullptr && einfo->ItemEntry[i] != 0)\n+        {\n+            if (i == BOT_SLOT_OFFHAND && !_canUseOffHand())\n+            {\n+                me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + i, uint32(0));\n+                continue;\n+            }\n+\n+            //if bot has no equips but equip template then use those\n+            Item* item = Item::CreateItem(einfo->ItemEntry[i], 1, nullptr);\n+            ASSERT(item, \"Failed to init standard Item for bot point 2!\");\n+            _equips[i] = item;\n+\n+            me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + i, einfo->ItemEntry[i]);\n+            if (i == BOT_SLOT_OFFHAND)\n+            {\n+                if (ItemTemplate const* proto = sObjectMgr->GetItemTemplate(einfo->ItemEntry[i]))\n+                {\n+                    if (proto->Class == ITEM_CLASS_WEAPON)\n+                    {\n+                        me->SetAttackTime(OFF_ATTACK, _botclass == BOT_CLASS_ROGUE ? 1400 : 1800);\n+                        me->SetCanDualWield(true);\n+                    }\n+                    else if (proto->Class == ITEM_CLASS_ARMOR && proto->SubClass == ITEM_SUBCLASS_ARMOR_SHIELD)\n+                    {\n+                        if (me->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_NO_BLOCK)\n+                            const_cast<CreatureTemplate*>(me->GetCreatureTemplate())->flags_extra &= ~CREATURE_FLAG_EXTRA_NO_BLOCK;\n+                    }\n+                }\n+            }\n+        }\n+    }\n+\n+    for (auto slot : NPCBots::index_array<uint8, BOT_INVENTORY_SIZE>)\n+    {\n+        if (_equips[slot] && IsUsableItem(_equips[slot]))\n+        {\n+            uint32 slotMask = 1ul << slot;\n+            ASSERT(!(_usableItemSlotsMask & slotMask));\n+            _usableItemSlotsMask |= slotMask;\n+        }\n+    }\n+}\n+\n+void bot_ai::FindMaster()\n+{\n+    //totally free\n+    if (!_botData->owner)\n+        return;\n+    if (me->IsInWorld() && (!_atHome || _evadeMode))\n+        return;\n+    if (!BotCfg::IsClassEnabled(_botclass))\n+        return;\n+\n+    //delay\n+    if (_checkMasterTimer > lastdiff)\n+        return;\n+\n+    _checkMasterTimer = urand(1000, 3000);\n+\n+    //already have master\n+    if (!IAmFree())\n+        return;\n+    if (HasBotCommandState(BOT_COMMAND_UNBIND))\n+        return;\n+\n+    for (auto const& container : { {_botData->owner}, _botData->shared_owners })\n+    {\n+        for (uint32 guid_low : container)\n+        {\n+            if (Player* player = ObjectAccessor::FindPlayerByLowGUID(guid_low))\n+            {\n+                if (player->IsGameMaster() || player->GetSession()->isLogingOut() || player->GetSession()->PlayerLogout())\n+                    return;\n+\n+                if (SetBotOwner(player))\n+                    return;\n+            }\n+        }\n+    }\n+}\n+\n+uint32 bot_ai::CalculateOwnershipCheckTime()\n+{\n+    if (!_botData->owner)\n+        return 0;\n+\n+    if (!IAmFree() || BotCfg::GetOwnershipExpireMode() == BOT_OWNERSHIP_EXPIRE_OFFLINE)\n+        return static_cast<uint32>(std::min<uint32>(BotCfg::GetOwnershipExpireTime(), urand(3 * MINUTE, 7 * MINUTE)) * IN_MILLISECONDS);\n+\n+    return static_cast<uint32>(std::max<time_t>(time_t(_botData->hire_time + BotCfg::GetOwnershipExpireTime() + 1) - time(0), 5) * IN_MILLISECONDS);\n+}\n+\n+bool bot_ai::IAmFree() const\n+{\n+    if (!_botData->owner)\n+        return true;\n+    if (_botData->owner != master->GetGUID().GetRawValue() && !(master->GetGUID().IsPlayer() && _botData->shared_owners.contains(master->GetGUID().GetCounter())))\n+        return true;\n+    return false;\n+}\n+\n+//UTILITIES\n+void bot_ai::_AddItemTemplateLink(Player const* forPlayer, ItemTemplate const* item, std::ostringstream &str) const\n+{\n+    //color\n+    str << \"|c\";\n+    switch (item->Quality)\n+    {\n+        case ITEM_QUALITY_POOR:     str << \"ff9d9d9d\"; break;  //GREY\n+        case ITEM_QUALITY_NORMAL:   str << \"ffffffff\"; break;  //WHITE\n+        case ITEM_QUALITY_UNCOMMON: str << \"ff1eff00\"; break;  //GREEN\n+        case ITEM_QUALITY_RARE:     str << \"ff0070dd\"; break;  //BLUE\n+        case ITEM_QUALITY_EPIC:     str << \"ffa335ee\"; break;  //PURPLE\n+        case ITEM_QUALITY_LEGENDARY:str << \"ffff8000\"; break;  //ORANGE\n+        case ITEM_QUALITY_ARTIFACT: str << \"ffe6cc80\"; break;  //LIGHT YELLOW\n+        case ITEM_QUALITY_HEIRLOOM: str << \"ffe6cc80\"; break;  //LIGHT YELLOW\n+        default:                    str << \"ff000000\"; break;  //UNK BLACK\n+    }\n+    str << \"|Hitem:\" << uint32(item->ItemId) << ':';\n+\n+    //permanent enchantment, 3 gems, 4 unknowns, reporter_level (9)\n+    str << \"0:0:0:0:0:0:0:0:0\";\n+\n+    //name\n+    std::string name = item->Name1;\n+    _LocalizeItem(forPlayer, name, item->ItemId);\n+    str << \"|h[\" << name << \"]|h|r\";\n+\n+    //max in stack\n+    if (item->BuyCount > 1)\n+        str<< \"|cff009900x\" << item->BuyCount << \"|r\";\n+    else\n+        str << \"|cff009900|r\";\n+}\n+// |TInterface\\\\Icons\\\\INV_<iconName>:<iconSize>|t|color|Hitem:item_id:perm_ench_id:gem1:gem2:gem3:0:random_property:suffix_factor:reporter_level|h[name]|h|r\n+// |TInterface\\\\Icons\\\\INV_Misc_Staff_01:16|t|cffa335ee|Hitem:812:0:0:0:0:0:0:0:70|h[Glowing Brightwood Staff]|h|r\n+void bot_ai::_AddItemLink(Player const* forPlayer, Item const* item, std::ostringstream &str, bool addIcon) const\n+{\n+    ItemTemplate const* proto = item->GetTemplate();\n+    //ItemRandomSuffixEntry const* item_rand = sItemRandomSuffixStore.LookupEntry(abs(item->GetItemRandomPropertyId()));\n+    uint32 g1 = 0, g2 = 0, g3 = 0;\n+    //uint32 bpoints = 0;\n+    std::string name = proto->Name1;\n+    std::string suffix{};\n+\n+    //icon\n+    if (addIcon)\n+    {\n+        ItemDisplayInfoEntry const* itemDisplayEntry = sItemDisplayInfoStore.LookupEntry(item->GetTemplate()->DisplayInfoID);\n+        if (itemDisplayEntry)\n+            str << \"|TInterface\\\\Icons\\\\\" << itemDisplayEntry->InventoryIcon << \":16|t\";\n+    }\n+\n+    //color\n+    str << \"|c\";\n+    switch (proto->Quality)\n+    {\n+        case ITEM_QUALITY_POOR:     str << \"ff9d9d9d\"; break;  //GREY\n+        case ITEM_QUALITY_NORMAL:   str << \"ffffffff\"; break;  //WHITE\n+        case ITEM_QUALITY_UNCOMMON: str << \"ff1eff00\"; break;  //GREEN\n+        case ITEM_QUALITY_RARE:     str << \"ff0070dd\"; break;  //BLUE\n+        case ITEM_QUALITY_EPIC:     str << \"ffa335ee\"; break;  //PURPLE\n+        case ITEM_QUALITY_LEGENDARY:str << \"ffff8000\"; break;  //ORANGE\n+        case ITEM_QUALITY_ARTIFACT: str << \"ffe6cc80\"; break;  //LIGHT YELLOW\n+        case ITEM_QUALITY_HEIRLOOM: str << \"ffe6cc80\"; break;  //LIGHT YELLOW\n+        default:                    str << \"ff000000\"; break;  //UNK BLACK\n+    }\n+    str << \"|Hitem:\" << proto->ItemId << ':';\n+\n+    //permanent enchantment\n+    str << item->GetEnchantmentId(PERM_ENCHANTMENT_SLOT) << ':';\n+    //gems 3\n+    for (uint32 slot = SOCK_ENCHANTMENT_SLOT; slot != SOCK_ENCHANTMENT_SLOT + MAX_ITEM_PROTO_SOCKETS; ++slot)\n+    {\n+        uint32 eId = item->GetEnchantmentId(EnchantmentSlot(slot));\n+\n+        switch (slot - SOCK_ENCHANTMENT_SLOT)\n+        {\n+            case 0: g1 = eId;   break;\n+            case 1: g2 = eId;   break;\n+            case 2: g3 = eId;   break;\n+        }\n+    }\n+    str << g1 << ':' << g2 << ':' << g3 << ':';\n+    //always zero\n+    str << 0 << ':';\n+    //random property\n+    str << item->GetItemRandomPropertyId() << ':';\n+    str << item->GetItemSuffixFactor() << ':';\n+\n+    //reporter level\n+    str << uint32(me->GetLevel());\n+\n+    //name\n+    _LocalizeItem(forPlayer, name, suffix, item);\n+\n+    str << \"|h[\" << name;\n+    if (suffix.length() > 0)\n+        str << ' ' << suffix;\n+    str <<\"]|h|r\";\n+\n+    //quantity\n+    if (item->GetCount() > 1)\n+        str << \"x\" << item->GetCount() << ' ';\n+\n+    //BOT_LOG_ERROR(\"entities.player\", \"bot_ai::_AddItemLink(): {}\", str.str());\n+}\n+//Unused\n+void bot_ai::_AddQuestLink(Player const* forPlayer, Quest const* quest, std::ostringstream &str) const\n+{\n+    std::string questTitle = quest->GetTitle();\n+    _LocalizeQuest(forPlayer, questTitle, quest->GetQuestId());\n+    str << \"|cFFEFFD00|Hquest:\" << quest->GetQuestId() << ':' << quest->GetQuestLevel() << \"|h[\" << questTitle << \"]|h|r\";\n+}\n+//Unsused\n+void bot_ai::_AddWeaponSkillLink(Player const* forPlayer, SpellInfo const* spellInfo, std::ostringstream &str, uint32 skillid) const\n+{\n+    uint32 loc = forPlayer->GetSession()->GetSessionDbcLocale();\n+    str << \"|cff00ffff|Hspell:\" << spellInfo->Id << \"|h[\" << spellInfo->SpellName[loc] << \" : \" << master->GetSkillValue(skillid) << \" /\" << master->GetMaxSkillValue(skillid) << \"]|h|r\";\n+}\n+//|cff71d5ff|Hspell:21563|h[Command]|h|r\n+void bot_ai::_AddSpellLink(Player const* forPlayer, SpellInfo const* spellInfo, std::ostringstream &str, bool color/* = true*/) const\n+{\n+    uint32 loc = forPlayer->GetSession()->GetSessionDbcLocale();\n+    str << \"|c\";\n+\n+    if (color)\n+    {\n+        switch (GetFirstSchoolInMask(spellInfo->GetSchoolMask()))\n+        {\n+            case SPELL_SCHOOL_NORMAL:       str << \"ffffff00\"; break; //YELLOW\n+            case SPELL_SCHOOL_HOLY:         str << \"ffffe680\"; break; //LIGHT YELLOW\n+            case SPELL_SCHOOL_FIRE:         str << \"ffff8000\"; break; //ORANGE\n+            case SPELL_SCHOOL_NATURE:       str << \"ff4dff4d\"; break; //GREEN\n+            case SPELL_SCHOOL_FROST:        str << \"ff80ffff\"; break; //LIGHT BLUE\n+            case SPELL_SCHOOL_SHADOW:       str << \"ff8080ff\"; break; //DARK BLUE\n+            case SPELL_SCHOOL_ARCANE:       str << \"ffff80ff\"; break; //LIGHT PURPLE\n+            default:                        str << \"ffffffff\"; break; //UNK WHITE\n+        }\n+    }\n+    else\n+        str << \"ffffffff\"; //default white\n+\n+    str << \"|Hspell:\" << spellInfo->Id << \"|h[\" << spellInfo->SpellName[loc] << \"]|h|r\";\n+}\n+//Unused\n+void bot_ai::_AddProfessionLink(Player const* forPlayer, SpellInfo const* spellInfo, std::ostringstream &str, uint32 skillId) const\n+{\n+    ASSERT(master->HasSkill(skillId));\n+    // |cffffd000|Htrade:4037:1:150:1:6AAAAAAAAAAAAAAAAAAAAAAOAADAAAAAAAAAAAAAAAAIAAAAAAAAA|h[Engineering]|h|r\n+    uint32 loc = forPlayer->GetSession()->GetSessionDbcLocale();\n+    SkillLineEntry const* skillInfo = sSkillLineStore.LookupEntry(skillId);\n+    if (skillInfo)\n+    {\n+        uint32 curValue = master->GetPureSkillValue(skillId);\n+        uint32 maxValue  = master->GetPureMaxSkillValue(skillId);\n+        str << \"|cffffd000|Htrade:\" << spellInfo->Id << ':' << curValue << ':' << maxValue << ':' << master->GetGUID().GetCounter() << \":6AAAAAAAAAAAAAAAAAAAAAAOAADAAAAAAAAAAAAAAAAIAAAAAAAAA\" << \"|h[\" << skillInfo->DisplayName[loc] << \"]|h|r\";\n+    }\n+}\n+//Localization\n+void bot_ai::_LocalizeItem(Player const* forPlayer, std::string &itemName, uint32 entry) const\n+{\n+    uint32 loc = forPlayer->GetSession()->GetSessionDbLocaleIndex();\n+    std::wstring wnamepart;\n+\n+    ItemLocale const* itemInfo = sObjectMgr->GetItemLocale(entry);\n+    if (!itemInfo)\n+        return;\n+\n+    if (itemInfo->Name.size() > loc && !itemInfo->Name[loc].empty())\n+    {\n+        std::string name = itemInfo->Name[loc];\n+        if (Utf8FitTo(name, wnamepart))\n+            itemName = std::move(name);\n+    }\n+}\n+\n+void bot_ai::_LocalizeItem(Player const* forPlayer, std::string &itemName, std::string &suffix, Item const* item) const\n+{\n+    uint32 loc = forPlayer->GetSession()->GetSessionDbLocaleIndex();\n+    std::wstring wnamepart;\n+\n+    ItemLocale const* itemInfo = sObjectMgr->GetItemLocale(item->GetEntry());\n+    if (loc > 0 && itemInfo && itemInfo->Name.size() > loc && !itemInfo->Name[loc].empty())\n+    {\n+        const std::string name = itemInfo->Name[loc];\n+        if (Utf8FitTo(name, wnamepart))\n+            itemName = name;\n+    }\n+\n+    int32 randomPropId = item->GetItemRandomPropertyId();\n+    //BOT_LOG_ERROR(\"entities.player\", \"bot_ai::_LocalizeItem(): randomPropId = {}\", randomPropId);\n+    if (!randomPropId)\n+        return;\n+\n+    if (randomPropId > 0)\n+    {\n+        if (ItemRandomPropertiesEntry const* item_rand = sItemRandomPropertiesStore.LookupEntry(randomPropId))\n+        {\n+            std::array<char const*, 16> const& suffs = item_rand->Name;\n+            //if (suffs)\n+            {\n+                //for (uint8 i = 0; i != MAX_LOCALES; ++i)\n+                //    BOT_LOG_ERROR(\"entities.player\", \"bot_ai::_LocalizeItem(): rand prop suffix for loc {} = {}\", i, suffs[i]);\n+                suffix = suffs[loc];\n+            }\n+        }\n+    }\n+    else\n+    {\n+        if (ItemRandomSuffixEntry const* item_rand = sItemRandomSuffixStore.LookupEntry(-randomPropId))\n+        {\n+            std::array<char const*, 16> const& suffs = item_rand->Name;\n+            //if (suffs)\n+            {\n+                //for (uint8 i = 0; i != MAX_LOCALES; ++i)\n+                //    BOT_LOG_ERROR(\"entities.player\", \"bot_ai::_LocalizeItem(): rand suff suffix for loc {} = {}\", i, suffs[i]);\n+                suffix = suffs[loc];\n+            }\n+        }\n+    }\n+}\n+\n+void bot_ai::_LocalizeQuest(Player const* forPlayer, std::string &questTitle, uint32 entry) const\n+{\n+    uint32 loc = forPlayer->GetSession()->GetSessionDbLocaleIndex();\n+    std::wstring wnamepart;\n+\n+    QuestLocale const* questInfo = sObjectMgr->GetQuestLocale(entry);\n+    if (!questInfo)\n+        return;\n+\n+    if (questInfo->Title.size() > loc && !questInfo->Title[loc].empty())\n+    {\n+        const std::string title = questInfo->Title[loc];\n+        if (Utf8FitTo(title, wnamepart))\n+            questTitle = title;\n+    }\n+}\n+\n+void bot_ai::_LocalizeCreature(Player const* forPlayer, std::string &creatureName, uint32 entry) const\n+{\n+    uint32 loc = forPlayer->GetSession()->GetSessionDbLocaleIndex();\n+    std::wstring wnamepart;\n+\n+    CreatureLocale const* creatureInfo = sObjectMgr->GetCreatureLocale(entry);\n+    if (!creatureInfo)\n+        return;\n+\n+    if (creatureInfo->Name.size() > loc && !creatureInfo->Name[loc].empty())\n+    {\n+        std::string title = creatureInfo->Name[loc];\n+        if (Utf8FitTo(title, wnamepart))\n+            creatureName = std::move(title);\n+    }\n+}\n+\n+void bot_ai::_LocalizeGameObject(Player const* forPlayer, std::string &gameobjectName, uint32 entry) const\n+{\n+    uint32 loc = forPlayer->GetSession()->GetSessionDbLocaleIndex();\n+    std::wstring wnamepart;\n+\n+    GameObjectLocale const* gameObjectInfo = sObjectMgr->GetGameObjectLocale(entry);\n+    if (!gameObjectInfo)\n+        return;\n+\n+    if (gameObjectInfo->Name.size() > loc && !gameObjectInfo->Name[loc].empty())\n+    {\n+        std::string title = gameObjectInfo->Name[loc];\n+        if (Utf8FitTo(title, wnamepart))\n+            gameobjectName = std::move(title);\n+    }\n+}\n+\n+void bot_ai::_LocalizeSpell(Player const* forPlayer, std::string &spellName, uint32 entry) const\n+{\n+    uint32 loc = forPlayer->GetSession()->GetSessionDbcLocale();\n+    std::wstring wnamepart;\n+\n+    SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(entry);\n+    if (!spellInfo)\n+    {\n+        spellName = LocalizedNpcText(forPlayer, BOT_TEXT_UNKNOWN);\n+        return;\n+    }\n+\n+    std::string title = spellInfo->SpellName[loc];\n+    if (Utf8FitTo(title, wnamepart))\n+        spellName = std::move(title);\n+    else\n+        spellName = spellInfo->SpellName[sWorld->GetDefaultDbcLocale()];\n+}\n+\n+void bot_ai::BotJump(Position const* pos, bool count)\n+{\n+    if (count)\n+        ++_jumpCount;\n+\n+    me->BotStopMovement();\n+    me->GetMotionMaster()->MoveJump(*pos, me->GetExactDist2d(pos->m_positionX, pos->m_positionY), 10.0f);\n+}\n+\n+bool bot_ai::UpdateImpossibleChase(Unit const* target)\n+{\n+    if (_chaseTimer > lastdiff || me->isMoving() || !IAmFree())\n+        return false;\n+\n+    if (JumpingOrFalling())\n+        return false;\n+\n+    if (_jumpCount >= 3)\n+    {\n+        me->AttackStop();\n+        Evade();\n+        return true;\n+    }\n+\n+    if (_unreachableCount < 5)\n+    {\n+        if ((IsRanged() ? me->GetDistance(target) > 40.0f : !me->IsWithinMeleeRange(target)) ||\n+            (target->IsCreature() && !me->IsWithinLOSInMap(target, LINEOFSIGHT_ALL_CHECKS, VMAP::ModelIgnoreFlags::M2)))\n+        {\n+            ++_unreachableCount;\n+            ResetChaseTimer(target);\n+            BotMovement(BOT_MOVE_POINT, target, nullptr, false);\n+        }\n+        else\n+            _unreachableCount = 0;\n+\n+        return true;\n+    }\n+\n+    if (target->IsPlayer() && (!me->IsWithinDist(target, HasRole(BOT_ROLE_RANGED) ? 65 : 40) || me->IsWithinDist(target, HasRole(BOT_ROLE_RANGED) ? 35 : 10)))\n+        return false;\n+\n+    _unreachableCount = 0;\n+\n+    ResetChaseTimer(target);\n+\n+    BotJump(target);\n+    return true;\n+}\n+\n+void bot_ai::ResetChaseTimer(Position const* /*pos*/)\n+{\n+    _chaseTimer = IsWanderer() ? 5000 : 20000;\n+}\n+\n+void bot_ai::ResetChase(Position const* pos)\n+{\n+    if (!IAmFree())\n+        return;\n+\n+    ResetChaseTimer(pos);\n+    _unreachableCount = 0;\n+    _jumpCount = 0;\n+}\n+\n+void bot_ai::ResetEngageTimer(uint32 delay)\n+{\n+    _engageTimer = delay;\n+}\n+\n+void bot_ai::OnStartAttack(Unit const* u)\n+{\n+    if (u->GetGUID() != _lastTargetGuid)\n+    {\n+        ResetChase(u);\n+        _lastTargetGuid = u->GetGUID();\n+    }\n+}\n+\n+bool bot_ai::StartAttack(Unit const* u, bool force)\n+{\n+    if (HasBotCommandState(BOT_COMMAND_ATTACK) && !force)\n+        return false;\n+\n+    SetBotCommandState(BOT_COMMAND_ATTACK);\n+    OnStartAttack(u);\n+    return true;\n+}\n+\n+void bot_ai::JustEnteredCombat(Unit* u)\n+{\n+    _atHome = false;\n+\n+    //clear gossip during combat. See CheckAuras() for restore\n+    if (me->HasNpcFlag(UNIT_NPC_FLAG_GOSSIP))\n+        me->RemoveNpcFlag(UNIT_NPC_FLAG_GOSSIP);\n+\n+    _evadeMode = false;\n+    _evadeCount = 0;\n+    evadeDelayTimer = 0;\n+    AbortTeleport();\n+\n+    ResetChase(u);\n+\n+    me->RefreshCanSwimFlag();\n+\n+    if (IsLastOrder(BOT_ORDER_PULL, 0, u->GetGUID()))\n+        CompleteOrder(_orders.front());\n+\n+    if (IAmFree() && me->GetVictim() && me->GetVictim() != u &&\n+        (me->getAttackers().empty() || (me->getAttackers().size() == 1u && *me->getAttackers().begin() == u)) &&\n+        me->GetVictim()->GetVictim() != me && !(me->GetVictim()->IsInCombat() || me->GetVictim()->IsInCombatWith(me)))\n+    {\n+        bool byspell = false;\n+        switch (_botclass)\n+        {\n+            case BOT_CLASS_DRUID:\n+                byspell = GetBotStance() == BOT_STANCE_NONE || GetBotStance() == DRUID_MOONKIN_FORM;\n+                break;\n+            case BOT_CLASS_PRIEST:\n+            case BOT_CLASS_MAGE:\n+            case BOT_CLASS_WARLOCK:\n+            case BOT_CLASS_SHAMAN:\n+            case BOT_CLASS_SPHYNX:\n+            case BOT_CLASS_ARCHMAGE:\n+                byspell = true;\n+                break;\n+            default:\n+                break;\n+        }\n+\n+        if (CanBotAttack(u, byspell))\n+        {\n+            me->AttackStop();\n+            me->BotStopMovement();\n+            SetBotCommandState(BOT_COMMAND_COMBATRESET); //reset AttackStart()\n+            me->Attack(u, !HasRole(BOT_ROLE_RANGED));\n+        }\n+    }\n+}\n+//killer may be NULL\n+void bot_ai::JustDied(Unit* u)\n+{\n+    AbortTeleport();\n+    AbortAwaitStateRemoval();\n+    KillEvents(false);\n+    CancelAllOrders();\n+\n+    if (me->GetVehicle())\n+        me->ExitVehicle();\n+\n+    if (me->GetTransport())\n+    {\n+        me->ClearUnitState(UNIT_STATE_IGNORE_PATHFINDING);\n+        me->GetTransport()->RemovePassenger(me);\n+    }\n+\n+    if (IsTempBot())\n+    {\n+        //BOT_LOG_ERROR(\"entities.player\", \"Unsummoning temp bot {} ({}), owner: {} ({})...\",\n+        //    me->GetName(), me->GetGUID().ToString(), master->GetName(), master->GetGUID().ToString());\n+\n+        if (!IAmFree())\n+            master->GetBotMgr()->RemoveBot(me->GetGUID(), BOT_REMOVE_UNSUMMON);\n+\n+        me->AddObjectToRemoveList();\n+        return;\n+    }\n+    else if (!IAmFree())\n+    {\n+        if (Group* gr = master->GetGroup())\n+            if (gr->IsMember(me->GetGUID()))\n+                gr->SendUpdate();\n+    }\n+\n+    if (IsWanderer() && me->GetMap()->IsBattlegroundOrArena())\n+    {\n+        if (Battleground const* bg = GetBG())\n+        {\n+            TeamId my_team = BotDataMgr::GetTeamIdForFaction(me->GetFaction());\n+            if (WorldSafeLocsEntry const* gy = bg->GetClosestGraveyardForBot(*me, my_team == TEAM_HORDE ? HORDE : ALLIANCE))\n+            {\n+                Position pos(gy->Loc.X, gy->Loc.Y, gy->Loc.Z, me->GetOrientation());\n+                Events.AddEventAtOffset([me = me, pos = pos]() { BotMgr::TeleportBot(me, me->GetMap(), &pos, true); }, 5s);\n+            }\n+        }\n+    }\n+    else if (u && (u->IsPvP() || u->IsControlledByPlayer() || u->IsNPCBotOrPet()))\n+    {\n+        BOT_LOG_DEBUG(\"npcbots\", \"{} {} id {} class {} level {} WAS KILLED BY {} {} id {} class {} level {} on their way to {}!\",\n+            IsWanderer() ? \"Wandering bot\" : \"Bot\", me->GetName(), me->GetEntry(), uint32(_botclass), uint32(me->GetLevel()),\n+            (u->IsPlayer() ? \"player\" : u->IsNPCBot() ? u->ToCreature()->GetBotAI()->IsWanderer() ? \"wandering bot\" : \"bot\" : u->IsNPCBotPet() ? \"botpet\" : \"creature\"),\n+            u->GetName(), u->GetEntry(), uint32(u->GetClass()), uint32(u->GetLevel()),\n+            IsWanderer() ? _travel_node_cur->GetName() : \"''\");\n+    }\n+\n+    _reviveTimer = (IsWanderer() && !(u && u->IsControlledByPlayer())) ? REVIVE_TIMER_MEDIUM :\n+        IAmFree() ? REVIVE_TIMER_DEFAULT : master->InBattleground() ? REVIVE_TIMER_SHORT / 2 : REVIVE_TIMER_SHORT;\n+    _atHome = false;\n+    _evadeMode = false;\n+    spawned = false;\n+    _botAwaitState = BOT_AWAIT_NONE;\n+\n+    ++_deathsCount;\n+}\n+//This is triggered before SetDeathState(JUST_DIED) call\n+//attacker may be NULL\n+void bot_ai::OnDeath([[maybe_unused]] Unit* attacker/* = nullptr*/)\n+{\n+    if (AuraEffect const* sstone = me->GetDummyAuraEffect(SPELLFAMILY_GENERIC, 92, 0))\n+    {\n+        uint32 spell_id;\n+        switch (sstone->GetBase()->GetId())\n+        {\n+            case 20707: spell_id = 3026;  break;        // rank 1\n+            case 20762: spell_id = 20758; break;        // rank 2\n+            case 20763: spell_id = 20759; break;        // rank 3\n+            case 20764: spell_id = 20760; break;        // rank 4\n+            case 20765: spell_id = 20761; break;        // rank 5\n+            case 27239: spell_id = 27240; break;        // rank 6\n+            case 47883: spell_id = 47882; break;        // rank 7\n+            default:    spell_id = 0;     break;\n+        }\n+        _selfrez_spell_id = spell_id;\n+    }\n+    else\n+        _selfrez_spell_id = 0;\n+}\n+\n+void bot_ai::KilledUnit(Unit* u)\n+{\n+    if (u->GetOwnerGUID() == me->GetGUID() || u->GetGUID() == me->GetGUID())\n+        return;\n+\n+    ++_killsCount;\n+    if (u->IsControlledByPlayer() || u->IsPvP() || u->IsNPCBotOrPet())\n+    {\n+        ++_pvpKillsCount;\n+        if (!me->GetMap()->IsBattlegroundOrArena())\n+        {\n+            if (IsWanderer())\n+            {\n+                BOT_LOG_DEBUG(\"npcbots\", \"Wandering bot {} id {} class {} level {} KILLED {} {} id {} class {} level {} on their way to {}!\",\n+                    me->GetName(), me->GetEntry(), uint32(_botclass), uint32(me->GetLevel()),\n+                    (u->IsPlayer() ? \"player\" : u->IsNPCBot() ? u->ToCreature()->GetBotAI()->IsWanderer() ? \"wandering bot\" : \"bot\" : u->IsNPCBotPet() ? \"botpet\" : \"creature\"),\n+                    u->GetName(), u->GetEntry(), uint32(u->GetClass()), uint32(u->GetLevel()),\n+                    _travel_node_cur->GetName());\n+            }\n+            else if (u->IsNPCBot() && u->ToCreature()->GetBotAI()->IsWanderer())\n+            {\n+                BOT_LOG_DEBUG(\"npcbots\", \"Bot {} id {} class {} level {} KILLED wandering bot {} id {} class {} level {} on their way to {}!\",\n+                    me->GetName(), me->GetEntry(), uint32(_botclass), uint32(me->GetLevel()),\n+                    u->GetName(), u->GetEntry(), uint32(u->GetClass()), uint32(u->GetLevel()),\n+                    IsWanderer() ? _travel_node_cur->GetName() : \"''\");\n+            }\n+        }\n+    }\n+\n+    //handle BG kill BvP, BvB, BvC\n+    if (me->GetMap()->IsBattleground())\n+    {\n+        Battleground* bg = GetBG();\n+        //could be removed from BG\n+        if (bg && bg->GetBots().contains(me->GetGUID()) &&\n+            (u->IsNPCBot() ? bg->GetBots().contains(u->GetGUID()) : bg->GetPlayers().contains(u->GetGUID())))\n+        {\n+            if (u->IsPlayer())\n+                bg->HandleBotKillPlayer(me, u->ToPlayer());\n+            else if (u->IsNPCBot())\n+                bg->HandleBotKillBot(me, u->ToCreature());\n+        }\n+        else if (bg && u->IsCreature() && !u->IsNPCBotOrPet())\n+            bg->HandleBotKillUnit(me, u->ToCreature());\n+\n+        outdoorsTimer = 0;\n+    }\n+\n+    if (u->isType(TYPEMASK_PLAYER))\n+        ++_playerKillsCount;\n+\n+    if (IsWanderer())\n+    {\n+        shouldUpdateStats = true;\n+\n+        if (me->GetMap()->GetEntry()->IsContinent())\n+            evadeDelayTimer = 3000;\n+    }\n+}\n+\n+void bot_ai::UnsummonCreature(Creature* creature, bool /*save*/)\n+{\n+    if (creature)\n+    {\n+        if (bot_pet_ai* petai = creature->GetBotPetAI())\n+        {\n+            petai->KillEvents(true);\n+            petai->canUpdate = false;\n+        }\n+\n+        ASSERT_NOTNULL(creature->ToTempSummon())->UnSummon();\n+    }\n+}\n+void bot_ai::UnsummonPet(bool save)\n+{\n+    UnsummonCreature(botPet, save);\n+}\n+\n+void bot_ai::MoveInLineOfSight(Unit* /*u*/)\n+{\n+}\n+\n+void bot_ai::AttackStart(Unit* /*u*/)\n+{\n+}\n+\n+void bot_ai::DamageDealt(Unit* victim, uint32& damage, DamageEffectType /*damageType*/)\n+{\n+    if (victim == me)\n+        return;\n+\n+    if (damage)\n+    {\n+        if (Creature* cre = victim->ToCreature())\n+        {\n+            if (!cre->hasLootRecipient())\n+                cre->SetLootRecipient(master);\n+\n+            //controlled case is handled in Unit::DealDamage\n+            if (IAmFree())\n+                cre->LowerPlayerDamageReq(std::min<uint32>(cre->GetHealth(), damage) / (BotMgr::IsWanderingWorldBot(me) ? 4 : 2));\n+        }\n+    }\n+\n+    if (victim->IsPlayer())\n+        ResetChase(victim);\n+}\n+void bot_ai::OnBotSpellStart(SpellInfo const* spellInfo)\n+{\n+    OnClassSpellStart(spellInfo);\n+}\n+//This function is called after Spell::SendSpellCooldown() and Spell::DoAllEffects...() call\n+void bot_ai::OnBotSpellGo(Spell const* spell, bool ok)\n+{\n+    SpellInfo const* curInfo = spell->GetSpellInfo();\n+\n+    if (ok)\n+    {\n+        if (CanBotAttackOnVehicle())\n+        {\n+            //Set cooldown\n+            if (!curInfo->IsCooldownStartedOnEvent() && !curInfo->IsPassive())\n+            {\n+                uint32 rec = curInfo->RecoveryTime ? curInfo->GetRecoveryTime() : GetItemSpellCooldown(curInfo->Id);\n+                uint32 catrec = curInfo->CategoryRecoveryTime;\n+                if (!catrec && curInfo->StartRecoveryCategory == 133 && !curInfo->CalcCastTime())\n+                    catrec = curInfo->StartRecoveryTime;\n+\n+                if (rec || (!spell->GetCastTime() && curInfo->CalcCastTime()))\n+                    ApplyBotSpellCooldownMods(curInfo, rec);\n+                if (catrec && !(curInfo->AttributesEx6 & SPELL_ATTR6_IGNORE_CATEGORY_COOLDOWN_MODS))\n+                    ApplyBotSpellCategoryCooldownMods(curInfo, catrec);\n+\n+                if (rec || catrec)\n+                    SetSpellCooldown(curInfo->GetFirstRankSpell()->Id, rec);\n+                SetSpellCategoryCooldown(curInfo->GetFirstRankSpell(), catrec);\n+\n+                if (!IAmFree())\n+                {\n+                    //allow next cast to be immediate\n+                    if (GC_Timer < lastdiff)\n+                        waitTimer = 0;\n+                    else\n+                        waitTimer = std::min<uint32>(waitTimer, GC_Timer - lastdiff);\n+                }\n+            }\n+\n+            if (curInfo->Id == PVPTRINKET)\n+                SetSpellCooldown(PVPTRINKET, 120000);\n+            if (IsPotionSpell(curInfo->Id))\n+                StartPotionTimer();\n+            if (curInfo->Id == ACTIVATE_SPEC)\n+                SetSpec(_newspec);\n+            if (curInfo->Id == GetSelfRezSpell())\n+                OnSpellHit(me, curInfo);\n+\n+            OnClassSpellGo(curInfo);\n+        }\n+\n+        if (me->GetVehicleCreatureBase() && me->GetVehicleCreatureBase()->HasSpell(curInfo->Id))\n+        {\n+            //delay next cast to allow cp to proc\n+            if (curInfo->AttributesEx & (SPELL_ATTR1_REQ_COMBO_POINTS1 | SPELL_ATTR1_REQ_COMBO_POINTS2))\n+                GC_Timer = std::max<uint32>(2000, curInfo->StartRecoveryTime);\n+            else if (curInfo->Speed > 0.0f)\n+                GC_Timer = std::max<uint32>(1500, curInfo->StartRecoveryTime);\n+            else\n+                GC_Timer = curInfo->StartRecoveryTime;\n+        }\n+    }\n+    else\n+        GC_Timer = 0;\n+\n+    if (HasBotCommandState(BOT_COMMAND_ISSUED_ORDER) &&\n+        !_orders.empty() && _orders.front()._type == BOT_ORDER_SPELLCAST &&\n+        _orders.front().params.spellCastParams.baseSpell == curInfo->GetFirstRankSpell()->Id)\n+    {\n+        if (DEBUG_BOT_ORDERS)\n+            BOT_LOG_ERROR(\"entities.player\", \"doCast(): ordered spell {} by {} was {}!\",\n+                curInfo->Id, me->GetName(), ok ? \"successful\" : \"unsuccessful\");\n+        CompleteOrder(_orders.front());\n+    }\n+}\n+\n+void bot_ai::OnBotOwnerSpellGo(Spell const* spell, bool ok)\n+{\n+    if (!ok)\n+        return;\n+\n+    SpellInfo const* spellInfo = spell->GetSpellInfo();\n+\n+    if (spellInfo->IsPassive())\n+        return;\n+\n+    //BOT_LOG_ERROR(\"entities.player\", \"OnBotOwnerSpellGo(): {} by {}\", spellInfo->Id, master->GetName());\n+\n+    if (spell->m_targets.HasDst() && HasBotAwaitState(BOT_AWAIT_SEND) && (me->GetTransport() == master->GetTransport()))\n+    {\n+        Position const* spell_dest = spell->m_targets.GetDstPos();\n+        MoveToSendPosition(*spell_dest);\n+    }\n+\n+    if (master->GetVehicle() && me->GetVehicle() && !master->HasSpell(spellInfo->Id) && !spell->m_targets.GetGOTargetGUID())\n+    {\n+        //if (((spellInfo->AttributesCu & SPELL_ATTR0_CU_DIRECT_DAMAGE) || spellInfo->HasAura(SPELL_AURA_PERIODIC_DAMAGE)) &&\n+        //    (spell->m_targets.GetTargetMask() & TARGET_FLAG_UNIT) && spell->m_targets.GetUnitTargetGUID() && !me->GetVehicleBase()->GetTarget() &&\n+        //    spell->m_targets.GetUnitTargetGUID() != master->GetVehicleBase()->GetGUID())\n+        //{\n+        //    //master->GetVehicleBase()->SetTarget(spell->m_targets.GetUnitTargetGUID());\n+        //    me->GetVehicleBase()->SetTarget(spell->m_targets.GetUnitTargetGUID());\n+        //    SetBotCommandState(BOT_COMMAND_ATTACK);\n+        //    //hack\n+        //    if (!me->GetVehicleBase()->GetVictim())\n+        //    {\n+        //        if (Unit* target = ObjectAccessor::GetUnit(*me->GetVehicleBase(), spell->m_targets.GetUnitTargetGUID()))\n+        //            me->GetVehicleBase()->Attack(target, false);\n+        //    }\n+        //}\n+\n+        Vehicle const* veh = me->GetVehicle();\n+        if (veh && veh->GetBase()->IsCreature() && _curVehStrat == BOT_VEH_STRAT_GENERIC &&\n+            veh->GetBase()->ToCreature()->HasSpell(spellInfo->Id))\n+        {\n+            SpellCastTargets targets;\n+            if (spell->m_targets.HasDst())\n+            {\n+                targets.SetDst(spell->m_targets);\n+                veh->GetBase()->ToCreature()->BotStopMovement();\n+                float destangle = veh->GetBase()->GetAbsoluteAngle(spell->m_targets.GetDstPos());\n+                if (veh->GetBase()->GetTransport())\n+                    destangle = Position::NormalizeOrientation(destangle - veh->GetBase()->GetTransport()->GetOrientation());\n+                veh->GetBase()->SetFacingTo(destangle);\n+                //force orientation (inconsistent with SetFacingTo)\n+                veh->GetBase()->SetOrientation(destangle);\n+            }\n+            if (spell->m_targets.GetSpeed() != 0)\n+                targets.SetSpeed(spell->m_targets.GetSpeed());\n+            if (spell->m_targets.GetElevation() != 0)\n+                targets.SetElevation(spell->m_targets.GetElevation());\n+            if (!spell->m_targets.GetUnitTargetGUID().IsEmpty())\n+            {\n+                if (Unit* target = ObjectAccessor::GetUnit(*veh->GetBase(), spell->m_targets.GetUnitTargetGUID()))\n+                {\n+                    targets.SetUnitTarget(target);\n+                    veh->GetBase()->SetFacingTo(me->GetAbsoluteAngle(target));\n+                }\n+            }\n+\n+            //bug: gameobject damage is not sent to players (not visible in log)\n+            //tempfix: set bot as original caster\n+            Spell* vehspell = new Spell(veh->GetBase(), spellInfo, TRIGGERED_NONE/*, me->GetGUID()*/);\n+            vehspell->prepare(targets);\n+        }\n+    }\n+}\n+\n+void bot_ai::OnBotChannelFinish(Spell const* spell)\n+{\n+    OnClassChannelFinish(spell);\n+}\n+\n+void bot_ai::OnBotSpellInterrupted(SpellSchoolMask schoolMask, uint32 unTimeMs)\n+{\n+    for (auto& [rank1_id, spell] : _spells)\n+    {\n+        SpellInfo const* info = sSpellMgr->GetSpellInfo(spell.spellId);\n+        if (!info || !(info->GetSchoolMask() & schoolMask)) continue;\n+        if (info->IsCooldownStartedOnEvent()) continue;\n+        if (info->PreventionType != SPELL_PREVENTION_TYPE_SILENCE) continue;\n+\n+        if (HasBotCommandState(BOT_COMMAND_ISSUED_ORDER) &&\n+            !_orders.empty() && _orders.front()._type == BOT_ORDER_SPELLCAST &&\n+            _orders.front().params.spellCastParams.baseSpell == rank1_id)\n+        {\n+            if (DEBUG_BOT_ORDERS)\n+                BOT_LOG_ERROR(\"entities.player\", \"doCast(): ordered spell {} was interrupted!\", info->Id);\n+            CompleteOrder(_orders.front());\n+        }\n+\n+        spell.cooldown += unTimeMs;\n+        //BOT_LOG_ERROR(\"entities.player\", \"OnBotSpellInterrupted(): Adding cooldown ({}, new: {}) to spell {} (id: {}, schoolmask: {}), reqSchoolMask = {}\",\n+        //    unTimeMs, itr->second.second, info->SpellName[0], info->Id, info->SchoolMask, schoolMask);\n+    }\n+\n+    GC_Timer = 0; //reset global cooldown since cast is canceled\n+}\n+\n+void bot_ai::CastBotItemCombatSpell(DamageInfo const& damageInfo)\n+{\n+    Unit* target = damageInfo.GetVictim();\n+    if (!target || !target->IsAlive() || target == me)\n+        return;\n+\n+    if (!me->CanUseAttackType(damageInfo.GetAttackType()))\n+        return;\n+\n+    Item* item;\n+    ItemTemplate const* proto;\n+    int8 slot;\n+\n+    for (auto i : NPCBots::index_array<uint8, BOT_INVENTORY_SIZE>)\n+    {\n+        item = _equips[i];\n+        if (!item)\n+            continue;\n+\n+        //skip standard items\n+        //if (i < BOT_SLOT_RANGED && einfo->ItemEntry[i] == item->GetEntry())\n+        //    continue;\n+\n+        proto = item->GetTemplate();\n+        if (!proto)\n+            continue;\n+\n+        // Additional check for weapons\n+        if (proto->Class == ITEM_CLASS_WEAPON)\n+        {\n+            // offhand item cannot proc from main hand hit etc\n+            switch (damageInfo.GetAttackType())\n+            {\n+                case BASE_ATTACK:   slot = BOT_SLOT_MAINHAND;   break;\n+                case OFF_ATTACK:    slot = BOT_SLOT_OFFHAND;    break;\n+                case RANGED_ATTACK: slot = BOT_SLOT_RANGED;     break;\n+                default:            slot = -1;                  break;\n+            }\n+            if (slot != i)\n+                continue;\n+        }\n+\n+        CastBotItemCombatSpell(damageInfo, item, proto);\n+    }\n+}\n+\n+void bot_ai::CastBotItemCombatSpell(DamageInfo const& damageInfo, Item* item, ItemTemplate const* proto)\n+{\n+    //TODO: custom spell triggers maybe?\n+\n+    // Can do effect if any damage done to target\n+    bool canTrigger = (damageInfo.GetHitMask() & (PROC_HIT_NORMAL | PROC_HIT_CRITICAL | PROC_HIT_ABSORB)) != 0;\n+    if (canTrigger)\n+    {\n+        for (auto i : NPCBots::index_array<uint8, MAX_ITEM_PROTO_SPELLS>)\n+        {\n+            _Spell const& spellData = proto->Spells[i];\n+\n+            // no spell\n+            if (!spellData.SpellId)\n+                continue;\n+\n+            // wrong triggering type\n+            if (spellData.SpellTrigger != ITEM_SPELLTRIGGER_CHANCE_ON_HIT)\n+                continue;\n+\n+            SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellData.SpellId);\n+            if (!spellInfo)\n+            {\n+                //BOT_LOG_ERROR(\"entities.player.items\", \"WORLD: unknown Item spellid {}\", spellData.SpellId);\n+                continue;\n+            }\n+\n+            float chance = static_cast<float>(spellInfo->ProcChance);\n+\n+            if (spellData.SpellPPMRate)\n+            {\n+                uint32 WeaponSpeed = me->GetAttackTime(damageInfo.GetAttackType());\n+                chance = me->GetPPMProcChance(WeaponSpeed, spellData.SpellPPMRate, spellInfo);\n+            }\n+            else if (chance > 100.0f)\n+                chance = me->GetWeaponProcChance();\n+\n+            if (roll_chance_f(chance))\n+            {\n+                CastSpellExtraArgs args(item);\n+                me->CastSpell(damageInfo.GetVictim(), spellInfo->Id, args);\n+            }\n+        }\n+    }\n+\n+    // item combat enchantments\n+    for (auto e_slot : NPCBots::index_array<uint8, MAX_ENCHANTMENT_SLOT>)\n+    {\n+        uint32 enchant_id = item->GetEnchantmentId(EnchantmentSlot(e_slot));\n+        SpellItemEnchantmentEntry const* pEnchant = sSpellItemEnchantmentStore.LookupEntry(enchant_id);\n+        if (!pEnchant)\n+            continue;\n+\n+        for (auto s : NPCBots::index_array<uint8, MAX_ITEM_ENCHANTMENT_EFFECTS>)\n+        {\n+            if (pEnchant->Effect[s] != ITEM_ENCHANTMENT_TYPE_COMBAT_SPELL)\n+                continue;\n+\n+            SpellEnchantProcEntry const* entry = sSpellMgr->GetSpellEnchantProcEvent(enchant_id);\n+            if (entry && entry->HitMask)\n+            {\n+                // Check hit/crit/dodge/parry requirement\n+                if ((entry->HitMask & damageInfo.GetHitMask()) == 0)\n+                    continue;\n+            }\n+            else\n+            {\n+                // Can do effect if any damage done to target\n+                if (!canTrigger)\n+                    continue;\n+            }\n+\n+            // check if enchant procs only on white hits\n+            if (entry && (entry->AttributesMask & ENCHANT_PROC_ATTR_WHITE_HIT) && damageInfo.GetSpellInfo())\n+                continue;\n+\n+            SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(pEnchant->EffectArg[s]);\n+            if (!spellInfo)\n+                continue;\n+\n+            float chance = pEnchant->EffectPointsMin[s] != 0 ? float(pEnchant->EffectPointsMin[s]) : me->GetWeaponProcChance();\n+            if (entry)\n+            {\n+                if (entry->ProcsPerMinute)\n+                {\n+                    chance = entry->ProcsPerMinute;\n+                    //handle SPELLMOD_PROC_PER_MINUTE spellmods\n+                    //Envenom\n+                    if (GetSpec() == BOT_SPEC_ROGUE_ASSASINATION && me->HasAuraTypeWithFamilyFlags(SPELL_AURA_ADD_FLAT_MODIFIER, SPELLFAMILY_ROGUE, 0x800000))\n+                        chance *= 1.75f;\n+                    //Improved Poisons\n+                    if (GetSpec() == BOT_SPEC_ROGUE_ASSASINATION && me->GetLevel() >= 25 && (spellInfo->SpellFamilyFlags[0] & 0x2000))\n+                        chance *= 1.5f;\n+\n+                    chance = me->GetPPMProcChance(proto->Delay, chance, spellInfo);\n+                }\n+                else if (entry->Chance)\n+                    chance = (float)entry->Chance;\n+            }\n+\n+            // Apply SPELLMOD_CHANCE_OF_SUCCESS spell mods\n+            //Envenom\n+            if (GetSpec() == BOT_SPEC_ROGUE_ASSASINATION && me->HasAuraTypeWithFamilyFlags(SPELL_AURA_ADD_FLAT_MODIFIER, SPELLFAMILY_ROGUE, 0x800000))\n+                chance += 15.f;\n+            //Improved Poisons\n+            if (GetSpec() == BOT_SPEC_ROGUE_ASSASINATION && me->GetLevel() >= 25 && (spellInfo->SpellFamilyFlags[0] & 0x10000))\n+                chance += 20.f;\n+\n+            // Shiv has 100% chance to apply the poison\n+            if (me->FindCurrentSpellBySpellId(5938) && e_slot == TEMP_ENCHANTMENT_SLOT)\n+                chance = 100.0f;\n+\n+            if (roll_chance_f(chance))\n+            {\n+                CastSpellExtraArgs args(item);\n+                me->CastSpell(spellInfo->IsPositive() ? me : damageInfo.GetVictim(), spellInfo->Id, args);\n+            }\n+        }\n+    }\n+}\n+//ORDERS\n+bool bot_ai::AddOrder(BotOrder&& order)\n+{\n+    if (_orders.size() >= MAX_BOT_ORDERS_QUEUE_SIZE)\n+    {\n+        BOT_LOG_ERROR(\"scripts\", \"bot_ai::AddOrder: orders limit reached for {} ({})!\", me->GetName(), uint32(_orders.size()));\n+        return false;\n+    }\n+\n+    _orders.push(std::move(order));\n+    return true;\n+}\n+void bot_ai::CancelOrder(BotOrder const& order)\n+{\n+    if (_orders.empty())\n+    {\n+        BOT_LOG_ERROR(\"scripts\", \"bot_ai::CancelOrder: {} orders are empty while trying to remove order type {}!\",\n+            me->GetName(), uint32(order._type));\n+        return;\n+    }\n+    if (_orders.front()._type != order._type)\n+    {\n+        BOT_LOG_ERROR(\"scripts\", \"bot_ai::CancelOrder: {} front order (type {}) is different from cur order (type {})!\",\n+            me->GetName(), uint32(_orders.front()._type), uint32(order._type));\n+        return;\n+    }\n+\n+    RemoveBotCommandState(BOT_COMMAND_ISSUED_ORDER);\n+    _orders.pop();\n+}\n+void bot_ai::CompleteOrder(BotOrder const& order)\n+{\n+    if (_orders.empty())\n+    {\n+        BOT_LOG_ERROR(\"scripts\", \"bot_ai::CompleteOrder: {} orders are empty while trying to remove order type {}!\",\n+            me->GetName(), uint32(order._type));\n+        return;\n+    }\n+    if (_orders.front()._type != order._type)\n+    {\n+        BOT_LOG_ERROR(\"scripts\", \"bot_ai::CompleteOrder: {} front order (type {}) is different from cur order (type {})!\",\n+            me->GetName(), uint32(_orders.front()._type), uint32(order._type));\n+        return;\n+    }\n+\n+    RemoveBotCommandState(BOT_COMMAND_ISSUED_ORDER);\n+    _orders.pop();\n+}\n+void bot_ai::CancelAllOrders()\n+{\n+    RemoveBotCommandState(BOT_COMMAND_ISSUED_ORDER);\n+    while (!_orders.empty())\n+        _orders.pop();\n+}\n+void bot_ai::_ProcessOrders()\n+{\n+    ordersTimer = 500;\n+\n+    while (!_orders.empty())\n+    {\n+        BotOrder const& order = _orders.front();\n+        if (order._timeout <= time(0))\n+        {\n+            if (DEBUG_BOT_ORDERS)\n+                BOT_LOG_DEBUG(\"npcbots\", \"bot_ai::_ProcessOrders: {} front order (type {}) expired...\", me->GetName(), uint32(order._type));\n+            CancelOrder(order);\n+        }\n+        else if (order._type == BOT_ORDER_PULL && (!HasRole(BOT_ROLE_DPS) || me->IsInCombat() || !me->getAttackers().empty()))\n+            CompleteOrder(order);\n+        else\n+            break;\n+    }\n+\n+    if (_orders.empty())\n+        return;\n+\n+    if (HasBotCommandState(BOT_COMMAND_ISSUED_ORDER))\n+        return;\n+\n+    if (JumpingOrFalling())\n+        return;\n+\n+    BotOrder const& order = _orders.front();\n+    Unit* target = nullptr;\n+    switch (order._type)\n+    {\n+        case BOT_ORDER_SPELLCAST:\n+        {\n+            if (CCed(me))\n+                break;\n+\n+            SetBotCommandState(BOT_COMMAND_ISSUED_ORDER);\n+\n+            ObjectGuid guid(order.params.spellCastParams.targetGuid);\n+            if (guid == me->GetGUID())\n+                target = me;\n+            else if (guid == master->GetGUID())\n+                target = master;\n+            else if (!guid.IsEmpty())\n+            {\n+                if (!IAmFree())\n+                    target = master->GetBotMgr()->GetBot(guid);\n+                if (!target)\n+                    target = ObjectAccessor::GetUnit(*me, guid);\n+            }\n+            else\n+            {\n+                BOT_LOG_ERROR(\"scripts\", \"bot_ai:_ProcessOrders: invalid spellCastParams.targetGuid {}!\", order.params.spellCastParams.targetGuid);\n+                CancelOrder(order);\n+                return;\n+            }\n+\n+            if (!target || !target->IsInWorld())\n+            {\n+                BOT_LOG_ERROR(\"scripts\", \"bot_ai:_ProcessOrders: target {} not found!\", order.params.spellCastParams.targetGuid);\n+                CancelOrder(order);\n+                return;\n+            }\n+\n+            if (IsCasting())\n+                me->InterruptNonMeleeSpells(false);\n+\n+            doCast(target, _spells.at(order.params.spellCastParams.baseSpell).spellId);\n+            break;\n+        }\n+        case BOT_ORDER_PULL:\n+        {\n+            if (me->GetVictim())\n+                break;\n+            if (CCed(me))\n+                break;\n+\n+            SetBotCommandState(BOT_COMMAND_ISSUED_ORDER);\n+\n+            if (!order.params.pullParams.targetGuid.IsEmpty())\n+                target = ObjectAccessor::GetUnit(*me, order.params.pullParams.targetGuid);\n+            else\n+            {\n+                BOT_LOG_ERROR(\"scripts\", \"bot_ai:_ProcessOrders: invalid pullParams.targetGuid {}!\", order.params.pullParams.targetGuid);\n+                CancelOrder(order);\n+                return;\n+            }\n+\n+            if (!target || !target->IsInWorld())\n+            {\n+                BOT_LOG_ERROR(\"scripts\", \"bot_ai:_ProcessOrders: target {} not found!\", order.params.pullParams.targetGuid);\n+                CancelOrder(order);\n+                return;\n+            }\n+            if (!target->IsAlive() || target->IsInCombat() || !CanBotAttack(target))\n+            {\n+                BOT_LOG_ERROR(\"scripts\", \"bot_ai:_ProcessOrders: target {} cannot be pulled!\", order.params.pullParams.targetGuid);\n+                CancelOrder(order);\n+                return;\n+            }\n+            break;\n+        }\n+        default:\n+            BOT_LOG_ERROR(\"scripts\", \"bot_ai:_ProcessOrders: invalid order type {}!\", uint32(order._type));\n+            CancelOrder(order);\n+            return;\n+    }\n+}\n+bool bot_ai::IsLastOrder(BotOrderTypes order_type, uint32 param1, ObjectGuid guidparam1) const\n+{\n+    if (!_orders.empty())\n+    {\n+        BotOrder const& order = _orders.front();\n+        if (order_type == order._type)\n+        {\n+            switch (order_type)\n+            {\n+                case BOT_ORDER_SPELLCAST:\n+                    if (!param1 || order.params.spellCastParams.baseSpell == param1)\n+                        return true;\n+                    break;\n+                case BOT_ORDER_PULL:\n+                    if (!guidparam1 || order.params.pullParams.targetGuid == guidparam1)\n+                        return true;\n+                    break;\n+                default:\n+                    BOT_LOG_ERROR(\"scripts\", \"bot_ai:IsLastOrder: invalid order type {}!\", uint32(order_type));\n+                    break;\n+            }\n+        }\n+    }\n+\n+    return false;\n+}\n+//VEHICLES\n+//helpers\n+bool bot_ai::HasAuraTypeWithValueAtLeast(AuraType auratype, int32 minvalue, Unit const* unit) const\n+{\n+    if (!unit)\n+        unit = me;\n+\n+    Unit::AuraEffectList const& mTotalAuraList = unit->GetAuraEffectsByType(auratype);\n+    for (Unit::AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)\n+        if ((*i)->GetAmount() >= minvalue)\n+            return true;\n+\n+    return false;\n+}\n+//strats - opponent is always valid\n+void bot_ai::DoSkytalonVehicleStrats(uint32 diff)\n+{\n+    if (GC_Timer > diff)\n+        return;\n+\n+    GC_Timer = 350; //at least this delay\n+\n+    if (!CheckVehicleAttackTarget(_curVehStrat))\n+        return;\n+\n+    Creature* drake = me->GetVehicleCreatureBase();\n+    Unit* target = nullptr;\n+    uint32 drakespell = 0;\n+    uint32 drakePower = drake->GetPower(POWER_ENERGY);\n+\n+    //finishers\n+    uint8 finishComboPoints;\n+    uint32 finishPower;\n+    if (GetHealthPCT(drake) <= (40 + 40*drake->HasAuraType(SPELL_AURA_PERIODIC_DAMAGE)) ||\n+        HasAuraTypeWithValueAtLeast(SPELL_AURA_PERIODIC_DAMAGE, drake->GetMaxHealth() / 16, drake))\n+    {\n+        finishComboPoints = 3;\n+        finishPower = 25;\n+    }\n+    //if (HasRole(BOT_ROLE_HEAL))\n+    //{\n+    //    finishComboPoints = 4;\n+    //    finishPower = 50;\n+    //}\n+    else\n+    {\n+        finishComboPoints = 4;\n+        finishPower = 50;\n+    }\n+\n+    if (_vehcomboPoints >= finishComboPoints && (Rand() < 75 + 40*(_vehcomboPoints >= 5 || drakePower < finishPower)))\n+    {\n+        if (drakePower >= finishPower)\n+        {\n+            if (GetHealthPCT(drake) < 60 && !drake->HasAuraEffect(drake->m_spells[4], EFFECT_0))\n+            {\n+                drakespell = drake->m_spells[4]; //flame shield\n+                target = drake;\n+            }\n+            else if (HasRole(BOT_ROLE_HEAL))\n+            {\n+                drakespell = drake->m_spells[3]; //life burst\n+                bool cast = false;\n+                //find damaged target\n+                if (master->GetVehicle() && GetHealthPCT(master->GetVehicleBase()) < 90 && master->GetVehicleBase()->GetDistance(drake) < 60)\n+                    cast = true;\n+                else if (GetHealthPCT(drake) < 90)\n+                    cast = true;\n+                else\n+                {\n+                    std::vector<Unit*> vec = BotMgr::GetAllGroupMembers(master);\n+                    cast = std::ranges::any_of(vec, [drake = drake](Unit const* member) {\n+                        return drake->GetMap() == member->FindMap() && member->GetVehicle() &&\n+                            member->GetVehicleBase()->GetHealthPct() < 90.0f && member->GetVehicleBase()->GetDistance(drake) < 60;\n+                    });\n+                }\n+                if (cast)\n+                    target = drake;\n+            }\n+            else\n+            {\n+                drakespell = drake->m_spells[1]; //engulf in flames\n+                target = opponent;\n+            }\n+        }\n+    }\n+    else if (drakePower >= 35)\n+    {\n+        if (HasRole(BOT_ROLE_DPS))\n+        {\n+            drakespell = drake->m_spells[0]; //flame spike\n+            target = opponent;\n+        }\n+        else if (HasRole(BOT_ROLE_HEAL))\n+        {\n+            drakespell = drake->m_spells[2]; //revivify\n+            //bots won't care about target they have cp on so choose randomly\n+            std::list<Unit*> targets1;\n+            if (Group const* gr = master->GetGroup())\n+            {\n+                bool Bots = false;\n+                for (GroupReference const* itr = gr->GetFirstMember(); itr != nullptr; itr = itr->next())\n+                {\n+                    Player const* p = itr->GetSource();\n+                    if (!p || me->GetMap() != p->FindMap()) continue;\n+                    if (p->HaveBot() && !Bots)\n+                        Bots = true;\n+                    Unit* u = p->GetVehicleBase();\n+                    if (u && u->IsAlive() && !u->HasUnitState(UNIT_STATE_ISOLATED) && drake->GetDistance(u) < 60.f &&\n+                        !(GetHealthPCT(u) > 95 && !IsTank(p)) &&\n+                        (GetHealthPCT(u) < 95 || (u->IsInCombat() && !u->getAttackers().empty())))\n+                        targets1.push_back(u);\n+                }\n+                if (Bots)\n+                {\n+                    for (GroupReference const* itr = gr->GetFirstMember(); itr != nullptr; itr = itr->next())\n+                    {\n+                        Player const* p = itr->GetSource();\n+                        if (!p || me->GetMap() != p->FindMap() || !p->HaveBot()) continue;\n+\n+                         for (auto const& [_, bot] : *p->GetBotMgr()->GetBotMap())\n+                        {\n+                            Unit* u = bot ? bot->GetVehicleBase() : nullptr;\n+                            if (u && u->IsAlive() && !u->HasUnitState(UNIT_STATE_ISOLATED) && drake->GetDistance(u) < 60.f &&\n+                                !(GetHealthPCT(u) > 95 && !IsTank(bot)) &&\n+                                (GetHealthPCT(u) < 95 || (u->IsInCombat() && !u->getAttackers().empty())))\n+                                targets1.push_back(u);\n+                        }\n+                    }\n+                }\n+            }\n+            else\n+            {\n+                for (auto const& [_, bot] : *master->GetBotMgr()->GetBotMap())\n+                {\n+                    Unit* u = bot ? bot->GetVehicleBase() : nullptr;\n+                    if (u && u->IsAlive() && !u->HasUnitState(UNIT_STATE_ISOLATED) && drake->GetDistance(u) < 60.f &&\n+                        !(GetHealthPCT(u) > 95 && !IsTank(bot)) &&\n+                        (GetHealthPCT(u) < 95 || (u->IsInCombat() && !u->getAttackers().empty())))\n+                        targets1.push_back(u);\n+                }\n+            }\n+\n+            uint8 minhppct = 0;\n+            for (Unit const* u : targets1)\n+                if (uint8 hppct = GetHealthPCT(u))\n+                    if (minhppct == 0 || minhppct > hppct)\n+                        minhppct = hppct;\n+\n+            if (minhppct <= 75)\n+                std::erase_if(targets1, BOTAI_PRED::HpPctAboveExclude(static_cast<float>(minhppct + 10)));\n+\n+            if (!targets1.empty())\n+                target = Bcore::Containers::SelectRandomContainerElement(targets1);\n+\n+            if (target && drakePower < 80)\n+                if (Aura const* revi = target->GetAura(57090, drake->GetGUID())) //revivify\n+                    if (revi->GetStackAmount() >= 5 && revi->GetDuration() >= 4000)\n+                        target = nullptr;\n+        }\n+    }\n+\n+    //if (!HasRole(BOT_ROLE_TANK|BOT_ROLE_HEAL) && drake->GetMap()->IsRaid() && target && target->GetVictim() == drake)\n+    //    target = nullptr;\n+\n+    if (!target)\n+        return;\n+\n+    if (!drakespell)\n+    {\n+        BOT_LOG_ERROR(\"scripts\", \"DoSkytalonVehicleStrats no spell for role mask {} cp {}, power {}, target {}\",\n+            GetBotRoles(), uint32(_vehcomboPoints), drakePower, target->GetName());\n+        return;\n+    }\n+\n+    //BOT_LOG_ERROR(\"scripts\", \"DoSkytalonVehicleStrats {} on {}\", drakespell, target->GetName());\n+\n+    SetBotCommandState(BOT_COMMAND_ATTACK);\n+    drake->BotStopMovement();\n+    drake->SetInFront(target);\n+    drake->CastSpell(target, drakespell);\n+}\n+void bot_ai::DoRubyDrakeVehicleStrats(uint32 diff)\n+{\n+    if (GC_Timer > diff)\n+        return;\n+\n+    GC_Timer = 350; //at least this delay\n+\n+    if (!CheckVehicleAttackTarget(_curVehStrat))\n+        return;\n+\n+    Creature* drake = me->GetVehicleCreatureBase();\n+    ASSERT(drake);\n+    Unit* target = nullptr;\n+    uint32 drakespell = 0;\n+\n+    //IS TANK\n+    //50232 Searing Wrath\n+    //50241 Evasive Charges\n+    //50240 Evasive Maneuvers\n+    //50253 Martyr\n+\n+    Aura const* evas = drake->GetAura(50241); //Evasive Charges\n+    uint8 vehicles = LivingVehiclesCount();\n+    //bool eregos = opponent->GetEntry() == CREATURE_BOSS_EREGOS_N || opponent->GetEntry() == CREATURE_BOSS_EREGOS_H;\n+\n+    bool finalEncounter = master->GetInstanceScript() && master->GetInstanceScript()->GetBossState(2) == DONE; //DATA_UROM\n+\n+    if (vehicles > 1 && evas)\n+    {\n+        bool canManeuver = !drake->HasAuraType(SPELL_AURA_MOD_ATTACKER_SPELL_HIT_CHANCE) && evas->GetStackAmount() >= 5 &&\n+            !drake->HasSpellCooldown(50240);\n+        bool canMartyr = !drake->HasAuraType(SPELL_AURA_SPELL_MAGNET) &&\n+            !drake->HasSpellCooldown(50253);\n+\n+        if ((!finalEncounter || canMartyr) && canManeuver)\n+        {\n+            drakespell = drake->m_spells[1]; //Evasive Maneuvers\n+            target = drake;\n+        }\n+        else if (finalEncounter && canMartyr)\n+        {\n+            drakespell = drake->m_spells[2]; //Martyr\n+            target = drake;\n+        }\n+    }\n+    if (!target)\n+    {\n+        drakespell = drake->m_spells[0]; //Searing Wrath\n+        target = opponent;\n+    }\n+\n+    if (!target)\n+        return;\n+\n+    if (!drakespell)\n+    {\n+        BOT_LOG_ERROR(\"scripts\", \"DoRubyDrakeVehicleStrats no spell for target {}\", target->GetName());\n+        return;\n+    }\n+\n+    SetBotCommandState(BOT_COMMAND_ATTACK);\n+    drake->BotStopMovement();\n+    drake->SetInFront(target);\n+    drake->CastSpell(target, drakespell);\n+}\n+void bot_ai::DoEmeraldDrakeVehicleStrats(uint32 diff)\n+{\n+    if (GC_Timer > diff)\n+        return;\n+\n+    GC_Timer = 350; //at least this delay\n+\n+    Creature* drake = me->GetVehicleCreatureBase();\n+    Unit const* mmover = master->GetVehicle() ? master->GetVehicleBase() : master;\n+    Unit* target = nullptr;\n+    uint32 drakespell = 0;\n+\n+    //IS HEALER\n+    //50328 Leeching Poison\n+    //50341 Touch the Nightmare\n+    //50344 Dream Funnel\n+\n+    uint8 drakeHpPct = GetHealthPCT(drake);\n+\n+    //canceling channel\n+    if (IsCasting(drake))\n+    {\n+        bool interrupt = false;\n+        if (drakeHpPct <= 30)\n+            interrupt = true;\n+        else if (mmover->isMoving() && drake->GetDistance(mmover) >= 75.f && !mmover->HasInArc(float(M_PI) / 2, drake))\n+            interrupt = true;\n+        else if (Spell const* funnel = drake->GetCurrentSpell(CURRENT_CHANNELED_SPELL))\n+            if (ObjectGuid guid = funnel->m_targets.GetUnitTargetGUID(); !guid.IsEmpty())\n+                if (Unit const* tar = ObjectAccessor::GetUnit(*drake, guid))\n+                    if (GetHealthPCT(tar) > 95)\n+                        interrupt = true;\n+\n+        if (interrupt)\n+            drake->InterruptNonMeleeSpells(false);\n+        else\n+            return;\n+    }\n+\n+    if (!CheckVehicleAttackTarget(_curVehStrat))\n+        return;\n+\n+    Aura const* pois = opponent->GetAura(50328, drake->GetGUID()); //Leeching Poison\n+    Aura const* rift = opponent->GetAura(49592); //Temporal Rift\n+    uint8 vehicles = LivingVehiclesCount();\n+    bool eregos = opponent->GetEntry() == CREATURE_BOSS_EREGOS_N || opponent->GetEntry() == CREATURE_BOSS_EREGOS_H;\n+\n+    bool finalEncounter = master->GetInstanceScript() && master->GetInstanceScript()->GetBossState(2) == DONE; //DATA_UROM\n+    bool canheal = finalEncounter && vehicles > 1 && (!eregos || drake->GetDistance(mmover) < 30.f) &&\n+        drakeHpPct >= (eregos ? 70 : 50) - (pois ? 5 * pois->GetStackAmount() : 0);\n+\n+    if (canheal && Rand() < 90)\n+    {\n+        drakespell = drake->m_spells[2]; //Dream Funnel\n+        std::list<Unit*> targets1;\n+        if (Group const* gr = master->GetGroup())\n+        {\n+            bool Bots = false;\n+            for (GroupReference const* itr = gr->GetFirstMember(); itr != nullptr; itr = itr->next())\n+            {\n+                Player const* p = itr->GetSource();\n+                if (!p || me->GetMap() != p->FindMap()) continue;\n+                if (p->HaveBot() && !Bots)\n+                    Bots = true;\n+                Unit* u = p->GetVehicleBase();\n+                if (u && u->IsAlive() && !u->HasUnitState(UNIT_STATE_ISOLATED) && drake->GetDistance(u) < 60.f &&\n+                    GetHealthPCT(u) <= (IsTank(p) ? 50 : 35) + (rift ? 15 : 0))\n+                    targets1.push_back(u);\n+            }\n+            if (Bots)\n+            {\n+                for (GroupReference const* itr = gr->GetFirstMember(); itr != nullptr; itr = itr->next())\n+                {\n+                    Player const* p = itr->GetSource();\n+                    if (!p || me->GetMap() != p->FindMap() || !p->HaveBot()) continue;\n+\n+                    for (auto const& [_, bot] : *p->GetBotMgr()->GetBotMap())\n+                    {\n+                        Unit* u = bot ? bot->GetVehicleBase() : nullptr;\n+                        if (u && u != drake && u->IsAlive() && !u->HasUnitState(UNIT_STATE_ISOLATED) && drake->GetDistance(u) < 60.f &&\n+                            GetHealthPCT(u) <= (IsTank(bot) ? 50 : 35) + (rift ? 15 : 0))\n+                            targets1.push_back(u);\n+                    }\n+                }\n+            }\n+        }\n+        else\n+        {\n+            for (auto const& [_, bot] : *master->GetBotMgr()->GetBotMap())\n+            {\n+                Unit* u = bot ? bot->GetVehicleBase() : nullptr;\n+                if (u && u != drake && u->IsAlive() && !u->HasUnitState(UNIT_STATE_ISOLATED) && drake->GetDistance(u) < 60.f &&\n+                    GetHealthPCT(u) <= (IsTank(bot) ? 50 : 35) + (rift ? 15 : 0))\n+                    targets1.push_back(u);\n+            }\n+        }\n+\n+        uint8 minhppct = 0;\n+        for (Unit const* u : targets1)\n+            if (uint8 hppct = GetHealthPCT(u))\n+                if (minhppct == 0 || minhppct > hppct)\n+                    minhppct = hppct;\n+\n+        if (minhppct <= 50)\n+            std::erase_if(targets1, BOTAI_PRED::HpPctAboveExclude(static_cast<float>(minhppct + 20)));\n+\n+        if (!targets1.empty())\n+            target = Bcore::Containers::SelectRandomContainerElement(targets1);\n+    }\n+    if (!target)\n+    {\n+        drakespell = drake->m_spells[1]; //Touch the Nightmare\n+        if (!drake->HasSpellCooldown(drakespell))\n+        {\n+            if ((eregos && drakeHpPct >= ((opponent->GetHealth() < (rift ? 50000u : 25000u)) ? 31 : 80)) ||\n+                (drakeHpPct >= 90 && Rand() < 50 && !opponent->HasAura(drakespell)))\n+                target = opponent;\n+        }\n+    }\n+    if (!target)\n+    {\n+        drakespell = drake->m_spells[0]; //Leeching Poison\n+        if (!pois || pois->GetStackAmount() < 3 || pois->GetDuration() < 4000)\n+            target = opponent;\n+        else\n+        {\n+            //random target\n+            std::list<Unit*> targets;\n+            Bcore::AnyUnfriendlyUnitInObjectRangeCheck check(drake, drake, 60.f);\n+            Bcore::UnitListSearcher <Bcore::AnyUnfriendlyUnitInObjectRangeCheck> searcher(drake, targets, check);\n+            //drake->VisitNearbyObject(60.f, searcher);\n+            Cell::VisitAllObjects(drake, searcher, 60.f);\n+            std::erase_if(targets, BOTAI_PRED::UnitExclude(opponent));\n+            std::erase_if(targets, BOTAI_PRED::UnitCombatStateExclude(false));\n+            std::erase_if(targets, BOTAI_PRED::AuraedTargetExcludeByCaster(drakespell, drake->GetGUID(), 3));\n+            std::erase_if(targets, BOTAI_PRED::AuraedTargetExclude(49836, 5)); //Shock Charge 1-shots\n+\n+            if (!targets.empty())\n+                target = Bcore::Containers::SelectRandomContainerElement(targets);\n+        }\n+    }\n+\n+    if (!target)\n+        return;\n+\n+    if (!drakespell)\n+    {\n+        BOT_LOG_ERROR(\"scripts\", \"DoEmeraldDrakeVehicleStrats no spell for target {}\", target->GetName());\n+        return;\n+    }\n+\n+    SetBotCommandState(BOT_COMMAND_ATTACK);\n+    drake->BotStopMovement();\n+    drake->SetInFront(target);\n+    drake->CastSpell(target, drakespell);\n+}\n+void bot_ai::DoAmberDrakeVehicleStrats(uint32 diff)\n+{\n+    if (GC_Timer > diff)\n+        return;\n+\n+    GC_Timer = 350; //at least this delay\n+\n+    if (!CheckVehicleAttackTarget(_curVehStrat))\n+        return;\n+\n+    Creature* drake = me->GetVehicleCreatureBase();\n+    ASSERT(drake);\n+    Unit const* mmover = master->GetVehicle() ? master->GetVehicleBase() : master;\n+    Unit* target = nullptr;\n+    uint32 drakespell = 0;\n+\n+    //IS DPS\n+    //49840 Shock Lance\n+    //49838 Stop Time\n+    //49592 Temporal Rift\n+    //49836 Shock Charge\n+\n+    Aura const* shoc = opponent->GetAura(49836, drake->GetGUID()); //Shock Charge\n+\n+    //canceling channel\n+    if (IsCasting(drake))\n+    {\n+        bool interrupt = false;\n+\n+        if (mmover->isMoving() && drake->GetDistance(mmover) >= 60.f && !mmover->HasInArc(float(M_PI) / 2, drake))\n+            interrupt = true;\n+        else if (shoc && shoc->GetStackAmount() >= 10)\n+            interrupt = true;\n+\n+        if (interrupt)\n+            drake->InterruptNonMeleeSpells(false);\n+        else\n+            return;\n+    }\n+\n+    Aura const* rift = opponent->GetAura(49592); //Temporal Rift\n+    uint8 vehicles = LivingVehiclesCount();\n+    bool eregos = opponent->GetEntry() == CREATURE_BOSS_EREGOS_N || opponent->GetEntry() == CREATURE_BOSS_EREGOS_H;\n+\n+    bool finalEncounter = master->GetInstanceScript() && master->GetInstanceScript()->GetBossState(2) == DONE; //DATA_UROM\n+\n+    if (eregos && !drake->HasSpellCooldown(drake->m_spells[1]) && IsCasting(opponent) &&\n+        opponent->HasAuraType(SPELL_AURA_MOD_CASTING_SPEED_NOT_STACK) && opponent->GetDiminishing(DIMINISHING_STUN) <= DIMINISHING_LEVEL_2)\n+    {\n+        drakespell = drake->m_spells[1]; //Stop Time\n+        target = drake;\n+    }\n+    if (!target && shoc && shoc->GetStackAmount() >= 5)\n+    {\n+        drakespell = drake->m_spells[0]; //Shock Lance\n+        if (eregos && shoc->GetStackAmount() >= 10 && (rift || shoc->GetDuration() < 25000 || Rand() < 30))\n+            target = opponent;\n+        else\n+        {\n+            //random 1-shot target\n+            std::list<Unit*> targets;\n+            Bcore::AnyUnfriendlyUnitInObjectRangeCheck check(drake, drake, 60.f);\n+            Bcore::UnitListSearcher <Bcore::AnyUnfriendlyUnitInObjectRangeCheck> searcher(drake, targets, check);\n+            //drake->VisitNearbyObject(60.f, searcher);\n+            Cell::VisitAllObjects(drake, searcher, 60.f);\n+            std::erase_if(targets, BOTAI_PRED::UnitExclude(opponent));\n+\n+            if (!targets.empty())\n+                target = Bcore::Containers::SelectRandomContainerElement(targets);\n+        }\n+    }\n+    if (!target)\n+    {\n+        if (finalEncounter && vehicles > 1)\n+        {\n+            drakespell = drake->m_spells[2]; //Temporal Rift\n+            target = opponent;\n+        }\n+        else\n+        {\n+            drakespell = drake->m_spells[0]; //Shock Lance\n+            target = opponent;\n+        }\n+    }\n+\n+    if (!target)\n+        return;\n+\n+    if (!drakespell)\n+    {\n+        BOT_LOG_ERROR(\"scripts\", \"DoAmberDrakeVehicleStrats no spell for target {}\", target->GetName());\n+        return;\n+    }\n+\n+    SetBotCommandState(BOT_COMMAND_ATTACK);\n+    drake->BotStopMovement();\n+    drake->SetInFront(target);\n+    drake->CastSpell(target, drakespell);\n+}\n+void bot_ai::DoArgentMountVehicleStrats(uint32 diff)\n+{\n+    if (GC_Timer > diff)\n+        return;\n+\n+    GC_Timer = 200; //at least this delay\n+\n+    Creature* mount = me->GetVehicleCreatureBase();\n+\n+    //Tounament spells\n+    //62544 Thrust\n+    //62575 Shield-Breaker\n+    //62960 Charge\n+    //62552 Defend\n+    //64077 Refresh Mount\n+\n+    //ToC5 spells\n+    //68505 Thrust\n+    //62575 Shield-Breaker\n+    //68282 Charge\n+    //62552 Defend\n+\n+    if (!mount->HasSpellCooldown(mount->m_spells[3])) //Defend\n+    {\n+        Aura const* myde = mount->GetAura(mount->m_spells[3]);\n+        if (!myde || myde->GetStackAmount() < myde->GetSpellInfo()->StackAmount || myde->GetDuration() <= 8000)\n+        {\n+            mount->CastSpell(mount, mount->m_spells[3]);\n+            return;\n+        }\n+    }\n+\n+    if (!CheckVehicleAttackTarget(_curVehStrat))\n+        return;\n+\n+    //Unit const* mmover = master->GetVehicle() ? master->GetVehicleBase() : master;\n+    Unit* target = nullptr;\n+    uint32 mountspell = 0;\n+\n+    if (mount->GetDistance(opponent) > 5.f)\n+    {\n+        //Defend\n+        AuraEffect const* def = opponent->GetAuraEffect(SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN,SPELLFAMILY_GENERIC, 2007, EFFECT_0);\n+        if (!def)\n+            def = opponent->GetAuraEffect(SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN,SPELLFAMILY_GENERIC, 2007, EFFECT_2);\n+        if ((!def || def->GetBase()->GetStackAmount() < 2) && !mount->HasSpellCooldown(mount->m_spells[2]))\n+        {\n+            mountspell = mount->m_spells[2]; //Charge\n+            target = opponent;\n+        }\n+        else\n+        {\n+            mountspell = mount->m_spells[1]; //Shield-Breaker\n+            target = opponent;\n+        }\n+    }\n+    else\n+    {\n+        mountspell = mount->m_spells[0]; //Thrust\n+        target = opponent;\n+    }\n+\n+    if (!target)\n+        return;\n+\n+    if (!mountspell)\n+    {\n+        BOT_LOG_ERROR(\"scripts\", \"DoArgentMountVehicleStrats no spell for target {}\", target->GetName());\n+        return;\n+    }\n+\n+    SetBotCommandState(BOT_COMMAND_ATTACK);\n+    mount->BotStopMovement();\n+    mount->SetInFront(target);\n+    mount->CastSpell(target, mountspell);\n+}\n+void bot_ai::DoDemolisherVehicleStrats(uint32 diff)\n+{\n+    if (GC_Timer > diff)\n+        return;\n+\n+    GC_Timer = 350; //at least this delay\n+\n+    if (!CheckVehicleAttackTarget(_curVehStrat))\n+        return;\n+}\n+void bot_ai::DoSiegeEngineVehicleStrats(uint32 diff)\n+{\n+    if (GC_Timer > diff)\n+        return;\n+\n+    GC_Timer = 350; //at least this delay\n+\n+    if (!CheckVehicleAttackTarget(_curVehStrat))\n+        return;\n+}\n+void bot_ai::DoChopperVehicleStrats(uint32 diff)\n+{\n+    if (GC_Timer > diff)\n+        return;\n+\n+    GC_Timer = 350; //at least this delay\n+\n+    if (!CheckVehicleAttackTarget(_curVehStrat))\n+        return;\n+}\n+void bot_ai::DoGenericVehicleStrats(uint32 diff)\n+{\n+    if (GC_Timer > diff)\n+        return;\n+\n+    GC_Timer = 350; //at least this delay\n+\n+    if (!CheckVehicleAttackTarget(_curVehStrat))\n+        return;\n+}\n+void bot_ai::DoVehicleStrats(BotVehicleStrats strat, uint32 diff)\n+{\n+    if (_curVehStrat != strat)\n+    {\n+        //BOT_LOG_ERROR(\"scripts\", \"DoVehicleStrats doing strat {}\", uint32(strat));\n+        _curVehStrat = strat;\n+    }\n+\n+    //if (!master->GetVehicle() || me->GetVehicle()->GetCreatureEntry() != master->GetVehicle()->GetCreatureEntry())\n+    //{\n+    //    BOT_LOG_ERROR(\"scripts\", \"DoVehicleStrats cannot do strats: master not on vehicle or on different one\");\n+    //    return;\n+    //}\n+\n+    switch (strat)\n+    {\n+        case BOT_VEH_STRAT_WYRMREST_SKYTALON:\n+            DoSkytalonVehicleStrats(diff);\n+            break;\n+        case BOT_VEH_STRAT_RUBY_DRAKE:\n+            DoRubyDrakeVehicleStrats(diff);\n+            break;\n+        case BOT_VEH_STRAT_EMERALD_DRAKE:\n+            DoEmeraldDrakeVehicleStrats(diff);\n+            break;\n+        case BOT_VEH_STRAT_AMBER_DRAKE:\n+            DoAmberDrakeVehicleStrats(diff);\n+            break;\n+        case BOT_VEH_STRAT_TOC5_MOUNT:\n+            DoArgentMountVehicleStrats(diff);\n+            break;\n+        case BOT_VEH_STRAT_ULDUAR_DEMOLISHER:\n+            DoDemolisherVehicleStrats(diff);\n+            break;\n+        case BOT_VEH_STRAT_ULDUAR_SIEGEENGINE:\n+            DoSiegeEngineVehicleStrats(diff);\n+            break;\n+        case BOT_VEH_STRAT_ULDUAR_CHOPPER:\n+            DoChopperVehicleStrats(diff);\n+            break;\n+        case BOT_VEH_STRAT_GENERIC:\n+            DoGenericVehicleStrats(diff);\n+            break;\n+        default:\n+            BOT_LOG_ERROR(\"scripts\", \"Unhandled vehicle strat {}\", uint32(strat));\n+            break;\n+    }\n+}\n+void bot_ai::DoVehicleActions(uint32 diff)\n+{\n+    if (!me->GetVehicle())\n+        return;\n+\n+    //choose strat\n+    BotVehicleStrats strat;\n+    switch (me->GetVehicleBase()->GetEntry())\n+    {\n+        case CREATURE_NEXUS_SKYTALON_1:\n+        case CREATURE_EOE_SKYTALON_N:\n+        case CREATURE_EOE_SKYTALON_H:\n+            strat = BOT_VEH_STRAT_WYRMREST_SKYTALON;\n+            break;\n+        case CREATURE_OCULUS_DRAKE_RUBY:\n+            strat = BOT_VEH_STRAT_RUBY_DRAKE;\n+            break;\n+        case CREATURE_OCULUS_DRAKE_EMERALD:\n+            strat = BOT_VEH_STRAT_EMERALD_DRAKE;\n+            break;\n+        case CREATURE_OCULUS_DRAKE_AMBER:\n+            strat = BOT_VEH_STRAT_AMBER_DRAKE;\n+            break;\n+        //case CREATURE_TOC_STEED_QUELDOREI:\n+        //case CREATURE_TOC_NIGHTSABER:\n+        //case CREATURE_TOC_STEED_STORMWIND:\n+        //case CREATURE_TOC_MECHANOSTRIDER:\n+        //case CREATURE_TOC_RAM:\n+        //case CREATURE_TOC_ELEKK:\n+        //case CREATURE_TOC_HAWKSTRIDER_SUNREAVER:\n+        //case CREATURE_TOC_RAPTOR:\n+        //case CREATURE_TOC_WARHORSE:\n+        //case CREATURE_TOC_WOLF:\n+        //case CREATURE_TOC_HAWKSTRIDER_SILVERMOON:\n+        //case CREATURE_TOC_KODO:\n+        case CREATURE_TOC5_WARHORSE:\n+        case CREATURE_TOC5_BATTLEWORG:\n+            strat = BOT_VEH_STRAT_TOC5_MOUNT;\n+            break;\n+        /*\n+        case CREATURE_ULDUAR_DEMOLISHER:\n+            strat = BOT_VEH_STRAT_ULDUAR_DEMOLISHER;\n+            break;\n+        case CREATURE_ULDUAR_SIEGE_ENGINE:\n+            strat = BOT_VEH_STRAT_ULDUAR_SIEGEENGINE;\n+            break;\n+        case CREATURE_ULDUAR_CHOPPER:\n+        case CREATURE_ULDUAR_CHOPPER1:\n+            strat = BOT_VEH_STRAT_ULDUAR_CHOPPER;\n+            break;\n+        */\n+        default:\n+            strat = BOT_VEH_STRAT_GENERIC;\n+            if (_curVehStrat != strat)\n+                BOT_LOG_DEBUG(\"scripts\", \"bot_ai DoVehicleActions: {} has to use generic strat for vehicle creature {} ({})\",\n+                me->GetName(), me->GetVehicleBase()->GetName(), me->GetVehicleBase()->GetEntry());\n+            break;\n+    }\n+\n+    DoVehicleStrats(strat, diff);\n+}\n+bool bot_ai::CheckVehicleAttackTarget(BotVehicleStrats strat)\n+{\n+    opponent = _getVehicleTarget(strat);\n+\n+    if (!opponent)\n+    {\n+        if (!me->GetVehicleBase()->GetTarget().IsEmpty())\n+        {\n+            me->GetVehicleBase()->AttackStop();\n+            me->GetVehicleBase()->SetTarget(ObjectGuid::Empty);\n+        }\n+        else if (!master->GetVehicle() && me->GetVehicleBase()->GetDistance(master) < ((Rand() < 25) ? 35 : 15))\n+        {\n+            //if (VehicleSeatEntry const* seat = me->GetVehicle()->GetSeatForPassenger(me))\n+            //{\n+                //if (seat->CanEnterOrExit())\n+                    me->ExitVehicle();\n+                    //me->BotStopMovement();\n+            //}\n+        }\n+\n+        return false;\n+    }\n+\n+    if (opponent->GetGUID() != me->GetVehicleBase()->GetTarget())\n+    {\n+        me->GetVehicleBase()->SetTarget(opponent->GetGUID());\n+        SetBotCommandState(BOT_COMMAND_ATTACK);\n+        me->GetVehicleBase()->Attack(opponent, false);\n+    }\n+\n+    return true;\n+}\n+\n+bool bot_ai::HasVehicleRoleOverride(uint32 role) const\n+{\n+    if (Creature const* veh = me->GetVehicleCreatureBase())\n+    {\n+        switch (veh->GetEntry())\n+        {\n+            case CREATURE_NEXUS_SKYTALON_1:\n+            case CREATURE_EOE_SKYTALON_N:\n+            case CREATURE_EOE_SKYTALON_H:\n+            case CREATURE_OCULUS_DRAKE_RUBY:\n+            case CREATURE_OCULUS_DRAKE_EMERALD:\n+            case CREATURE_OCULUS_DRAKE_AMBER:\n+            //case CREATURE_TOC_STEED_QUELDOREI:\n+            //case CREATURE_TOC_NIGHTSABER:\n+            //case CREATURE_TOC_STEED_STORMWIND:\n+            //case CREATURE_TOC_MECHANOSTRIDER:\n+            //case CREATURE_TOC_RAM:\n+            //case CREATURE_TOC_ELEKK:\n+            //case CREATURE_TOC_HAWKSTRIDER_SUNREAVER:\n+            //case CREATURE_TOC_RAPTOR:\n+            //case CREATURE_TOC_WARHORSE:\n+            //case CREATURE_TOC_WOLF:\n+            //case CREATURE_TOC_HAWKSTRIDER_SILVERMOON:\n+            //case CREATURE_TOC_KODO:\n+            case CREATURE_TOC5_WARHORSE:\n+            case CREATURE_TOC5_BATTLEWORG:\n+            case CREATURE_ULDUAR_DEMOLISHER:\n+                switch (role)\n+                {\n+                    case BOT_ROLE_RANGED:\n+                        return true;\n+                    default:\n+                        break;\n+                }\n+                break;\n+            default:\n+                break;\n+        }\n+    }\n+\n+    return false;\n+}\n+float bot_ai::GetVehicleAttackDistanceOverride() const\n+{\n+    if (Creature const* veh = me->GetVehicleCreatureBase())\n+    {\n+        switch (veh->GetEntry())\n+        {\n+            case CREATURE_NEXUS_SKYTALON_1:\n+            case CREATURE_EOE_SKYTALON_N:\n+            case CREATURE_EOE_SKYTALON_H:\n+            case CREATURE_OCULUS_DRAKE_RUBY:\n+            case CREATURE_OCULUS_DRAKE_EMERALD:\n+            case CREATURE_OCULUS_DRAKE_AMBER:\n+                return 30.f;\n+            //case CREATURE_TOC_STEED_QUELDOREI:\n+            //case CREATURE_TOC_NIGHTSABER:\n+            //case CREATURE_TOC_STEED_STORMWIND:\n+            //case CREATURE_TOC_MECHANOSTRIDER:\n+            //case CREATURE_TOC_RAM:\n+            //case CREATURE_TOC_ELEKK:\n+            //case CREATURE_TOC_HAWKSTRIDER_SUNREAVER:\n+            //case CREATURE_TOC_RAPTOR:\n+            //case CREATURE_TOC_WARHORSE:\n+            //case CREATURE_TOC_WOLF:\n+            //case CREATURE_TOC_HAWKSTRIDER_SILVERMOON:\n+            //case CREATURE_TOC_KODO:\n+            case CREATURE_TOC5_WARHORSE:\n+            case CREATURE_TOC5_BATTLEWORG:\n+                return 15.f;\n+            case CREATURE_ULDUAR_DEMOLISHER:\n+                return 40.f;\n+            default:\n+                break;\n+        }\n+    }\n+\n+    return 0.0f;\n+}\n+uint8 bot_ai::LivingVehiclesCount(uint32 entry) const\n+{\n+    uint8 count = 0;\n+    if (!IAmFree())\n+    {\n+        if (master->GetVehicle())\n+            ++count;\n+        for (auto const& [_, bot] : *master->GetBotMgr()->GetBotMap())\n+            if (bot && bot->GetVehicle() && (!entry || entry == bot->GetVehicleBase()->GetEntry()))\n+                ++count;\n+    }\n+\n+    return count;\n+}\n+//GLOBAL UPDATE\n+void bot_ai::UpdateDeadAI(uint32 diff)\n+{\n+    // group update\n+    if (_groupUpdateTimer <= diff)\n+        SendUpdateToOutOfRangeBotGroupMembers();\n+\n+    // soulstone\n+    if (GetSelfRezSpell() && !GetBG() && (IAmFree() || !master->GetBotMgr()->IsPartyInCombat(false)) && Rand() < 15)\n+        me->CastSpell(me, GetSelfRezSpell());\n+}\n+//opponent unsafe\n+bool bot_ai::GlobalUpdate(uint32 diff)\n+{\n+    if (!BotCfg::IsNpcBotModEnabled() || !BotDataMgr::AllBotsLoaded())\n+        return false;\n+\n+    if (IsWanderer())\n+    {\n+        if (Battleground* bg = GetBG())\n+        {\n+            if (bg->GetStatus() == STATUS_WAIT_LEAVE)\n+            {\n+                if (std::ranges::find_if(bg->GetPlayers(), [](auto const& kv) { return kv.first.IsPlayer(); }) == bg->GetPlayers().cend())\n+                    bg->RemoveBotAtLeave(me->GetGUID());\n+                return false;\n+            }\n+        }\n+    }\n+    else\n+    {\n+        if (_checkOwershipTimer && _checkOwershipTimer <= diff)\n+        {\n+            if (IAmFree())\n+            {\n+                if (_botData->owner != 0)\n+                {\n+                    CheckOwnerExpiry();\n+                    if (_botData->owner == 0)\n+                    {\n+                        _checkOwershipTimer = 0;\n+                        return false;\n+                    }\n+                }\n+            }\n+            _checkOwershipTimer = CalculateOwnershipCheckTime();\n+        }\n+    }\n+\n+    //db saves with cd\n+    //  1) disabled spells\n+    if (_saveDisabledSpells && _saveDisabledSpellsTimer <= diff)\n+    {\n+        _saveDisabledSpells = false;\n+        _saveDisabledSpellsTimer = 5000;\n+\n+        if (!IsTempBot())\n+            BotDataMgr::UpdateNpcBotData(me->GetEntry(), NPCBOT_UPDATE_DISABLED_SPELLS, &_botData->disabled_spells);\n+    }\n+    //  2) miscavalues\n+    if (_saveMiscValues && _saveMiscValuesTimer <= diff)\n+    {\n+        _saveMiscValues = false;\n+        _saveMiscValuesTimer = 5000;\n+\n+        if (!IsTempBot())\n+            BotDataMgr::UpdateNpcBotData(me->GetEntry(), NPCBOT_UPDATE_MISCVALUES, &_botData->miscvalues);\n+    }\n+\n+    if (_updateTimerEx2 <= diff)\n+    {\n+        _updateTimerEx2 = urand(2000, 4000);\n+\n+        //Rent Collecting\n+        uint32 rent_cost = BotCfg::GetNpcBotCostRent(master->GetLevel(), GetBotClass());\n+        if (_rentTimer >= RENT_COLLECT_TIMER && rent_cost && !HasBotCommandState(BOT_COMMAND_UNBIND) && !IAmFree())\n+        {\n+            uint32 rent_money = 0;\n+            while (_rentTimer >= RENT_COLLECT_TIMER)\n+            {\n+                rent_money += uint32(uint64(rent_cost) * (RENT_COLLECT_TIMER / 1000) / (RENT_TIMER / 1000));\n+                _rentTimer -= RENT_COLLECT_TIMER;\n+            }\n+\n+            rent_money = std::max<uint32>(rent_money, 1);\n+            if (!master->HasEnoughMoney(rent_money))\n+            {\n+                master->GetSession()->SendNotification(\"%s\", LocalizedNpcText(master, BOT_TEXT_HIREFAIL_COST).c_str());\n+                master->GetBotMgr()->RemoveBot(me->GetGUID(), BOT_REMOVE_UNAFFORD);\n+                return false;\n+            }\n+            master->ModifyMoney(-int32(rent_money));\n+        }\n+\n+        if (BotCfg::HideBotSpawns() && IAmFree() && !IsWanderer())\n+        {\n+            // !!bot may be out of world!!\n+            Map* mymap = me->FindMap();\n+            if (mymap)\n+            {\n+                std::list<Player*> plist;\n+                Bcore::AnyPlayerInPositionRangeCheck pcheck(me, 15.0f, false);\n+                Bcore::PlayerListSearcher<decltype(pcheck)> searcher(me, plist, pcheck);\n+                Cell::VisitWorldObjects(me, searcher, 20.f);\n+                _canAppearInWorld = std::ranges::any_of(plist, [](Player const* pl) { return pl->GetSession()->GetSecurity() > SEC_PLAYER; });\n+                if (!CanAppearInWorld() && !IsDuringTeleport())\n+                    BotMgr::TeleportBot(me, mymap, me, true);\n+            }\n+            else\n+            {\n+                _canAppearInWorld = false;\n+                BOT_LOG_ERROR(\"npcbots\", \"Bot {} tried to check hide status but doesn't have a valid map set\", me->GetEntry());\n+            }\n+        }\n+        else\n+            _canAppearInWorld = true;\n+    }\n+\n+    ReduceCD(diff);\n+\n+    UpdateContestedPvP();\n+\n+    lastdiff = diff;\n+\n+    FindMaster();\n+\n+    if (IsDuringTeleport())\n+        return false;\n+\n+    if (_updateTimerLong <= diff)\n+    {\n+        _updateTimerLong = urand(15000, 25000);\n+\n+        //Long-timed updates\n+\n+        if (me->IsInWorld() && me->IsAlive() && me->IsInCombat() && !me->GetMap()->IsDungeon() && (IAmFree() || !master->IsInCombat()))\n+            me->GetCombatManager().EndCombatBeyondRange(me->GetMap()->GetVisibilityRange(), true);\n+    }\n+\n+    if (_updateTimerMedium <= diff)\n+    {\n+        _updateTimerMedium = 500;\n+\n+        //Medium-timed updates\n+\n+        //send stats update for group frames\n+        if (me->IsInWorld() && !IAmFree())\n+        {\n+            //update pvp state\n+            if (me->GetByteValue(UNIT_FIELD_BYTES_2, 1) != master->GetByteValue(UNIT_FIELD_BYTES_2, 1))\n+                me->SetByteValue(UNIT_FIELD_BYTES_2, 1, master->GetByteValue(UNIT_FIELD_BYTES_2, 1));\n+\n+            //vehicle enter delayed\n+            if (shouldEnterVehicle && master->IsInWorld() && me->IsAlive() &&/* !HasBotCommandState(BOT_COMMAND_MASK_UNMOVING) &&*/\n+                !me->GetVehicle() && master->GetVehicle() && !CCed(me, true) && !IsCasting())\n+            {\n+                shouldEnterVehicle = false;\n+                AfterBotOwnerEnterVehicle();\n+            }\n+\n+            //gossip availability check\n+            if (HasBotCommandState(BOT_COMMAND_NOGOSSIP) && me->HasNpcFlag(UNIT_NPC_FLAG_GOSSIP))\n+                me->RemoveNpcFlag(UNIT_NPC_FLAG_GOSSIP);\n+        }\n+\n+        if (me->IsInWorld() && me->IsAlive() && IAmFree())\n+        {\n+            if (me->HasAuraType(SPELL_AURA_MOUNTED) && IsIndoors() && sWorld->getBoolConfig(CONFIG_VMAP_INDOOR_CHECK))\n+                me->RemoveAurasWithAttribute(SPELL_ATTR0_OUTDOORS_ONLY);\n+        }\n+    }\n+\n+    if (!me->IsAlive())\n+        return false;\n+\n+    if (!me->IsInWorld())\n+    {\n+        if (IAmFree())\n+            BOT_LOG_ERROR(\"scripts\", \"bot_ai::GlobalUpdate is called for free bot not in world: {} ({}) class {} level {}\",\n+                me->GetName(), me->GetEntry(), uint32(_botclass), uint32(me->GetLevel()));\n+        return false;\n+    }\n+\n+    if (doHealth)\n+    {\n+        doHealth = false;\n+        _OnHealthUpdate();\n+    }\n+    if (doMana)\n+    {\n+        doMana = false;\n+        _OnManaUpdate();\n+    }\n+\n+    // group update\n+    if (_groupUpdateTimer <= diff)\n+        SendUpdateToOutOfRangeBotGroupMembers();\n+\n+    if (ordersTimer <= diff)\n+        _ProcessOrders();\n+\n+    //if (me->HasInvisibilityAura() || me->HasStealthAura())\n+    //    return false;\n+\n+    //Check current cast state: interrupt casts that became pointless\n+    if (me->HasUnitState(UNIT_STATE_CASTING) && !HasBotCommandState(BOT_COMMAND_ISSUED_ORDER) && urand(1,100) <= 75)\n+    {\n+        for (uint8 i = CURRENT_FIRST_NON_MELEE_SPELL; i != CURRENT_MAX_SPELL; ++i)\n+        {\n+            bool interrupt = false;\n+            Unit const* target = nullptr;\n+            Spell* spell = me->GetCurrentSpell(CurrentSpellTypes(i));\n+            if (!spell)\n+                continue;\n+\n+            SpellInfo const* info = spell->GetSpellInfo();\n+            if (!info->CastTimeEntry)\n+                continue;\n+\n+            if (info->Id == SHOOT_WAND && me->isMoving())\n+                interrupt = true;\n+            else\n+            {\n+                // not interrupted yet, next checks require target, ensure validity\n+                // kidna expensive but prevents invalid targets\n+                if (spell->m_targets.GetObjectTargetGUID().IsAnyTypeCreature())\n+                    spell->m_targets.Update(me);\n+                target = spell->m_targets.GetUnitTarget(); // can be nullptr\n+                if (!target)\n+                    continue;\n+            }\n+\n+            if (!interrupt && !info->IsPositive())\n+            {\n+                if (!target->IsAlive() && info->Id != SPELL_CORPSE_EXPLOSION && info->Id != SPELL_RAISE_DEAD)\n+                    interrupt = true;\n+                else if ((info->Mechanic == MECHANIC_POLYMORPH || info->Mechanic == MECHANIC_SHACKLE ||\n+                    info->Mechanic == MECHANIC_DISORIENTED || info->Mechanic == MECHANIC_SLEEP ||\n+                    info->Mechanic == MECHANIC_CHARM || info->Mechanic == MECHANIC_BANISH ||\n+                    info->Mechanic == MECHANIC_STUN || info->Mechanic == MECHANIC_FREEZE) &&\n+                    info->GetFirstRankSpell()->Id != 710 && info->GetFirstRankSpell()->Id != SPELL_SLEEP &&\n+                    !target->getAttackers().empty() && !IsCasting(target))\n+                    interrupt = true; //useless control (except banish, checked inside class ai)\n+                else if (target->HasAuraType(SPELL_AURA_PERIODIC_DAMAGE) && !IsCasting(target) &&\n+                    (info->AuraInterruptFlags & AURA_INTERRUPT_FLAG_TAKE_DAMAGE) && _botclass != BOT_CLASS_MAGE)\n+                    interrupt = true; //useless control breaks immediately (skip glyphed poly)\n+                else if (info->DmgClass == SPELL_DAMAGE_CLASS_MAGIC && !(info->Attributes & SPELL_ATTR0_ABILITY) &&\n+                    !(info->AttributesEx & SPELL_ATTR1_CANT_BE_REFLECTED) &&\n+                    !(info->Attributes & SPELL_ATTR0_UNAFFECTED_BY_INVULNERABILITY) &&\n+                    (target->GetTotalAuraModifier(SPELL_AURA_REFLECT_SPELLS) > 60 ||\n+                    target->GetTotalAuraModifierByMiscMask(SPELL_AURA_REFLECT_SPELLS_SCHOOL, info->GetSchoolMask()) > 60))\n+                    interrupt = true; // reflect\n+                else if (\n+                    info->Id != 64382 && //shattering throw\n+                    info->Id != 32375 && //mass dispel\n+                    info->GetFirstRankSpell()->Id != 710 && //banish\n+                    target->IsImmunedToSpell(info, me))\n+                    interrupt = true; // immune\n+                else if (i != CURRENT_CHANNELED_SPELL && //channeled targeted spells will be interrupted in Spell::update()\n+                    spell->GetCastTime() < spell->GetTimer() * 3 && // >=33% cast time remains\n+                    !me->IsWithinLOSInMap(target, LINEOFSIGHT_ALL_CHECKS, VMAP::ModelIgnoreFlags::M2))\n+                    interrupt = true; //LoS\n+                else if (info->Id == 64382 && !target->HasAuraWithMechanic(1u<<MECHANIC_IMMUNE_SHIELD))\n+                    interrupt = true; //Shattering Throw wasting\n+            }\n+            if (!interrupt && !(target == master && me->GetDistance(target) < INTERACTION_DISTANCE) &&\n+                info->HasEffect(SPELL_EFFECT_HEAL) && GetHealthPCT(target) > 90 && !IsPointedHealTarget(target))\n+            {\n+                bool isAreaSpell = false;\n+                for (uint8 j = 0; j != 3 && isAreaSpell == false; ++j)\n+                {\n+                    if (info->_effects[j].IsEffect() && info->_effects[j].TargetA.GetTarget())\n+                    {\n+                        if (info->_effects[j].TargetA.GetSelectionCategory() == TARGET_SELECT_CATEGORY_NEARBY ||\n+                            info->_effects[j].TargetA.GetSelectionCategory() == TARGET_SELECT_CATEGORY_AREA)\n+                            isAreaSpell = true;\n+                        if (!isAreaSpell)\n+                        {\n+                            switch (info->_effects[j].TargetA.GetTarget())\n+                            {\n+                            case TARGET_UNIT_CASTER_AREA_PARTY:\n+                            case TARGET_DEST_CHANNEL_TARGET:\n+                                isAreaSpell = true;\n+                                break;\n+                            case TARGET_UNIT_TARGET_CHAINHEAL_ALLY:\n+                                //Healing Wave falls under TARGET_UNIT_TARGET_CHAINHEAL_ALLY\n+                                if (info->GetFirstRankSpell()->Id == 331)\n+                                    break;\n+                                isAreaSpell = true;\n+                                break;\n+                            default:\n+                                break;\n+                            }\n+                        }\n+                        break;\n+                    }\n+                }\n+\n+                if (isAreaSpell == false)\n+                {\n+                    if (!IsTank(target) || target->getAttackers().empty() ||\n+                        spell->GetTimer() * 4 <= spell->GetCastTime()) //<=25% cast time remains\n+                        interrupt = true;\n+                }\n+            }\n+            if (!interrupt && (info->HasEffect(SPELL_EFFECT_RESURRECT) || info->HasEffect(SPELL_EFFECT_RESURRECT_NEW)) &&\n+                (target->IsAlive() || (target->IsPlayer() && target->ToPlayer()->IsResurrectRequested())))\n+                interrupt = true;\n+            if (!interrupt && checkAurasTimer <= diff && me->GetMap()->IsDungeon() && !CCed(me, true) && IsWithinAoERadius(*me))\n+                interrupt = true;\n+\n+            if (interrupt)\n+            {\n+                me->InterruptSpell(CurrentSpellTypes(i));\n+                GC_Timer = 0;\n+                break;\n+            }\n+        }\n+    }\n+\n+    if (_updateTimerEx1 <= diff)\n+    {\n+        _updateTimerEx1 = urand(2000, 2500);\n+\n+        //Ex1-timed updates\n+\n+        //DEBUG\n+        /*\n+        Sometimes bots are affected by zone (instance) scripts\n+        Good example is CoT: Battle for Mount Hyjal\n+        */\n+        //Faction\n+        //ensure master is not controlled\n+        ChrRacesEntry const* rEntry = sChrRacesStore.LookupEntry(master->GetRace());\n+        uint32 fac_orig = rEntry ? rEntry->FactionID : 0;\n+        if (master->GetFaction() == fac_orig)\n+        {\n+            uint32 fac = (!IAmFree() && me->GetMap()->IsBattleArena()) ? uint32(FACTION_MONSTER) : fac_orig;\n+            if (me->GetFaction() != fac)\n+            {\n+                //std::ostringstream msg;\n+                //msg << \"Something changed my faction (now \" << me->GetFaction() << \"), changing back to \" << fac << \"!\";\n+                //BotWhisper(msg.view());\n+                me->SetFaction(fac);\n+            }\n+        }\n+        //Visibility\n+        if (!me->IsVisible() && master->IsVisible())\n+        {\n+            //BotWhisper(\"Something changed my visibility status! Making visible...\");\n+            me->SetVisible(true);\n+        }\n+        if (me->IsVisible() && !master->IsVisible())\n+        {\n+            //BotWhisper(\"Something changed my visibility status! Making invisible...\");\n+            me->SetVisible(false);\n+        }\n+        //Phase\n+        if (me->GetPhaseMask() != master->GetPhaseMask())\n+        {\n+            //BotWhisper(\"Somehow we are not is same phase! Fixing that...\");\n+            me->SetPhaseMask(master->GetPhaseMask(), true);\n+        }\n+        //Vehicle state\n+        //if (me->GetVehicle() && !master->GetVehicle())\n+        //{\n+        //    BotWhisper(\"Somehow i'm still in the vehicle! Exiting...\");\n+        //    OnBotOwnerExitVehicle(nullptr);\n+        //}\n+        ////Vehicle speed\n+        //if (me->GetVehicle() && master->GetVehicle() && me->GetVehicleBase()->IsCreature() &&\n+        //    (me->GetVehicleBase()->ToCreature()->GetCreatureTemplate()->InhabitType & INHABIT_AIR) &&\n+        //    me->GetVehicleBase()->GetSpeed(MOVE_FLIGHT) != master->GetVehicleBase()->GetSpeed(MOVE_FLIGHT))\n+        //{\n+        //    me->GetVehicleBase()->SetSpeed(MOVE_FLIGHT, master->GetVehicleBase()->GetSpeedRate(MOVE_FLIGHT) * 1.37f);\n+        //    me->GetVehicleBase()->SetSpeed(MOVE_RUN, master->GetVehicleBase()->GetSpeedRate(MOVE_FLIGHT) * 1.37f);\n+        //}\n+        //Transport state\n+        if (me->GetTransport() != master->GetTransport())\n+        {\n+            if (master->GetTransport())\n+            {\n+                if (me->GetDistance2d(master) < 20.f)\n+                {\n+                    master->GetTransport()->AddPassenger(me);\n+                    me->m_movementInfo.transport.pos.Relocate(master->GetTransOffset());\n+                    me->Relocate(GetAbsoluteTransportPosition(master));\n+                    me->AddUnitState(UNIT_STATE_IGNORE_PATHFINDING);\n+                }\n+            }\n+            else\n+            {\n+                me->ClearUnitState(UNIT_STATE_IGNORE_PATHFINDING);\n+                me->GetTransport()->RemovePassenger(me);\n+            }\n+        }\n+        //Model size / Combat reach\n+        if (me->GetDisplayId() == me->GetNativeDisplayId())\n+        {\n+            me->SetFloatValue(UNIT_FIELD_BOUNDINGRADIUS, DEFAULT_PLAYER_BOUNDING_RADIUS * me->GetObjectScale());\n+            me->SetFloatValue(UNIT_FIELD_COMBATREACH,  DEFAULT_PLAYER_COMBAT_REACH * me->GetObjectScale());\n+\n+            //debug: restore offhand visual if needed\n+            if (me->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + uint32(BOT_SLOT_OFFHAND)) == 0 && _canUseOffHand())\n+            {\n+                EquipmentInfo const* einfo = BotDataMgr::GetBotEquipmentInfo(me->GetEntry());\n+                if (CanChangeEquip(BOT_SLOT_OFFHAND) && _equips[BOT_SLOT_OFFHAND])\n+                {\n+                    NpcBotTransmogData const* transmogData = BotDataMgr::SelectNpcBotTransmogs(me->GetEntry());\n+                    if (einfo->ItemEntry[BOT_SLOT_OFFHAND] != _equips[BOT_SLOT_OFFHAND]->GetEntry() &&\n+                        transmogData && BotCfg::IsTransmogEnabled() && (transmogData->transmogs[BOT_SLOT_OFFHAND].first == _equips[BOT_SLOT_OFFHAND]->GetEntry() || BotCfg::TransmogUseEquipmentSlots()) &&\n+                        transmogData->transmogs[BOT_SLOT_OFFHAND].second >= 0)\n+                        me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + uint32(BOT_SLOT_OFFHAND), uint32(transmogData->transmogs[BOT_SLOT_OFFHAND].second));\n+                    else\n+                        me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + uint32(BOT_SLOT_OFFHAND), _equips[BOT_SLOT_OFFHAND]->GetEntry());\n+                }\n+                else\n+                {\n+                    me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + uint32(BOT_SLOT_OFFHAND), einfo->ItemEntry[BOT_SLOT_OFFHAND]);\n+                }\n+            }\n+        }\n+        //end DEBUG\n+\n+        //Check if moving through air\n+        //if (me->IsInWorld() && !JumpingFlyingOrFalling() &&\n+        //    !me->HasUnitMovementFlag((MOVEMENTFLAG_ONTRANSPORT)|(MOVEMENTFLAG_DISABLE_GRAVITY)|(MOVEMENTFLAG_ROOT)|(MOVEMENTFLAG_SWIMMING)))\n+        //{\n+        //    //skip case such as moving back up from abyss (movement glitches)\n+        //    float x,y,z;\n+        //    if (!me->GetMotionMaster()->GetDestination(x,y,z) || z < me->GetPositionZ())\n+        //    {\n+        //        float groundz = me->GetMap()->GetHeight(me->GetPhaseMask(), me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), true, MAX_FALL_DISTANCE);\n+        //        if (groundz > INVALID_HEIGHT)\n+        //        {\n+        //            me->GetMotionMaster()->MoveFall();\n+        //        }\n+        //        else if (GetBotCommandState() != BOT_COMMAND_STAY && !me->isMoving())\n+        //        {\n+        //            SetBotCommandState(BOT_COMMAND_ABANDON); //reset movement after\n+        //        }\n+        //    }\n+        //}\n+\n+        //Zone / Area / WMOArea\n+        if (me->IsInWorld())\n+        {\n+            uint32 newzone, newarea;\n+            me->GetZoneAndAreaId(newzone, newarea);\n+\n+            if (_lastZoneId != newzone)\n+                _OnZoneUpdate(newzone, newarea); // also updates area\n+            else// if (_lastAreaId != newarea)\n+                _OnAreaUpdate(newarea);\n+\n+            if (_wmoAreaUpdateTimer <= diff)\n+                _UpdateWMOArea();\n+        }\n+\n+        //Meeting Stone\n+        if (me->IsInWorld() && !IAmFree() && !me->IsInCombat() && !master->IsInCombat() && IsChanneling(master) && !CCed(me) && !IsCasting() && !me->GetVehicle())\n+        {\n+            if (Spell const* curMasterSpell = master->GetCurrentSpell(CURRENT_CHANNELED_SPELL))\n+            {\n+                if (curMasterSpell->m_spellInfo->Id == SUMMONING_STONE_EFFECT)\n+                {\n+                    if (GameObject* portal = master->GetGameObject(SUMMONING_STONE_EFFECT))\n+                    {\n+                        portal->Use(me);\n+                    }\n+                }\n+            }\n+        }\n+\n+        //Gathering\n+        if (me->IsInWorld() && !IAmFree() && HasRole(BOT_ROLE_MASK_GATHERING) && !me->IsInCombat() && !master->IsInCombat() && !master->IsMounted() && !CCed(me) &&\n+            master->GetLootGUID().IsEmpty() && !me->isMoving() && !master->isMoving() && master->IsStandState() && !Feasting() && !IsCasting() && !IsCasting(master) &&\n+            !HasBotCommandState(BOT_COMMAND_MASK_UNMOVING) && !me->GetVehicle())\n+        {\n+            //BOT_LOG_ERROR(\"spells\", \"bot_ai:UpdateEx by {}, found free master, my skills: {}:\", me->GetName(), uint32(_roleMask & BOT_ROLE_MASK_GATHERING));\n+            std::list<WorldObject*> woList;\n+            NearbyObjectBySkillCheck check(master, INTERACTION_DISTANCE - 1.0f, (_roleMask & BOT_ROLE_MASK_GATHERING));\n+            Bcore::WorldObjectListSearcher<NearbyObjectBySkillCheck> searcher(me, woList, check, GRID_MAP_TYPE_MASK_CREATURE|GRID_MAP_TYPE_MASK_GAMEOBJECT);\n+            Cell::VisitAllObjects(me, searcher, 20.f);\n+            //me->VisitNearbyObject(20.f, searcher);\n+            //BOT_LOG_ERROR(\"spells\", \"bot_ai:UpdateEx: list is {}\", woList.empty() ? \"empty\" : \"not empty\");\n+            if (!woList.empty())\n+            {\n+                WorldObject* wo = nullptr;\n+                float minangle = float(M_PI);\n+                for (WorldObject* wob : woList)\n+                {\n+                    float angle = me->GetAbsoluteAngle(wob);\n+                    if (me->GetDistance(wob) <= INTERACTION_DISTANCE * 0.5f && angle < minangle)\n+                    {\n+                        minangle = angle;\n+                        wo = wob;\n+                    }\n+                }\n+\n+                wo = wo ? wo : Bcore::Containers::SelectRandomContainerElement(woList);\n+                //BOT_LOG_ERROR(\"spells\", \"bot_ai:UpdateEx: processing {}\", wo->GetName());\n+                if (me->GetDistance(wo) <= INTERACTION_DISTANCE * 0.5f && me->HasInArc(float(M_PI), wo))\n+                {\n+                    //cosmetic\n+                    CastSpellExtraArgs args(TRIGGERED_FULL_MASK);\n+                    me->CastSpell(wo->IsCreature() ? wo->ToUnit() : me, SPELL_COMBAT_SPECIAL_2H_ATTACK, args);\n+\n+                    if (wo->IsCreature())\n+                        wo->ToUnit()->SetDynamicFlag(UNIT_DYNFLAG_LOOTABLE);\n+\n+                    master->SendLoot(wo->GetGUID(), LOOT_SKINNING);\n+\n+                    if (wo->IsCreature())\n+                        wo->ToUnit()->RemoveUnitFlag(UNIT_FLAG_SKINNABLE);\n+\n+                    _updateTimerEx1 = urand(1500, 2100);\n+                }\n+                else\n+                {\n+                    std::ostringstream msg;\n+                    std::string name = wo->GetName();\n+                    if (wo->IsCreature())\n+                    {\n+                        _LocalizeCreature(master, name, wo->GetEntry());\n+                        msg << name << \"...\"; // TODO\n+                    }\n+                    else\n+                    {\n+                        _LocalizeGameObject(master, name, wo->GetEntry());\n+                        msg << name << \"!\";\n+                    }\n+                    BotWhisper(msg.view());\n+\n+                    if (me->GetDistance(wo) > INTERACTION_DISTANCE * 0.5f)\n+                    {\n+                        Position pos;\n+                        wo->GetNearPoint(me, pos.m_positionX, pos.m_positionY, pos.m_positionZ, CONTACT_DISTANCE, wo->GetAbsoluteAngle(me));\n+                        BotMovement(BOT_MOVE_POINT, &pos, nullptr, false);\n+                        //me->GetMotionMaster()->MovePoint(me->GetMapId(), pos, false);\n+                    }\n+                    else\n+                    {\n+                        me->SetFacingTo(me->GetAbsoluteAngle(wo));\n+                        _updateTimerEx1 = urand(1500, 1800);\n+                    }\n+                }\n+            }\n+        }\n+\n+        //Looting\n+        if (me->IsInWorld() && !IAmFree() && HasRole(BOT_ROLE_AUTOLOOT) && HasRole(BOT_ROLE_MASK_LOOTING) &&\n+            !me->GetVictim() && !master->IsMounted() && !CCed(me) && !Feasting() && !IsCasting() &&\n+            !HasBotCommandState(BOT_COMMAND_MASK_UNMOVING))\n+        {\n+            //BOT_LOG_ERROR(\"scripts\", \"bot_ai Looting by {}, my mask: {}:\", me->GetName(), uint32(_roleMask & BOT_ROLE_MASK_LOOTING));\n+            std::list<Unit*> crList;\n+            NearbyLootableCreatureCheck check(master, std::min(30.f, std::max(5.f, sWorld->getFloatConfig(CONFIG_GROUP_XP_DISTANCE) - 10.f)));\n+            Bcore::UnitListSearcher<NearbyLootableCreatureCheck> searcher(me, crList, check);\n+            Cell::VisitAllObjects(me, searcher, 40.f);\n+            //me->VisitNearbyObject(40.f, searcher);\n+            for (std::list<Unit*>::iterator itr = crList.begin(); itr != crList.end();)\n+            {\n+                if (!_canLootCreature((*itr)->ToCreature()))\n+                {\n+                    //BOT_LOG_ERROR(\"scripts\", \"bot_ai Looting: cannot loot {} ({})\", (*itr)->GetName(), (*itr)->GetGUIDLow());\n+                    crList.erase(itr++);\n+                    continue;\n+                }\n+                ++itr;\n+            }\n+\n+            if (!crList.empty())\n+            {\n+                Unit* un = Bcore::Containers::SelectRandomContainerElement(crList);\n+\n+                std::ostringstream msg;\n+                std::string name = un->GetName();\n+                _LocalizeCreature(master, name, un->GetEntry());\n+                msg << LocalizedNpcText(master, BOT_TEXT_LOOTING) << ' ' << name;\n+                BotWhisper(msg.view());\n+\n+                _autoLootCreature(un->ToCreature());\n+\n+                if (crList.size() > 1)\n+                    _updateTimerEx1 = urand(400, 600);\n+                /*//BOT_LOG_ERROR(\"scripts\", \"bot_ai Looting: processing {}\", un->GetName());\n+                if (me->GetDistance(un) < INTERACTION_DISTANCE + 2.f)\n+                {\n+                    //BOT_LOG_ERROR(\"scripts\", \"bot_ai Looting: looting {}\", un->GetName());\n+                    _autoLootCreature(un->ToCreature());\n+                    _updateTimerEx1 = urand(500, 1000);\n+                }\n+                else\n+                {\n+                    //BOT_LOG_ERROR(\"scripts\", \"bot_ai Looting: moving towards {}\", un->GetName());\n+                    Position pos;\n+                    un->GetNearPoint(me, pos.m_positionX, pos.m_positionY, pos.m_positionZ, 0.f, CONTACT_DISTANCE, un->GetAbsoluteAngle(me));\n+                    me->GetMotionMaster()->MovePoint(me->GetMapId(), pos, false);\n+                }*/\n+            }\n+        }\n+    }\n+\n+    if (!IsTempBot())\n+        Regenerate();\n+\n+    //update flags\n+    if (!me->IsInCombat() && ((!_evadeMode && _atHome) || IsWanderer()))\n+    {\n+        if (!me->HasNpcFlag(UNIT_NPC_FLAG_GOSSIP) && !HasBotCommandState(BOT_COMMAND_NOGOSSIP))\n+            me->SetNpcFlag(UNIT_NPC_FLAG_GOSSIP);\n+        if (me->HasUnitFlag(UNIT_FLAG_PET_IN_COMBAT))\n+            me->RemoveUnitFlag(UNIT_FLAG_PET_IN_COMBAT);\n+    }\n+\n+    if (!me->GetVictim())\n+        Evade();\n+\n+    if (HasBotCommandState(BOT_COMMAND_FULLSTOP))\n+        return false;\n+\n+    if (!IsTempBot())\n+        _updateRations(); //safe\n+\n+    if (checkAurasTimer <= lastdiff)\n+    {\n+        checkAurasTimer += uint32(_rand + _rand + (IAmFree() ? 1000 : 40 * (1 + master->GetNpcBotsCount())));\n+\n+        //group demand\n+        if (!IAmFree() && HasRole(BOT_ROLE_PARTY) && (!master->GetGroup() || !master->GetGroup()->IsMember(me->GetGUID())))\n+        {\n+            //BOT_LOG_ERROR(\"entities.player\", \"CheckAuras(): adding {} to group\", me->GetName());\n+            master->GetBotMgr()->AddBotToGroup(me);\n+        }\n+\n+        Unit* mover = me->GetVehicle() ? me->GetVehicleBase() : me;\n+        if (!HasBotCommandState(BOT_COMMAND_MASK_UNCHASE) && !CCed(mover, true) &&\n+            (IAmFree() || master->GetBotMgr()->GetBotAllowCombatPositioning()) &&\n+            (!mover->isMoving() || Rand() < 50) && !IsCasting(mover) && !IsShootingWand(mover))\n+        {\n+            if (Unit* victim = CanBotAttackOnVehicle() ? me->GetVictim() : !mover->GetTarget().IsEmpty() ? ObjectAccessor::GetUnit(*mover, mover->GetTarget()) : nullptr)\n+            {\n+                if (IAmFree())\n+                    CalculateAoeSpots(me, _aoeSpots);\n+\n+                //BOT_LOG_ERROR(\"scripts\", \"GetInPos prepare by {}\", me->GetName());\n+                if (!IAmFree() && master->GetBotMgr()->GetBotAttackRangeMode() == BOT_ATTACK_RANGE_EXACT &&\n+                    master->GetBotMgr()->GetBotExactAttackRange() == 0 && !GetVehicleAttackDistanceOverride() &&\n+                    !(!IAmFree() && !GetAoeSpots().empty()))\n+                {\n+                    GetInPosition(true, victim);\n+                }\n+                else if (!HasRole(BOT_ROLE_RANGED) && !HasVehicleRoleOverride(BOT_ROLE_RANGED) &&\n+                    !(!IAmFree() && !GetAoeSpots().empty()))\n+                {\n+                    if (me->GetDistance(victim) > 1.5f)\n+                        GetInPosition(true, victim);\n+                }\n+                else\n+                {\n+                    //BOT_LOG_ERROR(\"scripts\", \"{} calculates attack pos to attack {}\", me->GetName(), victim->GetName());\n+                    bool force = false;\n+                    CalculateAttackPos(victim, attackpos, force);\n+                    if (mover->GetExactDist2d(&attackpos) > (force ? 0.1f : 4.f) || (force && IsWanderer()))\n+                    {\n+                        //BOT_LOG_ERROR(\"scripts\", \"{} moving to x {} y {} z {} to attack {}\",\n+                        //    me->GetName(), attackpos.m_positionX, attackpos.m_positionY, attackpos.m_positionZ, victim->GetName());\n+                        GetInPosition(true, victim, &attackpos);\n+                    }\n+                }\n+            }\n+        }\n+        if (shouldUpdateStats && me->GetPhaseMask() == master->GetPhaseMask())\n+            SetStats(false);\n+        else if (_powersTimer <= lastdiff && !IsTempBot())\n+        {\n+            _powersTimer += REGEN_CD; //do not mistake for regen, this is only for updating max health/mana\n+            UpdateHealth();\n+            UpdateMana();\n+        }\n+    }\n+\n+    if (Wait())\n+        return false;\n+\n+    GenerateRand();\n+\n+    if (CanBotAttackOnVehicle())\n+        BreakCC(diff);\n+\n+    if (!me->GetVehicle() && CCed(me))\n+        return false;\n+\n+    //opponent unsafe\n+    if ((IsWanderer() || (!IAmFree() && (!_lastTargetGuid || !master->GetBotMgr()->GetBotAllowCombatPositioning()))) &&\n+        !HasBotCommandState(BOT_COMMAND_STAY) &&\n+        (!me->GetVehicle() || (!CCed(me->GetVehicleBase(), true) && !me->GetVehicleBase()->GetTarget())))\n+    {\n+        Unit const* mover = me->GetVehicle() ? me->GetVehicleBase() : me;\n+\n+        if (!master->IsAlive())\n+        {\n+            //If ghost move to corpse, else move to dead player\n+            if (master->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_GHOST))\n+            {\n+                Corpse const* corpse = master->GetCorpse();\n+                if (corpse && me->GetMap() == corpse->FindMap() && !me->IsInCombat() && !me->HasUnitState(UNIT_STATE_MOVING) &&\n+                    !IsCasting() && !IsShootingWand() && me->GetDistance(corpse) > 5)\n+                    BotMovement(BOT_MOVE_POINT, corpse);\n+                    //me->GetMotionMaster()->MovePoint(corpse->GetMapId(), *corpse);\n+            }\n+            else\n+            {\n+                if (!HasBotCommandState(BOT_COMMAND_FOLLOW) || me->GetDistance(master) > 30 - 20 * (!me->IsWithinLOSInMap(master)))\n+                    SetBotCommandState(BOT_COMMAND_FOLLOW, true);\n+            }\n+        }\n+        else if (!IsCasting(mover) && (!IsShootingWand(mover) || Rand() < 10))\n+        {\n+            Unit const* mmover = !IAmFree() ? master : nullptr;\n+            if (!mmover && me->GetMap()->IsBattleground() && GetBG())\n+            {\n+                Battleground* bg = GetBG();\n+                ObjectGuid flag_guid = ObjectGuid::Empty;\n+                if (!me->HasInvisibilityAura() && !me->HasStealthAura() && !me->HasAuraTypeWithMiscvalue(SPELL_AURA_FORCE_REACTION, 1059))\n+                {\n+                    switch (bg->GetTypeID())\n+                    {\n+                        case BATTLEGROUND_WS:\n+                            flag_guid = dynamic_cast<BattlegroundWS*>(bg)->GetDroppedFlagGUID(bg->GetBotTeam(me->GetGUID()));\n+                            if (!flag_guid)\n+                                flag_guid = dynamic_cast<BattlegroundWS*>(bg)->GetDroppedFlagGUID(bg->GetOtherTeam(bg->GetBotTeam(me->GetGUID())));\n+                            break;\n+                        case BATTLEGROUND_EY:\n+                            flag_guid = dynamic_cast<BattlegroundEY*>(bg)->GetDroppedFlagGUID();\n+                            break;\n+                        default:\n+                            break;\n+                    }\n+                }\n+                if (GameObject* go = !flag_guid.IsEmpty() ? bg->GetBgMap()->GetGameObject(flag_guid) : nullptr)\n+                {\n+                    float fdist = me->GetDistance(go);\n+                    if (fdist < 30.f)\n+                    {\n+                        if (fdist < INTERACTION_DISTANCE * 0.5f)\n+                        {\n+                            if (me->IsMounted())\n+                                DismountBot();\n+                            go->Use(me);\n+                        }\n+                        else\n+                        {\n+                            BotMovement(BOT_MOVE_POINT, go);\n+                            mmover = nullptr;\n+                        }\n+                    }\n+                }\n+                else if (!IsFlagCarrier(me))\n+                {\n+                    //GET BG FOLLOW UNIT\n+                    if (bg->GetTypeID() == BATTLEGROUND_WS)\n+                    {\n+                        static const std::function<bool(Unit const*)> flag_carrier_pred = [](Unit const* u) { return bot_ai::IsFlagCarrier(u); };\n+                        Unit* nmover = nullptr;\n+                        Bcore::UnitSearcher searcher(me, nmover, flag_carrier_pred);\n+                        Cell::VisitAllObjects(me, searcher, 80.0f);\n+                        if (nmover)\n+                            mmover = nmover;\n+                    }\n+                }\n+            }\n+\n+            if (mmover)\n+            {\n+                float speed = 0.0f;\n+                _calculatePos(mmover, movepos, &speed);\n+                float maxdist = std::max<float>((mmover->IsPlayer() ? float(mmover->ToPlayer()->GetBotMgr()->GetBotFollowDist()) : BotMgr::GetBotFollowDistMax() / 2.f) *\n+                    ((mmover->m_movementInfo.GetMovementFlags() & MOVEMENTFLAG_FORWARD) ? 0.125f : mmover->isMoving() ? 0.03125f : 0.25f), 3.f);\n+                Position destPos;\n+                if (me->isMoving())\n+                    me->GetMotionMaster()->GetDestination(destPos.m_positionX, destPos.m_positionY, destPos.m_positionZ);\n+                else\n+                    destPos = me->GetPosition();\n+\n+                if (!HasBotCommandState(BOT_COMMAND_FOLLOW) || destPos.GetExactDist(&movepos) > maxdist)\n+                    SetBotCommandState(BOT_COMMAND_FOLLOW, true, &movepos, &speed);\n+            }\n+            else\n+                RemoveBotCommandState(BOT_COMMAND_FOLLOW);\n+        }\n+    }\n+\n+    if (!IsCasting() && !IsShootingWand())\n+    {\n+        if ((me->IsInCombat() && !me->IsSitState() && CanBotAttackOnVehicle()) || !CanSheath())\n+        {\n+            if (_botclass == BOT_CLASS_HUNTER || _botclass == BOT_CLASS_DARK_RANGER || _botclass == BOT_CLASS_SEA_WITCH)\n+            {\n+                if (me->GetSheath() != SHEATH_STATE_RANGED)\n+                    me->SetSheath(SHEATH_STATE_RANGED);\n+            }\n+            else\n+            {\n+                //classes which don't display weapons\n+                if (_botclass == BOT_CLASS_DREADLORD || _botclass == BOT_CLASS_SPELLBREAKER || _botclass == BOT_CLASS_CRYPT_LORD)\n+                {\n+                    if (me->GetSheath() != SHEATH_STATE_UNARMED)\n+                        me->SetSheath(SHEATH_STATE_UNARMED);\n+                }\n+                else if (me->GetSheath() != SHEATH_STATE_MELEE)\n+                    me->SetSheath(SHEATH_STATE_MELEE);\n+            }\n+        }\n+        else if (me->IsStandState() && me->GetSheath() != SHEATH_STATE_UNARMED && Rand() < 50)\n+        {\n+            if (me->GetSheath() == SHEATH_STATE_RANGED)\n+                me->SetSheath(SHEATH_STATE_MELEE);\n+            else\n+                me->SetSheath(SHEATH_STATE_UNARMED);\n+        }\n+    }\n+\n+    _updateMountedState();\n+    _updateStandState();\n+\n+    if (HasBotCommandState(BOT_COMMAND_INACTION))\n+        return false;\n+\n+    return true;\n+}\n+\n+void bot_ai::CommonTimers(uint32 diff)\n+{\n+    Events.Update(diff);\n+    SpellTimers(diff);\n+\n+    if (GC_Timer > diff)            GC_Timer -= diff;\n+    if (checkAurasTimer > diff)     checkAurasTimer -= diff;\n+    if (waitTimer > diff)           waitTimer -= diff;\n+    if (_moveBehindTimer > diff)    _moveBehindTimer -= diff;\n+    if (itemsAutouseTimer > diff)   itemsAutouseTimer -= diff;\n+    if (evadeDelayTimer > diff)     evadeDelayTimer -= diff;\n+    if (roleTimer > diff)           roleTimer -= diff;\n+    if (ordersTimer > diff)         ordersTimer -= diff;\n+    if (_checkMasterTimer > diff)    _checkMasterTimer -= diff;\n+    if (_checkOwershipTimer > diff) _checkOwershipTimer -= diff;\n+\n+    if (_powersTimer > diff)        _powersTimer -= diff;\n+    if (_chaseTimer > diff)         _chaseTimer -= diff;\n+    if (_engageTimer > diff)        _engageTimer -= diff;\n+\n+    if (_potionTimer > diff && (_potionTimer < POTION_CD || !me->IsInCombat())) _potionTimer -= diff;\n+\n+    if (IAmFree())\n+        UpdateReviveTimer(diff);\n+    else\n+    {\n+        if (BotCfg::GetNpcBotCostRent(me->GetLevel(), GetBotClass()) && me->IsInWorld() && !HasBotCommandState(BOT_COMMAND_UNBIND))\n+            _rentTimer += diff;\n+    }\n+\n+    if (me->IsInWorld())\n+    {\n+        if (_wmoAreaUpdateTimer > diff) _wmoAreaUpdateTimer -= diff;\n+\n+        if (me->IsOutdoors())\n+        {\n+            outdoorsTimer += diff;\n+            if (indoorsTimer)\n+                indoorsTimer = 0;\n+        }\n+        else\n+        {\n+            indoorsTimer += diff;\n+            if (outdoorsTimer)\n+                outdoorsTimer = 0;\n+        }\n+    }\n+\n+    if (_contestedPvPTimer > diff)  _contestedPvPTimer -= diff;\n+\n+    if (_groupUpdateTimer > diff)   _groupUpdateTimer -= diff;\n+    else if (_groupUpdateTimer)     _groupUpdateTimer = 0;\n+\n+    if (_updateTimerMedium > diff)  _updateTimerMedium -= diff;\n+    if (_updateTimerLong > diff)    _updateTimerLong -= diff;\n+    if (_updateTimerEx1 > diff)     _updateTimerEx1 -= diff;\n+    if (_updateTimerEx2 > diff)     _updateTimerEx2 -= diff;\n+\n+    if (_saveDisabledSpellsTimer > diff) _saveDisabledSpellsTimer -= diff;\n+    if (_saveMiscValuesTimer > diff)     _saveMiscValuesTimer -= diff;\n+}\n+\n+void bot_ai::UpdateReviveTimer(uint32 diff)\n+{\n+    if (me->IsAlive())\n+        return;\n+\n+    if (_reviveTimer > diff)        _reviveTimer -= diff;\n+    else\n+    {\n+        if (IAmFree())\n+        {\n+            BotMgr::ReviveBot(me);\n+\n+            if (IsWanderer())\n+            {\n+                outdoorsTimer = 0;\n+                if (me->GetMap()->GetEntry()->IsContinent() || me->GetMap()->IsBattleground())\n+                {\n+                    Position safePos(*me);\n+                    WanderNode const* nextNode = GetNextTravelNode(&safePos, true);\n+                    if (!nextNode)\n+                    {\n+                        BOT_LOG_FATAL(\"scripts\", \"Bot {} ({}) is unable to get next travel node (1)! cur {}, last {}, position: {}. BOT WAS DISABLED\",\n+                            me->GetName(), me->GetEntry(), _travel_node_cur->GetWPId(), _travel_node_last ? _travel_node_last->GetWPId() : 0, me->GetPosition().ToString());\n+                        canUpdate = false;\n+                        return;\n+                    }\n+\n+                    homepos.Relocate(nextNode);\n+                    if (me->GetMap()->GetEntry()->IsContinent())\n+                        BotMgr::TeleportBot(me, sMapMgr->CreateBaseMap(nextNode->GetMapId()), nextNode, true);\n+\n+                    BOT_LOG_TRACE(\"npcbots\", \"Bot {} id {} class {} level {} died on the way from node {} to {} ('{}'), NEW {} ('{}'), {}, dist {} yd!\",\n+                        me->GetName(), me->GetEntry(), uint32(_botclass), uint32(me->GetLevel()), _travel_node_last ? _travel_node_last->GetWPId() : 0, _travel_node_cur->GetWPId(),\n+                        _travel_node_cur->GetName(), nextNode->GetWPId(), nextNode->GetName(), homepos.ToString(), safePos.GetExactDist(homepos));\n+\n+                    _travel_node_last = _travel_node_cur;\n+                    _travel_node_cur = nextNode;\n+                    return;\n+                }\n+            }\n+        }\n+        else\n+            if (_reviveTimer > 0)   _reviveTimer = 0;\n+    }\n+}\n+\n+void bot_ai::Evade()\n+{\n+    if (_atHome && !_evadeMode)\n+        return;\n+    if (evadeDelayTimer > lastdiff)\n+        return;\n+    if (me->GetVictim())\n+        return;\n+    if (IAmFree() && HasBotCommandState(BOT_COMMAND_FOLLOW))\n+        return;\n+    if (IsWanderer() && Feasting())\n+        return;\n+    if (JumpingOrFalling())\n+        return;\n+    if (IsCasting())\n+        return;\n+    if (CCed(me, true))\n+        return;\n+\n+    if (!IAmFree() || IsTempBot())\n+    {\n+        _atHome = true;\n+        _evadeMode = false;\n+        return;\n+    }\n+\n+    if (HasBotCommandState(BOT_COMMAND_MASK_UNMOVING))\n+        return;\n+\n+    //delay evade\n+    if (evadeDelayTimer == 0 && me->GetMap()->GetEntry()->IsContinent())\n+    {\n+        evadeDelayTimer = 5000;\n+        return;\n+    }\n+\n+    uint16 mapid;\n+    Position pos;\n+    GetHomePosition(mapid, &pos);\n+\n+    float dist = me->GetExactDist2d(pos);\n+\n+    if (IsWanderer())\n+    {\n+        if (mapid != me->GetMap()->GetId() || _evadeCount >= 50 || me->GetExactDist2d(pos) > MAX_WANDER_NODE_DISTANCE ||\n+            me->GetPositionZ() <= INVALID_HEIGHT || (me->GetExactDist2d(pos) < 20.0f && me->GetExactDist(pos) > 100.0f))\n+        {\n+            BOT_LOG_DEBUG(\"npcbots\", \"Bot {} id {} class {} level {} map {} TELEPORTING to node {} ('{}') map {}, {}, dist {} yd!\",\n+                me->GetName(), me->GetEntry(), uint32(_botclass), uint32(me->GetLevel()), me->GetMapId(), _travel_node_cur->GetWPId(),\n+                _travel_node_cur->GetName(), uint32(mapid), pos.ToString(), me->GetExactDist(pos));\n+\n+            evadeDelayTimer = 12000;\n+            me->CastSpell(me, WANDERER_HEARTHSTONE);\n+            return;\n+        }\n+    }\n+    else if (mapid != me->GetMapId() || _evadeCount >= 10 || me->GetDistance(pos) > float(SIZE_OF_GRIDS * 0.5f) || !CanAppearInWorld())\n+    {\n+        if (!teleHomeEvent || !teleHomeEvent->IsActive())\n+        {\n+            teleHomeEvent = new TeleportHomeEvent(this, false);\n+            Events.AddEvent(teleHomeEvent, Events.CalculateTime(std::chrono::seconds(5)));\n+\n+            //if bot has been removed manually and while in dungeon\n+            if (mapid != me->GetMapId())\n+            {\n+                teleHomeEvent->ScheduleAbort();\n+                teleHomeEvent->Execute(0,0);\n+            }\n+        }\n+        return;\n+    }\n+\n+    if (botPet && !me->IsWithinDist2d(botPet, 20.0f))\n+        return;\n+\n+    if (!IsWanderer())\n+        _atHome = true;\n+    else if (!me->IsInCombat() && me->GetMap()->GetEntry()->IsContinent() && GetHealthPCT(me) < 90)\n+        return;\n+\n+    if (dist > 1.5f || IsWanderer())\n+    {\n+        _evadeMode = true;\n+\n+        if (!me->isMoving())\n+        {\n+            ++_evadeCount;\n+\n+            if (dist > (me->GetMap()->GetEntry()->IsContinent() ? 15.0f : INTERACTION_DISTANCE))\n+            {\n+                if (_travel_node_last && _travel_node_last->HasFlag(BotWPFlags::BOTWP_FLAG_MOVEMENT_FORCE_JUMP_BEGIN) &&\n+                    _travel_node_cur && _travel_node_cur->HasFlag(BotWPFlags::BOTWP_FLAG_MOVEMENT_FORCE_JUMP_END) &&\n+                    me->GetDistance(*_travel_node_last) < 10.0f)\n+                {\n+                    //BOT_LOG_DEBUG(\"npcbots\", \"Bot wanderer {} id {} JUMPS from node {} to {} ('{}' -> '{}'), dist2d {} yd, zdiff {} yd!\",\n+                    //    me->GetName(), me->GetEntry(), _travel_node_last->GetWPId(), _travel_node_cur->GetWPId(), _travel_node_last->GetName(), _travel_node_cur->GetName(),\n+                    //    _travel_node_last->GetExactDist2d(_travel_node_cur), _travel_node_last->GetPositionZ() - _travel_node_cur->GetPositionZ());\n+                    BotMovement(BOT_MOVE_JUMP, &pos, nullptr, false);\n+                }\n+                else\n+                {\n+                    bool use_path =\n+                        !(_travel_node_cur && _travel_node_last &&\n+                            _travel_node_cur->HasFlag(BotWPFlags::BOTWP_FLAG_MOVEMENT_IGNORES_PATHING) &&\n+                            _travel_node_last->HasFlag(BotWPFlags::BOTWP_FLAG_MOVEMENT_IGNORES_PATHING));\n+                    GetNextEvadeMovePoint(pos, use_path);\n+                    if (pos.m_positionZ <= INVALID_HEIGHT)\n+                    {\n+                        BOT_LOG_ERROR(\"npcbots\", \"Bot {} '{}' class {} level {} evade move point has invalid height {} (usepath: {})!\\nWPs: cur {}, last {}\\nPositions:\\ncurrent: {}\\ntarget: {}\",\n+                            me->GetEntry(), me->GetName(), uint32(_botclass), uint32(me->GetLevel()), pos.m_positionZ, uint32(use_path),\n+                            _travel_node_cur->GetWPId(), _travel_node_last ? _travel_node_last->GetWPId() : 0, me->GetPosition().ToString(), pos.ToString());\n+                        _evadeCount = 100;\n+                        return;\n+                    }\n+\n+                    //if (TempSummon* wpc = me->GetMap()->SummonCreature(VISUAL_WAYPOINT, pos, nullptr, 20000))\n+                    //    wpc->SetTempSummonType(TEMPSUMMON_TIMED_DESPAWN);\n+\n+                    movepos.Relocate(me);\n+                    BotMovement(BOT_MOVE_POINT, &pos, nullptr, use_path);\n+                }\n+                return;\n+            }\n+            else if (IsWanderer())\n+            {\n+                OnWanderNodeReached();\n+\n+                WanderNode const* nextNode = GetNextTravelNode(&pos, false);\n+                if (!nextNode)\n+                {\n+                    BOT_LOG_FATAL(\"npcbots\", \"Bot {} ({}) is unable to get next travel node! cur {}, last {}, position: {}. BOT WAS DISABLED\",\n+                        me->GetName(), me->GetEntry(), _travel_node_cur->GetWPId(), _travel_node_last ? _travel_node_last->GetWPId() : 0, me->GetPosition().ToString());\n+                    canUpdate = false;\n+                    return;\n+                }\n+\n+                if (nextNode == _travel_node_cur)\n+                {\n+                    //same node: mill about\n+                    float cangle = Position::NormalizeOrientation(me->GetRelativeAngle(nextNode) + frand(float(-M_PI_2), float(M_PI_2)));\n+                    float cdist = nextNode->HasFlag(BotWPFlags::BOTWP_FLAG_INTERACTION_MILL_RADIUS) ? frand(INTERACTION_DISTANCE * 0.25f, INTERACTION_DISTANCE) : frand(8.0f, 15.0f);\n+                    Position cnpos = me->GetFirstCollisionPosition(cdist, cangle);\n+                    homepos.Relocate(cnpos);\n+                    evadeDelayTimer = urand(4000, 6000);\n+                }\n+                else\n+                {\n+                    float x = nextNode->GetPositionX();\n+                    float y = nextNode->GetPositionY();\n+                    float z = nextNode->GetPositionZ();\n+                    float o = nextNode->GetOrientation();\n+                    if (nextNode->GetProximity() > 0.5f)\n+                    {\n+                        float angle = frand(0.f, float(M_PI) * 2.f);\n+                        float pdist = frand(0.f, nextNode->GetProximity());\n+                        x = x + pdist * std::cos(angle);\n+                        y = y + pdist * std::sin(angle);\n+                        float ground = z;\n+                        me->UpdateGroundPositionZ(x, y, ground);\n+                        if (ground > INVALID_HEIGHT)\n+                            z = ground;\n+                        else\n+                            z += 2.f;\n+                    }\n+                    homepos.Relocate(x, y, z, o);\n+                    if (me->GetMap()->GetEntry()->IsContinent())\n+                        evadeDelayTimer = urand(_travel_node_cur->GetWaitTime().first, _travel_node_cur->GetWaitTime().second);\n+                    else\n+                    {\n+                        if (_travel_node_cur->HasFlag(BotWPFlags::BOTWP_FLAG_OPTIONAL_PICKUP) && !IsCasting())\n+                            evadeDelayTimer = 1000;\n+                        else\n+                            evadeDelayTimer = 0;\n+                        waitTimer = std::min<uint32>(waitTimer, evadeDelayTimer);\n+                    }\n+                }\n+\n+                BOT_LOG_TRACE(\"npcbots\", \"Bot {} id {} class {} level {} wandered from node {} to {}, next {} ('{}'), {}, dist {} yd!\",\n+                    me->GetName(), me->GetEntry(), uint32(_botclass), uint32(me->GetLevel()), _travel_node_last ? _travel_node_last->GetWPId() : 0, _travel_node_cur->GetWPId(),\n+                    nextNode->GetWPId(), nextNode->GetName(), homepos.ToString(), pos.GetExactDist(homepos));\n+\n+                _travel_node_last = _travel_node_cur;\n+                _travel_node_cur = nextNode;\n+                _evadeCount = 0;\n+                return;\n+            }\n+\n+            movepos.Relocate(me);\n+            BotMovement(BOT_MOVE_POINT, &pos);\n+        }\n+\n+        return;\n+    }\n+\n+    if (me->isMoving())\n+        return;\n+\n+    _evadeMode = false;\n+    _evadeCount = 0;\n+    evadeDelayTimer = 0;\n+\n+    me->SetFacingTo(pos.GetOrientation());\n+    me->SetFaction(me->GetCreatureTemplate()->faction);\n+}\n+void bot_ai::GetNextEvadeMovePoint(Position& pos, bool& use_path) const\n+{\n+    //const uint8 evade_jump_threshold = me->HasUnitMovementFlag(MOVEMENTFLAG_SWIMMING) ? 50 : 25;\n+    const float base_angle = me->GetRelativeAngle(pos);\n+    const float orig_z = pos.m_positionZ;\n+    float ground, floor;\n+\n+    float fulldist = std::min<float>(me->GetExactDist2d(pos), float((MAX_POINT_PATH_LENGTH - 1) * SMOOTH_PATH_STEP_SIZE - 2.0f));\n+    PathGenerator path(me);\n+    while (path.GetPathType() == PATHFIND_BLANK || (path.GetPathType() & (PATHFIND_NOPATH | PATHFIND_SHORTCUT | PATHFIND_SHORT)))\n+    {\n+        if (std::fabs(fulldist - me->GetExactDist2d(pos)) > 15.0f)\n+        {\n+            pos.Relocate(me->m_positionX, me->m_positionY, me->m_positionZ);\n+            pos.m_positionX += fulldist * std::cos(me->ToAbsoluteAngle(base_angle));\n+            pos.m_positionY += fulldist * std::sin(me->ToAbsoluteAngle(base_angle));\n+\n+            Bcore::NormalizeMapCoord(pos.m_positionX);\n+            Bcore::NormalizeMapCoord(pos.m_positionY);\n+            ground = me->GetMapHeight(pos.m_positionX, pos.m_positionY, MAX_HEIGHT, true, MAX_FALL_DISTANCE);\n+            floor = me->GetMapHeight(pos.m_positionX, pos.m_positionY, pos.m_positionZ);\n+            pos.m_positionZ = std::fabs(ground - pos.m_positionZ) <= std::fabs(floor - pos.m_positionZ) ? ground : floor;\n+            if (pos.m_positionZ <= INVALID_HEIGHT)\n+            {\n+                me->UpdateGroundPositionZ(pos.m_positionX, pos.m_positionY, pos.m_positionZ);\n+                if (pos.m_positionZ <= INVALID_HEIGHT)\n+                    pos.m_positionZ = orig_z;\n+            }\n+        }\n+\n+        path.CalculatePath(pos.m_positionX, pos.m_positionY, pos.m_positionZ);\n+        if (path.GetPathType() == PATHFIND_BLANK ||\n+            (path.GetPathType() == PATHFIND_INCOMPLETE && path.GetPath().size() > 2) ||\n+            (path.GetPathType() & (PATHFIND_NORMAL | PATHFIND_NOT_USING_PATH | PATHFIND_FARFROMPOLY_START)))\n+            break;\n+\n+        fulldist *= 0.72f;\n+\n+        if (fulldist < 25.0f)\n+            break;\n+    }\n+\n+    if ((path.GetPathType() & (PATHFIND_NORMAL | PATHFIND_NOT_USING_PATH)) == (PATHFIND_NORMAL | PATHFIND_NOT_USING_PATH) &&\n+        path.GetPath().size() > 4)\n+        return;\n+\n+    if (me->IsInWater())\n+        BOT_LOG_TRACE(\"npcbots\", \"Bot {} id {} class {} level {} is pathing from water!\", me->GetName(), me->GetEntry(), uint32(_botclass), uint32(me->GetLevel()));\n+\n+    switch (path.GetPathType())\n+    {\n+        case PATHFIND_NOT_USING_PATH: //swimming\n+        case PATHFIND_NORMAL: //found path\n+            if (me->GetExactDist(Vector3ToPosition(path.GetEndPosition())) > 15.0f)\n+                path.ShortenPathUntilDist(path.GetEndPosition(), frand(7.5f, 15.0f));\n+            return;\n+        case PATHFIND_BLANK: // invalid coords\n+        case PATHFIND_NOPATH:\n+        case PATHFIND_SHORTCUT:\n+        case PATHFIND_SHORT:\n+        case PATHFIND_INCOMPLETE:\n+        case PATHFIND_FARFROMPOLY: // invalid coords\n+        case PATHFIND_FARFROMPOLY_START: //invalid start coords\n+        case PATHFIND_FARFROMPOLY_END: //invalid end coords\n+            if (path.GetPath().size() > 4)\n+            {\n+                path.ShortenPathUntilDist(path.GetEndPosition(), frand(5.0f, 15.0f));\n+                return;\n+            }\n+            if (use_path)\n+            {\n+                //log error and use direct point movement\n+                BOT_LOG_DEBUG(\"npcbots\", \"Bot {} id {} class {} level {} can't find full path to node {} (res {}) from pos {}, falling back to default PF!\",\n+                    me->GetName(), me->GetEntry(), uint32(_botclass), uint32(me->GetLevel()), IsWanderer() ? _travel_node_cur->GetWPId() : 0, uint32(path.GetPathType()),\n+                    me->GetPosition().ToString());\n+            }\n+            break;\n+        default:\n+            break;\n+    }\n+\n+    use_path = false;\n+\n+    // No path: proceed to destination in small steps, maybe it's just a fluke... Move to surface if needed\n+    Position mypos = me->GetPosition();\n+    float movedist = std::min<float>(fulldist * 0.25f, 15.0f);\n+    mypos.m_positionX += movedist * std::cos(me->ToAbsoluteAngle(base_angle));\n+    mypos.m_positionY += movedist * std::sin(me->ToAbsoluteAngle(base_angle));\n+    Bcore::NormalizeMapCoord(mypos.m_positionX);\n+    Bcore::NormalizeMapCoord(mypos.m_positionY);\n+\n+    ground = me->GetMapHeight(mypos.m_positionX, mypos.m_positionY, MAX_HEIGHT, true, MAX_FALL_DISTANCE);\n+    floor = me->GetMapHeight(mypos.m_positionX, mypos.m_positionY, mypos.m_positionZ);\n+    mypos.m_positionZ = std::fabs(ground - mypos.m_positionZ) <= std::fabs(floor - mypos.m_positionZ) ? ground : floor;\n+    LiquidData ldata;\n+    ZLiquidStatus lstatus = me->GetMap()->GetLiquidStatus(\n+        me->GetPhaseMask(), mypos.m_positionX, mypos.m_positionY, mypos.m_positionZ, MAP_ALL_LIQUIDS, &ldata, me->GetCollisionHeight());\n+    if (me->IsInWater() != !!(lstatus & MAP_LIQUID_STATUS_IN_CONTACT))\n+        mypos.m_positionZ = std::max<float>(ldata.level, mypos.m_positionZ);\n+    if (mypos.m_positionZ <= INVALID_HEIGHT)\n+        mypos.m_positionZ = orig_z;\n+    pos.Relocate(mypos);\n+}\n+bool bot_ai::CanAppearInWorld() const\n+{\n+    return _canAppearInWorld;\n+}\n+void bot_ai::TeleportHomeStart(bool reset)\n+{\n+    AbortTeleport();\n+\n+    //if no master - will teleport to spawn position\n+    //otherwise - will teleport to master\n+    teleHomeEvent = new TeleportHomeEvent(this, reset);\n+    Events.AddEvent(teleHomeEvent, Events.CalculateTime(0ms)); //make sure event will be deleted\n+    if (teleHomeEvent->IsActive())\n+        teleHomeEvent->ScheduleAbort(); //make sure event will not be executed twice\n+    teleHomeEvent->Execute(0,0);\n+}\n+//TeleportHome() ONLY CALLED THROUGH EVENTPROCESSOR\n+void bot_ai::TeleportHome(bool reset)\n+{\n+    ASSERT(teleHomeEvent);\n+\n+    AbortTeleport();\n+\n+    uint16 mapid;\n+    Position pos;\n+    GetHomePosition(mapid, &pos);\n+\n+    Map* map = sMapMgr->CreateBaseMap(mapid);\n+    BotMgr::TeleportBot(me, map, &pos, false, reset, this);\n+\n+    spawned = false;\n+    _evadeCount = 0;\n+}\n+//FinishTeleport(uint32, float, float, float, float) ONLY CALLED THROUGH EVENTPROCESSOR\n+bool bot_ai::FinishTeleport(bool reset)\n+{\n+    ASSERT(teleFinishEvent);\n+    ASSERT(!me->IsInWorld());\n+\n+    AbortTeleport();\n+\n+    //1) Cannot teleport: master disappeared - return home\n+    if (IAmFree()/* || master->GetSession()->isLogingOut()*/)\n+    {\n+        uint16 mapid = uint16(me->GetMapId());\n+        Position pos;\n+        if (BotCfg::HideBotSpawns() && !CanAppearInWorld())\n+            GetHomePosition(mapid, &pos);\n+        if (BotCfg::HideBotSpawns() && !CanAppearInWorld() && me->GetMapId() == mapid && me->GetExactDist2d(pos) < 10.0f)\n+        {\n+            AbortTeleport();\n+            TeleportFinishEvent* delayedTeleportEvent = new TeleportFinishEvent(this, reset);\n+            std::chrono::milliseconds delay(urand(5000, 8000));\n+            Events.AddEvent(delayedTeleportEvent, Events.CalculateTime(delay));\n+            SetTeleportFinishEvent(delayedTeleportEvent);\n+        }\n+        else\n+            TeleportHomeStart(!BotCfg::HideBotSpawns());\n+\n+        _evadeMode = false;\n+        return false;\n+    }\n+\n+    BotLogger::Log(NPCBOT_LOG_TELEPORT_FINISH, me, me->IsInGrid(), me->IsWandererBot(), CanAppearInWorld());\n+\n+    BotMgr::AddDelayedTeleportCallback([this, reset]() {\n+        Map* map = master->FindMap();\n+        //2) Cannot teleport: map not found or forbidden - delay teleport\n+        if (!map || !master->IsAlive() || master->GetBotMgr()->RestrictBots(me, true))\n+        {\n+            //ChatHandler ch(master->GetSession());\n+            //ch.PSendSysMessage(\"Your bot %s cannot teleport to you. Restricted bot access on this map...\", me->GetName().c_str());\n+            teleFinishEvent = new TeleportFinishEvent(this, reset);\n+            Events.AddEvent(teleFinishEvent, Events.CalculateTime(std::chrono::seconds(5)));\n+            return;\n+        }\n+\n+        if (me->FindMap())\n+            me->ResetMap();\n+\n+        me->SetMap(map);\n+        if (master->GetTransport())\n+        {\n+            master->GetTransport()->AddPassenger(me);\n+            me->m_movementInfo.transport.pos.Relocate(master->GetTransOffset());\n+            me->Relocate(GetAbsoluteTransportPosition(master));\n+            me->AddUnitState(UNIT_STATE_IGNORE_PATHFINDING);\n+        }\n+        else\n+        {\n+            Position destpos;\n+            _calculatePos(master, destpos);\n+            me->Relocate(destpos);\n+        }\n+\n+        map->AddToMap(me);\n+        me->BotStopMovement();\n+        if (reset)\n+            this->Reset();\n+\n+        me->RefreshCanSwimFlag();\n+\n+        //bot->SetAI(oldAI);\n+        //me->IsAIEnabled = true;\n+        canUpdate = true;\n+        outdoorsTimer = 0;\n+\n+        //master->m_Controlled.insert(me);\n+        if (me->IsAlive())\n+        {\n+            CastSpellExtraArgs args(TRIGGERED_FULL_MASK);\n+            me->CastSpell(me, COSMETIC_TELEPORT_EFFECT, args);\n+        }\n+        //me->CastSpell(me, HONORLESS_TARGET, true);\n+\n+        //Arena flags\n+        Battleground const* bg = GetBG();\n+        if (bg && bg->isArena())\n+        {\n+            TeamId teamId = bg->GetBotTeamId(me->GetGUID());\n+            uint32 flag_spell = teamId == TEAM_ALLIANCE ? master->GetTeamId() == TEAM_HORDE ? ARENA_FLAG_TEAM_H_GOLD : ARENA_FLAG_TEAM_A_GOLD :\n+                master->GetTeamId() == TEAM_HORDE ? ARENA_FLAG_TEAM_H_GREEN : ARENA_FLAG_TEAM_A_GREEN;\n+            me->CastSpell(me, flag_spell, true);\n+        }\n+\n+        //update group member online state\n+        if (Group* gr = master->GetGroup())\n+            if (gr->IsMember(me->GetGUID()))\n+                gr->SendUpdate();\n+\n+        //map hooks\n+        if (InstanceScript* iscr = master->GetInstanceScript())\n+            iscr->OnNPCBotEnter(me);\n+\n+        SetIsDuringTeleport(false);\n+    });\n+\n+    return true;\n+}\n+\n+void bot_ai::AbortTeleport()\n+{\n+    if (teleHomeEvent)\n+    {\n+        if (teleHomeEvent->IsActive())\n+            teleHomeEvent->ScheduleAbort();\n+        teleHomeEvent = nullptr;\n+    }\n+\n+    if (teleFinishEvent)\n+    {\n+        if (teleFinishEvent->IsActive())\n+            teleFinishEvent->ScheduleAbort();\n+        teleFinishEvent = nullptr;\n+    }\n+}\n+\n+void bot_ai::GetHomePosition(uint16& mapid, Position* pos) const\n+{\n+    if (IsWanderer())\n+    {\n+        mapid = _travel_node_cur->GetMapId();\n+        pos->Relocate(homepos);\n+    }\n+    else\n+    {\n+        CreatureData const* data = me->GetCreatureData();\n+        mapid = data->mapId;\n+        pos->Relocate(data->spawnPoint);\n+    }\n+}\n+\n+//WANDER NODES\n+/*static */bool bot_ai::IsWanderNodeAvailableForBotFaction(WanderNode const* wp, uint32 factionTemplateId, bool teleport, bool spawn)\n+{\n+    if (!teleport && !spawn && wp->HasFlag(BotWPFlags::BOTWP_FLAG_MOVEMENT_IGNORES_FACTION))\n+        return true;\n+\n+    MapEntry const* mapEntry = sMapStore.LookupEntry(wp->GetMapId());\n+    if (teleport && !mapEntry->IsContinent())\n+        return false;\n+\n+    if ((teleport || spawn) && (wp->GetLevels().second <= 10 || mapEntry->IsBattlegroundOrArena()))\n+    {\n+        switch (BotDataMgr::GetTeamIdForFaction(factionTemplateId))\n+        {\n+            case TEAM_ALLIANCE:\n+                return wp->HasFlag(BotWPFlags::BOTWP_FLAG_ALLIANCE_ONLY);\n+            case TEAM_HORDE:\n+                return wp->HasFlag(BotWPFlags::BOTWP_FLAG_HORDE_ONLY);\n+            case TEAM_NEUTRAL:\n+                return true;\n+            default:\n+                return true;\n+        }\n+    }\n+\n+    switch (BotDataMgr::GetTeamIdForFaction(factionTemplateId))\n+    {\n+        case TEAM_ALLIANCE:\n+            return !wp->HasFlag(BotWPFlags::BOTWP_FLAG_HORDE_ONLY);\n+        case TEAM_HORDE:\n+            return !wp->HasFlag(BotWPFlags::BOTWP_FLAG_ALLIANCE_ONLY);\n+        case TEAM_NEUTRAL:\n+            return !wp->HasFlag(BotWPFlags::BOTWP_FLAG_ALLIANCE_OR_HORDE_ONLY);\n+        default:\n+            return true;\n+    }\n+}\n+\n+WanderNode const* bot_ai::GetClosestWanderNode() const\n+{\n+    float mindist = 50000.0f;\n+    WanderNode const* closestNode = nullptr;\n+    WanderNode::DoForAllMapWPs(me->GetMapId(), [&mindist, &closestNode, loc = me](WanderNode const* wp) {\n+        float dist = wp->GetExactDist2d(loc);\n+        if (dist < mindist)\n+        {\n+            mindist = dist;\n+            closestNode = wp;\n+        }\n+    });\n+\n+    return closestNode;\n+}\n+\n+WanderNode const* bot_ai::GetNextWanderNode(Position const* fromPos, uint8 lvl, bool random) const\n+{\n+    using NodeList = std::list<WanderNode const*>;\n+    using WanderNodeLink = WanderNode::WanderNodeLink;\n+    using NodeLinkList = std::list<WanderNodeLink const*>;\n+    using LinkWeightExtractor = WanderNodeLink::WeightExtractor;\n+\n+    static auto node_viable = [](WanderNode const* wp, uint8 lvl) -> bool {\n+        return (lvl + 2 >= wp->GetLevels().first && lvl <= wp->GetLevels().second);\n+    };\n+\n+    uint32 faction = me->GetFaction();\n+    if (me->IsFFAPvP())\n+    {\n+        ChrRacesEntry const* rentry = sChrRacesStore.LookupEntry(me->GetRace());\n+        faction = (_botclass >= BOT_CLASS_EX_START) ? uint32(FACTION_TEMPLATE_NEUTRAL_HOSTILE) : rentry ? rentry->FactionID : uint32(FACTION_TEMPLATE_NEUTRAL_HOSTILE);\n+    }\n+\n+    //Node got deleted (or forced)! Select close point and go from there\n+    NodeList nlinks;\n+    if (_travel_node_cur->GetLinks().empty() || random)\n+    {\n+        if (me->IsInWorld() && !me->GetMap()->IsBattlegroundOrArena())\n+        {\n+            WanderNode::DoForAllMapWPs(_travel_node_cur->GetMapId(), [&nlinks, lvl = lvl, fac = faction, pos = fromPos](WanderNode const* wp) {\n+                if (pos->GetExactDist2d(wp) < MAX_WANDER_NODE_DISTANCE && IsWanderNodeAvailableForBotFaction(wp, fac, true) && node_viable(wp, lvl) && !wp->HasFlag(BotWPFlags::BOTWP_FLAG_NOT_A_START_POINT))\n+                    nlinks.push_back(wp);\n+            });\n+            if (!nlinks.empty())\n+                return nlinks.size() == 1u ? nlinks.front() : Bcore::Containers::SelectRandomContainerElement(nlinks);\n+        }\n+\n+        //Select closest\n+        WanderNode const* node_new = nullptr;\n+        float mindist = 50000.0f; // Anywhere\n+        WanderNode::DoForAllMapWPs(_travel_node_cur->GetMapId(), [&node_new, &mindist, lvl = lvl, fac = faction, pos = fromPos](WanderNode const* wp) {\n+            float dist = pos->GetExactDist2d(wp);\n+            if (dist < mindist && IsWanderNodeAvailableForBotFaction(wp, fac, false) && node_viable(wp, lvl) && !wp->HasFlag(BotWPFlags::BOTWP_FLAG_NOT_A_START_POINT))\n+            {\n+                mindist = dist;\n+                node_new = wp;\n+            }\n+        });\n+        return node_new;\n+    }\n+\n+    NodeLinkList llinks;\n+    for (auto const& wpl : _travel_node_cur->GetLinks())\n+    {\n+        if (IsWanderNodeAvailableForBotFaction(wpl.wp, faction, false) && node_viable(wpl.wp, lvl))\n+            llinks.push_back(&wpl);\n+    }\n+    if (llinks.size() > 1 && _travel_node_last && !_travel_node_cur->HasFlag(BotWPFlags::BOTWP_FLAG_CAN_BACKTRACK_FROM))\n+        std::erase_if(llinks, [this](WanderNodeLink const* wpl) { return wpl->wp == _travel_node_last; });\n+    if (!llinks.empty())\n+    {\n+        WanderNodeLink const* wpl = llinks.size() == 1u ? llinks.front() : *Bcore::Containers::SelectRandomWeightedContainerElement(llinks, LinkWeightExtractor());\n+        return wpl->wp;\n+    }\n+\n+    //Overleveled or died: no viable nodes in reach, find one for teleport\n+    WanderNode::DoForAllWPs([&nlinks, lvl = lvl, fac = faction](WanderNode const* wp) {\n+        if (IsWanderNodeAvailableForBotFaction(wp, fac, true) && wp->HasFlag(BotWPFlags::BOTWP_FLAG_SPAWN) && node_viable(wp, lvl) && !wp->HasFlag(BotWPFlags::BOTWP_FLAG_NOT_A_START_POINT))\n+            nlinks.push_back(wp);\n+    });\n+\n+    ASSERT(!nlinks.empty());\n+    return nlinks.size() == 1u ? nlinks.front() : Bcore::Containers::SelectRandomContainerElement(nlinks);\n+}\n+\n+WanderNode const* bot_ai::GetNextTravelNode(Position const* from, bool random) const\n+{\n+    if (!random)\n+    {\n+        if (WanderNode const* bgNode = GetNextBGTravelNode())\n+            return bgNode;\n+    }\n+\n+    int8 mylevelbonus = BotDataMgr::GetLevelBonusForBotRank(me->GetCreatureTemplate()->rank);\n+    uint8 mylevelbase = std::max<int8>(int8(me->GetLevel()) - mylevelbonus, int8(BotDataMgr::GetMinLevelForBotClass(_botclass)));\n+\n+    return GetNextWanderNode(from, mylevelbase, random);\n+}\n+\n+WanderNode const* bot_ai::GetNextBGTravelNode() const\n+{\n+    using WanderNodeLink = WanderNode::WanderNodeLink;\n+    using NodeList = std::list<WanderNode const*>;\n+    using NodeLinkList = std::list<WanderNodeLink>;\n+    using LinkWeightExtractor = WanderNodeLink::WeightExtractor;\n+\n+    if (!me->GetMap()->IsBattleground() || !GetBG() || !GetGroup() || _travel_node_cur->GetLinks().size() <= 1)\n+        return nullptr;\n+\n+    Battleground* bg = GetBG();\n+    TeamId myTeamId = bg->GetBotTeamId(me->GetGUID());\n+    uint32 myTeam = myTeamId == TEAM_ALLIANCE ? ALLIANCE : HORDE;\n+    WanderNode const* curNode = _travel_node_cur;\n+    std::vector<Unit*> const team_members = BotMgr::GetAllGroupMembers(me);\n+    NodeLinkList links;\n+    for (WanderNodeLink const& wpl : curNode->GetLinks())\n+        if (bot_ai::IsWanderNodeAvailableForBotFaction(wpl.wp, me->GetFaction(), false))\n+            links.push_back(wpl);\n+    if (links.size() > 1 && _travel_node_last && !curNode->HasFlag(BotWPFlags::BOTWP_FLAG_CAN_BACKTRACK_FROM))\n+        std::erase_if(links, [this](WanderNodeLink const& wpl) { return wpl.Id() == _travel_node_last->GetWPId(); });\n+\n+    switch (bg->GetTypeID())\n+    {\n+        case BATTLEGROUND_AV:\n+        {\n+            const uint32 CRETYPE_CAPTAIN_A = AV_CPLACE_MAX + 61;\n+            const uint32 CRETYPE_CAPTAIN_H = AV_CPLACE_MAX + 59;\n+            const uint32 CRETYPE_BOSS_A = AV_CPLACE_MAX + 60;\n+            const uint32 CRETYPE_BOSS_H = AV_CPLACE_MAX + 122;\n+\n+            static const std::function boss_room_wp_pred_a = [](WanderNode const* wp) { return wp->HasAllFlags(BotWPFlags::BOTWP_FLAG_ALLIANCE_BOSS_ROOM); };\n+            static const std::function boss_room_wp_pred_h = [](WanderNode const* wp) { return wp->HasAllFlags(BotWPFlags::BOTWP_FLAG_HORDE_BOSS_ROOM); };\n+\n+            BattlegroundAV* av = dynamic_cast<BattlegroundAV*>(bg);\n+\n+            // 1) check conditions to rush final boss\n+            for (TeamId teamId : { TEAM_ALLIANCE, TEAM_HORDE })\n+            {\n+                if (myTeamId != teamId)\n+                    continue;\n+\n+                //Condition 1: at least half of bunkers/towers destroyed\n+                uint8 tb_down_count = 0;\n+                for (BG_AV_Nodes counter = BG_AV_NODES_DUNBALDAR_SOUTH; counter <= BG_AV_NODES_FROSTWOLF_WTOWER; ++counter)\n+                {\n+                    BG_AV_NodeInfo const& c = av->GetNodes()[counter];\n+                    switch (counter)\n+                    {\n+                        case BG_AV_NODES_DUNBALDAR_SOUTH:\n+                        case BG_AV_NODES_DUNBALDAR_NORTH:\n+                        case BG_AV_NODES_ICEWING_BUNKER:\n+                        case BG_AV_NODES_STONEHEART_BUNKER:\n+                            if (teamId == TEAM_HORDE && c.State == BG_AV_States::POINT_DESTROYED)\n+                                ++tb_down_count;\n+                            break;\n+                        case BG_AV_NODES_ICEBLOOD_TOWER:\n+                        case BG_AV_NODES_TOWER_POINT:\n+                        case BG_AV_NODES_FROSTWOLF_ETOWER:\n+                        case BG_AV_NODES_FROSTWOLF_WTOWER:\n+                            if (teamId == TEAM_ALLIANCE && c.State == BG_AV_States::POINT_DESTROYED)\n+                                ++tb_down_count;\n+                            break;\n+                        default:\n+                            break;\n+                    }\n+                }\n+                if (tb_down_count >= 2)\n+                {\n+                    //Condition 2: boss node is in reach\n+                    WanderNode const* bossWP = ASSERT_NOTNULL(WanderNode::FindInMapWPs(me->GetMapId(), teamId == TEAM_ALLIANCE ? boss_room_wp_pred_h : boss_room_wp_pred_a));\n+                    if (curNode->HasLink(bossWP))\n+                    {\n+                        Creature const* boss = ASSERT_NOTNULL(av->GetBGCreature(teamId == TEAM_ALLIANCE ? CRETYPE_BOSS_H : CRETYPE_BOSS_A));\n+                        //Condition 3: team is ready OR boss is already engaged\n+                        bool team_ready = boss->IsInCombat() && boss->GetThreatManager().GetThreatListSize() >= team_members.size() / 8u;\n+                        if (!team_ready)\n+                        {\n+                            uint32 ready_count = 0;\n+                            for (Unit const* member : team_members)\n+                            {\n+                                if (!member->IsAlive())\n+                                    continue;\n+                                if (member->IsPlayer())\n+                                {\n+                                    if (member->IsWithinDist2d(me, 40.0f) || member->ToPlayer()->GetTarget() == boss->GetGUID())\n+                                        ++ready_count;\n+                                }\n+                                else if (member->ToCreature()->GetBotAI()->_travel_node_cur == bossWP || member->GetVictim() == boss ||\n+                                    (!member->GetVictim() && member->IsWithinDist2d(curNode, 25.0f)))\n+                                    ++ready_count;\n+                            }\n+                            team_ready = ready_count >= static_cast<uint32>(team_members.size() / 2u - 1u);\n+                        }\n+                        if (team_ready)\n+                            return bossWP;\n+                        else\n+                            return curNode;\n+                    }\n+                }\n+            }\n+            // 2) check a boss room to defend\n+            for (auto const& p : { std::pair{TEAM_ALLIANCE, CRETYPE_BOSS_A}, std::pair{TEAM_HORDE, CRETYPE_BOSS_H} })\n+            {\n+                if (myTeamId != p.first)\n+                    continue;\n+                Creature const* boss = ASSERT_NOTNULL(av->GetBGCreature(p.second));\n+                if (boss->IsInCombat() && boss->GetThreatManager().GetThreatListSize() >= 6)\n+                {\n+                    auto const& pred = p.first == TEAM_ALLIANCE ? boss_room_wp_pred_a : boss_room_wp_pred_h;\n+                    WanderNode const* bossWP = ASSERT_NOTNULL(WanderNode::FindInMapWPs(boss->GetMapId(), pred));\n+                    NodeLinkList vlinks = curNode->GetShortestPathLinks(bossWP, links, BotWPLevel::BOTWP_LEVEL_ONE);\n+                    if (!vlinks.empty())\n+                        return vlinks.size() == 1u ? vlinks.front().wp : Bcore::Containers::SelectRandomWeightedContainerElement(vlinks, LinkWeightExtractor())->wp;\n+                }\n+            }\n+            // 3) check captain room to defend\n+            for (auto const& p : { std::pair{TEAM_ALLIANCE, CRETYPE_CAPTAIN_A}, std::pair{TEAM_HORDE, CRETYPE_CAPTAIN_H} })\n+            {\n+                if (myTeamId != p.first)\n+                    continue;\n+                Creature const* captain = ASSERT_NOTNULL(av->GetBGCreature(p.second));\n+                if (captain->IsAlive() && captain->IsInCombat())\n+                {\n+                    WanderNode const* cap_node = nullptr;\n+                    float mindist = 50000.0f;\n+                    WanderNode::DoForAllAreaWPs(captain->GetAreaId(), [&cap_node, &mindist, fac = me->GetFaction(), pos = captain](WanderNode const* wp) {\n+                        float dist = pos->GetExactDist2d(wp);\n+                        if (dist < mindist && bot_ai::IsWanderNodeAvailableForBotFaction(wp, fac, false))\n+                        {\n+                            mindist = dist;\n+                            cap_node = wp;\n+                        }\n+                    });\n+                    if (cap_node && curNode->HasLink(cap_node))\n+                        return cap_node;\n+                }\n+            }\n+            // 4) find next defend point\n+            // 5) find a mine nearby and try to capture\n+            // 6) find a currently assaulted point by our team and make sure someone defends it\n+            // Ex. some GYs to base on are beyound directly accessible tower/bunker or captain room\n+            // 7) find a GY/tower/bunker in non-assaulted state to assault\n+            for (TeamId teamId : { TEAM_ALLIANCE, TEAM_HORDE })\n+            {\n+                if (myTeamId != teamId)\n+                    continue;\n+\n+                constexpr std::array<uint8, BG_AV_NODES_MAX> defend_priority_a{ 9, 7, 6, 3, 4, 2, 1, 8, 8, 5, 5, 0, 0, 0, 0 };\n+                constexpr std::array<uint8, BG_AV_NODES_MAX> defend_priority_h{ 1, 2, 4, 3, 6, 7, 9, 0, 0, 0, 0, 5, 5, 8, 8 };\n+                const std::array<uint8, BG_AV_NODES_MAX> req_attackers_count{ uint8(team_members.size() / 2u), 4, 4, 4, 4, 4, uint8(team_members.size() / 2u), 4, 4, 4, 4, 4, 4, 4, 4 };\n+                const std::array<uint8, BG_AV_NODES_MAX> req_defenders_count{ uint8(team_members.size() / 2u), 4, 4, 4, 4, 4, uint8(team_members.size() / 2u), 0, 0, 0, 0, 0, 0, 0, 0 };\n+\n+                static const std::function flag_wp_pred = [](WanderNode const* wp) { return wp->HasFlag(BotWPFlags::BOTWP_FLAG_BG_FLAG_PICKUP_TARGET); };\n+                static const std::function flag_or_bunker_wp_pred = [](WanderNode const* wp) { return wp->HasFlag(BotWPFlags::BOTWP_FLAG_ALLIANCE_FLAG_PICKUP_TARGET); };\n+                static const std::function flag_or_tower_wp_pred = [](WanderNode const* wp) { return wp->HasFlag(BotWPFlags::BOTWP_FLAG_HORDE_FLAG_PICKUP_TARGET); };\n+                static const std::function mine_pred = [](WanderNode const* wp) { return wp->HasFlag(BotWPFlags::BOTWP_FLAG_BG_MISC_OBJECTIVE_1); };\n+                static const std::function captain_pred_a = [](WanderNode const* wp) { return wp->HasAllFlags(BotWPFlags::BOTWP_FLAG_ALLIANCE_DEMIBOSS_ROOM); };\n+                static const std::function captain_pred_h = [](WanderNode const* wp) { return wp->HasAllFlags(BotWPFlags::BOTWP_FLAG_HORDE_DEMIBOSS_ROOM); };\n+\n+                auto const& def_prio = teamId == TEAM_ALLIANCE ? defend_priority_a : defend_priority_h;\n+                auto const& defe_pred = teamId == TEAM_ALLIANCE ? flag_or_bunker_wp_pred : flag_or_tower_wp_pred;\n+                auto const& assa_pred = teamId == TEAM_ALLIANCE ? flag_or_tower_wp_pred : flag_or_bunker_wp_pred;\n+                auto const& assacap_pred = teamId == TEAM_ALLIANCE ? captain_pred_h : captain_pred_a;\n+\n+                std::pair<uint8, WanderNode const*> defNode{};\n+                NodeList assdlist;\n+                NodeList assalist;\n+                std::set<std::pair<uint8, BG_AV_NodeInfo const*>> defendable_nodes;\n+                std::set<std::pair<uint8, BG_AV_NodeInfo const*>> assaulted_nodes;\n+                std::set<std::pair<uint8, BG_AV_NodeInfo const*>> assaultable_nodes;\n+                for (BG_AV_Nodes counter = BG_AV_NODES_FIRSTAID_STATION; counter < BG_AV_NODES_MAX; ++counter)\n+                {\n+                    BG_AV_NodeInfo const& c = av->GetNodes()[counter];\n+                    if (c.State == BG_AV_States::POINT_ASSAULTED)\n+                    {\n+                        if (c.Owner != myTeam && def_prio[counter] > 0)\n+                            defendable_nodes.emplace(uint8(counter), &c);\n+                        else if (c.Owner == myTeam)\n+                            assaulted_nodes.emplace(uint8(counter), &c);\n+                    }\n+                    else if (c.State == BG_AV_States::POINT_NEUTRAL || (c.State == BG_AV_States::POINT_CONTROLED && c.Owner != myTeam))\n+                        assaultable_nodes.emplace(uint8(counter), &c);\n+                    else if (counter == (teamId == TEAM_ALLIANCE ? BG_AV_NODES_FROSTWOLF_HUT : BG_AV_NODES_FIRSTAID_STATION))\n+                        assaultable_nodes.emplace(uint8(counter), &c);\n+                }\n+                WanderNode::DoForAllMapWPs(av->GetMapId(), [&](WanderNode const* wp) {\n+                    if (defe_pred(wp))\n+                    {\n+                        for (auto const& vt : defendable_nodes)\n+                            if ((!defNode.second || def_prio[vt.first] > def_prio[defNode.first]) && BG_AV_ObjectPos[vt.first].GetExactDist2d(wp) < INTERACTION_DISTANCE * 2.0f)\n+                                defNode = { vt.first, wp };\n+                    }\n+                });\n+                if (WanderNode const* dnode = defNode.second)\n+                {\n+                    NodeLinkList defLinks = curNode->GetShortestPathLinks(dnode, links);\n+                    if (!defLinks.empty())\n+                        return defLinks.size() == 1u ? defLinks.front().wp : Bcore::Containers::SelectRandomWeightedContainerElement(defLinks, LinkWeightExtractor())->wp;\n+                }\n+                for (uint8 mine_idx : { AV_NORTH_MINE, AV_SOUTH_MINE })\n+                {\n+                    if (av->GetMineOwner(mine_idx) == myTeam)\n+                        continue;\n+                    uint32 cre_type = (mine_idx == AV_NORTH_MINE) ? AV_CPLACE_MINE_N_3 : AV_CPLACE_MINE_S_3;\n+                    WanderNode const* mineWP = nullptr;\n+                    WanderNode::DoForAllMapWPs(me->GetMapId(), [=, &mineWP, mindist = 50000.f](WanderNode const* mwp) mutable {\n+                        if (!mine_pred(mwp))\n+                            return;\n+                        float dist2d = mwp->GetExactDist2d(BG_AV_CreaturePos[cre_type]);\n+                        if (!mineWP || dist2d < mindist)\n+                        {\n+                            mindist = dist2d;\n+                            mineWP = mwp;\n+                        }\n+                    });\n+                    if (!mineWP)\n+                        continue;\n+                    WanderNode const* mineWPNext = mineWP->GetLinks().front().wp;\n+                    if (curNode->HasLink(mineWP) || curNode->HasLink(mineWPNext) || me->IsWithinDist2d(mineWP, SIZE_OF_GRIDS * 0.45f))\n+                    {\n+                        uint32 attackers_count = 0;\n+                        for (Unit const* member : team_members)\n+                        {\n+                            WanderNode const* mn = member->IsNPCBot() ? member->ToCreature()->GetBotAI()->_travel_node_cur : nullptr;\n+                            if (member != me && member->IsAlive() && (member->GetExactDist2d(mineWP) < me->GetExactDist2d(mineWP) || (mn && (mn == mineWP || mn == mineWPNext))))\n+                                ++attackers_count;\n+                        }\n+                        if (attackers_count < 2)\n+                        {\n+                            NodeLinkList mlinks = curNode->GetShortestPathLinks(mineWP, links);\n+                            if (!mlinks.empty())\n+                            {\n+                                BOT_LOG_DEBUG(\"npcbots\", \"Bot {} {} team {} goes for AV mine {}! Cur node: {} {}\",\n+                                    me->GetName(), me->GetEntry(), uint32(myTeamId), uint32(mine_idx), curNode->GetWPId(), curNode->GetName());\n+                                return mlinks.size() == 1u ? mlinks.front().wp : Bcore::Containers::SelectRandomWeightedContainerElement(mlinks, LinkWeightExtractor())->wp;\n+                            }\n+                        }\n+                    }\n+                }\n+                WanderNode const* enemy_captain_wp = ASSERT_NOTNULL(WanderNode::FindInMapWPs(me->GetMapId(), assacap_pred));\n+                if (curNode->HasLink(enemy_captain_wp))\n+                {\n+                    Creature const* captain = av->GetBGCreature(teamId == TEAM_ALLIANCE ? CRETYPE_CAPTAIN_H : CRETYPE_CAPTAIN_A);\n+                    if (captain && captain->IsAlive())\n+                    {\n+                        bool team_ready = captain->IsInCombat();\n+                        if (!team_ready)\n+                        {\n+                            uint32 attackers_count = 0;\n+                            for (Unit const* member : team_members)\n+                            {\n+                                WanderNode const* mn = member->IsNPCBot() ? member->ToCreature()->GetBotAI()->_travel_node_cur : nullptr;\n+                                if (member != me && member->IsAlive() && (member->GetExactDist2d(captain) < 40.0f || mn == enemy_captain_wp || mn == curNode))\n+                                    ++attackers_count;\n+                            }\n+                            team_ready = attackers_count >= team_members.size() / 4u;\n+                        }\n+                        return team_ready ? enemy_captain_wp : curNode;\n+                    }\n+                }\n+                WanderNode::DoForAllMapWPs(me->GetMapId(), [&](WanderNode const* wp) {\n+                    if (flag_wp_pred(wp))\n+                    {\n+                        for (auto const& vt : assaulted_nodes)\n+                        {\n+                            if (BG_AV_ObjectPos[vt.first].GetExactDist2d(wp) < INTERACTION_DISTANCE * 2.0f)\n+                            {\n+                                uint32 defenders_count = 0;\n+                                for (Unit const* member : team_members)\n+                                {\n+                                    WanderNode const* mn = member->IsNPCBot() ? member->ToCreature()->GetBotAI()->_travel_node_cur : nullptr;\n+                                    if (member != me && member->IsAlive() && (member->GetExactDist2d(wp) < 60.0f || (mn && (mn == wp || mn->HasLink(wp)))))\n+                                        ++defenders_count;\n+                                }\n+                                if (defenders_count < req_defenders_count[vt.first])\n+                                    assdlist.push_back(wp);\n+                            }\n+                        }\n+                        if (assa_pred(wp))\n+                        {\n+                            for (auto const& vt : assaultable_nodes)\n+                            {\n+                                if (BG_AV_ObjectPos[vt.first].GetExactDist2d(wp) < INTERACTION_DISTANCE * 2.0f)\n+                                {\n+                                    uint32 attackers_count = 0;\n+                                    for (Unit const* member : team_members)\n+                                    {\n+                                        WanderNode const* mn = member->IsNPCBot() ? member->ToCreature()->GetBotAI()->_travel_node_cur : nullptr;\n+                                        if (member != me && member->IsAlive() && (member->GetExactDist2d(wp) < 60.0f || (mn && (mn == wp || mn->HasLink(wp)))))\n+                                            ++attackers_count;\n+                                    }\n+                                    if (attackers_count < req_attackers_count[vt.first])\n+                                        assalist.push_back(wp);\n+                                }\n+                            }\n+                        }\n+                    }\n+                });\n+                if (!assdlist.empty())\n+                {\n+                    if (std::ranges::find(assdlist, curNode) != assdlist.cend())\n+                        return curNode;\n+                    //remove non-empty points\n+                    std::erase_if(assdlist, [&team_members, except_wp = curNode](WanderNode const* wp) {\n+                        if (wp != except_wp)\n+                            for (Unit const* member : team_members)\n+                                if (member->IsAlive() && (member->GetExactDist2d(wp) < 40.0f || (member->IsNPCBot() && member->ToCreature()->GetBotAI()->_travel_node_cur == wp)))\n+                                    return true;\n+                        return false;\n+                    });\n+                }\n+                NodeList const* myList = !assdlist.empty() ? &assdlist : &assalist;\n+                if (!myList->empty())\n+                {\n+                    WanderNode const* closestAWP = nullptr;\n+                    WanderNode::DoForContainerWPs(*myList, [=, &closestAWP, mindist = 50000.f](WanderNode const* mwp) mutable {\n+                        float dist2d = curNode->GetExactDist2d(mwp);\n+                        if (!closestAWP || dist2d < mindist)\n+                        {\n+                            mindist = dist2d;\n+                            closestAWP = mwp;\n+                        }\n+                    });\n+                    NodeLinkList alinks = curNode->GetShortestPathLinks(closestAWP, links);\n+                    if (!alinks.empty())\n+                        return alinks.size() == 1u ? alinks.front().wp : Bcore::Containers::SelectRandomWeightedContainerElement(alinks, LinkWeightExtractor())->wp;\n+                }\n+            }\n+            //No immediate target: find a point next to enemy boss and try going there\n+            for (TeamId teamId : { TEAM_ALLIANCE, TEAM_HORDE })\n+            {\n+                if (myTeamId != teamId)\n+                    continue;\n+                Creature const* boss = av->GetBGCreature(teamId == TEAM_ALLIANCE ? CRETYPE_BOSS_H : CRETYPE_BOSS_A);\n+                WanderNode const* bossWP = ASSERT_NOTNULL(WanderNode::FindInMapWPs(boss->GetMapId(), teamId == TEAM_ALLIANCE ? boss_room_wp_pred_h : boss_room_wp_pred_a));\n+                NodeLinkList vlinks = curNode->GetShortestPathLinks(bossWP->GetLinks().front().wp, links, BotWPLevel::BOTWP_LEVEL_ONE);\n+                if (!vlinks.empty())\n+                    return vlinks.size() == 1u ? vlinks.front().wp : Bcore::Containers::SelectRandomWeightedContainerElement(vlinks, LinkWeightExtractor())->wp;\n+            }\n+\n+            break;\n+        }\n+        case BATTLEGROUND_WS:\n+        {\n+            BattlegroundWS* ws = dynamic_cast<BattlegroundWS*>(bg);\n+\n+            //1) carrier - get next point towards drop point\n+            for (TeamId teamId : { TEAM_ALLIANCE, TEAM_HORDE })\n+            {\n+                if (myTeamId != teamId)\n+                    continue;\n+\n+                if (ws->GetFlagPickerGUID(bg->GetOtherTeamId(teamId)) == me->GetGUID())\n+                {\n+                    WanderNode const* dropPoint = WanderNode::FindInMapWPs(bg->GetMapId(), [=](WanderNode const* dwp) {\n+                        return dwp->HasAllFlags(teamId == TEAM_ALLIANCE ? BotWPFlags::BOTWP_FLAG_ALLIANCE_FLAG_DELIVER_TARGET : BotWPFlags::BOTWP_FLAG_HORDE_FLAG_DELIVER_TARGET);\n+                    });\n+                    if (dropPoint)\n+                    {\n+                        NodeLinkList dlinks = curNode->GetShortestPathLinks(dropPoint, links);\n+                        if (!dlinks.empty())\n+                            return dlinks.size() == 1u ? dlinks.front().wp : Bcore::Containers::SelectRandomWeightedContainerElement(dlinks, LinkWeightExtractor())->wp;\n+                    }\n+                }\n+            }\n+            //2) next to enemy base flag - go for it if can pick, mill otherwise\n+            for (TeamId teamId : { TEAM_ALLIANCE, TEAM_HORDE })\n+            {\n+                if (myTeamId != teamId)\n+                    continue;\n+\n+                NodeLinkList::const_iterator lit = std::ranges::find_if(links, [=](WanderNodeLink const& wpl) {\n+                    return wpl.wp->HasAllFlags(teamId == TEAM_ALLIANCE ? BotWPFlags::BOTWP_FLAG_HORDE_FLAG_PICKUP_TARGET : BotWPFlags::BOTWP_FLAG_ALLIANCE_FLAG_PICKUP_TARGET);\n+                });\n+                if (lit != links.cend())\n+                {\n+                    if (ws->GetFlagState(bg->GetOtherTeam(myTeam)) == BG_WS_FLAG_STATE_ON_BASE)\n+                        return lit->wp;\n+                    else if (links.size() == 1)\n+                        return curNode; //mill\n+                    else\n+                        links.erase(lit); //prevent going to flag point unless the flag is present\n+                }\n+            }\n+            //3) have a link with a power-up\n+            if (GetHealthPCT(me) < 60)\n+            {\n+                NodeLinkList::const_iterator lit = std::ranges::find_if(links, [=](WanderNodeLink const& wpl) {\n+                    return wpl.wp->HasFlag(BotWPFlags::BOTWP_FLAG_WS_PICKUP_RESTORATION);\n+                });\n+                if (lit != links.cend())\n+                {\n+                    GameObject const* buff = ws->GetBGObject(lit->wp->HasFlag(BotWPFlags::BOTWP_FLAG_BG_OPTIONAL_PICKUP_1) ? BG_WS_OBJECT_REGENBUFF_1 : BG_WS_OBJECT_REGENBUFF_2);\n+                    if (buff && buff->GetGoState() == GO_STATE_READY && buff->isSpawned())\n+                    {\n+                        bool has_picker = false;\n+                        for (Unit const* member : team_members)\n+                        {\n+                            if (member != me && member->IsAlive() && member->IsNPCBot() && member->ToCreature()->GetBotAI()->_travel_node_cur == lit->wp)\n+                            {\n+                                has_picker = true;\n+                                break;\n+                            }\n+                        }\n+                        if (!has_picker)\n+                        {\n+                            //BOT_LOG_DEBUG(\"npcbots\", \"Bot {} {} team {} goes for a REGEN buff! Cur node: {} {}\",\n+                            //    me->GetName(), me->GetEntry(), uint32(myTeamId), curNode->GetWPId(), curNode->GetName());\n+                            return lit->wp;\n+                        }\n+                    }\n+                }\n+            }\n+            if (!me->HasAuraTypeWithValue(SPELL_AURA_MOD_SCALE, 30) && ws->GetFlagPickerGUID(bg->GetOtherTeamId(myTeamId)) != me->GetGUID())\n+            {\n+                NodeLinkList::const_iterator lit = std::ranges::find_if(links, [=](WanderNodeLink const& wpl) {\n+                    return wpl.wp->HasFlag(BotWPFlags::BOTWP_FLAG_WS_PICKUP_BERSERKING);\n+                });\n+                if (lit != links.cend())\n+                {\n+                    GameObject const* buff = ws->GetBGObject(lit->wp->HasFlag(BotWPFlags::BOTWP_FLAG_BG_OPTIONAL_PICKUP_2) ? BG_WS_OBJECT_BERSERKBUFF_1 : BG_WS_OBJECT_BERSERKBUFF_2);\n+                    if (buff && buff->GetGoState() == GO_STATE_READY && buff->isSpawned())\n+                    {\n+                        bool has_picker = false;\n+                        for (Unit const* member : team_members)\n+                        {\n+                            if (member != me && member->IsAlive() && member->IsNPCBot() && member->ToCreature()->GetBotAI()->_travel_node_cur == lit->wp)\n+                            {\n+                                has_picker = true;\n+                                break;\n+                            }\n+                        }\n+                        if (!has_picker)\n+                        {\n+                            //BOT_LOG_DEBUG(\"npcbots\", \"Bot {} {} team {} goes for a BERSERKING buff! Cur node: {} {}\",\n+                            //    me->GetName(), me->GetEntry(), uint32(myTeamId), curNode->GetWPId(), curNode->GetName());\n+                            return lit->wp;\n+                        }\n+                    }\n+                }\n+            }\n+            //4) 70% attack, rest defend or go for enemy flag carrier, at least 1 defends base flag\n+            for (TeamId teamId : { TEAM_ALLIANCE, TEAM_HORDE })\n+            {\n+                if (myTeamId != teamId)\n+                    continue;\n+\n+                uint8 my_team_size = static_cast<uint8>(team_members.size());\n+                WanderNode const* attackNode = nullptr;\n+                WanderNode const* defendNode = nullptr;\n+                WanderNode::DoForAllMapWPs(bg->GetMapId(), [=, &attackNode, &defendNode](WanderNode const* mwp) {\n+                    if (mwp->HasFlag(BotWPFlags::BOTWP_FLAG_BG_FLAG_PICKUP_TARGET))\n+                    {\n+                        if ((mwp->HasAllFlags(BotWPFlags::BOTWP_FLAG_HORDE_FLAG_PICKUP_TARGET) && teamId == TEAM_ALLIANCE) ||\n+                            (mwp->HasAllFlags(BotWPFlags::BOTWP_FLAG_ALLIANCE_FLAG_PICKUP_TARGET) && teamId == TEAM_HORDE))\n+                            attackNode = mwp;\n+                        else if ((mwp->HasAllFlags(BotWPFlags::BOTWP_FLAG_ALLIANCE_FLAG_PICKUP_TARGET) && teamId == TEAM_ALLIANCE) ||\n+                            (mwp->HasAllFlags(BotWPFlags::BOTWP_FLAG_HORDE_FLAG_PICKUP_TARGET) && teamId == TEAM_HORDE))\n+                            defendNode = mwp;\n+                    }\n+                });\n+\n+                uint8 max_attackers = std::max<uint8>(my_team_size * 7 / 10, my_team_size / 2 + 2);\n+                uint8 max_defenders = my_team_size - max_attackers;\n+\n+                //attack?\n+                if (attackNode)\n+                {\n+                    std::set<Unit const*> attackers;\n+                    for (Unit const* m : team_members)\n+                    {\n+                        if (m != me && m->IsNPCBot())\n+                        {\n+                            WanderNode const* mCurNode = m->ToCreature()->GetBotAI()->_travel_node_cur;\n+                            if (mCurNode && (mCurNode == attackNode || mCurNode->HasLink(attackNode)))\n+                                attackers.insert(m);\n+                        }\n+                    }\n+                    if (attackers.size() < max_attackers)\n+                    {\n+                        float myDist = me->GetExactDist2d(attackNode);\n+                        for (Unit const* m : team_members)\n+                        {\n+                            if (m != me && (m->GetExactDist2d(attackNode) < myDist || m->HasAuraTypeWithValue(SPELL_AURA_MOD_SCALE, 30)) && !attackers.contains(m))\n+                                attackers.insert(m);\n+                        }\n+                    }\n+                    if (attackers.size() < max_attackers || !!ws->GetFlagPickerGUID(teamId) || me->HasAuraTypeWithValue(SPELL_AURA_MOD_SCALE, 30))\n+                    {\n+                        NodeLinkList alinks = curNode->GetShortestPathLinks(attackNode, links, BotWPLevel::BOTWP_LEVEL_ONE);\n+                        if (!alinks.empty())\n+                        {\n+                            //BOT_LOG_DEBUG(\"npcbots\", \"Bot {} {} team {} goes to ATTACK (attackers: {})! Cur node: {} {}\",\n+                            //    me->GetName(), me->GetEntry(), uint32(myTeamId), uint32(attackers.size()), curNode->GetWPId(), curNode->GetName());\n+                            return alinks.size() == 1u ? alinks.front().wp : Bcore::Containers::SelectRandomWeightedContainerElement(alinks, LinkWeightExtractor())->wp;\n+                        }\n+                    }\n+                }\n+\n+                //defend?\n+                if (defendNode && !ws->GetFlagPickerGUID(teamId) && !me->HasAuraTypeWithValue(SPELL_AURA_MOD_SCALE, 30))\n+                {\n+                    std::set<Unit const*> defenders;\n+                    for (Unit const* m : team_members)\n+                    {\n+                        if (m != me && m->IsNPCBot())\n+                        {\n+                            WanderNode const* mCurNode = m->ToCreature()->GetBotAI()->_travel_node_cur;\n+                            if (mCurNode && (mCurNode == defendNode || mCurNode->HasLink(defendNode)))\n+                                defenders.insert(m);\n+                        }\n+                    }\n+                    if (defenders.size() < max_defenders)\n+                    {\n+                        float myDist = me->GetExactDist2d(defendNode);\n+                        for (Unit const* m : team_members)\n+                        {\n+                            if (m != me && m->GetExactDist2d(defendNode) < myDist && !defenders.contains(m))\n+                                defenders.insert(m);\n+                        }\n+                    }\n+                    if (defenders.size() < max_defenders)\n+                    {\n+                        NodeLinkList dlinks = curNode->GetShortestPathLinks(defendNode, links);\n+                        if (!dlinks.empty())\n+                        {\n+                            //BOT_LOG_DEBUG(\"npcbots\", \"Bot {} {} team {} goes to DEFEND (defenders: {})! Cur node: {} {}\",\n+                            //    me->GetName(), me->GetEntry(), uint32(myTeamId), uint32(defenders.size()), curNode->GetWPId(), curNode->GetName());\n+                            return dlinks.size() == 1u ? dlinks.front().wp : Bcore::Containers::SelectRandomWeightedContainerElement(dlinks, LinkWeightExtractor())->wp;\n+                        }\n+                    }\n+                }\n+            }\n+\n+            break;\n+        }\n+        case BATTLEGROUND_AB:\n+        {\n+            BattlegroundAB* ab = dynamic_cast<BattlegroundAB*>(bg);\n+\n+            //1) have buff linked - try going there (buff spawned, noone goes there, need that buff (scratch that, get anyway, let respawn))\n+            for (TeamId teamId : { TEAM_ALLIANCE, TEAM_HORDE })\n+            {\n+                if (myTeamId != teamId)\n+                    continue;\n+\n+                NodeLinkList::const_iterator lit = std::ranges::find_if(links, [=](WanderNodeLink const& wpl) {\n+                    return wpl.wp->HasFlag(BotWPFlags::BOTWP_FLAG_OPTIONAL_PICKUP);\n+                });\n+                if (lit != links.cend())\n+                {\n+                    uint32 object_type;\n+                    switch (lit->wp->GetFlags() & AsUnderlyingType(BotWPFlags::BOTWP_FLAG_OPTIONAL_PICKUP))\n+                    {\n+                        case AsUnderlyingType(BotWPFlags::BOTWP_FLAG_BG_OPTIONAL_PICKUP_1): object_type = BG_AB_OBJECT_SPEEDBUFF_STABLES;     break;\n+                        case AsUnderlyingType(BotWPFlags::BOTWP_FLAG_BG_OPTIONAL_PICKUP_2): object_type = BG_AB_OBJECT_SPEEDBUFF_FARM;        break;\n+                        case AsUnderlyingType(BotWPFlags::BOTWP_FLAG_BG_OPTIONAL_PICKUP_3): object_type = BG_AB_OBJECT_SPEEDBUFF_LUMBER_MILL; break;\n+                        case AsUnderlyingType(BotWPFlags::BOTWP_FLAG_BG_OPTIONAL_PICKUP_4): object_type = BG_AB_OBJECT_SPEEDBUFF_GOLD_MINE;   break;\n+                        case AsUnderlyingType(BotWPFlags::BOTWP_FLAG_BG_OPTIONAL_PICKUP_5): object_type = BG_AB_OBJECT_SPEEDBUFF_BLACKSMITH;  break;\n+                        default:                                                            object_type = 0;                                  break;\n+                    }\n+                    if (object_type)\n+                    {\n+                        for (auto i : NPCBots::index_array<uint8, 3>)\n+                        {\n+                            GameObject const* go = ab->GetBGObject(object_type + i);\n+                            if (go && go->IsInWorld() && go->isSpawned() && go->GetGoState() == GO_STATE_READY)\n+                            {\n+                                bool has_picker = false;\n+                                for (Unit const* member : team_members)\n+                                {\n+                                    if (member != me && member->IsAlive() && member->IsNPCBot() && member->ToCreature()->GetBotAI()->_travel_node_cur == lit->wp)\n+                                    {\n+                                        has_picker = true;\n+                                        break;\n+                                    }\n+                                }\n+                                if (!has_picker)\n+                                {\n+                                    //BOT_LOG_DEBUG(\"npcbots\", \"Bot {} {} team {} goes for AB buff at {}! Cur node: {} {}\",\n+                                    //    me->GetName(), me->GetEntry(), uint32(myTeamId), lit->wp->GetName(), curNode->GetWPId(), curNode->GetName());\n+                                    return lit->wp;\n+                                }\n+                                break;\n+                            }\n+                        }\n+                    }\n+                    links.erase(lit);\n+                }\n+            }\n+            //2) all bases occupied or assaulted - lock enemy team on their base\n+            for (TeamId teamId : { TEAM_ALLIANCE, TEAM_HORDE })\n+            {\n+                if (myTeamId != teamId)\n+                    continue;\n+\n+                bool all_nodes_assaulted = std::ranges::all_of(NPCBots::index_array<uint8, 5>, [=](uint8 n) { return ab->IsNodeOccupied(n, teamId) || ab->IsNodeContested(n, teamId); });\n+                if (all_nodes_assaulted)\n+                {\n+                    WanderNode const* enemy_base = WanderNode::FindInMapWPs(me->GetMapId(), [=](WanderNode const* mwp) {\n+                        return (mwp->HasAllFlags(teamId == TEAM_ALLIANCE ? BotWPFlags::BOTWP_FLAG_HORDE_SPAWN_POINT : BotWPFlags::BOTWP_FLAG_ALLIANCE_SPAWN_POINT));\n+                    });\n+                    if (enemy_base)\n+                    {\n+                        NodeLinkList elinks = curNode->GetShortestPathLinks(enemy_base, links);\n+                        if (!elinks.empty())\n+                        {\n+                            //BOT_LOG_DEBUG(\"npcbots\", \"Bot {} {} team {} goes for AB PIN at {}! Cur node: {} {}\",\n+                            //    me->GetName(), me->GetEntry(), uint32(myTeamId), enemy_base->GetName(), curNode->GetWPId(), curNode->GetName());\n+                            return elinks.size() == 1u ? elinks.front().wp : Bcore::Containers::SelectRandomWeightedContainerElement(elinks, LinkWeightExtractor())->wp;\n+                        }\n+\n+                    }\n+                }\n+            }\n+            //3) closest (linked) base is not captured / not assaulted - go there, otherwise find all not captured / not assaulted bases and select farthest (max 2 per base)\n+            for (TeamId teamId : { TEAM_ALLIANCE, TEAM_HORDE })\n+            {\n+                if (myTeamId != teamId)\n+                    continue;\n+\n+                std::list<uint8> attackable_points;\n+                uint8 node = BG_AB_NODE_STABLES;\n+                do\n+                {\n+                    if (!ab->IsNodeOccupied(node, teamId) && !ab->IsNodeContested(node, teamId))\n+                        attackable_points.push_back(node);\n+                    ++node;\n+                } while (node < BG_AB_DYNAMIC_NODES_COUNT);\n+\n+                NodeList bgFlags;\n+                WanderNode::DoForAllMapWPs(me->GetMapId(), [&bgFlags, &attackable_points](WanderNode const* mwp) {\n+                    if (mwp->HasFlag(BotWPFlags::BOTWP_FLAG_BG_FLAG_PICKUP_TARGET) &&\n+                        std::ranges::any_of(attackable_points, [=](uint8 n) { return mwp->GetExactDist2d(BG_AB_NodePositions[n]) < 10.0f; }))\n+                        bgFlags.push_back(mwp);\n+                });\n+                NodeList attackableFlags;\n+                WanderNode::DoForContainerWPs(bgFlags, [this, &attackableFlags, &team_members](WanderNode const* mwp) {\n+                    uint8 advancing_members = 0;\n+                    for (Unit const* m : team_members)\n+                    {\n+                        if (m == me)\n+                            continue;\n+                        if (m->GetCurrentSpell(CURRENT_GENERIC_SPELL) && m->GetCurrentSpell(CURRENT_GENERIC_SPELL)->m_spellInfo->Id == OPEN_FLAG_BG && m->GetExactDist2d(mwp) < 10.0f)\n+                            ++advancing_members;\n+                        else if (m->IsNPCBot() && m->ToCreature()->GetBotAI()->_travel_node_cur == mwp)\n+                            ++advancing_members;\n+                        else if (m->GetExactDist2d(mwp) < 60.0f && m->GetExactDist2d(mwp) < me->GetExactDist2d(mwp))\n+                            ++advancing_members;\n+                        if (advancing_members >= 3)\n+                            break;\n+                    }\n+                    if (advancing_members < 3)\n+                        attackableFlags.push_back(mwp);\n+                });\n+                if (attackableFlags.empty())\n+                {\n+                    float maxdist = 0.0f;\n+                    WanderNode const* farthestAttackableFlag = nullptr;\n+                    for (WanderNode const* bgFlag : bgFlags)\n+                    {\n+                        float dist2d = me->GetExactDist2d(bgFlag);\n+                        if (dist2d > maxdist)\n+                        {\n+                            maxdist = dist2d;\n+                            farthestAttackableFlag = bgFlag;\n+                        }\n+                    }\n+                    if (farthestAttackableFlag)\n+                        attackableFlags.push_back(farthestAttackableFlag);\n+                }\n+                NodeLinkList olinks;\n+                for (WanderNodeLink const& wpl : links)\n+                    if (std::ranges::any_of(attackableFlags, [&wpl](WanderNode const* wp) { return wpl.wp == wp; }))\n+                        olinks.push_back(wpl);\n+                if (!olinks.empty())\n+                {\n+                    //BOT_LOG_DEBUG(\"npcbots\", \"Bot {} {} team {} goes for AB DIRECT ASSAULT! Cur node: {} {}\",\n+                    //    me->GetName(), me->GetEntry(), uint32(myTeamId), curNode->GetWPId(), curNode->GetName());\n+                    return olinks.size() == 1u ? olinks.front().wp : Bcore::Containers::SelectRandomWeightedContainerElement(olinks, LinkWeightExtractor())->wp;\n+                }\n+\n+                std::list<WanderNodeLink> dlinks;\n+                for (WanderNode const* fwp : attackableFlags)\n+                    dlinks.splice(dlinks.end(), curNode->GetShortestPathLinks(fwp, links, BotWPLevel::BOTWP_LEVEL_ONE));\n+                if (!dlinks.empty())\n+                {\n+                    //BOT_LOG_DEBUG(\"npcbots\", \"Bot {} {} team {} goes for AB ASSAULT! Cur node: {} {}\",\n+                    //    me->GetName(), me->GetEntry(), uint32(myTeamId), curNode->GetWPId(), curNode->GetName());\n+                    return dlinks.size() == 1u ? dlinks.begin()->wp : Bcore::Containers::SelectRandomWeightedContainerElement(dlinks, LinkWeightExtractor())->wp;\n+                }\n+            }\n+\n+            break;\n+        }\n+        case BATTLEGROUND_EY:\n+        {\n+            BattlegroundEY* ey = dynamic_cast<BattlegroundEY*>(bg);\n+\n+            //1) at the point near buff - grab the buff unconditionally\n+            for (TeamId teamId : { TEAM_ALLIANCE, TEAM_HORDE })\n+            {\n+                if (myTeamId != teamId)\n+                    continue;\n+\n+                NodeLinkList::const_iterator lit = std::ranges::find_if(links, [=](WanderNodeLink const& wpl) {\n+                    return wpl.wp->HasFlag(BotWPFlags::BOTWP_FLAG_OPTIONAL_PICKUP);\n+                });\n+                if (lit != links.cend())\n+                {\n+                    uint32 object_type;\n+                    switch (lit->wp->GetFlags() & AsUnderlyingType(BotWPFlags::BOTWP_FLAG_OPTIONAL_PICKUP))\n+                    {\n+                        case AsUnderlyingType(BotWPFlags::BOTWP_FLAG_BG_OPTIONAL_PICKUP_1): object_type = BG_EY_OBJECT_SPEEDBUFF_MAGE_TOWER;    break;\n+                        case AsUnderlyingType(BotWPFlags::BOTWP_FLAG_BG_OPTIONAL_PICKUP_2): object_type = BG_EY_OBJECT_SPEEDBUFF_DRAENEI_RUINS; break;\n+                        case AsUnderlyingType(BotWPFlags::BOTWP_FLAG_BG_OPTIONAL_PICKUP_3): object_type = BG_EY_OBJECT_SPEEDBUFF_FEL_REAVER;    break;\n+                        case AsUnderlyingType(BotWPFlags::BOTWP_FLAG_BG_OPTIONAL_PICKUP_4): object_type = BG_EY_OBJECT_SPEEDBUFF_BLOOD_ELF;     break;\n+                        default:                                                            object_type = 0;                                    break;\n+                    }\n+                    if (object_type)\n+                    {\n+                        for (auto i : NPCBots::index_array<uint8, 3>)\n+                        {\n+                            GameObject const* go = ey->GetBGObject(object_type + i);\n+                            if (go && go->IsInWorld() && go->isSpawned() && go->GetGoState() == GO_STATE_READY)\n+                            {\n+                                bool has_picker = false;\n+                                for (Unit const* member : team_members)\n+                                {\n+                                    if (member != me && member->IsAlive() && member->IsNPCBot() && member->ToCreature()->GetBotAI()->_travel_node_cur == lit->wp)\n+                                    {\n+                                        has_picker = true;\n+                                        break;\n+                                    }\n+                                }\n+                                if (!has_picker)\n+                                {\n+                                    //BOT_LOG_DEBUG(\"npcbots\", \"Bot {} {} team {} goes for EY BUFF at {}! Cur node: {} {}\",\n+                                    //    me->GetName(), me->GetEntry(), uint32(myTeamId), lit->wp->GetName(), curNode->GetWPId(), curNode->GetName());\n+                                    return lit->wp;\n+                                }\n+                                break;\n+                            }\n+                        }\n+                    }\n+                    links.erase(lit);\n+                }\n+            }\n+            //2) would be carrier - set to current point for the next move\n+            for (TeamId teamId : { TEAM_ALLIANCE, TEAM_HORDE })\n+            {\n+                if (myTeamId != teamId)\n+                    continue;\n+\n+                if (curNode->HasFlag(BotWPFlags::BOTWP_FLAG_BG_FLAG_PICKUP_TARGET))\n+                {\n+                    if (Spell const* curSpell = me->GetCurrentSpell(CURRENT_GENERIC_SPELL))\n+                    {\n+                        if (curSpell->GetSpellInfo()->Id == OPEN_FLAG_BG)\n+                        {\n+                            //BOT_LOG_DEBUG(\"npcbots\", \"Bot {} {} team {} is AT FLAG POINT and goes for same EY point {}!\", me->GetName(), me->GetEntry(), uint32(myTeamId), curNode->GetWPId());\n+                            return curNode;\n+                        }\n+                    }\n+                }\n+            }\n+            //3) carrier - get next point towards drop point (equal dist, get the one with most allies, random if none)\n+            for (TeamId teamId : { TEAM_ALLIANCE, TEAM_HORDE })\n+            {\n+                if (myTeamId != teamId)\n+                    continue;\n+\n+                if (ey->GetFlagPickerGUID() == me->GetGUID())\n+                {\n+                    WanderNode const* dropPoint = nullptr;\n+                    NodeList dropPoints;\n+                    WanderNode::DoForAllMapWPs(bg->GetMapId(), [&dropPoints](WanderNode const* dwp) {\n+                        if (dwp->HasFlag(BotWPFlags::BOTWP_FLAG_BG_FLAG_DELIVER_TARGET))\n+                            dropPoints.push_back(dwp);\n+                    });\n+                    std::vector<uint8> owned_points;\n+                    owned_points.reserve(EY_POINTS_MAX);\n+                    for (uint8 index : NPCBots::index_array<uint8, EY_POINTS_MAX>)\n+                        if (ey->GetPointOwner(index) == myTeamId)\n+                            owned_points.push_back(index);\n+                    uint8 targetPoint = EY_POINTS_MAX;\n+                    if (!owned_points.empty())\n+                    {\n+                        for (uint8 owned_point : owned_points)\n+                            for (WanderNode const* dwp : dropPoints)\n+                                if (dwp->GetExactDist2dSq(BG_EY_TriggerPositions[owned_point]) < std::pow(INTERACTION_DISTANCE, 2.f) && curNode->HasLink(dwp))\n+                                    return dwp;\n+                        targetPoint = owned_points.size() == 1u ? owned_points.front() : Bcore::Containers::SelectRandomContainerElement(owned_points);\n+                    }\n+                    if (targetPoint >= EY_POINTS_MAX)\n+                    {\n+                        uint8 maxAllies = 0;\n+                        for (uint8 index : NPCBots::index_array<uint8, EY_POINTS_MAX>)\n+                        {\n+                            uint8 alliesCount = std::ranges::count_if(ey->GetPlayersNearPoint(index), [=](ObjectGuid guid) {\n+                                return (guid.IsPlayer() ? ey->GetTeamIndexByTeamId(ey->GetPlayerTeam(guid)) : ey->GetBotTeamId(guid)) == myTeamId;\n+                            });\n+                            if (maxAllies < alliesCount)\n+                            {\n+                                maxAllies = alliesCount;\n+                                targetPoint = index;\n+                            }\n+                        }\n+                    }\n+                    if (targetPoint < EY_POINTS_MAX)\n+                    {\n+                        for (WanderNode const* dwp : dropPoints)\n+                        {\n+                            if (dwp->GetExactDist2dSq(BG_EY_TriggerPositions[targetPoint]) < std::pow(INTERACTION_DISTANCE, 2.f))\n+                            {\n+                                dropPoint = dwp;\n+                                break;\n+                            }\n+                        }\n+                    }\n+                    if (!dropPoint)\n+                        dropPoint = Bcore::Containers::SelectRandomContainerElement(dropPoints);\n+                    NodeLinkList dlinks = curNode->GetShortestPathLinks(dropPoint, links);\n+                    if (!dlinks.empty())\n+                    {\n+                        //BOT_LOG_DEBUG(\"npcbots\", \"Bot {} {} team {} GOT A FLAG and goes for EY point {}! Cur node: {} {}\",\n+                        //    me->GetName(), me->GetEntry(), uint32(myTeamId), dropPoint->GetName(), curNode->GetWPId(), curNode->GetName());\n+                        return dlinks.size() == 1u ? dlinks.front().wp : Bcore::Containers::SelectRandomWeightedContainerElement(dlinks, LinkWeightExtractor())->wp;\n+                    }\n+                }\n+            }\n+            //4) at least one bot should camp the flag point for recapture\n+            for (TeamId teamId : { TEAM_ALLIANCE, TEAM_HORDE })\n+            {\n+                if (myTeamId != teamId)\n+                    continue;\n+\n+                WanderNode const* flagWP = WanderNode::FindInMapWPs(me->GetMapId(), [](WanderNode const* mwp) { return mwp->HasFlag(BotWPFlags::BOTWP_FLAG_BG_FLAG_PICKUP_TARGET); });\n+                if (flagWP)\n+                {\n+                    bool has_attacker = std::ranges::any_of(team_members, [=, this](Unit const* m) {\n+                        WanderNode const* mn = m->IsNPCBot() ? m->ToCreature()->GetBotAI()->_travel_node_cur : nullptr;\n+                        return (m != me && ((std::fabs(m->m_positionZ - flagWP->m_positionZ) < 15.f && m->GetExactDist2d(flagWP) < 35.f) ||\n+                            (mn && (mn == flagWP || (mn->HasLink(flagWP) && mn->GetExactDist2d(flagWP) < me->GetExactDist2d(flagWP))))));\n+                    });\n+                    if (!has_attacker)\n+                    {\n+                        NodeLinkList flinks = curNode->GetShortestPathLinks(flagWP, links);\n+                        if (!flinks.empty())\n+                        {\n+                            //BOT_LOG_DEBUG(\"npcbots\", \"Bot {} {} team {} goes for EY FLAG POINT at {}! Cur node: {} {}\",\n+                            //    me->GetName(), me->GetEntry(), uint32(myTeamId), flagWP->GetName(), curNode->GetWPId(), curNode->GetName());\n+                            return flinks.size() == 1u ? flinks.front().wp : Bcore::Containers::SelectRandomWeightedContainerElement(flinks, LinkWeightExtractor())->wp;\n+                        }\n+                    }\n+                }\n+            }\n+            //5) all bases controlled - lock enemy team on their spawn (go for interception wp)\n+            //6) closest (linked) point is not controlled - go there, otherwise find all non-captured bases and select one (max 2 per base), closest to me or farthest from spawn\n+            for (TeamId teamId : { TEAM_ALLIANCE, TEAM_HORDE })\n+            {\n+                if (myTeamId != teamId)\n+                    continue;\n+\n+                uint8 unowned_points_mask = 0;\n+                for (uint8 index : NPCBots::index_array<uint8, EY_POINTS_MAX>)\n+                    if (ey->GetPointOwner(index) != myTeamId)\n+                        unowned_points_mask |= static_cast<uint8>(1u << index);\n+                if (unowned_points_mask)\n+                {\n+                    WanderNode const* lockWP = WanderNode::FindInMapWPs(me->GetMapId(), [=](WanderNode const* mwp) {\n+                        return mwp->HasAllFlags(myTeamId == TEAM_ALLIANCE ? BotWPFlags::BOTWP_FLAG_SPAWN_INTERCEPT_ALLIANCE : BotWPFlags::BOTWP_FLAG_SPAWN_INTERCEPT_HORDE);\n+                    });\n+                    if (lockWP)\n+                    {\n+                        NodeLinkList llinks = curNode->GetShortestPathLinks(lockWP, links);\n+                        if (!llinks.empty())\n+                        {\n+                            //BOT_LOG_DEBUG(\"npcbots\", \"Bot {} {} team {} goes for EY PIN at {}! Cur node: {} {}\",\n+                            //    me->GetName(), me->GetEntry(), uint32(myTeamId), lockWP->GetName(), curNode->GetWPId(), curNode->GetName());\n+                            return llinks.size() == 1u ? llinks.front().wp : Bcore::Containers::SelectRandomWeightedContainerElement(llinks, LinkWeightExtractor())->wp;\n+                        }\n+                    }\n+                }\n+\n+                decltype(unowned_points_mask) attackable_points_mask = 0;\n+                for (uint8 index : NPCBots::index_array<uint8, EY_POINTS_MAX>)\n+                {\n+                    if (!((1u << index) & unowned_points_mask))\n+                        continue;\n+                    uint8 attackers_count = std::ranges::count_if(team_members, [=, this](Unit const* m) {\n+                        return (m != me && (m->GetExactDist2d(BG_EY_TriggerPositions[index]) < float(BG_EY_POINT_RADIUS) * 0.5f ||\n+                            (m->IsNPCBot() && m->GetExactDist2d(BG_EY_TriggerPositions[index]) < me->GetExactDist2d(BG_EY_TriggerPositions[index]))));\n+                    });\n+                    if (attackers_count < uint8(team_members.size() / 5u + 1u))\n+                        attackable_points_mask |= static_cast<uint8>(1u << index);\n+                }\n+                NodeList attackableWPs;\n+                WanderNode::DoForAllMapWPs(bg->GetMapId(), [&attackableWPs](WanderNode const* dwp) {\n+                    if (dwp->HasFlag(BotWPFlags::BOTWP_FLAG_BG_FLAG_DELIVER_TARGET))\n+                        attackableWPs.push_back(dwp);\n+                });\n+                Position const* fromPos;\n+                if (attackable_points_mask)\n+                {\n+                    for (uint8 index : NPCBots::index_array<uint8, EY_POINTS_MAX>)\n+                    {\n+                        if (!((1u << index) & attackable_points_mask))\n+                            continue;\n+                        for (WanderNode const* awp : attackableWPs)\n+                            if (awp->GetExactDist2dSq(BG_EY_TriggerPositions[index]) < std::pow(INTERACTION_DISTANCE, 2.f) && curNode->HasLink(awp))\n+                                return awp;\n+                    }\n+                    fromPos = me;\n+                }\n+                else\n+                    fromPos = WanderNode::FindInMapWPs(me->GetMapId(), [](WanderNode const* mwp) { return mwp->HasAllFlags(BotWPFlags::BOTWP_FLAG_ALLIANCE_SPAWN_POINT); });\n+                uint8 target_point = EY_POINTS_MAX;\n+                if (fromPos)\n+                {\n+                    float maxdist = 0.0f;\n+                    float dist2dsq;\n+                    for (uint8 index : NPCBots::index_array<uint8, EY_POINTS_MAX>)\n+                    {\n+                        if (!((1u << index) & attackable_points_mask))\n+                            continue;\n+                        dist2dsq = fromPos->GetExactDist2dSq(BG_EY_TriggerPositions[index]);\n+                        if (dist2dsq > maxdist)\n+                        {\n+                            maxdist = dist2dsq;\n+                            target_point = index;\n+                        }\n+                    }\n+                    if (target_point >= EY_POINTS_MAX)\n+                    {\n+                        maxdist = 0.0f;\n+                        for (uint8 index : NPCBots::index_array<uint8, EY_POINTS_MAX>)\n+                        {\n+                            if (!((1u << index) & unowned_points_mask))\n+                                continue;\n+                            dist2dsq = fromPos->GetExactDist2dSq(BG_EY_TriggerPositions[index]);\n+                            if (dist2dsq > maxdist)\n+                            {\n+                                maxdist = dist2dsq;\n+                                target_point = index;\n+                            }\n+                        }\n+                    }\n+                }\n+                if (target_point != EY_POINTS_MAX)\n+                {\n+                    for (WanderNode const* awp : attackableWPs)\n+                    {\n+                        if (awp->GetExactDist2dSq(BG_EY_TriggerPositions[target_point]) < std::pow(INTERACTION_DISTANCE, 2.f))\n+                        {\n+                            NodeLinkList alinks = curNode->GetShortestPathLinks(awp, links);\n+                            if (!alinks.empty())\n+                                return alinks.size() == 1u ? alinks.front().wp : Bcore::Containers::SelectRandomWeightedContainerElement(alinks, LinkWeightExtractor())->wp;\n+                        }\n+                    }\n+                }\n+            }\n+\n+            break;\n+        }\n+        default:\n+            break;\n+    }\n+\n+    //if (links.size() > 1)\n+    //{\n+    //    BOT_LOG_DEBUG(\"npcbots\", \"Bot {} {} team {} has no target point in BG_AB! Falling back to random ({} links)!. Cur node: {} {}\",\n+    //        me->GetName(), me->GetEntry(), uint32(myTeamId), uint32(curNode->GetLinks().size()), curNode->GetWPId(), curNode->GetName());\n+    //}\n+\n+    return nullptr;\n+}\n+\n+void bot_ai::OnWanderNodeReached()\n+{\n+    if (Battleground* bg = GetBG())\n+    {\n+        if (_travel_node_cur->HasFlag(BotWPFlags::BOTWP_FLAG_BG_FLAG_DELIVER_TARGET) && IsFlagCarrier(me, bg->GetTypeID()))\n+        {\n+            switch (bg->GetTypeID())\n+            {\n+                case BATTLEGROUND_WS:\n+                    if (bg->GetBotTeamId(me->GetGUID()) == TEAM_ALLIANCE && _travel_node_cur->HasFlag(BotWPFlags::BOTWP_FLAG_ALLIANCE_ONLY))\n+                        bg->HandleBotAreaTrigger(me, 3646);\n+                    if (bg->GetBotTeamId(me->GetGUID()) == TEAM_HORDE && _travel_node_cur->HasFlag(BotWPFlags::BOTWP_FLAG_HORDE_ONLY))\n+                        bg->HandleBotAreaTrigger(me, 3647);\n+                    break;\n+                case BATTLEGROUND_EY:\n+                {\n+                    const std::array dFlagTriggers{ TR_FEL_REAVER_POINT, TR_BLOOD_ELF_POINT, TR_DRAENEI_RUINS_POINT, TR_MAGE_TOWER_POINT };\n+                    const std::array index_range = NPCBots::index_array<uint8, EY_POINTS_MAX>;\n+                    auto cit = std::ranges::find_if(index_range, [this](uint8 index) { return me->GetExactDist2d(BG_EY_TriggerPositions[index]) < INTERACTION_DISTANCE; });\n+                    if (cit != index_range.cend())\n+                        bg->HandleBotAreaTrigger(me, dFlagTriggers[*cit]);\n+                    break;\n+                }\n+                default:\n+                    break;\n+            }\n+        }\n+        if (_travel_node_cur->HasFlag(BotWPFlags::BOTWP_FLAG_BG_FLAG_PICKUP_TARGET) && !IsFlagCarrier(me, bg->GetTypeID()))\n+        {\n+            switch (bg->GetTypeID())\n+            {\n+                case BATTLEGROUND_AV:\n+                {\n+                    GameObject* obj = nullptr;\n+\n+                    BattlegroundAV* av = dynamic_cast<BattlegroundAV*>(bg);\n+                    for (BG_AV_Nodes counter = BG_AV_NODES_FIRSTAID_STATION; counter < BG_AV_NODES_MAX; ++counter)\n+                    {\n+                        BG_AV_NodeInfo const& c = av->GetNodes()[counter];\n+                        if (c.State == BG_AV_States::POINT_DESTROYED)\n+                            continue;\n+                        if (c.State == BG_AV_States::POINT_NEUTRAL || c.Owner != bg->GetBotTeam(me->GetGUID()))\n+                        {\n+                            uint32 node_type = av->GetObjectThroughNodeForBot(counter);\n+                            GameObject* go = !bg->BgObjects[node_type].IsEmpty() ? bg->GetBGObject(node_type) : nullptr;\n+                            if (go && me->IsWithinDistInMap(go, 10.0f))\n+                            {\n+                                obj = go;\n+                                break;\n+                            }\n+                        }\n+                    }\n+\n+                    if (!obj)\n+                        break;\n+\n+                    bool already_used = false;\n+                    for (Unit const* member : BotMgr::GetAllGroupMembers(me))\n+                    {\n+                        if (member->GetGUID() == me->GetGUID())\n+                            continue;\n+                        if (Spell const* curSpell = member->GetCurrentSpell(CURRENT_GENERIC_SPELL))\n+                        {\n+                            if (curSpell->m_spellInfo->Id == OPEN_FLAG_BG && curSpell->m_targets.GetGOTargetGUID() == obj->GetGUID())\n+                            {\n+                                already_used = true;\n+                                break;\n+                            }\n+                        }\n+                    }\n+                    if (already_used)\n+                        break;\n+\n+                    //BOT_LOG_ERROR(\"npcbots\", \"OnWanderNodeReached: [AV] Bot {} USES flag {} at node {}\", me->GetName(), obj->GetName(), node);\n+\n+                    if (me->IsMounted())\n+                        DismountBot();\n+                    me->CastSpell(obj, OPEN_FLAG_BG);\n+\n+                    break;\n+                }\n+                case BATTLEGROUND_WS:\n+                {\n+                    if (bg->GetBotTeamId(me->GetGUID()) == TEAM_ALLIANCE && _travel_node_cur->HasFlag(BotWPFlags::BOTWP_FLAG_HORDE_ONLY))\n+                    {\n+                        if (GameObject* go = bg->GetBGObject(BG_WS_OBJECT_H_FLAG, true))\n+                        {\n+                            //BOT_LOG_ERROR(\"npcbots\", \"OnWanderNodeReached: [WSG] Horde flag dist: {}\", me->GetExactDist(go));\n+                            if (me->IsMounted())\n+                                DismountBot();\n+                            bg->EventBotClickedOnFlag(me, go);\n+                        }\n+                    }\n+                    if (bg->GetBotTeamId(me->GetGUID()) == TEAM_HORDE && _travel_node_cur->HasFlag(BotWPFlags::BOTWP_FLAG_ALLIANCE_ONLY))\n+                    {\n+                        if (GameObject* go = bg->GetBGObject(BG_WS_OBJECT_A_FLAG, true))\n+                        {\n+                            //BOT_LOG_ERROR(\"npcbots\", \"OnWanderNodeReached: [WSG] Alliance flag dist: {}\", me->GetExactDist(go));\n+                            if (me->IsMounted())\n+                                DismountBot();\n+                            bg->EventBotClickedOnFlag(me, go);\n+                        }\n+                    }\n+                    break;\n+                }\n+                case BATTLEGROUND_AB:\n+                {\n+                    uint8 node = BG_AB_NODE_STABLES;\n+                    GameObject* obj = bg->GetBGObject(node*8+BG_AB_OBJECT_BANNER_NEUTRAL);\n+                    while (node < BG_AB_DYNAMIC_NODES_COUNT && (!obj || !me->IsWithinDistInMap(obj, 10.0f)))\n+                    {\n+                        ++node;\n+                        obj = bg->GetBGObject(node*8+BG_AB_OBJECT_BANNER_NEUTRAL);\n+                    }\n+                    if (node < BG_AB_DYNAMIC_NODES_COUNT)\n+                    {\n+                        TeamId teamId = bg->GetBotTeamId(me->GetGUID());\n+                        BattlegroundAB const* bgab = dynamic_cast<BattlegroundAB const*>(bg);\n+\n+                        if (bgab->IsNodeOccupied(node, teamId) || bgab->IsNodeContested(node, teamId))\n+                            break;\n+\n+                        //at this point node is either neutral or owned/contested by other team\n+                        uint8 new_bg_obj_type;\n+                        if (bgab->IsNodeOccupied(node, bg->GetOtherTeamId(teamId)))\n+                            new_bg_obj_type = BG_AB_OBJECT_BANNER_HORDE;\n+                        else if (bgab->IsNodeContested(node, bg->GetOtherTeamId(teamId)))\n+                            new_bg_obj_type = BG_AB_OBJECT_BANNER_CONT_H;\n+                        else\n+                            new_bg_obj_type = BG_AB_OBJECT_BANNER_NEUTRAL;\n+\n+                        obj = ASSERT_NOTNULL(bg->GetBGObject(node*8+new_bg_obj_type));\n+\n+                        bool already_used = false;\n+                        for (Unit const* member : BotMgr::GetAllGroupMembers(me))\n+                        {\n+                            if (member->GetGUID() == me->GetGUID())\n+                                continue;\n+                            if (Spell const* curSpell = member->GetCurrentSpell(CURRENT_GENERIC_SPELL))\n+                            {\n+                                if (curSpell->m_spellInfo->Id == OPEN_FLAG_BG && curSpell->m_targets.GetGOTargetGUID() == obj->GetGUID())\n+                                {\n+                                    already_used = true;\n+                                    break;\n+                                }\n+                            }\n+                        }\n+                        if (already_used)\n+                            break;\n+\n+                        //BOT_LOG_ERROR(\"npcbots\", \"OnWanderNodeReached: [AB] Bot {} USES flag {} at node {}\", me->GetName(), obj->GetName(), uint32(node));\n+                        if (me->IsMounted())\n+                            DismountBot();\n+                        me->CastSpell(obj, OPEN_FLAG_BG);\n+                    }\n+                    break;\n+                }\n+                case BATTLEGROUND_EY:\n+                {\n+                    GameObject* obj = bg->GetBGObject(BG_EY_OBJECT_FLAG_NETHERSTORM);\n+                    if (obj && obj->IsInWorld() && obj->isSpawned() && obj->GetGoState() == GO_STATE_READY)\n+                    {\n+                        bool already_used = std::ranges::any_of(BotMgr::GetAllGroupMembers(me), [=, this](Unit const* member) {\n+                            if (member == me)\n+                                return false;\n+                            Spell const* curSpell = member->GetCurrentSpell(CURRENT_GENERIC_SPELL);\n+                            return  curSpell && curSpell->m_spellInfo->Id == OPEN_FLAG_BG && curSpell->m_targets.GetGOTargetGUID() == obj->GetGUID();\n+                        });\n+                        if (already_used)\n+                            break;\n+                        //BOT_LOG_ERROR(\"npcbots\", \"OnWanderNodeReached: [EY] Bot {} USES flag {} at node {}\", me->GetName(), obj->GetName(), _travel_node_cur->GetWPId());\n+                        if (me->IsMounted())\n+                            DismountBot();\n+                        me->CastSpell(obj, OPEN_FLAG_BG);\n+                    }\n+                    break;\n+                }\n+                default:\n+                    break;\n+            }\n+        }\n+    }\n+}\n+\n+void bot_ai::OnBotEnterBattleground()\n+{\n+    Battleground* bg = ASSERT_NOTNULL(GetBG());\n+\n+    if (bg->GetStatus() != STATUS_IN_PROGRESS && IsWanderer())\n+    {\n+        BotWPFlags myTeamSpawnFlags;\n+        if (bg->isArena())\n+            myTeamSpawnFlags = BotWPFlags::BOTWP_FLAG_SPAWN;\n+        else\n+        {\n+            switch (bg->GetBotTeamId(me->GetGUID()))\n+            {\n+                case TEAM_ALLIANCE: myTeamSpawnFlags = BotWPFlags::BOTWP_FLAG_ALLIANCE_SPAWN_POINT; break;\n+                case TEAM_HORDE:    myTeamSpawnFlags = BotWPFlags::BOTWP_FLAG_HORDE_SPAWN_POINT;    break;\n+                default:            myTeamSpawnFlags = BotWPFlags::BOTWP_FLAG_SPAWN;                break;\n+            }\n+        }\n+\n+        uint32 mapId = bg->GetBgMap()->GetId();\n+        float mindist = 50000.0f;\n+        WanderNode const* startNode = nullptr;\n+        WanderNode::DoForAllMapWPs(mapId, [pos = me->GetPosition(), spawnFlags = myTeamSpawnFlags, &mindist, &startNode](WanderNode const* wp) {\n+            if (wp->HasAllFlags(spawnFlags))\n+            {\n+                float dist = pos.GetExactDist2d(wp);\n+                if (dist < mindist)\n+                {\n+                    startNode = wp;\n+                    mindist = dist;\n+                }\n+            }\n+        });\n+\n+        SetBotCommandState(BOT_COMMAND_STAY);\n+        if (startNode)\n+        {\n+            if (TempSummon* wpc = me->GetMap()->SummonCreature(VISUAL_WAYPOINT, *startNode, nullptr, 1000))\n+            {\n+                wpc->SetTempSummonType(TEMPSUMMON_TIMED_DESPAWN);\n+                float angle = bg->GetTypeID() == BATTLEGROUND_WS ? frand(float(M_PI * 0.75), float(M_PI * 1.25)) : frand(0.001f, float(M_PI * 1.995));\n+                Position myStartPos = wpc->GetFirstCollisionPosition(bg->GetTypeID() == BATTLEGROUND_EY ? frand(6.0f, 8.0f) : frand(5.0f, 20.0f), angle);\n+                BotMovement(BOT_MOVE_POINT, &myStartPos);\n+            }\n+        }\n+    }\n+}\n+\n+void bot_ai::SetWanderer()\n+{\n+    if (IAmFree())\n+    {\n+        _wanderer = true;\n+        if (botPet)\n+            botPet->GetBotPetAI()->SetWanderer();\n+    }\n+}\n+\n+void bot_ai::KillEvents(bool force)\n+{\n+    Events.KillAllEvents(force);\n+}\n+\n+void bot_ai::OnBotEnterVehicle(Vehicle const* vehicle)\n+{\n+    if (VehicleSeatEntry const* seat = vehicle->GetSeatForPassenger(me))\n+    {\n+        if (seat->Flags & VEHICLE_SEAT_FLAG_CAN_CONTROL)\n+        {\n+            vehicle->GetBase()->SetFaction(master->GetFaction());\n+            //vehicle->GetBase()->SetOwnerGUID(master->GetGUID());\n+            vehicle->GetBase()->SetCreator(master);\n+            vehicle->GetBase()->SetUnitFlag(UNIT_FLAG_POSSESSED);\n+            vehicle->GetBase()->SetUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED);\n+            vehicle->GetBase()->SetByteValue(UNIT_FIELD_BYTES_2, 1, master->GetByteValue(UNIT_FIELD_BYTES_2, 1));\n+            ASSERT(vehicle->GetBase()->SetCharmedBy(me, CHARM_TYPE_VEHICLE));\n+            vehicle->GetBase()->SetControlledByPlayer(true);\n+\n+            _vehcomboPoints = 0;\n+            //flight mode\n+            switch (vehicle->GetBase()->GetEntry())\n+            {\n+                case CREATURE_NEXUS_SKYTALON_1:\n+                case CREATURE_EOE_SKYTALON_N:\n+                case CREATURE_EOE_SKYTALON_H:\n+                case CREATURE_OCULUS_DRAKE_RUBY:\n+                case CREATURE_OCULUS_DRAKE_EMERALD:\n+                case CREATURE_OCULUS_DRAKE_AMBER:\n+                    UnsummonAll(false);\n+                    vehicle->GetBase()->SetCanFly(true);\n+                    vehicle->GetBase()->SetDisableGravity(true);\n+                    break;\n+                default:\n+                    break;\n+            }\n+        }\n+\n+        if (Unit* oVeh = master->GetVehicleBase())\n+        {\n+            CreatureTemplate const* vehTemplate = vehicle->GetBase()->IsCreature() ? vehicle->GetBase()->ToCreature()->GetCreatureTemplate() : nullptr;\n+            ////Set hp and mana percent to avoid abuse\n+            //vehicle->GetBase()->SetHealth(vehicle->GetBase()->GetMaxHealth() * oVeh->GetHealthPct() / 100.f + 0.5f);\n+            //if (oVeh->GetPowerType() == POWER_MANA)\n+            //{\n+            //    float mpPct = oVeh->GetPower(POWER_MANA) * 100.f / oVeh->GetMaxPower(POWER_MANA);\n+            //    vehicle->GetBase()->SetPower(POWER_MANA, vehicle->GetBase()->GetMaxPower(POWER_MANA) * mpPct / 100.f + 0.5f);\n+            //}\n+            //speed\n+            if (vehTemplate &&\n+                (vehTemplate->Movement.Flight == CreatureFlightMovementType::CanFly ||\n+                vehTemplate->Movement.Flight == CreatureFlightMovementType::DisableGravity))\n+            {\n+                //hack to use vehicle speed\n+                vehicle->GetBase()->RemoveAurasByType(SPELL_AURA_MOD_INCREASE_VEHICLE_FLIGHT_SPEED);\n+                vehicle->GetBase()->RemoveAurasByType(SPELL_AURA_MOD_VEHICLE_SPEED_ALWAYS);\n+                vehicle->GetBase()->RemoveAurasByType(SPELL_AURA_MOD_FLIGHT_SPEED_NOT_STACK);\n+                vehicle->GetBase()->RemoveAurasByType(SPELL_AURA_MOD_MOUNTED_SPEED_NOT_STACK);\n+                vehicle->GetBase()->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_INCREASE_VEHICLE_FLIGHT_SPEED, true);\n+                vehicle->GetBase()->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_VEHICLE_SPEED_ALWAYS, true);\n+                vehicle->GetBase()->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_FLIGHT_SPEED_NOT_STACK, true);\n+                vehicle->GetBase()->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_MOUNTED_SPEED_NOT_STACK, true);\n+                vehicle->GetBase()->SetSpeedRate(MOVE_FLIGHT, oVeh->GetSpeedRate(MOVE_FLIGHT) * 1.17f);\n+                vehicle->GetBase()->SetSpeedRate(MOVE_RUN, oVeh->GetSpeedRate(MOVE_FLIGHT) * 1.17f);\n+                vehicle->GetBase()->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_DECREASE_SPEED, true);\n+                vehicle->GetBase()->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_SPEED_SLOW_ALL, true);\n+            }\n+        }\n+    }\n+}\n+\n+void bot_ai::OnBotExitVehicle(Vehicle const* vehicle)\n+{\n+    if (VehicleSeatEntry const* seat = vehicle->GetSeatForPassenger(me))\n+    {\n+        if (seat->Flags & VEHICLE_SEAT_FLAG_CAN_CONTROL)\n+        {\n+            vehicle->GetBase()->SetControlledByPlayer(false);\n+            vehicle->GetBase()->RemoveCharmedBy(me);\n+            vehicle->GetBase()->RestoreFaction();\n+            //vehicle->GetBase()->SetOwnerGUID(ObjectGuid::Empty);\n+            vehicle->GetBase()->SetCreator(nullptr);\n+            vehicle->GetBase()->RemoveUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED);\n+            if (vehicle->GetBase()->IsCreature())\n+                vehicle->GetBase()->RemoveUnitFlag(UNIT_FLAG_POSSESSED);\n+            vehicle->GetBase()->SetByteValue(UNIT_FIELD_BYTES_2, 1, 0);\n+\n+            _curVehStrat = BOT_VEH_STRAT_NONE;\n+            if (vehicle->GetBase()->IsSummon())\n+                vehicle->GetBase()->ToCreature()->DespawnOrUnsummon(1ms);\n+        }\n+    }\n+}\n+\n+void bot_ai::AfterBotOwnerEnterVehicle()\n+{\n+    if (!me->GetVehicle() && master->GetVehicleCreatureBase() && master->GetVehicleCreatureBase()->m_spells[0] &&\n+        master->GetVehicleBase()->IsControlledByPlayer())\n+    {\n+        VehicleSeatEntry const* seat = master->GetVehicle()->GetSeatForPassenger(master);\n+        if (seat && seat->CanEnterOrExit())\n+        {\n+            uint32 creEntry = 0;\n+            uint32 vehEntry;\n+\n+            ChooseVehicleForEncounter(creEntry, vehEntry);\n+            if (!creEntry)\n+            {\n+                BOT_LOG_DEBUG(\"scripts\", \"OnBotOwnerEnterVehicle: no vehicle selected for bot master veh {}!\",\n+                    master->GetVehicleCreatureBase()->GetName());\n+                return;\n+            }\n+            Unit* veh = SpawnVehicle(creEntry, vehEntry);\n+            ASSERT(veh);\n+\n+            removeShapeshiftForm();\n+            //me->BotStopMovement();\n+\n+            //DO NOT use spellclick here, this is undefined behaviour if target selection is not explicit\n+            //veh->HandleSpellClick(me);\n+            switch (creEntry) //select vehicle ride spell\n+            {\n+                //TODO\n+            case CREATURE_EOE_SKYTALON_N:\n+            case CREATURE_EOE_SKYTALON_H:\n+                me->CastSpell(veh, 56071); //Ride Red Dragon Buddy\n+                break;\n+            case CREATURE_OCULUS_DRAKE_RUBY:\n+            case CREATURE_OCULUS_DRAKE_EMERALD:\n+            case CREATURE_OCULUS_DRAKE_AMBER:\n+            {\n+                me->EnterVehicle(veh); //cannot cast ride spell (49464, 49346, 49460) due to targeting (TARGET_UNIT_NEARBY_ENTRY)\n+                CastSpellExtraArgs args(true);\n+                args.SetOriginalCaster(me->GetGUID());\n+                veh->CastSpell(veh, 66667, args); //Gear Scaling\n+                break;\n+            }\n+            //case CREATURE_TOC_STEED_QUELDOREI:\n+            //case CREATURE_TOC_NIGHTSABER:\n+            //case CREATURE_TOC_STEED_STORMWIND:\n+            //case CREATURE_TOC_MECHANOSTRIDER:\n+            //case CREATURE_TOC_RAM:\n+            //case CREATURE_TOC_ELEKK:\n+            //case CREATURE_TOC_HAWKSTRIDER_SUNREAVER:\n+            //case CREATURE_TOC_RAPTOR:\n+            //case CREATURE_TOC_WARHORSE:\n+            //case CREATURE_TOC_WOLF:\n+            //case CREATURE_TOC_HAWKSTRIDER_SILVERMOON:\n+            //case CREATURE_TOC_KODO:\n+            //    me->CastSpell(veh, 63151); //Ride Vehicle\n+            //    break;\n+            case CREATURE_TOC5_WARHORSE:\n+            case CREATURE_TOC5_BATTLEWORG:\n+                me->CastSpell(veh, 67830); //Ride Vehicle\n+                break;\n+            default:\n+                me->EnterVehicle(veh);\n+                break;\n+            }\n+            return;\n+        }\n+    }\n+\n+    //BOT_LOG_ERROR(\"scripts\", \"OnBotOwnerEnterVehicle: master not in vehicle or no veh found for bot {}!\", me->GetName());\n+}\n+\n+void bot_ai::OnBotOwnerEnterVehicle(Vehicle const* /*vehicle*/)\n+{\n+    shouldEnterVehicle = true;\n+}\n+\n+void bot_ai::OnBotOwnerExitVehicle(Vehicle const* /*vehicle*/)\n+{\n+    shouldEnterVehicle = false;\n+    if (me->GetVehicle())\n+    {\n+        if (me->GetMapId() == 631) // Icecrown Citadel\n+        {\n+            me->ExitVehicle();\n+            me->BotStopMovement();\n+        }\n+    }\n+}\n+\n+Unit* bot_ai::SpawnVehicle(uint32 creEntry, uint32 vehEntry)\n+{\n+    ASSERT(sObjectMgr->GetCreatureTemplate(creEntry));\n+    if (vehEntry != 0)\n+        ASSERT(sVehicleStore.LookupEntry(vehEntry));\n+\n+    Map* map = me->GetMap();\n+    float x, y, z, o;\n+    TempSummon* vc;\n+    if (!me->GetTransport())\n+    {\n+        o = master->GetOrientation();\n+        me->GetClosePoint(x, y, z, me->GetCombatReach());\n+        vc = new TempSummon(nullptr, me, false);\n+        ASSERT(vc->Create(map->GenerateLowGuid<HighGuid::Unit>(), map, master->GetPhaseMask(), creEntry, Position(x,y,z,o), nullptr, vehEntry, true));\n+        vc->SetTempSummonType(TEMPSUMMON_CORPSE_DESPAWN);\n+        vc->InitStats(0);\n+        ASSERT(map->AddToMap(vc->ToCreature()));\n+        vc->InitSummon(); //not needed really\n+    }\n+    else\n+    {\n+        if (master->GetVehicle())\n+            o = master->GetVehicleBase()->GetTransOffsetO();\n+        else\n+            o = master->GetTransOffsetO();\n+        x = me->GetTransOffsetX();\n+        y = me->GetTransOffsetY();\n+        z = me->GetTransOffsetZ();\n+        Position vehpos(x, y, z, o);\n+        me->GetTransport()->CalculatePassengerPosition(x, y, z, &o);\n+        vc = new TempSummon(nullptr, me, false);\n+        ASSERT(vc->Create(map->GenerateLowGuid<HighGuid::Unit>(), map, master->GetPhaseMask(), creEntry, Position(x,y,z,o), nullptr, vehEntry, true));\n+\n+        //vc->SetTransport(me->GetTransport());\n+        //vc->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT);\n+        //vc->m_movementInfo.transport.guid = GetGUID();\n+        me->GetTransport()->AddPassenger(vc);\n+\n+        vc->m_movementInfo.transport.pos.Relocate(vehpos);\n+        vc->Relocate(x, y, z, o);\n+        vc->SetHomePosition(x, y, z, o);\n+        vc->SetTransportHomePosition(vehpos);\n+\n+        vc->AddUnitState(UNIT_STATE_IGNORE_PATHFINDING);\n+        vc->InitStats(0);\n+        ASSERT(map->AddToMap(vc->ToCreature()));\n+        vc->InitSummon(); //not needed really\n+        vc->SetTempSummonType(TEMPSUMMON_CORPSE_DESPAWN);\n+        //vc = me->GetTransport()->SummonPassenger(creEntry, vehpos, TEMPSUMMON_CORPSE_DESPAWN);\n+    }\n+\n+    return vc;\n+}\n+\n+void bot_ai::ChooseVehicleForEncounter(uint32 &creEntry, uint32 &vehEntry) const\n+{\n+    Vehicle* mVeh = master->GetVehicle();\n+    ASSERT_NODEBUGINFO(mVeh);\n+    ASSERT_NODEBUGINFO(mVeh->GetBase()->IsCreature());\n+\n+    vehEntry = 0; // will be chosen at creature spawn\n+    switch (mVeh->GetBase()->GetEntry())\n+    {\n+        //TODO\n+        case CREATURE_NEXUS_SKYTALON_1:\n+        case CREATURE_EOE_SKYTALON_N:\n+        case CREATURE_EOE_SKYTALON_H:\n+        case CREATURE_ULDUAR_DEMOLISHER:\n+        case CREATURE_ULDUAR_SIEGE_ENGINE:\n+        case CREATURE_ULDUAR_CHOPPER:\n+        case CREATURE_ULDUAR_CHOPPER1:\n+        //case CREATURE_TOC_STEED_QUELDOREI:\n+        //case CREATURE_TOC_HAWKSTRIDER_SUNREAVER:\n+        case CREATURE_TOC5_WARHORSE:\n+        case CREATURE_TOC5_BATTLEWORG:\n+            creEntry = mVeh->GetBase()->GetEntry();\n+            break;\n+        case CREATURE_OCULUS_DRAKE_RUBY:\n+        case CREATURE_OCULUS_DRAKE_EMERALD:\n+        case CREATURE_OCULUS_DRAKE_AMBER:\n+            creEntry = (HasRole(BOT_ROLE_TANK)/* && mVeh->GetBase()->GetEntry() != CREATURE_OCULUS_DRAKE_RUBY*/) ? CREATURE_OCULUS_DRAKE_RUBY :\n+                (HasRole(BOT_ROLE_HEAL)/* && mVeh->GetBase()->GetEntry() != CREATURE_OCULUS_DRAKE_EMERALD*/) ? CREATURE_OCULUS_DRAKE_EMERALD :\n+                CREATURE_OCULUS_DRAKE_AMBER;\n+            break;\n+        //case CREATURE_TOC_NIGHTSABER:\n+        //case CREATURE_TOC_STEED_STORMWIND:\n+        //case CREATURE_TOC_MECHANOSTRIDER:\n+        //case CREATURE_TOC_RAM:\n+        //case CREATURE_TOC_ELEKK:\n+        //case CREATURE_TOC_RAPTOR:\n+        //case CREATURE_TOC_WARHORSE:\n+        //case CREATURE_TOC_WOLF:\n+        //case CREATURE_TOC_HAWKSTRIDER_SILVERMOON:\n+        //case CREATURE_TOC_KODO:\n+        //    switch (GetPlayerRace())\n+        //    {\n+        //        case RACE_HUMAN:         creEntry = CREATURE_TOC_STEED_STORMWIND;        break;\n+        //        case RACE_ORC:           creEntry = CREATURE_TOC_WOLF;                   break;\n+        //        case RACE_DWARF:         creEntry = CREATURE_TOC_RAM;                    break;\n+        //        case RACE_NIGHTELF:      creEntry = CREATURE_TOC_NIGHTSABER;             break;\n+        //        case RACE_UNDEAD_PLAYER: creEntry = CREATURE_TOC_WARHORSE;               break;\n+        //        case RACE_TAUREN:        creEntry = CREATURE_TOC_KODO;                   break;\n+        //        case RACE_GNOME:         creEntry = CREATURE_TOC_MECHANOSTRIDER;         break;\n+        //        case RACE_TROLL:         creEntry = CREATURE_TOC_RAPTOR;                 break;\n+        //        case RACE_BLOODELF:      creEntry = CREATURE_TOC_HAWKSTRIDER_SILVERMOON; break;\n+        //        case RACE_DRAENEI:       creEntry = CREATURE_TOC_ELEKK;                  break;\n+        //        default:                 creEntry = CREATURE_TOC_STEED_QUELDOREI;        break;\n+        //    }\n+        //    break;\n+        case CREATURE_ICC_GUNSHIPCANNON_ALLIANCE:\n+        case CREATURE_ICC_GUNSHIPCANNON_HORDE:\n+            //limited amount of cannons\n+            if (!IsTank() && HasRole(BOT_ROLE_DPS) &&\n+                master->GetBotMgr()->GetNpcBotsCountByVehicleEntry(mVeh->GetBase()->GetEntry()) <\n+                std::max<uint8>(master->GetBotMgr()->GetNpcBotsCount() / 2, 8))\n+                creEntry = mVeh->GetBase()->GetEntry();\n+            break;\n+        case CREATURE_ICC_MUTATED_ABOMINATION1:\n+        case CREATURE_ICC_MUTATED_ABOMINATION2:\n+        case CREATURE_ICC_MUTATED_ABOMINATION3:\n+        case CREATURE_ICC_MUTATED_ABOMINATION4:\n+        case CREATURE_ICC_MUTATED_ABOMINATION5:\n+        case CREATURE_ICC_MUTATED_ABOMINATION6:\n+        case CREATURE_ICC_MUTATED_ABOMINATION7:\n+        case CREATURE_ICC_MUTATED_ABOMINATION8:\n+            //no abomination bots\n+            break;\n+        case CREATURE_GEARGRINDERS_JUMPBOT:\n+            //no jumpbot bots\n+            break;\n+        default:\n+            if (VehicleSeatEntry const* seat = mVeh->GetSeatForPassenger(master))\n+            {\n+                if (seat->Flags & VEHICLE_SEAT_FLAG_CAN_CONTROL)\n+                {\n+                    //can use generic strat for that\n+                    creEntry = mVeh->GetBase()->GetEntry();\n+                    break;\n+                }\n+            }\n+\n+            BOT_LOG_ERROR(\"scripts\", \"ChooseVehicleForEncounter: unhandled master vehicle creature {} ({})\",\n+                master->GetVehicleBase()->GetName(), master->GetVehicleBase()->GetEntry());\n+            return;\n+    }\n+\n+    if (creEntry && creEntry != mVeh->GetBase()->GetEntry())\n+    {\n+        CreatureTemplate const* cProto = sObjectMgr->GetCreatureTemplate(creEntry);\n+        ASSERT_NODEBUGINFO(cProto);\n+        vehEntry = cProto->VehicleId;\n+        ASSERT_NODEBUGINFO(sVehicleStore.LookupEntry(vehEntry));\n+    }\n+}\n+\n+Position bot_ai::GetAbsoluteTransportPosition(WorldObject const* object)\n+{\n+    if (!object->GetTransport())\n+        return object->GetPosition();\n+\n+    Position p = object->GetTransport()->GetPosition();\n+    Position t = object->GetTransOffset();\n+    t.m_positionX += p.m_positionX;\n+    t.m_positionY += p.m_positionY;\n+    t.m_positionZ += p.m_positionZ;\n+    t.SetOrientation(Position::NormalizeOrientation(t.GetOrientation() + p.GetOrientation()));\n+\n+    return t;\n+}\n+\n+int32 bot_ai::GetBotResistanceBonus(SpellSchoolMask mask) const\n+{\n+    int32 resist = 0;\n+    for (uint8 i = SPELL_SCHOOL_HOLY; i != MAX_SPELL_SCHOOL; ++i)\n+        if ((mask & (1u << i)) && (resist == 0 || resist > resistbonus[i-1]))\n+            resist = resistbonus[i-1];\n+\n+    return resist;\n+}\n+\n+MeleeHitOutcome bot_ai::BotRollCustomMeleeOutcomeAgainst(Unit const* victim, WeaponAttackType attType) const\n+{\n+    if (GetNextAttackMeleeOutCome() != MELEE_HIT_CRUSHING)\n+        return GetNextAttackMeleeOutCome();\n+    return me->RollMeleeOutcomeAgainst(victim, attType);\n+}\n+\n+void bot_ai::BotJumpInPlaceInFrontOf(Position const* pos, float speedXY, float maxHeight)\n+{\n+    float sign = (me->GetPositionX() < pos->GetPositionX()) ? 1.f : -1.f;\n+    float x = me->GetPositionX() + 0.14f * sign;\n+    sign = (me->GetPositionY() < pos->GetPositionY()) ? 1.f : -1.f;\n+    float y = me->GetPositionY() + 0.14f * sign;\n+    float z = me->GetPositionZ() - 0.01f;\n+    //float floorz = Map::GetHeight(x, y, z, true, 5.f);\n+    speedXY = std::max<float>(speedXY, speedXY / me->m_modAttackSpeedPct[BASE_ATTACK]);\n+\n+    //me->AttackStop();\n+    //me->BotStopMovement();\n+    me->GetMotionMaster()->MoveJump(x, y, z, me->GetOrientation(), speedXY, maxHeight);\n+}\n+\n+void bot_ai::DismountBot()\n+{\n+    const_cast<CreatureTemplate*>(me->GetCreatureTemplate())->Movement.Flight = CreatureFlightMovementType::None;\n+    me->SetCanFly(false);\n+    me->m_movementInfo.RemoveMovementFlag(MOVEMENTFLAG_HOVER | MOVEMENTFLAG_CAN_FLY);\n+    me->SetDisableGravity(false);\n+    me->RemoveAurasByType(SPELL_AURA_MOUNTED);\n+    me->Dismount();\n+    me->BotStopMovement();\n+}\n+\n+//DPS TRACKER\n+uint32 bot_ai::GetDPSTaken(Unit const* u) const\n+{\n+    return IAmFree() ? 0 : master->GetBotMgr()->GetDPSTaken(u);\n+}\n+int32 bot_ai::GetHPSTaken(Unit const* u) const\n+{\n+    return IAmFree() ? 0 : master->GetBotMgr()->GetHPSTaken(u);\n+}\n+//Health per second\n+int32 bot_ai::GetHPS(Unit const* u) const\n+{\n+    return IAmFree() ? 0 : GetHPSTaken(u) - GetDPSTaken(u);\n+}\n+//Health percent per second\n+int32 bot_ai::GetHPPCTPS(Unit const* u) const\n+{\n+    return int32(GetHPS(u) * 100.f / float(u->GetMaxHealth()));\n+}\n+//%health unit is going to have after x ms\n+//0-100\n+uint8 bot_ai::GetExpectedHPPCT(Unit const* u, uint32 mseconds) const\n+{\n+    if (IAmFree())\n+        return GetHealthPCT(u);\n+\n+    int32 pct = int32(GetHealthPCT(u)) + int32(GetHPPCTPS(u) * (mseconds * 0.001f));\n+\n+    if (pct > 100)\n+        pct = 100;\n+    else if (pct < 0)\n+        pct = 0;\n+\n+    return uint8(pct);\n+}\n+\n+//Moved from header\n+bool bot_ai::IsChanneling(Unit const* u/* = nullptr*/) const\n+{\n+    if (!u)\n+        u = me;\n+    return u->GetCurrentSpell(CURRENT_CHANNELED_SPELL);\n+}\n+bool bot_ai::IsCasting(Unit const* u/* = nullptr*/) const\n+{\n+    if (!u)\n+        u = me;\n+    return (u->HasUnitState(UNIT_STATE_CASTING) || IsChanneling(u) || u->IsNonMeleeSpellCast(false, false, true, false, false));\n+}\n+bool bot_ai::JumpingFlyingOrFalling() const\n+{\n+    return JumpingOrFalling() || me->HasUnitMovementFlag(MOVEMENTFLAG_SPLINE_ELEVATION);\n+}\n+bool bot_ai::JumpingOrFalling() const\n+{\n+    return Jumping() || me->IsFalling() || me->HasUnitMovementFlag(MOVEMENTFLAG_PITCH_UP|MOVEMENTFLAG_PITCH_DOWN);\n+}\n+bool bot_ai::Jumping() const\n+{\n+    return me->HasUnitState(UNIT_STATE_JUMPING);\n+}\n+bool bot_ai::IsIndoors() const\n+{\n+    return indoorsTimer >= INOUTDOORS_ENSURE_TIMER && outdoorsTimer == 0;\n+}\n+bool bot_ai::IsOutdoors() const\n+{\n+    return outdoorsTimer >= INOUTDOORS_ENSURE_TIMER && indoorsTimer == 0;\n+}\n+bool bot_ai::IsInContactWithWater() const\n+{\n+    return me->IsInWorld() &&\n+        (me->GetMap()->GetLiquidStatus(me->GetPhaseMask(), me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(),\n+            MAP_LIQUID_TYPE_WATER | MAP_LIQUID_TYPE_OCEAN) & MAP_LIQUID_STATUS_IN_CONTACT);\n+}\n+\n+bool bot_ai::IsTempBot() const\n+{\n+    return me->GetOriginalEntry() == BOT_ENTRY_MIRROR_IMAGE_BM;\n+}\n+\n+uint32 bot_ai::GetLostHP(Unit const* unit)\n+{\n+    return unit->GetMaxHealth() - unit->GetHealth();\n+}\n+uint8 bot_ai::GetHealthPCT(Unit const* u)\n+{\n+    if (!u || !u->IsAlive() || u->GetMaxHealth() <= 1)\n+        return 100;\n+    return uint8(((float(u->GetHealth()))/u->GetMaxHealth()) * 100);\n+}\n+uint8 bot_ai::GetManaPCT(Unit const* u)\n+{\n+    if (!u || !u->IsAlive() || u->GetMaxPower(POWER_MANA) <= 1)\n+        return 100;\n+    return (u->GetPower(POWER_MANA)*10/(1 + u->GetMaxPower(POWER_MANA)/10));\n+}\n+\n+MeleeHitOutcome bot_ai::GetNextAttackMeleeOutCome() const\n+{\n+    return MELEE_HIT_CRUSHING;\n+}\n+\n+uint8 bot_ai::GetBotStance() const\n+{\n+    return BOT_STANCE_NONE;\n+}\n+\n+uint8 bot_ai::GetPlayerClass() const\n+{\n+    return BotMgr::GetBotPlayerClass(_botclass);\n+}\n+uint8 bot_ai::GetPlayerRace() const\n+{\n+    return BotMgr::GetBotPlayerRace(_botclass, me->GetRace());\n+}\n+\n+uint8 bot_ai::GetBotComboPoints() const\n+{\n+    return me->GetVehicle() ? _vehcomboPoints : uint8(GetAIMiscValue(BOTAI_MISC_COMBO_POINTS));\n+}\n+\n+void bot_ai::SetAIMiscValue(uint32 data, uint32 value)\n+{\n+    if (data >= BOT_MISCVALUE_SAVED_FIRST && data <= BOT_MISCVALUE_SAVED_LAST)\n+    {\n+        //only if value changes (or doesn't exist)\n+        if (auto it = _botData->miscvalues.find(data); it == _botData->miscvalues.cend() || it->second != value)\n+        {\n+            _botData->miscvalues.insert_or_assign(data, value);\n+            _saveMiscValues = true;\n+        }\n+    }\n+}\n+\n+void bot_ai::ResetAllMiscValues()\n+{\n+    for (uint32 miscval = BOT_MISCVALUE_SAVED_FIRST; miscval <= BOT_MISCVALUE_SAVED_LAST; ++miscval)\n+    {\n+        switch (miscval)\n+        {\n+            case BOTAI_MISC_ENCHANT_IS_AUTO_MH:\n+            case BOTAI_MISC_ENCHANT_IS_AUTO_OH:\n+                SetAIMiscValue(miscval, uint32(true));\n+                break;\n+            case BOTAI_MISC_ENCHANT_TIMER_MH:\n+            case BOTAI_MISC_ENCHANT_TIMER_OH:\n+                SetAIMiscValue(miscval, uint32(1));\n+                break;\n+            case BOTAI_MISC_ENCHANT_CURRENT_MH:\n+            case BOTAI_MISC_ENCHANT_CURRENT_OH:\n+            case BOTAI_MISC_PET_TYPE:\n+            case BOTAI_MISC_AURA_TYPE:\n+                SetAIMiscValue(miscval, uint32(0));\n+                break;\n+            default:\n+                BOT_LOG_ERROR(\"npcbots\", \"ResetMiscValues: unknown saved miscvalue {} reset for bot {} (current: {})!\", miscval, me->GetEntry(), GetAIMiscValue(miscval));\n+                SetAIMiscValue(miscval, uint32(0));\n+                break;\n+        }\n+    }\n+\n+    _botData->miscvalues.clear();\n+    _saveMiscValues = true;\n+}\n+\n+void bot_ai::InitMiscValues()\n+{\n+    for (auto const& p : _botData->miscvalues)\n+        SetAIMiscValue(p.first, p.second);\n+}\n+\n+float bot_ai::GetBotAmmoDPS() const\n+{\n+    if (CanUseAmmo())\n+    {\n+        for (auto i : NPCBots::index_array<uint8, MAX_AMMO_LEVEL>)\n+            if (me->GetLevel() >= AmmoDPSForLevel[i][0])\n+                return static_cast<float>(AmmoDPSForLevel[i][1]);\n+\n+        return static_cast<float>(AmmoDPSForLevel[0][1]);\n+    }\n+\n+    return 0.0f;\n+}\n+\n+uint32 bot_ai::GetPetOriginalEntry(uint32 entry)\n+{\n+    switch (entry)\n+    {\n+        case BOT_PET_IMP:\n+            return ORIGINAL_ENTRY_IMP;\n+        case BOT_PET_VOIDWALKER:\n+            return ORIGINAL_ENTRY_VOIDWALKER;\n+        case BOT_PET_SUCCUBUS:\n+            return ORIGINAL_ENTRY_SUCCUBUS;\n+        case BOT_PET_FELHUNTER:\n+            return ORIGINAL_ENTRY_FELHUNTER;\n+        case BOT_PET_FELGUARD:\n+            return ORIGINAL_ENTRY_FELGUARD;\n+        case BOT_PET_WATER_ELEMENTAL:\n+            return ORIGINAL_ENTRY_WATER_ELEMENTAL;\n+        case BOT_PET_GHOUL:\n+            //doesn't have pet template\n+            //return ORIGINAL_ENTRY_GHOUL;\n+        case BOT_PET_SHADOWFIEND:\n+            //return ORIGINAL_ENTRY_SHADOWFIEND;\n+        case BOT_PET_SPIRIT_WOLF:\n+            //return ORIGINAL_ENTRY_SPIRIT_WOLF;\n+        case BOT_PET_FORCE_OF_NATURE:\n+            //return ORIGINAL_ENTRY_FORCE_OF_NATURE;\n+        default:\n+            return ORIGINAL_ENTRY_HUNTER_PET;\n+    }\n+}\n+\n+bool bot_ai::IsPetMelee(uint32 entry)\n+{\n+    switch (entry)\n+    {\n+        case BOT_PET_IMP:\n+        case BOT_PET_WATER_ELEMENTAL:\n+        case BOT_PET_AWATER_ELEMENTAL:\n+            return false;\n+        default:\n+            return true;\n+    }\n+}\n+\n+bool bot_ai::IsMeleeClass(uint8 m_class)\n+{\n+    return IsBotClassMask(m_class, MELEE_BOT_CLASSES_MASK);\n+}\n+bool bot_ai::IsTankingClass(uint8 m_class)\n+{\n+    return IsBotClassMask(m_class, TANKING_BOT_CLASSES_MASK);\n+}\n+bool bot_ai::IsBlockingClass(uint8 m_class)\n+{\n+    return IsBotClassMask(m_class, BLOCKING_BOT_CLASSES_MASK);\n+}\n+bool bot_ai::IsCastingClass(uint8 m_class)\n+{\n+    //Class can benefit from spellpower\n+    return IsBotClassMask(m_class, CASTING_BOT_CLASSES_MASK);\n+}\n+bool bot_ai::IsHealingClass(uint8 m_class)\n+{\n+    return IsBotClassMask(m_class, HEALING_BOT_CLASSES_MASK);\n+}\n+bool bot_ai::IsHumanoidClass(uint8 m_class)\n+{\n+    return IsBotClassMask(m_class, HUMANOID_BOT_CLASSES_MASK);\n+}\n+bool bot_ai::IsHeroExClass(uint8 m_class)\n+{\n+    return IsBotClassMask(m_class, HERO_BOT_CLASSES_MASK);\n+}\n+bool bot_ai::IsMelee() const\n+{\n+    return !IsRanged() && HasRole(BOT_ROLE_DPS|BOT_ROLE_TANK);\n+}\n+bool bot_ai::IsRanged() const\n+{\n+    return HasRole(BOT_ROLE_RANGED) || HasVehicleRoleOverride(BOT_ROLE_RANGED);\n+}\n+\n+bool bot_ai::IsShootingWand(Unit const* u) const\n+{\n+    if (!u) u = me;\n+\n+    Spell const* spell = u->GetCurrentSpell(CURRENT_AUTOREPEAT_SPELL);\n+    return spell && spell->GetSpellInfo()->Id == SHOOT_WAND;\n+}\n+\n+void bot_ai::StartPotionTimer()\n+{\n+    _potionTimer = POTION_CD * (BotMgr::IsWanderingWorldBot(me) ? std::max<uint32>(uint32(Rand()) >> 3, 1u) : 1u);\n+}\n+\n+bool bot_ai::CanBlock() const\n+{\n+    return me->CanUseAttackType(OFF_ATTACK) &&\n+        (_botclass == BOT_CLASS_SPELLBREAKER || !(me->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_NO_BLOCK));\n+}\n+bool bot_ai::CanParry() const\n+{\n+    if (me->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID) && me->CanUseAttackType(BASE_ATTACK))\n+    {\n+        switch (_botclass)\n+        {\n+            case BOT_CLASS_SPHYNX:\n+            case BOT_CLASS_SPELLBREAKER:\n+            case BOT_CLASS_SEA_WITCH:\n+                return true;\n+            case BOT_CLASS_WARRIOR:\n+            case BOT_CLASS_PALADIN:\n+            case BOT_CLASS_ROGUE:\n+            case BOT_CLASS_HUNTER:\n+                return me->GetLevel() >= 10;\n+            case BOT_CLASS_SHAMAN:\n+                return me->GetLevel() >= 30;\n+            case BOT_CLASS_DEATH_KNIGHT:\n+                return me->GetLevel() >= 55;\n+            default:\n+                break;\n+        }\n+    }\n+    return false;\n+}\n+bool bot_ai::CanDodge() const\n+{\n+    return _botclass != BOT_CLASS_BM;\n+}\n+bool bot_ai::CanCrit() const\n+{\n+    return _botclass != BOT_CLASS_BM;\n+}\n+bool bot_ai::CanMiss() const\n+{\n+    return _botclass < BOT_CLASS_EX_START;\n+}\n+bool bot_ai::CanSheath() const\n+{\n+    return _botclass < BOT_CLASS_EX_START;\n+}\n+bool bot_ai::CanSit() const\n+{\n+    return _botclass < BOT_CLASS_EX_START || _botclass == BOT_CLASS_DARK_RANGER;\n+}\n+bool bot_ai::CanEat() const\n+{\n+    return _botclass != BOT_CLASS_SPHYNX;\n+}\n+bool bot_ai::CanDrink() const\n+{\n+    return _botclass < BOT_CLASS_EX_START;\n+}\n+bool bot_ai::CanRegenInCombat() const\n+{\n+    return _botclass == BOT_CLASS_SPHYNX;\n+}\n+bool bot_ai::CanMount() const\n+{\n+    switch (_botclass)\n+    {\n+        case BOT_CLASS_BM:\n+        case BOT_CLASS_SPELLBREAKER:\n+        case BOT_CLASS_DARK_RANGER:\n+        case BOT_CLASS_NECROMANCER:\n+            return true;\n+        default:\n+            return _botclass < BOT_CLASS_EX_START;\n+    }\n+}\n+bool bot_ai::CanUseAmmo() const\n+{\n+    if ((_botclass == BOT_CLASS_HUNTER || _botclass == BOT_CLASS_ROGUE ||\n+        _botclass == BOT_CLASS_WARRIOR || _botclass == BOT_CLASS_DARK_RANGER ||\n+        _botclass == BOT_CLASS_SEA_WITCH) &&\n+        _equips[BOT_SLOT_RANGED])\n+    {\n+        ItemTemplate const* ranged = _equips[BOT_SLOT_RANGED]->GetTemplate();\n+        if (ranged->Class == ITEM_CLASS_WEAPON &&\n+            (ranged->SubClass == ITEM_SUBCLASS_WEAPON_BOW ||\n+            ranged->SubClass == ITEM_SUBCLASS_WEAPON_CROSSBOW ||\n+            ranged->SubClass == ITEM_SUBCLASS_WEAPON_GUN))\n+            return true;\n+    }\n+    return false;\n+}\n+\n+bool bot_ai::RespectEquipsAttackTime() const\n+{\n+    return _botclass < BOT_CLASS_EX_START;\n+}\n+bool bot_ai::CanChangeEquip(uint8 slot) const\n+{\n+    return (_botclass != BOT_CLASS_BM && _botclass != BOT_CLASS_ARCHMAGE &&\n+        _botclass != BOT_CLASS_DREADLORD && _botclass != BOT_CLASS_SPELLBREAKER &&\n+        _botclass != BOT_CLASS_DARK_RANGER && _botclass != BOT_CLASS_NECROMANCER &&\n+        _botclass != BOT_CLASS_SEA_WITCH && _botclass != BOT_CLASS_CRYPT_LORD) ||\n+        slot > BOT_SLOT_RANGED;\n+}\n+bool bot_ai::CanDisplayNonWeaponEquipmentChanges() const\n+{\n+    return (_botclass < BOT_CLASS_EX_START || _botclass == BOT_CLASS_ARCHMAGE);\n+}\n+bool bot_ai::IsValidTransmog(uint8 slot, ItemTemplate const* source) const\n+{\n+    ASSERT(slot < BOT_TRANSMOG_INVENTORY_SIZE);\n+\n+    if (!CanChangeEquip(slot))\n+        return false;\n+\n+    Item const* item = _equips[slot];\n+    if (!item)\n+        return false;\n+\n+    ItemTemplate const* target = item->GetTemplate();\n+\n+    if (target->ItemId == source->ItemId)\n+        return false;\n+    if (target->Class != source->Class)\n+        return false;\n+\n+    switch (target->InventoryType)\n+    {\n+        case INVTYPE_RELIC:\n+        case INVTYPE_NECK:\n+        case INVTYPE_FINGER:\n+        case INVTYPE_TRINKET:\n+        case INVTYPE_THROWN:\n+            return false;\n+        default:\n+            break;\n+    }\n+    switch (source->InventoryType)\n+    {\n+        case INVTYPE_RELIC:\n+        case INVTYPE_NECK:\n+        case INVTYPE_FINGER:\n+        case INVTYPE_TRINKET:\n+        case INVTYPE_THROWN:\n+        case INVTYPE_BAG:\n+        case INVTYPE_AMMO:\n+        case INVTYPE_QUIVER:\n+        case INVTYPE_NON_EQUIP:\n+            return false;\n+        default:\n+            break;\n+    }\n+\n+    if (target->SubClass != source->SubClass)\n+    {\n+        if (target->Class == ITEM_CLASS_WEAPON && !BotCfg::MixWeaponClasses())\n+            return false;\n+        if (target->Class == ITEM_CLASS_ARMOR && !BotCfg::MixArmorClasses())\n+            return false;\n+    }\n+\n+    if (target->InventoryType != source->InventoryType)\n+    {\n+        if (target->Class == ITEM_CLASS_ARMOR)\n+        {\n+            if (!((target->InventoryType == INVTYPE_ROBE || target->InventoryType == INVTYPE_CHEST) &&\n+                (source->InventoryType == INVTYPE_ROBE || source->InventoryType == INVTYPE_CHEST)))\n+                return false;\n+        }\n+        if (target->Class == ITEM_CLASS_WEAPON && !BotCfg::MixWeaponInventoryTypes())\n+            return false;\n+    }\n+\n+    NpcBotTransmogData const* transmogData = BotDataMgr::SelectNpcBotTransmogs(me->GetEntry());\n+    if (transmogData && transmogData->transmogs[slot].second == int32(source->ItemId))\n+        return false;\n+\n+    return true;\n+}\n+\n+bool bot_ai::OnGossipHello(Player* player)\n+{\n+    return OnGossipHello(player, 0);\n+}\n+bool bot_ai::OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId)\n+{\n+    uint32 sender = player->PlayerTalkClass->GetGossipOptionSender(gossipListId);\n+    uint32 action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);\n+    return OnGossipSelect(player, me, sender, action);\n+}\n+bool bot_ai::OnGossipSelectCode(Player* player, uint32 /*menuId*/, uint32 gossipListId, char const* code)\n+{\n+    uint32 sender = player->PlayerTalkClass->GetGossipOptionSender(gossipListId);\n+    uint32 action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);\n+    return OnGossipSelectCode(player, me, sender, action, code);\n+}\n+\n+bool bot_ai::IsDamagingSpell(SpellInfo const* spellInfo)\n+{\n+    for (auto i : NPCBots::index_array<uint8, MAX_SPELL_EFFECTS>)\n+    {\n+        if (spellInfo->_effects[i].IsEffect())\n+        {\n+            switch (spellInfo->_effects[i].Effect)\n+            {\n+                case SPELL_EFFECT_WEAPON_DAMAGE:\n+                case SPELL_EFFECT_WEAPON_DAMAGE_NOSCHOOL:\n+                case SPELL_EFFECT_NORMALIZED_WEAPON_DMG:\n+                case SPELL_EFFECT_WEAPON_PERCENT_DAMAGE:\n+                case SPELL_EFFECT_SCHOOL_DAMAGE:\n+                case SPELL_EFFECT_ENVIRONMENTAL_DAMAGE:\n+                case SPELL_EFFECT_HEALTH_LEECH:\n+                    return true;\n+                default:\n+                    break;\n+            }\n+        }\n+    }\n+\n+    return false;\n+}\n+\n+bool bot_ai::IsImmunedToMySpellEffect(Unit const* unit, SpellInfo const* spellInfo, SpellEffIndex index) const\n+{\n+    return unit->IsImmunedToSpellEffect(spellInfo, spellInfo->GetEffect(index), me);\n+}\n+\n+//CONTESTED PVP\n+bool bot_ai::IsContestedPvP() const\n+{\n+    return me->HasUnitState(UNIT_STATE_ATTACK_PLAYER);\n+}\n+void bot_ai::SetContestedPvP()\n+{\n+    _contestedPvPTimer = 30000;\n+    if (!me->HasUnitState(UNIT_STATE_ATTACK_PLAYER))\n+    {\n+        me->AddUnitState(UNIT_STATE_ATTACK_PLAYER);\n+        Bcore::AIRelocationNotifier notifier(*me);\n+        Cell::VisitWorldObjects(me, notifier, me->GetVisibilityRange());\n+    }\n+    if (botPet && !botPet->HasUnitState(UNIT_STATE_ATTACK_PLAYER))\n+    {\n+        botPet->AddUnitState(UNIT_STATE_ATTACK_PLAYER);\n+        Bcore::AIRelocationNotifier notifier(*botPet);\n+        Cell::VisitWorldObjects(me, notifier, me->GetVisibilityRange());\n+    }\n+}\n+void bot_ai::ResetContestedPvP()\n+{\n+    _contestedPvPTimer = 0;\n+    me->ClearUnitState(UNIT_STATE_ATTACK_PLAYER);\n+    if (botPet && botPet->HasUnitState(UNIT_STATE_ATTACK_PLAYER))\n+        botPet->ClearUnitState(UNIT_STATE_ATTACK_PLAYER);\n+}\n+void bot_ai::UpdateContestedPvP()\n+{\n+    if (_contestedPvPTimer > 0 && _contestedPvPTimer <= lastdiff && !me->IsInCombat())\n+        ResetContestedPvP();\n+}\n+\n+void bot_ai::SetGroup(Group* group, int8 subgroup)\n+{\n+    if (group == nullptr)\n+        _group.unlink();\n+    else\n+    {\n+        // never use SetGroup without a subgroup unless you specify NULL for group\n+        _group.link(group, me);\n+        _group.setSubGroup((uint8)subgroup);\n+    }\n+\n+    me->UpdateObjectVisibility(false);\n+}\n+void bot_ai::SetBattlegroundOrBattlefieldRaid(Group* group, int8 subgroup)\n+{\n+    SetOriginalGroup(GetGroup(), GetSubGroup());\n+    _group.unlink();\n+    _group.link(group, me);\n+    _group.setSubGroup((uint8)subgroup);\n+}\n+void bot_ai::RemoveFromBattlegroundOrBattlefieldRaid()\n+{\n+    _group.unlink();\n+    if (Group* group = GetOriginalGroup())\n+    {\n+        _group.link(group, me);\n+        _group.setSubGroup(GetOriginalSubGroup());\n+    }\n+    SetOriginalGroup(nullptr, -1);\n+}\n+void bot_ai::SetOriginalGroup(Group* group, int8 subgroup)\n+{\n+    if (group == nullptr)\n+        _originalGroup.unlink();\n+    else\n+    {\n+        _originalGroup.link(group, me);\n+        _originalGroup.setSubGroup((uint8)subgroup);\n+    }\n+}\n+\n+void bot_ai::SendUpdateToOutOfRangeBotGroupMembers()\n+{\n+    _groupUpdateTimer = BOT_GROUP_UPDATE_TIMER;\n+\n+    if (_groupUpdateMask == GROUP_UPDATE_FLAG_NONE)\n+        return;\n+    if (Group* group = GetGroup())\n+        group->UpdateBotOutOfRange(me);\n+\n+    _groupUpdateMask = GROUP_UPDATE_FLAG_NONE;\n+    _auraRaidUpdateMask = 0;\n+    if (botPet)\n+        botPet->GetBotPetAI()->ResetAuraUpdateMaskForRaid();\n+}\n+\n+//BATTLEGROUNDS\n+bool bot_ai::IsFlagCarrier(Unit const* unit, BattlegroundTypeId bgTypeId)\n+{\n+    if (unit->IsInWorld() && unit->GetMap()->IsBattleground() && unit->HasAuraType(SPELL_AURA_EFFECT_IMMUNITY))\n+    {\n+        uint32 spellId = unit->GetAuraEffectsByType(SPELL_AURA_EFFECT_IMMUNITY).front()->GetBase()->GetId();\n+        switch (bgTypeId)\n+        {\n+            case BATTLEGROUND_TYPE_NONE: //must contain all possible checks\n+                switch (spellId)\n+                {\n+                    case 23333: // Warsong Flag (WSG)\n+                    case 23335: // Silverwing Flag (WSG)\n+                    case BG_EY_NETHERSTORM_FLAG_SPELL: // Nethersorm Flag (EY)\n+                        return true;\n+                    default:\n+                        break;\n+                }\n+                break;\n+            case BATTLEGROUND_AV:\n+                break;\n+            case BATTLEGROUND_WS:\n+                switch (spellId)\n+                {\n+                    case 23333: // Warsong Flag (WSG)\n+                    case 23335: // Silverwing Flag (WSG)\n+                        return true;\n+                    default:\n+                        break;\n+                }\n+                break;\n+            case BATTLEGROUND_AB:\n+                break;\n+            case BATTLEGROUND_EY:\n+                switch (spellId)\n+                {\n+                    case BG_EY_NETHERSTORM_FLAG_SPELL:\n+                        return true;\n+                    default:\n+                        break;\n+                }\n+                break;\n+            case BATTLEGROUND_SA:\n+            case BATTLEGROUND_IC:\n+            default:\n+                break;\n+        }\n+    }\n+\n+    return false;\n+}\n+\n+//DEDICATED EVENTS\n+//INSTANCES\n+bool FrozenThronePlatformDestructionEvent::Execute(uint64 /*e_time*/, uint32 /*p_time*/)\n+{\n+    std::vector<Creature*> bots_to_push;\n+    bots_to_push.reserve(MAX_GROUP_SIZE * 5);\n+    for (MapReference const& ref : GetScript()->instance->GetPlayers())\n+    {\n+        if (Player const* player = ref.GetSource())\n+        {\n+            if (player->HaveBot())\n+            {\n+                for (auto const& [_, bot] : *player->GetBotMgr()->GetBotMap())\n+                {\n+                    if (bot && bot->IsAlive() && bot->IsInMap(player) && bot->CanFreeMove())\n+                    {\n+                        float dist = bot->GetExactDist2d(_platform_pos);\n+                        if (dist > 46 && dist < 100 && bot->GetPositionZ() > _platform_pos.GetPositionZ() + 3.0f && bot->GetPositionZ() < _platform_pos.GetPositionZ() + 20.0f)\n+                            bots_to_push.push_back(bot);\n+                    }\n+                }\n+            }\n+        }\n+    }\n+\n+    if (!bots_to_push.empty())\n+    {\n+        float knock_src_dist = 10.0f;\n+        float speed_xy = 35.0f;\n+        float speed_z = 12.0f;\n+\n+        for (Creature* bot : bots_to_push)\n+        {\n+            float knockback_angle = Position::NormalizeOrientation(bot->GetAbsoluteAngle(_platform_pos) + float(M_PI));\n+            float knockback_x = bot->GetPositionX() + knock_src_dist * std::cos(knockback_angle);\n+            float knockback_y = bot->GetPositionY() + knock_src_dist * std::sin(knockback_angle);\n+            bot->GetMotionMaster()->MoveKnockbackFrom(knockback_x, knockback_y, speed_xy, speed_z);\n+            bot->m_Events.AddEventAtOffset([=]() { bot->CastSpell(bot, 6869, true); }, 1600ms); // Fall Down\n+        }\n+    }\n+\n+    return true;\n+}\n+\n+#ifdef _MSC_VER\n+# pragma warning(pop)\n+#endif\ndiff --git a/src/server/game/AI/NpcBots/bot_ai.h b/src/server/game/AI/NpcBots/bot_ai.h\nnew file mode 100644\nindex 0000000000..2d6f6345c1\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bot_ai.h\n@@ -0,0 +1,860 @@\n+#ifndef BOT_AI_H\n+#define BOT_AI_H\n+\n+#include \"botcommon.h\"\n+\n+#include \"CreatureAI.h\"\n+#include \"EventProcessor.h\"\n+#include \"GroupReference.h\"\n+#include \"ItemDefines.h\"\n+#include \"Position.h\"\n+\n+#include <queue>\n+#include <tuple>\n+\n+/*\n+NpcBot System by Trickerer (onlysuffering@gmail.com)\n+*/\n+\n+class TeleportHomeEvent;\n+class TeleportFinishEvent;\n+class AwaitStateRemovalEvent;\n+\n+enum CombatRating : uint8;\n+enum EnchantmentSlot : uint16;\n+enum GossipOptionIcon : uint8;\n+enum MeleeHitOutcome : uint8;\n+enum WeaponAttackType : uint8;\n+\n+struct CleanDamage;\n+struct CalcDamageInfo;\n+struct ItemTemplate;\n+struct NpcBotData;\n+struct NpcBotExtras;\n+struct PlayerClassLevelInfo;\n+struct SpellNonMeleeDamage;\n+\n+class Aura;\n+class Battleground;\n+class DamageInfo;\n+class GameObject;\n+class Group;\n+class Item;\n+class Spell;\n+class SpellCastTargets;\n+class Unit;\n+class Vehicle;\n+class WanderNode;\n+\n+using AoeSafeSpotsVec = std::vector<Position>;\n+\n+class bot_ai : public CreatureAI\n+{\n+public:\n+    virtual ~bot_ai();\n+\n+    bool canUpdate{true};\n+\n+    void InitializeAI() override;\n+    //void Reset() override { }\n+\n+    NpcBotData const* GetBotData() const { return _botData; }\n+    NpcBotExtras const* GetBotExtras() const { return _botExtras; }\n+\n+    void JustDied(Unit*) override;\n+    void KilledUnit(Unit* u) override;\n+    void AttackStart(Unit* u) override;\n+    void JustEnteredCombat(Unit* u) override;\n+    void MoveInLineOfSight(Unit* u) override;\n+    void DamageDealt(Unit* victim, uint32& damage, DamageEffectType damageType) override;\n+    //void DamageTaken(Unit* /*attacker*/, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo*/) override { }\n+    void ReceiveEmote(Player* player, uint32 emote) override;\n+    void EnterEvadeMode(EvadeReason/* why*/ = EVADE_REASON_OTHER) override { }\n+    //void LeavingWorld() override { }\n+    void OnSpellStart(SpellInfo const* spellInfo) override { OnBotSpellStart(spellInfo); }\n+    void OnDeath(Unit* attacker = nullptr);\n+    //bool CanRespawn() override { return IAmFree(); }\n+\n+    virtual void OnBotSummon(Creature* /*summon*/) {}\n+    virtual void OnBotDespawn(Creature* /*summon*/) {}\n+\n+    virtual void UnsummonAll(bool /*savePets*/ = true) {}\n+    void UnsummonCreature(Creature* creature, bool save);\n+    void UnsummonPet(bool save);\n+    template<typename C>\n+    requires std::is_pointer_v<typename C::value_type>\n+    void UnsummonCreatures(C const& container, bool save)\n+    {\n+        C c2 = container; // copy; original container might get modified from within the loop\n+        for (auto c : c2)\n+            UnsummonCreature(c, save);\n+    }\n+\n+    virtual void OnBotDamageTaken(Unit* /*attacker*/, uint32 /*damage*/, CleanDamage const* /*cleanDamage*/, DamageEffectType /*damagetype*/, SpellInfo const* /*spellInfo*/) {}\n+    virtual void OnBotDamageDealt(Unit* /*victim*/, uint32 /*damage*/, CleanDamage const* /*cleanDamage*/, DamageEffectType /*damagetype*/, SpellInfo const* /*spellInfo*/) {}\n+    virtual void OnBotDispelDealt(Unit* /*dispelled*/, uint8 /*num*/) {}\n+\n+    bool OnGossipHello(Player* player) override;\n+    bool OnGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override;\n+    bool OnGossipSelectCode(Player* player, uint32 menuId, uint32 gossipListId, char const* code) override;\n+\n+    virtual void OnBotEnterVehicle(Vehicle const* /*vehicle*/);\n+    virtual void OnBotExitVehicle(Vehicle const* /*vehicle*/);\n+    virtual void AfterBotOwnerEnterVehicle();\n+    virtual void OnBotOwnerEnterVehicle(Vehicle const* /*vehicle*/);\n+    virtual void OnBotOwnerExitVehicle(Vehicle const* /*vehicle*/);\n+\n+    Unit* SpawnVehicle(uint32 creEntry, uint32 vehEntry);\n+    void ChooseVehicleForEncounter(uint32 &creEntry, uint32 &vehEntry) const;\n+\n+    static Position GetAbsoluteTransportPosition(WorldObject const* object);\n+\n+    static const std::string& LocalizedNpcText(Player const* forPlayer, uint32 textId);\n+\n+    bool OnGossipHello(Player* player, uint32 option);\n+    bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action);\n+    bool OnGossipSelectCode(Player* player, Creature* creature, uint32 sender, uint32 action, char const* code);\n+\n+    Creature* GetBotsPet() const { return botPet; }\n+\n+    void Evade();\n+    void GetNextEvadeMovePoint(Position& pos, bool& use_path) const;\n+\n+    EventProcessor* GetEvents() { return &Events; }\n+    ObjectGuid::LowType GetBotOwnerGuid() const;\n+    bool HasSharedOwner(ObjectGuid::LowType guid_low) const;\n+    bool HasOwner(ObjectGuid::LowType guid_low) const;\n+    Player* GetBotOwner() const { return master; }\n+    bool SetBotOwner(Player* newowner);\n+    void CheckOwnerExpiry();\n+    uint8 GetBotClass() const { return _botclass; }\n+    uint32 GetLastDiff() const { return lastdiff; }\n+    virtual void UpdateDeadAI(uint32 diff);\n+    void ReturnHome() { _atHome = false; }\n+    void CommonTimers(uint32 diff);\n+    void ResetBotAI(uint8 resetType);\n+    void KillEvents(bool force);\n+    void BotMovement(BotMovementType type, Position const* pos, Unit* target = nullptr, bool generatePath = true, float speed = 0.0f) const;\n+    bool CanBotMoveVehicle() const;\n+    void MoveToSendPosition(uint32 point_id);\n+    void MoveToSendPosition(Position const& mpos);\n+    void MoveToLastSendPosition() { MoveToSendPosition(sendlastpos); }\n+    void MarkSendPosition(uint32 point_id);\n+    void SetBotCommandState(uint32 st, bool force = false, Position* newpos = nullptr, float* speed = nullptr);\n+    void RemoveBotCommandState(uint32 st);\n+    bool HasBotCommandState(uint32 st) const { return (_botCommandState & st); }\n+    void SetBotAwaitState(uint8 state);\n+    inline void RemoveBotAwaitState(uint8 state) { _botAwaitState &= ~state; }\n+    inline bool HasBotAwaitState(uint8 state) const { return !!(_botAwaitState & state); }\n+    void EventRemoveBotAwaitState(uint8 state);\n+    void AbortAwaitStateRemoval();\n+    uint32 GetBotCommandState() const { return _botCommandState; }\n+    bool IsInBotParty(Unit const* unit) const;\n+    bool IsInBotParty(ObjectGuid guid) const;\n+    bool CanBotAttack(Unit const* target, int8 byspell = 0, bool secondary = false) const;\n+    bool CanBotAttackOnVehicle() const;\n+    void ApplyBotDamageMultiplierMelee(uint32& damage, CalcDamageInfo& damageinfo) const;\n+    void ApplyBotDamageMultiplierMelee(int32& damage, SpellNonMeleeDamage& damageinfo, SpellInfo const* spellInfo, WeaponAttackType attackType, bool iscrit) const;\n+    void ApplyBotDamageMultiplierSpell(int32& damage, SpellNonMeleeDamage& damageinfo, SpellInfo const* spellInfo, WeaponAttackType attackType, bool iscrit) const;\n+    void ApplyBotDamageMultiplierHeal(Unit const* victim, float& heal, SpellInfo const* spellInfo, DamageEffectType damagetype, uint32 stack) const;\n+    void ApplyBotCritMultiplierAll(Unit const* victim, float& crit_chance, SpellInfo const* spellInfo, SpellSchoolMask schoolMask, WeaponAttackType attackType) const;\n+    void ApplyBotSpellCostMods(SpellInfo const* spellInfo, int32& cost) const;\n+    void ApplyBotSpellCastTimeMods(SpellInfo const* spellInfo, int32& casttime) const;\n+    void ApplyBotSpellNotLoseCastTimeMods(SpellInfo const* spellInfo, int32& delayReduce) const;\n+    void ApplyBotSpellCooldownMods(SpellInfo const* spellInfo, uint32& cooldown) const;\n+    void ApplyBotSpellCategoryCooldownMods(SpellInfo const* spellInfo, uint32& cooldown) const;\n+    void ApplyBotSpellGlobalCooldownMods(SpellInfo const* spellInfo, float& cooldown) const;\n+    void ApplyBotSpellRadiusMods(SpellInfo const* spellInfo, float& radius) const;\n+    void ApplyBotSpellRangeMods(SpellInfo const* spellInfo, float& maxrange) const;\n+    void ApplyBotSpellMaxTargetsMods(SpellInfo const* spellInfo, uint32& targets) const;\n+    void ApplyBotSpellChanceOfSuccessMods(SpellInfo const* spellInfo, float& chance) const;\n+    void ApplyBotEffectMods(SpellInfo const* spellInfo, uint8 effIndex, float& value) const;\n+    void ApplyBotThreatMods(SpellInfo const* spellInfo, float& threat) const;\n+    void ApplyBotEffectValueMultiplierMods(SpellInfo const* spellInfo, SpellEffIndex effIndex, float& multiplier) const;\n+    virtual uint8 GetBotStance() const;\n+    uint32 GetBotRoles() const { return _roleMask; }\n+    bool HasRole(uint32 role) const { return _roleMask & role; }\n+    GossipOptionIcon GetRoleIcon(uint32 role) const;\n+    static uint32 GetRoleString(uint32 role);\n+    void ToggleRole(uint32 role, bool force);\n+    static uint32 DefaultRolesForClass(uint8 m_class, uint8 spec);\n+    bool IsTank(Unit const* unit = nullptr) const;\n+    bool IsOffTank(Unit const* unit = nullptr) const;\n+\n+    uint32 GetLastZoneId() const { return _lastZoneId; }\n+    bool IsInHeroicOrRaid() const;\n+\n+    bool IAmFree() const;\n+\n+    //wandering bots\n+    bool IsWanderer() const { return _wanderer; }\n+    void SetWanderer();\n+    static bool IsWanderNodeAvailableForBotFaction(WanderNode const* wp, uint32 factionTemplateId, bool teleport, bool spawn = false);\n+    WanderNode const* GetClosestWanderNode() const;\n+    WanderNode const* GetNextWanderNode(Position const* fromPos, uint8 lvl, bool random) const;\n+    WanderNode const* GetNextTravelNode(Position const* from, bool random) const;\n+    WanderNode const* GetNextBGTravelNode() const;\n+    void OnWanderNodeReached();\n+    void OnBotEnterBattleground();\n+\n+    Group* GetGroup() { return _group.getTarget(); }\n+    Group const* GetGroup() const { return _group.getTarget(); }\n+    void SetGroup(Group* group, int8 subgroup);\n+    uint8 GetSubGroup() const { return _group.getSubGroup(); }\n+    void SetSubGroup(uint8 subgroup) { _group.setSubGroup(subgroup); }\n+    void SetGroupUpdateFlag(uint32 flag) { _groupUpdateMask |= flag; }\n+    uint32 GetGroupUpdateFlag() const { return _groupUpdateMask; }\n+    uint64 GetAuraUpdateMaskForRaid() const { return _auraRaidUpdateMask; }\n+    void SetAuraUpdateMaskForRaid(uint8 slot) { _auraRaidUpdateMask |= (uint64(1) << slot); }\n+    void ResetAuraUpdateMaskForRaid() { _auraRaidUpdateMask = 0; }\n+    void SendUpdateToOutOfRangeBotGroupMembers();\n+    void SetBattlegroundOrBattlefieldRaid(Group* group, int8 subgroup);\n+    void RemoveFromBattlegroundOrBattlefieldRaid();\n+    Group* GetOriginalGroup() const { return _originalGroup.getTarget(); }\n+    void SetOriginalGroup(Group* group, int8 subgroup);\n+    uint8 GetOriginalSubGroup() const { return _originalGroup.getSubGroup(); }\n+    void SetOriginalSubGroup(uint8 subgroup) { _originalGroup.setSubGroup(subgroup); }\n+\n+    Battleground* GetBG() const { return _bg; }\n+    void SetBG(Battleground* bg) { _bg = bg; }\n+\n+    static bool CCed(Unit const* target, bool root = false);\n+\n+    void TeleportHomeStart(bool reset);\n+    void TeleportHome(bool reset);\n+    bool FinishTeleport(bool reset);\n+\n+    bool IsDuringTeleport() const { return teleFinishEvent || teleHomeEvent || _duringTeleport; }\n+    void SetTeleportFinishEvent(TeleportFinishEvent* tfevent) { ASSERT(!teleFinishEvent); teleFinishEvent = tfevent; }\n+    void AbortTeleport();\n+    void SetIsDuringTeleport(bool value) { _duringTeleport = value; }\n+\n+    uint8 GetPlayerClass() const;\n+    uint8 GetPlayerRace() const;\n+\n+    bool IsTempBot() const;\n+    bool IsSharedBot() const;\n+    bool CanAppearInWorld() const;\n+\n+    void SetShouldUpdateStats() { shouldUpdateStats = true; }\n+    void UpdateHealth() { doHealth = true; }\n+    void UpdateMana() { doMana = true; }\n+\n+    //float GetHitRating() const { return hit; }\n+    int32 GetHaste() const { return haste; }\n+    float GetBotParryChance() const { return parry; }\n+    float GetBotDodgeChance() const { return dodge; }\n+    float GetBotBlockChance() const { return block; }\n+    float GetBotCritChance() const { return crit; }\n+    float GetBotMissChance() const { return -hit; }\n+    float GetBotDamageTakenMod(bool magic) const { return magic ? dmg_taken_mag : dmg_taken_phy; }\n+    float GetBotResilience() const { return resilience; }\n+    uint32 GetBotExpertise() const { return expertise; }\n+    uint32 GetBotSpellPenetration() const { return spellpen; }\n+    uint32 GetBotSpellPower() const { return spellpower; }\n+    uint32 GetBotDefense() const { return defense; }\n+    uint32 GetShieldBlockValue() const { return blockvalue; }\n+    int32 GetBotResistanceBonus(SpellSchoolMask mask) const;\n+    int32 GetBotResistanceBonus(uint8 school) const { return (school > SPELL_SCHOOL_NORMAL && school < MAX_SPELL_SCHOOL) ? resistbonus[school-1] : 0; }\n+    bool CanBlock() const;\n+    bool CanParry() const;\n+    bool CanDodge() const;\n+    bool CanCrit() const;\n+    bool CanMiss() const;\n+    bool CanSheath() const;\n+    bool CanSit() const;\n+    virtual bool CanEat() const;\n+    bool CanDrink() const;\n+    bool CanRegenInCombat() const;\n+    bool CanMount() const;\n+    bool CanUseAmmo() const;\n+    bool RespectEquipsAttackTime() const;\n+    bool CanChangeEquip(uint8 slot) const;\n+    bool CanDisplayNonWeaponEquipmentChanges() const;\n+    bool IsValidTransmog(uint8 slot, ItemTemplate const* source) const;\n+    virtual bool CanSeeEveryone() const { return false; }\n+    virtual float GetBotArmorPenetrationCoef() const { return armor_pen; }\n+    void InitMiscValues();\n+    void ResetAllMiscValues();\n+    virtual uint32 GetAIMiscValue(uint32 /*data*/) const { return 0; }\n+    virtual void SetAIMiscValue(uint32 data, uint32 value);\n+    uint8 GetBotComboPoints() const;\n+    float GetBotAmmoDPS() const;\n+\n+    MeleeHitOutcome BotRollCustomMeleeOutcomeAgainst(Unit const* victim, WeaponAttackType attType) const;\n+\n+    float GetTotalBotStat(BotStatMods stat) const { return _getTotalBotStat(stat); }\n+\n+    Item* GetEquips(uint8 slot) const { return _equips[slot]; }\n+    Item* GetEquipsByGuid(ObjectGuid itemGuid) const;\n+    uint32 GetEquipDisplayId(uint8 slot) const;\n+    [[nodiscard]] BotEquipResult UnEquipAll(ObjectGuid receiver, bool store_to_bank);\n+    uint8 GetRealEquippedItemsCount() const;\n+    bool HasRealEquipment() const { return !!GetRealEquippedItemsCount(); }\n+    float GetAverageItemLevel() const;\n+    std::pair<float, float> GetBotGearScores() const;\n+\n+    void CastBotItemCombatSpell(DamageInfo const& damageInfo);\n+    void CastBotItemCombatSpell(DamageInfo const& damageInfo, Item* item, ItemTemplate const* proto);\n+    void OnBotSpellStart(SpellInfo const* spellInfo);\n+    void OnBotSpellInterrupted(SpellSchoolMask schoolMask, uint32 unTimeMs);\n+    void OnBotSpellGo(Spell const* spell, bool ok = true);\n+    void OnBotOwnerSpellGo(Spell const* spell, bool ok = true);\n+    void OnBotChannelFinish(Spell const* spell);\n+    void OnOwnerVehicleDamagedBy(Unit* attacker);\n+    void OnAttackStop(Unit const* target);\n+    virtual void OnClassSpellStart(SpellInfo const* /*spellInfo*/) {}\n+    virtual void OnClassSpellGo(SpellInfo const* /*spell*/) {}\n+    virtual void OnClassChannelFinish(Spell const* /*spell*/) {}\n+\n+    void SpawnKillReward(Player* looter) const;\n+    void FillKillReward(GameObject* go) const;\n+\n+    uint32 GetReviveTimer() const { return _reviveTimer; }\n+    void SetReviveTimer(uint32 newtime) { _reviveTimer = newtime; }\n+    void UpdateReviveTimer(uint32 diff);\n+    uint32 GetSelfRezSpell() const { return _selfrez_spell_id; }\n+\n+    uint32 GetEngageTimer() const { return _engageTimer; }\n+    void ResetEngageTimer(uint32 delay);\n+\n+    uint8 GetHealHpPctThreshold() const { return _healHpPctThreshold; }\n+    void SetHealHpPctThreshold(uint8 threshold) { _healHpPctThreshold = threshold; }\n+\n+    bool HasSpell(uint32 basespell) const;\n+    uint32 GetBaseSpell(std::string_view spell_name, LocaleConstant locale) const;\n+    uint32 GetSpellCooldown(uint32 basespell) const;\n+    bool IsSpellReady(uint32 basespell, uint32 diff, bool checkGCD = true) const;\n+    void SetSpellCooldown(uint32 basespell, uint32 msCooldown);\n+    void SetSpellCategoryCooldown(SpellInfo const* spellInfo, uint32 msCooldown);\n+    void ReleaseSpellCooldown(uint32 basespell);\n+\n+    virtual void SpendRunes(SpellInfo const* /*spellInfo*/, bool /*didHit*/) {}\n+\n+    void ReInitFaction() { InitFaction(); }\n+    void SetSpec(uint8 spec, bool activate = true);\n+    uint8 GetSpec() const;\n+    static uint8 SelectSpecForClass(uint8 m_class);\n+    static uint32 TextForSpec(uint8 spec);\n+    static bool IsValidSpecForClass(uint8 m_class, uint8 spec);\n+\n+    static bool IsBotClassMask(uint8 m_class, uint32 class_mask) { return !!((1ull << m_class) & class_mask); }\n+    static bool IsMeleeClass(uint8 m_class);\n+    static bool IsTankingClass(uint8 m_class);\n+    static bool IsBlockingClass(uint8 m_class);\n+    static bool IsCastingClass(uint8 m_class);\n+    static bool IsHealingClass(uint8 m_class);\n+    static bool IsHumanoidClass(uint8 m_class);\n+    static bool IsHeroExClass(uint8 m_class);\n+\n+    AoeSpotsVec const& GetAoeSpots() const;\n+    static void CalculateAoeSpots(Unit const* unit, AoeSpotsVec& spots);\n+    AoeSafeSpotsVec CalculateAoeSafeSpots(Unit* target, float maxdist) const;\n+\n+    //Pet stuff\n+    static uint32 GetPetOriginalEntry(uint32 entry);\n+    static bool IsPetMelee(uint32 entry);\n+    virtual uint8 GetPetPositionNumber(Creature const* /*summon*/) const { return 0; }\n+\n+    Unit* HelpFindStunTarget(float dist = 20) const { return FindStunTarget(dist); }\n+    Unit* HelpFindCastingTarget(float maxdist = 10, float mindist = 0, uint32 spellId = 0, uint8 minHpPct = 0) const { return FindCastingTarget(maxdist, mindist, spellId, minHpPct); }\n+    Unit* HelpFindAOETarget(float dist, WorldObject const* src) const { return FindAOETarget(dist, src); }\n+    void HelpGetNearbyTargetsList(std::list<Unit*> &targets, float maxdist, uint8 CCoption, WorldObject const* source = nullptr) const { GetNearbyTargetsList(targets, maxdist, CCoption, source); }\n+\n+    bool IsPointedTarget(Unit const* target, uint8 targetFlags) const;\n+    bool IsPointedHealTarget(Unit const* target) const;\n+    bool IsPointedTankingTarget(Unit const* target) const;\n+    bool IsPointedOffTankingTarget(Unit const* target) const;\n+    bool IsPointedDPSTarget(Unit const* target) const;\n+    bool IsPointedRangedDPSTarget(Unit const* target) const;\n+    bool IsPointedNoDPSTarget(Unit const* target) const;\n+    bool IsPointedAnyAttackTarget(Unit const* target) const;\n+\n+    static bool IsDamagingSpell(SpellInfo const* spellInfo);\n+\n+    bool IsImmunedToMySpellEffect(Unit const* unit, SpellInfo const* spellInfo, SpellEffIndex index) const;\n+\n+    bool IsContestedPvP() const;\n+    void SetContestedPvP();\n+    void ResetContestedPvP();\n+    void UpdateContestedPvP();\n+\n+    static bool IsFlagCarrier(Unit const* unit, BattlegroundTypeId bgTypeId = BATTLEGROUND_TYPE_NONE);\n+\n+protected:\n+    explicit bot_ai(Creature* creature);\n+\n+    virtual void ReduceCD(uint32 /*diff*/) {}\n+    bool GlobalUpdate(uint32 diff);\n+\n+    virtual bool HealTarget(Unit* /*target*/, uint32 /*diff*/) { return false; }\n+    virtual bool BuffTarget(Unit* /*target*/, uint32 /*diff*/) { return false; }\n+\n+    void BuffAndHealGroup(uint32 diff);\n+    void ResurrectGroup(uint32 REZZ);\n+    void CureGroup(uint32 cureSpell, uint32 diff);\n+    void SetStats(bool force);\n+    void DefaultInit();\n+    void InitUnitFlags(); // call only in constructor\n+\n+    void OnOwnerDamagedBy(Unit* attacker);\n+\n+    static uint32 InitSpell(Unit const* caster, uint32 spell);\n+    void InitSpellMap(uint32 basespell, bool forceadd = false, bool forwardRank = true);\n+    uint32 GetSpell(uint32 basespell) const;\n+    void ResetSpellCooldown(uint32 basespell) { SetSpellCooldown(basespell, 0); }\n+    void RemoveSpell(uint32 basespell);\n+    //void RemoveAllSpells();\n+    void EnableAllSpells(bool save);\n+    void SpellTimers(uint32 diff);\n+    static uint32 RaceSpellForClass(uint8 myrace, uint8 myclass);\n+\n+    virtual bool CanUseManually(uint32 /*basespell*/) const { return false; }\n+    virtual bool HasAbilitiesSpecifics() const { return false; }\n+    virtual void FillAbilitiesSpecifics(Player const* /*player*/, std::list<std::string> &/*specList*/) {}\n+\n+    virtual std::vector<uint32> const* GetDamagingSpellsList() const { return nullptr; }\n+    virtual std::vector<uint32> const* GetCCSpellsList() const       { return nullptr; }\n+    virtual std::vector<uint32> const* GetHealingSpellsList() const  { return nullptr; }\n+    virtual std::vector<uint32> const* GetSupportSpellsList() const  { return nullptr; }\n+\n+    uint32 GetDPSTaken(Unit const* u) const;\n+    int32 GetHPSTaken(Unit const* u) const;\n+    int32 GetHPS(Unit const* u) const;\n+    int32 GetHPPCTPS(Unit const* u) const;\n+    uint8 GetExpectedHPPCT(Unit const* u, uint32 mseconds) const;\n+\n+    void RefreshAura(uint32 spellId, int8 count = 1, Unit* target = nullptr) const;\n+    bool CheckAttackTarget();\n+    void MoveBehind(Unit const* target) const;\n+\n+    void OnStartAttack(Unit const* u);\n+    bool StartAttack(Unit const* u, bool force = false);\n+\n+    virtual void BreakCC(uint32 diff);\n+    void CheckRacials(uint32 diff);\n+\n+    void DrinkPotion(bool mana);\n+    bool IsPotionReady() const;\n+    uint32 GetPotion(bool mana) const;\n+\n+    //everything cast-related\n+    bool doCast(Unit* victim, uint32 spellId, bool triggered = false);\n+    bool doCast(Unit* victim, uint32 spellId, TriggerCastFlags flags);\n+    SpellCastResult CheckBotCast(Unit const* victim, uint32 spellId) const;\n+    virtual bool removeShapeshiftForm() { return true; }\n+\n+    bool CanRemoveReflectSpells(Unit const* target, uint32 spellId) const;\n+\n+    bool IsMelee() const;\n+    bool IsRanged() const;\n+\n+    bool IsShootingWand(Unit const* u = nullptr) const;\n+\n+    bool IsChanneling(Unit const* u = nullptr) const;\n+    bool IsCasting(Unit const* u = nullptr) const;\n+    bool JumpingFlyingOrFalling() const;\n+    bool JumpingOrFalling() const;\n+    bool Jumping() const;\n+    bool IsIndoors() const;\n+    bool IsOutdoors() const;\n+    bool IsInContactWithWater() const;\n+\n+    float CalcSpellMaxRange(uint32 spellId, bool enemy = true) const;\n+\n+    static bool IsPeriodicDynObjAOEDamage(SpellInfo const* spellInfo);\n+    bool IsWithinAoERadius(Position const& pos) const;\n+\n+    float InitAttackRange(float origRange, bool ranged) const;\n+    void CalculateAttackPos(Unit* target, Position &pos, bool& force) const;\n+    void GetInPosition(bool force, Unit* newtarget, Position* pos = nullptr);\n+    bool AdjustTankingPosition(Unit const* mytarget) const;\n+    virtual float GetSpellAttackRange(bool longRange) const { return longRange ? 23.f : 15.f; }\n+    virtual void CheckAttackState();\n+    void OnSpellHit(Unit* caster, SpellInfo const* spell);\n+    void OnSpellHitTarget(Unit* /*target*/, SpellInfo const* spell);\n+\n+    //Searchers\n+    WorldObject* GetNearbyRezTarget(float dist = 30) const;\n+    Unit* FindImmunityShieldDispelTarget(float dist = 30) const;\n+    Unit* FindHostileDispelTarget(float dist = 30, bool stealable = false) const;\n+    Unit* FindAffectedTarget(uint32 spellId, ObjectGuid caster = ObjectGuid::Empty, float dist = DEFAULT_VISIBILITY_DISTANCE, uint8 hostile = 0) const;\n+    Unit* FindPolyTarget(float dist = 30) const;\n+    Unit* FindFearTarget(float dist = 30) const;\n+    Unit* FindStunTarget(float dist = 20) const;\n+    Unit* FindUndeadCCTarget(float dist, uint32 spellId, bool unattacked = true) const;\n+    Unit* FindRootTarget(float dist, uint32 spellId) const;\n+    Unit* FindCastingTarget(float maxdist = 10, float mindist = 0, uint32 spellId = 0, uint8 minHpPct = 0) const;\n+    Unit* FindAOETarget(float dist, WorldObject const* src = nullptr) const;\n+    Unit* FindSplashTarget(float dist = 5, Unit* To = nullptr, float splashdist = 4) const;\n+    Unit* FindSplashTarget(float dist, Unit* To, float splashdist, uint8 minTargets) const;\n+    Unit* FindTranquilTarget(float mindist = 5, float maxdist = 35) const;\n+    Unit* FindDistantTauntTarget(float maxdist = 30, bool ally = false) const;\n+    Unit* FindDrainTarget(float maxdist = 30) const;\n+    void GetNearbyTargetsList(std::list<Unit*> &targets, float maxdist, uint8 CCoption, WorldObject const* source = nullptr) const;\n+    void GetNearbyTargetsInConeList(std::list<Unit*> &targets, float maxdist = 10) const;\n+    void GetNearbyFriendlyTargetsList(std::list<Unit*> &targets, float maxdist = 30) const;\n+\n+    //Bot specific player-like mods hooks\n+    //todo remove &damage ApplyClassDamageMultiplierMelee (uint&, CalcDamageInfo&)\n+    virtual void ApplyClassDamageMultiplierMelee(uint32& /*damage*/, CalcDamageInfo& /*damageinfo*/) const {}\n+    virtual void ApplyClassDamageMultiplierMeleeSpell(int32& /*damage*/, SpellNonMeleeDamage& /*damageinfo*/, SpellInfo const* /*spellInfo*/, WeaponAttackType /*attackType*/, bool /*crit*/) const {}\n+    virtual void ApplyClassDamageMultiplierSpell(int32& /*damage*/, SpellNonMeleeDamage& /*damageinfo*/, SpellInfo const* /*spellInfo*/, WeaponAttackType /*attackType*/, bool /*crit*/) const {}\n+    virtual void ApplyClassDamageMultiplierHeal(Unit const* /*victim*/, float& /*heal*/, SpellInfo const* /*spellInfo*/, DamageEffectType /*damagetype*/, uint32 /*stack*/) const {}\n+    virtual void ApplyClassSpellCritMultiplierAll(Unit const* /*victim*/, float& /*crit_chance*/, SpellInfo const* /*spellInfo*/, SpellSchoolMask /*schoolMask*/, WeaponAttackType /*attackType*/) const {}\n+    virtual void ApplyClassSpellCostMods(SpellInfo const* /*spellInfo*/, int32& /*cost*/) const {}\n+    virtual void ApplyClassSpellCastTimeMods(SpellInfo const* /*spellInfo*/, int32& /*casttime*/) const {}\n+    virtual void ApplyClassSpellNotLoseCastTimeMods(SpellInfo const* /*spellInfo*/, int32& /*delayReduce*/) const {}\n+    virtual void ApplyClassSpellCooldownMods(SpellInfo const* /*spellInfo*/, uint32& /*cooldown*/) const {}\n+    virtual void ApplyClassSpellCategoryCooldownMods(SpellInfo const* /*spellInfo*/, uint32& /*cooldown*/) const {}\n+    virtual void ApplyClassSpellGlobalCooldownMods(SpellInfo const* /*spellInfo*/, float& /*cooldown*/) const {}\n+    virtual void ApplyClassSpellRadiusMods(SpellInfo const* /*spellInfo*/, float& /*radius*/) const {}\n+    virtual void ApplyClassSpellRangeMods(SpellInfo const* /*spellInfo*/, float& /*maxrange*/) const {}\n+    virtual void ApplyClassSpellMaxTargetsMods(SpellInfo const* /*spellInfo*/, uint32& /*targets*/) const {}\n+    virtual void ApplyClassSpellChanceOfSuccessMods(SpellInfo const* /*spellInfo*/, float& /*chance*/) const {}\n+    virtual void ApplyClassEffectMods(SpellInfo const* /*spellInfo*/, uint8 /*effIndex*/, float& /*value*/) const {}\n+    virtual void ApplyClassThreatMods(SpellInfo const* /*spellInfo*/, float& /*threat*/) const {}\n+    virtual void ApplyClassEffectValueMultiplierMods(SpellInfo const* /*spellInfo*/, SpellEffIndex /*effIndex*/, float& /*multiplier*/) const {}\n+\n+    virtual void InitPowers() {}\n+    virtual void InitSpells() = 0;\n+    virtual void ApplyClassPassives() const = 0;\n+    virtual void InitHeals() {}\n+\n+    void Regenerate();\n+    void RegenerateEnergy();\n+    bool Feasting() const;\n+    uint32 GetRation(bool drink) const;\n+\n+    bool Wait();\n+    uint16 Rand() const { return _rand; }\n+    void GenerateRand();\n+\n+    static uint32 GetLostHP(Unit const* unit);\n+    static uint8 GetHealthPCT(Unit const* u);\n+    static uint8 GetManaPCT(Unit const* u);\n+\n+    virtual MeleeHitOutcome GetNextAttackMeleeOutCome() const;\n+\n+    //event helpers\n+    void BotJumpInPlaceInFrontOf(Position const* pos, float speedXY, float maxHeight);\n+    void DismountBot();\n+\n+    void BotSay(std::string_view text, Player const* target = nullptr) const;\n+    void BotWhisper(std::string_view text, Player const* target = nullptr) const;\n+    void BotYell(std::string_view text, Player const* target = nullptr) const;\n+\n+    void ReportSpellCast(uint32 spellId, const std::string& followedByString, Player const* target) const;\n+\n+    void ApplyItemEnchantment(Item* item, EnchantmentSlot eslot, uint8 slot);\n+    void RemoveItemClassEnchantment(uint8 slot);\n+\n+    bool HasAuraTypeWithValueAtLeast(AuraType auratype, int32 minvalue, Unit const* unit = nullptr) const;\n+\n+    void DoSkytalonVehicleStrats(uint32 diff);\n+    void DoRubyDrakeVehicleStrats(uint32 diff);\n+    void DoEmeraldDrakeVehicleStrats(uint32 diff);\n+    void DoAmberDrakeVehicleStrats(uint32 diff);\n+    void DoArgentMountVehicleStrats(uint32 diff);\n+    void DoDemolisherVehicleStrats(uint32 diff);\n+    void DoSiegeEngineVehicleStrats(uint32 diff);\n+    void DoChopperVehicleStrats(uint32 diff);\n+    void DoGenericVehicleStrats(uint32 diff);\n+    void DoVehicleStrats(BotVehicleStrats strat, uint32 diff);\n+    void DoVehicleActions(uint32 diff);\n+    bool CheckVehicleAttackTarget(BotVehicleStrats /*strat*/);\n+    bool HasVehicleRoleOverride(uint32 role) const;\n+    float GetVehicleAttackDistanceOverride() const;\n+    uint8 LivingVehiclesCount(uint32 entry = 0) const;\n+\n+    bool ProcessImmediateNonAttackTarget();\n+\n+    static bool IsUsableItem(Item const* item);\n+    uint32 GetItemSpellCooldown(uint32 spellid) const;\n+    void CheckUsableItems(uint32 diff);\n+\n+    uint32 GetLastWMOArea() const { return _lastWMOAreaId; }\n+\n+    uint8 _botclass{};\n+    uint8 _spec{};\n+    uint8 _newspec{};\n+    int8 _primaryIconTank{-1};\n+    int8 _primaryIconDamage{-1};\n+\n+    Player* master{};\n+    Player* _prevRRobin{};\n+    Unit* opponent{};\n+    Unit* disttarget{};\n+    Creature* botPet{};\n+    EventProcessor Events;\n+    ObjectGuid aftercastTargetGuid;\n+    uint32 GC_Timer{};\n+\n+private:\n+    void FindMaster();\n+    uint32 CalculateOwnershipCheckTime();\n+\n+    void _OnHealthUpdate() const;\n+    void _OnManaUpdate() const;\n+    void _OnManaRegenUpdate() const;\n+\n+    void _UpdateWMOArea();\n+    void _OnZoneUpdate(uint32 zoneId, uint32 areaId);\n+    void _OnAreaUpdate(uint32 areaId);\n+\n+    void RemoveItemBonuses(uint8 slot);\n+    void RemoveItemEnchantments(Item const* item);\n+    void RemoveItemEnchantment(Item const* item, EnchantmentSlot eslot);\n+    void RemoveItemClassEnchantments();\n+    void ApplyItemBonuses(uint8 slot);\n+    void ApplyItemEnchantments(Item* item, uint8 slot);\n+    void ApplyItemEquipSpells(Item* item, bool apply);\n+    void ApplyItemEquipEnchantmentSpells(Item* item);\n+    void ApplyItemSetBonuses(Item* item, bool apply);\n+    void ApplyItemsSpells();\n+\n+    bool IsPotionSpell(uint32 spellId) const;\n+    void StartPotionTimer();\n+\n+    void BotJump(Position const* pos, bool count = true);\n+    bool UpdateImpossibleChase(Unit const* target);\n+    void ResetChaseTimer(Position const* pos);\n+    void ResetChase(Position const* pos);\n+\n+    void ApplyRacials();\n+    void InitRoles();\n+    void InitSpec();\n+    void InitEquips();\n+    void InitFaction();\n+    void InitRace();\n+\n+    bool _canCureTarget(Unit const* target, uint32 cureSpell) const;\n+    void _getBotDispellableAuraList(Unit const* target, uint32 dispelMask, std::list<Aura const*> &dispelList) const;\n+    void _calculatePos(Unit const* followUnit, Position& pos, float* speed = nullptr) const;\n+    uint32 _selectMountSpell() const;\n+    void _updateMountedState();\n+    void _updateStandState() const;\n+    void _updateRations();\n+    void _updateEquips(uint8 slot, Item* item);\n+\n+    uint32 _getLootQualityMask() const;\n+    uint32 _getLootQualityThreshold() const;\n+    bool _canLootItemForPlayer(Player* player, Creature* creature, uint8 slot) const;\n+    bool _canLootCreatureForPlayer(Player* player, Creature* creature, uint32 lootQualityMask, uint32 lootThreshold) const;\n+    bool _canLootCreature(Creature* creature) const;\n+    void _autoLootCreatureGold(Creature* creature) const;\n+    void _autoLootCreatureItems(Player* receiver, Creature* creature, uint32 lootQualityMask, uint32 lootThreshold) const;\n+    void _autoLootCreature(Creature* creature);\n+\n+    bool _canUseOffHand(ItemTemplate const* with = nullptr, bool ignore_mh = false) const;\n+    bool _canUseRanged() const;\n+    bool _canUseRelic() const;\n+    bool _canCombineWeapons(ItemTemplate const* mh, ItemTemplate const* oh) const;\n+    bool _canEquip(ItemTemplate const* newProto, uint8 slot, bool ignoreItemLevel, Item const* newItem = nullptr, bool ignore_combine = false) const;\n+    void _removeEquipment(uint8 slot);\n+    bool _isItemFitForWanderingBot(uint8 slot, ItemTemplate const* proto) const;\n+    [[nodiscard]] BotEquipResult _unequip(uint8 slot, ObjectGuid receiver, bool store_to_bank, bool on_equip_from_bank = false);\n+    [[nodiscard]] BotEquipResult _equip(uint8 slot, Item* newItem, ObjectGuid receiver, bool store_to_bank, bool from_bank = false);\n+    [[nodiscard]] BotEquipResult _resetEquipment(uint8 slot, ObjectGuid receiver, bool store_to_bank);\n+\n+    void _castBotItemUseSpell(Item const* item, SpellCastTargets const& targets/*, uint8 cast_count = 0, uint32 glyphIndex = 0*/);\n+\n+    std::tuple<Unit*, Unit*> _getTargets(bool byspell, bool ranged, bool &reset) const;\n+    Unit* _getVehicleTarget(BotVehicleStrats strat) const;\n+    void _listAuras(Player const* player, Unit const* unit) const;\n+    bool _checkImmunities(Unit const* target, SpellInfo const* spellInfo) const;\n+    static float _getAttackDistance(float distance) { return distance*0.72f; }\n+    void _extendAttackRange(float& dist) const;\n+    bool _canSwitchToTarget(Unit const* from, Unit const* newTarget, int8 byspell) const;\n+\n+    //for moved\n+    void GetHomePosition(uint16& mapid, Position* pos) const;\n+\n+    //utilities\n+    void _AddItemTemplateLink(Player const* forPlayer, ItemTemplate const* item, std::ostringstream &str) const;\n+    void _AddItemLink(Player const* forPlayer, Item const* item, std::ostringstream &str, bool addIcon = true) const;\n+    void _AddQuestLink(Player const* forPlayer, Quest const* quest, std::ostringstream &str) const;\n+    void _AddWeaponSkillLink(Player const* forPlayer, SpellInfo const* spellInfo, std::ostringstream &str, uint32 skillid) const;\n+    void _AddSpellLink(Player const* forPlayer, SpellInfo const* spellInfo, std::ostringstream &str, bool color = true) const;\n+    void _AddProfessionLink(Player const* forPlayer, SpellInfo const* spellInfo, std::ostringstream &str, uint32 skillId) const;\n+    void _LocalizeItem(Player const* forPlayer, std::string &itemName, uint32 entry) const;\n+    void _LocalizeItem(Player const* forPlayer, std::string &itemName, std::string &suffix, Item const* item) const;\n+    void _LocalizeQuest(Player const* forPlayer, std::string &questTitle, uint32 entry) const;\n+    void _LocalizeCreature(Player const* forPlayer, std::string &creatureName, uint32 entry) const;\n+    void _LocalizeGameObject(Player const* forPlayer, std::string &gameobjectName, uint32 entry) const;\n+    void _LocalizeSpell(Player const* forPlayer, std::string &spellName, uint32 entry) const;\n+\n+    float _getBotStat(uint8 slot, BotStatMods stat) const;\n+    float _getTotalBotStat(BotStatMods stat) const;\n+    float _getRatingMultiplier(CombatRating cr) const;\n+\n+    float _getStatScore(uint8 stat) const;\n+    float _getItemGearStatScore(ItemTemplate const* iproto, uint8 forslot, Item const* item) const;\n+\n+    void _saveStats();\n+\n+    NpcBotData* const _botData;\n+    NpcBotExtras const* const _botExtras;\n+\n+    SpellInfo const* m_botSpellInfo{};\n+    Position homepos{}, movepos{}, attackpos{}, sendlastpos{};\n+    Position sendpos[MAX_SEND_POINTS]{};\n+    AoeSpotsVec _aoeSpots;\n+\n+    uint32 _botCommandState{};\n+    uint8 _botAwaitState{};\n+\n+    uint16 _rand{};\n+\n+    //stats\n+    float hit{}, parry{}, dodge{}, block{}, crit{}, armor_pen{}, resilience{};\n+    float dmg_taken_phy{1.f}, dmg_taken_mag{1.f};\n+    uint32 expertise{}, spellpower{}, spellpen{}, defense{};\n+    uint32 blockvalue{1};\n+    int32 haste{};\n+    int32 resistbonus[MAX_SPELL_SCHOOL - 1]{};\n+\n+    //timers\n+    uint32 _reviveTimer{}, _powersTimer{}, _chaseTimer{}, _engageTimer{}, _potionTimer{};\n+    uint32 lastdiff{}, checkAurasTimer{}, roleTimer{}, ordersTimer{}, regenTimer{}, _updateTimerLong{}, _updateTimerMedium{}, _updateTimerEx1{}, _updateTimerEx2{};\n+    uint32 _checkOwershipTimer{}, _checkMasterTimer{};\n+    uint32 _moveBehindTimer{};\n+    uint32 _rentTimer{};\n+    uint32 _wmoAreaUpdateTimer{};\n+    uint32 waitTimer{};\n+    uint32 itemsAutouseTimer{};\n+    uint32 evadeDelayTimer{};\n+    uint32 indoorsTimer{};\n+    uint32 outdoorsTimer{};\n+    uint32 _contestedPvPTimer{};\n+    uint32 _groupUpdateTimer{BOT_GROUP_UPDATE_TIMER};\n+    //save timers\n+    uint32 _saveDisabledSpellsTimer{};\n+    uint32 _saveMiscValuesTimer{};\n+\n+    uint32 _lastZoneId{}, _lastAreaId{}, _lastWMOAreaId{};\n+    uint32 _selfrez_spell_id{};\n+\n+    uint8 _unreachableCount{};\n+    uint8 _jumpCount{};\n+    uint8 _evadeCount{};\n+    uint8 _healHpPctThreshold{95u};\n+    uint32 _roleMask{};\n+    uint32 _usableItemSlotsMask{};\n+    ObjectGuid _lastTargetGuid;\n+\n+    BotVehicleStrats _curVehStrat{};\n+    uint8 _vehcomboPoints{};\n+    bool shouldEnterVehicle{};\n+\n+    bool doHealth{}, doMana{}, shouldUpdateStats{};\n+    bool feast_health{}, feast_mana{};\n+    bool spawned{};\n+    bool firstspawn{true};\n+    bool _evadeMode{};\n+    bool _atHome{true};\n+    bool _duringTeleport{};\n+    bool _canAppearInWorld{};\n+\n+    //save flags\n+    bool _saveDisabledSpells{};\n+    bool _saveMiscValues{};\n+\n+    //wandering bots\n+    bool _wanderer{};\n+    uint8 _baseLevel{};\n+    WanderNode const* _travel_node_last{};\n+    WanderNode const* _travel_node_cur{};\n+\n+    uint32 _groupUpdateMask{};\n+    uint64 _auraRaidUpdateMask{};\n+    GroupBotReference _group;\n+    GroupBotReference _originalGroup;\n+    Battleground* _bg{};\n+\n+    float _energyFraction{};\n+\n+    //counters (this session)\n+    uint16 _deathsCount{};\n+    uint16 _killsCount{};\n+    uint16 _pvpKillsCount{};\n+    uint16 _playerKillsCount{};\n+\n+    TeleportHomeEvent* teleHomeEvent{};\n+    TeleportFinishEvent* teleFinishEvent{};\n+    AwaitStateRemovalEvent* awaitStateRemEvent{};\n+\n+    struct BotSpell\n+    {\n+        BotSpell() = default;\n+        BotSpell(BotSpell const&) = delete;\n+        BotSpell(BotSpell&&) = delete;\n+        BotSpell& operator=(BotSpell const&) = delete;\n+        BotSpell& operator=(BotSpell&&) = delete;\n+        uint32 spellId = 0;\n+        uint32 cooldown = 0;\n+        bool enabled = true;\n+    };\n+\n+    int32 _stats[BOT_INVENTORY_SIZE][MAX_BOT_ITEM_MOD]{};\n+    std::array<Item*, BOT_INVENTORY_SIZE> _equips{};\n+\n+public:\n+    using BotSpellMap = std::unordered_map<uint32 /*firstrankspellid*/, BotSpell /*spell*/>;\n+    BotSpellMap const& GetSpellMap() const { return _spells; }\n+\n+protected:\n+    BotSpellMap& GetSpellMap() { return _spells; }\n+\n+private:\n+    BotSpellMap _spells;\n+\n+public:\n+    //much simplier than SmartAI I guess...\n+    struct BotOrder\n+    {\n+        friend class bot_ai;\n+\n+        union\n+        {\n+            struct\n+            {\n+                ObjectGuid targetGuid;\n+                uint32 baseSpell;\n+            } spellCastParams;\n+\n+            struct\n+            {\n+                ObjectGuid targetGuid;\n+            } pullParams;\n+\n+        } params;\n+\n+        explicit BotOrder(BotOrderTypes order_type, uint32 timeout_sec = 10) : params{}, _type(order_type), _timeout(time(0) + timeout_sec) {}\n+        BotOrder(BotOrder&&) noexcept = default;\n+\n+        BotOrder(BotOrder const&) = delete;\n+        BotOrder& operator=(BotOrder const&) = delete;\n+        BotOrder& operator=(BotOrder&&) = delete;\n+\n+    private:\n+        BotOrderTypes _type;\n+        time_t _timeout;\n+    };\n+\n+    bool HasOrders() const { return !_orders.empty(); }\n+    bool IsLastOrder(BotOrderTypes order_type, uint32 param1 = 0, ObjectGuid guidparam1 = ObjectGuid::Empty) const;\n+    std::size_t GetOrdersCount() const { return _orders.size(); }\n+    bool AddOrder(BotOrder&& order);\n+    void CancelOrder(BotOrder const& order);\n+    void CompleteOrder(BotOrder const& order);\n+    void CancelAllOrders();\n+\n+private:\n+    void _ProcessOrders();\n+\n+    using OrdersQueue = std::queue<BotOrder>;\n+    OrdersQueue _orders;\n+};\n+\n+#endif\ndiff --git a/src/server/game/AI/NpcBots/bot_archmage_ai.cpp b/src/server/game/AI/NpcBots/bot_archmage_ai.cpp\nnew file mode 100644\nindex 0000000000..83b2804bb7\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bot_archmage_ai.cpp\n@@ -0,0 +1,391 @@\n+#include \"bot_ai.h\"\n+#include \"botspell.h\"\n+#include \"bottraits.h\"\n+#include \"MotionMaster.h\"\n+#include \"Player.h\"\n+#include \"ScriptMgr.h\"\n+#include \"Spell.h\"\n+#include \"SpellAuras.h\"\n+#include \"TemporarySummon.h\"\n+#include \"World.h\"\n+/*\n+Archmage NpcBot (by Trickerer onlysuffering@gmail.com)\n+Description:\n+Archmage (Warcraft III tribute)\n+Abilities:\n+1) Fireball: main attack, single target, no mana cost\n+2) Blizzard: typical blizzard\n+3) Summon Water Elemental: summons a water elemental to attack archmage's enemies\n+Complete - 75%\n+TODO: mass tele\n+*/\n+\n+enum ArchmageBaseSpells\n+{\n+    MAIN_ATTACK_1           = SPELL_FIREBALL,\n+    BLIZZARD_1              = SPELL_BLIZZARD,\n+    SUMMON_WATER_ELEMENTAL_1= SPELL_SUMMON_WATER_ELEMENTAL\n+};\n+enum ArchmagePassives\n+{\n+    BRILLIANCE_AURA         = SPELL_BRILLIANCE_AURA\n+};\n+enum ArchmageSpecial\n+{\n+    MH_ATTACK_ANIM          = SPELL_ATTACK_MELEE_1H,\n+\n+    SUMMON_ELEM_COST        = 125 * 5,\n+\n+    ARCHMAGE_MOUNTID        = 2402\n+};\n+\n+static const std::vector<uint32> Archmage_spells_damage{ MAIN_ATTACK_1, BLIZZARD_1 };\n+static const std::vector<uint32> Archmage_spells_support{ SUMMON_WATER_ELEMENTAL_1 };\n+\n+class archmage_bot : public CreatureScript\n+{\n+public:\n+    archmage_bot() : CreatureScript(\"archmage_bot\") { }\n+\n+    CreatureAI* GetAI(Creature* creature) const override\n+    {\n+        return new archmage_botAI(creature);\n+    }\n+\n+    struct archmage_botAI : public bot_ai\n+    {\n+        archmage_botAI(Creature* creature) : bot_ai(creature)\n+        {\n+            _botclass = BOT_CLASS_ARCHMAGE;\n+\n+            InitUnitFlags();\n+\n+            //archmage immunities\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_POSSESS, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_CHARM, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_SILENCE, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_SHAPESHIFT, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_TRANSFORM, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_BLOCK_SPELL_FAMILY, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_POLYMORPH, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_INTERRUPT, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SILENCE, true);\n+        }\n+\n+        bool doCast(Unit* victim, uint32 spellId)\n+        {\n+            if (CheckBotCast(victim, spellId) != SPELL_CAST_OK)\n+                return false;\n+            return bot_ai::doCast(victim, spellId);\n+        }\n+\n+        void StartAttack(Unit* u, bool force = false)\n+        {\n+            if (!bot_ai::StartAttack(u, force))\n+                return;\n+            GetInPosition(force, u);\n+        }\n+\n+        void JustEnteredCombat(Unit* u) override { bot_ai::JustEnteredCombat(u); }\n+        void AttackStart(Unit*) override { }\n+        void KilledUnit(Unit* u) override { bot_ai::KilledUnit(u); }\n+        void EnterEvadeMode(EvadeReason why = EVADE_REASON_OTHER) override { bot_ai::EnterEvadeMode(why); }\n+        void MoveInLineOfSight(Unit* u) override { bot_ai::MoveInLineOfSight(u); }\n+        void JustDied(Unit* u) override { UnsummonAll(false); bot_ai::JustDied(u); }\n+        void DoNonCombatActions(uint32 /*diff*/) { }\n+\n+        void CheckAura(uint32 diff)\n+        {\n+            if (checkAuraTimer > diff || GC_Timer > diff || IsCasting())\n+                return;\n+\n+            checkAuraTimer = 10000;\n+\n+            if (!IAmFree() && !me->HasAura(BRILLIANCE_AURA, me->GetGUID()))\n+                RefreshAura(BRILLIANCE_AURA);\n+        }\n+\n+        void UpdateAI(uint32 diff) override\n+        {\n+            if (!me->IsMounted() && !me->GetVehicle())\n+                me->Mount(ARCHMAGE_MOUNTID);\n+\n+            if (!GlobalUpdate(diff))\n+                return;\n+\n+            DoVehicleActions(diff);\n+            if (!CanBotAttackOnVehicle())\n+                return;\n+\n+            CheckAura(diff);\n+\n+            if (IsPotionReady())\n+            {\n+                if (me->GetPower(POWER_MANA) < SUMMON_ELEM_COST)\n+                    DrinkPotion(true);\n+                else if (GetHealthPCT(me) < 50)\n+                    DrinkPotion(false);\n+            }\n+\n+            //pet is killed or unreachable\n+            if (IsSpellReady(SUMMON_WATER_ELEMENTAL_1, diff, false) && me->GetPower(POWER_MANA) >= SUMMON_ELEM_COST && !IsCasting() &&\n+                (IAmFree() || master->IsInCombat()/* || !master->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_RESTING)*/) &&\n+                (!botPet || me->GetDistance2d(botPet) > sWorld->GetMaxVisibleDistanceOnContinents()))\n+            {\n+                me->CastSpell(me, GetSpell(SUMMON_WATER_ELEMENTAL_1), false);\n+                return;\n+            }\n+\n+            if (ProcessImmediateNonAttackTarget())\n+                return;\n+\n+            if (!CheckAttackTarget())\n+                return;\n+\n+            if (IsCasting())\n+                return;\n+\n+            CheckUsableItems(diff);\n+\n+            Attack(diff);\n+        }\n+\n+        void Attack(uint32 diff)\n+        {\n+            Unit* mytar = opponent ? opponent : disttarget ? disttarget : nullptr;\n+            if (!mytar)\n+                return;\n+\n+            StartAttack(mytar, IsMelee());\n+\n+            CheckAttackState();\n+            if (!me->IsAlive() || !mytar->IsAlive())\n+                return;\n+\n+            MoveBehind(mytar);\n+\n+            if (!HasRole(BOT_ROLE_DPS))\n+                return;\n+\n+            if (GC_Timer > diff)\n+                return;\n+\n+            //Blizzard\n+            if (IsSpellReady(BLIZZARD_1, diff) && !JumpingOrFalling() && Rand() < 50)\n+            {\n+                if (Unit* blizztarget = FindAOETarget(CalcSpellMaxRange(BLIZZARD_1)))\n+                {\n+                    if (doCast(blizztarget, GetSpell(BLIZZARD_1)))\n+                        return;\n+                }\n+\n+                SetSpellCooldown(BLIZZARD_1, 1000); //fail\n+            }\n+\n+            if (IsSpellReady(MAIN_ATTACK_1, diff) && CanAffectVictimAny(mytar, SPELL_SCHOOL_FIRE, SPELL_SCHOOL_ARCANE))\n+            {\n+                if (doCast(mytar, GetSpell(MAIN_ATTACK_1)))\n+                    return;\n+            }\n+        }\n+\n+        void ApplyClassDamageMultiplierSpell(int32& damage, SpellNonMeleeDamage& /*damageinfo*/, SpellInfo const* spellInfo, WeaponAttackType /*attackType*/, bool iscrit) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //uint8 lvl = me->GetLevel();\n+            float fdamage = float(damage);\n+\n+            //apply bonus damage mods\n+            float pctbonus = 1.0f;\n+            if (iscrit)\n+                pctbonus *= 1.333f;\n+\n+            if (baseId == MAIN_ATTACK_1 || baseId == BLIZZARD_1)\n+                fdamage += me->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_MAGIC) * (spellInfo->_effects[0].BonusCoefficient - 1.f) * me->CalculateDefaultCoefficient(spellInfo, SPELL_DIRECT_DAMAGE) * me->CalculateSpellpowerCoefficientLevelPenalty(spellInfo);\n+\n+            damage = int32(fdamage * pctbonus);\n+        }\n+\n+        void OnClassSpellGo(SpellInfo const* spellInfo) override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+\n+            if (baseId == MAIN_ATTACK_1 || baseId == BLIZZARD_1)\n+                GC_Timer = uint32(me->GetAttackTime(BASE_ATTACK) * me->m_modAttackSpeedPct[BASE_ATTACK]);\n+\n+            if (baseId == MAIN_ATTACK_1)\n+                me->CastSpell(me, MH_ATTACK_ANIM, true);\n+\n+            if (baseId == SUMMON_WATER_ELEMENTAL_1)\n+                SummonBotPet();\n+        }\n+\n+        void SpellHitTarget(WorldObject* wtarget, SpellInfo const* spell) override\n+        {\n+            Unit* target = wtarget->ToUnit();\n+            if (!target)\n+                return;\n+\n+            OnSpellHitTarget(target, spell);\n+        }\n+\n+        void SpellHit(WorldObject* wcaster, SpellInfo const* spell) override\n+        {\n+            Unit* caster = wcaster->ToUnit();\n+            if (!caster)\n+                return;\n+\n+            OnSpellHit(caster, spell);\n+        }\n+\n+        void DamageDealt(Unit* victim, uint32& damage, DamageEffectType damageType) override\n+        {\n+            bot_ai::DamageDealt(victim, damage, damageType);\n+        }\n+\n+        void DamageTaken(Unit* u, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo*/) override\n+        {\n+            if (!u)\n+                return;\n+            if (!u->IsInCombat() && !me->IsInCombat())\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void OwnerAttackedBy(Unit* u) override\n+        {\n+            if (!u)\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void SummonBotPet()\n+        {\n+            if (botPet)\n+                UnsummonAll(false);\n+\n+            uint32 entry = BOT_PET_AWATER_ELEMENTAL;\n+\n+            Position pos;\n+\n+            //water elemetal 1 minute duration\n+            Creature* myPet = me->SummonCreature(entry, *me, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5s);\n+            me->GetNearPoint(myPet, pos.m_positionX, pos.m_positionY, pos.m_positionZ, 2, me->GetOrientation());\n+            myPet->GetMotionMaster()->MovePoint(me->GetMapId(), pos);\n+            myPet->SetCreator(master);\n+            myPet->SetOwnerGUID(me->GetGUID());\n+            myPet->SetFaction(master->GetFaction());\n+            myPet->SetControlledByPlayer(!IAmFree());\n+            myPet->SetPvP(me->IsPvP());\n+            myPet->SetByteValue(UNIT_FIELD_BYTES_2, 1, master->GetByteValue(UNIT_FIELD_BYTES_2, 1));\n+            myPet->SetUInt32Value(UNIT_CREATED_BY_SPELL, SUMMON_WATER_ELEMENTAL_1);\n+\n+            botPet = myPet;\n+        }\n+\n+        void UnsummonAll(bool savePets = true) override\n+        {\n+            UnsummonPet(savePets);\n+        }\n+\n+        void SummonedCreatureDies(Creature* /*summon*/, Unit* /*killer*/) override\n+        {\n+        }\n+\n+        void SummonedCreatureDespawn(Creature* summon) override\n+        {\n+            //BOT_LOG_ERROR(\"entities.unit\", \"SummonedCreatureDespawn: {}'s {}\", me->GetName(), summon->GetName());\n+            if (summon == botPet)\n+                botPet = nullptr;\n+        }\n+\n+        uint32 GetAIMiscValue(uint32 data) const override\n+        {\n+            switch (data)\n+            {\n+                case BOTAI_MISC_PET_TYPE:\n+                    return BOT_PET_AWATER_ELEMENTAL;\n+                default:\n+                    return 0;\n+            }\n+        }\n+\n+        void CheckAttackState() override\n+        {\n+        }\n+\n+        void OnBotEnterVehicle(Vehicle const* vehicle) override\n+        {\n+            me->Dismount();\n+            bot_ai::OnBotEnterVehicle(vehicle);\n+        }\n+\n+        void Reset() override\n+        {\n+            UnsummonAll(false);\n+\n+            checkAuraTimer = 0;\n+\n+            DefaultInit();\n+        }\n+\n+        void ReduceCD(uint32 diff) override\n+        {\n+            if (checkAuraTimer > diff)              checkAuraTimer -= diff;\n+        }\n+\n+        void InitPowers() override\n+        {\n+            me->SetPowerType(POWER_MANA);\n+        }\n+\n+        void InitSpells() override\n+        {\n+            InitSpellMap(MAIN_ATTACK_1, true, false);\n+            InitSpellMap(BLIZZARD_1, true, false);\n+            InitSpellMap(SUMMON_WATER_ELEMENTAL_1, true, false);\n+        }\n+\n+        void ApplyClassPassives() const override\n+        {\n+        }\n+\n+        bool CanUseManually(uint32 basespell) const override\n+        {\n+            switch (basespell)\n+            {\n+                case BLIZZARD_1:\n+                case SUMMON_WATER_ELEMENTAL_1:\n+                    return true;\n+                default:\n+                    return false;\n+            }\n+        }\n+\n+        std::vector<uint32> const* GetDamagingSpellsList() const override\n+        {\n+            return &Archmage_spells_damage;\n+        }\n+        //std::vector<uint32> const* GetCCSpellsList() const override\n+        //{\n+        //    return &Archmage_spells_cc;\n+        //}\n+        //std::vector<uint32> const* GetHealingSpellsList() const override\n+        //{\n+        //    return &Archmage_spells_heal;\n+        //}\n+        std::vector<uint32> const* GetSupportSpellsList() const override\n+        {\n+            return &Archmage_spells_support;\n+        }\n+\n+    private:\n+\n+        uint32 checkAuraTimer;\n+    };\n+};\n+\n+void AddSC_archmage_bot()\n+{\n+    new archmage_bot();\n+}\ndiff --git a/src/server/game/AI/NpcBots/bot_bm_ai.cpp b/src/server/game/AI/NpcBots/bot_bm_ai.cpp\nnew file mode 100644\nindex 0000000000..0611932cb9\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bot_bm_ai.cpp\n@@ -0,0 +1,941 @@\n+#include \"bot_ai.h\"\n+#include \"botlogtraits.h\"\n+#include \"botmgr.h\"\n+#include \"botspell.h\"\n+#include \"Log.h\"\n+#include \"MotionMaster.h\"\n+#include \"ObjectAccessor.h\"\n+#include \"Player.h\"\n+#include \"ScriptMgr.h\"\n+#include \"SpellAuras.h\"\n+#include \"TemporarySummon.h\"\n+/*\n+Blademaster NpcBot (by Trickerer onlysuffering@gmail.com)\n+DISABLED: movement mechanics incompatibility\n+Complete - 75%\n+TODO: BLADESTORM, Convert illusions to bot_pet_ai\n+*/\n+\n+#define MAX_ILLUSION_POSITIONS 4\n+#define MIRROR_IMAGE_DURATION 90000\n+\n+enum BlademasterBaseSpells\n+{\n+    WINDWALK_1                              = SPELL_NETHERWALK,\n+    MIRROR_IMAGE_1                          = SPELL_MIRROR_IMAGE_BM,\n+    CRITICAL_STRIKE_1                       = SPELL_CRITICAL_STRIKE\n+};\n+enum BlademasterPassives\n+{\n+//Talents\n+//other\n+};\n+enum BlademasterSpecial\n+{\n+    NPC_MIRROR_IMAGE_BM                     = 70552,\n+    TRANSPARENCY                            = SPELL_TRANSPARENCY_50,\n+    BLACK_COLOR                             = SPELL_VERTEX_COLOR_BLACK,\n+    STUN_FREEZE                             = SPELL_STUN_FREEZE_ANIM,\n+\n+    MIRROR_COST                             = 125 * 5\n+};\n+\n+static const std::vector<uint32> Blademaster_spells_support{ MIRROR_IMAGE_1, WINDWALK_1 };\n+\n+class blademaster_bot : public CreatureScript\n+{\n+public:\n+    blademaster_bot() : CreatureScript(\"blademaster_bot\") { }\n+\n+    CreatureAI* GetAI(Creature* creature) const override\n+    {\n+        return new blademaster_botAI(creature);\n+    }\n+\n+    struct blademaster_botAI : public bot_ai\n+    {\n+    private:\n+        //DelayedMeleeDamageEvent - Blademaster\n+        //deals critical damage, resets attack timer and sends fake log\n+        class DelayedMeleeDamageEvent : public BasicEvent\n+        {\n+            public:\n+                DelayedMeleeDamageEvent(Creature* bot, ObjectGuid targetGuid, bool windwalk) :\n+                  _bot(bot), _targetGuid(targetGuid), _windwalk(windwalk), _dinfo(nullptr) { }\n+\n+                void SetDamageInfo(CalcDamageInfo* dinfo)\n+                {\n+                    _dinfo = dinfo;\n+                }\n+\n+            protected:\n+                bool Execute(uint64 /*e_time*/, uint32 /*p_time*/)\n+                {\n+                    (static_cast<blademaster_botAI*>(_bot->GetAI()))->CriticalStrikeFinish(_targetGuid, _dinfo, _windwalk);\n+\n+                    if (_dinfo)\n+                        delete _dinfo;\n+                    return true;\n+                }\n+\n+            private:\n+                Creature* _bot;\n+                ObjectGuid _targetGuid;\n+                bool _windwalk;\n+                CalcDamageInfo* _dinfo;\n+        };\n+\n+        class EventTerminateEvent : public BasicEvent\n+        {\n+            public:\n+                EventTerminateEvent(Creature* bot) : _bot(bot) { }\n+\n+            protected:\n+                bool Execute(uint64 /*e_time*/, uint32 /*p_time*/)\n+                {\n+                    (static_cast<blademaster_botAI*>(_bot->GetAI()))->TerminateEvent();\n+                    return true;\n+                }\n+\n+            private:\n+                Creature* _bot;\n+        };\n+\n+        class IllusionUnsummonEvent : public BasicEvent\n+        {\n+            public:\n+                IllusionUnsummonEvent(Creature const* bot) : _bot(bot) { }\n+\n+            protected:\n+                bool Execute(uint64 /*e_time*/, uint32 /*p_time*/)\n+                {\n+                    (static_cast<blademaster_botAI*>(_bot->GetAI()))->UnsummonAll(false);\n+\n+                    return true;\n+                }\n+\n+            private:\n+                Creature const* _bot;\n+        };\n+\n+        class DelayedIllusionSummonEvent : public BasicEvent\n+        {\n+            public:\n+                DelayedIllusionSummonEvent(Creature const* bot) : _bot(bot) { }\n+\n+            protected:\n+                bool Execute(uint64 /*e_time*/, uint32 /*p_time*/)\n+                {\n+                    (static_cast<blademaster_botAI*>(_bot->GetAI()))->MirrorImageFinish();\n+\n+                    return true;\n+                }\n+\n+            private:\n+                Creature const* _bot;\n+        };\n+\n+        class DisappearEvent : public BasicEvent\n+        {\n+            public:\n+                DisappearEvent(Creature* bot) : _bot(bot) { }\n+\n+            protected:\n+                bool Execute(uint64 /*e_time*/, uint32 /*p_time*/)\n+                {\n+                    (static_cast<blademaster_botAI*>(_bot->GetAI()))->MirrorImageMid();\n+\n+                    return true;\n+                }\n+\n+            private:\n+                Creature* _bot;\n+        };\n+\n+        void _calcIllusionPositions()\n+        {\n+            float x = me->m_positionX;\n+            float y = me->m_positionY;\n+            float z = me->m_positionZ;\n+            float o = me->GetOrientation();\n+\n+            //X     X\n+            //   C\n+            //X     X\n+            //\n+            //C - caster (Blademaster)\n+            //X - new positions (1-3 illusions + blademaster)\n+\n+            float dist = 3.f; //not too far - 3 for x and y seems to be way to go\n+            for (auto i : NPCBots::index_array<uint8, MAX_ILLUSION_POSITIONS>)\n+            {\n+                _illusPos[i].m_positionX = x + ((i <= 1) ? +dist : -dist); // +2+2-2-2\n+                _illusPos[i].m_positionY = y + (!(i & 1) ? +dist : -dist); // +2-2+2-2\n+                _illusPos[i].m_positionZ = z;\n+                me->UpdateAllowedPositionZ(_illusPos[i].m_positionX, _illusPos[i].m_positionY, _illusPos[i].m_positionZ);\n+                _illusPos[i].SetOrientation(o);\n+            }\n+        }\n+\n+    public:\n+        blademaster_botAI(Creature* creature) : bot_ai(creature)\n+        {\n+            _botclass = BOT_CLASS_BM;\n+\n+            InitUnitFlags();\n+\n+            //Blademaster cannot be disarmed\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_DISARM, true);\n+        }\n+\n+        void IllusionsCheck(uint32 diff)\n+        {\n+            if (!me->IsAlive())\n+                return;\n+            if (Illusions_Check_Timer > diff)\n+                return;\n+\n+            Illusions_Check_Timer = 250;\n+\n+            if (_minions.empty())\n+                return;\n+\n+            for (Creature* ill : _minions)\n+            {\n+                if (!ill)\n+                {\n+                    BOT_LOG_ERROR(\"entities.player\", \"bm_bot::IllusionsCheck(): illusion is not found in world!\");\n+                    continue;\n+                }\n+\n+                ill->SetCanModifyStats(false);\n+                float hpct = ill->GetHealthPct();\n+                float mpct = (float(ill->GetPower(POWER_MANA)) * 100.f) / float(ill->GetMaxPower(POWER_MANA));\n+\n+                ill->SetMaxHealth(me->GetMaxHealth());\n+                ill->SetHealth(uint32(0.5f + float(ill->GetMaxHealth()) * hpct / 100.f));\n+                ill->SetMaxPower(POWER_MANA, me->GetMaxPower(POWER_MANA));\n+                ill->SetPower(POWER_MANA, uint32(0.5f + float(ill->GetMaxPower(POWER_MANA)) * mpct / 100.f));\n+                ill->SetFloatValue(UNIT_FIELD_MINDAMAGE, me->GetFloatValue(UNIT_FIELD_MINDAMAGE));\n+                ill->SetFloatValue(UNIT_FIELD_MAXDAMAGE, me->GetFloatValue(UNIT_FIELD_MAXDAMAGE));\n+                ill->m_modAttackSpeedPct[BASE_ATTACK] = me->m_modAttackSpeedPct[BASE_ATTACK];\n+            }\n+        }\n+\n+        bool doCast(Unit* victim, uint32 spellId)\n+        {\n+            //custom\n+            if (_dmdevent)\n+                return false;\n+            if (IsTempBot()) //Illusion etc.\n+                return false;\n+\n+            if (CheckBotCast(victim, spellId) != SPELL_CAST_OK)\n+                return false;\n+\n+            return bot_ai::doCast(victim, spellId);\n+        }\n+\n+        void UpdateAI(uint32 diff) override\n+        {\n+            IllusionsCheck(diff);\n+\n+            if (!GlobalUpdate(diff))\n+                return;\n+\n+            DoVehicleActions(diff);\n+            if (!CanBotAttackOnVehicle())\n+                return;\n+\n+            if (IsPotionReady() && !IsTempBot())\n+            {\n+                if (me->GetPower(POWER_MANA) < MIRROR_COST)\n+                    DrinkPotion(true);\n+                else if (GetHealthPCT(me) < 50)\n+                    DrinkPotion(false);\n+            }\n+\n+            //CheckRacials(diff);\n+\n+            CheckWindWalk(diff);\n+            CheckMirrorImage(diff);\n+\n+            if (!me->IsInCombat())\n+                DoNonCombatActions(diff);\n+\n+            if (IsCasting())\n+                return;\n+\n+            if (ProcessImmediateNonAttackTarget())\n+                return;\n+\n+            if (!CheckAttackTarget())\n+                return;\n+\n+            CheckUsableItems(diff);\n+\n+            Attack(diff);\n+        }\n+\n+        void StartAttack(Unit* u, bool force = false)\n+        {\n+            if (!bot_ai::StartAttack(u, force))\n+                return;\n+\n+            GetInPosition(force, u);\n+        }\n+\n+        void JustEnteredCombat(Unit* u) override { bot_ai::JustEnteredCombat(u); }\n+        void AttackStart(Unit*) override { }\n+        void KilledUnit(Unit* u) override { bot_ai::KilledUnit(u); }\n+        void EnterEvadeMode(EvadeReason why = EVADE_REASON_OTHER) override { bot_ai::EnterEvadeMode(why); }\n+        void MoveInLineOfSight(Unit* u) override { bot_ai::MoveInLineOfSight(u); }\n+        void DoNonCombatActions(uint32 /*diff*/) { }\n+\n+        bool CanEat() const override { return Windwalk_Timer <= GetLastDiff() && !illusion_Fade; }\n+        bool CanSeeEveryone() const override { return Windwalk_Timer > GetLastDiff(); }\n+\n+        void BreakCC(uint32 diff) override\n+        {\n+            if (me->HasAuraWithMechanic((1u<<MECHANIC_SNARE)|(1u<<MECHANIC_ROOT)))\n+            {\n+                if (IsSpellReady(WINDWALK_1, diff) && !IsTank(me) && Rand() < 30 &&\n+                    doCast(me, GetSpell(WINDWALK_1)))\n+                    return;\n+            }\n+            bot_ai::BreakCC(diff);\n+        }\n+\n+        void Attack(uint32 /*diff*/)\n+        {\n+            Unit* mytar = opponent ? opponent : disttarget ? disttarget : nullptr;\n+            if (!mytar)\n+                return;\n+\n+            StartAttack(mytar, IsMelee());\n+\n+            CheckAttackState();\n+            if (!me->IsAlive() || !mytar->IsAlive())\n+                return;\n+\n+            MoveBehind(mytar);\n+        }\n+\n+        void DoBMMeleeAttackIfReady()\n+        {\n+            //Copied from UnitAI::DoMeleeAttackIfReady() with modifications\n+            //cannot attack while casting or jumping\n+            if (me->HasUnitState(UNIT_STATE_CASTING) || _dmdevent)\n+                return;\n+\n+            Unit* victim = me->GetVictim();\n+            //Make sure our attack is ready and we aren't currently casting before checking distance\n+            if (me->isAttackReady() && me->IsWithinMeleeRange(victim))\n+            {\n+                if (!CCed(me, true) && !JumpingFlyingOrFalling())\n+                {\n+                    //Windwalk strike\n+                    if (Windwalk_Timer > GetLastDiff())\n+                    {\n+                        CriticalStrike(victim, true);\n+                        return;\n+                    }\n+                    //Critical Strike: 15% to deal x2,x3, etc... damage\n+                    else if (criticalStikeMult >= 2 && !CCed(me, true) && roll_chance_f(15.f))\n+                    {\n+                        CriticalStrike(victim);\n+                        return;\n+                    }\n+                }\n+\n+                DoMeleeAttackIfReady();\n+                return;\n+            }\n+        }\n+\n+        void CheckAttackState() override\n+        {\n+            if (me->GetVictim())\n+            {\n+                if (HasRole(BOT_ROLE_DPS))\n+                    DoBMMeleeAttackIfReady();\n+            }\n+        }\n+\n+        void CheckWindWalk(uint32 diff)\n+        {\n+            if (!IsSpellReady(WINDWALK_1, diff) || Windwalk_Timer > GetLastDiff() || illusion_Fade || IsCasting() ||\n+                Rand() > (10 + 20 * (me->IsInCombat() || master->IsInCombat())))\n+                return;\n+\n+            if (!IAmFree() && master->isMoving())\n+            {\n+                if (me->GetDistance(master) > 30 &&\n+                    doCast(me, GetSpell(WINDWALK_1)))\n+                    return;\n+\n+                return;\n+            }\n+\n+            if (!IsTank(me))\n+            {\n+                //unit to strike\n+                Unit* u = IsMelee() ? me->GetVictim() : nullptr;\n+\n+                if ((u && u->isMoving() && me->GetDistance(u) > 18 &&\n+                    (u->GetVictim() != me || u->getAttackers().size() > uint8(u->IsControlledByPlayer() ? 0 : 1))) ||\n+                    me->getAttackers().size() > 2)\n+                {\n+                    if (doCast(me, GetSpell(WINDWALK_1)))\n+                        return;\n+                }\n+            }\n+        }\n+\n+        void CheckMirrorImage(uint32 diff)\n+        {\n+            //only for controlled bot\n+            //if (IAmFree())\n+            //    return;\n+            if (!IsSpellReady(MIRROR_IMAGE_1, diff) || !me->IsInCombat() || !illusionsCount || illusion_Fade ||\n+                !HasRole(BOT_ROLE_DPS) || IsCasting() || Rand() > 20)\n+                return;\n+\n+            uint8 pct = GetHealthPCT(me);\n+            uint8 size = uint8(me->getAttackers().size());\n+            if (!size)\n+                return;\n+\n+            if (pct > 25 && (size > 3 || pct < (80 + size * 5)))\n+                if (doCast(me, GetSpell(MIRROR_IMAGE_1)))\n+                    return;\n+        }\n+\n+        void MirrorImageStart()\n+        {\n+            if (!illusionsCount)\n+                return;\n+\n+            ASSERT(!illusion_Fade);\n+            illusion_Fade = true;\n+\n+            //OKAY\n+\n+            //destroy existing illusions if any\n+            UnsummonAll(false);\n+            //mirror image renders BM invulnerable for a short period of time,\n+            //removing all but passive auras\n+            Unit::AuraMap const auras = me->GetOwnedAuras(); //copy\n+            for (auto const& [_, aura] : auras)\n+            {\n+                if (aura->GetSpellInfo()->Attributes & SPELL_ATTR0_PASSIVE)\n+                    continue;\n+                if (aura->GetId() == SPELL_BURNING_BLADE_BLADEMASTER)\n+                    continue;\n+                AuraApplication* aurApp = aura->GetApplicationOfTarget(me->GetGUID());\n+                if (!aurApp)\n+                    continue;\n+                me->RemoveAura(aurApp, AURA_REMOVE_BY_DEFAULT);\n+            }\n+\n+            me->BotStopMovement();\n+            me->AttackStop();\n+            me->HandleEmoteCommand(EMOTE_ONESHOT_NONE);\n+            me->AddAura(BLACK_COLOR, me);//color\n+            me->AddAura(STUN_FREEZE, me);//stop/immunity\n+\n+            //prepare to disappear\n+            DisappearEvent* devent = new DisappearEvent(me);\n+            Events.AddEvent(devent, Events.CalculateTime(std::chrono::milliseconds(300))); //immediatelly (almost)\n+        }\n+\n+        void MirrorImageMid()\n+        {\n+            if (!me->IsInWorld() ||\n+                !me->IsAlive()/* || CCed(me)*/) //this is just ensurance\n+            {\n+                me->RemoveAura(BLACK_COLOR);\n+                me->RemoveAura(STUN_FREEZE);\n+                illusion_Fade = false;\n+                return;\n+            }\n+            //disappear\n+            me->SetPhaseMask(0, true);\n+\n+            //INVISIBLE!\n+            //EVENT\n+            DelayedIllusionSummonEvent* disevent = new DelayedIllusionSummonEvent(me);\n+            Events.AddEvent(disevent, Events.CalculateTime(std::chrono::milliseconds(1250))); //1000 ms disappear time + 250 ms buffer\n+        }\n+\n+        void MirrorImageFinish()\n+        {\n+            illusion_Fade = false;\n+            me->RemoveAura(BLACK_COLOR);\n+            me->RemoveAura(STUN_FREEZE);\n+            if (!me->IsInWorld() ||\n+                !me->IsAlive()/* || CCed(me)*/) //this is just ensurance\n+                return;\n+\n+            _calcIllusionPositions();\n+\n+            uint8 usedpos_mask = 0;\n+\n+            for (uint8 i = 0; i != illusionsCount; ++i)\n+            {\n+                Creature* illusion = me->SummonCreature(NPC_MIRROR_IMAGE_BM, *me, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 50ms);\n+                if (!illusion)\n+                    continue;\n+\n+                if (!IAmFree())\n+                    ASSERT(master->GetBotMgr()->AddBot(illusion));\n+\n+                illusion->SetCreator(master); //TempSummon* Map::SummonCreature()\n+                (static_cast<blademaster_botAI*>(illusion->GetAI()))->SetGUID(me->GetGUID());\n+\n+                //copy visuals\n+                //illusion->SetEntry(me->GetEntry());\n+                illusion->UpdateEntry(me->GetEntry());\n+                illusion->SetFaction(me->GetFaction());\n+                illusion->SetLevel(me->GetLevel());\n+                illusion->SetDisplayId(me->GetDisplayId());\n+                illusion->SetNativeDisplayId(me->GetDisplayId());\n+                illusion->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, me->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0));\n+\n+                //copy stats\n+                illusion->SetCanModifyStats(false);\n+                illusion->SetMaxHealth(me->GetMaxHealth());\n+                illusion->SetHealth(me->GetHealth());\n+                illusion->SetMaxPower(POWER_MANA, me->GetMaxPower(POWER_MANA));\n+                illusion->SetPower(POWER_MANA, me->GetPower(POWER_MANA));\n+                illusion->SetFloatValue(UNIT_FIELD_MINDAMAGE, me->GetFloatValue(UNIT_FIELD_MINDAMAGE));\n+                illusion->SetFloatValue(UNIT_FIELD_MAXDAMAGE, me->GetFloatValue(UNIT_FIELD_MAXDAMAGE));\n+                illusion->m_modAttackSpeedPct[BASE_ATTACK] = me->m_modAttackSpeedPct[BASE_ATTACK];\n+\n+                illusion->BotStopMovement();\n+                while (true)\n+                {\n+                    //move illusion to a random corner\n+                    uint8 j = urand(0, MAX_ILLUSION_POSITIONS - 1);\n+                    uint8 pos_mask = 1u << j;\n+                    if (!(usedpos_mask & pos_mask))\n+                    {\n+                        illusion->GetMotionMaster()->MovePoint(me->GetMapId(), _illusPos[j]);\n+                        //illusion->Relocate(_illusPos[j]);\n+                        usedpos_mask |= pos_mask;\n+                        break;\n+                    }\n+                }\n+\n+                illusion->GetBotAI()->SetBotCommandState(BOT_COMMAND_COMBATRESET);\n+\n+                _minions.insert(illusion);\n+            }\n+\n+            SetBotCommandState(BOT_COMMAND_COMBATRESET);\n+\n+            for (auto i : NPCBots::index_array<uint8, MAX_ILLUSION_POSITIONS>)\n+            {\n+                if (!(usedpos_mask & (1u << i)))\n+                {\n+                    //me->BotStopMovement();\n+                    me->GetMotionMaster()->MovePoint(me->GetMapId(), _illusPos[i]);\n+                    //me->Relocate(_illusPos[i]);\n+                    //usedposs.insert(i);\n+                    break;\n+                }\n+            }\n+\n+            uint8 counter = 0;\n+            uint8 r = urand(0, uint8(_minions.size() - 1));\n+            uint32 phaseMask = IAmFree() ? PHASEMASK_NORMAL : master->GetPhaseMask();\n+\n+            for (Creature* illusion : _minions)\n+            {\n+                illusion->SetPhaseMask(phaseMask, true);\n+\n+                if (counter == r)\n+                    me->SetPhaseMask(phaseMask, true);\n+                else\n+                    ++counter;\n+            }\n+\n+            me->GetCombatManager().EndAllPvECombat();\n+\n+            if (me->GetPhaseMask() != phaseMask)\n+                me->SetPhaseMask(phaseMask, true);\n+\n+            //me->setAttackTimer(BASE_ATTACK, 3000);\n+            //waitTimer += 800;\n+            SetSpellCooldown(MIRROR_IMAGE_1, 8000);\n+\n+            //EVENT\n+            IllusionUnsummonEvent* unsevent = new IllusionUnsummonEvent(me);\n+            Events.AddEvent(unsevent, Events.CalculateTime(std::chrono::milliseconds(MIRROR_IMAGE_DURATION)));\n+        }\n+\n+        void CriticalStrike(Unit* target, bool windwalk = false)\n+        {\n+            //Okay critical strike must have jump and strike animation, doing delayed damage\n+            _dmdevent = new DelayedMeleeDamageEvent(me, target->GetGUID(), windwalk);\n+\n+            //hack temp attack damage calc\n+            float mindam = me->GetFloatValue(UNIT_FIELD_MINDAMAGE);\n+            float maxdam = me->GetFloatValue(UNIT_FIELD_MAXDAMAGE);\n+\n+            if (windwalk)\n+            {\n+                me->SetFloatValue(UNIT_FIELD_MINDAMAGE, mindam * 1.5f);\n+                me->SetFloatValue(UNIT_FIELD_MAXDAMAGE, maxdam * 1.5f);\n+                me->RemoveAura(GetSpell(WINDWALK_1));\n+                me->RemoveAura(TRANSPARENCY);\n+            }\n+            else\n+            {\n+                me->SetFloatValue(UNIT_FIELD_MINDAMAGE, mindam * criticalStikeMult);\n+                me->SetFloatValue(UNIT_FIELD_MAXDAMAGE, maxdam * criticalStikeMult);\n+            }\n+\n+            CalcDamageInfo* dinfo = new CalcDamageInfo();\n+            me->CalculateMeleeDamage(target, dinfo, BASE_ATTACK);\n+\n+            me->SetFloatValue(UNIT_FIELD_MINDAMAGE, mindam);\n+            me->SetFloatValue(UNIT_FIELD_MAXDAMAGE, maxdam);\n+\n+            _dmdevent->SetDamageInfo(dinfo);\n+            Events.AddEvent(_dmdevent, Events.CalculateTime(std::chrono::milliseconds(250)));\n+\n+            BotJumpInPlaceInFrontOf(target, 0.25f, 4.1f); //jump - DO NOT CHANGE\n+            me->CastSpell(target, SPELL_COMBAT_SPECIAL_2H_ATTACK, true); //strike anim\n+            me->resetAttackTimer(BASE_ATTACK);\n+        }\n+\n+        void CriticalStrikeFinish(ObjectGuid targetGuid, CalcDamageInfo* calcdinfo, bool /*windwalk*/)\n+        {\n+            EventTerminateEvent* etevent = new EventTerminateEvent(me);\n+            Events.AddEvent(etevent, Events.CalculateTime(std::chrono::milliseconds(750)));\n+\n+            if (!me->IsInWorld() || !me->IsAlive() || CCed(me))\n+            {\n+                Windwalk_Timer = 0;\n+                return;\n+            }\n+\n+            Unit* target = ObjectAccessor::GetUnit(*me, targetGuid);\n+            if (!target || !target->IsAlive())\n+            {\n+                me->PlayDistanceSound(SOUND_MISS_WHOOSH_2H);\n+                Windwalk_Timer = 0;\n+                return;\n+            }\n+\n+            if (target->IsImmunedToDamage(SPELL_SCHOOL_MASK_NORMAL))\n+            {\n+                //target became immune\n+                me->SendSpellMiss(target, CRITICAL_STRIKE_1, SPELL_MISS_IMMUNE);\n+                target->PlayDistanceSound(SOUND_ABSORB_GET_HIT);\n+                Windwalk_Timer = 0;\n+                return;\n+            }\n+            else if (!CanSeeEveryone() && !me->CanSeeOrDetect(target, false, false))\n+            {\n+                //target disappeared\n+                me->SendSpellMiss(target, CRITICAL_STRIKE_1, SPELL_MISS_MISS/*SPELL_MISS_EVADE*/);\n+                me->PlayDistanceSound(SOUND_MISS_WHOOSH_2H);\n+                Windwalk_Timer = 0;\n+                return;\n+            }\n+\n+            target->PlayDistanceSound(SOUND_AXE_2H_IMPACT_FLESH_CRIT);\n+\n+            DamageInfo dinfo(*calcdinfo, 0);\n+\n+            me->SendSpellNonMeleeDamageLog(target, CRITICAL_STRIKE_1,\n+                dinfo.GetDamage() + dinfo.GetAbsorb() + dinfo.GetResist() + dinfo.GetBlock(),\n+                SPELL_SCHOOL_MASK_NORMAL, dinfo.GetAbsorb(), dinfo.GetResist(), false, dinfo.GetBlock(), true, false);\n+            CleanDamage cl(0, 0, BASE_ATTACK, MELEE_HIT_CRIT);\n+            Unit::DealDamage(me, target, dinfo.GetDamage(), &cl);\n+            Unit::ProcSkillsAndAuras((Unit*)me, calcdinfo->Target, calcdinfo->ProcAttacker, calcdinfo->ProcVictim, 0, 0, calcdinfo->HitInfo, nullptr, &dinfo, nullptr);\n+            me->AtTargetAttacked(target, false);\n+\n+            me->resetAttackTimer(BASE_ATTACK);\n+            Windwalk_Timer = 0;\n+        }\n+\n+        void TerminateEvent()\n+        { _dmdevent = nullptr; }\n+\n+        MeleeHitOutcome GetNextAttackMeleeOutCome() const override\n+        {\n+            return _dmdevent ? MELEE_HIT_NORMAL : bot_ai::GetNextAttackMeleeOutCome();\n+        }\n+\n+        float GetBotArmorPenetrationCoef() const override\n+        {\n+            return 80.0f + bot_ai::GetBotArmorPenetrationCoef();\n+        }\n+\n+        void SpellHit(WorldObject* wcaster, SpellInfo const* spell) override\n+        {\n+            Unit* caster = wcaster->ToUnit();\n+            if (!caster)\n+                return;\n+\n+            uint32 spellId = spell->Id;\n+\n+            if (spellId == GetSpell(WINDWALK_1))\n+            {\n+                Windwalk_Timer = 30000; //TODO:\n+                me->RemoveMovementImpairingAuras(true);\n+                me->PlayDistanceSound(SOUND_FREEZE_IMPACT_WINDWALK, !IAmFree() ? master : nullptr);\n+\n+                uint32 dur = 30000;\n+                if (Aura* aura = me->GetAura(spellId))\n+                {\n+                    aura->SetDuration(dur);\n+                    aura->SetMaxDuration(dur);\n+                }\n+                if (Aura* aura = me->GetAura(TRANSPARENCY))\n+                {\n+                    aura->SetDuration(dur);\n+                    aura->SetMaxDuration(dur);\n+                }\n+\n+                if (GetHealthPCT(me) < 25 || !HasRole(BOT_ROLE_DPS))\n+                    me->AttackStop();\n+\n+                //SpellEffectSanctuary\n+                me->GetCombatManager().SuppressPvPCombat();\n+                Unit::AttackerSet const& attackers = me->getAttackers();\n+                for (Unit::AttackerSet::const_iterator itr = attackers.begin(); itr != attackers.end();)\n+                {\n+                    if (!(*itr)->CanSeeOrDetect(me))\n+                        (*(itr++))->AttackStop();\n+                    else\n+                        ++itr;\n+                }\n+\n+                me->m_lastSanctuaryTime = getMSTime();\n+            }\n+\n+            if (spellId == GetSpell(MIRROR_IMAGE_1))\n+            {\n+                MirrorImageStart();\n+            }\n+\n+            OnSpellHit(caster, spell);\n+        }\n+\n+        void SpellHitTarget(WorldObject* wtarget, SpellInfo const* spell) override\n+        {\n+            Unit* target = wtarget->ToUnit();\n+            if (!target)\n+                return;\n+\n+            OnSpellHitTarget(target, spell);\n+        }\n+\n+        void DamageDealt(Unit* victim, uint32& damage, DamageEffectType damageType) override\n+        {\n+            //Illusions deal no damage\n+            if (IsTempBot())\n+            {\n+                //manually add threat as if damage was done\n+                if (victim->IsCreature())\n+                    victim->GetThreatManager().AddThreat(me, float(damage + damage));\n+\n+                damage = 0;\n+            }\n+\n+            bot_ai::DamageDealt(victim, damage, damageType);\n+        }\n+\n+        void DamageTaken(Unit* u, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo*/) override\n+        {\n+            //illusions take twice as much damage\n+            if (IsTempBot())\n+            {\n+                damage *= 2;\n+                //return;\n+            }\n+            if (illusion_Fade)\n+            {\n+                damage = 0;\n+                return;\n+            }\n+            if (!u)\n+                return;\n+            if (!u->IsInCombat() && !me->IsInCombat())\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void OwnerAttackedBy(Unit* u) override\n+        {\n+            if (!u)\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void JustDied(Unit* u) override\n+        {\n+            TerminateEvent();\n+\n+            if (IsTempBot() && !_summonerGUID.IsEmpty())\n+                if (Unit* bot = ObjectAccessor::GetUnit(*me, _summonerGUID))\n+                    if (bot->IsNPCBot())\n+                        bot->ToCreature()->OnBotDespawn(me);\n+\n+            UnsummonAll(false);\n+\n+            bot_ai::JustDied(u);\n+        }\n+\n+        void OnBotDespawn(Creature* summon) override\n+        {\n+            if (!summon)\n+                return;\n+\n+            for (auto citr = _minions.cbegin(); citr != _minions.cend(); ++citr)\n+            {\n+                if (*citr == summon)\n+                {\n+                    _minions.erase(citr);\n+                    return;\n+                }\n+            }\n+        }\n+\n+        void UnsummonAll(bool /*savePets*/ = true) override\n+        {\n+            while (!_minions.empty())\n+            {\n+                auto cit = _minions.cbegin();\n+                if (Creature* illusion = *cit)\n+                    illusion->AI()->JustDied(nullptr);\n+                else\n+                    _minions.erase(cit);\n+            }\n+        }\n+\n+        uint32 GetAIMiscValue(uint32 data) const override\n+        {\n+            switch (data)\n+            {\n+                case CRITICAL_STRIKE_1:\n+                    return criticalStikeMult;\n+                case MIRROR_IMAGE_1:\n+                    return illusionsCount;\n+                default:\n+                    return 0;\n+            }\n+        }\n+\n+        void SetGUID(ObjectGuid const& guid, int32 /*id*/ = 0) override\n+        {\n+            _summonerGUID = guid;\n+        }\n+\n+        void Reset() override\n+        {\n+            UnsummonAll(false);\n+\n+            _dmdevent = nullptr;\n+            _summonerGUID = ObjectGuid::Empty;\n+            Windwalk_Timer = 0;\n+            criticalStikeMult = 1;\n+            illusionsCount = 0;\n+            illusion_Fade = false;\n+\n+            DefaultInit();\n+        }\n+\n+        void ReduceCD(uint32 diff) override\n+        {\n+            if (Windwalk_Timer > diff)          Windwalk_Timer -= diff;\n+            if (Illusions_Check_Timer > diff)   Illusions_Check_Timer -= diff;\n+        }\n+\n+        void InitPowers() override\n+        {\n+            me->SetPowerType(POWER_MANA);\n+            me->SetMaxPower(POWER_MANA, 75);\n+        }\n+\n+        void InitSpells() override\n+        {\n+            uint8 lvl = me->GetLevel();\n+\n+            criticalStikeMult =\n+                lvl < 10 ? 1 :\n+                lvl < 30 ? 2 :\n+                lvl < 50 ? 3 :\n+                lvl < 82 ? 4 : 5;\n+\n+            if (IsTempBot())\n+                return;\n+\n+ /*Special*/lvl >= 10 ? InitSpellMap(WINDWALK_1) : RemoveSpell(WINDWALK_1);\n+ /*Special*/lvl >= 20 ? InitSpellMap(MIRROR_IMAGE_1) : RemoveSpell(MIRROR_IMAGE_1);\n+\n+            illusionsCount =\n+                lvl < 20 ? 0 :\n+                lvl < 40 ? 1 :\n+                lvl < 70 ? 2 : 3;\n+        }\n+\n+        void ApplyClassPassives() const override\n+        {\n+            RefreshAura(SPELL_BURNING_BLADE_BLADEMASTER);\n+        }\n+\n+        bool CanUseManually(uint32 basespell) const override\n+        {\n+            switch (basespell)\n+            {\n+                case WINDWALK_1:\n+                case MIRROR_IMAGE_1:\n+                    return true;\n+                default:\n+                    break;\n+            }\n+\n+            return false;\n+        }\n+\n+        //std::vector<uint32> const* GetDamagingSpellsList() const override\n+        //{\n+        //    return &Blademaster_spells_damage;\n+        //}\n+        //std::vector<uint32> const* GetCCSpellsList() const override\n+        //{\n+        //    return &Blademaster_spells_cc;\n+        //}\n+        //std::vector<uint32> const* GetHealingSpellsList() const override\n+        //{\n+        //    return &Blademaster_spells_heal;\n+        //}\n+        std::vector<uint32> const* GetSupportSpellsList() const override\n+        {\n+            return &Blademaster_spells_support;\n+        }\n+\n+    private:\n+        DelayedMeleeDamageEvent* _dmdevent;\n+        using Summons = std::set<Creature*>;\n+        Summons _minions;\n+        Position _illusPos[MAX_ILLUSION_POSITIONS];\n+        ObjectGuid _summonerGUID;\n+\n+        uint32 Windwalk_Timer;\n+        uint32 Illusions_Check_Timer;\n+        uint8 criticalStikeMult;\n+        uint8 illusionsCount;\n+        bool illusion_Fade;\n+    };\n+};\n+\n+void AddSC_blademaster_bot()\n+{\n+    new blademaster_bot();\n+}\ndiff --git a/src/server/game/AI/NpcBots/bot_crypt_lord_ai.cpp b/src/server/game/AI/NpcBots/bot_crypt_lord_ai.cpp\nnew file mode 100644\nindex 0000000000..4bf5d9c17d\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bot_crypt_lord_ai.cpp\n@@ -0,0 +1,825 @@\n+#include \"bot_ai.h\"\n+#include \"botdatamgr.h\"\n+#include \"botlogtraits.h\"\n+#include \"botspell.h\"\n+#include \"bottext.h\"\n+#include \"CellImpl.h\"\n+#include \"Containers.h\"\n+#include \"GridNotifiers.h\"\n+#include \"GridNotifiersImpl.h\"\n+#include \"MotionMaster.h\"\n+#include \"ObjectAccessor.h\"\n+#include \"Player.h\"\n+#include \"ScriptMgr.h\"\n+#include \"Spell.h\"\n+#include \"SpellAuras.h\"\n+#include \"SpellMgr.h\"\n+#include \"TemporarySummon.h\"\n+#include \"WorldPacket.h\"\n+/*\n+Crypt Lord NpcBot (by Trickerer onlysuffering@gmail.com)\n+Description:\n+Ancient behemoth, once one of the kings of Azjol-Nerub, now an undead monster within ranks of Lich King's mightiest warriors\n+Specifics:\n+Very high armor, increased resistances, partially immune to control effects, immune to poison-based effects, mail/plate armor,\n+deals melee/spellshadow damage, spell power bonus: 200% strength\n+Abilities:\n+1) Impale. Crypt Lord slams the ground with his massive claws, shooting spikes out in a frontal cone,\n+dealing damage and hurling enemy units into the air in their wake, stunning them. Unlocked at level 20.\n+2) Spiked Carapace. Crypt Lord's chitinous armor increases damage resistance and returns 15% to 50% damage to enemy melee attackers.\n+3) Carrion Beetles. Crypt Lord progenerates a Carrion Beetle from a fresh corpse of an enemy to attack his enemies.\n+Beetles are permanent but do not regenerate health and only 6 can be controlled at a time.\n+Higher levels allow Crypt Lord to summon more powerful beetles. Unlocked at level 10.\n+4) Locust Swarm. Crypt Lord releases a swarm of 20-40 (depends on Crypt Lord's level) angry locusts\n+that bite and tear at nearby enemy units, reducing their ability to move or attack. As they chew the enemy flesh,\n+they convert it into a substance that restores hit points to the Crypt Lord when they return. Unlocked at level 40.\n+Complete - 100%\n+TODO:\n+*/\n+\n+#ifdef _MSC_VER\n+# pragma warning(push, 4)\n+#endif\n+\n+static constexpr float IMPALE_DAMAGE_TIME_MS_FULL = 400.0f;\n+static constexpr float IMPALE_DAMAGE_DIST_MAX = 40.0f;\n+static constexpr float IMPALE_DAMAGE_DELAY_MS_PER_YD = IMPALE_DAMAGE_TIME_MS_FULL / IMPALE_DAMAGE_DIST_MAX;\n+\n+enum CryptLordBaseSpells\n+{\n+//28786\n+//54022\n+    IMPALE_1                = SPELL_IMPALE,\n+    CARRION_BEETLES_1       = SPELL_CARRION_BEETLES,\n+    LOCUST_SWARM_1          = SPELL_LOCUST_SWARM\n+};\n+enum CryptLordPassives\n+{\n+};\n+enum CryptLordSpecial\n+{\n+    MH_ATTACK_ANIM          = SPELL_ATTACK_MELEE_1H,\n+\n+    SPIKED_CARAPACE_DAMAGE  = SPELL_SPIKED_CARAPACE_DAMAGE,\n+    IMPALE_DAMAGE           = SPELL_IMPALE_DAMAGE,\n+    IMPALE_VISUAL           = SPELL_IMPALE_VISUAL,\n+    STUN_VISUAL             = 18970, // \"Self Stun - (Visual only)\"\n+\n+    IMPALE_COST             = 100 * 5,\n+    CARRION_BEETLES_COST    = 30 * 5,\n+    LOCUST_SWARM_COST       = 150 * 5,\n+\n+    MAX_MINIONS             = 6,\n+\n+    SPELL_BLOODY_EXPLOSION  = 36599,\n+\n+    MODEL_BLOODY_BONES      = 25538,\n+\n+    IMPALE_MIN_TARGETS      = 2,\n+\n+    LOCUST_SWARM_MIN_LEVEL  = 40,\n+\n+    MAX_LOCUSTS_BASE        = 20,\n+    MAX_LOCUSTS_70          = 30,\n+    MAX_LOCUSTS_MAXLEVEL    = 40\n+};\n+\n+static const std::vector<uint32> CryptLord_spells_damage{ IMPALE_1, LOCUST_SWARM_1 };\n+static const std::vector<uint32> CryptLord_spells_cc{ IMPALE_1, LOCUST_SWARM_1 };\n+static const std::vector<uint32> CryptLord_spells_support{ CARRION_BEETLES_1 };\n+\n+class crypt_lord_bot : public CreatureScript\n+{\n+public:\n+    crypt_lord_bot() : CreatureScript(\"crypt_lord_bot\") { }\n+\n+    CreatureAI* GetAI(Creature* creature) const override\n+    {\n+        return new crypt_lord_botAI(creature);\n+    }\n+/*\n+    bool OnGossipHello(Player* player, Creature* creature) override\n+    {\n+        return creature->GetBotAI()->OnGossipHello(player, 0);\n+    }\n+\n+    bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action) override\n+    {\n+        if (bot_ai* ai = creature->GetBotAI())\n+            return ai->OnGossipSelect(player, creature, sender, action);\n+        return true;\n+    }\n+\n+    bool OnGossipSelectCode(Player* player, Creature* creature, uint32 sender, uint32 action, char const* code) override\n+    {\n+        if (bot_ai* ai = creature->GetBotAI())\n+            return ai->OnGossipSelectCode(player, creature, sender, action, code);\n+        return true;\n+    }\n+*/\n+    struct crypt_lord_botAI : public bot_ai\n+    {\n+        crypt_lord_botAI(Creature* creature) : bot_ai(creature)\n+        {\n+            _botclass = BOT_CLASS_CRYPT_LORD;\n+\n+            InitUnitFlags();\n+\n+            //crypt_lord immunities\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_POSSESS, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_CHARM, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_SHAPESHIFT, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_TRANSFORM, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_DISARM, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_DISARM_OFFHAND, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_FEAR, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_DISARM, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_POLYMORPH, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_FEAR, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_HORROR, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_TURN, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SLEEP, true);\n+        }\n+\n+        bool doCast(Unit* victim, uint32 spellId)\n+        {\n+            if (CheckBotCast(victim, spellId) != SPELL_CAST_OK)\n+                return false;\n+            if (spellId == GetSpell(IMPALE_1))\n+            {\n+                me->AttackStop();\n+                me->BotStopMovement();\n+                me->SetInFront(victim);\n+            }\n+            else if (spellId == GetSpell(LOCUST_SWARM_1))\n+            {\n+                me->AttackStop();\n+                me->BotStopMovement();\n+            }\n+            return bot_ai::doCast(victim, spellId);\n+        }\n+\n+        void StartAttack(Unit* u, bool force = false)\n+        {\n+            if (!bot_ai::StartAttack(u, force))\n+                return;\n+            GetInPosition(force, u);\n+        }\n+\n+        void JustEnteredCombat(Unit* u) override { bot_ai::JustEnteredCombat(u); }\n+        void KilledUnit(Unit* u) override { bot_ai::KilledUnit(u); }\n+        void EnterEvadeMode(EvadeReason why = EVADE_REASON_OTHER) override { bot_ai::EnterEvadeMode(why); }\n+        void MoveInLineOfSight(Unit* u) override { bot_ai::MoveInLineOfSight(u); }\n+        void JustDied(Unit* u) override { UnsummonLocusts(true); UnsummonAll(false); bot_ai::JustDied(u); }\n+\n+        void DoNonCombatActions(uint32 diff)\n+        {\n+            CheckCarrionBeetles(diff);\n+        }\n+\n+        void CheckCarrionBeetles(uint32 diff)\n+        {\n+            if (!IsSpellReady(CARRION_BEETLES_1, diff) || _carrionBeetlesCheckTimer > diff || _minions.size() >= MAX_MINIONS ||\n+                me->GetPower(POWER_MANA) < CARRION_BEETLES_COST || Rand() > 50)\n+                return;\n+\n+            _carrionBeetlesCheckTimer = urand(2000, 3000);\n+\n+            auto corpse_pred = [this, mindist = 30.f](Creature const* c) mutable {\n+                if (_isUsableCorpse(c) && c->GetDistance(me) < mindist)\n+                {\n+                    mindist = c->GetDistance(me);\n+                    return true;\n+                }\n+                return false;\n+            };\n+            Creature* creature = nullptr;\n+            Bcore::CreatureSearcher searcher(me, creature, corpse_pred);\n+            Cell::VisitAllObjects(me, searcher, 30.f);\n+\n+            if (creature)\n+            {\n+                me->SetInFront(creature);\n+                if (doCast(creature, GetSpell(CARRION_BEETLES_1)))\n+                    return;\n+            }\n+        }\n+\n+        void CheckLocustSwarm(uint32 diff)\n+        {\n+            if (!IsSpellReady(LOCUST_SWARM_1, diff) || _locustSwarmCheckTimer > diff || me->GetPower(POWER_MANA) < LOCUST_SWARM_COST ||\n+                GetHealthPCT(me) > 40 || Rand() > 35)\n+                return;\n+\n+            _locustSwarmCheckTimer = urand(1500, 3500);\n+\n+            std::list<Unit*> targets;\n+            GetNearbyTargetsList(targets, 50.0f, 0);\n+\n+            if (targets.empty()) // impossible\n+                return;\n+\n+            if (targets.size() > 1u || targets.front()->IsControlledByPlayer())\n+            {\n+                if (doCast(me, GetSpell(LOCUST_SWARM_1)))\n+                    return;\n+            }\n+        }\n+\n+        void UpdateAI(uint32 diff) override\n+        {\n+            if (!GlobalUpdate(diff))\n+                return;\n+\n+            DoVehicleActions(diff);\n+            if (!CanBotAttackOnVehicle())\n+                return;\n+\n+            if (!me->IsInCombat())\n+                DoNonCombatActions(diff);\n+\n+            if (IsPotionReady())\n+            {\n+                if (me->GetPower(POWER_MANA) < 550)\n+                    DrinkPotion(true);\n+                else if (GetHealthPCT(me) < 50)\n+                    DrinkPotion(false);\n+            }\n+\n+            if (IsCasting())\n+                return;\n+\n+            //if (IsSpellReady(INFERNO_1, diff) && !botPet && me->IsInCombat() &&\n+            //    me->GetPower(POWER_MANA) >= INFERNAL_COST && Rand() < 60)\n+            //{\n+            //    Unit* target = FindAOETarget(CalcSpellMaxRange(INFERNO_1));\n+\n+            //    if (target)\n+            //        _infernoPos = target->GetPosition();\n+            //    else\n+            //        me->GetNearPoint(me, _infernoPos.m_positionX, _infernoPos.m_positionY, _infernoPos.m_positionZ, 5.f, 0.f);\n+\n+            //    me->CastSpell(_infernoPos, GetSpell(INFERNO_1), false);\n+            //    return;\n+            //}\n+\n+            if (ProcessImmediateNonAttackTarget())\n+                return;\n+\n+            if (!CheckAttackTarget())\n+                return;\n+\n+            CheckLocustSwarm(diff);\n+\n+            CheckUsableItems(diff);\n+\n+            Attack(diff);\n+        }\n+\n+        void Attack(uint32 diff)\n+        {\n+            Unit* mytar = opponent ? opponent : disttarget ? disttarget : nullptr;\n+            if (!mytar)\n+                return;\n+\n+            StartAttack(mytar, IsMelee());\n+\n+            MoveBehind(mytar);\n+\n+            if (!HasRole(BOT_ROLE_DPS))\n+                return;\n+\n+            if (IsSpellReady(IMPALE_1, diff) && _impaleCheckTimer <= diff && me->GetPower(POWER_MANA) >= IMPALE_COST &&\n+                me->isAttackReady() && Rand() < 75)\n+            {\n+                _impaleCheckTimer = urand(800, 1600);\n+\n+                SpellInfo const* impaleSpellInfo = sSpellMgr->AssertSpellInfo(GetSpell(IMPALE_1));\n+                impaleSpellInfo = impaleSpellInfo->TryGetSpellInfoOverride(me);\n+                if (me->GetExactDist(mytar) < IMPALE_DAMAGE_DIST_MAX &&\n+                    (mytar->IsNonMeleeSpellCast(false) || GetManaPCT(me) > 90 || mytar->GetHealth() < me->GetMaxHealth() / 4 ||\n+                        (mytar->IsControlledByPlayer() && mytar->GetHealth() > me->GetHealth())) &&\n+                    !(mytar->IsImmunedToSpellEffect(impaleSpellInfo, impaleSpellInfo->GetEffect(EFFECT_1), me) &&\n+                     mytar->IsImmunedToSpellEffect(impaleSpellInfo, impaleSpellInfo->GetEffect(EFFECT_2), me)))\n+                {\n+                    Spell const* tarSpell = mytar->GetCurrentSpell(CURRENT_GENERIC_SPELL);\n+                    tarSpell = tarSpell ? tarSpell : mytar->GetCurrentSpell(CURRENT_CHANNELED_SPELL);\n+                    if (!tarSpell || tarSpell->GetTimer() > 500)\n+                    {\n+                        if (doCast(mytar, GetSpell(IMPALE_1)))\n+                            return;\n+                    }\n+                }\n+\n+                static const std::array my_angles = { 0.0f, float(M_PI / 2), float(M_PI / 2) * 2.0f, float(M_PI / 2) * 3.0f };\n+\n+                std::list<Unit*> impale_targets;\n+                GetNearbyTargetsList(impale_targets, IMPALE_DAMAGE_DIST_MAX, 0);\n+\n+                std::array<decltype(impale_targets), std::size(my_angles)> direction_targets{};\n+                for (Unit* u : impale_targets)\n+                {\n+                    float angle = me->GetRelativeAngle(u);\n+                    for (auto i : NPCBots::index_array<size_t, std::size(my_angles)>)\n+                    {\n+                        float rborder = Position::NormalizeOrientation(my_angles[i] - float(M_PI) * 0.25f);\n+                        float lborder = Position::NormalizeOrientation(my_angles[i] + float(M_PI) * 0.25f);\n+                        if ((angle > rborder && angle < lborder) || u->IsWithinMeleeRange(me))\n+                        {\n+                            direction_targets[i].push_back(u);\n+                            break;\n+                        }\n+                    }\n+                }\n+\n+                std::add_pointer_t<std::add_const_t<decltype(impale_targets)>> chosen_targets = nullptr;\n+                size_t max_count = IMPALE_MIN_TARGETS;\n+                for (std::add_const_t<decltype(impale_targets)>& tlist : direction_targets)\n+                {\n+                    if (tlist.size() > max_count)\n+                    {\n+                        chosen_targets = &tlist;\n+                        max_count = tlist.size();\n+                    }\n+                }\n+\n+                if (chosen_targets)\n+                {\n+                    Unit* target = Bcore::Containers::SelectRandomContainerElement(*chosen_targets);\n+                    if (target && doCast(target, GetSpell(IMPALE_1)))\n+                        return;\n+                }\n+            }\n+\n+            CheckAttackState();\n+            //if (!me->IsAlive() || !mytar->IsAlive())\n+            //    return;\n+        }\n+\n+        void ApplyClassDamageMultiplierMeleeSpell(int32& damage, SpellNonMeleeDamage& /*damageinfo*/, SpellInfo const* spellInfo, WeaponAttackType /*attackType*/, bool /*iscrit*/) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+            float fdamage = float(damage);\n+\n+            // apply bonus damage mods\n+            float pctbonus = 1.0f;\n+\n+            //Impale Damage scaling from AP\n+            if (lvl >= 40 && baseId == IMPALE_DAMAGE)\n+            {\n+                float ap_factor = lvl >= 60 ? 0.125f : 0.0625f;\n+                float total_ap = me->GetTotalAttackPowerValue(BASE_ATTACK);\n+                fdamage += total_ap * ap_factor;\n+                if (lvl >= 70)\n+                    pctbonus *= 1.1f;\n+                if (lvl >= DEFAULT_MAX_LEVEL)\n+                    pctbonus *= 1.2f;\n+            }\n+\n+            damage = int32(fdamage * pctbonus);\n+        }\n+\n+        //void ApplyClassSpellRadiusMods(SpellInfo const* spellInfo, float& radius) const override\n+        //{\n+        //    uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+        //    float flatbonus = 0.0f;\n+        //    float pctbonus = 0.0f;\n+\n+        //    //100% mods\n+        //    if (baseId == IMPALE_DAMAGE)\n+        //        radius = 0.0f;\n+\n+        //    radius = radius * (1.0f + pctbonus) + flatbonus;\n+        //}\n+\n+        void OnClassSpellStart(SpellInfo const* spellInfo) override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            switch (baseId)\n+            {\n+                case IMPALE_1:\n+                case CARRION_BEETLES_1:\n+                    me->CastSpell(me, MH_ATTACK_ANIM, true);\n+                    break;\n+                case LOCUST_SWARM_1:\n+                    _handleLocustSwarm();\n+                    break;\n+                default:\n+                    break;\n+            }\n+        }\n+\n+        void OnClassSpellGo(SpellInfo const* /*spellInfo*/) override\n+        {\n+        }\n+\n+        void OnClassChannelFinish(Spell const* spell) override\n+        {\n+            SpellInfo const* spellInfo = spell->GetSpellInfo();\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+\n+            if (baseId == IMPALE_1 || baseId == CARRION_BEETLES_1 || baseId == LOCUST_SWARM_1)\n+            {\n+                if (baseId == CARRION_BEETLES_1)\n+                {\n+                    ObjectGuid target_guid = spell->m_targets.GetUnitTargetGUID();\n+                    if (Unit* spellTarget = ObjectAccessor::GetUnit(*me, target_guid))\n+                    {\n+                        ASSERT(!IsInBotParty(spellTarget));\n+                        spellTarget->CastSpell(spellTarget, SPELL_BLOODY_EXPLOSION, true);\n+                        spellTarget->SetDisplayId(MODEL_BLOODY_BONES);\n+\n+                        for (int32 i = 0; i < spellInfo->GetEffect(EFFECT_0).BasePoints; ++i)\n+                            SummonBotPet(spellTarget);\n+                    }\n+                }\n+\n+                me->CastSpell(me, SPELL_BRIEF_STUN, true);\n+            }\n+        }\n+\n+        void SpellHitTarget(WorldObject* wtarget, SpellInfo const* spell) override\n+        {\n+            Unit* target = wtarget->ToUnit();\n+            if (!target)\n+                return;\n+\n+            uint32 baseId = spell->GetFirstRankSpell()->Id;\n+\n+            if (baseId == IMPALE_1)\n+            {\n+                if (me->IsValidAttackTarget(target))\n+                {\n+                    uint32 base_delay = uint32(std::max<int32>(spell->GetDuration(), 0));\n+                    uint32 ms_delay = base_delay + uint32(IMPALE_DAMAGE_DELAY_MS_PER_YD * me->GetExactDist2d(target));\n+                    //BotWhisper(\"Impale hit \" + target->GetName() + \" (\" + std::to_string(target->GetGUID().GetCounter()) + \"), delay: \" + std::to_string(ms_delay));\n+                    //We use WO events container since bot ai events get cleaned at death, see JustDied()\n+                    me->m_Events.AddEventAtOffset([this, guid = target->GetGUID()]() {\n+                        if (Unit* u = ObjectAccessor::GetUnit(*me, guid))\n+                        {\n+                            if (u->GetDistance(me) < IMPALE_DAMAGE_DIST_MAX + 5.0f)\n+                                me->CastSpell(u, IMPALE_DAMAGE, true);\n+                        }\n+                    }, std::chrono::milliseconds(ms_delay));\n+                }\n+            }\n+            else if (baseId == IMPALE_DAMAGE)\n+            {\n+                //BotWhisper(\"Impale damage hit \" + target->GetName() + \" (\" + std::to_string(target->GetGUID().GetCounter()) + ')');\n+                me->CastSpell(target, IMPALE_VISUAL, true);\n+                if (Aura* stun = target->AddAura(STUN_VISUAL, target))\n+                {\n+                    int32 dur = std::max<int32>(spell->GetMaxDuration(), 6000);\n+                    stun->SetDuration(dur);\n+                    stun->SetMaxDuration(dur);\n+                }\n+            }\n+\n+            OnSpellHitTarget(target, spell);\n+        }\n+\n+        void SpellHit(WorldObject* wcaster, SpellInfo const* spell) override\n+        {\n+            Unit* caster = wcaster->ToUnit();\n+            if (!caster)\n+                return;\n+\n+            OnSpellHit(caster, spell);\n+        }\n+\n+        void DamageTaken(Unit* u, uint32& damage, DamageEffectType damageType, SpellInfo const* spellInfo) override\n+        {\n+            if (u && damage && (damageType == DIRECT_DAMAGE || damageType == SPELL_DIRECT_DAMAGE) &&\n+                (!spellInfo || spellInfo->DmgClass == SPELL_DAMAGE_CLASS_MELEE) && me->IsValidAttackTarget(u))\n+            {\n+                SpellInfo const* damageSpellInfo = sSpellMgr->AssertSpellInfo(SPIKED_CARAPACE_DAMAGE);\n+                if (u->IsImmunedToDamage(damageSpellInfo))\n+                {\n+                    me->SendSpellDamageImmune(u, SPIKED_CARAPACE_DAMAGE);\n+                }\n+                else\n+                {\n+                    uint32 damage_returned_pct = _getSpikesDamageReflectPct();\n+                    uint32 damage_returned = CalculatePct(damage, damage_returned_pct);\n+                    if (damage_returned)\n+                    {\n+                        WorldPacket data(SMSG_SPELLDAMAGESHIELD, 8 + 8 + 4 + 4 + 4 + 4 + 4);\n+                        data << me->GetGUID();\n+                        data << u->GetGUID();\n+                        data << uint32(damageSpellInfo->Id);\n+                        data << uint32(damage_returned);\n+                        data << uint32(std::max<int32>(int32(damage_returned) - int32(u->GetHealth()), 0));\n+                        data << uint32(damageSpellInfo->SchoolMask);\n+                        me->SendMessageToSet(&data, true);\n+                        Unit::DealDamage(me, u, damage_returned, nullptr, SPELL_DIRECT_DAMAGE, damageSpellInfo->GetSchoolMask(), damageSpellInfo, true);\n+                    }\n+                }\n+            }\n+\n+            if (!u)\n+                return;\n+            if (!u->IsInCombat() && !me->IsInCombat())\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void OwnerAttackedBy(Unit* u) override\n+        {\n+            if (!u)\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        uint8 GetPetPositionNumber(Creature const* summon) const override\n+        {\n+            uint8 i = 0;\n+            for (Summons::const_iterator citr = _minions.begin(); citr != _minions.end(); ++citr)\n+            {\n+                if ((*citr)->GetGUID() == summon->GetGUID())\n+                    return i;\n+                ++i;\n+            }\n+            return 0;\n+        }\n+\n+        void SummonBotPet(Unit const* from)\n+        {\n+            if (_minions.size() >= MAX_MINIONS)\n+            {\n+                Unit* u = nullptr;\n+                //try 1: by minimal level\n+                uint8 minlevel = me->GetLevel();\n+                for (Unit* s : _minions)\n+                {\n+                    if (s->GetLevel() < minlevel)\n+                    {\n+                        minlevel = s->GetLevel();\n+                        u = s;\n+                    }\n+                }\n+                //try 2: last resort\n+                if (!u)\n+                    u = *(_minions.begin());\n+\n+                u->ToTempSummon()->UnSummon();\n+            }\n+\n+            uint32 entry = _getCarrionBeetleEntry();\n+            Position pos = from->GetPosition();\n+\n+            Creature* myPet = me->SummonCreature(entry, pos, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 2s);\n+            myPet->SetCreator(master);\n+            myPet->SetOwnerGUID(me->GetGUID());\n+            myPet->SetFaction(master->GetFaction());\n+            myPet->SetControlledByPlayer(!IAmFree());\n+            myPet->SetPvP(me->IsPvP());\n+            myPet->SetByteValue(UNIT_FIELD_BYTES_2, 1, master->GetByteValue(UNIT_FIELD_BYTES_2, 1));\n+\n+            myPet->SetUInt32Value(UNIT_CREATED_BY_SPELL, CARRION_BEETLES_1);\n+\n+            //myPet->SetMeleeDamageSchool(SPELL_SCHOOL_FIRE);\n+            if (Aura* stun = myPet->AddAura(SUMMONING_DISORIENTATION, myPet))\n+            {\n+                stun->SetDuration(1500);\n+                stun->SetMaxDuration(1500);\n+            }\n+\n+            myPet->GetAI()->SetData(BOTPETAI_MISC_MAXLEVEL, me->GetLevel());\n+            _minions.insert(myPet);\n+        }\n+\n+        void SummonLocust(uint32 offset)\n+        {\n+            ObjectGuid old_locust_guid = _locusts[offset];\n+            if (!old_locust_guid.IsEmpty())\n+            {\n+                if (Creature* old_locust = ObjectAccessor::GetCreature(*me, old_locust_guid))\n+                    old_locust->KillSelf();\n+            }\n+\n+            uint32 entry = BOT_PET_LOCUST_SWARM;\n+            Position pos = me->GetNearPosition(frand(5.0f, 15.0f), frand(float(M_PI * 0.75), float(M_PI * 1.25)));\n+\n+            Creature* locust = me->SummonCreature(entry, *me, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 1s);\n+            locust->SetCreator(master);\n+            locust->SetOwnerGUID(me->GetGUID());\n+            locust->SetFaction(master->GetFaction());\n+            locust->SetControlledByPlayer(!IAmFree());\n+            locust->SetPvP(me->IsPvP());\n+            locust->SetByteValue(UNIT_FIELD_BYTES_2, 1, master->GetByteValue(UNIT_FIELD_BYTES_2, 1));\n+\n+            locust->SetUInt32Value(UNIT_CREATED_BY_SPELL, LOCUST_SWARM_1);\n+\n+            locust->GetMotionMaster()->MovePoint(1, pos, false);\n+\n+            locust->GetAI()->SetData(BOTPETAI_MISC_CAPACITY, CalculatePct(me->GetMaxHealth(), uint32(2)));\n+            locust->GetAI()->SetData(BOTPETAI_MISC_MAX_ATTACKERS, CalculatePct(me->GetMaxHealth(), (_getMaxLocusts() + 2) / 3));\n+            _locusts[offset] = locust->GetGUID();\n+        }\n+\n+        void UnsummonAll(bool savePets = true) override\n+        {\n+            UnsummonCreatures(_minions, savePets);\n+            UnsummonLocusts(false);\n+        }\n+\n+        void UnsummonLocusts(bool kill)\n+        {\n+            for (ObjectGuid locust_guid : _locusts)\n+            {\n+                if (!locust_guid.IsEmpty())\n+                {\n+                    if (Creature* locust = ObjectAccessor::GetCreature(*me, locust_guid))\n+                    {\n+                        if (kill)\n+                           locust->KillSelf(false);\n+                        else\n+                            locust->ToTempSummon()->UnSummon();\n+                    }\n+                }\n+            }\n+        }\n+\n+        void SummonedCreatureDies(Creature* /*summon*/, Unit* /*killer*/) override\n+        {\n+        }\n+\n+        void SummonedCreatureDespawn(Creature* summon) override\n+        {\n+            if (_minions.contains(summon))\n+                _minions.erase(summon);\n+            else if (auto it = std::ranges::find(_locusts, summon->GetGUID()); it != _locusts.end())\n+                *it = ObjectGuid::Empty;\n+        }\n+\n+        uint32 GetAIMiscValue(uint32 data) const override\n+        {\n+            switch (data)\n+            {\n+                case BOTAI_MISC_PET_TYPE:\n+                    return _getCarrionBeetleEntry();\n+                default:\n+                    return 0;\n+            }\n+        }\n+\n+        void Reset() override\n+        {\n+            _impaleCheckTimer = 0;\n+            _carrionBeetlesCheckTimer = 0;\n+            _locustSwarmCheckTimer = 0;\n+\n+            UnsummonAll(false);\n+\n+            DefaultInit();\n+        }\n+\n+        void ReduceCD(uint32 diff) override\n+        {\n+            if (_impaleCheckTimer > diff)                   _impaleCheckTimer -= diff;\n+            if (_carrionBeetlesCheckTimer > diff)           _carrionBeetlesCheckTimer -= diff;\n+            if (_locustSwarmCheckTimer > diff)              _locustSwarmCheckTimer -= diff;\n+        }\n+\n+        void InitPowers() override\n+        {\n+            me->SetPowerType(POWER_MANA);\n+            me->SetMaxPower(POWER_MANA, BASE_MANA_1_CRYPT_LORD);\n+        }\n+\n+        void InitSpells() override\n+        {\n+            InitSpellMap(IMPALE_1);\n+            InitSpellMap(CARRION_BEETLES_1);\n+            InitSpellMap(LOCUST_SWARM_1);\n+        }\n+\n+        void ApplyClassPassives() const override\n+        {\n+            RefreshAura(SPELL_NULLIFY_POISON);\n+        }\n+\n+        bool CanUseManually(uint32 basespell) const override\n+        {\n+            switch (basespell)\n+            {\n+                case IMPALE_1:\n+                //case CARRION_BEETLES_1:\n+                case LOCUST_SWARM_1:\n+                    return true;\n+                default:\n+                    return false;\n+            }\n+        }\n+\n+        bool HasAbilitiesSpecifics() const override { return true; }\n+        void FillAbilitiesSpecifics(Player const* player, std::list<std::string> &specList) override\n+        {\n+            specList.push_back(LocalizedNpcText(player, BOT_TEXT_REFLECT) + \": \" + std::to_string(_getSpikesDamageReflectPct()) + '%');\n+            if (me->GetLevel() >= LOCUST_SWARM_MIN_LEVEL)\n+                specList.push_back(LocalizedNpcText(player, BOT_TEXT_LOCUSTS) + \": \" + std::to_string(_getMaxLocusts()));\n+        }\n+\n+        std::vector<uint32> const* GetDamagingSpellsList() const override\n+        {\n+            return &CryptLord_spells_damage;\n+        }\n+        std::vector<uint32> const* GetCCSpellsList() const override\n+        {\n+            return &CryptLord_spells_cc;\n+        }\n+        //std::vector<uint32> const* GetHealingSpellsList() const override\n+        //{\n+        //    return &CryptLord_spells_heal;\n+        //}\n+        std::vector<uint32> const* GetSupportSpellsList() const override\n+        {\n+            return &CryptLord_spells_support;\n+        }\n+\n+    private:\n+        void _handleLocustSwarm()\n+        {\n+            static const uint32 LOCUSTS_RELEASE_TIME = 4000u;\n+            uint32 max_locusts = _getMaxLocusts();\n+            for (uint32 i = 0; i < max_locusts; ++i)\n+            {\n+                uint32 offset = LOCUSTS_RELEASE_TIME / max_locusts * (i + 1);\n+                Events.AddEventAtOffset([this, num = i]() {\n+                    SummonLocust(num);\n+                }, std::chrono::milliseconds(offset));\n+            }\n+        }\n+\n+        uint32 _getMaxLocusts() const\n+        {\n+            uint8 lvl = me->GetLevel();\n+            uint32 max_locusts;\n+            if (lvl >= DEFAULT_MAX_LEVEL + BotDataMgr::GetLevelBonusForBotRank(me->GetCreatureTemplate()->rank))\n+                max_locusts = MAX_LOCUSTS_MAXLEVEL;\n+            else if (lvl >= 70)\n+                max_locusts = MAX_LOCUSTS_70;\n+            else\n+                max_locusts = MAX_LOCUSTS_BASE;\n+\n+            return max_locusts;\n+        }\n+\n+        uint32 _getSpikesDamageReflectPct() const\n+        {\n+            uint8 lvl = me->GetLevel();\n+            uint32 damage_returned_pct;\n+            if (lvl >= 70)\n+                damage_returned_pct = 50;\n+            else if (lvl >= 60)\n+                damage_returned_pct = 35;\n+            else if (lvl >= 40)\n+                damage_returned_pct = 25;\n+            else if (lvl >= 20)\n+                damage_returned_pct = 20;\n+            else\n+                damage_returned_pct = 15;\n+            return damage_returned_pct;\n+        }\n+\n+        uint32 _getCarrionBeetleEntry() const\n+        {\n+            uint32 entry;\n+            uint8 lvl = me->GetLevel();\n+            if (lvl >= 60)\n+                entry = BOT_PET_CARRION_BEETLE3;\n+            else if (lvl >= 30)\n+                entry = BOT_PET_CARRION_BEETLE2;\n+            else\n+                entry = BOT_PET_CARRION_BEETLE1;\n+            return entry;\n+        }\n+\n+        bool _isUsableCorpse(Creature const* c) const\n+        {\n+            return c->getDeathState() == DeathState::CORPSE && c->GetDisplayId() == c->GetNativeDisplayId() &&\n+                !c->IsVehicle() && !c->isWorldBoss() && !c->IsDungeonBoss() &&\n+                ((1u << (c->GetCreatureType()-1)) & USABLE_CORPSE_CREATURE_TYPE_MASK) &&\n+                !c->IsControlledByPlayer() && !c->IsNPCBot();\n+        }\n+\n+        uint32 _impaleCheckTimer;\n+        uint32 _carrionBeetlesCheckTimer;\n+        uint32 _locustSwarmCheckTimer;\n+\n+        using Summons = std::set<Creature*>;\n+        Summons _minions;\n+        using Swarm = std::array<ObjectGuid, MAX_LOCUSTS_MAXLEVEL>;\n+        Swarm _locusts{};\n+    };\n+};\n+\n+void AddSC_crypt_lord_bot()\n+{\n+    new crypt_lord_bot();\n+}\n+\n+#ifdef _MSC_VER\n+# pragma warning(pop)\n+#endif\ndiff --git a/src/server/game/AI/NpcBots/bot_dark_ranger_ai.cpp b/src/server/game/AI/NpcBots/bot_dark_ranger_ai.cpp\nnew file mode 100644\nindex 0000000000..f0a9411406\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bot_dark_ranger_ai.cpp\n@@ -0,0 +1,599 @@\n+#include \"bot_ai.h\"\n+#include \"bot_GridNotifiers.h\"\n+#include \"botspell.h\"\n+#include \"Containers.h\"\n+#include \"ScriptMgr.h\"\n+#include \"SpellAuraEffects.h\"\n+#include \"TemporarySummon.h\"\n+/*\n+Dark Ranger NpcBot (by Trickerer onlysuffering@gmail.com)\n+Description:\n+A former ranger of Quel'thalas forcibly raised from the dead (Warcraft III tribute)\n+Specifics:\n+Spell damage taken reduced by 35%, partially immune to control effects, leather/cloth armor,\n+deals physical/spellshadow damage, spell power bonus: 50% intellect. Main attribute: Agility\n+Abilities:\n+1) Silence. Silences an enemy and up to 4 nearby targets for 8 seconds, 15 seconds cooldown\n+2) Black Arrow. Fires a cursed arrow dealing 150% weapon damage and additional spellshadow damage over time.\n+If affected target dies from Dark Ranger\\'s damage, a Dark Minion will spawn from the corpse\n+(maximum 5 Minions, 80 seconds duration, only works on humanoids, beasts and dragonkin),\n+skeleton level depends on level of the killed unit\n+Deals five times more damage if target is under 20% health\n+3) Drain Life. Drains health from an enemy every second for 5 seconds (6 ticks),\n+healing Dark Ranger for 200% of the drained amount\n+4) Charm NIY\n+5ex) Auto Shot. A hunter auto shot ability since dark ranger is purely ranged and only uses bows.\n+Complete - 75%\n+TODO: Charm\n+*/\n+\n+enum DarkRangerBaseSpells\n+{\n+    AUTO_SHOT_1                         = 75,\n+    BLACK_ARROW_1                       = SPELL_BLACK_ARROW,\n+    DRAIN_LIFE_1                        = SPELL_DRAIN_LIFE,\n+    SILENCE_1                           = SPELL_SILENCE\n+};\n+enum DarkRangerPassives\n+{\n+};\n+enum DarkRangerSpecial\n+{\n+    DRAINLIFE_COST                      = 75 * 5,\n+    MAX_MINIONS                         = 5,\n+\n+    SPELL_SPAWN_ANIM                    = 25035,\n+    SPELL_BLOODY_EXPLOSION              = 36599,\n+    SPELL_THREAT_MOD                    = 31745, //Salvation\n+\n+    MODEL_BLOODY_BONES                  = 25538\n+};\n+\n+static const std::vector<uint32> Darkranger_spells_damage{ BLACK_ARROW_1, DRAIN_LIFE_1 };\n+static const std::vector<uint32> Darkranger_spells_cc{ SILENCE_1 };\n+\n+class dark_ranger_bot : public CreatureScript\n+{\n+public:\n+    dark_ranger_bot() : CreatureScript(\"dark_ranger_bot\") { }\n+\n+    CreatureAI* GetAI(Creature* creature) const override\n+    {\n+        return new dark_ranger_botAI(creature);\n+    }\n+\n+    struct dark_ranger_botAI : public bot_ai\n+    {\n+        dark_ranger_botAI(Creature* creature) : bot_ai(creature)\n+        {\n+            _botclass = BOT_CLASS_DARK_RANGER;\n+\n+            InitUnitFlags();\n+\n+            //dark ranger immunities\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_POSSESS, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_CHARM, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_SHAPESHIFT, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_TRANSFORM, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_DISARM, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_DISARM_OFFHAND, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_DISARM_RANGED, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_FEAR, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_DISARM, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_POLYMORPH, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_FEAR, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_HORROR, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_TURN, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SLEEP, true);\n+        }\n+\n+        bool doCast(Unit* victim, uint32 spellId)\n+        {\n+            if (CheckBotCast(victim, spellId) != SPELL_CAST_OK)\n+                return false;\n+\n+            return bot_ai::doCast(victim, spellId);\n+        }\n+\n+        void StartAttack(Unit* u, bool force = false)\n+        {\n+            if (!bot_ai::StartAttack(u, force))\n+                return;\n+            GetInPosition(force, u);\n+        }\n+\n+        void JustEnteredCombat(Unit* u) override { bot_ai::JustEnteredCombat(u); }\n+        void EnterEvadeMode(EvadeReason why = EVADE_REASON_OTHER) override { bot_ai::EnterEvadeMode(why); }\n+        void MoveInLineOfSight(Unit* u) override { bot_ai::MoveInLineOfSight(u); }\n+        void JustDied(Unit* u) override { UnsummonAll(false); bot_ai::JustDied(u); }\n+        void DoNonCombatActions(uint32 /*diff*/) { }\n+\n+        void KilledUnit(Unit* u) override\n+        {\n+            bot_ai::KilledUnit(u);\n+\n+            if (u->GetGUID() == _blackArrowKillGUID)\n+            {\n+                //black arrow affection -> spawn skeleton (launch)\n+                SummonBotPet(u);\n+            }\n+        }\n+\n+        void Counter(uint32 diff)\n+        {\n+            if (Rand() > 55)\n+                return;\n+\n+            if (IsSpellReady(SILENCE_1, diff))\n+            {\n+                Unit* target = FindCastingTarget(CalcSpellMaxRange(SILENCE_1), 0, SILENCE_1);\n+                if (target && doCast(target, GetSpell(SILENCE_1)))\n+                    return;\n+            }\n+        }\n+\n+        void UpdateAI(uint32 diff) override\n+        {\n+            if (!GlobalUpdate(diff))\n+                return;\n+\n+            DoVehicleActions(diff);\n+            if (!CanBotAttackOnVehicle())\n+                return;\n+\n+            CheckDrainLife(diff);\n+\n+            if (IsPotionReady())\n+            {\n+                if (me->GetPower(POWER_MANA) < DRAINLIFE_COST)\n+                    DrinkPotion(true);\n+                else if (GetHealthPCT(me) < 30)\n+                    DrinkPotion(false);\n+            }\n+\n+            if (ProcessImmediateNonAttackTarget())\n+                return;\n+\n+            if (!CheckAttackTarget())\n+            {\n+                me->InterruptSpell(CURRENT_AUTOREPEAT_SPELL);\n+\n+                if (!IAmFree() && me->IsStandState() && !me->isMoving() && !master->isMoving() && !me->IsMounted() &&\n+                    !me->IsInCombat() && !master->IsInCombat() && !IsCasting() && Rand() < 10 && me->GetDistance(master) < 15 &&\n+                    !me->HasStealthAura() && !me->HasInvisibilityAura() && !me->HasAuraType(SPELL_AURA_PERIODIC_DAMAGE) &&\n+                    _minions.empty())\n+                {\n+                    me->CastSpell(me, RACIAL_SHADOWMELD, true);\n+                }\n+\n+                return;\n+            }\n+\n+            if (IsCasting())\n+                return;\n+\n+            CheckUsableItems(diff);\n+\n+            DoRangedAttack(diff);\n+        }\n+\n+        void DoRangedAttack(uint32 diff)\n+        {\n+            Unit* mytar = opponent ? opponent : disttarget ? disttarget : nullptr;\n+            if (!mytar)\n+                return;\n+\n+            StartAttack(mytar, IsMelee());\n+\n+            CheckAttackState();\n+            if (!me->IsAlive() || !mytar->IsAlive())\n+                return;\n+\n+            Counter(diff);\n+\n+            CheckBlackArrow(diff);\n+\n+            MoveBehind(mytar);\n+\n+            float dist = me->GetDistance(mytar);\n+            float maxRangeLong = 30.f;\n+\n+            bool inpostion = !mytar->HasAuraType(SPELL_AURA_MOD_CONFUSE) || dist > maxRangeLong - 15.f;\n+\n+            //Auto Shot\n+            if (Spell const* shot = me->GetCurrentSpell(CURRENT_AUTOREPEAT_SPELL))\n+            {\n+                if (shot->GetSpellInfo()->Id == AUTO_SHOT_1 && (shot->m_targets.GetUnitTarget() != mytar || !inpostion))\n+                    me->InterruptSpell(CURRENT_AUTOREPEAT_SPELL);\n+            }\n+            else if (HasRole(BOT_ROLE_DPS)/* && dist > 5*/ && dist < maxRangeLong)\n+            {\n+                if (doCast(mytar, AUTO_SHOT_1))\n+                {}\n+            }\n+\n+            //RANGED SECTION\n+            if (dist > maxRangeLong)\n+                return;\n+\n+            //Black Arrow\n+            if (IsSpellReady(BLACK_ARROW_1, diff) && HasRole(BOT_ROLE_DPS) &&\n+                (Rand() < 20 || !mytar->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_WARLOCK, 0x0, 0x4, 0x0, me->GetGUID())))\n+            {\n+                if (doCast(mytar, GetSpell(BLACK_ARROW_1)))\n+                    return;\n+            }\n+        }\n+\n+        void CheckDrainLife(uint32 diff)\n+        {\n+            if (!IsSpellReady(DRAIN_LIFE_1, diff) || !HasRole(BOT_ROLE_DPS) || GetHealthPCT(me) > 70 || Rand() > 80 ||\n+                IsCasting())\n+                return;\n+\n+            Unit* target = me->GetVictim();\n+            if (!target)\n+                target = FindAffectedTarget(GetSpell(BLACK_ARROW_1), me->GetGUID(), 30);\n+\n+            if (target && doCast(target, GetSpell(DRAIN_LIFE_1)))\n+                return;\n+        }\n+\n+        void CheckBlackArrow(uint32 diff)\n+        {\n+            if (!IsSpellReady(BLACK_ARROW_1, diff) || !HasRole(BOT_ROLE_DPS) || Rand() > 30)\n+                return;\n+\n+            std::list<Unit*> targets;\n+            GetNearbyTargetsList(targets, 50, 0);\n+            std::erase_if(targets, BOTAI_PRED::AuraedTargetExcludeByCaster(BLACK_ARROW_1, me->GetGUID()));\n+            if (Unit* target = !targets.empty() ? Bcore::Containers::SelectRandomContainerElement(targets) : nullptr)\n+            {\n+                if (doCast(target, GetSpell(BLACK_ARROW_1)))\n+                    return;\n+            }\n+        }\n+\n+        void ApplyClassSpellCritMultiplierAll(Unit const* /*victim*/, float& /*crit_chance*/, SpellInfo const* /*spellInfo*/, SpellSchoolMask /*schoolMask*/, WeaponAttackType /*attackType*/) const override\n+        {\n+        }\n+\n+        void ApplyClassDamageMultiplierMeleeSpell(int32& damage, SpellNonMeleeDamage& damageinfo, SpellInfo const* spellInfo, WeaponAttackType /*attackType*/, bool /*iscrit*/) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            float flat_mod = 0.f;\n+\n+            //2) apply bonus damage mods\n+            float pctbonus = 1.0f;\n+            //Black Arrow on targets < 20% hp (only direct damage)\n+            if (baseId == BLACK_ARROW_1 && damageinfo.target && damageinfo.target->HasAuraState(AURA_STATE_HEALTHLESS_20_PERCENT))\n+                pctbonus *= 5.f;\n+\n+            damage = int32(damage * pctbonus + flat_mod);\n+        }\n+\n+        void ApplyClassDamageMultiplierSpell(int32& damage, SpellNonMeleeDamage& /*damageinfo*/, SpellInfo const* /*spellInfo*/, WeaponAttackType /*attackType*/, bool /*iscrit*/) const override\n+        {\n+            //uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //uint8 lvl = me->GetLevel();\n+            float fdamage = float(damage);\n+            float flat_mod = 0.f;\n+\n+            //2) apply bonus damage mods\n+            float pctbonus = 1.0f;\n+            //if (iscrit)\n+            //{\n+            //    //!!!spell damage is not yet critical and will be multiplied by 1.5\n+            //    //so we should put here bonus damage mult /1.5\n+            //    //Lava Flows (part 1): 24% additional crit damage bonus for Lava Burst\n+            //    if (lvl >= 50 && spellId == GetSpell(LAVA_BURST_1))\n+            //        pctbonus *= 1.16f;\n+            //}\n+            ////Trap Mastery part 2: 30% bonus damage for Immolation Trap, Explosive Trap and Black Arrow\n+            //if (lvl >= 15 && (baseId == IMMOLATION_TRAP_AURA_1 || baseId == EXPLOSIVE_TRAP_AURA_1 || baseId == BLACK_ARROW_1))\n+            //    pctbonus *= 1.3f;\n+            //Black Arrow on targets < 20% hp (only direct damage)\n+            //if (baseId == BLACK_ARROW_1 && damageinfo.target && damageinfo.target->HasAuraState(AURA_STATE_HEALTHLESS_20_PERCENT))\n+            //    pctbonus *= 5.f;\n+\n+            damage = int32(fdamage * pctbonus + flat_mod);\n+        }\n+\n+        void ApplyClassEffectMods(SpellInfo const* spellInfo, uint8 effIndex, float& value) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //uint8 lvl = me->GetLevel();\n+            float pctbonus = 1.0f;\n+\n+            //Drain Life scaling from health pool: 2%\n+            if (baseId == DRAIN_LIFE_1 && effIndex == EFFECT_0)\n+                value += float(me->GetMaxHealth()) * 0.02f;\n+\n+            value = value * pctbonus;\n+        }\n+\n+        void OnClassSpellGo(SpellInfo const* /*spellInfo*/) override\n+        {\n+            //uint32 spellId = spellInfo->Id;\n+            //uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+\n+            //Rapid Killing: use up buff manually\n+            //if (baseId == AIMED_SHOT_1 || baseId == ARCANE_SHOT_1 || baseId == CHIMERA_SHOT_1)\n+            //{\n+            //    if (AuraEffect const* rapi = me->GetAuraEffect(RAPID_KILLING_BUFF, 0))\n+            //        if (rapi->IsAffectingSpell(spellInfo))\n+            //            me->RemoveAura(RAPID_KILLING_BUFF);\n+            //}\n+        }\n+\n+        void SpellHitTarget(WorldObject* wtarget, SpellInfo const* spell) override\n+        {\n+            Unit* target = wtarget->ToUnit();\n+            if (!target)\n+                return;\n+\n+            if (target == me)\n+                return;\n+\n+            //uint32 baseId = spell->GetFirstRankSpell()->Id;\n+            //uint8 lvl = me->GetLevel();\n+\n+            //if (baseId == HUNTERS_MARK_1)\n+            //{\n+            //    //DarkRanger's Mark helper\n+            //    if (AuraEffect* mark = target->GetAuraEffect(spell->Id, 1, me->GetGUID()))\n+            //    {\n+            //        //Glyph of DarkRanger's Mark: +20% effect\n+            //        //Improved DarkRanger's Mark: +30% effect\n+            //        if (lvl >= 15)\n+            //            mark->ChangeAmount(mark->GetAmount() + mark->GetAmount() / 2);\n+            //        else if (lvl >= 10)\n+            //            mark->ChangeAmount(mark->GetAmount() * 13 / 10);\n+            //    }\n+            //}\n+\n+            OnSpellHitTarget(target, spell);\n+        }\n+\n+        void SpellHit(WorldObject* wcaster, SpellInfo const* spell) override\n+        {\n+            Unit* caster = wcaster->ToUnit();\n+            if (!caster)\n+                return;\n+\n+            OnSpellHit(caster, spell);\n+        }\n+\n+        void OnBotDamageDealt(Unit* victim, uint32 damage, CleanDamage const* /*cleanDamage*/, DamageEffectType /*damagetype*/, SpellInfo const* spellInfo) override\n+        {\n+            //black arrow affection -> spawn skeleton (mark)\n+            if (damage && me->IsAlive() && victim->IsCreature() && damage >= victim->GetHealth() &&\n+                (victim->GetCreatureType() == CREATURE_TYPE_BEAST ||\n+                victim->GetCreatureType() == CREATURE_TYPE_DRAGONKIN ||\n+                victim->GetCreatureType() == CREATURE_TYPE_HUMANOID) &&\n+                ((spellInfo && spellInfo->GetFirstRankSpell()->Id == BLACK_ARROW_1) ||\n+                victim->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_WARLOCK, 0x0, 0x4, 0x0, me->GetGUID())))\n+                _blackArrowKillGUID = victim->GetGUID();\n+        }\n+\n+        void DamageDealt(Unit* victim, uint32& damage, DamageEffectType damageType) override\n+        {\n+            bot_ai::DamageDealt(victim, damage, damageType);\n+        }\n+\n+        void DamageTaken(Unit* u, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo*/) override\n+        {\n+            if (!u)\n+                return;\n+            if (!u->IsInCombat() && !me->IsInCombat())\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void OwnerAttackedBy(Unit* u) override\n+        {\n+            if (!u)\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        uint8 GetPetPositionNumber(Creature const* summon) const override\n+        {\n+            uint8 i = 0;\n+            for (Summons::const_iterator citr = _minions.begin(); citr != _minions.end(); ++citr)\n+            {\n+                if ((*citr)->GetGUID() == summon->GetGUID())\n+                    return i;\n+                ++i;\n+            }\n+            return 0;\n+        }\n+\n+        void SummonBotPet(Unit* from)\n+        {\n+            if (_minions.size() >= MAX_MINIONS)\n+            {\n+                //BOT_LOG_ERROR(\"entities.player\", \"bot_dranger_ai::SummonBotPet(): max minions\");\n+                Unit* u = nullptr;\n+                //try 1: by minimal level\n+                uint8 minlevel = me->GetLevel();\n+                for (Unit* s : _minions)\n+                {\n+                    if (s->GetLevel() < minlevel)\n+                    {\n+                        minlevel = s->GetLevel();\n+                        u = s;\n+                    }\n+                }\n+                //try 2: by minimal duration (if expiring already)\n+                if (!u)\n+                {\n+                    uint32 minduration = static_cast<uint32>((*_minions.begin())->GetAI()->GetData(BOTPETAI_MISC_DURATION_MAX) * 3 / 4);\n+                    for (Unit* s : _minions)\n+                    {\n+                        if (s->GetAI()->GetData(BOTPETAI_MISC_DURATION) > minduration)\n+                        {\n+                            minduration = s->GetAI()->GetData(BOTPETAI_MISC_DURATION);\n+                            u = s;\n+                        }\n+                    }\n+                }\n+\n+                if (!u)\n+                    return;\n+\n+                u->ToTempSummon()->UnSummon();\n+            }\n+\n+            //addition: change unit's modelid\n+            if (!from->IsPet() && !from->IsVehicle() &&\n+                !from->ToCreature()->isWorldBoss() &&\n+                !from->ToCreature()->IsDungeonBoss())\n+            {\n+                from->CastSpell(from, SPELL_BLOODY_EXPLOSION, true);\n+                from->SetDisplayId(MODEL_BLOODY_BONES);\n+            }\n+\n+            uint32 rank = from->ToCreature()->GetCreatureTemplate()->rank;\n+            uint32 entry = (rank == CREATURE_ELITE_NORMAL) ? BOT_PET_DARK_MINION : BOT_PET_DARK_MINION_ELITE;\n+\n+            uint8 maxLevel = std::min<uint8>(from->GetLevel(), me->GetLevel());\n+\n+            Position pos = from->GetPosition();\n+\n+            Creature* myPet = me->SummonCreature(entry, pos, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 1s);\n+            myPet->SetCreator(master);\n+            myPet->SetOwnerGUID(me->GetGUID());\n+            myPet->SetFaction(master->GetFaction());\n+            myPet->SetControlledByPlayer(!IAmFree());\n+            myPet->SetPvP(me->IsPvP());\n+            myPet->SetByteValue(UNIT_FIELD_BYTES_2, 1, master->GetByteValue(UNIT_FIELD_BYTES_2, 1));\n+            myPet->SetUInt32Value(UNIT_CREATED_BY_SPELL, BLACK_ARROW_1);\n+\n+            //dark minion immunities\n+            myPet->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_SHAPESHIFT, true);\n+            myPet->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_TRANSFORM, true);\n+            myPet->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_FEAR, true);\n+            myPet->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_POLYMORPH, true);\n+            myPet->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_FEAR, true);\n+            myPet->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_HORROR, true);\n+            myPet->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SLEEP, true);\n+            //heal\n+            myPet->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_HEAL, true);\n+            myPet->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_HEAL_PCT, true);\n+            myPet->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_PERIODIC_HEAL, true);\n+\n+            //myPet->CastSpell(myPet, SPELL_BLOODY_EXPLOSION, true);\n+            myPet->CastSpell(myPet, SPELL_SPAWN_ANIM, true);\n+            if (Aura* stun = myPet->AddAura(SUMMONING_DISORIENTATION, myPet))\n+            {\n+                stun->SetDuration(1500);\n+                stun->SetMaxDuration(1500);\n+            }\n+\n+            myPet->GetAI()->SetData(BOTPETAI_MISC_MAXLEVEL, maxLevel);\n+            _minions.insert(myPet);\n+        }\n+\n+        void UnsummonAll(bool savePets = true) override\n+        {\n+            UnsummonCreatures(_minions, savePets);\n+        }\n+\n+        void SummonedCreatureDies(Creature* /*summon*/, Unit* /*killer*/) override\n+        {\n+            //BOT_LOG_ERROR(\"entities.unit\", \"SummonedCreatureDies: {}'s {}\", me->GetName(), summon->GetName());\n+            //if (summon == botPet)\n+            //    botPet = nullptr;\n+        }\n+\n+        void SummonedCreatureDespawn(Creature* summon) override\n+        {\n+            //all darkranger bot pets despawn at death or manually (gossip, teleport, etc.)\n+            //BOT_LOG_ERROR(\"entities.unit\", \"SummonedCreatureDespawn: {}'s {}\", me->GetName(), summon->GetName());\n+            if (_minions.contains(summon))\n+                _minions.erase(summon);\n+        }\n+\n+        float GetSpellAttackRange(bool longRange) const override\n+        {\n+            return longRange ? CalcSpellMaxRange(BLACK_ARROW_1) - 5.f : 15.f;\n+        }\n+\n+        uint32 GetAIMiscValue(uint32 data) const override\n+        {\n+            switch (data)\n+            {\n+                case BOTAI_MISC_PET_TYPE:\n+                    return BOT_PET_DARK_MINION;\n+                default:\n+                    return 0;\n+            }\n+        }\n+\n+        void Reset() override\n+        {\n+            UnsummonAll(false);\n+\n+            //for (uint8 i = 0; i != MAX_SPELL_SCHOOL; ++i)\n+            //    me->m_threatModifier[1] = 0.0f;\n+\n+            _blackArrowKillGUID = ObjectGuid::Empty;\n+\n+            DefaultInit();\n+\n+            //threat mod\n+            if (Aura* threat = me->AddAura(SPELL_THREAT_MOD, me))\n+                threat->GetEffect(0)->ChangeAmount(-100);\n+        }\n+\n+        void ReduceCD(uint32 /*diff*/) override\n+        {\n+            //if (trapTimer > diff)                   trapTimer -= diff;\n+        }\n+\n+        void InitPowers() override\n+        {\n+            me->SetPowerType(POWER_MANA);\n+        }\n+\n+        void InitSpells() override\n+        {\n+            //uint8 lvl = me->GetLevel();\n+            InitSpellMap(AUTO_SHOT_1);\n+            InitSpellMap(BLACK_ARROW_1);\n+            InitSpellMap(DRAIN_LIFE_1);\n+            InitSpellMap(SILENCE_1);\n+        }\n+\n+        void ApplyClassPassives() const override\n+        {\n+        }\n+\n+        std::vector<uint32> const* GetDamagingSpellsList() const override\n+        {\n+            return &Darkranger_spells_damage;\n+        }\n+        std::vector<uint32> const* GetCCSpellsList() const override\n+        {\n+            return &Darkranger_spells_cc;\n+        }\n+        //std::vector<uint32> const* GetHealingSpellsList() const override\n+        //{\n+        //    return &Darkranger_spells_heal;\n+        //}\n+        //std::vector<uint32> const* GetSupportSpellsList() const override\n+        //{\n+        //    return &Darkranger_spells_support;\n+        //}\n+    private:\n+        ObjectGuid _blackArrowKillGUID;\n+        using Summons = std::set<Creature*>;\n+        Summons _minions;\n+    };\n+};\n+\n+void AddSC_dark_ranger_bot()\n+{\n+    new dark_ranger_bot();\n+}\ndiff --git a/src/server/game/AI/NpcBots/bot_death_knight_ai.cpp b/src/server/game/AI/NpcBots/bot_death_knight_ai.cpp\nnew file mode 100644\nindex 0000000000..c72f5e6b63\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bot_death_knight_ai.cpp\n@@ -0,0 +1,2148 @@\n+#include \"bot_ai.h\"\n+#include \"botlogtraits.h\"\n+#include \"botmgr.h\"\n+#include \"bottext.h\"\n+#include \"bottraits.h\"\n+#include \"DBCStores.h\"\n+#include \"GameEventMgr.h\"\n+#include \"Group.h\"\n+#include \"Log.h\"\n+#include \"Map.h\"\n+#include \"MotionMaster.h\"\n+#include \"ObjectAccessor.h\"\n+#include \"Player.h\"\n+#include \"ScriptMgr.h\"\n+#include \"Spell.h\"\n+#include \"SpellAuraEffects.h\"\n+#include \"SpellMgr.h\"\n+#include \"TemporarySummon.h\"\n+#include \"World.h\"\n+/*\n+Death Knight NpcBot by Trickerer onlysuffering@gmail.com\n+Complete - around 92%\n+Note: Rune system adapted from TC\n+TODO: pet related\n+Notes: army of the dead is not working off the bat, need ai workaround\n+*/\n+\n+enum DeathKnightBaseSpells\n+{\n+    BLOOD_STRIKE_1                      = 45902,\n+    ICY_TOUCH_1                         = 45477,\n+    PLAGUE_STRIKE_1                     = 45462,\n+    DEATH_STRIKE_1                      = 49998,\n+    OBLITERATE_1                        = 49020,\n+    RUNE_STRIKE_1                       = 56815,\n+    HEART_STRIKE_1                      = 55050,\n+    FROST_STRIKE_1                      = 49143,\n+    SCOURGE_STRIKE_1                    = 55090,\n+\n+    BLOOD_BOIL_1                        = 48721,\n+    DEATH_AND_DECAY_1                   = 43265,\n+    HOWLING_BLAST_1                     = 49184,\n+\n+    DEATH_COIL_1                        = 47541,\n+    DEATH_GRIP_1                        = 49576,\n+    PESTILENCE_1                        = 50842,\n+    MIND_FREEZE_1                       = 47528,\n+    STRANGULATE_1                       = 47476,\n+    CHAINS_OF_ICE_1                     = 45524,\n+    ICEBOUND_FORTITUDE_1                = 48792,\n+    DARK_COMMAND_1                      = 56222,\n+    ANTI_MAGIC_SHELL_1                  = 48707,\n+    ARMY_OF_THE_DEAD_1                  = 42650,\n+\n+    PATH_OF_FROST_1                     = 3714,\n+    HORN_OF_WINTER_1                    = 57330,\n+    EMPOWER_RUNE_WEAPON_1               = 47568,\n+    BLOOD_TAP_1                         = 45529,\n+\n+    RUNE_TAP_1                          = 48982,\n+    LICHBORNE_1                         = 49039,\n+    //CE\n+    MARK_OF_BLOOD_1                     = 49005,\n+    DEATHCHILL_1                        = 49796,\n+    HYSTERIA_1                          = 49016,\n+    HUNGERING_COLD_1                    = 49203,\n+    ANTI_MAGIC_ZONE_1                   = 48707,\n+    VAMPIRIC_BLOOD_1                    = 55233,\n+    UNBREAKABLE_ARMOR_1                 = 51271,\n+    BONE_SHIELD_1                       = 49222,\n+\n+    DANCING_RUNE_DEAPON_1               = 49028,\n+    SUMMON_GARGOYLE_1                   = 49206,\n+\n+    BLOOD_PRESENCE_1                    = 48266,\n+    FROST_PRESENCE_1                    = 48263,\n+    UNHOLY_PRESENCE_1                   = 48265//unused\n+};\n+enum DeathKnightPassives\n+{\n+//Talents\n+    BUTCHERY                            = 49483,//rank 2\n+    TOUGHNESS                           = 49789,//rank 5\n+    BLADED_ARMOR                        = 49393,//rank 5\n+    SCENT_OF_BLOOD                      = 49509,//rank 3\n+    TWO_HANDED_WEAPON_SPECIALIZATION    = 55108,//rank 2\n+    ICY_TALONS                          = 50887,//rank 5\n+    ANNIHILATION                        = 51473,//rank 3\n+    NECROSIS1                           = 51459,\n+    NECROSIS2                           = 51462,\n+    NECROSIS3                           = 51463,\n+    NECROSIS4                           = 51464,\n+    NECROSIS5                           = 51465,\n+    SPELL_DEFLECTION                    = 49497,//rank 3\n+    VENDETTA                            = 55136,//rank 3\n+    KILLING_MACHINE                     = 51130,//rank 5\n+    CHILL_OF_THE_GRAVE                  = 50115,//rank 2\n+    ON_A_PALE_HORSE_A                   = 51970,//rank 2\n+    ON_A_PALE_HORSE_B                   = 51986,//rank 2\n+    BLOOD_CAKED_BLADE1                  = 49219,\n+    BLOOD_CAKED_BLADE2                  = 49627,\n+    BLOOD_CAKED_BLADE3                  = 49628,\n+    FRIGID_DREADPLATE                   = 51109,//rank 3\n+    UNHOLY_BLIGHT                       = 49194,\n+    DIRGE                               = 51206,//rank 2\n+    BLOODY_VENGEANCE1                   = 48988,\n+    BLOODY_VENGEANCE2                   = 49503,\n+    BLOODY_VENGEANCE3                   = 49504,\n+    ABOMINATIONS_MIGHT                  = 53138,//rank 2\n+    IMPROVED_ICY_TALONS                 = 55610,\n+    DESECRATION                         = 55667,//rank 2\n+    //BLOODWORMS                          = 49543,//rank 3\n+    IMPROVED_BLOOD_PRESENCE             = 50371,//rank 2\n+    DESOLATION                          = 66817,//rank 5\n+    IMPROVED_UNHOLY_PRESENCE            = 50392,//rank 2\n+    THREAT_OF_THASSARIAN                = 66192,//rank 3\n+    CRYPT_FEVER                         = 49632,//rank 3\n+    WILL_OF_THE_NECROPOLIS              = 52286,//rank 3\n+    ACCLIMATION                         = 50152,//rank 3\n+    WANDERING_PLAGUE                    = 49655,//rank 3\n+    EBON_PLAGUEBRINGER                  = 51161,//rank 3\n+\n+//Other\n+    GLYPH_DISEASE                       = 63334,\n+    GLYPH_CHAINS_OF_ICE                 = 58620,\n+    GLYPH_UNHOLY_BLIGHT                 = 63332,\n+    CHAINS_OF_ICE_FROST_RUNE_REFRESH    = 62459,//5 runic power gain\n+\n+    ITEM_DEATH_KNIGHT_T8_MELEE_4P       = 64736,\n+    ITEM_DEATH_KNIGHT_T9_MELEE_4P       = 67118,\n+\n+//Special\n+    FROST_FEVER                         = 59921,\n+    BLOOD_PLAGUE                        = 59879,\n+    RUNE_STRIKE_PASSIVE                 = 56816,//rune strike activation req aura\n+    RUNIC_POWER_MASTERY                 = 49455//rank 1\n+};\n+enum DeathKnightSpecial\n+{\n+    FROST_FEVER_AURA                    = 55095,\n+    BLOOD_PLAGUE_AURA                   = 55078,\n+    CRYPT_FEVER_AURA                    = 50510,//rank 3\n+    EBON_PLAGUE_AURA                    = 51735,//rank 3\n+\n+    BLADE_BARRIER_BUFF                  = 64859,//rank 5\n+    KILLING_MACHINE_BUFF                = 51124,\n+    RIME_BUFF                           = 59052,//Freezing Fog\n+    ITEM_DEATH_KNIGHT_T10_TANK_4P_BUFF  = 70654,//Blood Armor\n+    ITEM_DEATH_KNIGHT_T10_MELEE_4P_BUFF = 70657,//Advantage\n+\n+    CHILBLAINS_DEBUFF                   = 50436,//Icy Clutch rank 3\n+\n+    BLOOD_PRESENCE_HEAL_EFFECT          = 50475,\n+    //UNHOLY_BLIGHT_AURA                  = 50536,\n+\n+    DEATH_STRIKE_HEAL                   = 45470,\n+    DEATH_COIL_HEAL                     = 47633,\n+    DEATH_COIL_DAMAGE                   = 47632,\n+\n+    GLYPH_HEART_STRIKE_DEBUFF           = 58617, //50% move slow\n+    GLYPH_RUNE_TAP_HEAL                 = 59754,\n+    GLYPH_SCOURGE_STRIKE_EFFECT         = 69961,\n+\n+    NPC_EBON_GARGOYLE                   = 27829,\n+    NPC_DANCING_RUNE_WEAPON             = 27893\n+};\n+\n+static const std::vector<uint32> Deathknight_spells_damage\n+{ BLOOD_BOIL_1, BLOOD_STRIKE_1, DEATH_AND_DECAY_1, DEATH_COIL_1,DEATH_STRIKE_1,\n+FROST_STRIKE_1, HEART_STRIKE_1, HOWLING_BLAST_1, HUNGERING_COLD_1, ICY_TOUCH_1,\n+OBLITERATE_1, PESTILENCE_1, PLAGUE_STRIKE_1, RUNE_STRIKE_1, SCOURGE_STRIKE_1 };\n+static const std::vector<uint32> Deathknight_spells_cc\n+{ DEATH_GRIP_1, CHAINS_OF_ICE_1, MIND_FREEZE_1, STRANGULATE_1 };\n+static const std::vector<uint32> Deathknight_spells_support\n+{ ANTI_MAGIC_SHELL_1, ANTI_MAGIC_ZONE_1, ARMY_OF_THE_DEAD_1, BLOOD_TAP_1, BONE_SHIELD_1,DARK_COMMAND_1, DEATHCHILL_1,\n+DEATH_COIL_1, EMPOWER_RUNE_WEAPON_1, HORN_OF_WINTER_1, HUNGERING_COLD_1,HYSTERIA_1, ICEBOUND_FORTITUDE_1,\n+LICHBORNE_1, MARK_OF_BLOOD_1, PATH_OF_FROST_1, PESTILENCE_1, RUNE_TAP_1,UNBREAKABLE_ARMOR_1, VAMPIRIC_BLOOD_1 };\n+\n+const RuneType runeSlotTypes[MAX_RUNES] =\n+{\n+    RUNE_BLOOD,\n+    RUNE_BLOOD,\n+    RUNE_UNHOLY,\n+    RUNE_UNHOLY,\n+    RUNE_FROST,\n+    RUNE_FROST\n+};\n+struct BotRuneInfo\n+{\n+    uint8 BaseRune;\n+    uint8 CurrentRune;\n+    int32 Cooldown;\n+};\n+class death_knight_bot : public CreatureScript\n+{\n+public:\n+    death_knight_bot() : CreatureScript(\"death_knight_bot\") { }\n+\n+    CreatureAI* GetAI(Creature* creature) const override\n+    {\n+        return new death_knight_botAI(creature);\n+    }\n+\n+    struct death_knight_botAI : public bot_ai\n+    {\n+/*\n+        bool OnGossipHello(Player* player) override\n+        {\n+            return OnGossipHello(player, 0);\n+        }\n+\n+        bool OnGossipSelect(Player* player, uint32 sender, uint32 action) override\n+        {\n+            return OnGossipSelect(player, me, sender, action);\n+        }\n+\n+        bool OnGossipSelectCode(Player* player, uint32 sender, uint32 action, char const* code) override\n+        {\n+            return OnGossipSelectCode(player, me, sender, action, code);\n+        }\n+*/\n+        death_knight_botAI(Creature* creature) : bot_ai(creature)\n+        {\n+            _botclass = BOT_CLASS_DEATH_KNIGHT;\n+\n+            InitUnitFlags();\n+        }\n+\n+        bool doCast(Unit* victim, uint32 spellId)\n+        {\n+            if (CheckBotCast(victim, spellId) != SPELL_CAST_OK)\n+                return false;\n+\n+            if (!HaveRunes(spellId))\n+                return false;\n+\n+            return bot_ai::doCast(victim, spellId);\n+        }\n+\n+        void SpendRunes(SpellInfo const* spellInfo, bool didHit) override\n+        {\n+            SpellRuneCostEntry const* src = sSpellRuneCostStore.LookupEntry(spellInfo->RuneCostID);\n+            if (!src || (src->NoRuneCost() && src->NoRunicPowerGain()))\n+                return;\n+\n+            //Freezing Fog\n+            if (rimeProcTimer > GetLastDiff() && spellInfo->Id == HOWLING_BLAST_1)\n+            {\n+                for (auto i : NPCBots::index_array<uint8, RUNE_DEATH>)\n+                    runeCost[i] = 0;\n+            }\n+            else\n+            {\n+                for (auto i : NPCBots::index_array<uint8, RUNE_DEATH>)\n+                    runeCost[i] = src->RuneCost[i];\n+            }\n+\n+            runeCost[RUNE_DEATH] = 0;\n+\n+            //debug 1\n+            //std::ostringstream str;\n+            //str << \"Casted \" << spellInfo->SpellName[0] << \" cost\"\n+            //    << \" \" << runeCost[0] << \" \" << runeCost[1] << \" \" << runeCost[2] << \" \" << runeCost[3];\n+\n+                for (auto i : NPCBots::index_array<uint8, MAX_RUNES>)\n+            {\n+                uint8 rune = _runes[i].CurrentRune;\n+                if (runeCost[rune] > 0 && _runes[i].Cooldown <= 0)\n+                    if (SpendRune(rune, didHit))\n+                        runeCost[rune]--;\n+            }\n+\n+            runeCost[RUNE_DEATH] = runeCost[RUNE_BLOOD] + runeCost[RUNE_UNHOLY] + runeCost[RUNE_FROST];\n+\n+            if (runeCost[RUNE_DEATH] > 0)\n+            {\n+                for (uint8 i = 0; i != MAX_RUNES && runeCost[RUNE_DEATH] > 0; ++i)\n+                {\n+                    if (_runes[i].CurrentRune == RUNE_DEATH && _runes[i].Cooldown <= 0)\n+                        if (SpendRune(RUNE_DEATH, didHit))\n+                            runeCost[RUNE_DEATH]--;\n+                }\n+            }\n+\n+            //debug 2\n+            //uint32 runesLeft[NUM_RUNE_TYPES] = { 0,0,0,0 };\n+            //for (uint8 i = 0; i != NUM_RUNE_TYPES; ++i)\n+            //    for (uint8 j = 0; j != MAX_RUNES; ++j)\n+            //        if (_runes[j].CurrentRune == i && _runes[j].Cooldown <= 0)\n+            //            runesLeft[i]++;\n+            //str << \" left\" << \" \" << runesLeft[0] << \" \" << runesLeft[1] << \" \" << runesLeft[2] << \" \" << runesLeft[3];\n+            //BotWhisper(str.view());\n+\n+            me->ModifyPower(POWER_RUNIC_POWER, int32(src->RunicPower * runicpowerIncomeMult));\n+\n+            //BladeBarrier\n+            if (/*src->RuneCost[RUNE_BLOOD] > 0 && */GetCooledRunesCount(RUNE_BLOOD) > 1)\n+                me->CastSpell(me, BLADE_BARRIER_BUFF, true);\n+\n+            //Item - Death Knight T10 Melee 4P Bonus\n+            if (me->GetLevel() >= 80 && GetCooledRunesCount() == MAX_RUNES)\n+                me->CastSpell(me, ITEM_DEATH_KNIGHT_T10_MELEE_4P_BUFF, true);\n+        }\n+\n+        void getpower()\n+        {\n+            runicpower = me->GetPower(POWER_RUNIC_POWER);\n+            if (me->FindCurrentSpellBySpellId(RUNE_STRIKE_1))\n+                runicpower = std::max<int32>(runicpower - 200, 0);\n+        }\n+\n+        int32 rcost(uint32 spellId) const\n+        {\n+            if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId))\n+                return spellInfo->CalcPowerCost(me, spellInfo->GetSchoolMask());\n+            return 0;\n+        }\n+\n+        uint8 GetBotStance() const override { return _presence; }\n+\n+        void StartAttack(Unit* u, bool force = false)\n+        {\n+            if (!bot_ai::StartAttack(u, force))\n+                return;\n+            GetInPosition(force, u);\n+        }\n+\n+        void JustEnteredCombat(Unit* u) override { bot_ai::JustEnteredCombat(u); }\n+        void EnterEvadeMode(EvadeReason why = EVADE_REASON_OTHER) override { bot_ai::EnterEvadeMode(why); }\n+        void MoveInLineOfSight(Unit* u) override { bot_ai::MoveInLineOfSight(u); }\n+        void JustDied(Unit* u) override { UnsummonAll(false); bot_ai::JustDied(u); }\n+        void KilledUnit(Unit* u) override { bot_ai::KilledUnit(u); }\n+\n+        void DoNonCombatActions(uint32 diff)\n+        {\n+            if (GC_Timer > diff || Rand() > 20 || IsCasting() || Feasting())\n+                return;\n+\n+            //PATH OF FROST\n+            if (GetSpell(PATH_OF_FROST_1) && HaveRunes(PATH_OF_FROST_1)/* && !me->IsMounted()*/) //works while mounted\n+            {\n+                if ((me->HasUnitMovementFlag(MOVEMENTFLAG_SWIMMING) && !me->HasAuraType(SPELL_AURA_WATER_WALK)) ||\n+                    (master->HasUnitMovementFlag(MOVEMENTFLAG_SWIMMING) && !master->HasAuraType(SPELL_AURA_WATER_WALK)))\n+                {\n+                    if (doCast(me, GetSpell(PATH_OF_FROST_1)))\n+                        return;\n+                }\n+            }\n+        }\n+\n+        void CheckHysteria(uint32 diff)\n+        {\n+            if (!IsSpellReady(HYSTERIA_1, diff) || Rand() > 35)\n+                return;\n+\n+            Unit* target = nullptr;\n+\n+            if (master->GetVictim() && master->IsInCombat() && IsMeleeClass(master->GetClass()) &&\n+                GetHealthPCT(master) > 60 && me->GetDistance(master) < 30 &&\n+                master->getAttackers().empty() && !CCed(master, true) &&\n+                !master->GetAuraEffect(SPELL_AURA_MOD_DAMAGE_PERCENT_DONE, SPELLFAMILY_DEATHKNIGHT, 0x20000000, 0x0, 0x0))\n+                target = master;\n+\n+            if (IAmFree())\n+                return;\n+\n+            if (!target)\n+            {\n+                Group const* gr = master->GetGroup();\n+                if (gr)\n+                {\n+                    for (GroupReference const* itr = gr->GetFirstMember(); itr != nullptr; itr = itr->next())\n+                    {\n+                        Player* player = itr->GetSource();\n+                        if (!player || player == master || player->IsBeingTeleported() ||\n+                            me->GetMap() != player->FindMap())\n+                            continue;\n+\n+                        if (IsMeleeClass(player->GetClass()) && player->GetVictim() && GetHealthPCT(player) > 60 &&\n+                            me->GetDistance(player) < 30 && player->getAttackers().empty() && !CCed(player, true) &&\n+                            !player->GetAuraEffect(SPELL_AURA_MOD_DAMAGE_PERCENT_DONE, SPELLFAMILY_DEATHKNIGHT, 0x20000000, 0x0, 0x0))\n+                        {\n+                            target = player;\n+                            break;\n+                        }\n+\n+                        if (!player->HaveBot())\n+                            continue;\n+\n+                        for (auto const& [_, bot] : *player->GetBotMgr()->GetBotMap())\n+                        {\n+                            if (IsMeleeClass(bot->GetBotClass()) && bot->GetVictim() &&\n+                                bot->GetBotAI()->HasRole(BOT_ROLE_DPS) && !bot->GetBotAI()->HasRole(BOT_ROLE_RANGED) &&\n+                                GetHealthPCT(bot) > 60 && me->GetDistance(bot) < 30 && !CCed(bot, true) &&\n+                                !bot->GetAuraEffect(SPELL_AURA_MOD_DAMAGE_PERCENT_DONE, SPELLFAMILY_DEATHKNIGHT, 0x20000000, 0x0, 0x0))\n+                            {\n+                                target = bot;\n+                                break;\n+                            }\n+                        }\n+\n+                        if (target)\n+                            break;\n+                    }\n+                }\n+            }\n+\n+            if (!target && me->GetVictim() && HasRole(BOT_ROLE_DPS) && !HasRole(BOT_ROLE_RANGED) &&\n+                GetHealthPCT(me) > 60 && me->getAttackers().empty() && !CCed(me, true) &&\n+                !me->GetAuraEffect(SPELL_AURA_MOD_DAMAGE_PERCENT_DONE, SPELLFAMILY_DEATHKNIGHT, 0x20000000, 0x0, 0x0))\n+                target = me;\n+\n+            if (target && doCast(target, GetSpell(HYSTERIA_1)))\n+            {\n+                if (target->IsPlayer())\n+                    ReportSpellCast(HYSTERIA_1, LocalizedNpcText(target->ToPlayer(), BOT_TEXT__ON_YOU), target->ToPlayer());\n+                //if (target != master)\n+                //{\n+                //    std::string hystmsg = \"Hysteria on \" + (target == me ? \"myself\" : target->GetName()) + \"!\";\n+                //    BotWhisper(hystmsg.c_str());\n+                //}\n+\n+                return;\n+            }\n+\n+            SetSpellCooldown(HYSTERIA_1, 1000); //fail\n+        }\n+\n+        void CheckAntiMagic(uint32 diff)\n+        {\n+            if (!me->GetVictim() || !me->GetVictim()->HasUnitState(UNIT_STATE_CASTING) || Rand() > 40)\n+                return;\n+\n+            Spell const* spell = me->GetVictim()->GetCurrentSpell(CURRENT_GENERIC_SPELL);\n+            if (!spell || spell->GetTimer() >= 1000 || !spell->GetSpellInfo()->HasEffect(SPELL_EFFECT_SCHOOL_DAMAGE))\n+                return;\n+\n+            Unit const* u = spell->m_targets.GetUnitTarget();\n+            if (!u || (IAmFree() ? (u != me) : !(master->GetGroup() && master->GetGroup()->IsMember(spell->m_targets.GetObjectTargetGUID()))))\n+                return;\n+\n+            if (u == me && IsSpellReady(ANTI_MAGIC_SHELL_1, diff, false) && runicpower >= rcost(ANTI_MAGIC_SHELL_1))\n+            {\n+                if (doCast(me, GetSpell(ANTI_MAGIC_SHELL_1)))\n+                {\n+                    getpower();\n+                    return;\n+                }\n+            }\n+\n+            if (Rand() > 20)\n+                return;\n+\n+            u = ObjectAccessor::GetUnit(*me, spell->m_targets.GetObjectTargetGUID());\n+            if (u && !u->isMoving() && me->GetDistance(u) < 4 && IsSpellReady(ANTI_MAGIC_ZONE_1, diff, false) &&\n+                HaveRunes(ANTI_MAGIC_ZONE_1) &&\n+                !u->GetAuraEffect(SPELL_AURA_SCHOOL_ABSORB, SPELLFAMILY_DEATHKNIGHT, 0x20000, 0x0, 0x0))\n+            {\n+                if (doCast(me, GetSpell(ANTI_MAGIC_ZONE_1)))\n+                    return;\n+            }\n+        }\n+\n+        void CheckPresence(uint32 diff)\n+        {\n+            if (presencetimer > diff || IAmFree() || IsCasting() || Rand() > 30)\n+                return;\n+\n+            uint8 newpresence = IsTank() ? DEATH_KNIGHT_FROST_PRESENCE : GetSpec() == BOT_SPEC_DK_UNHOLY ? DEATH_KNIGHT_UNHOLY_PRESENCE : DEATH_KNIGHT_BLOOD_PRESENCE;\n+            if (_presence == newpresence)\n+            {\n+                presencetimer = 5000;\n+                return;\n+            }\n+\n+            if (newpresence == DEATH_KNIGHT_FROST_PRESENCE && HaveRunes(FROST_PRESENCE_1))\n+            {\n+                if (doCast(me, FROST_PRESENCE_1))\n+                    return;\n+            }\n+            else if (newpresence == DEATH_KNIGHT_BLOOD_PRESENCE && HaveRunes(BLOOD_PRESENCE_1))\n+            {\n+                if (doCast(me, BLOOD_PRESENCE_1))\n+                    return;\n+            }\n+            else if (newpresence == DEATH_KNIGHT_UNHOLY_PRESENCE && HaveRunes(UNHOLY_PRESENCE_1))\n+            {\n+                if (doCast(me, UNHOLY_PRESENCE_1))\n+                    return;\n+            }\n+\n+            presencetimer = 1000; //fail\n+        }\n+\n+        void BreakCC(uint32 diff) override\n+        {\n+            if (IsSpellReady(LICHBORNE_1, diff, false) && Rand() < 45 &&\n+                me->HasAuraWithMechanic((1u<<MECHANIC_CHARM)|(1u<<MECHANIC_FEAR)|(1u<<MECHANIC_SLEEP)))\n+            {\n+                if (doCast(me, GetSpell(LICHBORNE_1)))\n+                    return;\n+            }\n+\n+            bot_ai::BreakCC(diff);\n+        }\n+\n+        void Counter(uint32 diff)\n+        {\n+            if (Rand() > 35)\n+                return;\n+\n+            if (IsSpellReady(STRANGULATE_1, diff) && me->IsInCombat() && HaveRunes(STRANGULATE_1))\n+            {\n+                Unit* u = FindCastingTarget(CalcSpellMaxRange(STRANGULATE_1), 0, STRANGULATE_1);\n+                if (u && doCast(u, GetSpell(STRANGULATE_1)))\n+                    return;\n+            }\n+\n+            Unit* target = me->GetVictim();\n+            if (IsSpellReady(MIND_FREEZE_1, diff, false) && target && me->GetDistance(target) < 5 &&\n+                runicpower >= rcost(MIND_FREEZE_1) && target->IsNonMeleeSpellCast(false,false,true))\n+            {\n+                if (doCast(me->GetVictim(), GetSpell(MIND_FREEZE_1)))\n+                    getpower();\n+            }\n+        }\n+\n+        void UpdateAI(uint32 diff) override\n+        {\n+            if (me->IsAlive())\n+            {\n+                if (runicpowertimer <= diff)\n+                {\n+                    if (!me->IsInCombat())\n+                    {\n+                        if (me->GetPower(POWER_RUNIC_POWER) > uint32(30.f * runicpowerLossMult))\n+                            me->SetPower(POWER_RUNIC_POWER, me->GetPower(POWER_RUNIC_POWER) - uint32(30.f * runicpowerLossMult)); //-3 runic power every 2 sec\n+                        else if (me->GetPower(POWER_RUNIC_POWER) > 0)\n+                            me->SetPower(POWER_RUNIC_POWER, 0);\n+                    }\n+                    runicpowertimer = 2000;\n+                }\n+                if (runicpowertimer2 <= diff)\n+                {\n+                    if (me->IsInCombat())\n+                    {\n+                        if (me->GetPower(POWER_RUNIC_POWER) < me->GetMaxPower(POWER_RUNIC_POWER))\n+                            me->SetPower(POWER_RUNIC_POWER, me->GetPower(POWER_RUNIC_POWER) + int32(20.f * runicpowerIncomeMult)); //+2 runic power every 5 sec\n+                        else if (me->GetPower(POWER_RUNIC_POWER) < me->GetMaxPower(POWER_RUNIC_POWER))\n+                            me->SetPower(POWER_RUNIC_POWER, me->GetMaxPower(POWER_RUNIC_POWER));\n+                    }\n+                    runicpowertimer2 = 5000;\n+                }\n+                getpower();\n+            }\n+\n+            if (!GlobalUpdate(diff))\n+                return;\n+\n+            DoVehicleActions(diff);\n+            if (!CanBotAttackOnVehicle())\n+                return;\n+\n+            //pet is killed or unreachable\n+            if (GC_Timer <= diff && petSummonTimer <= diff && !me->IsInCombat() && !me->IsMounted() && !me->GetVictim() && !IsCasting() && Rand() < 25 &&\n+                (!botPet || me->GetDistance2d(botPet) > sWorld->GetMaxVisibleDistanceOnContinents()))\n+                SummonBotPet();\n+\n+            if (IsPotionReady())\n+            {\n+                if (GetHealthPCT(me) < 40)\n+                    DrinkPotion(false);\n+            }\n+\n+            CheckRacials(diff);\n+            CheckPresence(diff);\n+\n+            if (!me->IsInCombat())\n+                DoNonCombatActions(diff);\n+\n+            if (IsCasting())\n+                return;\n+\n+            Counter(diff);\n+\n+            //HORN OF WINTER\n+            if (IsSpellReady(HORN_OF_WINTER_1, diff) && !IAmFree() && Rand() < 25 &&\n+                ((me->IsInCombat() && runicpower <= 900) ||\n+                !me->GetAuraEffect(SPELL_AURA_MOD_STAT, SPELLFAMILY_DEATHKNIGHT, 0x0, 0x40000000, 0x0)))\n+            {\n+                if (doCast(me, GetSpell(HORN_OF_WINTER_1)))\n+                    return;\n+            }\n+            //BONE SHIELD\n+            if (IsSpellReady(BONE_SHIELD_1, diff) && HaveRunes(BONE_SHIELD_1) && Rand() < 25 + 65 * IsTank())\n+            {\n+                Aura* bone = me->GetAura(GetSpell(BONE_SHIELD_1));\n+                if (!bone || bone->GetCharges() < 2 || bone->GetDuration() < 10000)\n+                {\n+                    if (doCast(me, GetSpell(BONE_SHIELD_1)))\n+                        return;\n+                }\n+            }\n+\n+            CheckHysteria(diff);\n+            CheckAntiMagic(diff);\n+\n+            if (ProcessImmediateNonAttackTarget())\n+                return;\n+\n+            if (!CheckAttackTarget())\n+                return;\n+\n+            CheckUsableItems(diff);\n+\n+            DoNormalAttack(diff);\n+        }\n+\n+        void DoNormalAttack(uint32 diff)\n+        {\n+            Unit* mytar = opponent ? opponent : disttarget ? disttarget : nullptr;\n+            if (!mytar)\n+                return;\n+\n+            StartAttack(mytar, IsMelee());\n+\n+            CheckAttackState();\n+            if (!me->IsAlive() || !mytar->IsAlive())\n+                return;\n+\n+            //BLOOD TAP\n+            if (IsSpellReady(BLOOD_TAP_1, diff, false) && Rand() < 65)\n+            {\n+                if (doCast(me, GetSpell(BLOOD_TAP_1)))\n+                    getpower();\n+            }\n+\n+            //ICEBOUND FORTITUDE\n+            if (IsSpellReady(ICEBOUND_FORTITUDE_1, diff, false) && Rand() < 50 && runicpower >= rcost(ICEBOUND_FORTITUDE_1) &&\n+                GetHealthPCT(me) < std::min<uint32>(60, 35 + uint8(me->getAttackers().size()) * 5) + 20 * IsTank())\n+            {\n+                if (doCast(me, GetSpell(ICEBOUND_FORTITUDE_1)))\n+                {\n+                    if (!IAmFree())\n+                        ReportSpellCast(ICEBOUND_FORTITUDE_1, LocalizedNpcText(master, BOT_TEXT__USED), master);\n+\n+                    getpower();\n+                }\n+            }\n+\n+            //SELFHEAL\n+            //VAMPIRIC BLOOD\n+            if (IsSpellReady(VAMPIRIC_BLOOD_1, diff, false) && GetHealthPCT(me) < 50 && (IsTank() || Rand() < 75))\n+            {\n+                if (HaveRunes(VAMPIRIC_BLOOD_1) || (IsSpellReady(EMPOWER_RUNE_WEAPON_1, diff, false) && doCast(me, GetSpell(EMPOWER_RUNE_WEAPON_1))))\n+                {\n+                    if (doCast(me, GetSpell(VAMPIRIC_BLOOD_1)))\n+                    {\n+                        if (!IAmFree())\n+                            ReportSpellCast(VAMPIRIC_BLOOD_1, LocalizedNpcText(master, BOT_TEXT__USED), master);\n+\n+                        return;\n+                    }\n+                }\n+            }\n+            //RUNE TAP\n+            if (IsSpellReady(RUNE_TAP_1, diff, false) && GetHealthPCT(me) < 65 && Rand() < 50 && HaveRunes(RUNE_TAP_1))\n+            {\n+                if (doCast(me, GetSpell(RUNE_TAP_1)))\n+                    return;\n+            }\n+            //LICHBORNE + DEATH COIL\n+            if ((me->GetCreatureType() == CREATURE_TYPE_UNDEAD || IsSpellReady(LICHBORNE_1, diff, false)) &&\n+                (IAmFree() || IsTank() || master->GetBotMgr()->GetNpcBotsCountByRole(BOT_ROLE_HEAL) == 0) &&\n+                IsSpellReady(DEATH_COIL_1, diff) && Rand() < 45 && GetHealthPCT(me) < 80 && runicpower >= rcost(DEATH_COIL_1))\n+            {\n+                if (me->GetCreatureType() == CREATURE_TYPE_UNDEAD || doCast(me, GetSpell(LICHBORNE_1)))\n+                {\n+                    if (doCast(me, GetSpell(DEATH_COIL_1)))\n+                        return;\n+                }\n+            }\n+            //END SELFHEAL\n+\n+            //EMPOWER RUNE WEAPON\n+            if (IsSpellReady(EMPOWER_RUNE_WEAPON_1, diff, false) && Rand() < 50 &&\n+                GetCooledRunesCount() >= 5 && GetTotalRunesCooldown() >= (RUNE_BASE_COOLDOWN * 5) / 2)\n+            {\n+                if (doCast(me, GetSpell(EMPOWER_RUNE_WEAPON_1)))\n+                {\n+                    //BotWhisper(\"ERW used!\");\n+                }\n+            }\n+\n+            float dist = me->GetDistance(mytar);\n+            Unit const* u = mytar->GetVictim();\n+\n+            //MARK OF BLOOD\n+            if (IsSpellReady(MARK_OF_BLOOD_1, diff) && u && Rand() < 55 && dist < 30 && HaveRunes(MARK_OF_BLOOD_1) &&\n+                IsInBotParty(u) && GetHealthPCT(u) < 75 && u->GetDistance(mytar) < 10 &&\n+                mytar->GetHealth() > me->GetMaxHealth() / 4 * (1 + mytar->getAttackers().size()) &&\n+                (u == me || IsTank(u) || u->IsPlayer()) &&\n+                !mytar->GetDummyAuraEffect(SPELLFAMILY_DEATHKNIGHT, 2285, 0))\n+            {\n+                if (doCast(mytar, GetSpell(MARK_OF_BLOOD_1)))\n+                    return;\n+            }\n+\n+            //NON-DISEASE SECTION\n+\n+            //PLACEHOLDER: ARMY OF THE DEAD\n+\n+            //RANGED SECTION\n+\n+            //DARK COMMAND\n+            if (IsSpellReady(DARK_COMMAND_1, diff, false) && u && u != me && dist < 30 &&\n+                mytar->IsCreature() && !mytar->IsControlledByPlayer() && Rand() < 50 &&\n+                !CCed(mytar) && !mytar->HasAuraType(SPELL_AURA_MOD_TAUNT) &&\n+                (!IsTank(u) || (IsTank() && GetHealthPCT(me) > 67 &&\n+                (GetHealthPCT(u) < 30 || (IsOffTank() && !IsOffTank(u) && IsPointedOffTankingTarget(mytar)) ||\n+                (!IsOffTank() && IsOffTank(u) && IsPointedTankingTarget(mytar))))) &&\n+                ((!IsTankingClass(u->GetClass()) && GetHealthPCT(u) < 80) || IsTank()) &&\n+                IsInBotParty(u))\n+            {\n+                if (doCast(mytar, GetSpell(DARK_COMMAND_1)))\n+                    return;\n+            }\n+            //DARK COMMAND 2 (distant)\n+            if (IsSpellReady(DARK_COMMAND_1, diff, false) && !IAmFree() && u == me && Rand() < 30 && IsTank() &&\n+                (IsOffTank() || master->GetBotMgr()->GetNpcBotsCountByRole(BOT_ROLE_TANK_OFF) == 0) &&\n+                !(me->GetLevel() >= 40 && mytar->IsCreature() &&\n+                (mytar->ToCreature()->IsDungeonBoss() || mytar->ToCreature()->isWorldBoss())))\n+            {\n+                if (Unit* tUnit = FindDistantTauntTarget())\n+                {\n+                    if (doCast(tUnit, GetSpell(DARK_COMMAND_1)))\n+                        return;\n+                }\n+            }\n+\n+            ////DEATH GRIP - DISABLED\n+            //if (DEATH_GRIP && DeathGrip_cd <= diff && dist < 30 &&\n+            //    (tank == me && mytar->GetVictim() != me) ||\n+            //    (mytar->GetVictim() == me && mytar->ToPlayer() && mytar->IsNonMeleeSpellCast(false)) &&\n+            //    Rand() < 75)\n+            //{\n+            //    if (doCast(mytar, DEATH_GRIP))\n+            //    {\n+            //        DeathGrip_cd = 25000;\n+            //        return;\n+            //    }\n+\n+            //    DeathGrip_cd = 1000; //fail\n+            //}\n+\n+            //UNBREAKABLE ARMOR\n+            if (IsSpellReady(UNBREAKABLE_ARMOR_1, diff, false) && dist < 10 && HaveRunes(UNBREAKABLE_ARMOR_1) &&\n+                (IsTank() || !me->getAttackers().empty() || mytar->GetMaxHealth() > me->GetMaxHealth() || Rand() < 35))\n+            {\n+                if (doCast(me, GetSpell(UNBREAKABLE_ARMOR_1)))\n+                {}\n+            }\n+\n+            if (!HasRole(BOT_ROLE_DPS))\n+                return;\n+\n+            //CHAINS OF ICE\n+            if (IsSpellReady(CHAINS_OF_ICE_1, diff) && Rand() < 65 && dist < CalcSpellMaxRange(CHAINS_OF_ICE_1) && mytar->isMoving() &&\n+                !(mytar->IsCreature() && (mytar->ToCreature()->GetCreatureTemplate()->MechanicImmuneMask & (1u<<(MECHANIC_SNARE-1)))) &&\n+                HaveRunes(CHAINS_OF_ICE_1) && !CCed(mytar, true) && (!u || (!IsTank(u) && IsInBotParty(u))) &&\n+                !mytar->HasAuraWithMechanic(1u<<MECHANIC_SNARE))\n+            {\n+                if (doCast(mytar, GetSpell(CHAINS_OF_ICE_1)))\n+                    return;\n+            }\n+\n+            //HUNGERING COLD\n+            if (IsSpellReady(HUNGERING_COLD_1, diff) && Rand() < 30 && runicpower >= rcost(HUNGERING_COLD_1))\n+            {\n+                std::list<Unit*> targets;\n+                GetNearbyTargetsList(targets, 9.f, 0);\n+                if (targets.size() >= 3)\n+                {\n+                    if (doCast(me, GetSpell(HUNGERING_COLD_1)))\n+                        return;\n+                }\n+            }\n+\n+            //Diseases in general\n+            bool noDiseases = (mytar->IsCreature() && (mytar->ToCreature()->GetCreatureTemplate()->MechanicImmuneMask & (1u<<(MECHANIC_INFECTED-1))));\n+            AuraEffect const* blop = noDiseases ? nullptr : mytar->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DEATHKNIGHT, 0x0, 0x2000000, 0x0, me->GetGUID());\n+            AuraEffect const* frof = noDiseases ? nullptr : mytar->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DEATHKNIGHT, 0x0, 0x4000000, 0x0, me->GetGUID());\n+            AuraEffect const* ebop = (noDiseases || GetSpec() != BOT_SPEC_DK_UNHOLY) ? nullptr : mytar->GetAuraEffect(SPELL_AURA_LINKED, SPELLFAMILY_DEATHKNIGHT, 0x0, 0x800, 0x0, me->GetGUID());\n+\n+            auto [can_do_nature, can_do_frost, can_do_shadow, can_do_physical] = CanAffectVictimBools(mytar, SPELL_SCHOOL_NATURE, SPELL_SCHOOL_FROST, SPELL_SCHOOL_SHADOW, SPELL_SCHOOL_NORMAL);\n+\n+            //DISEASE SECTION\n+\n+            //PESTILENCE\n+            if (IsSpellReady(PESTILENCE_1, diff) && can_do_shadow && blop && frof && dist < 5 && HaveRunes(PESTILENCE_1))\n+            {\n+                if (blop->GetBase()->GetDuration() < 5000 || frof->GetBase()->GetDuration() < 5000)\n+                {\n+                    if (doCast(mytar, GetSpell(PESTILENCE_1)))\n+                        return;\n+                }\n+\n+                if (Rand() < 35 + 65 * me->GetMap()->IsDungeon())\n+                {\n+                    std::list<Unit*> targets;\n+                    GetNearbyTargetsList(targets, 13.f, 0, mytar);\n+                    uint8 count = 0;\n+                    for (Unit const* u : targets)\n+                    {\n+                        //check existing blop and frof\n+                        if (!u->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DEATHKNIGHT, 0x0, 0x2000000, 0x0, me->GetGUID()) ||\n+                            !u->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DEATHKNIGHT, 0x0, 0x4000000, 0x0, me->GetGUID()))\n+                            if (++count > 1)\n+                                break;\n+                    }\n+                    if (count > 1 && doCast(mytar, GetSpell(PESTILENCE_1)))\n+                        return;\n+                }\n+            }\n+            //ICY TOUCH\n+            if (IsSpellReady(ICY_TOUCH_1, diff) && can_do_frost && !noDiseases && (!frof || frof->GetBase()->GetMaxDuration() < 3000) &&\n+                dist < CalcSpellMaxRange(ICY_TOUCH_1) && HaveRunes(ICY_TOUCH_1))\n+            {\n+                if (doCast(mytar, GetSpell(ICY_TOUCH_1)))\n+                    return;\n+            }\n+            //HOWLING BLAST\n+            if (IsSpellReady(HOWLING_BLAST_1, diff) && can_do_frost && (rimeProcTimer > diff || Rand() < 70) &&\n+                (!u || mytar->IsControlledByPlayer() || rimeProcTimer > diff ||\n+                (u && u != me && IsTank(u) && u->getAttackers().size() > 2)) &&\n+                dist < CalcSpellMaxRange(HOWLING_BLAST_1) && HaveRunes(HOWLING_BLAST_1))\n+            {\n+                if (u && u->getAttackers().size() > 4 &&\n+                    IsSpellReady(DEATHCHILL_1, diff, false) && doCast(me, GetSpell(DEATHCHILL_1)))\n+                {/* BotWhisper(\"Deathchill used!\"); */}\n+                if (doCast(mytar, GetSpell(HOWLING_BLAST_1)))\n+                    return;\n+            }\n+\n+            //END DISEASE SECTION\n+\n+            //COMBAT SUMMONS SECTION\n+\n+            //SUMMON GARGOYLE\n+            if (IsSpellReady(SUMMON_GARGOYLE_1, diff) && can_do_nature && Rand() < 60 && dist < 30 &&\n+                (IAmFree() || mytar->GetHealth() > me->GetMaxHealth() / 4) && runicpower >= rcost(SUMMON_GARGOYLE_1))\n+            {\n+                if (doCast(mytar, GetSpell(SUMMON_GARGOYLE_1)))\n+                    return;\n+            }\n+            //DANCING RUNE WEAPON\n+            if (IsSpellReady(DANCING_RUNE_DEAPON_1, diff) && can_do_physical && (noDiseases || (blop && frof)) && Rand() < 60 && dist < 15 &&\n+                (IAmFree() || mytar->GetHealth() > me->GetHealth() / 4) && runicpower >= rcost(DANCING_RUNE_DEAPON_1))\n+            {\n+                if (doCast(mytar, GetSpell(DANCING_RUNE_DEAPON_1)))\n+                    return;\n+            }\n+\n+            //MELEE SECTION\n+\n+            //FROST STRIKE\n+            if (IsSpellReady(FROST_STRIKE_1, diff) && can_do_frost && Rand() < 90 && dist < 5 &&\n+                runicpower >= rcost(FROST_STRIKE_1) &&\n+                (runicpower >= 1000 || !GetSpell(OBLITERATE_1) || !HaveRunes(OBLITERATE_1)))\n+            {\n+                if (doCast(mytar, GetSpell(FROST_STRIKE_1)))\n+                    return;\n+            }\n+            //BLOOD BOIL\n+            if (IsSpellReady(BLOOD_BOIL_1, diff) && can_do_shadow && IsTank() && Rand() < 25 && HaveRunes(BLOOD_BOIL_1))\n+            {\n+                std::list<Unit*> targets;\n+                GetNearbyTargetsList(targets, 9.f, 1);\n+                if (targets.size() >= 4)\n+                    if (doCast(me, GetSpell(BLOOD_BOIL_1)))\n+                        return;\n+            }\n+            //DEATH AND DECAY\n+            if (IsSpellReady(DEATH_AND_DECAY_1, diff) && can_do_shadow && Rand() < (10 + 30 * IsTank()) && dist < 8 &&\n+                HaveRunes(DEATH_AND_DECAY_1))\n+            {\n+                if (Unit* target = FindAOETarget(10))\n+                {\n+                    if (doCast(target, GetSpell(DEATH_AND_DECAY_1)))\n+                        return;\n+                }\n+            }\n+            //DEATH COIL\n+            if (IsSpellReady(DEATH_COIL_1, diff) && can_do_shadow && Rand() < 50 && (dist > 6 || !GetSpell(FROST_STRIKE_1)) &&\n+                (dist < (IAmFree() ? 30 : 15)) && runicpower > 2 * rcost(DEATH_COIL_1))\n+            {\n+                if (doCast(mytar, GetSpell(DEATH_COIL_1)))\n+                    return;\n+            }\n+\n+            MoveBehind(mytar);\n+\n+            if (!can_do_physical || dist > 5)\n+                return;\n+\n+            //PLAGUE STRIKE\n+            if (IsSpellReady(PLAGUE_STRIKE_1, diff) && !noDiseases && (!blop || blop->GetBase()->GetDuration() < 3000) &&\n+                HaveRunes(PLAGUE_STRIKE_1))\n+            {\n+                if (doCast(mytar, GetSpell(PLAGUE_STRIKE_1)))\n+                    return;\n+            }\n+\n+            //DISEASE SECTION\n+\n+            //DEATH STRIKE\n+            if (IsSpellReady(DEATH_STRIKE_1, diff) && blop && frof && Rand() < 60 &&\n+                GetHealthPCT(me) < (80 - (10*(blop != nullptr) + 10*(frof != nullptr))) &&\n+                (!me->GetMap()->IsDungeon() || mytar->IsControlledByPlayer()) && HaveRunes(DEATH_STRIKE_1))\n+            {\n+                if (doCast(mytar, GetSpell(DEATH_STRIKE_1)))\n+                    return;\n+            }\n+            //OBLITERATE\n+            if (IsSpellReady(OBLITERATE_1, diff) && GetSpec() == BOT_SPEC_DK_FROST && blop && frof && HaveRunes(OBLITERATE_1))\n+            {\n+                //DEATHCHILL\n+                if (IsSpellReady(DEATHCHILL_1, diff, false) && doCast(me, GetSpell(DEATHCHILL_1)))\n+                {/* BotWhisper(\"Deathchill used!\"); */}\n+                if (doCast(mytar, GetSpell(OBLITERATE_1)))\n+                    return;\n+            }\n+            //HEART STRIKE - splash\n+            if (IsSpellReady(HEART_STRIKE_1, diff) && (noDiseases || (blop && frof)) && (IsTank() || Rand() < 40) &&\n+                HaveRunes(HEART_STRIKE_1) && FindSplashTarget())\n+            {\n+                if (doCast(mytar, GetSpell(HEART_STRIKE_1)))\n+                    return;\n+            }\n+            //SCOURGE STRIKE unused\n+            if (IsSpellReady(SCOURGE_STRIKE_1, diff) && blop && frof && ebop && HaveRunes(SCOURGE_STRIKE_1))\n+            {\n+                if (doCast(mytar, GetSpell(SCOURGE_STRIKE_1)))\n+                    return;\n+            }\n+            //BLOOD STRIKE\n+            if (IsSpellReady(BLOOD_STRIKE_1, diff) && (noDiseases || (blop && frof)) && HaveRunes(BLOOD_STRIKE_1))\n+            {\n+                if (doCast(mytar, GetSpell(BLOOD_STRIKE_1)))\n+                    return;\n+            }\n+\n+            //END DISEASE SECTION\n+\n+            //RUNE STRIKE tank\n+            if (IsSpellReady(RUNE_STRIKE_1, diff, false) && (IsTank() || runicpower >= 800) &&\n+                me->HasAuraState(AURA_STATE_DEFENSE) && !me->GetCurrentSpell(CURRENT_MELEE_SPELL) &&\n+                runicpower >= rcost(RUNE_STRIKE_1))\n+            {\n+                if (doCast(mytar, GetSpell(RUNE_STRIKE_1)))\n+                    return;\n+            }\n+        }\n+\n+        void ApplyClassDamageMultiplierMelee(uint32& /*damage*/, CalcDamageInfo& damageinfo) const override\n+        {\n+            uint8 lvl = me->GetLevel();\n+            float fdamage = float(damageinfo.Damages[0].Damage);\n+            float pctbonus = 0.0f;\n+\n+            //Blood Gorged part 1 (white attacks): 10% bonus damage for all attacks\n+            if ((GetSpec() == BOT_SPEC_DK_BLOOD) && lvl >= 64 && me->HasAuraState(AURA_STATE_HEALTH_ABOVE_75_PERCENT))\n+                pctbonus += 0.1f;\n+\n+            damageinfo.Damages[0].Damage = uint32(fdamage * (1.0f + pctbonus));\n+        }\n+\n+        void ApplyClassSpellCritMultiplierAll(Unit const* /*victim*/, float& crit_chance, SpellInfo const* spellInfo, SpellSchoolMask /*schoolMask*/, WeaponAttackType /*attackType*/) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+\n+            //Increased Plague Strike Crit (id 60130): 10% additional critical chance for Plague Strike\n+            if (baseId == PLAGUE_STRIKE_1)\n+                crit_chance += 10.f;\n+            //Scourge / Oblit Crit Up (60134): 5% additional critical chance for Scourge Strike and Obliterate\n+            if (lvl >= 80 && (baseId == SCOURGE_STRIKE_1 || baseId == OBLITERATE_1))\n+                crit_chance += 5.f;\n+\n+            //Killing Machine\n+            if (AuraEffect const* mach = me->GetAuraEffect(KILLING_MACHINE_BUFF, 0))\n+                if (mach->IsAffectingSpell(spellInfo))\n+                    crit_chance += 100.f;\n+            //Deathchill\n+            if (AuraEffect const* chil = me->GetAuraEffect(DEATHCHILL_1, 0))\n+                if (chil->IsAffectingSpell(spellInfo))\n+                    crit_chance += 100.f;\n+\n+            //Subversion: 9% additional critical chance for Blood Strike, Scourge Strike, Heart Strike and Obliterate\n+            if (baseId == BLOOD_STRIKE_1 || baseId == HEART_STRIKE_1 || baseId == SCOURGE_STRIKE_1 || baseId == OBLITERATE_1)\n+                crit_chance += 9.f;\n+            //Vicious Strikes (part 1): 6% additional critical chance for Plague Strike and Scourge Strike\n+            if (baseId == PLAGUE_STRIKE_1 || baseId == SCOURGE_STRIKE_1)\n+                crit_chance += 6.f;\n+            //Rime (part 1): 15% additional critical chance for Icy Touch and Obliterate\n+            if ((GetSpec() == BOT_SPEC_DK_FROST) && lvl >= 60 && (baseId == ICY_TOUCH_1 || baseId == OBLITERATE_1))\n+                crit_chance += 15.f;\n+            //Improved Death Strike (part 2): 6% additional critical chance for Death Strike\n+            if ((GetSpec() == BOT_SPEC_DK_BLOOD) && lvl >= 62 && baseId == DEATH_STRIKE_1)\n+                crit_chance += 6.f;\n+\n+            //Glyph of Rune Strike: 10% additional critical chance for Rune Strike\n+            if (baseId == RUNE_STRIKE_1)\n+                crit_chance += 10.f;\n+\n+            //Item - Death Knight T8 Melee 2P Bonus: 8% additional critical chance for Death Coil and Frost Strike\n+            if (lvl >= 80 &&\n+                (baseId == DEATH_COIL_1 || baseId == DEATH_COIL_DAMAGE ||\n+                baseId == DEATH_COIL_HEAL || baseId == FROST_STRIKE_1))\n+                crit_chance += 8.f;\n+        }\n+\n+        void ApplyClassDamageMultiplierMeleeSpell(int32& damage, SpellNonMeleeDamage& damageinfo, SpellInfo const* spellInfo, WeaponAttackType /*attackType*/, bool iscrit) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+            float fdamage = float(damage);\n+\n+            //apply bonus damage mods\n+            float pctbonus = 0.0f;\n+            if (iscrit)\n+            {\n+                //!!!Melee spell damage is not yet critical, all reduced by half\n+\n+                //Might of Mograine: 45% crit damage bonus for Blood Boil, Blood Strike, Death Strike and Heart Strike\n+                if ((GetSpec() == BOT_SPEC_DK_BLOOD) && lvl >= 63 &&\n+                    (baseId == BLOOD_BOIL_1 || baseId == BLOOD_STRIKE_1 || baseId == DEATH_STRIKE_1 || baseId == HEART_STRIKE_1))\n+                    pctbonus += 0.45f / 2.f;\n+                //Guile of Gorefiend (part 1 melee): 45% crit damage bonus for Blood Strike, Frost Strike, Howling Blast and Obliterate\n+                if ((GetSpec() == BOT_SPEC_DK_FROST) && lvl >= 63 &&\n+                    (baseId == BLOOD_STRIKE_1 || baseId == FROST_STRIKE_1 ||\n+                    baseId == HOWLING_BLAST_1 || baseId == OBLITERATE_1))\n+                    pctbonus += 0.45f / 2.f;\n+                //Vicious Strikes (part 2): 30% crit damage bonus for Plague Strike and Scourge Strike\n+                if (baseId == PLAGUE_STRIKE_1 || baseId == SCOURGE_STRIKE_1)\n+                    pctbonus += 0.3f / 2.f;\n+            }\n+\n+            //Increased Blood Strike Damage (52394): 90 bonus damage for Blood Strike and Heart Strike\n+            if (lvl >= 70 && (baseId == BLOOD_STRIKE_1 || baseId == HEART_STRIKE_1))\n+                fdamage += 90.f;\n+            //Copy of Increased Blood Strike Damage (60825): 90 bonus damage for Blood Strike and Heart Strike\n+            if (lvl >= 80 && (baseId == BLOOD_STRIKE_1 || baseId == HEART_STRIKE_1))\n+                fdamage += 90.f;\n+            //Increased Scourge Strike Damage (54809): 91 bonus damage for Scourge Strike\n+            if (lvl >= 80 && baseId == SCOURGE_STRIKE_1)\n+                fdamage += 91.f;\n+\n+            //Outbreak: 30% bonus damage for Plague Strike and 20% for Scourge Strike\n+            if (lvl >= 57)\n+            {\n+                if (baseId == PLAGUE_STRIKE_1)\n+                    pctbonus += 0.3f;\n+                else if (baseId == SCOURGE_STRIKE_1)\n+                    pctbonus += 0.2f;\n+            }\n+            //Bloody Strikes: 15% bonus damage for Blood Strike, 45% for Heart Strike and 30% for Blood Boil\n+            if ((GetSpec() == BOT_SPEC_DK_BLOOD) && lvl >= 59)\n+            {\n+                if (baseId == BLOOD_STRIKE_1)\n+                    pctbonus += 0.15f;\n+                else if (baseId == HEART_STRIKE_1)\n+                    pctbonus += 0.45f;\n+                else if (baseId == BLOOD_BOIL_1)\n+                    pctbonus += 0.3f;\n+            }\n+            //Merciless Combat (melee): 12% bonus damage for Icy Touch, Howling Blast, Obliterate and Frost Strike on targets with less than 35% hp\n+            if ((GetSpec() == BOT_SPEC_DK_FROST) && lvl >= 60 &&\n+                (baseId == ICY_TOUCH_1 || baseId == HOWLING_BLAST_1 || baseId == OBLITERATE_1 || baseId == FROST_STRIKE_1) &&\n+                damageinfo.target->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT))\n+                pctbonus += 0.12f;\n+            //Improved Death Strike (part 1): 30% bonus damage for Death Strike\n+            if ((GetSpec() == BOT_SPEC_DK_BLOOD) && lvl >= 62 && baseId == DEATH_STRIKE_1)\n+                pctbonus += 0.3f;\n+            //Blood of the North (part 1): 10% bonus damage for Blood Strike and Frost Strike\n+            if ((GetSpec() == BOT_SPEC_DK_FROST) && lvl >= 62 && (baseId == BLOOD_STRIKE_1 || baseId == FROST_STRIKE_1))\n+                pctbonus += 0.1f;\n+            //Blood Gorged part 1 (melee): 10% bonus damage for all spells\n+            if ((GetSpec() == BOT_SPEC_DK_BLOOD) && lvl >= 64 && me->HasAuraState(AURA_STATE_HEALTH_ABOVE_75_PERCENT))\n+                pctbonus += 0.1f;\n+            //Tundra Stalker (melee): 15% damage bonus on targets affected with Frost Fever\n+            if ((GetSpec() == BOT_SPEC_DK_FROST) &&\n+                lvl >= 64 && damageinfo.target->GetAuraEffect(SPELL_AURA_MOD_RANGED_HASTE, SPELLFAMILY_DEATHKNIGHT, 0x0, 0x0, 0x2))\n+                pctbonus += 0.15f;\n+            //Rage of Rivendare (melee): 10% damage bonus on targets affected with Blood Plague\n+            if ((GetSpec() == BOT_SPEC_DK_UNHOLY) &&\n+                lvl >= 64 && damageinfo.target->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DEATHKNIGHT, 0x0, 0x2000000, 0x0))\n+                pctbonus += 0.1f;\n+\n+            //Glyph of Blood Strike: 20% bonus damage for Blood Strike on snared targets\n+            if (baseId == BLOOD_STRIKE_1 && damageinfo.target->HasAuraWithMechanic(1u<<MECHANIC_SNARE))\n+                pctbonus += 0.2f;\n+            //Glyph of Death Strike: 1% bonus damage for every runic power point (max 25) for Death Strike\n+            if (baseId == DEATH_STRIKE_1 && runicpower >= 10)\n+            {\n+                //10 to 250 * 0.001 = 10 to 250 / 1000 = 0.01 to 0.25\n+                pctbonus += float(std::min<int32>(runicpower, 250)) * 0.001f;\n+            }\n+            //Glyph of Obliterate: 25% bonus damage for Obliterate\n+            if (baseId == OBLITERATE_1)\n+                pctbonus += 0.25f;\n+            //Glyph of Plague Strike: 20% bonus damage for Plague Strike\n+            if (baseId == PLAGUE_STRIKE_1)\n+                pctbonus += 0.2f;\n+\n+            //Item - Death Knight T8 Tank 2P Bonus\n+            if (lvl >= 80 && baseId == RUNE_STRIKE_1)\n+                pctbonus += 0.1f;\n+            //Item - Death Knight T8 DPS Relic\n+            if (lvl >= 80 && baseId == FROST_STRIKE_1)\n+                fdamage += 380.f;\n+            //Item - Death Knight T9 Tank 2P Bonus\n+            if (lvl >= 80 && (baseId == BLOOD_STRIKE_1 || baseId == HEART_STRIKE_1))\n+                pctbonus += 0.05f;\n+            //Item - Death Knight T10 Melee 2P Bonus part 1\n+            if (lvl >= 80 && baseId == OBLITERATE_1)\n+                pctbonus += 0.1f;\n+            //Item - Death Knight T10 Melee 2P Bonus part 2\n+            if (lvl >= 80 && baseId == HEART_STRIKE_1)\n+                pctbonus += 0.07f;\n+\n+            damage = int32(fdamage * (1.0f + pctbonus));\n+        }\n+\n+        void ApplyClassDamageMultiplierSpell(int32& damage, SpellNonMeleeDamage& damageinfo, SpellInfo const* spellInfo, WeaponAttackType /*attackType*/, bool iscrit) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+            float fdamage = float(damage);\n+\n+            //apply bonus damage mods\n+            float pctbonus = 0.0f;\n+            if (iscrit)\n+            {\n+                //!!!spell damage is not yet critical and will be multiplied by 1.5\n+                //so we should put here bonus damage mult /1.5\n+\n+                //Runic Focus (class passive): 50% crit damage bonus for all spells\n+                pctbonus += 0.5f / 1.5f;\n+\n+                //Guile of Gorefiend (part 1 spell): 45% crit damage bonus for Blood Strike, Frost Strike, Howling Blast and Obliterate\n+                if ((GetSpec() == BOT_SPEC_DK_FROST) && lvl >= 63 &&\n+                    (baseId == BLOOD_STRIKE_1 || baseId == FROST_STRIKE_1 ||\n+                    baseId == HOWLING_BLAST_1 || baseId == OBLITERATE_1))\n+                    pctbonus += 0.45f / 1.5f;\n+            }\n+\n+            //Improved Icy Touch part 1: 15% bonus damage for Icy Touch\n+            if (baseId == ICY_TOUCH_1)\n+                pctbonus += 0.15f;\n+            //Black Ice: 10% bonus damage for Shadow and Frost spells\n+            if (spellInfo->GetSchoolMask() & (SPELL_SCHOOL_MASK_FROST|SPELL_SCHOOL_MASK_SHADOW))\n+                pctbonus += 0.1f;\n+            //Morbidity part 1: 15% damage bonus for Death Coil\n+            if (baseId == DEATH_COIL_1 || baseId == DEATH_COIL_DAMAGE)\n+                pctbonus += 0.15f;\n+            //Glacier Rot: 20% bonus damage for Icy Touch, Howling Blast and Frost Strike on diseased targets\n+            if ((GetSpec() == BOT_SPEC_DK_FROST) &&\n+                lvl >= 59 && (baseId == ICY_TOUCH_1 || baseId == HOWLING_BLAST_1 || baseId == FROST_STRIKE_1) &&\n+                IsDiseased(damageinfo.target))\n+                pctbonus += 0.2f;\n+            //Impurity: 20% bonus (from attack power) damage for all spells\n+            if ((GetSpec() == BOT_SPEC_DK_UNHOLY) && lvl >= 59)\n+                if (SpellBonusEntry const* bonus = sSpellMgr->GetSpellBonusData(spellInfo->Id))\n+                    if (bonus->ap_bonus > 0.f)\n+                        fdamage += bonus->ap_bonus * 0.2f * me->GetTotalAttackPowerValue(BASE_ATTACK);\n+            //Merciless Combat (spell): 12% bonus damage for Icy Touch, Howling Blast, Obliterate and Frost Strike on targets with less than 35% hp\n+            if ((GetSpec() == BOT_SPEC_DK_FROST) && lvl >= 60 &&\n+                (baseId == ICY_TOUCH_1 || baseId == HOWLING_BLAST_1 || baseId == OBLITERATE_1 || baseId == FROST_STRIKE_1) &&\n+                damageinfo.target->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT))\n+                pctbonus += 0.12f;\n+            //Blood Gorged part 1 (spell): 10% bonus damage for all spells\n+            if ((GetSpec() == BOT_SPEC_DK_BLOOD) && lvl >= 64 && me->HasAuraState(AURA_STATE_HEALTH_ABOVE_75_PERCENT))\n+                pctbonus += 0.1f;\n+            //Tundra Stalker (spell): 15% damage bonus on targets affected with Frost Fever\n+            if ((GetSpec() == BOT_SPEC_DK_FROST) &&\n+                lvl >= 64 && damageinfo.target->GetAuraEffect(SPELL_AURA_MOD_RANGED_HASTE, SPELLFAMILY_DEATHKNIGHT, 0x0, 0x0, 0x2))\n+                pctbonus += 0.15f;\n+            //Rage of Rivendare (spell): 10% damage bonus on targets affected with Blood Plague\n+            if ((GetSpec() == BOT_SPEC_DK_UNHOLY) &&\n+                lvl >= 64 && damageinfo.target->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DEATHKNIGHT, 0x0, 0x2000000, 0x0))\n+                pctbonus += 0.1f;\n+\n+            //Glyph of Dark Death part 1: 15% damage bonus for Death Coil\n+            if (baseId == DEATH_COIL_1 || baseId == DEATH_COIL_DAMAGE)\n+                pctbonus += 0.15f;\n+            //Glyph of Icy Touch: 20% damage bonus for Frost Fever\n+            if (baseId == FROST_FEVER || baseId == FROST_FEVER_AURA)\n+                pctbonus += 0.2f;\n+\n+            //Item - Death Knight T8 DPS Relic\n+            if (lvl >= 80 && baseId == DEATH_COIL_DAMAGE)\n+                fdamage += 113.f;\n+            //Increased Icy Touch Damage (id 54800): 111 bonus damage for Icy Touch\n+            if (baseId == ICY_TOUCH_1)\n+                fdamage += 111.f;\n+            //Increased Death Coil Damage (id 54807): 80 bonus damage for Death Coil\n+            if (baseId == DEATH_COIL_1 || baseId == DEATH_COIL_DAMAGE)\n+                fdamage += 80.f;\n+\n+            damage = int32(fdamage * (1.0f + pctbonus));\n+        }\n+\n+        void ApplyClassDamageMultiplierHeal(Unit const* /*victim*/, float& heal, SpellInfo const* spellInfo, DamageEffectType /*damagetype*/, uint32 /*stack*/) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+            float pctbonus = 0.0f;\n+            float flat_mod = 0.0f;\n+\n+            //pct mods\n+            //Morbidity part 2: 15% bonus healing for Death Coil\n+            if (baseId == DEATH_COIL_1 || baseId == DEATH_COIL_HEAL)\n+                pctbonus += 0.15f;\n+            //Improved Rune Tap part 1: 100% bonus healing for Rune Tap\n+            if (lvl >= 58 && baseId == RUNE_TAP_1)\n+                pctbonus += 1.f;\n+            //Improved Death Strike (part 3): 50% bonus healing for Death Strike\n+            if ((GetSpec() == BOT_SPEC_DK_BLOOD) && lvl >= 62 && baseId == DEATH_STRIKE_HEAL)\n+                pctbonus += 0.5f;\n+\n+            //Glyph of Dark Death part 2: 15% bonus healing for Death Coil\n+            if (baseId == DEATH_COIL_1 || baseId == DEATH_COIL_HEAL)\n+                pctbonus += 0.15f;\n+            //Glyph of Rune Tap part 1: 10% bonus healing for Rune Tap\n+            if (baseId == RUNE_TAP_1)\n+                pctbonus += 0.1f;\n+\n+            //flat mods\n+            //Improved Prayer of Mending: 100 additional heal for Prayer of Mending\n+            //if (baseId == PRAYER_OF_MENDING_HEAL)\n+            //    flat_mod += 100;\n+\n+            heal = heal * (1.0f + pctbonus) + flat_mod;\n+        }\n+\n+        void ApplyClassSpellCostMods(SpellInfo const* spellInfo, int32& cost) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            float fcost = float(cost);\n+            int32 flatbonus = 0;\n+            float pctbonus = 0.0f;\n+\n+            //percent mods\n+            //Endless Winter part 2 -100% Runic Power cost for Mind Freeze\n+            if (lvl >= 58 && baseId == MIND_FREEZE_1)\n+                pctbonus += 1.f;\n+\n+            //Glyph of Blood Tap: -100% Health cost for Blood Tap\n+            if (baseId == BLOOD_TAP_1)\n+                pctbonus += 1.f;\n+\n+            //flat mods\n+            //Glyph of Frost Strike: -8 Runic Power cost for Frost Strike\n+            if (baseId == FROST_STRIKE_1)\n+                flatbonus += 80;\n+            //Glyph of Hungering Cold: -40 Runic Power cost for Hungering Cold\n+            if (lvl >= 60 && baseId == HUNGERING_COLD_1)\n+                flatbonus += 400;\n+\n+            //cost can be < 0\n+            cost = int32(fcost * (1.0f - pctbonus)) - flatbonus;\n+        }\n+\n+        void ApplyClassSpellCooldownMods(SpellInfo const* spellInfo, uint32& cooldown) const override\n+        {\n+            //cooldown is in milliseconds\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            int32 timebonus = 0;\n+            float pctbonus = 0.0f;\n+\n+            //pct mods\n+            //Aspiration\n+            //if (lvl >= 45 && (baseId == INNER_FOCUS_1 || baseId == POWER_INFUSION_1 || baseId == PAIN_SUPPRESSION_1))\n+            //    pctbonus += 0.2f;\n+\n+            //flat mods\n+            //Unholy Command: -10 sec cooldown for Dark Command\n+            if (lvl >= 56 && baseId == DARK_COMMAND_1)\n+                timebonus += 10000;\n+            //Improved Rune Tap part 2: -30 sec cooldown for Rune Tap\n+            if (lvl >= 57 && baseId == RUNE_TAP_1)\n+                timebonus += 30000;\n+\n+            //Glyph of Strangulate: -20 sec cooldown for Strangulate\n+            if (baseId == STRANGULATE_1)\n+                timebonus += 20000;\n+\n+            //Item - Death Knight T9 Tank 2P Bonus\n+            if (lvl >= 80 && (baseId == UNBREAKABLE_ARMOR_1 || baseId == VAMPIRIC_BLOOD_1 || baseId == BONE_SHIELD_1))\n+                timebonus += 10000;\n+            //Strangulate Cooldown Reduction: -5 sec cooldown for Strangulate\n+            if (baseId == STRANGULATE_1)\n+                timebonus += 5000;\n+\n+            //Empower Rune Weapon Cooldown Reduction For Bot: -3 min\n+            if (baseId == EMPOWER_RUNE_WEAPON_1)\n+                timebonus += 180000;\n+\n+            cooldown = int32(std::max<float>((float(cooldown) * (1.0f - pctbonus)) - timebonus, 0.f));\n+        }\n+\n+        void ApplyClassSpellCategoryCooldownMods(SpellInfo const* spellInfo, uint32& cooldown) const override\n+        {\n+            //cooldown is in milliseconds\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            int32 timebonus = 0;\n+            float pctbonus = 0.0f;\n+\n+            //pct mods\n+            //Aspiration\n+            //if (lvl >= 45 && baseId == PENANCE_1)\n+            //    pctbonus += 0.2f;\n+\n+            //flat mods\n+            //Morbidity part 2\n+            if (baseId == DEATH_AND_DECAY_1)\n+                timebonus += 15000;\n+\n+            //Item - Death Knight T9 Tank 2P Bonus\n+            if (lvl >= 80 && baseId == DARK_COMMAND_1)\n+                timebonus += 2000;\n+\n+            cooldown = int32(std::max<float>((float(cooldown) * (1.0f - pctbonus)) - timebonus, 0.f));\n+        }\n+\n+        void ApplyClassSpellGlobalCooldownMods(SpellInfo const* spellInfo, float& cooldown) const override\n+        {\n+            //cooldown is in milliseconds\n+            //uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            //uint8 lvl = me->GetLevel();\n+            float timebonus = 0.0f;\n+            float pctbonus = 0.0f;\n+\n+            //Unholy Presence\n+            if (_presence == DEATH_KNIGHT_UNHOLY_PRESENCE &&\n+                ((spellInfo->SpellFamilyFlags[0] & 0xFFDFFE7F) ||\n+                (spellInfo->SpellFamilyFlags[0] & 0x480B11F7) ||\n+                (spellInfo->SpellFamilyFlags[0] & 0x20)))\n+                timebonus += 500.f;\n+\n+            cooldown = (cooldown * (1.0f - pctbonus)) - timebonus;\n+        }\n+\n+        void ApplyClassSpellRadiusMods(SpellInfo const* spellInfo, float& radius) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            //uint8 lvl = me->GetLevel();\n+            float flatbonus = 0.0f;\n+            float pctbonus = 0.0f;\n+\n+            //pct mods\n+            ////Holy Reach\n+            //if (lvl >= 25 && ((spellInfo->SpellFamilyFlags[0] & 0x18400200) || (spellInfo->SpellFamilyFlags[2] & 0x4)))\n+            //    pctbonus += 0.2f;\n+\n+            //flat mods\n+            //Glyph of Corpse Explosion\n+            if (spellInfo->SpellFamilyFlags[1] & 0x20)\n+                flatbonus += 5.f;\n+            //Glyph of Pestilence\n+            if (baseId == PESTILENCE_1)\n+                flatbonus += 5.f;\n+\n+            radius = radius * (1.0f + pctbonus) + flatbonus;\n+        }\n+\n+        void ApplyClassSpellRangeMods(SpellInfo const* spellInfo, float& maxrange) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            //uint8 lvl = me->GetLevel();\n+            float flatbonus = 0.0f;\n+            float pctbonus = 0.0f;\n+\n+            //pct mods\n+            //Holy Reach: +20% range for Holy Spells\n+            //if (lvl >= 25 && (spellInfo->SpellFamilyFlags[0] & 0x100080))\n+            //    pctbonus += 0.2f;\n+\n+            //flat mods\n+            //Icy Reach: +10 yd range for Icy Touch, Chains of Ice and Howling Blast\n+            if (baseId == ICY_TOUCH_1 || baseId == CHAINS_OF_ICE_1 || baseId == HOWLING_BLAST_1)\n+                flatbonus += 10.f;\n+\n+            maxrange = maxrange * (1.0f + pctbonus) + flatbonus;\n+        }\n+\n+        void OnClassSpellGo(SpellInfo const* spellInfo) override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+\n+            //Glyph of Rune Tap part 2\n+            if (baseId == RUNE_TAP_1)\n+                me->CastSpell(me, GLYPH_RUNE_TAP_HEAL, true);\n+\n+            //Empower Rune Weapon: rune activation helper\n+            if (baseId == EMPOWER_RUNE_WEAPON_1)\n+                ActivateAllRunes();\n+\n+            //Improved Chains of Ice (62142): convert frost rune into death rune\n+            if (lvl >= 80 && baseId == CHAINS_OF_ICE_1)\n+            {\n+                ConvertRune(RUNE_FROST);\n+            }\n+            //Death Rune Mastery: convert Unholy and Frost Runes into Death Runes\n+            if (lvl >= 57 && (baseId == DEATH_STRIKE_1 || baseId == OBLITERATE_1))\n+            {\n+                ConvertRune(RUNE_UNHOLY);\n+                ConvertRune(RUNE_FROST);\n+            }\n+            //Reaping: Blood Strike and Pestilence convert Blood Rune to Death Rune\n+            if ((GetSpec() == BOT_SPEC_DK_UNHOLY) && lvl >= 60 && (baseId == BLOOD_STRIKE_1 || baseId == PESTILENCE_1))\n+            {\n+                ConvertRune(RUNE_BLOOD);\n+                //Blood of the North (part 2): same effect\n+                if (lvl >= 62)\n+                    ConvertRune(RUNE_BLOOD);\n+            }\n+            //Rime: consume buff\n+            if (baseId == HOWLING_BLAST_1 && rimeProcTimer > GetLastDiff() && me->HasAura(RIME_BUFF))\n+                me->RemoveAurasDueToSpell(RIME_BUFF);\n+            //Blood Tap\n+            if (baseId == BLOOD_TAP_1)\n+            {\n+                ConvertRune(RUNE_BLOOD);\n+\n+                //Item - Death Knight T10 Tank 4P Bonus: Blood Armor (12% damage reduce)\n+                if (lvl >= 80)\n+                    me->CastSpell(me, ITEM_DEATH_KNIGHT_T10_TANK_4P_BUFF, true);\n+            }\n+\n+            //stances\n+            if (spellInfo->GetCategory() == 47)\n+            {\n+                presencetimer = 1000;\n+\n+                if (baseId == BLOOD_PRESENCE_1)\n+                    _presence = DEATH_KNIGHT_BLOOD_PRESENCE;\n+                else if (baseId == FROST_PRESENCE_1)\n+                    _presence = DEATH_KNIGHT_FROST_PRESENCE;\n+                else if (baseId == UNHOLY_PRESENCE_1)\n+                    _presence = DEATH_KNIGHT_UNHOLY_PRESENCE;\n+            }\n+        }\n+\n+        void SpellHitTarget(WorldObject* wtarget, SpellInfo const* spell) override\n+        {\n+            Unit* target = wtarget->ToUnit();\n+            if (!target)\n+                return;\n+\n+            uint32 spellId = spell->Id;\n+            uint32 baseId = spell->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+\n+            //consume buffs (not on spell go)\n+            //Killing Machine\n+            //Deathchill\n+            AuraEffect const* mach = me->GetAuraEffect(KILLING_MACHINE_BUFF, 0);\n+            AuraEffect const* chil = me->GetAuraEffect(DEATHCHILL_1, 0);\n+            if (mach && mach->IsAffectingSpell(spell))\n+                me->RemoveAurasDueToSpell(KILLING_MACHINE_BUFF);\n+            else if (chil && chil->IsAffectingSpell(spell))\n+                me->RemoveAurasDueToSpell(DEATHCHILL_1);\n+\n+            //Icy Touch tanking helper (TODO: remove this hack after threat mods implementation)\n+            //emulating passive mod +600% threat generated by Icy Touch while in Frost Presence\n+            if (baseId == ICY_TOUCH_1 && _presence == DEATH_KNIGHT_FROST_PRESENCE && target->CanHaveThreatList())\n+            {\n+                if (SpellThreatEntry const* threatEntry = sSpellMgr->GetSpellThreatEntry(spellId))\n+                {\n+                    int32 baseThreat = 0;\n+                    if (threatEntry->apPctMod != 0x0)\n+                        baseThreat += int32(threatEntry->apPctMod * me->GetTotalAttackPowerValue(BASE_ATTACK));\n+                    baseThreat += threatEntry->flatMod;\n+\n+                    if (baseThreat)\n+                        target->GetThreatManager().AddThreat(me, baseThreat * 6.f, spell);\n+                }\n+            }\n+\n+            //Improved Icy Touch part 2: 6% increased effect (flat)\n+            if (baseId == FROST_FEVER_AURA)\n+            {\n+                if (Aura const* feve = target->GetAura(spellId, me->GetGUID()))\n+                {\n+                    if (AuraEffect* fev1 = feve->GetEffect(1))\n+                        fev1->ChangeAmount(fev1->GetAmount() - 6);\n+                    if (AuraEffect* fev2 = feve->GetEffect(2))\n+                        fev2->ChangeAmount(fev2->GetAmount() - 6);\n+                }\n+            }\n+            //Rime (part 2): Obliterate has 15% chance to reset Howling Blast cooldown\n+            if ((GetSpec() == BOT_SPEC_DK_FROST) && baseId == OBLITERATE_1 && urand(1,100) <= 15)\n+            {\n+                ResetSpellCooldown(HOWLING_BLAST_1);\n+                me->CastSpell(me, RIME_BUFF, true);\n+            }\n+\n+            //Glyph of Horn of Winter: 1 minute bonus duration (8 for bot)\n+            if (baseId == HORN_OF_WINTER_1)\n+            {\n+                if (Aura* horn = target->GetAura(spellId, me->GetGUID()))\n+                {\n+                    uint32 dur = horn->GetDuration() + 480000;\n+                    horn->SetDuration(dur);\n+                    horn->SetMaxDuration(dur);\n+                }\n+\n+                //Winter Veil addition\n+                if (sGameEventMgr->IsActiveEvent(GAME_EVENT_WINTER_VEIL))\n+                    target->AddAura(44755, target); //snowflakes\n+            }\n+            //Epidemic: 6 sec bonus duration for DK Diseases\n+            if (baseId == FROST_FEVER_AURA || baseId == BLOOD_PLAGUE_AURA ||\n+                baseId == CRYPT_FEVER_AURA || baseId == EBON_PLAGUE_AURA)\n+            {\n+                if (Aura* fever = target->GetAura(spellId, me->GetGUID()))\n+                {\n+                    uint32 dur = fever->GetDuration() + 6000;\n+                    fever->SetDuration(dur);\n+                    fever->SetMaxDuration(dur);\n+                }\n+            }\n+            //Chilblains: proc Icy Clutch\n+            if ((GetSpec() == BOT_SPEC_DK_FROST) && lvl >= 61 && baseId == FROST_FEVER_AURA)\n+                me->CastSpell(target, CHILBLAINS_DEBUFF, true);\n+            //Sudden Doom: 15% ctc Death Coil on Blood Strike or Heart Strike\n+            if ((GetSpec() == BOT_SPEC_DK_BLOOD) &&\n+                (baseId == BLOOD_STRIKE_1 || baseId == HEART_STRIKE_1) && GetSpell(DEATH_COIL_1) && urand(1,100) <= 15)\n+                me->CastSpell(target, GetSpell(DEATH_COIL_1), true);\n+            //Glyph of Heart Strike\n+            if (baseId == HEART_STRIKE_1)\n+                me->CastSpell(target, GLYPH_HEART_STRIKE_DEBUFF, true);\n+            //Glyph of Howling Blast\n+            if (lvl >= 60 && baseId == HOWLING_BLAST_1)\n+                me->CastSpell(target, FROST_FEVER_AURA, true);\n+            //Glyph of Scourge Strike\n+            if (baseId == SCOURGE_STRIKE_1)\n+                me->CastSpell(target, GLYPH_SCOURGE_STRIKE_EFFECT, true);\n+\n+            OnSpellHitTarget(target, spell);\n+        }\n+\n+        void SpellHit(WorldObject* wcaster, SpellInfo const* spell) override\n+        {\n+            Unit* caster = wcaster->ToUnit();\n+            if (!caster)\n+                return;\n+\n+            uint32 baseId = spell->GetFirstRankSpell()->Id;\n+            uint32 spellId = spell->Id;\n+            uint8 lvl = me->GetLevel();\n+\n+            //Rime helper (Freezing Fog)\n+            if (baseId == RIME_BUFF)\n+            {\n+                rimeProcTimer = 15000;\n+            }\n+\n+            //Improved Blood Presence\n+            if ((GetSpec() == BOT_SPEC_DK_BLOOD) && lvl >= 61 && baseId == BLOOD_PRESENCE_1)\n+            {\n+                if (AuraEffect* pres = me->GetAuraEffect(spellId, 1))\n+                    pres->ChangeAmount(pres->GetAmount() + 10);\n+            }\n+            if (baseId == ANTI_MAGIC_SHELL_1)\n+            {\n+                if (Aura* shell = me->GetAura(spellId))\n+                {\n+                    //Glyph of Anti-Magic Shell: 2 sec increased duration\n+                    uint32 dur = shell->GetDuration() + 2000;\n+                    shell->SetDuration(dur);\n+                    shell->SetMaxDuration(dur);\n+                    //Magic Suppression part 2\n+                    if (AuraEffect* shab = shell->GetEffect(0))\n+                        shab->ChangeAmount(int32(shab->GetAmount() * 1.25f));\n+                }\n+            }\n+            if (baseId == VAMPIRIC_BLOOD_1)\n+            {\n+                //Glyph of Vampiric Blood: 5 sec increased duration\n+                if (Aura* bloo = me->GetAura(spellId))\n+                {\n+                    uint32 dur = bloo->GetDuration() + 5000;\n+                    bloo->SetDuration(dur);\n+                    bloo->SetMaxDuration(dur);\n+                }\n+            }\n+            if (baseId == BONE_SHIELD_1)\n+            {\n+                //Glyph of Bone Shield: 1 bonus charge (1 for bot, 3 for tank)\n+                if (Aura* bone = me->GetAura(spellId))\n+                    bone->SetCharges(bone->GetCharges() + (IsTank() ? 3 : 1));\n+            }\n+            if (baseId == ICEBOUND_FORTITUDE_1)\n+            {\n+                if (Aura* fort = me->GetAura(spellId))\n+                {\n+                    //Icebound Duration Increase: + 3 sec duration\n+                    uint32 dur = fort->GetDuration() + 3000;\n+\n+                    //Guile of Gorefiend (part 2): Icebound Fortitude 6 sec increased duration\n+                    if ((GetSpec() == BOT_SPEC_DK_FROST) && lvl >= 63)\n+                        dur += 6000;\n+\n+                    fort->SetDuration(dur);\n+                    fort->SetMaxDuration(dur);\n+\n+                    if (AuraEffect* eff2 = fort->GetEffect(EFFECT_2))\n+                    {\n+                        //calc correct amount\n+                        int32 amount = eff2->GetAmount() - int32(0.15f * (std::max<int32>(0, GetBotDefense() - lvl*5)));\n+                        //Glyph of Icebound Fortitude\n+                        amount = std::min<int32>(amount, -40);\n+                        //Increased Icebound Fortitude Mitigation (54803)\n+                        if (lvl >= 70)\n+                            amount -= 2;\n+                        eff2->ChangeAmount(amount);\n+                    }\n+                }\n+            }\n+            if (baseId == UNBREAKABLE_ARMOR_1)\n+            {\n+                if (AuraEffect* armo = me->GetAuraEffect(spellId, 0))\n+                    armo->ChangeAmount(armo->GetAmount() + 5); //25 +20% = 30\n+            }\n+\n+            OnSpellHit(caster, spell);\n+        }\n+\n+        void DamageDealt(Unit* victim, uint32& damage, DamageEffectType damageType) override\n+        {\n+            if (victim == me)\n+                return;\n+\n+            if (damageType == DIRECT_DAMAGE || damageType == SPELL_DIRECT_DAMAGE)\n+            {\n+                //Blood Presence Heal\n+                if (_presence == DEATH_KNIGHT_FROST_PRESENCE || _presence == DEATH_KNIGHT_UNHOLY_PRESENCE)\n+                {\n+                    if (int32 bp0 = int32(damage / 25)) //4%\n+                    {\n+                        CastSpellExtraArgs args(true);\n+                        args.AddSpellBP0(bp0);\n+                        me->CastSpell(me, BLOOD_PRESENCE_HEAL_EFFECT, args);\n+                    }\n+                }\n+            }\n+\n+            bot_ai::DamageDealt(victim, damage, damageType);\n+        }\n+\n+        void DamageTaken(Unit* u, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo*/) override\n+        {\n+            if (!u)\n+                return;\n+            if (!u->IsInCombat() && !me->IsInCombat())\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void OwnerAttackedBy(Unit* u) override\n+        {\n+            if (!u)\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        uint8 GetPetPositionNumber(Creature const* /*summon*/) const override\n+        {\n+            //TODO: garg, aod, drw\n+            return 0;\n+        }\n+\n+        void SummonBotPet()\n+        {\n+            if (botPet)\n+                UnsummonAll(false);\n+\n+            uint32 entry = BOT_PET_GHOUL;\n+\n+            Position pos;\n+\n+            Creature* myPet = me->SummonCreature(entry, *me, TEMPSUMMON_CORPSE_DESPAWN);\n+            me->GetNearPoint(myPet, pos.m_positionX, pos.m_positionY, pos.m_positionZ, 0.f, float(me->GetOrientation() + M_PI / 2.f));\n+            myPet->GetMotionMaster()->MovePoint(me->GetMapId(), pos);\n+            myPet->SetCreator(master);\n+            myPet->SetOwnerGUID(me->GetGUID());\n+            myPet->SetFaction(master->GetFaction());\n+            myPet->SetControlledByPlayer(!IAmFree());\n+            myPet->SetPvP(me->IsPvP());\n+            myPet->SetByteValue(UNIT_FIELD_BYTES_2, 1, master->GetByteValue(UNIT_FIELD_BYTES_2, 1));\n+\n+            botPet = myPet;\n+        }\n+\n+        void JustSummoned(Creature* summon) override\n+        {\n+            switch (summon->GetEntry())\n+            {\n+                case NPC_DANCING_RUNE_WEAPON:\n+                case NPC_EBON_GARGOYLE:\n+                    summon->SetCreator(me);\n+                    break;\n+                default:\n+                    break;\n+            }\n+        }\n+\n+        void SummonedCreatureDespawn(Creature* summon) override\n+        {\n+            //all hunter bot pets despawn at death or manually (gossip, teleport, etc.)\n+            //BOT_LOG_ERROR(\"entities.unit\", \"SummonedCreatureDespawn: {}'s {}\", me->GetName(), summon->GetName());\n+            if (summon == botPet)\n+            {\n+                petSummonTimer = 30000;\n+                botPet = nullptr;\n+            }\n+        }\n+\n+        void UnsummonAll(bool savePets = true) override\n+        {\n+            UnsummonPet(savePets);\n+        }\n+\n+        uint32 GetAIMiscValue(uint32 data) const override\n+        {\n+            switch (data)\n+            {\n+                case BOTAI_MISC_PET_TYPE:\n+                    return BOT_PET_GHOUL;\n+                default:\n+                    return 0;\n+            }\n+        }\n+\n+        void Reset() override\n+        {\n+            UnsummonAll(false);\n+\n+            petSummonTimer = 5000;\n+\n+            presencetimer = 0;\n+            runicpowertimer = 2000;\n+            runicpowertimer2 = 5000;\n+\n+            rimeProcTimer = 0;\n+\n+            _presence = BOT_STANCE_NONE;\n+\n+            runicpowerIncomeMult = sWorld->getRate(RATE_POWER_RUNICPOWER_INCOME);\n+            runicpowerLossMult = sWorld->getRate(RATE_POWER_RUNICPOWER_LOSS);\n+\n+            DefaultInit();\n+            InitRunes();\n+        }\n+\n+        void ReduceCD(uint32 diff) override\n+        {\n+            RuneTimers(diff);\n+\n+            if (presencetimer > diff)               presencetimer -= diff;\n+            if (runicpowertimer > diff)             runicpowertimer -= diff;\n+            if (runicpowertimer2 > diff)            runicpowertimer2 -= diff;\n+\n+            if (rimeProcTimer > diff)               rimeProcTimer -= diff;\n+\n+            if (petSummonTimer > diff)              petSummonTimer -= diff;\n+        }\n+\n+        void InitPowers() override\n+        {\n+            me->SetPowerType(POWER_RUNIC_POWER);\n+            me->SetMaxPower(POWER_RUNIC_POWER, 1300);\n+            //RefreshAura(RUNIC_POWER_MASTERY);\n+            //if (AuraEffect* mast = me->GetAuraEffect(RUNIC_POWER_MASTERY, 0))\n+            //{\n+            //    //Runic Power Mastery rank 2\n+            //    mast->ChangeAmount(1300);\n+            //}\n+\n+            if (botPet && botPet->GetPowerType() != POWER_ENERGY)\n+                botPet->SetByteValue(UNIT_FIELD_BYTES_0, 3, POWER_ENERGY);\n+        }\n+\n+        void InitSpells() override\n+        {\n+            uint8 lvl = me->GetLevel();\n+            bool isBloo = GetSpec() == BOT_SPEC_DK_BLOOD;\n+            bool isFros = GetSpec() == BOT_SPEC_DK_FROST;\n+            bool isUnho = GetSpec() == BOT_SPEC_DK_UNHOLY;\n+\n+            InitSpellMap(ICY_TOUCH_1);\n+            InitSpellMap(PLAGUE_STRIKE_1);\n+            InitSpellMap(BLOOD_STRIKE_1);\n+            InitSpellMap(DEATH_STRIKE_1);\n+            InitSpellMap(OBLITERATE_1);\n+            InitSpellMap(RUNE_STRIKE_1);\n+            InitSpellMap(BLOOD_BOIL_1);\n+            InitSpellMap(DEATH_AND_DECAY_1);\n+            InitSpellMap(DEATH_COIL_1);\n+            InitSpellMap(DEATH_GRIP_1);\n+            InitSpellMap(PESTILENCE_1);\n+            InitSpellMap(MIND_FREEZE_1);\n+            InitSpellMap(STRANGULATE_1);\n+            InitSpellMap(CHAINS_OF_ICE_1);\n+            InitSpellMap(ICEBOUND_FORTITUDE_1);\n+            InitSpellMap(DARK_COMMAND_1);\n+            InitSpellMap(ANTI_MAGIC_SHELL_1);\n+            InitSpellMap(ARMY_OF_THE_DEAD_1);\n+            InitSpellMap(PATH_OF_FROST_1);\n+            InitSpellMap(HORN_OF_WINTER_1);\n+            InitSpellMap(EMPOWER_RUNE_WEAPON_1);\n+            InitSpellMap(BLOOD_TAP_1);\n+\n+  /*Talent*/lvl >= 57 ? InitSpellMap(RUNE_TAP_1) : RemoveSpell(RUNE_TAP_1);\n+  /*Talent*/lvl >= 59 && isBloo ? InitSpellMap(MARK_OF_BLOOD_1) : RemoveSpell(MARK_OF_BLOOD_1);\n+  /*Talent*/lvl >= 61 && isBloo ? InitSpellMap(HYSTERIA_1) : RemoveSpell(HYSTERIA_1);\n+  /*Talent*/lvl >= 62 && isBloo ? InitSpellMap(VAMPIRIC_BLOOD_1) : RemoveSpell(VAMPIRIC_BLOOD_1);\n+  /*Talent*/lvl >= 63 && isBloo ? InitSpellMap(HEART_STRIKE_1) : RemoveSpell(HEART_STRIKE_1);\n+  /*Talent*/lvl >= 65 && isBloo ? InitSpellMap(DANCING_RUNE_DEAPON_1) : RemoveSpell(DANCING_RUNE_DEAPON_1);\n+\n+  /*Talent*/lvl >= 57 ? InitSpellMap(LICHBORNE_1) : RemoveSpell(LICHBORNE_1);\n+  /*Talent*/lvl >= 59 && isFros ? InitSpellMap(DEATHCHILL_1) : RemoveSpell(DEATHCHILL_1);\n+  /*Talent*/lvl >= 61 && isFros ? InitSpellMap(HUNGERING_COLD_1) : RemoveSpell(HUNGERING_COLD_1);\n+  /*Talent*/lvl >= 62 && isFros ? InitSpellMap(UNBREAKABLE_ARMOR_1) : RemoveSpell(UNBREAKABLE_ARMOR_1);\n+  /*Talent*/lvl >= 63 && isFros ? InitSpellMap(FROST_STRIKE_1) : RemoveSpell(FROST_STRIKE_1);\n+  /*Talent*/lvl >= 65 && isFros ? InitSpellMap(HOWLING_BLAST_1) : RemoveSpell(HOWLING_BLAST_1);\n+\n+  /*Talent*/lvl >= 61 && isUnho ? InitSpellMap(ANTI_MAGIC_ZONE_1) : RemoveSpell(ANTI_MAGIC_ZONE_1);\n+  /*Talent*/lvl >= 62 && isUnho ? InitSpellMap(BONE_SHIELD_1) : RemoveSpell(BONE_SHIELD_1);\n+  /*Talent*/lvl >= 63 && isUnho ? InitSpellMap(SCOURGE_STRIKE_1) : RemoveSpell(SCOURGE_STRIKE_1);\n+  /*Talent*/lvl >= 65 && isUnho ? InitSpellMap(SUMMON_GARGOYLE_1) : RemoveSpell(SUMMON_GARGOYLE_1);\n+\n+            InitSpellMap(BLOOD_PRESENCE_1, true);\n+            InitSpellMap(FROST_PRESENCE_1, true);\n+            InitSpellMap(UNHOLY_PRESENCE_1, true);\n+        }\n+\n+        void ApplyClassPassives() const override\n+        {\n+            uint8 level = master->GetLevel();\n+            bool isBloo = GetSpec() == BOT_SPEC_DK_BLOOD;\n+            bool isFros = GetSpec() == BOT_SPEC_DK_FROST;\n+            bool isUnho = GetSpec() == BOT_SPEC_DK_UNHOLY;\n+\n+            RefreshAura(BUTCHERY, level >= 55 ? 1 : 0);\n+            RefreshAura(BLADED_ARMOR, level >= 56 ? 1 : 0);\n+            RefreshAura(SCENT_OF_BLOOD, level >= 56 ? 1 : 0);\n+            RefreshAura(TWO_HANDED_WEAPON_SPECIALIZATION, level >= 56 ? 1 : 0);\n+            RefreshAura(SPELL_DEFLECTION, isBloo && level >= 58 ? 1 : 0);\n+            RefreshAura(VENDETTA, isBloo && level >= 58 ? 1 : 0);\n+            RefreshAura(BLOODY_VENGEANCE3, isBloo && level >= 62 ? 1 : 0);\n+            RefreshAura(BLOODY_VENGEANCE2, isBloo && level >= 61 && level < 62 ? 1 : 0);\n+            RefreshAura(BLOODY_VENGEANCE1, isBloo && level >= 60 && level < 61 ? 1 : 0);\n+            RefreshAura(ABOMINATIONS_MIGHT, !IAmFree() && isBloo && level >= 60 ? 1 : 0);\n+            //RefreshAura(BLOODWORMS, isBloo && level >= 61 ? 1 : 0);\n+            RefreshAura(IMPROVED_BLOOD_PRESENCE, isBloo && level >= 61 ? 1 : 0);\n+            RefreshAura(WILL_OF_THE_NECROPOLIS, isBloo && level >= 63 ? 1 : 0);\n+\n+            RefreshAura(TOUGHNESS, level >= 55 ? 1 : 0);\n+            RefreshAura(ICY_TALONS, level >= 57 ? 1 : 0);\n+            RefreshAura(ANNIHILATION, level >= 57 ? 1 : 0);\n+            RefreshAura(KILLING_MACHINE, isFros && level >= 58 ? 1 : 0);\n+            RefreshAura(CHILL_OF_THE_GRAVE, isFros && level >= 58 ? 1 : 0);\n+            RefreshAura(FRIGID_DREADPLATE, isFros && level >= 59 ? 1 : 0);\n+            RefreshAura(IMPROVED_ICY_TALONS, !IAmFree() && isFros && level >= 60 ? 1 : 0);\n+            RefreshAura(THREAT_OF_THASSARIAN, isFros && level >= 62 ? 1 : 0);\n+            RefreshAura(ACCLIMATION, isFros && level >= 63 ? 1 : 0);\n+\n+            RefreshAura(NECROSIS5, isUnho && level >= 62 ? 1 : 0);\n+            RefreshAura(NECROSIS4, isUnho && level >= 60 && level < 61 ? 1 : 0);\n+            RefreshAura(NECROSIS3, isUnho && level >= 59 && level < 60 ? 1 : 0);\n+            RefreshAura(NECROSIS2, isUnho && level >= 58 && level < 59 ? 1 : 0);\n+            RefreshAura(NECROSIS1, isUnho && level >= 57 && level < 58 ? 1 : 0);\n+            RefreshAura(ON_A_PALE_HORSE_A, isUnho && level >= 58 ? 1 : 0);\n+            RefreshAura(ON_A_PALE_HORSE_B, isUnho && level >= 58 ? 1 : 0);\n+            RefreshAura(BLOOD_CAKED_BLADE3, isUnho && level >= 60 ? 1 : 0);\n+            RefreshAura(BLOOD_CAKED_BLADE2, isUnho && level >= 59 && level < 60 ? 1 : 0);\n+            RefreshAura(BLOOD_CAKED_BLADE1, isUnho && level >= 58 && level < 59 ? 1 : 0);\n+            RefreshAura(UNHOLY_BLIGHT, isUnho && level >= 59 ? 1 : 0);\n+            RefreshAura(DIRGE, isUnho && level >= 59 ? 1 : 0);\n+            RefreshAura(DESECRATION, isUnho && level >= 60 ? 1 : 0);\n+            RefreshAura(DESOLATION, isUnho && level >= 61 ? 1 : 0);\n+            RefreshAura(IMPROVED_UNHOLY_PRESENCE, isUnho && level >= 61 ? 1 : 0);\n+            RefreshAura(CRYPT_FEVER, isUnho && level >= 62 ? 1 : 0);\n+            RefreshAura(WANDERING_PLAGUE, isUnho && level >= 63 ? 1 : 0);\n+            RefreshAura(EBON_PLAGUEBRINGER, isUnho && level >= 63 ? 1 : 0);\n+\n+            RefreshAura(GLYPH_DISEASE);\n+            RefreshAura(GLYPH_CHAINS_OF_ICE);\n+            RefreshAura(GLYPH_UNHOLY_BLIGHT, level >= 60 ? 1 : 0);\n+\n+            RefreshAura(CHAINS_OF_ICE_FROST_RUNE_REFRESH);\n+            RefreshAura(ITEM_DEATH_KNIGHT_T8_MELEE_4P, level >= 80 ? 1 : 0);\n+            RefreshAura(ITEM_DEATH_KNIGHT_T9_MELEE_4P, level >= 80 ? 1 : 0);\n+\n+            RefreshAura(FROST_FEVER);\n+            RefreshAura(BLOOD_PLAGUE);\n+            RefreshAura(RUNE_STRIKE_PASSIVE);\n+        }\n+\n+        bool CanUseManually(uint32 basespell) const override\n+        {\n+            switch (basespell)\n+            {\n+                case LICHBORNE_1:\n+                case PATH_OF_FROST_1:\n+                case HORN_OF_WINTER_1:\n+                case BONE_SHIELD_1:\n+                case RUNE_TAP_1:\n+                case EMPOWER_RUNE_WEAPON_1:\n+                case VAMPIRIC_BLOOD_1:\n+                case HYSTERIA_1:\n+                    return true;\n+                case DEATH_COIL_1:\n+                    return master->GetCreatureType() == CREATURE_TYPE_UNDEAD;\n+                default:\n+                    return false;\n+            }\n+        }\n+\n+        std::vector<uint32> const* GetDamagingSpellsList() const override\n+        {\n+            return &Deathknight_spells_damage;\n+        }\n+        std::vector<uint32> const* GetCCSpellsList() const override\n+        {\n+            return &Deathknight_spells_cc;\n+        }\n+        //std::vector<uint32> const* GetHealingSpellsList() const override\n+        //{\n+        //    return &Deathknight_spells_heal;\n+        //}\n+        std::vector<uint32> const* GetSupportSpellsList() const override\n+        {\n+            return &Deathknight_spells_support;\n+        }\n+\n+    private:\n+        BotRuneInfo _runes[MAX_RUNES];\n+\n+/*tmrs*/uint32 presencetimer, runicpowertimer, runicpowertimer2;\n+        uint32 rimeProcTimer;\n+/*misc*/int32 runicpower;\n+/*misc*/int32 runeCost[NUM_RUNE_TYPES];\n+/*misc*/float runicpowerIncomeMult, runicpowerLossMult;\n+/*Chck*/uint8 _presence;\n+        //Pet\n+        uint32 petSummonTimer;\n+\n+        bool HaveRunes(uint32 spellId)\n+        {\n+            SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);\n+            return (spellInfo && HaveRunes(spellInfo));\n+        }\n+\n+        bool HaveRunes(SpellInfo const* spellInfo)\n+        {\n+            if (spellInfo->PowerType != POWER_RUNE || !spellInfo->RuneCostID)\n+                return true;\n+\n+            SpellRuneCostEntry const* src = sSpellRuneCostStore.LookupEntry(spellInfo->RuneCostID);\n+            if (!src || src->NoRuneCost())\n+                return true;\n+\n+            //Freezing Fog\n+            if (rimeProcTimer > GetLastDiff() && spellInfo->Id == HOWLING_BLAST_1)\n+                return true;\n+\n+            for (auto i : NPCBots::index_array<uint8, RUNE_DEATH>)\n+                runeCost[i] = src->RuneCost[i];\n+\n+            runeCost[RUNE_DEATH] = MAX_RUNES;\n+\n+            for (auto i : NPCBots::index_array<uint8, MAX_RUNES>)\n+            {\n+                uint8 rune = _runes[i].CurrentRune;\n+                if (runeCost[rune] > 0 && _runes[i].Cooldown <= 0)\n+                    runeCost[rune]--;\n+            }\n+\n+            for (auto i : NPCBots::index_array<uint8, RUNE_DEATH>)\n+                if (runeCost[i] > 0)\n+                    runeCost[RUNE_DEATH] += runeCost[i];\n+\n+            if (runeCost[RUNE_DEATH] > MAX_RUNES)\n+                return false;\n+\n+            return true;\n+        }\n+\n+        bool SpendRune(uint8 runetype, bool didHit)\n+        {\n+            for (auto i : NPCBots::index_array<uint8, MAX_RUNES>)\n+            {\n+                if (_runes[i].CurrentRune == runetype && _runes[i].Cooldown <= 0)\n+                {\n+                    _runes[i].CurrentRune = _runes[i].BaseRune;\n+                    uint32 cooldown = didHit ? RUNE_BASE_COOLDOWN : RUNE_MISS_COOLDOWN;\n+\n+                    //Improved Unholy Presence\n+                    if (_presence == DEATH_KNIGHT_UNHOLY_PRESENCE)\n+                        cooldown -= 1000;\n+\n+                    _runes[i].Cooldown += cooldown;\n+                    return true;\n+                }\n+            }\n+\n+            return false;\n+        }\n+\n+        uint8 GetCooledRunesCount(uint8 runetype) const\n+        {\n+            uint8 count = 0;\n+            for (auto i : NPCBots::index_array<uint8, MAX_RUNES>)\n+                if (_runes[i].BaseRune == runetype && _runes[i].Cooldown > 0)\n+                    ++count;\n+\n+            return count;\n+        }\n+\n+        uint8 GetCooledRunesCount() const\n+        {\n+            uint8 count = 0;\n+            for (auto i : NPCBots::index_array<uint8, MAX_RUNES>)\n+                if (_runes[i].Cooldown > 0)\n+                    ++count;\n+\n+            return count;\n+        }\n+\n+        uint32 GetTotalRunesCooldown() const\n+        {\n+            uint32 totalCd = 0;\n+            for (auto i : NPCBots::index_array<uint8, MAX_RUNES>)\n+                totalCd += std::max<int32>(_runes[i].Cooldown, 0);\n+\n+            return totalCd;\n+        }\n+\n+        void ConvertRune(uint8 runetype)\n+        {\n+            for (auto i : NPCBots::index_array<uint8, MAX_RUNES>)\n+            {\n+                if (_runes[i].CurrentRune == runetype)\n+                {\n+                    _runes[i].CurrentRune = RUNE_DEATH;\n+                    return;\n+                }\n+            }\n+        }\n+\n+        void ActivateAllRunes()\n+        {\n+            for (auto i : NPCBots::index_array<uint8, MAX_RUNES>)\n+                _runes[i].Cooldown = std::min<int32>(_runes[i].Cooldown, me->IsInCombat() ? -1 : 0);\n+        }\n+\n+        void InitRunes()\n+        {\n+            for (auto i : NPCBots::index_array<uint8, MAX_RUNES>)\n+            {\n+                _runes[i].BaseRune = runeSlotTypes[i];\n+                _runes[i].CurrentRune = _runes[i].BaseRune;\n+                _runes[i].Cooldown = 0;\n+            }\n+        }\n+\n+        void RuneTimers(uint32 diff)\n+        {\n+            for (auto i : NPCBots::index_array<uint8, MAX_RUNES>)\n+            {\n+                int32 &cd = _runes[i].Cooldown;\n+                if (me->IsInCombat())\n+                {\n+                    //RGP\n+                    if (cd != 0)\n+                    {\n+                        if (cd >= int32(-2500 + diff))\n+                            cd -= diff;\n+                        else if (cd != -2500)\n+                            cd = -2500;\n+                        //ensurance\n+                        if (!cd)\n+                            --cd;\n+                    }\n+                }\n+                else\n+                {\n+                    if (cd >= int32(diff))\n+                        cd -= diff;\n+                    else if (cd)\n+                        cd = 0;\n+                }\n+            }\n+        }\n+\n+        bool IsDiseased(Unit const* unit) const\n+        {\n+            static const AuraType botDiseaseAuraTypes[] =\n+            {\n+                SPELL_AURA_PERIODIC_DAMAGE, // Frost Fever and Blood Plague\n+                SPELL_AURA_LINKED,          // Crypt Fever and Ebon Plague\n+                SPELL_AURA_NONE\n+            };\n+\n+            for (AuraType const* itr = botDiseaseAuraTypes; *itr != SPELL_AURA_NONE; ++itr)\n+            {\n+                for (AuraEffect const* aeff : unit->GetAuraEffectsByType(*itr))\n+                {\n+                    // Get auras with disease dispel type by caster\n+                    if (aeff->GetSpellInfo()->Dispel == DISPEL_DISEASE)\n+                        return true;\n+                }\n+            }\n+\n+            return false;\n+        }\n+    };\n+};\n+\n+void AddSC_death_knight_bot()\n+{\n+    new death_knight_bot();\n+}\ndiff --git a/src/server/game/AI/NpcBots/bot_dreadlord_ai.cpp b/src/server/game/AI/NpcBots/bot_dreadlord_ai.cpp\nnew file mode 100644\nindex 0000000000..2166476210\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bot_dreadlord_ai.cpp\n@@ -0,0 +1,535 @@\n+#include \"bot_ai.h\"\n+#include \"botspell.h\"\n+#include \"Player.h\"\n+#include \"ScriptMgr.h\"\n+#include \"SpellAuras.h\"\n+#include \"TemporarySummon.h\"\n+/*\n+Dreadlord NpcBot (by Trickerer onlysuffering@gmail.com)\n+Description:\n+Incredibly powerful demon who wields power of darkness and mental domination\n+Specifics:\n+High armor, high resistances, partially immune to control effects, damage taken speeds up spells recharge, plate armor,\n+deals melee/spellshadow damage, bonus damage to CCed units, spell power bonus: 200% strength.\n+Abilities:\n+1) Carrion Swarm. Sends a horde of bats combined with chaotic magic to damage enemies in frontal cone, 10 seconds cooldown.\n+2) Sleep. Puts the enemy target to sleep for 60 seconds (15 seconds on players) and allows next physical attack\n+on that target to bypass armor, removed by direct damage, 6 seconds cooldown.\n+3) Vampiric Aura. Increases physical critical damage by 5% and heals party and raid members within 40 yards for a\n+percentage (100% for Dreadlord and 25% for everyone else) of damage done by physical attacks and Carrion Swarm, no threat.\n+4) Summon Infernal Servant. Calls an infernal down from the sky dealing damage and stunning enemy units, lasts 180 seconds, 180 seconds cooldown.\n+Complete - 100%\n+TODO:\n+*/\n+\n+enum DreadlordBaseSpells\n+{\n+    CARRION_SWARM_1         = SPELL_CARRION_SWARM,\n+    SLEEP_1                 = SPELL_SLEEP,\n+    INFERNO_1               = SPELL_INFERNO\n+};\n+enum DreadlordPassives\n+{\n+    VAMPIRIC_AURA           = SPELL_VAMPIRIC_AURA,\n+};\n+enum DreadlordSpecial\n+{\n+    MH_ATTACK_ANIM          = SPELL_ATTACK_MELEE_1H,\n+\n+    CARRION_COST            = 110 * 5,\n+    SLEEP_COST              = 50 * 5,\n+    INFERNAL_COST           = 175 * 5,\n+\n+    DAMAGE_CD_REDUCTION     = 250,//ms\n+    INFERNO_SPAWN_DELAY     = 650,//ms\n+\n+    IMMOLATION              = 39007\n+};\n+\n+static const std::vector<uint32> Dreadlord_spells_damage{ CARRION_SWARM_1, INFERNO_1 };\n+static const std::vector<uint32> Dreadlord_spells_cc{ SLEEP_1 };\n+static const std::vector<uint32> Dreadlord_spells_support{ INFERNO_1 };\n+\n+class dreadlord_bot : public CreatureScript\n+{\n+public:\n+    dreadlord_bot() : CreatureScript(\"dreadlord_bot\") { }\n+\n+    CreatureAI* GetAI(Creature* creature) const override\n+    {\n+        return new dreadlord_botAI(creature);\n+    }\n+/*\n+    bool OnGossipHello(Player* player, Creature* creature)\n+    {\n+        return creature->GetBotAI()->OnGossipHello(player, 0);\n+    }\n+\n+    bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action)\n+    {\n+        if (bot_ai* ai = creature->GetBotAI())\n+            return ai->OnGossipSelect(player, creature, sender, action);\n+        return true;\n+    }\n+\n+    bool OnGossipSelectCode(Player* player, Creature* creature, uint32 sender, uint32 action, char const* code)\n+    {\n+        if (bot_ai* ai = creature->GetBotAI())\n+            return ai->OnGossipSelectCode(player, creature, sender, action, code);\n+        return true;\n+    }\n+*/\n+    struct dreadlord_botAI : public bot_ai\n+    {\n+    private:\n+        //DelayedPetSpawnEvent - Dreadlord\n+        //Impact anim, spawn, linked effects\n+        class DelayedPetSpawnEvent : public BasicEvent\n+        {\n+            public:\n+                DelayedPetSpawnEvent(Creature const* bot, Position const* pos) : _bot(bot), _pos(pos) { }\n+\n+            protected:\n+                bool Execute(uint64 /*e_time*/, uint32 /*p_time*/)\n+                {\n+                    ((dreadlord_botAI*)_bot->AI())->SummonBotPet(_pos);\n+                    return true;\n+                }\n+\n+            private:\n+                Creature const* _bot;\n+                Position const* _pos;\n+        };\n+\n+    public:\n+        dreadlord_botAI(Creature* creature) : bot_ai(creature)\n+        {\n+            _botclass = BOT_CLASS_DREADLORD;\n+\n+            InitUnitFlags();\n+\n+            //dreadlord immunities\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_POSSESS, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_CHARM, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_SHAPESHIFT, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_TRANSFORM, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_DISARM, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_DISARM_OFFHAND, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_FEAR, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_DISARM, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_POLYMORPH, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_FEAR, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_HORROR, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_TURN, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SLEEP, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SILENCE, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SNARE, true);\n+        }\n+\n+        bool doCast(Unit* victim, uint32 spellId)\n+        {\n+            if (CheckBotCast(victim, spellId) != SPELL_CAST_OK)\n+                return false;\n+            return bot_ai::doCast(victim, spellId);\n+        }\n+\n+        void StartAttack(Unit* u, bool force = false)\n+        {\n+            if (!bot_ai::StartAttack(u, force))\n+                return;\n+            GetInPosition(force, u);\n+        }\n+\n+        void JustEnteredCombat(Unit* u) override { bot_ai::JustEnteredCombat(u); }\n+        void KilledUnit(Unit* u) override { bot_ai::KilledUnit(u); }\n+        void EnterEvadeMode(EvadeReason why = EVADE_REASON_OTHER) override { bot_ai::EnterEvadeMode(why); }\n+        void MoveInLineOfSight(Unit* u) override { bot_ai::MoveInLineOfSight(u); }\n+        void JustDied(Unit* u) override { UnsummonAll(false); bot_ai::JustDied(u); }\n+        void DoNonCombatActions(uint32 /*diff*/) { }\n+\n+        void CheckAura(uint32 diff)\n+        {\n+            if (checkAuraTimer > diff || GC_Timer > diff || IsCasting())\n+                return;\n+\n+            checkAuraTimer = 10000;\n+\n+            if (!me->HasAura(VAMPIRIC_AURA, me->GetGUID()))\n+                RefreshAura(VAMPIRIC_AURA);\n+        }\n+\n+        void UpdateAI(uint32 diff) override\n+        {\n+            if (!GlobalUpdate(diff))\n+                return;\n+\n+            DoVehicleActions(diff);\n+            if (!CanBotAttackOnVehicle())\n+                return;\n+\n+            //if (!me->IsInCombat())\n+            //    DoNonCombatActions(diff);\n+\n+            CheckAura(diff);\n+\n+            if (IsPotionReady())\n+            {\n+                if (me->GetPower(POWER_MANA) < CARRION_COST)\n+                    DrinkPotion(true);\n+                else if (GetHealthPCT(me) < 50)\n+                    DrinkPotion(false);\n+            }\n+\n+            if (IsCasting())\n+                return;\n+\n+            if (IsSpellReady(INFERNO_1, diff) && !botPet && me->IsInCombat() &&\n+                me->GetPower(POWER_MANA) >= INFERNAL_COST && Rand() < 60)\n+            {\n+                Unit* target = FindAOETarget(CalcSpellMaxRange(INFERNO_1));\n+\n+                if (target)\n+                    _infernoPos = target->GetPosition();\n+                else\n+                    me->GetNearPoint(me, _infernoPos.m_positionX, _infernoPos.m_positionY, _infernoPos.m_positionZ, 5.f, 0.f);\n+\n+                me->CastSpell(_infernoPos, GetSpell(INFERNO_1), false);\n+                return;\n+            }\n+\n+            if (ProcessImmediateNonAttackTarget())\n+                return;\n+\n+            if (!CheckAttackTarget())\n+                return;\n+\n+            CheckUsableItems(diff);\n+\n+            CheckSleep(diff);\n+\n+            Attack(diff);\n+        }\n+\n+        void Attack(uint32 diff)\n+        {\n+            Unit* mytar = opponent ? opponent : disttarget ? disttarget : nullptr;\n+            if (!mytar)\n+                return;\n+\n+            StartAttack(mytar, IsMelee());\n+\n+            CheckAttackState();\n+            if (!me->IsAlive() || !mytar->IsAlive())\n+                return;\n+\n+            MoveBehind(mytar);\n+\n+            if (!HasRole(BOT_ROLE_DPS))\n+                return;\n+\n+            if (IsSpellReady(CARRION_SWARM_1, diff) && me->GetPower(POWER_MANA) >= CARRION_COST && Rand() < 80)\n+            {\n+                bool cast = false;\n+                if (me->HasInArc(float(M_PI)/2, mytar) && me->GetDistance(mytar) < 25 &&\n+                    (IsTank() || GetManaPCT(me) > 60 || me->getAttackers().empty() || GetHealthPCT(me) < 50 ||\n+                    mytar->HasAura(SLEEP_1)))\n+                {\n+                    cast = true;\n+                }\n+\n+                if (!cast)\n+                {\n+                    std::list<Unit*> targets;\n+                    GetNearbyTargetsInConeList(targets, 25); //real radius is 30\n+                    if (targets.size() > 1)\n+                    {\n+                        cast = true;\n+                    }\n+                }\n+\n+                if (cast && doCast(me, GetSpell(CARRION_SWARM_1)))\n+                    return;\n+            }\n+        }\n+\n+        void CheckSleep(uint32 diff)\n+        {\n+            if (!IsSpellReady(SLEEP_1, diff) || IsCasting() || Rand() > 50)\n+                return;\n+\n+            //fleeing/casting/solo enemy\n+            Unit* u = me->GetVictim();\n+            if (u && IsSpellReady(CARRION_SWARM_1, diff, false) && !CCed(u) && me->GetDistance(u) < CalcSpellMaxRange(SLEEP_1) &&\n+                (u->IsNonMeleeSpellCast(false,false, true) || (u->IsInCombat() && u->getAttackers().size() == 1)))\n+            {\n+                if (doCast(u, GetSpell(SLEEP_1)))\n+                    return;\n+            }\n+\n+            if (Unit* target = FindCastingTarget(CalcSpellMaxRange(SLEEP_1), 0, SLEEP_1))\n+            {\n+                if (doCast(target, GetSpell(SLEEP_1)))\n+                    return;\n+            }\n+\n+            if (Unit* target = FindStunTarget(CalcSpellMaxRange(SLEEP_1)))\n+            {\n+                if (doCast(target, GetSpell(SLEEP_1)))\n+                    return;\n+            }\n+        }\n+\n+        void ApplyClassDamageMultiplierMelee(uint32& /*damage*/, CalcDamageInfo& damageinfo) const override\n+        {\n+            float pctbonus = 1.0f;\n+\n+            //150% damage on CCed units\n+            if (CCed(damageinfo.Target))\n+                pctbonus *= 1.5f;\n+\n+            damageinfo.Damages[0].Damage = uint32(damageinfo.Damages[0].Damage * pctbonus);\n+        }\n+\n+        void ApplyClassDamageMultiplierSpell(int32& damage, SpellNonMeleeDamage& damageinfo, SpellInfo const* spellInfo, WeaponAttackType /*attackType*/, bool iscrit) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //uint8 lvl = me->GetLevel();\n+            float fdamage = float(damage);\n+\n+            //apply bonus damage mods\n+            float pctbonus = 1.0f;\n+            if (iscrit)\n+                pctbonus *= 1.333f;\n+\n+            //double damage on CCed units\n+            if (CCed(damageinfo.target))\n+                pctbonus *= 2.f;\n+\n+            if (baseId == CARRION_SWARM_1)\n+                fdamage += me->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_MAGIC) * (spellInfo->_effects[0].BonusCoefficient - 1.f) * me->CalculateDefaultCoefficient(spellInfo, SPELL_DIRECT_DAMAGE) * me->CalculateSpellpowerCoefficientLevelPenalty(spellInfo);\n+\n+            damage = int32(fdamage * pctbonus);\n+        }\n+\n+        void OnClassSpellGo(SpellInfo const* spellInfo) override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+\n+            if (baseId == CARRION_SWARM_1)\n+            {\n+                me->resetAttackTimer();\n+                me->CastSpell(me, MH_ATTACK_ANIM, true);\n+            }\n+\n+            if (baseId == INFERNO_1)\n+            {\n+                me->CastSpell(_infernoPos, SPELL_INFERNO_METEOR_VISUAL, true);\n+                DelayedPetSpawnEvent* spawnEvent = new DelayedPetSpawnEvent(me, &_infernoPos);\n+                Events.AddEvent(spawnEvent, Events.CalculateTime(std::chrono::milliseconds(INFERNO_SPAWN_DELAY)));\n+            }\n+        }\n+\n+        void SpellHitTarget(WorldObject* wtarget, SpellInfo const* spell) override\n+        {\n+            Unit* target = wtarget->ToUnit();\n+            if (!target)\n+                return;\n+\n+            OnSpellHitTarget(target, spell);\n+        }\n+\n+        void SpellHit(WorldObject* wcaster, SpellInfo const* spell) override\n+        {\n+            Unit* caster = wcaster->ToUnit();\n+            if (!caster)\n+                return;\n+\n+            OnSpellHit(caster, spell);\n+        }\n+\n+        void OnBotDamageDealt(Unit* victim, uint32 damage, CleanDamage const* /*cleanDamage*/, DamageEffectType /*damagetype*/, SpellInfo const* spellInfo) override\n+        {\n+            //Carrion swarm heal\n+            if (damage && victim != me && spellInfo && spellInfo->GetFirstRankSpell()->Id == CARRION_SWARM_1)\n+            {\n+                int32 basepoints0 = std::min<uint32>(damage, victim->GetHealth());\n+                //BOT_LOG_ERROR(\"entities.unit\", \"OnBotDamageDealt(drl): {} on {} base val {} ({}),\",\n+                //    me->GetName(), victim->GetName(), int32(damage), spellInfo->SpellName[0]);\n+                CastSpellExtraArgs args(true);\n+                args.AddSpellBP0(basepoints0);\n+                me->CastSpell(me, SPELL_TRIGGERED_HEAL, args);\n+            }\n+        }\n+\n+        void DamageDealt(Unit* victim, uint32& damage, DamageEffectType damageType) override\n+        {\n+            bot_ai::DamageDealt(victim, damage, damageType);\n+        }\n+\n+        void DamageTaken(Unit* u, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo*/) override\n+        {\n+            if (damage)\n+            {\n+                for (auto& [rank1_id, spell] : GetSpellMap())\n+                {\n+                    //not affected if pet is alive\n+                    if (botPet && rank1_id == INFERNO_1)\n+                        continue;\n+\n+                    if (!spell.cooldown)\n+                        continue;\n+\n+                    spell.cooldown = spell.cooldown > DAMAGE_CD_REDUCTION ? spell.cooldown - DAMAGE_CD_REDUCTION : 0;\n+                }\n+            }\n+\n+            if (!u)\n+                return;\n+            if (!u->IsInCombat() && !me->IsInCombat())\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void OwnerAttackedBy(Unit* u) override\n+        {\n+            if (!u)\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void SummonBotPet(Position const* sPos)\n+        {\n+            if (botPet)\n+                UnsummonAll(false);\n+\n+            uint32 entry = BOT_PET_INFERNAL;\n+\n+            //Position pos;\n+\n+            Creature* myPet = me->SummonCreature(entry, *sPos, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 2s);\n+            //me->GetNearPoint(myPet, pos.m_positionX, pos.m_positionY, pos.m_positionZ, 0, 2, me->GetOrientation());\n+            //myPet->GetMotionMaster()->MovePoint(me->GetMapId(), pos);\n+            myPet->SetCreator(master);\n+            myPet->SetOwnerGUID(me->GetGUID());\n+            myPet->SetFaction(master->GetFaction());\n+            myPet->SetControlledByPlayer(!IAmFree());\n+            myPet->SetPvP(me->IsPvP());\n+            myPet->SetByteValue(UNIT_FIELD_BYTES_2, 1, master->GetByteValue(UNIT_FIELD_BYTES_2, 1));\n+\n+            //immune\n+            myPet->SetUInt32Value(UNIT_CREATED_BY_SPELL, INFERNO_1);\n+            //dreadlord immunities\n+            myPet->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_SHAPESHIFT, true);\n+            myPet->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_TRANSFORM, true);\n+            myPet->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_FEAR, true);\n+            myPet->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_POLYMORPH, true);\n+            myPet->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_FEAR, true);\n+            myPet->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_HORROR, true);\n+            myPet->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_TURN, true);\n+            myPet->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SLEEP, true);\n+            myPet->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SNARE, true);\n+\n+            //myPet->SetMeleeDamageSchool(SPELL_SCHOOL_FIRE);\n+\n+            //infernal is immune to magic\n+            //myPet->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_MAGIC, true);\n+            myPet->CastSpell(myPet, SPELL_INFERNO_EFFECT, true); //damage, stun\n+            //myPet->CastSpell(myPet, SPELL_INFERNO_IMPACT_EXPLOSION, true); //visual\n+            myPet->CastSpell(myPet, IMMOLATION, true);\n+\n+            botPet = myPet;\n+        }\n+\n+        void UnsummonAll(bool savePets = true) override\n+        {\n+            UnsummonPet(savePets);\n+        }\n+\n+        void SummonedCreatureDies(Creature* /*summon*/, Unit* /*killer*/) override\n+        {\n+        }\n+\n+        void SummonedCreatureDespawn(Creature* summon) override\n+        {\n+            //BOT_LOG_ERROR(\"entities.unit\", \"SummonedCreatureDespawn: {}'s {}\", me->GetName(), summon->GetName());\n+            if (summon == botPet)\n+                botPet = nullptr;\n+        }\n+\n+        uint32 GetAIMiscValue(uint32 data) const override\n+        {\n+            switch (data)\n+            {\n+                case BOTAI_MISC_PET_TYPE:\n+                    return BOT_PET_INFERNAL;\n+                default:\n+                    return 0;\n+            }\n+        }\n+\n+        void Reset() override\n+        {\n+            checkAuraTimer = 0;\n+\n+            DefaultInit();\n+        }\n+\n+        void ReduceCD(uint32 diff) override\n+        {\n+            if (checkAuraTimer > diff)              checkAuraTimer -= diff;\n+        }\n+\n+        void InitPowers() override\n+        {\n+            me->SetPowerType(POWER_MANA);\n+        }\n+\n+        void InitSpells() override\n+        {\n+            InitSpellMap(CARRION_SWARM_1, true, false);\n+            InitSpellMap(SLEEP_1, true, false);\n+            InitSpellMap(INFERNO_1);\n+        }\n+\n+        void ApplyClassPassives() const override\n+        {\n+        }\n+\n+        bool CanUseManually(uint32 basespell) const override\n+        {\n+            switch (basespell)\n+            {\n+                case CARRION_SWARM_1:\n+                    return true;\n+                default:\n+                    return false;\n+            }\n+        }\n+\n+        std::vector<uint32> const* GetDamagingSpellsList() const override\n+        {\n+            return &Dreadlord_spells_damage;\n+        }\n+        std::vector<uint32> const* GetCCSpellsList() const override\n+        {\n+            return &Dreadlord_spells_cc;\n+        }\n+        //std::vector<uint32> const* GetHealingSpellsList() const override\n+        //{\n+        //    return &Dreadlord_spells_heal;\n+        //}\n+        std::vector<uint32> const* GetSupportSpellsList() const override\n+        {\n+            return &Dreadlord_spells_support;\n+        }\n+\n+    private:\n+        uint32 checkAuraTimer;\n+        Position _infernoPos;\n+    };\n+};\n+\n+void AddSC_dreadlord_bot()\n+{\n+    new dreadlord_bot();\n+}\ndiff --git a/src/server/game/AI/NpcBots/bot_druid_ai.cpp b/src/server/game/AI/NpcBots/bot_druid_ai.cpp\nnew file mode 100644\nindex 0000000000..ccba285315\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bot_druid_ai.cpp\n@@ -0,0 +1,2987 @@\n+#include \"bot_ai.h\"\n+#include \"botlogtraits.h\"\n+#include \"botmgr.h\"\n+#include \"bottext.h\"\n+#include \"bottraits.h\"\n+#include \"Containers.h\"\n+#include \"Group.h\"\n+#include \"Log.h\"\n+#include \"Map.h\"\n+#include \"MotionMaster.h\"\n+#include \"ObjectAccessor.h\"\n+#include \"ObjectMgr.h\"\n+#include \"Player.h\"\n+#include \"ScriptMgr.h\"\n+#include \"Spell.h\"\n+#include \"SpellAuraEffects.h\"\n+#include \"SpellMgr.h\"\n+#include \"TemporarySummon.h\"\n+#include \"World.h\"\n+/*\n+Druid NpcBot (reworked by Trickerer onlysuffering@gmail.com)\n+Complete - 85-90%\n+TODO: Resolve remaining bugs with wrong power type after death\n+TODO2: PvP behaviour revamp (again, it's like 5th time?)\n+*/\n+\n+static constexpr uint8 MAX_TREANTS = 3;\n+\n+enum DruidBaseSpells\n+{\n+    MARK_OF_THE_WILD_1                  = 1126,\n+    THORNS_1                            = 467,\n+    HEALING_TOUCH_1                     = 5185,\n+    REGROWTH_1                          = 8936,\n+    REJUVENATION_1                      = 774,\n+    LIFEBLOOM_1                         = 33763,\n+    NOURISH_1                           = 50464,\n+    WILD_GROWTH_1                       = 48438,\n+    SWIFTMEND_1                         = 18562,\n+    TRANQUILITY_1                       = 740,\n+    REVIVE_1                            = 50769,\n+    REBIRTH_1                           = 20484,\n+    BEAR_FORM_1                         = 5487,\n+    SWIPE_BEAR_1                        = 779,\n+    MANGLE_BEAR_1                       = 33878,\n+    BASH_1                              = 5211,\n+    MAUL_1                              = 6807,\n+    FERAL_CHARGE_BEAR_1                 = 16979,\n+    CHALLENGING_ROAR_1                  = 5209,\n+    ENRAGE_1                            = 5229,\n+    FRENZIED_REGENERATION_1             = 22842,\n+    GROWL_1                             = 6795,\n+    LACERATE_1                          = 33745,\n+    SURVIVAL_INSTINCTS_1                = 61336,\n+    FAERIE_FIRE_FERAL_1                 = 16857,//chains threat and damage spell regardless of bot feral form\n+    BERSERK_1                           = 50334,\n+    CAT_FORM_1                          = 768,\n+    CLAW_1                              = 1082,\n+    RAKE_1                              = 1822,\n+    SHRED_1                             = 5221,\n+    MANGLE_CAT_1                        = 33876,\n+    RIP_1                               = 1079,\n+    FEROCIOUS_BITE_1                    = 22568,\n+    POUNCE_1                            = 9005,\n+    RAVAGE_1                            = 6785,\n+    MAIM_1                              = 22570,\n+    SWIPE_CAT_1                         = 62078,\n+    SAVAGE_ROAR_1                       = 52610,\n+    FERAL_CHARGE_CAT_1                  = 49376,\n+    COWER_1                             = 8998,\n+    DASH_1                              = 1850,\n+    TIGERS_FURY_1                       = 5217,\n+    PROWL_1                             = 5215,\n+    MOONFIRE_1                          = 8921,\n+    STARFIRE_1                          = 2912,\n+    WRATH_1                             = 5176,\n+    HURRICANE_1                         = 16914,\n+    FAERIE_FIRE_NORMAL_1                = 770,\n+    INSECT_SWARM_1                      = 5570,\n+    TYPHOON_1                           = 50516,\n+    STARFALL_1                          = 48505,\n+    MOONKIN_FORM_1                      = 24858,\n+    TREE_OF_LIFE_FORM_1                 = 33891,\n+    TRAVEL_FORM_1                       = 783,\n+    AQUATIC_FORM_1                      = 1066,\n+    FLIGHT_FORM_1                       = 33943,\n+    ABOLISH_POISON_1                    = 2893,//manual use only\n+    CURE_POISON_1                       = 8946,\n+    REMOVE_CURSE_1                      = 2782,\n+    ENTANGLING_ROOTS_1                  = 339,\n+    CYCLONE_1                           = 33786,\n+    HIBERNATE_1                         = 2637,\n+    BARKSKIN_1                          = 22812,\n+    NATURES_GRASP_1                     = 16689,\n+    INNERVATE_1                         = 29166,\n+    NATURES_SWIFTNESS_1                 = 17116\n+};\n+enum DruidPassives\n+{\n+//Talents\n+    OMEN_OF_CLARITY                     = 16864,//clearcast\n+    NATURESGRACE                        = 61346,//rank 3\n+    NATURAL_PERFECTION1                 = 33881,\n+    NATURAL_PERFECTION2                 = 33882,\n+    NATURAL_PERFECTION3                 = 33883,\n+    LIVING_SEED1                        = 48496,\n+    LIVING_SEED2                        = 48499,\n+    LIVING_SEED3                        = 48500,\n+    REVITALIZE1                         = 48539,\n+    REVITALIZE2                         = 48544,\n+    REVITALIZE3                         = 48545,\n+    NATURALIST                          = 17073,//rank 5\n+    IMPROVED_MARK_OF_THE_WILD           = 17051,//rank 2\n+    FUROR                               = 17061,//rank 5\n+    INTENSITY                           = 17108,//rank 3\n+    LIVING_SPIRIT                       = 34153,//rank 3\n+    GIFT_OF_THE_EARTHMOTHER             = 51183,//rank 5\n+    ECLIPSE                             = 48525,//rank 3\n+    EARTH_AND_MOON                      = 48511,//rank 3\n+    SURVIVAL_OF_THE_FITTEST             = 33856,//rank 3\n+    DREAMSTATE                          = 33956,//rank 3\n+    BALANCE_OF_POWER                    = 33596,//rank 2\n+    IMPROVED_MOONKIN_FORM               = 48396,//rank 3\n+    OWLKIN_FRENZY                       = 48393,//rank 3 NOT REFRESHAURABLE\n+    FERAL_SWIFTNESS                     = 24866,//rank 2 NOT REFRESHAURABLE\n+    PRIMAL_PRECISION                    = 48410,//rank 2 expertise only, refund handled in Spell.cpp\n+    NATURAL_REACTION                    = 57881,//rank 3 NOT REFRESHAURABLE\n+    IMPROVED_LEADER_OF_THE_PACK         = 34300,//rank 2\n+    PRIMAL_TENACITY                     = 33957,//rank 3\n+    PREDATORY_INSTINCTS                 = 33867,//rank 3 NOT REFRESHAURABLE\n+    KING_OF_THE_JUNGLE                  = 48495,//rank 3\n+    PRIMAL_GORE                         = 63503,//rank 1\n+//Glyphs\n+    GLYPH_NOURISH                       = 62971,\n+    GLYPH_SWIFTMEND                     = 54824,//no consumption\n+    GLYPH_INNERVATE                     = 54832,//self regen\n+    GLYPH_RAPID_REJUVENATION            = 71013,\n+    GLYPH_REGROWTH                      = 54743,\n+    GLYPH_REJUVENATION                  = 54754,\n+    GLYPH_FRENZIED_REGENERATION         = 54810,\n+    GLYPH_BARKSKIN                      = 63057,\n+    GLYPH_RAKE                          = 54821,\n+    GLYPH_SHRED                         = 54815,\n+//other\n+    T10_RESTO_P4_BONUS                  = 70664,//rejuve jump\n+    T9_RESTO_P4_BONUS                   = 67128,//rejuve crits\n+    T8_RESTO_P4_BONUS                   = 64760,//rejuve init heal\n+\n+    T8_BALANCE_P4_BONUS                 = 64824,//insect swarm periodic starfire instacast trigger\n+    T9_BALANCE_P2_BONUS                 = 67125,//moonfire crits\n+    T10_BALANCE_P2_BONUS                = 70718,//omen of doom (15%)\n+    T10_BALANCE_P4_BONUS                = 70723,//Languish(DOT)\n+\n+    T10_FERAL_P4_BONUS                  = 70726,//rake crit, enraged defense\n+    T8_FERAL_P2_BONUS                   = 64752,//periodic clearcast trigger\n+};\n+enum DruidSpecial\n+{\n+    STARFALL_DAMAGE_AOE_4               = 53190,//for radius mods\n+    //STARFALL_DAMAGE_DIRECT_4            = 53195,\n+    STARFALL_DUMMY_AOE_4                = 53198,//for radius mods\n+\n+    HURRICANE_DAMAGE_1                  = 42231,\n+    //TRANQUILITY_HEAL_1                  = 44203,\n+    //TYPHOON_DAMAGE_1                    = 61391,\n+\n+    SAVAGE_ROAR_BUFF                    = 62071,//hidden buff\n+    PREDATORS_SWIFTNESS_BUFF            = 69369,\n+    LEADER_OF_THE_PACK_BUFF             = 24932,\n+    NURTURING_INSTINCT_BUFF             = 47180,//rank 2 hidden NOT REFRESHAURABLE\n+    SURVIVAL_OF_THE_FITTEST_BUFF        = 62069,//hidden buff\n+    SAVAGE_DEFENSE_PASSIVE              = 62600,//class passive lvl 40\n+    SAVAGE_DEFENSE_BUFF                 = 62606,\n+    MASTER_SHAPESHIFTER_BEAR_BUFF       = 48418,\n+    MASTER_SHAPESHIFTER_CAT_BUFF        = 48420,\n+    MASTER_SHAPESHIFTER_MOONKIN_BUFF    = 48421,\n+    MASTER_SHAPESHIFTER_TREE_BUFF       = 48422,\n+    //NATURESGRACEBUFF                    = 16886,\n+    ECLIPSE_SOLAR_BUFF                  = 48517,// from Starfire to Wrath\n+    ECLIPSE_LUNAR_BUFF                  = 48518,// from Wrath to Starfire\n+    ELUNES_WRATH_BUFF                   = 64823,//Starfire instacast\n+    OMEN_OF_CLARITY_BUFF                = 16870,\n+\n+    //FERAL_CHARGE_EFFECT_BEAR_ROOT       = 45334,\n+    //FERAL_CHARGE_EFFECT_CAT_DAZE        = 50259,\n+    INFECTED_WOUNDS_EFFECT              = 58181,//rank 3\n+    PRIMAL_FURY_EFFECT_ENERGIZE         = 16959,//5 rage\n+\n+    FORCE_OF_NATURE_1                   = 33831 //not casted\n+};\n+\n+static const std::vector<uint32> Druid_spells_damage\n+{ FAERIE_FIRE_FERAL_1, CLAW_1, FEROCIOUS_BITE_1, MAIM_1, MANGLE_CAT_1, POUNCE_1, RAKE_1, RAVAGE_1, RIP_1, SHRED_1,\n+SWIPE_CAT_1, LACERATE_1, MANGLE_BEAR_1, MAUL_1,SWIPE_BEAR_1, ENTANGLING_ROOTS_1, HURRICANE_1, INSECT_SWARM_1,\n+WRATH_1, MOONFIRE_1, STARFALL_1, STARFIRE_1, TYPHOON_1, THORNS_1 };\n+static const std::vector<uint32> Druid_spells_cc{ BASH_1, CYCLONE_1, ENTANGLING_ROOTS_1, FERAL_CHARGE_BEAR_1, HIBERNATE_1, MAIM_1, POUNCE_1, TYPHOON_1 };\n+static const std::vector<uint32> Druid_spells_heal{ HEALING_TOUCH_1, LIFEBLOOM_1, NOURISH_1, REGROWTH_1, REJUVENATION_1, SWIFTMEND_1, TRANQUILITY_1, WILD_GROWTH_1 };\n+static const std::vector<uint32> Druid_spells_support\n+{ ABOLISH_POISON_1, BARKSKIN_1, BERSERK_1, CHALLENGING_ROAR_1, COWER_1, CURE_POISON_1, DASH_1, ENRAGE_1,\n+FAERIE_FIRE_NORMAL_1, FAERIE_FIRE_FERAL_1, FERAL_CHARGE_BEAR_1, FERAL_CHARGE_CAT_1, FRENZIED_REGENERATION_1,\n+GROWL_1, INNERVATE_1, MARK_OF_THE_WILD_1, NATURES_GRASP_1, NATURES_SWIFTNESS_1, PROWL_1, REMOVE_CURSE_1,\n+REBIRTH_1, REVIVE_1, SAVAGE_ROAR_1, SURVIVAL_INSTINCTS_1, THORNS_1, TIGERS_FURY_1 };\n+\n+static float rageLossMult;\n+\n+class druid_bot : public CreatureScript\n+{\n+public:\n+    druid_bot() : CreatureScript(\"druid_bot\") { }\n+\n+    CreatureAI* GetAI(Creature* creature) const override\n+    {\n+        return new bot_druid_ai(creature);\n+    }\n+/*\n+    bool OnGossipHello(Player* player, Creature* creature)\n+    {\n+        return creature->GetBotAI()->OnGossipHello(player, 0);\n+    }\n+\n+    bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action)\n+    {\n+        if (bot_ai* ai = creature->GetBotAI())\n+            return ai->OnGossipSelect(player, creature, sender, action);\n+        return true;\n+    }\n+\n+    bool OnGossipSelectCode(Player* player, Creature* creature, uint32 sender, uint32 action, char const* code)\n+    {\n+        if (bot_ai* ai = creature->GetBotAI())\n+            return ai->OnGossipSelectCode(player, creature, sender, action, code);\n+        return true;\n+    }\n+*/\n+    struct bot_druid_ai : public bot_ai\n+    {\n+        bot_druid_ai(Creature* creature) : bot_ai(creature)\n+        {\n+            _botclass = BOT_CLASS_DRUID;\n+\n+            InitUnitFlags();\n+        }\n+\n+        bool doCast(Unit* victim, uint32 spellId)\n+        {\n+            if (CheckBotCast(victim, spellId) != SPELL_CAST_OK)\n+                return false;\n+            return bot_ai::doCast(victim, spellId);\n+        }\n+\n+        void JustEnteredCombat(Unit* u) override { bot_ai::JustEnteredCombat(u); }\n+        void KilledUnit(Unit* u) override { bot_ai::KilledUnit(u); }\n+        void EnterEvadeMode(EvadeReason why = EVADE_REASON_OTHER) override { bot_ai::EnterEvadeMode(why); }\n+        void MoveInLineOfSight(Unit* u) override { bot_ai::MoveInLineOfSight(u); }\n+        void JustDied(Unit* u) override { removeShapeshiftForm(); UnsummonAll(false); bot_ai::JustDied(u); }\n+\n+        uint8 GetBotStance() const override\n+        {\n+            return _form;\n+        }\n+\n+        bool removeShapeshiftForm() override\n+        {\n+            BotStances myform = _form;\n+            _form = BOT_STANCE_NONE;\n+            //ShapeshiftForm form = me->GetShapeshiftForm();\n+            //if (form != FORM_NONE)\n+            {\n+                switch (myform/*form*/)\n+                {\n+                    //case FORM_DIREBEAR:\n+                    //case FORM_BEAR:\n+                    case DRUID_BEAR_FORM:\n+                        if (IsRegenActive())\n+                            return false;\n+                        me->RemoveAurasDueToSpell(GetSpell(BEAR_FORM_1));\n+                        me->RemoveAurasDueToSpell(MASTER_SHAPESHIFTER_BEAR_BUFF);\n+                        me->RemoveAurasDueToSpell(NATURAL_REACTION);\n+                        me->RemoveAurasDueToSpell(SURVIVAL_OF_THE_FITTEST_BUFF);\n+                        me->RemoveAurasDueToSpell(SAVAGE_DEFENSE_PASSIVE);\n+                        break;\n+                    //case FORM_CAT:\n+                    case DRUID_CAT_FORM:\n+                        me->RemoveAurasDueToSpell(GetSpell(CAT_FORM_1));\n+                        me->RemoveAurasDueToSpell(FERAL_SWIFTNESS);\n+                        me->RemoveAurasDueToSpell(MASTER_SHAPESHIFTER_CAT_BUFF);\n+                        me->RemoveAurasDueToSpell(NURTURING_INSTINCT_BUFF);\n+                        me->RemoveAurasDueToSpell(PREDATORY_INSTINCTS);\n+                        break;\n+                    //case FORM_MOONKIN:\n+                    case DRUID_MOONKIN_FORM:\n+                        me->RemoveAurasDueToSpell(GetSpell(MOONKIN_FORM_1));\n+                        me->RemoveAurasDueToSpell(GetSpell(OWLKIN_FRENZY));\n+                        me->RemoveAurasDueToSpell(MASTER_SHAPESHIFTER_MOONKIN_BUFF);\n+                        break;\n+                    //case FORM_TREE:\n+                    case DRUID_TREE_FORM:\n+                        me->RemoveAurasDueToSpell(GetSpell(TREE_OF_LIFE_FORM_1));\n+                        me->RemoveAurasDueToSpell(MASTER_SHAPESHIFTER_TREE_BUFF);\n+                        break;\n+                    //case FORM_TRAVEL:\n+                    case DRUID_TRAVEL_FORM:\n+                        me->RemoveAurasDueToSpell(GetSpell(TRAVEL_FORM_1));\n+                        break;\n+                    //case FORM_AQUA:\n+                    case DRUID_AQUATIC_FORM:\n+                        me->RemoveAurasDueToSpell(GetSpell(AQUATIC_FORM_1));\n+                        break;\n+                    //case FORM_FLIGHT:\n+                    //case FORM_FLIGHT_EPIC:\n+                    case DRUID_FLIGHT_FORM:\n+                        me->RemoveAurasDueToSpell(GetSpell(FLIGHT_FORM_1));\n+                        break;\n+                    default:\n+                        break;\n+                }\n+\n+                if (me->GetPowerType() != POWER_MANA)\n+                {\n+                    //BOT_LOG_ERROR(\"entities.player\", \"druid_bot::removeShapeshiftForm(): still has poweType {}!\", uint32(me->GetPowerType()));\n+                    me->SetPowerType(POWER_MANA);\n+                }\n+                if (me->GetShapeshiftForm() != FORM_NONE)\n+                {\n+                    //BOT_LOG_ERROR(\"entities.player\", \"druid_bot::removeShapeshiftForm(): still speshifted into {}!\", uint32(me->GetShapeshiftForm()));\n+                    me->RemoveAurasByType(SPELL_AURA_MOD_SHAPESHIFT, me->GetGUID(), nullptr, false);\n+                }\n+\n+                setStats(BOT_STANCE_NONE);\n+            }\n+            return true;\n+        }\n+\n+        //bool IsMelee() const\n+        //{\n+        //    return bot_ai::IsMelee() && (_form == DRUID_BEAR_FORM || _form == DRUID_CAT_FORM);\n+        //}\n+\n+        void StartAttack(Unit* u, bool force = false)\n+        {\n+            if (!bot_ai::StartAttack(u, force))\n+                return;\n+            if (_form == DRUID_BEAR_FORM && HasRole(BOT_ROLE_RANGED) && IsSpellReady(BASH_1, GetLastDiff(), false))\n+                return;\n+            GetInPosition(force, u);\n+        }\n+\n+        bool MassGroupHeal(Player* gPlayer, uint32 diff)\n+        {\n+            if (!HasRole(BOT_ROLE_HEAL)) return false;\n+            if (!gPlayer || GC_Timer > diff || IAmFree()) return false;\n+            if (IsCasting()) return false; // if I'm already casting\n+            if (Rand() > 30 + 50 * (me->GetMap()->IsRaid())) return false;\n+            if (!gPlayer->GetGroup()) return false;\n+\n+            bool tranq = IsSpellReady(TRANQUILITY_1, diff, false) && master->GetBotMgr()->IsPartyInCombat(false);\n+            bool growt = IsSpellReady(WILD_GROWTH_1, diff, false) && !HasRole(BOT_ROLE_DPS);\n+            if (!tranq && !growt)\n+                return false;\n+\n+            uint8 LHPcount = 0;\n+            uint8 pct = 100;\n+            Unit* healTarget = nullptr;\n+            std::vector<Unit*> members = BotMgr::GetAllGroupMembers(master);\n+            std::vector<Unit*> groupUnits;\n+            groupUnits.reserve(members.size());\n+\n+            for (Unit* member : members)\n+            {\n+                if (me->GetMap() != member->FindMap() || member->isPossessed() || member->IsCharmed() ||\n+                    !member->IsAlive() || me->GetDistance(member) > 40)\n+                    continue;\n+                if (growt)\n+                    groupUnits.push_back(member);\n+                if (tranq && GetHealthPCT(member) < 80)\n+                {\n+                    if (GetHealthPCT(member) < pct)\n+                    {\n+                        pct = GetHealthPCT(member);\n+                        healTarget = member;\n+                    }\n+                    ++LHPcount;\n+                    if (LHPcount > 2)\n+                        break;\n+                }\n+            }\n+\n+            if (LHPcount > 2 && tranq &&\n+                doCast(me, GetSpell(TRANQUILITY_1)))\n+                return true;\n+\n+            healTarget = nullptr;\n+            for (Unit* gUnit : groupUnits)\n+            {\n+                LHPcount = 0;\n+                for (Unit* member : members)\n+                {\n+                    if (me->GetMap() != member->FindMap() || member->isPossessed() || member->IsCharmed() ||\n+                        !member->IsAlive() || me->GetDistance(member) > 40)\n+                        continue;\n+                    if (gUnit->GetDistance(member) < 15 && (GetLostHP(member) > 2000 || GetHealthPCT(member) < 90))\n+                        if (++LHPcount >= 3)\n+                            break;\n+                }\n+\n+                if (LHPcount >= 3)\n+                {\n+                    healTarget = gUnit;\n+                    break;\n+                }\n+            }\n+\n+            if (LHPcount >= 3 && growt && healTarget &&\n+                doCast(healTarget, GetSpell(WILD_GROWTH_1)))\n+                return true;\n+\n+            return false;\n+        }\n+\n+        //Powers\n+        //rage\n+        void getrage()\n+        {\n+            rage = me->GetPower(POWER_RAGE);\n+            if (me->FindCurrentSpellBySpellId(GetSpell(MAUL_1)))\n+                rage = std::max<int32>(rage - 150, 0);\n+        }\n+\n+        //energy\n+        void getenergy()\n+        {\n+            energy = me->GetPower(POWER_ENERGY);\n+        }\n+\n+        //all\n+        int32 acost(uint32 spellId) const\n+        {\n+            if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId))\n+                return spellInfo->CalcPowerCost(me, spellInfo->GetSchoolMask());\n+            return 0;\n+        }\n+\n+        bool IsRegenActive() const\n+        {\n+            return me->IsAlive() && me->IsInCombat() && rage > 100 && GetHealthPCT(me) < 90 &&\n+                me->GetAuraEffect(SPELL_AURA_PERIODIC_DUMMY, SPELLFAMILY_DRUID, 0x0, 0x40000000, 0x0);\n+        }\n+\n+        void CheckBarkskin(uint32 diff)\n+        {\n+            if (!me->IsAlive())\n+                return;\n+            if (me->GetVehicle())\n+                return;\n+            //No GCD\n+            if (IsSpellReady(BARKSKIN_1, diff, false) && !IsCasting() && !me->getAttackers().empty() &&\n+                Rand() < (25 + 20 * me->getAttackers().size()) &&\n+                GetHealthPCT(me) < (IsTank() ? 67 : 70 + 25 * me->getAttackers().size()))\n+            {\n+                if (doCast(me, GetSpell(BARKSKIN_1)))\n+                {}\n+            }\n+        }\n+\n+        void CheckHibery(uint32 diff)\n+        {\n+            if (hiberyCheckTimer <= diff)\n+            {\n+                hibery = FindAffectedTarget(GetSpell(HIBERNATE_1), me->GetGUID());\n+                hiberyCheckTimer = 2000;\n+            }\n+        }\n+\n+        void CheckHibernate(uint32 diff)\n+        {\n+            if (!(_form == DRUID_MOONKIN_FORM || _form == BOT_STANCE_NONE))\n+                return;\n+            //Skip Tranquility, Hurricane\n+            if (GC_Timer > diff || IsCasting() || Rand() > 35)\n+                return;\n+\n+            if (hibery == false && IsSpellReady(HIBERNATE_1, diff))\n+            {\n+                if (Unit* target = FindStunTarget(30))\n+                {\n+                    if (doCast(target, GetSpell(HIBERNATE_1)))\n+                        return;\n+                }\n+            }\n+        }\n+\n+        void Counter(uint32 diff)\n+        {\n+            if (!(_form == DRUID_MOONKIN_FORM || _form == BOT_STANCE_NONE))\n+                return;\n+            //Skip Tranquility, Hurricane\n+            if (GC_Timer > diff || Rand() > 35 || IsChanneling() || (HasRole(BOT_ROLE_HEAL) && IsCasting()))\n+                return;\n+\n+            if (IsSpellReady(CYCLONE_1, diff))\n+            {\n+                if (Unit* target = FindCastingTarget(20, 0, CYCLONE_1))\n+                {\n+                    bool cast = false;\n+                    for (uint8 i = CURRENT_GENERIC_SPELL; i != CURRENT_AUTOREPEAT_SPELL; ++i)\n+                    {\n+                        Spell const* spell = target->GetCurrentSpell(CurrentSpellTypes(i));\n+                        if (spell && spell->GetTimer() > 1500 &&\n+                            (IAmFree() ? (spell->m_targets.GetUnitTarget() == me) : (master->GetGroup() && master->GetGroup()->IsMember(spell->m_targets.GetObjectTargetGUID()))))\n+                        {\n+                            cast = true;\n+                            break;\n+                        }\n+                    }\n+                    if (cast)\n+                    {\n+                        me->InterruptNonMeleeSpells(false);\n+                        if (doCast(target, GetSpell(CYCLONE_1)))\n+                            return;\n+                    }\n+                }\n+            }\n+        }\n+\n+        void UpdateAI(uint32 diff) override\n+        {\n+            if (me->GetPowerType() == POWER_RAGE && me->IsAlive())\n+            {\n+                if (ragetimer <= diff)\n+                {\n+                    if (!me->IsInCombat() &&\n+                        !me->HasAuraTypeWithFamilyFlags(SPELL_AURA_PERIODIC_ENERGIZE, SPELLFAMILY_DRUID, 0x00080000)\n+                    /*!HasAuraName(me, ENRAGE_1)*/)\n+                    {\n+                        if (me->GetPower(POWER_RAGE) > uint32(10.f * rageLossMult))\n+                            me->SetPower(POWER_RAGE, me->GetPower(POWER_RAGE) - uint32(10.f * rageLossMult)); //-1 rage per 1.5 sec\n+                        else\n+                            me->SetPower(POWER_RAGE, 0);\n+                    }\n+                    ragetimer = 1500;\n+                }\n+                getrage();\n+            }\n+            else if (me->GetPowerType() == POWER_ENERGY)\n+                getenergy();\n+\n+            if (!GlobalUpdate(diff))\n+                return;\n+\n+            DoVehicleActions(diff);\n+            if (!CanBotAttackOnVehicle())\n+                return;\n+\n+            CheckHibery(diff);\n+            CheckBarkskin(diff);\n+\n+            if (IsPotionReady())\n+            {\n+                if (me->GetPowerType() == POWER_MANA && GetManaPCT(me) < 33)\n+                    DrinkPotion(true);\n+                else if (GetHealthPCT(me) < 35)\n+                    DrinkPotion(false);\n+            }\n+\n+            CheckRacials(diff);\n+\n+            //Innervate\n+            doInnervate(diff);\n+\n+            MassGroupHeal(master, diff);\n+            if (me->IsInCombat())\n+                CheckBattleRez(diff);\n+            else\n+                DoNonCombatActions(diff);\n+\n+            if (HasRole(BOT_ROLE_RANGED) || !me->IsInCombat() || !me->GetVictim() ||\n+                (_form != DRUID_BEAR_FORM && (_form != DRUID_CAT_FORM || !me->GetMap()->IsRaid())))\n+                BuffAndHealGroup(diff);\n+            if (_form != DRUID_BEAR_FORM && _form != DRUID_CAT_FORM)\n+            {\n+                CureGroup(GetSpell(CURE_POISON_1), diff);\n+                CureGroup(GetSpell(REMOVE_CURSE_1), diff);\n+            }\n+\n+            if (ProcessImmediateNonAttackTarget())\n+                return;\n+\n+            CheckTravel(diff);\n+\n+            if (!CheckAttackTarget())\n+            {\n+                if (!me->IsInCombat() && Rand() < 5 && me->HasAuraType(SPELL_AURA_MOD_STEALTH))\n+                    me->RemoveAurasDueToSpell(PROWL_1);\n+                return;\n+            }\n+\n+            CheckHibernate(diff);\n+            Counter(diff);\n+\n+            if (IsCasting())\n+                return;\n+\n+            CheckUsableItems(diff);\n+\n+            Attack(diff);\n+        }\n+\n+        void Attack(uint32 diff)\n+        {\n+            Unit* mytar = opponent ? opponent : disttarget ? disttarget : nullptr;\n+            if (!mytar)\n+                return;\n+\n+            StartAttack(mytar, bot_ai::IsMelee());\n+\n+            CheckAttackState();\n+            if (!me->IsAlive() || !mytar->IsAlive())\n+                return;\n+\n+            //NOT all forms abilities (prioritized)\n+            //Cat Instaheal\n+            if (_form == DRUID_CAT_FORM && GC_Timer <= diff && Rand() < 60 &&\n+                HasRole(BOT_ROLE_HEAL) && GetHealthPCT(me) < 45 &&\n+                (me->GetAuraEffect(SPELL_AURA_ADD_PCT_MODIFIER, SPELLFAMILY_DRUID, 0x0, 0x80000, 0x0) ||/*me->HasAura(PREDATORS_SWIFTNESS_BUFF)*/\n+                (IsSpellReady(NATURES_SWIFTNESS_1, diff, false) && doCast(me, GetSpell(NATURES_SWIFTNESS_1)))))\n+            {\n+                //TODO maybe istant spells if clearcast?\n+                //heal myself with instant\n+                //Healing Touch has same reqs\n+                if ((GetSpell(REGROWTH_1) && !me->GetAuraEffect(SPELL_AURA_PERIODIC_HEAL, SPELLFAMILY_DRUID, 0x40, 0x0, 0x0) &&\n+                    doCast(me, GetSpell(REGROWTH_1))) || doCast(me, GetSpell(HEALING_TOUCH_1)))\n+                {\n+                    Position pos;\n+                    mytar->GetNearPoint(me, pos.m_positionX, pos.m_positionY, pos.m_positionZ, 15.f, mytar->GetAbsoluteAngle(me));\n+                    GetInPosition(true, mytar, &pos);\n+                    return;\n+                }\n+            }\n+            //Roots\n+            if (_form != DRUID_BEAR_FORM && _form != DRUID_TREE_FORM && Rand() < 35 &&\n+                (HasRole(BOT_ROLE_DPS) || IAmFree()) && IsSpellReady(ENTANGLING_ROOTS_1, diff) &&\n+                (_form != DRUID_CAT_FORM || IAmFree() || me->GetAuraEffect(SPELL_AURA_ADD_PCT_MODIFIER, SPELLFAMILY_DRUID, 0x0, 0x80000, 0x0)\n+                /*me->HasAura(PREDATORS_SWIFTNESS_BUFF)*/))\n+                CheckRoots();\n+\n+            //ALL forms abilities\n+            //Nature's Grasp (no shapeshift)\n+            if (IsSpellReady(NATURES_GRASP_1, diff) && HasRole(BOT_ROLE_DPS) && HasRole(BOT_ROLE_RANGED) && Rand() < 70 &&\n+                !me->getAttackers().empty())\n+            {\n+                if (doCast(me, GetSpell(NATURES_GRASP_1)))\n+                    return;\n+            }\n+            //Survival Instincts\n+            //No GCD, bear is lvl 10, SI is lvl 20\n+            //Shapeshift into bear if needed\n+            if (IsSpellReady(SURVIVAL_INSTINCTS_1, diff, false) && Rand() < 75 &&\n+                (GetHealthPCT(me) < (30 + 20 * (me->getAttackers().size() > 1))) &&\n+                (_form == DRUID_BEAR_FORM || (GC_Timer <= diff && doCast(me, GetSpell(BEAR_FORM_1)))))\n+            {\n+                if (doCast(me, SURVIVAL_INSTINCTS_1))\n+                    if (!IAmFree())\n+                        ReportSpellCast(SURVIVAL_INSTINCTS_1, LocalizedNpcText(master, BOT_TEXT__USED), master);\n+            }\n+            //Bash\n+            //Assuming Furor is present which is lvl 10\n+            //Shapeshift into bear if needed\n+            //bear is lvl 10, bash is lvl 14\n+            //Retreat is triggered only if hit (SpellHitTarget)\n+            if (me->IsInCombat() && IsSpellReady(BASH_1, diff) && !CCed(mytar, !mytar->IsNonMeleeSpellCast(false,false,true)) && mytar->IsWithinMeleeRange(me))\n+            {\n+                if (_form == DRUID_BEAR_FORM || (IsSpellReady(BEAR_FORM_1, diff, false) && doCast(me, GetSpell(BEAR_FORM_1))))\n+                {\n+                    if (rage >= acost(BASH_1) && doCast(mytar, GetSpell(BASH_1)))\n+                        return;\n+                }\n+            }\n+\n+            BotStances need_form = _selectShapeshift();\n+            uint32 form_base_spellid = _baseSpellForShapeshift(need_form);\n+            if (_form == need_form || !form_base_spellid || (IsSpellReady(form_base_spellid, diff, false) && doCast(me, GetSpell(form_base_spellid))))\n+            {\n+                switch (need_form)\n+                {\n+                    case DRUID_BEAR_FORM:\n+                        doBearActions(mytar, diff);\n+                        break;\n+                    case DRUID_CAT_FORM:\n+                        doCatActions(mytar, diff);\n+                        break;\n+                    case DRUID_MOONKIN_FORM:\n+                    case BOT_STANCE_NONE:\n+                        if (HasRole(BOT_ROLE_DPS))\n+                            doBalanceActions(mytar, diff);\n+                        break;\n+                    default:\n+                        break;\n+                }\n+            }\n+        }\n+\n+        void doBearActions(Unit* mytar, uint32 diff)\n+        {\n+            //debug\n+            if (me->GetPowerType() != POWER_RAGE || (me->GetShapeshiftForm() != FORM_BEAR && me->GetShapeshiftForm() != FORM_DIREBEAR))\n+                return;\n+\n+            //Enrage\n+            if (IsSpellReady(ENRAGE_1, diff, false) && me->IsInCombat() && (rage < 400 || IsTank()) && Rand() < 40)\n+            {\n+                if (doCast(me, GetSpell(ENRAGE_1)))\n+                    getrage();\n+            }\n+            //Frenzied Regeneration\n+            if (IsSpellReady(FRENZIED_REGENERATION_1, diff) && rage > 700 && GetHealthPCT(me) < 70 && Rand() < 40)\n+            {\n+                if (doCast(me, GetSpell(FRENZIED_REGENERATION_1)))\n+                    return;\n+            }\n+\n+            float dist = me->GetDistance(mytar);\n+            //GROWL //No GCD\n+            Unit* u = mytar->GetVictim();\n+            if (IsSpellReady(GROWL_1, diff, false) && u && u != me && Rand() < 40 && dist < 30 &&\n+                mytar->IsCreature() && !mytar->IsControlledByPlayer() &&\n+                !CCed(mytar) && !mytar->HasAuraType(SPELL_AURA_MOD_TAUNT) &&\n+                (!IsTank(u) || (IsTank() && GetHealthPCT(me) > 67 &&\n+                (GetHealthPCT(u) < 30 || (IsOffTank() && !IsOffTank(u) && IsPointedOffTankingTarget(mytar)) ||\n+                (!IsOffTank() && IsOffTank(u) && IsPointedTankingTarget(mytar))))) &&\n+                ((!IsTankingClass(u->GetClass()) && GetHealthPCT(u) < 80) || IsTank()) &&\n+                IsInBotParty(u))\n+            {\n+                if (doCast(mytar, GetSpell(GROWL_1)))\n+                    return;\n+            }\n+            //GROWL 2 (distant)\n+            if (IsSpellReady(GROWL_1, diff, false) && !IAmFree() && u == me &&  Rand() < 20 && IsTank() &&\n+                (IsOffTank() || master->GetBotMgr()->GetNpcBotsCountByRole(BOT_ROLE_TANK_OFF) == 0) &&\n+                !(me->GetLevel() >= 40 && mytar->IsCreature() &&\n+                (mytar->ToCreature()->IsDungeonBoss() || mytar->ToCreature()->isWorldBoss())))\n+            {\n+                if (Unit* tUnit = FindDistantTauntTarget())\n+                {\n+                    if (doCast(tUnit, GetSpell(GROWL_1)))\n+                        return;\n+                }\n+            }\n+            //Challenging Roar\n+            if (IsSpellReady(CHALLENGING_ROAR_1, diff) &&\n+                !(u == me && me->GetLevel() >= 40 && mytar->IsCreature() &&\n+                (mytar->ToCreature()->IsDungeonBoss() || mytar->ToCreature()->isWorldBoss())) &&\n+                rage >= acost(CHALLENGING_ROAR_1))\n+            {\n+                u = mytar->GetVictim();\n+                if (u && u != me && !IsTank(u) && IsInBotParty(u) && !CCed(mytar) && dist <= 10 && Rand() < 25 &&\n+                    (!IsTankingClass(u->GetClass()) || IsTank()))\n+                {\n+                    if (doCast(me, GetSpell(CHALLENGING_ROAR_1)))\n+                        return;\n+                }\n+                if (IsTank() && Rand() < 20)\n+                {\n+                    std::list<Unit*> targets;\n+                    GetNearbyTargetsList(targets, 9.f, 1);\n+                    uint8 count = 0;\n+                    for (Unit const* u : targets)\n+                    {\n+                        if (!(u->GetVictim() && IsTank(u->GetVictim())))\n+                            if (++count > 1)\n+                                break;\n+                    }\n+                    if (count > 1 && doCast(me, GetSpell(CHALLENGING_ROAR_1)))\n+                        return;\n+                }\n+            }\n+\n+            if (!CanAffectVictimAny(mytar, SPELL_SCHOOL_NORMAL))\n+                return;\n+\n+            //Feral Charge\n+            if (IsSpellReady(FERAL_CHARGE_BEAR_1, diff, false) && rage >= acost(FERAL_CHARGE_BEAR_1) &&\n+                !HasBotCommandState(BOT_COMMAND_STAY) &&\n+                !CCed(mytar, true) && dist > 9 && dist < 25)\n+            {\n+                if (doCast(mytar, GetSpell(FERAL_CHARGE_BEAR_1)))\n+                    return;\n+            }\n+\n+            //Faerie Fire (Feral, Bear)\n+            if (IsSpellReady(FAERIE_FIRE_FERAL_1, diff) && me->IsInCombat() && Rand() < 35 && dist < CalcSpellMaxRange(FAERIE_FIRE_FERAL_1) &&\n+                !mytar->HasAuraTypeWithFamilyFlags(SPELL_AURA_MOD_RESISTANCE_PCT, SPELLFAMILY_DRUID, 0x400))\n+            {\n+                if (doCast(mytar, GetSpell(FAERIE_FIRE_FERAL_1)))\n+                    return;\n+            }\n+\n+            //range check (melee) to prevent fake casts\n+            if (dist > 5) return;\n+\n+            //Berserk (Bear)\n+            if (IsSpellReady(BERSERK_1, diff) && !HasRole(BOT_ROLE_HEAL) && rage > 400 && Rand() < 40 &&\n+                me->getAttackers().size() > 2)\n+            {\n+                if (doCast(me, GetSpell(BERSERK_1)))\n+                    return;\n+            }\n+\n+            //BOT_ROLE_DPS is checked in Attack(uin32)\n+            //if (!HasRole(BOT_ROLE_DPS)) return;\n+\n+            //frenzied regeneration check\n+            //we don't need to spend too much rage if regening\n+            bool isRegenActive = IsRegenActive();\n+\n+            //Mangle (Bear)\n+            if (IsSpellReady(MANGLE_BEAR_1, diff) && rage >= acost(MANGLE_BEAR_1) + 200*isRegenActive)\n+            {\n+                if (me->GetAuraEffect(SPELL_AURA_MECHANIC_IMMUNITY, SPELLFAMILY_DRUID, 0x0, 0x0, 0x40) ||\n+                    (Rand() < 30 && !mytar->GetAuraEffect(SPELL_AURA_MOD_MECHANIC_DAMAGE_TAKEN_PERCENT, SPELLFAMILY_DRUID, 0x0, 0x40, 0x0)))\n+                {\n+                    if (doCast(mytar, GetSpell(MANGLE_BEAR_1)))\n+                        return;\n+                }\n+            }\n+            //Swipe (Bear)\n+            if (IsSpellReady(SWIPE_BEAR_1, diff) && rage >= acost(SWIPE_BEAR_1) + 200*isRegenActive &&\n+                IsTank() && Rand() < 70)\n+            {\n+                std::list<Unit*> targets;\n+                GetNearbyTargetsInConeList(targets, 5);\n+                if (targets.size() > 2)\n+                    if (doCast(mytar, GetSpell(SWIPE_BEAR_1)))\n+                        return;\n+            }\n+            //Lacerate\n+            if (IsSpellReady(LACERATE_1, diff) && rage >= acost(LACERATE_1) + 200*isRegenActive &&\n+                mytar->GetHealth() > me->GetMaxHealth() * 2 && Rand() < 45)\n+            {\n+                bool cast = rage >= 600;\n+                if (!cast)\n+                {\n+                    AuraApplication const* lacera = mytar->GetAuraApplicationOfRankedSpell(LACERATE_1);\n+                    cast = (!lacera || lacera->GetBase()->GetStackAmount() < 5 || lacera->GetBase()->GetDuration() < 6000);\n+                }\n+\n+                if (cast && doCast(mytar, GetSpell(LACERATE_1)))\n+                    return;\n+            }\n+\n+            //skip if maul is active\n+            if (me->GetCurrentSpell(CURRENT_MELEE_SPELL))\n+                return;\n+\n+            //Maul //No GCD\n+            if (IsSpellReady(MAUL_1, diff, false) && rage >= acost(MAUL_1) + 200 + 200*isRegenActive)\n+            {\n+                if (doCast(mytar, GetSpell(MAUL_1)))\n+                    return;\n+            }\n+        }\n+\n+        void doCatActions(Unit* mytar, uint32 diff)\n+        {\n+            //debug\n+            if (me->GetPowerType() != POWER_ENERGY || me->GetShapeshiftForm() != FORM_CAT)\n+                return;\n+\n+            //Prowl (for Cooldown handling see bot_ai::ReleaseSpellCooldown)\n+            if (IsSpellReady(PROWL_1, diff, false) && !me->IsInCombat() && Rand() < 50 && me->GetDistance(mytar) < 28 && !IsFlagCarrier(me))\n+            {\n+                if (doCast(me, GetSpell(PROWL_1)))\n+                {}\n+            }\n+\n+            if (!CanAffectVictimAny(mytar, SPELL_SCHOOL_NORMAL))\n+                return;\n+\n+            //Faerie Fire (Feral, Cat)\n+            if (IsSpellReady(FAERIE_FIRE_FERAL_1, diff) && (mytar->IsControlledByPlayer() ? !mytar->IsInCombat() : me->IsInCombat()) && !me->HasAuraType(SPELL_AURA_MOD_STEALTH) &&\n+                Rand() < ((mytar->GetClass() == CLASS_ROGUE || mytar->GetShapeshiftForm() == FORM_CAT) ? 35 : 10) && me->GetDistance(mytar) < 30 &&\n+                !mytar->HasAuraTypeWithFamilyFlags(SPELL_AURA_MOD_RESISTANCE_PCT, SPELLFAMILY_DRUID, 0x400))\n+            {\n+                if (doCast(mytar, GetSpell(FAERIE_FIRE_FERAL_1)))\n+                    return;\n+            }\n+\n+            if (!JumpingOrFalling() && !CCed(me, true))\n+            {\n+                //leap here\n+                //Feral Charge (Cat)\n+                if (IsSpellReady(FERAL_CHARGE_CAT_1, diff, false) && energy >= acost(FERAL_CHARGE_CAT_1) && !me->GetMap()->IsDungeon() &&\n+                    !HasBotCommandState(BOT_COMMAND_STAY) &&\n+                    !me->HasAuraType(SPELL_AURA_MOD_STEALTH) && Rand() < 65 &&\n+                    !me->GetAuraEffect(SPELL_AURA_MOD_INCREASE_SPEED, SPELLFAMILY_DRUID, 0x0, 0x0, 0x8) &&//not dashing\n+                    me->GetDistance(mytar) > 10 && me->GetDistance(mytar) < 25)\n+                {\n+                    if (doCast(mytar, GetSpell(FERAL_CHARGE_CAT_1)))\n+                        return; //no gcd but jump time\n+                }\n+\n+                //Dash (no GCD)\n+                if (IsSpellReady(DASH_1, diff, false) &&\n+                    (me->HasAuraType(SPELL_AURA_MOD_STEALTH) || (me->IsInCombat() && !IsSpellReady(FERAL_CHARGE_CAT_1, diff, false))) &&\n+                    Rand() < 85 && me->GetDistance(mytar) > 15)\n+                {\n+                    if (doCast(me, GetSpell(DASH_1)))\n+                    {}\n+                }\n+                //Savage Roar\n+                if (IsSpellReady(SAVAGE_ROAR_1, diff) && comboPoints >= 1 && comboPoints <= 3 && (me->IsInCombat() || mytar->IsInCombat()) &&\n+                    !me->HasAuraType(SPELL_AURA_MOD_STEALTH) && energy >= acost(SAVAGE_ROAR_1) &&\n+                    !me->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_DRUID, 0, 0x10000000, 0))\n+                {\n+                    if (doCast(mytar, GetSpell(SAVAGE_ROAR_1)))\n+                        return;\n+                }\n+            }\n+\n+            MoveBehind(mytar);\n+\n+            //range check (melee) to prevent fake casts\n+            if (me->GetDistance(mytar) > 5)\n+                return;\n+\n+            //Cower\n+            if (mytar->CanHaveThreatList())\n+            {\n+                if (IsSpellReady(COWER_1, diff) && mytar->GetVictim() == me && energy >= acost(COWER_1) &&\n+                    int32(mytar->GetThreatManager().GetThreatListSize()) > 1 &&\n+                    int32(mytar->getAttackers().size()) > 1 && Rand() < 45)\n+                {\n+                    if (doCast(mytar, GetSpell(COWER_1)))\n+                        return;\n+                }\n+            }\n+\n+            //Tiger's Fury (no GCD) cannot use while Berserk is active\n+            if (IsSpellReady(TIGERS_FURY_1, diff, false) && mytar->GetHealth() > me->GetHealth() / 4 && (me->GetLevel() < 55 || energy <= 40) && Rand() < 80 &&\n+                !me->GetAuraEffect(SPELL_AURA_ADD_PCT_MODIFIER, SPELLFAMILY_DRUID, 0x0, 0x200000, 0x0) &&\n+                !me->GetAuraEffect(SPELL_AURA_MECHANIC_IMMUNITY, SPELLFAMILY_DRUID, 0x0, 0x0, 0x40))\n+            {\n+                if (doCast(me, GetSpell(TIGERS_FURY_1)))\n+                    getenergy();\n+            }\n+            //Berserk can be used After Tiger's Fury without dispelling it\n+            //Berserk (Cat)\n+            if (IsSpellReady(BERSERK_1, diff) && Rand() < 80 && !IsSpellReady(TIGERS_FURY_1, diff, false) && (!HasRole(BOT_ROLE_HEAL) || me->HasAuraType(SPELL_AURA_MOD_FEAR)) &&\n+                (!me->HasAuraType(SPELL_AURA_MOD_STEALTH) || energy >= 40 || me->GetAuraEffect(SPELL_AURA_ADD_PCT_MODIFIER, SPELLFAMILY_DRUID, 0x0, 0x200000, 0x0)) &&\n+                (mytar->IsPlayer() || mytar->GetHealth() + 5000 > me->GetHealth()))\n+            {\n+                if (doCast(me, GetSpell(BERSERK_1)))\n+                    return;\n+            }\n+\n+            //Openers\n+            if (me->HasAuraType(SPELL_AURA_MOD_STEALTH))\n+            {\n+                uint32 opener =\n+                    GetSpell(POUNCE_1) &&\n+                    !mytar->HasAuraType(SPELL_AURA_MOD_STUN) &&\n+                    mytar->GetDiminishing(DIMINISHING_OPENING_STUN) < DIMINISHING_LEVEL_3 &&\n+                    (mytar->IsPlayer() || (!IAmFree() && master->GetNpcBotsCount() > 1)) ? POUNCE_1 :\n+                    GetSpell(RAVAGE_1) ? RAVAGE_1 :\n+                    GetSpell(SHRED_1) ? SHRED_1 : 0;\n+\n+                //all opener spells disabled\n+                if (!opener)\n+                {\n+                    me->RemoveAurasByType(SPELL_AURA_MOD_STEALTH);\n+                    return;\n+                }\n+\n+                if (opener != POUNCE_1 && mytar->HasInArc(float(M_PI), me))\n+                    return;\n+\n+                //We do not check combo points amount\n+                if (IsSpellReady(opener, diff) && energy >= acost(opener))\n+                {\n+                    if (doCast(mytar, GetSpell(opener)))\n+                        return;\n+                }\n+\n+                return;\n+            }\n+\n+            //Finishers\n+            if (comboPoints > 0)\n+            {\n+                //Maim\n+                if (IsSpellReady(MAIM_1, diff) && !CCed(mytar) && mytar->GetHealth() > me->GetMaxHealth() / 8 && energy >= acost(MAIM_1) &&\n+                    (comboPoints >= (mytar->IsNonMeleeSpellCast(false, false, true) ? 1 : (!!mytar->GetVictim() || mytar->IsControlledByPlayer()) ? 4 : 6)))\n+                {\n+                    if (doCast(mytar, GetSpell(MAIM_1)))\n+                        return;\n+                }\n+                //Ferocious Bite\n+                if (IsSpellReady(FEROCIOUS_BITE_1, diff) && Rand() < (50 + comboPoints * 20) &&\n+                    ((comboPoints >= 4 && mytar->IsControlledByPlayer()) || mytar->GetHealth() < me->GetMaxHealth() / std::max<int32>(1, 6 - comboPoints)) &&\n+                    energy >= acost(FEROCIOUS_BITE_1))\n+                {\n+                    if (doCast(mytar, GetSpell(FEROCIOUS_BITE_1)))\n+                        return;\n+                }\n+                //Rip\n+                if (IsSpellReady(RIP_1, diff) && comboPoints >= (mytar->IsControlledByPlayer() ? 4 : 5) && Rand() < 90 &&\n+                    mytar->GetHealth() > me->GetMaxHealth() / (mytar->IsControlledByPlayer() ? 4 : 2) && energy >= acost(RIP_1) &&\n+                    !mytar->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DRUID, 0x800000, 0x0, 0x0, me->GetGUID()))\n+                {\n+                    if (doCast(mytar, GetSpell(RIP_1)))\n+                        return;\n+                }\n+            }\n+\n+            //Combo points generating\n+            //Swipe (Cat)\n+            if (IsSpellReady(SWIPE_CAT_1, diff) && me->getAttackers().empty() && energy >= acost(SWIPE_CAT_1) && Rand() < (35 + 100 * (me->GetMap()->IsDungeon())))\n+            {\n+                std::list<Unit*> targets;\n+                GetNearbyTargetsInConeList(targets, 5);\n+                if (targets.size() > 2)\n+                    if (doCast(mytar, GetSpell(SWIPE_CAT_1)))\n+                        return;\n+            }\n+\n+            //Shred\n+            if (IsSpellReady(SHRED_1, diff) && ((Rand() < 70 && energy >= acost(SHRED_1)) || !!me->GetAuraEffect(SPELL_AURA_ADD_PCT_MODIFIER, SPELLFAMILY_DRUID, 0x0, 0x200000, 0x0)) &&\n+                /*comboPoints < 5 && */ !mytar->HasInArc(float(M_PI), me))\n+            {\n+                if (doCast(mytar, GetSpell(SHRED_1)))\n+                    return;\n+            }\n+            //Mangle (Cat)\n+            if (IsSpellReady(MANGLE_CAT_1, diff) && comboPoints < 5 && energy >= acost(MANGLE_CAT_1) &&\n+                !me->GetAuraEffect(SPELL_AURA_ADD_PCT_MODIFIER, SPELLFAMILY_DRUID, 0x0, 0x200000, 0x0) &&\n+                !mytar->GetAuraEffect(SPELL_AURA_MOD_MECHANIC_DAMAGE_TAKEN_PERCENT, SPELLFAMILY_DRUID, 0x0, 0x400, 0x0))\n+            {\n+                if (doCast(mytar, GetSpell(MANGLE_CAT_1)))\n+                    return;\n+            }\n+            //Rake\n+            if (IsSpellReady(RAKE_1, diff) && (comboPoints <= (mytar->IsControlledByPlayer() ? 4 : 5)) && Rand() < 100 && energy >= acost(RAKE_1) &&\n+                !mytar->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DRUID, 0x1000, 0x0, 0x0, me->GetGUID()))\n+            {\n+                if (doCast(mytar, GetSpell(RAKE_1)))\n+                    return;\n+            }\n+            //Claw\n+            if (IsSpellReady(CLAW_1, diff) && comboPoints < 5 && Rand() < 40 && energy >= acost(CLAW_1) && (!GetSpell(SHRED_1) || mytar->HasInArc(float(M_PI), me)))\n+            {\n+                if (doCast(mytar, GetSpell(CLAW_1)))\n+                    return;\n+            }\n+        }\n+\n+        void doBalanceActions(Unit* mytar, uint32 diff)\n+        {\n+            MoveBehind(mytar);\n+\n+            if (HasRole(BOT_ROLE_HEAL) && GetManaPCT(me) < 25)\n+                return;\n+\n+            //BOT_ROLE_DPS is checked in Attack(uint32)\n+\n+            float dist = me->GetDistance(mytar);\n+            if (dist > CalcSpellMaxRange(WRATH_1))\n+                return;\n+\n+            auto [can_do_nature, can_do_arcane] = CanAffectVictimBools(mytar, SPELL_SCHOOL_NATURE, SPELL_SCHOOL_ARCANE);\n+            if (!can_do_nature && !can_do_arcane)\n+                return;\n+\n+            //spell reflections\n+            if (IsSpellReady(FAERIE_FIRE_NORMAL_1, diff) && can_do_nature && CanRemoveReflectSpells(mytar, FAERIE_FIRE_NORMAL_1) &&\n+                doCast(mytar, FAERIE_FIRE_NORMAL_1))\n+                return;\n+\n+            //Starfall\n+            if (IsSpellReady(STARFALL_1, diff) && Rand() < 40)\n+            {\n+                bool cast = (mytar->IsPlayer() || me->getAttackers().size() > 1);\n+                if (!cast)\n+                {\n+                    std::list<Unit*> targets;\n+                    GetNearbyTargetsList(targets, 30.f, 0);\n+                    if (targets.size() > 3)\n+                        cast = true;\n+                }\n+\n+                if (cast && doCast(me, GetSpell(STARFALL_1)))\n+                    return;\n+\n+                SetSpellCooldown(STARFALL_1, 1500); //fail\n+            }\n+            //Hurricane\n+            if (IsSpellReady(HURRICANE_1, diff) && !JumpingOrFalling() && Rand() < 50)\n+            {\n+                if (Unit* target = FindAOETarget(CalcSpellMaxRange(HURRICANE_1)))\n+                {\n+                    if (doCast(target, GetSpell(HURRICANE_1)))\n+                        return;\n+                }\n+                SetSpellCooldown(HURRICANE_1, 1000); //fail\n+            }\n+            //Typhoon\n+            if (IsSpellReady(TYPHOON_1, diff) && Rand() < 75)\n+            {\n+                std::list<Unit*> targets;\n+                GetNearbyTargetsInConeList(targets, 25);\n+                if (targets.size() > 2)\n+                    if (doCast(me, GetSpell(TYPHOON_1)))\n+                        return;\n+\n+                SetSpellCooldown(TYPHOON_1, 1000); //fail\n+            }\n+\n+            if (IsSpellReady(FORCE_OF_NATURE_1, diff))\n+            {\n+                SummonBotPet(mytar);\n+                SetSpellCooldown(FORCE_OF_NATURE_1, 180000);\n+                return;\n+            }\n+\n+            //Faerie Fire (non-feral): moonkin or non-shapeshifted\n+            if (IsSpellReady(FAERIE_FIRE_NORMAL_1, diff) && can_do_nature && mytar->getAttackers().size() > 2 && Rand() < 50 &&\n+                dist < CalcSpellMaxRange(FAERIE_FIRE_NORMAL_1) &&\n+                !mytar->HasAuraTypeWithFamilyFlags(SPELL_AURA_MOD_RESISTANCE_PCT, SPELLFAMILY_DRUID, 0x400)\n+                /*!HasAuraName(mytar, FAERIE_FIRE_ANY)*/)\n+            {\n+                if (doCast(mytar, GetSpell(FAERIE_FIRE_NORMAL_1)))\n+                    return;\n+            }\n+\n+            Unit const* u = mytar->GetVictim();\n+            //Insect Swarm\n+            if (IsSpellReady(INSECT_SWARM_1, diff) && can_do_nature && u && mytar->GetDistance(u) < 8 && Rand() < 30 &&\n+                dist < CalcSpellMaxRange(INSECT_SWARM_1) &&\n+                !mytar->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DRUID, 0x200000, 0x0, 0x0, me->GetGUID())\n+                /*!HasAuraName(mytar, INSECT_SWARM_1, me->GetGUID())*/)\n+            {\n+                if (doCast(mytar, GetSpell(INSECT_SWARM_1)))\n+                    return;\n+            }\n+\n+            if (IsSpellReady(MOONFIRE_1, diff) && can_do_arcane && Rand() < 60 && dist < CalcSpellMaxRange(MOONFIRE_1) &&\n+                !mytar->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DRUID, 0x2, 0x0, 0x0, me->GetGUID())\n+                /*!HasAuraName(mytar, MOONFIRE_1, me->GetGUID())*/)\n+            {\n+                if (doCast(mytar, GetSpell(MOONFIRE_1)))\n+                    return;\n+            }\n+            //TODO: balance starfire/wrath frequency based on mana effeciency\n+            if (IsSpellReady(STARFIRE_1, diff) && can_do_arcane && dist < CalcSpellMaxRange(STARFIRE_1))\n+            {\n+                AuraEffect const* eclipeLunar = me->GetAuraEffect(SPELL_AURA_ADD_FLAT_MODIFIER, SPELLFAMILY_DRUID, 0x0, 0x0, 0x4000);\n+                int32 rand = 30 + 100 * (eclipeLunar && eclipeLunar->GetBase()->GetDuration() > 3000);\n+\n+                if (Rand() < rand && doCast(mytar, GetSpell(STARFIRE_1)))\n+                    return;\n+            }\n+            if (IsSpellReady(WRATH_1, diff) && can_do_nature)\n+            {\n+                if (doCast(mytar, GetSpell(WRATH_1)))\n+                    return;\n+            }\n+        }\n+\n+        void BreakCC(uint32 diff) override\n+        {\n+            if (GC_Timer <= diff && Rand() < 25 && GetManaPCT(me) > 15 &&\n+                (me->IsPolymorphed() || me->HasAuraWithMechanic((1u<<MECHANIC_SNARE)|(1u<<MECHANIC_ROOT))))\n+            {\n+                uint32 sshift;\n+                switch (_form)\n+                {\n+                    case DRUID_BEAR_FORM:\n+                        sshift = IsTank() && !me->getAttackers().empty() &&\n+                            (!me->GetVictim() || me->GetDistance(me->GetVictim()) < 5) ? 0 :\n+                            GetSpell(BEAR_FORM_1); break;\n+                    case DRUID_CAT_FORM:     sshift = GetSpell(CAT_FORM_1);         break;\n+                    case DRUID_MOONKIN_FORM: sshift = GetSpell(MOONKIN_FORM_1);     break;\n+                    case DRUID_TREE_FORM:    sshift = GetSpell(TREE_OF_LIFE_FORM_1);break;\n+                    case DRUID_TRAVEL_FORM:  sshift = GetSpell(TRAVEL_FORM_1);      break;\n+                    case DRUID_AQUATIC_FORM: sshift = GetSpell(AQUATIC_FORM_1);     break;\n+                    case DRUID_FLIGHT_FORM:  sshift = GetSpell(FLIGHT_FORM_1);      break;\n+                    case BOT_STANCE_NONE:    sshift = GetSpell(TRAVEL_FORM_1);      break;\n+                    default:                 sshift = 0;                            break;\n+                }\n+                if (sshift && doCast(me, sshift))\n+                {\n+                    GetInPosition(false, nullptr);\n+                    return;\n+                }\n+            }\n+            if (IsSpellReady(BERSERK_1, diff) && Rand() < 10 && me->HasAuraWithMechanic(1u<<MECHANIC_FEAR))\n+            {\n+                if (doCast(me, GetSpell(BERSERK_1)))\n+                    return;\n+            }\n+            bot_ai::BreakCC(diff);\n+        }\n+\n+        bool HealTarget(Unit* target, uint32 diff) override\n+        {\n+            if (!target || !target->IsAlive() || target->GetShapeshiftForm() == FORM_SPIRITOFREDEMPTION || me->GetDistance(target) > 40)\n+                return false;\n+            uint8 hp = GetHealthPCT(target);\n+            if (hp > GetHealHpPctThreshold())\n+                return false;\n+            bool pointed = IsPointedHealTarget(target);\n+            if (hp > 95 && !(pointed && me->GetMap()->IsRaid()) &&\n+                (!target->IsInCombat() || target->getAttackers().empty() || !IsTank(target) || !me->GetMap()->IsRaid()))\n+                return false;\n+\n+            int32 hps = GetHPS(target);\n+            int32 xphp = target->GetHealth() + hps * 2;\n+            int32 hppctps = int32(hps * 100.f / float(target->GetMaxHealth()));\n+            int32 xphploss = xphp > int32(target->GetMaxHealth()) ? 0 : abs(int32(xphp - target->GetMaxHealth()));\n+            int32 xppct = hp + hppctps * 2;\n+            if (xppct >= 95 && hp >= 25 && !pointed)\n+                return false;\n+\n+            if (IsTank() && xppct > 25)\n+                return false;\n+            if (hp > 50 && !IsTank(target) && (_form == DRUID_BEAR_FORM || _form == DRUID_CAT_FORM))\n+                return false; //do not waste heal if in feral or so\n+\n+            if (IsSpellReady(NATURES_SWIFTNESS_1, diff, false) && Rand() < 80 &&\n+                (me->IsInCombat() || target->IsInCombat()) &&//may just revive\n+                hp <= 20 && xppct <= 0 && xphploss > _heals[HEALING_TOUCH_1] / 2 &&\n+                (target->IsPlayer() || IsTank(target) || target->IsInCombat() || !target->getAttackers().empty()))\n+            {\n+                me->InterruptNonMeleeSpells(false);\n+                if (doCast(me, GetSpell(NATURES_SWIFTNESS_1)))\n+                {\n+                    if (doCast(target, GetSpell(HEALING_TOUCH_1)))\n+                        return true;\n+                }\n+            }\n+            if (IsSpellReady(NOURISH_1, diff) && xppct <= 65 && xphploss > _heals[REJUVENATION_1])\n+            {\n+                const uint8 minHots = 2;\n+                uint8 hots = 0;\n+                for (AuraEffect const* eff : target->GetAuraEffectsByType(SPELL_AURA_PERIODIC_HEAL))\n+                {\n+                    if (eff->GetCasterGUID() != me->GetGUID())\n+                        continue;\n+                    SpellInfo const* spellInfo = eff->GetSpellInfo();\n+                    if (spellInfo->SpellFamilyName != SPELLFAMILY_DRUID)\n+                        continue;\n+                    //rejuv,regro,lifeb,wildg\n+                    if (!((spellInfo->SpellFamilyFlags[0] & 0x50) || (spellInfo->SpellFamilyFlags[1] & 0x4000010)))\n+                        continue;\n+                    hots += eff->GetBase()->GetStackAmount();\n+                    if (hots >= minHots)\n+                        break;\n+                }\n+                if (hots >= minHots && doCast(target, GetSpell(NOURISH_1)))\n+                    return true;\n+            }\n+            if (IsSpellReady(SWIFTMEND_1, diff, false) && !HasRole(BOT_ROLE_DPS|BOT_ROLE_TANK) && hp < 60 &&\n+                (xppct <= 15 || int32(GetLostHP(target)) > _heals[REJUVENATION_1]) &&\n+                //rejuv,regro\n+                target->GetAuraEffect(SPELL_AURA_PERIODIC_HEAL, SPELLFAMILY_DRUID, 0x50, 0x0, 0x0, me->GetGUID())\n+                /*(HasAuraName(target, REGROWTH_1) || HasAuraName(target, REJUVENATION_1))*/)\n+            {\n+                if (doCast(target, GetSpell(SWIFTMEND_1)))\n+                    return true;\n+            }\n+            //maintain HoTs\n+            Unit const* u = target->GetVictim();\n+            bool tanking = u && IsTank(target) && u->ToCreature() && u->ToCreature()->isWorldBoss();\n+            if (IsSpellReady(REGROWTH_1, diff) && Rand() < 80 && (tanking || xphploss > _heals[REGROWTH_1]) &&\n+                (xppct <= 45 || !target->GetAuraEffect(SPELL_AURA_PERIODIC_HEAL, SPELLFAMILY_DRUID, 0x40, 0x0, 0x0, me->GetGUID()))\n+                /*!HasAuraName(target, REGROWTH_1, me->GetGUID())*/)\n+            {\n+                if (doCast(target, GetSpell(REGROWTH_1)))\n+                    return true;\n+            }\n+            if (IsSpellReady(LIFEBLOOM_1, diff) && xppct >= 40 && hp < 75 + 10 * tanking)\n+            {\n+                AuraEffect const* bloom = target->GetAuraEffect(SPELL_AURA_PERIODIC_HEAL, SPELLFAMILY_DRUID, 0x0, 0x10, 0x0, me->GetGUID());\n+                //Aura const* bloom = target->GetAura(GetSpell(LIFEBLOOM_1), me->GetGUID());\n+                if ((!bloom || bloom->GetBase()->GetStackAmount() < 3 ||\n+                    (bloom->GetBase()->GetDuration() < 2000 && !target->getAttackers().empty())) &&\n+                    doCast(target, GetSpell(LIFEBLOOM_1)))\n+                    return true;\n+            }\n+            if (IsSpellReady(HEALING_TOUCH_1, diff) && (xppct > 15 || !GetSpell(REGROWTH_1)) &&\n+                xphploss > _heals[HEALING_TOUCH_1] &&\n+                doCast(target, GetSpell(HEALING_TOUCH_1)))\n+                return true;\n+            if (IsSpellReady(REJUVENATION_1, diff) && xppct > 45 &&\n+                (tanking || xphploss > _heals[REJUVENATION_1]) &&\n+                !target->GetAuraEffect(SPELL_AURA_PERIODIC_HEAL, SPELLFAMILY_DRUID, 0x10, 0x0, 0x0, me->GetGUID())\n+                /*!HasAuraName(target, REJUVENATION_1, me->GetGUID())*/)\n+            {\n+                if (doCast(target, GetSpell(REJUVENATION_1)))\n+                    return true;\n+            }\n+            return false;\n+        }\n+\n+        bool BuffTarget(Unit* target, uint32 /*diff*/) override\n+        {\n+            if (me->IsInCombat() && !master->GetMap()->IsRaid()) return false;\n+\n+            if (uint32 MARK_OF_THE_WILD = GetSpell(MARK_OF_THE_WILD_1))\n+            {\n+                if (!target->HasAuraTypeWithFamilyFlags(SPELL_AURA_MOD_RESISTANCE, SPELLFAMILY_DRUID, 0x40000)\n+                    /*!HasAuraName(target, MARK_OF_THE_WILD_1)*/)\n+                    if (doCast(target, MARK_OF_THE_WILD))\n+                        return true;\n+            }\n+            if (uint32 THORNS = GetSpell(THORNS_1))\n+            {\n+                if (IsTank(target) &&\n+                    !target->HasAuraTypeWithFamilyFlags(SPELL_AURA_DAMAGE_SHIELD, SPELLFAMILY_DRUID, 0x100)\n+                    /*!HasAuraName(target, THORNS_1)*/)\n+                    if (doCast(target, THORNS))\n+                        return true;\n+            }\n+\n+            return false;\n+        }\n+\n+        void CheckTravel(uint32 diff)\n+        {\n+            if ((!IAmFree() && !HasBotCommandState(BOT_COMMAND_FOLLOW)) || Rand() > 35 || me->IsMounted() || IsCasting() ||\n+                me->HasUnitMovementFlag(MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_FLYING))\n+                return;\n+\n+            bool can_use_travel_form = IsSpellReady(TRAVEL_FORM_1, diff) && me->GetShapeshiftForm() == FORM_NONE && IsOutdoors();\n+\n+            if (IAmFree())\n+            {\n+                InstanceTemplate const* instt = sObjectMgr->GetInstanceTemplate(me->GetMap()->GetId());\n+                bool map_allows_mount = (!me->GetMap()->IsDungeon() || me->GetMap()->IsBattlegroundOrArena()) && (!instt || instt->AllowMount);\n+                if (me->HasUnitMovementFlag(MOVEMENTFLAG_FORWARD) &&\n+                    (!me->GetVictim() ?\n+                        (me->IsInCombat() || !map_allows_mount || IsFlagCarrier(me)) :\n+                        !me->IsWithinDist(me->GetVictim(), 8.0f + (IsMelee() ? 0.0f : GetSpellAttackRange(true)))))\n+                {\n+                    if (me->GetShapeshiftForm() == FORM_CAT && IsSpellReady(DASH_1, diff, false))\n+                    {\n+                        if (doCast(me, GetSpell(DASH_1)))\n+                            return;\n+                    }\n+                    else if (can_use_travel_form)\n+                    {\n+                        if (doCast(me, GetSpell(TRAVEL_FORM_1)))\n+                            return;\n+                    }\n+                }\n+\n+                return;\n+            }\n+\n+            if (me->GetExactDist2d(master) > std::max<uint8>(master->GetBotMgr()->GetBotFollowDist(), 30))\n+            {\n+                if (me->GetShapeshiftForm() == FORM_CAT && IsSpellReady(DASH_1, diff, false))\n+                {\n+                    if (doCast(me, GetSpell(DASH_1)))\n+                        return;\n+                }\n+                else if (can_use_travel_form)\n+                {\n+                    if (doCast(me, GetSpell(TRAVEL_FORM_1)))\n+                        return;\n+                }\n+            }\n+        }\n+\n+        void DoNonCombatActions(uint32 diff)\n+        {\n+            if (GC_Timer > diff || me->IsMounted() || IsCasting())\n+                return;\n+\n+            ResurrectGroup(GetSpell(REVIVE_1));\n+\n+            if (!IAmFree() && HasBotCommandState(BOT_COMMAND_FOLLOW) && !master->IsMounted() && Rand() < 35)\n+            {\n+                int32 dist = int32(me->GetDistance(master));\n+                if (me->HasUnitMovementFlag(MOVEMENTFLAG_SWIMMING))\n+                {\n+                    if (_form != DRUID_AQUATIC_FORM && dist > 30 && GetSpell(AQUATIC_FORM_1) &&\n+                        doCast(me, GetSpell(AQUATIC_FORM_1)))\n+                        return;\n+                }\n+                //if (me->HasUnitMovementFlag(MOVEMENTFLAG_FLYING))\n+                //{\n+                //    if (_form != DRUID_AQUATIC_FORM && dist > 30 && GetSpell(AQUATIC_FORM_1) &&\n+                //        doCast(me, GetSpell(AQUATIC_FORM_1)))\n+                //        return;\n+                //}\n+                else if (_form != DRUID_TRAVEL_FORM && dist > 30 && GetSpell(TRAVEL_FORM_1))\n+                {\n+                    if (doCast(me, GetSpell(TRAVEL_FORM_1)))\n+                        return;\n+                }\n+                else if (_form == DRUID_AQUATIC_FORM)\n+                    removeShapeshiftForm();\n+            }\n+        }\n+\n+        void doInnervate(uint32 diff)\n+        {\n+            if (!IsSpellReady(INNERVATE_1, diff) || Rand() > 25)\n+                return;\n+            if (_form != BOT_STANCE_NONE && _form != DRUID_MOONKIN_FORM && _form != DRUID_TREE_FORM && (IsTank() || me->getAttackers().size() > 3))\n+                return;\n+\n+            Unit* iTarget = nullptr;\n+\n+            if (_isValidInnervateTarget(master))\n+                iTarget = master;\n+            else if (_isValidInnervateTarget(me))\n+                iTarget = me;\n+\n+            if (!IAmFree())\n+            {\n+                Group const* group = master->GetGroup();\n+                if (!iTarget && !group) //first check master's bots\n+                {\n+                    for (auto const& [_, bot] : *master->GetBotMgr()->GetBotMap())\n+                    {\n+                        if (bot && !bot->IsTempBot() && _isValidInnervateTarget(bot))\n+                        {\n+                            iTarget = bot;\n+                            break;\n+                        }\n+                    }\n+                }\n+                if (!iTarget && group) //cycle through player members...\n+                {\n+                    std::vector<Unit*> members = BotMgr::GetAllGroupMembers(group);\n+                    for (auto i : NPCBots::index_array<uint8, 2>)\n+                    {\n+                        if (iTarget)\n+                            break;\n+                        for (Unit* member : members)\n+                        {\n+                            if (!(i == 0 ? member->IsPlayer() : member->IsNPCBot()) || !_isValidInnervateTarget(member))\n+                                continue;\n+                            if (i == 1 && member->ToCreature()->IsTempBot())\n+                                continue;\n+                            iTarget = member;\n+                            break;\n+                        }\n+                    }\n+                }\n+            }\n+\n+            if (iTarget && doCast(iTarget, INNERVATE_1))\n+            {\n+                if (iTarget->IsPlayer())\n+                    ReportSpellCast(INNERVATE_1, LocalizedNpcText(iTarget->ToPlayer(), BOT_TEXT__ON_YOU), iTarget->ToPlayer());\n+\n+                if (!IAmFree() && iTarget != master)\n+                {\n+                    std::string msg = iTarget == me ? LocalizedNpcText(master, BOT_TEXT__ON_MYSELF) : (LocalizedNpcText(master, BOT_TEXT__ON_) + iTarget->GetName() + '!');\n+                    ReportSpellCast(INNERVATE_1, msg, master);\n+                }\n+\n+                return;\n+            }\n+\n+            SetSpellCooldown(INNERVATE_1, 1500); //fail\n+        }\n+\n+        void CheckRoots()\n+        {\n+            if (uint32 ENTANGLING_ROOTS = GetSpell(ENTANGLING_ROOTS_1))\n+            {\n+                if (FindAffectedTarget(ENTANGLING_ROOTS, me->GetGUID(), 60))\n+                    return;\n+                if (Unit* target = FindRootTarget(30, ENTANGLING_ROOTS))\n+                    if (doCast(target, ENTANGLING_ROOTS))\n+                        return;\n+            }\n+        }\n+\n+        void CheckBattleRez(uint32 diff)\n+        {\n+            if (!IsSpellReady(REBIRTH_1, diff, false) || IAmFree() || me->IsMounted() ||\n+                IsTank() || IsCasting() || Rand() > 20) return;\n+\n+            Group const* gr = master->GetGroup();\n+            std::list<Unit*> targets;\n+            if (!gr)\n+            {\n+                Unit* target = master;\n+                if (master->IsAlive()) return;\n+                if (master->IsResurrectRequested() || master->GetUInt32Value(PLAYER_SELF_RES_SPELL)) return; //resurrected\n+                if (master->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_GHOST))\n+                    target = (Unit*)master->GetCorpse();\n+                if (!target || !target->IsInWorld())\n+                    return;\n+                if (me->GetExactDist(target) > 30 && !HasBotCommandState(BOT_COMMAND_STAY))\n+                {\n+                    me->GetMotionMaster()->MovePoint(master->GetMapId(), *target);\n+                    SetSpellCooldown(REBIRTH_1, 1500);\n+                    return;\n+                }\n+                else if (!target->IsWithinLOSInMap(me, LINEOFSIGHT_ALL_CHECKS, VMAP::ModelIgnoreFlags::M2))\n+                    me->Relocate(*target);\n+\n+                if (doCast(target, GetSpell(REBIRTH_1))) //rezzing\n+                {\n+                    BotWhisper(LocalizedNpcText(master, BOT_TEXT_REZZING_YOU));\n+                    return;\n+                }\n+            }\n+            else\n+            {\n+                for (GroupReference const* itr = gr->GetFirstMember(); itr != nullptr; itr = itr->next())\n+                {\n+                    Player* tPlayer = itr->GetSource();\n+                    Unit* target = tPlayer;\n+                    if (!tPlayer || tPlayer->IsAlive()) continue;\n+                    if (tPlayer->IsResurrectRequested() || tPlayer->GetUInt32Value(PLAYER_SELF_RES_SPELL)) continue; //resurrected\n+                    if (tPlayer->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_GHOST))\n+                        target = (Unit*)tPlayer->GetCorpse();\n+                    if (!target || !target->IsInWorld()) continue;\n+                    if (master->GetMap() != target->FindMap()) continue;\n+                    if (me->GetDistance(target) > 100) continue;\n+                    targets.push_back(target);\n+                }\n+            }\n+\n+            for (auto const& [_, bot] : *master->GetBotMgr()->GetBotMap())\n+            {\n+                if (bot && bot->IsInWorld() && !bot->IsAlive() && !bot->GetBotAI()->GetSelfRezSpell() && IsTank(bot) && me->GetDistance(bot) < 80)\n+                    targets.push_back(bot);\n+            }\n+\n+            if (Unit* targetOrCorpse = !targets.empty() ? Bcore::Containers::SelectRandomContainerElement(targets) : nullptr)\n+            {\n+                if (me->GetExactDist(targetOrCorpse) > 30 && !HasBotCommandState(BOT_COMMAND_STAY))\n+                {\n+                    me->GetMotionMaster()->MovePoint(targetOrCorpse->GetMapId(), *targetOrCorpse);\n+                    return;\n+                }\n+                else if (!targetOrCorpse->IsWithinLOSInMap(me, LINEOFSIGHT_ALL_CHECKS, VMAP::ModelIgnoreFlags::M2))\n+                    me->Relocate(*targetOrCorpse);\n+\n+                if (doCast(targetOrCorpse, GetSpell(REBIRTH_1))) //rezzing\n+                {\n+                    if (targetOrCorpse->IsPlayer())\n+                        BotWhisper(LocalizedNpcText(targetOrCorpse->ToPlayer(), BOT_TEXT_REZZING_YOU), targetOrCorpse->ToPlayer());\n+                    if (targetOrCorpse != master)\n+                    {\n+                        std::string rezstr = LocalizedNpcText(master, BOT_TEXT_REZZING_) + targetOrCorpse->GetName();\n+                        if (targetOrCorpse->IsCreature())\n+                            rezstr += \" (\" + LocalizedNpcText(master, BOT_TEXT_BOT_TANK) + ')';\n+                        BotWhisper(rezstr);\n+                    }\n+                    return;\n+                }\n+            }\n+        }\n+\n+        void setStats(BotStances form)\n+        {\n+            _form = form;\n+            switch (form)\n+            {\n+                case DRUID_BEAR_FORM:\n+                    if (me->GetPowerType() != POWER_RAGE)\n+                    {\n+                        //BOT_LOG_ERROR(\"entities.player\", \"druid_bot::setStats(): has to set powerType to POWER_RAGE\");\n+                        me->SetPowerType(POWER_RAGE);\n+                    }\n+                    RefreshAura(MASTER_SHAPESHIFTER_BEAR_BUFF, me->GetLevel() >= 20);\n+                    if (GetSpec() == BOT_SPEC_DRUID_FERAL)\n+                    {\n+                        RefreshAura(NATURAL_REACTION, me->GetLevel() >= 35);\n+                        RefreshAura(SURVIVAL_OF_THE_FITTEST_BUFF, me->GetLevel() >= 35);\n+                        RefreshAura(SAVAGE_DEFENSE_PASSIVE, me->GetLevel() >= 40);\n+                    }\n+                    break;\n+                case DRUID_CAT_FORM:\n+                    if (me->GetPowerType() != POWER_ENERGY)\n+                    {\n+                        //BOT_LOG_ERROR(\"entities.player\", \"druid_bot::setStats(): has to set powerType to POWER_ENERGY\");\n+                        me->SetPowerType(POWER_ENERGY);\n+                    }\n+                    RefreshAura(MASTER_SHAPESHIFTER_CAT_BUFF, me->GetLevel() >= 20);\n+                    RefreshAura(FERAL_SWIFTNESS, me->GetLevel() >= 20); //talents ignore forms for creatures so put that here\n+                    if (GetSpec() == BOT_SPEC_DRUID_FERAL)\n+                    {\n+                        RefreshAura(NURTURING_INSTINCT_BUFF, me->GetLevel() >= 30);\n+                        RefreshAura(PREDATORY_INSTINCTS, me->GetLevel() >= 45);\n+                    }\n+                    break;\n+                case DRUID_MOONKIN_FORM:\n+                    if (me->GetPowerType() != POWER_MANA)\n+                    {\n+                        //BOT_LOG_ERROR(\"entities.player\", \"druid_bot::setStats(): has to set powerType to POWER_MANA (moonkin)\");\n+                        me->SetPowerType(POWER_MANA);\n+                    }\n+                    RefreshAura(MASTER_SHAPESHIFTER_MOONKIN_BUFF, me->GetLevel() >= 20);\n+                    RefreshAura(OWLKIN_FRENZY, me->GetLevel() >= 45);\n+                    break;\n+                case DRUID_TREE_FORM:\n+                    if (me->GetPowerType() != POWER_MANA)\n+                    {\n+                        //BOT_LOG_ERROR(\"entities.player\", \"druid_bot::setStats(): has to set powerType to POWER_MANA (tree)\");\n+                        me->SetPowerType(POWER_MANA);\n+                    }\n+                    RefreshAura(MASTER_SHAPESHIFTER_TREE_BUFF, me->GetLevel() >= 20);\n+                    break;\n+                case DRUID_TRAVEL_FORM:\n+                    if (me->GetPowerType() != POWER_MANA)\n+                    {\n+                        //BOT_LOG_ERROR(\"entities.player\", \"druid_bot::setStats(): has to set powerType to POWER_MANA (travel)\");\n+                        me->SetPowerType(POWER_MANA);\n+                    }\n+                    break;\n+                case DRUID_AQUATIC_FORM:\n+                    if (me->GetPowerType() != POWER_MANA)\n+                    {\n+                        //BOT_LOG_ERROR(\"entities.player\", \"druid_bot::setStats(): has to set powerType to POWER_MANA (aquatic)\");\n+                        me->SetPowerType(POWER_MANA);\n+                    }\n+                    break;\n+                case DRUID_FLIGHT_FORM:\n+                    if (me->GetPowerType() != POWER_MANA)\n+                    {\n+                        //BOT_LOG_ERROR(\"entities.player\", \"druid_bot::setStats(): has to set powerType to POWER_MANA (flight)\");\n+                        me->SetPowerType(POWER_MANA);\n+                    }\n+                    break;\n+                case BOT_STANCE_NONE:\n+                    if (me->GetPowerType() != POWER_MANA)\n+                    {\n+                        //BOT_LOG_ERROR(\"entities.player\", \"druid_bot::setStats(): has to set powerType to POWER_MANA (deshape)\");\n+                        me->SetPowerType(POWER_MANA);\n+                    }\n+                    break;\n+                default:\n+                    BOT_LOG_ERROR(\"entities.player\", \"druid_bot::setStats(): NYI form {}\", uint32(form));\n+                    setStats(BOT_STANCE_NONE);\n+                    return;\n+            }\n+\n+            SetShouldUpdateStats();\n+            SetStats(false);\n+        }\n+\n+        void ApplyClassDamageMultiplierMelee(uint32& /*damage*/, CalcDamageInfo& damageinfo) const override\n+        {\n+            uint8 lvl = me->GetLevel();\n+            float pctbonus = 0.0f;\n+\n+            if (damageinfo.HitOutCome == MELEE_HIT_CRIT)\n+            {\n+                //!!!Melee spell damage is not yet critical, all reduced by half\n+                //Primal Fury (white attacks): 100% to gain 5 rage at crit in (Dire) Bear Form\n+                if ((GetSpec() == BOT_SPEC_DRUID_FERAL) && lvl >= 25 && _form == DRUID_BEAR_FORM)\n+                    me->CastSpell(me, PRIMAL_FURY_EFFECT_ENERGIZE, true);\n+                //Predatory Instincts (part 1): 10% additional crit damage bonus for melee attacks in Cat form\n+                if ((GetSpec() == BOT_SPEC_DRUID_FERAL) && lvl >= 45 && _form == DRUID_CAT_FORM)\n+                    pctbonus += 0.05f;\n+            }\n+\n+            damageinfo.Damages[0].Damage = uint32(damageinfo.Damages[0].Damage * (1.0f + pctbonus));\n+        }\n+\n+        void ApplyClassDamageMultiplierMeleeSpell(int32& damage, SpellNonMeleeDamage& damageinfo, SpellInfo const* spellInfo, WeaponAttackType /*attackType*/, bool iscrit) const override\n+        {\n+            //uint32 spellId = spellInfo->Id;\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+            float fdamage = float(damage);\n+\n+            //apply bonus damage mods\n+            float pctbonus = 0.0f;\n+            if (iscrit)\n+            {\n+                //!!!Melee spell damage is not yet critical, all reduced by half\n+                ////Elemental Fury (part 2): 50% additional crit damage bonus for Nature, Fire and Frost (all) spells\n+                //if (lvl >= 21)\n+                //    pctbonus += 0.25f;\n+            }\n+\n+            //Feral Aggression: 15% bonus damage for Ferocious Bite\n+            if (lvl >= 10 && baseId == FEROCIOUS_BITE_1)\n+                pctbonus += 0.15f;\n+            //Feral Instinct: 30% bonus damage for Swipe (Bear)\n+            if (lvl >= 15 && baseId == SWIPE_BEAR_1)\n+                pctbonus += 0.3f;\n+            //Savage Fury: 20% bonus damage for Claw, Rake, Mangle (Cat), Mangle (Bear) and Maul\n+            if (lvl >= 15 &&\n+                (baseId == CLAW_1 ||\n+                baseId == RAKE_1 ||\n+                baseId == MANGLE_CAT_1 ||\n+                baseId == MANGLE_BEAR_1 ||\n+                baseId == MAUL_1))\n+                pctbonus += 0.2f;\n+            //Rend and Tear: 20% bonus damage on bleeding targets for Maul and Shred\n+            if ((GetSpec() == BOT_SPEC_DRUID_FERAL) &&\n+                lvl >= 55 && damageinfo.target && damageinfo.target->HasAuraState(AURA_STATE_BLEEDING) &&\n+                (baseId == MAUL_1 || baseId == SHRED_1))\n+                pctbonus += 0.2f;\n+            //Glyph of Mangle: 10% bonus damage for Mangle (all)\n+            if (lvl >= 50 && (baseId == MANGLE_BEAR_1 || baseId == MANGLE_CAT_1))\n+                pctbonus += 0.1f;\n+\n+            //Primal Fury (yellow attacks): 100% to gain 5 rage at crit in (Dire) Bear Form\n+            //Primal Fury (yellow attacks): 100% to gain 1 combo point at crit in Cat Form\n+            if (_form == DRUID_BEAR_FORM && iscrit && lvl >= 25)\n+                me->CastSpell(me, PRIMAL_FURY_EFFECT_ENERGIZE, true);\n+            if (_form == DRUID_CAT_FORM &&\n+                (baseId == CLAW_1 || baseId == MANGLE_CAT_1 || baseId == POUNCE_1 ||\n+                baseId == RAKE_1 || baseId == RAVAGE_1 || baseId == SHRED_1))\n+                primalFuryProc = iscrit && lvl >= 25;\n+\n+            damage = int32(fdamage * (1.0f + pctbonus));\n+        }\n+\n+        void ApplyClassSpellCritMultiplierAll(Unit const* victim, float& crit_chance, SpellInfo const* spellInfo, SpellSchoolMask /*schoolMask*/, WeaponAttackType /*attackType*/) const override\n+        {\n+            //uint32 spellId = spellInfo->Id;\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+\n+            //Nature's bounty: 25% additional critical chance for Regrowth and Nourish\n+            if ((GetSpec() == BOT_SPEC_DRUID_RESTORATION) && lvl >= 35 && (baseId == REGROWTH_1 || baseId == NOURISH_1))\n+                crit_chance += 25.f;\n+            //Rend and Tear (part 2): 25% additional critical chance on bleeding targets for Ferocious Bite (handled in Unit.cpp)\n+            //if (lvl >= 55 && victim->HasAuraState(AURA_STATE_BLEEDING) && baseId == FEROCIOUS_BITE_1)\n+            //    crit_chance += 25.f;\n+            //Improved Moonfire\n+            if (lvl >= 15 && baseId == MOONFIRE_1)\n+                crit_chance += 10.f;\n+            //Nature's Majesty: 4% additional critical chance for Wrath, Starfire, Starfall, Nourish and Healing Touch\n+            if (lvl >= 15 && ((spellInfo->SpellFamilyFlags[0] & 0x25) || (spellInfo->SpellFamilyFlags[1] & 0x2800000)))\n+                crit_chance += 4.f;\n+            //Eclipse (Lunar): 40% additional critical chance for Starfire\n+            if (lvl >= 50 && baseId == STARFIRE_1 && me->HasAura(ECLIPSE_LUNAR_BUFF))\n+                crit_chance += 40.f;\n+            //Improved Faerie Fire (part 2): 3% additional critical chance for all spells on target affected by Faerie Fire\n+            if (GetSpec() == BOT_SPEC_DRUID_BALANCE && lvl >= 40 && victim && victim->HasAuraState(AURA_STATE_FAERIE_FIRE))\n+                crit_chance += 3.f;\n+            //Natural Perfection: 3% additional critical chance for all spells\n+            if (GetSpec() == BOT_SPEC_DRUID_RESTORATION && lvl >= 40)\n+                crit_chance += 3.f;\n+        }\n+\n+        void ApplyClassDamageMultiplierSpell(int32& damage, SpellNonMeleeDamage& /*damageinfo*/, SpellInfo const* spellInfo, WeaponAttackType /*attackType*/, bool iscrit) const override\n+        {\n+            //uint32 spellId = spellInfo->Id;\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+            float fdamage = float(damage);\n+\n+            //apply bonus damage mods\n+            float pctbonus = 0.0f;\n+            if (iscrit)\n+            {\n+                //!!!spell damage is not yet critical and will be multiplied by 1.5\n+                //so we should put here bonus damage mult /1.5\n+                //Vengeance: 100% additional crit damage bonus for Starfire, Starfall, Moonfire and Wrath\n+                if (lvl >= 25 && ((spellInfo->SpellFamilyFlags[0] & 0x7) || (spellInfo->SpellFamilyFlags[1] & 0x800000)))\n+                    pctbonus += 0.333f;\n+            }\n+            //Genesis: 5% bonus damage for Dots\n+            if (lvl >= 10 && ((spellInfo->SpellFamilyFlags[0] & 0x6002D2) || (spellInfo->SpellFamilyFlags[1] & 0x4000010)))\n+                pctbonus += 0.05f;\n+            //Improved Insect Swarm: SpellEffects.cpp, Unit.cpp\n+            //Brambles: 75% bonus damage for Throns and Entangling Roots (Thorns are handled in Unit.cpp)\n+            if (lvl >= 20 && (spellInfo->SpellFamilyFlags[0] & 0x200))\n+                pctbonus += 0.75f;\n+            //Moonfury: 10% bonus damage for Starfire, Moonfire and Wrath\n+            if (lvl >= 35 && (spellInfo->SpellFamilyFlags[0] & 0x7))\n+                pctbonus += 0.1f;\n+            //Glyph of Focus (part 1): 10% bonus damage for Starfall\n+            if (lvl >= 70 && (spellInfo->SpellFamilyFlags[1] & 0x800000))\n+                pctbonus += 0.1f;\n+            //Wrath of Cenarius: 20%/10% Increased spellpower bonus for Starfire/Wrath\n+            if ((GetSpec() == BOT_SPEC_DRUID_BALANCE) && lvl >= 45)\n+            {\n+                if (baseId == STARFIRE_1)\n+                    fdamage += me->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_MAGIC) * 0.2f * me->CalculateDefaultCoefficient(spellInfo, SPELL_DIRECT_DAMAGE) * me->CalculateSpellpowerCoefficientLevelPenalty(spellInfo);\n+                if (baseId == WRATH_1)\n+                    fdamage += me->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_MAGIC) * 0.1f * me->CalculateDefaultCoefficient(spellInfo, SPELL_DIRECT_DAMAGE) * me->CalculateSpellpowerCoefficientLevelPenalty(spellInfo);\n+            }\n+            //Eclipse (Solar): 40% bonus damage for Wrath\n+            if (lvl >= 50 && baseId == WRATH_1 && me->HasAura(ECLIPSE_SOLAR_BUFF))\n+                pctbonus += 0.4f;\n+            //Gale Winds: 30% bonus damage for Hurricane and Typhoon\n+            if ((GetSpec() == BOT_SPEC_DRUID_BALANCE) &&\n+                lvl >= 50 && ((spellInfo->SpellFamilyFlags[0] & 0x400000) || (spellInfo->SpellFamilyFlags[1] & 0x1000000)))\n+                pctbonus += 0.3f;\n+\n+            damage = int32(fdamage * (1.0f + pctbonus));\n+        }\n+\n+        void ApplyClassDamageMultiplierHeal(Unit const* /*victim*/, float& heal, SpellInfo const* spellInfo, DamageEffectType damagetype, uint32 stack) const override\n+        {\n+            //uint32 spellId = spellInfo->Id;\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+            float pctbonus = 0.0f;\n+            float flat_mod = 0.0f;\n+\n+            //Genesis: 5% bonus healing for Hots\n+            if (lvl >= 10 && ((spellInfo->SpellFamilyFlags[0] & 0x6002D2) || (spellInfo->SpellFamilyFlags[1] & 0x4000010)))\n+                pctbonus += 0.05f;\n+            //Improved Rejuvenation: 15% bonus healing for Rejuvenation\n+            if (lvl >= 25 && baseId == REJUVENATION_1)\n+                pctbonus += 0.15f;\n+            //Improved Rejuvenation (17114,17115): 27% bonus healing for Rejuvenation\n+            //if (baseId == REJUVENATION_1)\n+            //    pctbonus += 0.27f;\n+            //Gift of Nature: 10% bonus healing for all spells\n+            if ((GetSpec() == BOT_SPEC_DRUID_RESTORATION) && lvl >= 30)\n+                pctbonus += 0.1f;\n+            //Empowered Touch: 40% bonus (from spellpower) for Healing Touch and 20% bonus (from spellpower) for Nourish\n+            if ((GetSpec() == BOT_SPEC_DRUID_RESTORATION) && lvl >= 35)\n+            {\n+                if (baseId == HEALING_TOUCH_1)\n+                    flat_mod += me->SpellBaseHealingBonusDone(SPELL_SCHOOL_MASK_MAGIC) * 0.4f * me->CalculateDefaultCoefficient(spellInfo, damagetype) * 1.88f * me->CalculateSpellpowerCoefficientLevelPenalty(spellInfo) * stack;\n+                else if (baseId == NOURISH_1)\n+                    flat_mod += me->SpellBaseHealingBonusDone(SPELL_SCHOOL_MASK_MAGIC) * 0.2f * me->CalculateDefaultCoefficient(spellInfo, damagetype) * 1.88f * me->CalculateSpellpowerCoefficientLevelPenalty(spellInfo) * stack;\n+            }\n+            //Empowered Rejuvenation: 20% bonus healing for healing over time effects\n+            if ((GetSpec() == BOT_SPEC_DRUID_RESTORATION) &&\n+                lvl >= 45 && ((spellInfo->SpellFamilyFlags[0] & 0xD0) || (spellInfo->SpellFamilyFlags[1] & 0x4000010)))\n+                flat_mod += me->SpellBaseHealingBonusDone(SPELL_SCHOOL_MASK_MAGIC) * 0.2f * me->CalculateDefaultCoefficient(spellInfo, damagetype) * 1.88f * me->CalculateSpellpowerCoefficientLevelPenalty(spellInfo) * stack;\n+\n+            heal = heal * (1.0f + pctbonus) + flat_mod;\n+        }\n+\n+        void ApplyClassSpellCostMods(SpellInfo const* spellInfo, int32& cost) const override\n+        {\n+            //uint32 spellId = spellInfo->Id;\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            float fcost = float(cost);\n+            int32 flatbonus = 0;\n+            float pctbonus = 0.0f;\n+\n+            //100% mods\n+            //Clearcasting: -100% mana/rage/energy cost for any spell\n+            if (AuraEffect const* eff = me->GetAuraEffect(SPELL_AURA_ADD_PCT_MODIFIER, SPELLFAMILY_DRUID, 0x0, 0x200000, 0x0))\n+                if (eff->IsAffectingSpell(spellInfo))\n+                    pctbonus += 1.0f;\n+\n+            //percent mods\n+            //Tree of Life Passive (5420) (activates when learned):\n+            if ((GetSpec() == BOT_SPEC_DRUID_RESTORATION) &&\n+                lvl >= 50 && ((spellInfo->SpellFamilyFlags[0] & 0x50) || (spellInfo->SpellFamilyFlags[1] & 0x4000010)))\n+                pctbonus += 0.5f;\n+            //Glyph of the Wild:\n+            if (lvl >= 15 && baseId == MARK_OF_THE_WILD_1)\n+                pctbonus += 0.5f;\n+            //Natural Shapeshifter:\n+            if (lvl >= 15 &&\n+                spellInfo->_effects[0].Effect == SPELL_EFFECT_APPLY_AURA &&\n+                spellInfo->_effects[0].ApplyAuraName == SPELL_AURA_MOD_SHAPESHIFT)\n+                pctbonus += 0.3f;\n+            //King of the Jungle part 3:\n+            if (lvl >= 15 && (spellInfo->SpellFamilyFlags[0] & 0xC0000000))\n+                pctbonus += 0.6f;\n+            //Tranquil Spirit:\n+            if (lvl >= 25 &&\n+                (baseId == HEALING_TOUCH_1 || baseId == NOURISH_1 || baseId == TRANQUILITY_1))\n+                pctbonus += 0.1f;\n+            //Moonglow:\n+            if (lvl >= 15 && ((spellInfo->SpellFamilyFlags[0] & 0x77) || (spellInfo->SpellFamilyFlags[1] & 0x2800000)))\n+                pctbonus += 0.09f;\n+            //Berserk part 2:\n+            if ((GetSpec() == BOT_SPEC_DRUID_FERAL) && lvl >= 60 && _form == DRUID_CAT_FORM &&\n+                //((spellInfo->SpellFamilyFlags[0] & 0x839000) ||\n+                //(spellInfo->SpellFamilyFlags[1] & 0x30000480) ||\n+                //(spellInfo->SpellFamilyFlags[2] & 0x40420)) &&\n+                me->GetAuraEffect(SPELL_AURA_MECHANIC_IMMUNITY, SPELLFAMILY_DRUID, 0x0, 0x0, 0x40))\n+                pctbonus += 0.5f;\n+\n+            //flat mods\n+            //Shredding Attacks:\n+            if (lvl >= 25)\n+            {\n+                if (spellInfo->SpellFamilyFlags[0] & 0x8000)\n+                    flatbonus += 18;\n+                else if (spellInfo->SpellFamilyFlags[1] & 0x100)\n+                    flatbonus += 20;\n+            }\n+            //Ferocity:\n+            if (lvl >= 10)\n+            {\n+                if ((spellInfo->SpellFamilyFlags[0] & 0x800) || (spellInfo->SpellFamilyFlags[1] & 0x100040))\n+                    flatbonus += 50;\n+                else if ((spellInfo->SpellFamilyFlags[0] & 0x1000) ||\n+                    (spellInfo->SpellFamilyFlags[1] & 0x400) ||\n+                    (spellInfo->SpellFamilyFlags[2] & 0x40400))\n+                    flatbonus += 5;\n+            }\n+            //Improved Mangle part 2:\n+            if ((GetSpec() == BOT_SPEC_DRUID_FERAL) && lvl >= 50 && (spellInfo->SpellFamilyFlags[1] & 0x400))\n+                flatbonus += 6;\n+\n+            //cost can be < 0\n+            cost = int32(fcost * (1.0f - pctbonus)) - flatbonus;\n+        }\n+\n+        void ApplyClassSpellCastTimeMods(SpellInfo const* spellInfo, int32& casttime) const override\n+        {\n+            //casttime is in milliseconds\n+            //uint32 spellId = spellInfo->Id;\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            int32 timebonus = 0;\n+            float pctbonus = 0.0f;\n+\n+            //100% mods\n+            //Elune's Wrath: -100% cast time for Starfire\n+            AuraEffect const* elun = me->GetAuraEffect(ELUNES_WRATH_BUFF, 0);\n+            //Predator's Swiftness: -100% cast time\n+            AuraEffect const* pred = me->GetAuraEffect(PREDATORS_SWIFTNESS_BUFF, 0);\n+            //Nature's Swiftness: -100% cast time\n+            AuraEffect const* natu = me->GetAuraEffect(NATURES_SWIFTNESS_1, 0);\n+            if ((elun && elun->IsAffectingSpell(spellInfo)) ||\n+                (pred && pred->IsAffectingSpell(spellInfo)) ||\n+                (natu && natu->IsAffectingSpell(spellInfo)))\n+                pctbonus += 1.0f;\n+\n+            //pct mods\n+            //Celestial Focus: 3% haste\n+            if (lvl >= 25)\n+                pctbonus += 0.03f;\n+\n+            //flat mods\n+            //Starlight Wrath: -0.5 sec cast time for Wrath and Starfire\n+            if (lvl >= 10 && (baseId == WRATH_1 || baseId == STARFIRE_1))\n+                timebonus += 500;\n+            //Naturalist: -0.5 sec cast time for Healing Touch\n+            if (lvl >= 15 && baseId == HEALING_TOUCH_1)\n+                timebonus += 500;\n+            //Regrowth bonus (ids:21872,46834): -0.2 x2 sec cast time for Regrowth\n+            if (lvl >= 68 && baseId == REGROWTH_1)\n+                timebonus += 400;\n+\n+            casttime = std::max<int32>(int32((float(casttime) * (1.0f - pctbonus)) - timebonus), 0);\n+        }\n+\n+        void ApplyClassSpellNotLoseCastTimeMods(SpellInfo const* spellInfo, int32& delayReduce) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchoolMask schools = spellInfo->GetSchoolMask();\n+            uint8 lvl = me->GetLevel();\n+            int32 reduceBonus = 0;\n+\n+            if (lvl >= 15 && baseId == WRATH_1)\n+                reduceBonus += 50;\n+\n+            if (GetSpec() == BOT_SPEC_DRUID_BALANCE && lvl >= 25)\n+            {\n+                if (AuraEffect const* ofre = me->GetAuraEffect(SPELL_AURA_PERIODIC_ENERGIZE, SPELLFAMILY_DRUID, 2853, EFFECT_2))\n+                    if (ofre->IsAffectingSpell(spellInfo))\n+                        reduceBonus += 100;\n+\n+                switch (baseId)\n+                {\n+                    case STARFIRE_1: case HIBERNATE_1: case HURRICANE_1:\n+                        reduceBonus += 70;\n+                        break;\n+                    default:\n+                        break;\n+                }\n+            }\n+\n+            delayReduce += reduceBonus;\n+        }\n+\n+        void ApplyClassSpellCooldownMods(SpellInfo const* spellInfo, uint32& cooldown) const override\n+        {\n+            //cooldown is in milliseconds\n+            //uint32 spellId = spellInfo->Id;\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            int32 timebonus = 0;\n+            float pctbonus = 0.0f;\n+\n+            //pct mods\n+            //Improved Tranquility: -60% cooldown for Tanquility\n+            if ((GetSpec() == BOT_SPEC_DRUID_RESTORATION) && lvl >= 30 && baseId == TRANQUILITY_1)\n+                pctbonus += 0.6f;\n+\n+            //flat mods\n+            //Glyph of Turn Evil: +8 sec cooldown for Turn Evil (3 sec for bots)\n+            //if (lvl >= 24 && spellId == GetSpell(TURN_EVIL_1))\n+            //    timebonus -= 3000;\n+\n+            cooldown = std::max<int32>(int32((float(cooldown) * (1.0f - pctbonus)) - timebonus), 0);\n+        }\n+\n+        void ApplyClassSpellCategoryCooldownMods(SpellInfo const* spellInfo, uint32& cooldown) const override\n+        {\n+            //cooldown is in milliseconds\n+            //uint32 spellId = spellInfo->Id;\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+            int32 timebonus = 0;\n+            float pctbonus = 0.0f;\n+\n+            //pct mods\n+            //Glyph of Dash: -20% cooldown for Dash\n+            if (lvl >= 16 && baseId == DASH_1)\n+                pctbonus += 0.2f;\n+            //Berserk part 1:\n+            if (lvl >= 60 && _form == DRUID_BEAR_FORM && (spellInfo->SpellFamilyFlags[1] & 0x40) &&\n+                me->GetAuraEffect(SPELL_AURA_MECHANIC_IMMUNITY, SPELLFAMILY_DRUID, 0x0, 0x0, 0x40))\n+                pctbonus += 1.0f;\n+\n+            //flat mods\n+            //Genesis Rebirth Bonus (26106): -5 min cooldown for Rebirth\n+            if (baseId == REBIRTH_1)\n+                timebonus += 300000;\n+            //Improved Mangle part 1: -1.5 sec cooldown for Mangle (Bear)\n+            if (lvl >= 50 && baseId == MANGLE_BEAR_1)\n+                timebonus += 1500;\n+            //Brutal Impact: -30 sec cooldown for Bash\n+            if ((GetSpec() == BOT_SPEC_DRUID_FERAL) && lvl >= 30 && baseId == BASH_1)\n+                timebonus += 30000;\n+            //Glyph of Typhoon: -3 sec cooldown for Typhoon\n+            if (lvl >= 70 && baseId == TYPHOON_1)\n+                timebonus += 3000;\n+            //Starfall: increase cooldown for bots\n+            if (baseId == STARFALL_1)\n+                timebonus -= 90000; //x2\n+\n+            cooldown = std::max<int32>(int32((float(cooldown) * (1.0f - pctbonus)) - timebonus), 0);\n+        }\n+\n+        void ApplyClassSpellGlobalCooldownMods(SpellInfo const* spellInfo, float& cooldown) const override\n+        {\n+            //cooldown is in milliseconds\n+            //uint32 spellId = spellInfo->Id;\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            float timebonus = 0.0f;\n+            float pctbonus = 0.0f;\n+\n+            //pct bonus\n+            //Gift of the Earthmother part 2:\n+            if (lvl >= 55 && baseId == LIFEBLOOM_1)\n+                pctbonus += 0.1f;\n+\n+            //flat bonus\n+            ////Unrelenting Assault (part 1, special): -0.5 sec global cooldown for Overpower and Revenge (not for tanks)\n+            //if (lvl >= 50 && !IsTank() && (spellId == GetSpell(OVERPOWER_1) || spellId == GetSpell(REVENGE_1)))\n+            //    timebonus += 500.f;\n+\n+            cooldown = (cooldown * (1.0f - pctbonus)) - timebonus;\n+        }\n+\n+        void ApplyClassSpellRadiusMods(SpellInfo const* spellInfo, float& radius) const override\n+        {\n+            uint32 spellId = spellInfo->Id;\n+            //uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            //uint8 lvl = me->GetLevel();\n+            float flatbonus = 0.0f;\n+            float pctbonus = 0.0f;\n+\n+            //pct mods\n+\n+            //flat mods\n+            //Starfall\n+            if (spellId == STARFALL_DUMMY_AOE_4)\n+                flatbonus -= 10.f; //20 = 36 talented - 18 glyphed + 2 custom\n+            if (spellId == STARFALL_DAMAGE_AOE_4)\n+                flatbonus += 4.f; //5 nominal + 4 custom\n+\n+            radius = radius * (1.0f + pctbonus) + flatbonus;\n+        }\n+\n+        void ApplyClassSpellRangeMods(SpellInfo const* spellInfo, float& maxrange) const override\n+        {\n+            //uint32 spellId = spellInfo->Id;\n+            //uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            float flatbonus = 0.0f;\n+            float pctbonus = 0.0f;\n+\n+            //pct mods\n+            //Nature's Reach: +20% range for Balance Spells and Faerie Fire (Feral)\n+            if (lvl >= 20 && ((spellInfo->SpellFamilyFlags[0] & 0x600707) || (spellInfo->SpellFamilyFlags[1] & 0x1821220)))\n+                pctbonus += 0.2f;\n+\n+            //flat mods\n+            //Glyph of Curse of Exhaustion: +5 yd range for Curse of Exhaustion\n+            //if (lvl >= 70 && baseId == CURSE_OF_EXHAUSTION_1)\n+            //    flatbonus += 5.f;\n+\n+            maxrange = maxrange * (1.0f + pctbonus) + flatbonus;\n+        }\n+\n+        void ApplyClassSpellMaxTargetsMods(SpellInfo const* spellInfo, uint32& targets) const override\n+        {\n+            uint32 bonusTargets = 0;\n+\n+            //Glyph of Maul: + 1 target\n+            if (spellInfo->SpellFamilyFlags[0] & 0x800)\n+                bonusTargets += 1;\n+            //Glyph of Wild Growth: + 1 target\n+            if (spellInfo->SpellFamilyFlags[1] & 0x4000000)\n+                bonusTargets += 1;\n+            //Berserk: + 2 Mangle (Bear) targets\n+            if ((spellInfo->SpellFamilyFlags[1] & 0x40) &&\n+                me->GetAuraEffect(SPELL_AURA_MECHANIC_IMMUNITY, SPELLFAMILY_DRUID, 0x0, 0x0, 0x40))\n+                bonusTargets += 2;\n+\n+            targets = targets + bonusTargets;\n+        }\n+\n+        void ApplyClassEffectMods(SpellInfo const* spellInfo, uint8 effIndex, float& value) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            float pctbonus = 1.0f;\n+\n+            //Improved Leader of the Pack: chance\n+            if (baseId == LEADER_OF_THE_PACK_BUFF && effIndex == EFFECT_1)\n+                value += 4.f;\n+\n+            value = value * pctbonus;\n+        }\n+\n+        void OnClassSpellGo(SpellInfo const* spellInfo) override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+\n+            //Nature's Swiftness: notify master\n+            if (baseId == NATURES_SWIFTNESS_1)\n+            {\n+                if (!IAmFree())\n+                    ReportSpellCast(NATURES_SWIFTNESS_1, LocalizedNpcText(master, BOT_TEXT__USED), master);\n+            }\n+\n+            //On next attack spells cooldown handle\n+            //if (baseId == MAUL_1)\n+            //    SetSpellCooldown(baseId, me->getAttackTimer(BASE_ATTACK) - 250);\n+\n+            //Handle clearcasting\n+            //Notes: bugged with hurricane (periodic)\n+            if (AuraEffect const* eff = me->GetAuraEffect(SPELL_AURA_ADD_PCT_MODIFIER, SPELLFAMILY_DRUID, 0x0, 0x200000, 0x0))\n+                if (eff->IsAffectingSpell(spellInfo) && !spellInfo->IsRankOf(sSpellMgr->GetSpellInfo(HURRICANE_DAMAGE_1)))\n+                    me->RemoveAurasDueToSpell(OMEN_OF_CLARITY_BUFF);\n+\n+            //Elune's Wrath: -100% takes priority since only Starfire\n+            AuraEffect const* elun = me->GetAuraEffect(ELUNES_WRATH_BUFF, 0);\n+            //Predator's Swiftness takes priority since duration\n+            AuraEffect const* pred = me->GetAuraEffect(PREDATORS_SWIFTNESS_BUFF, 0);\n+            //Nature's Swiftness\n+            AuraEffect const* natu = me->GetAuraEffect(NATURES_SWIFTNESS_1, 0);\n+            if (elun && elun->IsAffectingSpell(spellInfo))\n+                me->RemoveAurasDueToSpell(ELUNES_WRATH_BUFF);\n+            else if (pred && pred->IsAffectingSpell(spellInfo))\n+                me->RemoveAurasDueToSpell(PREDATORS_SWIFTNESS_BUFF);\n+            else if (natu && natu->IsAffectingSpell(spellInfo))\n+                me->RemoveAurasDueToSpell(NATURES_SWIFTNESS_1);\n+        }\n+\n+        void SpellHitTarget(WorldObject* wtarget, SpellInfo const* spell) override\n+        {\n+            Unit* target = wtarget->ToUnit();\n+            if (!target)\n+                return;\n+\n+            uint32 spellId = spell->Id;\n+            uint32 baseId = spell->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+\n+            if (_form == DRUID_CAT_FORM)\n+            {\n+                //Combo point generating\n+                if (baseId == CLAW_1 || baseId == MANGLE_CAT_1 || baseId == POUNCE_1 ||\n+                    baseId == RAKE_1 || baseId == RAVAGE_1 || baseId == SHRED_1)\n+                {\n+                    comboPoints++;\n+                    //debug\n+                    //BOT_LOG_ERROR(\"entities.player\", \"druid_bot CP GEN: {} adds 1, now {}\", spell->SpellName[0], uint32(comboPoints));\n+                    if (primalFuryProc)\n+                    {\n+                        comboPoints++;\n+                        //debug\n+                        //BOT_LOG_ERROR(\"entities.player\", \"druid_bot CP EX: now {}\", uint32(comboPoints));\n+                    }\n+                    if (comboPoints > 5)\n+                    {\n+                        comboPoints = 5;\n+                        //debug\n+                        //BOT_LOG_ERROR(\"entities.player\", \"druid_bot CP NOR: now {}\", uint32(comboPoints));\n+                    }\n+                }\n+                //Combo point spending\n+                //else if (baseId == FEROCIOUS_BITE_1 || baseId == MAIM_1 || baseId == RIP_1 || baseId == SAVAGE_ROAR_1)\n+                else if (spell->NeedsComboPoints())\n+                {\n+                    //debug\n+                    //BOT_LOG_ERROR(\"entities.player\", \"druid_bot CP SPEND1: {} to 0\", uint32(comboPoints));\n+                    if (lvl >= 25 && comboPoints > 0)\n+                    {\n+                        if (urand(1,100) <= uint32(comboPoints * 20))\n+                        {\n+                            me->CastSpell(me, PREDATORS_SWIFTNESS_BUFF, true);\n+                            //debug\n+                            //BOT_LOG_ERROR(\"entities.player\", \"druid_bot CP SPEND1: PS proc!\");\n+                        }\n+                    }\n+                    comboPoints = 0;\n+                }\n+\n+                //Maim helper\n+                if (baseId == MAIM_1)\n+                    MoveBehind(target);\n+            }\n+\n+            //Hibernate helper\n+            if (spellId == GetSpell(HIBERNATE_1))\n+            {\n+                hibery = true;\n+                hiberyCheckTimer = 2000;\n+            }\n+\n+            //Bash desperate use (ranged): retreat\n+            //Only if hit\n+            if (baseId == BASH_1 && HasRole(BOT_ROLE_RANGED) && !HasBotCommandState(BOT_COMMAND_MASK_UNMOVING))\n+            {\n+                //if (GC_Timer <= lastdiff && GetSpell(TRAVEL_FORM_1))\n+                //    doCast(me, GetSpell(TRAVEL_FORM_1));\n+                GetInPosition(true, target);\n+            }\n+\n+            //Infected Wound: handle proc\n+            if (baseId == SHRED_1 || baseId == MAUL_1 || baseId == MANGLE_BEAR_1 || baseId == MANGLE_CAT_1)\n+            {\n+                if ((GetSpec() == BOT_SPEC_DRUID_FERAL) && lvl >= 45)\n+                {\n+                    CastSpellExtraArgs args(true);\n+                    args.SetOriginalCaster(me->GetGUID());\n+                    target->CastSpell(target, INFECTED_WOUNDS_EFFECT, args);\n+                }\n+            }\n+\n+            //Brutal Impact: +1 sec duration for Bash and Pounce stun\n+            if (baseId == BASH_1 || baseId == POUNCE_1)\n+            {\n+                if (Aura* stu = target->GetAura(spellId))\n+                {\n+                    //1 extra second on creatures\n+                    uint32 dur = stu->GetDuration() + (target->IsPlayer() ? 1000 : 2000);\n+                    stu->SetDuration(dur);\n+                    stu->SetMaxDuration(dur);\n+                }\n+            }\n+\n+            //Glyph of Starfire: Increase max duration of Moonfire and refresh\n+            if (baseId == STARFIRE_1 && GetSpell(MOONFIRE_1))\n+            {\n+                if (lvl >= 20)\n+                {\n+                    if (Aura* aur = target->GetAura(GetSpell(MOONFIRE_1), me->GetGUID()))\n+                    {\n+                        //extra 9 sec base + 3 sec Nature's Splendor\n+                        if (aur->GetMaxDuration() < spell->GetMaxDuration() + 12000)\n+                        {\n+                            aur->SetDuration(aur->GetDuration() + 3000);\n+                            aur->SetMaxDuration(aur->GetMaxDuration() + 3000);\n+                        }\n+                    }\n+                }\n+            }\n+            //Nature's Splendor: Increased duraion for\n+            //Moonfire (3 sec), Rejuvenation (3 sec, let 6), Regrowth (6 sec, let 9),\n+            //Insect Swarm (2 sec) and Lifebloom (2 sec)\n+            if (baseId == MOONFIRE_1 || baseId == REJUVENATION_1 || baseId == REGROWTH_1 ||\n+                baseId == INSECT_SWARM_1 || baseId == LIFEBLOOM_1)\n+            {\n+                if (lvl >= 20)\n+                {\n+                    if (Aura* aur = target->GetAura(spellId, me->GetGUID()))\n+                    {\n+                        uint32 dur = aur->GetDuration();\n+\n+                        switch (baseId)\n+                        {\n+                            case MOONFIRE_1:\n+                                dur += 3000;\n+                                break;\n+                            case REJUVENATION_1:\n+                                dur += 6000;\n+                                break;\n+                            case REGROWTH_1:\n+                                dur += 9000;\n+                                break;\n+                            case INSECT_SWARM_1:\n+                            case LIFEBLOOM_1:\n+                                dur += 2000;\n+                                break;\n+                            default:\n+                                break;\n+                        }\n+\n+                        aur->SetDuration(dur);\n+                        aur->SetMaxDuration(dur);\n+                    }\n+                }\n+            }\n+\n+            if (baseId == THORNS_1)\n+            {\n+                //30 min duration for Thorns\n+                if (Aura* thorn = target->GetAura(spellId, me->GetGUID()))\n+                {\n+                    uint32 dur = 30 * MINUTE * IN_MILLISECONDS;\n+                    thorn->SetDuration(dur);\n+                    thorn->SetMaxDuration(dur);\n+                }\n+            }\n+            if (baseId == MARK_OF_THE_WILD_1)\n+            {\n+                //1 hour duration for Mark of the Wild\n+                if (Aura* mark = target->GetAura(spellId, me->GetGUID()))\n+                {\n+                    uint32 dur = 1 * HOUR * IN_MILLISECONDS;\n+                    mark->SetDuration(dur);\n+                    mark->SetMaxDuration(dur);\n+\n+                    //Improved Mark of the Wild: +40% effect\n+                    for (auto i : NPCBots::index_array<uint8, MAX_SPELL_EFFECTS>)\n+                        if (AuraEffect* app = mark->GetEffect(i))\n+                            app->ChangeAmount((app->GetAmount() * 14) / 10);\n+                }\n+            }\n+            if ((baseId == FAERIE_FIRE_NORMAL_1 || baseId == FAERIE_FIRE_FERAL_1) && lvl >= 40)\n+            {\n+                //Improved Faerie Fire (part 1): incrase crit chance taken by 3% (effect2)\n+                if (AuraEffect* faf = target->GetAuraEffect(SPELL_AURA_MOD_ATTACKER_SPELL_HIT_CHANCE, SPELLFAMILY_DRUID, 0x400, 0x0, 0x0, me->GetGUID()))\n+                    faf->ChangeAmount(faf->GetAmount() + 3);\n+            }\n+\n+            OnSpellHitTarget(target, spell);\n+        }\n+\n+        void SpellHit(WorldObject* wcaster, SpellInfo const* spell) override\n+        {\n+            Unit* caster = wcaster->ToUnit();\n+            if (!caster)\n+                return;\n+\n+            uint32 spellId = spell->Id;\n+            uint32 baseId = spell->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+\n+            //Savage Roar duration\n+            if (spellId == SAVAGE_ROAR_BUFF || spellId == SAVAGE_ROAR_1)\n+            {\n+                if (Aura* sav = me->GetAura(spellId))\n+                {\n+                    uint32 dur = sav->GetDuration() + 6000;\n+                    sav->SetDuration(dur);\n+                    sav->SetMaxDuration(dur);\n+                }\n+                //Glyph of Savage Roar: 3% increase (20 for bot)\n+                if (spellId == SAVAGE_ROAR_BUFF)\n+                {\n+                    AuraEffect* sav = me->GetAuraEffect(spellId, EFFECT_0);\n+                    if (sav)\n+                        sav->ChangeAmount(sav->GetAmount() + 20);\n+                }\n+            }\n+\n+            //Glyph of Berserk: duration\n+            if (baseId == BERSERK_1)\n+            {\n+                if (Aura* ber = me->GetAura(spellId))\n+                {\n+                    uint32 dur = ber->GetDuration() + 5000;\n+                    ber->SetDuration(dur);\n+                    ber->SetMaxDuration(dur);\n+                }\n+            }\n+            //Glyph of Survival Instincts\n+            if (lvl >= 20 && spellId == SURVIVAL_INSTINCTS_1)\n+            {\n+                AuraEffect* sur = me->GetAuraEffect(spellId, EFFECT_0);\n+                if (sur)\n+                    sur->ChangeAmount(sur->GetAmount() + 15);\n+            }\n+            //Starfall: duration\n+            if (baseId == STARFALL_1)\n+            {\n+                if (Aura* sta = me->GetAura(spellId))\n+                {\n+                    uint32 dur = sta->GetDuration() * 3;\n+                    sta->SetDuration(dur);\n+                    sta->SetMaxDuration(dur);\n+                }\n+            }\n+            //Predatoe's Swiftness: duration\n+            if (spellId == PREDATORS_SWIFTNESS_BUFF)\n+            {\n+                if (Aura* swi = me->GetAura(spellId))\n+                {\n+                    swi->SetDuration(15000);\n+                    swi->SetMaxDuration(15000);\n+                }\n+            }\n+            //Eclipse (helper): cooldown\n+            if (spellId == ECLIPSE_SOLAR_BUFF || spellId == ECLIPSE_LUNAR_BUFF)\n+                SetSpellCooldown(spellId, 30000);\n+            //Improved Leader of the Pack: handle SPELLMOD_EFFECT_2 MOVED to effect mods\n+            /*\n+            if (spellId == LEADER_OF_THE_PACK_BUFF)\n+            {\n+                AuraEffect* lea = me->GetAuraEffect(spellId, EFFECT_1, me->GetGUID());\n+                if (lea)\n+                    lea->ChangeAmount(lea->GetAmount() + 4);\n+            }\n+            */\n+            //Improved Barkskin: 10% additional damage reduction\n+            if ((GetSpec() == BOT_SPEC_DRUID_RESTORATION) && baseId == BARKSKIN_1)\n+            {\n+                AuraEffect* bar = me->GetAuraEffect(spellId, EFFECT_1, me->GetGUID());\n+                if (bar)\n+                    bar->ChangeAmount(bar->GetAmount() - 10);\n+            }\n+\n+            //Forms helper\n+            if (baseId == BEAR_FORM_1)\n+                setStats(DRUID_BEAR_FORM);\n+            else if (baseId == CAT_FORM_1)\n+                setStats(DRUID_CAT_FORM);\n+            else if (baseId == MOONKIN_FORM_1)\n+                setStats(DRUID_MOONKIN_FORM);\n+            else if (baseId == TREE_OF_LIFE_FORM_1)\n+                setStats(DRUID_TREE_FORM);\n+            else if (baseId == TRAVEL_FORM_1)\n+                setStats(DRUID_TRAVEL_FORM);\n+            else if (baseId == AQUATIC_FORM_1)\n+                setStats(DRUID_AQUATIC_FORM);\n+            else if (baseId == FLIGHT_FORM_1)\n+                setStats(DRUID_FLIGHT_FORM);\n+\n+            //Cat Form: delay prowl just a little bit\n+            if (baseId == CAT_FORM_1 && GetSpell(PROWL_1) && GetSpellCooldown(PROWL_1) < 300)\n+                SetSpellCooldown(PROWL_1, 300);\n+\n+            //Leader of the Pack helper\n+            if (baseId == CAT_FORM_1 || baseId == BEAR_FORM_1)\n+            {\n+                if ((GetSpec() == BOT_SPEC_DRUID_FERAL) && lvl >= 40)\n+                    me->CastSpell(me, LEADER_OF_THE_PACK_BUFF, true);\n+            }\n+\n+            OnSpellHit(caster, spell);\n+        }\n+\n+        void DamageDealt(Unit* victim, uint32& damage, DamageEffectType damageType) override\n+        {\n+            bot_ai::DamageDealt(victim, damage, damageType);\n+        }\n+\n+        void DamageTaken(Unit* u, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo*/) override\n+        {\n+            if (!u)\n+                return;\n+            if (!u->IsInCombat() && !me->IsInCombat())\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void OwnerAttackedBy(Unit* u) override\n+        {\n+            if (!u)\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        float GetSpellAttackRange(bool longRange) const override\n+        {\n+            return longRange ? CalcSpellMaxRange(WRATH_1) : 20.f;\n+        }\n+\n+        uint8 GetPetPositionNumber(Creature const* summon) const override\n+        {\n+            for (auto i : NPCBots::index_array<uint8, MAX_TREANTS>)\n+                if (_treants[i] == summon->GetGUID())\n+                    return i;\n+\n+            return 0;\n+        }\n+\n+        void SummonBotPet(Unit* target)\n+        {\n+            UnsummonTreants();\n+\n+            const uint32 entry = BOT_PET_FORCE_OF_NATURE;\n+\n+            for ([[maybe_unused]] auto i : NPCBots::index_array<uint8, MAX_TREANTS>)\n+            {\n+                //Position pos;\n+\n+                //30 sec duration\n+                Creature* myPet = me->SummonCreature(entry, (me->GetDistance(target) < 36.f ? *target : *me), TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5s);\n+                //me->GetNearPoint(myPet, pos.m_positionX, pos.m_positionY, pos.m_positionZ, 0, 2, me->GetOrientation());\n+                //myPet->GetMotionMaster()->MovePoint(me->GetMapId(), pos);\n+                myPet->SetCreator(master);\n+                myPet->SetOwnerGUID(me->GetGUID());\n+                myPet->SetFaction(master->GetFaction());\n+                myPet->SetControlledByPlayer(!IAmFree());\n+                myPet->SetPvP(me->IsPvP());\n+                myPet->SetByteValue(UNIT_FIELD_BYTES_2, 1, master->GetByteValue(UNIT_FIELD_BYTES_2, 1));\n+                myPet->SetUInt32Value(UNIT_CREATED_BY_SPELL, FORCE_OF_NATURE_1);\n+                //botPet = myPet;\n+\n+                myPet->Attack(target, true);\n+                if (!HasBotCommandState(BOT_COMMAND_MASK_UNCHASE))\n+                    myPet->GetMotionMaster()->MoveChase(target);\n+            }\n+        }\n+\n+        void JustSummoned(Creature* summon) override\n+        {\n+            if (summon->GetEntry() == BOT_PET_FORCE_OF_NATURE)\n+            {\n+                bool found = false;\n+                for (auto i : NPCBots::index_array<uint8, MAX_TREANTS>)\n+                {\n+                    if (!_treants[i])\n+                    {\n+                        _treants[i] = summon->GetGUID();\n+                        found = true;\n+                        break;\n+                    }\n+                }\n+                if (!found)\n+                {\n+                    BOT_LOG_ERROR(\"entities.unit\", \"Druid_bot:JustSummoned() treants array is full\");\n+                    ASSERT(false);\n+                }\n+            }\n+        }\n+\n+        void SummonedCreatureDespawn(Creature* summon) override\n+        {\n+            //BOT_LOG_ERROR(\"entities.unit\", \"SummonedCreatureDespawn: {}'s {}\", me->GetName(), summon->GetName());\n+            //if (summon == botPet)\n+            //    botPet = nullptr;\n+            if (summon->GetEntry() == BOT_PET_FORCE_OF_NATURE)\n+            {\n+                //bool found = false;\n+                for (auto i : NPCBots::index_array<uint8, MAX_TREANTS>)\n+                {\n+                    if (_treants[i] == summon->GetGUID())\n+                    {\n+                        _treants[i] = ObjectGuid::Empty;\n+                        //found = true;\n+                        break;\n+                    }\n+                }\n+                //if (!found)\n+                //{\n+                //    BOT_LOG_ERROR(\"entities.unit\", \"Druid_bot:SummonedCreatureDespawn() treant is not found in array\");\n+                //    ASSERT(false);\n+                //}\n+            }\n+        }\n+\n+        void UnsummonTreants()\n+        {\n+            for (auto i : NPCBots::index_array<uint8, MAX_TREANTS>)\n+            {\n+                if (!_treants[i].IsEmpty())\n+                {\n+                    if (Unit* tr = ObjectAccessor::GetUnit(*me, _treants[i]))\n+                        tr->ToTempSummon()->UnSummon();\n+                    else\n+                        _treants[i] = ObjectGuid::Empty;\n+                }\n+            }\n+        }\n+\n+        void UnsummonAll(bool /*savePets*/ = true) override\n+        {\n+            for (auto i : NPCBots::index_array<uint8, MAX_TREANTS>)\n+            {\n+                if (!_treants[i].IsEmpty())\n+                    if (Unit* tr = ObjectAccessor::GetUnit(*me, _treants[i]))\n+                        tr->ToTempSummon()->UnSummon();\n+            }\n+        }\n+\n+        uint32 GetAIMiscValue(uint32 data) const override\n+        {\n+            switch (data)\n+            {\n+                case BOTAI_MISC_COMBO_POINTS:\n+                    return comboPoints;\n+                case BOTAI_MISC_PET_TYPE:\n+                    return BOT_PET_FORCE_OF_NATURE;\n+                default:\n+                    return 0;\n+            }\n+        }\n+\n+        void Reset() override\n+        {\n+            UnsummonAll(false);\n+            for (auto i : NPCBots::index_array<uint8, MAX_TREANTS>)\n+                _treants[i] = ObjectGuid::Empty;\n+\n+            //_form = BOT_STANCE_NONE;\n+            rage = 0;\n+            removeShapeshiftForm();\n+\n+            energy = 0;\n+            comboPoints = 0;\n+            primalFuryProc = false;\n+\n+            hibery = false;\n+            hiberyCheckTimer = 0;\n+\n+            me->SetMaxPower(POWER_ENERGY, 100); //for regeneration\n+            rageLossMult = sWorld->getRate(RATE_POWER_RAGE_LOSS);\n+\n+            ragetimer = 0;\n+\n+            DefaultInit();\n+        }\n+\n+        void ReduceCD(uint32 diff) override\n+        {\n+            if (ragetimer > diff)                   ragetimer -= diff;\n+\n+            if (hiberyCheckTimer > diff)            hiberyCheckTimer -= diff;\n+        }\n+\n+        void InitPowers() override\n+        {\n+            switch (me->GetShapeshiftForm())\n+            {\n+                case FORM_BEAR:\n+                case FORM_DIREBEAR:\n+                    me->SetPowerType(POWER_RAGE);\n+                    break;\n+                case FORM_CAT:\n+                    me->SetPowerType(POWER_ENERGY);\n+                    break;\n+                default:\n+                    me->SetPowerType(POWER_MANA);\n+                    break;\n+            }\n+        }\n+\n+        void InitSpells() override\n+        {\n+            uint8 lvl = me->GetLevel();\n+            bool isBala = GetSpec() == BOT_SPEC_DRUID_BALANCE;\n+            bool isFera = GetSpec() == BOT_SPEC_DRUID_FERAL;\n+            bool isRest = GetSpec() == BOT_SPEC_DRUID_RESTORATION;\n+\n+            InitSpellMap(MARK_OF_THE_WILD_1);\n+            InitSpellMap(THORNS_1);\n+            InitSpellMap(HEALING_TOUCH_1);\n+            InitSpellMap(REGROWTH_1);\n+            InitSpellMap(REJUVENATION_1);\n+            InitSpellMap(LIFEBLOOM_1);\n+            InitSpellMap(NOURISH_1);\n+            InitSpellMap(TRANQUILITY_1);\n+            InitSpellMap(REVIVE_1);\n+            InitSpellMap(REBIRTH_1);\n+            InitSpellMap(BEAR_FORM_1);\n+            InitSpellMap(SWIPE_BEAR_1);\n+            InitSpellMap(BASH_1);\n+            InitSpellMap(MAUL_1);\n+            InitSpellMap(CHALLENGING_ROAR_1);\n+            InitSpellMap(ENRAGE_1);\n+            InitSpellMap(FRENZIED_REGENERATION_1);\n+            InitSpellMap(GROWL_1);\n+            InitSpellMap(LACERATE_1);\n+            InitSpellMap(SURVIVAL_INSTINCTS_1);\n+            InitSpellMap(FAERIE_FIRE_FERAL_1);\n+            InitSpellMap(CAT_FORM_1);\n+            InitSpellMap(CLAW_1);\n+            InitSpellMap(RAKE_1);\n+            InitSpellMap(SHRED_1);\n+            InitSpellMap(POUNCE_1);\n+            InitSpellMap(RAVAGE_1);\n+            InitSpellMap(RIP_1);\n+            InitSpellMap(FEROCIOUS_BITE_1);\n+            InitSpellMap(MAIM_1);\n+            InitSpellMap(SWIPE_CAT_1);\n+            InitSpellMap(SAVAGE_ROAR_1);\n+            InitSpellMap(TIGERS_FURY_1);\n+            InitSpellMap(COWER_1);\n+            InitSpellMap(DASH_1);\n+  /*custom*/lvl >= 22 ? InitSpellMap(PROWL_1) : RemoveSpell(PROWL_1); //base lvl 20\n+            InitSpellMap(MOONFIRE_1);\n+            InitSpellMap(STARFIRE_1);\n+            InitSpellMap(WRATH_1);\n+            InitSpellMap(HURRICANE_1);\n+            InitSpellMap(FAERIE_FIRE_NORMAL_1);\n+            InitSpellMap(TRAVEL_FORM_1);\n+            InitSpellMap(AQUATIC_FORM_1);\n+            InitSpellMap(FLIGHT_FORM_1);\n+            InitSpellMap(CURE_POISON_1);\n+            InitSpellMap(ABOLISH_POISON_1);\n+            InitSpellMap(REMOVE_CURSE_1);\n+            InitSpellMap(ENTANGLING_ROOTS_1);\n+            InitSpellMap(CYCLONE_1);\n+            InitSpellMap(HIBERNATE_1);\n+            InitSpellMap(BARKSKIN_1);\n+            InitSpellMap(NATURES_GRASP_1);\n+            InitSpellMap(INNERVATE_1);\n+\n+     /*tal*/lvl >= 30 && isBala ? InitSpellMap(INSECT_SWARM_1) : RemoveSpell(INSECT_SWARM_1);\n+     /*tal*/lvl >= 40 && isBala ? InitSpellMap(MOONKIN_FORM_1) : RemoveSpell(MOONKIN_FORM_1);\n+     /*tal*/lvl >= 50 && isBala ? InitSpellMap(TYPHOON_1) : RemoveSpell(TYPHOON_1);\n+     /*tal*/lvl >= 50 && isBala ? InitSpellMap(FORCE_OF_NATURE_1) : RemoveSpell(FORCE_OF_NATURE_1); //not casted\n+     /*tal*/lvl >= 60 && isBala ? InitSpellMap(STARFALL_1) : RemoveSpell(STARFALL_1);\n+\n+     /*tal*/lvl >= 30 && isFera ? InitSpellMap(FERAL_CHARGE_BEAR_1) : RemoveSpell(FERAL_CHARGE_BEAR_1);\n+     /*tal*/lvl >= 30 && isFera ? InitSpellMap(FERAL_CHARGE_CAT_1) : RemoveSpell(FERAL_CHARGE_CAT_1);\n+     /*tal*/lvl >= 50 && isFera ? InitSpellMap(MANGLE_BEAR_1) : RemoveSpell(MANGLE_BEAR_1);\n+     /*tal*/lvl >= 50 && isFera ? InitSpellMap(MANGLE_CAT_1) : RemoveSpell(MANGLE_CAT_1);\n+     /*tal*/lvl >= 60 && isFera ? InitSpellMap(BERSERK_1) : RemoveSpell(BERSERK_1);\n+\n+     /*tal*/lvl >= 30 && isRest ? InitSpellMap(NATURES_SWIFTNESS_1) : RemoveSpell(NATURES_SWIFTNESS_1);\n+     /*tal*/lvl >= 40 && isRest ? InitSpellMap(SWIFTMEND_1) : RemoveSpell(SWIFTMEND_1);\n+     /*tal*/lvl >= 50 && isRest ? InitSpellMap(TREE_OF_LIFE_FORM_1) : RemoveSpell(TREE_OF_LIFE_FORM_1);\n+     /*tal*/lvl >= 60 && isRest ? InitSpellMap(WILD_GROWTH_1) : RemoveSpell(WILD_GROWTH_1);\n+        }\n+\n+        void ApplyClassPassives() const override\n+        {\n+            uint8 level = master->GetLevel();\n+            bool isBala = GetSpec() == BOT_SPEC_DRUID_BALANCE;\n+            bool isFera = GetSpec() == BOT_SPEC_DRUID_FERAL;\n+            bool isRest = GetSpec() == BOT_SPEC_DRUID_RESTORATION;\n+\n+            RefreshAura(NATURESGRACE, level >= 20 ? 1 : 0);\n+            RefreshAura(DREAMSTATE, isBala && level >= 35 ? 1 : 0);\n+            RefreshAura(BALANCE_OF_POWER, isBala && level >= 35 ? 1 : 0);\n+            RefreshAura(IMPROVED_MOONKIN_FORM, !IAmFree() && isBala && level >= 40 ? 1 : 0);\n+            RefreshAura(ECLIPSE, isBala && level >= 50 ? 1 : 0);\n+            RefreshAura(EARTH_AND_MOON, isBala && level >= 55 ? 1 : 0);\n+\n+            RefreshAura(PRIMAL_PRECISION, isFera && level >= 25 ? 1 : 0);\n+            RefreshAura(SURVIVAL_OF_THE_FITTEST, isFera && level >= 35 ? 1 : 0);\n+            RefreshAura(IMPROVED_LEADER_OF_THE_PACK, isFera && level >= 40 ? 1 : 0);\n+            RefreshAura(PRIMAL_TENACITY, isFera && level >= 40 ? 1 : 0);\n+            RefreshAura(KING_OF_THE_JUNGLE, isFera && level >= 50 ? 1 : 0);\n+            RefreshAura(PRIMAL_GORE, isFera && level >= 55 ? 1 : 0);\n+\n+            RefreshAura(IMPROVED_MARK_OF_THE_WILD, level >= 10 ? 1 : 0);\n+            RefreshAura(FUROR, level >= 10 ? 1 : 0);\n+            RefreshAura(NATURALIST, level >= 15 ? 1 : 0);\n+            RefreshAura(INTENSITY, level >= 20 ? 1 : 0);\n+            RefreshAura(OMEN_OF_CLARITY, level >= 20 ? 1 : 0);\n+            RefreshAura(NATURAL_PERFECTION3, isRest && level >= 45 ? 1 : 0);\n+            RefreshAura(NATURAL_PERFECTION2, isRest && level >= 43 && level < 45 ? 1 : 0);\n+            RefreshAura(NATURAL_PERFECTION1, isRest && level >= 41 && level < 43 ? 1 : 0);\n+            RefreshAura(LIVING_SEED3, isRest && level >= 50 ? 1 : 0);\n+            RefreshAura(LIVING_SEED2, isRest && level >= 48 && level < 50 ? 1 : 0);\n+            RefreshAura(LIVING_SEED1, isRest && level >= 46 && level < 48 ? 1 : 0);\n+            RefreshAura(REVITALIZE3, isRest && level >= 55 ? 1 : 0);\n+            RefreshAura(REVITALIZE2, isRest && level >= 53 && level < 55 ? 1 : 0);\n+            RefreshAura(REVITALIZE1, isRest && level >= 51 && level < 53 ? 1 : 0);\n+            RefreshAura(GIFT_OF_THE_EARTHMOTHER, isRest && level >= 55 ? 1 : 0);\n+\n+            RefreshAura(GLYPH_NOURISH, level >= 80 ? 1 : 0);\n+            RefreshAura(GLYPH_SWIFTMEND, level >= 45 ? 1 : 0);\n+            RefreshAura(GLYPH_INNERVATE, level >= 40 ? 1 : 0);\n+            RefreshAura(GLYPH_RAPID_REJUVENATION, level >= 15 ? 1 : 0);\n+            RefreshAura(GLYPH_REGROWTH, level >= 15 ? 1 : 0);\n+            RefreshAura(GLYPH_REJUVENATION, level >= 15 ? 1 : 0);\n+            RefreshAura(GLYPH_FRENZIED_REGENERATION, level >= 36 ? 1 : 0);\n+            RefreshAura(GLYPH_BARKSKIN, level >= 44 ? 1 : 0);\n+            RefreshAura(GLYPH_RAKE, level >= 24 ? 1 : 0);\n+            RefreshAura(GLYPH_SHRED, level >= 22 ? 1 : 0);\n+            RefreshAura(T10_RESTO_P4_BONUS, level >= 80 ? 1 : 0);\n+            RefreshAura(T9_RESTO_P4_BONUS, level >= 80 ? 1 : 0);\n+            RefreshAura(T8_RESTO_P4_BONUS, level >= 78 ? 1 : 0);\n+            RefreshAura(T9_BALANCE_P2_BONUS, level >= 78 ? 1 : 0);\n+            RefreshAura(T10_BALANCE_P2_BONUS, level >= 78 ? 1 : 0);\n+            RefreshAura(T10_BALANCE_P4_BONUS, level >= 78 ? 1 : 0);\n+            RefreshAura(T8_FERAL_P2_BONUS, level >= 78 ? 1 : 0);\n+            RefreshAura(T10_FERAL_P4_BONUS, level >= 80 ? 1 : 0);\n+        }\n+\n+        bool CanUseManually(uint32 basespell) const override\n+        {\n+            switch (basespell)\n+            {\n+                case MARK_OF_THE_WILD_1:\n+                case THORNS_1:\n+                case HEALING_TOUCH_1:\n+                case REJUVENATION_1:\n+                case LIFEBLOOM_1:\n+                case REGROWTH_1:\n+                case NOURISH_1:\n+                case WILD_GROWTH_1:\n+                case SWIFTMEND_1:\n+                case TRANQUILITY_1:\n+                case HURRICANE_1:\n+                case INNERVATE_1:\n+                case ABOLISH_POISON_1:\n+                case NATURES_GRASP_1:\n+                case BARKSKIN_1:\n+                case BEAR_FORM_1:\n+                case CAT_FORM_1:\n+                case TRAVEL_FORM_1:\n+                    return true;\n+                case AQUATIC_FORM_1:\n+                    return me->HasUnitMovementFlag(MOVEMENTFLAG_SWIMMING) && me->IsUnderWater();\n+                case FLIGHT_FORM_1:\n+                    return master->IsMounted() && !me->HasUnitMovementFlag(MOVEMENTFLAG_SWIMMING) && !me->IsUnderWater();\n+                case TYPHOON_1:\n+                case STARFALL_1:\n+                case MOONKIN_FORM_1:\n+                    return (GetBotRoles() & BOT_ROLE_MASK_MAIN) == (BOT_ROLE_DPS|BOT_ROLE_RANGED);\n+                case TREE_OF_LIFE_FORM_1:\n+                    return ((GetBotRoles() & BOT_ROLE_MASK_MAIN) & ~BOT_ROLE_RANGED) == BOT_ROLE_HEAL;\n+                case SURVIVAL_INSTINCTS_1:\n+                case FRENZIED_REGENERATION_1:\n+                case ENRAGE_1:\n+                case CHALLENGING_ROAR_1:\n+                    return _form == DRUID_BEAR_FORM;\n+                case TIGERS_FURY_1:\n+                case DASH_1:\n+                case PROWL_1:\n+                    return _form == DRUID_CAT_FORM;\n+                case BERSERK_1:\n+                    return (_form == DRUID_BEAR_FORM || _form == DRUID_CAT_FORM) &&\n+                        (((GetBotRoles() & BOT_ROLE_MASK_MAIN) & BOT_ROLE_TANK) || (GetBotRoles() & BOT_ROLE_MASK_MAIN) == BOT_ROLE_DPS);\n+                default:\n+                    return false;\n+            }\n+        }\n+\n+        std::vector<uint32> const* GetDamagingSpellsList() const override\n+        {\n+            return &Druid_spells_damage;\n+        }\n+        std::vector<uint32> const* GetCCSpellsList() const override\n+        {\n+            return &Druid_spells_cc;\n+        }\n+        std::vector<uint32> const* GetHealingSpellsList() const override\n+        {\n+            return &Druid_spells_heal;\n+        }\n+        std::vector<uint32> const* GetSupportSpellsList() const override\n+        {\n+            return &Druid_spells_support;\n+        }\n+\n+        void InitHeals() override\n+        {\n+            SpellInfo const* spellInfo;\n+            if (InitSpell(me, NOURISH_1))\n+            {\n+                spellInfo = sSpellMgr->GetSpellInfo(InitSpell(me, NOURISH_1));\n+                _heals[NOURISH_1] = me->SpellHealingBonusDone(me, spellInfo, spellInfo->_effects[0].CalcValue(me), HEAL, spellInfo->GetEffect(EFFECT_0), {});\n+            }\n+            else\n+                _heals[NOURISH_1] = 0;\n+\n+            if (InitSpell(me, REGROWTH_1))\n+            {\n+                spellInfo = sSpellMgr->GetSpellInfo(InitSpell(me, REGROWTH_1));\n+                _heals[REGROWTH_1] = me->SpellHealingBonusDone(me, spellInfo, spellInfo->_effects[0].CalcValue(me), HEAL, spellInfo->GetEffect(EFFECT_0), {});\n+            }\n+            else\n+                _heals[REGROWTH_1] = 0;\n+\n+            if (InitSpell(me, HEALING_TOUCH_1))\n+            {\n+                spellInfo = sSpellMgr->GetSpellInfo(InitSpell(me, HEALING_TOUCH_1));\n+                _heals[HEALING_TOUCH_1] = me->SpellHealingBonusDone(me, spellInfo, spellInfo->_effects[0].CalcValue(me), HEAL, spellInfo->GetEffect(EFFECT_0), {});\n+            }\n+            else\n+                _heals[HEALING_TOUCH_1] = 0;\n+\n+            if (InitSpell(me, REJUVENATION_1))\n+            {\n+                spellInfo = sSpellMgr->GetSpellInfo(InitSpell(me, REJUVENATION_1));\n+                _heals[REJUVENATION_1] = me->SpellHealingBonusDone(me, spellInfo, spellInfo->_effects[0].CalcValue(me), DOT, spellInfo->GetEffect(EFFECT_0), {});\n+            }\n+            else\n+                _heals[REJUVENATION_1] = 0;\n+        }\n+\n+    private:\n+        bool _isValidInnervateTarget(Unit const* unit) const\n+        {\n+            if (!unit || unit->GetPowerType() != POWER_MANA || !unit->IsInCombat() || !unit->IsInMap(me) || me->GetExactDist(unit) > 30.f ||\n+                unit->GetAuraEffect(SPELL_AURA_PERIODIC_ENERGIZE, SPELLFAMILY_DRUID, 0x0, 0x1000, 0x0))\n+                return false;\n+\n+            if (unit->IsNPCBot())\n+            {\n+                switch (unit->ToCreature()->GetBotClass())\n+                {\n+                    case BOT_CLASS_HUNTER: case BOT_CLASS_WARLOCK: case BOT_CLASS_SPHYNX: case BOT_CLASS_SPELLBREAKER: case BOT_CLASS_NECROMANCER:\n+                        return false;\n+                    default:\n+                        break;\n+                }\n+            }\n+\n+            uint8 mpct = (unit->GetMaxPower(POWER_MANA) - unit->GetPower(POWER_MANA) > me->GetCreateMana() * 2) ? 15 : 3;\n+            if (GetManaPCT(unit) >= mpct)\n+                return false;\n+\n+            return true;\n+        }\n+        static uint32 _baseSpellForShapeshift(BotStances form)\n+        {\n+            switch (form)\n+            {\n+                case DRUID_BEAR_FORM:\n+                    return BEAR_FORM_1;\n+                case DRUID_CAT_FORM:\n+                    return CAT_FORM_1;\n+                case DRUID_MOONKIN_FORM:\n+                    return MOONKIN_FORM_1;\n+                case DRUID_TREE_FORM:\n+                    return TREE_OF_LIFE_FORM_1;\n+                case DRUID_TRAVEL_FORM:\n+                    return TRAVEL_FORM_1;\n+                case DRUID_AQUATIC_FORM:\n+                    return AQUATIC_FORM_1;\n+                case DRUID_FLIGHT_FORM:\n+                    return FLIGHT_FORM_1;\n+                default:\n+                    return 0;\n+            }\n+        }\n+        BotStances _selectShapeshift() const\n+        {\n+            BotStances form = BOT_STANCE_NONE;\n+            if (bot_ai::IsMelee())\n+            {\n+                bool has_cat_form_spell = !!GetSpell(_baseSpellForShapeshift(DRUID_CAT_FORM));\n+                bool has_bear_form_spell = !!GetSpell(_baseSpellForShapeshift(DRUID_BEAR_FORM));\n+                if ((IsTank() || (IsWanderer() && !has_cat_form_spell)) && has_bear_form_spell)\n+                    form = DRUID_BEAR_FORM;\n+                else if (HasRole(BOT_ROLE_DPS))\n+                    form = has_cat_form_spell ? DRUID_CAT_FORM : has_bear_form_spell ? DRUID_BEAR_FORM : BOT_STANCE_NONE;\n+            }\n+            if (form == BOT_STANCE_NONE && HasRole(BOT_ROLE_DPS))\n+                form = (!HasRole(BOT_ROLE_HEAL) && !!GetSpell(_baseSpellForShapeshift(DRUID_MOONKIN_FORM))) ? DRUID_MOONKIN_FORM : BOT_STANCE_NONE;\n+            if (form == BOT_STANCE_NONE && HasRole(BOT_ROLE_HEAL))\n+                form = (!HasRole(BOT_ROLE_DPS) && !!GetSpell(_baseSpellForShapeshift(DRUID_TREE_FORM))) ? DRUID_TREE_FORM : BOT_STANCE_NONE;\n+            return form;\n+        }\n+\n+        //Treants\n+        std::array<ObjectGuid, MAX_TREANTS> _treants;\n+        //Timers/other\n+/*Form*/BotStances _form;\n+/*Misc*/mutable bool primalFuryProc;\n+/*Misc*/uint8 comboPoints;\n+/*Misc*/uint32 ragetimer;\n+        bool hibery;\n+        uint32 hiberyCheckTimer;\n+/*Misc*/int32 rage, energy;\n+\n+        using HealMap = std::unordered_map<uint32 /*baseId*/, int32 /*amount*/>;\n+        HealMap _heals;\n+    };\n+};\n+\n+void AddSC_druid_bot()\n+{\n+    new druid_bot();\n+}\ndiff --git a/src/server/game/AI/NpcBots/bot_hunter_ai.cpp b/src/server/game/AI/NpcBots/bot_hunter_ai.cpp\nnew file mode 100644\nindex 0000000000..0614de4f63\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bot_hunter_ai.cpp\n@@ -0,0 +1,2239 @@\n+#include \"bot_ai.h\"\n+#include \"botmgr.h\"\n+#include \"botspell.h\"\n+#include \"bottext.h\"\n+#include \"bottraits.h\"\n+#include \"Containers.h\"\n+#include \"GridNotifiersImpl.h\"\n+#include \"Group.h\"\n+#include \"Map.h\"\n+#include \"MotionMaster.h\"\n+#include \"ObjectAccessor.h\"\n+#include \"ObjectMgr.h\"\n+#include \"Player.h\"\n+#include \"ScriptMgr.h\"\n+#include \"Spell.h\"\n+#include \"SpellAuraEffects.h\"\n+#include \"SpellMgr.h\"\n+#include \"TemporarySummon.h\"\n+#include \"World.h\"\n+/*\n+Hunter NpcBot (reworked by Trickerer onlysuffering@gmail.com)\n+Complete - around 95%\n+TODO: Master's Call\n+*/\n+\n+enum HunterBaseSpells\n+{\n+    AUTO_SHOT_1                         = 75,\n+    ARCANE_SHOT_1                       = 3044,\n+    TRANQ_SHOT_1                        = 19801,\n+    BLACK_ARROW_1                       = 3674,\n+    SILENCING_SHOT_1                    = 34490,\n+    CHIMERA_SHOT_1                      = 53209,\n+    AIMED_SHOT_1                        = 19434,\n+    STEADY_SHOT_1                       = 56641,\n+    EXPLOSIVE_SHOT_1                    = 53301,\n+    KILL_SHOT_1                         = 53351,\n+    MULTISHOT_1                         = 2643,\n+    VOLLEY_1                            = 1510,\n+    SCATTER_SHOT_1                      = 19503,\n+    CONCUSSIVE_SHOT_1                   = 5116,\n+    DISTRACTING_SHOT_1                  = 20736,\n+    SERPENT_STING_1                     = 1978,\n+    SCORPID_STING_1                     = 3043,\n+    VIPER_STING_1                       = 3034,\n+    RAPID_FIRE_1                        = 3045,\n+    FLARE_1                             = 1543,\n+    TRUESHOT_AURA_1                     = 19506,\n+    WYVERN_STING_1                      = 19386,\n+    WING_CLIP_1                         = 2974,\n+    RAPTOR_STRIKE_1                     = 2973,\n+    MONGOOSE_BITE_1                     = 1495,\n+    COUNTERATTACK_1                     = 19306,\n+    DISENGAGE_1                         = 781,\n+    IMMOLATION_TRAP_1                   = 13795,\n+    FREEZING_TRAP_1                     = 1499,\n+    FROST_TRAP_1                        = 13809,\n+    EXPLOSIVE_TRAP_1                    = 13813,\n+    FREEZING_ARROW_1                    = 60192,\n+    SNAKE_TRAP_1                        = 34600,//NIY\n+    HUNTERS_MARK_1                      = 1130,\n+    SCARE_BEAST_1                       = 1513,\n+    FEIGN_DEATH_1                       = 5384,\n+    READINESS_1                         = 23989,\n+    DETERRENCE_1                        = 19263,\n+    MISDIRECTION_1                      = 34477,\n+    MEND_PET_1                          = 136,\n+\n+    ASPECT_OF_THE_MONKEY_1              = 13163,\n+    ASPECT_OF_THE_HAWK_1                = 13165,\n+    ASPECT_OF_THE_CHEETAH_1             = 5118,\n+    ASPECT_OF_THE_VIPER_1               = 34074,\n+    ASPECT_OF_THE_BEAST_1               = 13161,//NIY\n+    ASPECT_OF_THE_PACK_1                = 13159,\n+    ASPECT_OF_THE_WILD_1                = 20043,\n+    ASPECT_OF_THE_DRAGONHAWK_1          = 61846\n+};\n+\n+enum HunterPassives\n+{\n+//Talents\n+    SUREFOOTED                          = 24283,//rank 3\n+    ENTRAPMENT                          = 19388,//rank 3\n+    RAPID_KILLING                       = 34949,//rank 2\n+    IMPROVED_MEND_PET                   = 19573,//rank 2\n+    LOCK_AND_LOAD                       = 56344,//rank 3\n+    CONCUSSIVE_BARRAGE                  = 35102,//rank 2\n+    PIERCING_SHOTS                      = 53238,//rank 3\n+    EXPOSE_WEAKNESS                     = 34503,//rank 3\n+    THRILL_OF_THE_HUNT                  = 34499,//rank 3\n+    MASTER_MARKSMAN                     = 34489,//rank 5\n+    MASTER_TACTICIAN1                   = 34506,\n+    MASTER_TACTICIAN2                   = 34507,\n+    MASTER_TACTICIAN3                   = 34508,\n+    MASTER_TACTICIAN4                   = 34838,\n+    MASTER_TACTICIAN5                   = 34839,\n+    NOXIOUS_STINGS                      = 53297,//rank 3\n+    WILD_QUIVER                         = 53217,//rank 3\n+    SNIPER_TRAINING                     = 53304,//rank 3\n+\n+    GLYPH_RAPTOR_STRIKE                 = 63086,\n+    GLYPH_ASPECT_OF_THE_VIPER           = 56851,\n+    GLYPH_FREEZING_TRAP                 = 56845,\n+    GLYPH_EXPLOSIVE_TRAP                = 63068,\n+\n+    HUNTER_T8_P2                        = 67150,//serpent sting crits\n+    HUNTER_T10_P2                       = 70727,//autoshot 15% dmg proc\n+    HUNTER_T10_P4                       = 70730 //sting 20% ap proc\n+};\n+\n+enum HunterSpecial\n+{\n+    SPECIFIC_ASPECT_MONKEY              = 0x001,\n+    SPECIFIC_ASPECT_HAWK                = 0x002,\n+    SPECIFIC_ASPECT_CHEETAH             = 0x004,\n+    SPECIFIC_ASPECT_VIPER               = 0x008,\n+    SPECIFIC_ASPECT_BEAST               = 0x010,\n+    SPECIFIC_ASPECT_PACK                = 0x020,\n+    SPECIFIC_ASPECT_WILD                = 0x040,\n+    SPECIFIC_ASPECT_DRAGONHAWK          = 0x080,\n+    SPECIFIC_ASPECT_MY_ASPECT           = 0x100,\n+    //SPECIFIC_ASPECT_ALL_AREA_AUTOUSE    = (SPECIFIC_ASPECT_PACK),\n+\n+    IMPROVED_CONCUSSION                 = 28445,\n+    IMPROVED_WING_CLIP_NORMAL           = 47168,\n+    IMPROVED_WING_CLIP_EX               = 35963,\n+\n+    VOLLEY_DAMAGE_1                     = 42243,//rank 1\n+    //EXPLOSIVE_TRAP_DAMAGE_1             = 13812,//same as EXPLOSIVE_TRAP_AURA_1\n+\n+    QUICK_SHOTS_BUFF                    = 6150,\n+    RAPID_KILLING_BUFF                  = 35099,//rank 2\n+    LOCK_AND_LOAD_BUFF                  = 56453,//rank 3\n+    SNIPER_TRAINING_BUFF                = 64420,//rank 3\n+    RAPID_RECUPERATION_BUFF             = 54227,//rank 2, rapid fire, hidden\n+    RAPID_RECUPERATION_BUFF2            = 58882,//rapid killing, 6 sec\n+    IMPROVED_STEADY_SHOT_BUFF           = 53220,\n+\n+    FROST_TRAP_AURA                     = 13810,\n+    FREEZING_TRAP_AURA_1                = 3355,\n+    IMMOLATION_TRAP_AURA_1              = 13797,\n+    EXPLOSIVE_TRAP_AURA_1               = 13812,//same as EXPLOSIVE_TRAP_DAMAGE_1\n+    WYVERN_STING_DOT_AURA_1             = 24131,\n+    FREEZING_ARROW_AURA                 = 60210,\n+    EXPLOSIVE_SHOT_PERIODIC_DUMMY_AURA  = 53352,\n+\n+    ASPECT_OF_THE_DRAGONHAWK_MONKEY     = 61848, //linked, hidden\n+\n+    GLYPH_OF_ARCANE_SHOT_ENERGIZE       = 61389,\n+    RAPID_RECUPERATION_ENERGIZE         = 58883,//rapid killing\n+    RAPID_RECUPERATION_ENERGIZE_PCT_1   = 64180,//rank 1, 2%\n+\n+    GIFT_OF_NAARU_HUNTER                = 59543,\n+\n+    SPIRIT_BOND_PET                     = 24529,\n+    KINDRED_SPIRITS_PET                 = 57475,\n+    //INTIMIDATION_1                      = 24394,\n+    BESTIAL_WRATH_1                     = 19574,\n+    //BEAST_WITHIN_1                      = 34471,\n+\n+    GO_FOR_THE_THROAT_ENERGIZE          = 34953,\n+    FRENZY_BUFF                         = 19615\n+};\n+//talent tiers 20-32-44-56-68-80\n+\n+static const std::vector<uint32> Hunter_spells_damage\n+{ AIMED_SHOT_1, ARCANE_SHOT_1, BLACK_ARROW_1, COUNTERATTACK_1, CHIMERA_SHOT_1, EXPLOSIVE_SHOT_1, EXPLOSIVE_TRAP_1,\n+IMMOLATION_TRAP_1, KILL_SHOT_1, MONGOOSE_BITE_1, MULTISHOT_1, RAPTOR_STRIKE_1, SCATTER_SHOT_1, SERPENT_STING_1,\n+STEADY_SHOT_1, VOLLEY_1, WYVERN_STING_1 };\n+static const std::vector<uint32> Hunter_spells_cc\n+{ CONCUSSIVE_SHOT_1, FREEZING_ARROW_1, FREEZING_TRAP_1, FROST_TRAP_1, SCARE_BEAST_1, SCATTER_SHOT_1,\n+SILENCING_SHOT_1, WING_CLIP_1, WYVERN_STING_1 };\n+static const std::vector<uint32> Hunter_spells_support\n+{ /*ASPECT_OF_THE_BEAST_1, */ASPECT_OF_THE_MONKEY_1, ASPECT_OF_THE_HAWK_1, ASPECT_OF_THE_DRAGONHAWK_1,\n+ASPECT_OF_THE_CHEETAH_1, ASPECT_OF_THE_PACK_1, ASPECT_OF_THE_VIPER_1, ASPECT_OF_THE_WILD_1,\n+DETERRENCE_1, DISENGAGE_1, DISTRACTING_SHOT_1, FEIGN_DEATH_1, FLARE_1, HUNTERS_MARK_1, MEND_PET_1,\n+MISDIRECTION_1, RAPID_FIRE_1, READINESS_1, SCORPID_STING_1, /*SNAKE_TRAP_1, */TRANQ_SHOT_1, VIPER_STING_1 };\n+\n+class hunter_bot : public CreatureScript\n+{\n+public:\n+    hunter_bot() : CreatureScript(\"hunter_bot\") { }\n+\n+    CreatureAI* GetAI(Creature* creature) const override\n+    {\n+        return new hunter_botAI(creature);\n+    }\n+/*\n+    bool OnGossipHello(Player* player, Creature* creature)\n+    {\n+        return creature->GetBotAI()->OnGossipHello(player, 0);\n+    }\n+\n+    bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action)\n+    {\n+        if (bot_ai* ai = creature->GetBotAI())\n+            return ai->OnGossipSelect(player, creature, sender, action);\n+        return true;\n+    }\n+\n+    bool OnGossipSelectCode(Player* player, Creature* creature, uint32 sender, uint32 action, char const* code)\n+    {\n+        if (bot_ai* ai = creature->GetBotAI())\n+            return ai->OnGossipSelectCode(player, creature, sender, action, code);\n+        return true;\n+    }\n+*/\n+    struct hunter_botAI : public bot_ai\n+    {\n+        hunter_botAI(Creature* creature) : bot_ai(creature)\n+        {\n+            _botclass = BOT_CLASS_HUNTER;\n+\n+            myPetType = 0;\n+\n+            InitUnitFlags();\n+        }\n+\n+        bool doCast(Unit* victim, uint32 spellId)\n+        {\n+            if (CheckBotCast(victim, spellId) != SPELL_CAST_OK)\n+                return false;\n+\n+            return bot_ai::doCast(victim, spellId);\n+        }\n+\n+        void StartAttack(Unit* u, bool force = false)\n+        {\n+            if (!bot_ai::StartAttack(u, force))\n+                return;\n+            GetInPosition(force, u);\n+        }\n+\n+        void JustEnteredCombat(Unit* u) override { aspectTimer = 0; bot_ai::JustEnteredCombat(u); }\n+        void KilledUnit(Unit* u) override { bot_ai::KilledUnit(u); }\n+        void EnterEvadeMode(EvadeReason why = EVADE_REASON_OTHER) override { bot_ai::EnterEvadeMode(why); }\n+        void MoveInLineOfSight(Unit* u) override { bot_ai::MoveInLineOfSight(u); }\n+        void JustDied(Unit* u) override { _myaspect = 0; UnsummonAll(false); bot_ai::JustDied(u); }\n+        void DoNonCombatActions(uint32 /*diff*/) { }\n+\n+        void CheckAspects(uint32 diff)\n+        {\n+            if (aspectTimer > diff || me->IsMounted() || Feasting() || IsCasting() || Rand() > 55)\n+                return;\n+\n+            aspectTimer = urand(5000, 10000);\n+\n+            if (_myaspect == ASPECT_OF_THE_VIPER_1 && GetManaPCT(me) < 50)\n+                return;\n+\n+            uint32 ASPECT_OF_THE_MONKEY = GetSpell(ASPECT_OF_THE_MONKEY_1);\n+            uint32 ASPECT_OF_THE_HAWK = GetSpell(ASPECT_OF_THE_HAWK_1);\n+            uint32 ASPECT_OF_THE_CHEETAH = GetSpell(ASPECT_OF_THE_CHEETAH_1);\n+            uint32 ASPECT_OF_THE_VIPER = GetSpell(ASPECT_OF_THE_VIPER_1);\n+            //uint32 ASPECT_OF_THE_BEAST = GetSpell(ASPECT_OF_THE_BEAST_1);\n+            uint32 ASPECT_OF_THE_PACK = GetSpell(ASPECT_OF_THE_PACK_1);\n+            uint32 ASPECT_OF_THE_WILD = GetSpell(ASPECT_OF_THE_WILD_1);\n+            uint32 ASPECT_OF_THE_DRAGONHAWK = GetSpell(ASPECT_OF_THE_DRAGONHAWK_1);\n+\n+            std::map<uint32 /*baseid*/, uint32 /*curid*/> idMap;\n+            uint32 mask = _getAspectsMask(idMap);\n+\n+            if (_myaspect == ASPECT_OF_THE_WILD_1) //manual\n+            {\n+                if (idMap[ASPECT_OF_THE_WILD_1] != ASPECT_OF_THE_WILD)\n+                    if (doCast(me, ASPECT_OF_THE_WILD))\n+                        return;\n+                return;\n+            }\n+\n+            if (GetManaPCT(me) < 20)\n+            {\n+                if (ASPECT_OF_THE_VIPER)\n+                {\n+                    if (doCast(me, ASPECT_OF_THE_VIPER))\n+                        return;\n+                }\n+                return;\n+            }\n+            else if (_myaspect == ASPECT_OF_THE_VIPER_1 && GetManaPCT(me) > 50)\n+            {\n+                me->RemoveAurasDueToSpell(ASPECT_OF_THE_VIPER_1, me->GetGUID());\n+                _myaspect = 0;\n+            }\n+\n+            if (IAmFree())\n+            {\n+                InstanceTemplate const* instt = sObjectMgr->GetInstanceTemplate(me->GetMap()->GetId());\n+                bool map_allows_mount = (!me->GetMap()->IsDungeon() || me->GetMap()->IsBattlegroundOrArena()) && (!instt || instt->AllowMount);\n+                if (me->HasUnitMovementFlag(MOVEMENTFLAG_FORWARD) &&\n+                    (!me->GetVictim() ?\n+                        (me->IsInCombat() || !map_allows_mount || !IsOutdoors() || IsFlagCarrier(me)) :\n+                        !me->IsWithinDist(me->GetVictim(), 8.0f + GetSpellAttackRange(true))))\n+                {\n+                    if (ASPECT_OF_THE_CHEETAH && !(mask & (SPECIFIC_ASPECT_CHEETAH | SPECIFIC_ASPECT_PACK)) && _myaspect != ASPECT_OF_THE_CHEETAH_1)\n+                    {\n+                        if (doCast(me, ASPECT_OF_THE_CHEETAH))\n+                            return;\n+                    }\n+\n+                    return;\n+                }\n+                else if (_myaspect == ASPECT_OF_THE_CHEETAH_1)\n+                {\n+                    me->RemoveAurasDueToSpell(ASPECT_OF_THE_CHEETAH_1, me->GetGUID());\n+                    _myaspect = 0;\n+                }\n+            }\n+            else\n+            {\n+                //choose movement aspect first\n+                if (!master->GetBotMgr()->IsPartyInCombat(false))\n+                {\n+                    if (!(mask & SPECIFIC_ASPECT_PACK))\n+                    {\n+                        uint32 movFlags;\n+                        if (ASPECT_OF_THE_PACK)\n+                        {\n+                            movFlags = master->m_movementInfo.GetMovementFlags();\n+                            if ((movFlags & MOVEMENTFLAG_FORWARD) && !(movFlags & (MOVEMENTFLAG_FALLING_FAR)))\n+                            {\n+                                if (doCast(me, ASPECT_OF_THE_PACK))\n+                                    return;\n+                            }\n+                        }\n+                        if (ASPECT_OF_THE_CHEETAH && _myaspect != ASPECT_OF_THE_CHEETAH_1)\n+                        {\n+                            movFlags = me->m_movementInfo.GetMovementFlags();\n+                            if ((movFlags & MOVEMENTFLAG_FORWARD) && !(movFlags & (MOVEMENTFLAG_FALLING_FAR)) &&\n+                                me->GetDistance(master) > 20)\n+                            {\n+                                if (doCast(me, ASPECT_OF_THE_CHEETAH))\n+                                    return;\n+                            }\n+                        }\n+                    }\n+\n+                    return;\n+                }\n+                else if (_myaspect == ASPECT_OF_THE_PACK_1)\n+                {\n+                    me->RemoveAurasDueToSpell(ASPECT_OF_THE_PACK_1, me->GetGUID());\n+                    _myaspect = 0;\n+                }\n+            }\n+\n+            if ((_myaspect == ASPECT_OF_THE_DRAGONHAWK_1 && idMap[ASPECT_OF_THE_DRAGONHAWK_1] == ASPECT_OF_THE_DRAGONHAWK) ||\n+                (!ASPECT_OF_THE_DRAGONHAWK && ((_myaspect == ASPECT_OF_THE_HAWK_1 && idMap[ASPECT_OF_THE_HAWK_1] == ASPECT_OF_THE_HAWK) ||\n+                _myaspect == ASPECT_OF_THE_MONKEY_1)))\n+                return;\n+\n+            if (ASPECT_OF_THE_DRAGONHAWK &&\n+                (_myaspect != ASPECT_OF_THE_DRAGONHAWK_1 || idMap[ASPECT_OF_THE_DRAGONHAWK_1] != ASPECT_OF_THE_DRAGONHAWK))\n+            {\n+                if (doCast(me, ASPECT_OF_THE_DRAGONHAWK))\n+                    return;\n+                return;\n+            }\n+            if (ASPECT_OF_THE_HAWK && (!IsTank() || (!ASPECT_OF_THE_MONKEY && !ASPECT_OF_THE_DRAGONHAWK)) &&\n+                (_myaspect != ASPECT_OF_THE_HAWK_1 || idMap[ASPECT_OF_THE_HAWK_1] != ASPECT_OF_THE_HAWK))\n+            {\n+                if (doCast(me, ASPECT_OF_THE_HAWK))\n+                    return;\n+                return;\n+            }\n+            if (ASPECT_OF_THE_MONKEY && _myaspect != ASPECT_OF_THE_MONKEY_1)\n+            {\n+                if (doCast(me, ASPECT_OF_THE_MONKEY))\n+                    return;\n+                return;\n+            }\n+        }\n+\n+        void Counter(uint32 diff)\n+        {\n+            if (IsCasting() || Rand() > 35)\n+                return;\n+\n+            Unit* target = nullptr;\n+\n+            if (IsSpellReady(SCATTER_SHOT_1, diff) && HasRole(BOT_ROLE_DPS))\n+            {\n+                target = FindCastingTarget(CalcSpellMaxRange(SCATTER_SHOT_1), 0, SCATTER_SHOT_1);\n+                if (target && doCast(target, GetSpell(SCATTER_SHOT_1)))\n+                    return;\n+            }\n+            if (!target && IsSpellReady(WYVERN_STING_1, diff) && HasRole(BOT_ROLE_DPS))\n+            {\n+                target = FindCastingTarget(CalcSpellMaxRange(WYVERN_STING_1), 5, WYVERN_STING_1);\n+                if (target && doCast(target, GetSpell(WYVERN_STING_1)))\n+                    return;\n+            }\n+            //if (!target && IsSpellReady(FREEZING_ARROW_1, diff))\n+            //{\n+            //    target = FindCastingTarget(40, 0, false, FREEZING_ARROW_1);\n+            //    if (target && doCast(target, GetSpell(FREEZING_ARROW_1)))\n+            //        return;\n+            //}\n+            //if (!target && IsSpellReady(SCARE_BEAST_1, diff))\n+            //{\n+            //    target = FindCastingTarget(30, 0, SCARE_BEAST_1);\n+            //    if (target && doCast(target, GetSpell(SCARE_BEAST_1)))\n+            //        return;\n+            //}\n+            if (!target && IsSpellReady(SILENCING_SHOT_1, diff, false) && HasRole(BOT_ROLE_DPS))\n+            {\n+                target = FindCastingTarget(CalcSpellMaxRange(SILENCING_SHOT_1), 5, SILENCING_SHOT_1);\n+                if (target && doCast(target, GetSpell(SILENCING_SHOT_1)))\n+                    return;\n+            }\n+        }\n+\n+        void CheckScatter(uint32 diff)\n+        {\n+            if (!IsSpellReady(SCATTER_SHOT_1, diff) || !HasRole(BOT_ROLE_DPS) || Rand() > 50)\n+                return;\n+\n+            for (Unit* mtar : { opponent, disttarget })\n+            {\n+                if (mtar && mtar->GetVictim() == me && mtar->GetDistance(me) < 10 &&\n+                    !mtar->HasAuraType(SPELL_AURA_PERIODIC_DAMAGE) && mtar->getAttackers().size() <= 1)\n+                {\n+                    if (doCast(mtar, GetSpell(SCATTER_SHOT_1)))\n+                    {\n+                        GetInPosition(true, nullptr);\n+                        return;\n+                    }\n+                }\n+            }\n+            if (Unit* target = FindStunTarget(CalcSpellMaxRange(SCATTER_SHOT_1)))\n+            {\n+                if (doCast(target, GetSpell(SCATTER_SHOT_1)))\n+                    return;\n+            }\n+        }\n+\n+        void CheckWyvernSting(uint32 diff)\n+        {\n+            if (!IsSpellReady(WYVERN_STING_1, diff) || !HasRole(BOT_ROLE_DPS) || Rand() > 50)\n+                return;\n+\n+            if (Unit* target = FindStunTarget(CalcSpellMaxRange(WYVERN_STING_1)))\n+            {\n+                if (doCast(target, GetSpell(WYVERN_STING_1)))\n+                    return;\n+            }\n+        }\n+\n+        void CheckFreezingArrow(uint32 diff)\n+        {\n+            //Freezing Trap shares cooldown with frosty traps\n+            if (!IsSpellReady(FREEZING_ARROW_1, diff) || Rand() > 35)\n+                return;\n+\n+            if (Unit* target = FindStunTarget(25))\n+            {\n+                if (doCast(target, GetSpell(FREEZING_ARROW_1)))\n+                    return;\n+            }\n+        }\n+\n+        void CheckTraps(uint32 diff)\n+        {\n+            if (trapTimer > diff || IsCasting() || Rand() > 35)\n+                return;\n+\n+            trapTimer = urand(1000, 2000);\n+\n+            //trap summon spell is 2yd radius\n+            std::list<Unit*> targets;\n+            GetNearbyTargetsInConeList(targets, 4);\n+            if (targets.empty())\n+                return;\n+\n+            //frost trap, freezing trap, freezing arrow: cat 411\n+            if (IsSpellReady(FROST_TRAP_1, diff) && !IsTank())\n+            {\n+                //uint8 movingCount = 0;\n+                //for (std::list<Unit*>::const_iterator itr = targets.begin(); itr != targets.end(); ++itr)\n+                //{\n+                //    if ((*itr)->isMoving() || ((*itr)->GetVictim() && !IsTank((*itr)->GetVictim())))\n+                //    {\n+                //        if (++movingCount >= 2)\n+                        //if (targets.size() > 1)\n+                //        {\n+                            if (doCast(me, GetSpell(FROST_TRAP_1)))\n+                                return;\n+                //            break;\n+                //        }\n+                //    }\n+                //}\n+            }\n+            //only if taming beast (or manual)\n+            if (IsSpellReady(FREEZING_TRAP_1, diff) && !HasRole(BOT_ROLE_DPS) && !IAmFree() &&\n+                master->GetAuraEffect(SPELL_AURA_MOD_RESISTANCE_PCT, SPELLFAMILY_GENERIC, 255, 2))\n+            {\n+                if (doCast(me, GetSpell(FREEZING_TRAP_1)))\n+                    return;\n+            }\n+            //black arrow, immolation trap, explosive trap: cat 1250\n+            if (IsSpellReady(EXPLOSIVE_TRAP_1, diff) && HasRole(BOT_ROLE_DPS))\n+            {\n+                if (targets.size() > 1)\n+                {\n+                    if (doCast(me, GetSpell(EXPLOSIVE_TRAP_1)))\n+                        return;\n+                }\n+            }\n+            if (IsSpellReady(IMMOLATION_TRAP_1, diff) && HasRole(BOT_ROLE_DPS) && !(*targets.begin())->IsControlledByPlayer())\n+            {\n+                if (targets.size() > 1)\n+                {\n+                    if (doCast(me, GetSpell(IMMOLATION_TRAP_1)))\n+                        return;\n+                }\n+            }\n+            //snake trap: cat 1249\n+            //if (IsSpellReady(SNAKE_TRAP_1, diff) && HasRole(BOT_ROLE_DPS) && (*targets.begin())->IsControlledByPlayer())\n+            //{\n+            //    if (doCast(me, GetSpell(SNAKE_TRAP_1)))\n+            //        return;\n+            //}\n+        }\n+\n+        void CheckMendPet(uint32 diff)\n+        {\n+            if (!IsSpellReady(MEND_PET_1, diff) || checkMendTimer > diff || Rand() > 75 ||\n+                !botPet || !botPet->IsAlive() || GetHealthPCT(botPet) > 80 ||\n+                me->GetDistance(botPet) > CalcSpellMaxRange(MEND_PET_1, false) || IsCasting())\n+                return;\n+\n+            checkMendTimer = urand(2000, 4000);\n+\n+            Aura const* mend = botPet->GetAura(GetSpell(MEND_PET_1));\n+            if (!mend || mend->GetDuration() < 3000)\n+            {\n+                if (doCast(me, GetSpell(MEND_PET_1)))\n+                    return;\n+            }\n+        }\n+\n+        void CheckScare(uint32 diff)\n+        {\n+            if (!IsSpellReady(SCARE_BEAST_1, diff) || IsCasting() || Rand() > 25)\n+                return;\n+\n+            if (FindAffectedTarget(GetSpell(SCARE_BEAST_1), me->GetGUID(), 60))\n+            {\n+                SetSpellCooldown(SCARE_BEAST_1, 2000);\n+                return;\n+            }\n+\n+            if (Unit* scareTarget = FindFearTarget())\n+            {\n+                if (doCast(scareTarget, GetSpell(SCARE_BEAST_1)))\n+                    return;\n+            }\n+\n+            SetSpellCooldown(SCARE_BEAST_1, 1500); //fail\n+        }\n+\n+        void doDefend(uint32 diff)\n+        {\n+            if (IsTank() || Rand() > 55)\n+                return;\n+\n+            bool feignReady = IsSpellReady(FEIGN_DEATH_1, diff, false);\n+            bool deterReady = IsSpellReady(DETERRENCE_1, diff, false);\n+            if (!feignReady && !deterReady)\n+                return;\n+\n+            Unit::AttackerSet const& b_attackers = me->getAttackers();\n+            if (b_attackers.empty())\n+                return;\n+\n+            bool cast = false;\n+\n+            if (b_attackers.size() == 1)\n+            {\n+                if (Creature* cre = (*b_attackers.begin())->ToCreature())\n+                    if (cre->isWorldBoss() || cre->IsDungeonBoss() || cre->GetMaxHealth() > me->GetMaxHealth() * 10)\n+                        cast = true;\n+            }\n+            else\n+                cast = (uint8(b_attackers.size()) > (GetHealthPCT(me) > 20 ? 1 : 0));\n+\n+            if (!cast)\n+                return;\n+\n+            if (feignReady && (*b_attackers.begin())->getAttackers().size() > 1)\n+            {\n+                if (doCast(me, GetSpell(FEIGN_DEATH_1)))\n+                    return;\n+            }\n+\n+            if (deterReady)\n+            {\n+                if (doCast(me, GetSpell(DETERRENCE_1)))\n+                    return;\n+            }\n+        }\n+\n+        void CheckTranquil(uint32 diff)\n+        {\n+            if (!IsSpellReady(TRANQ_SHOT_1, diff) || Rand() > 20)\n+                return;\n+\n+            //First check current target\n+            for (Unit* mtar : { opponent, disttarget })\n+            {\n+                if (mtar && me->GetDistance(mtar) > 5 && me->GetDistance(mtar) < CalcSpellMaxRange(TRANQ_SHOT_1) &&\n+                    !mtar->IsImmunedToSpell(sSpellMgr->GetSpellInfo(TRANQ_SHOT_1), me))\n+                {\n+                    for (auto const& [_, aura] : mtar->GetOwnedAuras())\n+                    {\n+                        SpellInfo const* spellInfo = aura->GetSpellInfo();\n+                        if (spellInfo->Dispel != DISPEL_MAGIC && spellInfo->Dispel != DISPEL_ENRAGE) continue;\n+                        if (spellInfo->Attributes & (SPELL_ATTR0_PASSIVE | SPELL_ATTR0_HIDDEN_CLIENTSIDE)) continue;\n+                        //if (spellInfo->AttributesEx & SPELL_ATTR1_DONT_DISPLAY_IN_AURA_BAR) continue;\n+                        AuraApplication const* aurApp = aura->GetApplicationOfTarget(mtar->GetGUID());\n+                        if (aurApp && aurApp->IsPositive())\n+                        {\n+                            if (doCast(mtar, GetSpell(TRANQ_SHOT_1)))\n+                                return;\n+                        }\n+                    }\n+                }\n+            }\n+\n+            Unit* target = FindTranquilTarget(5, CalcSpellMaxRange(TRANQ_SHOT_1));\n+            if (target && doCast(target, GetSpell(TRANQ_SHOT_1)))\n+                return;\n+        }\n+\n+        void CheckMisdirect(uint32 diff)\n+        {\n+            if (!IsSpellReady(MISDIRECTION_1, diff) || misdirectionTimer > diff || IAmFree() ||\n+                !master->GetGroup() || Rand() > 20)\n+                return;\n+\n+            misdirectionTimer = urand(3000, 6000);\n+\n+            //find tank\n+            //stacks\n+            std::list<Unit*> tanks;\n+            for (Unit* member : BotMgr::GetAllGroupMembers(master))\n+            {\n+                if (member->IsInWorld() && me->GetMap() == member->FindMap() && member->IsAlive() &&\n+                    member->GetVictim() && member->IsInCombat() && IsTank(member))\n+                {\n+                    tanks.push_back(member);\n+                }\n+            }\n+\n+            if (tanks.empty())\n+                return;\n+\n+            Unit* target = tanks.size() == 1 ? *tanks.begin() : Bcore::Containers::SelectRandomContainerElement(tanks);\n+            if (doCast(target, GetSpell(MISDIRECTION_1)))\n+                return;\n+        }\n+\n+        void UpdateAI(uint32 diff) override\n+        {\n+            if (!GlobalUpdate(diff))\n+                return;\n+\n+            DoVehicleActions(diff);\n+            if (!CanBotAttackOnVehicle())\n+                return;\n+\n+            //pet is killed or unreachable\n+            if (GC_Timer <= diff && !me->IsInCombat() && !me->IsMounted() && !me->GetVictim() && !IsCasting() && Rand() < 25 &&\n+                (!botPet || me->GetDistance2d(botPet) > sWorld->GetMaxVisibleDistanceOnContinents()))\n+                SummonBotPet();\n+\n+            //Scare Beast interrupt\n+            Spell const* spell = me->GetCurrentSpell(CURRENT_GENERIC_SPELL);\n+            if (spell && spell->GetSpellInfo()->Id == GetSpell(SCARE_BEAST_1))\n+            {\n+                Unit const* target = ObjectAccessor::GetUnit(*me, spell->m_targets.GetObjectTargetGUID());\n+                if (target && target->HasAuraType(SPELL_AURA_MOD_FEAR))\n+                    me->InterruptSpell(CURRENT_GENERIC_SPELL);\n+            }\n+\n+            if (IsPotionReady())\n+            {\n+                if (GetManaPCT(me) < 10)\n+                    DrinkPotion(true);\n+                else if (GetHealthPCT(me) < 50)\n+                    DrinkPotion(false);\n+            }\n+\n+            CheckRacials(diff);\n+\n+            if (!me->IsInCombat())\n+                DoNonCombatActions(diff);\n+            else\n+                doDefend(diff);\n+\n+            CheckAspects(diff);\n+\n+            if (IsSpellReady(TRUESHOT_AURA_1, diff) && !IAmFree() && Rand() < 5 &&\n+                !me->GetAuraEffect(SPELL_AURA_MOD_RANGED_ATTACK_POWER_PCT, SPELLFAMILY_HUNTER, 0x0, 0x200000, 0x0, me->GetGUID()))\n+            {\n+                if (doCast(me, GetSpell(TRUESHOT_AURA_1)))\n+                    return;\n+            }\n+\n+            CheckMendPet(diff);\n+\n+            if (master->IsInCombat() || me->IsInCombat())\n+                CheckScare(diff);\n+\n+            //Deterrence check\n+            if (me->HasUnitFlag(UNIT_FLAG_PACIFIED) && !IsCasting())\n+            {\n+                if (!me->isMoving())\n+                    GetInPosition(true, nullptr);\n+                return;\n+            }\n+\n+            if (ProcessImmediateNonAttackTarget())\n+                return;\n+\n+            if (!CheckAttackTarget())\n+            {\n+                me->InterruptSpell(CURRENT_AUTOREPEAT_SPELL);\n+                return;\n+            }\n+\n+            if (IsCasting())\n+                return;\n+\n+            CheckFlare(diff);\n+            CheckReadiness(diff);\n+\n+            CheckUsableItems(diff);\n+\n+            DoRangedAttack(diff);\n+        }\n+\n+        void DoRangedAttack(uint32 diff)\n+        {\n+            Unit* mytar = opponent ? opponent : disttarget ? disttarget : nullptr;\n+            if (!mytar)\n+                return;\n+\n+            StartAttack(mytar, IsMelee());\n+\n+            CheckAttackState();\n+            if (!me->IsAlive() || !mytar->IsAlive())\n+                return;\n+\n+            Counter(diff);\n+            CheckTranquil(diff);\n+\n+            float dist = me->GetDistance(mytar);\n+            float maxRangeLong = me->GetLevel() >= 10 ? 51.f : 45.f;\n+            float maxRangeNormal = me->GetLevel() >= 10 ? 41.f : 35.f;\n+\n+            bool inposition = !mytar->HasAuraType(SPELL_AURA_MOD_CONFUSE) || dist > maxRangeNormal - 15.f;\n+\n+            //Auto Shot\n+            if (Spell const* shot = me->GetCurrentSpell(CURRENT_AUTOREPEAT_SPELL))\n+            {\n+                if (shot->GetSpellInfo()->Id == AUTO_SHOT_1 && (shot->m_targets.GetUnitTarget() != mytar || !inposition))\n+                    me->InterruptSpell(CURRENT_AUTOREPEAT_SPELL);\n+            }\n+            else if (HasRole(BOT_ROLE_DPS) && dist > 5 && dist < maxRangeNormal)\n+            {\n+                if (doCast(mytar, AUTO_SHOT_1))\n+                {}\n+            }\n+\n+            CheckScatter(diff);\n+            CheckFreezingArrow(diff);\n+            CheckWyvernSting(diff);\n+\n+            //TRAPS\n+            CheckTraps(diff);\n+\n+            auto [can_do_nature, can_do_fire, can_do_arcane, can_do_shadow, can_do_normal] =\n+                CanAffectVictimBools(mytar, SPELL_SCHOOL_NATURE, SPELL_SCHOOL_FIRE, SPELL_SCHOOL_ARCANE, SPELL_SCHOOL_SHADOW, SPELL_SCHOOL_NORMAL);\n+\n+            //scatter pvp\n+            if (IsSpellReady(SCATTER_SHOT_1, diff) && can_do_normal && HasRole(BOT_ROLE_DPS) &&\n+                mytar->IsPlayer() && dist < 10 && Rand() < 60)\n+            {\n+                if (doCast(mytar, GetSpell(SCATTER_SHOT_1)))\n+                {\n+                    me->InterruptSpell(CURRENT_AUTOREPEAT_SPELL);\n+                    me->AttackStop();\n+                    GetInPosition(true, mytar);\n+                    return;\n+                }\n+            }\n+\n+            //DISENGAGE\n+            if (IsSpellReady(DISENGAGE_1, diff, false) && me->IsInCombat() && !IsTank() && Rand() < 70 &&\n+                !HasBotCommandState(BOT_COMMAND_STAY) &&\n+                !me->getAttackers().empty() && me->GetDistance(*me->getAttackers().begin()) < 5 &&\n+                me->HasInArc(float(M_PI), *me->getAttackers().begin()))\n+            {\n+                if (doCast(me, GetSpell(DISENGAGE_1)))\n+                    return;\n+            }\n+\n+            MoveBehind(mytar);\n+\n+            //MELEE SECTION\n+            if (dist < 5)\n+            {\n+                if (!can_do_normal)\n+                    return;\n+\n+                //MONGOOSE BITE\n+                if (IsSpellReady(MONGOOSE_BITE_1, diff) && HasRole(BOT_ROLE_DPS) && Rand() < 50)\n+                {\n+                    if (doCast(mytar, GetSpell(MONGOOSE_BITE_1)))\n+                        return;\n+                }\n+                //COUNTERATTACK\n+                if (IsSpellReady(COUNTERATTACK_1, diff) && HasRole(BOT_ROLE_DPS) &&\n+                    me->HasReactive(REACTIVE_HUNTER_PARRY) && Rand() < 90)\n+                {\n+                    if (doCast(mytar, GetSpell(COUNTERATTACK_1)))\n+                        return;\n+                }\n+                //WING CLIP\n+                if (IsSpellReady(WING_CLIP_1, diff) && (!IsTank() || mytar->isMoving()) &&\n+                    Rand() < 80 && !CCed(mytar, true) && !mytar->HasAuraWithMechanic(1u<<MECHANIC_SNARE))\n+                {\n+                    if (doCast(mytar, GetSpell(WING_CLIP_1)))\n+                        return;\n+                }\n+                //RAPTOR STRIKE\n+                if (IsSpellReady(RAPTOR_STRIKE_1, diff, false) && HasRole(BOT_ROLE_DPS) && Rand() < 40 &&\n+                    !me->GetCurrentSpell(CURRENT_MELEE_SPELL))\n+                {\n+                    if (doCast(mytar, GetSpell(RAPTOR_STRIKE_1)))\n+                        return;\n+                }\n+\n+                return; //don't try to do anything else in melee\n+            }\n+\n+            //RANGED SECTION\n+\n+            //HUNTERS MARK //100 yd range so don't check it\n+            if (IsSpellReady(HUNTERS_MARK_1, diff) && can_do_arcane && Rand() < 65 &&\n+                !mytar->HasAuraTypeWithFamilyFlags(SPELL_AURA_MOD_STALKED, SPELLFAMILY_HUNTER, 0x400))\n+            {\n+                if (doCast(mytar, GetSpell(HUNTERS_MARK_1)))\n+                    return;\n+            }\n+\n+            CheckMisdirect(diff);\n+\n+            //attack range check 1\n+            if (dist > maxRangeLong)\n+                return;\n+\n+            //KILL SHOT\n+            if (IsSpellReady(KILL_SHOT_1, diff) && can_do_normal && HasRole(BOT_ROLE_DPS) &&\n+                mytar->HasAuraState(AURA_STATE_HEALTHLESS_20_PERCENT))\n+            {\n+                if (doCast(mytar, GetSpell(KILL_SHOT_1)))\n+                    return;\n+            }\n+\n+            //attack range check 2\n+            if (dist > maxRangeNormal)\n+                return;\n+\n+            if (!inposition && me->getAttackers().empty())\n+                return;\n+\n+            //CONCUSSIVE SHOT\n+            if (IsSpellReady(CONCUSSIVE_SHOT_1, diff) && can_do_arcane && Rand() < 35 &&\n+                !CCed(mytar, true) && !mytar->HasAuraWithMechanic(1u<<MECHANIC_SNARE))\n+            {\n+                if (doCast(mytar, GetSpell(CONCUSSIVE_SHOT_1)))\n+                    return;\n+            }\n+            //DISTRACTING SHOT\n+            Unit const* u = mytar->GetVictim();\n+            if (IsSpellReady(DISTRACTING_SHOT_1, diff) && can_do_arcane && u && u != me && IsTank() && !CCed(mytar) &&\n+                IsInBotParty(u) && Rand() < 75 && (!IsTank(u) || (dist > 25 && GetHealthPCT(u) < 25)))\n+            {\n+                if (doCast(mytar, GetSpell(DISTRACTING_SHOT_1)))\n+                    return;\n+            }\n+            //MULTI-SHOT shares cd with aimed shot\n+            if (IsSpellReady(MULTISHOT_1, diff) && HasRole(BOT_ROLE_DPS) && Rand() < 70)\n+            {\n+                if (Rand() < 30 || !GetSpell(STEADY_SHOT_1) || FindSplashTarget(maxRangeNormal))\n+                {\n+                    if (doCast(mytar, GetSpell(MULTISHOT_1)))\n+                        return;\n+                }\n+            }\n+            //VOLLEY\n+            if (IsSpellReady(VOLLEY_1, diff) && HasRole(BOT_ROLE_DPS) && !JumpingOrFalling() && Rand() < 75)\n+            {\n+                if (Unit* target = FindAOETarget(maxRangeNormal))\n+                {\n+                    if (doCast(target, GetSpell(VOLLEY_1)))\n+                        return;\n+                }\n+            }\n+            //RAPID FIRE\n+            if (IsSpellReady(RAPID_FIRE_1, diff, false) && can_do_normal && HasRole(BOT_ROLE_DPS) && !me->isMoving() && Rand() < 55 &&\n+                (mytar->GetHealth() > me->GetMaxHealth() * (1 + mytar->getAttackers().size()) || mytar->IsPlayer()) &&\n+                !me->HasAuraTypeWithFamilyFlags(SPELL_AURA_MOD_RANGED_HASTE, SPELLFAMILY_HUNTER, 0x20))\n+            {\n+                if (doCast(me, GetSpell(RAPID_FIRE_1)))\n+                {}\n+            }\n+            //BLACK ARROW\n+            //Black Arrow shares cooldown with fire traps\n+            if (IsSpellReady(BLACK_ARROW_1, diff) && can_do_shadow && HasRole(BOT_ROLE_DPS) &&\n+                mytar->GetHealth() > me->GetMaxHealth()/4 * (1 + mytar->getAttackers().size()))\n+            {\n+                if (doCast(mytar, GetSpell(BLACK_ARROW_1)))\n+                    return;\n+            }\n+            //CHIMERA SHOT: no viper\n+            if (IsSpellReady(CHIMERA_SHOT_1, diff) && can_do_nature && HasRole(BOT_ROLE_DPS))\n+            {\n+                //Serpent\n+                if (mytar->GetAuraEffect(SPELL_AURA_MOD_DAMAGE_FROM_CASTER, SPELLFAMILY_HUNTER, 0x4000, 0x0, 0x0, me->GetGUID()))\n+                {\n+                    if (doCast(mytar, GetSpell(CHIMERA_SHOT_1)))\n+                        return;\n+                }\n+                //Scorpid\n+                else if (mytar->GetAuraEffect(SPELL_AURA_MOD_HIT_CHANCE, SPELLFAMILY_HUNTER, 0x8000, 0x0, 0x0, me->GetGUID()))\n+                {\n+                    if (!mytar->HasAuraType(SPELL_AURA_MOD_DISARM) &&\n+                        (mytar->IsPlayer() || mytar->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID)))\n+                    {\n+                        if (doCast(mytar, GetSpell(CHIMERA_SHOT_1)))\n+                            return;\n+                    }\n+                }\n+\n+                SetSpellCooldown(CHIMERA_SHOT_1, 500); //fail\n+            }\n+            //STING\n+            if (GetSpellCooldown(SERPENT_STING_1) <= diff && can_do_nature && stingTimer <= diff && Rand() < 60)\n+            {\n+                uint32 STING = 0;\n+                AuraEffect const* sting = nullptr;\n+                if (GetSpell(SCORPID_STING_1) && mytar->IsCreature() &&\n+                    mytar->ToCreature()->GetCreatureTemplate()->rank != CREATURE_ELITE_NORMAL)\n+                {\n+                    sting = mytar->GetAuraEffect(SPELL_AURA_MOD_HIT_CHANCE, SPELLFAMILY_HUNTER, 0x8000, 0x0, 0x0);\n+                    if (!sting || sting->GetBase()->GetCasterGUID() == me->GetGUID())\n+                        STING = SCORPID_STING_1;\n+                }\n+                //VIPER STING: pvp only\n+                if (!STING && GetSpell(VIPER_STING_1) && mytar->IsPlayer() &&\n+                    mytar->GetPowerType() == POWER_MANA && mytar->GetHealth() > me->GetMaxHealth()/2 &&\n+                    mytar->GetMaxPower(POWER_MANA) > me->GetMaxPower(POWER_MANA))\n+                {\n+                    sting = mytar->GetAuraEffect(SPELL_AURA_PERIODIC_MANA_LEECH, SPELLFAMILY_HUNTER, 0x0, 0x80, 0x0, me->GetGUID());\n+                    if (!sting)\n+                        STING = VIPER_STING_1;\n+                }\n+                if (!STING && GetSpell(SERPENT_STING_1) && HasRole(BOT_ROLE_DPS) &&\n+                    mytar->GetHealth() > me->GetMaxHealth()/2 * (1 + mytar->getAttackers().size()))\n+                {\n+                    sting = mytar->GetAuraEffect(SPELL_AURA_MOD_DAMAGE_FROM_CASTER, SPELLFAMILY_HUNTER, 0x4000, 0x0, 0x0, me->GetGUID());\n+                    if (!sting)\n+                        STING = SERPENT_STING_1;\n+                }\n+\n+                if (sting && sting->GetBase()->GetCasterGUID() == me->GetGUID() &&\n+                    sting->GetBase()->GetDuration() >= 3000)\n+                {\n+                    stingTimer = 3000;\n+                }\n+                else\n+                {\n+                    if (STING && doCast(mytar, GetSpell(STING)))\n+                    {\n+                        stingTimer = 8000;\n+                        return;\n+                    }\n+                }\n+            }\n+            //EXPLOSIVE SHOT: replaces Arcane Shot at 60\n+            if (IsSpellReady(EXPLOSIVE_SHOT_1, diff) && can_do_fire && HasRole(BOT_ROLE_DPS))\n+            {\n+                if (doCast(mytar, GetSpell(EXPLOSIVE_SHOT_1)))\n+                    return;\n+            }\n+            //ARCANE SHOT: shares cd with Explosive Shot\n+            if (IsSpellReady(ARCANE_SHOT_1, diff) && can_do_arcane && HasRole(BOT_ROLE_DPS) && !GetSpell(EXPLOSIVE_SHOT_1))\n+            {\n+                if (doCast(mytar, GetSpell(ARCANE_SHOT_1)))\n+                    return;\n+            }\n+            //AIMED SHOT shares cd with multishot\n+            if (IsSpellReady(AIMED_SHOT_1, diff) && can_do_normal && HasRole(BOT_ROLE_DPS))\n+            {\n+                if (doCast(mytar, GetSpell(AIMED_SHOT_1)))\n+                    return;\n+            }\n+            //STEADY SHOT\n+            if (IsSpellReady(STEADY_SHOT_1, diff) && can_do_normal && HasRole(BOT_ROLE_DPS))\n+            {\n+                if (doCast(mytar, GetSpell(STEADY_SHOT_1)))\n+                    return;\n+            }\n+        }\n+\n+        void CheckFlare(uint32 diff)\n+        {\n+            if (!IsSpellReady(FLARE_1, diff) || flareTimer > diff || me->IsMounted() || Rand() > 25)\n+                return;\n+\n+            flareTimer = urand(2000, 4000);\n+\n+            std::set<Unit*> targets;\n+            if (Group const* gr = !IAmFree() ? master->GetGroup() : GetGroup())\n+            {\n+                for (Unit* member : BotMgr::GetAllGroupMembers(gr))\n+                {\n+                    if (me->GetMap() != member->FindMap() || !member->IsAlive())\n+                        continue;\n+                    for (Unit* attacker : member->getAttackers())\n+                    {\n+                        if (attacker->GetClass() == CLASS_ROGUE || attacker->HasInvisibilityAura() || attacker->HasStealthAura())\n+                        {\n+                            if (member->GetDistance(attacker) < 15)\n+                            {\n+                                targets.insert(member);\n+                                break;\n+                            }\n+                        }\n+                    }\n+                }\n+            }\n+            for (Unit* attacker : me->getAttackers())\n+            {\n+                if (attacker->GetClass() == CLASS_ROGUE || attacker->HasInvisibilityAura() || attacker->HasStealthAura())\n+                {\n+                    if (me->GetDistance(attacker) < 15)\n+                    {\n+                        targets.insert(me);\n+                        break;\n+                    }\n+                }\n+            }\n+\n+            if (targets.empty())\n+                return;\n+\n+            Unit* target = targets.size() == 1u ? *targets.begin() : Bcore::Containers::SelectRandomContainerElement(targets);\n+            if (doCast(target, GetSpell(FLARE_1)))\n+                return;\n+        }\n+\n+        void CheckReadiness(uint32 diff)\n+        {\n+            if (!IsSpellReady(READINESS_1, diff) || !me->IsInCombat() || me->IsMounted() || Rand() > 30)\n+                return;\n+\n+            //mainly used for rapid fire cd reset\n+            bool cast = me->GetVictim() && !IsSpellReady(RAPID_FIRE_1, diff, false);\n+\n+            if (cast && doCast(me, GetSpell(READINESS_1)))\n+                return;\n+        }\n+\n+        void ApplyClassSpellCritMultiplierAll(Unit const* victim, float& crit_chance, SpellInfo const* spellInfo, SpellSchoolMask /*schoolMask*/, WeaponAttackType /*attackType*/) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+\n+            //Glyph of Explosive Shot: 4% additional critical chance for Explosive Shot\n+            if (lvl >= 60 && (baseId == EXPLOSIVE_SHOT_1 || baseId == EXPLOSIVE_SHOT_PERIODIC_DUMMY_AURA))\n+                crit_chance += 4.f;\n+            //Point of No Escape: 6% additional critical chance on targets affected by frosty traps\n+            if ((GetSpec() == BOT_SPEC_HUNTER_SURVIVAL) && lvl >= 50)\n+            {\n+                if (victim->GetAuraEffect(SPELL_AURA_MOD_CRIT_CHANCE_FOR_CASTER, SPELLFAMILY_HUNTER, 0x18, 0x0, 0x0, me->GetGUID()))\n+                    crit_chance += 6.f;\n+            }\n+            //Sniper Training (part 1): 15% additional critical chance for Kill Shot\n+            if ((GetSpec() == BOT_SPEC_HUNTER_SURVIVAL) && lvl >= 50 && baseId == KILL_SHOT_1)\n+                crit_chance += 15.f;\n+            //Improved Steady Shot (37505): 5% additional critical chance for Steady Shot\n+            if (lvl >= 50 && baseId == STEADY_SHOT_1)\n+                crit_chance += 5.f;\n+            //Glyph of TrueShot Aura (req lvl 40): 10% additional critical chance for Aimed Shot\n+            if (lvl >= 40 && baseId == AIMED_SHOT_1)\n+                crit_chance += 10.f;\n+            //Improved Barrage: 12% additional critical chance for Multi-Shot and Aimed Shot\n+            if ((GetSpec() == BOT_SPEC_HUNTER_MARKSMANSHIP) && lvl >= 40 && (baseId == AIMED_SHOT_1 || baseId == MULTISHOT_1))\n+                crit_chance += 12.f;\n+            //Survival Instincts: 4% additional critical chance for Arcane Shot, Steady Shot and Explosive Shot\n+            if (lvl >= 15 && (baseId == ARCANE_SHOT_1 || baseId == STEADY_SHOT_1 || baseId == EXPLOSIVE_SHOT_1 ||\n+                baseId == EXPLOSIVE_SHOT_PERIODIC_DUMMY_AURA))\n+                crit_chance += 4.f;\n+            //Savage Strikes: 20% additional critical chance for Raptor Strike, Mongoose Bite and Counterattack\n+            if (lvl >= 10 && (baseId == RAPTOR_STRIKE_1 || baseId == MONGOOSE_BITE_1 || baseId == COUNTERATTACK_1))\n+                crit_chance += 20.f;\n+        }\n+\n+        void ApplyClassDamageMultiplierMeleeSpell(int32& damage, SpellNonMeleeDamage& damageinfo, SpellInfo const* spellInfo, WeaponAttackType /*attackType*/, bool iscrit) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+\n+            ////do nothing with autoshot\n+            //if (baseId == AUTO_SHOT_1)\n+            //    return;\n+\n+            uint8 lvl = me->GetLevel();\n+            float fdamage = float(damage);\n+\n+            //apply bonus damage mods\n+            float pctbonus = 0.0f;\n+            if (iscrit)\n+            {\n+                //!!!Melee spell damage is not yet critical, all reduced by half\n+                //Mortal Shots: 30% crit damage bonus for all ranged abilities\n+                if (lvl >= 15 && baseId != AUTO_SHOT_1)\n+                    pctbonus += 0.15f;\n+                //Marked for Death (part 2): 10% crit damage bonus for Aimed Shot, Arcane Shot, Steady Shot, Kill Shot and Chimera Shot\n+                if ((GetSpec() == BOT_SPEC_HUNTER_MARKSMANSHIP) && lvl >= 55 &&\n+                    (baseId == AIMED_SHOT_1 || baseId == ARCANE_SHOT_1 || baseId == STEADY_SHOT_1 ||\n+                    baseId == KILL_SHOT_1 || baseId == CHIMERA_SHOT_1))\n+                    pctbonus += 0.05f;\n+            }\n+\n+            //Improved Tracking: 5% bonus damage versus tracked types (all for bots)\n+            if (lvl >= 10)\n+                pctbonus += 0.05f;\n+            //Focused Fire: 2% bonus damage while pet is active\n+            if (lvl >= 15 && botPet)\n+                pctbonus += 0.02f;\n+            //Ranged Weapon Specialization: 5% bonus damage for ranged attacks\n+            if ((GetSpec() == BOT_SPEC_HUNTER_MARKSMANSHIP) && lvl >= 35)\n+                pctbonus += 0.05f;\n+            //Improved Arcane Shot: 15% bonus damage for Arcane Shot\n+            if (lvl >= 20 && baseId == ARCANE_SHOT_1)\n+                pctbonus += 0.15f;\n+            //Rapid Killing (buff): 20% bonus damage for Aimed Shot, Arcane Shot or Chimera Shot (removed in SpellHitTarget())\n+            if (lvl >= 20 && (baseId == AIMED_SHOT_1 || baseId == ARCANE_SHOT_1 || baseId == CHIMERA_SHOT_1))\n+            {\n+                if (AuraEffect const* rapi = me->GetAuraEffect(RAPID_KILLING_BUFF, 0))\n+                    if (rapi->IsAffectingSpell(spellInfo))\n+                        pctbonus += 0.2f;\n+            }\n+            //Barrage: 12% bonus damage for Aimed Shot, Multi-Shot or Volley\n+            if ((GetSpec() == BOT_SPEC_HUNTER_MARKSMANSHIP) && lvl >= 30 && (spellInfo->SpellFamilyFlags[0] & 0x23000))\n+                pctbonus += 0.12f;\n+            //Marked for Death (part 1): 5% bonus damage for all ranged shots on marked target\n+            if ((GetSpec() == BOT_SPEC_HUNTER_MARKSMANSHIP) && lvl >= 55 && damageinfo.target &&\n+                damageinfo.target->GetAuraEffect(SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS, SPELLFAMILY_HUNTER, 0x400, 0x0, 0x0/*, me->GetGUID()*/))\n+                pctbonus += 0.05f;\n+            //T.N.T: 6% bonus damage for Explosive Shot, Explosive Trap, Immolation Trap and Black Arrow\n+            if ((GetSpec() == BOT_SPEC_HUNTER_SURVIVAL) && lvl >= 25 &&\n+                (baseId == EXPLOSIVE_SHOT_1 || baseId == EXPLOSIVE_SHOT_PERIODIC_DUMMY_AURA ||\n+                baseId == EXPLOSIVE_TRAP_AURA_1 || baseId == IMMOLATION_TRAP_AURA_1 || baseId == BLACK_ARROW_1))\n+                pctbonus += 0.06f;\n+            //Ferocious Inspiration part 2: 9% bonus damage for Arcane Shot and Steady Shot\n+            if ((GetSpec() == BOT_SPEC_HUNTER_BEASTMASTERY) &&\n+                lvl >= 40 && (baseId == ARCANE_SHOT_1 || baseId == STEADY_SHOT_1))\n+                pctbonus += 0.09f;\n+            //Improved Steady Shot (38392): 10% bonus damage for Steady Shot\n+            if (lvl >= 50 && baseId == STEADY_SHOT_1)\n+                pctbonus += 0.1f;\n+            //Glyph of Steady Shot: 10% bonus damage for Steady Shot if affected by Serpent Sting\n+            if (lvl >= 62 && baseId == STEADY_SHOT_1 && damageinfo.target &&\n+                damageinfo.target->GetAuraEffect(SPELL_AURA_MOD_DAMAGE_FROM_CASTER, SPELLFAMILY_HUNTER, 0x4000, 0x0, 0x0/*, me->GetGUID()*/))\n+                pctbonus += 0.1f;\n+            //The Beast Within part 1: 10% bonus damage for all abilities\n+            if ((GetSpec() == BOT_SPEC_HUNTER_BEASTMASTERY) && lvl >= 50)\n+                pctbonus += 0.1f;\n+            //Sniper Training part 2: 6% bonus damage for Steady Shot, Aimed Shot, Black Arrow and Explosive Shot\n+            if ((GetSpec() == BOT_SPEC_HUNTER_SURVIVAL) && lvl >= 50 &&\n+                ((spellInfo->SpellFamilyFlags[0] & 0x20000) ||\n+                (spellInfo->SpellFamilyFlags[1] & 0x8000001) ||\n+                (spellInfo->SpellFamilyFlags[2] & 0x200)))\n+            {\n+                if (Aura const* snip = me->GetAura(SNIPER_TRAINING_BUFF))\n+                {\n+                    if (snip->GetEffect(0)->IsAffectingSpell(spellInfo) ||\n+                        snip->GetEffect(1)->IsAffectingSpell(spellInfo))\n+                        pctbonus += 0.06f;\n+                }\n+            }\n+            //Improved Steady Shot part 1: 15% bonus damage for Steady Shot, Aimed Shot, Arcane Arrow and Chimera Shot\n+            if (baseId == AIMED_SHOT_1 || baseId == ARCANE_SHOT_1 || baseId == CHIMERA_SHOT_1)\n+            {\n+                if (AuraEffect const* stea = me->GetAuraEffect(IMPROVED_STEADY_SHOT_BUFF, 0))\n+                    if (stea->IsAffectingSpell(spellInfo))\n+                        pctbonus += 0.15f;\n+            }\n+\n+            damage = int32(fdamage * (1.0f + pctbonus));\n+        }\n+\n+        void ApplyClassDamageMultiplierSpell(int32& damage, SpellNonMeleeDamage& /*damageinfo*/, SpellInfo const* spellInfo, WeaponAttackType /*attackType*/, bool /*iscrit*/) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+            float fdamage = float(damage);\n+            float flat_mod = 0.f;\n+\n+            //2) apply bonus damage mods\n+            float pctbonus = 0.0f;\n+            //if (iscrit)\n+            //{\n+            //    //!!!spell damage is not yet critical and will be multiplied by 1.5\n+            //    //so we should put here bonus damage mult /1.5\n+            //    //Lava Flows (part 1): 24% additional crit damage bonus for Lava Burst\n+            //    if (lvl >= 50 && spellId == GetSpell(LAVA_BURST_1))\n+            //        pctbonus += 0.16f;\n+            //}\n+            //Trap Mastery part 2: 30% bonus damage for Immolation Trap, Explosive Trap and Black Arrow\n+            if (lvl >= 15 && (baseId == IMMOLATION_TRAP_AURA_1 || baseId == EXPLOSIVE_TRAP_AURA_1 || baseId == BLACK_ARROW_1))\n+                pctbonus += 0.3f;\n+            //T.N.T: 6% bonus damage for Explosive Shot, Explosive Trap, Immolation Trap and Black Arrow\n+            if ((GetSpec() == BOT_SPEC_HUNTER_SURVIVAL) && lvl >= 25 &&\n+                (baseId == EXPLOSIVE_SHOT_1 || baseId == EXPLOSIVE_SHOT_PERIODIC_DUMMY_AURA ||\n+                baseId == EXPLOSIVE_TRAP_AURA_1 || baseId == IMMOLATION_TRAP_AURA_1 || baseId == BLACK_ARROW_1))\n+                pctbonus += 0.06f;\n+            //The Beast Within part 1: 10% bonus damage for all abilities\n+            if ((GetSpec() == BOT_SPEC_HUNTER_BEASTMASTERY) && lvl >= 50)\n+                pctbonus += 0.1f;\n+\n+            damage = int32(fdamage * (1.0f + pctbonus) + flat_mod);\n+        }\n+\n+        void ApplyClassSpellCostMods(SpellInfo const* spellInfo, int32& cost) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            float fcost = float(cost);\n+            int32 flatbonus = 0;\n+            float pctbonus = 0.0f;\n+\n+            //percent mods\n+            //100% mods\n+            //Improved Hunter's Mark: -100% mana cost for Hunter's Mark\n+            if (lvl >= 15 && baseId == HUNTERS_MARK_1)\n+                pctbonus += 1.0f;\n+            //Lock and Load: mana cost\n+            if (baseId == ARCANE_SHOT_1 || baseId == EXPLOSIVE_SHOT_1)\n+            {\n+                AuraEffect const* lock = me->GetAuraEffect(LOCK_AND_LOAD_BUFF, 0);\n+                if (lock && lock->IsAffectingSpell(spellInfo))\n+                    pctbonus += 1.0f;\n+            }\n+\n+            //Improved Mend Pet: -20% mana cost for Mend Pet\n+            //Improved Mend Pet (23560) part 3\n+            if (lvl >= 25 && baseId == MEND_PET_1)\n+                pctbonus += 0.5f;\n+            //Efficiency: -15% mana cost for Stings and Shots\n+            if ((GetSpec() == BOT_SPEC_HUNTER_MARKSMANSHIP) && lvl >= 25 &&\n+                ((spellInfo->SpellFamilyFlags[0] & 0x7FA00) ||\n+                (spellInfo->SpellFamilyFlags[1] & 0x88801081) ||\n+                (spellInfo->SpellFamilyFlags[2] & 0x1)))\n+                pctbonus += 0.15f;\n+            //Resourcefulness: -60% mana cost for Traps, melee spells and Black Arrow\n+            if ((GetSpec() == BOT_SPEC_HUNTER_SURVIVAL) && lvl >= 35 &&\n+                ((spellInfo->SpellFamilyFlags[0] & 0xDE) ||\n+                (spellInfo->SpellFamilyFlags[1] & 0x84000)))\n+                pctbonus += 0.6f;\n+            //Glyph of Volley: -20% mana cost for Volley\n+            if (lvl >= 40 && baseId == VOLLEY_1)\n+                pctbonus += 0.2f;\n+            //Master Marksman: -25% mana cost for Steady Shot, Aimed Shot and Chimera Shot\n+            if ((GetSpec() == BOT_SPEC_HUNTER_MARKSMANSHIP) &&\n+                lvl >= 45 && (baseId == STEADY_SHOT_1 || baseId == AIMED_SHOT_1 || baseId == CHIMERA_SHOT_1))\n+                pctbonus += 0.25f;\n+            //Improved Steady Shot part 2: -20% mana cost for Steady Shot, Aimed Shot, Arcane Arrow and Chimera Shot\n+            if (baseId == AIMED_SHOT_1 || baseId == ARCANE_SHOT_1 || baseId == CHIMERA_SHOT_1)\n+            {\n+                if (AuraEffect const* stea = me->GetAuraEffect(IMPROVED_STEADY_SHOT_BUFF, 1))\n+                    if (stea->IsAffectingSpell(spellInfo))\n+                        pctbonus += 0.2f;\n+            }\n+\n+            //flat mods\n+            //!1 rage = 10 pts!\n+            //Improved Heroic Strike: -3 rage cost for Heroic Strike\n+            //if (lvl >= 10 && baseId == HEROIC_STRIKE_1)\n+            //    flatbonus += 30;\n+\n+            //cost can be < 0\n+            cost = int32(fcost * (1.0f - pctbonus)) - flatbonus;\n+        }\n+\n+        void ApplyClassSpellNotLoseCastTimeMods(SpellInfo const* spellInfo, int32& delayReduce) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchoolMask schools = spellInfo->GetSchoolMask();\n+            uint8 lvl = me->GetLevel();\n+            int32 reduceBonus = 0;\n+\n+            if (lvl >= 10 && baseId == STEADY_SHOT_1)\n+                reduceBonus += 70;\n+\n+            if (lvl >= 15 && baseId == SCARE_BEAST_1)\n+                reduceBonus += 75;\n+\n+            if (GetSpec() == BOT_SPEC_HUNTER_MARKSMANSHIP && lvl >= 40 && baseId == VOLLEY_1)\n+                reduceBonus += 100;\n+\n+            delayReduce += reduceBonus;\n+        }\n+\n+        void ApplyClassSpellCooldownMods(SpellInfo const* spellInfo, uint32& cooldown) const override\n+        {\n+            //cooldown is in milliseconds\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            int32 timebonus = 0;\n+            float pctbonus = 0.0f;\n+\n+            //pct mods\n+            //Glyph of Rapid Charge: -7% cooldown for Charge\n+            //if (lvl >= 40 && spellId == GetSpell(CHARGE_1))\n+            //    pctbonus += 0.07f;\n+\n+            //flat mods\n+            //Survival Tactics: -4 sec cooldown for Disengage\n+            //Glyph of Disengage: -5 sec cooldown for Disengage\n+            if (lvl >= 20 && baseId == DISENGAGE_1)\n+                timebonus += (GetSpec() == BOT_SPEC_HUNTER_SURVIVAL) ? 9000 : 5000;\n+            //Glyph of Feign Death: -5 sec cooldown for Feign Death\n+            //Improved Feign Death (24432): -2 sec cooldown for Feign Death\n+            if (lvl >= 30 && baseId == FEIGN_DEATH_1)\n+                timebonus += 7000;\n+            //Tranquilizing Shot Cooldown reduction (61255): -2 sec cooldown for Tranquilizing Shot\n+            if (lvl >= 60 && baseId == TRANQ_SHOT_1)\n+                timebonus += 2000;\n+            //Glyph of Deterrence: -10 sec cooldown for Deterrence\n+            if (lvl >= 60 && baseId == DETERRENCE_1)\n+                timebonus += 10000;\n+            //Glyph of Chimera Shot: -1 sec cooldown for Chimera Shot\n+            if (lvl >= 60 && baseId == CHIMERA_SHOT_1)\n+                timebonus += 1000;\n+\n+            cooldown = std::max<int32>((float(cooldown) * (1.0f - pctbonus)) - timebonus, 0);\n+        }\n+\n+        void ApplyClassSpellCategoryCooldownMods(SpellInfo const* spellInfo, uint32& cooldown) const override\n+        {\n+            //cooldown is in milliseconds\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+            int32 timebonus = 0;\n+            float pctbonus = 0.0f;\n+\n+            //Lock and Load: cooldown\n+            if (baseId == ARCANE_SHOT_1 || baseId == EXPLOSIVE_SHOT_1)\n+            {\n+                AuraEffect const* lock = me->GetAuraEffect(LOCK_AND_LOAD_BUFF, 0);\n+                if (lock && lock->IsAffectingSpell(spellInfo))\n+                    pctbonus += 1.0f;\n+            }\n+\n+            //Rapid Killing part 1: -2 min cooldown for Rapid Fire\n+            if ((GetSpec() == BOT_SPEC_HUNTER_MARKSMANSHIP) && baseId == RAPID_FIRE_1)\n+                timebonus += 120000;\n+            //Glyph of Aimed Shot: -2 sec cooldown for Aimed Shot\n+            if (baseId == AIMED_SHOT_1)\n+                timebonus += 2000;\n+            //Glyph of Multi-Shot: -1 sec cooldown for Multi-Shot\n+            //Improved Multi-Shot (44292): -1 sec cooldown for Multi-Shot\n+            if (baseId == MULTISHOT_1)\n+                timebonus += 2000;\n+            //Trap Cooldown (37481): -4 sec cd for Traps\n+            //Trap Cooldown Reduction: -2 sec cd for Traps\n+            if (spellInfo->SpellFamilyFlags[0] & 0x80)\n+                timebonus += 6000;\n+            //Resourcefulness: -6 sec cd for Traps and Black Arrow\n+            if ((GetSpec() == BOT_SPEC_HUNTER_SURVIVAL) && lvl >= 35 && (spellInfo->SpellFamilyFlags[0] & 0x80))\n+                timebonus += 6000;\n+            //Catlike Reflexes part 3: -30 sec cd for Kill Command\n+            if ((GetSpec() == BOT_SPEC_HUNTER_BEASTMASTERY) && lvl >= 40 && (spellInfo->SpellFamilyFlags[1] & 0x800))\n+                timebonus += 30000;\n+            //Glyph of Kill Shot: -6 sec cooldown for Kill Shot\n+            if (lvl >= 40 && baseId == KILL_SHOT_1)\n+                timebonus += 6000;\n+\n+            cooldown = std::max<int32>((float(cooldown) * (1.0f - pctbonus)) - timebonus, 0);\n+        }\n+\n+        void ApplyClassSpellRadiusMods(SpellInfo const* spellInfo, float& radius) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            //uint8 lvl = me->GetLevel();\n+            float flatbonus = 0.0f;\n+            float pctbonus = 0.0f;\n+\n+            //pct mods\n+            ////Holy Reach\n+            //if (lvl >= 25 && ((spellInfo->SpellFamilyFlags[0] & 0x18400200) || (spellInfo->SpellFamilyFlags[2] & 0x4)))\n+            //    pctbonus += 0.2f;\n+\n+            //flat mods\n+            //Glyph of Frost Trap\n+            if (baseId == FROST_TRAP_AURA)\n+                flatbonus += 2.f;\n+            //Glyph of the Pack\n+            if (baseId == ASPECT_OF_THE_PACK_1)\n+                flatbonus += 15.f;\n+\n+            radius = radius * (1.0f + pctbonus) + flatbonus;\n+        }\n+\n+        void ApplyClassSpellRangeMods(SpellInfo const* spellInfo, float& maxrange) const override\n+        {\n+            //uint32 spellId = spellInfo->Id;\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            float flatbonus = 0.0f;\n+            float pctbonus = 0.0f;\n+\n+            //pct mods\n+            //Improved Mend Pet (23560) part 1\n+            if (lvl >= 25 && baseId == MEND_PET_1)\n+                pctbonus += 0.5f;\n+\n+            //flat mods\n+            //Hawk Eye: +6 yd range for Ranged Abilities\n+            if (lvl >= 10 &&\n+                ((spellInfo->SpellFamilyFlags[0] & 0x7FA01) ||\n+                (spellInfo->SpellFamilyFlags[1] & 0x88801081) ||\n+                (spellInfo->SpellFamilyFlags[2] & 0x401)))\n+                flatbonus += 6.f;\n+            //Glyph of Scatter Shot\n+            if (lvl >= 20 && baseId == SCATTER_SHOT_1)\n+                flatbonus += 3.f;\n+\n+            maxrange = maxrange * (1.0f + pctbonus) + flatbonus;\n+        }\n+\n+        void ApplyClassSpellChanceOfSuccessMods(SpellInfo const* spellInfo, float& chance) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+\n+            //Improved Aspect of the Hawk: 10% chance\n+            if (lvl >= 10 && (baseId == ASPECT_OF_THE_HAWK_1 || baseId == ASPECT_OF_THE_DRAGONHAWK_1))\n+                chance += 10.f;\n+        }\n+\n+        void ApplyClassEffectMods(SpellInfo const* spellInfo, uint8 effIndex, float& value) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            float pctbonus = 1.0f;\n+\n+            //Improved Mend Pet (23560) part 2\n+            if (baseId == MEND_PET_1 && effIndex == EFFECT_0)\n+                pctbonus *= 1.1f;\n+\n+            value = value * pctbonus;\n+        }\n+\n+        void OnClassSpellGo(SpellInfo const* spellInfo) override\n+        {\n+            //uint32 spellId = spellInfo->Id;\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+\n+            //Rapid Killing: use up buff manually\n+            if (baseId == AIMED_SHOT_1 || baseId == ARCANE_SHOT_1 || baseId == CHIMERA_SHOT_1)\n+            {\n+                if (AuraEffect const* rapi = me->GetAuraEffect(RAPID_KILLING_BUFF, 0))\n+                    if (rapi->IsAffectingSpell(spellInfo))\n+                        me->RemoveAura(RAPID_KILLING_BUFF);\n+            }\n+            //Glyph of Arcane Shot\n+            if (baseId == ARCANE_SHOT_1)\n+            {\n+                Unit const* victim = me->GetVictim();\n+                if (victim &&\n+                    (victim->GetAuraEffect(SPELL_AURA_MOD_DAMAGE_FROM_CASTER, SPELLFAMILY_HUNTER, 0x4000, 0x0, 0x0, me->GetGUID()) ||\n+                    victim->GetAuraEffect(SPELL_AURA_PERIODIC_MANA_LEECH, SPELLFAMILY_HUNTER, 0x0, 0x80, 0x0, me->GetGUID()) ||\n+                    victim->GetAuraEffect(SPELL_AURA_MOD_HIT_CHANCE, SPELLFAMILY_HUNTER, 0x8000, 0x0, 0x0, me->GetGUID()) ||\n+                    victim->GetAuraEffect(SPELL_AURA_MOD_STUN, SPELLFAMILY_HUNTER, 0x0, 0x1000, 0x0, me->GetGUID()) ||\n+                    victim->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_HUNTER, 0x0, 0x100, 0x0, me->GetGUID())))\n+                {\n+                    int32 cost = spellInfo->CalcPowerCost(me, spellInfo->GetSchoolMask());\n+                    CastSpellExtraArgs args(true);\n+                    args.AddSpellBP0(cost);\n+                    me->CastSpell(me, GLYPH_OF_ARCANE_SHOT_ENERGIZE, args);\n+                }\n+            }\n+            //Lock and Load: consume charge\n+            if (baseId == ARCANE_SHOT_1 || baseId == EXPLOSIVE_SHOT_1)\n+            {\n+                AuraEffect const* lock = me->GetAuraEffect(LOCK_AND_LOAD_BUFF, 0);\n+                if (lock && lock->IsAffectingSpell(spellInfo))\n+                    lock->GetBase()->DropCharge();\n+            }\n+            if (baseId == READINESS_1)\n+            {\n+                for (auto& [rank1_id, spell] : GetSpellMap())\n+                {\n+                    if (rank1_id == spellInfo->Id || rank1_id == BESTIAL_WRATH_1 || rank1_id == GIFT_OF_NAARU_HUNTER)\n+                        continue;\n+                    if (spell.spellId != 0 && spell.cooldown > 0)\n+                    {\n+                        SpellInfo const* cdInfo = sSpellMgr->GetSpellInfo(rank1_id);\n+                        if (cdInfo && cdInfo->SpellFamilyName == SPELLFAMILY_HUNTER && cdInfo->GetRecoveryTime() > 0)\n+                            spell.cooldown = 0;\n+                    }\n+                }\n+            }\n+            //Improved Steady Shot: consume buff\n+            if (baseId == AIMED_SHOT_1 || baseId == ARCANE_SHOT_1 || baseId == CHIMERA_SHOT_1)\n+            {\n+                if (AuraEffect const* stea = me->GetAuraEffect(IMPROVED_STEADY_SHOT_BUFF, 0))\n+                    if (stea->IsAffectingSpell(spellInfo))\n+                        me->RemoveAurasDueToSpell(IMPROVED_STEADY_SHOT_BUFF);\n+            }\n+\n+            //Aspect helper\n+            switch (baseId)\n+            {\n+                case ASPECT_OF_THE_MONKEY_1:\n+                case ASPECT_OF_THE_HAWK_1:\n+                case ASPECT_OF_THE_CHEETAH_1:\n+                case ASPECT_OF_THE_VIPER_1:\n+                case ASPECT_OF_THE_BEAST_1:\n+                case ASPECT_OF_THE_PACK_1:\n+                case ASPECT_OF_THE_WILD_1:\n+                case ASPECT_OF_THE_DRAGONHAWK_1:\n+                    _myaspect = baseId;\n+                    break;\n+                default:\n+                    break;\n+            }\n+        }\n+\n+        void SpellHitTarget(WorldObject* wtarget, SpellInfo const* spell) override\n+        {\n+            Unit* target = wtarget->ToUnit();\n+            if (!target)\n+                return;\n+\n+            if (target == me)\n+                return;\n+\n+            uint32 baseId = spell->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+\n+            if (baseId == HUNTERS_MARK_1)\n+            {\n+                //Hunter's Mark helper\n+                if (AuraEffect* mark = target->GetAuraEffect(spell->Id, 1, me->GetGUID()))\n+                {\n+                    //Glyph of Hunter's Mark: +20% effect\n+                    //Improved Hunter's Mark: +30% effect\n+                    if (lvl >= 15)\n+                        mark->ChangeAmount(mark->GetAmount() + mark->GetAmount() / 2);\n+                    else if (lvl >= 10)\n+                        mark->ChangeAmount(mark->GetAmount() * 13 / 10);\n+                }\n+            }\n+            //Improved Stings part 1: +30% damage\n+            if ((GetSpec() == BOT_SPEC_HUNTER_MARKSMANSHIP) && lvl >= 25 && (baseId == SERPENT_STING_1 || baseId == WYVERN_STING_DOT_AURA_1))\n+            {\n+                if (AuraEffect* stin = target->GetAuraEffect(spell->Id, 0, me->GetGUID()))\n+                {\n+                    stin->ChangeAmount(stin->GetAmount() * 13 / 10);\n+                }\n+            }\n+            //Improved Stings part 2: +30% effect: not working?\n+            //Trap Mastery part 1\n+            if (lvl >= 15 && (baseId == FROST_TRAP_AURA || baseId == FREEZING_TRAP_AURA_1))\n+            {\n+                if (Aura* freez = target->GetAura(spell->Id, me->GetGUID()))\n+                {\n+                    int32 dur = freez->GetDuration() * 13 / 10;\n+                    freez->SetDuration(dur);\n+                    freez->SetMaxDuration(dur);\n+                }\n+            }\n+            if (lvl >= 16 && baseId == IMMOLATION_TRAP_AURA_1)\n+            {\n+                if (AuraEffect* immo = target->GetAuraEffect(spell->Id, 0, me->GetGUID()))\n+                {\n+                    //Glyph of Immolation Trap: -6 sec duration, +100% effect\n+                    immo->ChangeAmount(immo->GetAmount() * 2);\n+                    int32 dur = immo->GetBase()->GetDuration() - 6000;\n+                    immo->GetBase()->SetDuration(dur);\n+                    immo->GetBase()->SetMaxDuration(dur);\n+                }\n+            }\n+            if (lvl >= 15 && baseId == SERPENT_STING_1)\n+            {\n+                if (Aura* sting = target->GetAura(spell->Id, me->GetGUID()))\n+                {\n+                    //Glyph of Serpent Sting: +6 sec duration\n+                    //Improved Serpent Sting (24467): +3 sec duration\n+                    int32 dur = sting->GetDuration() + 6000;\n+                    if (lvl >= 60)\n+                        dur += 3000;\n+                    sting->SetDuration(dur);\n+                    sting->SetMaxDuration(dur);\n+                }\n+            }\n+            if (lvl >= 30 && baseId == WING_CLIP_1)\n+            {\n+                //zzzOLD Improved Wing Clip (only on creatures): 30% to root target with Wing Clip\n+                //normal creatures are rooted for 10 sec, elites+ for 6 sec\n+                if (target->IsCreature())\n+                {\n+                    if (urand(1,100) <= 30)\n+                    {\n+                        uint32 clip = target->ToCreature()->GetCreatureTemplate()->rank == CREATURE_ELITE_NORMAL ? IMPROVED_WING_CLIP_NORMAL : IMPROVED_WING_CLIP_EX;\n+                        me->CastSpell(target, clip, true);\n+                    }\n+                }\n+            }\n+            if (lvl >= 10 && baseId == CONCUSSIVE_SHOT_1)\n+            {\n+                //Improved Concussion Shot rank 2: 2 sec increased daze duration\n+                if (Aura* concus = target->GetAura(spell->Id, me->GetGUID()))\n+                {\n+                    int32 dur = concus->GetDuration() + 2000;\n+                    concus->SetDuration(dur);\n+                    concus->SetMaxDuration(dur);\n+                }\n+\n+                //zzzOLD Improved Concussion Shot: chance to stun target for 3 sec\n+                if (urand(1,100) <= 15)\n+                {\n+                    me->CastSpell(target, IMPROVED_CONCUSSION, true);\n+                }\n+            }\n+            if ((GetSpec() == BOT_SPEC_HUNTER_MARKSMANSHIP) && lvl >= 50 && baseId == STEADY_SHOT_1)\n+            {\n+                //Improved Steady Shot: 15% chance\n+                if (urand(1,100) <= 15)\n+                {\n+                    me->CastSpell(me, IMPROVED_STEADY_SHOT_BUFF, true);\n+                }\n+            }\n+\n+            OnSpellHitTarget(target, spell);\n+        }\n+\n+        void SpellHit(WorldObject* wcaster, SpellInfo const* spell) override\n+        {\n+            Unit* caster = wcaster->ToUnit();\n+            if (!caster)\n+                return;\n+\n+            uint32 baseId = spell->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+\n+            //Feign Death should always clear combat on bots\n+            if (baseId == FEIGN_DEATH_1 && me->GetMap()->IsDungeon())\n+                me->CombatStop(false, false);\n+\n+            //Rapid Recuperation (Rapid Killing) hackfix: trigger 2% energize\n+            if (baseId == RAPID_RECUPERATION_ENERGIZE)\n+            {\n+                me->CastSpell(me, RAPID_RECUPERATION_ENERGIZE_PCT_1, true);\n+            }\n+            //Rapid Recuperation (Rapid Fire): match duration\n+            if (baseId == RAPID_RECUPERATION_BUFF && GetSpell(RAPID_FIRE_1))\n+            {\n+                if (Aura const* rapi = me->GetAura(GetSpell(RAPID_FIRE_1)))\n+                {\n+                    if (Aura* recu = me->GetAura(spell->Id))\n+                    {\n+                        uint32 dur = rapi->GetDuration();\n+                        recu->SetDuration(dur);\n+                        recu->SetMaxDuration(dur);\n+                    }\n+                }\n+            }\n+            //Rapid Recuperation (Rapid Fire)\n+            if ((GetSpec() == BOT_SPEC_HUNTER_MARKSMANSHIP) && baseId == RAPID_FIRE_1 && me->GetLevel() >= 45)\n+            {\n+                me->CastSpell(me, RAPID_RECUPERATION_BUFF, true);\n+            }\n+            //Rapid Recuperation (Rapid Killing)\n+            if ((GetSpec() == BOT_SPEC_HUNTER_MARKSMANSHIP) && baseId == RAPID_KILLING_BUFF && me->GetLevel() >= 45)\n+            {\n+                me->CastSpell(me, RAPID_RECUPERATION_BUFF2, true);\n+            }\n+            if (baseId == RAPID_FIRE_1 && lvl >= 26)\n+            {\n+                //Rapid Fire (id 28755): 4 sec increased duration\n+                //Glyph of Rapid Fire: +8% haste\n+                if (AuraEffect* rapi = me->GetAuraEffect(spell->Id, 0, me->GetGUID()))\n+                {\n+                    rapi->ChangeAmount(rapi->GetAmount() + 8);\n+\n+                    uint32 dur = rapi->GetBase()->GetDuration() + 4000;\n+                    rapi->GetBase()->SetDuration(dur);\n+                    rapi->GetBase()->SetMaxDuration(dur);\n+                }\n+            }\n+            if (baseId == QUICK_SHOTS_BUFF)\n+            {\n+                if (AuraEffect* quic = me->GetAuraEffect(QUICK_SHOTS_BUFF, 0))\n+                {\n+                    //base 15% haste\n+                    int32 newAmount = quic->GetAmount() + 15;\n+                    //Glyph of the Hawk: +6% effect flat\n+                    if (lvl >= 15)\n+                        newAmount += 6;\n+\n+                    quic->ChangeAmount(newAmount);\n+                }\n+            }\n+            if ((baseId == ASPECT_OF_THE_CHEETAH_1 || baseId == ASPECT_OF_THE_PACK_1) && caster == me && lvl >= 20)\n+            {\n+                //Pathfinding: +8% increased effect\n+                if (AuraEffect* spee = me->GetAuraEffect(spell->Id, 0, me->GetGUID()))\n+                {\n+                    spee->ChangeAmount(spee->GetAmount() + 8);\n+                }\n+            }\n+            if ((baseId == ASPECT_OF_THE_MONKEY_1 || baseId == ASPECT_OF_THE_DRAGONHAWK_MONKEY) && lvl >= 15)\n+            {\n+                //Improved Aspect of The Monkey: +6% dodge chance\n+                if (AuraEffect* monk = me->GetAuraEffect(spell->Id, 0, me->GetGUID()))\n+                {\n+                    monk->ChangeAmount(monk->GetAmount() + 6);\n+                }\n+            }\n+            //Aspect Mastery\n+            if (lvl >= 20)\n+            {\n+                if (baseId == ASPECT_OF_THE_VIPER_1)\n+                {\n+                    if (AuraEffect* vipe = me->GetAuraEffect(spell->Id, 1, me->GetGUID()))\n+                    {\n+                        //part 1: 10% reduced damage penalty\n+                        vipe->ChangeAmount(vipe->GetAmount() + 10);\n+                    }\n+                }\n+                if (baseId == ASPECT_OF_THE_MONKEY_1 || baseId == ASPECT_OF_THE_DRAGONHAWK_MONKEY)\n+                {\n+                    if (AuraEffect* monk = me->GetAuraEffect(spell->Id, 1, me->GetGUID()))\n+                    {\n+                        //part 2: 5% reduced damage\n+                        monk->ChangeAmount(monk->GetAmount() - 5);\n+                    }\n+                }\n+                if (baseId == ASPECT_OF_THE_HAWK_1 || baseId == ASPECT_OF_THE_DRAGONHAWK_1)\n+                {\n+                    if (AuraEffect* hawk = me->GetAuraEffect(spell->Id, 0, me->GetGUID()))\n+                    {\n+                        //part 3: 30% attack power bonus\n+                        hawk->ChangeAmount(hawk->GetAmount() * 13 / 10);\n+                    }\n+                }\n+            }\n+\n+            OnSpellHit(caster, spell);\n+        }\n+\n+        void OnBotDamageDealt(Unit* victim, uint32 damage, CleanDamage const* cleanDamage, DamageEffectType damagetype, SpellInfo const* /*spellInfo*/) override\n+        {\n+            if (botPet && victim != me && victim != botPet && damage > 0 && cleanDamage && cleanDamage->hitOutCome == MELEE_HIT_CRIT &&\n+                (damagetype == DIRECT_DAMAGE || damagetype == SPELL_DIRECT_DAMAGE) && me->GetLevel() >= 20)\n+            {\n+                //Go for the Throat: energize pet\n+                me->EnergizeBySpell(botPet, GO_FOR_THE_THROAT_ENERGIZE, 50, POWER_FOCUS);\n+                //Frenzy hack: proc from hunter's crits\n+                if (me->GetLevel() >= 35)\n+                    botPet->CastSpell(botPet, FRENZY_BUFF, true);\n+            }\n+        }\n+\n+        void DamageDealt(Unit* victim, uint32& damage, DamageEffectType damageType) override\n+        {\n+            bot_ai::DamageDealt(victim, damage, damageType);\n+        }\n+\n+        void DamageTaken(Unit* u, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo*/) override\n+        {\n+            if (!u)\n+                return;\n+            if (!u->IsInCombat() && !me->IsInCombat())\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void OwnerAttackedBy(Unit* u) override\n+        {\n+            if (!u)\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void SummonBotPet()\n+        {\n+            if (botPet)\n+                UnsummonAll(false);\n+\n+            if (me->GetLevel() < 10)\n+                return;\n+\n+            if (myPetType == BOT_PET_INVALID) //disabled\n+                return;\n+\n+            if (petSummonTimer > GetLastDiff())\n+                return;\n+\n+            uint32 entry;\n+\n+            if (myPetType)\n+                entry = myPetType;\n+            else if (!IAmFree())\n+            {\n+                if ((master->GetGroup() && master->GetGroup()->isRaidGroup()) || master->GetNpcBotsCount() >= 10)\n+                    entry = BOT_PET_WOLF; //raid pet\n+                else if (!IsMeleeClass(master->GetClass()))\n+                    entry = urand(BOT_PET_TENACITY_START, BOT_PET_TENACITY_END);\n+                else if (sWorld->IsFFAPvPRealm() || sWorld->IsPvPRealm())\n+                    entry = urand(BOT_PET_CUNNING_START, BOT_PET_CUNNING_END);\n+                else\n+                    entry = urand(BOT_PET_HUNTER_START, BOT_PET_HUNTER_END_GENERAL);\n+            }\n+            else\n+                entry = urand(BOT_PET_HUNTER_START, BOT_PET_HUNTER_END_GENERAL);\n+\n+            //ensurance\n+            if (entry < BOT_PET_HUNTER_START || entry > BOT_PET_HUNTER_END_EXOTIC ||\n+                (entry >= BOT_PET_EXOTIC_START && _spec != BOT_SPEC_HUNTER_BEASTMASTERY))\n+                entry = 0;\n+\n+            myPetType = entry;\n+\n+            //try next time\n+            if (!myPetType)\n+                return;\n+\n+            petSummonTimer = 10000;\n+            ResetSpellCooldown(KINDRED_SPIRITS_PET);\n+            ResetSpellCooldown(SPIRIT_BOND_PET);\n+\n+            Position pos;\n+\n+            me->CastSpell(me, CALL_PET_VISUAL, true);\n+            Creature* myPet = me->SummonCreature(myPetType, *me, TEMPSUMMON_CORPSE_DESPAWN);\n+            me->GetNearPoint(myPet, pos.m_positionX, pos.m_positionY, pos.m_positionZ, 0, me->GetOrientation() + M_PI / 2);\n+            myPet->GetMotionMaster()->MovePoint(me->GetMapId(), pos);\n+            myPet->SetCreator(master);\n+            myPet->SetOwnerGUID(me->GetGUID());\n+            myPet->SetFaction(master->GetFaction());\n+            myPet->SetControlledByPlayer(!IAmFree());\n+            myPet->SetPvP(me->IsPvP());\n+            myPet->SetByteValue(UNIT_FIELD_BYTES_2, 1, master->GetByteValue(UNIT_FIELD_BYTES_2, 1));\n+\n+            //fix scale\n+            switch (myPetType)\n+            {\n+                case BOT_PET_RAVAGER:\n+                case BOT_PET_WASP:\n+                case BOT_PET_TEROMOTH:\n+                case BOT_PET_SCORPID:\n+                case BOT_PET_TURTLE:\n+                case BOT_PET_BEAR:\n+                case BOT_PET_WARPSTALKER:\n+                case BOT_PET_COREHOUND:\n+                    myPet->SetObjectScale(0.75f);\n+                    break;\n+                case BOT_PET_CHIMAERA:\n+                    myPet->SetObjectScale(0.67f);\n+                    break;\n+                case BOT_PET_RAPTOR:\n+                case BOT_PET_DEVILSAUR:\n+                case BOT_PET_RHINO:\n+                    myPet->SetObjectScale(0.5f);\n+                    break;\n+                default:\n+                    break;\n+            }\n+\n+            botPet = myPet;\n+        }\n+\n+        void UnsummonAll(bool savePets = true) override\n+        {\n+            UnsummonPet(savePets);\n+        }\n+\n+        void SummonedCreatureDies(Creature* /*summon*/, Unit* /*killer*/) override\n+        {\n+            //BOT_LOG_ERROR(\"entities.unit\", \"SummonedCreatureDies: {}'s {}\", me->GetName(), summon->GetName());\n+            //if (summon == botPet)\n+            //    botPet = nullptr;\n+        }\n+\n+        void SummonedCreatureDespawn(Creature* summon) override\n+        {\n+            //all hunter bot pets despawn at death or manually (gossip, teleport, etc.)\n+            //BOT_LOG_ERROR(\"entities.unit\", \"SummonedCreatureDespawn: {}'s {}\", me->GetName(), summon->GetName());\n+            if (summon == botPet)\n+            {\n+                petSummonTimer = 10000;\n+                botPet = nullptr;\n+            }\n+        }\n+\n+        float GetSpellAttackRange(bool longRange) const override\n+        {\n+            return longRange ? CalcSpellMaxRange(AUTO_SHOT_1) : 25.f;\n+        }\n+\n+        uint32 GetAIMiscValue(uint32 data) const override\n+        {\n+            switch (data)\n+            {\n+                case BOTAI_MISC_PET_TYPE:\n+                    return myPetType;\n+                case BOTAI_MISC_PET_AVAILABLE_1:\n+                    return BOT_PET_WOLF;\n+                case BOTAI_MISC_PET_AVAILABLE_2:\n+                    return BOT_PET_CUNNING_START;\n+                case BOTAI_MISC_PET_AVAILABLE_3:\n+                    return BOT_PET_FEROCITY_START;\n+                case BOTAI_MISC_PET_AVAILABLE_4:\n+                    return BOT_PET_TENACITY_START;\n+                case BOTAI_MISC_PET_AVAILABLE_5:\n+                    return _spec == BOT_SPEC_HUNTER_BEASTMASTERY && me->GetLevel() >= 80 ? BOT_PET_SILITHID : 0;\n+                case BOTAI_MISC_PET_AVAILABLE_6:\n+                    return _spec == BOT_SPEC_HUNTER_BEASTMASTERY && me->GetLevel() >= 80 ? BOT_PET_CHIMAERA : 0;\n+                case BOTAI_MISC_PET_AVAILABLE_7:\n+                    return _spec == BOT_SPEC_HUNTER_BEASTMASTERY && me->GetLevel() >= 80 ? BOT_PET_SPIRITBEAST : 0;\n+                case BOTAI_MISC_PET_AVAILABLE_8:\n+                    return _spec == BOT_SPEC_HUNTER_BEASTMASTERY && me->GetLevel() >= 80 ? BOT_PET_COREHOUND : 0;\n+                case BOTAI_MISC_PET_AVAILABLE_9:\n+                    return _spec == BOT_SPEC_HUNTER_BEASTMASTERY && me->GetLevel() >= 80 ? BOT_PET_DEVILSAUR : 0;\n+                case BOTAI_MISC_PET_AVAILABLE_10:\n+                    return _spec == BOT_SPEC_HUNTER_BEASTMASTERY && me->GetLevel() >= 80 ? BOT_PET_RHINO : 0;\n+                case BOTAI_MISC_PET_AVAILABLE_11:\n+                    return _spec == BOT_SPEC_HUNTER_BEASTMASTERY && me->GetLevel() >= 80 ? BOT_PET_WORM : 0;\n+                case BOTAI_MISC_AURA_TYPE:\n+                    return _myaspect;\n+                    break;\n+                default:\n+                    return 0;\n+            }\n+        }\n+\n+        void SetAIMiscValue(uint32 data, uint32 value) override\n+        {\n+            switch (data)\n+            {\n+                case BOTAI_MISC_PET_TYPE:\n+                    myPetType = value;\n+                    UnsummonAll(false);\n+                    break;\n+                default:\n+                    break;\n+            }\n+\n+            bot_ai::SetAIMiscValue(data, value);\n+        }\n+\n+        void Reset() override\n+        {\n+            UnsummonAll(false);\n+\n+            trapTimer = 0;\n+            stingTimer = 0;\n+            aspectTimer = 0;\n+            flareTimer = 0;\n+            misdirectionTimer = 0;\n+            checkMendTimer = 0;\n+\n+            petSummonTimer = 5000;\n+\n+            _myaspect = 0;\n+\n+            DefaultInit();\n+        }\n+\n+        void ReduceCD(uint32 diff) override\n+        {\n+            if (trapTimer > diff)                   trapTimer -= diff;\n+            if (stingTimer > diff)                  stingTimer -= diff;\n+            if (aspectTimer > diff)                 aspectTimer -= diff;\n+            if (flareTimer > diff)                  flareTimer -= diff;\n+            if (misdirectionTimer > diff)           misdirectionTimer -= diff;\n+            if (checkMendTimer > diff)              checkMendTimer -= diff;\n+\n+            if (petSummonTimer > diff)              petSummonTimer -= diff;\n+        }\n+\n+        void InitPowers() override\n+        {\n+            me->SetPowerType(POWER_MANA);\n+\n+            if (botPet && botPet->GetPowerType() != POWER_FOCUS)\n+                botPet->SetByteValue(UNIT_FIELD_BYTES_0, 3, POWER_FOCUS);\n+        }\n+\n+        void InitSpells() override\n+        {\n+            uint8 lvl = me->GetLevel();\n+            //bool isBeas = GetSpec() == BOT_SPEC_HUNTER_BEASTMASTERY;\n+            bool isMark = GetSpec() == BOT_SPEC_HUNTER_MARKSMANSHIP;\n+            bool isSurv = GetSpec() == BOT_SPEC_HUNTER_SURVIVAL;\n+\n+            InitSpellMap(AUTO_SHOT_1);\n+            InitSpellMap(ARCANE_SHOT_1);\n+            InitSpellMap(TRANQ_SHOT_1);\n+            InitSpellMap(STEADY_SHOT_1);\n+            InitSpellMap(KILL_SHOT_1);\n+            InitSpellMap(MULTISHOT_1);\n+            InitSpellMap(VOLLEY_1);\n+            InitSpellMap(CONCUSSIVE_SHOT_1);\n+            InitSpellMap(DISTRACTING_SHOT_1);\n+            InitSpellMap(SERPENT_STING_1);\n+            InitSpellMap(SCORPID_STING_1);\n+            InitSpellMap(VIPER_STING_1);\n+            InitSpellMap(RAPID_FIRE_1);\n+            InitSpellMap(FLARE_1);\n+            InitSpellMap(WING_CLIP_1);\n+            InitSpellMap(RAPTOR_STRIKE_1);\n+            InitSpellMap(MONGOOSE_BITE_1);\n+            InitSpellMap(DISENGAGE_1);\n+            InitSpellMap(IMMOLATION_TRAP_1);\n+            InitSpellMap(FREEZING_TRAP_1);\n+            InitSpellMap(FROST_TRAP_1);\n+            InitSpellMap(EXPLOSIVE_TRAP_1);\n+            InitSpellMap(FREEZING_ARROW_1);\n+            InitSpellMap(HUNTERS_MARK_1);\n+            InitSpellMap(SCARE_BEAST_1);\n+            InitSpellMap(FEIGN_DEATH_1);\n+            InitSpellMap(DETERRENCE_1);\n+            InitSpellMap(MISDIRECTION_1);\n+            InitSpellMap(MEND_PET_1);\n+\n+            InitSpellMap(ASPECT_OF_THE_MONKEY_1);\n+            InitSpellMap(ASPECT_OF_THE_HAWK_1);\n+            InitSpellMap(ASPECT_OF_THE_CHEETAH_1);\n+            InitSpellMap(ASPECT_OF_THE_VIPER_1);\n+            //InitSpellMap(ASPECT_OF_THE_BEAST_1);\n+            InitSpellMap(ASPECT_OF_THE_PACK_1);\n+            InitSpellMap(ASPECT_OF_THE_WILD_1);\n+            InitSpellMap(ASPECT_OF_THE_DRAGONHAWK_1);\n+\n+  /*Talent*/lvl >= (isMark ? 20 : 70) ? InitSpellMap(AIMED_SHOT_1) : RemoveSpell(AIMED_SHOT_1);\n+  /*Talent*/lvl >= 30 && isMark ? InitSpellMap(READINESS_1) : RemoveSpell(READINESS_1);\n+  /*Talent*/lvl >= 40 && isMark ? InitSpellMap(TRUESHOT_AURA_1) : RemoveSpell(TRUESHOT_AURA_1);\n+  /*Talent*/lvl >= 50 && isMark ? InitSpellMap(SILENCING_SHOT_1) : RemoveSpell(SILENCING_SHOT_1);\n+  /*Talent*/lvl >= 60 && isMark ? InitSpellMap(CHIMERA_SHOT_1) : RemoveSpell(CHIMERA_SHOT_1);\n+\n+  /*Talent*/lvl >= (isSurv ? 20 : isMark ? 70 : 99) ? InitSpellMap(SCATTER_SHOT_1) : RemoveSpell(SCATTER_SHOT_1);\n+  /*Talent*/lvl >= 30 && isSurv ? InitSpellMap(COUNTERATTACK_1) : RemoveSpell(COUNTERATTACK_1);\n+  /*Talent*/lvl >= 40 && isSurv ? InitSpellMap(WYVERN_STING_1) : RemoveSpell(WYVERN_STING_1);\n+  /*Talent*/lvl >= 50 && isSurv ? InitSpellMap(BLACK_ARROW_1) : RemoveSpell(BLACK_ARROW_1);\n+  /*Talent*/lvl >= 60 && isSurv ? InitSpellMap(EXPLOSIVE_SHOT_1) : RemoveSpell(EXPLOSIVE_SHOT_1);\n+        }\n+\n+        void ApplyClassPassives() const override\n+        {\n+            uint8 level = master->GetLevel();\n+            bool isBeas = GetSpec() == BOT_SPEC_HUNTER_BEASTMASTERY;\n+            bool isMark = GetSpec() == BOT_SPEC_HUNTER_MARKSMANSHIP;\n+            bool isSurv = GetSpec() == BOT_SPEC_HUNTER_SURVIVAL;\n+\n+            RefreshAura(IMPROVED_MEND_PET, isBeas && level >= 25 ? 1 : 0);\n+\n+            RefreshAura(RAPID_KILLING, isMark && level >= 20 ? 1 : 0);\n+            RefreshAura(CONCUSSIVE_BARRAGE, isMark && level >= 30 ? 1 : 0);\n+            RefreshAura(PIERCING_SHOTS, isMark && level >= 40 ? 1 : 0);\n+            //RefreshAura(TRUESHOT_AURA, isMark && level >= 40 ? 1 : 0);\n+            RefreshAura(MASTER_MARKSMAN, isMark && level >= 45 ? 1 : 0);\n+            RefreshAura(WILD_QUIVER, isMark && level >= 50 ? 1 : 0);\n+\n+            RefreshAura(SUREFOOTED, level >= 15 ? 1 : 0);\n+            RefreshAura(ENTRAPMENT, isSurv && level >= 15 ? 1 : 0);\n+            RefreshAura(LOCK_AND_LOAD, isSurv && level >= 25 ? 1 : 0);\n+            RefreshAura(EXPOSE_WEAKNESS, isSurv && level >= 40 ? 1 : 0);\n+            RefreshAura(THRILL_OF_THE_HUNT, isSurv && level >= 40 ? 1 : 0);\n+            RefreshAura(MASTER_TACTICIAN5, isSurv && level >= 50 ? 1 : 0);\n+            RefreshAura(MASTER_TACTICIAN4, isSurv && level >= 49 && level < 50 ? 1 : 0);\n+            RefreshAura(MASTER_TACTICIAN3, isSurv && level >= 48 && level < 49 ? 1 : 0);\n+            RefreshAura(MASTER_TACTICIAN2, isSurv && level >= 47 && level < 48 ? 1 : 0);\n+            RefreshAura(MASTER_TACTICIAN1, isSurv && level >= 46 && level < 47 ? 1 : 0);\n+            RefreshAura(NOXIOUS_STINGS, isSurv && level >= 45 ? 1 : 0);\n+            RefreshAura(SNIPER_TRAINING, isSurv && level >= 50 ? 1 : 0);\n+\n+            RefreshAura(GLYPH_RAPTOR_STRIKE, level >= 15 ? 1 : 0);\n+            RefreshAura(GLYPH_ASPECT_OF_THE_VIPER, level >= 20 ? 1 : 0);\n+            RefreshAura(GLYPH_FREEZING_TRAP, level >= 20 ? 1 : 0);\n+            RefreshAura(GLYPH_EXPLOSIVE_TRAP, level >= 34 ? 1 : 0);\n+\n+            RefreshAura(HUNTER_T8_P2, level >= 70 ? 1 : 0);\n+            RefreshAura(HUNTER_T10_P2, level >= 75 ? 1 : 0);\n+            RefreshAura(HUNTER_T10_P4, level >= 80 ? 1 : 0);\n+        }\n+\n+        bool CanUseManually(uint32 basespell) const override\n+        {\n+            switch (basespell)\n+            {\n+                //case RAPID_FIRE_1:\n+                case FLARE_1:\n+                case MEND_PET_1:\n+                case IMMOLATION_TRAP_1:\n+                case FREEZING_TRAP_1:\n+                case FROST_TRAP_1:\n+                case EXPLOSIVE_TRAP_1:\n+                case VOLLEY_1:\n+                //case ASPECT_OF_THE_MONKEY_1:\n+                //case ASPECT_OF_THE_HAWK_1:\n+                //case ASPECT_OF_THE_CHEETAH_1:\n+                //case ASPECT_OF_THE_VIPER_1:\n+                //case ASPECT_OF_THE_BEAST_1:\n+                case ASPECT_OF_THE_PACK_1:\n+                case ASPECT_OF_THE_WILD_1:\n+                //case ASPECT_OF_THE_DRAGONHAWK_1:\n+                    return true;\n+                default:\n+                    return false;\n+            }\n+        }\n+\n+        bool HasAbilitiesSpecifics() const override { return true; }\n+        void FillAbilitiesSpecifics(Player const* player, std::list<std::string> &specList) override\n+        {\n+            uint32 textId;\n+            switch (_myaspect)\n+            {\n+                case ASPECT_OF_THE_MONKEY_1:     textId = BOT_TEXT_MONKEY;     break;\n+                case ASPECT_OF_THE_HAWK_1:       textId = BOT_TEXT_HAWK;       break;\n+                case ASPECT_OF_THE_CHEETAH_1:    textId = BOT_TEXT_CHEETAH;    break;\n+                case ASPECT_OF_THE_VIPER_1:      textId = BOT_TEXT_VIPER;      break;\n+                case ASPECT_OF_THE_BEAST_1:      textId = BOT_TEXT_BEAST;      break;\n+                case ASPECT_OF_THE_PACK_1:       textId = BOT_TEXT_PACK;       break;\n+                case ASPECT_OF_THE_WILD_1:       textId = BOT_TEXT_WILD;       break;\n+                case ASPECT_OF_THE_DRAGONHAWK_1: textId = BOT_TEXT_DRAGONHAWK; break;\n+                default:                         textId = BOT_TEXT_NOASPECT;   break;\n+            }\n+            specList.push_back(LocalizedNpcText(player, BOT_TEXT_ASPECT) + \": \" + LocalizedNpcText(player, textId));\n+        }\n+\n+        std::vector<uint32> const* GetDamagingSpellsList() const override\n+        {\n+            return &Hunter_spells_damage;\n+        }\n+        std::vector<uint32> const* GetCCSpellsList() const override\n+        {\n+            return &Hunter_spells_cc;\n+        }\n+        //std::vector<uint32> const* GetHealingSpellsList() const override\n+        //{\n+        //    return &Hunter_spells_heal;\n+        //}\n+        std::vector<uint32> const* GetSupportSpellsList() const override\n+        {\n+            return &Hunter_spells_support;\n+        }\n+\n+    private:\n+        uint32 trapTimer, stingTimer, aspectTimer, flareTimer, misdirectionTimer, checkMendTimer;\n+        uint32 _myaspect;\n+        //Pet\n+        uint32 myPetType;\n+        uint32 petSummonTimer;\n+\n+        //Scans target for hunter's aspects\n+        //returns applied aspects mask\n+        //used for finding out which aspects target lacks\n+        uint32 _getAspectsMask(std::map<uint32 /*type*/, uint32 /*curId*/>& idMap) const\n+        {\n+            uint32 mask = 0;\n+\n+            for (auto const& [spellId, auraApp] : me->GetAppliedAuras())\n+            {\n+                bool isAspect = true;\n+                uint32 baseId = auraApp->GetBase()->GetSpellInfo()->GetFirstRankSpell()->Id;\n+                switch (baseId)\n+                {\n+                    //case ASPECT_OF_THE_MONKEY_1:\n+                    //    mask |= SPECIFIC_ASPECT_MONKEY;\n+                    //    break;\n+                    case ASPECT_OF_THE_HAWK_1:\n+                        mask |= SPECIFIC_ASPECT_HAWK;\n+                        break;\n+                    case ASPECT_OF_THE_CHEETAH_1:\n+                        mask |= SPECIFIC_ASPECT_CHEETAH;\n+                        break;\n+                    //case ASPECT_OF_THE_VIPER_1:\n+                    //    mask |= SPECIFIC_ASPECT_VIPER;\n+                    //    break;\n+                    //case ASPECT_OF_THE_BEAST_1:\n+                    //    mask |= SPECIFIC_ASPECT_BEAST;\n+                    //    break;\n+                    case ASPECT_OF_THE_PACK_1:\n+                        mask |= SPECIFIC_ASPECT_PACK;\n+                        break;\n+                    case ASPECT_OF_THE_WILD_1:\n+                        mask |= SPECIFIC_ASPECT_WILD;\n+                        break;\n+                    case ASPECT_OF_THE_DRAGONHAWK_1:\n+                        mask |= SPECIFIC_ASPECT_DRAGONHAWK;\n+                        break;\n+                    default:\n+                        isAspect = false; //next aura\n+                        break;\n+                }\n+\n+                if (isAspect)\n+                {\n+                    idMap[baseId] = spellId;\n+                    if (auraApp->GetBase()->GetCasterGUID() == me->GetGUID())\n+                        mask |= SPECIFIC_ASPECT_MY_ASPECT;\n+                }\n+            }\n+\n+            return mask;\n+        }\n+    };\n+};\n+\n+void AddSC_hunter_bot()\n+{\n+    new hunter_bot();\n+}\ndiff --git a/src/server/game/AI/NpcBots/bot_mage_ai.cpp b/src/server/game/AI/NpcBots/bot_mage_ai.cpp\nnew file mode 100644\nindex 0000000000..047f88c1b0\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bot_mage_ai.cpp\n@@ -0,0 +1,1852 @@\n+#include \"bot_ai.h\"\n+#include \"botlogtraits.h\"\n+#include \"botmgr.h\"\n+#include \"botspell.h\"\n+#include \"bottraits.h\"\n+#include \"Containers.h\"\n+#include \"GameEventMgr.h\"\n+#include \"Group.h\"\n+#include \"Item.h\"\n+#include \"Map.h\"\n+#include \"MotionMaster.h\"\n+#include \"ObjectAccessor.h\"\n+#include \"ObjectMgr.h\"\n+#include \"Player.h\"\n+#include \"ScriptMgr.h\"\n+#include \"Spell.h\"\n+#include \"SpellAuraEffects.h\"\n+#include \"SpellMgr.h\"\n+#include \"TemporarySummon.h\"\n+/*\n+Mage NpcBot (reworked by Trickerer onlysuffering@gmail.com)\n+Complete - 92-97%\n+TODO: slow (pvp), mana shield\n+*/\n+\n+enum MageBaseSpells\n+{\n+    DAMPENMAGIC_1                       = 604,\n+    AMPLIFYMAGIC_1                      = 1008,//manual use only\n+    ARCANEINTELLECT_1                   = 1459,\n+    ARCANEMISSILES_1                    = 5143,\n+    ARCANE_BLAST_1                      = 30451,\n+    POLYMORPH_1                         = 118,\n+    COUNTERSPELL_1                      = 2139,\n+    SPELLSTEAL_1                        = 30449,\n+    EVOCATION_1                         = 12051,\n+    BLINK_1                             = 1953,\n+    REMOVE_CURSE_1                      = 475,\n+    INVISIBILITY_1                      = 66,\n+    SCORCH_1                            = 2948,\n+    BLAST_WAVE_1                        = 11113,\n+    DRAGON_BREATH_1                     = 31661,\n+    FIRE_BLAST_1                        = 2136,\n+    PYROBLAST_1                         = 11366,\n+    LIVING_BOMB_1                       = 44457,\n+    FLAMESTRIKE_1                       = 2120,\n+    COMBUSTION_1                        = 11129,\n+    FROSTFIRE_BOLT_1                    = 44614,\n+    FIREBALL_1                          = 133,\n+    FROSTBOLT_1                         = 116,\n+    FROST_NOVA_1                        = 122,\n+    CONE_OF_COLD_1                      = 120,\n+    BLIZZARD_1                          = 10,\n+    FROST_ARMOR_1                       = 168,\n+    ICE_ARMOR_1                         = 7302,\n+    MOLTEN_ARMOR_1                      = 30482,\n+    ICE_BARRIER_1                       = 11426,\n+    ICE_BLOCK_1                         = 45438,\n+    FOCUS_MAGIC_1                       = 54646,\n+    PRESENCE_OF_MIND_1                  = 12043,\n+    ARCANE_POWER_1                      = 12042,\n+    SLOW_FALL_1                         = 130,\n+    ICE_LANCE_1                         = 30455,\n+    ICY_VEINS_1                         = 12472,\n+    COLD_SNAP_1                         = 11958,\n+    DEEP_FREEZE_1                       = 44572,\n+    FROST_WARD_1                        = 6143,\n+    FIRE_WARD_1                         = 543,\n+    MIRROR_IMAGE_1                      = 55342,\n+    //Special\n+    ARCANE_MISSILES_DAMAGE_1            = 7268,\n+    BLIZZARD_DAMAGE_1                   = 42208,\n+    LIVING_BOMB_DAMAGE_1                = 44461,\n+    CONJURE_MANA_GEM_1                  = 759,\n+    MANA_GEM_1                          = 5405,\n+    RITUAL_OF_REFRESHMENT_1             = 43987,\n+\n+    SUMMON_WATER_ELEMENTAL_1            = 31687\n+};\n+\n+enum MagePassives\n+{\n+//Talents\n+    FROSTBITE1                          = 11071,\n+    FROSTBITE2                          = 12496,\n+    FROSTBITE3                          = 12497,\n+    ARCANE_CONCENTRATION                = 12577,//rank 5, clearcast\n+    IGNITE                              = 12848,//rank 5\n+    BURNING_DETERMINATION               = 54749,//rank 2\n+    FROST_WARDING                       = 28332,//rank 2\n+    IMPROVED_COUNTERSPELL1              = 11255,\n+    IMPROVED_COUNTERSPELL2              = 12598,\n+    ARCANE_MEDITATION                   = 18464,//rank 3\n+    TORMENT_THE_WEAK                    = 55340,//rank 3\n+    IMPACT                              = 12358,//rank 3\n+    IMPROVED_BLIZZARD                   = 12488,//rank 3\n+    IMPROVED_SCORCH                     = 12873,//rank 3\n+    MOLTEN_SHIELDS                      = 13043,//rank 2\n+    MASTER_OF_ELEMENTS                  = 29076,//rank 3\n+    SHATTER1                            = 11170,\n+    SHATTER2                            = 12982,\n+    SHATTER3                            = 12983,\n+    ARCANE_POTENCY1                     = 31571,\n+    ARCANE_POTENCY2                     = 31572,\n+    BLAZING_SPEED                       = 31642,//rank 2\n+    WINTERS_CHILL1                      = 11180,\n+    WINTERS_CHILL2                      = 28592,\n+    WINTERS_CHILL3                      = 28593,\n+    ARCANE_EMPOWERMENT                  = 31583,//rank 3\n+    INCANTERS_ABSORPTION1               = 44394,\n+    INCANTERS_ABSORPTION2               = 44395,\n+    INCANTERS_ABSORPTION3               = 44396,\n+    MISSILE_BARRAGE                     = 54490,//rank 5\n+    PYROMANIAC                          = 34296,//rank 3\n+    SHATTERED_BARRIER                   = 54787,//rank 2\n+    //ARCTIC_WINDS                        = 31678,//rank 5\n+    FINGERS_OF_FROST                    = 44545,//rank 2\n+    FIRESTARTER1                        = 44442,\n+    FIRESTARTER2                        = 44443,\n+    HOT_STREAK                          = 44448,//rank 3\n+    BRAIN_FREEZE1                       = 44546,\n+    BRAIN_FREEZE2                       = 44548,\n+    BRAIN_FREEZE3                       = 44549,\n+\n+    GLYPH_POLYMORPH                     = 56375,\n+    GLYPG_REMOVE_CURSE                  = 56364,\n+    GLYPH_ICY_VEINS                     = 56374,\n+    GLYPH_LIVING_BOMB                   = 63091,\n+    GLYPH_ICE_LANCE                     = 56377\n+};\n+enum MageSpecial\n+{\n+    ARCANE_CONCENTRATION_BUFF           = 12536,\n+    IMPACT_BUFF                         = 64343,\n+    FIRESTARTER_BUFF                    = 54741,\n+    ARCANE_POTENCY_BUFF1                = 57529,\n+    ARCANE_POTENCY_BUFF2                = 57531,\n+    COMBUSTION_BUFF                     = 28682,\n+    BRAIN_FREEZE_BUFF                   = 57761,\n+    HOT_STREAK_BUFF                     = 48108,\n+    FINGERS_OF_FROST_BUFF               = 44544,\n+    ARCANE_BLAST_DEBUFF                 = 36032,\n+    MISSILE_BARRAGE_BUFF                = 44401,\n+    IMPROVED_BLIZZARD_CHILL             = 12486,//rank 3\n+    FROSTBITE_TRIGGERED                 = 12494,\n+    WINTERS_CHILL_TRIGGERED             = 12579,\n+    IGNITE_TRIGGERED                    = 12654\n+};\n+\n+static const std::vector<uint32> Mage_spells_damage\n+{ ARCANEMISSILES_1, ARCANE_BLAST_1, BLAST_WAVE_1, BLIZZARD_1, CONE_OF_COLD_1, DEEP_FREEZE_1, DRAGON_BREATH_1, FIREBALL_1,\n+FIRE_BLAST_1, FLAMESTRIKE_1, FROSTBOLT_1, FROSTFIRE_BOLT_1, FROST_NOVA_1, ICE_LANCE_1, LIVING_BOMB_1, PYROBLAST_1, SCORCH_1 };\n+static const std::vector<uint32> Mage_spells_cc{ COUNTERSPELL_1, DRAGON_BREATH_1, DEEP_FREEZE_1, FROST_NOVA_1, POLYMORPH_1 };\n+static const std::vector<uint32> Mage_spells_support\n+{ AMPLIFYMAGIC_1, ARCANEINTELLECT_1, BLINK_1, COMBUSTION_1, DAMPENMAGIC_1, EVOCATION_1, FIRE_WARD_1, FROST_WARD_1,\n+FROST_ARMOR_1, FOCUS_MAGIC_1, ICE_BARRIER_1, ICE_BLOCK_1, ICY_VEINS_1, INVISIBILITY_1, ICE_ARMOR_1, MOLTEN_ARMOR_1,\n+SLOW_FALL_1, SPELLSTEAL_1, REMOVE_CURSE_1, CONJURE_MANA_GEM_1, RITUAL_OF_REFRESHMENT_1, SUMMON_WATER_ELEMENTAL_1,\n+COLD_SNAP_1, PRESENCE_OF_MIND_1, ARCANE_POWER_1 };\n+\n+class mage_bot : public CreatureScript\n+{\n+public:\n+    mage_bot() : CreatureScript(\"mage_bot\") { }\n+\n+    CreatureAI* GetAI(Creature* creature) const override\n+    {\n+        return new mage_botAI(creature);\n+    }\n+/*\n+    bool OnGossipHello(Player* player, Creature* creature)\n+    {\n+        return creature->GetBotAI()->OnGossipHello(player, 0);\n+    }\n+\n+    bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action)\n+    {\n+        if (bot_ai* ai = creature->GetBotAI())\n+            return ai->OnGossipSelect(player, creature, sender, action);\n+        return true;\n+    }\n+\n+    bool OnGossipSelectCode(Player* player, Creature* creature, uint32 sender, uint32 action, char const* code)\n+    {\n+        if (bot_ai* ai = creature->GetBotAI())\n+            return ai->OnGossipSelectCode(player, creature, sender, action, code);\n+        return true;\n+    }\n+*/\n+    struct mage_botAI : public bot_ai\n+    {\n+        mage_botAI(Creature* creature) : bot_ai(creature)\n+        {\n+            _botclass = BOT_CLASS_MAGE;\n+\n+            InitUnitFlags();\n+        }\n+\n+        bool doCast(Unit* victim, uint32 spellId)\n+        {\n+            if (CheckBotCast(victim, spellId) != SPELL_CAST_OK)\n+                return false;\n+            return bot_ai::doCast(victim, spellId);\n+        }\n+\n+        void JustEnteredCombat(Unit* u) override { canFrostWard = false; canFireWard = false; bot_ai::JustEnteredCombat(u); }\n+        void KilledUnit(Unit* u) override { bot_ai::KilledUnit(u); }\n+        void EnterEvadeMode(EvadeReason why = EVADE_REASON_OTHER) override { bot_ai::EnterEvadeMode(why); }\n+        void MoveInLineOfSight(Unit* u) override { bot_ai::MoveInLineOfSight(u); }\n+        void JustDied(Unit* u) override { UnsummonAll(false); bot_ai::JustDied(u); }\n+\n+        void StartAttack(Unit* u, bool force = false)\n+        {\n+            if (!bot_ai::StartAttack(u, force))\n+                return;\n+            GetInPosition(force, u);\n+        }\n+\n+        void Counter(uint32 diff)\n+        {\n+            //skip if evocation, blizzard\n+            if (IsChanneling() || Rand() > 30)\n+                return;\n+\n+            if (IsSpellReady(COUNTERSPELL_1, diff, false))\n+            {\n+                if (Unit* target = FindCastingTarget(CalcSpellMaxRange(COUNTERSPELL_1), 0, COUNTERSPELL_1))\n+                {\n+                    me->InterruptNonMeleeSpells(false);\n+                    if (doCast(target, GetSpell(COUNTERSPELL_1)))\n+                        return;\n+                }\n+            }\n+            if (IsSpellReady(DEEP_FREEZE_1, diff) && me->HasAuraType(SPELL_AURA_ABILITY_IGNORE_AURASTATE))\n+            {\n+                if (Unit* target = FindCastingTarget(CalcSpellMaxRange(DEEP_FREEZE_1), 0, DEEP_FREEZE_1))\n+                {\n+                    me->InterruptNonMeleeSpells(false);\n+                    if (doCast(target, GetSpell(DEEP_FREEZE_1)))\n+                        return;\n+                }\n+            }\n+            if (IsSpellReady(FIRE_BLAST_1, diff) && me->HasAura(IMPACT_BUFF))\n+            {\n+                if (Unit* target = FindCastingTarget(CalcSpellMaxRange(FIRE_BLAST_1), 0, FIRE_BLAST_1))\n+                {\n+                    me->InterruptNonMeleeSpells(false);\n+                    if (doCast(target, GetSpell(FIRE_BLAST_1)))\n+                        return;\n+                }\n+            }\n+            if (!IsCasting() && IsSpellReady(POLYMORPH_1, diff))\n+            {\n+                if (Unit* target = FindCastingTarget(CalcSpellMaxRange(POLYMORPH_1), 0, POLYMORPH_1, 75))\n+                {\n+                    if (doCast(target, GetSpell(POLYMORPH_1)))\n+                        return;\n+                }\n+            }\n+        }\n+\n+        void CheckSpellSteal(uint32 diff)\n+        {\n+            if (!IsSpellReady(SPELLSTEAL_1, diff) || IsCasting() || Rand() > 15)\n+                return;\n+\n+            Unit* target = FindHostileDispelTarget(CalcSpellMaxRange(SPELLSTEAL_1), true);\n+            if (target && doCast(target, GetSpell(SPELLSTEAL_1)))\n+                return;\n+        }\n+\n+        void DoNonCombatActions(uint32 diff)\n+        {\n+            if (GC_Timer > diff || me->IsMounted() || Feasting() || Rand() > 25)\n+                return;\n+\n+            //slow fall\n+            if (GetSpell(SLOW_FALL_1) && !IAmFree())\n+            {\n+                Player* fPlayer = nullptr;\n+                Group const* gr = master->GetGroup();\n+                if (gr)\n+                {\n+                    for (GroupReference const* ref = gr->GetFirstMember(); ref != nullptr; ref = ref->next())\n+                    {\n+                        Player* pl = ref->GetSource();\n+                        if (pl && pl->IsAlive() && pl->FindMap() == me->GetMap() && pl->GetDistance(me) < 30 &&\n+                            pl->IsFalling() && pl->m_movementInfo.fallTime > 1000 &&\n+                            !pl->HasAuraType(SPELL_AURA_FEATHER_FALL))\n+                        {\n+                            fPlayer = pl;\n+                            break;\n+                        }\n+                    }\n+                }\n+                else if (master->IsAlive() && master->GetDistance(me) < 30 && master->IsFalling() &&\n+                    master->m_movementInfo.fallTime > 1000 && !master->HasAuraType(SPELL_AURA_FEATHER_FALL))\n+                    fPlayer = master;\n+\n+                if (fPlayer && doCast(fPlayer, GetSpell(SLOW_FALL_1)))\n+                    return;\n+            }\n+\n+            //ARMOR\n+            uint32 MOLTENARMOR = HasRole(BOT_ROLE_DPS) ? GetSpell(MOLTEN_ARMOR_1) : GetSpell(ICE_ARMOR_1);\n+            uint32 ICEARMOR = GetSpell(ICE_ARMOR_1) ? GetSpell(ICE_ARMOR_1) : GetSpell(FROST_ARMOR_1);\n+            uint32 ARMOR = !MOLTENARMOR ? ICEARMOR : (me->GetMap()->IsDungeon() || !ICEARMOR) ? MOLTENARMOR : ICEARMOR;\n+            if (ARMOR && !me->HasAura(ARMOR))\n+            {\n+                if (doCast(me, ARMOR))\n+                    return;\n+            }\n+\n+            if (GetSpell(CONJURE_MANA_GEM_1))\n+            {\n+                if (manaGemCharges == 0 &&\n+                    doCast(me, GetSpell(CONJURE_MANA_GEM_1)))\n+                    return;\n+            }\n+            if (GetSpell(DAMPENMAGIC_1))\n+            {\n+                if (!me->HasAuraTypeWithFamilyFlags(SPELL_AURA_MOD_DAMAGE_TAKEN, SPELLFAMILY_MAGE, 0x2000)\n+                    /*!HasAuraName(me, DAMPENMAGIC_1)*/ &&\n+                    doCast(me, GetSpell(DAMPENMAGIC_1)))\n+                    return;\n+            }\n+        }\n+\n+        bool BuffTarget(Unit* target, uint32 /*diff*/) override\n+        {\n+            if (me->IsInCombat() && !master->GetMap()->IsRaid()) return false;\n+\n+            if (GetSpell(ARCANEINTELLECT_1) && target->GetMaxPower(POWER_MANA) > 1 &&\n+                !target->HasAuraTypeWithFamilyFlags(SPELL_AURA_MOD_STAT, SPELLFAMILY_MAGE, 0x400)\n+                /*!HasAuraName(target, ARCANEINTELLECT_1)*/)\n+            {\n+                if (doCast(target, GetSpell(ARCANEINTELLECT_1)))\n+                    return true;\n+            }\n+\n+            return false;\n+        }\n+\n+        void UpdateAI(uint32 diff) override\n+        {\n+            if (!GlobalUpdate(diff))\n+                return;\n+\n+            DoVehicleActions(diff);\n+            if (!CanBotAttackOnVehicle())\n+                return;\n+\n+            CheckPots(diff);\n+\n+            CheckPoly(diff);\n+            CheckBlink(diff);\n+            CheckIceBlock(diff);\n+\n+            CheckRacials(diff);\n+\n+            CheckShield(diff);\n+            CureGroup(GetSpell(REMOVE_CURSE_1), diff);\n+            CheckWard(diff);\n+\n+            CheckFocusMagic(diff);\n+            BuffAndHealGroup(diff);\n+\n+            if (!me->IsInCombat())\n+                DoNonCombatActions(diff);\n+\n+            //pet\n+            if ((!botPet || !botPet->IsAlive()) &&\n+                IsSpellReady(SUMMON_WATER_ELEMENTAL_1, diff) && !IsCasting() && (IAmFree() || master->IsInCombat()))\n+                if (doCast(me, GetSpell(SUMMON_WATER_ELEMENTAL_1)))\n+                    return;\n+\n+            if (ProcessImmediateNonAttackTarget())\n+                return;\n+\n+            if (!CheckAttackTarget())\n+                return;\n+\n+            CheckPolymorph(diff);//this should go AFTER getting target\n+\n+            Counter(diff);\n+            CheckSpellSteal(diff);\n+            CheckColdSnap(diff);\n+\n+            if (IsCasting())\n+                return;\n+\n+            if (me->HasInvisibilityAura())\n+                return;\n+\n+            CheckUsableItems(diff);\n+\n+            DoNormalAttack(diff);\n+        }\n+\n+        void DoNormalAttack(uint32 diff)\n+        {\n+            Unit* mytar = opponent ? opponent : disttarget ? disttarget : nullptr;\n+            if (!mytar)\n+                return;\n+\n+            StartAttack(mytar, IsMelee());\n+\n+            CheckAttackState();\n+            if (!me->IsAlive() || !mytar->IsAlive())\n+                return;\n+\n+            MoveBehind(mytar);\n+\n+            if (!HasRole(BOT_ROLE_DPS))\n+                return;\n+\n+            Unit::AttackerSet const& b_attackers = me->getAttackers();\n+\n+            float dist = me->GetDistance(mytar);\n+\n+            //COMBUSTION (no GCD)\n+            if (IsSpellReady(COMBUSTION_1, diff, false) && GetManaPCT(me) > 20 &&\n+                (mytar->GetMaxHealth() > master->GetMaxHealth() * 4 ||\n+                master->getAttackers().size() > 1 || b_attackers.size() > 1) &&\n+                Rand() < 45 &&\n+                !me->GetAuraEffect(SPELL_AURA_ADD_PCT_MODIFIER, SPELLFAMILY_MAGE, 0x0, 0x04000000, 0x0)\n+                /*!HasAuraName(me, COMBUSTION_1)*/)\n+            {\n+                if (doCast(me, GetSpell(COMBUSTION_1)))\n+                    return;\n+            }\n+            //ICY VEINS (no GCD)\n+            if (IsSpellReady(ICY_VEINS_1, diff, false) && me->IsInCombat() && GetManaPCT(me) > 20 &&\n+                (mytar->GetMaxHealth() > master->GetMaxHealth() * 2 ||\n+                (mytar->IsCreature() && mytar->ToCreature()->GetCreatureTemplate()->rank != CREATURE_ELITE_NORMAL)) &&\n+                Rand() < 45)\n+            {\n+                if (doCast(me, GetSpell(ICY_VEINS_1)))\n+                    return;\n+            }\n+            //ARCANE POWER (no GCD, not with PoM)\n+            if (IsSpellReady(ARCANE_POWER_1, diff, false) && me->IsInCombat() && GetManaPCT(me) > 50 &&\n+                (mytar->GetMaxHealth() > master->GetMaxHealth() * 2 ||\n+                (mytar->IsCreature() && mytar->ToCreature()->GetCreatureTemplate()->rank != CREATURE_ELITE_NORMAL)) &&\n+                Rand() < 75 && !me->GetAuraEffect(SPELL_AURA_ADD_PCT_MODIFIER, SPELLFAMILY_MAGE, 0x0, 0x20, 0x0))\n+            {\n+                if (doCast(me, GetSpell(ARCANE_POWER_1)))\n+                    return;\n+            }\n+            //PRESENCE OF MIND (no GCD, not with AP)\n+            if (IsSpellReady(PRESENCE_OF_MIND_1, diff, false) && me->IsInCombat() && GetManaPCT(me) > 10 && Rand() < 35 &&\n+                !me->GetAuraEffect(SPELL_AURA_ADD_PCT_MODIFIER, SPELLFAMILY_MAGE, 0x0, 0x80000, 0x0))\n+            {\n+                if (doCast(me, GetSpell(PRESENCE_OF_MIND_1)))\n+                    return;\n+            }\n+            //DAMAGE\n+            //Cheap check\n+            if (GC_Timer > diff) //!ensure none spells below ignore GCD!\n+                return;\n+            //NOVAS\n+            if ((IsSpellReady(FROST_NOVA_1, diff) || IsSpellReady(BLAST_WAVE_1, diff)) && Rand() < 85)\n+            {\n+                std::list<Unit*> targets;\n+                GetNearbyTargetsList(targets, 8.5f, 1); //both are radius 10 yd\n+                if (!targets.empty())\n+                {\n+                    bool oneOnOne = (*targets.begin()) == mytar;\n+                    //Frost Nova\n+                    if (IsSpellReady(FROST_NOVA_1, diff) && (targets.size() > 1 || oneOnOne))\n+                    {\n+                        if (doCast(me, GetSpell(FROST_NOVA_1)))\n+                        {\n+                            GetInPosition(true, mytar);\n+                            return;\n+                        }\n+                    }\n+                    //Blast Wave\n+                    else if (IsSpellReady(BLAST_WAVE_1, diff) && (targets.size() > 1 || oneOnOne))\n+                    {\n+                        if (doCast(me, GetSpell(BLAST_WAVE_1)))\n+                            return;\n+                    }\n+                }\n+            }\n+            //MIRROR IMAGE\n+            if (IsSpellReady(MIRROR_IMAGE_1, diff) &&\n+                (mytar->IsPlayer() ||\n+                (mytar->IsCreature() && mytar->ToCreature()->GetCreatureTemplate()->rank != CREATURE_ELITE_NORMAL)) &&\n+                Rand() < 25)\n+            {\n+                if (doCast(me, GetSpell(MIRROR_IMAGE_1)))\n+                    return;\n+            }\n+            //CONES\n+            if (/*fbCasted && */(IsSpellReady(CONE_OF_COLD_1, diff) || IsSpellReady(DRAGON_BREATH_1, diff)) && Rand() < 65)\n+            {\n+                std::list<Unit*> targets;\n+                GetNearbyTargetsInConeList(targets, 8); //both are radius 10 yd\n+                if (!targets.empty())\n+                {\n+                    //Cone of Cold\n+                    if (IsSpellReady(CONE_OF_COLD_1, diff))\n+                    {\n+                        if (doCast(me, GetSpell(CONE_OF_COLD_1)))\n+                            return;\n+                    }\n+                    //Dragon's Breath\n+                    else if (IsSpellReady(DRAGON_BREATH_1, diff))\n+                    {\n+                        if (doCast(me, GetSpell(DRAGON_BREATH_1)))\n+                            return;\n+                    }\n+                }\n+            }\n+\n+            const auto [can_do_frost, can_do_fire, can_do_arcane] = CanAffectVictimBools(mytar, SPELL_SCHOOL_FROST, SPELL_SCHOOL_FIRE, SPELL_SCHOOL_ARCANE);\n+            const auto can_do_frost_or_fire = can_do_frost || can_do_fire;\n+\n+            //spell reflections: Ice Lance instant / Frostbolt Rank 1\n+            if (IsSpellReady(ICE_LANCE_1, diff) && can_do_frost && dist < CalcSpellMaxRange(ICE_LANCE_1) && CanRemoveReflectSpells(mytar, ICE_LANCE_1) &&\n+                doCast(mytar, ICE_LANCE_1))\n+                return;\n+            else if (IsSpellReady(FROSTBOLT_1, diff) && can_do_frost && dist < CalcSpellMaxRange(FROSTBOLT_1) && CanRemoveReflectSpells(mytar, FROSTBOLT_1) &&\n+                doCast(mytar, FROSTBOLT_1))\n+                return;\n+\n+            //Pyroblast TODO: PoM\n+            if (IsSpellReady(PYROBLAST_1, diff) && can_do_fire && dist < CalcSpellMaxRange(PYROBLAST_1) &&\n+                ((mytar->IsPolymorphed() && (b_attackers.size() < 2 || (*b_attackers.begin()) == mytar)) ||\n+                me->HasAura(HOT_STREAK_BUFF) || (me->HasAura(PRESENCE_OF_MIND_1) && (GetSpec() != BOT_SPEC_MAGE_ARCANE || !GetSpell(ARCANE_BLAST_1)))))\n+            {\n+                if (doCast(mytar, GetSpell(PYROBLAST_1)))\n+                    return;\n+            }\n+            //Scorch\n+            if (IsSpellReady(SCORCH_1, diff) && can_do_fire && GetSpec() == BOT_SPEC_MAGE_FIRE && dist < CalcSpellMaxRange(SCORCH_1) && me->GetLevel() >= 25 &&\n+                !mytar->GetAuraEffect(SPELL_AURA_MOD_ATTACKER_SPELL_CRIT_CHANCE, SPELLFAMILY_MAGE, 0x0, 0x2000, 0x0))\n+            {\n+                if (doCast(mytar, GetSpell(SCORCH_1)))\n+                    return;\n+            }\n+            //Living Bomb\n+            if ((!mytar->IsControlledByPlayer() || fbCasted) && IsSpellReady(LIVING_BOMB_1, diff) && can_do_fire && dist < CalcSpellMaxRange(LIVING_BOMB_1) &&\n+                mytar->GetHealth() > me->GetHealth() / 2 * mytar->getAttackers().size() &&\n+                Rand() < 115 && !mytar->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_MAGE, 0x0, 0x20000, 0x0, me->GetGUID()))\n+            {\n+                if (doCast(mytar, GetSpell(LIVING_BOMB_1)))\n+                    return;\n+            }\n+            //Fire Blast (do not waste mana in raids)\n+            if (IsSpellReady(FIRE_BLAST_1, diff) && can_do_fire && dist < CalcSpellMaxRange(FIRE_BLAST_1) &&\n+                mytar->GetHealth() < me->GetMaxHealth()*4 && (fbCasted || mytar->GetHealth() < me->GetMaxHealth() / 4) &&\n+                Rand() < (30 + 40*fbCasted + 80*(!mytar->IsFrozen() && !mytar->HasUnitState(UNIT_STATE_STUNNED) && me->HasAura(IMPACT_BUFF))))\n+            {\n+                if (doCast(mytar, GetSpell(FIRE_BLAST_1)))\n+                    return;\n+            }\n+            //Deep Freeze (damage only)\n+            if (fbCasted && IsSpellReady(DEEP_FREEZE_1, diff) && can_do_frost && dist < CalcSpellMaxRange(DEEP_FREEZE_1) && Rand() < 30 &&\n+                IsImmunedToMySpellEffect(mytar, sSpellMgr->GetSpellInfo(DEEP_FREEZE_1), EFFECT_0) && (mytar->IsFrozen() || me->HasAuraType(SPELL_AURA_ABILITY_IGNORE_AURASTATE)))\n+            {\n+                if (doCast(mytar, GetSpell(DEEP_FREEZE_1)))\n+                    return;\n+            }\n+            //Flamestrike (instant cast only)\n+            if (/*fbCasted && */IsSpellReady(FLAMESTRIKE_1, diff) && can_do_fire && dist < CalcSpellMaxRange(FLAMESTRIKE_1) && Rand() < 80 &&\n+                me->HasAura(FIRESTARTER_BUFF))\n+            {\n+                if (doCast(mytar, GetSpell(FLAMESTRIKE_1)))\n+                    return;\n+            }\n+            //Blizzard\n+            if (IsSpellReady(BLIZZARD_1, diff) && !JumpingOrFalling() && Rand() < 50)\n+            {\n+                if (Unit* blizztarget = FindAOETarget(CalcSpellMaxRange(BLIZZARD_1)))\n+                {\n+                    if (doCast(blizztarget, GetSpell(BLIZZARD_1)))\n+                        return;\n+                }\n+\n+                SetSpellCooldown(BLIZZARD_1, 1500); //fail\n+            }\n+            //Ice Lance (no cd, only GCD)\n+            if (fbCasted && (!me->GetMap()->IsDungeon() || mytar->IsControlledByPlayer()) &&\n+                IsSpellReady(ICE_LANCE_1, diff) && can_do_frost && dist < CalcSpellMaxRange(ICE_LANCE_1) &&\n+                (mytar->IsFrozen() || me->HasAuraType(SPELL_AURA_ABILITY_IGNORE_AURASTATE)))\n+            {\n+                if (doCast(mytar, GetSpell(ICE_LANCE_1)))\n+                    return;\n+            }\n+            //Fireball or Frostfire Bolt (instant cast or combustion use up)\n+            if (/*fbCasted && */IsSpellReady(FROSTFIREBOLT, diff) && can_do_frost_or_fire && dist < CalcSpellMaxRange(FROSTFIREBOLT) && Rand() < 150 &&\n+                ((((CCed(mytar, true) || b_attackers.empty()) && me->HasAura(COMBUSTION_BUFF)) || me->HasAura(BRAIN_FREEZE_BUFF)) ||\n+                !GetSpell(FROSTBOLT_1))) //level 1-3\n+            {\n+                if (doCast(mytar, GetSpell(FROSTFIREBOLT)))\n+                    return;\n+            }\n+            //Main rotation\n+            //Arcane Missiles (arcane spec only)\n+            if (IsSpellReady(ARCANEMISSILES_1, diff) && can_do_arcane && GetSpec() == BOT_SPEC_MAGE_ARCANE && dist < CalcSpellMaxRange(ARCANEMISSILES_1) &&\n+                (me->GetLevel() < 45 ||\n+                ((!GetSpell(ARCANE_BLAST_1) || arcaneBlastStack >= 3 || sSpellMgr->GetSpellInfo(ARCANE_BLAST_1)->CalcPowerCost(me, SPELL_SCHOOL_MASK_ARCANE) > int(me->GetPower(POWER_MANA))) &&\n+                me->GetAuraEffect(SPELL_AURA_ADD_FLAT_MODIFIER, SPELLFAMILY_MAGE, 0x0, 0x2, 0x0))))\n+            {\n+                if (doCast(mytar, GetSpell(ARCANEMISSILES_1)))\n+                    return;\n+            }\n+            if (IsSpellReady(ARCANE_BLAST_1, diff) && can_do_arcane && GetSpec() == BOT_SPEC_MAGE_ARCANE && dist < CalcSpellMaxRange(ARCANE_BLAST_1) &&\n+                (arcaneBlastStack < 4 || !me->GetAuraEffect(SPELL_AURA_ADD_FLAT_MODIFIER, SPELLFAMILY_MAGE, 0x0, 0x2, 0x0)))\n+            {\n+                if (doCast(mytar, GetSpell(ARCANE_BLAST_1)))\n+                    return;\n+            }\n+            if (GetSpec() != BOT_SPEC_MAGE_ARCANE || !GetSpell(ARCANE_BLAST_1))\n+            {\n+                if (IsSpellReady(FROSTFIREBOLT, diff) && can_do_frost_or_fire && (GetSpec() == BOT_SPEC_MAGE_FIRE ||\n+                    (GetSpec() == BOT_SPEC_MAGE_FROST && (FROSTFIREBOLT == FROSTFIRE_BOLT_1 || !GetSpell(FROSTBOLT_1)))) &&\n+                    dist < CalcSpellMaxRange(FROSTFIREBOLT))\n+                {\n+                    if (doCast(mytar, GetSpell(FROSTFIREBOLT)))\n+                        return;\n+                }\n+\n+                if (IsSpellReady(FROSTBOLT_1, diff) && can_do_frost && (GetSpec() != BOT_SPEC_MAGE_FIRE || !can_do_fire) && dist < CalcSpellMaxRange(FROSTBOLT_1))\n+                {\n+                    if (doCast(mytar, GetSpell(FROSTBOLT_1)))\n+                        return;\n+                }\n+                if (IsSpellReady(FIREBALL_1, diff) && can_do_fire && GetSpec() == BOT_SPEC_DEFAULT && dist < CalcSpellMaxRange(FIREBALL_1))\n+                {\n+                    if (doCast(mytar, GetSpell(FIREBALL_1)))\n+                        return;\n+                }\n+            }\n+\n+            if (Spell const* shot = me->GetCurrentSpell(CURRENT_AUTOREPEAT_SPELL))\n+            {\n+                if (shot->GetSpellInfo()->Id == SHOOT_WAND && shot->m_targets.GetUnitTarget() != mytar)\n+                    me->InterruptSpell(CURRENT_AUTOREPEAT_SPELL);\n+            }\n+            else if (IsSpellReady(SHOOT_WAND, diff) && !me->isMoving() && me->GetDistance(mytar) < 30 && GetEquips(BOT_SLOT_RANGED) &&\n+                doCast(mytar, SHOOT_WAND))\n+                return;\n+        }\n+\n+        void CheckPoly(uint32 diff)\n+        {\n+            if (polyCheckTimer <= diff)\n+            {\n+                poly = FindAffectedTarget(GetSpell(POLYMORPH_1), me->GetGUID());\n+                polyCheckTimer = 2000;\n+            }\n+        }\n+\n+        void CheckPolymorph(uint32 diff)\n+        {\n+            if (poly == false && IsSpellReady(POLYMORPH_1, diff) && !IsCasting())\n+            {\n+                if (Unit* target = FindPolyTarget(CalcSpellMaxRange(POLYMORPH_1)))\n+                {\n+                    if (doCast(target, GetSpell(POLYMORPH_1)))\n+                        return;\n+                }\n+            }\n+        }\n+\n+        void CheckPots(uint32 diff)\n+        {\n+            if (me->IsMounted() || IsCasting())\n+                return;\n+\n+            if (IsPotionReady())\n+            {\n+                if (GetHealthPCT(me) < 50)\n+                    DrinkPotion(false);\n+            }\n+            if (Rand() < 35)\n+            {\n+                if (IsSpellReady(EVOCATION_1, diff) && GetManaPCT(me) < 15 && uint8(me->getAttackers().size()) < (shielded ? 3 : 1))\n+                {\n+                    if (doCast(me, GetSpell(EVOCATION_1)))\n+                        return;\n+                }\n+                if (manaGemCharges > 0 && GetManaPCT(me) < 50 && IsSpellReady(MANA_GEM_1, diff, false))\n+                {\n+                    if (doCast(me, GetSpell(MANA_GEM_1)))\n+                        return;\n+                }\n+                if (IsPotionReady() && GetManaPCT(me) < 40)\n+                    DrinkPotion(true);\n+            }\n+        }\n+\n+        void CheckBlink(uint32 diff)\n+        {\n+            if (!me->IsAlive())\n+                return;\n+            if (me->GetVehicle())\n+                return;\n+            if (HasBotCommandState(BOT_COMMAND_STAY) || me->IsMounted())\n+                return;\n+            if (!IsSpellReady(BLINK_1, diff) || IsCasting() || Rand() > 70)\n+                return;\n+\n+            bool cast = false;\n+            Unit* u = nullptr;\n+            if (!IAmFree())\n+            {\n+                if (!me->IsInCombat() && me->GetExactDist2d(master) > std::max<uint8>(master->GetBotMgr()->GetBotFollowDist(), 35) &&\n+                    me->HasInArc(float(M_PI)*0.67f, master))\n+                {\n+                    cast = true;\n+                }\n+            }\n+            if (!cast && me->IsInCombat() && !me->getAttackers().empty() && HasRole(BOT_ROLE_RANGED))\n+            {\n+                cast = me->HasAuraWithMechanic((1u<<MECHANIC_STUN)|(1u<<MECHANIC_ROOT));\n+                if (!cast)\n+                {\n+                    u = me->SelectNearestTarget(7);\n+                    cast = (u && u->GetVictim() == me && u->IsWithinLOSInMap(me, LINEOFSIGHT_ALL_CHECKS, VMAP::ModelIgnoreFlags::M2));\n+                }\n+                if (!cast)\n+                {\n+                    u = (*me->getAttackers().begin());\n+                    cast = (u && (!CCed(u, true) || me->getAttackers().size() > 1) && u->GetDistance(me) < 5.f &&\n+                        u->IsWithinLOSInMap(me, LINEOFSIGHT_ALL_CHECKS, VMAP::ModelIgnoreFlags::M2));\n+                }\n+            }\n+            if (!cast && IsWanderer() && (me->HasUnitMovementFlag(MOVEMENTFLAG_FORWARD) || me->HasUnitState(UNIT_STATE_ROOT)))\n+            {\n+                u = nullptr;\n+                InstanceTemplate const* instt = sObjectMgr->GetInstanceTemplate(me->GetMap()->GetId());\n+                bool map_allows_mount = (!me->GetMap()->IsDungeon() || me->GetMap()->IsBattlegroundOrArena()) && (!instt || instt->AllowMount);\n+                if (!me->GetVictim() ?\n+                    (me->IsInCombat() || !map_allows_mount || !IsOutdoors() || IsFlagCarrier(me)) :\n+                    !me->IsWithinDist(me->GetVictim(), 15.0f + GetSpellAttackRange(true)))\n+                {\n+                    Position forwardPos = me->GetFirstCollisionPosition(30.0f, 0.0f);\n+                    cast = me->GetExactDist2d(forwardPos) > 15.0f;\n+                }\n+            }\n+            if (cast)\n+            {\n+                if (u)\n+                {\n+                    //turn away from target\n+                    me->AttackStop();\n+                    me->SetOrientation(me->GetAbsoluteAngle(u) + float(M_PI) * frand(0.85f, 1.15f));\n+                }\n+                if (doCast(me, GetSpell(BLINK_1)))\n+                    return;\n+            }\n+        }\n+\n+        void CheckFocusMagic(uint32 diff)\n+        {\n+            if (fmCheckTimer > diff || GC_Timer > diff || IAmFree() || me->GetLevel() < 20 || IsCasting() || Rand() > 50)\n+                return;\n+\n+            uint32 FOCUSMAGIC = GetSpell(FOCUS_MAGIC_1);\n+            if (!FOCUSMAGIC)\n+                return;\n+\n+            if (FindAffectedTarget(FOCUSMAGIC, me->GetGUID(), 70, 3))\n+            {\n+                fmCheckTimer = 15000;\n+                return;\n+            }\n+\n+            std::set<Unit*> targets;\n+            if (Group const* gr = master->GetGroup())\n+            {\n+                std::vector<Unit*> members = BotMgr::GetAllGroupMembers(gr);\n+                for (auto i : NPCBots::index_array<uint8, 3>)\n+                {\n+                    if (!targets.empty())\n+                        break;\n+                    for (Unit* member : members)\n+                    {\n+                        if (!(i == 0 ? member->IsPlayer() : member->IsNPCBot()) || me->GetMap() != member->FindMap() ||\n+                            !member->IsAlive() || member->GetPowerType() != POWER_MANA || me->GetExactDist(member) > 30 ||\n+                            member->HasAura(FOCUSMAGIC))\n+                            continue;\n+                        if (i > 0)\n+                        {\n+                            Creature const* bot = member->ToCreature();\n+                            if (bot->GetBotAI()->HasRole(BOT_ROLE_TANK) ||\n+                                bot->GetBotClass() == BOT_CLASS_BM || bot->GetBotClass() == BOT_CLASS_HUNTER ||\n+                                bot->GetBotClass() == BOT_CLASS_SPELLBREAKER || bot->GetBotClass() == BOT_CLASS_DARK_RANGER ||\n+                                bot->GetBotClass() == BOT_CLASS_SEA_WITCH)\n+                                continue;\n+                            if (i < 2 && bot->GetBotAI()->HasRole(BOT_ROLE_DPS))\n+                                continue;\n+                        }\n+                        targets.insert(member);\n+                    }\n+                }\n+            }\n+            else\n+            {\n+                if (master->GetPowerType() == POWER_MANA && me->GetExactDist(master) < 30 && !master->HasAura(FOCUSMAGIC))\n+                    targets.insert(master);\n+            }\n+\n+            if (!targets.empty())\n+            {\n+                Unit* target = targets.size() == 1u ? *targets.begin() : Bcore::Containers::SelectRandomContainerElement(targets);\n+                if (doCast(target, FOCUSMAGIC))\n+                {\n+                    fmCheckTimer = 30000;\n+                    return;\n+                }\n+            }\n+\n+            fmCheckTimer = 5000; //fail\n+        }\n+\n+        void CheckIceBlock(uint32 diff)\n+        {\n+            if (!me->IsAlive() || GC_Timer > diff || me->GetVehicle() || !GetSpell(ICE_BLOCK_1) || Rand() > 60 || IsTank() || IsFlagCarrier(me))\n+                return;\n+\n+            if (iceblockCheckTimer <= diff)\n+            {\n+                if (me->getAttackers().empty() && (!me->IsInCombat() || (GetManaPCT(me) > 45 && GetHealthPCT(me) > 80)))\n+                {\n+                    me->RemoveAurasDueToSpell(GetSpell(ICE_BLOCK_1));\n+                    return;\n+                }\n+                iceblockCheckTimer = std::numeric_limits<uint32>::max();\n+            }\n+\n+            if (!IsSpellReady(ICE_BLOCK_1, diff))\n+                return;\n+\n+            if (me->IsInCombat() && !me->getAttackers().empty() &&\n+                (CCed(me, true) || me->getAttackers().size() > 2 || GetHealthPCT(me) < 40))\n+            {\n+                if (doCast(me, GetSpell(ICE_BLOCK_1)))\n+                    return;\n+            }\n+        }\n+\n+        void CheckColdSnap(uint32 diff)\n+        {\n+            if (!IsSpellReady(COLD_SNAP_1, diff) || !me->IsInCombat() || me->IsMounted() || Rand() > 50)\n+                return;\n+\n+            //TODO: recheck priorities\n+            uint32 needFactor = 0;\n+            uint32 cooldown;\n+            cooldown = GetSpellCooldown(FROST_NOVA_1);\n+            needFactor += !cooldown ? 0 : 3 * cooldown / 220;  //0-100 x3\n+            cooldown = GetSpellCooldown(ICE_BLOCK_1);\n+            needFactor += !cooldown ? 0 : 3 * cooldown / 2400; //0-100 x3\n+            cooldown = shielded ? 0 : GetSpellCooldown(ICE_BARRIER_1);\n+            needFactor += !cooldown ? 0 : 3 * cooldown / 240;  //0-100 x3\n+            cooldown = GetSpellCooldown(FROST_WARD_1);\n+            needFactor += !cooldown ? 0 : 2 * cooldown / 300;  //0-100 x2\n+            cooldown = GetSpellCooldown(ICY_VEINS_1);\n+            needFactor += !cooldown ? 0 : 2 * cooldown / 1500; //0-100 x2\n+            cooldown = (botPet && botPet->IsAlive()) ? 0 : GetSpellCooldown(SUMMON_WATER_ELEMENTAL_1);\n+            needFactor += !cooldown ? 0 : 1 * cooldown / 1500; //0-100\n+            cooldown = GetSpellCooldown(DEEP_FREEZE_1);\n+            needFactor += !cooldown ? 0 : 1 * cooldown / 240;  //0-100\n+            cooldown = GetSpellCooldown(CONE_OF_COLD_1);\n+            needFactor += !cooldown ? 0 : 1 * cooldown / 80;   //0-100\n+            //0-1600\n+\n+            if (needFactor >= 700 && doCast(me, GetSpell(COLD_SNAP_1)))\n+                return;\n+        }\n+\n+        void CheckShield(uint32 diff)\n+        {\n+            //TODO: Mana Shield\n+            if (!GetSpell(ICE_BARRIER_1))\n+                return;\n+\n+            if (shieldCheckTimer <= diff)\n+            {\n+                shieldCheckTimer = 1500;\n+                shielded = me->GetTotalAuraModifierByMiscValue(SPELL_AURA_SCHOOL_ABSORB, 127) > 0;\n+                shielded = shielded ? shielded : me->HasAura(GetSpell(ICE_BARRIER_1));\n+            }\n+\n+            if (shielded || !IsSpellReady(ICE_BARRIER_1, diff) || IsCasting())\n+                return;\n+\n+            if ((me->IsInCombat() && me->GetMap()->Instanceable()) ||\n+                !me->getAttackers().empty() || GetHealthPCT(me) < 90)\n+            {\n+                if (doCast(me, GetSpell(ICE_BARRIER_1)))\n+                    return;\n+            }\n+        }\n+\n+        void CheckWard(uint32 diff)\n+        {\n+            if ((!me->IsInCombat() && !me->HasAuraType(SPELL_AURA_PERIODIC_DAMAGE)) || me->HasAuraType(SPELL_AURA_REFLECT_SPELLS_SCHOOL) ||\n+                !IsSpellReady(FROST_WARD_1, diff) || IsCasting())\n+                return;\n+\n+            uint32 FROSTWARD = canFrostWard ? GetSpell(FROST_WARD_1) : 0;\n+            uint32 FIREWARD = canFireWard ? GetSpell(FIRE_WARD_1) : 0;\n+\n+            if (FIREWARD && doCast(me, FIREWARD))\n+                return;\n+\n+            if (FROSTWARD && doCast(me, FROSTWARD))\n+                return;\n+        }\n+\n+        void ApplyClassSpellCritMultiplierAll(Unit const* /*victim*/, float& crit_chance, SpellInfo const* spellInfo, SpellSchoolMask /*schoolMask*/, WeaponAttackType /*attackType*/) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+\n+            //Shatter\n+            //SHATTER IS HANDLED IN Unit::isSpCrit()\n+\n+            //Arcane Potency: 15%/30% additional crit chance for All spells\n+            if (me->HasAura(ARCANE_POTENCY_BUFF2))\n+                crit_chance += 30.f;\n+            else if (me->HasAura(ARCANE_POTENCY_BUFF1))\n+                crit_chance += 15.f;\n+\n+            //Combustion: 10% additional critical chance for fire spells per stack\n+            if (SPELL_SCHOOL_MASK_FIRE & spellInfo->GetSchoolMask())\n+                if (Aura* combustion = me->GetAura(COMBUSTION_BUFF))\n+                    crit_chance += float(combustion->GetStackAmount() * 10);\n+\n+            //Incineration: 6% additional crit chance for Fire Blast, Scorch, Arcane Blast and Cone of Cold\n+            if (lvl >= 10 &&\n+                (baseId == FIRE_BLAST_1 || baseId == SCORCH_1 ||\n+                baseId == ARCANE_BLAST_1 || baseId == CONE_OF_COLD_1))\n+                crit_chance += 6.f;\n+            //World In Flames: 6% additional critical chance for Flamestrike, Pyroblast, Blast Wave, Dragon's Breath, Living Bomb, Blizzard and Arcane Explosion\n+            if (lvl >= 15 &&\n+                (baseId == FLAMESTRIKE_1 || baseId == PYROBLAST_1 ||\n+                baseId == BLAST_WAVE_1 || baseId == DRAGON_BREATH_1 ||\n+                baseId == BLIZZARD_DAMAGE_1/* || spellId == ARCANEXPLOSION*/ ||\n+                baseId == LIVING_BOMB_1 || baseId == LIVING_BOMB_DAMAGE_1))\n+                crit_chance += 6.f;\n+            //Improved Scorch part 1: 3% additional critical chance for Scorch, Fireball and Frostfire Bolt\n+            if (lvl >= 20 && (baseId == SCORCH_1 || baseId == FIREBALL_1 || baseId == FROSTFIRE_BOLT_1))\n+                crit_chance += 3.f;\n+            //Critical Mass: 6% additional critical chance for Fire spells\n+            if ((GetSpec() == BOT_SPEC_MAGE_FIRE) && lvl >= 30 && (SPELL_SCHOOL_MASK_FIRE & spellInfo->GetSchoolMask()))\n+                crit_chance += 6.f;\n+            //Winter's chill part 1: 3% additional crit chance for Frostbolt\n+            if ((GetSpec() == BOT_SPEC_MAGE_FROST) && lvl >= 35 && baseId == FROSTBOLT_1)\n+                crit_chance += 3.f;\n+\n+            //Glyph of Frostfire Bolt part 2: 2% additional critical chance for Frostfire Bolt\n+            if (/*lvl >= 75 && */baseId == FROSTFIRE_BOLT_1)\n+                crit_chance += 2.f;\n+        }\n+\n+        void ApplyClassDamageMultiplierSpell(int32& damage, SpellNonMeleeDamage& damageinfo, SpellInfo const* spellInfo, WeaponAttackType /*attackType*/, bool iscrit) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+            float fdamage = float(damage);\n+\n+            //apply bonus damage mods\n+            float pctbonus = 0.0f;\n+            if (iscrit)\n+            {\n+                //!!!spell damage is not yet critical and will be multiplied by 1.5\n+                //so we should put here bonus damage mult /1.5\n+                //Burnout: 50% additional crit damage bonus for All spells\n+                //well it's gonna be a little too much eh? skipped\n+                //Ice Shards: 50% additional crit damage bonus for Frost spells\n+                if (lvl >= 15 && (SPELL_SCHOOL_MASK_FROST & spellInfo->GetSchoolMask()))\n+                    pctbonus += 0.334f;\n+                //Spell Power: 50% additional crit damage bonus for All spells\n+                if ((GetSpec() == BOT_SPEC_MAGE_ARCANE) && lvl >= 55)\n+                    pctbonus += 0.334f;\n+                //Combustion: 50% additional crit damage bonus for Fire spells\n+                if ((SPELL_SCHOOL_MASK_FIRE & spellInfo->GetSchoolMask()) && me->HasAura(COMBUSTION_1))\n+                    pctbonus += 0.334f;\n+            }\n+\n+            //Spell Impact: 6% bonus damage for Arcne Explosion, Arcane Blast, Scorch, Fireball, Ice Lance and Cone of Cold\n+            if (lvl >= 20 &&\n+                (/*baseId == ARCANE_EXPLOSION_1 || */baseId == SCORCH_1 ||\n+                baseId == ARCANE_BLAST_1 || baseId == FIREBALL_1 ||\n+                baseId == ICE_LANCE_1 || baseId == CONE_OF_COLD_1))\n+                pctbonus += 0.06f;\n+            //Piercing Ice: 6% bonus damage for Frost spells\n+            if (lvl >= 20 && (SPELL_SCHOOL_MASK_FROST & spellInfo->GetSchoolMask()))\n+                pctbonus += 0.06f;\n+            //Playing with Fire part 1: 3% bonus damage for all spells\n+            if ((GetSpec() == BOT_SPEC_MAGE_FIRE) && lvl >= 30)\n+                pctbonus += 0.03f;\n+            //Improved Cone of Cold: 35% bonus damage for Cone of Cold\n+            if ((GetSpec() == BOT_SPEC_MAGE_FROST) && lvl >= 30 && baseId == CONE_OF_COLD_1)\n+                pctbonus += 0.35f;\n+            //Arcane Instability part 1: 3% bonus damage for all spells\n+            if ((GetSpec() == BOT_SPEC_MAGE_ARCANE) && lvl >= 35)\n+                pctbonus += 0.03f;\n+            //Fire Power: 10% bonus damage for Fire spells\n+            if ((GetSpec() == BOT_SPEC_MAGE_FIRE) && lvl >= 35 && (SPELL_SCHOOL_MASK_FIRE & spellInfo->GetSchoolMask()))\n+                pctbonus += 0.1f;\n+            //Arcane Empowerment part 1,2: 45% / 9% bonus damage (from spellpower) for Arcane Missiles / Arcane Blast\n+            if (GetSpec() == BOT_SPEC_MAGE_ARCANE && lvl >= 40)\n+            {\n+                if (baseId == ARCANE_MISSILES_DAMAGE_1)\n+                    fdamage += me->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_MAGIC) * 0.45f * me->CalculateDefaultCoefficient(spellInfo, SPELL_DIRECT_DAMAGE) * me->CalculateSpellpowerCoefficientLevelPenalty(spellInfo);\n+                else if (baseId == ARCANE_BLAST_1)\n+                    fdamage += me->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_MAGIC) * 0.09f * me->CalculateDefaultCoefficient(spellInfo, SPELL_DIRECT_DAMAGE) * me->CalculateSpellpowerCoefficientLevelPenalty(spellInfo);\n+            }\n+            //Arcane Power: +20% bonus damage\n+            if (AuraEffect const* pow = me->GetAuraEffect(SPELL_AURA_ADD_PCT_MODIFIER, SPELLFAMILY_MAGE, 0x0, 0x80000, 0x0))\n+                if (pow->IsAffectingSpell(spellInfo))\n+                    pctbonus += 0.2f;\n+            //Molten Fury: 12% bonus damage for All spells against target with less than 35% hp\n+            if ((GetSpec() == BOT_SPEC_MAGE_FIRE) &&\n+                lvl >= 40 && damageinfo.target->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT))\n+                pctbonus += 0.12f;\n+            //Arctic Winds part 1: 5% bonus damage for Frost spells\n+            if ((GetSpec() == BOT_SPEC_MAGE_FROST) && lvl >= 40 && (SPELL_SCHOOL_MASK_FROST & spellInfo->GetSchoolMask()))\n+                pctbonus += 0.05f;\n+            //Empowered Fire part 1: 15% bonus damage (from spellpower) for Fireball, Frostfire Bolt and Pyroblast\n+            if ((GetSpec() == BOT_SPEC_MAGE_FIRE) &&\n+                lvl >= 45 && (baseId == FIREBALL_1 || baseId == FROSTFIRE_BOLT_1 || baseId == PYROBLAST_1))\n+                fdamage += me->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_MAGIC) * 0.15f * me->CalculateDefaultCoefficient(spellInfo, SPELL_DIRECT_DAMAGE) * me->CalculateSpellpowerCoefficientLevelPenalty(spellInfo);\n+            //Empowered Frostbolt part 1: 10% of spellpower to Frostbolt damage\n+            if ((GetSpec() == BOT_SPEC_MAGE_FROST) && lvl >= 45 && baseId == FROSTBOLT_1)\n+                fdamage += me->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_MAGIC) * 0.1f * me->CalculateDefaultCoefficient(spellInfo, SPELL_DIRECT_DAMAGE) * me->CalculateSpellpowerCoefficientLevelPenalty(spellInfo);\n+            //Chilled to the Bone part 1: 5% bonus damage for Frostbolt, Frostfire Bolt and Ice Lance\n+            if ((GetSpec() == BOT_SPEC_MAGE_FROST) &&\n+                lvl >= 55 && (baseId == FROSTBOLT_1 || baseId == FROSTFIRE_BOLT_1 || baseId == ICE_LANCE_1))\n+                pctbonus += 0.05f;\n+\n+            //Glyph of Frostfire Bolt part 1: 2% bonus damage for Frostfire Bolt\n+            if (/*lvl >= 75 && */baseId == FROSTFIRE_BOLT_1)\n+                pctbonus += 0.02f;\n+\n+            damage = int32(fdamage * (1.0f + pctbonus));\n+        }\n+\n+        void ApplyClassSpellCostMods(SpellInfo const* spellInfo, int32& cost) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            float fcost = float(cost);\n+            int32 flatbonus = 0;\n+            float pctbonus = 0.0f;\n+\n+            //100% mods\n+            //Firestarter part 2: -100% mana cost for Flamestrike\n+            if (baseId == FLAMESTRIKE_1)\n+                if (me->HasAura(FIRESTARTER_BUFF))\n+                    pctbonus += 1.0f;\n+            //Brain Freeze buff: -100% mana cost for Fireball and Frostfire Bolt while active\n+            //we can check spellFamilyFlags or just use ids, going easy way here\n+            if (baseId == FROSTFIRE_BOLT_1 || baseId == FIREBALL_1)\n+                if (me->HasAura(BRAIN_FREEZE_BUFF))\n+                    pctbonus += 1.0f;\n+            //Clearcasting: -100% mana cost for damaging spells\n+            if (AuraEffect const* eff = me->GetAuraEffect(ARCANE_CONCENTRATION_BUFF, 0, me->GetGUID()))\n+                if (eff->IsAffectingSpell(spellInfo))\n+                    pctbonus += 1.0f;\n+            //Missile Barrage: -100% mana cost for Arcane Missiles\n+            if (baseId == ARCANEMISSILES_1)\n+                if (me->GetAuraEffect(SPELL_AURA_ADD_FLAT_MODIFIER, SPELLFAMILY_MAGE, 0x0, 0x2, 0x0))\n+                    pctbonus += 1.0f;\n+\n+            //pct mods\n+            //Precision part 1: -3% mana cost for All spells\n+            if (lvl >= 15)\n+                pctbonus += 0.03f;\n+            //Frost Channeling: -10% mana cost for all spells\n+            if (lvl >= 25)\n+                pctbonus += 0.1f;\n+            //Improved Blink part 1: -50% mana cost for Blink\n+            if ((GetSpec() == BOT_SPEC_MAGE_ARCANE) && lvl >= 30 && baseId == BLINK_1)\n+                pctbonus += 0.5f;\n+\n+            //Arcane Blast: +175% mana cost for Arcane Blast (per stack)\n+            if (baseId == ARCANE_BLAST_1)\n+                if (AuraEffect const* bla = me->GetAuraEffect(SPELL_AURA_MOD_DAMAGE_PERCENT_DONE, SPELLFAMILY_MAGE, 0x0, 0x0, 0xC))\n+                    pctbonus += -1.75f * bla->GetBase()->GetStackAmount();\n+            //Arcane Power: +20% mana cost\n+            if (AuraEffect const* pow = me->GetAuraEffect(SPELL_AURA_ADD_PCT_MODIFIER, SPELLFAMILY_MAGE, 0x0, 0x80000, 0x0))\n+                if (pow->IsAffectingSpell(spellInfo))\n+                    pctbonus += -0.2f;\n+\n+            //Glyph of Arcane Intellect: -50% mana cost for Arcane Intellect/Brilliance\n+            if (lvl >= 15 && baseId == ARCANEINTELLECT_1)\n+                pctbonus += 0.5f;\n+            //Glyph of Blast Wave part 1: -15% mana cost for Blast Wave\n+            if (lvl >= 70 && baseId == BLAST_WAVE_1)\n+                pctbonus += 0.15f;\n+\n+            //cost can be < 0\n+            cost = int32(fcost * (1.0f - pctbonus)) - flatbonus;\n+        }\n+\n+        void ApplyClassSpellCastTimeMods(SpellInfo const* spellInfo, int32& casttime) const override\n+        {\n+            //casttime is in milliseconds\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            int32 timebonus = 0;\n+            //float pctbonus = 0.0f;\n+\n+            //100% mods\n+            //Firestarter part 1: -100% cast time for Flamestrike\n+            if (baseId == FLAMESTRIKE_1)\n+                if (me->HasAura(FIRESTARTER_BUFF))\n+                    timebonus += casttime;\n+            //Brain Freeze: -100% cast time for Fireball and Frostfire Bolt\n+            //we can check spellFamilyFlags or just use ids, going easy way here\n+            if (baseId == FROSTFIRE_BOLT_1 || baseId == FIREBALL_1)\n+                if (me->HasAura(BRAIN_FREEZE_BUFF))\n+                    timebonus += casttime;\n+            //Hot Streak: -100% cast time for Pyroblast\n+            if (baseId == PYROBLAST_1)\n+                if (me->HasAura(HOT_STREAK_BUFF))\n+                    timebonus += casttime;\n+            //Presence of Mind: -100% cast time\n+            if (AuraEffect const* eff = me->GetAuraEffect(SPELL_AURA_ADD_PCT_MODIFIER, SPELLFAMILY_MAGE, 0x0, 0x20, 0x0))\n+                if (eff->IsAffectingSpell(spellInfo))\n+                    timebonus += casttime;\n+\n+            //flat mods\n+            //Improved Fireball: -0.5 sec cast time for Fireball (Frostfire too for bot)\n+            if (lvl >= 10 && (baseId == FIREBALL_1 || baseId == FROSTFIRE_BOLT_1))\n+                timebonus += 500;\n+            //Improved Frostbolt: -0.5 sec cast time for Frostbolt\n+            if (lvl >= 10 && baseId == FROSTBOLT_1)\n+                timebonus += 500;\n+            //Empowered Frostbolt part 2: -0.2 sec cast time for Frostbolt\n+            if (lvl >= 45 && baseId == FROSTBOLT_1)\n+                timebonus += 200;\n+\n+            //Missile Barrage: -2.5 sec channeling time, -0.5 sec for every tick\n+            if (baseId == ARCANEMISSILES_1 && me->GetAuraEffect(SPELL_AURA_ADD_FLAT_MODIFIER, SPELLFAMILY_MAGE, 0x0, 0x2, 0x0))\n+                timebonus += casttime / 2;\n+\n+            casttime = std::max<int32>(casttime - timebonus, 0);\n+        }\n+\n+        void ApplyClassSpellNotLoseCastTimeMods(SpellInfo const* spellInfo, int32& delayReduce) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            SpellSchoolMask schools = spellInfo->GetSchoolMask();\n+            uint8 lvl = me->GetLevel();\n+            int32 reduceBonus = 0;\n+\n+            if (AuraEffect const* vei = me->GetAuraEffect(SPELL_AURA_MOD_CASTING_SPEED_NOT_STACK, SPELLFAMILY_MAGE, 0x0, 0x4000, 0x0))\n+                if (vei->IsAffectingSpell(spellInfo))\n+                    reduceBonus += 100;\n+\n+            if (lvl >= 20 && (schools & SPELL_SCHOOL_MASK_FIRE))\n+                reduceBonus += 70;\n+\n+            if (GetSpec() == BOT_SPEC_MAGE_ARCANE && lvl >= 10 && (baseId == ARCANEMISSILES_1 || baseId == ARCANE_BLAST_1))\n+                reduceBonus += 100;\n+\n+            delayReduce += reduceBonus;\n+        }\n+\n+        void ApplyClassSpellCooldownMods(SpellInfo const* spellInfo, uint32& cooldown) const override\n+        {\n+            //cooldown is in milliseconds\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+            int32 timebonus = 0;\n+            float pctbonus = 0.0f;\n+\n+            //pct mods\n+            //Ice Floes: -20% cooldown for Frost Nova, Cone of Cold, Ice Block and Icy Veins\n+            if (lvl >= 10 &&\n+                (baseId == FROST_NOVA_1 || baseId == CONE_OF_COLD_1 || baseId == ICE_BLOCK_1 || baseId == ICY_VEINS_1))\n+                pctbonus += 0.2f;\n+            //Cold as Ice: -20% cooldown for Ice Barrier, Cold Snap and Summon Water Elemental\n+            if ((GetSpec() == BOT_SPEC_MAGE_FROST) && lvl >= 35 &&\n+                (baseId == ICE_BARRIER_1 || baseId == COLD_SNAP_1 || baseId == SUMMON_WATER_ELEMENTAL_1))\n+                pctbonus += 0.2f;\n+\n+            //flat mods\n+            //Improved Fire Blast: -2 sec cooldown for Fire Blast\n+            if (lvl >= 10 && baseId == FIRE_BLAST_1)\n+                timebonus += 2000;\n+            //Arcane Flows part 2: -2 min cooldown for Evocation\n+            if ((GetSpec() == BOT_SPEC_MAGE_ARCANE) && lvl >= 45 && baseId == EVOCATION_1)\n+                timebonus += 120000;\n+            //Glyph of Water Elemental: -30 sec cooldown for Summon Water Elemental\n+            if (lvl >= 50 && baseId == SUMMON_WATER_ELEMENTAL_1)\n+                timebonus += 30000;\n+\n+            ////Pyroblast (special): ensure no double pyroblast casts\n+            //if (baseId == PYROBLAST_1)\n+            //    timebonus -= 3000;\n+\n+            cooldown = std::max<int32>((float(cooldown) * (1.0f - pctbonus)) - timebonus, 0);\n+        }\n+\n+        void ApplyClassSpellRadiusMods(SpellInfo const* spellInfo, float& radius) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            float flatbonus = 0.0f;\n+            float pctbonus = 0.0f;\n+\n+            //pct mods\n+            //Increased Area (AhnQ set bonus?) 23549\n+            if (lvl >= 60 && (spellInfo->SpellFamilyFlags[0] & 0x1084))\n+                pctbonus += 0.25f;\n+            //Arctic Reach\n+            if (lvl >= 25 && (spellInfo->SpellFamilyFlags[0] & 0x240))\n+                pctbonus += 0.2f;\n+\n+            //flat mods\n+            //Glyph of Blink\n+            if (lvl >= 20 && baseId == BLINK_1)\n+                flatbonus += 5.f;\n+\n+            radius = radius * (1.0f + pctbonus) + flatbonus;\n+        }\n+\n+        void ApplyClassSpellRangeMods(SpellInfo const* spellInfo, float& maxrange) const override\n+        {\n+            //uint32 spellId = spellInfo->Id;\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            float flatbonus = 0.0f;\n+            float pctbonus = 0.0f;\n+\n+            //pct mods\n+            //Arctic Reach: +20% range for Frost Spells\n+            if (lvl >= 25 && ((spellInfo->SpellFamilyFlags[0] & 0x200A0) || (spellInfo->SpellFamilyFlags[1] & 0x100000)))\n+                pctbonus += 0.2f;\n+\n+            //flat mods\n+            //Magic Attunement: +6 yd range for Arcane Spells\n+            if (lvl >= 20 && ((spellInfo->SpellFamilyFlags[0] & 0xA1006C00) || (spellInfo->SpellFamilyFlags[1] & 0x8010)))\n+                flatbonus += 6.f;\n+            //Flame Throwing: +6 yd range for Fire Spells\n+            if (lvl >= 20 && ((spellInfo->SpellFamilyFlags[0] & 0x400017) || (spellInfo->SpellFamilyFlags[1] & 0x20000)))\n+                flatbonus += 6.f;\n+\n+            //Glyph of Deep Freeze\n+            if (lvl >= 60 && baseId == DEEP_FREEZE_1)\n+                flatbonus += 10.f;\n+\n+            //Mage Fire Blast Range Bonus (33066): +6 yd range for Fire Blast\n+            if (lvl >= 60 && baseId == FIRE_BLAST_1)\n+                flatbonus += 6.f;\n+\n+            maxrange = maxrange * (1.0f + pctbonus) + flatbonus;\n+        }\n+\n+        void OnClassSpellGo(SpellInfo const* spellInfo) override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+\n+            //DEBUG\n+            //if (!IAmFree())\n+            //{\n+            //    std::ostringstream msg;\n+            //    msg << \"OnClassSpellGo: \" << spellInfo->SpellName[0] << \" (\" << spellId << \")!\";\n+            //    BotWhisper(msg.view());\n+            //}\n+\n+            if (baseId == SUMMON_WATER_ELEMENTAL_1)\n+                SummonBotPet();\n+\n+            //Mana gem conjure and use\n+            if (baseId == CONJURE_MANA_GEM_1)\n+            {\n+                //ItemTemplate const* gem = sObjectMgr->GetItemTemplate(spellInfo->_effects[0].ItemType);\n+                //ASSERT(gem);\n+                //manaGemCharges = uint8(abs(gem->Spells[1].SpellCharges)); //at index 1\n+\n+                //Do not bother with this crap\n+                manaGemCharges = 3;\n+            }\n+            if (baseId == MANA_GEM_1)\n+            {\n+                //spell cd is 1 min, item cd is 2 min, correct here\n+                SetSpellCooldown(MANA_GEM_1, 120000);\n+                manaGemCharges -= 1;\n+            }\n+\n+            //special cases\n+            //Pyroblast (special): ensure no double pyroblast casts\n+            if (baseId == PYROBLAST_1)\n+                SetSpellCooldown(PYROBLAST_1, 3000);\n+\n+            if (baseId == ICE_BLOCK_1)\n+            {\n+                //Glyph of Ice Block: reset Frost Nova cd\n+                ResetSpellCooldown(FROST_NOVA_1);\n+                iceblockCheckTimer = 4000;\n+            }\n+\n+            //check for minor rotation thingy (skip common triggered on-hit spells\n+            /*if (spellId != FROSTBITE_TRIGGERED && spellId != WINTERS_CHILL_TRIGGERED && spellId != IGNITE_TRIGGERED &&\n+                spellId != ARCANE_CONCENTRATION_BUFF && spellId != ARCANE_POTENCY_BUFF1 && spellId != ARCANE_POTENCY_BUFF2 &&\n+                spellId != FIRESTARTER_BUFF && spellId != BRAIN_FREEZE_BUFF && spellId != HOT_STREAK_BUFF)*/\n+                fbCasted = (baseId == SCORCH_1 || baseId == FROSTBOLT_1 || baseId == FIREBALL_1 || baseId == FROSTFIRE_BOLT_1);\n+\n+            //Handle clearcasting\n+            if (AuraEffect const* eff = me->GetAuraEffect(ARCANE_CONCENTRATION_BUFF, 0, me->GetGUID()))\n+            {\n+                if (eff->IsAffectingSpell(spellInfo))\n+                {\n+                    //if (int32 cost = spellInfo->CalcPowerCost(me, spellInfo->GetSchoolMask()))\n+                    {\n+                        //me->ModifyPower(POWER_MANA, cost > 0 ? cost : 0);\n+                        me->RemoveAurasDueToSpell(ARCANE_CONCENTRATION_BUFF);\n+                    }\n+                    //arcane potency has the same affection (damaging spells only)\n+                    me->RemoveAurasDueToSpell(ARCANE_POTENCY_BUFF1);\n+                    me->RemoveAurasDueToSpell(ARCANE_POTENCY_BUFF2);\n+                }\n+            }\n+            //Handle Presence of Mind\n+            bool consumed_Pom = false;\n+            if (AuraEffect const* eff = me->GetAuraEffect(SPELL_AURA_ADD_PCT_MODIFIER, SPELLFAMILY_MAGE, 0x0, 0x20, 0x0))\n+            {\n+                if (eff->IsAffectingSpell(spellInfo))\n+                {\n+                    me->RemoveAurasDueToSpell(PRESENCE_OF_MIND_1);\n+                    consumed_Pom = true;\n+                }\n+            }\n+            if (!consumed_Pom)\n+            {\n+                //Firestarter\n+                if (baseId == FLAMESTRIKE_1)\n+                    me->RemoveAurasDueToSpell(FIRESTARTER_BUFF);\n+                //Brain Freeze (Fireball!)\n+                if (baseId == FROSTFIRE_BOLT_1 || baseId == FIREBALL_1)\n+                    me->RemoveAurasDueToSpell(BRAIN_FREEZE_BUFF);\n+                //Hot Streak\n+                if (baseId == PYROBLAST_1)\n+                    me->RemoveAurasDueToSpell(HOT_STREAK_BUFF);\n+            }\n+            //Handle Cold Snap\n+            if (baseId == COLD_SNAP_1)\n+            {\n+                for (auto& [rank1_id, spell] : GetSpellMap())\n+                {\n+                    if (rank1_id == baseId)\n+                        continue;\n+                    if (spell.spellId != 0 && spell.cooldown > 0)\n+                    {\n+                        SpellInfo const* cdInfo = sSpellMgr->GetSpellInfo(rank1_id);\n+                        if (cdInfo && cdInfo->SpellFamilyName == SPELLFAMILY_MAGE && cdInfo->GetRecoveryTime() > 0 &&\n+                            (cdInfo->GetSchoolMask() & SPELL_SCHOOL_MASK_FROST))\n+                            spell.cooldown = 0;\n+                    }\n+                }\n+            }\n+\n+            //Missile Barrage\n+            if (baseId == ARCANEMISSILES_1)\n+                me->RemoveAurasDueToSpell(MISSILE_BARRAGE_BUFF);\n+        }\n+\n+        void SpellHitTarget(WorldObject* wtarget, SpellInfo const* spell) override\n+        {\n+            Unit* target = wtarget->ToUnit();\n+            if (!target)\n+                return;\n+\n+            if (aftercastTargetGuid != ObjectGuid::Empty)\n+            {\n+                //only players for now\n+                if (!aftercastTargetGuid.IsPlayer())\n+                {\n+                    aftercastTargetGuid = ObjectGuid::Empty;\n+                    return;\n+                }\n+\n+                Player* pTarget = ObjectAccessor::GetPlayer(*me, aftercastTargetGuid);\n+                aftercastTargetGuid = ObjectGuid::Empty;\n+\n+                if (!pTarget/* || me->GetDistance(pTarget) > 15*/)\n+                    return;\n+\n+                //handle effects\n+                for (auto i : NPCBots::index_array<uint8, MAX_SPELL_EFFECTS>)\n+                {\n+                    switch (spell->_effects[i].Effect)\n+                    {\n+                        case SPELL_EFFECT_CREATE_ITEM:\n+                        case SPELL_EFFECT_CREATE_ITEM_2:\n+                        {\n+                            uint32 newitemid = spell->_effects[i].ItemType;\n+                            if (newitemid)\n+                            {\n+                                ItemPosCountVec dest;\n+                                ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(newitemid);\n+                                if (!pProto)\n+                                    return;\n+                                uint32 count = pProto->GetMaxStackSize();\n+                                uint32 no_space = 0;\n+                                InventoryResult msg = pTarget->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, newitemid, count, &no_space);\n+                                if (msg != EQUIP_ERR_OK)\n+                                {\n+                                    if (msg == EQUIP_ERR_INV_FULL || msg == EQUIP_ERR_ITEM_MAX_COUNT)\n+                                        count -= no_space;\n+                                    else\n+                                    {\n+                                        // if not created by another reason from full inventory or unique items amount limitation\n+                                        pTarget->SendEquipError(msg, nullptr, nullptr, newitemid);\n+                                        continue;\n+                                    }\n+                                }\n+                                if (count)\n+                                {\n+                                    Item* pItem = pTarget->StoreNewItem(dest, newitemid, true, 0);\n+                                    if (!pItem)\n+                                    {\n+                                        pTarget->SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND, nullptr, nullptr);\n+                                        continue;\n+                                    }\n+\n+                                    pTarget->SendNewItem(pItem, count, true, false, true);\n+                                }\n+                            }\n+                            break;\n+                        }\n+                        default:\n+                            break;\n+                    }\n+                }\n+\n+                return;\n+            }\n+\n+            uint32 spellId = spell->Id;\n+            uint32 baseId = spell->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+\n+            if (baseId == ARCANEINTELLECT_1)\n+            {\n+                if (Aura* arc = target->GetAura(spellId, me->GetGUID()))\n+                {\n+                    uint32 dur = HOUR * IN_MILLISECONDS;\n+                    arc->SetDuration(dur);\n+                    arc->SetMaxDuration(dur);\n+                }\n+            }\n+\n+            //Spells with chill effect\n+            //chill amount by spell family mask\n+            //00100000 00000000 00000000 chilled (blizzard)\n+            //00000200 00000000 00000000 conecold\n+            //00000020 00000000 00000000 frbolt\n+            //00000000 00001000 00000008 ffbolt\n+            //00100220 00001000 00000000 permafrst\n+            //00100220 00001000 00000000 cttbn\n+            if (spell->SpellFamilyName == SPELLFAMILY_MAGE &&\n+                ((spell->SpellFamilyFlags[0] & 0x100220) || (spell->SpellFamilyFlags[1] & 0x1000)))\n+            {\n+                //frostbolt, cone of cold, blizzard chill, frostfire bolt\n+                Aura* chill = target->GetAura(spellId, me->GetGUID());\n+                if (chill)\n+                {\n+                    //Permafrost: chill effects duration + 3 sec\n+                    if (lvl >= 15)\n+                    {\n+                        uint32 dur = chill->GetDuration() + 3000;\n+                        chill->SetDuration(dur);\n+                        chill->SetMaxDuration(dur);\n+                    }\n+                    //chill effect is at index 0\n+                    AuraEffect* chillEff = chill->GetEffect(0);\n+                    if (chillEff)\n+                    {\n+                        int32 amount = chillEff->GetAmount();\n+                        if (lvl >= 15)\n+                            amount -= 10; //permafrost\n+                        if ((GetSpec() == BOT_SPEC_MAGE_FROST) && lvl >= 55)\n+                            amount -= 10; //chilled to the bone\n+                        chillEff->ChangeAmount(amount);\n+                    }\n+                }\n+            }\n+\n+            //Glyph of Ice Barrier: 30% increased effect\n+            if (baseId == ICE_BARRIER_1)\n+            {\n+                shielded = true;\n+                if (lvl >= 46)\n+                {\n+                    AuraEffect* barr = me->GetAuraEffect(spellId, 0);\n+                    if (barr)\n+                        barr->ChangeAmount(barr->GetAmount() * 1.3f);\n+                }\n+            }\n+\n+            //Custom things\n+            if (baseId == POLYMORPH_1)\n+            {\n+                poly = true;\n+                polyCheckTimer = 2000;\n+            }\n+\n+            //Winter Veil addition\n+            if (sGameEventMgr->IsActiveEvent(GAME_EVENT_WINTER_VEIL))\n+            {\n+                if (SPELL_SCHOOL_MASK_FROST & spell->GetSchoolMask())\n+                    me->AddAura(44755, target); //snowflakes\n+\n+                //if (baseId == FROSTBOLT_1 && urand(1,100) <= 10)\n+                //    me->CastSpell(target, 25686, true); //10% super snowball\n+            }\n+\n+            OnSpellHitTarget(target, spell);\n+        }\n+\n+        void SpellHit(WorldObject* wcaster, SpellInfo const* spell) override\n+        {\n+            Unit* caster = wcaster->ToUnit();\n+            if (!caster)\n+                return;\n+\n+            uint32 baseId = spell->GetFirstRankSpell()->Id;\n+\n+            if (baseId == ARCANE_BLAST_DEBUFF)\n+                if (Aura* blas = me->GetAura(spell->Id))\n+                    arcaneBlastStack = blas->GetStackAmount();\n+\n+            //Ward helper\n+            if (spell->HasEffect(SPELL_EFFECT_SCHOOL_DAMAGE) || spell->HasAura(SPELL_AURA_PERIODIC_DAMAGE))\n+            {\n+                if (!canFrostWard && (spell->GetSchoolMask() & SPELL_SCHOOL_MASK_FROST))\n+                    canFrostWard = true;\n+                if (!canFireWard && (spell->GetSchoolMask() & SPELL_SCHOOL_MASK_FIRE))\n+                    canFireWard = true;\n+            }\n+\n+            OnSpellHit(caster, spell);\n+        }\n+\n+        void DamageDealt(Unit* victim, uint32& damage, DamageEffectType damageType) override\n+        {\n+            bot_ai::DamageDealt(victim, damage, damageType);\n+        }\n+\n+        void DamageTaken(Unit* u, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo*/) override\n+        {\n+            if (!u)\n+                return;\n+            if (!u->IsInCombat() && !me->IsInCombat())\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void OwnerAttackedBy(Unit* u) override\n+        {\n+            if (!u)\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void SummonBotPet()\n+        {\n+            if (botPet)\n+                UnsummonAll(false);\n+\n+            uint32 entry = BOT_PET_WATER_ELEMENTAL;\n+\n+            Position pos;\n+\n+            //glyphed: permanent\n+            Creature* myPet = me->SummonCreature(entry, *me, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 3s);\n+            me->GetNearPoint(myPet, pos.m_positionX, pos.m_positionY, pos.m_positionZ, 2, me->GetOrientation());\n+            myPet->GetMotionMaster()->MovePoint(me->GetMapId(), pos);\n+            myPet->SetCreator(master);\n+            myPet->SetOwnerGUID(me->GetGUID());\n+            myPet->SetFaction(master->GetFaction());\n+            myPet->SetControlledByPlayer(!IAmFree());\n+            myPet->SetPvP(me->IsPvP());\n+            myPet->SetByteValue(UNIT_FIELD_BYTES_2, 1, master->GetByteValue(UNIT_FIELD_BYTES_2, 1));\n+            myPet->SetUInt32Value(UNIT_CREATED_BY_SPELL, SUMMON_WATER_ELEMENTAL_1);\n+\n+            botPet = myPet;\n+        }\n+\n+        void UnsummonAll(bool savePets = true) override\n+        {\n+            UnsummonPet(savePets);\n+        }\n+\n+        void SummonedCreatureDies(Creature* /*summon*/, Unit* /*killer*/) override\n+        {\n+        }\n+\n+        void SummonedCreatureDespawn(Creature* summon) override\n+        {\n+            //BOT_LOG_ERROR(\"entities.unit\", \"SummonedCreatureDespawn: {}'s {}\", me->GetName(), summon->GetName());\n+            if (summon == botPet)\n+                botPet = nullptr;\n+        }\n+\n+        uint32 GetAIMiscValue(uint32 data) const override\n+        {\n+            switch (data)\n+            {\n+                case BOTAI_MISC_PET_TYPE:\n+                    return BOT_PET_WATER_ELEMENTAL;\n+                default:\n+                    return 0;\n+            }\n+        }\n+\n+        float GetSpellAttackRange(bool longRange) const override\n+        {\n+            return longRange ? CalcSpellMaxRange(FROSTBOLT_1) : 20.f;\n+        }\n+\n+        void Reset() override\n+        {\n+            UnsummonAll(false);\n+\n+            polyCheckTimer = 0;\n+            fmCheckTimer = 0;\n+            iceblockCheckTimer = 0;\n+            shieldCheckTimer = 0;\n+            arcaneBlastStack = 0;\n+            manaGemCharges = 0;\n+\n+            poly = false;\n+            shielded = false;\n+            fbCasted = false;\n+\n+            DefaultInit();\n+        }\n+\n+        void ReduceCD(uint32 diff) override\n+        {\n+            if (polyCheckTimer > diff)              polyCheckTimer -= diff;\n+            if (fmCheckTimer > diff)                fmCheckTimer -= diff;\n+            if (iceblockCheckTimer > diff)          iceblockCheckTimer -= diff;\n+            if (shieldCheckTimer > diff)            shieldCheckTimer -= diff;\n+        }\n+\n+        void InitPowers() override\n+        {\n+            me->SetPowerType(POWER_MANA);\n+        }\n+\n+        void InitSpells() override\n+        {\n+            uint8 lvl = me->GetLevel();\n+            bool isArca = GetSpec() == BOT_SPEC_MAGE_ARCANE;\n+            bool isFire = GetSpec() == BOT_SPEC_MAGE_FIRE;\n+            bool isFros = GetSpec() == BOT_SPEC_MAGE_FROST;\n+\n+            InitSpellMap(DAMPENMAGIC_1);\n+            InitSpellMap(AMPLIFYMAGIC_1);\n+            InitSpellMap(ARCANEINTELLECT_1);\n+            InitSpellMap(ARCANEMISSILES_1);\n+            InitSpellMap(ARCANE_BLAST_1);\n+            InitSpellMap(POLYMORPH_1);\n+            InitSpellMap(COUNTERSPELL_1);\n+            InitSpellMap(SPELLSTEAL_1);\n+            InitSpellMap(EVOCATION_1);\n+            InitSpellMap(BLINK_1);\n+            InitSpellMap(REMOVE_CURSE_1);\n+            InitSpellMap(INVISIBILITY_1);\n+            InitSpellMap(SCORCH_1);\n+            InitSpellMap(FIRE_BLAST_1);\n+            InitSpellMap(FLAMESTRIKE_1);\n+            InitSpellMap(DAMPENMAGIC_1);\n+            InitSpellMap(FROSTBOLT_1);\n+            InitSpellMap(FROST_NOVA_1);\n+            InitSpellMap(CONE_OF_COLD_1);\n+            InitSpellMap(BLIZZARD_1);\n+            InitSpellMap(FROST_ARMOR_1);\n+            InitSpellMap(ICE_ARMOR_1);\n+            InitSpellMap(MOLTEN_ARMOR_1);\n+            InitSpellMap(ICE_BLOCK_1);\n+ /*Special*/InitSpellMap(BLIZZARD_DAMAGE_1); //important\n+ /*Special*/InitSpellMap(LIVING_BOMB_DAMAGE_1); //important\n+            InitSpellMap(SLOW_FALL_1);\n+            InitSpellMap(ICE_LANCE_1);\n+            InitSpellMap(FROST_WARD_1);\n+            InitSpellMap(FIRE_WARD_1);\n+            InitSpellMap(MIRROR_IMAGE_1);\n+\n+ /*Special*/InitSpellMap(CONJURE_MANA_GEM_1);\n+ /*Special*/InitSpellMap(MANA_GEM_1);\n+\n+            InitSpellMap(RITUAL_OF_REFRESHMENT_1); //not casted\n+\n+  /*Talent*/lvl >= 20 ? InitSpellMap(FOCUS_MAGIC_1) : RemoveSpell(FOCUS_MAGIC_1);\n+  /*Talent*/lvl >= 30 && (isArca || isFire) ? InitSpellMap(PRESENCE_OF_MIND_1) : RemoveSpell(PRESENCE_OF_MIND_1);\n+  /*Talent*/lvl >= 40 && isArca ? InitSpellMap(ARCANE_POWER_1) : RemoveSpell(ARCANE_POWER_1);\n+\n+  /*Talent*/lvl >= 20 ? InitSpellMap(PYROBLAST_1) : RemoveSpell(PYROBLAST_1);\n+  /*Talent*/lvl >= 30 && isFire ? InitSpellMap(BLAST_WAVE_1) : RemoveSpell(BLAST_WAVE_1);\n+  /*Talent*/lvl >= 40 && isFire ? InitSpellMap(DRAGON_BREATH_1) : RemoveSpell(DRAGON_BREATH_1);\n+  /*Talent*/lvl >= 50 && isFire ? InitSpellMap(COMBUSTION_1) : RemoveSpell(COMBUSTION_1);\n+  /*Talent*/lvl >= 60 && isFire ? InitSpellMap(LIVING_BOMB_1) : RemoveSpell(LIVING_BOMB_1);\n+\n+  /*Talent*/lvl >= 20 ? InitSpellMap(ICY_VEINS_1) : RemoveSpell(ICY_VEINS_1);\n+  /*Talent*/lvl >= 30 && isFros ? InitSpellMap(COLD_SNAP_1) : RemoveSpell(COLD_SNAP_1);\n+  /*Talent*/lvl >= 40 && isFros ? InitSpellMap(ICE_BARRIER_1) : RemoveSpell(ICE_BARRIER_1);\n+  /*Talent*/lvl >= 50 && isFros ? InitSpellMap(SUMMON_WATER_ELEMENTAL_1) : RemoveSpell(SUMMON_WATER_ELEMENTAL_1);\n+  /*Talent*/lvl >= 60 && isFros ? InitSpellMap(DEEP_FREEZE_1) : RemoveSpell(DEEP_FREEZE_1);\n+\n+            InitSpellMap(FROSTFIRE_BOLT_1);\n+            InitSpellMap(FIREBALL_1);\n+            FROSTFIREBOLT = GetSpell(FROSTFIRE_BOLT_1) ? FROSTFIRE_BOLT_1 : FIREBALL_1;\n+        }\n+\n+        void ApplyClassPassives() const override\n+        {\n+            uint8 level = master->GetLevel();\n+            bool isArca = GetSpec() == BOT_SPEC_MAGE_ARCANE;\n+            bool isFire = GetSpec() == BOT_SPEC_MAGE_FIRE;\n+            bool isFros = GetSpec() == BOT_SPEC_MAGE_FROST;\n+\n+            RefreshAura(ARCANE_CONCENTRATION, level >= 15 ? 1 : 0);\n+            RefreshAura(ARCANE_MEDITATION, level >= 25 ? 1 : 0); //mana regen 1\n+            RefreshAura(TORMENT_THE_WEAK, level >= 25 ? 1 : 0);\n+            RefreshAura(IMPROVED_COUNTERSPELL2, isArca && level >= 26 ? 1 : 0);\n+            RefreshAura(IMPROVED_COUNTERSPELL1, isArca && level >= 25 && level < 26 ? 1 : 0);\n+            RefreshAura(ARCANE_POTENCY2, isArca && level >= 36 ? 1 : 0);\n+            RefreshAura(ARCANE_POTENCY1, isArca && level >= 35 && level < 36 ? 1 : 0);\n+            RefreshAura(ARCANE_EMPOWERMENT, isArca && level >= 40 ? 1 : 0);\n+            RefreshAura(INCANTERS_ABSORPTION3, isArca && level >= 42 ? 1 : 0);\n+            RefreshAura(INCANTERS_ABSORPTION2, isArca && level >= 41 && level < 42 ? 1 : 0);\n+            RefreshAura(INCANTERS_ABSORPTION1, isArca && level >= 40 && level < 41 ? 1 : 0);\n+            RefreshAura(MISSILE_BARRAGE, isArca && level >= 45 ? 1 : 0);\n+\n+            RefreshAura(IGNITE, level >= 15 ? 1 : 0);\n+            RefreshAura(BURNING_DETERMINATION, level >= 15 ? 1 : 0);\n+            RefreshAura(IMPACT, level >= 20 ? 1 : 0);\n+            RefreshAura(IMPROVED_SCORCH, level >= 25 ? 1 : 0);\n+            RefreshAura(MOLTEN_SHIELDS, level >= 25 ? 1 : 0);\n+            RefreshAura(MASTER_OF_ELEMENTS, level >= 25 ? 1 : 0);\n+            RefreshAura(BLAZING_SPEED, isFire && level >= 35 ? 1 : 0);\n+            RefreshAura(PYROMANIAC, isFire && level >= 40 ? 1 : 0); //mana regen 2\n+            RefreshAura(FIRESTARTER2, isFire && level >= 51 ? 1 : 0);\n+            RefreshAura(FIRESTARTER1, isFire && level >= 50 && level < 51 ? 1 : 0);\n+            RefreshAura(HOT_STREAK, isFire && level >= 50 ? 1 : 0);\n+\n+            RefreshAura(FROSTBITE3, level >= 12 ? 1 : 0);\n+            RefreshAura(FROSTBITE2, level >= 11 && level < 12 ? 1 : 0);\n+            RefreshAura(FROSTBITE1, level >= 10 && level < 11 ? 1 : 0);\n+            RefreshAura(FROST_WARDING, level >= 15 ? 1 : 0);\n+            RefreshAura(IMPROVED_BLIZZARD, level >= 20 ? 1 : 0);\n+            RefreshAura(SHATTER3, level >= 27 ? 1 : 0);\n+            RefreshAura(SHATTER2, level >= 26 && level < 27 ? 1 : 0);\n+            RefreshAura(SHATTER1, level >= 25 && level < 26 ? 1 : 0);\n+            RefreshAura(WINTERS_CHILL3, isFros && level >= 37 ? 1 : 0);\n+            RefreshAura(WINTERS_CHILL2, isFros && level >= 36 && level < 37 ? 1 : 0);\n+            RefreshAura(WINTERS_CHILL1, isFros && level >= 35 && level < 36 ? 1 : 0);\n+            RefreshAura(SHATTERED_BARRIER, isFros && level >= 45 ? 1 : 0);\n+            //RefreshAura(ARCTIC_WINDS, isFros && level >= 45 ? 1 : 0); //only miss chance\n+            RefreshAura(FINGERS_OF_FROST, isFros && level >= 45 ? 1 : 0);\n+            RefreshAura(BRAIN_FREEZE3, isFros && level >= 53 ? 1 : 0);\n+            RefreshAura(BRAIN_FREEZE2, isFros && level >= 51 && level < 52 ? 1 : 0);\n+            RefreshAura(BRAIN_FREEZE1, isFros && level >= 50 && level < 51 ? 1 : 0);\n+\n+            RefreshAura(GLYPH_POLYMORPH, level >= 15 ? 1 : 0);\n+            RefreshAura(GLYPG_REMOVE_CURSE, level >= 18 ? 1 : 0);\n+            RefreshAura(GLYPH_ICY_VEINS, level >= 20 ? 1 : 0);\n+            RefreshAura(GLYPH_LIVING_BOMB, level >= 60 ? 1 : 0);\n+            RefreshAura(GLYPH_ICE_LANCE, level >= 66 ? 1 : 0);\n+        }\n+\n+        bool CanUseManually(uint32 basespell) const override\n+        {\n+            switch (basespell)\n+            {\n+                case DAMPENMAGIC_1:\n+                case AMPLIFYMAGIC_1:\n+                case ARCANEINTELLECT_1:\n+                case EVOCATION_1:\n+                case REMOVE_CURSE_1:\n+                case FOCUS_MAGIC_1:\n+                case PRESENCE_OF_MIND_1:\n+                case ARCANE_POWER_1:\n+                case ICE_ARMOR_1:\n+                case ICE_BARRIER_1:\n+                case COMBUSTION_1:\n+                case ICY_VEINS_1:\n+                case BLAST_WAVE_1:\n+                case FLAMESTRIKE_1:\n+                case FROST_NOVA_1:\n+                case BLIZZARD_1:\n+                case ICE_BLOCK_1:\n+                case COLD_SNAP_1:\n+                case INVISIBILITY_1:\n+                case SLOW_FALL_1:\n+                case CONJURE_MANA_GEM_1:\n+                case SUMMON_WATER_ELEMENTAL_1:\n+                case MIRROR_IMAGE_1:\n+                    return true;\n+                case FROST_ARMOR_1:\n+                    return !GetSpell(ICE_ARMOR_1);\n+                //case MANA_GEM_1:\n+                //    return manaGemCharges > 0;\n+                default:\n+                    return false;\n+            }\n+        }\n+\n+        std::vector<uint32> const* GetDamagingSpellsList() const override\n+        {\n+            return &Mage_spells_damage;\n+        }\n+        std::vector<uint32> const* GetCCSpellsList() const override\n+        {\n+            return &Mage_spells_cc;\n+        }\n+        //std::vector<uint32> const* GetHealingSpellsList() const override\n+        //{\n+        //    return &Mage_spells_heal;\n+        //}\n+        std::vector<uint32> const* GetSupportSpellsList() const override\n+        {\n+            return &Mage_spells_support;\n+        }\n+\n+    private:\n+        //Spells\n+/*frst*/uint32 FROSTFIREBOLT;\n+        //Timers\n+/*exc.*/uint32 polyCheckTimer, fmCheckTimer, iceblockCheckTimer, shieldCheckTimer;\n+        //Counters\n+/*exc.*/uint8 arcaneBlastStack;\n+/*exc.*/uint8 manaGemCharges;\n+        //Check\n+/*exc.*/bool poly, shielded, fbCasted;\n+/*exc.*/bool canFrostWard, canFireWard;\n+    };\n+};\n+\n+void AddSC_mage_bot()\n+{\n+    new mage_bot();\n+}\ndiff --git a/src/server/game/AI/NpcBots/bot_necromancer_ai.cpp b/src/server/game/AI/NpcBots/bot_necromancer_ai.cpp\nnew file mode 100644\nindex 0000000000..801b2f86c1\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bot_necromancer_ai.cpp\n@@ -0,0 +1,751 @@\n+#include \"bot_ai.h\"\n+#include \"bot_GridNotifiers.h\"\n+#include \"botlogtraits.h\"\n+#include \"botmgr.h\"\n+#include \"botspell.h\"\n+#include \"bottext.h\"\n+#include \"bottraits.h\"\n+#include \"CellImpl.h\"\n+#include \"Containers.h\"\n+#include \"GridNotifiers.h\"\n+#include \"GridNotifiersImpl.h\"\n+#include \"Group.h\"\n+//#include \"MotionMaster.h\"\n+#include \"Player.h\"\n+#include \"ScriptMgr.h\"\n+#include \"Spell.h\"\n+#include \"SpellAuras.h\"\n+#include \"SpellMgr.h\"\n+#include \"TemporarySummon.h\"\n+//#include \"World.h\"\n+/*\n+Necromancer NpcBot (by Trickerer onlysuffering@gmail.com)\n+Description:\n+Necromancer (Warcraft III / Disablo II tribute)\n+Abilities:\n+1) Shadow Bolt: main attack, single target, no mana cost\n+Complete - 90%\n+TODO:\n+maximum skeletons for botparty\n+fine-tune corpse explosion conditions\n+*/\n+\n+enum NecromancerBaseSpells\n+{\n+    MAIN_ATTACK_1           = SPELL_SHADOW_BOLT2,\n+    RAISE_DEAD_1            = SPELL_RAISE_DEAD,\n+    UNHOLY_FRENZY_1         = SPELL_UNHOLY_FRENZY,\n+    CRIPPLE_1               = SPELL_CRIPPLE,\n+\n+    CORPSE_EXPLOSION_1      = SPELL_CORPSE_EXPLOSION,\n+    //ATTRACT_1               = SPELL_BLOOD_CURSE\n+};\n+enum NecromancerSpecial\n+{\n+    MH_ATTACK_ANIM          = SPELL_ATTACK_MELEE_1H,\n+\n+    RAISE_DEAD_COST         = 50 * 5, // 75 * 5, Reduced to match playstyle (1-2,3?) necromancers\n+    UNHOLY_FRENZY_COST      = 50 * 5,\n+    CRIPPLE_COST            = 175 * 5,\n+    CORPSE_EXPLOSION_COST   = 100 * 5,\n+    //ATTRACT_COST            = 200 * 5,\n+\n+    //get 80% mana back if casting on a skeleton\n+    UNHOLY_FRENZY_REFUND    = UNHOLY_FRENZY_COST / 10 * 8,\n+\n+    MAX_MINIONS             = 12,\n+\n+    SPELL_SPAWN_ANIM        = 25035,\n+    SPELL_BLOODY_EXPLOSION  = 36599,\n+\n+    MODEL_BLOODY_BONES      = 25538,\n+\n+    CORPSE_EXPLOSION_DAMAGE = 50444, //DK spell\n+\n+    CE_DAMAGE_PCT_BASE      = 35,\n+    CE_DAMAGE_PCT_PER_LEVEL = 1,\n+\n+    CE_MIN_TARGETS          = 3\n+};\n+\n+static const std::vector<uint32> Necromancer_spells_damage{ /*MAIN_ATTACK_1, */CORPSE_EXPLOSION_1/*, ATTRACT_1*/ };\n+static const std::vector<uint32> Necromancer_spells_support{ RAISE_DEAD_1, UNHOLY_FRENZY_1, CRIPPLE_1/*, ATTRACT_1*/ };\n+\n+class necromancer_bot : public CreatureScript\n+{\n+public:\n+    necromancer_bot() : CreatureScript(\"necromancer_bot\") { }\n+\n+    CreatureAI* GetAI(Creature* creature) const override\n+    {\n+        return new necromancer_botAI(creature);\n+    }\n+\n+    struct necromancer_botAI : public bot_ai\n+    {\n+        necromancer_botAI(Creature* creature) : bot_ai(creature)\n+        {\n+            _botclass = BOT_CLASS_NECROMANCER;\n+\n+            InitUnitFlags();\n+\n+            //necromancer immunities\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_POSSESS, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_CHARM, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_SILENCE, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_SHAPESHIFT, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_TRANSFORM, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_BLOCK_SPELL_FAMILY, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_POLYMORPH, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_INTERRUPT, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SILENCE, true);\n+        }\n+\n+        bool doCast(Unit* victim, uint32 spellId)\n+        {\n+            if (CheckBotCast(victim, spellId) != SPELL_CAST_OK)\n+                return false;\n+            return bot_ai::doCast(victim, spellId);\n+        }\n+\n+        void StartAttack(Unit* u, bool force = false)\n+        {\n+            if (!bot_ai::StartAttack(u, force))\n+                return;\n+            GetInPosition(force, u);\n+        }\n+\n+        void JustEnteredCombat(Unit* u) override { bot_ai::JustEnteredCombat(u); }\n+        void AttackStart(Unit*) override { }\n+        void KilledUnit(Unit* u) override { bot_ai::KilledUnit(u); }\n+        void EnterEvadeMode(EvadeReason why = EVADE_REASON_OTHER) override { bot_ai::EnterEvadeMode(why); }\n+        void MoveInLineOfSight(Unit* u) override { bot_ai::MoveInLineOfSight(u); }\n+        void JustDied(Unit* u) override { UnsummonAll(false); bot_ai::JustDied(u); }\n+        void DoNonCombatActions(uint32 /*diff*/) { }\n+\n+        void CheckCorpseExplosion(uint32 diff)\n+        {\n+            if (!IsSpellReady(CORPSE_EXPLOSION_1, diff) || _corpseExplosionCheckTimer > diff ||\n+                me->GetLevel() < 40 || me->GetPower(POWER_MANA) < CORPSE_EXPLOSION_COST ||  Rand() > 80)\n+                return;\n+\n+            _corpseExplosionCheckTimer = 500;\n+\n+            SpellInfo const* ceinfo = AssertBotSpellInfoOverride(GetSpell(CORPSE_EXPLOSION_1));\n+            float ceradius = ceinfo->GetEffect(EFFECT_0).RadiusEntry->Radius;\n+            ApplyBotSpellRadiusMods(ceinfo, ceradius);\n+\n+            //1. Corpse near current target\n+            if ((IAmFree() || !master->GetGroup() || master->GetGroup()->GetMembersCount() <= 3) &&\n+                me->GetVictim() && me->GetVictim()->GetHealth() <= me->GetMaxHealth() * 3)\n+            {\n+                auto corpse_pred = [this, mindist = ceradius](Creature const* c) mutable {\n+                    if (_isUsableCorpse(c) && c->GetDistance(me->GetVictim()) < mindist)\n+                    {\n+                        mindist = c->GetDistance(me->GetVictim());\n+                        return true;\n+                    }\n+                    return false;\n+                };\n+                Creature* creature = nullptr;\n+                Bcore::CreatureLastSearcher searcher(me, creature, corpse_pred);\n+                Cell::VisitAllObjects(me, searcher, ceinfo->RangeEntry->RangeMax[0]);\n+\n+                if (creature)\n+                {\n+                    if (doCast(creature, GetSpell(CORPSE_EXPLOSION_1)))\n+                    {\n+                        me->CastSpell(me, MH_ATTACK_ANIM, true);\n+                        return;\n+                    }\n+                }\n+            }\n+\n+            //2. Find a corpse with enough idiots around it (this one in n^2 so open for reviews)\n+            {\n+                auto corpse_pred = [this, ceradius = ceradius, maxmob = std::size_t(CE_MIN_TARGETS-1)](Creature const* c) mutable {\n+                    if (_isUsableCorpse(c))\n+                    {\n+                        std::list<Unit*> units;\n+                        NearbyHostileUnitCheck check(me, ceradius, this, 0, c);\n+                        Bcore::UnitListSearcher searcher(c, units, check);\n+                        Cell::VisitAllObjects(c, searcher, ceradius);\n+                        if (units.size() > maxmob)\n+                        {\n+                            maxmob = units.size();\n+                            return true;\n+                        }\n+                        return false;\n+                    }\n+                    return false;\n+                };\n+                std::list<Creature*> corpses;\n+                Bcore::CreatureListSearcher searcher(me, corpses, corpse_pred);\n+                Cell::VisitAllObjects(me, searcher, ceinfo->RangeEntry->RangeMax[0]);\n+\n+                if (Creature* corpse = corpses.empty() ? nullptr : corpses.size() == 1 ? corpses.front() :\n+                    Bcore::Containers::SelectRandomContainerElement(corpses))\n+                {\n+                    if (doCast(corpse, GetSpell(CORPSE_EXPLOSION_1)))\n+                    {\n+                        me->CastSpell(me, MH_ATTACK_ANIM, true);\n+                        return;\n+                    }\n+                }\n+            }\n+        }\n+\n+        void CheckRaiseDead(uint32 diff)\n+        {\n+            if (!IsSpellReady(RAISE_DEAD_1, diff) || _raiseDeadCheckTimer > diff || _minions.size() + 2 > MAX_MINIONS ||\n+                me->GetPower(POWER_MANA) < RAISE_DEAD_COST || Rand() > 50)\n+                return;\n+\n+            _raiseDeadCheckTimer = 500;\n+\n+            auto corpse_pred = [this, mindist = 25.f](Creature const* c) mutable {\n+                if (_isUsableCorpse(c) && c->GetDistance(me) < mindist)\n+                {\n+                    mindist = c->GetDistance(me);\n+                    return true;\n+                }\n+                return false;\n+            };\n+            Creature* creature = nullptr;\n+            Bcore::CreatureLastSearcher searcher(me, creature, corpse_pred);\n+            Cell::VisitAllObjects(me, searcher, 25.f);\n+\n+            if (creature)\n+            {\n+                if (doCast(creature, GetSpell(RAISE_DEAD_1)))\n+                    return;\n+            }\n+        }\n+\n+        void CheckUnholyFrenzy(uint32 diff)\n+        {\n+            if (!IsSpellReady(UNHOLY_FRENZY_1, diff) || me->GetLevel() < 30 || me->GetPower(POWER_MANA) < UNHOLY_FRENZY_COST || Rand() > 35)\n+                return;\n+\n+            static const auto frenzy_pred_player = [](Player const* pl, Unit const* nec) -> bool {\n+                return (pl->GetVictim() && pl->IsInCombat() && IsMeleeClass(pl->GetClass()) && nec->GetDistance(pl) < 30 &&\n+                    pl->GetDistance(pl->GetVictim()) < 15 && pl->getAttackers().empty() && !CCed(pl, true) &&\n+                    !pl->HasAuraType(SPELL_AURA_PERIODIC_DAMAGE) && pl->GetHealth() >= nec->GetMaxHealth());\n+            };\n+\n+            static const auto frenzy_pred_bot = [](Creature const* bot, Unit const* nec) -> bool {\n+                return (IsMeleeClass(bot->GetBotClass()) && bot->GetVictim() && !bot->GetBotAI()->IsTank(bot) &&\n+                    bot->GetBotAI()->HasRole(BOT_ROLE_DPS) && !bot->GetBotAI()->HasRole(BOT_ROLE_RANGED) &&\n+                    nec->GetDistance(bot) < 30 && bot->GetDistance(bot->GetVictim()) < 15 &&\n+                    bot->getAttackers().empty() && !CCed(bot, true) &&\n+                    !bot->HasAuraType(SPELL_AURA_PERIODIC_DAMAGE) && bot->GetHealth() >= nec->GetMaxHealth());\n+            };\n+\n+            Unit* target = nullptr;\n+\n+            //master\n+            if (!IsTank(master) && frenzy_pred_player(master, me))\n+                target = master;\n+            //minions\n+            else if (HasRole(BOT_ROLE_DPS) && !_minions.empty())\n+            {\n+                for (Unit* minion : _minions)\n+                {\n+                    if (minion->GetVictim() && GetHealthPCT(minion) > 80 && me->GetDistance(minion) < 30 && !CCed(minion, true) &&\n+                        !minion->HasAuraType(SPELL_AURA_PERIODIC_DAMAGE))\n+                    {\n+                        target = minion;\n+                        break;\n+                    }\n+                }\n+            }\n+\n+            if (!target)\n+            {\n+                std::set<Unit*> targets;\n+                if (Group const* gr = !IAmFree() ? master->GetGroup() : GetGroup())\n+                {\n+                    std::vector<Unit*> members = BotMgr::GetAllGroupMembers(gr);\n+                    for (auto i : NPCBots::index_array<uint8, 2>)\n+                    {\n+                        if (!targets.empty())\n+                            break;\n+                        for (Unit* member : members)\n+                        {\n+                            if (!(i == 0 ? member->IsPlayer() : member->IsNPCBot()) || me->GetMap() != member->FindMap() ||\n+                                member->GetGUID() == master->GetGUID())\n+                                continue;\n+                            if (member->IsPlayer() ?\n+                                (!IsTank(member) && frenzy_pred_player(member->ToPlayer(), me)) :\n+                                frenzy_pred_bot(member->ToCreature(), me))\n+                                targets.insert(member);\n+                        }\n+                    }\n+                }\n+                if (!targets.empty())\n+                    target = targets.size() == 1u ? *targets.begin() : Bcore::Containers::SelectRandomContainerElement(targets);\n+            }\n+\n+            if (target && doCast(target, GetSpell(UNHOLY_FRENZY_1)))\n+            {\n+                if (target->IsPlayer())\n+                    ReportSpellCast(UNHOLY_FRENZY_1, LocalizedNpcText(target->ToPlayer(), BOT_TEXT__ON_YOU), target->ToPlayer());\n+                return;\n+            }\n+\n+            SetSpellCooldown(UNHOLY_FRENZY_1, 1000); //fail\n+        }\n+\n+        void UpdateAI(uint32 diff) override\n+        {\n+            if (!GlobalUpdate(diff))\n+                return;\n+\n+            //Interrupt corpse-usage spells if no longer usable\n+            if (Spell const* spell = me->GetCurrentSpell(CURRENT_GENERIC_SPELL))\n+            {\n+                if ((spell->GetSpellInfo()->GetFirstRankSpell()->Id == RAISE_DEAD_1 ||\n+                    spell->GetSpellInfo()->GetFirstRankSpell()->Id == CORPSE_EXPLOSION_1))\n+                {\n+                    Unit const* target = ObjectAccessor::GetUnit(*me, spell->m_targets.GetObjectTargetGUID());\n+                    if (target && target->GetDisplayId() != target->GetNativeDisplayId())\n+                        me->InterruptSpell(CURRENT_GENERIC_SPELL);\n+                }\n+            }\n+\n+            DoVehicleActions(diff);\n+            if (!CanBotAttackOnVehicle())\n+                return;\n+\n+            if (IsPotionReady())\n+            {\n+                if (me->GetPower(POWER_MANA) < CORPSE_EXPLOSION_COST)\n+                    DrinkPotion(true);\n+                else if (GetHealthPCT(me) < 50)\n+                    DrinkPotion(false);\n+            }\n+\n+            if (ProcessImmediateNonAttackTarget())\n+                return;\n+\n+            if (!CheckAttackTarget())\n+                return;\n+\n+            if (IsCasting())\n+                return;\n+\n+            CheckCorpseExplosion(diff);\n+            CheckRaiseDead(diff);\n+            CheckUnholyFrenzy(diff);\n+\n+            CheckUsableItems(diff);\n+\n+            Attack(diff);\n+        }\n+\n+        void Attack(uint32 diff)\n+        {\n+            Unit* mytar = opponent ? opponent : disttarget ? disttarget : nullptr;\n+            if (!mytar)\n+                return;\n+\n+            StartAttack(mytar, IsMelee());\n+\n+            CheckAttackState();\n+            if (!me->IsAlive() || !mytar->IsAlive())\n+                return;\n+\n+            MoveBehind(mytar);\n+\n+            if (!HasRole(BOT_ROLE_DPS))\n+                return;\n+\n+            if (GC_Timer > diff)\n+                return;\n+\n+            if (!CanAffectVictimAny(mytar, SPELL_SCHOOL_SHADOW, SPELL_SCHOOL_ARCANE))\n+                return;\n+\n+            //Cripple\n+            if (IsSpellReady(CRIPPLE_1, diff) && me->GetDistance(mytar) < 30 &&\n+                me->GetLevel() >= 50 && me->GetPower(POWER_MANA) >= CRIPPLE_COST &&\n+                mytar->GetMaxNegativeAuraModifier(SPELL_AURA_MOD_MELEE_HASTE) >= 0 &&\n+                (mytar->IsPlayer() || mytar->GetHealth() > me->GetMaxHealth() * 3))\n+            {\n+                if (doCast(mytar, GetSpell(CRIPPLE_1)))\n+                    return;\n+            }\n+\n+            if (IsSpellReady(MAIN_ATTACK_1, diff) && me->GetDistance(mytar) < 30)\n+            {\n+                if (doCast(mytar, GetSpell(MAIN_ATTACK_1)))\n+                    return;\n+            }\n+        }\n+\n+        //void ApplyClassDamageMultiplierSpell(int32& damage, SpellNonMeleeDamage& /*damageinfo*/, SpellInfo const* spellInfo, WeaponAttackType /*attackType*/, bool iscrit) const override\n+        //{\n+        //    uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+        //    //uint8 lvl = me->GetLevel();\n+        //    float fdamage = float(damage);\n+\n+        //    //apply bonus damage mods\n+        //    float pctbonus = 1.0f;\n+        //    if (iscrit)\n+        //        pctbonus *= 1.333f;\n+\n+        //    if (baseId == MAIN_ATTACK_1)\n+        //        fdamage += me->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_MAGIC) * (spellInfo->_effects[0].BonusCoefficient - 1.f) * me->CalculateDefaultCoefficient(spellInfo, SPELL_DIRECT_DAMAGE) * me->CalculateSpellpowerCoefficientLevelPenalty(spellInfo);\n+\n+        //    damage = int32(fdamage * pctbonus);\n+        //}\n+\n+        void ApplyClassSpellRadiusMods(SpellInfo const* spellInfo, float& radius) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+            float pctbonus = 1.0f;\n+\n+            //flat mods\n+            //Corpse Explosion radii per level\n+            if (lvl > 40 && (baseId == CORPSE_EXPLOSION_1 || baseId == CORPSE_EXPLOSION_DAMAGE))\n+                radius += 0.25f * (lvl - 40);\n+\n+            radius = radius * pctbonus;\n+        }\n+\n+        void ApplyClassEffectMods(SpellInfo const* spellInfo, uint8 effIndex, float& value) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //uint8 lvl = me->GetLevel();\n+            float pctbonus = 1.0f;\n+\n+            //Set damage for Unholy Frenzy: 45 sec, 15 ticks, total damage is 125% if Necromancer's max health\n+            if (baseId == UNHOLY_FRENZY_1 && effIndex == EFFECT_1)\n+                value += (me->GetMaxHealth() * 1.25f) / std::max<uint32>(1, spellInfo->GetMaxTicks());\n+\n+            value = value * pctbonus;\n+        }\n+\n+        void ApplyClassThreatMods(SpellInfo const* spellInfo, float& threat) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            float pctbonus = 1.0f;\n+\n+            if (baseId == CORPSE_EXPLOSION_DAMAGE)\n+                threat = 0.f;\n+\n+            threat = threat * pctbonus;\n+        }\n+\n+        void OnClassSpellGo(SpellInfo const* spellInfo) override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+\n+            if (baseId == MAIN_ATTACK_1 || baseId == RAISE_DEAD_1 || baseId == UNHOLY_FRENZY_1 ||\n+                baseId == CRIPPLE_1 || baseId == CORPSE_EXPLOSION_1/* || baseId == ATTRACT_1*/)\n+                GC_Timer = uint32(me->GetAttackTime(BASE_ATTACK) * me->m_modAttackSpeedPct[BASE_ATTACK]);\n+\n+            if (baseId == MAIN_ATTACK_1 || baseId == RAISE_DEAD_1 || baseId == UNHOLY_FRENZY_1 ||\n+                baseId == CRIPPLE_1/* || baseId == CORPSE_EXPLOSION_1*//* || baseId == ATTRACT_1*/)\n+                me->CastSpell(me, MH_ATTACK_ANIM, true);\n+        }\n+\n+        void SpellHitTarget(WorldObject* wtarget, SpellInfo const* spell) override\n+        {\n+            Unit* target = wtarget->ToUnit();\n+            if (!target)\n+                return;\n+\n+            uint32 baseId = spell->GetFirstRankSpell()->Id;\n+\n+            if (baseId != MAIN_ATTACK_1)\n+            {\n+                if (baseId == CORPSE_EXPLOSION_1)\n+                {\n+                    ASSERT(!IsInBotParty(target));\n+                    target->CastSpell(target, CORPSE_EXPLOSION_VISUAL, true);\n+                    target->CastSpell(target, SPELL_BLOODY_EXPLOSION, true);\n+                    target->SetDisplayId(MODEL_BLOODY_BONES);\n+\n+                    //Corpse Explosion damage: progress with level 35 to 75% (base level 40)\n+                    int32 fdamage = CalculatePct(target->GetMaxHealth(),\n+                        CE_DAMAGE_PCT_BASE + CE_DAMAGE_PCT_PER_LEVEL * (uint32(me->GetLevel()) - spell->BaseLevel));\n+\n+                    CastSpellExtraArgs args(TRIGGERED_FULL_MASK);\n+                    args.AddSpellBP0(fdamage);\n+                    me->CastSpell(target, CORPSE_EXPLOSION_DAMAGE, args);\n+                }\n+\n+                if (baseId == RAISE_DEAD_1)\n+                {\n+                    ASSERT(!IsInBotParty(target));\n+                    //Two skeletons\n+                    for ([[maybe_unused]] auto i : NPCBots::index_array<uint8, 2>)\n+                        SummonBotPet(target);\n+                    //visuals\n+                    if (!target->IsPet() && !target->IsVehicle() && !target->ToCreature()->isWorldBoss() && !target->ToCreature()->IsDungeonBoss())\n+                    {\n+                        target->CastSpell(target, SPELL_BLOODY_EXPLOSION, true);\n+                        target->SetDisplayId(MODEL_BLOODY_BONES);\n+                    }\n+                }\n+\n+                if (baseId == UNHOLY_FRENZY_1)\n+                {\n+                    if (target->GetEntry() == BOT_PET_NECROSKELETON && _minions.contains(target->ToCreature()))\n+                    {\n+                        //get 80% mana back if casting on a skeleton\n+                        me->EnergizeBySpell(me, UNHOLY_FRENZY_1, UNHOLY_FRENZY_REFUND, POWER_MANA);\n+                    }\n+                }\n+\n+                if (baseId == CRIPPLE_1)\n+                {\n+                    if (target->IsPlayer() || target->GetLevel() > 80)\n+                    {\n+                        if (Aura* crip = target->GetAura(spell->Id, me->GetGUID()))\n+                        {\n+                            int32 dur = std::min<int32>(crip->GetMaxDuration(), 10000);\n+                            crip->SetDuration(dur);\n+                            crip->SetMaxDuration(dur);\n+                        }\n+                    }\n+                }\n+            }\n+\n+            OnSpellHitTarget(target, spell);\n+        }\n+\n+        void SpellHit(WorldObject* wcaster, SpellInfo const* spell) override\n+        {\n+            Unit* caster = wcaster->ToUnit();\n+            if (!caster)\n+                return;\n+\n+            OnSpellHit(caster, spell);\n+        }\n+\n+        void DamageDealt(Unit* victim, uint32& damage, DamageEffectType damageType) override\n+        {\n+            bot_ai::DamageDealt(victim, damage, damageType);\n+        }\n+\n+        void DamageTaken(Unit* u, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo*/) override\n+        {\n+            if (!u)\n+                return;\n+            if (!u->IsInCombat() && !me->IsInCombat())\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void OwnerAttackedBy(Unit* u) override\n+        {\n+            if (!u)\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        uint8 GetPetPositionNumber(Creature const* summon) const override\n+        {\n+            uint8 i = 0;\n+            for (Unit const* s : _minions)\n+            {\n+                if (s->GetGUID() == summon->GetGUID())\n+                    return i;\n+                ++i;\n+            }\n+            return 0;\n+        }\n+\n+        void SummonBotPet(Unit* from)\n+        {\n+            if (_minions.size() >= MAX_MINIONS)\n+            {\n+                Unit* u = nullptr;\n+                //try 1: by minimal level\n+                uint8 minlevel = me->GetLevel();\n+                for (Unit* s : _minions)\n+                {\n+                    if (s->GetLevel() < minlevel)\n+                    {\n+                        minlevel = s->GetLevel();\n+                        u = s;\n+                    }\n+                }\n+                //try 2: by minimal duration (if expiring already)\n+                if (!u)\n+                {\n+                    uint32 minduration = static_cast<uint32>((*_minions.begin())->GetAI()->GetData(BOTPETAI_MISC_DURATION_MAX) * 3 / 4);\n+                    for (Unit* s : _minions)\n+                    {\n+                        if (s->GetAI()->GetData(BOTPETAI_MISC_DURATION) > minduration)\n+                        {\n+                            minduration = s->GetAI()->GetData(BOTPETAI_MISC_DURATION);\n+                            u = s;\n+                        }\n+                    }\n+                }\n+\n+                if (!u)\n+                    return;\n+\n+                u->ToTempSummon()->UnSummon();\n+            }\n+\n+            Position pos = from->GetPosition();\n+\n+            Creature* myPet = me->SummonCreature(BOT_PET_NECROSKELETON, pos, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 1s);\n+            myPet->SetCreator(master);\n+            myPet->SetOwnerGUID(me->GetGUID());\n+            myPet->SetFaction(master->GetFaction());\n+            myPet->SetControlledByPlayer(!IAmFree());\n+            myPet->SetPvP(me->IsPvP());\n+            myPet->SetByteValue(UNIT_FIELD_BYTES_2, 1, master->GetByteValue(UNIT_FIELD_BYTES_2, 1));\n+            myPet->SetUInt32Value(UNIT_CREATED_BY_SPELL, RAISE_DEAD_1);\n+\n+            //dark minion immunities\n+            myPet->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_SHAPESHIFT, true);\n+            myPet->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_TRANSFORM, true);\n+            myPet->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_FEAR, true);\n+            myPet->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_POLYMORPH, true);\n+            myPet->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_FEAR, true);\n+            myPet->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_HORROR, true);\n+            myPet->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SLEEP, true);\n+            //heal\n+            myPet->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_HEAL, true);\n+            myPet->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_HEAL_PCT, true);\n+            myPet->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_PERIODIC_HEAL, true);\n+\n+            myPet->CastSpell(myPet, SPELL_SPAWN_ANIM, true);\n+            if (Aura* stun = myPet->AddAura(SUMMONING_DISORIENTATION, myPet))\n+            {\n+                stun->SetDuration(1500);\n+                stun->SetMaxDuration(1500);\n+            }\n+\n+            myPet->GetAI()->SetData(BOTPETAI_MISC_MAXLEVEL, me->GetLevel());\n+            _minions.insert(myPet);\n+        }\n+\n+        void UnsummonAll(bool savePets = true) override\n+        {\n+            UnsummonCreatures(_minions, savePets);\n+        }\n+\n+        void SummonedCreatureDies(Creature* /*summon*/, Unit* /*killer*/) override\n+        {\n+        }\n+\n+        void SummonedCreatureDespawn(Creature* summon) override\n+        {\n+            if (_minions.contains(summon))\n+                _minions.erase(summon);\n+        }\n+\n+        uint32 GetAIMiscValue(uint32 data) const override\n+        {\n+            switch (data)\n+            {\n+                case BOTAI_MISC_PET_TYPE:\n+                    return BOT_PET_NECROSKELETON;\n+                default:\n+                    return 0;\n+            }\n+        }\n+\n+        void CheckAttackState() override\n+        {\n+        }\n+\n+        void OnBotEnterVehicle(Vehicle const* vehicle) override\n+        {\n+            me->Dismount();\n+            bot_ai::OnBotEnterVehicle(vehicle);\n+        }\n+\n+        void Reset() override\n+        {\n+            _corpseExplosionCheckTimer = 0;\n+            _raiseDeadCheckTimer = 0;\n+\n+            UnsummonAll(false);\n+\n+            DefaultInit();\n+        }\n+\n+        void ReduceCD(uint32 diff) override\n+        {\n+            if (_corpseExplosionCheckTimer > diff)          _corpseExplosionCheckTimer -= diff;\n+            if (_raiseDeadCheckTimer > diff)                _raiseDeadCheckTimer -= diff;\n+        }\n+\n+        void InitPowers() override\n+        {\n+            me->SetPowerType(POWER_MANA);\n+        }\n+\n+        void InitSpells() override\n+        {\n+            InitSpellMap(MAIN_ATTACK_1, true, false);\n+            InitSpellMap(RAISE_DEAD_1, true, false);\n+            InitSpellMap(UNHOLY_FRENZY_1, true, false);\n+            InitSpellMap(CRIPPLE_1, true, false);\n+            InitSpellMap(CORPSE_EXPLOSION_1, true, false);\n+            //InitSpellMap(ATTRACT_1, true, false);\n+        }\n+\n+        void ApplyClassPassives() const override\n+        {\n+        }\n+\n+        bool CanUseManually(uint32 basespell) const override\n+        {\n+            switch (basespell)\n+            {\n+                case UNHOLY_FRENZY_1:\n+                    return me->GetLevel() >= 30;\n+                default:\n+                    return false;\n+            }\n+        }\n+\n+        std::vector<uint32> const* GetDamagingSpellsList() const override\n+        {\n+            return &Necromancer_spells_damage;\n+        }\n+        //std::vector<uint32> const* GetCCSpellsList() const override\n+        //{\n+        //    return &Necromancer_spells_cc;\n+        //}\n+        //std::vector<uint32> const* GetHealingSpellsList() const override\n+        //{\n+        //    return &Necromancer_spells_heal;\n+        //}\n+        std::vector<uint32> const* GetSupportSpellsList() const override\n+        {\n+            return &Necromancer_spells_support;\n+        }\n+\n+    private:\n+        bool _isUsableCorpse(Creature const* c) const\n+        {\n+            return c->getDeathState() == DeathState::CORPSE && c->GetDisplayId() == c->GetNativeDisplayId() &&\n+                !c->IsVehicle() && !c->isWorldBoss() && !c->IsDungeonBoss() &&\n+                ((1u << (c->GetCreatureType()-1)) & USABLE_CORPSE_CREATURE_TYPE_MASK) &&\n+                !c->IsControlledByPlayer() && !c->IsNPCBot() && c->GetMaxHealth() >= me->GetMaxHealth() / 4;\n+        }\n+\n+        uint32 _corpseExplosionCheckTimer;\n+        uint32 _raiseDeadCheckTimer;\n+\n+        using Summons = std::set<Creature*>;\n+        Summons _minions;\n+    };\n+};\n+\n+void AddSC_necromancer_bot()\n+{\n+    new necromancer_bot();\n+}\ndiff --git a/src/server/game/AI/NpcBots/bot_paladin_ai.cpp b/src/server/game/AI/NpcBots/bot_paladin_ai.cpp\nnew file mode 100644\nindex 0000000000..46fdae1688\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bot_paladin_ai.cpp\n@@ -0,0 +1,2633 @@\n+#include \"bot_ai.h\"\n+#include \"botlogtraits.h\"\n+#include \"botmgr.h\"\n+#include \"bottext.h\"\n+#include \"bottraits.h\"\n+#include \"Containers.h\"\n+#include \"Creature.h\"\n+#include \"Group.h\"\n+#include \"Item.h\"\n+#include \"Map.h\"\n+#include \"Player.h\"\n+#include \"ScriptMgr.h\"\n+#include \"SpellAuraEffects.h\"\n+#include \"SpellMgr.h\"\n+//#include \"WorldSession.h\"\n+/*\n+Paladin NpcBot (reworked by Trickerer onlysuffering@gmail.com)\n+Complete - Around 95%\n+TODO:\n+*/\n+\n+enum PaladinBaseSpells// all orignals\n+{\n+    FLASH_OF_LIGHT_1                    = 19750,\n+    HOLY_LIGHT_1                        = 635,\n+    LAY_ON_HANDS_1                      = 633,\n+    REDEMPTION_1                        = 7328,\n+    HAND_OF_FREEDOM_1                   = 1044,\n+    SACRED_SHIELD_1                     = 53601,\n+    HOLY_SHOCK_1                        = 20473,\n+    CLEANSE_1                           = 4987,\n+    HAND_OF_PROTECTION_1                = 1022,\n+    HAND_OF_SALVATION_1                 = 1038,\n+    HAND_OF_SACRIFICE_1                 = 6940,\n+    SEAL_OF_VENGEANCE_1                 = 31801,\n+    SEAL_OF_CORRUPTION_1                = 53736,\n+    SEAL_OF_COMMAND_1                   = 20375,\n+    SEAL_OF_LIGHT_1                     = 20165,\n+    SEAL_OF_RIGHTEOUSNESS_1             = 21084,\n+    SEAL_OF_WISDOM_1                    = 20166,\n+    SEAL_OF_JUSTICE_1                   = 20164,\n+    DIVINE_SACRIFICE_1                  = 64205,\n+    HAND_OF_RECKONING_1                 = 62124,\n+    RIGHTEOUS_DEFENSE_1                 = 31789,\n+    DIVINE_PLEA_1                       = 54428,\n+    REPENTANCE_1                        = 20066,\n+    TURN_EVIL_1                         = 10326,\n+    CRUSADER_STRIKE_1                   = 35395,\n+    JUDGEMENT_OF_LIGHT_1                = 20271,\n+    JUDGEMENT_OF_WISDOM_1               = 53408,\n+    JUDGEMENT_OF_JUSTICE_1              = 53407,\n+    CONSECRATION_1                      = 26573,\n+    HAMMER_OF_JUSTICE_1                 = 853,\n+    DIVINE_STORM_1                      = 53385,\n+    HAMMER_OF_WRATH_1                   = 24275,\n+    EXORCISM_1                          = 879,\n+    HOLY_WRATH_1                        = 2812,\n+    AVENGING_WRATH_1                    = 31884,\n+    RIGHTEOUS_FURY_1                    = 25780,\n+    HOLY_SHIELD_1                       = 20925,\n+    AVENGERS_SHIELD_1                   = 31935,\n+    HAMMER_OF_THE_RIGHTEOUS_1           = 53595,\n+    SHIELD_OF_RIGHTEOUSNESS_1           = 53600,\n+    BLESSING_OF_MIGHT_1                 = 19740,\n+    BLESSING_OF_WISDOM_1                = 19742,\n+    BLESSING_OF_KINGS_1                 = 20217,\n+    BLESSING_OF_SANCTUARY_1             = 20911,\n+    DEVOTION_AURA_1                     = 465,\n+    CONCENTRATION_AURA_1                = 19746,\n+    FIRE_RESISTANCE_AURA_1              = 19891,\n+    FROST_RESISTANCE_AURA_1             = 19888,\n+    SHADOW_RESISTANCE_AURA_1            = 19876,\n+    RETRIBUTION_AURA_1                  = 7294,\n+    CRUSADER_AURA_1                     = 32223,\n+\n+    DIVINE_INTERVENTION_1               = 19752,\n+    AURA_MASTERY_1                      = 31821,\n+    DIVINE_FAVOR_1                      = 20216,\n+    DIVINE_ILLUMINATION_1               = 31842,\n+    BEACON_OF_LIGHT_1                   = 53563,\n+\n+    DIVINE_PROTECTION_1                 = 498,\n+    DIVINE_SHIELD_1                     = 642,\n+\n+    PURIFY_1                            = 1152\n+};\n+enum PaladinPassives\n+{\n+//Talents\n+    DIVINE_PURPOSE                      = 31872,\n+    JUDGEMENTS_OF_THE_PURE              = 54155,\n+    JUDGEMENTS_OF_THE_WISE              = 31878,\n+    SACRED_CLEANSING                    = 53553,//rank 3\n+    RECKONING1                          = 20177,\n+    RECKONING2                          = 20179,\n+    RECKONING3                          = 20181,\n+    RECKONING4                          = 20180,\n+    RECKONING5                          = 20182,\n+    VINDICATION1                        = 9452,\n+    VINDICATION2                        = 26016,\n+    PURSUIT_OF_JUSTICE                  = 26023,//rank 2\n+    ART_OF_WAR                          = 53488,//rank 2\n+    IMPROVED_LAY_ON_HANDS               = 20235,//rank 2\n+    FANATICISM                          = 31881,//rank 3\n+    RIGHTEOUS_VENGEANCE1                = 53380,//rank 1\n+    RIGHTEOUS_VENGEANCE2                = 53381,//rank 2\n+    RIGHTEOUS_VENGEANCE3                = 53382,//rank 3\n+    VENGEANCE1                          = 20049,//rank 1\n+    VENGEANCE2                          = 20056,//rank 2\n+    VENGEANCE3                          = 20057,//rank 3\n+    SHEATH_OF_LIGHT1                    = 53501,//rank 1\n+    SHEATH_OF_LIGHT2                    = 53502,//rank 2\n+    SHEATH_OF_LIGHT3                    = 53503,//rank 3\n+    ARDENT_DEFENDER                     = 31852,//rank 3\n+    ILLUMINATION                        = 20215,//rank 5\n+    INFUSION_OF_LIGHT                   = 53576,//rank 2\n+    REDOUBT1                            = 20127,//rank 3\n+    REDOUBT2                            = 20130,//rank 3\n+    REDOUBT3                            = 20135,//rank 3\n+    IMPROVED_RIGHTEOUS_FURY             = 20470,//rank 3\n+    SHIELD_OF_THE_TEMPLAR               = 53711,//rank 3\n+    IMPROVED_DEVOTION_AURA              = 20140,//rank 3\n+    IMPROVED_CONCENTRATION_AURA         = 20256,//rank 3\n+    SANCTIFIED_RETRIBUTION              = 31869,\n+    SWIFT_RETRIBUTION                   = 53648,//rank 3\n+    LIGHTS_GRACE                        = 31836,//rank 3\n+    DIVINE_GUARDIAN                     = 53530,//rank 3\n+    //COMBAT_EXPERTISE                    = 31860,//rank 3\n+    CRUSADE                             = 31868,//rank 3\n+    ONE_HANDED_WEAPON_SPECIALIZATION    = 20198,//rank 3\n+    TWO_HANDED_WEAPON_SPECIALIZATION    = 20113,//rank 3\n+    //JUDGEMENTS_OF_THE_JUST              = 53696,//rank 2\n+    GUARDED_BY_THE_LIGHT                = 53585,//rank 2\n+    TOUCHED_BY_THE_LIGHT                = 53592,//rank 3\n+    HEART_OF_THE_CRUSADER               = 20337,//rank 3\n+//Glyphs\n+    GLYPH_HOLY_LIGHT                    = 54937,\n+    GLYPH_SALVATION                     = 63225,\n+//Innate\n+    JUDGEMENT_ANTI_PARRY_DODGE_PASSIVE  = 60091,\n+//other\n+    RECUCED_HOLY_LIGHT_CAST_TIME        = 37189,//not a typo\n+    //CLEANSE_HEAL_PASSIVE                = 28787\n+};\n+\n+enum PaladinSpecial\n+{\n+    SPECIFIC_BLESSING_WISDOM            = 0x01,\n+    SPECIFIC_BLESSING_KINGS             = 0x02,\n+    SPECIFIC_BLESSING_SANCTUARY         = 0x04,\n+    SPECIFIC_BLESSING_MIGHT             = 0x08,\n+    SPECIFIC_BLESSING_MY_BLESSING       = 0x10,\n+\n+    SPECIFIC_AURA_DEVOTION              = 0x01,\n+    SPECIFIC_AURA_CONCENTRATION         = 0x02,\n+    SPECIFIC_AURA_FIRE_RES              = 0x04,\n+    SPECIFIC_AURA_FROST_RES             = 0x08,\n+    SPECIFIC_AURA_SHADOW_RES            = 0x10,\n+    SPECIFIC_AURA_RETRIBUTION           = 0x20,\n+    SPECIFIC_AURA_CRUSADER              = 0x40,\n+    SPECIFIC_AURA_MY_AURA               = 0x80,\n+    SPECIFIC_AURA_ALL_AUTOUSE           = (SPECIFIC_AURA_DEVOTION | SPECIFIC_AURA_CONCENTRATION | SPECIFIC_AURA_RETRIBUTION | \\\n+                                            SPECIFIC_AURA_FIRE_RES | SPECIFIC_AURA_FROST_RES | SPECIFIC_AURA_SHADOW_RES),\n+\n+    FLASH_OF_LIGHT_HEAL_PERIODIC        = 66922,\n+\n+    ENLIGHTENMENT_BUFF                  = 43837,\n+    INFUSION_OF_LIGHT_BUFF              = 54149,//rank 2\n+    THE_ART_OF_WAR_BUFF                 = 59578,//rank 2\n+    //FORBEARANCE_AURA                    = 25771,\n+\n+    LIGHTS_GRACE_BUFF                   = 31834,\n+\n+    SEAL_OF_JUSTICE_STUN_AURA           = 20170,\n+    JUDGEMENTS_OF_THE_JUST_AURA         = 68055, //melee attack speed reduce\n+\n+    //JUDGEMENT_OF_LIGHT_AURA             = 20185,\n+    JUDGEMENT_OF_WISDOM_AURA            = 20186,\n+    //JUDGEMENT_OF_JUSTICE_AURA           = 20184,\n+\n+    GREATER_BLESSING_OF_MIGHT_1         = 25782,\n+    GREATER_BLESSING_OF_WISDOM_1        = 25894,\n+    GREATER_BLESSING_OF_KINGS_1         = 25898,\n+    GREATER_BLESSING_OF_SANCTUARY_1     = 25899,\n+    BATTLESHOUT_1                       = 6673,\n+\n+    HOLY_SHOCK_HEAL_1                   = 25914,\n+    ARDENT_DEFENDER_HEAL                = 66235,\n+    JUDGEMENT_OF_COMMAND_DAMAGE         = 20467,\n+    SPIRITUAL_ATTUNEMENT_ENERGIZE       = 31786,\n+    SACRED_SHIELD_AURA_TRIGGERED        = 58597,\n+\n+    AVENGING_WRATH_MARKER_SPELL         = 61987,\n+    IMMUNITY_SHIELD_MARKER_SPELL        = 61988,\n+\n+    IMPROVED_DEVOTION_AURA_SPELL        = 63514\n+};\n+\n+static const std::vector<uint32> Paladin_spells_damage\n+{ AVENGERS_SHIELD_1, CONSECRATION_1, CRUSADER_STRIKE_1, DIVINE_STORM_1, EXORCISM_1, JUDGEMENT_OF_LIGHT_1,\n+JUDGEMENT_OF_WISDOM_1, JUDGEMENT_OF_JUSTICE_1, HAMMER_OF_THE_RIGHTEOUS_1, HAMMER_OF_WRATH_1, HOLY_SHIELD_1,\n+HOLY_SHOCK_1, HOLY_WRATH_1, SHIELD_OF_RIGHTEOUSNESS_1, HAND_OF_RECKONING_1 };\n+static const std::vector<uint32> Paladin_spells_cc{ HAMMER_OF_JUSTICE_1, HOLY_WRATH_1, REPENTANCE_1, TURN_EVIL_1 };\n+static const std::vector<uint32> Paladin_spells_heal{ BEACON_OF_LIGHT_1, FLASH_OF_LIGHT_1, HOLY_LIGHT_1, HOLY_SHOCK_1, LAY_ON_HANDS_1 };\n+static const std::vector<uint32> Paladin_spells_support\n+{ /*DEVOTION_AURA_1, CONCENTRATION_AURA_1, FIRE_RESISTANCE_AURA_1, FROST_RESISTANCE_AURA_1, SHADOW_RESISTANCE_AURA_1,\n+RETRIBUTION_AURA_1, CRUSADER_AURA_1, */AURA_MASTERY_1, AVENGING_WRATH_1, BLESSING_OF_MIGHT_1, BLESSING_OF_WISDOM_1,\n+BLESSING_OF_KINGS_1, BLESSING_OF_SANCTUARY_1, CLEANSE_1, DIVINE_FAVOR_1, DIVINE_ILLUMINATION_1, DIVINE_INTERVENTION_1,\n+DIVINE_PLEA_1, DIVINE_PROTECTION_1, DIVINE_SACRIFICE_1, DIVINE_SHIELD_1, HAND_OF_FREEDOM_1, HAND_OF_PROTECTION_1,\n+HAND_OF_RECKONING_1, HAND_OF_SACRIFICE_1, HAND_OF_SALVATION_1, HOLY_SHIELD_1, PURIFY_1, REDEMPTION_1,\n+RIGHTEOUS_DEFENSE_1, RIGHTEOUS_FURY_1, SACRED_SHIELD_1, SEAL_OF_RIGHTEOUSNESS_1, SEAL_OF_JUSTICE_1, SEAL_OF_LIGHT_1,\n+SEAL_OF_WISDOM_1, SEAL_OF_COMMAND_1, SEAL_OF_VENGEANCE_1, SEAL_OF_CORRUPTION_1 };\n+\n+class paladin_bot : public CreatureScript\n+{\n+public:\n+    paladin_bot() : CreatureScript(\"paladin_bot\") { }\n+\n+    CreatureAI* GetAI(Creature* creature) const override\n+    {\n+        return new paladin_botAI(creature);\n+    }\n+/*\n+    bool OnGossipHello(Player* player, Creature* creature)\n+    {\n+        return creature->GetBotAI()->OnGossipHello(player, 0);\n+    }\n+\n+    bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action)\n+    {\n+        if (bot_ai* ai = creature->GetBotAI())\n+            return ai->OnGossipSelect(player, creature, sender, action);\n+        return true;\n+    }\n+\n+    bool OnGossipSelectCode(Player* player, Creature* creature, uint32 sender, uint32 action, char const* code)\n+    {\n+        if (bot_ai* ai = creature->GetBotAI())\n+            return ai->OnGossipSelectCode(player, creature, sender, action, code);\n+        return true;\n+    }\n+*/\n+    struct paladin_botAI : public bot_ai\n+    {\n+        paladin_botAI(Creature* creature) : bot_ai(creature)\n+        {\n+            _botclass = BOT_CLASS_PALADIN;\n+\n+            _myaura = 0;\n+\n+            InitUnitFlags();\n+        }\n+\n+        bool doCast(Unit* victim, uint32 spellId)\n+        {\n+            if (CheckBotCast(victim, spellId) != SPELL_CAST_OK)\n+                return false;\n+            return bot_ai::doCast(victim, spellId);\n+        }\n+\n+        void CheckBeacon(uint32 diff)\n+        {\n+            if (checkBeaconTimer > diff || !IsSpellReady(BEACON_OF_LIGHT_1, diff) ||\n+                !HasRole(BOT_ROLE_HEAL|BOT_ROLE_RANGED) || IsCasting() || Rand() > 15)\n+                return;\n+\n+            checkBeaconTimer = urand(2000, 5000);\n+\n+            if (FindAffectedTarget(GetSpell(BEACON_OF_LIGHT_1), me->GetGUID(), 60, 3))\n+                return;\n+\n+            //find tank\n+            //stacks\n+            if (Group const* gr = !IAmFree() ? master->GetGroup() : GetGroup())\n+            {\n+                std::set<Unit*> tanks;\n+                for (Unit* member : BotMgr::GetAllGroupMembers(gr))\n+                {\n+                    if (me->GetMap() == member->FindMap() && member->IsAlive() && member->IsInCombat() && IsTank(member) &&\n+                        (!member->getAttackers().empty() || GetHealthPCT(member) < 90) &&\n+                        !member->GetAuraEffect(SPELL_AURA_PERIODIC_TRIGGER_SPELL, SPELLFAMILY_PALADIN, 0x0, 0x1000000, 0x0, me->GetGUID()))\n+                        tanks.insert(member);\n+                }\n+\n+                if (tanks.empty())\n+                    return;\n+\n+                Unit* target = tanks.size() == 1 ? *tanks.begin() : Bcore::Containers::SelectRandomContainerElement(tanks);\n+                if (doCast(target, GetSpell(BEACON_OF_LIGHT_1)))\n+                    return;\n+            }\n+        }\n+\n+        void CheckSacrifice(uint32 diff)\n+        {\n+            if (!IsSpellReady(DIVINE_SACRIFICE_1, diff) || IAmFree() || me->IsMounted() ||\n+                IsTank() || Feasting() || !CanBlock() || IsCasting() || Rand() > 25 || GetHealthPCT(me) < 60)\n+                return;\n+\n+            Group const* gr = master->GetGroup();\n+            if (!gr)\n+            {\n+                if (master->IsAlive() && GetHealthPCT(master) < 75 && me->GetDistance(master) < 30 && !master->getAttackers().empty() &&\n+                    !master->GetAuraEffect(SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, SPELLFAMILY_PALADIN, 3837, EFFECT_0))\n+                {\n+                    if (doCast(me, GetSpell(DIVINE_SACRIFICE_1)))\n+                        return;\n+                }\n+            }\n+            else\n+            {\n+                uint8 attacked = 0;\n+                for (Unit const* member : BotMgr::GetAllGroupMembers(gr))\n+                {\n+                    if (me->GetMap() == member->FindMap() && member->IsAlive() &&\n+                        !(member->IsNPCBot() && member->ToCreature()->IsTempBot()) &&\n+                        me->GetDistance(member) < 30 && !member->getAttackers().empty() &&\n+                        !member->GetAuraEffect(SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, SPELLFAMILY_PALADIN, 3837, EFFECT_0))\n+                    {\n+                        if (++attacked > 3)\n+                            break;\n+                    }\n+                }\n+                if (attacked > 3 && doCast(me, GetSpell(DIVINE_SACRIFICE_1)))\n+                    return;\n+            }\n+\n+            SetSpellCooldown(DIVINE_SACRIFICE_1, 1000); //fail\n+        }\n+\n+        void CheckHandOfSacrifice(uint32 diff)\n+        {\n+            if (!IsSpellReady(HAND_OF_SACRIFICE_1, diff) || IAmFree() || me->IsMounted() ||\n+                IsTank() || Feasting() || !CanBlock() || IsCasting() || Rand() > 25 || GetHealthPCT(me) < 50)\n+                return;\n+\n+            Group const* gr = master->GetGroup();\n+            if (!gr)\n+            {\n+                if (master->IsAlive() && me->GetDistance(master) < 30 && !master->getAttackers().empty() &&\n+                    (master->getAttackers().size() > 2 || GetHealthPCT(master) < 50) &&\n+                    !master->GetAuraEffect(SPELL_AURA_SPLIT_DAMAGE_PCT, SPELLFAMILY_PALADIN, 0x2000, 0x0, 0x0))\n+                {\n+                    if (doCast(master, GetSpell(HAND_OF_SACRIFICE_1)))\n+                        return;\n+                }\n+            }\n+            else\n+            {\n+                Unit* u = nullptr;\n+                for (Unit* member : BotMgr::GetAllGroupMembers(gr))\n+                {\n+                    if (me->GetMap() == member->FindMap() && member->IsAlive() && me->GetDistance(member) < 30 &&\n+                        !(member->IsNPCBot() && member->ToCreature()->IsTempBot()) &&\n+                        (member->getAttackers().size() > 2 || GetHealthPCT(member) < 50) &&\n+                        !member->GetAuraEffect(SPELL_AURA_SPLIT_DAMAGE_PCT, SPELLFAMILY_PALADIN, 0x2000, 0x0, 0x0))\n+                    {\n+                        u = member;\n+                        break;\n+                    }\n+                }\n+\n+                if (u && doCast(u, GetSpell(HAND_OF_SACRIFICE_1)))\n+                    return;\n+            }\n+\n+            SetSpellCooldown(HAND_OF_SACRIFICE_1, 2000); //fail\n+        }\n+\n+        void ShieldGroup(uint32 diff)\n+        {\n+            if (checkShieldTimer > diff || !IsSpellReady(SACRED_SHIELD_1, diff) || me->IsMounted() || Feasting() || IsCasting() || Rand() > 50)\n+                return;\n+\n+            checkShieldTimer = 3000;\n+\n+            if (IsTank())\n+            {\n+                if (Rand() > 25)\n+                    return;\n+            }\n+            else if (!HasRole(BOT_ROLE_HEAL) && Rand() > 35)\n+                return;\n+\n+            if (IAmFree() && (me->IsInCombat() || !me->getAttackers().empty()) && me->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_PALADIN, 0x0, 0x80000, 0x0, me->GetGUID()))\n+                return;\n+\n+            if (Unit const* shielded = FindAffectedTarget(GetSpell(SACRED_SHIELD_1), me->GetGUID(), 80, 3))\n+                if (shielded->IsInCombat() && !shielded->getAttackers().empty())\n+                    return;\n+\n+            Group const* gr = !IAmFree() ? master->GetGroup() : GetGroup();\n+            Unit* target = nullptr;\n+            if (!gr)\n+            {\n+                Unit* u = master;\n+                if (u->IsAlive() && u->IsInCombat() && (IAmFree() || IsTank(u)) && me->GetDistance(u) < 40 &&\n+                    !u->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_PALADIN, 0x0, 0x80000, 0x0))\n+                    target = u;\n+\n+                if (!target && IsWanderer())\n+                {\n+                    std::list<Unit*> targets;\n+                    GetNearbyFriendlyTargetsList(targets, 40.0f);\n+                    std::erase_if(targets, [](Unit const* unit) {\n+                        return (!unit->IsInCombat() && unit->getAttackers().empty()) || unit->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_PALADIN, 0x0, 0x80000, 0x0);\n+                    });\n+                    if (!targets.empty())\n+                        target = targets.size() == 1 ? targets.front() : Bcore::Containers::SelectRandomContainerElement(targets);\n+                }\n+\n+                if (!target && !IAmFree())\n+                {\n+                    if (IsTank() && me->IsInCombat() && !me->getAttackers().empty() && !me->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_PALADIN, 0x0, 0x80000, 0x0))\n+                        target = me;\n+                    else\n+                    {\n+                        for (auto const& [_, bot] : *master->GetBotMgr()->GetBotMap())\n+                        {\n+                            u = bot;\n+                            if (!u || !u->IsInWorld() || me->GetMap() != u->FindMap() || !u->IsAlive() || !u->IsInCombat() ||\n+                                u->getAttackers().empty() || u->ToCreature()->IsTempBot() || me->GetDistance(u) > 40 ||\n+                                u->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_PALADIN, 0x0, 0x80000, 0x0))\n+                                continue;\n+\n+                            target = u;\n+                            break;\n+                        }\n+                    }\n+                }\n+            }\n+            else\n+            {\n+                std::vector<Unit*> members = BotMgr::GetAllGroupMembers(gr);\n+                std::array<decltype(members), 3> member_sets{}; //tanks, players, npcbots\n+                for (auto i : NPCBots::index_array<size_t, std::size(member_sets)>)\n+                    member_sets[i].reserve(((members.size() >> 2) + 1) * (i + 1));\n+\n+                for (Unit* member : members)\n+                {\n+                    if (!member->IsInWorld() || me->GetMap() != member->FindMap() || !member->IsAlive() || !member->IsInCombat() ||\n+                        member->getAttackers().empty() || (member->IsNPCBot() && member->ToCreature()->IsTempBot()) || me->GetDistance(member) > 40 ||\n+                        member->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_PALADIN, 0x0, 0x80000, 0x0))\n+                        continue;\n+\n+                    if (IsTank(member))\n+                        member_sets[0].push_back(member);\n+                    else if (member->IsPlayer())\n+                        member_sets[1].push_back(member);\n+                    else\n+                        member_sets[2].push_back(member);\n+                }\n+\n+                for (auto const& container : member_sets)\n+                {\n+                    if (!container.empty())\n+                    {\n+                        target = container.size() == 1 ? container.front() : Bcore::Containers::SelectRandomContainerElement(container);\n+                        break;\n+                    }\n+                }\n+\n+                if (!target)\n+                {\n+                    uint8 hp_pct_min = 101;\n+                    for (auto const& container : member_sets)\n+                    {\n+                        for (Unit* member : container)\n+                        {\n+                            if (uint8 hp_pct = GetHealthPCT(member); hp_pct < hp_pct_min)\n+                            {\n+                                hp_pct_min = hp_pct;\n+                                target = member;\n+                            }\n+                        }\n+                        if (target)\n+                            break;\n+                    }\n+                }\n+\n+                if (!target)\n+                {\n+                    uint32 attackers_count_max = 0;\n+                    for (auto const& container : member_sets)\n+                    {\n+                        for (Unit* member : container)\n+                        {\n+                            if (uint32 attackers_count = member->getAttackers().size(); attackers_count > attackers_count_max)\n+                            {\n+                                attackers_count_max = attackers_count;\n+                                target = member;\n+                            }\n+                        }\n+                        if (target)\n+                            break;\n+                    }\n+                }\n+\n+                if (!target && master->IsInCombat() && !master->getAttackers().empty() && me->GetDistance(master) < 40 &&\n+                    !master->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_PALADIN, 0x0, 0x80000, 0x0))\n+                    target = master;\n+            }\n+\n+            if (target && doCast(target, GetSpell(SACRED_SHIELD_1)))\n+                return;\n+        }\n+\n+        void HOPGroup(uint32 diff)\n+        {\n+            if (!IsSpellReady(HAND_OF_PROTECTION_1, diff) || me->IsMounted() || Feasting() || IsCasting() || Rand() > 30)\n+                return;\n+\n+            Group const* gr = !IAmFree() ? master->GetGroup() : GetGroup();\n+            if (!gr)\n+            {\n+                if (me->GetMap() == master->FindMap())\n+                {\n+                    if (HOPTarget(master))\n+                    {}\n+                    if (!IAmFree() && HOPTarget(me))\n+                    {}\n+                }\n+            }\n+            else\n+            {\n+                std::vector<Unit*> members = BotMgr::GetAllGroupMembers(gr);\n+                for (auto i : NPCBots::index_array<uint8, 2>)\n+                {\n+                    for (Unit* member : members)\n+                    {\n+                        if (!(i == 0 ? member->IsPlayer() : member->IsNPCBot()) || me->GetMap() != member->FindMap() ||\n+                            !member->IsAlive() || !member->IsInCombat() || me->GetDistance(member) > 30 || IsTank(member) ||\n+                            (member->IsNPCBot() && member->ToCreature()->IsTempBot()) ||\n+                            member->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_PALADIN, 0x0, 0x80000, 0x0))\n+                            continue;\n+                        if (HOPTarget(member))\n+                            return;\n+                    }\n+                }\n+            }\n+        }\n+\n+        bool HOPTarget(Unit* target)\n+        {\n+            if ((target->IsPlayer() ? target->GetClass() : target->ToCreature()->GetBotClass()) == BOT_CLASS_PALADIN)\n+                return false; //paladins should use their own damn bubble\n+            if (target->HasAuraTypeWithMiscvalue(SPELL_AURA_SCHOOL_IMMUNITY, 1) || target->HasAuraTypeWithMiscvalue(SPELL_AURA_SCHOOL_IMMUNITY, 127))\n+                return false; //immune to physical (hop or smth is present)\n+            if (target->HasAuraTypeWithMiscvalue(SPELL_AURA_MECHANIC_IMMUNITY, 25))\n+                return false; //forbearance\n+            if (target->getAttackers().empty())\n+                return false; //HOP only saves from physical, these aoe are rare and on bosses they are ultimate anyway\n+\n+            if (GetHealthPCT(target) < 15 + 5*(uint32)target->getAttackers().size())\n+            {\n+                me->InterruptNonMeleeSpells(false);\n+                if (doCast(target, GetSpell(HAND_OF_PROTECTION_1)))\n+                {\n+                    if (target->IsPlayer())\n+                        ReportSpellCast(HAND_OF_PROTECTION_1, LocalizedNpcText(target->ToPlayer(), BOT_TEXT__ON_YOU), target->ToPlayer());\n+\n+                    if (!IAmFree() && target->GetGUID() != master->GetGUID())\n+                        ReportSpellCast(HAND_OF_PROTECTION_1, LocalizedNpcText(master, BOT_TEXT__ON_) + target->GetName() + '!', master);\n+                }\n+                return true;\n+            }\n+\n+            return false;\n+        }\n+\n+        void HOFGroup(uint32 diff)\n+        {\n+            if (!IsSpellReady(HAND_OF_FREEDOM_1, diff) || me->IsMounted() || Feasting() || IsCasting() || Rand() > 20)\n+                return;\n+\n+            Group const* gr = !IAmFree() ? master->GetGroup() : GetGroup();\n+            if (!gr)\n+            {\n+                if (me->GetMap() == master->FindMap())\n+                {\n+                    if (HOFTarget(master))\n+                    {}\n+                    if (!IAmFree() && HOFTarget(me))\n+                    {}\n+                }\n+            }\n+            else\n+            {\n+                std::vector<Unit*> members = BotMgr::GetAllGroupMembers(gr);\n+                for (auto i : NPCBots::index_array<uint8, 2>)\n+                {\n+                    for (Unit* member : members)\n+                    {\n+                        if (!(i == 0 ? member->IsPlayer() : member->IsNPCBot()) || me->GetMap() != member->FindMap() ||\n+                            !member->IsAlive() || me->GetDistance(member) > 30 || (member->IsNPCBot() && member->ToCreature()->IsTempBot()))\n+                            continue;\n+                        if (HOFTarget(member))\n+                            return;\n+                    }\n+                }\n+            }\n+        }\n+\n+        bool HOFTarget(Unit* target)\n+        {\n+            const bool canUnstun = me->GetLevel() >= 35 && GetSpec() == BOT_SPEC_PALADIN_RETRIBUTION;\n+            if (target->HasAuraType(SPELL_AURA_MECHANIC_IMMUNITY))\n+            {\n+                if (target->HasAuraTypeWithMiscvalue(SPELL_AURA_MECHANIC_IMMUNITY, 11) &&\n+                    target->HasAuraTypeWithMiscvalue(SPELL_AURA_MECHANIC_IMMUNITY, 7))\n+                    return false; //immune to root and snares\n+                if (canUnstun && target->HasAuraTypeWithMiscvalue(SPELL_AURA_MECHANIC_IMMUNITY, 12))\n+                    return false; //immune to stuns\n+            }\n+\n+            for (auto const& [_, app] : target->GetAppliedAuras())\n+            {\n+                if (!app || app->IsPositive() || app->GetBase()->IsPassive() || app->GetBase()->GetDuration() < 2000)\n+                    continue;\n+                SpellInfo const* spellInfo = app->GetBase()->GetSpellInfo();\n+                if (spellInfo->Attributes & SPELL_ATTR0_HIDDEN_CLIENTSIDE) continue;\n+                //if (spellInfo->AttributesEx & SPELL_ATTR1_DONT_DISPLAY_IN_AURA_BAR) continue;\n+                if (spellInfo->GetSpellMechanicMaskByEffectMask(app->GetEffectMask()) &\n+                    ((1u<<MECHANIC_SNARE) | (1u<<MECHANIC_ROOT) | (!canUnstun ? 0 : (1u<<MECHANIC_STUN))))\n+                {\n+                    uint32 dispel = spellInfo->Dispel;\n+                    uint32 spell;\n+                    //Hand of Freedom is level 12, Purify is 8, Cleanse is 42\n+                    if (!GetSpell(CLEANSE))\n+                        spell = (dispel == DISPEL_DISEASE || dispel == DISPEL_POISON) ?\n+                        GetSpell(PURIFY_1) : GetSpell(HAND_OF_FREEDOM_1);\n+                    else\n+                        spell = (dispel == DISPEL_MAGIC || dispel == DISPEL_DISEASE || dispel == DISPEL_POISON) ?\n+                        GetSpell(CLEANSE_1) : GetSpell(HAND_OF_FREEDOM_1);\n+\n+                    if (doCast(target, spell))\n+                        return true;\n+                }\n+            }\n+            return false;\n+        }\n+\n+        void HOSGroup(uint32 diff)\n+        {\n+            if (!IsSpellReady(HAND_OF_SALVATION_1, diff) || IsCasting() || Rand() > 40)\n+                return;\n+\n+            //Glyph of Salvation\n+            if (me->GetLevel() >= 26 && me->GetVictim() && (!me->GetVictim()->CanHaveThreatList() || me->GetVictim()->IsControlledByPlayer()))\n+            {\n+                if (!me->getAttackers().empty() && GetHealthPCT(me) < std::max<int32>(80 - 5 * me->getAttackers().size(), 25))\n+                    if (doCast(me, GetSpell(HAND_OF_SALVATION_1)))\n+                        return;\n+            }\n+\n+            if (IAmFree())\n+                return;\n+\n+            Group const* gr = master->GetGroup();\n+            if (!gr)\n+                 return;\n+\n+            std::vector<Unit*> members = BotMgr::GetAllGroupMembers(gr);\n+            for (auto i : NPCBots::index_array<uint8, 2>)\n+            {\n+                for (Unit* member : members)\n+                {\n+                    if (!(i == 0 ? member->IsPlayer() : member->IsNPCBot()) || me->GetMap() != member->FindMap() ||\n+                        !member->IsInCombat() || IsTank(member) || me->GetDistance(member) > 30 ||\n+                        (IsTankingClass(i == 0 ? member->GetClass() : member->ToCreature()->GetBotClass()) && !me->GetMap()->IsRaid()) ||\n+                        (member->IsNPCBot() && member->ToCreature()->IsTempBot()) ||\n+                        member->HasAuraTypeWithFamilyFlags(SPELL_AURA_PERIODIC_TRIGGER_SPELL_WITH_VALUE, SPELLFAMILY_PALADIN, 0x100))\n+                        continue;\n+                    if (HOSTarget(member))\n+                        return;\n+                }\n+            }\n+        }\n+\n+        bool HOSTarget(Unit* target)\n+        {\n+            for (Unit* attacker : target->getAttackers())\n+            {\n+                if (attacker->CanHaveThreatList() && attacker->GetThreatManager().GetThreatListSize() >= 3 &&\n+                    attacker->GetThreatManager().GetThreat(target) > target->GetMaxHealth() / 4.f && target->GetDistance(attacker) < 15)\n+                {\n+                    if (doCast(target, GetSpell(HAND_OF_SALVATION_1)))\n+                        return true;\n+                    break; //do not try more than once on the same target\n+                }\n+            }\n+            return false;\n+        }\n+\n+        bool HealTarget(Unit* target, uint32 diff) override\n+        {\n+            if (!target || !target->IsAlive() || target->GetShapeshiftForm() == FORM_SPIRITOFREDEMPTION || me->GetDistance(target) > 40)\n+                return false;\n+            uint8 hp = GetHealthPCT(target);\n+            if (hp > GetHealHpPctThreshold())\n+                return false;\n+            bool pointed = IsPointedHealTarget(target);\n+            if (hp > 90 && !(pointed && me->GetMap()->IsRaid()) &&\n+                (!target->IsInCombat() || target->getAttackers().empty() || !IsTank(target) || !me->GetMap()->IsRaid()))\n+                return false;\n+            //try to preserve heal if Divine Plea is active\n+            if (hp > 50 && me->GetAuraEffect(SPELL_AURA_OBS_MOD_POWER, SPELLFAMILY_PALADIN, 0x0, 0x0, 0x1))\n+                return false;\n+\n+            int32 hps = GetHPS(target);\n+            int32 xphp = target->GetHealth() + hps * 2.5f;\n+            int32 hppctps = int32(hps * 100.f / float(target->GetMaxHealth()));\n+            int32 xphploss = xphp > int32(target->GetMaxHealth()) ? 0 : abs(int32(xphp - target->GetMaxHealth()));\n+            int32 xppct = hp + hppctps * 2.5f;\n+            if (xppct >= 95 && hp >= 25 && !pointed)\n+                return false;\n+\n+            //Lay on Hands\n+            if (IsSpellReady(LAY_ON_HANDS_1, diff, false) && (target != me || shieldDelayTimer <= diff) &&\n+                (target->IsInCombat() || !target->getAttackers().empty()) && Rand() < 80 && hp <= 20 && xppct <=0 &&\n+                !target->HasAuraTypeWithMiscvalue(SPELL_AURA_SCHOOL_IMMUNITY, 127))\n+            {\n+                me->InterruptNonMeleeSpells(false);\n+                if (doCast(target, GetSpell(LAY_ON_HANDS_1)))\n+                {\n+                    if (target->IsPlayer())\n+                        ReportSpellCast(LAY_ON_HANDS_1, LocalizedNpcText(target->ToPlayer(), BOT_TEXT__ON_YOU), target->ToPlayer());\n+\n+                    if (!IAmFree() && target != master)\n+                    {\n+                        std::string msg = target == me ? LocalizedNpcText(master, BOT_TEXT__ON_MYSELF) : (LocalizedNpcText(master, BOT_TEXT__ON_) + target->GetName() + '!');\n+                        ReportSpellCast(LAY_ON_HANDS_1, msg, master);\n+                    }\n+                    return true;\n+                }\n+            }\n+\n+            //Holy Shock\n+            if (IsSpellReady(HOLY_SHOCK_1, diff, false) && !target->IsCharmed() && !target->isPossessed() &&\n+                xphploss > _heals[HOLY_SHOCK_1])\n+            {\n+                me->InterruptNonMeleeSpells(false);\n+                if (hp < 30 && IsSpellReady(DIVINE_FAVOR_1, diff, false) && !target->getAttackers().empty())\n+                    if (doCast(me, GetSpell(DIVINE_FAVOR_1)))\n+                    {}\n+                if (doCast(target, GetSpell(HOLY_SHOCK_1)))\n+                    return true;\n+            }\n+\n+            if (IsCasting()) return false;\n+\n+            Unit const* u = target->GetVictim();\n+            bool tanking = u && IsTank(target) && u->ToCreature() && u->ToCreature()->isWorldBoss();\n+\n+            if (IsSpellReady(DIVINE_ILLUMINATION_1, diff, false) && GetManaPCT(me) <= 50 && Rand() < 50 + 50*tanking)\n+                if (doCast(me, GetSpell(DIVINE_ILLUMINATION_1)))\n+                {}\n+\n+            //Holy Light\n+            if (IsSpellReady(HOLY_LIGHT_1, diff) && (xppct > 15 || !GetSpell(FLASH_OF_LIGHT_1)) &&\n+                xphploss > _heals[HOLY_LIGHT_1])\n+            {\n+                //Aura Mastery\n+                if (hp < 60 && _myaura == CONCENTRATION_AURA_1 && IsSpellReady(AURA_MASTERY_1, diff, false) && Rand() < 90 &&\n+                    ((!me->getAttackers().empty() && (*me->getAttackers().begin())->IsPlayer()) ||\n+                    me->GetMap()->Instanceable() || tanking))\n+                    if (doCast(me, GetSpell(AURA_MASTERY_1)))\n+                    {}\n+                if (doCast(target, GetSpell(HOLY_LIGHT_1)))\n+                    return true;\n+            }\n+            //Flash of Light\n+            if (IsSpellReady(FLASH_OF_LIGHT_1, diff) && (tanking || xphploss > _heals[FLASH_OF_LIGHT_1]))\n+            {\n+                if (doCast(target, GetSpell(FLASH_OF_LIGHT_1)))\n+                    return true;\n+            }\n+\n+            return false;\n+        }\n+\n+        void StartAttack(Unit* u, bool force = false)\n+        {\n+            if (!bot_ai::StartAttack(u, force))\n+                return;\n+            GetInPosition(force, u);\n+        }\n+\n+        void JustEnteredCombat(Unit* u) override { bot_ai::JustEnteredCombat(u); }\n+        void KilledUnit(Unit* u) override { bot_ai::KilledUnit(u); }\n+        void EnterEvadeMode(EvadeReason why = EVADE_REASON_OTHER) override { bot_ai::EnterEvadeMode(why); }\n+        void MoveInLineOfSight(Unit* u) override { bot_ai::MoveInLineOfSight(u); }\n+        void JustDied(Unit* u) override { bot_ai::JustDied(u); }\n+\n+        void BreakCC(uint32 diff) override\n+        {\n+            if (me->GetLevel() >= 35 && GetSpec() == BOT_SPEC_PALADIN_RETRIBUTION && IsSpellReady(HAND_OF_FREEDOM_1, diff) && Rand() < 30 && me->HasAuraWithMechanic(1u<<MECHANIC_STUN))\n+            {\n+                if (me->IsMounted())\n+                    me->RemoveAurasByType(SPELL_AURA_MOUNTED);\n+                if (doCast(me, GetSpell(HAND_OF_FREEDOM_1)))\n+                    return;\n+            }\n+            bot_ai::BreakCC(diff);\n+        }\n+\n+        void UpdateAI(uint32 diff) override\n+        {\n+            if (!GlobalUpdate(diff))\n+                return;\n+\n+            DoVehicleActions(diff);\n+            if (!CanBotAttackOnVehicle())\n+                return;\n+\n+            if (IsPotionReady())\n+            {\n+                if (GetManaPCT(me) < 30)\n+                    DrinkPotion(true);\n+                else if (GetHealthPCT(me) < 60)\n+                    DrinkPotion(false);\n+            }\n+            else if (GetManaPCT(me) < 40 && IsSpellReady(DIVINE_PLEA_1, diff) && Rand() < 30 &&\n+                !me->GetAuraEffect(SPELL_AURA_OBS_MOD_POWER, SPELLFAMILY_PALADIN, 0x0, 0x80004000, 0x1))\n+            {\n+                if (doCast(me, GetSpell(DIVINE_PLEA_1)))\n+                    return;\n+            }\n+\n+            CheckRacials(diff);\n+\n+            HOPGroup(diff);\n+            CheckBeacon(diff);\n+\n+            if (me->GetMap()->IsRaid())\n+            {\n+                CureGroup(GetSpell(CLEANSE), diff);\n+                BuffAndHealGroup(diff);\n+                CheckHandOfSacrifice(diff);\n+                ShieldGroup(diff);\n+            }\n+            else\n+            {\n+                BuffAndHealGroup(diff);\n+                CheckHandOfSacrifice(diff);\n+                ShieldGroup(diff);\n+                CureGroup(GetSpell(CLEANSE), diff);\n+            }\n+\n+            CheckSacrifice(diff);\n+            HOFGroup(diff);\n+            HOSGroup(diff);\n+\n+            if (!me->IsInCombat())\n+                DoNonCombatActions(diff);\n+\n+            CheckSeal(diff);\n+            CheckAura(diff);\n+\n+            if (ProcessImmediateNonAttackTarget())\n+                return;\n+\n+            if (!CheckAttackTarget())\n+                return;\n+\n+            Repentance(diff);\n+            Counter(diff);\n+            TurnEvil(diff);\n+\n+            CheckDivineIntervention(diff);\n+            if (!me->IsAlive())\n+                return;\n+\n+            if (IsCasting())\n+                return;\n+\n+            CheckUsableItems(diff);\n+\n+            DoNormalAttack(diff);\n+        }\n+\n+        void DoNonCombatActions(uint32 diff)\n+        {\n+            if (GC_Timer > diff || me->IsMounted() || IsCasting())\n+                return;\n+\n+            ResurrectGroup(GetSpell(REDEMPTION_1));\n+        }\n+\n+        void CheckSeal(uint32 diff)\n+        {\n+            if (checkSealTimer > diff || GC_Timer > diff || me->IsMounted() ||\n+                IsCasting() || Feasting() || Rand() > 30)\n+                return;\n+\n+            checkSealTimer = 10000;\n+\n+            Unit const* victim = me->GetVictim();\n+\n+            uint32 COMMAND = GetSpell(SEAL_OF_COMMAND_1);\n+            uint32 LIGHT = GetSpell(SEAL_OF_LIGHT_1);\n+            uint32 RIGHT = GetSpell(SEAL_OF_RIGHTEOUSNESS_1);\n+            uint32 WISDOM = GetSpell(SEAL_OF_WISDOM_1);\n+            uint32 JUSTICE = GetSpell(SEAL_OF_JUSTICE_1);\n+            uint32 VENGEANCE = (me->GetRaceMask() & RACEMASK_ALLIANCE) ? GetSpell(SEAL_OF_VENGEANCE_1) : GetSpell(SEAL_OF_CORRUPTION_1);\n+\n+            if (VENGEANCE && victim &&\n+                (victim->GetMaxHealth() > me->GetMaxHealth() * (2 + victim->getAttackers().size() / 2) ||\n+                victim->GetClass() == CLASS_ROGUE))\n+                COMMAND = VENGEANCE;\n+\n+            uint32 SEAL = 0;\n+\n+            if (IsMelee() && GetManaPCT(me) < 20 && WISDOM)\n+                SEAL = WISDOM;\n+            else if (IsTank())\n+            {\n+                if (JUSTICE && me->getAttackers().size() > 1)\n+                    JUSTICE = 0;\n+                if (JUSTICE && victim)\n+                {\n+                    Creature const* cre = victim->ToCreature();\n+                    if (cre && cre->GetCreatureTemplate()->rank != CREATURE_ELITE_NORMAL &&\n+                        (cre->GetCreatureTemplate()->MechanicImmuneMask & (1u<<(MECHANIC_STUN-1))))\n+                        JUSTICE = 0;\n+                }\n+                SEAL = COMMAND ? COMMAND : JUSTICE ? JUSTICE : RIGHT;\n+            }\n+            else if (HasRole(BOT_ROLE_DPS))\n+            {\n+                SEAL = WISDOM && HasRole(BOT_ROLE_HEAL) ? WISDOM : COMMAND ? COMMAND : RIGHT;\n+            }\n+            else if (HasRole(BOT_ROLE_HEAL))\n+                SEAL = WISDOM ? WISDOM : LIGHT ? LIGHT : RIGHT;\n+\n+            if (SEAL && !me->HasAura(SEAL))\n+                if (doCast(me, SEAL))\n+                    return;\n+        }\n+\n+        void CheckAura(uint32 diff)\n+        {\n+            if (checkAuraTimer > diff || GC_Timer > diff || (IAmFree() && !GetBG()) || IsCasting() ||\n+                /*me->GetExactDist(master) > 40 || me->IsMounted() || Feasting() || */Rand() > 20)\n+                return;\n+\n+            checkAuraTimer = urand(3000, 6000);\n+\n+            //7 paladins in group?\n+            uint32 DEVOTION_AURA = GetSpell(DEVOTION_AURA_1);\n+            uint32 CONCENTRATION_AURA = GetSpell(CONCENTRATION_AURA_1);\n+            uint32 FIRE_RESISTANCE_AURA = GetSpell(FIRE_RESISTANCE_AURA_1);\n+            uint32 FROST_RESISTANCE_AURA = GetSpell(FROST_RESISTANCE_AURA_1);\n+            uint32 SHADOW_RESISTANCE_AURA = GetSpell(SHADOW_RESISTANCE_AURA_1);\n+            uint32 RETRIBUTION_AURA = GetSpell(RETRIBUTION_AURA_1);\n+            //uint32 CRUSADER_AURA = GetSpell(CRUSADER_AURA_1);\n+\n+            bool pureHealer = GetSpec() == BOT_SPEC_PALADIN_HOLY;\n+            bool isProt = GetSpec() == BOT_SPEC_PALADIN_PROTECTION;\n+\n+            std::map<uint32 /*baseid*/, uint32 /*curid*/> idMap;\n+            uint32 mask = _getAurasMask(idMap);\n+\n+            //for Aura Mastery allow every pure healer paladin to have their own C aura\n+            //SPECIFIC_AURA_MY_AURA check still works so no spam\n+            if (pureHealer)\n+                mask &= ~SPECIFIC_AURA_CONCENTRATION;\n+\n+            //if (CRUSADER_AURA && !(mask & SPECIFIC_AURA_CRUSADER) &&\n+            //    (master->IsMounted() || me->IsMounted()))\n+            //{\n+            //    if (doCast(me, CRUSADER_AURA))\n+            //        return;\n+            //}\n+\n+            //Has own aura or has all auras\n+            if (mask & SPECIFIC_AURA_MY_AURA)\n+                return;\n+            else if ((mask & SPECIFIC_AURA_ALL_AUTOUSE) == SPECIFIC_AURA_ALL_AUTOUSE)\n+                return;\n+\n+            //TODO: priority?\n+            if (_myaura && GetSpell(_myaura) && (!idMap.contains(_myaura) || idMap[_myaura] < GetSpell(_myaura)))\n+            {\n+                if (doCast(me, GetSpell(_myaura)))\n+                    return;\n+            }\n+            if (DEVOTION_AURA &&\n+                (!(mask & SPECIFIC_AURA_DEVOTION) || idMap[DEVOTION_AURA_1] < DEVOTION_AURA) &&\n+                (!RETRIBUTION_AURA || IsTank(master) || isProt))\n+            {\n+                if (doCast(me, DEVOTION_AURA))\n+                    return;\n+            }\n+            if (CONCENTRATION_AURA && !(mask & SPECIFIC_AURA_CONCENTRATION) &&\n+                (master->GetClass() == BOT_CLASS_MAGE || master->GetClass() == BOT_CLASS_PRIEST ||\n+                master->GetClass() == BOT_CLASS_WARLOCK || master->GetClass() == BOT_CLASS_DRUID ||\n+                (!IAmFree() && master->GetClass() == BOT_CLASS_PALADIN) || pureHealer))\n+            {\n+                if (doCast(me, CONCENTRATION_AURA))\n+                    return;\n+            }\n+            if (RETRIBUTION_AURA &&\n+                (!(mask & SPECIFIC_AURA_RETRIBUTION) || idMap[RETRIBUTION_AURA_1] < RETRIBUTION_AURA) &&\n+                (IsMeleeClass(master->GetClass()) || IsMelee()))\n+            {\n+                if (doCast(me, RETRIBUTION_AURA))\n+                    return;\n+            }\n+            if (FIRE_RESISTANCE_AURA &&\n+                (!(mask & SPECIFIC_AURA_FIRE_RES) || idMap[FIRE_RESISTANCE_AURA_1] < FIRE_RESISTANCE_AURA))\n+            {\n+                if (doCast(me, FIRE_RESISTANCE_AURA))\n+                    return;\n+            }\n+            if (SHADOW_RESISTANCE_AURA && GetBG() &&\n+                (!(mask & SPECIFIC_AURA_SHADOW_RES) || idMap[SHADOW_RESISTANCE_AURA_1] < SHADOW_RESISTANCE_AURA))\n+            {\n+                if (doCast(me, SHADOW_RESISTANCE_AURA))\n+                    return;\n+            }\n+            if (FROST_RESISTANCE_AURA &&\n+                (!(mask & SPECIFIC_AURA_FROST_RES) || idMap[FROST_RESISTANCE_AURA_1] < FROST_RESISTANCE_AURA))\n+            {\n+                if (doCast(me, FROST_RESISTANCE_AURA))\n+                    return;\n+            }\n+            if (SHADOW_RESISTANCE_AURA &&\n+                (!(mask & SPECIFIC_AURA_SHADOW_RES) || idMap[SHADOW_RESISTANCE_AURA_1] < SHADOW_RESISTANCE_AURA))\n+            {\n+                if (doCast(me, SHADOW_RESISTANCE_AURA))\n+                    return;\n+            }\n+        }\n+\n+        bool BuffTarget(Unit* target, uint32 /*diff*/) override\n+        {\n+            if (me->IsInCombat() && !master->GetMap()->IsRaid()) return false;\n+\n+            if (target == me)\n+            {\n+                if (uint32 rFury = GetSpell(RIGHTEOUS_FURY_1))\n+                {\n+                    if (IsTank())\n+                    {\n+                        if (!me->HasAura(rFury) && doCast(me, rFury))\n+                            return true;\n+                    }\n+                    else if (me->HasAura(rFury))\n+                        me->RemoveAurasDueToSpell(rFury);\n+                }\n+            }\n+\n+            uint32 mask = _getBlessingsMask(target);\n+\n+            //already has my blessing\n+            if (mask & SPECIFIC_BLESSING_MY_BLESSING)\n+                return false;\n+\n+            uint32 BLESSING_OF_WISDOM = GetSpell(BLESSING_OF_WISDOM_1);\n+            uint32 BLESSING_OF_KINGS = GetSpell(BLESSING_OF_KINGS_1);\n+            uint32 BLESSING_OF_SANCTUARY = GetSpell(BLESSING_OF_SANCTUARY_1);\n+            uint32 BLESSING_OF_MIGHT = GetSpell(BLESSING_OF_MIGHT_1);\n+\n+            bool wisdom = (mask & SPECIFIC_BLESSING_WISDOM);\n+            bool kings = (mask & SPECIFIC_BLESSING_KINGS);\n+            bool sanctuary = (mask & SPECIFIC_BLESSING_SANCTUARY);\n+            bool might = (mask & SPECIFIC_BLESSING_MIGHT);\n+\n+            if (IsTank(target))\n+            {\n+                if (BLESSING_OF_KINGS && !kings && doCast(target, BLESSING_OF_KINGS))\n+                    return true;\n+                else if (BLESSING_OF_SANCTUARY && !sanctuary && doCast(target, BLESSING_OF_SANCTUARY))\n+                    return true;\n+                else if (BLESSING_OF_WISDOM && !wisdom && target->GetMaxPower(POWER_MANA) > 1 && doCast(target, BLESSING_OF_WISDOM))\n+                    return true;\n+                else if (BLESSING_OF_MIGHT && !might && doCast(target, BLESSING_OF_MIGHT))\n+                    return true;\n+\n+                return false;\n+            }\n+\n+            uint8 Class = 0;\n+            if (target->IsPlayer())\n+                Class = target->GetClass();\n+            else if (Creature* cre = target->ToCreature())\n+                Class = cre->GetBotAI() ? cre->GetBotAI()->GetBotClass() : cre->GetClass();\n+\n+            switch (Class)\n+            {\n+                case BOT_CLASS_BM:\n+                case BOT_CLASS_SPHYNX:\n+                case BOT_CLASS_DREADLORD:\n+                case BOT_CLASS_SPELLBREAKER:\n+                case BOT_CLASS_DARK_RANGER:\n+                case BOT_CLASS_NECROMANCER:\n+                case BOT_CLASS_SEA_WITCH:\n+                case BOT_CLASS_CRYPT_LORD:\n+                    if (BLESSING_OF_KINGS && !kings && doCast(target, BLESSING_OF_KINGS))\n+                        return true;\n+                    else if (BLESSING_OF_MIGHT && !might && doCast(target, BLESSING_OF_MIGHT))\n+                        return true;\n+                    else if (BLESSING_OF_SANCTUARY && !sanctuary && doCast(target, BLESSING_OF_SANCTUARY))\n+                        return true;\n+                    break;\n+                case CLASS_PRIEST:\n+                case CLASS_MAGE:\n+                case CLASS_WARLOCK:\n+                    if (BLESSING_OF_KINGS && !kings && doCast(target, BLESSING_OF_KINGS))\n+                        return true;\n+                    else if (BLESSING_OF_WISDOM && !wisdom && doCast(target, BLESSING_OF_WISDOM))\n+                        return true;\n+                    else if (BLESSING_OF_SANCTUARY && !sanctuary && doCast(target, BLESSING_OF_SANCTUARY))\n+                        return true;\n+                    break;\n+                case CLASS_DEATH_KNIGHT:\n+                case CLASS_WARRIOR:\n+                case CLASS_PALADIN:\n+                case CLASS_ROGUE:\n+                case CLASS_HUNTER:\n+                case CLASS_SHAMAN:\n+                    if (BLESSING_OF_KINGS && !kings && doCast(target, BLESSING_OF_KINGS))\n+                        return true;\n+                    else if (BLESSING_OF_MIGHT && !might && doCast(target, BLESSING_OF_MIGHT))\n+                        return true;\n+                    else if (BLESSING_OF_SANCTUARY && !sanctuary && doCast(target, BLESSING_OF_SANCTUARY))\n+                        return true;\n+                    else if (BLESSING_OF_WISDOM && !wisdom && target->GetPowerType() == POWER_MANA && doCast(target, BLESSING_OF_WISDOM))\n+                        return true;\n+                    break;\n+                default:\n+                    if (BLESSING_OF_KINGS && !kings && doCast(target, BLESSING_OF_KINGS))\n+                        return true;\n+                    else if (BLESSING_OF_WISDOM && !wisdom && target->GetMaxPower(POWER_MANA) > 1 && doCast(target, BLESSING_OF_WISDOM))\n+                        return true;\n+                    else if (BLESSING_OF_SANCTUARY && !sanctuary && doCast(target, BLESSING_OF_SANCTUARY))\n+                        return true;\n+                    else if (BLESSING_OF_MIGHT && !might && doCast(target, BLESSING_OF_MIGHT))\n+                        return true;\n+                    break;\n+            }\n+            return false;\n+        }\n+\n+        void Repentance(uint32 diff, Unit* target = nullptr)\n+        {\n+            if (target)\n+            {\n+                if (IsSpellReady(REPENTANCE_1, diff) && doCast(target, GetSpell(REPENTANCE_1)))\n+                    return;\n+            }\n+            else if (IsSpellReady(REPENTANCE_1, diff))\n+            {\n+                Unit* u = FindStunTarget();\n+                if (u && u->GetVictim() != me && doCast(u, GetSpell(REPENTANCE_1)))\n+                    return;\n+            }\n+        }\n+\n+        void Counter(uint32 diff)\n+        {\n+            if (IsCasting())\n+                return;\n+            if (Rand() > 60)\n+                return;\n+\n+            Unit* target = IsSpellReady(REPENTANCE_1, diff) ? FindCastingTarget(20, 0, REPENTANCE_1) : nullptr;\n+            if (target)\n+                Repentance(diff, target); //first check repentance\n+            if (!target && IsSpellReady(TURN_EVIL_1, diff))\n+            {\n+                target = FindCastingTarget(20, 0, TURN_EVIL_1);\n+                if (target && doCast(target, GetSpell(TURN_EVIL_1)))\n+                    return;\n+            }\n+            if (!target && IsSpellReady(HOLY_WRATH_1, diff, false) && HasRole(BOT_ROLE_DPS))\n+            {\n+                target = FindCastingTarget(8, 0, TURN_EVIL_1); //here we check target as with turn evil cuz of same requirements\n+                if (target && doCast(me, GetSpell(HOLY_WRATH_1)))\n+                    return;\n+            }\n+            if (!target && IsSpellReady(HAMMER_OF_JUSTICE_1, diff, false))\n+            {\n+                target = FindCastingTarget(10, 0, HAMMER_OF_JUSTICE_1);\n+                if (target && doCast(target, GetSpell(HAMMER_OF_JUSTICE_1)))\n+                {}\n+            }\n+        }\n+\n+        void TurnEvil(uint32 diff)\n+        {\n+            if (!IsSpellReady(TURN_EVIL_1, diff) || IsCasting() || Rand() > 50 ||\n+                FindAffectedTarget(GetSpell(TURN_EVIL_1), me->GetGUID(), 50))\n+                return;\n+            Unit* target = FindUndeadCCTarget(20, TURN_EVIL_1);\n+            if (target &&\n+                (target != me->GetVictim() || GetHealthPCT(me) < 70 || target->GetVictim() == master) &&\n+                doCast(target, GetSpell(TURN_EVIL_1)))\n+                return;\n+            else\n+            {\n+                for (Unit* mtar : { opponent, disttarget })\n+                {\n+                    if (mtar && (mtar->GetCreatureTypeMask() & CREATURE_TYPEMASK_DEMON_OR_UNDEAD) && !CCed(mtar) &&\n+                        mtar->GetVictim() && !IsTank(mtar->GetVictim()) && mtar->GetVictim() != me &&\n+                        GetHealthPCT(me) < 90 &&\n+                        doCast(mtar, GetSpell(TURN_EVIL_1)))\n+                        return;\n+                }\n+            }\n+        }\n+\n+        void CheckDivineIntervention(uint32 diff)\n+        {\n+            if (!IsSpellReady(DIVINE_INTERVENTION_1, diff, !IsCasting()) || IAmFree() || IsTank() ||\n+                GetManaPCT(me) > 10 || Rand() > 20)\n+                return;\n+\n+            std::list<Unit*> players;\n+\n+            if (master->IsAlive() && !master->getAttackers().empty() && GetHealthPCT(master) < 15 &&\n+                !master->HasAuraTypeWithMiscvalue(SPELL_AURA_SCHOOL_IMMUNITY, 127))\n+                players.push_back(master);\n+            if (Group const* gr = master->GetGroup())\n+            {\n+                for (GroupReference const* itr = gr->GetFirstMember(); itr != nullptr; itr = itr->next())\n+                {\n+                    Player* pl = itr->GetSource();\n+                    if (!pl || pl == master || !pl->IsInWorld() || me->GetMap() != pl->FindMap() ||\n+                        !pl->IsAlive() || pl->getAttackers().empty() || GetHealthPCT(pl) > 15 ||\n+                        pl->HasAuraTypeWithMiscvalue(SPELL_AURA_SCHOOL_IMMUNITY, 127))\n+                        continue;\n+\n+                    players.push_back(pl);\n+                }\n+            }\n+\n+            if (players.empty())\n+                return;\n+\n+            Unit* target = players.size() == 1 ? players.front() : Bcore::Containers::SelectRandomContainerElement(players);\n+            if (doCast(target, GetSpell(DIVINE_INTERVENTION_1)))\n+                return;\n+        }\n+\n+        void DoNormalAttack(uint32 diff)\n+        {\n+            Unit* mytar = opponent ? opponent : disttarget ? disttarget : nullptr;\n+            if (!mytar)\n+                return;\n+\n+            StartAttack(mytar, IsMelee());\n+\n+            CheckAttackState();\n+            if (!me->IsAlive() || !mytar->IsAlive())\n+                return;\n+\n+            MoveBehind(mytar);\n+\n+            //Divine Shield\n+            if (IsSpellReady(DIVINE_SHIELD_1, diff) && shieldDelayTimer <= diff && (IAmFree() || !IsTank()) &&\n+                Rand() < 80 && !me->getAttackers().empty() && GetHealthPCT(me) < 25)\n+            {\n+                if (doCast(me, GetSpell(DIVINE_SHIELD_1)))\n+                    return;\n+            }\n+\n+            //Holy shield\n+            if (IsSpellReady(HOLY_SHIELD_1, diff) && HasRole(BOT_ROLE_DPS) && CanBlock() && !me->getAttackers().empty() && GetManaPCT(me) > 25 &&\n+                (GetManaPCT(me) > 80 || me->getAttackers().size() > 3 || ((*me->getAttackers().cbegin())->IsCreature() && (*me->getAttackers().cbegin())->ToCreature()->isWorldBoss())) &&\n+                !me->HasAuraTypeWithMiscvalue(SPELL_AURA_SCHOOL_IMMUNITY, 127))\n+            {\n+                if (doCast(me, GetSpell(HOLY_SHIELD_1)))\n+                    return;\n+            }\n+\n+            auto [can_do_holy, can_do_normal] = CanAffectVictimBools(mytar, SPELL_SCHOOL_HOLY, SPELL_SCHOOL_NORMAL);\n+\n+            float dist = me->GetDistance(mytar);\n+\n+            //HAMMER OF WRATH\n+            if (IsSpellReady(HAMMER_OF_WRATH_1, diff) && can_do_holy && HasRole(BOT_ROLE_DPS) && Rand() < 80 &&\n+                mytar->HasAuraState(AURA_STATE_HEALTHLESS_20_PERCENT) && dist < 30)\n+            {\n+                if (doCast(mytar, GetSpell(HAMMER_OF_WRATH_1)))\n+                    return;\n+            }\n+            //HAND OF RECKONING //No GCD\n+            Unit* u = mytar->GetVictim();\n+            if (IsSpellReady(HAND_OF_RECKONING_1, diff, false) && can_do_holy && u && u != me && Rand() < 50 && dist < 30 &&\n+                mytar->IsCreature() && !mytar->IsControlledByPlayer() &&\n+                !CCed(mytar) && HasRole(BOT_ROLE_DPS) && !mytar->HasAuraType(SPELL_AURA_MOD_TAUNT) &&\n+                (!IsTank(u) || (IsTank() && GetHealthPCT(me) > 67 &&\n+                (GetHealthPCT(u) < 30 || (IsOffTank() && !IsOffTank(u) && IsPointedOffTankingTarget(mytar)) ||\n+                (!IsOffTank() && IsOffTank(u) && IsPointedTankingTarget(mytar))))) &&\n+                ((!IsTankingClass(u->GetClass()) && GetHealthPCT(u) < 80) || IsTank()) &&\n+                IsInBotParty(u))\n+            {\n+                if (doCast(mytar, GetSpell(HAND_OF_RECKONING_1)))\n+                    return;\n+            }\n+            //HAND OF RECKONING 2 (distant)\n+            if (IsSpellReady(HAND_OF_RECKONING_1, diff, false) && !IAmFree() && u == me && Rand() < 30 && IsTank() && HasRole(BOT_ROLE_DPS) &&\n+                (IsOffTank() || master->GetBotMgr()->GetNpcBotsCountByRole(BOT_ROLE_TANK_OFF) == 0) &&\n+                !(me->GetLevel() >= 40 && mytar->IsCreature() &&\n+                (mytar->ToCreature()->IsDungeonBoss() || mytar->ToCreature()->isWorldBoss())))\n+            {\n+                Unit* tUnit = FindDistantTauntTarget();\n+                if (tUnit)\n+                {\n+                    if (doCast(tUnit, GetSpell(HAND_OF_RECKONING_1)))\n+                        return;\n+                }\n+            }\n+            //RIGHTEOUS DEFENSE //No GCD\n+            if (IsSpellReady(RIGHTEOUS_DEFENSE_1, diff, false) && !IAmFree() && u && u != me && IsTank() &&\n+                me->GetDistance(u) < 40 && mytar->IsCreature() && !mytar->IsControlledByPlayer() &&\n+                !IsTankingClass(u->GetClass()) && GetHealthPCT(u) < 80 &&\n+                !CCed(mytar) && !mytar->HasAuraType(SPELL_AURA_MOD_TAUNT) &&\n+                (!IsTank(u) || (GetHealthPCT(u) < 30 && GetHealthPCT(me) > 67)) &&\n+                IsInBotParty(u) && Rand() < 20 + 30 * u->getAttackers().size())\n+            {\n+                if (doCast(u, GetSpell(RIGHTEOUS_DEFENSE_1)))\n+                    return;\n+            }\n+            //RIGHTEOUS DEFENSE 2 (distant)\n+            if (IsSpellReady(RIGHTEOUS_DEFENSE_1, diff, false) && !IAmFree() && u == me && IsTank() && Rand() < 30 &&\n+                !(me->GetLevel() >= 40 && mytar->IsCreature() &&\n+                (mytar->ToCreature()->IsDungeonBoss() || mytar->ToCreature()->isWorldBoss())))\n+            {\n+                Unit* tUnit = FindDistantTauntTarget(40, true);\n+                if (tUnit)\n+                {\n+                    if (doCast(tUnit, GetSpell(RIGHTEOUS_DEFENSE_1)))\n+                        return;\n+                }\n+            }\n+            //Divine Plea\n+            if (IsSpellReady(DIVINE_PLEA_1, diff) && Rand() < 30 && GetManaPCT(me) < (IsTank() ? 90 : 7) &&\n+                !me->GetAuraEffect(SPELL_AURA_OBS_MOD_POWER, SPELLFAMILY_PALADIN, 0x0, 0x80004000, 0x1))\n+            {\n+                if (doCast(me, GetSpell(DIVINE_PLEA_1)))\n+                    return;\n+            }\n+            //Avenging Wrath (tank - big threat, dps - big hp, heal - divine plea counter)\n+            if (IsSpellReady(AVENGING_WRATH_1, diff, false) && can_do_holy && avDelayTimer <= diff &&\n+                HasRole(BOT_ROLE_HEAL|BOT_ROLE_DPS) && Rand() < 35 && dist < 30 &&\n+                IsTank() ? (mytar->IsCreature() && (mytar->ToCreature()->IsDungeonBoss() || mytar->ToCreature()->isWorldBoss())) :\n+                (!HasRole(BOT_ROLE_HEAL) || !HasRole(BOT_ROLE_RANGED)) ? (mytar->GetHealth() > me->GetMaxHealth()/4 * (1 + mytar->getAttackers().size())) :\n+                (me->GetAuraEffect(SPELL_AURA_OBS_MOD_POWER, SPELLFAMILY_PALADIN, 0x0, 0x80004000, 0x1) != nullptr))\n+            {\n+                if (doCast(me, GetSpell(AVENGING_WRATH_1)))\n+                {}\n+            }\n+            //Avenger's shield\n+            if (IsSpellReady(AVENGERS_SHIELD_1, diff) && can_do_holy && CanBlock() &&\n+                HasRole(BOT_ROLE_DPS) && dist < 30 && Rand() < 60)\n+            {\n+                if (doCast(mytar, GetSpell(AVENGERS_SHIELD_1)))\n+                    return;\n+            }\n+            //Divine Protection tanks only\n+            if (IsSpellReady(DIVINE_PROTECTION_1, diff, false) && shieldDelayTimer <= diff && IsTank() && Rand() < 80 &&\n+                !me->getAttackers().empty() && GetHealthPCT(me) < 67 - 20*me->HasAuraType(SPELL_AURA_PERIODIC_HEAL))\n+            {\n+                if (doCast(me, GetSpell(DIVINE_PROTECTION_1)))\n+                    return;\n+            }\n+            //Exorcism (have cast window or instant)\n+            if (IsSpellReady(EXORCISM_1, diff) && can_do_holy && HasRole(BOT_ROLE_DPS) && dist < 30 && Rand() < 70 &&\n+                ((IsTank() && dist > 12) || (HasRole(BOT_ROLE_RANGED) && !HasRole(BOT_ROLE_HEAL)) ||\n+                me->GetAuraEffect(SPELL_AURA_ADD_PCT_MODIFIER, SPELLFAMILY_PALADIN, 0x0, 0x0, 0x2)))\n+            {\n+                if (doCast(mytar, GetSpell(EXORCISM_1)))\n+                    return;\n+            }\n+            //Hammer of Justice\n+            if (IsSpellReady(HAMMER_OF_JUSTICE_1, diff) && !CCed(mytar) && dist < 10 && Rand() < 20 &&\n+                mytar->GetDiminishing(DIMINISHING_STUN) <= DIMINISHING_LEVEL_2 &&\n+                !IsImmunedToMySpellEffect(mytar, sSpellMgr->GetSpellInfo(HAMMER_OF_JUSTICE_1), EFFECT_0))\n+            {\n+                if (doCast(mytar, GetSpell(HAMMER_OF_JUSTICE_1)))\n+                    return;\n+            }\n+            //Judgement\n+            if (GetSpellCooldown(JUDGEMENT_OF_LIGHT_1) <= diff && can_do_holy && HasRole(BOT_ROLE_DPS) && Rand() < 120)\n+            {\n+                uint32 JUDGEMENT = 0;\n+\n+                if (GetSpell(JUDGEMENT_OF_JUSTICE_1) && mytar->HasAuraType(SPELL_AURA_MOD_INCREASE_SPEED) &&\n+                    dist < CalcSpellMaxRange(JUDGEMENT_OF_JUSTICE_1))\n+                {\n+                    //has joj from someone else\n+                    bool canCast = true;\n+                    for (AuraEffect const* aeff : mytar->GetAuraEffectsByType(SPELL_AURA_USE_NORMAL_MOVEMENT_SPEED))\n+                    {\n+                        if (aeff->GetCasterGUID() != me->GetGUID() && aeff->GetBase()->GetDuration() > 2000)\n+                        {\n+                            canCast = false;\n+                            break;\n+                        }\n+                    }\n+                    if (canCast)\n+                    {\n+                        //has sprint or something\n+                        for (AuraEffect const* aeff : mytar->GetAuraEffectsByType(SPELL_AURA_MOD_INCREASE_SPEED))\n+                        {\n+                            if (!aeff->GetBase()->IsPassive() && aeff->GetBase()->GetDuration() > 2000 && aeff->GetAmount() >= 30)\n+                            {\n+                                JUDGEMENT = JUDGEMENT_OF_JUSTICE_1;\n+                                break;\n+                            }\n+                        }\n+                    }\n+                }\n+                if (!JUDGEMENT && GetSpell(JUDGEMENT_OF_WISDOM_1) && dist < CalcSpellMaxRange(JUDGEMENT_OF_WISDOM_1))\n+                {\n+                    //from 35% to 50% mana\n+                    AuraEffect const* wisd = mytar->GetAuraEffect(JUDGEMENT_OF_WISDOM_AURA, 0);\n+                    //AuraEffect const* wisd = mytar->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_PALADIN, 3014, 0);\n+                    uint8 myManaPct = GetManaPCT(me);\n+                    if ((!wisd && myManaPct < 35) || (wisd && wisd->GetCasterGUID() == me->GetGUID() && myManaPct < 50))\n+                        JUDGEMENT = JUDGEMENT_OF_WISDOM_1;\n+                }\n+                if (!JUDGEMENT && GetSpell(JUDGEMENT_OF_LIGHT_1) && dist < CalcSpellMaxRange(JUDGEMENT_OF_LIGHT_1))\n+                {\n+                    JUDGEMENT = JUDGEMENT_OF_LIGHT_1;\n+                }\n+\n+                //Conditional spell unavailable, use any other\n+                if (!JUDGEMENT)\n+                {\n+                    if (GetSpell(JUDGEMENT_OF_WISDOM_1))\n+                        JUDGEMENT = JUDGEMENT_OF_WISDOM_1;\n+                    else if (GetSpell(JUDGEMENT_OF_LIGHT_1))\n+                        JUDGEMENT = JUDGEMENT_OF_LIGHT_1;\n+                    else if (GetSpell(JUDGEMENT_OF_JUSTICE_1))\n+                        JUDGEMENT = JUDGEMENT_OF_JUSTICE_1;\n+                }\n+\n+                if (JUDGEMENT && doCast(mytar, GetSpell(JUDGEMENT)))\n+                    return;\n+            }\n+            //Consecration\n+            if (IsSpellReady(CONSECRATION_1, diff) && can_do_holy && HasRole(BOT_ROLE_DPS) && dist < 5 && !mytar->isMoving() && Rand() < 20)\n+            {\n+                std::list<Unit*> targets;\n+                GetNearbyTargetsList(targets, 8.f, 0);\n+                if (targets.size() >= 2)\n+                {\n+                    if (doCast(me, GetSpell(CONSECRATION_1)))\n+                        return;\n+                }\n+            }\n+            //Hammer of the Righteous (1h only)\n+            if (IsSpellReady(HAMMER_OF_THE_RIGHTEOUS_1, diff) && can_do_holy && HasRole(BOT_ROLE_DPS) &&\n+                dist < 5 && Rand() < 80)\n+            {\n+                Item const* weapMH = GetEquips(BOT_SLOT_MAINHAND);\n+                if (weapMH &&\n+                    (weapMH->GetTemplate()->InventoryType == INVTYPE_WEAPON ||\n+                    weapMH->GetTemplate()->InventoryType == INVTYPE_WEAPONMAINHAND) &&\n+                    doCast(mytar, GetSpell(HAMMER_OF_THE_RIGHTEOUS_1)))\n+                    return;\n+            }\n+            //Shield of Righteousness\n+            if (IsSpellReady(SHIELD_OF_RIGHTEOUSNESS_1, diff) && can_do_holy && HasRole(BOT_ROLE_DPS) && CanBlock() &&\n+                (IsTank() || IAmFree()) && dist < 5 && Rand() < 90)\n+            {\n+                if (doCast(mytar, GetSpell(SHIELD_OF_RIGHTEOUSNESS_1)))\n+                    return;\n+            }\n+            //Crusader Strike\n+            if (IsSpellReady(CRUSADER_STRIKE_1, diff) && can_do_normal && HasRole(BOT_ROLE_DPS) && dist < 5 && Rand() < 90)\n+            {\n+                if (doCast(mytar, GetSpell(CRUSADER_STRIKE_1)))\n+                    return;\n+            }\n+            //Divine Storm\n+            if (IsSpellReady(DIVINE_STORM_1, diff) && can_do_normal && HasRole(BOT_ROLE_DPS) && dist < 7 && Rand() < 40)\n+            {\n+                if (doCast(me, GetSpell(DIVINE_STORM_1)))\n+                    return;\n+            }\n+            //Holy Wrath\n+            if (IsSpellReady(HOLY_WRATH_1, diff) && HasRole(BOT_ROLE_DPS) && Rand() < 50)\n+            {\n+                if ((mytar->GetCreatureType() == CREATURE_TYPE_UNDEAD || mytar->GetCreatureType() == CREATURE_TYPE_DEMON) &&\n+                    dist < 8.5f && doCast(me, GetSpell(HOLY_WRATH_1)))\n+                    return;\n+                else\n+                {\n+                    if (FindUndeadCCTarget(8.5f, HOLY_WRATH_1, false) &&\n+                        doCast(me, GetSpell(HOLY_WRATH_1)))\n+                        return;\n+                }\n+            }\n+        }\n+\n+        void ApplyClassSpellCritMultiplierAll(Unit const* /*victim*/, float& crit_chance, SpellInfo const* spellInfo, SpellSchoolMask schoolMask, WeaponAttackType /*attackType*/) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+\n+            //Sanctified Light: 6% additional critical chance for Holy Light and Holy Shock\n+            if ((GetSpec() == BOT_SPEC_PALADIN_HOLY) && lvl >= 30 && (baseId == HOLY_LIGHT_1 || baseId == HOLY_SHOCK_1))\n+                crit_chance += 6.f;\n+            //Holy Power: 5% additional critical chance for Holy spells\n+            if ((GetSpec() == BOT_SPEC_PALADIN_HOLY) && lvl >= 35 && (schoolMask & SPELL_SCHOOL_MASK_HOLY))\n+                crit_chance += 5.f;\n+            //Improved Flash of Light (id: 20251): 6% additional critical chance for Flash of Light\n+            if (lvl >= 70 && baseId == FLASH_OF_LIGHT_1)\n+                crit_chance += 6.f;\n+            //Glyph of Flash of Light: 5% additional critical chance for Flash of Light\n+            if (lvl >= 20 && baseId == FLASH_OF_LIGHT_1)\n+                crit_chance += 5.f;\n+            //Sanctified Wrath: 50% additional critical chance for Hammer of Wrath\n+            if ((GetSpec() == BOT_SPEC_PALADIN_RETRIBUTION) && lvl >= 45 && baseId == HAMMER_OF_WRATH_1)\n+                crit_chance += 50.f;\n+            //Fanaticism: 18% additional critical chance for all Judgements (not shure which check is right)\n+            if ((GetSpec() == BOT_SPEC_PALADIN_RETRIBUTION) && lvl >= 45 && spellInfo->GetCategory() == SPELLCATEGORY_JUDGEMENT)\n+                crit_chance += 18.f;\n+            //Infusion of Light\n+            if (baseId == HOLY_LIGHT_1)\n+            {\n+                if (AuraEffect const* infu = me->GetAuraEffect(INFUSION_OF_LIGHT_BUFF, 0))\n+                    if (infu->IsAffectingSpell(spellInfo))\n+                        crit_chance += 20.f;\n+            }\n+            if (baseId == HOLY_LIGHT_1 || baseId == FLASH_OF_LIGHT_1 || baseId == HOLY_SHOCK_1)\n+            {\n+                if (AuraEffect const* favo = me->GetAuraEffect(DIVINE_FAVOR_1, 0))\n+                    if (favo->IsAffectingSpell(spellInfo))\n+                        crit_chance += 100.f;\n+            }\n+        }\n+\n+        void ApplyClassDamageMultiplierMeleeSpell(int32& damage, SpellNonMeleeDamage& /*damageinfo*/, SpellInfo const* spellInfo, WeaponAttackType /*attackType*/, bool /*iscrit*/) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+            float fdamage = float(damage);\n+\n+            //apply bonus damage mods\n+            float pctbonus = 0.0f;\n+            //if (iscrit)\n+            //{\n+            //}\n+            //Sanctity of Battle: 15% bonus damage for Exorcism and Crusader Strike\n+            if ((GetSpec() == BOT_SPEC_PALADIN_RETRIBUTION) && lvl >= 25 && baseId == EXORCISM_1)\n+                pctbonus += 0.15f;\n+            //The Art of War (damage part): 10% bonus damage for Judgements, Crusader Strike and Divine Storm\n+            if ((GetSpec() == BOT_SPEC_PALADIN_RETRIBUTION) && lvl >= 40 &&\n+                (spellInfo->GetCategory() == SPELLCATEGORY_JUDGEMENT || baseId == CRUSADER_STRIKE_1 || baseId == DIVINE_STORM_1))\n+                pctbonus += 0.1f;\n+            //Judgements of the Pure (damage part): 25% bonus damage for Judgements and Seals\n+            if ((GetSpec() == BOT_SPEC_PALADIN_HOLY) && lvl >= 50 &&\n+                (spellInfo->GetCategory() == SPELLCATEGORY_JUDGEMENT ||\n+                spellInfo->GetSpellSpecific() == SPELL_SPECIFIC_SEAL ||\n+                baseId == JUDGEMENT_OF_COMMAND_DAMAGE))\n+                pctbonus += 0.25f;\n+            //Glyph of Exorcism: 20% bonus damage for Exorcism\n+            if (lvl >= 50 && baseId == EXORCISM_1)\n+                pctbonus += 0.2f;\n+\n+            damage = int32(fdamage * (1.0f + pctbonus));\n+        }\n+\n+        void ApplyClassDamageMultiplierSpell(int32& damage, SpellNonMeleeDamage& /*damageinfo*/, SpellInfo const* spellInfo, WeaponAttackType /*attackType*/, bool /*iscrit*/) const override\n+        {\n+            uint32 spellId = spellInfo->Id;\n+            uint8 lvl = me->GetLevel();\n+            float fdamage = float(damage);\n+\n+            //apply bonus damage mods\n+            float pctbonus = 0.0f;\n+            //if (iscrit)\n+            //{\n+            //}\n+\n+            //Judgements of the Pure (damage part): 25% bonus damage for Judgements and Seals\n+            if ((GetSpec() == BOT_SPEC_PALADIN_HOLY) && lvl >= 50 &&\n+                (spellInfo->GetCategory() == SPELLCATEGORY_JUDGEMENT ||\n+                spellInfo->GetSpellSpecific() == SPELL_SPECIFIC_SEAL ||\n+                spellId == JUDGEMENT_OF_COMMAND_DAMAGE))\n+                pctbonus += 0.25f;\n+            //Improved Consecration (id: 38422): 10% bonus damage for Consecration\n+            if (lvl >= 20 && spellId == GetSpell(CONSECRATION_1))\n+                pctbonus += 0.1f;\n+\n+            damage = int32(fdamage * (1.0f + pctbonus));\n+        }\n+\n+        void ApplyClassDamageMultiplierHeal(Unit const* /*victim*/, float& heal, SpellInfo const* spellInfo, DamageEffectType /*damagetype*/, uint32 /*stack*/) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+            float pctbonus = 0.0f;\n+            float flat_mod = 0.0f;\n+\n+            //Divine Plea: 50% reduced healing for all spells\n+            if (/*lvl >= 71 && */me->GetAuraEffect(SPELL_AURA_OBS_MOD_POWER, SPELLFAMILY_PALADIN, 0x0, 0x80004000, 0x1))\n+                pctbonus -= 0.5f;\n+\n+            //Healing Light: 12% bonus healing for Holy Light, Flash of Light and Holy Shock\n+            if ((GetSpec() == BOT_SPEC_PALADIN_HOLY) && lvl >= 15 && (baseId == HOLY_LIGHT_1 || baseId == FLASH_OF_LIGHT_1 || baseId == HOLY_SHOCK_1))\n+                pctbonus += 0.12f;\n+            //Glyph of Seal of Light: 5% bonus healing for all spells\n+            if (lvl >= 30 && me->GetAuraEffect(SPELL_AURA_ADD_PCT_MODIFIER, SPELLFAMILY_PALADIN, 0x0, 0x2000000, 0x0))\n+                pctbonus += 0.05f;\n+\n+            heal = heal * (1.0f + pctbonus) + flat_mod;\n+        }\n+\n+        void ApplyClassSpellCostMods(SpellInfo const* spellInfo, int32& cost) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            float fcost = float(cost);\n+            int32 flatbonus = 0;\n+            float pctbonus = 0.0f;\n+\n+            //percent mods\n+            //Benediction: -10% mana cost for Instant spells\n+            if (lvl >= 10 && !spellInfo->CalcCastTime())\n+                pctbonus += 0.1f;\n+            //Blessed Hands: -30% mana cost for Hand spells\n+            if ((GetSpec() == BOT_SPEC_PALADIN_HOLY) && lvl >= 25 && (spellInfo->SpellFamilyFlags[0] & 0x2110))\n+                pctbonus += 0.3f;\n+            //Holy Light Cost Reduction (id: 60148): -5% mana cost for Holy Light\n+            if (lvl >= 30 && baseId == HOLY_LIGHT_1)\n+                pctbonus += 0.05f;\n+            //Consecration Discount (id: 37180): -15% mana cost for Consecration\n+            if (lvl >= 30 && baseId == CONSECRATION_1)\n+                pctbonus += 0.15f;\n+            //Glyph of Seal of Wisdom: -5% mana cost for all healing spells (for bot it is all spells)\n+            if (lvl >= 15 && me->GetAuraEffect(SPELL_AURA_ADD_PCT_MODIFIER, SPELLFAMILY_PALADIN, 0x0, 0x4000000, 0x0))\n+                pctbonus += 0.05f;\n+            //Glyph of Shield of Righteous: -80% mana cost for Shield of Righteous\n+            if (lvl >= 75 && (spellInfo->SpellFamilyFlags[1] & 0x100000))\n+                pctbonus += 0.8f;\n+\n+            //flat mods\n+            //Cleanse Cost Reduced (id: 27847): -25 mana cost for Cleanse\n+            if (lvl >= 40 && baseId == CLEANSE_1)\n+                flatbonus += 25;\n+            //Reduced Holy Light Cost (id: 37739): -34 mana cost for Holy Light\n+            if (lvl >= 40 && baseId == HOLY_LIGHT_1)\n+                flatbonus += 34;\n+\n+            //cost can be < 0\n+            cost = int32(fcost * (1.0f - pctbonus)) - flatbonus;\n+        }\n+\n+        void ApplyClassSpellCastTimeMods(SpellInfo const* spellInfo, int32& casttime) const override\n+        {\n+            //casttime is in milliseconds\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            int32 timebonus = 0;\n+            //float pctbonus = 0.0f;\n+\n+            //100% mods\n+            //Glyph of Turn Evil: -100% cast time for Turn Evil\n+            if (lvl >= 24 && baseId == TURN_EVIL_1)\n+                timebonus += casttime;\n+            if (baseId == FLASH_OF_LIGHT_1 || baseId == EXORCISM_1)\n+            {\n+                //The Art of War\n+                AuraEffect const* arto = me->GetAuraEffect(THE_ART_OF_WAR_BUFF, 0);\n+                //Infusion of Light\n+                AuraEffect const* infu = me->GetAuraEffect(INFUSION_OF_LIGHT_BUFF, 1);\n+                if (arto && arto->IsAffectingSpell(spellInfo))\n+                    timebonus += casttime;\n+                else if (infu && infu->IsAffectingSpell(spellInfo))\n+                    timebonus += casttime;\n+            }\n+\n+            //flat mods\n+            //Improved Holy Light (id: 24457): -0.1 sec cast time for Holy Light\n+            if (lvl >= 40 && baseId == HOLY_LIGHT_1)\n+                timebonus += 100;\n+            //Recuced Holy Light Cast Time (id: 37189): -0.5 sec cast time for Holy Light (works only for healers)\n+            //Light's Grace: -0.5 sec cast time for Holy Light\n+            if (baseId == HOLY_LIGHT_1)\n+            {\n+                if (AuraEffect const* enli = me->GetAuraEffect(ENLIGHTENMENT_BUFF, 0))\n+                    if (enli->IsAffectingSpell(spellInfo))\n+                        timebonus += 500;\n+                if (AuraEffect const* grac = me->GetAuraEffect(LIGHTS_GRACE_BUFF, 0))\n+                    if (grac->IsAffectingSpell(spellInfo))\n+                        timebonus += 500;\n+            }\n+\n+            casttime = std::max<int32>(casttime - timebonus, 0);\n+        }\n+\n+        void ApplyClassSpellNotLoseCastTimeMods(SpellInfo const* spellInfo, int32& delayReduce) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchoolMask schools = spellInfo->GetSchoolMask();\n+            uint8 lvl = me->GetLevel();\n+            int32 reduceBonus = 0;\n+\n+            if (lvl >= 10 && (baseId == HOLY_LIGHT_1 || baseId == FLASH_OF_LIGHT_1))\n+                reduceBonus += 70;\n+\n+            delayReduce += reduceBonus;\n+        }\n+\n+        void ApplyClassSpellCooldownMods(SpellInfo const* spellInfo, uint32& cooldown) const override\n+        {\n+            //cooldown is in milliseconds\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            int32 timebonus = 0;\n+            float pctbonus = 0.0f;\n+\n+            //pct mods\n+\n+            //flat mods\n+            //Improved Judgements: -2 sec cooldown for judgements\n+            //Judgment Cooldown Reduction (60153): -1 sec cooldown for judgements\n+            //Judgement Cooldown Reduction (61776): -1 sec cooldown for judgements\n+            if (spellInfo->GetCategory() == SPELLCATEGORY_JUDGEMENT)\n+            {\n+                if (lvl >= 70)\n+                    timebonus += 4000;\n+                else if (lvl >= 60)\n+                    timebonus += 3000;\n+                else if (lvl >= 15)\n+                    timebonus += 2000;\n+            }\n+            //Sacred Duty: -60 sec cooldown for Divine Shield and Divine Protection\n+            if ((GetSpec() == BOT_SPEC_PALADIN_PROTECTION) && lvl >= 35 && (baseId == DIVINE_SHIELD_1 || baseId == DIVINE_PROTECTION_1))\n+                timebonus += 60000;\n+            //Reduced Righteous Defense Cooldown (37181): -2 sec cooldown for Righteous Defense\n+            if (lvl >= 60 && baseId == RIGHTEOUS_DEFENSE_1)\n+                timebonus += 2000;\n+            //Paladin T9 Tank 2P Bonus part 1: -2 sec cooldown for Hand of Reckoning\n+            if (lvl >= 78 && baseId == HAND_OF_RECKONING_1)\n+                timebonus += 2000;\n+            //Glyph of Turn Evil: +8 sec cooldown for Turn Evil\n+            if (lvl >= 24 && baseId == TURN_EVIL_1)\n+                timebonus -= 8000;\n+\n+            cooldown = std::max<int32>((float(cooldown) * (1.0f - pctbonus)) - timebonus, 0);\n+        }\n+\n+        void ApplyClassSpellCategoryCooldownMods(SpellInfo const* spellInfo, uint32& cooldown) const override\n+        {\n+            //cooldown is in milliseconds\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            int32 timebonus = 0;\n+            float pctbonus = 0.0f;\n+\n+            //pct mods\n+            //Purifying Power part 2: -33% cooldown for Exorcism and Holy Wrath\n+            if ((GetSpec() == BOT_SPEC_PALADIN_HOLY) && lvl >= 35 && (baseId == EXORCISM_1 || baseId == HOLY_WRATH_1))\n+                pctbonus += 0.333f;\n+            //Glyph of Avenging Wrath: -50% cooldown for Hammer of Wrath if Avenging Wrath is active\n+            if (lvl >= 70 && baseId == HAMMER_OF_WRATH_1 &&\n+                me->GetAuraEffect(SPELL_AURA_MOD_HEALING_DONE_PERCENT, SPELLFAMILY_PALADIN, 0x0, 0x2000, 0x0))\n+                pctbonus += 0.5f;\n+\n+            //flat mods\n+            //Improved Judgements: -2 sec cooldown for judgements\n+            //Judgment Cooldown Reduction (60153): -1 sec cooldown for judgements\n+            //Judgement Cooldown Reduction (61776): -1 sec cooldown for judgements\n+            if (spellInfo->GetCategory() == SPELLCATEGORY_JUDGEMENT)\n+            {\n+                if (lvl >= 70)\n+                    timebonus += 4000;\n+                else if (lvl >= 60)\n+                    timebonus += 3000;\n+                else if (lvl >= 15)\n+                    timebonus += 2000;\n+            }\n+            //Guardian's Favor part 1: -120 sec cooldown for Hand of Protection\n+            if (lvl >= 15 && baseId == HAND_OF_PROTECTION_1)\n+                timebonus += 120000;\n+            //Improved Hammer of Justice: -20 sec cooldown for Hammer of Justice\n+            if ((GetSpec() == BOT_SPEC_PALADIN_PROTECTION) && lvl >= 25 && baseId == HAMMER_OF_JUSTICE_1)\n+                timebonus += 20000;\n+            //Judgements of the Just: -10 sec cooldown for Hammer of Justice (tanks only)\n+            if ((GetSpec() == BOT_SPEC_PALADIN_PROTECTION) && lvl >= 55 && baseId == HAMMER_OF_JUSTICE_1)\n+                timebonus += 10000;\n+            //Glyph of Holy Shock: -1 sec cooldown for Holy Shock\n+            if (baseId == HOLY_SHOCK_1)\n+                timebonus += 1000;\n+            //Glyph of Consecration: +2 sec cooldown for Consecration\n+            if (lvl >= 20 && baseId == CONSECRATION_1)\n+                timebonus -= 2000;\n+            //Glyph of Holy Wrath: -15 sec cooldown for Holy Wrath\n+            if (lvl >= 50 && baseId == HOLY_WRATH_1)\n+                timebonus += 15000;\n+            //Improved Lay on Hands (part 2): -4 min cooldown for Lay on Hands\n+            if (lvl >= 20 && baseId == LAY_ON_HANDS_1)\n+                timebonus += 240000;\n+            //Glyph of Lay on Hands: -5 min cooldown for Lay on Hands (only healers)\n+            if (lvl >= 15 && HasRole(BOT_ROLE_HEAL) && baseId == LAY_ON_HANDS_1)\n+                timebonus += 300000;\n+            //Lay Hands (id: 28774): -4 min cooldown for Lay on Hands (only healers)\n+            if (lvl >= 60 && HasRole(BOT_ROLE_HEAL) && baseId == LAY_ON_HANDS_1)\n+                timebonus += 240000;\n+\n+            cooldown = std::max<int32>((float(cooldown) * (1.0f - pctbonus)) - timebonus, 0);\n+        }\n+\n+        void ApplyClassSpellGlobalCooldownMods(SpellInfo const* /*spellInfo*/, float& cooldown) const override\n+        {\n+            //cooldown is in milliseconds\n+            //uint32 spellId = spellInfo->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            //uint8 lvl = me->GetLevel();\n+            float timebonus = 0.0f;\n+            float pctbonus = 0.0f;\n+\n+            ////Unrelenting Assault (part 1, special): -0.5 sec global cooldown for Overpower and Revenge (not for tanks)\n+            //if (lvl >= 50 && !IsTank() && (spellId == GetSpell(OVERPOWER_1) || spellId == GetSpell(REVENGE_1)))\n+            //    timebonus += 500.f;\n+\n+            cooldown = (cooldown * (1.0f - pctbonus)) - timebonus;\n+        }\n+\n+        void ApplyClassSpellRadiusMods(SpellInfo const* spellInfo, float& radius) const override\n+        {\n+            //uint32 spellId = spellInfo->Id;\n+            //uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            float flatbonus = 0.0f;\n+            float pctbonus = 0.0f;\n+\n+            //pct mods\n+            ////Holy Reach\n+            //if (lvl >= 25 && ((spellInfo->SpellFamilyFlags[0] & 0x18400200) || (spellInfo->SpellFamilyFlags[2] & 0x4)))\n+            //    pctbonus += 0.2f;\n+\n+            //flat mods\n+            //Increased Aura Radii (23565)\n+            if (lvl >= 40 && (spellInfo->SpellFamilyFlags[0] & 0x4020048))\n+                flatbonus += 10.f;\n+\n+            radius = radius * (1.0f + pctbonus) + flatbonus;\n+        }\n+\n+        void ApplyClassSpellRangeMods(SpellInfo const* spellInfo, float& maxrange) const override\n+        {\n+            //uint32 spellId = spellInfo->Id;\n+            //uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            float flatbonus = 0.0f;\n+            float pctbonus = 0.0f;\n+\n+            //pct mods\n+            //Booming Voice\n+            //if (lvl >= 10 && ((spellInfo->SpellFamilyFlags[0] & 0x30000) || (spellInfo->SpellFamilyFlags[1] & 0x80)))\n+            //    pctbonus += 1.0f;\n+\n+            //flat mods\n+            //Enlightened Judgements: +30 yd range for Judgement of Light and Judgement of Wisdom (healers)\n+            if ((GetSpec() == BOT_SPEC_PALADIN_HOLY) && lvl >= 55 && (spellInfo->SpellFamilyFlags[0] & 0x800000))\n+                flatbonus += 30.f;\n+\n+            maxrange = maxrange * (1.0f + pctbonus) + flatbonus;\n+        }\n+\n+        void ApplyClassSpellMaxTargetsMods(SpellInfo const* spellInfo, uint32& targets) const override\n+        {\n+            uint32 bonusTargets = 0;\n+\n+            //Glyph of Hammer of the Righteous: +1 target\n+            if (spellInfo->SpellFamilyFlags[1] & 0x40000)\n+                bonusTargets += 1;\n+\n+            targets = targets + bonusTargets;\n+        }\n+\n+        void ApplyClassEffectMods(SpellInfo const* spellInfo, uint8 effIndex, float& value) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+            float pctbonus = 1.0f;\n+\n+            //Improved Devotion Aura: 50% increased effect\n+            if (baseId == DEVOTION_AURA_1 && effIndex == EFFECT_0 && GetSpec() == BOT_SPEC_PALADIN_PROTECTION && lvl >= 25)\n+                pctbonus *= 1.5f;\n+            //Improved Devotion Aura: 6% bonus healing\n+            if (baseId == IMPROVED_DEVOTION_AURA_SPELL && effIndex == EFFECT_1 && GetSpec() == BOT_SPEC_PALADIN_PROTECTION && lvl >= 25)\n+                value += 6.f;\n+\n+            value = value * pctbonus;\n+        }\n+\n+        void OnClassSpellGo(SpellInfo const* spellInfo) override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+\n+            if (baseId == HOLY_LIGHT_1 || baseId == FLASH_OF_LIGHT_1 || baseId == HOLY_SHOCK_1)\n+            {\n+                if (AuraEffect const* favo = me->GetAuraEffect(DIVINE_FAVOR_1, 0))\n+                    if (favo->IsAffectingSpell(spellInfo))\n+                        me->RemoveAurasDueToSpell(DIVINE_FAVOR_1);\n+            }\n+\n+            if (baseId == HOLY_LIGHT_1)\n+            {\n+                if (AuraEffect const* enli = me->GetAuraEffect(ENLIGHTENMENT_BUFF, 0))\n+                    if (enli->IsAffectingSpell(spellInfo))\n+                        me->RemoveAurasDueToSpell(ENLIGHTENMENT_BUFF);\n+                if (AuraEffect const* grac = me->GetAuraEffect(LIGHTS_GRACE_BUFF, 0))\n+                    if (grac->IsAffectingSpell(spellInfo))\n+                        me->RemoveAurasDueToSpell(LIGHTS_GRACE_BUFF);\n+                if (AuraEffect const* infu = me->GetAuraEffect(INFUSION_OF_LIGHT_BUFF, 0))\n+                    if (infu->IsAffectingSpell(spellInfo))\n+                        me->RemoveAurasDueToSpell(INFUSION_OF_LIGHT_BUFF);\n+            }\n+\n+            if (baseId == EXORCISM_1 || baseId == FLASH_OF_LIGHT_1)\n+            {\n+                //Infusion of Light takes priority since AoW affects Exorcism too\n+                AuraEffect const* infu = me->GetAuraEffect(INFUSION_OF_LIGHT_BUFF, 1);\n+                //The Art of War\n+                AuraEffect const* arto = me->GetAuraEffect(THE_ART_OF_WAR_BUFF, 0);\n+                if (arto && arto->IsAffectingSpell(spellInfo))\n+                    me->RemoveAurasDueToSpell(THE_ART_OF_WAR_BUFF);\n+                else if (infu && infu->IsAffectingSpell(spellInfo))\n+                    me->RemoveAurasDueToSpell(INFUSION_OF_LIGHT_BUFF);\n+            }\n+\n+            if (baseId == DIVINE_SACRIFICE_1)\n+            {\n+                _sacDamage = 0;\n+            }\n+        }\n+\n+        void SpellHitTarget(WorldObject* wtarget, SpellInfo const* spell) override\n+        {\n+            Unit* target = wtarget->ToUnit();\n+            if (!target)\n+                return;\n+\n+            uint32 spellId = spell->Id;\n+            uint32 baseId = spell->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+\n+            //Glyph of Beacon of Light: 30 sec increased duration\n+            if (baseId == BEACON_OF_LIGHT_1)\n+            {\n+                Aura* beac = target->GetAura(spellId, me->GetGUID());\n+                if (beac)\n+                {\n+                    uint32 dur = beac->GetDuration() + 30000;\n+                    beac->SetDuration(dur);\n+                    beac->SetMaxDuration(dur);\n+                }\n+            }\n+            //Judgements of the Just melee attack speed reduction part 1\n+            if ((GetSpec() == BOT_SPEC_PALADIN_PROTECTION) && lvl >= 55 && spell->GetCategory() == SPELLCATEGORY_JUDGEMENT)\n+            {\n+                me->CastSpell(target, JUDGEMENTS_OF_THE_JUST_AURA, true);\n+            }\n+            //Judgements of the Just melee attack speed reduction part 2\n+            if ((GetSpec() == BOT_SPEC_PALADIN_PROTECTION) && spellId == JUDGEMENTS_OF_THE_JUST_AURA)\n+            {\n+                AuraEffect* slow = target->GetAuraEffect(JUDGEMENTS_OF_THE_JUST_AURA, 1, me->GetGUID());\n+                if (slow)\n+                    slow->ChangeAmount(slow->GetAmount() - 20);\n+            }\n+\n+            if ((GetSpec() == BOT_SPEC_PALADIN_PROTECTION) && spellId == SEAL_OF_JUSTICE_STUN_AURA)\n+            {\n+                if (lvl >= 55)\n+                {\n+                    //Judgements of the Just: 1 sec increased duration\n+                    Aura* stun = target->GetAura(spellId, me->GetGUID());\n+                    if (stun)\n+                    {\n+                        uint32 dur = stun->GetDuration() + 1000;\n+                        stun->SetDuration(dur);\n+                        stun->SetMaxDuration(dur);\n+                    }\n+                }\n+            }\n+            if (baseId == CONSECRATION_1)\n+            {\n+                if (lvl >= 30)\n+                {\n+                    //Glyph of Consecration: 2 sec increased duration\n+                    Aura* cons = target->GetAura(spellId, me->GetGUID());\n+                    if (cons)\n+                    {\n+                        uint32 dur = cons->GetDuration() + 2000;\n+                        cons->SetDuration(dur);\n+                        cons->SetMaxDuration(dur);\n+                    }\n+                }\n+            }\n+            if ((GetSpec() == BOT_SPEC_PALADIN_RETRIBUTION) && baseId == RETRIBUTION_AURA_1)\n+            {\n+                if (lvl >= 30)\n+                {\n+                    //Sanctified Retribution: 50% increased effect\n+                    AuraEffect* eff = target->GetAuraEffect(spellId, EFFECT_0, me->GetGUID());\n+                    if (eff)\n+                        eff->ChangeAmount(eff->GetAmount() * 3 / 2);\n+                }\n+            }\n+            if ((GetSpec() == BOT_SPEC_PALADIN_HOLY) && baseId == CONCENTRATION_AURA_1)\n+            {\n+                if (lvl >= 25)\n+                {\n+                    //Improved Concentration Aura: 15% increased effect (flat)\n+                    AuraEffect* eff = target->GetAuraEffect(spellId, EFFECT_0, me->GetGUID());\n+                    if (eff)\n+                        eff->ChangeAmount(eff->GetAmount() + 15); //base = 35, bonus = 15\n+                }\n+            }\n+            if (baseId == FLASH_OF_LIGHT_HEAL_PERIODIC)\n+            {\n+                if ((GetSpec() == BOT_SPEC_PALADIN_HOLY) && lvl >= 78 && !HasRole(BOT_ROLE_TANK | BOT_ROLE_DPS))\n+                {\n+                    //Paldin T9 Holy 4P Bonus: 100% increased healing from Infusion of Light (pure healers only)\n+                    AuraEffect* eff = target->GetAuraEffect(spellId, EFFECT_0, me->GetGUID());\n+                    if (eff)\n+                        eff->ChangeAmount(eff->GetAmount() * 2);\n+                }\n+            }\n+            if (baseId == BLESSING_OF_WISDOM_1)\n+            {\n+                if (lvl >= 25)\n+                {\n+                    //Improved Blessing of Wisdom: 20% increased effect\n+                    AuraEffect* eff = target->GetAuraEffect(spellId, EFFECT_0, me->GetGUID());\n+                    if (eff)\n+                        eff->ChangeAmount(eff->GetAmount() * 6 / 5);\n+                }\n+            }\n+            if (baseId == BLESSING_OF_MIGHT_1)\n+            {\n+                if (lvl >= 15)\n+                {\n+                    //Improved Blessing of Might: 25% increased effect\n+                    if (Aura* migh = target->GetAura(spellId, me->GetGUID()))\n+                        for (auto i : NPCBots::index_array<uint8, EFFECT_2>) // 2 effects\n+                            if (AuraEffect* eff = migh->GetEffect(i))\n+                                eff->ChangeAmount((eff->GetAmount() * 125) / 100);\n+                }\n+            }\n+            if (baseId == HAND_OF_FREEDOM_1)\n+            {\n+                //Guardian's Favor part 2 (handled separately)\n+                if (Aura* hof = target->GetAura(spellId, me->GetGUID()))\n+                {\n+                    uint32 dur = hof->GetDuration() + 4000;\n+                    hof->SetDuration(dur);\n+                    hof->SetMaxDuration(dur);\n+                }\n+            }\n+            if ((GetSpec() == BOT_SPEC_PALADIN_HOLY) && baseId == HAND_OF_SALVATION_1 && !IsTank(target))\n+            {\n+                //Blessed Hands (part 2)\n+                if (AuraEffect* hos = target->GetAuraEffect(spellId, 0, me->GetGUID()))\n+                {\n+                    hos->ChangeAmount(hos->GetAmount() * 2);\n+                }\n+            }\n+            if ((GetSpec() == BOT_SPEC_PALADIN_HOLY) && baseId == HAND_OF_SACRIFICE_1)\n+            {\n+                //Blessed Hands (part 3)\n+                if (AuraEffect* hos = target->GetAuraEffect(spellId, 0, me->GetGUID()))\n+                {\n+                    hos->ChangeAmount(hos->GetAmount() + 10);\n+                }\n+            }\n+            if (baseId == BLESSING_OF_KINGS_1 || baseId == BLESSING_OF_MIGHT_1 ||\n+                baseId == BLESSING_OF_WISDOM_1 || baseId == BLESSING_OF_SANCTUARY_1)\n+            {\n+                //Blessings duration 1h\n+                if (Aura* bless = target->GetAura(spellId, me->GetGUID()))\n+                {\n+                    uint32 dur = HOUR * IN_MILLISECONDS;\n+                    bless->SetDuration(dur);\n+                    bless->SetMaxDuration(dur);\n+                }\n+            }\n+            if (baseId == SACRED_SHIELD_AURA_TRIGGERED || baseId == SACRED_SHIELD_1)\n+            {\n+                //Divine Guardian (part 2): 20% increased absorb, +100% duration\n+                Aura* shi = target->GetAura(spellId, me->GetGUID());\n+                if (shi)\n+                {\n+                    uint32 dur = shi->GetDuration() * 2;\n+                    shi->SetDuration(dur);\n+                    shi->SetMaxDuration(dur);\n+                    if (baseId == SACRED_SHIELD_AURA_TRIGGERED)\n+                    {\n+                        if (AuraEffect* eff = shi->GetEffect(EFFECT_0))\n+                            eff->ChangeAmount(eff->GetAmount() * 6 / 5);\n+                    }\n+                }\n+            }\n+\n+            OnSpellHitTarget(target, spell);\n+        }\n+\n+        void SpellHit(WorldObject* wcaster, SpellInfo const* spell) override\n+        {\n+            Unit* caster = wcaster->ToUnit();\n+            if (!caster)\n+                return;\n+\n+            uint32 baseId = spell->GetFirstRankSpell()->Id;\n+\n+            //Glyph of Seal of Vengeance\n+            if (baseId == SEAL_OF_VENGEANCE_1 || baseId == SEAL_OF_CORRUPTION_1)\n+            {\n+                AuraEffect* sea = me->GetAuraEffect(spell->Id, 1);\n+                if (sea)\n+                    sea->ChangeAmount(sea->GetAmount() + 10);\n+            }\n+\n+            //Aura Helper\n+            if (caster == me)\n+            {\n+                switch (baseId)\n+                {\n+                    case DEVOTION_AURA_1:\n+                    case CONCENTRATION_AURA_1:\n+                    case FIRE_RESISTANCE_AURA_1:\n+                    case FROST_RESISTANCE_AURA_1:\n+                    case SHADOW_RESISTANCE_AURA_1:\n+                    case RETRIBUTION_AURA_1:\n+                    case CRUSADER_AURA_1:\n+                        SetAIMiscValue(BOTAI_MISC_AURA_TYPE, baseId);\n+                        break;\n+                    default:\n+                        break;\n+                }\n+            }\n+\n+            //immunity markers\n+            if (baseId == AVENGING_WRATH_MARKER_SPELL)\n+                avDelayTimer = 30000;\n+            if (baseId == IMMUNITY_SHIELD_MARKER_SPELL)\n+                shieldDelayTimer = 30000;\n+\n+            OnSpellHit(caster, spell);\n+        }\n+\n+        void DamageDealt(Unit* victim, uint32& damage, DamageEffectType damageType) override\n+        {\n+            bot_ai::DamageDealt(victim, damage, damageType);\n+        }\n+\n+        void OnBotDamageTaken(Unit* /*attacker*/, uint32 damage, CleanDamage const* /*cleanDamage*/, DamageEffectType /*damagetype*/, SpellInfo const* spellInfo) override\n+        {\n+            // Divine Sacrifice helper - calculate remaining damage amount and find if we can be one-shot'ed\n+            if (damage && _sacDamage < int32(me->GetMaxHealth() / 4))\n+            {\n+                if (spellInfo && spellInfo->Id == DIVINE_SACRIFICE_1)\n+                    _sacDamage -= int32(damage);\n+                else\n+                    _sacDamage += int32(damage);\n+\n+                if (me->GetHealth() - _sacDamage < me->GetMaxHealth() / 5)\n+                {\n+                    if (me->GetAuraEffect(SPELL_AURA_SPLIT_DAMAGE_PCT, SPELLFAMILY_PALADIN, 0x0, 0x0, 0x4, me->GetGUID()))\n+                    {\n+                        _sacDamage = me->GetMaxHealth();\n+                        me->RemoveAurasDueToSpell(DIVINE_SACRIFICE_1, me->GetGUID());\n+                    }\n+                }\n+            }\n+        }\n+\n+        void DamageTaken(Unit* u, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo*/) override\n+        {\n+            if (!u)\n+                return;\n+            if (!u->IsInCombat() && !me->IsInCombat())\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        //healer may be nullptr\n+        void HealReceived(Unit* healer, uint32& heal) override\n+        {\n+            //Spiritual Attunement (double the effect on bots)\n+            if (heal && (GetSpec() == BOT_SPEC_PALADIN_PROTECTION) && me->GetLevel() >= 40 && healer != me && GetLostHP(me))\n+            {\n+                if (int32 basepoints = int32(CalculatePct(std::min<int32>(heal, GetLostHP(me)), 20)))\n+                {\n+                    CastSpellExtraArgs args(true);\n+                    args.AddSpellBP0(basepoints);\n+                    me->CastSpell(me, SPIRITUAL_ATTUNEMENT_ENERGIZE, args);\n+                }\n+            }\n+\n+            //bot_ai::HealReceived(healer, heal);\n+        }\n+\n+        void OwnerAttackedBy(Unit* u) override\n+        {\n+            if (!u)\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        float GetSpellAttackRange(bool longRange) const override\n+        {\n+            return longRange ? CalcSpellMaxRange(GetSpell(EXORCISM_1) ? EXORCISM_1 : JUDGEMENT_OF_LIGHT_1) : 10.f;\n+        }\n+\n+        uint32 GetAIMiscValue(uint32 data) const override\n+        {\n+            switch (data)\n+            {\n+                case BOTAI_MISC_AURA_TYPE:\n+                    return _myaura;\n+                default:\n+                    return 0;\n+            }\n+        }\n+\n+        void SetAIMiscValue(uint32 data, uint32 value) override\n+        {\n+            switch (data)\n+            {\n+                case BOTAI_MISC_AURA_TYPE:\n+                    _myaura = value;\n+                    break;\n+                default:\n+                    break;\n+            }\n+\n+            bot_ai::SetAIMiscValue(data, value);\n+        }\n+\n+        void Reset() override\n+        {\n+            checkAuraTimer = 0;\n+            checkSealTimer = 0;\n+            checkShieldTimer = 0;\n+            checkBeaconTimer = 0;\n+            avDelayTimer = 0;\n+            shieldDelayTimer = 0;\n+            _sacDamage = 0;\n+\n+            CLEANSE = 0;\n+\n+            DefaultInit();\n+        }\n+\n+        void ReduceCD(uint32 diff) override\n+        {\n+            if (checkAuraTimer > diff)              checkAuraTimer -= diff;\n+            if (checkSealTimer > diff)              checkSealTimer -= diff;\n+            if (checkShieldTimer > diff)            checkShieldTimer -= diff;\n+            if (checkBeaconTimer > diff)            checkBeaconTimer -= diff;\n+            if (avDelayTimer > diff)                avDelayTimer -= diff;\n+            if (shieldDelayTimer > diff)            shieldDelayTimer -= diff;\n+        }\n+\n+        void InitPowers() override\n+        {\n+            me->SetPowerType(POWER_MANA);\n+        }\n+\n+        void InitSpells() override\n+        {\n+            uint8 lvl = me->GetLevel();\n+            bool isHoly = GetSpec() == BOT_SPEC_PALADIN_HOLY;\n+            bool isProt = GetSpec() == BOT_SPEC_PALADIN_PROTECTION;\n+            bool isRetr = GetSpec() == BOT_SPEC_PALADIN_RETRIBUTION;\n+\n+            InitSpellMap(FLASH_OF_LIGHT_1);\n+            InitSpellMap(HOLY_LIGHT_1);\n+            InitSpellMap(LAY_ON_HANDS_1);\n+            InitSpellMap(SACRED_SHIELD_1);\n+            InitSpellMap(REDEMPTION_1);\n+            InitSpellMap(HAMMER_OF_JUSTICE_1);\n+            InitSpellMap(TURN_EVIL_1);\n+            InitSpellMap(HOLY_WRATH_1);\n+            InitSpellMap(EXORCISM_1);\n+            InitSpellMap(JUDGEMENT_OF_LIGHT_1);\n+            InitSpellMap(JUDGEMENT_OF_WISDOM_1);\n+            InitSpellMap(JUDGEMENT_OF_JUSTICE_1);\n+            InitSpellMap(CONSECRATION_1);\n+            InitSpellMap(HAMMER_OF_WRATH_1);\n+            InitSpellMap(AVENGING_WRATH_1);\n+            InitSpellMap(RIGHTEOUS_FURY_1);\n+            InitSpellMap(SHIELD_OF_RIGHTEOUSNESS_1);\n+            InitSpellMap(BLESSING_OF_MIGHT_1);\n+            InitSpellMap(BLESSING_OF_WISDOM_1);\n+            InitSpellMap(BLESSING_OF_KINGS_1);\n+            InitSpellMap(DEVOTION_AURA_1);\n+            InitSpellMap(CONCENTRATION_AURA_1);\n+            InitSpellMap(FIRE_RESISTANCE_AURA_1);\n+            InitSpellMap(FROST_RESISTANCE_AURA_1);\n+            InitSpellMap(SHADOW_RESISTANCE_AURA_1);\n+            InitSpellMap(RETRIBUTION_AURA_1);\n+            InitSpellMap(CRUSADER_AURA_1);\n+            InitSpellMap(DIVINE_PLEA_1);\n+            InitSpellMap(HAND_OF_PROTECTION_1);\n+            InitSpellMap(HAND_OF_FREEDOM_1);\n+            InitSpellMap(HAND_OF_SALVATION_1);\n+            InitSpellMap(HAND_OF_SACRIFICE_1);\n+            InitSpellMap(HAND_OF_RECKONING_1);\n+            InitSpellMap(RIGHTEOUS_DEFENSE_1);\n+            //InitSpellMap(PURIFY_1);\n+            //InitSpellMap(CLEANSE_1);\n+            InitSpellMap(SEAL_OF_LIGHT_1);\n+            InitSpellMap(SEAL_OF_RIGHTEOUSNESS_1);\n+            InitSpellMap(SEAL_OF_WISDOM_1);\n+            InitSpellMap(SEAL_OF_JUSTICE_1);\n+            InitSpellMap((me->GetRaceMask() & RACEMASK_ALLIANCE) ? SEAL_OF_VENGEANCE_1 : SEAL_OF_CORRUPTION_1);\n+            InitSpellMap(DIVINE_INTERVENTION_1);\n+            InitSpellMap(DIVINE_PROTECTION_1);\n+            InitSpellMap(DIVINE_SHIELD_1);\n+\n+  /*Talent*/lvl >= (isHoly ? 20 : 70) ? InitSpellMap(AURA_MASTERY_1) : RemoveSpell(AURA_MASTERY_1);\n+  /*Talent*/lvl >= 30 && isHoly ? InitSpellMap(DIVINE_FAVOR_1) : RemoveSpell(DIVINE_FAVOR_1);\n+  /*Talent*/lvl >= 40 && isHoly ? InitSpellMap(HOLY_SHOCK_1) : RemoveSpell(HOLY_SHOCK_1);\n+  /*Talent*/lvl >= 50 && isHoly ? InitSpellMap(DIVINE_ILLUMINATION_1) : RemoveSpell(DIVINE_ILLUMINATION_1);\n+  /*Talent*/lvl >= 60 && isHoly ? InitSpellMap(BEACON_OF_LIGHT_1) : RemoveSpell(BEACON_OF_LIGHT_1);\n+\n+  /*Talent*/lvl >= (isProt ? 20 : isHoly ? 70 : 99) ? InitSpellMap(DIVINE_SACRIFICE_1) : RemoveSpell(DIVINE_SACRIFICE_1);\n+  /*Talent*/lvl >= 30 && isProt ? InitSpellMap(BLESSING_OF_SANCTUARY_1) : RemoveSpell(BLESSING_OF_SANCTUARY_1);\n+  /*Talent*/lvl >= 40 && isProt ? InitSpellMap(HOLY_SHIELD_1) : RemoveSpell(HOLY_SHIELD_1);\n+  /*Talent*/lvl >= 50 && isProt ? InitSpellMap(AVENGERS_SHIELD_1) : RemoveSpell(AVENGERS_SHIELD_1);\n+  /*Talent*/lvl >= 60 && isProt ? InitSpellMap(HAMMER_OF_THE_RIGHTEOUS_1) : RemoveSpell(HAMMER_OF_THE_RIGHTEOUS_1);\n+\n+  /*Talent*/lvl >= 20 && isRetr ? InitSpellMap(SEAL_OF_COMMAND_1) : RemoveSpell(SEAL_OF_COMMAND_1);\n+  /*Talent*/lvl >= 40 && isRetr ? InitSpellMap(REPENTANCE_1) : RemoveSpell(REPENTANCE_1);\n+  /*Talent*/lvl >= 50 && isRetr ? InitSpellMap(CRUSADER_STRIKE_1) : RemoveSpell(CRUSADER_STRIKE_1);\n+  /*Talent*/lvl >= 60 && isRetr ? InitSpellMap(DIVINE_STORM_1) : RemoveSpell(DIVINE_STORM_1);\n+\n+            CLEANSE = InitSpell(me, CLEANSE_1) ? CLEANSE_1 : PURIFY_1;\n+            RemoveSpell(CLEANSE_1);\n+            RemoveSpell(PURIFY_1);\n+            InitSpellMap(CLEANSE);\n+        }\n+\n+        void ApplyClassPassives() const override\n+        {\n+            uint8 level = master->GetLevel();\n+            bool isHoly = GetSpec() == BOT_SPEC_PALADIN_HOLY;\n+            bool isProt = GetSpec() == BOT_SPEC_PALADIN_PROTECTION;\n+            bool isRetr = GetSpec() == BOT_SPEC_PALADIN_RETRIBUTION;\n+\n+            RefreshAura(ILLUMINATION, isHoly && level >= 20 ? 1 : 0);\n+            RefreshAura(IMPROVED_LAY_ON_HANDS, isHoly && level >= 20 ? 1 : 0);\n+            RefreshAura(IMPROVED_CONCENTRATION_AURA, isHoly && level >= 25 ? 1 : 0);\n+            RefreshAura(LIGHTS_GRACE, isHoly && level >= 40 ? 1 : 0);\n+            RefreshAura(SACRED_CLEANSING, isHoly && level >= 45 ? 1 : 0);\n+            RefreshAura(JUDGEMENTS_OF_THE_PURE, isHoly && level >= 50 ? 1 : 0);\n+            RefreshAura(INFUSION_OF_LIGHT, isHoly && level >= 55 ? 1 : 0);\n+            RefreshAura(RECUCED_HOLY_LIGHT_CAST_TIME, isHoly && level >= 60 ? 1 : 0); //\n+\n+            RefreshAura(IMPROVED_RIGHTEOUS_FURY, isProt && level >= 20 ? 1 : 0);\n+            RefreshAura(IMPROVED_DEVOTION_AURA, isProt && level >= 25 ? 1 : 0);\n+            RefreshAura(DIVINE_GUARDIAN, isProt && level >= 25 ? 1 : 0);\n+            RefreshAura(RECKONING5, isProt && level >= 50 ? 1 : 0);\n+            RefreshAura(RECKONING4, isProt && level >= 45 && level < 50 ? 1 : 0);\n+            RefreshAura(RECKONING3, isProt && level >= 40 && level < 45 ? 1 : 0);\n+            RefreshAura(RECKONING2, isProt && level >= 35 && level < 40 ? 1 : 0);\n+            RefreshAura(RECKONING1, isProt && level >= 30 && level < 35 ? 1 : 0);\n+            RefreshAura(ONE_HANDED_WEAPON_SPECIALIZATION, isProt && level >= 35 ? 1 : 0);\n+            RefreshAura(ARDENT_DEFENDER, isProt && level >= 40 ? 1 : 0);\n+            //RefreshAura(COMBAT_EXPERTISE, isProt && level >= 45 ? 1 : 0);\n+            RefreshAura(REDOUBT3, isProt && level >= 55 ? 1 : 0);\n+            RefreshAura(REDOUBT2, isProt && level >= 50 && level < 55 ? 1 : 0);\n+            RefreshAura(REDOUBT1, isProt && level >= 45 && level < 50 ? 1 : 0);\n+            RefreshAura(GUARDED_BY_THE_LIGHT, isProt && level >= 50 ? 1 : 0);\n+            RefreshAura(TOUCHED_BY_THE_LIGHT, isProt && level >= 50 ? 1 : 0);\n+            RefreshAura(SHIELD_OF_THE_TEMPLAR, isProt && level >= 55 ? 1 : 0);\n+            //RefreshAura(JUDGEMENTS_OF_THE_JUST, isProt && level >= 55 ? 1 : 0);\n+\n+            RefreshAura(HEART_OF_THE_CRUSADER, isRetr && level >= 15 ? 1 : 0);\n+            RefreshAura(PURSUIT_OF_JUSTICE, isRetr && level >= 20 ? 1 : 0);\n+            RefreshAura(FANATICISM, isRetr && level >= 20 ? 1 : 0);\n+            RefreshAura(VINDICATION2, isRetr && level >= 25 ? 1 : 0);\n+            RefreshAura(VINDICATION1, isRetr && level >= 20 && level < 25 ? 1 : 0);\n+            RefreshAura(CRUSADE, isRetr && level >= 25 ? 1 : 0);\n+            RefreshAura(TWO_HANDED_WEAPON_SPECIALIZATION, isRetr && level >= 30 ? 1 : 0);\n+            RefreshAura(SANCTIFIED_RETRIBUTION, !IAmFree() && isRetr && level >= 30 ? 1 : 0);\n+            RefreshAura(VENGEANCE3, isRetr && level >= 40 ? 1 : 0);\n+            RefreshAura(VENGEANCE2, isRetr && level >= 37 && level < 40 ? 1 : 0);\n+            RefreshAura(VENGEANCE1, isRetr && level >= 35 && level < 37 ? 1 : 0);\n+            RefreshAura(DIVINE_PURPOSE, isRetr && level >= 35 ? 1 : 0);\n+            RefreshAura(JUDGEMENTS_OF_THE_WISE, isRetr && level >= 40 ? 1 : 0);\n+            RefreshAura(ART_OF_WAR, isRetr && level >= 40 ? 1 : 0);\n+            RefreshAura(SWIFT_RETRIBUTION, !IAmFree() && isRetr && level >= 50 ? 1 : 0);\n+            RefreshAura(SHEATH_OF_LIGHT3, isRetr && level >= 60 ? 1 : 0);\n+            RefreshAura(SHEATH_OF_LIGHT2, isRetr && level >= 55 && level < 60 ? 1 : 0);\n+            RefreshAura(SHEATH_OF_LIGHT1, isRetr && level >= 50 && level < 55 ? 1 : 0);\n+            RefreshAura(RIGHTEOUS_VENGEANCE3, isRetr && level >= 60 ? 1 : 0);\n+            RefreshAura(RIGHTEOUS_VENGEANCE2, isRetr && level >= 57 && level < 60 ? 1 : 0);\n+            RefreshAura(RIGHTEOUS_VENGEANCE1, isRetr && level >= 55 && level < 57 ? 1 : 0);\n+\n+            RefreshAura(GLYPH_HOLY_LIGHT, level >= 15 ? 1 : 0);\n+            RefreshAura(GLYPH_SALVATION, level >= 26 ? 1 : 0);\n+\n+            RefreshAura(JUDGEMENT_ANTI_PARRY_DODGE_PASSIVE);\n+\n+            //RefreshAura(CLEANSE_HEAL_PASSIVE, level >= 58 ? 1 : 0);\n+        }\n+\n+        bool CanUseManually(uint32 basespell) const override\n+        {\n+            switch (basespell)\n+            {\n+                case FLASH_OF_LIGHT_1:\n+                case HOLY_LIGHT_1:\n+                case LAY_ON_HANDS_1:\n+                case HAND_OF_FREEDOM_1:\n+                case SACRED_SHIELD_1:\n+                case CLEANSE_1:\n+                case HAND_OF_PROTECTION_1:\n+                case HAND_OF_SALVATION_1:\n+                case HAND_OF_SACRIFICE_1:\n+                //case SEAL_OF_COMMAND_1:\n+                //case SEAL_OF_LIGHT_1:\n+                //case SEAL_OF_RIGHTEOUSNESS_1:\n+                //case SEAL_OF_WISDOM_1:\n+                //case SEAL_OF_JUSTICE_1:\n+                case DIVINE_PLEA_1:\n+                case AVENGING_WRATH_1:\n+                case BLESSING_OF_MIGHT_1:\n+                case BLESSING_OF_WISDOM_1:\n+                case BLESSING_OF_KINGS_1:\n+                case BLESSING_OF_SANCTUARY_1:\n+                    return true;\n+                case HOLY_SHOCK_1:\n+                    return HasRole(BOT_ROLE_HEAL);\n+                case DEVOTION_AURA_1:\n+                case CONCENTRATION_AURA_1:\n+                case FIRE_RESISTANCE_AURA_1:\n+                case FROST_RESISTANCE_AURA_1:\n+                case SHADOW_RESISTANCE_AURA_1:\n+                case RETRIBUTION_AURA_1:\n+                case CRUSADER_AURA_1:\n+                    return _myaura != basespell;\n+                case PURIFY_1:\n+                    return !GetSpell(CLEANSE_1);\n+                default:\n+                    return false;\n+            }\n+        }\n+\n+        bool HasAbilitiesSpecifics() const override { return true; }\n+        void FillAbilitiesSpecifics(Player const* player, std::list<std::string> &specList) override\n+        {\n+            uint32 textId;\n+            switch (_myaura)\n+            {\n+                case DEVOTION_AURA_1:          textId = BOT_TEXT_DEVOTION;         break;\n+                case CONCENTRATION_AURA_1:     textId = BOT_TEXT_CONCENTRATION;    break;\n+                case FIRE_RESISTANCE_AURA_1:   textId = BOT_TEXT_FIRERESISTANCE;   break;\n+                case FROST_RESISTANCE_AURA_1:  textId = BOT_TEXT_FROSTRESISTANCE;  break;\n+                case SHADOW_RESISTANCE_AURA_1: textId = BOT_TEXT_SHADOWRESISTANCE; break;\n+                case RETRIBUTION_AURA_1:       textId = BOT_TEXT_RETRIBUTION;      break;\n+                case CRUSADER_AURA_1:          textId = BOT_TEXT_CRUSADER;         break;\n+                default:                       textId = BOT_TEXT_NOAURA;           break;\n+            }\n+            specList.push_back(LocalizedNpcText(player, BOT_TEXT_AURA) + \": \" + LocalizedNpcText(player, textId));\n+        }\n+\n+        std::vector<uint32> const* GetDamagingSpellsList() const override\n+        {\n+            return &Paladin_spells_damage;\n+        }\n+        std::vector<uint32> const* GetCCSpellsList() const override\n+        {\n+            return &Paladin_spells_cc;\n+        }\n+        std::vector<uint32> const* GetHealingSpellsList() const override\n+        {\n+            return &Paladin_spells_heal;\n+        }\n+        std::vector<uint32> const* GetSupportSpellsList() const override\n+        {\n+            return &Paladin_spells_support;\n+        }\n+\n+        void InitHeals() override\n+        {\n+            SpellInfo const* spellInfo;\n+            if (InitSpell(me, HOLY_SHOCK_HEAL_1))\n+            {\n+                spellInfo = sSpellMgr->GetSpellInfo(InitSpell(me, HOLY_SHOCK_HEAL_1));\n+                _heals[HOLY_SHOCK_1] = me->SpellHealingBonusDone(me, spellInfo, spellInfo->_effects[0].CalcValue(me), HEAL, spellInfo->GetEffect(EFFECT_0), {});\n+            }\n+            else\n+                _heals[HOLY_SHOCK_1] = 0;\n+\n+            if (InitSpell(me, HOLY_LIGHT_1))\n+            {\n+                spellInfo = sSpellMgr->GetSpellInfo(InitSpell(me, HOLY_LIGHT_1));\n+                _heals[HOLY_LIGHT_1] = me->SpellHealingBonusDone(me, spellInfo, spellInfo->_effects[0].CalcValue(me), HEAL, spellInfo->GetEffect(EFFECT_0), {});\n+            }\n+            else\n+                _heals[HOLY_LIGHT_1] = 0;\n+\n+            if (InitSpell(me, FLASH_OF_LIGHT_1))\n+            {\n+                spellInfo = sSpellMgr->GetSpellInfo(InitSpell(me, FLASH_OF_LIGHT_1));\n+                _heals[FLASH_OF_LIGHT_1] = me->SpellHealingBonusDone(me, spellInfo, spellInfo->_effects[0].CalcValue(me), HEAL, spellInfo->GetEffect(EFFECT_0), {});\n+            }\n+            else\n+                _heals[FLASH_OF_LIGHT_1] = 0;\n+        }\n+\n+    private:\n+        //Spells\n+        uint32 CLEANSE;\n+        //Timers\n+/*misc*/uint32 checkAuraTimer, checkSealTimer, checkShieldTimer, checkBeaconTimer, avDelayTimer, shieldDelayTimer;\n+        //Special\n+/*misc*/uint32 _myaura;\n+/*misc*/int32 _sacDamage;\n+\n+        using HealMap = std::unordered_map<uint32 /*baseId*/, int32 /*amount*/>;\n+        HealMap _heals;\n+\n+        //uint32 _getBlessingsMask(Unit const*) const\n+        //Scans target for auras which are related to paladin's blessings\n+        //(even if aura is just incompatible with one)\n+        //returns applied blessings mask\n+        //used for finding out which blessings target lacks\n+        uint32 _getBlessingsMask(Unit const* target) const\n+        {\n+            uint32 mask = 0;\n+\n+            for (auto const& [_, auraApp] : target->GetAppliedAuras())\n+            {\n+                bool blessing = true;\n+                switch (auraApp->GetBase()->GetSpellInfo()->GetFirstRankSpell()->Id)\n+                {\n+                    case BLESSING_OF_WISDOM_1:\n+                    case GREATER_BLESSING_OF_WISDOM_1:\n+                        mask |= SPECIFIC_BLESSING_WISDOM;\n+                        break;\n+                    case BLESSING_OF_KINGS_1:\n+                    case GREATER_BLESSING_OF_KINGS_1:\n+                        mask |= SPECIFIC_BLESSING_KINGS;\n+                        break;\n+                    case BLESSING_OF_SANCTUARY_1:\n+                    case GREATER_BLESSING_OF_SANCTUARY_1:\n+                        mask |= SPECIFIC_BLESSING_SANCTUARY;\n+                        break;\n+                    case BLESSING_OF_MIGHT_1:\n+                    case GREATER_BLESSING_OF_MIGHT_1:\n+                    case BATTLESHOUT_1:\n+                        mask |= SPECIFIC_BLESSING_MIGHT;\n+                        break;\n+                    default:\n+                        blessing = false; //next aura\n+                        break;\n+                }\n+\n+                if (blessing && auraApp->GetBase()->GetCasterGUID() == me->GetGUID())\n+                    mask |= SPECIFIC_BLESSING_MY_BLESSING;\n+            }\n+\n+            return mask;\n+        }\n+        //uint32 _getAurasMask(Unit const*) const\n+        //Scans target for paladin's auras\n+        //returns applied auras mask\n+        //used for finding out which auras target lacks\n+        uint32 _getAurasMask(std::map<uint32 /*type*/, uint32 /*curId*/>& idMap) const\n+        {\n+            uint32 mask = 0;\n+\n+            for (auto const& [spellId, auraApp] : me->GetAppliedAuras())\n+            {\n+                bool isAura = true;\n+                uint32 baseId = auraApp->GetBase()->GetSpellInfo()->GetFirstRankSpell()->Id;\n+                switch (baseId)\n+                {\n+                    case DEVOTION_AURA_1:\n+                        mask |= SPECIFIC_AURA_DEVOTION;\n+                        break;\n+                    case CONCENTRATION_AURA_1:\n+                        mask |= SPECIFIC_AURA_CONCENTRATION;\n+                        break;\n+                    case FIRE_RESISTANCE_AURA_1:\n+                        mask |= SPECIFIC_AURA_FIRE_RES;\n+                        break;\n+                    case FROST_RESISTANCE_AURA_1:\n+                        mask |= SPECIFIC_AURA_FROST_RES;\n+                        break;\n+                    case SHADOW_RESISTANCE_AURA_1:\n+                        mask |= SPECIFIC_AURA_SHADOW_RES;\n+                        break;\n+                    case RETRIBUTION_AURA_1:\n+                        mask |= SPECIFIC_AURA_RETRIBUTION;\n+                        break;\n+                    case CRUSADER_AURA_1:\n+                        mask |= SPECIFIC_AURA_CRUSADER;\n+                        break;\n+                    default:\n+                        isAura = false; //next aura\n+                        break;\n+                }\n+\n+                if (isAura)\n+                {\n+                    idMap[baseId] = spellId;\n+                    if (auraApp->GetBase()->GetCasterGUID() == me->GetGUID())\n+                        mask |= SPECIFIC_AURA_MY_AURA;\n+                }\n+            }\n+\n+            return mask;\n+        }\n+    };\n+};\n+\n+void AddSC_paladin_bot()\n+{\n+    new paladin_bot();\n+}\ndiff --git a/src/server/game/AI/NpcBots/bot_priest_ai.cpp b/src/server/game/AI/NpcBots/bot_priest_ai.cpp\nnew file mode 100644\nindex 0000000000..761a8c0f7a\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bot_priest_ai.cpp\n@@ -0,0 +1,2018 @@\n+#include \"bot_ai.h\"\n+#include \"botlogtraits.h\"\n+#include \"botmgr.h\"\n+#include \"botspell.h\"\n+#include \"bottext.h\"\n+#include \"bottraits.h\"\n+#include \"Group.h\"\n+#include \"Map.h\"\n+#include \"MotionMaster.h\"\n+#include \"Player.h\"\n+#include \"ScriptMgr.h\"\n+#include \"Spell.h\"\n+#include \"SpellAuraEffects.h\"\n+#include \"SpellMgr.h\"\n+#include \"TemporarySummon.h\"\n+/*\n+Priest NpcBot (reworked by Trickerer onlysuffering@gmail.com)\n+Complete - Around 90%\n+TODO: Mana Burn, Binding Heal, Lightwell\n+*/\n+\n+enum PriestBaseSpells\n+{\n+    DISPEL_MAGIC_1                      = 527,\n+    MASS_DISPEL_1                       = 32375,\n+    CURE_DISEASE_1                      = 528,\n+    ABOLISH_DISEASE_1                   = 552,\n+    FEAR_WARD_1                         = 6346,\n+    PAIN_SUPPRESSION_1                  = 33206,\n+    PSYCHIC_SCREAM_1                    = 8122,\n+    FADE_1                              = 586,\n+    PSYCHIC_HORROR_1                    = 64044,\n+    SILENCE_1                           = 15487,\n+    PENANCE_1                           = 47540,\n+    VAMPIRIC_EMBRACE_1                  = 15286,\n+    DISPERSION_1                        = 47585,\n+    MIND_SEAR_1                         = 48045,\n+    GUARDIAN_SPIRIT_1                   = 47788,\n+    SHACKLE_UNDEAD_1                    = 9484,\n+    LESSER_HEAL_1                       = 2050,\n+    NORMAL_HEAL_1                       = 2054,\n+    GREATER_HEAL_1                      = 2060,\n+    RENEW_1                             = 139,\n+    FLASH_HEAL_1                        = 2061,\n+    PRAYER_OF_HEALING_1                 = 596,\n+    CIRCLE_OF_HEALING_1                 = 34861,\n+    DIVINE_HYMN_1                       = 64843,\n+    PRAYER_OF_MENDING_1                 = 33076,\n+    RESURRECTION_1                      = 2006,\n+    PW_SHIELD_1                         = 17,\n+    INNER_FIRE_1                        = 588,\n+    PW_FORTITUDE_1                      = 1243,\n+    SHADOW_PROTECTION_1                 = 976,\n+    DIVINE_SPIRIT_1                     = 14752,\n+    HOLY_FIRE_1                         = 14914,\n+    SMITE_1                             = 585,\n+    SW_PAIN_1                           = 589,\n+    MIND_BLAST_1                        = 8092,\n+    SW_DEATH_1                          = 32379,\n+    DEVOURING_PLAGUE_1                  = 2944,\n+    MIND_FLAY_1                         = 15407,\n+    VAMPIRIC_TOUCH_1                    = 34914,\n+    SHADOWFORM_1                        = 15473,\n+    INNER_FOCUS_1                       = 14751,\n+    DESPERATE_PRAYER_1                  = 19236,\n+    POWER_INFUSION_1                    = 10060,\n+    HYMN_OF_HOPE_1                      = 64901,\n+\n+    LEVITATE_1                          = 1706\n+};\n+enum PriestPassives\n+{\n+//Talents\n+    UNBREAKABLE_WILL                = 14791,//rank 5\n+    SPIRIT_TAP                      = 15336,//rank 3\n+    IMPROVED_SPIRIT_TAP             = 15338,//rank 2\n+    MEDITATION                      = 14777,//rank 3\n+    INSPIRATION1                    = 14892,\n+    INSPIRATION2                    = 15362,\n+    INSPIRATION3                    = 15363,\n+    SHADOW_WEAVING1                 = 15257,\n+    SHADOW_WEAVING2                 = 15331,\n+    SHADOW_WEAVING3                 = 15332,\n+    SURGE_OF_LIGHT                  = 33154,//rank 2\n+    IMPROVED_DEVOURING_PLAGUE       = 63627,//rank 3\n+    HOLY_CONCENTRATION              = 34860,//rank 3\n+    RENEWED_HOPE                    = 57472,//rank 3\n+    RAPTURE                         = 47537,//rank 3\n+    BODY_AND_SOUL1                  = 64127,\n+    SERENDIPITY                     = 63737,//rank 3\n+    IMPROVED_SHADOWFORM             = 47570,//rank 2\n+    MISERY1                         = 33191,\n+    MISERY2                         = 33192,\n+    MISERY3                         = 33193,\n+    DIVINE_AEGIS                    = 47515,//rank 3\n+    GRACE                           = 47517,//rank 2\n+    EMPOWERED_RENEW1                = 63534,\n+    EMPOWERED_RENEW2                = 63542,\n+    EMPOWERED_RENEW3                = 63543,\n+    BORROWED_TIME                   = 52800,//rank 5\n+//Glyphs\n+    //GLYPH_SW_PAIN                   = 55681,\n+    GLYPH_PW_SHIELD                 = 55672,\n+    GLYPH_DISPEL_MAGIC              = 55677,\n+    GLYPH_PRAYER_OF_HEALING         = 55680,\n+    GLYPH_SHADOW                    = 55689,\n+//other\n+    PRIEST_T10_2P_BONUS             = 70770 //33% renew\n+};\n+enum PriestSpecial\n+{\n+    SHADOW_WEAVING_BUFF             = 15258,\n+    MIND_FLAY_DAMAGE                = 58381,\n+    MIND_SEAR_DAMAGE_1              = 49821,\n+    SW_DEATH_BACKLASH               = 32409,\n+    WEAKENED_SOUL_DEBUFF            = 6788,\n+    SURGE_OF_LIGHT_BUFF             = 33151,\n+    SERENDIPITY_BUFF                = 63734,\n+    DIVINE_HYMN_HEAL                = 64844,\n+    PRAYER_OF_MENDING_AURA_1        = 41635,\n+    PRAYER_OF_MENDING_HEAL          = 33110,\n+    PENANCE_HEAL_1                  = 47750,\n+    IMPROVED_MIND_BLAST_DEBUFF      = 48301,//Mind Trauma\n+    HYMN_OF_HOPE_BUFF               = 64904,\n+\n+    SHADOWFIEND_1                   = 34433\n+};\n+\n+static const std::vector<uint32> Priest_spells_damage\n+{ DEVOURING_PLAGUE_1, HOLY_FIRE_1, MIND_BLAST_1, MIND_FLAY_1, MIND_SEAR_1, PENANCE_1, SMITE_1, SW_PAIN_1, SW_DEATH_1, VAMPIRIC_TOUCH_1 };\n+static const std::vector<uint32> Priest_spells_cc\n+{ PSYCHIC_HORROR_1, PSYCHIC_SCREAM_1, SHACKLE_UNDEAD_1, SILENCE_1 };\n+static const std::vector<uint32> Priest_spells_heal\n+{ RENEW_1, FLASH_HEAL_1, LESSER_HEAL_1, NORMAL_HEAL_1, GREATER_HEAL_1, PRAYER_OF_HEALING_1, PRAYER_OF_MENDING_1,\n+GUARDIAN_SPIRIT_1, PENANCE_1, DIVINE_HYMN_1, CIRCLE_OF_HEALING_1, DESPERATE_PRAYER_1 };\n+static const std::vector<uint32> Priest_spells_support\n+{ PW_FORTITUDE_1, DIVINE_SPIRIT_1, SHADOW_PROTECTION_1, ABOLISH_DISEASE_1, CURE_DISEASE_1,\n+DISPEL_MAGIC_1, MASS_DISPEL_1, DISPERSION_1, FADE_1, FEAR_WARD_1, HYMN_OF_HOPE_1, INNER_FIRE_1, INNER_FOCUS_1,\n+LEVITATE_1, PAIN_SUPPRESSION_1, POWER_INFUSION_1, PW_SHIELD_1, RESURRECTION_1, SHADOWFORM_1, VAMPIRIC_EMBRACE_1 };\n+\n+class priest_bot : public CreatureScript\n+{\n+public:\n+    priest_bot() : CreatureScript(\"priest_bot\") { }\n+\n+    CreatureAI* GetAI(Creature* creature) const override\n+    {\n+        return new priest_botAI(creature);\n+    }\n+/*\n+    bool OnGossipHello(Player* player, Creature* creature)\n+    {\n+        return creature->GetBotAI()->OnGossipHello(player, 0);\n+    }\n+\n+    bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action)\n+    {\n+        if (bot_ai* ai = creature->GetBotAI())\n+            return ai->OnGossipSelect(player, creature, sender, action);\n+        return true;\n+    }\n+\n+    bool OnGossipSelectCode(Player* player, Creature* creature, uint32 sender, uint32 action, char const* code)\n+    {\n+        if (bot_ai* ai = creature->GetBotAI())\n+            return ai->OnGossipSelectCode(player, creature, sender, action, code);\n+        return true;\n+    }\n+*/\n+    struct priest_botAI : public bot_ai\n+    {\n+        priest_botAI(Creature* creature) : bot_ai(creature)\n+        {\n+            _botclass = BOT_CLASS_PRIEST;\n+\n+            InitUnitFlags();\n+        }\n+\n+        bool doCast(Unit* victim, uint32 spellId)\n+        {\n+            if (CheckBotCast(victim, spellId) != SPELL_CAST_OK)\n+                return false;\n+            return bot_ai::doCast(victim, spellId);\n+        }\n+\n+        void CheckHymnOfHope(uint32 diff)\n+        {\n+            if (!IsSpellReady(HYMN_OF_HOPE_1, diff) || Rand() > 45 || IsCasting() || IsTank())\n+                return;\n+\n+            Group const* gr = !IAmFree() ? master->GetGroup() : GetGroup();\n+            if (!gr)\n+                return;\n+\n+            uint8 LMPcount = 0;\n+            for (Unit const* member : BotMgr::GetAllGroupMembers(gr))\n+            {\n+                if (me->GetMap() != member->FindMap() || !member->IsAlive() || !member->IsInCombat() ||\n+                    me->GetDistance(member) > 40 || GetManaPCT(member) > (HasRole(BOT_ROLE_HEAL) ? 10 : 50) ||\n+                    (member->IsNPCBot() && member->ToCreature()->IsTempBot()) ||\n+                    member->GetAuraEffect(SPELL_AURA_MOD_INCREASE_ENERGY, SPELLFAMILY_PRIEST, 0x0, 0x0, 0x10))\n+                    continue;\n+                if (++LMPcount > 2)\n+                    break;\n+            }\n+\n+            if (LMPcount > 2 && doCast(me, GetSpell(HYMN_OF_HOPE_1)))\n+                return;\n+        }\n+\n+        bool MassGroupHeal(uint32 diff)\n+        {\n+            if (!HasRole(BOT_ROLE_HEAL) || IsCasting() || Rand() > (65 + 40 * me->GetMap()->IsRaid()))\n+                return false;\n+\n+            Group const* gr = !IAmFree() ? master->GetGroup() : GetGroup();\n+            if (!gr)\n+                return false;\n+\n+            bool canHymn = IsSpellReady(DIVINE_HYMN_1, diff, false);\n+            bool canPray = !!GetSpell(PRAYER_OF_HEALING_1);\n+            bool canCirc = IsSpellReady(CIRCLE_OF_HEALING_1, diff, false);\n+\n+            uint8 LHPcount1, LHPcount2, LHPcount3;\n+            LHPcount1 = LHPcount2 = LHPcount3 = 0;\n+            uint8 lowestPCT = 100;\n+            Unit* castTarget = nullptr;\n+\n+            for (Unit* member : BotMgr::GetAllGroupMembers(gr))\n+            {\n+                if (me->GetMap() != member->FindMap() || !member->IsAlive() || !member->IsInCombat() ||\n+                    member->isPossessed() || member->IsCharmed() || (member->IsNPCBot() && member->ToCreature()->IsTempBot()) ||\n+                    member->GetAuraEffect(SPELL_AURA_MOD_INCREASE_ENERGY, SPELLFAMILY_PRIEST, 0x0, 0x0, 0x10))\n+                    continue;\n+\n+                float dist = me->GetDistance(member);\n+                uint8 pct = GetHealthPCT(member);\n+                if (canHymn && pct < std::min<uint32>(80, 50 + member->getAttackers().size()*10) && GetLostHP(member) > 4000 && dist < 40)\n+                {\n+                    if (++LHPcount1 > 2)\n+                        break;\n+                }\n+                if (canPray && pct < 65 && dist < 36)\n+                {\n+                    if (++LHPcount2 > 3)\n+                        break;\n+                }\n+                if (canCirc && pct < 85 && dist < 40 && (!castTarget || castTarget->GetDistance(member) < 18))\n+                {\n+                    if (++LHPcount3 > 1)\n+                        break;\n+                    if (pct < lowestPCT)\n+                    {\n+                        lowestPCT = pct;\n+                        castTarget = member;\n+                    }\n+                }\n+            }\n+\n+            if (LHPcount1 > 2 && doCast(me, GetSpell(DIVINE_HYMN_1)))\n+                return true;\n+            if (LHPcount2 > 3)\n+            {\n+                if (me->IsInCombat() && IsSpellReady(INNER_FOCUS_1, diff) && GetManaPCT(me) < 70 &&\n+                    doCast(me, GetSpell(INNER_FOCUS_1)))\n+                {}\n+                if (doCast(me, GetSpell(PRAYER_OF_HEALING_1)))\n+                    return true;\n+            }\n+            if (LHPcount3 > 1 && castTarget && doCast(castTarget, GetSpell(CIRCLE_OF_HEALING_1)))\n+                return true;\n+\n+            return false;\n+        }\n+\n+        bool ShieldGroup(uint32 diff)\n+        {\n+            if (!IsSpellReady(PW_SHIELD_1, false, diff) || IsCasting() || Rand() > 65 + 100 * (me->GetMap()->IsRaid()))\n+                return false;\n+            if (!IAmFree() && !(me->GetLevel() >= 30 && _spec == BOT_SPEC_PRIEST_DISCIPLINE) &&\n+                master->GetBotMgr()->HasBotWithSpec(BOT_SPEC_PRIEST_DISCIPLINE))\n+                return false;\n+\n+            Group const* gr = !IAmFree() ? master->GetGroup() : GetGroup();\n+            if (!gr)\n+            {\n+                Unit* u = master;\n+                if (u->IsAlive() && !u->getAttackers().empty() && (IsTank(u) || GetHealthPCT(u) < 75) && me->GetDistance(u) < 40 &&\n+                    ShieldTarget(u, diff))\n+                    return true;\n+                if (!IAmFree())\n+                {\n+                    for (auto const& [_, bot] : *master->GetBotMgr()->GetBotMap())\n+                    {\n+                        u = bot;\n+                        if (u->IsAlive() && !u->getAttackers().empty() && !u->ToCreature()->IsTempBot() &&\n+                            (IsTank(u) || GetHealthPCT(u) < 75) && me->GetDistance(u) < 40 &&\n+                            ShieldTarget(u, diff))\n+                            return true;\n+                    }\n+                    for (Unit* m : master->m_Controlled)\n+                    {\n+                        u = m;\n+                        if (!u || !u->IsPet() || me->GetMap() != u->FindMap())\n+                            continue;\n+                        if (u->IsAlive() && !u->getAttackers().empty() && (IsTank(u) || GetHealthPCT(u) < 75) && me->GetDistance(u) < 40 &&\n+                            ShieldTarget(u, diff))\n+                            return true;\n+                    }\n+                }\n+            }\n+            else\n+            {\n+                std::vector<Unit*> members = BotMgr::GetAllGroupMembers(gr);\n+                for (auto i : NPCBots::index_array<uint8, 2>)\n+                {\n+                    for (Unit* member : members)\n+                    {\n+                        if (!(i == 0 ? member->IsPlayer() : member->IsNPCBot()) || me->GetMap() != member->FindMap() ||\n+                            !member->IsAlive() || me->GetDistance(member) > 40 || member->isPossessed() || member->IsCharmed() ||\n+                            member->getAttackers().empty() || (!IsTank(member) && !IsFlagCarrier(member) && GetHealthPCT(member) > 75) ||\n+                            (member->IsNPCBot() && member->ToCreature()->IsTempBot()) ||\n+                            member->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_PALADIN, 0x0, 0x80000, 0x0))\n+                            continue;\n+                        if (ShieldTarget(member, diff))\n+                            return true;\n+                    }\n+                }\n+            }\n+            return false;\n+        }\n+\n+        bool ShieldTarget(Unit* target, uint32 diff)\n+        {\n+            if (!IsSpellReady(PW_SHIELD_1, diff) || IsCasting())\n+                return false;\n+            if (target->HasAuraTypeWithFamilyFlags(SPELL_AURA_MECHANIC_IMMUNITY, SPELLFAMILY_PRIEST, 0x20000000) ||\n+                target->HasAuraTypeWithFamilyFlags(SPELL_AURA_SCHOOL_ABSORB, SPELLFAMILY_PRIEST, 0x1))\n+                return false;\n+\n+            if (doCast(target, GetSpell(PW_SHIELD_1)))\n+                return true;\n+\n+            return false;\n+        }\n+\n+        void StartAttack(Unit* u, bool force = false)\n+        {\n+            if (!bot_ai::StartAttack(u, force))\n+                return;\n+            GetInPosition(force, u);\n+        }\n+\n+        void JustEnteredCombat(Unit* u) override { bot_ai::JustEnteredCombat(u); }\n+        void KilledUnit(Unit* u) override { bot_ai::KilledUnit(u); }\n+        void EnterEvadeMode(EvadeReason why = EVADE_REASON_OTHER) override { bot_ai::EnterEvadeMode(why); }\n+        void MoveInLineOfSight(Unit* u) override { bot_ai::MoveInLineOfSight(u); }\n+        void JustDied(Unit* u) override { UnsummonAll(false); bot_ai::JustDied(u); }\n+\n+        bool removeShapeshiftForm() override\n+        {\n+            ShapeshiftForm form = me->GetShapeshiftForm();\n+            if (form != FORM_NONE)\n+            {\n+                switch (form)\n+                {\n+                    case FORM_SHADOW:\n+                        me->RemoveAurasDueToSpell(SHADOWFORM_1);\n+                        break;\n+                    default:\n+                        break;\n+                }\n+            }\n+\n+            return true;\n+        }\n+\n+        void BreakCC(uint32 diff) override\n+        {\n+            //Improved Shadowform: Fade\n+            if (IsSpellReady(FADE_1, diff) && me->GetShapeshiftForm() == FORM_SHADOW && me->GetLevel() >= 45 &&\n+                Rand() < 35 && me->HasAuraWithMechanic((1u<<MECHANIC_SNARE)|(1u<<MECHANIC_ROOT)))\n+            {\n+                if (doCast(me, GetSpell(FADE_1)))\n+                    return;\n+            }\n+            bot_ai::BreakCC(diff);\n+        }\n+\n+        void UpdateAI(uint32 diff) override\n+        {\n+            if (!GlobalUpdate(diff))\n+                return;\n+\n+            DoVehicleActions(diff);\n+            if (!CanBotAttackOnVehicle())\n+                return;\n+\n+            Disperse(diff);\n+\n+            DoDevCheck(diff);\n+            DoShackCheck(diff);\n+\n+            if (IsPotionReady())\n+            {\n+                if (GetManaPCT(me) < 33)\n+                    DrinkPotion(true);\n+                else if (GetHealthPCT(me) < 50 && (!HasRole(BOT_ROLE_HEAL) || me->HasAuraType(SPELL_AURA_MOD_SILENCE)))\n+                    DrinkPotion(false);\n+            }\n+\n+            CheckRacials(diff);\n+\n+            doDefend(diff);\n+\n+            if (me->GetMap()->IsRaid())\n+            {\n+                CureGroup(GetSpell(DISPEL_MAGIC_1), diff);\n+                CureGroup(GetSpell(ABOLISH_DISEASE_1) ? GetSpell(ABOLISH_DISEASE_1) : GetSpell(CURE_DISEASE_1), diff);\n+                MassGroupHeal(diff);\n+                ShieldGroup(diff);\n+                CheckMending(diff);\n+                BuffAndHealGroup(diff);\n+            }\n+            else\n+            {\n+                MassGroupHeal(diff);\n+                ShieldGroup(diff);\n+                CheckMending(diff);\n+                BuffAndHealGroup(diff);\n+                CureGroup(GetSpell(DISPEL_MAGIC_1), diff);\n+                CureGroup(GetSpell(CURE_DISEASE_1), diff);\n+            }\n+\n+            if (master->IsInCombat() || me->IsInCombat())\n+            {\n+                CheckSilence(diff);\n+                CheckDispel(diff);\n+                CheckHymnOfHope(diff);\n+            }\n+\n+            Counter(diff);\n+\n+            if (me->IsInCombat())\n+            {\n+                CheckShackles(diff);\n+                CheckPowerInfusion(diff);\n+            }\n+            else\n+                DoNonCombatActions(diff);\n+\n+            if (IsCasting())\n+                return;\n+\n+            if (IsSpellReady(SHADOWFORM_1, diff) && HasRole(BOT_ROLE_DPS) && !HasRole(BOT_ROLE_HEAL))\n+            {\n+                if (doCast(me, SHADOWFORM_1))\n+                    return;\n+            }\n+\n+            if (ProcessImmediateNonAttackTarget())\n+                return;\n+\n+            if (!CheckAttackTarget())\n+                return;\n+\n+            CheckUsableItems(diff);\n+\n+            Attack(diff);\n+        }\n+\n+        void Attack(uint32 diff)\n+        {\n+            Unit* mytar = opponent ? opponent : disttarget ? disttarget : nullptr;\n+            if (!mytar)\n+                return;\n+\n+            StartAttack(mytar, IsMelee());\n+\n+            CheckAttackState();\n+            if (!me->IsAlive() || !mytar->IsAlive())\n+                return;\n+\n+            MoveBehind(mytar);\n+\n+            if (GC_Timer > diff)\n+                return;\n+\n+            //shadow skills range\n+            if (me->GetDistance(mytar) > CalcSpellMaxRange(MIND_FLAY_1))\n+                return;\n+\n+            auto [can_do_shadow, can_do_holy] = CanAffectVictimBools(mytar, SPELL_SCHOOL_SHADOW, SPELL_SCHOOL_HOLY);\n+\n+            if (IsSpellReady(PSYCHIC_HORROR_1, diff) && can_do_shadow && Rand() < 20 &&\n+                mytar->GetHealth() > me->GetMaxHealth()/8 && !CCed(mytar) &&\n+                !mytar->HasAuraType(SPELL_AURA_MOD_DISARM) &&\n+                (mytar->IsPlayer() ?\n+                mytar->ToPlayer()->GetWeaponForAttack(BASE_ATTACK) && mytar->ToPlayer()->IsUseEquipedWeapon(true) :\n+                mytar->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID) && mytar->CanUseAttackType(BASE_ATTACK)))\n+            {\n+                if (doCast(mytar, GetSpell(PSYCHIC_HORROR_1)))\n+                    return;\n+            }\n+\n+            //spell reflections\n+            if (IsSpellReady(SW_PAIN_1, diff) && can_do_shadow && CanRemoveReflectSpells(mytar, SW_PAIN_1) &&\n+                doCast(mytar, SW_PAIN_1)) //yes, using rank 1\n+                return;\n+\n+            if (!HasRole(BOT_ROLE_DPS))\n+                return;\n+\n+            if (IsSpellReady(SHADOWFIEND_1, diff) && GetManaPCT(me) < 50)\n+            {\n+                SummonBotPet(mytar);\n+                SetSpellCooldown(SHADOWFIEND_1, 180000); // (5 - 2) min with Veiled Shadows\n+            }\n+\n+            if (!HasRole(BOT_ROLE_HEAL) || GetManaPCT(me) > 35 || botPet)\n+            {\n+                if (IsSpellReady(SW_DEATH_1, diff) && can_do_shadow && Rand() < 90 && GetHealthPCT(me) > 50 &&\n+                    (me->GetMap()->IsRaid() || GetHealthPCT(mytar) < 15 || mytar->GetHealth() < me->GetMaxHealth()/8) &&\n+                    doCast(mytar, GetSpell(SW_DEATH_1)))\n+                    return;\n+                if (IsSpellReady(VAMPIRIC_TOUCH_1, diff) && can_do_shadow && Rand() < 80 &&\n+                    mytar->GetHealth() > me->GetMaxHealth()/4 * (1 + mytar->getAttackers().size()) &&\n+                    !mytar->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_PRIEST, 0x0, 0x400, 0x0, me->GetGUID()) &&\n+                    doCast(mytar, GetSpell(VAMPIRIC_TOUCH_1)))\n+                    return;\n+                if (IsSpellReady(SW_PAIN_1, diff) && can_do_shadow && Rand() < 100 &&\n+                    mytar->GetHealth() > me->GetMaxHealth()/2 * (1 + mytar->getAttackers().size()) &&\n+                    !mytar->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_PRIEST, 0x8000, 0x0, 0x0, me->GetGUID()))\n+                {\n+                    AuraEffect const* weav = me->GetAuraEffect(SPELL_AURA_MOD_DAMAGE_PERCENT_DONE, SPELLFAMILY_PRIEST, 0x0, 0x8, 0x0);\n+                    if (me->GetLevel() < 60 || (weav && weav->GetBase()->GetStackAmount() >= 4))\n+                        if (doCast(mytar, GetSpell(SW_PAIN_1)))\n+                            return;\n+                }\n+                if (IsSpellReady(DEVOURING_PLAGUE_1, diff) && can_do_shadow && !Devcheck && Rand() < 100 &&\n+                    (GetSpec() == BOT_SPEC_PRIEST_SHADOW || mytar->IsControlledByPlayer()) &&\n+                    mytar->GetHealth() > me->GetMaxHealth()/2 * (1 + mytar->getAttackers().size()) &&\n+                    !(mytar->IsCreature() && (mytar->ToCreature()->GetCreatureTemplate()->MechanicImmuneMask & (1u<<(MECHANIC_INFECTED-1)))) &&\n+                    !mytar->GetAuraEffect(SPELL_AURA_PERIODIC_LEECH, SPELLFAMILY_PRIEST, 0x02000000, 0x0, 0x0, me->GetGUID()) &&\n+                    doCast(mytar, GetSpell(DEVOURING_PLAGUE_1)))\n+                    return;\n+                if (IsSpellReady(MIND_BLAST_1, diff) && can_do_shadow &&\n+                    doCast(mytar, GetSpell(MIND_BLAST_1)))\n+                    return;\n+                if (IsSpellReady(MIND_SEAR_1, diff) && can_do_shadow && (!me->isMoving() || Rand() < 80) &&\n+                    mytar->GetVictim() && mytar->GetVictim()->getAttackers().size() > 3)\n+                {\n+                    if (Unit* u = FindSplashTarget(CalcSpellMaxRange(MIND_SEAR_1), mytar, 14.f, 3)) //glyphed, cluster of 4\n+                        if (doCast(u, GetSpell(MIND_SEAR_1)))\n+                            return;\n+                }\n+                if (IsSpellReady(HOLY_FIRE_1, diff) && can_do_holy &&\n+                    (HasRole(BOT_ROLE_HEAL) || me->GetShapeshiftForm() != FORM_SHADOW) &&\n+                    doCast(mytar, GetSpell(HOLY_FIRE_1)))\n+                    return;\n+                if (IsSpellReady(MIND_FLAY_1, diff) && can_do_shadow &&\n+                    (!HasRole(BOT_ROLE_HEAL) || mytar->GetHealth() < me->GetMaxHealth()/2) &&\n+                    doCast(mytar, GetSpell(MIND_FLAY_1)))\n+                    return;\n+                if (IsSpellReady(SMITE_1, diff) && can_do_holy && me->GetLevel() < 20 &&//MF is lvl 20, MB is lvl 10\n+                    doCast(mytar, GetSpell(SMITE_1)))\n+                    return;\n+            }\n+\n+            if (Spell const* shot = me->GetCurrentSpell(CURRENT_AUTOREPEAT_SPELL))\n+            {\n+                if (shot->GetSpellInfo()->Id == SHOOT_WAND && shot->m_targets.GetUnitTarget() != mytar)\n+                    me->InterruptSpell(CURRENT_AUTOREPEAT_SPELL);\n+            }\n+            else if (IsSpellReady(SHOOT_WAND, diff) && !me->isMoving() && me->GetDistance(mytar) < 30 && GetEquips(BOT_SLOT_RANGED) &&\n+                doCast(mytar, SHOOT_WAND))\n+                return;\n+        }\n+\n+        bool HealTarget(Unit* target, uint32 diff) override\n+        {\n+            if (!target || !target->IsAlive() || target->GetShapeshiftForm() == FORM_SPIRITOFREDEMPTION || me->GetDistance(target) > 40)\n+                return false;\n+\n+            uint8 hp = GetHealthPCT(target);\n+            if (hp > GetHealHpPctThreshold())\n+                return false;\n+            bool pointed = IsPointedHealTarget(target);\n+            if (hp > 90 && !(pointed && me->GetMap()->IsRaid()) &&\n+                (!target->IsInCombat() || target->getAttackers().empty() || !IsTank(target) || !me->GetMap()->IsRaid()))\n+                return false;\n+\n+            int32 hps = GetHPS(target);\n+            int32 xphp = target->GetHealth() + hps * (me->GetLevel() < 60 ? 2.5f : 2.0f);\n+            int32 hppctps = int32(hps * 100.f / float(target->GetMaxHealth()));\n+            int32 xphploss = xphp > int32(target->GetMaxHealth()) ? 0 : abs(int32(xphp - target->GetMaxHealth()));\n+            int32 xppct = hp + hppctps * (me->GetLevel() < 60 ? 2.5f : 2.0f);\n+            //BOT_LOG_ERROR(\"entities.player\", \"priest_bot:HealTarget(): {}'s pct {}, hppctps {}, epct {}\",\n+            //    target->GetName(), uint32(hp), int32(hppctps), int32(xppct));\n+            if (xppct >= 95 && hp >= 25 && !pointed)\n+                return false;\n+\n+            //GUARDIAN SPIRIT no GCD\n+            if (IsSpellReady(GUARDIAN_SPIRIT_1, diff, false) && !IAmFree() && target->IsInCombat() && !target->getAttackers().empty() &&\n+                (xppct <= 0 || (hp <= 50 && hppctps <= -15) ||\n+                (me->GetMap()->Instanceable() && target->GetMaxHealth() > me->GetMaxHealth() << 5)) &&\n+                !target->HasAuraTypeWithFamilyFlags(SPELL_AURA_MOD_HEALING_PCT, SPELLFAMILY_PRIEST, 0x40000000))\n+            {\n+                me->InterruptNonMeleeSpells(false);\n+                if (doCast(target, GetSpell(GUARDIAN_SPIRIT_1)))\n+                {\n+                    if (target->IsPlayer())\n+                        ReportSpellCast(GUARDIAN_SPIRIT_1, LocalizedNpcText(target->ToPlayer(), BOT_TEXT__ON_YOU), target->ToPlayer());\n+\n+                    if (!IAmFree() && target != master)\n+                    {\n+                        std::string msg = target == me ? LocalizedNpcText(master, BOT_TEXT__ON_MYSELF) : (LocalizedNpcText(master, BOT_TEXT__ON_) + target->GetName() + '!');\n+                        ReportSpellCast(GUARDIAN_SPIRIT_1, msg, master);\n+                    }\n+                    //return true;\n+                }\n+            }\n+\n+            //PAIN SUPPRESSION\n+            if (IsSpellReady(PAIN_SUPPRESSION_1, diff, false) && xppct >= 5 && hp >= 25 && hp <= 55 && hppctps <= -10 &&\n+                Rand() < 80 && !target->getAttackers().empty() &&\n+                !target->HasAuraTypeWithFamilyFlags(SPELL_AURA_MOD_DISPEL_RESIST, SPELLFAMILY_PRIEST, 0x80000000) &&\n+                !target->HasAuraTypeWithFamilyFlags(SPELL_AURA_MOD_HEALING_PCT, SPELLFAMILY_PRIEST, 0x40000000))\n+            {\n+                me->InterruptNonMeleeSpells(false);\n+                if (doCast(target, GetSpell(PAIN_SUPPRESSION_1)))\n+                {\n+                    if (target->IsPlayer())\n+                        ReportSpellCast(PAIN_SUPPRESSION_1, LocalizedNpcText(target->ToPlayer(), BOT_TEXT__ON_YOU), target->ToPlayer());\n+\n+                    if (!IAmFree() && target != master)\n+                    {\n+                        std::string msg = target == me ? LocalizedNpcText(master, BOT_TEXT__ON_MYSELF) : (LocalizedNpcText(master, BOT_TEXT__ON_) + target->GetName() + '!');\n+                        ReportSpellCast(PAIN_SUPPRESSION_1, msg, master);\n+                    }\n+                    return true;\n+                }\n+            }\n+\n+            if (target == me && IsSpellReady(DESPERATE_PRAYER_1, diff) && hp <= 50 && Rand() < 45 &&\n+                int32(GetLostHP(me)) > _heals[DESPERATE_PRAYER_1])\n+            {\n+                me->InterruptNonMeleeSpells(false);\n+                if (doCast(target, GetSpell(DESPERATE_PRAYER_1)))\n+                    return true;\n+            }\n+\n+            if (IsCasting())\n+                return false;\n+\n+            Unit const* u = target->GetVictim();\n+            bool tanking = u && IsTank(target) && u->IsCreature() && u->ToCreature()->isWorldBoss();\n+\n+            //Penance\n+            if (IsSpellReady(PENANCE_1, diff) && !target->IsCharmed() && !target->isPossessed() && hp <= 80 &&\n+                Rand() < 90 && xphploss > _heals[PENANCE_1])\n+            {\n+                if (doCast(target, GetSpell(PENANCE_1)))\n+                    return true;\n+            }\n+            //Big Heal\n+            if (IsSpellReady(HEAL, diff) && (xppct > 15 || !GetSpell(FLASH_HEAL_1)) && (tanking || xphploss > _heals[HEAL]))\n+            {\n+                if (me->IsInCombat() && IsSpellReady(INNER_FOCUS_1, diff) && GetManaPCT(me) < 70 &&\n+                    doCast(me, GetSpell(INNER_FOCUS_1)))\n+                {}\n+                if (doCast(target, GetSpell(HEAL)))\n+                    return true;\n+            }\n+            //Renew\n+            if (IsSpellReady(RENEW_1, diff) && (tanking || !target->getAttackers().empty() || me->GetMap()->IsDungeon()) &&\n+                !target->GetAuraEffect(SPELL_AURA_PERIODIC_HEAL, SPELLFAMILY_PRIEST, 0x40, 0x0, 0x0, me->GetGUID())\n+                /*!target->HasAura(GetSpell(RENEW_1), me->GetGUID())*/)\n+            {\n+                if (doCast(target, GetSpell(RENEW_1)))\n+                    return true;\n+            }\n+            //Flash Heal\n+            if (IsSpellReady(FLASH_HEAL_1, diff) && xphploss > _heals[FLASH_HEAL_1])\n+            {\n+                if (doCast(target, GetSpell(FLASH_HEAL_1)))\n+                    return true;\n+            }\n+\n+            return false;\n+        }\n+\n+        bool BuffTarget(Unit* target, uint32 diff) override\n+        {\n+            if (IsSpellReady(FEAR_WARD_1, diff) && (!IAmFree() || target == me) &&\n+                !target->HasAuraTypeWithMiscvalue(SPELL_AURA_MECHANIC_IMMUNITY, MECHANIC_FEAR) &&\n+                doCast(target, GetSpell(FEAR_WARD_1)))\n+                return true;\n+\n+            if (target == me)\n+            {\n+                if (GetSpell(INNER_FIRE_1) &&\n+                    !me->HasAuraTypeWithFamilyFlags(SPELL_AURA_MOD_RESISTANCE, SPELLFAMILY_PRIEST, 0x2) &&\n+                    doCast(me, GetSpell(INNER_FIRE_1)))\n+                    return true;\n+                if (HasRole(BOT_ROLE_DPS) && GetSpell(VAMPIRIC_EMBRACE_1) &&\n+                    !me->HasAuraTypeWithFamilyFlags(SPELL_AURA_DUMMY, SPELLFAMILY_PRIEST, 0x4) &&\n+                    doCast(me, GetSpell(VAMPIRIC_EMBRACE_1)))\n+                    return true;\n+            }\n+\n+            if (me->IsInCombat() && !master->GetMap()->IsRaid())\n+                return false;\n+\n+            if (uint32 PW_FORTITUDE = GetSpell(PW_FORTITUDE_1))\n+            {\n+                if (!target->HasAuraTypeWithFamilyFlags(SPELL_AURA_MOD_STAT, SPELLFAMILY_PRIEST, 0x8) &&\n+                    doCast(target, PW_FORTITUDE))\n+                    return true;\n+            }\n+            if (uint32 SHADOW_PROTECTION = GetSpell(SHADOW_PROTECTION_1))\n+            {\n+                if (!target->HasAuraTypeWithFamilyFlags(SPELL_AURA_MOD_RESISTANCE_EXCLUSIVE, SPELLFAMILY_PRIEST, 0x100) &&\n+                    doCast(target, SHADOW_PROTECTION))\n+                    return true;\n+            }\n+            if (uint32 DIVINE_SPIRIT = GetSpell(DIVINE_SPIRIT_1))\n+            {\n+                if ((target->GetMaxPower(POWER_MANA) > 1) &&\n+                    !target->HasAuraTypeWithFamilyFlags(SPELL_AURA_MOD_STAT, SPELLFAMILY_PRIEST, 0x20) &&\n+                    doCast(target, DIVINE_SPIRIT))\n+                    return true;\n+            }\n+\n+            return false;\n+        }\n+\n+        void DoNonCombatActions(uint32 diff)\n+        {\n+            if (GC_Timer > diff || me->IsMounted() || IsCasting())\n+                return;\n+\n+            ResurrectGroup(GetSpell(RESURRECTION_1));\n+\n+            if (GetSpell(LEVITATE_1) && !IAmFree() && Rand() < 30)\n+            {\n+                Group const* gr = master->GetGroup();\n+                if (gr)\n+                {\n+                    for (GroupReference const* ref = gr->GetFirstMember(); ref != nullptr; ref = ref->next())\n+                    {\n+                        Player* pl = ref->GetSource();\n+                        if (pl && pl->IsAlive() && pl->FindMap() == me->GetMap() && pl->GetDistance(me) < 30 &&\n+                            pl->IsFalling() && pl->m_movementInfo.fallTime > 1000 &&\n+                            !pl->HasAuraType(SPELL_AURA_HOVER))\n+                        {\n+                            if (doCast(pl, GetSpell(LEVITATE_1)))\n+                                return;\n+                        }\n+                    }\n+                }\n+                else if (master->IsAlive() && master->GetDistance(me) < 30 && master->IsFalling() &&\n+                    master->m_movementInfo.fallTime > 1000 && !master->HasAuraType(SPELL_AURA_HOVER))\n+                {\n+                    if (doCast(master, GetSpell(LEVITATE_1)))\n+                        return;\n+                }\n+            }\n+        }\n+\n+        void Counter(uint32 diff)\n+        {\n+            if (ShackcheckTimer > diff || !IsSpellReady(SHACKLE_UNDEAD_1, diff) || Shackcheck || Rand() > 65 ||\n+                (HasRole(BOT_ROLE_HEAL) && (IsCasting() || GetManaPCT(me) < 20)))\n+                return;\n+\n+            //always glyphed so <= 0.5 sec cast time\n+            if (Unit* target = FindCastingTarget(CalcSpellMaxRange(SHACKLE_UNDEAD_1), 0, SHACKLE_UNDEAD_1))\n+            {\n+                me->InterruptNonMeleeSpells(false);\n+                if (doCast(target, GetSpell(SHACKLE_UNDEAD_1)))\n+                    return;\n+            }\n+        }\n+\n+        void CheckDispel(uint32 diff)\n+        {\n+            if (HasRole(BOT_ROLE_HEAL) && !HasRole(BOT_ROLE_DPS))\n+                return;\n+\n+            if (DispelcheckTimer > diff || IsCasting() || Rand() > 35)\n+                return;\n+\n+            DispelcheckTimer = urand(750, 1000);\n+\n+            uint32 DM = GetSpell(DISPEL_MAGIC_1);\n+            uint32 MD = (GetSpec() == BOT_SPEC_PRIEST_DISCIPLINE) ? GetSpell(MASS_DISPEL_1) : 0;\n+\n+            if (!DM && !MD)\n+                return;\n+\n+            if (Unit* target = FindHostileDispelTarget(CalcSpellMaxRange(DISPEL_MAGIC_1)))\n+            {\n+                uint32 dm = DM && !target->HasAuraWithMechanic(1u<<MECHANIC_IMMUNE_SHIELD) ? DM : MD;\n+                if (dm && doCast(target, dm))\n+                    return;\n+            }\n+        }\n+\n+        void CheckMending(uint32 diff)\n+        {\n+            if (Mend_Timer > diff || !IsSpellReady(PRAYER_OF_MENDING_1, diff) || !HasRole(BOT_ROLE_HEAL) || IsCasting() || Rand() > 75)\n+                return;\n+\n+            Mend_Timer = urand(1000, 3000);\n+\n+            Group const* gr = !IAmFree() ? master->GetGroup() : GetGroup();\n+            if (!gr)\n+                return;\n+\n+            uint32 MENDING_AURA = InitSpell(me, PRAYER_OF_MENDING_AURA_1);\n+            if (FindAffectedTarget(MENDING_AURA, me->GetGUID(), 70, 4))\n+                return;\n+\n+            for (Unit* member : BotMgr::GetAllGroupMembers(gr))\n+            {\n+                if (me->GetMap() == member->FindMap() && member->IsAlive() && !member->getAttackers().empty() &&\n+                    (IsTank(member) || GetBG()) && GetHealthPCT(member) < 85 && me->IsWithinDistInMap(member, 40) &&\n+                    !member->HasAuraType(SPELL_AURA_RAID_PROC_FROM_CHARGE_WITH_VALUE))\n+                {\n+                    if (doCast(member, GetSpell(PRAYER_OF_MENDING_1)))\n+                        return;\n+                }\n+            }\n+        }\n+\n+        void CheckShackles(uint32 diff)\n+        {\n+            if (Shackle_Timer > diff || !IsSpellReady(SHACKLE_UNDEAD_1, diff) || IsCasting() || Rand() > 50)\n+                return;\n+\n+            Shackle_Timer = 500;\n+\n+            if (FindAffectedTarget(GetSpell(SHACKLE_UNDEAD_1), me->GetGUID(), 60, 255))\n+                return;\n+            Unit* target = FindUndeadCCTarget(CalcSpellMaxRange(SHACKLE_UNDEAD_1), SHACKLE_UNDEAD_1);\n+            if (target && doCast(target, GetSpell(SHACKLE_UNDEAD_1)))\n+            {}\n+        }\n+\n+        void CheckSilence(uint32 diff)\n+        {\n+            if (IsCasting() || Rand() > 40)\n+                return;\n+\n+            if (IsSpellReady(SILENCE_1, diff, false))\n+            {\n+                if (Unit* target = FindCastingTarget(CalcSpellMaxRange(SILENCE_1), 0, SILENCE_1))\n+                    if (doCast(target, GetSpell(SILENCE_1)))\n+                        return;\n+            }\n+            if (IsSpellReady(PSYCHIC_HORROR_1, diff))\n+            {\n+                if (Unit* target = FindCastingTarget(CalcSpellMaxRange(PSYCHIC_HORROR_1), 0, PSYCHIC_HORROR_1))\n+                    if (doCast(target, GetSpell(PSYCHIC_HORROR_1)))\n+                        return;\n+            }\n+        }\n+\n+        void CheckPowerInfusion(uint32 diff)\n+        {\n+            if (!IsSpellReady(POWER_INFUSION_1, diff, false) || IsCasting() || Rand() > 25)\n+                return;\n+\n+            if (IAmFree())\n+            {\n+                if (me->GetVictim() && GetManaPCT(me) < 95 &&\n+                    doCast(me, GetSpell(POWER_INFUSION_1)))\n+                    return;\n+\n+                return;\n+            }\n+\n+            Group const* gr = master->GetGroup();\n+            Unit* u = nullptr;\n+            if (!gr)\n+            {\n+                u = master;\n+                if (u->IsAlive() && u->IsInWorld() && u->GetPowerType() == POWER_MANA && u->GetVictim() && !IsTank(u) &&\n+                    GetManaPCT(u) < 70 && me->IsWithinDistInMap(u, 30) &&\n+                    !u->HasAuraTypeWithFamilyFlags(SPELL_AURA_MOD_CASTING_SPEED_NOT_STACK, SPELLFAMILY_PRIEST, 0x80000000) &&\n+                    doCast(u, GetSpell(POWER_INFUSION_1)))\n+                    return;\n+\n+                for (auto const& [_, bot] : *master->GetBotMgr()->GetBotMap())\n+                {\n+                    u = bot;\n+                    if (u->IsAlive() && u->IsInWorld() && u->ToCreature()->GetBotAI()->HasRole(BOT_ROLE_HEAL) &&\n+                        u->ToCreature()->GetBotClass() < BOT_CLASS_EX_START &&\n+                        GetManaPCT(u) < 70 && me->IsWithinDistInMap(u, 30) &&\n+                        !u->HasAuraTypeWithFamilyFlags(SPELL_AURA_MOD_CASTING_SPEED_NOT_STACK, SPELLFAMILY_PRIEST, 0x80000000) &&\n+                        doCast(u, GetSpell(POWER_INFUSION_1)))\n+                        return;\n+                }\n+                for (auto const& [_, bot] : *master->GetBotMgr()->GetBotMap())\n+                {\n+                    u = bot;\n+                    if (u->IsAlive() && u->IsInWorld() && u->GetPowerType() == POWER_MANA && u->GetVictim() && !IsTank(u) &&\n+                        u->ToCreature()->GetBotClass() < BOT_CLASS_EX_START &&\n+                        GetManaPCT(u) < 70 && me->IsWithinDistInMap(u, 30) &&\n+                        !u->HasAuraTypeWithFamilyFlags(SPELL_AURA_MOD_CASTING_SPEED_NOT_STACK, SPELLFAMILY_PRIEST, 0x80000000) &&\n+                        doCast(u, GetSpell(POWER_INFUSION_1)))\n+                        return;\n+                }\n+\n+                return;\n+            }\n+\n+            for (GroupReference const* itr = gr->GetFirstMember(); itr != nullptr; itr = itr->next())\n+            {\n+                u = itr->GetSource();\n+                if (u && u->IsAlive() && u->IsInWorld() && u->GetPowerType() == POWER_MANA && u->GetVictim() && !IsTank(u) &&\n+                    GetManaPCT(u) < 70 && me->IsWithinDistInMap(u, 30) &&\n+                    !u->HasAuraTypeWithFamilyFlags(SPELL_AURA_MOD_CASTING_SPEED_NOT_STACK, SPELLFAMILY_PRIEST, 0x80000000) &&\n+                    doCast(u, GetSpell(POWER_INFUSION_1)))\n+                    return;\n+            }\n+            for (GroupReference const* itr = gr->GetFirstMember(); itr != nullptr; itr = itr->next())\n+            {\n+                Player const* player = itr->GetSource();\n+                if (!player || !player->IsInWorld() || me->GetMap() != player->FindMap() || !player->HaveBot())\n+                    continue;\n+                for (auto const& [_, bot] : *player->GetBotMgr()->GetBotMap())\n+                {\n+                    u = bot;\n+                    if (u->IsAlive() && u->IsInWorld() && u->ToCreature()->GetBotAI()->HasRole(BOT_ROLE_HEAL) &&\n+                        !IsHeroExClass(u->ToCreature()->GetBotClass()) &&\n+                        GetManaPCT(u) < 70 && me->IsWithinDistInMap(u, 30) &&\n+                        !u->HasAuraTypeWithFamilyFlags(SPELL_AURA_MOD_CASTING_SPEED_NOT_STACK, SPELLFAMILY_PRIEST, 0x80000000) &&\n+                        doCast(u, GetSpell(POWER_INFUSION_1)))\n+                        return;\n+                }\n+            }\n+            for (GroupReference const* itr = gr->GetFirstMember(); itr != nullptr; itr = itr->next())\n+            {\n+                Player const* player = itr->GetSource();\n+                if (!player || !player->IsInWorld() || me->GetMap() != player->FindMap() || !player->HaveBot())\n+                    continue;\n+                for (auto const& [_, bot] : *player->GetBotMgr()->GetBotMap())\n+                {\n+                    u = bot;\n+                    if (u->IsAlive() && u->IsInWorld() && u->GetPowerType() == POWER_MANA && u->GetVictim() && !IsTank(u) &&\n+                        u->ToCreature()->GetBotClass() < BOT_CLASS_EX_START &&\n+                        GetManaPCT(u) < 70 && me->IsWithinDistInMap(u, 30) &&\n+                        !u->HasAuraTypeWithFamilyFlags(SPELL_AURA_MOD_CASTING_SPEED_NOT_STACK, SPELLFAMILY_PRIEST, 0x80000000) &&\n+                        doCast(u, GetSpell(POWER_INFUSION_1)))\n+                        return;\n+                }\n+            }\n+\n+            SetSpellCooldown(POWER_INFUSION_1, 1500); //fail\n+        }\n+\n+        void doDefend(uint32 diff)\n+        {\n+            if (Rand() > 50) return;\n+\n+            Unit::AttackerSet const& m_attackers = master->getAttackers();\n+            Unit::AttackerSet const& b_attackers = me->getAttackers();\n+\n+            //fear master's attackers\n+            if (IsSpellReady(PSYCHIC_SCREAM_1, diff))\n+            {\n+                if (!m_attackers.empty() && (!IsTank(master) || GetHealthPCT(master) < 75))\n+                {\n+                    uint8 tCount = 0;\n+                    for (Unit const* attacker : m_attackers)\n+                    {\n+                        if (!attacker) continue;\n+                        if (attacker->ToCreature() && attacker->GetCreatureType() == CREATURE_TYPE_UNDEAD) continue;\n+                        if (me->GetExactDistSq(attacker) > 7*7) continue;\n+                        if (CCed(attacker) && me->GetExactDistSq(attacker) > 5*5) continue;\n+                        if (me->IsValidAttackTarget(attacker))\n+                            ++tCount;\n+                    }\n+                    if (tCount > 1 && doCast(me, GetSpell(PSYCHIC_SCREAM_1)))\n+                        return;\n+                }\n+\n+                // Defend myself (psychic horror)\n+                if (!b_attackers.empty())\n+                {\n+                    uint8 tCount = 0;\n+                    for (Unit const* attacker : b_attackers)\n+                    {\n+                        if (!attacker) continue;\n+                        if (attacker->ToCreature() && attacker->GetCreatureType() == CREATURE_TYPE_UNDEAD) continue;\n+                        if (me->GetExactDistSq(attacker) > 7*7) continue;\n+                        if (CCed(attacker) && me->GetExactDistSq(attacker) > 5*5) continue;\n+                        if (me->IsValidAttackTarget(attacker))\n+                            ++tCount;\n+                    }\n+                    if (tCount > 0 && doCast(me, GetSpell(PSYCHIC_SCREAM_1)))\n+                        return;\n+                }\n+            }\n+            // Heal myself\n+            if ((GetHealthPCT(me) < 95 && !b_attackers.empty()) || (IsWanderer() && IsFlagCarrier(me)))\n+            {\n+                if (ShieldTarget(me, diff)) return;\n+\n+                if (IsSpellReady(FADE_1, diff) && me->IsInCombat() && !b_attackers.empty())\n+                {\n+                    uint8 Tattackers = 0;\n+                    for (Unit const* attacker : b_attackers)\n+                    {\n+                        if (!attacker) continue;\n+                        if (!attacker->IsAlive()) continue;\n+                        if (!(attacker)->CanHaveThreatList()) continue;\n+                        if (me->GetExactDistSq((attacker)) < 15*15)\n+                            Tattackers++;\n+                    }\n+                    if (Tattackers > 0)\n+                    {\n+                        if (doCast(me, GetSpell(FADE_1)))\n+                            return;\n+                    }\n+                }\n+            }\n+        }\n+\n+        void DoDevCheck(uint32 diff)\n+        {\n+            if (DevcheckTimer <= diff)\n+            {\n+                DevcheckTimer = 1000;\n+                Devcheck = GetSpell(DEVOURING_PLAGUE_1) && FindAffectedTarget(GetSpell(DEVOURING_PLAGUE_1), me->GetGUID(), 70);\n+            }\n+        }\n+\n+        void DoShackCheck(uint32 diff)\n+        {\n+            if (ShackcheckTimer <= diff)\n+            {\n+                ShackcheckTimer = 1000;\n+                Shackcheck = GetSpell(SHACKLE_UNDEAD_1) && FindAffectedTarget(GetSpell(SHACKLE_UNDEAD_1), me->GetGUID(), 70);\n+            }\n+        }\n+\n+        void Disperse(uint32 diff)\n+        {\n+            if (me->GetVehicle())\n+                return;\n+            if (!IsSpellReady(DISPERSION_1, diff) || !me->IsInCombat() || HasRole(BOT_ROLE_HEAL) || IsCasting() || Rand() > 60)\n+                return;\n+            if ((me->getAttackers().size() > 3 && !IsSpellReady(FADE_1, diff, false) && GetHealthPCT(me) < 90) ||\n+                (GetHealthPCT(me) < 20 && (me->HasAuraType(SPELL_AURA_PERIODIC_DAMAGE) || !me->getAttackers().empty())) ||\n+                (GetManaPCT(me) < 35 && !IsPotionReady()) ||\n+                (me->getAttackers().size() > 1 && (CCed(me, true) || me->HasAuraWithMechanic(1u<<MECHANIC_SNARE))))\n+            {\n+                if (doCast(me, GetSpell(DISPERSION_1)))\n+                    return;\n+            }\n+\n+            SetSpellCooldown(DISPERSION_1, 500); //fail\n+        }\n+\n+        void ApplyClassSpellCritMultiplierAll(Unit const* victim, float& crit_chance, SpellInfo const* spellInfo, SpellSchoolMask schoolMask, WeaponAttackType /*attackType*/) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+\n+            //Inner Focus\n+            if (AuraEffect const* focu = me->GetAuraEffect(INNER_FOCUS_1, 0))\n+                if (focu->IsAffectingSpell(spellInfo))\n+                    crit_chance += 25.f;\n+\n+            //Benediction (23236)\n+            if (lvl >= 60 && (schoolMask & SPELL_SCHOOL_MASK_HOLY))\n+                crit_chance += 2.f;\n+            //Increased Prayer of Healing Criticals (23550): 25% additional critical chance for Prayer of Healing\n+            if (lvl >= 60 && baseId == PRAYER_OF_HEALING_1)\n+                crit_chance += 25.f;\n+            //Item - Priest T9 Shadow 4P Bonus (67198)\n+            if (lvl >= 80 && baseId == MIND_FLAY_DAMAGE)\n+                crit_chance += 5.f;\n+\n+            //Holy Specialization: 5% additional critical chance for Holy spells\n+            if (lvl >= 10 && (schoolMask & SPELL_SCHOOL_MASK_HOLY))\n+                crit_chance += 5.f;\n+            //Mind Melt (part 1): 4% additional critical chance for Mind Blast, Mind Flay and Mind Sear\n+            if ((GetSpec() == BOT_SPEC_PRIEST_SHADOW) &&\n+                lvl >= 35 && ((spellInfo->SpellFamilyFlags[0] & 0x802000) || (spellInfo->SpellFamilyFlags[1] & 0x80000)))\n+                crit_chance += 4.f;\n+            //Mind Melt (part 2): 6% additional critical chance for Vampiric Touch, Devouring Plague and SW: Pain\n+            if ((GetSpec() == BOT_SPEC_PRIEST_SHADOW) &&\n+                lvl >= 35 && ((spellInfo->SpellFamilyFlags[0] & 0x2008000) || (spellInfo->SpellFamilyFlags[1] & 0x400)))\n+                crit_chance += 6.f;\n+            //Improved Flash Heal (part 2): 10% additional critical chance on targets at or below 50% hp for Flash Heal\n+            if ((GetSpec() == BOT_SPEC_PRIEST_DISCIPLINE) && lvl >= 40 && baseId == FLASH_HEAL_1 && GetHealthPCT(victim) <= 50)\n+                crit_chance += 10.f;\n+            //Renewed Hope part 1: 4% additional critical chance on targets affected by Weakened Soul for Flash Heal, Greater Heal and Penance (Heal)\n+            if ((GetSpec() == BOT_SPEC_PRIEST_DISCIPLINE) &&\n+                lvl >= 45 && (baseId == FLASH_HEAL_1 || baseId == HEAL || baseId == PENANCE_HEAL_1) &&\n+                victim->HasAuraTypeWithFamilyFlags(SPELL_AURA_MECHANIC_IMMUNITY, SPELLFAMILY_PRIEST, 0x20000000))\n+                crit_chance += 4.f;\n+        }\n+\n+        void ApplyClassDamageMultiplierSpell(int32& damage, SpellNonMeleeDamage& damageinfo, SpellInfo const* spellInfo, WeaponAttackType /*attackType*/, bool iscrit) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+            float fdamage = float(damage);\n+\n+            //apply bonus damage mods\n+            float pctbonus = 0.0f;\n+            if (iscrit)\n+            {\n+                //!!!spell damage is not yet critical and will be multiplied by 1.5\n+                //so we should put here bonus damage mult /1.5\n+                //Shadow Power: 50% additional crit damage bonus for Mind Blast, Mind Flay and SW:Death\n+                if (lvl >= 40 &&\n+                    (baseId == MIND_BLAST_1 || baseId == MIND_FLAY_DAMAGE || baseId == SW_DEATH_1))\n+                    pctbonus += 0.333f;\n+                //Shadowform crit damage increase\n+                if (me->GetShapeshiftForm() == FORM_SHADOW &&\n+                    (baseId == SW_PAIN_1 || baseId == DEVOURING_PLAGUE_1 || baseId == VAMPIRIC_TOUCH_1))\n+                    pctbonus += 0.333f;\n+            }\n+            //Improved Mind Flay and Smite (37571)\n+            if (lvl >= 10 && (baseId == MIND_FLAY_DAMAGE || baseId == SMITE_1))\n+                pctbonus += 0.05f;\n+            //Item - Priest T8 Shadow 2P Bonus (64906)\n+            if (lvl >= 80 && ((baseId == DEVOURING_PLAGUE_1) || (spellInfo->SpellFamilyFlags[2] & 0x8)))\n+                pctbonus += 0.15f;\n+\n+            //Twin Disciplines (damage part): 5% bonus damage for instant spells\n+            if (lvl >= 10 && !spellInfo->CastTimeEntry)\n+                pctbonus += 0.05f;\n+            //Darkness: 10% bonus damage for shadow spells\n+            if (lvl >= 10 && (spellInfo->GetSchoolMask() & SPELL_SCHOOL_MASK_SHADOW))\n+                pctbonus += 0.1f;\n+            //Improved Shadow Word: Pain: 6% bonus damage for Shadow Word: Pain\n+            if (lvl >= 15 && baseId == SW_PAIN_1)\n+                pctbonus += 0.06f;\n+            //Focused Power part 1: 4% bonus damage for all spells\n+            if ((GetSpec() == BOT_SPEC_PRIEST_DISCIPLINE) && lvl >= 35)\n+                pctbonus += 0.04f;\n+            //Improved Devouring Plague part 1: 15% bonus damage Devouring Plague\n+            if ((GetSpec() == BOT_SPEC_PRIEST_SHADOW) && lvl >= 35 && baseId == DEVOURING_PLAGUE_1)\n+                pctbonus += 0.15f;\n+            //Shadowform: 15% bonus damage for shadow spells (handled)\n+            //if (lvl >= 40 && (spellInfo->GetSchoolMask() & SPELL_SCHOOL_MASK_SHADOW) && me->GetShapeshiftForm() == FORM_SHADOW)\n+            //    pctbonus += 0.15f;\n+            //Misery part 3: 15% bonus damage (from spellpower) for Mind Blast, Mind Flay and Mind Sear\n+            if ((GetSpec() == BOT_SPEC_PRIEST_SHADOW) && lvl >= 45)\n+            {\n+                if (baseId == MIND_BLAST_1 || baseId == MIND_FLAY_DAMAGE || baseId == MIND_SEAR_DAMAGE_1)\n+                    fdamage += me->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_MAGIC) * 0.15f * me->CalculateDefaultCoefficient(spellInfo, DIRECT_DAMAGE) * me->CalculateSpellpowerCoefficientLevelPenalty(spellInfo);\n+            }\n+\n+            //If target is affected BY SW: Pain\n+            if (lvl >= 20 && (baseId == MIND_BLAST_1 || baseId == MIND_FLAY_DAMAGE) && damageinfo.target &&\n+                damageinfo.target->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_PRIEST, 0x8000, 0x0, 0x0, me->GetGUID()))\n+            {\n+                //Glyph of Mind Flay: 10% damage bonus for Mind Flay\n+                if (baseId == MIND_FLAY_DAMAGE)\n+                    pctbonus += 0.1f;\n+                //Twisted Faith (part 1): 10% bonus damage for Mind Blast and Mind Flay\n+                if ((GetSpec() == BOT_SPEC_PRIEST_SHADOW) && lvl >= 55)\n+                    pctbonus += 0.1f;\n+            }\n+\n+            //Glyph of Shadow Word: Death: 10% bonus damage for Shadow Word: Death on targets below 35% health\n+            if (lvl >= 62 && baseId == SW_DEATH_1 && damageinfo.target->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT))\n+                pctbonus += 0.1f;\n+\n+            //other\n+            if (baseId == SW_DEATH_BACKLASH)\n+            {\n+                //not affected by +%talents\n+                pctbonus = 1.f;\n+                ////T13 Shadow 2P Bonus (Shadow Word: Death), part 2\n+                //if (lvl >= 60) //buffed\n+                //    pctbonus -= 0.95f;\n+                //Pain and Suffering (part 2): 30% reduced backlash damage\n+                if ((GetSpec() == BOT_SPEC_PRIEST_SHADOW) && lvl >= 50)\n+                    pctbonus -= 0.3f;\n+            }\n+\n+            damage = int32(fdamage * (1.0f + pctbonus));\n+        }\n+\n+        void ApplyClassDamageMultiplierHeal(Unit const* victim, float& heal, SpellInfo const* spellInfo, DamageEffectType damagetype, uint32 stack) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+            float pctbonus = 0.0f;\n+            float flat_mod = 0.0f;\n+\n+            //pct mods\n+            //Improved Greater Heal (38411): 5% bonus healing for Greater Heal\n+            if (lvl >= 60 && baseId == HEAL)\n+                pctbonus += 0.05f;\n+            //Priest T9 Healing 2P: 20% bonus healing for Prayer of Mending\n+            if (lvl >= 80 && baseId == PRAYER_OF_MENDING_HEAL)\n+                pctbonus += 0.2f;\n+\n+            //Twin Disciplines (healing part): 5% bonus healing for instant spells\n+            if (lvl >= 10 && !spellInfo->CastTimeEntry)\n+                pctbonus += 0.05f;\n+            //Improved Renew: 15% bonus healing for Renew\n+            if (lvl >= 10 && baseId == RENEW_1)\n+                pctbonus += 0.15f;\n+            //Focused Power part 2: 4% bonus heal for all spells\n+            if ((GetSpec() == BOT_SPEC_PRIEST_DISCIPLINE) && lvl >= 35)\n+                pctbonus += 0.04f;\n+            //Spiritual Healing: 10% bonus healing for all spells\n+            if ((GetSpec() == BOT_SPEC_PRIEST_HOLY) && lvl >= 35)\n+                pctbonus += 0.15f;\n+            //Blessend Resilience part 1: 3% bonus healing for all spells\n+            if ((GetSpec() == BOT_SPEC_PRIEST_HOLY) && lvl >= 40)\n+                pctbonus += 0.03f;\n+            //Empowered Healing: 40% bonus (from spellpower) for Greater Heal and 20% bonus (from spellpower) for Flash Heal and Binding Heal\n+            if ((GetSpec() == BOT_SPEC_PRIEST_HOLY) && lvl >= 45)\n+            {\n+                if (baseId == HEAL)\n+                    flat_mod += me->SpellBaseHealingBonusDone(SPELL_SCHOOL_MASK_MAGIC) * 0.4f * me->CalculateDefaultCoefficient(spellInfo, damagetype) * 1.88f * me->CalculateSpellpowerCoefficientLevelPenalty(spellInfo) * stack;\n+                else if (baseId == FLASH_HEAL_1/* || baseId == BINDING_HEAL_1*/)\n+                    flat_mod += me->SpellBaseHealingBonusDone(SPELL_SCHOOL_MASK_MAGIC) * 0.2f * me->CalculateDefaultCoefficient(spellInfo, damagetype) * 1.88f * me->CalculateSpellpowerCoefficientLevelPenalty(spellInfo) * stack;\n+            }\n+            //Empowered Renew (heal bonus part): 15% bonus healing (from spellpower) for Renew\n+            if ((GetSpec() == BOT_SPEC_PRIEST_HOLY) && lvl >= 50 && baseId == RENEW_1)\n+                flat_mod += me->SpellBaseHealingBonusDone(SPELL_SCHOOL_MASK_MAGIC) * 0.15f * me->CalculateDefaultCoefficient(spellInfo, damagetype) * 1.88f * me->CalculateSpellpowerCoefficientLevelPenalty(spellInfo) * stack;\n+            //Test of Faith: 12% bonus healing on targets at or below 50% health\n+            if ((GetSpec() == BOT_SPEC_PRIEST_HOLY) && lvl >= 50 && GetHealthPCT(victim) <= 50)\n+                pctbonus += 0.12f;\n+            //Divine Providence: 10% bonus healing for Circle of Healing, Binding Heal, Holy Nova, Prayer of Healing, Divine Hymn and Prayer of Mending\n+            if ((GetSpec() == BOT_SPEC_PRIEST_HOLY) && lvl >= 55 &&\n+                ((spellInfo->SpellFamilyFlags[0] & 0x18000200) ||\n+                (spellInfo->SpellFamilyFlags[1] & 0x4) ||\n+                (spellInfo->SpellFamilyFlags[2] & 0x4)))\n+                pctbonus += 0.1f;\n+\n+            //flat mods\n+            //Improved Prayer of Mending: 100 additional heal for Prayer of Mending\n+            if (baseId == PRAYER_OF_MENDING_HEAL)\n+                flat_mod += 100;\n+\n+            heal = heal * (1.0f + pctbonus) + flat_mod;\n+        }\n+\n+        void ApplyClassSpellCostMods(SpellInfo const* spellInfo, int32& cost) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            float fcost = float(cost);\n+            int32 flatbonus = 0;\n+            float pctbonus = 0.0f;\n+\n+            //percent mods\n+            //Inner Focus\n+            if (AuraEffect const* focu = me->GetAuraEffect(INNER_FOCUS_1, 0))\n+                if (focu->IsAffectingSpell(spellInfo))\n+                    pctbonus += 1.f;\n+            //Surge of Light\n+            if (AuraEffect const* surg = me->GetAuraEffect(SURGE_OF_LIGHT_BUFF, 1))\n+                if (surg->IsAffectingSpell(spellInfo))\n+                    pctbonus += 1.f;\n+\n+            //Reduced Prayer of Healing Cost (38410):\n+            if (lvl >= 60 && baseId == PRAYER_OF_HEALING_1)\n+                pctbonus += 0.1f;\n+            //Greater Heal Cost Reduction (60155):\n+            if (lvl >= 60 && baseId == HEAL)\n+                pctbonus += 0.05f;\n+\n+            //Shadow Focus part 2\n+            if (lvl >= 15 && (spellInfo->GetSchoolMask() & SPELL_SCHOOL_MASK_SHADOW))\n+                pctbonus += 0.06f;\n+            //Absolution:\n+            if ((GetSpec() == BOT_SPEC_PRIEST_DISCIPLINE) && lvl >= 25 && (spellInfo->SpellFamilyFlags[1] & 0x81))\n+                pctbonus += 0.15f;\n+            //Mental Agility:\n+            if ((GetSpec() == BOT_SPEC_PRIEST_DISCIPLINE) && lvl >= 25 && !spellInfo->CastTimeEntry)\n+                pctbonus += 0.1f;\n+            //Improved Healing:\n+            if ((GetSpec() == BOT_SPEC_PRIEST_HOLY) &&\n+                lvl >= 25 && (baseId == HEAL || baseId == DIVINE_HYMN_1 || baseId == PENANCE_HEAL_1))\n+                pctbonus += 0.15f;\n+            //Soul Warding part 2\n+            if ((GetSpec() == BOT_SPEC_PRIEST_DISCIPLINE) && lvl >= 30 && baseId == PW_SHIELD_1)\n+                pctbonus += 0.15f;\n+            //Healing Prayers:\n+            if ((GetSpec() == BOT_SPEC_PRIEST_HOLY) &&\n+                lvl >= 30 && (baseId == PRAYER_OF_HEALING_1 || baseId == PRAYER_OF_MENDING_1))\n+                pctbonus += 0.2f;\n+            //Focused Mind\n+            if ((GetSpec() == BOT_SPEC_PRIEST_SHADOW) &&\n+                lvl >= 30 && (baseId == MIND_BLAST_1 || baseId == MIND_FLAY_1 ||\n+                baseId == MIND_SEAR_1/* || baseId == MIND_CONTROL_1*/))\n+                pctbonus += 0.15f;\n+            //Improved Flash Heal part 1\n+            if ((GetSpec() == BOT_SPEC_PRIEST_HOLY) && lvl >= 40 && baseId == FLASH_HEAL_1)\n+                pctbonus += 0.15f;\n+\n+            //Glyph of Fading\n+            if (lvl >= 15 && baseId == FADE_1)\n+                pctbonus += 0.3f;\n+            //Glyph of Fortitude\n+            if (lvl >= 15 && baseId == PW_FORTITUDE_1)\n+                pctbonus += 0.5f;\n+            //Glyph of Flash Heal\n+            if (lvl >= 20 && baseId == FLASH_HEAL_1)\n+                pctbonus += 0.1f;\n+            //Glyph of Mass Dispel\n+            if (lvl >= 70 && baseId == MASS_DISPEL_1)\n+                pctbonus += 0.35f;\n+\n+            //flat mods\n+            //Cleanse Cost Reduced (id: 27847): -25 mana cost for Cleanse\n+            //if (lvl >= 40 && spellId == GetSpell(CLEANSE_1))\n+            //    flatbonus += 25;\n+\n+            //cost can be < 0\n+            cost = int32(fcost * (1.0f - pctbonus)) - flatbonus;\n+        }\n+\n+        void ApplyClassSpellCastTimeMods(SpellInfo const* spellInfo, int32& casttime) const override\n+        {\n+            //casttime is in milliseconds\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            int32 timebonus = 0;\n+            float pctbonus = 0.0f;\n+\n+            //100% mods\n+            //Surge of Light\n+            if (AuraEffect const* surg = me->GetAuraEffect(SURGE_OF_LIGHT_BUFF, 1))\n+                if (surg->IsAffectingSpell(spellInfo))\n+                    pctbonus += 1.f;\n+\n+            //pct mods\n+            //Serendipity: -12% per stack cast time for Prayer of Healing or Greater Heal\n+            if (baseId == GREATER_HEAL_1 || baseId == PRAYER_OF_HEALING_1)\n+            {\n+                if (AuraEffect const* sere = me->GetAuraEffect(SERENDIPITY_BUFF, 0))\n+                    if (sere->IsAffectingSpell(spellInfo))\n+                        pctbonus += 0.12f * sere->GetBase()->GetStackAmount();\n+            }\n+\n+            //flat mods\n+            //Improved Prayer of Healing (21339)\n+            if (lvl >= 60 && baseId == PRAYER_OF_HEALING_1)\n+                timebonus += 100;\n+            //Master Healer (15027) rank 5\n+            if (lvl >= 60 && baseId == HEAL)\n+                timebonus += 500;\n+            //Prophesy Flash Heal Bonus (21973) part 1\n+            if (lvl >= 60 && baseId == FLASH_HEAL_1)\n+                timebonus += 100;\n+\n+            //Divine Fury\n+            if (lvl >= 15 && (baseId == HEAL || baseId == SMITE_1 || baseId == HOLY_FIRE_1))\n+                timebonus += 500;\n+            //Focused Power part 3\n+            if ((GetSpec() == BOT_SPEC_PRIEST_DISCIPLINE) && lvl >= 35 && baseId == MASS_DISPEL_1)\n+                timebonus += 1000;\n+            //Improved Mana Burn\n+            //if (lvl >= 35 && baseId == MANA_BURN_1)\n+            //    timebonus += 1000;\n+\n+            //Glyph of Scourge Imprisonment\n+            if (lvl >= 20 && baseId == SHACKLE_UNDEAD_1)\n+                timebonus += 1000;\n+\n+            casttime = std::max<int32>((float(casttime) * (1.0f - pctbonus)) - timebonus, 0);\n+        }\n+\n+        void ApplyClassSpellNotLoseCastTimeMods(SpellInfo const* spellInfo, int32& delayReduce) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchoolMask schools = spellInfo->GetSchoolMask();\n+            uint8 lvl = me->GetLevel();\n+            int32 reduceBonus = 0;\n+\n+            if (lvl >= 10)\n+            {\n+                switch (baseId)\n+                {\n+                    case FLASH_HEAL_1: case LESSER_HEAL_1: case NORMAL_HEAL_1: case GREATER_HEAL_1: case PRAYER_OF_HEALING_1: case PENANCE_1: case DIVINE_HYMN_1:\n+                        reduceBonus += 70;\n+                        break;\n+                    default:\n+                        break;\n+                }\n+            }\n+\n+            delayReduce += reduceBonus;\n+        }\n+\n+        void ApplyClassSpellCooldownMods(SpellInfo const* spellInfo, uint32& cooldown) const override\n+        {\n+            //cooldown is in milliseconds\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            int32 timebonus = 0;\n+            float pctbonus = 0.0f;\n+\n+            //pct mods\n+            //Aspiration\n+            if ((GetSpec() == BOT_SPEC_PRIEST_DISCIPLINE) &&\n+                lvl >= 45 && (baseId == INNER_FOCUS_1 || baseId == POWER_INFUSION_1 || baseId == PAIN_SUPPRESSION_1))\n+                pctbonus += 0.2f;\n+\n+            //flat mods\n+            //Veiled Shadows part 2\n+            //if (lvl >= 25 && baseId == SHADOWFIEND_1)\n+            //    timebonus += 120000;\n+            //Glyph of Dispersion:\n+            if (lvl >= 60 && baseId == DISPERSION_1)\n+                timebonus += 45000;\n+            //Glyph of Penance:\n+            if (lvl >= 60 && baseId == PENANCE_1)\n+                timebonus += 2000;\n+\n+            cooldown = std::max<int32>((float(cooldown) * (1.0f - pctbonus)) - timebonus, 0);\n+        }\n+\n+        void ApplyClassSpellCategoryCooldownMods(SpellInfo const* spellInfo, uint32& cooldown) const override\n+        {\n+            //cooldown is in milliseconds\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            int32 timebonus = 0;\n+            float pctbonus = 0.0f;\n+\n+            //pct mods\n+            //Aspiration\n+            if ((GetSpec() == BOT_SPEC_PRIEST_DISCIPLINE) && lvl >= 45 && baseId == PENANCE_1)\n+                pctbonus += 0.2f;\n+            //Divine Providence:\n+            if ((GetSpec() == BOT_SPEC_PRIEST_HOLY) && lvl >= 55 && baseId == PRAYER_OF_MENDING_1)\n+                pctbonus += 0.3f;\n+\n+            //flat mods\n+            //Quick Fade (18388)\n+            if (lvl >= 40 && baseId == FADE_1)\n+                timebonus += 2000;\n+\n+            //Improved Psychic Scream\n+            if (lvl >= 20 && baseId == PSYCHIC_SCREAM_1)\n+                timebonus += 4000;\n+            //Improved Mind Blast\n+            if (lvl >= 20 && baseId == MIND_BLAST_1)\n+                timebonus += 2500;\n+            //Veiled Shadows part 1\n+            if ((GetSpec() == BOT_SPEC_PRIEST_SHADOW) && lvl >= 25 && baseId == FADE_1)\n+                timebonus += 6000;\n+            //Soul Warding part 1\n+            if ((GetSpec() == BOT_SPEC_PRIEST_DISCIPLINE) && lvl >= 30 && baseId == PW_SHIELD_1)\n+                timebonus += 4000;\n+\n+            //Glyph of Fade\n+            if (lvl >= 15 && baseId == FADE_1)\n+                timebonus += 9000;\n+\n+            cooldown = std::max<int32>((float(cooldown) * (1.0f - pctbonus)) - timebonus, 0);\n+        }\n+\n+        void ApplyClassSpellGlobalCooldownMods(SpellInfo const* spellInfo, float& cooldown) const override\n+        {\n+            //cooldown is in milliseconds\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            float timebonus = 0.0f;\n+            float pctbonus = 0.0f;\n+\n+            //Prophesy Flash Heal Bonus (21973) part 2\n+            if (lvl >= 60 && baseId == FLASH_HEAL_1)\n+                timebonus += 100;\n+\n+            cooldown = (cooldown * (1.0f - pctbonus)) - timebonus;\n+        }\n+\n+        void ApplyClassSpellRadiusMods(SpellInfo const* spellInfo, float& radius) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            float flatbonus = 0.0f;\n+            float pctbonus = 0.0f;\n+\n+            //pct mods\n+            //Holy Reach\n+            if ((GetSpec() == BOT_SPEC_PRIEST_HOLY) &&\n+                lvl >= 25 && ((spellInfo->SpellFamilyFlags[0] & 0x18400200) || (spellInfo->SpellFamilyFlags[2] & 0x4)))\n+                pctbonus += 0.2f;\n+\n+            //flat mods\n+            //Glyph of Mind Sear\n+            if (lvl >= 75 && baseId == MIND_SEAR_DAMAGE_1)\n+                flatbonus += 5.f;\n+\n+            radius = radius * (1.0f + pctbonus) + flatbonus;\n+        }\n+\n+        void ApplyClassSpellRangeMods(SpellInfo const* spellInfo, float& maxrange) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            float flatbonus = 0.0f;\n+            float pctbonus = 0.0f;\n+\n+            //pct mods\n+            //Shadow Reach: +20% range for Shadow Spells\n+            if ((GetSpec() == BOT_SPEC_PRIEST_SHADOW) && lvl >= 25 &&\n+                ((spellInfo->SpellFamilyFlags[0] & 0x682A004) ||\n+                (spellInfo->SpellFamilyFlags[1] & 0x300502) ||\n+                (spellInfo->SpellFamilyFlags[2] & 0x2040)))\n+                pctbonus += 0.2f;\n+            //Holy Reach: +20% range for Holy Spells\n+            if ((GetSpec() == BOT_SPEC_PRIEST_HOLY) && lvl >= 25 && (spellInfo->SpellFamilyFlags[0] & 0x100080))\n+                pctbonus += 0.2f;\n+\n+            //flat mods\n+            //Glyph of Shackle Undead: +5 yd range for Shackle Undead\n+            if (lvl >= 20 && baseId == SHACKLE_UNDEAD_1)\n+                flatbonus += 5.f;\n+\n+            maxrange = maxrange * (1.0f + pctbonus) + flatbonus;\n+        }\n+\n+        void ApplyClassSpellMaxTargetsMods(SpellInfo const* spellInfo, uint32& targets) const override\n+        {\n+            uint32 bonusTargets = 0;\n+\n+            //Glyph of Circle of Healing: + 1 target\n+            if (spellInfo->SpellFamilyFlags[0] & 0x10000000)\n+                bonusTargets += 1;\n+\n+            targets = targets + bonusTargets;\n+        }\n+\n+        void ApplyClassEffectMods(SpellInfo const* spellInfo, uint8 effIndex, float& value) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+            float pctbonus = 1.0f;\n+\n+            //Improved Power Word: Fortitude\n+            if (lvl >= 15 && baseId == PW_FORTITUDE_1 && effIndex == EFFECT_0)\n+                pctbonus *= 1.3f;\n+            if (lvl >= 20 && baseId == PW_SHIELD_1 && effIndex == EFFECT_0)\n+            {\n+                //Improved PWSH: +15% effect\n+                pctbonus *= 1.15f;\n+                //Borrowed Time: +40% of spellpower\n+                if (GetSpec() == BOT_SPEC_PRIEST_DISCIPLINE && lvl >= 55)\n+                    value += me->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_MAGIC) * 0.4f;\n+            }\n+\n+            value = value * pctbonus;\n+        }\n+\n+        void OnClassSpellGo(SpellInfo const* spellInfo) override\n+        {\n+            //Surge of Light\n+            //Inner Focus\n+            AuraEffect const* surg = me->GetAuraEffect(SURGE_OF_LIGHT_BUFF, 1);\n+            AuraEffect const* focu = me->GetAuraEffect(INNER_FOCUS_1, 0);\n+            if (surg && surg->IsAffectingSpell(spellInfo))\n+                me->RemoveAurasDueToSpell(SURGE_OF_LIGHT_BUFF);\n+            else if (focu && focu->IsAffectingSpell(spellInfo))\n+                me->RemoveAurasDueToSpell(INNER_FOCUS_1);\n+\n+            //Serendipity\n+            if (AuraEffect const* sere = me->GetAuraEffect(SERENDIPITY_BUFF, 0))\n+                if (sere->IsAffectingSpell(spellInfo))\n+                    me->RemoveAurasDueToSpell(SERENDIPITY_BUFF);\n+        }\n+\n+        void SpellHitTarget(WorldObject* wtarget, SpellInfo const* spell) override\n+        {\n+            Unit* target = wtarget->ToUnit();\n+            if (!target)\n+                return;\n+\n+            uint32 spellId = spell->Id;\n+            uint32 baseId = spell->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+\n+            //Glyph of Hymn of Hope: +2 sec duration\n+            if (lvl >= 60 && (baseId == HYMN_OF_HOPE_1 || baseId == HYMN_OF_HOPE_BUFF))\n+            {\n+                if (Aura* hymn = target->GetAura(spellId))\n+                {\n+                    hymn->SetDuration(hymn->GetDuration() + 2000);\n+                    hymn->SetDuration(hymn->GetMaxDuration() + 2000);\n+                }\n+            }\n+            //Priest T9 Shadow 2P Bonus (67193)\n+            if (lvl >= 80 && baseId == VAMPIRIC_TOUCH_1)\n+            {\n+                if (Aura* touc = target->GetAura(spellId))\n+                {\n+                    uint32 dur = touc->GetMaxDuration() + 6000;\n+                    touc->SetDuration(dur);\n+                    touc->SetMaxDuration(dur);\n+                }\n+            }\n+\n+            //Improved Mind Blast part 2\n+            if ((GetSpec() == BOT_SPEC_PRIEST_SHADOW) && lvl >= 20 && baseId == MIND_BLAST_1)\n+                me->CastSpell(target, IMPROVED_MIND_BLAST_DEBUFF, true);\n+\n+            //Weakened Soul Reduction (id: 33333): -2 sec to Weakened Soul duration\n+            if (lvl >= 51 && baseId == WEAKENED_SOUL_DEBUFF)\n+            {\n+                if (Aura* soul = target->GetAura(spellId))\n+                {\n+                    uint32 dur = soul->GetMaxDuration() - 2000;\n+                    soul->SetDuration(dur);\n+                    soul->SetMaxDuration(dur);\n+                }\n+            }\n+            //Pain and Suffering (part 1): 100% to refresh Shadow Word: Pain on target hit by Mind Flay\n+            if ((GetSpec() == BOT_SPEC_PRIEST_SHADOW) && lvl >= 50 && baseId == MIND_FLAY_1 && GetSpell(SW_PAIN_1))\n+                if (Aura* pain = target->GetAura(GetSpell(SW_PAIN_1), me->GetGUID()))\n+                    pain->RefreshDuration();\n+            if (baseId == FEAR_WARD_1)\n+            {\n+                //2 minutes bonus duration for Fear Ward\n+                if (Aura* ward = target->GetAura(spellId, me->GetGUID()))\n+                {\n+                    uint32 dur = ward->GetDuration() + 120000;\n+                    ward->SetDuration(dur);\n+                    ward->SetMaxDuration(dur);\n+                }\n+            }\n+            //buffs duration\n+            if (baseId == INNER_FIRE_1 || baseId == VAMPIRIC_EMBRACE_1 || baseId == PW_FORTITUDE_1 ||\n+                baseId == SHADOW_PROTECTION_1 || baseId == DIVINE_SPIRIT_1)\n+            {\n+                //1 hour duration for all buffs\n+                if (Aura* buff = target->GetAura(spellId, me->GetGUID()))\n+                {\n+                    uint32 dur = HOUR * IN_MILLISECONDS;\n+                    buff->SetDuration(dur);\n+                    buff->SetMaxDuration(dur);\n+                }\n+            }\n+\n+            OnSpellHitTarget(target, spell);\n+        }\n+\n+        void SpellHit(WorldObject* wcaster, SpellInfo const* spell) override\n+        {\n+            Unit* caster = wcaster->ToUnit();\n+            if (!caster)\n+                return;\n+\n+            uint32 spellId = spell->Id;\n+            uint32 baseId = spell->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+\n+            //Glyph of Inner Fire + Improved Inner Fire:\n+            if (lvl >= 15 && baseId == INNER_FIRE_1)\n+            {\n+                if (Aura* fire = me->GetAura(spellId))\n+                {\n+                    fire->SetCharges(fire->GetCharges() + 12);\n+                    for (auto i : NPCBots::index_array<uint8, MAX_SPELL_EFFECTS>)\n+                        if (AuraEffect* eff = fire->GetEffect(i))\n+                            eff->ChangeAmount(int32(eff->GetAmount() * (i == 0 ? 1.45f*1.5f : 1.45f)));\n+                }\n+            }\n+            //Improved Vampiric Embrace\n+            if ((GetSpec() == BOT_SPEC_PRIEST_SHADOW) && lvl >= 30 && baseId == VAMPIRIC_EMBRACE_1)\n+            {\n+                if (AuraEffect* vamp = me->GetAuraEffect(spellId, 0))\n+                    vamp->ChangeAmount(vamp->GetAmount() + 10); //67% is essentially this\n+            }\n+\n+            OnSpellHit(caster, spell);\n+        }\n+\n+        void DamageDealt(Unit* victim, uint32& damage, DamageEffectType damageType) override\n+        {\n+            bot_ai::DamageDealt(victim, damage, damageType);\n+        }\n+\n+        void DamageTaken(Unit* u, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo*/) override\n+        {\n+            if (!u)\n+                return;\n+            if (!u->IsInCombat() && !me->IsInCombat())\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void OwnerAttackedBy(Unit* u) override\n+        {\n+            if (!u)\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        float GetSpellAttackRange(bool longRange) const override\n+        {\n+            return longRange ? CalcSpellMaxRange(MIND_FLAY_1) : 20.f;\n+        }\n+\n+        void SummonBotPet(Unit* target)\n+        {\n+            if (botPet)\n+                UnsummonAll(false);\n+\n+            uint32 entry = BOT_PET_SHADOWFIEND;\n+\n+            //Position pos;\n+\n+            //15 sec duration\n+            Creature* myPet = me->SummonCreature(entry, *me, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5s);\n+            //me->GetNearPoint(myPet, pos.m_positionX, pos.m_positionY, pos.m_positionZ, 0, 2, me->GetOrientation());\n+            //myPet->GetMotionMaster()->MovePoint(me->GetMapId(), pos);\n+            myPet->SetCreator(master);\n+            myPet->SetOwnerGUID(me->GetGUID());\n+            myPet->SetFaction(master->GetFaction());\n+            myPet->SetControlledByPlayer(!IAmFree());\n+            myPet->SetPvP(me->IsPvP());\n+            myPet->SetByteValue(UNIT_FIELD_BYTES_2, 1, master->GetByteValue(UNIT_FIELD_BYTES_2, 1));\n+            myPet->SetUInt32Value(UNIT_CREATED_BY_SPELL, SHADOWFIEND_1);\n+\n+            botPet = myPet;\n+\n+            myPet->Attack(target, true);\n+            if (!HasBotCommandState(BOT_COMMAND_MASK_UNCHASE))\n+                myPet->GetMotionMaster()->MoveChase(target);\n+        }\n+\n+        void UnsummonAll(bool savePets = true) override\n+        {\n+            UnsummonPet(savePets);\n+        }\n+\n+        void SummonedCreatureDies(Creature* /*summon*/, Unit* /*killer*/) override\n+        {\n+        }\n+\n+        void SummonedCreatureDespawn(Creature* summon) override\n+        {\n+            //BOT_LOG_ERROR(\"entities.unit\", \"SummonedCreatureDespawn: {}'s {}\", me->GetName(), summon->GetName());\n+            if (summon == botPet)\n+                botPet = nullptr;\n+        }\n+\n+        uint32 GetAIMiscValue(uint32 data) const override\n+        {\n+            switch (data)\n+            {\n+                case BOTAI_MISC_PET_TYPE:\n+                    return BOT_PET_SHADOWFIEND;\n+                default:\n+                    return 0;\n+            }\n+        }\n+\n+        void Reset() override\n+        {\n+            UnsummonAll(false);\n+\n+            Shackle_Timer = 0;\n+            Mend_Timer = 0;\n+\n+            DispelcheckTimer = 0;\n+            DevcheckTimer = 0;\n+            ShackcheckTimer = 0;\n+\n+            Devcheck = false;\n+            Shackcheck = false;\n+\n+            DefaultInit();\n+        }\n+\n+        void ReduceCD(uint32 diff) override\n+        {\n+            if (Shackle_Timer > diff)               Shackle_Timer -= diff;\n+            if (Mend_Timer > diff)                  Mend_Timer -= diff;\n+\n+            if (DispelcheckTimer > diff)            DispelcheckTimer -= diff;\n+            if (DevcheckTimer > diff)               DevcheckTimer -= diff;\n+            if (ShackcheckTimer > diff)             ShackcheckTimer -= diff;\n+        }\n+\n+        void InitPowers() override\n+        {\n+            me->SetPowerType(POWER_MANA);\n+        }\n+\n+        void InitSpells() override\n+        {\n+            uint8 lvl = me->GetLevel();\n+            bool isDisc = GetSpec() == BOT_SPEC_PRIEST_DISCIPLINE;\n+            bool isHoly = GetSpec() == BOT_SPEC_PRIEST_HOLY;\n+            bool isShad = GetSpec() == BOT_SPEC_PRIEST_SHADOW;\n+\n+            InitSpellMap(DISPEL_MAGIC_1);\n+            InitSpellMap(MASS_DISPEL_1);\n+            InitSpellMap(CURE_DISEASE_1);\n+            InitSpellMap(ABOLISH_DISEASE_1);\n+            InitSpellMap(FEAR_WARD_1);\n+            InitSpellMap(PSYCHIC_SCREAM_1);\n+            InitSpellMap(FADE_1);\n+            InitSpellMap(MIND_SEAR_1);\n+            InitSpellMap(SHACKLE_UNDEAD_1);\n+            InitSpellMap(GREATER_HEAL_1);\n+            InitSpellMap(NORMAL_HEAL_1);\n+            InitSpellMap(LESSER_HEAL_1);\n+            InitSpellMap(RENEW_1);\n+            InitSpellMap(FLASH_HEAL_1);\n+            InitSpellMap(PRAYER_OF_HEALING_1);\n+            InitSpellMap(DIVINE_HYMN_1);\n+            InitSpellMap(PRAYER_OF_MENDING_1);\n+            InitSpellMap(RESURRECTION_1);\n+            InitSpellMap(PW_SHIELD_1);\n+            InitSpellMap(INNER_FIRE_1);\n+            InitSpellMap(PW_FORTITUDE_1);\n+            InitSpellMap(SHADOW_PROTECTION_1);\n+            InitSpellMap(DIVINE_SPIRIT_1);\n+            InitSpellMap(HOLY_FIRE_1);\n+            InitSpellMap(SMITE_1);\n+            InitSpellMap(SW_PAIN_1);\n+            InitSpellMap(MIND_BLAST_1);\n+            InitSpellMap(SW_DEATH_1);\n+            InitSpellMap(DEVOURING_PLAGUE_1);\n+            InitSpellMap(HYMN_OF_HOPE_1);\n+            InitSpellMap(LEVITATE_1);\n+            InitSpellMap(SHADOWFIEND_1); //not casted\n+\n+  /*Talent*/lvl >= 20 && isDisc ? InitSpellMap(INNER_FOCUS_1) : RemoveSpell(INNER_FOCUS_1);\n+  /*Talent*/lvl >= 40 && isDisc ? InitSpellMap(POWER_INFUSION_1) : RemoveSpell(POWER_INFUSION_1);\n+  /*Talent*/lvl >= 50 && isDisc ? InitSpellMap(PAIN_SUPPRESSION_1) : RemoveSpell(PAIN_SUPPRESSION_1);\n+  /*Talent*/lvl >= 60 && isDisc ? InitSpellMap(PENANCE_1) : RemoveSpell(PENANCE_1);\n+\n+  /*Talent*/lvl >= 20 && isHoly ? InitSpellMap(DESPERATE_PRAYER_1) : RemoveSpell(DESPERATE_PRAYER_1);\n+  /*Talent*/lvl >= 50 && isHoly ? InitSpellMap(CIRCLE_OF_HEALING_1) : RemoveSpell(CIRCLE_OF_HEALING_1);\n+  /*Talent*/lvl >= 60 && isHoly ? InitSpellMap(GUARDIAN_SPIRIT_1) : RemoveSpell(GUARDIAN_SPIRIT_1);\n+\n+  /*Talent*/lvl >= 20 && isShad ? InitSpellMap(MIND_FLAY_1) : RemoveSpell(MIND_FLAY_1);\n+  /*Talent*/lvl >= 30 && isShad ? InitSpellMap(SILENCE_1) : RemoveSpell(SILENCE_1);\n+  /*Talent*/lvl >= 30 && isShad ? InitSpellMap(VAMPIRIC_EMBRACE_1) : RemoveSpell(VAMPIRIC_EMBRACE_1);\n+  /*Talent*/lvl >= 40 && isShad ? InitSpellMap(SHADOWFORM_1) : RemoveSpell(SHADOWFORM_1);\n+  /*Talent*/lvl >= 50 && isShad ? InitSpellMap(VAMPIRIC_TOUCH_1) : RemoveSpell(VAMPIRIC_TOUCH_1);\n+  /*Talent*/lvl >= 50 && isShad ? InitSpellMap(PSYCHIC_HORROR_1) : RemoveSpell(PSYCHIC_HORROR_1);\n+  /*Talent*/lvl >= 60 && isShad ? InitSpellMap(DISPERSION_1) : RemoveSpell(DISPERSION_1);\n+\n+            HEAL = GetSpell(GREATER_HEAL_1) ? GREATER_HEAL_1 :\n+                GetSpell(NORMAL_HEAL_1) ? NORMAL_HEAL_1 :\n+                GetSpell(LESSER_HEAL_1) ? LESSER_HEAL_1 : 0;\n+        }\n+\n+        void ApplyClassPassives() const override\n+        {\n+            uint8 level = master->GetLevel();\n+            bool isDisc = GetSpec() == BOT_SPEC_PRIEST_DISCIPLINE;\n+            bool isHoly = GetSpec() == BOT_SPEC_PRIEST_HOLY;\n+            bool isShad = GetSpec() == BOT_SPEC_PRIEST_SHADOW;\n+\n+            RefreshAura(UNBREAKABLE_WILL, level >= 10 ? 1 : 0);\n+            RefreshAura(MEDITATION, level >= 20 ? 1 : 0);\n+            RefreshAura(RENEWED_HOPE, isDisc && level >= 45 ? 1 : 0);\n+            RefreshAura(RAPTURE, isDisc && level >= 45 ? 1 : 0);\n+            RefreshAura(DIVINE_AEGIS, isDisc && level >= 50 ? 1 : 0);\n+            RefreshAura(GRACE, isDisc && level >= 50 ? 1 : 0);\n+            RefreshAura(BORROWED_TIME, isDisc && level >= 55 ? 1 : 0);\n+\n+            RefreshAura(INSPIRATION3, isHoly && level >= 25 ? 1 : 0);\n+            RefreshAura(INSPIRATION2, isHoly && level >= 23 && level < 25 ? 1 : 0);\n+            RefreshAura(INSPIRATION1, isHoly && level >= 20 && level < 23 ? 1 : 0);\n+            RefreshAura(SURGE_OF_LIGHT, isHoly && level >= 35 ? 1 : 0);\n+            RefreshAura(HOLY_CONCENTRATION, isHoly && level >= 40 ? 1 : 0);\n+            RefreshAura(BODY_AND_SOUL1, isHoly && level >= 45 ? 1 : 0);\n+            RefreshAura(SERENDIPITY, isHoly && level >= 45 ? 1 : 0);\n+            RefreshAura(EMPOWERED_RENEW3, isHoly && level >= 55 ? 1 : 0);\n+            RefreshAura(EMPOWERED_RENEW2, isHoly && level >= 53 && level < 55 ? 1 : 0);\n+            RefreshAura(EMPOWERED_RENEW1, isHoly && level >= 50 && level < 53 ? 1 : 0);\n+\n+            RefreshAura(SPIRIT_TAP, isShad && level >= 10 ? 1 : 0);\n+            RefreshAura(IMPROVED_SPIRIT_TAP, isShad && level >= 10 ? 1 : 0);\n+            RefreshAura(SHADOW_WEAVING3, isShad && level >= 30 ? 1 : 0);\n+            RefreshAura(SHADOW_WEAVING2, isShad && level >= 28 && level < 30 ? 1 : 0);\n+            RefreshAura(SHADOW_WEAVING1, isShad && level >= 25 && level < 28 ? 1 : 0);\n+            RefreshAura(IMPROVED_DEVOURING_PLAGUE, isShad && level >= 35 ? 1 : 0);\n+            RefreshAura(IMPROVED_SHADOWFORM, isShad && level >= 45 ? 1 : 0);\n+            RefreshAura(MISERY3, isShad && level >= 50 ? 1 : 0);\n+            RefreshAura(MISERY2, isShad && level >= 48 && level < 50 ? 1 : 0);\n+            RefreshAura(MISERY1, isShad && level >= 45 && level < 48 ? 1 : 0);\n+\n+            //RefreshAura(GLYPH_SW_PAIN, level >= 15 ? 1 : 0);\n+            RefreshAura(GLYPH_PW_SHIELD, level >= 15 ? 1 : 0);\n+            RefreshAura(GLYPH_DISPEL_MAGIC, level >= 18 ? 1 : 0);\n+            RefreshAura(GLYPH_PRAYER_OF_HEALING, level >= 30 ? 1 : 0);\n+            RefreshAura(GLYPH_SHADOW, level >= 30 ? 1 : 0);\n+            RefreshAura(PRIEST_T10_2P_BONUS, level >= 70 ? 1 : 0);\n+        }\n+\n+        bool CanUseManually(uint32 basespell) const override\n+        {\n+            switch (basespell)\n+            {\n+                case MASS_DISPEL_1:\n+                case ABOLISH_DISEASE_1:\n+                case PAIN_SUPPRESSION_1:\n+                case FADE_1:\n+                case PENANCE_1:\n+                case VAMPIRIC_EMBRACE_1:\n+                case DISPERSION_1:\n+                case GUARDIAN_SPIRIT_1:\n+                case RENEW_1:\n+                case PRAYER_OF_HEALING_1:\n+                case CIRCLE_OF_HEALING_1:\n+                case DIVINE_HYMN_1:\n+                case PRAYER_OF_MENDING_1:\n+                case PW_SHIELD_1:\n+                case INNER_FIRE_1:\n+                case PW_FORTITUDE_1:\n+                case SHADOW_PROTECTION_1:\n+                case DIVINE_SPIRIT_1:\n+                case FEAR_WARD_1:\n+                case FLASH_HEAL_1:\n+                case GREATER_HEAL_1:\n+                case LEVITATE_1:\n+                    return true;\n+                case NORMAL_HEAL_1:\n+                    return !GetSpell(GREATER_HEAL_1);\n+                case LESSER_HEAL_1:\n+                    return !GetSpell(NORMAL_HEAL_1) && !GetSpell(GREATER_HEAL_1);\n+                case SHADOWFORM_1:\n+                    return me->GetShapeshiftForm() != FORM_SHADOW;\n+                default:\n+                    return false;\n+            }\n+        }\n+\n+        std::vector<uint32> const* GetDamagingSpellsList() const override\n+        {\n+            return &Priest_spells_damage;\n+        }\n+        std::vector<uint32> const* GetCCSpellsList() const override\n+        {\n+            return &Priest_spells_cc;\n+        }\n+        std::vector<uint32> const* GetHealingSpellsList() const override\n+        {\n+            return &Priest_spells_heal;\n+        }\n+        std::vector<uint32> const* GetSupportSpellsList() const override\n+        {\n+            return &Priest_spells_support;\n+        }\n+\n+        void InitHeals() override\n+        {\n+            SpellInfo const* spellInfo;\n+            if (InitSpell(me, HEAL))\n+            {\n+                spellInfo = sSpellMgr->GetSpellInfo(InitSpell(me, HEAL));\n+                _heals[HEAL] = me->SpellHealingBonusDone(me, spellInfo, spellInfo->_effects[0].CalcValue(me), DamageEffectType(3), spellInfo->GetEffect(EFFECT_0), {});\n+            }\n+            else\n+                _heals[HEAL] = 0;\n+\n+            if (InitSpell(me, FLASH_HEAL_1))\n+            {\n+                spellInfo = sSpellMgr->GetSpellInfo(InitSpell(me, FLASH_HEAL_1));\n+                _heals[FLASH_HEAL_1] = me->SpellHealingBonusDone(me, spellInfo, spellInfo->_effects[0].CalcValue(me), DamageEffectType(3), spellInfo->GetEffect(EFFECT_0), {});\n+            }\n+            else\n+                _heals[FLASH_HEAL_1] = 0;\n+\n+            if (InitSpell(me, PENANCE_HEAL_1))\n+            {\n+                spellInfo = sSpellMgr->GetSpellInfo(InitSpell(me, PENANCE_HEAL_1));\n+                _heals[PENANCE_1] = me->SpellHealingBonusDone(me, spellInfo, spellInfo->_effects[0].CalcValue(me), DamageEffectType(3), spellInfo->GetEffect(EFFECT_0), {});\n+            }\n+            else\n+                _heals[PENANCE_1] = 0;\n+\n+            if (InitSpell(me, DESPERATE_PRAYER_1))\n+            {\n+                spellInfo = sSpellMgr->GetSpellInfo(InitSpell(me, DESPERATE_PRAYER_1));\n+                _heals[DESPERATE_PRAYER_1] = me->SpellHealingBonusDone(me, spellInfo, spellInfo->_effects[0].CalcValue(me), DamageEffectType(3), spellInfo->GetEffect(EFFECT_0), {});\n+            }\n+            else\n+                _heals[DESPERATE_PRAYER_1] = 0;\n+        }\n+\n+    private:\n+        uint32 HEAL;\n+        uint32 Shackle_Timer, Mend_Timer, DispelcheckTimer, DevcheckTimer, ShackcheckTimer;\n+/*Misc*/bool Devcheck, Shackcheck;\n+\n+        using HealMap = std::unordered_map<uint32 /*baseId*/, int32 /*amount*/>;\n+        HealMap _heals;\n+    };\n+};\n+\n+void AddSC_priest_bot()\n+{\n+    new priest_bot();\n+}\ndiff --git a/src/server/game/AI/NpcBots/bot_rogue_ai.cpp b/src/server/game/AI/NpcBots/bot_rogue_ai.cpp\nnew file mode 100644\nindex 0000000000..901fd73771\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bot_rogue_ai.cpp\n@@ -0,0 +1,2054 @@\n+#include \"bot_ai.h\"\n+#include \"botmgr.h\"\n+#include \"bottext.h\"\n+#include \"bottraits.h\"\n+#include \"Creature.h\"\n+#include \"Group.h\"\n+#include \"Item.h\"\n+#include \"Map.h\"\n+#include \"MotionMaster.h\"\n+#include \"ObjectMgr.h\"\n+#include \"Player.h\"\n+#include \"ScriptMgr.h\"\n+#include \"SpellAuraEffects.h\"\n+#include \"Spell.h\"\n+#include \"SpellMgr.h\"\n+#include \"WorldSession.h\"\n+/*\n+Rogue NpcBot (reworked by Trickerer onlysuffering@gmail.com)\n+Complete - 90%\n+TODO:\n+*/\n+\n+enum RogueBaseSpells\n+{\n+    KICK_1                              = 1766,\n+    EXPOSE_ARMOR_1                      = 8647, //NYI\n+    FEINT_1                             = 1966,\n+    DISMANTLE_1                         = 51722,\n+\n+    BACKSTAB_1                          = 53,\n+    SINISTER_STRIKE_1                   = 1752,\n+    EVISCERATE_1                        = 2098,\n+    ENVENOM_1                           = 32645,\n+    RUPTURE_1                           = 1943,\n+    MUTILATE_1                          = 1329,\n+    HEMORRHAGE_1                        = 16511,\n+    GHOSTLY_STRIKE_1                    = 14278,\n+    RIPOSTE_1                           = 14251,\n+    DEADLY_THROW_1                      = 26679,\n+    FAN_OF_KNIVES_1                     = 51723,\n+\n+    SPRINT_1                            = 2983,\n+    EVASION_1                           = 5277,\n+    BLIND_1                             = 2094,\n+    VANISH_1                            = 1856,\n+    COLD_BLOOD_1                        = 14177,\n+    HUNGER_FOR_BLOOD_1                  = 51662,\n+    ADRENALINE_RUSH_1                   = 13750,\n+    KILLING_SPREE_1                     = 51690,\n+    PREPARATION_1                       = 14185,\n+    PREMEDITATION_1                     = 14183,\n+\n+    GOUGE_1                             = 1776,\n+\n+    KIDNEY_SHOT_1                       = 408,\n+    SLICE_DICE_1                        = 5171,\n+    BLADE_FLURRY_1                      = 13877,\n+    SHADOWSTEP_1                        = 36554,\n+    CLOAK_OF_SHADOWS_1                  = 31224,\n+    TRICKS_OF_THE_TRADE_1               = 57934,\n+    SHADOW_DANCE_1                      = 51713,\n+\n+    STEALTH_1                           = 1784,\n+    SAP_1                               = 6770, //NYI\n+    GARROTE_1                           = 703,\n+    CHEAP_SHOT_1                        = 1833,\n+    AMBUSH_1                            = 8676,\n+\n+    DISTRACT_1                          = 1725, //NYI\n+    DISARM_TRAP_1                       = 1842, //Unused, see bot_ai::ProcessImmediateNonAttackTarget()\n+\n+    //Poisons\n+    CRIPPLING_POISON_1                  = 3408,\n+    INSTANT_POISON_1                    = 8679,\n+    DEADLY_POISON_1                     = 2823,\n+    WOUND_POISON_1                      = 13219,\n+    MIND_NUMBING_POISON_1               = 5761, //manual use only\n+    ANESTHETIC_POISON_1                 = 26785,\n+\n+    PICK_LOCK_1                         = 1804\n+};\n+\n+enum RoguePassives\n+{\n+    //Talents\n+    SEAL_FATE1                          = 14189,\n+    SEAL_FATE2                          = 14190,\n+    SEAL_FATE3                          = 14193,\n+    SEAL_FATE4                          = 14194,\n+    SEAL_FATE5                          = 14195,\n+    COMBAT_POTENCY1                     = 35541,\n+    COMBAT_POTENCY2                     = 35550,\n+    COMBAT_POTENCY3                     = 35551,\n+    COMBAT_POTENCY4                     = 35552,\n+    COMBAT_POTENCY5                     = 35553,\n+    QUICK_RECOVERY1                     = 31244,\n+    QUICK_RECOVERY2                     = 31245,\n+    //BLADE_TWISTING1                     = 31124,\n+    //BLADE_TWISTING2                     = 31126,\n+    DEADLY_BREW                         = 51626,//rank 2\n+    IMPROVED_KIDNEY_SHOT                = 14176,//rank 3\n+    VIGOR                               = 14983,\n+    REMORSELESS_ATTACKS                 = 14148,//rank 2\n+    FLEET_FOOTED                        = 31209,//rank 2\n+    MURDER                              = 14159,//rank 2\n+    OVERKILL                            = 58426,\n+    FOCUSED_ATTACKS                     = 51636,//rank 3\n+    MASTER_POISONER                     = 58410,//rank 3\n+    DUAL_WIELD_SPECIALIZATION           = 13852,//rank 5\n+    IMPROVED_KICK                       = 13867,//rank 2\n+    IMPROVED_SPRINT                     = 13875,//rank 2\n+    HACK_AND_SLASH                      = 13964,//rank 5\n+    VITALITY                            = 61329,//rank 3\n+    NERVES_OF_STEEL                     = 31131,//rank 2\n+    THROWING_SPECIALIZATION             = 51679,//rank 2\n+    //SAVAGE_COMBAT                       = 58413,//rank 2\n+    UNFAIR_ADVANTAGE                    = 51674,//rank 2\n+    SURPRISE_ATTACKS                    = 32601,\n+    PREY_ON_THE_WEAK                    = 51689,//rank 5\n+    MASTER_OF_DECEPTION                 = 13971,//rank 3\n+    SETUP                               = 14071,//rank 3\n+    INITIATIVE                          = 13980,//rank 3\n+    DIRTY_DEEDS                         = 14083,//rank 2\n+    MASTER_OF_SUBTLETY                  = 31223,//rank 3\n+    CHEAT_DEATH                         = 31230,//rank 3\n+    ENVELOPING_SHADOWS                  = 31213,//rank 3\n+    TURN_THE_TABLES                     = 51629,//rank 3\n+    HONOR_AMONG_THIEVES                 = 51701,//rank 3\n+\n+    //Other\n+    VIGOR_GLADIATOR                     = 21975,\n+    GLYPH_BACKSTAB                      = 56800,\n+\n+    ROGUE_PASSIVE_DND                   = 21184 //from playercreateinfo_spell\n+};\n+\n+enum RogueSpecial\n+{\n+    MUTILATE_DAMAGE_MAINHAND_1          = 5374,\n+    MUTILATE_DAMAGE_OFFHAND_1           = 27576,\n+\n+    //TURN_THE_TABLES_BUFF                = 52910,//'rank 3'\n+    HUNGER_FOR_BLOOD_BUFF               = 63848,\n+    WAYLAY_DEBUFF                       = 51693,\n+    REMORSELESS_ATTACKS_BUFF            = 14149,\n+    CHEATING_DEATH_BUFF                 = 45182, //hidden\n+    TRICKS_OF_THE_TRADE_BUFF            = 57933,\n+\n+    RELENTLESS_STRIKES_EFFECT           = 14181,\n+    RUTHLESSNESS_EFFECT                 = 14157,\n+    SEAL_FATE_EFFECT                    = 14189,\n+    SETUP_EFFECT                        = 15250,\n+    INITIATIVE_EFFECT                   = 13977,\n+    HONOR_AMONG_THIEVES_EFFECT          = 51699,\n+\n+    VANISH_TRIGGERED_1                  = 11327,\n+    VANISH_TRIGGERED_2                  = 11329,\n+    VANISH_TRIGGERED_3                  = 26888,\n+\n+    //Poisons\n+    CRIPPLING_POISON_PROC_1             = 3409,\n+    //INSTANT_POISON_PROC_1               = 8680,\n+    DEADLY_POISON_PROC_1                = 2818,\n+    WOUND_POISON_PROC_1                 = 13218,\n+    MIND_NUMBING_POISON_PROC_1          = 5760,\n+    //ANESTHETIC_POISON_PROC_1            = 26688,\n+\n+    THISTLE_TEA                         = 9512 //'Restore Energy' 1 min cd\n+};\n+\n+static const std::vector<uint32> Rogue_spells_damage\n+{ AMBUSH_1, BACKSTAB_1, DEADLY_THROW_1, EVISCERATE_1, ENVENOM_1, FAN_OF_KNIVES_1, GARROTE_1, GHOSTLY_STRIKE_1, GOUGE_1,\n+HEMORRHAGE_1, KILLING_SPREE_1, MUTILATE_1, RIPOSTE_1, RUPTURE_1, SINISTER_STRIKE_1 };\n+static const std::vector<uint32> Rogue_spells_cc{ BLIND_1, CHEAP_SHOT_1, /*DEADLY_THROW_1, */DISMANTLE_1, GOUGE_1, KICK_1, KIDNEY_SHOT_1, /*SAP_1*/ };\n+static const std::vector<uint32> Rogue_spells_support\n+{ /*EXPOSE_ARMOR_1, DISTRACT_1, PICK_LOCK_1,*/ STEALTH_1, ADRENALINE_RUSH_1, BLADE_FLURRY_1, CLOAK_OF_SHADOWS_1,\n+COLD_BLOOD_1, DISMANTLE_1, EVASION_1, FEINT_1, HUNGER_FOR_BLOOD_1, PREMEDITATION_1, PREPARATION_1, SHADOW_DANCE_1,\n+SHADOWSTEP_1, SLICE_DICE_1, SPRINT_1, TRICKS_OF_THE_TRADE_1, VANISH_1, DISARM_TRAP_1, THISTLE_TEA,\n+/*CRIPPLING_POISON_1, INSTANT_POISON_1, DEADLY_POISON_1, WOUND_POISON_1, MIND_NUMBING_POISON_1, ANESTHETIC_POISON_1*/ };\n+\n+class rogue_bot : public CreatureScript\n+{\n+public:\n+    rogue_bot() : CreatureScript(\"rogue_bot\") { }\n+\n+    CreatureAI* GetAI(Creature* creature) const override\n+    {\n+        return new rogue_botAI(creature);\n+    }\n+/*\n+    bool OnGossipHello(Player* player, Creature* creature)\n+    {\n+        return creature->GetBotAI()->OnGossipHello(player, 0);\n+    }\n+\n+    bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action)\n+    {\n+        if (bot_ai* ai = creature->GetBotAI())\n+            return ai->OnGossipSelect(player, creature, sender, action);\n+        return true;\n+    }\n+\n+    bool OnGossipSelectCode(Player* player, Creature* creature, uint32 sender, uint32 action, char const* code)\n+    {\n+        if (bot_ai* ai = creature->GetBotAI())\n+            return ai->OnGossipSelectCode(player, creature, sender, action, code);\n+        return true;\n+    }\n+*/\n+    struct rogue_botAI : public bot_ai\n+    {\n+        rogue_botAI(Creature* creature) : bot_ai(creature)\n+        {\n+            _botclass = BOT_CLASS_ROGUE;\n+\n+            mhEnchantExpireTimer = 1;\n+            ohEnchantExpireTimer = 1;\n+            mhEnchant = 0;\n+            ohEnchant = 0;\n+            needChooseMHEnchant = true;\n+            needChooseOHEnchant = true;\n+\n+            InitUnitFlags();\n+        }\n+\n+        bool doCast(Unit* victim, uint32 spellId)\n+        {\n+            if (CheckBotCast(victim, spellId) != SPELL_CAST_OK)\n+                return false;\n+            return bot_ai::doCast(victim, spellId);\n+        }\n+\n+        void StartAttack(Unit* u, bool force = false)\n+        {\n+            if (!bot_ai::StartAttack(u, force))\n+                return;\n+            GetInPosition(force, u);\n+        }\n+\n+        void JustEnteredCombat(Unit* u) override { bot_ai::JustEnteredCombat(u); }\n+        void KilledUnit(Unit* u) override { bot_ai::KilledUnit(u); }\n+        void EnterEvadeMode(EvadeReason why = EVADE_REASON_OTHER) override { bot_ai::EnterEvadeMode(why); }\n+        void MoveInLineOfSight(Unit* u) override { bot_ai::MoveInLineOfSight(u); }\n+        void JustDied(Unit* u) override { comboPoints = 0; bot_ai::JustDied(u); }\n+\n+        void getenergy()\n+        {\n+            energy = me->GetPower(POWER_ENERGY);\n+        }\n+\n+        int32 ecost(uint32 spellId) const\n+        {\n+            if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId))\n+                return spellInfo->CalcPowerCost(me, spellInfo->GetSchoolMask());\n+            return 0;\n+        }\n+\n+        void UpdateAI(uint32 diff) override\n+        {\n+            if (combopointsSpent)\n+            {\n+                combopointsSpent = false;\n+                comboPoints = 0;\n+            }\n+\n+            getenergy();\n+\n+            if (!GlobalUpdate(diff))\n+                return;\n+\n+            DoVehicleActions(diff);\n+            if (!CanBotAttackOnVehicle())\n+                return;\n+\n+            if (IsPotionReady())\n+            {\n+                if (GetHealthPCT(me) < 50)\n+                    DrinkPotion(false);\n+            }\n+\n+            CheckRacials(diff);\n+\n+            if (!me->IsInCombat())\n+                DoNonCombatActions(diff);\n+\n+            if (IsCasting())\n+                return;\n+\n+            if (ProcessImmediateNonAttackTarget())\n+                return;\n+\n+            CheckUsableItems(diff);\n+\n+            CheckSprint(diff);\n+            CheckCloakOfShadows(diff);\n+            CheckVanish(diff);\n+\n+            if (!CheckAttackTarget())\n+            {\n+                if (!me->IsInCombat() && Rand() < 5 && me->HasAuraType(SPELL_AURA_MOD_STEALTH) &&\n+                    !me->GetAuraEffect(SPELL_AURA_MOD_INCREASE_SPEED, SPELLFAMILY_ROGUE, 0x800, 0x0, 0x0) && //vanish\n+                    !(!HasRole(BOT_ROLE_DPS) && GetLastWMOArea() == 29476))\n+                    me->RemoveAurasDueToSpell(STEALTH_1);\n+                return;\n+            }\n+\n+            CheckBlind(diff);\n+            CheckPreparation(diff);\n+            CheckTricksOfTheTrade(diff);\n+\n+            Attack(diff);\n+        }\n+\n+        void Attack(uint32 diff)\n+        {\n+            Unit* mytar = opponent ? opponent : disttarget ? disttarget : nullptr;\n+            if (!mytar)\n+                return;\n+\n+            StartAttack(mytar, IsMelee());\n+\n+            CheckAttackState();\n+            if (!me->IsAlive() || !mytar->IsAlive())\n+                return;\n+\n+            float dist = me->GetDistance(mytar);\n+\n+            //Stealth (for Cooldown handling see bot_ai::ReleaseSpellCooldown)\n+            //we don't want rogue to swith into stealth for no purpose\n+            if (IsSpellReady(STEALTH_1, diff, false) && !me->IsInCombat() && !IsTank() && Rand() < 50 && dist < 28 &&\n+                (!me->HasAuraType(SPELL_AURA_PERIODIC_DAMAGE) || (mytar->IsPlayer() && dist < 6)) &&\n+                (me->GetLevel() >= 35 || (energy >= 40 && me->GetLevel() >= 30) || dist > 8) && !IsFlagCarrier(me))\n+            {\n+                if (doCast(me, GetSpell(STEALTH_1)))\n+                {}\n+            }\n+\n+            if (!CanAffectVictimAny(mytar, SPELL_SCHOOL_NORMAL))\n+                return;\n+\n+            bool stealthed = me->HasAuraType(SPELL_AURA_MOD_STEALTH);\n+            bool shadowdance = me->HasAuraType(SPELL_AURA_MOD_IGNORE_SHAPESHIFT);\n+\n+            //Hunger for Blood\n+            if (IsSpellReady(HUNGER_FOR_BLOOD_1, diff) && !shadowdance && HasRole(BOT_ROLE_DPS) && Rand() < 50 && dist < 30 &&\n+                mytar->HasAuraState(AURA_STATE_BLEEDING) && energy >= ecost(HUNGER_FOR_BLOOD_1) &&\n+                !me->GetAuraEffect(SPELL_AURA_MOD_DAMAGE_PERCENT_DONE, SPELLFAMILY_ROGUE, 0x0, 0x1000000, 0x0))\n+            {\n+                if (doCast(mytar, GetSpell(HUNGER_FOR_BLOOD_1)))\n+                    return;\n+            }\n+            //Premeditation\n+            if (IsSpellReady(PREMEDITATION_1, diff, false) && (stealthed || shadowdance) &&\n+                HasRole(BOT_ROLE_DPS) && comboPoints < 4 && dist < 15 &&\n+                (comboPoints == 0 || mytar->GetHealth() > me->GetMaxHealth() / 4))\n+            {\n+                if (doCast(mytar, GetSpell(PREMEDITATION_1)))\n+                {}\n+            }\n+            //Kick\n+            if (IsSpellReady(KICK_1, diff, false) && !stealthed && dist <= 5 && Rand() < 70 &&\n+                energy >= ecost(KICK_1) && mytar->IsNonMeleeSpellCast(false,false,true))\n+            {\n+                if (doCast(mytar, GetSpell(KICK_1)))\n+                    getenergy();\n+            }\n+            //Killing Spree\n+            if (IsSpellReady(KILLING_SPREE_1, diff) && !stealthed && !shadowdance && HasRole(BOT_ROLE_DPS) &&\n+                Rand() < (70 - energy) && dist < 10 && GetHealthPCT(me) > 25 && (!CCed(mytar) || dist > 5) &&\n+                (mytar->getAttackers().size() < 4 || mytar->GetMaxHealth() > me->GetMaxHealth() * 2) &&\n+                (mytar->GetHealth() > me->GetMaxHealth() / 2 || me->getAttackers().size() > 1))\n+            {\n+                if (doCast(mytar, GetSpell(KILLING_SPREE_1)))\n+                    return;\n+            }\n+             //Gouge: if mytar is trying to attack/cast on us he will always try to face us\n+            if (IsSpellReady(GOUGE_1, diff) && !stealthed && !shadowdance && HasRole(BOT_ROLE_DPS) && dist <= 5 &&\n+                Rand() < 30 && !CCed(mytar) && energy >= ecost(GOUGE_1) &&\n+                ((energy < 55 && mytar->getAttackers().size() <= 1 && !mytar->HasAuraType(SPELL_AURA_PERIODIC_DAMAGE)) ||\n+                mytar->IsNonMeleeSpellCast(false,false,true)) && mytar->HasInArc(float(M_PI), me))\n+            {\n+                if (doCast(mytar, GetSpell(GOUGE_1)))\n+                    return;\n+            }\n+            //Blind: in pvp only for restealth\n+            if (IsSpellReady(BLIND_1, diff) && !stealthed && !shadowdance && dist <= 15 && Rand() < 30 &&\n+                !CCed(mytar) && !mytar->IsTotem() && energy >= ecost(BLIND_1) &&\n+                ((energy <= 30 && mytar->GetTarget() == me->GetGUID() &&\n+                mytar->getAttackers().size() <= 1 &&\n+                !mytar->HasAuraType(SPELL_AURA_PERIODIC_DAMAGE) &&\n+                !me->HasAuraType(SPELL_AURA_PERIODIC_DAMAGE)) ||\n+                (mytar->IsCreature() && !IsSpellReady(KICK_1, diff) && !IsSpellReady(GOUGE_1, diff) &&\n+                mytar->IsNonMeleeSpellCast(false,false,true))))\n+            {\n+                if (doCast(mytar, GetSpell(BLIND_1)))\n+                    return;\n+            }\n+            //Blade Flurry\n+            if (IsSpellReady(BLADE_FLURRY_1, diff) && HasRole(BOT_ROLE_DPS) && !stealthed && !shadowdance &&\n+                dist <= 5 && Rand() < 50 && energy >= ecost(BLADE_FLURRY_1) && !CCed(mytar) &&\n+                !me->GetAuraEffect(SPELL_AURA_MOD_MELEE_HASTE, SPELLFAMILY_ROGUE, 0x40000000, 0x800, 0x0) &&\n+                (mytar->IsPlayer() || mytar->GetHealth() > me->GetHealth() || FindSplashTarget(7, mytar)))\n+            {\n+                if (doCast(me, GetSpell(BLADE_FLURRY_1)))\n+                    return;\n+            }\n+            //Slice and Dice\n+            if (IsSpellReady(SLICE_DICE_1, diff) && !shadowdance && HasRole(BOT_ROLE_DPS) && comboPoints > 0 &&\n+                Rand() < 110 && energy >= ecost(SLICE_DICE_1) && dist < 10 &&\n+                (me->getAttackers().size() <= 1 || !IsSpellReady(BLADE_FLURRY_1, diff)) &&\n+                !me->GetAuraEffect(SPELL_AURA_MOD_MELEE_HASTE, SPELLFAMILY_ROGUE, 0x40000, 0x0, 0x0))\n+            {\n+                if (doCast(mytar, GetSpell(SLICE_DICE_1)))\n+                    return;\n+            }\n+            //Dismantle\n+            if (IsSpellReady(DISMANTLE_1, diff) && !stealthed && !shadowdance &&\n+                mytar->GetHealth() >= me->GetHealth() / 2 && energy >= ecost(DISMANTLE_1) && dist <= 5 &&\n+                !CCed(mytar) && Rand() < (30 + 90*mytar->HasAuraType(SPELL_AURA_ALLOW_ONLY_ABILITY)) &&\n+                !mytar->HasAuraType(SPELL_AURA_MOD_DISARM) &&\n+                (mytar->IsPlayer() ?\n+                mytar->ToPlayer()->GetWeaponForAttack(BASE_ATTACK) && mytar->ToPlayer()->IsUseEquipedWeapon(true) :\n+                mytar->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID) && mytar->CanUseAttackType(BASE_ATTACK)))\n+            {\n+                if (doCast(mytar, GetSpell(DISMANTLE_1)))\n+                    return;\n+            }\n+            //Shadowstep\n+            if (IsSpellReady(SHADOWSTEP_1, diff, false) && !IsTank() && HasRole(BOT_ROLE_DPS) &&\n+                Rand() < 50 && dist < 25 && energy >= ecost(SHADOWSTEP_1) &&\n+                (!mytar->IsPlayer() || dist > 12 || CCed(me, true)) &&\n+                (mytar->IsPlayer() || mytar->GetVictim() != me) &&\n+                ((!stealthed && !shadowdance) || me->HasAuraWithMechanic(1u<<MECHANIC_SNARE)))\n+            {\n+                if (doCast(mytar, GetSpell(SHADOWSTEP_1)))\n+                    getenergy();\n+            }\n+            //Sprint (no GCD)\n+            if (IsSpellReady(SPRINT_1, diff, false) && !HasBotCommandState(BOT_COMMAND_STAY) &&\n+                ((me->GetLevel() >= 20 && CCed(me, true) && Rand() < 35) ||\n+                (Rand() < (25 + 10*stealthed + 40*shadowdance) && dist > (20 - (5*stealthed + 10*shadowdance)))) &&\n+                !me->GetAuraEffect(SPELL_AURA_MOD_INCREASE_SPEED, SPELLFAMILY_ROGUE, 0x40, 0x0, 0x0))\n+            {\n+                if (doCast(me, GetSpell(SPRINT_1)))\n+                {}\n+            }\n+            //Evasion (no GCD)\n+            if (IsSpellReady(EVASION_1, diff, false) && !stealthed && Rand() < 65 && !me->getAttackers().empty() &&\n+                GetHealthPCT(me) < 65 + 10 * me->getAttackers().size() &&\n+                !me->GetAuraEffect(SPELL_AURA_MOD_DODGE_PERCENT, SPELLFAMILY_ROGUE, 0x20, 0x0, 0x0))\n+            {\n+                if (doCast(me, GetSpell(EVASION_1)))\n+                    return; //custom: do not skip animation\n+            }\n+            //Deadly Throw\n+            if (IsSpellReady(DEADLY_THROW_1, diff) && !stealthed && !shadowdance && HasRole(BOT_ROLE_DPS) &&\n+                comboPoints > 0 && Rand() < 55 && dist < 30 && dist > 5 && energy >= ecost(DEADLY_THROW_1) &&\n+                ((_spec != BOT_SPEC_ROGUE_COMBAT) || mytar->IsNonMeleeSpellCast(false,false,true)))\n+            {\n+                Item const* thrown = GetEquips(BOT_SLOT_RANGED);\n+                if (thrown && thrown->GetTemplate()->Class == ITEM_CLASS_WEAPON &&\n+                    thrown->GetTemplate()->SubClass == ITEM_SUBCLASS_WEAPON_THROWN &&\n+                    doCast(mytar, GetSpell(DEADLY_THROW_1)))\n+                    return;\n+            }\n+\n+            //if target is affected by gouge or blind just try to regen some energy\n+            bool hasnormalstun = false;\n+            int32 duration = 0;\n+            //sizes of theese are typically 1, sometimes maybe 2\n+            for (AuraEffect const* aeff : mytar->GetAuraEffectsByType(SPELL_AURA_MOD_STUN))\n+            {\n+                if (!(aeff->GetSpellInfo()->AuraInterruptFlags & AURA_INTERRUPT_FLAG_TAKE_DAMAGE) && \n+                    aeff->GetBase()->GetDuration() > 2000)\n+                {\n+                    hasnormalstun = true;\n+                    break;\n+                }\n+                if (aeff->GetBase()->GetDuration() > duration)\n+                    duration = aeff->GetBase()->GetDuration();\n+            }\n+            if (!hasnormalstun)\n+            {\n+                for (AuraEffect const* aeff : mytar->GetAuraEffectsByType(SPELL_AURA_MOD_CONFUSE))\n+                {\n+                    if (!(aeff->GetSpellInfo()->AuraInterruptFlags & AURA_INTERRUPT_FLAG_TAKE_DAMAGE) &&\n+                        aeff->GetBase()->GetDuration() > 2000)\n+                    {\n+                        hasnormalstun = true;\n+                        break;\n+                    }\n+                    if (aeff->GetBase()->GetDuration() > duration)\n+                        duration = aeff->GetBase()->GetDuration();\n+                }\n+            }\n+\n+            if (mytar->IsControlledByPlayer() || me->GetHealthPct() < 25.f)\n+            {\n+                //Vanish (no GCD)\n+                if (IsSpellReady(VANISH_1, diff, false) && !stealthed && !shadowdance && !IsTank() && Rand() < 45 && !me->HasAuraType(SPELL_AURA_PERIODIC_DAMAGE) && !IsFlagCarrier(me))\n+                {\n+                    bool cast = false;\n+                    //case 1: restealth for opener\n+                    if (!hasnormalstun && duration < 500 && me->IsInCombat() && dist <= 5)\n+                        cast = true;\n+                    //case 2: evade casted spell\n+                    if (!cast)\n+                    {\n+                        if (Spell const* spell = mytar->GetCurrentSpell(CURRENT_GENERIC_SPELL))\n+                        {\n+                            if (spell->m_targets.GetUnitTarget() == me && spell->GetTimer() < 500 &&\n+                                spell->GetSpellInfo()->HasEffect(SPELL_EFFECT_SCHOOL_DAMAGE))\n+                                cast = true;\n+                        }\n+                    }\n+                    //case 3: reset threat / evade in CheckVanish (regardless of mytar availability)\n+                    if (cast && doCast(me, GetSpell(VANISH_1)))\n+                        return; //custom: do not skip animation\n+                }\n+            }\n+\n+            if (dist > 5)\n+            {\n+                //if (mytar->IsPolymorphed())\n+                //    BOT_LOG_ERROR(\"entities.player\", \"rogue_bot: cannot attack target (dist)...\");\n+                return;\n+            }\n+\n+            MoveBehind(mytar);\n+\n+            if (IsSpellReady(THISTLE_TEA, diff, false) && !hasnormalstun && duration < 1000 &&\n+                energy <= std::max<int32>(me->GetMaxPower(POWER_ENERGY) - 110, 10))\n+            {\n+                if (doCast(me, THISTLE_TEA))\n+                    getenergy();\n+            }\n+\n+            //No IsSpellReady checks for spells with no cd below\n+            if (GC_Timer > diff)\n+                return;\n+\n+            //Feint\n+            if (mytar->CanHaveThreatList())\n+            {\n+                if (IsSpellReady(FEINT_1, diff) && !stealthed && !IsTank() && mytar->GetVictim() == me && Rand() < 35 &&\n+                    energy >= ecost(FEINT_1) && int32(mytar->GetThreatManager().GetThreatListSize()) > 1 &&\n+                    int32(mytar->getAttackers().size()) > 1)\n+                {\n+                    if (doCast(mytar, GetSpell(FEINT_1)))\n+                        return;\n+                }\n+            }\n+\n+            //Adrenaline Rush\n+            if (GetSpell(ADRENALINE_RUSH_1) && !stealthed && !shadowdance && HasRole(BOT_ROLE_DPS) && (hasnormalstun || duration < 1300) && Rand() < 40 &&\n+                energy < 50 && GetHealthPCT(me) > 35 &&\n+                (mytar->getAttackers().size() < 3 || mytar->GetMaxHealth() > me->GetMaxHealth() * 2) &&\n+                (mytar->GetHealth() > me->GetMaxHealth() / 2 || me->getAttackers().size() > 1))\n+            {\n+                if (doCast(me, GetSpell(ADRENALINE_RUSH_1)))\n+                    return;\n+            }\n+\n+            DiminishingLevels const stunDivider = mytar->GetDiminishing(DIMINISHING_OPENING_STUN);\n+\n+            bool hasHunger = me->GetAuraEffect(SPELL_AURA_MOD_DAMAGE_PERCENT_DONE, SPELLFAMILY_ROGUE, 0x0, 0x1000000, 0x0);\n+\n+            //Rupture: little troll with applying rupture on target without breaking gouge (creatures only, pvp - restealth)\n+            if (GetSpell(RUPTURE_1) && !stealthed && !shadowdance && HasRole(BOT_ROLE_DPS) &&\n+                comboPoints > ((hasHunger || !GetSpell(HUNGER_FOR_BLOOD_1)) ? 1 : 0) &&\n+                !(hasHunger && GetSpec() == BOT_SPEC_ROGUE_ASSASINATION && GetSpell(ENVENOM_1)) &&\n+                (hasnormalstun || (mytar->CanHaveThreatList() && duration < 2000)) &&\n+                (comboPoints < 4 || !GetSpell(KIDNEY_SHOT_1) || stunDivider > DIMINISHING_LEVEL_2) &&\n+                energy >= ecost(RUPTURE_1) && mytar->GetHealth() > me->GetMaxHealth() / 4 * (1 + mytar->getAttackers().size()) &&\n+                Rand() < (40 + 40 * (mytar->IsPlayer() && IsMeleeClass(mytar->GetClass()))) &&\n+                !mytar->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_ROGUE, 0x100000, 0x0, 0x0, me->GetGUID()))\n+            {\n+                if (doCast(mytar, GetSpell(RUPTURE_1)))\n+                    return;\n+            }\n+\n+            if (!hasnormalstun && duration > 300 && uint32(energy) < me->GetMaxPower(POWER_ENERGY))\n+            {\n+                //BOT_LOG_ERROR(\"entities.player\", \"bot_rogue: delaying attacks on gouged or blinded target...\");\n+                return;\n+            }\n+\n+            //Finishers\n+            if (comboPoints > 0)\n+            {\n+                //Kidney Shot\n+                if (GetSpell(KIDNEY_SHOT_1) && !stealthed && stunDivider < DIMINISHING_LEVEL_4 &&\n+                    Rand() < 80 && !CCed(mytar) && !mytar->IsImmunedToSpell(sSpellMgr->GetSpellInfo(KIDNEY_SHOT_1), me) &&\n+                    ((comboPoints >= 4 && stunDivider < DIMINISHING_LEVEL_3 &&\n+                    (mytar->GetHealth() > me->GetMaxHealth() / 2 || mytar->IsPlayer())) ||\n+                    mytar->IsNonMeleeSpellCast(false,false,true)) &&\n+                    energy >= ecost(KIDNEY_SHOT_1))\n+                {\n+                    if (doCast(mytar, GetSpell(KIDNEY_SHOT_1)))\n+                        return;\n+                }\n+                //Envenom / Eviscerate\n+                uint32 envescerate = (GetSpec() == BOT_SPEC_ROGUE_ASSASINATION && GetSpell(ENVENOM_1) &&\n+                    (mytar->GetHealth() > me->GetMaxHealth() / 5 || !GetSpell(EVISCERATE_1))) ? ENVENOM_1 : GetSpell(EVISCERATE_1) ? EVISCERATE_1 : 0;\n+                if (envescerate && IsSpellReady(envescerate, diff) && !stealthed && !shadowdance && HasRole(BOT_ROLE_DPS) &&\n+                    (comboPoints >= 4  || (envescerate == EVISCERATE_1 && mytar->GetHealth() < me->GetMaxHealth() / 4)) &&\n+                    (envescerate != ENVENOM_1 ||\n+                    (mytar->GetAuraEffect(SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE, SPELLFAMILY_ROGUE, 0x10000, 0x0, 0x0, me->GetGUID()) &&\n+                    (energy >= 110 || !me->HasAuraTypeWithFamilyFlags(SPELL_AURA_ADD_FLAT_MODIFIER, SPELLFAMILY_ROGUE, 0x800000)))) &&\n+                    energy >= ecost(envescerate) && Rand() < (70 + comboPoints * 20))\n+                {\n+                    //Cold Blood (no GCD)\n+                    if (IsSpellReady(COLD_BLOOD_1, diff, false) && comboPoints > 3 && Rand() > 50 + 100*(comboPoints == 5))\n+                        if (doCast(me, GetSpell(COLD_BLOOD_1)))\n+                        {}\n+                    if (doCast(mytar, GetSpell(envescerate)))\n+                        return;\n+                }\n+            }\n+\n+            //Shadow Dance: if have energy or under effect of Adrenaline Rush\n+            if (IsSpellReady(SHADOW_DANCE_1, diff, false) && !stealthed && HasRole(BOT_ROLE_DPS) && Rand() < 55 &&\n+                GetHealthPCT(me) > 40 && (stunDivider == DIMINISHING_LEVEL_1 || CCed(mytar)) &&\n+                (energy >= 60 || (energy >= 40 && me->GetAuraEffect(SPELL_AURA_MOD_POWER_REGEN_PERCENT, SPELLFAMILY_ROGUE, 0x0, 0x80, 0x0))) &&\n+                (mytar->IsPlayer() || mytar->GetHealth() > (me->GetMaxHealth() / 4) * mytar->getAttackers().size()))\n+            {\n+                if (doCast(me, GetSpell(SHADOW_DANCE_1)))\n+                {}\n+            }\n+\n+            //Openers\n+            if (stealthed || shadowdance)\n+            {\n+                uint32 opener =\n+                    GetSpell(CHEAP_SHOT_1) &&\n+                    !mytar->HasAuraType(SPELL_AURA_MOD_STUN) && stunDivider < DIMINISHING_LEVEL_3 &&\n+                    (mytar->IsPlayer() || (!IAmFree() && master->GetNpcBotsCount() > 1)) ? CHEAP_SHOT_1 :\n+                    GetSpell(GARROTE_1) && HasRole(BOT_ROLE_DPS) && mytar->GetHealth() > me->GetMaxHealth() / 4 &&\n+                    !IsImmunedToMySpellEffect(mytar, sSpellMgr->GetSpellInfo(GARROTE_1), EFFECT_0) &&\n+                    (!isdaggerMH || (mytar->IsPlayer() &&\n+                    (mytar->GetClass() == CLASS_MAGE || mytar->GetClass() == CLASS_PRIEST || mytar->GetClass() == CLASS_WARLOCK))) &&\n+                    !mytar->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_ROGUE, 0x100, 0x0, 0x0, me->GetGUID()) ? GARROTE_1 :\n+                    GetSpell(AMBUSH_1) && HasRole(BOT_ROLE_DPS) && isdaggerMH ? AMBUSH_1 :\n+                    GetSpell(BACKSTAB_1) && HasRole(BOT_ROLE_DPS) && isdaggerMH ? BACKSTAB_1 : 0;\n+\n+                //all opener spells disabled/unusable\n+                if (!opener)\n+                {\n+                    if (stealthed && HasRole(BOT_ROLE_DPS))\n+                        me->RemoveAurasByType(SPELL_AURA_MOD_STEALTH);\n+                    //if (shadowdance)\n+                    //    me->RemoveAurasByType(SPELL_AURA_MOD_IGNORE_SHAPESHIFT);\n+\n+                    return;\n+                }\n+                //openers from behind (backstab too)\n+                if (opener != CHEAP_SHOT_1 && mytar->HasInArc(float(M_PI), me))\n+                    return;\n+\n+                //We do not check combo points amount\n+                if (energy >= ecost(opener))\n+                {\n+                    if (doCast(mytar, GetSpell(opener)))\n+                        return;\n+                }\n+\n+                return;\n+            }\n+\n+            if (!HasRole(BOT_ROLE_DPS))\n+                return;\n+\n+            //Fan of Knives\n+            if (GetSpell(FAN_OF_KNIVES_1) && energy >= ecost(FAN_OF_KNIVES_1) &&\n+                Rand() < 35\n+                + 40*(me->GetAuraEffect(SPELL_AURA_MOD_POWER_REGEN_PERCENT, SPELLFAMILY_ROGUE, 0x0, 0x80, 0x0) != nullptr)\n+                + 50*(me->GetAuraEffect(SPELL_AURA_MOD_MELEE_HASTE, SPELLFAMILY_ROGUE, 0x40000000, 0x0, 0x0) != nullptr)\n+                /*Adrenaline Rush and Blade Flurry*/)\n+            {\n+                std::list<Unit*> targets;\n+                GetNearbyTargetsList(targets, 7.f, 1);\n+                if (targets.size() > 2 && doCast(me, GetSpell(FAN_OF_KNIVES_1)))\n+                    return;\n+            }\n+\n+            //Combo points generating\n+            //Riposte: only after parry\n+            if (IsSpellReady(RIPOSTE_1, diff) && comboPoints < 5 && me->HasReactive(REACTIVE_DEFENSE) &&\n+                energy >= ecost(RIPOSTE_1))\n+            {\n+                if (doCast(mytar, GetSpell(RIPOSTE_1)))\n+                    return;\n+            }\n+            //Ghostly Strike: tank mode only\n+            if (IsSpellReady(GHOSTLY_STRIKE_1, diff) && comboPoints < 5 && IsTank() && !me->getAttackers().empty() &&\n+                energy >= ecost(GHOSTLY_STRIKE_1))\n+            {\n+                if (doCast(mytar, GetSpell(GHOSTLY_STRIKE_1)))\n+                    return;\n+            }\n+            //Hemorrhage: does not stack from different casters\n+            if (GetSpell(HEMORRHAGE_1) && !isdaggerMH && comboPoints < 5 && !IsTank() && energy >= ecost(HEMORRHAGE_1) &&\n+                !mytar->GetAuraEffect(SPELL_AURA_MOD_DAMAGE_TAKEN, SPELLFAMILY_ROGUE, 0x800000, 0x0, 0x0))\n+            {\n+                if (doCast(mytar, GetSpell(HEMORRHAGE_1)))\n+                    return;\n+            }\n+            //Sinister Strike: tank mode\n+            if (GetSpell(SINISTER_STRIKE_1) && comboPoints < 5 &&\n+                (!isdaggerMH || IsTank() || (mytar->GetVictim() == me && energy >= 60 && mytar->HasInArc(float(M_PI), me)) || !GetSpell(BACKSTAB_1)) &&\n+                energy >= ecost(SINISTER_STRIKE_1))\n+            {\n+                if (doCast(mytar, GetSpell(SINISTER_STRIKE_1)))\n+                    return;\n+            }\n+            //Backstab/Mutilate\n+            uint32 mutistab =\n+                isdaggerMH && isdaggerOH && GetSpell(MUTILATE_1) ? MUTILATE_1 :\n+                isdaggerMH && GetSpell(BACKSTAB_1) ? BACKSTAB_1 : 0;\n+            if (mutistab && comboPoints < 4 && energy >= ecost(mutistab) && (mutistab == MUTILATE_1 || !mytar->HasInArc(float(M_PI), me)))\n+            {\n+                if (doCast(mytar, GetSpell(mutistab)))\n+                    return;\n+            }\n+        }\n+\n+        void BreakCC(uint32 diff) override\n+        {\n+            if (me->IsInCombat() && Rand() < 25)\n+            {\n+                bool canVanish = IsSpellReady(VANISH_1, diff, false) && !IsFlagCarrier(me);\n+                bool canSprint = (GetSpec() == BOT_SPEC_ROGUE_COMBAT) && me->GetLevel() >= 25 && !HasBotCommandState(BOT_COMMAND_STAY) && IsSpellReady(SPRINT_1, diff, false);\n+                if ((canVanish || canSprint) && me->HasAuraWithMechanic((1u<<MECHANIC_SNARE)|(1u<<MECHANIC_ROOT)))\n+                {\n+                    uint32 Spanish = canSprint ? SPRINT_1 : VANISH_1;\n+                    if (doCast(me, GetSpell(Spanish)))\n+                        return;\n+                }\n+            }\n+            bot_ai::BreakCC(diff);\n+        }\n+\n+        void DoNonCombatActions(uint32 diff)\n+        {\n+            if (GC_Timer > diff || me->IsMounted() || IsCasting() || Rand() > 25)\n+                return;\n+\n+            if (mhEnchantExpireTimer > 0 && mhEnchantExpireTimer <= diff)\n+                RemoveItemClassEnchantment(BOT_SLOT_MAINHAND);\n+            if (ohEnchantExpireTimer > 0 && ohEnchantExpireTimer <= diff)\n+                RemoveItemClassEnchantment(BOT_SLOT_OFFHAND);\n+\n+            // Weapon Enchants\n+            if (me->isMoving())\n+                return;\n+            uint8 lvl = me->GetLevel();\n+            if (lvl < 20)\n+                return;\n+\n+            Item* mhWeapon = GetEquips(BOT_SLOT_MAINHAND);\n+            Item* ohWeapon = GetEquips(BOT_SLOT_OFFHAND);\n+\n+            bool mhReady = mhWeapon && !mhWeapon->GetEnchantmentId(TEMP_ENCHANTMENT_SLOT);\n+            bool ohReady = ohWeapon && !ohWeapon->GetEnchantmentId(TEMP_ENCHANTMENT_SLOT);\n+            if (!mhReady && !ohReady)\n+                return; //no ecnhantable weapons\n+\n+            //OK choose the poisons\n+            //MH 20+ Instant, 32+ Wound, envenom Instant\n+            //OH 20+ Crippling, 40+ Instant (deadly brew inc), 68+ Anesthetic, envenom Deadly\n+            if (needChooseMHEnchant && mhReady)\n+                mhEnchant = (GetSpec() == BOT_SPEC_ROGUE_ASSASINATION && GetSpell(ENVENOM_1)) ? INSTANT_POISON_1 :\n+                    lvl >= 32 ? WOUND_POISON_1 :\n+                    lvl >= 20 ? INSTANT_POISON_1 : 0;\n+\n+            if (needChooseOHEnchant && ohReady)\n+                ohEnchant = (GetSpec() == BOT_SPEC_ROGUE_ASSASINATION && GetSpell(ENVENOM_1)) ? DEADLY_POISON_1 :\n+                    lvl >= 68 ? ANESTHETIC_POISON_1 :\n+                    lvl >= 40 ? INSTANT_POISON_1 :\n+                    lvl >= 20 ? CRIPPLING_POISON_1 : 0;\n+\n+            uint32 MhPoison = !mhReady ? 0 : GetSpell(mhEnchant);\n+            uint32 OhPoison = !ohReady ? 0 : GetSpell(ohEnchant);\n+\n+            SpellInfo const* MhPoisonInfo = mhReady && MhPoison ? sSpellMgr->GetSpellInfo(MhPoison) : nullptr;\n+            SpellInfo const* OhPoisonInfo = ohReady && OhPoison ? sSpellMgr->GetSpellInfo(OhPoison) : nullptr;\n+\n+            Item* targetWeapon = nullptr;\n+            SpellInfo const* targetInfo = nullptr;\n+\n+            if (mhReady && MhPoison && mhWeapon->IsFitToSpellRequirements(MhPoisonInfo))\n+            {\n+                targetWeapon = mhWeapon;\n+                targetInfo = MhPoisonInfo;\n+            }\n+            if (!targetWeapon && ohReady && OhPoison && ohWeapon->IsFitToSpellRequirements(OhPoisonInfo))\n+            {\n+                targetWeapon = ohWeapon;\n+                targetInfo = OhPoisonInfo;\n+            }\n+            if (targetWeapon)\n+            {\n+                Spell* spell = new Spell(me, targetInfo, TRIGGERED_NONE);\n+                SpellCastTargets targets;\n+                targets.SetItemTarget(targetWeapon);\n+                spell->prepare(targets);\n+                return;\n+            }\n+        }\n+\n+        void CheckVanish(uint32 diff)\n+        {\n+            if (!IsSpellReady(VANISH_1, diff, false) || !me->IsInCombat() || me->IsMounted() || IsTank() || Rand() > 50 ||\n+                me->getAttackers().empty() || IsFlagCarrier(me) || me->HasAuraType(SPELL_AURA_MOD_STEALTH) ||\n+                me->HasAuraType(SPELL_AURA_ALLOW_ONLY_ABILITY) || me->HasAuraType(SPELL_AURA_PERIODIC_DAMAGE))\n+                return;\n+\n+            if (GetHealthPCT(me) < 30 + 20*me->getAttackers().size() ||\n+                (!IAmFree() && GetHealthPCT(me) < 70 && master->GetNpcBotsCount() > 1))\n+            {\n+                //Unit* victim = me->GetVictim();\n+                if (doCast(me, GetSpell(VANISH_1)))\n+                    return;\n+            }\n+        }\n+\n+        void CheckCloakOfShadows(uint32 diff)\n+        {\n+            if (!IsSpellReady(CLOAK_OF_SHADOWS_1, diff) || !me->IsInCombat() || me->IsMounted() ||\n+                Rand() > 40 + 60 * me->GetMap()->IsDungeon())\n+                return;\n+\n+            uint32 count = 0;\n+\n+            //dispel debuffs\n+            uint32 const dispelMask = DISPEL_ALL_MASK;\n+            for (auto const& [_, auraApp] : me->GetAppliedAuras())\n+            {\n+                // remove all harmful spells on you...\n+                SpellInfo const* spellInfo = auraApp->GetBase()->GetSpellInfo();\n+                if ((spellInfo->DmgClass == SPELL_DAMAGE_CLASS_MAGIC || (spellInfo->GetDispelMask() & dispelMask)) &&\n+                    !auraApp->IsPositive() && !auraApp->GetBase()->IsPassive())\n+                {\n+                    if (spellInfo->HasAura(SPELL_AURA_PERIODIC_DAMAGE) ||\n+                        spellInfo->HasAura(SPELL_AURA_MOD_SPEED_SLOW_ALL) ||\n+                        spellInfo->HasAura(SPELL_AURA_HASTE_SPELLS))\n+                        if (++count > 1)\n+                            break;\n+                }\n+            }\n+\n+            //defend from enemy cast cast\n+            if (Unit const* target = FindCastingTarget(50))\n+            {\n+                if (Spell const* spell = target->GetCurrentSpell(CURRENT_GENERIC_SPELL))\n+                {\n+                    if (spell->GetTimer() < 1000 && !spell->GetSpellInfo()->IsPassive() && !spell->GetSpellInfo()->IsPositive() &&\n+                        !(spell->GetSpellInfo()->Attributes & (SPELL_ATTR0_ABILITY|SPELL_ATTR0_UNAFFECTED_BY_INVULNERABILITY)))\n+                    {\n+                        //direct spell\n+                        if (spell->m_targets.GetUnitTarget() == me &&\n+                            spell->GetSpellInfo()->DmgClass == SPELL_DAMAGE_CLASS_MAGIC &&\n+                            me->IsWithinLOSInMap(target, LINEOFSIGHT_ALL_CHECKS, VMAP::ModelIgnoreFlags::M2))\n+                        {\n+                            count += 2;\n+                        }\n+                        //area spell\n+                        if ((spell->GetSpellInfo()->_effects[0].IsEffect() &&\n+                            spell->GetSpellInfo()->_effects[0].TargetB.GetSelectionCategory() == TARGET_SELECT_CATEGORY_NEARBY) ||\n+                            (spell->GetSpellInfo()->_effects[1].IsEffect() &&\n+                            spell->GetSpellInfo()->_effects[1].TargetB.GetSelectionCategory() == TARGET_SELECT_CATEGORY_NEARBY))\n+                        {\n+                            count += 2;\n+                        }\n+                    }\n+                }\n+            }\n+\n+            if (!(count > 1))\n+                return;\n+\n+            if (doCast(me, GetSpell(CLOAK_OF_SHADOWS_1)))\n+                return;\n+        }\n+\n+        void CheckBlind(uint32 diff)\n+        {\n+            if (!IsSpellReady(BLIND_1, diff) || !me->IsInCombat() || me->IsMounted() || IsTank() || Rand() > 40 ||\n+                me->HasAuraType(SPELL_AURA_MOD_STEALTH) || me->HasAuraType(SPELL_AURA_ALLOW_ONLY_ABILITY) ||\n+                IsSpellReady(BLADE_FLURRY_1, diff, false) || IsSpellReady(EVASION_1, diff, false) ||\n+                me->GetAuraEffect(SPELL_AURA_MOD_DODGE_PERCENT, SPELLFAMILY_ROGUE, 0x20, 0x0, 0x0) ||//evasion\n+                me->GetAuraEffect(SPELL_AURA_MOD_MELEE_HASTE, SPELLFAMILY_ROGUE, 0x40000000, 0x800, 0x0))\n+                return;\n+\n+            Unit* u = FindStunTarget(15); //improved always (base 10, improved 15)\n+            if (!u)\n+                u = FindCastingTarget(15, 0, BLIND_1);\n+\n+            if (u && doCast(u, GetSpell(BLIND_1)))\n+                return;\n+        }\n+\n+        void CheckPreparation(uint32 diff)\n+        {\n+            if (!IsSpellReady(PREPARATION_1, diff) || !me->IsInCombat() || me->IsMounted() || Rand() > 30)\n+                return;\n+\n+            //TODO: recheck priorities\n+            uint32 needFactor = 0;\n+            uint32 cooldown;\n+            cooldown = GetSpellCooldown(EVASION_1);\n+            needFactor += !cooldown ? 0 : 3 * cooldown / 1200; //1-100 x3\n+            cooldown = GetSpellCooldown(SPRINT_1);\n+            needFactor += !cooldown ? 0 : 1 * cooldown / 1200; //1-100\n+            cooldown = GetSpellCooldown(VANISH_1);\n+            needFactor += !cooldown ? 0 : 3 * cooldown / 1200; //1-100 x3\n+            cooldown = GetSpellCooldown(COLD_BLOOD_1);\n+            needFactor += !cooldown ? 0 : 2 * cooldown / 1800; //1-100 x2\n+            cooldown = GetSpellCooldown(SHADOWSTEP_1);\n+            needFactor += !cooldown ? 0 : 2 * cooldown / 200;  //1-100 x2\n+            cooldown = GetSpellCooldown(BLADE_FLURRY_1);\n+            needFactor += !cooldown ? 0 : 1 * cooldown / 1200; //1-100\n+            cooldown = GetSpellCooldown(DISMANTLE_1);\n+            needFactor += !cooldown ? 0 : 1 * cooldown / 600;  //1-100\n+            //0-1300\n+            //ignore Kick\n+\n+            if (needFactor >= 800 && doCast(me, GetSpell(PREPARATION_1)))\n+                return;\n+        }\n+\n+        void CheckTricksOfTheTrade(uint32 diff)\n+        {\n+            if (!IsSpellReady(TRICKS_OF_THE_TRADE_1, diff) || !me->IsInCombat() || me->IsMounted() || IAmFree() ||\n+                IsTank() || Rand() > 30 || !me->GetMap()->IsDungeon() ||\n+                me->HasAuraType(SPELL_AURA_MOD_STEALTH) || me->HasAuraType(SPELL_AURA_ALLOW_ONLY_ABILITY))\n+                return;\n+\n+            Group const* group = master->GetGroup();\n+            if (!group)\n+                return;\n+            Unit* victim = me->GetVictim();\n+            if (!victim)\n+                return;\n+\n+            Unit* target = nullptr;\n+            for (GroupReference const* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())\n+            {\n+                Player* player = itr->GetSource();\n+                if (!player || !player->IsInWorld() || !player->IsAlive() || me->GetMap() != player->FindMap() ||\n+                    me->GetDistance(player) > 20)\n+                    continue;\n+\n+                if (IsTank(player) || player->GetVictim() == victim)\n+                {\n+                    if (!victim->CanHaveThreatList() ||\n+                        victim->GetThreatManager().GetThreat(player) < victim->GetThreatManager().GetThreat(me) * 0.75f)\n+                    {\n+                        target = player;\n+                        break;\n+                    }\n+                }\n+            }\n+\n+            if (target)\n+                if (doCast(target, GetSpell(TRICKS_OF_THE_TRADE_1)))\n+                    return;\n+        }\n+\n+        void CheckSprint(uint32 diff)\n+        {\n+            if (!IsSpellReady(SPRINT_1, diff) || (!IAmFree() && !HasBotCommandState(BOT_COMMAND_FOLLOW)) || Rand() > 35 || me->IsMounted())\n+                return;\n+\n+            if (IAmFree())\n+            {\n+                InstanceTemplate const* instt = sObjectMgr->GetInstanceTemplate(me->GetMap()->GetId());\n+                bool map_allows_mount = (!me->GetMap()->IsDungeon() || me->GetMap()->IsBattlegroundOrArena()) && (!instt || instt->AllowMount);\n+                if (me->HasUnitMovementFlag(MOVEMENTFLAG_FORWARD) &&\n+                    (!me->GetVictim() ? (!map_allows_mount || me->IsInCombat() || IsFlagCarrier(me)) : !me->IsWithinDist(me->GetVictim(), 8.0f)))\n+                {\n+                    if (doCast(me, GetSpell(SPRINT_1)))\n+                        return;\n+                }\n+\n+                return;\n+            }\n+\n+            if (me->GetExactDist2d(master) > std::max<uint8>(master->GetBotMgr()->GetBotFollowDist(), 45))\n+            {\n+                if (doCast(me, GetSpell(SPRINT_1)))\n+                    return;\n+            }\n+        }\n+\n+        void ApplyClassSpellCritMultiplierAll(Unit const* /*victim*/, float& crit_chance, SpellInfo const* spellInfo, SpellSchoolMask /*schoolMask*/, WeaponAttackType /*attackType*/) const override\n+        {\n+            if (spellInfo->DmgClass != SPELL_DAMAGE_CLASS_MELEE)\n+                return;\n+\n+            //uint32 spellId = spellInfo->Id;\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+\n+            //Cold Blood\n+            if (AuraEffect const* bloo = me->GetAuraEffect(COLD_BLOOD_1, 0, me->GetGUID()))\n+                if (bloo->IsAffectingSpell(spellInfo))\n+                    crit_chance += 100.f;\n+\n+            //Puncturing Wounds:\n+            if (lvl >= 15)\n+            {\n+                //30% additional critical chance for Backstab\n+                if (baseId == BACKSTAB_1)\n+                    crit_chance += 30.f;\n+                //Puncturing Wounds: 15% additional critical chance for Mutilate\n+                else if (baseId == MUTILATE_1 ||\n+                    baseId == MUTILATE_DAMAGE_MAINHAND_1 || baseId == MUTILATE_DAMAGE_OFFHAND_1)\n+                    crit_chance += 15.f;\n+            }\n+            //Glyph of Eviscerate: 10% additional critical chance for Eviscerate\n+            if (lvl >= 15 && baseId == EVISCERATE_1)\n+                crit_chance += 10.f;\n+            //Improved Ambush: 50% additional critical chance for Ambush\n+            if ((GetSpec() == BOT_SPEC_ROGUE_SUBTLETY) && lvl >= 25 && baseId == AMBUSH_1)\n+                crit_chance += 50.f;\n+            //Turn the Tables:\n+            if (lvl >= 50 &&\n+                ((spellInfo->SpellFamilyFlags[0] & 0x2600070E) || (spellInfo->SpellFamilyFlags[1] & 0x7900106)) &&\n+                me->GetAuraEffect(SPELL_AURA_ADD_FLAT_MODIFIER, SPELLFAMILY_ROGUE, 0x0, 0x200000, 0x0))\n+                crit_chance += 6.f;\n+            //Remorseless Attacks:\n+            if (AuraEffect const* remo = me->GetAuraEffect(REMORSELESS_ATTACKS_BUFF, 0, me->GetGUID()))\n+                if (remo->IsAffectingSpell(spellInfo))\n+                    crit_chance += 40.f;\n+        }\n+\n+        void ApplyClassDamageMultiplierMeleeSpell(int32& damage, SpellNonMeleeDamage& /*damageinfo*/, SpellInfo const* spellInfo, WeaponAttackType /*attackType*/, bool iscrit) const override\n+        {\n+            //uint32 spellId = spellInfo->Id;\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+            float fdamage = float(damage);\n+\n+            //apply bonus damage mods\n+            float pctbonus = 0.0f;\n+            if (iscrit)\n+            {\n+                //!!!Melee spell damage is not yet critical, all reduced by half\n+                //Lethality: 30% crit damage bonus for non-stealth combo-generating abilities (on 25 lvl)\n+                if (lvl >= 25 &&\n+                    (baseId == SINISTER_STRIKE_1 || baseId == BACKSTAB_1 || baseId == MUTILATE_1 || baseId == RIPOSTE_1 ||\n+                    baseId == GOUGE_1 || baseId == HEMORRHAGE_1 || baseId == GHOSTLY_STRIKE_1\n+                    /*|| baseId == SHIV_1*/ || baseId == MUTILATE_DAMAGE_MAINHAND_1 || baseId == MUTILATE_DAMAGE_OFFHAND_1))\n+                    pctbonus += 0.15f;\n+            }\n+\n+            //DeathDealer set bonus: 15% damage bonus for Eviscerate\n+            if (lvl >= 60 && baseId == EVISCERATE_1)\n+                pctbonus += 0.15f;\n+            //Find Weakness: 6% bonus damage to all abilities\n+            if ((GetSpec() == BOT_SPEC_ROGUE_ASSASINATION) && lvl >= 45)\n+                pctbonus += 0.06f;\n+            //Improved Eviscerate: 20% damage bonus for Eviscerate\n+            if (lvl >= 10 && baseId == EVISCERATE_1)\n+                pctbonus += 0.2f;\n+            //Opportunity: 20% damage bonus for Backstab, Mutilate, Garrote and Ambush\n+            if (lvl >= 10 &&\n+                (baseId == BACKSTAB_1 || baseId == MUTILATE_1 || baseId == MUTILATE_DAMAGE_MAINHAND_1 ||\n+                baseId == MUTILATE_DAMAGE_OFFHAND_1 || baseId == GARROTE_1 || baseId == AMBUSH_1))\n+                pctbonus += 0.2f;\n+            //Aggression: 15% damage bonus for Sinister Strike, Backstab and Eviscerate\n+            if ((GetSpec() == BOT_SPEC_ROGUE_COMBAT) &&\n+                lvl >= 25 && (baseId == SINISTER_STRIKE_1 || baseId == BACKSTAB_1 || baseId == EVISCERATE_1))\n+                pctbonus += 0.15f;\n+            //Blood Spatter: 30% bonus damage for Rupture and Garrote\n+            if (lvl >= 15 && (baseId == RUPTURE_1 || baseId == GARROTE_1))\n+                pctbonus += 0.3f;\n+            //Vile Poisons: 20% damage bonus for Poisons and Envenom\n+            if (lvl >= 25 && ((spellInfo->SpellFamilyFlags[0] & 0x10012000) || (spellInfo->SpellFamilyFlags[1] & 0x18)))\n+                pctbonus += 0.2f;\n+            //Serrated Blades part 2: 30% bonus damage for Rupture\n+            if (lvl >= 20 && baseId == RUPTURE_1)\n+                pctbonus += 0.3f;\n+            //Surprise Attacks: 10% bonus damage for Sinister Strike, Backstab, Shiv, Hemmorhage and Gouge\n+            if ((GetSpec() == BOT_SPEC_ROGUE_COMBAT) &&\n+                lvl >= 50 && (baseId == SINISTER_STRIKE_1 || baseId == BACKSTAB_1 ||\n+                /*baseId == SHIV_1 || */baseId == HEMORRHAGE_1 || baseId == GOUGE_1))\n+                pctbonus += 0.1f;\n+            //Blade Twisting: 10% bonus damage for Sinister Strike and Backstab\n+            if ((GetSpec() == BOT_SPEC_ROGUE_COMBAT) && lvl >= 35 && (baseId == SINISTER_STRIKE_1 || baseId == BACKSTAB_1))\n+                pctbonus += 0.1f;\n+            //Sinister Calling: 10% bonus percentage damage for Backstab and Hemorrhage\n+            //We add bonus damage pct because SpellMods are not handled\n+            if ((GetSpec() == BOT_SPEC_ROGUE_SUBTLETY) && lvl >= 45 && (baseId == BACKSTAB_1 || baseId == HEMORRHAGE_1))\n+                pctbonus += 0.1f;\n+            //Glyph of Fan of Knives: 20% bonus damage for Fan of Knives\n+            if (lvl >= 80 && baseId == FAN_OF_KNIVES_1)\n+                pctbonus += 0.2f;\n+\n+            //Glyph of Sinister Strike: 50% chance to add 1 cp on crit\n+            if (baseId == SINISTER_STRIKE_1)\n+                glyphSSProc = iscrit && lvl >= 15 && urand(1,100) <= 50;\n+\n+            damage = int32(fdamage * (1.0f + pctbonus));\n+        }\n+\n+        void ApplyClassSpellCostMods(SpellInfo const* spellInfo, int32& cost) const override\n+        {\n+            //uint32 spellId = spellInfo->Id;\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            float fcost = float(cost);\n+            int32 flatbonus = 0;\n+            float pctbonus = 0.0f;\n+\n+            //100% mods\n+            //Glyph of Blade Flurry: -100% cost for Blade Flurry\n+            if (lvl >= 30 && baseId == BLADE_FLURRY_1)\n+                pctbonus += 1.0f;\n+\n+            //percent mods\n+            //Dirty Tricks: -50% cost for Blind and Sap\n+            if (lvl >= 15 && (baseId == BLIND_1 || baseId == SAP_1))\n+                pctbonus += 0.5f;\n+\n+            //flat mods\n+            //Improved Expose Armor: -10 energy cost for Expose Armor\n+            if (lvl >= 20 && baseId == EXPOSE_ARMOR_1)\n+                flatbonus += 10;\n+            //Improved Sinister Strike: -5 energy cost for Sinister Strike\n+            if (lvl >= 10 && baseId == SINISTER_STRIKE_1)\n+                flatbonus += 5;\n+            //Dirty Deeds part 1: -20 energy cost for Cheap Shot and Garrote\n+            if ((GetSpec() == BOT_SPEC_ROGUE_SUBTLETY) && lvl >= 30 && (baseId == CHEAP_SHOT_1 || baseId == GARROTE_1))\n+                flatbonus += 20;\n+            //Filthy Tricks part 2: -10 energy cost for Tricks of the Trade, Distract and Shadowstep\n+            if ((GetSpec() == BOT_SPEC_ROGUE_SUBTLETY) &&\n+                lvl >= 50 && (baseId == TRICKS_OF_THE_TRADE_1 || baseId == DISTRACT_1 || baseId == SHADOWSTEP_1))\n+                flatbonus += 10;\n+            //Slaugher from the Shadows part 1: -20 energy cost for Backstab and Ambush\n+            if ((GetSpec() == BOT_SPEC_ROGUE_SUBTLETY) && lvl >= 55 && (baseId == BACKSTAB_1 || baseId == AMBUSH_1))\n+                flatbonus += 20;\n+            //Slaugher from the Shadows part 2: -5 energy cost for Hemorrhage\n+            if ((GetSpec() == BOT_SPEC_ROGUE_SUBTLETY) && lvl >= 55 && baseId == HEMORRHAGE_1)\n+                flatbonus += 5;\n+            //Glyph of Feint: -20 energy cost for Feint\n+            if (lvl >= 16 && baseId == FEINT_1)\n+                flatbonus += 20;\n+            //Glyph of Gouge: -15 energy cost for Gouge\n+            if (lvl >= 15 && baseId == GOUGE_1)\n+                flatbonus += 15;\n+            //Glyph of Mutilate: -5 energy cost for Mutilate\n+            if (lvl >= 50 && baseId == MUTILATE_1)\n+                flatbonus += 5;\n+\n+            //cost can be < 0\n+            cost = int32(fcost * (1.0f - pctbonus)) - flatbonus;\n+        }\n+\n+        void ApplyClassSpellCastTimeMods(SpellInfo const* spellInfo, int32& casttime) const override\n+        {\n+            //casttime is in milliseconds\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            int32 timebonus = 0;\n+            //float pctbonus = 0.0f;\n+\n+            //100% mods\n+            //Improved Slam: -100% cast time for Slam\n+            //if (lvl >= 40 && spellId == GetSpell(SLAM_1) && me->HasAura(BLOODSURGE_BUFF))\n+            //    timebonus += casttime;\n+\n+            //flat mods\n+            //Glyph of Pick Lock: 100% cast time for Pick Lock (reduced for bots)\n+            if (lvl >= 16 && baseId == PICK_LOCK_1)\n+                timebonus += 4000;\n+\n+            casttime = std::max<int32>(casttime - timebonus, 0);\n+        }\n+\n+        void ApplyClassSpellCooldownMods(SpellInfo const* spellInfo, uint32& cooldown) const override\n+        {\n+            //cooldown is in milliseconds\n+            //uint32 spellId = spellInfo->Id;\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            int32 timebonus = 0;\n+            float pctbonus = 0.0f;\n+\n+            //pct mods\n+            //Intensify Rage: -33% cooldown for Bloodrage, Berserker Rage, Recklessness and Death Wish\n+            //if (lvl >= 40 &&\n+            //    (spellId == GetSpell(BLOODRAGE_1) || spellId == GetSpell(BERSERKERRAGE_1) ||\n+            //    spellId == GetSpell(RECKLESSNESS_1) || spellId == GetSpell(DEATHWISH_1)))\n+            //    pctbonus += 0.33f;\n+\n+            //flat mods\n+            //Elusiveness part 2: -60 sec cooldown for Blind\n+            if (lvl >= 20 && baseId == BLIND_1)\n+                timebonus += 60000;\n+            //Elusiveness part 3: -30 sec cooldown for Cloak of Shadows\n+            if (lvl >= 20 && baseId == CLOAK_OF_SHADOWS_1)\n+                timebonus += 30000;\n+            //Filthy Tricks part 1: -10 sec cooldown for Tricks of the Trade, Distract and Shadowstep\n+            if ((GetSpec() == BOT_SPEC_ROGUE_SUBTLETY) &&\n+                lvl >= 50 && (baseId == TRICKS_OF_THE_TRADE_1 || baseId == DISTRACT_1 || baseId == SHADOWSTEP_1))\n+                timebonus += 10000;\n+            //Filthy Tricks part 3: -3 min cooldown for Preparation\n+            if ((GetSpec() == BOT_SPEC_ROGUE_SUBTLETY) && lvl >= 50 && baseId == PREPARATION_1)\n+                timebonus += 180000;\n+            //Glyph of Killing Spree: -45 sec cooldown for Killing Spree\n+            if (lvl >= 60 && baseId == KILLING_SPREE_1)\n+                timebonus += 45000;\n+\n+            cooldown = std::max<int32>((float(cooldown) * (1.0f - pctbonus)) - timebonus, 0);\n+        }\n+\n+        void ApplyClassSpellCategoryCooldownMods(SpellInfo const* spellInfo, uint32& cooldown) const override\n+        {\n+            //cooldown is in milliseconds\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            int32 timebonus = 0;\n+            float pctbonus = 0.0f;\n+\n+            //Endurance: -1 min cooldown for Sprint and Evasion\n+            if (lvl >= 20 && (baseId == SPRINT_1 || baseId == EVASION_1))\n+                timebonus += 60000;\n+            //Elusiveness part 1: -60 sec cooldown for Vanish\n+            if (lvl >= 20 && baseId == VANISH_1)\n+                timebonus += 60000;\n+            //Camouflage part 2: -6 sec cooldown for Stealth\n+            if (lvl >= 15 && baseId == STEALTH_1)\n+                timebonus += 6000;\n+\n+            cooldown = std::max<int32>((float(cooldown) * (1.0f - pctbonus)) - timebonus, 0);\n+        }\n+\n+        void ApplyClassSpellGlobalCooldownMods(SpellInfo const* /*spellInfo*/, float& cooldown) const override\n+        {\n+            //cooldown is in milliseconds\n+            //uint32 spellId = spellInfo->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            //uint8 lvl = me->GetLevel();\n+            float timebonus = 0.0f;\n+            float pctbonus = 0.0f;\n+\n+            //Unrelenting Assault (part 1, special): -0.5 sec global cooldown for Overpower and Revenge (not for tanks)\n+            //if (lvl >= 50 && !IsTank() && (spellId == GetSpell(OVERPOWER_1) || spellId == GetSpell(REVENGE_1)))\n+            //    timebonus += 500.f;\n+\n+            cooldown = (cooldown * (1.0f - pctbonus)) - timebonus;\n+        }\n+\n+        void ApplyClassSpellRadiusMods(SpellInfo const* /*spellInfo*/, float& radius) const override\n+        {\n+            //uint32 spellId = spellInfo->Id;\n+            //uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            //uint8 lvl = me->GetLevel();\n+            float flatbonus = 0.0f;\n+            float pctbonus = 0.0f;\n+\n+            //pct mods\n+            //Booming Voice\n+            //if (lvl >= 10 && ((spellInfo->SpellFamilyFlags[0] & 0x30000) || (spellInfo->SpellFamilyFlags[1] & 0x80)))\n+            //    pctbonus += 1.0f;\n+\n+            //flat mods\n+            //Glyph of Thunder Clap\n+            //if (spellInfo->SpellFamilyFlags[0] & 0x80)\n+            //    flatbonus += 4.f;\n+\n+            radius = radius * (1.0f + pctbonus) + flatbonus;\n+        }\n+\n+        void ApplyClassSpellRangeMods(SpellInfo const* spellInfo, float& maxrange) const override\n+        {\n+            //uint32 spellId = spellInfo->Id;\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            float flatbonus = 0.0f;\n+            float pctbonus = 0.0f;\n+\n+            //pct mods\n+            //Booming Voice\n+            //if (lvl >= 10 && ((spellInfo->SpellFamilyFlags[0] & 0x30000) || (spellInfo->SpellFamilyFlags[1] & 0x80)))\n+            //    pctbonus += 1.0f;\n+\n+            //flat mods\n+            //Throwing Specialization: + 4 yd range for Deadly Throw\n+            if ((GetSpec() == BOT_SPEC_ROGUE_COMBAT) && lvl >= 45 && baseId == DEADLY_THROW_1)\n+                flatbonus += 4.f;\n+            //Dirty Tricks: + 5 yd range for Blind and Sap\n+            if (lvl >= 15 && (baseId == BLIND_1 || baseId == SAP_1))\n+                flatbonus += 5.f;\n+            //Glyph of Ambush: + 5 yd range for Ambush\n+            if (/*lvl >= 18 && */baseId == AMBUSH_1)\n+                flatbonus += 5.f;\n+            if (baseId == DISARM_TRAP_1)\n+                flatbonus += 10.f;\n+\n+            maxrange = maxrange * (1.0f + pctbonus) + flatbonus;\n+        }\n+\n+        void ApplyClassSpellMaxTargetsMods(SpellInfo const* /*spellInfo*/, uint32& targets) const override\n+        {\n+            uint32 bonusTargets = 0;\n+\n+            //Improved Revenge: +1 target (actually 2 in dbc)\n+            //if (spellInfo->SpellFamilyFlags[0] & 0x400)\n+            //    bonusTargets += 1;\n+\n+            targets = targets + bonusTargets;\n+        }\n+\n+        void OnClassSpellGo(SpellInfo const* spellInfo) override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+\n+            //Thistle Tea: cooldown\n+            if (baseId == THISTLE_TEA)\n+                SetSpellCooldown(THISTLE_TEA, 300000); //5 min (item cd)\n+\n+            //Remorseless Attacks: proc consume buff\n+            if (AuraEffect const* remo = me->GetAuraEffect(REMORSELESS_ATTACKS_BUFF, 0, me->GetGUID()))\n+                if (remo->IsAffectingSpell(spellInfo))\n+                    me->RemoveAurasDueToSpell(REMORSELESS_ATTACKS_BUFF);\n+\n+            //Relentless Strikes\n+            if (spellInfo->NeedsComboPoints() && comboPoints)\n+            {\n+                if (lvl >= 10)\n+                {\n+                    if (irand(1,100) <= 20 * comboPoints)\n+                    {\n+                        me->CastSpell(me, RELENTLESS_STRIKES_EFFECT, true);\n+                        //BOT_LOG_ERROR(\"entities.player\", \"rogue_bot CP SPEND1: RS proc!\");\n+                    }\n+                }\n+            }\n+\n+            //Item enchant\n+            //We don't know which item is targeted\n+            //Actually it is mh, then oh\n+            if (baseId == CRIPPLING_POISON_1 || baseId == INSTANT_POISON_1 || baseId == DEADLY_POISON_1 ||\n+                baseId == WOUND_POISON_1 || baseId == ANESTHETIC_POISON_1 || baseId == MIND_NUMBING_POISON_1)\n+            {\n+                //We set duration to 2 seconds to prevent exploiting unequip mechanic\n+                //to get enchanted weapons for player (for non-shaman bots it won't work)\n+                uint32 slot = TEMP_ENCHANTMENT_SLOT;\n+                uint32 duration = 2 * IN_MILLISECONDS;\n+                uint32 charges = 0;\n+                uint32 enchant_id = spellInfo->_effects[0].MiscValue;\n+                //SpellItemEnchantmentEntry const* pEnchant = sSpellItemEnchantmentStore.LookupEntry(enchant_id);\n+                Item* mh = GetEquips(BOT_SLOT_MAINHAND);\n+                Item* oh = GetEquips(BOT_SLOT_OFFHAND);\n+                Item* item = nullptr;\n+                uint8 itemSlot = 0;\n+\n+                if (mh && !mh->GetEnchantmentId(TEMP_ENCHANTMENT_SLOT)/* && mh->IsFitToSpellRequirements(spellInfo)*/)\n+                {\n+                    item = mh;\n+                    itemSlot = BOT_SLOT_MAINHAND;\n+                }\n+                else if (oh && !oh->GetEnchantmentId(TEMP_ENCHANTMENT_SLOT)/* && oh->IsFitToSpellRequirements(spellInfo)*/)\n+                {\n+                    item = oh;\n+                    itemSlot = BOT_SLOT_OFFHAND;\n+                }\n+                else\n+                    ASSERT(false, \"rogue bot attempted to enchant his weapons but cannot find a weapon to apply it!\");\n+\n+                if (!IAmFree())\n+                    master->GetSession()->SendEnchantmentLog(me->GetGUID(), me->GetGUID(), item->GetEntry(), enchant_id);\n+\n+                item->SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_ID_OFFSET, enchant_id);\n+                item->SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_DURATION_OFFSET, duration);\n+                item->SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_CHARGES_OFFSET, charges);\n+                ApplyItemEnchantment(item, TEMP_ENCHANTMENT_SLOT, itemSlot);\n+                if (itemSlot == BOT_SLOT_MAINHAND)\n+                    mhEnchantExpireTimer = ITEM_ENCHANTMENT_EXPIRE_TIMER;\n+                else if (itemSlot == BOT_SLOT_OFFHAND)\n+                    ohEnchantExpireTimer = ITEM_ENCHANTMENT_EXPIRE_TIMER;\n+                //GC_Timer = 1500; //needed\n+            }\n+        }\n+\n+        void SpellHit(WorldObject* wcaster, SpellInfo const* spell) override\n+        {\n+            Unit* caster = wcaster->ToUnit();\n+            if (!caster)\n+                return;\n+\n+            uint32 baseId = spell->GetFirstRankSpell()->Id;\n+\n+            //Vanish: handle stealth add\n+            if (baseId == VANISH_TRIGGERED_1 || baseId == VANISH_TRIGGERED_2 || baseId == VANISH_TRIGGERED_3)\n+            {\n+                if (!me->GetAuraEffect(SPELL_AURA_MOD_SHAPESHIFT, SPELLFAMILY_ROGUE, 0x400000, 0x0, 0x0))\n+                {\n+                    //SetSpellCooldown(STEALTH_1, 0);\n+                    me->CastSpell(me, STEALTH_1, true);\n+                }\n+            }\n+            //Cheat Death: assume resilience bonus\n+            if (baseId == CHEATING_DEATH_BUFF)\n+            {\n+                if (AuraEffect* chea = me->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_GENERIC, 2109, 0))\n+                {\n+                    chea->ChangeAmount(-100);\n+                }\n+            }\n+            //Camouflage part 1: +15% speed while stealthed\n+            if (baseId == STEALTH_1 && me->GetLevel() >= 15)\n+            {\n+                if (AuraEffect* stea = me->GetAuraEffect(spell->Id, 2))\n+                {\n+                    stea->ChangeAmount(stea->GetAmount() + 15);\n+                }\n+            }\n+\n+            OnSpellHit(caster, spell);\n+        }\n+\n+        void SpellHitTarget(WorldObject* wtarget, SpellInfo const* spell) override\n+        {\n+            Unit* target = wtarget->ToUnit();\n+            if (!target)\n+                return;\n+\n+            uint32 spellId = spell->Id;\n+            uint32 baseId = spell->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+\n+            //Cold Blood: handle proc\n+            if (AuraEffect const* bloo = me->GetAuraEffect(COLD_BLOOD_1, 0, me->GetGUID()))\n+                if (bloo->IsAffectingSpell(spell))\n+                    me->RemoveAurasDueToSpell(COLD_BLOOD_1);\n+\n+            //Combo point generating from effects\n+            if (baseId == SEAL_FATE_EFFECT || baseId == RUTHLESSNESS_EFFECT ||\n+                baseId == SETUP_EFFECT || baseId == INITIATIVE_EFFECT || baseId == HONOR_AMONG_THIEVES_EFFECT)\n+            {\n+                ++comboPoints;\n+                //BOT_LOG_ERROR(\"entities.player\", \"rogue_bot CP GEN2: {} adds 1, now {}\", spell->SpellName[0], uint32(comboPoints));\n+                if (comboPoints > 5)\n+                {\n+                    comboPoints = 5;\n+                    //BOT_LOG_ERROR(\"entities.player\", \"rogue_bot CP NOR2: now {}\", uint32(comboPoints));\n+                }\n+            }\n+            //Combo point generating from spells\n+            if (baseId == SINISTER_STRIKE_1 || baseId == BACKSTAB_1 || baseId == MUTILATE_1 ||\n+                baseId == GOUGE_1 || baseId == HEMORRHAGE_1 || baseId == GHOSTLY_STRIKE_1 ||\n+                baseId == RIPOSTE_1 || baseId == PREMEDITATION_1 ||\n+                baseId == AMBUSH_1 || baseId == GARROTE_1 || baseId == CHEAP_SHOT_1/* || baseId == SHIV_1*/)\n+            {\n+                (baseId == MUTILATE_1 || baseId == PREMEDITATION_1 || baseId == CHEAP_SHOT_1) ?\n+                    comboPoints += 2 : ++comboPoints;\n+\n+                //BOT_LOG_ERROR(\"entities.player\", \"rogue_bot CP GEN1: {} adds {}, now {}\",\n+                //    spell->SpellName[0], (baseId == MUTILATE_1 || baseId == PREMEDITATION_1 || baseId == CHEAP_SHOT_1) ?\n+                //    2 : 1, uint32(comboPoints));\n+\n+                //Glyph of Sinister Strike: handle proc\n+                if (baseId == SINISTER_STRIKE_1 && glyphSSProc)\n+                {\n+                    ++comboPoints;\n+                    //BOT_LOG_ERROR(\"entities.player\", \"rogue_bot CP GEN1: glyphSS proc, now {}\", uint32(comboPoints));\n+                }\n+\n+                if (comboPoints > 5)\n+                {\n+                    comboPoints = 5;\n+                    //BOT_LOG_ERROR(\"entities.player\", \"rogue_bot CP NOR1: now {}\", uint32(comboPoints));\n+                }\n+            }\n+            //if (spellId == EVISCERATE || spellId == KIDNEY_SHOT || spellId == SLICE_DICE || spellId == RUPTURE || spellId == EXPOSE_ARMOR || spellId == ENVENOM)\n+            //some abilities like relentless strikes require combo points thus tries to proc itself\n+            else if (spell->NeedsComboPoints() && comboPoints)\n+            {\n+                //uint32 tempCP = comboPoints;\n+                //comboPoints = 0;\n+                combopointsSpent = true; //envenom problem - cps spent before aura application\n+\n+                //BOT_LOG_ERROR(\"entities.player\", \"rogue_bot CP SPEND1: {} to 0\", tempCP);\n+\n+                //Relentless Strikes: moved to OnClassSpellGo (triggered even without hitting the target)\n+\n+                //Ruthlessness\n+                if (lvl >= 15)\n+                {\n+                    if (urand(1,100) <= 60)\n+                    {\n+                        me->CastSpell(target, RUTHLESSNESS_EFFECT, true);\n+                        //BOT_LOG_ERROR(\"entities.player\", \"rogue_bot CP SPEND1: RU proc!\");\n+                    }\n+                }\n+            }\n+\n+            //Preparation: handle effect\n+            if (baseId == PREPARATION_1)\n+            {\n+                //BOT_LOG_ERROR(\"entities.player\", \"rogue_bot Preparation hit!\");\n+                if (GetSpell(EVASION_1))\n+                    SetSpellCooldown(EVASION_1, 0);\n+                if (GetSpell(SPRINT_1))\n+                    SetSpellCooldown(SPRINT_1, 0);\n+                if (GetSpell(VANISH_1))\n+                    SetSpellCooldown(VANISH_1, 0);\n+                if (GetSpell(COLD_BLOOD_1))\n+                    SetSpellCooldown(COLD_BLOOD_1, 0);\n+                if (GetSpell(SHADOWSTEP_1))\n+                    SetSpellCooldown(SHADOWSTEP_1, 0);\n+\n+                //Glyph of Preparation\n+                //if (lvl >= 30) // same level as spell itself\n+                {\n+                    if (GetSpell(BLADE_FLURRY_1))\n+                        SetSpellCooldown(BLADE_FLURRY_1, 0);\n+                    if (GetSpell(DISMANTLE_1))\n+                        SetSpellCooldown(DISMANTLE_1, 0);\n+                    if (GetSpell(KICK_1))\n+                        SetSpellCooldown(KICK_1, 0);\n+                }\n+            }\n+\n+            //Glyph of Garrote\n+            if (lvl >= 15 && baseId == GARROTE_1)\n+            {\n+                if (Aura* garr = target->GetAura(spellId, me->GetGUID()))\n+                {\n+                    uint32 dur = garr->GetMaxDuration() - 3000;\n+                    garr->SetDuration(dur);\n+                    garr->SetMaxDuration(dur);\n+                    if (AuraEffect* garrEff = garr->GetEffect(0))\n+                    {\n+                        garrEff->ChangeAmount(int32(garrEff->GetAmount() * 1.44f)); //not a mistake\n+                    }\n+                }\n+            }\n+            //Glyph of Deadly Throw\n+            if (lvl >= 64 && baseId == DEADLY_THROW_1)\n+            {\n+                if (AuraEffect* thro = target->GetAuraEffect(spellId, 1, me->GetGUID()))\n+                {\n+                    thro->ChangeAmount(thro->GetAmount() - 20);\n+                }\n+            }\n+            //Glyph of Hunger for Blood\n+            if (lvl >= 60 && baseId == HUNGER_FOR_BLOOD_BUFF)\n+            {\n+                if (AuraEffect* hung = me->GetAuraEffect(spellId, 0))\n+                {\n+                    hung->ChangeAmount(hung->GetAmount() + 3);\n+                }\n+            }\n+            //Glyph of Cloak of Shadows\n+            if (lvl >= 66 && baseId == CLOAK_OF_SHADOWS_1)\n+            {\n+                if (AuraEffect* cloa = me->GetAuraEffect(spellId, 2))\n+                {\n+                    cloa->ChangeAmount(cloa->GetAmount() - 40);\n+                }\n+            }\n+            //Glyph of Sprint\n+            if (lvl >= 15 && baseId == SPRINT_1)\n+            {\n+                if (AuraEffect* spri = me->GetAuraEffect(spellId, 0))\n+                {\n+                    spri->ChangeAmount(spri->GetAmount() + 30);\n+                }\n+            }\n+            //Glyph of Vanish\n+            if (lvl >= 22 && baseId == VANISH_1)\n+            {\n+                if (AuraEffect* vani = me->GetAuraEffect(spellId, 2))\n+                {\n+                    vani->ChangeAmount(vani->GetAmount() + 30);\n+                }\n+            }\n+            //Glyph of Adrenaline Rush\n+            if (lvl >= 40 && baseId == ADRENALINE_RUSH_1)\n+            {\n+                if (Aura* rush = me->GetAura(spellId))\n+                {\n+                    uint32 dur = rush->GetMaxDuration() + 5000;\n+                    rush->SetDuration(dur);\n+                    rush->SetMaxDuration(dur);\n+                }\n+            }\n+            //Glyph of Evasion\n+            if (lvl >= 15 && baseId == EVASION_1)\n+            {\n+                if (Aura* evas = me->GetAura(spellId))\n+                {\n+                    uint32 dur = evas->GetMaxDuration() + 5000;\n+                    evas->SetDuration(dur);\n+                    evas->SetMaxDuration(dur);\n+                }\n+            }\n+            //Glyph of Slice and Dice\n+            //Improved Slice and Dice\n+            if (lvl >= 15 && baseId == SLICE_DICE_1)\n+            {\n+                if (Aura* dice = me->GetAura(spellId))\n+                {\n+                    uint32 dur = dice->GetMaxDuration() + 3000;\n+                    dur = dur + dur / 2;\n+                    dice->SetDuration(dur);\n+                    dice->SetMaxDuration(dur);\n+                }\n+            }\n+            //Glyph of Shadow Dance: 4 sec for bots\n+            if (lvl >= 60 && baseId == SHADOW_DANCE_1)\n+            {\n+                if (Aura* danc = me->GetAura(spellId))\n+                {\n+                    uint32 dur = danc->GetMaxDuration() + 4000;\n+                    danc->SetDuration(dur);\n+                    danc->SetMaxDuration(dur);\n+                }\n+            }\n+            //Glyph of Rupture\n+            if (lvl >= 20 && baseId == RUPTURE_1)\n+            {\n+                if (Aura* rupt = target->GetAura(spellId, me->GetGUID()))\n+                {\n+                    uint32 dur = rupt->GetMaxDuration() + 4000;\n+                    rupt->SetDuration(dur);\n+                    rupt->SetMaxDuration(dur);\n+                }\n+            }\n+            //Glyph of Expose Armor\n+            if (lvl >= 15 && baseId == EXPOSE_ARMOR_1)\n+            {\n+                if (Aura* expo = target->GetAura(spellId, me->GetGUID()))\n+                {\n+                    uint32 dur = expo->GetMaxDuration() + 12000;\n+                    expo->SetDuration(dur);\n+                    expo->SetMaxDuration(dur);\n+                }\n+            }\n+            //Improved Gouge: Increased duration by 1.5 sec\n+            if (lvl >= 10 && baseId == GOUGE_1)\n+            {\n+                if (Aura* goug = target->GetAura(spellId, me->GetGUID()))\n+                {\n+                    int32 duration = goug->GetMaxDuration() + 1500;\n+                    goug->SetDuration(duration);\n+                    goug->SetMaxDuration(duration);\n+                }\n+            }\n+            //Glyph of Tricks of Trade\n+            if (lvl >= 75 && baseId == TRICKS_OF_THE_TRADE_BUFF)\n+            {\n+                if (Aura* tric = target->GetAura(spellId, me->GetGUID()))\n+                {\n+                    int32 duration = tric->GetMaxDuration() + 4000;\n+                    tric->SetDuration(duration);\n+                    tric->SetMaxDuration(duration);\n+                }\n+            }\n+            //Cut to the Chase: Eviscerate and Envenom will refresh Slice and Dice duration as for 5 points\n+            if (GetSpec() == BOT_SPEC_ROGUE_ASSASINATION && lvl >= 55 && (baseId == EVISCERATE_1 || baseId == ENVENOM_1) && GetSpell(SLICE_DICE_1))\n+            {\n+                if (Aura* dice = me->GetAura(GetSpell(SLICE_DICE_1)))\n+                {\n+                    int32 duration = 21000 + 3000 + 12000; //base + glyph + improved\n+                    dice->SetDuration(duration);\n+                    dice->SetMaxDuration(duration);\n+                }\n+            }\n+            //Waylay\n+            if ((GetSpec() == BOT_SPEC_ROGUE_SUBTLETY) && lvl >= 45 && (baseId == BACKSTAB_1 || baseId == AMBUSH_1))\n+                me->CastSpell(target, WAYLAY_DEBUFF, true);\n+\n+            //Stun: move behind\n+            if (baseId == CHEAP_SHOT_1 || baseId == KIDNEY_SHOT_1 || baseId == GOUGE_1)\n+                if (target == opponent)\n+                    MoveBehind(target);\n+\n+            OnSpellHitTarget(target, spell);\n+        }\n+\n+        void DamageDealt(Unit* victim, uint32& damage, DamageEffectType damageType) override\n+        {\n+            bot_ai::DamageDealt(victim, damage, damageType);\n+        }\n+\n+        void DamageTaken(Unit* u, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo*/) override\n+        {\n+            if (!u)\n+                return;\n+            if (!u->IsInCombat() && !me->IsInCombat())\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void OwnerAttackedBy(Unit* u) override\n+        {\n+            if (!u)\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void CheckAttackState() override\n+        {\n+            if (me->GetVictim() && HasRole(BOT_ROLE_DPS) && !me->HasAuraType(SPELL_AURA_MOD_STEALTH) &&\n+                (me->isAttackReady() || me->isAttackReady(OFF_ATTACK)) &&\n+                (!me->GetVictim()->GetAuraEffect(SPELL_AURA_MOD_STUN, SPELLFAMILY_ROGUE, 0x8, 0x0, 0x0) &&\n+                !me->GetVictim()->GetAuraEffect(SPELL_AURA_MOD_CONFUSE, SPELLFAMILY_ROGUE, 0x01000000, 0x0, 0x0)))\n+                DoMeleeAttackIfReady();\n+        }\n+\n+        uint32 GetAIMiscValue(uint32 data) const override\n+        {\n+            switch (data)\n+            {\n+                case BOTAI_MISC_COMBO_POINTS:\n+                    return comboPoints;\n+                case BOTAI_MISC_ENCHANT_IS_AUTO_MH:\n+                    return needChooseMHEnchant;\n+                case BOTAI_MISC_ENCHANT_IS_AUTO_OH:\n+                    return needChooseOHEnchant;\n+                case BOTAI_MISC_ENCHANT_TIMER_MH:\n+                    return mhEnchantExpireTimer;\n+                case BOTAI_MISC_ENCHANT_TIMER_OH:\n+                    return ohEnchantExpireTimer;\n+                case BOTAI_MISC_ENCHANT_CURRENT_MH:\n+                    return mhEnchant;\n+                case BOTAI_MISC_ENCHANT_CURRENT_OH:\n+                    return ohEnchant;\n+                case BOTAI_MISC_ENCHANT_AVAILABLE_1:\n+                    return GetSpell(CRIPPLING_POISON_1) ? CRIPPLING_POISON_1 : 0;\n+                case BOTAI_MISC_ENCHANT_AVAILABLE_2:\n+                    return GetSpell(INSTANT_POISON_1) ? INSTANT_POISON_1 : 0;\n+                case BOTAI_MISC_ENCHANT_AVAILABLE_3:\n+                    return GetSpell(MIND_NUMBING_POISON_1) ? MIND_NUMBING_POISON_1 : 0;\n+                case BOTAI_MISC_ENCHANT_AVAILABLE_4:\n+                    return GetSpell(DEADLY_POISON_1) ? DEADLY_POISON_1 : 0;\n+                case BOTAI_MISC_ENCHANT_AVAILABLE_5:\n+                    return GetSpell(WOUND_POISON_1) ? WOUND_POISON_1 : 0;\n+                case BOTAI_MISC_ENCHANT_AVAILABLE_6:\n+                    return GetSpell(ANESTHETIC_POISON_1) ? ANESTHETIC_POISON_1 : 0;\n+                default:\n+                    return 0;\n+            }\n+        }\n+\n+        void SetAIMiscValue(uint32 data, uint32 value) override\n+        {\n+            switch (data)\n+            {\n+                case BOTAI_MISC_DAGGER_MAINHAND:\n+                    isdaggerMH = bool(value);\n+                    break;\n+                case BOTAI_MISC_DAGGER_OFFHAND:\n+                    isdaggerOH = bool(value);\n+                    break;\n+                case BOTAI_MISC_ENCHANT_IS_AUTO_MH:\n+                    needChooseMHEnchant = bool(value);\n+                    break;\n+                case BOTAI_MISC_ENCHANT_IS_AUTO_OH:\n+                    needChooseOHEnchant = bool(value);\n+                    break;\n+                case BOTAI_MISC_ENCHANT_TIMER_MH:\n+                    if (value == 0)\n+                        mhEnchantExpireTimer = value;\n+                    break;\n+                case BOTAI_MISC_ENCHANT_TIMER_OH:\n+                    if (value == 0)\n+                        ohEnchantExpireTimer = value;\n+                    break;\n+                case BOTAI_MISC_ENCHANT_CURRENT_MH:\n+                    mhEnchant = value;\n+                    SetAIMiscValue(BOTAI_MISC_ENCHANT_IS_AUTO_MH, value ? false : true);\n+                    break;\n+                case BOTAI_MISC_ENCHANT_CURRENT_OH:\n+                    ohEnchant = value;\n+                    SetAIMiscValue(BOTAI_MISC_ENCHANT_IS_AUTO_OH, value ? false : true);\n+                    break;\n+                default:\n+                    break;\n+            }\n+\n+            bot_ai::SetAIMiscValue(data, value);\n+        }\n+\n+        void Reset() override\n+        {\n+            energy = 0;\n+            comboPoints = 0;\n+            combopointsSpent = false;\n+            glyphSSProc = false;\n+\n+            mhEnchantExpireTimer = std::min<uint32>(mhEnchantExpireTimer, 1);\n+            ohEnchantExpireTimer = std::min<uint32>(ohEnchantExpireTimer, 1);\n+\n+            DefaultInit();\n+\n+            //after InitEquips\n+            Item const* mh = GetEquips(BOT_SLOT_MAINHAND);\n+            Item const* oh = GetEquips(BOT_SLOT_OFFHAND);\n+            isdaggerMH = mh && mh->GetTemplate()->Class == ITEM_CLASS_WEAPON && mh->GetTemplate()->SubClass == ITEM_SUBCLASS_WEAPON_DAGGER;\n+            isdaggerOH = oh && oh->GetTemplate()->Class == ITEM_CLASS_WEAPON && oh->GetTemplate()->SubClass == ITEM_SUBCLASS_WEAPON_DAGGER;\n+        }\n+\n+        void ReduceCD(uint32 diff) override\n+        {\n+            if (mhEnchantExpireTimer > diff)            mhEnchantExpireTimer -= diff;\n+            if (ohEnchantExpireTimer > diff)            ohEnchantExpireTimer -= diff;\n+        }\n+\n+        void InitPowers() override\n+        {\n+            //Hack for power\n+            me->SetPowerType(POWER_ENERGY);\n+\n+            if (energy)\n+                me->SetPower(POWER_ENERGY, energy);\n+            else\n+                me->SetPower(POWER_ENERGY, me->GetMaxPower(POWER_ENERGY));\n+        }\n+\n+        void InitSpells() override\n+        {\n+            uint8 lvl = me->GetLevel();\n+            bool isAssa = GetSpec() == BOT_SPEC_ROGUE_ASSASINATION;\n+            bool isComb = GetSpec() == BOT_SPEC_ROGUE_COMBAT;\n+            bool isSubt = GetSpec() == BOT_SPEC_ROGUE_SUBTLETY;\n+\n+            InitSpellMap(KICK_1);\n+            //InitSpellMap(EXPOSE_ARMOR_1);\n+            InitSpellMap(DISMANTLE_1);\n+            InitSpellMap(FEINT_1);\n+            InitSpellMap(DISARM_TRAP_1);\n+\n+            InitSpellMap(BACKSTAB_1);\n+            InitSpellMap(SINISTER_STRIKE_1);\n+            InitSpellMap(EVISCERATE_1);\n+            InitSpellMap(ENVENOM_1);\n+            InitSpellMap(RUPTURE_1);\n+            InitSpellMap(DEADLY_THROW_1);\n+            InitSpellMap(FAN_OF_KNIVES_1);\n+\n+            InitSpellMap(SPRINT_1);\n+            InitSpellMap(EVASION_1);\n+            InitSpellMap(BLIND_1);\n+            InitSpellMap(VANISH_1);\n+\n+            InitSpellMap(GOUGE_1);\n+\n+            InitSpellMap(KIDNEY_SHOT_1);\n+            InitSpellMap(SLICE_DICE_1);\n+            InitSpellMap(CLOAK_OF_SHADOWS_1);\n+            InitSpellMap(TRICKS_OF_THE_TRADE_1);\n+\n+            InitSpellMap(STEALTH_1);\n+            //InitSpellMap(SAP_1);\n+            InitSpellMap(GARROTE_1);\n+            InitSpellMap(CHEAP_SHOT_1);\n+            InitSpellMap(AMBUSH_1);\n+\n+            lvl >= 30 && isAssa ? InitSpellMap(COLD_BLOOD_1) : RemoveSpell(COLD_BLOOD_1);\n+            lvl >= 50 && isAssa ? InitSpellMap(MUTILATE_1) : RemoveSpell(MUTILATE_1);\n+            lvl >= 60 && isAssa ? InitSpellMap(HUNGER_FOR_BLOOD_1) : RemoveSpell(HUNGER_FOR_BLOOD_1);\n+\n+            lvl >= 20 && isComb ? InitSpellMap(RIPOSTE_1) : RemoveSpell(RIPOSTE_1);\n+            lvl >= 30 && isComb ? InitSpellMap(BLADE_FLURRY_1) : RemoveSpell(BLADE_FLURRY_1);\n+            lvl >= 40 && isComb ? InitSpellMap(ADRENALINE_RUSH_1) : RemoveSpell(ADRENALINE_RUSH_1);\n+            lvl >= 60 && isComb ? InitSpellMap(KILLING_SPREE_1) : RemoveSpell(KILLING_SPREE_1);\n+\n+            lvl >= 20 && isSubt ? InitSpellMap(GHOSTLY_STRIKE_1) : RemoveSpell(GHOSTLY_STRIKE_1);\n+            lvl >= 30 && isSubt ? InitSpellMap(HEMORRHAGE_1) : RemoveSpell(HEMORRHAGE_1);\n+            lvl >= 30 && isSubt ? InitSpellMap(PREPARATION_1) : RemoveSpell(PREPARATION_1);\n+            lvl >= 40 && isSubt ? InitSpellMap(PREMEDITATION_1) : RemoveSpell(PREMEDITATION_1);\n+            lvl >= 50 && isSubt ? InitSpellMap(SHADOWSTEP_1) : RemoveSpell(SHADOWSTEP_1);\n+            lvl >= 60 && isSubt ? InitSpellMap(SHADOW_DANCE_1) : RemoveSpell(SHADOW_DANCE_1);\n+\n+            //InitSpellMap(DISTRACT_1);\n+\n+            InitSpellMap(CRIPPLING_POISON_1);\n+            InitSpellMap(INSTANT_POISON_1);\n+            InitSpellMap(DEADLY_POISON_1);\n+            InitSpellMap(WOUND_POISON_1);\n+            InitSpellMap(MIND_NUMBING_POISON_1);\n+            InitSpellMap(ANESTHETIC_POISON_1);\n+\n+            lvl >= 10 ? InitSpellMap(THISTLE_TEA) : RemoveSpell(THISTLE_TEA);\n+        }\n+\n+        void ApplyClassPassives() const override\n+        {\n+            uint8 level = master->GetLevel();\n+            bool isAssa = GetSpec() == BOT_SPEC_ROGUE_ASSASINATION;\n+            bool isComb = GetSpec() == BOT_SPEC_ROGUE_COMBAT;\n+            bool isSubt = GetSpec() == BOT_SPEC_ROGUE_SUBTLETY;\n+\n+            RefreshAura(REMORSELESS_ATTACKS, level >= 10 ? 1 : 0);\n+            RefreshAura(VIGOR, level >= 20 ? 1 : 0);\n+            RefreshAura(QUICK_RECOVERY2, isAssa && level >= 35 ? 1 : 0);\n+            RefreshAura(QUICK_RECOVERY1, isAssa && level >= 30 && level < 35 ? 1 : 0);\n+            RefreshAura(IMPROVED_KIDNEY_SHOT, isAssa && level >= 30 ? 1 : 0);\n+            RefreshAura(FLEET_FOOTED, isAssa && level >= 30 ? 1 : 0);\n+            RefreshAura(SEAL_FATE5, isAssa && level >= 45 ? 1 : 0);\n+            RefreshAura(SEAL_FATE4, isAssa && level >= 42 && level < 45 ? 1 : 0);\n+            RefreshAura(SEAL_FATE3, isAssa && level >= 39 && level < 42 ? 1 : 0);\n+            RefreshAura(SEAL_FATE2, isAssa && level >= 37 && level < 39 ? 1 : 0);\n+            RefreshAura(SEAL_FATE1, isAssa && level >= 35 && level < 37 ? 1 : 0);\n+            RefreshAura(MURDER, isAssa && level >= 35 ? 1 : 0);\n+            RefreshAura(DEADLY_BREW, isAssa && level >= 40 ? 1 : 0);\n+            RefreshAura(OVERKILL, isAssa && level >= 40 ? 1 : 0);\n+            //RefreshAura(FOCUSED_ATTACKS, isAssa && level >= 45 ? 1 : 0);\n+            RefreshAura(MASTER_POISONER, isAssa && level >= 50 ? 1 : 0);\n+\n+            RefreshAura(DUAL_WIELD_SPECIALIZATION, level >= 10 ? 1 : 0);\n+            RefreshAura(IMPROVED_KICK, isComb && level >= 25 ? 1 : 0);\n+            RefreshAura(IMPROVED_SPRINT, isComb && level >= 25 ? 1 : 0);\n+            RefreshAura(HACK_AND_SLASH, isComb && level >= 30 ? 1 : 0);\n+            //RefreshAura(BLADE_TWISTING1, isComb && level >= 35 ? 1 : 0);\n+            RefreshAura(VITALITY, isComb && level >= 40 ? 1 : 0);\n+            RefreshAura(NERVES_OF_STEEL, isComb && level >= 40 ? 1 : 0);\n+            RefreshAura(COMBAT_POTENCY5, isComb && level >= 55 ? 1 : 0);\n+            RefreshAura(COMBAT_POTENCY4, isComb && level >= 52 && level < 55 ? 1 : 0);\n+            RefreshAura(COMBAT_POTENCY3, isComb && level >= 49 && level < 52 ? 1 : 0);\n+            RefreshAura(COMBAT_POTENCY2, isComb && level >= 47 && level < 49 ? 1 : 0);\n+            RefreshAura(COMBAT_POTENCY1, isComb && level >= 45 && level < 47 ? 1 : 0);\n+            RefreshAura(THROWING_SPECIALIZATION, isComb && level >= 45 ? 1 : 0);\n+            //RefreshAura(SAVAGE_COMBAT, isComb && level >= 50 ? 1 : 0);\n+            RefreshAura(UNFAIR_ADVANTAGE, isComb && level >= 50 ? 1 : 0);\n+            RefreshAura(SURPRISE_ATTACKS, isComb && level >= 50 ? 1 : 0);\n+            RefreshAura(PREY_ON_THE_WEAK, isComb && level >= 55 ? 1 : 0);\n+\n+            RefreshAura(MASTER_OF_DECEPTION, level >= 10 ? 1 : 0);\n+            RefreshAura(SETUP, isSubt && level >= 25 ? 1 : 0);\n+            RefreshAura(INITIATIVE, isSubt && level >= 25 ? 1 : 0);\n+            RefreshAura(DIRTY_DEEDS, isSubt && level >= 30 ? 1 : 0);\n+            RefreshAura(MASTER_OF_SUBTLETY, isSubt && level >= 35 ? 1 : 0);\n+            RefreshAura(CHEAT_DEATH, isSubt && level >= 40 ? 1 : 0);\n+            RefreshAura(ENVELOPING_SHADOWS, isSubt && level >= 40 ? 1 : 0);\n+            RefreshAura(TURN_THE_TABLES, !IAmFree() && isSubt && level >= 55 ? 1 : 0);\n+            //RefreshAura(HONOR_AMONG_THIEVES, isSubt && level >= 55 ? 1 : 0);\n+\n+            RefreshAura(VIGOR_GLADIATOR, level >= 70 ? 1 : 0);\n+\n+            RefreshAura(GLYPH_BACKSTAB, level >= 15 ? 1 : 0);\n+\n+            RefreshAura(ROGUE_PASSIVE_DND);\n+        }\n+\n+        bool CanUseManually(uint32 basespell) const override\n+        {\n+            switch (basespell)\n+            {\n+                case STEALTH_1:\n+                case SPRINT_1:\n+                case VANISH_1:\n+                case BLADE_FLURRY_1:\n+                case FAN_OF_KNIVES_1:\n+                case TRICKS_OF_THE_TRADE_1:\n+                case PREPARATION_1:\n+                    return true;\n+                default:\n+                    return false;\n+            }\n+        }\n+\n+        float GetBotArmorPenetrationCoef() const override\n+        {\n+            float bonus = 0.0f;\n+\n+            //Serrated Blades part 1\n+            if (me->GetLevel() >= 20)\n+                bonus += 9.f;\n+\n+            //Mace Specialization: 15% armor penetration\n+            if (me->GetLevel() >= 30)\n+                if (Item const* weap = GetEquips(BOT_SLOT_MAINHAND))\n+                    if (weap->GetTemplate()->SubClass == ITEM_SUBCLASS_WEAPON_MACE)\n+                        bonus += 15.f;\n+\n+            return bonus + bot_ai::GetBotArmorPenetrationCoef();\n+        }\n+\n+        bool HasAbilitiesSpecifics() const override { return true; }\n+        void FillAbilitiesSpecifics(Player const* player, std::list<std::string> &specList) override\n+        {\n+            uint32 textId1, textId2;\n+            switch (mhEnchant)\n+            {\n+                case CRIPPLING_POISON_1:    textId1 = BOT_TEXT_CRIPPLING;   break;\n+                case INSTANT_POISON_1:      textId1 = BOT_TEXT_INSTANT;     break;\n+                case DEADLY_POISON_1:       textId1 = BOT_TEXT_DEADLY;      break;\n+                case WOUND_POISON_1:        textId1 = BOT_TEXT_WOUND;       break;\n+                case MIND_NUMBING_POISON_1: textId1 = BOT_TEXT_MINDNUMBING; break;\n+                case ANESTHETIC_POISON_1:   textId1 = BOT_TEXT_ANESTHETIC;  break;\n+                default:                    textId1 = BOT_TEXT_NOTHING_C;   break;\n+            }\n+            switch (ohEnchant)\n+            {\n+                case CRIPPLING_POISON_1:    textId2 = BOT_TEXT_CRIPPLING;   break;\n+                case INSTANT_POISON_1:      textId2 = BOT_TEXT_INSTANT;     break;\n+                case DEADLY_POISON_1:       textId2 = BOT_TEXT_DEADLY;      break;\n+                case WOUND_POISON_1:        textId2 = BOT_TEXT_WOUND;       break;\n+                case MIND_NUMBING_POISON_1: textId2 = BOT_TEXT_MINDNUMBING; break;\n+                case ANESTHETIC_POISON_1:   textId2 = BOT_TEXT_ANESTHETIC;  break;\n+                default:                    textId2 = BOT_TEXT_NOTHING_C;   break;\n+            }\n+            specList.push_back(LocalizedNpcText(player, BOT_TEXT_SLOT_MH) + \": \" + LocalizedNpcText(player, textId1));\n+            specList.push_back(LocalizedNpcText(player, BOT_TEXT_SLOT_OH) + \": \" + LocalizedNpcText(player, textId2));\n+        }\n+\n+        std::vector<uint32> const* GetDamagingSpellsList() const override\n+        {\n+            return &Rogue_spells_damage;\n+        }\n+        std::vector<uint32> const* GetCCSpellsList() const override\n+        {\n+            return &Rogue_spells_cc;\n+        }\n+        //std::vector<uint32> const* GetHealingSpellsList() const override\n+        //{\n+        //    return &Rogue_spells_heal;\n+        //}\n+        std::vector<uint32> const* GetSupportSpellsList() const override\n+        {\n+            return &Rogue_spells_support;\n+        }\n+\n+    private:\n+        mutable bool glyphSSProc;\n+        int32 energy;\n+        uint8 comboPoints;\n+        bool combopointsSpent;\n+        bool isdaggerMH, isdaggerOH;\n+        uint32 mhEnchantExpireTimer, ohEnchantExpireTimer;\n+        uint32 mhEnchant, ohEnchant;\n+        bool needChooseMHEnchant, needChooseOHEnchant;\n+    };\n+};\n+\n+void AddSC_rogue_bot()\n+{\n+    new rogue_bot();\n+}\ndiff --git a/src/server/game/AI/NpcBots/bot_sea_witch_ai.cpp b/src/server/game/AI/NpcBots/bot_sea_witch_ai.cpp\nnew file mode 100644\nindex 0000000000..e7fd880288\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bot_sea_witch_ai.cpp\n@@ -0,0 +1,776 @@\n+#include \"bot_ai.h\"\n+#include \"bot_GridNotifiers.h\"\n+#include \"botspell.h\"\n+#include \"bottext.h\"\n+#include \"ScriptMgr.h\"\n+#include \"SpellAuraEffects.h\"\n+#include \"TemporarySummon.h\"\n+/*\n+Naga Sea Witch NpcBot (by Trickerer onlysuffering@gmail.com)\n+Description:\n+A vicious scaly denizen of ocean often associated with the coming of prodigious storms (Warcraft III tribute)\n+Specifics:\n+Spell damage taken reduced by 30%, partially immune to control effects, cloth armor,\n+deals physical/spellfrost/spellstorm damage, attack power bonus: agility x2, spell power bonus: 200% intellect. Main attribute: intellect\n+Abilities:\n+1) Forked Lightning. Calls forth a cone of lightning to damage enemies. Hits 2 to all targets (depending on hero level),\n+stunning them for 2 seconds. This damage generates no threat\n+2) Frost Arrows. Imbues arrow with spellfrost for extra damage, slowing target's\n+movement, attack and casting speed by up to 70% (depending on hero level)\n+3) Mana Shield. Creates a shield that absorbs 100% incoming (non-mitigated) damage by using Sea Witch's mana,\n+absorbs 2 to 10 damage per point of mana (depending on hero level)\n+4) Tornado. Summons a fierce tornado that damages and slows nearby enemy units, sometimes incapacitating them completely.\n+Tornado grows over time oudoors, increasing damage dealt and area of effect, but shrinks indoors, dissipating quickly\n+5ex) Shot. Normal shoot\n+6ex) Naga (passive). Swim speed increased by 200%. Damage and dodge chance are greatly increased while in water\n+Complete - 100%\n+*/\n+\n+enum SeaWitchBaseSpells\n+{\n+    //AUTO_SHOT_1                         = 75,\n+    SHOOT_BOW_1                         = SPELL_SHOOT_BOW,\n+    FORKED_LIGHTNING_1                  = SPELL_FORKED_LIGHTNING,\n+    FROST_ARROW_1                       = SPELL_FROST_ARROW,\n+    MANA_SHIELD_1                       = SPELL_MANA_SHIELD,\n+    TORNADO_1                           = SPELL_TORNADO\n+};\n+enum SeaWitchPassives\n+{\n+};\n+enum SeaWitchSpecial\n+{\n+    MH_ATTACK_ANIM                      = SPELL_ATTACK_MELEE_1H,\n+\n+    FORKEDLIGHTNING_COST                = 110 * 5,\n+    FROSTARROW_COST                     = 10 * 5,\n+    TORNADO_COST                        = 250 * 5,\n+\n+    FORKED_LIGHTNING_EFFECT             = SPELL_FORKED_LIGHTNING_EFFECT,\n+    FROST_ARROW_EFFECT                  = SPELL_FROST_ARROW_EFFECT,\n+\n+    NAGA_SWIM_PASSIVE                   = 40513,\n+    SPELL_THREAT_MOD                    = 31745, //Salvation\n+\n+    SPELL_PARALYTIC_POISON              = 35201\n+};\n+\n+static constexpr size_t TORNADO_MIN_TARGETS = 4u;\n+\n+static const std::vector<uint32> Seawitch_spells_damage{ FORKED_LIGHTNING_1, FROST_ARROW_1, TORNADO_1 };\n+static const std::vector<uint32> Seawitch_spells_cc{ FROST_ARROW_1, TORNADO_1 };\n+static const std::vector<uint32> Seawitch_spells_support{ MANA_SHIELD_1 };\n+\n+class sea_witch_bot : public CreatureScript\n+{\n+public:\n+    sea_witch_bot() : CreatureScript(\"sea_witch_bot\") { }\n+\n+    CreatureAI* GetAI(Creature* creature) const override\n+    {\n+        return new sea_witch_botAI(creature);\n+    }\n+\n+    struct sea_witch_botAI : public bot_ai\n+    {\n+        sea_witch_botAI(Creature* creature) : bot_ai(creature)\n+        {\n+            _botclass = BOT_CLASS_SEA_WITCH;\n+\n+            InitUnitFlags();\n+\n+            //sea witch immunities\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_POSSESS, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_CHARM, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_SHAPESHIFT, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_TRANSFORM, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_DISARM, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_DISARM_OFFHAND, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_DISARM_RANGED, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_FEAR, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_DISARM, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_POLYMORPH, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_FEAR, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_HORROR, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_TURN, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SLEEP, true);\n+            //Sea Witch is immune to poisons\n+            me->ApplySpellImmune(0, IMMUNITY_DISPEL, DISPEL_POISON, true);\n+        }\n+\n+        bool doCast(Unit* victim, uint32 spellId)\n+        {\n+            if (CheckBotCast(victim, spellId) != SPELL_CAST_OK)\n+                return false;\n+\n+            return bot_ai::doCast(victim, spellId);\n+        }\n+\n+        void StartAttack(Unit* u, bool force = false)\n+        {\n+            if (!bot_ai::StartAttack(u, force))\n+                return;\n+            GetInPosition(force, u);\n+        }\n+\n+        void JustEnteredCombat(Unit* u) override { bot_ai::JustEnteredCombat(u); }\n+        void EnterEvadeMode(EvadeReason why = EVADE_REASON_OTHER) override { bot_ai::EnterEvadeMode(why); }\n+        void MoveInLineOfSight(Unit* u) override { bot_ai::MoveInLineOfSight(u); }\n+        void JustDied(Unit* u) override { /*UnsummonAll(false);*/ bot_ai::JustDied(u); }\n+        void DoNonCombatActions(uint32 /*diff*/) { }\n+        void KilledUnit(Unit* u) override { bot_ai::KilledUnit(u); }\n+\n+        void CheckManaShield(uint32 diff)\n+        {\n+            if (me->HasAuraType(SPELL_AURA_MANA_SHIELD) || me->HasAuraType(SPELL_AURA_SCHOOL_ABSORB))\n+                return;\n+\n+            if (IsSpellReady(MANA_SHIELD_1, diff, false) && GetManaPCT(me) >= 25 && me->IsInCombat())\n+                if (doCast(me, GetSpell(MANA_SHIELD_1)))\n+                    return;\n+        }\n+\n+        void Counter(uint32 diff)\n+        {\n+            if (!IsSpellReady(FORKED_LIGHTNING_1, diff, false) || !HasRole(BOT_ROLE_DPS) || Rand() > 55)\n+                return;\n+\n+            if (Unit* target = FindCastingTarget(CalcSpellMaxRange(FORKED_LIGHTNING_1) - 5.f, 0, FORKED_LIGHTNING_1))\n+            {\n+                Spell const* spell = target->GetCurrentSpell(CURRENT_GENERIC_SPELL);\n+                if (!spell)\n+                    spell = target->GetCurrentSpell(CURRENT_CHANNELED_SPELL);\n+\n+                if (spell && spell->GetTimer() > int32(AssertBotSpellInfoOverride(GetSpell(FORKED_LIGHTNING_1))->CalcCastTime() + 250))\n+                {\n+                    me->SetFacingTo(me->GetAbsoluteAngle(target));\n+                    if (doCast(target, GetSpell(FORKED_LIGHTNING_1)))\n+                        return;\n+                }\n+            }\n+        }\n+\n+        void UpdateAI(uint32 diff) override\n+        {\n+            if (!GlobalUpdate(diff))\n+                return;\n+\n+            DoVehicleActions(diff);\n+            if (!CanBotAttackOnVehicle())\n+                return;\n+\n+            if (Spell const* spell = me->GetCurrentSpell(CURRENT_GENERIC_SPELL))\n+            {\n+                uint32 const baseId = spell->GetSpellInfo()->GetFirstRankSpell()->Id;\n+                //Tornado interrupt\n+                if (!me->IsInCombat() && baseId == TORNADO_1)\n+                    me->InterruptSpell(CURRENT_GENERIC_SPELL);\n+                else if (baseId == FORKED_LIGHTNING_1 && (!me->GetVictim() || !me->HasInArc(float(M_PI) / 2.f, me->GetVictim())))\n+                {\n+                    me->InterruptSpell(CURRENT_GENERIC_SPELL);\n+                    SetSpellCooldown(FORKED_LIGHTNING_1, 500);\n+                }\n+                else if (_spell_preact && spell->GetTimer() < 400)\n+                {\n+                    _spell_preact = false;\n+                    switch (baseId)\n+                    {\n+                        case TORNADO_1:\n+                        //    BotSay(\"REAP THE STORM!\");\n+                        //[[fallthrough]];\n+                        case FORKED_LIGHTNING_1:\n+                            me->CastSpell(me, MH_ATTACK_ANIM, true);\n+                            break;\n+                        default:\n+                            break;\n+                    }\n+                }\n+            }\n+\n+            if (IsPotionReady())\n+            {\n+                if (me->GetPower(POWER_MANA) < FORKEDLIGHTNING_COST)\n+                    DrinkPotion(true);\n+                else if (GetHealthPCT(me) < 30)\n+                    DrinkPotion(false);\n+            }\n+\n+            if (ProcessImmediateNonAttackTarget())\n+                return;\n+\n+            CheckManaShield(diff);\n+\n+            if (!CheckAttackTarget())\n+            {\n+                me->InterruptSpell(CURRENT_AUTOREPEAT_SPELL);\n+                return;\n+            }\n+\n+            Counter(diff);\n+\n+            if (IsCasting())\n+                return;\n+\n+            CheckUsableItems(diff);\n+\n+            DoRangedAttack(diff);\n+        }\n+\n+        void DoRangedAttack(uint32 diff)\n+        {\n+            Unit* mytar = opponent ? opponent : disttarget ? disttarget : nullptr;\n+            if (!mytar)\n+                return;\n+\n+            StartAttack(mytar, IsMelee());\n+\n+            CheckAttackState();\n+            if (!me->IsAlive() || !mytar->IsAlive())\n+                return;\n+\n+            MoveBehind(mytar);\n+\n+            float dist = me->GetDistance(mytar);\n+            static constexpr float maxRangeLong = 35.f;\n+\n+            //bool inpostion = !mytar->HasAuraType(SPELL_AURA_MOD_SPEED_SLOW_ALL) || dist > maxRangeLong - 20.f;\n+\n+            //Auto Shot\n+            //Spell const* shot = me->GetCurrentSpell(CURRENT_AUTOREPEAT_SPELL);\n+            //if (shot && shot->GetSpellInfo()->Id == AUTO_SHOT_1 && (shot->m_targets.GetUnitTarget() != mytar || !inpostion))\n+            //    me->InterruptSpell(CURRENT_AUTOREPEAT_SPELL);\n+\n+            if (!HasRole(BOT_ROLE_DPS))\n+                return;\n+\n+            //RANGED SECTION\n+            if (dist > maxRangeLong)\n+                return;\n+\n+            if (CheckForkedLightning(diff))\n+                return;\n+\n+            if (CheckTornado(diff))\n+                return;\n+\n+            if (/*inpostion && */!me->GetCurrentSpell(CURRENT_GENERIC_SPELL))\n+            {\n+                //Frost Arrow / Autoshot\n+                if (IsSpellReady(FROST_ARROW_1, diff) && me->GetPower(POWER_MANA) >= FROSTARROW_COST &&\n+                    !mytar->IsImmunedToDamage(AssertBotSpellInfoOverride(FROST_ARROW_1)))\n+                {\n+                    if (doCast(mytar, GetSpell(FROST_ARROW_1)))\n+                        return;\n+                }\n+                else if (IsSpellReady(SHOOT_BOW_1, diff))\n+                {\n+                    if (doCast(mytar, SHOOT_BOW_1))\n+                        return;\n+                }\n+            }\n+        }\n+\n+        bool CheckTornado(uint32 diff)\n+        {\n+            if (!IsSpellReady(TORNADO_1, diff, false) || !me->GetVictim() || me->GetPower(POWER_MANA) < TORNADO_COST || Rand() > 50)\n+                return false;\n+\n+            std::list<Unit*> targets;\n+            GetNearbyTargetsList(targets, 40.f, 0);\n+            std::erase_if(targets, [healthThreshold = uint32(me->GetMaxHealth() / 4 * 3)](Unit const* u) {\n+                return u->GetHealth() < healthThreshold;\n+            });\n+\n+            size_t targets_count = (IAmFree() || !master->GetGroup()) ? TORNADO_MIN_TARGETS : std::max<size_t>(master->GetGroup()->GetMemberSlots().size() / 3, TORNADO_MIN_TARGETS);\n+            if (targets.size() >= targets_count)\n+            {\n+                me->SetFacingTo(me->GetAbsoluteAngle(me->GetVictim()));\n+                if (doCast(me->GetVictim(), GetSpell(TORNADO_1)))\n+                    return true;\n+            }\n+\n+            return false;\n+        }\n+\n+        bool CheckForkedLightning(uint32 diff)\n+        {\n+            if (!IsSpellReady(FORKED_LIGHTNING_1, diff, false) || !me->GetVictim() || me->GetPower(POWER_MANA) < FORKEDLIGHTNING_COST ||\n+                Rand() > 90 || !me->HasInArc(float(M_PI), me->GetVictim()))\n+                return false;\n+\n+            std::list<Unit*> targets;\n+            GetNearbyTargetsInConeList(targets, CalcSpellMaxRange(FORKED_LIGHTNING_1) - 5.f);\n+            if (targets.size() > ((me->GetLevel() < 60) ? 1u : 0u))\n+            {\n+                me->SetFacingTo(me->GetAbsoluteAngle(me->GetVictim()));\n+                if (doCast(me->GetVictim(), GetSpell(FORKED_LIGHTNING_1)))\n+                    return true;\n+            }\n+\n+            return false;\n+        }\n+\n+        void ApplyClassDamageMultiplierMelee(uint32& damage, CalcDamageInfo& /*damageinfo*/) const override\n+        {\n+            if (IsInContactWithWater())\n+            {\n+                //BOT_LOG_ERROR(\"scripts\", \"ApplyClassDamageMultiplierMelee: {} now in water\", me->GetName());\n+                damage *= 3;\n+            }\n+        }\n+\n+        void ApplyClassDamageMultiplierMeleeSpell(int32& damage, SpellNonMeleeDamage& /*damageinfo*/, SpellInfo const* /*spellInfo*/, WeaponAttackType /*attackType*/, bool /*crit*/) const override\n+        {\n+            if (IsInContactWithWater())\n+            {\n+                //BOT_LOG_ERROR(\"scripts\", \"ApplyClassDamageMultiplierMelee: {} now in water\", me->GetName());\n+                damage *= 3;\n+            }\n+        }\n+\n+        void ApplyClassDamageMultiplierSpell(int32& damage, SpellNonMeleeDamage& /*damageinfo*/, SpellInfo const* spellInfo, WeaponAttackType /*attackType*/, bool iscrit) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+            float fdamage = float(damage);\n+            float flat_mod = 0.f;\n+\n+            if (IsInContactWithWater())\n+            {\n+                //BOT_LOG_ERROR(\"scripts\", \"ApplyClassDamageMultiplierSpell: {} now in water\", me->GetName());\n+                fdamage *= 3.f;\n+            }\n+\n+            //2) apply bonus damage mods\n+            float pctbonus = 1.0f;\n+            if (iscrit)\n+            {\n+                //!!!spell damage is not yet critical and will be multiplied by 1.5\n+                //so we should put here bonus damage mult /1.5\n+                if (/*baseId == FROST_ARROW_1 || */baseId == FORKED_LIGHTNING_1)\n+                    pctbonus *= 1.33f;\n+            }\n+\n+            if (baseId == FORKED_LIGHTNING_1)\n+            {\n+                constexpr float basecoef = 2.5f / 80.f;\n+                float coef = basecoef * (lvl - 3);\n+                fdamage += me->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_MAGIC) * coef * me->CalculateDefaultCoefficient(spellInfo, SPELL_DIRECT_DAMAGE) * me->CalculateSpellpowerCoefficientLevelPenalty(spellInfo);\n+            }\n+\n+            damage = int32(fdamage * pctbonus + flat_mod);\n+        }\n+\n+        void ApplyClassSpellCastTimeMods(SpellInfo const* spellInfo, int32& casttime) const override\n+        {\n+            //uint32 spellId = spellInfo->Id;\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            //uint8 lvl = me->GetLevel();\n+            int32 timebonus = 0;\n+            float pctbonus = 0.0f;\n+\n+            //100% mods\n+            //if ()\n+            //    pctbonus += 1.0f;\n+\n+            //pct mods\n+            //Frost Arrow affect by attack speed\n+            if (baseId == FROST_ARROW_1)\n+                pctbonus += 1.0f - me->m_modAttackSpeedPct[RANGED_ATTACK];\n+\n+            //flat mods\n+            //Starlight Wrath: -0.5 sec cast time for Wrath and Starfire\n+            //if (lvl >= 10 && (baseId == WRATH_1 || baseId == STARFIRE_1))\n+            //    timebonus += 500;\n+\n+            casttime = std::max<int32>(int32((float(casttime) * (1.0f - pctbonus)) - timebonus), 0);\n+        }\n+\n+        void ApplyClassSpellMaxTargetsMods(SpellInfo const* spellInfo, uint32& targets) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+\n+            if (baseId == FORKED_LIGHTNING_1)\n+            {\n+                switch (lvl / 10)\n+                {\n+                    case 8: targets = 666; break;\n+                    case 7: targets =  10; break;\n+                    case 6: targets =   7; break;\n+                    case 5: targets =   6; break;\n+                    case 4: targets =   5; break;\n+                    case 3: targets =   4; break;\n+                    case 2: targets =   3; break;\n+                    case 1: targets =   3; break;\n+                    default:               break;\n+                }\n+            }\n+        }\n+\n+        void ApplyClassEffectMods(SpellInfo const* spellInfo, uint8 effIndex, float& value) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+            float pctbonus = 1.0f;\n+\n+            if (baseId == FROST_ARROW_EFFECT && (effIndex == EFFECT_0 || effIndex == EFFECT_1))\n+            {\n+                switch (lvl / 10)\n+                {\n+                    case 8: case 7: case 6: value = -70; break;\n+                    case 5: case 4:         value = -50; break;\n+                    default:                             break;\n+                }\n+            }\n+\n+            value = value * pctbonus;\n+        }\n+\n+        void ApplyClassEffectValueMultiplierMods(SpellInfo const* spellInfo, SpellEffIndex effIndex, float& multiplier) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //uint8 lvl = me->GetLevel();\n+            float pctbonus = 1.0f;\n+\n+            //Mana Shield absorption modifier\n+            //Base is 10.f\n+            if (baseId == MANA_SHIELD_1 && effIndex == EFFECT_0)\n+                pctbonus *= _manaPerDamageMult();\n+\n+            multiplier = multiplier * pctbonus;\n+        }\n+\n+        void OnClassSpellStart(SpellInfo const* spellInfo) override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            switch (baseId)\n+            {\n+                case FORKED_LIGHTNING_1:\n+                case TORNADO_1:\n+                    _spell_preact = true;\n+                    break;\n+                default:\n+                    break;\n+            }\n+        }\n+\n+        void OnClassSpellGo(SpellInfo const* spellInfo) override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+\n+            switch (baseId)\n+            {\n+                case FROST_ARROW_1:\n+                case FORKED_LIGHTNING_1:\n+                case TORNADO_1:\n+                {\n+                    uint32 attackTime = uint32(me->GetAttackTime(RANGED_ATTACK) * me->m_modAttackSpeedPct[RANGED_ATTACK]);\n+                    if (baseId == FROST_ARROW_1)\n+                    {\n+                        uint32 castTime = spellInfo->CalcCastTime();\n+                        GC_Timer = castTime >= attackTime ? 0 : attackTime - castTime;\n+                    }\n+                    if (baseId == FORKED_LIGHTNING_1 || baseId == TORNADO_1)\n+                    {\n+                        me->resetAttackTimer();\n+                        GC_Timer = attackTime;\n+                        //me->CastSpell(me, MH_ATTACK_ANIM, true);\n+                    }\n+                    break;\n+                }\n+                default:\n+                    break;\n+            }\n+\n+            if (baseId == TORNADO_1)\n+                SummonBotPet();\n+        }\n+\n+        void SpellHitTarget(WorldObject* wtarget, SpellInfo const* spell) override\n+        {\n+            Unit* target = wtarget->ToUnit();\n+            if (!target)\n+                return;\n+\n+            if (target == me)\n+                return;\n+\n+            uint32 baseId = spell->GetFirstRankSpell()->Id;\n+            //uint8 lvl = me->GetLevel();\n+\n+            if (baseId == FORKED_LIGHTNING_1)\n+            {\n+                //Forked Lightning stun\n+                me->CastSpell(target, FORKED_LIGHTNING_EFFECT, true);\n+            }\n+            if (baseId == FROST_ARROW_1)\n+            {\n+                if (AuraEffect* sarr = target->GetAuraEffect(SPELL_AURA_MOD_SPEED_SLOW_ALL, SPELLFAMILY_GENERIC, 0x0, 0x4, 0x0, me->GetGUID()))\n+                {\n+                    sarr->GetBase()->RefreshDuration();\n+                }\n+                else if (Aura* arro = me->AddAura(FROST_ARROW_EFFECT, target))\n+                {\n+                    int32 dur = target->IsPlayer() ? 2000 : 6000;\n+                    arro->SetDuration(dur);\n+                    arro->SetMaxDuration(dur);\n+                }\n+            }\n+            if (baseId == SPELL_PARALYTIC_POISON)\n+            {\n+                if (Aura* para = target->GetAura(SPELL_PARALYTIC_POISON, me->GetGUID()))\n+                {\n+                    static constexpr int32 duration_threshold = 6000;\n+                    if (para->GetMaxDuration() > duration_threshold)\n+                    {\n+                        para->SetDuration(duration_threshold);\n+                        para->SetMaxDuration(duration_threshold);\n+                    }\n+                    else\n+                        para->RefreshDuration();\n+                }\n+            }\n+\n+            OnSpellHitTarget(target, spell);\n+        }\n+\n+        void SpellHit(WorldObject* wcaster, SpellInfo const* spell) override\n+        {\n+            Unit* caster = wcaster->ToUnit();\n+            if (!caster)\n+                return;\n+\n+            OnSpellHit(caster, spell);\n+        }\n+\n+        void OnBotDamageDealt(Unit* victim, uint32 damage, CleanDamage const* cleanDamage, DamageEffectType /*damagetype*/, SpellInfo const* /*spellInfo*/) override\n+        {\n+            if (damage && victim && cleanDamage && (cleanDamage->attackType == BASE_ATTACK || cleanDamage->attackType == OFF_ATTACK) &&\n+                victim->IsWithinCombatRange(me, ATTACK_DISTANCE))\n+            {\n+                if (urand(0, 100) < 5)\n+                {\n+                    int32 baseAmount = 1;\n+                    if (AuraEffect* pois = victim->GetAuraEffect(SPELL_PARALYTIC_POISON, EFFECT_0, me->GetGUID()))\n+                        baseAmount = pois->GetAmount() * 2;\n+                    else\n+                        baseAmount = int32(me->GetFloatValue(UNIT_FIELD_MAXDAMAGE)) + 1;\n+                    CastSpellExtraArgs args(true);\n+                    args.AddSpellBP0(baseAmount);\n+                    me->CastSpell(victim, SPELL_PARALYTIC_POISON, args);\n+                }\n+            }\n+        }\n+\n+        void DamageDealt(Unit* victim, uint32& damage, DamageEffectType damageType) override\n+        {\n+            bot_ai::DamageDealt(victim, damage, damageType);\n+        }\n+\n+        void DamageTaken(Unit* u, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo*/) override\n+        {\n+            if (damage && me->HasAuraType(SPELL_AURA_MANA_SHIELD))\n+                me->RemoveAurasDueToSpell(MANA_SHIELD_1);\n+\n+            if (!u)\n+                return;\n+            if (!u->IsInCombat() && !me->IsInCombat())\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void OwnerAttackedBy(Unit* u) override\n+        {\n+            if (!u)\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        uint8 GetPetPositionNumber(Creature const* /*summon*/) const override\n+        {\n+            return 0;\n+        }\n+\n+        void SummonBotPet()\n+        {\n+            if (!_minions.empty())\n+                UnsummonAll(false);\n+\n+            Position spos;\n+            if (Unit const* mytar = me->GetVictim())\n+                mytar->GetNearPoint(mytar, spos.m_positionX, spos.m_positionY, spos.m_positionZ, me->GetDistance2d(mytar) * 0.25f, mytar->GetAbsoluteAngle(me));\n+            else\n+                me->GetNearPoint(me, spos.m_positionX, spos.m_positionY, spos.m_positionZ, 10.f, 0.f);\n+\n+            Creature* myPet = me->SummonCreature(BOT_PET_TORNADO, spos, TEMPSUMMON_CORPSE_DESPAWN);\n+            myPet->SetCreator(master);\n+            myPet->SetOwnerGUID(me->GetGUID());\n+            myPet->SetFaction(master->GetFaction());\n+            myPet->SetControlledByPlayer(!IAmFree());\n+            myPet->SetPvP(me->IsPvP());\n+            myPet->SetByteValue(UNIT_FIELD_BYTES_2, 1, master->GetByteValue(UNIT_FIELD_BYTES_2, 1));\n+            myPet->SetUInt32Value(UNIT_CREATED_BY_SPELL, TORNADO_1);\n+\n+            CreatureMovementData& cmData = const_cast<CreatureMovementData&>(myPet->GetMovementTemplate());\n+            cmData.Swim = false;\n+            cmData.Ground = CreatureGroundMovementType::Run;\n+            cmData.Flight = CreatureFlightMovementType::None;\n+\n+            _minions.insert(myPet);\n+        }\n+\n+        void UnsummonAll(bool savePets = true) override\n+        {\n+            UnsummonCreatures(_minions, savePets);\n+        }\n+\n+        void SummonedCreatureDies(Creature* /*summon*/, Unit* /*killer*/) override\n+        {\n+            //BOT_LOG_ERROR(\"entities.unit\", \"SummonedCreatureDies: {}'s {}\", me->GetName(), summon->GetName());\n+            //if (summon == botPet)\n+            //    botPet = nullptr;\n+        }\n+\n+        void SummonedCreatureDespawn(Creature* summon) override\n+        {\n+            //BOT_LOG_ERROR(\"entities.unit\", \"SummonedCreatureDespawn: {}'s {}\", me->GetName(), summon->GetName());\n+            if (_minions.contains(summon))\n+                _minions.erase(summon);\n+        }\n+\n+        float GetSpellAttackRange(bool longRange) const override\n+        {\n+            return longRange ? CalcSpellMaxRange(FROST_ARROW_1) - 6.f : CalcSpellMaxRange(FROST_ARROW_1) - 15.f;\n+        }\n+\n+        uint32 GetAIMiscValue(uint32 data) const override\n+        {\n+            switch (data)\n+            {\n+                case BOTAI_MISC_PET_TYPE:\n+                    return BOT_PET_TORNADO;\n+                default:\n+                    return 0;\n+            }\n+        }\n+\n+        void Reset() override\n+        {\n+            UnsummonAll(false);\n+\n+            _spell_preact = false;\n+\n+            DefaultInit();\n+\n+            //swim mod\n+            if (Aura* swim = me->AddAura(NAGA_SWIM_PASSIVE, me))\n+                swim->GetEffect(0)->ChangeAmount(200);\n+\n+            //threat mod\n+            if (Aura* threat = me->AddAura(SPELL_THREAT_MOD, me))\n+                threat->GetEffect(0)->ChangeAmount(-50);\n+        }\n+\n+        void ReduceCD(uint32 /*diff*/) override\n+        {\n+            //if (trapTimer > diff)                   trapTimer -= diff;\n+        }\n+\n+        void InitPowers() override\n+        {\n+            me->SetPowerType(POWER_MANA);\n+        }\n+\n+        void InitSpells() override\n+        {\n+            //uint8 lvl = me->GetLevel();\n+            //InitSpellMap(AUTO_SHOT_1);\n+            InitSpellMap(SHOOT_BOW_1);\n+            InitSpellMap(FORKED_LIGHTNING_1);\n+            InitSpellMap(FROST_ARROW_1);\n+            InitSpellMap(MANA_SHIELD_1);\n+            InitSpellMap(TORNADO_1);\n+        }\n+\n+        void ApplyClassPassives() const override\n+        {\n+        }\n+\n+        //bool CanUseManually(uint32 basespell) const override\n+        //{\n+        //    switch (basespell)\n+        //    {\n+        //        case FORKED_LIGHTNING_1:\n+        //        case TORNADO_1:\n+        //            return true;\n+        //        default:\n+        //            return false;\n+        //    }\n+        //}\n+\n+        bool HasAbilitiesSpecifics() const override { return true; }\n+        void FillAbilitiesSpecifics(Player const* player, std::list<std::string> &specList) override\n+        {\n+            bool amount_is_mana = true;\n+            float amount = AssertBotSpellInfoOverride(MANA_SHIELD_1)->GetEffect(EFFECT_0).CalcValueMultiplier(me); //mana per damage\n+            if (amount < 1.0f)\n+            {\n+                amount_is_mana = false;\n+                amount = 1.f / amount;\n+            }\n+\n+            uint32 text_id = amount_is_mana ? BOT_TEXT_MANA_PER_DAMAGE : BOT_TEXT_DAMAGE_PER_MANA;\n+            std::ostringstream amount_sstr;\n+            amount_sstr.setf(std::ios_base::fixed);\n+            amount_sstr.precision(1);\n+            amount_sstr << LocalizedNpcText(player, text_id) << \": \" << amount;\n+\n+            specList.push_back(amount_sstr.str());\n+        }\n+\n+        std::vector<uint32> const* GetDamagingSpellsList() const override\n+        {\n+            return &Seawitch_spells_damage;\n+        }\n+        std::vector<uint32> const* GetCCSpellsList() const override\n+        {\n+            return &Seawitch_spells_cc;\n+        }\n+        //std::vector<uint32> const* GetHealingSpellsList() const override\n+        //{\n+        //    return &Seawitch_spells_heal;\n+        //}\n+        std::vector<uint32> const* GetSupportSpellsList() const override\n+        {\n+            return &Seawitch_spells_support;\n+        }\n+    private:\n+        using Summons = std::set<Creature*>;\n+        Summons _minions;\n+\n+        bool _spell_preact{};\n+\n+        float _manaPerDamageMult() const\n+        {\n+            switch (me->GetLevel() / 10)\n+            {\n+                case 8: return 1.f / 100.00f;\n+                case 7: return 1.f /  50.00f;\n+                case 6: return 1.f /  20.00f;\n+                case 5: return 1.f /  10.00f;\n+                case 4: return 1.f /   4.00f;\n+                case 3: return 1.f /   2.50f;\n+                case 2: return 1.f /   1.67f;\n+                case 1: return 1.f /   1.25f;\n+                default:return         1.00f;\n+            }\n+        }\n+    };\n+};\n+\n+void AddSC_sea_witch_bot()\n+{\n+    new sea_witch_bot();\n+}\ndiff --git a/src/server/game/AI/NpcBots/bot_shaman_ai.cpp b/src/server/game/AI/NpcBots/bot_shaman_ai.cpp\nnew file mode 100644\nindex 0000000000..76d79371f1\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bot_shaman_ai.cpp\n@@ -0,0 +1,2871 @@\n+#include \"bot_ai.h\"\n+#include \"botlogtraits.h\"\n+#include \"botmgr.h\"\n+#include \"bottext.h\"\n+#include \"bottraits.h\"\n+#include \"Containers.h\"\n+#include \"Group.h\"\n+#include \"Item.h\"\n+#include \"Log.h\"\n+#include \"Map.h\"\n+#include \"MotionMaster.h\"\n+#include \"ObjectAccessor.h\"\n+#include \"ObjectMgr.h\"\n+#include \"Player.h\"\n+#include \"ScriptMgr.h\"\n+#include \"SpellAuraEffects.h\"\n+#include \"Spell.h\"\n+#include \"SpellMgr.h\"\n+#include \"Totem.h\"\n+#include \"WorldSession.h\"\n+/*\n+Shaman NpcBot (reworked by Trickerer onlysuffering@gmail.com)\n+Complete - around 90%\n+TODO: Elemental mastery (exclusive cd with NatSw), Lava Lash\n+Problems:\n+Unsummon elemental totems if Elementals are killed\n+Aura application bug for bot in other subgroup, maybe caused by creatorGUID mismatch\n+*/\n+\n+static constexpr uint8 MAX_WOLVES = 2;\n+static constexpr uint8 MAX_TOTEMS = 4;\n+\n+enum ShamanBaseSpells\n+{\n+    HEALING_WAVE_1                      = 331,\n+    CHAIN_HEAL_1                        = 1064,\n+    LESSER_HEALING_WAVE_1               = 8004,\n+    RIPTIDE_1                           = 61295,\n+    ANCESTRAL_SPIRIT_1                  = 2008,\n+    CURE_TOXINS_1                       = 526,\n+    CLEANSE_SPIRIT_1                    = 51886,\n+    FLAME_SHOCK_1                       = 8050,\n+    EARTH_SHOCK_1                       = 8042,\n+    FROST_SHOCK_1                       = 8056,\n+    STORMSTRIKE_1                       = 17364,\n+    LIGHTNING_BOLT_1                    = 403,\n+    CHAIN_LIGHTNING_1                   = 421,\n+    LAVA_BURST_1                        = 51505,\n+    THUNDERSTORM_1                      = 51490,\n+    LIGHTNING_SHIELD_1                  = 324,\n+    EARTH_SHIELD_1                      = 974,\n+    WATER_SHIELD_1                      = 52127,\n+    WATER_BREATHING_1                   = 131,\n+    WATER_WALKING_1                     = 546,\n+    PURGE_1                             = 370,\n+    WIND_SHEAR_1                        = 57994,\n+    HEX_1                               = 51514,\n+    BLOODLUST_1                         = 2825,\n+    HEROISM_1                           = 32182,\n+    SHAMANISTIC_RAGE_1                  = 30823,\n+    NATURES_SWIFTNESS_1                 = 16188,//castegory = 1202\n+    //ELEMENTAL_MASTERY_1                 = 16166,//castegory = 1202 NYI\n+    TIDAL_FORCE_1                       = 55198,\n+\n+    GHOST_WOLF_1                        = 2645,\n+\n+    FIRE_NOVA_1                         = 1535,//shaman spell\n+    EARTHBIND_TOTEM_1                   = 2484,\n+    MAGMA_TOTEM_1                       = 8190,\n+    SEARING_TOTEM_1                     = 3599,\n+    STONECLAW_TOTEM_1                   = 5730,\n+    FIRE_ELEMENTAL_TOTEM_1              = 2894,\n+    EARTH_ELEMENTAL_TOTEM_1             = 2062,\n+    FIRE_RESISTANCE_TOTEM_1             = 8184,\n+    FROST_RESISTANCE_TOTEM_1            = 8181,\n+    NATURE_RESISTANCE_TOTEM_1           = 10595,\n+    FLAMETONGUE_TOTEM_1                 = 8227,\n+    GROUNDING_TOTEM_1                   = 8177,\n+    SENTRY_TOTEM_1                      = 6495,\n+    STONESKIN_TOTEM_1                   = 8071,\n+    STRENGTH_OF_EARTH_TOTEM_1           = 8075,\n+    WINDFURY_TOTEM_1                    = 8512,\n+    WRATH_OF_AIR_TOTEM_1                = 3738,\n+    CLEANSING_TOTEM_1                   = 8170,\n+    HEALING_STREAM_TOTEM_1              = 5394,\n+    MANA_SPRING_TOTEM_1                 = 5675,\n+    TOTEM_OF_WRATH_1                    = 30706,\n+    MANA_TIDE_TOTEM_1                   = 16190,\n+    TREMOR_TOTEM_1                      = 8143,\n+\n+    TOTEMIC_RECALL_1                    = 36936,\n+\n+    REINCARNATION_1                     = 21169,\n+\n+    FERAL_SPIRIT_1                      = 51533, //not casted\n+\n+    //ROCKBITER_WEAPON_1                  = 8017, //disabled due to bonus handling method\n+    FLAMETONGUE_WEAPON_1                = 8024,\n+    FROSTBRAND_WEAPON_1                 = 8033,\n+    WINDFURY_WEAPON_1                   = 8232,\n+    EARTHLIVING_WEAPON_1                = 51730\n+};\n+\n+enum ShamanPassives\n+{\n+    //Elemental\n+    ELEMENTAL_FOCUS                     = 16164,//clearcast\n+    ELEMENTAL_DEVASTATION1              = 30160,\n+    ELEMENTAL_DEVASTATION2              = 29179,\n+    ELEMENTAL_DEVASTATION3              = 29180,\n+    ELEMENTAL_OATH                      = 51470,//rank 2\n+    //STORM_EARTH_AND_FIRE                = 51486,//rank 3\n+    //Enchancement\n+    TOUGHNESS                           = 16309,//rank 5\n+    FLURRY1                             = 16256,\n+    FLURRY2                             = 16281,\n+    FLURRY3                             = 16282,\n+    FLURRY4                             = 16283,\n+    FLURRY5                             = 16284,\n+    WEAPON_MASTERY                      = 29086,//rank 3\n+    UNLEASHED_RAGE                      = 30809,//rank 3\n+    STATIC_SHOCK                        = 51527,//rank 3\n+    IMPROVED_STORMSTRIKE                = 51522,//rank 2\n+    MAELSTROM_WEAPON1                   = 51528,\n+    MAELSTROM_WEAPON2                   = 51529,\n+    MAELSTROM_WEAPON3                   = 51530,\n+    MAELSTROM_WEAPON4                   = 51531,\n+    MAELSTROM_WEAPON5                   = 51532,\n+    EARTHEN_POWER                       = 51524,//rank 2\n+    //Restoration\n+    ANCESTRAL_HEALING                   = 16240,//rank 3\n+    ANCESTRAL_AWAKENING                 = 51558,//rank 3\n+    IMPROVED_WATER_SHIELD               = 16198,//rank 3\n+    TIDAL_WAVES                         = 51566,//rank 5\n+    //Special\n+    GLYPH_THUNDERSTORM                  = 62132,\n+    GLYPH_TOTEM_OF_WRATH                = 63280,\n+    SHAMAN_T10_RESTO_4P                 = 70808 //Chain Heal HoT\n+};\n+\n+enum ShamanSpecial\n+{\n+    SHAMAN_FLAME_SHOCK_PASSIVE          = 75461,//flame shock damage can be critical in 3.3.5, innate\n+\n+    ELEMENTAL_FOCUS_BUFF                = 16246,\n+    TIDAL_FORCE_BUFF                    = 55166,//Unit::HandleAuraDummy(): case 55198:\n+\n+    MAELSTROM_WEAPON_BUFF               = 53817,\n+    TIDAL_WAVES_BUFF                    = 53390,\n+    STORMSTRIKE_DAMAGE                  = 32175,\n+    STORMSTRIKE_DAMAGE_OFFHAND          = 32176,\n+\n+    LIGHTNING_SHIELD_DAMAGE_1           = 26364,\n+    EARTH_SHIELD_HEAL                   = 379,\n+\n+    RESURRECTION_VISUAL_SPELL           = 21074, //Test NPC Resurrection\n+\n+    EXHAUSTION_AURA                     = 57723,\n+    SATED_AURA                          = 57724,\n+\n+    WINDFURY_ATTACK_MAINHAND            = 25504,\n+    WINDFURY_ATTACK_OFFHAND             = 33750,\n+\n+    STORMEARTHANDFIRE_EARTHGRAB         = 64695,\n+\n+    //TOTEM_AURA_WRATH_AURA1              = 57658,//100\n+    //TOTEM_AURA_WRATH_AURA2              = 57660,//120\n+    //TOTEM_AURA_WRATH_AURA3              = 57662,//140\n+    //TOTEM_AURA_WRATH_AURA4              = 57663,//280\n+    //TOTEM_AURA_RESISTANCE_FIRE_1        = 8185,\n+    //TOTEM_AURA_RESISTANCE_FROST_1       = 8182,\n+    //TOTEM_AURA_RESISTANCE_NATURE_1      = 10596,\n+    //TOTEM_AURA_FLAMETONGUE_1            = 52109,\n+    //TOTEM_AURA_GROUNDING                = 8178,\n+    //TOTEM_AURA_STONESKIN_1              = 8072,\n+    //TOTEM_AURA_STRENGTH_OF_EARTH_1      = 8076,\n+    //TOTEM_AURA_WINDFURY                 = 8515,\n+    //TOTEM_AURA_WRATH_OF_AIR             = 2895,\n+    //TOTEM_AURA_MANA_SPRING_1            = 5677\n+};\n+\n+enum TotemSlot\n+{\n+    T_FIRE  = 0,//m_SummonSlot[1]\n+    T_EARTH = 1,//m_SummonSlot[2]\n+    T_WATER = 2,//m_SummonSlot[3]\n+    T_AIR   = 3,//m_SummonSlot[4]\n+};\n+enum BotTotemType : uint32\n+{\n+    BOT_TOTEM_NONE                  = 0,\n+    BOT_TOTEM_STRENGTH_OF_EARTH     = 1, //main earth totem\n+    BOT_TOTEM_FLAMETONGUE           = 2, //main fire totem\n+    BOT_TOTEM_WRATH                 = 3, //main fire totem\n+    BOT_TOTEM_MANA_SPRING           = 4, //main water totem\n+    BOT_TOTEM_WINDFURY              = 5, //main air totem\n+    BOT_TOTEM_WRATH_OF_AIR          = 6, //main air totem\n+    BOT_TOTEM_STONESKIN             = 7, //secondary earth totem UNUSED\n+    BOT_TOTEM_HEALING_STREAM        = 8, //secondary water totem UNUSED\n+    BOT_TOTEM_TREMOR                = 9, //situative earth 1\n+    BOT_TOTEM_EARTHBIND             = 10, //situative earth 2\n+    BOT_TOTEM_MAGMA                 = 11, //situative fire 1\n+    BOT_TOTEM_MANA_TIDE             = 12, //situative water 1\n+    BOT_TOTEM_CLEANSING             = 13, //situative water 2 non-raid\n+    BOT_TOTEM_GROUNDING             = 14, //situative air 1\n+    BOT_TOTEM_RESISTANCE_FROST      = 15, //manual fire 1\n+    BOT_TOTEM_RESISTANCE_FIRE       = 16, //manual water 1\n+    BOT_TOTEM_RESISTANCE_NATURE     = 17, //manual air 1\n+    BOT_TOTEM_ELEMENTAL_EARTH       = 18, //manual earth 1\n+    BOT_TOTEM_ELEMENTAL_FIRE        = 19, //manual fire 2\n+    BOT_TOTEM_SENTRY                = 20, //UNUSED\n+    BOT_TOTEM_STONECLAW             = 21, //UNUSED\n+    BOT_TOTEM_SEARING               = 22, //UNUSED, annoying as hell too\n+    BOT_TOTEM_END,\n+\n+    BOT_TOTEM_FLAG_MY_TOTEM_FIRE,\n+    BOT_TOTEM_FLAG_MY_TOTEM_EARTH,\n+    BOT_TOTEM_FLAG_MY_TOTEM_WATER,\n+    BOT_TOTEM_FLAG_MY_TOTEM_AIR,\n+\n+    BOT_TOTEM_MASK_SUMMONS          = ((1<<BOT_TOTEM_ELEMENTAL_EARTH)|(1<<BOT_TOTEM_ELEMENTAL_FIRE)),\n+\n+    //BOT_TOTEM_MASK_MY_TOTEM         = (1<<BOT_TOTEM_NONE),\n+\n+    BOT_TOTEM_MASK_STRENGTH_OF_EARTH= (1<<BOT_TOTEM_STRENGTH_OF_EARTH),\n+    BOT_TOTEM_MASK_FLAMETONGUE      = (1<<BOT_TOTEM_FLAMETONGUE),\n+    BOT_TOTEM_MASK_WRATH            = (1<<BOT_TOTEM_WRATH),\n+    BOT_TOTEM_MASK_MANA_SPRING      = (1<<BOT_TOTEM_MANA_SPRING),\n+    BOT_TOTEM_MASK_WINDFURY         = (1<<BOT_TOTEM_WINDFURY),\n+    BOT_TOTEM_MASK_WRATH_OF_AIR     = (1<<BOT_TOTEM_WRATH_OF_AIR),\n+    //BOT_TOTEM_MASK_STONESKIN        = (1<<BOT_TOTEM_STONESKIN),\n+    BOT_TOTEM_MASK_MANA_TIDE        = (1<<BOT_TOTEM_MANA_TIDE),\n+    BOT_TOTEM_MASK_GROUNDING        = (1<<BOT_TOTEM_GROUNDING),\n+    BOT_TOTEM_MASK_RESISTANCE_FROST = (1<<BOT_TOTEM_RESISTANCE_FROST),\n+    BOT_TOTEM_MASK_RESISTANCE_FIRE  = (1<<BOT_TOTEM_RESISTANCE_FIRE),\n+    BOT_TOTEM_MASK_RESISTANCE_NATURE= (1<<BOT_TOTEM_RESISTANCE_NATURE),\n+\n+    BOT_TOTEM_MASK_PRIMARY_FIRE     = (BOT_TOTEM_MASK_FLAMETONGUE | BOT_TOTEM_MASK_WRATH),\n+\n+    BOT_TOTEM_MASK_MY_TOTEM_FIRE    = (1<<BOT_TOTEM_FLAG_MY_TOTEM_FIRE),\n+    BOT_TOTEM_MASK_MY_TOTEM_EARTH   = (1<<BOT_TOTEM_FLAG_MY_TOTEM_EARTH),\n+    BOT_TOTEM_MASK_MY_TOTEM_WATER   = (1<<BOT_TOTEM_FLAG_MY_TOTEM_WATER),\n+    BOT_TOTEM_MASK_MY_TOTEM_AIR     = (1<<BOT_TOTEM_FLAG_MY_TOTEM_AIR),\n+\n+    BOT_TOTEM_MASK_PRIMARY_USE      = (BOT_TOTEM_MASK_STRENGTH_OF_EARTH | BOT_TOTEM_MASK_FLAMETONGUE | \\\n+                                    BOT_TOTEM_MASK_WRATH | BOT_TOTEM_MASK_MANA_SPRING | \\\n+                                    BOT_TOTEM_WINDFURY | BOT_TOTEM_MASK_WRATH_OF_AIR),\n+\n+    BOT_TOTEM_MASK_MY_TOTEM_ALL     = (BOT_TOTEM_MASK_MY_TOTEM_FIRE | BOT_TOTEM_MASK_MY_TOTEM_EARTH | \\\n+                                    BOT_TOTEM_MASK_MY_TOTEM_WATER | BOT_TOTEM_MASK_MY_TOTEM_AIR)\n+};\n+\n+static const std::vector<uint32> Shaman_spells_damage\n+{ EARTH_SHOCK_1, FLAME_SHOCK_1, FROST_SHOCK_1, STORMSTRIKE_1, CHAIN_LIGHTNING_1, LAVA_BURST_1, LIGHTNING_BOLT_1,\n+FIRE_NOVA_1, MAGMA_TOTEM_1, SEARING_TOTEM_1, LIGHTNING_SHIELD_1, THUNDERSTORM_1, EARTH_ELEMENTAL_TOTEM_1, FIRE_ELEMENTAL_TOTEM_1 };\n+static const std::vector<uint32> Shaman_spells_cc{ EARTHBIND_TOTEM_1, FROST_SHOCK_1, HEX_1, WIND_SHEAR_1 };\n+static const std::vector<uint32> Shaman_spells_heal{ EARTH_SHIELD_1, CHAIN_HEAL_1, LESSER_HEALING_WAVE_1, HEALING_WAVE_1, RIPTIDE_1, HEALING_STREAM_TOTEM_1 };\n+static const std::vector<uint32> Shaman_spells_support\n+{ ANCESTRAL_SPIRIT_1, GHOST_WOLF_1, FERAL_SPIRIT_1, BLOODLUST_1, HEROISM_1, CURE_TOXINS_1, CLEANSE_SPIRIT_1,\n+LIGHTNING_SHIELD_1, NATURES_SWIFTNESS_1, PURGE_1, REINCARNATION_1, SHAMANISTIC_RAGE_1, TIDAL_FORCE_1,\n+/*WATER_BREATHING_1, */WATER_SHIELD_1, WATER_WALKING_1, /*ELEMENTAL_MASTERY_1, STONECLAW_TOTEM_1,*/\n+FIRE_RESISTANCE_TOTEM_1, FROST_RESISTANCE_TOTEM_1, NATURE_RESISTANCE_TOTEM_1, FLAMETONGUE_TOTEM_1, GROUNDING_TOTEM_1,\n+/*SENTRY_TOTEM_1, STONESKIN_TOTEM_1, */STRENGTH_OF_EARTH_TOTEM_1, WINDFURY_TOTEM_1, WRATH_OF_AIR_TOTEM_1,\n+CLEANSING_TOTEM_1, MANA_SPRING_TOTEM_1, TOTEM_OF_WRATH_1, MANA_TIDE_TOTEM_1, TREMOR_TOTEM_1/*, TOTEMIC_RECALL_1,\n+ROCKBITER_WEAPON_1, FLAMETONGUE_WEAPON_1, FROSTBRAND_WEAPON_1, WINDFURY_WEAPON_1, EARTHLIVING_WEAPON_1*/ };\n+\n+class shaman_bot : public CreatureScript\n+{\n+public:\n+    shaman_bot() : CreatureScript(\"shaman_bot\") { }\n+\n+    CreatureAI* GetAI(Creature* creature) const override\n+    {\n+        return new shaman_botAI(creature);\n+    }\n+/*\n+    bool OnGossipHello(Player* player, Creature* creature)\n+    {\n+        return creature->GetBotAI()->OnGossipHello(player, 0);\n+    }\n+\n+    bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action)\n+    {\n+        if (bot_ai* ai = creature->GetBotAI())\n+            return ai->OnGossipSelect(player, creature, sender, action);\n+        return true;\n+    }\n+\n+    bool OnGossipSelectCode(Player* player, Creature* creature, uint32 sender, uint32 action, char const* code)\n+    {\n+        if (bot_ai* ai = creature->GetBotAI())\n+            return ai->OnGossipSelectCode(player, creature, sender, action, code);\n+        return true;\n+    }\n+*/\n+    struct shaman_botAI : public bot_ai\n+    {\n+        shaman_botAI(Creature* creature) : bot_ai(creature)\n+        {\n+            _botclass = BOT_CLASS_SHAMAN;\n+\n+            mhEnchantExpireTimer = 1;\n+            ohEnchantExpireTimer = 1;\n+            mhEnchant = 0;\n+            ohEnchant = 0;\n+            needChooseMHEnchant = true;\n+            needChooseOHEnchant = true;\n+\n+            InitUnitFlags();\n+        }\n+\n+        bool doCast(Unit* victim, uint32 spellId)\n+        {\n+            if (CheckBotCast(victim, spellId) != SPELL_CAST_OK)\n+                return false;\n+            return bot_ai::doCast(victim, spellId);\n+        }\n+\n+        //only for totems\n+        bool doCast(Unit* victim, uint32 spellId, TriggerCastFlags flags)\n+        {\n+            if (CheckBotCast(victim, spellId) != SPELL_CAST_OK)\n+                return false;\n+            if (bot_ai::doCast(victim, spellId, flags))\n+            {\n+                //Calls: 1.5 sec, totems: 1 sec\n+                GC_Timer = (flags & TRIGGERED_CAST_DIRECTLY) ? 1500 : 1000;\n+                return true;\n+            }\n+\n+            return false;\n+        }\n+\n+        void StartAttack(Unit* u, bool force = false)\n+        {\n+            if (!bot_ai::StartAttack(u, force))\n+                return;\n+            GetInPosition(force, u);\n+        }\n+\n+        void JustEnteredCombat(Unit* u) override { TotemsCheckTimer = 0; canTremor = false; bot_ai::JustEnteredCombat(u); }\n+        void KilledUnit(Unit* u) override { bot_ai::KilledUnit(u); }\n+        void EnterEvadeMode(EvadeReason why = EVADE_REASON_OTHER) override { bot_ai::EnterEvadeMode(why); }\n+        void MoveInLineOfSight(Unit* u) override { bot_ai::MoveInLineOfSight(u); }\n+        void JustDied(Unit* u) override { UnsummonAll(false); removeShapeshiftForm(); bot_ai::JustDied(u); }\n+\n+        bool removeShapeshiftForm() override\n+        {\n+            ShapeshiftForm form = me->GetShapeshiftForm();\n+            if (form != FORM_NONE)\n+            {\n+                switch (form)\n+                {\n+                    case FORM_GHOSTWOLF:\n+                        me->RemoveAurasDueToSpell(GHOST_WOLF_1);\n+                        break;\n+                    default:\n+                        break;\n+                }\n+            }\n+\n+            return true;\n+        }\n+\n+        void CheckBloodlust(uint32 diff)\n+        {\n+            if (BloodlustCheckTimer > diff || (!me->IsInCombat() && !master->IsInCombat()) ||\n+                me->GetDistance(master) > 18 || Rand() > 35)\n+                return;\n+\n+            BloodlustCheckTimer = 3000;\n+\n+            uint32 BLOODLUST = (me->GetRaceMask() & RACEMASK_ALLIANCE) ? HEROISM_1 : BLOODLUST_1;\n+            if (!IsSpellReady(BLOODLUST, diff))\n+                return;\n+\n+            //already rockin'\n+            if (me->GetAuraEffect(SPELL_AURA_MOD_MELEE_RANGED_HASTE, SPELLFAMILY_SHAMAN, 0x0, 0x40, 0x0) ||\n+                master->GetAuraEffect(SPELL_AURA_MOD_MELEE_RANGED_HASTE, SPELLFAMILY_SHAMAN, 0x0, 0x40, 0x0))\n+                return;\n+\n+            //environment conditions\n+            Unit const* u = me->GetVictim();\n+            Creature const* cre = u ? u->ToCreature() : nullptr;\n+            if (!(u && (u->GetHealth() > me->GetMaxHealth() * 10 || u->IsPlayer() ||\n+                (cre && (cre->IsDungeonBoss() || cre->isWorldBoss())) ||\n+                me->getAttackers().size() + master->getAttackers().size() >= 8)))\n+                return;\n+\n+            //BLOODLUST = GetSpell(BLOODLUST); //not ranked\n+\n+            uint32 sateSpell = (me->GetRaceMask() & RACEMASK_ALLIANCE) ? EXHAUSTION_AURA : SATED_AURA;\n+            for (AuraEffect const* aeff : me->GetAuraEffectsByType(SPELL_AURA_DUMMY))\n+            {\n+                if (aeff->GetEffIndex() != 0) continue;\n+                SpellInfo const* spellInfo = aeff->GetSpellInfo();\n+                if (spellInfo->SpellFamilyName != SPELLFAMILY_GENERIC || spellInfo->SpellIconID != 44) continue;\n+                if (spellInfo->Id == sateSpell)\n+                    return; //can't cast my type of bloodlust\n+            }\n+\n+            me->InterruptNonMeleeSpells(true);\n+            if (doCast(me, BLOODLUST))\n+                return;\n+        }\n+\n+        void CheckTotems(uint32 diff)\n+        {\n+            if (TotemsCheckTimer > diff)\n+                return;\n+\n+            TotemsCheckTimer = urand(1500, 2000) + (!IAmFree() ? 100 * master->GetNpcBotsCount() / 2 : 0);\n+\n+            //Unsummon\n+            for (auto i : NPCBots::index_array<uint8, MAX_TOTEMS>)\n+            {\n+                if (_totems[i].first != ObjectGuid::Empty &&\n+                    (!master->IsAlive() || master->GetDistance(_totems[i].second._pos) > _totems[i].second._effradius) &&\n+                    me->GetDistance(_totems[i].second._pos) > _totems[i].second._effradius)\n+                {\n+                    //Check if we can use totemic recall and regain some mana\n+                    if (!me->GetVictim()/* && GetManaPCT(me) < 90*/ && IsSpellReady(TOTEMIC_RECALL_1, diff))\n+                    {\n+                        uint8 count = 0;\n+                        for (auto j : NPCBots::index_array<uint8, MAX_TOTEMS>)\n+                        {\n+                            if (j == i || _totems[j].first == ObjectGuid::Empty) continue;\n+                            if (me->GetDistance(_totems[j].second._pos) > 20.f)\n+                                ++count;\n+                        }\n+                        if (count > 1)\n+                        {\n+                            if (doCast(me, GetSpell(TOTEMIC_RECALL_1)))\n+                                return;\n+                        }\n+                    }\n+                    Unit* to = ObjectAccessor::GetUnit(*me, _totems[i].first);\n+                    if (!to)\n+                    {\n+                        BOT_LOG_ERROR(\"entities.player\", \"{} has unexpectingly lost totem in slot {}!\", me->GetName(), i);\n+                        _totems[i].first = ObjectGuid::Empty;\n+                        continue;\n+                    }\n+                    to->ToTotem()->UnSummon();\n+                    //reset summon check timer;\n+                    _totemTimer[i] = 0;\n+                }\n+            }\n+            //global cooldown is not performed below, intead there is a special condition for Calls\n+            if (GC_Timer > diff || me->IsMounted() || Feasting() || IsCasting() ||\n+                (master->IsAlive() && me->GetDistance(master) > 15))\n+                return;\n+\n+            bool CotE = me->GetLevel() >= 30; //Call of the Elements is at level 30;\n+\n+            std::map<uint32, uint32> idMap;\n+            uint32 mask = _getTotemsMask(idMap);\n+            Group const* gr = GetGroup();\n+            std::vector<Unit*> members = BotMgr::GetAllGroupMembers(gr);\n+            uint8 subgr = GetSubGroup();\n+\n+            //EARTH\n+            //EARTHsituative1 : tremor\n+            if (_totemTimer[T_EARTH] <= diff && me->IsInCombat() && !IAmFree() &&\n+                IsSpellReady(TREMOR_TOTEM_1, diff, false) && _totems[T_EARTH].second._type != BOT_TOTEM_TREMOR)\n+            {\n+                //Tremor no cd\n+                if (Unit const* victim = me->GetVictim())\n+                {\n+                    if (Spell const* vspell = victim->GetCurrentSpell(CURRENT_GENERIC_SPELL))\n+                    {\n+                        if (vspell->m_targets.GetUnitTargetGUID() == me->GetGUID())\n+                        {\n+                            SpellInfo const* vspellInfo = vspell->GetSpellInfo();\n+                            static const std::array<uint32, 3> TremorMechanics = { MECHANIC_FEAR, MECHANIC_CHARM, MECHANIC_SLEEP };\n+                            static const auto is_tremor_effect = [](SpellEffectInfo const& effect) {  return effect.IsAura(SPELL_AURA_MOD_FEAR) || effect.IsAura(SPELL_AURA_MOD_CHARM); };\n+                            if (std::ranges::find(TremorMechanics, vspellInfo->Mechanic) != TremorMechanics.cend() ||\n+                                std::ranges::any_of(vspellInfo->_effects, is_tremor_effect))\n+                            {\n+                                canTremor = true;\n+                            }\n+                        }\n+                    }\n+                }\n+                if (!canTremor)\n+                {\n+                    uint8 count = 0;\n+                    for (Unit const* member : members)\n+                    {\n+                        if (me->GetMap() != member->FindMap() || !member->InSamePhase(me) ||\n+                            !member->IsAlive() || me->GetDistance(member) > 20 ||\n+                            (member->IsPlayer() ? member->ToPlayer()->GetSubGroup() : member->ToCreature()->GetSubGroup()) != subgr ||\n+                            (member->IsNPCBot() && member->ToCreature()->IsTempBot()) ||\n+                            !member->HasAuraWithMechanic((1u<<MECHANIC_CHARM)|(1u<<MECHANIC_FEAR)|(1u<<MECHANIC_SLEEP)))\n+                            continue;\n+                        ++count;\n+                    }\n+                    canTremor = count >= (1 + 1*(!!(mask & BOT_TOTEM_MASK_MY_TOTEM_EARTH)));\n+                }\n+                if (canTremor)\n+                {\n+                    if (doCast(me, GetSpell(TREMOR_TOTEM_1), CotE ? TRIGGERED_CAST_DIRECTLY : TRIGGERED_NONE))\n+                        if (!CotE)\n+                            return;\n+                }\n+                //check if casted\n+                if (_totems[T_EARTH].second._type != BOT_TOTEM_TREMOR)\n+                    SetSpellCooldown(TREMOR_TOTEM_1, 3000); //fail\n+            }\n+\n+            if (!(mask & BOT_TOTEM_MASK_MY_TOTEM_EARTH) && _totemTimer[T_EARTH] <= diff && me->IsInCombat())\n+            {\n+                //EARTHsituative2 : earthbind\n+                if (GetSpell(EARTHBIND_TOTEM_1)/* && _totems[T_EARTH].second.type != BOT_TOTEM_EARTHBIND*/)\n+                {\n+                    //15 sec cd, nearby enemies, instant effect\n+                    std::list<Unit*> targets;\n+                    GetNearbyTargetsList(targets, 15.f, 1);\n+                    for (std::list<Unit*>::iterator itr = targets.begin(); itr != targets.end();)\n+                    {\n+                        Unit* u = *itr;\n+                        bool erase = false;\n+                        if (u->HasAuraType(SPELL_AURA_MOD_DECREASE_SPEED) || u->HasAuraType(SPELL_AURA_MOD_SPEED_SLOW_ALL))\n+                            erase = true;\n+                        else if (u->isMoving())\n+                        {\n+                            if (me->GetDistance(u) > 10.f && !u->HasInArc(float(M_PI)/2, me))\n+                                erase = true;\n+                        }\n+                        else if (me->GetDistance(u) > 9.f)\n+                            erase = true;\n+\n+                        if (erase)\n+                        {\n+                            targets.erase(itr++);\n+                            continue;\n+                        }\n+                        ++itr;\n+                    }\n+\n+                    if (uint8(targets.size()) >= (1 + 2*((mask & BOT_TOTEM_MASK_MY_TOTEM_EARTH) != 0)))\n+                    {\n+                        if (doCast(me, GetSpell(EARTHBIND_TOTEM_1), CotE ? TRIGGERED_CAST_DIRECTLY : TRIGGERED_NONE))\n+                            if (!CotE)\n+                                return;\n+                    }\n+                }\n+            }\n+\n+            if (!(mask & BOT_TOTEM_MASK_MY_TOTEM_EARTH) && _totemTimer[T_EARTH] <= diff && me->IsInCombat())\n+            {\n+                //EARTHmain : strength of earth\n+                uint32 SoE = GetSpell(STRENGTH_OF_EARTH_TOTEM_1); //tripple check\n+                if (SoE &&\n+                    (!(mask & BOT_TOTEM_MASK_STRENGTH_OF_EARTH) || idMap[STRENGTH_OF_EARTH_TOTEM_1] < SoE))\n+                {\n+                    //no cd\n+                    if (doCast(me, SoE, CotE ? TRIGGERED_CAST_DIRECTLY : TRIGGERED_NONE))\n+                        if (!CotE)\n+                            return;\n+                }\n+\n+                //EARTHlast : earth elemental (for mass taunt)\n+                //uint32 earthElem = GetSpell(EARTH_ELEMENTAL_TOTEM_1);\n+                //if (earthElem && IsSpellReady(EARTH_ELEMENTAL_TOTEM_1, diff) && !me->GetMap()->IsDungeon() &&\n+                //    me->getAttackers().size() > 1)\n+                //{\n+                //    //no cd\n+                //    if (doCast(me, earthElem, CotE ? TRIGGERED_CAST_DIRECTLY : TRIGGERED_NONE))\n+                //        if (!CotE)\n+                //            return;\n+                //}\n+            }\n+\n+            //FIRE\n+            //FIREsituative1 : magma\n+            if (_totemTimer[T_FIRE] <= diff && me->IsInCombat() && !IAmFree() && HasRole(BOT_ROLE_DPS) &&\n+                GetSpell(MAGMA_TOTEM_1)/* && _totems[T_FIRE].second.type != BOT_TOTEM_MAGMA*/)\n+            {\n+                //magma no cd 8 yd, 2 sec delay before first tick\n+                std::list<Unit*> targets;\n+                GetNearbyTargetsList(targets, 13.f, 1);\n+                for (std::list<Unit*>::iterator itr = targets.begin(); itr != targets.end();)\n+                {\n+                    Unit* u = *itr;\n+                    bool erase = false;\n+                    if (u->isMoving())\n+                    {\n+                        if (me->GetDistance(u) > 10.f && !u->HasInArc(float(M_PI)/2, me))\n+                            erase = true;\n+                    }\n+                    else if (me->GetDistance(u) > 7.f)\n+                        erase = true;\n+\n+                    if (erase)\n+                    {\n+                        targets.erase(itr++);\n+                        continue;\n+                    }\n+                    ++itr;\n+                }\n+\n+                if (uint8(targets.size()) >= (3 + 3*((mask & BOT_TOTEM_MASK_MY_TOTEM_FIRE) != 0)))\n+                {\n+                    if (doCast(me, GetSpell(MAGMA_TOTEM_1), CotE ? TRIGGERED_CAST_DIRECTLY : TRIGGERED_NONE))\n+                        if (!CotE)\n+                            return;\n+                }\n+            }\n+\n+            if (!(mask & BOT_TOTEM_MASK_MY_TOTEM_FIRE) && me->IsInCombat() && _totemTimer[T_FIRE] <= diff)\n+            {\n+                //FIREMain : wrath or flametongue no cd\n+                //aura is exclusive so check mask\n+                uint32 base = TOTEM_OF_WRATH_1;\n+                uint32 wrathTotem = GetSpell(TOTEM_OF_WRATH_1);\n+                uint32 fMask = BOT_TOTEM_MASK_WRATH;\n+                if (!wrathTotem)\n+                {\n+                    base = FLAMETONGUE_TOTEM_1;\n+                    wrathTotem = GetSpell(FLAMETONGUE_TOTEM_1);\n+                    fMask = BOT_TOTEM_MASK_FLAMETONGUE;\n+                }\n+                if (wrathTotem &&\n+                    ((mask & BOT_TOTEM_MASK_PRIMARY_FIRE) < fMask ||\n+                    ((mask & BOT_TOTEM_MASK_PRIMARY_FIRE) == fMask && idMap[base] < wrathTotem)))\n+                {\n+                    if (doCast(me, wrathTotem, CotE ? TRIGGERED_CAST_DIRECTLY : TRIGGERED_NONE))\n+                        if (!CotE)\n+                            return;\n+                }\n+\n+                //FIREaddin : fire elemental\n+                //uint32 fireElem = GetSpell(FIRE_ELEMENTAL_TOTEM_1);\n+                //if (fireElem && IsSpellReady(FIRE_ELEMENTAL_TOTEM_1, diff) && !me->GetMap()->IsDungeon())\n+                //{\n+                //    if (doCast(me, fireElem, CotE ? TRIGGERED_CAST_DIRECTLY : TRIGGERED_NONE))\n+                //        if (!CotE)\n+                //            return;\n+                //}\n+            }\n+\n+            if (!(mask & BOT_TOTEM_MASK_MY_TOTEM_FIRE) && me->IsInCombat() && _totemTimer[T_FIRE] <= diff)\n+            {\n+                //FIRElastresort : frostres (3 shamans of same level req)\n+                uint32 frostRes = GetSpell(FROST_RESISTANCE_TOTEM_1);\n+                if (frostRes && !IAmFree() &&\n+                    (!(mask & BOT_TOTEM_MASK_RESISTANCE_FROST) || idMap[FROST_RESISTANCE_TOTEM_1] < frostRes))\n+                {\n+                    if (doCast(me, frostRes, CotE ? TRIGGERED_CAST_DIRECTLY : TRIGGERED_NONE))\n+                        if (!CotE)\n+                            return;\n+                }\n+            }\n+\n+            //WATER\n+            //WATERsituative1 : manatide\n+            if (_totemTimer[T_WATER] <= diff && me->IsInCombat() && !IAmFree() &&\n+                IsSpellReady(MANA_TIDE_TOTEM_1, diff, false))\n+            {\n+                //5 min cd, party members only, instant effect +4 ticks in 12 secs\n+                bool cast = false;\n+                if (master->IsInCombat() && master->GetPowerType() == POWER_MANA &&\n+                    GetManaPCT(master) < 35 && me->GetDistance(master) < 18)\n+                    cast = true;\n+                else if (me->IsInCombat() && GetManaPCT(me) < 35)\n+                    cast = true;\n+                else\n+                {\n+                    uint8 count = 0;\n+                    for (Unit const* member : members)\n+                    {\n+                        if (me->GetMap() != member->FindMap() || !member->InSamePhase(me) ||\n+                            !member->IsAlive() || !member->IsInCombat() || member->GetPowerType() != POWER_MANA ||\n+                            (member->IsPlayer() ? member->ToPlayer()->GetSubGroup() : member->ToCreature()->GetSubGroup()) != subgr ||\n+                            GetManaPCT(member) > 35 || me->GetDistance(member) > 20 ||\n+                            (member->IsNPCBot() && member->ToCreature()->IsTempBot()))\n+                            continue;\n+                        ++count;\n+                    }\n+                    cast = (count >= (3 + 1*(!!(mask & BOT_TOTEM_MASK_MY_TOTEM_WATER))));\n+                }\n+                if (cast)\n+                {\n+                    if (doCast(me, GetSpell(MANA_TIDE_TOTEM_1), CotE ? TRIGGERED_CAST_DIRECTLY : TRIGGERED_NONE))\n+                        if (!CotE)\n+                            return;\n+                }\n+                //check if casted\n+                if (_totems[T_WATER].second._type != BOT_TOTEM_MANA_TIDE)\n+                    SetSpellCooldown(MANA_TIDE_TOTEM_1, 3000); //fail\n+            }\n+\n+            //WATERsituative2 : cleansing\n+            //REMOVED CHECKS ARE TOO HEAVY\n+\n+            if (!(mask & BOT_TOTEM_MASK_MY_TOTEM_WATER) && _totemTimer[T_WATER] <= diff)\n+            {\n+                //WATERmain : manaspring\n+                uint32 MSpring = GetSpell(MANA_SPRING_TOTEM_1); //tripple check\n+                if (MSpring && (me->IsInCombat() || !master->isMoving()) &&\n+                    (!(mask & BOT_TOTEM_MASK_MANA_SPRING) || idMap[MANA_SPRING_TOTEM_1] < MSpring))\n+                {\n+                    //no cd\n+                    bool cast = false;\n+                    if (!master->isMoving() && master->GetPowerType() == POWER_MANA && GetManaPCT(master) < 85)\n+                        cast = true;\n+                    else if (!me->isMoving() && GetManaPCT(me) < 95)\n+                        cast = true;\n+                    else\n+                    {\n+                        for (Unit const* member : members)\n+                        {\n+                            if (me->GetMap() != member->FindMap() || !member->InSamePhase(me) ||\n+                                !member->IsAlive() || member->GetPowerType() != POWER_MANA ||\n+                                GetManaPCT(member) > 85 || me->GetDistance(member) > 25 ||\n+                                (member->IsNPCBot() && member->ToCreature()->IsTempBot()))\n+                                continue;\n+                            cast = true;\n+                            break;\n+                        }\n+                    }\n+                    if (cast)\n+                    {\n+                        if (doCast(me, MSpring, CotE ? TRIGGERED_CAST_DIRECTLY : TRIGGERED_NONE))\n+                            if (!CotE)\n+                                return;\n+                    }\n+                }\n+            }\n+\n+            if (!(mask & BOT_TOTEM_MASK_MY_TOTEM_WATER) && _totemTimer[T_WATER] <= diff)\n+            {\n+                //WATERlastresort : fireres (2-3 shamans of same level req)\n+                uint32 fireRes = GetSpell(FIRE_RESISTANCE_TOTEM_1);\n+                if (fireRes && _totemTimer[T_WATER] <= diff && me->IsInCombat() && !IAmFree() &&\n+                    (!(mask & BOT_TOTEM_MASK_RESISTANCE_FIRE) || idMap[FIRE_RESISTANCE_TOTEM_1] < fireRes))\n+                {\n+                    if (doCast(me, fireRes, CotE ? TRIGGERED_CAST_DIRECTLY : TRIGGERED_NONE))\n+                        if (!CotE)\n+                            return;\n+                }\n+            }\n+\n+            //AIR\n+            //AIRsituative1 : grounding\n+            if (_totemTimer[T_AIR] <= diff && me->IsInCombat() &&/* !IAmFree() &&*/\n+                IsSpellReady(GROUNDING_TOTEM_1, diff, false))\n+            {\n+                //grounding 15 sec cd, party members only (and bot and master of course)\n+                bool cast = false;\n+                if (Unit const* u = FindCastingTarget(27)) //totem must be within cast distance\n+                {\n+                    if (Spell const* spell = u->GetCurrentSpell(CURRENT_GENERIC_SPELL))\n+                    {\n+                        ObjectGuid tGuid = spell->m_targets.GetUnitTargetGUID();\n+                        if (tGuid == me->GetGUID() || tGuid == master->GetGUID() || (gr && gr->IsMember(tGuid) && gr->SameSubGroup(tGuid, me->GetGUID())))\n+                        {\n+                            Unit const* t = ObjectAccessor::GetUnit(*me, tGuid);\n+                            if (t && t->GetDistance(me) < 27 && !t->HasAuraType(SPELL_AURA_SPELL_MAGNET))\n+                                cast = true;\n+                        }\n+                    }\n+                }\n+                if (cast)\n+                {\n+                    if (doCast(me, GetSpell(GROUNDING_TOTEM_1), CotE ? TRIGGERED_CAST_DIRECTLY : TRIGGERED_NONE))\n+                        if (!CotE)\n+                            return;\n+                }\n+            }\n+\n+            if (!(mask & BOT_TOTEM_MASK_MY_TOTEM_AIR) && _totemTimer[T_AIR] <= diff && me->IsInCombat())\n+            {\n+                //AIRmain1 : wrathofair - if windfury is disabled or me and master both casters\n+                if (!(mask & BOT_TOTEM_MASK_WRATH_OF_AIR) && GetSpell(WRATH_OF_AIR_TOTEM_1))\n+                {\n+                    bool cast = false;\n+\n+                    if (!IsMelee() && HasRole(BOT_ROLE_DPS|BOT_ROLE_HEAL) && !IsMeleeClass(master->GetClass()))\n+                        cast = true;\n+                    else if (!GetSpell(WINDFURY_TOTEM_1)) //disabled\n+                        cast = true;\n+                    else if (!(mask & BOT_TOTEM_MASK_MY_TOTEM_AIR))\n+                        if (mask & BOT_TOTEM_MASK_WINDFURY) //already have windfury from someone else\n+                            cast = true;\n+\n+                    if (cast)\n+                    {\n+                        if (doCast(me, GetSpell(WRATH_OF_AIR_TOTEM_1), CotE ? TRIGGERED_CAST_DIRECTLY : TRIGGERED_NONE))\n+                            //if (!CotE)\n+                                return;\n+                    }\n+                }\n+            }\n+\n+            if (!(mask & BOT_TOTEM_MASK_MY_TOTEM_AIR) && _totemTimer[T_AIR] <= diff && me->IsInCombat())\n+            {\n+                //AIRmain2 : windfury\n+                if (!(mask & BOT_TOTEM_MASK_WINDFURY) && GetSpell(WINDFURY_TOTEM_1))\n+                {\n+                    bool cast = false;\n+\n+                    if ((IsMelee() && HasRole(BOT_ROLE_DPS)) || (!IAmFree() && IsMeleeClass(master->GetClass())))\n+                        cast = true;\n+                    else if (!GetSpell(WRATH_OF_AIR_TOTEM_1)) //disabled or not available yet\n+                        cast = true;\n+                    else if (!(mask & BOT_TOTEM_MASK_MY_TOTEM_AIR))\n+                        if (mask & BOT_TOTEM_MASK_WRATH_OF_AIR) //already have wrath of air from someone else\n+                            cast = true;\n+\n+                    if (cast)\n+                    {\n+                        if (doCast(me, GetSpell(WINDFURY_TOTEM_1), CotE ? TRIGGERED_CAST_DIRECTLY : TRIGGERED_NONE))\n+                            //if (!CotE)\n+                                return;\n+                    }\n+                }\n+            }\n+\n+            if (!(mask & BOT_TOTEM_MASK_MY_TOTEM_AIR) && _totemTimer[T_AIR] <= diff && me->IsInCombat())\n+            {\n+                //AIRlastresort : natureres (3-4 shamans of same level req)\n+                uint32 natureRes = GetSpell(NATURE_RESISTANCE_TOTEM_1);\n+                if (natureRes && !IAmFree() &&\n+                    (!(mask & BOT_TOTEM_MASK_RESISTANCE_NATURE) || idMap[NATURE_RESISTANCE_TOTEM_1] < natureRes))\n+                {\n+                    if (doCast(me, natureRes, CotE ? TRIGGERED_CAST_DIRECTLY : TRIGGERED_NONE))\n+                        //if (!CotE)\n+                            return;\n+                }\n+            }\n+        }\n+\n+        void CheckShamanisticRage(uint32 diff)\n+        {\n+            if (!IsSpellReady(SHAMANISTIC_RAGE_1, diff) || !me->IsInCombat() || IsCasting() || Rand() > 35)\n+                return;\n+\n+            bool cast = false;\n+            //case 1: hp pressure\n+            if (GetHealthPCT(me) < (50 + 20 * me->HasAuraType(SPELL_AURA_PERIODIC_DAMAGE) + 5 * uint32(me->getAttackers().size())))\n+                cast = true;\n+            //case 2: low mana (melee)\n+            else if (me->GetVictim() && !CCed(me, true) && HasRole(BOT_ROLE_DPS) && IsMelee() && GetManaPCT(me) < 40)\n+                cast = true;\n+\n+            if (cast && doCast(me, GetSpell(SHAMANISTIC_RAGE_1)))\n+                return;\n+        }\n+\n+        void CheckThunderStorm(uint32 diff)\n+        {\n+            if (!IsSpellReady(THUNDERSTORM_1, diff) || !me->IsAlive() || !HasRole(BOT_ROLE_DPS) || IsCasting() || Rand() > 25)\n+                return;\n+\n+            //case 1: low mana\n+            if (GetManaPCT(me) < 25)\n+            {\n+                if (doCast(me, GetSpell(THUNDERSTORM_1)))\n+                    return;\n+            }\n+\n+            //case 2: AoE damage\n+            //AttackerSet m_attackers = master->getAttackers();\n+            Unit::AttackerSet const& b_attackers = me->getAttackers();\n+            if (b_attackers.empty())\n+                return;\n+\n+            uint8 tCount = 0;\n+            for (Unit const* attacker : b_attackers)\n+            {\n+                if (!attacker) continue;\n+                if (me->GetDistance(attacker) > 9) continue;\n+                if (me->IsValidAttackTarget(attacker))\n+                {\n+                    ++tCount;\n+                    break;\n+                }\n+            }\n+\n+            if (tCount > 1)\n+            {\n+                if (doCast(me, GetSpell(THUNDERSTORM_1)))\n+                    return;\n+            }\n+        }\n+\n+        void Counter(uint32 diff)\n+        {\n+            if (!IsSpellReady(WIND_SHEAR_1, diff, false) || (HasRole(BOT_ROLE_HEAL) && IsCasting()) || Rand() > 40)\n+                return;\n+\n+            if (Unit* target = FindCastingTarget(CalcSpellMaxRange(WIND_SHEAR_1), 0, WIND_SHEAR_1))\n+            {\n+                me->InterruptNonMeleeSpells(false);\n+                if (doCast(target, GetSpell(WIND_SHEAR_1)))\n+                    return;\n+            }\n+        }\n+\n+        void CheckShield(uint32 diff)\n+        {\n+            if (GC_Timer > diff || ShieldCheckTimer > diff || IsCasting() || Rand() > 15)\n+                return;\n+\n+            ShieldCheckTimer = 2000;\n+\n+            //Aura const* shield = nullptr;\n+            uint32 SHIELD =\n+                HasRole(BOT_ROLE_TANK)   ? GetSpell(EARTH_SHIELD_1) :\n+                HasRole(BOT_ROLE_HEAL)   ? GetSpell(WATER_SHIELD_1) :\n+                HasRole(BOT_ROLE_DPS)    ? GetSpell(LIGHTNING_SHIELD_1) :\n+                0;\n+            SHIELD =\n+                SHIELD ? SHIELD :\n+                GetSpell(WATER_SHIELD_1) ? GetSpell(WATER_SHIELD_1) :\n+                GetSpell(EARTH_SHIELD_1) ? GetSpell(EARTH_SHIELD_1) :\n+                0;\n+\n+            if (!SHIELD && HasRole(BOT_ROLE_DPS))\n+                SHIELD = GetSpell(LIGHTNING_SHIELD_1);\n+\n+            if (!SHIELD)\n+                return;\n+\n+            AuraApplication const* sh = me->GetAuraApplicationOfRankedSpell(SHIELD);\n+            if (!sh || sh->GetBase()->GetCharges() < 5 || sh->GetBase()->GetDuration() < 30000 ||\n+                sh->GetBase()->GetSpellInfo()->GetRank() < sSpellMgr->GetSpellInfo(SHIELD)->GetRank())\n+            {\n+                if (doCast(me, SHIELD))\n+                    return;\n+            }\n+        }\n+\n+        void UpdateDeadAI(uint32 diff) override\n+        {\n+            if (IsSpellReady(REINCARNATION_1, diff, false) && (IAmFree() || master->IsInCombat()) && Rand() < 20)\n+                if (doCast(me, GetSpell(REINCARNATION_1)))\n+                    return;\n+\n+            bot_ai::UpdateDeadAI(diff);\n+        }\n+\n+        void UpdateAI(uint32 diff) override\n+        {\n+            if (!GlobalUpdate(diff))\n+                return;\n+\n+            DoVehicleActions(diff);\n+            if (!CanBotAttackOnVehicle())\n+                return;\n+\n+            CheckShamanisticRage(diff);\n+            CheckThunderStorm(diff);\n+\n+            CheckHexy(diff);\n+            CheckEarthy(diff);\n+\n+            if (IsPotionReady())\n+            {\n+                if (GetManaPCT(me) < 33)\n+                    DrinkPotion(true);\n+                else if (GetHealthPCT(me) < 50 && (!HasRole(BOT_ROLE_HEAL) || me->HasAuraType(SPELL_AURA_MOD_SILENCE)))\n+                    DrinkPotion(false);\n+            }\n+\n+            CheckRacials(diff);\n+\n+            CheckBloodlust(diff);\n+            BuffAndHealGroup(diff);\n+            CheckEarthShield(diff);\n+            CureGroup(CURE_TOXINS, diff);\n+            CheckTotems(diff);\n+            CheckShield(diff);\n+\n+            if (master->IsInCombat() || me->IsInCombat())\n+            {\n+                CheckDispel(diff);\n+                CheckFireNova(diff);\n+            }\n+\n+            if (!me->IsInCombat())\n+                DoNonCombatActions(diff);\n+\n+            if (ProcessImmediateNonAttackTarget())\n+                return;\n+\n+            CheckGhostWolf(diff);\n+\n+            if (!CheckAttackTarget())\n+                return;\n+\n+            CheckHex(diff);\n+            Counter(diff);\n+\n+            if (IsCasting())\n+                return;\n+\n+            CheckUsableItems(diff);\n+\n+            DoNormalAttack(diff);\n+        }\n+\n+        void DoNormalAttack(uint32 diff)\n+        {\n+            Unit* mytar = opponent ? opponent : disttarget ? disttarget : nullptr;\n+            if (!mytar)\n+                return;\n+\n+            StartAttack(mytar, IsMelee());\n+\n+            CheckAttackState();\n+            if (!me->IsAlive() || !mytar->IsAlive())\n+                return;\n+\n+            auto [can_do_frost, can_do_fire, can_do_nature] = CanAffectVictimBools(mytar, SPELL_SCHOOL_FROST, SPELL_SCHOOL_FIRE, SPELL_SCHOOL_NATURE);\n+\n+            //AttackerSet m_attackers = master->getAttackers();\n+            //AttackerSet b_attackers = me->getAttackers();\n+            float dist = me->GetDistance(mytar);\n+\n+            //spell reflections\n+            if (IsSpellReady(EARTH_SHOCK_1, diff) && can_do_nature && HasRole(BOT_ROLE_DPS) && dist < 25 && CanRemoveReflectSpells(mytar, EARTH_SHOCK_1) &&\n+                doCast(mytar, EARTH_SHOCK_1))\n+                return;\n+\n+            MoveBehind(mytar);\n+\n+            //STORMSTRIKE\n+            if (IsSpellReady(STORMSTRIKE_1, diff) && can_do_nature && HasRole(BOT_ROLE_DPS) && IsMelee() && dist <= 5 && Rand() < 120)\n+            {\n+                if (doCast(mytar, GetSpell(STORMSTRIKE_1)))\n+                    return;\n+            }\n+            //SHOCKS\n+            if (GetSpellCooldown(EARTH_SHOCK_1) <= diff && HasRole(BOT_ROLE_DPS) &&\n+                (GetSpell(FLAME_SHOCK_1) || GetSpell(EARTH_SHOCK_1) || GetSpell(FROST_SHOCK_1)) &&\n+                dist < 25 && Rand() < 70)\n+            {\n+                if (GetSpell(FLAME_SHOCK_1) && can_do_fire)\n+                {\n+                    AuraEffect const* fsh = mytar->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_SHAMAN, 0x10000000, 0x0, 0x0, me->GetGUID());\n+                    if (!fsh || fsh->GetBase()->GetDuration() < 3000)\n+                    {\n+                        if (doCast(mytar, GetSpell(FLAME_SHOCK_1)))\n+                            return;\n+                    }\n+                }\n+\n+                uint32 SHOCK = can_do_frost ? GetSpell(FROST_SHOCK_1) : 0;\n+                if (!SHOCK && can_do_nature)\n+                    SHOCK = GetSpell(EARTH_SHOCK_1);\n+\n+                if (SHOCK)\n+                {\n+                    if (doCast(mytar, SHOCK))\n+                        return;\n+                }\n+            }\n+\n+            //Feral Spirit\n+            if (IsSpellReady(FERAL_SPIRIT_1, diff) && HasRole(BOT_ROLE_DPS) && Rand() < 40 && dist < 5)\n+            {\n+                SummonBotPet(mytar);\n+                SetSpellCooldown(FERAL_SPIRIT_1, 180000);\n+                return;\n+            }\n+\n+            //LAVA BURST\n+            if (IsSpellReady(LAVA_BURST_1, diff) && can_do_fire && HasRole(BOT_ROLE_DPS) &&\n+                (GetSpec() == BOT_SPEC_SHAMAN_ELEMENTAL || (IsRanged() && (!can_do_nature || !GetSpell(LIGHTNING_BOLT_1)))) &&\n+                dist < CalcSpellMaxRange(LAVA_BURST_1) && Rand() < 60 &&\n+                (me->getAttackers().empty() || dist > 10))\n+            {\n+                if (doCast(mytar, GetSpell(LAVA_BURST_1)))\n+                    return;\n+            }\n+\n+            if (((MaelstromCount < 5 || MaelstromTimer == 0 || me->GetLevel() < 55) && IsMelee()) ||\n+                (HasRole(BOT_ROLE_HEAL) && GetManaPCT(me) < 25))\n+                return;\n+\n+            //CHAIN LIGHTNING\n+            if (IsSpellReady(CHAIN_LIGHTNING_1, diff) && can_do_nature && HasRole(BOT_ROLE_DPS) && dist < CalcSpellMaxRange(CHAIN_LIGHTNING_1) && Rand() < 80)\n+            {\n+                Unit* u = FindSplashTarget(35.f, mytar, 5.f);\n+                if (u && doCast(mytar, GetSpell(CHAIN_LIGHTNING_1)))\n+                    return;\n+            }\n+            //LIGHTNING BOLT\n+            if (IsSpellReady(LIGHTNING_BOLT_1, diff) && can_do_nature && HasRole(BOT_ROLE_DPS) && dist < CalcSpellMaxRange(LIGHTNING_BOLT_1))\n+            {\n+                uint32 LIGHTNING_BOLT = GetSpell(LIGHTNING_BOLT_1);\n+                if (doCast(mytar, LIGHTNING_BOLT))\n+                    return;\n+            }\n+        }\n+\n+        void CheckHexy(uint32 diff)\n+        {\n+            if (HexyCheckTimer > diff)\n+                return;\n+\n+            HexyCheckTimer = 2000;\n+            Hexy = FindAffectedTarget(GetSpell(HEX_1), me->GetGUID());\n+        }\n+\n+        void CheckHex(uint32 diff)\n+        {\n+            if (Hexy || !IsSpellReady(HEX_1, diff))\n+                return;\n+\n+            if (Unit* target = FindPolyTarget(20))\n+            {\n+                if (doCast(target, GetSpell(HEX_1)))\n+                    return;\n+            }\n+        }\n+\n+        void CheckEarthy(uint32 diff)\n+        {\n+            if (EarthyCheckTimer > diff)\n+                return;\n+\n+            EarthyCheckTimer = 1000;\n+            Unit const* u = FindAffectedTarget(GetSpell(EARTH_SHIELD_1), me->GetGUID(), 90.f, 3);\n+            Earthy = (u && (IsTank(u) || u == master));\n+        }\n+\n+        void CheckGhostWolf(uint32 diff)\n+        {\n+            if (!IsSpellReady(GHOST_WOLF_1, diff) || (!IAmFree() && !HasBotCommandState(BOT_COMMAND_FOLLOW)) ||\n+                Rand() > 35 || me->GetShapeshiftForm() != FORM_NONE || me->IsMounted() || !IsOutdoors() || IsCasting())\n+                return;\n+\n+            if (IAmFree())\n+            {\n+                InstanceTemplate const* instt = sObjectMgr->GetInstanceTemplate(me->GetMap()->GetId());\n+                bool map_allows_mount = (!me->GetMap()->IsDungeon() || me->GetMap()->IsBattlegroundOrArena()) && (!instt || instt->AllowMount);\n+                if (me->HasUnitMovementFlag(MOVEMENTFLAG_FORWARD) &&\n+                    (!me->GetVictim() ?\n+                        (me->IsInCombat() || !map_allows_mount || IsFlagCarrier(me)) :\n+                        !me->IsWithinDist(me->GetVictim(), 8.0f + (IsMelee() ? 5.0f : GetSpellAttackRange(true)))))\n+                {\n+                    if (doCast(me, GetSpell(GHOST_WOLF_1)))\n+                        return;\n+                }\n+\n+                return;\n+            }\n+\n+            if (me->GetExactDist2d(master) > std::max<uint8>(master->GetBotMgr()->GetBotFollowDist(), 30))\n+            {\n+                if (doCast(me, GetSpell(GHOST_WOLF_1)))\n+                    return;\n+            }\n+        }\n+\n+        void DoNonCombatActions(uint32 diff)\n+        {\n+            if (GC_Timer > diff || me->IsMounted() || IsCasting() || Rand() > 25)\n+                return;\n+\n+            ResurrectGroup(GetSpell(ANCESTRAL_SPIRIT_1));\n+\n+            if (mhEnchantExpireTimer > 0 && mhEnchantExpireTimer <= diff)\n+                RemoveItemClassEnchantment(BOT_SLOT_MAINHAND);\n+            if (ohEnchantExpireTimer > 0 && ohEnchantExpireTimer <= diff)\n+                RemoveItemClassEnchantment(BOT_SLOT_OFFHAND);\n+\n+            // Weapon Enchants\n+            if (me->isMoving())\n+                return;\n+\n+            Item* mhWeapon = GetEquips(BOT_SLOT_MAINHAND);\n+            Item* ohWeapon = GetEquips(BOT_SLOT_OFFHAND);\n+            //item must be non-standard, otherwise combat spells won't be rolled anyway\n+            bool mhReady = mhWeapon && !mhWeapon->GetEnchantmentId(TEMP_ENCHANTMENT_SLOT);\n+            bool ohReady = ohWeapon && !ohWeapon->GetEnchantmentId(TEMP_ENCHANTMENT_SLOT);\n+\n+            if (!mhReady && !ohReady)\n+                return; //no ecnhantable weapons\n+\n+            //OK choose the enchants\n+            //MH 1+ Rockbiter, 10+ Flametongue, 30+ Windfury/Earthliving\n+            //OH 1+ Rockbiter, 10+ Flametongue, 20+ Frostbrand, 30+ Windfury/Earthliving\n+            if (needChooseMHEnchant && mhReady)\n+                mhEnchant = HasRole(BOT_ROLE_HEAL) ? (me->GetLevel() >= 30 ? EARTHLIVING_WEAPON_1 :\n+                    me->GetLevel() >= 10 ? FLAMETONGUE_WEAPON_1 :\n+                    0/*ROCKBITER_WEAPON_1*/) :\n+                    HasRole(BOT_ROLE_RANGED) ? (me->GetLevel() >= 10 ? FLAMETONGUE_WEAPON_1 :\n+                    0/*ROCKBITER_WEAPON_1*/) :\n+                    (me->GetLevel() >= 30 ? WINDFURY_WEAPON_1 :\n+                    //me->GetLevel() >= 20 ? FROSTBRAND_WEAPON_1 :\n+                    me->GetLevel() >= 10 ? FLAMETONGUE_WEAPON_1 :\n+                    0/*ROCKBITER_WEAPON_1*/);\n+\n+            if (needChooseOHEnchant && ohReady) //basically only lvl 40+\n+                ohEnchant = HasRole(BOT_ROLE_HEAL) ? (me->GetLevel() >= 30 ? EARTHLIVING_WEAPON_1 :\n+                    me->GetLevel() >= 10 ? FLAMETONGUE_WEAPON_1 :\n+                    0/*ROCKBITER_WEAPON_1*/) :\n+                    HasRole(BOT_ROLE_RANGED) ? (me->GetLevel() >= 10 ? FLAMETONGUE_WEAPON_1 :\n+                    0/*ROCKBITER_WEAPON_1*/) :\n+                    (me->GetLevel() >= 30 ? WINDFURY_WEAPON_1 :\n+                    me->GetLevel() >= 20 ? FROSTBRAND_WEAPON_1 :\n+                    me->GetLevel() >= 10 ? FLAMETONGUE_WEAPON_1 :\n+                    0/*ROCKBITER_WEAPON_1*/);\n+\n+            uint32 MhEnchant = !mhReady ? 0 : GetSpell(mhEnchant);\n+            uint32 OhEnchant = !ohReady ? 0 : GetSpell(ohEnchant);\n+\n+            SpellInfo const* MhEnchantInfo = mhReady && MhEnchant ? sSpellMgr->GetSpellInfo(MhEnchant) : nullptr;\n+            SpellInfo const* OhEnchantInfo = ohReady && OhEnchant ? sSpellMgr->GetSpellInfo(OhEnchant) : nullptr;\n+\n+            Item* targetWeapon = nullptr;\n+            SpellInfo const* targetInfo = nullptr;\n+\n+            if (mhReady && MhEnchant && mhWeapon->IsFitToSpellRequirements(MhEnchantInfo))\n+            {\n+                targetWeapon = mhWeapon;\n+                targetInfo = MhEnchantInfo;\n+            }\n+            if (!targetWeapon && ohReady && OhEnchant && ohWeapon->IsFitToSpellRequirements(OhEnchantInfo))\n+            {\n+                targetWeapon = ohWeapon;\n+                targetInfo = OhEnchantInfo;\n+            }\n+            if (targetWeapon)\n+            {\n+                Spell* spell = new Spell(me, targetInfo, TRIGGERED_NONE);\n+                SpellCastTargets targets;\n+                targets.SetItemTarget(targetWeapon);\n+                spell->prepare(targets);\n+                return;\n+            }\n+        }\n+\n+        bool BuffTarget(Unit* target, uint32 /*diff*/) override\n+        {\n+            if (me->IsInCombat() && !master->GetMap()->IsRaid())\n+                return false;\n+\n+            if (target->HasUnitMovementFlag(MOVEMENTFLAG_SWIMMING))\n+            {\n+                //water walking breaks on any damage\n+                if (GetSpell(WATER_WALKING_1) && target->getAttackers().empty() &&\n+                    !target->HasAuraType(SPELL_AURA_PERIODIC_DAMAGE) && !target->HasAuraType(SPELL_AURA_WATER_WALK) &&\n+                    doCast(target, GetSpell(WATER_WALKING_1)))\n+                {\n+                    //GC_Timer = 1000;\n+                    return true;\n+                }\n+                //bots don't need water breathing\n+                if (GetSpell(WATER_BREATHING_1) && target->IsPlayer() &&\n+                    !target->HasAuraType(SPELL_AURA_WATER_BREATHING) &&\n+                    doCast(target, GetSpell(WATER_BREATHING_1)))\n+                {\n+                    //GC_Timer = 1000;\n+                    return true;\n+                }\n+            }\n+            return false;\n+        }\n+\n+        void CheckEarthShield(uint32 diff)\n+        {\n+            if (!IsSpellReady(EARTH_SHIELD_1, diff) || Earthy == true || Rand() > (65 - 45 * me->IsInCombat()))\n+                return;\n+\n+            static const auto can_affect = [](WorldObject const* o, Unit const* unit)\n+            {\n+                if (!unit->IsAlive())\n+                    return false;\n+                AuraEffect const* eShield = unit->GetAuraEffect(SPELL_AURA_REDUCE_PUSHBACK, SPELLFAMILY_SHAMAN, 0x0, 0x400, 0x0);\n+                return (!eShield || eShield->GetBase()->GetCharges() < 5 || eShield->GetBase()->GetDuration() < 30000) && o->GetDistance(unit) < 40 && (unit->IsInCombat() || !unit->isMoving());\n+            };\n+\n+            Group const* gr = !IAmFree() ? master->GetGroup() : GetGroup();\n+            if (!gr)\n+            {\n+                if (IsTank(master) && can_affect(me, master) && doCast(master, GetSpell(EARTH_SHIELD_1)))\n+                    return;\n+\n+                if (!IAmFree())\n+                {\n+                    for (auto const& [_, bot] : *master->GetBotMgr()->GetBotMap())\n+                    {\n+                        Unit* u = bot;\n+                        if (!u || !u->IsInWorld() || me->GetMap() != u->FindMap() || !u->InSamePhase(me))\n+                            continue;\n+                        if (IsTank(u) && can_affect(me, u) && doCast(u, GetSpell(EARTH_SHIELD_1)))\n+                            return;\n+                    }\n+                }\n+            }\n+            else\n+            {\n+                std::set<Unit*> tanks;\n+                for (Unit* member : BotMgr::GetAllGroupMembers(gr))\n+                {\n+                    if (me->GetMap() == member->FindMap() && member->IsAlive() && member->InSamePhase(me) && IsTank(member) && can_affect(me, member))\n+                        tanks.insert(member);\n+                }\n+\n+                if (!tanks.empty())\n+                {\n+                    Unit* target = tanks.size() == 1 ? *tanks.begin() : Bcore::Containers::SelectRandomContainerElement(tanks);\n+                    if (doCast(target, GetSpell(EARTH_SHIELD_1)))\n+                        return;\n+                }\n+            }\n+\n+            if (!IAmFree() && can_affect(me, master) && doCast(master, GetSpell(EARTH_SHIELD_1)))\n+                return;\n+        }\n+\n+        void CheckDispel(uint32 diff)\n+        {\n+            if (!IsSpellReady(PURGE_1, diff) || IsCasting())\n+                return;\n+\n+            Unit* target = FindHostileDispelTarget(CalcSpellMaxRange(PURGE_1));\n+            if (target && doCast(target, GetSpell(PURGE_1)))\n+                return;\n+\n+            SetSpellCooldown(PURGE_1, 500); //fail\n+        }\n+\n+        void CheckFireNova(uint32 diff)\n+        {\n+            if (!HasRole(BOT_ROLE_DPS) || _totems[T_FIRE].second._type == BOT_TOTEM_NONE ||\n+                !IsSpellReady(FIRE_NOVA_1, diff) || IsCasting() || Rand() > 25)\n+                return;\n+\n+            std::list<Unit*> targets;\n+            GetNearbyTargetsList(targets, 9.f, 0, ObjectAccessor::GetUnit(*me, _totems[T_FIRE].first));\n+            if (targets.size() > 1 || (!targets.empty() && *(targets.begin()) == me->GetVictim()))\n+            {\n+                if (doCast(me, GetSpell(FIRE_NOVA_1)))\n+                    return;\n+            }\n+        }\n+\n+        bool HealTarget(Unit* target, uint32 diff) override\n+        {\n+            if (!target || !target->IsAlive() || target->GetShapeshiftForm() == FORM_SPIRITOFREDEMPTION || me->GetDistance(target) > 40)\n+                return false;\n+            uint8 hp = GetHealthPCT(target);\n+            if (hp > GetHealHpPctThreshold())\n+                return false;\n+            bool pointed = IsPointedHealTarget(target);\n+            if (hp > 90 && !(pointed && me->GetMap()->IsRaid()) &&\n+                (!target->IsInCombat() || target->getAttackers().empty() || !IsTank(target) || !me->GetMap()->IsRaid()))\n+                return false;\n+\n+            int32 hps = GetHPS(target);\n+            int32 xphp = target->GetHealth() + hps * 2.5f;\n+            int32 hppctps = int32(hps * 100.f / float(target->GetMaxHealth()));\n+            int32 xphploss = xphp > int32(target->GetMaxHealth()) ? 0 : abs(int32(xphp - target->GetMaxHealth()));\n+            int32 xppct = hp + hppctps * 2.5f;\n+            if (xppct >= 95 && hp >= 25 && !pointed)\n+                return false;\n+\n+            if (IsSpellReady(NATURES_SWIFTNESS_1, diff, false) && Rand() < 80 &&\n+                (me->IsInCombat() || target->IsInCombat()) &&//may just revive\n+                hp <= 20 && xppct <= 0 && xphploss > _heals[HEALING_WAVE_1] / 2 &&\n+                (target->IsPlayer() || IsTank(target) || target->IsInCombat() || !target->getAttackers().empty()))\n+            {\n+                me->InterruptNonMeleeSpells(false);\n+                if (doCast(me, GetSpell(NATURES_SWIFTNESS_1)))\n+                {\n+                    if (doCast(target, GetSpell(HEALING_WAVE_1)))\n+                        return true;\n+                }\n+            }\n+\n+            if (IsCasting()) return false;\n+\n+            Unit const* u = target->GetVictim();\n+            bool tanking = u && IsTank(target) && u->ToCreature() && u->ToCreature()->isWorldBoss();\n+\n+            if (IsSpellReady(HEALING_WAVE_1, diff) &&\n+                (xppct >= 15 || !GetSpell(LESSER_HEALING_WAVE_1)) && xphploss > _heals[HEALING_WAVE_1])\n+            {\n+                if (doCast(target, GetSpell(HEALING_WAVE_1)))\n+                    return true;\n+            }\n+            //Riptide stacks from different casters\n+            if (IsSpellReady(RIPTIDE_1, diff) && hp <= 85 && (tanking || hps < 0 || xphploss > _heals[RIPTIDE_1]) &&\n+                !target->GetAuraEffect(SPELL_AURA_PERIODIC_HEAL, SPELLFAMILY_SHAMAN, 0x0, 0x0, 0x10, me->GetGUID())\n+                /*!target->HasAura(GetSpell(RIPTIDE_1), me->GetGUID())*/)\n+            {\n+                if (doCast(target, GetSpell(RIPTIDE_1)))\n+                    return true;\n+            }\n+            if (IsSpellReady(CHAIN_HEAL_1, diff) && !IAmFree() && xppct > 35 && xphploss > _heals[CHAIN_HEAL_1] &&\n+                (!tanking || Rand() < 60 || target->GetAuraEffect(SPELL_AURA_PERIODIC_HEAL, SPELLFAMILY_SHAMAN, 0x0, 0x0, 0x10, me->GetGUID())))\n+            {\n+                if (doCast(target, GetSpell(CHAIN_HEAL_1)))\n+                    return true;\n+            }\n+\n+            if (IsSpellReady(LESSER_HEALING_WAVE_1, diff) && xphploss > _heals[LESSER_HEALING_WAVE_1])\n+            {\n+                if (doCast(target, GetSpell(LESSER_HEALING_WAVE_1)))\n+                    return true;\n+            }\n+\n+            return false;\n+        }\n+\n+        void ApplyClassSpellCritMultiplierAll(Unit const* /*victim*/, float& crit_chance, SpellInfo const* spellInfo, SpellSchoolMask schoolMask, WeaponAttackType /*attackType*/) const override\n+        {\n+            //if (spellInfo->DmgClass != SPELL_DAMAGE_CLASS_MAGIC)\n+            //    return;\n+\n+            uint32 spellId = spellInfo->Id;\n+            uint8 lvl = me->GetLevel();\n+\n+            //Call of Thunder: 5% additional critical chance for Lightning Bolt, Chain Lightning and Thunderstorm\n+            if ((GetSpec() == BOT_SPEC_SHAMAN_ELEMENTAL) && lvl >= 30 &&\n+                (spellId == GetSpell(LIGHTNING_BOLT_1) ||\n+                spellId == GetSpell(CHAIN_LIGHTNING_1) ||\n+                spellId == GetSpell(THUNDERSTORM_1)))\n+                crit_chance += 5.f;\n+            //Tidal Mastery: 5% additional critical chance for lightning spells\n+            if (lvl >= 25 && (SPELL_SCHOOL_MASK_NATURE & schoolMask))\n+                crit_chance += 5.f;\n+            //Blessing of the Eternals: 4% additional critical chance for all spells\n+            if ((GetSpec() == BOT_SPEC_SHAMAN_RESTORATION) && lvl >= 45)\n+                crit_chance += 4.f;\n+            //Tidal Waves (Lesser Healing Wave crit)\n+            if (spellInfo->SpellFamilyFlags[0] & 0x80)\n+                if (AuraEffect const* eff = me->GetAuraEffect(TIDAL_WAVES_BUFF, 1, me->GetGUID()))\n+                    if (eff->IsAffectingSpell(spellInfo))\n+                        crit_chance += 25.f;\n+            //Tidal Force\n+            if (spellInfo->SpellFamilyFlags[0] & 0x1C0)\n+                if (AuraEffect const* eff = me->GetAuraEffect(TIDAL_FORCE_BUFF, 0, me->GetGUID()))\n+                    if (eff->IsAffectingSpell(spellInfo))\n+                        crit_chance += 20.f * eff->GetBase()->GetStackAmount();\n+        }\n+\n+        void ApplyClassDamageMultiplierMeleeSpell(int32& damage, SpellNonMeleeDamage& /*damageinfo*/, SpellInfo const* spellInfo, WeaponAttackType /*attackType*/, bool iscrit) const override\n+        {\n+            uint32 spellId = spellInfo->Id;\n+            uint8 lvl = me->GetLevel();\n+            float fdamage = float(damage);\n+\n+            //apply bonus damage mods\n+            float pctbonus = 0.0f;\n+            if (iscrit)\n+            {\n+                //!!!Melee spell damage is not yet critical, all reduced by half\n+                //Elemental Fury (part 2): 50% additional crit damage bonus for Nature, Fire and Frost (all) spells\n+                if (lvl >= 21)\n+                    pctbonus += 0.25f;\n+            }\n+\n+            //SHAMAN_T8_ENCHANCEMENT_2P_BONUS: 20% bonus damage for Lava Lash and Stormstrike\n+            if (lvl >= 60 &&\n+                (spellId == STORMSTRIKE_DAMAGE || spellId == STORMSTRIKE_DAMAGE_OFFHAND/* || spellId == LAVA_LASH*/))\n+                pctbonus += 0.2f;\n+\n+            //custom bonus to make stormstrike useful\n+            if (spellId == STORMSTRIKE_DAMAGE || spellId == STORMSTRIKE_DAMAGE_OFFHAND)\n+                pctbonus += 1.0f;\n+\n+            damage = int32(fdamage * (1.0f + pctbonus));\n+        }\n+\n+        void ApplyClassDamageMultiplierSpell(int32& damage, SpellNonMeleeDamage& /*damageinfo*/, SpellInfo const* spellInfo, WeaponAttackType /*attackType*/, bool iscrit) const override\n+        {\n+            uint32 spellId = spellInfo->Id;\n+            uint8 lvl = me->GetLevel();\n+            float fdamage = float(damage);\n+            float flat_mod = 0.f;\n+\n+            //2) apply bonus damage mods\n+            float pctbonus = 0.0f;\n+            if (iscrit)\n+            {\n+                //!!!spell damage is not yet critical and will be multiplied by 1.5\n+                //so we should put here bonus damage mult /1.5\n+                //Elemental Fury (part 2): 50% additional crit damage bonus for Nature, Fire and Frost spells\n+                if (lvl >= 21 &&\n+                    (spellInfo->GetSchoolMask() & (SPELL_SCHOOL_MASK_NATURE|SPELL_SCHOOL_MASK_FIRE|SPELL_SCHOOL_MASK_FROST)))\n+                    pctbonus += 0.333f;\n+                //Lava Flows (part 1): 24% additional crit damage bonus for Lava Burst\n+                if ((GetSpec() == BOT_SPEC_SHAMAN_ELEMENTAL) && lvl >= 50 && spellId == GetSpell(LAVA_BURST_1))\n+                    pctbonus += 0.16f;\n+            }\n+            //Concussion: 5% bonus damage for Lightning Bolt, Chain Lightning, Thunderstorm, Lava Burst and Shocks\n+            if (lvl >= 10 &&\n+                (spellId == GetSpell(LIGHTNING_BOLT_1) ||\n+                spellId == GetSpell(CHAIN_LIGHTNING_1) ||\n+                spellId == GetSpell(THUNDERSTORM_1) ||\n+                spellId == GetSpell(LAVA_BURST_1) ||\n+                spellId == GetSpell(EARTH_SHOCK_1) ||\n+                spellId == GetSpell(FROST_SHOCK_1) ||\n+                spellId == GetSpell(FLAME_SHOCK_1)))\n+                pctbonus += 0.05f;\n+            //Call of Flame (part 2): 6% bonus damage for Lava burst\n+            if (lvl >= 15 && spellId == GetSpell(LAVA_BURST_1))\n+                pctbonus += 0.06f;\n+            //Storm, Earth and fire (part 3): 60% bonus damage for Flame Shock (periodic damage in fact but who cares?)\n+            if ((GetSpec() == BOT_SPEC_SHAMAN_ELEMENTAL) && lvl >= 40 && spellId == GetSpell(FLAME_SHOCK_1))\n+                pctbonus += 0.6f;\n+            //Booming Echoes (part 2): 20% bonus damage for Flame Shock and Frost Shock (direct damage)\n+            if ((GetSpec() == BOT_SPEC_SHAMAN_ELEMENTAL) && lvl >= 45 &&\n+                (spellId == GetSpell(FLAME_SHOCK_1) ||\n+                spellId == GetSpell(FROST_SHOCK_1)))\n+                pctbonus += 0.2f;\n+            //Improved Shields (part 1): 15% bonus damage for Lightning Shield orbs\n+            if (lvl >= 15 && spellInfo->IsRankOf(sSpellMgr->GetSpellInfo(LIGHTNING_SHIELD_DAMAGE_1)))\n+                pctbonus += 0.15f;\n+            //Shamanism: +20/25% bonus from spp\n+            if ((GetSpec() == BOT_SPEC_SHAMAN_ELEMENTAL) && lvl >= 45)\n+            {\n+                if (spellId == GetSpell(CHAIN_LIGHTNING_1) || spellId == GetSpell(LIGHTNING_BOLT_1))\n+                    flat_mod += me->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_MAGIC) * 0.2f * me->CalculateDefaultCoefficient(spellInfo, SPELL_DIRECT_DAMAGE) * me->CalculateSpellpowerCoefficientLevelPenalty(spellInfo);\n+                else if (spellId == GetSpell(LAVA_BURST_1))\n+                    flat_mod += me->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_MAGIC) * 0.25f * me->CalculateDefaultCoefficient(spellInfo, SPELL_DIRECT_DAMAGE) * me->CalculateSpellpowerCoefficientLevelPenalty(spellInfo);\n+            }\n+            //Elemental Oath (part 1): 10% bonus damage\n+            if ((GetSpec() == BOT_SPEC_SHAMAN_ELEMENTAL) &&\n+                lvl >= 45 && me->GetAuraEffect(ELEMENTAL_FOCUS_BUFF, 0, me->GetGUID()))\n+                pctbonus += 0.1f;\n+            //Elemental Weapons (part 1): 40% bonus damage\n+            if (lvl >= 20 && (spellId == WINDFURY_ATTACK_MAINHAND || spellId == WINDFURY_ATTACK_OFFHAND))\n+                pctbonus += 0.4f;\n+\n+            //Totemic Recall: bots have reduced base mana so increase mana gain here\n+            //if (lvl >= 30 && spellId == GetSpell(TOTEMIC_RECALL_1))\n+            //    pctbonus += 0.5f;\n+\n+            damage = int32(fdamage * (1.0f + pctbonus) + flat_mod);\n+        }\n+\n+        void ApplyClassDamageMultiplierHeal(Unit const* /*victim*/, float& heal, SpellInfo const* spellInfo, DamageEffectType damagetype, uint32 stack) const override\n+        {\n+            uint32 spellId = spellInfo->Id;\n+            uint8 lvl = me->GetLevel();\n+            float pctbonus = 0.0f;\n+            float flat_mod = 0.0f;\n+\n+            //Healing Way: 25% bonus healing for Healing Wave\n+            if ((GetSpec() == BOT_SPEC_SHAMAN_RESTORATION) && lvl >= 30 && spellId == GetSpell(HEALING_WAVE_1))\n+                pctbonus += 0.25f;\n+            //Purification: 10% bonus healing for all spells\n+            if ((GetSpec() == BOT_SPEC_SHAMAN_RESTORATION) && lvl >= 35)\n+                pctbonus += 0.1f;\n+            //Nature's Blessing: 15% of Intellect to healing\n+            if ((GetSpec() == BOT_SPEC_SHAMAN_RESTORATION) && lvl >= 45)\n+                flat_mod += GetTotalBotStat(BOT_STAT_MOD_INTELLECT) * 0.15f * me->CalculateDefaultCoefficient(spellInfo, damagetype) * stack * 1.88f * me->CalculateSpellpowerCoefficientLevelPenalty(spellInfo) * stack;\n+            //Improved Chain Heal: 20% bonus healing for Chain Heal\n+            if ((GetSpec() == BOT_SPEC_SHAMAN_RESTORATION) && lvl >= 45 && spellId == GetSpell(CHAIN_HEAL_1))\n+                pctbonus += 0.2f;\n+            //Improved Earth Shield: 10% bonus healing for Earth Shield\n+            //Glyph of Earth Shield: 20% bonus healing for Earth Shield\n+            if (lvl >= 50 && spellId == EARTH_SHIELD_HEAL)\n+                pctbonus += (GetSpec() == BOT_SPEC_SHAMAN_RESTORATION) ? 0.3f : 0.2f;\n+            //Improved Shields (part 3): 15% bonus healing for Earth Shield\n+            if (lvl >= 15 && spellId == EARTH_SHIELD_HEAL)\n+                pctbonus += 0.15f;\n+            //Tidal Waves (part 2): 20% bonus (from spellpower) for Healing Wave and 10% bonus (from spellpower) for Lesser Healing Wave\n+            if ((GetSpec() == BOT_SPEC_SHAMAN_RESTORATION) && lvl >= 55)\n+            {\n+                if (spellId == GetSpell(HEALING_WAVE_1))\n+                    flat_mod += me->SpellBaseHealingBonusDone(SPELL_SCHOOL_MASK_MAGIC) * 0.2f * me->CalculateDefaultCoefficient(spellInfo, damagetype) * 1.88f * me->CalculateSpellpowerCoefficientLevelPenalty(spellInfo) * stack;\n+                else if (spellId == GetSpell(LESSER_HEALING_WAVE_1))\n+                    flat_mod += me->SpellBaseHealingBonusDone(SPELL_SCHOOL_MASK_MAGIC) * 0.1f * me->CalculateDefaultCoefficient(spellInfo, damagetype) * 1.88f * me->CalculateSpellpowerCoefficientLevelPenalty(spellInfo) * stack;\n+            }\n+\n+            heal = heal * (1.0f + pctbonus) + flat_mod;\n+        }\n+\n+        void ApplyClassSpellCostMods(SpellInfo const* spellInfo, int32& cost) const override\n+        {\n+            //uint32 spellId = spellInfo->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            float fcost = float(cost);\n+            int32 flatbonus = 0;\n+            float pctbonus = 0.0f;\n+\n+            //percent mods\n+            //Clearcasting: -40% mana cost\n+            if (AuraEffect const* eff = me->GetAuraEffect(ELEMENTAL_FOCUS_BUFF, 0, me->GetGUID()))\n+                if (eff->IsAffectingSpell(spellInfo))\n+                    pctbonus += 0.4f;\n+            //Convection\n+            if (lvl >= 10 && ((spellInfo->SpellFamilyFlags[0] & 0x90100003) || (spellInfo->SpellFamilyFlags[1] & 0x8001000)))\n+                pctbonus += 0.1f;\n+            //Shamanistic Focus\n+            if (lvl >= 20 && (spellInfo->SpellFamilyFlags[0] & 0x90100000))\n+                pctbonus += 0.45f;\n+            //Mental Quickness:\n+            if ((GetSpec() == BOT_SPEC_SHAMAN_ENHANCEMENT) && lvl >= 50 && !spellInfo->CalcCastTime())\n+                pctbonus += 0.06f;\n+            //Totemic Focus:\n+            if (lvl >= 10 && (spellInfo->AttributesEx7 & SPELL_ATTR7_SUMMON_PLAYER_TOTEM))\n+                pctbonus += 0.25f;\n+            //Tidal Focus:\n+            if (lvl >= 15 &&\n+                ((spellInfo->SpellFamilyFlags[0] & 0x1C0) ||\n+                (spellInfo->SpellFamilyFlags[1] & 0x400) ||\n+                (spellInfo->SpellFamilyFlags[2] & 0x10)))\n+                pctbonus += 0.05f;\n+\n+            //flat mods\n+            //!1 rage = 10 pts!\n+            ////Improved Heroic Strike: -3 rage cost for Heroic Strike\n+            //if (lvl >= 10 && spellId == GetSpell(HEROIC_STRIKE_1))\n+            //    flatbonus += 30;\n+\n+            //cost can be < 0\n+            cost = int32(fcost * (1.0f - pctbonus)) - flatbonus;\n+        }\n+\n+        void ApplyClassSpellCastTimeMods(SpellInfo const* spellInfo, int32& casttime) const override\n+        {\n+            //casttime is in milliseconds\n+            uint32 spellId = spellInfo->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            int32 timebonus = 0;\n+            float pctbonus = 0.0f;\n+\n+            //100% mods\n+            //Nature's Swiftness: -100% cast time\n+            if (AuraEffect const* eff = me->GetAuraEffect(NATURES_SWIFTNESS_1, 0, me->GetGUID()))\n+                if (eff->IsAffectingSpell(spellInfo))\n+                    pctbonus += 1.0f;\n+\n+            //pct mods\n+            if (spellId == GetSpell(LIGHTNING_BOLT_1) || spellId == GetSpell(CHAIN_LIGHTNING_1) ||\n+                spellId == GetSpell(HEALING_WAVE_1) || spellId == GetSpell(LESSER_HEALING_WAVE_1) ||\n+                spellId == GetSpell(CHAIN_HEAL_1) || spellId == GetSpell(HEX_1))\n+            {\n+                Aura* maelstrom = me->GetAura(MAELSTROM_WEAPON_BUFF);\n+                if (maelstrom)\n+                {\n+                    pctbonus += 0.2f * maelstrom->GetStackAmount();\n+                    maelUseUp = true;\n+                }\n+            }\n+            //Tidal Waves (Healing Wave cast time)\n+            if (spellInfo->SpellFamilyFlags[0] & 0x40)\n+                if (AuraEffect const* eff = me->GetAuraEffect(TIDAL_WAVES_BUFF, 0, me->GetGUID()))\n+                    if (eff->IsAffectingSpell(spellInfo))\n+                        pctbonus += 0.3f;\n+\n+            //flat mods\n+            //Improved Ghost Wolf: -2 sec\n+            if (lvl >= 10 && spellId == GetSpell(GHOST_WOLF_1))\n+                timebonus += 2000;\n+            //Improved Healing Wave: -0.5 sec\n+            if (lvl >= 10 && spellId == GetSpell(HEALING_WAVE_1))\n+                timebonus += 500;\n+            //Lightning Mastery: -0.5 sec\n+            if ((GetSpec() == BOT_SPEC_SHAMAN_ELEMENTAL) &&\n+                lvl >= 35 && ((spellInfo->SpellFamilyFlags[0] & 0x3) || (spellInfo->SpellFamilyFlags[1] & 0x1000)))\n+                timebonus += 500;\n+            //Stormcaller Chain Heal Bonus (26122): -0.4 sec\n+            if (lvl >= 60 && spellId == GetSpell(CHAIN_HEAL_1))\n+                timebonus += 400;\n+\n+            casttime = std::max<int32>((float(casttime) * (1.0f - pctbonus)) - timebonus, 0);\n+        }\n+\n+        void ApplyClassSpellNotLoseCastTimeMods(SpellInfo const* spellInfo, int32& delayReduce) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchoolMask schools = spellInfo->GetSchoolMask();\n+            uint8 lvl = me->GetLevel();\n+            int32 reduceBonus = 0;\n+\n+            if (lvl >= 20 && (baseId == HEALING_WAVE_1 || baseId == LESSER_HEALING_WAVE_1 || baseId == CHAIN_HEAL_1))\n+                reduceBonus += 70;\n+\n+            if (GetSpec() == BOT_SPEC_SHAMAN_ELEMENTAL && lvl >= 25)\n+            {\n+                switch (baseId)\n+                {\n+                    case LIGHTNING_BOLT_1: case CHAIN_LIGHTNING_1: case LAVA_BURST_1: case HEX_1:\n+                        reduceBonus += 70;\n+                        break;\n+                    default:\n+                        break;\n+                }\n+            }\n+\n+            delayReduce += reduceBonus;\n+        }\n+\n+        void ApplyClassSpellCooldownMods(SpellInfo const* spellInfo, uint32& cooldown) const override\n+        {\n+            //cooldown is in milliseconds\n+            //uint32 spellId = spellInfo->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            int32 timebonus = 0;\n+            float pctbonus = 0.0f;\n+\n+            //pct mods\n+            //Glyph of Rapid Charge: -7% cooldown for Charge\n+            //if (lvl >= 40 && spellId == GetSpell(CHARGE_1))\n+            //    pctbonus += 0.07f;\n+\n+            //flat mods\n+            //Reverberation\n+            if (lvl >= 20 && ((spellInfo->SpellFamilyFlags[0] & 0x90100000) || (spellInfo->SpellFamilyFlags[1] & 0x8000000)))\n+                timebonus += 1000;\n+            //Booming Echoes (part 1)\n+            if ((GetSpec() == BOT_SPEC_SHAMAN_ELEMENTAL) && lvl >= 45 && (spellInfo->SpellFamilyFlags[0] & 0x90000000))\n+                timebonus += 2000;\n+            //Storm, Earth and Fire (part 1)\n+            if ((GetSpec() == BOT_SPEC_SHAMAN_ELEMENTAL) && lvl >= 40 && (spellInfo->SpellFamilyFlags[0] & 0x2))\n+                timebonus += 2500;\n+            //Improved Fire Nova (part 2)\n+            if ((GetSpec() == BOT_SPEC_SHAMAN_ELEMENTAL) && lvl >= 25 && (spellInfo->SpellFamilyFlags[0] & 0x8000000))\n+                timebonus += 4000;\n+\n+            cooldown = std::max<int32>((float(cooldown) * (1.0f - pctbonus)) - timebonus, 0);\n+        }\n+\n+        void ApplyClassSpellCategoryCooldownMods(SpellInfo const* spellInfo, uint32& cooldown) const override\n+        {\n+            //cooldown is in milliseconds\n+            uint32 spellId = spellInfo->Id;\n+            //uint8 lvl = me->GetLevel();\n+            int32 timebonus = 0;\n+            float pctbonus = 0.0f;\n+\n+            //Improved Reincarnation + Reduced Reincarnation Cooldown: -20 min cooldown for Reincarnation\n+            if (spellId == GetSpell(REINCARNATION_1))\n+                timebonus += 1200000;\n+\n+            cooldown = std::max<int32>((float(cooldown) * (1.0f - pctbonus)) - timebonus, 0);\n+        }\n+\n+        void ApplyClassSpellGlobalCooldownMods(SpellInfo const* spellInfo, float& cooldown) const override\n+        {\n+            //cooldown is in milliseconds\n+            //uint32 spellId = spellInfo->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            float timebonus = 0.0f;\n+            float pctbonus = 0.0f;\n+\n+            //Glyph of Shocking: -0.5 sec global cooldown for Shocks\n+            if (lvl >= 15 && ((spellInfo->SpellFamilyFlags[0] & 0x90100000) || (spellInfo->SpellFamilyFlags[1] & 0x8000000)))\n+                timebonus += 500.f;\n+\n+            cooldown = (cooldown * (1.0f - pctbonus)) - timebonus;\n+        }\n+\n+        void ApplyClassSpellRangeMods(SpellInfo const* spellInfo, float& maxrange) const override\n+        {\n+            //uint32 spellId = spellInfo->Id;\n+            //uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            float flatbonus = 0.0f;\n+            float pctbonus = 0.0f;\n+\n+            //pct mods\n+            //Grim Reach: +20% range for Affliction Spells\n+            //if (lvl >= 25 && ((spellInfo->SpellFamilyFlags[0] & 0x8048C41A) || (spellInfo->SpellFamilyFlags[1] & 0x40713)))\n+            //    pctbonus += 0.2f;\n+\n+            //flat mods\n+            //Elemental Reach part 1: +6 yd\n+            if ((GetSpec() == BOT_SPEC_SHAMAN_ELEMENTAL) &&\n+                lvl >= 30 && ((spellInfo->SpellFamilyFlags[0] & 0x8000003) || (spellInfo->SpellFamilyFlags[1] & 0x1000)))\n+                flatbonus += 6.f;\n+            //Elemental Reach part 2: +15 yd\n+            if ((GetSpec() == BOT_SPEC_SHAMAN_ELEMENTAL) &&\n+                lvl >= 30 && (spellInfo->SpellFamilyFlags[0] & 0x10000000))\n+                flatbonus += 15.f;\n+\n+            maxrange = maxrange * (1.0f + pctbonus) + flatbonus;\n+        }\n+\n+        void ApplyClassSpellMaxTargetsMods(SpellInfo const* spellInfo, uint32& targets) const override\n+        {\n+            uint32 bonusTargets = 0;\n+\n+            //Glyph of Chain Heal\n+            if (spellInfo->SpellFamilyFlags[0] & 0x100)\n+                bonusTargets += 1;\n+            //Glyph of Chain Lightning\n+            if (spellInfo->SpellFamilyFlags[0] & 0x2)\n+                bonusTargets += 1;\n+            //Chain Healing Wave (23573)\n+            if (me->GetLevel() >= 60 && spellInfo->SpellFamilyFlags[0] & 0x100)\n+                bonusTargets += 2;\n+\n+            targets = targets + bonusTargets;\n+        }\n+\n+        void OnClassSpellGo(SpellInfo const* spellInfo) override\n+        {\n+            //uint32 spellId = spellInfo->Id;\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+\n+            //reincarnation: notify master\n+            if (baseId == REINCARNATION_1 && !IAmFree())\n+            {\n+                ReportSpellCast(baseId, LocalizedNpcText(master, BOT_TEXT__USED), master);\n+\n+                //no spellHit trigger - do it here\n+                SpellHit(me, spellInfo);\n+                me->CastSpell(me, RESURRECTION_VISUAL_SPELL, true);\n+            }\n+            //manatide: notify\n+            if (baseId == MANA_TIDE_TOTEM_1 && !IAmFree())\n+            {\n+                ReportSpellCast(baseId, LocalizedNpcText(master, BOT_TEXT__USED), master);\n+            }\n+            //Nature's Swiftness: notify master\n+            if (baseId == NATURES_SWIFTNESS_1 && !IAmFree())\n+            {\n+                ReportSpellCast(baseId, LocalizedNpcText(master, BOT_TEXT__USED), master);\n+            }\n+\n+            //Handle Clearcasting\n+            if (AuraEffect* eff = me->GetAuraEffect(ELEMENTAL_FOCUS_BUFF, 0, me->GetGUID()))\n+                if (eff->IsAffectingSpell(spellInfo))\n+                    eff->GetBase()->DropCharge();\n+            //Handle Tidal Focus\n+            //Healing Wave (cast time): if full Maelstrom than don't use up charge\n+            if (MaelstromCount < 5 && (spellInfo->SpellFamilyFlags[0] & 0x40))\n+                if (AuraEffect* eff = me->GetAuraEffect(TIDAL_WAVES_BUFF, 0, me->GetGUID()))\n+                    if (eff->IsAffectingSpell(spellInfo))\n+                        eff->GetBase()->DropCharge();\n+            //Lesser Healing Wave (crit)\n+            if (spellInfo->SpellFamilyFlags[0] & 0x80)\n+                if (AuraEffect* eff = me->GetAuraEffect(TIDAL_WAVES_BUFF, 1, me->GetGUID()))\n+                    if (eff->IsAffectingSpell(spellInfo))\n+                        eff->GetBase()->DropCharge();\n+\n+            //Nature's Swiftness\n+            if (AuraEffect const* eff = me->GetAuraEffect(NATURES_SWIFTNESS_1, 0, me->GetGUID()))\n+            {\n+                if (eff->IsAffectingSpell(spellInfo))\n+                    me->RemoveAurasDueToSpell(NATURES_SWIFTNESS_1);\n+            }\n+\n+            //Tidal Force: Handled in Unit::HandleDummyAuraProc(): case 55166:\n+            //if (spellInfo->SpellFamilyFlags[0] & 0x1C0)\n+            //    if (AuraEffect const* eff = me->GetAuraEffect(TIDAL_FORCE_BUFF, 0, me->GetGUID()))\n+            //        if (eff->IsAffectingSpell(spellInfo))\n+            //            me->RemoveAuraFromStack(TIDAL_FORCE_BUFF);\n+\n+            //Shield cd\n+            if (baseId == LIGHTNING_SHIELD_DAMAGE_1)\n+                SetSpellCooldown(LIGHTNING_SHIELD_DAMAGE_1, 3000); //is that right? from spell_proc_event\n+\n+            //autouse totems\n+            if (baseId == EARTHBIND_TOTEM_1 || baseId == STRENGTH_OF_EARTH_TOTEM_1)\n+                _totemTimer[T_EARTH] = 5000;\n+            if (baseId == TREMOR_TOTEM_1)\n+                _totemTimer[T_EARTH] = 12000;\n+            if (baseId == MAGMA_TOTEM_1)\n+                _totemTimer[T_FIRE] = 12000;\n+            if (baseId == TOTEM_OF_WRATH_1 || baseId == FLAMETONGUE_TOTEM_1)\n+                _totemTimer[T_FIRE] = 5000;\n+            if (baseId == FROST_RESISTANCE_TOTEM_1)\n+                _totemTimer[T_FIRE] = 120000;\n+            if (baseId == MANA_TIDE_TOTEM_1)\n+                _totemTimer[T_WATER] = 12000;\n+            if (baseId == MANA_SPRING_TOTEM_1)\n+                _totemTimer[T_WATER] = 5000;\n+            if (baseId == FIRE_RESISTANCE_TOTEM_1)\n+                _totemTimer[T_WATER] = 120000;\n+            if (baseId == GROUNDING_TOTEM_1)\n+                _totemTimer[T_AIR] = me->GetLevel() >= 15 ? 13000 : 15000;\n+            if (baseId == WRATH_OF_AIR_TOTEM_1 || baseId == WINDFURY_TOTEM_1)\n+                _totemTimer[T_AIR] = 5000;\n+            if (baseId == NATURE_RESISTANCE_TOTEM_1)\n+                _totemTimer[T_AIR] = 120000;\n+            //other (manual use)\n+            if (baseId == STONECLAW_TOTEM_1)\n+                _totemTimer[T_EARTH] = 15000;\n+            if (baseId == STONESKIN_TOTEM_1)\n+                _totemTimer[T_EARTH] = 300000;\n+            if (baseId == EARTH_ELEMENTAL_TOTEM_1)\n+                _totemTimer[T_EARTH] = 120000;\n+            if (baseId == SEARING_TOTEM_1)\n+                _totemTimer[T_FIRE] = 60000;\n+            if (baseId == FIRE_ELEMENTAL_TOTEM_1)\n+                _totemTimer[T_FIRE] = 120000;\n+            if (baseId == CLEANSING_TOTEM_1)\n+                _totemTimer[T_WATER] = 300000;\n+            if (baseId == HEALING_STREAM_TOTEM_1)\n+                _totemTimer[T_WATER] = 300000;\n+\n+            //Totemic Recall totems resummon helper\n+            if (baseId == TOTEMIC_RECALL_1)\n+            {\n+                TotemsCheckTimer = GC_Timer;\n+                for (auto i : NPCBots::index_array<uint8, MAX_TOTEMS>)\n+                    _totemTimer[i] = 0;\n+            }\n+\n+            if (maelUseUp)\n+            {\n+                if (baseId == LIGHTNING_BOLT_1 || baseId == CHAIN_LIGHTNING_1 || baseId == HEALING_WAVE_1 ||\n+                    baseId == LESSER_HEALING_WAVE_1 || baseId == CHAIN_HEAL_1 || baseId == HEX_1)\n+                {\n+                    MaelstromCount = 0;\n+                    me->RemoveAurasDueToSpell(MAELSTROM_WEAPON_BUFF);\n+                }\n+            }\n+\n+            //Item enchant\n+            //We don't know which item is targeted\n+            //Actually it is mh, then oh\n+            if (/*baseId == ROCKBITER_WEAPON_1 || */baseId == FLAMETONGUE_WEAPON_1 || baseId == FROSTBRAND_WEAPON_1 ||\n+                baseId == WINDFURY_WEAPON_1 || baseId == EARTHLIVING_WEAPON_1)\n+            {\n+                //We set duration to 2 seconds to prevent exploiting unequip mechanic\n+                //to get enchanted weapons for player (for non-shaman bots it won't work)\n+                uint32 slot = TEMP_ENCHANTMENT_SLOT;\n+                uint32 duration = 2 * IN_MILLISECONDS;\n+                uint32 charges = 0;\n+                uint32 enchant_id = spellInfo->_effects[0].MiscValue;\n+                //SpellItemEnchantmentEntry const* pEnchant = sSpellItemEnchantmentStore.LookupEntry(enchant_id);\n+                Item* mh = GetEquips(BOT_SLOT_MAINHAND);\n+                Item* oh = GetEquips(BOT_SLOT_OFFHAND);\n+                Item* item = nullptr;\n+                uint8 itemSlot = 0;\n+\n+                if (mh && !mh->GetEnchantmentId(TEMP_ENCHANTMENT_SLOT)/* && mh->IsFitToSpellRequirements(spellInfo)*/)\n+                {\n+                    item = mh;\n+                    itemSlot = BOT_SLOT_MAINHAND;\n+                }\n+                else if (oh && !oh->GetEnchantmentId(TEMP_ENCHANTMENT_SLOT)/* && oh->IsFitToSpellRequirements(spellInfo)*/)\n+                {\n+                    item = oh;\n+                    itemSlot = BOT_SLOT_OFFHAND;\n+                }\n+                else\n+                    ASSERT(false, \"shaman bot attempted to enchant his weapons but cannot find a weapon to apply it!\");\n+\n+                if (!IAmFree())\n+                    master->GetSession()->SendEnchantmentLog(me->GetGUID(), me->GetGUID(), item->GetEntry(), enchant_id);\n+\n+                item->SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_ID_OFFSET, enchant_id);\n+                item->SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_DURATION_OFFSET, duration);\n+                item->SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_CHARGES_OFFSET, charges);\n+                ApplyItemEnchantment(item, TEMP_ENCHANTMENT_SLOT, itemSlot);\n+                if (itemSlot == BOT_SLOT_MAINHAND)\n+                    mhEnchantExpireTimer = ITEM_ENCHANTMENT_EXPIRE_TIMER;\n+                else if (itemSlot == BOT_SLOT_OFFHAND)\n+                    ohEnchantExpireTimer = ITEM_ENCHANTMENT_EXPIRE_TIMER;\n+                GC_Timer = 1500; //needed\n+            }\n+        }\n+\n+        void SpellHit(WorldObject* wcaster, SpellInfo const* spell) override\n+        {\n+            Unit* caster = wcaster->ToUnit();\n+            if (!caster)\n+                return;\n+\n+            uint32 spellId = spell->Id;\n+\n+            //Maelstrom Weapon helper\n+            if (spellId == MAELSTROM_WEAPON_BUFF)\n+            {\n+                if (Aura const* mwb = me->GetAura(MAELSTROM_WEAPON_BUFF))\n+                    MaelstromCount = mwb->GetStackAmount();\n+\n+                MaelstromTimer = 30000; //30 sec duration then reset\n+            }\n+\n+            OnSpellHit(caster, spell);\n+        }\n+\n+        void SpellHitTarget(WorldObject* wtarget, SpellInfo const* spell) override\n+        {\n+            Unit* target = wtarget->ToUnit();\n+            if (!target)\n+                return;\n+\n+            uint32 spellId = spell->Id;\n+            uint32 baseId = spell->GetFirstRankSpell()->Id;\n+\n+            if (baseId == EARTH_SHIELD_1)\n+                Earthy = true;\n+\n+            if (baseId == HEX_1)\n+            {\n+                Hexy = true;\n+                HexyCheckTimer += 2000;\n+            }\n+\n+            //Earthen Power part 2\n+            if ((GetSpec() == BOT_SPEC_SHAMAN_ENHANCEMENT) && me->GetLevel() >= 50 && baseId == EARTH_SHOCK_1)\n+            {\n+                if (AuraEffect* eff = target->GetAuraEffect(spellId, 0, me->GetGUID()))\n+                    eff->ChangeAmount(eff->GetAmount() * 2);\n+            }\n+\n+            //Lightning Overload\n+            if ((GetSpec() == BOT_SPEC_SHAMAN_ELEMENTAL) &&\n+                me->GetLevel() >= 45 && (baseId == LIGHTNING_BOLT_1 || baseId == CHAIN_LIGHTNING_1) &&\n+                urand(1,100) <= 33)\n+            {\n+                uint32 procId = 0;\n+                switch (spellId)\n+                {\n+                    // Lightning Bolt\n+                    case   403: procId = 45284; break; // Rank  1\n+                    case   529: procId = 45286; break; // Rank  2\n+                    case   548: procId = 45287; break; // Rank  3\n+                    case   915: procId = 45288; break; // Rank  4\n+                    case   943: procId = 45289; break; // Rank  5\n+                    case  6041: procId = 45290; break; // Rank  6\n+                    case 10391: procId = 45291; break; // Rank  7\n+                    case 10392: procId = 45292; break; // Rank  8\n+                    case 15207: procId = 45293; break; // Rank  9\n+                    case 15208: procId = 45294; break; // Rank 10\n+                    case 25448: procId = 45295; break; // Rank 11\n+                    case 25449: procId = 45296; break; // Rank 12\n+                    case 49237: procId = 49239; break; // Rank 13\n+                    case 49238: procId = 49240; break; // Rank 14\n+                    // Chain Lightning\n+                    case   421: procId = 45297; break; // Rank  1\n+                    case   930: procId = 45298; break; // Rank  2\n+                    case  2860: procId = 45299; break; // Rank  3\n+                    case 10605: procId = 45300; break; // Rank  4\n+                    case 25439: procId = 45301; break; // Rank  5\n+                    case 25442: procId = 45302; break; // Rank  6\n+                    case 49270: procId = 49268; break; // Rank  7\n+                    case 49271: procId = 49269; break; // Rank  8\n+                    default:                    break;\n+                }\n+\n+                if (procId)\n+                {\n+                    if (baseId == LIGHTNING_BOLT_1)\n+                        me->CastSpell(target, procId, true);\n+                    if (baseId == CHAIN_LIGHTNING_1)\n+                    {\n+                        //Normalize chance\n+                        if (urand(1,100) <= (100.f / spell->_effects[0].ChainTargets))\n+                            me->CastSpell(target, procId, true);\n+                    }\n+                }\n+            }\n+\n+            //Shields improvement, replaces Static Shock (part 2) and Improved Earth Shield (part 1)\n+            if (baseId == LIGHTNING_SHIELD_1 || baseId == EARTH_SHIELD_1 || baseId == WATER_SHIELD_1)\n+            {\n+                if (Aura* shield = target->GetAura(spellId, me->GetGUID()))\n+                {\n+                    shield->SetCharges(shield->GetCharges() + 6);\n+                }\n+            }\n+\n+            OnSpellHitTarget(target, spell);\n+        }\n+\n+        void DamageDealt(Unit* victim, uint32& damage, DamageEffectType damageType) override\n+        {\n+            bot_ai::DamageDealt(victim, damage, damageType);\n+        }\n+\n+        void DamageTaken(Unit* u, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo*/) override\n+        {\n+            if (!u)\n+                return;\n+            if (!u->IsInCombat() && !me->IsInCombat())\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void OwnerAttackedBy(Unit* u) override\n+        {\n+            if (!u)\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        uint8 GetPetPositionNumber(Creature const* summon) const override\n+        {\n+            for (auto i : NPCBots::index_array<uint8, MAX_WOLVES>)\n+                if (_wolves[i] == summon->GetGUID())\n+                    return i;\n+\n+            return 0;\n+        }\n+\n+        void SummonBotPet(Unit* target)\n+        {\n+            UnsummonWolves();\n+\n+            uint32 entry = BOT_PET_SPIRIT_WOLF;\n+\n+            for ([[maybe_unused]] auto i : NPCBots::index_array<uint8, MAX_WOLVES>)\n+            {\n+                //Position pos;\n+\n+                //45 sec duration\n+                Creature* myPet = me->SummonCreature(entry, *me, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5s);\n+                //me->GetNearPoint(myPet, pos.m_positionX, pos.m_positionY, pos.m_positionZ, 0, 2, me->GetOrientation());\n+                //myPet->GetMotionMaster()->MovePoint(me->GetMapId(), pos);\n+                myPet->SetCreator(master);\n+                myPet->SetOwnerGUID(me->GetGUID());\n+                myPet->SetFaction(master->GetFaction());\n+                myPet->SetControlledByPlayer(!IAmFree());\n+                myPet->SetPvP(me->IsPvP());\n+                myPet->SetByteValue(UNIT_FIELD_BYTES_2, 1, master->GetByteValue(UNIT_FIELD_BYTES_2, 1));\n+                myPet->SetUInt32Value(UNIT_CREATED_BY_SPELL, FERAL_SPIRIT_1);\n+\n+                //botPet = myPet;\n+\n+                myPet->Attack(target, true);\n+                if (!HasBotCommandState(BOT_COMMAND_MASK_UNCHASE))\n+                    myPet->GetMotionMaster()->MoveChase(target);\n+            }\n+        }\n+\n+        void JustSummoned(Creature* summon) override\n+        {\n+            if (summon->GetEntry() == BOT_PET_SPIRIT_WOLF)\n+            {\n+                bool found = false;\n+                for (auto i : NPCBots::index_array<uint8, MAX_WOLVES>)\n+                {\n+                    if (!_wolves[i])\n+                    {\n+                        _wolves[i] = summon->GetGUID();\n+                        found = true;\n+                        break;\n+                    }\n+                }\n+                if (!found)\n+                {\n+                    BOT_LOG_ERROR(\"entities.unit\", \"Shaman_bot:JustSummoned() wolves array is full\");\n+                    ASSERT(false);\n+                }\n+            }\n+        }\n+\n+        void SummonedCreatureDespawn(Creature* summon) override\n+        {\n+            //BOT_LOG_ERROR(\"entities.unit\", \"SummonedCreatureDespawn: {}'s {}\", me->GetName(), summon->GetName());\n+            //if (summon == botPet)\n+            //    botPet = nullptr;\n+            if (summon->GetEntry() == BOT_PET_SPIRIT_WOLF)\n+            {\n+                //bool found = false;\n+                for (auto i : NPCBots::index_array<uint8, MAX_WOLVES>)\n+                {\n+                    if (_wolves[i] == summon->GetGUID())\n+                    {\n+                        _wolves[i] = ObjectGuid::Empty;\n+                        //found = true;\n+                        break;\n+                    }\n+                }\n+                //if (!found)\n+                //{\n+                //    BOT_LOG_ERROR(\"entities.unit\", \"Shaman_bot:SummonedCreatureDespawn() wolf is not found in array\");\n+                //    ASSERT(false);\n+                //}\n+            }\n+        }\n+\n+        void UnsummonWolves()\n+        {\n+            for (auto i : NPCBots::index_array<uint8, MAX_WOLVES>)\n+            {\n+                if (!_wolves[i].IsEmpty())\n+                {\n+                    if (Unit* wo = ObjectAccessor::GetUnit(*me, _wolves[i]))\n+                        wo->ToTempSummon()->UnSummon();\n+                    else\n+                        _wolves[i] = ObjectGuid::Empty;\n+                }\n+            }\n+        }\n+\n+        void UnsummonAll(bool /*savePets*/ = true) override\n+        {\n+            UnsummonWolves();\n+\n+            for (auto i : NPCBots::index_array<uint8, MAX_WOLVES>)\n+            {\n+                if (_totems[i].first != ObjectGuid::Empty)\n+                {\n+                    Unit* to = ObjectAccessor::GetUnit(*me, _totems[i].first);\n+                    if (!to)\n+                    {\n+                        //BOT_LOG_ERROR(\"entities.player\", \"{} has no totem in slot {} during remove!\", me->GetName(), i);\n+                        continue;\n+                    }\n+                    to->ToTotem()->UnSummon();\n+                }\n+            }\n+        }\n+\n+        void OnBotDespawn(Creature* summon) override\n+        {\n+            if (!summon)\n+            {\n+                BOT_LOG_ERROR(\"entities.player\", \"OnBotDespawn(): Shaman bot {} received NULL\", me->GetName());\n+                ASSERT(false);\n+                //UnsummonAll(false);\n+                return;\n+            }\n+\n+            TempSummon const* totem = summon->ToTempSummon();\n+            if (!totem || !totem->IsTotem())\n+            {\n+                //BOT_LOG_ERROR(\"entities.player\", \"OnBotDespawn(): Shaman bot {} has despawned summon {} which is not a temp summon or not a totem...\", me->GetName(), summon->GetName());\n+                return;\n+            }\n+\n+            int8 slot = -1;\n+            switch (totem->m_Properties->Slot)\n+            {\n+                case SUMMON_SLOT_TOTEM_FIRE:    slot = T_FIRE;  break;\n+                case SUMMON_SLOT_TOTEM_EARTH:   slot = T_EARTH; break;\n+                case SUMMON_SLOT_TOTEM_WATER:   slot = T_WATER; break;\n+                case SUMMON_SLOT_TOTEM_AIR:     slot = T_AIR;   break;\n+                default:\n+                    BOT_LOG_ERROR(\"entities.player\", \"OnBotDespawn(): Shaman bot {} has despawned totem {} in unknown slot {}\", me->GetName(), summon->GetName(), totem->m_Properties->ID);\n+                    return;\n+            }\n+\n+            if (_totems[slot].first == ObjectGuid::Empty)\n+                BOT_LOG_ERROR(\"entities.player\", \"OnBotDespawn(): Shaman bot {} has despawned totem {} while not having it registered!\", me->GetName(), summon->GetName());\n+            else if (_totems[slot].second._type == BOT_TOTEM_NONE || _totems[slot].second._type >= BOT_TOTEM_END)\n+                BOT_LOG_ERROR(\"entities.player\", \"OnBotDespawn(): Shaman bot {} has despawned totem {} with no type assigned!\", me->GetName(), summon->GetName());\n+\n+            //here we reset totem category cd (not totem spell cd) if totem is destroyed\n+            //BOT_LOG_ERROR(\"entities.player\", \"OnBotDespawn(): {} despawned ({} : {})\", summon->GetName(), summon->IsAlive() ? \"alive\" : summon->isDying() ? \"justdied\" : \"unk\", (uint32)summon->getDeathState());\n+            if (!summon->IsAlive()) // alive here means totem is being replaced or unsummoned through other means\n+                _totemTimer[slot] = 0;\n+\n+            _totems[slot].first = ObjectGuid::Empty;\n+            _totems[slot].second._type = BOT_TOTEM_NONE;\n+            me->m_SummonSlot[slot+1] = ObjectGuid::Empty;\n+        }\n+\n+        void OnBotSummon(Creature* summon) override\n+        {\n+            TempSummon const* totem = summon->ToTempSummon();\n+            if (!totem || !totem->IsTotem())\n+            {\n+                //BOT_LOG_ERROR(\"entities.player\", \"OnBotSummon(): Shaman bot {} has summoned creature {} which is not a temp summon or not a totem...\", me->GetName(), summon->GetName());\n+                return;\n+            }\n+\n+            int8 slot = -1;\n+            switch (totem->m_Properties->Slot)\n+            {\n+                case SUMMON_SLOT_TOTEM_FIRE:    slot = T_FIRE;  break;\n+                case SUMMON_SLOT_TOTEM_EARTH:   slot = T_EARTH; break;\n+                case SUMMON_SLOT_TOTEM_WATER:   slot = T_WATER; break;\n+                case SUMMON_SLOT_TOTEM_AIR:     slot = T_AIR;   break;\n+                default:\n+                    BOT_LOG_ERROR(\"entities.player\", \"OnBotSummon(): Shaman bot {} has summoned totem {} with unknown type {}\", me->GetName(), summon->GetName(), totem->m_Properties->ID);\n+                    return;\n+            }\n+\n+            //Unsummon current totem\n+            ObjectGuid curTotemGUID = _totems[slot].first;\n+            if (!curTotemGUID.IsEmpty())\n+            {\n+                Unit* curTotem = ObjectAccessor::GetUnit(*me, curTotemGUID);\n+                if (curTotem)\n+                    curTotem->ToTotem()->UnSummon();\n+            }\n+\n+            float radius = 30.f;\n+            if (SpellInfo const* info = sSpellMgr->GetSpellInfo(summon->m_spells[0]))\n+                if (SpellRadiusEntry const* entry = info->_effects[0].RadiusEntry)\n+                    radius = std::max<float>(entry->RadiusMax, radius);\n+\n+            uint32 createSpell = summon->GetUInt32Value(UNIT_CREATED_BY_SPELL);\n+            if (createSpell)\n+                createSpell = sSpellMgr->GetSpellInfo(createSpell)->GetFirstRankSpell()->Id;\n+            //DEBUG\n+            //if (!IAmFree())\n+            //{\n+            //    std::ostringstream msg;\n+            //    msg << \"Summoned \" << summon->GetName() << \" by basespell: \" << createSpell;\n+            //    BotWhisper(msg.view());\n+            //}\n+            uint32 btype;\n+            switch (createSpell)\n+            {\n+                case SEARING_TOTEM_1:           btype = BOT_TOTEM_SEARING;              break;\n+                case STONECLAW_TOTEM_1:         btype = BOT_TOTEM_STONECLAW;            break;\n+                case SENTRY_TOTEM_1:            btype = BOT_TOTEM_SENTRY;               break;\n+                case STONESKIN_TOTEM_1:         btype = BOT_TOTEM_STONESKIN;            break;\n+                case HEALING_STREAM_TOTEM_1:    btype = BOT_TOTEM_HEALING_STREAM;       break;\n+                case EARTHBIND_TOTEM_1:         btype = BOT_TOTEM_EARTHBIND;            break;\n+                case EARTH_ELEMENTAL_TOTEM_1:   btype = BOT_TOTEM_ELEMENTAL_EARTH;      break;\n+                case FIRE_ELEMENTAL_TOTEM_1:    btype = BOT_TOTEM_ELEMENTAL_FIRE;       break;\n+                case MAGMA_TOTEM_1:             btype = BOT_TOTEM_MAGMA;                break;\n+                case FLAMETONGUE_TOTEM_1:       btype = BOT_TOTEM_FLAMETONGUE;          break;\n+                case FROST_RESISTANCE_TOTEM_1:  btype = BOT_TOTEM_RESISTANCE_FROST;     break;\n+                case FIRE_RESISTANCE_TOTEM_1:   btype = BOT_TOTEM_RESISTANCE_FIRE;      break;\n+                case NATURE_RESISTANCE_TOTEM_1: btype = BOT_TOTEM_RESISTANCE_NATURE;    break;\n+                case GROUNDING_TOTEM_1:         btype = BOT_TOTEM_GROUNDING;            break;\n+                case STRENGTH_OF_EARTH_TOTEM_1: btype = BOT_TOTEM_STRENGTH_OF_EARTH;    break;\n+                case WINDFURY_TOTEM_1:          btype = BOT_TOTEM_WINDFURY;             break;\n+                case WRATH_OF_AIR_TOTEM_1:      btype = BOT_TOTEM_WRATH_OF_AIR;         break;\n+                case CLEANSING_TOTEM_1:         btype = BOT_TOTEM_CLEANSING;            break;\n+                case MANA_SPRING_TOTEM_1:       btype = BOT_TOTEM_MANA_SPRING;          break;\n+                case MANA_TIDE_TOTEM_1:         btype = BOT_TOTEM_MANA_TIDE;            break;\n+                case TREMOR_TOTEM_1:            btype = BOT_TOTEM_TREMOR;               break;\n+                case TOTEM_OF_WRATH_1:          btype = BOT_TOTEM_WRATH;                break;\n+                default:\n+                {\n+                    BOT_LOG_ERROR(\"scripts\", \"Unknown totem create spell {}!\", createSpell);\n+                    btype = BOT_TOTEM_NONE;\n+                    break;\n+                }\n+            }\n+            _totems[slot].first = summon->GetGUID();\n+            _totems[slot].second._pos.Relocate(*summon);\n+            _totems[slot].second._effradius = !((1u<<btype) & BOT_TOTEM_MASK_SUMMONS) ? radius : SIZE_OF_GRIDS;\n+            _totems[slot].second._type = btype;\n+            me->m_SummonSlot[slot+1] = _totems[slot].first; //needed for scripts handlers\n+\n+            //BOT_LOG_ERROR(\"entities.player\", \"shaman bot: summoned {} (type {}) at x={}, y={}, z={}\",\n+            //    summon->GetName(), slot + 1, _totems[slot].second.pos.GetPositionX(), _totems[slot].second.pos.GetPositionY(), _totems[slot].second.pos.GetPositionZ());\n+\n+            //TODO: gets overriden in Spell::EffectSummonType (end)\n+            //Without setting creator correctly it will be impossible to use summon X elemental totems\n+            summon->SetCreator(me);\n+            summon->SetDisplayId(sObjectMgr->GetModelForTotem(SummonSlot(slot+1), Races(me->GetRace())));\n+            summon->SetFaction(me->GetFaction());\n+            summon->SetPvP(me->IsPvP());\n+            summon->SetOwnerGUID(master->GetGUID());\n+            summon->SetControlledByPlayer(!IAmFree());\n+            //summon->SetUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED);\n+            // totem will claim master's summon slot\n+            // free it to avoid conflicts with other shaman bots and master\n+            // if master is a shaman his totem will despawn\n+            // fixed in summoning sequence\n+            //master->m_SummonSlot[++slot] = 0;\n+\n+            //After summon effects which are not handled for bot totems\n+            //check by btype\n+\n+            // Storm, Earth and Fire: Earthbind totem AoE root\n+            if ((GetSpec() == BOT_SPEC_SHAMAN_ELEMENTAL) && btype == BOT_TOTEM_EARTHBIND && me->GetLevel() >= 40)\n+            {\n+                //master's talent will be found so do not cast earthgrab twice, instead let spell script roll the chance\n+                //see spell_shaman.cpp\n+                if (!master->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_SHAMAN, 3063, EFFECT_1))\n+                    summon->CastSpell(summon, STORMEARTHANDFIRE_EARTHGRAB, false);\n+            }\n+        }\n+\n+        float GetSpellAttackRange(bool longRange) const override\n+        {\n+            return longRange ? CalcSpellMaxRange(LIGHTNING_BOLT_1) : 20.f;\n+        }\n+\n+        uint32 GetAIMiscValue(uint32 data) const override\n+        {\n+            switch (data)\n+            {\n+                case BOTAI_MISC_ENCHANT_IS_AUTO_MH:\n+                    return needChooseMHEnchant;\n+                case BOTAI_MISC_ENCHANT_IS_AUTO_OH:\n+                    return needChooseOHEnchant;\n+                case BOTAI_MISC_ENCHANT_TIMER_MH:\n+                    return mhEnchantExpireTimer;\n+                case BOTAI_MISC_ENCHANT_TIMER_OH:\n+                    return ohEnchantExpireTimer;\n+                case BOTAI_MISC_ENCHANT_CURRENT_MH:\n+                    return mhEnchant;\n+                case BOTAI_MISC_ENCHANT_CURRENT_OH:\n+                    return ohEnchant;\n+                case BOTAI_MISC_ENCHANT_AVAILABLE_1:\n+                    return /*GetSpell(ROCKBITER_WEAPON_1) ? ROCKBITER_WEAPON_1 : */0;\n+                case BOTAI_MISC_ENCHANT_AVAILABLE_2:\n+                    return GetSpell(FLAMETONGUE_WEAPON_1) ? FLAMETONGUE_WEAPON_1 : 0;\n+                case BOTAI_MISC_ENCHANT_AVAILABLE_3:\n+                    return GetSpell(FROSTBRAND_WEAPON_1) ? FROSTBRAND_WEAPON_1 : 0;\n+                case BOTAI_MISC_ENCHANT_AVAILABLE_4:\n+                    return GetSpell(WINDFURY_WEAPON_1) ? WINDFURY_WEAPON_1 : 0;\n+                case BOTAI_MISC_ENCHANT_AVAILABLE_5:\n+                    return GetSpell(EARTHLIVING_WEAPON_1) ? EARTHLIVING_WEAPON_1 : 0;\n+                case BOTAI_MISC_PET_TYPE:\n+                    return BOT_PET_SPIRIT_WOLF;\n+                default:\n+                    return 0;\n+            }\n+        }\n+\n+        void SetAIMiscValue(uint32 data, uint32 value) override\n+        {\n+            switch (data)\n+            {\n+                case BOTAI_MISC_ENCHANT_IS_AUTO_MH:\n+                    needChooseMHEnchant = bool(value);\n+                    break;\n+                case BOTAI_MISC_ENCHANT_IS_AUTO_OH:\n+                    needChooseOHEnchant = bool(value);\n+                    break;\n+                case BOTAI_MISC_ENCHANT_TIMER_MH:\n+                    if (value == 0)\n+                        mhEnchantExpireTimer = value;\n+                    break;\n+                case BOTAI_MISC_ENCHANT_TIMER_OH:\n+                    if (value == 0)\n+                        ohEnchantExpireTimer = value;\n+                    break;\n+                case BOTAI_MISC_ENCHANT_CURRENT_MH:\n+                    mhEnchant = value;\n+                    SetAIMiscValue(BOTAI_MISC_ENCHANT_IS_AUTO_MH, value ? false : true);\n+                    break;\n+                case BOTAI_MISC_ENCHANT_CURRENT_OH:\n+                    ohEnchant = value;\n+                    SetAIMiscValue(BOTAI_MISC_ENCHANT_IS_AUTO_OH, value ? false : true);\n+                    break;\n+                default:\n+                    break;\n+            }\n+\n+            bot_ai::SetAIMiscValue(data, value);\n+        }\n+\n+        void Reset() override\n+        {\n+            UnsummonAll(false);\n+\n+            _wolves = {};\n+            _totemTimer = {};\n+\n+            removeShapeshiftForm();\n+\n+            TotemsCheckTimer = 1500;\n+\n+            HexyCheckTimer = 3000;\n+            EarthyCheckTimer = 2000;\n+            ShieldCheckTimer = 2000;\n+            BloodlustCheckTimer = 5000;\n+            MaelstromTimer = 0;\n+\n+            MaelstromCount = 0;\n+\n+            Hexy = false;\n+            Earthy = false;\n+            maelUseUp = false;\n+\n+            mhEnchantExpireTimer = std::min<uint32>(mhEnchantExpireTimer, 1);\n+            ohEnchantExpireTimer = std::min<uint32>(ohEnchantExpireTimer, 1);\n+\n+            DefaultInit();\n+        }\n+\n+        void ReduceCD(uint32 diff) override\n+        {\n+            for (auto& ttimer : _totemTimer)\n+                if (ttimer > diff)\n+                    ttimer -= diff;\n+\n+            if (TotemsCheckTimer > diff)        TotemsCheckTimer -= diff;\n+\n+            if (HexyCheckTimer > diff)          HexyCheckTimer -= diff;\n+            if (EarthyCheckTimer > diff)        EarthyCheckTimer -= diff;\n+            if (ShieldCheckTimer > diff)        ShieldCheckTimer -= diff;\n+            if (BloodlustCheckTimer > diff)     BloodlustCheckTimer -= diff;\n+\n+            if (MaelstromTimer > diff)          MaelstromTimer -= diff;\n+            else if (MaelstromCount) { MaelstromCount = 0; maelUseUp = false; }\n+\n+            if (mhEnchantExpireTimer > diff)    mhEnchantExpireTimer -= diff;\n+            if (ohEnchantExpireTimer > diff)    ohEnchantExpireTimer -= diff;\n+        }\n+\n+        void InitPowers() override\n+        {\n+            me->SetPowerType(POWER_MANA);\n+        }\n+\n+        void InitSpells() override\n+        {\n+            uint8 lvl = me->GetLevel();\n+            bool isElem = GetSpec() == BOT_SPEC_SHAMAN_ELEMENTAL;\n+            bool isEnha = GetSpec() == BOT_SPEC_SHAMAN_ENHANCEMENT;\n+            bool isRest = GetSpec() == BOT_SPEC_SHAMAN_RESTORATION;\n+\n+            InitSpellMap(HEALING_WAVE_1);\n+            InitSpellMap(CHAIN_HEAL_1);\n+            InitSpellMap(LESSER_HEALING_WAVE_1);\n+            InitSpellMap(ANCESTRAL_SPIRIT_1);\n+            InitSpellMap(CURE_TOXINS_1);\n+            InitSpellMap(FLAME_SHOCK_1);\n+            InitSpellMap(EARTH_SHOCK_1);\n+            InitSpellMap(FROST_SHOCK_1);\n+            InitSpellMap(LIGHTNING_BOLT_1);\n+            InitSpellMap(CHAIN_LIGHTNING_1);\n+            InitSpellMap(LAVA_BURST_1);\n+            InitSpellMap(LIGHTNING_SHIELD_1);\n+            InitSpellMap(WATER_SHIELD_1);\n+            InitSpellMap(WATER_BREATHING_1);\n+            InitSpellMap(WATER_WALKING_1);\n+            InitSpellMap(PURGE_1);\n+            InitSpellMap(WIND_SHEAR_1);\n+            InitSpellMap(HEX_1);\n+            InitSpellMap((me->GetRaceMask() & RACEMASK_ALLIANCE) ? HEROISM_1 : BLOODLUST_1); //at least race is constant\n+\n+            InitSpellMap(GHOST_WOLF_1);\n+\n+            InitSpellMap(FIRE_NOVA_1);\n+            //totems\n+            InitSpellMap(EARTHBIND_TOTEM_1);\n+            InitSpellMap(MAGMA_TOTEM_1);\n+            //InitSpellMap(SEARING_TOTEM_1);\n+            //InitSpellMap(STONECLAW_TOTEM_1);\n+            InitSpellMap(FIRE_ELEMENTAL_TOTEM_1);\n+            InitSpellMap(EARTH_ELEMENTAL_TOTEM_1);\n+            InitSpellMap(FIRE_RESISTANCE_TOTEM_1);\n+            InitSpellMap(FROST_RESISTANCE_TOTEM_1);\n+            InitSpellMap(NATURE_RESISTANCE_TOTEM_1);\n+            InitSpellMap(FLAMETONGUE_TOTEM_1);\n+            InitSpellMap(GROUNDING_TOTEM_1);\n+            //InitSpellMap(SENTRY_TOTEM_1);\n+            //InitSpellMap(STONESKIN_TOTEM_1);\n+            InitSpellMap(STRENGTH_OF_EARTH_TOTEM_1);\n+            InitSpellMap(WINDFURY_TOTEM_1);\n+            InitSpellMap(WRATH_OF_AIR_TOTEM_1);\n+            InitSpellMap(CLEANSING_TOTEM_1);\n+            //InitSpellMap(HEALING_STREAM_TOTEM_1);\n+            InitSpellMap(MANA_SPRING_TOTEM_1);\n+            InitSpellMap(TREMOR_TOTEM_1);\n+\n+            InitSpellMap(TOTEMIC_RECALL_1);\n+\n+            InitSpellMap(REINCARNATION_1); //base lvl 30, 30 min cd\n+\n+  /*Talent*///lvl >= 40 && isElem ? InitSpellMap(ELEMENTAL_MASTERY_1) : RemoveSpell(ELEMENTAL_MASTERY_1);\n+  /*Talent*/lvl >= 60 && isElem ? InitSpellMap(THUNDERSTORM_1) : RemoveSpell(THUNDERSTORM_1);\n+\n+  /*Talent*/lvl >= 40 && isEnha ? InitSpellMap(STORMSTRIKE_1) : RemoveSpell(STORMSTRIKE_1);\n+  /*Talent*/lvl >= 50 && isEnha ? InitSpellMap(SHAMANISTIC_RAGE_1) : RemoveSpell(SHAMANISTIC_RAGE_1);\n+  /*Talent*/lvl >= 60 && isEnha ? InitSpellMap(FERAL_SPIRIT_1) : RemoveSpell(FERAL_SPIRIT_1); //not casted\n+\n+  /*Talent*/lvl >= 20 && isRest ? InitSpellMap(TIDAL_FORCE_1) : RemoveSpell(TIDAL_FORCE_1);\n+  /*Talent*/lvl >= 30 && isRest ? InitSpellMap(NATURES_SWIFTNESS_1) : RemoveSpell(NATURES_SWIFTNESS_1);\n+  /*Talent*/lvl >= 50 && isRest ? InitSpellMap(EARTH_SHIELD_1) : RemoveSpell(EARTH_SHIELD_1);\n+  /*Talent*/lvl >= 60 && isRest ? InitSpellMap(RIPTIDE_1) : RemoveSpell(RIPTIDE_1);\n+\n+  /*Talent*/lvl >= 50 && isElem ? InitSpellMap(TOTEM_OF_WRATH_1) : RemoveSpell(TOTEM_OF_WRATH_1);\n+\n+  /*Talent*/lvl >= 40 && isRest ? InitSpellMap(MANA_TIDE_TOTEM_1) : RemoveSpell(MANA_TIDE_TOTEM_1);\n+\n+            CURE_TOXINS = InitSpell(me, CLEANSE_SPIRIT_1) ? CLEANSE_SPIRIT_1 : CURE_TOXINS_1;\n+            RemoveSpell(CLEANSE_SPIRIT_1);\n+            RemoveSpell(CURE_TOXINS_1);\n+            InitSpellMap(CURE_TOXINS);\n+\n+            //InitSpellMap(ROCKBITER_WEAPON_1); //lvl 1\n+            InitSpellMap(FLAMETONGUE_WEAPON_1); //lvl 10\n+            InitSpellMap(FROSTBRAND_WEAPON_1); //lvl 20\n+            InitSpellMap(WINDFURY_WEAPON_1); //lvl 30\n+            InitSpellMap(EARTHLIVING_WEAPON_1); //lvl 30\n+        }\n+\n+        void ApplyClassPassives() const override\n+        {\n+            uint8 level = master->GetLevel();\n+            bool isElem = GetSpec() == BOT_SPEC_SHAMAN_ELEMENTAL;\n+            bool isEnha = GetSpec() == BOT_SPEC_SHAMAN_ENHANCEMENT;\n+            bool isRest = GetSpec() == BOT_SPEC_SHAMAN_RESTORATION;\n+\n+            RefreshAura(ELEMENTAL_DEVASTATION3, isEnha && level >= 18 ? 1 : 0);\n+            RefreshAura(ELEMENTAL_DEVASTATION2, isEnha && level >= 15 && level < 18 ? 1 : 0);\n+            RefreshAura(ELEMENTAL_DEVASTATION1, isEnha && level >= 12 && level < 15 ? 1 : 0);\n+            RefreshAura(ELEMENTAL_FOCUS, isElem && level >= 20 ? 1 : 0);\n+            RefreshAura(ELEMENTAL_OATH, !IAmFree() && isElem && level >= 40 ? 1 : 0);\n+            //RefreshAura(STORM_EARTH_AND_FIRE, isElem && level >= 45 ? 1 : 0);\n+\n+            RefreshAura(TOUGHNESS, level >= 25 ? 1 : 0);\n+            RefreshAura(FLURRY5, isEnha && level >= 29 ? 1 : 0);\n+            RefreshAura(FLURRY4, isEnha && level >= 28 && level < 29 ? 1 : 0);\n+            RefreshAura(FLURRY3, isEnha && level >= 27 && level < 28 ? 1 : 0);\n+            RefreshAura(FLURRY2, isEnha && level >= 26 && level < 27 ? 1 : 0);\n+            RefreshAura(FLURRY1, isEnha && level >= 25 && level < 26 ? 1 : 0);\n+            RefreshAura(WEAPON_MASTERY, isEnha && level >= 30 ? 1 : 0);\n+            RefreshAura(UNLEASHED_RAGE, !IAmFree() && isEnha && level >= 35 ? 1 : 0);\n+            RefreshAura(IMPROVED_STORMSTRIKE, isEnha && level >= 40 ? 1 : 0);\n+            RefreshAura(STATIC_SHOCK, isEnha && level >= 41 ? 1 : 0);\n+            RefreshAura(EARTHEN_POWER, isEnha && level >= 50 ? 1 : 0);\n+            RefreshAura(MAELSTROM_WEAPON5, isEnha && level >= 59 ? 1 : 0);\n+            RefreshAura(MAELSTROM_WEAPON4, isEnha && level >= 58 && level < 59 ? 1 : 0);\n+            RefreshAura(MAELSTROM_WEAPON3, isEnha && level >= 57 && level < 58 ? 1 : 0);\n+            RefreshAura(MAELSTROM_WEAPON2, isEnha && level >= 56 && level < 57 ? 1 : 0);\n+            RefreshAura(MAELSTROM_WEAPON1, isEnha && level >= 55 && level < 56 ? 1 : 0);\n+\n+            RefreshAura(IMPROVED_WATER_SHIELD, isRest && level >= 20 ? 1 : 0);\n+            RefreshAura(ANCESTRAL_HEALING, isRest && level >= 20 ? 1 : 0);\n+            RefreshAura(ANCESTRAL_AWAKENING, isRest && level >= 50 ? 1 : 0);\n+            RefreshAura(TIDAL_WAVES, isRest && level >= 55 ? 1 : 0);\n+\n+            RefreshAura(SHAMAN_FLAME_SHOCK_PASSIVE);\n+\n+            RefreshAura(SHAMAN_T10_RESTO_4P, level >= 70 ? 1 : 0);\n+\n+            RefreshAura(GLYPH_THUNDERSTORM, GetSpell(THUNDERSTORM_1) ? 1 : 0);\n+            RefreshAura(GLYPH_TOTEM_OF_WRATH, GetSpell(TOTEM_OF_WRATH_1) ? 1 : 0);\n+        }\n+\n+        bool CanUseManually(uint32 basespell) const override\n+        {\n+            switch (basespell)\n+            {\n+                case HEALING_WAVE_1:\n+                case CHAIN_HEAL_1:\n+                case LESSER_HEALING_WAVE_1:\n+                case RIPTIDE_1:\n+                case CLEANSE_SPIRIT_1:\n+                case WATER_WALKING_1:\n+                case WATER_BREATHING_1:\n+                case BLOODLUST_1:\n+                case HEROISM_1:\n+                case SHAMANISTIC_RAGE_1:\n+                //case ELEMENTAL_MASTERY_1:\n+                case TIDAL_FORCE_1:\n+                //Totems\n+                //case EARTHBIND_TOTEM_1:\n+                //case MAGMA_TOTEM_1:\n+                //case SEARING_TOTEM_1:\n+                //case STONECLAW_TOTEM_1:\n+                //case FIRE_ELEMENTAL_TOTEM_1:\n+                //case EARTH_ELEMENTAL_TOTEM_1:\n+                //case FIRE_RESISTANCE_TOTEM_1:\n+                //case FROST_RESISTANCE_TOTEM_1:\n+                //case NATURE_RESISTANCE_TOTEM_1:\n+                //case FLAMETONGUE_TOTEM_1:\n+                case GROUNDING_TOTEM_1:\n+                //case SENTRY_TOTEM_1:\n+                //case STONESKIN_TOTEM_1:\n+                //case STRENGTH_OF_EARTH_TOTEM_1:\n+                //case WINDFURY_TOTEM_1:\n+                //case WRATH_OF_AIR_TOTEM_1:\n+                case CLEANSING_TOTEM_1:\n+                //case HEALING_STREAM_TOTEM_1:\n+                //case MANA_SPRING_TOTEM_1:\n+                //case TOTEM_OF_WRATH_1:\n+                case MANA_TIDE_TOTEM_1:\n+                case TREMOR_TOTEM_1:\n+                case TOTEMIC_RECALL_1:\n+                    return true;\n+                case CURE_TOXINS_1:\n+                    return !GetSpell(CLEANSE_SPIRIT_1);\n+                case FIRE_NOVA_1:\n+                    return _totems[T_FIRE].second._type != BOT_TOTEM_NONE;\n+                default:\n+                    return false;\n+            }\n+        }\n+\n+        bool HasAbilitiesSpecifics() const override { return true; }\n+        void FillAbilitiesSpecifics(Player const* player, std::list<std::string> &specList) override\n+        {\n+            uint32 textId1, textId2;\n+            switch (mhEnchant)\n+            {\n+                //case ROCKBITER_WEAPON_1:   textId1 = BOT_TEXT_\"Rockbiter\";  break;\n+                case FLAMETONGUE_WEAPON_1: textId1 = BOT_TEXT_FLAMETONGUE;  break;\n+                case FROSTBRAND_WEAPON_1:  textId1 = BOT_TEXT_FROSTBRAND;   break;\n+                case WINDFURY_WEAPON_1:    textId1 = BOT_TEXT_WINDFURY;     break;\n+                case EARTHLIVING_WEAPON_1: textId1 = BOT_TEXT_EARTHLIVING;  break;\n+                default:                   textId1 = BOT_TEXT_NOTHING_C;    break;\n+            }\n+            switch (ohEnchant)\n+            {\n+                //case ROCKBITER_WEAPON_1:   textId2 = BOT_TEXT_\"Rockbiter\";  break;\n+                case FLAMETONGUE_WEAPON_1: textId2 = BOT_TEXT_FLAMETONGUE;  break;\n+                case FROSTBRAND_WEAPON_1:  textId2 = BOT_TEXT_FROSTBRAND;   break;\n+                case WINDFURY_WEAPON_1:    textId2 = BOT_TEXT_WINDFURY;     break;\n+                case EARTHLIVING_WEAPON_1: textId2 = BOT_TEXT_EARTHLIVING;  break;\n+                default:                   textId2 = BOT_TEXT_NOTHING_C;    break;\n+            }\n+            specList.push_back(LocalizedNpcText(player, BOT_TEXT_SLOT_MH) + \": \" + LocalizedNpcText(player, textId1));\n+            specList.push_back(LocalizedNpcText(player, BOT_TEXT_SLOT_OH) + \": \" + LocalizedNpcText(player, textId2));\n+        }\n+\n+        std::vector<uint32> const* GetDamagingSpellsList() const override\n+        {\n+            return &Shaman_spells_damage;\n+        }\n+        std::vector<uint32> const* GetCCSpellsList() const override\n+        {\n+            return &Shaman_spells_cc;\n+        }\n+        std::vector<uint32> const* GetHealingSpellsList() const override\n+        {\n+            return &Shaman_spells_heal;\n+        }\n+        std::vector<uint32> const* GetSupportSpellsList() const override\n+        {\n+            return &Shaman_spells_support;\n+        }\n+\n+        void InitHeals() override\n+        {\n+            SpellInfo const* spellInfo;\n+            if (InitSpell(me, HEALING_WAVE_1))\n+            {\n+                spellInfo = sSpellMgr->GetSpellInfo(InitSpell(me, HEALING_WAVE_1));\n+                _heals[HEALING_WAVE_1] = me->SpellHealingBonusDone(me, spellInfo, spellInfo->_effects[0].CalcValue(me), HEAL, spellInfo->GetEffect(EFFECT_0), {});\n+            }\n+            else\n+                _heals[HEALING_WAVE_1] = 0;\n+\n+            if (InitSpell(me, LESSER_HEALING_WAVE_1))\n+            {\n+                spellInfo = sSpellMgr->GetSpellInfo(InitSpell(me, LESSER_HEALING_WAVE_1));\n+                _heals[LESSER_HEALING_WAVE_1] = me->SpellHealingBonusDone(me, spellInfo, spellInfo->_effects[0].CalcValue(me), HEAL, spellInfo->GetEffect(EFFECT_0), {});\n+            }\n+            else\n+                _heals[LESSER_HEALING_WAVE_1] = 0;\n+\n+            if (InitSpell(me, RIPTIDE_1))\n+            {\n+                spellInfo = sSpellMgr->GetSpellInfo(InitSpell(me, RIPTIDE_1));\n+                _heals[RIPTIDE_1] = me->SpellHealingBonusDone(me, spellInfo, spellInfo->_effects[0].CalcValue(me), HEAL, spellInfo->GetEffect(EFFECT_0), {});\n+            }\n+            else\n+                _heals[RIPTIDE_1] = 0;\n+\n+            if (InitSpell(me, CHAIN_HEAL_1))\n+            {\n+                spellInfo = sSpellMgr->GetSpellInfo(InitSpell(me, CHAIN_HEAL_1));\n+                _heals[CHAIN_HEAL_1] = me->SpellHealingBonusDone(me, spellInfo, spellInfo->_effects[0].CalcValue(me), HEAL, spellInfo->GetEffect(EFFECT_0), {});\n+            }\n+            else\n+                _heals[CHAIN_HEAL_1] = 0;\n+        }\n+\n+    private:\n+        //Totem system\n+        struct BotTotemParam\n+        {\n+            BotTotemParam() : _effradius(0.f) {}\n+            uint32 _type;\n+            Position _pos;\n+            float _effradius;\n+        };\n+\n+        using BotTotem = std::pair<ObjectGuid /*guid*/, BotTotemParam /*param*/>;\n+        std::array<BotTotem, MAX_TOTEMS> _totems;\n+        std::array<uint32, MAX_TOTEMS> _totemTimer;\n+        //Wolves\n+        std::array<ObjectGuid, MAX_WOLVES> _wolves;\n+        //Spells\n+        uint32 CURE_TOXINS;\n+        //Timers\n+        uint32 TotemsCheckTimer;\n+        uint32 HexyCheckTimer, EarthyCheckTimer, ShieldCheckTimer, BloodlustCheckTimer, MaelstromTimer;\n+        uint8 MaelstromCount;\n+        bool Hexy, Earthy;\n+        mutable bool maelUseUp;\n+        uint32 mhEnchantExpireTimer, ohEnchantExpireTimer;\n+        uint32 mhEnchant, ohEnchant;\n+        bool needChooseMHEnchant, needChooseOHEnchant;\n+\n+        bool canTremor;\n+\n+        using HealMap = std::unordered_map<uint32 /*baseId*/, int32 /*amount*/>;\n+        HealMap _heals;\n+\n+        uint32 _getTotemsMask(std::map<uint32 /*type*/, uint32 /*curId*/>& idMap) const\n+        {\n+            uint32 mask = 0;\n+\n+            Unit* cre;\n+            uint32 sumonSpell;\n+            uint32 baseId;\n+            bool isTotem;\n+            int8 mytype = -1;\n+            for (auto const& [_, auraApp] : me->GetAppliedAuras())\n+            {\n+                //from totem aura extract base spell it could be summoned by\n+                if (auraApp->GetBase()->GetType() != UNIT_AURA_TYPE) continue;\n+                cre = auraApp->GetBase()->GetUnitOwner();\n+                //DEBUG\n+                //uint32 base = cre->GetUInt32Value(UNIT_CREATED_BY_SPELL);\n+                //if (base)\n+                //    baseId = sSpellMgr->GetSpellInfo(base)->GetFirstRankSpell()->Id;\n+                //if (target->GetEntry() == 70025 && cre->GetGUID() != me->GetGUID())\n+                //{\n+                //    BOT_LOG_ERROR(\"spells\",\"totemMask: unit {}, {} ({}), owner {} (crSp {}, base {}), istotem {}\", target->GetName(),\n+                //        itr->second->GetBase()->GetSpellInfo()->SpellName[0], itr->second->GetBase()->GetId(),\n+                //        cre ? cre->GetName() : \"unk\", base, baseId, uint32(cre->IsTotem()));\n+                //}\n+                sumonSpell = cre ? cre->GetUInt32Value(UNIT_CREATED_BY_SPELL) : 0;\n+                if (!sumonSpell || !cre->IsTotem())\n+                    continue;\n+\n+                isTotem = true;\n+                baseId = sSpellMgr->GetSpellInfo(sumonSpell)->GetFirstRankSpell()->Id;\n+                switch (baseId)\n+                {\n+                    case FIRE_RESISTANCE_TOTEM_1:\n+                        mask |= BOT_TOTEM_MASK_RESISTANCE_FIRE;     mytype = T_WATER;   break;\n+                    case FROST_RESISTANCE_TOTEM_1:\n+                        mask |= BOT_TOTEM_MASK_RESISTANCE_FROST;    mytype = T_FIRE;    break;\n+                    case NATURE_RESISTANCE_TOTEM_1:\n+                        mask |= BOT_TOTEM_MASK_RESISTANCE_NATURE;   mytype = T_AIR;     break;\n+                    case FLAMETONGUE_TOTEM_1:\n+                        mask |= BOT_TOTEM_MASK_FLAMETONGUE;         mytype = T_FIRE;    break;\n+                    case GROUNDING_TOTEM_1: //no ranking\n+                        mask |= BOT_TOTEM_MASK_GROUNDING;           mytype = T_AIR;     break;\n+                    //case STONESKIN_TOTEM_1:\n+                    //    mask |= BOT_TOTEM_MASK_STONESKIN;           mytype = T_EARTH;   break;\n+                    case STRENGTH_OF_EARTH_TOTEM_1:\n+                        mask |= BOT_TOTEM_MASK_STRENGTH_OF_EARTH;   mytype = T_EARTH;   break;\n+                    case WINDFURY_TOTEM_1: //no ranking\n+                        mask |= BOT_TOTEM_MASK_WINDFURY;            mytype = T_AIR;     break;\n+                    case WRATH_OF_AIR_TOTEM_1: //no ranking\n+                        mask |= BOT_TOTEM_MASK_WRATH_OF_AIR;        mytype = T_AIR;     break;\n+                    case MANA_SPRING_TOTEM_1:\n+                        mask |= BOT_TOTEM_MASK_MANA_SPRING;         mytype = T_WATER;   break;\n+                    case TOTEM_OF_WRATH_1:\n+                        mask |= BOT_TOTEM_MASK_WRATH;               mytype = T_FIRE;    break;\n+                    default:\n+                        isTotem = false; //next aura\n+                        break;\n+                }\n+\n+                if (isTotem)\n+                {\n+                    idMap[baseId] = sumonSpell;\n+                    for (auto i : NPCBots::index_array<uint8, MAX_TOTEMS>)\n+                    {\n+                        if (auraApp->GetBase()->GetCasterGUID() == me->m_SummonSlot[i+1])\n+                        {\n+                            //mask |= BOT_TOTEM_MASK_MY_TOTEM;\n+                            switch (mytype)\n+                            {\n+                                case T_FIRE:    mask |= BOT_TOTEM_MASK_MY_TOTEM_FIRE;   break;\n+                                case T_EARTH:   mask |= BOT_TOTEM_MASK_MY_TOTEM_EARTH;  break;\n+                                case T_WATER:   mask |= BOT_TOTEM_MASK_MY_TOTEM_WATER;  break;\n+                                case T_AIR:     mask |= BOT_TOTEM_MASK_MY_TOTEM_AIR;    break;\n+                                default:                                                break;\n+                            }\n+                            break;\n+                        }\n+                    }\n+                }\n+            }\n+\n+            return mask;\n+        }\n+    };\n+};\n+\n+void AddSC_shaman_bot()\n+{\n+    new shaman_bot();\n+}\ndiff --git a/src/server/game/AI/NpcBots/bot_spellbreaker_ai.cpp b/src/server/game/AI/NpcBots/bot_spellbreaker_ai.cpp\nnew file mode 100644\nindex 0000000000..af0ad00a56\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bot_spellbreaker_ai.cpp\n@@ -0,0 +1,605 @@\n+#include \"bot_ai.h\"\n+#include \"bot_GridNotifiers.h\"\n+#include \"botlogtraits.h\"\n+#include \"botspell.h\"\n+#include \"Containers.h\"\n+#include \"Creature.h\"\n+//#include \"GridNotifiers.h\"\n+#include \"ScriptMgr.h\"\n+#include \"SpellAuraEffects.h\"\n+/*\n+Spell Breaker NpcBot (by Trickerer onlysuffering@gmail.com)\n+Description:\n+Spellbreaker (Warcraft III tribute)\n+Abilities:\n+1) Steal Magic (Spellsteal). steals a benefical spell from an enemy and applies it to a nearby ally or removes a\n+negative spell from an ally and applies it to a nearby enemy, affects magic and curse effects, 3 seconds cooldown.\n+2) Control Magic NIY (no substitute for spell)\n+3) Feedback (passive). Successful melee attacks burn target's mana equal to damage caused, dealing arcane damage\n+Complete - 67%\n+TODO:\n+*/\n+\n+enum SpellbreakerBaseSpells\n+{\n+    SPELLSTEAL_1            = SPELL_STEAL_MAGIC\n+};\n+enum SpellbreakerPassives\n+{\n+};\n+enum SpellbreakerSpecial\n+{\n+    SPELLSTEAL_COST         = 75 * 5,\n+\n+    FEEDBACK_EFFECT         = SPELL_FEEDBACK,\n+\n+    MH_ATTACK_VISUAL        = SPELL_ATTACK_MELEE_1H,\n+    SPELLSTEAL_VISUAL_1     = 34396,// Zap selfcast\n+    SPELLSTEAL_VISUAL_2     = SPELL_STEAL_MAGIC_VISUAL,\n+    ENERGY_SYPHON_ENERGIZE  = 27287 // Only for combat log spell message\n+};\n+\n+static const std::vector<uint32> Spellbreaker_spells_support{ SPELLSTEAL_1 };\n+\n+class spellbreaker_bot : public CreatureScript\n+{\n+public:\n+    spellbreaker_bot() : CreatureScript(\"spellbreaker_bot\") { }\n+\n+    CreatureAI* GetAI(Creature* creature) const override\n+    {\n+        return new spellbreaker_botAI(creature);\n+    }\n+/*\n+    bool OnGossipHello(Player* player, Creature* creature)\n+    {\n+        return creature->GetBotAI()->OnGossipHello(player, 0);\n+    }\n+\n+    bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action)\n+    {\n+        if (bot_ai* ai = creature->GetBotAI())\n+            return ai->OnGossipSelect(player, creature, sender, action);\n+        return true;\n+    }\n+\n+    bool OnGossipSelectCode(Player* player, Creature* creature, uint32 sender, uint32 action, char const* code)\n+    {\n+        if (bot_ai* ai = creature->GetBotAI())\n+            return ai->OnGossipSelectCode(player, creature, sender, action, code);\n+        return true;\n+    }\n+*/\n+    struct spellbreaker_botAI : public bot_ai\n+    {\n+        spellbreaker_botAI(Creature* creature) : bot_ai(creature)\n+        {\n+            _botclass = BOT_CLASS_SPELLBREAKER;\n+\n+            InitUnitFlags();\n+\n+            //spellbreaker immunities\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_POSSESS, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_CHARM, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_SHAPESHIFT, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_TRANSFORM, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_DISARM, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_DISARM_OFFHAND, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_FEAR, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_DISARM, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_POLYMORPH, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_FEAR, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_HORROR, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_TURN, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SLEEP, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SILENCE, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SNARE, true);\n+        }\n+\n+        bool doCast(Unit* victim, uint32 spellId)\n+        {\n+            if (CheckBotCast(victim, spellId) != SPELL_CAST_OK)\n+                return false;\n+            return bot_ai::doCast(victim, spellId);\n+        }\n+\n+        void StartAttack(Unit* u, bool force = false)\n+        {\n+            if (!bot_ai::StartAttack(u, force))\n+                return;\n+            GetInPosition(force, u);\n+        }\n+\n+        void JustEnteredCombat(Unit* u) override { bot_ai::JustEnteredCombat(u); }\n+        void KilledUnit(Unit* u) override { bot_ai::KilledUnit(u); }\n+        void EnterEvadeMode(EvadeReason why = EVADE_REASON_OTHER) override { bot_ai::EnterEvadeMode(why); }\n+        void MoveInLineOfSight(Unit* u) override { bot_ai::MoveInLineOfSight(u); }\n+        void JustDied(Unit* u) override { /*UnsummonAll(false);*/ bot_ai::JustDied(u); }\n+        void DoNonCombatActions(uint32 /*diff*/) { }\n+\n+        void UpdateAI(uint32 diff) override\n+        {\n+            if (!GlobalUpdate(diff))\n+                return;\n+\n+            DoVehicleActions(diff);\n+            if (!CanBotAttackOnVehicle())\n+                return;\n+\n+            if (IsPotionReady())\n+            {\n+                if (me->GetPower(POWER_MANA) < SPELLSTEAL_COST)\n+                    DrinkPotion(true);\n+                else if (GetHealthPCT(me) < 50)\n+                    DrinkPotion(false);\n+            }\n+\n+            if ((me->GetVictim() || Rand() < 15) && IsSpellReady(SPELLSTEAL_1, diff))\n+                CureGroup(GetSpell(SPELLSTEAL_1), diff);\n+\n+            if (master->IsInCombat() || me->IsInCombat())\n+                CheckDispel(diff);\n+\n+            if (ProcessImmediateNonAttackTarget())\n+                return;\n+\n+            if (!CheckAttackTarget())\n+                return;\n+\n+            if (IsCasting())\n+                return;\n+\n+            CheckUsableItems(diff);\n+\n+            Attack(diff);\n+        }\n+\n+        void Attack(uint32 /*diff*/)\n+        {\n+            Unit* mytar = opponent ? opponent : disttarget ? disttarget : nullptr;\n+            if (!mytar)\n+                return;\n+\n+            StartAttack(mytar, IsMelee());\n+\n+            CheckAttackState();\n+            if (!me->IsAlive() || !mytar->IsAlive())\n+                return;\n+\n+            MoveBehind(mytar);\n+        }\n+\n+        void CheckDispel(uint32 diff)\n+        {\n+            if (!IsSpellReady(SPELLSTEAL_1, diff) || IsCasting())\n+                return;\n+\n+            Unit* target = FindHostileDispelTarget(CalcSpellMaxRange(SPELLSTEAL_1));\n+            if (target && doCast(target, GetSpell(SPELLSTEAL_1)))\n+                return;\n+\n+            SetSpellCooldown(SPELLSTEAL_1, 500); //fail\n+        }\n+\n+        void ApplyClassDamageMultiplierMelee(uint32& /*damage*/, CalcDamageInfo& damageinfo) const override\n+        {\n+            float pctbonus = 1.0f;\n+\n+            if (damageinfo.Target && damageinfo.Target->GetPowerType() == POWER_MANA && damageinfo.Target->GetMaxPower(POWER_MANA) > 1 &&\n+                damageinfo.Target->GetPower(POWER_MANA) < me->GetWeaponDamageRange(BASE_ATTACK, MAXDAMAGE))\n+            {\n+                pctbonus *= 3.f;\n+                if (_doCrit == false && urand(1,100) < 2 * GetBotCritChance())\n+                    _doCrit = true;\n+            }\n+            else if (_doCrit == true)\n+                _doCrit = false;\n+\n+            damageinfo.Damages[0].Damage *= pctbonus;\n+        }\n+\n+        void ApplyClassEffectMods(SpellInfo const* spellInfo, uint8 effIndex, float& value) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            float pctbonus = 1.0f;\n+\n+            //Feedback scaling: 50%\n+            if (baseId == FEEDBACK_EFFECT && effIndex == EFFECT_0)\n+                value += me->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_MAGIC) * 0.5f * me->CalculateDefaultCoefficient(spellInfo, SPELL_DIRECT_DAMAGE) * me->CalculateSpellpowerCoefficientLevelPenalty(spellInfo);\n+\n+            value = value * pctbonus;\n+        }\n+\n+        MeleeHitOutcome GetNextAttackMeleeOutCome() const override\n+        {\n+            return _doCrit ? MELEE_HIT_CRIT : bot_ai::GetNextAttackMeleeOutCome();\n+        }\n+\n+        void OnClassSpellGo(SpellInfo const* spellInfo) override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+\n+            if (baseId == FEEDBACK_EFFECT)\n+                me->CastSpell(me, MH_ATTACK_VISUAL, true);\n+        }\n+\n+        void SpellHitTarget(WorldObject* wtarget, SpellInfo const* spell) override\n+        {\n+            Unit* target = wtarget->ToUnit();\n+            if (!target)\n+                return;\n+\n+            uint32 baseId = spell->GetFirstRankSpell()->Id;\n+\n+            if (baseId == SPELLSTEAL_1)\n+                ProcessSpellsteal(target);\n+\n+            OnSpellHitTarget(target, spell);\n+        }\n+\n+        void SpellHit(WorldObject* wcaster, SpellInfo const* spell) override\n+        {\n+            Unit* caster = wcaster->ToUnit();\n+            if (!caster)\n+                return;\n+\n+            OnSpellHit(caster, spell);\n+        }\n+\n+        void DamageDealt(Unit* victim, uint32& damage, DamageEffectType damageType) override\n+        {\n+            //Feedback\n+            if (damage && victim != me && damageType == DIRECT_DAMAGE)\n+            {\n+                if (victim->GetPowerType() == POWER_MANA && victim->GetMaxPower(POWER_MANA) > 1)\n+                {\n+                    if (uint32 burned = std::min<uint32>(victim->GetPower(POWER_MANA), damage + me->GetLevel() * 2))\n+                    {\n+                        int32 basepoints = int32(burned);\n+                        //reduce amount againts ex bots\n+                        if (victim->IsCreature() && victim->ToCreature()->GetBotClass() >= BOT_CLASS_EX_START)\n+                            basepoints /= 10;\n+\n+                        CastSpellExtraArgs args(true);\n+                        args.AddSpellBP0(basepoints);\n+                        me->CastSpell(victim, FEEDBACK_EFFECT, args);\n+                    }\n+                }\n+                else\n+                {\n+                    me->EnergizeBySpell(me, ENERGY_SYPHON_ENERGIZE, int32(damage / 4), POWER_MANA);\n+                    me->SendPlaySpellVisualKit(1, 524); //mana gain visual\n+                }\n+            }\n+\n+            bot_ai::DamageDealt(victim, damage, damageType);\n+        }\n+\n+        void DamageTaken(Unit* u, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo*/) override\n+        {\n+            if (!u)\n+                return;\n+            if (!u->IsInCombat() && !me->IsInCombat())\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void OwnerAttackedBy(Unit* u) override\n+        {\n+            if (!u)\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void Reset() override\n+        {\n+            _doCrit = false;\n+\n+            DefaultInit();\n+        }\n+\n+        void ReduceCD(uint32 /*diff*/) override\n+        {\n+        }\n+\n+        void InitPowers() override\n+        {\n+            me->SetPowerType(POWER_MANA);\n+        }\n+\n+        void InitSpells() override\n+        {\n+            InitSpellMap(SPELLSTEAL_1, true, false);\n+        }\n+\n+        void ApplyClassPassives() const override\n+        {\n+        }\n+\n+        bool CanUseManually(uint32 basespell) const override\n+        {\n+            switch (basespell)\n+            {\n+                case SPELLSTEAL_1:\n+                    return true;\n+                default:\n+                    return false;\n+            }\n+        }\n+\n+        //std::vector<uint32> const* GetDamagingSpellsList() const override\n+        //{\n+        //    return &Spellbreaker_spells_damage;\n+        //}\n+        //std::vector<uint32> const* GetCCSpellsList() const override\n+        //{\n+        //    return &Spellbreaker_spells_cc;\n+        //}\n+        //std::vector<uint32> const* GetHealingSpellsList() const override\n+        //{\n+        //    return &Spellbreaker_spells_heal;\n+        //}\n+        std::vector<uint32> const* GetSupportSpellsList() const override\n+        {\n+            return &Spellbreaker_spells_support;\n+        }\n+\n+    private:\n+\n+        mutable bool _doCrit{};\n+\n+        void ProcessSpellsteal(Unit* target)\n+        {\n+            DispelChargesList steal_list;\n+\n+            bool const isFriend = IsInBotParty(target) || target->IsFriendlyTo(me);\n+            static const uint32 sbDispelMask  = (1u<<DISPEL_MAGIC) | (1u<<DISPEL_CURSE);\n+            static const uint8 max_dispelled = 1;\n+\n+            //BOT_LOG_ERROR(\"entities.unit\", \"ProcessSpellsteal: on {}, fr={}\", target->GetName(), uint32(isFriend));\n+\n+            for (auto const& [_, aura] : target->GetOwnedAuras())\n+            {\n+                if (aura->IsPassive() || !(aura->GetSpellInfo()->GetDispelMask() & sbDispelMask) ||\n+                    (aura->GetSpellInfo()->AttributesEx4 & SPELL_ATTR4_NOT_STEALABLE))\n+                    continue;\n+\n+                AuraApplication const* aurApp = aura->GetApplicationOfTarget(target->GetGUID());\n+                if (!aurApp)\n+                    continue;\n+\n+                //do not dispel positive auras from enemies and negative ones from friends\n+                if (aurApp->IsPositive() == isFriend)\n+                    continue;\n+\n+                int32 chance = aura->CalcDispelChance(target, !isFriend);\n+                if (!chance)\n+                    continue;\n+                //BOT_LOG_ERROR(\"entities.unit\", \"{}\", aura->GetSpellInfo()->SpellName[0]);\n+\n+                // The charges / stack amounts don't count towards the total number of auras that can be dispelled.\n+                // Ie: A dispel on a target with 5 stacks of Winters Chill and a Polymorph has 1 / (1 + 1) -> 50% chance to dispell\n+                // Polymorph instead of 1 / (5 + 1) -> 16%.\n+                bool dispel_charges = (aura->GetSpellInfo()->AttributesEx7 & SPELL_ATTR7_DISPEL_CHARGES);\n+                uint8 charges = dispel_charges ? aura->GetCharges() : aura->GetStackAmount();\n+                if (charges > 0)\n+                    steal_list.emplace_back(aura, chance, charges);\n+            }\n+\n+            if (steal_list.empty())\n+                return;\n+\n+            //BOT_LOG_ERROR(\"entities.unit\", \"failcount...\");\n+\n+            size_t remaining = steal_list.size();\n+            uint32 failCount = 0;\n+            DispelChargesList success_list;\n+            success_list.reserve(max_dispelled);\n+            WorldPacket dataFail(SMSG_DISPEL_FAILED, 8+8+4+4+max_dispelled*4);\n+            // dispel N = damage buffs (or while exist buffs for dispel)\n+            for (uint8 count = 0; count < max_dispelled && remaining > 0;)\n+            {\n+                // Random select buff for dispel\n+                DispelChargesList::iterator itr = steal_list.begin();\n+                std::advance(itr, urand(0, steal_list.size() - 1));\n+\n+                //int32 chance = itr->RollDispel();//itr->first->CalcDispelChance(target, !isFriend);\n+                // 2.4.3 Patch Notes: \"Dispel effects will no longer attempt to remove effects that have 100% dispel resistance.\"\n+                //if (!chance)\n+                //{\n+                //    steal_list.erase(itr);\n+                //    continue;\n+                //}\n+                //else\n+                bool chance = itr->RollDispel();\n+                {\n+                    if (chance/*roll_chance_i(chance)*/)\n+                    {\n+                        auto successItr = std::ranges::find_if(success_list, [&itr](DispelableAura& dispelAura) {\n+                            return dispelAura.GetAura()->GetId() == itr->GetAura()->GetId() && dispelAura.GetAura()->GetCaster() == itr->GetAura()->GetCaster();\n+                        });\n+\n+                        if (successItr == success_list.end())\n+                            success_list.emplace_back(itr->GetAura(), 0, 1);\n+                        else\n+                            successItr->IncrementCharges();\n+\n+                        if (!itr->DecrementCharge())\n+                        {\n+                            --remaining;\n+                            std::swap(*itr, steal_list[remaining]);\n+                        }\n+                        //success_list.push_back(std::make_pair(itr->first->GetId(), itr->first->GetCasterGUID()));\n+                        //--itr->second;\n+                        //if (itr->second <= 0)\n+                        //    steal_list.erase(itr);\n+                    }\n+                    else\n+                    {\n+                        if (!failCount)\n+                        {\n+                            // Failed to dispell\n+                            dataFail << me->GetGUID();                          // Caster GUID\n+                            dataFail << target->GetGUID();                      // Victim GUID\n+                            dataFail << uint32(SPELLSTEAL_1);                   // dispel spell id\n+                        }\n+                        ++failCount;\n+                        dataFail << uint32(itr->GetAura()->GetId());                // Spell Id\n+                    }\n+                    ++count;\n+                }\n+            }\n+\n+            if (failCount)\n+                me->SendMessageToSet(&dataFail, true);\n+\n+            if (success_list.empty())\n+                return;\n+\n+            //BOT_LOG_ERROR(\"entities.unit\", \"logs and auras\");\n+\n+            WorldPacket dataSuccess(SMSG_SPELLSTEALLOG, 8+8+4+1+4+max_dispelled*5);\n+            dataSuccess << target->GetPackGUID();           // Victim GUID\n+            dataSuccess << me->GetPackGUID();               // Caster GUID\n+            dataSuccess << uint32(SPELLSTEAL_1);            // dispel spell id\n+            dataSuccess << uint8(0);                        // not used\n+            dataSuccess << uint32(success_list.size());     // count\n+\n+            Unit* randomTarget = nullptr;\n+\n+            std::list<Unit*> targets;\n+\n+            if (isFriend) //negative spell from friend to enemy\n+            {\n+                GetNearbyTargetsList(targets, 50, 0);\n+                if (Unit* u = me->GetVictim())\n+                {\n+                    if (!u->GetVictim() && me->IsWithinDistInMap(u, 50) && !me->IsFriendlyTo(u) &&\n+                        me->IsValidAttackTarget(u) && u->GetCreatureType() != CREATURE_TYPE_CRITTER && !u->IsTotem() &&\n+                        me->CanSeeOrDetect(u))\n+                        targets.push_back(u);\n+                }\n+                //Bcore::AnyUnfriendlyAttackableVisibleUnitInObjectRangeCheck check(me, 50.f);\n+                //Bcore::UnitListSearcher<Bcore::AnyUnfriendlyAttackableVisibleUnitInObjectRangeCheck> searcher(me, targets, check);\n+                //me->VisitNearbyObject(50.f, searcher);\n+            }\n+            else\n+            {\n+                GetNearbyFriendlyTargetsList(targets, 50); //not self\n+                targets.push_back(me); //add self\n+            }\n+\n+            if (!targets.empty())\n+            {\n+                //if target has stealed aura we should skip him if possible\n+                std::list<Unit*> targetsCopy = targets;\n+                std::erase_if(targets, BOTAI_PRED::AuraedTargetExclude(success_list.front().GetAura()->GetId()));\n+\n+                randomTarget = Bcore::Containers::SelectRandomContainerElement(!targets.empty() ? targets : targetsCopy);\n+            }\n+\n+            for (DispelableAura const& daura : success_list)\n+            {\n+                Aura const* aura = daura.GetAura();\n+                dataSuccess << uint32(aura->GetId());          // Spell Id\n+                dataSuccess << uint8(0);                    // 0 - steals !=0 transfers\n+\n+                if (randomTarget)\n+                {\n+                    //target->RemoveAurasDueToSpellBySteal(itr->first, itr->second, randomTarget);\n+                    TransferAura(aura->GetId(), aura->GetCasterGUID(), target, randomTarget);\n+                    randomTarget->CastSpell(randomTarget, SPELLSTEAL_VISUAL_1, true);\n+                }\n+                else\n+                    target->RemoveAurasDueToSpellByDispel(aura->GetId(), SPELLSTEAL_1, aura->GetCasterGUID(), me, uint8(-1));\n+            }\n+            me->CastSpell(target, SPELLSTEAL_VISUAL_2, true);\n+\n+            me->SendMessageToSet(&dataSuccess, true);\n+        }\n+\n+        void TransferAura(uint32 spellId, ObjectGuid casterGUID, Unit* target, Unit* newTarget)\n+        {\n+            //Copied from Unit::RemoveAurasDueToSpellBySteal with modifications\n+            Unit::AuraMapBoundsNonConst range = target->GetOwnedAuras().equal_range(spellId);\n+            for (Unit::AuraMap::iterator iter = range.first; iter != range.second;)\n+            {\n+                Aura* aura = iter->second;\n+                if (aura->GetCasterGUID() == casterGUID)\n+                {\n+                    int32 damage[MAX_SPELL_EFFECTS];\n+                    int32 baseDamage[MAX_SPELL_EFFECTS];\n+                    uint8 effMask = 0;\n+                    uint8 recalculateMask = 0;\n+                    Unit* caster = aura->GetCaster();\n+                    for (auto i : NPCBots::index_array<uint8, MAX_SPELL_EFFECTS>)\n+                    {\n+                        if (aura->GetEffect(i))\n+                        {\n+                            baseDamage[i] = aura->GetEffect(i)->GetBaseAmount();\n+                            damage[i] = aura->GetEffect(i)->GetAmount();\n+                            effMask |= (1u<<i);\n+                            if (aura->GetEffect(i)->CanBeRecalculated())\n+                                recalculateMask |= (1u<<i);\n+                        }\n+                        else\n+                        {\n+                            baseDamage[i] = 0;\n+                            damage[i] = 0;\n+                        }\n+                    }\n+\n+                    bool stealCharge = (aura->GetSpellInfo()->AttributesEx7 & SPELL_ATTR7_DISPEL_CHARGES);\n+                    // Limit max duration to 5 minutes\n+                    int32 dur = std::min<int32>(int32(5 * MINUTE * IN_MILLISECONDS), aura->GetDuration());\n+                    // But at least for 5 seconds\n+                    dur = std::max<int32>(dur, 5 * IN_MILLISECONDS);\n+\n+                    if (Aura* oldAura = newTarget->GetAura(aura->GetId(), aura->GetCasterGUID()))\n+                    {\n+                        if (stealCharge)\n+                            oldAura->ModCharges(aura->GetCharges());\n+                        else\n+                            oldAura->ModStackAmount(aura->GetStackAmount());\n+                        oldAura->SetDuration(dur);\n+                    }\n+                    else\n+                    {\n+                        // single target state must be removed before aura creation to preserve existing single target aura\n+                        if (aura->IsSingleTarget())\n+                            aura->UnregisterSingleTarget();\n+\n+                        AuraCreateInfo createInfo(aura->GetSpellInfo(), effMask, newTarget);\n+                        createInfo.SetCasterGUID(aura->GetCasterGUID());\n+                        createInfo.SetBaseAmount(baseDamage);\n+                        //Auras created by scripts may have no caster, prevent crash in Aura::TryRefreshStackOrCreate()\n+                        if (!createInfo.CasterGUID)\n+                            createInfo.SetCasterGUID(me->GetGUID());\n+                        if (Aura* newAura = Aura::TryRefreshStackOrCreate(createInfo))\n+                        {\n+                            // created aura must not be single target aura,, so stealer won't loose it on recast\n+                            if (newAura->IsSingleTarget())\n+                            {\n+                                newAura->UnregisterSingleTarget();\n+                                aura->SetIsSingleTarget(true);\n+                                caster->GetSingleCastAuras().push_back(aura);\n+                            }\n+                            newAura->SetLoadedState(aura->GetMaxDuration(), dur, aura->GetCharges(), aura->GetStackAmount(), recalculateMask, aura->GetCritChance(), aura->CanApplyResilience(), &damage[0]);\n+                            newAura->ApplyForTargets();\n+                        }\n+                    }\n+\n+                    aura->Remove(AURA_REMOVE_BY_ENEMY_SPELL);\n+                    return;\n+                }\n+                else\n+                    ++iter;\n+            }\n+        }\n+    };\n+};\n+\n+void AddSC_spellbreaker_bot()\n+{\n+    new spellbreaker_bot();\n+}\ndiff --git a/src/server/game/AI/NpcBots/bot_sphynx_ai.cpp b/src/server/game/AI/NpcBots/bot_sphynx_ai.cpp\nnew file mode 100644\nindex 0000000000..0e8a9ea202\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bot_sphynx_ai.cpp\n@@ -0,0 +1,560 @@\n+#include \"bot_ai.h\"\n+#include \"bot_GridNotifiers.h\"\n+#include \"botmgr.h\"\n+#include \"botspell.h\"\n+#include \"bottraits.h\"\n+#include \"Containers.h\"\n+#include \"Creature.h\"\n+#include \"ScriptMgr.h\"\n+/*\n+Obsidian Destroyer NpcBot (by Trickerer onlysuffering@gmail.com)\n+Description:\n+Obsidian winged monstrocity with unsatable hunger for magic (Warcraft III tribute)\n+Specifics:\n+High armor, very high resistances, partially immune to magic, negative mana regeneration (-2%/sec, cannot be changed),\n+any armor, dual-wielding wands, no physical attack, spellpower = 50% attack power + 200% intellect\n+Abilities:\n+1) Devour Magic: dispel up to 2 magic effects from enemies, up to 2 magic effects and up to 2 curses from allies\n+and damaging summoned units in 20 yards area, every dispelled effect restores 20% mana and 5% health, 7 seconds cooldown\n+2) Shadow Bolt: main attack, single target, no mana cost\n+3) Shadow Blast: 125 mana empowered attack, splash damage (6.25% of base mana)\n+4) Shadow Armor (passive, custom): restores mana equal to a percentage of damage taken\n+5) Drain Mana: leech all mana from a friendly target (up to 100% of od's max mana)\n+6) Replenish Mana: restores 2% of max mana to up to 10 surrounding allies within 25yds at cost of all mana\n+7) Replenish Life: restores 3% of max hp to up to 10 surrounding allies within 25yds at cost of all mana\n+Complete - 100%\n+TODO:\n+*/\n+\n+enum SphynxBaseSpells\n+{\n+    MAIN_ATTACK_1           = SPELL_SHADOW_BOLT1,\n+    SPLASH_ATTACK_1         = SPELL_SHADOW_BLAST,\n+    DEVOUR_MAGIC_1          = SPELL_DEVOUR_MAGIC,\n+    DRAIN_MANA_1            = SPELL_DRAIN_MANA,\n+\n+    REPLENISH_MANA_1        = SPELL_REPLENISH_MANA,\n+    REPLENISH_HEALTH_1      = SPELL_REPLENISH_HEALTH\n+};\n+enum SphynxPassives\n+{\n+};\n+enum SphynxSpecial\n+{\n+    MH_ATTACK_ANIM          = SPELL_ATTACK_MELEE_1H,\n+    MH_OH_ATTACK_ANIM       = SPELL_ATTACK_MELEE_RANDOM,\n+    SPELL_ENERGIZE          = 34424,//\"Shadow Armor\"\n+\n+    SPLASH_ATTACK_COST      = BASE_MANA_SPHYNX/16//6.25%\n+};\n+\n+static const std::vector<uint32> Sphynx_spells_damage{ /*MAIN_ATTACK_1, */SPLASH_ATTACK_1 };\n+static const std::vector<uint32> Sphynx_spells_heal{ REPLENISH_HEALTH_1 };\n+static const std::vector<uint32> Sphynx_spells_support{ DEVOUR_MAGIC_1, /*DRAIN_MANA_1, */REPLENISH_HEALTH_1, REPLENISH_MANA_1 };\n+\n+class sphynx_bot : public CreatureScript\n+{\n+public:\n+    sphynx_bot() : CreatureScript(\"sphynx_bot\") { }\n+\n+    CreatureAI* GetAI(Creature* creature) const override\n+    {\n+        return new sphynx_botAI(creature);\n+    }\n+/*\n+    bool OnGossipHello(Player* player, Creature* creature)\n+    {\n+        return creature->GetBotAI()->OnGossipHello(player, 0);\n+    }\n+\n+    bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action)\n+    {\n+        if (bot_ai* ai = creature->GetBotAI())\n+            return ai->OnGossipSelect(player, creature, sender, action);\n+        return true;\n+    }\n+\n+    bool OnGossipSelectCode(Player* player, Creature* creature, uint32 sender, uint32 action, char const* code)\n+    {\n+        if (bot_ai* ai = creature->GetBotAI())\n+            return ai->OnGossipSelectCode(player, creature, sender, action, code);\n+        return true;\n+    }\n+*/\n+    struct sphynx_botAI : public bot_ai\n+    {\n+        sphynx_botAI(Creature* creature) : bot_ai(creature)\n+        {\n+            _botclass = BOT_CLASS_SPHYNX;\n+\n+            InitUnitFlags();\n+\n+            //sphynx immunities\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_POSSESS, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_CHARM, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_SILENCE, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_SHAPESHIFT, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_TRANSFORM, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_BLOCK_SPELL_FAMILY, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_DISARM, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_DISARM_OFFHAND, true);\n+            me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_FEAR, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_DISARM, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_BLEED, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_POLYMORPH, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_INFECTED, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_INTERRUPT, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_FEAR, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_HORROR, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_TURN, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SLEEP, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SILENCE, true);\n+            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SNARE, true);\n+            me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK, true);\n+            me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK_DEST, true);\n+        }\n+\n+        bool doCast(Unit* victim, uint32 spellId, bool triggered = false)\n+        {\n+            if (CheckBotCast(victim, spellId) != SPELL_CAST_OK)\n+                return false;\n+            return bot_ai::doCast(victim, spellId, triggered);\n+        }\n+\n+        void StartAttack(Unit* u, bool force = false)\n+        {\n+            if (!bot_ai::StartAttack(u, force))\n+                return;\n+            GetInPosition(force, u);\n+        }\n+\n+        void JustEnteredCombat(Unit* u) override { dmgReceived = 0; DraincheckTimer = 2000; bot_ai::JustEnteredCombat(u); }\n+        void KilledUnit(Unit* u) override { bot_ai::KilledUnit(u); }\n+        void EnterEvadeMode(EvadeReason why = EVADE_REASON_OTHER) override { bot_ai::EnterEvadeMode(why); }\n+        void MoveInLineOfSight(Unit* u) override { bot_ai::MoveInLineOfSight(u); }\n+        void JustDied(Unit* u) override { dmgReceived = 0; bot_ai::JustDied(u); }\n+        void DoNonCombatActions(uint32 /*diff*/) { }\n+\n+        void UpdateAI(uint32 diff) override\n+        {\n+            if (!GlobalUpdate(diff))\n+                return;\n+\n+            DoVehicleActions(diff);\n+            if (!CanBotAttackOnVehicle())\n+                return;\n+\n+            CheckDevourMagic(diff);\n+\n+            if (IsSpellReady(DEVOUR_MAGIC_1, diff))\n+                CureGroup(DEVOUR_MAGIC_1, diff);\n+\n+            //if (!me->IsInCombat())\n+            //    DoNonCombatActions(diff);\n+\n+            if (IsCasting())\n+                return;\n+\n+            CheckReplenishHealth(diff);\n+            CheckReplenishMana(diff);\n+\n+            if (ProcessImmediateNonAttackTarget())\n+                return;\n+\n+            if (!CheckAttackTarget())\n+                return;\n+\n+            CheckUsableItems(diff);\n+\n+            Attack(diff);\n+        }\n+\n+        void Attack(uint32 diff)\n+        {\n+            Unit* mytar = opponent ? opponent : disttarget ? disttarget : nullptr;\n+            if (!mytar)\n+                return;\n+\n+            StartAttack(mytar, IsMelee());\n+\n+            CheckAttackState();\n+            if (!me->IsAlive() || !mytar->IsAlive())\n+                return;\n+\n+            CheckDrainMana(diff);\n+\n+            MoveBehind(mytar);\n+\n+            if (!HasRole(BOT_ROLE_DPS))\n+                return;\n+\n+            if (GC_Timer > diff)\n+                return;\n+\n+            if (me->GetDistance(mytar) > 30)\n+                return;\n+\n+            if (me->isMoving() && !me->HasInArc(float(M_PI)/2, mytar))\n+                return;\n+\n+            if (!CanAffectVictimAny(mytar, SPELL_SCHOOL_SHADOW, SPELL_SCHOOL_ARCANE))\n+                return;\n+\n+            if (me->GetPower(POWER_MANA) >= SPLASH_ATTACK_COST && IsSpellReady(SPLASH_ATTACK_1, diff))\n+            {\n+                if (doCast(mytar, GetSpell(SPLASH_ATTACK_1)))\n+                    return;\n+            }\n+            else if (IsSpellReady(MAIN_ATTACK_1, diff))\n+            {\n+                if (doCast(mytar, GetSpell(MAIN_ATTACK_1)))\n+                    return;\n+            }\n+        }\n+\n+        void CheckDevourMagic(uint32 diff)\n+        {\n+            if (DevourcheckTimer > diff || !IsSpellReady(DEVOUR_MAGIC_1, diff, false) || IsCasting() ||\n+                (GetHealthPCT(me) > 75 && Rand() > 15 &&\n+                (!HasRole(BOT_ROLE_DPS) || me->GetPower(POWER_MANA) >= SPLASH_ATTACK_COST * 6)))\n+                return;\n+\n+            DevourcheckTimer = urand(350, 700);\n+\n+            Unit* target = FindHostileDispelTarget(40);\n+            if (target && doCast(target, GetSpell(DEVOUR_MAGIC_1)))\n+                return;\n+        }\n+\n+        void CheckDrainMana(uint32 diff)\n+        {\n+            if (DraincheckTimer > diff || Rand() > 40 || IAmFree() || !HasRole(BOT_ROLE_DPS) || IsCasting() ||\n+                !IsSpellReady(DRAIN_MANA_1, diff, false) || me->GetPower(POWER_MANA) >= SPLASH_ATTACK_COST)\n+                return;\n+\n+            DraincheckTimer = urand(750, 1500);\n+\n+            std::list<Unit*> targets;\n+            GetNearbyFriendlyTargetsList(targets, 40);\n+            std::erase_if(targets, BOTAI_PRED::DrainTargetExclude());\n+\n+            if (targets.empty())\n+                return;\n+\n+            Unit* target = Bcore::Containers::SelectRandomContainerElement(targets);\n+            if (doCast(target, GetSpell(DRAIN_MANA_1)))\n+                return;\n+        }\n+\n+        void CheckReplenishHealth(uint32 diff)\n+        {\n+            if (ReplHealthcheckTimer > diff || !IsSpellReady(REPLENISH_HEALTH_1, diff) || IAmFree() ||\n+                !HasRole(BOT_ROLE_HEAL) || IsCasting() ||\n+                (HasRole(BOT_ROLE_DPS) && me->GetPower(POWER_MANA) > 0))\n+                return;\n+\n+            ReplHealthcheckTimer = 1000;\n+\n+            Group const* gr = master->GetGroup();\n+            if (!gr)\n+                return;\n+\n+            bool haveHp = false;\n+            uint8 partycombat = 0, partynocombat = 0;\n+            for (Unit const* member : BotMgr::GetAllGroupMembers(gr))\n+            {\n+                if (me->GetMap() == member->FindMap())\n+                {\n+                    if (member->IsInCombat())\n+                        partycombat++;\n+                    else if (member->IsAlive())\n+                        partynocombat++;\n+\n+                    if (!haveHp && member->IsAlive() && me->GetDistance(member) < 15 && GetHealthPCT(member) < 95)\n+                        haveHp = true;\n+                }\n+            }\n+\n+            if (haveHp && (!me->IsInCombat() || partycombat > partynocombat) &&\n+                doCast(me, GetSpell(REPLENISH_HEALTH_1)))\n+                return;\n+        }\n+\n+        void CheckReplenishMana(uint32 diff)\n+        {\n+            if (ReplManacheckTimer > diff || !IsSpellReady(REPLENISH_MANA_1, diff) || IAmFree() || IsCasting() ||\n+                (HasRole(BOT_ROLE_DPS) && me->GetPower(POWER_MANA) > 0))\n+                return;\n+\n+            ReplManacheckTimer = 1000;\n+\n+            Group const* gr = master->GetGroup();\n+            if (!gr)\n+                return;\n+\n+            bool haveMana = false;\n+            uint8 partycombat = 0, partynocombat = 0;\n+            for (Unit const* member : BotMgr::GetAllGroupMembers(gr))\n+            {\n+                if (me->GetMap() == member->FindMap())\n+                {\n+                    if (member->IsInCombat())\n+                        partycombat++;\n+                    else if (member->IsAlive())\n+                        partynocombat++;\n+\n+                    if (!haveMana && member->IsAlive() && me->GetDistance(member) < 15 && GetManaPCT(member) < 95 &&\n+                        !(member->IsNPCBot() && member->ToCreature()->GetBotClass() == BOT_CLASS_SPHYNX))\n+                        haveMana = true;\n+                }\n+            }\n+\n+            if (haveMana && (!me->IsInCombat() || partycombat > partynocombat) &&\n+                doCast(me, GetSpell(REPLENISH_MANA_1)))\n+                return;\n+        }\n+\n+        void ApplyClassDamageMultiplierSpell(int32& damage, SpellNonMeleeDamage& /*damageinfo*/, SpellInfo const* /*spellInfo*/, WeaponAttackType /*attackType*/, bool iscrit) const override\n+        {\n+            //uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //uint8 lvl = me->getLevel();\n+            float fdamage = float(damage);\n+\n+            //apply bonus damage mods\n+            float pctbonus = 1.0f;\n+            if (iscrit)\n+                pctbonus *= 1.333f;\n+\n+            damage = int32(fdamage * pctbonus);\n+        }\n+\n+        void OnClassSpellGo(SpellInfo const* spellInfo) override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+\n+            if (baseId == MAIN_ATTACK_1 || baseId == SPLASH_ATTACK_1 || baseId == DEVOUR_MAGIC_1 ||\n+                baseId == DRAIN_MANA_1 || baseId == REPLENISH_MANA_1 || baseId == REPLENISH_HEALTH_1)\n+                GC_Timer = uint32(me->GetAttackTime(BASE_ATTACK) * me->m_modAttackSpeedPct[BASE_ATTACK]);\n+\n+            if (baseId == SPLASH_ATTACK_1)\n+                me->CastSpell(me, MH_ATTACK_ANIM, true);\n+            else if (baseId == MAIN_ATTACK_1)\n+                me->CastSpell(me, MH_OH_ATTACK_ANIM, true);\n+\n+            if (baseId == DEVOUR_MAGIC_1)\n+            {\n+                me->CastSpell(me, MH_OH_ATTACK_ANIM, true);\n+\n+                if (dispelsDealt > 0)\n+                {\n+                    //gain 20% of max mana and 5% of max health for every dispel\n+                    int32 manaGain = me->GetMaxPower(POWER_MANA) / 5 * dispelsDealt;\n+                    uint32 healthGain = me->GetMaxHealth() / 20 * dispelsDealt;\n+\n+                    HealInfo hinfo(me, me, healthGain, spellInfo, spellInfo->GetSchoolMask());\n+\n+                    me->EnergizeBySpell(me, DEVOUR_MAGIC_1, manaGain, POWER_MANA);\n+                    me->HealBySpell(hinfo);\n+\n+                    me->CastSpell(me, SPELL_DEVOUR_MAGIC_CASTER_IMPACT, true);\n+                }\n+\n+                dispelsDealt = 0;\n+            }\n+\n+            if (baseId == DRAIN_MANA_1)\n+                me->CastSpell(me, MH_OH_ATTACK_ANIM, true);\n+\n+            if (baseId == REPLENISH_MANA_1)\n+                me->SendPlaySpellVisualKit(1, 425); //arcane cast omni\n+            if (baseId == REPLENISH_HEALTH_1)\n+                me->SendPlaySpellVisualKit(1, 21); //empty cast finish anim\n+\n+            if (baseId == REPLENISH_MANA_1 || baseId == REPLENISH_HEALTH_1)\n+                me->SetPower(POWER_MANA, 0);\n+        }\n+\n+        void SpellHitTarget(WorldObject* wtarget, SpellInfo const* spell) override\n+        {\n+            Unit* target = wtarget->ToUnit();\n+            if (!target)\n+                return;\n+\n+            uint32 spellId = spell->Id;\n+            if (blastVisualTimer < GetLastDiff() && spellId == SPLASH_ATTACK_1)\n+            {\n+                blastVisualTimer = 500;\n+                me->CastSpell(*target, SHADOWFURY_VISUAL, true);\n+            }\n+            //Devour Magic: damage to summons\n+            if (spellId == DEVOUR_MAGIC_1 && target->IsSummon() && target->GetUInt32Value(UNIT_CREATED_BY_SPELL) &&\n+                !target->IsTotem() && me->GetReactionTo(target) <= REP_NEUTRAL)\n+            {\n+                SpellInfo const* devInfo = AssertBotSpellInfoOverride(spellId);\n+                uint32 damage = std::min<uint32>(target->GetMaxHealth() / 2, me->GetMaxHealth() / 5 + me->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_MAGIC));\n+                Unit::DealDamage(me, target, damage, nullptr, SPELL_DIRECT_DAMAGE, devInfo->GetSchoolMask(), devInfo);\n+                OnBotDispelDealt(target, 1);\n+            }\n+\n+            if (spellId == DRAIN_MANA_1)\n+            {\n+                me->CastSpell(target, SPELL_DEVOUR_MAGIC_BEAM, true);\n+                target->SendPlaySpellVisualKit(1, 419); //drain impact visual\n+            }\n+            if (spellId == REPLENISH_MANA_1)\n+                if (target != me)\n+                    target->SendPlaySpellVisualKit(1, 524/*436*/); //mana gain visual//heal bigger crimson ish\n+\n+            OnSpellHitTarget(target, spell);\n+        }\n+\n+        void SpellHit(WorldObject* wcaster, SpellInfo const* spell) override\n+        {\n+            Unit* caster = wcaster->ToUnit();\n+            if (!caster)\n+                return;\n+\n+            OnSpellHit(caster, spell);\n+        }\n+\n+        void OnBotDispelDealt(Unit* dispelled, uint8 num) override\n+        {\n+            //cast drain visual on dispelled\n+            if (me != dispelled)\n+            {\n+                me->CastSpell(dispelled, SPELL_DEVOUR_MAGIC_BEAM, true);\n+                dispelled->SendPlaySpellVisualKit(1, 357/*317*/); //purge visual\n+            }\n+\n+            dispelsDealt += num;\n+        }\n+\n+        void DamageDealt(Unit* victim, uint32& damage, DamageEffectType damageType) override\n+        {\n+            bot_ai::DamageDealt(victim, damage, damageType);\n+        }\n+\n+        void DamageTaken(Unit* u, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo*/) override\n+        {\n+            if (damage)\n+            {\n+                dmgReceived += damage / 10;\n+                uint32 energizeThreshold = me->GetMaxPower(POWER_MANA) / 10;\n+\n+                int32 manaGain = 0;\n+                while (dmgReceived >= energizeThreshold)\n+                {\n+                    manaGain += energizeThreshold;\n+                    dmgReceived -= energizeThreshold;\n+                }\n+                if (manaGain)\n+                    me->EnergizeBySpell(me, SPELL_ENERGIZE, manaGain, POWER_MANA);\n+            }\n+\n+            if (!u)\n+                return;\n+            if (!u->IsInCombat() && !me->IsInCombat())\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void OwnerAttackedBy(Unit* u) override\n+        {\n+            if (!u)\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void CheckAttackState() override\n+        {\n+        }\n+\n+        void Reset() override\n+        {\n+            blastVisualTimer = 0;\n+            DevourcheckTimer = 0;\n+            DraincheckTimer = 0;\n+            ReplManacheckTimer = 0;\n+            ReplHealthcheckTimer = 0;\n+\n+            dmgReceived = 0;\n+            dispelsDealt = 0;\n+\n+            DefaultInit();\n+\n+            me->SetPower(POWER_MANA, 0);\n+        }\n+\n+        void ReduceCD(uint32 diff) override\n+        {\n+            if (blastVisualTimer > diff)            blastVisualTimer -= diff;\n+            if (DevourcheckTimer > diff)            DevourcheckTimer -= diff;\n+            if (DraincheckTimer > diff)             DraincheckTimer -= diff;\n+            if (ReplManacheckTimer > diff)          ReplManacheckTimer -= diff;\n+            if (ReplHealthcheckTimer > diff)        ReplHealthcheckTimer -= diff;\n+        }\n+\n+        void InitPowers() override\n+        {\n+            me->SetPowerType(POWER_MANA);\n+        }\n+\n+        void InitSpells() override\n+        {\n+            InitSpellMap(MAIN_ATTACK_1, true, false);\n+            InitSpellMap(SPLASH_ATTACK_1, true, false);\n+            InitSpellMap(DEVOUR_MAGIC_1, true, false);\n+            InitSpellMap(DRAIN_MANA_1, true, false);\n+\n+            InitSpellMap(REPLENISH_MANA_1, true, false);\n+            InitSpellMap(REPLENISH_HEALTH_1, true, false);\n+        }\n+\n+        void ApplyClassPassives() const override\n+        {\n+        }\n+\n+        bool CanUseManually(uint32 basespell) const override\n+        {\n+            switch (basespell)\n+            {\n+                case DEVOUR_MAGIC_1:\n+                case DRAIN_MANA_1:\n+                case REPLENISH_MANA_1:\n+                case REPLENISH_HEALTH_1:\n+                    return true;\n+                default:\n+                    return false;\n+            }\n+        }\n+\n+        std::vector<uint32> const* GetDamagingSpellsList() const override\n+        {\n+            return &Sphynx_spells_damage;\n+        }\n+        //std::vector<uint32> const* GetCCSpellsList() const override\n+        //{\n+        //    return &Sphynx_spells_cc;\n+        //}\n+        std::vector<uint32> const* GetHealingSpellsList() const override\n+        {\n+            return &Sphynx_spells_heal;\n+        }\n+        std::vector<uint32> const* GetSupportSpellsList() const override\n+        {\n+            return &Sphynx_spells_support;\n+        }\n+\n+    private:\n+        uint32 blastVisualTimer;\n+        uint32 DevourcheckTimer, DraincheckTimer, ReplManacheckTimer, ReplHealthcheckTimer;\n+\n+        uint32 dmgReceived;\n+        uint8 dispelsDealt;\n+    };\n+};\n+\n+void AddSC_sphynx_bot()\n+{\n+    new sphynx_bot();\n+}\ndiff --git a/src/server/game/AI/NpcBots/bot_warlock_ai.cpp b/src/server/game/AI/NpcBots/bot_warlock_ai.cpp\nnew file mode 100644\nindex 0000000000..c1ab04ecf6\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bot_warlock_ai.cpp\n@@ -0,0 +1,2120 @@\n+#include \"bot_ai.h\"\n+#include \"botlogtraits.h\"\n+#include \"botmgr.h\"\n+#include \"botspell.h\"\n+#include \"bottraits.h\"\n+#include \"Containers.h\"\n+#include \"Group.h\"\n+#include \"Log.h\"\n+#include \"Map.h\"\n+#include \"MotionMaster.h\"\n+#include \"ObjectAccessor.h\"\n+#include \"Player.h\"\n+#include \"ScriptMgr.h\"\n+#include \"Spell.h\"\n+#include \"SpellAuraEffects.h\"\n+#include \"SpellMgr.h\"\n+#include \"TemporarySummon.h\"\n+#include \"World.h\"\n+/*\n+Warlock NpcBot (reworked by Trickerer onlysuffering@gmail.com)\n+Complete - 85%\n+TODO: rituals (not directly feasable), demonic circle, demonic empowerment, demonic pact, health funnel, healthstones for bots, etc...\n+*/\n+\n+enum WarlockBaseSpells\n+{\n+    CURSE_OF_WEAKNESS_1                 = 702,\n+    CURSE_OF_AGONY_1                    = 980,\n+    CURSE_OF_TONGUES_1                  = 1714,\n+    CURSE_OF_EXHAUSTION_1               = 18223,\n+    CURSE_OF_THE_ELEMENTS_1             = 1490,\n+    CURSE_OF_DOOM_1                     = 603,//NI\n+    SHADOW_BOLT_1                       = 686,\n+    IMMOLATE_1                          = 348,\n+    CORRUPTION_1                        = 172,\n+    SEED_OF_CORRUPTION_1                = 27243,\n+    INCINERATE_1                        = 29722,\n+    SEARING_PAIN_1                      = 5676,\n+    SHADOWBURN_1                        = 17877,\n+    CONFLAGRATE_1                       = 17962,\n+    SOUL_FIRE_1                         = 6353,\n+    CHAOS_BOLT_1                        = 50796,\n+    RAIN_OF_FIRE_1                      = 5740,\n+    HELLFIRE_1                          = 1949,\n+    SHADOWFLAME_1                       = 47897,\n+    SHADOWFURY_1                        = 30283,\n+    HAUNT_1                             = 48181,\n+    UNSTABLE_AFFLICTION_1               = 30108,\n+    FEAR_1                              = 5782,\n+    HOWL_OF_TERROR_1                    = 5484,\n+    DEATH_COIL_1                        = 6789,\n+    SOULSHATTER_1                       = 29858,\n+\n+    DRAIN_SOUL_1                        = 1120,\n+    DRAIN_MANA_1                        = 5138,\n+    BANISH_1                            = 710,\n+\n+    DEMON_SKIN_1                        = 687,\n+    DEMON_ARMOR_1                       = 706,\n+    FEL_ARMOR_1                         = 28176,\n+    DETECT_INVISIBILITY_1               = 132,\n+    UNENDING_BREATH_1                   = 5697,\n+    SHADOW_WARD_1                       = 6229,\n+    LIFE_TAP_1                          = 1454,\n+    DARK_PACT_1                         = 18220,\n+\n+    CREATE_HEALTHSTONE_1                = 6201,\n+    CREATE_SOULSTONE_1                  = 693,\n+\n+    CHAOTIC_MIND                        = 61188, //8 sec duration, no cd\n+\n+    RITUAL_OF_SUMMONING_1               = 698,\n+    RITUAL_OF_SOULS_1                   = 29893\n+};\n+enum WarlockPassives\n+{\n+    IMPROVED_SHADOW_BOLT                = 17803,//rank 5\n+    IMPROVED_DRAIN_SOUL                 = 18372,//rank 2\n+    SOUL_SIPHON                         = 17805,//rank 2\n+    AFTERMATH                           = 18120,//rank 2\n+    IMPROVED_FEAR                       = 53759,//rank 2\n+    NIGHTFALL                           = 18095,//rank 2\n+    SHADOW_EMBRACE                      = 32394,//rank 5\n+    SIPHON_LIFE                         = 63108,\n+    BACKLASH                            = 34939,//rank 3\n+    MOLTEN_CORE                         = 47247,//rank 3\n+    NETHER_PROTECTION                   = 30302,//rank 3\n+    ERADICATION                         = 47197,//rank 3\n+    DEMONIC_RESILIENCE                  = 30321,//rank 3\n+    SOUL_LEECH                          = 30296,//rank 3\n+    PYROCLASM                           = 63245,//rank 3\n+    DECIMATION                          = 63158,//rank 2\n+    IMPROVED_SOUL_LEECH                 = 54118,//rank 2\n+    PANDEMIC                            = 58435,\n+    BACKDRAFT                           = 47260,//rank 3\n+    EVERLASTING_AFFLICTION              = 47205,//rank 5\n+\n+    //Special\n+    GLYPH_CORRUPTION                    = 56218,\n+    GLYPH_LIFE_TAP                      = 63320,\n+    GLYPH_FEAR                          = 56244,\n+    GLYPH_QUICK_DECAY                   = 70947,\n+    GLYPH_CONFLAGRATE                   = 56235,\n+    GLYPH_SHADOWFLAME                   = 63310\n+};\n+\n+enum WarlockSpecial\n+{\n+    CHAOS_BOLT_PASSIVE                  = 58284,\n+    DEMONIC_IMMOLATE_PASSIVE            = 75445,\n+\n+    BACKLASH_BUFF                       = 34936,\n+    BACKDRAFT_BUFF                      = 54277,//rank 3\n+    SHADOW_TRANCE_BUFF                  = 17941,\n+    MOLTEN_CORE_BUFF                    = 71165,//rank 3\n+    DECIMATION_BUFF                     = 63167,//rank 2\n+    CHAOTIC_MIND_BUFF                   = 61189,// \"Soul Fire!\" 6 sec duration Soul Fire instant cast\n+    GLYPH_LIFE_TAP_BUFF                 = 63321,//\"Life Tap\"\n+\n+    SHADOW_MASTERY_DEBUFF               = 17800,// Improved Shadow Bolt talent debuff\n+\n+    SIPHON_LIFE_HEAL                    = 63106,\n+    LIFE_TAP_ENERGIZE                   = 31818,\n+\n+    SEED_OF_CORRUPTION_FINAL_DAMAGE_1   = 27285,\n+\n+    SOULSTONE_RESURRECTION_1            = 20707,\n+    SOULSTONE_RESURRECTION_2            = 20762,\n+    SOULSTONE_RESURRECTION_3            = 20763,\n+    SOULSTONE_RESURRECTION_4            = 20764,\n+    SOULSTONE_RESURRECTION_5            = 20765,\n+    SOULSTONE_RESURRECTION_6            = 27239,\n+    SOULSTONE_RESURRECTION_7            = 47883,\n+\n+    BLOOD_PACT_1                        = 6307,\n+    FEL_INTELLIGENCE_1                  = 54424,\n+\n+    SOUL_LINK_PET                       = 25228,//split effect lvl 20 req\n+    FEL_SYNERGY_HEAL                    = 54181,\n+    LIFE_TAP_ENERGIZE_PET               = 32553\n+};\n+\n+enum CurseType : uint32\n+{\n+    CURSE_NONE                  = 0,\n+    CURSE_WEAKNESS              = 1,\n+    CURSE_AGONY                 = 2,\n+    CURSE_DOOM                  = 3,\n+    CURSE_ELEMENTS              = 4,\n+    CURSE_TONGUES               = 5,\n+    CURSE_EXHAUSTION            = 6,\n+\n+    CURSE_FLAG_MY_WEAKNESS,\n+    CURSE_FLAG_MY_AGONY,\n+    CURSE_FLAG_MY_DOOM,\n+    CURSE_FLAG_MY_ELEMENTS,\n+    CURSE_FLAG_MY_TONGUES,\n+    CURSE_FLAG_MY_EXHAUSTION,\n+\n+    CURSE_MASK_WEAKNESS         = (1 << CURSE_WEAKNESS),\n+    CURSE_MASK_AGONY            = (1 << CURSE_AGONY),\n+    CURSE_MASK_DOOM             = (1 << CURSE_DOOM),\n+    CURSE_MASK_ELEMENTS         = (1 << CURSE_ELEMENTS),\n+    CURSE_MASK_TONGUES          = (1 << CURSE_TONGUES),\n+    CURSE_MASK_EXHAUSTION       = (1 << CURSE_EXHAUSTION),\n+\n+    CURSE_MASK_MY_WEAKNESS      = (1 << CURSE_FLAG_MY_WEAKNESS),\n+    CURSE_MASK_MY_AGONY         = (1 << CURSE_FLAG_MY_AGONY),\n+    CURSE_MASK_MY_DOOM          = (1 << CURSE_FLAG_MY_DOOM),\n+    CURSE_MASK_MY_ELEMENTS      = (1 << CURSE_FLAG_MY_ELEMENTS),\n+    CURSE_MASK_MY_TONGUES       = (1 << CURSE_FLAG_MY_TONGUES),\n+    CURSE_MASK_MY_EXHAUSTION    = (1 << CURSE_FLAG_MY_EXHAUSTION),\n+\n+    CURSE_MASK_MY_CURSE_ANY     = (CURSE_MASK_MY_WEAKNESS | CURSE_MASK_MY_AGONY | CURSE_MASK_MY_DOOM | \\\n+                                CURSE_MASK_MY_ELEMENTS | CURSE_MASK_MY_TONGUES | CURSE_MASK_MY_EXHAUSTION)\n+};\n+\n+static const std::vector<uint32> Warlock_spells_damage\n+{ CHAOS_BOLT_1, CONFLAGRATE_1, CORRUPTION_1, CURSE_OF_AGONY_1, CURSE_OF_DOOM_1, DEATH_COIL_1, DRAIN_SOUL_1, HAUNT_1,\n+HELLFIRE_1, IMMOLATE_1, INCINERATE_1, RAIN_OF_FIRE_1, SEARING_PAIN_1, SEED_OF_CORRUPTION_1, SHADOW_BOLT_1,\n+SHADOWBURN_1, SHADOWFLAME_1, SHADOWFURY_1, SOUL_FIRE_1, UNSTABLE_AFFLICTION_1 };\n+static const std::vector<uint32> Warlock_spells_cc\n+{ BANISH_1, CURSE_OF_TONGUES_1, CURSE_OF_EXHAUSTION_1, DEATH_COIL_1, FEAR_1, HOWL_OF_TERROR_1, SHADOWFURY_1 };\n+static const std::vector<uint32> Warlock_spells_support\n+{ CURSE_OF_TONGUES_1, CURSE_OF_EXHAUSTION_1, CURSE_OF_THE_ELEMENTS_1, CURSE_OF_WEAKNESS_1, DARK_PACT_1, DRAIN_MANA_1,\n+DEMON_SKIN_1, DEMON_ARMOR_1, DETECT_INVISIBILITY_1, FEL_ARMOR_1, LIFE_TAP_1, SHADOW_WARD_1, SOULSHATTER_1,\n+UNENDING_BREATH_1/*, CREATE_HEALTHSTONE_1, CREATE_SOULSTONE_1, RITUAL_OF_SUMMONING_1, RITUAL_OF_SOULS_1*/ };\n+\n+class warlock_bot : public CreatureScript\n+{\n+public:\n+    warlock_bot() : CreatureScript(\"warlock_bot\") { }\n+\n+    CreatureAI* GetAI(Creature* creature) const override\n+    {\n+        return new warlock_botAI(creature);\n+    }\n+/*\n+    bool OnGossipHello(Player* player, Creature* creature)\n+    {\n+        return creature->GetBotAI()->OnGossipHello(player, 0);\n+    }\n+\n+    bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action)\n+    {\n+        if (bot_ai* ai = creature->GetBotAI())\n+            return ai->OnGossipSelect(player, creature, sender, action);\n+        return true;\n+    }\n+\n+    bool OnGossipSelectCode(Player* player, Creature* creature, uint32 sender, uint32 action, char const* code)\n+    {\n+        if (bot_ai* ai = creature->GetBotAI())\n+            return ai->OnGossipSelectCode(player, creature, sender, action, code);\n+        return true;\n+    }\n+*/\n+    struct warlock_botAI : public bot_ai\n+    {\n+        //HealthstoneSpellIds (Improved Healthstone rank 2)\n+        static constexpr uint32 _healthStoneSpells[8/*createHealthstoneRank*/]\n+        {\n+            23469,// Minor\n+            23471,// Lesser\n+            23473,//\n+            23475,// Greater\n+            23477,// Major\n+            27237,// Master\n+            47872,// Demonic\n+            47877 // Fel\n+        };\n+\n+        warlock_botAI(Creature* creature) : bot_ai(creature)\n+        {\n+            _botclass = BOT_CLASS_WARLOCK;\n+\n+            myPetType = 0;\n+\n+            InitUnitFlags();\n+        }\n+\n+        bool doCast(Unit* victim, uint32 spellId)\n+        {\n+            if (CheckBotCast(victim, spellId) != SPELL_CAST_OK)\n+                return false;\n+            return bot_ai::doCast(victim, spellId);\n+        }\n+\n+        void JustEnteredCombat(Unit* u) override { canShadowWard = false; bot_ai::JustEnteredCombat(u); }\n+        void KilledUnit(Unit* u) override { bot_ai::KilledUnit(u); }\n+        void EnterEvadeMode(EvadeReason why = EVADE_REASON_OTHER) override { bot_ai::EnterEvadeMode(why); }\n+        void MoveInLineOfSight(Unit* u) override { bot_ai::MoveInLineOfSight(u); }\n+        void JustDied(Unit* u) override { UnsummonAll(false); bot_ai::JustDied(u); }\n+        void DoNonCombatActions(uint32 diff)\n+        {\n+            if (GC_Timer > diff || me->IsMounted() || IsCasting() || Feasting() || Rand() > 20)\n+                return;\n+\n+            if (GetSpell(FEL_ARMOR_1) && !IsTank())\n+            {\n+                if (!me->GetAuraEffect(SPELL_AURA_MOD_SPELL_DAMAGE_OF_STAT_PERCENT, SPELLFAMILY_WARLOCK, 0x0, 0x20000000, 0x0)\n+                    /*!HasAuraName(me, FEL_ARMOR_1)*/ &&\n+                    doCast(me, GetSpell(FEL_ARMOR_1)))\n+                    return;\n+            }\n+            else if (GetSpell(DEMON_ARMOR_1))\n+            {\n+                if (!me->GetAuraEffect(SPELL_AURA_MOD_RESISTANCE, SPELLFAMILY_WARLOCK, 0x0, 0x20, 0x0)\n+                    /*!HasAuraName(me, DEMON_ARMOR_1)*/ &&\n+                    doCast(me, GetSpell(DEMON_ARMOR_1)))\n+                    return;\n+            }\n+            else if (!GetSpell(FEL_ARMOR_1) && !GetSpell(DEMON_ARMOR_1) && GetSpell(DEMON_SKIN_1))\n+            {\n+                if (!me->GetAuraEffect(SPELL_AURA_MOD_RESISTANCE, SPELLFAMILY_WARLOCK, 0x0, 0x0, 0x10)\n+                    /*!HasAuraName(me, DEMON_SKIN_1)*/ &&\n+                    doCast(me, GetSpell(DEMON_SKIN_1)))\n+                    return;\n+            }\n+\n+            if (me->GetVictim())\n+                return;\n+\n+            if (!hasHealthstone && GetSpell(CREATE_HEALTHSTONE_1))\n+            {\n+                if (doCast(me, GetSpell(CREATE_HEALTHSTONE_1)))\n+                    return;\n+            }\n+\n+            if (!hasSoulstone && GetSpell(CREATE_SOULSTONE_1))\n+            {\n+                if (doCast(me, GetSpell(CREATE_SOULSTONE_1)))\n+                    return;\n+            }\n+\n+            if (GetSpell(DETECT_INVISIBILITY_1))\n+            {\n+                if (master->IsAlive() && !master->HasAuraType(SPELL_AURA_MOD_INVISIBILITY_DETECT) &&\n+                    doCast(master, GetSpell(DETECT_INVISIBILITY_1)))\n+                    return;\n+            }\n+\n+            //BUG: players cannot accept this buff if they are below lvl 20 (should be 8)\n+            if (hasSoulstone && soulstoneTimer <= diff && GetSpell(CREATE_SOULSTONE_1))\n+            {\n+                std::vector<Unit*> targets;\n+\n+                if (!IAmFree())\n+                {\n+                    std::vector<Unit*> all_members = BotMgr::GetAllGroupMembers(master->GetGroup());\n+                    for (auto i : NPCBots::index_array<uint8, 3>)\n+                    {\n+                        if (i > 0 && !targets.empty())\n+                            break;\n+                        for (Unit* member : all_members)\n+                        {\n+                            if ((i >= 2 || (i == 0 ? member->IsPlayer() : (member->IsNPCBot() && !GetBG()))) && me->GetMap() == member->FindMap() &&\n+                                member->IsAlive() && !member->isPossessed() && !member->IsCharmed() &&\n+                                !(member->IsNPCBot() && member->ToCreature()->IsTempBot()) &&\n+                                me->GetDistance(member) < 30 && !member->GetDummyAuraEffect(SPELLFAMILY_GENERIC, 92, 0))\n+                            {\n+                                if (i >= 2 || member->GetClass() == CLASS_PRIEST || member->GetClass() == CLASS_PALADIN ||\n+                                    member->GetClass() == CLASS_DRUID || member->GetClass() == CLASS_SHAMAN)\n+                                {\n+                                    targets.push_back(member);\n+                                }\n+                            }\n+                        }\n+                    }\n+                }\n+\n+                if (targets.empty() && master->IsAlive() && !master->isPossessed() && !master->IsCharmed() && !(GetBG() && IsWanderer()) &&\n+                    me->GetDistance(master) < 30 && !master->GetDummyAuraEffect(SPELLFAMILY_GENERIC, 92, 0))\n+                    targets.push_back(master);\n+\n+                if (!targets.empty())\n+                {\n+                    Unit* target = targets.size() == 1 ? targets.front() : Bcore::Containers::SelectRandomContainerElement(targets);\n+                    SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(CREATE_SOULSTONE_1);\n+                    uint32 rank = spellInfo->GetRank();\n+\n+                    while (rank < std::size(_healthStoneSpells) - 1 && target->GetLevel() > spellInfo->SpellLevel && spellInfo->GetNextRankSpell())\n+                    {\n+                        spellInfo = spellInfo->GetNextRankSpell();\n+                        rank = spellInfo->GetRank();\n+                    }\n+\n+                    uint32 spellId;\n+                    switch (spellInfo->Id)\n+                    {\n+                        case   693: spellId = SOULSTONE_RESURRECTION_1; break; //rank 1\n+                        case 20752: spellId = SOULSTONE_RESURRECTION_2; break; //rank 2\n+                        case 20755: spellId = SOULSTONE_RESURRECTION_3; break; //rank 3\n+                        case 20756: spellId = SOULSTONE_RESURRECTION_4; break; //rank 4\n+                        case 20757: spellId = SOULSTONE_RESURRECTION_5; break; //rank 5\n+                        case 27238: spellId = SOULSTONE_RESURRECTION_6; break; //rank 6\n+                        case 47884: spellId = SOULSTONE_RESURRECTION_7; break; //rank 7\n+                        default:\n+                            BOT_LOG_ERROR(\"entities.player\", \"bot_warlockAI: unknown soulstone Id {}\", spellInfo->Id);\n+                            spellId = SOULSTONE_RESURRECTION_1;\n+                            break;\n+                    }\n+                    me->CastSpell(target, spellId, false);\n+                }\n+            }\n+        }\n+\n+        void StartAttack(Unit* u, bool force = false)\n+        {\n+            if (!bot_ai::StartAttack(u, force))\n+                return;\n+            GetInPosition(force, u);\n+            fearTimer = std::max<uint32>(fearTimer, 1000);\n+        }\n+\n+        void CheckFear(uint32 diff)\n+        {\n+            if (fearTimer > diff || GC_Timer > diff || !me->IsInCombat() || IsTank() || IsCasting())\n+                return;\n+\n+            fearTimer = 1600;\n+\n+            uint32 FEAR = GetSpell(FEAR_1);\n+            if (!FEAR)\n+                return;\n+\n+            if (FindAffectedTarget(FEAR, me->GetGUID(), 70, 255))\n+                return;\n+\n+            Unit* feartarget = FindFearTarget(CalcSpellMaxRange(FEAR_1));\n+            if (feartarget && doCast(feartarget, FEAR))\n+                return;\n+        }\n+\n+        void CheckBanish(uint32 diff)\n+        {\n+            if (banishTimer > diff || GC_Timer > diff || !me->IsInCombat() || IsTank() || IsCasting() || Rand() > 50)\n+                return;\n+\n+            banishTimer = 1600;\n+\n+            uint32 BANISH = GetSpell(BANISH_1);\n+            if (!BANISH)\n+                return;\n+\n+            if (FindAffectedTarget(BANISH, me->GetGUID(), 70, 255))\n+                return;\n+\n+            Unit* banishTarget = FindUndeadCCTarget(CalcSpellMaxRange(BANISH_1), BANISH_1);\n+            if (banishTarget && doCast(banishTarget, BANISH))\n+                return;\n+        }\n+\n+        void CheckUnBanish(uint32 diff)\n+        {\n+            if (unbanishTimer > diff || GC_Timer > diff || me->GetVictim() || IsCasting() || Rand() > 30)\n+                return;\n+\n+            unbanishTimer = 2000;\n+\n+            //we check only our spell rank which is enough in 99% cases\n+            uint32 BANISH = GetSpell(BANISH_1);\n+            if (!BANISH)\n+                return;\n+\n+            //looks like you cannot dispel other people's banish\n+            Unit* unbanishTarget = FindAffectedTarget(BANISH, me->GetGUID(), CalcSpellMaxRange(BANISH_1));\n+            if (unbanishTarget && doCast(unbanishTarget, BANISH))\n+                return;\n+        }\n+\n+        void CheckDrainMana(uint32 diff)\n+        {\n+            if (drainManaTimer > diff || IsPotionReady() || !IsSpellReady(DRAIN_MANA_1, diff) ||\n+                !me->getAttackers().empty() || IsTank() || IsCasting() || GetManaPCT(me) > 25 || Rand() > 60)\n+                return;\n+\n+            drainManaTimer = 1000;\n+\n+            //1 case: feared mana pot running around\n+            Unit* drainTarget = FindDrainTarget(CalcSpellMaxRange(DRAIN_MANA_1));\n+\n+            if (!drainTarget)\n+            {\n+                Unit* u = me->GetVictim();\n+                if (u && u->GetPowerType() == POWER_MANA && u->GetMaxPower(POWER_MANA) >= me->GetMaxPower(POWER_MANA) &&\n+                    GetManaPCT(u) >= 15 && me->GetDistance(u) < CalcSpellMaxRange(DRAIN_MANA_1))\n+                    drainTarget = u;\n+            }\n+\n+            if (drainTarget && doCast(drainTarget, GetSpell(DRAIN_MANA_1)))\n+                return;\n+        }\n+\n+        void CheckWard(uint32 diff)\n+        {\n+            if (!canShadowWard || (!me->IsInCombat() && !me->HasAuraType(SPELL_AURA_PERIODIC_DAMAGE)) ||\n+                !IsSpellReady(SHADOW_WARD_1, diff) || IsCasting())\n+                return;\n+\n+            if (doCast(me, GetSpell(SHADOW_WARD_1)))\n+                return;\n+        }\n+\n+        void CheckSoulShatter(uint32 diff)\n+        {\n+            if (!IsSpellReady(SOULSHATTER_1, diff) || me->getAttackers().empty() || Rand() < 80)\n+                return;\n+\n+            Unit* u = *(me->getAttackers().begin());\n+            if (u->GetThreatManager().GetThreatListSize() < 3 || u->GetThreatManager().GetThreat(me) < 100.f)\n+                return;\n+\n+            if (doCast(me, GetSpell(SOULSHATTER_1)))\n+                return;\n+        }\n+\n+        void Counter(uint32 diff)\n+        {\n+            if (GC_Timer > diff || IsCasting() || Rand() > 25)\n+                return;\n+\n+            bool busyCasting = me->IsNonMeleeSpellCast(true,true,true);\n+\n+            //Fear\n+            if (!busyCasting && IsSpellReady(FEAR_1, diff))\n+            {\n+                Unit* u = FindCastingTarget(CalcSpellMaxRange(FEAR_1), 0, FEAR_1);\n+                if (u && doCast(u, GetSpell(FEAR_1)))\n+                    return;\n+            }\n+            //Howl of Terror (only instant cast)\n+            if ((GetSpec() == BOT_SPEC_WARLOCK_AFFLICTION) &&\n+                !busyCasting && me->GetLevel() >= 45 && IsSpellReady(HOWL_OF_TERROR_1, diff))\n+            {\n+                Unit* u = FindCastingTarget(8, 0, FEAR_1); //same immunity\n+                if (u && doCast(u, GetSpell(HOWL_OF_TERROR_1)))\n+                    return;\n+            }\n+            //Shadowfury\n+            if (HasRole(BOT_ROLE_DPS) && IsSpellReady(SHADOWFURY_1, diff))\n+            {\n+                if (Unit* u = FindCastingTarget(CalcSpellMaxRange(SHADOWFURY_1), 0, SHADOWFURY_1))\n+                {\n+                    if (busyCasting)\n+                        me->InterruptNonMeleeSpells(true);\n+                    if (doCast(u, GetSpell(SHADOWFURY_1)))\n+                        return;\n+                }\n+            }\n+             //Death Coil\n+            if (HasRole(BOT_ROLE_DPS) && IsSpellReady(DEATH_COIL_1, diff))\n+            {\n+                if (Unit* u = FindCastingTarget(CalcSpellMaxRange(DEATH_COIL_1), 0, DEATH_COIL_1))\n+                {\n+                    if (busyCasting)\n+                        me->InterruptNonMeleeSpells(true);\n+                    if (doCast(u, GetSpell(DEATH_COIL_1)))\n+                        return;\n+                }\n+            }\n+        }\n+\n+        void DoDefend(uint32 diff)\n+        {\n+            if (GC_Timer > diff || !me->IsInCombat() || Rand() > 120)\n+                return;\n+\n+            Unit::AttackerSet const& m_attackers = master->getAttackers();\n+            Unit::AttackerSet const& b_attackers = me->getAttackers();\n+            bool needFearM = !IAmFree() && !m_attackers.empty() && (!IsTank(master) || GetHealthPCT(master) < 75);\n+\n+            //HOWL\n+            //fear master's attackers\n+            if (IsSpellReady(HOWL_OF_TERROR_1, diff))\n+            {\n+                if (needFearM)\n+                {\n+                    uint8 tCount = 0;\n+                    for (Unit const* attacker : m_attackers)\n+                    {\n+                        if (!attacker) continue;\n+                        if (CCed(attacker, true)) continue;\n+                        if (attacker->ToCreature() && attacker->GetCreatureType() == CREATURE_TYPE_UNDEAD) continue;\n+                        if (me->GetDistance(attacker) > 9) continue;\n+                        if (me->IsValidAttackTarget(attacker))\n+                            ++tCount;\n+                    }\n+                    if (tCount > 1 && doCast(me, GetSpell(HOWL_OF_TERROR_1)))\n+                        return;\n+                }\n+                // Defend myself\n+                if (!b_attackers.empty())\n+                {\n+                    uint8 tCount = 0;\n+                    for (Unit const* attacker : b_attackers)\n+                    {\n+                        if (!attacker) continue;\n+                        if (CCed(attacker, true)) continue;\n+                        if (attacker->ToCreature() && attacker->GetCreatureType() == CREATURE_TYPE_UNDEAD) continue;\n+                        if (me->GetDistance(attacker) > 9) continue;\n+                        if (me->IsValidAttackTarget(attacker))\n+                            ++tCount;\n+                    }\n+                    if (tCount > 1 && doCast(me, GetSpell(HOWL_OF_TERROR_1)))\n+                        return;\n+                }\n+            }\n+            //COIL\n+            if (HasRole(BOT_ROLE_DPS) && IsSpellReady(DEATH_COIL_1, diff))\n+            {\n+                Unit* u = needFearM ? *(m_attackers.begin()) : nullptr;\n+                if (u && u->GetMaxHealth() > master->GetMaxHealth() * 2 &&\n+                    u->GetDistance(me) < 30)\n+                {\n+                    if (doCast(u, GetSpell(DEATH_COIL_1)))\n+                        return;\n+                }\n+                u = !b_attackers.empty() ? *(b_attackers.begin()) : nullptr;\n+                if (u && u->GetMaxHealth() > me->GetMaxHealth() * 2 && u->GetDistance(me) < 8)\n+                {\n+                    if (doCast(u, GetSpell(DEATH_COIL_1)))\n+                        return;\n+                }\n+            }\n+        }\n+\n+        bool BuffTarget(Unit* target, uint32 /*diff*/) override\n+        {\n+            if (!target->IsPlayer()) return false;\n+            if (me->IsInCombat() && !master->GetMap()->IsRaid()) return false;\n+\n+            if (GetSpell(UNENDING_BREATH_1) && target->HasUnitMovementFlag(MOVEMENTFLAG_SWIMMING) &&\n+                !target->HasAuraType(SPELL_AURA_WATER_BREATHING))\n+            {\n+                if (doCast(target, GetSpell(UNENDING_BREATH_1)))\n+                    return true;\n+            }\n+\n+            return false;\n+        }\n+\n+        void UpdateAI(uint32 diff) override\n+        {\n+            if (!GlobalUpdate(diff))\n+                return;\n+\n+            DoVehicleActions(diff);\n+            if (!CanBotAttackOnVehicle())\n+                return;\n+\n+            //pet is killed or unreachable\n+            if (GC_Timer <= diff && !me->IsInCombat() && !me->IsMounted() && !me->GetVictim() && !IsCasting() && Rand() < 25 &&\n+                (!botPet || me->GetDistance2d(botPet) > sWorld->GetMaxVisibleDistanceOnContinents()))\n+                SummonBotPet();\n+\n+            //Hellfire interrupt\n+            Spell const* spell = me->GetCurrentSpell(CURRENT_CHANNELED_SPELL);\n+            if (spell && spell->GetSpellInfo()->GetFirstRankSpell()->Id == HELLFIRE_1 &&\n+                ((!IAmFree() && !master->GetBotMgr()->IsPartyInCombat(false)) || GetHealthPCT(me) < 25))\n+                me->InterruptSpell(CURRENT_CHANNELED_SPELL);\n+            else\n+            {\n+                spell = me->GetCurrentSpell(CURRENT_GENERIC_SPELL);\n+                SpellInfo const* baseSpellInfo = spell ? spell->GetSpellInfo()->GetFirstRankSpell() : nullptr;\n+                uint32 base_id = baseSpellInfo ? baseSpellInfo->Id : 0;\n+                if (baseSpellInfo && (base_id == FEAR_1 || base_id == BANISH_1 || baseSpellInfo->SpellVisual[0] == 99))\n+                {\n+                    if (Unit const* target = ObjectAccessor::GetUnit(*me, spell->m_targets.GetObjectTargetGUID()))\n+                    {\n+                        //Fear interrupt\n+                        if (base_id == FEAR_1 && target->HasAuraType(SPELL_AURA_MOD_FEAR))\n+                            me->InterruptSpell(CURRENT_GENERIC_SPELL);\n+                        //Banish interrupt\n+                        else if (base_id == BANISH_1)\n+                        {\n+                            if (AuraEffect const* bani = target->GetAuraEffect(SPELL_AURA_SCHOOL_IMMUNITY, SPELLFAMILY_WARLOCK, 0x0, 0x8000000, 0x0))\n+                            {\n+                                //Already banished\n+                                //check spell cast time\n+                                if (bani->GetBase()->GetDuration() > bani->GetBase()->GetMaxDuration() - 1500)\n+                                    me->InterruptSpell(CURRENT_GENERIC_SPELL);\n+                            }\n+                            else if (!target->getAttackers().empty())\n+                                me->InterruptSpell(CURRENT_GENERIC_SPELL);\n+                        }\n+                        //Soulstone resurrection interrupt\n+                        else if (spell->GetSpellInfo()->SpellVisual[0] == 99 && target->GetDummyAuraEffect(SPELLFAMILY_GENERIC, 92, 0))\n+                            me->InterruptSpell(CURRENT_GENERIC_SPELL);\n+                    }\n+                }\n+            }\n+\n+            if (hasHealthstone && healthstoneTimer <= diff &&\n+                /*GetSpell(CREATE_HEALTHSTONE_1) && */!IsCasting() && GetHealthPCT(me) < 65)\n+            {\n+                uint32 healthStone = InitSpell(me, CREATE_HEALTHSTONE_1);\n+                SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(healthStone);\n+                //ASSERT(spellInfo);\n+                uint32 rank = spellInfo ? spellInfo->GetRank() : 1;\n+                //ASSERT(rank >= 1 && rank <= 8);\n+                spellInfo = sSpellMgr->GetSpellInfo(_healthStoneSpells[rank - 1]);\n+                ASSERT(spellInfo);\n+                int32 healing = spellInfo->_effects[0].BasePoints;\n+                //Glyph of Healthstone\n+                if (me->GetLevel() >= 15)\n+                    healing = int32(float(healing) * 1.3f);\n+                CastSpellExtraArgs args(true);\n+                args.AddSpellBP0(healing);\n+                me->CastSpell(me, _healthStoneSpells[rank - 1], args);\n+                healthstoneTimer = 120000; //2 min\n+                hasHealthstone = false;\n+                return;\n+            }\n+            else if (IsPotionReady() && GetHealthPCT(me) < 50)\n+            {\n+                DrinkPotion(false);\n+            }\n+\n+            if (IsSpellReady(DARK_PACT_1, diff) && !IsCasting() && botPet && botPet->GetPower(POWER_MANA) >= 300 &&\n+                GetManaPCT(me) < 20)\n+            {\n+                if (doCast(me, GetSpell(DARK_PACT_1)))\n+                    return;\n+            }\n+            else if (IsSpellReady(LIFE_TAP_1, diff) && !IsCasting() && GetHealthPCT(me) > (me->IsInCombat() ? 30 : 15) &&\n+                GetManaPCT(me) < 15 && Rand() < 50)\n+            {\n+                //it is possible that CheckCast will return SPELL_FAILED_NO_POWER if not enough hp\n+                if (doCast(me, GetSpell(LIFE_TAP_1)))\n+                    return;\n+            }\n+            else if (IsPotionReady() && GetManaPCT(me) < 10)\n+            {\n+                DrinkPotion(true);\n+            }\n+\n+            CheckRacials(diff);\n+\n+            CheckSoulShatter(diff);\n+            DoDefend(diff);\n+            CheckFear(diff);\n+            CheckWard(diff);\n+\n+            BuffAndHealGroup(diff);\n+\n+            if (!me->IsInCombat())\n+                DoNonCombatActions(diff);\n+\n+            Counter(diff);\n+\n+            CheckBanish(diff);\n+            CheckUnBanish(diff);\n+\n+            CheckDrainMana(diff);\n+\n+            if (ProcessImmediateNonAttackTarget())\n+                return;\n+\n+            if (!CheckAttackTarget())\n+                return;\n+\n+            if (IsCasting())\n+                return;\n+\n+            CheckUsableItems(diff);\n+\n+            DoNormalAttack(diff);\n+        }\n+\n+        void DoNormalAttack(uint32 diff)\n+        {\n+            Unit* mytar = opponent ? opponent : disttarget ? disttarget : nullptr;\n+            if (!mytar)\n+                return;\n+\n+            StartAttack(mytar, IsMelee());\n+\n+            CheckAttackState();\n+            if (!me->IsAlive() || !mytar->IsAlive())\n+                return;\n+\n+            MoveBehind(mytar);\n+\n+            if (GC_Timer > diff)\n+                return;\n+\n+            auto [can_do_shadow, can_do_fire] = CanAffectVictimBools(mytar, SPELL_SCHOOL_SHADOW, SPELL_SCHOOL_FIRE);\n+\n+            float dist = me->GetDistance(mytar);\n+\n+            //spell reflections\n+            if (IsSpellReady(CURSE_OF_THE_ELEMENTS_1, diff) && can_do_shadow && dist < CalcSpellMaxRange(CURSE_OF_THE_ELEMENTS_1) &&\n+                CanRemoveReflectSpells(mytar, CURSE_OF_THE_ELEMENTS_1) &&\n+                doCast(mytar, CURSE_OF_THE_ELEMENTS_1))\n+                return;\n+            else if (IsSpellReady(CURSE_OF_WEAKNESS_1, diff) && can_do_shadow && dist < CalcSpellMaxRange(CURSE_OF_WEAKNESS_1) &&\n+                CanRemoveReflectSpells(mytar, CURSE_OF_WEAKNESS_1) &&\n+                doCast(mytar, CURSE_OF_WEAKNESS_1))\n+                return;\n+\n+            //Offensive heal (Death Coil)\n+            if (IsSpellReady(DEATH_COIL_1, diff) && can_do_shadow && HasRole(BOT_ROLE_DPS) && dist < CalcSpellMaxRange(DEATH_COIL_1) &&\n+                GetHealthPCT(me) < 35)\n+            {\n+                //if (me->IsNonMeleeSpellCast(true))\n+                //    me->InterruptNonMeleeSpells(true);\n+                if (doCast(mytar, GetSpell(DEATH_COIL_1)))\n+                    return;\n+            }\n+\n+            //Life Tap / Dark Pact for Glyph of Life Tap\n+            if (lifeTapCheckTimer <= diff && HasRole(BOT_ROLE_DPS) && Rand() < 75)\n+            {\n+                lifeTapCheckTimer = 10000;\n+                if (me->GetLevel() >= 15 && !me->GetAuraEffect(SPELL_AURA_MOD_SPELL_DAMAGE_OF_STAT_PERCENT, SPELLFAMILY_WARLOCK, 208, 0))\n+                {\n+                    //doesn't work: wrong spell proc entry 10.12.2020\n+                    //if (IsSpellReady(DARK_PACT_1, diff) && botPet && GetManaPCT(me) > 70)\n+                    //{\n+                    //    if (doCast(me, GetSpell(DARK_PACT_1)))\n+                    //        return;\n+                    //}\n+                    //else\n+                    if (IsSpellReady(LIFE_TAP_1, diff) && GetHealthPCT(me) > 30)\n+                    {\n+                        if (doCast(me, GetSpell(LIFE_TAP_1)))\n+                            return;\n+                    }\n+                }\n+            }\n+            //Shadowfury\n+            if (IsSpellReady(SHADOWFURY_1, diff) && can_do_shadow && HasRole(BOT_ROLE_DPS) && !CCed(mytar, true) && Rand() < 55)\n+            {\n+                if (FindSplashTarget(CalcSpellMaxRange(SHADOWFURY_1)) &&\n+                    doCast(mytar, GetSpell(SHADOWFURY_1)))\n+                    return;\n+            }\n+            //Hellfire\n+            if (IsSpellReady(HELLFIRE_1, diff) && HasRole(BOT_ROLE_DPS) && !IAmFree() && !JumpingOrFalling() &&\n+                GetHealthPCT(me) > 90 && Rand() < 25)\n+            {\n+                std::list<Unit*> targets;\n+                GetNearbyTargetsList(targets, 12.f, 0);\n+                for (std::list<Unit*>::iterator itr = targets.begin(); itr != targets.end();)\n+                {\n+                    Unit* u = *itr;\n+                    bool erase = false;\n+                    if (u->isMoving())\n+                    {\n+                        if (me->GetDistance(u) > 10.f && !u->HasInArc(float(M_PI)/2, me))\n+                            erase = true;\n+                    }\n+                    else if (me->GetDistance(u) > 9.5f)\n+                        erase = true;\n+\n+                    if (erase)\n+                    {\n+                        targets.erase(itr++);\n+                        continue;\n+                    }\n+                    ++itr;\n+                }\n+                if (targets.size() >= 4 && doCast(me, GetSpell(HELLFIRE_1)))\n+                    return;\n+            }\n+            //Rain of Fire\n+            if (IsSpellReady(RAIN_OF_FIRE_1, diff) && HasRole(BOT_ROLE_DPS) && !JumpingOrFalling() && Rand() < 45 &&\n+                (GetSpec() != BOT_SPEC_WARLOCK_AFFLICTION || !GetSpell(SEED_OF_CORRUPTION_1)))\n+            {\n+                if (Unit* raintarget = FindAOETarget(CalcSpellMaxRange(RAIN_OF_FIRE_1)))\n+                {\n+                    if (doCast(raintarget, GetSpell(RAIN_OF_FIRE_1)))\n+                        return;\n+                }\n+            }\n+            //Searing Pain (PvP)\n+            if (longCasted && IsSpellReady(SEARING_PAIN_1, diff) && can_do_fire && HasRole(BOT_ROLE_DPS) &&\n+                GetSpec() != BOT_SPEC_WARLOCK_AFFLICTION &&\n+                mytar->IsPlayer() && Rand() < 35 && dist < CalcSpellMaxRange(SEARING_PAIN_1))\n+            {\n+                if (doCast(mytar, GetSpell(SEARING_PAIN_1)))\n+                    return;\n+            }\n+            //Shadowflame\n+            if (longCasted && IsSpellReady(SHADOWFLAME_1, diff) && can_do_shadow && HasRole(BOT_ROLE_DPS) && Rand() < 65)\n+            {\n+                std::list<Unit*> targets;\n+                GetNearbyTargetsInConeList(targets, 8); //radius 10 yd\n+                if (!targets.empty() && doCast(me, GetSpell(SHADOWFLAME_1)))\n+                    return;\n+            }\n+            //Curse, checking affliction range\n+            if (curseCheckTimer <= diff && can_do_shadow && GetSpellCooldown(CURSE_OF_WEAKNESS_1) <= diff && Rand() < 85 &&\n+                dist < CalcSpellMaxRange(CURSE_OF_WEAKNESS_1) && mytar->GetHealth() > me->GetMaxHealth() / 4)\n+            {\n+                curseCheckTimer = 2500;\n+                uint32 curses = _getCursesMask(mytar);\n+                if (!(curses & CURSE_MASK_MY_CURSE_ANY))\n+                {\n+                    if (!(curses & CURSE_MASK_ELEMENTS) && GetSpell(CURSE_OF_THE_ELEMENTS_1) && !IAmFree() &&\n+                        (GetSpec() != BOT_SPEC_WARLOCK_AFFLICTION || Rand() < 33) &&\n+                        master->GetGroup() && master->GetGroup()->GetMembersCount() > 2)\n+                    {\n+                        if (doCast(mytar, GetSpell(CURSE_OF_THE_ELEMENTS_1)))\n+                            return;\n+                    }\n+                    if (!(curses & CURSE_MASK_MY_AGONY) && GetSpell(CURSE_OF_AGONY_1) && HasRole(BOT_ROLE_DPS) &&\n+                        mytar->GetHealth() > me->GetMaxHealth() / 4 * (1 + mytar->getAttackers().size()))\n+                    {\n+                        if (doCast(mytar, GetSpell(CURSE_OF_AGONY_1)))\n+                            return;\n+                    }\n+                    if (!(curses & CURSE_MASK_TONGUES) && GetSpell(CURSE_OF_TONGUES_1) && mytar->GetHealth() > me->GetMaxHealth() / 2 &&\n+                        mytar->IsNonMeleeSpellCast(false, false, true))\n+                    {\n+                        if (doCast(mytar, GetSpell(CURSE_OF_TONGUES_1)))\n+                            return;\n+                    }\n+                    if (!(curses & CURSE_MASK_EXHAUSTION) && GetSpell(CURSE_OF_EXHAUSTION_1) && !CCed(mytar, true) &&\n+                        mytar->IsControlledByPlayer() && !mytar->HasAuraWithMechanic(1u<<MECHANIC_SNARE))\n+                    {\n+                        if (doCast(mytar, GetSpell(CURSE_OF_EXHAUSTION_1)))\n+                            return;\n+                    }\n+                    if (!(curses & CURSE_MASK_WEAKNESS) && GetSpell(CURSE_OF_WEAKNESS_1) && me->GetMap()->IsDungeon() &&\n+                        mytar->GetMaxHealth() > me->GetMaxHealth() * 2)\n+                    {\n+                        if (doCast(mytar, GetSpell(CURSE_OF_WEAKNESS_1)))\n+                            return;\n+                    }\n+                }\n+            }\n+\n+            if (!HasRole(BOT_ROLE_DPS))\n+                return;\n+\n+            //Chaos Bolt\n+            if (IsSpellReady(CHAOS_BOLT_1, diff) && can_do_fire && dist < CalcSpellMaxRange(CHAOS_BOLT_1))\n+            {\n+                if (doCast(mytar, GetSpell(CHAOS_BOLT_1)))\n+                    return;\n+            }\n+            //Soul Fire 1\n+            if (IsSpellReady(SOUL_FIRE_1, diff) && can_do_fire && Rand() < 150 && dist < CalcSpellMaxRange(SOUL_FIRE_1) &&\n+                (mytar->IsPolymorphed() || me->HasAuraTypeWithAffectMask(SPELL_AURA_NO_REAGENT_USE, sSpellMgr->GetSpellInfo(SOUL_FIRE_1))))\n+            {\n+                if (doCast(mytar, GetSpell(SOUL_FIRE_1)))\n+                    return;\n+            }\n+            //Conflagrate (always glyphed, does not consume dot)\n+            if (longCasted && IsSpellReady(CONFLAGRATE_1, diff) && can_do_fire && dist < CalcSpellMaxRange(CONFLAGRATE_1) &&\n+                mytar->HasAuraState(AURA_STATE_CONFLAGRATE) &&\n+                mytar->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_WARLOCK, 0x4, 0x0, 0x0, me->GetGUID()))\n+            {\n+                if (doCast(mytar, GetSpell(CONFLAGRATE_1)))\n+                    return;\n+            }\n+            //Shadowburn\n+            if (longCasted && IsSpellReady(SHADOWBURN_1, diff) && can_do_shadow && dist < CalcSpellMaxRange(SHADOWBURN_1) &&\n+                mytar->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT))\n+            {\n+                if (doCast(mytar, GetSpell(SHADOWBURN_1)))\n+                    return;\n+            }\n+            //Immolate\n+            if (IsSpellReady(IMMOLATE_1, diff) && can_do_fire && Rand() < 85 && dist < CalcSpellMaxRange(IMMOLATE_1) &&\n+                (GetSpec() != BOT_SPEC_WARLOCK_AFFLICTION || !GetSpell(UNSTABLE_AFFLICTION_1)) &&\n+                (GetSpell(CONFLAGRATE_1) || mytar->GetHealth() > me->GetMaxHealth()/4 * (1 + mytar->getAttackers().size())) &&\n+                !mytar->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_WARLOCK, 0x4, 0x0, 0x0, me->GetGUID()))\n+            {\n+                if (doCast(mytar, GetSpell(IMMOLATE_1)))\n+                    return;\n+            }\n+            //Haunt\n+            if (IsSpellReady(HAUNT_1, diff) && can_do_shadow && Rand() < 125 && dist < CalcSpellMaxRange(HAUNT_1) &&\n+                mytar->GetHealth() > me->GetMaxHealth()/4 * (1 + mytar->getAttackers().size()) &&\n+                !mytar->GetAuraEffect(SPELL_AURA_MOD_DAMAGE_FROM_CASTER, SPELLFAMILY_WARLOCK, 0x0, 0x40000, 0x0, me->GetGUID()))\n+            {\n+                if (doCast(mytar, GetSpell(HAUNT_1)))\n+                    return;\n+            }\n+            //Unstable Affliction\n+            if (IsSpellReady(UNSTABLE_AFFLICTION_1, diff) && can_do_shadow && Rand() < 115 && dist < CalcSpellMaxRange(UNSTABLE_AFFLICTION_1) &&\n+                mytar->GetHealth() > me->GetMaxHealth()/4 * (1 + mytar->getAttackers().size()) &&\n+                !mytar->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_WARLOCK, 0x0, 0x100, 0x0, me->GetGUID()))\n+            {\n+                if (doCast(mytar, GetSpell(UNSTABLE_AFFLICTION_1)))\n+                    return;\n+            }\n+            //Seed of Corruption\n+            if (IsSpellReady(SEED_OF_CORRUPTION_1, diff) && Rand() < 85)\n+            {\n+                Unit* target = FindAOETarget(CalcSpellMaxRange(SEED_OF_CORRUPTION_1));\n+                if (target && !target->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_WARLOCK, 0x0, 0x10, 0x0, me->GetGUID()))\n+                {\n+                    if (doCast(target, GetSpell(SEED_OF_CORRUPTION_1)))\n+                        return;\n+                }\n+\n+                SetSpellCooldown(SEED_OF_CORRUPTION_1, 1000); //fail\n+            }\n+            //Corruption\n+            if (IsSpellReady(CORRUPTION_1, diff) && can_do_shadow && Rand() < 90 && dist < CalcSpellMaxRange(CORRUPTION_1) &&\n+                mytar->GetHealth() > me->GetMaxHealth()/4 * (1 + mytar->getAttackers().size()) &&\n+                !mytar->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_WARLOCK, 0x2, 0x0, 0x0, me->GetGUID()) &&//corruption\n+                !mytar->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_WARLOCK, 0x0, 0x10, 0x0, me->GetGUID()))//seed of corruption\n+            {\n+                if (doCast(mytar, GetSpell(CORRUPTION_1)))\n+                    return;\n+            }\n+            //Drain Soul: only if can quad damage\n+            if (IsSpellReady(DRAIN_SOUL_1, diff) && can_do_shadow && mytar->IsCreature() &&\n+                Rand() < (50 + 85 * me->GetMap()->IsDungeon()) && GetHealthPCT(mytar) < 25 &&\n+                mytar->GetHealth() > me->GetMaxHealth() / 2 && dist < CalcSpellMaxRange(DRAIN_SOUL_1))\n+            {\n+                if (doCast(mytar, GetSpell(DRAIN_SOUL_1)))\n+                    return;\n+            }\n+            //Soul Fire (conditional)\n+            if (IsSpellReady(SOUL_FIRE_1, diff) && can_do_fire && Rand() < 90 && dist < CalcSpellMaxRange(SOUL_FIRE_1) &&\n+                mytar->GetHealth() > me->GetMaxHealth()/8 * (1 + mytar->getAttackers().size()) && me->HasAura(BACKDRAFT_BUFF))\n+            {\n+                if (doCast(mytar, GetSpell(SOUL_FIRE_1)))\n+                    return;\n+            }\n+            //Main: Shadow Bolt, Incinerate, Searing Pain (tank), checking destruction range\n+            if (dist < CalcSpellMaxRange(SHADOW_BOLT_1))\n+            {\n+                uint32 boltinerate =\n+                    IsTank() && GetSpell(SEARING_PAIN_1) ? SEARING_PAIN_1 :\n+                    GetSpell(SHADOW_BOLT_1) && GetSpec() == BOT_SPEC_WARLOCK_AFFLICTION ? SHADOW_BOLT_1 :\n+                    GetSpell(INCINERATE_1) && mytar->HasAuraState(AURA_STATE_CONFLAGRATE) ?\n+                    //mytar->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_WARLOCK, 0x4, 0x0, 0x0) &&\n+                    //mytar->GetAuraEffect(SPELL_AURA_MOD_ATTACKER_SPELL_CRIT_CHANCE, SPELLFAMILY_WARLOCK, 213, 0) &&\n+                    //(me->GetMap()->IsRaid() || !me->HasAura(SHADOW_TRANCE_BUFF)) ?\n+                    INCINERATE_1 : SHADOW_BOLT_1;\n+\n+                bool can_cast_boltinerate;\n+                switch (boltinerate)\n+                {\n+                    case SEARING_PAIN_1: case INCINERATE_1:\n+                        can_cast_boltinerate = can_do_fire;\n+                        break;\n+                    case SHADOW_BOLT_1:\n+                        can_cast_boltinerate = can_do_shadow;\n+                        break;\n+                    default:\n+                        can_cast_boltinerate = true;\n+                        break;\n+                }\n+\n+                if (boltinerate && can_cast_boltinerate && doCast(mytar, GetSpell(boltinerate)))\n+                    return;\n+            }\n+\n+            if (Spell const* shot = me->GetCurrentSpell(CURRENT_AUTOREPEAT_SPELL))\n+            {\n+                if (shot->GetSpellInfo()->Id == SHOOT_WAND && shot->m_targets.GetUnitTarget() != mytar)\n+                    me->InterruptSpell(CURRENT_AUTOREPEAT_SPELL);\n+            }\n+            else if (IsSpellReady(SHOOT_WAND, diff) && !me->isMoving() && me->GetDistance(mytar) < 30 && GetEquips(BOT_SLOT_RANGED) &&\n+                doCast(mytar, SHOOT_WAND))\n+                return;\n+        }\n+\n+        void ApplyClassSpellCritMultiplierAll(Unit const* victim, float& crit_chance, SpellInfo const* spellInfo, SpellSchoolMask /*schoolMask*/, WeaponAttackType /*attackType*/) const override\n+        {\n+            //victim can be NULL\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+\n+            //Molten Core part 2.2: 15% additional critical chance for Soul Fire\n+            if (lvl >= 35 && baseId == SOUL_FIRE_1)\n+            {\n+                moltencore = me->HasAura(MOLTEN_CORE_BUFF);\n+                if (moltencore)\n+                    crit_chance += 15.f;\n+            }\n+\n+            //Devastation: 5% additional critical chance for Destruction spells\n+            if ((GetSpec() == BOT_SPEC_WARLOCK_DESTRUCTION) &&\n+                lvl >= 30 && spellInfo->SpellFamilyName == SPELLFAMILY_WARLOCK &&\n+                ((spellInfo->SpellFamilyFlags[0] & 0x3E5) || (spellInfo->SpellFamilyFlags[1] & 0x8310C0)))\n+                crit_chance += 5.f;\n+            //Fire and Brimstone part 2: 25% additional critical chance for Conflagrate\n+            if ((GetSpec() == BOT_SPEC_WARLOCK_DESTRUCTION) && lvl >= 55 && baseId == CONFLAGRATE_1)\n+                crit_chance += 25.f;\n+            //Malediction part 2: 9% additional critical chance for Corruption and Unstable Affliction\n+            if ((GetSpec() == BOT_SPEC_WARLOCK_AFFLICTION) &&\n+                lvl >= 45 && (baseId == CORRUPTION_1 || baseId == UNSTABLE_AFFLICTION_1))\n+                crit_chance += 9.f;\n+            //Glyph of Shadowburn: 20% additional critical chance for Shadowburn on targets 35% hp and below\n+            if (lvl >= 20 && baseId == SHADOWBURN_1 && victim && victim->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT))\n+                crit_chance += 20.f;\n+            //Improved Corruption part 2: 5% additional critical chance for Seed of Corruption\n+            if (lvl >= 10 && (baseId == SEED_OF_CORRUPTION_1 || baseId == SEED_OF_CORRUPTION_FINAL_DAMAGE_1))\n+                crit_chance += 5.f;\n+            //Improved Searing Pain: 10% additional critical chance for Searing Pain\n+            if ((GetSpec() == BOT_SPEC_WARLOCK_DESTRUCTION) && lvl >= 25 && baseId == SEARING_PAIN_1)\n+                crit_chance += 10.f;\n+\n+            //Master Demonologist part 1.2 (me): 5% additional critical chance for Fire spells\n+            if ((GetSpec() == BOT_SPEC_WARLOCK_DEMONOLOGY) &&\n+                lvl >= 35 && botPet && myPetType == BOT_PET_IMP && (spellInfo->GetSchoolMask() & SPELL_SCHOOL_MASK_FIRE))\n+                crit_chance += 5.f;\n+            //Master Demonologist part 3.2 (me): 5% additional critical chance for Shadow spells\n+            if ((GetSpec() == BOT_SPEC_WARLOCK_DEMONOLOGY) &&\n+                lvl >= 35 && botPet && myPetType == BOT_PET_SUCCUBUS && (spellInfo->GetSchoolMask() & SPELL_SCHOOL_MASK_SHADOW))\n+                crit_chance += 5.f;\n+\n+            //Warlock T84P Bonus (64932): 5% additional critical chance for Shadow Bolt and Incinerate\n+            if (lvl >= 80 && (baseId == SHADOW_BOLT_1 || baseId == INCINERATE_1))\n+                crit_chance += 5.f;\n+        }\n+\n+        void ApplyClassDamageMultiplierSpell(int32& damage, SpellNonMeleeDamage& damageinfo, SpellInfo const* spellInfo, WeaponAttackType /*attackType*/, bool iscrit) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+            float fdamage = float(damage);\n+\n+            //2) apply bonus damage mods\n+            float pctbonus = 1.0f; //Special condition\n+            if (iscrit)\n+            {\n+                //!!!spell damage is not yet critical and will be multiplied by 1.5\n+                //so we should put here bonus damage mult /1.5\n+                //Ruin: 50% additional crit damage bonus for Destruction spells\n+                if (lvl >= 20 && spellInfo->SpellFamilyName == SPELLFAMILY_WARLOCK &&\n+                    ((spellInfo->SpellFamilyFlags[0] & 0x13E5) || (spellInfo->SpellFamilyFlags[1] & 0xC310C0)))\n+                    pctbonus += 0.333f;\n+                //Pandemic part 2,3: crit damage for periodics and haunt\n+                if ((GetSpec() == BOT_SPEC_WARLOCK_AFFLICTION) &&\n+                    lvl >= 50 && spellInfo->SpellFamilyName == SPELLFAMILY_WARLOCK &&\n+                    ((spellInfo->SpellFamilyFlags[0] & 0x2) || (spellInfo->SpellFamilyFlags[1] & 0x40100)))\n+                    pctbonus += 0.333f;\n+                //Glyph of Searing Pain: 20% additional crit damage bonus for Searing Pain\n+                if (lvl >= 18 && baseId == SEARING_PAIN_1)\n+                    pctbonus += 0.133f;\n+            }\n+            //Improved Shadow Bolt and Incinerate (38393): 6% bonus damage for Shadow bolt and Incinerate\n+            if (baseId == SHADOW_BOLT_1 || baseId == INCINERATE_1)\n+                pctbonus += 0.06f;\n+            //Glyph of Incinerate: 5% bonus damage for Incinerate\n+            if (baseId == INCINERATE_1)\n+                pctbonus += 0.05f;\n+            //Improved Immolate: 30% bonus damage for Immolate\n+            if ((GetSpec() == BOT_SPEC_WARLOCK_DESTRUCTION) && lvl >= 30 && baseId == IMMOLATE_1)\n+                pctbonus += 0.3f;\n+            //EmberStorm part 1: 15% bonus damage for Fire spells\n+            if ((GetSpec() == BOT_SPEC_WARLOCK_DESTRUCTION) &&\n+                lvl >= 35 && spellInfo->SpellFamilyName == SPELLFAMILY_WARLOCK &&\n+                ((spellInfo->SpellFamilyFlags[0] & 0x364) || (spellInfo->SpellFamilyFlags[1] & 0x8200C0)))\n+                pctbonus += 0.15f;\n+            //Fire and Brimstone part 1: 10% bonus damage for Incinerate and Chaos Bolt\n+            if ((GetSpec() == BOT_SPEC_WARLOCK_DESTRUCTION) &&\n+                lvl >= 55 && (baseId == INCINERATE_1 || baseId == CHAOS_BOLT_1) &&\n+                damageinfo.target->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_WARLOCK, 0x4, 0x0, 0x0, me->GetGUID()))\n+                pctbonus += 0.1f;\n+            //Molten Core part 1: 18% bonus damage for Incinerate and Soul Fire\n+            if ((GetSpec() == BOT_SPEC_WARLOCK_DESTRUCTION) &&\n+                lvl >= 35 && (baseId == INCINERATE_1 || baseId == SOUL_FIRE_1))\n+            {\n+                if (me->HasAura(MOLTEN_CORE_BUFF))\n+                    pctbonus += 0.18f;\n+            }\n+            //Improved Corruption part 1: 10% bonus damage for Corruption\n+            if (lvl >= 10 && baseId == CORRUPTION_1)\n+                pctbonus += 0.1f;\n+            //Corruption (28829): 12% bonus damage for Corruption\n+            if (lvl >= 40 && baseId == CORRUPTION_1)\n+                pctbonus += 0.12f;\n+            //Malediction part 1: 3% bonus damage for All spells\n+            if ((GetSpec() == BOT_SPEC_WARLOCK_AFFLICTION) && lvl >= 45)\n+                pctbonus += 0.03f;\n+            //Death's Embrace part 2: 12% bonus damage for Shadow spells on targets below 35 pct health\n+            if ((GetSpec() == BOT_SPEC_WARLOCK_AFFLICTION) &&\n+                lvl >= 50 && damageinfo.target->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT) &&\n+                ((spellInfo->SpellFamilyFlags[0] & 0x8248B) || (spellInfo->SpellFamilyFlags[1] & 0x59913)))\n+                pctbonus += 0.12f;\n+\n+            //Empowered Corruption: 36% spellpower bonus for Corruption\n+            if (lvl >= 25 && baseId == CORRUPTION_1)\n+                fdamage += me->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_MAGIC) * 0.36f * me->CalculateDefaultCoefficient(spellInfo, DOT) * me->CalculateSpellpowerCoefficientLevelPenalty(spellInfo);\n+            //Shadow and Flame: 20% spellpower bonus for Shadow Bolt, Shadowburn, Chaos Bolt and Incineration\n+            if ((GetSpec() == BOT_SPEC_WARLOCK_DESTRUCTION) && lvl >= 45 &&\n+                (baseId == SHADOW_BOLT_1 || baseId == CHAOS_BOLT_1 || baseId == SHADOWBURN_1 || baseId == INCINERATE_1))\n+                fdamage += me->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_MAGIC) * 0.2f * me->CalculateDefaultCoefficient(spellInfo, SPELL_DIRECT_DAMAGE) * me->CalculateSpellpowerCoefficientLevelPenalty(spellInfo);\n+            //Everlasting Affliction part 1: 5% spellpower bonus for Corruption and Unstable Affliction\n+            if ((GetSpec() == BOT_SPEC_WARLOCK_AFFLICTION) &&\n+                lvl >= 55 && (baseId == CORRUPTION_1 || baseId == UNSTABLE_AFFLICTION_1))\n+                fdamage += me->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_MAGIC) * 0.05f * me->CalculateDefaultCoefficient(spellInfo, DOT) * me->CalculateSpellpowerCoefficientLevelPenalty(spellInfo);\n+\n+            //Firestone/Spellstone: 1% bonus damage for all spells\n+            if (lvl >= 28)\n+                pctbonus += 0.01f;\n+\n+            //Improved Shadow Bolt part 1: 10% bonus damage for Shadow Bolt\n+            if (lvl >= 10 && baseId == SHADOW_BOLT_1)\n+                pctbonus += 0.1f;\n+            //Improved Corruption and Immolate (Updated) (61992): 5% bonus damage for Corruption and Immolate\n+            if (lvl >= 10 && (baseId == CORRUPTION_1 || baseId == IMMOLATE_1))\n+                pctbonus += 0.05f;\n+            //Improved Curse of Agony: 10% bonus damage for Curse of Agony\n+            if (lvl >= 10 && baseId == CURSE_OF_AGONY_1)\n+                pctbonus += 0.1f;\n+            //Shadow Mastery: 15% bonus damage for Shadow Spells\n+            if ((GetSpec() == BOT_SPEC_WARLOCK_AFFLICTION) &&\n+                lvl >= 35 && ((spellInfo->SpellFamilyFlags[0] & 0x80091) || spellInfo->SpellFamilyFlags[1] & 0x451910))\n+                pctbonus += 0.15f;\n+            //Contagion: 5% bonus damage for Curse of Agony, Corruption and Seed of Corruption\n+            if ((GetSpec() == BOT_SPEC_WARLOCK_AFFLICTION) &&\n+                lvl >= 40 && (baseId == CORRUPTION_1 || baseId == SEED_OF_CORRUPTION_1 ||\n+                baseId == SEED_OF_CORRUPTION_FINAL_DAMAGE_1 || baseId == CURSE_OF_AGONY_1))\n+                pctbonus += 0.05f;\n+\n+            //Warlock T82P Bonus (64931): 20/10% bonus damage for Unstable Affliction and Immolate\n+            if (lvl >= 80 && baseId == UNSTABLE_AFFLICTION_1)\n+                pctbonus += 0.2f;\n+            if (lvl >= 80 && baseId == IMMOLATE_1)\n+                pctbonus += 0.1f;\n+            //Warlock T94P Bonus (67231): 10% bonus damage for Immolate, Corruption and Unstable Affliction\n+            if (lvl >= 80 && (baseId == IMMOLATE_1 || baseId == CORRUPTION_1 || baseId == UNSTABLE_AFFLICTION_1))\n+                pctbonus += 0.2f;\n+\n+            //Glyph of Immolate: 10% bonus damage for Immolate\n+            if (lvl >= 15 && baseId == IMMOLATE_1)\n+                pctbonus += 0.1f;\n+\n+            //Demonic Pact part 1: 10% bonus damage for all spells\n+            if ((GetSpec() == BOT_SPEC_WARLOCK_DEMONOLOGY) && lvl >= 55)\n+                pctbonus *= 1.1f;\n+            //Master Demonologist part 1.1 (me): 5% bonus damage for Fire spells\n+            if ((GetSpec() == BOT_SPEC_WARLOCK_DEMONOLOGY) &&\n+                lvl >= 35 && botPet && myPetType == BOT_PET_IMP && (spellInfo->GetSchoolMask() & SPELL_SCHOOL_MASK_FIRE))\n+                pctbonus *= 1.05f;\n+            //Master Demonologist part 3.1 (me): 5% bonus damage for Shadow spells\n+            if ((GetSpec() == BOT_SPEC_WARLOCK_DEMONOLOGY) &&\n+                lvl >= 35 && botPet && myPetType == BOT_PET_SUCCUBUS && (spellInfo->GetSchoolMask() & SPELL_SCHOOL_MASK_SHADOW))\n+                pctbonus *= 1.05f;\n+\n+            damage = int32(fdamage * pctbonus);\n+        }\n+\n+        void ApplyClassDamageMultiplierHeal(Unit const* /*victim*/, float& heal, SpellInfo const* spellInfo, DamageEffectType /*damagetype*/, uint32 /*stack*/) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+            float pctbonus = 0.0f;\n+\n+            //Glyph of Siphon Life: 25% bonus healing for Siphon Life effect (50% for bots)\n+            if (baseId == SIPHON_LIFE_HEAL)\n+                pctbonus += 0.5f;\n+            //Improved Death Coil (30052): 30% bonus healing for Death Coil\n+            if (lvl >= 60 && baseId == DEATH_COIL_1)\n+                pctbonus += 0.3f;\n+\n+            heal = heal * (1.0f + pctbonus);\n+        }\n+\n+        void ApplyClassSpellCostMods(SpellInfo const* spellInfo, int32& cost) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            float fcost = float(cost);\n+            float pctbonus = 0.0f;\n+\n+            //pct mods\n+            //Doomcaller Reduced Shadow Bolt Cost (26117): -15% mana cost for Shadow Bolt\n+            if (baseId == SHADOW_BOLT_1)\n+                pctbonus += 0.15f;\n+            //Glyph of Shadow Bolt: -10% mana cost for Shadow Bolt\n+            if (lvl >= 15 && baseId == SHADOW_BOLT_1)\n+                pctbonus += 0.1f;\n+            //Cataclysm: -10% mana cost for Destruction spells\n+            if (lvl >= 15 && spellInfo->SpellFamilyName == SPELLFAMILY_WARLOCK &&\n+                ((spellInfo->SpellFamilyFlags[0] & 0x3E5) || (spellInfo->SpellFamilyFlags[1] & 0x8310C0)))\n+                pctbonus += 0.1f;\n+            //Suppression: -6% mana cost for Affliction spells\n+            if (lvl >= 10 && spellInfo->SpellFamilyName == SPELLFAMILY_WARLOCK &&\n+                ((spellInfo->SpellFamilyFlags[0] & 0x814CC41A) || (spellInfo->SpellFamilyFlags[1] & 0x248F1B)))\n+                pctbonus += 0.06f;\n+\n+            //cost can be < 0\n+            cost = int32(fcost * (1.0f - pctbonus));\n+        }\n+\n+        void ApplyClassSpellCastTimeMods(SpellInfo const* spellInfo, int32& casttime) const override\n+        {\n+            //casttime is in milliseconds\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            int32 timebonus = 0;\n+            float pctbonus = 0.0f;\n+\n+            //100% mods\n+            //Backlash: -100% cast time for Shadow Bolt or Incinerate\n+            if (lvl >= 15 && (baseId == SHADOW_BOLT_1 || baseId == INCINERATE_1))\n+            {\n+                backlash = me->HasAura(BACKLASH_BUFF);\n+                shadowtrance = (baseId == SHADOW_BOLT_1 && me->HasAura(SHADOW_TRANCE_BUFF));\n+                if (backlash || shadowtrance)\n+                    timebonus += casttime;\n+            }\n+            //Improved Howl of Terror: -1.5sec (-100%) cast time for Howl of Terror\n+            if ((GetSpec() == BOT_SPEC_WARLOCK_AFFLICTION) && lvl >= 45 && baseId == HOWL_OF_TERROR_1)\n+                timebonus += casttime;\n+            //Chaotic Mind (custom)\n+            if (baseId == SOUL_FIRE_1)\n+            {\n+                chaoticmind = me->HasAura(CHAOTIC_MIND_BUFF);\n+                if (chaoticmind)\n+                    timebonus += casttime;\n+            }\n+\n+            //pct mods\n+            //BackDraft part 1: -30% cast time for Destruction spells\n+            if (lvl >= 50 && spellInfo->SpellFamilyName == SPELLFAMILY_WARLOCK &&\n+                ((spellInfo->SpellFamilyFlags[0] & 0x165) || (spellInfo->SpellFamilyFlags[1] & 0x310C0)))\n+            {\n+                //skip soul fire insta cast\n+                backdraft = me->HasAura(BACKDRAFT_BUFF) && !(chaoticmind && baseId == SOUL_FIRE_1);\n+                if (backdraft)\n+                    pctbonus += 0.3f;\n+            }\n+            //Molten Core part 2.1: -30% cast time for Incinerate\n+            if (lvl >= 35 && baseId == INCINERATE_1)\n+            {\n+                moltencore = me->HasAura(MOLTEN_CORE_BUFF);\n+                if (moltencore)\n+                    pctbonus += 0.3f;\n+            }\n+            //Decimation: -40% cast time for Soul Fire\n+            if (baseId == SOUL_FIRE_1 && me->HasAura(DECIMATION_BUFF))\n+                pctbonus += 0.4f;\n+\n+            //flat mods\n+            //Bane: -0.5 sec cast time for Shadow Bolt, Immolate and Chaos Bolt, -2 sec cast for Soul Fire\n+            if (lvl >= 10)\n+            {\n+                if (baseId == SHADOW_BOLT_1 || baseId == IMMOLATE_1 || baseId == CHAOS_BOLT_1)\n+                    timebonus += 500;\n+                else if (baseId == SOUL_FIRE_1)\n+                    timebonus += 2000;\n+            }\n+            //EmberStorm part 2: -0.25 sec cast time for Incinerate\n+            if ((GetSpec() == BOT_SPEC_WARLOCK_DESTRUCTION) && lvl >= 35 && baseId == INCINERATE_1)\n+                timebonus += 250;\n+            //Glyph of Unstable Affliction: -0.2 sec cast time for Unstable Affliction\n+            if (lvl >= 50 && baseId == UNSTABLE_AFFLICTION_1)\n+                timebonus += 200;\n+            //Fear Cast Time Reduction (23047): -0.2 sec cast time for Fear\n+            if (baseId == FEAR_1)\n+                timebonus += 200;\n+\n+            casttime = std::max<int32>((float(casttime) * (1.0f - pctbonus)) - timebonus, 0);\n+\n+            instaCast = (casttime <= 500); //triggered GCD is too long\n+        }\n+\n+        void ApplyClassSpellNotLoseCastTimeMods(SpellInfo const* spellInfo, int32& delayReduce) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchoolMask schools = spellInfo->GetSchoolMask();\n+            uint8 lvl = me->GetLevel();\n+            int32 reduceBonus = 0;\n+\n+            if (lvl >= 20 && (/*baseId == DRAIN_LIFE_1 || */baseId == DRAIN_MANA_1 || baseId == DRAIN_SOUL_1 || baseId == UNSTABLE_AFFLICTION_1 || baseId == HAUNT_1))\n+                reduceBonus += 70;\n+\n+            if (GetSpec() == BOT_SPEC_WARLOCK_DESTRUCTION && lvl >= 25)\n+            {\n+                switch (baseId)\n+                {\n+                    case CHAOS_BOLT_1: case HELLFIRE_1: case IMMOLATE_1: case INCINERATE_1: case RAIN_OF_FIRE_1:\n+                    case SEARING_PAIN_1: case SHADOW_BOLT_1: case SOUL_FIRE_1: case SHADOWBURN_1: case SHADOWFURY_1:\n+                        reduceBonus += 70;\n+                        break;\n+                    default:\n+                        break;\n+                }\n+            }\n+\n+            delayReduce += reduceBonus;\n+        }\n+\n+        void ApplyClassSpellCooldownMods(SpellInfo const* /*spellInfo*/, uint32& cooldown) const override\n+        {\n+            //cooldown is in milliseconds\n+            //uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            //uint8 lvl = me->GetLevel();\n+            int32 timebonus = 0;\n+            float pctbonus = 0.0f;\n+\n+            //pct mods\n+            //Glyph of Rapid Charge: -7% cooldown for Charge\n+            //if (lvl >= 40 && spellId == GetSpell(CHARGE_1))\n+            //    pctbonus += 0.07f;\n+\n+            //flat mods\n+\n+            cooldown = std::max<int32>((float(cooldown) * (1.0f - pctbonus)) - timebonus, 0);\n+        }\n+\n+        void ApplyClassSpellCategoryCooldownMods(SpellInfo const* spellInfo, uint32& cooldown) const override\n+        {\n+            //cooldown is in milliseconds\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            int32 timebonus = 0;\n+            float pctbonus = 0.0f;\n+\n+            //Glyph of Chaos Bolt: -2 sec cooldown for Chaos Bolt\n+            if (lvl >= 60 && baseId == CHAOS_BOLT_1)\n+                timebonus += 2000;\n+            //Improved Death Coil (24487): -15% cooldown for Death Coil (30 sec for bots)\n+            if (baseId == DEATH_COIL_1)\n+                timebonus += 30000;\n+            //Glyph of Howl of Terror: -8 sec cooldown for Howl of Terror\n+            if (lvl >= 45 && baseId == HOWL_OF_TERROR_1)\n+                timebonus += 8000;\n+\n+            cooldown = std::max<int32>((float(cooldown) * (1.0f - pctbonus)) - timebonus, 0);\n+        }\n+\n+        void ApplyClassSpellGlobalCooldownMods(SpellInfo const* spellInfo, float& cooldown) const override\n+        {\n+            //cooldown is in milliseconds\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            float timebonus = 0.0f;\n+            float pctbonus = 0.0f;\n+\n+            //pct mods\n+            //BackDraft: -30% global cooldown for Destruction spells\n+            if ((GetSpec() == BOT_SPEC_WARLOCK_DESTRUCTION) &&\n+                lvl >= 50 && spellInfo->SpellFamilyName == SPELLFAMILY_WARLOCK &&\n+                ((spellInfo->SpellFamilyFlags[0] & 0x165) || (spellInfo->SpellFamilyFlags[1] & 0x310C0)) &&\n+                me->HasAura(BACKDRAFT_BUFF))\n+                pctbonus += 0.3f;\n+\n+            //flat mods\n+            //Amplify Curse: -0.5 sec global cooldown for Curses\n+            if (lvl >= 20 && spellInfo->SpellFamilyName == SPELLFAMILY_WARLOCK &&\n+                ((spellInfo->SpellFamilyFlags[0] & 0x408400) || (spellInfo->SpellFamilyFlags[1] & 0x200202) ||\n+                (spellInfo->SpellFamilyFlags[2] & 0x800)))\n+                timebonus += 500.f;\n+\n+            //Fear Cast Time Reduction (23047): -0.2 sec global cooldown for Fear\n+            if (baseId == FEAR_1)\n+                timebonus += 200;\n+\n+            cooldown = (cooldown * (1.0f - pctbonus)) - timebonus;\n+        }\n+\n+        void ApplyClassSpellRadiusMods(SpellInfo const* spellInfo, float& radius) const override\n+        {\n+            //uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            float flatbonus = 0.0f;\n+            float pctbonus = 0.0f;\n+\n+            //pct mods\n+\n+            //flat mods\n+            //Improved Rain of Fire / Hellfire\n+            if (lvl >= 40 && (spellInfo->SpellFamilyFlags[0] & 0x60))\n+                flatbonus += 2.f;\n+\n+            radius = radius * (1.0f + pctbonus) + flatbonus;\n+        }\n+\n+        void ApplyClassSpellRangeMods(SpellInfo const* spellInfo, float& maxrange) const override\n+        {\n+            //uint32 spellId = spellInfo->Id;\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            float flatbonus = 0.0f;\n+            float pctbonus = 0.0f;\n+\n+            //pct mods\n+            //Grim Reach: +20% range for Affliction Spells\n+            if (lvl >= 25 && ((spellInfo->SpellFamilyFlags[0] & 0x8048C41A) || (spellInfo->SpellFamilyFlags[1] & 0x40713)))\n+                pctbonus += 0.2f;\n+            //Destructive Reach: +20% range for Destruction Spells\n+            if (lvl >= 25 && ((spellInfo->SpellFamilyFlags[0] & 0x13A5) || (spellInfo->SpellFamilyFlags[1] & 0x8210C0)))\n+                pctbonus += 0.2f;\n+\n+            //flat mods\n+            //Glyph of Curse of Exhaustion: +5 yd range for Curse of Exhaustion\n+            if (lvl >= 70 && baseId == CURSE_OF_EXHAUSTION_1)\n+                flatbonus += 5.f;\n+\n+            maxrange = maxrange * (1.0f + pctbonus) + flatbonus;\n+        }\n+\n+        void OnClassSpellGo(SpellInfo const* spellInfo) override\n+        {\n+            //uint32 spellId = spellInfo->Id;\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+\n+            //Instacast buffs handling\n+            if (baseId == SHADOW_BOLT_1)\n+            {\n+                if (backlash)\n+                    me->RemoveAurasDueToSpell(BACKLASH_BUFF);\n+                else if (shadowtrance)\n+                    me->RemoveAurasDueToSpell(SHADOW_TRANCE_BUFF);\n+            }\n+            if (baseId == INCINERATE_1)\n+            {\n+                if (backlash)\n+                    me->RemoveAurasDueToSpell(BACKLASH_BUFF);\n+            }\n+            if (chaoticmind && baseId == SOUL_FIRE_1)\n+                me->RemoveAurasDueToSpell(CHAOTIC_MIND_BUFF);\n+\n+            //Backdraft\n+            if (backdraft && spellInfo->SpellFamilyName == SPELLFAMILY_WARLOCK &&\n+                ((spellInfo->SpellFamilyFlags[0] & 0x165) || (spellInfo->SpellFamilyFlags[1] & 0x310C0)))\n+            {\n+                if (Aura* bd = me->GetAura(BACKDRAFT_BUFF))\n+                    bd->DropCharge();\n+            }\n+            //Molten Core\n+            if (moltencore && (baseId == INCINERATE_1 || baseId == SOUL_FIRE_1))\n+            {\n+                if (Aura* mc = me->GetAura(MOLTEN_CORE_BUFF))\n+                    mc->DropCharge();\n+            }\n+            //Decimation: NOT DROPPED ON CAST\n+            //if (baseId == SOUL_FIRE_1)\n+            //{\n+            //    if (Aura* mc = me->GetAura(DECIMATION_BUFF))\n+            //        mc->DropCharge();\n+            //}\n+            longCasted = !instaCast &&\n+                (baseId == SHADOW_BOLT_1 || baseId == INCINERATE_1 || baseId == CHAOS_BOLT_1 ||\n+                baseId == SOUL_FIRE_1 || baseId == HAUNT_1 || baseId == SEARING_PAIN_1); //damaging spells\n+        }\n+\n+        void SpellHit(WorldObject* wcaster, SpellInfo const* spell) override\n+        {\n+            Unit* caster = wcaster->ToUnit();\n+            if (!caster)\n+                return;\n+\n+            uint32 spellId = spell->Id;\n+            uint32 baseId = spell->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+\n+            //Shadow Ward helper\n+            if (!canShadowWard && (spell->GetSchoolMask() & SPELL_SCHOOL_MASK_SHADOW) &&\n+                (spell->HasEffect(SPELL_EFFECT_SCHOOL_DAMAGE) || spell->HasAura(SPELL_AURA_PERIODIC_DAMAGE)))\n+                canShadowWard = true;\n+\n+            //Create Healthstone trigger\n+            if (baseId == CREATE_HEALTHSTONE_1)\n+            {\n+                hasHealthstone = true;\n+            }\n+            //Create Soulstone trigger\n+            if (baseId == CREATE_SOULSTONE_1)\n+            {\n+                hasSoulstone = true;\n+            }\n+\n+            //Glyph of Soul Link: +5% increased effect\n+            if (baseId == SOUL_LINK_PET)\n+            {\n+                if (AuraEffect* link = me->GetAuraEffect(spellId, 0))\n+                    link->ChangeAmount(link->GetAmount() + 5);\n+            }\n+\n+            //Life Tap energize\n+            if (baseId == LIFE_TAP_1)\n+            {\n+                //level * 3 based on in-game tooltip and spellwork (BasePoints = 2000 + Level * 4,00)\n+                int32 damage = spell->_effects[0].CalcValue(me);\n+                int32 manaGain = damage;\n+                //damage += int32(me->GetLevel() * 3);\n+                manaGain += 0.5f * me->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_MAGIC);\n+\n+                //Life Tap (id: 28830)\n+                //damage = int32(float(damage) * 0.88f);\n+                //Improved Life Tap\n+                if (me->GetLevel() >= 15)\n+                    manaGain = int32(float(manaGain) * 1.2f);\n+\n+                me->ModifyHealth(-damage);\n+                CastSpellExtraArgs args;\n+                args.AddSpellBP0(manaGain);\n+                me->CastSpell(me, LIFE_TAP_ENERGIZE, args);\n+\n+                //Mana Feed\n+                if ((GetSpec() == BOT_SPEC_WARLOCK_DEMONOLOGY) && me->GetLevel() >= 35 && botPet)\n+                    me->EnergizeBySpell(botPet, LIFE_TAP_ENERGIZE_PET, manaGain, POWER_MANA);\n+            }\n+\n+            //Glyph of Life Tap trigger\n+            if (baseId == GLYPH_LIFE_TAP_BUFF)\n+                SetShouldUpdateStats();\n+\n+            if (baseId == DEMON_ARMOR_1 || baseId == FEL_ARMOR_1)\n+            {\n+                if (Aura* armo = me->GetAura(spellId, me->GetGUID()))\n+                {\n+                    //Armors duration\n+                    uint32 dur = 1 * HOUR * IN_MILLISECONDS;\n+                    armo->SetDuration(dur);\n+                    armo->SetMaxDuration(dur);\n+\n+                    //Demonic Aegis\n+                    if (lvl >= 20)\n+                    {\n+                        for (auto i : NPCBots::index_array<uint8, MAX_SPELL_EFFECTS>)\n+                            if (AuraEffect* eff = armo->GetEffect(i))\n+                                eff->ChangeAmount(eff->GetAmount() * 13 / 10);\n+                    }\n+                }\n+            }\n+            //Chaotic Mind (custom)\n+            if (baseId == CHAOTIC_MIND)\n+            {\n+                if (Aura* mind = me->GetAura(spellId))\n+                {\n+                    uint32 dur = 30000; //30 sec\n+                    mind->SetDuration(dur);\n+                    mind->SetMaxDuration(dur);\n+                }\n+            }\n+            OnSpellHit(caster, spell);\n+        }\n+\n+        void SpellHitTarget(WorldObject* wtarget, SpellInfo const* spell) override\n+        {\n+            Unit* target = wtarget->ToUnit();\n+            if (!target)\n+                return;\n+\n+            uint32 spellId = spell->Id;\n+            uint32 baseId = spell->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+\n+            //Soulstone resurrection trigger (not ranked)\n+            if (spellId == SOULSTONE_RESURRECTION_1 || spellId == SOULSTONE_RESURRECTION_2 ||\n+                spellId == SOULSTONE_RESURRECTION_3 || spellId == SOULSTONE_RESURRECTION_4 ||\n+                spellId == SOULSTONE_RESURRECTION_5 || spellId == SOULSTONE_RESURRECTION_6 ||\n+                spellId == SOULSTONE_RESURRECTION_7)\n+            {\n+                hasSoulstone = false;\n+                //reduced for bot\n+                //soulstoneTimer = 15 * MINUTE * IN_MILLISECONDS;\n+                soulstoneTimer = 10 * MINUTE * IN_MILLISECONDS;\n+            }\n+\n+            //Improved Imp part 3\n+            if (lvl >= 10 && baseId == BLOOD_PACT_1 && botPet)\n+            {\n+                AuraEffect* pact = target->GetAuraEffect(spellId, 0, botPet->GetGUID());\n+                if (pact)\n+                    pact->ChangeAmount(pact->GetAmount() * 1.3f);\n+            }\n+\n+            //Improved Felhunter part 3\n+            if ((GetSpec() == BOT_SPEC_WARLOCK_AFFLICTION) && lvl >= 35 && baseId == FEL_INTELLIGENCE_1 && botPet)\n+            {\n+                Aura const* feli = target->GetAura(spellId, botPet->GetGUID());\n+                if (feli)\n+                {\n+                    for (auto i : NPCBots::index_array<uint8, EFFECT_2>) // 2 effects\n+                    {\n+                        if (AuraEffect* effi = feli->GetEffect(i))\n+                            effi->ChangeAmount(effi->GetAmount() + effi->GetAmount() / 10);\n+                    }\n+                }\n+            }\n+\n+            //Glyph of Unending Breath: swim speed\n+            if (/*lvl >= 15 && */baseId == UNENDING_BREATH_1)\n+            {\n+                AuraEffect* brea = target->GetAuraEffect(spellId, 1, me->GetGUID());\n+                if (brea)\n+                    brea->ChangeAmount(brea->GetAmount() + 20);\n+            }\n+\n+            //Chaotic Mind (custom)\n+            if (lvl >= 60 && target != me && GetSpec() != BOT_SPEC_WARLOCK_AFFLICTION &&\n+                spell->SpellFamilyName == SPELLFAMILY_WARLOCK && !spell->IsPositive())\n+            {\n+                if (urand(1,100) <= 5)\n+                    me->CastSpell(me, CHAOTIC_MIND, true);\n+            }\n+            if (baseId == IMMOLATE_1 || baseId == CORRUPTION_1)\n+            {\n+                if (Aura* per = target->GetAura(spellId, me->GetGUID()))\n+                {\n+                    //Improved Corruption and Immolate (37380): +3 sec duration for Immolate and Corruption\n+                    uint32 dur = per->GetDuration() + 3000;\n+                    //Molten Core: + 9 sec duration for Immolate\n+                    if ((GetSpec() == BOT_SPEC_WARLOCK_DESTRUCTION) && lvl >= 35 && baseId == IMMOLATE_1)\n+                        dur += 9000;\n+                    per->SetDuration(dur);\n+                    per->SetMaxDuration(dur);\n+                }\n+            }\n+            //Glyph of Death Coil: + 0.5 sec duration for Death Coil (2 sec on creatures)\n+            if (baseId == DEATH_COIL_1)\n+            {\n+                if (Aura* dc = target->GetAura(spellId, me->GetGUID()))\n+                {\n+                    uint32 dur = dc->GetDuration() + (target->IsPlayer() ? 500 : 2000);\n+                    dc->SetDuration(dur);\n+                    dc->SetMaxDuration(dur);\n+                }\n+            }\n+            //Improved Curse of Weakness: +20% increased effect\n+            if (baseId == CURSE_OF_WEAKNESS_1)\n+            {\n+                if (AuraEffect* weak = target->GetAuraEffect(spellId, 0, me->GetGUID()))\n+                {\n+                    weak->ChangeAmount(weak->GetAmount() * 12 / 10);\n+                }\n+            }\n+            //Glyph of Haunt: +3% increased effect\n+            if (lvl >= 60 && baseId == HAUNT_1)\n+            {\n+                if (AuraEffect* haun = target->GetAuraEffect(spellId, 2, me->GetGUID()))\n+                {\n+                    haun->ChangeAmount(haun->GetAmount() + 3);\n+                }\n+            }\n+\n+            OnSpellHitTarget(target, spell);\n+        }\n+\n+        void DamageDealt(Unit* victim, uint32& damage, DamageEffectType damageType) override\n+        {\n+            //Fel Synergy (Life Tap)\n+            if (damage && botPet && me->GetLevel() >= 10 && (damageType == SPELL_DIRECT_DAMAGE || damageType == DOT))\n+            {\n+                uint32 healVal = float(damage) * 0.15f;\n+                if (healVal)\n+                {\n+                    SpellInfo const* synhealInfo = sSpellMgr->GetSpellInfo(FEL_SYNERGY_HEAL);\n+                    HealInfo hinfo(me, botPet, healVal, synhealInfo, synhealInfo->GetSchoolMask());\n+                    botPet->HealBySpell(hinfo);\n+                }\n+            }\n+\n+            bot_ai::DamageDealt(victim, damage, damageType);\n+        }\n+\n+        void DamageTaken(Unit* u, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo*/) override\n+        {\n+            if (!u)\n+                return;\n+            if (!u->IsInCombat() && !me->IsInCombat())\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void OwnerAttackedBy(Unit* u) override\n+        {\n+            if (!u)\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void SummonBotPet()\n+        {\n+            if (botPet)\n+                UnsummonAll(false);\n+\n+            if (myPetType == BOT_PET_INVALID) //disabled\n+                return;\n+\n+            if (petSummonTimer > GetLastDiff())\n+                return;\n+\n+            uint32 entry;\n+\n+            if (myPetType)\n+                entry = myPetType;\n+            else if (me->GetLevel() >= 50 && GetSpec() == BOT_SPEC_WARLOCK_DEMONOLOGY)\n+                entry = BOT_PET_FELGUARD;\n+            else if (!IAmFree())\n+            {\n+                if (me->GetLevel() >= 30 && master->GetMaxPower(POWER_MANA) > 1 &&\n+                    !master->GetBotMgr()->HasBotClass(BOT_CLASS_MAGE) &&\n+                    !master->GetBotMgr()->HasBotClass(BOT_CLASS_PRIEST) &&\n+                    !master->GetBotMgr()->HasBotPetType(BOT_PET_FELHUNTER))\n+                    entry = BOT_PET_FELHUNTER;\n+                else if ((me->GetLevel() < 68 || !master->GetBotMgr()->HasBotClass(BOT_CLASS_WARRIOR)) &&\n+                    !master->GetBotMgr()->HasBotPetType(BOT_PET_IMP))\n+                    entry = BOT_PET_IMP;\n+                else if (me->GetLevel() >= 10 && IsTank())\n+                    entry = BOT_PET_VOIDWALKER;\n+                else if (me->GetLevel() >= 20 && !IsMeleeClass(master->GetClass()))\n+                    entry = BOT_PET_SUCCUBUS;\n+                else if (me->GetLevel() >= 10)\n+                    entry = BOT_PET_VOIDWALKER;\n+                else\n+                    entry = BOT_PET_IMP;\n+            }\n+            else\n+                entry = urand(BOT_PET_WARLOCK_START, BOT_PET_WARLOCK_END);\n+\n+            //ensurance\n+            if ((entry == BOT_PET_VOIDWALKER && me->GetLevel() < 10) ||\n+                (entry == BOT_PET_SUCCUBUS && me->GetLevel() < 20) ||\n+                (entry == BOT_PET_FELHUNTER && me->GetLevel() < 30) ||\n+                (entry == BOT_PET_FELGUARD && (me->GetLevel() < 50 || _spec != BOT_SPEC_WARLOCK_DEMONOLOGY)) ||\n+                (entry != BOT_PET_IMP && entry != BOT_PET_VOIDWALKER && entry != BOT_PET_SUCCUBUS &&\n+                entry != BOT_PET_FELHUNTER && entry != BOT_PET_FELGUARD))\n+                entry = 0;\n+\n+            myPetType = entry;\n+\n+            //try next time\n+            if (!myPetType)\n+                return;\n+\n+            ResetSpellCooldown(BLOOD_PACT_1);\n+            ResetSpellCooldown(FEL_INTELLIGENCE_1);\n+\n+            Position pos;\n+\n+            me->CastSpell(me, SUMMON_DEMON_VISUAL, true);\n+            Creature* myPet = me->SummonCreature(myPetType, *me, TEMPSUMMON_CORPSE_DESPAWN);\n+            me->GetNearPoint(myPet, pos.m_positionX, pos.m_positionY, pos.m_positionZ, 0, me->GetOrientation() + M_PI / 2);\n+            myPet->GetMotionMaster()->MovePoint(me->GetMapId(), pos);\n+            myPet->SetCreator(master);\n+            myPet->SetOwnerGUID(me->GetGUID());\n+            myPet->SetFaction(master->GetFaction());\n+            myPet->SetControlledByPlayer(!IAmFree());\n+            myPet->SetPvP(me->IsPvP());\n+            myPet->SetByteValue(UNIT_FIELD_BYTES_2, 1, master->GetByteValue(UNIT_FIELD_BYTES_2, 1));\n+\n+            //fix scale and equips\n+            switch (myPetType)\n+            {\n+                case BOT_PET_FELHUNTER:\n+                    myPet->SetObjectScale(1.1f);\n+                    break;\n+                case BOT_PET_FELGUARD:\n+                    myPet->SetObjectScale(0.75f);\n+                    myPet->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, 22199);\n+                    break;\n+            }\n+\n+            botPet = myPet;\n+        }\n+\n+        void UnsummonAll(bool savePets = true) override\n+        {\n+            UnsummonPet(savePets);\n+        }\n+\n+        void SummonedCreatureDies(Creature* /*summon*/, Unit* /*killer*/) override\n+        {\n+        }\n+\n+        void SummonedCreatureDespawn(Creature* summon) override\n+        {\n+            //all warlock bot pets despawn at death or manually (gossip, teleport, etc.)\n+            //BOT_LOG_ERROR(\"entities.unit\", \"SummonedCreatureDespawn: {}'s {}\", me->GetName(), summon->GetName());\n+            if (summon == botPet)\n+            {\n+                petSummonTimer = 10000;\n+                botPet = nullptr;\n+\n+                //party aura hack removal helper\n+                switch (summon->GetEntry())\n+                {\n+                    case BOT_PET_IMP:\n+                        me->RemoveAurasDueToSpell(InitSpell(me, BLOOD_PACT_1));\n+                        break;\n+                    case BOT_PET_FELHUNTER:\n+                        me->RemoveAurasDueToSpell(InitSpell(me, FEL_INTELLIGENCE_1));\n+                        break;\n+                }\n+            }\n+        }\n+\n+        float GetSpellAttackRange(bool longRange) const override\n+        {\n+            return longRange ? CalcSpellMaxRange(SHADOW_BOLT_1) : 20.f;\n+        }\n+\n+        uint32 GetAIMiscValue(uint32 data) const override\n+        {\n+            switch (data)\n+            {\n+                case CREATE_HEALTHSTONE_1:\n+                    return uint32(hasHealthstone);\n+                case BOTAI_MISC_PET_TYPE:\n+                    return myPetType;\n+                case BOTAI_MISC_PET_AVAILABLE_1:\n+                    return BOT_PET_IMP;\n+                case BOTAI_MISC_PET_AVAILABLE_2:\n+                    return me->GetLevel() >= 10 ? BOT_PET_VOIDWALKER : 0;\n+                case BOTAI_MISC_PET_AVAILABLE_3:\n+                    return me->GetLevel() >= 20 ? BOT_PET_SUCCUBUS : 0;\n+                case BOTAI_MISC_PET_AVAILABLE_4:\n+                    return me->GetLevel() >= 30 ? BOT_PET_FELHUNTER : 0;\n+                case BOTAI_MISC_PET_AVAILABLE_5:\n+                    return me->GetLevel() >= 50 && GetSpec() == BOT_SPEC_WARLOCK_DEMONOLOGY ? BOT_PET_FELGUARD : 0;\n+                default:\n+                    return 0;\n+            }\n+        }\n+\n+        void SetAIMiscValue(uint32 data, uint32 value) override\n+        {\n+            switch (data)\n+            {\n+                case CREATE_HEALTHSTONE_1:\n+                    hasHealthstone = bool(value);\n+                    break;\n+                case BOTAI_MISC_PET_TYPE:\n+                    myPetType = value;\n+                    UnsummonAll(false);\n+                    break;\n+                default:\n+                    break;\n+            }\n+\n+            bot_ai::SetAIMiscValue(data, value);\n+        }\n+\n+        void Reset() override\n+        {\n+            UnsummonAll(false);\n+\n+            fearTimer = 0;\n+            banishTimer = 0;\n+            unbanishTimer = 0;\n+            drainManaTimer = 0;\n+            healthstoneTimer = 0;\n+            soulstoneTimer = 0;\n+            lifeTapCheckTimer = 0;\n+            curseCheckTimer = 0;\n+\n+            petSummonTimer = 5000;\n+\n+            hasHealthstone = false;\n+            hasSoulstone = false;\n+\n+            DefaultInit();\n+        }\n+\n+        void ReduceCD(uint32 diff) override\n+        {\n+            if (fearTimer > diff)                   fearTimer -= diff;\n+            if (banishTimer > diff)                 banishTimer -= diff;\n+            if (unbanishTimer > diff)               unbanishTimer -= diff;\n+            if (drainManaTimer > diff)              drainManaTimer -= diff;\n+            if (healthstoneTimer > diff)            healthstoneTimer -= diff;\n+            if (soulstoneTimer > diff)              soulstoneTimer -= diff;\n+            if (lifeTapCheckTimer > diff)           lifeTapCheckTimer -= diff;\n+            if (curseCheckTimer > diff)             curseCheckTimer -= diff;\n+\n+            if (petSummonTimer > diff)              petSummonTimer -= diff;\n+        }\n+\n+        void InitPowers() override\n+        {\n+            me->SetPowerType(POWER_MANA);\n+\n+            if (botPet && botPet->GetPowerType() != POWER_MANA)\n+                botPet->SetByteValue(UNIT_FIELD_BYTES_0, 3, POWER_MANA);\n+        }\n+\n+        void InitSpells() override\n+        {\n+            uint8 lvl = me->GetLevel();\n+            bool isAffl = GetSpec() == BOT_SPEC_WARLOCK_AFFLICTION;\n+            //bool isDemo = GetSpec() == BOT_SPEC_WARLOCK_DEMONOLOGY;\n+            bool isDest = GetSpec() == BOT_SPEC_WARLOCK_DESTRUCTION;\n+\n+            InitSpellMap(CURSE_OF_WEAKNESS_1);\n+            InitSpellMap(CURSE_OF_AGONY_1);\n+            InitSpellMap(CURSE_OF_TONGUES_1);\n+            InitSpellMap(CURSE_OF_THE_ELEMENTS_1);\n+            InitSpellMap(SHADOW_BOLT_1);\n+            InitSpellMap(IMMOLATE_1);\n+            InitSpellMap(CORRUPTION_1);\n+            InitSpellMap(SEED_OF_CORRUPTION_1);\n+            InitSpellMap(INCINERATE_1);\n+            InitSpellMap(SEARING_PAIN_1);\n+            InitSpellMap(SOUL_FIRE_1);\n+            InitSpellMap(RAIN_OF_FIRE_1);\n+            InitSpellMap(HELLFIRE_1);\n+            InitSpellMap(SHADOWFLAME_1);\n+            InitSpellMap(FEAR_1);\n+            InitSpellMap(HOWL_OF_TERROR_1);\n+            InitSpellMap(DEATH_COIL_1);\n+            InitSpellMap(SOULSHATTER_1);\n+\n+            InitSpellMap(DRAIN_SOUL_1);\n+            InitSpellMap(DRAIN_MANA_1);\n+            InitSpellMap(BANISH_1);\n+\n+            InitSpellMap(DEMON_SKIN_1);\n+            InitSpellMap(DEMON_ARMOR_1);\n+            InitSpellMap(FEL_ARMOR_1);\n+            InitSpellMap(DETECT_INVISIBILITY_1);\n+            InitSpellMap(UNENDING_BREATH_1);\n+            InitSpellMap(SHADOW_WARD_1);\n+            InitSpellMap(LIFE_TAP_1);\n+            InitSpellMap(DARK_PACT_1);\n+            InitSpellMap(CREATE_HEALTHSTONE_1);\n+            InitSpellMap(CREATE_SOULSTONE_1);\n+\n+            InitSpellMap(RITUAL_OF_SUMMONING_1); //manual only\n+            InitSpellMap(RITUAL_OF_SOULS_1); //not casted\n+\n+  /*Talent*/lvl >= 30 && isAffl ? InitSpellMap(CURSE_OF_EXHAUSTION_1) : RemoveSpell(CURSE_OF_EXHAUSTION_1);\n+  /*Talent*/lvl >= 50 && isAffl ? InitSpellMap(UNSTABLE_AFFLICTION_1) : RemoveSpell(UNSTABLE_AFFLICTION_1);\n+  /*Talent*/lvl >= 60 && isAffl ? InitSpellMap(HAUNT_1) : RemoveSpell(HAUNT_1);\n+\n+  /*Talent*/lvl >= 20 && isDest ? InitSpellMap(SHADOWBURN_1) : RemoveSpell(SHADOWBURN_1);\n+  /*Talent*/lvl >= 40 && isDest ? InitSpellMap(CONFLAGRATE_1) : RemoveSpell(CONFLAGRATE_1);\n+  /*Talent*/lvl >= 50 && isDest ? InitSpellMap(SHADOWFURY_1) : RemoveSpell(SHADOWFURY_1);\n+  /*Talent*/lvl >= 60 && isDest ? InitSpellMap(CHAOS_BOLT_1) : RemoveSpell(CHAOS_BOLT_1);\n+        }\n+\n+        void ApplyClassPassives() const override\n+        {\n+            uint8 level = master->GetLevel();\n+            bool isAffl = GetSpec() == BOT_SPEC_WARLOCK_AFFLICTION;\n+            bool isDemo = GetSpec() == BOT_SPEC_WARLOCK_DEMONOLOGY;\n+            bool isDest = GetSpec() == BOT_SPEC_WARLOCK_DESTRUCTION;\n+\n+            RefreshAura(CHAOS_BOLT_PASSIVE);\n+            RefreshAura(DEMONIC_IMMOLATE_PASSIVE);\n+\n+            RefreshAura(IMPROVED_DRAIN_SOUL, level >= 15 ? 1 : 0);\n+            RefreshAura(SOUL_SIPHON, level >= 15 ? 1 : 0);\n+            RefreshAura(IMPROVED_FEAR, level >= 20 ? 1 : 0);\n+            RefreshAura(NIGHTFALL, level >= 25 ? 1 : 0);\n+            RefreshAura(SHADOW_EMBRACE, isAffl && level >= 30 ? 1 : 0);\n+            RefreshAura(SIPHON_LIFE, isAffl && level >= 30 ? 1 : 0);\n+            RefreshAura(ERADICATION, isAffl && level >= 40 ? 1 : 0);\n+            RefreshAura(PANDEMIC, isAffl && level >= 50 ? 1 : 0);\n+            RefreshAura(EVERLASTING_AFFLICTION, isAffl && level >= 55 ? 1 : 0);\n+\n+            RefreshAura(DEMONIC_RESILIENCE, isDemo && level >= 40 ? 1 : 0);\n+            RefreshAura(DECIMATION, isDemo && level >= 45 ? 1 : 0);\n+\n+            RefreshAura(IMPROVED_SHADOW_BOLT, level >= 10 ? 1 : 0);\n+            RefreshAura(AFTERMATH, level >= 15 ? 1 : 0);\n+            RefreshAura(BACKLASH, level >= 30 ? 1 : 0);\n+            RefreshAura(MOLTEN_CORE, isDest && level >= 35 ? 1 : 0);\n+            RefreshAura(NETHER_PROTECTION, isDest && level >= 35 ? 1 : 0);\n+            RefreshAura(SOUL_LEECH, isDest && level >= 40 ? 1 : 0);\n+            RefreshAura(PYROCLASM, isDest && level >= 40 ? 1 : 0);\n+            RefreshAura(IMPROVED_SOUL_LEECH, isDest && level >= 45 ? 1 : 0);\n+            RefreshAura(BACKDRAFT, isDest && level >= 50 ? 1 : 0);\n+\n+            RefreshAura(GLYPH_CORRUPTION, level >= 15 ? 1 : 0);\n+            RefreshAura(GLYPH_LIFE_TAP, level >= 15 ? 1 : 0);\n+            RefreshAura(GLYPH_FEAR, level >= 15 ? 1 : 0);\n+            RefreshAura(GLYPH_QUICK_DECAY, level >= 15 ? 1 : 0);\n+            RefreshAura(GLYPH_CONFLAGRATE, level >= 40 ? 1 : 0);\n+            RefreshAura(GLYPH_SHADOWFLAME, level >= 75 ? 1 : 0);\n+        }\n+\n+        bool CanUseManually(uint32 basespell) const override\n+        {\n+            switch (basespell)\n+            {\n+                case RAIN_OF_FIRE_1:\n+                case SHADOWFLAME_1:\n+                case HOWL_OF_TERROR_1:\n+                case DETECT_INVISIBILITY_1:\n+                case UNENDING_BREATH_1:\n+                //case RITUAL_OF_SUMMONING_1:\n+                case SHADOW_WARD_1:\n+                case LIFE_TAP_1:\n+                case DARK_PACT_1:\n+                    return true;\n+                //case FEL_ARMOR_1:\n+                //    return true;\n+                //case DEMON_ARMOR_1:\n+                //    return !GetSpell(FEL_ARMOR_1);\n+                //case DEMON_SKIN_1:\n+                //    return !GetSpell(FEL_ARMOR_1) && !GetSpell(DEMON_ARMOR_1);\n+                default:\n+                    return false;\n+            }\n+        }\n+\n+        std::vector<uint32> const* GetDamagingSpellsList() const override\n+        {\n+            return &Warlock_spells_damage;\n+        }\n+        std::vector<uint32> const* GetCCSpellsList() const override\n+        {\n+            return &Warlock_spells_cc;\n+        }\n+        //std::vector<uint32> const* GetHealingSpellsList() const override\n+        //{\n+        //    return &Warlock_spells_heal;\n+        //}\n+        std::vector<uint32> const* GetSupportSpellsList() const override\n+        {\n+            return &Warlock_spells_support;\n+        }\n+\n+    private:\n+        //Timers\n+        uint32 fearTimer, banishTimer, unbanishTimer, drainManaTimer, healthstoneTimer,\n+            soulstoneTimer, lifeTapCheckTimer, curseCheckTimer;\n+        //Pet\n+        uint32 myPetType;\n+        uint32 petSummonTimer;\n+        //Special\n+        mutable bool backlash, shadowtrance, backdraft, moltencore, chaoticmind;\n+        bool canShadowWard;\n+        bool longCasted; //some sort of rotation thing\n+        mutable bool instaCast;\n+        bool hasHealthstone, hasSoulstone;\n+\n+        uint32 _getCursesMask(Unit const* unit) const\n+        {\n+            uint32 mask = 0;\n+            for (auto const& [_, auraApp] : unit->GetAppliedAuras())\n+            {\n+                bool my_cast = auraApp->GetBase()->GetCasterGUID() == me->GetGUID();\n+                switch (auraApp->GetBase()->GetSpellInfo()->GetFirstRankSpell()->Id)\n+                {\n+                    case CURSE_OF_WEAKNESS_1:       mask |= CURSE_MASK_WEAKNESS | (my_cast ? CURSE_MASK_MY_WEAKNESS : CurseType(0));    break;\n+                    case CURSE_OF_AGONY_1:          mask |= CURSE_MASK_AGONY | (my_cast ? CURSE_MASK_MY_AGONY : CurseType(0));          break;\n+                    case CURSE_OF_DOOM_1:           mask |= CURSE_MASK_DOOM | (my_cast ? CURSE_MASK_MY_DOOM : CurseType(0));            break;\n+                    case CURSE_OF_THE_ELEMENTS_1:   mask |= CURSE_MASK_ELEMENTS | (my_cast ? CURSE_MASK_MY_ELEMENTS : CurseType(0));    break;\n+                    case CURSE_OF_TONGUES_1:        mask |= CURSE_MASK_TONGUES | (my_cast ? CURSE_MASK_MY_TONGUES : CurseType(0));      break;\n+                    case CURSE_OF_EXHAUSTION_1:     mask |= CURSE_MASK_EXHAUSTION | (my_cast ? CURSE_MASK_MY_EXHAUSTION : CurseType(0));break;\n+                    default:                                                                                                            break;\n+                }\n+            }\n+\n+            return mask;\n+        }\n+    };\n+};\n+\n+void AddSC_warlock_bot()\n+{\n+    new warlock_bot();\n+}\ndiff --git a/src/server/game/AI/NpcBots/bot_warrior_ai.cpp b/src/server/game/AI/NpcBots/bot_warrior_ai.cpp\nnew file mode 100644\nindex 0000000000..ce57528632\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bot_warrior_ai.cpp\n@@ -0,0 +1,2192 @@\n+#include \"bot_ai.h\"\n+#include \"botmgr.h\"\n+#include \"botspell.h\"\n+#include \"bottext.h\"\n+#include \"bottraits.h\"\n+#include \"Containers.h\"\n+#include \"Group.h\"\n+#include \"Item.h\"\n+#include \"Map.h\"\n+#include \"MotionMaster.h\"\n+#include \"MovementDefines.h\"\n+#include \"ObjectAccessor.h\"\n+#include \"Player.h\"\n+#include \"ScriptMgr.h\"\n+#include \"Spell.h\"\n+#include \"SpellAuraEffects.h\"\n+#include \"SpellMgr.h\"\n+\n+#include \"Formulas.h\"\n+/*\n+Warrior NpcBot (reworked by Trickerer onlysuffering@gmail.com)\n+Complete - 98%\n+TODO:\n+*/\n+\n+enum WarriorBaseSpells\n+{\n+    BATTLE_STANCE_1                         = 2457,\n+    DEFENSIVE_STANCE_1                      = 71,\n+    BERSERKER_STANCE_1                      = 2458,\n+\n+    INTIMIDATING_SHOUT_1                    = 5246,\n+    ENRAGED_REGENERATION_1                  = 55694,\n+    CHARGE_1                                = 100,\n+    OVERPOWER_1                             = 7384,\n+    TAUNT_1                                 = 355,\n+    BLOODRAGE_1                             = 2687,\n+    BERSERKER_RAGE_1                        = 18499,\n+    INTERCEPT_1                             = 20252,\n+    CLEAVE_1                                = 845,\n+    HAMSTRING_1                             = 1715,\n+    INTERVENE_1                             = 3411,\n+    WHIRLWIND_1                             = 1680,\n+    BLADESTORM_1                            = 46924,\n+    BATTLE_SHOUT_1                          = 6673,\n+    REND_1                                  = 772,\n+    EXECUTE_1                               = 5308,\n+    PUMMEL_1                                = 6552,\n+    BLOODTHIRST_1                           = 23881,\n+    MORTAL_STRIKE_1                         = 12294,\n+    SLAM_1                                  = 1464,\n+    SUNDER_ARMOR_1                          = 7386,\n+    SWEEPING_STRIKES_1                      = 12328,\n+    RECKLESSNESS_1                          = 1719,\n+    RETALIATION_1                           = 20230,\n+    DEATH_WISH_1                            = 12292,\n+    VICTORY_RUSH_1                          = 34428,\n+    THUNDER_CLAP_1                          = 6343,\n+    LAST_STAND_1                            = 12975,\n+    REVENGE_1                               = 6572,\n+    SHIELD_BLOCK_1                          = 2565,\n+    SHIELD_SLAM_1                           = 23922,\n+    SPELL_REFLECTION_1                      = 23920,\n+    DISARM_1                                = 676,\n+    SHIELD_WALL_1                           = 871,\n+    SHIELD_BASH_1                           = 72,\n+    HEROIC_THROW_1                          = 57755,\n+    CONCUSSION_BLOW_1                       = 12809,\n+    VIGILANCE_1                             = 50720,\n+    DEVASTATE_1                             = 20243,\n+    MOCKING_BLOW_1                          = 694,\n+    SHOCKWAVE_1                             = 46968,\n+    PIERCING_HOWL_1                         = 12323,\n+    HEROIC_STRIKE_1                         = 78,\n+    CHALLENGING_SHOUT_1                     = 1161,\n+    COMMANDING_SHOUT_1                      = 469,\n+    SHATTERING_THROW_1                      = 64382,\n+    DEMORALIZING_SHOUT_1                    = 1160,\n+    HEROIC_FURY_1                           = 60970\n+};\n+enum WarriorPassives\n+{\n+//Talents\n+    ARMORED_TO_THE_TEETH                    = 61222,//rank 3\n+    SHIELD_SPECIALIZATION                   = 12727,//rank 5\n+    DEEP_WOUNDS_1                           = 12834,\n+    DEEP_WOUNDS_2                           = 12849,\n+    DEEP_WOUNDS_3                           = 12867,\n+    BLOOD_CRAZE1                            = 16487,\n+    BLOOD_CRAZE2                            = 16489,\n+    BLOOD_CRAZE3                            = 16492,\n+    TOUGHNESS                               = 12764,//rank 5\n+    TWO_HANDED_WEAPON_SPECIALIZATION        = 12712,//rank 3\n+    TASTE_FOR_BLOOD1                        = 56636,\n+    TASTE_FOR_BLOOD2                        = 56637,\n+    TASTE_FOR_BLOOD3                        = 56638,\n+    DUAL_WIELD_SPECIALIZATION               = 23588,//rank 5\n+    IMPROVED_SPELL_REFLECTION               = 59089,//rank 2\n+    SWORD_SPEC1                             = 12281,\n+    SWORD_SPEC2                             = 12812,\n+    SWORD_SPEC3                             = 12813,\n+    SWORD_SPEC4                             = 12814,\n+    SWORD_SPEC5                             = 12815,\n+    IMPROVED_HAMSTRING                      = 23695,//rank 3\n+    TRAUMA1                                 = 46854,\n+    TRAUMA2                                 = 46855,\n+    FLURRY1                                 = 12319,\n+    FLURRY2                                 = 12971,\n+    FLURRY3                                 = 12972,\n+    FLURRY4                                 = 12973,\n+    FLURRY5                                 = 12974,\n+    ONE_HANDED_WEAPON_SPECIALIZATION        = 16542,//rank 5\n+    SECOND_WIND                             = 29838,//rank 2\n+    IMPROVED_DEFENSIVE_STANCE               = 29594,//rank 2\n+    JUGGERNAUGHT                            = 64976,\n+    FURIOUS_ATTACKS                         = 46911,//rank 2\n+    SAFEGUARD                               = 46949,//rank 2\n+    SUDDEN_DEATH                            = 29724,//rank 3\n+    ENDLESS_RAGE                            = 29623,\n+    BLOOD_FRENZY                            = 29859,\n+    RAMPAGE                                 = 29801,\n+    BLOODSURGE                              = 46915,//rank 3\n+    WARBRINGER                              = 57499,\n+    CRITICAL_BLOCK                          = 47296,//rank 3\n+    WRECKING_CREW                           = 56614,//rank 5\n+    DAMAGE_SHIELD                           = 58874,//rank 2\n+//other\n+    GLYPH_HEROIC_STRIKE                     = 58357,\n+    GLYPH_REVENGE                           = 58364,\n+    GLYPH_EXECUTION                         = 58367,\n+    GLYPH_BLOCKING                          = 58375,\n+    GLYPH_VIGILANCE                         = 63326,\n+    GLYPH_DEVASTATE                         = 58388,\n+\n+    WARRIOR_T10_PROT_4P                     = 70844 //bloodrage absorb\n+};\n+enum WarriorSpecial\n+{\n+    STANCE_NONE                             = 0,\n+    STANCE_BATTLE                           = 1,\n+    STANCE_DEFENSIVE                        = 2,\n+    STANCE_BERSERKER                        = 3,\n+\n+    TASTE_FOR_BLOOD_BUFF                    = 60503,\n+    SWORD_AND_BOARD_BUFF                    = 50227,\n+    BLOODSURGE_BUFF                         = 46916,//\"Slam!\"\n+    JUGGERNAUGHT_BUFF                       = 65156,\n+    GLYPH_REVENGE_BUFF                      = 58363,\n+    UNRELENTING_ASSAULT_SPELL               = 64850,\n+    VICTORIOUS_SPELL                        = 32216,\n+    REVENGE_STUN_SPELL                      = 12798,\n+    //SWORD_SPECIALIZATION_TRIGGERED          = 16459,\n+    VIGILANCE_PROC                          = 50725,\n+    IMPROVED_BERSERKER_RAGE_EFFECT          = 23691,//rank 2\n+    UNBRIDLED_WRATH_EFFECT                  = 12964,\n+    SUNDER_ARMOR_DEBUFF                     = 58567,\n+    GAG_ORDER_DEBUFF                        = 18498,//silence\n+    //SUDDEN_DEATH_BUFF                       = 52437,\n+    BLOODRAGE_PERIODIC_EFFECT               = 29131,\n+\n+    //VICTORIOUS_STATE_PASSIVE              = 32215,\n+    BERSERKER_STANCE_PASSIVE                = 7381\n+};\n+\n+static const std::vector<uint32> Warrior_spells_damage\n+{ BLADESTORM_1, BLOODTHIRST_1, CLEAVE_1, CONCUSSION_BLOW_1, DEVASTATE_1, EXECUTE_1, HEROIC_STRIKE_1, HEROIC_THROW_1,\n+INTERCEPT_1, MOCKING_BLOW_1, MORTAL_STRIKE_1, OVERPOWER_1, REND_1, RETALIATION_1, REVENGE_1, SHATTERING_THROW_1,\n+SHIELD_SLAM_1, SHOCKWAVE_1, SLAM_1, THUNDER_CLAP_1, VICTORY_RUSH_1, WHIRLWIND_1 };\n+static const std::vector<uint32> Warrior_spells_cc\n+{ CHARGE_1, INTERCEPT_1, INTIMIDATING_SHOUT_1, CONCUSSION_BLOW_1, DISARM_1, HAMSTRING_1, PIERCING_HOWL_1,\n+SHIELD_BASH_1, SHOCKWAVE_1 };\n+static const std::vector<uint32> Warrior_spells_support\n+{ BATTLE_SHOUT_1, COMMANDING_SHOUT_1, CHALLENGING_SHOUT_1, DEMORALIZING_SHOUT_1, BERSERKER_RAGE_1, BLOODRAGE_1,\n+DEATH_WISH_1, ENRAGED_REGENERATION_1, HEROIC_FURY_1, INTERVENE_1, LAST_STAND_1, PUMMEL_1, RECKLESSNESS_1,\n+RETALIATION_1, SHIELD_BASH_1, SHIELD_BLOCK_1, SHIELD_WALL_1, SPELL_REFLECTION_1, SUNDER_ARMOR_1, SWEEPING_STRIKES_1,\n+TAUNT_1, VIGILANCE_1 };\n+\n+static float rageIncomeMult;\n+static float rageLossMult;\n+\n+class warrior_bot : public CreatureScript\n+{\n+public:\n+    warrior_bot() : CreatureScript(\"warrior_bot\") { }\n+\n+    CreatureAI* GetAI(Creature* creature) const override\n+    {\n+        return new warrior_botAI(creature);\n+    }\n+/*\n+    bool OnGossipHello(Player* player, Creature* creature)\n+    {\n+        return creature->GetBotAI()->OnGossipHello(player, 0);\n+    }\n+\n+    bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action)\n+    {\n+        if (bot_ai* ai = creature->GetBotAI())\n+            return ai->OnGossipSelect(player, creature, sender, action);\n+        return true;\n+    }\n+\n+    bool OnGossipSelectCode(Player* player, Creature* creature, uint32 sender, uint32 action, char const* code)\n+    {\n+        if (bot_ai* ai = creature->GetBotAI())\n+            return ai->OnGossipSelectCode(player, creature, sender, action, code);\n+        return true;\n+    }\n+*/\n+    struct warrior_botAI : public bot_ai\n+    {\n+        warrior_botAI(Creature* creature) : bot_ai(creature)\n+        {\n+            _botclass = BOT_CLASS_WARRIOR;\n+\n+            InitUnitFlags();\n+        }\n+\n+        bool doCast(Unit* victim, uint32 spellId)\n+        {\n+            if (CheckBotCast(victim, spellId) != SPELL_CAST_OK)\n+                return false;\n+            return bot_ai::doCast(victim, spellId);\n+        }\n+\n+        uint8 GetBotStance() const override\n+        {\n+            if (_inStance(1))\n+                return WARRIOR_BATTLE_STANCE;\n+            else if (_inStance(2))\n+                return WARRIOR_DEFENSIVE_STANCE;\n+            else if (_inStance(3))\n+                return WARRIOR_BERSERKER_STANCE;\n+\n+            return BOT_STANCE_NONE;\n+        }\n+\n+        void StartAttack(Unit* u, bool force = false)\n+        {\n+            if (!bot_ai::StartAttack(u, force))\n+                return;\n+            GetInPosition(force, u);\n+        }\n+\n+        void JustEnteredCombat(Unit* u) override { bot_ai::JustEnteredCombat(u); }\n+        void KilledUnit(Unit* u) override\n+        {\n+            //Victorious State spell\n+            //only on targets which give xp or honor\n+            if (u->GetLevel() > Bcore::XP::GetGrayLevel(me->GetLevel()))\n+                me->CastSpell(me, VICTORIOUS_SPELL, true);\n+\n+            bot_ai::KilledUnit(u);\n+        }\n+        void EnterEvadeMode(EvadeReason why = EVADE_REASON_OTHER) override { bot_ai::EnterEvadeMode(why); }\n+        void MoveInLineOfSight(Unit* u) override { bot_ai::MoveInLineOfSight(u); }\n+        void JustDied(Unit* u) override { bot_ai::JustDied(u); }\n+        void DoNonCombatActions(uint32 /*diff*/) { }\n+\n+        //void modrage(int32 mod, bool set = false)\n+        //{\n+        //    if (set && mod < 0)\n+        //        return;\n+        //    if (mod < 0 && rage < abs(mod))\n+        //    {\n+        //        //debug set rage to 0\n+        //        mod = 0;\n+        //        set = true;\n+        //        return;\n+        //    }\n+\n+        //    if (set)\n+        //        rage = mod ? mod*10 : 0;\n+        //    else\n+        //        rage += mod*10;\n+\n+        //    me->SetPower(POWER_RAGE, rage);\n+        //}\n+\n+        void getrage()\n+        {\n+            rage = me->GetPower(POWER_RAGE);\n+            if (me->FindCurrentSpellBySpellId(GetSpell(CLEAVE_1)))\n+                rage = std::max<int32>(rage - 200, 0);\n+            else if (me->FindCurrentSpellBySpellId(GetSpell(HEROIC_STRIKE_1)))\n+                rage = std::max<int32>(rage - rcost(HEROIC_STRIKE_1), 0);\n+        }\n+\n+        int32 rcost(uint32 spellId) const\n+        {\n+            if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId))\n+                return spellInfo->CalcPowerCost(me, spellInfo->GetSchoolMask());\n+            return 0;\n+        }\n+\n+        void BreakCC(uint32 diff) override\n+        {\n+            if (IsSpellReady(HEROIC_FURY_1, diff) && Rand() < 55 &&\n+                (CCed(me, true) || me->HasAuraWithMechanic(1u<<MECHANIC_SNARE)))\n+            {\n+                if (doCast(me, GetSpell(HEROIC_FURY_1)))\n+                    return;\n+            }\n+            if (IsSpellReady(BERSERKER_RAGE_1, diff) && Rand() < 45 &&\n+                !me->GetAuraEffect(SPELL_AURA_MECHANIC_IMMUNITY, SPELLFAMILY_WARRIOR, 0x0, 0x20000, 0x0) &&\n+                /*!me->HasAura(ENRAGED_REGENERATION_1)*/\n+                me->HasAuraWithMechanic((1u<<MECHANIC_FEAR)|(1u<<MECHANIC_SAPPED)|(1u<<MECHANIC_KNOCKOUT)))\n+            {\n+                if (doCast(me, GetSpell(BERSERKER_RAGE_1)))\n+                    return;\n+            }\n+            bot_ai::BreakCC(diff);\n+        }\n+\n+        void UpdateAI(uint32 diff) override\n+        {\n+            if (me->IsAlive())\n+            {\n+                if (ragetimer2 <= diff)\n+                {\n+                    ragetimer2 = 3000;\n+                    //Anger Management\n+                    if (me->IsInCombat() && me->GetLevel() >= 20)\n+                    {\n+                        if (me->GetPower(POWER_RAGE) < 990)\n+                            me->SetPower(POWER_RAGE, me->GetPower(POWER_RAGE) + uint32(10.f * rageIncomeMult)); //1 rage per 3 sec\n+                        else\n+                            me->SetPower(POWER_RAGE, 1000); //max\n+                    }\n+                }\n+                if (ragetimer <= diff)\n+                {\n+                    ragetimer = 1500;\n+                    if (!me->IsInCombat() &&\n+                        !me->HasAuraTypeWithFamilyFlags(SPELL_AURA_PERIODIC_ENERGIZE, SPELLFAMILY_WARRIOR, 0x100))\n+                    {\n+                        if (me->GetPower(POWER_RAGE) > uint32(10.f * rageLossMult))\n+                            me->SetPower(POWER_RAGE, me->GetPower(POWER_RAGE) - uint32(10.f * rageLossMult)); //-1 rage per 1.5 sec\n+                        else\n+                            me->SetPower(POWER_RAGE, 0); //min\n+                    }\n+                }\n+                getrage();\n+            }\n+\n+            if (!GlobalUpdate(diff))\n+                return;\n+\n+            DoVehicleActions(diff);\n+            if (!CanBotAttackOnVehicle())\n+                return;\n+\n+            if (IsPotionReady())\n+            {\n+                if (GetHealthPCT(me) < 40)\n+                    DrinkPotion(false);\n+            }\n+\n+            CheckRacials(diff);\n+\n+            CheckShouts(diff);\n+            CheckVigilance(diff);\n+            CheckIntervene(diff);\n+            CheckSpellReflect(diff);\n+\n+            if (me->IsInCombat())\n+                CheckShatteringThrow(diff);\n+            else\n+                DoNonCombatActions(diff);\n+\n+            if (IsCasting())\n+                return;\n+\n+            if (ProcessImmediateNonAttackTarget())\n+                return;\n+\n+            if (!CheckAttackTarget())\n+            {\n+                if (!me->IsInCombat() && stancetimer <= diff && Rand() < 5 && me->getAttackers().empty() && rage <= 250)\n+                {\n+                    uint8 mystance = 0;\n+                    if (IsTank())\n+                    {\n+                        if (!_inStance(2))\n+                            mystance = 2;\n+                    }\n+                    else\n+                        mystance = 1;\n+\n+                    if (mystance)\n+                        stanceChange(diff, mystance);\n+                }\n+                return;\n+            }\n+\n+            CheckUsableItems(diff);\n+\n+            Attack(diff);\n+        }\n+\n+        void Attack(uint32 diff)\n+        {\n+            Unit* mytar = opponent ? opponent : disttarget ? disttarget : nullptr;\n+            if (!mytar)\n+                return;\n+\n+            StartAttack(mytar, IsMelee());\n+\n+            CheckAttackState();\n+            if (!me->IsAlive() || !mytar->IsAlive())\n+                return;\n+\n+            bool const isFury = GetSpec() == BOT_SPEC_WARRIOR_FURY;\n+            bool const isArms = GetSpec() == BOT_SPEC_WARRIOR_ARMS;\n+\n+            //Keep stance in combat\n+            if (stancetimer <= diff && Rand() < 10 + 15 * (me->GetPower(POWER_RAGE) <= 250))\n+            {\n+                uint8 mystance;\n+                if (IsTank())\n+                    mystance = 2;\n+                else if (isFury && me->GetLevel() >= 30)\n+                    mystance = 3;\n+                else\n+                    mystance = 1;\n+\n+                stanceChange(diff, mystance);\n+            }\n+\n+            if (IsSpellReady(BLOODRAGE_1, diff, false) && me->IsInCombat() && rage < 600 && Rand() < 20 &&\n+                !me->GetAuraEffect(SPELL_AURA_MECHANIC_IMMUNITY, SPELLFAMILY_WARRIOR, 0x0, 0x20000, 0x0)\n+                /*!me->HasAura(ENRAGED_REGENERATION_1)*/)\n+            {\n+                if (doCast(me, GetSpell(BLOODRAGE_1)))\n+                    getrage();\n+            }\n+\n+            getrage();\n+\n+            //SelfHeal\n+            if (IsSpellReady(ENRAGED_REGENERATION_1, diff) && Rand() < 80 && GetHealthPCT(me) < 40 &&\n+                rage >= rcost(ENRAGED_REGENERATION_1) && me->HasAuraWithMechanic(1u<<MECHANIC_ENRAGED))\n+            {\n+                if (doCast(me, GetSpell(ENRAGED_REGENERATION_1)))\n+                    return;\n+            }\n+\n+            Unit::AttackerSet const& b_attackers = me->getAttackers();\n+            float dist = me->GetDistance(mytar);\n+\n+            //FEAR\n+            if (IsSpellReady(INTIMIDATING_SHOUT_1, diff) && Rand() < 70 && rage >= rcost(INTIMIDATING_SHOUT_1))\n+            {\n+                if (mytar->IsNonMeleeSpellCast(false, false, true) && dist < 5 &&\n+                    mytar->GetCreatureType() != CREATURE_TYPE_UNDEAD)\n+                {\n+                    if (doCast(mytar, GetSpell(INTIMIDATING_SHOUT_1)))\n+                        return;\n+                }\n+                Unit::AttackerSet const& m_attackers = master->getAttackers();\n+                Unit* fearTarget = nullptr;\n+                uint8 tCount = 0;\n+                //fear master's attackers\n+                if (!m_attackers.empty() &&\n+                    ((master->GetClass() != BOT_CLASS_DEATH_KNIGHT &&\n+                    master->GetClass() != BOT_CLASS_WARRIOR &&\n+                    master->GetClass() != BOT_CLASS_PALADIN) ||\n+                    GetHealthPCT(master) < 70))\n+                {\n+                    for (Unit* attacker : m_attackers)\n+                    {\n+                        if (!attacker) continue;\n+                        if (attacker->GetCreatureType() == CREATURE_TYPE_UNDEAD) continue;\n+                        if (me->GetDistance((attacker)) < 7.5f)\n+                            ++tCount;\n+                        if (!fearTarget && me->GetDistance(attacker) < 5)\n+                            fearTarget = attacker;\n+                        if (fearTarget && tCount > 1)\n+                            break;\n+                    }\n+                    if (fearTarget && tCount > 1 && doCast(fearTarget, GetSpell(INTIMIDATING_SHOUT_1)))\n+                        return;\n+                }\n+                //Defend myself\n+                if (b_attackers.size() > 1 && (!IsTank() || GetHealthPCT(me) < 50))\n+                {\n+                    tCount = 0;\n+                    fearTarget = nullptr;\n+                    for (Unit* attacker : b_attackers)\n+                    {\n+                        if (!attacker) continue;\n+                        if (attacker->GetCreatureType() == CREATURE_TYPE_UNDEAD) continue;\n+                        if (me->GetDistance((attacker)) < 7.5f)\n+                            ++tCount;\n+                        if (!fearTarget && me->GetDistance(attacker) < 5)\n+                            fearTarget = attacker;\n+                        if (fearTarget && tCount > 1)\n+                            break;\n+                    }\n+                    if (fearTarget && tCount > 1 && doCast(fearTarget, GetSpell(INTIMIDATING_SHOUT_1)))\n+                        return;\n+                }\n+            }//end FEAR\n+\n+            //LAST STAND\n+            if (IsSpellReady(LAST_STAND_1, diff, false) &&\n+                GetHealthPCT(me) < (30 + 20 * (b_attackers.size() > 1) + 10 * me->HasAuraType(SPELL_AURA_PERIODIC_DAMAGE)))\n+            {\n+                if (doCast(me, GetSpell(LAST_STAND_1)))\n+                    return;\n+            }\n+\n+            Unit const* u = mytar->GetVictim();\n+\n+            //TAUNT //No GCD\n+            if (IsSpellReady(TAUNT_1, diff, false) && u && u != me && Rand() < 50 && dist < 30 &&\n+                mytar->CanHaveThreatList() && !CCed(mytar) && !mytar->HasAuraType(SPELL_AURA_MOD_TAUNT) &&\n+                (!IsTank(u) || (IsTank() && GetHealthPCT(me) > 67 &&\n+                (GetHealthPCT(u) < 30 || (IsOffTank() && !IsOffTank(u) && IsPointedOffTankingTarget(mytar)) ||\n+                (!IsOffTank() && IsOffTank(u) && IsPointedTankingTarget(mytar))))) &&\n+                ((!IsTankingClass(u->GetClass()) && (GetHealthPCT(u) < 80 || _inStance(2))) || IsTank()) &&\n+                IsInBotParty(u) &&\n+                (_inStance(2) || (stancetimer <= diff && stanceChange(diff, 2))))\n+            {\n+                if (doCast(mytar, GetSpell(TAUNT_1)))\n+                    return;\n+            }\n+            //TAUNT 2 (distant)\n+            if (IsSpellReady(TAUNT_1, diff, false) && !IAmFree() && u == me && Rand() < 35 && IsTank() &&\n+                (IsOffTank() || master->GetBotMgr()->GetNpcBotsCountByRole(BOT_ROLE_TANK_OFF) == 0) &&\n+                !(me->GetLevel() >= 40 && mytar->IsCreature() &&\n+                (mytar->ToCreature()->IsDungeonBoss() || mytar->ToCreature()->isWorldBoss())) &&\n+                (_inStance(2) || stancetimer <= diff))\n+            {\n+                Unit* tUnit = FindDistantTauntTarget();\n+                if (tUnit && (_inStance(2) || (stancetimer <= diff && stanceChange(diff, 2))))\n+                {\n+                    if (doCast(tUnit, GetSpell(TAUNT_1)))\n+                        return;\n+                }\n+            }\n+            //CHARGE (warbringer)\n+            if (IsSpellReady(CHARGE_1, diff, false) && !HasRole(BOT_ROLE_RANGED) && Rand() < 70 &&\n+                !HasBotCommandState(BOT_COMMAND_STAY) &&\n+                !(IsTank() && mytar->IsCreature() && mytar->ToCreature()->isWorldBoss()) &&\n+                dist > 8 && dist < CalcSpellMaxRange(CHARGE_1) &&\n+                ((IsTank() && me->GetLevel() >= 50) ||\n+                (!me->IsInCombat() && (_inStance(1) || (stancetimer <= diff && stanceChange(diff, 1))))))\n+            {\n+                if (doCast(mytar, GetSpell(CHARGE_1)))\n+                    return;\n+            }\n+            //INTERCEPT (warbringer)\n+            if (IsSpellReady(INTERCEPT_1, diff, false) && !HasRole(BOT_ROLE_RANGED) && HasRole(BOT_ROLE_DPS) &&\n+                !HasBotCommandState(BOT_COMMAND_STAY) &&\n+                !(IsTank() && mytar->IsCreature() && mytar->ToCreature()->isWorldBoss()) &&\n+                //!me->HasUnitState(UNIT_STATE_CHARGING) &&\n+                !(me->GetMotionMaster()->GetCurrentMovementGenerator() && me->GetMotionMaster()->GetCurrentMovementGenerator()->BaseUnitState == UNIT_STATE_CHARGING) && //not charging\n+                (me->IsInCombat() || !IsSpellReady(CHARGE_1, diff, false)) &&\n+                Rand() < 60 && dist > 10 && dist < 25 && !CCed(mytar) && rage >= rcost(INTERCEPT_1) &&\n+                ((IsTank() && me->GetLevel() >= 50) ||\n+                (!IsTank() && (_inStance(3) || (stancetimer <= diff && stanceChange(diff, 3))))))\n+            {\n+                if (doCast(mytar, GetSpell(INTERCEPT_1)))\n+                    return;\n+            }\n+            //CHALLENGING SHOUT\n+            if (IsSpellReady(CHALLENGING_SHOUT_1, diff) && Rand() < 40 &&\n+                !(u == me && me->GetLevel() >= 40 && mytar->IsCreature() &&\n+                (mytar->ToCreature()->IsDungeonBoss() || mytar->ToCreature()->isWorldBoss())) &&\n+                rage >= rcost(CHALLENGING_SHOUT_1))\n+            {\n+                if (IsTank())\n+                {\n+                    std::list<Unit*> targets;\n+                    GetNearbyTargetsList(targets, 9.f, 1);\n+                    uint8 count = 0;\n+                    for (Unit const* target : targets)\n+                    {\n+                        if (!(target->GetVictim() && IsTank(target->GetVictim())))\n+                            if (++count > 1)\n+                                break;\n+                    }\n+                    if (count > 1 && doCast(me, GetSpell(CHALLENGING_SHOUT_1)))\n+                        return;\n+                }\n+                if (u && u != me && !IsSpellReady(TAUNT_1, diff, false) && !IsTank(u) && !CCed(mytar) && dist < 9 &&\n+                    (!IsTankingClass(u->GetClass()) || IsTank()) && IsInBotParty(u))\n+                {\n+                    if (doCast(me, GetSpell(CHALLENGING_SHOUT_1)))\n+                        return;\n+                }\n+            }\n+\n+            bool can_do_normal = CanAffectVictimAny(mytar, SPELL_SCHOOL_NORMAL);\n+\n+            //BERSERKER RAGE (for rage)\n+            if (IsSpellReady(BERSERKER_RAGE_1, diff) && Rand() < 15 && rage < 80/* && me->GetLevel() >= 35*/)\n+            {\n+                if (doCast(me, GetSpell(BERSERKER_RAGE_1)))\n+                    return;\n+            }\n+            //MOCKING BLOW\n+            if (IsSpellReady(MOCKING_BLOW_1, diff) && can_do_normal && HasRole(BOT_ROLE_DPS) && Rand() < 70 && u && u != me &&\n+                !IsTank(u) && dist < 5 && rage >= rcost(MOCKING_BLOW_1) &&\n+                !CCed(mytar) && (!IsTankingClass(u->GetClass()) || IsTank()) && IsInBotParty(u) &&\n+                (_inStance(4) || (stancetimer <= diff && stanceChange(diff, 4))))\n+            {\n+                if (doCast(mytar, GetSpell(MOCKING_BLOW_1)))\n+                    return;\n+            }\n+            //SHIELD SLAM\n+            if (IsSpellReady(SHIELD_SLAM_1, diff) && can_do_normal && HasRole(BOT_ROLE_DPS) && CanBlock() &&\n+                (_inStance(4) || stancetimer <= diff) && dist <= 5 && rage >= rcost(SHIELD_SLAM_1) &&\n+                Rand() < (75 + 200*(me->GetAuraEffect(SPELL_AURA_ADD_PCT_MODIFIER, SPELLFAMILY_WARRIOR, 2780, 0) != nullptr)\n+                /*me->HasAura(SWORD_AND_BOARD_BUFF)*/))\n+            {\n+                //check Shield Block\n+                if (IsSpellReady(SHIELD_BLOCK_1, diff, false) && (_inStance(2) || (IsTank() && stanceChange(diff, 2))))\n+                {\n+                    if (doCast(me, GetSpell(SHIELD_BLOCK_1)))\n+                    {}\n+                }\n+                if (_inStance(4) || stanceChange(diff, 4))\n+                {\n+                    if (doCast(mytar, GetSpell(SHIELD_SLAM_1)))\n+                        return;\n+                }\n+            }\n+            //SHIELD BLOCK\n+            if (IsSpellReady(SHIELD_BLOCK_1, diff, false) && CanBlock() && Rand() < 70 &&\n+                (_inStance(2) || stancetimer <= diff) &&\n+                ((u == me && dist < 8) || (!b_attackers.empty() && me->GetDistance2d(*(b_attackers.begin())) < 8)) &&\n+                GetHealthPCT(me) < (65 + 8 * uint8(b_attackers.size())))\n+            {\n+                if ((_inStance(2) || stanceChange(diff, 2)) &&\n+                    doCast(me, GetSpell(SHIELD_BLOCK_1)))\n+                    return;\n+            }\n+            //SHOCKWAVE - frontal cone\n+            if (IsSpellReady(SHOCKWAVE_1, diff) && can_do_normal && HasRole(BOT_ROLE_DPS) && dist < 8.f && !CCed(mytar) &&\n+                rage >= rcost(SHOCKWAVE_1) && Rand() < (70 + 70 * mytar->IsNonMeleeSpellCast(false)) &&\n+                me->HasInArc(float(M_PI)/2, mytar) && mytar->IsWithinLOSInMap(me, LINEOFSIGHT_ALL_CHECKS, VMAP::ModelIgnoreFlags::M2))\n+            {\n+                if (doCast(me, GetSpell(SHOCKWAVE_1)))\n+                    return;\n+            }\n+            //HEROIC THROW\n+            if (IsSpellReady(HEROIC_THROW_1, diff) && can_do_normal && HasRole(BOT_ROLE_DPS) && dist < 30 &&\n+                (mytar->IsCreature() || dist > 6) &&\n+                Rand() < (20 - 15 * CanBlock() + 90 * mytar->IsNonMeleeSpellCast(false,false,true)))\n+            {\n+                if (doCast(mytar, GetSpell(HEROIC_THROW_1)))\n+                    return;\n+            }\n+            //THUNDER CLAP\n+            if (IsSpellReady(THUNDER_CLAP_1, diff) && HasRole(BOT_ROLE_DPS) && !isFury && Rand() < 40 &&\n+                (_inStance(4) || stancetimer <= diff) && dist < 7.5f && rage >= rcost(THUNDER_CLAP_1) &&\n+                ((IsTank() && b_attackers.size() > 1) ||\n+                (mytar->GetHealth() > me->GetMaxHealth() / 2 &&\n+                !mytar->HasAuraTypeWithFamilyFlags(SPELL_AURA_MOD_MELEE_HASTE, SPELLFAMILY_WARRIOR, 0x80)) ||\n+                FindSplashTarget(7.5f, mytar, 15.f)))\n+            {\n+                if (_inStance(4) || (me->GetLevel() >= 20 && stanceChange(diff, 4)))\n+                {\n+                    if (doCast(me, GetSpell(THUNDER_CLAP_1)))\n+                        return;\n+                }\n+            }\n+            //REVENGE\n+            if (IsSpellReady(REVENGE_1, diff) && can_do_normal && HasRole(BOT_ROLE_DPS) && IsTank() && me->HasReactive(REACTIVE_DEFENSE) &&\n+                Rand() < 150 && (_inStance(2) || stancetimer <= diff) && dist < 5 && rage >= rcost(REVENGE_1))\n+            {\n+                if (_inStance(2) || stanceChange(diff, 2))\n+                {\n+                    if (doCast(mytar, GetSpell(REVENGE_1)))\n+                        return;\n+                }\n+            }\n+            //CONCUSSION BLOW\n+            if (IsSpellReady(CONCUSSION_BLOW_1, diff) && can_do_normal && HasRole(BOT_ROLE_DPS) && !CCed(mytar) &&\n+                dist < 5 && rage >= rcost(CONCUSSION_BLOW_1) &&\n+                mytar->GetDiminishing(DIMINISHING_STUN) <= DIMINISHING_LEVEL_2 &&\n+                Rand() < (30 + 60 * mytar->IsNonMeleeSpellCast(false,false,true)))\n+            {\n+                if (doCast(mytar, GetSpell(CONCUSSION_BLOW_1)))\n+                    return;\n+            }\n+\n+            MoveBehind(mytar);\n+\n+            //SHIELD BASH - shared cd with pummel\n+            if (IsSpellReady(SHIELD_BASH_1, diff, false) && can_do_normal && CanBlock() && Rand() < 80 &&\n+                (_inStance(4) || stancetimer <= diff) &&\n+                dist < 5 && rage >= rcost(SHIELD_BASH_1) && mytar->IsNonMeleeSpellCast(false,false,true))\n+            {\n+                if ((_inStance(4) || stanceChange(diff, 4)) &&\n+                    doCast(mytar, GetSpell(SHIELD_BASH_1)))\n+                    return;\n+            }\n+            //PUMMEL - shared cd with shield bash\n+            if (IsSpellReady(PUMMEL_1, diff, false) && can_do_normal && !IsTank() && !CanBlock() && Rand() < 80 &&\n+                dist < 5 && (_inStance(3) || stancetimer <= diff) &&\n+                rage >= rcost(PUMMEL_1) && mytar->IsNonMeleeSpellCast(false,false,true))\n+            {\n+                if ((_inStance(3) || stanceChange(diff, 3)) &&\n+                    doCast(mytar, GetSpell(PUMMEL_1)))\n+                    return;\n+            }\n+            //HAMSTRING\n+            if (IsSpellReady(HAMSTRING_1, diff) && can_do_normal && Rand() < 70 && (_inStance(5) || stancetimer <= diff) &&\n+                (!GetSpell(PIERCING_HOWL_1) || mytar->IsPlayer()) &&\n+                (mytar->isMoving() || mytar->IsPlayer()) && dist < 5 && rage >= rcost(HAMSTRING_1) &&\n+                !mytar->HasAuraWithMechanic(1u<<MECHANIC_SNARE))\n+            {\n+                if (_inStance(5) || (me->GetLevel() >= 15 && stanceChange(diff, 5)))\n+                    if (doCast(mytar, GetSpell(HAMSTRING_1)))\n+                        return;\n+            }\n+            //PIERCING HOWL\n+            if (IsSpellReady(PIERCING_HOWL_1, diff) && can_do_normal && mytar->isMoving() && Rand() < 80 &&\n+                dist < 9 && rage >= rcost(PIERCING_HOWL_1) && !mytar->HasAuraWithMechanic(1u<<MECHANIC_SNARE))\n+            {\n+                if (doCast(me, GetSpell(PIERCING_HOWL_1)))\n+                    return;\n+            }\n+            //DISARM\n+            if (IsSpellReady(DISARM_1, diff) && can_do_normal && dist < 5 && (_inStance(2) || stancetimer <= diff) &&\n+                Rand() < (35 + 55*mytar->HasAuraType(SPELL_AURA_ALLOW_ONLY_ABILITY)) &&\n+                !mytar->HasAuraType(SPELL_AURA_MOD_DISARM) &&\n+                mytar->GetHealth() > me->GetMaxHealth() / 8 * (1 + mytar->getAttackers().size()) &&\n+                rage >= rcost(DISARM_1))\n+            {\n+                //check weapons\n+                bool hasWeapon = true;\n+                if (mytar->IsCreature() && !mytar->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID))\n+                    hasWeapon = false;\n+                else if (Player const* pla = mytar->ToPlayer())\n+                    if (!pla->GetWeaponForAttack(BASE_ATTACK) || !pla->IsUseEquipedWeapon(true))\n+                        hasWeapon = false;\n+\n+                if (hasWeapon && (_inStance(2) || stanceChange(diff, 2)) &&\n+                    doCast(mytar, GetSpell(DISARM_1)))\n+                    return;\n+            }\n+            //DEMORALIZING SHOUT\n+            if (IsSpellReady(DEMORALIZING_SHOUT_1, diff) && can_do_normal && Rand() < 15 + 25 * IsTank() && dist < 10 &&\n+                (mytar->GetClass() == CLASS_WARRIOR || mytar->GetClass() == CLASS_ROGUE ||\n+                (mytar->IsCreature() && mytar->ToCreature()->GetCreatureTemplate()->rank != CREATURE_ELITE_NORMAL)) &&\n+                mytar->GetHealth() > me->GetMaxHealth() / 8 * (1 + mytar->getAttackers().size()) &&\n+                rage >= rcost(DEMORALIZING_SHOUT_1) &&\n+                !mytar->HasAuraTypeWithFamilyFlags(SPELL_AURA_MOD_ATTACK_POWER, SPELLFAMILY_WARRIOR, 0x20000))\n+            {\n+                if (doCast(me, GetSpell(DEMORALIZING_SHOUT_1)))\n+                    return;\n+            }\n+\n+            //UBERS\n+            //Shield Wall\n+            if (IsSpellReady(SHIELD_WALL_1, diff, false) && CanBlock() &&\n+                GetHealthPCT(me) < (30 + 4 * b_attackers.size() + 20ull * (mytar->IsCreature() && mytar->ToCreature()->isWorldBoss())) &&\n+                (_inStance(2) || stanceChange(diff, 2)))\n+            {\n+                if (doCast(me, GetSpell(SHIELD_WALL_1)))\n+                    return;\n+            }\n+            //Retaliation\n+            if (IsSpellReady(RETALIATION_1, diff) && HasRole(BOT_ROLE_DPS) && !CanBlock() && Rand() < 40 &&\n+                !me->HasAuraType(SPELL_AURA_MOD_DISARM) && b_attackers.size() > 4 &&\n+                (_inStance(1) || stanceChange(diff, 1)))\n+            {\n+                if (doCast(me, GetSpell(RETALIATION_1)))\n+                    return;\n+            }\n+            //Recklessness\n+            if (IsSpellReady(RECKLESSNESS_1, diff) && can_do_normal && HasRole(BOT_ROLE_DPS) && !CanBlock() && !IsTank() && Rand() < 60 &&\n+                GetHealthPCT(me) > 50 && (_inStance(3) || stancetimer <= diff) && b_attackers.size() < 2 &&\n+                (mytar->GetHealth() > me->GetHealth()/2 * (1 + mytar->getAttackers().size()) || mytar->IsControlledByPlayer()) &&\n+                !me->GetAuraEffect(SPELL_AURA_MECHANIC_IMMUNITY, SPELLFAMILY_WARRIOR, 0x0, 0x20000, 0x0)\n+                /*!me->HasAura(ENRAGED_REGENERATION_1)*/ &&\n+                (_inStance(3) || stanceChange(diff, 3)))\n+            {\n+                if (doCast(me, GetSpell(RECKLESSNESS_1)))\n+                    return;\n+            }\n+            //DEATHWISH\n+            if (IsSpellReady(DEATH_WISH_1, diff) && can_do_normal && HasRole(BOT_ROLE_DPS) && !IsTank() && Rand() < 70 &&\n+                dist < 15 && rage >= rcost(DEATH_WISH_1) &&\n+                mytar->GetHealth() > me->GetHealth()/4 * (1 + mytar->getAttackers().size()) &&\n+                !me->GetAuraEffect(SPELL_AURA_MECHANIC_IMMUNITY, SPELLFAMILY_WARRIOR, 0x0, 0x20000, 0x0)\n+                /*!me->HasAura(ENRAGED_REGENERATION_1)*/)\n+            {\n+                if (doCast(me, GetSpell(DEATH_WISH_1)))\n+                    return;\n+            }\n+\n+            //VICTORY RUSH\n+            if (IsSpellReady(VICTORY_RUSH_1, diff) && can_do_normal && HasRole(BOT_ROLE_DPS) && Rand() < 70 && dist < 5 && _inStance(5) &&\n+                me->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_WARRIOR, 0x0, 0x40000, 0x0))\n+            {\n+                if (doCast(mytar, GetSpell(VICTORY_RUSH_1)))\n+                    return;\n+            }\n+            //DEVASTATE - only with shield\n+            if (IsSpellReady(DEVASTATE_1, diff) && can_do_normal && HasRole(BOT_ROLE_DPS) && CanBlock() && Rand() < 100 &&\n+                dist < 5 && rage >= rcost(DEVASTATE_1))\n+            {\n+                if (doCast(mytar, GetSpell(DEVASTATE_1)))\n+                    return;\n+            }\n+            //SUNDER ARMOR\n+            if (IsSpellReady(SUNDER_ARMOR_1, diff) && !IAmFree() && can_do_normal && dist < 5 && Rand() < 45 &&\n+                (IsTank() ? (mytar->GetHealth() > me->GetMaxHealth()) : (Rand() < 25 && mytar->GetHealth() > me->GetMaxHealth() * 2)) &&\n+                (!HasRole(BOT_ROLE_DPS) || !CanBlock() || !GetSpell(DEVASTATE_1)) &&\n+                (IsTank() || master->GetBotMgr()->HasBotWithSpec(BOT_SPEC_WARRIOR_PROTECTION, false)) && rage >= rcost(SUNDER_ARMOR_1))\n+            {\n+                AuraEffect const* sunder = mytar->GetAuraEffect(SUNDER_ARMOR_DEBUFF, 0);\n+                if ((!sunder || sunder->GetBase()->GetStackAmount() < 5 || sunder->GetBase()->GetDuration() < 20000) &&\n+                    doCast(mytar, GetSpell(SUNDER_ARMOR_1)))\n+                    return;\n+            }\n+            //SWEEPING STRIKES //no GCD\n+            if (IsSpellReady(SWEEPING_STRIKES_1, diff, false) && HasRole(BOT_ROLE_DPS) && !IsTank() && Rand() < 65 &&\n+                (_inStance(5) || stancetimer <= diff) && rage >= rcost(SWEEPING_STRIKES_1) &&\n+                (b_attackers.size() > 1 || FindSplashTarget(7, mytar)))\n+            {\n+                if ((_inStance(5) || stanceChange(diff, 5)) &&\n+                    doCast(me, GetSpell(SWEEPING_STRIKES_1)))\n+                    getrage();\n+            }\n+            //REND\n+            if (IsSpellReady(REND_1, diff) && can_do_normal && HasRole(BOT_ROLE_DPS) && Rand() < 80 &&\n+                mytar->GetHealth() > me->GetMaxHealth() / 4 * (1 + mytar->getAttackers().size()) &&\n+                (isArms || mytar->GetClass() == CLASS_ROGUE || mytar->GetShapeshiftForm() == FORM_CAT) &&\n+                dist < 5 && rage >= rcost(REND_1) && mytar->GetCreatureType() != CREATURE_TYPE_MECHANICAL &&\n+                !(mytar->IsCreature() &&\n+                (mytar->ToCreature()->GetCreatureTemplate()->MechanicImmuneMask & (1u<<(MECHANIC_BLEED-1)))) &&\n+                !mytar->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_WARRIOR, 0x20, 0x0, 0x0, me->GetGUID()) &&\n+                (_inStance(4) || (me->GetLevel() >= 15 && stanceChange(diff, 4))))\n+            {\n+                if (doCast(mytar, GetSpell(REND_1)))\n+                    return;\n+            }\n+            //BLOODTHIRST\n+            if (IsSpellReady(BLOODTHIRST_1, diff) && can_do_normal && HasRole(BOT_ROLE_DPS) &&\n+                dist < 5 && rage >= rcost(BLOODTHIRST_1))\n+            {\n+                if (doCast(mytar, GetSpell(BLOODTHIRST_1)))\n+                    return;\n+            }\n+            //MORTAL STRIKE\n+            if (IsSpellReady(MORTAL_STRIKE_1, diff) && can_do_normal && HasRole(BOT_ROLE_DPS) && !CanBlock() &&\n+                dist < 5 && rage >= rcost(MORTAL_STRIKE_1))\n+            {\n+                if (doCast(mytar, GetSpell(MORTAL_STRIKE_1)))\n+                    return;\n+            }\n+            //OVERPOWER\n+            if (IsSpellReady(OVERPOWER_1, diff) && can_do_normal && HasRole(BOT_ROLE_DPS) && !IsTank() && (!isFury || rage < 250) &&\n+                (_inStance(1) || stancetimer <= diff) && dist < 5 && rage >= rcost(OVERPOWER_1) &&\n+                (me->HasReactive(REACTIVE_OVERPOWER) ||\n+                me->GetAuraEffect(SPELL_AURA_ABILITY_IGNORE_AURASTATE, SPELLFAMILY_WARRIOR, 2961, 0)\n+                /*me->HasAura(TASTE_FOR_BLOOD_BUFF)*/))\n+            {\n+                if (_inStance(1) || (me->GetLevel() >= 15 && stanceChange(diff, 1)))\n+                {\n+                    if (doCast(mytar, GetSpell(OVERPOWER_1)))\n+                        return;\n+                }\n+            }\n+            //BLADESTORM\n+            if (IsSpellReady(BLADESTORM_1, diff) && can_do_normal && HasRole(BOT_ROLE_DPS) && !IsTank() && !CanBlock() &&\n+               dist < 10 && rage >= rcost(BLADESTORM_1) &&\n+               (b_attackers.size() > 1 || mytar->GetHealth() > me->GetHealth() / 3 * (1 + mytar->getAttackers().size()) ||\n+               mytar->IsControlledByPlayer()) &&\n+               (Rand() < 50 || me->HasAuraTypeWithFamilyFlags(SPELL_AURA_ADD_FLAT_MODIFIER, SPELLFAMILY_WARRIOR, 0x10)\n+               /*me->HasAura(RECKLESSNESS_1)*/) &&\n+               (me->GetMap()->IsDungeon() || mytar->GetMaxHealth() > me->GetMaxHealth() * 8 || CCed(mytar, true) || mytar->HasAuraWithMechanic(1u<<MECHANIC_SNARE)))\n+            {\n+                if (doCast(me, GetSpell(BLADESTORM_1)))\n+                    return;\n+            }\n+            //WHIRLWIND\n+            if (IsSpellReady(WHIRLWIND_1, diff) && can_do_normal && HasRole(BOT_ROLE_DPS) && !IsTank() && !CanBlock() && Rand() < 80 &&\n+                (isFury || mytar->IsControlledByPlayer() || me->GetLevel() < 60 || !me->GetMap()->IsDungeon()) &&\n+                (_inStance(3) || stancetimer <= diff) && dist < 6.f &&\n+                rage >= rcost(WHIRLWIND_1) && (isFury || rage >= 500 || FindSplashTarget(7.f, mytar, 15.f)))\n+            {\n+                if ((_inStance(3) || stanceChange(diff, 3)) &&\n+                    doCast(me, GetSpell(WHIRLWIND_1)))\n+                    return;\n+            }\n+            //EXECUTE\n+            if (IsSpellReady(EXECUTE_1, diff) && can_do_normal && HasRole(BOT_ROLE_DPS) && !IsTank() && Rand() < 110 &&\n+                (isFury || !me->GetMap()->IsRaid()) &&\n+                (mytar->HasAuraState(AURA_STATE_HEALTHLESS_20_PERCENT) ||\n+                me->GetAuraEffect(SPELL_AURA_ABILITY_IGNORE_AURASTATE, SPELLFAMILY_WARRIOR, 0x0, 0x2000000, 0x0)) &&\n+                dist < 5 && rage >= rcost(EXECUTE_1) &&\n+                (_inStance(5) || (stancetimer <= diff && stanceChange(diff, 5))))\n+            {\n+                if (doCast(mytar, GetSpell(EXECUTE_1)))\n+                    return;\n+            }\n+            //SLAM only with improved, has SPELL_ATTR2_NOT_RESET_AUTO_ACTIONS\n+            if (IsSpellReady(SLAM_1, diff) && can_do_normal && HasRole(BOT_ROLE_DPS) && !IsTank() && !CanBlock() &&\n+                me->GetLevel() >= 40 && dist < 5 && rage >= rcost(SLAM_1) &&\n+                ((isArms && !mytar->isMoving() && me->getAttackTimer(BASE_ATTACK) > 500) ||\n+                me->GetAuraEffect(SPELL_AURA_ADD_PCT_MODIFIER, SPELLFAMILY_WARRIOR, 0x0, 0x1000000, 0x0))\n+                /*me->HasAura(BLOODSURGE_BUFF)*/)\n+            {\n+                if (doCast(mytar, GetSpell(SLAM_1)))\n+                    return;\n+            }\n+\n+            //skip if already have cleave of heroic strike casted\n+            if (me->GetCurrentSpell(CURRENT_MELEE_SPELL))\n+                return;\n+\n+            //CLEAVE //no GCD\n+            if (IsSpellReady(CLEAVE_1, diff, false) && can_do_normal && HasRole(BOT_ROLE_DPS) && Rand() < 70 &&\n+                dist < 5 && (!IsTank() || rage >= 500) && rage >= rcost(CLEAVE_1) && FindSplashTarget())\n+            {\n+                if (doCast(mytar, GetSpell(CLEAVE_1)))\n+                    return;\n+            }\n+            //HEROIC STRIKE\n+            if (IsSpellReady(HEROIC_STRIKE_1, diff, false) && can_do_normal && HasRole(BOT_ROLE_DPS) && Rand() < 55 && rage >= 350 &&\n+                dist < 5 && (isFury || IsTank() || rage >= 650) && rage >= rcost(HEROIC_STRIKE_1))\n+            {\n+                if (doCast(mytar, GetSpell(HEROIC_STRIKE_1)))\n+                    return;\n+            }\n+        }\n+\n+        void CheckShouts(uint32 diff)\n+        {\n+            if (shoutCheckTimer > diff || GC_Timer > diff || Rand() > 35 || (IAmFree() && !IsWanderer()) || me->IsMounted() || IsCasting() ||\n+                (rage < rcost(BATTLE_SHOUT_1) && !IsSpellReady(BLOODRAGE_1, diff, false)))\n+                return;\n+\n+            shoutCheckTimer = urand(3000, 5000);\n+\n+            if (IAmFree())\n+            {\n+                if (GetSpell(BATTLE_SHOUT_1) &&\n+                    !me->GetAuraEffect(SPELL_AURA_MOD_RANGED_ATTACK_POWER, SPELLFAMILY_WARRIOR, 0x10000, 0x0, 0x0) &&\n+                    !me->GetAuraEffect(SPELL_AURA_MOD_RANGED_ATTACK_POWER, SPELLFAMILY_PALADIN, 0x2, 0x0, 0x0))\n+                {\n+                    if (rage < rcost(BATTLE_SHOUT_1))\n+                    {\n+                        if (IsSpellReady(BLOODRAGE_1, diff, false))\n+                        {\n+                            if (doCast(me, GetSpell(BLOODRAGE_1)))\n+                            {}\n+                            else\n+                                return;\n+                        }\n+                        else\n+                            return;\n+                    }\n+                    if (doCast(me, GetSpell(BATTLE_SHOUT_1)))\n+                        return;\n+                }\n+\n+                return;\n+            }\n+\n+            if (me->GetDistance(master) > 30)\n+                return;\n+\n+            //ignore Blood Pact\n+            AuraEffect const* bs = me->GetAuraEffect(SPELL_AURA_MOD_RANGED_ATTACK_POWER, SPELLFAMILY_WARRIOR, 0x10000, 0x0, 0x0);\n+            AuraEffect const* cs = me->GetAuraEffect(SPELL_AURA_230, SPELLFAMILY_WARRIOR, 0x0, 0x80, 0x0);\n+            AuraEffect const* bm = me->GetAuraEffect(SPELL_AURA_MOD_RANGED_ATTACK_POWER, SPELLFAMILY_PALADIN, 0x2, 0x0, 0x0);\n+\n+            bool hasBS = bs && (bs->GetBase()->GetDuration() >= 30000 || bs->GetBase()->GetCasterGUID() != me->GetGUID()) && bs->GetBase()->GetId() >= GetSpell(BATTLE_SHOUT_1);\n+            bool hasCS = cs && (cs->GetBase()->GetDuration() >= 30000 || cs->GetBase()->GetCasterGUID() != me->GetGUID()) && cs->GetBase()->GetId() >= GetSpell(COMMANDING_SHOUT_1);\n+            bool hasBM = bm != nullptr;\n+\n+            if (hasCS && (hasBS || hasBM))\n+                return;\n+\n+            bool battleshout = !hasBM && !hasBS && (!cs || cs->GetBase()->GetCasterGUID() != me->GetGUID()) &&\n+                (!IsTank(me) || !GetSpell(COMMANDING_SHOUT_1)) && GetSpell(BATTLE_SHOUT_1);\n+            bool commandingshout = !hasCS && (!bs || bs->GetBase()->GetCasterGUID() != me->GetGUID()) &&\n+                GetSpell(COMMANDING_SHOUT_1);\n+\n+            if (battleshout && !hasCS && !HasRole(BOT_ROLE_DPS) && GetSpell(COMMANDING_SHOUT_1))\n+            {\n+                battleshout = false;\n+                commandingshout = true;\n+            }\n+\n+            if (battleshout || commandingshout)\n+            {\n+                if (rage < rcost(BATTLE_SHOUT_1) && IsSpellReady(BLOODRAGE_1, diff, false) &&\n+                    doCast(me, GetSpell(BLOODRAGE_1)))\n+                    getrage();\n+\n+                if ((battleshout && doCast(me, GetSpell(BATTLE_SHOUT_1))) ||\n+                    (commandingshout && doCast(me, GetSpell(COMMANDING_SHOUT_1))))\n+                    return;\n+            }\n+        }\n+\n+        void CheckVigilance(uint32 diff)\n+        {\n+            if (vigiCheckTimer > diff || Rand() > 30 || !IsSpellReady(VIGILANCE_1, diff) || me->IsInCombat() || me->IsMounted() || IsCasting())\n+                return;\n+\n+            vigiCheckTimer = urand(1500, 3000);\n+            uint32 VIGILANCE = GetSpell(VIGILANCE_1);\n+\n+            if (Unit* u = !vigilanceTargetGuid.IsEmpty() ? ObjectAccessor::GetUnit(*me, vigilanceTargetGuid) : nullptr)\n+            {\n+                bool myVig = u->HasAura(VIGILANCE, me->GetGUID());\n+                if (!IsTank() || !myVig)\n+                {\n+                    if (myVig)\n+                        u->RemoveAura(VIGILANCE, me->GetGUID(), 0, AURA_REMOVE_BY_EXPIRE);\n+                    vigilanceTargetGuid = ObjectGuid::Empty;\n+                }\n+                return;\n+            }\n+            else if (!vigilanceTargetGuid.IsEmpty())\n+                vigilanceTargetGuid = ObjectGuid::Empty;\n+\n+            if (!IAmFree() && !IsTank())\n+                return;\n+\n+            Unit* target = nullptr;\n+            if (Group const* gr = GetGroup())\n+            {\n+                std::set<Unit*> targets;\n+                for (uint8 i = 0; i < 4 && !targets.empty(); ++i)\n+                {\n+                    for (Unit* member : BotMgr::GetAllGroupMembers(gr))\n+                    {\n+                        if (!(!(i & 1) ? member->IsPlayer() : member->IsNPCBot()) || me->GetMap() != member->FindMap() ||\n+                            !member->IsAlive() || me->GetDistance(member) > 30 ||\n+                            (member->IsNPCBot() && member->ToCreature()->IsTempBot()) ||\n+                            (i < 2 && !(i == 0 ? IsTankingClass(member->GetClass()) : IsTank(member))) ||\n+                            (i == 3 && !member->ToCreature()->GetBotAI()->HasRole(BOT_ROLE_DPS)) ||\n+                            member->HasAura(VIGILANCE) || member->HasAura(DAMAGE_REDUCTION))\n+                            continue;\n+                        targets.insert(member);\n+                    }\n+                }\n+\n+                if (!targets.empty())\n+                    target = targets.size() == 1 ? *targets.begin() : Bcore::Containers::SelectRandomContainerElement(targets);\n+            }\n+\n+            if (!target && !IAmFree() && master->IsAlive() && me->IsWithinDistInMap(master, 30) && !master->HasAura(VIGILANCE))\n+                target = master;\n+\n+            if (target && doCast(target, VIGILANCE))\n+                return;\n+        }\n+\n+        void CheckIntervene(uint32 diff)\n+        {\n+            if (!IsSpellReady(INTERVENE_1, diff, false) || HasBotCommandState(BOT_COMMAND_STAY) || me->IsMounted() ||\n+                Rand() > (IsTank() ? 40 : 80) || rage < rcost(INTERVENE_1) || IsCasting() ||\n+                !(_inStance(2) || stancetimer <= diff || (GetSpec() == BOT_SPEC_WARRIOR_PROTECTION && me->GetLevel() >= 50)))\n+                return;\n+\n+            Unit* target = nullptr;\n+            if (!me->GetVictim() && master->getAttackers().empty() && master->isMoving())\n+            {\n+                float mydist = me->GetDistance(master);\n+                if (mydist < 25 && mydist > 18)\n+                    target = master;\n+            }\n+\n+            Group const* gr = GetGroup();\n+            if (!target && !gr)\n+            {\n+                if (GetHealthPCT(master) < 95 && !master->getAttackers().empty() &&\n+                    me->getAttackers().size() <= master->getAttackers().size())\n+                {\n+                    float mydist = me->GetDistance(master);\n+                    if (mydist < 25 && mydist > 8)\n+                        target = master;\n+                }\n+            }\n+            if (!target && gr && (!IsTank() || !me->GetVictim()))\n+            {\n+                std::set<Unit*> targets;\n+                for (Unit* member : BotMgr::GetAllGroupMembers(gr))\n+                {\n+                    if (me->GetMap() == member->FindMap() && member->IsAlive() && GetHealthPCT(member) <= 70 &&\n+                        !member->HasAuraType(SPELL_AURA_ADD_CASTER_HIT_TRIGGER) &&\n+                        member->getAttackers().size() >= me->getAttackers().size() &&\n+                        !(member->IsNPCBot() && member->ToCreature()->IsTempBot()))\n+                    {\n+                        float dist = me->GetDistance(member);\n+                        if (dist < 25 && dist > 8)\n+                            targets.insert(member);\n+                    }\n+                }\n+                if (!targets.empty())\n+                    target = targets.size() == 1u ? *targets.begin() : Bcore::Containers::SelectRandomContainerElement(targets);\n+            }\n+\n+            if (target && (_inStance(2) || (GetSpec() == BOT_SPEC_WARRIOR_PROTECTION && me->GetLevel() >= 50) || stanceChange(diff, 2)) &&\n+                doCast(target, GetSpell(INTERVENE_1)))\n+                return;\n+\n+            SetSpellCooldown(INTERVENE_1, 500); //fail\n+        }\n+\n+        void CheckSpellReflect(uint32 diff)\n+        {\n+            if (!IsSpellReady(SPELL_REFLECTION_1, diff, false) || me->IsMounted() || IsCasting() ||\n+                !CanBlock() || !(_inStance(4) || stancetimer <= diff) ||\n+                rage < rcost(SPELL_REFLECTION_1) || Rand() > 75)\n+                return;\n+\n+            //use first match (covers most cases)\n+            if (Unit const* target = FindCastingTarget(70))\n+            {\n+                if (Spell const* spell = target->GetCurrentSpell(CURRENT_GENERIC_SPELL))\n+                {\n+                    if (spell->GetTimer() < 500/*(4500 - 4000 * (target->IsPlayer()))*/ &&\n+                        !spell->GetSpellInfo()->IsChanneled() &&\n+                        spell->GetSpellInfo()->DmgClass == SPELL_DAMAGE_CLASS_MAGIC &&\n+                        !(spell->GetSpellInfo()->Attributes & (SPELL_ATTR0_ABILITY|SPELL_ATTR0_UNAFFECTED_BY_INVULNERABILITY)) &&\n+                        !(spell->GetSpellInfo()->AttributesEx & SPELL_ATTR1_CANT_BE_REFLECTED) &&\n+                        !spell->GetSpellInfo()->IsPassive() && !spell->GetSpellInfo()->IsPositive())\n+                    {\n+                        if (Unit const* u = spell->m_targets.GetUnitTarget())\n+                        {\n+                            if ((IAmFree() ? (u == me) : (master->GetGroup() && master->GetGroup()->IsMember(spell->m_targets.GetObjectTargetGUID()))) &&\n+                                me->GetTotalAuraModifier(SPELL_AURA_REFLECT_SPELLS) < 100)\n+                            {\n+                                if ((_inStance(4) || (stancetimer <= diff && stanceChange(diff, 4))) &&\n+                                    doCast(me, GetSpell(SPELL_REFLECTION_1)))\n+                                    return;\n+                            }\n+                        }\n+                    }\n+                }\n+            }\n+\n+            SetSpellCooldown(SPELL_REFLECTION_1, urand(250, 500)); //fail\n+        }\n+\n+        void CheckShatteringThrow(uint32 diff)\n+        {\n+            if (!IsSpellReady(SHATTERING_THROW_1, diff) || shatterCheckTimer > diff ||\n+                !(_inStance(1) || stancetimer <= diff) || rage < rcost(SHATTERING_THROW_1) ||\n+                me->getAttackers().size() > 2 || Rand() > 50)\n+                return;\n+\n+            shatterCheckTimer = urand(500, 1000);\n+\n+            Unit* unit = FindImmunityShieldDispelTarget();\n+            if (unit && me->GetDistance(unit) < 30 && (_inStance(1) || (stancetimer <= diff && stanceChange(diff, 1))))\n+                if (doCast(unit, GetSpell(SHATTERING_THROW_1)))\n+                    return;\n+        }\n+\n+        bool stanceChange(uint32 diff, uint8 stance)\n+        {\n+            if (stancetimer > diff)\n+                return false;\n+\n+            if (stance == 5)\n+                stance = (me->GetLevel() >= 30 && !IsTank()) ? 3 : 1;\n+            else if (stance == 4)\n+                stance = me->GetLevel() >= 10 && IsTank() ? 2 : 1;\n+\n+            if (stance == 2 && me->GetLevel() < 10)\n+                return false;\n+            if (stance == 3 && me->GetLevel() < 30)\n+                return false;\n+\n+            if (_inStance(stance))\n+                return true;\n+\n+            rage = me->GetPower(POWER_RAGE);\n+            switch (stance)\n+            {\n+                case 1:\n+                    return doCast(me, BATTLE_STANCE_1);\n+                case 2:\n+                    return doCast(me, DEFENSIVE_STANCE_1);\n+                case 3:\n+                    return doCast(me, BERSERKER_STANCE_1);\n+                default:\n+                    return false;\n+            }\n+        }\n+\n+        void ApplyClassDamageMultiplierMelee(uint32& /*damage*/, CalcDamageInfo& damageinfo) const override\n+        {\n+            float pctbonus = 1.0f;\n+\n+            if (damageinfo.HitOutCome == MELEE_HIT_CRIT)\n+            {\n+                //!!!Melee spell damage is not yet critical, all reduced by half\n+                //Poleaxe Specialization: 5% additional critical damage for all attacks\n+                if (GetSpec() == BOT_SPEC_WARRIOR_ARMS && me->GetLevel() >= 30)\n+                    if (Item const* weap = GetEquips(uint8(damageinfo.AttackType)))\n+                        if (ItemTemplate const* proto = weap->GetTemplate())\n+                            if (proto->SubClass == ITEM_SUBCLASS_WEAPON_AXE || proto->SubClass == ITEM_SUBCLASS_WEAPON_AXE2 ||\n+                                proto->SubClass == ITEM_SUBCLASS_WEAPON_POLEARM)\n+                                pctbonus *= 1.025f;\n+            }\n+\n+            damageinfo.Damages[0].Damage *= pctbonus;\n+        }\n+\n+        void ApplyClassSpellCritMultiplierAll(Unit const* /*victim*/, float& crit_chance, SpellInfo const* spellInfo, SpellSchoolMask /*schoolMask*/, WeaponAttackType attackType) const override\n+        {\n+            if (spellInfo->DmgClass != SPELL_DAMAGE_CLASS_MELEE)\n+                return;\n+\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+\n+            //Recklessness: 100% additional critical chance for damaging abilities\n+            if (AuraEffect const* eff = me->GetAuraEffect(RECKLESSNESS_1, EFFECT_0))\n+                if (eff->IsAffectingSpell(spellInfo))\n+                    crit_chance += 100.f;\n+            //Juggernaught: 25 additional critical chance for Mortal Strike and Slam\n+            if (lvl >= 45 && (baseId == SLAM_1 || baseId == MORTAL_STRIKE_1))\n+                if (AuraEffect const* jugg = me->GetAuraEffect(JUGGERNAUGHT_BUFF, 0))\n+                    if (jugg->IsAffectingSpell(spellInfo))\n+                        crit_chance += 25.f;\n+\n+            //Poleaxe Specialization: 5% additional critical chance for all attacks\n+            if (GetSpec() == BOT_SPEC_WARRIOR_ARMS && lvl >= 30)\n+                if (Item const* weap = GetEquips(uint8(attackType)))\n+                    if (ItemTemplate const* proto = weap->GetTemplate())\n+                        if (proto->SubClass == ITEM_SUBCLASS_WEAPON_AXE || proto->SubClass == ITEM_SUBCLASS_WEAPON_AXE2 ||\n+                            proto->SubClass == ITEM_SUBCLASS_WEAPON_POLEARM)\n+                            crit_chance += 5.f;\n+\n+            //Incite: 15% additional critical chance for Cleave, Heroic Strike and Thunder Clap\n+            if (((GetSpec() == BOT_SPEC_WARRIOR_PROTECTION && lvl >= 15) ||\n+                ((GetSpec() == BOT_SPEC_WARRIOR_ARMS || GetSpec() == BOT_SPEC_WARRIOR_FURY) && lvl >= 75)) &&\n+                (baseId == CLEAVE_1 || baseId == HEROIC_STRIKE_1 || baseId == THUNDER_CLAP_1))\n+                crit_chance += 15.f;\n+            //Improved Overpower: 50% additional critical chance for Overpower\n+            if ((GetSpec() == BOT_SPEC_WARRIOR_ARMS) && lvl >= 20 && baseId == OVERPOWER_1)\n+                crit_chance += 50.f;\n+            //Critical Block: 15% additional critical chance for Shield Slam\n+            if ((GetSpec() == BOT_SPEC_WARRIOR_PROTECTION) &&\n+                lvl >= 50 && baseId == SHIELD_SLAM_1)\n+                crit_chance += 15.f;\n+            //Sword and Board: 15% additional critical chance for Devastate\n+            if (lvl >= 55 && baseId == DEVASTATE_1)\n+                crit_chance += 15.f;\n+\n+            //Glypg of Victory Rush: 30% additional critical chance for Victory Rush\n+            if (lvl >= 15 && baseId == VICTORY_RUSH_1)\n+                crit_chance += 30.f;\n+\n+            //Warrior T8 Protection Bonus (id: 64933): 10% additional critical chance for Devastate (tanks only)\n+            if (lvl >= 78 && baseId == DEVASTATE_1)\n+                crit_chance += 10.f;\n+        }\n+\n+        void ApplyClassDamageMultiplierMeleeSpell(int32& damage, SpellNonMeleeDamage& /*damageinfo*/, SpellInfo const* spellInfo, WeaponAttackType attackType, bool iscrit) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+            float fdamage = float(damage);\n+\n+            // apply bonus damage mods\n+            float pctbonus = 1.0f;\n+            if (iscrit)\n+            {\n+                //!!!Melee spell damage is not yet critical, all reduced by half\n+                //Impale: 20% crit damage bonus for all abilities\n+                if (lvl >= 20)\n+                    pctbonus *= 1.1f;\n+                //Poleaxe Specialization: 5% additional critical damage for all attacks\n+                if ((GetSpec() == BOT_SPEC_WARRIOR_PROTECTION) && lvl >= 30)\n+                    if (Item const* weap = GetEquips(uint8(attackType)))\n+                        if (ItemTemplate const* proto = weap->GetTemplate())\n+                            if (proto->SubClass == ITEM_SUBCLASS_WEAPON_AXE || proto->SubClass == ITEM_SUBCLASS_WEAPON_AXE2 ||\n+                                proto->SubClass == ITEM_SUBCLASS_WEAPON_POLEARM)\n+                                pctbonus *= 1.025f;\n+            }\n+\n+            //Improved Shield Slam (id: 38407): 10% bonus damage for Shield Slam\n+            //if (lvl >= 50 && baseId == SHIELD_SLAM_1)\n+            //    pctbonus *= 1.1f;\n+            //Shield Slam Damage Up (id: 60173): 10% bonus damage for Shield Slam\n+            //if (lvl >= 70 && baseId == SHIELD_SLAM_1)\n+            //    pctbonus *= 1.1f;\n+\n+            //Improved Rend: 20% bonus damage for Rend\n+            if (lvl >= 10 && baseId == REND_1)\n+                pctbonus *= 1.2f;\n+            //Improved Thunder Clap (part 2): 30% bonus damage for Thunder Clap\n+            if (lvl >= 10 && baseId == THUNDER_CLAP_1)\n+                pctbonus *= 1.3f;\n+            //Improved Revenge (part 1): 60% bonus damage for Revenge\n+            if ((GetSpec() == BOT_SPEC_WARRIOR_PROTECTION) && lvl >= 20 && baseId == REVENGE_1)\n+                pctbonus *= 1.6f;\n+            //Gag Order (part 2): 10% bonus damage for Shield Slam\n+            if ((GetSpec() == BOT_SPEC_WARRIOR_PROTECTION) && lvl >= 30 && baseId == SHIELD_SLAM_1)\n+                pctbonus *= 1.1f;\n+            //Improved Whirlwind: 20% bonus damage for Whirlwind\n+            if ((GetSpec() == BOT_SPEC_WARRIOR_FURY) && lvl >= 40 && baseId == WHIRLWIND_1)\n+                pctbonus *= 1.2f;\n+            //Improved Mortal Strike (part 1): 10% bonus damage for Mortal Strike\n+            if (lvl >= 45 && baseId == MORTAL_STRIKE_1)\n+                pctbonus *= 1.1f;\n+            //Unrelenting Assault (part 2): 20% bonus damage for Overpower and Revenge\n+            if ((GetSpec() == BOT_SPEC_WARRIOR_ARMS) &&\n+                lvl >= 45 && (baseId == OVERPOWER_1 || baseId == REVENGE_1))\n+                pctbonus *= 1.2f;\n+            //Unending Fury: 10% bonus damage for Whirlwind, Slam and Bloodthirst\n+            if ((GetSpec() == BOT_SPEC_WARRIOR_FURY) &&\n+                lvl >= 55 && (baseId == WHIRLWIND_1 || baseId == SLAM_1 || baseId == BLOODTHIRST_1))\n+                pctbonus *= 1.1f;\n+\n+            //Glyph of Mocking Blow: 25% bonus damage for Mocking Blow\n+            if (lvl >= 16 && baseId == MOCKING_BLOW_1)\n+                pctbonus *= 1.25f;\n+            //Glyph of Mortal Strike: 10% bonus damage for Mortal Strike\n+            if (lvl >= 40 && baseId == MORTAL_STRIKE_1)\n+                pctbonus *= 1.1f;\n+\n+            //Warrior T9 Protection 2P Bonus (id: 67269): 5% bonus damage for Devastate\n+            if (lvl >= 77 && baseId == DEVASTATE_1)\n+                pctbonus *= 1.05f;\n+            //Warrior T10 Protection 2P Bonus (id: 70843): 20% bonus damage for Shield Slam and Shockwave\n+            if (lvl >= 78 && (baseId == SHIELD_SLAM_1 || baseId == SHOCKWAVE_1))\n+                pctbonus *= 1.2f;\n+\n+            //Improved Cleave: 120% increased '!bonus damage!' done by Cleave (flat mod)\n+            if ((GetSpec() == BOT_SPEC_WARRIOR_FURY) && lvl >= 25 && baseId == CLEAVE_1)\n+            {\n+                float bp = spellInfo->_effects[EFFECT_0].BasePoints; //SPELL_EFFECT_WEAPON_DAMAGE (values: 15 - 222)\n+                fdamage += bp * 1.2;\n+            }\n+\n+            damage = int32(fdamage * pctbonus);\n+        }\n+\n+        void ApplyClassSpellCostMods(SpellInfo const* spellInfo, int32& cost) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            float fcost = float(cost);\n+            //float pctbonus = 1.0f;\n+\n+            //100% mods\n+            //Sword and Board: -100% rage cost for Shield Slam\n+            if (baseId == SHIELD_SLAM_1 && me->HasAura(SWORD_AND_BOARD_BUFF))\n+                fcost = 0;\n+\n+            //Glyph of Bloodrage: -100% health cost for Bloodrage\n+            if (lvl >= 15 && baseId == BLOODRAGE_1)\n+                fcost = 0;\n+            //Glyph of Revenge: -100% rage cost for Heroic Strike\n+            if (lvl >= 15 && baseId == HEROIC_STRIKE_1 && me->HasAura(GLYPH_REVENGE_BUFF))\n+                fcost = 0;\n+            //Glyph of Sweeping Strikes: -100% rage cost for Sweeping Strikes\n+            if (lvl >= 30 && baseId == SWEEPING_STRIKES_1)\n+                fcost = 0;\n+\n+            //flat mods\n+            //Improved Hamstring (id: 24428): -2 rage cost for Hamstring\n+            if (lvl >= 25 && baseId == HAMSTRING_1)\n+                fcost -= 20;\n+            //Bloodthirst and Mortal Strike Discount (id: 37535): -5 rage cost for Bloodthirst and Mortal Strike\n+            if (lvl >= 40 && (baseId == BLOODTHIRST_1 || baseId == MORTAL_STRIKE_1))\n+                fcost -= 50;\n+\n+            //Improved Heroic Strike: -3 rage cost for Heroic Strike\n+            if (lvl >= 10 && baseId == HEROIC_STRIKE_1)\n+                fcost -= 30;\n+            //Improved Thunder Clap (part 1): -4 rage cost for Thunder Clap\n+            if (lvl >= 10 && baseId == THUNDER_CLAP_1)\n+                fcost -= 40;\n+            //Improved Execute: -5 rage cost for Execute\n+            if ((GetSpec() == BOT_SPEC_WARRIOR_FURY) &&\n+                lvl >= 25 && baseId == EXECUTE_1)\n+                fcost -= 50;\n+            //Puncture: -3 rage cost for Sunder Armor and Devastate\n+            if ((GetSpec() == BOT_SPEC_WARRIOR_PROTECTION) &&\n+                lvl >= 25 && (baseId == SUNDER_ARMOR_1 || baseId == DEVASTATE_1))\n+                fcost -= 30;\n+            //Focused Rage: -3 rage cost for all offensive abilities (using rage)\n+            if ((GetSpec() == BOT_SPEC_WARRIOR_PROTECTION) &&\n+                lvl >= 40 && ((spellInfo->SpellFamilyFlags[0] & 0x6E6E4EEE) || (spellInfo->SpellFamilyFlags[1] & 0x40E664)))\n+                fcost -= 30;\n+\n+            //Glyph of Resonating Power: -5 rage cost for Thunder Clap\n+            if (lvl >= 15 && baseId == THUNDER_CLAP_1)\n+                fcost -= 50;\n+            //Glyph of Shockwave: -3 rage cost for Shockwave\n+            if (lvl >= 60 && baseId == SHOCKWAVE_1)\n+                fcost -= 30;\n+\n+            //cost can be < 0\n+            cost = int32(fcost/* * pctbonus*/);\n+        }\n+\n+        void ApplyClassSpellCastTimeMods(SpellInfo const* spellInfo, int32& casttime) const override\n+        {\n+            //casttime is in milliseconds\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            //int32 timebonus = 0;\n+            //float pctbonus = 0.0f;\n+\n+            //100% mods\n+            //Bloodsurge: -100% cast time for Slam\n+            if (baseId == SLAM_1 && me->HasAura(BLOODSURGE_BUFF))\n+                casttime = 0;\n+\n+            //flat mods\n+            //Improved Slam: -1.0 sec cast time for Slam\n+            if ((GetSpec() == BOT_SPEC_WARRIOR_ARMS) &&\n+                lvl >= 40 && baseId == SLAM_1)\n+                casttime -= 1000;\n+\n+            casttime = std::max<int32>(casttime, 0);\n+        }\n+\n+        void ApplyClassSpellCooldownMods(SpellInfo const* spellInfo, uint32& cooldown) const override\n+        {\n+            //cooldown is in milliseconds\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            float pctbonus = 1.0f;\n+\n+            //pct mods\n+            //Intensify Rage: -33% cooldown for Bloodrage, Berserker Rage, Recklessness and Death Wish\n+            if ((GetSpec() == BOT_SPEC_WARRIOR_FURY) && lvl >= 40 &&\n+                (baseId == BLOODRAGE_1 || baseId == BERSERKER_RAGE_1 || baseId == RECKLESSNESS_1 || baseId == DEATH_WISH_1))\n+                pctbonus *= 0.67f;\n+\n+            //flat mods\n+            //zzzOLDImproved Challenging Shout (id: 12327): -2 min cooldown for Challenging Shout (tanks only)\n+            if (lvl >= 30 && IsTank() && baseId == CHALLENGING_SHOUT_1)\n+                cooldown -= 120000;\n+\n+            //Shield Mastery (part 2): -20 sec cooldown for Shield Block\n+            if ((GetSpec() == BOT_SPEC_WARRIOR_PROTECTION) &&\n+                lvl >= 20 && baseId == SHIELD_BLOCK_1)\n+                cooldown -= 20000;\n+            //Improved Disciplines: -60 sec cooldown for Shield Wall, Retaliation and Recklessness\n+            if ((GetSpec() == BOT_SPEC_WARRIOR_PROTECTION) &&\n+                lvl >= 35 && (baseId == SHIELD_WALL_1 || baseId == RETALIATION_1 || baseId == RECKLESSNESS_1))\n+                cooldown -= 60000;\n+\n+            //Glyph of Bladestorm: -15 sec cooldown for Bladestorm\n+            if (lvl >= 60 && baseId == BLADESTORM_1)\n+                cooldown -= 15000;\n+            //Glyph of Spell Reflection: -1 sec cooldown for Spell Reflection\n+            if (lvl >= 64 && baseId == SPELL_REFLECTION_1)\n+                cooldown -= 1000;\n+\n+            cooldown = std::max<float>(cooldown * pctbonus, 0.f);\n+        }\n+\n+        void ApplyClassSpellCategoryCooldownMods(SpellInfo const* spellInfo, uint32& cooldown) const override\n+        {\n+            //cooldown is in milliseconds\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            float pctbonus = 1.0f;\n+\n+            //pct bonuses\n+            //Glyph of Rapid Charge: -7% cooldown for Charge\n+            if (lvl >= 15 && baseId == CHARGE_1)\n+                pctbonus *= 0.93f;\n+\n+            //flat bonuses\n+            //Improved Disarm part 1: -20 sec cooldown for Disarm\n+            if ((GetSpec() == BOT_SPEC_WARRIOR_PROTECTION) &&\n+                lvl >= 25 && baseId == DISARM_1)\n+                cooldown -= 20000;\n+            //Improved Intercept: -10 sec cooldown for Intercept\n+            if ((GetSpec() == BOT_SPEC_WARRIOR_FURY) &&\n+                lvl >= 30 && baseId == INTERCEPT_1)\n+                cooldown -= 10000;\n+            //Improved Mortal Strike (part 2): -1 sec cooldown for Mortal Strike\n+            if (lvl >= 45 && baseId == MORTAL_STRIKE_1)\n+                cooldown -= 1000;\n+            //Unrelenting Assault (part 1): -4 sec cooldown for Overpower and Revenge\n+            if ((GetSpec() == BOT_SPEC_WARRIOR_ARMS) &&\n+                lvl >= 45 && (baseId == OVERPOWER_1 || baseId == REVENGE_1))\n+                cooldown -= 4000;\n+\n+            //Glyph of Last Stand: -1 min cooldown for Last Stand\n+            if (lvl >= 20 && baseId == LAST_STAND_1)\n+                cooldown -= 60000;\n+            //Glyph of Whirlwind: -2 sec cooldown for Whirlwind\n+            if (lvl >= 36 && baseId == WHIRLWIND_1)\n+                cooldown -= 2000;\n+\n+            //Warrior T9 2P Bonus (id: 67269): -2 sec cooldown for Taunt (tanks only)\n+            if (lvl >= 80 && IsTank() && baseId == TAUNT_1)\n+                cooldown -= 2000;\n+\n+            cooldown = std::max<float>(cooldown * pctbonus, 0.f);\n+        }\n+\n+        void ApplyClassSpellGlobalCooldownMods(SpellInfo const* spellInfo, float& cooldown) const override\n+        {\n+            //cooldown is in milliseconds\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+\n+            //Unrelenting Assault (part 1, special): -0.5 sec global cooldown for Overpower and Revenge\n+            if ((GetSpec() == BOT_SPEC_WARRIOR_ARMS) &&\n+                lvl >= 45 && (baseId == OVERPOWER_1 || baseId == REVENGE_1))\n+                cooldown -= 500.f;\n+        }\n+\n+        void ApplyClassSpellRadiusMods(SpellInfo const* spellInfo, float& radius) const override\n+        {\n+            //uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            uint8 lvl = me->GetLevel();\n+            float pctbonus = 1.0f;\n+\n+            //pct mods\n+            //Booming Voice part 1 (doubled for bots)\n+            if (lvl >= 10 && ((spellInfo->SpellFamilyFlags[0] & 0x30000) || (spellInfo->SpellFamilyFlags[1] & 0x80)))\n+                pctbonus *= 2.0f; //1.5f\n+\n+            //flat mods\n+            //Glyph of Thunder Clap (doubled for tanks)\n+            if (lvl >= 15 && (spellInfo->SpellFamilyFlags[0] & 0x80))\n+                radius += IsTank() ? 4.f : 2.f;\n+\n+            radius = radius * pctbonus;\n+        }\n+\n+        void ApplyClassSpellRangeMods(SpellInfo const* spellInfo, float& maxrange) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+            float pctbonus = 1.0f;\n+\n+            //pct mods\n+            //Holy Reach: +20% range for Holy Spells\n+            //if (lvl >= 25 && (spellInfo->SpellFamilyFlags[0] & 0x100080))\n+            //    pctbonus *= 1.2f;\n+\n+            //flat mods\n+            //Glyph of Charge: +5 yd range for Charge\n+            if (baseId == CHARGE_1 && lvl >= 15)\n+                maxrange += 5.f;\n+\n+            maxrange = maxrange * pctbonus;\n+        }\n+\n+        void ApplyClassSpellMaxTargetsMods(SpellInfo const* spellInfo, uint32& targets) const override\n+        {\n+            //uint32 bonusTargets = 0;\n+            uint8 lvl = me->GetLevel();\n+\n+            //Improved Revenge: +1 target (actually 2 in dbc)\n+            if (lvl >= 20 && (spellInfo->SpellFamilyFlags[0] & 0x400))\n+                targets += 1;\n+\n+            //Glyph of Sunder Armor: +1 target\n+            if (lvl >= 15 && (spellInfo->SpellFamilyFlags[0] & 0x4000))\n+                targets += 1;\n+            //Glyph of Cleaving: +1 target\n+            if (lvl >= 20 && (spellInfo->SpellFamilyFlags[0] & 0x400000))\n+            {\n+                targets += 1;\n+                //double for non-tanks\n+                if (!IsTank())\n+                    targets += 1;\n+            }\n+        }\n+\n+        void ApplyClassEffectMods(SpellInfo const* spellInfo, uint8 effIndex, float& value) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+            float pctbonus = 1.0f;\n+\n+            //Improved Rend: 20% increased effect\n+            if (baseId == REND_1 && effIndex == EFFECT_0 && lvl >= 10)\n+                pctbonus *= 1.2f;\n+            //Improved Bloodrage: 50% increased effect\n+            if ((baseId == BLOODRAGE_1 || baseId == BLOODRAGE_PERIODIC_EFFECT) && effIndex == EFFECT_0 && lvl >= 10)\n+                pctbonus *= 1.5f;\n+            //Improved Charge: +10 rage generated\n+            if (baseId == CHARGE_1 && effIndex == EFFECT_1 && lvl >= 15)\n+                value += 100.f;\n+            //Glyph of Bloodthirst: +100% healing\n+            if (baseId == BLOODTHIRST_1 && effIndex == EFFECT_1 && lvl >= 40)\n+                pctbonus *= 2.0f;\n+\n+            value = value * pctbonus;\n+        }\n+\n+        void OnClassSpellGo(SpellInfo const* spellInfo) override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+\n+            if (baseId == LAST_STAND_1 && !IAmFree())\n+                ReportSpellCast(baseId, LocalizedNpcText(master, BOT_TEXT__USED), master);\n+            if (baseId == SHIELD_WALL_1 && !IAmFree())\n+                ReportSpellCast(baseId, LocalizedNpcText(master, BOT_TEXT__USED), master);\n+            if (baseId == ENRAGED_REGENERATION_1 && !IAmFree())\n+                ReportSpellCast(baseId, LocalizedNpcText(master, BOT_TEXT__USED), master);\n+\n+            if (baseId == SLAM_1)\n+                me->RemoveAura(BLOODSURGE_BUFF);\n+            if (baseId == HEROIC_STRIKE_1)\n+                me->RemoveAura(GLYPH_REVENGE_BUFF);\n+            if (baseId == SHIELD_SLAM_1)\n+                me->RemoveAura(SWORD_AND_BOARD_BUFF);\n+            if (baseId == OVERPOWER_1 && !me->HasReactive(REACTIVE_OVERPOWER))\n+                me->RemoveAura(TASTE_FOR_BLOOD_BUFF);\n+            if (baseId == BERSERKER_RAGE_1)\n+            {\n+                //Improved Berserker Rage: 20 rage bonus when used\n+                if (me->GetLevel() >= 35)\n+                    me->CastSpell(me, IMPROVED_BERSERKER_RAGE_EFFECT, true);\n+            }\n+        }\n+\n+        void SpellHitTarget(WorldObject* wtarget, SpellInfo const* spell) override\n+        {\n+            Unit* target = wtarget->ToUnit();\n+            if (!target)\n+                return;\n+\n+            uint32 spellId = spell->Id;\n+            uint32 baseId = spell->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+\n+            if (baseId == VIGILANCE_1)\n+                vigilanceTargetGuid = target->GetGUID();\n+\n+            //Recklessness: handle charge drop\n+            AuraEffect const* reck = me->GetAuraEffect(RECKLESSNESS_1, EFFECT_0);\n+            if (reck && reck->IsAffectingSpell(spell))\n+                reck->GetBase()->DropCharge();\n+            //Juggernaught: consume buff\n+            if (baseId == SLAM_1 || baseId == MORTAL_STRIKE_1)\n+                if (AuraEffect const* jugg = me->GetAuraEffect(JUGGERNAUGHT_BUFF, 0))\n+                    if (jugg->IsAffectingSpell(spell))\n+                        me->RemoveAurasDueToSpell(JUGGERNAUGHT_BUFF);\n+\n+            if (baseId == THUNDER_CLAP_1 && lvl >= 10)\n+            {\n+                if (AuraEffect* clap = target->GetAuraEffect(spellId, EFFECT_1, me->GetGUID()))\n+                {\n+                    int32 amount = clap->GetAmount();\n+                    //Improved Thunder Clap (part 3): 10% extra slow\n+                    amount += (-10);\n+                    //Conqueror Thunder Clap Bonus: 50% increased effect\n+                    if ((GetSpec() == BOT_SPEC_WARRIOR_PROTECTION) && lvl >= 60)\n+                        amount = amount + amount / 2;\n+\n+                    clap->ChangeAmount(amount);\n+                }\n+            }\n+            if (baseId == DEMORALIZING_SHOUT_1 && lvl >= 15)\n+            {\n+                if (AuraEffect* demo = target->GetAuraEffect(spellId, 0, me->GetGUID()))\n+                    demo->ChangeAmount(demo->GetAmount() + demo->GetAmount() * 2 / 5);\n+            }\n+            if (baseId == BATTLE_SHOUT_1 || baseId == COMMANDING_SHOUT_1 || baseId == DEMORALIZING_SHOUT_1)\n+            {\n+                if (Aura* shout = target->GetAura(spellId, me->GetGUID()))\n+                {\n+                    //Booming Voice part 2\n+                    //Buffs duration 10 min for bots\n+                    uint32 dur = baseId == DEMORALIZING_SHOUT_1 ? shout->GetDuration() * 3 / 2 : 600000;\n+                    shout->SetDuration(dur);\n+                    shout->SetMaxDuration(dur);\n+\n+                    if (baseId == BATTLE_SHOUT_1 || baseId == COMMANDING_SHOUT_1)\n+                    {\n+                        if (lvl >= 20)\n+                        {\n+                            //Commanding Presence: +25% increased effect (melee AP / HP)\n+                            AuraEffect* bamm = shout->GetEffect(EFFECT_0);\n+                            if (bamm)\n+                                bamm->ChangeAmount(bamm->GetAmount() * 5 / 4);\n+                        }\n+                    }\n+                    else if (baseId == DEMORALIZING_SHOUT_1)\n+                    {\n+                        if (lvl >= 15)\n+                        {\n+                            //Improved Demoralization Shout: +40% effect\n+                            AuraEffect* demo = shout->GetEffect(EFFECT_0);\n+                            if (demo)\n+                                demo->ChangeAmount(demo->GetAmount() * 7 / 5);\n+                        }\n+                    }\n+                }\n+            }\n+            if (baseId == REVENGE_1)\n+            {\n+                //zzzOLD Revenge Stun (25% chance): skip players\n+                if (lvl >= 25 && !target->IsPlayer() && urand(1,100) <= 25)\n+                    me->CastSpell(target, REVENGE_STUN_SPELL, true);\n+            }\n+            if (baseId == DISARM_1 && (GetSpec() == BOT_SPEC_WARRIOR_PROTECTION) && lvl >= 25)\n+            {\n+                //Improved Disarm part 2\n+                if (AuraEffect* disa = target->GetAuraEffect(spellId, 1, me->GetGUID()))\n+                    disa->ChangeAmount(disa->GetAmount() + 10);\n+            }\n+            if (baseId == OVERPOWER_1)\n+            {\n+                me->ClearReactive(REACTIVE_OVERPOWER);\n+                //Unrelenting Assault (part 3): reduce spells efficiency on players\n+                if (lvl >= 45 && (GetSpec() == BOT_SPEC_WARRIOR_ARMS) &&\n+                    target->IsPlayer() && target->IsNonMeleeSpellCast(false, false, true))\n+                {\n+                    CastSpellExtraArgs args(true);\n+                    args.SetOriginalCaster(me->GetGUID());\n+                    target->CastSpell(target, UNRELENTING_ASSAULT_SPELL, args);\n+                }\n+            }\n+            if (baseId == REND_1 && lvl >= 15)\n+            {\n+                //Glyph of Rending + 6 sec duration\n+                if (Aura* rend = target->GetAura(spellId, me->GetGUID()))\n+                {\n+                    uint32 dur = rend->GetDuration() + 6000;\n+                    rend->SetDuration(dur);\n+                    rend->SetMaxDuration(dur);\n+                }\n+            }\n+            if (baseId == INTERVENE_1)\n+            {\n+                //Glyph of Intervene + 1 bonus charge\n+                if (Aura* vene = target->GetAura(spellId, me->GetGUID()))\n+                    vene->SetCharges(vene->GetCharges() + 1);\n+            }\n+            if (baseId == PIERCING_HOWL_1)\n+            {\n+                //Piercing Howl: 4 sec duraion increase (exclude players controlled)\n+                if (!target->IsControlledByPlayer())\n+                {\n+                    if (Aura* howl = target->GetAura(spellId, me->GetGUID()))\n+                    {\n+                        uint32 dur = howl->GetDuration() + 4000;\n+                        howl->SetDuration(dur);\n+                        howl->SetMaxDuration(dur);\n+                    }\n+                }\n+            }\n+            if (baseId == SHIELD_BASH_1 && (GetSpec() == BOT_SPEC_WARRIOR_PROTECTION) && lvl >= 30)\n+            {\n+                //Gag Order part 1: silence target\n+                me->CastSpell(target, GAG_ORDER_DEBUFF, true);\n+            }\n+            if (baseId == VICTORY_RUSH_1)\n+            {\n+                //Victory rush disable helper\n+                me->RemoveAura(VICTORIOUS_SPELL);\n+            }\n+            if ((baseId == DEVASTATE_1 || baseId == REVENGE_1) &&\n+                (GetSpec() == BOT_SPEC_WARRIOR_PROTECTION) &&\n+                lvl >= 55 && urand(1,100) <= 30)\n+            {\n+                //Sword and Board: trigger\n+                me->CastSpell(me, SWORD_AND_BOARD_BUFF, true);\n+                //Sword And Board: remove Shield Slam cooldown\n+                ResetSpellCooldown(SHIELD_SLAM_1);\n+            }\n+\n+            OnSpellHitTarget(target, spell);\n+        }\n+\n+        void SpellHit(WorldObject* wcaster, SpellInfo const* spell) override\n+        {\n+            Unit* caster = wcaster->ToUnit();\n+            if (!caster)\n+                return;\n+\n+            uint32 spellId = spell->Id;\n+            uint32 baseId = spell->GetFirstRankSpell()->Id;\n+            uint8 lvl = me->GetLevel();\n+\n+            //Stances helper\n+            if (spellId == BATTLE_STANCE_1 || spellId == DEFENSIVE_STANCE_1 || spellId == BERSERKER_STANCE_1)\n+            {\n+                stancetimer = 1000;\n+\n+                //stance mastery, tactical mastery\n+                uint32 temprage = 0;\n+                if (lvl >= 20)\n+                    temprage = rage > 250 ? 250 : rage;\n+                else if (lvl >= 15)\n+                    temprage = rage > 150 ? 150 : rage;\n+\n+                _stance =\n+                    spellId == BATTLE_STANCE_1 ? STANCE_BATTLE :\n+                    spellId == DEFENSIVE_STANCE_1 ? STANCE_DEFENSIVE :\n+                    spellId == BERSERKER_STANCE_1 ? STANCE_BERSERKER : STANCE_NONE;\n+\n+                me->SetPower(POWER_RAGE, temprage);\n+                //Update stength bonus from Improved Berserker Stance\n+                //if (lvl >= 45)\n+                //    SetStats(false);\n+            }\n+\n+            //Iron Will: -20% duration for stuns and charms\n+            if ((GetSpec() == BOT_SPEC_WARRIOR_ARMS || GetSpec() == BOT_SPEC_WARRIOR_FURY) &&\n+                lvl >= 15 && !spell->IsPositive() && (spell->Mechanic == MECHANIC_STUN || spell->Mechanic == MECHANIC_CHARM))\n+            {\n+                if (Aura* chun = me->GetAura(spellId, caster->GetGUID()))\n+                {\n+                    uint32 dur = chun->GetDuration() - chun->GetDuration() / 5;\n+                    chun->SetDuration(dur);\n+                    chun->SetMaxDuration(dur);\n+                }\n+            }\n+            //Glyph of Enduring Victory: +5 sec duration\n+            if (lvl >= 62 && baseId == VICTORIOUS_SPELL)\n+            {\n+                if (Aura* vict = me->GetAura(spellId))\n+                {\n+                    uint32 dur = vict->GetDuration() + 5000;\n+                    vict->SetDuration(dur);\n+                    vict->SetMaxDuration(dur);\n+                }\n+            }\n+            //Improved Berserker Stance part 2: threat mod\n+            if (baseId == BERSERKER_STANCE_PASSIVE)\n+            {\n+                if (AuraEffect* pass = me->GetAuraEffect(spellId, EFFECT_2))\n+                    pass->ChangeAmount(pass->GetAmount() - 10);\n+            }\n+            if (baseId == RETALIATION_1)\n+            {\n+                //Increase duration by 3 sec for bot\n+                if (Aura* ret = me->GetAura(spellId, me->GetGUID()))\n+                {\n+                    uint32 dur = ret->GetDuration() + 3000;\n+                    ret->SetDuration(dur);\n+                    ret->SetMaxDuration(dur);\n+                }\n+            }\n+            if (baseId == VIGILANCE_PROC) //confirmed right place\n+            {\n+                //Vigilance: remove Taunt cooldown\n+                ResetSpellCooldown(TAUNT_1);\n+            }\n+            if (baseId == SHIELD_WALL_1)\n+            {\n+                //Shield Wall Duration (id: 60175): 3 sec increased Shield Wall duration\n+                if (Aura* wall = me->GetAura(spellId))\n+                {\n+                    int32 dur = wall->GetDuration() + 3000;\n+                    wall->SetDuration(dur);\n+                    wall->SetMaxDuration(dur);\n+                }\n+            }\n+\n+            OnSpellHit(caster, spell);\n+        }\n+\n+        void DamageDealt(Unit* victim, uint32& damage, DamageEffectType damageType) override\n+        {\n+            //Unbridled Wrath\n+            if ((GetSpec() == BOT_SPEC_WARRIOR_FURY || GetSpec() == BOT_SPEC_WARRIOR_ARMS) &&\n+                damage && me->GetLevel() >= 15 && me->CanDualWield() &&\n+                (damageType == DIRECT_DAMAGE || damageType == SPELL_DIRECT_DAMAGE))\n+            {\n+                if (roll_chance_f(me->GetPPMProcChance(me->GetFloatValue(UNIT_FIELD_BASEATTACKTIME), 15.f, nullptr)))\n+                    me->CastSpell(me, UNBRIDLED_WRATH_EFFECT, true);\n+            }\n+            bot_ai::DamageDealt(victim, damage, damageType);\n+        }\n+\n+        void DamageTaken(Unit* u, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo*/) override\n+        {\n+            if (!u)\n+                return;\n+            if (!u->IsInCombat() && !me->IsInCombat())\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void OwnerAttackedBy(Unit* u) override\n+        {\n+            if (!u)\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void SetAIMiscValue(uint32 data, uint32 value) override\n+        {\n+            switch (data)\n+            {\n+                case BOTAI_MISC_WEAPON_SPEC:\n+                {\n+                    //AXE and MACE specs are handled elsewhere\n+                    _checkSwordSpec();\n+                    break;\n+                }\n+                default:\n+                    break;\n+            }\n+\n+            bot_ai::SetAIMiscValue(data, value);\n+        }\n+\n+        void Reset() override\n+        {\n+            stancetimer = 0;\n+            ragetimer = 1500;\n+            ragetimer2 = 3000;\n+            shoutCheckTimer = 5000;\n+            shatterCheckTimer = 5000;\n+            vigiCheckTimer = 5000;\n+\n+            vigilanceTargetGuid = ObjectGuid::Empty;\n+\n+            _stance = STANCE_NONE;\n+\n+            rageIncomeMult = sWorld->getRate(RATE_POWER_RAGE_INCOME);\n+            rageLossMult = sWorld->getRate(RATE_POWER_RAGE_LOSS);\n+            rage = 0;\n+\n+            DefaultInit();\n+        }\n+\n+        void ReduceCD(uint32 diff) override\n+        {\n+            if (stancetimer > diff)                 stancetimer -= diff;\n+            if (ragetimer > diff)                   ragetimer -= diff;\n+            if (ragetimer2 > diff)                  ragetimer2 -= diff;\n+            if (shoutCheckTimer > diff)             shoutCheckTimer -= diff;\n+            if (shatterCheckTimer > diff)           shatterCheckTimer -= diff;\n+            if (vigiCheckTimer > diff)              vigiCheckTimer -= diff;\n+        }\n+\n+        void InitPowers() override\n+        {\n+            me->SetPowerType(POWER_RAGE);\n+        }\n+\n+        void InitSpells() override\n+        {\n+            uint8 lvl = me->GetLevel();\n+            bool isArms = GetSpec() == BOT_SPEC_WARRIOR_ARMS;\n+            bool isFury = GetSpec() == BOT_SPEC_WARRIOR_FURY;\n+            bool isProt = GetSpec() == BOT_SPEC_WARRIOR_PROTECTION;\n+\n+            InitSpellMap(BATTLE_STANCE_1);\n+   /*Quest*/lvl >= 10 ? InitSpellMap(DEFENSIVE_STANCE_1) : RemoveSpell(DEFENSIVE_STANCE_1);\n+   /*Quest*/lvl >= 30 ? InitSpellMap(BERSERKER_STANCE_1) : RemoveSpell(BERSERKER_STANCE_1);\n+\n+   /*Quest*/lvl >= 10 ? InitSpellMap(TAUNT_1) : RemoveSpell(TAUNT_1);\n+   /*Quest*/lvl >= 10 ? InitSpellMap(SUNDER_ARMOR_1) : RemoveSpell(SUNDER_ARMOR_1);\n+            InitSpellMap(INTIMIDATING_SHOUT_1);\n+            InitSpellMap(ENRAGED_REGENERATION_1);\n+            InitSpellMap(CHARGE_1);\n+            InitSpellMap(OVERPOWER_1);\n+            InitSpellMap(BLOODRAGE_1);\n+            InitSpellMap(BERSERKER_RAGE_1);\n+            InitSpellMap(INTERCEPT_1);\n+            InitSpellMap(CLEAVE_1);\n+            InitSpellMap(HAMSTRING_1);\n+            InitSpellMap(INTERVENE_1);\n+            InitSpellMap(WHIRLWIND_1);\n+            InitSpellMap(BATTLE_SHOUT_1);\n+            InitSpellMap(REND_1);\n+            InitSpellMap(EXECUTE_1);\n+            InitSpellMap(PUMMEL_1);\n+            InitSpellMap(SLAM_1);\n+            InitSpellMap(RECKLESSNESS_1);\n+            InitSpellMap(RETALIATION_1);\n+            InitSpellMap(VICTORY_RUSH_1);\n+            InitSpellMap(THUNDER_CLAP_1);\n+            InitSpellMap(REVENGE_1);\n+            InitSpellMap(SHIELD_BLOCK_1);\n+            InitSpellMap(SHIELD_SLAM_1);\n+            InitSpellMap(SPELL_REFLECTION_1);\n+            InitSpellMap(DISARM_1);\n+            InitSpellMap(SHIELD_WALL_1);\n+            InitSpellMap(SHIELD_BASH_1);\n+            InitSpellMap(HEROIC_THROW_1);\n+            InitSpellMap(MOCKING_BLOW_1);\n+            InitSpellMap(HEROIC_STRIKE_1);\n+            InitSpellMap(CHALLENGING_SHOUT_1);\n+            InitSpellMap(COMMANDING_SHOUT_1);\n+            InitSpellMap(SHATTERING_THROW_1);\n+            InitSpellMap(DEMORALIZING_SHOUT_1);\n+\n+  /*Talent*/lvl >= 30 && isArms ? InitSpellMap(SWEEPING_STRIKES_1) : RemoveSpell(SWEEPING_STRIKES_1);\n+  /*Talent*/lvl >= 40 && isArms ? InitSpellMap(MORTAL_STRIKE_1) : RemoveSpell(MORTAL_STRIKE_1);\n+  /*Talent*/lvl >= 60 && isArms ? InitSpellMap(BLADESTORM_1) : RemoveSpell(BLADESTORM_1);\n+\n+  /*Talent*/lvl >= (isFury ? 20 : isArms ? 70 : 99) ? InitSpellMap(PIERCING_HOWL_1) : RemoveSpell(PIERCING_HOWL_1);\n+  /*Talent*/lvl >= 30 && isFury ? InitSpellMap(DEATH_WISH_1) : RemoveSpell(DEATH_WISH_1);\n+  /*Talent*/lvl >= 40 && isFury ? InitSpellMap(BLOODTHIRST_1) : RemoveSpell(BLOODTHIRST_1);\n+  /*Talent*/lvl >= 50 && isFury ? InitSpellMap(HEROIC_FURY_1) : RemoveSpell(HEROIC_FURY_1);\n+\n+  /*Talent*/lvl >= 20 && isProt ? InitSpellMap(LAST_STAND_1) : RemoveSpell(LAST_STAND_1);\n+  /*Talent*/lvl >= 30 && isProt ? InitSpellMap(CONCUSSION_BLOW_1) : RemoveSpell(CONCUSSION_BLOW_1);\n+  /*Talent*/lvl >= 40 && isProt ? InitSpellMap(VIGILANCE_1) : RemoveSpell(VIGILANCE_1);\n+  /*Talent*/lvl >= 50 && isProt ? InitSpellMap(DEVASTATE_1) : RemoveSpell(DEVASTATE_1);\n+  /*Talent*/lvl >= 60 && isProt ? InitSpellMap(SHOCKWAVE_1) : RemoveSpell(SHOCKWAVE_1);\n+        }\n+\n+        void ApplyClassPassives() const override\n+        {\n+            uint8 level = master->GetLevel();\n+            bool isArms = GetSpec() == BOT_SPEC_WARRIOR_ARMS;\n+            bool isFury = GetSpec() == BOT_SPEC_WARRIOR_FURY;\n+            bool isProt = GetSpec() == BOT_SPEC_WARRIOR_PROTECTION;\n+\n+            RefreshAura(DEEP_WOUNDS_3, (isArms || isFury) && level >= 24 ? 1 : 0);\n+            RefreshAura(DEEP_WOUNDS_2, (isArms || isFury) && level >= 23 && level < 24 ? 1 : 0);\n+            RefreshAura(DEEP_WOUNDS_1, (isArms || isFury) && level >= 22 && level < 23 ? 1 : 0);\n+            RefreshAura(TWO_HANDED_WEAPON_SPECIALIZATION, isArms && level >= 25 ? 1 : 0);\n+            RefreshAura(TASTE_FOR_BLOOD3, isArms && level >= 27 ? 1 : 0);\n+            RefreshAura(TASTE_FOR_BLOOD2, isArms && level >= 26 && level < 27 ? 1 : 0);\n+            RefreshAura(TASTE_FOR_BLOOD1, isArms && level >= 25 && level < 26 ? 1 : 0);\n+            RefreshAura(IMPROVED_HAMSTRING, isArms && level >= 15 ? 1 : 0);\n+            RefreshAura(TRAUMA2, isArms && level >= 36 ? 1 : 0);\n+            RefreshAura(TRAUMA1, isArms && level >= 35 && level < 36 ? 1 : 0);\n+            RefreshAura(SECOND_WIND, isArms && level >= 40 ? 1 : 0);\n+            RefreshAura(JUGGERNAUGHT, isArms && level >= 45 ? 1 : 0);\n+            RefreshAura(SUDDEN_DEATH, isArms && level >= 50 ? 1 : 0);\n+            RefreshAura(ENDLESS_RAGE, isArms && level >= 50 ? 1 : 0);\n+            RefreshAura(BLOOD_FRENZY, isArms && level >= 50 ? 1 : 0);\n+            RefreshAura(WRECKING_CREW, isArms && level >= 55 ? 1 : 0);\n+            _checkSwordSpec();\n+\n+            RefreshAura(ARMORED_TO_THE_TEETH, level >= 10 ? 1 : 0);\n+            RefreshAura(BLOOD_CRAZE3, (isArms || isFury) && level >= 22 ? 1 : 0);\n+            RefreshAura(BLOOD_CRAZE2, (isArms || isFury) && level >= 21 && level < 22 ? 1 : 0);\n+            RefreshAura(BLOOD_CRAZE1, (isArms || isFury) && level >= 20 && level < 21 ? 1 : 0);\n+            RefreshAura(DUAL_WIELD_SPECIALIZATION, level >= 25 ? 1 : 0);\n+            RefreshAura(FLURRY5, isFury && level >= 39 ? 1 : 0);\n+            RefreshAura(FLURRY4, isFury && level >= 38 && level < 39 ? 1 : 0);\n+            RefreshAura(FLURRY3, isFury && level >= 37 && level < 38 ? 1 : 0);\n+            RefreshAura(FLURRY2, isFury && level >= 36 && level < 37 ? 1 : 0);\n+            RefreshAura(FLURRY1, isFury && level >= 35 && level < 36 ? 1 : 0);\n+            RefreshAura(FURIOUS_ATTACKS, isFury && level >= 45 ? 1 : 0);\n+            RefreshAura(RAMPAGE, !IAmFree() && isFury && level >= 50 ? 1 : 0);\n+            RefreshAura(BLOODSURGE, isFury && level >= 50 ? 1 : 0);\n+\n+            RefreshAura(SHIELD_SPECIALIZATION, isProt && level >= 10 ? 1 : 0);\n+            RefreshAura(TOUGHNESS, isProt && level >= 20 ? 1 : 0);\n+            RefreshAura(IMPROVED_SPELL_REFLECTION, isProt && level >= 25 ? 1 : 0);\n+            RefreshAura(ONE_HANDED_WEAPON_SPECIALIZATION, isProt && level >= 35 ? 1 : 0);\n+            RefreshAura(IMPROVED_DEFENSIVE_STANCE, isProt && level >= 40 ? 1 : 0);\n+            RefreshAura(SAFEGUARD, isProt && level >= 45 ? 1 : 0);\n+            RefreshAura(WARBRINGER, isProt && level >= 50 ? 1 : 0);\n+            RefreshAura(CRITICAL_BLOCK, isProt && level >= 50 ? 1 : 0);\n+            RefreshAura(DAMAGE_SHIELD, isProt && level >= 55 ? 1 : 0);\n+\n+            RefreshAura(GLYPH_HEROIC_STRIKE, level >= 15 ? 1 : 0);\n+            RefreshAura(GLYPH_REVENGE, level >= 15 ? 1 : 0);\n+            RefreshAura(GLYPH_EXECUTION, level >= 24 ? 1 : 0);\n+            RefreshAura(GLYPH_BLOCKING, level >= 40 ? 1 : 0);\n+            RefreshAura(GLYPH_VIGILANCE, level >= 40 ? 1 : 0);\n+            RefreshAura(GLYPH_DEVASTATE, level >= 50 ? 1 : 0);\n+\n+            RefreshAura(WARRIOR_T10_PROT_4P, level >= 70 ? 1 : 0);\n+        }\n+\n+        bool CanUseManually(uint32 basespell) const override\n+        {\n+            switch (basespell)\n+            {\n+                case BLOODRAGE_1:\n+                case BERSERKER_RAGE_1:\n+                case BATTLE_SHOUT_1:\n+                case COMMANDING_SHOUT_1:\n+                case DEATH_WISH_1:\n+                    return true;\n+                case ENRAGED_REGENERATION_1:\n+                    return me->HasAuraWithMechanic(1u<<MECHANIC_ENRAGED);\n+                case BATTLE_STANCE_1:\n+                    return !_inStance(1);\n+                case DEFENSIVE_STANCE_1:\n+                    return !_inStance(2);\n+                case BERSERKER_STANCE_1:\n+                    return !_inStance(3);\n+                case SWEEPING_STRIKES_1:\n+                    return _inStance(5);\n+                case RETALIATION_1:\n+                    return _inStance(1);\n+                case RECKLESSNESS_1:\n+                    return _inStance(3);\n+                case SHIELD_WALL_1:\n+                    return CanBlock() && _inStance(2);\n+                case SHIELD_BLOCK_1:\n+                    return CanBlock();\n+                case LAST_STAND_1:\n+                case VIGILANCE_1:\n+                    return true;\n+                default:\n+                    return false;\n+            }\n+        }\n+\n+        float GetBotArmorPenetrationCoef() const override\n+        {\n+            float bonus = 0.0f;\n+\n+            if (_inStance(1))\n+            {\n+                bonus += 10.f;\n+                //Warrior T10 4P Bonus (part 1): 6% additional armor penetration in Battle Stance\n+                if (me->GetLevel() >= 75)\n+                    bonus += 6.f;\n+            }\n+\n+            //Mace Specialization: 15% armor penetration\n+            if (GetSpec() == BOT_SPEC_WARRIOR_ARMS && me->GetLevel() >= 30)\n+                if (Item const* weap = GetEquips(BOT_SLOT_MAINHAND))\n+                    if (ItemTemplate const* proto = weap->GetTemplate())\n+                        if (proto->SubClass == ITEM_SUBCLASS_WEAPON_MACE || proto->SubClass == ITEM_SUBCLASS_WEAPON_MACE2)\n+                            bonus += 15.f;\n+\n+            return bonus + bot_ai::GetBotArmorPenetrationCoef();\n+        }\n+\n+        std::vector<uint32> const* GetDamagingSpellsList() const override\n+        {\n+            return &Warrior_spells_damage;\n+        }\n+        std::vector<uint32> const* GetCCSpellsList() const override\n+        {\n+            return &Warrior_spells_cc;\n+        }\n+        //std::vector<uint32> const* GetHealingSpellsList() const override\n+        //{\n+        //    return &Warrior_spells_heal;\n+        //}\n+        std::vector<uint32> const* GetSupportSpellsList() const override\n+        {\n+            return &Warrior_spells_support;\n+        }\n+\n+    private:\n+        bool _inStance(uint8 stance) const\n+        {\n+            switch (stance)\n+            {\n+                case 1: return _stance == STANCE_BATTLE;\n+                case 2: return _stance == STANCE_DEFENSIVE;\n+                case 3: return _stance == STANCE_BERSERKER;\n+                case 4: return _stance == STANCE_BATTLE || _stance == STANCE_DEFENSIVE;\n+                case 5: return _stance == STANCE_BATTLE || _stance == STANCE_BERSERKER;\n+                default: return false;\n+            }\n+        }\n+\n+        void _checkSwordSpec() const\n+        {\n+            uint8 level = me->GetLevel();\n+            bool isArms = GetSpec() == BOT_SPEC_WARRIOR_ARMS;\n+            Item const* mhWeap = GetEquips(BOT_SLOT_MAINHAND);\n+            uint32 weaponSubClass = mhWeap ? mhWeap->GetTemplate()->SubClass : uint32(ITEM_SUBCLASS_WEAPON_WAND);\n+            bool sword = (weaponSubClass == ITEM_SUBCLASS_WEAPON_SWORD || weaponSubClass == ITEM_SUBCLASS_WEAPON_SWORD2);\n+            RefreshAura(SWORD_SPEC5, isArms && sword && level >= 34 ? 1 : 0);\n+            RefreshAura(SWORD_SPEC4, isArms && sword && level >= 33 && level < 34 ? 1 : 0);\n+            RefreshAura(SWORD_SPEC3, isArms && sword && level >= 32 && level < 33 ? 1 : 0);\n+            RefreshAura(SWORD_SPEC2, isArms && sword && level >= 31 && level < 32 ? 1 : 0);\n+            RefreshAura(SWORD_SPEC1, isArms && sword && level >= 30 && level < 31 ? 1 : 0);\n+        }\n+\n+/*tmrs*/uint32 stancetimer, ragetimer, ragetimer2, shoutCheckTimer, shatterCheckTimer, vigiCheckTimer;\n+/*misc*/int32 rage;\n+/*misc*/ObjectGuid vigilanceTargetGuid;\n+/*stnc*/uint8 _stance;\n+    };\n+};\n+\n+void AddSC_warrior_bot()\n+{\n+    new warrior_bot();\n+}\ndiff --git a/src/server/game/AI/NpcBots/botcommands.cpp b/src/server/game/AI/NpcBots/botcommands.cpp\nnew file mode 100644\nindex 0000000000..878d801b23\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/botcommands.cpp\n@@ -0,0 +1,4942 @@\n+#include \"Bag.h\"\n+#include \"bot_ai.h\"\n+#include \"botdatamgr.h\"\n+#include \"botdump.h\"\n+#include \"botgearscore.h\"\n+#include \"botlog.h\"\n+#include \"botmgr.h\"\n+#include \"botwanderful.h\"\n+#include \"bot_InstanceEvents.h\"\n+#include \"CellImpl.h\"\n+#include \"CharacterCache.h\"\n+#include \"Chat.h\"\n+#include \"Containers.h\"\n+#include \"Creature.h\"\n+#include \"DatabaseEnv.h\"\n+#include \"DBCStores.h\"\n+#include \"GameClient.h\"\n+#include \"GridNotifiers.h\"\n+#include \"GridNotifiersImpl.h\"\n+#include \"Group.h\"\n+#include \"InstanceScript.h\"\n+#include \"Item.h\"\n+#include \"Language.h\"\n+#include \"Log.h\"\n+#include \"Map.h\"\n+#include \"ObjectAccessor.h\"\n+#include \"ObjectMgr.h\"\n+#include \"Player.h\"\n+#include \"QueryPackets.h\"\n+#include \"RBAC.h\"\n+#include \"ScriptMgr.h\"\n+#include \"SpellInfo.h\"\n+#include \"SpellMgr.h\"\n+#include \"Spell.h\"\n+#include \"TemporarySummon.h\"\n+#include \"Vehicle.h\"\n+#include \"World.h\"\n+#include \"WorldDatabase.h\"\n+#include \"WorldSession.h\"\n+#include <ranges>\n+\n+/*\n+Name: script_bot_commands\n+%Complete: ???\n+Comment: Npc Bot related commands by Trickerer (onlysuffering@gmail.com)\n+Category: commandscripts/custom/\n+*/\n+\n+#ifdef _MSC_VER\n+# pragma warning(push, 4)\n+#endif\n+\n+using namespace std::string_view_literals;\n+using namespace Bcore::ChatCommands;\n+\n+static bool isWPSpawnWarningGiven = false;\n+static uint32 last_model_id = 0;\n+\n+static constexpr size_t SOUND_SETS_COUNT = 3;\n+static constexpr size_t GENDERS_COUNT = 2;\n+static constexpr size_t RACES_COUNT = 10;\n+\n+#ifndef MAX_RACES\n+ #define MAX_RACES 12\n+#endif // !MAX_RACES\n+\n+// model ids with different sound sets tied to them\n+enum SoundSetModels : uint32\n+{\n+    SOUNDSETMODEL_HUMAN_MALE_1          = 1492,\n+    SOUNDSETMODEL_HUMAN_MALE_2          = 1290,\n+    SOUNDSETMODEL_HUMAN_MALE_3          = 1699,\n+    SOUNDSETMODEL_HUMAN_FEMALE_1        = 1295,\n+    SOUNDSETMODEL_HUMAN_FEMALE_2        = 1296,\n+    SOUNDSETMODEL_HUMAN_FEMALE_3        = 1297,\n+    SOUNDSETMODEL_DWARF_MALE_1          = 1280,\n+    SOUNDSETMODEL_DWARF_MALE_2          = 1354,\n+    SOUNDSETMODEL_DWARF_MALE_3          = 1362,\n+    SOUNDSETMODEL_DWARF_FEMALE_1        = 1286,\n+    SOUNDSETMODEL_DWARF_FEMALE_2        = 1407,\n+    SOUNDSETMODEL_DWARF_FEMALE_3        = 2585,\n+    SOUNDSETMODEL_NIGHTELF_MALE_1       = 1285,\n+    SOUNDSETMODEL_NIGHTELF_MALE_2       = 1704,\n+    SOUNDSETMODEL_NIGHTELF_MALE_3       = 1706,\n+    SOUNDSETMODEL_NIGHTELF_FEMALE_1     = 1681,\n+    SOUNDSETMODEL_NIGHTELF_FEMALE_2     = 1682,\n+    SOUNDSETMODEL_NIGHTELF_FEMALE_3     = 1719,\n+    SOUNDSETMODEL_GNOME_MALE_1          = 1832,\n+    SOUNDSETMODEL_GNOME_MALE_2          = 4287,\n+    SOUNDSETMODEL_GNOME_MALE_3          = 4717,\n+    SOUNDSETMODEL_GNOME_FEMALE_1        = 3124,\n+    SOUNDSETMODEL_GNOME_FEMALE_2        = 5378,\n+    SOUNDSETMODEL_GNOME_FEMALE_3        = 3108,\n+    SOUNDSETMODEL_DRAENEI_MALE_1        = 16226,\n+    SOUNDSETMODEL_DRAENEI_MALE_2        = 16589,\n+    SOUNDSETMODEL_DRAENEI_MALE_3        = 16224,\n+    SOUNDSETMODEL_DRAENEI_FEMALE_1      = 16222,\n+    SOUNDSETMODEL_DRAENEI_FEMALE_2      = 16202,\n+    SOUNDSETMODEL_DRAENEI_FEMALE_3      = 16636,\n+    SOUNDSETMODEL_ORC_MALE_1            = 1275,\n+    SOUNDSETMODEL_ORC_MALE_2            = 1326,\n+    SOUNDSETMODEL_ORC_MALE_3            = 1368,\n+    SOUNDSETMODEL_ORC_FEMALE_1          = 1325,\n+    SOUNDSETMODEL_ORC_FEMALE_2          = 1868,\n+    SOUNDSETMODEL_ORC_FEMALE_3          = 1874,\n+    SOUNDSETMODEL_UNDEAD_MALE_1         = 1278,\n+    SOUNDSETMODEL_UNDEAD_MALE_2         = 1562,\n+    SOUNDSETMODEL_UNDEAD_MALE_3         = 1578,\n+    SOUNDSETMODEL_UNDEAD_FEMALE_1       = 1592,\n+    SOUNDSETMODEL_UNDEAD_FEMALE_2       = 1593,\n+    SOUNDSETMODEL_UNDEAD_FEMALE_3       = 1603,\n+    SOUNDSETMODEL_TAUREN_MALE_1         = 2083,\n+    SOUNDSETMODEL_TAUREN_MALE_2         = 2087,\n+    SOUNDSETMODEL_TAUREN_MALE_3         = 2096,\n+    SOUNDSETMODEL_TAUREN_FEMALE_1       = 2113,\n+    SOUNDSETMODEL_TAUREN_FEMALE_2       = 2112,\n+    SOUNDSETMODEL_TAUREN_FEMALE_3       = 2127,\n+    SOUNDSETMODEL_TROLL_MALE_1          = 3608,\n+    SOUNDSETMODEL_TROLL_MALE_2          = 4047,\n+    SOUNDSETMODEL_TROLL_MALE_3          = 4068,\n+    SOUNDSETMODEL_TROLL_FEMALE_1        = 4085,\n+    SOUNDSETMODEL_TROLL_FEMALE_2        = 4231,\n+    SOUNDSETMODEL_TROLL_FEMALE_3        = 4524,\n+    SOUNDSETMODEL_BLOODELF_MALE_1       = 15532,\n+    SOUNDSETMODEL_BLOODELF_MALE_2       = 16700,\n+    SOUNDSETMODEL_BLOODELF_MALE_3       = 16699,\n+    SOUNDSETMODEL_BLOODELF_FEMALE_1     = 15514,\n+    SOUNDSETMODEL_BLOODELF_FEMALE_2     = 15518,\n+    SOUNDSETMODEL_BLOODELF_FEMALE_3     = 15520\n+};\n+\n+static constexpr size_t RaceToRaceOffset[MAX_RACES] = {\n+    RACE_NONE,\n+    0, //RACE_HUMAN\n+    5, //RACE_ORC\n+    1, //RACE_DWARF\n+    2, //RACE_RACE_NIGHTELF\n+    6, //RACE_RACE_UNDEAD_PLAYER\n+    7, //RACE_TAUREN\n+    3, //RACE_GNOME\n+    8, //RACE_TROLL\n+    RACE_NONE,\n+    9, //RACE_BLOODELF\n+    4, //RACE_DRAENEI\n+};\n+\n+static constexpr uint32 SoundSetModelsArray[RACES_COUNT][GENDERS_COUNT][SOUND_SETS_COUNT] = {\n+    {{SOUNDSETMODEL_HUMAN_MALE_1, SOUNDSETMODEL_HUMAN_MALE_2, SOUNDSETMODEL_HUMAN_MALE_3}, {SOUNDSETMODEL_HUMAN_FEMALE_1, SOUNDSETMODEL_HUMAN_FEMALE_2, SOUNDSETMODEL_HUMAN_FEMALE_3}},\n+    {{SOUNDSETMODEL_DWARF_MALE_1, SOUNDSETMODEL_DWARF_MALE_2, SOUNDSETMODEL_DWARF_MALE_3}, {SOUNDSETMODEL_DWARF_FEMALE_1, SOUNDSETMODEL_DWARF_FEMALE_2, SOUNDSETMODEL_DWARF_FEMALE_3}},\n+    {{SOUNDSETMODEL_NIGHTELF_MALE_1, SOUNDSETMODEL_NIGHTELF_MALE_2, SOUNDSETMODEL_NIGHTELF_MALE_3}, {SOUNDSETMODEL_NIGHTELF_FEMALE_1, SOUNDSETMODEL_NIGHTELF_FEMALE_2, SOUNDSETMODEL_NIGHTELF_FEMALE_3}},\n+    {{SOUNDSETMODEL_GNOME_MALE_1, SOUNDSETMODEL_GNOME_MALE_2, SOUNDSETMODEL_GNOME_MALE_3}, {SOUNDSETMODEL_GNOME_FEMALE_1, SOUNDSETMODEL_GNOME_FEMALE_2, SOUNDSETMODEL_GNOME_FEMALE_3}},\n+    {{SOUNDSETMODEL_DRAENEI_MALE_1, SOUNDSETMODEL_DRAENEI_MALE_2, SOUNDSETMODEL_DRAENEI_MALE_3}, {SOUNDSETMODEL_DRAENEI_FEMALE_1, SOUNDSETMODEL_DRAENEI_FEMALE_2, SOUNDSETMODEL_DRAENEI_FEMALE_3}},\n+    {{SOUNDSETMODEL_ORC_MALE_1, SOUNDSETMODEL_ORC_MALE_2, SOUNDSETMODEL_ORC_MALE_3}, {SOUNDSETMODEL_ORC_FEMALE_1, SOUNDSETMODEL_ORC_FEMALE_2, SOUNDSETMODEL_ORC_FEMALE_3}},\n+    {{SOUNDSETMODEL_UNDEAD_MALE_1, SOUNDSETMODEL_UNDEAD_MALE_2, SOUNDSETMODEL_UNDEAD_MALE_3}, {SOUNDSETMODEL_UNDEAD_FEMALE_1, SOUNDSETMODEL_UNDEAD_FEMALE_2, SOUNDSETMODEL_UNDEAD_FEMALE_3}},\n+    {{SOUNDSETMODEL_TAUREN_MALE_1, SOUNDSETMODEL_TAUREN_MALE_2, SOUNDSETMODEL_TAUREN_MALE_3}, {SOUNDSETMODEL_TAUREN_FEMALE_1, SOUNDSETMODEL_TAUREN_FEMALE_2, SOUNDSETMODEL_TAUREN_FEMALE_3}},\n+    {{SOUNDSETMODEL_TROLL_MALE_1, SOUNDSETMODEL_TROLL_MALE_2, SOUNDSETMODEL_TROLL_MALE_3}, {SOUNDSETMODEL_TROLL_FEMALE_1, SOUNDSETMODEL_TROLL_FEMALE_2, SOUNDSETMODEL_TROLL_FEMALE_3}},\n+    {{SOUNDSETMODEL_BLOODELF_MALE_1, SOUNDSETMODEL_BLOODELF_MALE_2, SOUNDSETMODEL_BLOODELF_MALE_3}, {SOUNDSETMODEL_BLOODELF_FEMALE_1, SOUNDSETMODEL_BLOODELF_FEMALE_2, SOUNDSETMODEL_BLOODELF_FEMALE_3}}\n+};\n+\n+enum class PlayerVisuals\n+{\n+    Skins,\n+    Faces,\n+    HairStyles,\n+    HairColors,\n+    Features\n+};\n+\n+template<PlayerVisuals E, Races R, Gender G>\n+static consteval uint8 GetMaxVisual()\n+{\n+#define MV_PRED9(skinm,skinf,facem,facef,hairm,hairf,hairc,featm,featf) \\\n+    if      constexpr (E == PlayerVisuals::Skins)      return M ? skinm : skinf; \\\n+    else if constexpr (E == PlayerVisuals::Faces)      return M ? facem : facef; \\\n+    else if constexpr (E == PlayerVisuals::HairStyles) return M ? hairm : hairf; \\\n+    else if constexpr (E == PlayerVisuals::HairColors) return M ? hairc : hairc; \\\n+    else if constexpr (E == PlayerVisuals::Features)   return M ? featm : featf\n+\n+    constexpr bool M = G == GENDER_MALE;\n+    if constexpr (R == RACE_HUMAN)         { MV_PRED9(9,9, 11,14, 16,23, 9,  8,6); }\n+    if constexpr (R == RACE_DWARF)         { MV_PRED9(8,8,   9,9, 15,18, 9, 10,5); }\n+    if constexpr (R == RACE_NIGHTELF)      { MV_PRED9(8,8,   8,8, 11,11, 7,  5,9); }\n+    if constexpr (R == RACE_GNOME)         { MV_PRED9(4,4,   6,6, 11,11, 8,  7,6); }\n+    if constexpr (R == RACE_DRAENEI)       { MV_PRED9(13,13, 9,9, 13,15, 6,  7,6); }\n+    if constexpr (R == RACE_ORC)           { MV_PRED9(8,8,   8,8, 11,12, 7, 10,6); }\n+    if constexpr (R == RACE_UNDEAD_PLAYER) { MV_PRED9(5,5,   9,9, 14,14, 9, 16,7); }\n+    if constexpr (R == RACE_TAUREN)        { MV_PRED9(18,10, 4,3, 12,11, 2,  6,4); }\n+    if constexpr (R == RACE_TROLL)         { MV_PRED9(5,5,   4,5,   9,9, 9, 10,5); }\n+    if constexpr (R == RACE_BLOODELF)      { MV_PRED9(9,9,   9,9, 15,18, 9, 9,10); }\n+    return 0;\n+#undef MV_PRED9\n+}\n+\n+#if !defined(PLAYER_VIS_ARRS) && !defined(PLAYER_VIS_ARR)\n+#define PLAYER_VIS_ARR(r,g) \\\n+    { GetMaxVisual<PlayerVisuals::Skins, r, g>(), \\\n+    GetMaxVisual<PlayerVisuals::Faces, r, g>(), \\\n+    GetMaxVisual<PlayerVisuals::HairStyles, r, g>(), \\\n+    GetMaxVisual<PlayerVisuals::HairColors, r, g>(), \\\n+    GetMaxVisual<PlayerVisuals::Features, r, g>() }\n+\n+#define PLAYER_VIS_ARRS(r) { PLAYER_VIS_ARR(r, GENDER_MALE), PLAYER_VIS_ARR(r, GENDER_FEMALE) }\n+static constinit const uint8 MAX_PLAYER_VISUALS[MAX_RACES][GENDERS_COUNT][5] {\n+    PLAYER_VIS_ARRS(RACE_NONE),\n+    PLAYER_VIS_ARRS(RACE_HUMAN),\n+    PLAYER_VIS_ARRS(RACE_ORC),\n+    PLAYER_VIS_ARRS(RACE_DWARF),\n+    PLAYER_VIS_ARRS(RACE_NIGHTELF),\n+    PLAYER_VIS_ARRS(RACE_UNDEAD_PLAYER),\n+    PLAYER_VIS_ARRS(RACE_TAUREN),\n+    PLAYER_VIS_ARRS(RACE_GNOME),\n+    PLAYER_VIS_ARRS(RACE_TROLL),\n+    PLAYER_VIS_ARRS(RACE_NONE),\n+    PLAYER_VIS_ARRS(RACE_BLOODELF),\n+    PLAYER_VIS_ARRS(RACE_DRAENEI)\n+};\n+#undef PLAYER_VIS_ARR\n+#undef PLAYER_VIS_ARRS\n+#endif // !defined(PLAYER_VIS_ARRS) && !defined(PLAYER_VIS_ARR)\n+\n+static_assert(std::size(MAX_PLAYER_VISUALS) == MAX_RACES);\n+static_assert(std::ranges::all_of(MAX_PLAYER_VISUALS, [](auto const& c) {\n+    return std::size(c) == GENDERS_COUNT;\n+}));\n+static_assert(std::ranges::all_of(MAX_PLAYER_VISUALS, [](auto const& c) {\n+    return std::ranges::all_of(c, [](auto const& cc) { return std::size(cc) == 5; });\n+}));\n+static_assert(sizeof(MAX_PLAYER_VISUALS) == 120);\n+\n+static void ReportVisualRanges(ChatHandler* handler)\n+{\n+#define VISUAL_REPORT_VALUE_G(r,g,v) static_cast<uint32>((MAX_PLAYER_VISUALS[r][g][AsUnderlyingType(v)]))\n+#define FILL_VISUALS_REPORT2G(s,r) s \\\n+    << GetRaceName(r, loc) << \" Male:\" \\\n+    << \" skin 0-\" << VISUAL_REPORT_VALUE_G(r, GENDER_MALE, PlayerVisuals::Skins) \\\n+    << \" face 0-\" << VISUAL_REPORT_VALUE_G(r, GENDER_MALE, PlayerVisuals::Faces) \\\n+    << \" hairstyle 0-\" << VISUAL_REPORT_VALUE_G(r, GENDER_MALE, PlayerVisuals::HairStyles) \\\n+    << \" haircolor 0-\" << VISUAL_REPORT_VALUE_G(r, GENDER_MALE, PlayerVisuals::HairColors) \\\n+    << \" features 0-\" << VISUAL_REPORT_VALUE_G(r, GENDER_MALE, PlayerVisuals::Features) \\\n+    << \"\\n\" << GetRaceName(r, loc) << \" Female:\" \\\n+    << \" skin 0-\" << VISUAL_REPORT_VALUE_G(r, GENDER_FEMALE, PlayerVisuals::Skins) \\\n+    << \" face 0-\" << VISUAL_REPORT_VALUE_G(r, GENDER_FEMALE, PlayerVisuals::Faces) \\\n+    << \" hairstyle 0-\" << VISUAL_REPORT_VALUE_G(r, GENDER_FEMALE, PlayerVisuals::HairStyles) \\\n+    << \" haircolor 0-\" << VISUAL_REPORT_VALUE_G(r, GENDER_FEMALE, PlayerVisuals::HairColors) \\\n+    << \" features 0-\" << VISUAL_REPORT_VALUE_G(r, GENDER_FEMALE, PlayerVisuals::Features)\n+\n+    LocaleConstant loc = handler->GetSessionDbcLocale();\n+    handler->SendSysMessage(\"Ranges:\");\n+    for (uint8 race : { RACE_HUMAN, RACE_DWARF, RACE_NIGHTELF, RACE_GNOME, RACE_DRAENEI, RACE_ORC, RACE_UNDEAD_PLAYER, RACE_TAUREN, RACE_TROLL, RACE_BLOODELF })\n+    {\n+        std::ostringstream stream;\n+        switch (race)\n+        {\n+            case RACE_HUMAN:         FILL_VISUALS_REPORT2G(stream, RACE_HUMAN);         break;\n+            case RACE_DWARF:         FILL_VISUALS_REPORT2G(stream, RACE_DWARF);         break;\n+            case RACE_NIGHTELF:      FILL_VISUALS_REPORT2G(stream, RACE_NIGHTELF);      break;\n+            case RACE_GNOME:         FILL_VISUALS_REPORT2G(stream, RACE_GNOME);         break;\n+            case RACE_DRAENEI:       FILL_VISUALS_REPORT2G(stream, RACE_DRAENEI);       break;\n+            case RACE_ORC:           FILL_VISUALS_REPORT2G(stream, RACE_ORC);           break;\n+            case RACE_UNDEAD_PLAYER: FILL_VISUALS_REPORT2G(stream, RACE_UNDEAD_PLAYER); break;\n+            case RACE_TAUREN:        FILL_VISUALS_REPORT2G(stream, RACE_TAUREN);        break;\n+            case RACE_TROLL:         FILL_VISUALS_REPORT2G(stream, RACE_TROLL);         break;\n+            case RACE_BLOODELF:      FILL_VISUALS_REPORT2G(stream, RACE_BLOODELF);      break;\n+            default:                                                                    break;\n+        }\n+\n+        handler->SendSysMessage(stream.view());\n+    }\n+#undef FILL_VISUALS_REPORT2G\n+#undef VISUAL_REPORT_VALUE_G\n+}\n+\n+inline static uint32 GetMaxPlayerVisual(Races race, Gender gender, PlayerVisuals visual_type)\n+{\n+    return static_cast<uint32>((MAX_PLAYER_VISUALS[race][gender][AsUnderlyingType(visual_type)]));\n+}\n+\n+static bool IsValidVisual(uint8 race, uint8 gender, uint8 skin, uint8 face, uint8 hairs, uint8 hairc, uint8 features)\n+{\n+    return (\n+        race < MAX_RACES &&\n+        gender < GENDERS_COUNT &&\n+        skin <= GetMaxPlayerVisual(Races(race), Gender(gender), PlayerVisuals::Skins) &&\n+        face <= GetMaxPlayerVisual(Races(race), Gender(gender), PlayerVisuals::Faces) &&\n+        hairs <= GetMaxPlayerVisual(Races(race), Gender(gender), PlayerVisuals::HairStyles) &&\n+        hairc <= GetMaxPlayerVisual(Races(race), Gender(gender), PlayerVisuals::HairColors) &&\n+        features <= GetMaxPlayerVisual(Races(race), Gender(gender), PlayerVisuals::Features)\n+    );\n+}\n+\n+struct BotClassColor\n+{\n+    std::string_view name;\n+    std::string_view color;\n+};\n+\n+static constexpr std::array BotColors {\n+    BotClassColor{ .name=\"Unknown\"sv, .color=\"ffffffff\"sv },\n+    BotClassColor{ .name=\"Warrior\"sv, .color=\"ffc79c6e\"sv },\n+    BotClassColor{ .name=\"Paladin\"sv, .color=\"fff58cba\"sv },\n+    BotClassColor{ .name=\"Hunter\"sv, .color=\"ffabd473\"sv },\n+    BotClassColor{ .name=\"Rogue\"sv, .color=\"fffff569\"sv },\n+    BotClassColor{ .name=\"Priest\"sv, .color=\"ffffffff\"sv },\n+    BotClassColor{ .name=\"Death Knight\"sv, .color=\"ffc41f3b\"sv },\n+    BotClassColor{ .name=\"Shaman\"sv, .color=\"ff0070de\"sv },\n+    BotClassColor{ .name=\"Mage\"sv, .color=\"ff69ccf0\"sv },\n+    BotClassColor{ .name=\"Warlock\"sv, .color=\"ff9482c9\"sv },\n+    BotClassColor{ .name=\"Unknown\"sv, .color=\"ffffffff\"sv },\n+    BotClassColor{ .name=\"Druid\"sv, .color=\"ffff7d0a\"sv },\n+    BotClassColor{ .name=\"Blademaster\"sv, .color=\"ffa10015\"sv },\n+    BotClassColor{ .name=\"Obsidian Destroyer\"sv, .color=\"ff29004a\"sv },\n+    BotClassColor{ .name=\"Archmage\"sv, .color=\"ff028a99\"sv },\n+    BotClassColor{ .name=\"Dreadlord\"sv, .color=\"ff534161\"sv },\n+    BotClassColor{ .name=\"Spellbreaker\"sv, .color=\"ffcf3c1f\"sv },\n+    BotClassColor{ .name=\"Dark Ranger\"sv, .color=\"ff3e255e\"sv },\n+    BotClassColor{ .name=\"Necromancer\"sv, .color=\"ff9900cc\"sv },\n+    BotClassColor{ .name=\"Sea Witch\"sv, .color=\"ff40d7a9\"sv },\n+    BotClassColor{ .name=\"Crypt Lord\"sv, .color=\"ff19782b\"sv }\n+};\n+\n+static_assert(std::size(BotColors) == BOT_CLASS_END);\n+static_assert(BotColors[BOT_CLASS_CRYPT_LORD].name == \"Crypt Lord\"sv);\n+\n+static std::pair<uint8, uint8> GetZoneLevels(uint32 zoneId)\n+{\n+    //Only maps 0 and 1 are covered\n+    switch (zoneId)\n+    {\n+        case 1: // Dun Morogh\n+        case 12: // Elwynn Forest\n+        case 14: // Durotar\n+        case 85: // Tirisfal Glades\n+        case 141: // Teldrassil\n+        case 215: // Mulgore\n+        case 3430: // Eversong Woods\n+        case 3524: // Azuremyst Isle\n+            return { 1, 10 };\n+        case 38: // Loch Modan\n+        case 40: // Westfall\n+        case 130: // Silverpine Woods\n+        case 148: // Darkshore\n+        case 3433: // Ghostlands\n+        case 3525: // Bloodmyst Isle\n+        case 721: // Gnomeregan\n+            return { 8, 20 };\n+        case 17: // Barrens\n+            return { 8, 25 };\n+        case 44: // Redridge Mountains\n+        case 406: // Stonetalon Mountains\n+            return { 13, 25 };\n+        case 10: // Duskwood\n+        case 11: // Wetlands\n+        case 267: // Hillsbrad Foothills\n+        case 331: // Ashenvale\n+            return { 18, 30 };\n+        case 400: // Thousand Needles\n+            return { 23, 35 };\n+        case 36: // Alterac Mountains\n+        case 45: // Arathi Highlands\n+        case 405: // Desolace\n+            return { 28, 40 };\n+        case 33: // Stranglethorn Valley\n+        case 3: // Badlands\n+        case 8: // Swamp of Sorrows\n+        case 15: // Dustwallow Marsh\n+            return { 33, 45 };\n+        case 47: // Hinterlands\n+        case 357: // Feralas\n+        case 440: // Tanaris\n+            return { 38, 50 };\n+        case 4: // Blasted Lands\n+        case 16: // Azshara\n+        case 51: // Searing Gorge\n+            return { 43, 54 };\n+        case 490: // Un'Goro Crater\n+        case 361: // Felwood\n+            return { 46, 56 };\n+        case 28: // Western Plaguelands\n+        case 46: // Burning Steppes\n+            return { 48, 56 };\n+        case 41: // Deadwind Pass\n+            return { 50, 60 };\n+        case 1377: // Silithus\n+        case 2017: // Stratholme\n+        case 139: // Eastern Plaguelands\n+        case 618: // Winterspring\n+            return { 53, 60 };\n+        case 25: // BlackrockMountain\n+        case 493: // Moonglade\n+            return { 46, 60 };\n+        default:\n+            BOT_LOG_ERROR(\"scripts\", \"GetZoneLevels: no choice for zoneId {}\", zoneId);\n+            return { 1, 60 };\n+    }\n+}\n+\n+//static bool IsNoWPZone(uint32 zoneId)\n+//{\n+//    //Only maps 0 and 1 are covered\n+//    switch (zoneId)\n+//    {\n+//        case 1477: // Moonglade\n+//        case 1519: // Stormwind\n+//        case 1537: // Ironforge\n+//        case 1637: // Orgrimmar\n+//        case 1638: // Thunder Bluff\n+//        case 1657: // Darnassus\n+//        case 3487: // Silvermoon\n+//        case 3557: // Exodar\n+//        case 493: // Moonglade\n+//            return true;\n+//        default:\n+//            return false;\n+//    }\n+//}\n+\n+static uint32 GetZoneIdOverride(uint32 zoneId)\n+{\n+    switch (zoneId)\n+    {\n+        case 718: // Wailing Caverns\n+            return 17; // Barrens\n+        case 1337: // Uldaman\n+            return 3; // Badlands\n+        case 2057: // Scholomance\n+            return 139; // EPL\n+        case 2100: // Maraudon\n+            return 405; // Desolace\n+        case 1581: // Deadmines\n+            return 40; // Westfall\n+        default:\n+            return zoneId;\n+    }\n+}\n+\n+struct BotInfo\n+{\n+    BotInfo(uint32 Id, std::string_view&& Name, uint8 Race) : id(Id), name(std::move(Name)), race(Race) {}\n+    uint32 id;\n+    std::string_view name;\n+    uint8 race;\n+\n+    inline constexpr bool operator==(BotInfo const& other) const noexcept { return id == other.id; }\n+    inline constexpr std::strong_ordering operator<=>(BotInfo const& other) const noexcept { return id <=> other.id; }\n+};\n+\n+template <typename C, typename Fn>\n+requires\n+std::random_access_iterator<typename C::iterator> &&\n+std::is_same_v<std::string, typename C::value_type> &&\n+std::is_convertible_v<Fn, std::function<void(std::string const&)>>\n+static void DoForAllNamesNormalizedIn(C& names, Fn&& func)\n+{\n+    for (std::string& name : names)\n+    {\n+        for (std::size_t i{}; i < name.size(); ++i)\n+            if (name[i] == '_')\n+                name[i] = ' ';\n+\n+        std::invoke(std::move(func), name);\n+    }\n+}\n+\n+class script_bot_commands : public CommandScript\n+{\n+public:\n+    script_bot_commands() : CommandScript(\"script_bot_commands\") { }\n+\n+    class WanderNode_AI : public CreatureAI\n+    {\n+    public:\n+        WanderNode_AI(Creature* creature, WanderNode* wp) : CreatureAI(creature), _wp(wp)\n+        { _wp->SetCreature(me); }\n+\n+        //void JustDied(Unit*) override { _wp->SetCreature(nullptr); }\n+        void OnDespawn() override { _wp->SetCreature(nullptr); }\n+\n+        bool CanAIAttack(Unit const*) const override { return false; }\n+        void MoveInLineOfSight(Unit*) override {}\n+        void AttackStart(Unit*) override {}\n+        void UpdateAI(uint32) override {}\n+\n+    private:\n+        WanderNode* const _wp;\n+    };\n+\n+    ChatCommandTable GetCommands() const override\n+    {\n+        static ChatCommandTable npcbotLogCommandTable =\n+        {\n+            //{ \"testwrite\",  HandleNpcBotLogTestWriteCommand,        rbac::RBAC_PERM_COMMAND_NPCBOT_DUMP_WRITE,         Console::Yes },\n+            { \"clear\",      HandleNpcBotLogClearCommand,            rbac::RBAC_PERM_COMMAND_NPCBOT_DUMP_WRITE,         Console::Yes },\n+        };\n+\n+        static ChatCommandTable npcbotToggleCommandTable =\n+        {\n+            { \"flags\",      HandleNpcBotToggleFlagsCommand,         rbac::RBAC_PERM_COMMAND_NPCBOT_TOGGLE_FLAGS,       Console::No  },\n+        };\n+\n+        static ChatCommandTable npcbotWPCommandTable =\n+        {\n+            { \"spawnall\",   HandleNpcBotWPSpawnAllCommand,          rbac::RBAC_PERM_COMMAND_NPCBOT_SPAWN,              Console::No  },\n+            { \"move\",       HandleNpcBotWPMoveCommand,              rbac::RBAC_PERM_COMMAND_NPCBOT_SPAWN,              Console::No  },\n+            { \"add\",        HandleNpcBotWPAddCommand,               rbac::RBAC_PERM_COMMAND_NPCBOT_SPAWN,              Console::No  },\n+            { \"del\",        HandleNpcBotWPDeleteCommand,            rbac::RBAC_PERM_COMMAND_NPCBOT_SPAWN,              Console::No  },\n+            { \"list\",       HandleNpcBotWPListCommand,              rbac::RBAC_PERM_COMMAND_NPCBOT_SPAWN,              Console::No  },\n+            { \"list all\",   HandleNpcBotWPListAllCommand,           rbac::RBAC_PERM_COMMAND_NPCBOT_SPAWN,              Console::Yes },\n+            { \"go\",         HandleNpcBotWPGoCommand,                rbac::RBAC_PERM_COMMAND_NPCBOT_SPAWN,              Console::No  },\n+            { \"setlevels\",  HandleNpcBotWPSetLevelsCommand,         rbac::RBAC_PERM_COMMAND_NPCBOT_SPAWN,              Console::No  },\n+            { \"setlevels z\",HandleNpcBotWPSetLevelsZoneCommand,     rbac::RBAC_PERM_COMMAND_NPCBOT_SPAWN,              Console::No  },\n+            { \"setflags\",   HandleNpcBotWPSetFlagsCommand,          rbac::RBAC_PERM_COMMAND_NPCBOT_SPAWN,              Console::No  },\n+            { \"setflags z\", HandleNpcBotWPSetFlagsZoneCommand,      rbac::RBAC_PERM_COMMAND_NPCBOT_SPAWN,              Console::No  },\n+            { \"setname\",    HandleNpcBotWPSetNameCommand,           rbac::RBAC_PERM_COMMAND_NPCBOT_SPAWN,              Console::No  },\n+            { \"setlinks\",   HandleNpcBotWPSetLinksCommand,          rbac::RBAC_PERM_COMMAND_NPCBOT_SPAWN,              Console::No  },\n+            { \"setweights\", HandleNpcBotWPSetLinkWeightsCommand,    rbac::RBAC_PERM_COMMAND_NPCBOT_SPAWN,              Console::No  },\n+            { \"info\",       HandleNpcBotWPInfoCommand,              rbac::RBAC_PERM_COMMAND_NPCBOT_SPAWN,              Console::No  },\n+            { \"links\",      HandleNpcBotWPLinksCommand,             rbac::RBAC_PERM_COMMAND_NPCBOT_SPAWN,              Console::No  },\n+        };\n+\n+        static ChatCommandTable npcbotDebugEventCommandTable =\n+        {\n+            { \"launch\",     HandleNpcBotDebugEventLaunchCommand,    rbac::RBAC_PERM_COMMAND_NPCBOT_DEBUG_STATES,       Console::No  },\n+        };\n+\n+        static ChatCommandTable npcbotDebugCommandTable =\n+        {\n+            { \"raid\",       HandleNpcBotDebugRaidCommand,           rbac::RBAC_PERM_COMMAND_NPCBOT_DEBUG_RAID,         Console::No  },\n+            { \"mount\",      HandleNpcBotDebugMountCommand,          rbac::RBAC_PERM_COMMAND_NPCBOT_DEBUG_MOUNT,        Console::No  },\n+            { \"model\",      HandleNpcBotDebugModelCommand,          rbac::RBAC_PERM_COMMAND_NPCBOT_DEBUG_VISUAL,       Console::No  },\n+            { \"spellvisual\",HandleNpcBotDebugSpellVisualCommand,    rbac::RBAC_PERM_COMMAND_NPCBOT_DEBUG_VISUAL,       Console::No  },\n+            { \"states\",     HandleNpcBotDebugStatesCommand,         rbac::RBAC_PERM_COMMAND_NPCBOT_DEBUG_STATES,       Console::No  },\n+            { \"names\",      HandleNpcBotDebugNamesCommand,          rbac::RBAC_PERM_COMMAND_NPCBOT_DEBUG_STATES,       Console::No  },\n+            { \"spells\",     HandleNpcBotDebugSpellsCommand,         rbac::RBAC_PERM_COMMAND_NPCBOT_DEBUG_STATES,       Console::No  },\n+            { \"guids\",      HandleNpcBotDebugGuidsCommand,          rbac::RBAC_PERM_COMMAND_NPCBOT_DEBUG_STATES,       Console::No  },\n+            { \"wbequips\",   HandleNpcBotDebugWBEquipsCommand,       rbac::RBAC_PERM_COMMAND_NPCBOT_DEBUG_STATES,       Console::Yes },\n+            { \"wpreid\",     HandleNpcBotDebugWPReidCommand,         rbac::RBAC_PERM_COMMAND_NPCBOT_DEBUG_STATES,       Console::Yes },\n+            { \"event\",      npcbotDebugEventCommandTable                                                                            },\n+        };\n+\n+        static ChatCommandTable npcbotSetCommandTable =\n+        {\n+            { \"faction\",    HandleNpcBotSetFactionCommand,          rbac::RBAC_PERM_COMMAND_NPCBOT_SET_FACTION,        Console::No  },\n+            { \"owner\",      HandleNpcBotSetOwnerCommand,            rbac::RBAC_PERM_COMMAND_NPCBOT_SET_OWNER,          Console::No  },\n+            { \"spec\",       HandleNpcBotSetSpecCommand,             rbac::RBAC_PERM_COMMAND_NPCBOT_SET_SPEC,           Console::No  },\n+        };\n+\n+        static ChatCommandTable npcbotCommandFollowCommandTable =\n+        {\n+            { \"\",           HandleNpcBotCommandFollowCommand,       rbac::RBAC_PERM_COMMAND_NPCBOT_COMMAND_FOLLOW,     Console::No  },\n+            { \"only\",       HandleNpcBotCommandFollowOnlyCommand,   rbac::RBAC_PERM_COMMAND_NPCBOT_COMMAND_FOLLOW,     Console::No  },\n+        };\n+\n+        static ChatCommandTable npcbotCommandCommandTable =\n+        {\n+            { \"standstill\", HandleNpcBotCommandStandstillCommand,   rbac::RBAC_PERM_COMMAND_NPCBOT_COMMAND_STANDSTILL, Console::No  },\n+            { \"stopfully\",  HandleNpcBotCommandStopfullyCommand,    rbac::RBAC_PERM_COMMAND_NPCBOT_COMMAND_STOPFULLY,  Console::No  },\n+            { \"follow\",     npcbotCommandFollowCommandTable                                                                         },\n+            { \"walk\",       HandleNpcBotCommandWalkCommand,         rbac::RBAC_PERM_COMMAND_NPCBOT_COMMAND_MISC,       Console::No  },\n+            { \"nogossip\",   HandleNpcBotCommandNoGossipCommand,     rbac::RBAC_PERM_COMMAND_NPCBOT_COMMAND_MISC,       Console::No  },\n+            { \"unbind\",     HandleNpcBotCommandUnBindCommand,       rbac::RBAC_PERM_COMMAND_NPCBOT_COMMAND_MISC,       Console::No  },\n+            { \"rebind\",     HandleNpcBotCommandReBindCommand,       rbac::RBAC_PERM_COMMAND_NPCBOT_COMMAND_MISC,       Console::No  },\n+            { \"nocast\",     HandleNpcBotCommandNoCastCommand,       rbac::RBAC_PERM_COMMAND_NPCBOT_COMMAND_MISC,       Console::No  },\n+            { \"nolongcast\", HandleNpcBotCommandNoLongCastCommand,   rbac::RBAC_PERM_COMMAND_NPCBOT_COMMAND_MISC,       Console::No  },\n+        };\n+\n+        static ChatCommandTable npcbotAttackDistanceCommandTable =\n+        {\n+            { \"short\",      HandleNpcBotAttackDistanceShortCommand, rbac::RBAC_PERM_COMMAND_NPCBOT_ATTDISTANCE_SHORT,  Console::No  },\n+            { \"long\",       HandleNpcBotAttackDistanceLongCommand,  rbac::RBAC_PERM_COMMAND_NPCBOT_ATTDISTANCE_LONG,   Console::No  },\n+            { \"\",           HandleNpcBotAttackDistanceExactCommand, rbac::RBAC_PERM_COMMAND_NPCBOT_ATTDISTANCE_EXACT,  Console::No  },\n+        };\n+\n+        static ChatCommandTable npcbotDistanceCommandTable =\n+        {\n+            { \"attack\",     npcbotAttackDistanceCommandTable                                                                        },\n+            { \"\",           HandleNpcBotFollowDistanceCommand,      rbac::RBAC_PERM_COMMAND_NPCBOT_FOLDISTANCE_EXACT,  Console::No  },\n+        };\n+\n+        static ChatCommandTable npcbotOrderCommandTable =\n+        {\n+            { \"cast\",       HandleNpcBotOrderCastCommand,           rbac::RBAC_PERM_COMMAND_NPCBOT_ORDER_CAST,         Console::No  },\n+            { \"pull\",       HandleNpcBotOrderPullCommand,           rbac::RBAC_PERM_COMMAND_NPCBOT_ORDER_CAST,         Console::No  },\n+        };\n+\n+        static ChatCommandTable npcbotVehicleCommandTable =\n+        {\n+            { \"eject\",      HandleNpcBotVehicleEjectCommand,        rbac::RBAC_PERM_COMMAND_NPCBOT_VEHICLE_EJECT,      Console::No  },\n+        };\n+\n+        static ChatCommandTable npcbotDumpCommandTable =\n+        {\n+            { \"load\",       HandleNpcBotDumpLoadCommand,            rbac::RBAC_PERM_COMMAND_NPCBOT_DUMP_LOAD,          Console::Yes },\n+            { \"write\",      HandleNpcBotDumpWriteCommand,           rbac::RBAC_PERM_COMMAND_NPCBOT_DUMP_WRITE,         Console::Yes },\n+        };\n+\n+        static ChatCommandTable npcbotRecallCommandTable =\n+        {\n+            { \"\",           HandleNpcBotRecallCommand,              rbac::RBAC_PERM_COMMAND_NPCBOT_RECALL,             Console::No  },\n+            { \"spawns\",     HandleNpcBotRecallSpawnsCommand,        rbac::RBAC_PERM_COMMAND_NPCBOT_RECALL,             Console::No  },\n+            { \"teleport\",   HandleNpcBotRecallTeleportCommand,      rbac::RBAC_PERM_COMMAND_NPCBOT_RECALL,             Console::No  },\n+        };\n+\n+        static ChatCommandTable npcbotListSpawnedFreeCommandTable =\n+        {\n+            { \"\",           HandleNpcBotSpawnedFreeCommand,         rbac::RBAC_PERM_COMMAND_NPCBOT_SPAWNED,            Console::Yes },\n+            { \"zone\",       HandleNPCBotSpawnedFreeZoneCommand,     rbac::RBAC_PERM_COMMAND_NPCBOT_SPAWNED,            Console::Yes },\n+            { \"class\",      HandleNPCBotSpawnedFreeClassCommand,    rbac::RBAC_PERM_COMMAND_NPCBOT_SPAWNED,            Console::Yes },\n+            { \"level\",      HandleNPCBotSpawnedFreeLevelCommand,    rbac::RBAC_PERM_COMMAND_NPCBOT_SPAWNED,            Console::Yes },\n+            { \"stats\",      HandleNpcBotSpawnedFreeStatsCommand,    rbac::RBAC_PERM_COMMAND_NPCBOT_SPAWNED,            Console::Yes },\n+        };\n+\n+        static ChatCommandTable npcbotListSpawnedCommandTable =\n+        {\n+            { \"\",           HandleNpcBotSpawnedCommand,             rbac::RBAC_PERM_COMMAND_NPCBOT_SPAWNED,            Console::Yes },\n+            { \"zone\",       HandleNPCBotSpawnedZoneCommand,         rbac::RBAC_PERM_COMMAND_NPCBOT_SPAWNED,            Console::Yes },\n+            { \"class\",      HandleNPCBotSpawnedClassCommand,        rbac::RBAC_PERM_COMMAND_NPCBOT_SPAWNED,            Console::Yes },\n+            { \"level\",      HandleNPCBotSpawnedLevelCommand,        rbac::RBAC_PERM_COMMAND_NPCBOT_SPAWNED,            Console::Yes },\n+            { \"stats\",      HandleNpcBotSpawnedStatsCommand,        rbac::RBAC_PERM_COMMAND_NPCBOT_SPAWNED,            Console::Yes },\n+            { \"free\",       npcbotListSpawnedFreeCommandTable                                                                       },\n+        };\n+\n+        static ChatCommandTable npcbotListCommandTable =\n+        {\n+            { \"spawned\",    npcbotListSpawnedCommandTable                                                                           },\n+        };\n+\n+        static ChatCommandTable npcbotDeleteCommandTable =\n+        {\n+            { \"\",           HandleNpcBotDeleteCommand,              rbac::RBAC_PERM_COMMAND_NPCBOT_DELETE,             Console::No  },\n+            { \"id\",         HandleNpcBotDeleteByIdCommand,          rbac::RBAC_PERM_COMMAND_NPCBOT_DELETE,             Console::Yes },\n+            { \"free\",       HandleNpcBotDeleteFreeCommand,          rbac::RBAC_PERM_COMMAND_NPCBOT_DELETE,             Console::Yes },\n+        };\n+\n+        static ChatCommandTable npcbotSendToPointCommandTable =\n+        {\n+            { \"\",           HandleNpcBotSendToPointCommand,         rbac::RBAC_PERM_COMMAND_NPCBOT_SEND,               Console::No  },\n+            { \"set\",        HandleNpcBotSendToPointSetCommand,      rbac::RBAC_PERM_COMMAND_NPCBOT_SEND,               Console::No  },\n+        };\n+\n+        static ChatCommandTable npcbotSendToCommandTable =\n+        {\n+            { \"\",           HandleNpcBotSendToCommand,              rbac::RBAC_PERM_COMMAND_NPCBOT_SEND,               Console::No  },\n+            { \"last\",       HandleNpcBotSendToLastCommand,          rbac::RBAC_PERM_COMMAND_NPCBOT_SEND,               Console::No  },\n+            { \"point\",      npcbotSendToPointCommandTable                                                                           },\n+        };\n+\n+        static ChatCommandTable npcbotUseOnBotCommandTable =\n+        {\n+            { \"spell\",      HandleNpcBotUseOnBotSpellCommand,       rbac::RBAC_PERM_COMMAND_NPCBOT_COMMAND_MISC,       Console::No  },\n+            { \"item\",       HandleNpcBotUseOnBotItemCommand,        rbac::RBAC_PERM_COMMAND_NPCBOT_COMMAND_MISC,       Console::No  },\n+        };\n+\n+        static ChatCommandTable npcbotCommandTable =\n+        {\n+            //{ \"debug\",      npcbotDebugCommandTable                                                                                 },\n+            //{ \"toggle\",     npcbotToggleCommandTable                                                                                },\n+            { \"set\",        npcbotSetCommandTable                                                                                   },\n+            { \"add\",        HandleNpcBotAddCommand,                 rbac::RBAC_PERM_COMMAND_NPCBOT_ADD,                Console::No  },\n+            { \"remove\",     HandleNpcBotRemoveCommand,              rbac::RBAC_PERM_COMMAND_NPCBOT_REMOVE,             Console::No  },\n+            { \"free\",       HandleNpcBotFreeCommand,                rbac::RBAC_PERM_COMMAND_NPCBOT_REMOVE,             Console::No  },\n+            { \"createnew\",  HandleNpcBotCreateNewCommand,           rbac::RBAC_PERM_COMMAND_NPCBOT_CREATENEW,          Console::Yes },\n+            { \"spawn\",      HandleNpcBotSpawnCommand,               rbac::RBAC_PERM_COMMAND_NPCBOT_SPAWN,              Console::No  },\n+            { \"move\",       HandleNpcBotMoveCommand,                rbac::RBAC_PERM_COMMAND_NPCBOT_MOVE,               Console::No  },\n+            { \"delete\",     npcbotDeleteCommandTable                                                                                },\n+            { \"lookup\",     HandleNpcBotLookupCommand,              rbac::RBAC_PERM_COMMAND_NPCBOT_LOOKUP,             Console::Yes },\n+            { \"list\",       npcbotListCommandTable                                                                                  },\n+            { \"revive\",     HandleNpcBotReviveCommand,              rbac::RBAC_PERM_COMMAND_NPCBOT_REVIVE,             Console::No  },\n+            { \"useonbot\",   npcbotUseOnBotCommandTable                                                                              },\n+            { \"command\",    npcbotCommandCommandTable                                                                               },\n+            { \"info\",       HandleNpcBotInfoCommand,                rbac::RBAC_PERM_COMMAND_NPCBOT_INFO,               Console::Yes },\n+            { \"hide\",       HandleNpcBotHideCommand,                rbac::RBAC_PERM_COMMAND_NPCBOT_HIDE,               Console::No  },\n+            { \"unhide\",     HandleNpcBotUnhideCommand,              rbac::RBAC_PERM_COMMAND_NPCBOT_UNHIDE,             Console::No  },\n+            { \"show\",       HandleNpcBotUnhideCommand,              rbac::RBAC_PERM_COMMAND_NPCBOT_UNHIDE,             Console::No  },\n+            { \"recall\",     npcbotRecallCommandTable                                                                                },\n+            { \"kill\",       HandleNpcBotKillCommand,                rbac::RBAC_PERM_COMMAND_NPCBOT_KILL,               Console::No  },\n+            { \"suicide\",    HandleNpcBotKillCommand,                rbac::RBAC_PERM_COMMAND_NPCBOT_KILL,               Console::No  },\n+            { \"fix\",        HandleNpcBotFixCommand,                 rbac::RBAC_PERM_COMMAND_NPCBOT_REVIVE,             Console::No  },\n+            { \"go\",         HandleNpcBotGoCommand,                  rbac::RBAC_PERM_COMMAND_NPCBOT_MOVE,               Console::No  },\n+            { \"gs\",         HandleNpcBotGearScoreCommand,           rbac::RBAC_PERM_COMMAND_NPCBOT_COMMAND_MISC,       Console::No  },\n+            { \"sendto\",     npcbotSendToCommandTable                                                                                },\n+            { \"distance\",   npcbotDistanceCommandTable                                                                              },\n+            { \"order\",      npcbotOrderCommandTable                                                                                 },\n+            { \"vehicle\",    npcbotVehicleCommandTable                                                                               },\n+            { \"dump\",       npcbotDumpCommandTable                                                                                  },\n+            { \"wp\",         npcbotWPCommandTable                                                                                    },\n+            { \"log\",        npcbotLogCommandTable                                                                                   },\n+        };\n+\n+        static ChatCommandTable commandTable =\n+        {\n+            { \"npcbot\",     npcbotCommandTable                                                                                      },\n+        };\n+        return commandTable;\n+    }\n+\n+    static bool HandleNpcBotLogClearCommand(ChatHandler* handler)\n+    {\n+        CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();\n+        trans->Append(\"TRUNCATE TABLE `characters_npcbot_logs`\");\n+        trans->Append(\"ALTER TABLE `characters_npcbot_logs` AUTO_INCREMENT = 0\");\n+        CharacterDatabase.CommitTransaction(trans);\n+        handler->SendSysMessage(\"Table `characters_npcbot_logs` was cleared and autoincrement was reset\");\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotLogTestWriteCommand(ChatHandler* handler, Optional<std::underlying_type_t<BotLogType>> log_type, Optional<uint32> entry, Optional<std::vector<std::string_view>> extra)\n+    {\n+        if (!log_type || !entry)\n+        {\n+            handler->PSendSysMessage(\".npcbot log testwrite #log_type #entry #[owner] #[mapid] #[inmap] #[inworld] #[params[1-%u]]\", MAX_BOT_LOG_PARAMS);\n+            handler->SendSysMessage(\"Test `characters_npcbot_logs` table write 2\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        decltype(extra)::value_type extras = extra ? std::move(extra.value()) : decltype(extra)::value_type{};\n+        extras.resize(MAX_BOT_LOG_PARAMS, {});\n+        BotLogger::Log(*log_type, *entry, std::move(extras[0]), std::move(extras[1]), std::move(extras[2]), std::move(extras[3]), std::move(extras[4]));\n+        return true;\n+    }\n+\n+    static TempSummon* HandleWPSummon(WanderNode* wp, Map* map)\n+    {\n+        CellCoord c = Bcore::ComputeCellCoord(wp->m_positionX, wp->m_positionY);\n+        GridCoord g = Bcore::ComputeGridCoord(wp->m_positionX, wp->m_positionY);\n+        ASSERT(c.IsCoordValid(), \"Invalid Cell coord!\");\n+        ASSERT(g.IsCoordValid(), \"Invalid Grid coord!\");\n+        map->LoadGrid(wp->m_positionX, wp->m_positionY);\n+        ASSERT(map->GetEntry()->IsContinent() || map->GetEntry()->IsBattlegroundOrArena(), \"%s\", map->GetDebugInfo().c_str());\n+\n+        TempSummon* wpc = map->SummonCreature(VISUAL_WAYPOINT, *wp);\n+        wpc->SetTempSummonType(TEMPSUMMON_CORPSE_DESPAWN);\n+        wpc->AIM_Destroy();\n+        wpc->AIM_Create(new WanderNode_AI(wpc, wp));\n+        wpc->setActive(true);\n+        wpc->SetFarVisible(true);\n+        wpc->SetLevel(wp->GetLevels().first);\n+        wpc->AddUnitState(UNIT_STATE_EVADE);\n+        wpc->SetUnitFlag(UNIT_FLAG_IMMUNE_TO_NPC | UNIT_FLAG_IMMUNE_TO_PC);\n+        wpc->SetMaxHealth(wp->GetWPId());\n+        wpc->SetFullHealth();\n+        wpc->SetPowerType(POWER_MANA);\n+        wpc->SetMaxPower(POWER_MANA, wp->GetFlags());\n+        wpc->SetFullPower(POWER_MANA);\n+        wpc->SetObjectScale(4.0f);\n+        wp->SetupLinkFromAura();\n+        wp->SetupLinkToAura();\n+        return wpc;\n+    }\n+\n+    static bool HandleNpcBotWPSpawnAllCommand(ChatHandler* handler)\n+    {\n+        if (!isWPSpawnWarningGiven)\n+        {\n+            isWPSpawnWarningGiven = true;\n+            handler->SendSysMessage(\"Warning! Spawning all wander points in map will load ALL required grids. Repeat to confirm.\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+        else\n+        {\n+            if (WanderNode::GetAllWPsCount() == 0u)\n+                BotDataMgr::LoadWanderMap();\n+\n+            Player* player = handler->GetPlayer();\n+            WanderNode::DoForAllMapWPs(player->GetMapId(), [map = player->GetMap()](WanderNode const* wp) {\n+                if (Creature* wpc = wp->GetCreature())\n+                    wpc->ToTempSummon()->DespawnOrUnsummon();\n+                ASSERT_NOTNULL(HandleWPSummon(const_cast<WanderNode*>(wp), map));\n+            });\n+        }\n+\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotWPLinksCommand(ChatHandler* handler)\n+    {\n+        using WanderNodeLink = WanderNode::WanderNodeLink;\n+\n+        Player* player = handler->GetPlayer();\n+        Unit* wpc = player->GetSelectedUnit();\n+\n+        WanderNode* wp = wpc ? WanderNode::FindInAllWPs(wpc->ToCreature()) : nullptr;\n+        if (!wp)\n+        {\n+            handler->SendSysMessage(\"No WP selected\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        auto const& links = wp->GetLinks();\n+\n+        std::vector<WanderNode const*> to_links;\n+        to_links.reserve(links.size());\n+        WanderNode::DoForAllMapWPs(wp->GetMapId(), [=, &to_links](WanderNode const* mwp) {\n+            if (mwp != wp) [[likely]]\n+                if (mwp->HasLink(wp)) [[unlikely]]\n+                    to_links.push_back(mwp);\n+        });\n+\n+        uint32 counter = 0;\n+        std::ostringstream ss;\n+        ss.setf(std::ios_base::fixed);\n+        ss.precision(2);\n+        ss << uint32(to_links.size()) << \" WPs have a link to WP \" << wp->GetWPId() << ':';\n+        WanderNode::DoForContainerWPs(to_links, [&ss, &counter, wp = wp](WanderNode const* lwp) {\n+            ss << \"\\n\" << ++counter << \") <- \" << lwp->ToString() << \" (dist2d: \" << lwp->GetExactDist2d(wp) << \")\";\n+        });\n+        counter = 0;\n+        ss << \"\\nWP \" << wp->GetWPId() << \" has \" << uint32(links.size()) << \" links (avg weight \" << wp->GetAverageLinkWeight() << \"):\";\n+        WanderNode::DoForContainerWPLinks(links, [&ss, &counter, wp = wp](WanderNodeLink const& wlp) {\n+            ss << \"\\n\" << ++counter << \") -> \" << wlp.wp->ToString(static_cast<int32>(wlp.weight)) << \" (dist2d: \" << wp->GetExactDist2d(wlp.wp) << \")\";\n+        });\n+\n+        handler->SendSysMessage(ss.view());\n+\n+        const std::array<uint32, 2> vis_spell_ids = { 2400, 41637 };\n+        WanderNode::DoForContainerWPs(to_links, [=](WanderNode const* lwp) {\n+            if (!lwp->GetCreature())\n+            {\n+                handler->PSendSysMessage(\"Can't visualise link %u-%u, no creature...\", lwp->GetWPId(), wp->GetWPId());\n+                return;\n+            }\n+            for (uint32 spell_id : vis_spell_ids)\n+                lwp->GetCreature()->CastSpell(wpc, spell_id, true);\n+        });\n+        WanderNode::DoForContainerWPLinks(links, [=](WanderNodeLink const& wlp) {\n+            if (!wlp.wp->GetCreature())\n+            {\n+                handler->PSendSysMessage(\"Can't visualise link %u-%u, no creature...\", wp->GetWPId(), wlp.wp->GetWPId());\n+                return;\n+            }\n+            for (uint32 spell_id : vis_spell_ids)\n+                wpc->CastSpell(wlp.wp->GetCreature(), spell_id, true);\n+        });\n+\n+        return true;\n+    }\n+    static bool HandleExtractWPIdWeightPairs(ChatHandler* handler, std::vector<std::string_view> const& links_strings, std::vector<std::pair<uint32, int32>>& link_pairs)\n+    {\n+        bool result = true;\n+        link_pairs.reserve(links_strings.size());\n+        for (std::string_view newlink : links_strings)\n+        {\n+            std::vector<std::string_view> toks = Bcore::Tokenize(newlink, ':', false);\n+            Optional<uint32> val1 = toks.size() >= 1 ? Bcore::StringTo<uint32>(toks[0]) : std::nullopt;\n+            Optional<uint32> val2 = toks.size() >= 2 ? Bcore::StringTo<uint32>(toks[1]) : std::nullopt;\n+            if (toks.size() > 2 || val1 == std::nullopt || val2 == std::nullopt)\n+            {\n+                handler->PSendSysMessage(\"Invalid link format: %s\", newlink);\n+                result = false;\n+                continue;\n+            }\n+            link_pairs.emplace_back(*val1, val2.value_or(int32(-1)));\n+        }\n+        return result;\n+    }\n+    static void HandleWPUpdateLinks(ChatHandler* handler, WanderNode* wp, std::vector<std::pair<uint32, int32>> const& newlinks, bool oneway = false, bool on_delete = false)\n+    {\n+        using WanderNodeLink = WanderNode::WanderNodeLink;\n+\n+        if (oneway && on_delete)\n+        {\n+            handler->PSendSysMessage(\"Can't perform one-way delete!\");\n+            return;\n+        }\n+\n+        std::remove_cvref_t<decltype(wp->GetLinks())> links = wp->GetLinks(); //copy\n+        uint32 average_weight = wp->GetAverageLinkWeight();\n+\n+        std::unordered_set<WanderNode const*> wps_updates;\n+        std::vector<WanderNodeLink const*> wps_relinks;\n+\n+        if (on_delete)\n+        {\n+            //Find all WPs having a link to us and remove those links\n+            WanderNode::DoForAllMapWPs(wp->GetMapId(), [=, &links, &wps_updates](WanderNode const* mwp) {\n+                if (mwp != wp && mwp->HasLink(wp) && std::ranges::none_of(links, [=](WanderNodeLink const& wpl) { return wpl.Id() == mwp->GetWPId(); }))\n+                {\n+                    handler->PSendSysMessage(\"Removing link %u->%u...\", mwp->GetWPId(), wp->GetWPId());\n+                    const_cast<WanderNode*>(mwp)->UnLink(wp);\n+                    wps_updates.insert(mwp);\n+                }\n+            });\n+        }\n+        else\n+        {\n+            wps_updates.insert(wp);\n+            //Re-create all links we are not updating in case of only setting one-way links, unless doing a full purge\n+            if (oneway && !newlinks.empty())\n+                for (std::remove_cvref_t<decltype(links)>::value_type const& wpl : links)\n+                    wps_relinks.push_back(&wpl);\n+        }\n+\n+        if (links.empty())\n+            handler->PSendSysMessage(\"WP %u had no links...\", wp->GetWPId());\n+        else\n+        {\n+            while (!wp->GetLinks().empty())\n+            {\n+                WanderNode* lwp = wp->GetLinks().front().wp;\n+                bool removing_reverse_link = (!oneway || std::ranges::any_of(newlinks, [=](auto const& p) { return p.first == lwp->GetWPId(); })) && lwp->HasLink(wp);\n+                handler->PSendSysMessage(\"Removing link %u%s%u...\", wp->GetWPId(), removing_reverse_link ? \"<->\" : \"->\", lwp->GetWPId());\n+                wp->UnLink(lwp);\n+                if (removing_reverse_link)\n+                {\n+                    lwp->UnLink(wp);\n+                    wps_updates.insert(lwp);\n+                }\n+            }\n+        }\n+\n+        for (auto const& p : newlinks)\n+        {\n+            uint32 lid = p.first;\n+            uint32 lweight = p.second >= 0 ? uint32(p.second) : average_weight;\n+\n+            if (lid == wp->GetWPId())\n+            {\n+                handler->PSendSysMessage(\"Trying to add WP %u to its own links! Are you dumb?\", lid);\n+                continue;\n+            }\n+\n+            WanderNode* lwp = WanderNode::FindInMapWPs(wp->GetMapId(), lid);\n+            if (!lwp)\n+            {\n+                handler->PSendSysMessage(\"WP %u is not found in map %u!\", lid, wp->GetMapId());\n+                continue;\n+            }\n+\n+            if (p.second < 0 && lweight)\n+                handler->PSendSysMessage(\"Link %u%s%u has no weight assigned, using average (%u)!\", wp->GetWPId(), oneway ? \"->\" : \"<->\", lid, lweight);\n+\n+            if (!wps_relinks.empty())\n+            {\n+                auto wpscit = std::ranges::find_if(wps_relinks, [=](WanderNodeLink const* wlp) { return wlp->Id() == lwp->GetWPId(); });\n+                if (wpscit != wps_relinks.cend())\n+                    wps_relinks.erase(wpscit);\n+            }\n+\n+            handler->PSendSysMessage(\"Adding link %u%s%u (w=%u, avg was %u)...\", wp->GetWPId(), oneway ? \"->\" : \"<->\", lid, lweight, average_weight);\n+            if (wp->GetExactDist2d(lwp) > MAX_VISIBILITY_DISTANCE)\n+                handler->PSendSysMessage(\"Warning! Link distance is too great (%.2f)\", wp->GetExactDist2d(lwp));\n+\n+            wp->Link(WanderNodeLink{ .wp = lwp, .weight = lweight });\n+            if (!oneway)\n+            {\n+                lwp->Link(WanderNodeLink{ .wp = wp, .weight = lwp->GetAverageLinkWeight() });\n+                wps_updates.insert(lwp);\n+            }\n+        }\n+\n+        if (!on_delete)\n+        {\n+            if (!wps_relinks.empty())\n+            {\n+                std::ranges::sort(wps_relinks, [](WanderNodeLink const* wlp1, WanderNodeLink const* wlp2) { return wlp1->Id() < wlp2->Id(); });\n+                for (WanderNodeLink const* wlp : wps_relinks)\n+                {\n+                    handler->PSendSysMessage(\"Adding link %u->%u (w=%u)...\", wp->GetWPId(), wlp->Id(), wlp->weight);\n+                    if (wp->GetExactDist2d(wlp->wp) > MAX_VISIBILITY_DISTANCE)\n+                        handler->PSendSysMessage(\"Warning! Link distance is too great (%.2f)\", wp->GetExactDist2d(wlp->wp));\n+                    wp->Link(WanderNodeLink{ .wp = wlp->wp, .weight = wlp->weight });\n+                }\n+            }\n+            if (!wp->GetLinks().empty() || !links.empty())\n+            {\n+                handler->PSendSysMessage(\"WP %u links %u -> %u, avg link weight %u -> %u...\",\n+                    wp->GetWPId(), uint32(links.size()), uint32(wp->GetLinks().size()), average_weight, wp->GetAverageLinkWeight());\n+            }\n+        }\n+\n+        WorldDatabaseTransaction trans = WorldDatabase.BeginTransaction();\n+        WanderNode::DoForContainerWPs(wps_updates, [&trans](WanderNode const* uwp) {\n+            trans->PAppend(\"UPDATE creature_template_npcbot_wander_nodes SET links='{}' WHERE id={}\", uwp->FormatLinks(), uwp->GetWPId());\n+        });\n+        WorldDatabase.DirectCommitTransaction(trans);\n+    }\n+    static void HandleWPUpdateLinkWeights(ChatHandler* handler, WanderNode* wp, std::vector<std::pair<uint32, int32>> const& link_weights)\n+    {\n+        using WanderNodeLink = WanderNode::WanderNodeLink;\n+\n+        bool dirty = false;\n+        auto const& links = wp->GetLinks();\n+        std::vector<uint32> avg_weight_links;\n+\n+        for (auto const& p : link_weights)\n+        {\n+            uint32 lid = p.first;\n+\n+            if (!WanderNode::FindInMapWPs(wp->GetMapId(), lid))\n+            {\n+                handler->PSendSysMessage(\"WP %u does not exist!\", lid);\n+                continue;\n+            }\n+\n+            if (std::ranges::find_if(links, [=](WanderNodeLink const& wpl) { return wpl.Id() == lid; }) == links.cend())\n+            {\n+                handler->PSendSysMessage(\"WP %u has no link to WP %u!\", wp->GetWPId(), lid);\n+                continue;\n+            }\n+\n+            dirty = true;\n+\n+            if (p.second < 0)\n+            {\n+                wp->SetLinkWeight(p.first, 0);\n+                avg_weight_links.push_back(p.first);\n+            }\n+            else\n+                wp->SetLinkWeight(p.first, static_cast<uint32>(p.second));\n+        }\n+\n+        if (!avg_weight_links.empty())\n+        {\n+            uint32 average_weight = wp->GetAverageLinkWeight(true);\n+            for (uint32 awlid : avg_weight_links)\n+                wp->SetLinkWeight(awlid, average_weight);\n+        }\n+\n+        if (dirty)\n+            WorldDatabase.PExecute(\"UPDATE creature_template_npcbot_wander_nodes SET links='{}' WHERE id={}\", wp->FormatLinks(), wp->GetWPId());\n+    }\n+    static bool HandleNpcBotWPSetLinksCommand(ChatHandler* handler, Optional<std::vector<uint32>> links, Optional<bool> oneway)\n+    {\n+        if (!links)\n+        {\n+            handler->SendSysMessage(\"Syntax: npcbot wp setlinks #[id[:weight] ...] #[oneway: True/False] #[remove_rev_links: True/False]\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        Player* player = handler->GetPlayer();\n+        Unit* wpc = player->GetSelectedUnit();\n+        WanderNode* wp = wpc ? WanderNode::FindInAllWPs(wpc->ToCreature()) : nullptr;\n+        if (!wp)\n+        {\n+            handler->SendSysMessage(\"No WP selected\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        std::vector<std::pair<uint32, int32>> pairs;\n+        if (!(links->size() == 1 && links->front() == 0))\n+            for (uint32 lid : *links)\n+                pairs.emplace_back(lid, -1);\n+\n+        HandleWPUpdateLinks(handler, wp, pairs, oneway ? *oneway : false);\n+\n+        return true;\n+    }\n+    static bool HandleNpcBotWPSetLinkWeightsCommand(ChatHandler* handler, Optional<std::vector<std::string_view>> link_weights)\n+    {\n+        Player* player = handler->GetPlayer();\n+        Unit* wpc = player->GetSelectedUnit();\n+\n+        WanderNode* wp = wpc ? WanderNode::FindInAllWPs(wpc->ToCreature()) : nullptr;\n+        if (!wp)\n+        {\n+            handler->SendSysMessage(\"No WP selected\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        if (!link_weights || link_weights->empty())\n+        {\n+            handler->SendSysMessage(\"Syntax: npcbot wp setweights #[id:weight ...]\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        std::vector<std::pair<uint32, int32>> pairs;\n+        if (!HandleExtractWPIdWeightPairs(handler, *link_weights, pairs))\n+        {\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        HandleWPUpdateLinkWeights(handler, wp, pairs);\n+\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotWPInfoCommand(ChatHandler* handler, Optional<uint32> wpId)\n+    {\n+        Player* player = handler->GetPlayer();\n+        Unit* wpc = player->GetSelectedUnit();\n+\n+        WanderNode* wp = wpc ? WanderNode::FindInAllWPs(wpc->ToCreature()) : nullptr;\n+\n+        if (!wp && wpId)\n+            wp = WanderNode::FindInAllWPs(*wpId);\n+\n+        if (!wp)\n+        {\n+            handler->SendSysMessage(\"Syntax: npcbot wp info #[id_or_selection]\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        handler->SendSysMessage(wp->ToString());\n+\n+        return true;\n+    }\n+    static bool HandleNpcBotWPSetLevelsZoneCommand(ChatHandler* handler, Optional<uint8> minlevel, Optional<uint8> maxlevel)\n+    {\n+        Player* player = handler->GetPlayer();\n+\n+        if (!minlevel || !maxlevel)\n+        {\n+            handler->SendSysMessage(\"Syntax: npcbot wp info setlevels z #[minlevel] #[maxlevel]\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        if (!*minlevel || !*maxlevel || *minlevel > DEFAULT_MAX_LEVEL || *maxlevel > DEFAULT_MAX_LEVEL || *minlevel > *maxlevel)\n+        {\n+            handler->PSendSysMessage(\"WP levels must be within bounds 1-%u, min <= max\", uint32(DEFAULT_MAX_LEVEL));\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        uint32 zoneId, areaId;\n+        player->GetZoneAndAreaId(zoneId, areaId);\n+        handler->PSendSysMessage(\"Setting levels min=%u max=%u for zone %u\", uint32(*minlevel), uint32(*maxlevel), zoneId);\n+        WanderNode::DoForAllZoneWPs(zoneId, [handler = handler, minl = *minlevel, maxl = *maxlevel](WanderNode const* wp) {\n+            handler->PSendSysMessage(\"Setting levels min=%u max=%u for node %u '%s'\", uint32(minl), uint32(maxl), wp->GetWPId(), wp->GetName());\n+            const_cast<WanderNode*>(wp)->SetLevels(minl, maxl);\n+            if (Creature* creature = wp->GetCreature())\n+                if (creature->GetLevel() != minl)\n+                    creature->SetLevel(minl);\n+            WorldDatabase.PExecute(\"UPDATE creature_template_npcbot_wander_nodes SET minlevel={}, maxlevel={} WHERE id={}\",\n+                uint32(minl), uint32(maxl), wp->GetWPId());\n+        });\n+\n+        return true;\n+    }\n+    static bool HandleNpcBotWPSetLevelsCommand(ChatHandler* handler, Optional<uint8> minlevel, Optional<uint8> maxlevel)\n+    {\n+        Player* player = handler->GetPlayer();\n+        Unit* wpc = player->GetSelectedUnit();\n+\n+        WanderNode* wp = wpc ? WanderNode::FindInAllWPs(wpc->ToCreature()) : nullptr;\n+        if (!wp)\n+        {\n+            handler->SendSysMessage(\"No WP selected\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        if (!minlevel || !maxlevel)\n+        {\n+            handler->SendSysMessage(\"Syntax: npcbot wp info setlevels #[minlevel] #[maxlevel]\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        if (!*minlevel || !*maxlevel || *minlevel > DEFAULT_MAX_LEVEL || *maxlevel > DEFAULT_MAX_LEVEL || *minlevel > *maxlevel)\n+        {\n+            handler->PSendSysMessage(\"WP levels must be within bounds 1-%u, min <= max\", uint32(DEFAULT_MAX_LEVEL));\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        uint32 wpId = wp->GetWPId();\n+        auto [minlevel_cur, maxlevel_cur] = wp->GetLevels();\n+\n+        handler->PSendSysMessage(\"Changing WP %u '%s' levels from %u-%u to %u-%u\", wpId, wp->GetName(), uint32(minlevel_cur), uint32(maxlevel_cur), uint32(*minlevel), uint32(*maxlevel));\n+        wp->SetLevels(*minlevel, *maxlevel);\n+        if (Creature* creature = wp->GetCreature())\n+            if (creature->GetLevel() != *minlevel)\n+                creature->SetLevel(*minlevel);\n+\n+        WorldDatabase.PExecute(\"UPDATE creature_template_npcbot_wander_nodes SET minlevel={}, maxlevel={} WHERE id={}\",\n+            uint32(*minlevel), uint32(*maxlevel), wpId);\n+\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotWPSetFlagsZoneCommand(ChatHandler* handler, Optional<int32> flags)\n+    {\n+        Player* player = handler->GetPlayer();\n+\n+        if (!flags)\n+        {\n+            handler->SendSysMessage(\"Syntax: npcbot wp info setflags z #[flags]\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        uint32 zoneId, areaId;\n+        player->GetZoneAndAreaId(zoneId, areaId);\n+        WanderNode::DoForAllZoneWPs(zoneId, [handler = handler, flags = *flags](WanderNode const* wp) {\n+            uint32 wpId = wp->GetWPId();\n+            if (flags < 0)\n+            {\n+                handler->PSendSysMessage(\"Removing WP %u '%s' flag %u\", wpId, wp->GetName(), uint32(-flags));\n+                const_cast<WanderNode*>(wp)->RemoveFlags(BotWPFlags(-flags));\n+            }\n+            else\n+            {\n+                handler->PSendSysMessage(\"Adding WP %u '%s' flag %u\", wpId, wp->GetName(), uint32(flags));\n+                const_cast<WanderNode*>(wp)->SetFlags(BotWPFlags(flags));\n+            }\n+            WorldDatabase.PExecute(\"UPDATE creature_template_npcbot_wander_nodes SET flags={} WHERE id={}\", wp->GetFlags(), wpId);\n+        });\n+\n+        return true;\n+    }\n+    static bool HandleNpcBotWPSetFlagsCommand(ChatHandler* handler, Optional<int32> flags)\n+    {\n+        Player* player = handler->GetPlayer();\n+        Unit* wpc = player->GetSelectedUnit();\n+\n+        WanderNode* wp = wpc ? WanderNode::FindInAllWPs(wpc->ToCreature()) : nullptr;\n+        if (!wp)\n+        {\n+            handler->SendSysMessage(\"No WP selected\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        if (!flags)\n+        {\n+            handler->SendSysMessage(\"Syntax: npcbot wp info setflags #[flag]. Use negative value to remove\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        uint32 wpId = wp->GetWPId();\n+\n+        if (*flags < 0)\n+        {\n+            handler->PSendSysMessage(\"Removing WP %u '%s' flag %u\", wpId, wp->GetName(), uint32(-*flags));\n+            wp->RemoveFlags(BotWPFlags(-*flags));\n+        }\n+        else\n+        {\n+            handler->PSendSysMessage(\"Adding WP %u '%s' flag %u\", wpId, wp->GetName(), uint32(*flags));\n+            wp->SetFlags(BotWPFlags(*flags));\n+        }\n+\n+        WorldDatabase.PExecute(\"UPDATE creature_template_npcbot_wander_nodes SET flags={} WHERE id={}\", wp->GetFlags(), wpId);\n+\n+        return true;\n+    }\n+    static bool HandleNpcBotWPSetNameCommand(ChatHandler* handler, Optional<std::string> newname)\n+    {\n+        Player* player = handler->GetPlayer();\n+        Unit* wpc = player->GetSelectedUnit();\n+\n+        WanderNode* wp = wpc ? WanderNode::FindInAllWPs(wpc->ToCreature()) : nullptr;\n+        if (!wp)\n+        {\n+            handler->SendSysMessage(\"No WP selected\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        if (!newname)\n+        {\n+            handler->SendSysMessage(\"Syntax: npcbot wp info setname #[name]\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        uint32 wpId = wp->GetWPId();\n+\n+        handler->PSendSysMessage(\"Changing WP %u '%s' name to '%s'\", wpId, wp->GetName(), *newname);\n+        wp->SetName(*newname);\n+\n+        WorldDatabase.PExecute(\"UPDATE creature_template_npcbot_wander_nodes SET name='{}' WHERE id={}\", wp->GetName(), wpId);\n+\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotWPMoveCommand(ChatHandler* handler, Optional<uint32> wpId)\n+    {\n+        Player* player = handler->GetPlayer();\n+        Unit* wpc = player->GetSelectedUnit();\n+\n+        WanderNode* wp = (wpc && wpc->IsCreature()) ? WanderNode::FindInAllWPs(wpc->ToCreature()) :\n+            wpId ? WanderNode::FindInAllWPs(*wpId) : nullptr;\n+        if (!wp)\n+        {\n+            handler->SendSysMessage(\"No WP selected or id provided\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        if (wp->GetMapId() != player->GetMapId())\n+        {\n+            handler->SendSysMessage(\"Can't move WP to a different map!\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        wp->Relocate(player);\n+        if (Creature* creature = wp->GetCreature())\n+            creature->NearTeleportTo(*player);\n+\n+        WorldDatabase.PExecute(\"UPDATE creature_template_npcbot_wander_nodes SET x={},y={},z={},o={} WHERE id={}\",\n+            wp->m_positionX, wp->m_positionY, wp->m_positionZ, wp->GetOrientation(), wp->GetWPId());\n+\n+        handler->PSendSysMessage(\"WP %u '%s' was successfully moved.\", wp->GetWPId(), wp->GetName());\n+\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotWPAddCommand(ChatHandler* handler, Optional<uint32> flags, Optional<std::string> name, Optional<uint8> minlevel, Optional<uint8> maxlevel)\n+    {\n+        Player* player = handler->GetPlayer();\n+\n+        if (!flags || !name || (!player->GetMap()->GetEntry()->IsContinent() && !player->GetMap()->GetEntry()->IsBattlegroundOrArena()))\n+        {\n+            handler->SendSysMessage(\"Syntax: npcbot wp add #[flags] #[name] #[minlevel #[maxlevel]]. World maps / BGs only\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        if (minlevel)\n+        {\n+            if (!*minlevel || *minlevel > DEFAULT_MAX_LEVEL)\n+            {\n+                handler->PSendSysMessage(\"Minlevel must be between 1 and %u!\", uint32(DEFAULT_MAX_LEVEL));\n+                handler->SetSentErrorMessage(true);\n+                return false;\n+            }\n+            if (maxlevel)\n+            {\n+                if (!*maxlevel || *maxlevel > DEFAULT_MAX_LEVEL)\n+                {\n+                    handler->PSendSysMessage(\"Maxlevel must be between 1 and %u!\", uint32(DEFAULT_MAX_LEVEL));\n+                    handler->SetSentErrorMessage(true);\n+                    return false;\n+                }\n+                if (*minlevel > *maxlevel)\n+                {\n+                    handler->SendSysMessage(\"Minlevel can't be greater than maxlevel\");\n+                    handler->SetSentErrorMessage(true);\n+                    return false;\n+                }\n+            }\n+        }\n+\n+        if (*flags >= AsUnderlyingType(BotWPFlags::BOTWP_FLAG_END))\n+        {\n+            handler->PSendSysMessage(\"Flags must be below %u!\", AsUnderlyingType(BotWPFlags::BOTWP_FLAG_END));\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        uint32 zoneId, areaId;\n+        player->GetZoneAndAreaId(zoneId, areaId);\n+        WanderNode* wp = new WanderNode(++WanderNode::nextWPId, player->GetMapId(), player->m_positionX, player->m_positionY, player->m_positionZ,\n+            player->GetOrientation(), zoneId, areaId, std::move(*name));\n+\n+        wp->SetLevels((!minlevel && !maxlevel) ? GetZoneLevels(GetZoneIdOverride(zoneId)) : std::pair{minlevel ? *minlevel : uint8(1), maxlevel ? *maxlevel : uint8(DEFAULT_MAX_LEVEL)});\n+        wp->SetFlags(BotWPFlags(*flags));\n+\n+        std::vector<std::pair<uint32, int32>> link_pairs;\n+        if (Unit* twpc = player->GetSelectedUnit())\n+            if (WanderNode const* twp = WanderNode::FindInMapWPs(player->GetMapId(), twpc->ToCreature()))\n+                if (twp->GetWPId() != wp->GetWPId() - 1)\n+                    link_pairs.emplace_back(twp->GetWPId(), -1);\n+        if (link_pairs.empty())\n+        {\n+            if (WanderNode const* pwp = WanderNode::FindInMapWPs(player->GetMapId(), wp->GetWPId() - 1))\n+                if (wp->GetExactDist2d(pwp) < MAX_VISIBILITY_DISTANCE)\n+                    link_pairs.emplace_back(pwp->GetWPId(), -1);\n+        }\n+        if (link_pairs.empty())\n+        {\n+            WanderNode::DoForAllMapWPs(wp->GetMapId(), [wp = wp, &link_pairs](WanderNode const* mwp) {\n+                if (wp->GetWPId() != mwp->GetWPId() && wp->GetExactDist2d(mwp) < MAX_VISIBILITY_DISTANCE)\n+                    link_pairs.emplace_back(mwp->GetWPId(), -1);\n+            });\n+        }\n+        HandleWPUpdateLinks(handler, wp, link_pairs);\n+\n+        ASSERT_NOTNULL(HandleWPSummon(wp, player->GetMap()));\n+\n+        uint32 wpId = wp->GetWPId();\n+        std::string_view wpName = wp->GetName();\n+        auto [minl, maxl] = wp->GetLevels();\n+        uint32 wpFlags = wp->GetFlags();\n+\n+        std::ostringstream ss;\n+        ss << \"INSERT INTO creature_template_npcbot_wander_nodes (id,mapid,x,y,z,o,zoneId,areaId,minlevel,maxlevel,flags,name,links)\"\n+            << \" VALUES \"\n+            << '(' << wpId << ',' << wp->GetMapId()\n+            << ',' << wp->GetPositionX() << ',' << wp->GetPositionY() << ',' << wp->GetPositionZ() << ',' << wp->GetOrientation()\n+            << ',' << wp->GetZoneId() << ',' << wp->GetAreaId() << ',' << uint32(minl) << ',' << uint32(maxl)\n+            << ',' << wpFlags << \",'\" << wpName << \"','\" << wp->FormatLinks() << \"')\";\n+\n+        WorldDatabase.Execute(ss.str().c_str());\n+\n+        handler->PSendSysMessage(\"Created WP %u '%s' levels %u-%u flags %u\", wpId, wpName, uint32(minl), uint32(maxl), wpFlags);\n+\n+        return true;\n+    }\n+    static bool HandleNpcBotWPDeleteCommand(ChatHandler* handler)\n+    {\n+        Player* player = handler->GetPlayer();\n+        Unit* wpc = player->GetSelectedUnit();\n+\n+        WanderNode* wp = wpc ? WanderNode::FindInAllWPs(wpc->ToCreature()) : nullptr;\n+        if (!wp)\n+        {\n+            handler->SendSysMessage(\"No WP selected\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        uint32 wpId = wp->GetWPId();\n+        std::string_view wpName = wp->GetName();\n+\n+        HandleWPUpdateLinks(handler, wp, {}, false, true);\n+        WanderNode::RemoveWP(wp);\n+\n+        WorldDatabase.PExecute(\"DELETE FROM creature_template_npcbot_wander_nodes WHERE id={}\", wpId);\n+\n+        handler->PSendSysMessage(\"WP %u '%s' was successfully deleted.\", wpId, wpName);\n+\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotWPListCommand(ChatHandler* handler, Optional<uint32> ozoneId, Optional<uint32> oareaId)\n+    {\n+        Player* player = handler->GetPlayer();\n+\n+        uint32 zoneId = 0, areaId = 0;\n+        if (!ozoneId && !oareaId)\n+            player->GetZoneAndAreaId(zoneId, areaId);\n+        else\n+        {\n+            if (ozoneId)\n+                zoneId = *ozoneId;\n+            if (oareaId)\n+                areaId = *oareaId;\n+        }\n+\n+        AreaTableEntry const* zone = sAreaTableStore.LookupEntry(zoneId);\n+        AreaTableEntry const* area = sAreaTableStore.LookupEntry(areaId);\n+\n+        std::ostringstream ss;\n+        ss << \"Zone \" << zoneId << \" (\" << std::string_view(zone ? zone->AreaName[0] : \"unknown\") << \") wps:\";\n+        WanderNode::DoForAllZoneWPs(zoneId, [&ss](WanderNode const* wp) {\n+            ss << \"\\n\" << wp->ToString();\n+        });\n+        ss << \"\\nArea \" << areaId << \" (\" << std::string_view(area ? area->AreaName[0] : \"unknown\") << \") wps:\";\n+        WanderNode::DoForAllAreaWPs(areaId, [&ss](WanderNode const* wp) {\n+            ss << \"\\n\" << wp->ToString();\n+        });\n+\n+        handler->SendSysMessage(ss.view());\n+        return true;\n+    }\n+    static bool HandleNpcBotWPListAllCommand(ChatHandler* handler)\n+    {\n+        WanderNode::DoForAllWPs([handler = handler](WanderNode const* wp) {\n+            handler->SendSysMessage(wp->ToString());\n+        });\n+\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotWPGoCommand(ChatHandler* handler, uint32 wpId)\n+    {\n+        Player* player = handler->GetPlayer();\n+\n+        WanderNode const* wp = WanderNode::FindInAllWPs(wpId);\n+        if (!wp)\n+        {\n+            handler->PSendSysMessage(\"WP %u not found\", wpId);\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        player->TeleportTo(WorldLocation(wp->GetMapId(), *wp), TELE_TO_GM_MODE);\n+\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotDebugEventLaunchCommand(ChatHandler* handler, Optional<uint32> event_num)\n+    {\n+        if (!event_num)\n+        {\n+            handler->SendSysMessage(\"Syntax: .npcbot debug event launch #event_num\");\n+            handler->SendSysMessage(\"Launches event for this instance\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        Player const* player = handler->GetPlayer();\n+        if (!player->HaveBot())\n+        {\n+            handler->SendSysMessage(\"You have no bots!\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        Map* map = player->GetMap();\n+        if (!map->IsDungeon())\n+        {\n+            handler->SendSysMessage(\"Must be in a dungeon/raid!\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+        InstanceScript* script = map->ToInstanceMap()->GetInstanceScript();\n+        if (!script)\n+        {\n+            handler->PSendSysMessage(\"Instance script is not found for map %u!\", map->GetId());\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        switch (*event_num)\n+        {\n+            case 1:\n+                switch (map->GetId())\n+                {\n+                    case 631: //Icecrown Citadel\n+                    {\n+                        if (player->GetAreaId() != 4859) // \"Frozen Throne\"\n+                        {\n+                            handler->SendSysMessage(\"Must be in Frozen Throne area!\");\n+                            handler->SetSentErrorMessage(true);\n+                            return false;\n+                        }\n+                        GameObject* platform = nullptr;\n+                        Bcore::NearestGameObjectEntryInObjectRangeCheck check(*player, 202161, 100.0f);\n+                        Bcore::GameObjectSearcher<Bcore::NearestGameObjectEntryInObjectRangeCheck> searcher(player, platform, check);\n+                        Cell::VisitAllObjects(player, searcher, 100.0f);\n+                        if (!platform)\n+                        {\n+                            handler->SendSysMessage(\"Cannot find platform id 202161!\");\n+                            handler->SetSentErrorMessage(true);\n+                            return false;\n+                        }\n+                        FrozenThronePlatformDestructionEvent(script, platform->GetPosition())();\n+                        break;\n+                    }\n+                    default:\n+                        handler->PSendSysMessage(\"Unknown event %u for map %u!\", *event_num, map->GetId());\n+                        handler->SetSentErrorMessage(true);\n+                        return false;\n+                }\n+                break;\n+            default:\n+                handler->PSendSysMessage(\"Unknown event %u!\", *event_num);\n+                handler->SetSentErrorMessage(true);\n+                return false;\n+        }\n+\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotDebugWPReidCommand(ChatHandler* handler, Optional<uint32> start_id, Optional<uint32> end_id, Optional<uint32> target_start_id)\n+    {\n+        if (!start_id)\n+        {\n+            handler->SendSysMessage(\".npcbot debug wpreid #start_id [#end_id #target_start_id]\");\n+            handler->SendSysMessage(\"Compacts WP IDs to elimnate gaps between them, starting with <start_id>\");\n+            handler->SendSysMessage(\"If #end_id and #target_start_id are provided then instead relocates WPs with IDs <start_id>..<end_id> to <target_start_id>...\");\n+            handler->SendSysMessage(\"WARNING: THIS IS UNSAFE! Back-up your wander nodes table before proceeding\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        if (!!end_id != !!target_start_id)\n+        {\n+            handler->SendSysMessage(\"Either both #end_id and #target_start_id or none required!\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        if (end_id && *end_id < *start_id)\n+        {\n+            handler->SendSysMessage(\"End id must be equal or greater than start id!\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        if (static bool all_wps_forced = false; !all_wps_forced)\n+        {\n+            all_wps_forced = true;\n+            handler->SendSysMessage(\"Force loading all wander nodes...\");\n+            BotDataMgr::LoadWanderMap(true, true);\n+        }\n+\n+        std::vector<WanderNode const*> wander_nodes_copy;\n+        wander_nodes_copy.reserve(WanderNode::GetAllWPsCount());\n+        WanderNode::DoForAllWPs([&wander_nodes_copy](WanderNode const* wp) { wander_nodes_copy.push_back(wp); });\n+        std::ranges::sort(wander_nodes_copy, [](WanderNode const* wp1, WanderNode const* wp2) { return wp1->GetWPId() < wp2->GetWPId(); });\n+\n+        uint32 startid = *start_id;\n+        uint32 endid = end_id.value_or(wander_nodes_copy.back()->GetWPId());\n+        const uint32 reid_count = endid - startid + 1;\n+        uint32 target_startid = target_start_id.value_or(startid);\n+\n+        if (target_start_id)\n+        {\n+            if (std::ranges::any_of(wander_nodes_copy, [st = *target_start_id, en = *target_start_id + reid_count - 1](WanderNode const* wpc) {\n+                return wpc->GetWPId() >= st && wpc->GetWPId() <= en; }))\n+            {\n+                handler->SendSysMessage(\"Cannot reid onto existing WP ids!\");\n+                handler->SetSentErrorMessage(true);\n+                return false;\n+            }\n+\n+            handler->PSendSysMessage(\"Running re-id on %u..%u -> %u..%u\", startid, endid, target_startid, uint32(target_startid + reid_count - 1));\n+        }\n+        else\n+            handler->PSendSysMessage(\"Running re-id on %u..%u\", startid, endid);\n+\n+        std::set<uint32> checked_map_ids;\n+        std::vector<uint32> wander_node_deletes;\n+        std::vector<WanderNode const*> wander_node_inserts;\n+        for (WanderNode const* wp : wander_nodes_copy)\n+        {\n+            if (wp->GetWPId() >= startid && wp->GetWPId() <= endid)\n+            {\n+                if (!checked_map_ids.contains(wp->GetMapId()))\n+                {\n+                    checked_map_ids.insert(wp->GetMapId());\n+                    WanderNode::DoForAllMapWPs(wp->GetMapId(), [&wander_node_deletes, &wander_node_inserts](WanderNode const* uwp) {\n+                        wander_node_deletes.push_back(uwp->GetWPId());\n+                        wander_node_inserts.push_back(uwp);\n+                    });\n+                }\n+                uint32 prev_id = wp->GetWPId();\n+                const_cast<WanderNode*>(wp)->SetId(target_startid++);\n+                handler->PSendSysMessage(\"%u => %u\", prev_id, wp->GetWPId());\n+            }\n+        }\n+\n+        if (wander_node_deletes.empty() || wander_node_inserts.empty())\n+        {\n+            handler->SendSysMessage(\"No WPs found within given range\");\n+            return false;\n+        }\n+\n+        std::sort(std::begin(wander_nodes_copy), std::end(wander_nodes_copy), [](WanderNode const* wp1, WanderNode const* wp2) { return wp1->GetWPId() < wp2->GetWPId(); });\n+        WanderNode::nextWPId = wander_nodes_copy.back()->GetWPId();\n+\n+        WorldDatabaseTransaction trans = WorldDatabase.BeginTransaction();\n+        std::ostringstream ss;\n+        for (uint32 wpid : wander_node_deletes)\n+            ss << wpid << ',';\n+        std::string_view wp_range_str = ss.view();\n+        wp_range_str.remove_suffix(1);\n+        trans->PAppend(\"DELETE FROM `creature_template_npcbot_wander_nodes` WHERE id IN ({})\", wp_range_str);\n+        ss.str(\"\");\n+        ss << \"INSERT INTO `creature_template_npcbot_wander_nodes` (id,mapid,x,y,z,o,zoneid,areaid,minlevel,maxlevel,flags,name,links) VALUES \";\n+        WanderNode::DoForContainerWPs(wander_node_inserts, [&ss](WanderNode const* wp) {\n+            auto [minl, maxl] = wp->GetLevels();\n+            ss << '(' << wp->GetWPId() << ',' << wp->GetMapId()\n+                << ',' << wp->GetPositionX() << ',' << wp->GetPositionY() << ',' << wp->GetPositionZ() << ',' << wp->GetOrientation()\n+                << ',' << wp->GetZoneId() << ',' << wp->GetAreaId() << ',' << uint32(minl) << ',' << uint32(maxl)\n+                << ',' << wp->GetFlags() << \",'\" << wp->GetName() << \"','\" << wp->FormatLinks() << \"'),\";\n+        });\n+        std::string val_str = ss.str();\n+        val_str.resize(val_str.size() - 1u);\n+        trans->Append(val_str.c_str());\n+        WorldDatabase.CommitTransaction(trans);\n+\n+        handler->SendSysMessage(\"Reid complete.\");\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotDebugWBEquipsCommand(ChatHandler* handler, Optional<uint32> bc, Optional<uint32> bs, Optional<EXACT_SEQUENCE(\"ids\")> ids)\n+    {\n+        const std::array<std::string_view, BOT_INVENTORY_SIZE> snames {\n+            \"MHAND\"sv, \"OHAND\"sv, \"RANGED\"sv, \"HEAD\"sv, \"SHOULDERS\"sv, \"CHEST\"sv, \"WAIST\"sv, \"LEGS\"sv, \"FEET\"sv, \"WRIST\"sv, \"HANDS\"sv, \"BACK\"sv, \"BODY\"sv, \"FINGER\"sv, \"FINGER\"sv, \"TRINKET\"sv, \"TRINKET\"sv, \"NECK\"sv\n+        };\n+\n+        if (!bc || !bs || *bc >= BOT_CLASS_END || *bs >= BOT_INVENTORY_SIZE)\n+        {\n+            handler->SendSysMessage(\"Syntax: .npcbot debug wbequips #class #slot #['ids']\");\n+            handler->SendSysMessage(\"List all generated equip templates (or just ids) for wandering bots of class #botclass\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        std::ostringstream ss;\n+        for (uint32 c = BOT_CLASS_WARRIOR; c < BOT_CLASS_END; ++c)\n+        {\n+            if (c != *bc)\n+                continue;\n+            auto cname = BotColors.at(c).name;\n+            ItemPerBotClassMap const& bot_gear = BotDataMgr::GetWanderingBotsSortedGearMap();\n+            ItemPerSlot const& ips_arr = bot_gear.at(c);\n+            for (uint32 s = BOT_SLOT_MAINHAND; s < BOT_INVENTORY_SIZE; ++s)\n+            {\n+                if (s != *bs)\n+                    continue;\n+                ItemLeveledArr const& il_arr = ips_arr[s];\n+                for (uint32 lstep = 0; lstep < LEVEL_STEPS; ++lstep)\n+                {\n+                    uint32 minlvl = std::max<uint32>(lstep * ITEM_SORTING_LEVEL_STEP, 1);\n+                    uint32 maxlvl = (lstep + 1) * ITEM_SORTING_LEVEL_STEP - 1;\n+                    ItemIdVector const& vec = il_arr[lstep];\n+                    ss << cname << ' ' << snames[s] << ' ' << minlvl << '-' << maxlvl << \" (\" << uint32(vec.size()) << \"):\";\n+                    for (uint32 itemId : vec)\n+                    {\n+                        if (ids != std::nullopt)\n+                            ss << \"\\n \" << itemId;\n+                        else\n+                        {\n+                            ItemTemplate const* proto = sObjectMgr->GetItemTemplate(itemId);\n+                            if (!proto)\n+                                ss << \"\\n [Invalid] \" << itemId;\n+                            else\n+                            {\n+                                ss << \"\\n |c\";\n+                                switch (proto->Quality)\n+                                {\n+                                    case ITEM_QUALITY_POOR:     ss << \"ff9d9d9d\"; break;  //GREY\n+                                    case ITEM_QUALITY_NORMAL:   ss << \"ffffffff\"; break;  //WHITE\n+                                    case ITEM_QUALITY_UNCOMMON: ss << \"ff1eff00\"; break;  //GREEN\n+                                    case ITEM_QUALITY_RARE:     ss << \"ff0070dd\"; break;  //BLUE\n+                                    case ITEM_QUALITY_EPIC:     ss << \"ffa335ee\"; break;  //PURPLE\n+                                    case ITEM_QUALITY_LEGENDARY:ss << \"ffff8000\"; break;  //ORANGE\n+                                    case ITEM_QUALITY_ARTIFACT: ss << \"ffe6cc80\"; break;  //LIGHT YELLOW\n+                                    case ITEM_QUALITY_HEIRLOOM: ss << \"ffe6cc80\"; break;  //LIGHT YELLOW\n+                                    default:                    ss << \"ff000000\"; break;  //UNK BLACK\n+                                }\n+                                ss << \"|Hitem:\" << uint32(proto->ItemId) << \":0:0:0:0:0:0:0:0:0|h[\" << proto->Name1 << \"]|h|r\";\n+                            }\n+                        }\n+                    }\n+                    handler->SendSysMessage(ss.view());\n+                    ss.str(\"\");\n+                }\n+            }\n+        }\n+\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotDebugGuidsCommand(ChatHandler* handler)\n+    {\n+        Unit* target = handler->getSelectedUnit();\n+        if (!target)\n+            target = handler->GetPlayer();\n+\n+        std::ostringstream gss;\n+        gss << target->GetName() << \"'s guids:\"\n+            << \"\\n  own guid:\\n\" << target->GetGUID().ToString()\n+            << \"\\n  combo target guid:\\n\" << target->GetComboTargetGUID().ToString()\n+            << \"\\n  pet guid:\\n\" << target->GetPetGUID().ToString()\n+            << \"\\n  minion guid:\\n\" << target->GetMinionGUID().ToString()\n+            << \"\\n  critter guid:\\n\" << target->GetCritterGUID().ToString()\n+            << \"\\n  charmed guid:\\n\" << target->GetCharmedGUID().ToString()\n+            << \"\\n  charmer guid:\\n\" << target->GetCharmerGUID().ToString()\n+            << \"\\n  creator guid:\\n\" << target->GetCreatorGUID().ToString()\n+            << \"\\n  creator2 guid:\\n\" << (target->GetCreator() ? target->GetCreator()->GetGUID().ToString() : std::string{})\n+            << \"\\n  owner guid:\\n\" << target->GetOwnerGUID().ToString();\n+\n+        handler->SendSysMessage(gss.view());\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotDebugNamesCommand(ChatHandler* handler, Optional<std::string_view> name)\n+    {\n+        Creature* target = handler->getSelectedCreature();\n+        if (!target || !name)\n+        {\n+            handler->SendSysMessage(\"Syntax: .npcbot debug names #name\");\n+            return true;\n+        }\n+\n+        CreatureTemplate const* ci = target->GetCreatureTemplate();\n+        LocaleConstant loc = LocaleConstant(handler->GetSessionDbLocaleIndex());\n+\n+        WorldPackets::Query::QueryCreatureResponse queryTemp;\n+        std::string locName(*name);\n+        std::string locTitle = ci->Title;\n+        if (CreatureLocale const* cl = sObjectMgr->GetCreatureLocale(ci->Entry))\n+        {\n+            //ObjectMgr::GetLocaleString(cl->Name, loc, locName);\n+            ObjectMgr::GetLocaleString(cl->Title, loc, locTitle);\n+        }\n+        queryTemp.CreatureID = ci->Entry;\n+        queryTemp.Allow = true;\n+        queryTemp.Stats.Name = std::move(locName);\n+        queryTemp.Stats.Title = std::move(locTitle);\n+        queryTemp.Stats.CursorName = ci->IconName;\n+        queryTemp.Stats.Flags = ci->type_flags;\n+        queryTemp.Stats.CreatureType = ci->type;\n+        queryTemp.Stats.CreatureFamily = ci->family;\n+        queryTemp.Stats.Classification = ci->rank;\n+        memcpy(queryTemp.Stats.ProxyCreatureID, ci->KillCredit, sizeof(uint32) * MAX_KILL_CREDIT);\n+        queryTemp.Stats.CreatureDisplayID[0] = ci->Modelid1;\n+        queryTemp.Stats.CreatureDisplayID[1] = ci->Modelid2;\n+        queryTemp.Stats.CreatureDisplayID[2] = ci->Modelid3;\n+        queryTemp.Stats.CreatureDisplayID[3] = ci->Modelid4;\n+        queryTemp.Stats.HpMulti = ci->ModHealth;\n+        queryTemp.Stats.EnergyMulti = ci->ModMana;\n+        queryTemp.Stats.Leader = ci->RacialLeader;\n+        for (uint32 i = 0; i < MAX_CREATURE_QUEST_ITEMS; ++i)\n+            queryTemp.Stats.QuestItems[i] = 0;\n+        if (std::vector<uint32> const* items = sObjectMgr->GetCreatureQuestItemList(ci->Entry))\n+            for (uint32 i = 0; i < MAX_CREATURE_QUEST_ITEMS; ++i)\n+                if (i < items->size())\n+                    queryTemp.Stats.QuestItems[i] = (*items)[i];\n+        queryTemp.Stats.CreatureMovementInfoID = ci->movementId;\n+        queryTemp.Write();\n+        queryTemp.ShrinkToFit();\n+\n+        WorldPacket response = queryTemp.Move();\n+        handler->GetSession()->SendPacket(&response);\n+\n+        handler->SendSysMessage(\"Done.\");\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotDebugSpellsCommand(ChatHandler* handler)\n+    {\n+        Unit* target = handler->getSelectedUnit();\n+        if (!target)\n+        {\n+            handler->SendSysMessage(\"No target selected\");\n+            return true;\n+        }\n+\n+        std::ostringstream ostr;\n+        ostr << \"Listing spells for \" << target->GetName() << ':';\n+        for (uint8 i = 0; i < CURRENT_MAX_SPELL; ++i)\n+        {\n+            if (Spell const* curSpell = target->GetCurrentSpell(CurrentSpellTypes(i)))\n+                ostr << \"\\nSpell type \" << uint32(i) << \":\\n\" << curSpell->GetDebugInfo();\n+        }\n+\n+        handler->SendSysMessage(ostr.view());\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotDebugStatesCommand(ChatHandler* handler)\n+    {\n+        Unit const* target = handler->getSelectedUnit();\n+        if (!target)\n+        {\n+            handler->SendSysMessage(\"No target selected\");\n+            return true;\n+        }\n+\n+        std::ostringstream ostr;\n+        ostr << \"Listing states for \" << target->GetName() << \":\";\n+        for (uint32 state = 1u; state != 1u << 31; state <<= 1)\n+        {\n+            if (target->HasUnitState(state))\n+                ostr << \"\\n    0x\" << std::hex << (state);\n+        }\n+\n+        handler->SendSysMessage(ostr.view());\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotDebugRaidCommand(ChatHandler* handler)\n+    {\n+        Player* owner = handler->GetSession()->GetPlayer();\n+        Group const* gr = owner->GetGroup();\n+        if (!owner->HaveBot() || !gr)\n+        {\n+            handler->SendSysMessage(\".npcbot debug raid\");\n+            handler->SendSysMessage(\"prints your raid bots info\");\n+            return true;\n+        }\n+        if (!gr->isRaidGroup())\n+        {\n+            handler->SendSysMessage(\"only usable in raid\");\n+            return true;\n+        }\n+\n+        uint8 counter = 0;\n+        uint8* subBots = new uint8[MAX_RAID_SUBGROUPS];\n+        memset((void*)subBots, 0, (MAX_RAID_SUBGROUPS)*sizeof(uint8));\n+        std::ostringstream sstr;\n+        BotMap const* map = owner->GetBotMgr()->GetBotMap();\n+        for (auto const& [guid, bot] : *map)\n+        {\n+            if (!bot || !gr->IsMember(guid))\n+                continue;\n+\n+            uint8 subGroup = gr->GetMemberGroup(guid);\n+            ++subBots[subGroup];\n+            sstr << uint32(++counter) << \": \" << guid.GetCounter() << \" \" << bot->GetName()\n+                << \" subgr: \" << uint32(subGroup + 1) << \"\\n\";\n+        }\n+\n+        for (uint8 i = 0; i != MAX_RAID_SUBGROUPS; ++i)\n+            if (subBots[i] > 0)\n+                sstr << uint32(subBots[i]) << \" bots in subgroup \" << uint32(i + 1) << \"\\n\";\n+\n+        handler->SendSysMessage(sstr.view());\n+        delete[] subBots;\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotDebugMountCommand(ChatHandler* handler, Optional<uint32> mountId)\n+    {\n+        if (!mountId)\n+            return false;\n+\n+        Unit* target = handler->getSelectedUnit();\n+        if (!target)\n+        {\n+            handler->SendSysMessage(\"No target selected\");\n+            return true;\n+        }\n+\n+        target->Mount(*mountId);\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotDebugModelCommand(ChatHandler* handler, Optional<uint32> setId)\n+    {\n+        Player* owner = handler->GetSession()->GetPlayer();\n+        Unit* target = owner->GetSelectedUnit();\n+        if (!target)\n+        {\n+            handler->SendSysMessage(\"No target selected\");\n+            return true;\n+        }\n+\n+        if (setId)\n+            last_model_id = *setId;\n+\n+        handler->PSendSysMessage(\"Setting model %u...\", last_model_id);\n+        target->SetDisplayId(last_model_id++);\n+\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotDebugSpellVisualCommand(ChatHandler* handler, Optional<uint32> kit)\n+    {\n+        Player* owner = handler->GetSession()->GetPlayer();\n+        Unit* target = owner->GetSelectedUnit();\n+        if (!target)\n+        {\n+            handler->SendSysMessage(\"No target selected\");\n+            return true;\n+        }\n+\n+        target->SendPlaySpellVisualKit(1, kit.value_or(0));\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotDumpLoadCommand(ChatHandler* handler, Optional<std::string> file_str, Optional<bool> forceKick)\n+    {\n+        bool force_kick = forceKick.value_or(false);\n+        if (!file_str || (!force_kick && sWorld->GetPlayerCount() > 0))\n+        {\n+            handler->SendSysMessage(\".npcbot dump load\");\n+            handler->SendSysMessage(\"Imports NPCBots from a backup SQL file created with '.npcbot dump write' command.\");\n+            handler->SendSysMessage(\"Syntax: .npcbot dump load #file_name [#force_kick_all]\");\n+            if (!force_kick && sWorld->GetPlayerCount() > 0)\n+                handler->SendSysMessage(\"Make sure no players are online before importing.\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        sWorld->SetPlayerAmountLimit(0);\n+        if (force_kick)\n+            sWorld->KickAll();\n+\n+        //omit file ext if needed\n+        if (file_str->find('.') == std::string::npos)\n+            *file_str += \".sql\";\n+\n+        switch (NPCBotsDump{}.Load(*file_str))\n+        {\n+            case BOT_DUMP_SUCCESS:\n+                handler->SendSysMessage(\"Import successful.\");\n+                handler->SendSysMessage(\"Server will be restarted now to prevent DB corruption.\");\n+                sWorld->ShutdownServ(4, SHUTDOWN_MASK_RESTART, 70);\n+                break;\n+            case BOT_DUMP_FAIL_FILE_NOT_EXIST:\n+                handler->PSendSysMessage(\"Can't open %s or the file doesn't exist!\", file_str->c_str());\n+                handler->SetSentErrorMessage(true);\n+                return false;\n+            case BOT_DUMP_FAIL_FILE_CORRUPTED:\n+                handler->SendSysMessage(\"File data integrity check failed!\");\n+                handler->SetSentErrorMessage(true);\n+                return false;\n+            case BOT_DUMP_FAIL_DATA_OCCUPIED:\n+                handler->PSendSysMessage(\"Table data contained in %s overlaps with existing table entries!\", file_str->c_str());\n+                handler->SetSentErrorMessage(true);\n+                return false;\n+            default:\n+                handler->SendSysMessage(\"Error!\");\n+                handler->SetSentErrorMessage(true);\n+                return false;\n+        }\n+\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotDumpWriteCommand(ChatHandler* handler, Optional<std::string> file_str)\n+    {\n+        if (!file_str)\n+        {\n+            handler->SendSysMessage(\".npcbot dump write\\nExports spawned NPCBots into a SQL file.\\nSyntax: .npcbot dump write #file_name\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        //omit file ext if needed\n+        if (file_str->find('.') == std::string::npos)\n+            *file_str += \".sql\";\n+\n+        switch (NPCBotsDump{}.Write(*file_str))\n+        {\n+            case BOT_DUMP_SUCCESS:\n+                handler->SendSysMessage(\"Export successful.\");\n+                break;\n+            case BOT_DUMP_FAIL_FILE_ALREADY_EXISTS:\n+                handler->PSendSysMessage(\"File %s already exists!\", file_str->c_str());\n+                handler->SetSentErrorMessage(true);\n+                return false;\n+            case BOT_DUMP_FAIL_CANT_WRITE_TO_FILE:\n+                handler->SendSysMessage(\"Can't open file for write!\");\n+                handler->SetSentErrorMessage(true);\n+                return false;\n+            case BOT_DUMP_FAIL_INCOMPLETE:\n+                handler->SendSysMessage(\"Export was not completed!\");\n+                handler->SetSentErrorMessage(true);\n+                return false;\n+            default:\n+                handler->SendSysMessage(\"Error!\");\n+                handler->SetSentErrorMessage(true);\n+                return false;\n+        }\n+\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotOrderPullCommand(ChatHandler* handler, Optional<std::string> bot_name, Optional<std::string_view> target_token)\n+    {\n+        Player* owner = handler->GetSession()->GetPlayer();\n+        if (!owner->HaveBot() || !bot_name)\n+        {\n+            handler->SendSysMessage(\".npcbot order pull #bot_name #[target_token]\");\n+            handler->SendSysMessage(\"Orders bot to pull target immediately\");\n+            return true;\n+        }\n+\n+        if (owner->GetBotMgr()->IsPartyInCombat(false))\n+        {\n+            handler->SendSysMessage(\"Can't do that while in combat!\");\n+            return true;\n+        }\n+\n+        for (std::size_t i{}; i < bot_name->size(); ++i)\n+            if ((*bot_name)[i] == '_')\n+                (*bot_name)[i] = ' ';\n+\n+        Creature const* bot = owner->GetBotMgr()->GetBotByName(*bot_name);\n+        if (bot)\n+        {\n+            if (!bot->IsInWorld())\n+            {\n+                handler->PSendSysMessage(\"Bot %s is not found!\", bot_name->c_str());\n+                return true;\n+            }\n+            if (!bot->IsAlive())\n+            {\n+                handler->PSendSysMessage(\"%s is dead!\", bot->GetName());\n+                return true;\n+            }\n+            if (!bot->GetBotAI()->HasRole(BOT_ROLE_DPS) || bot->GetVictim() || bot->IsInCombat() || !bot->getAttackers().empty())\n+            {\n+                handler->PSendSysMessage(\"%s cannot pull target! Must be idle and have DPS role\", bot->GetName());\n+                return true;\n+            }\n+        }\n+        else\n+        {\n+            auto const& class_name = *bot_name;\n+            if (!std::ranges::all_of(class_name, [](char c) { return std::islower(c); }))\n+            {\n+                handler->SendSysMessage(\"Bot class name must be in lower case!\");\n+                return true;\n+            }\n+\n+            uint8 bot_class = BotMgr::BotClassByClassName(class_name);\n+            if (bot_class == BOT_CLASS_NONE)\n+            {\n+                handler->PSendSysMessage(\"Unknown bot name or class %s!\", class_name);\n+                return true;\n+            }\n+\n+            std::vector<Creature*> cBots = owner->GetBotMgr()->GetAllBotsByClass(bot_class);\n+\n+            if (cBots.empty())\n+            {\n+                handler->PSendSysMessage(\"No bots of class %u found!\", bot_class);\n+                return true;\n+            }\n+\n+            bot = cBots.size() == 1 ? cBots.front() : Bcore::Containers::SelectRandomContainerElement(cBots);\n+\n+            if (!bot)\n+            {\n+                handler->SendSysMessage(\"None of %u found bots can use pull yet!\", cBots.size());\n+                return true;\n+            }\n+        }\n+\n+        ObjectGuid target_guid = ObjectGuid::Empty;\n+        bool token_valid = true;\n+        if (!target_token || target_token == \"mytarget\")\n+            target_guid = owner->GetTarget();\n+        else if (Group const* group = owner->GetGroup())\n+        {\n+            if (target_token == \"star\")\n+                target_guid = group->GetTargetIcons()[0];\n+            else if (target_token == \"circle\")\n+                target_guid = group->GetTargetIcons()[1];\n+            else if (target_token == \"diamond\")\n+                target_guid = group->GetTargetIcons()[2];\n+            else if (target_token == \"triangle\")\n+                target_guid = group->GetTargetIcons()[3];\n+            else if (target_token == \"moon\")\n+                target_guid = group->GetTargetIcons()[4];\n+            else if (target_token == \"square\")\n+                target_guid = group->GetTargetIcons()[5];\n+            else if (target_token == \"cross\")\n+                target_guid = group->GetTargetIcons()[6];\n+            else if (target_token == \"skull\")\n+                target_guid = group->GetTargetIcons()[7];\n+            else if (target_token->size() == 1u && std::isdigit(target_token->front()))\n+            {\n+                uint8 digit = static_cast<uint8>(std::stoi(std::string(*target_token)));\n+                switch (digit)\n+                {\n+                    case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8:\n+                        target_guid = group->GetTargetIcons()[digit - 1];\n+                        break;\n+                    default:\n+                        token_valid = false;\n+                        break;\n+                }\n+            }\n+            else\n+                token_valid = false;\n+        }\n+        else\n+            token_valid = false;\n+\n+        if (!token_valid)\n+        {\n+            handler->PSendSysMessage(\"Invalid target token '%s'!\", *target_token);\n+            handler->SendSysMessage(\"Valid target tokens:\\n    '','mytarget', \"\n+                \"'star','1', 'circle','2', 'diamond','3', 'triangle','4', 'moon','5', 'square','6', 'cross','7', 'skull','8'\"\n+                \"\\nNote that target icons tokens are only available while in group\");\n+            return true;\n+        }\n+\n+        Unit* target = !target_guid.IsEmpty() ? ObjectAccessor::GetUnit(*owner, target_guid) : nullptr;\n+        if (!target || !bot->FindMap() || target->FindMap() != bot->FindMap())\n+        {\n+            handler->PSendSysMessage(\"Invalid target '%s'!\", target ? target->GetName().c_str() : \"unknown\");\n+            return true;\n+        }\n+\n+        bot_ai::BotOrder order(BOT_ORDER_PULL);\n+        order.params.pullParams.targetGuid = target_guid;\n+\n+        if (bot->GetBotAI()->AddOrder(std::move(order)))\n+        {\n+            if (DEBUG_BOT_ORDERS)\n+                handler->PSendSysMessage(\"Order given: %s: pull %s\", bot->GetName(), target ? target->GetName().c_str() : \"unknown\");\n+        }\n+        else\n+        {\n+            if (DEBUG_BOT_ORDERS)\n+                handler->PSendSysMessage(\"Order failed: %s: pull %s\", bot->GetName(), target ? target->GetName().c_str() : \"unknown\");\n+        }\n+\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotOrderCastCommand(ChatHandler* handler, Optional<std::string> bot_name, Optional<std::string> spell_name, Optional<std::string_view> target_token)\n+    {\n+        Player* owner = handler->GetSession()->GetPlayer();\n+        if (!owner->HaveBot() || !bot_name || !spell_name)\n+        {\n+            handler->SendSysMessage(\".npcbot order cast #bot_name #spell_underscored_name #[target_token]\");\n+            handler->SendSysMessage(\"Orders bot to cast a spell immediately\");\n+            return true;\n+        }\n+\n+        for (std::size_t i{}; i < spell_name->size(); ++i)\n+            if ((*spell_name)[i] == '_')\n+                (*spell_name)[i] = ' ';\n+\n+        for (std::size_t i{}; i < bot_name->size(); ++i)\n+            if ((*bot_name)[i] == '_')\n+                (*bot_name)[i] = ' ';\n+\n+        auto canBotUseSpell = [=](Creature const* tbot, uint32 bspell) {\n+            //we ignore GCD for now\n+            return bspell && (tbot->GetBotAI()->GetSpellCooldown(bspell) <= tbot->GetBotAI()->GetLastDiff());\n+        };\n+\n+        uint32 base_spell = 0;\n+        Creature* bot = owner->GetBotMgr()->GetBotByName(*bot_name);\n+        if (bot)\n+        {\n+            if (!bot->IsInWorld())\n+            {\n+                handler->PSendSysMessage(\"Bot %s is not found!\", bot_name->c_str());\n+                return true;\n+            }\n+            if (!bot->IsAlive())\n+            {\n+                handler->PSendSysMessage(\"%s is dead!\", bot->GetName());\n+                return true;\n+            }\n+\n+            base_spell = bot->GetBotAI()->GetBaseSpell(*spell_name, handler->GetSessionDbcLocale());\n+            if (!base_spell)\n+            {\n+                handler->PSendSysMessage(\"%s doesn't have spell named '%s'!\", bot->GetName(), spell_name->c_str());\n+                return true;\n+            }\n+            if (!canBotUseSpell(bot, base_spell))\n+            {\n+                handler->PSendSysMessage(\"%s's %s is not ready yet!\", bot->GetName(), sSpellMgr->GetSpellInfo(base_spell)->SpellName[handler->GetSessionDbcLocale()]);\n+                return true;\n+            }\n+        }\n+        else\n+        {\n+            auto const& class_name = *bot_name;\n+            if (!std::ranges::all_of(class_name, [](char c) { return std::islower(c); }))\n+            {\n+                handler->SendSysMessage(\"Bot class name must be in lower case!\");\n+                return true;\n+            }\n+\n+            uint8 bot_class = BotMgr::BotClassByClassName(class_name);\n+            if (bot_class == BOT_CLASS_NONE)\n+            {\n+                handler->PSendSysMessage(\"Unknown bot name or class %s!\", class_name);\n+                return true;\n+            }\n+\n+            std::vector<Creature*> cBots = owner->GetBotMgr()->GetAllBotsByClass(bot_class);\n+\n+            if (cBots.empty())\n+            {\n+                handler->PSendSysMessage(\"No bots of class %u found!\", bot_class);\n+                return true;\n+            }\n+\n+            uint32 found_bots_count = static_cast<uint32>(cBots.size());\n+\n+            for (Creature const* fbot : cBots)\n+            {\n+                base_spell = fbot->GetBotAI()->GetBaseSpell(*spell_name, handler->GetSessionDbcLocale());\n+                if (base_spell)\n+                    break;\n+            }\n+\n+            if (!base_spell)\n+            {\n+                handler->PSendSysMessage(\"None of %u found bots have spell named '%s'!\", found_bots_count, spell_name->c_str());\n+                return true;\n+            }\n+\n+            std::erase_if(cBots, [=](Creature const* tbot) {\n+                if (tbot->GetBotAI()->GetOrdersCount() >= MAX_BOT_ORDERS_QUEUE_SIZE)\n+                    return true;\n+                return !canBotUseSpell(tbot, base_spell);\n+            });\n+\n+            decltype(cBots) ccBots;\n+            for (decltype(cBots)::const_iterator it = cBots.begin(); it != cBots.end();)\n+            {\n+                if (!(*it)->GetCurrentSpell(CURRENT_CHANNELED_SPELL) && !(*it)->IsNonMeleeSpellCast(false, false, true, false, false))\n+                {\n+                    ccBots.emplace_back(*it);\n+                    it = cBots.erase(it);\n+                }\n+                else\n+                    ++it;\n+            }\n+\n+            bot = ccBots.empty() ? nullptr : ccBots.size() == 1 ? ccBots.front() : Bcore::Containers::SelectRandomContainerElement(ccBots);\n+            if (!bot)\n+                bot = cBots.empty() ? nullptr : cBots.size() == 1 ? cBots.front() : Bcore::Containers::SelectRandomContainerElement(cBots);\n+\n+            if (!bot)\n+            {\n+                handler->PSendSysMessage(\"None of %u found bots can use %s yet!\", found_bots_count, spell_name->c_str());\n+                return true;\n+            }\n+        }\n+\n+        ObjectGuid target_guid = ObjectGuid::Empty;\n+        bool token_valid = true;\n+        if (!target_token || target_token == \"bot\" || target_token == \"self\")\n+            target_guid = bot->GetGUID();\n+        else if (target_token == \"me\" || target_token == \"master\")\n+            target_guid = owner->GetGUID();\n+        else if (target_token == \"mypet\")\n+            target_guid = owner->GetPetGUID();\n+        else if (target_token == \"myvehicle\")\n+            target_guid = owner->GetVehicle() ? owner->GetVehicleBase()->GetGUID() : ObjectGuid::Empty;\n+        else if (target_token == \"target\")\n+            target_guid = bot->GetTarget();\n+        else if (target_token == \"mytarget\")\n+            target_guid = owner->GetTarget();\n+        else if (Group const* group = owner->GetGroup())\n+        {\n+            if (target_token == \"star\")\n+                target_guid = group->GetTargetIcons()[0];\n+            else if (target_token == \"circle\")\n+                target_guid = group->GetTargetIcons()[1];\n+            else if (target_token == \"diamond\")\n+                target_guid = group->GetTargetIcons()[2];\n+            else if (target_token == \"triangle\")\n+                target_guid = group->GetTargetIcons()[3];\n+            else if (target_token == \"moon\")\n+                target_guid = group->GetTargetIcons()[4];\n+            else if (target_token == \"square\")\n+                target_guid = group->GetTargetIcons()[5];\n+            else if (target_token == \"cross\")\n+                target_guid = group->GetTargetIcons()[6];\n+            else if (target_token == \"skull\")\n+                target_guid = group->GetTargetIcons()[7];\n+            else if (target_token->size() == 1u && std::isdigit(target_token->front()))\n+            {\n+                uint8 digit = static_cast<uint8>(std::stoi(std::string(*target_token)));\n+                switch (digit)\n+                {\n+                    case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8:\n+                        target_guid = group->GetTargetIcons()[digit - 1];\n+                        break;\n+                    default:\n+                        token_valid = false;\n+                        break;\n+                }\n+            }\n+            else\n+                token_valid = false;\n+        }\n+        else\n+            token_valid = false;\n+\n+        if (!token_valid)\n+        {\n+            handler->PSendSysMessage(\"Invalid target token '%s'!\", *target_token);\n+            handler->SendSysMessage(\"Valid target tokens:\\n    '','bot','self', 'me','master', 'mypet', 'myvehicle', 'target', 'mytarget', \"\n+                \"'star','1', 'circle','2', 'diamond','3', 'triangle','4', 'moon','5', 'square','6', 'cross','7', 'skull','8'\"\n+                \"\\nNote that target icons tokens are only available while in group\");\n+            return true;\n+        }\n+\n+        Unit* target = !target_guid.IsEmpty() ? ObjectAccessor::GetUnit(*owner, target_guid) : nullptr;\n+        if (!target || !bot->FindMap() || target->FindMap() != bot->FindMap())\n+        {\n+            handler->PSendSysMessage(\"Invalid target '%s'!\", target ? target->GetName().c_str() : \"unknown\");\n+            return true;\n+        }\n+\n+        bot_ai::BotOrder order(BOT_ORDER_SPELLCAST);\n+        order.params.spellCastParams.baseSpell = base_spell;\n+        order.params.spellCastParams.targetGuid = target_guid;\n+\n+        if (bot->GetBotAI()->AddOrder(std::move(order)))\n+        {\n+            if (DEBUG_BOT_ORDERS)\n+                handler->PSendSysMessage(\"Order given: %s: %s on %s\", bot->GetName(),\n+                    sSpellMgr->GetSpellInfo(base_spell)->SpellName[handler->GetSessionDbcLocale()], target ? target->GetName().c_str() : \"unknown\");\n+        }\n+        else\n+        {\n+            if (DEBUG_BOT_ORDERS)\n+                handler->PSendSysMessage(\"Order failed: %s: %s on %s\", bot->GetName(),\n+                    sSpellMgr->GetSpellInfo(base_spell)->SpellName[handler->GetSessionDbcLocale()], target ? target->GetName().c_str() : \"unknown\");\n+        }\n+\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotVehicleEjectCommand(ChatHandler* handler)\n+    {\n+        Player const* owner = handler->GetSession()->GetPlayer();\n+        Unit const* target = handler->getSelectedUnit();\n+\n+        bool hasBotsInVehicles = false;\n+        bool botsInSelVehicle = 0;\n+        BotMap const* bmap = nullptr;\n+        if (owner->HaveBot())\n+        {\n+            bmap = owner->GetBotMgr()->GetBotMap();\n+            for (const auto& [_, bot] : *bmap)\n+            {\n+                if (bot && bot->GetVehicle())\n+                {\n+                    if (!hasBotsInVehicles)\n+                        hasBotsInVehicles = true;\n+                    if (!botsInSelVehicle && target && target->IsVehicle() && target->GetVehicleKit()->GetSeatForPassenger(bot))\n+                        botsInSelVehicle = true;\n+                }\n+                if (hasBotsInVehicles && botsInSelVehicle)\n+                    break;\n+            }\n+        }\n+\n+        if (bmap && hasBotsInVehicles)\n+        {\n+            for (const auto& [_, bot] : *bmap)\n+            {\n+                if (bot && bot->GetVehicle())\n+                {\n+                    bool doeject = false;\n+                    if (!botsInSelVehicle)\n+                        doeject = true;\n+                    else if (target)\n+                        if (/*VehicleSeatEntry const* seat = */target->GetVehicleKit()->GetSeatForPassenger(bot))\n+                            //if (seat->CanEnterOrExit())\n+                                doeject = true;\n+\n+                    if (doeject)\n+                    {\n+                        bot->GetVehicle()->GetBase()->StopMoving();\n+                        //handler->PSendSysMessage(\"Removing %s from %s\", bot->GetName().c_str(), bot->GetVehicle()->GetBase()->GetName().c_str());\n+                        bot->ExitVehicle();\n+                        //bot->BotStopMovement();\n+                    }\n+                }\n+            }\n+            return true;\n+        }\n+\n+        handler->SendSysMessage(\".npcbot eject\");\n+        handler->SendSysMessage(\"Removes your bots from selected vehicle, or, all bots from any vehicles if no vehicle selected\");\n+        handler->SetSentErrorMessage(true);\n+        return false;\n+    }\n+\n+    static bool HandleNpcBotFollowDistanceCommand(ChatHandler* handler, Optional<int32> dist)\n+    {\n+        Player* owner = handler->GetSession()->GetPlayer();\n+\n+        if (!owner->HaveBot() || !dist)\n+        {\n+            handler->SendSysMessage(\".npcbot distance #[attack] #newdist\");\n+            handler->SendSysMessage(\"Sets follow / attack distance for bots\");\n+            return true;\n+        }\n+\n+        uint8 newdist = uint8(std::min<int32>(std::max<int32>(*dist, 0), 100));\n+        owner->GetBotMgr()->SetBotFollowDist(newdist);\n+\n+        handler->PSendSysMessage(\"Bots' follow distance is set to %u\", uint32(newdist));\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotAttackDistanceShortCommand(ChatHandler* handler)\n+    {\n+        Player* owner = handler->GetSession()->GetPlayer();\n+        if (!owner->HaveBot())\n+        {\n+            handler->SendSysMessage(\".npcbot distance attack short\");\n+            handler->SendSysMessage(\"Sets attack distance for bots\");\n+            return true;\n+        }\n+\n+        owner->GetBotMgr()->SetBotAttackRangeMode(BOT_ATTACK_RANGE_SHORT);\n+\n+        handler->SendSysMessage(\"Bots' attack distance is set to 'short'\");\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotAttackDistanceLongCommand(ChatHandler* handler)\n+    {\n+        Player* owner = handler->GetSession()->GetPlayer();\n+        if (!owner->HaveBot())\n+        {\n+            handler->SendSysMessage(\".npcbot distance attack long\");\n+            handler->SendSysMessage(\"Sets attack distance for bots\");\n+            return true;\n+        }\n+\n+        owner->GetBotMgr()->SetBotAttackRangeMode(BOT_ATTACK_RANGE_LONG);\n+\n+        handler->SendSysMessage(\"Bots' attack distance is set to 'long'\");\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotAttackDistanceExactCommand(ChatHandler* handler, Optional<int32> dist)\n+    {\n+        Player* owner = handler->GetSession()->GetPlayer();\n+\n+        if (!owner->HaveBot() || !dist)\n+        {\n+            handler->SendSysMessage(\".npcbot distance attack #newdist\");\n+            handler->SendSysMessage(\"Sets attack distance for bots\");\n+            return true;\n+        }\n+\n+        uint8 newdist = uint8(std::min<int32>(std::max<int32>(*dist, 0), 50));\n+        owner->GetBotMgr()->SetBotAttackRangeMode(BOT_ATTACK_RANGE_EXACT, newdist);\n+\n+        handler->PSendSysMessage(\"Bots' attack distance is set to %u\", uint32(newdist));\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotHideCommand(ChatHandler* handler)\n+    {\n+        // Hiding/unhiding bots should be allowed only out of combat\n+        // Currenly bots can teleport to master in combat\n+        // This creates potential for some serious trolls\n+        Player* owner = handler->GetSession()->GetPlayer();\n+        if (!owner->HaveBot())\n+        {\n+            handler->SendSysMessage(\".npcbot hide\");\n+            handler->SendSysMessage(\"Removes your owned npcbots from world temporarily\");\n+            //handler->SendSysMessage(\"You have no bots!\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+        if (!owner->IsAlive())\n+        {\n+            handler->GetSession()->SendNotification(\"You are dead\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+        if (owner->GetBotMgr()->IsPartyInCombat(false))\n+        {\n+            handler->GetSession()->SendNotification(LANG_YOU_IN_COMBAT);\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        if (!owner->GetBotMgr()->GetBotsHidden())\n+        {\n+            owner->GetBotMgr()->SetBotsHidden(true);\n+            handler->SendSysMessage(\"Bots hidden\");\n+        }\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotUnhideCommand(ChatHandler* handler)\n+    {\n+        Player* owner = handler->GetSession()->GetPlayer();\n+        if (!owner->HaveBot())\n+        {\n+            handler->SendSysMessage(\".npcbot unhide | show\");\n+            handler->SendSysMessage(\"Returns your temporarily hidden bots back\");\n+            //handler->SendSysMessage(\"You have no bots!\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+        if (!owner->IsAlive())\n+        {\n+            handler->GetSession()->SendNotification(\"You are dead\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+        if (owner->GetBotMgr()->IsPartyInCombat(true))\n+        {\n+            handler->GetSession()->SendNotification(\"You can't do that while in PvP combat\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        if (owner->GetBotMgr()->GetBotsHidden())\n+        {\n+            owner->GetBotMgr()->SetBotsHidden(false);\n+            handler->SendSysMessage(\"Bots unhidden\");\n+        }\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotFixCommand(ChatHandler* handler, Optional<Variant<std::string_view, uint32>> bot_id_or_name)\n+    {\n+        Creature const* target = handler->getSelectedCreature();\n+\n+        uint32 bot_id;\n+        if (target && target->IsNPCBot())\n+            bot_id = target->GetEntry();\n+        else if (bot_id_or_name)\n+        {\n+            if (bot_id_or_name->holds_alternative<uint32>())\n+                bot_id = bot_id_or_name->get<uint32>();\n+            else if (Creature const* fbot = BotDataMgr::FindBot(bot_id_or_name->get<std::string_view>(), LocaleConstant(handler->GetSessionDbLocaleIndex())))\n+            {\n+                target = fbot;\n+                bot_id = target->GetEntry();\n+            }\n+            else\n+            {\n+                char* cre_id = handler->extractKeyFromLink((char*)bot_id_or_name->get<std::string_view>().data(), \"Hcreature_entry\");\n+                bot_id = uint32(atoi(cre_id));\n+            }\n+        }\n+        else if (target)\n+        {\n+            handler->SendSysMessage(\"You must select a npcbot\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+        else\n+        {\n+            handler->SendSysMessage(\".npcbot fix #[id | name | link | <selection>]\");\n+            handler->SendSysMessage(\"Attempts to fix different bot's unit states and ai mishaps which stall its normal function\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        Creature const* bot = target ? target : BotDataMgr::FindBot(bot_id);\n+        if (!bot)\n+        {\n+            handler->PSendSysMessage(\"NpcBot %u is not found!\", bot_id);\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        NpcBotData const* bot_data = BotDataMgr::SelectNpcBotData(bot_id);\n+        Player* owner = !bot->IsFreeBot() ? bot->GetBotOwner() : nullptr;\n+        Player* tickler = handler->GetPlayer();\n+\n+        if (!tickler->IsGameMaster())\n+        {\n+            handler->SendSysMessage(\"Must be in GM mode to use this command!\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        handler->PSendSysMessage(\"Trying to fix bot %s (%u) owned by %s (%u)\", bot->GetName(), bot_id,\n+            owner ? owner->GetName().c_str() : \"Unknown\", owner ? owner->GetGUID().GetCounter() : bot_data->owner);\n+\n+        bot->GetBotAI()->ReceiveEmote(tickler, TEXT_EMOTE_TICKLE);\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotKillCommand(ChatHandler* handler)\n+    {\n+        Player* owner = handler->GetSession()->GetPlayer();\n+\n+        ObjectGuid guid = owner->GetTarget();\n+        if (!guid || !owner->HaveBot())\n+        {\n+            handler->SendSysMessage(\".npcbot kill | suicide\");\n+            handler->SendSysMessage(\"Makes your npcbot just drop dead. If you select yourself ALL your bots will die\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        if (guid == owner->GetGUID())\n+        {\n+            owner->GetBotMgr()->KillAllBots();\n+            return true;\n+        }\n+        if (Creature* bot = owner->GetBotMgr()->GetBot(guid))\n+        {\n+            owner->GetBotMgr()->KillBot(bot);\n+            return true;\n+        }\n+\n+        handler->SendSysMessage(\"You must select one of your bots or yourself\");\n+        handler->SetSentErrorMessage(true);\n+        return false;\n+    }\n+\n+    static bool HandleNpcBotGoCommand(ChatHandler* handler, Optional<uint32> creatureId)\n+    {\n+        Player* player = handler->GetSession()->GetPlayer();\n+\n+        if (!creatureId)\n+        {\n+            handler->SendSysMessage(\".npcbot go #[ID]\");\n+            handler->SendSysMessage(\"Teleports to npcbot's current location\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        Creature const* bot = BotDataMgr::FindBot(*creatureId);\n+        if (!bot)\n+        {\n+            handler->PSendSysMessage(\"NpcBot %u is not found!\", *creatureId);\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        handler->PSendSysMessage(LANG_APPEARING_AT, bot->GetName());\n+\n+        if (player->IsInFlight())\n+            player->FinishTaxiFlight();\n+        else\n+            player->SaveRecallPosition(); // save only in non-flight case\n+\n+        WorldLocation wloc = *bot;\n+        wloc.m_positionZ += 1.5f;\n+\n+        player->TeleportTo(wloc, TELE_TO_GM_MODE);\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotSendToCommand(ChatHandler* handler, Optional<std::vector<std::string>> names)\n+    {\n+        static auto return_syntax = [](ChatHandler* chandler) -> bool {\n+            chandler->SendSysMessage(\"Syntax: .npcbot sendto #names...\");\n+            chandler->SendSysMessage(\"Makes selected/named bot(s) wait 30 sec for your next DEST spell, assume that position and hold it\");\n+            chandler->SendSysMessage(\"Max distance is 70 yds\");\n+            chandler->SetSentErrorMessage(true);\n+            return false;\n+        };\n+\n+        static auto return_success = [](ChatHandler* chandler, Variant<std::string, uint32> name_or_count) -> bool {\n+            if (name_or_count.holds_alternative<uint32>())\n+                chandler->PSendSysMessage(\"Your next dest spell will send %u bot(s) to position...\", name_or_count.get<uint32>());\n+            else\n+                chandler->PSendSysMessage(\"Your next dest spell will send %s to position...\", name_or_count.get<std::string>());\n+            return true;\n+        };\n+\n+        Player const* owner = handler->GetSession()->GetPlayer();\n+\n+        if (!owner->HaveBot())\n+            return return_syntax(handler);\n+\n+        if (!names || names->empty())\n+        {\n+            Unit const* target = handler->getSelectedCreature();\n+            Creature const* bot = target ? owner->GetBotMgr()->GetBot(target->GetGUID()) : nullptr;\n+            if (bot && bot->IsAlive() && !bot->GetBotAI()->HasBotCommandState(BOT_COMMAND_FULLSTOP))\n+            {\n+                bot->GetBotAI()->SetBotAwaitState(BOT_AWAIT_SEND);\n+                return return_success(handler, { bot->GetName() });\n+            }\n+            return return_syntax(handler);\n+        }\n+\n+        uint32 count = 0;\n+        DoForAllNamesNormalizedIn(*names, [owner, &count](std::string const& name) {\n+            Creature const* bot = owner->GetBotMgr()->GetBotByName(name);\n+            if (bot && bot->IsAlive() && !bot->GetBotAI()->HasBotCommandState(BOT_COMMAND_FULLSTOP))\n+            {\n+                ++count;\n+                bot->GetBotAI()->SetBotAwaitState(BOT_AWAIT_SEND);\n+            }\n+        });\n+\n+        if (count == 0)\n+        {\n+            handler->PSendSysMessage(\"Unable to send any of %u bots!\", uint32(names->size()));\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        return return_success(handler, { count });\n+    }\n+\n+    static bool HandleNpcBotSendToLastCommand(ChatHandler* handler, Optional<std::vector<std::string>> names)\n+    {\n+        static auto return_syntax = [](ChatHandler* chandler) -> bool {\n+            chandler->SendSysMessage(\"Syntax: .npcbot sendto last #names...\");\n+            chandler->SendSysMessage(\"Makes selected/named bot(s) assume previous position they were sent from\");\n+            chandler->SendSysMessage(\"This will cancel current sendto await state\");\n+            chandler->SendSysMessage(\"Max distance is 70 yds\");\n+            chandler->SetSentErrorMessage(true);\n+            return false;\n+        };\n+\n+        static auto return_success = [](ChatHandler* chandler, Variant<std::string, uint32> name_or_count) -> bool {\n+            if (name_or_count.holds_alternative<uint32>())\n+                chandler->PSendSysMessage(\"Moving %u bot(s) to previous position...\", name_or_count.get<uint32>());\n+            else\n+                chandler->PSendSysMessage(\"Moving %s to previous position...\", name_or_count.get<std::string>());\n+            return true;\n+        };\n+\n+        Player const* owner = handler->GetSession()->GetPlayer();\n+\n+        if (!owner->HaveBot())\n+            return return_syntax(handler);\n+\n+        if (!names || names->empty())\n+        {\n+            Unit const* target = handler->getSelectedCreature();\n+            Creature const* bot = target ? owner->GetBotMgr()->GetBot(target->GetGUID()) : nullptr;\n+            if (bot && bot->IsAlive() && !bot->GetBotAI()->HasBotCommandState(BOT_COMMAND_FULLSTOP))\n+            {\n+                bot->GetBotAI()->MoveToLastSendPosition();\n+                return return_success(handler, { bot->GetName() });\n+            }\n+            return return_syntax(handler);\n+        }\n+\n+        uint32 count = 0;\n+        DoForAllNamesNormalizedIn(*names, [owner, &count](std::string const& name) {\n+            Creature const* bot = owner->GetBotMgr()->GetBotByName(name);\n+            if (bot && bot->IsAlive() && !bot->GetBotAI()->HasBotCommandState(BOT_COMMAND_FULLSTOP))\n+            {\n+                ++count;\n+                bot->GetBotAI()->MoveToLastSendPosition();\n+            }\n+        });\n+\n+        if (count == 0)\n+        {\n+            handler->PSendSysMessage(\"Unable to send any of %u bots!\", uint32(names->size()));\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        return return_success(handler, { count });\n+    }\n+\n+    static bool HandleNpcBotSendToPointSetCommand(ChatHandler* handler, Optional<uint32> point_id, Optional<std::vector<std::string>> names)\n+    {\n+        static auto return_syntax = [](ChatHandler* chandler) -> bool {\n+            chandler->SendSysMessage(\"Syntax: .npcbot sendto point set #number #names...\");\n+            chandler->SendSysMessage(\"Marks selected/named bots' current position as send point by #number\");\n+            chandler->PSendSysMessage(\"Point number must be in range 1 ... %u\", uint32(MAX_SEND_POINTS));\n+            chandler->SetSentErrorMessage(true);\n+            return false;\n+        };\n+\n+        static auto return_success = [=](ChatHandler* chandler, Variant<std::string, uint32> name_or_count) -> bool {\n+            if (name_or_count.holds_alternative<uint32>())\n+                chandler->PSendSysMessage(\"Marked send point %u for %u bot(s)\", *point_id, name_or_count.get<uint32>());\n+            else\n+                chandler->PSendSysMessage(\"Marked send point %u for %s\", *point_id, name_or_count.get<std::string>());\n+            return true;\n+        };\n+\n+        Player const* owner = handler->GetSession()->GetPlayer();\n+\n+        if (!point_id || !*point_id || *point_id > MAX_SEND_POINTS || !owner->HaveBot())\n+            return return_syntax(handler);\n+\n+        if (!names || names->empty())\n+        {\n+            Unit const* target = handler->getSelectedCreature();\n+            Creature const* bot = target ? owner->GetBotMgr()->GetBot(target->GetGUID()) : nullptr;\n+            if (bot && bot->IsAlive())\n+            {\n+                bot->GetBotAI()->MarkSendPosition(*point_id - 1);\n+                return return_success(handler, { bot->GetName() });\n+            }\n+            return return_syntax(handler);\n+        }\n+\n+        uint32 count = 0;\n+        DoForAllNamesNormalizedIn(*names, [owner, point_id, &count](std::string const& name) {\n+            Creature const* bot = owner->GetBotMgr()->GetBotByName(name);\n+            if (bot && bot->IsAlive())\n+            {\n+                ++count;\n+                bot->GetBotAI()->MarkSendPosition(*point_id - 1);\n+            }\n+        });\n+\n+        if (count == 0)\n+        {\n+            handler->PSendSysMessage(\"Unable to mark send point for any of %u bots!\", uint32(names->size()));\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        return return_success(handler, { count });\n+    }\n+\n+    static bool HandleNpcBotSendToPointCommand(ChatHandler* handler, Optional<uint32> point_id, Optional<std::vector<std::string>> names)\n+    {\n+        static auto return_syntax = [](ChatHandler* chandler) -> bool {\n+            chandler->SendSysMessage(\"Syntax: .npcbot sendto point #number #names...\");\n+            chandler->SendSysMessage(\"Makes selected/named bot(s) assume previously set point by #number\");\n+            chandler->SendSysMessage(\"This will cancel current sendto await state\");\n+            chandler->SendSysMessage(\"Max distance is 70 yds\");\n+            chandler->SetSentErrorMessage(true);\n+            return false;\n+        };\n+\n+        static auto return_success = [=](ChatHandler* chandler, Variant<std::string, uint32> name_or_count) -> bool {\n+            if (name_or_count.holds_alternative<uint32>())\n+                chandler->PSendSysMessage(\"Moving %u bot(s) to point %u...\", name_or_count.get<uint32>(), *point_id);\n+            else\n+                chandler->PSendSysMessage(\"Moving %s to point %u...\", name_or_count.get<std::string>(), *point_id);\n+            return true;\n+        };\n+\n+        Player const* owner = handler->GetSession()->GetPlayer();\n+\n+        if (!point_id || !*point_id || *point_id > MAX_SEND_POINTS || !owner->HaveBot())\n+            return return_syntax(handler);\n+\n+        if (!names || names->empty())\n+        {\n+            Unit const* target = handler->getSelectedCreature();\n+            Creature const* bot = target ? owner->GetBotMgr()->GetBot(target->GetGUID()) : nullptr;\n+            if (bot && bot->IsAlive() && !bot->GetBotAI()->HasBotCommandState(BOT_COMMAND_FULLSTOP))\n+            {\n+                bot->GetBotAI()->MoveToSendPosition(*point_id - 1);\n+                return return_success(handler, { bot->GetName() });\n+            }\n+            return return_syntax(handler);\n+        }\n+\n+        uint32 count = 0;\n+        DoForAllNamesNormalizedIn(*names, [owner, point_id, &count](std::string const& name) {\n+            Creature const* bot = owner->GetBotMgr()->GetBotByName(name);\n+            if (bot && bot->IsAlive() && !bot->GetBotAI()->HasBotCommandState(BOT_COMMAND_FULLSTOP))\n+            {\n+                ++count;\n+                bot->GetBotAI()->MoveToSendPosition(*point_id - 1);\n+            }\n+        });\n+\n+        if (count == 0)\n+        {\n+            handler->PSendSysMessage(\"Unable to send any of %u bots!\", uint32(names->size()));\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        return return_success(handler, { count });\n+    }\n+\n+    static bool HandleNpcBotRecallCommand(ChatHandler* handler)\n+    {\n+        Player* owner = handler->GetSession()->GetPlayer();\n+\n+        ObjectGuid guid = owner->GetTarget();\n+        if (!guid || !owner->HaveBot())\n+        {\n+            handler->SendSysMessage(\".npcbot recall\");\n+            handler->SendSysMessage(\"Forces npcbots to move directly on your position. Select a npcbot you want to move or select yourself to move all bots\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+        if (owner->GetBotMgr()->IsPartyInCombat(false))\n+        {\n+            handler->GetSession()->SendNotification(LANG_YOU_IN_COMBAT);\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        if (guid == owner->GetGUID())\n+        {\n+            owner->GetBotMgr()->RecallAllBots();\n+            return true;\n+        }\n+        if (Creature* bot = owner->GetBotMgr()->GetBot(guid))\n+        {\n+            owner->GetBotMgr()->RecallBot(bot);\n+            return true;\n+        }\n+\n+        handler->SendSysMessage(\"You must select one of your bots or yourself\");\n+        handler->SetSentErrorMessage(true);\n+        return false;\n+    }\n+\n+    static bool HandleNpcBotRecallSpawnsCommand(ChatHandler* handler)\n+    {\n+        Player const* owner = handler->GetSession()->GetPlayer();\n+\n+        std::vector<ObjectGuid> botvec;\n+        BotDataMgr::GetNPCBotGuidsByOwner(botvec, owner->GetGUID());\n+        if (owner->HaveBot())\n+            std::erase_if(botvec, [=](ObjectGuid botguid) { return owner->GetBotMgr()->GetBot(botguid); });\n+\n+        uint32 recalled_count = 0;\n+        for (ObjectGuid botguid : botvec)\n+        {\n+            if (Creature const* bot = BotDataMgr::FindBot(botguid.GetEntry()))\n+            {\n+                bot->GetBotAI()->ResetBotAI(BOTAI_RESET_FORCERECALL);\n+                ++recalled_count;\n+            }\n+        }\n+\n+        if (recalled_count == 0)\n+        {\n+            handler->SendSysMessage(\".npcbot recall spawns\");\n+            handler->SendSysMessage(\"Forces all your owned inactive npcbots to teleport to their spawn locations immediatelly\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotRecallTeleportCommand(ChatHandler* handler)\n+    {\n+        Player* owner = handler->GetSession()->GetPlayer();\n+\n+        if (!owner->HaveBot())\n+        {\n+            handler->SendSysMessage(\".npcbot recall teleport\");\n+            handler->SendSysMessage(\"Forces all your npcbots to teleport to your position\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+        if (!owner->IsAlive())\n+        {\n+            handler->GetSession()->SendNotification(\"You are dead\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+        if (owner->GetBotMgr()->GetBotsHidden())\n+        {\n+            handler->GetSession()->SendNotification(\"You can't do that while bots are hidden\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+        if (owner->GetBotMgr()->IsPartyInCombat(true))\n+        {\n+            handler->GetSession()->SendNotification(\"You can't do that while in PvP combat\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        owner->GetBotMgr()->RecallAllBots(true);\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotToggleFlagsCommand(ChatHandler* handler, Optional<uint32> flag)\n+    {\n+        Player* chr = handler->GetSession()->GetPlayer();\n+        Unit* unit = chr->GetSelectedUnit();\n+        if (!unit || !unit->IsCreature() || !flag)\n+        {\n+            handler->SendSysMessage(\".npcbot toggle flags #flag\");\n+            handler->SendSysMessage(\"This is a debug command\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        uint32 setFlags = 0;\n+        switch (*flag)\n+        {\n+            case 6:\n+                setFlags = UNIT_FLAG_UNK_6;\n+                break;\n+            case 14:\n+                setFlags = UNIT_FLAG_CANNOT_SWIM;\n+                break;\n+            case 15:\n+                setFlags = UNIT_FLAG_CAN_SWIM;\n+                break;\n+            case 16:\n+                setFlags = UNIT_FLAG_NON_ATTACKABLE_2;\n+                break;\n+            default:\n+                break;\n+        }\n+\n+        if (!setFlags)\n+            return false;\n+\n+        handler->PSendSysMessage(\"Toggling flag %u on %s\", setFlags, unit->GetName());\n+        unit->ToggleFlag(UNIT_FIELD_FLAGS, setFlags);\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotSetFactionCommand(ChatHandler* handler, Optional<std::string> factionStr)\n+    {\n+        Player* chr = handler->GetSession()->GetPlayer();\n+        Unit* ubot = chr->GetSelectedUnit();\n+        if (!ubot || !factionStr)\n+        {\n+            handler->SendSysMessage(\".npcbot set faction #faction\");\n+            handler->SendSysMessage(\"Sets faction for selected npcbot (saved in DB)\");\n+            handler->SendSysMessage(\"Use 'a', 'h', 'm' or 'f' as argument to set faction to alliance, horde, monsters (hostile to all) or friends (friendly to all)\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        Creature* bot = ubot->ToCreature();\n+        if (!bot || !bot->IsNPCBot() || !bot->IsFreeBot())\n+        {\n+            handler->SendSysMessage(\"You must select uncontrolled npcbot\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        uint32 factionId = 0;\n+\n+        if ((*factionStr)[0] == 'a')\n+            factionId = 1802; //Alliance\n+        else if ((*factionStr)[0] == 'h')\n+            factionId = 1801; //Horde\n+        else if ((*factionStr)[0] == 'm')\n+            factionId = FACTION_TEMPLATE_NEUTRAL_HOSTILE; //Monsters\n+        else if ((*factionStr)[0] == 'f')\n+            factionId = 35; //Friendly to all\n+\n+        if (!factionId)\n+        {\n+            char* pfactionid = handler->extractKeyFromLink((char*)factionStr->c_str(), \"Hfaction\");\n+            factionId = atoi(pfactionid);\n+        }\n+\n+        if (!sFactionTemplateStore.LookupEntry(factionId))\n+        {\n+            handler->PSendSysMessage(LANG_WRONG_FACTION, factionId);\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        BotDataMgr::UpdateNpcBotData(bot->GetEntry(), NPCBOT_UPDATE_FACTION, &factionId);\n+        bot->GetBotAI()->ReInitFaction();\n+\n+        handler->PSendSysMessage(\"%s's faction set to %u\", bot->GetName(), factionId);\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotSetOwnerCommand(ChatHandler* handler, Optional<std::string> charVal)\n+    {\n+        Player* chr = handler->GetSession()->GetPlayer();\n+        Unit* ubot = chr->GetSelectedUnit();\n+        if (!ubot || !charVal)\n+        {\n+            handler->SendSysMessage(\".npcbot set owner #guid | #name\");\n+            handler->SendSysMessage(\"Binds selected npcbot to new player owner using guid or name and updates owner in DB\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        Creature* bot = ubot->ToCreature();\n+        if (!bot || !bot->IsNPCBot() || bot->GetBotAI()->IsWanderer())\n+        {\n+            handler->SendSysMessage(\"You must select a non-wandering npcbot\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        if (bot->GetBotAI()->GetBotOwnerGuid())\n+        {\n+            handler->SendSysMessage(\"This npcbot already has owner\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        if (!charVal || charVal->empty())\n+            return false;\n+\n+        Optional<uint32> guidlow = Bcore::StringTo<uint32>({ *charVal });\n+        std::string characterName = std::move(*charVal);\n+\n+        bool found = true;\n+        if (guidlow)\n+            found = sCharacterCache->GetCharacterNameByGuid(ObjectGuid::Create<HighGuid::Player>(*guidlow), characterName);\n+        else\n+            guidlow = sCharacterCache->GetCharacterGuidByName(characterName).GetCounter();\n+\n+        if (!guidlow || !found)\n+        {\n+            handler->SendSysMessage(\"Player not found\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        BotDataMgr::UpdateNpcBotData(bot->GetEntry(), NPCBOT_UPDATE_OWNER, &guidlow);\n+        NpcBotData const* bot_data = BotDataMgr::SelectNpcBotData(bot->GetEntry());\n+        if (bot_data->shared_owners.contains(*guidlow))\n+        {\n+            NpcBotData::SharedOwnersContainer shared_owners_new = bot_data->shared_owners; //copy\n+            shared_owners_new.erase(*guidlow);\n+            BotDataMgr::UpdateNpcBotData(bot->GetEntry(), NPCBOT_UPDATE_SHARED_OWNERS, &shared_owners_new);\n+        }\n+\n+        handler->PSendSysMessage(\"%s's new owner is %s (guidlow: %u)\", bot->GetName(), characterName, *guidlow);\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotSetSpecCommand(ChatHandler* handler, Optional<uint8> spec)\n+    {\n+        Player* chr = handler->GetSession()->GetPlayer();\n+        Unit* ubot = chr->GetSelectedUnit();\n+        if (!ubot || !spec)\n+        {\n+            handler->SendSysMessage(\".npcbot set spec #specnumber\");\n+            handler->SendSysMessage(\"Changes talent spec for selected npcbot\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        Creature* bot = ubot->ToCreature();\n+        if (!bot || !bot->IsNPCBot())\n+        {\n+            handler->SendSysMessage(\"You must select a npcbot\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        if (!bot_ai::IsValidSpecForClass(bot->GetBotClass(), *spec))\n+        {\n+            handler->PSendSysMessage(\"%s is not a valid spec for bot class %u!\",\n+                bot_ai::LocalizedNpcText(chr, bot_ai::TextForSpec(*spec)), uint32(bot->GetBotClass()));\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        bot->GetBotAI()->SetSpec(*spec);\n+\n+        handler->PSendSysMessage(\"%s's new spec is %u\", bot->GetName(), uint32(*spec));\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotLookupCommand(ChatHandler* handler, Optional<uint8> botclass, Optional <bool> unspawned, Optional<uint8> teamid)\n+    {\n+        //this is just a modified '.lookup creature' command\n+        if (!botclass)\n+        {\n+            handler->SendSysMessage(\".npcbot lookup #class #[not_spawned_only] #[team_id]\");\n+            handler->SendSysMessage(\"Looks up npcbots by #class, and returns all matches with their creature ID's\");\n+            handler->SendSysMessage(\"If #not_spawned_only is set to 1 shows only bots which don't exist in world\");\n+            handler->SendSysMessage(\"If #team_id is provided, will also filter by team: Alliance = 0, Horde = 1, Neutral = 2\");\n+            handler->PSendSysMessage(\"BOT_CLASS_WARRIOR = %u\", uint32(BOT_CLASS_WARRIOR));\n+            handler->PSendSysMessage(\"BOT_CLASS_PALADIN = %u\", uint32(BOT_CLASS_PALADIN));\n+            handler->PSendSysMessage(\"BOT_CLASS_HUNTER = %u\", uint32(BOT_CLASS_HUNTER));\n+            handler->PSendSysMessage(\"BOT_CLASS_ROGUE = %u\", uint32(BOT_CLASS_ROGUE));\n+            handler->PSendSysMessage(\"BOT_CLASS_PRIEST = %u\", uint32(BOT_CLASS_PRIEST));\n+            handler->PSendSysMessage(\"BOT_CLASS_DEATH_KNIGHT = %u\", uint32(BOT_CLASS_DEATH_KNIGHT));\n+            handler->PSendSysMessage(\"BOT_CLASS_SHAMAN = %u\", uint32(BOT_CLASS_SHAMAN));\n+            handler->PSendSysMessage(\"BOT_CLASS_MAGE = %u\", uint32(BOT_CLASS_MAGE));\n+            handler->PSendSysMessage(\"BOT_CLASS_WARLOCK = %u\", uint32(BOT_CLASS_WARLOCK));\n+            handler->PSendSysMessage(\"BOT_CLASS_DRUID = %u\", uint32(BOT_CLASS_DRUID));\n+            handler->PSendSysMessage(\"BOT_CLASS_BLADEMASTER = %u\", uint32(BOT_CLASS_BM));\n+            handler->PSendSysMessage(\"BOT_CLASS_SPHYNX = %u\", uint32(BOT_CLASS_SPHYNX));\n+            handler->PSendSysMessage(\"BOT_CLASS_ARCHMAGE = %u\", uint32(BOT_CLASS_ARCHMAGE));\n+            handler->PSendSysMessage(\"BOT_CLASS_DREADLORD = %u\", uint32(BOT_CLASS_DREADLORD));\n+            handler->PSendSysMessage(\"BOT_CLASS_SPELLBREAKER = %u\", uint32(BOT_CLASS_SPELLBREAKER));\n+            handler->PSendSysMessage(\"BOT_CLASS_DARK_RANGER = %u\", uint32(BOT_CLASS_DARK_RANGER));\n+            handler->PSendSysMessage(\"BOT_CLASS_NECROMANCER = %u\", uint32(BOT_CLASS_NECROMANCER));\n+            handler->PSendSysMessage(\"BOT_CLASS_SEA_WITCH = %u\", uint32(BOT_CLASS_SEA_WITCH));\n+            handler->PSendSysMessage(\"BOT_CLASS_CRYPT_LORD = %u\", uint32(BOT_CLASS_CRYPT_LORD));\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        if (botclass == BOT_CLASS_NONE || botclass >= BOT_CLASS_END)\n+        {\n+            handler->PSendSysMessage(\"Unknown bot class %u\", uint32(*botclass));\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        if (teamid && *teamid > uint8(TEAM_NEUTRAL))\n+        {\n+            handler->PSendSysMessage(\"Unknown team %u\", uint32(*teamid));\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        handler->PSendSysMessage(\"Looking for bots of class %u...\", uint32(*botclass));\n+\n+        uint8 localeIndex = handler->GetSessionDbLocaleIndex();\n+        using BotList = std::vector<BotInfo>;\n+        BotList botlist;\n+        for (const auto& [id, ct] : sObjectMgr->GetCreatureTemplates())\n+        {\n+            if (id == BOT_ENTRY_MIRROR_IMAGE_BM)\n+                continue;\n+\n+            NpcBotExtras const* _botExtras = BotDataMgr::SelectNpcBotExtras(id);\n+            if (!_botExtras || _botExtras->bclass != botclass)\n+                continue;\n+\n+            if (unspawned && *unspawned && BotDataMgr::SelectNpcBotData(id))\n+                continue;\n+\n+            uint8 race = _botExtras->race;\n+\n+            if (teamid)\n+            {\n+                uint32 faction = BotDataMgr::GetDefaultFactionForBotRaceClass(_botExtras->bclass, race);\n+                TeamId team = BotDataMgr::GetTeamIdForFaction(faction);\n+\n+                if (*teamid != uint8(team))\n+                    continue;\n+            }\n+\n+            if (CreatureLocale const* creatureLocale = sObjectMgr->GetCreatureLocale(id))\n+            {\n+                if (creatureLocale->Name.size() > localeIndex && !creatureLocale->Name[localeIndex].empty())\n+                {\n+                    botlist.emplace_back(id, std::string_view{ creatureLocale->Name[localeIndex] }, race);\n+                    continue;\n+                }\n+            }\n+\n+            if (ct.Name.empty())\n+                continue;\n+\n+            botlist.emplace_back(id, std::string_view{ ct.Name }, race);\n+        }\n+\n+        if (botlist.empty())\n+        {\n+            handler->SendSysMessage(LANG_COMMAND_NOCREATUREFOUND);\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        std::ranges::sort(botlist);\n+\n+        for (BotInfo const& bot_info : botlist)\n+        {\n+            uint8 race = bot_info.race;\n+            if (race >= MAX_RACES)\n+                race = RACE_NONE;\n+\n+            std::string_view raceName;\n+            switch (race)\n+            {\n+                case RACE_HUMAN:        raceName = \"Human\";     break;\n+                case RACE_ORC:          raceName = \"Orc\";       break;\n+                case RACE_DWARF:        raceName = \"Dwarf\";     break;\n+                case RACE_NIGHTELF:     raceName = \"Night Elf\"; break;\n+                case RACE_UNDEAD_PLAYER:raceName = \"Forsaken\";  break;\n+                case RACE_TAUREN:       raceName = \"Tauren\";    break;\n+                case RACE_GNOME:        raceName = \"Gnome\";     break;\n+                case RACE_TROLL:        raceName = \"Troll\";     break;\n+                case RACE_BLOODELF:     raceName = \"Blood Elf\"; break;\n+                case RACE_DRAENEI:      raceName = \"Draenei\";   break;\n+                case RACE_NONE:         raceName = \"No Race\";   break;\n+                default:                raceName = \"Unknown\";   break;\n+            }\n+\n+            handler->PSendSysMessage(\"%d - |cffffffff|Hcreature_entry:%d|h[%s]|h|r %s\", bot_info.id, bot_info.id, bot_info.name, raceName);\n+        }\n+\n+        return true;\n+    }\n+\n+    static bool HandeNpcBotCleanUpAndRemoval(ChatHandler* handler, Creature* bot, Player const* chr/* = nullptr*/)\n+    {\n+        Player const* botowner = bot->GetBotOwner()->ToPlayer();\n+\n+        if (bot->GetBotAI()->HasRealEquipment())\n+        {\n+            ObjectGuid receiver =\n+                botowner ? botowner->GetGUID() :\n+                bot->GetBotAI()->GetBotOwnerGuid() != 0 ? ObjectGuid::Create<HighGuid::Player>(bot->GetBotAI()->GetBotOwnerGuid()) :\n+                chr ? chr->GetGUID() : ObjectGuid::Empty;\n+\n+            if (!botowner && chr && receiver != chr->GetGUID() && !sCharacterCache->HasCharacterCacheEntry(receiver))\n+                receiver = chr->GetGUID();\n+\n+            if (receiver == ObjectGuid::Empty)\n+            {\n+                handler->PSendSysMessage(\"Cannot delete bot %s from console: has gear but no player to give it back to! Can only delete this bot in-game.\", bot->GetName());\n+                return false;\n+            }\n+            if (bot->GetBotAI()->UnEquipAll(receiver, false) != BotEquipResult::BOT_EQUIP_RESULT_OK)\n+            {\n+                handler->PSendSysMessage(\"%s is unable to unequip some gear. Please remove equips manually first!\", bot->GetName());\n+                return false;\n+            }\n+        }\n+\n+        if (botowner)\n+            botowner->GetBotMgr()->RemoveBot(bot->GetGUID(), BOT_REMOVE_DISMISS);\n+\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotFreeCommand(ChatHandler* handler)\n+    {\n+        Player* chr = handler->GetSession()->GetPlayer();\n+        Unit* ubot = chr->GetSelectedUnit();\n+        if (!ubot)\n+        {\n+            handler->SendSysMessage(\".npcbot free\");\n+            handler->SendSysMessage(\"Immediately cancels selected npcbot's ownership\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        Creature* bot = ubot->ToCreature();\n+        if (!bot || !bot->IsNPCBot() || !bot->GetBotAI()->GetBotOwnerGuid() || bot->IsTempBot())\n+        {\n+            handler->SendSysMessage(\"No owned npcbot selected\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        uint32 owner_guid = bot->GetBotAI()->GetBotOwnerGuid();\n+        Player const* botowner = bot->GetBotOwner()->ToPlayer();\n+        if (!HandeNpcBotCleanUpAndRemoval(handler, bot, chr))\n+        {\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        uint8 spec = bot_ai::SelectSpecForClass(bot->GetBotClass());\n+        BotDataMgr::UpdateNpcBotData(bot->GetEntry(), NPCBOT_UPDATE_SPEC, &spec);\n+        uint32 roleMask = bot_ai::DefaultRolesForClass(bot->GetBotClass(), spec);\n+        BotDataMgr::UpdateNpcBotData(bot->GetEntry(), NPCBOT_UPDATE_ROLES, &roleMask);\n+\n+        if (!botowner)\n+        {\n+            uint32 newOwner = 0;\n+            BotDataMgr::UpdateNpcBotData(bot->GetEntry(), NPCBOT_UPDATE_OWNER, &newOwner);\n+            NpcBotData::SharedOwnersContainer sharedOwners{};\n+            BotDataMgr::UpdateNpcBotData(bot->GetEntry(), NPCBOT_UPDATE_SHARED_OWNERS, &sharedOwners);\n+\n+            if (Group* gr = bot->GetBotGroup())\n+                gr->RemoveMember(bot->GetGUID());\n+\n+            bot->GetBotAI()->ResetBotAI(BOTAI_RESET_DISMISS);\n+        }\n+\n+        handler->PSendSysMessage(\"Npcbot %s successfully freed, owner was %u\", bot->GetName(), owner_guid);\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotDeleteCommand(ChatHandler* handler)\n+    {\n+        Player* chr = handler->GetSession()->GetPlayer();\n+        Unit* ubot = chr->GetSelectedUnit();\n+        if (!ubot)\n+        {\n+            handler->SendSysMessage(\".npcbot delete\");\n+            handler->SendSysMessage(\"Deletes selected npcbot spawn from world and DB\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        Creature* bot = ubot->ToCreature();\n+        if (!bot || !bot->IsNPCBot())\n+        {\n+            handler->SendSysMessage(\"No npcbot selected\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        if (bot->GetBotAI()->IsWanderer())\n+        {\n+            BotDataMgr::DespawnWandererBot(bot->GetEntry());\n+            handler->PSendSysMessage(\"Wandering bot %u '%s' successfully deleted\", bot->GetEntry(), bot->GetName());\n+            return true;\n+        }\n+\n+        if (!HandeNpcBotCleanUpAndRemoval(handler, bot, chr))\n+        {\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        bot->CombatStop();\n+        bot->GetBotAI()->Reset();\n+        bot->GetBotAI()->canUpdate = false;\n+\n+        CreatureData const* data = ASSERT_NOTNULL(sObjectMgr->GetCreatureData(bot->GetSpawnId()));\n+        if (bot->IsInWorld() && data->mapId != bot->GetMap()->GetId())\n+            bot->GetMap()->AddObjectToRemoveList(bot);\n+\n+        Creature::DeleteFromDB(bot->GetSpawnId());\n+\n+        BotDataMgr::UpdateNpcBotData(bot->GetEntry(), NPCBOT_UPDATE_ERASE);\n+\n+        handler->PSendSysMessage(\"Npcbot %s successfully deleted\", bot->GetName());\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotDeleteByIdCommand(ChatHandler* handler, Optional<uint32> creature_id)\n+    {\n+        if (!creature_id)\n+        {\n+            handler->SendSysMessage(\".npcbot delete id\");\n+            handler->SendSysMessage(\"Deletes npcbot spawn from world and DB using creature id\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        Creature const* bot = BotDataMgr::FindBot(*creature_id);\n+        if (!bot)\n+        {\n+            handler->PSendSysMessage(\"npcbot %u not found!\", *creature_id);\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        if (bot->GetBotAI()->IsWanderer())\n+        {\n+            BotDataMgr::DespawnWandererBot(bot->GetEntry());\n+            handler->PSendSysMessage(\"Wandering bot %u '%s' successfully deleted\", bot->GetEntry(), bot->GetName());\n+            return true;\n+        }\n+\n+        Player* chr = !handler->IsConsole() ? handler->GetSession()->GetPlayer() : nullptr;\n+\n+        if (!HandeNpcBotCleanUpAndRemoval(handler, const_cast<Creature*>(bot), chr))\n+        {\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        const_cast<Creature*>(bot)->CombatStop();\n+        bot->GetBotAI()->Reset();\n+        bot->GetBotAI()->canUpdate = false;\n+\n+        CreatureData const* data = ASSERT_NOTNULL(sObjectMgr->GetCreatureData(bot->GetSpawnId()));\n+        if (bot->IsInWorld() && data->mapId != bot->GetMap()->GetId())\n+            bot->GetMap()->AddObjectToRemoveList(const_cast<Creature*>(bot));\n+\n+        Creature::DeleteFromDB(bot->GetSpawnId());\n+\n+        BotDataMgr::UpdateNpcBotData(bot->GetEntry(), NPCBOT_UPDATE_ERASE);\n+\n+        handler->PSendSysMessage(\"Npcbot %s successfully deleted\", bot->GetName());\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotDeleteFreeCommand(ChatHandler* handler)\n+    {\n+        uint32 count = 0;\n+        for (uint32 creature_id : BotDataMgr::GetExistingNPCBotIds())\n+            if (NpcBotData const* botData = BotDataMgr::SelectNpcBotData(creature_id))\n+                if (botData->owner == 0)\n+                    if (HandleNpcBotDeleteByIdCommand(handler, creature_id))\n+                        ++count;\n+\n+        handler->PSendSysMessage(\"%u free npcbots deleted\", count);\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotMoveCommand(ChatHandler* handler, Optional<std::string> creVal)\n+    {\n+        Player* player = handler->GetSession()->GetPlayer();\n+        Creature* creature = handler->getSelectedCreature();\n+\n+        if ((!creature && !creVal) || player->GetMap()->Instanceable())\n+        {\n+            handler->SendSysMessage(\".npcbot move\");\n+            handler->SendSysMessage(\"Moves npcbot to your location. World maps only\");\n+            handler->SendSysMessage(\"Syntax: .npcbot move [#ID]\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        char* charID = creVal ? handler->extractKeyFromLink((char*)creVal->c_str(), \"Hcreature_entry\") : nullptr;\n+        if (!charID && !creature)\n+            return false;\n+\n+        uint32 id = charID ? atoi(charID) : creature->GetEntry();\n+\n+        CreatureTemplate const* creInfo = sObjectMgr->GetCreatureTemplate(id);\n+        if (!creInfo)\n+        {\n+            handler->PSendSysMessage(\"creature id %u does not exist!\", id);\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        if (!creInfo->IsNPCBot())\n+        {\n+            handler->PSendSysMessage(\"creature id %u is not a npcbot!\", id);\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        if (!BotDataMgr::SelectNpcBotData(id))\n+        {\n+            handler->PSendSysMessage(\"NpcBot %u is not spawned!\", id);\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        Creature const* bot = BotDataMgr::FindBot(id);\n+        ASSERT(bot);\n+\n+        uint32 lowguid = bot->GetSpawnId();\n+\n+        CreatureData const* data = sObjectMgr->GetCreatureData(lowguid);\n+        if (!data)\n+        {\n+            handler->PSendSysMessage(LANG_COMMAND_CREATGUIDNOTFOUND, lowguid);\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        CreatureData* cdata = const_cast<CreatureData*>(data);\n+        cdata->spawnPoint.Relocate(player);\n+        cdata->spawnPoint.SetOrientation(player->GetOrientation());\n+        cdata->mapId = player->GetMapId();\n+\n+        WorldDatabase.PExecute(\n+            \"UPDATE creature SET position_x = {}, position_y = {}, position_z = {}, orientation = {}, map = {} WHERE guid = {}\",\n+            cdata->spawnPoint.GetPositionX(), cdata->spawnPoint.GetPositionY(), cdata->spawnPoint.GetPositionZ(), cdata->spawnPoint.GetOrientation(), uint32(cdata->mapId), lowguid);\n+\n+        if (bot->GetBotAI()->IAmFree() && bot->IsInWorld() && !bot->IsInCombat() && bot->IsAlive())\n+            BotMgr::TeleportBot(const_cast<Creature*>(bot), player->GetMap(), player);\n+\n+        handler->PSendSysMessage(\"NpcBot %u (guid %u) was moved\", id, lowguid);\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotCreateNewCommand(ChatHandler* handler, Optional<std::string> name, Optional<uint8> bclass, Optional<uint8> race, Optional<uint8> gender, Optional<uint8> skin, Optional<uint8> face, Optional<uint8> hairstyle, Optional<uint8> haircolor, Optional<uint8> features, Optional<uint8> soundset)\n+    {\n+        static auto const ret_err = [](ChatHandler* handler, bool report_ranges = false) {\n+            if (report_ranges)\n+                ReportVisualRanges(handler);\n+            else\n+            {\n+                handler->SendSysMessage(\".npcbot createnew\");\n+                handler->SendSysMessage(\"Creates a new npcbot creature entry\");\n+                handler->SendSysMessage(\"Syntax: .npcbot createnew #name #class ##race ##gender ##skin ##face ##hairstyle ##haircolor ##features ##[sound_variant = {1,2,3}]\");\n+                handler->SendSysMessage(\"In case of class that cannot change appearance all extra arguments must be omitted\");\n+                handler->SendSysMessage(\"Use '.npcbot createnew ranges' to print visuals constraints for all races\");\n+            }\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        };\n+        static auto const ret_err_invalid_arg = [](ChatHandler* handler, char const* argname, Optional<uint8> argval = {}) {\n+            handler->PSendSysMessage(\"Invalid %s%s!\", argname, argval ? (\" \" + std::to_string(*argval)) : \"\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        };\n+        static auto const ret_err_invalid_args_for = [](ChatHandler* handler, char const* argname1, char const* argname2) {\n+            handler->PSendSysMessage(\"Invalid arguments for %s '%s'!\", argname1, argname2);\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        };\n+\n+        if (!bclass || !name)\n+            return ret_err(handler, name && *name == \"ranges\");\n+\n+        for (std::size_t i{}; i < name->size(); ++i)\n+            if ((*name)[i] == '_')\n+                (*name)[i] = ' ';\n+\n+        bool const can_change_appearance = (*bclass < BOT_CLASS_EX_START || *bclass == BOT_CLASS_ARCHMAGE);\n+\n+        if (can_change_appearance && (!race || !gender || !skin || !face || !hairstyle || !haircolor || !features))\n+            return ret_err(handler);\n+        if (!can_change_appearance && (race || gender || skin || face || hairstyle || haircolor || features))\n+            return ret_err(handler);\n+        if (soundset && (*soundset < 1 || *soundset > SOUND_SETS_COUNT))\n+            return ret_err(handler);\n+\n+        if (*bclass >= BOT_CLASS_END || (*bclass < BOT_CLASS_EX_START && !((1u << (*bclass - 1)) & CLASSMASK_ALL_PLAYABLE)))\n+            return ret_err_invalid_arg(handler, \"class\", bclass);\n+\n+        std::string namestr;\n+        if (!consoleToUtf8(*name, namestr))\n+            return ret_err_invalid_arg(handler, \"name\");\n+        if (!normalizePlayerName(namestr))\n+            return ret_err_invalid_arg(handler, \"name\");\n+\n+        if (race && !((1u << (*race - 1)) & RACEMASK_ALL_PLAYABLE))\n+            return ret_err_invalid_arg(handler, \"race\", race);\n+\n+        if (can_change_appearance && *gender != GENDER_MALE && *gender != GENDER_FEMALE)\n+            return ret_err_invalid_arg(handler, \"gender\", gender);\n+\n+        // class / race combination check\n+        if ((*bclass < BOT_CLASS_EX_START && !sObjectMgr->GetPlayerInfo(*race, *bclass)) ||\n+            (*bclass == BOT_CLASS_ARCHMAGE && *race != RACE_HUMAN))\n+            return ret_err_invalid_args_for(handler, \"class\", GetClassName(*bclass, handler->GetSessionDbcLocale()));\n+\n+        if (can_change_appearance && !IsValidVisual(*race, *gender, *skin, *face, *hairstyle, *haircolor, *features))\n+            return ret_err_invalid_args_for(handler, \"race\", GetRaceName(*race, handler->GetSessionDbcLocale()));\n+\n+        //here we force races for custom classes\n+        switch (*bclass)\n+        {\n+            case BOT_CLASS_BM:\n+            case BOT_CLASS_SPHYNX:\n+            case BOT_CLASS_DREADLORD:\n+            case BOT_CLASS_SPELLBREAKER:\n+            case BOT_CLASS_CRYPT_LORD:\n+                race = 15; //RACE_SKELETON\n+                break;\n+            case BOT_CLASS_NECROMANCER:\n+                race = RACE_HUMAN;\n+                break;\n+            case BOT_CLASS_DARK_RANGER:\n+                race = RACE_BLOODELF;\n+                break;\n+            case BOT_CLASS_SEA_WITCH:\n+                race = 13; //RACE_NAGA\n+                break;\n+        }\n+\n+        //get normalized modelID\n+        uint32 modelId = can_change_appearance ? SoundSetModelsArray[RaceToRaceOffset[*race]][*gender][soundset ? *soundset - 1 : urand(0u, 2u)] : 0;\n+\n+        uint32 newentry = 0;\n+        QueryResult creres = WorldDatabase.PQuery(\"SELECT entry FROM creature_template WHERE entry = {}\", BOT_ENTRY_CREATE_BEGIN);\n+        if (!creres)\n+            newentry = BOT_ENTRY_CREATE_BEGIN;\n+        else\n+        {\n+            creres = WorldDatabase.PQuery(\"SELECT MIN(entry) FROM creature_template WHERE entry >= {} AND entry IN (SELECT entry FROM creature_template) AND entry+1 NOT IN (SELECT entry FROM creature_template)\", BOT_ENTRY_CREATE_BEGIN);\n+            ASSERT(creres);\n+            Field* field = creres->Fetch();\n+            newentry = field[0].GetUInt32() + 1;\n+        }\n+\n+        WorldDatabaseTransaction trans = WorldDatabase.BeginTransaction();\n+        trans->Append(\"DROP TEMPORARY TABLE IF EXISTS creature_template_temp_npcbot_create\");\n+        trans->PAppend(\"CREATE TEMPORARY TABLE creature_template_temp_npcbot_create ENGINE=MEMORY SELECT * FROM creature_template WHERE entry = (SELECT entry FROM creature_template_npcbot_extras WHERE class = {} LIMIT 1)\", uint32(*bclass));\n+        trans->PAppend(\"UPDATE creature_template_temp_npcbot_create SET entry = {}\", newentry);\n+        if (modelId)\n+            trans->PAppend(\"UPDATE creature_template_temp_npcbot_create SET modelid1 = {}\", modelId);\n+        trans->Append(\"INSERT INTO creature_template SELECT * FROM creature_template_temp_npcbot_create\");\n+        WorldDatabasePreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_UPD_NPCBOT_NAME);\n+        stmt->setString(0, namestr);\n+        stmt->setUInt32(1, newentry);\n+        trans->Append(stmt);\n+        trans->Append(\"DROP TEMPORARY TABLE creature_template_temp_npcbot_create\");\n+        trans->PAppend(\"REPLACE INTO creature_template_npcbot_extras VALUES ({}, {}, {})\", newentry, uint32(*bclass), uint32(*race));\n+        trans->PAppend(\"REPLACE INTO creature_equip_template SELECT {}, 1, ids.itemID1, ids.itemID2, ids.itemID3, -1 FROM (SELECT itemID1, itemID2, itemID3 FROM creature_equip_template WHERE CreatureID = (SELECT entry FROM creature_template_npcbot_extras WHERE class = {} LIMIT 1)) ids\", newentry, uint32(*bclass));\n+        if (can_change_appearance)\n+        {\n+            stmt = WorldDatabase.GetPreparedStatement(WORLD_REP_NPCBOT_APPEARANCE);\n+            stmt->setUInt32(0, newentry);\n+            stmt->setString(1, namestr);\n+            stmt->setUInt32(2, uint32(*gender));\n+            stmt->setUInt32(3, uint32(*skin));\n+            stmt->setUInt32(4, uint32(*face));\n+            stmt->setUInt32(5, uint32(*hairstyle));\n+            stmt->setUInt32(6, uint32(*haircolor));\n+            stmt->setUInt32(7, uint32(*features));\n+            trans->Append(stmt);\n+        }\n+        WorldDatabase.DirectCommitTransaction(trans);\n+\n+        handler->PSendSysMessage(\"New NPCBot %s (class %u) is created with entry %u and will be available for spawning after server restart.\", namestr, uint32(*bclass), newentry);\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotSpawnCommand(ChatHandler* handler, Optional<std::string> creVal)\n+    {\n+        if (!creVal)\n+        {\n+            handler->SendSysMessage(\".npcbot spawn\");\n+            handler->SendSysMessage(\"Adds new npcbot spawn of given entry in world. You can shift-link the npc\");\n+            handler->SendSysMessage(\"Syntax: .npcbot spawn #entry\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        char* charID = handler->extractKeyFromLink((char*)creVal->c_str(), \"Hcreature_entry\");\n+        if (!charID)\n+            return false;\n+\n+        uint32 id = uint32(atoi(charID));\n+\n+        CreatureTemplate const* creInfo = sObjectMgr->GetCreatureTemplate(id);\n+\n+        if (!creInfo)\n+        {\n+            handler->PSendSysMessage(\"creature %u does not exist!\", id);\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        if (!creInfo->IsNPCBot())\n+        {\n+            handler->PSendSysMessage(\"creature %u is not a npcbot!\", id);\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        if (id == BOT_ENTRY_MIRROR_IMAGE_BM)\n+        {\n+            handler->PSendSysMessage(\"creature %u is a mirror image and cannot be spawned!\", id);\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        if (BotDataMgr::SelectNpcBotData(id))\n+        {\n+            handler->PSendSysMessage(\"Npcbot %u already exists in `characters_npcbot` table!\", id);\n+            handler->SendSysMessage(\"If you want to move this bot to a new location use '.npcbot move' command\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        WorldDatabasePreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_SEL_CREATURE_BY_ID);\n+        //\"SELECT guid FROM creature WHERE id = ?\", CONNECTION_SYNCH\n+        stmt->setUInt32(0, id);\n+        PreparedQueryResult res2 = WorldDatabase.Query(stmt);\n+        if (res2)\n+        {\n+            handler->PSendSysMessage(\"Npcbot %u already exists in `creature` table!\", id);\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        Player* chr = handler->GetSession()->GetPlayer();\n+\n+        if (/*Transport* trans = */chr->GetTransport())\n+        {\n+            handler->SendSysMessage(\"Cannot spawn bots on transport!\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        //float x = chr->GetPositionX();\n+        //float y = chr->GetPositionY();\n+        //float z = chr->GetPositionZ();\n+        //float o = chr->GetOrientation();\n+        Map* map = chr->GetMap();\n+\n+        if (map->Instanceable())\n+        {\n+            handler->SendSysMessage(\"Cannot spawn bots in instances!\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        Creature* creature = new Creature();\n+        if (!creature->Create(map->GenerateLowGuid<HighGuid::Unit>(), map, chr->GetPhaseMaskForSpawn(), id, *chr))\n+        {\n+            delete creature;\n+            handler->SendSysMessage(\"Creature is not created!\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        NpcBotExtras const* _botExtras = BotDataMgr::SelectNpcBotExtras(id);\n+        if (!_botExtras)\n+        {\n+            delete creature;\n+            handler->PSendSysMessage(\"No class/race data found for bot %u!\", id);\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        uint8 bot_spec = bot_ai::SelectSpecForClass(_botExtras->bclass);\n+        BotDataMgr::AddNpcBotData(id, bot_ai::DefaultRolesForClass(_botExtras->bclass, bot_spec), bot_spec, creature->GetCreatureTemplate()->faction);\n+\n+        creature->SaveToDB(map->GetId(), (uint8(1) << map->GetSpawnMode()), chr->GetPhaseMaskForSpawn());\n+\n+        uint32 db_guid = creature->GetSpawnId();\n+        if (!creature->LoadBotCreatureFromDB(db_guid, map))\n+        {\n+            delete creature;\n+            handler->SendSysMessage(\"Cannot load npcbot from DB!\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        sObjectMgr->AddCreatureToGrid(db_guid, sObjectMgr->GetCreatureData(db_guid));\n+\n+        handler->SendSysMessage(\"NpcBot successfully spawned\");\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotSpawnedCommandImpl(ChatHandler* handler, Optional<std::string> area_str, Optional<std::string> class_str, Optional<uint32> level_min, Optional<uint32> level_max, bool is_free)\n+    {\n+        std::shared_lock lock(*BotDataMgr::GetLock());\n+        NpcBotRegistry const& all_bots = BotDataMgr::GetExistingNPCBots();\n+        std::vector<NpcBotRegistry::value_type> found_bots;\n+        found_bots.reserve(all_bots.size());\n+        std::copy_if(all_bots.cbegin(), all_bots.cend(), std::back_inserter(found_bots), [=](Creature const* bot) {\n+            return !is_free || BotDataMgr::SelectNpcBotData(bot->GetEntry())->owner == 0;\n+        });\n+\n+        std::ostringstream ss;\n+        if (!found_bots.empty())\n+        {\n+            if (area_str)\n+                std::ranges::transform(*area_str, area_str->begin(), ::toupper);\n+            if (class_str)\n+                std::ranges::transform(*class_str, class_str->begin(), ::toupper);\n+\n+            std::vector<std::string> matched_bots;\n+            matched_bots.reserve(found_bots.size());\n+            uint32 counter = 0;\n+            std::ostringstream bss;\n+            for (Creature const* bot : found_bots)\n+            {\n+                auto const& [bot_color_str, bot_class_str] = BotColors.at(bot->GetBotClass());\n+\n+                AreaTableEntry const* zone = sAreaTableStore.LookupEntry(bot->GetBotAI()->GetLastZoneId() ? bot->GetBotAI()->GetLastZoneId() : bot->GetZoneId());\n+                std::string zone_name = zone ? zone->AreaName[handler->GetSession() ? handler->GetSessionDbLocaleIndex() : 0] : \"Unknown\";\n+\n+                std::string zone_name_upper;\n+                if (area_str)\n+                {\n+                    zone_name_upper = zone_name;\n+                    std::ranges::transform(zone_name_upper, zone_name_upper.begin(), ::toupper);\n+                }\n+\n+                std::string bot_class_upper;\n+                if (class_str)\n+                {\n+                    bot_class_upper = bot_class_str;\n+                    std::ranges::transform(bot_class_upper, bot_class_upper.begin(), ::toupper);\n+                }\n+\n+                if ((!area_str || zone_name_upper.find(*area_str) != std::string::npos) &&\n+                    (!class_str || bot_class_upper.find(*class_str) != std::string::npos) &&\n+                    (!level_min || bot->GetLevel() >= *level_min) &&\n+                    (!level_max || bot->GetLevel() <= *level_max))\n+                {\n+                    bss.clear();\n+                    bss.str(\"\");\n+\n+                    ++counter;\n+                    bss << '\\n' << counter << \") \" << bot->GetEntry() << \": \"\n+                        << bot->GetName() << \" - |c\" << bot_color_str << bot_class_str << \"|r - \"\n+                        << \"level \" << uint32(bot->GetLevel()) << \" - \\\"\" << zone_name << '\"'\n+                        << (bot->GetBotAI()->HasRealEquipment() ? \" |cff00ffff(has equipment!)|r\" : \"\");\n+                    matched_bots.push_back(bss.str());\n+                }\n+            }\n+\n+            const std::string_view free_str = is_free ? \"free \" : \"\";\n+            if (matched_bots.empty())\n+                ss << \"No \" << free_str << \"bots found!\";\n+            else\n+            {\n+                ss << \"Found \" << uint32(matched_bots.size()) << ' ' << free_str << \"bots:\";\n+                for (std::string& bstr : matched_bots)\n+                    ss << std::move(bstr);\n+            }\n+        }\n+\n+        handler->SendSysMessage(ss.view());\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotSpawnedCommand(ChatHandler* handler)\n+    {\n+        return HandleNpcBotSpawnedCommandImpl(handler, {}, {}, {}, {}, false);\n+    }\n+\n+    static bool HandleNpcBotSpawnedFreeCommand(ChatHandler* handler)\n+    {\n+        return HandleNpcBotSpawnedCommandImpl(handler, {}, {}, {}, {}, true);\n+    }\n+\n+    static bool HandleNpcBotSpawnedStatsCommandImpl(ChatHandler* handler, bool is_free)\n+    {\n+        std::array<uint32, BRACKETS_COUNT> bot_levels{ 1, 10, 20, 30, 40, 50, 60, 70, 80 };\n+        std::array<uint32, BRACKETS_COUNT> bot_count_by_level{};\n+        std::array<uint32, BOT_CLASS_END> bot_count_by_class{};\n+\n+        std::shared_lock lock(*BotDataMgr::GetLock());\n+        NpcBotRegistry const& all_bots = BotDataMgr::GetExistingNPCBots();\n+        std::vector<NpcBotRegistry::value_type> found_bots;\n+        found_bots.reserve(all_bots.size());\n+        std::copy_if(all_bots.cbegin(), all_bots.cend(), std::back_inserter(found_bots), [=](Creature const* bot) {\n+            return !is_free || BotDataMgr::SelectNpcBotData(bot->GetEntry())->owner == 0;\n+        });\n+\n+        std::ostringstream ss;\n+        const std::string_view free_str = is_free ? \"free \" : \"\";\n+        if (!found_bots.empty())\n+            ss << \"No \" << free_str << \"bots found!\";\n+        else\n+        {\n+            ss << \"Found \" << uint32(found_bots.size()) << ' ' << free_str << \"bots:\";\n+\n+            for (Creature const* bot : found_bots)\n+            {\n+                uint32 bot_level = uint32(bot->GetLevel());\n+                static_assert(std::is_same_v<decltype(bot_level / 10u), decltype(bot_count_by_level)::value_type>);\n+\n+                bot_count_by_class[bot->GetBotClass()]++;\n+                bot_count_by_level[std::min<uint32>(bot_level / 10u, bot_count_by_level.size() - 1)]++;\n+            }\n+\n+            for (std::size_t i{}; i < bot_count_by_class.size(); ++i)\n+                if (bot_count_by_class[i])\n+                    ss << \"\\n \" << BotColors.at(i).name << \": \" << bot_count_by_class[i] << \" bots\";\n+            ss << '\\n';\n+\n+            static_assert(std::size(bot_levels) == std::size(bot_count_by_level));\n+            for (size_t i{}; i < bot_levels.size(); ++i)\n+            {\n+                ss << \"\\n Levels \" << bot_levels[i];\n+                if (i + 1 < bot_levels.size())\n+                    ss << '-' << bot_levels[i + 1] - 1;\n+                else\n+                    ss << '+';\n+                ss << \": \" << bot_count_by_level[i] << \" bots\";\n+            }\n+        };\n+\n+        handler->SendSysMessage(ss.view());\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotSpawnedStatsCommand(ChatHandler* handler)\n+    {\n+        return HandleNpcBotSpawnedStatsCommandImpl(handler, false);\n+    }\n+\n+    static bool HandleNpcBotSpawnedFreeStatsCommand(ChatHandler* handler)\n+    {\n+        return HandleNpcBotSpawnedStatsCommandImpl(handler, true);\n+    }\n+\n+    static bool HandleNPCBotSpawnedZoneCommandImpl(ChatHandler* handler, Optional<std::string> zone_name, bool is_free)\n+    {\n+        if (!zone_name || zone_name->empty())\n+        {\n+            if (!handler->GetPlayer())\n+            {\n+                handler->SendSysMessage(\"Syntax: npcbot list spawned [free] zone #zone_name_part\");\n+                handler->SetSentErrorMessage(true);\n+                return false;\n+            }\n+\n+            AreaTableEntry const* zone = sAreaTableStore.LookupEntry(handler->GetPlayer()->GetZoneId());\n+            zone_name = zone ? zone->AreaName[handler->GetSession() ? handler->GetSessionDbLocaleIndex() : 0] : \"Unknown\";\n+        }\n+\n+        return HandleNpcBotSpawnedCommandImpl(handler, zone_name, {}, {}, {}, is_free);\n+    }\n+\n+    static bool HandleNPCBotSpawnedZoneCommand(ChatHandler* handler, Optional<std::string> zone_name)\n+    {\n+        return HandleNPCBotSpawnedZoneCommandImpl(handler, zone_name, false);\n+    }\n+\n+    static bool HandleNPCBotSpawnedFreeZoneCommand(ChatHandler* handler, Optional<std::string> zone_name)\n+    {\n+        return HandleNPCBotSpawnedZoneCommandImpl(handler, zone_name, true);\n+    }\n+\n+    static bool HandleNPCBotSpawnedClassCommandImpl(ChatHandler* handler, Optional<std::string> class_name, Optional<std::string> zone_name, bool is_free)\n+    {\n+        if (!class_name || class_name->empty())\n+        {\n+            handler->SendSysMessage(\"Syntax: npcbot list spawned [free] class #class #[zone]\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+        return HandleNpcBotSpawnedCommandImpl(handler, zone_name, class_name, {}, {}, is_free);\n+    }\n+\n+    static bool HandleNPCBotSpawnedClassCommand(ChatHandler* handler, Optional<std::string> class_name, Optional<std::string> zone_name)\n+    {\n+        return HandleNPCBotSpawnedClassCommandImpl(handler, class_name, zone_name, false);\n+    }\n+\n+    static bool HandleNPCBotSpawnedFreeClassCommand(ChatHandler* handler, Optional<std::string> class_name, Optional<std::string> zone_name)\n+    {\n+        return HandleNPCBotSpawnedClassCommandImpl(handler, class_name, zone_name, true);\n+    }\n+\n+    static bool HandleNPCBotSpawnedLevelCommandImpl(ChatHandler* handler, Optional<uint32> level_min, Optional<uint32> level_max, Optional<std::string> zone_name, bool is_free)\n+    {\n+        if (!level_min || !*level_min)\n+        {\n+            handler->SendSysMessage(\"Syntax: npcbot list spawned [free] level #level_min #[level_max] #[zone]\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        return HandleNpcBotSpawnedCommandImpl(handler, zone_name, {}, level_min, level_max, is_free);\n+    }\n+\n+    static bool HandleNPCBotSpawnedLevelCommand(ChatHandler* handler, Optional<uint32> level_min, Optional<uint32> level_max, Optional<std::string> zone_name)\n+    {\n+        return HandleNPCBotSpawnedLevelCommandImpl(handler, level_min, level_max, zone_name, false);\n+    }\n+\n+    static bool HandleNPCBotSpawnedFreeLevelCommand(ChatHandler* handler, Optional<uint32> level_min, Optional<uint32> level_max, Optional<std::string> zone_name)\n+    {\n+        return HandleNPCBotSpawnedLevelCommandImpl(handler, level_min, level_max, zone_name, true);\n+    }\n+\n+    static bool HandleNpcBotGearScoreCommand(ChatHandler* handler, Optional<std::string_view> class_name)\n+    {\n+        Player* owner = handler->GetSession()->GetPlayer();\n+        Unit* unit = owner->GetSelectedUnit();\n+        if (!(unit && owner->GetBotMgr()->GetBot(unit->GetGUID())) && !class_name)\n+        {\n+            handler->SendSysMessage(\".npcbot gs [#class_name]\");\n+            handler->SendSysMessage(\"Lists GearScore of your selected NPCBot or all bots by #class_name\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+        std::vector<Creature*> bots;\n+        if (class_name)\n+        {\n+            if (!std::ranges::all_of(class_name.value(), [](char c) { return std::islower(c); }))\n+            {\n+                handler->SendSysMessage(\"Bot class name must be in lower case!\");\n+                return true;\n+            }\n+\n+            uint8 bot_class = BotMgr::BotClassByClassName(*class_name);\n+            if (bot_class == BOT_CLASS_NONE)\n+            {\n+                handler->PSendSysMessage(\"Unknown bot name or class %s!\", *class_name);\n+                return true;\n+            }\n+\n+            bots = owner->GetBotMgr()->GetAllBotsByClass(bot_class);\n+            if (bots.empty())\n+            {\n+                handler->PSendSysMessage(\"No bots of class %u found!\", uint32(bot_class));\n+                return true;\n+            }\n+        }\n+        else\n+            bots.push_back(unit->ToCreature());\n+\n+        for (Creature const* bot : bots)\n+        {\n+            auto scores = bot->GetBotAI()->GetBotGearScores();\n+            handler->PSendSysMessage(\"%s's GearScore total: %u, average: %u\", bot->GetName(), uint32(scores.first), uint32(scores.second));\n+        }\n+\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotUseOnBotSpellCommand(ChatHandler* handler, Optional<Variant<SpellInfo const*, std::vector<std::string>>> spell_name_parts_or_info)\n+    {\n+        Player* player = handler->GetSession()->GetPlayer();\n+        Creature* target = handler->getSelectedCreature();\n+\n+        if (!spell_name_parts_or_info)\n+        {\n+            handler->SendSysMessage(\".npcbot useonbot spell [#spell_name]\");\n+            handler->SendSysMessage(\"Attempts to cast spell by name on selected bot, bypassing client restrictions\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        if (!target || !target->IsNPCBot())\n+        {\n+            handler->SendSysMessage(\"No NPCBot selected\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        uint32 spellId = 0;\n+        std::string spellname;\n+        if (spell_name_parts_or_info->holds_alternative<SpellInfo const*>())\n+            spellId = spell_name_parts_or_info->get<SpellInfo const*>()->Id;\n+        else\n+        {\n+            auto const& vec = spell_name_parts_or_info->get<std::vector<std::string>>();\n+            spellname = vec[0];\n+            for (std::size_t i = 1; i < vec.size(); ++i)\n+                spellname += ' ' + vec[i];\n+\n+            if (spellname.size() >= 2 && spellname[0] == '[' && spellname[spellname.size() - 1] == ']')\n+                spellname = spellname.substr(1, spellname.size() - 2);\n+\n+            LocaleConstant locale = handler->GetSession()->GetSessionDbcLocale();\n+            for (auto const& [spellid, pspell] : player->GetSpellMap())\n+            {\n+                if (pspell.state != PLAYERSPELL_REMOVED && pspell.active && !pspell.disabled)\n+                {\n+                    SpellInfo const* info = sSpellMgr->GetSpellInfo(spellid);\n+                    if (info && info->SpellName[locale] == spellname)\n+                    {\n+                        spellId = spellid;\n+                        break;\n+                    }\n+                }\n+            }\n+        }\n+\n+        SpellInfo const* spellInfo = spellId ? sSpellMgr->AssertSpellInfo(spellId) : nullptr;\n+        if (!spellInfo)\n+        {\n+            handler->PSendSysMessage(LANG_COMMAND_NOSPELLFOUND);\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        // silently cancel\n+        Unit* mover = handler->GetSession()->GetGameClient()->GetActivelyMovedUnit();\n+        if (spellInfo->IsPassive() || !spellInfo->IsPositive() || player->isPossessing() || player->IsInFlight() ||\n+            !mover || (mover != player && mover->IsPlayer()))\n+            return true;\n+\n+        SpellInfo const* actualSpellInfo = spellInfo->GetAuraRankForLevel(target->GetLevel());\n+        if (actualSpellInfo)\n+            spellInfo = actualSpellInfo;\n+\n+        SpellCastTargets targets;\n+        targets.SetUnitTarget(target);\n+        Spell* spell = new Spell(player, spellInfo, TRIGGERED_NONE);\n+        spell->m_cast_count = 1;\n+        spell->prepare(targets);\n+\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotUseOnBotItemCommand(ChatHandler* handler, Optional<Variant<ItemTemplate const*, std::vector<std::string>>> item_name_parts_or_template)\n+    {\n+        Player* player = handler->GetSession()->GetPlayer();\n+        Creature* target = handler->getSelectedCreature();\n+\n+        if (!item_name_parts_or_template)\n+        {\n+            handler->SendSysMessage(\".npcbot useonbot item [#item_name]\");\n+            handler->SendSysMessage(\"Attempts to cast item spell by item name on selected bot, bypassing client restrictions\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        if (!target || !target->IsNPCBot())\n+        {\n+            handler->SendSysMessage(\"No NPCBot selected\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        Item* item = nullptr;\n+        if (item_name_parts_or_template->holds_alternative<ItemTemplate const*>())\n+            item = player->GetItemByEntry(item_name_parts_or_template->get<ItemTemplate const*>()->ItemId);\n+        else\n+        {\n+            auto const& vec = item_name_parts_or_template->get<std::vector<std::string>>();\n+            std::string itemname = vec[0];\n+            for (std::size_t i = 1; i < vec.size(); ++i)\n+                itemname += ' ' + vec[i];\n+\n+            if (itemname.size() >= 2 && itemname[0] == '[' && itemname[itemname.size() - 1] == ']')\n+                itemname = itemname.substr(1, itemname.size() - 2);\n+\n+            LocaleConstant locale = handler->GetSession()->GetSessionDbcLocale();\n+\n+            // find the item\n+            for (uint8 i = EQUIPMENT_SLOT_START; i < INVENTORY_SLOT_ITEM_END && !item; ++i)\n+            {\n+                Item* pItem = player->GetItemByPos(INVENTORY_SLOT_BAG_0, i);\n+                if (!pItem || pItem->IsInTrade())\n+                    continue;\n+\n+                ItemTemplate const* pItemTemplate = pItem->GetTemplate();\n+                std::string pItemName = pItemTemplate->Name1;\n+                if (ItemLocale const* il = sObjectMgr->GetItemLocale(pItemTemplate->ItemId))\n+                    ObjectMgr::GetLocaleString(il->Name, locale, pItemName);\n+                if (pItemName == itemname)\n+                    item = pItem;\n+            }\n+            for (uint8 i = INVENTORY_SLOT_BAG_START; i < INVENTORY_SLOT_BAG_END && !item; ++i)\n+            {\n+                if (Bag* pBag = player->GetBagByPos(i))\n+                {\n+                    for (uint32 j{}; j < pBag->GetBagSize() && !item; ++j)\n+                    {\n+                        Item* pItem = player->GetItemByPos(i, j);\n+                        if (!pItem || pItem->IsInTrade())\n+                            continue;\n+\n+                        ItemTemplate const* pItemTemplate = pItem->GetTemplate();\n+                        std::string pItemName = pItemTemplate->Name1;\n+                        if (ItemLocale const* il = sObjectMgr->GetItemLocale(pItemTemplate->ItemId))\n+                            ObjectMgr::GetLocaleString(il->Name, locale, pItemName);\n+                        if (pItemName == itemname)\n+                            item = pItem;\n+                    }\n+                }\n+            }\n+        }\n+\n+        if (!item)\n+        {\n+            handler->SendSysMessage(LANG_COMMAND_NOITEMFOUND);\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        // find usable spell\n+        ItemTemplate const* itemtemplate = item->GetTemplate();\n+        uint32 spellId = 0;\n+        for (auto const& itemspell : itemtemplate->Spells)\n+        {\n+            if (itemspell.SpellId > 0 && itemspell.SpellTrigger == ITEM_SPELLTRIGGER_ON_USE)\n+            {\n+                spellId = itemspell.SpellId;\n+                break;\n+            }\n+        }\n+\n+        SpellInfo const* spellInfo = spellId ? sSpellMgr->GetSpellInfo(spellId) : nullptr;\n+        if (!spellInfo)\n+        {\n+            handler->PSendSysMessage(LANG_COMMAND_NOSPELLFOUND);\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        if (itemtemplate->InventoryType != INVTYPE_NON_EQUIP && !item->IsEquipped())\n+        {\n+            player->SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND, item, nullptr);\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        InventoryResult msg = player->CanUseItem(item);\n+        if (msg != EQUIP_ERR_OK)\n+        {\n+            player->SendEquipError(msg, item, nullptr);\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        if (itemtemplate->Class == ITEM_CLASS_CONSUMABLE && !itemtemplate->HasFlag(ITEM_FLAG_IGNORE_DEFAULT_ARENA_RESTRICTIONS) && player->InArena())\n+        {\n+            player->SendEquipError(EQUIP_ERR_NOT_DURING_ARENA_MATCH, item, nullptr);\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        if (itemtemplate->HasFlag(ITEM_FLAG_NOT_USEABLE_IN_ARENA) && player->InArena())\n+        {\n+            player->SendEquipError(EQUIP_ERR_NOT_DURING_ARENA_MATCH, item, nullptr);\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        if (player->IsInCombat() && !spellInfo->CanBeUsedInCombat())\n+        {\n+            player->SendEquipError(EQUIP_ERR_NOT_IN_COMBAT, item, nullptr);\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        // silently cancel\n+        Unit* mover = handler->GetSession()->GetGameClient()->GetActivelyMovedUnit();\n+        if (spellInfo->IsPassive() || !spellInfo->IsPositive() || player->isPossessing() || player->IsInFlight() ||\n+            !mover || (mover != player && mover->IsPlayer()))\n+            return true;\n+\n+        SpellInfo const* actualSpellInfo = spellInfo->GetAuraRankForLevel(target->GetLevel());\n+        if (actualSpellInfo)\n+            spellInfo = actualSpellInfo;\n+\n+        SpellCastTargets targets;\n+        targets.SetUnitTarget(target);\n+        Spell* spell = new Spell(player, spellInfo, TRIGGERED_NONE);\n+        spell->m_CastItem = item;\n+        spell->m_cast_count = 1;\n+        spell->m_glyphIndex = 0;\n+        spell->prepare(targets);\n+\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotInfoCommand(ChatHandler* handler, Optional<Variant<uint32, std::string>> player_lg_name)\n+    {\n+        Player* player = handler->GetSession() ? handler->GetSession()->GetPlayer() : nullptr;\n+        std::string master_name = (player_lg_name && player_lg_name->holds_alternative<std::string>()) ? player_lg_name->get<std::string>() : \"\";\n+        if (!master_name.empty())\n+            normalizePlayerName(master_name);\n+        ObjectGuid cached_guid = !master_name.empty() ? sCharacterCache->GetCharacterGuidByName(master_name) : ObjectGuid::Empty;\n+        ObjectGuid master_guid = !cached_guid.IsEmpty() ? cached_guid :\n+            (player_lg_name && player_lg_name->holds_alternative<uint32>()) ? ObjectGuid::Create<HighGuid::Player>(player_lg_name->get<uint32>()) :\n+            player && player->GetTarget().IsPlayer() ? player->GetTarget() : ObjectGuid::Empty;\n+\n+        if (master_guid.IsEmpty())\n+        {\n+            if (!master_name.empty())\n+            {\n+                handler->PSendSysMessage(\"Player '%s' is not found!\", master_name);\n+                handler->SetSentErrorMessage(true);\n+                return false;\n+            }\n+\n+            handler->SendSysMessage(\".npcbot info\");\n+            handler->SendSysMessage(\"Lists NpcBots count of each class owned by selected player. You can use this on self and your party members\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+        if (master_name.empty() && !sCharacterCache->GetCharacterNameByGuid(master_guid, master_name))\n+        {\n+            handler->PSendSysMessage(\"Player %u is not found!\", master_guid.GetCounter());\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+        if (BotDataMgr::GetOwnedBotsCount(master_guid, 0, true) == 0)\n+        {\n+            handler->PSendSysMessage(\"%s (%u) has no NpcBots!\", master_name, master_guid.GetCounter());\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        std::vector<ObjectGuid> guidvec;\n+        BotDataMgr::GetNPCBotGuidsByOwner(guidvec, master_guid, true);\n+        Player* master = ObjectAccessor::FindConnectedPlayer(master_guid);\n+        BotMap const* map = master ? master->GetBotMgr()->GetBotMap() : nullptr;\n+        uint32 map_size = map ? uint32(map->size()) : 0u;\n+        if (map)\n+            std::erase_if(guidvec, [=](ObjectGuid guid) { return map->find(guid) != map->end(); });\n+\n+        handler->PSendSysMessage(\"Listing NpcBots for %s, guid %u%s:\", master_name, master_guid.GetCounter(), !master ? \" (offline)\" : \"\");\n+        handler->PSendSysMessage(\"Owned NpcBots: %u (active: %u)\", uint32(guidvec.size()) + map_size, map_size);\n+        LocaleConstant loc = LocaleConstant(handler->GetSessionDbLocaleIndex());\n+        if (map)\n+        {\n+            for (uint8 i = BOT_CLASS_WARRIOR; i != BOT_CLASS_END; ++i)\n+            {\n+                for (auto const& [_, bot] : *map)\n+                {\n+                    if (bot && bot->GetBotClass() == i)\n+                    {\n+                        std::ostringstream nss;\n+                        nss << \"|c\" << BotColors.at(i).color << BotColors.at(i).name << \"|r\";\n+                        std::string_view base_name = bot->GetName();\n+                        if (CreatureLocale const* creatureLocale = sObjectMgr->GetCreatureLocale(bot->GetEntry()))\n+                            if (creatureLocale->Name.size() > loc && !creatureLocale->Name[loc].empty())\n+                                base_name = creatureLocale->Name[loc];\n+\n+                        handler->PSendSysMessage(\"%s (%u): %s (alive: %u)\", base_name, bot->GetEntry(), nss.view(), uint32(bot->IsAlive()));\n+                    }\n+                }\n+            }\n+        }\n+\n+        handler->PSendSysMessage(\"%u inactive bots:\", uint32(guidvec.size()));\n+        for (ObjectGuid guid : guidvec)\n+        {\n+            Creature const* bot = BotDataMgr::FindBot(guid.GetEntry());\n+            uint8 bot_class = bot ? bot->GetBotClass() : uint8(BOT_CLASS_NONE);\n+            std::ostringstream nss;\n+            nss << \"|c\" << BotColors.at(bot_class).color << BotColors.at(bot_class).name << \"|r\";\n+            std::string_view base_name = bot ? std::string_view{ bot->GetName() } : std::string_view{ \"Unknown\" };\n+            if (CreatureLocale const* creatureLocale = sObjectMgr->GetCreatureLocale(guid.GetEntry()))\n+                if (creatureLocale->Name.size() > loc && !creatureLocale->Name[loc].empty())\n+                    base_name = creatureLocale->Name[loc];\n+            handler->PSendSysMessage(\"%s (%u): %s (alive: %u)\", base_name, guid.GetEntry(), nss.view(), bot ? uint32(bot->IsAlive()) : uint32(0));\n+        }\n+\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotCommandStandstillCommand(ChatHandler* handler)\n+    {\n+        Player* owner = handler->GetSession()->GetPlayer();\n+\n+        if (!owner->HaveBot())\n+        {\n+            handler->SendSysMessage(\".npcbot command standstill\");\n+            handler->SendSysMessage(\"Forces your npcbots to stop all movement and remain stationed\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        std::string msg;\n+        Unit* target = owner->GetSelectedUnit();\n+        if (target && owner->GetBotMgr()->GetBot(target->GetGUID()))\n+        {\n+            target->ToCreature()->GetBotAI()->SetBotCommandState(BOT_COMMAND_STAY);\n+            msg = target->GetName() + \"'s command state set to 'STAY'\";\n+        }\n+        else\n+        {\n+            owner->GetBotMgr()->SendBotCommandState(BOT_COMMAND_STAY);\n+            msg = \"Bots' command state set to 'STAY'\";\n+        }\n+\n+        handler->SendSysMessage(msg);\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotCommandStopfullyCommand(ChatHandler* handler)\n+    {\n+        Player* owner = handler->GetSession()->GetPlayer();\n+\n+        if (!owner->HaveBot())\n+        {\n+            handler->SendSysMessage(\".npcbot command stopfully\");\n+            handler->SendSysMessage(\"Forces your npcbots to stop all activity\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        std::string msg;\n+        Unit* target = owner->GetSelectedUnit();\n+        if (target && owner->GetBotMgr()->GetBot(target->GetGUID()))\n+        {\n+            target->ToCreature()->GetBotAI()->SetBotCommandState(BOT_COMMAND_FULLSTOP);\n+            msg = target->GetName() + \"'s command state set to 'FULLSTOP'\";\n+        }\n+        else\n+        {\n+            owner->GetBotMgr()->SendBotCommandState(BOT_COMMAND_FULLSTOP);\n+            msg = \"Bots' command state set to 'FULLSTOP'\";\n+        }\n+\n+        handler->SendSysMessage(msg);\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotCommandNoLongCastCommand(ChatHandler* handler)\n+    {\n+        Player* owner = handler->GetSession()->GetPlayer();\n+\n+        if (!owner->HaveBot())\n+        {\n+            handler->SendSysMessage(\".npcbot command nolongcast\");\n+            handler->SendSysMessage(\"Makes npcbots unable to cast spells with non-zero cast time\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        std::string_view msg;\n+        if (!owner->GetBotMgr()->GetBotMap()->begin()->second->GetBotAI()->HasBotCommandState(BOT_COMMAND_NO_CAST_LONG))\n+        {\n+            owner->GetBotMgr()->SendBotCommandState(BOT_COMMAND_NO_CAST_LONG);\n+            msg = \"Bots' command state set to 'NOLONGCAST'\";\n+        }\n+        else\n+        {\n+            owner->GetBotMgr()->SendBotCommandStateRemove(BOT_COMMAND_NO_CAST_LONG);\n+            msg = \"Bots' command state 'NOLONGCAST' was removed\";\n+        }\n+\n+        handler->SendSysMessage(msg);\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotCommandNoCastCommand(ChatHandler* handler)\n+    {\n+        Player* owner = handler->GetSession()->GetPlayer();\n+\n+        if (!owner->HaveBot())\n+        {\n+            handler->SendSysMessage(\".npcbot command nocast\");\n+            handler->SendSysMessage(\"Makes npcbots unable to cast ANY spells\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        std::string_view msg;\n+        if (!owner->GetBotMgr()->GetBotMap()->begin()->second->GetBotAI()->HasBotCommandState(BOT_COMMAND_NO_CAST))\n+        {\n+            owner->GetBotMgr()->SendBotCommandState(BOT_COMMAND_NO_CAST);\n+            msg = \"Bots' command state set to 'NOCAST'\";\n+        }\n+        else\n+        {\n+            owner->GetBotMgr()->SendBotCommandStateRemove(BOT_COMMAND_NO_CAST);\n+            msg = \"Bots' command state 'NOCAST' was removed\";\n+        }\n+\n+        handler->SendSysMessage(msg);\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotCommandFollowOnlyCommand(ChatHandler* handler)\n+    {\n+        Player* owner = handler->GetSession()->GetPlayer();\n+\n+        if (!owner->HaveBot())\n+        {\n+            handler->SendSysMessage(\".npcbot command follow only\");\n+            handler->SendSysMessage(\"Makes npcbots follow you and do nothing else\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        std::string_view msg;\n+        if (!owner->GetBotMgr()->GetBotMap()->begin()->second->GetBotAI()->HasBotCommandState(BOT_COMMAND_INACTION))\n+        {\n+            owner->GetBotMgr()->SendBotCommandState(BOT_COMMAND_INACTION);\n+            msg = \"Bots' command state set to 'INACTION'\";\n+        }\n+        else\n+        {\n+            owner->GetBotMgr()->SendBotCommandStateRemove(BOT_COMMAND_INACTION);\n+            msg = \"Bots' command state 'INACTION' was removed\";\n+        }\n+\n+        handler->SendSysMessage(msg);\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotCommandFollowCommand(ChatHandler* handler)\n+    {\n+        Player* owner = handler->GetSession()->GetPlayer();\n+\n+        if (!owner->HaveBot())\n+        {\n+            handler->SendSysMessage(\".npcbot command follow\");\n+            handler->SendSysMessage(\"Allows npcbots to follow you again if stopped\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        std::string msg;\n+        Unit* target = owner->GetSelectedUnit();\n+        if (target && owner->GetBotMgr()->GetBot(target->GetGUID()))\n+        {\n+            target->ToCreature()->GetBotAI()->SetBotCommandState(BOT_COMMAND_FOLLOW);\n+            msg = target->GetName() + \"'s command state set to 'FOLLOW'\";\n+        }\n+        else\n+        {\n+            owner->GetBotMgr()->SendBotCommandState(BOT_COMMAND_FOLLOW);\n+            msg = \"Bots' command state set to 'FOLLOW'\";\n+        }\n+\n+        handler->SendSysMessage(msg);\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotCommandWalkCommand(ChatHandler* handler)\n+    {\n+        Player* owner = handler->GetSession()->GetPlayer();\n+\n+        if (!owner->HaveBot())\n+        {\n+            handler->SendSysMessage(\".npcbot command walk\");\n+            handler->SendSysMessage(\"Toggles walk mode for your npcbots\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        std::string_view msg;\n+        bool isWalking = owner->GetBotMgr()->GetBotMap()->begin()->second->GetBotAI()->HasBotCommandState(BOT_COMMAND_WALK);\n+        if (!isWalking)\n+        {\n+            owner->GetBotMgr()->SendBotCommandState(BOT_COMMAND_WALK);\n+            msg = \"Bots' movement mode is set to 'WALK'\";\n+        }\n+        else\n+        {\n+            owner->GetBotMgr()->SendBotCommandStateRemove(BOT_COMMAND_WALK);\n+            msg = \"Bots' movement mode is set to 'RUN'\";\n+        }\n+\n+        handler->SendSysMessage(msg);\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotCommandNoGossipCommand(ChatHandler* handler)\n+    {\n+        Player* owner = handler->GetSession()->GetPlayer();\n+\n+        if (!owner->HaveBot())\n+        {\n+            handler->SendSysMessage(\".npcbot command nogossip\");\n+            handler->SendSysMessage(\"Toggles gossip availability for your npcbots\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        std::string_view msg;\n+        bool isNoGossipEnabled = owner->GetBotMgr()->GetBotMap()->begin()->second->GetBotAI()->HasBotCommandState(BOT_COMMAND_NOGOSSIP);\n+        if (!isNoGossipEnabled)\n+        {\n+            owner->GetBotMgr()->SendBotCommandState(BOT_COMMAND_NOGOSSIP);\n+            msg = \"Bots' gossip is DISABLED\";\n+        }\n+        else\n+        {\n+            owner->GetBotMgr()->SendBotCommandStateRemove(BOT_COMMAND_NOGOSSIP);\n+            msg = \"Bots' gossip is ENABLED\";\n+        }\n+\n+        handler->SendSysMessage(msg);\n+        return true;\n+    }\n+\n+    static bool HandleNpcBotCommandReBindCommand(ChatHandler* handler, Optional<std::vector<std::string>> names)\n+    {\n+        auto return_syntax = [=] {\n+            handler->SendSysMessage(\".npcbot command rebind [#names...]\");\n+            handler->SendSysMessage(\"Re-binds selected/named unbound npcbot\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        };\n+\n+        auto return_success = [=](Variant<std::string_view, uint32> name_or_count) {\n+            if (name_or_count.holds_alternative<uint32>())\n+                handler->PSendSysMessage(\"Successfully re-bound %u bot(s)\", name_or_count.get<uint32>());\n+            else\n+                handler->PSendSysMessage(\"Successfully re-bound %s\", name_or_count.get<std::string_view>());\n+            return true;\n+        };\n+\n+        auto return_fail = [=](BotAddResult result, Variant<std::string_view, uint32> name_or_count) {\n+            if (name_or_count.holds_alternative<uint32>())\n+                handler->PSendSysMessage(\"Unable to re-bind any of %u bots!\", name_or_count.get<uint32>());\n+            else\n+                handler->PSendSysMessage(\"Failed to re-bind %s, result was %u!\", name_or_count.get<std::string_view>(), uint32(result));\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        };\n+\n+        Player const* owner = handler->GetSession()->GetPlayer();\n+\n+        if (!owner->HaveBot() && BotDataMgr::GetOwnedBotsCount(owner->GetGUID(), 0, true) == 0)\n+            return return_syntax();\n+\n+        BotMgr* mgr = owner->GetBotMgr();\n+\n+        if (!names || names->empty())\n+        {\n+            Creature const* bot = handler->getSelectedCreature();\n+            if (bot && bot->IsNPCBot() && !bot->IsTempBot() && !mgr->GetBot(bot->GetGUID()) && bot->GetBotAI()->HasBotCommandState(BOT_COMMAND_UNBIND) &&\n+                bot->GetBotAI()->HasOwner(owner->GetGUID().GetCounter()))\n+            {\n+                if (BotAddResult res = mgr->RebindBot(const_cast<Creature*>(bot)); res != BOT_ADD_SUCCESS)\n+                    return return_fail(res, { bot->GetName() });\n+\n+                return return_success({ bot->GetName() });\n+            }\n+            return return_syntax();\n+        }\n+\n+        uint32 count = 0;\n+        DoForAllNamesNormalizedIn(*names, [owner, mgr, &return_fail, &count](std::string const& name) {\n+            std::vector<uint32> bot_ids;\n+            bot_ids.reserve(owner->GetBotMgr()->GetNpcBotsCount());\n+            for (auto const& [_, ebot] : *owner->GetBotMgr()->GetBotMap())\n+                bot_ids.push_back(ebot->GetEntry());\n+\n+            Creature const* bot = BotDataMgr::FindBot(name, owner->GetSession()->GetSessionDbLocaleIndex(), &bot_ids);\n+            if (bot && bot->IsNPCBot() && !bot->IsTempBot() && !mgr->GetBot(bot->GetGUID()) && bot->GetBotAI()->HasBotCommandState(BOT_COMMAND_UNBIND) &&\n+                bot->GetBotAI()->HasOwner(owner->GetGUID().GetCounter()))\n+            {\n+                if (BotAddResult res = mgr->RebindBot(const_cast<Creature*>(bot)); res != BOT_ADD_SUCCESS)\n+                {\n+                    return_fail(res, { name });\n+                    return;\n+                }\n+                ++count;\n+            }\n+        });\n+\n+        if (count == 0)\n+            return return_fail({}, { uint32(names->size()) });\n+\n+        return return_success({ count });\n+    }\n+\n+    static bool HandleNpcBotCommandUnBindCommand(ChatHandler* handler, Optional<std::vector<std::string>> names)\n+    {\n+        static auto return_syntax = [](ChatHandler* chandler) -> bool {\n+            chandler->SendSysMessage(\".npcbot command unbind [#names...]\");\n+            chandler->SendSysMessage(\"Frees selected/named npcbot(s) temporarily. The bot will return to home location and wait until re-bound\");\n+            chandler->SetSentErrorMessage(true);\n+            return false;\n+        };\n+\n+        static auto return_success = [](ChatHandler* chandler, Variant<std::string_view, uint32> name_or_count) -> bool {\n+            if (name_or_count.holds_alternative<uint32>())\n+                chandler->PSendSysMessage(\"Successfully unbound %u bot(s)\", name_or_count.get<uint32>());\n+            else\n+                chandler->PSendSysMessage(\"Successfully unbound %s\", name_or_count.get<std::string_view>());\n+            return true;\n+        };\n+\n+        Player const* owner = handler->GetSession()->GetPlayer();\n+\n+        if (!owner->HaveBot())\n+            return return_syntax(handler);\n+\n+        if (!names || names->empty())\n+        {\n+            Unit const* target = handler->getSelectedCreature();\n+            Creature const* bot = target ? owner->GetBotMgr()->GetBot(target->GetGUID()) : nullptr;\n+            if (bot && !bot->GetBotAI()->HasBotCommandState(BOT_COMMAND_UNBIND))\n+            {\n+                owner->GetBotMgr()->UnbindBot(bot->GetGUID());\n+                return return_success(handler, { bot->GetName() });\n+            }\n+            return return_syntax(handler);\n+        }\n+\n+        uint32 count = 0;\n+        DoForAllNamesNormalizedIn(*names, [owner, &count](std::string const& name) {\n+            Creature const* bot = owner->GetBotMgr()->GetBotByName(name);\n+            if (bot && !bot->GetBotAI()->HasBotCommandState(BOT_COMMAND_UNBIND))\n+            {\n+                ++count;\n+                owner->GetBotMgr()->UnbindBot(bot->GetGUID());\n+            }\n+        });\n+\n+        if (count == 0)\n+        {\n+            handler->PSendSysMessage(\"Unable to unbind any of %u bots!\", uint32(names->size()));\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        return return_success(handler, { count });\n+    }\n+\n+    static bool HandleNpcBotRemoveCommand(ChatHandler* handler)\n+    {\n+        Player* owner = handler->GetSession()->GetPlayer();\n+        Unit* u = owner->GetSelectedUnit();\n+        if (!u)\n+        {\n+            handler->SendSysMessage(\".npcbot remove\");\n+            handler->SendSysMessage(\"Frees selected npcbot from it's owner. Select player to remove all npcbots\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        Player* master = u->ToPlayer();\n+        if (master)\n+        {\n+            if (master->HaveBot())\n+            {\n+                master->RemoveAllBots(BOT_REMOVE_DISMISS);\n+\n+                if (!master->HaveBot())\n+                {\n+                    handler->SendSysMessage(\"Npcbots were successfully removed\");\n+                    handler->SetSentErrorMessage(true);\n+                    return true;\n+                }\n+                handler->SendSysMessage(\"Some npcbots were not removed!\");\n+                handler->SetSentErrorMessage(true);\n+                return false;\n+            }\n+            handler->SendSysMessage(\"Npcbots are not found!\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        Creature* cre = u->ToCreature();\n+        if (cre && cre->IsNPCBot() && !cre->IsFreeBot())\n+        {\n+            master = cre->GetBotOwner();\n+            master->GetBotMgr()->RemoveBot(cre->GetGUID(), BOT_REMOVE_DISMISS);\n+            if (master->GetBotMgr()->GetBot(cre->GetGUID()) == nullptr)\n+            {\n+                handler->SendSysMessage(\"NpcBot successfully removed\");\n+                handler->SetSentErrorMessage(true);\n+                return true;\n+            }\n+            handler->SendSysMessage(\"NpcBot was NOT removed for some stupid reason!\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        handler->SendSysMessage(\"You must select player or controlled npcbot\");\n+        handler->SetSentErrorMessage(true);\n+        return false;\n+    }\n+\n+    static bool HandleNpcBotReviveCommand(ChatHandler* handler)\n+    {\n+        Player* owner = handler->GetSession()->GetPlayer();\n+        Unit* u = owner->GetSelectedUnit();\n+        if (!u)\n+        {\n+            handler->SendSysMessage(\".npcbot revive\");\n+            handler->SendSysMessage(\"Revives selected npcbot. If player is selected, revives all selected player's npcbots\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        if (Player* master = u->ToPlayer())\n+        {\n+            if (!master->HaveBot())\n+            {\n+                handler->PSendSysMessage(\"%s has no npcbots!\", master->GetName());\n+                handler->SetSentErrorMessage(true);\n+                return false;\n+            }\n+\n+            master->GetBotMgr()->ReviveAllBots();\n+            handler->SendSysMessage(\"Npcbots revived\");\n+            return true;\n+        }\n+        else if (Creature* bot = u->ToCreature())\n+        {\n+            if (bot->GetBotAI())\n+            {\n+                if (bot->IsAlive())\n+                {\n+                    handler->PSendSysMessage(\"%s is not dead\", bot->GetName());\n+                    handler->SetSentErrorMessage(true);\n+                    return false;\n+                }\n+\n+                BotMgr::ReviveBot(bot, (bot->GetBotOwner() == owner) ? owner->ToUnit() : bot->ToUnit());\n+                handler->PSendSysMessage(\"%s revived\", bot->GetName());\n+                return true;\n+            }\n+        }\n+\n+        handler->SendSysMessage(\"You must select player or npcbot\");\n+        handler->SetSentErrorMessage(true);\n+        return false;\n+    }\n+\n+    static bool HandleNpcBotAddCommand(ChatHandler* handler)\n+    {\n+        Player* owner = handler->GetSession()->GetPlayer();\n+        Unit* cre = owner->GetSelectedUnit();\n+\n+        if (!cre || !cre->IsCreature())\n+        {\n+            handler->SendSysMessage(\".npcbot add\");\n+            handler->SendSysMessage(\"Allows to hire selected uncontrolled bot\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        Creature* bot = cre->ToCreature();\n+        if (!bot || !bot->IsNPCBot() || bot->GetBotAI()->GetBotOwnerGuid() || bot->GetBotAI()->IsWanderer())\n+        {\n+            handler->SendSysMessage(\"You must select uncontrolled non-wandering npcbot\");\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+\n+        ObjectGuid::LowType guidlow = owner->GetGUID().GetCounter();\n+        BotDataMgr::UpdateNpcBotData(bot->GetEntry(), NPCBOT_UPDATE_OWNER, &guidlow);\n+        NpcBotData::SharedOwnersContainer sharedOwners{};\n+        BotDataMgr::UpdateNpcBotData(bot->GetEntry(), NPCBOT_UPDATE_SHARED_OWNERS, &sharedOwners);\n+\n+        if (owner->GetBotMgr()->AddBot(bot) == BOT_ADD_SUCCESS)\n+        {\n+            handler->PSendSysMessage(\"%s is now your npcbot\", bot->GetName());\n+            return true;\n+        }\n+\n+        handler->SendSysMessage(\"NpcBot is NOT added for some reason!\");\n+        handler->SetSentErrorMessage(true);\n+        return false;\n+    }\n+};\n+\n+void AddSC_script_bot_commands()\n+{\n+    new script_bot_commands();\n+}\n+\n+#ifdef _MSC_VER\n+# pragma warning(pop)\n+#endif\ndiff --git a/src/server/game/AI/NpcBots/botcommon.h b/src/server/game/AI/NpcBots/botcommon.h\nnew file mode 100644\nindex 0000000000..b4ad85ae32\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/botcommon.h\n@@ -0,0 +1,678 @@\n+#ifndef BOTCOMMON_H\n+#define BOTCOMMON_H\n+\n+#include \"botdefine.h\"\n+#include \"ObjectGuid.h\"\n+#include \"SharedDefines.h\"\n+#include \"SpellAuraDefines.h\"\n+\n+#include <utility>\n+#include <vector>\n+\n+/*\n+NpcBot System by Trickerer (onlysuffering@gmail.com)\n+Original patch from: LordPsyan https://bitbucket.org/lordpsyan/trinitycore-patches/src/3b8b9072280e/Individual/11185-BOTS-NPCBots.patch\n+*/\n+\n+#ifdef AC_COMPILER\n+# define TARGET_ICONS_COUNT TARGETICONCOUNT\n+#endif\n+\n+inline constexpr std::size_t MAX_BOT_LOG_PARAMS = 5;\n+inline constexpr std::size_t MAX_BOT_LOG_PARAM_LENGTH = 50;\n+inline constexpr std::size_t MAX_BOT_ITEM_SET_NAME_LENGTH = 30;\n+inline constexpr uint8 BOT_GOSSIP_MAX_ITEMS = 32; // Client limitation 3.3.5 code confirmed\n+\n+inline constexpr std::size_t BRACKETS_COUNT = DEFAULT_MAX_LEVEL / 10 + 1; //0-9, 10-19, 20-29, 30-39, 40-49, 50-59, 60-69, 70-79, 80-83\n+\n+struct Position;\n+\n+using AoeSpotsVec = std::vector<std::pair<Position, float> >;\n+\n+enum BotCommonValues\n+{\n+//MISC\n+    BOT_GIVER_ENTRY                     = 70000,\n+    BOT_ENTRY_BEGIN                     = 70001,\n+    //BOT_ENTRY_END                       = 71000,\n+    BOT_ENTRY_CREATE_BEGIN              = 70800, // 70800+ reserved for bot creation\n+    //BOT_PET_ENTRY_BEGIN                 = 70501,\n+    //BOT_PET_ENTRY_END                   = 70550,\n+    BOT_ENTRY_MIRROR_IMAGE_BM           = 70552,\n+    BOT_MAX_CHASE_RANGE                 = 120,  //yds\n+    //BOT_EVADE_TIME                      = 3000, //ms\n+//COMMON GAMEOBJECTS\n+    GO_REFRESHMENT_TABLE_1              = 186812,//lvl 65 req70\n+    GO_REFRESHMENT_TABLE_2              = 193061,//lvl 80 req80\n+    GO_SOULWELL_1                       = 181621,//lvl 60 req68\n+    GO_SOULWELL_2                       = 193169,//lvl 69 req80\n+    GO_BOT_MONEY_BAG                    = 186736,\n+//COMMON CDs\n+    POTION_CD                           = 60000,//default 60sec potion cd\n+    REGEN_CD                            = 1000, //update hp/mana every X milliseconds\n+//COMMON TIMERS\n+    ITEM_ENCHANTMENT_EXPIRE_TIMER       = 3600000, //1 Hour\n+    REVIVE_TIMER_DEFAULT                = 180000, //3 Minutes\n+    REVIVE_TIMER_MEDIUM                 = 90000, //1.5 Minutes\n+    REVIVE_TIMER_SHORT                  = 60000, //1 Minute\n+    INOUTDOORS_ENSURE_TIMER             = 1500,\n+    BOT_GROUP_UPDATE_TIMER              = 2000,\n+    RENT_TIMER                          = 3600000, //1 Hour\n+    RENT_COLLECT_TIMER                  = 600000, //10 Minutes\n+//VEHICLE CREATURES\n+    CREATURE_NEXUS_SKYTALON_1           = 32535, // [Q] Aces High\n+    CREATURE_EOE_SKYTALON_N             = 30161, // Eye of Eternity\n+    CREATURE_EOE_SKYTALON_H             = 31752,\n+    CREATURE_OCULUS_DRAKE_RUBY          = 27756, // Oculus\n+    CREATURE_OCULUS_DRAKE_EMERALD       = 27692,\n+    CREATURE_OCULUS_DRAKE_AMBER         = 27755,\n+    //CREATURE_TOC_STEED_QUELDOREI        = 33845, // Argent Tournament\n+    //CREATURE_TOC_NIGHTSABER             = 33319,\n+    //CREATURE_TOC_STEED_STORMWIND        = 33217,\n+    //CREATURE_TOC_MECHANOSTRIDER         = 33317,\n+    //CREATURE_TOC_RAM                    = 33316,\n+    //CREATURE_TOC_ELEKK                  = 33318,\n+    //CREATURE_TOC_HAWKSTRIDER_SUNREAVER  = 33844,\n+    //CREATURE_TOC_RAPTOR                 = 33321,\n+    //CREATURE_TOC_WARHORSE               = 33324,\n+    //CREATURE_TOC_WOLF                   = 33320,\n+    //CREATURE_TOC_HAWKSTRIDER_SILVERMOON = 33323,\n+    //CREATURE_TOC_KODO                   = 33322,\n+    CREATURE_TOC5_WARHORSE              = 35644, // Trial of Champion\n+    CREATURE_TOC5_BATTLEWORG            = 36558,\n+    CREATURE_ULDUAR_DEMOLISHER          = 33109, // Ulduar\n+    CREATURE_ULDUAR_SIEGE_ENGINE        = 33060,\n+    CREATURE_ULDUAR_CHOPPER             = 33062,\n+    CREATURE_ULDUAR_CHOPPER1            = 34045,\n+    CREATURE_ICC_BONE_SPIKE1            = 36619, // Icecrown Citadel\n+    CREATURE_ICC_BONE_SPIKE2            = 38712,\n+    CREATURE_ICC_BONE_SPIKE3            = 38711,\n+    CREATURE_ICC_GUNSHIPCANNON_ALLIANCE = 36838,\n+    CREATURE_ICC_GUNSHIPCANNON_HORDE    = 36839,\n+    CREATURE_ICC_MUTATED_ABOMINATION1   = 38285,\n+    CREATURE_ICC_MUTATED_ABOMINATION2   = 38788,\n+    CREATURE_ICC_MUTATED_ABOMINATION3   = 38789,\n+    CREATURE_ICC_MUTATED_ABOMINATION4   = 38790,\n+    CREATURE_ICC_MUTATED_ABOMINATION5   = 37672,\n+    CREATURE_ICC_MUTATED_ABOMINATION6   = 38605,\n+    CREATURE_ICC_MUTATED_ABOMINATION7   = 38786,\n+    CREATURE_ICC_MUTATED_ABOMINATION8   = 38787,\n+    CREATURE_GEARGRINDERS_JUMPBOT       = 31784,\n+//COMMON AOE TRIGGERS\n+    CREATURE_MUTATING_BUG_1             = 15316,\n+    CREATURE_MUTATING_BUG_2             = 15317,\n+    CREATURE_FOCUS_FIRE_N               = 18374,\n+    CREATURE_FOCUS_FIRE_H               = 20308,\n+    CREATURE_MT_PHOENIX                 = 24674,\n+    CREATURE_MT_ARCANE_SPHERE_N         = 24708,\n+    CREATURE_MT_ARCANE_SPHERE_H         = 25543,\n+    CREATURE_ZA_FIRE_BOMB               = 23920,\n+    CREATURE_UK_SHADOW_AXE_N            = 23997,\n+    CREATURE_UK_SHADOW_AXE_H            = 31835,\n+    CREATURE_EOE_STATIC_FIELD           = 30592,\n+    CREATURE_ICC_OOZE_PUDDLE            = 37690,\n+    GAMEOBJECT_HOT_COAL                 = 178164,\n+    GAMEOBJECT_SAND_TRAP                = 180647,\n+    GAMEOBJECT_LIQUID_FIRE_1            = 180125,\n+    GAMEOBJECT_LIQUID_FIRE_2            = 181890,\n+    GAMEOBJECT_LIQUID_FIRE_3            = 182533,\n+    GAMEOBJECT_PROXIMITY_BOMB_N         = 181877,\n+    GAMEOBJECT_PROXIMITY_BOMB_H         = 182607,\n+//COMMON ENEMY CREATURES\n+    CREATURE_BOSS_EREGOS_N              = 27656,\n+    CREATURE_BOSS_EREGOS_H              = 31561,\n+    CREATURE_ICC_SINDRAGOSA1            = 36853,\n+    CREATURE_ICC_SINDRAGOSA2            = 38265,\n+    CREATURE_ICC_SINDRAGOSA3            = 38266,\n+    CREATURE_ICC_SINDRAGOSA4            = 38267,\n+    CREATURE_ICC_ICE_TOMB1              = 36980,\n+    CREATURE_ICC_ICE_TOMB2              = 38320,\n+    CREATURE_ICC_ICE_TOMB3              = 38321,\n+    CREATURE_ICC_ICE_TOMB4              = 38322,\n+    CREATURE_ICC_VALKYR_LK1             = 36609,\n+    CREATURE_ICC_VALKYR_LK2             = 39120,\n+    CREATURE_ICC_VALKYR_LK3             = 39121,\n+    CREATURE_ICC_VALKYR_LK4             = 39122,\n+    CREATURE_ICC_ICE_SPHERE1            = 36633,\n+    CREATURE_ICC_ICE_SPHERE2            = 39305,\n+    CREATURE_ICC_ICE_SPHERE3            = 39306,\n+    CREATURE_ICC_ICE_SPHERE4            = 39307,\n+//COMMON NPCS\n+    SHAMAN_EARTH_ELEMENTAL              = 15352,\n+    SHAMAN_FIRE_ELEMENTAL               = 15438,\n+    //NPC_WORLD_TRIGGER                   = 22515,\n+//COMMON ITEM DISPLAY IDS\n+    CHEST_HALISCAN                      = 50566, //Haliscan Jacket\n+    LEGS_HALISCAN                       = 50567, //Haliscan Pants\n+//COMMON GAMEEVENTS\n+    GAME_EVENT_WINTER_VEIL              = 2,\n+//COMMON FACTIONS\n+    FACTION_TEMPLATE_ALLIANCE_DEFAULT   = 1, // Human warrior\n+    FACTION_TEMPLATE_HORDE_DEFAULT      = 2, // Orc warrior\n+    FACTION_TEMPLATE_NEUTRAL_HOSTILE    = FACTION_CREATURE, // 2150 //Hates players and other bots, not attacked by guards\n+  //SOUNDS\n+    SOUND_FREEZE_IMPACT_WINDWALK        = 29,\n+    SOUND_AXE_2H_IMPACT_FLESH_CRIT      = 158,\n+    SOUND_ABSORB_GET_HIT                = 3334,\n+    SOUND_MISS_WHOOSH_2H                = 7081,\n+\n+//UNUSED\n+\n+    //MAX_LOOT_ITEMS                      = 18 // Client limitation 3.3.5 code confirmed\n+};\n+\n+enum BotMiscValues : uint32\n+{\n+//SAVED\n+    BOTAI_MISC_ENCHANT_IS_AUTO_MH       = 1,\n+    BOTAI_MISC_ENCHANT_IS_AUTO_OH       = 2,\n+    BOTAI_MISC_ENCHANT_TIMER_MH         = 3,\n+    BOTAI_MISC_ENCHANT_TIMER_OH         = 4,\n+    BOTAI_MISC_ENCHANT_CURRENT_MH       = 5,\n+    BOTAI_MISC_ENCHANT_CURRENT_OH       = 6,\n+    BOTAI_MISC_PET_TYPE                 = 7,\n+    BOTAI_MISC_AURA_TYPE                = 8,\n+//INTERNAL\n+    BOTAI_MISC_ENCHANT_AVAILABLE_1,\n+    BOTAI_MISC_ENCHANT_AVAILABLE_2,\n+    BOTAI_MISC_ENCHANT_AVAILABLE_3,\n+    BOTAI_MISC_ENCHANT_AVAILABLE_4,\n+    BOTAI_MISC_ENCHANT_AVAILABLE_5,\n+    BOTAI_MISC_ENCHANT_AVAILABLE_6,\n+    BOTAI_MISC_COMBO_POINTS,\n+    BOTAI_MISC_DAGGER_MAINHAND,\n+    BOTAI_MISC_DAGGER_OFFHAND,\n+    BOTAI_MISC_PET_AVAILABLE_1,\n+    BOTAI_MISC_PET_AVAILABLE_2,\n+    BOTAI_MISC_PET_AVAILABLE_3,\n+    BOTAI_MISC_PET_AVAILABLE_4,\n+    BOTAI_MISC_PET_AVAILABLE_5,\n+    BOTAI_MISC_PET_AVAILABLE_6,\n+    BOTAI_MISC_PET_AVAILABLE_7,\n+    BOTAI_MISC_PET_AVAILABLE_8,\n+    BOTAI_MISC_PET_AVAILABLE_9,\n+    BOTAI_MISC_PET_AVAILABLE_10,\n+    BOTAI_MISC_PET_AVAILABLE_11,\n+    BOTAI_MISC_WEAPON_SPEC,\n+    BOTPETAI_MISC_DURATION,\n+    BOTPETAI_MISC_DURATION_MAX,\n+    BOTPETAI_MISC_MAXLEVEL,\n+    BOTPETAI_MISC_FIXEDLEVEL,\n+    BOTPETAI_MISC_CARRY,\n+    BOTPETAI_MISC_CAPACITY,\n+    BOTPETAI_MISC_MAX_ATTACKERS,\n+\n+    BOT_MISCVALUE_SAVED_FIRST = BOTAI_MISC_ENCHANT_IS_AUTO_MH,\n+    BOT_MISCVALUE_SAVED_LAST = BOTAI_MISC_AURA_TYPE\n+};\n+\n+enum BotClasses : uint8\n+{\n+    BOT_CLASS_NONE                      = CLASS_NONE,\n+    BOT_CLASS_WARRIOR                   = CLASS_WARRIOR,\n+    BOT_CLASS_PALADIN                   = CLASS_PALADIN,\n+    BOT_CLASS_HUNTER                    = CLASS_HUNTER,\n+    BOT_CLASS_ROGUE                     = CLASS_ROGUE,\n+    BOT_CLASS_PRIEST                    = CLASS_PRIEST,\n+    BOT_CLASS_DEATH_KNIGHT              = CLASS_DEATH_KNIGHT,\n+    BOT_CLASS_SHAMAN                    = CLASS_SHAMAN,\n+    BOT_CLASS_MAGE                      = CLASS_MAGE,\n+    BOT_CLASS_WARLOCK                   = CLASS_WARLOCK,\n+    BOT_CLASS_DRUID                     = CLASS_DRUID,\n+\n+    BOT_CLASS_BM,\n+    BOT_CLASS_SPHYNX,\n+    BOT_CLASS_ARCHMAGE,\n+    BOT_CLASS_DREADLORD,\n+    BOT_CLASS_SPELLBREAKER,\n+    BOT_CLASS_DARK_RANGER,\n+    BOT_CLASS_NECROMANCER,\n+    BOT_CLASS_SEA_WITCH,\n+    BOT_CLASS_CRYPT_LORD,\n+\n+    BOT_CLASS_END,\n+\n+    BOT_CLASS_EX_START                  = BOT_CLASS_BM\n+};\n+\n+inline constexpr uint32 ALL_BOT_CLASSES_MASK =\n+    ((1 << BOT_CLASS_WARRIOR)|(1 << BOT_CLASS_PALADIN)|(1 << BOT_CLASS_HUNTER)|(1 << BOT_CLASS_ROGUE)|(1 << BOT_CLASS_PRIEST)|\n+    (1 << BOT_CLASS_DEATH_KNIGHT)|(1 << BOT_CLASS_SHAMAN)|(1 << BOT_CLASS_MAGE)|(1 << BOT_CLASS_WARLOCK)|(1 << BOT_CLASS_DRUID)|\n+    (1 << BOT_CLASS_BM)|(1 << BOT_CLASS_SPHYNX)|(1 << BOT_CLASS_ARCHMAGE)|(1 << BOT_CLASS_DREADLORD)|(1 << BOT_CLASS_SPELLBREAKER)|\n+    (1 << BOT_CLASS_DARK_RANGER)|(1 << BOT_CLASS_NECROMANCER)|(1 << BOT_CLASS_SEA_WITCH)|(1 << BOT_CLASS_CRYPT_LORD));\n+\n+inline constexpr uint32 MELEE_BOT_CLASSES_MASK =\n+    ((1 << BOT_CLASS_WARRIOR)|(1 << BOT_CLASS_PALADIN)|(1 << BOT_CLASS_ROGUE)|(1 << BOT_CLASS_DEATH_KNIGHT)|\n+        (1 << BOT_CLASS_BM)|(1 << BOT_CLASS_DREADLORD)|(1 << BOT_CLASS_SPELLBREAKER)|(1 << BOT_CLASS_CRYPT_LORD));\n+inline constexpr uint32 TANKING_BOT_CLASSES_MASK =\n+    ((1 << BOT_CLASS_WARRIOR)|(1 << BOT_CLASS_PALADIN)|(1 << BOT_CLASS_DEATH_KNIGHT)|(1 << BOT_CLASS_SPHYNX)|(1 << BOT_CLASS_SPELLBREAKER)|(1 << BOT_CLASS_CRYPT_LORD));\n+inline constexpr uint32 BLOCKING_BOT_CLASSES_MASK =\n+    ((1 << BOT_CLASS_WARRIOR)|(1 << BOT_CLASS_PALADIN)|(1 << CLASS_SHAMAN)|(1 << BOT_CLASS_SPELLBREAKER));\n+inline constexpr uint32 CASTING_BOT_CLASSES_MASK =\n+    ((1 << BOT_CLASS_PALADIN)|(1 << BOT_CLASS_PRIEST)|(1 << BOT_CLASS_SHAMAN)|(1 << BOT_CLASS_MAGE)|(1 << BOT_CLASS_WARLOCK)|(1 << BOT_CLASS_DRUID)|(1 << BOT_CLASS_SPHYNX)|\n+        (1 << BOT_CLASS_ARCHMAGE)|(1 << BOT_CLASS_DREADLORD)|(1 << BOT_CLASS_SPELLBREAKER)|(1 << BOT_CLASS_DARK_RANGER)|(1 << BOT_CLASS_NECROMANCER)|(1 << BOT_CLASS_SEA_WITCH));\n+inline constexpr uint32 HEALING_BOT_CLASSES_MASK =\n+    ((1 << BOT_CLASS_PALADIN)|(1 << BOT_CLASS_PRIEST)|(1 << BOT_CLASS_SHAMAN)|(1 << BOT_CLASS_DRUID)|(1 << BOT_CLASS_SPHYNX));\n+inline constexpr uint32 HUMANOID_BOT_CLASSES_MASK = (ALL_BOT_CLASSES_MASK & ~(1 << BOT_CLASS_SPHYNX));\n+inline constexpr uint32 HERO_BOT_CLASSES_MASK =\n+    ((1 << BOT_CLASS_BM)|(1 << BOT_CLASS_ARCHMAGE)|(1 << BOT_CLASS_DREADLORD)|(1 << BOT_CLASS_DARK_RANGER)|(1 << BOT_CLASS_SEA_WITCH)|(1 << BOT_CLASS_CRYPT_LORD));\n+\n+enum BotStances\n+{\n+    BOT_STANCE_NONE                     = 0,\n+    WARRIOR_BATTLE_STANCE               = BOT_CLASS_END,\n+    WARRIOR_DEFENSIVE_STANCE,\n+    WARRIOR_BERSERKER_STANCE,\n+    DEATH_KNIGHT_BLOOD_PRESENCE,\n+    DEATH_KNIGHT_FROST_PRESENCE,\n+    DEATH_KNIGHT_UNHOLY_PRESENCE,\n+    DRUID_BEAR_FORM,\n+    DRUID_CAT_FORM,\n+    DRUID_MOONKIN_FORM,\n+    DRUID_TREE_FORM,\n+    DRUID_TRAVEL_FORM,\n+    DRUID_AQUATIC_FORM,\n+    DRUID_FLIGHT_FORM\n+};\n+\n+enum BotRoles : uint32\n+{\n+    BOT_ROLE_NONE                       = 0x00000,\n+    BOT_ROLE_TANK                       = 0x00001,\n+    BOT_ROLE_TANK_OFF                   = 0x00002,\n+    BOT_ROLE_DPS                        = 0x00004,\n+    BOT_ROLE_HEAL                       = 0x00008,\n+    BOT_ROLE_RANGED                     = 0x00010,\n+\n+    BOT_ROLE_PARTY                      = 0x00020, //hidden\n+\n+    BOT_ROLE_GATHERING_MINING           = 0x00040,\n+    BOT_ROLE_GATHERING_HERBALISM        = 0x00080,\n+    BOT_ROLE_GATHERING_SKINNING         = 0x00100,\n+    BOT_ROLE_GATHERING_ENGINEERING      = 0x00200,\n+\n+    BOT_ROLE_AUTOLOOT                   = 0x00400, //not in mask\n+    BOT_ROLE_AUTOLOOT_POOR              = 0x00800,\n+    BOT_ROLE_AUTOLOOT_COMMON            = 0x01000,\n+    BOT_ROLE_AUTOLOOT_UNCOMMON          = 0x02000,\n+    BOT_ROLE_AUTOLOOT_RARE              = 0x04000,\n+    BOT_ROLE_AUTOLOOT_EPIC              = 0x08000,\n+    BOT_ROLE_AUTOLOOT_LEGENDARY         = 0x10000,\n+\n+    BOT_MAX_ROLE                        = 0x20000,\n+\n+    BOT_ROLE_MASK_MAIN                  = (BOT_ROLE_TANK | BOT_ROLE_TANK_OFF | BOT_ROLE_DPS | BOT_ROLE_HEAL | BOT_ROLE_RANGED),\n+    //BOT_ROLE_MASK_MAIN_EX               = (BOT_ROLE_TANK | BOT_ROLE_DPS | BOT_ROLE_HEAL | BOT_ROLE_RANGED | BOT_ROLE_PARTY),\n+    BOT_ROLE_MASK_GATHERING             = (BOT_ROLE_GATHERING_MINING | BOT_ROLE_GATHERING_HERBALISM | BOT_ROLE_GATHERING_SKINNING | BOT_ROLE_GATHERING_ENGINEERING),\n+    BOT_ROLE_MASK_LOOTING               = (BOT_ROLE_AUTOLOOT_POOR | BOT_ROLE_AUTOLOOT_COMMON | BOT_ROLE_AUTOLOOT_UNCOMMON | BOT_ROLE_AUTOLOOT_RARE | BOT_ROLE_AUTOLOOT_EPIC | BOT_ROLE_AUTOLOOT_LEGENDARY),\n+\n+    //BOT_ROLE_TANK_MELEE                 = (BOT_ROLE_TANK | BOT_ROLE_DPS),\n+    //BOT_ROLE_TANK_RANGED                = (BOT_ROLE_TANK | BOT_ROLE_DPS | BOT_ROLE_RANGED),\n+    //BOT_ROLE_TANK_RANGED_NODPS          = (BOT_ROLE_TANK | BOT_ROLE_RANGED),\n+};\n+\n+enum BotTalentSpecs\n+{\n+    BOT_SPEC_WARRIOR_ARMS               = 1,\n+    BOT_SPEC_WARRIOR_FURY               = 2,\n+    BOT_SPEC_WARRIOR_PROTECTION         = 3,\n+    BOT_SPEC_PALADIN_HOLY               = 4,\n+    BOT_SPEC_PALADIN_PROTECTION         = 5,\n+    BOT_SPEC_PALADIN_RETRIBUTION        = 6,\n+    BOT_SPEC_HUNTER_BEASTMASTERY        = 7,\n+    BOT_SPEC_HUNTER_MARKSMANSHIP        = 8,\n+    BOT_SPEC_HUNTER_SURVIVAL            = 9,\n+    BOT_SPEC_ROGUE_ASSASINATION         = 10,\n+    BOT_SPEC_ROGUE_COMBAT               = 11,\n+    BOT_SPEC_ROGUE_SUBTLETY             = 12,\n+    BOT_SPEC_PRIEST_DISCIPLINE          = 13,\n+    BOT_SPEC_PRIEST_HOLY                = 14,\n+    BOT_SPEC_PRIEST_SHADOW              = 15,\n+    BOT_SPEC_DK_BLOOD                   = 16,\n+    BOT_SPEC_DK_FROST                   = 17,\n+    BOT_SPEC_DK_UNHOLY                  = 18,\n+    BOT_SPEC_SHAMAN_ELEMENTAL           = 19,\n+    BOT_SPEC_SHAMAN_ENHANCEMENT         = 20,\n+    BOT_SPEC_SHAMAN_RESTORATION         = 21,\n+    BOT_SPEC_MAGE_ARCANE                = 22,\n+    BOT_SPEC_MAGE_FIRE                  = 23,\n+    BOT_SPEC_MAGE_FROST                 = 24,\n+    BOT_SPEC_WARLOCK_AFFLICTION         = 25,\n+    BOT_SPEC_WARLOCK_DEMONOLOGY         = 26,\n+    BOT_SPEC_WARLOCK_DESTRUCTION        = 27,\n+    BOT_SPEC_DRUID_BALANCE              = 28,\n+    BOT_SPEC_DRUID_FERAL                = 29,\n+    BOT_SPEC_DRUID_RESTORATION          = 30,\n+    BOT_SPEC_DEFAULT                    = 31,\n+\n+    BOT_SPEC_BEGIN                      = BOT_SPEC_WARRIOR_ARMS,\n+    BOT_SPEC_END                        = BOT_SPEC_DEFAULT\n+\n+};\n+\n+enum BotPetTypes\n+{\n+    //Warlock\n+    BOT_PET_IMP                         = 70501,\n+    BOT_PET_VOIDWALKER                  = 70502,\n+    BOT_PET_SUCCUBUS                    = 70503,\n+    BOT_PET_FELHUNTER                   = 70504,\n+    BOT_PET_FELGUARD                    = 70505,\n+\n+    BOT_PET_WARLOCK_START               = BOT_PET_IMP,\n+    BOT_PET_WARLOCK_END                 = BOT_PET_FELGUARD,\n+\n+    //Hunter\n+    //cunning\n+    BOT_PET_SPIDER                      = 70506,\n+    BOT_PET_SERPENT                     = 70507,\n+    BOT_PET_BIRDOFPREY                  = 70508,\n+    BOT_PET_BAT                         = 70509,\n+    BOT_PET_WINDSERPENT                 = 70510,\n+    BOT_PET_RAVAGER                     = 70511,\n+    BOT_PET_DRAGONHAWK                  = 70512,\n+    BOT_PET_NETHERRAY                   = 70513,\n+    BOT_PET_SPOREBAT                    = 70514,\n+    //ferocity\n+    BOT_PET_CARRIONBIRD                 = 70515,\n+    BOT_PET_RAPTOR                      = 70516,\n+    BOT_PET_WOLF                        = 70517,\n+    BOT_PET_TALLSTRIDER                 = 70518,\n+    BOT_PET_CAT                         = 70519,\n+    BOT_PET_HYENA                       = 70520,\n+    BOT_PET_WASP                        = 70521,\n+    BOT_PET_TEROMOTH                    = 70522,\n+    //tenacity\n+    BOT_PET_SCORPID                     = 70523,\n+    BOT_PET_TURTLE                      = 70524,\n+    BOT_PET_GORILLA                     = 70525,\n+    BOT_PET_BEAR                        = 70526,\n+    BOT_PET_BOAR                        = 70527,\n+    BOT_PET_CRAB                        = 70528,\n+    BOT_PET_CROCOLISK                   = 70529,\n+    BOT_PET_WARPSTALKER                 = 70530,\n+    //cunning (exotic)\n+    BOT_PET_SILITHID                    = 70531,\n+    BOT_PET_CHIMAERA                    = 70532,\n+    //ferocity (exotic)\n+    BOT_PET_SPIRITBEAST                 = 70533,\n+    BOT_PET_COREHOUND                   = 70534,\n+    BOT_PET_DEVILSAUR                   = 70535,\n+    //tenacity (exotic)\n+    BOT_PET_RHINO                       = 70536,\n+    BOT_PET_WORM                        = 70537,\n+\n+    BOT_PET_HUNTER_START                = BOT_PET_SPIDER,\n+    BOT_PET_HUNTER_END_GENERAL          = BOT_PET_WARPSTALKER,\n+    BOT_PET_HUNTER_END_EXOTIC           = BOT_PET_WORM,\n+\n+    BOT_PET_CUNNING_START               = BOT_PET_SPIDER,\n+    BOT_PET_CUNNING_END                 = BOT_PET_SPOREBAT,\n+    BOT_PET_FEROCITY_START              = BOT_PET_CARRIONBIRD,\n+    BOT_PET_FEROCITY_END                = BOT_PET_TEROMOTH,\n+    BOT_PET_TENACITY_START              = BOT_PET_SCORPID,\n+    BOT_PET_TENACITY_END                = BOT_PET_WARPSTALKER,\n+\n+    BOT_PET_EXOTIC_START                = BOT_PET_SILITHID,\n+    BOT_PET_EXOTIC_END                  = BOT_PET_WORM,\n+\n+    //DK\n+    BOT_PET_GHOUL                       = 70538,\n+\n+    BOT_PET_REUSE_1                     = 70539,//REUSE, was BOT_PET_GARGOYLE\n+    BOT_PET_REUSE_2                     = 70540,//REUSE, was BOT_PET_DANCING_RUNE_WEAPON\n+    BOT_PET_REUSE_3                     = 70541,//REUSE, was BOT_PET_AOD_GHOUL\n+\n+    //Priest\n+    BOT_PET_SHADOWFIEND                 = 70542,\n+\n+    //Shaman\n+    BOT_PET_SPIRIT_WOLF                 = 70543,\n+\n+    //Mage\n+    BOT_PET_WATER_ELEMENTAL             = 70544,\n+\n+    //Druid\n+    BOT_PET_FORCE_OF_NATURE             = 70545,\n+\n+    //Archmage\n+    BOT_PET_AWATER_ELEMENTAL            = 70556,\n+\n+    //Dreadlord\n+    BOT_PET_INFERNAL                    = 70562,\n+\n+    //Dark Ranger\n+    BOT_PET_DARK_MINION                 = 70573,\n+    BOT_PET_DARK_MINION_ELITE           = 70574,\n+\n+    //Necromancer\n+    BOT_PET_NECROSKELETON               = 70580,\n+\n+    //Sea Witch\n+    BOT_PET_TORNADO                     = 70586,\n+\n+    //Crypt Lord\n+    BOT_PET_CARRION_BEETLE1             = 70592,\n+    BOT_PET_CARRION_BEETLE2             = 70593,\n+    BOT_PET_CARRION_BEETLE3             = 70594,\n+    BOT_PET_LOCUST_SWARM                = 70595,\n+\n+    BOT_PET_INVALID                     = 99999\n+};\n+\n+enum BotPetOriginalEntries\n+{\n+    ORIGINAL_ENTRY_IMP                  = 416,\n+    ORIGINAL_ENTRY_VOIDWALKER           = 1860,\n+    ORIGINAL_ENTRY_SUCCUBUS             = 1863,\n+    ORIGINAL_ENTRY_FELHUNTER            = 417,\n+    ORIGINAL_ENTRY_FELGUARD             = 17252,\n+    //ORIGINAL_ENTRY_GHOUL                = 26125,\n+    //ORIGINAL_ENTRY_SHADOWFIEND          = 19668,\n+    //ORIGINAL_ENTRY_SPIRIT_WOLF          = 29264,\n+    ORIGINAL_ENTRY_WATER_ELEMENTAL      = 510,\n+    //ORIGINAL_ENTRY_FORCE_OF_NATURE      = 1964,\n+    ORIGINAL_ENTRY_HUNTER_PET           = 1 // from Pet.cpp InitStatsForLevel()\n+};\n+\n+enum BotEquipSlot : uint8\n+{\n+    BOT_SLOT_MAINHAND           = 0,\n+    BOT_SLOT_OFFHAND            = 1,\n+    BOT_SLOT_RANGED             = 2,\n+    BOT_SLOT_HEAD               = 3,\n+    BOT_SLOT_SHOULDERS          = 4,\n+    BOT_SLOT_CHEST              = 5,\n+    BOT_SLOT_WAIST              = 6,\n+    BOT_SLOT_LEGS               = 7,\n+    BOT_SLOT_FEET               = 8,\n+    BOT_SLOT_WRIST              = 9,\n+    BOT_SLOT_HANDS              = 10,\n+    BOT_SLOT_BACK               = 11,\n+    BOT_SLOT_BODY               = 12,\n+    BOT_SLOT_FINGER1            = 13,\n+    BOT_SLOT_FINGER2            = 14,\n+    BOT_SLOT_TRINKET1           = 15,\n+    BOT_SLOT_TRINKET2           = 16,\n+    BOT_SLOT_NECK               = 17,\n+    BOT_INVENTORY_SIZE,\n+\n+    BOT_FIRST_NON_MELEE_SLOT   = BOT_SLOT_RANGED,\n+    BOT_FIRST_NON_WEAPON_SLOT   = BOT_SLOT_RANGED + 1,\n+};\n+\n+inline constexpr uint32 BOT_SLOT_MASK_FINGER1_OR_TRINKET1 = (1<<BOT_SLOT_FINGER1)|(1<<BOT_SLOT_TRINKET1);\n+\n+inline constexpr uint8 BOT_TRANSMOG_INVENTORY_SIZE = 13; // BOT_SLOT_BODY + 1\n+inline constexpr uint8 MAX_BOT_EQUIPMENT_SETS = BOT_GOSSIP_MAX_ITEMS - 2;\n+\n+enum class BotEquipResult : uint8\n+{\n+    BOT_EQUIP_RESULT_OK                         = 0,\n+\n+    BOT_EQUIP_RESULT_FAIL_NO_BAG_SPACE          = 1, //unused\n+    BOT_EQUIP_RESULT_FAIL_NO_BANK_SPACE         = 2,\n+    BOT_EQUIP_RESULT_FAIL_NO_RECEIVER           = 3,\n+    BOT_EQUIP_RESULT_FAIL_INVALID_RECEIVER      = 4,\n+    BOT_EQUIP_RESULT_FAIL_NO_ITEM               = 5,\n+    BOT_EQUIP_RESULT_FAIL_SAME_ID               = 6,\n+    BOT_EQUIP_RESULT_FAIL_WANDERER              = 7,\n+    BOT_EQUIP_RESULT_FAIL_LINKED_UNEQUIP_FAILED = 8,\n+    BOT_EQUIP_RESULT_FAIL_LINKED_RESET_FAILED   = 9,\n+    BOT_EQUIP_RESULT_FAIL_CANT_EQUIP            = 10,\n+    BOT_EQUIP_RESULT_FAIL_ITEM_CONFLICT         = 11,\n+};\n+\n+enum BotStatMods : uint8\n+{\n+    //ItemProtoType.h\n+    BOT_STAT_MOD_MANA                       = 0,\n+    BOT_STAT_MOD_HEALTH                     = 1,\n+    BOT_STAT_MOD_AGILITY                    = 3,\n+    BOT_STAT_MOD_STRENGTH                   = 4,\n+    BOT_STAT_MOD_INTELLECT                  = 5,\n+    BOT_STAT_MOD_SPIRIT                     = 6,\n+    BOT_STAT_MOD_STAMINA                    = 7,\n+    BOT_STAT_MOD_DEFENSE_SKILL_RATING       = 12,\n+    BOT_STAT_MOD_DODGE_RATING               = 13,\n+    BOT_STAT_MOD_PARRY_RATING               = 14,\n+    BOT_STAT_MOD_BLOCK_RATING               = 15,\n+    BOT_STAT_MOD_HIT_MELEE_RATING           = 16,\n+    BOT_STAT_MOD_HIT_RANGED_RATING          = 17,\n+    BOT_STAT_MOD_HIT_SPELL_RATING           = 18,\n+    BOT_STAT_MOD_CRIT_MELEE_RATING          = 19,\n+    BOT_STAT_MOD_CRIT_RANGED_RATING         = 20,\n+    BOT_STAT_MOD_CRIT_SPELL_RATING          = 21,\n+    BOT_STAT_MOD_HIT_TAKEN_MELEE_RATING     = 22,\n+    BOT_STAT_MOD_HIT_TAKEN_RANGED_RATING    = 23,\n+    BOT_STAT_MOD_HIT_TAKEN_SPELL_RATING     = 24,\n+    BOT_STAT_MOD_CRIT_TAKEN_MELEE_RATING    = 25,\n+    BOT_STAT_MOD_CRIT_TAKEN_RANGED_RATING   = 26,\n+    BOT_STAT_MOD_CRIT_TAKEN_SPELL_RATING    = 27,\n+    BOT_STAT_MOD_HASTE_MELEE_RATING         = 28,\n+    BOT_STAT_MOD_HASTE_RANGED_RATING        = 29,\n+    BOT_STAT_MOD_HASTE_SPELL_RATING         = 30,\n+    BOT_STAT_MOD_HIT_RATING                 = 31,\n+    BOT_STAT_MOD_CRIT_RATING                = 32,\n+    BOT_STAT_MOD_HIT_TAKEN_RATING           = 33,\n+    BOT_STAT_MOD_CRIT_TAKEN_RATING          = 34,\n+    BOT_STAT_MOD_RESILIENCE_RATING          = 35,\n+    BOT_STAT_MOD_HASTE_RATING               = 36,\n+    BOT_STAT_MOD_EXPERTISE_RATING           = 37,\n+    BOT_STAT_MOD_ATTACK_POWER               = 38,\n+    BOT_STAT_MOD_RANGED_ATTACK_POWER        = 39,\n+    BOT_STAT_MOD_FERAL_ATTACK_POWER         = 40,\n+    BOT_STAT_MOD_SPELL_HEALING_DONE         = 41,                 // deprecated\n+    BOT_STAT_MOD_SPELL_DAMAGE_DONE          = 42,                 // deprecated\n+    BOT_STAT_MOD_MANA_REGENERATION          = 43,\n+    BOT_STAT_MOD_ARMOR_PENETRATION_RATING   = 44,\n+    BOT_STAT_MOD_SPELL_POWER                = 45,\n+    BOT_STAT_MOD_HEALTH_REGEN               = 46,\n+    BOT_STAT_MOD_SPELL_PENETRATION          = 47,\n+    BOT_STAT_MOD_BLOCK_VALUE                = 48,\n+    //END ItemProtoType.h\n+\n+    BOT_STAT_MOD_DAMAGE_MIN                 = BOT_STAT_MOD_BLOCK_VALUE + 1,\n+    BOT_STAT_MOD_DAMAGE_MAX,\n+    BOT_STAT_MOD_ARMOR,\n+    BOT_STAT_MOD_RESIST_HOLY,\n+    BOT_STAT_MOD_RESIST_FIRE,\n+    BOT_STAT_MOD_RESIST_NATURE,\n+    BOT_STAT_MOD_RESIST_FROST,\n+    BOT_STAT_MOD_RESIST_SHADOW,\n+    BOT_STAT_MOD_RESIST_ARCANE,\n+    BOT_STAT_MOD_EX,\n+    MAX_BOT_ITEM_MOD,\n+\n+    BOT_STAT_MOD_RESISTANCE_START           = BOT_STAT_MOD_ARMOR\n+};\n+\n+enum BotAIResetType\n+{\n+    BOTAI_RESET_INIT                    = 0x01,\n+    BOTAI_RESET_DISMISS                 = 0x02,\n+    BOTAI_RESET_UNBIND                  = 0x04,\n+    BOTAI_RESET_LOGOUT                  = 0x08,\n+    BOTAI_RESET_FORCERECALL             = 0x10,\n+\n+    BOTAI_RESET_MASK_ABANDON_MASTER     = (BOTAI_RESET_INIT | BOTAI_RESET_DISMISS),\n+    BOTAI_RESET_MASK_RESET_MASTER       = (BOTAI_RESET_INIT | BOTAI_RESET_DISMISS | BOTAI_RESET_UNBIND | BOTAI_RESET_LOGOUT)\n+};\n+\n+enum BotMovementType\n+{\n+    BOT_MOVE_POINT                      = 1,\n+    BOT_MOVE_CHASE,\n+    BOT_MOVE_JUMP\n+};\n+\n+enum BotCommandStates : uint32\n+{\n+    BOT_COMMAND_STAY                    = 0x00000001,\n+    BOT_COMMAND_FOLLOW                  = 0x00000002,\n+    BOT_COMMAND_ATTACK                  = 0x00000004,\n+    BOT_COMMAND_COMBATRESET             = 0x00000008,\n+    BOT_COMMAND_FULLSTOP                = 0x00000010,\n+    BOT_COMMAND_ISSUED_ORDER            = 0x00000020,\n+    BOT_COMMAND_WALK                    = 0x00000040,\n+    BOT_COMMAND_NOGOSSIP                = 0x00000080,\n+    BOT_COMMAND_UNBIND                  = 0x00000100,\n+    BOT_COMMAND_NO_CAST                 = 0x00000200,\n+    BOT_COMMAND_NO_CAST_LONG            = 0x00000400,\n+    BOT_COMMAND_INACTION                = 0x00000800,\n+\n+    BOT_COMMAND_MASK_UNCHASE            = BOT_COMMAND_STAY | BOT_COMMAND_FOLLOW | BOT_COMMAND_FULLSTOP | BOT_COMMAND_INACTION,\n+    BOT_COMMAND_MASK_UNMOVING           = BOT_COMMAND_STAY | BOT_COMMAND_FULLSTOP | BOT_COMMAND_ISSUED_ORDER,\n+    BOT_COMMAND_MASK_NOCAST_ANY         = BOT_COMMAND_NO_CAST | BOT_COMMAND_NO_CAST_LONG\n+};\n+\n+enum BotAwaitStates\n+{\n+    BOT_AWAIT_NONE                      = 0x00,\n+    BOT_AWAIT_SEND                      = 0x01\n+};\n+\n+inline constexpr std::size_t MAX_SEND_POINTS = 5u;\n+\n+//Only non-persistent types are allowed\n+enum BotOrderTypes\n+{\n+    BOT_ORDER_NONE          = 0,\n+    BOT_ORDER_SPELLCAST     = 1,\n+    BOT_ORDER_PULL          = 2,\n+\n+    BOT_ORDER_END\n+};\n+inline constexpr bool DEBUG_BOT_ORDERS = false;\n+inline constexpr std::size_t MAX_BOT_ORDERS_QUEUE_SIZE = 3u;\n+\n+enum BotVehicleStrats\n+{\n+    BOT_VEH_STRAT_NONE,\n+    BOT_VEH_STRAT_WYRMREST_SKYTALON,\n+    BOT_VEH_STRAT_RUBY_DRAKE,\n+    BOT_VEH_STRAT_EMERALD_DRAKE,\n+    BOT_VEH_STRAT_AMBER_DRAKE,\n+    BOT_VEH_STRAT_TOC5_MOUNT,\n+    BOT_VEH_STRAT_ULDUAR_DEMOLISHER,\n+    BOT_VEH_STRAT_ULDUAR_SIEGEENGINE,\n+    BOT_VEH_STRAT_ULDUAR_CHOPPER,\n+\n+    BOT_VEH_STRAT_GENERIC\n+};\n+\n+inline constexpr uint32 USABLE_CORPSE_CREATURE_TYPE_MASK = (1u << (CREATURE_TYPE_BEAST-1)) | (1u << (CREATURE_TYPE_DRAGONKIN-1)) | (1u << (CREATURE_TYPE_HUMANOID-1));\n+\n+inline constexpr uint8 GroupIconsFlags[] =\n+{\n+    /*STAR        = */0x001,\n+    /*CIRCLE      = */0x002,\n+    /*DIAMOND     = */0x004,\n+    /*TRIANGLE    = */0x008,\n+    /*MOON        = */0x010,\n+    /*SQUARE      = */0x020,\n+    /*CROSS       = */0x040,\n+    /*SKULL       = */0x080\n+};\n+\n+#endif\ndiff --git a/src/server/game/AI/NpcBots/botconfig.cpp b/src/server/game/AI/NpcBots/botconfig.cpp\nnew file mode 100644\nindex 0000000000..c70369c1f5\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/botconfig.cpp\n@@ -0,0 +1,1344 @@\n+#include \"botcommon.h\"\n+#include \"botconfig.h\"\n+#include \"botdatamgr.h\"\n+#include \"botlog.h\"\n+#include \"Config.h\"\n+#include \"DBCStores.h\"\n+#include \"Group.h\"\n+#include \"Log.h\"\n+#include \"MapManager.h\"\n+#include \"ScriptMgr.h\"\n+#include \"World.h\"\n+\n+/*\n+Npc Bot Config by Trickerer (onlysuffering@gmail.com)\n+*/\n+\n+#ifdef _MSC_VER\n+# pragma warning(push, 4)\n+#endif\n+\n+#ifdef AC_COMPILER\n+# define GetBoolDefault GetOption<bool>\n+# define GetIntDefault GetOption<int32>\n+# define GetFloatDefault GetOption<float>\n+# define GetStringDefault GetOption<std::string>\n+#endif\n+\n+static uint8 _basefollowdist;\n+static uint8 _maxClassNpcBots;\n+static uint8 _maxAccountNpcBots;\n+static uint8 _maxSharedOwners;\n+static uint8 _xpReductionExtraAmount;\n+static uint8 _xpReductionExtraStartingNumber;\n+static uint8 _mountLevel60;\n+static uint8 _mountLevel100;\n+static uint8 _healTargetIconFlags;\n+static uint8 _tankingTargetIconFlags;\n+static uint8 _offTankingTargetIconFlags;\n+static uint8 _dpsTargetIconFlags;\n+static uint8 _rangedDpsTargetIconFlags;\n+static uint8 _noDpsTargetIconFlags;\n+static uint8 _npcBotOwnerExpireMode;\n+static int32 _botInfoPacketsLimit;\n+static uint32 _gearBankCapacity;\n+static uint32 _gearBankEquipmentSetsCount;\n+static uint32 _npcBotsCostHire;\n+static uint32 _npcBotsCostRent;\n+static uint32 _npcBotUpdateDelayBase;\n+static uint32 _npcBotEngageDelayDPS_default;\n+static uint32 _npcBotEngageDelayHeal_default;\n+static uint32 _npcBotOwnerExpireTime;\n+static uint32 _desiredWanderingBotsCount;\n+static uint32 _killrewardWandererMoneyBase;\n+static uint32 _killrewardWandererItemCount;\n+static uint32 _killrewardWandererItemQuality;\n+static uint32 _targetBGPlayersPerTeamCount_AV;\n+static uint32 _targetBGPlayersPerTeamCount_WS;\n+static uint32 _targetBGPlayersPerTeamCount_AB;\n+static uint32 _targetBGPlayersPerTeamCount_EY;\n+static uint32 _targetBGPlayersPerTeamCount_SA;\n+static uint32 _targetBGPlayersPerTeamCount_IC;\n+static uint32 _shared_ownership_options;\n+static bool _enableNpcBots;\n+static bool _logToDB;\n+static bool _xpReductionEnable;\n+static bool _xpReductionGroupOnly;\n+static bool _honorReductionEnable;\n+static bool _honorReductionGroupOnly;\n+static bool _moneyLootShareEnable;\n+static bool _moneyLootShareGroupOnly;\n+static bool _enableNpcBotsDungeons;\n+static bool _enableNpcBotsRaids;\n+static bool _enableNpcBotsBGs;\n+static bool _enableNpcBotsArenas;\n+static bool _enableDungeonFinder;\n+static bool _enableNpcBotsPremade;\n+static bool _limitNpcBotsDungeons;\n+static bool _limitNpcBotsRaids;\n+static bool _hideSpawns;\n+/*static*/bool _botPvP;\n+static bool _botMovementFoodInterrupt;\n+static bool _filterRaces;\n+static bool _displayEquipment;\n+static bool _showCloak;\n+static bool _showHelm;\n+static bool _sendEquipListItems;\n+static bool _enableBotGearBank;\n+static bool _transmog_enable;\n+static bool _transmog_mixArmorClasses;\n+static bool _transmog_mixWeaponClasses;\n+static bool _transmog_mixWeaponInvTypes;\n+static bool _transmog_useEquipmentSlots;\n+static bool _enableclass_warrior;\n+static bool _enableclass_paladin;\n+static bool _enableclass_hunter;\n+static bool _enableclass_rogue;\n+static bool _enableclass_priest;\n+static bool _enableclass_deathknight;\n+static bool _enableclass_shaman;\n+static bool _enableclass_mage;\n+static bool _enableclass_warlock;\n+static bool _enableclass_druid;\n+static bool _enableclass_blademaster;\n+static bool _enableclass_sphynx;\n+static bool _enableclass_archmage;\n+static bool _enableclass_dreadlord;\n+static bool _enableclass_spellbreaker;\n+static bool _enableclass_darkranger;\n+static bool _enableclass_necromancer;\n+static bool _enableclass_seawitch;\n+static bool _enableclass_cryptlord;\n+static bool _enableclass_wander_warrior;\n+static bool _enableclass_wander_paladin;\n+static bool _enableclass_wander_hunter;\n+static bool _enableclass_wander_rogue;\n+static bool _enableclass_wander_priest;\n+static bool _enableclass_wander_deathknight;\n+static bool _enableclass_wander_shaman;\n+static bool _enableclass_wander_mage;\n+static bool _enableclass_wander_warlock;\n+static bool _enableclass_wander_druid;\n+static bool _enableclass_wander_blademaster;\n+static bool _enableclass_wander_sphynx;\n+static bool _enableclass_wander_archmage;\n+static bool _enableclass_wander_dreadlord;\n+static bool _enableclass_wander_spellbreaker;\n+static bool _enableclass_wander_darkranger;\n+static bool _enableclass_wander_necromancer;\n+static bool _enableclass_wander_seawitch;\n+static bool _enableclass_wander_cryptlord;\n+static bool _enrageOnDismiss;\n+static bool _botStatLimits;\n+static bool _enableWanderingBotsBG;\n+static bool _enableConfigLevelCapBG;\n+static bool _enableConfigLevelCapBGFirst;\n+static bool _bothk_enable;\n+static bool _bothk_message_enable;\n+static bool _bothk_achievements_enable;\n+static bool _untarget_wnpc_questgiver;\n+static bool _untarget_wnpc_flightmaster;\n+static float _botStatLimits_dodge;\n+static float _botStatLimits_parry;\n+static float _botStatLimits_block;\n+static float _botStatLimits_crit;\n+static float _mult_dmg_physical;\n+static float _mult_dmg_spell;\n+static float _mult_healing;\n+static float _mult_hp;\n+static float _mult_dmg_wanderer;\n+static float _mult_healing_wanderer;\n+static float _mult_hp_wanderer;\n+static float _mult_speed_wanderer;\n+static float _mult_xpgain_wanderer;\n+static float _mult_dmg_warrior;\n+static float _mult_dmg_paladin;\n+static float _mult_dmg_hunter;\n+static float _mult_dmg_rogue;\n+static float _mult_dmg_priest;\n+static float _mult_dmg_deathknight;\n+static float _mult_dmg_shaman;\n+static float _mult_dmg_mage;\n+static float _mult_dmg_warlock;\n+static float _mult_dmg_druid;\n+static float _mult_dmg_blademaster;\n+static float _mult_dmg_obsidiandestroyer;\n+static float _mult_dmg_archmage;\n+static float _mult_dmg_dreadlord;\n+static float _mult_dmg_spellbreaker;\n+static float _mult_dmg_darkranger;\n+static float _mult_dmg_necromancer;\n+static float _mult_dmg_seawitch;\n+static float _mult_dmg_cryptlord;\n+static float _bothk_rate_honor;\n+static std::vector<float> _mult_dmg_levels;\n+static std::vector<float> _mult_heal_levels;\n+static std::vector<float> _mult_hp_levels;\n+static std::vector<float> _mult_mp_levels;\n+static LvlBrackets _max_npcbots;\n+static PctBrackets _botwanderer_pct_level_brackets;\n+static ItemLvlBrackets _botwanderer_itemlvl_level_brackets;\n+static std::vector<uint32> _disabled_instance_maps;\n+static std::vector<uint32> _enabled_wander_node_maps;\n+\n+void AddSC_botconfig_scripts();\n+void AddSC_death_knight_bot();\n+void AddSC_druid_bot();\n+void AddSC_hunter_bot();\n+void AddSC_mage_bot();\n+void AddSC_paladin_bot();\n+void AddSC_priest_bot();\n+void AddSC_rogue_bot();\n+void AddSC_shaman_bot();\n+void AddSC_warlock_bot();\n+void AddSC_warrior_bot();\n+void AddSC_blademaster_bot();\n+void AddSC_sphynx_bot();\n+void AddSC_archmage_bot();\n+void AddSC_dreadlord_bot();\n+void AddSC_spellbreaker_bot();\n+void AddSC_dark_ranger_bot();\n+void AddSC_necromancer_bot();\n+void AddSC_sea_witch_bot();\n+void AddSC_crypt_lord_bot();\n+void AddSC_archmage_bot_pets();\n+void AddSC_dreadlord_bot_pets();\n+void AddSC_dark_ranger_bot_pets();\n+void AddSC_necromancer_bot_pets();\n+void AddSC_sea_witch_bot_pets();\n+void AddSC_crypt_lord_bot_pets();\n+void AddSC_hunter_bot_pets();\n+void AddSC_warlock_bot_pets();\n+void AddSC_deathknight_bot_pets();\n+void AddSC_priest_bot_pets();\n+void AddSC_shaman_bot_pets();\n+void AddSC_mage_bot_pets();\n+void AddSC_druid_bot_pets();\n+void AddSC_script_bot_commands();\n+void AddSC_script_bot_giver();\n+void AddSC_botdatamgr_scripts();\n+\n+void AddNpcBotScripts()\n+{\n+    AddSC_botconfig_scripts();\n+    AddSC_death_knight_bot();\n+    AddSC_druid_bot();\n+    AddSC_hunter_bot();\n+    AddSC_mage_bot();\n+    AddSC_paladin_bot();\n+    AddSC_priest_bot();\n+    AddSC_rogue_bot();\n+    AddSC_shaman_bot();\n+    AddSC_warlock_bot();\n+    AddSC_warrior_bot();\n+    AddSC_blademaster_bot();\n+    AddSC_sphynx_bot();\n+    AddSC_archmage_bot();\n+    AddSC_dreadlord_bot();\n+    AddSC_spellbreaker_bot();\n+    AddSC_dark_ranger_bot();\n+    AddSC_necromancer_bot();\n+    AddSC_sea_witch_bot();\n+    AddSC_crypt_lord_bot();\n+    AddSC_archmage_bot_pets();\n+    AddSC_dreadlord_bot_pets();\n+    AddSC_dark_ranger_bot_pets();\n+    AddSC_necromancer_bot_pets();\n+    AddSC_sea_witch_bot_pets();\n+    AddSC_crypt_lord_bot_pets();\n+    AddSC_hunter_bot_pets();\n+    AddSC_warlock_bot_pets();\n+    AddSC_deathknight_bot_pets();\n+    AddSC_priest_bot_pets();\n+    AddSC_shaman_bot_pets();\n+    AddSC_mage_bot_pets();\n+    AddSC_druid_bot_pets();\n+    AddSC_script_bot_commands();\n+    AddSC_script_bot_giver();\n+    AddSC_botdatamgr_scripts();\n+}\n+\n+class NPCBotsConfigScript : public WorldScript\n+{\n+public:\n+    NPCBotsConfigScript() : WorldScript(\"NPCBotsConfigScript\") { }\n+\n+    void OnConfigLoad(bool reload) override\n+    {\n+        _initNpcbotsConfig(reload);\n+    }\n+\n+    static void ReloadConfig()\n+    {\n+        BOT_LOG_INFO(\"misc\", \"Re-Loading config settings...\");\n+        sWorld->LoadConfigSettings(true);\n+        sMapMgr->InitializeVisibilityDistanceInfo();\n+        BOT_LOG_INFO(\"misc\", \"World config settings reloaded.\");\n+    }\n+\n+private:\n+    static void _initNpcbotsConfig(bool reload)\n+    {\n+        _loadConfig(reload);\n+\n+        BOT_LOG_INFO(\"server.loading\", \">> NPCBots config {}.\", reload ? \"re-loaded\" : \"loaded\");\n+\n+        if (_enableNpcBots)\n+            BOT_LOG_INFO(\"server.loading\", \">> NPCBots system enabled\");\n+    }\n+\n+    static void _loadConfig(bool reload)\n+    {\n+        _enableNpcBots                  = sConfigMgr->GetBoolDefault(\"NpcBot.Enable\", true);\n+        _logToDB                        = sConfigMgr->GetBoolDefault(\"NpcBot.LogToDB\", true);\n+        _maxClassNpcBots                = sConfigMgr->GetIntDefault(\"NpcBot.MaxBotsPerClass\", 1);\n+        _maxAccountNpcBots              = sConfigMgr->GetIntDefault(\"NpcBot.MaxBotsPerAccount\", 0);\n+        _filterRaces                    = sConfigMgr->GetBoolDefault(\"NpcBot.Botgiver.FilterRaces\", false);\n+        _shared_ownership_options       = sConfigMgr->GetIntDefault(\"NpcBot.SharedOwnership.Options\", 0);\n+        _maxSharedOwners                = sConfigMgr->GetIntDefault(\"NpcBot.SharedOwnership.MaxOwners\", 0);\n+        _basefollowdist                 = sConfigMgr->GetIntDefault(\"NpcBot.BaseFollowDistance\", 30);\n+        _xpReductionEnable              = sConfigMgr->GetBoolDefault(\"NpcBot.XpReduction.Enable\", false);\n+        _xpReductionGroupOnly           = sConfigMgr->GetBoolDefault(\"NpcBot.XpReduction.GroupOnly\", false);\n+        _xpReductionExtraAmount         = sConfigMgr->GetIntDefault(\"NpcBot.XpReduction.Extra.Amount\", 0);\n+        _xpReductionExtraStartingNumber = sConfigMgr->GetIntDefault(\"NpcBot.XpReduction.Extra.StartingNumber\", 2);\n+        _honorReductionEnable           = sConfigMgr->GetBoolDefault(\"NpcBot.HonorReduction.Enable\", false);\n+        _honorReductionGroupOnly        = sConfigMgr->GetBoolDefault(\"NpcBot.HonorReduction.GroupOnly\", false);\n+        _moneyLootShareEnable           = sConfigMgr->GetBoolDefault(\"NpcBot.MoneyShare.Enable\", false);\n+        _moneyLootShareGroupOnly        = sConfigMgr->GetBoolDefault(\"NpcBot.MoneyShare.GroupOnly\", false);\n+        _mountLevel60                   = sConfigMgr->GetIntDefault(\"NpcBot.MountLevel.60\", 20);\n+        _mountLevel100                  = sConfigMgr->GetIntDefault(\"NpcBot.MountLevel.100\", 40);\n+        _healTargetIconFlags            = sConfigMgr->GetIntDefault(\"NpcBot.HealTargetIconMask\", 0);\n+        _tankingTargetIconFlags         = sConfigMgr->GetIntDefault(\"NpcBot.TankTargetIconMask\", 0);\n+        _offTankingTargetIconFlags      = sConfigMgr->GetIntDefault(\"NpcBot.OffTankTargetIconMask\", 0);\n+        _dpsTargetIconFlags             = sConfigMgr->GetIntDefault(\"NpcBot.DPSTargetIconMask\", 0);\n+        _rangedDpsTargetIconFlags       = sConfigMgr->GetIntDefault(\"NpcBot.RangedDPSTargetIconMask\", 0);\n+        _noDpsTargetIconFlags           = sConfigMgr->GetIntDefault(\"NpcBot.NoDPSTargetIconMask\", 0);\n+        _mult_dmg_physical              = sConfigMgr->GetFloatDefault(\"NpcBot.Mult.Damage.Physical\", 1.0f);\n+        _mult_dmg_spell                 = sConfigMgr->GetFloatDefault(\"NpcBot.Mult.Damage.Spell\", 1.0f);\n+        _mult_healing                   = sConfigMgr->GetFloatDefault(\"NpcBot.Mult.Healing\", 1.0f);\n+        _mult_hp                        = sConfigMgr->GetFloatDefault(\"NpcBot.Mult.HP\", 1.0f);\n+        _mult_dmg_wanderer              = sConfigMgr->GetFloatDefault(\"NpcBot.Mult.Wanderer.Damage\", 1.0f);\n+        _mult_healing_wanderer          = sConfigMgr->GetFloatDefault(\"NpcBot.Mult.Wanderer.Healing\", 1.0f);\n+        _mult_hp_wanderer               = sConfigMgr->GetFloatDefault(\"NpcBot.Mult.Wanderer.HP\", 1.0f);\n+        _mult_speed_wanderer            = sConfigMgr->GetFloatDefault(\"NpcBot.Mult.Wanderer.Speed\", 1.0f);\n+        _mult_dmg_warrior               = sConfigMgr->GetFloatDefault(\"NpcBot.Mult.Damage.Warrior\", 1.0f);\n+        _mult_dmg_paladin               = sConfigMgr->GetFloatDefault(\"NpcBot.Mult.Damage.Paladin\", 1.0f);\n+        _mult_dmg_hunter                = sConfigMgr->GetFloatDefault(\"NpcBot.Mult.Damage.Hunter\", 1.0f);\n+        _mult_dmg_rogue                 = sConfigMgr->GetFloatDefault(\"NpcBot.Mult.Damage.Rogue\", 1.0f);\n+        _mult_dmg_priest                = sConfigMgr->GetFloatDefault(\"NpcBot.Mult.Damage.Priest\", 1.0f);\n+        _mult_dmg_deathknight           = sConfigMgr->GetFloatDefault(\"NpcBot.Mult.Damage.DeathKnight\", 1.0f);\n+        _mult_dmg_shaman                = sConfigMgr->GetFloatDefault(\"NpcBot.Mult.Damage.Shaman\", 1.0f);\n+        _mult_dmg_mage                  = sConfigMgr->GetFloatDefault(\"NpcBot.Mult.Damage.Mage\", 1.0f);\n+        _mult_dmg_warlock               = sConfigMgr->GetFloatDefault(\"NpcBot.Mult.Damage.Warlock\", 1.0f);\n+        _mult_dmg_druid                 = sConfigMgr->GetFloatDefault(\"NpcBot.Mult.Damage.Druid\", 1.0f);\n+        _mult_dmg_blademaster           = sConfigMgr->GetFloatDefault(\"NpcBot.Mult.Damage.Blademaster\", 1.0f);\n+        _mult_dmg_obsidiandestroyer     = sConfigMgr->GetFloatDefault(\"NpcBot.Mult.Damage.ObsidianDestroyer\", 1.0f);\n+        _mult_dmg_archmage              = sConfigMgr->GetFloatDefault(\"NpcBot.Mult.Damage.Archmage\", 1.0f);\n+        _mult_dmg_dreadlord             = sConfigMgr->GetFloatDefault(\"NpcBot.Mult.Damage.Dreadlord\", 1.0f);\n+        _mult_dmg_spellbreaker          = sConfigMgr->GetFloatDefault(\"NpcBot.Mult.Damage.SpellBreaker\", 1.0f);\n+        _mult_dmg_darkranger            = sConfigMgr->GetFloatDefault(\"NpcBot.Mult.Damage.DarkRanger\", 1.0f);\n+        _mult_dmg_necromancer           = sConfigMgr->GetFloatDefault(\"NpcBot.Mult.Damage.Necromancer\", 1.0f);\n+        _mult_dmg_seawitch              = sConfigMgr->GetFloatDefault(\"NpcBot.Mult.Damage.SeaWitch\", 1.0f);\n+        _mult_dmg_cryptlord             = sConfigMgr->GetFloatDefault(\"NpcBot.Mult.Damage.CryptLord\", 1.0f);\n+        _enableNpcBotsDungeons          = sConfigMgr->GetBoolDefault(\"NpcBot.Enable.Dungeon\", true);\n+        _enableNpcBotsRaids             = sConfigMgr->GetBoolDefault(\"NpcBot.Enable.Raid\", false);\n+        _enableNpcBotsBGs               = sConfigMgr->GetBoolDefault(\"NpcBot.Enable.BG\", false);\n+        _enableNpcBotsArenas            = sConfigMgr->GetBoolDefault(\"NpcBot.Enable.Arena\", false);\n+        _enableDungeonFinder            = sConfigMgr->GetBoolDefault(\"NpcBot.Enable.DungeonFinder\", true);\n+        _enableNpcBotsPremade           = sConfigMgr->GetBoolDefault(\"NpcBot.Premade.Enable\", false);\n+        _limitNpcBotsDungeons           = sConfigMgr->GetBoolDefault(\"NpcBot.Limit.Dungeon\", true);\n+        _limitNpcBotsRaids              = sConfigMgr->GetBoolDefault(\"NpcBot.Limit.Raid\", true);\n+        _hideSpawns                     = sConfigMgr->GetBoolDefault(\"NpcBot.HideSpawns\", false);\n+        _botInfoPacketsLimit            = sConfigMgr->GetIntDefault(\"NpcBot.InfoPacketsLimit\", -1);\n+        _npcBotsCostHire                = sConfigMgr->GetIntDefault(\"NpcBot.Cost.Hire\", 1000000);\n+        _npcBotsCostRent                = sConfigMgr->GetIntDefault(\"NpcBot.Cost.Rent\", 0);\n+        _npcBotUpdateDelayBase          = sConfigMgr->GetIntDefault(\"NpcBot.UpdateDelay.Base\", 0);\n+        _npcBotEngageDelayDPS_default   = sConfigMgr->GetIntDefault(\"NpcBot.EngageDelay.DPS\", 0);\n+        _npcBotEngageDelayHeal_default  = sConfigMgr->GetIntDefault(\"NpcBot.EngageDelay.Heal\", 0);\n+        _npcBotOwnerExpireTime          = sConfigMgr->GetIntDefault(\"NpcBot.OwnershipExpireTime\", 0);\n+        _npcBotOwnerExpireMode          = sConfigMgr->GetIntDefault(\"NpcBot.OwnershipExpireMode\", 0);\n+        _botPvP                         = sConfigMgr->GetBoolDefault(\"NpcBot.PvP\", true);\n+        _botMovementFoodInterrupt       = sConfigMgr->GetBoolDefault(\"NpcBot.Movements.InterruptFood\", false);\n+        _displayEquipment               = sConfigMgr->GetBoolDefault(\"NpcBot.EquipmentDisplay.Enable\", true);\n+        _showCloak                      = sConfigMgr->GetBoolDefault(\"NpcBot.EquipmentDisplay.ShowCloak\", true);\n+        _showHelm                       = sConfigMgr->GetBoolDefault(\"NpcBot.EquipmentDisplay.ShowHelm\", false);\n+        _sendEquipListItems             = sConfigMgr->GetBoolDefault(\"NpcBot.Gossip.ShowEquipmentListItems\", false);\n+        _enableBotGearBank              = sConfigMgr->GetBoolDefault(\"NpcBot.GearBank.Enable\", true);\n+        _gearBankCapacity               = sConfigMgr->GetIntDefault(\"NpcBot.GearBank.Capacity\", 40);\n+        _gearBankEquipmentSetsCount     = sConfigMgr->GetIntDefault(\"NpcBot.GearBank.EquipmentSets\", 0);\n+        _transmog_enable                = sConfigMgr->GetBoolDefault(\"NpcBot.Transmog.Enable\", false);\n+        _transmog_mixArmorClasses       = sConfigMgr->GetBoolDefault(\"NpcBot.Transmog.MixArmorClasses\", false);\n+        _transmog_mixWeaponClasses      = sConfigMgr->GetBoolDefault(\"NpcBot.Transmog.MixWeaponClasses\", false);\n+        _transmog_mixWeaponInvTypes     = sConfigMgr->GetBoolDefault(\"NpcBot.Transmog.MixWeaponInventoryTypes\", false);\n+        _transmog_useEquipmentSlots     = sConfigMgr->GetBoolDefault(\"NpcBot.Transmog.UseEquipmentSlots\", false);\n+        _enableclass_warrior            = sConfigMgr->GetBoolDefault(\"NpcBot.Classes.Warrior.Enable\", true);\n+        _enableclass_paladin            = sConfigMgr->GetBoolDefault(\"NpcBot.Classes.Paladin.Enable\", true);\n+        _enableclass_hunter             = sConfigMgr->GetBoolDefault(\"NpcBot.Classes.Hunter.Enable\", true);\n+        _enableclass_rogue              = sConfigMgr->GetBoolDefault(\"NpcBot.Classes.Rogue.Enable\", true);\n+        _enableclass_priest             = sConfigMgr->GetBoolDefault(\"NpcBot.Classes.Priest.Enable\", true);\n+        _enableclass_deathknight        = sConfigMgr->GetBoolDefault(\"NpcBot.Classes.DeathKnight.Enable\", true);\n+        _enableclass_shaman             = sConfigMgr->GetBoolDefault(\"NpcBot.Classes.Shaman.Enable\", true);\n+        _enableclass_mage               = sConfigMgr->GetBoolDefault(\"NpcBot.Classes.Mage.Enable\", true);\n+        _enableclass_warlock            = sConfigMgr->GetBoolDefault(\"NpcBot.Classes.Warlock.Enable\", true);\n+        _enableclass_druid              = sConfigMgr->GetBoolDefault(\"NpcBot.Classes.Druid.Enable\", true);\n+        _enableclass_blademaster        = sConfigMgr->GetBoolDefault(\"NpcBot.Classes.Blademaster.Enable\", false);\n+        _enableclass_sphynx             = sConfigMgr->GetBoolDefault(\"NpcBot.Classes.ObsidianDestroyer.Enable\", true);\n+        _enableclass_archmage           = sConfigMgr->GetBoolDefault(\"NpcBot.Classes.Archmage.Enable\", true);\n+        _enableclass_dreadlord          = sConfigMgr->GetBoolDefault(\"NpcBot.Classes.Dreadlord.Enable\", true);\n+        _enableclass_spellbreaker       = sConfigMgr->GetBoolDefault(\"NpcBot.Classes.SpellBreaker.Enable\", true);\n+        _enableclass_darkranger         = sConfigMgr->GetBoolDefault(\"NpcBot.Classes.DarkRanger.Enable\", true);\n+        _enableclass_necromancer        = sConfigMgr->GetBoolDefault(\"NpcBot.Classes.Necromancer.Enable\", true);\n+        _enableclass_seawitch           = sConfigMgr->GetBoolDefault(\"NpcBot.Classes.SeaWitch.Enable\", true);\n+        _enableclass_cryptlord          = sConfigMgr->GetBoolDefault(\"NpcBot.Classes.CryptLord.Enable\", true);\n+        _enableclass_wander_warrior     = sConfigMgr->GetBoolDefault(\"NpcBot.WanderingBots.Classes.Warrior.Enable\", true);\n+        _enableclass_wander_paladin     = sConfigMgr->GetBoolDefault(\"NpcBot.WanderingBots.Classes.Paladin.Enable\", true);\n+        _enableclass_wander_hunter      = sConfigMgr->GetBoolDefault(\"NpcBot.WanderingBots.Classes.Hunter.Enable\", true);\n+        _enableclass_wander_rogue       = sConfigMgr->GetBoolDefault(\"NpcBot.WanderingBots.Classes.Rogue.Enable\", true);\n+        _enableclass_wander_priest      = sConfigMgr->GetBoolDefault(\"NpcBot.WanderingBots.Classes.Priest.Enable\", true);\n+        _enableclass_wander_deathknight = sConfigMgr->GetBoolDefault(\"NpcBot.WanderingBots.Classes.DeathKnight.Enable\", true);\n+        _enableclass_wander_shaman      = sConfigMgr->GetBoolDefault(\"NpcBot.WanderingBots.Classes.Shaman.Enable\", true);\n+        _enableclass_wander_mage        = sConfigMgr->GetBoolDefault(\"NpcBot.WanderingBots.Classes.Mage.Enable\", true);\n+        _enableclass_wander_warlock     = sConfigMgr->GetBoolDefault(\"NpcBot.WanderingBots.Classes.Warlock.Enable\", true);\n+        _enableclass_wander_druid       = sConfigMgr->GetBoolDefault(\"NpcBot.WanderingBots.Classes.Druid.Enable\", true);\n+        _enableclass_wander_blademaster = sConfigMgr->GetBoolDefault(\"NpcBot.WanderingBots.Classes.Blademaster.Enable\", false);\n+        _enableclass_wander_sphynx      = sConfigMgr->GetBoolDefault(\"NpcBot.WanderingBots.Classes.ObsidianDestroyer.Enable\", true);\n+        _enableclass_wander_archmage    = sConfigMgr->GetBoolDefault(\"NpcBot.WanderingBots.Classes.Archmage.Enable\", true);\n+        _enableclass_wander_dreadlord   = sConfigMgr->GetBoolDefault(\"NpcBot.WanderingBots.Classes.Dreadlord.Enable\", true);\n+        _enableclass_wander_spellbreaker= sConfigMgr->GetBoolDefault(\"NpcBot.WanderingBots.Classes.SpellBreaker.Enable\", true);\n+        _enableclass_wander_darkranger  = sConfigMgr->GetBoolDefault(\"NpcBot.WanderingBots.Classes.DarkRanger.Enable\", true);\n+        _enableclass_wander_necromancer = sConfigMgr->GetBoolDefault(\"NpcBot.WanderingBots.Classes.Necromancer.Enable\", true);\n+        _enableclass_wander_seawitch    = sConfigMgr->GetBoolDefault(\"NpcBot.WanderingBots.Classes.SeaWitch.Enable\", true);\n+        _enableclass_wander_cryptlord   = sConfigMgr->GetBoolDefault(\"NpcBot.WanderingBots.Classes.CryptLord.Enable\", true);\n+        _untarget_wnpc_questgiver       = sConfigMgr->GetBoolDefault(\"NpcBot.WanderingBots.SkipTarget.Questgiver\", false);\n+        _untarget_wnpc_flightmaster     = sConfigMgr->GetBoolDefault(\"NpcBot.WanderingBots.SkipTarget.Flightmaster\", false);\n+        _enrageOnDismiss                = sConfigMgr->GetBoolDefault(\"NpcBot.EnrageOnDismiss\", true);\n+        _botStatLimits                  = sConfigMgr->GetBoolDefault(\"NpcBot.Stats.Limits.Enable\", false);\n+        _botStatLimits_dodge            = sConfigMgr->GetFloatDefault(\"NpcBot.Stats.Limits.Dodge\", 95.0f);\n+        _botStatLimits_parry            = sConfigMgr->GetFloatDefault(\"NpcBot.Stats.Limits.Parry\", 95.0f);\n+        _botStatLimits_block            = sConfigMgr->GetFloatDefault(\"NpcBot.Stats.Limits.Block\", 95.0f);\n+        _botStatLimits_crit             = sConfigMgr->GetFloatDefault(\"NpcBot.Stats.Limits.Crit\", 95.0f);\n+        _desiredWanderingBotsCount      = sConfigMgr->GetIntDefault(\"NpcBot.WanderingBots.Continents.Count\", 0);\n+        _killrewardWandererMoneyBase    = sConfigMgr->GetIntDefault(\"NpcBot.WanderingBots.KillReward.Money\", 0);\n+        _killrewardWandererItemCount    = sConfigMgr->GetIntDefault(\"NpcBot.WanderingBots.KillReward.ItemCount\", 0);\n+        _killrewardWandererItemQuality  = sConfigMgr->GetIntDefault(\"NpcBot.WanderingBots.KillReward.ItemQuality\", int(ITEM_QUALITY_RARE));\n+        _mult_xpgain_wanderer           = sConfigMgr->GetFloatDefault(\"NpcBot.WanderingBots.Continents.XPGain\", 1.0f);\n+        _enableWanderingBotsBG          = sConfigMgr->GetBoolDefault(\"NpcBot.WanderingBots.BG.Enable\", false);\n+        _enableConfigLevelCapBG         = sConfigMgr->GetBoolDefault(\"NpcBot.WanderingBots.BG.CapLevel\", false);\n+        _enableConfigLevelCapBGFirst    = sConfigMgr->GetBoolDefault(\"NpcBot.WanderingBots.BG.CapLevelByFirstPlayer\", false);\n+        _targetBGPlayersPerTeamCount_AV = sConfigMgr->GetIntDefault(\"NpcBot.WanderingBots.BG.TargetTeamPlayersCount.AV\", 30);\n+        _targetBGPlayersPerTeamCount_WS = sConfigMgr->GetIntDefault(\"NpcBot.WanderingBots.BG.TargetTeamPlayersCount.WS\", 8);\n+        _targetBGPlayersPerTeamCount_AB = sConfigMgr->GetIntDefault(\"NpcBot.WanderingBots.BG.TargetTeamPlayersCount.AB\", 12);\n+        _targetBGPlayersPerTeamCount_EY = sConfigMgr->GetIntDefault(\"NpcBot.WanderingBots.BG.TargetTeamPlayersCount.EY\", 12);\n+        _targetBGPlayersPerTeamCount_SA = sConfigMgr->GetIntDefault(\"NpcBot.WanderingBots.BG.TargetTeamPlayersCount.SA\", 0);\n+        _targetBGPlayersPerTeamCount_IC = sConfigMgr->GetIntDefault(\"NpcBot.WanderingBots.BG.TargetTeamPlayersCount.IC\", 0);\n+        _bothk_enable                   = sConfigMgr->GetBoolDefault(\"NpcBot.HK.Enable\", true);\n+        _bothk_message_enable           = sConfigMgr->GetBoolDefault(\"NpcBot.HK.Message.Enable\", false);\n+        _bothk_achievements_enable      = sConfigMgr->GetBoolDefault(\"NpcBot.HK.Achievements.Enable\", false);\n+        _bothk_rate_honor               = sConfigMgr->GetFloatDefault(\"NpcBot.HK.Rate.Honor\", 1.0);\n+\n+        if (reload)\n+            BotLogger::Log(NPCBOT_LOG_CONFIG_RELOAD, uint32(0));\n+\n+        _max_npcbots = {};\n+        std::string max_npcbots_by_levels = sConfigMgr->GetStringDefault(\"NpcBot.MaxBots\", \"1,1,1,1,1,1,1,1,1\");\n+        std::vector<std::string_view> toks0 = Bcore::Tokenize(max_npcbots_by_levels, ',', false);\n+        ASSERT(toks0.size() == BRACKETS_COUNT, \"NpcBot.MaxBots must have exactly %u values\", uint32(BRACKETS_COUNT));\n+        for (std::size_t i{}; i != toks0.size(); ++i)\n+        {\n+            Optional<uint8> val = Bcore::StringTo<uint8>(toks0[i]);\n+            if (val == std::nullopt)\n+                BOT_LOG_ERROR(\"server.loading\", \"NpcBot.MaxBots contains invalid uint8 value '{}', set to default\", toks0[i]);\n+            uint8 uval = val.value_or(uint8(0));\n+            if (i > 0)\n+            {\n+                uint8 prev = _max_npcbots[i - 1];\n+                if (prev > uval)\n+                {\n+                    BOT_LOG_WARN(\"server.loading\", \"NpcBot.MaxBots value at offset {} is {} which is lower than previous value {}!\", uint32(i), uint32(uval), uint32(prev));\n+                    //uval = prev;\n+                }\n+                if (uval >= MAX_RAID_SIZE)\n+                {\n+                    BOT_LOG_ERROR(\"server.loading\", \"NpcBot.MaxBots value at offset {} is {} > 39, enforcing max value!\", uint32(i), uint32(uval));\n+                    uval = uint8(MAX_RAID_SIZE - 1);\n+                }\n+            }\n+            _max_npcbots[i] = uval;\n+        }\n+\n+        _mult_dmg_levels.clear();\n+        std::string mult_dps_by_levels = sConfigMgr->GetStringDefault(\"NpcBot.Mult.Damage.Levels\", \"1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0\");\n+        std::vector<std::string_view> toks1 = Bcore::Tokenize(mult_dps_by_levels, ',', false);\n+        ASSERT(toks1.size() >= BRACKETS_COUNT, \"NpcBot.Mult.Damage.Levels must have at least %u values\", uint32(BRACKETS_COUNT));\n+        for (std::size_t i{}; i != toks1.size(); ++i)\n+        {\n+            Optional<float> val = Bcore::StringTo<float>(toks1[i]);\n+            if (val == std::nullopt)\n+                BOT_LOG_ERROR(\"server.loading\", \"NpcBot.Mult.Damage.Levels contains invalid float value '{}', set to default\", toks1[i]);\n+            float fval = val.value_or(1.0f);\n+            RoundToInterval(fval, 0.1f, 10.f);\n+            _mult_dmg_levels.push_back(fval);\n+        }\n+\n+        _mult_heal_levels.clear();\n+        std::string mult_healing_by_levels = sConfigMgr->GetStringDefault(\"NpcBot.Mult.Healing.Levels\", \"1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0\");\n+        std::vector<std::string_view> toks5 = Bcore::Tokenize(mult_healing_by_levels, ',', false);\n+        ASSERT(toks5.size() >= BRACKETS_COUNT, \"NpcBot.Mult.Healing.Levels must have at least %u values\", uint32(BRACKETS_COUNT));\n+        for (std::size_t i{}; i != toks5.size(); ++i)\n+        {\n+            Optional<float> val = Bcore::StringTo<float>(toks5[i]);\n+            if (val == std::nullopt)\n+                BOT_LOG_ERROR(\"server.loading\", \"NpcBot.Mult.Healing.Levels contains invalid float value '{}', set to default\", toks5[i]);\n+            float fval = val.value_or(1.0f);\n+            RoundToInterval(fval, 0.1f, 10.f);\n+            _mult_heal_levels.push_back(fval);\n+        }\n+\n+        _mult_hp_levels.clear();\n+        std::string mult_hp_by_levels = sConfigMgr->GetStringDefault(\"NpcBot.Mult.HP.Levels\", \"1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0\");\n+        std::vector<std::string_view> toks6 = Bcore::Tokenize(mult_hp_by_levels, ',', false);\n+        ASSERT(toks6.size() >= BRACKETS_COUNT, \"NpcBot.Mult.HP.Levels must have at least %u values\", uint32(BRACKETS_COUNT));\n+        for (std::size_t i{}; i != toks6.size(); ++i)\n+        {\n+            Optional<float> val = Bcore::StringTo<float>(toks6[i]);\n+            if (val == std::nullopt)\n+                BOT_LOG_ERROR(\"server.loading\", \"NpcBot.Mult.HP.Levels contains invalid float value '{}', set to default\", toks6[i]);\n+            float fval = val.value_or(1.0f);\n+            RoundToInterval(fval, 0.1f, 10.f);\n+            _mult_hp_levels.push_back(fval);\n+        }\n+\n+        _mult_mp_levels.clear();\n+        std::string mult_mp_by_levels = sConfigMgr->GetStringDefault(\"NpcBot.Mult.MP.Levels\", \"1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0\");\n+        std::vector<std::string_view> toks7 = Bcore::Tokenize(mult_mp_by_levels, ',', false);\n+        ASSERT(toks7.size() >= BRACKETS_COUNT, \"NpcBot.Mult.MP.Levels must have at least %u values\", uint32(BRACKETS_COUNT));\n+        for (std::size_t i{}; i != toks7.size(); ++i)\n+        {\n+            Optional<float> val = Bcore::StringTo<float>(toks7[i]);\n+            if (val == std::nullopt)\n+                BOT_LOG_ERROR(\"server.loading\", \"NpcBot.Mult.MP.Levels contains invalid float value '{}', set to default\", toks7[i]);\n+            float fval = val.value_or(1.0f);\n+            RoundToInterval(fval, 0.1f, 10.f);\n+            _mult_mp_levels.push_back(fval);\n+        }\n+\n+        _botwanderer_pct_level_brackets = {};\n+        std::string wanderers_by_levels = sConfigMgr->GetStringDefault(\"NpcBot.WanderingBots.Continents.Levels\", \"20,15,15,10,10,15,15,0,0\");\n+        std::vector<std::string_view> toks2 = Bcore::Tokenize(wanderers_by_levels, ',', false);\n+        ASSERT(toks2.size() == BRACKETS_COUNT, \"NpcBot.WanderingBots.Continents.Levels must have exactly %u values\", uint32(BRACKETS_COUNT));\n+        uint32 total_pct = 0;\n+        for (std::size_t i{}; i != toks2.size(); ++i)\n+        {\n+            Optional<uint32> val = Bcore::StringTo<uint32>(toks2[i]);\n+            if (val == std::nullopt)\n+                BOT_LOG_ERROR(\"server.loading\", \"NpcBot.WanderingBots.Continents.Levels contains invalid uint32 value '{}', set to default\", toks2[i]);\n+            uint32 uval = val.value_or(uint32(0));\n+            total_pct += uval;\n+            _botwanderer_pct_level_brackets[i] = uval;\n+        }\n+        ASSERT(total_pct == 100u, \"NpcBot.WanderingBots.Continents.Levels sum of values must be exactly 100!\");\n+\n+        _enabled_wander_node_maps.clear();\n+        std::string enabled_wander_node_maps = sConfigMgr->GetStringDefault(\"NpcBot.WanderingBots.Continents.Maps\", \"0,1,530,571\");\n+        std::vector<std::string_view> toks3 = Bcore::Tokenize(enabled_wander_node_maps, ',', false);\n+        for (std::size_t i{}; i != toks3.size(); ++i)\n+        {\n+            Optional<uint32> val = Bcore::StringTo<uint32>(toks3[i]);\n+            if (val == std::nullopt)\n+            {\n+                BOT_LOG_ERROR(\"server.loading\", \"NpcBot.WanderingBots.Continents.Maps contains invalid uint32 value '{}', skipped\", toks3[i]);\n+                continue;\n+            }\n+            uint32 uval = val.value_or(uint32(0));\n+            MapEntry const* mapEntry = sMapStore.LookupEntry(uval);\n+            if (!mapEntry || !mapEntry->IsContinent())\n+            {\n+                BOT_LOG_ERROR(\"server.loading\", \"NpcBot.WanderingBots.Continents.Maps contains invalid continent map id '{}', skipped\", uval);\n+                continue;\n+            }\n+            _enabled_wander_node_maps.push_back(uval);\n+        }\n+        if (_enabled_wander_node_maps.empty())\n+        {\n+            BOT_LOG_ERROR(\"server.loading\", \"NpcBot.WanderingBots.Continents.Maps does not provide any valid maps! Wandering bots will not be spawned!\");\n+            _desiredWanderingBotsCount = 0;\n+        }\n+\n+        _disabled_instance_maps.clear();\n+        std::string disabled_instance_maps = sConfigMgr->GetStringDefault(\"NpcBot.DisableInstances\", \"\");\n+        std::vector<std::string_view> toks4 = Bcore::Tokenize(disabled_instance_maps, ',', false);\n+        for (std::size_t i{}; i != toks4.size(); ++i)\n+        {\n+            Optional<uint32> val = Bcore::StringTo<uint32>(toks4[i]);\n+            if (val == std::nullopt)\n+            {\n+                BOT_LOG_ERROR(\"server.loading\", \"NpcBot.DisableInstances contains invalid uint32 value '{}', skipped\", toks4[i]);\n+                continue;\n+            }\n+            uint32 uval = val.value_or(uint32(0));\n+            MapEntry const* mapEntry = sMapStore.LookupEntry(uval);\n+            if (!mapEntry || !mapEntry->IsDungeon())\n+            {\n+                BOT_LOG_ERROR(\"server.loading\", \"NpcBot.DisableInstances contains invalid instance map id '{}', skipped\", uval);\n+                continue;\n+            }\n+            _disabled_instance_maps.push_back(uval);\n+        }\n+\n+        _botwanderer_itemlvl_level_brackets = {};\n+        std::string itemlevel_by_levels = sConfigMgr->GetStringDefault(\"NpcBot.WanderingBots.MaxItemLevel.Levels\", \"0,0,0,0,0,0,0,0,0\");\n+        std::vector<std::string_view> tok8 = Bcore::Tokenize(itemlevel_by_levels, ',', false);\n+        ASSERT(tok8.size() == BRACKETS_COUNT, \"NpcBot.WanderingBots.MaxItemLevel.Levels must have exactly %u values\", uint32(BRACKETS_COUNT));\n+        for (std::size_t i{}; i != tok8.size(); ++i)\n+        {\n+            Optional<uint32> val = Bcore::StringTo<uint32>(tok8[i]);\n+            if (val == std::nullopt)\n+                BOT_LOG_ERROR(\"server.loading\", \"NpcBot.WanderingBots.MaxItemLevel.Levels contains invalid uint32 value '{}', set to default\", tok8[i]);\n+            uint32 uval = val.value_or(uint32(0));\n+            _botwanderer_itemlvl_level_brackets[i] = uval;\n+        }\n+\n+        //limits\n+        _mountLevel100 = std::max<uint8>(_mountLevel100, _mountLevel60);\n+        RoundToInterval(_mult_dmg_physical, 0.1f, 10.f);\n+        RoundToInterval(_mult_dmg_spell, 0.1f, 10.f);\n+        RoundToInterval(_mult_healing, 0.1f, 10.f);\n+        RoundToInterval(_mult_hp, 0.1f, 10.f);\n+        RoundToInterval(_mult_dmg_wanderer, 0.1f, 10.f);\n+        RoundToInterval(_mult_healing_wanderer, 0.1f, 10.f);\n+        RoundToInterval(_mult_hp_wanderer, 0.1f, 10.f);\n+        RoundToInterval(_mult_speed_wanderer, 0.1f, 10.f);\n+        RoundToInterval(_mult_xpgain_wanderer, 0.0f, 100.f);\n+        RoundToInterval(_mult_dmg_warrior, 0.1f, 10.f);\n+        RoundToInterval(_mult_dmg_paladin, 0.1f, 10.f);\n+        RoundToInterval(_mult_dmg_hunter, 0.1f, 10.f);\n+        RoundToInterval(_mult_dmg_rogue, 0.1f, 10.f);\n+        RoundToInterval(_mult_dmg_priest, 0.1f, 10.f);\n+        RoundToInterval(_mult_dmg_deathknight, 0.1f, 10.f);\n+        RoundToInterval(_mult_dmg_shaman, 0.1f, 10.f);\n+        RoundToInterval(_mult_dmg_mage, 0.1f, 10.f);\n+        RoundToInterval(_mult_dmg_warlock, 0.1f, 10.f);\n+        RoundToInterval(_mult_dmg_druid, 0.1f, 10.f);\n+        RoundToInterval(_mult_dmg_blademaster, 0.1f, 10.f);\n+        RoundToInterval(_mult_dmg_obsidiandestroyer, 0.1f, 10.f);\n+        RoundToInterval(_mult_dmg_archmage, 0.1f, 10.f);\n+        RoundToInterval(_mult_dmg_dreadlord, 0.1f, 10.f);\n+        RoundToInterval(_mult_dmg_spellbreaker, 0.1f, 10.f);\n+        RoundToInterval(_mult_dmg_darkranger, 0.1f, 10.f);\n+        RoundToInterval(_mult_dmg_necromancer, 0.1f, 10.f);\n+        RoundToInterval(_mult_dmg_seawitch, 0.1f, 10.f);\n+        RoundToInterval(_mult_dmg_cryptlord, 0.1f, 10.f);\n+        RoundToInterval(_bothk_rate_honor, 0.1f, 10.f);\n+        RoundToInterval(_killrewardWandererItemCount, uint32(0), uint32(MAX_NR_LOOT_ITEMS));\n+        RoundToInterval(_killrewardWandererItemQuality, uint32(ITEM_QUALITY_POOR), uint32(ITEM_QUALITY_HEIRLOOM));\n+        RoundToInterval(_maxSharedOwners, uint8(0), uint8(MAX_RAID_SIZE - 1));\n+\n+        if ((_shared_ownership_options | SHARED_OWNER_OPTION_MASK_ALL) != SHARED_OWNER_OPTION_MASK_ALL)\n+        {\n+            BOT_LOG_ERROR(\"server.loading\", \"NpcBot.SharedOwnershipOptions contains unknown values outside of full mask {}! Disabled.\", SHARED_OWNER_OPTION_MASK_ALL);\n+            _shared_ownership_options = 0;\n+        }\n+\n+        _resolveConfigConflicts();\n+    }\n+\n+    static void _resolveConfigConflicts()\n+    {\n+        if (_gearBankEquipmentSetsCount > MAX_BOT_EQUIPMENT_SETS)\n+        {\n+            BOT_LOG_ERROR(\"server.loading\", \"NpcBot.GearBank.EquipmentSets can't be greater than {}, reduced (was {})!\", uint32(MAX_BOT_EQUIPMENT_SETS), _gearBankEquipmentSetsCount);\n+            _gearBankEquipmentSetsCount = MAX_BOT_EQUIPMENT_SETS;\n+        }\n+\n+        uint8 dpsFlags = /*_tankingTargetIconFlags | _offTankingTargetIconFlags | */_dpsTargetIconFlags | _rangedDpsTargetIconFlags;\n+        if (uint8 interFlags = (_noDpsTargetIconFlags & dpsFlags))\n+        {\n+            _noDpsTargetIconFlags &= ~interFlags;\n+            BOT_LOG_ERROR(\"server.loading\", \"NpcBot.NoDPSTargetIconMask intersects with dps targets flags {:#X}! Removed, new mask: {:#X}\",\n+                uint32(interFlags), uint32(_noDpsTargetIconFlags));\n+        }\n+\n+        if (!_enabled_wander_node_maps.empty())\n+        {\n+            uint8 minbotlevel = DEFAULT_MAX_LEVEL;\n+            uint8 maxbotlevel = 0;\n+            for (uint32 mapid : _enabled_wander_node_maps)\n+            {\n+                minbotlevel = std::min<uint8>(minbotlevel, BotDataMgr::GetMinLevelForMapId(mapid));\n+                maxbotlevel = std::max<uint8>(maxbotlevel, BotDataMgr::GetMaxLevelForMapId(mapid));\n+            }\n+            for (int8 j = minbotlevel / 10 - 1; j >= 0; --j)\n+            {\n+                if (_botwanderer_pct_level_brackets[j] > 0)\n+                {\n+                    uint32 pct = _botwanderer_pct_level_brackets[j];\n+                    _botwanderer_pct_level_brackets[minbotlevel / 10] += pct;\n+                    _botwanderer_pct_level_brackets[j] = 0;\n+                    BOT_LOG_WARN(\"server.loading\", \"NpcBot.WanderingBots.Continents.Levels conflicts with NpcBot.WanderingBots.Continents.Maps: no map for levels {}-{}! Transferring extra {}% to levels {}-{}\",\n+                        uint32(j ? j * 10 : 1), uint32(j * 10 + 9), pct, std::max<uint32>(minbotlevel / 10 * 10, 1), uint32(minbotlevel / 10 * 10 + 9));\n+                }\n+            }\n+            for (std::size_t i = std::size_t(maxbotlevel) / 10 + 1; i < _botwanderer_pct_level_brackets.size(); ++i)\n+            {\n+                if (_botwanderer_pct_level_brackets[i] > 0)\n+                {\n+                    uint32 pct = _botwanderer_pct_level_brackets[i];\n+                    _botwanderer_pct_level_brackets[maxbotlevel / 10] += pct;\n+                    _botwanderer_pct_level_brackets[i] = 0;\n+                    BOT_LOG_WARN(\"server.loading\", \"NpcBot.WanderingBots.Continents.Levels conflicts with NpcBot.WanderingBots.Continents.Maps: no map for levels {}-{}! Transferring extra {}% to levels {}-{}\",\n+                        uint32(i ? i * 10 : 1), uint32(i * 10 + 9), pct, std::max<uint32>(maxbotlevel, 1), uint32(maxbotlevel + 9));\n+                }\n+            }\n+        }\n+    }\n+};\n+\n+void BotCfg::ReloadConfig()\n+{\n+    NPCBotsConfigScript::ReloadConfig();\n+}\n+\n+bool BotCfg::IsNpcBotModEnabled()\n+{\n+    return _enableNpcBots;\n+}\n+\n+bool BotCfg::IsNpcBotLogEnabled()\n+{\n+    return _logToDB;\n+}\n+\n+bool BotCfg::IsNpcBotDungeonFinderEnabled()\n+{\n+    return _enableDungeonFinder;\n+}\n+\n+bool BotCfg::LimitNpcBotsInDungeons()\n+{\n+    return _limitNpcBotsDungeons;\n+}\n+bool BotCfg::LimitNpcBotsInRaids()\n+{\n+    return _limitNpcBotsRaids;\n+}\n+\n+bool BotCfg::IsNpcBotsPremadeEnabled()\n+{\n+    return _enableNpcBotsPremade;\n+}\n+\n+uint32 BotCfg::GetNpcBotCostRent(uint8 level, uint8 botclass)\n+{\n+    return _normalizedCostForLevel(_npcBotsCostRent, botclass, level);\n+}\n+\n+uint32 BotCfg::GetNpcBotCostHire(uint8 level, uint8 botclass)\n+{\n+    return _normalizedCostForLevel(_npcBotsCostHire, botclass, level);\n+}\n+\n+std::string BotCfg::GetNpcBotCostStr(uint8 level, uint8 botclass)\n+{\n+    std::ostringstream money;\n+\n+    if (uint32 cost = GetNpcBotCostHire(level, botclass))\n+    {\n+        uint32 gold = uint32(cost / GOLD);\n+        cost -= (gold * GOLD);\n+        uint32 silver = uint32(cost / SILVER);\n+        cost -= (silver * SILVER);\n+\n+        if (gold != 0)\n+            money << gold << \" |TInterface\\\\Icons\\\\INV_Misc_Coin_01:8|t\";\n+        if (silver != 0)\n+            money << silver << \" |TInterface\\\\Icons\\\\INV_Misc_Coin_03:8|t\";\n+        if (cost)\n+            money << cost << \" |TInterface\\\\Icons\\\\INV_Misc_Coin_05:8|t\";\n+    }\n+\n+    if (uint32 rcost = GetNpcBotCostRent(level, botclass))\n+    {\n+        uint32 gold = uint32(rcost / GOLD);\n+        rcost -= (gold * GOLD);\n+        uint32 silver = uint32(rcost / SILVER);\n+        rcost -= (silver * SILVER);\n+\n+        money << \" + |TInterface\\\\Icons\\\\INV_Misc_PocketWatch_01:16|t\";\n+\n+        if (gold != 0)\n+            money << gold << \" |TInterface\\\\Icons\\\\INV_Misc_Coin_01:8|t\";\n+        if (silver != 0)\n+            money << silver << \" |TInterface\\\\Icons\\\\INV_Misc_Coin_03:8|t\";\n+        if (rcost)\n+            money << rcost << \" |TInterface\\\\Icons\\\\INV_Misc_Coin_05:8|t\";\n+    }\n+\n+    return money.str();\n+}\n+\n+bool BotCfg::DisplayEquipment()\n+{\n+    return _displayEquipment;\n+}\n+\n+bool BotCfg::ShowEquippedCloak()\n+{\n+    return _showCloak;\n+}\n+\n+bool BotCfg::ShowEquippedHelm()\n+{\n+    return _showHelm;\n+}\n+\n+bool BotCfg::SendEquipListItems()\n+{\n+    return _sendEquipListItems;\n+}\n+\n+bool BotCfg::IsGearBankEnabled()\n+{\n+    return _enableBotGearBank;\n+}\n+\n+bool BotCfg::IsTransmogEnabled()\n+{\n+    return _transmog_enable;\n+}\n+bool BotCfg::MixArmorClasses()\n+{\n+    return _transmog_mixArmorClasses;\n+}\n+bool BotCfg::MixWeaponClasses()\n+{\n+    return _transmog_mixWeaponClasses;\n+}\n+bool BotCfg::MixWeaponInventoryTypes()\n+{\n+    return _transmog_mixWeaponInvTypes;\n+}\n+bool BotCfg::TransmogUseEquipmentSlots()\n+{\n+    return _transmog_useEquipmentSlots;\n+}\n+\n+bool BotCfg::IsClassEnabled(uint8 m_class)\n+{\n+    switch (m_class)\n+    {\n+        case BOT_CLASS_WARRIOR:\n+            return _enableclass_warrior;\n+        case BOT_CLASS_PALADIN:\n+            return _enableclass_paladin;\n+        case BOT_CLASS_HUNTER:\n+            return _enableclass_hunter;\n+        case BOT_CLASS_ROGUE:\n+            return _enableclass_rogue;\n+        case BOT_CLASS_PRIEST:\n+            return _enableclass_priest;\n+        case BOT_CLASS_DEATH_KNIGHT:\n+            return _enableclass_deathknight;\n+        case BOT_CLASS_SHAMAN:\n+            return _enableclass_shaman;\n+        case BOT_CLASS_MAGE:\n+            return _enableclass_mage;\n+        case BOT_CLASS_WARLOCK:\n+            return _enableclass_warlock;\n+        case BOT_CLASS_DRUID:\n+            return _enableclass_druid;\n+        case BOT_CLASS_BM:\n+            return _enableclass_blademaster;\n+        case BOT_CLASS_SPHYNX:\n+            return _enableclass_sphynx;\n+        case BOT_CLASS_ARCHMAGE:\n+            return _enableclass_archmage;\n+        case BOT_CLASS_DREADLORD:\n+            return _enableclass_dreadlord;\n+        case BOT_CLASS_SPELLBREAKER:\n+            return _enableclass_spellbreaker;\n+        case BOT_CLASS_DARK_RANGER:\n+            return _enableclass_darkranger;\n+        case BOT_CLASS_NECROMANCER:\n+            return _enableclass_necromancer;\n+        case BOT_CLASS_SEA_WITCH:\n+            return _enableclass_seawitch;\n+        case BOT_CLASS_CRYPT_LORD:\n+            return _enableclass_cryptlord;\n+        default:\n+            return true;\n+    }\n+}\n+\n+bool BotCfg::IsWanderingClassEnabled(uint8 m_class)\n+{\n+    switch (m_class)\n+    {\n+        case BOT_CLASS_WARRIOR:\n+            return _enableclass_wander_warrior;\n+        case BOT_CLASS_PALADIN:\n+            return _enableclass_wander_paladin;\n+        case BOT_CLASS_HUNTER:\n+            return _enableclass_wander_hunter;\n+        case BOT_CLASS_ROGUE:\n+            return _enableclass_wander_rogue;\n+        case BOT_CLASS_PRIEST:\n+            return _enableclass_wander_priest;\n+        case BOT_CLASS_DEATH_KNIGHT:\n+            return _enableclass_wander_deathknight;\n+        case BOT_CLASS_SHAMAN:\n+            return _enableclass_wander_shaman;\n+        case BOT_CLASS_MAGE:\n+            return _enableclass_wander_mage;\n+        case BOT_CLASS_WARLOCK:\n+            return _enableclass_wander_warlock;\n+        case BOT_CLASS_DRUID:\n+            return _enableclass_wander_druid;\n+        case BOT_CLASS_BM:\n+            return _enableclass_wander_blademaster;\n+        case BOT_CLASS_SPHYNX:\n+            return _enableclass_wander_sphynx;\n+        case BOT_CLASS_ARCHMAGE:\n+            return _enableclass_wander_archmage;\n+        case BOT_CLASS_DREADLORD:\n+            return _enableclass_wander_dreadlord;\n+        case BOT_CLASS_SPELLBREAKER:\n+            return _enableclass_wander_spellbreaker;\n+        case BOT_CLASS_DARK_RANGER:\n+            return _enableclass_wander_darkranger;\n+        case BOT_CLASS_NECROMANCER:\n+            return _enableclass_wander_necromancer;\n+        case BOT_CLASS_SEA_WITCH:\n+            return _enableclass_wander_seawitch;\n+        case BOT_CLASS_CRYPT_LORD:\n+            return _enableclass_wander_cryptlord;\n+        default:\n+            return true;\n+    }\n+}\n+\n+bool BotCfg::EnableWanderingUntargetNpcQuestgiver()\n+{\n+    return _untarget_wnpc_questgiver;\n+}\n+bool BotCfg::EnableWanderingUntargetNpcFlightmaster()\n+{\n+    return _untarget_wnpc_flightmaster;\n+}\n+\n+bool BotCfg::HideBotSpawns()\n+{\n+    return _hideSpawns;\n+}\n+bool BotCfg::IsEnrageOnDimissEnabled()\n+{\n+    return _enrageOnDismiss;\n+}\n+bool BotCfg::IsBotStatsLimitsEnabled()\n+{\n+    return _botStatLimits;\n+}\n+bool BotCfg::IsPvPEnabled()\n+{\n+    return _botPvP;\n+}\n+bool BotCfg::IsFoodInterruptedByMovement()\n+{\n+    return _botMovementFoodInterrupt;\n+}\n+bool BotCfg::FilterRaces()\n+{\n+    return _filterRaces;\n+}\n+bool BotCfg::IsBotGenerationEnabledBGs()\n+{\n+    return _enableWanderingBotsBG;\n+}\n+bool BotCfg::IsBotLevelCappedByConfigBG()\n+{\n+    return _enableConfigLevelCapBG;\n+}\n+bool BotCfg::IsBotLevelCappedByConfigBGFirstPlayer()\n+{\n+    return _enableConfigLevelCapBGFirst;\n+}\n+bool BotCfg::IsBotGenerationEnabledWorldMapId(uint32 mapId)\n+{\n+    return std::ranges::find(_enabled_wander_node_maps, mapId) != std::cend(_enabled_wander_node_maps);\n+}\n+bool BotCfg::IsBotHKEnabled()\n+{\n+    return _bothk_enable;\n+}\n+bool BotCfg::IsBotHKMessageEnabled()\n+{\n+    return _bothk_message_enable;\n+}\n+bool BotCfg::IsBotHKAchievementsEnabled()\n+{\n+    return _bothk_achievements_enable;\n+}\n+bool BotCfg::IsSharedOwnerOptionEnabled(SharedOwnerOptionMask options)\n+{\n+    return std::ranges::all_of(std::array{ SHARED_OWNER_OPTION_MASK_ENABLE, options }, [=](uint32 mask) { return !!(_shared_ownership_options & mask); });\n+}\n+uint8 BotCfg::GetMaxClassBots()\n+{\n+    return _maxClassNpcBots;\n+}\n+uint8 BotCfg::GetMaxAccountBots()\n+{\n+    return _maxAccountNpcBots;\n+}\n+uint8 BotCfg::GetMaxSharedOwners()\n+{\n+    return _maxSharedOwners;\n+}\n+uint32 BotCfg::GetGearBankCapacity()\n+{\n+    return _gearBankCapacity;\n+}\n+uint32 BotCfg::GetGearBankEquipmentSetsCount()\n+{\n+    return _gearBankEquipmentSetsCount;\n+}\n+uint8 BotCfg::GetHealTargetIconFlags()\n+{\n+    return _healTargetIconFlags;\n+}\n+uint8 BotCfg::GetTankTargetIconFlags()\n+{\n+    return _tankingTargetIconFlags;\n+}\n+uint8 BotCfg::GetOffTankTargetIconFlags()\n+{\n+    return _offTankingTargetIconFlags;\n+}\n+uint8 BotCfg::GetDPSTargetIconFlags()\n+{\n+    return _dpsTargetIconFlags;\n+}\n+uint8 BotCfg::GetRangedDPSTargetIconFlags()\n+{\n+    return _rangedDpsTargetIconFlags;\n+}\n+uint8 BotCfg::GetNoDPSTargetIconFlags()\n+{\n+    return _noDpsTargetIconFlags;\n+}\n+uint32 BotCfg::GetBaseUpdateDelay()\n+{\n+    return _npcBotUpdateDelayBase;\n+}\n+uint32 BotCfg::GetOwnershipExpireTime()\n+{\n+    return _npcBotOwnerExpireTime;\n+}\n+uint8 BotCfg::GetOwnershipExpireMode()\n+{\n+    return _npcBotOwnerExpireMode;\n+}\n+uint32 BotCfg::GetDesiredWanderingBotsCount()\n+{\n+    return _desiredWanderingBotsCount;\n+}\n+uint32 BotCfg::GetBGTargetTeamPlayersCount(BattlegroundTypeId bgTypeId)\n+{\n+    switch (bgTypeId)\n+    {\n+        case BATTLEGROUND_AV:\n+            return _targetBGPlayersPerTeamCount_AV;\n+        case BATTLEGROUND_WS:\n+            return _targetBGPlayersPerTeamCount_WS;\n+        case BATTLEGROUND_AB:\n+            return _targetBGPlayersPerTeamCount_AB;\n+        case BATTLEGROUND_EY:\n+            return _targetBGPlayersPerTeamCount_EY;\n+        case BATTLEGROUND_SA:\n+            return _targetBGPlayersPerTeamCount_SA;\n+        case BATTLEGROUND_IC:\n+            return _targetBGPlayersPerTeamCount_IC;\n+        default:\n+            return 0;\n+    }\n+}\n+float BotCfg::GetBotHKHonorRate()\n+{\n+    return _bothk_rate_honor;\n+}\n+float BotCfg::GetBotStatLimitDodge()\n+{\n+    return _botStatLimits_dodge;\n+}\n+float BotCfg::GetBotStatLimitParry()\n+{\n+    return _botStatLimits_parry;\n+}\n+float BotCfg::GetBotStatLimitBlock()\n+{\n+    return _botStatLimits_block;\n+}\n+float BotCfg::GetBotStatLimitCrit()\n+{\n+    return _botStatLimits_crit;\n+}\n+\n+bool BotCfg::IsNpcBotXpReductionEnabled()\n+{\n+    return _xpReductionEnable;\n+}\n+bool BotCfg::IsNpcBotXpReductionGroupOnly()\n+{\n+    return _xpReductionGroupOnly;\n+}\n+uint8 BotCfg::GetNpcBotXpReductionExtraAmount()\n+{\n+    return _xpReductionExtraAmount;\n+}\n+uint8 BotCfg::GetNpcBotXpReductionExtraStartingNumber()\n+{\n+    return _xpReductionExtraStartingNumber;\n+}\n+\n+bool BotCfg::IsNpcBotHonorReductionEnabled()\n+{\n+    return _honorReductionEnable;\n+}\n+bool BotCfg::IsNpcBotHonorReductionGroupOnly()\n+{\n+    return _honorReductionGroupOnly;\n+}\n+\n+bool BotCfg::GetNpcBotMoneyShareEnabled()\n+{\n+    return _moneyLootShareEnable;\n+}\n+bool BotCfg::GetNpcBotMoneyShareGroupOnly()\n+{\n+    return _moneyLootShareGroupOnly;\n+}\n+\n+uint8 BotCfg::GetNpcBotMountLevel60()\n+{\n+    return _mountLevel60;\n+}\n+uint8 BotCfg::GetNpcBotMountLevel100()\n+{\n+    return _mountLevel100;\n+}\n+\n+uint8 BotCfg::GetMaxNpcBots(uint8 level)\n+{\n+    return _max_npcbots[std::min<size_t>(BRACKETS_COUNT - 1, level / 10)];\n+}\n+\n+int32 BotCfg::GetBotInfoPacketsLimit()\n+{\n+    return _botInfoPacketsLimit;\n+}\n+\n+float BotCfg::GetBotDamageModPhysical()\n+{\n+    return _mult_dmg_physical;\n+}\n+float BotCfg::GetBotDamageModSpell()\n+{\n+    return _mult_dmg_spell;\n+}\n+float BotCfg::GetBotHealingMod()\n+{\n+    return _mult_healing;\n+}\n+float BotCfg::GetBotHPMod()\n+{\n+    return _mult_hp;\n+}\n+float BotCfg::GetBotWandererDamageMod()\n+{\n+    return _mult_dmg_wanderer;\n+}\n+float BotCfg::GetBotWandererHealingMod()\n+{\n+    return _mult_healing_wanderer;\n+}\n+float BotCfg::GetBotWandererHPMod()\n+{\n+    return _mult_hp_wanderer;\n+}\n+float BotCfg::GetBotWandererSpeedMod()\n+{\n+    return _mult_speed_wanderer;\n+}\n+float BotCfg::GetBotWandererXPGainMod()\n+{\n+    return _mult_xpgain_wanderer;\n+}\n+PctBrackets BotCfg::GetBotWandererLevelBrackets()\n+{\n+    return _botwanderer_pct_level_brackets;\n+}\n+uint32 BotCfg::GetBotWandererMaxItemLevel(uint8 level)\n+{\n+    return _botwanderer_itemlvl_level_brackets[std::min<size_t>(BRACKETS_COUNT - 1, level / 10)];\n+}\n+uint32 BotCfg::GetBotWandererKillRewardMoney()\n+{\n+    return _killrewardWandererMoneyBase;\n+}\n+uint32 BotCfg::GetBotWandererKillRewardItemMaxCount()\n+{\n+    return _killrewardWandererItemCount;\n+}\n+uint32 BotCfg::GetBotWandererKillRewardItemMaxQuality()\n+{\n+    return _killrewardWandererItemQuality;\n+}\n+float BotCfg::GetBotDamageModByClass(uint8 botclass)\n+{\n+    switch (botclass)\n+    {\n+        case BOT_CLASS_WARRIOR:\n+            return _mult_dmg_warrior;\n+        case BOT_CLASS_PALADIN:\n+            return _mult_dmg_paladin;\n+        case BOT_CLASS_HUNTER:\n+            return _mult_dmg_hunter;\n+        case BOT_CLASS_ROGUE:\n+            return _mult_dmg_rogue;\n+        case BOT_CLASS_PRIEST:\n+            return _mult_dmg_priest;\n+        case BOT_CLASS_DEATH_KNIGHT:\n+            return _mult_dmg_deathknight;\n+        case BOT_CLASS_SHAMAN:\n+            return _mult_dmg_shaman;\n+        case BOT_CLASS_MAGE:\n+            return _mult_dmg_mage;\n+        case BOT_CLASS_WARLOCK:\n+            return _mult_dmg_warlock;\n+        case BOT_CLASS_DRUID:\n+            return _mult_dmg_druid;\n+        case BOT_CLASS_BM:\n+            return _mult_dmg_blademaster;\n+        case BOT_CLASS_SPHYNX:\n+            return _mult_dmg_obsidiandestroyer;\n+        case BOT_CLASS_ARCHMAGE:\n+            return _mult_dmg_archmage;\n+        case BOT_CLASS_DREADLORD:\n+            return _mult_dmg_dreadlord;\n+        case BOT_CLASS_SPELLBREAKER:\n+            return _mult_dmg_spellbreaker;\n+        case BOT_CLASS_DARK_RANGER:\n+            return _mult_dmg_darkranger;\n+        case BOT_CLASS_NECROMANCER:\n+            return _mult_dmg_necromancer;\n+        case BOT_CLASS_SEA_WITCH:\n+            return _mult_dmg_seawitch;\n+        case BOT_CLASS_CRYPT_LORD:\n+            return _mult_dmg_cryptlord;\n+        default:\n+            return 1.0;\n+    }\n+}\n+\n+float BotCfg::GetBotDamageModByLevel(uint8 botlevel)\n+{\n+    uint8 bracket = botlevel / 10;\n+    if (bracket < _mult_dmg_levels.size())\n+        return _mult_dmg_levels[bracket];\n+    return 1.0f;\n+}\n+float BotCfg::GetBotHealingModByLevel(uint8 botlevel)\n+{\n+    uint8 bracket = botlevel / 10;\n+    if (bracket < _mult_heal_levels.size())\n+        return _mult_heal_levels[bracket];\n+    return 1.0f;\n+}\n+float BotCfg::GetBotHPModByLevel(uint8 botlevel)\n+{\n+    uint8 bracket = botlevel / 10;\n+    if (bracket < _mult_hp_levels.size())\n+        return _mult_hp_levels[bracket];\n+    return 1.0f;\n+}\n+float BotCfg::GetBotMPModByLevel(uint8 botlevel)\n+{\n+    uint8 bracket = botlevel / 10;\n+    if (bracket < _mult_mp_levels.size())\n+        return _mult_mp_levels[bracket];\n+    return 1.0f;\n+}\n+\n+uint8 BotCfg::GetFollowDistDefault()\n+{\n+    return _basefollowdist;\n+}\n+uint32 BotCfg::GetEngageDelayDPSDefault()\n+{\n+    return _npcBotEngageDelayDPS_default;\n+}\n+uint32 BotCfg::GetEngageDelayHealDefault()\n+{\n+    return _npcBotEngageDelayHeal_default;\n+}\n+\n+bool BotCfg::IsMapAllowedForBots(Map const* map)\n+{\n+    if ((!_enableNpcBotsBGs && map->IsBattleground()) ||\n+        (!_enableNpcBotsArenas && map->IsBattleArena()) ||\n+        (!_enableNpcBotsDungeons && map->IsNonRaidDungeon()) ||\n+        (!_enableNpcBotsRaids && map->IsRaid()))\n+        return false;\n+\n+    if (map->IsDungeon() && !_disabled_instance_maps.empty() && std::ranges::find(_disabled_instance_maps, map->GetId()) != _disabled_instance_maps.cend())\n+        return false;\n+\n+    return true;\n+}\n+\n+uint32 BotCfg::_normalizedCostForLevel(uint32 cost_base, uint8 bot_class, uint8 level)\n+{\n+    //assuming default 1000000\n+    //level 1: 500  //5  silver\n+    //10 : 10000    //1  gold\n+    //20 : 50000    //5  gold\n+    //30 : 200000   //20 gold\n+    //40 : 500000   //50 gold\n+    //rest is linear\n+    //rare / rareelite bots have their cost adjusted\n+    uint32 cost =\n+        level < 10 ? cost_base / 2000 : //5 silver\n+        level < 20 ? cost_base / 100 :  //1 gold\n+        level < 30 ? cost_base / 20 :   //5 gold\n+        level < 40 ? cost_base / 5 :    //20 gold\n+        (cost_base * (level - (level % 10))) / DEFAULT_MAX_LEVEL; //50 - 100 gold\n+\n+    switch (bot_class)\n+    {\n+        case BOT_CLASS_BM:\n+        case BOT_CLASS_ARCHMAGE:\n+        case BOT_CLASS_SPELLBREAKER:\n+        case BOT_CLASS_NECROMANCER:\n+            cost += cost; //200%\n+            break;\n+        case BOT_CLASS_SPHYNX:\n+        case BOT_CLASS_DREADLORD:\n+        case BOT_CLASS_DARK_RANGER:\n+        case BOT_CLASS_SEA_WITCH:\n+        case BOT_CLASS_CRYPT_LORD:\n+            cost += cost * 4; //500%\n+            break;\n+        default:\n+            break;\n+    }\n+\n+    return cost;\n+}\n+\n+void AddSC_botconfig_scripts()\n+{\n+    new NPCBotsConfigScript();\n+}\n+\n+#ifdef _MSC_VER\n+# pragma warning(pop)\n+#endif\ndiff --git a/src/server/game/AI/NpcBots/botconfig.h b/src/server/game/AI/NpcBots/botconfig.h\nnew file mode 100644\nindex 0000000000..a21380a422\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/botconfig.h\n@@ -0,0 +1,142 @@\n+#ifndef BOTCONFIG_H\n+#define BOTCONFIG_H\n+\n+#include \"botcommon.h\"\n+\n+class Map;\n+\n+enum SharedOwnerOptions : uint32\n+{\n+    SHARED_OWNER_ENABLE                 = 1,\n+    SHARED_OWNER_EQUIPMENT              = 2,\n+    SHARED_OWNER_ADD_OWNERS             = 3,\n+    SHARED_OWNER_REMOVE_OWNERS          = 4,\n+\n+    MAX_SHARED_OWNER_OPTIONS\n+};\n+enum SharedOwnerOptionMask : uint32\n+{\n+    SHARED_OWNER_OPTION_MASK_ENABLE         = (1<<(SHARED_OWNER_ENABLE-1)),\n+    SHARED_OWNER_OPTION_MASK_EQUIPMENT      = (1<<(SHARED_OWNER_EQUIPMENT-1)),\n+    SHARED_OWNER_OPTION_MASK_ADD_OWNERS     = (1<<(SHARED_OWNER_ADD_OWNERS-1)),\n+    SHARED_OWNER_OPTION_MASK_REMOVE_OWNERS  = (1<<(SHARED_OWNER_REMOVE_OWNERS-1)),\n+\n+    SHARED_OWNER_OPTION_MASK_MANAGE_OWNERS  = SHARED_OWNER_OPTION_MASK_ADD_OWNERS | SHARED_OWNER_OPTION_MASK_REMOVE_OWNERS,\n+    SHARED_OWNER_OPTION_MASK_ALL            = (1<<(MAX_SHARED_OWNER_OPTIONS-1)) - 1\n+};\n+\n+template<typename U>\n+using BotBrackets = std::array<U, BRACKETS_COUNT>;\n+using LvlBrackets = BotBrackets<uint8>;\n+using PctBrackets = BotBrackets<uint32>;\n+using ItemLvlBrackets = BotBrackets<uint32>;\n+\n+class TC_GAME_API BotCfg\n+{\n+public:\n+    static void ReloadConfig();\n+\n+    static bool IsNpcBotModEnabled();\n+    static bool IsNpcBotLogEnabled();\n+    static bool IsNpcBotDungeonFinderEnabled();\n+    static bool LimitNpcBotsInDungeons();\n+    static bool LimitNpcBotsInRaids();\n+    static bool IsNpcBotsPremadeEnabled();\n+    static bool DisplayEquipment();\n+    static bool ShowEquippedCloak();\n+    static bool ShowEquippedHelm();\n+    static bool SendEquipListItems();\n+    static bool IsGearBankEnabled();\n+    static bool IsTransmogEnabled();\n+    static bool MixArmorClasses();\n+    static bool MixWeaponClasses();\n+    static bool MixWeaponInventoryTypes();\n+    static bool TransmogUseEquipmentSlots();\n+    static bool IsClassEnabled(uint8 m_class);\n+    static bool IsWanderingClassEnabled(uint8 m_class);\n+    static bool EnableWanderingUntargetNpcQuestgiver();\n+    static bool EnableWanderingUntargetNpcFlightmaster();\n+    static bool HideBotSpawns();\n+    static bool IsEnrageOnDimissEnabled();\n+    static bool IsBotStatsLimitsEnabled();\n+    static bool IsPvPEnabled();\n+    static bool IsFoodInterruptedByMovement();\n+    static bool FilterRaces();\n+    static bool IsBotGenerationEnabledBGs();\n+    static bool IsBotLevelCappedByConfigBG();\n+    static bool IsBotLevelCappedByConfigBGFirstPlayer();\n+    static bool IsBotGenerationEnabledWorldMapId(uint32 mapId);\n+    static bool IsBotHKEnabled();\n+    static bool IsBotHKMessageEnabled();\n+    static bool IsBotHKAchievementsEnabled();\n+    static bool IsSharedOwnerOptionEnabled(SharedOwnerOptionMask options);\n+    static uint8 GetMaxClassBots();\n+    static uint8 GetMaxAccountBots();\n+    static uint8 GetMaxSharedOwners();\n+    static uint32 GetGearBankCapacity();\n+    static uint32 GetGearBankEquipmentSetsCount();\n+    static uint8 GetHealTargetIconFlags();\n+    static uint8 GetTankTargetIconFlags();\n+    static uint8 GetOffTankTargetIconFlags();\n+    static uint8 GetDPSTargetIconFlags();\n+    static uint8 GetRangedDPSTargetIconFlags();\n+    static uint8 GetNoDPSTargetIconFlags();\n+    static uint32 GetBaseUpdateDelay();\n+    static uint32 GetOwnershipExpireTime();\n+    static uint8 GetOwnershipExpireMode();\n+    static uint32 GetDesiredWanderingBotsCount();\n+    static uint32 GetBGTargetTeamPlayersCount(BattlegroundTypeId bgTypeId);\n+    static float GetBotHKHonorRate();\n+    static float GetBotStatLimitDodge();\n+    static float GetBotStatLimitParry();\n+    static float GetBotStatLimitBlock();\n+    static float GetBotStatLimitCrit();\n+    static float GetBotDamageModPhysical();\n+    static float GetBotDamageModSpell();\n+    static float GetBotHealingMod();\n+    static float GetBotHPMod();\n+    static float GetBotWandererDamageMod();\n+    static float GetBotWandererHealingMod();\n+    static float GetBotWandererHPMod();\n+    static float GetBotWandererSpeedMod();\n+    static float GetBotWandererXPGainMod();\n+    static PctBrackets GetBotWandererLevelBrackets();\n+    static uint32 GetBotWandererMaxItemLevel(uint8 level);\n+    static uint32 GetBotWandererKillRewardMoney();\n+    static uint32 GetBotWandererKillRewardItemMaxCount();\n+    static uint32 GetBotWandererKillRewardItemMaxQuality();\n+    static float GetBotDamageModByClass(uint8 botclass);\n+    static float GetBotDamageModByLevel(uint8 botlevel);\n+    static float GetBotHealingModByLevel(uint8 botlevel);\n+    static float GetBotHPModByLevel(uint8 botlevel);\n+    static float GetBotMPModByLevel(uint8 botlevel);\n+\n+    static uint8 GetFollowDistDefault();\n+    static uint32 GetEngageDelayDPSDefault();\n+    static uint32 GetEngageDelayHealDefault();\n+\n+    static uint8 GetMaxNpcBots(uint8 level);\n+    static bool IsNpcBotXpReductionEnabled();\n+    static bool IsNpcBotXpReductionGroupOnly();\n+    static uint8 GetNpcBotXpReductionExtraAmount();\n+    static uint8 GetNpcBotXpReductionExtraStartingNumber();\n+    static bool IsNpcBotHonorReductionEnabled();\n+    static bool IsNpcBotHonorReductionGroupOnly();\n+    static bool GetNpcBotMoneyShareEnabled();\n+    static bool GetNpcBotMoneyShareGroupOnly();\n+    static uint8 GetNpcBotMountLevel60();\n+    static uint8 GetNpcBotMountLevel100();\n+    static int32 GetBotInfoPacketsLimit();\n+\n+    static uint32 GetNpcBotCostRent(uint8 level, uint8 botclass);\n+    static uint32 GetNpcBotCostHire(uint8 level, uint8 botclass);\n+    static std::string GetNpcBotCostStr(uint8 level, uint8 botclass);\n+\n+    static bool IsMapAllowedForBots(Map const* map);\n+private:\n+    static uint32 _normalizedCostForLevel(uint32 cost_base, uint8 bot_class, uint8 level);\n+};\n+\n+void AddNpcBotScripts();\n+\n+#endif\ndiff --git a/src/server/game/AI/NpcBots/botdatamgr.cpp b/src/server/game/AI/NpcBots/botdatamgr.cpp\nnew file mode 100644\nindex 0000000000..842a749d24\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/botdatamgr.cpp\n@@ -0,0 +1,3489 @@\n+#include \"BattlegroundMgr.h\"\n+#include \"BattlegroundQueue.h\"\n+#include \"bot_ai.h\"\n+#include \"botconfig.h\"\n+#include \"botdatamgr.h\"\n+#include \"botgearscore.h\"\n+#include \"botlog.h\"\n+#include \"botmgr.h\"\n+#include \"botspell.h\"\n+#include \"botwanderful.h\"\n+#include \"bpet_ai.h\"\n+#include \"CharacterCache.h\"\n+#include \"Containers.h\"\n+#include \"Creature.h\"\n+#include \"DatabaseEnv.h\"\n+#include \"DBCStores.h\"\n+#include \"GameTime.h\"\n+#include \"GroupMgr.h\"\n+#include \"Item.h\"\n+#include \"Log.h\"\n+#include \"Map.h\"\n+#include \"MapManager.h\"\n+#include \"ObjectMgr.h\"\n+#include \"Player.h\"\n+#include \"ScriptMgr.h\"\n+#include \"SpellInfo.h\"\n+#include \"SpellMgr.h\"\n+#include \"StringConvert.h\"\n+#include \"World.h\"\n+#include \"WorldDatabase.h\"\n+\n+#include <numeric>\n+/*\n+Npc Bot Data Manager by Trickerer (onlysuffering@gmail.com)\n+NpcBots DB Data management\n+%Complete: ???\n+*/\n+\n+#ifdef _MSC_VER\n+# pragma warning(push, 4)\n+#endif\n+\n+using namespace std::string_view_literals;\n+\n+using NpcBotMgrDataMap = std::unordered_map<ObjectGuid /*player_guid*/, NpcBotMgrData>;\n+using NpcBotDataMap = std::unordered_map<uint32 /*entry*/, NpcBotData>;\n+using NpcBotAppearanceDataMap = std::unordered_map<uint32 /*entry*/, NpcBotAppearanceData>;\n+using NpcBotExtrasMap = std::unordered_map<uint32 /*entry*/, NpcBotExtras>;\n+using NpcBotTransmogDataMap = std::unordered_map<uint32 /*entry*/, NpcBotTransmogData>;\n+static NpcBotMgrDataMap _botMgrsData;\n+static NpcBotDataMap _botsData;\n+static NpcBotAppearanceDataMap _botsAppearanceData;\n+static NpcBotExtrasMap _botsExtras;\n+static NpcBotTransmogDataMap _botsTransmogData;\n+static NpcBotRegistry _existingBots;\n+\n+static std::map<uint32, uint8> _wpMinSpawnLevelPerMapId;\n+static std::map<uint32, uint8> _wpMaxSpawnLevelPerMapId;\n+static std::map<uint8, std::set<uint32>> _spareBotIdsPerClassMap;\n+static CreatureTemplateContainer _botsWanderCreatureTemplates;\n+static std::unordered_map<uint32, EquipmentInfo const*> _botsWanderCreatureEquipmentTemplates;\n+static std::list<std::pair<uint32, WanderNode const*>> _botsWanderCreaturesToSpawn;\n+static std::set<uint32> _botsWanderCreaturesToDespawn;\n+\n+static ItemPerBotClassMap _botsWanderCreaturesSortedGear;\n+\n+using BotGearStorageMap = std::unordered_map<ObjectGuid /*playerGuid*/, BotBankItemContainer>;\n+static BotGearStorageMap _botStoredGearMap;\n+using BotGearSetStorageMap = std::unordered_map<ObjectGuid /*playerGuid*/, BotItemSetsArray>;\n+static BotGearSetStorageMap _botStoredGearSetMap;\n+\n+static bool allBotsLoaded = false;\n+\n+static uint32 next_wandering_bot_spawn_delay = 0;\n+\n+static EventProcessor botSpawnEvents;\n+static std::unordered_map<ObjectGuid, EventProcessor> botBGJoinEvents;\n+\n+bool BotBankItemCompare::operator()(Item const* item1, Item const* item2) const\n+{\n+    ItemTemplate const* proto1 = item1->GetTemplate();\n+    ItemTemplate const* proto2 = item2->GetTemplate();\n+\n+    if (proto1->Class == proto2->Class)\n+    {\n+        if (proto1->SubClass == proto2->SubClass)\n+        {\n+            if (proto1->InventoryType == proto2->InventoryType)\n+            {\n+                if (proto1->Quality == proto2->Quality)\n+                {\n+                    float gs1 = CalculateItemGearScoreRaw(proto1);\n+                    float gs2 = CalculateItemGearScoreRaw(proto1);\n+                    if (gs1 == gs2)\n+                    {\n+                        if (proto1->Name1 == proto2->Name1)\n+                            return item1->GetGUID().GetCounter() < item2->GetGUID().GetCounter();\n+                        return proto1->Name1 < proto2->Name1;\n+                    }\n+                    return gs1 < gs2;\n+                }\n+                return proto1->Quality > proto2->Quality;\n+            }\n+            return proto1->InventoryType < proto2->InventoryType;\n+        }\n+        return proto1->SubClass < proto2->SubClass;\n+    }\n+    return proto1->Class < proto2->Class;\n+}\n+\n+class BotBattlegroundEnterEvent : public BasicEvent\n+{\n+    const ObjectGuid _playerGUID;\n+    const ObjectGuid _botGUID;\n+    const BattlegroundQueueTypeId _bgQueueTypeId;\n+    const uint64 _removeTime;\n+\n+public:\n+    BotBattlegroundEnterEvent(ObjectGuid playerGUID, ObjectGuid botGUID, BattlegroundQueueTypeId bgQueueTypeId, uint64 removeTime)\n+        : _playerGUID(playerGUID), _botGUID(botGUID), _bgQueueTypeId(bgQueueTypeId), _removeTime(removeTime) {}\n+\n+    void AbortMe()\n+    {\n+        BOT_LOG_ERROR(\"npcbots\", \"BotBattlegroundEnterEvent: Aborting bot {} bg {}!\", _botGUID.GetEntry(), uint32(_bgQueueTypeId.BattlemasterListId));\n+        sBattlegroundMgr->GetBattlegroundQueue(_bgQueueTypeId).RemovePlayer(_botGUID, true);\n+        BotDataMgr::DespawnWandererBot(_botGUID.GetEntry());\n+    }\n+\n+    void AbortAll()\n+    {\n+        BOT_LOG_ERROR(\"npcbots\", \"BotBattlegroundEnterEvent: Aborting ALL bots by {} bg {}!\", _playerGUID.GetCounter(), uint32(_bgQueueTypeId.BattlemasterListId));\n+        AbortMe();\n+        botBGJoinEvents.at(_playerGUID).KillAllEvents(false);\n+    }\n+\n+    bool Execute(uint64 e_time, uint32 /*p_time*/) override\n+    {\n+        if (e_time >= _removeTime)\n+        {\n+            AbortMe();\n+            return true;\n+        }\n+        else if (Creature const* bot = BotDataMgr::FindBot(_botGUID.GetEntry()))\n+        {\n+            // Battleground is created at this point, try to find it\n+            BattlegroundQueue& queue = sBattlegroundMgr->GetBattlegroundQueue(_bgQueueTypeId);\n+            BattlegroundQueue::QueuedPlayersMap::const_iterator qpm_citr = queue.m_QueuedPlayers.find(_botGUID);\n+            GroupQueueInfo const* my_gqi = qpm_citr != queue.m_QueuedPlayers.cend() ? qpm_citr->second.GroupInfo : nullptr;\n+            Battleground* bg = my_gqi ? sBattlegroundMgr->GetBattleground(my_gqi->IsInvitedToBGInstanceGUID, BattlegroundTypeId(_bgQueueTypeId.BattlemasterListId)) : nullptr;\n+\n+            if (!bg || bg->GetPlayersCountByTeam(ALLIANCE) + bg->GetPlayersCountByTeam(HORDE) >= bg->GetMaxPlayersPerTeam() * 2)\n+            {\n+                AbortAll();\n+                return true;\n+            }\n+\n+            if (!queue.IsBotInvited(_botGUID, bg->GetInstanceID()))\n+            {\n+                AbortMe();\n+                return true;\n+            }\n+\n+            if (bg->GetPlayersCountByTeam(ALLIANCE) + bg->GetPlayersCountByTeam(HORDE) > 0)\n+            {\n+                Map* bgMap = ASSERT_NOTNULL(sMapMgr->FindMap(bg->GetMapId(), bg->GetInstanceID()));\n+\n+                queue.RemovePlayer(bot->GetGUID(), false);\n+\n+                //BG is set second time in Battleground::AddBot() but it's the same value so this is alright\n+                bot->GetBotAI()->SetBG(bg);\n+\n+                TeamId teamId = BotDataMgr::GetTeamIdForFaction(bot->GetFaction());\n+                BotMgr::TeleportBot(const_cast<Creature*>(bot), bgMap, bg->GetTeamStartPosition(teamId), true, false);\n+            }\n+            else if (std::ranges::any_of(queue.m_QueuedPlayers, [=](BattlegroundQueue::QueuedPlayersMap::value_type const& qpm_pair) {\n+                return qpm_pair.first.IsPlayer() && qpm_pair.second.GroupInfo->IsInvitedToBGInstanceGUID == my_gqi->IsInvitedToBGInstanceGUID;\n+            }))\n+                botBGJoinEvents.at(_playerGUID).AddEventAtOffset(new BotBattlegroundEnterEvent(_playerGUID, _botGUID, _bgQueueTypeId, _removeTime), 2s);\n+            else\n+                AbortAll();\n+        }\n+\n+        return true;\n+    }\n+\n+    void Abort(uint64 /*e_time*/) override { AbortMe(); }\n+};\n+\n+static void SpawnWandererBot(uint32 bot_id, WanderNode const* spawnLoc, NpcBotRegistry* registry)\n+{\n+    CreatureTemplate const& bot_template = _botsWanderCreatureTemplates.at(bot_id);\n+    NpcBotData const* bot_data = BotDataMgr::SelectNpcBotData(bot_id);\n+    NpcBotExtras const* bot_extras = BotDataMgr::SelectNpcBotExtras(bot_id);\n+    Position spawnPos = spawnLoc->GetPosition();\n+\n+    ASSERT(bot_data);\n+    ASSERT(bot_extras);\n+\n+    Map* map = sMapMgr->CreateBaseMap(spawnLoc->GetMapId());\n+    map->LoadGrid(spawnLoc->m_positionX, spawnLoc->m_positionY);\n+\n+    BOT_LOG_DEBUG(\"npcbots\", \"Spawning wandering bot: {} ({}) class {} race {} fac {}, location: mapId {} {} ({})\",\n+        bot_template.Name, bot_id, uint32(bot_extras->bclass), uint32(bot_extras->race), bot_data->faction,\n+        spawnLoc->GetMapId(), spawnLoc->ToString(), spawnLoc->GetName());\n+\n+    Creature* bot = new Creature();\n+    if (!bot->LoadBotCreatureFromDB(0, map, true, true, bot_id, &spawnPos))\n+    {\n+        delete bot;\n+        BOT_LOG_FATAL(\"server.loading\", \"Cannot load npcbot from DB!\");\n+        ASSERT(false);\n+    }\n+\n+    if (registry)\n+        registry->insert(bot);\n+}\n+\n+void BotDataMgr::DespawnWandererBot(uint32 entry)\n+{\n+    Creature const* bot = FindBot(entry);\n+    if (bot && bot->IsWandererBot())\n+    {\n+        if (bot->GetBotAI())\n+            bot->GetBotAI()->canUpdate = false;\n+        _botsWanderCreaturesToDespawn.insert(entry);\n+    }\n+    else\n+        BOT_LOG_ERROR(\"npcbots\", \"DespawnWandererBot(): trying to despawn non-existing wanderer bot {} '{}'!\", entry, bot ? bot->GetName() : \"unknown\");\n+}\n+\n+struct WanderingBotsGenerator\n+{\n+private:\n+    using NodeVec = std::vector<WanderNode const*>;\n+\n+    const std::map<uint8, uint32> wbot_faction_for_ex_class = {\n+        {BOT_CLASS_BM, FACTION_TEMPLATE_NEUTRAL_HOSTILE/*2u*/},\n+        {BOT_CLASS_SPHYNX, FACTION_TEMPLATE_NEUTRAL_HOSTILE},\n+        {BOT_CLASS_ARCHMAGE, FACTION_TEMPLATE_NEUTRAL_HOSTILE/*1u*/},\n+        {BOT_CLASS_DREADLORD, FACTION_TEMPLATE_NEUTRAL_HOSTILE},\n+        {BOT_CLASS_SPELLBREAKER, FACTION_TEMPLATE_NEUTRAL_HOSTILE/*1610u*/},\n+        {BOT_CLASS_DARK_RANGER, FACTION_TEMPLATE_NEUTRAL_HOSTILE},\n+        {BOT_CLASS_NECROMANCER, FACTION_TEMPLATE_NEUTRAL_HOSTILE},\n+        {BOT_CLASS_SEA_WITCH, FACTION_TEMPLATE_NEUTRAL_HOSTILE},\n+        {BOT_CLASS_CRYPT_LORD, FACTION_TEMPLATE_NEUTRAL_HOSTILE}\n+    };\n+\n+    uint32 next_bot_id;\n+    uint32 enabledBotsCount;\n+\n+    WanderingBotsGenerator()\n+    {\n+        next_bot_id = BOT_ENTRY_CREATE_BEGIN - 1;\n+        QueryResult result = CharacterDatabase.PQuery(\"SELECT value FROM worldstates WHERE entry = {}\", uint32(BOT_GIVER_ENTRY));\n+        if (!result)\n+        {\n+            BOT_LOG_WARN(\"server.loading\", \"Next bot id for autogeneration is not found! Resetting! (client cache may interfere with names)\");\n+            for (uint32 bot_cid : BotDataMgr::GetExistingNPCBotIds())\n+                if (bot_cid > next_bot_id)\n+                    next_bot_id = bot_cid;\n+            CharacterDatabase.DirectPExecute(\"INSERT INTO worldstates (entry, value, comment) VALUES ({}, {}, '{}')\",\n+                uint32(BOT_GIVER_ENTRY), next_bot_id, \"NPCBOTS MOD - last autogenerated bot entry\");\n+        }\n+        else\n+            next_bot_id = result->Fetch()[0].GetUInt32();\n+\n+        ASSERT(next_bot_id > BOT_ENTRY_BEGIN);\n+\n+        for (uint8 c = BOT_CLASS_WARRIOR; c < BOT_CLASS_END; ++c)\n+            if (BotCfg::IsWanderingClassEnabled(c) && !_spareBotIdsPerClassMap.contains(c))\n+                _spareBotIdsPerClassMap.insert({ c, {} });\n+\n+        for (auto const& [id, extras] : _botsExtras)\n+        {\n+            uint8 c = extras.bclass;\n+            if (c != BOT_CLASS_NONE && BotCfg::IsWanderingClassEnabled(c))\n+            {\n+                ++enabledBotsCount;\n+                if (!_botsData.contains(id))\n+                {\n+                    ASSERT(_spareBotIdsPerClassMap.contains(c));\n+                    _spareBotIdsPerClassMap.at(c).insert(id);\n+                }\n+            }\n+        }\n+\n+        for (uint8 c = BOT_CLASS_WARRIOR; c < BOT_CLASS_END; ++c)\n+            if (_spareBotIdsPerClassMap.contains(c) && _spareBotIdsPerClassMap.at(c).empty())\n+                _spareBotIdsPerClassMap.erase(c);\n+    }\n+\n+    bool GenerateWanderingBotToSpawn(std::pair<uint8, uint32> const& spareBotPair, uint8 desired_bracket,\n+        NodeVec const& spawns_a, NodeVec const& spawns_h, NodeVec const& spawns_n,\n+        bool immediate, PvPDifficultyEntry const* bracketEntry, NpcBotRegistry* registry)\n+    {\n+        CreatureTemplateContainer const& all_templates = sObjectMgr->GetCreatureTemplates();\n+\n+        while (all_templates.contains(++next_bot_id));\n+\n+        const uint8 bot_class = spareBotPair.first;\n+        const uint32 orig_entry = spareBotPair.second;\n+        CreatureTemplate const* orig_template = ASSERT_NOTNULL(sObjectMgr->GetCreatureTemplate(orig_entry));\n+        NpcBotExtras const* orig_extras = ASSERT_NOTNULL(BotDataMgr::SelectNpcBotExtras(orig_entry));\n+        uint32 bot_faction = BotDataMgr::GetDefaultFactionForBotRaceClass(bot_class, orig_extras->race);\n+\n+        NodeVec const* bot_spawn_nodes;\n+        TeamId bot_team = BotDataMgr::GetTeamIdForFaction(bot_faction);\n+        switch (bot_team)\n+        {\n+            case TEAM_ALLIANCE:\n+                bot_spawn_nodes = &spawns_a;\n+                break;\n+            case TEAM_HORDE:\n+                bot_spawn_nodes = &spawns_h;\n+                break;\n+            default:\n+                bot_spawn_nodes = &spawns_n;\n+                break;\n+        }\n+        NodeVec level_nodes;\n+        level_nodes.reserve(bot_spawn_nodes->size());\n+        desired_bracket = std::max<uint8>(desired_bracket, BotDataMgr::GetMinLevelForBotClass(bot_class) / 10);\n+        for (WanderNode const* node : *bot_spawn_nodes)\n+        {\n+            if (desired_bracket * 10 + 9 >= node->GetLevels().first && node->GetLevels().second >= desired_bracket * 10)\n+                level_nodes.push_back(node);\n+        }\n+\n+        ASSERT(!level_nodes.empty());\n+        WanderNode const* spawnLoc = Bcore::Containers::SelectRandomContainerElement(level_nodes);\n+\n+        CreatureTemplate& bot_template = _botsWanderCreatureTemplates[next_bot_id];\n+        //copy all fields\n+        bot_template = *orig_template;\n+        bot_template.Entry = next_bot_id;\n+        bot_template.Title = \"\";\n+        bot_template.speed_run = BotCfg::GetBotWandererSpeedMod();\n+        bot_template.KillCredit[0] = orig_entry;\n+        //bot_template.type_flags |= CREATURE_TYPE_FLAG_FORCE_GOSSIP;\n+\n+        uint32 max_level = DEFAULT_MAX_LEVEL;\n+        if (bracketEntry && BotCfg::IsBotLevelCappedByConfigBG())\n+        {\n+            max_level = std::min<uint32>(sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL), max_level);\n+            max_level = std::min<uint32>(GetMaxLevelForExpansion(sWorld->getIntConfig(CONFIG_EXPANSION)), max_level);\n+        }\n+\n+        if (bracketEntry)\n+        {\n+            //force level range for bgs\n+            bot_template.minlevel = std::min<uint32>(bracketEntry->MinLevel, max_level);\n+            bot_template.maxlevel = std::min<uint32>(bracketEntry->MaxLevel, max_level);\n+            if (sWorld->getBoolConfig(CONFIG_BG_XP_FOR_KILL))\n+                bot_template.flags_extra &= ~(CREATURE_FLAG_EXTRA_NO_XP);\n+        }\n+        else\n+        {\n+            bot_template.minlevel = std::min<uint32>(std::max<uint32>(desired_bracket * 10, spawnLoc->GetLevels().first), max_level);\n+            bot_template.maxlevel = std::min<uint32>(std::min<uint32>(desired_bracket * 10 + 9, spawnLoc->GetLevels().second), max_level);\n+            bot_template.flags_extra &= ~(CREATURE_FLAG_EXTRA_NO_XP);\n+\n+            if (sWorld->IsFFAPvPRealm())\n+            {\n+                bot_template.faction = FACTION_TEMPLATE_NEUTRAL_HOSTILE;\n+                bot_faction = FACTION_TEMPLATE_NEUTRAL_HOSTILE;\n+            }\n+        }\n+\n+        bot_template.InitializeQueryData();\n+\n+        uint8 bot_spec = bot_ai::SelectSpecForClass(bot_class);\n+        _botsData.emplace(std::piecewise_construct, std::forward_as_tuple(next_bot_id), std::forward_as_tuple(bot_ai::DefaultRolesForClass(bot_class, bot_spec), bot_faction, bot_spec));\n+        _botsExtras.emplace(next_bot_id, NpcBotExtras{.race = orig_extras->race, .bclass = bot_class});\n+        if (NpcBotAppearanceData const* orig_apdata = BotDataMgr::SelectNpcBotAppearance(orig_entry))\n+            _botsAppearanceData.emplace(std::piecewise_construct, std::forward_as_tuple(next_bot_id), std::forward_as_tuple(orig_apdata->gender, orig_apdata->skin, orig_apdata->face, orig_apdata->hair, orig_apdata->haircolor, orig_apdata->features));\n+\n+        int8 beqId = 1;\n+        _botsWanderCreatureEquipmentTemplates[next_bot_id] = sObjectMgr->GetEquipmentInfo(orig_entry, beqId);\n+\n+        //We do not create CreatureData for generated bots\n+\n+        CellCoord c = Bcore::ComputeCellCoord(spawnLoc->m_positionX, spawnLoc->m_positionY);\n+        GridCoord g = Bcore::ComputeGridCoord(spawnLoc->m_positionX, spawnLoc->m_positionY);\n+        ASSERT(c.IsCoordValid(), \"Invalid Cell coord!\");\n+        ASSERT(g.IsCoordValid(), \"Invalid Grid coord!\");\n+        Map* map = sMapMgr->CreateBaseMap(spawnLoc->GetMapId());\n+        ASSERT(map->GetEntry()->IsContinent() || map->GetEntry()->IsBattlegroundOrArena(), \"%s\", map->GetDebugInfo().c_str());\n+\n+        if (immediate)\n+            SpawnWandererBot(next_bot_id, spawnLoc, registry);\n+        else\n+            _botsWanderCreaturesToSpawn.emplace_back(next_bot_id, spawnLoc);\n+\n+        _spareBotIdsPerClassMap.at(bot_class).erase(orig_entry);\n+        if (_spareBotIdsPerClassMap.at(bot_class).empty())\n+            _spareBotIdsPerClassMap.erase(bot_class);\n+\n+        return true;\n+    }\n+\n+public:\n+    uint32 GetEnabledBotsCount() const { return enabledBotsCount; }\n+\n+    uint32 GetSpareBotsCount(TeamId teamId = TEAM_NEUTRAL) const\n+    {\n+        uint32 count = 0;\n+        for (auto const& [bot_class, bots] : _spareBotIdsPerClassMap)\n+        {\n+            if (teamId == TEAM_NEUTRAL)\n+                count += bots.size();\n+            else\n+            {\n+                if (bot_class >= BOT_CLASS_EX_START)\n+                {\n+                    auto cit = wbot_faction_for_ex_class.find(bot_class);\n+                    if (cit != wbot_faction_for_ex_class.cend() && cit->second == FACTION_TEMPLATE_NEUTRAL_HOSTILE)\n+                        continue;\n+                }\n+\n+                for (uint32 entry : bots)\n+                {\n+                    NpcBotExtras const* extras = ASSERT_NOTNULL(BotDataMgr::SelectNpcBotExtras(entry));\n+                    uint32 bot_faction = BotDataMgr::GetDefaultFactionForBotRaceClass(extras->bclass, extras->race);\n+                    TeamId bot_team = BotDataMgr::GetTeamIdForFaction(bot_faction);\n+                    if (teamId == bot_team)\n+                        ++count;\n+                }\n+            }\n+        }\n+        return count;\n+    }\n+\n+    bool GenerateWanderingBotsToSpawn(uint32 count, int32 map_id, int32 team, bool immediate, PvPDifficultyEntry const* bracketEntry, NpcBotRegistry* registry, uint32& spawned)\n+    {\n+        using NodeVec = std::vector<WanderNode const*>;\n+\n+        if (_spareBotIdsPerClassMap.empty())\n+            return false;\n+\n+        std::array<NodeVec, 3> spawns_all{};\n+        for (NodeVec& vec : spawns_all)\n+            vec.reserve(WanderNode::GetWPMapsCount() * 20u);\n+\n+        auto& [spawns_a, spawns_h, spawns_n] = spawns_all;\n+        WanderNode::DoForAllWPs([map_id = map_id, &spawns_a = spawns_a, &spawns_h = spawns_h, &spawns_n = spawns_n](WanderNode const* wp) {\n+            MapEntry const* mapEntry = sMapStore.LookupEntry(wp->GetMapId());\n+            if ((map_id == -1) ? mapEntry->IsWorldMap() : (int32(mapEntry->ID) == map_id))\n+            {\n+                if (wp->HasFlag(BotWPFlags::BOTWP_FLAG_SPAWN))\n+                {\n+                    if (bot_ai::IsWanderNodeAvailableForBotFaction(wp, FACTION_TEMPLATE_ALLIANCE_DEFAULT, false, true))\n+                        spawns_a.emplace_back(wp);\n+                    else if (bot_ai::IsWanderNodeAvailableForBotFaction(wp, FACTION_TEMPLATE_HORDE_DEFAULT, false, true))\n+                        spawns_h.emplace_back(wp);\n+                    if (bot_ai::IsWanderNodeAvailableForBotFaction(wp, FACTION_TEMPLATE_NEUTRAL_HOSTILE, false, true))\n+                        spawns_n.emplace_back(wp);\n+                }\n+            }\n+        });\n+\n+        bool found_maxlevel_node_a = false;\n+        bool found_maxlevel_node_h = false;\n+        bool found_maxlevel_node_n = false;\n+        const uint8 maxof_minclasslvl_nor = BotDataMgr::GetMinLevelForBotClass(BOT_CLASS_DEATH_KNIGHT); // 55\n+        const uint8 maxof_minclasslvl_ex = BotDataMgr::GetMinLevelForBotClass(BOT_CLASS_DREADLORD); // 60\n+        for (WanderNode const* wp : spawns_a)\n+        {\n+            if (wp->GetLevels().second >= maxof_minclasslvl_nor)\n+            {\n+                found_maxlevel_node_a = true;\n+                break;\n+            }\n+        }\n+        for (WanderNode const* wp : spawns_h)\n+        {\n+            if (wp->GetLevels().second >= maxof_minclasslvl_nor)\n+            {\n+                found_maxlevel_node_h = true;\n+                break;\n+            }\n+        }\n+        for (WanderNode const* wp : spawns_n)\n+        {\n+            if (wp->GetLevels().second >= maxof_minclasslvl_ex)\n+            {\n+                found_maxlevel_node_n = true;\n+                break;\n+            }\n+        }\n+\n+        PctBrackets bracketPcts{};\n+        PctBrackets bots_per_bracket{};\n+\n+        std::vector<std::pair<uint8, uint32>> teamSpareBotIdsPerClass;\n+        teamSpareBotIdsPerClass.reserve(count);\n+\n+        if (team == -1)\n+        {\n+            if (!found_maxlevel_node_a || !found_maxlevel_node_h || !found_maxlevel_node_n)\n+                return false;\n+\n+            //make a full copy\n+            for (auto const& [bot_class, spare_bots] : _spareBotIdsPerClassMap)\n+                for (uint32 spareBotId : spare_bots)\n+                    teamSpareBotIdsPerClass.emplace_back(bot_class, spareBotId);\n+            bracketPcts = BotCfg::GetBotWandererLevelBrackets();\n+        }\n+        else\n+        {\n+            ASSERT(bracketEntry);\n+\n+            bracketPcts[bracketEntry->MinLevel / 10] = 100u;\n+            switch (team)\n+            {\n+                case ALLIANCE:\n+                    if (!found_maxlevel_node_a)\n+                        return false;\n+                    break;\n+                case HORDE:\n+                    if (!found_maxlevel_node_h)\n+                        return false;\n+                    break;\n+                case TEAM_OTHER:\n+                default:\n+                    if (!found_maxlevel_node_n)\n+                        return false;\n+                    break;\n+            }\n+\n+            for (auto const& [bot_class, spare_bots] : _spareBotIdsPerClassMap)\n+            {\n+                for (uint32 spareBotId : spare_bots)\n+                {\n+                    NpcBotExtras const* orig_extras = ASSERT_NOTNULL(BotDataMgr::SelectNpcBotExtras(spareBotId));\n+                    uint32 bot_faction = BotDataMgr::GetDefaultFactionForBotRaceClass(orig_extras->bclass, orig_extras->race);\n+                    uint32 botTeam = BotDataMgr::GetTeamForFaction(bot_faction);\n+\n+                    if (int32(botTeam) != team)\n+                        continue;\n+\n+                    if (BotDataMgr::GetMinLevelForBotClass(bot_class) > bracketEntry->MaxLevel)\n+                        continue;\n+\n+                    teamSpareBotIdsPerClass.emplace_back(bot_class, spareBotId);\n+                }\n+            }\n+        }\n+\n+        if (teamSpareBotIdsPerClass.empty())\n+            return false;\n+\n+        uint32 total_bots_in_brackets = 0;\n+        for (size_t k{}; k < BRACKETS_COUNT; ++k)\n+        {\n+            if (!bracketPcts[k])\n+                continue;\n+            bots_per_bracket[k] = CalculatePct(count, bracketPcts[k]);\n+            total_bots_in_brackets += bots_per_bracket[k];\n+        }\n+        for (std::make_signed_t<std::size_t> j = BRACKETS_COUNT - 1; j >= 0; --j)\n+        {\n+            if (bots_per_bracket[j])\n+            {\n+                bots_per_bracket[j] += count - total_bots_in_brackets;\n+                break;\n+            }\n+        }\n+\n+        std::vector<uint8> brackets_shuffled;\n+        brackets_shuffled.reserve(count);\n+        for (uint8 bracket{}; bracket < BRACKETS_COUNT; ++bracket)\n+        {\n+            while (bots_per_bracket[bracket])\n+            {\n+                brackets_shuffled.push_back(bracket);\n+                --bots_per_bracket[bracket];\n+            }\n+        }\n+\n+        Bcore::Containers::RandomShuffle(teamSpareBotIdsPerClass);\n+        Bcore::Containers::RandomShuffle(brackets_shuffled);\n+\n+        for (std::size_t i{}; i < brackets_shuffled.size() && !teamSpareBotIdsPerClass.empty();) // i is a counter, NOT used as index or value\n+        {\n+            uint8 bracket = brackets_shuffled[i];\n+\n+            int8 tries = 100;\n+            do {\n+                --tries;\n+                if (GenerateWanderingBotToSpawn(teamSpareBotIdsPerClass.back(), bracket, spawns_a, spawns_h, spawns_n, immediate, bracketEntry, registry))\n+                {\n+                    ++i;\n+                    ++spawned;\n+                    teamSpareBotIdsPerClass.pop_back();\n+                    break;\n+                }\n+            } while (tries >= 0);\n+\n+            if (tries < 0)\n+                return false;\n+        }\n+\n+        CharacterDatabase.PExecute(\"UPDATE worldstates SET value = {} WHERE entry = {}\", next_bot_id, uint32(BOT_GIVER_ENTRY));\n+\n+        return true;\n+    }\n+\n+    static WanderingBotsGenerator* instance()\n+    {\n+        static WanderingBotsGenerator _instance;\n+        return &_instance;\n+    }\n+};\n+#define sBotGen WanderingBotsGenerator::instance()\n+\n+void BotDataMgr::Update(uint32 diff)\n+{\n+    botSpawnEvents.Update(diff);\n+    for (auto& [_, events] : botBGJoinEvents)\n+        events.Update(diff);\n+\n+    //lock is not needed here\n+    for (Creature const* bot : _existingBots)\n+    {\n+        if (bot->IsFreeBot() && !bot->IsWandererBot() && !bot->IsInWorld() && bot->FindMap() && !!SelectNpcBotData(bot->GetEntry()))\n+        {\n+            bot->GetBotAI()->CommonTimers(diff);\n+            bot->GetBotAI()->UpdateAI(diff);\n+        }\n+    }\n+\n+    if (!_botsWanderCreaturesToDespawn.empty())\n+    {\n+        BOT_LOG_DEBUG(\"npcbots\", \"Bots to despawn: {}\", uint32(_botsWanderCreaturesToDespawn.size()));\n+\n+        while (!_botsWanderCreaturesToDespawn.empty())\n+        {\n+            uint32 bot_despawn_id = *_botsWanderCreaturesToDespawn.begin();\n+\n+            Creature* bot = const_cast<Creature*>(ASSERT_NOTNULL(FindBot(bot_despawn_id)));\n+\n+            if (!bot->IsInWorld())\n+                break;\n+\n+            _botsWanderCreaturesToDespawn.erase(bot_despawn_id);\n+\n+            uint32 origEntry = _botsWanderCreatureTemplates.at(bot_despawn_id).KillCredit[0];\n+            std::string_view botName = bot->GetName();\n+\n+            _spareBotIdsPerClassMap[bot->GetBotClass()].insert(origEntry);\n+\n+            BotMgr::CleanupsBeforeBotDelete(bot);\n+            bot->GetBotAI()->canUpdate = false;\n+            bot->GetMap()->AddObjectToRemoveList(bot);\n+\n+            auto bditr = _botsData.find(bot_despawn_id);\n+            auto beitr = _botsExtras.find(bot_despawn_id);\n+            auto baditr = _botsAppearanceData.find(bot_despawn_id);\n+            auto bwcetitr = _botsWanderCreatureEquipmentTemplates.find(bot_despawn_id);\n+            auto bwctitr = _botsWanderCreatureTemplates.find(bot_despawn_id);\n+\n+            ASSERT(bditr != _botsData.end());\n+            ASSERT(beitr != _botsExtras.end());\n+            //ASSERT(baditr != _botsAppearanceData.end()); may not exist\n+            ASSERT(bwcetitr != _botsWanderCreatureEquipmentTemplates.end());\n+            ASSERT(bwctitr != _botsWanderCreatureTemplates.end());\n+\n+            _botsData.erase(bditr);\n+            _botsExtras.erase(beitr);\n+            if (baditr != _botsAppearanceData.end())\n+                _botsAppearanceData.erase(baditr);\n+            _botsWanderCreatureEquipmentTemplates.erase(bwcetitr);\n+            _botsWanderCreatureTemplates.erase(bwctitr);\n+\n+            BOT_LOG_DEBUG(\"npcbots\", \"Despawned wanderer bot {} '{}' (orig {})\", bot_despawn_id, botName, origEntry);\n+        }\n+    }\n+\n+    if (!_botsWanderCreaturesToSpawn.empty())\n+    {\n+        static const uint32 WANDERING_BOT_SPAWN_DELAY = 500;\n+\n+        next_wandering_bot_spawn_delay += diff;\n+\n+        while (next_wandering_bot_spawn_delay >= WANDERING_BOT_SPAWN_DELAY && !_botsWanderCreaturesToSpawn.empty())\n+        {\n+            next_wandering_bot_spawn_delay -= WANDERING_BOT_SPAWN_DELAY;\n+\n+            auto const& p = _botsWanderCreaturesToSpawn.front();\n+\n+            uint32 bot_id = p.first;\n+            WanderNode const* spawnLoc = p.second;\n+\n+            _botsWanderCreaturesToSpawn.pop_front();\n+\n+            SpawnWandererBot(bot_id, spawnLoc, nullptr);\n+        }\n+\n+        return;\n+    }\n+}\n+\n+std::shared_mutex* BotDataMgr::GetLock()\n+{\n+    static std::shared_mutex _lock;\n+    return &_lock;\n+}\n+\n+bool BotDataMgr::AllBotsLoaded()\n+{\n+    return allBotsLoaded;\n+}\n+\n+void BotDataMgr::LoadNpcBots(bool spawn)\n+{\n+    if (allBotsLoaded)\n+        return;\n+\n+    BOT_LOG_INFO(\"server.loading\", \"Starting NpcBot system...\");\n+\n+    GenerateBotCustomSpells();\n+\n+    uint32 botoldMSTime = getMSTime();\n+\n+    Field* field;\n+    uint8 index;\n+\n+    //                                                      1       2     3     4     5          6\n+    QueryResult result = WorldDatabase.Query(\"SELECT entry, gender, skin, face, hair, haircolor, features FROM creature_template_npcbot_appearance\");\n+    if (result)\n+    {\n+        do\n+        {\n+            field = result->Fetch();\n+            index = 0;\n+            uint32 entry = field[  index].GetUInt32();\n+\n+            if (!sObjectMgr->GetCreatureTemplate(entry))\n+            {\n+                BOT_LOG_ERROR(\"server.loading\", \"Bot entry {} has appearance data but doesn't exist in `creature_template` table! Skipped.\", entry);\n+                continue;\n+            }\n+\n+            uint8 bot_gender =    field[++index].GetUInt8();\n+            uint8 bot_skin =      field[++index].GetUInt8();\n+            uint8 bot_face =      field[++index].GetUInt8();\n+            uint8 bot_hair =      field[++index].GetUInt8();\n+            uint8 bot_haircolor = field[++index].GetUInt8();\n+            uint8 bot_features =  field[++index].GetUInt8();\n+\n+            _botsAppearanceData.emplace(std::piecewise_construct, std::forward_as_tuple(entry), std::forward_as_tuple(bot_gender, bot_skin, bot_face, bot_hair, bot_haircolor, bot_features));\n+\n+        } while (result->NextRow());\n+\n+        BOT_LOG_INFO(\"server.loading\", \">> Bot appearance data loaded\");\n+    }\n+    else\n+        BOT_LOG_INFO(\"server.loading\", \">> Bots appearance data is not loaded. Table `creature_template_npcbot_appearance` is empty!\");\n+\n+    //                                          1      2\n+    result = WorldDatabase.Query(\"SELECT entry, class, race FROM creature_template_npcbot_extras\");\n+    if (result)\n+    {\n+        do\n+        {\n+            field = result->Fetch();\n+            index = 0;\n+            uint32 entry =      field[  index].GetUInt32();\n+\n+            if (!sObjectMgr->GetCreatureTemplate(entry))\n+            {\n+                BOT_LOG_ERROR(\"server.loading\", \"Bot entry {} has extras data but doesn't exist in `creature_template` table! Skipped.\", entry);\n+                continue;\n+            }\n+\n+            uint8 bot_class = field[++index].GetUInt8();\n+            uint8 bot_race =  field[++index].GetUInt8();\n+\n+            _botsExtras.emplace(entry, NpcBotExtras{ .race = bot_race, .bclass = bot_class });\n+\n+        } while (result->NextRow());\n+\n+        BOT_LOG_INFO(\"server.loading\", \">> Bot race data loaded\");\n+    }\n+    else\n+        BOT_LOG_INFO(\"server.loading\", \">> Bots race data is not loaded. Table `creature_template_npcbot_extras` is empty!\");\n+\n+    //                                              1     2        3\n+    result = CharacterDatabase.Query(\"SELECT entry, slot, item_id, fake_id FROM characters_npcbot_transmog\");\n+    if (result)\n+    {\n+        do\n+        {\n+            field = result->Fetch();\n+            index = 0;\n+            uint32 entry =          field[  index].GetUInt32();\n+\n+            if (!sObjectMgr->GetCreatureTemplate(entry))\n+            {\n+                BOT_LOG_ERROR(\"server.loading\", \"Bot entry {} has transmog data but doesn't exist in `creature_template` table! Skipped.\", entry);\n+                continue;\n+            }\n+\n+            _botsTransmogData.try_emplace(entry, NpcBotTransmogData{});\n+\n+            //load data\n+            uint8 slot =            field[++index].GetUInt8();\n+            uint32 item_id =        field[++index].GetUInt32();\n+            int32 fake_id =         field[++index].GetInt32();\n+\n+            _botsTransmogData[entry].transmogs.at(slot) = {item_id, fake_id};\n+\n+        } while (result->NextRow());\n+\n+        BOT_LOG_INFO(\"server.loading\", \">> Bot transmog data loaded\");\n+    }\n+    else\n+        BOT_LOG_INFO(\"server.loading\", \">> Bots transmog data is not loaded. Table `characters_npcbot_transmog` is empty!\");\n+\n+    //                                       0      1      2      3     4        5                          6\n+    result = CharacterDatabase.Query(\"SELECT entry, owner, roles, spec, faction, UNIX_TIMESTAMP(hire_time), shared_owners, \"\n+    //   7          8          9          10              11          12          13         14         15\n+        \"equipMhEx, equipOhEx, equipRhEx, equipHead, equipShoulders, equipChest, equipWaist, equipLegs, equipFeet, \"\n+    //   16          17          18         19         20            21            22             23             24\n+        \"equipWrist, equipHands, equipBack, equipBody, equipFinger1, equipFinger2, equipTrinket1, equipTrinket2, equipNeck, \"\n+    //   25               26\n+        \"spells_disabled, miscvalues FROM characters_npcbot\");\n+\n+    std::vector<uint32> entryList;\n+    if (result)\n+    {\n+        uint32 botcounter = 0;\n+        uint32 datacounter = 0;\n+        std::set<uint32> botgrids;\n+        QueryResult infores;\n+        CreatureTemplate const* proto;\n+        entryList.reserve(result->GetRowCount());\n+\n+        do\n+        {\n+            field = result->Fetch();\n+            index = 0;\n+            uint32 entry =          field[  index].GetUInt32();\n+\n+            if (!sObjectMgr->GetCreatureTemplate(entry))\n+            {\n+                BOT_LOG_ERROR(\"server.loading\", \"Bot entry {} doesn't exist in `creature_template` table! Skipped.\", entry);\n+                continue;\n+            }\n+\n+            //load data\n+            uint32 bot_owner =          field[++index].GetUInt32();\n+            uint32 bot_roles =          field[++index].GetUInt32();\n+            uint8  bot_spec =           field[++index].GetUInt8();\n+            uint32 bot_faction =        field[++index].GetUInt32();\n+            uint64 bot_hire_time =      field[++index].GetUInt64();\n+\n+            entryList.push_back(entry);\n+            _botsData.emplace(std::piecewise_construct, std::forward_as_tuple(entry), std::forward_as_tuple(bot_owner, bot_hire_time, bot_roles, bot_faction, bot_spec));\n+            auto& bot_data = _botsData.at(entry);\n+\n+            for (std::string_view shared_owner_sv : Bcore::Tokenize(field[++index].GetStringView(), ' ', false))\n+            {\n+                if (Optional<uint32> showner_guid = Bcore::StringTo<uint32>(shared_owner_sv))\n+                {\n+                    const ObjectGuid showner_pguid = ObjectGuid::Create<HighGuid::Player>(*showner_guid);\n+                    if (!sCharacterCache->HasCharacterCacheEntry(showner_pguid))\n+                    {\n+                        BOT_LOG_WARN(\"server.loading\", \"Bot entry {} has shared owner {} which doesn't exist! Skipped.\", entry, *showner_guid);\n+                        continue;\n+                    }\n+                    bot_data.shared_owners.insert(*showner_guid);\n+                }\n+            }\n+\n+            for (uint8 i = BOT_SLOT_MAINHAND; i != BOT_INVENTORY_SIZE; ++i)\n+                bot_data.equips[i] = field[++index].GetUInt32();\n+\n+            if (char const* disabled_spells_str = field[++index].GetCString())\n+            {\n+                std::vector<std::string_view> tok = Bcore::Tokenize(disabled_spells_str, ' ', false);\n+                for (std::size_t i{}; i != tok.size(); ++i)\n+                    bot_data.disabled_spells.insert(*(Bcore::StringTo<uint32>(tok[i])));\n+            }\n+\n+            if (char const* miscvalues_str = field[++index].GetCString())\n+            {\n+                std::vector<std::string_view> tok = Bcore::Tokenize(miscvalues_str, ' ', false);\n+                for (std::size_t i{}; i != tok.size(); ++i)\n+                {\n+                    std::vector<std::string_view> tok2 = Bcore::Tokenize(tok[i], ':', false);\n+                    bot_data.miscvalues.emplace(*(Bcore::StringTo<uint32>(tok2[0])), *(Bcore::StringTo<uint32>(tok2[1])));\n+                }\n+            }\n+\n+            ++datacounter;\n+\n+        } while (result->NextRow());\n+\n+        BOT_LOG_INFO(\"server.loading\", \">> Loaded {} bot data entries\", datacounter);\n+\n+        if (spawn)\n+        {\n+            for (uint32 entry : entryList)\n+            {\n+                proto = sObjectMgr->GetCreatureTemplate(entry);\n+                //                                     1     2    3           4           5           6\n+                infores = WorldDatabase.PQuery(\"SELECT guid, map, position_x, position_y, position_z, orientation FROM creature WHERE id = {}\", entry);\n+                if (!infores)\n+                {\n+                    BOT_LOG_ERROR(\"server.loading\", \"Cannot spawn npcbot {} (id: {}), not found in `creature` table!\", proto->Name, entry);\n+                    continue;\n+                }\n+\n+                field = infores->Fetch();\n+                uint32 tableGuid = field[0].GetUInt32();\n+                uint32 mapId = uint32(field[1].GetUInt16());\n+                float pos_x = field[2].GetFloat();\n+                float pos_y = field[3].GetFloat();\n+                float pos_z = field[4].GetFloat();\n+                float ori = field[5].GetFloat();\n+\n+                CellCoord c = Bcore::ComputeCellCoord(pos_x, pos_y);\n+                GridCoord g = Bcore::ComputeGridCoord(pos_x, pos_y);\n+                ASSERT(c.IsCoordValid(), \"Invalid Cell coord!\");\n+                ASSERT(g.IsCoordValid(), \"Invalid Grid coord!\");\n+                Map* map = sMapMgr->CreateBaseMap(mapId);\n+                Position spawnPos(pos_x, pos_y, pos_z, ori);\n+                Creature* bot = new Creature();\n+                if (!bot->LoadBotCreatureFromDB(tableGuid, map, false, false, entry, &spawnPos))\n+                {\n+                    delete bot;\n+                    BOT_LOG_FATAL(\"server.loading\", \"Cannot load npcbot {} from DB!\", entry);\n+                    ABORT();\n+                }\n+\n+                if (!bot->AIM_Initialize())\n+                {\n+                    delete bot;\n+                    BOT_LOG_FATAL(\"server.loading\", \"Cannot initialize npcbot {} AI!\", entry);\n+                    ABORT();\n+                }\n+\n+                if (!bot->IsAlive())\n+                {\n+                    BOT_LOG_WARN(\"server.loading\", \"bot {} is dead, respawning!\", entry);\n+                    bot->setDeathState(JUST_RESPAWNED);\n+                }\n+\n+                BOT_LOG_DEBUG(\"server.loading\", \">> Spawned npcbot {} (id: {}, map: {}, grid: {}, cell: {})\", proto->Name, entry, mapId, g.GetId(), c.GetId());\n+                botgrids.insert(g.GetId());\n+                ++botcounter;\n+            }\n+\n+            BOT_LOG_INFO(\"server.loading\", \">> Spawned {} npcbot(s) within {} grid(s) in {} ms\", botcounter, uint32(botgrids.size()), GetMSTimeDiffToNow(botoldMSTime));\n+        }\n+    }\n+    else\n+        BOT_LOG_INFO(\"server.loading\", \">> Loaded 0 npcbots. Table `characters_npcbot` is empty!\");\n+\n+    std::vector<uint32> invalid_ids;\n+\n+    auto report_inavlid_ids = [&invalid_ids](std::string_view error_msg) {\n+        std::ostringstream ss;\n+        ss << error_msg << \" IDs: \";\n+        for (uint32 bot_id : invalid_ids)\n+            ss << Bcore::ToString(bot_id) << \", \";\n+        ss << \"\\nFix your DB contents and retry\";\n+        ABORT_MSG(ss.str().c_str());\n+    };\n+\n+    for (auto const& [_, cdata] : sObjectMgr->GetAllCreatureData())\n+        if (cdata.id >= BOT_ENTRY_BEGIN && sObjectMgr->GetCreatureTemplate(cdata.id)->IsNPCBot() && std::ranges::find(entryList, cdata.id) == entryList.cend())\n+            invalid_ids.push_back(cdata.id);\n+\n+    if (!invalid_ids.empty())\n+    {\n+        report_inavlid_ids(\"Invalid NPCBot spawns found in `creature` table having no data in `characters_npcbot` table!\");\n+        invalid_ids.clear();\n+    }\n+\n+    for (uint32 bot_id : entryList)\n+        if (!_botsExtras.contains(bot_id))\n+            invalid_ids.push_back(bot_id);\n+\n+    if (!invalid_ids.empty())\n+    {\n+        report_inavlid_ids(\"Invalid NPCBots found in `characters_npcbot` table having no data in `creature_template_npcbot_extras` table!\");\n+        invalid_ids.clear();\n+    }\n+\n+    allBotsLoaded = true;\n+}\n+\n+void BotDataMgr::LoadNpcBotGroupData()\n+{\n+    BOT_LOG_INFO(\"server.loading\", \"Loading NPCBot group members...\");\n+\n+    uint32 oldMSTime = getMSTime();\n+\n+    CharacterDatabase.DirectExecute(\"DELETE FROM characters_npcbot_group_member WHERE guid NOT IN (SELECT guid FROM `groups`)\");\n+    CharacterDatabase.DirectExecute(\"DELETE FROM characters_npcbot_group_member WHERE entry NOT IN (SELECT entry FROM characters_npcbot)\");\n+\n+    //                                                   0     1      2            3         4\n+    QueryResult result = CharacterDatabase.Query(\"SELECT guid, entry, memberFlags, subgroup, roles FROM characters_npcbot_group_member ORDER BY guid\");\n+    if (!result)\n+    {\n+        BOT_LOG_INFO(\"server.loading\", \">> Loaded 0 NPCBot group members. DB table `characters_npcbot_group_member` is empty!\");\n+        return;\n+    }\n+\n+    uint32 count = 0;\n+    do\n+    {\n+        Field* fields = result->Fetch();\n+\n+        uint32 creature_id = fields[1].GetUInt32();\n+        uint8 subgroup = fields[3].GetUInt8();\n+        if (!SelectNpcBotExtras(creature_id))\n+        {\n+            BOT_LOG_WARN(\"server.loading\", \"Table `characters_npcbot_group_member` contains non-NPCBot creature {} which will not be loaded!\", creature_id);\n+            continue;\n+        }\n+\n+        if (Group* group = sGroupMgr->GetGroupByDbStoreId(fields[0].GetUInt32()))\n+        {\n+            group->LoadCreatureMemberFromDB(creature_id, fields[2].GetUInt8(), subgroup, fields[4].GetUInt8());\n+            const_cast<Creature*>(ASSERT_NOTNULL(BotDataMgr::FindBot(creature_id)))->SetBotGroup(group, subgroup);\n+        }\n+        else\n+            BOT_LOG_ERROR(\"misc\", \"BotDataMgr::LoadNpcBotGroupData: Consistency failed, can't find group (storage id: {})\", fields[0].GetUInt32());\n+\n+        ++count;\n+\n+    } while (result->NextRow());\n+\n+    BOT_LOG_INFO(\"server.loading\", \">> Loaded {} NPCBot group members in {} ms\", count, GetMSTimeDiffToNow(oldMSTime));\n+}\n+\n+void BotDataMgr::LoadNpcBotGearStorage()\n+{\n+    BOT_LOG_INFO(\"server.loading\", \"Loading NPCBot items storage...\");\n+\n+    uint32 oldMSTime = getMSTime();\n+\n+    QueryResult result = CharacterDatabase.Query(\n+    //          0               1                   2         3            4           5         6                7                    8              9              10       11       12            13             14       15\n+        \"SELECT ii.creatorGuid, ii.giftCreatorGuid, ii.count, ii.duration, ii.charges, ii.flags, ii.enchantments, ii.randomPropertyId, ii.durability, ii.playedTime, ii.text, ii.guid, ii.itemEntry, ii.owner_guid, gs.guid, gs.item_guid\"\n+        \" FROM  characters_npcbot_gear_storage gs JOIN item_instance ii ON gs.item_guid = ii.guid ORDER BY gs.guid, gs.item_guid\");\n+    if (!result)\n+    {\n+        BOT_LOG_INFO(\"server.loading\", \">> Loaded 0 NPCBot stored gear items. DB table `characters_npcbot_gear_storage` is empty!\");\n+        return;\n+    }\n+\n+    uint32 count = 0;\n+    std::set<uint32> player_guids;\n+    do\n+    {\n+        Field* fields = result->Fetch();\n+\n+        uint32 item_id = fields[12].GetUInt32();\n+        uint32 player_guidlow = fields[14].GetUInt32();\n+        uint32 item_guidlow = fields[15].GetUInt32();\n+\n+        Item* item = new Item();\n+        ObjectGuid player_guid = ObjectGuid::Create<HighGuid::Player>(player_guidlow);\n+        ASSERT(item->LoadFromDB(item_guidlow, player_guid, fields, item_id), \"LoadNpcBotGearStorage(): unable to load item %u id %u! Owner: %s\", item_guidlow, item_id, player_guid.ToString().c_str());\n+\n+        _botStoredGearMap[player_guid].insert(item);\n+        player_guids.insert(player_guidlow);\n+        ++count;\n+\n+    } while (result->NextRow());\n+\n+    BOT_LOG_INFO(\"server.loading\", \">> Loaded {} NPCBot stored items for {} bot owners in {} ms\", count, uint32(player_guids.size()), GetMSTimeDiffToNow(oldMSTime));\n+}\n+\n+void BotDataMgr::LoadNpcBotGearSets()\n+{\n+    BOT_LOG_INFO(\"server.loading\", \"Loading NPCBot item sets...\");\n+\n+    uint32 oldMSTime = getMSTime();\n+\n+    auto make_set_guid = [](uint32 plow, uint8 set_id) { return MAKE_PAIR64(plow, set_id); };\n+    auto unpack_set_guid = [](uint64 set_guid) { return std::tuple(PAIR64_LOPART(set_guid), (uint8)PAIR64_HIPART(set_guid)); };\n+\n+    //                                                   0      1       2\n+    QueryResult result = CharacterDatabase.Query(\"SELECT owner, set_id, set_name FROM characters_npcbot_gear_set\");\n+    if (!result)\n+    {\n+        BOT_LOG_INFO(\"server.loading\", \">> Loaded 0 NPCBot item sets. DB table `characters_npcbot_gear_set` is empty!\");\n+        return;\n+    }\n+\n+    std::set<uint32> player_guids;\n+    std::set<uint64> set_guids;\n+    do\n+    {\n+        Field* fields = result->Fetch();\n+\n+        uint32 player_guidlow = fields[0].GetUInt32();\n+        uint8 set_id          = fields[1].GetUInt8();\n+        std::string set_name  = fields[2].GetString();\n+\n+        ObjectGuid player_guid = ObjectGuid::Create<HighGuid::Player>(player_guidlow);\n+\n+        UpdateBotItemSet(player_guid, set_id, std::move(set_name));\n+\n+        player_guids.insert(player_guidlow);\n+        set_guids.insert(make_set_guid(player_guidlow, set_id));\n+\n+    } while (result->NextRow());\n+\n+    //                                       0      1       2     3\n+    result = CharacterDatabase.Query(\"SELECT owner, set_id, slot, item_id FROM characters_npcbot_gear_set_item ORDER BY owner,set_id,slot\");\n+\n+    std::set<uint64> invalid_sets;\n+    if (!result)\n+        invalid_sets = set_guids; //full copy\n+    else\n+    {\n+        do\n+        {\n+            Field* fields = result->Fetch();\n+\n+            uint32 player_guidlow = fields[0].GetUInt32();\n+            uint8 set_id          = fields[1].GetUInt8();\n+            uint8 slot            = fields[2].GetUInt8();\n+            uint32 item_id        = fields[3].GetUInt32();\n+\n+            uint64 set_guid = make_set_guid(player_guidlow, set_id);\n+\n+            if (!player_guids.contains(player_guidlow))\n+            {\n+                BOT_LOG_ERROR(\"server.loading\", \"Table `characters_npcbot_gear_set_item` contains values '{} {} {}' for non-existent player {}. Removing!\",\n+                    uint32(set_id), uint32(slot), item_id, player_guidlow);\n+                invalid_sets.insert(set_guid);\n+                continue;\n+            }\n+\n+            if (!set_guids.contains(set_guid))\n+            {\n+                BOT_LOG_ERROR(\"server.loading\", \"Table `characters_npcbot_gear_set_item` contains values '{} {}' for non-existent item set {} (player {}). Removing!\",\n+                    uint32(slot), item_id, uint32(set_id), player_guidlow);\n+                invalid_sets.insert(set_guid);\n+                continue;\n+            }\n+\n+            if (set_id >= MAX_BOT_EQUIPMENT_SETS)\n+            {\n+                BOT_LOG_ERROR(\"server.loading\", \"Table `characters_npcbot_gear_set_item` contains invalid set id {} (player {}). Removing!\",\n+                    uint32(set_id), player_guidlow);\n+                invalid_sets.insert(set_guid);\n+                continue;\n+            }\n+\n+            if (slot >= BOT_INVENTORY_SIZE)\n+            {\n+                BOT_LOG_ERROR(\"server.loading\", \"Table `characters_npcbot_gear_set_item` contains invalid slot {} for item set {} (player {}). Removing!\",\n+                    uint32(slot), uint32(set_id), player_guidlow);\n+                invalid_sets.insert(set_guid);\n+                continue;\n+            }\n+\n+            if (!sObjectMgr->GetItemTemplate(item_id))\n+            {\n+                BOT_LOG_ERROR(\"server.loading\", \"Table `characters_npcbot_gear_set_item` contains invalid item id {} in slot {} for item set {} (player {}). Removing!\",\n+                    item_id, uint32(slot), uint32(set_id), player_guidlow);\n+                invalid_sets.insert(set_guid);\n+                continue;\n+            }\n+\n+            ObjectGuid player_guid = ObjectGuid::Create<HighGuid::Player>(player_guidlow);\n+\n+            UpdateBotItemSet(player_guid, set_id, slot, item_id);\n+\n+        } while (result->NextRow());\n+    }\n+\n+    if (!invalid_sets.empty())\n+    {\n+        CharacterDatabaseTransaction ctrans = CharacterDatabase.BeginTransaction();\n+        for (uint64 set_guid : invalid_sets)\n+        {\n+            set_guids.erase(set_guid);\n+            auto [player_guidlow, set_id] = unpack_set_guid(set_guid);\n+            ObjectGuid player_guid = ObjectGuid::Create<HighGuid::Player>(player_guidlow);\n+            _botStoredGearSetMap.at(player_guid).at(set_id).clear();\n+            ctrans->PAppend(\"DELETE FROM characters_npcbot_gear_set_item WHERE owner = {} and set_id = {}\", player_guidlow, uint32(set_id));\n+        }\n+\n+        std::set<ObjectGuid::LowType> invalid_players;\n+        for (auto const& [guid, itemsets] : _botStoredGearSetMap)\n+        {\n+            if (std::ranges::all_of(itemsets, [](NpcBotItemSet const& arr) { return arr.is_empty(); }))\n+            {\n+                invalid_players.insert(guid.GetCounter());\n+                ctrans->PAppend(\"DELETE FROM characters_npcbot_gear_set WHERE owner = {}\", guid.GetCounter());\n+                ctrans->PAppend(\"DELETE FROM characters_npcbot_gear_set_item WHERE owner = {}\", guid.GetCounter());\n+            }\n+        }\n+        CharacterDatabase.CommitTransaction(ctrans);\n+\n+        for (ObjectGuid::LowType player_guidlow : invalid_players)\n+        {\n+            player_guids.erase(player_guidlow);\n+            _botStoredGearSetMap.erase(ObjectGuid::Create<HighGuid::Player>(player_guidlow));\n+        }\n+    }\n+\n+    BOT_LOG_INFO(\"server.loading\", \">> Loaded {} NPCBot item sets for {} bot owners in {} ms\", uint32(set_guids.size()), uint32(player_guids.size()), GetMSTimeDiffToNow(oldMSTime));\n+}\n+\n+void BotDataMgr::LoadNpcBotMgrData()\n+{\n+    BOT_LOG_INFO(\"server.loading\", \"Loading NPCBot managers data...\");\n+\n+    uint32 oldMSTime = getMSTime();\n+\n+    //                                                   0      1            2            3                  4                  5                 6                  7\n+    QueryResult result = CharacterDatabase.Query(\"SELECT owner, dist_follow, dist_attack, attack_range_mode, attack_angle_mode, engage_delay_dps, engage_delay_heal, flags FROM characters_npcbot_settings\");\n+    if (result)\n+    {\n+        do\n+        {\n+            Field* fields = result->Fetch();\n+\n+            uint32 idx = 0;\n+            ObjectGuid player_guid = ObjectGuid::Create<HighGuid::Player>(fields[  idx].GetUInt32());\n+\n+            if (!sCharacterCache->HasCharacterCacheEntry(player_guid))\n+            {\n+                BOT_LOG_ERROR(\"server.loading\", \"Player {} found in table `characters_npcbot_settings` doesn't exist!\", player_guid.GetCounter());\n+                BotDataMgr::RemoveNpcBotMgrDataFromDB(player_guid);\n+                continue;\n+            }\n+\n+            uint8 dist_follow        = fields[++idx].GetUInt8();\n+            uint8 dist_attack        = fields[++idx].GetUInt8();\n+            uint8 attack_range_mode  = fields[++idx].GetUInt8();\n+            uint8 attack_angle_mode  = fields[++idx].GetUInt8();\n+            uint32 engage_delay_dps  = fields[++idx].GetUInt32();\n+            uint32 engage_delay_heal = fields[++idx].GetUInt32();\n+            uint32 flags             = fields[++idx].GetUInt32();\n+\n+            if (dist_follow > 100)\n+            {\n+                BOT_LOG_WARN(\"server.loading\", \"Bot follow distance has invalid value {} > 100 for player {}, reduced!\", uint32(dist_follow), player_guid.GetCounter());\n+                dist_follow = 100;\n+            }\n+            if (dist_attack > 50)\n+            {\n+                BOT_LOG_WARN(\"server.loading\", \"Bot attack distance has invalid value {} > 50 for player {}, reduced!\", uint32(dist_attack), player_guid.GetCounter());\n+                dist_attack = 50;\n+            }\n+            if (attack_range_mode > BOT_ATTACK_RANGE_END)\n+            {\n+                BOT_LOG_WARN(\"server.loading\", \"Bot attack range mode has invalid value {} for player {}, reset to default!\", uint32(attack_range_mode), player_guid.GetCounter());\n+                attack_range_mode = BOT_ATTACK_RANGE_SHORT;\n+            }\n+            if (attack_angle_mode > BOT_ATTACK_ANGLE_END)\n+            {\n+                BOT_LOG_WARN(\"server.loading\", \"Bot attack angle mode has invalid value {} for player {}, reset to default!\", uint32(attack_angle_mode), player_guid.GetCounter());\n+                attack_angle_mode = BOT_ATTACK_ANGLE_NORMAL;\n+            }\n+            if (engage_delay_dps > 10 * IN_MILLISECONDS)\n+            {\n+                BOT_LOG_WARN(\"server.loading\", \"Bot dps engage timer has invalid value {} for player {}, reduced!\", engage_delay_dps, player_guid.GetCounter());\n+                engage_delay_dps = BotCfg::GetEngageDelayDPSDefault();\n+            }\n+            if (engage_delay_heal > 10 * IN_MILLISECONDS)\n+            {\n+                BOT_LOG_WARN(\"server.loading\", \"Bot heal engage timer has invalid value {} for player {}, reduced!\", engage_delay_heal, player_guid.GetCounter());\n+                engage_delay_heal = BotCfg::GetEngageDelayHealDefault();\n+            }\n+            if (flags & ~NPCBOT_MGR_FLAG_MASK_ALL_ALLOWED)\n+            {\n+                BOT_LOG_WARN(\"server.loading\", \"Bot manager flags have invalid value {} for player {}, removing invalid flags!\", flags, player_guid.GetCounter());\n+                flags &= NPCBOT_MGR_FLAG_MASK_ALL_ALLOWED;\n+            }\n+\n+            _botMgrsData.emplace(std::piecewise_construct, std::forward_as_tuple(player_guid), std::forward_as_tuple(dist_follow, dist_attack, attack_range_mode, attack_angle_mode, engage_delay_dps, engage_delay_heal, flags));\n+\n+        } while (result->NextRow());\n+\n+        BOT_LOG_INFO(\"server.loading\", \">> Loaded NPCBot manager data for {} bot owners in {} ms\", uint32(_botMgrsData.size()), GetMSTimeDiffToNow(oldMSTime));\n+    }\n+    else\n+        BOT_LOG_INFO(\"server.loading\", \">> Bot managers data is not loaded. Table `characters_npcbot_settings` is empty!\");\n+}\n+\n+void BotDataMgr::DeleteOldLogs()\n+{\n+    uint32 month_cutoff = static_cast<uint32>(GameTime::GetGameTime() - static_cast<time_t>(BOT_LOG_KEEP_DAYS) * DAY);\n+    CharacterDatabase.PExecute(\"DELETE FROM `characters_npcbot_logs` WHERE timestamp IS NOT NULL AND timestamp < FROM_UNIXTIME({})\", month_cutoff);\n+    BOT_LOG_INFO(\"server.loading\", \"Deleting NPCBot log entries older than {} days...\", BOT_LOG_KEEP_DAYS);\n+}\n+\n+void BotDataMgr::LoadWanderMap(bool reload, bool force_all_maps)\n+{\n+    using WanderNodeLink = WanderNode::WanderNodeLink;\n+    using SpawnMapEx = std::map<uint32, bool>;\n+    using SpawnVector = std::vector<WanderNode const*>;\n+\n+    const std::array<uint32, 4> ALL_CONTINENT_MAPS = { 0u, 1u, 530u, 571u };\n+\n+    if (WanderNode::GetAllWPsCount() > 0u)\n+    {\n+        if (!reload)\n+            return;\n+\n+        WanderNode::RemoveAllWPs();\n+    }\n+\n+    _wpMinSpawnLevelPerMapId.clear();\n+    _wpMaxSpawnLevelPerMapId.clear();\n+\n+    uint32 botoldMSTime = getMSTime();\n+\n+    BOT_LOG_INFO(\"server.loading\", \"Setting up wander map...\");\n+\n+    //                                             0  1     2 3 4 5 6      7      8        9        10    11   12\n+    QueryResult wres = WorldDatabase.Query(\"SELECT id,mapid,x,y,z,o,zoneId,areaId,minlevel,maxlevel,flags,name,links,minwaittime,maxwaittime,proximity FROM creature_template_npcbot_wander_nodes ORDER BY mapid,id\");\n+    if (!wres)\n+    {\n+        BOT_LOG_FATAL(\"server.loading\", \"Failed to load wander points: table `creature_template_npcbot_wander_nodes` is empty!\");\n+        ASSERT(false);\n+    }\n+\n+    const uint32 maxof_minclasslvl_nr = GetMinLevelForBotClass(BOT_CLASS_DEATH_KNIGHT); // 55\n+    const uint32 maxof_minclasslvl_ex = GetMinLevelForBotClass(BOT_CLASS_DREADLORD); // 60\n+\n+    std::unordered_map<uint32, std::pair<WanderNode*, std::vector<std::pair<std::string, std::string>>>> links_to_create;\n+    std::array<SpawnMapEx, 3> SpawnMapsEx{};\n+    SpawnVector all_spawn_nodes;\n+    all_spawn_nodes.reserve(wres->GetRowCount() >> 8);\n+    for (SpawnMapEx& smap : SpawnMapsEx)\n+        for (uint32 mapId : ALL_CONTINENT_MAPS)\n+            if (BotCfg::IsBotGenerationEnabledWorldMapId(mapId))\n+                smap.emplace(mapId, false);\n+\n+    uint32 disabled_nodes = 0;\n+    do\n+    {\n+        Field* fields = wres->Fetch();\n+        uint32 index = 0;\n+\n+        uint32 id             = fields[  index].GetUInt32();\n+        uint32 mapId          = fields[++index].GetUInt16();\n+        float x               = fields[++index].GetFloat();\n+        float y               = fields[++index].GetFloat();\n+        float z               = fields[++index].GetFloat();\n+        float o               = fields[++index].GetFloat();\n+        uint32 zoneId         = fields[++index].GetUInt32();\n+        uint32 areaId         = fields[++index].GetUInt32();\n+        uint8 minLevel        = fields[++index].GetUInt8();\n+        uint8 maxLevel        = fields[++index].GetUInt8();\n+        EnumFlag<BotWPFlags> flags = static_cast<BotWPFlags>(fields[++index].GetUInt32());\n+        std::string name      = fields[++index].GetString();\n+        std::string_view lstr = fields[++index].GetStringView();\n+        uint32 minwaittime    = fields[++index].GetUInt32();\n+        uint32 maxwaittime    = fields[++index].GetUInt32();\n+        float proximity       = fields[++index].GetFloat();\n+\n+        WanderNode::nextWPId = std::max<uint32>(WanderNode::nextWPId, id);\n+\n+        MapEntry const* mapEntry = sMapStore.LookupEntry(mapId);\n+        if (!mapEntry)\n+        {\n+            BOT_LOG_ERROR(\"server.loading\", \"WP {} has invalid map id {}!\", id, mapId);\n+            continue;\n+        }\n+\n+        if (minLevel == 1u && maxLevel == DEFAULT_MAX_LEVEL)\n+            BOT_LOG_WARN(\"server.loading\", \"WP {} has no levels set.\", id);\n+\n+        if (!minLevel || !maxLevel || minLevel > DEFAULT_MAX_LEVEL || maxLevel > DEFAULT_MAX_LEVEL || minLevel > maxLevel)\n+        {\n+            BOT_LOG_WARN(\"server.loading\", \"WP {} has invalid levels min {} max {}! Setting to default...\",\n+                id, uint32(minLevel), uint32(maxLevel));\n+            minLevel = 1;\n+            maxLevel = DEFAULT_MAX_LEVEL;\n+        }\n+\n+        if (flags >= BotWPFlags::BOTWP_FLAG_END)\n+        {\n+            BOT_LOG_WARN(\"server.loading\", \"WP {} has invalid flags {}! Removing all invalid flags...\", id, flags.AsUnderlyingType());\n+            flags &= BotWPFlags::BOTWP_FLAGS_ALL_VALID;\n+        }\n+\n+        const auto nonbg_flags = BotWPFlags::BOTWP_FLAG_BG_FLAG_PICKUP_TARGET | BotWPFlags::BOTWP_FLAG_BG_FLAG_DELIVER_TARGET;\n+        if (flags.HasFlag(nonbg_flags) && !mapEntry->IsBattleground())\n+        {\n+            BOT_LOG_WARN(\"server.loading\", \"WP {} has BG-only flags {} for non-BG map {}! Removing...\", id, (flags & nonbg_flags).AsUnderlyingType(), mapEntry->ID);\n+            flags &= ~nonbg_flags;\n+        }\n+\n+        const std::array conflicting_flags{\n+            std::pair{BotWPFlags::BOTWP_FLAG_ALLIANCE_ONLY, BotWPFlags::BOTWP_FLAG_HORDE_ONLY },\n+            std::pair{BotWPFlags::BOTWP_FLAG_CAN_BACKTRACK_FROM, BotWPFlags::BOTWP_FLAG_MOVEMENT_FORCE_JUMP_END },\n+            std::pair{BotWPFlags::BOTWP_FLAG_BG_MISC_OBJECTIVE_1, BotWPFlags::BOTWP_FLAG_BG_MISC_OBJECTIVE_2 },\n+            std::pair{BotWPFlags::BOTWP_FLAG_BG_OPTIONAL_PICKUP_1, BotWPFlags::BOTWP_FLAG_BG_OPTIONAL_PICKUP_2 },\n+            std::pair{BotWPFlags::BOTWP_FLAG_BG_OPTIONAL_PICKUP_1, BotWPFlags::BOTWP_FLAG_BG_OPTIONAL_PICKUP_3 },\n+            std::pair{BotWPFlags::BOTWP_FLAG_BG_OPTIONAL_PICKUP_1, BotWPFlags::BOTWP_FLAG_BG_OPTIONAL_PICKUP_4 },\n+            std::pair{BotWPFlags::BOTWP_FLAG_BG_OPTIONAL_PICKUP_1, BotWPFlags::BOTWP_FLAG_BG_OPTIONAL_PICKUP_5 },\n+            std::pair{BotWPFlags::BOTWP_FLAG_BG_OPTIONAL_PICKUP_2, BotWPFlags::BOTWP_FLAG_BG_OPTIONAL_PICKUP_3 },\n+            std::pair{BotWPFlags::BOTWP_FLAG_BG_OPTIONAL_PICKUP_2, BotWPFlags::BOTWP_FLAG_BG_OPTIONAL_PICKUP_4 },\n+            std::pair{BotWPFlags::BOTWP_FLAG_BG_OPTIONAL_PICKUP_2, BotWPFlags::BOTWP_FLAG_BG_OPTIONAL_PICKUP_5 },\n+            std::pair{BotWPFlags::BOTWP_FLAG_BG_OPTIONAL_PICKUP_3, BotWPFlags::BOTWP_FLAG_BG_OPTIONAL_PICKUP_4 },\n+            std::pair{BotWPFlags::BOTWP_FLAG_BG_OPTIONAL_PICKUP_3, BotWPFlags::BOTWP_FLAG_BG_OPTIONAL_PICKUP_5 },\n+            std::pair{BotWPFlags::BOTWP_FLAG_BG_OPTIONAL_PICKUP_4, BotWPFlags::BOTWP_FLAG_BG_OPTIONAL_PICKUP_5 },\n+        };\n+        for (std::pair<BotWPFlags, BotWPFlags> const& p : conflicting_flags)\n+        {\n+            const BotWPFlags cflags = p.first | p.second;\n+            if ((flags & cflags) == cflags)\n+            {\n+                BOT_LOG_WARN(\"server.loading\", \"WP {} has conflicting flags {}+{}! Removing both...\", id, AsUnderlyingType(p.first), AsUnderlyingType(p.second));\n+                flags &= ~cflags;\n+            }\n+        }\n+\n+        if (!force_all_maps && mapEntry->IsContinent() && !BotCfg::IsBotGenerationEnabledWorldMapId(mapId))\n+        {\n+            ++disabled_nodes;\n+            continue;\n+        }\n+\n+        WanderNode* wp = new WanderNode(id, mapId, x, y, z, o, zoneId, areaId, std::move(name));\n+        wp->SetLevels(minLevel, maxLevel);\n+        wp->SetFlags(BotWPFlags(flags));\n+        wp->SetWaitTime(minwaittime, maxwaittime);\n+        wp->SetProximity(proximity);\n+\n+        if (wp->HasFlag(BotWPFlags::BOTWP_FLAG_SPAWN) && !lstr.empty())\n+        {\n+            all_spawn_nodes.push_back(wp);\n+\n+            if (!wp->HasFlag(BotWPFlags::BOTWP_FLAG_ALLIANCE_OR_HORDE_ONLY) && wp->GetLevels().second <= 10)\n+                BOT_LOG_WARN(\"server.loading\", \"WP {} is a start location but has no HORDE or ALLIANCE flag assigned! Only Neutral bots will spawn there!\", id);\n+        }\n+\n+        if (lstr.empty())\n+        {\n+            BOT_LOG_ERROR(\"server.loading\", \"WP {} has no links!\", id);\n+            continue;\n+        }\n+        std::vector<std::string_view> tok = Bcore::Tokenize(lstr, ' ', false);\n+        for (std::vector<std::string_view>::size_type i = 0; i != tok.size(); ++i)\n+        {\n+            std::vector<std::string_view> link_str = Bcore::Tokenize(tok[i], ':', false);\n+            ASSERT(link_str.size() == 2u, \"Invalid links_str format: '%s'\", std::string(tok[i].data(), tok[i].length()).c_str());\n+            ASSERT(link_str[0].find(\" \") == std::string_view::npos);\n+            ASSERT(link_str[1].find(\" \") == std::string_view::npos);\n+            ASSERT(Bcore::StringTo<uint32>(link_str[0]) != std::nullopt, \"Invalid links_str format: '%s'\", std::string(tok[i].data(), tok[i].length()).c_str());\n+            ASSERT(Bcore::StringTo<uint32>(link_str[1]) != std::nullopt, \"Invalid links_str format: '%s'\", std::string(tok[i].data(), tok[i].length()).c_str());\n+\n+            std::pair<std::string, std::string> tok_pair = { std::string(link_str[0].data(), link_str[0].length()), std::string(link_str[1].data(), link_str[1].length()) };\n+            auto lit = links_to_create.find(id);\n+            if (lit == links_to_create.cend())\n+                links_to_create[id] = { wp, {std::move(tok_pair)} };\n+            else\n+                lit->second.second.push_back(std::move(tok_pair));\n+        }\n+\n+    } while (wres->NextRow());\n+\n+    auto& [spawn_node_exists_a, spawn_node_exists_h, spawn_node_exists_n] = SpawnMapsEx;\n+    for (WanderNode const* wp : all_spawn_nodes)\n+    {\n+        uint32 mapId = wp->GetMapId();\n+        auto [minLevel, maxLevel] = wp->GetLevels();\n+\n+        spawn_node_exists_a[mapId] |= (maxLevel >= maxof_minclasslvl_nr && bot_ai::IsWanderNodeAvailableForBotFaction(wp, FACTION_TEMPLATE_ALLIANCE_DEFAULT, false, true));\n+        spawn_node_exists_h[mapId] |= (maxLevel >= maxof_minclasslvl_nr && bot_ai::IsWanderNodeAvailableForBotFaction(wp, FACTION_TEMPLATE_HORDE_DEFAULT, false, true));\n+        spawn_node_exists_n[mapId] |= (maxLevel >= maxof_minclasslvl_ex && bot_ai::IsWanderNodeAvailableForBotFaction(wp, FACTION_TEMPLATE_NEUTRAL_HOSTILE, false, true));\n+\n+        decltype(_wpMinSpawnLevelPerMapId)::const_iterator mincit = _wpMinSpawnLevelPerMapId.find(mapId);\n+        _wpMinSpawnLevelPerMapId[mapId] = std::min<uint8>((mincit != _wpMinSpawnLevelPerMapId.cend()) ? mincit->second : uint8(DEFAULT_MAX_LEVEL), minLevel);\n+        decltype(_wpMaxSpawnLevelPerMapId)::const_iterator maxcit = _wpMaxSpawnLevelPerMapId.find(mapId);\n+        _wpMaxSpawnLevelPerMapId[mapId] = std::max<uint8>((maxcit != _wpMaxSpawnLevelPerMapId.cend()) ? maxcit->second : 1u, maxLevel);\n+    }\n+\n+    bool spawn_node_minclasslvl_exists_all = true;\n+    for (auto [map_id, exists] : spawn_node_exists_a)\n+    {\n+        if (!exists)\n+        {\n+            BOT_LOG_FATAL(\"server.loading\", \"No valid Alliance spawn node for at least level {} on map {}! Spawning wandering bots is impossible! Aborting.\",\n+                maxof_minclasslvl_nr, map_id);\n+            spawn_node_minclasslvl_exists_all = false;\n+        }\n+    }\n+    for (auto [map_id, exists] : spawn_node_exists_h)\n+    {\n+        if (!exists)\n+        {\n+            BOT_LOG_FATAL(\"server.loading\", \"No valid Horde spawn node for at least level {} on map {}! Spawning wandering bots is impossible! Aborting.\",\n+                maxof_minclasslvl_nr, map_id);\n+            spawn_node_minclasslvl_exists_all = false;\n+        }\n+    }\n+    for (auto [map_id, exists] : spawn_node_exists_n)\n+    {\n+        if (!exists)\n+        {\n+            if (sMapStore.LookupEntry(map_id)->IsBattlegroundOrArena())\n+                BOT_LOG_INFO(\"server.loading\", \"No valid Neutral spawn node for at least level {} on non-continent map {}.\", maxof_minclasslvl_ex, map_id);\n+            else\n+            {\n+                BOT_LOG_FATAL(\"server.loading\", \"No valid Neutral spawn node for at least level {} on map {}! Spawning wandering bots is impossible! Aborting.\",\n+                    maxof_minclasslvl_ex, map_id);\n+                spawn_node_minclasslvl_exists_all = false;\n+            }\n+        }\n+    }\n+    if (!spawn_node_minclasslvl_exists_all)\n+        ABORT();\n+\n+    const uint8 TEAMS_COUNT = TEAM_NEUTRAL + 1;\n+    std::array team_strs{ \"Alliance\"sv, \"Horde\"sv, \"Neutral\"sv };\n+    std::array<bool, DEFAULT_MAX_LEVEL> spawn_node_levels[TEAMS_COUNT]{ { false } };\n+    uint8 min_spawn_level = DEFAULT_MAX_LEVEL;\n+    uint8 max_spawn_level = 0;\n+    for (WanderNode const* wp : all_spawn_nodes)\n+    {\n+        if (sMapStore.LookupEntry(wp->GetMapId())->IsContinent() && BotCfg::IsBotGenerationEnabledWorldMapId(wp->GetMapId()))\n+        {\n+            auto [minLevel, maxLevel] = wp->GetLevels();\n+            min_spawn_level = std::min<uint32>(min_spawn_level, minLevel);\n+            max_spawn_level = std::max<uint32>(max_spawn_level, maxLevel);\n+        }\n+    }\n+    for (WanderNode const* wp : all_spawn_nodes)\n+    {\n+        if (sMapStore.LookupEntry(wp->GetMapId())->IsContinent())\n+        {\n+            auto [minLevel, maxLevel] = wp->GetLevels();\n+            minLevel = std::max<uint8>(minLevel, 1);\n+            maxLevel = std::min<uint8>(maxLevel, max_spawn_level);\n+            for (uint8 k = 0; k < TEAMS_COUNT; ++k)\n+            {\n+                if ((k == 0 && bot_ai::IsWanderNodeAvailableForBotFaction(wp, FACTION_TEMPLATE_ALLIANCE_DEFAULT, false, true)) ||\n+                    (k == 1 && bot_ai::IsWanderNodeAvailableForBotFaction(wp, FACTION_TEMPLATE_HORDE_DEFAULT, false, true)) ||\n+                    (k == 2 && bot_ai::IsWanderNodeAvailableForBotFaction(wp, FACTION_TEMPLATE_NEUTRAL_HOSTILE, false, true)))\n+                {\n+                    for (size_t i = minLevel; i <= maxLevel; ++i)\n+                        spawn_node_levels[k][i - 1] = true;\n+                }\n+            }\n+        }\n+    }\n+    for (uint8 k = 0; k < TEAMS_COUNT; ++k)\n+    {\n+        auto const& vec = spawn_node_levels[k];\n+        for (size_t i = min_spawn_level; i <= max_spawn_level; ++i)\n+        {\n+            if (vec[i - 1] == false)\n+                BOT_LOG_ERROR(\"server.loading\", \"No {} spawn node found for level {}! Wandering bots may cause a crash!\", team_strs[k], i);\n+        }\n+    }\n+\n+    float mindist = 50000.f;\n+    float maxdist = 0.f;\n+    for (auto const& vt : links_to_create)\n+    {\n+        for (auto const& p : vt.second.second)\n+        {\n+            uint32 lid = *Bcore::StringTo<uint32>(p.first);\n+            uint32 lweight = *Bcore::StringTo<uint32>(p.second);\n+\n+            if (lweight >= 1000)\n+                BOT_LOG_WARN(\"server.loading\", \"WP {} has link {} with suspicious weight of {}, error?\", vt.first, lid, lweight);\n+\n+            if (lid == vt.first)\n+            {\n+                BOT_LOG_ERROR(\"server.loading\", \"WP {} has link {} which links to itself! Skipped.\", vt.first, lid);\n+                continue;\n+            }\n+\n+            WanderNode* lwp = WanderNode::FindInAllWPs(lid);\n+            if (!lwp)\n+            {\n+                BOT_LOG_ERROR(\"server.loading\", \"WP {} has link {} which does not exist!\", vt.first, lid);\n+                continue;\n+            }\n+            if (lwp->GetMapId() != vt.second.first->GetMapId())\n+            {\n+                BOT_LOG_ERROR(\"server.loading\", \"WP {} map {} has link {} ON A DIFFERENT MAP {}!\", vt.first, vt.second.first->GetMapId(), lid, lwp->GetMapId());\n+                continue;\n+            }\n+\n+            bool is_continent = sMapStore.LookupEntry(vt.second.first->GetMapId())->IsContinent();\n+            float lwpdist2d = vt.second.first->GetExactDist2d(lwp);\n+            if (lwpdist2d > MAX_WANDER_NODE_DISTANCE)\n+                BOT_LOG_WARN(\"server.loading\", \"Warning! Link distance between WP {} and {} is too great ({})\", vt.first, lid, lwpdist2d);\n+            if (lwpdist2d < MIN_WANDER_NODE_DISTANCE && is_continent)\n+                BOT_LOG_WARN(\"server.loading\", \"Warning! Link distance between WP {} and {} is low ({})\", vt.first, lid, lwpdist2d);\n+\n+            WanderNodeLink newlink{ .wp = lwp, .weight = lweight };\n+            vt.second.first->Link(std::move(newlink));\n+\n+            if (is_continent)\n+            {\n+                float dist2d = vt.second.first->GetExactDist2d(lwp);\n+                if (dist2d < mindist)\n+                    mindist = dist2d;\n+                if (dist2d > maxdist)\n+                    maxdist = dist2d;\n+            }\n+        }\n+\n+        if (uint32 avg_weight = vt.second.first->GetAverageLinkWeight())\n+        {\n+            for (WanderNodeLink const& wpl : vt.second.first->GetLinks())\n+            {\n+                if (wpl.weight == 0)\n+                    BOT_LOG_WARN(\"server.loading\", \"WP {} has link {} with weight of 0 (average {})! Link will be inaccessible!\", vt.first, wpl.Id(), avg_weight);\n+                else if (float(wpl.weight) < avg_weight / 100.f)\n+                    BOT_LOG_WARN(\"server.loading\", \"WP {} has link {} with weight of {} below 1% average ({}), error?\", vt.first, wpl.Id(), wpl.weight, avg_weight);\n+            }\n+        }\n+    }\n+\n+    std::set<WanderNode const*> tops;\n+    WanderNode::DoForAllWPs([&](WanderNode const* wp) {\n+        auto const& wplinks = wp->GetLinks();\n+        if (!tops.contains(wp) && wplinks.size() == 1u)\n+        {\n+            BOT_LOG_DEBUG(\"server.loading\", \"Node {} ('{}') has single connection!\", wp->GetWPId(), wp->GetName());\n+            WanderNode const* tn = wplinks.begin()->wp;\n+            WanderNode const* prev = nullptr;\n+            std::vector<WanderNode const*> sc_chain;\n+            sc_chain.push_back(wp);\n+            tops.emplace(wp);\n+            while (tn != wp)\n+            {\n+                auto const& tnlinks = tn->GetLinks();\n+                if (tnlinks.size() != 2u || !tn->HasLink(prev ? prev : wp))\n+                {\n+                    sc_chain.push_back(tn);\n+                    break;\n+                }\n+                prev = sc_chain.back();\n+                sc_chain.push_back(tn);\n+                tn = std::ranges::find_if_not(tnlinks, [=](std::remove_cvref_t<decltype(tnlinks)>::value_type const& lwp) { return lwp.wp == prev; })->wp;\n+            }\n+            if (sc_chain.back()->GetLinks().size() == 1u && prev && sc_chain.back()->GetLinks().front().wp == prev)\n+            {\n+                BOT_LOG_DEBUG(\"server.loading\", \"Node {} ('{}') has single connection!\", tn->GetWPId(), tn->GetName());\n+                tops.emplace(sc_chain.back());\n+                std::ostringstream ss;\n+                ss << \"Node \" << (sc_chain.size() == 2u ? \"pair \" : \"chain \");\n+                for (std::size_t i{}; i < sc_chain.size(); ++i)\n+                {\n+                    ss << sc_chain[i]->GetWPId();\n+                    if (i < sc_chain.size() - 1u)\n+                        ss << '-';\n+                }\n+                ss << \" is isolated!\";\n+                BOT_LOG_INFO(\"server.loading\", \"{}\", ss.str());\n+            }\n+        }\n+    });\n+\n+    BOT_LOG_INFO(\"server.loading\", \">> Loaded {} bot wander nodes ({} disabled) on {} maps (total {} tops) in {} ms\",\n+        uint32(WanderNode::GetAllWPsCount()), disabled_nodes, uint32(WanderNode::GetWPMapsCount()), uint32(tops.size()), GetMSTimeDiffToNow(botoldMSTime));\n+}\n+\n+void BotDataMgr::GenerateWanderingBots()\n+{\n+    const uint32 wandering_bots_desired = BotCfg::GetDesiredWanderingBotsCount();\n+\n+    if (wandering_bots_desired == 0)\n+        return;\n+\n+    BOT_LOG_INFO(\"server.loading\", \"Spawning wandering bots...\");\n+\n+    uint32 oldMSTime = getMSTime();\n+\n+    uint32 maxbots = sBotGen->GetSpareBotsCount();\n+    uint32 enabledbots = sBotGen->GetEnabledBotsCount();\n+\n+    if (maxbots < wandering_bots_desired)\n+    {\n+        BOT_LOG_FATAL(\"server.loading\", \"Only {} out of {} bots of enabled classes aren't spawned. Desired amount of wandering bots ({}) cannot be created. Aborting!\",\n+            maxbots, enabledbots, wandering_bots_desired);\n+        ASSERT(false);\n+    }\n+\n+    uint32 spawned_count = 0;\n+    if (!sBotGen->GenerateWanderingBotsToSpawn(wandering_bots_desired, -1, -1, false, nullptr, nullptr, spawned_count))\n+    {\n+        BOT_LOG_FATAL(\"server.loading\", \"Failed to spawn all {} bots ({} succeeded)!\", wandering_bots_desired, spawned_count);\n+        ASSERT(false);\n+    }\n+\n+    BOT_LOG_INFO(\"server.loading\", \">> Set up spawning of {} wandering bots in {} ms\", spawned_count, GetMSTimeDiffToNow(oldMSTime));\n+}\n+\n+bool BotDataMgr::GenerateBattlegroundBots(Player const* groupLeader, [[maybe_unused]] Group const* group, BattlegroundQueue* queue, PvPDifficultyEntry const* bracketEntry, GroupQueueInfo const* gqinfo)\n+{\n+    if (!BotCfg::IsBotGenerationEnabledBGs())\n+        return true;\n+\n+    BattlegroundQueueTypeId bgqTypeId = queue->GetQueueId();\n+    BattlegroundTypeId bgTypeId = BattlegroundTypeId(bgqTypeId.BattlemasterListId);\n+    uint32 ammr = gqinfo->ArenaMatchmakerRating;\n+    BattlegroundBracketId bracketId = bracketEntry->GetBracketId();\n+\n+    uint32 tarteamplayers = BotCfg::GetBGTargetTeamPlayersCount(bgTypeId);\n+\n+    if (tarteamplayers == 0)\n+    {\n+        BOT_LOG_INFO(\"npcbots\", \"[Disabled] BG {} wandering bots generation is disabled (not implemented?)\", uint32(bgTypeId));\n+        return true;\n+    }\n+\n+    //find running BG\n+    auto const& all_bgs = sBattlegroundMgr->GetBgDataStore();\n+    for (auto const& [bg_type_id, bg_data] : all_bgs)\n+    {\n+        if (bg_type_id == bgTypeId)\n+        {\n+            for (auto const& [_, bg_ptr] : bg_data.m_Battlegrounds)\n+            {\n+                Battleground const* real_bg = bg_ptr.get();\n+                if (real_bg->GetInstanceID() != 0 && real_bg->GetBracketId() == bracketId && real_bg->GetStatus() < STATUS_WAIT_LEAVE && real_bg->HasFreeSlots())\n+                {\n+                    if (real_bg->GetFreeSlotsForTeam(groupLeader->GetTeam()) < gqinfo->Players.size())\n+                    {\n+                        BOT_LOG_INFO(\"npcbots\", \"[Already running 1] Found running non-full BG {} instance {}. Not generating bots: queuing group or player (leader {}) CANNOT join existing BG, prevent borrowing bots\",\n+                            uint32(bgTypeId), real_bg->GetInstanceID(), groupLeader->GetGUID().GetCounter());\n+                    }\n+                    else\n+                    {\n+                        BOT_LOG_INFO(\"npcbots\", \"[Already running 2] Found running non-full BG {} instance {}. Not generating bots: queuing group or player (leader {}) CAN join existing BG\",\n+                            uint32(bgTypeId), real_bg->GetInstanceID(), groupLeader->GetGUID().GetCounter());\n+                    }\n+                    return true;\n+                }\n+            }\n+        }\n+    }\n+\n+    Battleground const* bg_template = sBattlegroundMgr->GetBattlegroundTemplate(bgTypeId);\n+\n+    if (!bg_template)\n+        return false;\n+\n+    uint32 minteamplayers = bg_template->GetMinPlayersPerTeam();\n+    uint32 maxteamplayers = bg_template->GetMaxPlayersPerTeam();\n+\n+    uint32 normalCount = tarteamplayers;\n+    RoundToInterval(normalCount, minteamplayers, maxteamplayers);\n+    if (tarteamplayers != normalCount)\n+    {\n+        BOT_LOG_ERROR(\"npcbots\", \"NpcBot.WanderingBots.BG.TargetTeamPlayersCount value {} for BG {} '{}' is out of bounds ({}-{})! Normalized to {}!\",\n+            tarteamplayers, uint32(bgTypeId), bg_template->GetName(), minteamplayers, maxteamplayers, normalCount);\n+        tarteamplayers = normalCount;\n+    }\n+\n+    uint32 queued_players_a = 0;\n+    uint32 queued_players_h = 0;\n+    for (uint8 i = 0; i < BG_QUEUE_GROUP_TYPES_COUNT; ++i)\n+    {\n+        for (GroupQueueInfo const* qgr : queue->m_QueuedGroups[i])\n+        {\n+            if (qgr->Team == ALLIANCE)\n+                queued_players_a += qgr->Players.size();\n+            else\n+                queued_players_h += qgr->Players.size();\n+        }\n+    }\n+\n+    uint32 needed_bots_count_a = (queued_players_a < tarteamplayers) ? (tarteamplayers - queued_players_a) : 0;\n+    uint32 needed_bots_count_h = (queued_players_h < tarteamplayers) ? (tarteamplayers - queued_players_h) : 0;\n+\n+    ASSERT(needed_bots_count_a <= maxteamplayers);\n+    ASSERT(needed_bots_count_h <= maxteamplayers);\n+\n+    if (needed_bots_count_a + needed_bots_count_h == 0)\n+    {\n+        BOT_LOG_INFO(\"npcbots\", \"[No bots required] Failed to generate bots for BG {} inited by player {} ({})\",\n+            uint32(bgTypeId), groupLeader->GetName(), groupLeader->GetGUID().GetCounter());\n+        return true;\n+    }\n+\n+    uint32 spare_bots_a = sBotGen->GetSpareBotsCount(TEAM_ALLIANCE);\n+    uint32 spare_bots_h = sBotGen->GetSpareBotsCount(TEAM_HORDE);\n+\n+    if (queued_players_a + spare_bots_a < minteamplayers)\n+    {\n+        BOT_LOG_INFO(\"npcbots\", \"[Not enough A bots] Failed to generate bots for BG {} inited by player {} ({})\",\n+            uint32(bgTypeId), groupLeader->GetName(), groupLeader->GetGUID().GetCounter());\n+        return false;\n+    }\n+    if (queued_players_h + spare_bots_h < minteamplayers)\n+    {\n+        BOT_LOG_INFO(\"npcbots\", \"[Not enough H bots] Failed to generate bots for BG {} inited by player {} ({})\",\n+            uint32(bgTypeId), groupLeader->GetName(), groupLeader->GetGUID().GetCounter());\n+        return false;\n+    }\n+\n+    needed_bots_count_a = std::min<uint32>(needed_bots_count_a, spare_bots_a);\n+    needed_bots_count_h = std::min<uint32>(needed_bots_count_h, spare_bots_h);\n+\n+    uint32 spawned_a = 0;\n+    uint32 spawned_h = 0;\n+    std::array<NpcBotRegistry, 2> spawned_bots;\n+    auto& [spawned_bots_a, spawned_bots_h] = spawned_bots;\n+\n+    if (needed_bots_count_a)\n+    {\n+        if (!sBotGen->GenerateWanderingBotsToSpawn(needed_bots_count_a, bg_template->GetMapId(), ALLIANCE, true, bracketEntry, &spawned_bots_a, spawned_a))\n+        {\n+            BOT_LOG_WARN(\"npcbots\", \"Failed to spawn {} ALLIANCE bots for BG {} '{}' queued A {} H {} req A {} H {} spare {}\",\n+                needed_bots_count_a, uint32(bg_template->GetTypeID()), bg_template->GetName(),\n+                queued_players_a, queued_players_h, needed_bots_count_a, needed_bots_count_h, spare_bots_a);\n+            for (NpcBotRegistry const& registry1 : spawned_bots)\n+                for (Creature const* bot : registry1)\n+                    DespawnWandererBot(bot->GetEntry());\n+            return false;\n+        }\n+    }\n+    if (needed_bots_count_h)\n+    {\n+        if (!sBotGen->GenerateWanderingBotsToSpawn(needed_bots_count_h, bg_template->GetMapId(), HORDE, true, bracketEntry, &spawned_bots_h, spawned_h))\n+        {\n+            BOT_LOG_WARN(\"npcbots\", \"Failed to spawn {} HORDE bots for BG {} '{}' queued A {} H {} req A {} H {} spare {}\",\n+                needed_bots_count_h, uint32(bg_template->GetTypeID()), bg_template->GetName(),\n+                queued_players_a, queued_players_h, needed_bots_count_a, needed_bots_count_h, spare_bots_h);\n+            for (NpcBotRegistry const& registry2 : spawned_bots)\n+                for (Creature const* bot : registry2)\n+                    DespawnWandererBot(bot->GetEntry());\n+            return false;\n+        }\n+    }\n+\n+    ASSERT(uint32(spawned_bots_a.size()) == needed_bots_count_a);\n+    ASSERT(uint32(spawned_bots_h.size()) == needed_bots_count_h);\n+\n+    botBGJoinEvents[groupLeader->GetGUID()].AddEventAtOffset([ammr = ammr, bgqTypeId = bgqTypeId]() {\n+        sBattlegroundMgr->ScheduleQueueUpdate(ammr, bgqTypeId);\n+    }, Seconds(2));\n+\n+    uint8 maxlevel = BotCfg::IsBotLevelCappedByConfigBGFirstPlayer() ? groupLeader->GetLevel() : 0;\n+    for (NpcBotRegistry const& registry3 : spawned_bots)\n+    {\n+        uint32 seconds_delay = 5;\n+        for (Creature const* bot : registry3)\n+        {\n+            bot->GetBotAI()->SetBotCommandState(BOT_COMMAND_STAY);\n+            bot->GetBotAI()->canUpdate = false;\n+\n+            const_cast<Creature*>(bot)->SetPvP(true);\n+            if (maxlevel && bot->GetLevel() > maxlevel)\n+                const_cast<Creature*>(bot)->SetLevel(maxlevel);\n+            queue->AddBotAsGroup(bot->GetGUID(), GetTeamIdForFaction(bot->GetFaction()) == TEAM_HORDE ? HORDE : ALLIANCE,\n+                bracketEntry, false, gqinfo->ArenaTeamRating, ammr);\n+\n+            seconds_delay = std::min<uint32>(uint32(MINUTE * 2), seconds_delay + std::max<uint32>(1u, uint32((MINUTE / 2) / std::max<uint32>(needed_bots_count_a, needed_bots_count_h))));\n+\n+            BotBattlegroundEnterEvent* bbe = new BotBattlegroundEnterEvent(groupLeader->GetGUID(), bot->GetGUID(), bgqTypeId,\n+                botBGJoinEvents[groupLeader->GetGUID()].CalculateTime(Milliseconds(uint32(INVITE_ACCEPT_WAIT_TIME) + uint32(BG_START_DELAY_2M))).count());\n+            botBGJoinEvents[groupLeader->GetGUID()].AddEventAtOffset(bbe, Seconds(seconds_delay));\n+        }\n+    }\n+\n+    return true;\n+}\n+\n+ItemPerBotClassMap const& BotDataMgr::GetWanderingBotsSortedGearMap()\n+{\n+    return _botsWanderCreaturesSortedGear;\n+}\n+\n+void BotDataMgr::CreateWanderingBotsSortedGear()\n+{\n+    BOT_LOG_INFO(\"server.loading\", \"Sorting wandering bot's gear...\");\n+\n+    uint32 oldMSTime = getMSTime();\n+\n+    std::set<uint32> disabled_item_ids;\n+    QueryResult dires = WorldDatabase.Query(\"SELECT id FROM creature_template_npcbot_disabled_items\");\n+    if (dires)\n+    {\n+        do\n+        {\n+            uint32 id = dires->Fetch()->GetUInt32();\n+            disabled_item_ids.insert(id);\n+\n+        } while (dires->NextRow());\n+\n+        BOT_LOG_INFO(\"server.loading\", \">> Loaded {} disabled wandering bots gear items\", uint32(disabled_item_ids.size()));\n+    }\n+    else\n+        BOT_LOG_INFO(\"server.loading\", \">> Loaded 0 disabled wandering bots gear items. Table `creature_template_npcbot_disabled_items` is empty!\");\n+\n+    const std::map<uint32, uint8> InvTypeToBotSlot = {\n+        {INVTYPE_HEAD, BOT_SLOT_HEAD},\n+        {INVTYPE_SHOULDERS, BOT_SLOT_SHOULDERS},\n+        {INVTYPE_CHEST, BOT_SLOT_CHEST},\n+        {INVTYPE_ROBE, BOT_SLOT_CHEST},\n+        {INVTYPE_WAIST, BOT_SLOT_WAIST},\n+        {INVTYPE_LEGS, BOT_SLOT_LEGS},\n+        {INVTYPE_FEET, BOT_SLOT_FEET},\n+        {INVTYPE_WRISTS, BOT_SLOT_WRIST},\n+        {INVTYPE_HANDS, BOT_SLOT_HANDS}\n+    };\n+\n+    auto push_gear_to_classes = [](ItemTemplate const& itt, uint8 slot, uint8 lstep, std::initializer_list<BotClasses> const& cs) {\n+        for (BotClasses c : cs)\n+        {\n+            if (c == BOT_CLASS_SPHYNX &&\n+                (itt.InventoryType == INVTYPE_FINGER || itt.InventoryType == INVTYPE_TRINKET || itt.InventoryType == INVTYPE_CLOAK || itt.InventoryType == INVTYPE_NECK || itt.InventoryType == INVTYPE_SHIELD))\n+                continue;\n+            if (!itt.AllowableClass || itt.AllowableClass >= ((1u << MAX_CLASSES) - 1) || !!(itt.AllowableClass & (1u << (c - 1))))\n+                _botsWanderCreaturesSortedGear[c][slot][lstep].push_back(itt.ItemId);\n+        }\n+    };\n+\n+    const std::initializer_list<BotClasses> IntUsers = { BOT_CLASS_PALADIN, BOT_CLASS_PRIEST, BOT_CLASS_SHAMAN, BOT_CLASS_MAGE, BOT_CLASS_WARLOCK, BOT_CLASS_DRUID, BOT_CLASS_SPHYNX, BOT_CLASS_ARCHMAGE, BOT_CLASS_DREADLORD, BOT_CLASS_NECROMANCER, BOT_CLASS_SEA_WITCH, BOT_CLASS_CRYPT_LORD };\n+    const std::initializer_list<BotClasses> StrUsers = { BOT_CLASS_WARRIOR, BOT_CLASS_DEATH_KNIGHT, BOT_CLASS_SPELLBREAKER, BOT_CLASS_CRYPT_LORD };\n+    const std::initializer_list<BotClasses> AgiUsers = { BOT_CLASS_HUNTER, BOT_CLASS_SHAMAN, BOT_CLASS_ROGUE, BOT_CLASS_DRUID, BOT_CLASS_BM, BOT_CLASS_DARK_RANGER };\n+\n+    ItemTemplateContainer const& all_item_templates = sObjectMgr->GetItemTemplateStore();\n+    for (auto const& [_, proto] : all_item_templates)\n+    {\n+        if (!proto.ItemLevel || proto.RequiredSpell)\n+            continue;\n+\n+        bool skip = false;\n+        switch (proto.Quality)\n+        {\n+            case ITEM_QUALITY_NORMAL:\n+                if (std::ranges::any_of(proto.Spells, [](_Spell const& spell) { return !!spell.SpellId; }))\n+                    skip = true;\n+                if (proto.RequiredLevel > 14)\n+                    skip = true;\n+                break;\n+            case ITEM_QUALITY_UNCOMMON:\n+                if (proto.RequiredLevel > 75)\n+                    skip = true;\n+            [[fallthrough]];\n+            case ITEM_QUALITY_RARE:\n+                if (proto.RequiredLevel > 75 && proto.RequiredLevel < 80)\n+                    skip = true;\n+            [[fallthrough]];\n+            case ITEM_QUALITY_EPIC:\n+                if (!(proto.RequiredLevel >= 2 && proto.RequiredLevel <= DEFAULT_MAX_LEVEL))\n+                    skip = true;\n+                if (!proto.RandomProperty && !proto.RandomSuffix && !proto.StatsCount &&\n+                    !(proto.Class == ITEM_CLASS_WEAPON && proto.SubClass == ITEM_SUBCLASS_WEAPON_WAND) &&\n+                    !(proto.Class == ITEM_CLASS_WEAPON && proto.SubClass == ITEM_SUBCLASS_WEAPON_BOW && proto.RequiredLevel < 45))\n+                    skip = true;\n+                break;\n+            default:\n+                skip = true;\n+                break;\n+        }\n+        if (skip)\n+            continue;\n+\n+        if (disabled_item_ids.contains(proto.ItemId))\n+        {\n+            //BOT_LOG_INFO(\"server.loading\", \"Item {} is disabled...\", proto.ItemId);\n+            continue;\n+        }\n+\n+        if (proto.StatsCount > 0 && std::ranges::any_of(proto.ItemStat, [](_ItemStat const& stat) {\n+            return (stat.ItemStatType == ITEM_MOD_DEFENSE_SKILL_RATING || stat.ItemStatType == ITEM_MOD_DODGE_RATING ||\n+                stat.ItemStatType == ITEM_MOD_PARRY_RATING || stat.ItemStatType == ITEM_MOD_BLOCK_VALUE) &&\n+                stat.ItemStatValue > 0;\n+        }))\n+            continue;\n+\n+        uint8 reqLstep = (((proto.RequiredLevel == 1) ? 0 : proto.RequiredLevel) + ITEM_SORTING_LEVEL_STEP - 1) / ITEM_SORTING_LEVEL_STEP;\n+        bool is_caster_item = proto.StatsCount > 0 && std::ranges::any_of(proto.ItemStat, [](_ItemStat const& stat) {\n+            return (stat.ItemStatType == ITEM_MOD_INTELLECT || stat.ItemStatType == ITEM_MOD_SPELL_POWER ||\n+                stat.ItemStatType == ITEM_MOD_SPELL_PENETRATION || stat.ItemStatType == ITEM_MOD_MANA_REGENERATION) &&\n+                stat.ItemStatValue > 0;\n+        });\n+        bool is_strength_item = proto.StatsCount > 0 && std::ranges::any_of(proto.ItemStat, [](_ItemStat const& stat) {\n+            return stat.ItemStatType == ITEM_MOD_STRENGTH && stat.ItemStatValue > 0;\n+        });\n+        bool is_agility_item = proto.StatsCount > 0 && std::ranges::any_of(proto.ItemStat, [](_ItemStat const& stat) {\n+            return stat.ItemStatType == ITEM_MOD_AGILITY && stat.ItemStatValue > 0;\n+        });\n+\n+        switch (proto.Class)\n+        {\n+            case ITEM_CLASS_ARMOR:\n+                switch (proto.InventoryType)\n+                {\n+                    case INVTYPE_NECK:\n+                        if (proto.Quality < ITEM_QUALITY_UNCOMMON)\n+                            break;\n+                        if (is_caster_item || (reqLstep < LEVEL_STEPS - 1 && proto.StatsCount == 0))\n+                            push_gear_to_classes(proto, BOT_SLOT_NECK, reqLstep, IntUsers);\n+                        if (is_strength_item || (reqLstep < LEVEL_STEPS - 1 && proto.StatsCount == 0))\n+                            push_gear_to_classes(proto, BOT_SLOT_NECK, reqLstep, StrUsers);\n+                        if (is_agility_item || (reqLstep < LEVEL_STEPS - 1 && proto.StatsCount == 0))\n+                            push_gear_to_classes(proto, BOT_SLOT_NECK, reqLstep, AgiUsers);\n+                        break;\n+                    case INVTYPE_FINGER:\n+                        if (proto.Quality < ITEM_QUALITY_UNCOMMON)\n+                            break;\n+                        if (is_caster_item || (reqLstep < LEVEL_STEPS - 1 && proto.StatsCount == 0))\n+                        {\n+                            push_gear_to_classes(proto, BOT_SLOT_FINGER1, reqLstep, IntUsers);\n+                            push_gear_to_classes(proto, BOT_SLOT_FINGER2, reqLstep, IntUsers);\n+                        }\n+                        if (is_strength_item || (reqLstep < LEVEL_STEPS - 1 && proto.StatsCount == 0))\n+                        {\n+                            push_gear_to_classes(proto, BOT_SLOT_FINGER1, reqLstep, StrUsers);\n+                            push_gear_to_classes(proto, BOT_SLOT_FINGER2, reqLstep, StrUsers);\n+                        }\n+                        if (is_agility_item || (reqLstep < LEVEL_STEPS - 1 && proto.StatsCount == 0))\n+                        {\n+                            push_gear_to_classes(proto, BOT_SLOT_FINGER1, reqLstep, AgiUsers);\n+                            push_gear_to_classes(proto, BOT_SLOT_FINGER2, reqLstep, AgiUsers);\n+                        }\n+                        break;\n+                    case INVTYPE_TRINKET:\n+                        if (proto.Quality < ITEM_QUALITY_UNCOMMON)\n+                            break;\n+                        if (!is_strength_item && !is_agility_item)\n+                        {\n+                            push_gear_to_classes(proto, BOT_SLOT_TRINKET1, reqLstep, IntUsers);\n+                            push_gear_to_classes(proto, BOT_SLOT_TRINKET2, reqLstep, IntUsers);\n+                        }\n+                        if (!is_caster_item)\n+                        {\n+                            push_gear_to_classes(proto, BOT_SLOT_TRINKET1, reqLstep, StrUsers);\n+                            push_gear_to_classes(proto, BOT_SLOT_TRINKET2, reqLstep, StrUsers);\n+                            push_gear_to_classes(proto, BOT_SLOT_TRINKET1, reqLstep, AgiUsers);\n+                            push_gear_to_classes(proto, BOT_SLOT_TRINKET2, reqLstep, AgiUsers);\n+                        }\n+                        break;\n+                    case INVTYPE_CLOAK:\n+                        if (is_caster_item || (reqLstep < LEVEL_STEPS - 1 && proto.StatsCount == 0))\n+                            push_gear_to_classes(proto, BOT_SLOT_BACK, reqLstep, IntUsers);\n+                        if (is_strength_item || (reqLstep < LEVEL_STEPS - 1 && proto.StatsCount == 0))\n+                            push_gear_to_classes(proto, BOT_SLOT_BACK, reqLstep, StrUsers);\n+                        if (is_agility_item || (reqLstep < LEVEL_STEPS - 1 && proto.StatsCount == 0))\n+                            push_gear_to_classes(proto, BOT_SLOT_BACK, reqLstep, AgiUsers);\n+                        break;\n+                    case INVTYPE_HOLDABLE:\n+                        if (proto.Quality < ITEM_QUALITY_UNCOMMON)\n+                            break;\n+                        push_gear_to_classes(proto, BOT_SLOT_OFFHAND, reqLstep, { BOT_CLASS_PRIEST, BOT_CLASS_MAGE, BOT_CLASS_WARLOCK, BOT_CLASS_DRUID });\n+                        break;\n+                    case INVTYPE_SHIELD:\n+                        if (proto.Armor == 0)\n+                            break;\n+                        if (!is_caster_item)\n+                            push_gear_to_classes(proto, BOT_SLOT_OFFHAND, reqLstep, { BOT_CLASS_WARRIOR });\n+                        if (is_caster_item || proto.RequiredLevel < 60 || (proto.RequiredLevel < 69 && (proto.RandomProperty || proto.RandomSuffix)))\n+                            push_gear_to_classes(proto, BOT_SLOT_OFFHAND, reqLstep, { BOT_CLASS_PALADIN, BOT_CLASS_SHAMAN, BOT_CLASS_SPELLBREAKER });\n+                        break;\n+                    case INVTYPE_HEAD:\n+                    case INVTYPE_SHOULDERS:\n+                    case INVTYPE_CHEST:\n+                    case INVTYPE_ROBE:\n+                    case INVTYPE_WAIST:\n+                    case INVTYPE_LEGS:\n+                    case INVTYPE_FEET:\n+                    case INVTYPE_WRISTS:\n+                    case INVTYPE_HANDS:\n+                    {\n+                        if (proto.Armor == 0)\n+                            break;\n+                        decltype(InvTypeToBotSlot)::const_iterator ci = InvTypeToBotSlot.find(proto.InventoryType);\n+                        ASSERT(ci != InvTypeToBotSlot.cend());\n+                        uint8 slot = ci->second;\n+                        switch (proto.SubClass)\n+                        {\n+                            case ItemSubclassArmor::ITEM_SUBCLASS_ARMOR_CLOTH:\n+                                if (slot == BOT_SLOT_CHEST && proto.InventoryType != INVTYPE_ROBE)\n+                                    break;\n+                                push_gear_to_classes(proto, slot, reqLstep, { BOT_CLASS_PRIEST, BOT_CLASS_MAGE, BOT_CLASS_WARLOCK, BOT_CLASS_ARCHMAGE, BOT_CLASS_NECROMANCER, BOT_CLASS_SEA_WITCH });\n+                                break;\n+                            case ItemSubclassArmor::ITEM_SUBCLASS_ARMOR_LEATHER:\n+                                if (!is_caster_item)\n+                                    push_gear_to_classes(proto, slot, reqLstep, { BOT_CLASS_ROGUE, BOT_CLASS_DARK_RANGER });\n+                                push_gear_to_classes(proto, slot, reqLstep, { BOT_CLASS_DRUID });\n+                                if (proto.RequiredLevel < 40)\n+                                    push_gear_to_classes(proto, slot, reqLstep, { BOT_CLASS_HUNTER, BOT_CLASS_SHAMAN });\n+                                break;\n+                            case ItemSubclassArmor::ITEM_SUBCLASS_ARMOR_MAIL:\n+                                if (proto.RequiredLevel < 40)\n+                                {\n+                                    if (!is_caster_item)\n+                                        push_gear_to_classes(proto, slot, reqLstep, { BOT_CLASS_WARRIOR });\n+                                    push_gear_to_classes(proto, slot, reqLstep, { BOT_CLASS_PALADIN });\n+                                }\n+                                else\n+                                    push_gear_to_classes(proto, slot, reqLstep, { BOT_CLASS_HUNTER, BOT_CLASS_SHAMAN });\n+                                if (!is_caster_item)\n+                                    push_gear_to_classes(proto, slot, reqLstep, { BOT_CLASS_BM, BOT_CLASS_SPELLBREAKER });\n+                                push_gear_to_classes(proto, slot, reqLstep, { BOT_CLASS_SPHYNX, BOT_CLASS_CRYPT_LORD });\n+                                break;\n+                            case ItemSubclassArmor::ITEM_SUBCLASS_ARMOR_PLATE:\n+                                if (!is_caster_item)\n+                                    push_gear_to_classes(proto, slot, reqLstep, { BOT_CLASS_WARRIOR, BOT_CLASS_DEATH_KNIGHT, BOT_CLASS_BM, BOT_CLASS_SPELLBREAKER });\n+                                if (is_caster_item || proto.RequiredLevel < 60 || (proto.RequiredLevel < 78 && (proto.RandomProperty || proto.RandomSuffix)))\n+                                    push_gear_to_classes(proto, slot, reqLstep, { BOT_CLASS_PALADIN, BOT_CLASS_SPHYNX, BOT_CLASS_DREADLORD, BOT_CLASS_CRYPT_LORD });\n+                                break;\n+                            default:\n+                                break;\n+                        }\n+                        break;\n+                    }\n+                    default:\n+                        break;\n+                }\n+                break;\n+            case ITEM_CLASS_WEAPON:\n+                if (proto.Damage[0].DamageMin < 1.0f || proto.Damage[0].DamageMax < 2.0f || proto.Delay < 1000)\n+                    break;\n+                if (proto.RequiredLevel > 75 && proto.Quality < ITEM_QUALITY_EPIC)\n+                    break;\n+                switch (proto.SubClass)\n+                {\n+                    case ItemSubclassWeapon::ITEM_SUBCLASS_WEAPON_WAND:\n+                        if (proto.InventoryType != INVTYPE_RANGED && proto.InventoryType != INVTYPE_RANGEDRIGHT)\n+                            break;\n+                        push_gear_to_classes(proto, BOT_SLOT_MAINHAND, reqLstep, { BOT_CLASS_SPHYNX });\n+                        push_gear_to_classes(proto, BOT_SLOT_OFFHAND, reqLstep, { BOT_CLASS_SPHYNX });\n+                        push_gear_to_classes(proto, BOT_SLOT_RANGED, reqLstep, { BOT_CLASS_PRIEST, BOT_CLASS_MAGE, BOT_CLASS_WARLOCK });\n+                        break;\n+                    case ItemSubclassWeapon::ITEM_SUBCLASS_WEAPON_GUN:\n+                    case ItemSubclassWeapon::ITEM_SUBCLASS_WEAPON_CROSSBOW:\n+                        if (proto.InventoryType != INVTYPE_RANGED && proto.InventoryType != INVTYPE_RANGEDRIGHT)\n+                            break;\n+                        push_gear_to_classes(proto, BOT_SLOT_RANGED, reqLstep, { BOT_CLASS_WARRIOR, BOT_CLASS_ROGUE, BOT_CLASS_HUNTER });\n+                        break;\n+                    case ItemSubclassWeapon::ITEM_SUBCLASS_WEAPON_BOW:\n+                        if (proto.InventoryType != INVTYPE_RANGED && proto.InventoryType != INVTYPE_RANGEDRIGHT)\n+                            break;\n+                        push_gear_to_classes(proto, BOT_SLOT_RANGED, reqLstep, { BOT_CLASS_WARRIOR, BOT_CLASS_ROGUE, BOT_CLASS_HUNTER, BOT_CLASS_DARK_RANGER, BOT_CLASS_SEA_WITCH });\n+                        break;\n+                    case ItemSubclassWeapon::ITEM_SUBCLASS_WEAPON_THROWN:\n+                        if (proto.InventoryType != INVTYPE_THROWN)\n+                            break;\n+                        push_gear_to_classes(proto, BOT_SLOT_RANGED, reqLstep, { BOT_CLASS_WARRIOR, BOT_CLASS_ROGUE });\n+                        break;\n+                    case ItemSubclassWeapon::ITEM_SUBCLASS_WEAPON_STAFF:\n+                        if (proto.InventoryType != INVTYPE_2HWEAPON)\n+                            break;\n+                        if (is_caster_item || proto.RequiredLevel < 50)\n+                            push_gear_to_classes(proto, BOT_SLOT_MAINHAND, reqLstep, { BOT_CLASS_PRIEST, BOT_CLASS_MAGE, BOT_CLASS_WARLOCK, BOT_CLASS_DRUID, BOT_CLASS_SHAMAN, BOT_CLASS_ARCHMAGE, BOT_CLASS_NECROMANCER, BOT_CLASS_DREADLORD, BOT_CLASS_CRYPT_LORD });\n+                        break;\n+                    case ItemSubclassWeapon::ITEM_SUBCLASS_WEAPON_AXE2:\n+                        if (proto.InventoryType != INVTYPE_2HWEAPON)\n+                            break;\n+                        if (!is_caster_item)\n+                        {\n+                            push_gear_to_classes(proto, BOT_SLOT_MAINHAND, reqLstep, { BOT_CLASS_WARRIOR, BOT_CLASS_PALADIN, BOT_CLASS_DEATH_KNIGHT, BOT_CLASS_BM });\n+                            if (proto.RequiredLevel >= 60 - ITEM_SORTING_LEVEL_STEP)\n+                                push_gear_to_classes(proto, BOT_SLOT_OFFHAND, reqLstep, { BOT_CLASS_WARRIOR });\n+                        }\n+                        push_gear_to_classes(proto, BOT_SLOT_MAINHAND, reqLstep, { BOT_CLASS_HUNTER, BOT_CLASS_SHAMAN, BOT_CLASS_DREADLORD, BOT_CLASS_CRYPT_LORD });\n+                        break;\n+                    case ItemSubclassWeapon::ITEM_SUBCLASS_WEAPON_SWORD2:\n+                        if (proto.InventoryType != INVTYPE_2HWEAPON)\n+                            break;\n+                        if (!is_caster_item)\n+                        {\n+                            push_gear_to_classes(proto, BOT_SLOT_MAINHAND, reqLstep, { BOT_CLASS_WARRIOR, BOT_CLASS_PALADIN, BOT_CLASS_DEATH_KNIGHT, BOT_CLASS_BM });\n+                            if (proto.RequiredLevel >= 60 - ITEM_SORTING_LEVEL_STEP)\n+                                push_gear_to_classes(proto, BOT_SLOT_OFFHAND, reqLstep, { BOT_CLASS_WARRIOR });\n+                        }\n+                        push_gear_to_classes(proto, BOT_SLOT_MAINHAND, reqLstep, { BOT_CLASS_HUNTER, BOT_CLASS_DREADLORD, BOT_CLASS_CRYPT_LORD });\n+                        break;\n+                    case ItemSubclassWeapon::ITEM_SUBCLASS_WEAPON_POLEARM:\n+                        if (proto.InventoryType != INVTYPE_2HWEAPON)\n+                            break;\n+                        if (!is_caster_item)\n+                            push_gear_to_classes(proto, BOT_SLOT_MAINHAND, reqLstep, { BOT_CLASS_WARRIOR, BOT_CLASS_PALADIN, BOT_CLASS_DEATH_KNIGHT, BOT_CLASS_BM });\n+                        push_gear_to_classes(proto, BOT_SLOT_MAINHAND, reqLstep, { BOT_CLASS_DRUID, BOT_CLASS_HUNTER, BOT_CLASS_DREADLORD, BOT_CLASS_CRYPT_LORD });\n+                        break;\n+                    case ItemSubclassWeapon::ITEM_SUBCLASS_WEAPON_MACE2:\n+                        if (proto.InventoryType != INVTYPE_2HWEAPON)\n+                            break;\n+                        if (!is_caster_item)\n+                        {\n+                            push_gear_to_classes(proto, BOT_SLOT_MAINHAND, reqLstep, { BOT_CLASS_WARRIOR, BOT_CLASS_PALADIN, BOT_CLASS_HUNTER, BOT_CLASS_DEATH_KNIGHT });\n+                            if (proto.RequiredLevel >= 60 - ITEM_SORTING_LEVEL_STEP)\n+                                push_gear_to_classes(proto, BOT_SLOT_OFFHAND, reqLstep, { BOT_CLASS_WARRIOR });\n+                        }\n+                        push_gear_to_classes(proto, BOT_SLOT_MAINHAND, reqLstep, { BOT_CLASS_DRUID, BOT_CLASS_DREADLORD, BOT_CLASS_CRYPT_LORD });\n+                        break;\n+                    case ItemSubclassWeapon::ITEM_SUBCLASS_WEAPON_AXE:\n+                        if (proto.InventoryType == INVTYPE_WEAPON || proto.InventoryType == INVTYPE_WEAPONMAINHAND)\n+                        {\n+                            if (!is_caster_item)\n+                            {\n+                                push_gear_to_classes(proto, BOT_SLOT_MAINHAND, reqLstep, { BOT_CLASS_WARRIOR });\n+                                push_gear_to_classes(proto, BOT_SLOT_MAINHAND, reqLstep, { BOT_CLASS_ROGUE, BOT_CLASS_SPELLBREAKER });\n+                            }\n+                            push_gear_to_classes(proto, BOT_SLOT_MAINHAND, reqLstep, { BOT_CLASS_PALADIN, BOT_CLASS_SHAMAN });\n+                        }\n+                        if (proto.InventoryType == INVTYPE_WEAPON || proto.InventoryType == INVTYPE_WEAPONOFFHAND)\n+                        {\n+                            if (!is_caster_item)\n+                            {\n+                                if (proto.RequiredLevel < 60 - ITEM_SORTING_LEVEL_STEP)\n+                                    push_gear_to_classes(proto, BOT_SLOT_OFFHAND, reqLstep, { BOT_CLASS_WARRIOR });\n+                                push_gear_to_classes(proto, BOT_SLOT_OFFHAND, reqLstep, { BOT_CLASS_ROGUE });\n+                            }\n+                            push_gear_to_classes(proto, BOT_SLOT_OFFHAND, reqLstep, { BOT_CLASS_SHAMAN });\n+                        }\n+                        break;\n+                    case ItemSubclassWeapon::ITEM_SUBCLASS_WEAPON_MACE:\n+                        if (proto.InventoryType == INVTYPE_WEAPON || proto.InventoryType == INVTYPE_WEAPONMAINHAND)\n+                        {\n+                            if (!is_caster_item)\n+                            {\n+                                push_gear_to_classes(proto, BOT_SLOT_MAINHAND, reqLstep, { BOT_CLASS_WARRIOR });\n+                                push_gear_to_classes(proto, BOT_SLOT_MAINHAND, reqLstep, { BOT_CLASS_ROGUE, BOT_CLASS_SPELLBREAKER });\n+                            }\n+                            push_gear_to_classes(proto, BOT_SLOT_MAINHAND, reqLstep, { BOT_CLASS_PALADIN, BOT_CLASS_SHAMAN });\n+                            if (is_caster_item || proto.RequiredLevel < 55 || (proto.RequiredLevel < 78 && (proto.RandomProperty || proto.RandomSuffix)))\n+                                push_gear_to_classes(proto, BOT_SLOT_MAINHAND, reqLstep, { BOT_CLASS_DRUID, BOT_CLASS_PRIEST });\n+                        }\n+                        if (proto.InventoryType == INVTYPE_WEAPON || proto.InventoryType == INVTYPE_WEAPONOFFHAND)\n+                        {\n+                            if (!is_caster_item)\n+                            {\n+                                if (proto.RequiredLevel < 60 - ITEM_SORTING_LEVEL_STEP)\n+                                    push_gear_to_classes(proto, BOT_SLOT_OFFHAND, reqLstep, { BOT_CLASS_WARRIOR });\n+                                push_gear_to_classes(proto, BOT_SLOT_OFFHAND, reqLstep, { BOT_CLASS_ROGUE });\n+                            }\n+                            push_gear_to_classes(proto, BOT_SLOT_OFFHAND, reqLstep, { BOT_CLASS_SHAMAN });\n+                        }\n+                        break;\n+                    case ItemSubclassWeapon::ITEM_SUBCLASS_WEAPON_SWORD:\n+                        if (proto.InventoryType == INVTYPE_WEAPON || proto.InventoryType == INVTYPE_WEAPONMAINHAND)\n+                        {\n+                            if (!is_caster_item)\n+                            {\n+                                push_gear_to_classes(proto, BOT_SLOT_MAINHAND, reqLstep, { BOT_CLASS_WARRIOR });\n+                                push_gear_to_classes(proto, BOT_SLOT_MAINHAND, reqLstep, { BOT_CLASS_ROGUE, BOT_CLASS_SPELLBREAKER, BOT_CLASS_DARK_RANGER });\n+                            }\n+                            push_gear_to_classes(proto, BOT_SLOT_MAINHAND, reqLstep, { BOT_CLASS_PALADIN });\n+                            if (is_caster_item || proto.RequiredLevel < 55 || (proto.RequiredLevel < 78 && (proto.RandomProperty || proto.RandomSuffix)))\n+                                push_gear_to_classes(proto, BOT_SLOT_MAINHAND, reqLstep, { BOT_CLASS_MAGE, BOT_CLASS_WARLOCK });\n+                        }\n+                        if (proto.InventoryType == INVTYPE_WEAPON || proto.InventoryType == INVTYPE_WEAPONOFFHAND)\n+                        {\n+                            if (!is_caster_item)\n+                            {\n+                                if (proto.RequiredLevel < 60 - ITEM_SORTING_LEVEL_STEP)\n+                                    push_gear_to_classes(proto, BOT_SLOT_OFFHAND, reqLstep, { BOT_CLASS_WARRIOR });\n+                                push_gear_to_classes(proto, BOT_SLOT_OFFHAND, reqLstep, { BOT_CLASS_ROGUE, BOT_CLASS_DARK_RANGER });\n+                            }\n+                        }\n+                        break;\n+                    case ItemSubclassWeapon::ITEM_SUBCLASS_WEAPON_FIST_WEAPON:\n+                        if (proto.InventoryType == INVTYPE_WEAPON || proto.InventoryType == INVTYPE_WEAPONMAINHAND)\n+                        {\n+                            if (!is_caster_item)\n+                            {\n+                                push_gear_to_classes(proto, BOT_SLOT_MAINHAND, reqLstep, { BOT_CLASS_WARRIOR });\n+                                push_gear_to_classes(proto, BOT_SLOT_MAINHAND, reqLstep, { BOT_CLASS_SHAMAN, BOT_CLASS_ROGUE, BOT_CLASS_SPELLBREAKER });\n+                            }\n+                        }\n+                        if (proto.InventoryType == INVTYPE_WEAPON || proto.InventoryType == INVTYPE_WEAPONOFFHAND)\n+                        {\n+                            if (!is_caster_item)\n+                            {\n+                                if (proto.RequiredLevel < 60 - ITEM_SORTING_LEVEL_STEP)\n+                                    push_gear_to_classes(proto, BOT_SLOT_OFFHAND, reqLstep, { BOT_CLASS_WARRIOR });\n+                                push_gear_to_classes(proto, BOT_SLOT_OFFHAND, reqLstep, { BOT_CLASS_SHAMAN, BOT_CLASS_ROGUE });\n+                            }\n+                        }\n+                        break;\n+                    case ItemSubclassWeapon::ITEM_SUBCLASS_WEAPON_DAGGER:\n+                        if (proto.InventoryType == INVTYPE_WEAPON || proto.InventoryType == INVTYPE_WEAPONMAINHAND)\n+                        {\n+                            if (!is_caster_item)\n+                            {\n+                                if (proto.RequiredLevel < 60 - ITEM_SORTING_LEVEL_STEP)\n+                                    push_gear_to_classes(proto, BOT_SLOT_MAINHAND, reqLstep, { BOT_CLASS_WARRIOR });\n+                                push_gear_to_classes(proto, BOT_SLOT_MAINHAND, reqLstep, { BOT_CLASS_ROGUE, BOT_CLASS_SPELLBREAKER, BOT_CLASS_DARK_RANGER });\n+                            }\n+                            push_gear_to_classes(proto, BOT_SLOT_MAINHAND, reqLstep, { BOT_CLASS_SHAMAN });\n+                            if (is_caster_item || proto.RequiredLevel < 55 || (proto.RequiredLevel < 78 && (proto.RandomProperty || proto.RandomSuffix)))\n+                                push_gear_to_classes(proto, BOT_SLOT_MAINHAND, reqLstep, { BOT_CLASS_PRIEST, BOT_CLASS_MAGE, BOT_CLASS_WARLOCK, BOT_CLASS_DRUID, BOT_CLASS_SEA_WITCH });\n+                        }\n+                        if (proto.InventoryType == INVTYPE_WEAPON || proto.InventoryType == INVTYPE_WEAPONOFFHAND)\n+                        {\n+                            if (!is_caster_item)\n+                            {\n+                                if (proto.RequiredLevel < 60 - ITEM_SORTING_LEVEL_STEP)\n+                                    push_gear_to_classes(proto, BOT_SLOT_OFFHAND, reqLstep, { BOT_CLASS_WARRIOR });\n+                                push_gear_to_classes(proto, BOT_SLOT_OFFHAND, reqLstep, { BOT_CLASS_ROGUE, BOT_CLASS_DARK_RANGER });\n+                            }\n+                            push_gear_to_classes(proto, BOT_SLOT_OFFHAND, reqLstep, { BOT_CLASS_SHAMAN, BOT_CLASS_SEA_WITCH });\n+                        }\n+                        break;\n+                    default:\n+                        break;\n+                }\n+                break;\n+            default:\n+                break;\n+        }\n+    }\n+\n+    for (uint32 c = BOT_CLASS_WARRIOR; c < BOT_CLASS_END; ++c)\n+    {\n+        if (!((1u << c) & ALL_BOT_CLASSES_MASK))\n+            continue;\n+\n+        ItemPerSlot const& ips_arr = _botsWanderCreaturesSortedGear.at(c);\n+        for (uint32 s = BOT_SLOT_MAINHAND; s < BOT_INVENTORY_SIZE; ++s)\n+        {\n+            if (s == BOT_SLOT_FINGER2 || s == BOT_SLOT_TRINKET1 || s == BOT_SLOT_TRINKET2 || s == BOT_SLOT_BODY)\n+                continue;\n+            if ((s == BOT_SLOT_FINGER1 || s == BOT_SLOT_NECK || s == BOT_SLOT_BACK) && c == BOT_CLASS_SPHYNX)\n+                continue;\n+            if (s == BOT_SLOT_RANGED && !(c == BOT_CLASS_HUNTER || c == BOT_CLASS_ROGUE || c == BOT_CLASS_WARRIOR || c == BOT_CLASS_PRIEST ||\n+                c == BOT_CLASS_MAGE || c == BOT_CLASS_WARLOCK || c == BOT_CLASS_DARK_RANGER || c == BOT_CLASS_SEA_WITCH))\n+                continue;\n+            ItemLeveledArr const& il_arr = ips_arr[s];\n+            \n+            for (auto lstep : NPCBots::index_array<uint32, LEVEL_STEPS>)\n+            {\n+                if ((s == BOT_SLOT_SHOULDERS || s == BOT_SLOT_FINGER1 || s == BOT_SLOT_NECK) && lstep < 4)\n+                    continue;\n+                if ((s == BOT_SLOT_HEAD || s == BOT_SLOT_TRINKET1) && lstep < 6)\n+                    continue;\n+                if (s == BOT_SLOT_OFFHAND &&\n+                    (lstep < 3 || c == BOT_CLASS_PALADIN || c == BOT_CLASS_HUNTER || c == BOT_CLASS_DEATH_KNIGHT || c == BOT_CLASS_BM || c == BOT_CLASS_ARCHMAGE ||\n+                        c == BOT_CLASS_SPHYNX || c == BOT_CLASS_DREADLORD || c == BOT_CLASS_NECROMANCER || c == BOT_CLASS_CRYPT_LORD))\n+                    continue;\n+                if ((c == BOT_CLASS_DREADLORD || c == BOT_CLASS_DEATH_KNIGHT) && lstep < 8)\n+                    continue;\n+                if (il_arr[lstep].empty())\n+                {\n+                    uint32 minlvl = std::max<uint32>(lstep * ITEM_SORTING_LEVEL_STEP, 1);\n+                    uint32 maxlvl = (lstep + 1) * ITEM_SORTING_LEVEL_STEP - 1;\n+                    BOT_LOG_DEBUG(\"npcbots\", \"No items for class {} slot {} at levels {}-{}!\", c, s, minlvl, maxlvl);\n+                }\n+            }\n+        }\n+    }\n+\n+    BOT_LOG_INFO(\"server.loading\", \">> Sorted wandering bots gear in {} ms\", GetMSTimeDiffToNow(oldMSTime));\n+}\n+\n+Item* BotDataMgr::GenerateWanderingBotItem(uint8 slot, uint8 botclass, uint8 level, std::function<bool(uint8, ItemTemplate const*)> const& check)\n+{\n+    ASSERT(slot < BOT_INVENTORY_SIZE);\n+    ASSERT(botclass < BOT_CLASS_END);\n+    ASSERT(level <= DEFAULT_MAX_LEVEL + 4);\n+\n+    uint8 lvl = level;\n+    while (_botsWanderCreaturesSortedGear[botclass][slot][lvl / ITEM_SORTING_LEVEL_STEP].empty() && lvl > ITEM_SORTING_LEVEL_STEP)\n+        lvl -= ITEM_SORTING_LEVEL_STEP;\n+\n+    auto& itemIdVec = _botsWanderCreaturesSortedGear[botclass][slot][lvl / ITEM_SORTING_LEVEL_STEP];\n+    if (!itemIdVec.empty())\n+    {\n+        ItemIdVector validVec;\n+        validVec.reserve(itemIdVec.size());\n+        uint32 maxItemLevel = BotCfg::GetBotWandererMaxItemLevel(level);\n+        for (uint32 maxLvl : { maxItemLevel, decltype(maxItemLevel){} })\n+        {\n+            if (!validVec.empty())\n+                break;\n+\n+            for (uint32 iid : itemIdVec)\n+            {\n+                ItemTemplate const* proto = sObjectMgr->GetItemTemplate(iid);\n+                if ((!maxLvl || proto->ItemLevel <= maxLvl) && check(slot, proto))\n+                    validVec.push_back(iid);\n+            }\n+        }\n+\n+        if (!validVec.empty())\n+        {\n+            uint32 itemId = Bcore::Containers::SelectRandomContainerElement(validVec);\n+            if (Item* newItem = Item::CreateItem(itemId, 1, nullptr))\n+            {\n+                if (uint32 randomPropertyId = GenerateItemRandomPropertyId(itemId))\n+                    newItem->SetItemRandomProperties(randomPropertyId);\n+\n+                return newItem;\n+            }\n+        }\n+    }\n+\n+    return nullptr;\n+}\n+\n+bool BotDataMgr::GenerateWanderingBotItemEnchants(Item* item, uint8 slot, uint8 spec)\n+{\n+    bool result = false;\n+\n+    switch (slot)\n+    {\n+        case BOT_SLOT_BODY:\n+        case BOT_SLOT_TRINKET1:\n+        case BOT_SLOT_TRINKET2:\n+            return result;\n+        default:\n+            break;\n+    }\n+\n+    ItemTemplate const* proto = item->GetTemplate();\n+\n+    if (proto->RequiredLevel < 60)\n+        return result;\n+\n+    static const auto is_enchantable = [](ItemTemplate const* p, SpellInfo const* s) {\n+        SpellEffectInfo const& e = s->GetEffect(EFFECT_0);\n+        return e.Effect == SPELL_EFFECT_ENCHANT_ITEM && s->EquippedItemClass == int32(p->Class) && s->BaseLevel <= p->RequiredLevel && e.MiscValue > 0 &&\n+            (s->EquippedItemClass == ITEM_CLASS_WEAPON ? !!(s->EquippedItemSubClassMask & (1u << p->SubClass)) : !!(s->EquippedItemInventoryTypeMask & (1u << p->InventoryType))) &&\n+            sSpellItemEnchantmentStore.LookupEntry(uint32(e.MiscValue));\n+    };\n+\n+    static const std::array<uint32, 10> weapon_enchants_dk{ 53323, 53331, 53341, 53342, 53343, 53344, 53346, 53347, 62158, 70164 }; //2h only\n+    static const std::array<uint32, 11> weapon_enchants_caster{ 27968, 27975, 28003, 34010, 44510, 44629, 59619, 59625, 60714, 62948, 62959 };\n+    static const std::array<uint32, 18> weapon_enchants_melee{ 27971, 27977, 27984, 28004, 42620, 42974, 44524, 44576, 44630, 44633, 46578, 55836, 59619, 59621, 60621, 60691, 60707, 62257 };\n+    static const std::array<uint32, 34> armor_enchants_caster{ 34003, 34008, 44383, 44488, 44492, 44528, 44555, 44582, 44592, 44612, 44616, 44623, 44635, 47898, 47900, 47901, 57690, 57691, 59636, 59784, 59970, 60609, 60653, 60692, 60767, 61120, 61271, 62256, 60583, 50911, 55016, 55634, 55642, 56034 };\n+    static const std::array<uint32, 40> armor_enchants_melee{ 34007, 34008, 34009, 44383, 44484, 44488, 44492, 44500, 44513, 44528, 44529, 44575, 44589, 44598, 44612, 44616, 44623, 47898, 47900, 47901, 59777, 59954, 60606, 60609, 60616, 60623, 60663, 60668, 60692, 60763, 61271, 62256, 50903, 50911, 55016, 55777, 57690, 61117, 62201, 59636 };\n+\n+    //enchants\n+    SpellInfo const* sInfo = nullptr;\n+    std::vector<uint32> valid_enchant_ids;\n+    valid_enchant_ids.reserve(1ull << 6);\n+    switch (spec)\n+    {\n+        case BOT_SPEC_PALADIN_HOLY:\n+        case BOT_SPEC_PRIEST_DISCIPLINE:\n+        case BOT_SPEC_PRIEST_HOLY:\n+        case BOT_SPEC_PRIEST_SHADOW:\n+        case BOT_SPEC_SHAMAN_ELEMENTAL:\n+        case BOT_SPEC_SHAMAN_RESTORATION:\n+        case BOT_SPEC_MAGE_ARCANE:\n+        case BOT_SPEC_MAGE_FIRE:\n+        case BOT_SPEC_MAGE_FROST:\n+        case BOT_SPEC_WARLOCK_AFFLICTION:\n+        case BOT_SPEC_WARLOCK_DEMONOLOGY:\n+        case BOT_SPEC_WARLOCK_DESTRUCTION:\n+        case BOT_SPEC_DRUID_BALANCE:\n+        case BOT_SPEC_DRUID_RESTORATION:\n+            switch (proto->Class)\n+            {\n+                case ITEM_CLASS_WEAPON:\n+                    for (uint32 spellId : weapon_enchants_caster)\n+                    {\n+                        sInfo = sSpellMgr->AssertSpellInfo(spellId);\n+                        if (is_enchantable(proto, sInfo))\n+                            valid_enchant_ids.push_back(uint32(sInfo->GetEffect(EFFECT_0).MiscValue));\n+                    }\n+                    break;\n+                case ITEM_CLASS_ARMOR:\n+                    for (uint32 spellId : armor_enchants_caster)\n+                    {\n+                        sInfo = sSpellMgr->AssertSpellInfo(spellId);\n+                        if (is_enchantable(proto, sInfo))\n+                            valid_enchant_ids.push_back(uint32(sInfo->GetEffect(EFFECT_0).MiscValue));\n+                    }\n+                    break;\n+                default:\n+                    break;\n+            }\n+            break;\n+        case BOT_SPEC_DK_BLOOD:\n+        case BOT_SPEC_DK_FROST:\n+        case BOT_SPEC_DK_UNHOLY:\n+            switch (proto->Class)\n+            {\n+                case ITEM_CLASS_WEAPON:\n+                    for (uint32 spellId : weapon_enchants_dk)\n+                    {\n+                        sInfo = sSpellMgr->AssertSpellInfo(spellId);\n+                        if (is_enchantable(proto, sInfo))\n+                            valid_enchant_ids.push_back(uint32(sInfo->GetEffect(EFFECT_0).MiscValue));\n+                    }\n+                    break;\n+                default:\n+                    break;\n+            }\n+        [[fallthrough]];\n+        case BOT_SPEC_WARRIOR_ARMS:\n+        case BOT_SPEC_WARRIOR_FURY:\n+        case BOT_SPEC_WARRIOR_PROTECTION:\n+        case BOT_SPEC_PALADIN_PROTECTION:\n+        case BOT_SPEC_PALADIN_RETRIBUTION:\n+        case BOT_SPEC_HUNTER_BEASTMASTERY:\n+        case BOT_SPEC_HUNTER_MARKSMANSHIP:\n+        case BOT_SPEC_HUNTER_SURVIVAL:\n+        case BOT_SPEC_ROGUE_ASSASINATION:\n+        case BOT_SPEC_ROGUE_COMBAT:\n+        case BOT_SPEC_ROGUE_SUBTLETY:\n+        case BOT_SPEC_SHAMAN_ENHANCEMENT:\n+        case BOT_SPEC_DRUID_FERAL:\n+            switch (proto->Class)\n+            {\n+                case ITEM_CLASS_WEAPON:\n+                    for (uint32 spellId : weapon_enchants_melee)\n+                    {\n+                        sInfo = sSpellMgr->AssertSpellInfo(spellId);\n+                        if (is_enchantable(proto, sInfo))\n+                            valid_enchant_ids.push_back(uint32(sInfo->GetEffect(EFFECT_0).MiscValue));\n+                    }\n+                    break;\n+                case ITEM_CLASS_ARMOR:\n+                    for (uint32 spellId : armor_enchants_melee)\n+                    {\n+                        sInfo = sSpellMgr->AssertSpellInfo(spellId);\n+                        if (is_enchantable(proto, sInfo))\n+                            valid_enchant_ids.push_back(uint32(sInfo->GetEffect(EFFECT_0).MiscValue));\n+                    }\n+                    break;\n+                default:\n+                    break;\n+            }\n+            break;\n+        default:\n+            break;\n+    }\n+\n+    uint32 enchant_id;\n+    enchant_id = valid_enchant_ids.empty() ? 0 : valid_enchant_ids.size() == 1u ? valid_enchant_ids.front() : Bcore::Containers::SelectRandomContainerElement(valid_enchant_ids);\n+    if (enchant_id)\n+    {\n+        item->SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + PERM_ENCHANTMENT_SLOT*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_ID_OFFSET, enchant_id);\n+        item->SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + PERM_ENCHANTMENT_SLOT*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_DURATION_OFFSET, 0);\n+        item->SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + PERM_ENCHANTMENT_SLOT*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_CHARGES_OFFSET, 0);\n+        result = true;\n+    }\n+\n+    //gems\n+    constexpr std::array<uint32, 5> gems_caster{ 40132, 40135, 40123, 40127, 40128 };\n+    constexpr std::array<uint32, 6> gems_melee{ 40136, 40140, 40124, 40125, 40127, 40128 };\n+\n+    for (auto i : NPCBots::index_array<uint8, MAX_ITEM_PROTO_SOCKETS>)\n+    {\n+        valid_enchant_ids.clear();\n+        switch (spec)\n+        {\n+            case BOT_SPEC_PALADIN_HOLY:\n+            case BOT_SPEC_PRIEST_DISCIPLINE:\n+            case BOT_SPEC_PRIEST_HOLY:\n+            case BOT_SPEC_PRIEST_SHADOW:\n+            case BOT_SPEC_SHAMAN_ELEMENTAL:\n+            case BOT_SPEC_SHAMAN_RESTORATION:\n+            case BOT_SPEC_MAGE_ARCANE:\n+            case BOT_SPEC_MAGE_FIRE:\n+            case BOT_SPEC_MAGE_FROST:\n+            case BOT_SPEC_WARLOCK_AFFLICTION:\n+            case BOT_SPEC_WARLOCK_DEMONOLOGY:\n+            case BOT_SPEC_WARLOCK_DESTRUCTION:\n+            case BOT_SPEC_DRUID_BALANCE:\n+            case BOT_SPEC_DRUID_RESTORATION:\n+                for (uint32 gId : gems_caster)\n+                {\n+                    GemPropertiesEntry const* gprops = sGemPropertiesStore.LookupEntry(sObjectMgr->GetItemTemplate(gId)->GemProperties);\n+                    if (gprops->Type & proto->Socket[i].Color)\n+                        valid_enchant_ids.push_back(gprops->EnchantID);\n+                }\n+                break;\n+            case BOT_SPEC_DK_BLOOD:\n+            case BOT_SPEC_DK_FROST:\n+            case BOT_SPEC_DK_UNHOLY:\n+            case BOT_SPEC_WARRIOR_ARMS:\n+            case BOT_SPEC_WARRIOR_FURY:\n+            case BOT_SPEC_WARRIOR_PROTECTION:\n+            case BOT_SPEC_PALADIN_PROTECTION:\n+            case BOT_SPEC_PALADIN_RETRIBUTION:\n+            case BOT_SPEC_HUNTER_BEASTMASTERY:\n+            case BOT_SPEC_HUNTER_MARKSMANSHIP:\n+            case BOT_SPEC_HUNTER_SURVIVAL:\n+            case BOT_SPEC_ROGUE_ASSASINATION:\n+            case BOT_SPEC_ROGUE_COMBAT:\n+            case BOT_SPEC_ROGUE_SUBTLETY:\n+            case BOT_SPEC_SHAMAN_ENHANCEMENT:\n+            case BOT_SPEC_DRUID_FERAL:\n+                for (uint32 gId : gems_melee)\n+                {\n+                    GemPropertiesEntry const* gprops = sGemPropertiesStore.LookupEntry(sObjectMgr->GetItemTemplate(gId)->GemProperties);\n+                    if (gprops->Type & proto->Socket[i].Color)\n+                        valid_enchant_ids.push_back(gprops->EnchantID);\n+                }\n+                break;\n+            default:\n+                break;\n+        }\n+\n+        enchant_id = valid_enchant_ids.empty() ? 0 : valid_enchant_ids.size() == 1u ? valid_enchant_ids.front() : Bcore::Containers::SelectRandomContainerElement(valid_enchant_ids);\n+        if (enchant_id)\n+        {\n+            item->SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + (uint8(SOCK_ENCHANTMENT_SLOT) + i)*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_ID_OFFSET, enchant_id);\n+            item->SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + (uint8(SOCK_ENCHANTMENT_SLOT) + i)*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_DURATION_OFFSET, 0);\n+            item->SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + (uint8(SOCK_ENCHANTMENT_SLOT) + i)*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_CHARGES_OFFSET, 0);\n+            result = true;\n+        }\n+    }\n+\n+    return result;\n+}\n+\n+CreatureTemplate const* BotDataMgr::GetBotExtraCreatureTemplate(uint32 entry)\n+{\n+    CreatureTemplateContainer::const_iterator cit = _botsWanderCreatureTemplates.find(entry);\n+    return cit == _botsWanderCreatureTemplates.cend() ? nullptr : &cit->second;\n+}\n+\n+EquipmentInfo const* BotDataMgr::GetBotEquipmentInfo(uint32 entry)\n+{\n+    decltype(_botsWanderCreatureEquipmentTemplates)::const_iterator cit = _botsWanderCreatureEquipmentTemplates.find(entry);\n+    if (cit == _botsWanderCreatureEquipmentTemplates.cend())\n+    {\n+        int8 eqId = 1;\n+        return sObjectMgr->GetEquipmentInfo(entry, eqId);\n+    }\n+    else\n+        return cit->second;\n+}\n+\n+void BotDataMgr::AddNpcBotData(uint32 entry, uint32 roles, uint8 spec, uint32 faction)\n+{\n+    if (!_botsData.contains(entry))\n+    {\n+        _botsData.emplace(std::piecewise_construct, std::forward_as_tuple(entry), std::forward_as_tuple(roles, faction, spec));\n+\n+        CharacterDatabasePreparedStatement* bstmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_NPCBOT);\n+        //\"INSERT INTO characters_npcbot (entry, roles, spec, faction) VALUES (?, ?, ?, ?)\", CONNECTION_ASYNC);\n+        bstmt->setUInt32(0, entry);\n+        bstmt->setUInt32(1, roles);\n+        bstmt->setUInt8(2, spec);\n+        bstmt->setUInt32(3, faction);\n+        CharacterDatabase.Execute(bstmt);\n+\n+        return;\n+    }\n+\n+    BOT_LOG_ERROR(\"sql.sql\", \"BotDataMgr::AddNpcBotData(): trying to add new data but entry already exists! entry = {}\", entry);\n+}\n+NpcBotData const* BotDataMgr::SelectNpcBotData(uint32 entry)\n+{\n+    NpcBotDataMap::const_iterator itr = _botsData.find(entry);\n+    return itr != _botsData.cend() ? &itr->second : nullptr;\n+}\n+void BotDataMgr::UpdateNpcBotData(uint32 entry, NpcBotDataUpdateType updateType, void* data)\n+{\n+    NpcBotDataMap::iterator itr = _botsData.find(entry);\n+    if (itr == _botsData.end())\n+        return;\n+\n+    CharacterDatabasePreparedStatement* bstmt;\n+    switch (updateType)\n+    {\n+        case NPCBOT_UPDATE_OWNER:\n+        {\n+            if (itr->second.owner == *(uint32*)(data))\n+                break;\n+            itr->second.owner = *(uint32*)(data);\n+            itr->second.hire_time = itr->second.owner ? uint64(std::time(0)) : 1ULL;\n+            bstmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_NPCBOT_OWNER);\n+            //\"UPDATE characters_npcbot SET owner = ?, hire_time = FROM_UNIXTIME(?) WHERE entry = ?\", CONNECTION_ASYNC\n+            bstmt->setUInt32(0, itr->second.owner);\n+            bstmt->setUInt64(1, itr->second.hire_time);\n+            bstmt->setUInt32(2, entry);\n+            CharacterDatabase.Execute(bstmt);\n+            //break; //no break: erase transmogs\n+        }\n+        [[fallthrough]];\n+        case NPCBOT_UPDATE_TRANSMOG_ERASE:\n+            bstmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_NPCBOT_TRANSMOG);\n+            //\"DELETE FROM characters_npcbot_transmog WHERE entry = ?\", CONNECTION_ASYNC\n+            bstmt->setUInt32(0, entry);\n+            CharacterDatabase.Execute(bstmt);\n+            break;\n+        case NPCBOT_UPDATE_ROLES:\n+            itr->second.roles = *(uint32*)(data);\n+            bstmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_NPCBOT_ROLES);\n+            //\"UPDATE character_npcbot SET roles = ? WHERE entry = ?\", CONNECTION_ASYNC\n+            bstmt->setUInt32(0, itr->second.roles);\n+            bstmt->setUInt32(1, entry);\n+            CharacterDatabase.Execute(bstmt);\n+            break;\n+        case NPCBOT_UPDATE_SPEC:\n+            itr->second.spec = *(uint8*)(data);\n+            bstmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_NPCBOT_SPEC);\n+            //\"UPDATE characters_npcbot SET spec = ? WHERE entry = ?\", CONNECTION_ASYNCH\n+            bstmt->setUInt8(0, itr->second.spec);\n+            bstmt->setUInt32(1, entry);\n+            CharacterDatabase.Execute(bstmt);\n+            break;\n+        case NPCBOT_UPDATE_FACTION:\n+            itr->second.faction = *(uint32*)(data);\n+            bstmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_NPCBOT_FACTION);\n+            //\"UPDATE characters_npcbot SET faction = ? WHERE entry = ?\", CONNECTION_ASYNCH\n+            bstmt->setUInt32(0, itr->second.faction);\n+            bstmt->setUInt32(1, entry);\n+            CharacterDatabase.Execute(bstmt);\n+            break;\n+        case NPCBOT_UPDATE_SHARED_OWNERS:\n+        {\n+            NpcBotData::SharedOwnersContainer const* shared_owners = (NpcBotData::SharedOwnersContainer const*)(data);\n+\n+            if (std::addressof(itr->second.shared_owners) != shared_owners)\n+                itr->second.shared_owners = *shared_owners;\n+\n+            std::vector shared_owners_v(itr->second.shared_owners.cbegin(), itr->second.shared_owners.cend());\n+            std::ranges::sort(shared_owners_v);\n+            std::ostringstream ss;\n+            for (uint32 guid_low : shared_owners_v)\n+                ss << guid_low << ' ';\n+\n+            bstmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_NPCBOT_SHARED_OWNERS);\n+            //\"UPDATE characters_npcbot SET shared_owners = ? WHERE entry = ?\", CONNECTION_ASYNC\n+            bstmt->setStringView(0, ss.view());\n+            bstmt->setUInt32(1, entry);\n+            CharacterDatabase.Execute(bstmt);\n+            break;\n+        }\n+        case NPCBOT_UPDATE_DISABLED_SPELLS:\n+        {\n+            NpcBotData::DisabledSpellsContainer const* spells = (NpcBotData::DisabledSpellsContainer const*)(data);\n+            std::ostringstream ss;\n+            for (uint32 spellId : *spells)\n+                ss << spellId << ' ';\n+\n+            bstmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_NPCBOT_DISABLED_SPELLS);\n+            //\"UPDATE characters_npcbot SET spells_disabled = ? WHERE entry = ?\", CONNECTION_ASYNCH\n+            bstmt->setStringView(0, ss.view());\n+            bstmt->setUInt32(1, entry);\n+            CharacterDatabase.Execute(bstmt);\n+            break;\n+        }\n+        case NPCBOT_UPDATE_MISCVALUES:\n+        {\n+            NpcBotData::MiscValuesContainer const* miscvals = (NpcBotData::MiscValuesContainer const*)(data);\n+            std::ostringstream ss;\n+            for (auto [misc_type, misc_val] : *miscvals)\n+                ss << misc_type << ':' << misc_val << ' ';\n+\n+            bstmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_NPCBOT_MISCVALUES);\n+            //\"UPDATE characters_npcbot SET miscvalues = ? WHERE entry = ?\", CONNECTION_ASYNCH\n+            bstmt->setStringView(0, ss.view());\n+            bstmt->setUInt32(1, entry);\n+            CharacterDatabase.Execute(bstmt);\n+            break;\n+        }\n+        case NPCBOT_UPDATE_EQUIPS:\n+        {\n+            Item** items = (Item**)(data);\n+\n+            EquipmentInfo const* einfo = BotDataMgr::GetBotEquipmentInfo(entry);\n+\n+            CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();\n+\n+            bstmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_NPCBOT_EQUIP);\n+            //\"UPDATE character_npcbot SET equipMhEx = ?, equipOhEx = ?, equipRhEx = ?, equipHead = ?, equipShoulders = ?, equipChest = ?, equipWaist = ?, equipLegs = ?,\n+            //equipFeet = ?, equipWrist = ?, equipHands = ?, equipBack = ?, equipBody = ?, equipFinger1 = ?, equipFinger2 = ?, equipTrinket1 = ?, equipTrinket2 = ?, equipNeck = ? WHERE entry = ?\", CONNECTION_ASYNC\n+            CharacterDatabasePreparedStatement* stmt;\n+            uint8 k;\n+            for (k = BOT_SLOT_MAINHAND; k != BOT_INVENTORY_SIZE; ++k)\n+            {\n+                itr->second.equips[k] = items[k] ? items[k]->GetGUID().GetCounter() : 0;\n+                if (Item const* botitem = items[k])\n+                {\n+                    bool standard = false;\n+                    for (auto i : NPCBots::index_array<uint8, MAX_EQUIPMENT_ITEMS>)\n+                    {\n+                        if (einfo->ItemEntry[i] == botitem->GetEntry())\n+                        {\n+                            itr->second.equips[k] = 0;\n+                            bstmt->setUInt32(k, 0);\n+                            standard = true;\n+                            break;\n+                        }\n+                    }\n+                    if (standard)\n+                        continue;\n+\n+                    uint8 index = 0;\n+                    stmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_ITEM_INSTANCE);\n+                    //REPLACE INTO item_instance (itemEntry, owner_guid, creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomPropertyId, durability, playedTime, text, guid)\n+                    //VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\", CONNECTION_ASYNC : 0-13\n+                    stmt->setUInt32(  index, botitem->GetEntry());\n+                    stmt->setUInt32(++index, botitem->GetOwnerGUID().GetCounter());\n+                    stmt->setUInt32(++index, botitem->GetGuidValue(ITEM_FIELD_CREATOR).GetCounter());\n+                    stmt->setUInt32(++index, botitem->GetGuidValue(ITEM_FIELD_GIFTCREATOR).GetCounter());\n+                    stmt->setUInt32(++index, botitem->GetCount());\n+                    stmt->setUInt32(++index, botitem->GetUInt32Value(ITEM_FIELD_DURATION));\n+\n+                    std::ostringstream ssSpells;\n+                    for (auto i : NPCBots::index_array<uint8, MAX_ITEM_PROTO_SPELLS>)\n+                        ssSpells << botitem->GetSpellCharges(i) << ' ';\n+                    stmt->setString(++index, ssSpells.str());\n+\n+                    stmt->setUInt32(++index, botitem->GetUInt32Value(ITEM_FIELD_FLAGS));\n+\n+                    std::ostringstream ssEnchants;\n+                    for (auto i : NPCBots::index_array<uint8, MAX_ENCHANTMENT_SLOT>)\n+                    {\n+                        ssEnchants << botitem->GetEnchantmentId(EnchantmentSlot(i)) << ' ';\n+                        ssEnchants << botitem->GetEnchantmentDuration(EnchantmentSlot(i)) << ' ';\n+                        ssEnchants << botitem->GetEnchantmentCharges(EnchantmentSlot(i)) << ' ';\n+                    }\n+                    stmt->setString(++index, ssEnchants.str());\n+\n+                    stmt->setInt16 (++index, botitem->GetItemRandomPropertyId());\n+                    stmt->setUInt16(++index, botitem->GetUInt32Value(ITEM_FIELD_DURABILITY));\n+                    stmt->setUInt32(++index, botitem->GetUInt32Value(ITEM_FIELD_CREATE_PLAYED_TIME));\n+                    stmt->setString(++index, botitem->GetText());\n+                    stmt->setUInt32(++index, botitem->GetGUID().GetCounter());\n+\n+                    trans->Append(stmt);\n+\n+                    Item::DeleteFromInventoryDB(trans, botitem->GetGUID().GetCounter()); //prevent duplicates\n+\n+                    bstmt->setUInt32(k, botitem->GetGUID().GetCounter());\n+                }\n+                else\n+                    bstmt->setUInt32(k, uint32(0));\n+            }\n+\n+            bstmt->setUInt32(k, entry);\n+            trans->Append(bstmt);\n+            CharacterDatabase.CommitTransaction(trans);\n+            break;\n+        }\n+        case NPCBOT_UPDATE_ERASE:\n+        {\n+            NpcBotDataMap::iterator bitr = _botsData.find(entry);\n+            ASSERT(bitr != _botsData.end());\n+            _botsData.erase(bitr);\n+            bstmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_NPCBOT);\n+            //\"DELETE FROM characters_npcbot WHERE entry = ?\", CONNECTION_ASYNC\n+            bstmt->setUInt32(0, entry);\n+            CharacterDatabase.Execute(bstmt);\n+            break;\n+        }\n+        default:\n+            BOT_LOG_ERROR(\"sql.sql\", \"BotDataMgr:UpdateNpcBotData: unhandled updateType {}\", uint32(updateType));\n+            break;\n+    }\n+}\n+void BotDataMgr::UpdateNpcBotDataAll(uint32 playerGuid, NpcBotDataUpdateType updateType, void* data)\n+{\n+    CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();\n+    CharacterDatabasePreparedStatement* bstmt;\n+    uint32 newowner = *(uint32*)(data);\n+    switch (updateType)\n+    {\n+        case NPCBOT_UPDATE_OWNER:\n+            ASSERT(newowner == 0);\n+            bstmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_NPCBOT_EQUIP_RESET_ALL);\n+            //\"UPDATE characters_npcbot SET equipMhEx = 0, equipOhEx = 0, equipRhEx = 0, equipHead = 0, equipShoulders = 0, equipChest = 0, equipWaist = 0, equipLegs = 0, equipFeet = 0, \"\n+            //\"equipWrist = 0, equipHands = 0, equipBack = 0, equipBody = 0, equipFinger1 = 0, equipFinger2 = 0, equipTrinket1 = 0, equipTrinket2 = 0, equipNeck = 0 WHERE owner = ?\", CONNECTION_ASYNC\n+            bstmt->setUInt32(0, playerGuid);\n+            trans->Append(bstmt);\n+            bstmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_NPCBOT_TRANSMOG_ALL);\n+            //\"DELETE FROM characters_npcbot_transmog WHERE entry IN (SELECT entry FROM characters_npcbot WHERE owner = ?)\", CONNECTION_ASYNC\n+            bstmt->setUInt32(0, playerGuid);\n+            trans->Append(bstmt);\n+            bstmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_NPCBOT_SHARED_OWNERS_ALL);\n+            //\"UPDATE characters_npcbot SET shared_owners = NULL WHERE owner = ?\", CONNECTION_ASYNC\n+            bstmt->setUInt32(0, playerGuid);\n+            trans->Append(bstmt);\n+            bstmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_NPCBOT_OWNER_ALL);\n+            //\"UPDATE characters_npcbot SET owner = ?, hire_time = FROM_UNIXTIME(?) WHERE owner = ?\", CONNECTION_ASYNC\n+            bstmt->setUInt32(0, newowner);\n+            bstmt->setUInt64(1, uint64(1ULL));\n+            bstmt->setUInt32(2, playerGuid);\n+            trans->Append(bstmt);\n+            break;\n+        default:\n+            BOT_LOG_ERROR(\"sql.sql\", \"BotDataMgr:UpdateNpcBotDataAll: unhandled updateType {}\", uint32(updateType));\n+            break;\n+    }\n+\n+    if (trans->GetSize() > 0)\n+        CharacterDatabase.CommitTransaction(trans);\n+}\n+\n+void BotDataMgr::SaveNpcBotStats(NpcBotStats const& stats)\n+{\n+    CharacterDatabasePreparedStatement* bstmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_NPCBOT_STATS);\n+    //\"REPLACE INTO characters_npcbot_stats\n+    //(entry, maxhealth, maxpower, strength, agility, stamina, intellect, spirit, armor, defense,\n+    //resHoly, resFire, resNature, resFrost, resShadow, resArcane, blockPct, dodgePct, parryPct, critPct,\n+    //attackPower, spellPower, spellPen, hastePct, hitBonusPct, expertise, armorPenPct) VALUES\n+    //(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\", CONNECTION_ASYNC\n+\n+    uint32 index = 0;\n+    bstmt->setUInt32(  index, stats.entry);\n+    bstmt->setUInt32(++index, stats.maxhealth);\n+    bstmt->setUInt32(++index, stats.maxpower);\n+    bstmt->setUInt32(++index, stats.strength);\n+    bstmt->setUInt32(++index, stats.agility);\n+    bstmt->setUInt32(++index, stats.stamina);\n+    bstmt->setUInt32(++index, stats.intellect);\n+    bstmt->setUInt32(++index, stats.spirit);\n+    bstmt->setUInt32(++index, stats.armor);\n+    bstmt->setUInt32(++index, stats.defense);\n+    bstmt->setUInt32(++index, stats.resHoly);\n+    bstmt->setUInt32(++index, stats.resFire);\n+    bstmt->setUInt32(++index, stats.resNature);\n+    bstmt->setUInt32(++index, stats.resFrost);\n+    bstmt->setUInt32(++index, stats.resShadow);\n+    bstmt->setUInt32(++index, stats.resArcane);\n+    bstmt->setFloat (++index, stats.blockPct);\n+    bstmt->setFloat (++index, stats.dodgePct);\n+    bstmt->setFloat (++index, stats.parryPct);\n+    bstmt->setFloat (++index, stats.critPct);\n+    bstmt->setUInt32(++index, stats.attackPower);\n+    bstmt->setUInt32(++index, stats.spellPower);\n+    bstmt->setUInt32(++index, stats.spellPen);\n+    bstmt->setFloat (++index, stats.hastePct);\n+    bstmt->setFloat (++index, stats.hitBonusPct);\n+    bstmt->setUInt32(++index, stats.expertise);\n+    bstmt->setFloat (++index, stats.armorPenPct);\n+\n+    CharacterDatabase.Execute(bstmt);\n+}\n+\n+NpcBotAppearanceData const* BotDataMgr::SelectNpcBotAppearance(uint32 entry)\n+{\n+    NpcBotAppearanceDataMap::const_iterator itr = _botsAppearanceData.find(entry);\n+    return itr != _botsAppearanceData.cend() ? &itr->second : nullptr;\n+}\n+\n+NpcBotExtras const* BotDataMgr::SelectNpcBotExtras(uint32 entry)\n+{\n+    NpcBotExtrasMap::const_iterator itr = _botsExtras.find(entry);\n+    return itr != _botsExtras.cend() ? &itr->second : nullptr;\n+}\n+\n+NpcBotTransmogData const* BotDataMgr::SelectNpcBotTransmogs(uint32 entry)\n+{\n+    NpcBotTransmogDataMap::const_iterator itr = _botsTransmogData.find(entry);\n+    return itr != _botsTransmogData.cend() ? &itr->second : nullptr;\n+}\n+void BotDataMgr::UpdateNpcBotTransmogData(uint32 entry, uint8 slot, uint32 item_id, int32 fake_id, bool update_db)\n+{\n+    ASSERT(slot < BOT_TRANSMOG_INVENTORY_SIZE);\n+\n+    _botsTransmogData.try_emplace(entry, NpcBotTransmogData{});\n+    _botsTransmogData.at(entry).transmogs[slot] = { item_id, fake_id };\n+\n+    if (update_db)\n+    {\n+        CharacterDatabasePreparedStatement* bstmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_NPCBOT_TRANSMOG);\n+        //\"REPLACE INTO characters_npcbot_transmog (entry, slot, item_id, fake_id) VALUES (?, ?, ?, ?)\", CONNECTION_ASYNC\n+        bstmt->setUInt32(0, entry);\n+        bstmt->setUInt8(1, slot);\n+        bstmt->setUInt32(2, item_id);\n+        bstmt->setInt32(3, fake_id);\n+        CharacterDatabase.Execute(bstmt);\n+    }\n+}\n+\n+void BotDataMgr::ResetNpcBotTransmogData(uint32 entry, bool update_db)\n+{\n+    NpcBotTransmogDataMap::iterator itr = _botsTransmogData.find(entry);\n+    if (itr == _botsTransmogData.end())\n+        return;\n+\n+    auto& transmog_data = itr->second;\n+\n+    if (update_db)\n+    {\n+        CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();\n+        for (auto i : NPCBots::index_array<uint8, BOT_TRANSMOG_INVENTORY_SIZE>)\n+        {\n+            if (transmog_data.transmogs[i].first == 0 && transmog_data.transmogs[i].second == -1)\n+                continue;\n+\n+            CharacterDatabasePreparedStatement* bstmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_NPCBOT_TRANSMOG);\n+            //\"REPLACE INTO characters_npcbot_transmog (entry, slot, item_id, fake_id) VALUES (?, ?, ?, ?)\", CONNECTION_ASYNC\n+            bstmt->setUInt32(0, entry);\n+            bstmt->setUInt8(1, i);\n+            bstmt->setUInt32(2, 0);\n+            bstmt->setInt32(3, -1);\n+            trans->Append(bstmt);\n+        }\n+\n+        if (trans->GetSize() > 0)\n+            CharacterDatabase.CommitTransaction(trans);\n+    }\n+\n+    for (auto i : NPCBots::index_array<uint8, BOT_TRANSMOG_INVENTORY_SIZE>)\n+        transmog_data.transmogs[i] = { 0, -1 };\n+}\n+\n+void BotDataMgr::RegisterBot(Creature const* bot)\n+{\n+    if (_existingBots.contains(bot))\n+    {\n+        BOT_LOG_ERROR(\"entities.unit\", \"BotDataMgr::RegisterBot: bot {} ({}) already registered!\",\n+            bot->GetEntry(), bot->GetName());\n+        return;\n+    }\n+\n+    std::unique_lock lock(*GetLock());\n+\n+    _existingBots.insert(bot);\n+    //BOT_LOG_ERROR(\"entities.unit\", \"BotDataMgr::RegisterBot: registered bot {} ({})\", bot->GetEntry(), bot->GetName());\n+}\n+void BotDataMgr::UnregisterBot(Creature const* bot)\n+{\n+    std::unique_lock lock(*GetLock());\n+\n+    if (!_existingBots.contains(bot))\n+    {\n+        BOT_LOG_ERROR(\"entities.unit\", \"BotDataMgr::UnregisterBot: bot {} ({}) not found!\", bot->GetEntry(), bot->GetName());\n+        return;\n+    }\n+\n+    _existingBots.erase(bot);\n+    //BOT_LOG_ERROR(\"entities.unit\", \"BotDataMgr::UnregisterBot: unregistered bot {} ({})\", bot->GetEntry(), bot->GetName());\n+}\n+Creature const* BotDataMgr::FindBot(uint32 entry)\n+{\n+    std::shared_lock lock(*GetLock());\n+\n+    auto it = std::ranges::find_if(_existingBots, [entry](Creature const* bot) { return bot->GetEntry() == entry; });\n+    return it != _existingBots.cend() ? *it : nullptr;\n+}\n+Creature const* BotDataMgr::FindBot(std::string_view name, LocaleConstant loc, std::vector<uint32> const* not_ids)\n+{\n+    std::wstring wname;\n+    if (Utf8toWStr(name, wname))\n+    {\n+        wstrToLower(wname);\n+        std::shared_lock lock(*GetLock());\n+        for (Creature const* bot : _existingBots)\n+        {\n+            if (not_ids && std::ranges::find(*not_ids, bot->GetEntry()) != not_ids->cend())\n+                continue;\n+\n+            std::string_view basename = bot->GetName();\n+            if (CreatureLocale const* creatureInfo = sObjectMgr->GetCreatureLocale(bot->GetEntry()))\n+            {\n+                if (creatureInfo->Name.size() > loc && !creatureInfo->Name[loc].empty())\n+                    basename = creatureInfo->Name[loc];\n+            }\n+\n+            std::wstring wbname;\n+            if (!Utf8toWStr(basename, wbname))\n+                continue;\n+\n+            wstrToLower(wbname);\n+            if (wbname == wname)\n+                return bot;\n+        }\n+    }\n+\n+    return nullptr;\n+}\n+\n+NpcBotRegistry const& BotDataMgr::GetExistingNPCBots()\n+{\n+    return _existingBots;\n+}\n+\n+void BotDataMgr::GetNPCBotGuidsByOwner(std::vector<ObjectGuid> &guids_vec, ObjectGuid owner_guid, bool count_shared)\n+{\n+    ASSERT(AllBotsLoaded());\n+\n+    std::shared_lock lock(*GetLock());\n+\n+    for (Creature const* bot : _existingBots)\n+    {\n+        if (_botsData.at(bot->GetEntry()).owner == owner_guid.GetCounter() || (count_shared && _botsData.at(bot->GetEntry()).shared_owners.contains(owner_guid.GetCounter())))\n+            guids_vec.push_back(bot->GetGUID());\n+    }\n+}\n+\n+ObjectGuid BotDataMgr::GetNPCBotGuid(uint32 entry)\n+{\n+    ASSERT(AllBotsLoaded());\n+\n+    std::shared_lock lock(*GetLock());\n+\n+    for (Creature const* bot : _existingBots)\n+    {\n+        if (bot->GetEntry() == entry)\n+            return bot->GetGUID();\n+    }\n+\n+    return ObjectGuid::Empty;\n+}\n+\n+std::vector<uint32> BotDataMgr::GetExistingNPCBotIds()\n+{\n+    ASSERT(AllBotsLoaded());\n+\n+    std::vector<uint32> existing_ids;\n+    existing_ids.reserve(_botsData.size());\n+    for (auto const& [bot_id, _] : _botsData)\n+        existing_ids.push_back(bot_id);\n+\n+    return existing_ids;\n+}\n+\n+uint8 BotDataMgr::GetOwnedBotsCount(ObjectGuid owner_guid, uint32 class_mask, bool count_shared)\n+{\n+    uint8 count = 0;\n+    for (auto const& [bot_id, bot_data] : _botsData)\n+        if ((bot_data.owner == owner_guid.GetCounter() || (count_shared && bot_data.shared_owners.contains(owner_guid.GetCounter()))) &&\n+            (!class_mask || !!(class_mask & (1u << (_botsExtras.at(bot_id).bclass - 1)))))\n+            ++count;\n+    return count;\n+}\n+\n+uint8 BotDataMgr::GetAccountBotsCount(uint32 account_id)\n+{\n+    CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_NPCBOT_ACC_BOT_COUNT);\n+    stmt->setUInt32(0, account_id);\n+\n+    PreparedQueryResult result = CharacterDatabase.Query(stmt);\n+    if (result)\n+        return (*result)[0].GetUInt32();\n+\n+    return 0;\n+}\n+\n+uint8 BotDataMgr::GetLevelBonusForBotRank(uint32 rank)\n+{\n+    switch (rank)\n+    {\n+        case CREATURE_ELITE_RARE:\n+            return 1;\n+        case CREATURE_ELITE_ELITE:\n+            return 2;\n+        case CREATURE_ELITE_RAREELITE:\n+            return 3;\n+        default:\n+            return 0;\n+    }\n+}\n+\n+uint8 BotDataMgr::GetMinLevelForMapId(uint32 mapId)\n+{\n+    decltype(_wpMinSpawnLevelPerMapId)::const_iterator cit = _wpMinSpawnLevelPerMapId.find(mapId);\n+    if (cit != _wpMinSpawnLevelPerMapId.cend())\n+        return cit->second;\n+\n+    switch (mapId)\n+    {\n+        case 0:\n+        case 1:\n+            return 1;\n+        case 530:\n+            return 61;\n+        case 571:\n+            return 71;\n+        default:\n+            return 1;\n+    }\n+}\n+uint8 BotDataMgr::GetMaxLevelForMapId(uint32 mapId)\n+{\n+    decltype(_wpMaxSpawnLevelPerMapId)::const_iterator cit = _wpMaxSpawnLevelPerMapId.find(mapId);\n+    if (cit != _wpMaxSpawnLevelPerMapId.cend())\n+        return cit->second;\n+\n+    switch (mapId)\n+    {\n+        case 0:\n+        case 1:\n+            return 60;\n+        case 530:\n+            return 70;\n+        case 571:\n+            return 80;\n+        default:\n+            return 80;\n+    }\n+}\n+\n+uint8 BotDataMgr::GetMinLevelForBotClass(uint8 m_class)\n+{\n+    switch (m_class)\n+    {\n+        case BOT_CLASS_DEATH_KNIGHT:\n+            return 55;\n+        case BOT_CLASS_ARCHMAGE:\n+        case BOT_CLASS_SPELLBREAKER:\n+        case BOT_CLASS_NECROMANCER:\n+            return 20;\n+        case BOT_CLASS_DARK_RANGER:\n+            return 40;\n+        case BOT_CLASS_SPHYNX:\n+        case BOT_CLASS_DREADLORD:\n+            return 60;\n+        default:\n+            return 1;\n+    }\n+}\n+\n+int32 BotDataMgr::GetBotBaseReputation(Creature const* bot, FactionEntry const* factionEntry)\n+{\n+    if (!factionEntry)\n+        return 0;\n+\n+    if (bot->IsNPCBotPet())\n+        bot = bot->GetBotPetAI()->GetPetsOwner();\n+\n+    uint32 raceMask = GetDefaultFactionForBotRaceClass(bot->GetBotClass(), bot->GetRace()) == FACTION_TEMPLATE_NEUTRAL_HOSTILE ? 0 : bot->GetRaceMask();\n+    uint32 classMask = bot->GetClassMask();\n+\n+    int32 minRep = 42999;\n+    for (auto i : NPCBots::index_array<uint8, std::size(decltype(FactionEntry::ReputationBase){})>)\n+    {\n+        if (raceMask == 0)\n+            minRep = std::min<int32>(minRep, factionEntry->ReputationBase[i]);\n+        if ((factionEntry->ReputationRaceMask[i] & raceMask || (factionEntry->ReputationRaceMask[i] == 0 && factionEntry->ReputationClassMask[i] != 0)) &&\n+            (factionEntry->ReputationClassMask[i] & classMask || factionEntry->ReputationClassMask[i] == 0))\n+        {\n+            return factionEntry->ReputationBase[i];\n+        }\n+    }\n+\n+    return std::min<int32>(minRep, 0);\n+}\n+\n+uint32 BotDataMgr::GetDefaultFactionForBotRaceClass(uint8 bot_class, uint8 bot_race)\n+{\n+    if (bot_class >= BOT_CLASS_EX_START)\n+        return uint32(FACTION_TEMPLATE_NEUTRAL_HOSTILE);\n+\n+    ChrRacesEntry const* rentry = sChrRacesStore.LookupEntry(bot_race);\n+    return rentry ? rentry->FactionID : uint32(FACTION_TEMPLATE_NEUTRAL_HOSTILE);\n+}\n+\n+TeamId BotDataMgr::GetTeamIdForFaction(uint32 factionTemplateId)\n+{\n+    if (FactionTemplateEntry const* fte = sFactionTemplateStore.LookupEntry(factionTemplateId))\n+    {\n+        if (fte->FactionGroup & FACTION_MASK_ALLIANCE)\n+            return TEAM_ALLIANCE;\n+        else if (fte->FactionGroup & FACTION_MASK_HORDE)\n+            return TEAM_HORDE;\n+    }\n+\n+    return TEAM_NEUTRAL;\n+}\n+\n+uint32 BotDataMgr::GetTeamForFaction(uint32 factionTemplateId)\n+{\n+    switch (GetTeamIdForFaction(factionTemplateId))\n+    {\n+        case TEAM_ALLIANCE:\n+            return ALLIANCE;\n+        case TEAM_HORDE:\n+            return HORDE;\n+        default:\n+            return TEAM_OTHER;\n+    }\n+}\n+\n+bool BotDataMgr::CanDepositBotBankItemsCount(ObjectGuid playerGuid, uint32 items_count)\n+{\n+    if (uint32 capacity = BotCfg::GetGearBankCapacity())\n+    {\n+        uint32 stored_count = GetBotBankItemsCount(playerGuid);\n+        if (stored_count + items_count > capacity)\n+            return false;\n+    }\n+    return true;\n+}\n+\n+BotBankItemContainer const* BotDataMgr::GetBotBankItems(ObjectGuid playerGuid)\n+{\n+    decltype(_botStoredGearMap)::iterator mci = _botStoredGearMap.find(playerGuid);\n+    return mci != _botStoredGearMap.cend() ? &mci->second : nullptr;\n+}\n+\n+uint32 BotDataMgr::GetBotBankItemsCount(ObjectGuid playerGuid)\n+{\n+    if (BotBankItemContainer const* botBankItems = GetBotBankItems(playerGuid))\n+        return static_cast<uint32>(botBankItems->size());\n+    return 0;\n+}\n+\n+Item* BotDataMgr::WithdrawBotBankItem(ObjectGuid playerGuid, ObjectGuid::LowType itemGuidLow)\n+{\n+    decltype(_botStoredGearMap)::iterator mci = _botStoredGearMap.find(playerGuid);\n+    if (mci != _botStoredGearMap.cend())\n+    {\n+        auto ici = std::ranges::find_if(mci->second, [=](Item const* item) { return item->GetGUID().GetCounter() == itemGuidLow; });\n+        if (ici != mci->second.cend())\n+        {\n+            Item* item = *ici;\n+            mci->second.erase(ici);\n+            return item;\n+        }\n+    }\n+\n+    return nullptr;\n+}\n+\n+void BotDataMgr::DepositBotBankItem(ObjectGuid playerGuid, Item* item)\n+{\n+    _botStoredGearMap[playerGuid].insert(item);\n+}\n+\n+void BotDataMgr::SaveNpcBotStoredGear(ObjectGuid playerGuid, CharacterDatabaseTransaction trans)\n+{\n+    decltype(_botStoredGearMap)::iterator mci = _botStoredGearMap.find(playerGuid);\n+    // we don't check if container is empty!\n+    // we have to be able to erase items always\n+    if (mci == _botStoredGearMap.cend())\n+        return;\n+\n+    trans->PAppend(\"DELETE FROM characters_npcbot_gear_storage WHERE guid = {}\", mci->first.GetCounter());\n+    for (Item* item : mci->second)\n+    {\n+        //order is important here\n+        item->SaveToDB(trans);\n+        item->DeleteFromInventoryDB(trans);\n+        trans->PAppend(\"INSERT INTO characters_npcbot_gear_storage (guid, item_guid) VALUES ({}, {})\", mci->first.GetCounter(), item->GetGUID().GetCounter());\n+    }\n+}\n+\n+uint32 BotDataMgr::GetBotItemSetsCount(ObjectGuid playerGuid)\n+{\n+    if (BotItemSetsArray const* item_sets = GetBotItemSets(playerGuid))\n+        return std::ranges::count_if(NPCBots::index_array<uint8, MAX_BOT_EQUIPMENT_SETS>, [=](uint8 i) { return !!item_sets->at(i); });\n+    return 0;\n+}\n+\n+BotItemSetsArray const* BotDataMgr::GetBotItemSets(ObjectGuid playerGuid)\n+{\n+    decltype(_botStoredGearSetMap)::const_iterator sci = _botStoredGearSetMap.find(playerGuid);\n+    return sci != _botStoredGearSetMap.cend() ? &sci->second : nullptr;\n+}\n+\n+NpcBotItemSet const* BotDataMgr::GetBotItemSet(ObjectGuid playerGuid, uint8 set_id)\n+{\n+    if (BotItemSetsArray const* item_sets = GetBotItemSets(playerGuid))\n+        return &item_sets->at(set_id);\n+    return nullptr;\n+}\n+\n+NpcBotItemSet& BotDataMgr::CreateNewBotItemSet(ObjectGuid playerGuid)\n+{\n+    auto [itr, _] = _botStoredGearSetMap.try_emplace(playerGuid);\n+    auto& item_sets = itr->second;\n+\n+    for (auto i : NPCBots::index_array<uint8, MAX_BOT_EQUIPMENT_SETS>)\n+    {\n+        if (!item_sets[i])\n+            return item_sets[i];\n+    }\n+\n+    //should not happen\n+    BOT_LOG_ERROR(\"npcbots\", \"CreateNewBotItemSet: item set limit was exhausted by player {}. Using last offset!\", playerGuid.ToString());\n+    const uint8 max_offset = MAX_BOT_EQUIPMENT_SETS - 1;\n+    item_sets[max_offset].clear();\n+    return item_sets[max_offset];\n+}\n+\n+void BotDataMgr::UpdateBotItemSet(ObjectGuid playerGuid, uint8 set_id, std::string&& set_name)\n+{\n+    _botStoredGearSetMap[playerGuid][set_id].name = std::move(set_name);\n+}\n+\n+void BotDataMgr::UpdateBotItemSet(ObjectGuid playerGuid, uint8 set_id, uint8 slot, uint32 item_id)\n+{\n+    _botStoredGearSetMap[playerGuid][set_id].items[slot] = item_id;\n+}\n+\n+void BotDataMgr::DeleteBotItemSet(ObjectGuid playerGuid, uint8 set_id)\n+{\n+    _botStoredGearSetMap.at(playerGuid).at(set_id).clear();\n+}\n+\n+void BotDataMgr::SaveNpcBotItemSets(ObjectGuid playerGuid, CharacterDatabaseTransaction trans)\n+{\n+    decltype(_botStoredGearSetMap)::const_iterator sci = _botStoredGearSetMap.find(playerGuid);\n+    if (sci == _botStoredGearSetMap.cend())\n+        return;\n+\n+    trans->PAppend(\"DELETE FROM characters_npcbot_gear_set WHERE owner = {}\", sci->first.GetCounter());\n+    trans->PAppend(\"DELETE FROM characters_npcbot_gear_set_item WHERE owner = {}\", sci->first.GetCounter());\n+    for (auto i : NPCBots::index_array<uint32, MAX_BOT_EQUIPMENT_SETS>)\n+    {\n+        NpcBotItemSet const& item_set = sci->second[i];\n+        if (!!item_set)\n+        {\n+            trans->PAppend(\"INSERT INTO characters_npcbot_gear_set (owner, set_id, set_name) VALUES ({}, {}, '{}')\", sci->first.GetCounter(), i, item_set.name);\n+            for (auto j : NPCBots::index_array<uint32, BOT_INVENTORY_SIZE>)\n+            {\n+                if (item_set.items[j])\n+                {\n+                    trans->PAppend(\"INSERT INTO characters_npcbot_gear_set_item (owner, set_id, slot, item_id) VALUES ({}, {}, {}, {})\",\n+                        sci->first.GetCounter(), i, j, item_set.items[j]);\n+                }\n+            }\n+        }\n+    }\n+}\n+\n+NpcBotMgrData* BotDataMgr::SelectOrCreateNpcBotMgrData(ObjectGuid playerGuid)\n+{\n+    std::unique_lock lock(*GetLock());\n+    decltype(_botMgrsData)::iterator bmdi = _botMgrsData.find(playerGuid);\n+    if (bmdi == _botMgrsData.cend())\n+    {\n+        CharacterDatabase.PExecute(\"INSERT INTO characters_npcbot_settings (owner) VALUES ({})\", playerGuid.GetCounter());\n+        auto placed = _botMgrsData.emplace(std::piecewise_construct, std::forward_as_tuple(playerGuid), std::forward_as_tuple(BotCfg::GetFollowDistDefault(), 0, BOT_ATTACK_RANGE_SHORT, BOT_ATTACK_ANGLE_NORMAL, 0, 0, 0));\n+        return &placed.first->second;\n+    }\n+\n+    return &bmdi->second;\n+}\n+\n+void BotDataMgr::EraseNpcBotMgrData(ObjectGuid playerGuid)\n+{\n+    std::unique_lock lock(*GetLock());\n+    decltype(_botMgrsData)::iterator bmci = _botMgrsData.find(playerGuid);\n+    if (bmci == _botMgrsData.cend())\n+        return;\n+\n+    RemoveNpcBotMgrDataFromDB(playerGuid);\n+    _botMgrsData.erase(bmci);\n+}\n+\n+void BotDataMgr::RemoveNpcBotMgrDataFromDB(ObjectGuid playerGuid)\n+{\n+    CharacterDatabase.PExecute(\"DELETE FROM characters_npcbot_settings WHERE owner = {}\", playerGuid.GetCounter());\n+}\n+\n+void BotDataMgr::SaveNpcBotMgrData(ObjectGuid playerGuid, CharacterDatabaseTransaction trans)\n+{\n+    std::shared_lock lock(*GetLock());\n+    decltype(_botMgrsData)::iterator bmdi = _botMgrsData.find(playerGuid);\n+    if (bmdi == _botMgrsData.cend())\n+        return;\n+\n+    NpcBotMgrData const& md = bmdi->second;\n+    trans->PAppend(\"DELETE FROM characters_npcbot_settings WHERE owner = {}\", bmdi->first.GetCounter());\n+    trans->PAppend(\"INSERT INTO characters_npcbot_settings (owner,dist_follow,dist_attack,attack_range_mode,attack_angle_mode,engage_delay_dps,engage_delay_heal,flags) VALUES ({},{},{},{},{},{},{},{})\",\n+        bmdi->first.GetCounter(), md.dist_follow, md.dist_attack, md.attack_range_mode, md.attack_angle_mode, md.engage_delay_dps, md.engage_delay_heal,\n+        (md.flags & NPCBOT_MGR_FLAG_MASK_ALL_DB_ALLOWED));\n+}\n+\n+class TC_GAME_API WanderingBotXpGainFormulaScript : public FormulaScript\n+{\n+    static constexpr float WANDERING_BOT_XP_GAIN_MULT = 10.0f;\n+\n+public:\n+    WanderingBotXpGainFormulaScript() : FormulaScript(\"WanderingBotXpGainFormulaScript\") {}\n+\n+    void OnGainCalculation(uint32& gain, Player* /*player*/, Unit* unit) override\n+    {\n+        if (gain && unit->IsNPCBot() && unit->ToCreature()->IsWandererBot())\n+            gain *= WANDERING_BOT_XP_GAIN_MULT;\n+    }\n+};\n+\n+class TC_GAME_API BotDataMgrShutdownScript : public WorldScript\n+{\n+public:\n+    BotDataMgrShutdownScript() : WorldScript(\"BotDataMgrShutdownScript\") {}\n+\n+    void OnShutdown() override\n+    {\n+        botSpawnEvents.KillAllEvents(true);\n+        for (auto& [_, events] : botBGJoinEvents)\n+            events.KillAllEvents(true);\n+    }\n+};\n+\n+void AddSC_botdatamgr_scripts()\n+{\n+    new WanderingBotXpGainFormulaScript();\n+    new BotDataMgrShutdownScript();\n+}\n+\n+#ifdef _MSC_VER\n+# pragma warning(pop)\n+#endif\ndiff --git a/src/server/game/AI/NpcBots/botdatamgr.h b/src/server/game/AI/NpcBots/botdatamgr.h\nnew file mode 100644\nindex 0000000000..a640bd3a7d\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/botdatamgr.h\n@@ -0,0 +1,273 @@\n+#ifndef BOTDATAMGR_H\n+#define BOTDATAMGR_H\n+\n+#include \"botcommon.h\"\n+#include \"DatabaseEnvFwd.h\"\n+#include \"DBCEnums.h\"\n+\n+#include <algorithm>\n+#include <functional>\n+#include <map>\n+#include <ranges>\n+#include <set>\n+#include <shared_mutex>\n+\n+class BattlegroundQueue;\n+class Creature;\n+class Group;\n+class Item;\n+class Player;\n+class WanderNode;\n+class WorldLocation;\n+\n+struct EquipmentInfo;\n+struct CreatureTemplate;\n+struct FactionEntry;\n+struct GroupQueueInfo;\n+struct ItemTemplate;\n+struct Position;\n+struct PvPDifficultyEntry;\n+\n+enum LocaleConstant : uint8;\n+\n+inline constexpr float MIN_WANDER_NODE_DISTANCE = 50.0f; // VISIBILITY_DISTANCE_NORMAL * 0.5f;\n+inline constexpr float MAX_WANDER_NODE_DISTANCE = 800.0f; //SIZE_OF_GRIDS * 1.5f;\n+\n+struct NpcBotMgrData\n+{\n+public:\n+    uint8 dist_follow;\n+    uint8 dist_attack;\n+    uint8 attack_range_mode;\n+    uint8 attack_angle_mode;\n+    uint32 engage_delay_dps;\n+    uint32 engage_delay_heal;\n+    uint32 flags;\n+\n+    void SetFlag(uint32 flags_) { flags |= flags_; }\n+    void RemoveFlag(uint32 flags_) { flags &= ~flags_; }\n+    bool HasFlag(uint32 flags_) const { return !!(flags & flags_); }\n+\n+    NpcBotMgrData(uint8 idist_follow, uint8 idist_attack, uint8 iattack_range_mode, uint8 iattack_angle_mode, uint32 iengage_delay_dps, uint32 iengage_delay_heal, uint32 iflags) :\n+        dist_follow(idist_follow), dist_attack(idist_attack), attack_range_mode(iattack_range_mode), attack_angle_mode(iattack_angle_mode),\n+        engage_delay_dps(iengage_delay_dps), engage_delay_heal(iengage_delay_heal), flags(iflags) { }\n+    NpcBotMgrData(NpcBotMgrData const&) = delete;\n+    NpcBotMgrData(NpcBotMgrData&&) = delete;\n+    NpcBotMgrData& operator=(NpcBotMgrData const&) = delete;\n+    NpcBotMgrData& operator=(NpcBotMgrData&&) = delete;\n+};\n+\n+enum NpcBotDataUpdateType\n+{\n+    NPCBOT_UPDATE_OWNER                 = 1,\n+    NPCBOT_UPDATE_ROLES,\n+    NPCBOT_UPDATE_SPEC,\n+    NPCBOT_UPDATE_SHARED_OWNERS,\n+    NPCBOT_UPDATE_DISABLED_SPELLS,\n+    NPCBOT_UPDATE_MISCVALUES,\n+    NPCBOT_UPDATE_FACTION,\n+    NPCBOT_UPDATE_EQUIPS,\n+    NPCBOT_UPDATE_ERASE,\n+    NPCBOT_UPDATE_TRANSMOG_ERASE,\n+    NPCBOT_UPDATE_END\n+};\n+\n+struct NpcBotData\n+{\n+    using DisabledSpellsContainer = std::set<uint32>;\n+    using MiscValuesContainer = std::map<uint32, uint32>;\n+    using SharedOwnersContainer = std::set<uint32>;\n+\n+    uint32 owner;\n+    uint64 hire_time;\n+    uint32 roles;\n+    uint32 faction;\n+    uint8 spec;\n+    std::array<uint32, BOT_INVENTORY_SIZE> equips = {};\n+    DisabledSpellsContainer disabled_spells;\n+    MiscValuesContainer miscvalues;\n+    SharedOwnersContainer shared_owners;\n+\n+    NpcBotData(uint32 bowner, uint64 bhire_time, uint32 broles, uint32 bfaction, uint8 bspec)\n+        : owner(bowner), hire_time(bhire_time), roles(broles), faction(bfaction), spec(bspec) {}\n+    NpcBotData(uint32 broles, uint32 bfaction, uint8 bspec) : NpcBotData(0, 0, broles, bfaction, bspec) {}\n+    NpcBotData(NpcBotData const&) = delete;\n+    NpcBotData(NpcBotData&&) = delete;\n+    NpcBotData& operator=(NpcBotData const&) = delete;\n+    NpcBotData& operator=(NpcBotData&&) = delete;\n+};\n+\n+struct NpcBotAppearanceData\n+{\n+    uint8 gender;\n+    uint8 skin;\n+    uint8 face;\n+    uint8 hair;\n+    uint8 haircolor;\n+    uint8 features;\n+\n+    NpcBotAppearanceData(uint32 bgender, uint64 bskin, uint32 bface, uint32 bhair, uint8 bhaircolor, uint8 bfeatures)\n+        : gender(bgender), skin(bskin), face(bface), hair(bhair), haircolor(bhaircolor), features(bfeatures) {}\n+    NpcBotAppearanceData(NpcBotAppearanceData const&) = delete;\n+    NpcBotAppearanceData(NpcBotAppearanceData&&) = delete;\n+    NpcBotAppearanceData& operator=(NpcBotAppearanceData const&) = delete;\n+    NpcBotAppearanceData& operator=(NpcBotAppearanceData&&) = delete;\n+};\n+\n+struct NpcBotExtras\n+{\n+    uint8 race;\n+    uint8 bclass;\n+};\n+\n+struct NpcBotTransmogData\n+{\n+    std::array<std::pair<uint32 /*item_id*/, int32 /*fake_id*/>, BOT_TRANSMOG_INVENTORY_SIZE> transmogs;\n+};\n+\n+struct NpcBotStats\n+{\n+    uint32 entry;\n+    uint32 maxhealth;\n+    uint32 maxpower;\n+    uint32 strength;\n+    uint32 agility;\n+    uint32 stamina;\n+    uint32 intellect;\n+    uint32 spirit;\n+    uint32 armor;\n+    uint32 defense;\n+    uint32 resHoly;\n+    uint32 resFire;\n+    uint32 resNature;\n+    uint32 resFrost;\n+    uint32 resShadow;\n+    uint32 resArcane;\n+    float blockPct;\n+    float dodgePct;\n+    float parryPct;\n+    float critPct;\n+    uint32 attackPower;\n+    uint32 spellPower;\n+    uint32 spellPen;\n+    float hastePct;\n+    float hitBonusPct;\n+    uint32 expertise;\n+    float armorPenPct;\n+};\n+\n+struct NpcBotItemSet\n+{\n+public:\n+    NpcBotItemSet() : items{} {}\n+\n+    constexpr operator bool() const { return !is_empty(); }\n+    constexpr bool is_empty() const { return items_count() == 0; }\n+\n+    constexpr uint8 items_count() const {\n+        return BOT_INVENTORY_SIZE - static_cast<uint8>(std::ranges::count(items, 0u));\n+    }\n+    void clear() { items = {}; name.clear(); }\n+\n+    std::string name;\n+    std::array<uint32, BOT_INVENTORY_SIZE> items;\n+};\n+\n+using NpcBotRegistry = std::set<Creature const*>;\n+\n+struct BotBankItemCompare{ bool operator()(Item const* item1, Item const* item2) const; };\n+using BotBankItemContainer = std::multiset<Item*, BotBankItemCompare>;\n+\n+inline constexpr uint8 ITEM_SORTING_LEVEL_STEP = 5;\n+inline constexpr uint8 LEVEL_STEPS = DEFAULT_MAX_LEVEL / ITEM_SORTING_LEVEL_STEP + 1;\n+using ItemIdVector = std::vector<uint32>;\n+using BotItemSetsArray = std::array<NpcBotItemSet, MAX_BOT_EQUIPMENT_SETS>;\n+using ItemLeveledArr = std::array<ItemIdVector, LEVEL_STEPS>;\n+using ItemPerSlot = std::array<ItemLeveledArr, BOT_INVENTORY_SIZE>;\n+using ItemPerBotClassMap = std::array<ItemPerSlot, BOT_CLASS_END>;\n+\n+class BotDataMgr\n+{\n+public:\n+    static void Update(uint32 diff);\n+\n+    static void LoadNpcBots(bool spawn = true);\n+    static void LoadNpcBotGroupData();\n+    static void LoadNpcBotGearStorage();\n+    static void LoadNpcBotGearSets();\n+\n+    static void LoadNpcBotMgrData();\n+\n+    static void DeleteOldLogs();\n+\n+    static void AddNpcBotData(uint32 entry, uint32 roles, uint8 spec, uint32 faction);\n+    static NpcBotData const* SelectNpcBotData(uint32 entry);\n+    static void UpdateNpcBotData(uint32 entry, NpcBotDataUpdateType updateType, void* data = nullptr);\n+    static void UpdateNpcBotDataAll(uint32 playerGuid, NpcBotDataUpdateType updateType, void* data = nullptr);\n+    static void SaveNpcBotStats(NpcBotStats const& stats);\n+\n+    static NpcBotAppearanceData const* SelectNpcBotAppearance(uint32 entry);\n+    static NpcBotExtras const* SelectNpcBotExtras(uint32 entry);\n+\n+    static NpcBotTransmogData const* SelectNpcBotTransmogs(uint32 entry);\n+    static void UpdateNpcBotTransmogData(uint32 entry, uint8 slot, uint32 item_id, int32 fake_id, bool update_db = true);\n+    static void ResetNpcBotTransmogData(uint32 entry, bool update_db = true);\n+\n+    static bool AllBotsLoaded();\n+\n+    static void RegisterBot(Creature const* bot);\n+    static void UnregisterBot(Creature const* bot);\n+    static Creature const* FindBot(uint32 entry);\n+    static Creature const* FindBot(std::string_view name, LocaleConstant loc, std::vector<uint32> const* not_ids = nullptr);\n+    static NpcBotRegistry const& GetExistingNPCBots();\n+    static void GetNPCBotGuidsByOwner(std::vector<ObjectGuid> &guids_vec, ObjectGuid owner_guid, bool count_shared = false);\n+    static ObjectGuid GetNPCBotGuid(uint32 entry);\n+    static std::vector<uint32> GetExistingNPCBotIds();\n+    static uint8 GetOwnedBotsCount(ObjectGuid owner_guid, uint32 class_mask = 0, bool count_shared = false);\n+    static uint8 GetAccountBotsCount(uint32 account_id);\n+\n+    static void DespawnWandererBot(uint32 entry);\n+    static void LoadWanderMap(bool reload = false, bool force_all_maps = false);\n+    static void GenerateWanderingBots();\n+    static bool GenerateBattlegroundBots(Player const* groupLeader, Group const* group, BattlegroundQueue* queue, PvPDifficultyEntry const* bracketEntry, GroupQueueInfo const* gqinfo);\n+    static void CreateWanderingBotsSortedGear();\n+    static ItemPerBotClassMap const& GetWanderingBotsSortedGearMap();\n+    static Item* GenerateWanderingBotItem(uint8 slot, uint8 botclass, uint8 level, std::function<bool(uint8, ItemTemplate const*)> const& check);\n+    static bool GenerateWanderingBotItemEnchants(Item* item, uint8 slot, uint8 spec);\n+    static CreatureTemplate const* GetBotExtraCreatureTemplate(uint32 entry);\n+    static EquipmentInfo const* GetBotEquipmentInfo(uint32 entry);\n+\n+    static uint8 GetLevelBonusForBotRank(uint32 rank);\n+    static uint8 GetMinLevelForMapId(uint32 mapId);\n+    static uint8 GetMaxLevelForMapId(uint32 mapId);\n+    static uint8 GetMinLevelForBotClass(uint8 m_class);\n+    static int32 GetBotBaseReputation(Creature const* bot, FactionEntry const* factionEntry);\n+    static uint32 GetDefaultFactionForBotRaceClass(uint8 bot_class, uint8 bot_race);\n+    static TeamId GetTeamIdForFaction(uint32 factionTemplateId);\n+    static uint32 GetTeamForFaction(uint32 factionTemplateId);\n+\n+    static bool CanDepositBotBankItemsCount(ObjectGuid playerGuid, uint32 items_count);\n+    static BotBankItemContainer const* GetBotBankItems(ObjectGuid playerGuid);\n+    static uint32 GetBotBankItemsCount(ObjectGuid playerGuid);\n+    static Item* WithdrawBotBankItem(ObjectGuid playerGuid, ObjectGuid::LowType itemGuidLow);\n+    static void DepositBotBankItem(ObjectGuid playerGuid, Item* item);\n+    static void SaveNpcBotStoredGear(ObjectGuid playerGuid, CharacterDatabaseTransaction trans);\n+\n+    static uint32 GetBotItemSetsCount(ObjectGuid playerGuid);\n+    static BotItemSetsArray const* GetBotItemSets(ObjectGuid playerGuid);\n+    static NpcBotItemSet const* GetBotItemSet(ObjectGuid playerGuid, uint8 set_id);\n+    static NpcBotItemSet& CreateNewBotItemSet(ObjectGuid playerGuid);\n+    static void UpdateBotItemSet(ObjectGuid playerGuid, uint8 set_id, std::string&& set_name);\n+    static void UpdateBotItemSet(ObjectGuid playerGuid, uint8 set_id, uint8 slot, uint32 item_id);\n+    static void DeleteBotItemSet(ObjectGuid playerGuid, uint8 set_id);\n+    static void SaveNpcBotItemSets(ObjectGuid playerGuid, CharacterDatabaseTransaction trans);\n+\n+    static NpcBotMgrData* SelectOrCreateNpcBotMgrData(ObjectGuid playerGuid);\n+    static void EraseNpcBotMgrData(ObjectGuid playerGuid);\n+    static void RemoveNpcBotMgrDataFromDB(ObjectGuid playerGuid);\n+    static void SaveNpcBotMgrData(ObjectGuid playerGuid, CharacterDatabaseTransaction trans);\n+\n+    static std::shared_mutex* GetLock();\n+};\n+\n+#endif\ndiff --git a/src/server/game/AI/NpcBots/botdefine.h b/src/server/game/AI/NpcBots/botdefine.h\nnew file mode 100644\nindex 0000000000..fdcaf1df14\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/botdefine.h\n@@ -0,0 +1,33 @@\n+#ifndef BOTDEFINE_H_\n+#define BOTDEFINE_H_\n+\n+#include \"Define.h\"\n+\n+#ifdef _MSC_VER\n+# define __PRAGMA_STR2__(x) #x\n+# define __PRAGMA_STR1__(x) __PRAGMA_STR2__(x)\n+# define __PRAGMA_LOC__ __FILE__ \"(\"__PRAGMA_STR1__(__LINE__)\") \"\n+# define PRAGMA_WARN(x) __pragma(message(__PRAGMA_LOC__ \": warning: \" #x))\n+#else\n+# define PRAGMA_WARN(x)\n+#endif\n+\n+#ifdef TRINITY_COMPILER\n+# define Bcore Trinity\n+# define BOT_LOG_TRACE TC_LOG_TRACE\n+# define BOT_LOG_DEBUG TC_LOG_DEBUG\n+# define BOT_LOG_INFO TC_LOG_INFO\n+# define BOT_LOG_WARN TC_LOG_WARN\n+# define BOT_LOG_ERROR TC_LOG_ERROR\n+# define BOT_LOG_FATAL TC_LOG_FATAL\n+#else\n+# define BCore Acore\n+# define BOT_LOG_TRACE LOG_TRACE\n+# define BOT_LOG_DEBUG LOG_DEBUG\n+# define BOT_LOG_INFO LOG_INFO\n+# define BOT_LOG_WARN LOG_WARN\n+# define BOT_LOG_ERROR LOG_ERROR\n+# define BOT_LOG_FATAL LOG_FATAL\n+#endif\n+\n+#endif\ndiff --git a/src/server/game/AI/NpcBots/botdpstracker.cpp b/src/server/game/AI/NpcBots/botdpstracker.cpp\nnew file mode 100644\nindex 0000000000..c71bd9d1db\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/botdpstracker.cpp\n@@ -0,0 +1,99 @@\n+#include \"botdpstracker.h\"\n+#include \"Unit.h\"\n+\n+#include <numeric>\n+\n+/*\n+Name: bot_dps_tracker\n+%Complete: 100\n+Comment: dps taken tracker for NPCBot system by Trickerer (onlysuffering@gmail.com)\n+DPS trackers may collect data from different bot owners if in party but this overdoing has no significance whatsoever\n+*/\n+\n+void DPSTracker::Update(uint32 diff)\n+{\n+    if (_active)\n+    {\n+        _inactiveTimer += diff;\n+        _updateTimer += diff;\n+        _trackTimer += diff;\n+\n+        if (_inactiveTimer >= DPS_INACTIVE_TIMER)\n+        {\n+            _Reset();\n+        }\n+        else if (_updateTimer >= DPS_UPDATE_TIMER)\n+        {\n+            _updateTimer -= DPS_UPDATE_TIMER;\n+            _Release();\n+        }\n+    }\n+}\n+\n+void DPSTracker::_Reset()\n+{\n+    if (_active)\n+    {\n+        _active = false;\n+\n+        for (auto& [_, damage_array] : _damages)\n+            damage_array = {};\n+        for (auto& [_, dps] : _DPSes)\n+            dps = 0;\n+\n+        _updateTimer = 0;\n+        _inactiveTimer = 0;\n+        _trackTimer = 0;\n+    }\n+}\n+\n+void DPSTracker::_Release()\n+{\n+    for (auto& [guid, damage_array] : _damages)\n+    {\n+        uint32 total_damage = std::accumulate(damage_array.cbegin(), damage_array.cend(), 0u);\n+\n+        _DPSes.insert_or_assign(guid, uint32(total_damage / (0.001f * std::max<uint32>(1 * IN_MILLISECONDS, std::min<uint32>(_trackTimer, MAX_DPS_TRACK_TIME)))));\n+        //BOT_LOG_ERROR(\"entities.player\", \"DPSTracker::Release(): guidlow = {}, time = {}, tick damage {}, total {}, dps = {}\",\n+        //    itr->first, _trackTimer, dmgs[0], total_damage, _DPSes[itr->first]);\n+\n+        //shift\n+        std::copy_backward(damage_array.begin(), std::prev(damage_array.end()), damage_array.end());\n+        damage_array[0] = 0;\n+    }\n+}\n+\n+void DPSTracker::_AccumulateDamage(ObjectGuid guid, uint32 damage)\n+{\n+    decltype(_damages)::iterator itr = _damages.find(guid);\n+\n+    if (itr == _damages.end())\n+    {\n+        DamageTakenMap::value_type::second_type dmgs{ damage };\n+        _damages.emplace(guid, std::move(dmgs));\n+        return;\n+    }\n+\n+    itr->second[0] += damage;\n+}\n+//victim is bot owner, bot, party player or party bot; checked in Unit::DealDamage()\n+void DPSTracker::TrackDamage(Unit const* victim, uint32 damage)\n+{\n+    //BOT_LOG_ERROR(\"entities.player\", \"DPSTracker::OnDamage(): on {}, damage {}\", victim->GetName(), damage);\n+\n+    _SetActive();\n+    _AccumulateDamage(victim->GetGUID(), damage);\n+}\n+\n+void DPSTracker::_SetActive()\n+{\n+    _inactiveTimer = 0;\n+    _active = true;\n+}\n+\n+uint32 DPSTracker::GetDPSTaken(ObjectGuid guid) const\n+{\n+    decltype(_DPSes)::const_iterator itr = _DPSes.find(guid);\n+    //BOT_LOG_ERROR(\"entities.player\", \"DPSTracker::GetDPSTaken(): from {}, damage {}\", guid, itr != _DPSes.end() ? itr->second : 0);\n+    return itr != _DPSes.end() ? itr->second : 0;\n+}\ndiff --git a/src/server/game/AI/NpcBots/botdpstracker.h b/src/server/game/AI/NpcBots/botdpstracker.h\nnew file mode 100644\nindex 0000000000..41ffabe34b\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/botdpstracker.h\n@@ -0,0 +1,45 @@\n+#ifndef BOT_DPSTRACKER_H\n+#define BOT_DPSTRACKER_H\n+\n+#include \"ObjectGuid.h\"\n+\n+#include <unordered_map>\n+\n+class Unit;\n+\n+enum DPSTrackerConstants : uint32\n+{\n+    DPS_UPDATE_TIMER        =  500, //recalculate dps every x ms\n+    MAX_DPS_TRACK_TIME      = 5000, //track damage taken for last x ms\n+    DPS_INACTIVE_TIMER      = 5000  //reset if combat not active for botparty for x ms\n+};\n+\n+//maximum tracked damage taken periods of DPS_UPDATE_TIMER during MAX_DPS_TRACK_TIME\n+inline constexpr std::size_t MAX_DAMAGES = MAX_DPS_TRACK_TIME / DPS_UPDATE_TIMER;\n+\n+class DPSTracker\n+{\n+public:\n+    void Update(uint32 diff);\n+\n+    void TrackDamage(Unit const* victim, uint32 damage);\n+    uint32 GetDPSTaken(ObjectGuid guid) const;\n+\n+private:\n+    void _Reset();\n+    void _Release();\n+    void _AccumulateDamage(ObjectGuid guid, uint32 damage);\n+    void _SetActive();\n+\n+    using DamageTakenMap = std::unordered_map<ObjectGuid /*guid*/, std::array<uint32, MAX_DAMAGES> /*dmgarray*/>;\n+    using DPSTakenMap = std::unordered_map<ObjectGuid /*guid*/, uint32 /*dps*/>;\n+    DamageTakenMap _damages;\n+    DPSTakenMap _DPSes;\n+\n+    uint32 _updateTimer{};\n+    uint32 _inactiveTimer{};\n+    uint32 _trackTimer{};\n+    bool _active{};\n+};\n+\n+#endif\ndiff --git a/src/server/game/AI/NpcBots/botdump.cpp b/src/server/game/AI/NpcBots/botdump.cpp\nnew file mode 100644\nindex 0000000000..ed05543654\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/botdump.cpp\n@@ -0,0 +1,1008 @@\n+/*\n+ * NpcBots Data Migration System by Trickerer (onlysuffering@gmail.com)\n+ *\n+ * Last update: *09 Apr 2023*\n+ *\n+ * Saved data:\n+ * 1) `characters_npcbot` - spawned bots' BOT info\n+ * 2) `characters_npcbot_transmog` - bots' transmogs\n+ * 3) `item_instance` - bots' equipment\n+ * 4) `creature` - bot spawns\n+ *\n+ * Make sure you have bots installed, or you are in for an unpleasant surprise.\n+ */\n+\n+#include \"botdump.h\"\n+#include \"botdatamgr.h\"\n+#include \"botlogtraits.h\"\n+#include \"DatabaseEnv.h\"\n+#include \"Log.h\"\n+#include \"ObjectMgr.h\"\n+#include \"StringConvert.h\"\n+\n+#include <sstream>\n+\n+static std::map<uint32, uint32> ItemReguidMap;\n+\n+class BotStringTransaction\n+{\n+public:\n+    using stream_type = std::ostringstream;\n+\n+    template <typename S>\n+    BotStringTransaction& Append(S&& sql)\n+    {\n+        _buf <<  std::forward<S>(sql);\n+        return *this;\n+    }\n+\n+    std::string_view GetBuffer() const\n+    {\n+        return _buf.view();\n+    }\n+\n+private:\n+    stream_type _buf;\n+};\n+\n+enum ImportDataTableType : uint8\n+{\n+    TABLE_TYPE_CHARACTERS_NPCBOT    = 0,\n+    TABLE_TYPE_NPCBOT_TRANSMOG      = 1,\n+    TABLE_TYPE_ITEM_INSTANCE        = 2,\n+    TABLE_TYPE_CREATURE             = 3,\n+\n+    IMPORT_TABLES_COUNT             = 4,\n+    IMPORT_TABLE_INVALID            = 255\n+};\n+\n+struct TableImportData\n+{\n+    std::string_view name;\n+    std::string_view fieldsStr;\n+    uint32 paramsCount;\n+    size_t guidOffsetBegin;\n+    size_t guidOffsetEnd;\n+};\n+\n+static constexpr const TableImportData TableImportDatas[IMPORT_TABLES_COUNT] =\n+{\n+    { \"`characters_npcbot` \",\n+      \"(\"\n+      //0       1       2       3      4         5                 6           7           8           9\n+      \"`entry`,`owner`,`roles`,`spec`,`faction`,`spells_disabled`,`equipMhEx`,`equipOhEx`,`equipRhEx`,`equipHead`,\"\n+      //10               11           12           13          14          15           16           17\n+      \"`equipShoulders`,`equipChest`,`equipWaist`,`equipLegs`,`equipFeet`,`equipWrist`,`equipHands`,`equipBack`,\"\n+      //18          19             20             21              22              23\n+      \"`equipBody`,`equipFinger1`,`equipFinger2`,`equipTrinket1`,`equipTrinket2`,`equipNeck`\"\n+      \") VALUES \", 24, 6, 23 },\n+\n+    { \"`characters_npcbot_transmog` \",\n+      \"(\"\n+      //0       1      2         3\n+      \"`entry`,`slot`,`item_id`,`fake_id`\"\n+      \") VALUES \", 4, 0, 0 },\n+\n+    { \"`item_instance` \",\n+      \"(\"\n+      //0             1                 2       3          4         5       6\n+      \"`creatorGuid`,`giftCreatorGuid`,`count`,`duration`,`charges`,`flags`,`enchantments`,\"\n+      //7                  8            9            10     11     12          13\n+      \"`randomPropertyId`,`durability`,`playedTime`,`text`,`guid`,`itemEntry`,`owner_guid`\"\n+      \") VALUES \", 14, 11, 11 },\n+\n+    { \"`creature` \",\n+      \"(\"\n+      //0      1    2     3           4           5            6            7            8             9           10\n+      \"`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`position_x`,`position_y`,`position_z`,`orientation`,`curhealth`,`curmana`\"\n+      \") VALUES \", 11, 0, 0 }\n+};\n+\n+static ImportDataTableType GetImportDataTableType(std::string const& name)\n+{\n+    for (auto i : NPCBots::index_array<uint32, IMPORT_TABLES_COUNT>)\n+    {\n+        //BOT_LOG_ERROR(\"scripts\", \"import: GetImportDataTableType\");\n+        if (!TableImportDatas[i].name.compare(name))\n+            return ImportDataTableType(i);\n+    }\n+\n+    return IMPORT_TABLE_INVALID;\n+}\n+\n+static uint8 GetImportLineParamsCount(std::string const& line)\n+{\n+    static std::string const ParamSeparator = \"','\";\n+    uint8 count = 0;\n+    size_t pos = line.find(ParamSeparator);\n+    while (pos != std::string::npos)\n+    {\n+        //BOT_LOG_ERROR(\"scripts\", \"import: GetImportLineParamsCount\");\n+        ++count;\n+        pos = line.find(ParamSeparator, pos + 1);\n+    }\n+    return count + 1; //separators count is params count - 1\n+}\n+\n+static void FixNULLBotFields(std::string& line)\n+{\n+    static std::string const NullString = \"'NULL'\";\n+    size_t pos = line.find(NullString);\n+    while (pos != std::string::npos)\n+    {\n+        //BOT_LOG_ERROR(\"scripts\", \"import: FixNULLBotFields\");\n+        line.replace(pos, NullString.length(), \"NULL\");\n+        pos = line.find(NullString);\n+    }\n+}\n+\n+template<typename T>\n+void StringToVal(std::string const& /*line*/, T& /*v*/, size_t /*begin_pos*/, size_t /*end_pos*/)\n+{\n+    BOT_LOG_ERROR(\"scripts\", \"StringToVal misuse\");\n+}\n+/*\n+template<>\n+void StringToVal(std::string const& line, float& v, size_t begin_pos, size_t end_pos)\n+{\n+    v = atof(line.substr(begin_pos, end_pos).c_str());\n+    BOT_LOG_ERROR(\"scripts\", \"import: StringToVal returned {}\", v);\n+}\n+*/\n+template<>\n+void StringToVal(std::string const& line, uint32& v, size_t begin_pos, size_t end_pos)\n+{\n+    using v_type = std::remove_cvref_t<decltype(v)>;\n+\n+    std::string subst = line.substr(begin_pos, end_pos - begin_pos).c_str();\n+    Optional<v_type> ov = Bcore::Impl::StringConvertImpl::For<v_type>::FromString(subst);\n+    v = *ov;\n+    //BOT_LOG_ERROR(\"scripts\", \"import: StringToVal returned {} ({} to {}: {})\",\n+    //    v, uint32(begin_pos), uint32(end_pos), subst.c_str());\n+}\n+\n+template<typename T>\n+bool ExtractValueFromString(std::string const& line, T& v, size_t offset)\n+{\n+    uint32 sepNum = 0;\n+\n+    size_t begin_pos = 0, end_pos = 0;\n+\n+    size_t pos = line.find('\\'');\n+    while (pos != std::string::npos)\n+    {\n+        ++sepNum;\n+        if (begin_pos == 0 && !((sepNum-1) % 2) && ((sepNum-1) / 2) == offset)\n+        {\n+            begin_pos = pos + 1;\n+            //BOT_LOG_ERROR(\"scripts\", \"import: ExtractValueFromString begin_pos {}\", uint32(begin_pos));\n+        }\n+        else if (end_pos == 0 && ((sepNum-1) % 2) && ((sepNum-1) / 2) == offset)\n+        {\n+            end_pos = pos;\n+            //BOT_LOG_ERROR(\"scripts\", \"import: ExtractValueFromString end_pos {}\", uint32(end_pos));\n+        }\n+\n+        if (begin_pos && end_pos)\n+            break;\n+\n+        pos = line.find('\\'', pos + 1);\n+    }\n+\n+    if (begin_pos && end_pos)\n+    {\n+        StringToVal(line, v, begin_pos, end_pos);\n+        return true;\n+    }\n+\n+    return false;\n+}\n+\n+static bool ReGuidBotEquip(std::string& line, size_t ne_guid_offset)\n+{\n+    /*\n+    INSERT INTO `characters_npcbot` (`entry`,`owner`,`roles`,`spec`,`faction`,`spell\n+    s_disabled`,`equipMhEx`,`equipOhEx`,`equipRhEx`,`equipHead`,`equipShoulders`,`eq\n+    uipChest`,`equipWaist`,`equipLegs`,`equipFeet`,`equipWrist`,`equipHands`,`equipB\n+    ack`,`equipBody`,`equipFinger1`,`equipFinger2`,`equipTrinket1`,`equipTrinket2`,`\n+    equipNeck`) VALUES ('70027','2204','19','3','35','NULL','4305063','4305032','0','0\n+    ','4305069','4237321','4237326','4305049','4305067','4305055','0','4305054','430\n+    5029','4303835','0','0','0','0');\n+    */\n+    static const std::string ne_vals_sep = \"('\";\n+    static const std::string ne_sep = \"'\";\n+\n+    bool reguidDone = false;\n+    uint32 sepNum = 0;\n+    size_t begin_pos = 0, end_pos = 0;\n+\n+    size_t pos = line.find(ne_vals_sep);\n+    ASSERT(pos != std::string::npos);\n+    pos = line.find(ne_sep);\n+    ASSERT(pos != std::string::npos);\n+    while (pos != std::string::npos)\n+    {\n+        ++sepNum;\n+        //BOT_LOG_ERROR(\"scripts\", \"import: ReGuidBotEquip sepNum {}\", sepNum);\n+        if (begin_pos == 0 && !((sepNum-1) % 2) && ((sepNum-1) / 2) == ne_guid_offset)\n+        {\n+            begin_pos = pos + 1;\n+            //BOT_LOG_ERROR(\"scripts\", \"import: ReGuidBotEquip begin_pos {}\", uint32(begin_pos));\n+        }\n+        else if (end_pos == 0 && ((sepNum-1) % 2) && ((sepNum-1) / 2) == ne_guid_offset)\n+        {\n+            end_pos = pos;\n+            //BOT_LOG_ERROR(\"scripts\", \"import: ReGuidBotEquip end_pos {}\", uint32(end_pos));\n+        }\n+\n+        if (begin_pos && end_pos)\n+        {\n+            uint32 guidVal;\n+            StringToVal(line, guidVal, begin_pos, end_pos);\n+            if (!guidVal)\n+            {\n+                //ignore no equip\n+                if (line.substr(begin_pos, end_pos - begin_pos) == \"0\")\n+                    return true;\n+\n+                BOT_LOG_ERROR(\"scripts\", \"import: ReGuidBotEquip no guidVal from {} offset {}!\",\n+                    line.substr(begin_pos, end_pos - begin_pos), uint32(ne_guid_offset));\n+                break;\n+            }\n+\n+            decltype(ItemReguidMap)::const_iterator iter = ItemReguidMap.find(guidVal);\n+            if (iter == ItemReguidMap.cend())\n+            {\n+                BOT_LOG_ERROR(\"scripts\", \"import: ReGuidBotEquip reguid value not found for {}!\", guidVal);\n+                break;\n+            }\n+\n+            uint32 neVal = iter->second;\n+            //BOT_LOG_ERROR(\"scripts\", \"import: ReGuidBotEquip replacing {} with {}\", guidVal, neVal);\n+            line.replace(begin_pos, end_pos - begin_pos, Bcore::Impl::StringConvertImpl::For<decltype(neVal)>::ToString(neVal));\n+            reguidDone = true;\n+            break;\n+        }\n+\n+        pos = line.find(ne_sep, pos + 1);\n+    }\n+\n+    return reguidDone;\n+}\n+static bool ReGuidBotEquips(std::string& line)\n+{\n+    constexpr size_t ne_guid_offset_s = TableImportDatas[TABLE_TYPE_CHARACTERS_NPCBOT].guidOffsetBegin;\n+    constexpr size_t ne_guid_offset_e = TableImportDatas[TABLE_TYPE_CHARACTERS_NPCBOT].guidOffsetEnd;\n+    //BOT_LOG_ERROR(\"scripts\", \"import: ReGuidBotEquips ne_guid_offset_s {} ne_guid_offset_e {}\", uint32(ne_guid_offset_s), uint32(ne_guid_offset_e));\n+\n+    for (size_t i = ne_guid_offset_s; i <= ne_guid_offset_e; ++i)\n+    {\n+        if (!ReGuidBotEquip(line, i))\n+            return false;\n+    }\n+\n+    return true;\n+}\n+\n+static bool ReGuidItemInstance(std::string& line, uint32& nextGuid)\n+{\n+    /*\n+    INSERT INTO `item_instance` (`creatorGuid`,`giftCreatorGuid`,`count`,`duration`,\n+    `charges`,`flags`,`enchantments`,`randomPropertyId`,`durability`,`playedTime`,`t\n+    ext`,`guid`,`itemEntry`,`owner_guid`) VALUES ('0','0','1','0','0 0 0 0 0 ','1','\n+    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ','0','9\n+    0','7200','','4296510','42490','0'),('0','0','1','0','0 0 0 0 0 ','0','0 0 0 0 0\n+     0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ','0','100','0','\n+    ','4303949','48468','0'), etc.\n+    */\n+    constexpr size_t ii_guid_offset = TableImportDatas[TABLE_TYPE_ITEM_INSTANCE].guidOffsetBegin;\n+    const std::string ii_vals_sep = \"('\";\n+    const std::string ii_sep = \"'\";\n+\n+    //BOT_LOG_ERROR(\"scripts\", \"import: ReGuidItemInstance ii_guid_offset {}\", uint32(ii_guid_offset));\n+\n+    size_t pos1 = line.find(ii_vals_sep);\n+    ASSERT(pos1 != std::string::npos);\n+    while (pos1 != std::string::npos)\n+    {\n+        //BOT_LOG_ERROR(\"scripts\", \"cur pos1 {}\", int32(pos1));\n+        bool reguidDone = false;\n+        uint32 sepNum = 0;\n+        size_t begin_pos = 0, end_pos = 0;\n+        size_t pos2 = line.find(ii_sep, pos1 + 1);\n+        ASSERT(pos2 != std::string::npos);\n+        while (pos2 != std::string::npos)\n+        {\n+            ++sepNum;\n+            //BOT_LOG_ERROR(\"scripts\", \"cur pos2 {} sep {} s {} e {}, cval {}\",\n+            //    int32(pos2), sepNum, uint32(begin_pos), uint32(end_pos), uint32((sepNum-1) / 2));\n+            if (begin_pos == 0 && !((sepNum-1) % 2) && ((sepNum-1) / 2) == ii_guid_offset)\n+            {\n+                begin_pos = pos2 + 1;\n+                //BOT_LOG_ERROR(\"scripts\", \"import: ReGuidItemInstance begin_pos {}\", uint32(begin_pos));\n+            }\n+            else if (end_pos == 0 && ((sepNum-1) % 2) && ((sepNum-1) / 2) == ii_guid_offset)\n+            {\n+                end_pos = pos2;\n+                //BOT_LOG_ERROR(\"scripts\", \"import: ReGuidItemInstance end_pos {}\", uint32(end_pos));\n+            }\n+\n+            if (begin_pos && end_pos)\n+            {\n+                uint32 guidVal;\n+                StringToVal(line, guidVal, begin_pos, end_pos);\n+                if (!guidVal)\n+                {\n+                    BOT_LOG_ERROR(\"scripts\", \"import: ReGuidItemInstance no guidVal from {}!\", line.substr(begin_pos, end_pos - begin_pos));\n+                    return false;\n+                }\n+                //this is not checked at dump save\n+                if (auto [iter, res] = ItemReguidMap.insert({ guidVal, nextGuid }); !res)\n+                    BOT_LOG_ERROR(\"scripts\", \"import: ReGuidItemInstance item guid {} was already reguided to {}. Saved dump contains duplicate item guids - you'll have to fix them manually, proceeding anyways...\",\n+                        guidVal, iter->second);\n+\n+                //BOT_LOG_ERROR(\"scripts\", \"import: ReGuidItemInstance replacing {} with {}\", guidVal, nextGuid);\n+                line.replace(begin_pos, end_pos - begin_pos, Bcore::Impl::StringConvertImpl::For<std::remove_cvref_t<decltype(nextGuid)>>::ToString(nextGuid));\n+\n+                ++nextGuid;\n+                reguidDone = true;\n+                break;\n+            }\n+\n+            pos2 = line.find(ii_sep, pos2 + 1);\n+        }\n+\n+        if (!reguidDone)\n+        {\n+            BOT_LOG_ERROR(\"scripts\", \"import: ReGuidItemInstance reguid failed for string! Was:\\n{}\", line);\n+            return false;\n+        }\n+\n+        pos1 = line.find(ii_vals_sep, pos1 + 1);\n+    }\n+\n+    return true;\n+}\n+\n+static bool ReGuidCreature(std::string& line)\n+{\n+    /*\n+    INSERT INTO `item_instance` (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`position\n+    _x`,`position_y`,`position_z`,`orientation`,`curhealth`,`curmana` VALUES ('12561\n+    3','30102','571','0','0','1','1','0','0','5735.7','-3037.58','296.551','0.558505\n+    ','120','0','0','1','0','0','0','0','0','','0');\n+    */\n+    constexpr size_t cr_guid_offset = TableImportDatas[TABLE_TYPE_CREATURE].guidOffsetBegin;\n+    static const std::string cr_vals_sep = \"('\";\n+    static const std::string cr_sep = \"'\";\n+\n+    bool reguidDone = false;\n+    uint32 sepNum = 0;\n+    size_t begin_pos = 0, end_pos = 0;\n+\n+    size_t pos = line.find(cr_vals_sep);\n+    ASSERT(pos != std::string::npos);\n+    pos = line.find(cr_sep);\n+    ASSERT(pos != std::string::npos);\n+    while (pos != std::string::npos)\n+    {\n+        ++sepNum;\n+        //BOT_LOG_ERROR(\"scripts\", \"import: ReGuidCreature sepNum {}\", sepNum);\n+        if (begin_pos == 0 && !((sepNum-1) % 2) && ((sepNum-1) / 2) == cr_guid_offset)\n+        {\n+            begin_pos = pos + 1;\n+            //BOT_LOG_ERROR(\"scripts\", \"import: ReGuidCreature begin_pos {}\", uint32(begin_pos));\n+        }\n+        else if (end_pos == 0 && ((sepNum-1) % 2) && ((sepNum-1) / 2) == cr_guid_offset)\n+        {\n+            end_pos = pos;\n+            //BOT_LOG_ERROR(\"scripts\", \"import: ReGuidCreature end_pos {}\", uint32(end_pos));\n+        }\n+\n+        if (begin_pos && end_pos)\n+        {\n+            uint32 guidVal;\n+            StringToVal(line, guidVal, begin_pos, end_pos);\n+            if (!guidVal)\n+            {\n+                BOT_LOG_ERROR(\"scripts\", \"import: ReGuidCreature no guidVal from {}!\",\n+                    line.substr(begin_pos, end_pos - begin_pos));\n+                return false;\n+            }\n+\n+            uint32 nextGuid = sObjectMgr->GenerateCreatureSpawnId();\n+            //BOT_LOG_ERROR(\"scripts\", \"import: ReGuidCreature replacing {} with {}\", guidVal, nextGuid);\n+            line.replace(begin_pos, end_pos - begin_pos, Bcore::Impl::StringConvertImpl::For<decltype(nextGuid)>::ToString(nextGuid));\n+\n+            reguidDone = true;\n+            break;\n+        }\n+\n+        pos = line.find(cr_sep, pos + 1);\n+    }\n+\n+    return reguidDone;\n+}\n+\n+BotDataDumpResult NPCBotsDump::Load(std::string const& file)\n+{\n+    std::ifstream input(file);\n+    if (!input.is_open())\n+        return BOT_DUMP_FAIL_FILE_NOT_EXIST;\n+\n+    return LoadDump(input);\n+}\n+\n+BotDataDumpResult NPCBotsDump::LoadDump(std::ifstream& input)\n+{\n+    std::unordered_set<uint32> ExistingNPCBots;\n+    std::unordered_set<uint32> ExistingNPCBotTransmogs;\n+\n+    //prepare data for existing entries checks\n+    //bot entry\n+    //first - from `characters_npcbot`\n+    QueryResult result = CharacterDatabase.Query(\"SELECT `entry` FROM `characters_npcbot`\");\n+    Field* fields;\n+    if (result)\n+    {\n+        fields = result->Fetch();\n+        do\n+        {\n+            ExistingNPCBots.insert((*fields).GetUInt32());\n+        } while (result->NextRow());\n+    }\n+    //second - join with entries from `creature` table (who knows what you have spawned there before you needed to import bots eh?)\n+    result = WorldDatabase.Query(\"SELECT `id` FROM `creature` WHERE `id` IN (SELECT `entry` FROM `creature_template_npcbot_extras`) ORDER BY `id`\");\n+    if (result)\n+    {\n+        fields = result->Fetch();\n+        do\n+        {\n+            ExistingNPCBots.insert((*fields).GetUInt32());\n+        } while (result->NextRow());\n+    }\n+    //bot transmogs\n+    result = CharacterDatabase.Query(\"SELECT `entry` FROM `characters_npcbot_transmog`\");\n+    if (result)\n+    {\n+        fields = result->Fetch();\n+        do\n+        {\n+            ExistingNPCBotTransmogs.insert((*fields).GetUInt32());\n+        } while (result->NextRow());\n+    }\n+    //item guid\n+    result = CharacterDatabase.Query(\"SELECT MAX(`guid`) FROM `item_instance`\");\n+    ASSERT(result);\n+    fields = result->Fetch();\n+    static uint32 NextItemGuid = (*fields).GetUInt32() + 1;\n+    //BOT_LOG_ERROR(\"scripts\", \"import: NextItemGuid {}\", NextItemGuid);\n+\n+    CharacterDatabaseTransaction ctrans = CharacterDatabase.BeginTransaction();\n+    WorldDatabaseTransaction wtrans = WorldDatabase.BeginTransaction();\n+\n+    std::list<std::string> ctransStrings;\n+    std::list<std::string> wtransStrings;\n+\n+    ImportDataTableType curImportDataTableType = IMPORT_TABLE_INVALID;\n+    std::string curFieldsStr;\n+    std::string curExecLine;\n+    uint8 curParamCount = 0;\n+\n+    std::string line;\n+    uint32 lineNum = 0;\n+    while (std::getline(input, line))\n+    {\n+        ++lineNum;\n+\n+        size_t nw_pos = line.find_first_not_of(\" \\t\\n\\r\\7\");\n+        if (nw_pos == std::string::npos)\n+            continue;\n+\n+        static std::string const NoteLine = \"IMPORTANT NOTE:\";\n+        if (line.substr(nw_pos, NoteLine.size()) == NoteLine)\n+            continue;\n+\n+        if (curFieldsStr.empty())\n+        {\n+            std::string table_name = line.substr(line.find_first_of('`'));\n+            //BOT_LOG_ERROR(\"scripts\", \"import: found table {}\", table_name);\n+            curImportDataTableType = GetImportDataTableType(table_name);\n+            switch (curImportDataTableType)\n+            {\n+                case TABLE_TYPE_CHARACTERS_NPCBOT:\n+                case TABLE_TYPE_NPCBOT_TRANSMOG:\n+                case TABLE_TYPE_ITEM_INSTANCE:\n+                case TABLE_TYPE_CREATURE:\n+                    curFieldsStr = TableImportDatas[curImportDataTableType].fieldsStr;\n+                    break;\n+                default:\n+                    BOT_LOG_ERROR(\"scripts\", \"import: unknown table {} at line {}\", table_name, lineNum);\n+                    return BOT_DUMP_FAIL_FILE_CORRUPTED;\n+            }\n+\n+            curExecLine += line;\n+            continue;\n+        }\n+        else if (curParamCount == 0)\n+        {\n+            if (line.compare(curFieldsStr))\n+                return BOT_DUMP_FAIL_FILE_CORRUPTED;\n+\n+            curParamCount = TableImportDatas[curImportDataTableType].paramsCount;\n+            //BOT_LOG_ERROR(\"scripts\", \"import: param count {}\", uint32(curParamCount));\n+\n+            curExecLine += line;\n+            continue;\n+        }\n+        else\n+        {\n+            if (GetImportLineParamsCount(line) != curParamCount)\n+            {\n+                BOT_LOG_ERROR(\"scripts\", \"import: invalid param count {} at line {}\", uint32(curParamCount), lineNum);\n+                return BOT_DUMP_FAIL_FILE_CORRUPTED;\n+            }\n+\n+            //check values conflicts, abort on existing values\n+            size_t checkOffset = 0;\n+            bool needCheckVal = false;\n+            switch (curImportDataTableType)\n+            {\n+                case TABLE_TYPE_CHARACTERS_NPCBOT:\n+                    //entry\n+                    //checkOffset = 0;\n+                    needCheckVal = true;\n+                    break;\n+                case TABLE_TYPE_NPCBOT_TRANSMOG:\n+                    //entry\n+                    //checkOffset = 0;\n+                    needCheckVal = true;\n+                    break;\n+                default:\n+                    break;\n+            }\n+            uint32 checkVal;\n+            if (needCheckVal && !ExtractValueFromString(line, checkVal, checkOffset))\n+            {\n+                BOT_LOG_ERROR(\"scripts\", \"import: unable to extract value from line {} at offset {} type {}\",\n+                    lineNum, uint32(checkOffset), uint32(curImportDataTableType));\n+                return BOT_DUMP_FAIL_FILE_CORRUPTED;\n+            }\n+            switch (curImportDataTableType)\n+            {\n+                case TABLE_TYPE_CHARACTERS_NPCBOT:\n+                    if (ExistingNPCBots.contains(checkVal))\n+                    {\n+                        BOT_LOG_ERROR(\"scripts\", \"import: NPCBot id {} already exists in `characters_npcbot` or `creature` table! Aborting\", checkVal);\n+                        return BOT_DUMP_FAIL_DATA_OCCUPIED;\n+                    }\n+                    break;\n+                case TABLE_TYPE_NPCBOT_TRANSMOG:\n+                    if (ExistingNPCBotTransmogs.contains(checkVal))\n+                    {\n+                        BOT_LOG_ERROR(\"scripts\", \"import: NPCBot id {} already exists in `characters_npcbot_transmog` table! Aborting\", checkVal);\n+                        return BOT_DUMP_FAIL_DATA_OCCUPIED;\n+                    }\n+                    break;\n+                default:\n+                    break;\n+            }\n+\n+            curExecLine += line;\n+\n+            //multi-line import\n+            if (line[line.size()-1] == ',')\n+                continue;\n+            else if (line[line.size()-1] != ';')\n+            {\n+                BOT_LOG_ERROR(\"scripts\", \"import: unexpected line ending at line {}\", lineNum);\n+                return BOT_DUMP_FAIL_FILE_CORRUPTED;\n+            }\n+        }\n+\n+        //reguid if needed\n+        switch (curImportDataTableType)\n+        {\n+            case TABLE_TYPE_ITEM_INSTANCE:\n+                if (!ReGuidItemInstance(curExecLine, NextItemGuid))\n+                {\n+                    BOT_LOG_ERROR(\"scripts\", \"import: unable to reguid item instance at line {}!\", lineNum);\n+                    return BOT_DUMP_FAIL_FILE_CORRUPTED;\n+                }\n+                if (!ReGuidBotEquips(ctransStrings.back()))\n+                {\n+                    BOT_LOG_ERROR(\"scripts\", \"import: unable to reguid bot equips at line {}:\\n{}!\", lineNum, ctransStrings.back());\n+                    return BOT_DUMP_FAIL_FILE_CORRUPTED;\n+                }\n+                break;\n+            case TABLE_TYPE_CREATURE:\n+                if (!ReGuidCreature(curExecLine))\n+                {\n+                    BOT_LOG_ERROR(\"scripts\", \"import: unable to reguid creature at line {}!\", lineNum);\n+                    return BOT_DUMP_FAIL_FILE_CORRUPTED;\n+                }\n+                break;\n+            default:\n+                break;\n+        }\n+\n+        switch (curImportDataTableType)\n+        {\n+            case TABLE_TYPE_CHARACTERS_NPCBOT:\n+            case TABLE_TYPE_NPCBOT_TRANSMOG:\n+            case TABLE_TYPE_ITEM_INSTANCE:\n+                //BOT_LOG_ERROR(\"scripts\", \"import: adding to chars DB\");\n+                ctransStrings.push_back(curExecLine);\n+                //ctrans->Append(curExecLine.c_str());\n+                break;\n+            case TABLE_TYPE_CREATURE:\n+                //BOT_LOG_ERROR(\"scripts\", \"import: adding to world DB\");\n+                wtransStrings.push_back(curExecLine);\n+                //wtrans->Append(curExecLine.c_str());\n+                break;\n+            default:\n+                ASSERT(false);\n+        }\n+\n+        curParamCount = 0;\n+        curExecLine.clear();\n+        curFieldsStr.clear();\n+        curImportDataTableType = IMPORT_TABLE_INVALID;\n+    }\n+\n+    //check incomplete last query\n+    if (!curExecLine.empty() || !curFieldsStr.empty() || curParamCount > 0 ||\n+        curImportDataTableType != IMPORT_TABLE_INVALID)\n+    {\n+        BOT_LOG_ERROR(\"scripts\", \"import: unexpected file ending, incomplete query {}, fields {}, type {}!\",\n+            curExecLine, curFieldsStr, uint32(curImportDataTableType));\n+\n+        return BOT_DUMP_FAIL_FILE_CORRUPTED;\n+    }\n+\n+    //Replace all 'NULL' values as they are saved in dump with plain NULL\n+    for (auto& cs : ctransStrings)\n+        FixNULLBotFields(cs);\n+    for (auto& ws : wtransStrings)\n+        FixNULLBotFields(ws);\n+\n+    //BOT_LOG_ERROR(\"scripts\", \"import: charDb execLines:\");\n+    for (auto const& cs : ctransStrings)\n+    {\n+        //BOT_LOG_ERROR(\"scripts\", \"{}\", (*ci));\n+        ctrans->Append(cs.c_str());\n+    }\n+    //BOT_LOG_ERROR(\"scripts\", \"import: worldDb execLines:\");\n+    for (auto const& ws : wtransStrings)\n+    {\n+        //BOT_LOG_ERROR(\"scripts\", \"{}\", (*wi));\n+        wtrans->Append(ws.c_str());\n+    }\n+\n+    CharacterDatabase.CommitTransaction(ctrans);\n+    WorldDatabase.CommitTransaction(wtrans);\n+\n+    return BOT_DUMP_SUCCESS;\n+}\n+\n+BotDataDumpResult NPCBotsDump::Write(std::string const& file)\n+{\n+    if (std::ifstream(file).is_open())\n+        return BOT_DUMP_FAIL_FILE_ALREADY_EXISTS;\n+\n+    BotDataDumpResult ret = BOT_DUMP_SUCCESS;\n+    std::string dumpstr = GetDump();\n+    if (dumpstr.empty())\n+        ret = BOT_DUMP_FAIL_INCOMPLETE;\n+    else\n+    {\n+        std::ofstream fout(file, std::ios_base::trunc);\n+        if (!fout.is_open())\n+            return BOT_DUMP_FAIL_CANT_WRITE_TO_FILE;\n+        fout << dumpstr;\n+    }\n+\n+    return ret;\n+}\n+\n+std::string NPCBotsDump::GetDump()\n+{\n+    //bots are disabled but we need that data\n+    if (!BotDataMgr::AllBotsLoaded())\n+        BotDataMgr::LoadNpcBots(false);\n+\n+    std::ostringstream dump;\n+\n+    dump << \"IMPORTANT NOTE: THIS DUMPFILE IS MADE FOR USE WITH THE 'NPCBOT DUMP' COMMAND ONLY - EITHER THROUGH INGAME CHAT OR ON CONSOLE!\\n\";\n+    dump << \"IMPORTANT NOTE: DO NOT apply it directly - it will irreversibly DAMAGE and CORRUPT your database! You have been warned!\\n\\n\";\n+\n+    BotStringTransaction trans;\n+\n+    std::set<uint32> valid_ids;\n+    bool integrityChecked = true;\n+    for (uint32 i : BotDataMgr::GetExistingNPCBotIds())\n+    {\n+        //skip generated bots\n+        if (i >= BOT_ENTRY_CREATE_BEGIN && BotDataMgr::GetBotExtraCreatureTemplate(i))\n+            continue;\n+\n+        BotDataVerificationResult res = VerifyWriteData(i);\n+        if (res == BOT_DATA_INCOMPLETE)\n+        {\n+            if (integrityChecked)\n+                integrityChecked = false;\n+        }\n+        else if (res == BOT_DATA_VALID)\n+            valid_ids.insert(i);\n+    }\n+\n+    if (!integrityChecked || valid_ids.empty())\n+        return {};\n+\n+    for (uint32 valid_id : valid_ids)\n+    {\n+        AppendBotNPCBotData(&trans, valid_id);\n+        AppendBotNPCBotTransmogData(&trans, valid_id);\n+        AppendBotEquipsData(&trans, valid_id);\n+        AppendBotCreatureData(&trans, valid_id);\n+    }\n+\n+    dump << trans.GetBuffer();\n+\n+    return dump.str();\n+}\n+\n+BotDataVerificationResult NPCBotsDump::VerifyWriteData(uint32 entry) const\n+{\n+    NpcBotData const* botData = BotDataMgr::SelectNpcBotData(entry);\n+\n+    //bot of this entry is not spawned\n+    if (!botData)\n+        return BOT_DATA_NOT_EXIST;\n+\n+    EquipmentInfo const* deinfo = BotDataMgr::GetBotEquipmentInfo(entry);\n+    if (!deinfo)\n+    {\n+        BOT_LOG_ERROR(\"scripts\", \"NPCBotsDump::AppendBotCreatureData creature {} is not found in `creature_equip_template` table!\", entry);\n+        return BOT_DATA_INCOMPLETE;\n+    }\n+\n+    QueryResult result = WorldDatabase.PQuery(\"SELECT `guid` FROM `creature` WHERE `id` = {}\", entry);\n+\n+    //creature is not spawned, corrupted\n+    if (!result)\n+    {\n+        BOT_LOG_ERROR(\"scripts\", \"NPCBotsDump::AppendBotCreatureData creature {} is not found in `creature` table!\", entry);\n+        return BOT_DATA_INCOMPLETE;\n+    }\n+    if (result->GetRowCount() > 1)\n+    {\n+        BOT_LOG_ERROR(\"scripts\", \"NPCBotsDump::AppendBotCreatureData creature {} is spawned more that once!\", entry);\n+        return BOT_DATA_INCOMPLETE;\n+    }\n+\n+    return BOT_DATA_VALID;\n+}\n+\n+template<typename T>\n+inline static void AppendEscapedValue(std::ostringstream& ss, T&& val, bool end = false)\n+{\n+    ss << '\\'' << std::forward<T>(val) << '\\'';\n+    if (!end)\n+        ss << ',';\n+}\n+inline static void AppendNULL(std::ostringstream& ss, bool end = false)\n+{\n+    AppendEscapedValue(ss, \"NULL\", end);\n+    //ss << \"NULL\";\n+    //if (!end)\n+    //    ss << ',';\n+}\n+static std::string EscapedString(char const* cstr)\n+{\n+    std::string s = cstr;\n+    CharacterDatabase.EscapeString(s);\n+    return s;\n+}\n+\n+void NPCBotsDump::AppendBotNPCBotData(BotStringTransaction* trans, uint32 entry) const\n+{\n+    NpcBotData const* botData = BotDataMgr::SelectNpcBotData(entry);\n+    ASSERT(botData);\n+\n+    std::ostringstream ss;\n+    ss << \"INSERT INTO \" << TableImportDatas[TABLE_TYPE_CHARACTERS_NPCBOT].name << '\\n'\n+        << TableImportDatas[TABLE_TYPE_CHARACTERS_NPCBOT].fieldsStr << '\\n';\n+\n+    ss << '(';\n+\n+    AppendEscapedValue(ss, entry);\n+    AppendEscapedValue(ss, botData->owner);\n+    AppendEscapedValue(ss, botData->roles);\n+    AppendEscapedValue(ss, uint32(botData->spec));\n+    AppendEscapedValue(ss, botData->faction);\n+\n+    if (botData->disabled_spells.empty())\n+        AppendNULL(ss);\n+    else\n+    {\n+        std::ostringstream ssds;\n+        for (uint32 bot_spell : botData->disabled_spells)\n+            ssds << bot_spell << ' ';\n+        AppendEscapedValue(ss, ssds.view());\n+    }\n+\n+    for (auto i : NPCBots::index_array<uint8, BOT_INVENTORY_SIZE>)\n+        AppendEscapedValue(ss, botData->equips[i], i == static_cast<BotEquipSlot>(BOT_INVENTORY_SIZE-1));\n+\n+    ss << \");\\n\";\n+\n+    trans->Append(ss.str());\n+}\n+\n+void NPCBotsDump::AppendBotNPCBotTransmogData(BotStringTransaction* trans, uint32 entry) const\n+{\n+    NpcBotData const* botData = BotDataMgr::SelectNpcBotData(entry);\n+    ASSERT(botData);\n+\n+    QueryResult tresult = CharacterDatabase.PQuery(\"SELECT `entry`,`slot`,`item_id`,`fake_id` FROM `characters_npcbot_transmog` WHERE entry = {}\", entry);\n+\n+    if (!tresult)\n+        return;\n+\n+    std::ostringstream ss;\n+    ss << \"INSERT INTO \" << TableImportDatas[TABLE_TYPE_NPCBOT_TRANSMOG].name << '\\n'\n+        << TableImportDatas[TABLE_TYPE_NPCBOT_TRANSMOG].fieldsStr << '\\n';\n+\n+    constexpr uint32 transmog_fields_count = TableImportDatas[TABLE_TYPE_NPCBOT_TRANSMOG].paramsCount;\n+\n+    while (true)\n+    {\n+        Field* fields = tresult->Fetch();\n+\n+        ss << '(';\n+\n+        for (auto i : NPCBots::index_array<uint32, transmog_fields_count>)\n+        {\n+            bool end = i == transmog_fields_count - 1;\n+            switch (i)\n+            {\n+                case 1:  //slot\n+                    AppendEscapedValue(ss, uint32(fields[i].GetUInt8()), end);\n+                    break;\n+                default:\n+                    AppendEscapedValue(ss,        fields[i].GetUInt32(), end);\n+                    break;\n+            }\n+        }\n+\n+        if (tresult->NextRow())\n+            ss << \"),\\n\";\n+        else\n+        {\n+            ss << \");\\n\";\n+            break;\n+        }\n+    }\n+\n+    trans->Append(ss.str());\n+}\n+\n+void NPCBotsDump::AppendBotEquipsData(BotStringTransaction* trans, uint32 entry) const\n+{\n+    NpcBotData const* botData = BotDataMgr::SelectNpcBotData(entry);\n+    ASSERT(botData);\n+\n+    EquipmentInfo const* deinfo = BotDataMgr::GetBotEquipmentInfo(entry);\n+    ASSERT(deinfo);\n+\n+    CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_NPCBOT_EQUIP_BY_ITEM_INSTANCE);\n+    //        0            1                2      3         4        5      6             7                 8           9           10    11    12         13\n+    //\"SELECT creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomPropertyId, durability, playedTime, text, guid, itemEntry, owner_guid \"\n+    //  \"FROM item_instance WHERE guid IN (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\", CONNECTION_SYNCH\n+\n+    for (auto i : NPCBots::index_array<uint8, BOT_INVENTORY_SIZE>)\n+        stmt->setUInt32(i, botData->equips[i]);\n+\n+    PreparedQueryResult iiresult = CharacterDatabase.Query(stmt);\n+\n+    //all zeros? or maybe broken entry\n+    if (!iiresult)\n+        return;\n+\n+    std::ostringstream ss;\n+    ss << \"INSERT INTO \" << TableImportDatas[TABLE_TYPE_ITEM_INSTANCE].name << '\\n' << TableImportDatas[TABLE_TYPE_ITEM_INSTANCE].fieldsStr << '\\n';\n+\n+    constexpr uint32 item_instance_fields_count = TableImportDatas[TABLE_TYPE_ITEM_INSTANCE].paramsCount;\n+\n+    while (true)\n+    {\n+        Field* fields = iiresult->Fetch();\n+\n+        ss << '(';\n+\n+        for (auto i : NPCBots::index_array<uint8, item_instance_fields_count>)\n+        {\n+            bool end = i == item_instance_fields_count-1;\n+            switch (i)\n+            {\n+                case 4:  //charges\n+                case 6:  //enchantments\n+                case 10: //text\n+                {\n+                    char const* cstr = fields[i].GetCString();\n+                    if (!cstr)\n+                        AppendNULL(ss, end);\n+                    else\n+                        AppendEscapedValue(ss, EscapedString(cstr), end);\n+                    break;\n+                }\n+                case 7:  //randomPropertyId\n+                    AppendEscapedValue(ss,      int32(fields[i].GetInt16()),   end);\n+                    break;\n+                case 8:  //durability\n+                    AppendEscapedValue(ss,     uint32(fields[i].GetUInt16()),  end);\n+                    break;\n+                default:\n+                    AppendEscapedValue(ss,            fields[i].GetUInt32(),   end);\n+                    break;\n+            }\n+        }\n+\n+        if (iiresult->NextRow())\n+            ss << \"),\\n\";\n+        else\n+        {\n+            ss << \");\\n\";\n+            break;\n+        }\n+    }\n+\n+    trans->Append(ss.str());\n+}\n+\n+void NPCBotsDump::AppendBotCreatureData(BotStringTransaction* trans, uint32 entry) const\n+{\n+    QueryResult cresult = WorldDatabase.PQuery(\"SELECT `guid`,`id`,`map`,`spawnMask`,`phaseMask`,`position_x`,`position_y`,`position_z`,`orientation`,`curhealth`,`curmana` FROM `creature` WHERE id = {}\", entry);\n+\n+    ASSERT(cresult);\n+\n+    std::ostringstream ss;\n+    ss << \"INSERT INTO \" << TableImportDatas[TABLE_TYPE_CREATURE].name << '\\n'\n+        << TableImportDatas[TABLE_TYPE_CREATURE].fieldsStr << '\\n';\n+\n+    ss << '(';\n+\n+    constexpr uint32 creature_fields_count = TableImportDatas[TABLE_TYPE_CREATURE].paramsCount;\n+\n+    Field* fields = cresult->Fetch();\n+\n+    for (auto i : NPCBots::index_array<uint8, creature_fields_count>)\n+    {\n+        bool end = i == creature_fields_count-1;\n+        switch (i)\n+        {\n+            case 5:  //position_x\n+            case 6:  //position_y\n+            case 7:  //position_z\n+            case 8:  //orientation\n+                ss.setf(std::ios_base::fixed);\n+                ss.precision(6);\n+                AppendEscapedValue(ss,            fields[i].GetFloat(),    end);\n+                break;\n+            case 3:  //spawnMask\n+                AppendEscapedValue(ss,     uint32(fields[i].GetUInt8()),   end);\n+                break;\n+            case 2:  //map\n+                AppendEscapedValue(ss,     uint32(fields[i].GetUInt16()),  end);\n+                break;\n+            default:\n+                AppendEscapedValue(ss,            fields[i].GetUInt32(),   end);\n+                break;\n+        }\n+    }\n+\n+    ss << \");\\n\";\n+\n+    trans->Append(ss.str());\n+}\ndiff --git a/src/server/game/AI/NpcBots/botdump.h b/src/server/game/AI/NpcBots/botdump.h\nnew file mode 100644\nindex 0000000000..e83c1be55b\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/botdump.h\n@@ -0,0 +1,49 @@\n+#ifndef BOTDUMP_H\n+#define BOTDUMP_H\n+\n+#include \"Define.h\"\n+\n+#include <fstream>\n+#include <string>\n+\n+enum BotDataDumpResult\n+{\n+    //all\n+    BOT_DUMP_SUCCESS                    = 0,\n+    //write\n+    BOT_DUMP_FAIL_FILE_ALREADY_EXISTS,\n+    BOT_DUMP_FAIL_CANT_WRITE_TO_FILE,\n+    BOT_DUMP_FAIL_INCOMPLETE,\n+    //load\n+    BOT_DUMP_FAIL_FILE_NOT_EXIST,\n+    BOT_DUMP_FAIL_FILE_CORRUPTED,\n+    BOT_DUMP_FAIL_DATA_OCCUPIED\n+};\n+\n+enum BotDataVerificationResult\n+{\n+    BOT_DATA_VALID                      = 0,\n+    BOT_DATA_NOT_EXIST,\n+    BOT_DATA_INCOMPLETE\n+};\n+\n+class BotStringTransaction;\n+\n+class NPCBotsDump\n+{\n+public:\n+    BotDataDumpResult Write(std::string const& file);\n+    BotDataDumpResult Load(std::string const& file);\n+\n+private:\n+    std::string GetDump();\n+    BotDataVerificationResult VerifyWriteData(uint32 entry) const;\n+    void AppendBotNPCBotData(BotStringTransaction* trans, uint32 entry) const;\n+    void AppendBotNPCBotTransmogData(BotStringTransaction* trans, uint32 entry) const;\n+    void AppendBotEquipsData(BotStringTransaction* trans, uint32 entry) const;\n+    void AppendBotCreatureData(BotStringTransaction* trans, uint32 entry) const;\n+\n+    BotDataDumpResult LoadDump(std::ifstream& input);\n+};\n+\n+#endif\ndiff --git a/src/server/game/AI/NpcBots/botgearscore.cpp b/src/server/game/AI/NpcBots/botgearscore.cpp\nnew file mode 100644\nindex 0000000000..ee7a9667ff\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/botgearscore.cpp\n@@ -0,0 +1,147 @@\n+#include \"bot_ai.h\"\n+#include \"botdatamgr.h\"\n+#include \"botgearscore.h\"\n+#include \"botlogtraits.h\"\n+#include \"Creature.h\"\n+#include \"Item.h\"\n+\n+#include <map>\n+\n+#ifdef _MSC_VER\n+# pragma warning(push, 4)\n+#endif\n+\n+static constexpr float GS_scale = 1.8618f;\n+\n+static const std::map<uint32, float> ItemSlotMods = {\n+    { INVTYPE_HEAD, 1.0f },\n+    { INVTYPE_NECK, 0.5625f },\n+    { INVTYPE_SHOULDERS, 0.75f },\n+    { INVTYPE_CHEST, 1.0f },\n+    { INVTYPE_WAIST, 0.75f },\n+    { INVTYPE_LEGS, 1.0f },\n+    { INVTYPE_FEET, 0.75f },\n+    { INVTYPE_WRISTS, 0.5625f },\n+    { INVTYPE_HANDS, 0.75f },\n+    { INVTYPE_FINGER, 0.5625f },\n+    { INVTYPE_TRINKET, 0.5625f },\n+    { INVTYPE_WEAPON, 1.0f },\n+    { INVTYPE_SHIELD, 1.0f },\n+    { INVTYPE_RANGED, 0.3164f },\n+    { INVTYPE_CLOAK, 0.5625f },\n+    { INVTYPE_2HWEAPON, 2.0f },\n+    { INVTYPE_ROBE, 1.0f },\n+    { INVTYPE_WEAPONMAINHAND, 1.0f },\n+    { INVTYPE_WEAPONOFFHAND, 1.0f },\n+    { INVTYPE_HOLDABLE, 1.0f },\n+    { INVTYPE_THROWN, 0.3164f },\n+    { INVTYPE_RANGEDRIGHT, 0.3164f },\n+    { INVTYPE_RELIC, 0.3164f }\n+};\n+\n+static constexpr std::pair<float, float> ItemLevelFactors[2][5] = {\n+    {\n+        { 0.0f,    1.0f },\n+        { 0.0f,    1.0f },\n+        { 73.0f,   1.0f },\n+        { 81.375f, 0.8125f },\n+        { 91.45f,  0.65f }\n+    },\n+    {\n+        { 0.0f,    1.0f },\n+        { 0.0f,    2.25f },\n+        { 8.0f,    2.0f },\n+        { 0.75f,   1.8f },\n+        { 26.0f,   1.2f }\n+    }\n+};\n+\n+float CalculateItemGearScoreRaw(ItemTemplate const* proto)\n+{\n+    decltype(ItemSlotMods)::const_iterator smcit = ItemSlotMods.find(proto->InventoryType);\n+    if (smcit == ItemSlotMods.cend())\n+        return 0.0f;\n+\n+    uint32 quality = proto->Quality;\n+    float itemlvl = proto->ItemLevel;\n+    float slotmod = smcit->second;\n+    float qscale = 1.0f;\n+\n+    if (quality == ITEM_QUALITY_LEGENDARY)\n+    {\n+        quality = ITEM_QUALITY_EPIC;\n+        qscale = 1.3f;\n+    }\n+    else if (quality <= ITEM_QUALITY_NORMAL)\n+    {\n+        quality = ITEM_QUALITY_UNCOMMON;\n+        qscale = 0.005f;\n+    }\n+    else if (quality == ITEM_QUALITY_HEIRLOOM)\n+    {\n+        quality = ITEM_QUALITY_RARE;\n+        itemlvl = 187.05f;\n+    }\n+\n+    if (!(quality >= ITEM_QUALITY_UNCOMMON && quality <= ITEM_QUALITY_EPIC))\n+        return 0.0f;\n+\n+    auto const& p = ItemLevelFactors[size_t(itemlvl <= 120.0f)][quality];\n+    return floor(((itemlvl - p.first) / p.second) * slotmod * qscale * GS_scale);\n+}\n+\n+float CalculateItemGearScore(ItemTemplate const* proto, uint32 botentry/* = 0*/, uint8 botlevel/* = 0*/, uint8 botclass/* = 0*/, uint8 botspec/* = 0*/, uint8 slot/* = 18*/)\n+{\n+    EquipmentInfo const* einfo = nullptr;\n+    if (botentry)\n+    {\n+        ASSERT(slot < BOT_INVENTORY_SIZE, \"Invalid bot equip slot %u!\", uint32(slot));\n+        einfo = BotDataMgr::GetBotEquipmentInfo(botentry);\n+        ASSERT(einfo, \"Trying to CalculateItemGearScore for bot %u with no equip info!\", botentry);\n+    }\n+\n+    float itemscore = 0.0f;\n+\n+    if (slot > BOT_SLOT_RANGED || !einfo || einfo->ItemEntry[slot] != proto->ItemId)\n+    {\n+        itemscore = CalculateItemGearScoreRaw(proto);\n+\n+        if (botspec == BOT_SPEC_WARRIOR_FURY && botlevel >= 60 && proto->InventoryType == INVTYPE_2HWEAPON)\n+            itemscore *= 0.5f;\n+        else if (botclass == BOT_CLASS_HUNTER)\n+        {\n+            if (proto->InventoryType == INVTYPE_WEAPON || proto->InventoryType == INVTYPE_WEAPONMAINHAND ||\n+                proto->InventoryType == INVTYPE_WEAPONOFFHAND || proto->InventoryType == INVTYPE_THROWN)\n+                itemscore *= 0.3164f;\n+            else if (proto->InventoryType == INVTYPE_RANGED || proto->InventoryType == INVTYPE_RANGEDRIGHT)\n+               itemscore *= 5.3224f;\n+        }\n+    }\n+\n+    return std::max<float>(itemscore, 0.0f);\n+}\n+\n+std::pair<float, float> CalculateBotGearScore(uint32 botentry, uint8 botlevel, uint8 botclass, uint8 botspec, Item const* const items[BOT_INVENTORY_SIZE])\n+{\n+    uint8 items_count = 0;\n+    float totalscore = 0.0f;\n+\n+    for (auto i : NPCBots::index_array<uint8, BOT_INVENTORY_SIZE>)\n+    {\n+        if (Item const* item = items[i])\n+        {\n+            float itemscore = CalculateItemGearScore(item->GetTemplate(), botentry, botlevel, botclass, botspec, i);\n+            if (itemscore > 0.0f)\n+            {\n+                ++items_count;\n+                totalscore += itemscore;\n+            }\n+        }\n+    }\n+\n+    return { totalscore, totalscore / std::max<uint8>(items_count, 1) };\n+}\n+\n+#ifdef _MSC_VER\n+# pragma warning(pop)\n+#endif\ndiff --git a/src/server/game/AI/NpcBots/botgearscore.h b/src/server/game/AI/NpcBots/botgearscore.h\nnew file mode 100644\nindex 0000000000..1bde8d312e\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/botgearscore.h\n@@ -0,0 +1,16 @@\n+#ifndef BOT_GEARSCORE_H_\n+#define BOT_GEARSCORE_H_\n+\n+#include \"botcommon.h\"\n+\n+#include <utility>\n+\n+class Item;\n+\n+struct ItemTemplate;\n+\n+float CalculateItemGearScoreRaw(ItemTemplate const* proto);\n+float CalculateItemGearScore(ItemTemplate const* proto, uint32 botentry = 0, uint8 botlevel = 0, uint8 botclass = 0, uint8 botspec = 0, uint8 slot = BOT_INVENTORY_SIZE);\n+std::pair<float, float> CalculateBotGearScore(uint32 botentry, uint8 botlevel, uint8 botclass, uint8 botspec, Item const* const items[BOT_INVENTORY_SIZE]);\n+\n+#endif\ndiff --git a/src/server/game/AI/NpcBots/botgiver.cpp b/src/server/game/AI/NpcBots/botgiver.cpp\nnew file mode 100644\nindex 0000000000..6dab2b6ab8\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/botgiver.cpp\n@@ -0,0 +1,298 @@\n+#include \"bot_ai.h\"\n+#include \"botcommon.h\"\n+#include \"botconfig.h\"\n+#include \"botdatamgr.h\"\n+#include \"botgossip.h\"\n+#include \"botspell.h\"\n+#include \"bottext.h\"\n+#include \"botmgr.h\"\n+#include \"Chat.h\"\n+#include \"Creature.h\"\n+#include \"Log.h\"\n+#include \"Player.h\"\n+#include \"ScriptedGossip.h\"\n+#include \"ScriptMgr.h\"\n+#include \"WorldSession.h\"\n+/*\n+NPCbot giver NPC by Trickerer (<https://github.com/Trickerer/> <onlysuffering@gmail.com>)\n+Complete - 100%\n+*/\n+\n+#define HIRE GOSSIP_SENDER_BOTGIVER_HIRE\n+#define HIRE_CLASS GOSSIP_SENDER_BOTGIVER_HIRE_CLASS\n+#define HIRE_ENTRY GOSSIP_SENDER_BOTGIVER_HIRE_ENTRY\n+\n+class script_bot_giver : public CreatureScript\n+{\n+public:\n+    script_bot_giver() : CreatureScript(\"script_bot_giver\") { }\n+\n+    struct bot_giver_AI : public CreatureAI\n+    {\n+        bot_giver_AI(Creature* creature) : CreatureAI(creature) {}\n+\n+        void UpdateAI(uint32 /*diff*/) override {}\n+\n+        bool OnGossipHello(Player* player) override\n+        {\n+            if (!BotCfg::IsNpcBotModEnabled())\n+            {\n+                player->PlayerTalkClass->SendCloseGossip();\n+                return true;\n+            }\n+\n+            if (me->isMoving())\n+                me->BotStopMovement();\n+\n+            AddGossipItemFor(player, GOSSIP_ICON_TALK, bot_ai::LocalizedNpcText(player, BOT_TEXT_BOTGIVER_SERVICE), HIRE, GOSSIP_ACTION_INFO_DEF + 1);\n+\n+            AddGossipItemFor(player, GOSSIP_ICON_CHAT, bot_ai::LocalizedNpcText(player, BOT_TEXT_NEVERMIND), 0, GOSSIP_ACTION_INFO_DEF + 2);\n+\n+            player->PlayerTalkClass->SendGossipMenu(GOSSIP_BOTGIVER_GREET, me->GetGUID());\n+            return true;\n+        }\n+\n+        bool OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override\n+        {\n+            if (!BotCfg::IsNpcBotModEnabled())\n+            {\n+                player->PlayerTalkClass->SendCloseGossip();\n+                return true;\n+            }\n+\n+            uint32 sender = player->PlayerTalkClass->GetGossipOptionSender(gossipListId);\n+            uint32 action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);\n+\n+            player->PlayerTalkClass->ClearMenus();\n+            bool subMenu = false;\n+\n+            uint32 gossipTextId = GOSSIP_BOTGIVER_GREET;\n+\n+            switch (sender)\n+            {\n+                case 0: //exit\n+                    break;\n+                case 1: //BACK: return to main menu\n+                    return OnGossipHello(player);\n+                case HIRE:\n+                {\n+                    gossipTextId = GOSSIP_BOTGIVER_HIRE;\n+\n+                    if (player->GetNpcBotsCount() >= BotCfg::GetMaxNpcBots(player->GetLevel()))\n+                    {\n+                        WhisperTo(player, bot_ai::LocalizedNpcText(player, BOT_TEXT_BOTGIVER_TOO_MANY_BOTS).c_str());\n+                        break;\n+                    }\n+\n+                    if (uint32 maxBotsPerAccount = BotCfg::GetMaxAccountBots())\n+                    {\n+                        uint32 accountBotsCount = BotDataMgr::GetAccountBotsCount(player->GetSession()->GetAccountId());\n+                        if (accountBotsCount >= maxBotsPerAccount)\n+                        {\n+                            ChatHandler ch(player->GetSession());\n+                            ch.PSendSysMessage(bot_ai::LocalizedNpcText(player, BOT_TEXT_HIREFAIL_MAXBOTS_ACCOUNT).c_str(), accountBotsCount, maxBotsPerAccount);\n+                            break;\n+                        }\n+                    }\n+\n+                    subMenu = true;\n+\n+                    uint8 availCount = 0;\n+                    std::array<uint32, BOT_CLASS_END> npcbot_count_per_class{ 0 };\n+\n+                    {\n+                        std::shared_lock lock(*BotDataMgr::GetLock());\n+                        for (Creature const* bot : BotDataMgr::GetExistingNPCBots())\n+                        {\n+                            if (!bot->IsAlive() || bot->IsTempBot() || bot->IsWandererBot() || bot->GetBotAI()->GetBotOwnerGuid() || bot->HasAura(BERSERK))\n+                                continue;\n+                            if (BotCfg::FilterRaces() && bot->GetBotClass() < BOT_CLASS_EX_START && (bot->GetRaceMask() & RACEMASK_ALL_PLAYABLE) &&\n+                                !(bot->GetRaceMask() & ((player->GetRaceMask() & RACEMASK_ALLIANCE) ? RACEMASK_ALLIANCE : RACEMASK_HORDE)))\n+                                continue;\n+\n+                            ++npcbot_count_per_class[bot->GetBotClass()];\n+                        }\n+                    }\n+\n+                    for (uint8 botclass = BOT_CLASS_WARRIOR; botclass < BOT_CLASS_END; ++botclass)\n+                    {\n+                        if (!BotCfg::IsClassEnabled(botclass))\n+                            continue;\n+\n+                        if (player->HaveBot() && BotCfg::GetMaxClassBots())\n+                        {\n+                            uint8 count = static_cast<uint8>(std::ranges::count_if(*player->GetBotMgr()->GetBotMap(), [=](BotMap::value_type const& kv) {\n+                                return kv.second->GetBotClass() == botclass;\n+                            }));\n+                            if (count >= BotCfg::GetMaxClassBots())\n+                                continue;\n+                        }\n+\n+                        uint32 textId;\n+                        switch (botclass)\n+                        {\n+                            case BOT_CLASS_WARRIOR:     textId = BOT_TEXT_CLASS_WARRIOR_PLU;        break;\n+                            case BOT_CLASS_PALADIN:     textId = BOT_TEXT_CLASS_PALADIN_PLU;        break;\n+                            case BOT_CLASS_MAGE:        textId = BOT_TEXT_CLASS_MAGE_PLU;           break;\n+                            case BOT_CLASS_PRIEST:      textId = BOT_TEXT_CLASS_PRIEST_PLU;         break;\n+                            case BOT_CLASS_WARLOCK:     textId = BOT_TEXT_CLASS_WARLOCK_PLU;        break;\n+                            case BOT_CLASS_DRUID:       textId = BOT_TEXT_CLASS_DRUID_PLU;          break;\n+                            case BOT_CLASS_DEATH_KNIGHT:textId = BOT_TEXT_CLASS_DEATH_KNIGHT_PLU;   break;\n+                            case BOT_CLASS_ROGUE:       textId = BOT_TEXT_CLASS_ROGUE_PLU;          break;\n+                            case BOT_CLASS_SHAMAN:      textId = BOT_TEXT_CLASS_SHAMAN_PLU;         break;\n+                            case BOT_CLASS_HUNTER:      textId = BOT_TEXT_CLASS_HUNTER_PLU;         break;\n+                            case BOT_CLASS_BM:          textId = BOT_TEXT_CLASS_BM_PLU;             break;\n+                            case BOT_CLASS_SPHYNX:      textId = BOT_TEXT_CLASS_SPHYNX_PLU;         break;\n+                            case BOT_CLASS_ARCHMAGE:    textId = BOT_TEXT_CLASS_ARCHMAGE_PLU;       break;\n+                            case BOT_CLASS_DREADLORD:   textId = BOT_TEXT_CLASS_DREADLORD_PLU;      break;\n+                            case BOT_CLASS_SPELLBREAKER:textId = BOT_TEXT_CLASS_SPELLBREAKER_PLU;   break;\n+                            case BOT_CLASS_DARK_RANGER: textId = BOT_TEXT_CLASS_DARK_RANGER_PLU;    break;\n+                            case BOT_CLASS_NECROMANCER: textId = BOT_TEXT_CLASS_NECROMANCER_PLU;    break;\n+                            case BOT_CLASS_SEA_WITCH:   textId = BOT_TEXT_CLASS_SEAWITCH_PLU;       break;\n+                            case BOT_CLASS_CRYPT_LORD:  textId = BOT_TEXT_CLASS_CRYPT_LORD_PLU;     break;\n+                            default:                    textId = 0;                                 break;\n+                        }\n+\n+                        if (!textId)\n+                            continue;\n+\n+                        std::ostringstream bclass;\n+                        bclass << npcbot_count_per_class[botclass] << \" \" << bot_ai::LocalizedNpcText(player, textId) << \" (\" << BotCfg::GetNpcBotCostStr(player->GetLevel(), botclass) << \")\";\n+\n+                        AddGossipItemFor(player, GOSSIP_ICON_TALK, bclass.str(), HIRE_CLASS, GOSSIP_ACTION_INFO_DEF + botclass);\n+\n+                        if (++availCount >= BOT_GOSSIP_MAX_ITEMS - 1) //back\n+                            break;\n+                    }\n+\n+                    if (availCount == 0)\n+                        gossipTextId = GOSSIP_BOTGIVER_HIRE_EMPTY;\n+\n+                    AddGossipItemFor(player, GOSSIP_ICON_CHAT, bot_ai::LocalizedNpcText(player, BOT_TEXT_NEVERMIND), 0, GOSSIP_ACTION_INFO_DEF + 1);\n+\n+                    break;\n+                }\n+                case HIRE_CLASS:\n+                {\n+                    gossipTextId = GOSSIP_BOTGIVER_HIRE_CLASS;\n+\n+                    uint8 botclass = action - GOSSIP_ACTION_INFO_DEF;\n+\n+                    uint32 cost = BotCfg::GetNpcBotCostHire(player->GetLevel(), botclass);\n+                    if (!player->HasEnoughMoney(cost))\n+                    {\n+                        WhisperTo(player, bot_ai::LocalizedNpcText(player, BOT_TEXT_HIREFAIL_COST).c_str());\n+                        break;\n+                    }\n+\n+                    subMenu = true;\n+\n+                    uint8 availCount = 0;\n+\n+                    //go through bots map to find what bots are available\n+                    {\n+                        std::shared_lock lock(*BotDataMgr::GetLock());\n+                        for (Creature const* bot : BotDataMgr::GetExistingNPCBots())\n+                        {\n+                            bot_ai const* ai = bot->GetBotAI();\n+                            if (bot->GetBotClass() != botclass || !bot->IsAlive() || ai->IsTempBot() || bot->IsWandererBot() || ai->GetBotOwnerGuid() || bot->HasAura(BERSERK))\n+                                continue;\n+                            if (BotCfg::FilterRaces() && botclass < BOT_CLASS_EX_START && (bot->GetRaceMask() & RACEMASK_ALL_PLAYABLE) &&\n+                                !(bot->GetRaceMask() & ((player->GetRaceMask() & RACEMASK_ALLIANCE) ? RACEMASK_ALLIANCE : RACEMASK_HORDE)))\n+                                continue;\n+\n+                            std::ostringstream message1;\n+                            message1 << bot_ai::LocalizedNpcText(player, BOT_TEXT_BOTGIVER_WISH_TO_HIRE_) << bot->GetName() << '?';\n+\n+                            std::ostringstream info_ostr;\n+                            uint32 raceTextId;\n+                            switch (bot->GetRace())\n+                            {\n+                                case RACE_HUMAN:        raceTextId = BOT_TEXT_RACE_HUMAN;   break;\n+                                case RACE_ORC:          raceTextId = BOT_TEXT_RACE_ORC;     break;\n+                                case RACE_DWARF:        raceTextId = BOT_TEXT_RACE_DWARF;   break;\n+                                case RACE_NIGHTELF:     raceTextId = BOT_TEXT_RACE_NELF;    break;\n+                                case RACE_UNDEAD_PLAYER:raceTextId = BOT_TEXT_RACE_UNDEAD;  break;\n+                                case RACE_TAUREN:       raceTextId = BOT_TEXT_RACE_TAUREN;  break;\n+                                case RACE_GNOME:        raceTextId = BOT_TEXT_RACE_GNOME;   break;\n+                                case RACE_TROLL:        raceTextId = BOT_TEXT_RACE_TROLL;   break;\n+                                case RACE_BLOODELF:     raceTextId = BOT_TEXT_RACE_BELF;    break;\n+                                case RACE_DRAENEI:      raceTextId = BOT_TEXT_RACE_DRAENEI; break;\n+                                default:                raceTextId = BOT_TEXT_RACE_UNKNOWN; break;\n+                            }\n+                            info_ostr << bot->GetName() << \" (\" << (\n+                                bot->GetGender() == GENDER_MALE ? bot_ai::LocalizedNpcText(player, BOT_TEXT_GENDER_MALE) + ' ' :\n+                                bot->GetGender() == GENDER_FEMALE ? bot_ai::LocalizedNpcText(player, BOT_TEXT_GENDER_FEMALE) + ' ' :\n+                                \"\") << bot_ai::LocalizedNpcText(player, raceTextId) << ')';\n+\n+                            player->PlayerTalkClass->GetGossipMenu().AddMenuItem(-1, GOSSIP_ICON_TALK, info_ostr.str(),\n+                                HIRE_ENTRY, GOSSIP_ACTION_INFO_DEF + bot->GetEntry(), message1.str(), cost, false);\n+\n+                            if (++availCount >= BOT_GOSSIP_MAX_ITEMS - 1) //back\n+                                break;\n+                        }\n+                    }\n+\n+                    if (availCount == 0)\n+                        gossipTextId = GOSSIP_BOTGIVER_HIRE_EMPTY;\n+\n+                    AddGossipItemFor(player, GOSSIP_ICON_CHAT, bot_ai::LocalizedNpcText(player, BOT_TEXT_BACK), HIRE, GOSSIP_ACTION_INFO_DEF + 1);\n+\n+                    break;\n+                }\n+                case HIRE_ENTRY:\n+                {\n+                    uint32 entry = action - GOSSIP_ACTION_INFO_DEF;\n+                    Creature const* bot = BotDataMgr::FindBot(entry);\n+                    if (!bot)\n+                    {\n+                        //possible but still\n+                        BOT_LOG_ERROR(\"entities.unit\", \"HIRE_NBOT_ENTRY: bot {} not found!\", entry);\n+                        break;\n+                    }\n+\n+                    bot_ai const* ai = bot->GetBotAI();\n+                    if (bot->IsInCombat() || !bot->IsAlive() || bot_ai::CCed(bot) ||\n+                        bot->HasUnitState(UNIT_STATE_CASTING) || ai->GetBotOwnerGuid() || bot->HasAura(BERSERK))\n+                    {\n+                        //BOT_LOG_ERROR(\"entities.unit\", \"HIRE_NBOT_ENTRY: bot {} ({}) is unavailable all of the sudden!\", entry);\n+                        std::ostringstream failMsg;\n+                        failMsg << bot->GetName() << bot_ai::LocalizedNpcText(player, BOT_TEXT_BOTGIVER__BOT_BUSY);\n+                        WhisperTo(player, failMsg.view());\n+                        break;\n+                    }\n+\n+                    //laways returns true\n+                    bot->GetBotAI()->OnGossipSelect(player, me, GOSSIP_SENDER_HIRE, GOSSIP_ACTION_INFO_DEF);\n+\n+                    if (player->HaveBot() && player->GetBotMgr()->GetBot(bot->GetGUID()))\n+                        WhisperTo(player, bot_ai::LocalizedNpcText(player, BOT_TEXT_BOTGIVER_HIRESUCCESS).c_str());\n+\n+                    break;\n+                }\n+            }\n+\n+            if (subMenu)\n+                player->PlayerTalkClass->SendGossipMenu(gossipTextId, me->GetGUID());\n+            else\n+                player->PlayerTalkClass->SendCloseGossip();\n+\n+            return true;\n+        }\n+\n+        void WhisperTo(Player* player, std::string_view message)\n+        {\n+            me->Whisper(message, LANG_UNIVERSAL, player);\n+        }\n+    };\n+\n+    CreatureAI* GetAI(Creature* creature) const override\n+    {\n+        return new bot_giver_AI(creature);\n+    }\n+};\n+\n+void AddSC_script_bot_giver()\n+{\n+    new script_bot_giver();\n+}\ndiff --git a/src/server/game/AI/NpcBots/botgossip.h b/src/server/game/AI/NpcBots/botgossip.h\nnew file mode 100644\nindex 0000000000..6bb744a95a\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/botgossip.h\n@@ -0,0 +1,153 @@\n+#ifndef BOTGOSSIP_H\n+#define BOTGOSSIP_H\n+\n+#include \"Define.h\"\n+\n+enum BotGossips : uint32\n+{\n+    GOSSIP_SENDER_BEGIN                 = 6000,\n+    GOSSIP_SENDER_BOTGIVER_HIRE,\n+    GOSSIP_SENDER_BOTGIVER_HIRE_CLASS,\n+    GOSSIP_SENDER_BOTGIVER_HIRE_ENTRY,\n+    GOSSIP_SENDER_CLASS,\n+    GOSSIP_SENDER_CLASS_ACTION1,\n+    GOSSIP_SENDER_CLASS_ACTION2,\n+    GOSSIP_SENDER_CLASS_ACTION3,\n+    GOSSIP_SENDER_CLASS_ACTION4,\n+    GOSSIP_SENDER_EQUIPMENT,\n+    GOSSIP_SENDER_EQUIPMENT_LIST,\n+    GOSSIP_SENDER_EQUIPMENT_SHOW,\n+    GOSSIP_SENDER_EQUIPMENT_INFO,\n+    GOSSIP_SENDER_EQUIP_TRANSMOGS,\n+    GOSSIP_SENDER_EQUIP_TRANSMOG_INFO,\n+    GOSSIP_SENDER_EQUIP_TRANSMOGRIFY,\n+    GOSSIP_SENDER_EQUIP_TRANSMOGRIFY_BEGIN = GOSSIP_SENDER_EQUIP_TRANSMOGRIFY,\n+    GOSSIP_SENDER_EQUIP_TRANSMOGRIFY_MHAND = GOSSIP_SENDER_EQUIP_TRANSMOGRIFY_BEGIN,\n+    GOSSIP_SENDER_EQUIP_TRANSMOGRIFY_OHAND,\n+    GOSSIP_SENDER_EQUIP_TRANSMOGRIFY_RANGED,\n+    GOSSIP_SENDER_EQUIP_TRANSMOGRIFY_HEAD,\n+    GOSSIP_SENDER_EQUIP_TRANSMOGRIFY_SHOULDERS,\n+    GOSSIP_SENDER_EQUIP_TRANSMOGRIFY_CHEST,\n+    GOSSIP_SENDER_EQUIP_TRANSMOGRIFY_WAIST,\n+    GOSSIP_SENDER_EQUIP_TRANSMOGRIFY_LEGS,\n+    GOSSIP_SENDER_EQUIP_TRANSMOGRIFY_FEET,\n+    GOSSIP_SENDER_EQUIP_TRANSMOGRIFY_WRIST,\n+    GOSSIP_SENDER_EQUIP_TRANSMOGRIFY_HANDS,\n+    GOSSIP_SENDER_EQUIP_TRANSMOGRIFY_BACK,\n+    GOSSIP_SENDER_EQUIP_TRANSMOGRIFY_BODY,\n+    GOSSIP_SENDER_UNEQUIP,\n+    GOSSIP_SENDER_UNEQUIP_TO_GEARBANK,\n+    GOSSIP_SENDER_UNEQUIP_ALL,\n+    GOSSIP_SENDER_UNEQUIP_ALL_TO_GEARBANK,\n+    GOSSIP_SENDER_EQUIP_AUTOEQUIP,\n+    GOSSIP_SENDER_EQUIP_AUTOEQUIP_EQUIP,\n+    GOSSIP_SENDER_EQUIP_AUTOEQUIP_BEGIN = GOSSIP_SENDER_EQUIP_AUTOEQUIP_EQUIP,\n+    GOSSIP_SENDER_EQUIP_AUTOEQUIP_MHAND = GOSSIP_SENDER_EQUIP_AUTOEQUIP_BEGIN,\n+    GOSSIP_SENDER_EQUIP_AUTOEQUIP_OHAND,\n+    GOSSIP_SENDER_EQUIP_AUTOEQUIP_RANGED,\n+    GOSSIP_SENDER_EQUIP_AUTOEQUIP_HEAD,\n+    GOSSIP_SENDER_EQUIP_AUTOEQUIP_SHOULDERS,\n+    GOSSIP_SENDER_EQUIP_AUTOEQUIP_CHEST,\n+    GOSSIP_SENDER_EQUIP_AUTOEQUIP_WAIST,\n+    GOSSIP_SENDER_EQUIP_AUTOEQUIP_LEGS,\n+    GOSSIP_SENDER_EQUIP_AUTOEQUIP_FEET,\n+    GOSSIP_SENDER_EQUIP_AUTOEQUIP_WRIST,\n+    GOSSIP_SENDER_EQUIP_AUTOEQUIP_HANDS,\n+    GOSSIP_SENDER_EQUIP_AUTOEQUIP_BACK,\n+    GOSSIP_SENDER_EQUIP_AUTOEQUIP_BODY,\n+    GOSSIP_SENDER_EQUIP_AUTOEQUIP_FINGER1,\n+    GOSSIP_SENDER_EQUIP_AUTOEQUIP_FINGER2,\n+    GOSSIP_SENDER_EQUIP_AUTOEQUIP_TRINKET1,\n+    GOSSIP_SENDER_EQUIP_AUTOEQUIP_TRINKET2,\n+    GOSSIP_SENDER_EQUIP_AUTOEQUIP_NECK,\n+    GOSSIP_SENDER_EQUIP_RESET,\n+    GOSSIP_SENDER_EQUIP_RESET_TO_GEARBANK,\n+    GOSSIP_SENDER_EQUIP,\n+    GOSSIP_SENDER_EQUIP_BEGIN           = GOSSIP_SENDER_EQUIP,\n+    GOSSIP_SENDER_EQUIP_MHAND           = GOSSIP_SENDER_EQUIP_BEGIN,\n+    GOSSIP_SENDER_EQUIP_OHAND,\n+    GOSSIP_SENDER_EQUIP_RANGED,\n+    GOSSIP_SENDER_EQUIP_HEAD,\n+    GOSSIP_SENDER_EQUIP_SHOULDERS,\n+    GOSSIP_SENDER_EQUIP_CHEST,\n+    GOSSIP_SENDER_EQUIP_WAIST,\n+    GOSSIP_SENDER_EQUIP_LEGS,\n+    GOSSIP_SENDER_EQUIP_FEET,\n+    GOSSIP_SENDER_EQUIP_WRIST,\n+    GOSSIP_SENDER_EQUIP_HANDS,\n+    GOSSIP_SENDER_EQUIP_BACK,\n+    GOSSIP_SENDER_EQUIP_BODY,\n+    GOSSIP_SENDER_EQUIP_FINGER1,\n+    GOSSIP_SENDER_EQUIP_FINGER2,\n+    GOSSIP_SENDER_EQUIP_TRINKET1,\n+    GOSSIP_SENDER_EQUIP_TRINKET2,\n+    GOSSIP_SENDER_EQUIP_NECK,\n+    GOSSIP_SENDER_EQUIPMENT_BANK_MENU,\n+    GOSSIP_SENDER_EQUIPMENT_BANK_DEPOSIT,\n+    GOSSIP_SENDER_EQUIPMENT_BANK_WITHDRAW,\n+    GOSSIP_SENDER_EQUIPMENT_BANK_DEPOSIT_ITEM,\n+    GOSSIP_SENDER_EQUIPMENT_BANK_WITHDRAW_ITEM,\n+    GOSSIP_SENDER_EQUIPMENT_BANK_SETS_MENU,\n+    GOSSIP_SENDER_EQUIPMENT_BANK_SET_CREATE,\n+    GOSSIP_SENDER_EQUIPMENT_BANK_SET_MENU,\n+    GOSSIP_SENDER_EQUIPMENT_BANK_SET_MENU_ITEM,\n+    GOSSIP_SENDER_EQUIPMENT_BANK_SET_DELETE,\n+    GOSSIP_SENDER_EQUIPMENT_BANK_SET_EQUIP,\n+    GOSSIP_SENDER_ROLES_MAIN,\n+    GOSSIP_SENDER_ROLES_MAIN_TOGGLE,\n+    GOSSIP_SENDER_ROLES_GATHERING,\n+    GOSSIP_SENDER_ROLES_GATHERING_TOGGLE,\n+    GOSSIP_SENDER_ROLES_LOOTING,\n+    GOSSIP_SENDER_ROLES_LOOTING_TOGGLE,\n+    GOSSIP_SENDER_ABILITIES,\n+    GOSSIP_SENDER_ABILITIES_USE,\n+    GOSSIP_SENDER_ABILITIES_SPECIFICS_LIST,\n+    GOSSIP_SENDER_ABILITIES_USAGE_LIST,\n+    GOSSIP_SENDER_ABILITIES_USAGE_LIST_DAMAGE,\n+    GOSSIP_SENDER_ABILITIES_USAGE_LIST_CC,\n+    GOSSIP_SENDER_ABILITIES_USAGE_LIST_HEAL,\n+    GOSSIP_SENDER_ABILITIES_USAGE_LIST_SUPPORT,\n+    GOSSIP_SENDER_ABILITIES_USAGE_TOGGLE_DAMAGE,\n+    GOSSIP_SENDER_ABILITIES_USAGE_TOGGLE_CC,\n+    GOSSIP_SENDER_ABILITIES_USAGE_TOGGLE_HEAL,\n+    GOSSIP_SENDER_ABILITIES_USAGE_TOGGLE_SUPPORT,\n+    GOSSIP_SENDER_SPEC,\n+    GOSSIP_SENDER_SPEC_SET,\n+    GOSSIP_SENDER_USEITEM,\n+    GOSSIP_SENDER_USEITEM_USE,\n+    GOSSIP_SENDER_HIRE,\n+    GOSSIP_SENDER_DISMISS,\n+    GOSSIP_SENDER_OWNERSHIP,\n+    GOSSIP_SENDER_OWNERSHIP_ADD_PRE,\n+    GOSSIP_SENDER_OWNERSHIP_ADD,\n+    GOSSIP_SENDER_OWNERSHIP_REMOVE,\n+    GOSSIP_SENDER_JOIN_GROUP,\n+    GOSSIP_SENDER_LEAVE_GROUP,\n+    GOSSIP_SENDER_FORMATION,\n+    GOSSIP_SENDER_FORMATION_FOLLOW_DISTANCE_SET,\n+    GOSSIP_SENDER_FORMATION_TOGGLE_COMBAT_POSITIONING,\n+    GOSSIP_SENDER_FORMATION_ATTACK_DISTANCE,\n+    GOSSIP_SENDER_FORMATION_ATTACK_DISTANCE_SET,\n+    GOSSIP_SENDER_FORMATION_ATTACK_ANGLE,\n+    GOSSIP_SENDER_FORMATION_ATTACK_ANGLE_SET,\n+    GOSSIP_SENDER_MODEL_UPDATE,\n+    GOSSIP_SENDER_HOLDPOSITION,\n+    GOSSIP_SENDER_DONOTHING,\n+    GOSSIP_SENDER_FOLLOWME,\n+    GOSSIP_SENDER_ENGAGE_BEHAVIOR,\n+    GOSSIP_SENDER_ENGAGE_DELAY_SET_ATTACK,\n+    GOSSIP_SENDER_ENGAGE_DELAY_SET_HEALING,\n+    GOSSIP_SENDER_HEAL_HEALTH_THRESHOLD_SET,\n+    GOSSIP_SENDER_HEAL_HEALTH_THRESHOLD_PROPAGATE,\n+    GOSSIP_SENDER_PRIORITY_TARGET,\n+    GOSSIP_SENDER_PRIORITY_TARGET_SET_TANK,\n+    GOSSIP_SENDER_PRIORITY_TARGET_SET_DPS = GOSSIP_SENDER_PRIORITY_TARGET_SET_TANK + 3, // BOT_ROLE_DPS - BOT_ROLE_TANK\n+    GOSSIP_SENDER_TROUBLESHOOTING,\n+    GOSSIP_SENDER_TROUBLESHOOTING_FIX,\n+    GOSSIP_SENDER_TROUBLESHOOTING_AURA,\n+    GOSSIP_SENDER_SCAN,\n+    GOSSIP_SENDER_DEBUG,\n+    GOSSIP_SENDER_DEBUG_ACTION,\n+};\n+\n+#endif //BOTGOSSIP_H\ndiff --git a/src/server/game/AI/NpcBots/botlog.cpp b/src/server/game/AI/NpcBots/botlog.cpp\nnew file mode 100644\nindex 0000000000..4c1e40b840\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/botlog.cpp\n@@ -0,0 +1,83 @@\n+#include \"bot_ai.h\"\n+#include \"botconfig.h\"\n+#include \"botdatamgr.h\"\n+#include \"botlog.h\"\n+#include \"Creature.h\"\n+#include \"DatabaseEnv.h\"\n+#include \"Log.h\"\n+\n+template<typename... Args>\n+static void BotLogImpl(uint16 log_type, uint32 entry, int32 owner, int32 mapid, int8 inmap, int8 inworld, Args&&... params)\n+{\n+    std::vector<std::string> sparams;\n+    sparams.reserve(MAX_BOT_LOG_PARAMS);\n+    using compounder = int[];\n+    (void)compounder { 0, ((void)sparams.push_back(NPCBots::StringConvert::ToString(params)), 0) ... };\n+    sparams.resize(MAX_BOT_LOG_PARAMS, {});\n+    for (uint8 i = 0; i < MAX_BOT_LOG_PARAMS; ++i)\n+    {\n+        if (sparams[i].size() > MAX_BOT_LOG_PARAM_LENGTH)\n+        {\n+            BOT_LOG_DEBUG(\"npcbots\", \"Bot logger: while writing type {} entry {} owner {} param {} '{}' was truncated to {} symbols!\",\n+                log_type, entry, owner, uint32(i+1), sparams[i], MAX_BOT_LOG_PARAM_LENGTH);\n+            sparams[i] = sparams[i].substr(0, MAX_BOT_LOG_PARAM_LENGTH);\n+        }\n+    }\n+\n+    CharacterDatabasePreparedStatement* bstmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_NPCBOT_LOG);\n+    //\"INSERT INTO characters_npcbot_logs (entry, owner, mapid, inmap, inworld, type, param1, param2, param3, param4, param5) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\", CONNECTION_ASYNC\n+    uint32 index = 0;\n+    bstmt->setUInt32(  index, entry);\n+    bstmt->setInt32 (++index, owner);\n+    bstmt->setInt32 (++index, mapid);\n+    bstmt->setInt8  (++index, inmap);\n+    bstmt->setInt8  (++index, inworld);\n+    bstmt->setUInt16(++index, log_type);\n+    for (std::string const& param : sparams)\n+        bstmt->setString(++index, param);\n+    CharacterDatabase.Execute(bstmt);\n+}\n+\n+template<typename... Args>\n+inline static void BotLogImpl(uint16 log_type, Creature const* bot, int32 owner, Args&&... params)\n+{\n+    BotLogImpl(log_type, bot->GetEntry(), owner, (int32)bot->GetMapId(), (int8)!!bot->FindMap(), (int8)bot->IsInWorld(), std::forward<Args>(params)...);\n+}\n+\n+void BotLogger::Log(uint16 log_type, Creature const* bot, NPCBots::LoggableArguments auto&&... params)\n+{\n+    if (!BotCfg::IsNpcBotLogEnabled())\n+        return;\n+\n+    BotLogImpl(log_type, bot, int32(bot->GetBotAI() ? bot->GetBotAI()->GetBotOwnerGuid() : -1), std::forward<decltype(params)>(params)...);\n+}\n+\n+void BotLogger::Log(uint16 log_type, uint32 entry,  NPCBots::LoggableArguments auto&&... params)\n+{\n+    if (!BotCfg::IsNpcBotLogEnabled())\n+        return;\n+\n+    if (Creature const* bot = entry ? BotDataMgr::FindBot(entry) : nullptr)\n+        BotLogger::Log(log_type, bot, std::forward<decltype(params)>(params)...);\n+    else\n+    {\n+        if (entry)\n+        {\n+            std::stringstream ss;\n+            using compounder = int[];\n+            (void)compounder { 0, ((void)(ss << ' ' << params), 0) ... };\n+            BOT_LOG_DEBUG(\"npcbots\", \"Logging unregistered bot entry {}: type {} params:{}\", entry, log_type, ss.str());\n+        }\n+        BotLogImpl(log_type, entry, -1, -1, -1, -1, std::forward<decltype(params)>(params)...);\n+    }\n+}\n+\n+template void BotLogger::Log(uint16, Creature const*);\n+template void BotLogger::Log(uint16, Creature const*, bool&&, bool&&, bool&&);\n+template void BotLogger::Log(uint16, Creature const*, bool&&, bool&&, bool&&, uint32&&, bool&&);\n+template void BotLogger::Log(uint16, Creature const*, uint32&&, uint32&&, uint32&&);\n+template void BotLogger::Log(uint16, Creature const*, uint32&&, uint32&&, uint32&&, uint32&&);\n+template void BotLogger::Log(uint16, Creature const*, uint32&&, uint32&&, uint32&&, uint32&&, uint32&&);\n+template void BotLogger::Log(uint16, uint32);\n+template void BotLogger::Log(uint16, uint32, std::string_view&&);\n+template void BotLogger::Log(uint16, uint32, std::string_view&&, std::string_view&&, std::string_view&&, std::string_view&&, std::string_view&&);\ndiff --git a/src/server/game/AI/NpcBots/botlog.h b/src/server/game/AI/NpcBots/botlog.h\nnew file mode 100644\nindex 0000000000..2090b797f5\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/botlog.h\n@@ -0,0 +1,35 @@\n+#ifndef BOTLOG_H_\n+#define BOTLOG_H_\n+\n+#include \"Define.h\"\n+\n+#include \"botlogtraits.h\"\n+\n+class Creature;\n+\n+inline constexpr uint32 BOT_LOG_KEEP_DAYS = 30;\n+\n+enum BotLogType : uint16\n+{\n+    NPCBOT_LOG_SPAWN                    = 1,\n+    NPCBOT_LOG_TELEPORT_START           = 2,\n+    NPCBOT_LOG_TELEPORT_FINISH          = 3,\n+    NPCBOT_LOG_INIT_EQUIP               = 4,\n+    NPCBOT_LOG_EQUIP                    = 5,\n+    NPCBOT_LOG_UNEQUIP                  = 6,\n+    NPCBOT_LOG_EQUIP_RESET              = 7,\n+\n+    NPCBOT_LOG_SYSTEM_START             = 100,\n+    NPCBOT_LOG_CONFIG_RELOAD            = 101,\n+\n+    NPCBOT_LOG_END\n+};\n+\n+class BotLogger\n+{\n+public:\n+    static void Log(uint16 log_type, Creature const* bot, NPCBots::LoggableArguments auto&&... params);\n+    static void Log(uint16 log_type, uint32 entry, NPCBots::LoggableArguments auto&&... params);\n+};\n+\n+#endif //BOTLOG_H_\ndiff --git a/src/server/game/AI/NpcBots/botmgr.cpp b/src/server/game/AI/NpcBots/botmgr.cpp\nnew file mode 100644\nindex 0000000000..6ca477d571\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/botmgr.cpp\n@@ -0,0 +1,2120 @@\n+#include \"Battleground.h\"\n+#include \"BattlegroundMgr.h\"\n+#include \"bot_ai.h\"\n+#include \"bot_Events.h\"\n+#include \"botconfig.h\"\n+#include \"botdatamgr.h\"\n+#include \"botdpstracker.h\"\n+#include \"botlog.h\"\n+#include \"botmgr.h\"\n+#include \"botspell.h\"\n+#include \"bottext.h\"\n+#include \"bpet_ai.h\"\n+#include \"Chat.h\"\n+#include \"CombatPackets.h\"\n+#include \"Config.h\"\n+#include \"GroupMgr.h\"\n+#include \"GridNotifiers.h\"\n+#include \"GridNotifiersImpl.h\"\n+#include \"Group.h\"\n+#include \"InstanceScript.h\"\n+#include \"Language.h\"\n+#include \"Log.h\"\n+#include \"Map.h\"\n+#include \"MapManager.h\"\n+#include \"MotionMaster.h\"\n+#include \"ObjectMgr.h\"\n+#include \"Player.h\"\n+#include \"ScriptMgr.h\"\n+#include \"SpellAuraEffects.h\"\n+#include \"Vehicle.h\"\n+#include \"Transport.h\"\n+#include \"World.h\"\n+#include \"revision_data.h\"\n+/*\n+Npc Bot Manager by Trickerer (onlysuffering@gmail.com)\n+Player NpcBots management\n+TODO: Move creature hooks here\n+*/\n+\n+#ifdef _MSC_VER\n+# pragma warning(push, 4)\n+#endif\n+\n+using namespace std::string_view_literals;\n+\n+static std::list<BotMgr::delayed_teleport_callback_type> delayed_bot_teleports;\n+\n+BotMgr::BotMgr(Player* const master) : _owner(master), _dpstracker(new DPSTracker())\n+{\n+    _quickrecall = false;\n+    _update_lock = false;\n+    _data = nullptr;\n+}\n+BotMgr::~BotMgr()\n+{\n+    if (_data)\n+        _data->flags &= NPCBOT_MGR_FLAG_MASK_ALL_DB_ALLOWED;\n+\n+    delete _dpstracker;\n+}\n+\n+void BotMgr::LoadData()\n+{\n+    ASSERT(!_data, \"Trying to load player %u data a second time\", _owner->GetGUID().GetCounter());\n+    _data = BotDataMgr::SelectOrCreateNpcBotMgrData(_owner->GetGUID());\n+}\n+\n+void BotMgr::Initialize()\n+{\n+    BotLogger::Log(NPCBOT_LOG_SYSTEM_START, uint32(0), std::string_view{ TRINITY_FILEVERSION_STR }.substr(0, MAX_BOT_LOG_PARAM_LENGTH));\n+\n+    BotDataMgr::LoadNpcBots();\n+    BotDataMgr::LoadWanderMap();\n+    BotDataMgr::GenerateWanderingBots();\n+    BotDataMgr::CreateWanderingBotsSortedGear();\n+    BotDataMgr::LoadNpcBotGroupData();\n+    BotDataMgr::LoadNpcBotGearStorage();\n+    BotDataMgr::LoadNpcBotGearSets();\n+    BotDataMgr::LoadNpcBotMgrData();\n+    BotDataMgr::DeleteOldLogs();\n+}\n+\n+uint8 BotMgr::GetNpcBotsCount() const\n+{\n+    //if (!inWorldOnly)\n+        return (uint8)_bots.size();\n+\n+    //CRITICAL SECTION\n+    //inWorldOnly is only for one-shot cases (opcodes, etc.)\n+    //maybe convert to (bot && bot->isInWorld()) ?\n+    //uint8 count = 0;\n+    //for (BotMap::const_iterator itr = _bots.begin(); itr != _bots.end(); ++itr)\n+    //    if (ObjectAccessor::GetObjectInWorld(itr->first, (Creature*)nullptr))\n+    //        ++count;\n+    //return count;\n+}\n+\n+uint8 BotMgr::GetNpcBotsCountByRole(uint32 roles) const\n+{\n+    return std::ranges::count_if(_bots, [=](BotMap::value_type const& kv) { return kv.second && (roles & kv.second->GetBotRoles()); });\n+}\n+\n+uint8 BotMgr::GetNpcBotsCountByVehicleEntry(uint32 creEntry) const\n+{\n+    return std::ranges::count_if(_bots, [=](BotMap::value_type const& kv) { return kv.second && kv.second->GetVehicle() && kv.second->GetVehicleBase()->GetEntry() == creEntry; });\n+}\n+\n+uint8 BotMgr::GetNpcBotSlot(Creature const* bot) const\n+{\n+    uint8 count = 1;\n+    for (auto const& [_, mbot] : _bots)\n+    {\n+        if (mbot == bot)\n+            break;\n+        ++count;\n+    }\n+    return count;\n+}\n+\n+uint8 BotMgr::GetNpcBotSlotByRole(uint32 roles, Creature const* bot) const\n+{\n+    uint8 count = 1;\n+    for (auto const& [_, mbot] : _bots)\n+    {\n+        if (roles & mbot->GetBotRoles())\n+        {\n+            if (mbot == bot)\n+                break;\n+            if (!(roles == BOT_ROLE_DPS && (mbot->GetBotRoles() & BOT_ROLE_TANK)))\n+                ++count;\n+        }\n+    }\n+    return count;\n+}\n+\n+uint32 BotMgr::GetAllNpcBotsClassMask() const\n+{\n+    uint32 classMask = 0;\n+    for (auto const& [_, mbot] : _bots)\n+        classMask |= (1u << (BotMgr::GetBotEquipmentClass(mbot->GetBotClass()) - 1));\n+    return classMask;\n+}\n+\n+bool BotMgr::LimitBots(Map const* map)\n+{\n+    if (map->IsBattlegroundOrArena())\n+        return true;\n+\n+    if (BotCfg::LimitNpcBotsInDungeons() && map->IsNonRaidDungeon())\n+        return true;\n+    if (BotCfg::LimitNpcBotsInRaids() && map->IsRaid())\n+        return true;\n+\n+    return false;\n+}\n+\n+bool BotMgr::IsBotContestedPvP(Creature const* bot)\n+{\n+    return bot->GetBotAI()->IsContestedPvP();\n+}\n+\n+void BotMgr::SetBotContestedPvP(Creature const* bot)\n+{\n+    bot->GetBotAI()->SetContestedPvP();\n+}\n+\n+bool BotMgr::CanBotParryWhileCasting(Creature const* bot)\n+{\n+    switch (bot->GetBotClass())\n+    {\n+        case BOT_CLASS_SEA_WITCH:\n+            return true;\n+        default:\n+            return false;\n+    }\n+}\n+\n+bool BotMgr::IsWanderingWorldBot(Creature const* bot)\n+{\n+    return bot->IsWandererBot() && (!bot->FindMap() || !bot->GetMap()->GetEntry() || bot->GetMap()->GetEntry()->IsWorldMap());\n+}\n+\n+void BotMgr::Update(uint32 diff)\n+{\n+    _dpstracker->Update(diff);\n+\n+    if (!HaveBot())\n+        return;\n+\n+    //ObjectGuid guid;\n+    bool partyCombat = IsPartyInCombat(false);\n+    bool restrictBots = RestrictBots(_bots.begin()->second, false);\n+\n+    if (partyCombat)\n+        bot_ai::CalculateAoeSpots(_owner, _aoespots);\n+\n+    _update_lock = true;\n+\n+    for (auto const& [_, bot] : _bots)\n+    {\n+        bot_ai* ai = bot->GetBotAI();\n+\n+        if (ai->IAmFree())\n+            continue;\n+\n+        if (!bot->IsInWorld())\n+        {\n+            ai->CommonTimers(diff);\n+            continue;\n+        }\n+\n+        if (partyCombat == false || _owner->InBattleground())\n+            ai->UpdateReviveTimer(diff);\n+\n+        //bot->IsAIEnabled = true;\n+\n+        if (ai->GetReviveTimer() <= diff)\n+        {\n+            if (bot->IsInMap(_owner) && !bot->IsAlive() && !ai->IsDuringTeleport() && _owner->IsAlive() && !_owner->IsInCombat() &&\n+                !_owner->IsBeingTeleported() && !_owner->GetMap()->IsBattleArena() && !_owner->IsInFlight() &&\n+                !_owner->HasUnitFlag2(UNIT_FLAG2_FEIGN_DEATH) && !_owner->HasInvisibilityAura() && !_owner->HasStealthAura())\n+            {\n+                _reviveBot(bot);\n+                continue;\n+            }\n+\n+            ai->SetReviveTimer(urand(1000, 5000));\n+        }\n+\n+        if (_owner->IsAlive() && (bot->IsAlive() || restrictBots) && !ai->IsTempBot() && !ai->IsDuringTeleport() &&\n+            (restrictBots || bot->GetMap() != _owner->GetMap() ||\n+            (!bot->GetBotAI()->HasBotCommandState(BOT_COMMAND_STAY) && _owner->GetDistance(bot) > SIZE_OF_GRIDS)))\n+        {\n+            //_owner->m_Controlled.erase(bot);\n+            TeleportBot(bot, _owner->GetMap(), _owner, _quickrecall);\n+            continue;\n+        }\n+\n+        ai->canUpdate = true;\n+        bot->Update(diff);\n+        ai->canUpdate = false;\n+    }\n+\n+    _update_lock = false;\n+\n+    while (!_delayedRemoveList.empty())\n+    {\n+        decltype(_delayedRemoveList)::iterator itr = _delayedRemoveList.begin();\n+        RemoveBot(itr->first, itr->second);\n+    }\n+\n+    if (_quickrecall)\n+    {\n+        _quickrecall = false;\n+        _data->RemoveFlag(NPCBOT_MGR_FLAG_HIDE_BOTS);\n+    }\n+}\n+\n+bool BotMgr::RestrictBots(Creature const* bot, bool add) const\n+{\n+    if (!_owner->FindMap())\n+        return true;\n+\n+    if (_owner->IsInFlight())\n+        return true;\n+\n+    if (_data->HasFlag(NPCBOT_MGR_FLAG_HIDE_BOTS))\n+        return true;\n+\n+    Map const* currMap = _owner->GetMap();\n+\n+    if (!BotCfg::IsMapAllowedForBots(currMap))\n+        return true;\n+\n+    if (LimitBots(currMap))\n+    {\n+        Group const* gr = _owner->GetGroup();\n+\n+        //if bot is not in instance group - deny (only if trying to teleport to instance)\n+        if (add)\n+        {\n+            if (!gr || !gr->IsMember(bot->GetGUID()))\n+                return true;\n+\n+            //teleporting raid member bot to non-rain dungeon: prioritize owner sub-group members\n+            if (gr->isRaidGroup() && currMap->IsNonRaidDungeon())\n+            {\n+                uint32 max_members = currMap->ToInstanceMap()->GetMaxPlayers();\n+                if (gr->GetMembersCount() > max_members)\n+                {\n+                    uint8 owner_subgroup = gr->GetMemberGroup(_owner->GetGUID());\n+                    if (owner_subgroup != gr->GetMemberGroup(bot->GetGUID()))\n+                    {\n+                        const std::vector<Unit*> members = GetAllGroupMembers(gr);\n+                        uint32 sub_members = 0;\n+                        uint32 sub_members_inside = 0;\n+                        for (auto const& mslot : gr->GetMemberSlots())\n+                        {\n+                            if (mslot.group == owner_subgroup)\n+                            {\n+                                decltype(members)::const_iterator it = std::ranges::find_if(members, [&](Unit const* unit) { return mslot.guid == unit->GetGUID(); });\n+                                if (it != members.cend() && (*it)->IsInMap(_owner))\n+                                    ++sub_members_inside;\n+                                if (++sub_members >= max_members)\n+                                    break;\n+                            }\n+                        }\n+                        if (sub_members >= max_members || sub_members_inside < sub_members)\n+                            return true;\n+                    }\n+                }\n+            }\n+        }\n+\n+        uint32 max_players = 0;\n+        if (currMap->IsDungeon())\n+            max_players = currMap->ToInstanceMap()->GetMaxPlayers();\n+        else if (currMap->IsBattlegroundOrArena())\n+            max_players = _owner->GetBattleground()->GetMaxPlayersPerTeam();\n+\n+        if (max_players)\n+        {\n+            uint32 curPlayers;\n+            if (gr && currMap->IsBattlegroundOrArena())\n+            {\n+                curPlayers = std::ranges::count_if(GetAllGroupMembers(gr), [this](Unit const* u) {\n+                    return u->IsInWorld() && u->IsInMap(_owner) && !(u->IsNPCBot() && u->ToCreature()->IsTempBot());\n+                });\n+            }\n+            else\n+                curPlayers = currMap->GetPlayersCountExceptGMs();\n+            if (curPlayers + uint32(add) > max_players)\n+                return true;\n+        }\n+    }\n+\n+    return false;\n+}\n+\n+bool BotMgr::IsPartyInCombat(bool is_pvp) const\n+{\n+    if (_owner->IsInCombat() && (!is_pvp || _owner->GetCombatManager().HasPvPCombat()))\n+        return true;\n+    return std::ranges::any_of(_bots, [=](BotMap::value_type const& kv) { return kv.second->IsInCombat() && (!is_pvp || kv.second->GetCombatManager().HasPvPCombat()); });\n+}\n+\n+bool BotMgr::HasBotClass(uint8 botclass) const\n+{\n+    return std::ranges::any_of(_bots, [=](BotMap::value_type const& kv) { return kv.second->GetBotClass() == botclass; });\n+}\n+\n+bool BotMgr::HasBotWithSpec(uint8 spec, bool alive) const\n+{\n+    return std::ranges::any_of(_bots, [=](BotMap::value_type const& kv) { return kv.second->GetBotAI()->GetSpec() == spec && (!alive || kv.second->IsAlive()); });\n+}\n+\n+bool BotMgr::HasBotPetType(uint32 petType) const\n+{\n+    return std::ranges::any_of(_bots, [=](BotMap::value_type const& kv) { return kv.second->GetBotsPet() && kv.second->GetBotAI()->GetAIMiscValue(BOTAI_MISC_PET_TYPE) == petType; });\n+}\n+\n+bool BotMgr::IsBeingResurrected(WorldObject const* corpse) const\n+{\n+    std::vector<Unit const*> casters;\n+    if (_owner->IsNonMeleeSpellCast(false, true, true))\n+        casters.push_back(_owner);\n+    for (auto const& [_, bot] : _bots)\n+    {\n+        if (bot->IsNonMeleeSpellCast(false, true, true))\n+            casters.push_back(bot);\n+    }\n+\n+    if (Group const* group = _owner->GetGroup())\n+    {\n+        for (GroupReference const* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())\n+        {\n+            Player const* player = itr->GetSource();\n+            if (!player || player == _owner || player->FindMap() != corpse->GetMap())\n+                continue;\n+\n+            if (player->IsNonMeleeSpellCast(false, true, true))\n+                casters.push_back(player);\n+\n+            if (player->HaveBot())\n+            {\n+                for (auto const& [_, bot] : *player->GetBotMgr()->GetBotMap())\n+                {\n+                    if (bot->IsNonMeleeSpellCast(false, true, true))\n+                        casters.push_back(bot);\n+                }\n+            }\n+        }\n+    }\n+\n+    for (Unit const* caster : casters)\n+    {\n+        if (Spell const* spell = caster->GetCurrentSpell(CURRENT_GENERIC_SPELL))\n+        {\n+            if (corpse->GetGUID() == (corpse->ToCorpse() ? spell->m_targets.GetCorpseTargetGUID() : spell->m_targets.GetUnitTargetGUID()))\n+                return true;\n+        }\n+    }\n+\n+    return false;\n+}\n+\n+void BotMgr::_reviveBot(Creature* bot, WorldLocation* dest)\n+{\n+    if (bot->IsAlive() || !bot->IsInWorld())\n+        return;\n+\n+    if (!bot->GetBotAI()->IAmFree())\n+    {\n+        if (!dest)\n+            bot->CastSpell(bot, COSMETIC_RESURRECTION, false);\n+\n+        if (!dest)\n+            dest = bot->GetBotOwner();\n+\n+        bot->NearTeleportTo(dest->GetPositionX(), dest->GetPositionY(), dest->GetPositionZ(), dest->GetOrientation());\n+        //some weird pos manipulation\n+        if (dest != bot)\n+            bot->Relocate(dest);\n+    }\n+\n+    bot->SetDisplayId(bot->GetNativeDisplayId());\n+    bot->ReplaceAllNpcFlags(NPCFlags(bot->GetCreatureTemplate()->npcflag));\n+    bot->ClearUnitState(UNIT_STATE_ALL_ERASABLE);\n+    bot->ReplaceAllUnitFlags(UnitFlags(0));\n+    bot->SetLootRecipient(nullptr);\n+    bot->SetPvP(bot->GetBotOwner()->IsPvP());\n+    bot->Motion_Initialize();\n+    bot->setDeathState(ALIVE);\n+    //bot->GetBotAI()->Reset();\n+    bot->RefreshCanSwimFlag();\n+    bot->GetBotAI()->SetShouldUpdateStats();\n+\n+    uint8 restore_factor = (bot->IsWandererBot() || (!bot->GetBotAI()->IAmFree() && bot->GetBotOwner()->InBattleground())) ? 1 : 4;\n+    bot->SetHealth(bot->GetMaxHealth() / restore_factor); //25% of max health\n+    if (bot->GetMaxPower(POWER_MANA) > 1)\n+        bot->SetPower(POWER_MANA, bot->GetMaxPower(POWER_MANA) / restore_factor); //25% of max mana\n+\n+    if (IsWanderingWorldBot(bot))\n+        bot->ResetPlayerDamageReq();\n+\n+    if (!bot->GetBotAI()->IAmFree() && !bot->GetBotAI()->HasBotCommandState(BOT_COMMAND_MASK_UNMOVING))\n+        bot->GetBotAI()->SetBotCommandState(BOT_COMMAND_FOLLOW, true);\n+}\n+\n+Creature* BotMgr::GetBot(ObjectGuid guid) const\n+{\n+    decltype(_bots)::const_iterator itr = _bots.find(guid);\n+    return itr != _bots.end() ? itr->second : nullptr;\n+}\n+\n+Creature* BotMgr::GetBotByName(std::string_view name) const\n+{\n+    std::wstring wname;\n+    if (Utf8toWStr(name, wname))\n+    {\n+        wstrToLower(wname);\n+        for (auto const& [_, bot] : _bots)\n+        {\n+            if (!bot)\n+                continue;\n+\n+            std::string_view basename = bot->GetName();\n+            if (CreatureLocale const* creatureInfo = sObjectMgr->GetCreatureLocale(bot->GetEntry()))\n+            {\n+                uint32 loc = _owner->GetSession()->GetSessionDbLocaleIndex();\n+                if (creatureInfo->Name.size() > loc && !creatureInfo->Name[loc].empty())\n+                    basename = creatureInfo->Name[loc];\n+            }\n+\n+            std::wstring wbname;\n+            if (!Utf8toWStr(basename, wbname))\n+                continue;\n+\n+            wstrToLower(wbname);\n+            if (wbname == wname)\n+                return bot;\n+        }\n+    }\n+\n+    return nullptr;\n+}\n+\n+std::vector<Creature*> BotMgr::GetAllBotsByClass(uint8 botclass) const\n+{\n+    std::vector<Creature*> foundBots;\n+    foundBots.reserve(_bots.size());\n+    for (auto const& [_, bot] : _bots)\n+    {\n+        if (!bot|| !bot->IsInWorld() || !bot->IsAlive())\n+            continue;\n+\n+        if (bot->GetBotClass() == botclass)\n+            foundBots.push_back(bot);\n+    }\n+\n+    return foundBots;\n+}\n+\n+void BotMgr::OnOwnerSetGameMaster(bool on)\n+{\n+    for (auto const& [_, bot] : _bots)\n+    {\n+        if (!bot)\n+            continue;\n+\n+        bot->SetFaction(_owner->GetFaction());\n+        //bot->getHostileRefManager().setOnlineOfflineState(!on);\n+        bot->SetByteValue(UNIT_FIELD_BYTES_2, 1, _owner->GetByteValue(UNIT_FIELD_BYTES_2, 1)); //pvp state\n+\n+        if (on && bot->IsInWorld())\n+            bot->CombatStop(true);\n+\n+        if (Unit* pet = bot->GetBotsPet())\n+        {\n+            pet->SetFaction(_owner->GetFaction());\n+            //pet->getHostileRefManager().setOnlineOfflineState(!on);\n+            pet->SetByteValue(UNIT_FIELD_BYTES_2, 1, _owner->GetByteValue(UNIT_FIELD_BYTES_2, 1)); //pvp state\n+\n+            if (on)\n+                pet->CombatStop(true);\n+        }\n+    }\n+}\n+\n+void BotMgr::OnTeleportFar(uint32 mapId, float x, float y, float z, float ori)\n+{\n+    Map* newMap = sMapMgr->CreateBaseMap(mapId);\n+    Position pos{ x, y, z, ori };\n+\n+    for (auto const& [_, bot] : _bots)\n+    {\n+        if (bot->IsTempBot())\n+            continue;\n+\n+        //_owner->m_Controlled.erase(bot);\n+        TeleportBot(bot, newMap, &pos);\n+    }\n+}\n+\n+void BotMgr::_teleportBot(Creature* bot, Map* newMap, float x, float y, float z, float ori, bool quick, bool reset, bot_ai* detached_ai)\n+{\n+    bot_ai* botai = detached_ai ? detached_ai : bot->GetBotAI();\n+    ASSERT(botai);\n+    botai->AbortTeleport();\n+    botai->SetIsDuringTeleport(true);\n+    botai->KillEvents(true);\n+    bot->m_Events.KillAllEvents(false);\n+\n+    BotLogger::Log(NPCBOT_LOG_TELEPORT_START, bot, bot->IsInGrid(), bot->IsWandererBot(), botai->CanAppearInWorld(), newMap->GetId(), bool(reset));\n+\n+    BotMgr::AddDelayedTeleportCallback([bot, botai, newMap, x, y, z, ori, quick, reset]() {\n+        if (bot->GetVehicle())\n+            bot->ExitVehicle();\n+\n+        if (bot->GetTransport())\n+        {\n+            bot->ClearUnitState(UNIT_STATE_IGNORE_PATHFINDING);\n+            bot->GetTransport()->RemovePassenger(bot);\n+        }\n+\n+        Map* mymap = bot->FindMap();\n+        if (mymap)\n+        {\n+            bot->BotStopMovement();\n+\n+            if (mymap != newMap)\n+            {\n+                bot->RemoveAurasByType(SPELL_AURA_MOD_STUN);\n+                bot->RemoveAurasByType(SPELL_AURA_MOD_FEAR);\n+                bot->RemoveAurasByType(SPELL_AURA_MOD_CONFUSE);\n+                bot->RemoveAurasByType(SPELL_AURA_MOD_ROOT);\n+                bot->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_TELEPORTED);\n+            }\n+\n+            bot->InterruptNonMeleeSpells(true);\n+\n+            if (bot->IsInWorld())\n+            {\n+                botai->UnsummonAll(!botai->IAmFree() || botai->IsWanderer());\n+\n+                if (Battleground* bg = bot->GetBotBG())\n+                    bg->EventBotDroppedFlag(bot);\n+\n+                bot->CastSpell(bot, COSMETIC_TELEPORT_EFFECT, true);\n+\n+                if (!bot->IsFreeBot())\n+                    if (InstanceScript* iscr = bot->GetBotOwner()->GetInstanceScript())\n+                        iscr->OnNPCBotLeave(bot);\n+\n+                bot->RemoveFromWorld();\n+            }\n+\n+            bot->RemoveAllGameObjects();\n+            bot->m_Events.KillAllEvents(false);\n+            bot->CombatStop();\n+            bot->ClearComboPoints();\n+            bot->ClearComboPointHolders();\n+\n+            if (bot->IsInGrid())\n+                mymap->RemoveFromMap(bot, false);\n+        }\n+\n+        if (botai->IAmFree())\n+        {\n+            bot->Relocate(x, y, z, ori);\n+            if (bot->FindMap())\n+                bot->ResetMap();\n+            bot->SetMap(newMap);\n+            if (!bot->IsWandererBot() && !botai->CanAppearInWorld())\n+            {\n+                botai->AbortTeleport();\n+                TeleportFinishEvent* delayedTeleportEvent = new TeleportFinishEvent(botai, reset);\n+                std::chrono::milliseconds delay(urand(5000, 8000));\n+                botai->GetEvents()->AddEvent(delayedTeleportEvent, botai->GetEvents()->CalculateTime(delay));\n+                botai->SetTeleportFinishEvent(delayedTeleportEvent);\n+                return;\n+            }\n+\n+            BotLogger::Log(NPCBOT_LOG_TELEPORT_FINISH, bot, bot->IsInGrid(), bot->IsWandererBot(), botai->CanAppearInWorld(), newMap->GetId(), bool(reset));\n+\n+            newMap->AddToMap(bot);\n+            if (reset)\n+                botai->Reset();\n+            botai->SetIsDuringTeleport(false);\n+            botai->ResetContestedPvP();\n+\n+            if (newMap->IsBattleground())\n+            {\n+                Battleground* bg = botai->GetBG();\n+                if (!bg)\n+                {\n+                    BotDataMgr::DespawnWandererBot(bot->GetEntry());\n+                    return;\n+                }\n+\n+                if (newMap != mymap)\n+                {\n+                    //we teleport from base non-instanced map which normally doesn't exist\n+                    if (mymap)\n+                        ASSERT(mymap->GetPlayersCountExceptGMs() == 0);\n+\n+                    bg->AddBot(bot);\n+                }\n+\n+                if (!bot->IsAlive())\n+                {\n+                    ObjectGuid shGuid = ObjectGuid::Empty;\n+                    float mindist = 0.0f;\n+                    for (ObjectGuid bgCreGuid : bg->BgCreatures)\n+                    {\n+                        if (Creature const* bgCre = newMap->GetCreature(bgCreGuid))\n+                        {\n+                            if (bgCre->IsSpiritService())\n+                            {\n+                                float dist = bot->GetExactDist2d(bgCre);\n+                                if (shGuid == ObjectGuid::Empty || dist < mindist)\n+                                {\n+                                    mindist = dist;\n+                                    shGuid = bgCreGuid;\n+                                }\n+                            }\n+                        }\n+                    }\n+                    if (!shGuid.IsEmpty())\n+                        bg->AddPlayerToResurrectQueue(shGuid, bot->GetGUID());\n+                    else\n+                    {\n+                        BOT_LOG_ERROR(\"npcbots\", \"TeleportBot: Bot {} '{}' can't find SpiritHealer in bg {}!\",\n+                            bot->GetEntry(), bot->GetName(), bg->GetName());\n+                    }\n+                }\n+            }\n+\n+            botai->canUpdate = true;\n+\n+            return;\n+        }\n+\n+        //update group member online state\n+        if (Group* gr = bot->GetBotOwner()->GetGroup())\n+            if (gr->IsMember(bot->GetGUID()))\n+                gr->SendUpdate();\n+\n+        botai->AbortTeleport();\n+        TeleportFinishEvent* finishEvent = new TeleportFinishEvent(botai, reset);\n+        std::chrono::milliseconds delay(quick ? urand(500, 1500) : urand(5000, 8000));\n+        botai->GetEvents()->AddEvent(finishEvent, botai->GetEvents()->CalculateTime(delay));\n+        botai->SetTeleportFinishEvent(finishEvent);\n+    });\n+}\n+\n+void BotMgr::TeleportBot(Creature* bot, Map* newMap, Position const* pos, bool quick, bool reset, bot_ai* detached_ai)\n+{\n+    _teleportBot(bot, newMap, pos->GetPositionX(), pos->GetPositionY(), pos->GetPositionZ(), pos->GetOrientation(), quick, reset, detached_ai);\n+}\n+\n+void BotMgr::CleanupsBeforeBotDelete(ObjectGuid guid, uint8 removetype)\n+{\n+    decltype(_bots)::const_iterator itr = _bots.find(guid);\n+    ASSERT(itr != _bots.end(), \"Trying to remove bot which does not belong to this botmgr(b)!!\");\n+    //ASSERT(_owner->IsInWorld(), \"Trying to remove bot while not in world(b)!!\");\n+\n+    Creature* bot = itr->second;\n+\n+    ASSERT(bot->GetCreator() && bot->GetCreator()->GetGUID() == _owner->GetGUID());\n+\n+    if (!bot->IsTempBot())\n+        RemoveBotFromBGQueue(bot);\n+\n+    if (removetype != BOT_REMOVE_LOGOUT || bot->GetBotAI()->HasSharedOwner(_owner->GetGUID().GetCounter()))\n+        RemoveBotFromGroup(bot);\n+\n+    CleanupsBeforeBotDelete(bot);\n+}\n+\n+void BotMgr::CleanupsBeforeBotDelete(Creature* bot)\n+{\n+    //don't allow removing bots while they are teleporting\n+    if (!bot->IsInWorld())\n+        bot->GetBotAI()->AbortTeleport();\n+\n+    if (bot->GetVehicle())\n+        bot->ExitVehicle();\n+\n+    //remove any summons\n+    bot->GetBotAI()->UnsummonAll(false);\n+    bot->AttackStop();\n+    bot->CombatStopWithPets(true);\n+\n+    //bot->SetOwnerGUID(ObjectGuid::Empty);\n+    //_owner->m_Controlled.erase(bot);\n+    bot->SetControlledByPlayer(false);\n+    //bot->RemoveUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED);\n+    //bot->RemoveUnitFlag(UNIT_FLAG_PVP_ATTACKABLE);\n+    bot->SetByteValue(UNIT_FIELD_BYTES_2, 1, 0);\n+    bot->SetCreator(nullptr);\n+    //bot->SetCreatorGUID(ObjectGuid::Empty);\n+\n+    Map* map = bot->FindMap();\n+    if (!map || map->IsDungeon() || bot->IsTempBot())\n+        bot->RemoveFromWorld();\n+}\n+\n+void BotMgr::RemoveAllBots(uint8 removetype)\n+{\n+    while (!_bots.empty())\n+        RemoveBot(_bots.begin()->second->GetGUID(), removetype);\n+}\n+//Bot is being abandoned by player\n+void BotMgr::RemoveBot(ObjectGuid guid, uint8 removetype)\n+{\n+    decltype(_bots)::const_iterator itr = _bots.find(guid);\n+    ASSERT(itr != _bots.end(), \"Trying to remove bot which does not belong to this botmgr(a)!!\");\n+    //ASSERT(_owner->IsInWorld(), \"Trying to remove bot while not in world(a)!!\");\n+\n+    Creature* bot = itr->second;\n+\n+    if (_update_lock)\n+    {\n+        _delayedRemoveList.emplace_back(guid, BotRemoveType(removetype));\n+        return;\n+    }\n+    else if (!_delayedRemoveList.empty())\n+        std::erase_if(_delayedRemoveList, [=](decltype(_delayedRemoveList)::value_type const& p) { return p.first == guid; });\n+\n+    CleanupsBeforeBotDelete(guid, removetype);\n+\n+    if (_owner->GetSession()->PlayerLogout() && bot->IsInGrid() && bot->FindMap() && bot->FindMap()->GetEntry()->Instanceable())\n+        bot->FindMap()->RemoveFromMap(bot, false);\n+\n+    ////remove control bar\n+    //if (GetNpcBotsCount() <= 1 && !_owner->GetPetGUID() && _owner->m_Controlled.empty())\n+    //    _owner->SendRemoveControlBar();\n+\n+    _bots.erase(itr);\n+\n+    if (bot->GetBotAI()->IsTempBot())\n+        return;\n+\n+    BotAIResetType resetType;\n+    switch (removetype)\n+    {\n+        case BOT_REMOVE_DISMISS: case BOT_REMOVE_UNAFFORD: resetType = bot->GetBotAI()->IsSharedBot() ? BOTAI_RESET_UNBIND : BOTAI_RESET_DISMISS; break;\n+        case BOT_REMOVE_UNBIND:                            resetType = BOTAI_RESET_UNBIND;                                                        break;\n+        default:                                           resetType = BOTAI_RESET_LOGOUT;                                                        break;\n+    }\n+    bot->GetBotAI()->ResetBotAI(resetType);\n+\n+    bot->SetFaction(bot->GetCreatureTemplate()->faction);\n+    bot->SetLevel(bot->GetCreatureTemplate()->minlevel);\n+\n+    if (resetType == BOTAI_RESET_DISMISS)\n+    {\n+        BotDataMgr::ResetNpcBotTransmogData(bot->GetEntry(), false);\n+        uint32 newOwner = 0;\n+        BotDataMgr::UpdateNpcBotData(bot->GetEntry(), NPCBOT_UPDATE_OWNER, &newOwner);\n+        NpcBotData::SharedOwnersContainer sharedOwners{};\n+        BotDataMgr::UpdateNpcBotData(bot->GetEntry(), NPCBOT_UPDATE_SHARED_OWNERS, &sharedOwners);\n+    }\n+}\n+\n+void BotMgr::UnbindBot(ObjectGuid guid)\n+{\n+    Creature const* bot = GetBot(guid);\n+    ASSERT(bot);\n+\n+    RemoveBot(guid, BOT_REMOVE_UNBIND);\n+    bot->GetBotAI()->SetBotCommandState(BOT_COMMAND_UNBIND);\n+}\n+BotAddResult BotMgr::RebindBot(Creature* bot)\n+{\n+    BotAddResult res = AddBot(bot);\n+    if (res == BOT_ADD_SUCCESS)\n+        bot->GetBotAI()->RemoveBotCommandState(BOT_COMMAND_UNBIND);\n+    return res;\n+}\n+\n+BotAddResult BotMgr::AddBot(Creature* bot)\n+{\n+    ASSERT(bot->IsNPCBot());\n+    ASSERT(bot->GetBotAI() != nullptr);\n+\n+    bool owned = bot->GetBotAI()->IsTempBot() || bot->GetBotAI()->HasOwner(_owner->GetGUID().GetCounter());\n+    uint8 owned_count = BotDataMgr::GetOwnedBotsCount(_owner->GetGUID(), 0, true);\n+    uint8 class_count = BotDataMgr::GetOwnedBotsCount(_owner->GetGUID(), bot->GetClassMask(), true);\n+\n+    if (!BotCfg::IsNpcBotModEnabled())\n+    {\n+        ChatHandler ch(_owner->GetSession());\n+        ch.SendSysMessage(bot_ai::LocalizedNpcText(GetOwner(), BOT_TEXT_BOTADDFAIL_DISABLED));\n+        return BOT_ADD_DISABLED;\n+    }\n+    if (GetBot(bot->GetGUID()))\n+        return BOT_ADD_ALREADY_HAVE; //Silent error, intended\n+    if (!bot->GetBotAI()->IAmFree())\n+    {\n+        ChatHandler ch(_owner->GetSession());\n+        ch.PSendSysMessage(bot_ai::LocalizedNpcText(GetOwner(), BOT_TEXT_BOTADDFAIL_OWNED).c_str(), bot->GetName(), bot->GetBotOwner()->GetName());\n+        return BOT_ADD_NOT_AVAILABLE;\n+    }\n+    if (!owned && owned_count >= BotCfg::GetMaxNpcBots(_owner->GetLevel()))\n+    {\n+        ChatHandler ch(_owner->GetSession());\n+        ch.PSendSysMessage(bot_ai::LocalizedNpcText(GetOwner(), BOT_TEXT_HIREFAIL_MAXBOTS).c_str(), BotCfg::GetMaxNpcBots(_owner->GetLevel()));\n+        return BOT_ADD_MAX_EXCEED;\n+    }\n+    if (!owned && BotCfg::GetMaxClassBots() && class_count >= BotCfg::GetMaxClassBots())\n+    {\n+        ChatHandler ch(_owner->GetSession());\n+        ch.PSendSysMessage(bot_ai::LocalizedNpcText(GetOwner(), BOT_TEXT_HIREFAIL_MAXCLASSBOTS).c_str(), class_count, BotCfg::GetMaxClassBots());\n+        return BOT_ADD_MAX_CLASS_EXCEED;\n+    }\n+    //Map* curMap = _owner->GetMap();\n+    //if (!temporary && LimitBots(curMap))\n+    //{\n+    //    InstanceMap* map = curMap->ToInstanceMap();\n+    //    uint32 count = map->GetPlayersCountExceptGMs();\n+    //    if (count >= map->GetMaxPlayers())\n+    //    {\n+    //        ChatHandler ch(_owner->GetSession());\n+    //        ch.PSendSysMessage(\"Instance players limit exceed (%u of %u)\", count, map->GetMaxPlayers());\n+    //        return BOT_ADD_INSTANCE_LIMIT;\n+    //    }\n+    //}\n+    if (!owned)\n+    {\n+        uint32 cost = BotCfg::GetNpcBotCostHire(_owner->GetLevel(), bot->GetBotClass());\n+        if (!_owner->HasEnoughMoney(cost))\n+        {\n+            ChatHandler ch(_owner->GetSession());\n+            std::ostringstream mss;\n+            mss << bot_ai::LocalizedNpcText(GetOwner(), BOT_TEXT_HIREFAIL_COST) << \" (\"\n+                << BotCfg::GetNpcBotCostStr(_owner->GetLevel(), bot->GetBotClass()) << \")!\";\n+            ch.SendSysMessage(mss.view());\n+            return BOT_ADD_CANT_AFFORD;\n+        }\n+\n+        _owner->ModifyMoney(-(int32(cost)));\n+    }\n+\n+    bot->GetBotAI()->canUpdate = false;\n+\n+    if (!bot->IsAlive())\n+        _reviveBot(bot);\n+\n+    bot->GetBotAI()->UnsummonAll(false);\n+\n+    _bots[bot->GetGUID()] = bot;\n+\n+    ASSERT(!bot->GetCreator());\n+    //ASSERT(!bot->GetOwnerGUID());\n+    //bot->SetOwnerGUID(_owner->GetGUID());\n+    bot->SetCreator(_owner); //needed in case of FFAPVP\n+    //bot->SetCreatorGUID(_owner->GetGUID());\n+    //_owner->m_Controlled.insert(bot);\n+    bot->SetControlledByPlayer(true);\n+    //bot->SetUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED);\n+    bot->SetByteValue(UNIT_FIELD_BYTES_2, 1, _owner->GetByteValue(UNIT_FIELD_BYTES_2, 1));\n+    bot->SetFaction(_owner->GetFaction());\n+    bot->SetPhaseMask(_owner->GetPhaseMask(), true);\n+\n+    bot->GetBotAI()->SetBotOwner(_owner);\n+\n+    bot->GetBotAI()->Reset();\n+\n+    bot->LowerPlayerDamageReq(bot->GetMaxHealth());\n+\n+    if (!bot->IsInWorld())\n+        TeleportBot(bot, _owner->GetMap(), _owner);\n+\n+    if (!bot->GetBotAI()->IsTempBot())\n+    {\n+        uint32 newOwner = _owner->GetGUID().GetCounter();\n+        if (!bot->GetBotAI()->HasSharedOwner(newOwner))\n+            BotDataMgr::UpdateNpcBotData(bot->GetEntry(), NPCBOT_UPDATE_OWNER, &newOwner);\n+\n+        bot->GetBotAI()->SetBotCommandState(BOT_COMMAND_FOLLOW, true);\n+        if (bot->GetBotAI()->HasRole(BOT_ROLE_PARTY))\n+            AddBotToGroup(bot);\n+    }\n+\n+    return BOT_ADD_SUCCESS;\n+}\n+\n+bool BotMgr::AddBotToGroup(Creature* bot)\n+{\n+    ASSERT(GetBot(bot->GetGUID()));\n+\n+    Group* gr = _owner->GetGroup();\n+    if (gr)\n+    {\n+        if (gr->IsMember(bot->GetGUID()))\n+            return true;\n+\n+        if (gr->IsFull())\n+        {\n+            if (!gr->isRaidGroup()) //non-raid group is full\n+                gr->ConvertToRaid();\n+            else\n+                return false;\n+        }\n+    }\n+    else\n+    {\n+        gr = new Group;\n+        if (!gr->Create(_owner))\n+        {\n+            delete gr;\n+            return false;\n+        }\n+        sGroupMgr->AddGroup(gr);\n+    }\n+\n+    if (gr->AddMember(bot))\n+    {\n+        if (!bot->GetBotAI()->HasRole(BOT_ROLE_PARTY))\n+            bot->GetBotAI()->ToggleRole(BOT_ROLE_PARTY, true);\n+\n+        return true;\n+    }\n+\n+    return false;\n+}\n+\n+void BotMgr::RemoveBotFromBGQueue(Creature const* bot)\n+{\n+    for (auto i : NPCBots::index_array<uint32, PLAYER_MAX_BATTLEGROUND_QUEUES>)\n+    {\n+        BattlegroundQueueTypeId bgQueueTypeId = _owner->GetBattlegroundQueueTypeId(i);\n+        if (bgQueueTypeId.BattlemasterListId)\n+            sBattlegroundMgr->GetBattlegroundQueue(bgQueueTypeId).RemovePlayer(bot->GetGUID(), true);\n+    }\n+}\n+\n+bool BotMgr::RemoveBotFromGroup(Creature* bot)\n+{\n+    ASSERT(GetBot(bot->GetGUID()));\n+\n+    Group* gr = _owner->GetGroup();\n+    if (!gr || !gr->IsMember(bot->GetGUID()))\n+        return false;\n+\n+    RemoveBotFromBGQueue(bot);\n+\n+    if (bot->GetBotAI()->HasRole(BOT_ROLE_PARTY) && !_owner->GetSession()->PlayerLogout())\n+        bot->GetBotAI()->ToggleRole(BOT_ROLE_PARTY, true);\n+\n+    //debug\n+    //if (gr->RemoveMember(bot->GetGUID()))\n+    //    BOT_LOG_ERROR(\"entities.player\", \"RemoveBotFromGroup(): bot {} removed from group\", bot->GetName());\n+    //else\n+    //    BOT_LOG_ERROR(\"entities.player\", \"RemoveBotFromGroup(): RemoveMember() returned FALSE on bot {}\", bot->GetName());\n+\n+    gr->RemoveMember(bot->GetGUID());\n+\n+    //if removed from group while in instance / bg then remove from world immediately\n+    if (bot->IsInWorld() && RestrictBots(bot, true))\n+        TeleportBot(bot, bot->GetMap(), bot);\n+\n+    return true;\n+}\n+\n+bool BotMgr::RemoveAllBotsFromGroup()\n+{\n+    for (auto const& [_, bot] : _bots)\n+        RemoveBotFromGroup(bot);\n+\n+    return true;\n+}\n+\n+uint8 BotMgr::BotClassByClassName(std::string_view className)\n+{\n+    static const std::map<std::string_view, uint8> BotClassNamesMap = {\n+        { \"warrior\"sv, BOT_CLASS_WARRIOR },\n+        { \"paladin\"sv, BOT_CLASS_PALADIN },\n+        { \"hunter\"sv, BOT_CLASS_HUNTER },\n+        { \"rogue\"sv, BOT_CLASS_ROGUE },\n+        { \"priest\"sv, BOT_CLASS_PRIEST },\n+        { \"deathknight\"sv, BOT_CLASS_DEATH_KNIGHT },\n+        { \"death_knight\"sv, BOT_CLASS_DEATH_KNIGHT },\n+        { \"shaman\"sv, BOT_CLASS_SHAMAN },\n+        { \"mage\"sv, BOT_CLASS_MAGE },\n+        { \"warlock\"sv, BOT_CLASS_WARLOCK },\n+        { \"druid\"sv, BOT_CLASS_DRUID },\n+        { \"blademaster\"sv, BOT_CLASS_BM },\n+        { \"blade_master\"sv, BOT_CLASS_BM },\n+        { \"sphynx\"sv, BOT_CLASS_SPHYNX },\n+        { \"obsidiandestroyer\"sv, BOT_CLASS_SPHYNX },\n+        { \"obsidian_destroyer\"sv, BOT_CLASS_SPHYNX },\n+        { \"destroyer\"sv, BOT_CLASS_SPHYNX },\n+        { \"archmage\"sv, BOT_CLASS_ARCHMAGE },\n+        { \"dreadlord\"sv, BOT_CLASS_DREADLORD },\n+        { \"spellbreaker\"sv, BOT_CLASS_SPELLBREAKER },\n+        { \"spell_breaker\"sv, BOT_CLASS_SPELLBREAKER },\n+        { \"darkranger\"sv, BOT_CLASS_DARK_RANGER },\n+        { \"dark_ranger\"sv, BOT_CLASS_DARK_RANGER },\n+        { \"necromancer\"sv, BOT_CLASS_NECROMANCER },\n+        { \"necro\"sv, BOT_CLASS_NECROMANCER },\n+        { \"seawitch\"sv, BOT_CLASS_SEA_WITCH },\n+        { \"sea_witch\"sv, BOT_CLASS_SEA_WITCH },\n+        { \"cryptlord\"sv, BOT_CLASS_CRYPT_LORD},\n+        { \"crypt_lord\"sv, BOT_CLASS_CRYPT_LORD }\n+    };\n+\n+    //std::transform(className.begin(), className.end(), className.begin(), std::tolower);\n+    decltype(BotClassNamesMap)::const_iterator ci = BotClassNamesMap.find(className);\n+    return ci != BotClassNamesMap.cend() ? ci->second : static_cast<uint8>(BOT_CLASS_NONE);\n+}\n+\n+uint8 BotMgr::GetBotPlayerClass(uint8 bot_class)\n+{\n+    if (bot_class >= BOT_CLASS_EX_START)\n+    {\n+        switch (bot_class)\n+        {\n+            case BOT_CLASS_BM:\n+                return BOT_CLASS_WARRIOR;\n+            case BOT_CLASS_SPHYNX:\n+                return BOT_CLASS_WARLOCK;\n+            case BOT_CLASS_ARCHMAGE:\n+                return BOT_CLASS_MAGE;\n+            case BOT_CLASS_DREADLORD:\n+                return BOT_CLASS_WARLOCK;\n+            case BOT_CLASS_SPELLBREAKER:\n+                return BOT_CLASS_PALADIN;\n+            case BOT_CLASS_DARK_RANGER:\n+                return BOT_CLASS_HUNTER;\n+            case BOT_CLASS_NECROMANCER:\n+                return BOT_CLASS_WARLOCK;\n+            case BOT_CLASS_SEA_WITCH:\n+                return BOT_CLASS_MAGE;\n+            case BOT_CLASS_CRYPT_LORD:\n+                return BOT_CLASS_WARRIOR;\n+            default:\n+                BOT_LOG_ERROR(\"npcbots\", \"GetPlayerClass: unknown Ex bot class {}!\", bot_class);\n+                return BOT_CLASS_PALADIN;\n+        }\n+    }\n+\n+    return bot_class;\n+}\n+\n+uint8 BotMgr::GetBotPlayerRace(uint8 bot_class, uint8 bot_race)\n+{\n+    if (bot_class >= BOT_CLASS_EX_START)\n+    {\n+        switch (bot_class)\n+        {\n+            case BOT_CLASS_BM:\n+                return RACE_ORC;\n+            case BOT_CLASS_SPHYNX:\n+                return RACE_UNDEAD_PLAYER;\n+            case BOT_CLASS_ARCHMAGE:\n+                return RACE_HUMAN;\n+            case BOT_CLASS_DREADLORD:\n+                return RACE_UNDEAD_PLAYER;\n+            case BOT_CLASS_SPELLBREAKER:\n+                return RACE_BLOODELF;\n+            case BOT_CLASS_DARK_RANGER:\n+                return RACE_BLOODELF;\n+            case BOT_CLASS_NECROMANCER:\n+                return RACE_HUMAN;\n+            case BOT_CLASS_SEA_WITCH:\n+                return RACE_TROLL;\n+            case BOT_CLASS_CRYPT_LORD:\n+                return RACE_UNDEAD_PLAYER;\n+            default:\n+                BOT_LOG_ERROR(\"npcbots\", \"GetBotPlayerRace: unknown Ex bot class {}!\", bot_class);\n+                return RACE_HUMAN;\n+        }\n+    }\n+\n+    return bot_race;\n+}\n+\n+uint8 BotMgr::GetBotPlayerClass(Creature const* bot)\n+{\n+    return GetBotPlayerClass(bot->GetBotAI()->GetBotClass());\n+}\n+\n+uint8 BotMgr::GetBotPlayerRace(Creature const* bot)\n+{\n+    return GetBotPlayerRace(bot->GetBotAI()->GetBotClass(), bot->GetRace());\n+}\n+\n+uint8 BotMgr::GetBotEquipmentClass(uint8 bot_class)\n+{\n+    if (bot_class >= BOT_CLASS_EX_START)\n+    {\n+        switch (bot_class)\n+        {\n+            case BOT_CLASS_BM:\n+                return BOT_CLASS_WARRIOR;\n+            case BOT_CLASS_SPHYNX:\n+                return BOT_CLASS_PALADIN;\n+            case BOT_CLASS_ARCHMAGE:\n+                return BOT_CLASS_MAGE;\n+            case BOT_CLASS_DREADLORD:\n+                return BOT_CLASS_PALADIN;\n+            case BOT_CLASS_SPELLBREAKER:\n+                return BOT_CLASS_PALADIN;\n+            case BOT_CLASS_DARK_RANGER:\n+                return BOT_CLASS_HUNTER;\n+            case BOT_CLASS_NECROMANCER:\n+                return BOT_CLASS_PALADIN;\n+            case BOT_CLASS_SEA_WITCH:\n+                return BOT_CLASS_MAGE;\n+            case BOT_CLASS_CRYPT_LORD:\n+                return BOT_CLASS_WARRIOR;\n+            default:\n+                BOT_LOG_ERROR(\"npcbots\", \"GetBotEquipmentClass: unknown Ex bot class {}!\", bot_class);\n+                return BOT_CLASS_PALADIN;\n+        }\n+    }\n+\n+    return BotMgr::GetBotPlayerClass(bot_class);\n+}\n+\n+BotStatMods BotMgr::GetBotStatModByUnitStat(Stats stat)\n+{\n+    BotStatMods bot_stat;\n+    switch (stat)\n+    {\n+        case STAT_STRENGTH:  bot_stat = BotStatMods::BOT_STAT_MOD_STRENGTH;  break;\n+        case STAT_AGILITY:   bot_stat = BotStatMods::BOT_STAT_MOD_AGILITY;   break;\n+        case STAT_STAMINA:   bot_stat = BotStatMods::BOT_STAT_MOD_STAMINA;   break;\n+        case STAT_INTELLECT: bot_stat = BotStatMods::BOT_STAT_MOD_INTELLECT; break;\n+        case STAT_SPIRIT:    bot_stat = BotStatMods::BOT_STAT_MOD_SPIRIT;    break;\n+        default: //should not happen\n+            bot_stat = BOT_STAT_MOD_HEALTH;\n+            break;\n+    }\n+    return bot_stat;\n+}\n+\n+std::string BotMgr::GetTargetIconString(uint8 icon_idx) const\n+{\n+    std::ostringstream ss;\n+    ss << \"|TInterface\\\\TargetingFrame\\\\UI-RaidTargetingIcon_\" << uint32(icon_idx + 1) << \":12|t\";\n+    if (size_t(icon_idx) < TARGET_ICON_NAMES_CACHE_SIZE)\n+        ss << _targetIconNamesCache[icon_idx];\n+\n+    return ss.str();\n+}\n+void BotMgr::UpdateTargetIconName(uint8 id, std::string_view name)\n+{\n+    if (id >= TARGET_ICON_NAMES_CACHE_SIZE)\n+        return;\n+\n+    _targetIconNamesCache[id] = name;\n+}\n+void BotMgr::ResetTargetIconNames()\n+{\n+    _targetIconNamesCache = {};\n+}\n+\n+void BotMgr::ReviveAllBots()\n+{\n+    for (auto const& [_, bot] : _bots)\n+        _reviveBot(bot);\n+}\n+\n+void BotMgr::SendBotCommandState(uint32 state)\n+{\n+    for (auto const& [_, bot] : _bots)\n+        bot->GetBotAI()->SetBotCommandState(state, true);\n+}\n+\n+void BotMgr::SendBotCommandStateRemove(uint32 state)\n+{\n+    for (auto const& [_, bot] : _bots)\n+        bot->GetBotAI()->RemoveBotCommandState(state);\n+}\n+\n+void BotMgr::SendBotAwaitState(uint8 state)\n+{\n+    for (auto const& [_, bot] : _bots)\n+        bot->GetBotAI()->SetBotAwaitState(state);\n+}\n+\n+void BotMgr::RecallAllBots(bool teleport)\n+{\n+    if (teleport)\n+    {\n+        _data->SetFlag(NPCBOT_MGR_FLAG_HIDE_BOTS);\n+        _quickrecall = true;\n+    }\n+    else\n+    {\n+        for (auto const& [_, bot] : _bots)\n+            if (bot->IsInWorld() && bot->IsAlive() && !bot_ai::CCed(bot, true))\n+                bot->GetMotionMaster()->MovePoint(_owner->GetMapId(), *_owner, false);\n+    }\n+}\n+\n+void BotMgr::RecallBot(Creature* bot)\n+{\n+    ASSERT(GetBot(bot->GetGUID()));\n+\n+    if (bot->IsInWorld() && bot->IsAlive() && !bot_ai::CCed(bot, true))\n+        bot->GetMotionMaster()->MovePoint(_owner->GetMapId(), *_owner, false);\n+}\n+\n+void BotMgr::KillAllBots()\n+{\n+    for (auto const& [_, bot] : _bots)\n+        KillBot(bot);\n+}\n+\n+void BotMgr::KillBot(Creature* bot) const\n+{\n+    ASSERT(GetBot(bot->GetGUID()));\n+\n+    if (bot->IsInWorld() && bot->IsAlive())\n+    {\n+        bot->setDeathState(JUST_DIED);\n+        bot->GetBotAI()->JustDied(bot);\n+        //bot->Kill(bot);\n+    }\n+}\n+\n+void BotMgr::SetBotsShouldUpdateStats()\n+{\n+    for (auto const& [_, bot] : _bots)\n+        bot->GetBotAI()->SetShouldUpdateStats();\n+}\n+\n+void BotMgr::UpdatePhaseForBots()\n+{\n+    for (auto const& [_, bot] : _bots)\n+    {\n+        bot->SetPhaseMask(_owner->GetPhaseMask(), bot->IsInWorld());\n+        if (bot->GetBotsPet())\n+            bot->GetBotsPet()->SetPhaseMask(_owner->GetPhaseMask(), bot->GetBotsPet()->IsInWorld());\n+    }\n+}\n+\n+void BotMgr::UpdatePvPForBots()\n+{\n+    for (auto const& [_, bot] : _bots)\n+    {\n+        bot->SetByteValue(UNIT_FIELD_BYTES_2, 1, _owner->GetByteValue(UNIT_FIELD_BYTES_2, 1));\n+        if (bot->GetBotsPet())\n+            bot->GetBotsPet()->SetByteValue(UNIT_FIELD_BYTES_2, 1, _owner->GetByteValue(UNIT_FIELD_BYTES_2, 1));\n+    }\n+}\n+\n+void BotMgr::BuildBotPartyMemberStatsPacket(ObjectGuid bot_guid, WorldPacket* data)\n+{\n+    Creature const* bot = BotDataMgr::FindBot(bot_guid.GetEntry());\n+    if (!bot)\n+    {\n+        *data << uint8(0);\n+        *data << bot_guid.WriteAsPacked();\n+        *data << uint32(GROUP_UPDATE_FLAG_STATUS);\n+        *data << uint16(MEMBER_STATUS_OFFLINE);\n+        return;\n+    }\n+\n+    Creature const* pet = nullptr; //bot->GetBotAI()->GetBotsPet();\n+    Powers powerType = bot->GetPowerType();\n+\n+    *data << uint8(0);                                       // only for SMSG_PARTY_MEMBER_STATS_FULL, probably arena/bg related\n+    *data << bot->GetPackGUID();\n+\n+    uint32 updateFlags = GROUP_UPDATE_FLAG_STATUS | GROUP_UPDATE_FLAG_CUR_HP | GROUP_UPDATE_FLAG_MAX_HP\n+                      | GROUP_UPDATE_FLAG_CUR_POWER | GROUP_UPDATE_FLAG_MAX_POWER | GROUP_UPDATE_FLAG_LEVEL\n+                      | GROUP_UPDATE_FLAG_ZONE | GROUP_UPDATE_FLAG_POSITION | GROUP_UPDATE_FLAG_AURAS\n+                      | GROUP_UPDATE_FLAG_PET_NAME | GROUP_UPDATE_FLAG_PET_MODEL_ID | GROUP_UPDATE_FLAG_PET_AURAS;\n+\n+    if (powerType != POWER_MANA)\n+        updateFlags |= GROUP_UPDATE_FLAG_POWER_TYPE;\n+\n+    if (pet)\n+        updateFlags |= GROUP_UPDATE_FLAG_PET_GUID | GROUP_UPDATE_FLAG_PET_CUR_HP | GROUP_UPDATE_FLAG_PET_MAX_HP\n+                    | GROUP_UPDATE_FLAG_PET_POWER_TYPE | GROUP_UPDATE_FLAG_PET_CUR_POWER | GROUP_UPDATE_FLAG_PET_MAX_POWER;\n+\n+    if (bot->GetVehicle())\n+        updateFlags |= GROUP_UPDATE_FLAG_VEHICLE_SEAT;\n+\n+    uint16 playerStatus = MEMBER_STATUS_ONLINE;\n+    if (bot->IsPvP())\n+        playerStatus |= MEMBER_STATUS_PVP;\n+\n+    if (!bot->IsAlive())\n+        playerStatus |= MEMBER_STATUS_DEAD;\n+\n+    if (bot->IsFFAPvP())\n+        playerStatus |= MEMBER_STATUS_PVP_FFA;\n+\n+    *data << uint32(updateFlags);\n+    *data << uint16(playerStatus);                           // GROUP_UPDATE_FLAG_STATUS\n+    *data << uint32(bot->GetHealth());                    // GROUP_UPDATE_FLAG_CUR_HP\n+    *data << uint32(bot->GetMaxHealth());                 // GROUP_UPDATE_FLAG_MAX_HP\n+    if (updateFlags & GROUP_UPDATE_FLAG_POWER_TYPE)\n+        *data << uint8(powerType);\n+\n+    *data << uint16(bot->GetPower(powerType));            // GROUP_UPDATE_FLAG_CUR_POWER\n+    *data << uint16(bot->GetMaxPower(powerType));         // GROUP_UPDATE_FLAG_MAX_POWER\n+    *data << uint16(bot->GetLevel());                     // GROUP_UPDATE_FLAG_LEVEL\n+    *data << uint16(bot->GetZoneId());                    // GROUP_UPDATE_FLAG_ZONE\n+    *data << uint16(bot->GetPositionX());                 // GROUP_UPDATE_FLAG_POSITION\n+    *data << uint16(bot->GetPositionY());                 // GROUP_UPDATE_FLAG_POSITION\n+\n+    uint64 auraMask = 0;\n+    size_t maskPos = data->wpos();\n+    *data << uint64(auraMask);                               // placeholder\n+    for (auto i : NPCBots::index_array<uint8, MAX_AURAS_GROUP_UPDATE>)\n+    {\n+        if (AuraApplication const* aurApp = bot->GetVisibleAura(i))\n+        {\n+            auraMask |= uint64(1) << i;\n+            *data << uint32(aurApp->GetBase()->GetId());\n+            *data << uint8(aurApp->GetFlags());\n+        }\n+    }\n+\n+    data->put<uint64>(maskPos, auraMask);                    // GROUP_UPDATE_FLAG_AURAS\n+\n+    if (updateFlags & GROUP_UPDATE_FLAG_PET_GUID)\n+        *data << ASSERT_NOTNULL(pet)->GetGUID();\n+\n+    *data << std::string(pet ? pet->GetName() : \"\");         // GROUP_UPDATE_FLAG_PET_NAME\n+    *data << uint16(pet ? pet->GetDisplayId() : 0);          // GROUP_UPDATE_FLAG_PET_MODEL_ID\n+\n+    if (updateFlags & GROUP_UPDATE_FLAG_PET_CUR_HP)\n+        *data << uint32(pet->GetHealth());\n+\n+    if (updateFlags & GROUP_UPDATE_FLAG_PET_MAX_HP)\n+        *data << uint32(pet->GetMaxHealth());\n+\n+    if (updateFlags & GROUP_UPDATE_FLAG_PET_POWER_TYPE)\n+        *data << (uint8)pet->GetPowerType();\n+\n+    if (updateFlags & GROUP_UPDATE_FLAG_PET_CUR_POWER)\n+        *data << uint16(pet->GetPower(pet->GetPowerType()));\n+\n+    if (updateFlags & GROUP_UPDATE_FLAG_PET_MAX_POWER)\n+        *data << uint16(pet->GetMaxPower(pet->GetPowerType()));\n+\n+    uint64 petAuraMask = 0;\n+    maskPos = data->wpos();\n+    *data << uint64(petAuraMask);                            // placeholder\n+    if (pet)\n+    {\n+        for (auto i : NPCBots::index_array<uint8, MAX_AURAS_GROUP_UPDATE>)\n+        {\n+            if (AuraApplication const* aurApp = pet->GetVisibleAura(i))\n+            {\n+                petAuraMask |= uint64(1) << i;\n+                *data << uint32(aurApp->GetBase()->GetId());\n+                *data << uint8(aurApp->GetFlags());\n+            }\n+        }\n+    }\n+\n+    data->put<uint64>(maskPos, petAuraMask);                 // GROUP_UPDATE_FLAG_PET_AURAS\n+\n+    if (updateFlags & GROUP_UPDATE_FLAG_VEHICLE_SEAT)\n+        *data << uint32(bot->GetVehicle()->GetVehicleInfo()->SeatID[bot->m_movementInfo.transport.seat]);\n+}\n+\n+void BotMgr::BuildBotPartyMemberStatsChangedPacket(Creature const* bot, WorldPacket* data)\n+{\n+    uint32 mask = bot->GetBotAI()->GetGroupUpdateFlag();\n+\n+    if (mask == GROUP_UPDATE_FLAG_NONE)\n+        return;\n+\n+    if (mask & GROUP_UPDATE_FLAG_POWER_TYPE)                // if update power type, update current/max power also\n+        mask |= (GROUP_UPDATE_FLAG_CUR_POWER | GROUP_UPDATE_FLAG_MAX_POWER);\n+\n+    if (mask & GROUP_UPDATE_FLAG_PET_POWER_TYPE)            // same for pets\n+        mask |= (GROUP_UPDATE_FLAG_PET_CUR_POWER | GROUP_UPDATE_FLAG_PET_MAX_POWER);\n+\n+    uint32 byteCount = 0;\n+    uint8 flags_count = GROUP_UPDATE_FLAGS_COUNT;\n+    for (uint8 i = 1; i < flags_count; ++i)\n+        if (mask & (1u << i))\n+            byteCount += GroupUpdateLength[i];\n+\n+    data->Initialize(SMSG_PARTY_MEMBER_STATS, size_t(8 + 4 + byteCount));\n+    *data << bot->GetPackGUID();\n+    *data << uint32(mask);\n+\n+    if (mask & GROUP_UPDATE_FLAG_STATUS)\n+    {\n+        uint16 playerStatus = MEMBER_STATUS_ONLINE;\n+        if (bot->IsPvP())\n+            playerStatus |= MEMBER_STATUS_PVP;\n+\n+        if (!bot->IsAlive())\n+            playerStatus |= MEMBER_STATUS_DEAD;\n+\n+        if (bot->IsFFAPvP())\n+            playerStatus |= MEMBER_STATUS_PVP_FFA;\n+\n+        *data << uint16(playerStatus);\n+    }\n+\n+    if (mask & GROUP_UPDATE_FLAG_CUR_HP)\n+        *data << uint32(bot->GetHealth());\n+\n+    if (mask & GROUP_UPDATE_FLAG_MAX_HP)\n+        *data << uint32(bot->GetMaxHealth());\n+\n+    Powers powerType = bot->GetPowerType();\n+    if (mask & GROUP_UPDATE_FLAG_POWER_TYPE)\n+        *data << uint8(powerType);\n+\n+    if (mask & GROUP_UPDATE_FLAG_CUR_POWER)\n+        *data << uint16(bot->GetPower(powerType));\n+\n+    if (mask & GROUP_UPDATE_FLAG_MAX_POWER)\n+        *data << uint16(bot->GetMaxPower(powerType));\n+\n+    if (mask & GROUP_UPDATE_FLAG_LEVEL)\n+        *data << uint16(bot->GetLevel());\n+\n+    if (mask & GROUP_UPDATE_FLAG_ZONE)\n+        *data << uint16(bot->GetZoneId());\n+\n+    if (mask & GROUP_UPDATE_FLAG_POSITION)\n+    {\n+        *data << uint16(bot->GetPositionX());\n+        *data << uint16(bot->GetPositionY());\n+    }\n+\n+    if (mask & GROUP_UPDATE_FLAG_AURAS)\n+    {\n+        uint64 auramask = GetBotAuraUpdateMaskForRaid(bot);\n+        *data << uint64(auramask);\n+        for (auto i : NPCBots::index_array<uint8, MAX_AURAS_GROUP_UPDATE>)\n+        {\n+            if (auramask & (uint64(1) << i))\n+            {\n+                AuraApplication const* aurApp = bot->GetVisibleAura(i);\n+                *data << uint32(aurApp ? aurApp->GetBase()->GetId() : 0);\n+                *data << uint8(1);\n+            }\n+        }\n+    }\n+\n+    Creature const* pet = nullptr; //bot->GetBotAI()->GetBotsPet();\n+    if (mask & GROUP_UPDATE_FLAG_PET_GUID)\n+    {\n+        if (pet)\n+            *data << pet->GetGUID();\n+        else\n+            *data << ObjectGuid::Empty;\n+    }\n+\n+    if (mask & GROUP_UPDATE_FLAG_PET_NAME)\n+    {\n+        if (pet)\n+            *data << pet->GetName();\n+        else\n+            *data << uint8(0);\n+    }\n+\n+    if (mask & GROUP_UPDATE_FLAG_PET_MODEL_ID)\n+    {\n+        if (pet)\n+            *data << uint16(pet->GetDisplayId());\n+        else\n+            *data << uint16(0);\n+    }\n+\n+    if (mask & GROUP_UPDATE_FLAG_PET_CUR_HP)\n+    {\n+        if (pet)\n+            *data << uint32(pet->GetHealth());\n+        else\n+            *data << uint32(0);\n+    }\n+\n+    if (mask & GROUP_UPDATE_FLAG_PET_MAX_HP)\n+    {\n+        if (pet)\n+            *data << uint32(pet->GetMaxHealth());\n+        else\n+            *data << uint32(0);\n+    }\n+\n+    if (mask & GROUP_UPDATE_FLAG_PET_POWER_TYPE)\n+    {\n+        if (pet)\n+            *data << uint8(pet->GetPowerType());\n+        else\n+            *data << uint8(0);\n+    }\n+\n+    if (mask & GROUP_UPDATE_FLAG_PET_CUR_POWER)\n+    {\n+        if (pet)\n+            *data << uint16(pet->GetPower(pet->GetPowerType()));\n+        else\n+            *data << uint16(0);\n+    }\n+\n+    if (mask & GROUP_UPDATE_FLAG_PET_MAX_POWER)\n+    {\n+        if (pet)\n+            *data << uint16(pet->GetMaxPower(pet->GetPowerType()));\n+        else\n+            *data << uint16(0);\n+    }\n+\n+    if (mask & GROUP_UPDATE_FLAG_PET_AURAS)\n+    {\n+        if (pet)\n+        {\n+            uint64 auramask = GetBotPetAuraUpdateMaskForRaid(pet);\n+            *data << uint64(auramask);\n+            for (auto i : NPCBots::index_array<uint8, MAX_AURAS_GROUP_UPDATE>)\n+            {\n+                if (auramask & (uint64(1) << i))\n+                {\n+                    AuraApplication const* aurApp = pet->GetVisibleAura(i);\n+                    *data << uint32(aurApp ? aurApp->GetBase()->GetId() : 0);\n+                    *data << uint8(aurApp ? aurApp->GetFlags() : 0);\n+                }\n+            }\n+        }\n+        else\n+            *data << uint64(0);\n+    }\n+\n+    if (mask & GROUP_UPDATE_FLAG_VEHICLE_SEAT)\n+    {\n+        if (Vehicle* veh = bot->GetVehicle())\n+            *data << uint32(veh->GetVehicleInfo()->SeatID[bot->m_movementInfo.transport.seat]);\n+        else\n+            *data << uint32(0);\n+    }\n+}\n+\n+//uint32 BotMgr::GetBotGroupUpdateFlag(Creature const* bot)\n+//{\n+//    bot->GetBotAI()->GetGroupUpdateFlags\n+//}\n+void BotMgr::SetBotGroupUpdateFlag(Creature const* bot, uint32 flag)\n+{\n+    bot->GetBotAI()->SetGroupUpdateFlag(flag);\n+}\n+uint64 BotMgr::GetBotAuraUpdateMaskForRaid(Creature const* bot)\n+{\n+    return bot->GetBotAI()->GetAuraUpdateMaskForRaid();\n+}\n+void BotMgr::SetBotAuraUpdateMaskForRaid(Creature const* bot, uint8 slot)\n+{\n+    bot->GetBotAI()->SetAuraUpdateMaskForRaid(slot);\n+}\n+void BotMgr::ResetBotAuraUpdateMaskForRaid(Creature const* bot)\n+{\n+    bot->GetBotAI()->ResetAuraUpdateMaskForRaid();\n+}\n+uint64 BotMgr::GetBotPetAuraUpdateMaskForRaid(Creature const* botpet)\n+{\n+    return botpet->GetBotPetAI()->GetAuraUpdateMaskForRaid();\n+}\n+void BotMgr::SetBotPetAuraUpdateMaskForRaid(Creature const* botpet, uint8 slot)\n+{\n+    botpet->GetBotPetAI()->SetAuraUpdateMaskForRaid(slot);\n+}\n+void BotMgr::ResetBotPetAuraUpdateMaskForRaid(Creature const* botpet)\n+{\n+    botpet->GetBotPetAI()->ResetAuraUpdateMaskForRaid();\n+}\n+\n+uint8 BotMgr::GetBotFollowDist() const\n+{\n+    return _data->dist_follow;\n+}\n+void BotMgr::SetBotFollowDist(uint8 dist)\n+{\n+    _data->dist_follow = dist;\n+}\n+\n+void BotMgr::_setBotExactAttackRange(uint8 exactRange)\n+{\n+    _data->dist_attack = exactRange;\n+}\n+\n+uint8 BotMgr::GetBotExactAttackRange() const\n+{\n+    return _data->dist_attack;\n+}\n+uint8 BotMgr::GetBotAttackRangeMode() const\n+{\n+    return _data->attack_range_mode;\n+}\n+void BotMgr::SetBotAttackRangeMode(uint8 mode, uint8 exactRange)\n+{\n+    _data->attack_range_mode = mode; _setBotExactAttackRange(exactRange);\n+}\n+\n+uint8 BotMgr::GetBotAttackAngleMode() const\n+{\n+    return _data->attack_angle_mode;\n+}\n+void BotMgr::SetBotAttackAngleMode(uint8 mode)\n+{\n+    _data->attack_angle_mode = mode;\n+}\n+\n+bool BotMgr::GetBotAllowCombatPositioning() const\n+{\n+    return !_data->HasFlag(NPCBOT_MGR_FLAG_DISABLE_COMBAT_POSITIONING);\n+}\n+void BotMgr::SetBotAllowCombatPositioning(bool allow)\n+{\n+    allow ? _data->RemoveFlag(NPCBOT_MGR_FLAG_DISABLE_COMBAT_POSITIONING) : _data->SetFlag(NPCBOT_MGR_FLAG_DISABLE_COMBAT_POSITIONING);\n+}\n+\n+bool BotMgr::GetBotsHidden() const\n+{\n+    return _data->HasFlag(NPCBOT_MGR_FLAG_HIDE_BOTS);\n+}\n+void BotMgr::SetBotsHidden(bool hidden)\n+{\n+    hidden ? _data->SetFlag(NPCBOT_MGR_FLAG_HIDE_BOTS) : _data->RemoveFlag(NPCBOT_MGR_FLAG_HIDE_BOTS);\n+}\n+\n+uint32 BotMgr::GetEngageDelayDPS() const\n+{\n+    return _data->engage_delay_dps;\n+}\n+uint32 BotMgr::GetEngageDelayHeal() const { return _data->engage_delay_heal;\n+}\n+void BotMgr::SetEngageDelayDPS(uint32 delay)\n+{\n+    _data->engage_delay_dps = delay;\n+}\n+void BotMgr::SetEngageDelayHeal(uint32 delay)\n+{\n+    _data->engage_delay_heal = delay;\n+}\n+\n+void BotMgr::PropagateEngageTimers() const\n+{\n+    uint32 delay_dps = GetEngageDelayDPS();\n+    uint32 delay_heal = GetEngageDelayHeal();\n+\n+    if (!delay_dps && !delay_heal)\n+        return;\n+\n+    for (auto const& [_, bot] : _bots)\n+    {\n+        if (bot->GetBotAI()->IsTank())\n+            continue;\n+\n+        bool is_heal = bot->GetBotAI()->HasRole(BOT_ROLE_HEAL);\n+        bool is_dps= bot->GetBotAI()->HasRole(BOT_ROLE_DPS);\n+        uint32 delay = (is_heal && is_dps) ? std::max<uint32>(delay_dps, delay_heal) : is_heal ? delay_heal : is_dps ? delay_dps : 0;\n+\n+        bot->GetBotAI()->ResetEngageTimer(delay);\n+    }\n+}\n+\n+void BotMgr::TrackDamage(Unit const* u, uint32 damage)\n+{\n+    _dpstracker->TrackDamage(u, damage);\n+}\n+\n+uint32 BotMgr::GetDPSTaken(Unit const* u) const\n+{\n+    return _dpstracker->GetDPSTaken(u->GetGUID());\n+}\n+\n+int32 BotMgr::GetHPSTaken(Unit const* unit) const\n+{\n+    if (!HaveBot())\n+        return 0;\n+\n+    std::list<Unit*> unitList;\n+    Group const* gr = _owner->GetGroup();\n+    if (!gr)\n+    {\n+        if (_owner->HasUnitState(UNIT_STATE_CASTING))\n+            unitList.push_back(_owner);\n+        for (auto const& [_, bot] : _bots)\n+            if (bot->GetTarget() == unit->GetGUID() && bot->HasUnitState(UNIT_STATE_CASTING))\n+                unitList.push_back(bot);\n+    }\n+    else\n+    {\n+        bool Bots = false;\n+        for (GroupReference const* itr = gr->GetFirstMember(); itr != nullptr; itr = itr->next())\n+        {\n+            Player* player = itr->GetSource();\n+            if (player == nullptr) continue;\n+            if (_owner->GetMap() != player->FindMap()) continue;\n+            if (!Bots)\n+                Bots = true;\n+            if (player->HasUnitState(UNIT_STATE_CASTING))\n+                unitList.push_back(player);\n+        }\n+        if (Bots)\n+        {\n+            for (GroupReference const* gitr = gr->GetFirstMember(); gitr != nullptr; gitr = gitr->next())\n+            {\n+                if (gitr->GetSource() == nullptr) continue;\n+                if (_owner->GetMap() != gitr->GetSource()->FindMap()) continue;\n+\n+                if (gitr->GetSource()->HaveBot())\n+                {\n+                    for (auto const& [_, bot] : *gitr->GetSource()->GetBotMgr()->GetBotMap())\n+                        if (bot->GetTarget() == unit->GetGUID() && bot->HasUnitState(UNIT_STATE_CASTING))\n+                            unitList.push_back(bot);\n+                }\n+            }\n+        }\n+    }\n+\n+    int32 amount = 0;\n+    for (Unit* u : unitList)\n+    {\n+        for (uint8 i = CURRENT_FIRST_NON_MELEE_SPELL; i != CURRENT_AUTOREPEAT_SPELL; ++i)\n+        {\n+            Spell const* spell = u->GetCurrentSpell(CurrentSpellTypes(i));\n+            if (!spell)\n+                continue;\n+\n+            ObjectGuid targetGuid = spell->m_targets.GetObjectTargetGUID();\n+            if (!targetGuid || !targetGuid.IsUnit())\n+                continue;\n+\n+            if (targetGuid != unit->GetGUID())\n+            {\n+                if (!gr || !gr->IsMember(unit->GetGUID()))\n+                    continue;\n+            }\n+\n+            SpellInfo const* spellInfo = spell->GetSpellInfo();\n+\n+            for (auto j : NPCBots::index_array<uint8, MAX_SPELL_EFFECTS>)\n+            {\n+                if (spellInfo->_effects[j].Effect != SPELL_EFFECT_HEAL)\n+                    continue;\n+\n+                if (targetGuid != unit->GetGUID())\n+                {\n+                    if (spellInfo->_effects[j].TargetA.GetSelectionCategory() != TARGET_SELECT_CATEGORY_AREA)\n+                        continue;\n+\n+                    //Targets t = spellInfo->_effects[j].TargetA.GetTarget();\n+                    //non-existing case\n+                    //if (t == TARGET_UNIT_CASTER_AREA_PARTY && !gr->SameSubGroup(u->GetGUID(), unit->GetGUID()))\n+                    //    continue;\n+                    Targets t = spellInfo->_effects[j].TargetB.GetTarget();\n+                    if (t == TARGET_UNIT_LASTTARGET_AREA_PARTY &&\n+                        !(GetBot(unit->GetGUID()) && GetBot(targetGuid)) &&\n+                        !gr->SameSubGroup(unit->GetGUID(), targetGuid))\n+                        continue;\n+                }\n+\n+                int32 healing = u->SpellHealingBonusDone(const_cast<Unit*>(unit), spellInfo, spellInfo->_effects[0].CalcValue(u), HEAL, spellInfo->GetEffect(EFFECT_0), {});\n+                healing = unit->SpellHealingBonusTaken(u, spellInfo, healing, HEAL);\n+\n+                if (i == CURRENT_CHANNELED_SPELL)\n+                    amount += int32(healing / (spellInfo->_effects[j].Amplitude * 0.001f));\n+                else\n+                    amount += int32(healing / (std::max<int32>(spell->GetTimer(), 1000) * 0.001f));\n+\n+                //BOT_LOG_ERROR(\"entities.player\", \"BotMgr:pendingHeals: found {}'s {} on {} in {} ({}, total {})\",\n+                //    u->GetName(), spellInfo->SpellName[0], target->GetName(), pheal->delay, healing, pheal->amount);\n+            }\n+\n+            break;\n+        }\n+    }\n+\n+    //HoTs\n+    for (AuraEffect const* aeff : unit->GetAuraEffectsByType(SPELL_AURA_PERIODIC_HEAL))\n+        amount += int32(aeff->GetAmount() / (aeff->GetPeriod() * 0.001f));\n+\n+    //if (amount != 0)\n+    //    BOT_LOG_ERROR(\"entities.player\", \"BotMgr:GetHPSTaken(): {} got {})\", unit->GetName(), amount);\n+\n+    return amount;\n+}\n+\n+void BotMgr::OnBotWandererKilled(Creature const* bot, Player* looter)\n+{\n+    bot->GetBotAI()->SpawnKillReward(looter);\n+}\n+\n+void BotMgr::OnBotWandererKilled(GameObject* go)\n+{\n+    if (go->GetEntry() == GO_BOT_MONEY_BAG && go->GetSpellId() > go->GetEntry())\n+    {\n+        uint32 bot_id = go->GetSpellId() - GO_BOT_MONEY_BAG;\n+        if (Creature const* bot = BotDataMgr::FindBot(bot_id))\n+            bot->GetBotAI()->FillKillReward(go);\n+    }\n+}\n+\n+void BotMgr::OnBotKilled(Creature const* bot, Unit* attacker/* = nullptr*/)\n+{\n+    bot->GetBotAI()->OnDeath(attacker);\n+}\n+\n+void BotMgr::OnBotSpellInterrupt(Unit const* caster, CurrentSpellTypes spellType)\n+{\n+    if (spellType == CURRENT_AUTOREPEAT_SPELL)\n+    {\n+        WorldPackets::Combat::CancelAutoRepeat cancelAutoRepeat;\n+        cancelAutoRepeat.Guid = caster->GetPackGUID();\n+        caster->SendMessageToSet(cancelAutoRepeat.Write(), true);\n+    }\n+}\n+\n+void BotMgr::OnBotSpellGo(Unit const* caster, Spell const* spell, bool ok)\n+{\n+    if (caster->ToCreature()->GetBotAI())\n+        caster->ToCreature()->GetBotAI()->OnBotSpellGo(spell, ok);\n+    else if (caster->ToCreature()->GetBotPetAI())\n+        caster->ToCreature()->GetBotPetAI()->OnBotPetSpellGo(spell, ok);\n+}\n+\n+void BotMgr::OnBotOwnerSpellGo(Unit const* caster, Spell const* spell, bool ok)\n+{\n+    for (auto const& [_, bot] : *caster->ToPlayer()->GetBotMgr()->GetBotMap())\n+    {\n+        if (!bot || !bot->IsInWorld() || !bot->IsAlive())\n+            continue;\n+\n+        bot->GetBotAI()->OnBotOwnerSpellGo(spell, ok);\n+        //if (Creature const* botpet = bot->GetBotsPet())\n+        //    botpet->GetBotAI()->OnBotPetOwnerSpellGo(spell, ok);\n+    }\n+}\n+\n+void BotMgr::OnBotChannelFinish(Unit const* caster, Spell const* spell)\n+{\n+    if (caster->ToCreature()->GetBotAI())\n+        caster->ToCreature()->GetBotAI()->OnBotChannelFinish(spell);\n+    //else if (caster->ToCreature()->GetBotPetAI())\n+    //    caster->ToCreature()->GetBotPetAI()->OnBotPetChannelFinish(spell);\n+}\n+\n+void BotMgr::OnVehicleSpellGo(Unit const* caster, Spell const* spell, bool ok)\n+{\n+    if (caster->GetCharmerGUID().IsPlayer())\n+    {\n+        Unit const* owner = caster->GetCharmer();\n+        if (owner && owner->ToPlayer()->HaveBot())\n+        {\n+            for (auto const& [_, bot] : *owner->ToPlayer()->GetBotMgr()->GetBotMap())\n+            {\n+                if (bot)\n+                {\n+                    bot->GetBotAI()->OnBotOwnerSpellGo(spell, ok);\n+                    //if (Creature const* botpet = bot->GetBotsPet())\n+                    //    botpet->GetBotAI()->OnBotPetOwnerSpellGo(spell, ok);\n+                }\n+            }\n+        }\n+    }\n+    else if (caster->GetCharmerGUID().IsCreature())\n+    {\n+        Unit const* bot = caster->GetCharmer();\n+        if (bot->ToCreature()->GetBotAI())\n+            bot->ToCreature()->GetBotAI()->OnBotSpellGo(spell, ok);\n+    }\n+}\n+\n+void BotMgr::OnVehicleAttackedBy(Unit* attacker, Unit const* victim)\n+{\n+    Unit const* owner = victim->GetCharmer();\n+    if (victim->GetCharmerGUID().IsPlayer())\n+        owner = victim->GetCharmer();\n+    else if (victim->GetCharmerGUID().IsCreature())\n+        if (Unit const* bot = victim->GetCharmer())\n+            owner = bot->ToCreature()->GetBotOwner();\n+\n+    if (owner && owner->IsPlayer() && owner->ToPlayer()->HaveBot())\n+    {\n+        for (auto const& [_, bot] : *owner->ToPlayer()->GetBotMgr()->GetBotMap())\n+            if (bot)\n+                bot->GetBotAI()->OnOwnerVehicleDamagedBy(attacker);\n+    }\n+}\n+\n+void BotMgr::OnBotDamageTaken(Unit* attacker, Unit* victim, uint32 damage, CleanDamage const* cleanDamage, DamageEffectType damagetype, SpellInfo const* spellInfo)\n+{\n+    victim->ToCreature()->GetBotAI()->OnBotDamageTaken(attacker, damage, cleanDamage , damagetype, spellInfo);\n+}\n+\n+void BotMgr::OnBotDamageDealt(Unit* attacker, Unit* victim, uint32 damage, CleanDamage const* cleanDamage, DamageEffectType damagetype, SpellInfo const* spellInfo)\n+{\n+    attacker->ToCreature()->GetBotAI()->OnBotDamageDealt(victim, damage, cleanDamage, damagetype, spellInfo);\n+}\n+\n+void BotMgr::OnBotDispelDealt(Unit* dispeller, Unit* dispelled, uint8 num)\n+{\n+    dispeller->ToCreature()->GetBotAI()->OnBotDispelDealt(dispelled, num);\n+}\n+\n+void BotMgr::OnBotEnterVehicle(Creature const* passenger, Vehicle const* vehicle)\n+{\n+    passenger->GetBotAI()->OnBotEnterVehicle(vehicle);\n+}\n+\n+void BotMgr::OnBotExitVehicle(Creature const* passenger, Vehicle const* vehicle)\n+{\n+    passenger->GetBotAI()->OnBotExitVehicle(vehicle);\n+}\n+\n+void BotMgr::OnBotOwnerEnterVehicle(Player const* passenger, Vehicle const* vehicle)\n+{\n+    for (auto const& [_, bot] : *passenger->GetBotMgr()->GetBotMap())\n+        if (bot && bot->IsInWorld() && bot->IsAlive())\n+            bot->GetBotAI()->OnBotOwnerEnterVehicle(vehicle);\n+}\n+\n+void BotMgr::OnBotOwnerExitVehicle(Player const* passenger, Vehicle const* vehicle)\n+{\n+    for (auto const& [_, bot] : *passenger->GetBotMgr()->GetBotMap())\n+        if (bot && bot->IsInWorld() && bot->IsAlive())\n+            bot->GetBotAI()->OnBotOwnerExitVehicle(vehicle);\n+}\n+\n+void BotMgr::OnBotPartyEngage(Player const* owner)\n+{\n+    Group const* gr = owner->GetGroup();\n+    if (gr)\n+    {\n+        std::vector<Player const*> affectedPlayers;\n+        for (GroupReference const* itr = gr->GetFirstMember(); itr != nullptr; itr = itr->next())\n+        {\n+            Player const* player = itr->GetSource();\n+            if (!player || owner->GetMap() != player->FindMap() ||\n+                player->GetDistance(owner) > sWorld->GetMaxVisibleDistanceOnContinents() ||\n+                !player->HaveBot())\n+                continue;\n+\n+            if (player->GetBotMgr()->IsPartyInCombat(false))\n+                return;\n+\n+            affectedPlayers.push_back(player);\n+        }\n+        for (Player const* p : affectedPlayers)\n+            p->GetBotMgr()->PropagateEngageTimers();\n+    }\n+    else\n+        owner->GetBotMgr()->PropagateEngageTimers();\n+}\n+\n+void BotMgr::OnBotAttackStop(Creature const* bot, Unit const* target)\n+{\n+    if (bot->IsNPCBot())\n+        bot->GetBotAI()->OnAttackStop(target);\n+    else if (bot->IsNPCBotPet())\n+        bot->GetBotPetAI()->OnAttackStop(target);\n+}\n+\n+void BotMgr::ApplyBotEffectMods(Unit const* caster, SpellInfo const* spellInfo, uint8 effIndex, float& value)\n+{\n+    caster->ToCreature()->GetBotAI()->ApplyBotEffectMods(spellInfo, effIndex, value);\n+}\n+\n+void BotMgr::ApplyBotThreatMods(Unit const* attacker, SpellInfo const* spellInfo, float& threat)\n+{\n+    attacker->ToCreature()->GetBotAI()->ApplyBotThreatMods(spellInfo, threat);\n+}\n+\n+void BotMgr::ApplyBotEffectValueMultiplierMods(Unit const* caster, SpellInfo const* spellInfo, SpellEffIndex effIndex, float& multiplier)\n+{\n+    caster->ToCreature()->GetBotAI()->ApplyBotEffectValueMultiplierMods(spellInfo, effIndex, multiplier);\n+}\n+\n+float BotMgr::GetBotDamageTakenMod(Creature const* bot, bool magic)\n+{\n+    return bot->GetBotAI()->GetBotDamageTakenMod(magic);\n+}\n+\n+int32 BotMgr::GetBotStat(Creature const* bot, BotStatMods stat)\n+{\n+    return bot->GetBotAI()->GetTotalBotStat(stat);\n+}\n+\n+int32 BotMgr::GetBotStat(Creature const* bot, Stats stat)\n+{\n+    return GetBotStat(bot, GetBotStatModByUnitStat(stat));\n+}\n+\n+float BotMgr::GetBotResilience(Creature const* botOrPet)\n+{\n+    if (botOrPet->IsNPCBot())\n+        return botOrPet->GetBotAI()->GetBotResilience();\n+\n+    return botOrPet->GetBotPetAI()->GetPetsOwner()->GetBotAI()->GetBotResilience();\n+}\n+\n+std::vector<Unit*> BotMgr::GetAllGroupMembers(Group const* group)\n+{\n+    std::vector<Unit*> group_members;\n+    if (group)\n+    {\n+        group_members.reserve(group->GetMembersCount());\n+        for (GroupReference const* ref = group->GetFirstMember(); ref != nullptr; ref = ref->next())\n+        {\n+            if (Player* pl = ref->GetSource())\n+                group_members.push_back(pl);\n+        }\n+        for (GroupBotReference const* ref = group->GetFirstBotMember(); ref != nullptr; ref = ref->next())\n+        {\n+            if (Creature* cr = ref->GetSource())\n+                group_members.push_back(cr);\n+        }\n+    }\n+\n+    return group_members;\n+}\n+std::vector<Unit*> BotMgr::GetAllGroupMembers(Unit const* source)\n+{\n+    Group const* group = (source->IsNPCBot() && source->ToCreature()->GetBotAI()) ? source->ToCreature()->GetBotAI()->GetGroup() :\n+        source->IsPlayer() ? source->ToPlayer()->GetGroup() : nullptr;\n+    return GetAllGroupMembers(group);\n+}\n+\n+void BotMgr::InviteBotToBG(ObjectGuid botguid, GroupQueueInfo* ginfo, Battleground* bg)\n+{\n+    Creature const* bot = BotDataMgr::FindBot(botguid.GetEntry());\n+    ASSERT(bot);\n+\n+    bg->IncreaseInvitedCount(ginfo->Team);\n+    //BOT_LOG_INFO(\"npcbots\", \"Battleground: invited NPCBot {} to BG instance {} bgtype {} '{}'\",\n+    //    botguid.GetEntry(), bg->GetInstanceID(), bg->GetTypeID(), bg->GetName());\n+}\n+\n+bool BotMgr::IsBotInAreaTriggerRadius(Creature const* bot, AreaTriggerEntry const* trigger)\n+{\n+    if (!trigger || !bot->IsInWorld() || bot->GetMap()->GetId() != trigger->ContinentID)\n+        return false;\n+\n+    if (trigger->Radius > 0.f)\n+    {\n+        // if we have radius check it\n+        float dist = bot->GetDistance(trigger->Pos.X, trigger->Pos.Y, trigger->Pos.Z);\n+        if (dist > trigger->Radius)\n+            return false;\n+    }\n+    else\n+    {\n+        Position center(trigger->Pos.X, trigger->Pos.Y, trigger->Pos.Z, trigger->BoxYaw);\n+        if (!bot->IsWithinBox(center, trigger->BoxLength / 2.f, trigger->BoxWidth / 2.f, trigger->BoxHeight / 2.f))\n+            return false;\n+    }\n+\n+    return true;\n+}\n+\n+BotMgr::delayed_teleport_mutex_type* BotMgr::_getTpLock()\n+{\n+    static BotMgr::delayed_teleport_mutex_type _lock;\n+    return &_lock;\n+}\n+void BotMgr::AddDelayedTeleportCallback(delayed_teleport_callback_type&& callback)\n+{\n+    delayed_teleport_lock_type lock(*_getTpLock());\n+    delayed_bot_teleports.push_back(std::forward<delayed_teleport_callback_type>(callback));\n+}\n+void BotMgr::HandleDelayedTeleports()\n+{\n+    for (auto& func : delayed_bot_teleports)\n+        func();\n+    delayed_bot_teleports.clear();\n+}\n+\n+#ifdef _MSC_VER\n+# pragma warning(pop)\n+#endif\ndiff --git a/src/server/game/AI/NpcBots/botmgr.h b/src/server/game/AI/NpcBots/botmgr.h\nnew file mode 100644\nindex 0000000000..be7b43a977\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/botmgr.h\n@@ -0,0 +1,291 @@\n+#ifndef BOTMGR_H\n+#define BOTMGR_H\n+\n+#include \"botcommon.h\"\n+\n+#include <functional>\n+#include <mutex>\n+#include <string_view>\n+\n+class bot_ai;\n+class Battleground;\n+class Creature;\n+class GameObject;\n+class Group;\n+class Map;\n+class Player;\n+class Spell;\n+class SpellInfo;\n+class Unit;\n+class Vehicle;\n+class WorldLocation;\n+class WorldObject;\n+class WorldPacket;\n+\n+class DPSTracker;\n+\n+struct AreaTriggerEntry;\n+struct CleanDamage;\n+struct GroupQueueInfo;\n+struct NpcBotMgrData;\n+struct Position;\n+\n+enum BattlegroundTypeId : uint32;\n+enum CurrentSpellTypes : uint8;\n+enum DamageEffectType : uint8;\n+\n+inline constexpr std::size_t TARGET_ICON_NAMES_CACHE_SIZE = 8u; // Group.h TARGETICONCOUNT\n+\n+enum BotMgrDataFlags : uint32\n+{\n+    NPCBOT_MGR_FLAG_HIDE_BOTS                  = 0x00000001,\n+    NPCBOT_MGR_FLAG_DISABLE_COMBAT_POSITIONING = 0x00000002,\n+\n+    NPCBOT_MGR_FLAG_MASK_ALL_ALLOWED           = (NPCBOT_MGR_FLAG_HIDE_BOTS | NPCBOT_MGR_FLAG_DISABLE_COMBAT_POSITIONING),\n+    NPCBOT_MGR_FLAG_MASK_ALL_DB_ALLOWED        = (NPCBOT_MGR_FLAG_DISABLE_COMBAT_POSITIONING)\n+};\n+\n+enum BotAddResult\n+{\n+    BOT_ADD_DISABLED                    = 0x001,\n+    BOT_ADD_ALREADY_HAVE                = 0x002,\n+    BOT_ADD_MAX_EXCEED                  = 0x004,\n+    BOT_ADD_MAX_CLASS_EXCEED            = 0x008,\n+    BOT_ADD_CANT_AFFORD                 = 0x010,\n+    BOT_ADD_INSTANCE_LIMIT              = 0x020,\n+    BOT_ADD_BUSY                        = 0x040, // unused\n+    BOT_ADD_NOT_AVAILABLE               = 0x080,\n+\n+    BOT_ADD_SUCCESS                     = 0x100,\n+\n+    BOT_ADD_FATAL                       = (BOT_ADD_DISABLED | BOT_ADD_CANT_AFFORD | BOT_ADD_MAX_EXCEED | BOT_ADD_MAX_CLASS_EXCEED)\n+};\n+\n+enum BotRemoveType\n+{\n+    BOT_REMOVE_LOGOUT                   = 0,\n+    BOT_REMOVE_DISMISS                  = 1,\n+    BOT_REMOVE_UNSUMMON                 = 2,\n+    BOT_REMOVE_UNBIND                   = 3,\n+    BOT_REMOVE_UNAFFORD                 = 4,\n+    BOT_REMOVE_BY_DEFAULT               = BOT_REMOVE_LOGOUT\n+};\n+\n+enum BotOwnershipExpireMode\n+{\n+    BOT_OWNERSHIP_EXPIRE_OFFLINE        = 0,\n+    BOT_OWNERSHIP_EXPIRE_HIRE           = 1\n+};\n+\n+enum BotAttackRange\n+{\n+    BOT_ATTACK_RANGE_SHORT              = 1,\n+    BOT_ATTACK_RANGE_LONG               = 2,\n+    BOT_ATTACK_RANGE_EXACT              = 3,\n+\n+    BOT_ATTACK_RANGE_END                = BOT_ATTACK_RANGE_EXACT\n+};\n+\n+enum BotAttackAngle\n+{\n+    BOT_ATTACK_ANGLE_NORMAL             = 1,\n+    BOT_ATTACK_ANGLE_AVOID_FRONTAL_AOE  = 2,\n+\n+    BOT_ATTACK_ANGLE_END                = BOT_ATTACK_ANGLE_AVOID_FRONTAL_AOE\n+};\n+\n+using BotMap = std::unordered_map<ObjectGuid /*guid*/, Creature* /*bot*/>;\n+\n+class TC_GAME_API BotMgr\n+{\n+public:\n+    using delayed_teleport_callback_type = std::function<void(void)>;\n+    using delayed_teleport_mutex_type = std::mutex;\n+    using delayed_teleport_lock_type = std::unique_lock<delayed_teleport_mutex_type>;\n+\n+    explicit BotMgr(Player* const master);\n+    ~BotMgr();\n+    BotMgr(BotMgr const&) = delete;\n+    BotMgr(BotMgr&&) = delete;\n+    BotMgr& operator=(BotMgr const&) = delete;\n+    BotMgr& operator=(BotMgr&&) = delete;\n+\n+    Player* GetOwner() const { return _owner; }\n+\n+    BotMap const* GetBotMap() const { return &_bots; }\n+    BotMap* GetBotMap() { return &_bots; }\n+\n+    static void Initialize();\n+\n+    //onEvent hooks\n+    static void OnBotWandererKilled(Creature const* bot, Player* looter);\n+    static void OnBotWandererKilled(GameObject* go);\n+    static void OnBotKilled(Creature const* bot, Unit* attacker = nullptr);\n+    static void OnBotSpellInterrupt(Unit const* caster, CurrentSpellTypes spellType);\n+    static void OnBotSpellGo(Unit const* caster, Spell const* spell, bool ok = true);\n+    static void OnBotOwnerSpellGo(Unit const* caster, Spell const* spell, bool ok = true);\n+    static void OnBotChannelFinish(Unit const* caster, Spell const* spell);\n+    static void OnVehicleSpellGo(Unit const* caster, Spell const* spell, bool ok = true);\n+    static void OnVehicleAttackedBy(Unit* attacker, Unit const* victim);\n+    static void OnBotDamageTaken(Unit* attacker, Unit* victim, uint32 damage, CleanDamage const* cleanDamage, DamageEffectType damagetype, SpellInfo const* spellInfo);\n+    static void OnBotDamageDealt(Unit* attacker, Unit* victim, uint32 damage, CleanDamage const* cleanDamage, DamageEffectType damagetype, SpellInfo const* spellInfo);\n+    static void OnBotDispelDealt(Unit* dispeller, Unit* dispelled, uint8 num);\n+    static void OnBotEnterVehicle(Creature const* passenger, Vehicle const* vehicle);\n+    static void OnBotExitVehicle(Creature const* passenger, Vehicle const* vehicle);\n+    static void OnBotOwnerEnterVehicle(Player const* passenger, Vehicle const* vehicle);\n+    static void OnBotOwnerExitVehicle(Player const* passenger, Vehicle const* vehicle);\n+    static void OnBotPartyEngage(Player const* owner);\n+    static void OnBotAttackStop(Creature const* bot, Unit const* target);\n+    //mod hooks\n+    static void ApplyBotEffectMods(Unit const* caster, SpellInfo const* spellInfo, uint8 effIndex, float& value);\n+    static void ApplyBotThreatMods(Unit const* attacker, SpellInfo const* spellInfo, float& threat);\n+    static void ApplyBotEffectValueMultiplierMods(Unit const* caster, SpellInfo const* spellInfo, SpellEffIndex effIndex, float& multiplier);\n+    static float GetBotDamageTakenMod(Creature const* bot, bool magic);\n+    static int32 GetBotStat(Creature const* bot, BotStatMods stat);\n+    static int32 GetBotStat(Creature const* bot, Stats stat);\n+    static float GetBotResilience(Creature const* botOrPet);\n+\n+    void LoadData();\n+\n+    void Update(uint32 diff);\n+\n+    Creature* GetBot(ObjectGuid guid) const;\n+    Creature* GetBotByName(std::string_view name) const;\n+    std::vector<Creature*> GetAllBotsByClass(uint8 botclass) const;\n+\n+    bool HaveBot() const { return !_bots.empty(); }\n+    uint8 GetNpcBotsCount() const;\n+    uint8 GetNpcBotsCountByRole(uint32 roles) const;\n+    uint8 GetNpcBotsCountByVehicleEntry(uint32 creEntry) const;\n+    uint8 GetNpcBotSlot(Creature const* bot) const;\n+    uint8 GetNpcBotSlotByRole(uint32 roles, Creature const* bot) const;\n+    uint32 GetAllNpcBotsClassMask() const;\n+    static bool LimitBots(Map const* map);\n+    static bool CanBotParryWhileCasting(Creature const* bot);\n+    static bool IsWanderingWorldBot(Creature const* bot);\n+    static bool IsBotContestedPvP(Creature const* bot);\n+    static void SetBotContestedPvP(Creature const* bot);\n+    bool RestrictBots(Creature const* bot, bool add) const;\n+    bool IsPartyInCombat(bool is_pvp) const;\n+    bool HasBotClass(uint8 botclass) const;\n+    bool HasBotWithSpec(uint8 spec, bool alive = true) const;\n+    bool HasBotPetType(uint32 petType) const;\n+    bool IsBeingResurrected(WorldObject const* corpse) const;\n+\n+    static uint8 BotClassByClassName(std::string_view className);\n+    static uint8 GetBotPlayerClass(uint8 bot_class);\n+    static uint8 GetBotPlayerRace(uint8 bot_class, uint8 bot_race);\n+    static uint8 GetBotPlayerClass(Creature const* bot);\n+    static uint8 GetBotPlayerRace(Creature const* bot);\n+    static uint8 GetBotEquipmentClass(uint8 bot_class);\n+    static BotStatMods GetBotStatModByUnitStat(Stats stat);\n+\n+    std::string GetTargetIconString(uint8 icon_idx) const;\n+\n+    void OnTeleportFar(uint32 mapId, float x, float y, float z, float ori = 0.f);\n+    void OnOwnerSetGameMaster(bool on);\n+    void ReviveAllBots();\n+    void SendBotCommandState(uint32 state);\n+    void SendBotCommandStateRemove(uint32 state);\n+    void SendBotAwaitState(uint8 state);\n+    void RecallAllBots(bool teleport = false);\n+    void RecallBot(Creature* bot);\n+    void KillAllBots();\n+    void KillBot(Creature* bot) const;\n+\n+    void CleanupsBeforeBotDelete(ObjectGuid guid, uint8 removetype = BOT_REMOVE_LOGOUT);\n+    static void CleanupsBeforeBotDelete(Creature* bot);\n+    void RemoveAllBots(uint8 removetype = BOT_REMOVE_LOGOUT);\n+    void RemoveBot(ObjectGuid guid, uint8 removetype = BOT_REMOVE_LOGOUT);\n+    void UnbindBot(ObjectGuid guid);\n+    [[nodiscard]] BotAddResult RebindBot(Creature* bot);\n+    [[nodiscard]] BotAddResult AddBot(Creature* bot);\n+    bool AddBotToGroup(Creature* bot);\n+    void RemoveBotFromBGQueue(Creature const* bot);\n+    bool RemoveBotFromGroup(Creature* bot);\n+    bool RemoveAllBotsFromGroup();\n+\n+    static uint8 GetBotFollowDistMax() { return 100; }\n+    uint8 GetBotFollowDist() const;\n+    void SetBotFollowDist(uint8 dist);\n+\n+    uint8 GetBotExactAttackRange() const;\n+    uint8 GetBotAttackRangeMode() const;\n+    void SetBotAttackRangeMode(uint8 mode, uint8 exactRange = 0);\n+\n+    uint8 GetBotAttackAngleMode() const;\n+    void SetBotAttackAngleMode(uint8 mode);\n+\n+    bool GetBotAllowCombatPositioning() const;\n+    void SetBotAllowCombatPositioning(bool allow);\n+\n+    bool GetBotsHidden() const;\n+    void SetBotsHidden(bool hidden);\n+\n+    uint32 GetEngageDelayDPS() const;\n+    uint32 GetEngageDelayHeal() const;\n+    void SetEngageDelayDPS(uint32 delay);\n+    void SetEngageDelayHeal(uint32 delay);\n+    void PropagateEngageTimers() const;\n+\n+    void SetBotsShouldUpdateStats();\n+    void UpdatePhaseForBots();\n+    void UpdatePvPForBots();\n+\n+    static void BuildBotPartyMemberStatsPacket(ObjectGuid bot_guid, WorldPacket* data);\n+    static void BuildBotPartyMemberStatsChangedPacket(Creature const* bot, WorldPacket* data);\n+    //static uint32 GetBotGroupUpdateFlag(Creature const* bot);\n+    static void SetBotGroupUpdateFlag(Creature const* bot, uint32 flag);\n+    static uint64 GetBotAuraUpdateMaskForRaid(Creature const* bot);\n+    static void SetBotAuraUpdateMaskForRaid(Creature const* bot, uint8 slot);\n+    static void ResetBotAuraUpdateMaskForRaid(Creature const* bot);\n+    static uint64 GetBotPetAuraUpdateMaskForRaid(Creature const* botpet);\n+    static void SetBotPetAuraUpdateMaskForRaid(Creature const* botpet, uint8 slot);\n+    static void ResetBotPetAuraUpdateMaskForRaid(Creature const* botpet);\n+\n+    void TrackDamage(Unit const* u, uint32 damage);\n+    uint32 GetDPSTaken(Unit const* u) const;\n+    int32 GetHPSTaken(Unit const* unit) const;\n+\n+    static void ReviveBot(Creature* bot, WorldLocation* dest = nullptr) { _reviveBot(bot, dest); }\n+\n+    //TELEPORT BETWEEN MAPS\n+    //CONFIRMEND UNSAFE (charmer,owner)\n+    static void TeleportBot(Creature* bot, Map* newMap, Position const* pos, bool quick = false, bool reset = false, bot_ai* detached_ai = nullptr);\n+\n+    AoeSpotsVec const& GetAoeSpots() const { return _aoespots; }\n+    AoeSpotsVec& GetAoeSpots() { return _aoespots; }\n+\n+    void UpdateTargetIconName(uint8 id, std::string_view name);\n+    void ResetTargetIconNames();\n+\n+    static std::vector<Unit*> GetAllGroupMembers(Group const* group);\n+    static std::vector<Unit*> GetAllGroupMembers(Unit const* source);\n+    static void InviteBotToBG(ObjectGuid botguid, GroupQueueInfo* ginfo, Battleground* bg);\n+\n+    static bool IsBotInAreaTriggerRadius(Creature const* bot, AreaTriggerEntry const* trigger);\n+\n+    static void AddDelayedTeleportCallback(delayed_teleport_callback_type&& callback);\n+    static void HandleDelayedTeleports();\n+\n+private:\n+    static void _teleportBot(Creature* bot, Map* newMap, float x, float y, float z, float ori, bool quick, bool reset, bot_ai* detached_ai);\n+    static void _reviveBot(Creature* bot, WorldLocation* dest = nullptr);\n+    void _setBotExactAttackRange(uint8 exactRange);\n+    static delayed_teleport_mutex_type* _getTpLock();\n+\n+    Player* const _owner;\n+    BotMap _bots;\n+    std::list<std::pair<ObjectGuid, BotRemoveType>> _delayedRemoveList;\n+    DPSTracker* const _dpstracker;\n+    NpcBotMgrData* _data;\n+\n+    bool _quickrecall;\n+    bool _update_lock;\n+\n+    AoeSpotsVec _aoespots;\n+\n+    std::array<std::string_view, TARGET_ICON_NAMES_CACHE_SIZE> _targetIconNamesCache;\n+};\n+\n+#endif\ndiff --git a/src/server/game/AI/NpcBots/botspell.cpp b/src/server/game/AI/NpcBots/botspell.cpp\nnew file mode 100644\nindex 0000000000..844e9192d4\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/botspell.cpp\n@@ -0,0 +1,2096 @@\n+#include \"botdefine.h\"\n+#include \"botspell.h\"\n+#include \"DBCStores.h\"\n+#include \"Log.h\"\n+#include \"SpellInfo.h\"\n+#include \"SpellMgr.h\"\n+#include \"Timer.h\"\n+\n+#include <unordered_map>\n+\n+using SpellInfoOverridesMap = std::unordered_map<uint32, SpellInfo>;\n+using SpellProcOverridesMap = std::unordered_map<uint32, SpellProcEntry>;\n+static SpellInfoOverridesMap botSpellInfoOverrides;\n+static SpellProcOverridesMap botSpellProcOverrides;\n+\n+void GenerateBotCustomSpellProcs()\n+{\n+    botSpellProcOverrides.clear();\n+\n+    bool isTriggerAura[TOTAL_AURAS];\n+    bool isAlwaysTriggeredAura[TOTAL_AURAS];\n+    uint32 spellTypeMask[TOTAL_AURAS];\n+    for (uint16 i = 0; i < TOTAL_AURAS; ++i)\n+    {\n+        isTriggerAura[i] = false;\n+        isAlwaysTriggeredAura[i] = false;\n+        spellTypeMask[i] = PROC_SPELL_TYPE_MASK_ALL;\n+    }\n+\n+    isTriggerAura[SPELL_AURA_DUMMY] = true;                                 // Most dummy auras should require scripting, but there are some exceptions (ie 12311)\n+    isTriggerAura[SPELL_AURA_MOD_CONFUSE] = true;                           // \"Any direct damaging attack will revive targets\"\n+    isTriggerAura[SPELL_AURA_MOD_THREAT] = true;                            // Only one spell: 28762 part of Mage T3 8p bonus\n+    isTriggerAura[SPELL_AURA_MOD_STUN] = true;                              // Aura does not have charges but needs to be removed on trigger\n+    isTriggerAura[SPELL_AURA_MOD_DAMAGE_DONE] = true;\n+    isTriggerAura[SPELL_AURA_MOD_DAMAGE_TAKEN] = true;\n+    isTriggerAura[SPELL_AURA_MOD_RESISTANCE] = true;\n+    isTriggerAura[SPELL_AURA_MOD_STEALTH] = true;\n+    isTriggerAura[SPELL_AURA_MOD_FEAR] = true;                              // Aura does not have charges but needs to be removed on trigger\n+    isTriggerAura[SPELL_AURA_MOD_ROOT] = true;\n+    isTriggerAura[SPELL_AURA_TRANSFORM] = true;\n+    isTriggerAura[SPELL_AURA_REFLECT_SPELLS] = true;\n+    isTriggerAura[SPELL_AURA_DAMAGE_IMMUNITY] = true;\n+    isTriggerAura[SPELL_AURA_PROC_TRIGGER_SPELL] = true;\n+    isTriggerAura[SPELL_AURA_PROC_TRIGGER_DAMAGE] = true;\n+    isTriggerAura[SPELL_AURA_MOD_CASTING_SPEED_NOT_STACK] = true;\n+    isTriggerAura[SPELL_AURA_MOD_POWER_COST_SCHOOL_PCT] = true;\n+    isTriggerAura[SPELL_AURA_MOD_POWER_COST_SCHOOL] = true;\n+    isTriggerAura[SPELL_AURA_REFLECT_SPELLS_SCHOOL] = true;\n+    isTriggerAura[SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN] = true;\n+    isTriggerAura[SPELL_AURA_MOD_ATTACK_POWER] = true;\n+    isTriggerAura[SPELL_AURA_ADD_CASTER_HIT_TRIGGER] = true;\n+    isTriggerAura[SPELL_AURA_OVERRIDE_CLASS_SCRIPTS] = true;\n+    isTriggerAura[SPELL_AURA_MOD_MELEE_HASTE] = true;\n+    isTriggerAura[SPELL_AURA_MOD_ATTACKER_MELEE_HIT_CHANCE] = true;\n+    isTriggerAura[SPELL_AURA_RAID_PROC_FROM_CHARGE] = true;\n+    isTriggerAura[SPELL_AURA_RAID_PROC_FROM_CHARGE_WITH_VALUE] = true;\n+    isTriggerAura[SPELL_AURA_PROC_TRIGGER_SPELL_WITH_VALUE] = true;\n+    isTriggerAura[SPELL_AURA_MOD_SPELL_CRIT_CHANCE] = true;\n+    isTriggerAura[SPELL_AURA_ADD_FLAT_MODIFIER] = true;\n+    isTriggerAura[SPELL_AURA_ADD_PCT_MODIFIER] = true;\n+    isTriggerAura[SPELL_AURA_ABILITY_IGNORE_AURASTATE] = true;\n+    isTriggerAura[SPELL_AURA_MOD_INVISIBILITY] = true;\n+    isTriggerAura[SPELL_AURA_FORCE_REACTION] = true;\n+    isTriggerAura[SPELL_AURA_MOD_TAUNT] = true;\n+    isTriggerAura[SPELL_AURA_MOD_DETAUNT] = true;\n+    isTriggerAura[SPELL_AURA_MOD_DAMAGE_PERCENT_DONE] = true;\n+    isTriggerAura[SPELL_AURA_MOD_ATTACK_POWER_PCT] = true;\n+    isTriggerAura[SPELL_AURA_MOD_HIT_CHANCE] = true;\n+    isTriggerAura[SPELL_AURA_MOD_WEAPON_CRIT_PERCENT] = true;\n+    isTriggerAura[SPELL_AURA_MOD_BLOCK_PERCENT] = true;\n+\n+    isAlwaysTriggeredAura[SPELL_AURA_OVERRIDE_CLASS_SCRIPTS] = true;\n+    isAlwaysTriggeredAura[SPELL_AURA_MOD_STEALTH] = true;\n+    isAlwaysTriggeredAura[SPELL_AURA_MOD_CONFUSE] = true;\n+    isAlwaysTriggeredAura[SPELL_AURA_MOD_FEAR] = true;\n+    isAlwaysTriggeredAura[SPELL_AURA_MOD_ROOT] = true;\n+    isAlwaysTriggeredAura[SPELL_AURA_MOD_STUN] = true;\n+    isAlwaysTriggeredAura[SPELL_AURA_TRANSFORM] = true;\n+    isAlwaysTriggeredAura[SPELL_AURA_MOD_INVISIBILITY] = true;\n+\n+    spellTypeMask[SPELL_AURA_MOD_STEALTH] = PROC_SPELL_TYPE_DAMAGE | PROC_SPELL_TYPE_NO_DMG_HEAL;\n+    spellTypeMask[SPELL_AURA_MOD_CONFUSE] = PROC_SPELL_TYPE_DAMAGE;\n+    spellTypeMask[SPELL_AURA_MOD_FEAR] = PROC_SPELL_TYPE_DAMAGE;\n+    spellTypeMask[SPELL_AURA_MOD_ROOT] = PROC_SPELL_TYPE_DAMAGE;\n+    spellTypeMask[SPELL_AURA_MOD_STUN] = PROC_SPELL_TYPE_DAMAGE;\n+    spellTypeMask[SPELL_AURA_TRANSFORM] = PROC_SPELL_TYPE_DAMAGE;\n+    spellTypeMask[SPELL_AURA_MOD_INVISIBILITY] = PROC_SPELL_TYPE_DAMAGE;\n+\n+    for (auto const& p : botSpellInfoOverrides)\n+    {\n+        SpellInfo const& spellInfo = p.second;\n+\n+        if (!spellInfo.ProcFlags)\n+            continue;\n+\n+        bool addTriggerFlag = false;\n+        uint32 procSpellTypeMask = PROC_SPELL_TYPE_NONE;\n+        uint32 nonProcMask = 0;\n+        for (SpellEffectInfo const& spellEffectInfo : spellInfo.GetEffects())\n+        {\n+            if (!spellEffectInfo.IsEffect())\n+                continue;\n+\n+            uint32 auraName = spellEffectInfo.ApplyAuraName;\n+            if (!auraName)\n+                continue;\n+\n+            if (!isTriggerAura[auraName])\n+            {\n+                // explicitly disable non proccing auras to avoid losing charges on self proc\n+                nonProcMask |= 1u << spellEffectInfo.EffectIndex;\n+                continue;\n+            }\n+\n+            procSpellTypeMask |= spellTypeMask[auraName];\n+            if (isAlwaysTriggeredAura[auraName])\n+                addTriggerFlag = true;\n+\n+            if (!addTriggerFlag && (spellInfo.ProcFlags & TAKEN_HIT_PROC_FLAG_MASK) != 0)\n+            {\n+                switch (auraName)\n+                {\n+                    case SPELL_AURA_PROC_TRIGGER_SPELL:\n+                    case SPELL_AURA_PROC_TRIGGER_DAMAGE:\n+                        addTriggerFlag = true;\n+                        break;\n+                    default:\n+                        break;\n+                }\n+            }\n+        }\n+\n+        if (!procSpellTypeMask)\n+        {\n+            for (SpellEffectInfo const& spellEffectInfo : spellInfo.GetEffects())\n+            {\n+                if (spellEffectInfo.IsAura())\n+                {\n+                    BOT_LOG_ERROR(\"scripts\", \"Bot spell {} has ProcFlags {}, but it's of non-proc aura type, needs a correction\", spellInfo.Id, spellInfo.ProcFlags);\n+                    break;\n+                }\n+            }\n+            continue;\n+        }\n+\n+        SpellProcEntry procEntry;\n+        procEntry.SchoolMask = 0;\n+        procEntry.ProcFlags = spellInfo.ProcFlags;\n+        procEntry.SpellFamilyName = 0;\n+        for (SpellEffectInfo const& spellEffectInfo : spellInfo.GetEffects())\n+            if (spellEffectInfo.IsEffect() && isTriggerAura[spellEffectInfo.ApplyAuraName])\n+                procEntry.SpellFamilyMask |= spellEffectInfo.SpellClassMask;\n+\n+        if (procEntry.SpellFamilyMask)\n+            procEntry.SpellFamilyName = spellInfo.SpellFamilyName;\n+\n+        procEntry.SpellTypeMask   = procSpellTypeMask;\n+        procEntry.SpellPhaseMask  = PROC_SPELL_PHASE_HIT;\n+        procEntry.HitMask         = PROC_HIT_NONE;\n+\n+        for (SpellEffectInfo const& spellEffectInfo : spellInfo.GetEffects())\n+        {\n+            if (!spellEffectInfo.IsAura())\n+                continue;\n+\n+            switch (spellEffectInfo.ApplyAuraName)\n+            {\n+                case SPELL_AURA_REFLECT_SPELLS:\n+                case SPELL_AURA_REFLECT_SPELLS_SCHOOL:\n+                    procEntry.HitMask = PROC_HIT_REFLECT;\n+                    break;\n+                case SPELL_AURA_MOD_WEAPON_CRIT_PERCENT:\n+                    procEntry.HitMask = PROC_HIT_CRITICAL;\n+                    break;\n+                case SPELL_AURA_MOD_BLOCK_PERCENT:\n+                    procEntry.HitMask = PROC_HIT_BLOCK;\n+                    break;\n+                case SPELL_AURA_MOD_HIT_CHANCE:\n+                    if (spellEffectInfo.CalcValue() <= -100)\n+                        procEntry.HitMask = PROC_HIT_MISS;\n+                    break;\n+                default:\n+                    continue;\n+            }\n+            break;\n+        }\n+\n+        procEntry.AttributesMask  = 0;\n+        procEntry.DisableEffectsMask = nonProcMask;\n+        if (spellInfo.ProcFlags & PROC_FLAG_KILL)\n+            procEntry.AttributesMask |= PROC_ATTR_REQ_EXP_OR_HONOR;\n+        if (addTriggerFlag)\n+            procEntry.AttributesMask |= PROC_ATTR_TRIGGERED_CAN_PROC;\n+\n+        procEntry.ProcsPerMinute  = 0;\n+        procEntry.Chance          = spellInfo.ProcChance;\n+        procEntry.Cooldown        = Milliseconds::zero();\n+        procEntry.Charges         = spellInfo.ProcCharges;\n+\n+        botSpellProcOverrides[spellInfo.Id] = std::move(procEntry);\n+    }\n+\n+    BOT_LOG_INFO(\"server.loading\", \">> Bot spell proc overrides generated for {} spells\", uint32(botSpellProcOverrides.size()));\n+\n+}\n+\n+SpellInfo const* GetBotSpellInfoOverride(uint32 spellId)\n+{\n+    decltype(botSpellInfoOverrides)::const_iterator ci = botSpellInfoOverrides.find(spellId);\n+    return ci != botSpellInfoOverrides.cend() ? &ci->second : nullptr;\n+}\n+\n+SpellInfo const* AssertBotSpellInfoOverride(uint32 spellId)\n+{\n+    decltype(botSpellInfoOverrides)::const_iterator ci = botSpellInfoOverrides.find(spellId);\n+    ASSERT(ci != botSpellInfoOverrides.cend(), \"AssertBotSpellInfoOverride failed for spell Id %u!\", spellId);\n+    return &ci->second;\n+}\n+\n+SpellProcEntry const* GetBotSpellProceEntryOverride(uint32 spellId)\n+{\n+    decltype(botSpellProcOverrides)::const_iterator ci = botSpellProcOverrides.find(spellId);\n+    return ci != botSpellProcOverrides.cend() ? &ci->second : nullptr;\n+}\n+\n+void GenerateBotCustomSpells()\n+{\n+    botSpellInfoOverrides.clear();\n+\n+    uint32 spellId, triggerSpellId;\n+    SpellInfo* sinfo;\n+\n+    //COMMON\n+    //1) SPELL_TELEPORT_LOCAL\n+    spellId = SPELL_TELEPORT_LOCAL; //7794\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->InterruptFlags = SPELL_INTERRUPT_FLAG_ABORT_ON_DMG;\n+    sinfo->CastTimeEntry = sSpellCastTimesStore.LookupEntry(6); //5000ms\n+    //sinfo->CastTimeEntry = sSpellCastTimesStore.LookupEntry(4); //1000ms\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(1); //self\n+    sinfo->ExplicitTargetMask = TARGET_FLAG_DEST_LOCATION;\n+    sinfo->Attributes |= SPELL_ATTR0_UNAFFECTED_BY_INVULNERABILITY | SPELL_ATTR0_CASTABLE_WHILE_MOUNTED;\n+    sinfo->AttributesEx2 |= SPELL_ATTR2_CAN_TARGET_NOT_IN_LOS;\n+\n+    sinfo->_effects[0].Effect = SPELL_EFFECT_TELEPORT_UNITS;\n+    sinfo->_effects[0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_CASTER);\n+    sinfo->_effects[0].TargetB = SpellImplicitTargetInfo(TARGET_DEST_DEST);\n+    sinfo->_effects[0].BasePoints = 1;\n+\n+    // SPELL_NULLIFY_POISON\n+    spellId = SPELL_NULLIFY_POISON; //550\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->PreventionType = SPELL_PREVENTION_TYPE_NONE;\n+    sinfo->SpellLevel = 0;\n+    sinfo->MaxLevel = 0;\n+    sinfo->RecoveryTime = 0;\n+    sinfo->StartRecoveryCategory = 0;\n+    sinfo->StartRecoveryTime = 0;\n+    sinfo->ManaCost = 0;\n+    sinfo->ManaCostPercentage = 0;\n+    sinfo->ManaCostPerlevel = 0;\n+    sinfo->CastTimeEntry = sSpellCastTimesStore.LookupEntry(1); //0\n+    sinfo->DurationEntry = sSpellDurationStore.LookupEntry(21); //-1\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(1); //self\n+    sinfo->ExplicitTargetMask = TARGET_FLAG_UNIT;\n+    sinfo->Attributes &= ~(SPELL_ATTR0_NOT_SHAPESHIFT);\n+    sinfo->Attributes |= SPELL_ATTR0_PASSIVE | SPELL_ATTR0_HIDDEN_CLIENTSIDE | SPELL_ATTR0_HIDE_IN_COMBAT_LOG;\n+\n+    sinfo->_effects[0].Effect = SPELL_EFFECT_APPLY_AURA;\n+    sinfo->_effects[0].ApplyAuraName = SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL;\n+    sinfo->_effects[0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_CASTER);\n+    sinfo->_effects[0].TargetB = SpellImplicitTargetInfo(0);\n+    sinfo->_effects[0].BasePoints = -200;\n+    sinfo->_effects[0].MiscValue = DISPEL_POISON;\n+    sinfo->_effects[0].RealPointsPerLevel = 0.0f;\n+    sinfo->_effects[0].BonusCoefficient = 0.0f;\n+    sinfo->_effects[0].ChainAmplitude = 0.0f;\n+    // END SPELL_NULLIFY_POISON\n+\n+    //BLADEMASTER\n+    //2) SPELL_COMBAT_SPECIAL_2H_ATTACK\n+    spellId = SPELL_COMBAT_SPECIAL_2H_ATTACK; //44079\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(6); //6 - 100 yds\n+    sinfo->Attributes &= ~(SPELL_ATTR0_CANT_USED_IN_COMBAT);\n+    sinfo->AttributesEx2 |= SPELL_ATTR2_CAN_TARGET_DEAD;\n+    //2) END SPELL_COMBAT_SPECIAL_2H_ATTACK\n+\n+    //3) WINDWALK\n+    //3.1) TRANSPARENCY\n+    spellId = SPELL_TRANSPARENCY_50; //44816\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+    triggerSpellId = spellId;\n+\n+    sinfo->Attributes |= (SPELL_ATTR0_NOT_SHAPESHIFT | SPELL_ATTR0_CASTABLE_WHILE_SITTING);\n+    sinfo->AttributesEx |= (SPELL_ATTR1_NOT_BREAK_STEALTH);\n+    sinfo->AuraInterruptFlags =\n+        AURA_INTERRUPT_FLAG_SPELL_ATTACK | AURA_INTERRUPT_FLAG_MELEE_ATTACK |\n+        AURA_INTERRUPT_FLAG_NOT_ABOVEWATER | AURA_INTERRUPT_FLAG_MOUNT; //0x00003C07;vanish\n+    sinfo->ExcludeCasterAuraState = 0;\n+    //3.1) END TRANSPARENCY\n+\n+    spellId = SPELL_NETHERWALK; //31599\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellLevel = 0;\n+    sinfo->MaxLevel = 0;\n+    sinfo->RecoveryTime = 5000;\n+    sinfo->PowerType = POWER_MANA;\n+    sinfo->ManaCost = 75 * 5;\n+    sinfo->ManaCostPercentage = 0;\n+    sinfo->ManaCostPerlevel = 0;\n+    sinfo->Attributes &= ~(SPELL_ATTR0_UNK11);\n+    sinfo->Attributes |= (SPELL_ATTR0_NOT_SHAPESHIFT | SPELL_ATTR0_CASTABLE_WHILE_SITTING | SPELL_ATTR0_UNAFFECTED_BY_INVULNERABILITY);\n+    sinfo->AttributesEx &= ~SPELL_ATTR1_DONT_REFRESH_DURATION_ON_RECAST;\n+    sinfo->AttributesEx |= (SPELL_ATTR1_NOT_BREAK_STEALTH | SPELL_ATTR1_NO_THREAT);\n+    sinfo->AttributesEx2 |= SPELL_ATTR2_UNK1;\n+    sinfo->AuraInterruptFlags =\n+        AURA_INTERRUPT_FLAG_SPELL_ATTACK | AURA_INTERRUPT_FLAG_MELEE_ATTACK |\n+        AURA_INTERRUPT_FLAG_NOT_ABOVEWATER | AURA_INTERRUPT_FLAG_MOUNT; //0x00003C07;vanish\n+    sinfo->ExcludeCasterAuraState = 0;\n+\n+    sinfo->_effects[0].Effect = SPELL_EFFECT_APPLY_AURA;\n+    sinfo->_effects[0].BasePoints = 100;\n+    sinfo->_effects[0].RealPointsPerLevel = 2.5f;\n+    sinfo->_effects[0].Amplitude = 1.0f;\n+    sinfo->_effects[0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_CASTER);\n+    sinfo->_effects[0].ApplyAuraName = SPELL_AURA_MOD_INVISIBILITY;\n+    sinfo->_effects[0].Amplitude = 0;\n+    sinfo->_effects[0].TriggerSpell = 0;\n+    sinfo->_effects[0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_0_YARDS);\n+\n+    sinfo->_effects[1].Effect = SPELL_EFFECT_APPLY_AURA;\n+    sinfo->_effects[1].BasePoints = 10;\n+    sinfo->_effects[1].RealPointsPerLevel = 0.5f;\n+    sinfo->_effects[1].Amplitude = 1.0f;\n+    sinfo->_effects[1].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_CASTER);\n+    sinfo->_effects[1].TargetB = SpellImplicitTargetInfo(0);\n+    sinfo->_effects[1].ApplyAuraName = SPELL_AURA_MOD_INCREASE_SPEED;\n+    sinfo->_effects[1].Amplitude = 0;\n+    sinfo->_effects[1].TriggerSpell = 0;\n+    sinfo->_effects[1].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_0_YARDS); //14\n+\n+    sinfo->_effects[2].Effect = SPELL_EFFECT_TRIGGER_SPELL;\n+    sinfo->_effects[2].BasePoints = 0;\n+    sinfo->_effects[2].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_CASTER);\n+    sinfo->_effects[2].TargetB = SpellImplicitTargetInfo(0);\n+    sinfo->_effects[2].ApplyAuraName = SPELL_AURA_NONE;\n+    sinfo->_effects[2].Amplitude = 0;\n+    sinfo->_effects[2].TriggerSpell = triggerSpellId;\n+    sinfo->_effects[2].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_0_YARDS); //14\n+    //3) END WINDWALK\n+\n+    //4) MIRROR IMAGE (BLADEMASTER)\n+    spellId = SPELL_MIRROR_IMAGE_BM; //69936\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(1); //1 - self only //6 - 100 yds\n+    sinfo->DurationEntry = sSpellDurationStore.LookupEntry(566); //566 - 0 sec //3 - 60 sec //1 - 10 sec //32 - 6 seconds\n+    sinfo->RecoveryTime = 8000;\n+    sinfo->PowerType = POWER_MANA;\n+    sinfo->ManaCost = 125 * 5;\n+    sinfo->ManaCostPercentage = 0;\n+    sinfo->ManaCostPerlevel = 0;\n+    sinfo->Attributes |= (SPELL_ATTR0_NOT_SHAPESHIFT/* | SPELL_ATTR0_CASTABLE_WHILE_SITTING | SPELL_ATTR0_UNAFFECTED_BY_INVULNERABILITY*/);\n+    sinfo->AttributesEx2 &= ~(SPELL_ATTR2_CAN_TARGET_NOT_IN_LOS);\n+    //sinfo->AttributesEx3 |= SPELL_ATTR3_DONT_DISPLAY_RANGE;\n+\n+    sinfo->_effects[0].Effect = SPELL_EFFECT_DUMMY;\n+    sinfo->_effects[0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_CASTER);\n+    sinfo->_effects[0].MiscValue = 0;\n+    sinfo->_effects[0].MiscValueB = 0;\n+    sinfo->_effects[0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_0_YARDS);\n+    //4) END MIRROR IMAGE (BLADEMASTER)\n+\n+    //SPHYNX\n+    //5) SHADOW BLAST (SPLASH ATTACK)\n+    //TODO: balance\n+    spellId = SPELL_SHADOW_BLAST; //38085\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellFamilyName = SPELLFAMILY_WARLOCK;\n+    sinfo->SpellLevel = 60;\n+    sinfo->MaxLevel = 83;\n+    sinfo->ManaCost = BASE_MANA_SPHYNX / 16;\n+    sinfo->ManaCostPercentage = 0;\n+    sinfo->ManaCostPerlevel = 0;\n+    sinfo->CastTimeEntry = nullptr;\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(4); //30 yds\n+    sinfo->SchoolMask = SPELL_SCHOOL_MASK_SHADOW | SPELL_SCHOOL_MASK_ARCANE;\n+    sinfo->ExplicitTargetMask = TARGET_FLAG_UNIT | TARGET_FLAG_DEST_LOCATION;\n+    //sinfo->MaxAffectedTargets = 1000;\n+    //sinfo->Attributes |= SPELL_ATTR0_HIDE_IN_COMBAT_LOG | SPELL_ATTR0_HIDDEN_CLIENTSIDE | SPELL_ATTR0_DONT_AFFECT_SHEATH_STATE;\n+    sinfo->Attributes &= ~(SPELL_ATTR0_LEVEL_DAMAGE_CALCULATION);\n+    //sinfo->AttributesEx2 |= SPELL_ATTR2_CAN_TARGET_NOT_IN_LOS;\n+    sinfo->AttributesEx3 |= SPELL_ATTR3_IGNORE_HIT_RESULT;\n+\n+    sinfo->_effects[0].BasePoints = 300;\n+    sinfo->_effects[0].DieSides = 0;\n+    sinfo->_effects[0].BonusCoefficient = 0.f;\n+    sinfo->_effects[0].ChainAmplitude = 0.75f;\n+    sinfo->_effects[0].RealPointsPerLevel = 50.f;\n+    //sinfo->_effects[0].Amplitude = 1.f;\n+\n+    sinfo->_effects[1].Effect = SPELL_EFFECT_SCHOOL_DAMAGE;\n+    sinfo->_effects[1].BasePoints = 50;\n+    sinfo->_effects[1].BonusCoefficient = 1.0f;\n+    sinfo->_effects[1].ChainAmplitude = 0.5f;\n+    sinfo->_effects[1].DieSides = /*17*/25;\n+    sinfo->_effects[1].RealPointsPerLevel = 30.f;\n+    //sinfo->_effects[1].Amplitude = 1.f;\n+    sinfo->_effects[1].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ENEMY);\n+    sinfo->_effects[1].TargetB = SpellImplicitTargetInfo(TARGET_UNIT_DEST_AREA_ENEMY);\n+    sinfo->_effects[1].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_12_YARDS);\n+    //5) END SHADOW BLAST (SPLASH ATTACK)\n+\n+    //6) SHADOW BOLT (BASE ATTACK)\n+    spellId = SPELL_SHADOW_BOLT1; //16408\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->PreventionType = SPELL_PREVENTION_TYPE_NONE;\n+    sinfo->SpellLevel = 60;\n+    sinfo->MaxLevel = 83;\n+    sinfo->ManaCost = 0;\n+    sinfo->ManaCostPercentage = 0;\n+    sinfo->ManaCostPerlevel = 0;\n+    sinfo->CastTimeEntry = nullptr;\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(4); //30 yds\n+    sinfo->SchoolMask = SPELL_SCHOOL_MASK_SHADOW | SPELL_SCHOOL_MASK_ARCANE;\n+    //sinfo->Attributes |= SPELL_ATTR0_HIDE_IN_COMBAT_LOG | SPELL_ATTR0_HIDDEN_CLIENTSIDE | SPELL_ATTR0_DONT_AFFECT_SHEATH_STATE;\n+    //sinfo->AttributesEx3 |= SPELL_ATTR3_DONT_DISPLAY_RANGE;\n+\n+    sinfo->_effects[0].BasePoints = 200;\n+    sinfo->_effects[0].DieSides = /*12*/25;\n+    sinfo->_effects[0].BonusCoefficient = 1.15f;\n+    sinfo->_effects[0].ChainAmplitude = 1.f;\n+    sinfo->_effects[0].RealPointsPerLevel = 10.f;\n+    //sinfo->_effects[0].Amplitude = 1.f;\n+    //6) END SHADOW BOLT (BASE ATTACK)\n+\n+    //7) ATTACK ANIMATION\n+    spellId = SPELL_ATTACK_MELEE_RANDOM; //42902\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->Attributes &= ~(SPELL_ATTR0_CANT_USED_IN_COMBAT);\n+    //7) END ATTACK ANIMATION\n+\n+    //8) SPLASH ANIMATION\n+    spellId = SHADOWFURY_VISUAL; //48582\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellLevel = 0;\n+    sinfo->MaxLevel = 0;\n+    sinfo->ManaCost = 0;\n+    sinfo->ManaCostPercentage = 0;\n+    sinfo->ManaCostPerlevel = 0;\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(6); //100 yds\n+    sinfo->ExplicitTargetMask = TARGET_FLAG_DEST_LOCATION;\n+    sinfo->MaxAffectedTargets = 1;\n+    sinfo->Stances = 0;\n+    sinfo->Speed = 0.f;\n+    sinfo->Attributes |= SPELL_ATTR0_CASTABLE_WHILE_DEAD | SPELL_ATTR0_UNAFFECTED_BY_INVULNERABILITY;\n+    sinfo->AttributesEx |= SPELL_ATTR1_UNAFFECTED_BY_SCHOOL_IMMUNE | SPELL_ATTR1_NO_THREAT;\n+    sinfo->AttributesEx2 |= SPELL_ATTR2_CAN_TARGET_DEAD | SPELL_ATTR2_CAN_TARGET_NOT_IN_LOS;\n+    sinfo->AttributesEx3 |= SPELL_ATTR3_IGNORE_HIT_RESULT;\n+    sinfo->AttributesEx5 |= SPELL_ATTR5_USABLE_WHILE_STUNNED | SPELL_ATTR5_USABLE_WHILE_CONFUSED | SPELL_ATTR5_USABLE_WHILE_FEARED;\n+\n+    sinfo->_effects[0].Effect = SPELL_EFFECT_DUMMY;\n+    sinfo->_effects[0].BasePoints = 1;\n+    sinfo->_effects[0].RealPointsPerLevel = 0.f;\n+    sinfo->_effects[0].Amplitude = 0.f;\n+    sinfo->_effects[0].RealPointsPerLevel = 0.f;\n+    sinfo->_effects[0].ChainAmplitude = 0.f;\n+    sinfo->_effects[0].TargetB = SpellImplicitTargetInfo(0);\n+    sinfo->_effects[0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_0_YARDS);\n+    sinfo->_effects[0].TargetA = SpellImplicitTargetInfo(TARGET_DEST_DEST);\n+    //8) END SPLASH ANIMATION\n+\n+    //9) DEVOUR MAGIC\n+    spellId = SPELL_DEVOUR_MAGIC; //17012\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->InterruptFlags = 0xF;\n+    sinfo->SpellLevel = 0;\n+    sinfo->MaxLevel = 0;\n+    sinfo->MaxTargetLevel = 0;\n+    sinfo->RecoveryTime = 7000;\n+    sinfo->PowerType = POWER_MANA;\n+    sinfo->ManaCost = 0;\n+    sinfo->ManaCostPercentage = 0;\n+    sinfo->ManaCostPerlevel = 0;\n+    sinfo->CastTimeEntry = sSpellCastTimesStore.LookupEntry(4); //1000ms\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(5); //40 yds\n+    sinfo->SchoolMask = SPELL_SCHOOL_MASK_SHADOW | SPELL_SCHOOL_MASK_ARCANE;\n+    sinfo->DmgClass = SPELL_DAMAGE_CLASS_MAGIC;\n+    sinfo->ExplicitTargetMask = TARGET_FLAG_DEST_LOCATION;\n+    //sinfo->MaxAffectedTargets = 100;\n+    sinfo->Attributes |= SPELL_ATTR0_UNAFFECTED_BY_INVULNERABILITY;\n+    sinfo->AttributesEx |= SPELL_ATTR1_NO_THREAT;\n+    //sinfo->Attributes &= ~(SPELL_ATTR0_HIDE_IN_COMBAT_LOG);\n+    //sinfo->AttributesEx3 |= SPELL_ATTR3_DONT_DISPLAY_RANGE;\n+\n+    sinfo->_effects[0].Effect = SPELL_EFFECT_DISPEL;\n+    sinfo->_effects[0].BasePoints = 2;\n+    sinfo->_effects[0].MiscValue = DISPEL_MAGIC;\n+    sinfo->_effects[0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_DEST_AREA_ALLY);\n+    sinfo->_effects[0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_20_YARDS);\n+\n+    sinfo->_effects[1].Effect = SPELL_EFFECT_DISPEL;\n+    sinfo->_effects[1].BasePoints = 2;\n+    sinfo->_effects[1].MiscValue = DISPEL_CURSE;\n+    sinfo->_effects[1].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_DEST_AREA_ALLY);\n+    sinfo->_effects[1].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_20_YARDS);\n+\n+    sinfo->_effects[2].Effect = SPELL_EFFECT_DISPEL;\n+    sinfo->_effects[2].BasePoints = 2;\n+    sinfo->_effects[2].MiscValue = DISPEL_MAGIC;\n+    sinfo->_effects[2].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_DEST_AREA_ENEMY);\n+    sinfo->_effects[2].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_20_YARDS);\n+    //9) END DEVOUR MAGIC\n+\n+    //10) DRAIN MANA\n+    spellId = SPELL_DRAIN_MANA; //25755\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellLevel = 0;\n+    sinfo->MaxLevel = 0;\n+    sinfo->MaxTargetLevel = 0;\n+    sinfo->RecoveryTime = 0;//60000;\n+    //sinfo->PowerType = POWER_MANA;\n+    //sinfo->ManaCost = 0;\n+    //sinfo->ManaCostPercentage = 0;\n+    //sinfo->ManaCostPerlevel = 0;\n+    sinfo->Speed = 0.f;\n+    sinfo->CastTimeEntry = sSpellCastTimesStore.LookupEntry(4); //1000ms\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(5); //40 yds\n+    sinfo->SchoolMask = SPELL_SCHOOL_MASK_SHADOW | SPELL_SCHOOL_MASK_ARCANE;\n+    //sinfo->DmgClass = SPELL_DAMAGE_CLASS_MAGIC;\n+    sinfo->ExplicitTargetMask = TARGET_FLAG_UNIT;\n+    sinfo->Attributes |= SPELL_ATTR0_ABILITY | SPELL_ATTR0_DONT_AFFECT_SHEATH_STATE;\n+    sinfo->AttributesEx3 |= SPELL_ATTR3_IGNORE_HIT_RESULT | SPELL_ATTR3_NO_DONE_BONUS;\n+\n+    //sinfo->_effects[0].Effect = SPELL_EFFECT_POWER_DRAIN;\n+    sinfo->_effects[0].BasePoints = 999999;\n+    sinfo->_effects[0].RealPointsPerLevel = 0.f;\n+    sinfo->_effects[0].Amplitude = 1.f;\n+    sinfo->_effects[0].RealPointsPerLevel = 0.f;\n+    sinfo->_effects[0].ChainAmplitude = 1.f;\n+    sinfo->_effects[0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ANY);\n+\n+    sinfo->_effects[1].Effect = SPELL_EFFECT_NONE;\n+    //10) END DRAIN MANA\n+\n+    //11) REPLENISH MANA\n+    spellId = SPELL_REPLENISH_MANA; //33394\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellFamilyName = SPELLFAMILY_WARLOCK;\n+    sinfo->SpellLevel = 0;\n+    sinfo->RecoveryTime = 3000;\n+    sinfo->CategoryRecoveryTime = 0;\n+    sinfo->CategoryEntry = nullptr;\n+    sinfo->PowerType = POWER_MANA;\n+    sinfo->CastTimeEntry = nullptr;//sSpellCastTimesStore.LookupEntry(2); //250ms\n+    sinfo->SchoolMask = SPELL_SCHOOL_MASK_SHADOW | SPELL_SCHOOL_MASK_ARCANE;\n+    sinfo->ExplicitTargetMask = TARGET_FLAG_UNIT;\n+    sinfo->MaxAffectedTargets = 100;\n+    sinfo->Attributes |= SPELL_ATTR0_ABILITY | SPELL_ATTR0_DONT_AFFECT_SHEATH_STATE | SPELL_ATTR0_IS_REPLENISHMENT | SPELL_ATTR0_HIDE_IN_COMBAT_LOG;\n+    sinfo->AttributesEx |= SPELL_ATTR1_DRAIN_ALL_POWER/* | SPELL_ATTR1_CANT_TARGET_SELF*/;\n+    sinfo->AttributesEx2 |= SPELL_ATTR2_CAN_TARGET_NOT_IN_LOS;\n+    sinfo->AttributesEx3 |= SPELL_ATTR3_NO_DONE_BONUS;\n+    sinfo->AttributesEx4 |= SPELL_ATTR4_NOT_CHECK_SELFCAST_POWER;\n+    sinfo->AttributesEx5 |= SPELL_ATTR5_DONT_TURN_DURING_CAST;\n+    sinfo->AttributesEx6 |= SPELL_ATTR6_CAN_TARGET_POSSESSED_FRIENDS;\n+\n+    sinfo->_effects[0].Effect = SPELL_EFFECT_TRIGGER_SPELL;\n+    sinfo->_effects[0].BasePoints = 3;\n+    sinfo->_effects[0].DieSides = 0;\n+    sinfo->_effects[0].RealPointsPerLevel = 0.f;\n+    sinfo->_effects[0].Amplitude = 0.f;\n+    sinfo->_effects[0].RealPointsPerLevel = 0.f;\n+    sinfo->_effects[0].ChainAmplitude = 0.f;\n+    sinfo->_effects[0].TriggerSpell = SPELL_TRIGGERED_ENERGIZE;\n+    sinfo->_effects[0].TargetA = SpellImplicitTargetInfo(TARGET_SRC_CASTER);\n+    sinfo->_effects[0].TargetB = SpellImplicitTargetInfo(TARGET_UNIT_SRC_AREA_ALLY);\n+    sinfo->_effects[0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_25_YARDS);\n+    //11) END REPLENISH MANA\n+\n+    //12) REPLENISH HEALTH\n+    spellId = SPELL_REPLENISH_HEALTH; //34756\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellFamilyName = SPELLFAMILY_WARLOCK;\n+    sinfo->SpellLevel = 0;\n+    sinfo->RecoveryTime = 3000;\n+    sinfo->CategoryEntry = nullptr;\n+    sinfo->PowerType = POWER_MANA;\n+    sinfo->CastTimeEntry = nullptr;//sSpellCastTimesStore.LookupEntry(2); //250ms\n+    sinfo->SchoolMask = SPELL_SCHOOL_MASK_SHADOW | SPELL_SCHOOL_MASK_ARCANE;\n+    sinfo->ExplicitTargetMask = TARGET_FLAG_UNIT;\n+    sinfo->MaxAffectedTargets = 100;\n+    sinfo->Attributes |= SPELL_ATTR0_ABILITY | SPELL_ATTR0_DONT_AFFECT_SHEATH_STATE | SPELL_ATTR0_IS_REPLENISHMENT | SPELL_ATTR0_HIDE_IN_COMBAT_LOG;\n+    sinfo->AttributesEx |= SPELL_ATTR1_DRAIN_ALL_POWER/* | SPELL_ATTR1_CANT_TARGET_SELF*/;\n+    sinfo->AttributesEx &= ~(SPELL_ATTR1_CANT_TARGET_SELF);\n+    sinfo->AttributesEx2 |= SPELL_ATTR2_CAN_TARGET_NOT_IN_LOS;\n+    sinfo->AttributesEx3 |= SPELL_ATTR3_NO_DONE_BONUS;\n+    sinfo->AttributesEx4 |= SPELL_ATTR4_NOT_CHECK_SELFCAST_POWER;\n+    sinfo->AttributesEx5 |= SPELL_ATTR5_DONT_TURN_DURING_CAST;\n+    sinfo->AttributesEx6 |= SPELL_ATTR6_CAN_TARGET_POSSESSED_FRIENDS;\n+\n+    sinfo->_effects[0].Effect = SPELL_EFFECT_TRIGGER_SPELL;\n+    sinfo->_effects[0].BasePoints = 3;\n+    sinfo->_effects[0].DieSides = 0;\n+    sinfo->_effects[0].RealPointsPerLevel = 0.f;\n+    sinfo->_effects[0].Amplitude = 0.f;\n+    sinfo->_effects[0].RealPointsPerLevel = 0.f;\n+    sinfo->_effects[0].ChainAmplitude = 0.f;\n+    sinfo->_effects[0].TriggerSpell = SPELL_TRIGGERED_HEAL;\n+    sinfo->_effects[0].TargetA = SpellImplicitTargetInfo(TARGET_SRC_CASTER);\n+    sinfo->_effects[0].TargetB = SpellImplicitTargetInfo(TARGET_UNIT_SRC_AREA_ALLY);\n+    sinfo->_effects[0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_25_YARDS);\n+    //12) END REPLENISH HEALTH\n+\n+    //ARCHMAGE\n+    //13) BRILLIANCE AURA\n+    spellId = SPELL_BRILLIANCE_AURA; //1234\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellLevel = 0;\n+    sinfo->MaxLevel = 0;\n+    sinfo->MaxTargetLevel = 0;\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(1); //0 yds\n+    sinfo->ExplicitTargetMask = TARGET_FLAG_UNIT;\n+    sinfo->Attributes |= SPELL_ATTR0_ABILITY | SPELL_ATTR0_PASSIVE;\n+    sinfo->AttributesEx4 |= SPELL_ATTR4_DONT_REMOVE_IN_ARENA;\n+    sinfo->AttributesEx7 |= SPELL_ATTR7_CONSOLIDATED_RAID_BUFF;\n+\n+    sinfo->_effects[0].Effect = SPELL_EFFECT_APPLY_AREA_AURA_RAID;\n+    sinfo->_effects[0].ApplyAuraName = SPELL_AURA_MOD_POWER_REGEN_PERCENT;\n+    sinfo->_effects[0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_CASTER);\n+    sinfo->_effects[0].BasePoints = 100;\n+    sinfo->_effects[0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_40_YARDS);\n+\n+    sinfo->_effects[1].Effect = SPELL_EFFECT_APPLY_AREA_AURA_RAID;\n+    sinfo->_effects[1].ApplyAuraName = SPELL_AURA_MOD_INCREASE_ENERGY_PERCENT;\n+    sinfo->_effects[1].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_CASTER);\n+    sinfo->_effects[1].BasePoints = 10;\n+    sinfo->_effects[1].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_40_YARDS);\n+\n+    //for stacking rule\n+    /*\n+    sinfo->_effects[2].Effect = SPELL_EFFECT_APPLY_AURA;\n+    sinfo->_effects[2].ApplyAuraName = SPELL_AURA_DUMMY;\n+    sinfo->_effects[2].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_CASTER);\n+    sinfo->_effects[2].BasePoints = 1;\n+    sinfo->_effects[2].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_0_YARDS);\n+    */\n+    //13) END BRILLIANCE AURA\n+\n+    //14) FIREBALL (MAIN_ATTACK)\n+    //TODO: balance\n+    spellId = SPELL_FIREBALL; //9488\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellLevel = 20;\n+    sinfo->BaseLevel = 20;\n+    sinfo->MaxLevel = 81;\n+    sinfo->ManaCost = 0;\n+    sinfo->ManaCostPercentage = 0;\n+    sinfo->ManaCostPerlevel = 0;\n+    sinfo->CastTimeEntry = nullptr;\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(4); //30 yds\n+    sinfo->SchoolMask = SPELL_SCHOOL_MASK_FIRE | SPELL_SCHOOL_MASK_ARCANE;\n+    //sinfo->ExplicitTargetMask = TARGET_FLAG_UNIT;\n+    //sinfo->MaxAffectedTargets = 1000;\n+    sinfo->Attributes |= SPELL_ATTR0_DONT_AFFECT_SHEATH_STATE | SPELL_ATTR0_ABILITY | SPELL_ATTR0_CASTABLE_WHILE_MOUNTED;\n+    sinfo->Attributes &= ~(SPELL_ATTR0_LEVEL_DAMAGE_CALCULATION);\n+    sinfo->AttributesEx3 |= SPELL_ATTR3_IGNORE_HIT_RESULT;\n+\n+    sinfo->_effects[0].BasePoints = 15;\n+    sinfo->_effects[0].DieSides = 9;\n+    sinfo->_effects[0].BonusCoefficient = 0.5f;\n+    sinfo->_effects[0].ChainAmplitude = 1.f;\n+    sinfo->_effects[0].RealPointsPerLevel = 15.f;\n+    sinfo->_effects[0].Amplitude = 1.f;\n+    //14) END FIREBALL (MAIN ATTACK)\n+\n+    //15) BLIZZARD\n+    //TODO: balance\n+    spellId = SPELL_BLIZZARD; //15783\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellFamilyName = SPELLFAMILY_MAGE;\n+    sinfo->SpellLevel = 20;\n+    sinfo->BaseLevel = 20;\n+    sinfo->MaxLevel = 0;\n+    sinfo->ManaCost = 75 * 5;\n+    sinfo->ManaCostPercentage = 0;\n+    sinfo->ManaCostPerlevel = 0;\n+    sinfo->CastTimeEntry = nullptr;\n+    sinfo->RecoveryTime = 6000;\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(4); //30 yds\n+    sinfo->SchoolMask = SPELL_SCHOOL_MASK_FROST | SPELL_SCHOOL_MASK_ARCANE;\n+    ///sinfo->ExplicitTargetMask = TARGET_FLAG_DEST_LOCATION;\n+    //sinfo->MaxAffectedTargets = 1000;\n+    sinfo->Attributes |= SPELL_ATTR0_DONT_AFFECT_SHEATH_STATE | SPELL_ATTR0_ABILITY | SPELL_ATTR0_CASTABLE_WHILE_MOUNTED;\n+    sinfo->AttributesEx2 |= SPELL_ATTR2_CAN_TARGET_NOT_IN_LOS | SPELL_ATTR2_UNK22;\n+    sinfo->AttributesEx3 |= SPELL_ATTR3_IGNORE_HIT_RESULT;\n+    sinfo->AttributesEx5 |= SPELL_ATTR5_HASTE_AFFECT_DURATION;\n+\n+    sinfo->_effects[0].BasePoints = 26;\n+    sinfo->_effects[0].DieSides = 0;\n+    sinfo->_effects[0].BonusCoefficient = 1.f;\n+    sinfo->_effects[0].ChainAmplitude = 1.f;\n+    sinfo->_effects[0].RealPointsPerLevel = 15.f;\n+    sinfo->_effects[0].Amplitude = 1.f;\n+    sinfo->_effects[0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_13_YARDS);\n+    sinfo->_effects[0].Amplitude = 1000;\n+    //15) END BLIZZARD\n+\n+    //16) SUMMON WATER ELEMENTAL (dummy spell)\n+    spellId = SPELL_SUMMON_WATER_ELEMENTAL; //35593\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellFamilyName = SPELLFAMILY_MAGE;\n+    sinfo->SpellLevel = 20;\n+    sinfo->BaseLevel = 20;\n+    sinfo->MaxLevel = 0;\n+    sinfo->RecoveryTime = 20000;\n+    sinfo->PowerType = POWER_MANA;\n+    sinfo->ManaCost = 125 * 5;\n+    sinfo->ManaCostPercentage = 0;\n+    sinfo->ManaCostPerlevel = 0;\n+    sinfo->CastTimeEntry = sSpellCastTimesStore.LookupEntry(3); //500ms\n+    sinfo->SchoolMask = SPELL_SCHOOL_MASK_FROST | SPELL_SCHOOL_MASK_ARCANE;\n+    sinfo->ExplicitTargetMask = TARGET_FLAG_UNIT;\n+\n+    sinfo->_effects[0].Effect = SPELL_EFFECT_DUMMY;\n+    //sinfo->_effects[0].BasePoints = 1;\n+    sinfo->_effects[0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_CASTER);\n+    sinfo->_effects[0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_0_YARDS);\n+    //16) END SUMMON WATER ELEMENTAL\n+\n+    //17) WATERBOLT (MAIN_ATTACK)\n+    //TODO: balance, we only have 1 of 3 possible elementals so boost damage\n+    spellId = SPELL_WATERBOLT; //72898\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellFamilyName = SPELLFAMILY_GENERIC;\n+    sinfo->SpellLevel = 20;\n+    sinfo->BaseLevel = 20;\n+    sinfo->MaxTargetLevel = 0;\n+    sinfo->ManaCost = 0;\n+    sinfo->ManaCostPercentage = 0;\n+    sinfo->ManaCostPerlevel = 0;\n+    sinfo->CastTimeEntry = sSpellCastTimesStore.LookupEntry(5); //2000ms\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(4); //30 yds\n+    sinfo->SchoolMask = SPELL_SCHOOL_MASK_FROST | SPELL_SCHOOL_MASK_ARCANE;\n+    sinfo->AttributesEx3 |= SPELL_ATTR3_IGNORE_HIT_RESULT;\n+\n+    sinfo->_effects[0].BasePoints = 25;\n+    sinfo->_effects[0].DieSides = 20;\n+    sinfo->_effects[0].BonusCoefficient = 1.f;\n+    sinfo->_effects[0].ChainAmplitude = 1.f;\n+    sinfo->_effects[0].RealPointsPerLevel = 25.f;\n+    sinfo->_effects[0].Amplitude = 1.f;\n+    //17) END WATERBOLT (MAIN ATTACK)\n+\n+    //DREADLORD\n+    //18) VAMPIRIC AURA\n+    spellId = SPELL_VAMPIRIC_AURA; //20810\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->ProcFlags = PROC_FLAG_DONE_MELEE_AUTO_ATTACK | PROC_FLAG_DONE_SPELL_MELEE_DMG_CLASS;\n+    sinfo->SchoolMask = SPELL_SCHOOL_MASK_SHADOW | SPELL_SCHOOL_MASK_ARCANE;\n+    sinfo->PreventionType = SPELL_PREVENTION_TYPE_NONE;\n+    sinfo->DmgClass = SPELL_DAMAGE_CLASS_NONE;\n+    sinfo->SpellLevel = 0;\n+    sinfo->BaseLevel = 0;\n+    sinfo->MaxTargetLevel = 0;\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(1); //0 yds\n+    sinfo->ExplicitTargetMask = TARGET_FLAG_UNIT;\n+    sinfo->Attributes |= SPELL_ATTR0_ABILITY | SPELL_ATTR0_PASSIVE;\n+    sinfo->AttributesEx3 |= SPELL_ATTR3_CAN_PROC_FROM_PROCS;\n+    sinfo->AttributesEx4 |= SPELL_ATTR4_DONT_REMOVE_IN_ARENA;\n+    sinfo->AttributesEx7 |= SPELL_ATTR7_CONSOLIDATED_RAID_BUFF;\n+\n+    sinfo->_effects[0].Effect = SPELL_EFFECT_APPLY_AREA_AURA_RAID;\n+    sinfo->_effects[0].ApplyAuraName = SPELL_AURA_MOD_CRIT_DAMAGE_BONUS;\n+    sinfo->_effects[0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_CASTER);\n+    sinfo->_effects[0].BasePoints = 5;\n+    sinfo->_effects[0].MiscValue = SPELL_SCHOOL_MASK_NORMAL;\n+    sinfo->_effects[0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_40_YARDS);\n+\n+    sinfo->_effects[1].Effect = SPELL_EFFECT_APPLY_AREA_AURA_RAID;\n+    sinfo->_effects[1].ApplyAuraName = SPELL_AURA_PROC_TRIGGER_SPELL;\n+    sinfo->_effects[1].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_CASTER);\n+    sinfo->_effects[1].BasePoints = 1;\n+    sinfo->_effects[1].TriggerSpell = SPELL_TRIGGERED_HEAL;\n+    sinfo->_effects[1].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_40_YARDS);\n+\n+    //for stacking rule\n+    /*\n+    sinfo->_effects[2].Effect = SPELL_EFFECT_APPLY_AURA;\n+    sinfo->_effects[2].ApplyAuraName = SPELL_AURA_DUMMY;\n+    sinfo->_effects[2].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_CASTER);\n+    sinfo->_effects[2].BasePoints = 1;\n+    sinfo->_effects[2].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_0_YARDS);\n+    */\n+    //18) END VAMPIRIC AURA\n+\n+    //19) VAMPIRIC HEAL\n+    spellId = SPELL_TRIGGERED_HEAL; //25155\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->PreventionType = SPELL_PREVENTION_TYPE_NONE;\n+    sinfo->DmgClass = SPELL_DAMAGE_CLASS_NONE;\n+    sinfo->SchoolMask = SPELL_SCHOOL_MASK_SHADOW | SPELL_SCHOOL_MASK_ARCANE;\n+    sinfo->Attributes &= ~(SPELL_ATTR0_NOT_SHAPESHIFT);\n+    sinfo->AttributesEx |= SPELL_ATTR1_CANT_BE_REFLECTED | SPELL_ATTR1_CANT_BE_REDIRECTED | SPELL_ATTR1_NO_THREAT;\n+    sinfo->AttributesEx2 |= SPELL_ATTR2_CANT_CRIT;\n+    sinfo->AttributesEx3 |= SPELL_ATTR3_IGNORE_HIT_RESULT | SPELL_ATTR3_DISABLE_PROC | SPELL_ATTR3_CAN_PROC_FROM_PROCS | SPELL_ATTR3_NO_DONE_BONUS;\n+\n+    sinfo->_effects[0].BasePoints = 1;\n+\n+    sinfo->_effects[1].Effect = SPELL_EFFECT_NONE;\n+    //19) END VAMPIRIC HEAL\n+\n+    //20) SLEEP\n+    spellId = SPELL_SLEEP; //20663\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellFamilyName = SPELLFAMILY_WARLOCK;\n+    sinfo->SchoolMask = SPELL_SCHOOL_MASK_SHADOW | SPELL_SCHOOL_MASK_ARCANE;\n+    sinfo->InterruptFlags = 0xF;\n+    sinfo->SpellLevel = 0;\n+    sinfo->BaseLevel = 0;\n+    sinfo->MaxTargetLevel = 0;\n+    sinfo->Dispel = DISPEL_MAGIC;\n+    sinfo->Mechanic = MECHANIC_SLEEP;\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(4); //30 yds\n+    sinfo->CastTimeEntry = sSpellCastTimesStore.LookupEntry(3); //500ms\n+    sinfo->RecoveryTime = 6000;\n+    //sinfo->StartRecoveryCategory = 133;\n+    //sinfo->StartRecoveryTime = 1000;\n+    sinfo->DurationEntry = sSpellDurationStore.LookupEntry(3); //60000ms\n+    sinfo->ManaCost = 50 * 5;\n+    sinfo->ManaCostPercentage = 0;\n+    sinfo->ManaCostPerlevel = 0;\n+    sinfo->AuraInterruptFlags = AURA_INTERRUPT_FLAG_DIRECT_DAMAGE;\n+    sinfo->ExplicitTargetMask = TARGET_FLAG_UNIT;\n+    sinfo->Attributes &= ~(SPELL_ATTR0_NOT_SHAPESHIFT | SPELL_ATTR0_HEARTBEAT_RESIST_CHECK);\n+    sinfo->AttributesEx |= SPELL_ATTR1_CANT_BE_REDIRECTED | SPELL_ATTR1_CANT_BE_REFLECTED;\n+    sinfo->AttributesEx3 |= SPELL_ATTR3_IGNORE_HIT_RESULT;\n+\n+    //sinfo->_effects[0].Effect = SPELL_EFFECT_APPLY_AURA;\n+    //sinfo->_effects[0].ApplyAuraName = SPELL_AURA_MOD_STUN;\n+    //sinfo->_effects[0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ENEMY);\n+    //sinfo->_effects[0].BasePoints = 1;\n+\n+    sinfo->_effects[1].Effect = SPELL_EFFECT_APPLY_AURA;\n+    sinfo->_effects[1].ApplyAuraName = SPELL_AURA_MOD_RESISTANCE_PCT;\n+    sinfo->_effects[1].MiscValue = SPELL_SCHOOL_MASK_NORMAL;\n+    sinfo->_effects[1].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ENEMY);\n+    sinfo->_effects[1].BasePoints = -100;\n+    //20) END SLEEP\n+\n+    //21) CARRION SWARM\n+    //TODO: balance\n+    spellId = SPELL_CARRION_SWARM; //34240\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellFamilyName = SPELLFAMILY_WARLOCK;\n+    sinfo->DmgClass = SPELL_DAMAGE_CLASS_MAGIC;\n+    sinfo->SchoolMask = SPELL_SCHOOL_MASK_SHADOW | SPELL_SCHOOL_MASK_ARCANE;\n+    sinfo->PreventionType = SPELL_PREVENTION_TYPE_NONE;\n+    sinfo->SpellLevel = 40;\n+    sinfo->BaseLevel = 40;\n+    sinfo->MaxTargetLevel = 0;\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(4); //30 yds\n+    sinfo->RecoveryTime = 10000;\n+    sinfo->StartRecoveryCategory = 133;\n+    sinfo->StartRecoveryTime = 1500;\n+    sinfo->ManaCost = 110 * 5;\n+    //sinfo->MaxAffectedTargets = 1000;\n+    //sinfo->ExplicitTargetMask = TARGET_FLAG_UNIT;\n+    sinfo->Attributes &= ~(SPELL_ATTR0_UNK11);\n+    sinfo->AttributesEx |= SPELL_ATTR1_CANT_BE_REDIRECTED | SPELL_ATTR1_CANT_BE_REFLECTED;\n+    sinfo->AttributesEx2 |= SPELL_ATTR2_CANT_CRIT/* | SPELL_ATTR2_CAN_TARGET_NOT_IN_LOS*/;\n+    sinfo->AttributesEx3 |= SPELL_ATTR3_IGNORE_HIT_RESULT;\n+\n+    //sinfo->_effects[0].Effect = SPELL_EFFECT_SCHOOL_DAMAGE;\n+    sinfo->_effects[0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_CONE_ENEMY_104);\n+    sinfo->_effects[0].BasePoints = 425;\n+    sinfo->_effects[0].DieSides = 150;\n+    sinfo->_effects[0].BonusCoefficient = 2.f;\n+    sinfo->_effects[0].ChainAmplitude = 1.f;\n+    sinfo->_effects[0].RealPointsPerLevel = 37.5f; //2000 avg at 80\n+    sinfo->_effects[0].Amplitude = 1.f;\n+    sinfo->_effects[0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_40_YARDS);\n+    //21) END CARRION SWARM\n+\n+    //22) INFERNO (dummy summon)\n+    spellId = SPELL_INFERNO; //12740\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellFamilyName = SPELLFAMILY_WARLOCK;\n+    sinfo->SpellLevel = 60;\n+    sinfo->BaseLevel = 60;\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(4); //30 yds\n+    sinfo->CastTimeEntry = sSpellCastTimesStore.LookupEntry(3); //500ms\n+    sinfo->RecoveryTime = 180000;\n+    sinfo->StartRecoveryCategory = 133;\n+    sinfo->StartRecoveryTime = 1500;\n+    sinfo->ManaCost = 175 * 5;\n+    sinfo->ExplicitTargetMask = TARGET_FLAG_DEST_LOCATION;\n+    sinfo->Attributes &= ~(SPELL_ATTR0_ABILITY);\n+    sinfo->AttributesEx |= /*SPELL_ATTR1_UNAFFECTED_BY_SCHOOL_IMMUNE | */SPELL_ATTR1_NO_THREAT;\n+    //sinfo->AttributesEx3 |= SPELL_ATTR3_IGNORE_HIT_RESULT;\n+\n+    sinfo->_effects[0].Effect = SPELL_EFFECT_DUMMY;\n+    sinfo->_effects[0].TargetA = SpellImplicitTargetInfo(TARGET_DEST_DEST);\n+    sinfo->_effects[0].BasePoints = 1;\n+    //22) END INFERNO\n+\n+    //23) INFERNO VISUAL (dummy summon)\n+    spellId = SPELL_INFERNO_METEOR_VISUAL; //5739\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->ExplicitTargetMask = TARGET_FLAG_DEST_LOCATION;\n+\n+    //sinfo->_effects[0].Effect = SPELL_EFFECT_DUMMY;\n+    sinfo->_effects[0].TargetA = SpellImplicitTargetInfo(TARGET_DEST_DEST);\n+    //23) END INFERNO VISUAL\n+\n+    //SPELL BREAKER\n+    //24) STEAL MAGIC\n+    spellId = SPELL_STEAL_MAGIC; //30036\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellFamilyName = SPELLFAMILY_PALADIN;\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(34); //25 yds\n+    sinfo->RecoveryTime = 2000;\n+    sinfo->ManaCost = 75 * 5;\n+    sinfo->ManaCostPercentage = 0;\n+    sinfo->ManaCostPerlevel = 0;\n+    sinfo->ExplicitTargetMask = TARGET_FLAG_UNIT;\n+    sinfo->AttributesEx |= SPELL_ATTR1_CANT_BE_REDIRECTED | SPELL_ATTR1_CANT_BE_REFLECTED;\n+    sinfo->AttributesEx3 |= SPELL_ATTR3_IGNORE_HIT_RESULT;\n+    sinfo->AttributesEx6 |= SPELL_ATTR6_CAN_TARGET_POSSESSED_FRIENDS;\n+\n+    sinfo->_effects[0].Effect = SPELL_EFFECT_DUMMY;\n+    sinfo->_effects[0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ANY);\n+\n+    sinfo->_effects[1].Effect = SPELL_EFFECT_NONE;\n+    //24) END STEAL MAGIC\n+\n+    //24.1) STEAL MAGIC VISUAL\n+    spellId = SPELL_STEAL_MAGIC_VISUAL; //11084\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellLevel = 1;\n+    sinfo->BaseLevel = 1;\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(6); //100 yds\n+    sinfo->RecoveryTime = 0;\n+    sinfo->ExplicitTargetMask = TARGET_FLAG_UNIT;\n+    sinfo->AttributesEx |= SPELL_ATTR1_CANT_BE_REDIRECTED | SPELL_ATTR1_CANT_BE_REFLECTED;\n+    sinfo->AttributesEx3 |= SPELL_ATTR3_IGNORE_HIT_RESULT;\n+\n+    sinfo->_effects[0].Effect = SPELL_EFFECT_DUMMY;\n+    sinfo->_effects[0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ANY);\n+    sinfo->_effects[0].BasePoints = 1;\n+    sinfo->_effects[0].DieSides = 0;\n+    sinfo->_effects[0].RealPointsPerLevel = 0.f;\n+    sinfo->_effects[0].BonusCoefficient = 0.f;\n+    //24.1) END STEAL MAGIC VISUAL\n+\n+    //25) FEEDBACK\n+    spellId = SPELL_FEEDBACK; //32897\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellFamilyName = SPELLFAMILY_PALADIN;\n+    sinfo->SchoolMask = SPELL_SCHOOL_MASK_ARCANE;\n+    sinfo->PreventionType = SPELL_PREVENTION_TYPE_NONE;\n+    sinfo->SpellLevel = 0;\n+    sinfo->BaseLevel = 0;\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(13); //50000 yds\n+    sinfo->ManaCost = 0;\n+    sinfo->ManaCostPercentage = 0;\n+    sinfo->ManaCostPerlevel = 0;\n+    sinfo->ExplicitTargetMask = TARGET_FLAG_UNIT;\n+    sinfo->Attributes &= ~(SPELL_ATTR0_NOT_SHAPESHIFT);\n+    sinfo->AttributesEx |= SPELL_ATTR1_CANT_BE_REDIRECTED | SPELL_ATTR1_CANT_BE_REFLECTED | SPELL_ATTR1_UNAFFECTED_BY_SCHOOL_IMMUNE;\n+    sinfo->AttributesEx2 |= SPELL_ATTR2_CANT_CRIT;\n+    sinfo->AttributesEx3 |= SPELL_ATTR3_IGNORE_HIT_RESULT;\n+\n+    sinfo->_effects[0].Effect = SPELL_EFFECT_POWER_BURN;\n+    sinfo->_effects[0].DieSides = 0;\n+    sinfo->_effects[0].Amplitude = 1.f;\n+    //25) END FEEDBACK\n+\n+    // DARK RANGER\n+    //26) BLACK ARROW\n+    //TODO: balance\n+    spellId = SPELL_BLACK_ARROW; //20733\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellFamilyName = SPELLFAMILY_WARLOCK;\n+    //sinfo->SpellFamilyFlags[0] = 0x0;\n+    sinfo->SpellFamilyFlags[1] = 0x4; //custom, not present in db\n+    //sinfo->SpellFamilyFlags[2] = 0x0;\n+    sinfo->DmgClass = SPELL_DAMAGE_CLASS_RANGED;\n+    sinfo->SchoolMask = SPELL_SCHOOL_MASK_SHADOW | SPELL_SCHOOL_MASK_ARCANE;\n+    sinfo->PreventionType = SPELL_PREVENTION_TYPE_PACIFY;\n+    sinfo->Dispel = DISPEL_NONE;\n+    sinfo->Mechanic = MECHANIC_NONE;\n+    sinfo->SpellLevel = 40;\n+    sinfo->BaseLevel = 40;\n+    sinfo->MaxTargetLevel = 0;\n+    sinfo->CastTimeEntry = sSpellCastTimesStore.LookupEntry(3); //500ms\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(4); //5-30 yds\n+    sinfo->DurationEntry = sSpellDurationStore.LookupEntry(85); //18 sec\n+    sinfo->RecoveryTime = 3000;\n+    sinfo->StartRecoveryCategory = 133;\n+    sinfo->StartRecoveryTime = 1500;\n+    sinfo->ManaCost = 6 * 5 * 2; //need to increase cost since ability is not autocast, has cd and deals more damage\n+    sinfo->MaxAffectedTargets = 1;\n+    sinfo->AuraInterruptFlags = AURA_INTERRUPT_FLAG_CHANGE_MAP;\n+    //sinfo->ExplicitTargetMask = TARGET_FLAG_UNIT;\n+    sinfo->Attributes |= SPELL_ATTR0_IMPOSSIBLE_DODGE_PARRY_BLOCK | SPELL_ATTR0_NEGATIVE_1;\n+    sinfo->AttributesEx |= SPELL_ATTR1_CANT_BE_REDIRECTED | SPELL_ATTR1_CANT_BE_REFLECTED;\n+    sinfo->AttributesEx2 |= SPELL_ATTR2_NOT_RESET_AUTO_ACTIONS/* | SPELL_ATTR2_CANT_CRIT*/;\n+    sinfo->AttributesEx4 |= SPELL_ATTR4_IGNORE_RESISTANCES;\n+\n+    sinfo->_effects[1].Effect = SPELL_EFFECT_WEAPON_PERCENT_DAMAGE;\n+    sinfo->_effects[1].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ENEMY);\n+    sinfo->_effects[1].ApplyAuraName = SPELL_AURA_NONE;\n+    sinfo->_effects[1].BasePoints = 150;\n+    sinfo->_effects[1].DieSides = 0;\n+    sinfo->_effects[1].BonusCoefficient = 1.f;\n+    sinfo->_effects[1].ChainAmplitude = 1.f;\n+    sinfo->_effects[1].RealPointsPerLevel = 0.f;\n+    sinfo->_effects[1].Amplitude = 1.f;\n+    sinfo->_effects[1].Amplitude = 0;\n+    sinfo->_effects[1].RadiusEntry = nullptr;\n+\n+    //sinfo->_effects[0].Effect = SPELL_EFFECT_APPLY_AURA;\n+    //sinfo->_effects[0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ENEMY);\n+    //sinfo->_effects[0].ApplyAuraName = SPELL_AURA_PERIODIC_DAMAGE;\n+    sinfo->_effects[0].BasePoints = 100;\n+    //sinfo->_effects[0].DieSides = 0;\n+    sinfo->_effects[0].BonusCoefficient = 1.5f;\n+    sinfo->_effects[0].ChainAmplitude = 1.f;\n+    sinfo->_effects[0].RealPointsPerLevel = 10.f;\n+    //sinfo->_effects[0].Amplitude = 1.f;\n+    //sinfo->_effects[0].RadiusEntry = nullptr;\n+    sinfo->_effects[0].Amplitude = 2000;\n+    //26) END BLACK ARROW\n+\n+    //27) DRAIN LIFE\n+    //TODO: balance\n+    spellId = SPELL_DRAIN_LIFE; //17238\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellFamilyName = SPELLFAMILY_WARLOCK;\n+    sinfo->DmgClass = SPELL_DAMAGE_CLASS_MAGIC;\n+    sinfo->SchoolMask = SPELL_SCHOOL_MASK_SHADOW;\n+    sinfo->PreventionType = SPELL_PREVENTION_TYPE_SILENCE;\n+    sinfo->Dispel = DISPEL_NONE;\n+    sinfo->Mechanic = MECHANIC_NONE;\n+    sinfo->SpellLevel = 40;\n+    sinfo->BaseLevel = 40;\n+    sinfo->MaxTargetLevel = 0;\n+    sinfo->CastTimeEntry = nullptr;\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(4); //30 yds\n+    //sinfo->DurationEntry = sSpellDurationStore.LookupEntry(85); //18 sec\n+    sinfo->RecoveryTime = 5000;\n+    sinfo->StartRecoveryCategory = 133;\n+    sinfo->StartRecoveryTime = 1500;\n+    sinfo->ManaCost = 75 * 5;\n+    sinfo->MaxAffectedTargets = 1;\n+    sinfo->AuraInterruptFlags = 0x0;\n+    sinfo->ExplicitTargetMask = TARGET_FLAG_UNIT;\n+    sinfo->Attributes |= SPELL_ATTR0_IMPOSSIBLE_DODGE_PARRY_BLOCK;\n+    sinfo->AttributesEx |= SPELL_ATTR1_CANT_BE_REDIRECTED | SPELL_ATTR1_CANT_BE_REFLECTED;\n+    sinfo->AttributesEx3 |= SPELL_ATTR3_NO_INITIAL_AGGRO | SPELL_ATTR3_IGNORE_HIT_RESULT;\n+    sinfo->AttributesEx4 |= SPELL_ATTR4_IGNORE_RESISTANCES;\n+    sinfo->AttributesEx5 |= SPELL_ATTR5_START_PERIODIC_AT_APPLY;\n+\n+    sinfo->_effects[0].Effect = SPELL_EFFECT_APPLY_AURA;\n+    sinfo->_effects[0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ENEMY);\n+    sinfo->_effects[0].ApplyAuraName = SPELL_AURA_PERIODIC_LEECH;\n+    sinfo->_effects[0].BasePoints = 45;\n+    sinfo->_effects[0].DieSides = 0;\n+    sinfo->_effects[0].BonusCoefficient = 1.f;\n+    sinfo->_effects[0].ChainAmplitude = 1.f;\n+    sinfo->_effects[0].RealPointsPerLevel = 6.f;\n+    sinfo->_effects[0].Amplitude = 2.f;\n+    sinfo->_effects[0].RadiusEntry = nullptr;\n+    sinfo->_effects[0].Amplitude = 1000;\n+    //27) END DRAIN LIFE\n+\n+    //28) SILENCE\n+    //TODO: balance\n+    spellId = SPELL_SILENCE; //29943\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellFamilyName = SPELLFAMILY_WARLOCK;\n+    sinfo->DmgClass = SPELL_DAMAGE_CLASS_NONE;\n+    sinfo->SchoolMask = SPELL_SCHOOL_MASK_SHADOW | SPELL_SCHOOL_MASK_ARCANE;\n+    sinfo->PreventionType = SPELL_PREVENTION_TYPE_SILENCE;\n+    sinfo->Dispel = DISPEL_MAGIC;\n+    sinfo->Mechanic = MECHANIC_SILENCE;\n+    sinfo->SpellLevel = 60;\n+    sinfo->BaseLevel = 60;\n+    sinfo->MaxTargetLevel = 0;\n+    sinfo->CastTimeEntry = sSpellCastTimesStore.LookupEntry(2); //250ms\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(4); //30 yds\n+    //sinfo->DurationEntry = sSpellDurationStore.LookupEntry(85); //18 sec\n+    sinfo->RecoveryTime = 15000;\n+    sinfo->StartRecoveryCategory = 133;\n+    sinfo->StartRecoveryTime = 1500;\n+    sinfo->ManaCost = 75 * 5;\n+    sinfo->MaxAffectedTargets = 5;\n+    sinfo->AuraInterruptFlags = 0x0;\n+    sinfo->ExplicitTargetMask = TARGET_FLAG_UNIT | TARGET_FLAG_DEST_LOCATION;\n+    sinfo->AttributesEx |= SPELL_ATTR1_CANT_BE_REFLECTED | SPELL_ATTR1_CANT_BE_REDIRECTED;\n+\n+    sinfo->_effects[0].Effect = SPELL_EFFECT_APPLY_AURA;\n+    sinfo->_effects[0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ENEMY);\n+    sinfo->_effects[0].TargetB = SpellImplicitTargetInfo(TARGET_UNIT_DEST_AREA_ENEMY);\n+    sinfo->_effects[0].ApplyAuraName = SPELL_AURA_MOD_SILENCE;\n+    sinfo->_effects[0].BasePoints = 1;\n+    sinfo->_effects[0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_15_YARDS);\n+    //28) END SILENCE\n+\n+    // NECROMANCER\n+    //29) SHADOW BOLT (MAIN_ATTACK)\n+    //TODO: balance\n+    spellId = SPELL_SHADOW_BOLT2; //17509\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellFamilyName = SPELLFAMILY_WARLOCK;\n+    sinfo->SpellLevel = 20;\n+    sinfo->BaseLevel = 20;\n+    sinfo->MaxLevel = 82;\n+    sinfo->ManaCost = 0;\n+    sinfo->ManaCostPercentage = 0;\n+    sinfo->ManaCostPerlevel = 0;\n+    sinfo->CastTimeEntry = nullptr;\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(4); //30 yds\n+    sinfo->SchoolMask = SPELL_SCHOOL_MASK_SHADOW | SPELL_SCHOOL_MASK_ARCANE;\n+    sinfo->Attributes |= SPELL_ATTR0_DONT_AFFECT_SHEATH_STATE;\n+\n+    sinfo->_effects[0].BasePoints = 15;\n+    sinfo->_effects[0].DieSides = 9;\n+    sinfo->_effects[0].BonusCoefficient = 0.75f;\n+    sinfo->_effects[0].ChainAmplitude = 1.f;\n+    sinfo->_effects[0].RealPointsPerLevel = 8.f;\n+    sinfo->_effects[0].Amplitude = 1.f;\n+    //29) END SHADOW BOLT (MAIN_ATTACK)\n+\n+    //30) RAISE DEAD\n+    spellId = SPELL_RAISE_DEAD; //34011\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellFamilyName = SPELLFAMILY_WARLOCK;\n+    sinfo->SchoolMask = SPELL_SCHOOL_MASK_SHADOW;\n+    sinfo->InterruptFlags = 0xF;\n+    sinfo->SpellLevel = 20;\n+    sinfo->BaseLevel = 20;\n+    sinfo->MaxTargetLevel = 0;\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(34); //25 yds\n+    sinfo->CastTimeEntry = sSpellCastTimesStore.LookupEntry(3); //500ms\n+    sinfo->RecoveryTime = 8000;\n+    sinfo->StartRecoveryCategory = 133;\n+    sinfo->StartRecoveryTime = 1500;\n+    sinfo->ManaCost = 50 * 5;\n+    sinfo->ManaCostPercentage = 0;\n+    sinfo->ManaCostPerlevel = 0;\n+    sinfo->ExplicitTargetMask = TARGET_FLAG_CORPSE_ENEMY;\n+    sinfo->Attributes |= SPELL_ATTR0_ABILITY | SPELL_ATTR0_DONT_AFFECT_SHEATH_STATE;\n+    sinfo->AttributesEx3 |= SPELL_ATTR3_IGNORE_HIT_RESULT;\n+\n+    sinfo->_effects[0].Effect = SPELL_EFFECT_DUMMY;\n+    sinfo->_effects[0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ANY);\n+    sinfo->_effects[0].TargetB = SpellImplicitTargetInfo(0);\n+    sinfo->_effects[1].Effect = SPELL_EFFECT_NONE;\n+    sinfo->_effects[2].Effect = SPELL_EFFECT_NONE;\n+    //30) END RAISE DEAD\n+\n+    //31) UNHOLY FRENZY\n+    spellId = SPELL_UNHOLY_FRENZY; //52499\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellFamilyName = SPELLFAMILY_WARLOCK;\n+    sinfo->DmgClass = SPELL_DAMAGE_CLASS_NONE;\n+    sinfo->SchoolMask = SPELL_SCHOOL_MASK_SHADOW;\n+    sinfo->SpellLevel = 30;\n+    sinfo->BaseLevel = 30;\n+    sinfo->MaxTargetLevel = 0;\n+    sinfo->DurationEntry = sSpellDurationStore.LookupEntry(22); //566 - 0 sec //3 - 60 sec //1 - 10 sec //32 - 6 sec //22 - 45 sec\n+    sinfo->RecoveryTime = 2000; //original 1000\n+    sinfo->CategoryEntry = nullptr;\n+    sinfo->StartRecoveryCategory = 133;\n+    sinfo->StartRecoveryTime = 1500;\n+    sinfo->ManaCost = 50 * 5;\n+    sinfo->ManaCostPercentage = 0;\n+    sinfo->ManaCostPerlevel = 0;\n+    sinfo->ExplicitTargetMask = TARGET_FLAG_UNIT;\n+    sinfo->Attributes |= SPELL_ATTR0_ABILITY | SPELL_ATTR0_DONT_AFFECT_SHEATH_STATE;\n+    sinfo->AttributesEx |= SPELL_ATTR1_CANT_BE_REFLECTED | SPELL_ATTR1_CANT_BE_REDIRECTED;\n+    sinfo->AttributesEx2 |= SPELL_ATTR2_CANT_CRIT;\n+    sinfo->AttributesEx3 |= SPELL_ATTR3_IGNORE_HIT_RESULT | SPELL_ATTR3_NO_DONE_BONUS;\n+    sinfo->AttributesEx4 |= SPELL_ATTR4_IGNORE_RESISTANCES;\n+\n+    sinfo->_effects[0].ApplyAuraName = SPELL_AURA_MOD_ATTACKSPEED;\n+    sinfo->_effects[0].BasePoints = 75;\n+    sinfo->_effects[1].Amplitude = 3000;\n+    sinfo->_effects[1].BasePoints = 1;\n+    //31) END UNHOLY FRENZY\n+\n+    //32) CRIPPLE\n+    spellId = SPELL_CRIPPLE; //50379\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellFamilyName = SPELLFAMILY_WARLOCK;\n+    sinfo->DmgClass = SPELL_DAMAGE_CLASS_NONE;\n+    sinfo->Dispel = DISPEL_CURSE; //TODO: check if works\n+    sinfo->SpellLevel = 50;\n+    sinfo->BaseLevel = 50;\n+    sinfo->MaxLevel = 0;\n+    sinfo->MaxTargetLevel = 0;\n+    sinfo->CastTimeEntry = sSpellCastTimesStore.LookupEntry(0); //0ms\n+    sinfo->DurationEntry = sSpellDurationStore.LookupEntry(3); //60 sec\n+    sinfo->RecoveryTime = 10000;\n+    sinfo->CategoryEntry = nullptr;\n+    sinfo->StartRecoveryCategory = 133;\n+    sinfo->StartRecoveryTime = 1500;\n+    sinfo->ManaCost = 175 * 5;\n+    sinfo->ExplicitTargetMask = TARGET_FLAG_UNIT;\n+    sinfo->AttributesEx |= SPELL_ATTR1_CANT_BE_REFLECTED | SPELL_ATTR1_CANT_BE_REDIRECTED;\n+    sinfo->AttributesEx3 |= SPELL_ATTR3_IGNORE_HIT_RESULT;\n+    //32) END CRIPPLE\n+\n+    //33) CORPSE EXPLOSION\n+    spellId = SPELL_CORPSE_EXPLOSION; //61614\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellFamilyName = SPELLFAMILY_WARLOCK;\n+    sinfo->DmgClass = SPELL_DAMAGE_CLASS_NONE;\n+    sinfo->SchoolMask = SPELL_SCHOOL_MASK_SHADOW;\n+    sinfo->TargetCreatureType = 0x0000037F;\n+    sinfo->InterruptFlags = 0xF;\n+    sinfo->SpellLevel = 40;\n+    sinfo->BaseLevel = 40;\n+    sinfo->MaxTargetLevel = 0;\n+    sinfo->DurationEntry = sSpellDurationStore.LookupEntry(21); //-1\n+    sinfo->CastTimeEntry = sSpellCastTimesStore.LookupEntry(110); //750ms\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(3); //20 yds\n+    sinfo->RecoveryTime = 1500;\n+    sinfo->StartRecoveryCategory = 133;\n+    sinfo->StartRecoveryTime = 1500;\n+    sinfo->ManaCost = 100 * 5;\n+    sinfo->ExplicitTargetMask = TARGET_FLAG_CORPSE_ENEMY;\n+    sinfo->Attributes |= SPELL_ATTR0_ABILITY | SPELL_ATTR0_DONT_AFFECT_SHEATH_STATE;\n+    sinfo->AttributesEx2 |= SPELL_ATTR2_CANT_CRIT;\n+    sinfo->AttributesEx3 |= SPELL_ATTR3_IGNORE_HIT_RESULT | SPELL_ATTR3_NO_DONE_BONUS;\n+\n+    sinfo->_effects[0].Effect = SPELL_EFFECT_APPLY_AURA;\n+    sinfo->_effects[0].ApplyAuraName = SPELL_AURA_DUMMY;\n+    sinfo->_effects[0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ANY);\n+    sinfo->_effects[0].TargetB = SpellImplicitTargetInfo(0);\n+    sinfo->_effects[0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_10_YARDS);\n+    sinfo->_effects[0].SpellClassMask[0] = 0;\n+    sinfo->_effects[0].BasePoints = 1;\n+    sinfo->_effects[1].Effect = SPELL_EFFECT_NONE;\n+    //33) END CORPSE EXPLOSION\n+\n+    //SEA WITCH\n+    //35) FORKED LIGHTNING\n+    spellId = SPELL_FORKED_LIGHTNING; //63541\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellFamilyName = SPELLFAMILY_MAGE;\n+    sinfo->SchoolMask = SPELL_SCHOOL_MASK_NATURE | SPELL_SCHOOL_MASK_ARCANE;\n+    sinfo->PreventionType = SPELL_PREVENTION_TYPE_SILENCE;\n+    sinfo->InterruptFlags = 0x9;\n+    sinfo->SpellLevel = 4;\n+    sinfo->BaseLevel = 4;\n+    sinfo->CastTimeEntry = sSpellCastTimesStore.LookupEntry(110); //750ms\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(4); //30 yds\n+    sinfo->RecoveryTime = 11000;\n+    sinfo->StartRecoveryCategory = 133;\n+    sinfo->StartRecoveryTime = 1500;\n+    sinfo->ManaCost = 110 * 5;\n+    sinfo->MaxAffectedTargets = 2;\n+    sinfo->Speed = 1000.f;\n+    sinfo->AttributesEx |= SPELL_ATTR1_NO_THREAT;\n+    sinfo->AttributesEx3 |= SPELL_ATTR3_IGNORE_HIT_RESULT;\n+    sinfo->AttributesEx5 |= SPELL_ATTR5_DONT_TURN_DURING_CAST;\n+    //sinfo->AttributesEx6 |= SPELL_ATTR6_CAN_TARGET_INVISIBLE;\n+\n+    sinfo->_effects[0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_CONE_ENEMY_24);\n+    //sinfo->_effects[0].TargetB = SpellImplicitTargetInfo(TARGET_UNIT_CONE_ENEMY_24);\n+    sinfo->_effects[0].RadiusEntry = nullptr;//sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_50_YARDS);\n+    sinfo->_effects[0].BasePoints = 1;\n+    sinfo->_effects[0].DieSides = 49;\n+    sinfo->_effects[0].BonusCoefficient = 0.0f;\n+    sinfo->_effects[0].ChainAmplitude = 1.f;\n+    sinfo->_effects[0].RealPointsPerLevel = 15.f;\n+    sinfo->_effects[0].Amplitude = 1.f;\n+    //35) END FORKED LIGHTNING\n+\n+    //36) FORKED LIGHTNING EFFECT\n+    spellId = SPELL_FORKED_LIGHTNING_EFFECT; //50900\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellFamilyName = SPELLFAMILY_MAGE;\n+    sinfo->SchoolMask = SPELL_SCHOOL_MASK_NATURE | SPELL_SCHOOL_MASK_ARCANE;\n+    sinfo->Dispel = DISPEL_MAGIC;\n+    sinfo->Mechanic = MECHANIC_STUN;\n+    sinfo->DurationEntry = sSpellDurationStore.LookupEntry(39); //2000ms\n+    sinfo->CastTimeEntry = sSpellCastTimesStore.LookupEntry(1); //instant\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(6); //100 yds\n+    sinfo->ManaCost = 0;\n+    sinfo->AttributesEx3 |= SPELL_ATTR3_IGNORE_HIT_RESULT;\n+    sinfo->AttributesEx5 |= SPELL_ATTR5_DONT_TURN_DURING_CAST;\n+    sinfo->AttributesEx6 |= SPELL_ATTR6_CAN_TARGET_INVISIBLE;\n+\n+    sinfo->_effects[0].Effect = SPELL_EFFECT_APPLY_AURA;\n+    sinfo->_effects[0].ApplyAuraName = SPELL_AURA_MOD_STUN;\n+    sinfo->_effects[0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ENEMY);\n+    sinfo->_effects[0].RadiusEntry = nullptr;\n+    //36) END FORKED LIGHTNING EFFECT\n+\n+    //37) FROST ARROW\n+    spellId = SPELL_FROST_ARROW; //38942\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellFamilyName = SPELLFAMILY_MAGE;\n+    //sinfo->SpellFamilyFlags[0] = 0x0;\n+    sinfo->SpellFamilyFlags[1] = 0x4; //custom, not present in db\n+    //sinfo->SpellFamilyFlags[2] = 0x0;\n+    sinfo->DmgClass = SPELL_DAMAGE_CLASS_RANGED;\n+    sinfo->SchoolMask = SPELL_SCHOOL_MASK_FROST | SPELL_SCHOOL_MASK_ARCANE;\n+    sinfo->PreventionType = SPELL_PREVENTION_TYPE_PACIFY;\n+    sinfo->Dispel = DISPEL_NONE;\n+    sinfo->Mechanic = MECHANIC_NONE;\n+    sinfo->SpellLevel = 4;\n+    sinfo->BaseLevel = 4;\n+    sinfo->MaxTargetLevel = 0;\n+    sinfo->CastTimeEntry = sSpellCastTimesStore.LookupEntry(110); //750ms\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(35); //0-35 yds\n+    sinfo->DurationEntry = nullptr;\n+    sinfo->RecoveryTime = 0;\n+    sinfo->StartRecoveryCategory = 133;\n+    sinfo->StartRecoveryTime = 750;\n+    sinfo->PowerType = POWER_MANA;\n+    sinfo->ManaCost = 10 * 5;\n+    sinfo->MaxAffectedTargets = 1;\n+    sinfo->AuraInterruptFlags = AURA_INTERRUPT_FLAG_CHANGE_MAP;\n+    sinfo->ExplicitTargetMask = TARGET_FLAG_UNIT;\n+    sinfo->Attributes |= SPELL_ATTR0_IMPOSSIBLE_DODGE_PARRY_BLOCK | SPELL_ATTR0_DONT_AFFECT_SHEATH_STATE;\n+    sinfo->Attributes &= ~(SPELL_ATTR0_REQ_AMMO);\n+    sinfo->AttributesEx |= SPELL_ATTR1_CANT_BE_REDIRECTED | SPELL_ATTR1_CANT_BE_REFLECTED;\n+    sinfo->AttributesEx2 |= SPELL_ATTR2_NOT_RESET_AUTO_ACTIONS/* | SPELL_ATTR2_CANT_CRIT*/;\n+    sinfo->AttributesEx4 |= SPELL_ATTR4_IGNORE_RESISTANCES;\n+\n+    sinfo->_effects[0].Effect = SPELL_EFFECT_WEAPON_DAMAGE;\n+    sinfo->_effects[0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ENEMY);\n+    sinfo->_effects[0].BasePoints = 10;\n+    sinfo->_effects[0].DieSides = 0;\n+    sinfo->_effects[0].BonusCoefficient = 0.5f;\n+    sinfo->_effects[0].ChainAmplitude = 1.f;\n+    sinfo->_effects[0].RealPointsPerLevel = 2.f;\n+    sinfo->_effects[0].Amplitude = 1.f;\n+    sinfo->_effects[0].RadiusEntry = nullptr;\n+    sinfo->_effects[1].Effect = SPELL_EFFECT_NONE;\n+    //37) END FROST ARROW\n+\n+    //38) FROST ARROW EFFECT\n+    spellId = SPELL_FROST_ARROW_EFFECT; //56095\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellFamilyName = SPELLFAMILY_GENERIC;\n+    //sinfo->SpellFamilyFlags[0] = 0x0;\n+    sinfo->SpellFamilyFlags[1] = 0x4; //custom, not present in db\n+    //sinfo->SpellFamilyFlags[2] = 0x0;\n+    sinfo->SchoolMask = SPELL_SCHOOL_MASK_FROST | SPELL_SCHOOL_MASK_ARCANE;\n+    sinfo->Dispel = DISPEL_MAGIC;\n+    sinfo->Mechanic = MECHANIC_SNARE;\n+    sinfo->Attributes &= ~(SPELL_ATTR0_CAST_TRACK_TARGET);\n+    sinfo->AttributesEx |= SPELL_ATTR1_CANT_BE_REDIRECTED | SPELL_ATTR1_CANT_BE_REFLECTED;\n+    sinfo->AttributesEx4 |= SPELL_ATTR4_IGNORE_RESISTANCES;\n+\n+    sinfo->_effects[0].Effect = SPELL_EFFECT_APPLY_AURA;\n+    sinfo->_effects[0].ApplyAuraName = SPELL_AURA_MOD_SPEED_SLOW_ALL;\n+    sinfo->_effects[0].Mechanic = MECHANIC_SLOW_ATTACK;\n+    sinfo->_effects[0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_CASTER);\n+    sinfo->_effects[0].BasePoints = -30;\n+    sinfo->_effects[0].DieSides = 0;\n+    sinfo->_effects[0].BonusCoefficient = 1.f;\n+    sinfo->_effects[0].ChainAmplitude = 1.f;\n+    sinfo->_effects[0].RealPointsPerLevel = 0.f;\n+    sinfo->_effects[0].Amplitude = 1.f;\n+    sinfo->_effects[0].RadiusEntry = nullptr;\n+    sinfo->_effects[1].Effect = SPELL_EFFECT_APPLY_AURA;\n+    sinfo->_effects[1].ApplyAuraName = SPELL_AURA_MOD_DECREASE_SPEED;\n+    sinfo->_effects[1].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_CASTER);\n+    sinfo->_effects[1].BasePoints = -30;\n+    sinfo->_effects[1].DieSides = 0;\n+    sinfo->_effects[1].BonusCoefficient = 1.f;\n+    sinfo->_effects[1].ChainAmplitude = 1.f;\n+    sinfo->_effects[1].RealPointsPerLevel = 0.f;\n+    sinfo->_effects[1].Amplitude = 1.f;\n+    sinfo->_effects[1].RadiusEntry = nullptr;\n+    //38) END FROST ARROW EFFECT\n+\n+    //39) MANA SHIELD\n+    spellId = SPELL_MANA_SHIELD; //35064\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->Dispel = DISPEL_NONE;\n+    sinfo->PreventionType = SPELL_PREVENTION_TYPE_NONE;\n+    sinfo->SpellLevel = 0;\n+    sinfo->BaseLevel = 0;\n+    sinfo->MaxTargetLevel = 0;\n+    sinfo->DurationEntry = sSpellDurationStore.LookupEntry(21); //-1\n+    sinfo->RecoveryTime = 10000;\n+    sinfo->StartRecoveryCategory = 133;\n+    sinfo->StartRecoveryTime = 1500;\n+    sinfo->Attributes |= SPELL_ATTR0_ABILITY | SPELL_ATTR0_DONT_AFFECT_SHEATH_STATE | SPELL_ATTR0_DISABLED_WHILE_ACTIVE;\n+    sinfo->AttributesEx3 |= SPELL_ATTR3_IGNORE_HIT_RESULT | SPELL_ATTR3_NO_DONE_BONUS;\n+    sinfo->AttributesEx4 |= SPELL_ATTR4_NOT_STEALABLE;\n+\n+    sinfo->_effects[0].BasePoints = 1000000000;\n+    sinfo->_effects[0].Amplitude = 10.f;\n+    //39) END MANA SHIELD\n+\n+    //40) TORNADO\n+    spellId = SPELL_TORNADO; //34695\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellFamilyName = SPELLFAMILY_MAGE;\n+    sinfo->SchoolMask = SPELL_SCHOOL_MASK_NATURE | SPELL_SCHOOL_MASK_ARCANE;\n+    sinfo->InterruptFlags = 0x9;\n+    sinfo->SpellLevel = 60;\n+    sinfo->BaseLevel = 60;\n+    sinfo->MaxTargetLevel = 0;\n+    sinfo->DurationEntry = nullptr;\n+    sinfo->CastTimeEntry = sSpellCastTimesStore.LookupEntry(15); //4000ms\n+    //sinfo->RangeEntry = sSpellRangeStore.LookupEntry(5); //40 yds\n+    sinfo->RecoveryTime = 120000;\n+    sinfo->StartRecoveryCategory = 133;\n+    sinfo->StartRecoveryTime = 1500;\n+    sinfo->ManaCost = 250 * 5;\n+    sinfo->ExplicitTargetMask = TARGET_FLAG_DEST_LOCATION;\n+    sinfo->Attributes |= SPELL_ATTR0_ABILITY | SPELL_ATTR0_DONT_AFFECT_SHEATH_STATE | SPELL_ATTR0_OUTDOORS_ONLY;\n+    sinfo->AttributesEx2 |= SPELL_ATTR2_CANT_CRIT | SPELL_ATTR2_CAN_TARGET_NOT_IN_LOS;\n+    sinfo->AttributesEx3 |= SPELL_ATTR3_IGNORE_HIT_RESULT | SPELL_ATTR3_NO_DONE_BONUS;\n+    sinfo->AttributesEx3 &= ~(SPELL_ATTR3_ONLY_TARGET_PLAYERS);\n+    sinfo->AttributesEx4 = 0;\n+\n+    sinfo->_effects[0].Effect = SPELL_EFFECT_DUMMY;\n+    sinfo->_effects[0].TargetA = SpellImplicitTargetInfo(TARGET_DEST_DEST);\n+    sinfo->_effects[0].TargetB = SpellImplicitTargetInfo(0);\n+    sinfo->_effects[0].RadiusEntry = nullptr;\n+    sinfo->_effects[0].BasePoints = 1;\n+    sinfo->_effects[0].TriggerSpell = 0;\n+    sinfo->_effects[0].Amplitude = 0;\n+    sinfo->_effects[1].Effect = SPELL_EFFECT_NONE;\n+    //40) END TORNADO\n+\n+    //41) TORNADO EFFECT\n+    spellId = SPELL_TORNADO_EFFECT; //21990\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellFamilyName = SPELLFAMILY_MAGE;\n+    //sinfo->SpellFamilyFlags[0] = 0x0;\n+    sinfo->SpellFamilyFlags[1] = 0x4; //custom, not present in db\n+    //sinfo->SpellFamilyFlags[2] = 0x0;\n+    sinfo->SchoolMask = SPELL_SCHOOL_MASK_NATURE | SPELL_SCHOOL_MASK_ARCANE;\n+    sinfo->Dispel = DISPEL_MAGIC;\n+    sinfo->Mechanic = MECHANIC_NONE; //MECHANIC_KNOCKOUT\n+    sinfo->InterruptFlags = 0x0;\n+    sinfo->SpellLevel = 60;\n+    sinfo->BaseLevel = 60;\n+    sinfo->MaxTargetLevel = 0;\n+    sinfo->DurationEntry = sSpellDurationStore.LookupEntry(29); //12000ms\n+    sinfo->CastTimeEntry = sSpellCastTimesStore.LookupEntry(1); //0ms\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(2); //5 yds\n+    sinfo->RecoveryTime = 3000;\n+    //sinfo->StartRecoveryCategory = 133;\n+    //sinfo->StartRecoveryTime = 1500;\n+    //sinfo->ManaCost = 250 * 5;\n+    sinfo->MaxAffectedTargets = 1;\n+    sinfo->ExplicitTargetMask = TARGET_FLAG_UNIT;\n+    sinfo->Attributes |= SPELL_ATTR0_ABILITY | SPELL_ATTR0_DONT_AFFECT_SHEATH_STATE | SPELL_ATTR0_OUTDOORS_ONLY;\n+    sinfo->Attributes &= ~(SPELL_ATTR0_HEARTBEAT_RESIST_CHECK);\n+    sinfo->AttributesEx2 |= SPELL_ATTR2_CANT_CRIT | SPELL_ATTR2_CAN_TARGET_NOT_IN_LOS;\n+    sinfo->AttributesEx3 |= SPELL_ATTR3_IGNORE_HIT_RESULT | SPELL_ATTR3_NO_DONE_BONUS;\n+    sinfo->AttributesEx3 &= ~(SPELL_ATTR3_ONLY_TARGET_PLAYERS);\n+    sinfo->AttributesEx4 = 0;\n+    sinfo->AttributesEx5 = 0;\n+\n+    //sinfo->_effects[0].Effect = SPELL_EFFECT_DUMMY;\n+    //sinfo->_effects[0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ENEMY);\n+    //sinfo->_effects[0].TargetB = SpellImplicitTargetInfo(0);\n+    //sinfo->_effects[0].RadiusEntry = nullptr;\n+    //sinfo->_effects[0].BasePoints = 1;\n+    //sinfo->_effects[0].TriggerSpell = 0;\n+    //sinfo->_effects[0].Amplitude = 0;\n+    sinfo->_effects[1].Effect = SPELL_EFFECT_APPLY_AURA;\n+    sinfo->_effects[1].ApplyAuraName = SPELL_AURA_MOD_RESISTANCE_PCT;\n+    sinfo->_effects[1].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ENEMY);\n+    sinfo->_effects[1].TargetB = SpellImplicitTargetInfo(0);\n+    sinfo->_effects[1].BasePoints = -100;\n+    sinfo->_effects[1].MiscValue = SPELL_SCHOOL_MASK_ALL;\n+    sinfo->_effects[2].Effect = SPELL_EFFECT_APPLY_AURA;\n+    sinfo->_effects[2].ApplyAuraName = SPELL_AURA_PERIODIC_DAMAGE;\n+    sinfo->_effects[2].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ENEMY);\n+    sinfo->_effects[2].TargetB = SpellImplicitTargetInfo(0);\n+    sinfo->_effects[2].BasePoints = 212;\n+    sinfo->_effects[2].DieSides = 183;\n+    sinfo->_effects[2].RealPointsPerLevel = 35.f;\n+    sinfo->_effects[2].BonusCoefficient = 0.25f;\n+    sinfo->_effects[2].Amplitude = 1500;\n+    //41) END TORNADO EFFECT\n+\n+    //42) TORNADO EFFECT2\n+    spellId = SPELL_TORNADO_EFFECT2; //34683\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellFamilyName = SPELLFAMILY_MAGE;\n+    //sinfo->SpellFamilyFlags[0] = 0x0;\n+    //sinfo->SpellFamilyFlags[1] = 0x4; //custom, not present in db\n+    //sinfo->SpellFamilyFlags[2] = 0x0;\n+    sinfo->SchoolMask = SPELL_SCHOOL_MASK_NATURE | SPELL_SCHOOL_MASK_ARCANE;\n+    //sinfo->Dispel = DISPEL_MAGIC;\n+    //sinfo->Mechanic = MECHANIC_DISORIENTED;\n+    sinfo->ProcFlags = 0;\n+    sinfo->InterruptFlags = 0x0;\n+    sinfo->SpellLevel = 60;\n+    sinfo->BaseLevel = 60;\n+    sinfo->MaxTargetLevel = 0;\n+    sinfo->DurationEntry = nullptr;\n+    //sinfo->CastTimeEntry = sSpellCastTimesStore.LookupEntry(1); //0ms\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(7); //10 yds\n+    sinfo->RecoveryTime = 4500;\n+    //sinfo->StartRecoveryCategory = 133;\n+    //sinfo->StartRecoveryTime = 1500;\n+    //sinfo->ManaCost = 250 * 5;\n+    sinfo->MaxAffectedTargets = 1;\n+    sinfo->ExplicitTargetMask = TARGET_FLAG_UNIT;\n+    sinfo->Attributes |= SPELL_ATTR0_DONT_AFFECT_SHEATH_STATE | SPELL_ATTR0_OUTDOORS_ONLY;\n+    sinfo->Attributes &= ~(SPELL_ATTR0_UNK11);\n+    sinfo->AttributesEx2 |= SPELL_ATTR2_CAN_TARGET_NOT_IN_LOS;\n+    sinfo->AttributesEx3 |= SPELL_ATTR3_IGNORE_HIT_RESULT;\n+    sinfo->AttributesEx4 = 0;\n+    sinfo->AttributesEx5 = 0;\n+\n+    sinfo->_effects[0].Effect = SPELL_EFFECT_SCHOOL_DAMAGE;\n+    sinfo->_effects[0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ENEMY);\n+    sinfo->_effects[0].TargetB = SpellImplicitTargetInfo(0);\n+    //sinfo->_effects[0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_10_YARDS);\n+    sinfo->_effects[0].BasePoints = 541;\n+    sinfo->_effects[0].DieSides = 215;\n+    sinfo->_effects[0].RealPointsPerLevel = 40.f;\n+    sinfo->_effects[0].BonusCoefficient = 0.5f;\n+    //42) END TORNADO EFFECT2\n+\n+    //43) TORNADO EFFECT3\n+    spellId = SPELL_TORNADO_EFFECT3; //39261\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellFamilyName = SPELLFAMILY_MAGE;\n+    //sinfo->SpellFamilyFlags[0] = 0x0;\n+    //sinfo->SpellFamilyFlags[1] = 0x4; //custom, not present in db\n+    //sinfo->SpellFamilyFlags[2] = 0x0;\n+    sinfo->SchoolMask = SPELL_SCHOOL_MASK_NATURE | SPELL_SCHOOL_MASK_ARCANE;\n+    //sinfo->Dispel = DISPEL_NONE;\n+    //sinfo->Mechanic = MECHANIC_DISORIENTED;\n+    //sinfo->ProcFlags = 0;\n+    //sinfo->InterruptFlags = 0x0;\n+    sinfo->SpellLevel = 0;\n+    sinfo->BaseLevel = 0;\n+    //sinfo->MaxTargetLevel = 0;\n+    sinfo->DurationEntry = sSpellDurationStore.LookupEntry(21); //-1\n+    //sinfo->CastTimeEntry = sSpellCastTimesStore.LookupEntry(1); //0ms\n+    //sinfo->RangeEntry = sSpellRangeStore.LookupEntry(1); //self\n+    //sinfo->RecoveryTime = 4500;\n+    //sinfo->StartRecoveryCategory = 133;\n+    //sinfo->StartRecoveryTime = 1500;\n+    //sinfo->ManaCost = 250 * 5;\n+    //sinfo->MaxAffectedTargets = 1;\n+    //sinfo->ExplicitTargetMask = TARGET_FLAG_UNIT;\n+    sinfo->Attributes |= SPELL_ATTR0_DONT_AFFECT_SHEATH_STATE | SPELL_ATTR0_OUTDOORS_ONLY;\n+    sinfo->AttributesEx |= SPELL_ATTR1_NO_THREAT;\n+    sinfo->AttributesEx2 |= SPELL_ATTR2_CAN_TARGET_NOT_IN_LOS;\n+    sinfo->AttributesEx3 |= SPELL_ATTR3_IGNORE_HIT_RESULT;\n+    sinfo->AttributesEx4 = 0;\n+    sinfo->AttributesEx5 = 0;\n+\n+    sinfo->_effects[0].Effect = SPELL_EFFECT_APPLY_AREA_AURA_ENEMY;\n+    //sinfo->_effects[0].ApplyAuraName = SPELL_AURA_MOD_DECREASE_SPEED;\n+    //sinfo->_effects[0].TargetA = SpellImplicitTargetInfo(TARGET_SRC_CASTER);\n+    //sinfo->_effects[0].TargetB = SpellImplicitTargetInfo(TARGET_UNIT_SRC_AREA_ENEMY);\n+    sinfo->_effects[0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_5_YARDS);\n+    //sinfo->_effects[0].BasePoints = -50;\n+    sinfo->_effects[1].Effect = SPELL_EFFECT_APPLY_AREA_AURA_ENEMY;\n+    sinfo->_effects[1].ApplyAuraName = SPELL_AURA_MOD_DECREASE_SPEED;\n+    sinfo->_effects[1].TargetA = SpellImplicitTargetInfo(TARGET_SRC_CASTER);\n+    sinfo->_effects[1].TargetB = SpellImplicitTargetInfo(TARGET_UNIT_SRC_AREA_ENEMY);\n+    sinfo->_effects[1].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_5_YARDS);\n+    sinfo->_effects[1].BasePoints = -60;\n+    //sinfo->AttributesCu &= ~(SPELL_ATTR0_CU_NEGATIVE_EFF1);\n+    //43) END TORNADO EFFECT3\n+\n+    //44) SHOOT\n+    spellId = SPELL_SHOOT_BOW; //41188\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellFamilyName = SPELLFAMILY_MAGE;\n+    sinfo->DmgClass = SPELL_DAMAGE_CLASS_RANGED;\n+    sinfo->PreventionType = SPELL_PREVENTION_TYPE_PACIFY;\n+    sinfo->SpellLevel = 1;\n+    sinfo->BaseLevel = 1;\n+    sinfo->CategoryEntry = sSpellCategoryStore.LookupEntry(76);\n+    sinfo->CastTimeEntry = sSpellCastTimesStore.LookupEntry(110); //750ms\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(35); //0-35 yds\n+    sinfo->StartRecoveryCategory = 133;\n+    sinfo->StartRecoveryTime = 750;\n+    sinfo->ExplicitTargetMask = TARGET_FLAG_UNIT;\n+    sinfo->Attributes |= SPELL_ATTR0_IMPOSSIBLE_DODGE_PARRY_BLOCK/* | SPELL_ATTR0_DONT_AFFECT_SHEATH_STATE*/;\n+    sinfo->Attributes &= ~(SPELL_ATTR0_REQ_AMMO/* | SPELL_ATTR0_ABILITY*/ | SPELL_ATTR0_CAST_TRACK_TARGET | SPELL_ATTR0_LEVEL_DAMAGE_CALCULATION | SPELL_ATTR0_UNAFFECTED_BY_INVULNERABILITY);\n+    sinfo->AttributesEx |= SPELL_ATTR1_CANT_BE_REDIRECTED | SPELL_ATTR1_CANT_BE_REFLECTED;\n+    sinfo->AttributesEx &= ~(SPELL_ATTR1_CHANNEL_TRACK_TARGET | SPELL_ATTR1_NO_THREAT);\n+    sinfo->AttributesEx2 |= SPELL_ATTR2_NOT_RESET_AUTO_ACTIONS;\n+    sinfo->AttributesEx2 &= ~(SPELL_ATTR2_CAN_TARGET_NOT_IN_LOS);\n+    sinfo->AttributesEx3 |= SPELL_ATTR3_UNK15;\n+\n+    sinfo->_effects[0].Effect = SPELL_EFFECT_WEAPON_PERCENT_DAMAGE;\n+    sinfo->_effects[0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ENEMY);\n+    sinfo->_effects[0].TargetB = SpellImplicitTargetInfo(0);\n+    sinfo->_effects[0].BasePoints = 100;\n+    sinfo->_effects[0].DieSides = 0;\n+    sinfo->_effects[0].BonusCoefficient = 1.f;\n+    //44) END SHOOT\n+\n+    //CRYPT LORD\n+    //45) IMPALE\n+    spellId = SPELL_IMPALE; //53458\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellFamilyName = SPELLFAMILY_WARRIOR;\n+    sinfo->PreventionType = SPELL_PREVENTION_TYPE_PACIFY;\n+    sinfo->SpellLevel = 20;\n+    sinfo->BaseLevel = 20;\n+    sinfo->CategoryEntry = nullptr;\n+    sinfo->RecoveryTime = 9000;\n+    sinfo->CategoryRecoveryTime = 0;\n+    sinfo->StartRecoveryCategory = 133;\n+    sinfo->StartRecoveryTime = 1500;\n+    sinfo->PowerType = POWER_MANA;\n+    sinfo->ManaCost = 100 * 5;\n+    sinfo->MaxAffectedTargets = 0;\n+    sinfo->InterruptFlags = 0x1;\n+    sinfo->ChannelInterruptFlags = 0x0;\n+    sinfo->CastTimeEntry = sSpellCastTimesStore.LookupEntry(1); //0\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(5); //40 yds\n+    sinfo->DurationEntry = sSpellDurationStore.LookupEntry(592); //400ms\n+    sinfo->ExplicitTargetMask = TARGET_FLAG_UNIT;\n+    sinfo->Attributes |= SPELL_ATTR0_HIDDEN_CLIENTSIDE | SPELL_ATTR0_ABILITY;\n+    sinfo->AttributesEx |= SPELL_ATTR1_CHANNELED_2 | SPELL_ATTR1_CHANNEL_TRACK_TARGET | SPELL_ATTR1_NO_THREAT;\n+    sinfo->AttributesEx2 |= SPELL_ATTR2_CAN_TARGET_NOT_IN_LOS;\n+    sinfo->AttributesEx3 |= SPELL_ATTR3_NO_INITIAL_AGGRO;\n+\n+    sinfo->_effects[0].Effect = SPELL_EFFECT_APPLY_AURA;\n+    sinfo->_effects[0].ApplyAuraName = SPELL_AURA_DUMMY;\n+    sinfo->_effects[0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_CONE_ENEMY_24);\n+    sinfo->_effects[0].TargetB = SpellImplicitTargetInfo(0);\n+    sinfo->_effects[0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_40_YARDS);\n+    sinfo->_effects[0].MiscValue = 0;\n+    sinfo->_effects[0].MiscValueB = 0;\n+    sinfo->_effects[0].BasePoints = 1;\n+    sinfo->_effects[0].Amplitude = 0;\n+    sinfo->_effects[0].RealPointsPerLevel = 0.0f;\n+    sinfo->_effects[0].DieSides = 0;\n+    sinfo->_effects[0].ChainAmplitude = 0.0f;\n+    sinfo->_effects[0].BonusCoefficient = 0.0f;\n+\n+    sinfo->_effects[1].Effect = SPELL_EFFECT_APPLY_AURA;\n+    sinfo->_effects[1].ApplyAuraName = SPELL_AURA_DUMMY;\n+    sinfo->_effects[1].TargetA = SpellImplicitTargetInfo(TARGET_SRC_CASTER);\n+    sinfo->_effects[1].TargetB = SpellImplicitTargetInfo(TARGET_UNIT_SRC_AREA_ENEMY);\n+    sinfo->_effects[1].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_8_YARDS);\n+    sinfo->_effects[1].MiscValue = 0;\n+    sinfo->_effects[1].MiscValueB = 0;\n+    sinfo->_effects[1].BasePoints = 1;\n+    sinfo->_effects[1].Amplitude = 0;\n+    sinfo->_effects[1].RealPointsPerLevel = 0.0f;\n+    sinfo->_effects[1].DieSides = 0;\n+    sinfo->_effects[1].ChainAmplitude = 0.0f;\n+    sinfo->_effects[1].BonusCoefficient = 0.0f;\n+    //45) END IMPALE\n+\n+    //46) IMPALE DAMAGE\n+    spellId = SPELL_IMPALE_DAMAGE; //53454\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellFamilyName = SPELLFAMILY_WARRIOR;\n+    sinfo->PreventionType = SPELL_PREVENTION_TYPE_NONE;\n+    sinfo->SpellLevel = 20;\n+    sinfo->BaseLevel = 20;\n+    sinfo->CategoryEntry = nullptr;\n+    sinfo->RecoveryTime = 0;\n+    sinfo->CategoryRecoveryTime = 0;\n+    sinfo->StartRecoveryCategory = 0;\n+    sinfo->StartRecoveryTime = 0;\n+    sinfo->PowerType = POWER_MANA;\n+    sinfo->ManaCost = 0;\n+    sinfo->MaxAffectedTargets = 1;\n+    sinfo->ChannelInterruptFlags = 0;\n+    sinfo->CastTimeEntry = sSpellCastTimesStore.LookupEntry(1); //0\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(36); //45 yds\n+    sinfo->DurationEntry = sSpellDurationStore.LookupEntry(32); //6000ms\n+    sinfo->ExplicitTargetMask = TARGET_FLAG_UNIT_ENEMY;\n+    sinfo->Attributes |= SPELL_ATTR0_ABILITY | SPELL_ATTR0_DONT_AFFECT_SHEATH_STATE | SPELL_ATTR0_CASTABLE_WHILE_DEAD | SPELL_ATTR0_CASTABLE_WHILE_SITTING;\n+    sinfo->AttributesEx |= SPELL_ATTR1_CANT_BE_REFLECTED | SPELL_ATTR1_CANT_BE_REDIRECTED;\n+    sinfo->AttributesEx2 |= SPELL_ATTR2_CAN_TARGET_NOT_IN_LOS;\n+    sinfo->AttributesEx3 |= SPELL_ATTR3_IGNORE_HIT_RESULT;\n+    sinfo->AttributesEx5 |= SPELL_ATTR5_USABLE_WHILE_STUNNED;\n+    sinfo->AttributesEx6 |= SPELL_ATTR6_CASTABLE_WHILE_ON_VEHICLE | SPELL_ATTR6_CAN_TARGET_INVISIBLE;\n+\n+    sinfo->_effects[0].Effect = SPELL_EFFECT_SCHOOL_DAMAGE;\n+    sinfo->_effects[0].ApplyAuraName = SPELL_AURA_NONE;\n+    sinfo->_effects[0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ENEMY);\n+    sinfo->_effects[0].TargetB = SpellImplicitTargetInfo(0);\n+    sinfo->_effects[0].RadiusEntry = nullptr;\n+    sinfo->_effects[0].MiscValue = 0;\n+    sinfo->_effects[0].MiscValueB = 0;\n+    sinfo->_effects[0].BasePoints = 150;\n+    sinfo->_effects[0].Amplitude = 0;\n+    sinfo->_effects[0].RealPointsPerLevel = 35.0f;\n+    sinfo->_effects[0].DieSides = 200;\n+    sinfo->_effects[0].ChainAmplitude = 0.0f;\n+    sinfo->_effects[0].BonusCoefficient = 0.0f;\n+\n+    sinfo->_effects[1].Effect = SPELL_EFFECT_KNOCK_BACK;\n+    sinfo->_effects[1].ApplyAuraName = SPELL_AURA_NONE;\n+    sinfo->_effects[1].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ENEMY);\n+    sinfo->_effects[1].TargetB = SpellImplicitTargetInfo(0);\n+    sinfo->_effects[1].RadiusEntry = nullptr;\n+    sinfo->_effects[1].Mechanic = MECHANIC_KNOCKOUT;\n+    sinfo->_effects[1].MiscValue = 5;\n+    sinfo->_effects[1].MiscValueB = 0;\n+    sinfo->_effects[1].BasePoints = 180;\n+    sinfo->_effects[1].Amplitude = 0;\n+    sinfo->_effects[1].RealPointsPerLevel = 0.0;\n+    sinfo->_effects[1].DieSides = 0;\n+    sinfo->_effects[1].ChainAmplitude = 0.0f;\n+    sinfo->_effects[1].BonusCoefficient = 0.0f;\n+\n+    sinfo->_effects[2].Effect = SPELL_EFFECT_APPLY_AURA;\n+    sinfo->_effects[2].ApplyAuraName = SPELL_AURA_MOD_STUN;\n+    //sinfo->_effects[2].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ENEMY);\n+    //sinfo->_effects[2].TargetB = SpellImplicitTargetInfo(0);\n+    sinfo->_effects[2].TargetA = sinfo->_effects[0].TargetA;\n+    sinfo->_effects[2].TargetB = sinfo->_effects[0].TargetB;\n+    sinfo->_effects[2].RadiusEntry = nullptr;\n+    sinfo->_effects[2].Mechanic = MECHANIC_NONE;\n+    sinfo->_effects[2].MiscValue = 0;\n+    sinfo->_effects[2].MiscValueB = 0;\n+    sinfo->_effects[2].BasePoints = 1;\n+    sinfo->_effects[2].Amplitude = 0;\n+    sinfo->_effects[2].RealPointsPerLevel = 0.0;\n+    sinfo->_effects[2].DieSides = 0;\n+    sinfo->_effects[2].ChainAmplitude = 0.0f;\n+    sinfo->_effects[2].BonusCoefficient = 0.0f;\n+    //46) END IMPALE DAMAGE\n+\n+    //47) IMPALE VISUAL\n+    spellId = SPELL_IMPALE_VISUAL; //53454\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellFamilyName = SPELLFAMILY_WARRIOR;\n+    sinfo->PreventionType = SPELL_PREVENTION_TYPE_NONE;\n+    sinfo->SpellLevel = 20;\n+    sinfo->BaseLevel = 20;\n+    sinfo->CategoryEntry = nullptr;\n+    sinfo->RecoveryTime = 0;\n+    sinfo->CategoryRecoveryTime = 0;\n+    sinfo->StartRecoveryCategory = 0;\n+    sinfo->StartRecoveryTime = 0;\n+    sinfo->PowerType = POWER_MANA;\n+    sinfo->ManaCost = 0;\n+    sinfo->MaxAffectedTargets = 1;\n+    sinfo->ChannelInterruptFlags = 0;\n+    sinfo->CastTimeEntry = sSpellCastTimesStore.LookupEntry(1); //0\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(36); //45 yds\n+    sinfo->ExplicitTargetMask = TARGET_FLAG_DEST_LOCATION;\n+    sinfo->Attributes |= SPELL_ATTR0_ABILITY | SPELL_ATTR0_DONT_AFFECT_SHEATH_STATE | SPELL_ATTR0_CASTABLE_WHILE_DEAD | SPELL_ATTR0_CASTABLE_WHILE_SITTING;\n+    sinfo->AttributesEx |= SPELL_ATTR1_CANT_BE_REFLECTED | SPELL_ATTR1_CANT_BE_REDIRECTED | SPELL_ATTR1_NO_THREAT;\n+    sinfo->AttributesEx2 |= SPELL_ATTR2_CAN_TARGET_NOT_IN_LOS;\n+    sinfo->AttributesEx3 |= SPELL_ATTR3_IGNORE_HIT_RESULT | SPELL_ATTR3_NO_INITIAL_AGGRO;\n+    sinfo->AttributesEx5 |= SPELL_ATTR5_USABLE_WHILE_STUNNED;\n+    sinfo->AttributesEx6 |= SPELL_ATTR6_CASTABLE_WHILE_ON_VEHICLE | SPELL_ATTR6_CAN_TARGET_INVISIBLE;\n+\n+    sinfo->_effects[0].Effect = SPELL_EFFECT_DUMMY;\n+    sinfo->_effects[0].ApplyAuraName = SPELL_AURA_NONE;\n+    sinfo->_effects[0].TargetA = SpellImplicitTargetInfo(TARGET_DEST_DEST);\n+    sinfo->_effects[0].TargetB = SpellImplicitTargetInfo(0);\n+    sinfo->_effects[0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_0_5_YARDS);\n+    sinfo->_effects[0].MiscValue = 0;\n+    sinfo->_effects[0].MiscValueB = 0;\n+    sinfo->_effects[0].BasePoints = 1;\n+    sinfo->_effects[0].Amplitude = 0;\n+    sinfo->_effects[0].RealPointsPerLevel = 0.0f;\n+    sinfo->_effects[0].DieSides = 0;\n+    sinfo->_effects[0].ChainAmplitude = 0.0f;\n+    sinfo->_effects[0].BonusCoefficient = 0.0f;\n+\n+    sinfo->_effects[1].Effect = SPELL_EFFECT_NONE;\n+    sinfo->_effects[1].ApplyAuraName = SPELL_AURA_NONE;\n+    sinfo->_effects[1].TargetA = SpellImplicitTargetInfo(0);\n+    sinfo->_effects[1].TargetB = SpellImplicitTargetInfo(0);\n+    sinfo->_effects[1].RadiusEntry = nullptr;\n+    sinfo->_effects[1].MiscValueB = 0;\n+    sinfo->_effects[1].BasePoints = 0;\n+    sinfo->_effects[1].Amplitude = 0;\n+    sinfo->_effects[1].RealPointsPerLevel = 0.0;\n+    sinfo->_effects[1].DieSides = 0;\n+    sinfo->_effects[1].ChainAmplitude = 0.0f;\n+    sinfo->_effects[1].BonusCoefficient = 0.0f;\n+    //47) END IMPALE VISUAL\n+\n+    //48) CARRION BEETLES\n+    spellId = SPELL_CARRION_BEETLES; //53520\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellFamilyName = SPELLFAMILY_WARRIOR;\n+    sinfo->PreventionType = SPELL_PREVENTION_TYPE_PACIFY;\n+    sinfo->SpellLevel = 10;\n+    sinfo->BaseLevel = 10;\n+    sinfo->RecoveryTime = 6000;\n+    sinfo->StartRecoveryCategory = 133;\n+    sinfo->StartRecoveryTime = 1500;\n+    sinfo->PowerType = POWER_MANA;\n+    sinfo->ManaCost = 50 * 5;\n+    sinfo->MaxAffectedTargets = 1;\n+    sinfo->InterruptFlags = 0x1;\n+    sinfo->ChannelInterruptFlags = 0x100C;\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(4); //30 yds\n+    sinfo->DurationEntry = sSpellDurationStore.LookupEntry(327); //500ms // (36); // 1000ms // (327); //500ms\n+    sinfo->ExplicitTargetMask = TARGET_FLAG_CORPSE_ENEMY;\n+    sinfo->Attributes |= SPELL_ATTR0_HIDDEN_CLIENTSIDE | SPELL_ATTR0_ABILITY;\n+    sinfo->AttributesEx |= SPELL_ATTR1_CHANNEL_TRACK_TARGET;\n+    sinfo->AttributesEx2 |= SPELL_ATTR2_CAN_TARGET_DEAD;\n+\n+    sinfo->_effects[0].Effect = SPELL_EFFECT_DUMMY;\n+    sinfo->_effects[0].ApplyAuraName = SPELL_AURA_NONE;\n+    sinfo->_effects[0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ANY);\n+    sinfo->_effects[0].TargetB = SpellImplicitTargetInfo(0);\n+    sinfo->_effects[0].BasePoints = 1;\n+    sinfo->_effects[0].Amplitude = 500;\n+    sinfo->_effects[0].RealPointsPerLevel = 0.0f;\n+    sinfo->_effects[0].DieSides = 0;\n+    sinfo->_effects[0].ChainAmplitude = 0.0f;\n+    sinfo->_effects[0].BonusCoefficient = 0.0f;\n+    //48) END CARRION BEETLES\n+\n+    //49) LOCUST SWARM\n+    spellId = SPELL_LOCUST_SWARM; //28785\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellFamilyName = SPELLFAMILY_WARRIOR;\n+    sinfo->PreventionType = SPELL_PREVENTION_TYPE_PACIFY;\n+    sinfo->SpellLevel = 40;\n+    sinfo->BaseLevel = 40;\n+    sinfo->CategoryEntry = nullptr;\n+    sinfo->RecoveryTime = 180000;\n+    sinfo->CategoryRecoveryTime = 0;\n+    sinfo->StartRecoveryCategory = 133;\n+    sinfo->StartRecoveryTime = 1500;\n+    sinfo->PowerType = POWER_MANA;\n+    sinfo->ManaCost = 50 * 5;\n+    sinfo->MaxAffectedTargets = 0;\n+    sinfo->StackAmount = 0;\n+    sinfo->InterruptFlags = 0x1;\n+    sinfo->ChannelInterruptFlags = 0x100C;\n+    sinfo->CastTimeEntry = sSpellCastTimesStore.LookupEntry(1); //0\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(4); //30 yds\n+    sinfo->DurationEntry = sSpellDurationStore.LookupEntry(35); //4000ms\n+    sinfo->ExplicitTargetMask = TARGET_FLAG_UNIT;\n+    sinfo->Attributes |= SPELL_ATTR0_HIDDEN_CLIENTSIDE | SPELL_ATTR0_HIDE_IN_COMBAT_LOG;\n+    sinfo->AttributesEx |= SPELL_ATTR1_CHANNELED_2 | SPELL_ATTR1_DONT_DISPLAY_IN_AURA_BAR | SPELL_ATTR1_NO_THREAT;\n+    sinfo->AttributesEx3 |= SPELL_ATTR3_NO_INITIAL_AGGRO;\n+\n+    sinfo->_effects[0].Effect = SPELL_EFFECT_APPLY_AURA;\n+    sinfo->_effects[0].ApplyAuraName = SPELL_AURA_DUMMY;\n+    sinfo->_effects[0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_CASTER);\n+    sinfo->_effects[0].TargetB = SpellImplicitTargetInfo(0);\n+    sinfo->_effects[0].TriggerSpell = 0;\n+    sinfo->_effects[0].RadiusEntry = nullptr;\n+    sinfo->_effects[0].MiscValue = 0;\n+    sinfo->_effects[0].MiscValueB = 0;\n+    sinfo->_effects[0].BasePoints = 1;\n+    sinfo->_effects[0].Amplitude = 0;\n+    sinfo->_effects[0].RealPointsPerLevel = 0.0f;\n+    sinfo->_effects[0].DieSides = 0;\n+    sinfo->_effects[0].ChainAmplitude = 0.0f;\n+    sinfo->_effects[0].BonusCoefficient = 0.0f;\n+\n+    for (uint8 i = EFFECT_1; i < MAX_SPELL_EFFECTS; ++i)\n+    {\n+        sinfo->_effects[i].Effect = SPELL_EFFECT_NONE;\n+        sinfo->_effects[i].ApplyAuraName = SPELL_AURA_NONE;\n+        sinfo->_effects[i].TargetA = SpellImplicitTargetInfo(0);\n+        sinfo->_effects[i].TargetB = SpellImplicitTargetInfo(0);\n+        sinfo->_effects[i].RadiusEntry = nullptr;\n+        sinfo->_effects[i].MiscValue = 0;\n+        sinfo->_effects[i].MiscValueB = 0;\n+        sinfo->_effects[i].BasePoints = 0;\n+        sinfo->_effects[i].Amplitude = 0;\n+        sinfo->_effects[i].RealPointsPerLevel = 0.0f;\n+        sinfo->_effects[i].DieSides = 0;\n+        sinfo->_effects[i].ChainAmplitude = 0.0f;\n+        sinfo->_effects[i].BonusCoefficient = 0.0f;\n+    }\n+    //49) END LOCUST SWARM\n+\n+    //50) SOUL BITE\n+    spellId = SPELL_SOUL_BITE; //11016\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SpellFamilyName = SPELLFAMILY_WARRIOR;\n+    sinfo->PreventionType = SPELL_PREVENTION_TYPE_PACIFY;\n+    sinfo->SchoolMask = SPELL_SCHOOL_MASK_SHADOW | SPELL_SCHOOL_MASK_ARCANE;\n+    sinfo->SpellLevel = 40;\n+    sinfo->BaseLevel = 40;\n+    sinfo->CategoryEntry = nullptr;\n+    sinfo->RecoveryTime = 0;\n+    sinfo->CategoryRecoveryTime = 0;\n+    sinfo->StartRecoveryCategory = 0;\n+    sinfo->StartRecoveryTime = 0;\n+    sinfo->PowerType = POWER_MANA;\n+    sinfo->ManaCost = 0;\n+    sinfo->MaxAffectedTargets = 0;\n+    sinfo->StackAmount = 10;\n+    sinfo->ChannelInterruptFlags = 0;\n+    sinfo->CastTimeEntry = sSpellCastTimesStore.LookupEntry(1); //0\n+    sinfo->RangeEntry = sSpellRangeStore.LookupEntry(11); //15 yds\n+    sinfo->DurationEntry = sSpellDurationStore.LookupEntry(568); // 1250ms // (36); //1000ms\n+    sinfo->ExplicitTargetMask = TARGET_FLAG_UNIT;\n+    sinfo->Attributes |= SPELL_ATTR0_HIDE_IN_COMBAT_LOG;\n+    sinfo->AttributesEx |= SPELL_ATTR1_CANT_BE_REFLECTED | SPELL_ATTR1_CANT_BE_REDIRECTED;\n+    sinfo->AttributesEx2 |= SPELL_ATTR2_CANT_CRIT;\n+    sinfo->AttributesEx3 |= SPELL_ATTR3_NO_DONE_BONUS | SPELL_ATTR3_IGNORE_HIT_RESULT;\n+    sinfo->AttributesEx4 |= SPELL_ATTR4_FIXED_DAMAGE;\n+    sinfo->AttributesCu &= ~(SPELL_ATTR0_CU_CAN_CRIT);\n+\n+    sinfo->_effects[0].Effect = SPELL_EFFECT_HEALTH_LEECH;\n+    sinfo->_effects[0].ApplyAuraName = SPELL_AURA_NONE;\n+    sinfo->_effects[0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ENEMY);\n+    sinfo->_effects[0].TargetB = SpellImplicitTargetInfo(0);\n+    sinfo->_effects[0].RadiusEntry = nullptr;\n+    sinfo->_effects[0].MiscValue = 0;\n+    sinfo->_effects[0].MiscValueB = 0;\n+    sinfo->_effects[0].BasePoints = 10;\n+    sinfo->_effects[0].Amplitude = 0;\n+    sinfo->_effects[0].RealPointsPerLevel = 0.0f;\n+    sinfo->_effects[0].DieSides = 25;\n+    sinfo->_effects[0].ChainAmplitude = 0.0f;\n+    sinfo->_effects[0].Amplitude = 0.0f;\n+    sinfo->_effects[0].BonusCoefficient = 0.0f;\n+\n+    sinfo->_effects[1].Effect = SPELL_EFFECT_APPLY_AURA;\n+    sinfo->_effects[1].ApplyAuraName = SPELL_AURA_MOD_PACIFY_SILENCE;\n+    sinfo->_effects[1].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ENEMY);\n+    sinfo->_effects[1].TargetB = SpellImplicitTargetInfo(0);\n+    sinfo->_effects[1].RadiusEntry = nullptr;\n+    sinfo->_effects[1].MiscValue = 0;\n+    sinfo->_effects[1].MiscValueB = 0;\n+    sinfo->_effects[1].BasePoints = 1;\n+    sinfo->_effects[1].Amplitude = 0;\n+    sinfo->_effects[1].RealPointsPerLevel = 0.0f;\n+    sinfo->_effects[1].DieSides = 0;\n+    sinfo->_effects[1].ChainAmplitude = 0.0f;\n+    sinfo->_effects[1].Amplitude = 0.0f;\n+    sinfo->_effects[1].BonusCoefficient = 0.0f;\n+\n+    sinfo->_effects[2].Effect = SPELL_EFFECT_APPLY_AURA;\n+    sinfo->_effects[2].ApplyAuraName = SPELL_AURA_MOD_DECREASE_SPEED;\n+    sinfo->_effects[2].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ENEMY);\n+    sinfo->_effects[2].TargetB = SpellImplicitTargetInfo(0);\n+    sinfo->_effects[2].Mechanic = MECHANIC_SNARE;\n+    sinfo->_effects[2].RadiusEntry = nullptr;\n+    sinfo->_effects[2].MiscValue = 0;\n+    sinfo->_effects[2].MiscValueB = 0;\n+    sinfo->_effects[2].BasePoints = -3;\n+    sinfo->_effects[2].Amplitude = 0;\n+    sinfo->_effects[2].RealPointsPerLevel = 0.0f;\n+    sinfo->_effects[2].DieSides = 0;\n+    sinfo->_effects[2].ChainAmplitude = 0.0f;\n+    sinfo->_effects[2].Amplitude = 0.0f;\n+    sinfo->_effects[2].BonusCoefficient = 0.0f;\n+    //50) END SOUL BITE\n+\n+    //51) ENERGIZE VISUAL\n+    spellId = SPELL_ENERGIZE_VISUAL; //59198\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+\n+    sinfo->SchoolMask = SPELL_SCHOOL_MASK_SHADOW;\n+    sinfo->SpellLevel = 1;\n+    sinfo->BaseLevel = 1;\n+\n+    sinfo->_effects[0].Effect = SPELL_EFFECT_DUMMY;\n+    sinfo->_effects[0].BasePoints = 0;\n+    sinfo->_effects[0].DieSides = 0;\n+    //51) END ENERGIZE VISUAL\n+\n+    //XX) FIXES\n+    spellId = 48155; // Mind Flay (Rank 8)\n+    botSpellInfoOverrides.insert({ spellId, *sSpellMgr->GetSpellInfo(spellId) });\n+    sinfo = &botSpellInfoOverrides.at(spellId);\n+    sinfo->InterruptFlags &= SPELL_INTERRUPT_FLAG_MOVEMENT;\n+\n+    for (auto& p : botSpellInfoOverrides)\n+    {\n+        for (auto& eff : p.second._effects)\n+        {\n+            eff.OverrideSpellInfo(&p.second);\n+        }\n+    }\n+\n+    BOT_LOG_INFO(\"server.loading\", \">> Bot spellInfo overrides generated for {} spells\", uint32(botSpellInfoOverrides.size()));\n+\n+    GenerateBotCustomSpellProcs();\n+}\ndiff --git a/src/server/game/AI/NpcBots/botspell.h b/src/server/game/AI/NpcBots/botspell.h\nnew file mode 100644\nindex 0000000000..9f2a129000\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/botspell.h\n@@ -0,0 +1,322 @@\n+#ifndef BOTSPELL_H\n+#define BOTSPELL_H\n+\n+#include \"Define.h\"\n+\n+/*\n+NpcBot System by Trickerer (onlysuffering@gmail.com)\n+Original patch from: LordPsyan https://bitbucket.org/lordpsyan/trinitycore-patches/src/3b8b9072280e/Individual/11185-BOTS-NPCBots.patch\n+*/\n+\n+class SpellInfo;\n+struct SpellProcEntry;\n+\n+enum BotSpells : uint32\n+{\n+//COMMON SPELLS\n+    PVPTRINKET                          = 42292,//PvP Trinket no CD\n+    BERSERK                             = 46587,//68378,//900%/150%\n+    MODEL_TRANSITION                    = 24753,//\"Trick\" cannot cast or attack\n+    SUMMONING_DISORIENTATION            = 32752,\n+    ACTIVATE_SPEC                       = 63645,//Activate Primary Spec\n+    WANDERER_HEARTHSTONE                = 54318,//\"Hearthsone\" no CD\n+    SUMMONING_STONE_EFFECT              = 59782,//Cast time 5s + Channeled 2m\n+    SHOOT_WAND                          = 5019,\n+    OPEN_FLAG_BG                        = 21651,\n+    ARENA_FLAG_TEAM_A_GOLD              = 32724,\n+    ARENA_FLAG_TEAM_A_GREEN             = 32725,\n+    ARENA_FLAG_TEAM_H_GOLD              = 35774,\n+    ARENA_FLAG_TEAM_H_GREEN             = 35775,\n+///Portals\n+    PORTAL_STORMWIND                    = 10059,\n+    PORTAL_IRONFORGE                    = 11416,\n+    PORTAL_DARNASSUS                    = 11419,\n+    PORTAL_EXODAR                       = 32266,\n+    PORTAL_SHATTRATH_A                  = 33691,\n+    PORTAL_THERAMORE                    = 49360,\n+    PORTAL_ORGRIMMAR                    = 11417,\n+    PORTAL_UNDERCITY                    = 11418,\n+    PORTAL_THUNDERBLUFF                 = 11420,\n+    PORTAL_SILVERMOON                   = 32267,\n+    PORTAL_SHATTRATH_H                  = 35717,\n+    PORTAL_STONARD                      = 49361,\n+    PORTAL_DALARAN                      = 53142,\n+///Passives\n+    DAMAGE_REDUCTION                    = 68066,//Vigilance, Blessing of Sanctuary, etc.\n+///Passives for Pets\n+    DAMAGEDONE_PASSIVE                  = 30147,//for custom value, Tamed Pet Passive (DND) physical at 0, magic at 1\n+    DAMAGETAKEN_PASSIVE                 = 35697,//for custom value, Pet Passive (DND), single effect (aura 87 at 0)\n+    SPELLDAMAGE_PASSIVE                 = 43922,//for custom value, Increase Spell Dam 473, single effect (aura 13 at 0)\n+    SPELLPENETRATION_PASSIVE            = 25975,//for custom value, Spell Penetration 10, single effect (aura 123 at 0)\n+    SPELLHASTE_PASSIVE                  = 44400,//for custom value, Netherwind Presence rank 1, single effect (aura 65 at 0)\n+    CRITBONUS_PASSIVE                   = 35695,//for custom value, Pet Passive (DND), spell at 0, physical at 1\n+///Racials\n+    RACIAL_EVERY_MAN_FOR_HIMSELF        = 59752,//pvp trinket effect, instant, 2 min cd\n+    RACIAL_BLOOD_FURY_WARLOCK           = 33702,//effect varies, 15 sec, 2 min cd\n+    RACIAL_BLOOD_FURY_SHAMAN            = 33697,\n+    RACIAL_BLOOD_FURY_OTHERS            = 20572,\n+    RACIAL_STONEFORM                    = 20594,//dispell disease, poison, bleed, instant, 2 min cd\n+    //RACIAL_FIND_TREASURE                = 2481,\n+    RACIAL_SHADOWMELD                   = 58984,//stealth, -threat, instant, 2 min cd\n+    RACIAL_WILL_OF_THE_FORSAKEN         = 7744,//dispel charm/fear/sleep, instant, 2 min cd, 45 sec category cd\n+    RACIAL_WARSTOMP                     = 20549,//2sec stun, casttime 500, 8yd, 2 min cd\n+    RACIAL_ESCAPE_ARTIST                = 20589,//dispel snare/root, instant, 1 min 45 sec cd\n+    RACIAL_BERSERKING                   = 26297,//haste all 20%, isntant, 3 min cd\n+    RACIAL_ARCANE_TORRENT_DEATHKNIGHT   = 50613,//2sec AoE silence + energize, instant, 2 min cd\n+    RACIAL_ARCANE_TORRENT_ROGUE         = 25046,\n+    RACIAL_ARCANE_TORRENT_OTHERS        = 28730,\n+    RACIAL_GIFT_OF_NAARU_WARRIOR        = 28880,//Hot over 15 sec, instant, 2 min cd\n+    RACIAL_GIFT_OF_NAARU_PALADIN        = 59542,\n+    RACIAL_GIFT_OF_NAARU_HUNTER         = 59543,\n+    RACIAL_GIFT_OF_NAARU_PRIEST         = 59544,\n+    RACIAL_GIFT_OF_NAARU_DEATHKNIGHT    = 59545,\n+    RACIAL_GIFT_OF_NAARU_SHAMAN         = 59547,\n+    RACIAL_GIFT_OF_NAARU_MAGE           = 59548,\n+//ADVANCED\n+    //SPELL_SUMMON_FELBLAZE_PREVISUAL     = 46350,//green splash impact head/torso\n+    //HONORLESS_TARGET                    = 2479,\n+    COSMETIC_TELEPORT_EFFECT            = 52096,//visual instant cast omni\n+    COSMETIC_RESURRECTION               = 58854,//visual instant cast self (castable while dead, hidden)\n+    SUMMON_DEMON_VISUAL                 = 6657,//SUMMON_SERPENT_MESSENGER\n+    CALL_PET_VISUAL                     = 30416,//QUEST_WOOD_CLEANSE_EFFECT\n+    SPELL_VERTEX_COLOR_BLACK            = 39662,//black color model full\n+    SPELL_VERTEX_COLOR_GREY             = 43355,//grey color model full\n+    SPELL_BLACK_HOLE_VISUAL_2           = 46235,//blackened+smoke trail med\n+////CUSTOM SPELLS - UNUSED IN CODE AND DB\n+  //common\n+  //modify\n+    SPELL_TRIGGERED_HEAL                = 25155,//hidden\n+    SPELL_TELEPORT_LOCAL                = 7794,//Teleport, no log\n+    SPELL_NULLIFY_POISON                = 550,//To convert into passive for bots\n+  //unmodify\n+    SPELL_ATTACK_MELEE_1H               = 42880,\n+    SPELL_TRIGGERED_ENERGIZE            = 60628,//hidden\n+    SPELL_BRIEF_STUN                    = 41421,//1sec stun\n+//BLADEMASTER\n+  //SPELLS\n+  //unmodify\n+    //SPELL_DEATH_GRIP_JUMP               = 49575,\n+/**/SPELL_CRITICAL_STRIKE               = 1132,\n+    SPELL_BURNING_BLADE_BLADEMASTER     = 32281,//horde flag visual\n+    SPELL_STUN_FREEZE_ANIM              = 59123,//stun forever, full stop\n+  //modify\n+    SPELL_TRANSPARENCY_50               = 44816,\n+/**/SPELL_NETHERWALK                    = 31599,\n+/**/SPELL_MIRROR_IMAGE_BM               = 69936,//blank spell\n+    SPELL_COMBAT_SPECIAL_2H_ATTACK      = 44079,//animation only\n+//SPHYNX\n+  //modify\n+    SPELL_SHADOW_BOLT1                  = 16408,\n+    SPELL_SHADOW_BLAST                  = 38085,\n+    //SPELL_SHADOW_BLAST_SPLASH           = 38205,\n+    SPELL_ATTACK_MELEE_RANDOM           = 42902,\n+    SHADOWFURY_VISUAL                   = 47444,//59912,\n+    SPELL_DEVOUR_MAGIC                  = 17012,//used by Spellmaw but no matter (this spell does not work as intended)\n+    SPELL_DRAIN_MANA                    = 25755,\n+    SPELL_REPLENISH_MANA                = 33394,//5406,\n+    SPELL_REPLENISH_HEALTH              = 34756,//regenerating aura\n+  //unmodify\n+    SPELL_DEVOUR_MAGIC_CASTER_IMPACT    = 50527,\n+    SPELL_DEVOUR_MAGIC_BEAM             = 54393,\n+//ARCHMAGE\n+  //modify\n+    SPELL_BRILLIANCE_AURA               = 1234,\n+    SPELL_FIREBALL                      = 9488,\n+    SPELL_BLIZZARD                      = 15783,\n+    SPELL_SUMMON_WATER_ELEMENTAL        = 35593,\n+    SPELL_WATERBOLT                     = 72898,\n+  //unmodify\n+//DREADLORD\n+  //modify\n+    SPELL_VAMPIRIC_AURA                 = 20810,\n+    SPELL_SLEEP                         = 20663,\n+    SPELL_CARRION_SWARM                 = 34240,\n+    SPELL_INFERNO                       = 12740, //summon infernal servant\n+    SPELL_INFERNO_METEOR_VISUAL         = 5739, //meteor strike infernal\n+  //unmodify\n+    SPELL_INFERNO_EFFECT                = 22703, //stun, damage (warlock spell)\n+    //SPELL_INFERNO_IMPACT_EXPLOSION      = 00000, //visual\n+//SPELLBREAKER\n+  //modify\n+    SPELL_STEAL_MAGIC                   = 30036, //used by Ethereal Spellfilcher\n+    SPELL_FEEDBACK                      = 32897,\n+    SPELL_STEAL_MAGIC_VISUAL            = 11084, // \"Shock\"\n+  //unmodify\n+//DARK RANGER\n+  //modify\n+    SPELL_BLACK_ARROW                   = 20733, //supposed to be used by Dark Ranger Clea\n+    SPELL_DRAIN_LIFE                    = 17238, //used by Maleki the Palid, supposed to be by Shadow Adept (31145)\n+    SPELL_SILENCE                       = 29943,\n+    //SPELL_CHARM                         = 11111, //\n+  //unmodify\n+//NECROMANCER\n+  //modify\n+    SPELL_SHADOW_BOLT2                  = 17509,\n+    SPELL_RAISE_DEAD                    = 34011,\n+    SPELL_UNHOLY_FRENZY                 = 52499,\n+    SPELL_CRIPPLE                       = 50379,\n+    SPELL_CORPSE_EXPLOSION              = 61614,\n+    //SPELL_BONE_SHIELD                   = 0,//27688, //NIY //NO VIABLE SPELLS\n+    //for Attract faction reaction must be adjusted at Object.cpp::GetFactionReactionTo(L2831)\n+    //SPELL_BLOOD_CURSE                   = 29933, //NIY for Attract //NO VIABLE SPELLS\n+  //unmodify\n+    CORPSE_EXPLOSION_VISUAL             = 60081, //explosion\n+//NAGA SEA WITCH\n+  //modify\n+    SPELL_FORKED_LIGHTNING              = 63541,\n+    SPELL_FORKED_LIGHTNING_EFFECT       = 50900, // \"Lightning Shock\"\n+    SPELL_FROST_ARROW                   = 38942,\n+    SPELL_FROST_ARROW_EFFECT            = 56095,\n+    SPELL_MANA_SHIELD                   = 35064,\n+    SPELL_TORNADO                       = 34695,\n+    SPELL_TORNADO_EFFECT                = 21990, // stun, -resistances\n+    SPELL_TORNADO_EFFECT2               = 34683, // aoe damage\n+    SPELL_TORNADO_EFFECT3               = 39261,\n+    SPELL_SHOOT_BOW                     = 41188,\n+  //unmodify\n+    SPELL_TORNADO_LIGHTNING_VISUAL      = 45869, //periodic, 1 sec\n+//CRYPT LORD\n+  //modify\n+    //impale cd 9\n+    //locust dur 30 cd 180\n+    SPELL_IMPALE                        = 53458,\n+    SPELL_IMPALE_DAMAGE                 = 53454,\n+    SPELL_IMPALE_VISUAL                 = 59446,\n+    SPELL_CARRION_BEETLES               = 53520,\n+    SPELL_LOCUST_SWARM                  = 28785,\n+    SPELL_SOUL_BITE                     = 11016, //special - pet\n+    SPELL_ENERGIZE_VISUAL               = 59198,\n+    SPELL_BURROW                        = 68394, //special - pet (NYI) //SPELL_EFFECT_FORCE_DESELECT\n+  //unmodify\n+    SPELL_SPIKED_CARAPACE_DAMAGE        = 14104,\n+\n+//OTHER\n+    BASE_MANA_SPHYNX                    = 400 * 5,\n+    BASE_MANA_SPELLBREAKER              = 250 * 5,\n+    BASE_MANA_NECROMANCER               = 400 * 5,\n+    //base mana at 10\n+    BASE_MANA_10_BM                     = 540 * 5,\n+    BASE_MANA_10_ARCHMAGE               = 705 * 5,\n+    BASE_MANA_10_DREADLORD              = 600 * 5,\n+    BASE_MANA_10_DARK_RANGER            = 570 * 5,\n+    BASE_MANA_10_SEA_WITCH              = 735 * 5,\n+    BASE_MANA_10_CRYPT_LORD             = 420 * 5,\n+    //base mana at 1\n+    BASE_MANA_1_BM                      = 240 * 5,\n+    BASE_MANA_1_ARCHMAGE                = 285 * 5,\n+    BASE_MANA_1_DREADLORD               = 270 * 5,\n+    BASE_MANA_1_DARK_RANGER             = 225 * 5,\n+    BASE_MANA_1_SEA_WITCH               = 330 * 5,\n+    BASE_MANA_1_CRYPT_LORD              = 210 * 5,\n+};\n+\n+enum BotMountSpells : uint32\n+{\n+    //By game events\n+    REINDEER                            = 25859,\n+    REINDEER_FLY                        = 44827,\n+    //AQ40\n+    QIRAJI_BATTLE_TANK_1                = 25953,\n+    QIRAJI_BATTLE_TANK_2                = 26054,\n+    QIRAJI_BATTLE_TANK_3                = 26055,\n+    QIRAJI_BATTLE_TANK_4                = 26056,\n+    //By class\n+    BOT_DARK_RANGER_MOUNT               = 17481, // Deathcharger's Reins\n+    BOT_BE_PALLY_FAST_MOUNT             = 34767,\n+    BOT_BE_PALLY_MOUNT                  = 34769,\n+    BOT_ALLI_PALLY_FAST_MOUNT           = 23214,\n+    BOT_ALLI_PALLY_MOUNT                = 13819,\n+    BOT_DEATH_KNIGHT_MOUNT              = 48778,\n+    BOT_WARLOCK_FAST_MOUNT              = 23161,\n+    BOT_WARLOCK_MOUNT                   = 5784,\n+    //By race\n+    BOT_MOUNT_HUMAN_60_1                = 458,\n+    BOT_MOUNT_HUMAN_60_2                = 468,\n+    BOT_MOUNT_HUMAN_60_3                = 470,\n+    BOT_MOUNT_ORC_60_1                  = 459,\n+    BOT_MOUNT_ORC_60_2                  = 578,\n+    BOT_MOUNT_ORC_60_3                  = 579,\n+    BOT_MOUNT_DWARF_60_1                = 6777,\n+    BOT_MOUNT_DWARF_60_2                = 6896,\n+    BOT_MOUNT_DWARF_60_3                = 6897,\n+    BOT_MOUNT_NIGHTELF_60_1             = 8394,\n+    BOT_MOUNT_NIGHTELF_60_2             = 10787,\n+    BOT_MOUNT_NIGHTELF_60_3             = 10789,\n+    BOT_MOUNT_FORSAKEN_60_1             = 8980,\n+    BOT_MOUNT_FORSAKEN_60_2             = 17462,\n+    BOT_MOUNT_FORSAKEN_60_3             = 17463,\n+    BOT_MOUNT_TAUREN_60_1               = 18363,\n+    BOT_MOUNT_TAUREN_60_2               = 18989,\n+    BOT_MOUNT_TAUREN_60_3               = 18990,\n+    BOT_MOUNT_GNOME_60_1                = 10873,\n+    BOT_MOUNT_GNOME_60_2                = 10969,\n+    BOT_MOUNT_GNOME_60_3                = 15780,\n+    BOT_MOUNT_TROLL_60_1                = 8395,\n+    BOT_MOUNT_TROLL_60_2                = 10795,\n+    BOT_MOUNT_TROLL_60_3                = 10796,\n+    BOT_MOUNT_BLOODELF_60_1             = 34795,\n+    BOT_MOUNT_BLOODELF_60_2             = 35018,\n+    BOT_MOUNT_BLOODELF_60_3             = 35020,\n+    BOT_MOUNT_DRAENEI_60_1              = 34406,\n+    BOT_MOUNT_DRAENEI_60_2              = 35710,\n+    BOT_MOUNT_DRAENEI_60_3              = 35711,\n+    BOT_MOUNT_HUMAN_100_1               = 23227,\n+    BOT_MOUNT_HUMAN_100_2               = 23228,\n+    BOT_MOUNT_HUMAN_100_3               = 23229,\n+    BOT_MOUNT_ORC_100_1                 = 23250,\n+    BOT_MOUNT_ORC_100_2                 = 23251,\n+    BOT_MOUNT_ORC_100_3                 = 23252,\n+    BOT_MOUNT_DWARF_100_1               = 23238,\n+    BOT_MOUNT_DWARF_100_2               = 23239,\n+    BOT_MOUNT_DWARF_100_3               = 23240,\n+    BOT_MOUNT_NIGHTELF_100_1            = 23219,\n+    BOT_MOUNT_NIGHTELF_100_2            = 23220,\n+    BOT_MOUNT_NIGHTELF_100_3            = 23221,\n+    BOT_MOUNT_FORSAKEN_100_1            = 17465,\n+    BOT_MOUNT_FORSAKEN_100_2            = 22722,\n+    BOT_MOUNT_FORSAKEN_100_3            = 23246,\n+    BOT_MOUNT_TAUREN_100_1              = 23247,\n+    BOT_MOUNT_TAUREN_100_2              = 23248,\n+    BOT_MOUNT_TAUREN_100_3              = 23249,\n+    BOT_MOUNT_GNOME_100_1               = 23222,\n+    BOT_MOUNT_GNOME_100_2               = 23223,\n+    BOT_MOUNT_GNOME_100_3               = 23225,\n+    BOT_MOUNT_TROLL_100_1               = 23241,\n+    BOT_MOUNT_TROLL_100_2               = 23242,\n+    BOT_MOUNT_TROLL_100_3               = 23243,\n+    BOT_MOUNT_BLOODELF_100_1            = 35025,\n+    BOT_MOUNT_BLOODELF_100_2            = 35027,\n+    BOT_MOUNT_BLOODELF_100_3            = 46628,\n+    BOT_MOUNT_DRAENEI_100_1             = 35712,\n+    BOT_MOUNT_DRAENEI_100_2             = 35713,\n+    BOT_MOUNT_DRAENEI_100_3             = 35714,\n+    //By Team (flyers)\n+    BOT_MOUNT_FLY_ALLIANCE_150_1        = 32235,\n+    BOT_MOUNT_FLY_ALLIANCE_150_2        = 32239,\n+    BOT_MOUNT_FLY_ALLIANCE_150_3        = 32240,\n+    BOT_MOUNT_FLY_HORDE_150_1           = 32243,\n+    BOT_MOUNT_FLY_HORDE_150_2           = 32244,\n+    BOT_MOUNT_FLY_HORDE_150_3           = 32245,\n+    BOT_MOUNT_FLY_ALLIANCE_280_1        = 32242,\n+    BOT_MOUNT_FLY_ALLIANCE_280_2        = 32289,\n+    BOT_MOUNT_FLY_ALLIANCE_280_3        = 32290,\n+    BOT_MOUNT_FLY_HORDE_280_1           = 32246,\n+    BOT_MOUNT_FLY_HORDE_280_2           = 32295,\n+    BOT_MOUNT_FLY_HORDE_280_3           = 32296\n+};\n+inline constexpr std::size_t NUM_MOUNTS_PER_SPEED = 3;\n+\n+enum BotItemUseSpellTargeting : uint8\n+{\n+    BOT_ITEM_USE_SPELL_TARGET_NONE         = 0,\n+    BOT_ITEM_USE_SPELL_TARGET_SELF         = 1,\n+    BOT_ITEM_USE_SPELL_TARGET_ATTACKTARGET = 2,\n+    BOT_ITEM_USE_SPELL_TARGET_ALLY         = 3\n+};\n+\n+SpellInfo const* GetBotSpellInfoOverride(uint32 spellId);\n+SpellInfo const* AssertBotSpellInfoOverride(uint32 spellId);\n+SpellProcEntry const* GetBotSpellProceEntryOverride(uint32 spellId);\n+void GenerateBotCustomSpells();\n+\n+#endif //BOTSPELL_H\ndiff --git a/src/server/game/AI/NpcBots/bottext.h b/src/server/game/AI/NpcBots/bottext.h\nnew file mode 100644\nindex 0000000000..9373499ba0\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bottext.h\n@@ -0,0 +1,441 @@\n+#ifndef BOTTEXT_H\n+#define BOTTEXT_H\n+\n+#include \"Define.h\"\n+\n+enum BotTexts : uint32\n+{\n+    GOSSIP_NORMAL_SERVE_MASTER              = 70001,//\"I live only to serve the master.\"\n+    GOSSIP_GREET_NEED_SMTH                  = 70002,//\"You need something?\"\n+    GOSSIP_GREET_MURDER                     = 70003,//\"Mortals... usually I kill wretches like you at sight\"\n+    GOSSIP_GREET_CUSTOM_SPHYNX              = 70004,\n+    GOSSIP_NORMAL_CUSTOM_SPHYNX             = 70005,\n+    GOSSIP_GREET_CUSTOM_DREADLORD           = 70006,\n+    GOSSIP_NORMAL_CUSTOM_DREADLORD          = 70007,\n+    GOSSIP_GREET_CUSTOM_DARKRANGER          = 70008,\n+    GOSSIP_NORMAL_CUSTOM_DARKRANGER         = 70009,\n+    GOSSIP_GREET_CUSTOM_SEAWITCH            = 70010,\n+    GOSSIP_NORMAL_CUSTOM_SEAWITCH           = 70011,\n+    GOSSIP_GREET_CUSTOM_CRYPTLORD           = 70012,\n+    GOSSIP_NORMAL_CUSTOM_CRYPTLORD          = 70013,\n+    //70012-70100 reserved for bot gossip texts (not selectable)\n+    GOSSIP_CLASSDESC_BM                     = 70101,\n+    GOSSIP_CLASSDESC_SPHYNX                 = 70102,\n+    GOSSIP_CLASSDESC_ARCHMAGE               = 70103,\n+    GOSSIP_CLASSDESC_DREADLORD              = 70104,\n+    GOSSIP_CLASSDESC_SPELLBREAKER           = 70105,\n+    GOSSIP_CLASSDESC_DARKRANGER             = 70106,\n+    GOSSIP_CLASSDESC_NECROMANCER            = 70107,\n+    GOSSIP_CLASSDESC_SEAWITCH               = 70108,\n+    GOSSIP_CLASSDESC_CRYPTLORD              = 70109,\n+    //70109-70200 reserved for bot class descriptions gossip texts (not selectable)\n+    GOSSIP_BOTGIVER_GREET                   = 70201,\n+    GOSSIP_BOTGIVER_HIRE                    = 70202,\n+    GOSSIP_BOTGIVER_HIRE_CLASS              = 70203,\n+    GOSSIP_BOTGIVER_HIRE_EMPTY              = 70204,\n+    //70205-70299 reserved for botgiver gossip texts (not selectable)\n+    BOT_TEXT_DIE                            = 70300, //\"Die!\"\n+    BOT_TEXT_REZZING_YOU                    = 70301, //\"Rezzing You\"\n+    BOT_TEXT_REZZING_                       = 70302, //\"Rezzing \"\n+    BOT_TEXT_YOUR_BOT                       = 70303, //\"your bot\"\n+    BOT_TEXT__S_BOT                         = 70304, //\"'s bot\"\n+    BOT_TEXT_CANT_CONJURE_WATER_YET         = 70305, //\"I can't conjure water yet\"\n+    BOT_TEXT_CANT_CONJURE_FOOD_YET          = 70306, //\"I can't conjure food yet\"\n+    BOT_TEXT_CANT_RIGHT_NOW                 = 70307, //\"I can't do it right now\"\n+    BOT_TEXT_HERE_YOU_GO                    = 70308, //\"Here you go...\"\n+    BOT_TEXT_DISABLED                       = 70309, //\"Disabled\"\n+    BOT_TEXT_NOT_READY_YET                  = 70310, //\"Not ready yet\"\n+    BOT_TEXT_INVALID_OBJECT_TYPE            = 70311, //\"Invalid object type\"\n+    BOT_TEXT_FAILED                         = 70312, //\"Failed\"\n+    BOT_TEXT_DONE                           = 70313, //\"Done\"\n+    BOT_TEXT_NOT_SHAPESHIFTED               = 70314, //\"I am not shapeshifted\"\n+    BOT_TEXT_NO_HEALTHSTONE                 = 70315, //\"I don't have a healthstone\"\n+    BOT_TEXT_CANT_CREATE_HEALTHSTONE        = 70316, //\"I can't create healthstones yet!\"\n+    BOT_TEXT_NO_LOCKPICKING                 = 70317, //\"WTF I don't have lockpicking!\"\n+    BOT_TEXT_SKILL_LEVEL_TOO_LOW            = 70318, //\"My skill level in not high enough\"\n+    BOT_TEXT_CHANGING_MY_SPEC_TO_           = 70319, //\"Changing my spec to \"\n+    BOT_TEXT_SPEC_ARMS                      = 70320, //\"Arms\"\n+    BOT_TEXT_SPEC_FURY                      = 70321, //\"Fury\"\n+    BOT_TEXT_SPEC_PROTECTION                = 70322, //\"Protection\"\n+    BOT_TEXT_SPEC_RETRIBUTION               = 70323, //\"Retribution\"\n+    BOT_TEXT_SPEC_BEASTMASTERY              = 70324, //\"Beast Mastery\"\n+    BOT_TEXT_SPEC_MARKSMANSHIP              = 70325, //\"Marksmanship\"\n+    BOT_TEXT_SPEC_SURVIVAL                  = 70326, //\"Survival\"\n+    BOT_TEXT_SPEC_ASSASINATION              = 70327, //\"Assassination\"\n+    BOT_TEXT_SPEC_COMBAT                    = 70328, //\"Combat\"\n+    BOT_TEXT_SPEC_SUBTLETY                  = 70329, //\"Subtlety\"\n+    BOT_TEXT_SPEC_DISCIPLINE                = 70330, //\"Discipline\"\n+    BOT_TEXT_SPEC_HOLY                      = 70331, //\"Holy\"\n+    BOT_TEXT_SPEC_SHADOW                    = 70332, //\"Shadow\"\n+    BOT_TEXT_SPEC_BLOOD                     = 70333, //\"Blood\"\n+    BOT_TEXT_SPEC_FROST                     = 70334, //\"Frost\"\n+    BOT_TEXT_SPEC_UNHOLY                    = 70335, //\"Unholy\"\n+    BOT_TEXT_SPEC_ELEMENTAL                 = 70336, //\"Elemental\"\n+    BOT_TEXT_SPEC_ENHANCEMENT               = 70337, //\"Enhancement\"\n+    BOT_TEXT_SPEC_RESTORATION               = 70338, //\"Restoration\"\n+    BOT_TEXT_SPEC_ARCANE                    = 70339, //\"Arcane\"\n+    BOT_TEXT_SPEC_FIRE                      = 70340, //\"Fire\"\n+    BOT_TEXT_SPEC_AFFLICTION                = 70341, //\"Affliction\"\n+    BOT_TEXT_SPEC_DEMONOLOGY                = 70342, //\"Demonology\"\n+    BOT_TEXT_SPEC_DESTRUCTION               = 70343, //\"Destruction\"\n+    BOT_TEXT_SPEC_BALANCE                   = 70344, //\"Balance\"\n+    BOT_TEXT_SPEC_FERAL                     = 70345, //\"Feral Combat\"\n+    BOT_TEXT_SPEC_UNKNOWN                   = 70346, //\"Unknown\"\n+    BOT_TEXT_HIREDENY_DK                    = 70347, //\"Go away, weakling\"\n+    BOT_TEXT_HIREDENY_SPHYNX                = 70348, //\" is not convinced\"\n+    BOT_TEXT_HIREDENY_ARCHMAGE              = 70349, //\"I am not going to waste my time on just anything\"\n+    BOT_TEXT_HIREDENY_DREADLORD             = 70350, //NIY\n+    BOT_TEXT_HIREDENY_SPELLBREAKER          = 70351, //NIY\n+    BOT_TEXT_HIREDENY_DARKRANGER            = 70352, //NIY\n+    BOT_TEXT_HIRE_SUCCESS                   = 70353, //\"I am ready\"\n+    BOT_TEXT_HIREDENY_MY_MASTER_IS_         = 70354, //\"Go away. I serve my master \"\n+    BOT_TEXT_UNKNOWN                        = 70355, //\"unknown\"\n+    BOT_TEXT__ON_YOU                        = 70356, //\" on You!\"\n+    BOT_TEXT__ON_MYSELF                     = 70357, //\" on myself!\"\n+    BOT_TEXT__ON_                           = 70358, //\" on \"\n+    BOT_TEXT__USED                          = 70359, //\" used!\"\n+    BOT_TEXT_BOT_TANK                       = 70360, //\"bot tank\"\n+    BOT_TEXT_CLASS                          = 70361, //\"class\"\n+    BOT_TEXT_PLAYER                         = 70362, //\"player\"\n+    BOT_TEXT_MASTER                         = 70363, //\"master\"\n+    BOT_TEXT_NONE                           = 70364, //\"none\"\n+    BOT_TEXT_RANK                           = 70365, //\"Rank\"\n+    BOT_TEXT_TALENT                         = 70366, //\"talent\"\n+    BOT_TEXT_PASSIVE                        = 70367, //\"passive\"\n+    BOT_TEXT_HIDDEN                         = 70368, //\"hidden\"\n+    BOT_TEXT_KNOWN                          = 70369, //\"known\"\n+    BOT_TEXT_ABILITY                        = 70370, //\"ability\"\n+    BOT_TEXT_STAT_STR                       = 70371, //\"str\"\n+    BOT_TEXT_STAT_AGI                       = 70372, //\"agi\"\n+    BOT_TEXT_STAT_STA                       = 70373, //\"sta\"\n+    BOT_TEXT_STAT_INT                       = 70374, //\"int\"\n+    BOT_TEXT_STAT_SPI                       = 70375, //\"spi\"\n+    BOT_TEXT_STAT_UNK                       = 70376, //\"unk stat\"\n+    BOT_TEXT_TOTAL                          = 70377, //\"total\"\n+    BOT_TEXT_MELEE_AP                       = 70378, //\"Melee AP\"\n+    BOT_TEXT_RANGED_AP                      = 70379, //\"Ranged AP\"\n+    BOT_TEXT_ARMOR                          = 70380, //\"armor\"\n+    BOT_TEXT_CRIT                           = 70381, //\"crit\"\n+    BOT_TEXT_DEFENSE                        = 70382, //\"defense\"\n+    BOT_TEXT_MISS                           = 70383, //\"miss\"\n+    BOT_TEXT_DODGE                          = 70384, //\"dodge\"\n+    BOT_TEXT_PARRY                          = 70385, //\"parry\"\n+    BOT_TEXT_BLOCK                          = 70386, //\"block\"\n+    BOT_TEXT_BLOCKVALUE                     = 70387, //\"block value\"\n+    BOT_TEXT_DMG_TAKEN_MELEE                = 70388, //\"Damage taken melee\"\n+    BOT_TEXT_DMG_TAKEN_SPELL                = 70389, //\"Damage taken spell\"\n+    BOT_TEXT_DMG_RANGE_MAINHAND             = 70390, //\"Damage range mainhand\"\n+    BOT_TEXT_DMG_MULT_MAINHAND              = 70391, //\"Damage mult mainhand\"\n+    BOT_TEXT_ATTACK_TIME_MAINHAND           = 70392, //\"Attack time mainhand\"\n+    BOT_TEXT_DMG_RANGE_OFFHAND              = 70393, //\"Damage range offhand\"\n+    BOT_TEXT_DMG_MULT_OFFHAND               = 70394, //\"Damage mult offhand\"\n+    BOT_TEXT_ATTACK_TIME_OFFHAND            = 70395, //\"Attack time offhand\"\n+    BOT_TEXT_DMG_RANGE_RANGED               = 70396, //\"Damage range ranged\"\n+    BOT_TEXT_DMG_MULT_RANGED                = 70397, //\"Damage mult ranged\"\n+    BOT_TEXT_ATTACK_TIME_RANGED             = 70398, //\"Attack time ranged\"\n+    BOT_TEXT_MIN                            = 70399, //\"min\"\n+    BOT_TEXT_MAX                            = 70400, //\"max\"\n+    BOT_TEXT_DPS                            = 70401, //\"DPS\"\n+    BOT_TEXT_BASE_HP                        = 70402, //\"base hp\"\n+    BOT_TEXT_TOTAL_HP                       = 70403, //\"total hp\"\n+    BOT_TEXT_BASE_MP                        = 70404, //\"base mana\"\n+    BOT_TEXT_TOTAL_MP                       = 70405, //\"total mana\"\n+    BOT_TEXT_CURR_MP                        = 70406, //\"current mana\"\n+    BOT_TEXT_SPELLPOWER                     = 70407, //\"spell power\"\n+    BOT_TEXT_REGEN_HP                       = 70408, //\"health regen_5 bonus\"\n+    BOT_TEXT_REGEN_MP_CAST                  = 70409, //\"mana regen_5 no cast\"\n+    BOT_TEXT_REGEN_MP_NOCAST                = 70410, //\"mana regen_5 casting\"\n+    BOT_TEXT_HASTE                          = 70411, //\"haste\"\n+    BOT_TEXT_HIT                            = 70412, //\"hit\"\n+    BOT_TEXT_EXPERTISE                      = 70413, //\"expertise\"\n+    BOT_TEXT_ARMOR_PEN                      = 70414, //\"armor penetration\"\n+    BOT_TEXT_SPELL_PEN                      = 70415, //\"spell penetration\"\n+    BOT_TEXT_PCT                            = 70416, //\"pct\"\n+    BOT_TEXT_HOLY                           = 70417, //\"holy\"\n+    BOT_TEXT_FIRE                           = 70418, //\"fire\"\n+    BOT_TEXT_NATURE                         = 70419, //\"nature\"\n+    BOT_TEXT_FROST                          = 70420, //\"frost\"\n+    BOT_TEXT_SHADOW                         = 70421, //\"shadow\"\n+    BOT_TEXT_ARCANE                         = 70422, //\"arcane\"\n+    BOT_TEXT_RESISTANCE                     = 70423, //\"Resistance\"\n+    BOT_TEXT_COMMAND_STATES                 = 70424, //\"Command states\"\n+    BOT_TEXT_COMMAND_FOLLOW                 = 70425, //\"Follow\"\n+    BOT_TEXT_COMMAND_ATTACK                 = 70426, //\"Attack\"\n+    BOT_TEXT_COMMAND_STAY                   = 70427, //\"Stay\"\n+    BOT_TEXT_COMMAND_RESET                  = 70428, //\"Reset\"\n+    BOT_TEXT_COMMAND_FULLSTOP               = 70429, //\"FullStop\"\n+    BOT_TEXT_FOLLOW_DISTANCE                = 70430, //\"Follow distance\"\n+    BOT_TEXT_SPEC                           = 70431, //\"Spec\"\n+    BOT_TEXT_BOT_ROLEMASK_MAIN              = 70432, //\"Bot roles mask main\"\n+    BOT_TEXT_BOT_ROLEMASK_GATHERING         = 70433, //\"Bot roles mask gathering\"\n+    BOT_TEXT_PVP_KILLS                      = 70434, //\"PvP kills\"\n+    BOT_TEXT_PLAYERS                        = 70435, //\"players\"\n+    BOT_TEXT_DIED_                          = 70436, //\"Died \"\n+    BOT_TEXT__TIMES                         = 70437, //\" times\"\n+    BOT_TEXT_BOT_TICKLED                    = 70438, //\"%s (bot) calms down\"\n+    BOT_TEXT_DEBUG                          = 70439, //\"<Debug>\"\n+    BOT_TEXT_HIREWARN_SPHYNX_1              = 70440, //\"Are you sure you want to risk drawing \"\n+    BOT_TEXT_HIREWARN_SPHYNX_2              = 70441, //\"'s attention?\"\n+    BOT_TEXT_HIREOPTION_SPHYNX              = 70442, //\"<Insert Coin>\"\n+    BOT_TEXT_HIREWARN_DREADLORD             = 70443, //\"Do you want to entice \"\n+    BOT_TEXT_HIREOPTION_DREADLORD           = 70444, //\"<Try to make an offering>\"\n+    BOT_TEXT_HIREWARN_DEFAULT               = 70445, //\"Do you wish to hire \"\n+    BOT_TEXT_HIREOPTION_DEFAULT             = 70446, //\"<Hire bot>\"\n+    BOT_TEXT_MANAGE_EQUIPMENT               = 70447, //\"Manage equipment...\"\n+    BOT_TEXT_MANAGE_ROLES                   = 70448, //\"Manage roles...\"\n+    BOT_TEXT_MANAGE_FORMATION               = 70449, //\"Manage formation...\"\n+    BOT_TEXT_MANAGE_ABILITIES               = 70450, //\"Manage abilities...\"\n+    BOT_TEXT_MANAGE_TALENTS                 = 70451, //\"Manage talents...\"\n+    BOT_TEXT_GIVE_CONSUMABLE                = 70452, //\"Give consumable...\"\n+    BOT_TEXT_CREATE_GROUP                   = 70453, //\"<Create group>\"\n+    BOT_TEXT_CREATE_GROUP_ALL               = 70454, //\"<Create group (all bots)>\"\n+    BOT_TEXT_ADD_TO_GROUP                   = 70455, //\"<Add to group>\"\n+    BOT_TEXT_ADD_TO_GROUP_ALL               = 70456, //\"<Add all bots to group>\"\n+    BOT_TEXT_REMOVE_FROM_GROUP              = 70457, //\"<Remove from group>\"\n+    BOT_TEXT_FOLLOW_ME                      = 70458, //\"Follow me\"\n+    BOT_TEXT_HOLD_POSITION                  = 70459, //\"Hold your position\"\n+    BOT_TEXT_STAY_HERE                      = 70460, //\"Stay here and don't do anything\"\n+    BOT_TEXT_MAGE_FOOD                      = 70461, //\"I need food\"\n+    BOT_TEXT_MAGE_DRINK                     = 70462, //\"I need water\"\n+    BOT_TEXT_MAGE_TABLE                     = 70463, //\"I need a refreshment table\"\n+    BOT_TEXT_ROGUE_PICKLOCK                 = 70464, //\"Help me pick a lock\"\n+    BOT_TEXT_WARLOCK_HEALTHSTONE            = 70465, //\"I need your your healthstone\"\n+    BOT_TEXT_WARLOCK_SOULWELL               = 70466, //\"I need a soulwell\"\n+    BOT_TEXT_ROGUE_POISON_REFRESH           = 70467, //\"I need you to refresh poisons\"\n+    BOT_TEXT_ROGUE_POISON_MH                = 70468, //\"<Choose poison (Main Hand)>\"\n+    BOT_TEXT_ROGUE_POISON_OH                = 70469, //\"<Choose poison (Offhand)>\"\n+    BOT_TEXT_SHAMAN_ENCH_REFRESH            = 70470, //\"I need you to refresh enchants\"\n+    BOT_TEXT_SHAMAN_ENCH_MH                 = 70471, //\"<Choose enchant (Main Hand)>\"\n+    BOT_TEXT_SHAMAN_ENCH_OH                 = 70472, //\"<Choose enchant (Offhand)>\"\n+    BOT_TEXT_REMOVE_SHAPESHIFT              = 70473, //\"I need you to remove shapeshift\"\n+    BOT_TEXT_CHOOSE_PET_TYPE                = 70474, //\"<Choose pet type>\"\n+    BOT_TEXT_UR_DISMISSED                   = 70475, //\"You are dismissed\"\n+    BOT_TEXT_ABANDON_WARN_1                 = 70476, //\"Are you going to abandon \"\n+    BOT_TEXT_ABANDON_WARN_2                 = 70477, //\"You may regret it...\"\n+    BOT_TEXT_PULL_URSELF                    = 70478, //\"Pull yourself together, damnit\"\n+    BOT_TEXT_STUDY_CREATURE                 = 70479, //\"<Study the creature>\"\n+    BOT_TEXT_NEVERMIND                      = 70480, //\"Nevermind\"\n+    BOT_TEXT_DISTANCE_SHORT                 = 70481, //\"dist\"\n+    BOT_TEXT_BACK                           = 70482, //\"BACK\"\n+    BOT_TEXT_AUTO                           = 70483, //\"<Auto>\"\n+    BOT_TEXT_NONE2                          = 70484, //\"<None>\"\n+    BOT_TEXT_RANDOMPET_CUNNING              = 70485, //\"Random (Cunning)\"\n+    BOT_TEXT_RANDOMPET_FEROCITY             = 70486, //\"Random (Ferocity)\"\n+    BOT_TEXT_RANDOMPET_TENACITY             = 70487, //\"Random (Tenacity)\"\n+    BOT_TEXT_SHOW_INVENTORY                 = 70488, //\"Show me your inventory\"\n+    BOT_TEXT_AUTOEQUIP                      = 70489, //\"Auto-equip\"\n+    BOT_TEXT_SLOT_MH                        = 70490, //\"Main hand\"\n+    BOT_TEXT_SLOT_OH                        = 70491, //\"Off-hand\"\n+    BOT_TEXT_SLOT_RH                        = 70492, //\"Ranged\"\n+    BOT_TEXT_SLOT_RELIC                     = 70493, //\"Relic\"\n+    BOT_TEXT_SLOT_HEAD                      = 70494, //\"Head\"\n+    BOT_TEXT_SLOT_SHOULDERS                 = 70495, //\"Shoulders\"\n+    BOT_TEXT_SLOT_CHEST                     = 70496, //\"Chest\"\n+    BOT_TEXT_SLOT_WAIST                     = 70497, //\"Waist\"\n+    BOT_TEXT_SLOT_LEGS                      = 70498, //\"Legs\"\n+    BOT_TEXT_SLOT_FEET                      = 70499, //\"Feet\"\n+    BOT_TEXT_SLOT_WRIST                     = 70500, //\"Wrist\"\n+    BOT_TEXT_SLOT_HANDS                     = 70501, //\"Hands\"\n+    BOT_TEXT_SLOT_BACK                      = 70502, //\"Back\"\n+    BOT_TEXT_SLOT_SHIRT                     = 70503, //\"Shirt\"\n+    BOT_TEXT_SLOT_FINGER1                   = 70504, //\"Finger1\"\n+    BOT_TEXT_SLOT_FINGER2                   = 70505, //\"Finger2\"\n+    BOT_TEXT_SLOT_TRINKET1                  = 70506, //\"Trinket1\"\n+    BOT_TEXT_SLOT_TRINKET2                  = 70507, //\"Trinket2\"\n+    BOT_TEXT_SLOT_NECK                      = 70508, //\"Neck\"\n+    BOT_TEXT_UNEQUIP_ALL                    = 70509, //\"Unequip all\"\n+    BOT_TEXT_UPDATE_VISUAL                  = 70510, //\"Update visual\"\n+    BOT_TEXT_VISUALONLY                     = 70511, //\"visual only\"\n+    BOT_TEXT_EQUIPPED                       = 70512, //\"Equipped\"\n+    BOT_TEXT_NOTHING                        = 70513, //\"nothing\"\n+    BOT_TEXT_USE_OLD_EQUIPMENT              = 70514, //\"Use your old equipment\"\n+    BOT_TEXT_UNEQUIP                        = 70515, //\"Unequip it\"\n+    BOT_TEXT_NOTHING_TO_GIVE                = 70516, //\"Hm... I have nothing to give you\"\n+    BOT_TEXT_GATHERING                      = 70517, //\"Gathering\"\n+    BOT_TEXT_ABILITIES_STATUS               = 70518, //\"Abilities status\"\n+    BOT_TEXT_ALLOWED_ABILITIES              = 70519, //\"Manage allowed abilities\"\n+    BOT_TEXT_USE_                           = 70520, //\"Use \"\n+    BOT_TEXT_UPDATE                         = 70521, //\"Update\"\n+    BOT_TEXT_DAMAGE                         = 70522, //\"Damage\"\n+    BOT_TEXT_CONTROL                        = 70523, //\"Control\"\n+    BOT_TEXT_HEAL                           = 70524, //\"Heal\"\n+    BOT_TEXT_OTHER                          = 70525, //\"Other\"\n+    BOT_TEXT_HIRE_EMOTE_SPHYNX              = 70526, //\" makes a grinding sound and begins to follow \"\n+    BOT_TEXT_HIREFAIL_OWNED                 = 70527, //\"%s will not join you until dismissed by the owner\"\n+    BOT_TEXT_HIREFAIL_LVL60                 = 70528, //\"%s will not join you until you are level 60\"\n+    BOT_TEXT_HIREFAIL_LVL55                 = 70529, //\"%s will not join you until you are level 55\"\n+    BOT_TEXT_HIREFAIL_LVL40                 = 70530, //\"%s will not join you until you are level 40\"\n+    BOT_TEXT_HIREFAIL_LVL20                 = 70531, //\"%s will not join you until you are level 20\"\n+    BOT_TEXT_HIREFAIL_MAXBOTS               = 70532, //\"You exceed max npcbots for your level (%u)\"\n+    BOT_TEXT_HIREFAIL_COST                  = 70533, //\"You don't have enough money\"\n+    BOT_TEXT_HIREFAIL_MAXCLASSBOTS          = 70534, //\"You cannot have more bots of that class! %u of %u\"\n+    BOT_TEXT_CANT_DISMISS_EQUIPMENT         = 70535, //\"Cannot reset equipment in slot %u (%s)! Cannot dismiss bot!\"\n+    BOT_TEXT_CURRENT                        = 70536, //\"current\"\n+    BOT_TEXT_ATTACK_DISTANCE                = 70537, //\"Attack distance\"\n+    BOT_TEXT_SHORT_RANGE_ATTACKS            = 70538, //\"Short range attacks\"\n+    BOT_TEXT_LONG_RANGE_ATTACKS             = 70539, //\"Long range attacks\"\n+    BOT_TEXT_EXACT                          = 70540, //\"Exact\"\n+    BOT_TEXT_REMOVE_BUFF                    = 70541, //\"Remove buff\"\n+    BOT_TEXT_FIX_POWER                      = 70542, //\"Fix your power type\"\n+    BOT_TEXT_CANT_UNEQUIP_MAILING           = 70543, //\"Cannot unequip %s for some stupid reason! Sending through mail\"\n+    BOT_TEXT_TANK                           = 70544, //\"Tank\"\n+    BOT_TEXT_RANGED                         = 70545, //\"Ranged\"\n+    BOT_TEXT_MINER                          = 70546, //\"Miner\"\n+    BOT_TEXT_HERBALIST                      = 70547, //\"Herbalist\"\n+    BOT_TEXT_SKINNER                        = 70548, //\"Skinner\"\n+    BOT_TEXT_ENGINEER                       = 70549, //\"Engineer\"\n+    BOT_TEXT_OWNERSHIP_EXPIRED              = 70550, //\"Bot ownership expired due to inactivity\"\n+    BOT_TEXT_BOTADDFAIL_DISABLED            = 70551, //\"NpcBot system is currently disabled. Please contact administration.\"\n+    BOT_TEXT_BOTADDFAIL_OWNED               = 70552, //\"%s will not join you, already has master: %s\"\n+    BOT_TEXT_BANK_IS_FULL                   = 70553, //\"Bank is full\"\n+    BOT_TEXT_ASPECT                         = 70554, //\"Aspect\"\n+    BOT_TEXT_MONKEY                         = 70555, //\"Monkey\"\n+    BOT_TEXT_HAWK                           = 70556, //\"Hawk\"\n+    BOT_TEXT_CHEETAH                        = 70557, //\"Cheetah\"\n+    BOT_TEXT_VIPER                          = 70558, //\"Viper\"\n+    BOT_TEXT_BEAST                          = 70559, //\"Beast\"\n+    BOT_TEXT_PACK                           = 70560, //\"Pack\"\n+    BOT_TEXT_WILD                           = 70561, //\"Wild\"\n+    BOT_TEXT_DRAGONHAWK                     = 70562, //\"Dragonhawk\"\n+    BOT_TEXT_NOASPECT                       = 70563, //\"No Aspect\"\n+    BOT_TEXT_AURA                           = 70564, //\"Aura\"\n+    BOT_TEXT_DEVOTION                       = 70565, //\"Devotion\"\n+    BOT_TEXT_CONCENTRATION                  = 70566, //\"Concentration\"\n+    BOT_TEXT_FIRERESISTANCE                 = 70567, //\"Fire Resistance\"\n+    BOT_TEXT_FROSTRESISTANCE                = 70568, //\"Frost Resistance\"\n+    BOT_TEXT_SHADOWRESISTANCE               = 70569, //\"Shadow Resistance\"\n+    BOT_TEXT_RETRIBUTION                    = 70570, //\"Retribution\"\n+    BOT_TEXT_CRUSADER                       = 70571, //\"Crusader\"\n+    BOT_TEXT_NOAURA                         = 70572, //\"No Aura\"\n+    BOT_TEXT_CRIPPLING                      = 70573, //\"Crippling\"\n+    BOT_TEXT_INSTANT                        = 70574, //\"Instant\"\n+    BOT_TEXT_DEADLY                         = 70575, //\"Deadly\"\n+    BOT_TEXT_WOUND                          = 70576, //\"Wound\"\n+    BOT_TEXT_MINDNUMBING                    = 70577, //\"Mind-Numbing\"\n+    BOT_TEXT_ANESTHETIC                     = 70578, //\"Anesthetic\"\n+    BOT_TEXT_NOTHING_C                      = 70579, //\"Nothing\"\n+    BOT_TEXT_FLAMETONGUE                    = 70580, //\"Flametongue\"\n+    BOT_TEXT_FROSTBRAND                     = 70581, //\"Frostbrand\"\n+    BOT_TEXT_WINDFURY                       = 70582, //\"Windfury\"\n+    BOT_TEXT_EARTHLIVING                    = 70583, //\"Earthliving\"\n+    BOT_TEXT_BOTGIVER_SERVICE               = 70584, //\"I need your services\"\n+    BOT_TEXT_BOTGIVER_TOO_MANY_BOTS         = 70585, //\"You have too many bots\"\n+    BOT_TEXT_BOTGIVER_WISH_TO_HIRE_         = 70586, //\"Do you wish to hire \"\n+    BOT_TEXT_BOTGIVER__BOT_BUSY             = 70587, //\" is a bit busy at the moment, try again later.\"\n+    BOT_TEXT_BOTGIVER_HIRESUCCESS           = 70588, //\"Pleasure doing business with you\"\n+    BOT_TEXT_CLASS_WARRIOR_PLU              = 70589, //\"Warriors\"\n+    BOT_TEXT_CLASS_PALADIN_PLU              = 70590, //\"Paladins\"\n+    BOT_TEXT_CLASS_MAGE_PLU                 = 70591, //\"Mages\"\n+    BOT_TEXT_CLASS_PRIEST_PLU               = 70592, //\"Priests\"\n+    BOT_TEXT_CLASS_WARLOCK_PLU              = 70593, //\"Warlocks\"\n+    BOT_TEXT_CLASS_DRUID_PLU                = 70594, //\"Druids\"\n+    BOT_TEXT_CLASS_DEATH_KNIGHT_PLU         = 70595, //\"Death Knights\"\n+    BOT_TEXT_CLASS_ROGUE_PLU                = 70596, //\"Rogues\"\n+    BOT_TEXT_CLASS_SHAMAN_PLU               = 70597, //\"Shamans\"\n+    BOT_TEXT_CLASS_HUNTER_PLU               = 70598, //\"Hunters\"\n+    BOT_TEXT_CLASS_BM_PLU                   = 70599, //\"Blademasters\"\n+    BOT_TEXT_CLASS_SPHYNX_PLU               = 70600, //\"Destroyers\"\n+    BOT_TEXT_CLASS_ARCHMAGE_PLU             = 70601, //\"Archmagi\"\n+    BOT_TEXT_CLASS_DREADLORD_PLU            = 70602, //\"Dreadlords\"\n+    BOT_TEXT_CLASS_SPELLBREAKER_PLU         = 70603, //\"Spell Breakers\"\n+    BOT_TEXT_CLASS_DARK_RANGER_PLU          = 70604, //\"Dark Rangers\"\n+    BOT_TEXT_CLASS_WARRIOR                  = 70605, //\"Warrior\"\n+    BOT_TEXT_CLASS_PALADIN                  = 70606, //\"Paladin\"\n+    BOT_TEXT_CLASS_MAGE                     = 70607, //\"Mage\"\n+    BOT_TEXT_CLASS_PRIEST                   = 70608, //\"Priest\"\n+    BOT_TEXT_CLASS_WARLOCK                  = 70609, //\"Warlock\"\n+    BOT_TEXT_CLASS_DRUID                    = 70610, //\"Druid\"\n+    BOT_TEXT_CLASS_DEATH_KNIGHT             = 70611, //\"Death Knight\"\n+    BOT_TEXT_CLASS_ROGUE                    = 70612, //\"Rogue\"\n+    BOT_TEXT_CLASS_SHAMAN                   = 70613, //\"Shaman\"\n+    BOT_TEXT_CLASS_HUNTER                   = 70614, //\"Hunter\"\n+    BOT_TEXT_CLASS_BM                       = 70615, //\"Blademaster\"\n+    BOT_TEXT_CLASS_SPHYNX                   = 70616, //\"Destroyer\"\n+    BOT_TEXT_CLASS_ARCHMAGE                 = 70617, //\"Archmage\"\n+    BOT_TEXT_CLASS_DREADLORD                = 70618, //\"Dreadlord\"\n+    BOT_TEXT_CLASS_SPELLBREAKER             = 70619, //\"Spell Breaker\"\n+    BOT_TEXT_CLASS_DARK_RANGER              = 70620, //\"Dark Ranger\"\n+    BOT_TEXT_GENDER_MALE                    = 70621, //\"Male\"\n+    BOT_TEXT_GENDER_FEMALE                  = 70622, //\"Female\"\n+    BOT_TEXT_RACE_HUMAN                     = 70623, //\"Human\"\n+    BOT_TEXT_RACE_ORC                       = 70624, //\"Orc\"\n+    BOT_TEXT_RACE_DWARF                     = 70625, //\"Dwarf\"\n+    BOT_TEXT_RACE_NELF                      = 70626, //\"Night Elf\"\n+    BOT_TEXT_RACE_UNDEAD                    = 70627, //\"Undead\"\n+    BOT_TEXT_RACE_TAUREN                    = 70628, //\"Tauren\"\n+    BOT_TEXT_RACE_GNOME                     = 70629, //\"Gnome\"\n+    BOT_TEXT_RACE_TROLL                     = 70630, //\"Troll\"\n+    BOT_TEXT_RACE_BELF                      = 70631, //\"Blood Elf\"\n+    BOT_TEXT_RACE_DRAENEI                   = 70632, //\"Draenei\"\n+    BOT_TEXT_RACE_UNKNOWN                   = 70633, //\"Unknown\"\n+    BOT_TEXT_LOOTING                        = 70634, //\"Looting\"\n+    BOT_TEXT_POOR                           = 70635, //\"Poor\"\n+    BOT_TEXT_COMMON                         = 70636, //\"Common\"\n+    BOT_TEXT_UNCOMMON                       = 70637, //\"Uncommon\"\n+    BOT_TEXT_RARE                           = 70638, //\"Rare\"\n+    BOT_TEXT_EPIC                           = 70639, //\"Epic\"\n+    BOT_TEXT_LEGENDARY                      = 70640, //\"Legendary\"\n+    BOT_TEXT_ENGAGE_BEHAVIOR                = 70641, //\"Engage behavior\"\n+    BOT_TEXT_DELAY_ATTACK_BY                = 70642, //\"Delay attack by\"\n+    BOT_TEXT_DELAY_HEALING_BY               = 70643, //\"Delay healing by\"\n+    BOT_TEXT_SECOND_SHORT                   = 70644, //\"s\"\n+    BOT_TEXT_TANK_OFF                       = 70645, //\"Off-Tank\"\n+    BOT_TEXT_CLASS_NECROMANCER_PLU          = 70646, //\"Necromancers\"\n+    BOT_TEXT_CLASS_NECROMANCER              = 70647, //\"Necromancer\"\n+    BOT_TEXT_ATTACK_ANGLE                   = 70648, //\"Attack angle\"\n+    BOT_TEXT_NORMAL                         = 70649, //\"Normal\"\n+    BOT_TEXT_AVOID_FRONTAL_AOE              = 70650, //\"Avoid frontal AOE\"\n+    BOT_TEXT_HIREDENY_SEAWITCH              = 70651, //NIY\n+    BOT_TEXT_HIREWARN_SEAWITCH              = 70652, //\"Are you sure this is gonna work? It's better be the best water in the world...\"\n+    BOT_TEXT_HIREOPTION_SEAWITCH            = 70653, //\"Seems like you could really use a drink of fresh water.\"\n+    BOT_TEXT_CLASS_SEAWITCH_PLU             = 70654, //\"Sea Witches\"\n+    BOT_TEXT_CLASS_SEAWITCH                 = 70655, //\"Sea Witch\"\n+    BOT_TEXT_MANA_PER_DAMAGE                = 70656, //\"Mana per damage\"\n+    BOT_TEXT_DAMAGE_PER_MANA                = 70657, //\"Damage per mana\"\n+    BOT_TEXT_TRANSMOGRIFICATION             = 70658, //\"Transmogrification...\"\n+    BOT_TEXT_DISABLE_COMBAT_POSITIONING     = 70659, //\"DISABLE combat positioning\"\n+    BOT_TEXT_PRIORITY_TARGET                = 70660, //\"Priority target\"\n+    BOT_TEXT_BOT_GEAR_BANK                  = 70661, //\"Bot gear bank...\"\n+    BOT_TEXT_DEPOSIT_ITEMS                  = 70662, //\"Deposit items...\"\n+    BOT_TEXT_WITHDRAW_ITEMS                 = 70663, //\"Withdraw items...\"\n+    BOT_TEXT_BANK_IS_EMPTY                  = 70664, //\"Bank is empty\"\n+    BOT_TEXT_PREVIOUS_PAGE                  = 70665, //\"Previous page\"\n+    BOT_TEXT_NEXT_PAGE                      = 70666, //\"Next page\"\n+    BOT_TEXT_HIREWARN_CRYPTLORD             = 70667, //\"Do you really want to spend all this money to make Crypt Lord move again?\"\n+    BOT_TEXT_HIREOPTION_CRYPTLORD           = 70668, //\"I doubt your ability to do much harm in your current state, but I am willing to lead you and help you restore your powers.\"\n+    BOT_TEXT_CLASS_CRYPT_LORD_PLU           = 70669, //\"Crypt Lords\"\n+    BOT_TEXT_CLASS_CRYPT_LORD               = 70670, //\"Crypt Lord\"\n+    BOT_TEXT_REFLECT                        = 70671, //\"Reflect\"\n+    BOT_TEXT_LOCUSTS                        = 70672, //\"Locusts\"\n+    BOT_TEXT_HEAL_TARGET_HEALTH_THRESHOLD   = 70673, //\"Heal target health threshold\"\n+    BOT_TEXT_I_NEED_A_PORTAL                = 70674, //\"I need a portal\"\n+    BOT_TEXT_STORMWIND                      = 70675, //\"Stormwind\"\n+    BOT_TEXT_IRONFORGE                      = 70676, //\"Ironforge\"\n+    BOT_TEXT_DARNASSUS                      = 70677, //\"Darnassus\"\n+    BOT_TEXT_EXORDAR                        = 70678, //\"Exordar\"\n+    BOT_TEXT_ORGRIMMAR                      = 70679, //\"Orgrimmar\"\n+    BOT_TEXT_UNDERCITY                      = 70680, //\"Undercity\"\n+    BOT_TEXT_THUNDER_BLUFF                  = 70681, //\"Thunder Bluff\"\n+    BOT_TEXT_SILVERMOON                     = 70682, //\"Silvermoon\"\n+    BOT_TEXT_SHATTRATH                      = 70683, //\"Shattrath\"\n+    BOT_TEXT_DALARAN                        = 70684, //\"Dalaran\"\n+    BOT_TEXT_HIREFAIL_MAXBOTS_ACCOUNT       = 70685, //\"You exceed max npcbots for your account (%u >= %u)\"\n+    BOT_TEXT_SET_FOR_ALL_EVERYONE           = 70686, //\"<Set for all bots>\"\n+    BOT_TEXT___GEAR_BANK_                   = 70687, //\" (gear bank)\"\n+    BOT_TEXT_NOT_ENOUGH_GEAR_BANK_SPACE     = 70688, //\"Not enough gear bank space to store %u item(s) (%u / %u)!\"\n+    BOT_TEXT_EQUIPMENT_SETS                 = 70689, //\"Equipment sets\"\n+    BOT_TEXT_CREATE                         = 70690, //\"Create\"\n+    BOT_TEXT_DELETE                         = 70691, //\"Delete\"\n+    BOT_TEXT_EQUIP                          = 70692, //\"Equip\"\n+    BOT_TEXT_MISSING                        = 70693, //\"missing\"\n+    BOT_TEXT_MANAGE_OWNERSHIP               = 70694, //\"Manage ownership...\"\n+    BOT_TEXT_ADD_OWNER                      = 70695, //\"<Add owner>\"\n+    BOT_TEXT_SHARED_BOT_WARN_ADD            = 70696, //\"WARNING: by sharing ownership over your bot you give another player FULL control over their inventory, roles and all other settings (including sharing them with others)\"\n+    BOT_TEXT_REMOVE_OWNER                   = 70697, //\"<Remove owner>\"\n+    BOT_TEXT_OWNERS_LIMIT_EXCEEDED          = 70698, //\"Owners limit exceeded\"\n+    BOT_TEXT_SHARED_WITH                    = 70699, //\"Shared with\"\n+    BOT_TEXT_OWNER                          = 70700, //\"Owner\"\n+    //70701-71000 reserved for custom localization strings\n+};\n+\n+#endif //BOTTEXT_H\ndiff --git a/src/server/game/AI/NpcBots/botwanderful.cpp b/src/server/game/AI/NpcBots/botwanderful.cpp\nnew file mode 100644\nindex 0000000000..aa81d9b3d8\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/botwanderful.cpp\n@@ -0,0 +1,455 @@\n+#include \"botdefine.h\"\n+#include \"botwanderful.h\"\n+#include \"DBCStores.h\"\n+#include \"SpellAuras.h\"\n+#include \"StringConvert.h\"\n+#include \"TemporarySummon.h\"\n+\n+#include <algorithm>\n+#include <iomanip>\n+#include <numeric>\n+#include <unordered_set>\n+\n+#ifdef _MSC_VER\n+# pragma warning(push, 4)\n+#endif\n+\n+uint32 WanderNode::nextWPId = 0;\n+WanderNode::node_ltype WanderNode::ALL_WPS = {};\n+WanderNode::node_mtype WanderNode::ALL_WPS_PER_MAP = {};\n+WanderNode::node_mtype WanderNode::ALL_WPS_PER_ZONE = {};\n+WanderNode::node_mtype WanderNode::ALL_WPS_PER_AREA = {};\n+\n+WanderNode::mutex_type* WanderNode::GetLock()\n+{\n+    static mutex_type _lock;\n+    return &_lock;\n+}\n+\n+WanderNode* WanderNode::FindInAllWPs(uint32 wpId)\n+{\n+    std::shared_lock lock(*GetLock());\n+\n+    auto ci = std::ranges::find_if(ALL_WPS, [wpId = wpId](WanderNode const* wp) {\n+        return wp->GetWPId() == wpId;\n+    });\n+\n+    return ci == ALL_WPS.cend() ? nullptr : *ci;\n+}\n+\n+WanderNode* WanderNode::FindInAllWPs(Creature const* creature)\n+{\n+    if (!creature)\n+        return nullptr;\n+\n+    std::shared_lock lock(*GetLock());\n+\n+    auto ci = std::ranges::find_if(ALL_WPS, [=](WanderNode const* wp) {\n+        return wp->GetCreature() == creature;\n+    });\n+\n+    return ci == ALL_WPS.cend() ? nullptr : *ci;\n+}\n+\n+WanderNode* WanderNode::FindInMapWPs(uint32 mapId, Creature const* creature)\n+{\n+    if (!creature)\n+        return nullptr;\n+\n+    std::shared_lock lock(*GetLock());\n+\n+    decltype(ALL_WPS_PER_MAP)::const_iterator cim = ALL_WPS_PER_MAP.find(mapId);\n+    if (cim == ALL_WPS_PER_MAP.cend())\n+        return nullptr;\n+    decltype(cim->second)::const_iterator ci = std::ranges::find_if(cim->second, [=](WanderNode const* wp) {\n+        return wp->GetCreature() == creature;\n+    });\n+\n+    return ci == cim->second.cend() ? nullptr : *ci;\n+}\n+\n+WanderNode* WanderNode::FindInMapWPs(uint32 mapId, uint32 wpId)\n+{\n+    std::shared_lock lock(*GetLock());\n+\n+    decltype(ALL_WPS_PER_MAP)::const_iterator cim = ALL_WPS_PER_MAP.find(mapId);\n+    if (cim == ALL_WPS_PER_MAP.cend())\n+        return nullptr;\n+    decltype(cim->second)::const_iterator ci = std::ranges::find_if(cim->second, [=](WanderNode const* wp) {\n+        return wp->GetWPId() == wpId;\n+    });\n+\n+    return ci == cim->second.cend() ? nullptr : *ci;\n+}\n+\n+WanderNode* WanderNode::FindInMapWPs(uint32 mapId, node_check_ftype_c const& pred)\n+{\n+    std::shared_lock lock(*GetLock());\n+\n+    decltype(ALL_WPS_PER_MAP)::const_iterator cim = ALL_WPS_PER_MAP.find(mapId);\n+    if (cim == ALL_WPS_PER_MAP.cend())\n+        return nullptr;\n+    decltype(cim->second)::const_iterator ci = std::ranges::find_if(cim->second, pred);\n+\n+    return ci == cim->second.cend() ? nullptr : *ci;\n+}\n+\n+WanderNode* WanderNode::FindInZoneWPs(uint32 zoneId, node_check_ftype_c const& pred)\n+{\n+    std::shared_lock lock(*GetLock());\n+\n+    decltype(ALL_WPS_PER_ZONE)::const_iterator cim = ALL_WPS_PER_ZONE.find(zoneId);\n+    if (cim == ALL_WPS_PER_ZONE.cend())\n+        return nullptr;\n+    decltype(cim->second)::const_iterator ci = std::ranges::find_if(cim->second, pred);\n+\n+    return ci == cim->second.cend() ? nullptr : *ci;\n+}\n+\n+WanderNode* WanderNode::FindInAreaWPs(uint32 areaId, node_check_ftype_c const& pred)\n+{\n+    std::shared_lock lock(*GetLock());\n+\n+    decltype(ALL_WPS_PER_AREA)::const_iterator cim = ALL_WPS_PER_AREA.find(areaId);\n+    if (cim == ALL_WPS_PER_AREA.cend())\n+        return nullptr;\n+    decltype(cim->second)::const_iterator ci = std::ranges::find_if(cim->second, pred);\n+\n+    return ci == cim->second.cend() ? nullptr : *ci;\n+}\n+\n+void WanderNode::DoForAllWPs(node_proc_ftype_c&& func)\n+{\n+    std::shared_lock lock(*GetLock());\n+\n+    DoForContainerWPs(ALL_WPS, std::forward<node_proc_ftype_c>(func));\n+}\n+\n+void WanderNode::DoForAllZoneWPs(uint32 zoneId, node_proc_ftype_c&& func)\n+{\n+    std::shared_lock lock(*GetLock());\n+\n+    decltype(ALL_WPS_PER_ZONE)::const_iterator ci = ALL_WPS_PER_ZONE.find(zoneId);\n+    if (ci != ALL_WPS_PER_ZONE.cend())\n+        DoForContainerWPs(ci->second, std::forward<node_proc_ftype_c>(func));\n+}\n+\n+void WanderNode::DoForAllMapWPs(uint32 mapId, node_proc_ftype_c&& func)\n+{\n+    std::shared_lock lock(*GetLock());\n+\n+    decltype(ALL_WPS_PER_MAP)::const_iterator ci = ALL_WPS_PER_MAP.find(mapId);\n+    if (ci != ALL_WPS_PER_MAP.cend())\n+        DoForContainerWPs(ci->second, std::forward<node_proc_ftype_c>(func));\n+}\n+\n+void WanderNode::DoForAllAreaWPs(uint32 areaId, node_proc_ftype_c&& func)\n+{\n+    std::shared_lock lock(*GetLock());\n+\n+    decltype(ALL_WPS_PER_AREA)::const_iterator ci = ALL_WPS_PER_AREA.find(areaId);\n+    if (ci != ALL_WPS_PER_AREA.cend())\n+        DoForContainerWPs(ci->second, std::forward<node_proc_ftype_c>(func));\n+}\n+\n+size_t WanderNode::GetAllWPsCount()\n+{\n+    std::shared_lock lock(*GetLock());\n+\n+    return ALL_WPS.size();\n+}\n+\n+size_t WanderNode::GetMapWPsCount(uint32 mapId)\n+{\n+    std::shared_lock lock(*GetLock());\n+\n+    decltype(ALL_WPS_PER_MAP)::const_iterator ci = ALL_WPS_PER_MAP.find(mapId);\n+    return ci != ALL_WPS_PER_MAP.cend() ? ci->second.size() : 0u;\n+}\n+\n+size_t WanderNode::GetWPMapsCount()\n+{\n+    std::shared_lock lock(*GetLock());\n+\n+    return ALL_WPS_PER_MAP.size();\n+}\n+\n+WanderNode::WanderNode(uint32 wpId, uint32 mapId, float x, float y, float z, float o, uint32 zoneId, uint32 areaId, std::string&& name)\n+    : Position(x, y, z, o), _wpId(wpId), _mapId(mapId), _zoneId(zoneId), _areaId(areaId),\n+    _name(std::move(name)), _minLevel(1u), _maxLevel(DEFAULT_MAX_LEVEL), _flags(0), _to_links_count(0), _creature(nullptr)\n+{\n+    ASSERT(!!sMapStore.LookupEntry(_mapId), \"WanderNode::Ctr(): Invalid value for _mapId\");\n+    ASSERT(!!sAreaTableStore.LookupEntry(_zoneId), \"WanderNode::Ctr(): Invalid value for _zoneId\");\n+    ASSERT(!!sAreaTableStore.LookupEntry(_areaId), \"WanderNode::Ctr(): Invalid value for _areaId\");\n+    \n+    std::unique_lock lock(*GetLock());\n+\n+    ALL_WPS.push_back(this);\n+    ALL_WPS_PER_MAP.try_emplace(_mapId).first->second.push_back(this);\n+    ALL_WPS_PER_ZONE.try_emplace(_zoneId).first->second.push_back(this);\n+    ALL_WPS_PER_AREA.try_emplace(_areaId).first->second.push_back(this);\n+}\n+\n+WanderNode::~WanderNode()\n+{\n+    RemoveWP(this);\n+}\n+\n+void WanderNode::RemoveWP(WanderNode* wp)\n+{\n+    while (!wp->GetLinks().empty())\n+        wp->UnLink(wp->GetLinks().front());\n+\n+    if (wp->GetCreature() && wp->GetCreature()->IsInWorld())\n+        wp->GetCreature()->ToTempSummon()->DespawnOrUnsummon();\n+\n+    ALL_WPS_PER_AREA.at(wp->_areaId).remove(wp);\n+    ALL_WPS_PER_ZONE.at(wp->_zoneId).remove(wp);\n+    ALL_WPS_PER_MAP.at(wp->_mapId).remove(wp);\n+    ALL_WPS.remove(wp);\n+\n+    //WP removal should only be performed during maintanence with no players online\n+    //WE LET THE NODE LEAK for threadsafety - wp or creature pointer could be held ouside of sync context\n+    //delete wp\n+}\n+\n+void WanderNode::RemoveAllWPs()\n+{\n+    std::unique_lock lock(*GetLock());\n+\n+    while (!ALL_WPS.empty())\n+        RemoveWP(ALL_WPS.front());\n+}\n+\n+WanderNode::node_lltype WanderNode::GetShortestPathLinks(WanderNode const* target, WanderNode::node_lltype const& base_links, BotWPLevel max_level_diff) const\n+{\n+    using NodeLinkList = WanderNode::node_lltype;\n+    using NodeLinkPList = std::vector<WanderNodeLink const*>;\n+\n+    ASSERT(std::ranges::all_of(base_links, [this](WanderNodeLink const& wpl) { return HasLink(wpl.Id()); }));\n+\n+    NodeLinkList retlist;\n+    if (this == target)\n+        retlist.push_back(WanderNodeLink{ .wp = const_cast<WanderNode*>(this), .weight = 10000 });\n+    else\n+    {\n+        std::list<std::pair<uint32 /*level*/, WanderNodeLink const*>> validLinks;\n+        for (WanderNodeLink const& link : base_links)\n+        {\n+            if (link.wp == target)\n+            {\n+                retlist.push_back(link);\n+                validLinks.clear();\n+                break;\n+            }\n+\n+            if (max_level_diff != BotWPLevel::BOTWP_LEVEL_ZERO && link.wp->GetLinks().size() == 1 && link.wp->GetLinks().front().wp == this)\n+                continue;\n+\n+            std::unordered_set<uint32> checked_links;\n+            checked_links.insert(GetWPId());\n+            NodeLinkPList vlinks_cur;\n+            NodeLinkList clinks;\n+            clinks.push_back(link);\n+            for (uint32 level = 0; !clinks.empty(); ++level)\n+            {\n+                for (WanderNodeLink const& wpl : clinks)\n+                {\n+                    if (wpl.wp->HasLink(target))\n+                        vlinks_cur.push_back(&link);\n+                }\n+                if (!vlinks_cur.empty())\n+                {\n+                    validLinks.emplace_back(level, &link);\n+                    break;\n+                }\n+                decltype(clinks) clinks_new;\n+                for (WanderNodeLink const& wpl : clinks)\n+                {\n+                    checked_links.insert(wpl.Id()); // cut off all ways back (2-ways, circular)\n+                    std::copy_if(wpl.wp->GetLinks().cbegin(), wpl.wp->GetLinks().cend(), std::back_inserter(clinks_new), [&checked_links](WanderNodeLink const& wpl) {\n+                        return !checked_links.contains(wpl.Id());\n+                    });\n+                }\n+                clinks = std::move(clinks_new);\n+            }\n+        }\n+\n+        if (!validLinks.empty())\n+        {\n+            //only choose one of the shortest routes\n+            if (validLinks.size() > 1)\n+            {\n+                auto minlevel = std::numeric_limits<decltype(validLinks)::value_type::first_type>::max();\n+                for (auto const& vlp : validLinks)\n+                    minlevel = std::min<decltype(minlevel)>(minlevel, vlp.first);\n+                decltype(minlevel) inclevel = minlevel + AsUnderlyingType(max_level_diff);\n+                std::erase_if(validLinks, [=, this](decltype(validLinks)::value_type const& p) {\n+                    return p.first > inclevel || (p.first > minlevel && p.second->wp->GetExactDist2d(target) > GetExactDist2d(target));\n+                });\n+            }\n+            for (auto const& kv : validLinks)\n+                retlist.push_back(*kv.second); //copying 16 bytes each\n+        }\n+    }\n+\n+    return retlist;\n+}\n+\n+void WanderNode::SetCreature(Creature* creature)\n+{\n+    if (creature != nullptr)\n+        ASSERT(!_creature);\n+\n+    _creature = creature;\n+}\n+\n+Creature* WanderNode::GetCreature() const\n+{\n+    return _creature;\n+}\n+\n+uint32 WanderNode::GetAverageLinkWeight(bool exclude_0/* = false*/) const\n+{\n+    if (GetLinks().empty())\n+        return 0;\n+\n+    if (exclude_0)\n+    {\n+        uint32 zeros_count = 0;\n+        uint32 sum = 0;\n+        for (WanderNodeLink const& wpl : GetLinks())\n+        {\n+            sum += wpl.weight;\n+            if (wpl.weight == 0)\n+                ++zeros_count;\n+        }\n+        return sum / std::max<uint32>(1u, GetLinks().size() - zeros_count);\n+    }\n+\n+    return static_cast<uint32>(std::accumulate(GetLinks().cbegin(), GetLinks().cend(), 0u, [](size_t total, WanderNodeLink const& wpl) { return total + wpl.weight; }) / GetLinks().size());\n+}\n+\n+std::string WanderNode::FormatLinks() const\n+{\n+    std::ostringstream lss;\n+    for (WanderNodeLink const& wpl : _links)\n+        lss << uint32(wpl.Id()) << ':' << uint32(wpl.weight) << ' ';\n+\n+    return lss.str();\n+}\n+\n+void WanderNode::SetLinkWeight(uint32 wp_id, uint32 new_weight)\n+{\n+    auto lit = GetLink(wp_id);\n+    ASSERT(lit != GetLinks().cend());\n+    lit->weight = new_weight;\n+}\n+\n+void WanderNode::SetFlags(BotWPFlags flags)\n+{\n+    _flags |= AsUnderlyingType(flags);\n+    if (Creature* wpc = GetCreature())\n+    {\n+        wpc->SetMaxPower(POWER_MANA, GetFlags());\n+        wpc->SetFullPower(POWER_MANA);\n+    }\n+}\n+\n+void WanderNode::RemoveFlags(BotWPFlags flags)\n+{\n+    _flags &= ~AsUnderlyingType(flags);\n+    if (Creature* wpc = GetCreature())\n+    {\n+        wpc->SetMaxPower(POWER_MANA, GetFlags());\n+        wpc->SetFullPower(POWER_MANA);\n+    }\n+}\n+\n+bool WanderNode::HasFlag(BotWPFlags flags) const\n+{\n+    return !!(_flags & AsUnderlyingType(flags));\n+}\n+\n+bool WanderNode::HasAllFlags(BotWPFlags flags) const\n+{\n+    return (_flags & AsUnderlyingType(flags)) == AsUnderlyingType(flags);\n+}\n+\n+std::string WanderNode::ToString(int32 link_weight/* = -1*/) const\n+{\n+    std::ostringstream wps;\n+    wps << \"WP \" << _wpId << (link_weight >= 0 ? (\":\" + Bcore::ToString(link_weight)) : std::string{})\n+        << \" '\" << _name << \"', \" << uint32(_links.size()) << \" link(s) (avg weight \" << GetAverageLinkWeight()\n+        << \"), Map \" << _mapId << \", Zone \" << _zoneId << \", Area \" << _areaId << \", minLvl \" << uint32(_minLevel) << \", maxLvl \" << uint32(_maxLevel)\n+        << \" (\" << std::setiosflags(std::ios_base::fixed) << std::setprecision(2) << \"X: \" << m_positionX << \" Y: \" << m_positionY << \" Z: \" << m_positionZ\n+        << \"), flags: 0x\" << std::hex << std::setw(8) << std::setfill('0') << _flags << std::dec;\n+    return wps.str();\n+}\n+\n+void WanderNode::Link(WanderNodeLink&& wpl)\n+{\n+    if (!HasLink(wpl))\n+    {\n+        _links.push_back(std::move(wpl));\n+        _links.back().wp->_setLinkedBy(this);\n+        SetupLinkFromAura();\n+    }\n+}\n+void WanderNode::UnLink(uint32 wp_id)\n+{\n+    auto lit = GetLink(wp_id);\n+    if (lit != _links.cend())\n+    {\n+        WanderNode* lwp = lit->wp;\n+        _links.erase(lit);\n+        lwp->_setUnLinkedBy(this);\n+        SetupLinkFromAura();\n+    }\n+}\n+void WanderNode::_setLinkedBy(WanderNode const*/* lwp*/)\n+{\n+    ++_to_links_count;\n+    SetupLinkToAura();\n+}\n+void WanderNode::_setUnLinkedBy(WanderNode const*/* lwp*/)\n+{\n+    --_to_links_count;\n+    SetupLinkToAura();\n+}\n+void WanderNode::SetupLinkFromAura() const\n+{\n+    if (Creature* wpc = GetCreature())\n+    {\n+        Aura* linkfrom = wpc->GetAura(WP_SPELL_ID_LINK_FROM);\n+        if (GetLinks().empty())\n+        {\n+            if (linkfrom)\n+                linkfrom->Remove();\n+            return;\n+        }\n+        if (!linkfrom)\n+            linkfrom = wpc->AddAura(WP_SPELL_ID_LINK_FROM, wpc);\n+        linkfrom->SetStackAmount((uint8)GetLinks().size());\n+    }\n+}\n+void WanderNode::SetupLinkToAura() const\n+{\n+    if (Creature* wpc = GetCreature())\n+    {\n+        Aura* linkto = wpc->GetAura(WP_SPELL_ID_LINK_TO);\n+        if (_to_links_count == 0)\n+        {\n+            if (linkto)\n+                linkto->Remove();\n+            return;\n+        }\n+        if (!linkto)\n+            linkto = wpc->AddAura(WP_SPELL_ID_LINK_TO, wpc);\n+        linkto->SetStackAmount((uint8)_to_links_count);\n+    }\n+}\n+\n+#ifdef _MSC_VER\n+# pragma warning(pop)\n+#endif\ndiff --git a/src/server/game/AI/NpcBots/botwanderful.h b/src/server/game/AI/NpcBots/botwanderful.h\nnew file mode 100644\nindex 0000000000..67a5bc71ad\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/botwanderful.h\n@@ -0,0 +1,241 @@\n+#ifndef BOTWANDERFUL_H_\n+#define BOTWANDERFUL_H_\n+\n+#include \"EnumFlag.h\"\n+#include \"Position.h\"\n+\n+#include <algorithm>\n+#include <functional>\n+#include <list>\n+#include <mutex>\n+#include <shared_mutex>\n+#include <unordered_map>\n+\n+/*\n+NpcBot System by Trickerer (onlysuffering@gmail.com)\n+Original patch from: LordPsyan https://bitbucket.org/lordpsyan/trinitycore-patches/src/3b8b9072280e/Individual/11185-BOTS-NPCBots.patch\n+*/\n+\n+class Creature;\n+\n+enum class BotWPFlags : uint32\n+{\n+    BOTWP_FLAG_NONE                         = 0x00000000,\n+    BOTWP_FLAG_SPAWN                        = 0x00000001, // wandering bots can spawn at this WP location\n+    BOTWP_FLAG_ALLIANCE_ONLY                = 0x00000002, // only alliance bots can move here, SPAWN+A = only alliance bots can spawn at this WP location\n+    BOTWP_FLAG_HORDE_ONLY                   = 0x00000004, // only horde bots can move here, SPAWN+H = only horde bots can spawn at this WP location\n+    BOTWP_FLAG_CAN_BACKTRACK_FROM           = 0x00000008, // can move back to WPs links even if other links exist\n+    BOTWP_FLAG_MOVEMENT_IGNORES_FACTION     = 0x00000010, // ignore faction flags when trying to select this WP as move point\n+    BOTWP_FLAG_MOVEMENT_IGNORES_PATHING     = 0x00000020, // do not generate path between 2 WPs having this flag\n+    BOTWP_FLAG_BG_FLAG_DELIVER_TARGET       = 0x00000040, // <BG only> flag carrier destination marker\n+    BOTWP_FLAG_BG_FLAG_PICKUP_TARGET        = 0x00000080, // <BG only> flag pick/activate up marker\n+    BOTWP_FLAG_BG_BOSS_ROOM                 = 0x00000100, // <BG only> boss room to attack as group / defend\n+    BOTWP_FLAG_BG_MISC_OBJECTIVE_1          = 0x00000200, // <BG only> misc objective 1 (AV = mine, EY = intercept)\n+    BOTWP_FLAG_BG_MISC_OBJECTIVE_2          = 0x00000400, // <BG only> misc objective 2 (AV = captain)\n+    BOTWP_FLAG_BG_OPTIONAL_PICKUP_1         = 0x00000800, // <BG only> optional pickup point 1 (WS = healNW, AB = stables, EY = buffNW)\n+    BOTWP_FLAG_BG_OPTIONAL_PICKUP_2         = 0x00001000, // <BG only> optional pickup point 2 (WS = bersNE, AB = farm, EY = buffNE)\n+    BOTWP_FLAG_BG_OPTIONAL_PICKUP_3         = 0x00002000, // <BG only> optional pickup point 3 (WS = healSE, AB = mill, EY = buffSW)\n+    BOTWP_FLAG_BG_OPTIONAL_PICKUP_4         = 0x00004000, // <BG only> optional pickup point 4 (WS = bersSW, AB = mine, EY = buffSE)\n+    BOTWP_FLAG_BG_OPTIONAL_PICKUP_5         = 0x00008000, // <BG only> optional pickup point 5 (AB = blacksmith)\n+    BOTWP_FLAG_MOVEMENT_FORCE_JUMP_BEGIN    = 0x00010000, // movement between 2 WPs having begin and end flags is forced to be a jump (prevent casting when falling from a cliff)\n+    BOTWP_FLAG_MOVEMENT_FORCE_JUMP_END      = 0x00020000, // movement between 2 WPs having begin and end flags is forced to be a jump (prevent casting when falling from a cliff)\n+    BOTWP_FLAG_INTERACTION_MILL_RADIUS      = 0x00040000, // if chosen as a mill point, radius is reduced to INTERACTION_DISTANCE\n+    BOTWP_FLAG_NOT_A_START_POINT            = 0x00080000, // a bot can not teleport to this node, its a waypoint for moving only.\n+    BOTWP_FLAG_END                          = 0x00100000,\n+\n+    BOTWP_FLAGS_ALL_VALID                   = BOTWP_FLAG_END - 1,\n+\n+    BOTWP_FLAG_ALLIANCE_OR_HORDE_ONLY       = BOTWP_FLAG_ALLIANCE_ONLY | BOTWP_FLAG_HORDE_ONLY,\n+    BOTWP_FLAG_ALLIANCE_SPAWN_POINT         = BOTWP_FLAG_SPAWN | BOTWP_FLAG_ALLIANCE_ONLY,\n+    BOTWP_FLAG_HORDE_SPAWN_POINT            = BOTWP_FLAG_SPAWN | BOTWP_FLAG_HORDE_ONLY,\n+    BOTWP_FLAG_ALLIANCE_FLAG_DELIVER_TARGET = BOTWP_FLAG_BG_FLAG_DELIVER_TARGET | BOTWP_FLAG_ALLIANCE_ONLY,\n+    BOTWP_FLAG_HORDE_FLAG_DELIVER_TARGET    = BOTWP_FLAG_BG_FLAG_DELIVER_TARGET | BOTWP_FLAG_HORDE_ONLY,\n+    BOTWP_FLAG_ALLIANCE_FLAG_PICKUP_TARGET  = BOTWP_FLAG_BG_FLAG_PICKUP_TARGET | BOTWP_FLAG_ALLIANCE_ONLY,\n+    BOTWP_FLAG_HORDE_FLAG_PICKUP_TARGET     = BOTWP_FLAG_BG_FLAG_PICKUP_TARGET | BOTWP_FLAG_HORDE_ONLY,\n+    BOTWP_FLAG_ALLIANCE_BOSS_ROOM           = BOTWP_FLAG_BG_BOSS_ROOM | BOTWP_FLAG_ALLIANCE_ONLY,\n+    BOTWP_FLAG_HORDE_BOSS_ROOM              = BOTWP_FLAG_BG_BOSS_ROOM | BOTWP_FLAG_HORDE_ONLY,\n+    BOTWP_FLAG_ALLIANCE_DEMIBOSS_ROOM       = BOTWP_FLAG_BG_MISC_OBJECTIVE_2 | BOTWP_FLAG_ALLIANCE_ONLY,\n+    BOTWP_FLAG_HORDE_DEMIBOSS_ROOM          = BOTWP_FLAG_BG_MISC_OBJECTIVE_2 | BOTWP_FLAG_HORDE_ONLY,\n+    BOTWP_FLAG_SPAWN_INTERCEPT_ALLIANCE     = BOTWP_FLAG_BG_MISC_OBJECTIVE_1 | BOTWP_FLAG_ALLIANCE_ONLY,\n+    BOTWP_FLAG_SPAWN_INTERCEPT_HORDE        = BOTWP_FLAG_BG_MISC_OBJECTIVE_1 | BOTWP_FLAG_HORDE_ONLY,\n+    BOTWP_FLAG_OPTIONAL_PICKUP              = (BOTWP_FLAG_BG_OPTIONAL_PICKUP_1 | BOTWP_FLAG_BG_OPTIONAL_PICKUP_2 | BOTWP_FLAG_BG_OPTIONAL_PICKUP_3 |\n+                                               BOTWP_FLAG_BG_OPTIONAL_PICKUP_4 | BOTWP_FLAG_BG_OPTIONAL_PICKUP_5),\n+    BOTWP_FLAG_WS_PICKUP_RESTORATION        = BOTWP_FLAG_BG_OPTIONAL_PICKUP_1 | BOTWP_FLAG_BG_OPTIONAL_PICKUP_3,\n+    BOTWP_FLAG_WS_PICKUP_BERSERKING         = BOTWP_FLAG_BG_OPTIONAL_PICKUP_2 | BOTWP_FLAG_BG_OPTIONAL_PICKUP_4,\n+};\n+\n+DEFINE_ENUM_FLAG(BotWPFlags);\n+\n+enum class BotWPLevel : uint32\n+{\n+    BOTWP_LEVEL_ZERO                        = 0,\n+    BOTWP_LEVEL_ONE                         = 1,\n+};\n+\n+inline constexpr uint32 WP_SPELL_ID_LINK_TO = 64034;\n+inline constexpr uint32 WP_SPELL_ID_LINK_FROM = 64036;\n+\n+class WanderNode : public Position\n+{\n+public:\n+    struct WanderNodeLink\n+    {\n+        WanderNode* wp;\n+        uint32 weight;\n+\n+        inline constexpr uint32 Id() const noexcept { return wp ? wp->GetWPId() : 0; }\n+\n+        inline constexpr bool operator==(WanderNodeLink const& other) const noexcept { return Id() == other.Id(); }\n+        inline constexpr std::strong_ordering operator<=>(WanderNodeLink const& other) const noexcept { return Id() <=> other.Id(); }\n+\n+        struct WeightExtractor {\n+            inline constexpr uint32 operator()(WanderNodeLink const& wpl) const noexcept { return wpl.weight; }\n+            inline constexpr uint32 operator()(WanderNodeLink const* wpl) const noexcept { return wpl->weight; }\n+        };\n+    };\n+\n+private:\n+    using node_ltype = std::list<WanderNode*>;\n+    using node_ltype_c = std::list<WanderNode const*>;\n+    using node_mtype = std::unordered_map<uint32, node_ltype>;\n+    using node_lltype = std::list<WanderNodeLink>;\n+\n+    using node_proc_ftype = std::function<void(WanderNode*)>;\n+    using node_proc_ftype_c = std::function<void(WanderNode const*)>;\n+    using node_check_ftype_c = std::function<bool(WanderNode const*)>;\n+    using node_proc_ltype = std::function<void(WanderNodeLink const&)>;\n+\n+    using mutex_type = std::shared_mutex;\n+\n+    static node_ltype ALL_WPS;\n+    static node_mtype ALL_WPS_PER_MAP;\n+    static node_mtype ALL_WPS_PER_ZONE;\n+    static node_mtype ALL_WPS_PER_AREA;\n+\n+    static mutex_type* GetLock();\n+\n+public:\n+    static uint32 nextWPId;\n+\n+    static WanderNode* FindInAllWPs(uint32 wpId);\n+    static WanderNode* FindInAllWPs(Creature const* creature);\n+    static WanderNode* FindInMapWPs(uint32 mapId, Creature const* creature);\n+    static WanderNode* FindInMapWPs(uint32 mapId, uint32 wpId);\n+    static WanderNode* FindInMapWPs(uint32 mapId, node_check_ftype_c const& pred);\n+    static WanderNode* FindInZoneWPs(uint32 zoneId, node_check_ftype_c const& pred);\n+    static WanderNode* FindInAreaWPs(uint32 areaId, node_check_ftype_c const& pred);\n+\n+    template<typename Func>\n+    requires (std::is_convertible_v<Func, node_proc_ltype>)\n+    static void DoForContainerWPLinks(WanderNode::node_lltype const& c, Func&& func) {\n+        for (auto const& wl : c)\n+            func(wl);\n+    }\n+\n+    template<typename Container, typename Func>\n+    requires (\n+        std::is_convertible_v<Func, node_proc_ftype_c> &&\n+        std::is_same_v<std::decay_t<std::remove_pointer_t<typename Container::value_type>>, WanderNode> &&\n+        std::input_or_output_iterator<typename Container::iterator>\n+    )\n+    static void DoForContainerWPs(Container const& c, Func&& func) {\n+        for (auto* wp : c)\n+            func(wp);\n+    }\n+\n+    static void DoForAllWPs(node_proc_ftype_c&& func);\n+    static void DoForAllMapWPs(uint32 mapId, node_proc_ftype_c&& func);\n+    static void DoForAllZoneWPs(uint32 zoneId, node_proc_ftype_c&& func);\n+    static void DoForAllAreaWPs(uint32 areaId, node_proc_ftype_c&& func);\n+    static size_t GetAllWPsCount();\n+    static size_t GetMapWPsCount(uint32 mapId);\n+    static size_t GetWPMapsCount();\n+\n+    WanderNode(uint32 wpId, uint32 mapId, float x, float y, float z, float o, uint32 zoneId, uint32 areaId, std::string&& name);\n+    ~WanderNode();\n+\n+    static void RemoveAllWPs();\n+    static void RemoveWP(WanderNode* wp);\n+\n+    //utils\n+    WanderNode::node_lltype GetShortestPathLinks(WanderNode const* target, WanderNode::node_lltype const& base_links, BotWPLevel max_level_diff = BotWPLevel::BOTWP_LEVEL_ZERO) const;\n+\n+    //base\n+    void SetCreature(Creature* creature);\n+    Creature* GetCreature() const;\n+\n+    std::string FormatLinks() const;\n+    uint32 GetAverageLinkWeight(bool exclude_0 = false) const;\n+\n+    void Link(WanderNodeLink&& wpl);\n+    void UnLink(uint32 wp_id);\n+    inline void UnLink(WanderNodeLink const& wpl) { return UnLink(wpl.Id()); }\n+    inline void UnLink(WanderNode const* wp) { return UnLink(wp->GetWPId()); }\n+    inline bool HasLink(uint32 wp_id) const { return GetLink(wp_id) != _links.cend(); }\n+    inline bool HasLink(WanderNodeLink const& wpl) const { return HasLink(wpl.Id()); }\n+    inline bool HasLink(WanderNode const* wp) const { return HasLink(wp->GetWPId()); }\n+    auto GetLinks() const -> typename std::add_const_t<WanderNode::node_lltype>& { return _links; }\n+    auto GetLink(uint32 wp_id) -> typename WanderNode::node_lltype::iterator {\n+        return std::ranges::find_if(_links, [=](WanderNodeLink const& wpl) { return wpl.Id() == wp_id; });\n+    }\n+    auto GetLink(uint32 wp_id) const -> typename WanderNode::node_lltype::const_iterator {\n+        return std::ranges::find_if(_links, [=](WanderNodeLink const& wpl) { return wpl.Id() == wp_id; });\n+    }\n+\n+    void SetLinkWeight(uint32 wp_id, uint32 new_weight);\n+\n+    void SetLevels(std::pair<uint8, uint8> levels) { std::tie(_minLevel, _maxLevel) = levels; }\n+    inline void SetLevels(uint8 minLevel, uint8 maxLevel) { SetLevels(std::pair{ minLevel, maxLevel }); }\n+\n+    void SetWaitTime(std::pair<uint32, uint32> waitTime) { std::tie(_minWaitTime, _maxWaitTime) = waitTime; }\n+    inline void SetWaitTime(uint32 minWaitTime, uint32 maxWaitTime) { SetWaitTime(std::pair{ minWaitTime, maxWaitTime }); }\n+\n+    void SetProximity(float proximity) { _proximity = proximity; }\n+\n+    void SetFlags(BotWPFlags flags);\n+    void RemoveFlags(BotWPFlags flags);\n+    bool HasFlag(BotWPFlags flags) const;\n+    bool HasAllFlags(BotWPFlags flags) const;\n+\n+    void SetName(std::string const& name) { _name = name; }\n+\n+    void SetId(uint32 newid) { _wpId = newid; }\n+\n+    std::string ToString(int32 link_weight = -1) const;\n+\n+    uint32 GetWPId() const { return _wpId; }\n+    uint32 GetMapId() const { return _mapId; }\n+    uint32 GetZoneId() const { return _zoneId; }\n+    uint32 GetAreaId() const { return _areaId; }\n+    std::string const& GetName() const { return _name; }\n+    std::pair<uint8, uint8> GetLevels() const { return { _minLevel, _maxLevel }; }\n+    std::pair<uint32, uint32> GetWaitTime() const { return { _minWaitTime, _maxWaitTime }; }\n+    float GetProximity() const { return _proximity; }\n+    uint32 GetFlags() const { return _flags; }\n+\n+    void SetupLinkFromAura() const;\n+    void SetupLinkToAura() const;\n+\n+private:\n+    void _setLinkedBy(WanderNode const*/* lwp*/);\n+    void _setUnLinkedBy(WanderNode const*/* lwp*/);\n+\n+    uint32 _wpId;\n+    const uint32 _mapId;\n+    const uint32 _zoneId;\n+    const uint32 _areaId;\n+    /*const*/ std::string _name;\n+    uint8 _minLevel;\n+    uint8 _maxLevel;\n+    uint32 _minWaitTime;\n+    uint32 _maxWaitTime;\n+    float _proximity;\n+    uint32 _flags;\n+\n+    node_lltype _links;\n+    uint32 _to_links_count;\n+\n+    Creature* _creature;\n+};\n+\n+#endif //BOTWANDERFUL_H_\ndiff --git a/src/server/game/AI/NpcBots/bpet_ai.cpp b/src/server/game/AI/NpcBots/bpet_ai.cpp\nnew file mode 100644\nindex 0000000000..27be0d5051\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bpet_ai.cpp\n@@ -0,0 +1,2571 @@\n+#include \"bpet_ai.h\"\n+#include \"bot_GridNotifiers.h\"\n+#include \"botconfig.h\"\n+#include \"botlogtraits.h\"\n+#include \"botmgr.h\"\n+#include \"Containers.h\"\n+#include \"LFGMgr.h\"\n+#include \"Log.h\"\n+#include \"Map.h\"\n+#include \"MotionMaster.h\"\n+#include \"ObjectMgr.h\"\n+#include \"PointMovementGenerator.h\"\n+#include \"SpellAuraEffects.h\"\n+#include \"Transport.h\"\n+#include \"World.h\"\n+/*\n+NpcBot Pet System by Trickerer (https://github.com/trickerer/Trinity-Bots; onlysuffering@gmail.com)\n+*/\n+\n+static constexpr uint32 SHAMAN_MAX_PET_POSITIONS = 2;\n+static constexpr uint32 DRUID_MAX_PET_POSITIONS = 3;\n+static constexpr uint32 DK_MAX_PET_POSITIONS = 10;\n+static constexpr uint32 DARK_RANGER_MAX_PET_POSITIONS = 5;\n+static constexpr uint32 NECROMANCER_MAX_PET_POSITIONS = 12;\n+static constexpr uint32 CRYPT_LORD_MAX_PET_POSITIONS = 6;\n+static constexpr float ShamanPetPositionAnglesByPosNumber[SHAMAN_MAX_PET_POSITIONS] =\n+{\n+    0.f,//left\n+    float(M_PI)//right\n+};\n+static constexpr float DruidPetPositionAnglesByPosNumber[DRUID_MAX_PET_POSITIONS] =\n+{\n+    0.f,//left\n+    float(M_PI)/2,//back\n+    float(M_PI)//right\n+};\n+static constexpr float DKPetPositionAnglesByPosNumber[DK_MAX_PET_POSITIONS] =\n+{\n+    0.f,\n+    float(M_PI),\n+    0.3490658f,//1*M_PI/9\n+    0.6981317f,//2*M_PI/9\n+    1.0471975f,//3*M_PI/9\n+    1.3962634f,//4*M_PI/9\n+    1.7453292f,//5*M_PI/9\n+    2.0943951f,//6*M_PI/9\n+    2.4434609f,//7*M_PI/9\n+    2.7925268f //8*M_PI/9\n+};\n+static constexpr float DarkRangerPetPositionAnglesByPosNumber[DARK_RANGER_MAX_PET_POSITIONS] =\n+{\n+    0.f,\n+    float(M_PI),\n+    0.7853981f,//1*M_PI/4\n+    1.5707963f,//2*M_PI/4\n+    2.3561944f //3*M_PI/4\n+};\n+static constexpr float NecromancerPetPositionAnglesByPosNumber[NECROMANCER_MAX_PET_POSITIONS] =\n+{\n+    0.f,\n+    float(M_PI),\n+    float(1 *M_PI/11),\n+    float(2 *M_PI/11),\n+    float(3 *M_PI/11),\n+    float(4 *M_PI/11),\n+    float(5 *M_PI/11),\n+    float(6 *M_PI/11),\n+    float(7 *M_PI/11),\n+    float(8 *M_PI/11),\n+    float(9 *M_PI/11),\n+    float(10*M_PI/11)\n+};\n+static constexpr float CryptLordPetPositionAnglesByPosNumber[CRYPT_LORD_MAX_PET_POSITIONS] =\n+{\n+    0.7853981f,//1*M_PI/4\n+    2.3561944f,//3*M_PI/4\n+    0.0f,\n+    float(M_PI),\n+    5.4977875f,//7*M_PI/4\n+    3.9269910f //5*M_PI/4\n+};\n+\n+static uint16 __rand; //calculated for each bot separately once every updateAI tick\n+\n+bot_pet_ai::bot_pet_ai(Creature* creature) : CreatureAI(creature), _updateTimerEx1{ urand(12000, 15000) } { }\n+\n+uint16 bot_pet_ai::Rand() const\n+{\n+    return __rand;\n+}\n+//0-178\n+void bot_pet_ai::GenerateRand() const\n+{\n+    __rand = urand(0, IAmFree() ? 100 : 100 + (petOwner->GetBotOwner()->GetNpcBotsCount() - 1) * 2);\n+}\n+\n+bool bot_pet_ai::_checkImmunities(Unit const* target, SpellInfo const* spellInfo) const\n+{\n+    return target && spellInfo && !target->IsImmunedToDamage(spellInfo);\n+}\n+//Follow point calculation\n+void bot_pet_ai::_calculatePos(Position& pos) const\n+{\n+    switch (myType)\n+    {\n+        case BOT_PET_LOCUST_SWARM:\n+            pos.Relocate(me);\n+            return;\n+        default:\n+            break;\n+    }\n+\n+    float x,y,z;\n+    //destination\n+    petOwner->GetPosition(x, y, z);\n+    //relative angle\n+    uint32 movFlags = petOwner->m_movementInfo.GetMovementFlags();\n+    float o = petOwner->GetOrientation() + PET_FOLLOW_ANGLE;\n+    uint8 posNum = petOwner->GetBotAI()->GetPetPositionNumber(me);\n+    if (petOwner->GetBotClass() == BOT_CLASS_DEATH_KNIGHT)\n+        o += DKPetPositionAnglesByPosNumber[posNum];\n+    else if (petOwner->GetBotClass() == BOT_CLASS_DRUID)\n+        o += DruidPetPositionAnglesByPosNumber[posNum];\n+    else if (petOwner->GetBotClass() == BOT_CLASS_SHAMAN)\n+        o += ShamanPetPositionAnglesByPosNumber[posNum];\n+    else if (petOwner->GetBotClass() == BOT_CLASS_DARK_RANGER)\n+        o += DarkRangerPetPositionAnglesByPosNumber[posNum];\n+    else if (petOwner->GetBotClass() == BOT_CLASS_NECROMANCER)\n+        o += NecromancerPetPositionAnglesByPosNumber[posNum];\n+    else if (petOwner->GetBotClass() == BOT_CLASS_CRYPT_LORD)\n+        o += CryptLordPetPositionAnglesByPosNumber[posNum];\n+\n+    o = Position::NormalizeOrientation(o);\n+    //distance\n+    x += (PET_FOLLOW_DIST + me->GetCombatReach() + petOwner->GetCombatReach()) * std::cos(o);\n+    y += (PET_FOLLOW_DIST + me->GetCombatReach() + petOwner->GetCombatReach()) * std::sin(o);\n+    if (movFlags & MOVEMENTFLAG_FORWARD)\n+    {\n+        static float const aheadDist = 6.f;\n+        x = x + aheadDist * std::cos(petOwner->GetOrientation());\n+        y = y + aheadDist * std::sin(petOwner->GetOrientation());\n+    }\n+    if (!petOwner->GetTransport())\n+        me->UpdateGroundPositionZ(x, y, z);\n+    if (me->GetPositionZ() < z)\n+        z += 0.5f; //prevent going underground\n+\n+    pos.m_positionX = x;\n+    pos.m_positionY = y;\n+    pos.m_positionZ = z;\n+}\n+void bot_pet_ai::SetBotCommandState(uint32 st, bool force, Position* newpos)\n+{\n+    if (!(st & (BOT_COMMAND_INACTION)))\n+    {\n+        if (!me->IsAlive() || JumpingOrFalling())\n+            return;\n+    }\n+\n+    switch (myType)\n+    {\n+        case BOT_PET_LOCUST_SWARM:\n+            return;\n+        default:\n+            break;\n+    }\n+\n+    if ((st & BOT_COMMAND_FOLLOW) && !IsChanneling() &&\n+        ((!me->isMoving() && !IsCasting() && petOwner->GetBotOwner()->IsAlive()) || force))\n+    {\n+        if (CCed(me, true)) return;\n+        if (me->isMoving() && Rand() > 10) return;\n+\n+        float x,y,z;\n+        bool dest_valid = petOwner->GetMotionMaster()->GetDestination(x, y, z);\n+        float pdist = dest_valid ? me->GetDistance(x, y, z) : 0.0f;\n+        if (dest_valid && (pdist < 6.f || pdist > 20.f))\n+        {\n+            if (!me->HasUnitState(UNIT_STATE_FOLLOW))\n+                me->GetMotionMaster()->MoveFollow(petOwner, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE);\n+        }\n+        else\n+        {\n+            if (!newpos)\n+                _calculatePos(movepos);\n+            else\n+            {\n+                movepos.m_positionX = newpos->m_positionX;\n+                movepos.m_positionY = newpos->m_positionY;\n+                movepos.m_positionZ = newpos->m_positionZ;\n+            }\n+\n+            float speed = 0.0f;\n+            if (!IAmFree() && !(petOwner->IsWalking() || HasBotCommandState(BOT_COMMAND_WALK)))\n+            {\n+                const float baserunspeed = petOwner->GetSpeed(MOVE_RUN);\n+                if (pdist > 50.0f)\n+                    speed = baserunspeed * 2.0f;\n+                else if (pdist > 30.0f)\n+                    speed = baserunspeed * 1.5f;\n+                else if (pdist > 10.0f)\n+                    speed = baserunspeed * 1.25f;\n+            }\n+            me->GetMotionMaster()->Add(new PointMovementGenerator<Creature>(1, movepos.m_positionX, movepos.m_positionY, movepos.m_positionZ, true, speed));\n+        }\n+        RemoveBotCommandState(BOT_COMMAND_STAY | BOT_COMMAND_FULLSTOP | BOT_COMMAND_ATTACK | BOT_COMMAND_COMBATRESET);\n+    }\n+    else if (st & BOT_COMMAND_INACTION)\n+    {\n+        uint32 removeMask = BOT_COMMAND_INACTION & GetBotCommandState();\n+        st &= ~removeMask;\n+        RemoveBotCommandState(removeMask | BOT_COMMAND_MASK_NOCAST_ANY | BOT_COMMAND_STAY | BOT_COMMAND_FULLSTOP | BOT_COMMAND_ATTACK);\n+        me->AttackStop();\n+        me->InterruptNonMeleeSpells(true);\n+    }\n+    else if (st & BOT_COMMAND_FULLSTOP)\n+    {\n+        RemoveBotCommandState(BOT_COMMAND_FOLLOW | BOT_COMMAND_STAY | BOT_COMMAND_ATTACK);\n+        me->AttackStop();\n+        me->InterruptNonMeleeSpells(true);\n+        if (me->isMoving())\n+            me->BotStopMovement();\n+    }\n+    else if (st & BOT_COMMAND_STAY)\n+    {\n+        RemoveBotCommandState(BOT_COMMAND_FOLLOW | BOT_COMMAND_FULLSTOP);\n+        if (me->isMoving())\n+            me->BotStopMovement();\n+    }\n+    else if (st & BOT_COMMAND_ATTACK)\n+    {\n+        RemoveBotCommandState(BOT_COMMAND_FOLLOW);\n+    }\n+    else if (st & BOT_COMMAND_COMBATRESET)\n+    {\n+        RemoveBotCommandState(BOT_COMMAND_ATTACK);\n+    }\n+    _botCommandState |= st;\n+}\n+\n+void bot_pet_ai::RemoveBotCommandState(uint32 st)\n+{\n+    _botCommandState &= ~st;\n+}\n+// CURES\n+//cycle through the group sending members for cure\n+void bot_pet_ai::CureGroup(uint32 cureSpell, uint32 diff)\n+{\n+    if (!cureSpell) return;\n+    if (GC_Timer > diff) return;\n+    if (IsCasting()) return;\n+\n+    if (IAmFree())\n+    {\n+        std::list<Unit*> cureTargets;\n+\n+        if (_canCureTarget(me, cureSpell))\n+            cureTargets.push_back(me);\n+        if (_canCureTarget(petOwner, cureSpell))\n+            cureTargets.push_back(petOwner);\n+\n+        if (!cureTargets.empty())\n+            me->CastSpell(Bcore::Containers::SelectRandomContainerElement(cureTargets), cureSpell, false);\n+\n+        return;\n+    }\n+\n+    if (!me->GetMap()->IsRaid() && Rand() > 35)\n+        return;\n+\n+    std::list<Unit*> targets;\n+    Group const* pGroup = petOwner->GetBotOwner()->GetGroup();\n+    Unit* u = nullptr;\n+    if (!pGroup)\n+    {\n+        if (_canCureTarget(petOwner->GetBotOwner(), cureSpell))\n+            targets.push_back(petOwner->GetBotOwner());\n+\n+        for (auto const& [_, bot] : *petOwner->GetBotOwner()->GetBotMgr()->GetBotMap())\n+        {\n+            u = bot;\n+            if (!u || !u->IsInWorld() || me->GetMap() != u->FindMap() || !u->IsAlive()) continue;\n+            if (_canCureTarget(u, cureSpell))\n+                targets.push_back(u);\n+        }\n+\n+        for (Unit* m : petOwner->GetBotOwner()->m_Controlled)\n+        {\n+            u = m;\n+            if (!u || !u->IsPet() || !u->IsAlive() || me->GetDistance(u) > 30) continue;\n+\n+            if (_canCureTarget(u, cureSpell))\n+                targets.push_back(u);\n+        }\n+    }\n+    else\n+    {\n+        bool Bots = false;\n+        for (GroupReference const* itr = pGroup->GetFirstMember(); itr != nullptr; itr = itr->next())\n+        {\n+            Player* tPlayer = itr->GetSource();\n+            if (!tPlayer || (!tPlayer->IsAlive() && !tPlayer->HaveBot())) continue;\n+            if (!tPlayer->IsInWorld() || tPlayer->IsBeingTeleported()) continue;\n+            if (me->GetMap() != tPlayer->FindMap()) continue;\n+            if (!Bots && tPlayer->HaveBot())\n+                Bots = true;\n+            if (_canCureTarget(tPlayer, cureSpell))\n+                targets.push_back(tPlayer);\n+        }\n+        if (!Bots) return;\n+        for (GroupReference const* itr = pGroup->GetFirstMember(); itr != nullptr; itr = itr->next())\n+        {\n+            Player* tPlayer = itr->GetSource();\n+            if (tPlayer == nullptr) continue;\n+            if (!tPlayer->IsInWorld() || tPlayer->IsBeingTeleported()) continue;\n+            if (me->GetMap() != tPlayer->FindMap()) continue;\n+\n+            if (tPlayer->HaveBot())\n+            {\n+                for (auto const& [_, bot] : *tPlayer->GetBotMgr()->GetBotMap())\n+                {\n+                    u = bot;\n+                    if (!u || !u->IsInWorld() || me->GetMap() != u->FindMap() || !u->IsAlive()) continue;\n+                    if (_canCureTarget(u, cureSpell))\n+                        targets.push_back(u);\n+                }\n+            }\n+\n+            for (Unit* m : tPlayer->m_Controlled)\n+            {\n+                u = m;\n+                if (!u || !u->IsPet() || !u->IsAlive() || me->GetDistance(u) > 30) continue;\n+\n+                if (_canCureTarget(u, cureSpell))\n+                    targets.push_back(u);\n+            }\n+        }\n+    }\n+\n+    if (!targets.empty())\n+        me->CastSpell(Bcore::Containers::SelectRandomContainerElement(targets), cureSpell, false);\n+}\n+\n+// determines if unit has something to cure\n+bool bot_pet_ai::_canCureTarget(Unit const* target, uint32 cureSpell) const\n+{\n+    if (me->GetLevel() < 10 || target->GetLevel() < 10) return false;\n+    if (target->HasUnitState(UNIT_STATE_ISOLATED)) return false;\n+    if (target->IsCreature() && target->ToCreature()->IsTempBot()) return false;\n+\n+    SpellInfo const* info = sSpellMgr->GetSpellInfo(cureSpell);\n+    if (!info)\n+        return false;\n+\n+    if (me->GetDistance(target) > CalcSpellMaxRange(cureSpell, false))\n+        return false;\n+\n+    uint32 dispelMask = 0;\n+    for (auto i : NPCBots::index_array<uint8, MAX_SPELL_EFFECTS>)\n+        if (info->_effects[i].Effect == SPELL_EFFECT_DISPEL)\n+            dispelMask |= SpellInfo::GetDispelMask(DispelType(info->_effects[i].MiscValue));\n+\n+    if (dispelMask == 0)\n+        return false;\n+\n+    std::list<Aura const*> dispel_list;\n+    _getBotDispellableAuraList(target, me, dispelMask, dispel_list);\n+\n+    return !(dispel_list.empty());\n+}\n+\n+void bot_pet_ai::_getBotDispellableAuraList(Unit const* target, Unit const* caster, uint32 dispelMask, std::list<Aura const*> &dispelList) const\n+{\n+    //Unholy Blight prevents diseases from being dispelled\n+    if ((dispelMask & (1u<<DISPEL_DISEASE)) &&\n+        target->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DEATHKNIGHT, 1494, 0))\n+        dispelMask &= ~(1u<<DISPEL_DISEASE);\n+\n+    for (auto const& [_, aura] : target->GetOwnedAuras())\n+    {\n+        if (aura->IsPassive())\n+            continue;\n+\n+        AuraApplication const* aurApp = aura->GetApplicationOfTarget(target->GetGUID());\n+        if (!aurApp)\n+            continue;\n+\n+        if (aura->GetSpellInfo()->GetDispelMask() & dispelMask)\n+        {\n+            //do not dispel positive auras from enemies and negative ones from friends\n+            if (aurApp->IsPositive() == target->IsFriendlyTo(caster))\n+                continue;\n+\n+            //skip Vampiric Touch to prevent being CCed just heal it out\n+            if (aura->GetSpellInfo()->IsRankOf(sSpellMgr->GetSpellInfo(34914)))\n+                continue;\n+\n+            if (((aura->GetSpellInfo()->AttributesEx7 & SPELL_ATTR7_DISPEL_CHARGES) ? aura->GetCharges() : aura->GetStackAmount()) > 0)\n+                dispelList.push_back(aura);\n+        }\n+    }\n+}\n+\n+uint32 bot_pet_ai::GetData(uint32 data) const\n+{\n+    switch (data)\n+    {\n+        case BOTPETAI_MISC_DURATION:\n+            return 0;\n+        case BOTPETAI_MISC_DURATION_MAX:\n+            return 0;\n+        case BOTPETAI_MISC_MAXLEVEL:\n+            return petOwner->GetLevel();\n+        case BOTPETAI_MISC_FIXEDLEVEL:\n+            return 0;\n+        case BOTPETAI_MISC_CARRY:\n+            return 0;\n+        case BOTPETAI_MISC_CAPACITY:\n+            return 0;\n+        case BOTPETAI_MISC_MAX_ATTACKERS:\n+            return 0;\n+        default:\n+            BOT_LOG_DEBUG(\"entities.unit\", \"bot_pet_ai::GetData(): unk data type {}!\", data);\n+            return 0;\n+    }\n+}\n+\n+void bot_pet_ai::SetPetStats(bool force)\n+{\n+    shouldUpdateStats = false;\n+\n+    switch (myType)\n+    {\n+        //warlock\n+        case BOT_PET_IMP:\n+        case BOT_PET_VOIDWALKER:\n+        case BOT_PET_SUCCUBUS:\n+        case BOT_PET_FELHUNTER:\n+        case BOT_PET_FELGUARD:\n+        //hunter\n+        //cunning\n+        case BOT_PET_SPIDER:\n+        case BOT_PET_SERPENT:\n+        case BOT_PET_BIRDOFPREY:\n+        case BOT_PET_BAT:\n+        case BOT_PET_WINDSERPENT:\n+        case BOT_PET_RAVAGER:\n+        case BOT_PET_DRAGONHAWK:\n+        case BOT_PET_NETHERRAY:\n+        case BOT_PET_SPOREBAT:\n+        //ferocity\n+        case BOT_PET_CARRIONBIRD:\n+        case BOT_PET_RAPTOR:\n+        case BOT_PET_WOLF:\n+        case BOT_PET_TALLSTRIDER:\n+        case BOT_PET_CAT:\n+        case BOT_PET_HYENA:\n+        case BOT_PET_WASP:\n+        case BOT_PET_TEROMOTH:\n+        //tenacity\n+        case BOT_PET_SCORPID:\n+        case BOT_PET_TURTLE:\n+        case BOT_PET_GORILLA:\n+        case BOT_PET_BEAR:\n+        case BOT_PET_BOAR:\n+        case BOT_PET_CRAB:\n+        case BOT_PET_CROCOLISK:\n+        case BOT_PET_WARPSTALKER:\n+        //cunning (exotic)\n+        case BOT_PET_SILITHID:\n+        case BOT_PET_CHIMAERA:\n+        //ferocity (exotic)\n+        case BOT_PET_SPIRITBEAST:\n+        case BOT_PET_COREHOUND:\n+        case BOT_PET_DEVILSAUR:\n+        //tenacity (exotic)\n+        case BOT_PET_RHINO:\n+        case BOT_PET_WORM:\n+        //death knight\n+        case BOT_PET_GHOUL:\n+        //case BOT_PET_GARGOYLE:\n+        //case BOT_PET_DANCING_RUNE_WEAPON:\n+        //case BOT_PET_AOD_GHOUL:\n+        //priest\n+        case BOT_PET_SHADOWFIEND:\n+        //shaman\n+        case BOT_PET_SPIRIT_WOLF:\n+        //mage\n+        case BOT_PET_WATER_ELEMENTAL:\n+        //druid\n+        case BOT_PET_FORCE_OF_NATURE:\n+        //archmage\n+        case BOT_PET_AWATER_ELEMENTAL:\n+        //dreadlord\n+        case BOT_PET_INFERNAL:\n+        //dark ranger\n+        case BOT_PET_DARK_MINION:\n+        case BOT_PET_DARK_MINION_ELITE:\n+        //necromancer\n+        case BOT_PET_NECROSKELETON:\n+        //sea witch\n+        case BOT_PET_TORNADO:\n+        //crypt lord\n+        case BOT_PET_CARRION_BEETLE1:\n+        case BOT_PET_CARRION_BEETLE2:\n+        case BOT_PET_CARRION_BEETLE3:\n+        case BOT_PET_LOCUST_SWARM:\n+            break;\n+        default:\n+            BOT_LOG_ERROR(\"entities.player\", \"bot_pet_ai::SetPetStats(): unk pet type {}, aborting\", myType);\n+            return;\n+    }\n+\n+    //some time limited summons can only init stats and never change them\n+    switch (myType)\n+    {\n+        case BOT_PET_SHADOWFIEND:\n+        case BOT_PET_SPIRIT_WOLF:\n+        //case BOT_PET_WATER_ELEMENTAL:\n+        case BOT_PET_FORCE_OF_NATURE:\n+        case BOT_PET_DARK_MINION:\n+        case BOT_PET_DARK_MINION_ELITE:\n+        case BOT_PET_NECROSKELETON:\n+        case BOT_PET_TORNADO:\n+        case BOT_PET_CARRION_BEETLE1:\n+        case BOT_PET_CARRION_BEETLE2:\n+        case BOT_PET_CARRION_BEETLE3:\n+        case BOT_PET_LOCUST_SWARM:\n+            if (force == false)\n+                return;\n+            break;\n+        default:\n+            break;\n+    }\n+\n+    uint8 level = GetData(BOTPETAI_MISC_FIXEDLEVEL);\n+    level = level ? level : std::min<uint8>(petOwner->GetLevel(), GetData(BOTPETAI_MISC_MAXLEVEL));\n+    if (level != me->GetLevel())\n+    {\n+        me->SetLevel(level);\n+        force = true;\n+    }\n+\n+    int32 spdtotal;\n+    switch (petOwner->GetBotClass())\n+    {\n+        case BOT_CLASS_WARLOCK:\n+        case BOT_CLASS_PRIEST:\n+        case BOT_CLASS_MAGE:\n+        case BOT_CLASS_DRUID:\n+        case BOT_CLASS_ARCHMAGE:\n+        case BOT_CLASS_DREADLORD:\n+        case BOT_CLASS_SEA_WITCH:\n+            spdtotal = petOwner->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_MAGIC);\n+            break;\n+        default:\n+            spdtotal = 0;\n+            break;\n+    }\n+\n+    if (force)\n+    {\n+        InitPetSpells();\n+        ApplyPetPassives();\n+\n+        me->RemoveAurasDueToSpell(DAMAGEDONE_PASSIVE);\n+        me->RemoveAurasDueToSpell(DAMAGETAKEN_PASSIVE);\n+        me->RemoveAurasDueToSpell(SPELLDAMAGE_PASSIVE);\n+        me->RemoveAurasDueToSpell(SPELLPENETRATION_PASSIVE);\n+        me->RemoveAurasDueToSpell(SPELLHASTE_PASSIVE);\n+        me->RemoveAurasDueToSpell(CRITBONUS_PASSIVE);\n+\n+        me->CastSpell(me, DAMAGEDONE_PASSIVE, true);\n+        me->CastSpell(me, DAMAGETAKEN_PASSIVE, true);\n+        me->CastSpell(me, SPELLDAMAGE_PASSIVE, true);\n+        me->CastSpell(me, SPELLPENETRATION_PASSIVE, true);\n+        me->CastSpell(me, SPELLHASTE_PASSIVE, true);\n+        me->CastSpell(me, CRITBONUS_PASSIVE, true);\n+    }\n+\n+    //base stats\n+    uint32 myarmor = 0;\n+    if (force)\n+    {\n+        uint32 origEntry = bot_ai::GetPetOriginalEntry(myType);\n+        CreatureTemplate const* cinfo = sObjectMgr->GetCreatureTemplate(origEntry);\n+        ASSERT(cinfo);\n+\n+        me->SetMeleeDamageSchool(SpellSchools(cinfo->dmgschool));\n+\n+        PetLevelInfo const* pInfo = sObjectMgr->GetPetLevelInfo(origEntry, level);\n+        if (pInfo)\n+        {\n+            me->SetCreateHealth(pInfo->health);\n+            if (petOwner->GetBotClass() == BOT_CLASS_HUNTER) //hunter pet use focus\n+            {\n+                //prevent from modifying powers inside\n+                if (me->GetPowerType() != POWER_FOCUS)\n+                {\n+                    me->SetMaxPower(POWER_FOCUS, 100);\n+                    me->SetByteValue(UNIT_FIELD_BYTES_0, 3, POWER_FOCUS);\n+                }\n+            }\n+            else if (myType == BOT_PET_GHOUL)\n+            {\n+                if (me->GetPowerType() != POWER_ENERGY)\n+                {\n+                    me->SetMaxPower(POWER_ENERGY, 100);\n+                    me->SetByteValue(UNIT_FIELD_BYTES_0, 3, POWER_ENERGY);\n+                }\n+            }\n+            else if (myType == BOT_PET_SHADOWFIEND)\n+            {\n+                me->SetCreateHealth(28 + 30*level);\n+                me->SetCreateMana(28 + 10*level);\n+                me->SetPowerType(POWER_MANA);\n+            }\n+            else if (myType == BOT_PET_SPIRIT_WOLF)\n+            {\n+                me->SetCreateHealth(30*level);\n+                me->SetByteValue(UNIT_FIELD_BYTES_0, 3, MAX_POWERS);\n+            }\n+            else if (myType == BOT_PET_FORCE_OF_NATURE)\n+            {\n+                me->SetCreateHealth(30*(level+1));\n+                me->SetByteValue(UNIT_FIELD_BYTES_0, 3, MAX_POWERS);\n+            }\n+            else if (myType == BOT_PET_DARK_MINION)\n+            {\n+                me->SetCreateHealth(pInfo->health / 4);\n+                me->SetByteValue(UNIT_FIELD_BYTES_0, 3, MAX_POWERS);\n+            }\n+            else if (myType == BOT_PET_DARK_MINION_ELITE)\n+            {\n+                me->SetCreateHealth(pInfo->health / 2);\n+                me->SetByteValue(UNIT_FIELD_BYTES_0, 3, MAX_POWERS);\n+            }\n+            else if (myType == BOT_PET_NECROSKELETON)\n+            {\n+                me->SetCreateHealth(pInfo->health / 5);\n+                me->SetByteValue(UNIT_FIELD_BYTES_0, 3, MAX_POWERS);\n+            }\n+            else if (myType == BOT_PET_AWATER_ELEMENTAL || myType == BOT_PET_INFERNAL)\n+            {\n+                //custom pets / not using mana\n+                me->SetByteValue(UNIT_FIELD_BYTES_0, 3, MAX_POWERS);\n+            }\n+            else if (myType == BOT_PET_CARRION_BEETLE1)\n+            {\n+                me->SetCreateHealth(pInfo->health / 4);\n+                me->SetByteValue(UNIT_FIELD_BYTES_0, 3, MAX_POWERS);\n+            }\n+            else if (myType == BOT_PET_CARRION_BEETLE2)\n+            {\n+                me->SetCreateHealth(pInfo->health / 4);\n+                me->SetByteValue(UNIT_FIELD_BYTES_0, 3, MAX_POWERS);\n+            }\n+            else if (myType == BOT_PET_CARRION_BEETLE3)\n+            {\n+                me->SetCreateHealth(pInfo->health / 3);\n+                me->SetByteValue(UNIT_FIELD_BYTES_0, 3, MAX_POWERS);\n+            }\n+            else\n+            {\n+                me->SetCreateMana(pInfo->mana);\n+                me->SetPowerType(POWER_MANA);\n+            }\n+\n+            if (pInfo->armor > 0)\n+                myarmor = pInfo->armor;\n+\n+            for (auto i : NPCBots::index_array<uint8, MAX_STATS>)\n+                me->SetCreateStat(Stats(i), pInfo->stats[i]);\n+\n+            float mindamage, maxdamage;\n+            switch (myType)\n+            {\n+                case BOT_PET_SHADOWFIEND:       mindamage = float(level * 3 + spdtotal * 0.3f);  maxdamage = float(level * 5 + spdtotal * 0.3f);  break;\n+                case BOT_PET_SPIRIT_WOLF:       mindamage = float(level * 3);                    maxdamage = float(level * 5);                    break;\n+                case BOT_PET_FORCE_OF_NATURE:   mindamage = float(level * 2) + spdtotal * 0.15f; maxdamage = float(level * 3) + spdtotal * 0.15f; break;\n+                case BOT_PET_DARK_MINION:       mindamage = float(level);                        maxdamage = float(level + level / 2);            break;\n+                case BOT_PET_DARK_MINION_ELITE: mindamage = float(level * 3);                    maxdamage = float(level * 4);                    break;\n+                case BOT_PET_NECROSKELETON:     mindamage = float(level);                        maxdamage = float(level + level / 3);            break;\n+                case BOT_PET_CARRION_BEETLE1:   mindamage = float(level / 2 + 2);                maxdamage = float(level / 4 * 3 + 2);            break;\n+                case BOT_PET_CARRION_BEETLE2:   mindamage = float(level / 4 * 3 + 8);            maxdamage = float(level + level / 2 + 8);        break;\n+                case BOT_PET_CARRION_BEETLE3:   mindamage = float(level + level / 2 + 10);       maxdamage = float(level + level / 4 * 3 + 15);   break;\n+                default:\n+                    if (myType < BOT_PET_AWATER_ELEMENTAL)\n+                    {\n+                        //we have to compensate for a different way damage is calculated for non-guardians\n+                        mindamage = pInfo->minDamage * 0.75f;\n+                        maxdamage = pInfo->maxDamage * 0.75f;\n+                    }\n+                    else\n+                    {\n+                        mindamage = float(level - (level / 4));\n+                        maxdamage = float(level + (level / 4));\n+                    }\n+                    break;\n+            }\n+\n+            me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, mindamage);\n+            me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, maxdamage);\n+        }\n+        else\n+        {\n+            CreatureBaseStats const* stats = sObjectMgr->GetCreatureBaseStats(level, me->GetCreatureTemplate()->unit_class);\n+            me->SetCreateHealth(stats->BaseHealth[cinfo->expansion]);\n+            me->SetCreateMana(stats->BaseMana);\n+\n+            me->SetCreateStat(STAT_STRENGTH, level * 3 + 20);\n+            me->SetCreateStat(STAT_AGILITY, level * 2 + 20);\n+            me->SetCreateStat(STAT_STAMINA, level * 5 + 20);\n+            me->SetCreateStat(STAT_INTELLECT, level * 2 + 25);\n+            me->SetCreateStat(STAT_SPIRIT,  level * 2 + 30);\n+            BOT_LOG_ERROR(\"entities.unit\", \"SetPetStats(): pInfo is NULL, setting default stats for pet {}\", myType);\n+        }\n+    }\n+\n+    //STAT INHERITANCE\n+    //STAT -- 'mod' -- description\n+    // WARLOCK\n+    //AP      x0.57 -- attack power from spd\n+    //Armor   x0.35 -- armor\n+    //Resist  x0.4  -- resistances\n+    //Stamina x0.75 -- stamina\n+    //Int     x0.3  -- int\n+    //Spd     x0.15 -- spd\n+    //Sppen   x1.00 -- sppenetration\n+    // HUNTER\n+    //AP      x0.22 -- attack power/spd from ranged AP (0.338 wild hunt)\n+    //Stamina x0.4  -- health (0.63 wild hunt)\n+    //Spd   x0.1287 -- spd from ranged AP (0.18 wild hunt)\n+    //rest is same as warlock\n+    // DK\n+    //AP      x1.52 -- attack power from master's strength\n+    //Stamina x0.88 -- health\n+    //rest is same as warlock\n+    // PRIEST\n+    //Damage from spd\n+    // SHAMAN\n+    //AP      x0.6  -- attack power glyphed\n+    //Stamina x0.75 -- health\n+    // MAGE\n+    //Stamina x0.75 -- health\n+    //Spd     x0.40 -- spd\n+    //Int     x0.3  -- int\n+    // DRUID\n+    //Stamina x0.45 -- health\n+    //\n+    // SHAMAN\n+    //\n+    // ARCHMAGE\n+    //Stamina x2.5  -- stamina\n+    //Spd     x1.0  -- spd\n+    //rest is same as warlock\n+    // DREADLORD\n+    //AP      x1.00 -- attack power from spd\n+    //Resist  x2.0  -- resistances\n+    //Stamina x2.5  -- stamina\n+    //Spd     x1.0  -- spd\n+    // DARK RANGER\n+    //AP      x0.50 -- attack power\n+    //Resist  x0.3  -- resistances\n+    //Stamina x0.8  -- stamina\n+    //rest is same as warlock\n+    // NECROMANCER\n+    //AP      x0.40 -- attack power\n+    //Resist  x0.25 -- resistances\n+    //Stamina x0.8  -- stamina\n+    //rest is same as warlock\n+    // SEA WITCH\n+    //Spd     x1.0  -- spd\n+    //rest is same as warlock\n+    // CRYPT LORD\n+    //AP      x0.40 -- attack power\n+    //Resist  x1.0  -- resistances\n+    //Stamina x1.5  -- stamina\n+    //Spd     x1.0  -- spd\n+\n+    //attack power\n+    float atpower = /*IAmFree() ? 1000.f :*/ 0.f; //+1000/+0 base pet ap\n+    switch (myType)\n+    {\n+        case BOT_PET_IMP:\n+            atpower += me->GetTotalStatValue(STAT_STRENGTH) - 10.0f;\n+            break;\n+        case BOT_PET_GHOUL:\n+            atpower += me->GetTotalStatValue(STAT_STRENGTH) - 10.0f;\n+            atpower += 1.52f * petOwner->GetTotalStatValue(STAT_STRENGTH);\n+            atpower += 0.3f * petOwner->GetTotalAttackPowerValue(BASE_ATTACK);\n+            atpower += level * 8;\n+            break;\n+        case BOT_PET_DARK_MINION:\n+            atpower += 2 * me->GetTotalStatValue(STAT_STRENGTH) - 20.0f;\n+            atpower += 0.3f * petOwner->GetTotalAttackPowerValue(RANGED_ATTACK);\n+            break;\n+        case BOT_PET_DARK_MINION_ELITE:\n+            atpower += 2 * me->GetTotalStatValue(STAT_STRENGTH) - 20.0f;\n+            atpower += 0.4f * petOwner->GetTotalAttackPowerValue(RANGED_ATTACK);\n+            break;\n+        case BOT_PET_NECROSKELETON:\n+            atpower += 2 * me->GetTotalStatValue(STAT_STRENGTH) - 20.0f;\n+            break;\n+        case BOT_PET_CARRION_BEETLE1:\n+            atpower += 2 * me->GetTotalStatValue(STAT_STRENGTH) - 20.0f;\n+            atpower += 0.15f * petOwner->GetTotalAttackPowerValue(BASE_ATTACK);\n+            break;\n+        case BOT_PET_CARRION_BEETLE2:\n+            atpower += 2 * me->GetTotalStatValue(STAT_STRENGTH) - 15.0f;\n+            atpower += 0.20f * petOwner->GetTotalAttackPowerValue(BASE_ATTACK);\n+            break;\n+        case BOT_PET_CARRION_BEETLE3:\n+            atpower += 2 * me->GetTotalStatValue(STAT_STRENGTH) - 10.0f;\n+            atpower += 0.25f * petOwner->GetTotalAttackPowerValue(BASE_ATTACK);\n+            break;\n+        default:\n+            //atpower += 2 * me->GetTotalStatValue(STAT_STRENGTH) - 20.0f;\n+            break;\n+    }\n+    switch (petOwner->GetBotClass())\n+    {\n+        case BOT_CLASS_HUNTER:\n+            atpower += (level >= 80 ? 0.338f : 0.22f) * petOwner->GetTotalAttackPowerValue(RANGED_ATTACK);\n+            //Hunter vs. Wild\n+            if (level >= 30 && Spec() == BOT_SPEC_HUNTER_SURVIVAL)\n+                atpower += 0.3f * petOwner->GetBotAI()->GetTotalBotStat(BOT_STAT_MOD_STAMINA);\n+            //Animal Handler\n+            if (level >= 35 && Spec() == BOT_SPEC_HUNTER_BEASTMASTERY)\n+                atpower *= 1.1f;\n+            break;\n+        case BOT_CLASS_SHAMAN:\n+            //Glyph of Feral Spirit\n+            atpower += 0.6f * petOwner->GetTotalAttackPowerValue(BASE_ATTACK);\n+            break;\n+        case BOT_CLASS_DRUID:\n+            atpower += 300 + 0.3f * petOwner->GetTotalAttackPowerValue(BASE_ATTACK);\n+            break;\n+        case BOT_CLASS_WARLOCK:\n+            atpower += 0.57f * spdtotal;\n+            //BOT_LOG_ERROR(\"entities.player\", \"SetPetStat(): atpower += 0.57 of {} = {}2f\", spdtotal, atpower);\n+            break;\n+        case BOT_CLASS_DREADLORD:\n+            atpower += spdtotal * 6;\n+            break;\n+        case BOT_CLASS_NECROMANCER:\n+            atpower += 0.75f * spdtotal;\n+            break;\n+        default:\n+            break;\n+    }\n+    me->SetStatFlatModifier(UNIT_MOD_ATTACK_POWER, BASE_VALUE, atpower);\n+    me->UpdateAttackPowerAndDamage();\n+    //armor\n+    myarmor = std::max<uint32>(myarmor, level*50);\n+    myarmor += me->GetStat(STAT_AGILITY)*2 + petOwner->GetArmor()*0.35f;\n+    //armor bonuses\n+    if (petOwner->GetBotClass() == BOT_CLASS_HUNTER)\n+    {\n+        //5% innate\n+        myarmor += myarmor / 20;\n+        //Thick Hide\n+        if (level >= 15)\n+            myarmor += myarmor / 5;\n+        //Natural Armor\n+        if (level >= 20)\n+            myarmor += myarmor / 10;\n+        //Pet Barding\n+        if (level >= 32)\n+            myarmor += myarmor / 10;\n+    }\n+    if (petOwner->GetBotClass() == BOT_CLASS_DARK_RANGER || petOwner->GetBotClass() == BOT_CLASS_NECROMANCER)\n+    {\n+        //even though skeletons have shields their armor needs to be very low\n+        myarmor = myarmor / 4;\n+    }\n+    else if (petOwner->GetBotClass() == BOT_CLASS_CRYPT_LORD)\n+    {\n+        myarmor /= 3;\n+    }\n+    me->SetStatFlatModifier(UNIT_MOD_ARMOR, BASE_VALUE, float(myarmor));\n+    me->UpdateArmor();\n+    //resistances\n+    for (uint8 i = SPELL_SCHOOL_HOLY; i != MAX_SPELL_SCHOOL; ++i)\n+    {\n+        float petResist;\n+        switch (petOwner->GetBotClass())\n+        {\n+            case BOT_CLASS_DREADLORD:\n+                petResist = (petOwner->GetBotAI()->GetBotResistanceBonus(SpellSchools(i)) + petOwner->GetResistance(SpellSchools(i)))*2.0f;\n+                break;\n+            case BOT_CLASS_DARK_RANGER:\n+            case BOT_CLASS_NECROMANCER:\n+                petResist = (petOwner->GetBotAI()->GetBotResistanceBonus(SpellSchools(i)) + petOwner->GetResistance(SpellSchools(i)))*0.3f;\n+                break;\n+            case BOT_CLASS_CRYPT_LORD:\n+                petResist = (petOwner->GetBotAI()->GetBotResistanceBonus(SpellSchools(i)) + petOwner->GetResistance(SpellSchools(i)))*1.0f;\n+                break;\n+            default:\n+                petResist = (petOwner->GetBotAI()->GetBotResistanceBonus(SpellSchools(i)) + petOwner->GetResistance(SpellSchools(i)))*0.4f;\n+                break;\n+        }\n+        me->SetStatFlatModifier(UnitMods(UNIT_MOD_RESISTANCE_START + i), BASE_VALUE, petResist);\n+        me->UpdateResistances(i);\n+    }\n+    //crit physical\n+    if (AuraEffect* critbonus = me->GetAuraEffect(CRITBONUS_PASSIVE, 1, me->GetGUID()))\n+    {\n+        int32 amount = 5; //base crit\n+        switch (petOwner->GetBotClass())\n+        {\n+            case BOT_CLASS_WARLOCK:\n+                //Demonic Tactics part 1 (pet)\n+                amount += level >= 45 ? 10 : 0;\n+                //Improved Demonic Tactics (pshysical)\n+                amount += level >= 50 ? petOwner->GetCreatureCritChance() * 0.3f : 0;\n+                break;\n+            case BOT_CLASS_HUNTER:\n+                //Ferocity\n+                if (level >= 20)\n+                    amount += 10;\n+                //Spider's Bite\n+                if (level >= 44)\n+                    amount += 9;\n+                break;\n+            case BOT_CLASS_DREADLORD:\n+                amount += petOwner->GetCreatureCritChance() * 0.5f;\n+                break;\n+            case BOT_CLASS_DARK_RANGER:\n+            case BOT_CLASS_NECROMANCER:\n+            case BOT_CLASS_CRYPT_LORD:\n+                amount += petOwner->GetCreatureCritChance() * 0.35f;\n+                break;\n+            default:\n+                break;\n+        }\n+        critbonus->ChangeAmount(amount);\n+    }\n+    //crit spell\n+    if (AuraEffect* critbonus = me->GetAuraEffect(CRITBONUS_PASSIVE, 0, me->GetGUID()))\n+    {\n+        int32 amount = 5; //base crit\n+        switch (myType)\n+        {\n+            case BOT_PET_IMP:\n+            case BOT_PET_SUCCUBUS:\n+                //Master Demonologist part 1.2 (pet)\n+                //Master Demonologist part 3.2 (pet)\n+                amount += level >= 35 ? 5 : 0;\n+                //Improved Demonic Tactics (pshysical)\n+                amount += level >= 50 ? petOwner->GetCreatureCritChance() * 0.3f : 0;\n+                break;\n+            default:\n+                break;\n+        }\n+        switch (petOwner->GetBotClass())\n+        {\n+            case BOT_CLASS_WARLOCK:\n+                //Demonic Tactics part 2 (pet)\n+                amount += level >= 45 ? 10 : 0;\n+                break;\n+            case BOT_CLASS_HUNTER:\n+                //Ferocity\n+                if (level >= 20)\n+                    amount += 10;\n+                //Spider's Bite\n+                if (level >= 44)\n+                    amount += 9;\n+                break;\n+            case BOT_CLASS_ARCHMAGE:\n+            case BOT_CLASS_SEA_WITCH:\n+                amount += petOwner->GetCreatureCritChance();\n+                break;\n+            default:\n+                break;\n+        }\n+        critbonus->ChangeAmount(amount);\n+    }\n+    //damage done physical\n+    if (AuraEffect* physdam = me->GetAuraEffect(DAMAGEDONE_PASSIVE, 0, me->GetGUID()))\n+    {\n+        int32 amount = 0;\n+        switch (myType)\n+        {\n+            case BOT_PET_IMP:\n+                //Empowered Imp part 1\n+                amount += level >= 50 ? 30 : 0;\n+                break;\n+            case BOT_PET_INFERNAL:\n+                amount += 100;\n+                break;\n+            default:\n+                break;\n+        }\n+        switch (petOwner->GetBotClass())\n+        {\n+            case BOT_CLASS_WARLOCK:\n+                //Unholy Power\n+                if (myType != BOT_PET_IMP)\n+                    amount += level >= 30 ? 20 : 0;\n+                break;\n+            case BOT_CLASS_HUNTER:\n+                //Hapiness bonus (always happy) + 5% innate\n+                amount += 30;\n+                //Unleashed Fury\n+                if (level >= 20)\n+                    amount += 15;\n+                //Kindred Spirits\n+                if (level >= 55 && Spec() == BOT_SPEC_HUNTER_BEASTMASTERY)\n+                    amount += 20;\n+                //Spiked Collar\n+                if (level >= 32)\n+                    amount += 9;\n+                //Shark Attack\n+                if (level >= 80)\n+                    amount += 6;\n+                break;\n+            default:\n+                break;\n+        }\n+        //Command (Racial)\n+        if (petOwner->GetRace() == RACE_ORC)\n+            amount += 5;\n+        physdam->ChangeAmount(amount);\n+    }\n+    //damage done magic\n+    if (AuraEffect* spelldam = me->GetAuraEffect(DAMAGEDONE_PASSIVE, 1, me->GetGUID()))\n+    {\n+        int32 amount = 0;\n+        switch (myType)\n+        {\n+            case BOT_PET_IMP:\n+                //Empowered Imp part 1, Master Demonologist part 1.2 (pet), Improved Imp part 1\n+                amount += level >= 50 ? 65 : level >= 35 ? 35 : level >= 10 ? 30 : 0;\n+                break;\n+            case BOT_PET_SUCCUBUS:\n+                //Master Demonologist part 3 (pet)\n+                amount += level >= 35 ? 5 : 0;\n+                break;\n+            default:\n+                break;\n+        }\n+        switch (petOwner->GetBotClass())\n+        {\n+            case BOT_CLASS_WARLOCK:\n+                //Unholy Power\n+                if (myType == BOT_PET_IMP)\n+                    amount += level >= 30 ? 20 : 0;\n+                break;\n+            case BOT_CLASS_HUNTER:\n+                //Hapiness bonus (always happy) + 5% innate\n+                amount += 30;\n+                //Unleashed Fury\n+                if (level >= 20)\n+                    amount += 15;\n+                //Kindred Spirits\n+                if (level >= 55 && Spec() == BOT_SPEC_HUNTER_BEASTMASTERY)\n+                    amount += 20;\n+                //Spiked Collar\n+                if (level >= 32)\n+                    amount += 9;\n+                //Shark Attack\n+                if (level >= 80)\n+                    amount += 6;\n+                break;\n+            default:\n+                break;\n+        }\n+        //Command (Racial)\n+        if (petOwner->GetRace() == RACE_ORC)\n+            amount += 5;\n+        spelldam->ChangeAmount(amount);\n+    }\n+    //spell power\n+    if (AuraEffect* spelldam = me->GetAuraEffect(SPELLDAMAGE_PASSIVE, 0, me->GetGUID()))\n+    {\n+        int32 amount = 0;\n+        switch (petOwner->GetBotClass())\n+        {\n+            case BOT_CLASS_HUNTER:\n+                amount += int32(petOwner->GetTotalAttackPowerValue(RANGED_ATTACK) * (level >= 80 ? 0.18f : 0.1287f));\n+                break;\n+            case BOT_CLASS_WARLOCK:\n+                amount += int32(spdtotal * 0.15f);\n+                break;\n+            case BOT_CLASS_MAGE:\n+                amount += int32(spdtotal * 0.4f);\n+                break;\n+            case BOT_CLASS_ARCHMAGE:\n+                amount += int32(spdtotal * 1.0f);\n+                break;\n+            case BOT_CLASS_DREADLORD:\n+                amount += int32(spdtotal * 1.0f);\n+                break;\n+            case BOT_CLASS_SEA_WITCH:\n+                amount += int32(spdtotal * 1.0f);\n+                break;\n+            default:\n+                break;\n+        }\n+        spelldam->ChangeAmount(amount);\n+    }\n+    //spell penetration\n+    if (AuraEffect* spellpenet = me->GetAuraEffect(SPELLPENETRATION_PASSIVE, 0, me->GetGUID()))\n+    {\n+        int32 amount = int32(petOwner->GetCreatureSpellPenetration());\n+        spellpenet->ChangeAmount(amount);\n+    }\n+    //haste spell\n+    if (AuraEffect* spellhaste = me->GetAuraEffect(SPELLHASTE_PASSIVE, 0, me->GetGUID()))\n+    {\n+        int32 amount = 0;\n+        switch (myType)\n+        {\n+            case BOT_PET_IMP:\n+                //Demonic Power part 2\n+                amount += level >= 20 ? 25 : 0;\n+                break;\n+            case BOT_PET_SUCCUBUS:\n+                //Improved Succubus part 1\n+                amount += level >= 20 ? 200 : 0;\n+                break;\n+            case BOT_PET_AWATER_ELEMENTAL:\n+                amount += petOwner->GetBotAI()->GetHaste();\n+                break;\n+            default:\n+                break;\n+        }\n+        spellhaste->ChangeAmount(amount);\n+    }\n+    //dmgtaken\n+    if (AuraEffect* dmgtaken = me->GetAuraEffect(DAMAGETAKEN_PASSIVE, 0, me->GetGUID()))\n+    {\n+        int32 amount = 0;\n+\n+        if (petOwner->GetBotClass() == BOT_CLASS_WARLOCK)\n+        {\n+            //Demonic Resilience part 2\n+            if (level >= 40)\n+                amount += 15;\n+        }\n+        if (petOwner->GetBotClass() == BOT_CLASS_HUNTER)\n+        {\n+            //Great Resistance (everything)\n+            if (level >= 44)\n+                amount += 15;\n+        }\n+        if (petOwner->GetBotClass() == BOT_CLASS_DREADLORD)\n+        {\n+            amount += 25;\n+        }\n+        if (petOwner->GetBotClass() == BOT_CLASS_CRYPT_LORD)\n+        {\n+            switch (myType)\n+            {\n+                case BOT_PET_CARRION_BEETLE1:\n+                    amount += 10;\n+                    break;\n+                case BOT_PET_CARRION_BEETLE2:\n+                    amount += 15;\n+                    break;\n+                case BOT_PET_CARRION_BEETLE3:\n+                    amount += 20;\n+                    break;\n+                default:\n+                    break;\n+            }\n+        }\n+\n+        dmgtaken->ChangeAmount(amount);\n+    }\n+    //hp\n+    float stamValue = me->GetTotalStatValue(STAT_STAMINA) - me->GetCreateStat(STAT_STAMINA);\n+    switch (petOwner->GetBotClass())\n+    {\n+        case BOT_CLASS_HUNTER:\n+            stamValue += (level >= 80 ? 0.63f : 0.4f) * petOwner->GetBotAI()->GetTotalBotStat(BOT_STAT_MOD_STAMINA);\n+            break;\n+        case BOT_CLASS_WARLOCK:\n+            stamValue += 0.75f * petOwner->GetBotAI()->GetTotalBotStat(BOT_STAT_MOD_STAMINA);\n+            break;\n+        case BOT_CLASS_DEATH_KNIGHT:\n+            switch (myType)\n+            {\n+                case BOT_PET_GHOUL:\n+                    stamValue += 0.88f * petOwner->GetBotAI()->GetTotalBotStat(BOT_STAT_MOD_STAMINA);\n+                    break;\n+                default:\n+                    stamValue += 0.3f * petOwner->GetBotAI()->GetTotalBotStat(BOT_STAT_MOD_STAMINA);\n+                    break;\n+            }\n+            break;\n+        case BOT_CLASS_SHAMAN:\n+            stamValue += 0.75f * petOwner->GetBotAI()->GetTotalBotStat(BOT_STAT_MOD_STAMINA);\n+            break;\n+        case BOT_CLASS_MAGE:\n+            stamValue += 0.75f * petOwner->GetBotAI()->GetTotalBotStat(BOT_STAT_MOD_STAMINA);\n+            break;\n+        case BOT_CLASS_DRUID:\n+            stamValue += 0.45f * petOwner->GetBotAI()->GetTotalBotStat(BOT_STAT_MOD_STAMINA);\n+            break;\n+        case BOT_CLASS_ARCHMAGE:\n+            stamValue += 2.50f * petOwner->GetBotAI()->GetTotalBotStat(BOT_STAT_MOD_STAMINA);\n+            break;\n+        case BOT_CLASS_DREADLORD:\n+            stamValue += 2.50f * petOwner->GetBotAI()->GetTotalBotStat(BOT_STAT_MOD_STAMINA);\n+            break;\n+        case BOT_CLASS_DARK_RANGER:\n+            switch (myType)\n+            {\n+                case BOT_PET_DARK_MINION_ELITE:\n+                    stamValue += 1.0f * petOwner->GetBotAI()->GetTotalBotStat(BOT_STAT_MOD_STAMINA);\n+                    break;\n+                default:\n+                    stamValue += 0.8f * petOwner->GetBotAI()->GetTotalBotStat(BOT_STAT_MOD_STAMINA);\n+                    break;\n+            }\n+            break;\n+        case BOT_CLASS_NECROMANCER:\n+            stamValue += 0.75f * petOwner->GetBotAI()->GetTotalBotStat(BOT_STAT_MOD_STAMINA);\n+            break;\n+        case BOT_CLASS_CRYPT_LORD:\n+            switch (myType)\n+            {\n+                case BOT_PET_CARRION_BEETLE1:\n+                    stamValue += 0.25f * petOwner->GetBotAI()->GetTotalBotStat(BOT_STAT_MOD_STAMINA);\n+                    break;\n+                case BOT_PET_CARRION_BEETLE2:\n+                    stamValue += 0.40f * petOwner->GetBotAI()->GetTotalBotStat(BOT_STAT_MOD_STAMINA);\n+                    break;\n+                case BOT_PET_CARRION_BEETLE3:\n+                    stamValue += 0.70f * petOwner->GetBotAI()->GetTotalBotStat(BOT_STAT_MOD_STAMINA);\n+                    break;\n+                default:\n+                    break;\n+            }\n+            break;\n+        default:\n+            break;\n+    }\n+    float stamMult;\n+    switch (myType)\n+    {\n+        case BOT_PET_IMP:        stamMult = 8.4f;  break;\n+        case BOT_PET_VOIDWALKER: stamMult = 11.0f; break;\n+        case BOT_PET_SUCCUBUS:   stamMult = 9.1f;  break;\n+        case BOT_PET_FELHUNTER:  stamMult = 9.5f;  break;\n+        case BOT_PET_FELGUARD:   stamMult = 11.0f; break;\n+        default:                 stamMult = 10.f;  break;\n+    }\n+    //stam bonuses\n+    if (petOwner->GetBotClass() == BOT_CLASS_WARLOCK)\n+    {\n+        //Fel Vitality (pet) part 1\n+        if (level >= 15)\n+            stamValue *= 1.15f;\n+        //Glyph of Voidwalker\n+        if (myType == BOT_PET_VOIDWALKER && level >= 15)\n+            stamValue *= 1.2f;\n+    }\n+    if (petOwner->GetBotClass() == BOT_CLASS_HUNTER)\n+    {\n+        //Endurance Training\n+        if (level >= 10)\n+            stamValue *= 1.1f;\n+        //Greater Stamina\n+        if (level >= 20)\n+            stamValue *= 1.12f;\n+        //Blood of the Rhino part 1\n+        if (level >= 32)\n+            stamValue *= 1.04f;\n+    }\n+    //additional: store stat\n+    me->SetStat(STAT_STAMINA, int32(stamValue));\n+    float m_totalhp = stamValue * stamMult + me->GetCreateHealth() + (/*IAmFree() ? level * 125.f :*/ 0); //+10000/+0 hp at 80\n+    //hp bonuses\n+    if (petOwner->GetBotClass() == BOT_CLASS_HUNTER)\n+    {\n+        //Innate 5%\n+        m_totalhp *= 1.05f;\n+    }\n+    //BOT_LOG_ERROR(\"entities.player\", \"SetPetStat(): hp stamval {}1f, stammult {}1f, base {}, total {}2f\", stamValue, stamMult, botPet->GetCreateHealth(), m_totalhp);\n+    bool fullhp = me->GetHealth() == me->GetMaxHealth();\n+    float pct = fullhp ? 100.f : me->GetHealthPct(); // needs for regeneration\n+    me->SetStatFlatModifier(UNIT_MOD_HEALTH, BASE_VALUE, m_totalhp);\n+    me->UpdateMaxHealth();\n+    me->SetHealth(fullhp ? me->GetMaxHealth() : uint32(0.5f + float(me->GetMaxHealth()) * pct / 100.f)); //restore pct\n+    //mana\n+    if (me->GetPowerType() == POWER_MANA)\n+    {\n+        float intValue = me->GetTotalStatValue(STAT_INTELLECT) - me->GetCreateStat(STAT_INTELLECT);\n+        intValue += 0.3f * petOwner->GetBotAI()->GetTotalBotStat(BOT_STAT_MOD_INTELLECT);\n+        float intMult;\n+        switch (myType)\n+        {\n+            case BOT_PET_IMP:        intMult = 4.95f; break;\n+            case BOT_PET_VOIDWALKER:\n+            case BOT_PET_SUCCUBUS:\n+            case BOT_PET_FELHUNTER:\n+            case BOT_PET_FELGUARD:   intMult = 11.5f; break;\n+            default:                 intMult = 15.f;  break;\n+        }\n+        //int/mana bonuses\n+        if (petOwner->GetBotClass() == BOT_CLASS_WARLOCK)\n+        {\n+            //Fel Vitality (pet) part 2\n+            if (level >= 15)\n+                intValue *= 1.15f;\n+        }\n+        //additional: store stat\n+        me->SetStat(STAT_INTELLECT, int32(intValue));\n+        float m_totalmana = intValue * intMult/* + me->GetCreatePowerValue(POWER_MANA)*/ + (IAmFree() ? level * 25.f : 0); //+2000/+0 mana at 80\n+        //BOT_LOG_ERROR(\"entities.player\", \"SetPetStat(): mana intValue {}1f, intMult {}1f, base {}, total {}2f\", intValue, intMult, botPet->GetCreatePowerValue(POWER_MANA), m_totalmana);\n+        bool fullmana = me->GetPower(POWER_MANA) == me->GetMaxPower(POWER_MANA);\n+        pct = fullmana ? 100.f : (float(me->GetPower(POWER_MANA)) * 100.f) / float(me->GetMaxPower(POWER_MANA));\n+        me->SetStatFlatModifier(UNIT_MOD_MANA, BASE_VALUE, m_totalmana);\n+        me->UpdateMaxPower(POWER_MANA);\n+        me->SetPower(POWER_MANA, fullmana ? me->GetMaxPower(POWER_MANA) :\n+            uint32(0.5f + float(me->GetMaxPower(POWER_MANA)) * pct / 100.f)); //restore pct\n+    }\n+\n+    if (force)\n+    {\n+        me->SetFullHealth();\n+        if (me->GetPowerType() == POWER_MANA)\n+            me->SetPower(POWER_MANA, me->GetMaxPower(POWER_MANA));\n+        else if (me->GetPowerType() == POWER_FOCUS)\n+            me->SetPower(POWER_FOCUS, me->GetMaxPower(POWER_FOCUS));\n+    }\n+}\n+//Force pet to start attack anyone who tries to DAMAGE me or owner\n+//This means that anyone who attacks party will be attacked by whole bot party (see GetTarget())\n+void bot_pet_ai::OnOwnerDamagedBy(Unit* attacker)\n+{\n+    switch (myType)\n+    {\n+        case BOT_PET_TORNADO:\n+        case BOT_PET_LOCUST_SWARM:\n+            return;\n+        default:\n+            break;\n+    }\n+\n+    if (petOwner->GetBotAI()->HasBotCommandState(BOT_COMMAND_MASK_UNMOVING))\n+        return;\n+    if (!petOwner->GetBotAI()->CanBotAttack(attacker))\n+        return;\n+\n+    SetBotCommandState(BOT_COMMAND_COMBATRESET);\n+    me->Attack(attacker, IsPetMelee());\n+}\n+void bot_pet_ai::OnAttackStop(Unit const* target)\n+{\n+    if (opponent == target)\n+        opponent = nullptr;\n+}\n+\n+bool bot_pet_ai::IsPetMelee() const\n+{\n+    return bot_ai::IsPetMelee(myType);\n+}\n+\n+uint8 bot_pet_ai::Spec() const\n+{\n+    return petOwner->GetBotAI()->GetSpec();\n+}\n+\n+//ISINBOTPARTY\n+//Returns group members (and their npcbots too)\n+//For now all your puppets are in your group automatically\n+bool bot_pet_ai::IsInBotParty(Unit const* unit) const\n+{\n+    if (!unit) return false;\n+    if (unit == petOwner->GetBotOwner() || unit == me || unit == petOwner) return true;\n+\n+    if (IAmFree())\n+    {\n+        if (me->GetFaction() == FACTION_TEMPLATE_NEUTRAL_HOSTILE || unit->GetFaction() == FACTION_TEMPLATE_NEUTRAL_HOSTILE)\n+            return false;\n+\n+        if (me->HasByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_FFA_PVP) ||\n+            unit->HasByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_FFA_PVP))\n+            return false;\n+\n+        return\n+            (unit->IsPlayer() || unit->ToCreature()->IsPet() || unit->IsNPCBot() || unit->IsNPCBotPet()) &&\n+            (unit->GetFaction() == me->GetFaction() ||\n+            (me->GetReactionTo(unit) >= REP_FRIENDLY && unit->GetReactionTo(me) >= REP_FRIENDLY));\n+    }\n+\n+    //cheap check\n+    if (Group const* gr = petOwner->GetBotOwner()->GetGroup())\n+    {\n+        //group member case\n+        if (gr->IsMember(unit->GetGUID()))\n+            return true;\n+        //pointed target case\n+        for (auto i : NPCBots::index_array<uint8, TARGET_ICONS_COUNT>)\n+            if (BotCfg::GetHealTargetIconFlags() & GroupIconsFlags[i] &&\n+                !((BotCfg::GetOffTankTargetIconFlags() | BotCfg::GetDPSTargetIconFlags()) & GroupIconsFlags[i]))\n+                if (gr->GetTargetIcons()[i] == unit->GetGUID())\n+                    return true;\n+    }\n+\n+    //Player-controlled creature case\n+    if (Creature const* cre = unit->ToCreature())\n+    {\n+        ObjectGuid ownerGuid = !unit->GetOwnerGUID().IsEmpty() ? unit->GetOwnerGUID() : unit->GetCreator() ? unit->GetCreator()->GetGUID() : ObjectGuid::Empty;\n+        //controlled by master\n+        if (ownerGuid == petOwner->GetBotOwner()->GetGUID())\n+            return true;\n+        //npcbot/npcbot's pet case\n+        if (cre->GetBotOwner() == petOwner->GetBotOwner())\n+            return true;\n+        if (!ownerGuid.IsEmpty() && petOwner->GetBotOwner()->GetBotMgr()->GetBot(ownerGuid))\n+            return true;\n+        //controlled by group member\n+        //pets, minions, guardians etc.\n+        //bot pets too\n+        if (!ownerGuid.IsEmpty())\n+            if (Group const* gr = petOwner->GetBotOwner()->GetGroup())\n+                if (gr->IsMember(ownerGuid))\n+                    return true;\n+    }\n+\n+    return false;\n+}\n+\n+//REFRESHAURA\n+//Applies/removes/reapplies aura stacks\n+void bot_pet_ai::RefreshAura(uint32 spellId, int8 count, Unit* target) const\n+{\n+    if (count < 0 || count > 10)\n+    {\n+        BOT_LOG_ERROR(\"entities.player\", \"bot_pet_ai::RefreshAura(): count is out of bounds ({}) for bot {} (botclass: {}, entry: {})\",\n+            int32(count), me->GetName(), uint32(petOwner->GetBotClass()), me->GetEntry());\n+        return;\n+    }\n+    if (!spellId)\n+    {\n+        BOT_LOG_ERROR(\"entities.player\", \"bot_pet_ai::RefreshAura(): spellId is 0 for bot {} (botclass: {}, entry: {})\",\n+            me->GetName(), uint32(petOwner->GetBotClass()), me->GetEntry());\n+        return;\n+    }\n+\n+    SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);\n+    if (!spellInfo)\n+    {\n+        BOT_LOG_ERROR(\"entities.player\", \"bot_pet_ai::RefreshAura(): Invalid spellInfo for spell {}! Bot - {} (botclass: {}, entry: {})\",\n+            spellId, me->GetName(), uint32(petOwner->GetBotClass()), me->GetEntry());\n+        return;\n+    }\n+\n+    if (!target)\n+        target = me;\n+\n+    target->RemoveAurasDueToSpell(spellId);\n+\n+    for (int8 i = 0; i < count; ++i)\n+        target->AddAura(spellInfo, MAX_EFFECT_MASK, target);\n+}\n+//GETTARGET\n+//Returns attack target or 'no target'\n+//All code above 'x = _getTarget() call must not dereference opponent since it can be invalid\n+Unit* bot_pet_ai::_getTarget(bool &reset) const\n+{\n+    if (petOwner->GetBotAI()->HasBotCommandState(BOT_COMMAND_FULLSTOP | BOT_COMMAND_INACTION))\n+        return nullptr;\n+    if (petOwner->GetBotAI()->GetEngageTimer() > lastdiff)\n+        return nullptr;\n+\n+    Unit* mytar = me->GetVictim();\n+    Unit* u = petOwner->GetVictim();\n+\n+    if (mytar && me->HasAuraType(SPELL_AURA_MOD_TAUNT))\n+        return mytar;\n+\n+    if (u)\n+    {\n+        if (opponent && u != opponent)\n+            reset = true;\n+        return u;\n+    }\n+\n+    uint8 followdist = IAmFree() ? BotMgr::GetBotFollowDistMax() : petOwner->GetBotOwner()->GetBotMgr()->GetBotFollowDist();\n+\n+    if (followdist == 0)\n+        return nullptr;\n+\n+    float foldist = _getAttackDistance(float(followdist));\n+    if (!IAmFree() && !IsPetMelee())\n+    {\n+        float spelldist;\n+        uint8 rangeMode = petOwner->GetBotOwner()->GetBotMgr()->GetBotAttackRangeMode();\n+        if (rangeMode == BOT_ATTACK_RANGE_EXACT)\n+            spelldist = petOwner->GetBotOwner()->GetBotMgr()->GetBotExactAttackRange();\n+        else\n+            spelldist = GetSpellAttackRange(rangeMode == BOT_ATTACK_RANGE_LONG);\n+        foldist = std::max<float>(foldist, spelldist + 4.f);\n+    }\n+    bool dropTarget = false;\n+    if (mytar)\n+    {\n+        dropTarget = IAmFree() ?\n+            petOwner->GetDistance(mytar) > foldist :\n+            (petOwner->GetBotOwner()->GetDistance(mytar) > foldist || (petOwner->GetBotOwner()->GetDistance(mytar) > foldist * 0.75f && !mytar->IsWithinLOSInMap(petOwner, LINEOFSIGHT_ALL_CHECKS, VMAP::ModelIgnoreFlags::M2)));\n+    }\n+    if (dropTarget)\n+        return nullptr;\n+\n+    if (mytar && (!IAmFree() || me->GetDistance(mytar) < float(BOT_MAX_CHASE_RANGE)) && me->IsValidAttackTarget(mytar) && !petOwner->GetBotAI()->IsPointedNoDPSTarget(mytar))\n+    {\n+        if (me->GetDistance(mytar) > (!IsPetMelee() ? 20.f : 5.f) && _botCommandState != COMMAND_STAY && _botCommandState != COMMAND_FOLLOW)\n+            reset = true;\n+        return mytar;\n+    }\n+\n+    return nullptr;\n+}\n+//'CanAttack' function\n+//Only called in class ai UpdateAI function\n+bool bot_pet_ai::CheckAttackTarget()\n+{\n+    bool reset = false;\n+    opponent = _getTarget(reset);\n+\n+    if (!opponent)\n+    {\n+        if (me->GetVictim() || me->IsInCombat())\n+        {\n+            if (me->GetVictim())\n+                me->AttackStop();\n+        }\n+\n+        return false;\n+    }\n+    if (petOwner->GetBotAI()->IsLastOrder(BOT_ORDER_PULL, 0, opponent->GetGUID()))\n+        return false;\n+\n+    if (reset)\n+        SetBotCommandState(BOT_COMMAND_COMBATRESET);//reset AttackStart()\n+\n+    if (opponent != me->GetVictim())\n+        me->Attack(opponent, IsPetMelee());\n+\n+    return true;\n+}\n+//POSITION\n+//Ranged attack position\n+void bot_pet_ai::CalculateAttackPos(Unit* target, Position& pos) const\n+{\n+    uint8 followdist = IAmFree() ? BotMgr::GetBotFollowDistMax() : petOwner->GetBotOwner()->GetBotMgr()->GetBotFollowDist();\n+    uint8 rangeMode = IAmFree() ? uint8(BOT_ATTACK_RANGE_LONG) : petOwner->GetBotOwner()->GetBotMgr()->GetBotAttackRangeMode();\n+    uint8 exactRange = rangeMode != BOT_ATTACK_RANGE_EXACT || IAmFree() ? 255 : petOwner->GetBotOwner()->GetBotMgr()->GetBotExactAttackRange();\n+    Position ppos;\n+    float //x(0),y(0),z(0),\n+        dist = (rangeMode == BOT_ATTACK_RANGE_EXACT) ? exactRange :\n+        followdist >= 40 ? followdist :\n+        5 + urand(followdist/3, followdist/3 + 5)/*18-23 at 40, 15-20 at 30*/,\n+        angle = target->GetAbsoluteAngle(me);\n+    //most ranged classes have some sort of 20yd spell\n+    if (rangeMode != BOT_ATTACK_RANGE_EXACT)\n+        dist = std::min<float>(dist, petOwner->GetBotAI()->HasRole(BOT_ROLE_DPS) ? GetSpellAttackRange(rangeMode == BOT_ATTACK_RANGE_LONG) - 4.f : 30.f);\n+\n+    float clockwise = (me->GetEntry() % 2) ? 1.f : -1.f;\n+    float angleDelta = frand(0.0f, float(M_PI)*0.10f) * clockwise;\n+\n+    for (auto i : NPCBots::index_array<uint8, 5>)\n+    {\n+        ppos = target->GetFirstCollisionPosition(dist, angle - target->GetOrientation());\n+        //target->GetNearPoint(me, x, y, z, dist, angle);\n+        if (!target->IsWithinLOS(/*x,y,z*/ppos.m_positionX, ppos.m_positionY, ppos.m_positionZ))\n+        {\n+            if (rangeMode != BOT_ATTACK_RANGE_EXACT)\n+                dist *= i >= 4 ? 0.1f : 0.33f;\n+            if (i >= 4)\n+                angle += angleDelta;\n+        }\n+    }\n+\n+    pos.Relocate(ppos);\n+    //pos.m_positionX = x;\n+    //pos.m_positionY = y;\n+    //pos.m_positionZ = z;\n+}\n+// Forces bot to chase opponent (if ranged then distance depends on follow distance)\n+void bot_pet_ai::GetInPosition(bool force, Unit* newtarget, Position* mypos)\n+{\n+    if (petOwner->GetBotAI()->HasBotCommandState(BOT_COMMAND_MASK_UNMOVING))\n+        return;\n+    if (CCed(me, true) || JumpingOrFalling())\n+        return;\n+    if (!newtarget)\n+        newtarget = me->GetVictim();\n+    if (!newtarget)\n+        return;\n+    if ((!newtarget->IsInCombat() || me->isMoving()) && !force)\n+        return;\n+    if (IsCasting())\n+        return;\n+\n+    if (!IAmFree() && petOwner->GetBotOwner()->GetBotMgr()->GetBotAttackRangeMode() == BOT_ATTACK_RANGE_EXACT &&\n+        petOwner->GetBotOwner()->GetBotMgr()->GetBotExactAttackRange() == 0)\n+    {\n+        attackpos.m_positionX = newtarget->GetPositionX() - frand(0.5f, 1.5f) * std::cos(me->GetAbsoluteAngle(newtarget));\n+        attackpos.m_positionY = newtarget->GetPositionY() - frand(0.5f, 1.5f) * std::sin(me->GetAbsoluteAngle(newtarget));\n+        attackpos.m_positionZ = newtarget->GetPositionZ();\n+        if (me->GetExactDist2d(&attackpos) > 3.5f)\n+            me->GetMotionMaster()->MovePoint(newtarget->GetMapId(), attackpos);\n+        return;\n+    }\n+\n+    uint8 followdist = IAmFree() ? BotMgr::GetBotFollowDistMax() : petOwner->GetBotOwner()->GetBotMgr()->GetBotFollowDist();\n+    if (!IsPetMelee())\n+    {\n+        //do not allow constant runaway from player\n+        if (!force && newtarget->IsPlayer() &&\n+            me->GetDistance(newtarget) < 6 + urand(followdist/4, followdist/3))\n+            return;\n+\n+        if (!mypos)\n+            CalculateAttackPos(newtarget, attackpos);\n+        else\n+        {\n+            attackpos.m_positionX = mypos->m_positionX;\n+            attackpos.m_positionY = mypos->m_positionY;\n+            attackpos.m_positionZ = mypos->m_positionZ;\n+        }\n+        if (me->GetExactDist2d(&attackpos) > 4.f || !me->IsWithinLOSInMap(newtarget, LINEOFSIGHT_ALL_CHECKS, VMAP::ModelIgnoreFlags::M2))\n+        {\n+            me->GetMotionMaster()->MovePoint(newtarget->GetMapId(), attackpos);\n+            if (!me->HasUnitState(UNIT_STATE_MELEE_ATTACKING))\n+                me->SetInFront(newtarget);\n+        }\n+    }\n+    else if (!JumpingOrFalling() && ((!me->HasUnitState(UNIT_STATE_CHASE) && !me->isMoving()) || (!me->HasUnitState(UNIT_STATE_CHASE_MOVE) && me->GetDistance(newtarget) > 1.5f)))\n+    {\n+        //me->BotStopMovement();\n+        me->GetMotionMaster()->MoveChase(newtarget);\n+    }\n+\n+    if (newtarget != me->GetVictim())\n+    {\n+        if (!me->Attack(newtarget, IsPetMelee()))\n+            me->SetInFront(newtarget);\n+    }\n+}\n+\n+void bot_pet_ai::CheckAttackState()\n+{\n+    if (me->GetVictim())\n+    {\n+        MoveBehind(me->GetVictim());\n+\n+        if (petOwner->GetBotAI()->HasRole(BOT_ROLE_DPS) &&\n+            !me->HasAuraType(SPELL_AURA_MOD_STEALTH) && !me->HasAuraType(SPELL_AURA_MOD_INVISIBILITY))\n+        {\n+            //if (!CCed(me->GetVictim()) || me->HasAuraType(SPELL_AURA_MOD_TAUNT))\n+                DoMeleeAttackIfReady();\n+        }\n+    }\n+}\n+\n+void bot_pet_ai::MoveBehind(Unit const* target) const\n+{\n+    if (_moveBehindTimer > lastdiff || HasBotCommandState(BOT_COMMAND_MASK_UNMOVING) || !IsPetMelee() || CCed(me, true) || JumpingOrFalling())\n+        return;\n+\n+    if (target->GetVictim() != me && !CCed(target) && target->IsWithinCombatRange(me, ATTACK_DISTANCE) && target->HasInArc(float(M_PI), me))\n+    {\n+        float x,y,z;\n+        target->GetNearPoint(me, x, y, z, me->GetCombatReach(), me->GetAbsoluteAngle(target));\n+        me->GetMotionMaster()->MovePoint(me->GetMapId(), x, y, z);\n+        const_cast<bot_pet_ai*>(this)->_moveBehindTimer = urand(1000, 4000);\n+    }\n+}\n+bool bot_pet_ai::_canRegenerate() const\n+{\n+    switch (me->GetEntry())\n+    {\n+        case BOT_PET_DARK_MINION:\n+        case BOT_PET_DARK_MINION_ELITE:\n+        case BOT_PET_NECROSKELETON:\n+        case BOT_PET_TORNADO:\n+        case BOT_PET_CARRION_BEETLE1:\n+        case BOT_PET_CARRION_BEETLE2:\n+        case BOT_PET_CARRION_BEETLE3:\n+        case BOT_PET_LOCUST_SWARM:\n+            return false;\n+        default:\n+            return true;\n+    }\n+}\n+//Health and Powers regeneration\n+void bot_pet_ai::Regenerate()\n+{\n+    regenTimer += lastdiff;\n+\n+    //every tick\n+    if (me->GetPowerType() == POWER_FOCUS)\n+        RegeneratePetFocus();\n+    else if (me->GetPowerType() == POWER_ENERGY)\n+        RegeneratePetEnergy();\n+\n+    if (regenTimer >= REGEN_CD)\n+    {\n+        regenTimer -= REGEN_CD;\n+\n+        // Regen Pet Health\n+        if (_canRegenerate() && (!me->IsInCombat() || me->IsPolymorphed()) && me->GetHealth() < me->GetMaxHealth())\n+        {\n+            int32 add = IAmFree() && !me->GetVictim() ? me->GetMaxHealth() / 32 : 20 + me->GetCreateHealth() / 64;\n+\n+            if (me->IsPolymorphed())\n+                add += me->GetMaxHealth() / 6;\n+            else if (!me->IsInCombat() || me->HasAuraType(SPELL_AURA_MOD_REGEN_DURING_COMBAT))\n+            {\n+                if (!me->IsInCombat())\n+                {\n+                    for (AuraEffect const* aeff : me->GetAuraEffectsByType(SPELL_AURA_MOD_HEALTH_REGEN_PERCENT))\n+                        AddPct(add, aeff->GetAmount());\n+\n+                    add += me->GetTotalAuraModifier(SPELL_AURA_MOD_REGEN) * REGEN_CD / 5000;\n+                }\n+                else if (me->HasAuraType(SPELL_AURA_MOD_REGEN_DURING_COMBAT))\n+                    ApplyPct(add, me->GetTotalAuraModifier(SPELL_AURA_MOD_REGEN_DURING_COMBAT));\n+            }\n+\n+            add += me->GetTotalAuraModifier(SPELL_AURA_MOD_HEALTH_REGEN_IN_COMBAT);\n+\n+            if (add < 0)\n+                add = 0;\n+\n+            me->ModifyHealth(add);\n+        }\n+        // Regen Pet Mana (use bot's regen rate) warlock only\n+        if (me->GetPowerType() == POWER_MANA && me->GetPower(POWER_MANA) < me->GetMaxPower(POWER_MANA))\n+        {\n+            float addvalue;\n+            if (me->IsUnderLastManaUseEffect())\n+                addvalue = petOwner->GetFloatValue(UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER);\n+            else\n+                addvalue = petOwner->GetFloatValue(UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER);\n+\n+            addvalue *= sWorld->getRate(RATE_POWER_MANA) * float(REGEN_CD) * 0.001f; //regenTimer threshold / 1000\n+            if (addvalue < 0.0f)\n+                addvalue = 0.0f;\n+\n+            me->ModifyPower(POWER_MANA, int32(addvalue));\n+        }\n+    }\n+}\n+\n+void bot_pet_ai::RegeneratePetFocus()\n+{\n+    uint32 curValue = me->GetPower(POWER_FOCUS);\n+    uint32 maxValue = me->GetMaxPower(POWER_FOCUS);\n+\n+    // Regen Pet Focus\n+    if (curValue < maxValue)\n+    {\n+        float addvalue = 0.005f * lastdiff * sWorld->getRate(RATE_POWER_FOCUS); //5 per sec\n+\n+        //Bestial Discipline\n+        if (petOwner->GetLevel() >= 30)\n+            addvalue *= 2;\n+\n+        addvalue += _energyFraction;\n+\n+        if (addvalue == 0x0) //only if world rate for focus is 0\n+            return;\n+\n+        uint32 integerValue = uint32(fabs(addvalue));\n+\n+        curValue += integerValue;\n+\n+        if (curValue > maxValue)\n+        {\n+            curValue = maxValue;\n+            _energyFraction = 0.f;\n+        }\n+        else\n+            _energyFraction = addvalue - float(integerValue);\n+\n+        if (curValue == maxValue || regenTimer >= REGEN_CD)\n+            me->SetPower(POWER_FOCUS, curValue);\n+        else\n+            me->UpdateUInt32Value(UNIT_FIELD_POWER1 + uint16(POWER_FOCUS), curValue);\n+    }\n+}\n+\n+void bot_pet_ai::RegeneratePetEnergy()\n+{\n+    uint32 curValue = me->GetPower(POWER_ENERGY);\n+    uint32 maxValue = me->GetMaxPower(POWER_ENERGY);\n+\n+    if (curValue < maxValue)\n+    {\n+        float addvalue = 0.01f * lastdiff * sWorld->getRate(RATE_POWER_ENERGY); //10 per sec\n+\n+        if (addvalue == 0x0) //only if world rate for enegy is 0\n+            return;\n+\n+        addvalue += _energyFraction;\n+\n+        uint32 integerValue = uint32(fabs(addvalue));\n+\n+        curValue += integerValue;\n+\n+        if (curValue > maxValue)\n+        {\n+            curValue = maxValue;\n+            _energyFraction = 0.f;\n+        }\n+        else\n+            _energyFraction = addvalue - float(integerValue);\n+\n+        if (curValue == maxValue || regenTimer >= REGEN_CD)\n+            me->SetPower(POWER_ENERGY, curValue);\n+        else\n+            me->UpdateUInt32Value(UNIT_FIELD_POWER1 + uint16(POWER_ENERGY), curValue);\n+    }\n+}\n+//////////\n+//SPELLMAP\n+//////////\n+//Using first-rank spell as source, returns spellId of max rank allowed for given caster\n+//If you want bot to use this spell through doCast() go InitSpellMap(uint32) instead\n+uint32 bot_pet_ai::InitSpell(Unit const* caster, uint32 spell)\n+{\n+    SpellInfo const* info = sSpellMgr->GetSpellInfo(spell);\n+    if (!info)\n+    {\n+        BOT_LOG_ERROR(\"entities.player\", \"InitSpell(): No SpellInfo found for spell {}\", spell);\n+        return 0; //weird spell with no info, disable it\n+    }\n+\n+    uint8 lvl = caster->GetLevel();\n+    if (lvl < info->BaseLevel) //only 1st rank spells check\n+        return 0; //cannot use this spell\n+\n+    if (SpellInfo const* spInfo = info->GetNextRankSpell())\n+    {\n+        if (lvl < spInfo->BaseLevel)\n+            return spell; //cannot use next rank, use this one\n+        else\n+            return InitSpell(caster, spInfo->Id); //can use next rank, forward check\n+    }\n+\n+    return spell; //max rank, use this\n+}\n+//Using first-rank spell as source, puts spell of max rank allowed for given caster in spellmap\n+void bot_pet_ai::InitSpellMap(uint32 basespell, bool forceadd, bool forwardRank)\n+{\n+    SpellInfo const* info = sSpellMgr->GetSpellInfo(basespell);\n+    if (!info)\n+    {\n+        BOT_LOG_ERROR(\"entities.player\", \"bot_pet_ai::InitSpellMap(): No SpellInfo found for base spell {}\", basespell);\n+        return; //invalid spell id\n+    }\n+\n+    uint8 lvl = me->GetLevel();\n+    uint32 spellId = forceadd ? basespell : 0;\n+\n+    while (info != nullptr && forwardRank && (forceadd || lvl >= info->BaseLevel))\n+    {\n+        spellId = info->Id; //can use this spell\n+        info = info->GetNextRankSpell(); //check next rank\n+    }\n+\n+    BotPetSpell& newSpell = _spells.try_emplace(basespell).first->second;\n+    newSpell.spellId = spellId;\n+}\n+//Using first-rank spell as source, return current spell id\n+uint32 bot_pet_ai::GetSpell(uint32 basespell) const\n+{\n+    decltype(_spells)::const_iterator itr = _spells.find(basespell);\n+    return itr != _spells.end() && (itr->second.enabled == true || IAmFree()) ? itr->second.spellId : 0;\n+}\n+//Using first-rank spell as source, returns cooldown on current spell\n+uint32 bot_pet_ai::GetSpellCooldown(uint32 basespell) const\n+{\n+    decltype(_spells)::const_iterator itr = _spells.find(basespell);\n+    return itr != _spells.end() ? itr->second.cooldown : 0;\n+}\n+bool bot_pet_ai::IsSpellReady(uint32 basespell, uint32 diff, bool checkGCD) const\n+{\n+    if (checkGCD && GC_Timer > diff)\n+        return false;\n+\n+    decltype(_spells)::const_iterator itr = _spells.find(basespell);\n+    return itr == _spells.end() ? true :\n+        ((itr->second.enabled == true || IAmFree()) && itr->second.spellId != 0 && itr->second.cooldown <= diff);\n+}\n+//Using first-rank spell as source, sets cooldown for current spell\n+void bot_pet_ai::SetSpellCooldown(uint32 basespell, uint32 msCooldown)\n+{\n+    //if (!msCooldown)\n+    //    return;\n+\n+    BotPetSpell& newSpell = _spells.try_emplace(basespell).first->second;\n+    newSpell.cooldown = msCooldown;\n+}\n+//Using first-rank spell as source, sets cooldown for spells of that category\n+void bot_pet_ai::SetSpellCategoryCooldown(SpellInfo const* spellInfo, uint32 msCooldown)\n+{\n+    if (!msCooldown)\n+        return;\n+\n+    uint32 category = spellInfo->GetCategory();\n+    if (!category)\n+        return;\n+\n+    SpellInfo const* info;\n+    for (auto& [rank1_id, spell] : _spells)\n+    {\n+        //skip spell which has triggered this category cooldown\n+        if (rank1_id == spellInfo->Id && spell.cooldown >= msCooldown)\n+            continue;\n+\n+        info = sSpellMgr->GetSpellInfo(spell.spellId);\n+        if (info && rank1_id == spellInfo->Id && info->GetCategory() != category)\n+        {\n+            if (rank1_id != 7814) // Lash of Pain\n+            {\n+                BOT_LOG_ERROR(\"scripts\", \"Warning: SetSpellCategoryCooldown: {} has baseId {} but category {}, not {}!\",\n+                    info->Id, rank1_id, info->GetCategory(), category);\n+            }\n+        }\n+\n+        if (info && (info->GetCategory() == category || rank1_id == spellInfo->Id) && spell.cooldown < msCooldown)\n+            spell.cooldown = msCooldown;\n+    }\n+}\n+//Handles spell cooldowns for spell with IsCooldownStartedOnEvent() == true\n+void bot_pet_ai::ReleaseSpellCooldown(uint32 basespell)\n+{\n+    SpellInfo const* baseInfo = sSpellMgr->GetSpellInfo(basespell);\n+\n+    if (!baseInfo->IsCooldownStartedOnEvent())\n+    {\n+        BOT_LOG_ERROR(\"spells\", \"bot_pet_ai::ReleaseSpellCooldown is called for wrong spell {}!\", basespell);\n+        return;\n+    }\n+\n+    uint32 rec = baseInfo->RecoveryTime;\n+    uint32 catrec = baseInfo->CategoryRecoveryTime;\n+\n+    SetSpellCooldown(baseInfo->Id, rec > 0 ? rec : 0);\n+    SetSpellCategoryCooldown(baseInfo, catrec > 0 && !(baseInfo->AttributesEx6 & SPELL_ATTR6_IGNORE_CATEGORY_COOLDOWN_MODS) ? catrec : 0);\n+}\n+//Using first-rank spell as source, disables certain spell for this bot\n+void bot_pet_ai::RemoveSpell(uint32 basespell)\n+{\n+    BotPetSpell& newSpell = _spells.try_emplace(basespell).first->second;\n+    newSpell.spellId = 0;\n+    newSpell.cooldown = 0;\n+}\n+//See CommonTimers(uint32)\n+void bot_pet_ai::SpellTimers(uint32 diff)\n+{\n+    // spell must be initialized!!!\n+    for (auto& [_, spell] : _spells)\n+    {\n+        if (spell.cooldown >= diff)\n+            spell.cooldown -= diff;\n+        else if (spell.cooldown > 0)\n+            spell.cooldown = 0;\n+    }\n+}\n+//Bots cannot dodge/parry from behind so try to condense enemies at front\n+//opponent is always valid\n+void bot_pet_ai::AdjustTankingPosition() const\n+{\n+    if (/*!IsTank() || */!me->IsInCombat() || IsCasting() ||\n+        JumpingOrFalling() || CCed(me, true) || Rand() > 10 + 20*me->GetMap()->IsDungeon() ||\n+        HasBotCommandState(BOT_COMMAND_MASK_UNMOVING))\n+        return;\n+\n+    Unit::AttackerSet const& myattackers = me->getAttackers();\n+    if (myattackers.size() < 2)\n+        return;\n+\n+    //BOT_LOG_ERROR(\"entities.player\", \"AdjustTankingPosition() by {}\", me->GetName());\n+\n+    uint32 bCount = 0;\n+    for (Unit const* u : myattackers)\n+    {\n+        if (/*!CCed(u) && */(u)->GetDistance(me) < 5 && !me->HasInArc(float(M_PI), u))\n+            ++bCount;\n+            //if (++bCount)\n+            //    break;\n+    }\n+\n+    if (bCount == 0)\n+        return;\n+\n+    //BOT_LOG_ERROR(\"entities.player\", \"AdjustTankingPosition(): atts {}, behind {}\", uint32(myattackers.size()), bCount);\n+\n+    //calculate new position\n+    float x = me->GetPositionX();\n+    float y = me->GetPositionY();\n+    float z = me->GetPositionZ();\n+    float ori = me->GetOrientation();\n+    float const moveDist = -1.f * std::max<float>(opponent->GetCombatReach() * 0.6f, 3.f);\n+    float moveX = 0.f;\n+    float moveY = 0.f;\n+    for (auto i : NPCBots::index_array<uint8, 3>)\n+    {\n+        if (i)\n+        {\n+            ori = Position::NormalizeOrientation(ori + (i+1)*(M_PI*0.5f));\n+        }\n+\n+        //move back\n+        moveX = moveDist * std::cos(ori);\n+        moveY = moveDist * std::sin(ori);\n+\n+        if (me->IsWithinLOS(x+moveX, y+moveY, z))\n+            break;\n+\n+        if (i == 2)\n+        {\n+            moveX *= 0.2f;\n+            moveY *= 0.2f;\n+        }\n+    }\n+\n+    x += moveX;\n+    y += moveY;\n+\n+    me->UpdateAllowedPositionZ(x, y, z);\n+    if (me->GetPositionZ() < z)\n+        z += 0.75f; //prevent going underground\n+\n+    //if (CCed(opponent, true))\n+    //    me->AttackStop();\n+    //me->SetOrientation(ori);\n+    me->GetMotionMaster()->MovePoint(me->GetMapId(), x, y, z);\n+}\n+//SpellHit()... OnSpellHit()\n+void bot_pet_ai::OnSpellHit(Unit* caster, SpellInfo const* spell)\n+{\n+    //uint32 const spellId = spell->Id;\n+\n+    if (spell->HasAura(SPELL_AURA_MOD_TAUNT) || spell->HasEffect(SPELL_EFFECT_ATTACK_ME))\n+        if (caster && me->Attack(caster, true))\n+            me->GetMotionMaster()->MoveChase(caster);\n+\n+    for (auto i : NPCBots::index_array<uint8, MAX_SPELL_EFFECTS>)\n+    {\n+        uint32 const auraname = spell->_effects[i].ApplyAuraName;\n+\n+        //update stats\n+        if (auraname == SPELL_AURA_MOD_STAT || auraname == SPELL_AURA_MOD_PERCENT_STAT ||\n+            auraname == SPELL_AURA_MOD_TOTAL_STAT_PERCENTAGE ||\n+            auraname == SPELL_AURA_MOD_ATTACK_POWER || auraname == SPELL_AURA_MOD_ATTACK_POWER_PCT ||\n+            auraname == SPELL_AURA_MOD_ATTACK_POWER_OF_STAT_PERCENT || auraname == SPELL_AURA_MOD_ATTACK_POWER_OF_ARMOR ||\n+            auraname == SPELL_AURA_MOD_SPELL_DAMAGE_OF_STAT_PERCENT ||\n+            auraname == SPELL_AURA_MOD_RATING || auraname == SPELL_AURA_MOD_RATING_FROM_STAT)\n+            shouldUpdateStats = true;\n+        else if (auraname == SPELL_AURA_MOD_INCREASE_HEALTH ||\n+            auraname == SPELL_AURA_MOD_INCREASE_HEALTH_2 ||\n+            auraname == SPELL_AURA_230 ||\n+            auraname == SPELL_AURA_MOD_INCREASE_HEALTH_PERCENT)\n+            shouldUpdateStats = true;\n+        else if (auraname == SPELL_AURA_MOD_INCREASE_ENERGY || auraname == SPELL_AURA_MOD_INCREASE_ENERGY_PERCENT)\n+            shouldUpdateStats = true;\n+    }\n+\n+    if (!me->GetVictim() && (me->IsHostileTo(caster) || caster->IsHostileTo(me)))\n+    {\n+        if (me->CanSeeOrDetect(caster) && (caster->IsInCombat() || me->IsInCombat() || petOwner->IsInCombat()))\n+            petOwner->GetBotAI()->OwnerAttackedBy(caster);\n+    }\n+}\n+//Update delay\n+//Skip UpdateAI cycles for randomization of bots' reaction and performance adjustments\n+bool bot_pet_ai::Wait()\n+{\n+    if (waitTimer > lastdiff)\n+        return true;\n+\n+    if (IAmFree())\n+        waitTimer = me->IsInCombat() ? 250 : ((__rand + 100) * 20);\n+    else if (!me->GetMap()->IsRaid())\n+        waitTimer = std::min<uint32>(uint32(50 * (petOwner->GetBotOwner()->GetNpcBotsCount() - 1) + __rand + __rand), 500);\n+    else\n+        waitTimer = __rand;\n+\n+    return false;\n+}\n+//Spell Mod Hooks\n+void bot_pet_ai::ApplyBotDamageMultiplierSpell(int32& damage, SpellNonMeleeDamage& damageinfo, SpellInfo const* spellInfo, WeaponAttackType attackType, bool crit) const\n+{\n+    //DAMAGE SPELLS damage bonus (DMG_CLASS_MAGIC)\n+    ApplyClassDamageMultiplierSpell(damage, damageinfo, spellInfo, attackType, crit);\n+}\n+//Spell Mod Utilities\n+float bot_pet_ai::CalcSpellMaxRange(uint32 spellId, bool enemy) const\n+{\n+    SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);\n+    ASSERT(spellInfo);\n+\n+    return spellInfo->GetMaxRange(!enemy);\n+}\n+bool bot_pet_ai::IAmFree() const\n+{\n+    return petOwner->IsFreeBot();\n+}\n+\n+bool bot_pet_ai::CCed(Unit const* target, bool root)\n+{\n+    return bot_ai::CCed(target, root);\n+}\n+\n+bool bot_pet_ai::IsTank(Unit const* unit) const\n+{\n+    if (Creature const* bot = unit->ToCreature())\n+        return bot->GetBotAI() && bot->GetBotAI()->HasRole(BOT_ROLE_TANK);\n+    else if (Player const* player = unit->ToPlayer())\n+    {\n+        if (Group const* gr = player->GetGroup())\n+        {\n+            if (gr->GetMemberFlags(unit->GetGUID()) & MEMBER_FLAG_MAINTANK)\n+                return true;\n+            if (gr->isLFGGroup() && sLFGMgr->GetRoles(unit->GetGUID()) & lfg::PLAYER_ROLE_TANK)\n+                return true;\n+        }\n+    }\n+\n+    return false;\n+}\n+//Unused\n+bool bot_pet_ai::IsOffTank(Unit const* unit) const\n+{\n+    if (Creature const* bot = unit->ToCreature())\n+        return bot->GetBotAI() && bot->GetBotAI()->HasRole(BOT_ROLE_TANK_OFF);\n+    else if (Player const* player = unit->ToPlayer())\n+    {\n+        if (Group const* gr = player->GetGroup())\n+        {\n+            if (gr->isRaidGroup())\n+            {\n+                for (auto const& slot : gr->GetMemberSlots())\n+                    if (slot.guid == unit->GetGUID())\n+                        return slot.flags & MEMBER_FLAG_MAINASSIST;\n+            }\n+        }\n+    }\n+\n+    return false;\n+}\n+\n+void bot_pet_ai::OnStartAttack(Unit const* /*u*/)\n+{\n+    AdjustTankingPosition();\n+}\n+\n+bool bot_pet_ai::StartAttack(Unit const* u, bool force)\n+{\n+    if (HasBotCommandState(BOT_COMMAND_ATTACK) && !force)\n+        return false;\n+\n+    SetBotCommandState(BOT_COMMAND_ATTACK);\n+    OnStartAttack(u);\n+    return true;\n+}\n+\n+void bot_pet_ai::JustDied(Unit*)\n+{\n+    KillEvents(false);\n+}\n+\n+void bot_pet_ai::KilledUnit(Unit* u)\n+{\n+    GetPetsOwner()->GetBotAI()->KilledUnit(u);\n+}\n+\n+void bot_pet_ai::AttackStart(Unit* /*u*/)\n+{\n+}\n+\n+void bot_pet_ai::DamageDealt(Unit* victim, uint32& damage, DamageEffectType /*damageType*/)\n+{\n+    if (victim == me)\n+        return;\n+\n+    if (damage)\n+    {\n+        if (Creature* cre = victim->ToCreature())\n+        {\n+            if (!cre->hasLootRecipient())\n+                cre->SetLootRecipient(petOwner->GetBotOwner());\n+\n+            //controlled case is handled in Unit::DealDamage\n+            if (IAmFree())\n+                cre->LowerPlayerDamageReq(std::min<uint32>(cre->GetHealth(), damage) / (BotMgr::IsWanderingWorldBot(me) ? 4 : 2));\n+        }\n+    }\n+}\n+\n+void bot_pet_ai::IsSummonedBy(WorldObject* summoner)\n+{\n+    //BOT_LOG_ERROR(\"entities.unit\", \"bot_pet_ai::IsSummonedBy for {} by {}\", me->GetName(), summoner->GetName());\n+    //ASSERT(!petOwner);\n+    //ASSERT(summoner->IsCreature());\n+    petOwner = summoner->ToCreature();\n+    _botCommandState = petOwner->GetBotAI()->GetBotCommandState();\n+    myType = me->GetEntry();\n+    //myType = petOwner->GetBotAI()->GetAIMiscValue(BOTAI_MISC_PET_TYPE);\n+    //ASSERT(myType);\n+    me->setActive(true);\n+    //me->SetUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED);\n+    ASSERT(!me->GetBotAI());\n+    ASSERT(!me->GetBotPetAI());\n+    me->SetBotPetAI(this);\n+    SetPetStats(true);\n+    if (petOwner->GetTransport())\n+    {\n+        petOwner->GetTransport()->AddPassenger(me);\n+        me->m_movementInfo.transport.pos.Relocate(petOwner->GetTransOffset());\n+        me->Relocate(bot_ai::GetAbsoluteTransportPosition(petOwner));\n+        me->AddUnitState(UNIT_STATE_IGNORE_PATHFINDING);\n+    }\n+    //Send group update if not a minion\n+    if (petOwner->GetBotAI()->GetBotsPet() == me && petOwner->GetBotAI()->GetGroup())\n+        BotMgr::SetBotGroupUpdateFlag(petOwner, GROUP_UPDATE_PET);\n+}\n+//This function is called after Spell::SendSpellCooldown() and Spell::DoAllEffects...() call\n+void bot_pet_ai::OnBotPetSpellGo(Spell const* spell, bool ok)\n+{\n+    if (!ok)\n+        return;\n+\n+    SpellInfo const* curInfo = spell->GetSpellInfo();\n+\n+    //Set cooldown\n+    if (!curInfo->IsCooldownStartedOnEvent() && !curInfo->IsPassive())\n+    {\n+        uint32 rec = curInfo->RecoveryTime;\n+        uint32 catrec = curInfo->CategoryRecoveryTime;\n+\n+        SetSpellCooldown(curInfo->GetFirstRankSpell()->Id, rec);\n+        SetSpellCategoryCooldown(curInfo->GetFirstRankSpell(), catrec);\n+    }\n+\n+    if ((!curInfo->CastTimeEntry || !curInfo->CastTimeEntry->Base) &&\n+        curInfo->StartRecoveryTime)\n+    {\n+        GC_Timer = curInfo->StartRecoveryTime;\n+        GC_Timer = std::max<uint32>(GC_Timer, 1000);\n+        GC_Timer = std::min<uint32>(GC_Timer, 1500);\n+    }\n+\n+    OnPetClassSpellGo(curInfo);\n+}\n+\n+void bot_pet_ai::OnBotPetSpellInterrupted(SpellSchoolMask schoolMask, uint32 unTimeMs)\n+{\n+    for (auto& [_, spell] : _spells)\n+    {\n+        SpellInfo const* info = sSpellMgr->GetSpellInfo(spell.spellId);\n+        if (!info || !(info->GetSchoolMask() & schoolMask)) continue;\n+        if (info->IsCooldownStartedOnEvent()) continue;\n+        if (info->PreventionType != SPELL_PREVENTION_TYPE_SILENCE) continue;\n+\n+        spell.cooldown += unTimeMs;\n+        //BOT_LOG_ERROR(\"entities.player\", \"OnBotPetSpellInterrupted(): Adding cooldown ({}, new: {}) to spell {} (id: {}, schoolmask: {}), reqSchoolMask = {}\",\n+        //    unTimeMs, itr->second.second, info->SpellName[0], info->Id, info->SchoolMask, schoolMask);\n+    }\n+\n+    GC_Timer = 0; //reset global cooldown since cast is canceled\n+}\n+//GLOBAL UPDATE\n+//opponent unsafe\n+bool bot_pet_ai::GlobalUpdate(uint32 diff)\n+{\n+    if (!petOwner)\n+    {\n+        BOT_LOG_ERROR(\"entities.unit\", \"botpet:GlobalUpdate(): no owner!\");\n+        return false;\n+    }\n+\n+    if (!BotCfg::IsNpcBotModEnabled())\n+        return false;\n+\n+    ReduceCD(diff);\n+\n+    lastdiff = diff;\n+\n+    if (_updateTimerMedium <= diff)\n+    {\n+        _updateTimerMedium = 500;\n+\n+        //Medium-timed updates\n+        if (!IAmFree())\n+        {\n+            //update pvp state\n+            if (me->GetByteValue(UNIT_FIELD_BYTES_2, 1) != petOwner->GetByteValue(UNIT_FIELD_BYTES_2, 1))\n+                me->SetByteValue(UNIT_FIELD_BYTES_2, 1, petOwner->GetByteValue(UNIT_FIELD_BYTES_2, 1));\n+        }\n+        if (myType == BOT_PET_LOCUST_SWARM)\n+        {\n+            me->SetFloatValue(UNIT_FIELD_BOUNDINGRADIUS, 2.0f * DEFAULT_PLAYER_BOUNDING_RADIUS * me->GetObjectScale());\n+            me->SetFloatValue(UNIT_FIELD_COMBATREACH,  2.0f * DEFAULT_PLAYER_COMBAT_REACH * me->GetObjectScale());\n+        }\n+    }\n+\n+    if (!me->IsAlive())\n+        return false;\n+\n+    //Check current cast state: interrupt casts that became pointless\n+    if (me->HasUnitState(UNIT_STATE_CASTING) && urand(1,100) <= 75)\n+    {\n+        for (uint8 i = CURRENT_FIRST_NON_MELEE_SPELL; i != CURRENT_AUTOREPEAT_SPELL; ++i)\n+        {\n+            bool interrupt = false;\n+            Spell* spell = me->GetCurrentSpell(CurrentSpellTypes(i));\n+            if (!spell)\n+                continue;\n+            if (spell->m_targets.GetObjectTargetGUID().IsAnyTypeCreature())\n+                spell->m_targets.Update(me);\n+            Unit const* target = spell->m_targets.GetUnitTarget();\n+            if (!target)\n+                continue;\n+            SpellInfo const* info = spell->GetSpellInfo();\n+            if (!info->CastTimeEntry)\n+                continue;\n+            if (!info->IsPositive())\n+            {\n+                if (!target->IsAlive())\n+                    interrupt = true;\n+                //control interruptions should be checked inside pet class ai\n+                //else if ((info->Mechanic == MECHANIC_POLYMORPH || info->Mechanic == MECHANIC_SHACKLE ||\n+                //    info->Mechanic == MECHANIC_DISORIENTED || info->Mechanic == MECHANIC_SLEEP ||\n+                //    info->Mechanic == MECHANIC_CHARM || info->Mechanic == MECHANIC_BANISH ||\n+                //    info->Mechanic == MECHANIC_STUN || info->Mechanic == MECHANIC_FREEZE) &&\n+                //    !target->getAttackers().empty() && !IsCasting(target))\n+                //    interrupt = true; //useless control\n+                else if (target->HasAuraType(SPELL_AURA_PERIODIC_DAMAGE) && !IsCasting(target) &&\n+                    (info->AuraInterruptFlags & AURA_INTERRUPT_FLAG_TAKE_DAMAGE))\n+                    interrupt = true; //useless control breaks immediately\n+            }\n+\n+            if (interrupt)\n+            {\n+                me->InterruptSpell(CurrentSpellTypes(i));\n+                GC_Timer = 0;\n+                break;\n+            }\n+        }\n+    }\n+\n+    if (_updateTimerEx1 <= diff && !IAmFree())\n+    {\n+        _updateTimerEx1 = urand(2000, 2500);\n+\n+        //Ex1-timed updates\n+\n+        //DEBUG\n+        /*\n+        Sometimes bots are affected by zone (instance) scripts\n+        Good example is CoT: Battle for Mount Hyjal\n+        */\n+        //Faction\n+        //ensure master is not controlled\n+        ChrRacesEntry const* rEntry = sChrRacesStore.LookupEntry(petOwner->GetBotOwner()->GetRace());\n+        uint32 fac_orig = rEntry ? rEntry->FactionID : 0;\n+        if (petOwner->GetBotOwner()->GetFaction() == fac_orig)\n+        {\n+            uint32 fac = (!IAmFree() && me->GetMap()->IsBattleArena()) ? uint32(FACTION_MONSTER) : fac_orig;\n+            if (me->GetFaction() != fac)\n+                me->SetFaction(fac);\n+        }\n+        //Visibility\n+        if (!me->IsVisible() && petOwner->GetBotOwner()->IsVisible())\n+        {\n+            //BotWhisper(\"Something changed my visibility status! Making visible...\");\n+            me->SetVisible(true);\n+        }\n+        if (me->IsVisible() && !petOwner->GetBotOwner()->IsVisible())\n+        {\n+            //BotWhisper(\"Something changed my visibility status! Making invisible...\");\n+            me->SetVisible(false);\n+        }\n+        //Phase\n+        if (me->GetPhaseMask() != petOwner->GetBotOwner()->GetPhaseMask())\n+        {\n+            //BotWhisper(\"Somehow we are not is same phase! Fixing that...\");\n+            me->SetPhaseMask(petOwner->GetBotOwner()->GetPhaseMask(), true);\n+        }\n+        if (me->GetTransport() != petOwner->GetBotOwner()->GetTransport())\n+        {\n+            if (petOwner->GetBotOwner()->GetTransport())\n+            {\n+                if (me->GetDistance2d(petOwner->GetBotOwner()) < 20.f)\n+                {\n+                    petOwner->GetBotOwner()->GetTransport()->AddPassenger(me);\n+                    me->m_movementInfo.transport.pos.Relocate(petOwner->GetBotOwner()->GetTransOffset());\n+                    me->Relocate(bot_ai::GetAbsoluteTransportPosition(petOwner->GetBotOwner()));\n+                    me->AddUnitState(UNIT_STATE_IGNORE_PATHFINDING);\n+                }\n+            }\n+            else\n+            {\n+                switch (me->GetEntry())\n+                {\n+                    case BOT_PET_TORNADO:\n+                    case BOT_PET_LOCUST_SWARM:\n+                        break;\n+                    default:\n+                        me->ClearUnitState(UNIT_STATE_IGNORE_PATHFINDING);\n+                    break;\n+                }\n+                me->GetTransport()->RemovePassenger(me);\n+            }\n+        }\n+        //end DEBUG\n+    }\n+\n+    Regenerate();\n+\n+    //update flags\n+    if (!me->IsInCombat())\n+    {\n+        if (me->HasUnitFlag(UNIT_FLAG_PET_IN_COMBAT))\n+            me->RemoveUnitFlag(UNIT_FLAG_PET_IN_COMBAT);\n+    }\n+\n+    //update movement orders if near owner, otherwise get close\n+    bool closeToOwner = false;\n+    if (!opponent && !IsCasting())\n+    {\n+        _calculatePos(movepos);\n+        if (me->GetExactDist(&movepos) > 5.f)\n+            SetBotCommandState(BOT_COMMAND_FOLLOW, true, &movepos);\n+        else\n+            closeToOwner = !me->isMoving();\n+    }\n+    if (closeToOwner || me->IsInCombat())\n+    {\n+        uint8 st = (petOwner->GetBotAI()->GetBotCommandState() & BOT_COMMAND_MASK_UNMOVING);\n+        if (st && GetBotCommandState() != st)\n+        {\n+            SetBotCommandState(st);\n+            return !(st & BOT_COMMAND_FULLSTOP);\n+        }\n+    }\n+\n+    if (HasBotCommandState(BOT_COMMAND_FULLSTOP))\n+        return false;\n+\n+    if (!HasBotCommandState(BOT_COMMAND_INACTION))\n+        CheckAttackState();\n+\n+    //second alive check - CheckAttackState() can cause bot to die\n+    if (!me->IsAlive())\n+        return false;\n+\n+    if (checkAurasTimer <= lastdiff)\n+    {\n+        Unit* victim = me->GetVictim();\n+        checkAurasTimer += uint32(__rand + __rand + (IAmFree() ? 1000 : 40 * (1 + petOwner->GetBotOwner()->GetNpcBotsCount())));\n+\n+        if (!HasBotCommandState(BOT_COMMAND_MASK_UNCHASE) && victim && !CCed(me, true) &&\n+            !me->isMoving() && !IsCasting() && myType != BOT_PET_TORNADO && myType != BOT_PET_LOCUST_SWARM)\n+        {\n+            if (!IAmFree() && petOwner->GetBotOwner()->GetBotMgr()->GetBotAttackRangeMode() == BOT_ATTACK_RANGE_EXACT &&\n+                petOwner->GetBotOwner()->GetBotMgr()->GetBotExactAttackRange() == 0)\n+            {\n+                GetInPosition(true, victim);\n+            }\n+            else if (IsPetMelee())\n+            {\n+                if (me->GetDistance(victim) > 1.5f)\n+                    GetInPosition(true, victim);\n+            }\n+            else\n+            {\n+                CalculateAttackPos(victim, attackpos);\n+                if (me->GetExactDist2d(&attackpos) > 4.f || !me->IsWithinLOSInMap(victim, LINEOFSIGHT_ALL_CHECKS, VMAP::ModelIgnoreFlags::M2))\n+                    GetInPosition(true, victim, &attackpos);\n+            }\n+        }\n+        if (shouldUpdateStats && me->GetPhaseMask() == petOwner->GetBotOwner()->GetPhaseMask())\n+            SetPetStats(false);\n+    }\n+\n+    if (Wait())\n+        return false;\n+\n+    if (CCed(me))\n+        return false;\n+\n+    GenerateRand();\n+\n+    if (HasBotCommandState(BOT_COMMAND_INACTION))\n+        return false;\n+\n+    return true;\n+}\n+\n+void bot_pet_ai::CommonTimers(uint32 diff)\n+{\n+    //_petEvents.Update(diff);\n+    SpellTimers(diff);\n+\n+    if (GC_Timer > diff)            GC_Timer -= diff;\n+    if (checkAurasTimer > diff)     checkAurasTimer -= diff;\n+    if (waitTimer > diff)           waitTimer -= diff;\n+    if (_moveBehindTimer > diff)    _moveBehindTimer -= diff;\n+\n+    if (_updateTimerMedium > diff)  _updateTimerMedium -= diff;\n+    if (_updateTimerEx1 > diff)     _updateTimerEx1 -= diff;\n+}\n+\n+void bot_pet_ai::KillEvents(bool /*force*/)\n+{\n+    //_petEvents.KillAllEvents(force);\n+}\n+\n+bool bot_pet_ai::IsChanneling(Unit const* u/* = nullptr*/) const\n+{\n+    if (!u)\n+        u = me;\n+    return u->GetCurrentSpell(CURRENT_CHANNELED_SPELL);\n+}\n+bool bot_pet_ai::IsCasting(Unit const* u/* = nullptr*/) const\n+{\n+    if (!u)\n+        u = me;\n+    return (u->HasUnitState(UNIT_STATE_CASTING) || IsChanneling(u) || u->IsNonMeleeSpellCast(false, false, true, false, false));\n+}\n+bool bot_pet_ai::JumpingFlyingOrFalling() const\n+{\n+    return JumpingOrFalling() || me->HasUnitMovementFlag(MOVEMENTFLAG_SPLINE_ELEVATION);\n+}\n+bool bot_pet_ai::JumpingOrFalling() const\n+{\n+    return Jumping() || me->IsFalling() || me->HasUnitMovementFlag(MOVEMENTFLAG_PITCH_UP|MOVEMENTFLAG_PITCH_DOWN);\n+}\n+bool bot_pet_ai::Jumping() const\n+{\n+    return me->HasUnitState(UNIT_STATE_JUMPING);\n+}\n+bool bot_pet_ai::IsIndoors() const\n+{\n+    return indoorsTimer >= INOUTDOORS_ENSURE_TIMER && outdoorsTimer == 0;\n+}\n+bool bot_pet_ai::IsOutdoors() const\n+{\n+    return outdoorsTimer >= INOUTDOORS_ENSURE_TIMER && indoorsTimer == 0;\n+}\n+\n+uint32 bot_pet_ai::GetLostHP(Unit const* unit)\n+{\n+    return unit->GetMaxHealth() - unit->GetHealth();\n+}\n+uint8 bot_pet_ai::GetHealthPCT(Unit const* u)\n+{\n+    if (!u || !u->IsAlive() || u->GetMaxHealth() <= 1)\n+        return 100;\n+    return uint8(((float(u->GetHealth()))/u->GetMaxHealth()) * 100);\n+}\n+uint8 bot_pet_ai::GetManaPCT(Unit const* u)\n+{\n+    if (!u || !u->IsAlive() || u->GetMaxPower(POWER_MANA) <= 1)\n+        return 100;\n+    return (u->GetPower(POWER_MANA)*10/(1 + u->GetMaxPower(POWER_MANA)/10));\n+}\ndiff --git a/src/server/game/AI/NpcBots/bpet_ai.h b/src/server/game/AI/NpcBots/bpet_ai.h\nnew file mode 100644\nindex 0000000000..76777a6f8b\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bpet_ai.h\n@@ -0,0 +1,200 @@\n+#ifndef BOT_PET_AI_H\n+#define BOT_PET_AI_H\n+\n+#include \"botcommon.h\"\n+\n+#include \"CreatureAI.h\"\n+#include \"Position.h\"\n+\n+/*\n+NpcBot Pet System by Trickerer (onlysuffering@gmail.com)\n+*/\n+\n+struct SpellNonMeleeDamage;\n+\n+class Aura;\n+class Spell;\n+class Unit;\n+\n+class bot_pet_ai : public CreatureAI\n+{\n+public:\n+    virtual ~bot_pet_ai() {}\n+\n+    bool canUpdate{true};\n+\n+    void InitializeAI() override { Reset(); }\n+    void Reset() override {}\n+\n+    void JustDied(Unit*) override;\n+    void KilledUnit(Unit* u) override;\n+    void AttackStart(Unit* u) override;\n+    //virtual void JustEnteredCombat(Unit* u) override;\n+    void MoveInLineOfSight(Unit* /*u*/) override {}\n+    void DamageDealt(Unit* victim, uint32& damage, DamageEffectType damageType) override;\n+    void DamageTaken(Unit* /*attacker*/, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo*/) override { }\n+    //void ReceiveEmote(Player* player, uint32 emote);\n+    void EnterEvadeMode(EvadeReason/* why*/ = EVADE_REASON_OTHER) override { }\n+    uint32 GetData(uint32 data) const override;\n+    void IsSummonedBy(WorldObject* summoner) override;\n+\n+    Creature* GetPetsOwner() const { return petOwner; }\n+    void CalculatePetsOwnerFollowPosition(Position &pos) { _calculatePos(pos); }\n+\n+    //EventProcessor* GetEvents() { return &_petEvents; }\n+    uint32 GetLastDiff() const { return lastdiff; }\n+    void CommonTimers(uint32 diff);\n+    void KillEvents(bool force);\n+    void SetBotCommandState(uint32 st, bool force = false, Position* newpos = nullptr);\n+    void RemoveBotCommandState(uint32 st);\n+    bool HasBotCommandState(uint32 st) const { return (_botCommandState & st); }\n+    uint8 GetBotCommandState() const { return _botCommandState; }\n+    bool IsInBotParty(Unit const* unit) const;\n+    virtual void ApplyBotPetSpellRadiusMods(SpellInfo const* /*spellInfo*/, float& /*radius*/) const {}\n+    bool IsTank(Unit const* unit) const;\n+    bool IsOffTank(Unit const* unit) const;\n+\n+    bool IAmFree() const;\n+\n+    //wandering bots\n+    bool IsWanderer() const { return _wanderer; }\n+    void SetWanderer() { if (IAmFree()) _wanderer = true; }\n+\n+    uint64 GetAuraUpdateMaskForRaid() const { return _auraRaidUpdateMask; }\n+    void SetAuraUpdateMaskForRaid(uint8 slot) { _auraRaidUpdateMask |= (uint64(1) << slot); }\n+    void ResetAuraUpdateMaskForRaid() { _auraRaidUpdateMask = 0; }\n+\n+    static bool CCed(Unit const* target, bool root = false);\n+\n+    inline void SetShouldUpdateStats() { shouldUpdateStats = true; }\n+\n+    //virtual uint32 GetAIMiscValue(uint32 /*data*/) const { return 0; }\n+    //virtual void SetAIMiscValue(uint32 /*data*/, uint32 /*value*/) {}\n+\n+    void OnAttackStop(Unit const* target);\n+\n+    void OnBotPetSpellInterrupted(SpellSchoolMask schoolMask, uint32 unTimeMs);\n+    void OnBotPetSpellGo(Spell const* spell, bool ok = true);\n+    virtual void OnPetClassSpellGo(SpellInfo const* /*spellInfo*/) {}\n+\n+    bool IsSpellReady(uint32 basespell, uint32 diff, bool checkGCD = true) const;\n+    void SetSpellCooldown(uint32 basespell, uint32 msCooldown);\n+    void SetSpellCategoryCooldown(SpellInfo const* spellInfo, uint32 msCooldown);\n+    void ReleaseSpellCooldown(uint32 basespell);\n+\n+    void ApplyBotDamageMultiplierSpell(int32& damage, SpellNonMeleeDamage& damageinfo, SpellInfo const* spellInfo, WeaponAttackType attackType, bool crit) const;\n+\n+protected:\n+    explicit bot_pet_ai(Creature* creature);\n+\n+    virtual void ApplyClassDamageMultiplierSpell(int32& /*damage*/, SpellNonMeleeDamage& /*damageinfo*/, SpellInfo const* /*spellInfo*/, WeaponAttackType /*attackType*/, bool /*crit*/) const {}\n+\n+    virtual void ReduceCD(uint32 /*diff*/) {}\n+    bool GlobalUpdate(uint32 diff);\n+\n+    void CureGroup(uint32 cureSpell, uint32 diff);\n+    void SetPetStats(bool force);\n+\n+    void OnOwnerDamagedBy(Unit* attacker);\n+\n+    bool IsPetMelee() const;\n+    uint8 Spec() const;\n+\n+    static uint32 InitSpell(Unit const* caster, uint32 spell);\n+    void InitSpellMap(uint32 basespell, bool forceadd = false, bool forwardRank = true);\n+    uint32 GetSpell(uint32 basespell) const;\n+    uint32 GetSpellCooldown(uint32 basespell) const;\n+    void ResetSpellCooldown(uint32 basespell) { SetSpellCooldown(basespell, 0); }\n+    void RemoveSpell(uint32 basespell);\n+    void SpellTimers(uint32 diff);\n+\n+    void RefreshAura(uint32 spellId, int8 count = 1, Unit* target = nullptr) const;\n+    bool CheckAttackTarget();\n+    void MoveBehind(Unit const* target) const;\n+\n+    void AdjustTankingPosition() const;\n+    void OnStartAttack(Unit const* /*u*/);\n+    bool StartAttack(Unit const* u, bool force = false);\n+\n+    bool IsChanneling(Unit const* u = nullptr) const;\n+    bool IsCasting(Unit const* u = nullptr) const;\n+    bool JumpingFlyingOrFalling() const;\n+    bool JumpingOrFalling() const;\n+    bool Jumping() const;\n+    bool IsIndoors() const;\n+    bool IsOutdoors() const;\n+\n+    float CalcSpellMaxRange(uint32 spellId, bool enemy = true) const;\n+    void CalculateAttackPos(Unit* target, Position &pos) const;\n+    void GetInPosition(bool force, Unit* newtarget, Position* pos = nullptr);\n+    virtual float GetSpellAttackRange(bool longRange) const { return longRange ? 25.f : 15.f; }\n+    virtual void CheckAttackState();\n+    void OnSpellHit(Unit* caster, SpellInfo const* spell);\n+\n+    virtual void InitPetSpells() {}\n+    virtual void ApplyPetPassives() const {}\n+\n+    void Regenerate();\n+    void RegeneratePetFocus();\n+    void RegeneratePetEnergy();\n+\n+    bool Wait();\n+    uint16 Rand() const;\n+    void GenerateRand() const;\n+\n+    static uint32 GetLostHP(Unit const* unit);\n+    static uint8 GetHealthPCT(Unit const* u);\n+    static uint8 GetManaPCT(Unit const* u);\n+\n+    Unit* opponent{};\n+    Creature* petOwner{};\n+    uint32 GC_Timer{};\n+    uint32 myType{};\n+\n+private:\n+    bool _canCureTarget(Unit const* target, uint32 cureSpell) const;\n+    void _getBotDispellableAuraList(Unit const* target, Unit const* caster, uint32 dispelMask, std::list<Aura const*> &dispelList) const;\n+    void _calculatePos(Position& pos) const;\n+\n+    bool _canRegenerate() const;\n+\n+    Unit* _getTarget(bool &reset) const;\n+    bool _checkImmunities(Unit const* target, SpellInfo const* spellInfo) const;\n+    static inline float _getAttackDistance(float distance) { return distance*0.72f; }\n+\n+    Position movepos{}, attackpos{};\n+    uint32 _botCommandState{};\n+\n+    //timers\n+    uint32 lastdiff{}, checkAurasTimer{}, regenTimer{}, _updateTimerMedium{}, _updateTimerEx1{};\n+    uint32 _moveBehindTimer{};\n+    uint32 waitTimer{};\n+    uint32 indoorsTimer{}, outdoorsTimer{};\n+\n+    uint64 _auraRaidUpdateMask{};\n+\n+    float _energyFraction{};\n+\n+    bool shouldUpdateStats{};\n+\n+    //wandering bots\n+    bool _wanderer{};\n+\n+    struct BotPetSpell\n+    {\n+        explicit BotPetSpell() {}\n+        BotPetSpell(BotPetSpell const&) = delete;\n+        BotPetSpell(BotPetSpell&&) = delete;\n+        BotPetSpell& operator=(BotPetSpell const&) = delete;\n+        BotPetSpell& operator=(BotPetSpell&&) = delete;\n+\n+        uint32 spellId = 0;\n+        uint32 cooldown = 0;\n+        bool enabled = true;\n+    };\n+\n+    using BotPetSpellMap = std::unordered_map<uint32 /*firstrankspellid*/, BotPetSpell /*spell*/>;\n+    BotPetSpellMap _spells;\n+};\n+\n+#endif\ndiff --git a/src/server/game/AI/NpcBots/bpet_archmage.cpp b/src/server/game/AI/NpcBots/bpet_archmage.cpp\nnew file mode 100644\nindex 0000000000..655ae65d94\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bpet_archmage.cpp\n@@ -0,0 +1,151 @@\n+#include \"bot_ai.h\"\n+#include \"botspell.h\"\n+#include \"bpet_ai.h\"\n+#include \"Creature.h\"\n+#include \"ScriptMgr.h\"\n+/*\n+Archmage NpcBot Pets (by Trickerer onlysuffering@gmail.com)\n+Complete - 100%\n+TODO:\n+*/\n+\n+enum ArchmagePetBaseSpells\n+{\n+    WATERBOLT_1             = SPELL_WATERBOLT\n+};\n+\n+enum ArchmagePetSpecial\n+{\n+    ELEMENTAL_DURATION      = 60000 //1 min\n+};\n+\n+class archmage_pet_bot : public CreatureScript\n+{\n+public:\n+    archmage_pet_bot() : CreatureScript(\"archmage_pet_bot\") { }\n+\n+    CreatureAI* GetAI(Creature* creature) const override\n+    {\n+        return new awater_elemental_botpetAI(creature);\n+    }\n+\n+    struct awater_elemental_botpetAI : public bot_pet_ai\n+    {\n+        awater_elemental_botpetAI(Creature* creature) : bot_pet_ai(creature) { }\n+\n+        void JustEnteredCombat(Unit* u) override { bot_pet_ai::JustEnteredCombat(u); }\n+        void KilledUnit(Unit* u) override { bot_pet_ai::KilledUnit(u); }\n+        void EnterEvadeMode(EvadeReason why = EVADE_REASON_OTHER) override { bot_pet_ai::EnterEvadeMode(why); }\n+        void MoveInLineOfSight(Unit* u) override { bot_pet_ai::MoveInLineOfSight(u); }\n+        void JustDied(Unit* u) override { bot_pet_ai::JustDied(u); }\n+        void DoNonCombatActions(uint32 /*diff*/) { }\n+\n+        void StartAttack(Unit* u, bool force = false)\n+        {\n+            if (!bot_pet_ai::StartAttack(u, force))\n+                return;\n+            GetInPosition(force, u);\n+        }\n+\n+        void UpdateAI(uint32 diff) override\n+        {\n+            if ((liveTimer += diff) >= ELEMENTAL_DURATION * (IAmFree() ? 60u : 1u))\n+            {\n+                canUpdate = false;\n+                me->setDeathState(JUST_DIED);\n+                return;\n+            }\n+\n+            if (!GlobalUpdate(diff))\n+                return;\n+\n+            if (!me->IsInCombat())\n+                DoNonCombatActions(diff);\n+\n+            //DoPetActions(diff);\n+            //CheckDrainMana(diff);\n+\n+            if (!CheckAttackTarget())\n+                return;\n+\n+            if (IsCasting())\n+                return;\n+\n+            DoPetAttack(diff);\n+        }\n+\n+        void DoPetAttack(uint32 diff)\n+        {\n+            StartAttack(opponent, IsPetMelee());\n+\n+            if (!petOwner->GetBotAI()->HasRole(BOT_ROLE_DPS))\n+                return;\n+\n+            if (IsSpellReady(WATERBOLT_1, diff) && me->GetDistance(opponent) < 30)\n+            {\n+                me->CastSpell(opponent, GetSpell(WATERBOLT_1), false);\n+                return;\n+            }\n+        }\n+\n+        void OnPetClassSpellGo(SpellInfo const* /*spellInfo*/) override\n+        {\n+        }\n+\n+        void SpellHit(WorldObject* wcaster, SpellInfo const* spell) override\n+        {\n+            Unit* caster = wcaster->ToUnit();\n+            if (!caster)\n+                return;\n+\n+            OnSpellHit(caster, spell);\n+        }\n+\n+        void SpellHitTarget(WorldObject* /*wtarget*/, SpellInfo const* /*spell*/) override\n+        {\n+        }\n+\n+        void DamageDealt(Unit* victim, uint32& damage, DamageEffectType damageType) override\n+        {\n+            bot_pet_ai::DamageDealt(victim, damage, damageType);\n+        }\n+\n+        void DamageTaken(Unit* u, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo*/) override\n+        {\n+            if (!u)\n+                return;\n+            if (!u->IsInCombat() && !me->IsInCombat())\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void OwnerAttackedBy(Unit* u) override\n+        {\n+            if (!u)\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void Reset() override\n+        {\n+            liveTimer = 0;\n+        }\n+\n+        void InitPetSpells() override\n+        {\n+            InitSpellMap(WATERBOLT_1);\n+        }\n+\n+        void ApplyPetPassives() const override\n+        {\n+        }\n+\n+    private:\n+        uint32 liveTimer;\n+    };\n+};\n+\n+void AddSC_archmage_bot_pets()\n+{\n+    new archmage_pet_bot();\n+}\ndiff --git a/src/server/game/AI/NpcBots/bpet_crypt_lord.cpp b/src/server/game/AI/NpcBots/bpet_crypt_lord.cpp\nnew file mode 100644\nindex 0000000000..9ab1d4e036\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bpet_crypt_lord.cpp\n@@ -0,0 +1,383 @@\n+#include \"bot_ai.h\"\n+#include \"botspell.h\"\n+#include \"bpet_ai.h\"\n+#include \"CellImpl.h\"\n+#include \"Containers.h\"\n+#include \"GridNotifiers.h\"\n+#include \"GridNotifiersImpl.h\"\n+#include \"MotionMaster.h\"\n+#include \"ScriptMgr.h\"\n+#include \"SpellMgr.h\"\n+#include \"TemporarySummon.h\"\n+/*\n+Crypt Lord NpcBot Pets (by Trickerer onlysuffering@gmail.com)\n+Notes:\n+Complete - 75%\n+TODO: Check if Burrow can be added\n+*/\n+\n+enum CryptLordPetBaseSpells\n+{\n+};\n+enum CryptLordPetPassives\n+{\n+};\n+enum CryptLordPetSpecial\n+{\n+    LOCUST_SWARM_EFFECTIVE_RADIUS       = 60,\n+    LOCUST_SWARM_SPELL_DURATION         = 30000,\n+};\n+\n+class crypt_lord_pet_bot : public CreatureScript\n+{\n+public:\n+    crypt_lord_pet_bot() : CreatureScript(\"crypt_lord_pet_bot\") { }\n+\n+    CreatureAI* GetAI(Creature* creature) const override\n+    {\n+        switch (creature->GetEntry())\n+        {\n+            case BOT_PET_LOCUST_SWARM:\n+                return new locust_swarm_botpetAI(creature);\n+            default:\n+                return new carrion_beetle_botpetAI(creature);\n+        }\n+    }\n+\n+    struct carrion_beetle_botpetAI : public bot_pet_ai\n+    {\n+        carrion_beetle_botpetAI(Creature* creature) : bot_pet_ai(creature) { }\n+\n+        void JustEnteredCombat(Unit* u) override { bot_pet_ai::JustEnteredCombat(u); }\n+        void KilledUnit(Unit* u) override { bot_pet_ai::KilledUnit(u); }\n+        void EnterEvadeMode(EvadeReason why = EVADE_REASON_OTHER) override { bot_pet_ai::EnterEvadeMode(why); }\n+        void MoveInLineOfSight(Unit* u) override { bot_pet_ai::MoveInLineOfSight(u); }\n+        void JustDied(Unit* u) override { bot_pet_ai::JustDied(u); }\n+        void DoNonCombatActions(uint32 /*diff*/) { }\n+\n+        void StartAttack(Unit* u, bool force = false)\n+        {\n+            if (!bot_pet_ai::StartAttack(u, force))\n+                return;\n+            GetInPosition(force, u);\n+        }\n+\n+        void UpdateAI(uint32 diff) override\n+        {\n+            if (!GlobalUpdate(diff))\n+                return;\n+\n+            if (!me->IsInCombat())\n+                DoNonCombatActions(diff);\n+\n+            if (!CheckAttackTarget())\n+                return;\n+\n+            if (IsCasting())\n+                return;\n+\n+            DoPetAttack(diff);\n+        }\n+\n+        void DoPetAttack(uint32 /*diff*/)\n+        {\n+            StartAttack(opponent, IsPetMelee());\n+        }\n+\n+        void OnPetClassSpellGo(SpellInfo const* /*spellInfo*/) override\n+        {\n+        }\n+\n+        void SpellHit(WorldObject* wcaster, SpellInfo const* spell) override\n+        {\n+            Unit* caster = wcaster->ToUnit();\n+            if (!caster)\n+                return;\n+\n+            OnSpellHit(caster, spell);\n+        }\n+\n+        void SpellHitTarget(WorldObject* /*wtarget*/, SpellInfo const* /*spell*/) override\n+        {\n+        }\n+\n+        void DamageDealt(Unit* victim, uint32& damage, DamageEffectType damageType) override\n+        {\n+            bot_pet_ai::DamageDealt(victim, damage, damageType);\n+        }\n+\n+        void DamageTaken(Unit* u, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo*/) override\n+        {\n+            if (!u)\n+                return;\n+            if (!u->IsInCombat() && !me->IsInCombat())\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void OwnerAttackedBy(Unit* u) override\n+        {\n+            if (!u)\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        uint32 GetData(uint32 data) const override\n+        {\n+            switch (data)\n+            {\n+                case BOTPETAI_MISC_MAXLEVEL:\n+                    return maxlevel;\n+                default:\n+                    return bot_pet_ai::GetData(data);\n+            }\n+        }\n+\n+        void SetData(uint32 data, uint32 value) override\n+        {\n+            switch (data)\n+            {\n+                case BOTPETAI_MISC_MAXLEVEL:\n+                    maxlevel = uint8(value);\n+                    SetPetStats(true);\n+                    break;\n+                default:\n+                    break;\n+            }\n+        }\n+\n+        void Reset() override\n+        {\n+            maxlevel = 1;\n+        }\n+\n+        void InitPetSpells() override\n+        {\n+        }\n+\n+        void ApplyPetPassives() const override\n+        {\n+        }\n+\n+    private:\n+        uint8 maxlevel;\n+    };\n+\n+    struct locust_swarm_botpetAI : public bot_pet_ai\n+    {\n+        locust_swarm_botpetAI(Creature* creature) : bot_pet_ai(creature)\n+        {\n+            (const_cast<CreatureMovementData&>(me->GetMovementTemplate())).Ground = CreatureGroundMovementType::Hover;\n+        }\n+\n+        void JustEnteredCombat(Unit* u) override { bot_pet_ai::JustEnteredCombat(u); }\n+        void KilledUnit(Unit* u) override { bot_pet_ai::KilledUnit(u); }\n+        void EnterEvadeMode(EvadeReason why = EVADE_REASON_OTHER) override { bot_pet_ai::EnterEvadeMode(why); }\n+        void MoveInLineOfSight(Unit* u) override { bot_pet_ai::MoveInLineOfSight(u); }\n+        void JustDied(Unit* u) override { bot_pet_ai::JustDied(u); }\n+\n+        void UpdateAI(uint32 diff) override\n+        {\n+            _activeTimer += diff;\n+\n+            if (!GlobalUpdate(diff))\n+                return;\n+\n+            DoLocustActions(diff);\n+        }\n+\n+        void DoLocustActions(uint32 diff)\n+        {\n+            bool is_full = _gathered >= _capacity;\n+            bool expired = _activeTimer >= LOCUST_SWARM_SPELL_DURATION;\n+\n+            if (Unit* u = me->GetVictim())\n+            {\n+                if (petOwner->GetBotAI()->HasRole(BOT_ROLE_DPS) && me->IsWithinMeleeRange(u) && me->isAttackReady())\n+                {\n+                    me->resetAttackTimer();\n+                    SpellInfo const* spellInfo = sSpellMgr->AssertSpellInfo(SPELL_SOUL_BITE);\n+                    spellInfo = spellInfo->TryGetSpellInfoOverride(me);\n+                    int32 bp = spellInfo->GetEffect(EFFECT_0).CalcValue(petOwner);\n+                    CastSpellExtraArgs args(true);\n+                    args.AddSpellBP0(bp);\n+                    me->CastSpell(u, SPELL_SOUL_BITE, args);\n+                }\n+                if (!is_full && !expired && u->IsWithinDist(petOwner, LOCUST_SWARM_EFFECTIVE_RADIUS))\n+                {\n+                    if (_chaseCheckTimer <= diff)\n+                    {\n+                        _chaseCheckTimer = urand(350, 1350);\n+                        float dist = CONTACT_DISTANCE + me->GetCombatReach() * frand(1.0f, 3.0f);\n+                        float angle = frand(0.001f, float(M_PI * 2));\n+                        Position nearpos = u->GetNearPosition(dist, angle);\n+                        me->GetMotionMaster()->MovePoint(1, nearpos, false);\n+                    }\n+                    return;\n+                }\n+                else\n+                {\n+                    me->AttackStop();\n+                    me->BotStopMovement();\n+                }\n+            }\n+            else\n+            {\n+                _chaseCheckTimer = 0;\n+\n+                if (me->GetExactDist(petOwner) < (1.5f + 5u * uint32(expired)))\n+                {\n+                    if (_gathered > 0 && (is_full || expired))\n+                    {\n+                        SpellInfo const* spellInfo = sSpellMgr->AssertSpellInfo(SPELL_LOCUST_SWARM);\n+                        spellInfo = spellInfo->TryGetSpellInfoOverride(petOwner);\n+                        HealInfo hinfo(petOwner, petOwner, _gathered, spellInfo, spellInfo->GetSchoolMask());\n+                        petOwner->CastSpell(petOwner, SPELL_ENERGIZE_VISUAL, true);\n+                        petOwner->HealBySpell(hinfo);\n+                        _gathered = 0;\n+                    }\n+                    if (expired)\n+                    {\n+                        canUpdate = false;\n+                        me->ToTempSummon()->UnSummon(1);\n+                        return;\n+                    }\n+                }\n+            }\n+\n+            if (_targetRecheckTimer <= diff)\n+            {\n+                _targetRecheckTimer = urand(1000, 1500);\n+\n+                std::list<Unit*> targets;\n+                if (petOwner->GetBotAI()->HasRole(BOT_ROLE_DPS) && !is_full && !expired)\n+                {\n+                    Bcore::AnyUnfriendlyUnitInObjectRangeCheck check(petOwner, petOwner, LOCUST_SWARM_EFFECTIVE_RADIUS);\n+                    Bcore::UnitListSearcher searcher(petOwner, targets, check);\n+                    Cell::VisitAllObjects(petOwner, searcher, LOCUST_SWARM_EFFECTIVE_RADIUS);\n+\n+                    std::erase_if(targets, [poguid = petOwner->GetGUID(), combat = petOwner->IsInCombat(), max_attackers = _attackers](Unit const* unit) {\n+                        Unit::AttackerSet const& attackers = unit->getAttackers();\n+                        if (!(unit->IsInCombat() || (combat && !attackers.empty())))\n+                            return true;\n+                        return max_attackers <= std::ranges::count_if(attackers, [oguid = poguid](Unit const* attacker) {\n+                            return attacker->GetEntry() == BOT_PET_LOCUST_SWARM && attacker->GetOwnerGUID() == oguid;\n+                        });\n+                    });\n+                }\n+\n+                if (!targets.empty())\n+                {\n+                    opponent = targets.size() == 1 ? targets.front() : Bcore::Containers::SelectRandomContainerElement(targets);\n+                    me->Attack(opponent, false);\n+                    me->GetMotionMaster()->MoveChase(opponent);\n+                }\n+                else\n+                {\n+                    if (expired)\n+                    {\n+                        _targetRecheckTimer = 150;\n+                        for (auto rate : { MOVE_WALK, MOVE_RUN })\n+                            me->SetSpeedRate(rate, std::min<float>(1000.0f, me->GetSpeedRate(rate) * 1.35f));\n+                    }\n+\n+                    float dist = (expired || is_full) ? 0.0f : frand(3.0f, 20.0f);\n+                    float angle = frand(0.001f, float(M_PI * 2));\n+                    Position nearpos = petOwner->GetNearPosition(dist, angle);\n+                    me->GetMotionMaster()->MovePoint(1, nearpos, false);\n+                }\n+            }\n+        }\n+\n+        void SpellHit(WorldObject* wcaster, SpellInfo const* spell) override\n+        {\n+            Unit* caster = wcaster->ToUnit();\n+            if (!caster)\n+                return;\n+\n+            OnSpellHit(caster, spell);\n+        }\n+\n+        void DamageDealt(Unit* victim, uint32& damage, DamageEffectType damageType) override\n+        {\n+            _gathered = std::min<uint32>(_gathered + CalculatePct(damage, 75.0f), _capacity);\n+\n+            bot_pet_ai::DamageDealt(victim, damage, damageType);\n+        }\n+\n+        uint32 GetData(uint32 data) const override\n+        {\n+            switch (data)\n+            {\n+                case BOTPETAI_MISC_FIXEDLEVEL:\n+                    return me->GetCreatureTemplate()->maxlevel;\n+                case BOTPETAI_MISC_CARRY:\n+                    return _gathered;\n+                default:\n+                    return bot_pet_ai::GetData(data);\n+            }\n+        }\n+\n+        void SetData(uint32 data, uint32 value) override\n+        {\n+            switch (data)\n+            {\n+                case BOTPETAI_MISC_CAPACITY:\n+                    _capacity = value;\n+                    break;\n+                case BOTPETAI_MISC_MAX_ATTACKERS:\n+                    _attackers = value;\n+                    break;\n+                default:\n+                    break;\n+            }\n+        }\n+\n+        void CheckAttackState() override\n+        {\n+        }\n+\n+        void Reset() override\n+        {\n+            _gathered = 0;\n+            _capacity = 100;\n+            _attackers = 7;\n+\n+            _targetRecheckTimer = 0;\n+            _chaseCheckTimer = 0;\n+\n+            _activeTimer = 0;\n+        }\n+\n+        void ReduceCD(uint32 diff) override\n+        {\n+            if (_targetRecheckTimer > diff)                 _targetRecheckTimer -= diff;\n+            if (_chaseCheckTimer > diff)                    _chaseCheckTimer -= diff;\n+        }\n+\n+        void InitPetSpells() override\n+        {\n+        }\n+\n+        void ApplyPetPassives() const override\n+        {\n+            RefreshAura(SPELL_VERTEX_COLOR_BLACK);\n+            RefreshAura(SPELL_BLACK_HOLE_VISUAL_2);\n+        }\n+\n+    private:\n+        uint32 _gathered;\n+        uint32 _capacity;\n+        uint32 _attackers;\n+\n+        uint32 _targetRecheckTimer;\n+        uint32 _chaseCheckTimer;\n+\n+        uint32 _activeTimer;\n+    };\n+};\n+\n+void AddSC_crypt_lord_bot_pets()\n+{\n+    new crypt_lord_pet_bot();\n+}\ndiff --git a/src/server/game/AI/NpcBots/bpet_dark_ranger.cpp b/src/server/game/AI/NpcBots/bpet_dark_ranger.cpp\nnew file mode 100644\nindex 0000000000..b85cfbe9b7\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bpet_dark_ranger.cpp\n@@ -0,0 +1,220 @@\n+#include \"bot_ai.h\"\n+#include \"botspell.h\"\n+#include \"bpet_ai.h\"\n+#include \"Creature.h\"\n+#include \"Player.h\"\n+#include \"ScriptMgr.h\"\n+/*\n+Dark Ranger NpcBot Pets (by Trickerer onlysuffering@gmail.com)\n+Notes:\n+Extra abilities. For the sake of defending the owner added Taunt. For self defense added Blocking (block value unchanged)\n+Both abilities are one-time use\n+Complete - 100%\n+TODO:\n+*/\n+\n+enum DarkRangerPetBaseSpells\n+{\n+    BLOCKING_1                          = 3248,\n+    TAUNT_1                             = 37548\n+};\n+enum DarkRangerPetPassives\n+{\n+};\n+enum DarkRangerPetSpecial\n+{\n+    SPELL_GENERATE_THREAT               = 23604, //reduce threat\n+    THREAT_BASE                         = 5,\n+    MINION_DURATION                     = 80000\n+};\n+\n+class dark_ranger_pet_bot : public CreatureScript\n+{\n+public:\n+    dark_ranger_pet_bot() : CreatureScript(\"dark_ranger_pet_bot\") { }\n+\n+    CreatureAI* GetAI(Creature* creature) const override\n+    {\n+        return new dark_ranger_botpetAI(creature);\n+    }\n+\n+    struct dark_ranger_botpetAI : public bot_pet_ai\n+    {\n+        dark_ranger_botpetAI(Creature* creature) : bot_pet_ai(creature) { }\n+\n+        void JustEnteredCombat(Unit* u) override { bot_pet_ai::JustEnteredCombat(u); }\n+        void KilledUnit(Unit* u) override { bot_pet_ai::KilledUnit(u); }\n+        void EnterEvadeMode(EvadeReason why = EVADE_REASON_OTHER) override { bot_pet_ai::EnterEvadeMode(why); }\n+        void MoveInLineOfSight(Unit* u) override { bot_pet_ai::MoveInLineOfSight(u); }\n+        void JustDied(Unit* u) override { bot_pet_ai::JustDied(u); }\n+        void DoNonCombatActions(uint32 /*diff*/) { }\n+\n+        void StartAttack(Unit* u, bool force = false)\n+        {\n+            if (!bot_pet_ai::StartAttack(u, force))\n+                return;\n+            GetInPosition(force, u);\n+        }\n+\n+        void DoPetActions(uint32 /*diff*/)\n+        {\n+            //if (threatGenTimer < diff)\n+            //{\n+            //    threatGenTimer = 1500;\n+            //    int32 threat = THREAT_BASE;\n+            //    CastSpellExtraArgs args(true);\n+            //    args.AddSpellBP0(threat);\n+            //    me->CastSpell(me, SPELL_GENERATE_THREAT, args);\n+            //}\n+        }\n+\n+        void UpdateAI(uint32 diff) override\n+        {\n+            if ((liveTimer += diff) >= _getMaxDuration())\n+            {\n+                canUpdate = false;\n+                me->setDeathState(JUST_DIED);\n+                return;\n+            }\n+\n+            if (!GlobalUpdate(diff))\n+                return;\n+\n+            if (!me->IsInCombat())\n+                DoNonCombatActions(diff);\n+\n+            DoPetActions(diff);\n+\n+            if (!CheckAttackTarget())\n+                return;\n+\n+            if (IsCasting())\n+                return;\n+\n+            DoPetAttack(diff);\n+        }\n+\n+        void DoPetAttack(uint32 diff)\n+        {\n+            StartAttack(opponent, IsPetMelee());\n+\n+            if (IsSpellReady(TAUNT_1, diff, false) && Rand() < 50 &&\n+                ((opponent->GetVictim() == petOwner && !IsTank(petOwner)) ||\n+                (opponent->GetVictim() == petOwner->GetBotOwner() && !IsTank(petOwner->GetBotOwner()))) &&\n+                !opponent->HasAuraType(SPELL_AURA_MOD_TAUNT) && me->IsWithinMeleeRange(opponent))\n+            {\n+                me->CastSpell(opponent, GetSpell(TAUNT_1), false);\n+                SetSpellCooldown(TAUNT_1, std::numeric_limits<uint32>::max());\n+                return;\n+            }\n+\n+            if (IsSpellReady(BLOCKING_1, diff) && !me->getAttackers().empty() && Rand() < 40)\n+            {\n+                me->CastSpell(me, GetSpell(BLOCKING_1), true);\n+                SetSpellCooldown(BLOCKING_1, 20000);\n+                return;\n+            }\n+        }\n+\n+        void OnPetClassSpellGo(SpellInfo const* /*spellInfo*/) override\n+        {\n+        }\n+\n+        void SpellHit(WorldObject* wcaster, SpellInfo const* spell) override\n+        {\n+            Unit* caster = wcaster->ToUnit();\n+            if (!caster)\n+                return;\n+\n+            OnSpellHit(caster, spell);\n+        }\n+\n+        void SpellHitTarget(WorldObject* /*wtarget*/, SpellInfo const* /*spell*/) override\n+        {\n+        }\n+\n+        void DamageDealt(Unit* victim, uint32& damage, DamageEffectType damageType) override\n+        {\n+            bot_pet_ai::DamageDealt(victim, damage, damageType);\n+        }\n+\n+        void DamageTaken(Unit* u, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo*/) override\n+        {\n+            if (!u)\n+                return;\n+            if (!u->IsInCombat() && !me->IsInCombat())\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void OwnerAttackedBy(Unit* u) override\n+        {\n+            if (!u)\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        uint32 GetData(uint32 data) const override\n+        {\n+            switch (data)\n+            {\n+                case BOTPETAI_MISC_DURATION:\n+                    return liveTimer;\n+                case BOTPETAI_MISC_DURATION_MAX:\n+                    return _getMaxDuration();\n+                case BOTPETAI_MISC_MAXLEVEL:\n+                    return maxlevel;\n+                default:\n+                    return bot_pet_ai::GetData(data);\n+            }\n+        }\n+\n+        void SetData(uint32 data, uint32 value) override\n+        {\n+            switch (data)\n+            {\n+                case BOTPETAI_MISC_MAXLEVEL:\n+                    maxlevel = uint8(value);\n+                    SetPetStats(true);\n+                    break;\n+                default:\n+                    break;\n+            }\n+        }\n+\n+        void Reset() override\n+        {\n+            liveTimer = 0;\n+            maxlevel = 1;\n+        }\n+\n+        void InitPetSpells() override\n+        {\n+            InitSpellMap(TAUNT_1, true, false);\n+            InitSpellMap(BLOCKING_1, true, false);\n+        }\n+\n+        void ApplyPetPassives() const override\n+        {\n+\n+            if (me->GetEntry() == BOT_PET_DARK_MINION_ELITE)\n+                RefreshAura(SPELL_VERTEX_COLOR_BLACK);\n+            else if (me->GetEntry() == BOT_PET_DARK_MINION)\n+                RefreshAura(SPELL_VERTEX_COLOR_GREY);\n+        }\n+\n+    private:\n+        uint32 _getMaxDuration() const\n+        {\n+            return MINION_DURATION * (IAmFree() ? 5u : 1u);\n+        }\n+\n+        uint32 liveTimer;\n+        uint8 maxlevel;\n+    };\n+};\n+\n+void AddSC_dark_ranger_bot_pets()\n+{\n+    new dark_ranger_pet_bot();\n+}\ndiff --git a/src/server/game/AI/NpcBots/bpet_death_knight.cpp b/src/server/game/AI/NpcBots/bpet_death_knight.cpp\nnew file mode 100644\nindex 0000000000..a107680ab0\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bpet_death_knight.cpp\n@@ -0,0 +1,191 @@\n+#include \"bot_ai.h\"\n+#include \"bpet_ai.h\"\n+#include \"Creature.h\"\n+#include \"ScriptMgr.h\"\n+/*\n+Deathknight NpcBot Pets (by Trickerer onlysuffering@gmail.com)\n+Complete - 25%\n+TODO: Garg, AOD, DRW\n+*/\n+enum DeathknightPetBaseSpells\n+{\n+    CLAW_1                              = 47468, //150% damage, 40 cost\n+    GNAW_1                              = 47481, //12% damage, stun 3 sec, 30 cost\n+    LEAP_1                              = 47482, //jump beh tar, 10 cost\n+    HUDDLE_1                            = 47484  //mini-shwall, channeled, 10 sec, 10 cost\n+};\n+\n+enum DeathknightPetPassives\n+{\n+    AVOIDANCE                           = 62137\n+};\n+\n+enum DeathknightPetSpecial\n+{\n+    GHOUL_FRENZY_1                      = 63560 //player-on-pet spell\n+};\n+\n+class deathknight_pet_bot : public CreatureScript\n+{\n+public:\n+    deathknight_pet_bot() : CreatureScript(\"deathknight_pet_bot\") { }\n+\n+    CreatureAI* GetAI(Creature* creature) const override\n+    {\n+        return new deathknight_botpetAI(creature);\n+    }\n+\n+    struct deathknight_botpetAI : public bot_pet_ai\n+    {\n+        deathknight_botpetAI(Creature* creature) : bot_pet_ai(creature) { }\n+\n+        void JustEnteredCombat(Unit* u) override { bot_pet_ai::JustEnteredCombat(u); }\n+        void KilledUnit(Unit* u) override { bot_pet_ai::KilledUnit(u); }\n+        void EnterEvadeMode(EvadeReason why = EVADE_REASON_OTHER) override { bot_pet_ai::EnterEvadeMode(why); }\n+        void MoveInLineOfSight(Unit* u) override { bot_pet_ai::MoveInLineOfSight(u); }\n+        void JustDied(Unit* u) override { bot_pet_ai::JustDied(u); }\n+        void DoNonCombatActions(uint32 /*diff*/) { }\n+\n+        void StartAttack(Unit* u, bool force = false)\n+        {\n+            if (!bot_pet_ai::StartAttack(u, force))\n+                return;\n+            GetInPosition(force, u);\n+        }\n+\n+        void DoPetActions(uint32 /*diff*/)\n+        {\n+        }\n+\n+        void UpdateAI(uint32 diff) override\n+        {\n+            if (!GlobalUpdate(diff))\n+                return;\n+\n+            if (!me->IsInCombat())\n+                DoNonCombatActions(diff);\n+\n+            DoPetActions(diff);\n+\n+            if (!CheckAttackTarget())\n+                return;\n+\n+            if (IsCasting())\n+                return;\n+\n+            DoPetAttack(diff);\n+        }\n+\n+        void DoPetAttack(uint32 diff)\n+        {\n+            StartAttack(opponent, IsPetMelee());\n+\n+            float dist = me->GetDistance(opponent);\n+            //Unit const* u = opponent->GetVictim();\n+            bool canDPS = petOwner->GetBotAI()->HasRole(BOT_ROLE_DPS);\n+\n+            if (myType == BOT_PET_GHOUL)\n+            {\n+                if (IsSpellReady(GHOUL_FRENZY_1, diff) && canDPS && me->IsWithinMeleeRange(opponent))\n+                {\n+                    RefreshAura(GHOUL_FRENZY_1);\n+                    SetSpellCooldown(GHOUL_FRENZY_1, 30000);\n+                }\n+\n+                uint32 const energy = me->GetPower(POWER_ENERGY);\n+\n+                if (IsSpellReady(HUDDLE_1, diff) && energy >= 10 && dist < 7 &&\n+                    !me->getAttackers().empty() && GetHealthPCT(me) < 70)\n+                {\n+                    me->CastSpell(me, GetSpell(HUDDLE_1), false);\n+                    return;\n+                }\n+\n+                if (IsSpellReady(LEAP_1, diff) && energy >= 10 &&\n+                    !HasBotCommandState(BOT_COMMAND_STAY) &&\n+                    !(opponent->IsCreature() && opponent->ToCreature()->isWorldBoss()) &&\n+                    dist > 5 && dist < 30)\n+                {\n+                    me->CastSpell(opponent, GetSpell(LEAP_1), false);\n+                    return;\n+                }\n+\n+                if (IsSpellReady(GNAW_1, diff) && canDPS && energy >= 30 &&\n+                    me->IsWithinMeleeRange(opponent) && opponent->IsNonMeleeSpellCast(false, false, true))\n+                {\n+                    me->CastSpell(opponent, GetSpell(GNAW_1), false);\n+                    return;\n+                }\n+\n+                if (IsSpellReady(CLAW_1, diff) && canDPS && energy >= 40 && me->IsWithinMeleeRange(opponent))\n+                {\n+                    me->CastSpell(opponent, GetSpell(CLAW_1), false);\n+                    return;\n+                }\n+            }\n+        }\n+\n+        void OnPetClassSpellGo(SpellInfo const* /*spellInfo*/) override\n+        {\n+        }\n+\n+        void SpellHit(WorldObject* wcaster, SpellInfo const* spell) override\n+        {\n+            Unit* caster = wcaster->ToUnit();\n+            if (!caster)\n+                return;\n+\n+            OnSpellHit(caster, spell);\n+        }\n+\n+        void SpellHitTarget(WorldObject* /*wtarget*/, SpellInfo const* /*spell*/) override\n+        {\n+        }\n+\n+        void DamageDealt(Unit* victim, uint32& damage, DamageEffectType damageType) override\n+        {\n+            bot_pet_ai::DamageDealt(victim, damage, damageType);\n+        }\n+\n+        void DamageTaken(Unit* u, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo*/) override\n+        {\n+            if (!u)\n+                return;\n+            if (!u->IsInCombat() && !me->IsInCombat())\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void OwnerAttackedBy(Unit* u) override\n+        {\n+            if (!u)\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void Reset() override\n+        {\n+        }\n+\n+        void InitPetSpells() override\n+        {\n+            InitSpellMap(CLAW_1);\n+            InitSpellMap(GNAW_1);\n+            InitSpellMap(LEAP_1);\n+            InitSpellMap(HUDDLE_1);\n+        }\n+\n+        void ApplyPetPassives() const override\n+        {\n+            if (myType == BOT_PET_GHOUL/* || myType == BOT_PET_AOD_GHOUL*/)\n+                RefreshAura(AVOIDANCE);\n+        }\n+\n+    private:\n+    };\n+};\n+\n+void AddSC_deathknight_bot_pets()\n+{\n+    new deathknight_pet_bot();\n+}\ndiff --git a/src/server/game/AI/NpcBots/bpet_dreadlord.cpp b/src/server/game/AI/NpcBots/bpet_dreadlord.cpp\nnew file mode 100644\nindex 0000000000..69447d889c\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bpet_dreadlord.cpp\n@@ -0,0 +1,163 @@\n+#include \"bot_ai.h\"\n+#include \"bpet_ai.h\"\n+#include \"Creature.h\"\n+#include \"ScriptMgr.h\"\n+#include \"SpellAuras.h\"\n+/*\n+Dreadlord NpcBot Pets (by Trickerer onlysuffering@gmail.com)\n+Complete - 100%\n+TODO:\n+*/\n+\n+enum DreadlordPetBaseSpells\n+{\n+};\n+\n+enum DreadlordPetPassives\n+{\n+};\n+\n+enum DreadlordPetSpecial\n+{\n+    IMMOLATION_DAMAGE       = 35959,\n+\n+    INFERNAL_DURATION       = 180000 //3 min\n+};\n+\n+class dreadlord_pet_bot : public CreatureScript\n+{\n+public:\n+    dreadlord_pet_bot() : CreatureScript(\"dreadlord_pet_bot\") { }\n+\n+    CreatureAI* GetAI(Creature* creature) const override\n+    {\n+        return new dreadlord_botpetAI(creature);\n+    }\n+\n+    struct dreadlord_botpetAI : public bot_pet_ai\n+    {\n+        dreadlord_botpetAI(Creature* creature) : bot_pet_ai(creature) { }\n+\n+        void JustEnteredCombat(Unit* u) override { bot_pet_ai::JustEnteredCombat(u); }\n+        void KilledUnit(Unit* u) override { bot_pet_ai::KilledUnit(u); }\n+        void EnterEvadeMode(EvadeReason why = EVADE_REASON_OTHER) override { bot_pet_ai::EnterEvadeMode(why); }\n+        void MoveInLineOfSight(Unit* u) override { bot_pet_ai::MoveInLineOfSight(u); }\n+        void JustDied(Unit* u) override { bot_pet_ai::JustDied(u); }\n+        void DoNonCombatActions(uint32 /*diff*/) { }\n+\n+        void StartAttack(Unit* u, bool force = false)\n+        {\n+            if (!bot_pet_ai::StartAttack(u, force))\n+                return;\n+            GetInPosition(force, u);\n+        }\n+\n+        void DoPetActions(uint32 /*diff*/)\n+        {\n+        }\n+\n+        void UpdateAI(uint32 diff) override\n+        {\n+            if ((liveTimer += diff) >= INFERNAL_DURATION * (IAmFree() ? 20u : 1u) - 2000u)\n+            {\n+                canUpdate = false;\n+                me->setDeathState(JUST_DIED);\n+                return;\n+            }\n+\n+            if (!GlobalUpdate(diff))\n+                return;\n+\n+            if (!me->IsInCombat())\n+                DoNonCombatActions(diff);\n+\n+            //CheckDrainMana(diff);\n+\n+            if (!CheckAttackTarget())\n+                return;\n+\n+            if (IsCasting())\n+                return;\n+\n+            DoPetAttack(diff);\n+        }\n+\n+        void DoPetAttack(uint32 /*diff*/)\n+        {\n+            StartAttack(opponent, IsPetMelee());\n+        }\n+\n+        void ApplyClassDamageMultiplierSpell(int32& damage, SpellNonMeleeDamage& /*damageinfo*/, SpellInfo const* spellInfo, WeaponAttackType /*attackType*/, bool /*iscrit*/) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            float fdamage = float(damage);\n+\n+            float pctbonus = 1.0f;\n+            pctbonus *= 0.5f;\n+\n+            if (baseId == IMMOLATION_DAMAGE)\n+                fdamage += me->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_MAGIC) * me->CalculateDefaultCoefficient(spellInfo, SPELL_DIRECT_DAMAGE) * me->CalculateSpellpowerCoefficientLevelPenalty(spellInfo);\n+\n+            damage = int32(fdamage * pctbonus);\n+        }\n+\n+        void OnPetClassSpellGo(SpellInfo const* /*spellInfo*/) override\n+        {\n+        }\n+\n+        void SpellHit(WorldObject* wcaster, SpellInfo const* spell) override\n+        {\n+            Unit* caster = wcaster->ToUnit();\n+            if (!caster)\n+                return;\n+\n+            OnSpellHit(caster, spell);\n+        }\n+\n+        void SpellHitTarget(WorldObject* /*wtarget*/, SpellInfo const* /*spell*/) override\n+        {\n+        }\n+\n+        void DamageDealt(Unit* victim, uint32& damage, DamageEffectType damageType) override\n+        {\n+            bot_pet_ai::DamageDealt(victim, damage, damageType);\n+        }\n+\n+        void DamageTaken(Unit* u, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo*/) override\n+        {\n+            if (!u)\n+                return;\n+            if (!u->IsInCombat() && !me->IsInCombat())\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void OwnerAttackedBy(Unit* u) override\n+        {\n+            if (!u)\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void Reset() override\n+        {\n+            liveTimer = 0;\n+        }\n+\n+        void InitPetSpells() override\n+        {\n+        }\n+\n+        void ApplyPetPassives() const override\n+        {\n+        }\n+\n+    private:\n+        uint32 liveTimer;\n+    };\n+};\n+\n+void AddSC_dreadlord_bot_pets()\n+{\n+    new dreadlord_pet_bot();\n+}\ndiff --git a/src/server/game/AI/NpcBots/bpet_druid.cpp b/src/server/game/AI/NpcBots/bpet_druid.cpp\nnew file mode 100644\nindex 0000000000..6f37241a4f\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bpet_druid.cpp\n@@ -0,0 +1,146 @@\n+#include \"bot_ai.h\"\n+#include \"bpet_ai.h\"\n+#include \"ScriptMgr.h\"\n+#include \"TemporarySummon.h\"\n+/*\n+Druid NpcBot Pets (by Trickerer onlysuffering@gmail.com)\n+Complete - 100%\n+TODO:\n+*/\n+\n+enum DruidPetBaseSpells\n+{\n+};\n+\n+enum DruidPetPassives\n+{\n+};\n+\n+enum DruidPetSpecial\n+{\n+    TREANT_DURATION         = 30000\n+};\n+\n+class druid_pet_bot : public CreatureScript\n+{\n+public:\n+    druid_pet_bot() : CreatureScript(\"druid_pet_bot\") { }\n+\n+    CreatureAI* GetAI(Creature* creature) const override\n+    {\n+        return new druid_botpetAI(creature);\n+    }\n+\n+    struct druid_botpetAI : public bot_pet_ai\n+    {\n+        druid_botpetAI(Creature* creature) : bot_pet_ai(creature) { }\n+\n+        void JustEnteredCombat(Unit* u) override { bot_pet_ai::JustEnteredCombat(u); }\n+        void KilledUnit(Unit* u) override { bot_pet_ai::KilledUnit(u); }\n+        void EnterEvadeMode(EvadeReason why = EVADE_REASON_OTHER) override { bot_pet_ai::EnterEvadeMode(why); }\n+        void MoveInLineOfSight(Unit* u) override { bot_pet_ai::MoveInLineOfSight(u); }\n+        void JustDied(Unit* u) override { bot_pet_ai::JustDied(u); }\n+        void DoNonCombatActions(uint32 /*diff*/) { }\n+\n+        void StartAttack(Unit* u, bool force = false)\n+        {\n+            if (!bot_pet_ai::StartAttack(u, force))\n+                return;\n+            GetInPosition(force, u);\n+        }\n+\n+        void DoPetActions(uint32 /*diff*/)\n+        {\n+        }\n+\n+        void UpdateAI(uint32 diff) override\n+        {\n+            if ((liveTimer += diff) >= TREANT_DURATION)\n+            {\n+                canUpdate = false;\n+                me->ToTempSummon()->UnSummon(1);\n+                return;\n+            }\n+\n+            if (!GlobalUpdate(diff))\n+                return;\n+\n+            if (!me->IsInCombat())\n+                DoNonCombatActions(diff);\n+\n+            //CheckDrainMana(diff);\n+\n+            if (!CheckAttackTarget())\n+                return;\n+\n+            if (IsCasting())\n+                return;\n+\n+            DoPetAttack(diff);\n+        }\n+\n+        void DoPetAttack(uint32 /*diff*/)\n+        {\n+            StartAttack(opponent, IsPetMelee());\n+        }\n+\n+        void OnPetClassSpellGo(SpellInfo const* /*spellInfo*/) override\n+        {\n+        }\n+\n+        void SpellHit(WorldObject* wcaster, SpellInfo const* spell) override\n+        {\n+            Unit* caster = wcaster->ToUnit();\n+            if (!caster)\n+                return;\n+\n+            OnSpellHit(caster, spell);\n+        }\n+\n+        void SpellHitTarget(WorldObject* /*wtarget*/, SpellInfo const* /*spell*/) override\n+        {\n+        }\n+\n+        void DamageDealt(Unit* victim, uint32& damage, DamageEffectType damageType) override\n+        {\n+            bot_pet_ai::DamageDealt(victim, damage, damageType);\n+        }\n+\n+        void DamageTaken(Unit* u, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo*/) override\n+        {\n+            if (!u)\n+                return;\n+            if (!u->IsInCombat() && !me->IsInCombat())\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void OwnerAttackedBy(Unit* u) override\n+        {\n+            if (!u)\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void Reset() override\n+        {\n+            liveTimer = 0;\n+        }\n+\n+        void InitPetSpells() override\n+        {\n+        }\n+\n+        void ApplyPetPassives() const override\n+        {\n+        }\n+\n+    private:\n+        uint32 liveTimer;\n+    };\n+};\n+\n+void AddSC_druid_bot_pets()\n+{\n+    new druid_pet_bot();\n+}\ndiff --git a/src/server/game/AI/NpcBots/bpet_hunter.cpp b/src/server/game/AI/NpcBots/bpet_hunter.cpp\nnew file mode 100644\nindex 0000000000..1dfc99994e\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bpet_hunter.cpp\n@@ -0,0 +1,1000 @@\n+#include \"bot_ai.h\"\n+#include \"bpet_ai.h\"\n+#include \"CellImpl.h\"\n+#include \"GridNotifiers.h\"\n+#include \"GridNotifiersImpl.h\"\n+#include \"Map.h\"\n+#include \"Player.h\"\n+#include \"ScriptMgr.h\"\n+#include \"SpellMgr.h\"\n+/*\n+Hunter NpcBot Pets (by Trickerer onlysuffering@gmail.com)\n+Complete - 100%\n+TODO:\n+*/\n+//talent tiers 20-32-44-56-68-80\n+enum HunterPetBaseSpells\n+{\n+    //common\n+    GROWL_1                             = 2649,//1\n+    COWER_1                             = 1742,//20\n+    //semi-common\n+    //attack\n+    BITE_1                              = 17253,//1 cost 25, Bat, Boar, Carrion Bird, Chimaera, Core Hound, Crocolisk, Devilsaur, Dragonhawk, Hyena, Nether Ray, Ravager, Serpent, Wolf, Worm\n+    CLAW_1                              = 16827,//1 cost 25, Bear, Bird of Prey, Cat, Crab, Raptor, Scorpid, Silithid, Spirit Beast, Tallstrider\n+    SMACK_1                             = 49966,//1 cost 25, Gorilla, Sporebat, Moth, Rhino, Wasp\n+    //movement\n+    //charge\n+    SWOOP_1                             = 52825,//44 cost 35 Carrion Bird, Wasp, Teromoth\n+    CHARGE_1                            = 61685,//20/44 cost 35 Bear, Boar, Cat, Core Hound, Crab, Crocolisk, Devilsaur, Gorilla, Hyena, Raptor, Rhino, Scorpid, Spirit Beast, Tallstrider, Turtle, Warp Stalker, Wolf, Worm\n+    //sprint\n+    DASH_1                              = 61684,//20/44 cost 30 Cat, Core Hound, Devilsaur, Hyena, Raptor, Ravager, Serpent, Silithid, Spider, Spirit Beast, Tallstrider, Warp Stalker, Wolf\n+    DIVE_1                              = 23145,//20 cost 30 Bat, Bird of Prey, Carrion Bird, Chimaera, Dragonhawk, Moth, Nether Ray, Sporebat, Wasp, Wind Serpent\n+    //talents cunning\n+    CARRION_FEEDER_1                    = 54045,//44 triggered spell\n+    WOLVERINE_BITE_1                    = 53508,//68 after crit (any time for bot)\n+    ROAR_OF_RECOVERY_1                  = 53517,//68 mana regen\n+    BULLHEADED_1                        = 53490,//68 movement imparing remove\n+    //talents ferocity\n+    //HEART_OF_THE_PHOENIX_1              = 55709,\n+    RABID_1                             = 53401,//68 attack increase proc\n+    LICK_YOUR_WOUNDS_1                  = 53426,//68 full heal over 5, channeled\n+    CALL_OF_THE_WILD_1                  = 53434,//68 10% AP for pet and hunter\n+    //talents tenacity\n+    THUNDERSTOMP_1                      = 63900,//44\n+    LAST_STAND_1                        = 53478,//68 30%\n+    TAUNT_1                             = 53477,//68 3 min cd 126 sec improved\n+    ROAR_OF_SACRIFICE_1                 = 53480,//68\n+    INTERVENE_1                         = 53476,//68\n+    //pet-specific\n+    //cunning\n+    SONIC_BLAST_1                       = 50519,//bat c80 dmg/stun 20y cd60\n+    SNATCH_1                            = 50541,//birdop c20 dmg/disarm 5y cd60\n+    FROSTSTORM_BREATH_1                 = 54644,//chimera c20 dmg/slow 30y cd10\n+    FIRE_BREATH_1                       = 34889,//dhawk c20 dmg/dot 20y cd10\n+    NETHER_SHOCK_1                      = 50479,//nray c20 dmg/interrupt 20y cd40\n+    RAVAGE_1                            = 50518,//ravager c0 (bug?) dmg/stun 5y cd40\n+    POISON_SPIT_1                       = 35387,//serpent c20 dot/slowcast 30y cd10\n+    VENOM_WEB_SPRAY_1                   = 54706,//silithid c0 dot/root 30y cd40\n+    WEB_1                               = 4167,//spider c0 root 30y cd40\n+    SPORE_CLOUD_1                       = 50274,//sporebat c20 aoedot/-armorpct 6yd cd10\n+    LIGHTNING_BREATH_1                  = 24844,//wserpent c20 dmg 20y cd10\n+    //ferocity\n+    DEMORALIZING_SCREECH_1              = 24423,//cbird c20 dmg/aoe-ap 5y cd10\n+    PROWL_1                             = 24450,//cat,spbeast c0 stealth 0y cd10\n+    LAVA_BREATH_1                       = 58604,//chound c20 dmg/slowcast 30y cd10\n+    MONSTROUS_BITE_1                    = 54680,//dsaur c20 dmg/buff 5y cd10\n+    TENDON_RIP_1                        = 50271,//hyena c20 dmg/snare 5y cd20\n+    SERENITY_DUST_1                     = 50318,//tmoth c0 hot/buff+ap 0y cd60\n+    SAVAGE_REND_1                       = 50498,//raptor c20 dmg/dot 5y cd60\n+    SPIRIT_STRIKE_1                     = 61193,//spbeast c20 dmg/dot 30y cd10\n+    DUST_CLOUD_1                        = 50285,//tstrider c20 aoe-100hit 10y cd40 lvl6\n+    STING_1                             = 56626,//wasp c20 dmg/-5%armor 5y cd6\n+    FURIOUS_HOWL_1                      = 24604,//wolf c20 buff+ap 100y cd40\n+    //tenacity\n+    SWIPE_1                             = 50256,//bear c20 dmg 5y cd5\n+    GORE_1                              = 35290,//boar c20 dmg 5y cd10\n+    PIN_1                               = 50245,//crab c0 root/dot 5y cd40\n+    PUMMEL_1                            = 26090,//gorilla c20 interrupt 5y cd30\n+    STAMPEDE_1                          = 57386,//rhino c0 dmg/debuff+bleed 5y cd60\n+    SCORPID_POISON_1                    = 24640,//scorpid c20 threat/dot 5y cd10\n+    SHELL_SHIELD_1                      = 26064,//turtle c0 buff%dmgtaken 0y cd60\n+    WARP_1                              = 35346,//wstalker c0 tp/buff50%avoid 30y cd15\n+    ACID_SPIT_1                         = 55749,//worm c20 dmg/debuff-10%armor 30y cd10\n+\n+    //from hunter's talents\n+    SPIRIT_BOND_PET                     = 24529,\n+    KINDRED_SPIRITS_PET                 = 57475,\n+    INTIMIDATION_1                      = 24394,\n+    BESTIAL_WRATH_1                     = 19574,\n+    BEAST_WITHIN_1                      = 34471\n+};\n+\n+enum HunterPetPassives\n+{\n+    //common\n+    AVOIDANCE                           = 65220,\n+    //pet talents\n+    COBRA_REFLEXES                      = 61683,//rank 2\n+    //BOARS_SPEED                         = 19596,\n+    BLOOD_OF_THE_RHINO                  = 53482,//rank 2\n+    OWLS_FOCUS                          = 53516,//rank 2\n+    CULLING_THE_HERD                    = 52858,//rank 3\n+    GRACE_OF_THE_MANTIS                 = 53451,//rank 2\n+    CORNERED                            = 53497,//rank 2\n+    FEEDING_FRENZY                      = 53512,//rank 2\n+    SILVERBACK                          = 62765,//rank 2\n+    //special\n+    //Catlike Reflexes and Serpent's Swiftness replacement\n+    HASTE_DODGE_PASSIVE                 = 13789,//Lightning Reflexes rank 3 6 dodge 10 haste\n+};\n+\n+enum HunterPetSpecial\n+{\n+    PET_CATEGORY_CUNNING                = 1,\n+    PET_CATEGORY_FEROCITY               = 2,\n+    PET_CATEGORY_TENACITY               = 3,\n+\n+    GO_FOR_THE_THROAT_ENERGIZE          = 34953,\n+    FRENZY_BUFF                         = 19615,\n+    //HEART_OF_THE_PHOENIX_TRIGGERED      = 54114,//resurrect pet effect\n+    //HEART_OF_THE_PHOENIX_DEBUFF         = 55711 //Weakened Heart dummy eff 0 icon 2787\n+};\n+\n+class hunter_pet_bot : public CreatureScript\n+{\n+public:\n+    hunter_pet_bot() : CreatureScript(\"hunter_pet_bot\") { }\n+\n+    CreatureAI* GetAI(Creature* creature) const override\n+    {\n+        return new hunter_botpetAI(creature);\n+    }\n+\n+    struct hunter_botpetAI : public bot_pet_ai\n+    {\n+        hunter_botpetAI(Creature* creature) : bot_pet_ai(creature) { }\n+\n+        void JustEnteredCombat(Unit* u) override { bot_pet_ai::JustEnteredCombat(u); }\n+        void KilledUnit(Unit* u) override { bot_pet_ai::KilledUnit(u); }\n+        void EnterEvadeMode(EvadeReason why = EVADE_REASON_OTHER) override { bot_pet_ai::EnterEvadeMode(why); }\n+        void MoveInLineOfSight(Unit* u) override { bot_pet_ai::MoveInLineOfSight(u); }\n+        void JustDied(Unit* u) override { bot_pet_ai::JustDied(u); }\n+        void DoNonCombatActions(uint32 /*diff*/) { }\n+\n+        void StartAttack(Unit* u, bool force = false)\n+        {\n+            if (!bot_pet_ai::StartAttack(u, force))\n+                return;\n+            GetInPosition(force, u);\n+        }\n+\n+        void DoPetActions(uint32 diff)\n+        {\n+            if (GetSpell(SPIRIT_BOND_PET) && IsSpellReady(SPIRIT_BOND_PET, diff, false) &&\n+                !petOwner->GetAuraEffect(SPELL_AURA_MOD_HEALING_PCT, SPELLFAMILY_GENERIC, 960, 1))\n+            {\n+                me->CastSpell(me, SPIRIT_BOND_PET, true);\n+                SetSpellCooldown(SPIRIT_BOND_PET, uint32(-1));\n+            }\n+            if (GetSpell(KINDRED_SPIRITS_PET) && IsSpellReady(KINDRED_SPIRITS_PET, diff, false) &&\n+                !petOwner->GetAuraEffect(SPELL_AURA_MOD_INCREASE_SPEED, SPELLFAMILY_GENERIC, 3559, 0))\n+            {\n+                me->CastSpell(me, KINDRED_SPIRITS_PET, true);\n+                SetSpellCooldown(KINDRED_SPIRITS_PET, uint32(-1));\n+            }\n+\n+            //Ignoring pet category\n+\n+            if (IsSpellReady(CARRION_FEEDER_1, diff, false) && !me->isMoving() && GetHealthPCT(me) <= 80 &&\n+                !me->IsInCombat() && !me->GetVictim() && me->getAttackers().empty() &&\n+                !me->HasAuraType(SPELL_AURA_PERIODIC_DAMAGE) && Rand() < 20)\n+            {\n+                WorldObject* result = nullptr;\n+                Bcore::AnyDeadUnitSpellTargetInRangeCheck check(me, 5.f, sSpellMgr->GetSpellInfo(CARRION_FEEDER_1), TARGET_CHECK_ENEMY);\n+                Bcore::WorldObjectSearcher<Bcore::AnyDeadUnitSpellTargetInRangeCheck> searcher(me, result, check);\n+                Cell::VisitWorldObjects(me, searcher, 5.f);\n+\n+                if (result)\n+                {\n+                    me->CastSpell(me, GetSpell(CARRION_FEEDER_1), false);\n+                    SetSpellCooldown(CARRION_FEEDER_1, 21000);\n+                    return;\n+                }\n+            }\n+\n+            if (IsSpellReady(LICK_YOUR_WOUNDS_1, diff, false) && !me->isMoving() && !me->GetVictim() &&\n+                me->getAttackers().empty() && GetHealthPCT(me) <= 50 + 30 * me->IsInCombat() &&\n+                !me->HasAuraType(SPELL_AURA_PERIODIC_DAMAGE) && Rand() < 40)\n+            {\n+                me->CastSpell(me, GetSpell(LICK_YOUR_WOUNDS_1), false);\n+                SetSpellCooldown(LICK_YOUR_WOUNDS_1, 126000);\n+                return;\n+            }\n+\n+            if (IsSpellReady(ROAR_OF_RECOVERY_1, diff, false) && petOwner->IsInCombat() && opponent &&\n+                GetManaPCT(petOwner) < 65 && petOwner->GetDistance(me) < 40)\n+            {\n+                me->CastSpell(me, GetSpell(ROAR_OF_RECOVERY_1), false);\n+                SetSpellCooldown(ROAR_OF_RECOVERY_1, 126000);\n+                return;\n+            }\n+\n+            if (IsSpellReady(INTERVENE_1, diff, false) && GetHealthPCT(petOwner) < 95 && !petOwner->getAttackers().empty() &&\n+                me->getAttackers().size() <= petOwner->getAttackers().size())\n+            {\n+                float petdist = me->GetDistance(petOwner);\n+                if (petdist < 25 && petdist > 8)\n+                {\n+                    me->CastSpell(petOwner, GetSpell(INTERVENE_1), false);\n+                    SetSpellCooldown(INTERVENE_1, 21000);\n+                    return;\n+                }\n+            }\n+        }\n+\n+        void UpdateAI(uint32 diff) override\n+        {\n+            if (!GlobalUpdate(diff))\n+                return;\n+\n+            if (!me->IsInCombat())\n+                DoNonCombatActions(diff);\n+\n+            DoPetActions(diff);\n+            //CheckDrainMana(diff);\n+\n+            if (!CheckAttackTarget())\n+                return;\n+\n+            if (IsCasting())\n+                return;\n+\n+            DoPetAttack(diff);\n+        }\n+\n+        void DoPetAttack(uint32 diff)\n+        {\n+            StartAttack(opponent, IsPetMelee());\n+\n+            Unit const* u = opponent->GetVictim();\n+            float dist = me->GetDistance(opponent);\n+            uint32 focus = me->GetPower(POWER_FOCUS);\n+            bool canDPS = petOwner->GetBotAI()->HasRole(BOT_ROLE_DPS);\n+\n+            //improved + Longevity applied to cds\n+\n+            if (IsSpellReady(BESTIAL_WRATH_1, diff, false) && canDPS && dist < 10 &&\n+                (opponent->GetHealth() > petOwner->GetMaxHealth()/4 * (1 + opponent->getAttackers().size()) ||\n+                opponent->IsPlayer()))\n+            {\n+                if (petOwner->AddAura(GetSpell(BESTIAL_WRATH_1), me))\n+                {\n+                    if (GetSpell(BEAST_WITHIN_1))\n+                        petOwner->AddAura(GetSpell(BEAST_WITHIN_1), petOwner);\n+\n+                    SetSpellCooldown(BESTIAL_WRATH_1, 70000);\n+                    return;\n+                }\n+            }\n+\n+            //LAST STAND\n+            if (IsSpellReady(LAST_STAND_1, diff, false) &&\n+                GetHealthPCT(me) < (30 + 20 * (opponent->getAttackers().size() > 1) + 10 * me->HasAuraType(SPELL_AURA_PERIODIC_DAMAGE)))\n+            {\n+                me->CastSpell(me, GetSpell(LAST_STAND_1), false);\n+                SetSpellCooldown(LAST_STAND_1, 252000);\n+            }\n+\n+            if (IsSpellReady(INTIMIDATION_1, diff, false) && !CCed(opponent) && me->IsWithinMeleeRange(opponent))\n+            {\n+                me->CastSpell(opponent, GetSpell(INTIMIDATION_1), false);\n+                SetSpellCooldown(INTIMIDATION_1, 60000);\n+                return;\n+            }\n+\n+            if (IsSpellReady(GROWL_1, diff, false) && u && u != me && focus >= 15 && me->IsWithinMeleeRange(opponent) &&\n+                opponent->CanHaveThreatList() && !CCed(opponent) && !opponent->HasAuraType(SPELL_AURA_MOD_TAUNT) &&\n+                (!IsTank(u) || (GetHealthPCT(u) < 30 && GetHealthPCT(me) > 50)) && IsInBotParty(u))\n+            {\n+                me->CastSpell(opponent, GetSpell(GROWL_1), false);\n+                SetSpellCooldown(GROWL_1, 3500);\n+                return;\n+            }\n+\n+            if (IsSpellReady(TAUNT_1, diff, false) && u && u != me && me->IsWithinMeleeRange(opponent) &&\n+                opponent->CanHaveThreatList() && !CCed(opponent) && !opponent->HasAuraType(SPELL_AURA_MOD_TAUNT) &&\n+                (!IsTank(u) || (GetHealthPCT(u) < 30 && GetHealthPCT(me) > 50)) && IsInBotParty(u))\n+            {\n+                me->CastSpell(opponent, GetSpell(TAUNT_1), false);\n+                SetSpellCooldown(TAUNT_1, 126000);\n+                return;\n+            }\n+\n+            if (IsSpellReady(COWER_1, diff, false) && !me->getAttackers().empty() &&\n+                me->GetDistance(*me->getAttackers().begin()) < 7 && GetHealthPCT(me) < 90)\n+            {\n+                me->CastSpell(me, GetSpell(COWER_1), false);\n+                SetSpellCooldown(COWER_1, 31500);\n+                return;\n+            }\n+\n+            if (IsSpellReady(BULLHEADED_1, diff, false) && GetHealthPCT(me) < 90 &&\n+                ((!me->getAttackers().empty() && me->GetDistance(*me->getAttackers().begin()) < 7) ||\n+                (dist > 3 && !opponent->HasInArc(float(M_PI)/2, me) &&\n+                (CCed(me, true) || me->HasAuraWithMechanic(1u<<MECHANIC_SNARE)))))\n+            {\n+                me->CastSpell(me, GetSpell(BULLHEADED_1), false);\n+                SetSpellCooldown(BULLHEADED_1, 31500);\n+                return;\n+            }\n+\n+            uint32 SPRINT = IsPetTypeSpell(DASH_1) ? DASH_1 : IsPetTypeSpell(DIVE_1) ? DIVE_1 : 0;\n+            if (SPRINT && GetSpell(SPRINT) && IsSpellReady(SPRINT, diff, false) && dist > 10 && dist < 30 &&\n+                !HasBotCommandState(BOT_COMMAND_STAY))\n+            {\n+                me->CastSpell(opponent, GetSpell(SPRINT), false);\n+                SetSpellCooldown(SPRINT, 17500);\n+                return;\n+            }\n+\n+            if (IsSpellReady(CALL_OF_THE_WILD_1, diff, false) && canDPS && dist < 10)\n+            {\n+                me->CastSpell(me, GetSpell(CALL_OF_THE_WILD_1), false);\n+                SetSpellCooldown(CALL_OF_THE_WILD_1, 210000);\n+                return;\n+            }\n+\n+            if (IsSpellReady(RABID_1, diff, false) && canDPS && dist < 10)\n+            {\n+                me->CastSpell(me, GetSpell(RABID_1), false);\n+                SetSpellCooldown(RABID_1, 31500);\n+                return;\n+            }\n+\n+            if (IsSpellReady(THUNDERSTOMP_1, diff, false) && canDPS && focus >= 20 &&\n+                me->IsWithinMeleeRange(opponent) && me->getAttackers().size() > 1)\n+            {\n+                me->CastSpell(opponent, GetSpell(THUNDERSTOMP_1), false);\n+                SetSpellCooldown(THUNDERSTOMP_1, 7000);\n+                return;\n+            }\n+\n+            if (myType == BOT_PET_BAT)\n+            {\n+                if (IsSpellReady(SONIC_BLAST_1, diff, false) && canDPS && focus >= 80 &&\n+                    dist < 20 && opponent->IsNonMeleeSpellCast(false, false, true))\n+                {\n+                    me->CastSpell(opponent, GetSpell(SONIC_BLAST_1), false);\n+                    SetSpellCooldown(SONIC_BLAST_1, 42000);\n+                    return;\n+                }\n+            }\n+            else if (myType == BOT_PET_BIRDOFPREY)\n+            {\n+                if (IsSpellReady(SNATCH_1, diff, false) && canDPS && focus >= 20 &&\n+                    me->IsWithinMeleeRange(opponent) && !opponent->HasAuraType(SPELL_AURA_MOD_DISARM) &&\n+                    ((opponent->IsPlayer()) ? opponent->ToPlayer()->GetWeaponForAttack(BASE_ATTACK) != nullptr :\n+                    opponent->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID) != 0))\n+                {\n+                    me->CastSpell(opponent, GetSpell(SNATCH_1), false);\n+                    SetSpellCooldown(SNATCH_1, 42000);\n+                    return;\n+                }\n+            }\n+            else if (myType == BOT_PET_CHIMAERA)\n+            {\n+                if (IsSpellReady(FROSTSTORM_BREATH_1, diff, false) && canDPS && focus >= 20 && dist < 30)\n+                {\n+                    me->CastSpell(opponent, GetSpell(FROSTSTORM_BREATH_1), false);\n+                    SetSpellCooldown(FROSTSTORM_BREATH_1, 7000);\n+                    return;\n+                }\n+            }\n+            else if (myType == BOT_PET_DRAGONHAWK)\n+            {\n+                if (IsSpellReady(FIRE_BREATH_1, diff, false) && canDPS && focus >= 20 && dist < 20)\n+                {\n+                    me->CastSpell(opponent, GetSpell(FIRE_BREATH_1), false);\n+                    SetSpellCooldown(FIRE_BREATH_1, 7000);\n+                    return;\n+                }\n+            }\n+            else if (myType == BOT_PET_NETHERRAY)\n+            {\n+                if (IsSpellReady(NETHER_SHOCK_1, diff, false) && canDPS && focus >= 20 && dist < 20 &&\n+                    opponent->IsNonMeleeSpellCast(false, false, true))\n+                {\n+                    me->CastSpell(opponent, GetSpell(NETHER_SHOCK_1), false);\n+                    SetSpellCooldown(NETHER_SHOCK_1, 28000);\n+                    return;\n+                }\n+            }\n+            else if (myType == BOT_PET_RAVAGER)\n+            {\n+                if (IsSpellReady(RAVAGE_1, diff, false) && canDPS/* && focus >= 0*/ &&\n+                    me->IsWithinMeleeRange(opponent) && opponent->IsNonMeleeSpellCast(false, false, true))\n+                {\n+                    me->CastSpell(opponent, GetSpell(RAVAGE_1), false);\n+                    SetSpellCooldown(RAVAGE_1, 28000);\n+                    return;\n+                }\n+            }\n+            else if (myType == BOT_PET_SERPENT)\n+            {\n+                if (IsSpellReady(POISON_SPIT_1, diff, false) && canDPS && focus >= 20 && dist < 30)\n+                {\n+                    me->CastSpell(opponent, GetSpell(POISON_SPIT_1), false);\n+                    SetSpellCooldown(POISON_SPIT_1, 7000);\n+                    return;\n+                }\n+            }\n+            else if (myType == BOT_PET_SILITHID)\n+            {\n+                if (IsSpellReady(VENOM_WEB_SPRAY_1, diff, false) && canDPS/* && focus >= 0*/ && dist < 30 &&\n+                    !CCed(opponent, true))\n+                {\n+                    me->CastSpell(opponent, GetSpell(VENOM_WEB_SPRAY_1), false);\n+                    SetSpellCooldown(VENOM_WEB_SPRAY_1, 28000);\n+                    return;\n+                }\n+            }\n+            else if (myType == BOT_PET_SPIDER)\n+            {\n+                if (IsSpellReady(WEB_1, diff, false)/* && focus >= 0*/ && dist < 30 && !CCed(opponent, true))\n+                {\n+                    me->CastSpell(opponent, GetSpell(WEB_1), false);\n+                    SetSpellCooldown(WEB_1, 28000);\n+                    return;\n+                }\n+            }\n+            else if (myType == BOT_PET_SPOREBAT)\n+            {\n+                if (IsSpellReady(SPORE_CLOUD_1, diff, false) && canDPS && focus >= 20 && dist < 5)\n+                {\n+                    me->CastSpell(opponent, GetSpell(SPORE_CLOUD_1), false);\n+                    SetSpellCooldown(SPORE_CLOUD_1, 7000);\n+                    return;\n+                }\n+            }\n+            else if (myType == BOT_PET_WINDSERPENT)\n+            {\n+                if (IsSpellReady(LIGHTNING_BREATH_1, diff, false) && canDPS && focus >= 20 && dist < 20)\n+                {\n+                    me->CastSpell(opponent, GetSpell(LIGHTNING_BREATH_1), false);\n+                    SetSpellCooldown(LIGHTNING_BREATH_1, 7000);\n+                    return;\n+                }\n+            }\n+            else if (myType == BOT_PET_CARRIONBIRD)\n+            {\n+                if (IsSpellReady(DEMORALIZING_SCREECH_1, diff, false) && canDPS && focus >= 20 &&\n+                    me->IsWithinMeleeRange(opponent))\n+                {\n+                    me->CastSpell(opponent, GetSpell(DEMORALIZING_SCREECH_1), false);\n+                    SetSpellCooldown(DEMORALIZING_SCREECH_1, 7000);\n+                    return;\n+                }\n+            }\n+            else if (myType == BOT_PET_CAT)\n+            {\n+                if (IsSpellReady(PROWL_1, diff, false) && !me->IsInCombat() && !me->HasStealthAura() &&\n+                    /*focus >= 0 && */dist < 20 && dist > 5)\n+                {\n+                    me->CastSpell(opponent, GetSpell(PROWL_1), false);\n+                    SetSpellCooldown(PROWL_1, 7000);\n+                    return;\n+                }\n+            }\n+            else if (myType == BOT_PET_COREHOUND)\n+            {\n+                if (IsSpellReady(LAVA_BREATH_1, diff, false) && canDPS && focus >= 20 && dist < 30)\n+                {\n+                    me->CastSpell(opponent, GetSpell(LAVA_BREATH_1), false);\n+                    SetSpellCooldown(LAVA_BREATH_1, 7000);\n+                    return;\n+                }\n+            }\n+            else if (myType == BOT_PET_DEVILSAUR)\n+            {\n+                if (IsSpellReady(MONSTROUS_BITE_1, diff, false) && canDPS && focus >= 20 &&\n+                    me->IsWithinMeleeRange(opponent))\n+                {\n+                    me->CastSpell(opponent, GetSpell(MONSTROUS_BITE_1), false);\n+                    SetSpellCooldown(MONSTROUS_BITE_1, 7000);\n+                    return;\n+                }\n+            }\n+            else if (myType == BOT_PET_HYENA)\n+            {\n+                if (IsSpellReady(TENDON_RIP_1, diff, false) && canDPS && focus >= 20 &&\n+                    me->IsWithinMeleeRange(opponent))\n+                {\n+                    me->CastSpell(opponent, GetSpell(TENDON_RIP_1), false);\n+                    SetSpellCooldown(TENDON_RIP_1, 14000);\n+                    return;\n+                }\n+            }\n+            else if (myType == BOT_PET_TEROMOTH)\n+            {\n+                if (IsSpellReady(SERENITY_DUST_1, diff, false) && (canDPS || GetHealthPCT(me) < 90) &&\n+                    /*focus >= 0 && */dist < 7)\n+                {\n+                    me->CastSpell(me, GetSpell(SERENITY_DUST_1), false);\n+                    SetSpellCooldown(SERENITY_DUST_1, 42000);\n+                    return;\n+                }\n+            }\n+            else if (myType == BOT_PET_RAPTOR)\n+            {\n+                if (IsSpellReady(SAVAGE_REND_1, diff, false) && canDPS && focus >= 20 &&\n+                    me->IsWithinMeleeRange(opponent))\n+                {\n+                    me->CastSpell(opponent, GetSpell(SAVAGE_REND_1), false);\n+                    SetSpellCooldown(SAVAGE_REND_1, 42000);\n+                    return;\n+                }\n+            }\n+            else if (myType == BOT_PET_SPIRITBEAST)\n+            {\n+                if (IsSpellReady(PROWL_1, diff, false) && !me->IsInCombat() && !me->HasStealthAura() &&\n+                    /*focus >= 0 && */dist < 30 && dist > 5)\n+                {\n+                    me->CastSpell(opponent, GetSpell(PROWL_1), false);\n+                    SetSpellCooldown(PROWL_1, 10000); //custom\n+                    return;\n+                }\n+                if (IsSpellReady(SPIRIT_STRIKE_1, diff, false) && canDPS && !me->HasStealthAura() &&\n+                    focus >= 20 && dist < 30)\n+                {\n+                    me->CastSpell(opponent, GetSpell(SPIRIT_STRIKE_1), false);\n+                    SetSpellCooldown(SPIRIT_STRIKE_1, 7000);\n+                    return;\n+                }\n+            }\n+            else if (myType == BOT_PET_TALLSTRIDER)\n+            {\n+                if (IsSpellReady(DUST_CLOUD_1, diff, false) && focus >= 20 && me->IsWithinMeleeRange(opponent))\n+                {\n+                    me->CastSpell(opponent, GetSpell(DUST_CLOUD_1), false);\n+                    SetSpellCooldown(DUST_CLOUD_1, 28000);\n+                    return;\n+                }\n+            }\n+            else if (myType == BOT_PET_WASP)\n+            {\n+                if (IsSpellReady(STING_1, diff, false) && canDPS && focus >= 20 &&\n+                    me->IsWithinMeleeRange(opponent))\n+                {\n+                    me->CastSpell(opponent, GetSpell(STING_1), false);\n+                    SetSpellCooldown(STING_1, 4000);\n+                    return;\n+                }\n+            }\n+            else if (myType == BOT_PET_WOLF)\n+            {\n+                if (IsSpellReady(FURIOUS_HOWL_1, diff, false) && canDPS && focus >= 20)\n+                {\n+                    me->CastSpell(me, GetSpell(FURIOUS_HOWL_1), false);\n+                    SetSpellCooldown(FURIOUS_HOWL_1, 28000);\n+                    return;\n+                }\n+            }\n+            else if (myType == BOT_PET_BEAR)\n+            {\n+                if (IsSpellReady(SWIPE_1, diff, false) && canDPS && focus >= 20 &&\n+                    me->IsWithinMeleeRange(opponent))\n+                {\n+                    me->CastSpell(opponent, GetSpell(SWIPE_1), false);\n+                    SetSpellCooldown(SWIPE_1, 3500);\n+                    return;\n+                }\n+            }\n+            else if (myType == BOT_PET_BOAR)\n+            {\n+                if (IsSpellReady(GORE_1, diff, false) && canDPS && focus >= 20 &&\n+                    me->IsWithinMeleeRange(opponent))\n+                {\n+                    me->CastSpell(opponent, GetSpell(GORE_1), false);\n+                    SetSpellCooldown(GORE_1, 7000);\n+                    return;\n+                }\n+            }\n+            else if (myType == BOT_PET_CRAB)\n+            {\n+                if (IsSpellReady(PIN_1, diff, false) && canDPS/* && focus >= 0*/ &&\n+                    me->IsWithinMeleeRange(opponent) && !CCed(opponent, true))\n+                {\n+                    me->CastSpell(opponent, GetSpell(PIN_1), false);\n+                    SetSpellCooldown(PIN_1, 28000);\n+                    return;\n+                }\n+            }\n+            else if (myType == BOT_PET_GORILLA)\n+            {\n+                if (IsSpellReady(PUMMEL_1, diff, false) && focus >= 20 && me->IsWithinMeleeRange(opponent) &&\n+                    opponent->IsNonMeleeSpellCast(false,false,true))\n+                {\n+                    me->CastSpell(opponent, GetSpell(PUMMEL_1), false);\n+                    SetSpellCooldown(PUMMEL_1, 21000);\n+                    return;\n+                }\n+            }\n+            else if (myType == BOT_PET_RHINO)\n+            {\n+                if (IsSpellReady(STAMPEDE_1, diff, false) && canDPS/* && focus >= 0*/ &&\n+                    me->IsWithinMeleeRange(opponent))\n+                {\n+                    me->CastSpell(opponent, GetSpell(STAMPEDE_1), false);\n+                    SetSpellCooldown(STAMPEDE_1, 42000);\n+                    return;\n+                }\n+            }\n+            else if (myType == BOT_PET_SCORPID)\n+            {\n+                if (IsSpellReady(SCORPID_POISON_1, diff, false) && canDPS && focus >= 20 &&\n+                    me->IsWithinMeleeRange(opponent))\n+                {\n+                    me->CastSpell(opponent, GetSpell(SCORPID_POISON_1), false);\n+                    SetSpellCooldown(SCORPID_POISON_1, 7000);\n+                    return;\n+                }\n+            }\n+            else if (myType == BOT_PET_TURTLE)\n+            {\n+                if (IsSpellReady(SHELL_SHIELD_1, diff, false)/* && focus >= 0*/ && dist < 7 &&\n+                    !me->getAttackers().empty())\n+                {\n+                    me->CastSpell(me, GetSpell(SHELL_SHIELD_1), false);\n+                    SetSpellCooldown(SHELL_SHIELD_1, 42000);\n+                    return;\n+                }\n+            }\n+            else if (myType == BOT_PET_WARPSTALKER)\n+            {\n+                if (IsSpellReady(WARP_1, diff, false)/* && focus >= 0*/ && dist < 10)\n+                {\n+                    me->CastSpell(opponent, GetSpell(WARP_1), false);\n+                    SetSpellCooldown(WARP_1, 10500);\n+                    return;\n+                }\n+            }\n+            else if (myType == BOT_PET_WORM)\n+            {\n+                if (IsSpellReady(ACID_SPIT_1, diff, false) && canDPS && focus >= 20 && dist < 30)\n+                {\n+                    me->CastSpell(opponent, GetSpell(ACID_SPIT_1), false);\n+                    SetSpellCooldown(ACID_SPIT_1, 7000);\n+                    return;\n+                }\n+            }\n+\n+            uint32 CHARGE = IsPetTypeSpell(SWOOP_1) ? SWOOP_1 : IsPetTypeSpell(CHARGE_1) ? CHARGE_1 : 0;\n+            if (CHARGE && GetSpell(CHARGE) && IsSpellReady(CHARGE, diff, false) && !CCed(opponent, true) && !me->HasStealthAura() &&\n+                !(opponent->IsCreature() && opponent->ToCreature()->isWorldBoss()) &&\n+                !HasBotCommandState(BOT_COMMAND_STAY) &&\n+                dist > 8 && dist < 25)\n+            {\n+                me->CastSpell(opponent, GetSpell(CHARGE), false);\n+                SetSpellCooldown(CHARGE, 17500);\n+                return;\n+            }\n+\n+            if (GetSpell(WOLVERINE_BITE_1) && canDPS && me->IsWithinMeleeRange(opponent))\n+            {\n+                me->CastSpell(opponent, GetSpell(WOLVERINE_BITE_1), false);\n+                SetSpellCooldown(WOLVERINE_BITE_1, 7000);\n+                return;\n+            }\n+\n+            uint32 ATTACK_1 = IsPetTypeSpell(BITE_1) ? BITE_1 : IsPetTypeSpell(CLAW_1) ? CLAW_1 : SMACK_1;\n+            if (GetSpell(ATTACK_1) && IsSpellReady(ATTACK_1, diff) && canDPS && focus >= 25 && me->IsWithinMeleeRange(opponent))\n+            {\n+                me->CastSpell(opponent, GetSpell(ATTACK_1), false);\n+                return;\n+            }\n+        }\n+\n+        void OnPetClassSpellGo(SpellInfo const* /*spellInfo*/) override\n+        {\n+        }\n+\n+        void SpellHit(WorldObject* wcaster, SpellInfo const* spell) override\n+        {\n+            Unit* caster = wcaster->ToUnit();\n+            if (!caster)\n+                return;\n+\n+            OnSpellHit(caster, spell);\n+        }\n+\n+        void SpellHitTarget(WorldObject* /*wtarget*/, SpellInfo const* /*spell*/) override\n+        {\n+        }\n+\n+        void DamageDealt(Unit* victim, uint32& damage, DamageEffectType damageType) override\n+        {\n+            bot_pet_ai::DamageDealt(victim, damage, damageType);\n+        }\n+\n+        void DamageTaken(Unit* u, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo*/) override\n+        {\n+            if (!u)\n+                return;\n+            if (!u->IsInCombat() && !me->IsInCombat())\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void OwnerAttackedBy(Unit* u) override\n+        {\n+            if (!u)\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void Reset() override\n+        {\n+        }\n+\n+        void InitPetSpells() override\n+        {\n+            uint8 lvl = me->GetLevel();\n+            bool isBeas = Spec() == BOT_SPEC_HUNTER_BEASTMASTERY;\n+\n+            InitSpellMap(GROWL_1);\n+            InitSpellMap(COWER_1);\n+\n+            InitSpellMap(BITE_1);\n+            InitSpellMap(CLAW_1);\n+            InitSpellMap(SMACK_1);\n+\n+            //talents\n+  /*Talent*/IsPetTypeSpell(SWOOP_1) ? InitSpellMap(SWOOP_1, true) : RemoveSpell(SWOOP_1);\n+  /*Talent*/IsPetTypeSpell(CHARGE_1) ? InitSpellMap(CHARGE_1, true) : RemoveSpell(CHARGE_1);\n+  /*Talent*/IsPetTypeSpell(DASH_1) ? InitSpellMap(DASH_1, true) : RemoveSpell(DASH_1);\n+  /*Talent*/IsPetTypeSpell(DIVE_1) ? InitSpellMap(DIVE_1, true) : RemoveSpell(DIVE_1);\n+            //talents cunning\n+  /*Talent*/lvl >= 44 ? InitSpellMap(CARRION_FEEDER_1, true) : RemoveSpell(CARRION_FEEDER_1);\n+  /*Talent*/lvl >= 68 ? InitSpellMap(WOLVERINE_BITE_1, true) : RemoveSpell(WOLVERINE_BITE_1);\n+  /*Talent*/lvl >= 68 ? InitSpellMap(ROAR_OF_RECOVERY_1, true) : RemoveSpell(ROAR_OF_RECOVERY_1);\n+  /*Talent*/lvl >= 68 ? InitSpellMap(BULLHEADED_1, true) : RemoveSpell(BULLHEADED_1);\n+            //talents ferocity\n+  ///*Talent*/lvl >= 68 ? InitSpellMap(HEART_OF_THE_PHOENIX_1, true) : RemoveSpell(HEART_OF_THE_PHOENIX_1);\n+  /*Talent*/lvl >= 68 ? InitSpellMap(RABID_1, true) : RemoveSpell(RABID_1);\n+  /*Talent*/lvl >= 68 ? InitSpellMap(LICK_YOUR_WOUNDS_1, true) : RemoveSpell(LICK_YOUR_WOUNDS_1);\n+  /*Talent*/lvl >= 68 ? InitSpellMap(CALL_OF_THE_WILD_1, true) : RemoveSpell(CALL_OF_THE_WILD_1);\n+            //talents tenacity\n+  /*Talent*/lvl >= 44 ? InitSpellMap(THUNDERSTOMP_1, true) : RemoveSpell(THUNDERSTOMP_1);\n+  /*Talent*/lvl >= 68 ? InitSpellMap(LAST_STAND_1, true) : RemoveSpell(LAST_STAND_1);\n+  /*Talent*/lvl >= 68 ? InitSpellMap(TAUNT_1, true) : RemoveSpell(TAUNT_1);\n+  /*Talent*/lvl >= 68 ? InitSpellMap(ROAR_OF_SACRIFICE_1, true) : RemoveSpell(ROAR_OF_SACRIFICE_1);\n+  /*Talent*/lvl >= 68 ? InitSpellMap(INTERVENE_1, true) : RemoveSpell(INTERVENE_1);\n+            //pet-specific\n+            InitSpellMap(SONIC_BLAST_1);\n+            InitSpellMap(SNATCH_1);\n+            InitSpellMap(FROSTSTORM_BREATH_1);\n+            InitSpellMap(FIRE_BREATH_1);\n+            InitSpellMap(NETHER_SHOCK_1);\n+            InitSpellMap(RAVAGE_1);\n+            InitSpellMap(POISON_SPIT_1);\n+            InitSpellMap(VENOM_WEB_SPRAY_1);\n+            InitSpellMap(WEB_1);\n+            InitSpellMap(SPORE_CLOUD_1);\n+            InitSpellMap(LIGHTNING_BREATH_1);\n+            InitSpellMap(DEMORALIZING_SCREECH_1);\n+            InitSpellMap(PROWL_1);\n+            InitSpellMap(LAVA_BREATH_1);\n+            InitSpellMap(MONSTROUS_BITE_1);\n+            InitSpellMap(TENDON_RIP_1);\n+            InitSpellMap(SERENITY_DUST_1);\n+            InitSpellMap(SAVAGE_REND_1);\n+            InitSpellMap(SPIRIT_STRIKE_1);\n+            InitSpellMap(DUST_CLOUD_1);\n+            InitSpellMap(STING_1);\n+            InitSpellMap(FURIOUS_HOWL_1);\n+            InitSpellMap(SWIPE_1);\n+            InitSpellMap(GORE_1);\n+            InitSpellMap(PIN_1);\n+            InitSpellMap(PUMMEL_1);\n+            InitSpellMap(STAMPEDE_1);\n+            InitSpellMap(SCORPID_POISON_1);\n+            InitSpellMap(SHELL_SHIELD_1);\n+            InitSpellMap(WARP_1);\n+            InitSpellMap(ACID_SPIT_1);\n+\n+  /*Talent*/lvl >= 30 && isBeas ? InitSpellMap(SPIRIT_BOND_PET, true) : RemoveSpell(SPIRIT_BOND_PET);\n+  /*Talent*/lvl >= 55 && isBeas ? InitSpellMap(KINDRED_SPIRITS_PET, true) : RemoveSpell(KINDRED_SPIRITS_PET);\n+  /*Talent*/lvl >= 30 && isBeas ? InitSpellMap(INTIMIDATION_1, true) : RemoveSpell(INTIMIDATION_1);\n+  /*Talent*/lvl >= 40 && isBeas ? InitSpellMap(BESTIAL_WRATH_1, true) : RemoveSpell(BESTIAL_WRATH_1);\n+  /*Talent*/lvl >= 50 && isBeas ? InitSpellMap(BEAST_WITHIN_1, true) : RemoveSpell(BEAST_WITHIN_1);\n+        }\n+\n+        void ApplyPetPassives() const override\n+        {\n+            uint8 lvl = me->GetLevel();\n+\n+            RefreshAura(AVOIDANCE, lvl >= 60);\n+            //ignore pet type\n+            RefreshAura(COBRA_REFLEXES, lvl >= 20);\n+            RefreshAura(BLOOD_OF_THE_RHINO, lvl >= 32);\n+            RefreshAura(OWLS_FOCUS, lvl >= 32);\n+            RefreshAura(CULLING_THE_HERD, lvl >= 32);\n+            RefreshAura(GRACE_OF_THE_MANTIS, lvl >= 44);\n+            RefreshAura(CORNERED, lvl >= 44);\n+            RefreshAura(FEEDING_FRENZY, lvl >= 44);\n+            RefreshAura(SILVERBACK, lvl >= 80);\n+\n+            RefreshAura(HASTE_DODGE_PASSIVE, lvl >= 45);\n+        }\n+\n+    private:\n+        bool IsPetTypeSpell(uint32 basespell) const\n+        {\n+            switch (basespell)\n+            {\n+                case BITE_1: //lvl 1\n+                    switch (myType)\n+                    {\n+                        case BOT_PET_BAT:\n+                        case BOT_PET_BOAR:\n+                        case BOT_PET_CARRIONBIRD:\n+                        case BOT_PET_CROCOLISK:\n+                        case BOT_PET_DRAGONHAWK:\n+                        case BOT_PET_HYENA:\n+                        case BOT_PET_NETHERRAY:\n+                        case BOT_PET_RAVAGER:\n+                        case BOT_PET_SERPENT:\n+                        case BOT_PET_WOLF:\n+\n+                        case BOT_PET_CHIMAERA:\n+                        case BOT_PET_COREHOUND:\n+                        case BOT_PET_DEVILSAUR:\n+                        case BOT_PET_WORM:\n+                            return true;\n+                        default:\n+                            return false;\n+                    }\n+                case CLAW_1: //lvl 1\n+                    switch (myType)\n+                    {\n+                        case BOT_PET_BEAR:\n+                        case BOT_PET_BIRDOFPREY:\n+                        case BOT_PET_CAT:\n+                        case BOT_PET_CRAB:\n+                        case BOT_PET_RAPTOR:\n+                        case BOT_PET_SCORPID:\n+                        case BOT_PET_TALLSTRIDER:\n+\n+                        case BOT_PET_SILITHID:\n+                        case BOT_PET_SPIRITBEAST:\n+                            return true;\n+                        default:\n+                            return false;\n+                    }\n+                case SMACK_1: //lvl 1\n+                    switch (myType)\n+                    {\n+                        case BOT_PET_GORILLA:\n+                        case BOT_PET_SPOREBAT:\n+                        case BOT_PET_TEROMOTH:\n+                        case BOT_PET_WASP:\n+\n+                        case BOT_PET_RHINO:\n+                            return true;\n+                        default:\n+                            return false;\n+                    }\n+                case SWOOP_1: //fliers ferocity lvl 44\n+                    switch (myType)\n+                    {\n+                        case BOT_PET_CARRIONBIRD:\n+                        case BOT_PET_WASP:\n+                        case BOT_PET_TEROMOTH:\n+                            return me->GetLevel() >= 44;\n+                        default:\n+                            return false;\n+                    }\n+                case CHARGE_1: //non-fliers tenacity/ferocity lvl 20/44\n+                    switch (myType)\n+                    {\n+                        case BOT_PET_BEAR:\n+                        case BOT_PET_BOAR:\n+                        case BOT_PET_CAT:\n+                        case BOT_PET_CRAB:\n+                        case BOT_PET_CROCOLISK:\n+                        case BOT_PET_GORILLA:\n+                        case BOT_PET_HYENA:\n+                        case BOT_PET_RAPTOR:\n+                        case BOT_PET_SCORPID:\n+                        case BOT_PET_TALLSTRIDER:\n+                        case BOT_PET_TURTLE:\n+                        case BOT_PET_WARPSTALKER:\n+                        case BOT_PET_WOLF:\n+\n+                        case BOT_PET_COREHOUND:\n+                        case BOT_PET_DEVILSAUR:\n+                        case BOT_PET_RHINO:\n+                        case BOT_PET_SPIRITBEAST:\n+                        case BOT_PET_WORM:\n+                            return me->GetLevel() >= (IsPetCategory(PET_CATEGORY_FEROCITY) ? 44 : 20);\n+                        default:\n+                            return false;\n+                    }\n+                case DASH_1: //non-fliers ferocity/cunning lvl 20/44\n+                    switch (myType)\n+                    {\n+                        case BOT_PET_CAT:\n+                        case BOT_PET_HYENA:\n+                        case BOT_PET_RAPTOR:\n+                        case BOT_PET_RAVAGER:\n+                        case BOT_PET_SERPENT:\n+                        case BOT_PET_SPIDER:\n+                        case BOT_PET_TALLSTRIDER:\n+                        case BOT_PET_WARPSTALKER:\n+                        case BOT_PET_WOLF:\n+\n+                        case BOT_PET_COREHOUND:\n+                        case BOT_PET_DEVILSAUR:\n+                        case BOT_PET_SILITHID:\n+                        case BOT_PET_SPIRITBEAST:\n+                            return me->GetLevel() >= (IsPetCategory(PET_CATEGORY_CUNNING) ? 44 : 20);\n+                        default:\n+                            return false;\n+                    }\n+                case DIVE_1: //fliers lvl 20\n+                    switch (myType)\n+                    {\n+                        case BOT_PET_BAT:\n+                        case BOT_PET_BIRDOFPREY:\n+                        case BOT_PET_CARRIONBIRD:\n+                        case BOT_PET_DRAGONHAWK:\n+                        case BOT_PET_TEROMOTH:\n+                        case BOT_PET_NETHERRAY:\n+                        case BOT_PET_SPOREBAT:\n+                        case BOT_PET_WASP:\n+                        case BOT_PET_WINDSERPENT:\n+\n+                        case BOT_PET_CHIMAERA:\n+                            return me->GetLevel() >= 20;\n+                        default:\n+                            return false;\n+                    }\n+                default:\n+                    return true;\n+            }\n+        }\n+\n+        bool IsPetCategory(uint8 category) const\n+        {\n+            switch (myType)\n+            {\n+                case BOT_PET_SPIDER:\n+                case BOT_PET_SERPENT:\n+                case BOT_PET_BIRDOFPREY:\n+                case BOT_PET_BAT:\n+                case BOT_PET_WINDSERPENT:\n+                case BOT_PET_RAVAGER:\n+                case BOT_PET_DRAGONHAWK:\n+                case BOT_PET_NETHERRAY:\n+                case BOT_PET_SPOREBAT:\n+\n+                case BOT_PET_SILITHID:\n+                case BOT_PET_CHIMAERA:\n+                    return category == PET_CATEGORY_CUNNING;\n+                case BOT_PET_CARRIONBIRD:\n+                case BOT_PET_RAPTOR:\n+                case BOT_PET_WOLF:\n+                case BOT_PET_TALLSTRIDER:\n+                case BOT_PET_CAT:\n+                case BOT_PET_HYENA:\n+                case BOT_PET_WASP:\n+                case BOT_PET_TEROMOTH:\n+\n+                case BOT_PET_SPIRITBEAST:\n+                case BOT_PET_COREHOUND:\n+                case BOT_PET_DEVILSAUR:\n+                    return category == PET_CATEGORY_FEROCITY;\n+                case BOT_PET_SCORPID:\n+                case BOT_PET_TURTLE:\n+                case BOT_PET_GORILLA:\n+                case BOT_PET_BEAR:\n+                case BOT_PET_BOAR:\n+                case BOT_PET_CRAB:\n+                case BOT_PET_CROCOLISK:\n+                case BOT_PET_WARPSTALKER:\n+\n+                case BOT_PET_RHINO:\n+                case BOT_PET_WORM:\n+                    return category == PET_CATEGORY_TENACITY;\n+                default:\n+                    return false;\n+            }\n+        }\n+    };\n+};\n+\n+void AddSC_hunter_bot_pets()\n+{\n+    new hunter_pet_bot();\n+}\ndiff --git a/src/server/game/AI/NpcBots/bpet_mage.cpp b/src/server/game/AI/NpcBots/bpet_mage.cpp\nnew file mode 100644\nindex 0000000000..6cd40a8a1e\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bpet_mage.cpp\n@@ -0,0 +1,177 @@\n+#include \"bot_ai.h\"\n+#include \"bpet_ai.h\"\n+#include \"ObjectAccessor.h\"\n+#include \"ScriptMgr.h\"\n+#include \"Spell.h\"\n+#include \"SpellInfo.h\"\n+#include \"TemporarySummon.h\"\n+/*\n+Mage NpcBot Pets (by Trickerer onlysuffering@gmail.com)\n+Complete - 100%\n+TODO:\n+*/\n+\n+enum MagePetBaseSpells\n+{\n+    WATERBOLT_1             = 31707,\n+    FREEZE_1                = 33395\n+};\n+\n+enum MagePetSpecial\n+{\n+    ELEMENTAL_DURATION      = 45000\n+};\n+\n+class mage_pet_bot : public CreatureScript\n+{\n+public:\n+    mage_pet_bot() : CreatureScript(\"mage_pet_bot\") { }\n+\n+    CreatureAI* GetAI(Creature* creature) const override\n+    {\n+        return new water_elemental_botpetAI(creature);\n+    }\n+\n+    struct water_elemental_botpetAI : public bot_pet_ai\n+    {\n+        water_elemental_botpetAI(Creature* creature) : bot_pet_ai(creature) { }\n+\n+        void JustEnteredCombat(Unit* u) override { bot_pet_ai::JustEnteredCombat(u); }\n+        void KilledUnit(Unit* u) override { bot_pet_ai::KilledUnit(u); }\n+        void EnterEvadeMode(EvadeReason why = EVADE_REASON_OTHER) override { bot_pet_ai::EnterEvadeMode(why); }\n+        void MoveInLineOfSight(Unit* u) override { bot_pet_ai::MoveInLineOfSight(u); }\n+        void JustDied(Unit* u) override { bot_pet_ai::JustDied(u); }\n+        void DoNonCombatActions(uint32 /*diff*/) { }\n+\n+        void StartAttack(Unit* u, bool force = false)\n+        {\n+            if (!bot_pet_ai::StartAttack(u, force))\n+                return;\n+            GetInPosition(force, u);\n+        }\n+\n+        void DoPetActions(uint32 diff)\n+        {\n+            if (!petOwner->GetBotAI()->HasRole(BOT_ROLE_DPS))\n+                return;\n+\n+            if (!IsSpellReady(FREEZE_1, diff, false) || Rand() > 40 || !IsCasting(petOwner))\n+                return;\n+\n+            Spell const* spell = petOwner->GetCurrentSpell(CURRENT_GENERIC_SPELL);\n+            if (!spell || !spell->GetSpellInfo()->HasEffect(SPELL_EFFECT_SCHOOL_DAMAGE) ||\n+                !(spell->GetTimer() < spell->GetCastTime() / 2))\n+                return;\n+\n+            Unit* target = ObjectAccessor::GetUnit(*me, spell->m_targets.GetObjectTargetGUID());\n+            if (!target || target->IsFrozen() || target->GetDistance(me) - target->GetCombatReach() > 25.f ||\n+                !me->IsValidAttackTarget(target))\n+                return;\n+\n+            me->InterruptNonMeleeSpells(false);\n+            me->CastSpell(target, GetSpell(FREEZE_1), false);\n+            return;\n+        }\n+\n+        void UpdateAI(uint32 diff) override\n+        {\n+            if ((liveTimer += diff) >= ELEMENTAL_DURATION * (IAmFree() ? 80u : 1u))\n+            {\n+                canUpdate = false;\n+                me->ToTempSummon()->UnSummon(1);\n+                return;\n+            }\n+\n+            if (!GlobalUpdate(diff))\n+                return;\n+\n+            if (!me->IsInCombat())\n+                DoNonCombatActions(diff);\n+\n+            DoPetActions(diff);\n+\n+            if (!CheckAttackTarget())\n+                return;\n+\n+            if (IsCasting())\n+                return;\n+\n+            DoPetAttack(diff);\n+        }\n+\n+        void DoPetAttack(uint32 diff)\n+        {\n+            StartAttack(opponent, IsPetMelee());\n+\n+            if (!petOwner->GetBotAI()->HasRole(BOT_ROLE_DPS))\n+                return;\n+\n+            if (IsSpellReady(WATERBOLT_1, diff) && me->GetDistance(opponent) < 45)\n+            {\n+                me->CastSpell(opponent, GetSpell(WATERBOLT_1), false);\n+                return;\n+            }\n+        }\n+\n+        void OnPetClassSpellGo(SpellInfo const* /*spellInfo*/) override\n+        {\n+        }\n+\n+        void SpellHit(WorldObject* wcaster, SpellInfo const* spell) override\n+        {\n+            Unit* caster = wcaster->ToUnit();\n+            if (!caster)\n+                return;\n+\n+            OnSpellHit(caster, spell);\n+        }\n+\n+        void SpellHitTarget(WorldObject* /*wtarget*/, SpellInfo const* /*spell*/) override\n+        {\n+        }\n+\n+        void DamageDealt(Unit* victim, uint32& damage, DamageEffectType damageType) override\n+        {\n+            bot_pet_ai::DamageDealt(victim, damage, damageType);\n+        }\n+\n+        void DamageTaken(Unit* u, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo*/) override\n+        {\n+            if (!u)\n+                return;\n+            if (!u->IsInCombat() && !me->IsInCombat())\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void OwnerAttackedBy(Unit* u) override\n+        {\n+            if (!u)\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void Reset() override\n+        {\n+            liveTimer = 0;\n+        }\n+\n+        void InitPetSpells() override\n+        {\n+            InitSpellMap(WATERBOLT_1);\n+            InitSpellMap(FREEZE_1);\n+        }\n+\n+        void ApplyPetPassives() const override\n+        {\n+        }\n+\n+    private:\n+        uint32 liveTimer;\n+    };\n+};\n+\n+void AddSC_mage_bot_pets()\n+{\n+    new mage_pet_bot();\n+}\ndiff --git a/src/server/game/AI/NpcBots/bpet_necromancer.cpp b/src/server/game/AI/NpcBots/bpet_necromancer.cpp\nnew file mode 100644\nindex 0000000000..5786e5545b\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bpet_necromancer.cpp\n@@ -0,0 +1,199 @@\n+#include \"bot_ai.h\"\n+#include \"bpet_ai.h\"\n+#include \"Creature.h\"\n+#include \"Player.h\"\n+#include \"ScriptMgr.h\"\n+/*\n+Necromancer NpcBot Pets (by Trickerer onlysuffering@gmail.com)\n+Notes:\n+Extra abilities. For the sake of defending the owner added Taunt. For self defense added Blocking (block value unchanged)\n+Both abilities are one-time use\n+Complete - 100%\n+TODO:\n+*/\n+\n+enum NecromancerPetBaseSpells\n+{\n+    BLOCKING_1                          = 3248,\n+    TAUNT_1                             = 37548\n+};\n+enum NecromancerPetPassives\n+{\n+};\n+enum NecromancerPetSpecial\n+{\n+    THREAT_BASE                         = 5,\n+    MINION_DURATION                     = 65000\n+};\n+\n+class necromancer_pet_bot : public CreatureScript\n+{\n+public:\n+    necromancer_pet_bot() : CreatureScript(\"necromancer_pet_bot\") { }\n+\n+    CreatureAI* GetAI(Creature* creature) const override\n+    {\n+        return new necromancer_botpetAI(creature);\n+    }\n+\n+    struct necromancer_botpetAI : public bot_pet_ai\n+    {\n+        necromancer_botpetAI(Creature* creature) : bot_pet_ai(creature) { }\n+\n+        void JustEnteredCombat(Unit* u) override { bot_pet_ai::JustEnteredCombat(u); }\n+        void KilledUnit(Unit* u) override { bot_pet_ai::KilledUnit(u); }\n+        void EnterEvadeMode(EvadeReason why = EVADE_REASON_OTHER) override { bot_pet_ai::EnterEvadeMode(why); }\n+        void MoveInLineOfSight(Unit* u) override { bot_pet_ai::MoveInLineOfSight(u); }\n+        void JustDied(Unit* u) override { bot_pet_ai::JustDied(u); }\n+        void DoNonCombatActions(uint32 /*diff*/) { }\n+\n+        void StartAttack(Unit* u, bool force = false)\n+        {\n+            if (!bot_pet_ai::StartAttack(u, force))\n+                return;\n+            GetInPosition(force, u);\n+        }\n+\n+        void UpdateAI(uint32 diff) override\n+        {\n+            if ((liveTimer += diff) >= _getMaxDuration())\n+            {\n+                canUpdate = false;\n+                me->setDeathState(JUST_DIED);\n+                return;\n+            }\n+\n+            if (!GlobalUpdate(diff))\n+                return;\n+\n+            if (!me->IsInCombat())\n+                DoNonCombatActions(diff);\n+\n+            if (!CheckAttackTarget())\n+                return;\n+\n+            if (IsCasting())\n+                return;\n+\n+            DoPetAttack(diff);\n+        }\n+\n+        void DoPetAttack(uint32 diff)\n+        {\n+            StartAttack(opponent, IsPetMelee());\n+\n+            if (IsSpellReady(TAUNT_1, diff, false) && Rand() < 50 &&\n+                ((opponent->GetVictim() == petOwner && !IsTank(petOwner)) ||\n+                (opponent->GetVictim() == petOwner->GetBotOwner() && !IsTank(petOwner->GetBotOwner()))) &&\n+                !opponent->HasAuraType(SPELL_AURA_MOD_TAUNT) && me->IsWithinMeleeRange(opponent))\n+            {\n+                me->CastSpell(opponent, GetSpell(TAUNT_1), false);\n+                SetSpellCooldown(TAUNT_1, std::numeric_limits<uint32>::max());\n+                return;\n+            }\n+\n+            if (IsSpellReady(BLOCKING_1, diff) && !me->getAttackers().empty() && Rand() < 25)\n+            {\n+                me->CastSpell(me, GetSpell(BLOCKING_1), true);\n+                SetSpellCooldown(BLOCKING_1, std::numeric_limits<uint32>::max());\n+                return;\n+            }\n+        }\n+\n+        void OnPetClassSpellGo(SpellInfo const* /*spellInfo*/) override\n+        {\n+        }\n+\n+        void SpellHit(WorldObject* wcaster, SpellInfo const* spell) override\n+        {\n+            Unit* caster = wcaster->ToUnit();\n+            if (!caster)\n+                return;\n+\n+            OnSpellHit(caster, spell);\n+        }\n+\n+        void SpellHitTarget(WorldObject* /*wtarget*/, SpellInfo const* /*spell*/) override\n+        {\n+        }\n+\n+        void DamageDealt(Unit* victim, uint32& damage, DamageEffectType damageType) override\n+        {\n+            bot_pet_ai::DamageDealt(victim, damage, damageType);\n+        }\n+\n+        void DamageTaken(Unit* u, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo*/) override\n+        {\n+            if (!u)\n+                return;\n+            if (!u->IsInCombat() && !me->IsInCombat())\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void OwnerAttackedBy(Unit* u) override\n+        {\n+            if (!u)\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        uint32 GetData(uint32 data) const override\n+        {\n+            switch (data)\n+            {\n+                case BOTPETAI_MISC_DURATION:\n+                    return liveTimer;\n+                case BOTPETAI_MISC_DURATION_MAX:\n+                    return _getMaxDuration();\n+                case BOTPETAI_MISC_MAXLEVEL:\n+                    return maxlevel;\n+                default:\n+                    return bot_pet_ai::GetData(data);\n+            }\n+        }\n+\n+        void SetData(uint32 data, uint32 value) override\n+        {\n+            switch (data)\n+            {\n+                case BOTPETAI_MISC_MAXLEVEL:\n+                    maxlevel = uint8(value);\n+                    SetPetStats(true);\n+                    break;\n+                default:\n+                    break;\n+            }\n+        }\n+\n+        void Reset() override\n+        {\n+            liveTimer = 0;\n+            maxlevel = 1;\n+        }\n+\n+        void InitPetSpells() override\n+        {\n+            InitSpellMap(TAUNT_1, true, false);\n+            InitSpellMap(BLOCKING_1, true, false);\n+        }\n+\n+        void ApplyPetPassives() const override\n+        {\n+        }\n+\n+    private:\n+        uint32 _getMaxDuration() const\n+        {\n+            return MINION_DURATION * (IAmFree() ? 5u : 1u);\n+        }\n+\n+        uint32 liveTimer;\n+        uint8 maxlevel;\n+    };\n+};\n+\n+void AddSC_necromancer_bot_pets()\n+{\n+    new necromancer_pet_bot();\n+}\ndiff --git a/src/server/game/AI/NpcBots/bpet_priest.cpp b/src/server/game/AI/NpcBots/bpet_priest.cpp\nnew file mode 100644\nindex 0000000000..5963320f7a\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bpet_priest.cpp\n@@ -0,0 +1,172 @@\n+#include \"bot_ai.h\"\n+#include \"bpet_ai.h\"\n+#include \"ScriptMgr.h\"\n+#include \"TemporarySummon.h\"\n+/*\n+Priest NpcBot Pets (by Trickerer onlysuffering@gmail.com)\n+Complete - 100%\n+TODO:\n+*/\n+\n+enum PriestPetBaseSpells\n+{\n+    SHADOWCRAWL_1                       = 63619\n+};\n+\n+enum PriestPetPassives\n+{\n+    MANA_LEECH                          = 28305,\n+    AVOIDANCE                           = 63623\n+};\n+\n+enum PriestPetSpecial\n+{\n+    GLYPH_SHADOWFIEND_PROC              = 58227,\n+\n+    SHADOWFIEND_DURATION                = 15000\n+};\n+\n+class priest_pet_bot : public CreatureScript\n+{\n+public:\n+    priest_pet_bot() : CreatureScript(\"priest_pet_bot\") { }\n+\n+    CreatureAI* GetAI(Creature* creature) const override\n+    {\n+        return new priest_botpetAI(creature);\n+    }\n+\n+    struct priest_botpetAI : public bot_pet_ai\n+    {\n+        priest_botpetAI(Creature* creature) : bot_pet_ai(creature) { }\n+\n+        void JustEnteredCombat(Unit* u) override { bot_pet_ai::JustEnteredCombat(u); }\n+        void KilledUnit(Unit* u) override { bot_pet_ai::KilledUnit(u); }\n+        void EnterEvadeMode(EvadeReason why = EVADE_REASON_OTHER) override { bot_pet_ai::EnterEvadeMode(why); }\n+        void MoveInLineOfSight(Unit* u) override { bot_pet_ai::MoveInLineOfSight(u); }\n+        void JustDied(Unit* u) override { bot_pet_ai::JustDied(u); }\n+        void DoNonCombatActions(uint32 /*diff*/) { }\n+\n+        void StartAttack(Unit* u, bool force = false)\n+        {\n+            if (!bot_pet_ai::StartAttack(u, force))\n+                return;\n+            GetInPosition(force, u);\n+        }\n+\n+        void DoPetActions(uint32 /*diff*/)\n+        {\n+        }\n+\n+        void UpdateAI(uint32 diff) override\n+        {\n+            if ((liveTimer += diff) >= SHADOWFIEND_DURATION)\n+            {\n+                canUpdate = false;\n+                me->ToTempSummon()->UnSummon(1);\n+                return;\n+            }\n+\n+            if (!GlobalUpdate(diff))\n+                return;\n+\n+            if (!me->IsInCombat())\n+                DoNonCombatActions(diff);\n+\n+            DoPetActions(diff);\n+            //CheckDrainMana(diff);\n+\n+            if (!CheckAttackTarget())\n+                return;\n+\n+            if (IsCasting())\n+                return;\n+\n+            DoPetAttack(diff);\n+        }\n+\n+        void DoPetAttack(uint32 diff)\n+        {\n+            StartAttack(opponent, IsPetMelee());\n+\n+            float dist = me->GetDistance(opponent);\n+            bool canDPS = petOwner->GetBotAI()->HasRole(BOT_ROLE_DPS);\n+\n+            if (IsSpellReady(SHADOWCRAWL_1, diff) && canDPS && dist < 30)\n+            {\n+                me->CastSpell(opponent, GetSpell(SHADOWCRAWL_1), false);\n+                SetSpellCooldown(SHADOWCRAWL_1, 6000);\n+                return;\n+            }\n+        }\n+\n+        void OnPetClassSpellGo(SpellInfo const* /*spellInfo*/) override\n+        {\n+        }\n+\n+        void SpellHit(WorldObject* wcaster, SpellInfo const* spell) override\n+        {\n+            Unit* caster = wcaster->ToUnit();\n+            if (!caster)\n+                return;\n+\n+            OnSpellHit(caster, spell);\n+        }\n+\n+        void SpellHitTarget(WorldObject* /*wtarget*/, SpellInfo const* /*spell*/) override\n+        {\n+        }\n+\n+        void DamageDealt(Unit* victim, uint32& damage, DamageEffectType damageType) override\n+        {\n+            //Handled by spell scripts\n+            //if (damage && victim && damageType == DIRECT_DAMAGE)\n+            //    victim->CastSpell(petOwner, MANA_LEECH_PROC, true);\n+\n+            bot_pet_ai::DamageDealt(victim, damage, damageType);\n+        }\n+\n+        void DamageTaken(Unit* u, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo*/) override\n+        {\n+            if (damage >= me->GetHealth())\n+                petOwner->CastSpell(petOwner, GLYPH_SHADOWFIEND_PROC, true);\n+\n+            if (!u)\n+                return;\n+            if (!u->IsInCombat() && !me->IsInCombat())\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void OwnerAttackedBy(Unit* u) override\n+        {\n+            if (!u)\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void Reset() override\n+        {\n+            liveTimer = 0;\n+        }\n+\n+        void InitPetSpells() override\n+        {\n+            InitSpellMap(SHADOWCRAWL_1);\n+        }\n+\n+        void ApplyPetPassives() const override\n+        {\n+            RefreshAura(MANA_LEECH);\n+            RefreshAura(AVOIDANCE);\n+        }\n+\n+    private:\n+        uint32 liveTimer;\n+    };\n+};\n+\n+void AddSC_priest_bot_pets()\n+{\n+    new priest_pet_bot();\n+}\ndiff --git a/src/server/game/AI/NpcBots/bpet_sea_witch.cpp b/src/server/game/AI/NpcBots/bpet_sea_witch.cpp\nnew file mode 100644\nindex 0000000000..003a393708\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bpet_sea_witch.cpp\n@@ -0,0 +1,251 @@\n+#include \"bot_ai.h\"\n+#include \"botspell.h\"\n+#include \"bpet_ai.h\"\n+#include \"Containers.h\"\n+#include \"MotionMaster.h\"\n+#include \"ScriptMgr.h\"\n+#include \"SpellAuras.h\"\n+#include \"SpellAuraEffects.h\"\n+#include \"TemporarySummon.h\"\n+/*\n+Sea Witch NpcBot Pets (by Trickerer onlysuffering@gmail.com)\n+Complete - 100%\n+TODO:\n+*/\n+\n+enum SeaWitchPetBaseSpells\n+{\n+    ENVELOP_1                   = SPELL_TORNADO_EFFECT,\n+    LIGHTNING_1                 = SPELL_TORNADO_EFFECT2,\n+};\n+\n+enum SeaWitchPetSpecial\n+{\n+    TORNADO_DURATION            = 40000,\n+    TORNADO_MOVE_RESET_TIMER    = 1500,\n+    TORNADO_GROWTH_TIMER        = 2500,\n+    TORNADO_DISSIPATE_TIMER     = 5000,\n+\n+    PERIODIC_LIGHTNING_VISUAL   = 45869,\n+    CAMERA_SHAKE_VISUAL         = 12816,\n+    TARGET_LIGHTNING_VISUAL     = 39381,\n+    TARGET_LIGHTNING_VISUAL2    = 45935,\n+    SPELL_GROWTH                = 55948,//+10% size, +10% damage\n+    SPELL_SLOW_AURA             = SPELL_TORNADO_EFFECT3\n+};\n+\n+class sea_witch_pet_bot : public CreatureScript\n+{\n+public:\n+    sea_witch_pet_bot() : CreatureScript(\"sea_witch_pet_bot\") { }\n+\n+    CreatureAI* GetAI(Creature* creature) const override\n+    {\n+        return new tornado_botpetAI(creature);\n+    }\n+\n+    struct tornado_botpetAI : public bot_pet_ai\n+    {\n+        tornado_botpetAI(Creature* creature) : bot_pet_ai(creature) { }\n+\n+        void JustEnteredCombat(Unit* u) override { bot_pet_ai::JustEnteredCombat(u); }\n+        void KilledUnit(Unit* u) override { bot_pet_ai::KilledUnit(u); }\n+        void EnterEvadeMode(EvadeReason why = EVADE_REASON_OTHER) override { bot_pet_ai::EnterEvadeMode(why); }\n+        void MoveInLineOfSight(Unit* u) override { bot_pet_ai::MoveInLineOfSight(u); }\n+        void JustDied(Unit* u) override { bot_pet_ai::JustDied(u); }\n+\n+        void DoPetActions(uint32 diff)\n+        {\n+            //Envelop random target: every 3 sec\n+            if (IsSpellReady(ENVELOP_1, diff, false))\n+            {\n+                std::list<Unit*> targets;\n+                petOwner->GetBotAI()->HelpGetNearbyTargetsList(targets, 10.f, 1, me);\n+                if (targets.size() > 2)\n+                    Bcore::Containers::RandomResize(targets, 2);\n+                for (Unit* u : targets)\n+                    me->CastSpell(u, GetSpell(ENVELOP_1), true);\n+                SetSpellCooldown(ENVELOP_1, 3000);\n+            }\n+\n+            if (IsSpellReady(LIGHTNING_1, diff, false))\n+            {\n+                std::list<Unit*> targets;\n+                petOwner->GetBotAI()->HelpGetNearbyTargetsList(targets, 15.f, 0, me);\n+                if (!targets.empty())\n+                    me->CastSpell(me, CAMERA_SHAKE_VISUAL, true);\n+                for (Unit* u : targets)\n+                {\n+                    me->CastSpell(u, GetSpell(LIGHTNING_1), true);\n+                    u->CastSpell(u, TARGET_LIGHTNING_VISUAL, true);\n+                    u->CastSpell(u, TARGET_LIGHTNING_VISUAL2, true);\n+                }\n+                SetSpellCooldown(LIGHTNING_1, 4500);\n+            }\n+        }\n+\n+        void UpdateAI(uint32 diff) override\n+        {\n+            if (((liveTimer += diff) >= TORNADO_DURATION) || !petOwner->GetBotAI()->HasRole(BOT_ROLE_DPS))\n+            {\n+                canUpdate = false;\n+                me->ToTempSummon()->UnSummon(1);\n+                return;\n+            }\n+            else if ((IsIndoors() && !me->IsOutdoors()) && (isIndoorsTimer += diff) >= TORNADO_DISSIPATE_TIMER)\n+            {\n+                canUpdate = false;\n+                me->SetObjectScale(me->GetNativeObjectScale() / 2.f);\n+                me->ToTempSummon()->UnSummon(2000);\n+                return;\n+            }\n+\n+            if ((growthTimer += diff) > TORNADO_GROWTH_TIMER)\n+            {\n+                growthTimer %= TORNADO_GROWTH_TIMER;\n+                me->CastSpell(me, SPELL_GROWTH, true);\n+                //me->SetObjectScale(me->GetObjectScale() * 1.1f);\n+            }\n+\n+            if (!GlobalUpdate(diff))\n+                return;\n+\n+            DoPetActions(diff);\n+\n+            if (IsCasting())\n+                return;\n+\n+            if (!CheckAttackTarget())\n+                return;\n+\n+            DoPetAttack(diff);\n+        }\n+\n+        void DoPetAttack(uint32 diff)\n+        {\n+            if ((moveResetTimer += diff) > TORNADO_MOVE_RESET_TIMER || opponent->GetGUID() != me->GetTarget())\n+            {\n+                moveResetTimer %= TORNADO_MOVE_RESET_TIMER;\n+                SetBotCommandState(BOT_COMMAND_ATTACK);\n+                me->SetTarget(opponent->GetGUID());\n+                Position pos = opponent->GetNearPosition(frand(3.f, 5.f + opponent->GetCombatReach()), opponent->GetAbsoluteAngle(petOwner) + frand(float(-M_PI) / 2.f, float(M_PI) / 2.f));\n+                me->GetMotionMaster()->MovePoint(me->GetMapId(), pos.GetPositionX(), pos.GetPositionY(), opponent->GetPositionZ(), false);\n+                //me->GetMotionMaster()->MoveChase(opponent, frand(3.f, 10.f), opponent->GetAbsoluteAngle(petOwner) + frand(-M_PI / 2, M_PI / 2));\n+            }\n+        }\n+\n+        void ApplyBotPetSpellRadiusMods(SpellInfo const* spellInfo, float& radius) const override\n+        {\n+            uint32 baseId = spellInfo->GetFirstRankSpell()->Id;\n+            //SpellSchool school = GetFirstSchoolInMask(spellInfo->GetSchoolMask());\n+            //uint8 lvl = me->GetLevel();\n+            float flatbonus = 0.0f;\n+            float pctbonus = 0.0f;\n+\n+            ////pct mods\n+            ////Increased Area (AhnQ set bonus?) 23549\n+            //if (lvl >= 60 && (spellInfo->SpellFamilyFlags[0] & 0x1084))\n+            //    pctbonus += 0.25f;\n+\n+            //flat mods\n+            //Slow Aura growth\n+            if (baseId == SPELL_SLOW_AURA)\n+                flatbonus += me->GetCombatReach();\n+\n+            radius = radius * (1.0f + pctbonus) + flatbonus;\n+        }\n+\n+        void OnPetClassSpellGo(SpellInfo const* /*spellInfo*/) override {}\n+\n+        void SpellHit(WorldObject* wcaster, SpellInfo const* spell) override\n+        {\n+            Unit* caster = wcaster->ToUnit();\n+            if (!caster)\n+                return;\n+\n+            OnSpellHit(caster, spell);\n+        }\n+\n+        void SpellHitTarget(WorldObject* wtarget, SpellInfo const* spell) override\n+        {\n+            Unit* target = wtarget->ToUnit();\n+            if (!target)\n+                return;\n+\n+            if (target == me)\n+                return;\n+\n+            uint32 baseId = spell->GetFirstRankSpell()->Id;\n+            //uint8 lvl = me->GetLevel();\n+\n+            if (baseId == ENVELOP_1)\n+            {\n+                if (target->IsControlledByPlayer())\n+                {\n+                    if (Aura* enve = target->GetAura(GetSpell(baseId), me->GetGUID()))\n+                    {\n+                        int32 dur = std::max<int32>(enve->GetDuration() - 6000, 0);\n+                        enve->SetDuration(dur);\n+                        enve->SetMaxDuration(dur);\n+                    }\n+                }\n+            }\n+        }\n+\n+        void DamageDealt(Unit* victim, uint32& damage, DamageEffectType damageType) override\n+        {\n+            bot_pet_ai::DamageDealt(victim, damage, damageType);\n+        }\n+\n+        void DamageTaken(Unit* u, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo*/) override\n+        {\n+            if (!u)\n+                return;\n+            if (!u->IsInCombat() && !me->IsInCombat())\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void OwnerAttackedBy(Unit* u) override\n+        {\n+            if (!u)\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void CheckAttackState() override\n+        {\n+        }\n+\n+        void Reset() override\n+        {\n+            liveTimer = 0;\n+            moveResetTimer = 0;\n+            growthTimer = 0;\n+            isIndoorsTimer = 0;\n+        }\n+\n+        void InitPetSpells() override\n+        {\n+            InitSpellMap(ENVELOP_1, true, false);\n+            InitSpellMap(LIGHTNING_1, true, false);\n+        }\n+\n+        void ApplyPetPassives() const override\n+        {\n+            RefreshAura(PERIODIC_LIGHTNING_VISUAL);\n+            RefreshAura(SPELL_SLOW_AURA);\n+        }\n+\n+    private:\n+        uint32 liveTimer;\n+        uint32 moveResetTimer;\n+        uint32 growthTimer;\n+        uint32 isIndoorsTimer;\n+    };\n+};\n+\n+void AddSC_sea_witch_bot_pets()\n+{\n+    new sea_witch_pet_bot();\n+}\ndiff --git a/src/server/game/AI/NpcBots/bpet_shaman.cpp b/src/server/game/AI/NpcBots/bpet_shaman.cpp\nnew file mode 100644\nindex 0000000000..3f7cdf6289\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bpet_shaman.cpp\n@@ -0,0 +1,191 @@\n+#include \"bot_ai.h\"\n+#include \"bpet_ai.h\"\n+#include \"ScriptMgr.h\"\n+#include \"TemporarySummon.h\"\n+/*\n+Shaman NpcBot Pets (by Trickerer onlysuffering@gmail.com)\n+Complete - 100%\n+TODO:\n+*/\n+\n+enum ShamanPetBaseSpells\n+{\n+    BASH_1                              = 58861, //r5 cd45\n+    LEAP_1                              = 58867, //r5-30 cd20\n+    TWIN_HOWL_1                         = 58857, //r10 cd15\n+    SPIRIT_WALK_1                       = 58875  //r25 cd32\n+};\n+\n+enum ShamanPetPassives\n+{\n+    SPIRIT_HUNT                         = 58877\n+};\n+\n+enum ShamanPetSpecial\n+{\n+    SPIRITWOLF_DURATION                 = 45000\n+};\n+\n+class shaman_pet_bot : public CreatureScript\n+{\n+public:\n+    shaman_pet_bot() : CreatureScript(\"shaman_pet_bot\") { }\n+\n+    CreatureAI* GetAI(Creature* creature) const override\n+    {\n+        return new shaman_botpetAI(creature);\n+    }\n+\n+    struct shaman_botpetAI : public bot_pet_ai\n+    {\n+        shaman_botpetAI(Creature* creature) : bot_pet_ai(creature) { }\n+\n+        void JustEnteredCombat(Unit* u) override { bot_pet_ai::JustEnteredCombat(u); }\n+        void KilledUnit(Unit* u) override { bot_pet_ai::KilledUnit(u); }\n+        void EnterEvadeMode(EvadeReason why = EVADE_REASON_OTHER) override { bot_pet_ai::EnterEvadeMode(why); }\n+        void MoveInLineOfSight(Unit* u) override { bot_pet_ai::MoveInLineOfSight(u); }\n+        void JustDied(Unit* u) override { bot_pet_ai::JustDied(u); }\n+        void DoNonCombatActions(uint32 /*diff*/) { }\n+\n+        void StartAttack(Unit* u, bool force = false)\n+        {\n+            if (!bot_pet_ai::StartAttack(u, force))\n+                return;\n+            GetInPosition(force, u);\n+        }\n+\n+        void DoPetActions(uint32 diff)\n+        {\n+            if (IsSpellReady(SPIRIT_WALK_1, diff) && (me->GetVictim() || petOwner->GetVictim()) &&\n+                !HasBotCommandState(BOT_COMMAND_STAY) &&\n+                me->GetDistance(petOwner) < 25)\n+            {\n+                me->CastSpell(me, GetSpell(SPIRIT_WALK_1), false);\n+                return;\n+            }\n+        }\n+\n+        void UpdateAI(uint32 diff) override\n+        {\n+            if ((liveTimer += diff) >= SPIRITWOLF_DURATION)\n+            {\n+                canUpdate = false;\n+                me->ToTempSummon()->UnSummon(1);\n+                return;\n+            }\n+\n+            if (!GlobalUpdate(diff))\n+                return;\n+\n+            if (!me->IsInCombat())\n+                DoNonCombatActions(diff);\n+\n+            DoPetActions(diff);\n+\n+            if (!CheckAttackTarget())\n+                return;\n+\n+            if (IsCasting())\n+                return;\n+\n+            DoPetAttack(diff);\n+        }\n+\n+        void DoPetAttack(uint32 diff)\n+        {\n+            StartAttack(opponent, IsPetMelee());\n+\n+            float dist = me->GetDistance(opponent);\n+            Unit const* u = opponent->GetVictim();\n+            //bool canDPS = petOwner->GetBotAI()->HasRole(BOT_ROLE_DPS);\n+\n+            if (IsSpellReady(LEAP_1, diff) &&\n+                !HasBotCommandState(BOT_COMMAND_STAY) &&\n+                !(opponent->IsCreature() && opponent->ToCreature()->isWorldBoss()) &&\n+                dist > 5 && dist < 30)\n+            {\n+                me->CastSpell(opponent, GetSpell(LEAP_1), false);\n+                return;\n+            }\n+\n+            if (IsSpellReady(BASH_1, diff) && !CCed(opponent) &&\n+                me->IsWithinMeleeRange(opponent))\n+            {\n+                me->CastSpell(opponent, GetSpell(BASH_1), false);\n+                return;\n+            }\n+\n+            if (IsSpellReady(TWIN_HOWL_1, diff, false) && u && u != me && me->IsWithinMeleeRange(opponent) &&\n+                !CCed(opponent) && !opponent->HasAuraType(SPELL_AURA_MOD_TAUNT) &&\n+                (!IsTank(u) || (GetHealthPCT(u) < 30 && GetHealthPCT(me) > 50)) && IsInBotParty(u))\n+            {\n+                me->CastSpell(opponent, GetSpell(TWIN_HOWL_1), false);\n+                return;\n+            }\n+        }\n+\n+        void OnPetClassSpellGo(SpellInfo const* /*spellInfo*/) override\n+        {\n+        }\n+\n+        void SpellHit(WorldObject* wcaster, SpellInfo const* spell) override\n+        {\n+            Unit* caster = wcaster->ToUnit();\n+            if (!caster)\n+                return;\n+\n+            OnSpellHit(caster, spell);\n+        }\n+\n+        void SpellHitTarget(WorldObject* /*wtarget*/, SpellInfo const* /*spell*/) override\n+        {\n+        }\n+\n+        void DamageDealt(Unit* victim, uint32& damage, DamageEffectType damageType) override\n+        {\n+            bot_pet_ai::DamageDealt(victim, damage, damageType);\n+        }\n+\n+        void DamageTaken(Unit* u, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo*/) override\n+        {\n+            if (!u)\n+                return;\n+            if (!u->IsInCombat() && !me->IsInCombat())\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void OwnerAttackedBy(Unit* u) override\n+        {\n+            if (!u)\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void Reset() override\n+        {\n+            liveTimer = 0;\n+        }\n+\n+        void InitPetSpells() override\n+        {\n+            InitSpellMap(BASH_1);\n+            InitSpellMap(LEAP_1);\n+            InitSpellMap(TWIN_HOWL_1);\n+            InitSpellMap(SPIRIT_WALK_1);\n+        }\n+\n+        void ApplyPetPassives() const override\n+        {\n+            RefreshAura(SPIRIT_HUNT);\n+        }\n+\n+    private:\n+        uint32 liveTimer;\n+    };\n+};\n+\n+void AddSC_shaman_bot_pets()\n+{\n+    new shaman_pet_bot();\n+}\ndiff --git a/src/server/game/AI/NpcBots/bpet_warlock.cpp b/src/server/game/AI/NpcBots/bpet_warlock.cpp\nnew file mode 100644\nindex 0000000000..f1b5216f87\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/bpet_warlock.cpp\n@@ -0,0 +1,410 @@\n+#include \"bot_ai.h\"\n+#include \"bpet_ai.h\"\n+#include \"botmgr.h\"\n+#include \"Creature.h\"\n+#include \"ObjectAccessor.h\"\n+#include \"Player.h\"\n+#include \"ScriptMgr.h\"\n+#include \"Spell.h\"\n+#include \"SpellAuraEffects.h\"\n+#include \"SpellMgr.h\"\n+/*\n+Warlock NpcBot Pets (by Trickerer onlysuffering@gmail.com)\n+Complete - 100%\n+TODO:\n+*/\n+\n+enum WarlockPetBaseSpells\n+{\n+    //imp\n+    FIREBOLT_1                          = 3110,//1\n+    BLOOD_PACT_1                        = 6307,//4\n+    PHASE_SHIFT_1                       = 4511,//12\n+    FIRE_SHIELD_1                       = 2947,//14 unused\n+    //voidwalker\n+    TORMENT_1                           = 3716,//10\n+    SACRIFICE_1                         = 7812,//16\n+    CONSUME_SHADOWS_1                   = 17767,//18\n+    SUFFERING_1                         = 17735,//24\n+    //succubus\n+    LASH_OF_PAIN_1                      = 7814,//20\n+    SOOTHING_KISS_1                     = 6360,//22\n+    SEDUCTION_1                         = 6358,//26\n+    LESSER_INVISIBILITY_1               = 7870,//32\n+    //felhunter\n+    DEVOUR_MAGIC_1                      = 19505,//30\n+    FEL_INTELLIGENCE_1                  = 54424,//32\n+    SPELL_LOCK_1                        = 19244,//36\n+    SHADOW_BITE_1                       = 54049,//42\n+    //felguard\n+    ANGUISH_1                           = 33698,//50\n+    CLEAVE_1                            = 30213,//50\n+    INTERCEPT_1                         = 30151 //52\n+};\n+\n+enum WarlockPetPassives\n+{\n+    AVOIDANCE                           = 32233,\n+    DEMONIC_FRENZY                      = 32850\n+};\n+\n+enum WarlockPetSpecial\n+{\n+    SOUL_LINK_PET                       = 25228//split effect lvl 20 req\n+};\n+\n+class warlock_pet_bot : public CreatureScript\n+{\n+public:\n+    warlock_pet_bot() : CreatureScript(\"warlock_pet_bot\") { }\n+\n+    CreatureAI* GetAI(Creature* creature) const override\n+    {\n+        return new warlock_botpetAI(creature);\n+    }\n+\n+    struct warlock_botpetAI : public bot_pet_ai\n+    {\n+        warlock_botpetAI(Creature* creature) : bot_pet_ai(creature) { }\n+\n+        void JustEnteredCombat(Unit* u) override { bot_pet_ai::JustEnteredCombat(u); }\n+        void KilledUnit(Unit* u) override { bot_pet_ai::KilledUnit(u); }\n+        void EnterEvadeMode(EvadeReason why = EVADE_REASON_OTHER) override { bot_pet_ai::EnterEvadeMode(why); }\n+        void MoveInLineOfSight(Unit* u) override { bot_pet_ai::MoveInLineOfSight(u); }\n+        void JustDied(Unit* u) override { bot_pet_ai::JustDied(u); }\n+        void DoNonCombatActions(uint32 /*diff*/) { }\n+\n+        void StartAttack(Unit* u, bool force = false)\n+        {\n+            if (!bot_pet_ai::StartAttack(u, force))\n+                return;\n+            GetInPosition(force, u);\n+        }\n+\n+        void DoPetActions(uint32 diff)\n+        {\n+            if (GetSpell(SOUL_LINK_PET) && !petOwner->HasAuraTypeWithCaster(SPELL_AURA_SPLIT_DAMAGE_PCT, me->GetGUID()))\n+            {\n+                me->CastSpell(me, SOUL_LINK_PET, false);\n+                return;\n+            }\n+            if (myType == BOT_PET_IMP)\n+            {\n+                //hacked - confilct with soul link due to ownerGuid mismatch\n+                if (IsSpellReady(BLOOD_PACT_1, diff, false) && !IAmFree() && (!me->HasAuraType(SPELL_AURA_230) ||\n+                    me->GetAuraEffectsByType(SPELL_AURA_230).front()->GetAmount() < sSpellMgr->GetSpellInfo(GetSpell(BLOOD_PACT_1))->_effects[0].CalcValue()))\n+                {\n+                    me->CastSpell(me, GetSpell(BLOOD_PACT_1), false);\n+                    //CastSpellExtraArgs args(true);\n+                    //args.SetOriginalCaster(me->GetGUID());\n+                    //petOwner->CastSpell(petOwner, GetSpell(BLOOD_PACT_1), args);\n+                    SetSpellCooldown(BLOOD_PACT_1, uint32(-1));\n+                }\n+\n+                if (IsSpellReady(PHASE_SHIFT_1, diff, false) && !me->GetVictim() &&\n+                    (!petOwner->GetBotAI()->HasRole(BOT_ROLE_DPS) || !me->IsInCombat()) &&\n+                    !me->HasAuraType(SPELL_AURA_MOD_UNATTACKABLE))\n+                {\n+                    me->CastSpell(me, GetSpell(PHASE_SHIFT_1), false);\n+                    return;\n+                }\n+            }\n+            else if (myType == BOT_PET_VOIDWALKER)\n+            {\n+                if (GetSpell(CONSUME_SHADOWS_1) && !me->IsInCombat() && !me->isMoving() &&\n+                    me->GetDistance(me) < 10 && GetHealthPCT(me) < 80)\n+                {\n+                    me->CastSpell(me, GetSpell(CONSUME_SHADOWS_1), false);\n+                    return;\n+                }\n+\n+                if (IsSpellReady(SACRIFICE_1, diff, false) &&\n+                    (!petOwner->getAttackers().empty() || petOwner->HasAuraType(SPELL_AURA_PERIODIC_DAMAGE)) &&\n+                    me->GetHealth() > me->GetCreateHealth() / 4) //hp cost 25%\n+                {\n+                    me->CastSpell(me, GetSpell(SACRIFICE_1), false);\n+                    return;\n+                }\n+            }\n+            else if (myType == BOT_PET_SUCCUBUS)\n+            {\n+                if (IsSpellReady(SOOTHING_KISS_1, diff, false) &&\n+                    !me->getAttackers().empty() && me->GetDistance(*(me->getAttackers().begin())) < 10)\n+                {\n+                    me->CastSpell(*(me->getAttackers().begin()), GetSpell(SOOTHING_KISS_1), false);\n+                    SetSpellCooldown(SOOTHING_KISS_1, 4000);\n+                    return;\n+                }\n+\n+                if (GetSpell(SEDUCTION_1) && Rand() < 20 && !IsCasting())\n+                {\n+                    Unit* target = petOwner->GetBotAI()->HelpFindStunTarget(30);\n+                    if (target && target->GetDiminishing(DIMINISHING_FEAR) <= DIMINISHING_LEVEL_2 + 1 * (target->IsNonMeleeSpellCast(false, false, true)))\n+                    {\n+                        me->CastSpell(target, GetSpell(SEDUCTION_1), false);\n+                        return;\n+                    }\n+                }\n+\n+                if (IsSpellReady(LESSER_INVISIBILITY_1, diff, false) && !me->GetVictim() && !me->IsInCombat() &&\n+                    !me->HasAuraType(SPELL_AURA_MOD_INVISIBILITY))\n+                {\n+                    me->CastSpell(me, GetSpell(LESSER_INVISIBILITY_1), false);\n+                    return;\n+                }\n+            }\n+            else if (myType == BOT_PET_FELHUNTER)\n+            {\n+                //hacked - confilct with soul link due to ownerGuid mismatch\n+                if (IsSpellReady(FEL_INTELLIGENCE_1, diff, false) && !IAmFree() &&\n+                    !petOwner->GetBotOwner()->GetBotMgr()->HasBotClass(BOT_CLASS_MAGE) &&\n+                    !petOwner->GetBotOwner()->GetBotMgr()->HasBotClass(BOT_CLASS_PRIEST))\n+                {\n+                    me->CastSpell(me, GetSpell(FEL_INTELLIGENCE_1), false);\n+                    //CastSpellExtraArgs args(true);\n+                    //args.SetOriginalCaster(me->GetGUID());\n+                    //petOwner->CastSpell(petOwner, GetSpell(FEL_INTELLIGENCE_1), args);\n+                    SetSpellCooldown(FEL_INTELLIGENCE_1, uint32(-1));\n+                }\n+\n+                if (IsSpellReady(SPELL_LOCK_1, diff, false))\n+                {\n+                    if (Unit* target = petOwner->GetBotAI()->HelpFindCastingTarget(30, 0, SPELL_LOCK_1))\n+                        me->CastSpell(target, GetSpell(SPELL_LOCK_1), false);\n+                }\n+\n+                CureGroup(GetSpell(DEVOUR_MAGIC_1), diff);\n+            }\n+        }\n+\n+        void UpdateAI(uint32 diff) override\n+        {\n+            if (!GlobalUpdate(diff))\n+                return;\n+\n+            if (Spell const* spell = me->GetCurrentSpell(CURRENT_GENERIC_SPELL))\n+            {\n+                if (myType == BOT_PET_SUCCUBUS)\n+                {\n+                    //Seduction interrupt\n+                    if (spell->GetSpellInfo()->GetFirstRankSpell()->Id == SEDUCTION_1)\n+                    {\n+                        Unit const* target = ObjectAccessor::GetUnit(*me, spell->m_targets.GetObjectTargetGUID());\n+                        if (target && CCed(target))\n+                            me->InterruptSpell(CURRENT_GENERIC_SPELL);\n+                    }\n+                }\n+            }\n+\n+            if (!me->IsInCombat())\n+                DoNonCombatActions(diff);\n+\n+            DoPetActions(diff);\n+            //CheckDrainMana(diff);\n+\n+            if (!CheckAttackTarget())\n+                return;\n+\n+            if (IsCasting())\n+                return;\n+\n+            DoPetAttack(diff);\n+        }\n+\n+        void DoPetAttack(uint32 diff)\n+        {\n+            StartAttack(opponent, IsPetMelee());\n+\n+            float dist = me->GetDistance(opponent);\n+            Unit const* u = opponent->GetVictim();\n+            bool canDPS = petOwner->GetBotAI()->HasRole(BOT_ROLE_DPS);\n+\n+            if (myType == BOT_PET_IMP)\n+            {\n+                if (GetSpell(FIREBOLT_1) && canDPS && dist < 30)\n+                {\n+                    me->CastSpell(opponent, GetSpell(FIREBOLT_1), false);\n+                    return;\n+                }\n+            }\n+            else if (myType == BOT_PET_VOIDWALKER)\n+            {\n+                if (IsSpellReady(TORMENT_1, diff, false) && u && u != me && me->IsWithinMeleeRange(opponent) &&\n+                    opponent->CanHaveThreatList() && !CCed(opponent) && !opponent->HasAuraType(SPELL_AURA_MOD_TAUNT) &&\n+                    (!IsTank(u) || (GetHealthPCT(u) < 30 && GetHealthPCT(me) > 20)) && IsInBotParty(u))\n+                {\n+                    me->CastSpell(opponent, GetSpell(TORMENT_1), false);\n+                    SetSpellCooldown(TORMENT_1, 5000);\n+                    return;\n+                }\n+\n+                if (IsSpellReady(SUFFERING_1, diff) &&\n+                    !(u == me && opponent->IsCreature() &&\n+                    (opponent->ToCreature()->IsDungeonBoss() || opponent->ToCreature()->isWorldBoss())))\n+                {\n+                    std::list<Unit*> targets;\n+                    petOwner->GetBotAI()->HelpGetNearbyTargetsList(targets, 9.f, 1, me);\n+                    uint8 count = 0;\n+                    for (Unit const* u : targets)\n+                    {\n+                        if (!(u->GetVictim() && IsTank(u->GetVictim())))\n+                            if (++count > 1)\n+                                break;\n+                    }\n+                    if (count < 2 && u && u != me && !IsSpellReady(TORMENT_1, diff, false) && !IsTank(u) && !CCed(opponent) && dist < 8 &&\n+                        IsInBotParty(u))\n+                    {\n+                        count += 2;\n+                    }\n+\n+                    if (count > 1)\n+                    {\n+                        me->CastSpell(me, GetSpell(SUFFERING_1), false);\n+                        SetSpellCooldown(SUFFERING_1, 120000);\n+                        return;\n+                    }\n+                }\n+            }\n+            else if (myType == BOT_PET_SUCCUBUS)\n+            {\n+                if (IsSpellReady(LASH_OF_PAIN_1, diff, false) && canDPS && me->IsWithinMeleeRange(opponent))\n+                {\n+                    me->CastSpell(opponent, GetSpell(LASH_OF_PAIN_1), false);\n+                    //this could have worked if cast was triggered\n+                    //SetSpellCooldown(LASH_OF_PAIN_1, 6000); //Demonic Power part 1\n+                    return;\n+                }\n+            }\n+            else if (myType == BOT_PET_FELHUNTER)\n+            {\n+                if (IsSpellReady(SHADOW_BITE_1, diff, false) && canDPS && me->IsWithinMeleeRange(opponent))\n+                {\n+                    me->CastSpell(opponent, GetSpell(SHADOW_BITE_1), false);\n+                    SetSpellCooldown(SHADOW_BITE_1, me->GetLevel() >= 35 ? 2000 : 6000); //improved felhunter part 2\n+                    return;\n+                }\n+            }\n+            else if (myType == BOT_PET_FELGUARD)\n+            {\n+                if (IsSpellReady(INTERCEPT_1, diff, false) && canDPS &&\n+                    !HasBotCommandState(BOT_COMMAND_STAY) &&\n+                    !(opponent->IsCreature() && opponent->ToCreature()->isWorldBoss()) &&\n+                    dist > 8 && dist < 25 && !CCed(opponent))\n+                {\n+                    me->CastSpell(opponent, GetSpell(INTERCEPT_1), false);\n+                    SetSpellCooldown(INTERCEPT_1, 30000);\n+                    return;\n+                }\n+\n+                if (IsSpellReady(ANGUISH_1, diff, false) && u && u != me && me->IsWithinMeleeRange(opponent) &&\n+                    opponent->CanHaveThreatList() && !CCed(opponent) && !opponent->HasAuraType(SPELL_AURA_MOD_TAUNT) &&\n+                    (!IsTank(u) || (GetHealthPCT(u) < 30 && GetHealthPCT(me) > 20)) && IsInBotParty(u))\n+                {\n+                    me->CastSpell(opponent, GetSpell(ANGUISH_1), false);\n+                    SetSpellCooldown(ANGUISH_1, 5000);\n+                    return;\n+                }\n+\n+                if (IsSpellReady(CLEAVE_1, diff, false) && canDPS && me->IsWithinMeleeRange(opponent))\n+                {\n+                    me->CastSpell(opponent, GetSpell(CLEAVE_1), false);\n+                    SetSpellCooldown(CLEAVE_1, 6000);\n+                    return;\n+                }\n+            }\n+        }\n+\n+        void OnPetClassSpellGo(SpellInfo const* /*spellInfo*/) override\n+        {\n+        }\n+\n+        void SpellHit(WorldObject* wcaster, SpellInfo const* spell) override\n+        {\n+            Unit* caster = wcaster->ToUnit();\n+            if (!caster)\n+                return;\n+\n+            OnSpellHit(caster, spell);\n+        }\n+\n+        void SpellHitTarget(WorldObject* /*wtarget*/, SpellInfo const* /*spell*/) override\n+        {\n+        }\n+\n+        void DamageDealt(Unit* victim, uint32& damage, DamageEffectType damageType) override\n+        {\n+            bot_pet_ai::DamageDealt(victim, damage, damageType);\n+        }\n+\n+        void DamageTaken(Unit* u, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo*/) override\n+        {\n+            if (!u)\n+                return;\n+            if (!u->IsInCombat() && !me->IsInCombat())\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void OwnerAttackedBy(Unit* u) override\n+        {\n+            if (!u)\n+                return;\n+            OnOwnerDamagedBy(u);\n+        }\n+\n+        void Reset() override\n+        {\n+        }\n+\n+        void InitPetSpells() override\n+        {\n+            InitSpellMap(FIREBOLT_1);\n+            InitSpellMap(BLOOD_PACT_1);\n+            InitSpellMap(PHASE_SHIFT_1);\n+            //InitSpellMap(FIRE_SHIELD_1);\n+\n+            InitSpellMap(TORMENT_1);\n+            InitSpellMap(SACRIFICE_1);\n+            InitSpellMap(CONSUME_SHADOWS_1);\n+            InitSpellMap(SUFFERING_1);\n+\n+            InitSpellMap(LASH_OF_PAIN_1);\n+            InitSpellMap(SOOTHING_KISS_1);\n+            InitSpellMap(SEDUCTION_1);\n+            InitSpellMap(LESSER_INVISIBILITY_1);\n+\n+            InitSpellMap(DEVOUR_MAGIC_1);\n+            InitSpellMap(FEL_INTELLIGENCE_1);\n+            InitSpellMap(SPELL_LOCK_1);\n+            InitSpellMap(SHADOW_BITE_1);\n+\n+            InitSpellMap(ANGUISH_1);\n+            InitSpellMap(CLEAVE_1);\n+            InitSpellMap(INTERCEPT_1);\n+\n+            InitSpellMap(SOUL_LINK_PET);\n+        }\n+\n+        void ApplyPetPassives() const override\n+        {\n+            uint8 lvl = me->GetLevel();\n+            switch (myType)\n+            {\n+                case BOT_PET_FELGUARD:\n+                    RefreshAura(DEMONIC_FRENZY);\n+                    break;\n+                default:\n+                    break;\n+            }\n+\n+            RefreshAura(AVOIDANCE, lvl >= 60 ? 1 : 0);\n+        }\n+\n+    private:\n+    };\n+};\n+\n+void AddSC_warlock_bot_pets()\n+{\n+    new warlock_pet_bot();\n+}\ndiff --git a/src/server/game/AI/NpcBots/lib/botlogtraits.h b/src/server/game/AI/NpcBots/lib/botlogtraits.h\nnew file mode 100644\nindex 0000000000..d7d5c6f8a9\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/lib/botlogtraits.h\n@@ -0,0 +1,53 @@\n+#ifndef BOT_LOG_TRAITS_H_\n+#define BOT_LOG_TRAITS_H_\n+\n+#include \"botcommon.h\"\n+\n+#include \"StringConvert.h\"\n+\n+namespace NPCBots\n+{\n+\n+template<typename ST, ST Size>\n+inline constexpr std::array<ST, Size> index_array = ([]<typename T, T... I>(std::integer_sequence<T, I...>&&) { return std::array{ I... }; })(std::make_integer_sequence<ST, Size>{});\n+\n+template<typename ST, ST Size>\n+inline constexpr std::array<ST, Size> index_array_rev = ([]<typename T, T... I>(std::integer_sequence<T, I...>&&) {\n+    return std::array{ static_cast<ST>((Size - 1) - I)... }; })(std::make_integer_sequence<ST, Size>{});\n+\n+namespace StringConvert\n+{\n+    template<typename T>\n+    static std::enable_if_t<std::is_integral_v<T> || std::is_floating_point_v<T>, std::string>\n+    ToString(T t)\n+    {\n+        return Bcore::Impl::StringConvertImpl::For<T>::ToString(t);\n+    }\n+\n+    template<typename T>\n+    static std::enable_if_t<std::is_trivially_constructible_v<std::string, T> || std::is_same_v<std::string, T>, std::string>\n+    ToString(T t)\n+    {\n+        return std::string{ t };\n+    }\n+\n+    template<typename T>\n+    static std::enable_if_t<!std::is_trivially_constructible_v<std::string, T> && !std::is_same_v<std::string, T> && std::is_constructible_v<std::string, T>, std::string>\n+    ToString(T t)\n+    {\n+        return std::string(t);\n+    }\n+}\n+\n+template<typename T>\n+concept Stringable = requires(T t) { StringConvert::ToString(t); };\n+\n+template<typename... Ts>\n+concept LoggableCount = sizeof...(Ts) <= MAX_BOT_LOG_PARAMS;\n+\n+template<typename... Ts>\n+concept LoggableArguments = LoggableCount<Ts...> && (Stringable<Ts> && ...);\n+\n+}\n+\n+#endif\ndiff --git a/src/server/game/AI/NpcBots/lib/bottraits.h b/src/server/game/AI/NpcBots/lib/bottraits.h\nnew file mode 100644\nindex 0000000000..9b7e2d1173\n--- /dev/null\n+++ b/src/server/game/AI/NpcBots/lib/bottraits.h\n@@ -0,0 +1,158 @@\n+#ifndef BOT_TRAITS_H\n+#define BOT_TRAITS_H\n+\n+#include \"botcommon.h\"\n+\n+#include \"Creature.h\"\n+#include \"Log.h\"\n+#include \"SpellAuraEffects.h\"\n+\n+#include <algorithm>\n+#include <array>\n+#include <ranges>\n+#include <tuple>\n+\n+namespace NPCBots\n+{\n+\n+template<typename T, std::size_t... Is>\n+constexpr auto fixed_tuple_helper(std::index_sequence<Is...> const&) -> decltype(std::make_tuple(((void)Is, std::declval<T>())...));\n+\n+template<typename T, size_t N>\n+struct fixed_tuple {\n+    using tuple_type = decltype(fixed_tuple_helper<T>(std::make_index_sequence<N>{}));\n+};\n+\n+template<typename T, std::size_t N, std::size_t... Is>\n+typename fixed_tuple<T,N>::tuple_type to_tuple_helper(std::array<T, N>&& arr, std::index_sequence<Is...>&&)\n+{\n+    return std::make_tuple(arr[Is]...);\n+}\n+\n+template<typename T, size_t N>\n+typename fixed_tuple<T,N>::tuple_type to_tuple(std::array<T, N>&& arr)\n+{\n+    return to_tuple_helper(std::forward<std::array<T, N>>(arr), std::make_index_sequence<N>{});\n+}\n+\n+template<typename T, std::size_t N, std::size_t... Is>\n+typename fixed_tuple<typename T::second_type, N>::tuple_type to_spell_school_affect_bool_tuple_helper(std::array<T, N>&& arr, std::index_sequence<Is...>&&)\n+{\n+    return std::make_tuple(arr[Is].second...);\n+}\n+\n+template<typename T, size_t N>\n+typename fixed_tuple<typename T::second_type, N>::tuple_type to_spell_school_affect_bool_tuple(std::array<T, N>&& arr)\n+{\n+    return to_spell_school_affect_bool_tuple_helper(std::forward<std::array<T, N>>(arr), std::make_index_sequence<N>{});\n+}\n+\n+template<typename T, std::size_t N, std::size_t... Is>\n+std::array<typename T::second_type,N> to_spell_school_affect_bool_arr_helper(std::array<T, N>&& arr, std::index_sequence<Is...>&&)\n+{\n+    return std::array{ arr[Is].second... };\n+}\n+\n+template<typename T, size_t N>\n+std::array<typename T::second_type,N> to_spell_school_affect_bool_arr(std::array<T, N>&& arr)\n+{\n+    return to_spell_school_affect_bool_arr_helper(std::forward<std::array<T, N>>(arr), std::make_index_sequence<N>{});\n+}\n+\n+}\n+\n+template<typename School, typename... Schools>\n+std::enable_if_t<std::conjunction_v<std::is_same<School, SpellSchools>, std::is_same<Schools, SpellSchools>...>,\n+    bool>\n+all_schools_valid(School school, Schools... schools)\n+{\n+    if (school < SPELL_SCHOOL_NORMAL || school >= MAX_SPELL_SCHOOL)\n+        return false;\n+\n+    if constexpr (sizeof...(Schools) > 0)\n+        return all_schools_valid(schools...);\n+    return true;\n+}\n+\n+template<class...Schools>\n+std::enable_if_t<std::conjunction_v<std::is_same<Schools, SpellSchools>...>, std::array<std::pair<SpellSchools, bool>, sizeof...(Schools)>>\n+CanAffectVictimSchools(Unit const* target, Schools... schools)\n+{\n+    static_assert(sizeof...(Schools) > 0, \"need at least 1 spell school to check for\");\n+\n+    using arr_type = std::array<std::pair<SpellSchools, bool>, sizeof...(Schools)>;\n+    using arr_iter_type = typename arr_type::iterator;\n+    arr_type results{ std::pair{schools, true}... };\n+\n+    if (!all_schools_valid(schools...))\n+    {\n+        BOT_LOG_ERROR(\"entities.player\", \"bot_ai::CanAffectVictimSchools(): trying to check invalid spell school, first: {}\", uint32(results.at(0).first));\n+        return results;\n+    }\n+\n+    if (Creature const* creature = target->ToCreature())\n+    {\n+        if (SpellSchoolMask immune_mask = SpellSchoolMask(creature->GetCreatureTemplate()->SpellSchoolImmuneMask))\n+        {\n+            for (uint8 i = SPELL_SCHOOL_NORMAL; i < MAX_SPELL_SCHOOL; ++i)\n+            {\n+                if (immune_mask & (1u << i))\n+                {\n+                    arr_iter_type ri = std::ranges::find(results, std::pair{ SpellSchools(i), true });\n+                    if (ri != results.end())\n+                        ri->second = false;\n+                }\n+            }\n+        }\n+    }\n+\n+    for (AuraEffect const* immune_effect : target->GetAuraEffectsByType(SPELL_AURA_SCHOOL_IMMUNITY))\n+    {\n+        if (SpellSchoolMask immune_mask = SpellSchoolMask(immune_effect->GetMiscValue()))\n+        {\n+            for (uint8 i = SPELL_SCHOOL_NORMAL; i < MAX_SPELL_SCHOOL; ++i)\n+            {\n+                if (immune_mask & (1u << i))\n+                {\n+                    arr_iter_type ri = std::ranges::find(results, std::pair{ SpellSchools(i), true });\n+                    if (ri != results.end())\n+                        ri->second = false;\n+                }\n+            }\n+        }\n+    }\n+    return results;\n+}\n+\n+template<class...Schools>\n+typename NPCBots::fixed_tuple<bool, sizeof...(Schools)>::tuple_type\n+CanAffectVictimBools(Unit const* target, Schools... schools)\n+{\n+    return NPCBots::to_spell_school_affect_bool_tuple(CanAffectVictimSchools(target, schools...));\n+}\n+\n+template<class...Schools>\n+bool\n+CanAffectVictimAny(Unit const* target, Schools... schools)\n+{\n+    using arr_type = std::array<std::pair<SpellSchools, bool>, sizeof...(Schools)>;\n+    using pair_type = typename arr_type::value_type;\n+\n+    arr_type bools = CanAffectVictimSchools(target, schools...);\n+\n+    return std::ranges::any_of(bools, [](pair_type const& p) { return p.second; });\n+}\n+\n+template<class...Schools>\n+bool\n+CanAffectVictimAll(Unit const* target, Schools... schools)\n+{\n+    using arr_type = std::array<std::pair<SpellSchools, bool>, sizeof...(Schools)>;\n+    using pair_type = typename arr_type::value_type;\n+\n+    arr_type bools = CanAffectVictimSchools(target, schools...);\n+\n+    return std::ranges::all_of(bools, [](pair_type const& p) { return p.second; });\n+}\n+\n+#endif\ndiff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp\nindex 18bdca0961..d6c2dac1a8 100644\n--- a/src/server/game/AI/SmartScripts/SmartScript.cpp\n+++ b/src/server/game/AI/SmartScripts/SmartScript.cpp\n@@ -294,6 +294,9 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u\n                         talkTarget = target->ToCreature();\n                     }\n                     else\n+                    //npcbot: prevent using bots as talkers\n+                    if (!target->ToCreature()->IsNPCBotOrPet())\n+                    //end npcbot\n                         talker = target->ToCreature();\n                     break;\n                 }\ndiff --git a/src/server/game/Accounts/RBAC.h b/src/server/game/Accounts/RBAC.h\nindex e4ae4da4d9..e967f94161 100644\n--- a/src/server/game/Accounts/RBAC.h\n+++ b/src/server/game/Accounts/RBAC.h\n@@ -752,6 +752,45 @@ enum RBACPermissions\n     // IF YOU ADD NEW PERMISSIONS, ADD THEM IN MASTER BRANCH AS WELL!\n     //\n     // custom permissions 1000+\n+    //NPCBot\n+    RBAC_PERM_COMMAND_NPCBOT                                 = 70001,\n+    RBAC_PERM_COMMAND_NPCBOT_ADD                             = 70002,\n+    RBAC_PERM_COMMAND_NPCBOT_REMOVE                          = 70003,\n+    RBAC_PERM_COMMAND_NPCBOT_SPAWN                           = 70004,\n+    RBAC_PERM_COMMAND_NPCBOT_MOVE                            = 70005,\n+    RBAC_PERM_COMMAND_NPCBOT_DELETE                          = 70006,\n+    RBAC_PERM_COMMAND_NPCBOT_LOOKUP                          = 70007,\n+    RBAC_PERM_COMMAND_NPCBOT_REVIVE                          = 70008,\n+    RBAC_PERM_COMMAND_NPCBOT_RELOADCONFIG                    = 70009,\n+    RBAC_PERM_COMMAND_NPCBOT_INFO                            = 70010,\n+    RBAC_PERM_COMMAND_NPCBOT_HIDE                            = 70011,\n+    RBAC_PERM_COMMAND_NPCBOT_UNHIDE                          = 70012,\n+    RBAC_PERM_COMMAND_NPCBOT_RECALL                          = 70013,\n+    RBAC_PERM_COMMAND_NPCBOT_KILL                            = 70014,\n+    RBAC_PERM_COMMAND_NPCBOT_DEBUG_RAID                      = 70015,\n+    RBAC_PERM_COMMAND_NPCBOT_DEBUG_MOUNT                     = 70016,\n+    RBAC_PERM_COMMAND_NPCBOT_DEBUG_VISUAL                    = 70017,\n+    RBAC_PERM_COMMAND_NPCBOT_DEBUG_STATES                    = 70018,\n+    RBAC_PERM_COMMAND_NPCBOT_TOGGLE_FLAGS                    = 70019,\n+    RBAC_PERM_COMMAND_NPCBOT_SET_FACTION                     = 70020,\n+    RBAC_PERM_COMMAND_NPCBOT_SET_OWNER                       = 70021,\n+    RBAC_PERM_COMMAND_NPCBOT_SET_SPEC                        = 70022,\n+    RBAC_PERM_COMMAND_NPCBOT_COMMAND_STANDSTILL              = 70023,\n+    RBAC_PERM_COMMAND_NPCBOT_COMMAND_STOPFULLY               = 70024,\n+    RBAC_PERM_COMMAND_NPCBOT_COMMAND_FOLLOW                  = 70025,\n+    RBAC_PERM_COMMAND_NPCBOT_ATTDISTANCE_SHORT               = 70026,\n+    RBAC_PERM_COMMAND_NPCBOT_ATTDISTANCE_LONG                = 70027,\n+    RBAC_PERM_COMMAND_NPCBOT_ATTDISTANCE_EXACT               = 70028,\n+    RBAC_PERM_COMMAND_NPCBOT_FOLDISTANCE_EXACT               = 70029,\n+    RBAC_PERM_COMMAND_NPCBOT_ORDER_CAST                      = 70030,\n+    RBAC_PERM_COMMAND_NPCBOT_VEHICLE_EJECT                   = 70031,\n+    RBAC_PERM_COMMAND_NPCBOT_DUMP_LOAD                       = 70032,\n+    RBAC_PERM_COMMAND_NPCBOT_DUMP_WRITE                      = 70033,\n+    RBAC_PERM_COMMAND_NPCBOT_SPAWNED                         = 70034,\n+    RBAC_PERM_COMMAND_NPCBOT_COMMAND_MISC                    = 70035,\n+    RBAC_PERM_COMMAND_NPCBOT_CREATENEW                       = 70036,\n+    RBAC_PERM_COMMAND_NPCBOT_SEND                            = 70037,\n+    //End NPCBot\n     RBAC_PERM_MAX\n };\n \ndiff --git a/src/server/game/Battlegrounds/Arena.cpp b/src/server/game/Battlegrounds/Arena.cpp\nindex 56ccca3337..afe336c0fc 100644\n--- a/src/server/game/Battlegrounds/Arena.cpp\n+++ b/src/server/game/Battlegrounds/Arena.cpp\n@@ -26,6 +26,10 @@\n #include \"WorldSession.h\"\n #include \"WorldStatePackets.h\"\n \n+//npcbot\n+#include \"Creature.h\"\n+//end npcbot\n+\n void ArenaScore::AppendToPacket(WorldPackets::Battleground::PVPLogData_Player& playerData)\n {\n     playerData.PlayerGUID = PlayerGuid;\n@@ -80,6 +84,25 @@ void Arena::AddPlayer(Player* player)\n     UpdateArenaWorldState();\n }\n \n+//npcbot\n+void Arena::AddBot(Creature* bot)\n+{\n+    ASSERT(bot->IsNPCBot() && !bot->IsFreeBot());\n+\n+    bool const isInBattleground = IsPlayerInBattleground(bot->GetGUID());\n+    Battleground::AddBot(bot);\n+\n+    uint32 botteam = bot->GetBotOwner()->GetBGTeam();\n+\n+    if (!isInBattleground)\n+        BotScores[bot->GetGUID()] = new ArenaScore(bot->GetGUID(), botteam);\n+\n+    //No flags - handled by AI\n+\n+    UpdateArenaWorldState();\n+}\n+//end npcbot\n+\n void Arena::RemovePlayer(Player* /*player*/, ObjectGuid /*guid*/, uint32 /*team*/)\n {\n     if (GetStatus() == STATUS_WAIT_LEAVE)\n@@ -89,6 +112,17 @@ void Arena::RemovePlayer(Player* /*player*/, ObjectGuid /*guid*/, uint32 /*team*\n     CheckWinConditions();\n }\n \n+//npcbot\n+void Arena::RemoveBot(ObjectGuid /*guid*/)\n+{\n+    if (GetStatus() == STATUS_WAIT_LEAVE)\n+        return;\n+\n+    UpdateArenaWorldState();\n+    CheckWinConditions();\n+}\n+//end npcbot\n+\n void Arena::FillInitialWorldStates(WorldPackets::WorldState::InitWorldStates& packet)\n {\n     packet.Worldstates.emplace_back(ARENA_WORLD_STATE_ALIVE_PLAYERS_GREEN, GetAlivePlayersCountByTeam(HORDE));\n@@ -112,6 +146,33 @@ void Arena::HandleKillPlayer(Player* player, Player* killer)\n     CheckWinConditions();\n }\n \n+//npcbot\n+void Arena::HandleBotKillPlayer(Creature* killer, Player* victim)\n+{\n+    if (GetStatus() != STATUS_IN_PROGRESS)\n+        return;\n+    Battleground::HandleBotKillPlayer(killer, victim);\n+    UpdateArenaWorldState();\n+    CheckWinConditions();\n+}\n+void Arena::HandleBotKillBot(Creature* killer, Creature* victim)\n+{\n+    if (GetStatus() != STATUS_IN_PROGRESS)\n+        return;\n+    Battleground::HandleBotKillBot(killer, victim);\n+    UpdateArenaWorldState();\n+    CheckWinConditions();\n+}\n+void Arena::HandlePlayerKillBot(Creature* victim, Player* killer)\n+{\n+    if (GetStatus() != STATUS_IN_PROGRESS)\n+        return;\n+    Battleground::HandlePlayerKillBot(victim, killer);\n+    UpdateArenaWorldState();\n+    CheckWinConditions();\n+}\n+//end npcbot\n+\n void Arena::RemovePlayerAtLeave(ObjectGuid guid, bool transport, bool sendPacket)\n {\n     if (isRated() && GetStatus() == STATUS_IN_PROGRESS)\n@@ -140,6 +201,35 @@ void Arena::RemovePlayerAtLeave(ObjectGuid guid, bool transport, bool sendPacket\n     Battleground::RemovePlayerAtLeave(guid, transport, sendPacket);\n }\n \n+//npcbot\n+void Arena::RemoveBotAtLeave(ObjectGuid guid)\n+{\n+    //if (isRated() && GetStatus() == STATUS_IN_PROGRESS)\n+    //{\n+    //    BattlegroundBotMap::const_iterator itr = m_Bots.find(guid);\n+    //    if (itr != m_Bots.end()) // check if the player was a participant of the match, or only entered through gm command (appear)\n+    //    {\n+    //        // if the player was a match participant, calculate rating\n+    //        uint32 team = itr->second.Team;\n+\n+    //        ArenaTeam* winnerArenaTeam = sArenaTeamMgr->GetArenaTeamById(GetArenaTeamIdForTeam(GetOtherTeam(team)));\n+    //        ArenaTeam* loserArenaTeam = sArenaTeamMgr->GetArenaTeamById(GetArenaTeamIdForTeam(team));\n+\n+    //        // left a rated match while the encounter was in progress, consider as loser\n+    //        if (winnerArenaTeam && loserArenaTeam && winnerArenaTeam != loserArenaTeam)\n+    //        {\n+    //            if (Player* player = _GetPlayer(itr->first, itr->second.OfflineRemoveTime != 0, \"Arena::RemovePlayerAtLeave\"))\n+    //                loserArenaTeam->MemberLost(player, GetArenaMatchmakerRating(GetOtherTeam(team)));\n+    //            else\n+    //                loserArenaTeam->OfflineMemberLost(guid, GetArenaMatchmakerRating(GetOtherTeam(team)));\n+    //        }\n+    //    }\n+    //}\n+\n+    Battleground::RemoveBotAtLeave(guid);\n+}\n+//end npcbot\n+\n void Arena::CheckWinConditions()\n {\n     if (!GetAlivePlayersCountByTeam(ALLIANCE) && GetPlayersCountByTeam(HORDE))\ndiff --git a/src/server/game/Battlegrounds/Arena.h b/src/server/game/Battlegrounds/Arena.h\nindex 1aaf613cda..29021bbe01 100644\n--- a/src/server/game/Battlegrounds/Arena.h\n+++ b/src/server/game/Battlegrounds/Arena.h\n@@ -52,6 +52,15 @@ class TC_GAME_API Arena : public Battleground\n         void AddPlayer(Player* player) override;\n         void RemovePlayer(Player* /*player*/, ObjectGuid /*guid*/, uint32 /*team*/) override;\n \n+        //npcbot\n+        void AddBot(Creature* bot) override;\n+        void RemoveBotAtLeave(ObjectGuid guid) override;\n+        void RemoveBot(ObjectGuid /*guid*/) override;\n+        void HandleBotKillPlayer(Creature* killer, Player* victim) override;\n+        void HandleBotKillBot(Creature* killer, Creature* victim) override;\n+        void HandlePlayerKillBot(Creature* victim, Player* killer) override;\n+        //end npcbot\n+\n         void FillInitialWorldStates(WorldPackets::WorldState::InitWorldStates& packet) override;\n         void UpdateArenaWorldState();\n \ndiff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp\nindex 117dba35b4..6e7fe3cecb 100644\n--- a/src/server/game/Battlegrounds/Battleground.cpp\n+++ b/src/server/game/Battlegrounds/Battleground.cpp\n@@ -43,6 +43,12 @@\n #include \"WorldStatePackets.h\"\n #include <cstdarg>\n \n+//npcbot\n+#include \"bot_ai.h\"\n+#include \"botdatamgr.h\"\n+#include \"botmgr.h\"\n+//end npcbot\n+\n void BattlegroundScore::AppendToPacket(WorldPackets::Battleground::PVPLogData_Player& playerData)\n {\n     playerData.PlayerGUID = PlayerGuid;\n@@ -168,6 +174,11 @@ Battleground::~Battleground()\n \n     for (BattlegroundScoreMap::const_iterator itr = PlayerScores.begin(); itr != PlayerScores.end(); ++itr)\n         delete itr->second;\n+\n+    //npcbot\n+    for (BattlegroundScoreMap::const_iterator itr = BotScores.begin(); itr != BotScores.end(); ++itr)\n+        delete itr->second;\n+    //end npcbot\n }\n \n void Battleground::Update(uint32 diff)\n@@ -175,6 +186,9 @@ void Battleground::Update(uint32 diff)\n     if (!PreUpdateImpl(diff))\n         return;\n \n+    //npcbot\n+    if (m_Bots.empty())\n+    //end npcbot\n     if (!GetPlayersSize())\n     {\n         //BG is empty\n@@ -192,6 +206,17 @@ void Battleground::Update(uint32 diff)\n         return;\n     }\n \n+    //npcbot: end BG if no real players exist\n+    if (GetStatus() != STATUS_WAIT_LEAVE)\n+    {\n+        if (m_Players.empty() && !m_Bots.empty())\n+        {\n+            EndNow();\n+            return;\n+        }\n+    }\n+    //end npcbot\n+\n     switch (GetStatus())\n     {\n         case STATUS_WAIT_JOIN:\n@@ -308,6 +333,28 @@ inline void Battleground::_ProcessResurrect(uint32 diff)\n                 Creature* sh = nullptr;\n                 for (GuidVector::const_iterator itr2 = (itr->second).begin(); itr2 != (itr->second).end(); ++itr2)\n                 {\n+                    //npcbot\n+                    if (itr2->IsCreature())\n+                    {\n+                        if (Creature const* cbot = BotDataMgr::FindBot(itr2->GetEntry()))\n+                        {\n+                            Creature* bot = const_cast<Creature*>(cbot);\n+                            ASSERT(bot->IsInWorld());\n+                            if (!sh)\n+                                sh = bot->GetMap()->GetCreature(itr->first);\n+                            if (sh)\n+                            {\n+                                if (bot->GetExactDist(sh) > 15.0f)\n+                                    bot->NearTeleportTo(*sh);\n+                                sh->CastSpell(sh, SPELL_SPIRIT_HEAL, true);\n+                            }\n+                            bot->CastSpell(bot, SPELL_RESURRECTION_VISUAL, true);\n+                            m_ResurrectQueue.push_back(*itr2);\n+                        }\n+                        continue;\n+                    }\n+                    //end npcbot\n+\n                     Player* player = ObjectAccessor::FindPlayer(*itr2);\n                     if (!player)\n                         continue;\n@@ -339,6 +386,15 @@ inline void Battleground::_ProcessResurrect(uint32 diff)\n     {\n         for (GuidVector::const_iterator itr = m_ResurrectQueue.begin(); itr != m_ResurrectQueue.end(); ++itr)\n         {\n+            //npcbot\n+            if (itr->IsCreature())\n+            {\n+                if (Creature const* cbot = BotDataMgr::FindBot(itr->GetEntry()))\n+                    cbot->GetBotAI()->UpdateReviveTimer(std::numeric_limits<uint32>::max());\n+                continue;\n+            }\n+            //end npcbot\n+\n             Player* player = ObjectAccessor::FindPlayer(*itr);\n             if (!player)\n                 continue;\n@@ -509,6 +565,17 @@ inline void Battleground::_ProcessJoin(uint32 diff)\n             if (sWorld->getBoolConfig(CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_ENABLE))\n                 sWorld->SendWorldText(LANG_BG_STARTED_ANNOUNCE_WORLD, GetName().c_str(), GetMinLevel(), GetMaxLevel());\n         }\n+\n+        //npcbot: activate bots\n+        for (auto const& kv : m_Bots)\n+        {\n+            if (Creature const* bot = BotDataMgr::FindBot(kv.first.GetEntry()))\n+            {\n+                if (bot->IsNPCBot() && bot->IsWandererBot())\n+                    bot->GetBotAI()->RemoveBotCommandState(BOT_COMMAND_STAY);\n+            }\n+        }\n+        //end npcbot\n     }\n }\n \n@@ -522,6 +589,15 @@ inline void Battleground::_ProcessLeave(uint32 diff)\n     if (m_EndTime <= 0)\n     {\n         m_EndTime = 0;\n+        //npcbot\n+        BattlegroundBotMap::iterator bitr, bnext;\n+        for (bitr = m_Bots.begin(); bitr != m_Bots.end(); bitr = bnext)\n+        {\n+            bnext = bitr;\n+            ++bnext;\n+            RemoveBotAtLeave(bitr->first);\n+        }\n+        //end npcbot\n         BattlegroundPlayerMap::iterator itr, next;\n         for (itr = m_Players.begin(); itr != m_Players.end(); itr = next)\n         {\n@@ -537,6 +613,12 @@ inline void Battleground::_ProcessLeave(uint32 diff)\n Player* Battleground::_GetPlayer(ObjectGuid guid, bool offlineRemove, char const* context) const\n {\n     Player* player = nullptr;\n+\n+    //npcbot\n+    if (guid.IsCreature())\n+        return player;\n+    //end npcbot\n+\n     if (!offlineRemove)\n     {\n         // should this be ObjectAccessor::FindConnectedPlayer() to return players teleporting ?\n@@ -630,6 +712,12 @@ void Battleground::CastSpellOnTeam(uint32 SpellID, uint32 TeamID)\n     for (BattlegroundPlayerMap::const_iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr)\n         if (Player* player = _GetPlayerForTeam(TeamID, itr, \"CastSpellOnTeam\"))\n             player->CastSpell(player, SpellID, true);\n+    //npcbot\n+    for (auto const& kv : m_Bots)\n+        if (kv.second.Team == TeamID)\n+            if (Creature* bot = GetBgMap()->GetCreature(kv.first))\n+                bot->CastSpell(bot, SpellID, true);\n+    //end npcbot\n }\n \n void Battleground::RemoveAuraOnTeam(uint32 SpellID, uint32 TeamID)\n@@ -731,6 +819,31 @@ void Battleground::EndBattleground(uint32 winner)\n \n     BattlegroundQueueTypeId bgQueueTypeId = BattlegroundMgr::BGQueueTypeId(GetTypeID(), GetBracketId(), GetArenaType());\n \n+    //npcbot: despawn generated bots immediately\n+    BattlegroundBotMap::iterator bitr, bnext;\n+    for (bitr = m_Bots.begin(); bitr != m_Bots.end(); bitr = bnext)\n+    {\n+        bnext = bitr;\n+        ++bnext;\n+        if (bitr->first.IsCreature())\n+        {\n+            if (Creature const* bot = BotDataMgr::FindBot(bitr->first.GetEntry()))\n+            {\n+                if (!bot->IsAlive())\n+                    BotMgr::ReviveBot(const_cast<Creature*>(bot));\n+                else\n+                {\n+                    bot->GetBotAI()->UnsummonAll(false);\n+                    const_cast<Creature*>(bot)->InterruptNonMeleeSpells(true);\n+                    const_cast<Creature*>(bot)->RemoveAllControlled();\n+                    const_cast<Creature*>(bot)->SetUnitFlag(UNIT_FLAG_IMMUNE);\n+                    const_cast<Creature*>(bot)->AddUnitState(UNIT_STATE_STUNNED);\n+                }\n+            }\n+        }\n+    }\n+    //end npcbot\n+\n     for (BattlegroundPlayerMap::iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr)\n     {\n         uint32 team = itr->second.Team;\n@@ -869,6 +982,15 @@ void Battleground::RemovePlayerAtLeave(ObjectGuid guid, bool Transport, bool Sen\n             player->ResurrectPlayer(1.0f);\n             player->SpawnCorpseBones();\n         }\n+\n+        //npcbot\n+        if (player->HaveBot())\n+        {\n+            BotMap const* map = player->GetBotMgr()->GetBotMap();\n+            for (BotMap::const_iterator itr = map->begin(); itr != map->end(); ++itr)\n+                RemoveBotAtLeave(itr->first);\n+        }\n+        //end npcbot\n     }\n     else\n     {\n@@ -945,6 +1067,83 @@ void Battleground::RemovePlayerAtLeave(ObjectGuid guid, bool Transport, bool Sen\n     //battleground object will be deleted next Battleground::Update() call\n }\n \n+//npcbot\n+void Battleground::RemoveBotAtLeave(ObjectGuid guid)\n+{\n+    uint32 team = GetBotTeam(guid);\n+\n+    // Remove from lists/maps\n+    bool participant = false;\n+    BattlegroundBotMap::iterator itr = m_Bots.find(guid);\n+    if (itr != m_Bots.end())\n+    {\n+        UpdatePlayersCountByTeam(team, true); // -1 player\n+        m_Bots.erase(itr);\n+        participant = true;\n+    }\n+\n+    // delete player score if exists\n+    auto const& itr2 = BotScores.find(guid);\n+    if (itr2 != BotScores.end())\n+    {\n+        delete itr2->second;\n+        BotScores.erase(itr2);\n+    }\n+\n+    RemoveBotFromResurrectQueue(guid);\n+\n+    // BG subclass specific code\n+    RemoveBot(guid);\n+\n+    if (participant) // if the player was a match participant, remove auras, calc rating, update queue\n+    {\n+        // remove from raid group if player is member\n+        if (Group* group = GetBgRaid(team))\n+        {\n+            if (group->IsMember(guid))\n+            {\n+                if (!group->RemoveMember(guid))                // group was disbanded\n+                    SetBgRaid(team, nullptr);\n+            }\n+        }\n+\n+        // Let others know\n+        WorldPackets::Battleground::BattlegroundPlayerLeft botLeft;\n+        botLeft.Guid = guid;\n+        SendPacketToTeam(team, botLeft.Write(), nullptr, false);\n+\n+        DecreaseInvitedCount(team);\n+\n+        //we should update battleground queue, but only if bg isn't ending\n+        if (isBattleground() && GetStatus() < STATUS_WAIT_LEAVE)\n+        {\n+            BattlegroundTypeId bgTypeId = GetTypeID();\n+            BattlegroundQueueTypeId bgQueueTypeId = BattlegroundMgr::BGQueueTypeId(bgTypeId, GetBracketId(), GetArenaType());\n+\n+            // a player has left the battleground, so there are free slots -> add to queue\n+            AddToBGFreeSlotQueue();\n+            sBattlegroundMgr->ScheduleQueueUpdate(0, bgQueueTypeId);\n+        }\n+    }\n+\n+    if (Creature const* bot = BotDataMgr::FindBot(guid.GetEntry()))\n+    {\n+        if (bot->HasAuraType(SPELL_AURA_SPIRIT_OF_REDEMPTION))\n+            const_cast<Creature*>(bot)->RemoveAurasByType(SPELL_AURA_MOD_SHAPESHIFT);\n+        const_cast<Creature*>(bot)->RemoveAurasByType(SPELL_AURA_MOUNTED);\n+        const_cast<Creature*>(bot)->RemoveUnitFlag(UNIT_FLAG_IMMUNE);\n+        const_cast<Creature*>(bot)->ClearUnitState(UNIT_STATE_STUNNED);\n+\n+        bot->GetBotAI()->SetBG(nullptr);\n+        if (bot->IsWandererBot())\n+        {\n+            bot->GetBotAI()->canUpdate = false;\n+            BotDataMgr::DespawnWandererBot(guid.GetEntry());\n+        }\n+    }\n+}\n+//end npcbot\n+\n // this method is called when no players remains in battleground\n void Battleground::Reset()\n {\n@@ -964,11 +1163,18 @@ void Battleground::Reset()\n     m_InBGFreeSlotQueue = false;\n \n     m_Players.clear();\n+    m_Bots.clear();\n \n     for (BattlegroundScoreMap::const_iterator itr = PlayerScores.begin(); itr != PlayerScores.end(); ++itr)\n         delete itr->second;\n     PlayerScores.clear();\n \n+    //npcbot\n+    for (auto const& itr2 : BotScores)\n+        delete itr2.second;\n+    BotScores.clear();\n+    //end npcbot\n+\n     for (uint8 i = 0; i < PVP_TEAMS_COUNT; ++i)\n         _arenaTeamScores[i].Reset();\n \n@@ -1012,6 +1218,19 @@ void Battleground::AddPlayer(Player* player)\n     if (!isInBattleground)\n         UpdatePlayersCountByTeam(team, false);                  // +1 player\n \n+    //npcbot\n+    if (player->GetGroup() && player->HaveBot())\n+    {\n+        BotMap const* map = player->GetBotMgr()->GetBotMap();\n+        for (BotMap::const_iterator itr = map->begin(); itr != map->end(); ++itr)\n+        {\n+            Creature* bot = itr->second;\n+            if (bot && player->GetGroup()->IsMember(itr->first))\n+                AddBot(bot);\n+        }\n+    }\n+    //end npcbot\n+\n     WorldPackets::Battleground::BattlegroundPlayerJoined playerJoined;\n     playerJoined.Guid = player->GetGUID();\n     SendPacketToTeam(team, playerJoined.Write(), player, false);\n@@ -1046,6 +1265,30 @@ void Battleground::AddPlayer(Player* player)\n     AddOrSetPlayerToCorrectBgGroup(player, team);\n }\n \n+//npcbot\n+void Battleground::AddBot(Creature* bot)\n+{\n+    ObjectGuid guid = bot->GetGUID();\n+    uint32 team = !bot->IsFreeBot() ? bot->GetBotOwner()->GetBGTeam() : (BotDataMgr::GetTeamIdForFaction(bot->GetFaction()) == TEAM_ALLIANCE) ? uint32(ALLIANCE) : uint32(HORDE);\n+\n+    // Add to list/maps\n+    BattlegroundBot bb;\n+    bb.Team = team;\n+    m_Bots[guid] = bb;\n+\n+    UpdatePlayersCountByTeam(team, false);                  // +1 player\n+\n+    WorldPackets::Battleground::BattlegroundPlayerJoined botJoined;\n+    botJoined.Guid = bot->GetGUID();\n+    SendPacketToTeam(team, botJoined.Write(), nullptr, false);\n+\n+    AddOrSetBotToCorrectBgGroup(bot, team);\n+\n+    bot->GetBotAI()->SetBG(this);\n+    bot->GetBotAI()->OnBotEnterBattleground();\n+}\n+//end npcbot\n+\n // this method adds player to his team's bg group, or sets his correct group if player is already in bg group\n void Battleground::AddOrSetPlayerToCorrectBgGroup(Player* player, uint32 team)\n {\n@@ -1078,6 +1321,30 @@ void Battleground::AddOrSetPlayerToCorrectBgGroup(Player* player, uint32 team)\n     }\n }\n \n+//npcbot\n+void Battleground::AddOrSetBotToCorrectBgGroup(Creature* bot, uint32 team)\n+{\n+    ObjectGuid botGuid = bot->GetGUID();\n+    Group* group = GetBgRaid(team);\n+    if (!group)                                      // first player joined\n+    {\n+        group = new Group;\n+        SetBgRaid(team, group);\n+        group->Create(bot);\n+    }\n+    else                                            // raid already exist\n+    {\n+        if (group->IsMember(botGuid))\n+        {\n+            uint8 subgroup = group->GetMemberGroup(botGuid);\n+            bot->SetBattlegroundOrBattlefieldRaid(group, subgroup);\n+        }\n+        else\n+            group->AddMember(bot);\n+    }\n+}\n+//end npcbot\n+\n // This method should be called when player logs into running battleground\n void Battleground::EventPlayerLoggedIn(Player* player)\n {\n@@ -1208,7 +1475,14 @@ uint32 Battleground::GetFreeSlotsForTeam(uint32 Team) const\n \n bool Battleground::HasFreeSlots() const\n {\n+    //npcbot\n+    /*\n+    //end npcbot\n     return GetPlayersSize() < GetMaxPlayers();\n+    //npcbot\n+    */\n+    return GetPlayersSize() + uint32(GetBots().size()) < GetMaxPlayers();\n+    //end npcbot\n }\n \n void Battleground::BuildPvPLogDataPacket(WorldPackets::Battleground::PVPMatchStatistics& pvpLogData)\n@@ -1236,6 +1510,11 @@ void Battleground::BuildPvPLogDataPacket(WorldPackets::Battleground::PVPMatchSta\n     if (GetStatus() == STATUS_WAIT_LEAVE)\n         pvpLogData.Winner = GetWinner();\n \n+    //npcbot\n+    for (auto const& [_, score] : BotScores)\n+        score->AppendToPacket(pvpLogData.Players.emplace_back());\n+    //end npcbot\n+\n     for (auto const& [_, score] : PlayerScores)\n         score->AppendToPacket(pvpLogData.Players.emplace_back());\n }\n@@ -1254,6 +1533,18 @@ bool Battleground::UpdatePlayerScore(Player* player, uint32 type, uint32 value,\n     return true;\n }\n \n+//npcbot\n+bool Battleground::UpdateBotScore(Creature const* bot, uint32 type, uint32 value, bool /*doAddHonor*/)\n+{\n+    BattlegroundScoreMap::const_iterator itr = BotScores.find(bot->GetGUID());\n+    if (itr == BotScores.end()) // bot not found...\n+        return false;\n+\n+    itr->second->UpdateScore(type, value);\n+    return true;\n+}\n+//end npcbot\n+\n void Battleground::AddPlayerToResurrectQueue(ObjectGuid npc_guid, ObjectGuid player_guid)\n {\n     m_ReviveQueue[npc_guid].push_back(player_guid);\n@@ -1282,6 +1573,23 @@ void Battleground::RemovePlayerFromResurrectQueue(ObjectGuid player_guid)\n     }\n }\n \n+//npcbot\n+void Battleground::RemoveBotFromResurrectQueue(ObjectGuid guid)\n+{\n+    for (auto& kv : m_ReviveQueue)\n+    {\n+        for (GuidVector::iterator itr2 = kv.second.begin(); itr2 != kv.second.end(); ++itr2)\n+        {\n+            if (*itr2 == guid)\n+            {\n+                kv.second.erase(itr2);\n+                return;\n+            }\n+        }\n+    }\n+}\n+//end npcbot\n+\n void Battleground::RelocateDeadPlayers(ObjectGuid guideGuid)\n {\n     // Those who are waiting to resurrect at this node are taken to the closest own node's graveyard\n@@ -1289,8 +1597,25 @@ void Battleground::RelocateDeadPlayers(ObjectGuid guideGuid)\n     if (!ghostList.empty())\n     {\n         WorldSafeLocsEntry const* closestGrave = nullptr;\n+        //npcbot\n+        WorldSafeLocsEntry const* closestBotGrave = nullptr;\n+        //end npcbot\n         for (GuidVector::const_iterator itr = ghostList.begin(); itr != ghostList.end(); ++itr)\n         {\n+            //npcbot\n+            if (itr->IsCreature())\n+            {\n+                if (Creature const* bot = BotDataMgr::FindBot(itr->GetEntry()))\n+                {\n+                    if (!closestBotGrave)\n+                        closestBotGrave = GetClosestGraveyardForBot(*bot, GetBotTeam(*itr));\n+                    if (closestBotGrave)\n+                        const_cast<Creature*>(bot)->NearTeleportTo(Position(closestBotGrave->Loc.X, closestBotGrave->Loc.Y, closestBotGrave->Loc.Z));\n+                }\n+                continue;\n+            }\n+            //end npcbot\n+\n             Player* player = ObjectAccessor::FindPlayer(*itr);\n             if (!player)\n                 continue;\n@@ -1701,6 +2026,55 @@ void Battleground::HandleKillPlayer(Player* victim, Player* killer)\n             if (creditedPlayer->GetTeam() == killer->GetTeam() && creditedPlayer->IsAtGroupRewardDistance(victim))\n                 UpdatePlayerScore(creditedPlayer, SCORE_HONORABLE_KILLS, 1);\n         }\n+\n+        //npcbot\n+        uint32 team = killer->GetTeam();\n+        for (auto const& kv : m_Bots)\n+        {\n+            if (kv.second.Team != team || kv.first == killer->GetGUID())\n+                continue;\n+            Creature const* teamedBot = BotDataMgr::FindBot(kv.first.GetEntry());\n+            if (teamedBot && teamedBot->GetDistance(victim) <= sWorld->getFloatConfig(CONFIG_GROUP_XP_DISTANCE))\n+                UpdateBotScore(teamedBot, SCORE_HONORABLE_KILLS, 1);\n+        }\n+        //end npcbot\n+    }\n+\n+    if (!isArena())\n+    {\n+        // To be able to remove insignia -- ONLY IN Battlegrounds\n+        victim->SetUnitFlag(UNIT_FLAG_SKINNABLE);\n+        RewardXPAtKill(killer, victim);\n+    }\n+}\n+\n+//npcbot\n+void Battleground::HandleBotKillPlayer(Creature* killer, Player* victim)\n+{\n+    UpdatePlayerScore(victim, SCORE_DEATHS, 1);\n+\n+    if (killer)\n+    {\n+        uint32 team = GetBotTeam(killer->GetGUID());\n+\n+        UpdateBotScore(killer, SCORE_HONORABLE_KILLS, 1);\n+        UpdateBotScore(killer, SCORE_KILLING_BLOWS, 1);\n+\n+        for (BattlegroundPlayerMap::const_iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr)\n+        {\n+            Player* creditedPlayer = ObjectAccessor::FindPlayer(itr->first);\n+            if (creditedPlayer && creditedPlayer->GetTeam() == team && creditedPlayer->IsAtGroupRewardDistance(victim))\n+                UpdatePlayerScore(creditedPlayer, SCORE_HONORABLE_KILLS, 1);\n+        }\n+\n+        for (auto const& kv : m_Bots)\n+        {\n+            if (kv.second.Team != team || kv.first == killer->GetGUID())\n+                continue;\n+            Creature const* teamedBot = BotDataMgr::FindBot(kv.first.GetEntry());\n+            if (teamedBot && teamedBot->GetDistance(victim) <= sWorld->getFloatConfig(CONFIG_GROUP_XP_DISTANCE))\n+                UpdateBotScore(teamedBot, SCORE_HONORABLE_KILLS, 1);\n+        }\n     }\n \n     if (!isArena())\n@@ -1710,6 +2084,100 @@ void Battleground::HandleKillPlayer(Player* victim, Player* killer)\n         RewardXPAtKill(killer, victim);\n     }\n }\n+void Battleground::HandleBotKillBot(Creature* killer, Creature* victim)\n+{\n+    UpdateBotScore(victim, SCORE_DEATHS, 1);\n+    // Add +1 kills to group and +1 killing_blows to killer\n+    if (killer)\n+    {\n+        uint32 team = GetBotTeam(killer->GetGUID());\n+\n+        UpdateBotScore(killer, SCORE_HONORABLE_KILLS, 1);\n+        UpdateBotScore(killer, SCORE_KILLING_BLOWS, 1);\n+\n+        for (BattlegroundPlayerMap::const_iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr)\n+        {\n+            Player* creditedPlayer = ObjectAccessor::FindPlayer(itr->first);\n+            if (creditedPlayer && creditedPlayer->GetTeam() == team && creditedPlayer->IsAtGroupRewardDistance(victim))\n+                UpdatePlayerScore(creditedPlayer, SCORE_HONORABLE_KILLS, 1);\n+        }\n+\n+        for (auto const& kv : m_Bots)\n+        {\n+            if (kv.second.Team != team || kv.first == killer->GetGUID())\n+                continue;\n+            Creature const* teamedBot = BotDataMgr::FindBot(kv.first.GetEntry());\n+            if (teamedBot && teamedBot->GetDistance(victim) <= sWorld->getFloatConfig(CONFIG_GROUP_XP_DISTANCE))\n+                UpdateBotScore(teamedBot, SCORE_HONORABLE_KILLS, 1);\n+        }\n+    }\n+    if (!isArena() && !victim->GetLootRecipient()) // Prevent double reward (AI->KilledUnit (killing blow) and Unit::Kill (recipient))\n+        RewardXPAtKill(killer, victim);\n+}\n+void Battleground::HandlePlayerKillBot(Creature* victim, Player* killer)\n+{\n+    UpdateBotScore(victim, SCORE_DEATHS, 1);\n+    // Add +1 kills to group and +1 killing_blows to killer\n+    if (killer)\n+    {\n+        uint32 team = killer->GetTeam();\n+\n+        UpdatePlayerScore(killer, SCORE_HONORABLE_KILLS, 1);\n+        UpdatePlayerScore(killer, SCORE_KILLING_BLOWS, 1);\n+\n+        for (BattlegroundPlayerMap::const_iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr)\n+        {\n+            Player* creditedPlayer = ObjectAccessor::FindPlayer(itr->first);\n+            if (!creditedPlayer || creditedPlayer == killer)\n+                continue;\n+\n+            if (creditedPlayer->GetTeam() == killer->GetTeam() && creditedPlayer->IsAtGroupRewardDistance(victim))\n+                UpdatePlayerScore(creditedPlayer, SCORE_HONORABLE_KILLS, 1);\n+        }\n+\n+        for (auto const& kv : m_Bots)\n+        {\n+            if (kv.second.Team != team || kv.first == killer->GetGUID())\n+                continue;\n+            Creature const* teamedBot = BotDataMgr::FindBot(kv.first.GetEntry());\n+            if (teamedBot && teamedBot->GetDistance(victim) <= sWorld->getFloatConfig(CONFIG_GROUP_XP_DISTANCE))\n+                UpdateBotScore(teamedBot, SCORE_HONORABLE_KILLS, 1);\n+        }\n+    }\n+    if (!isArena())\n+        RewardXPAtKill(killer, victim);\n+}\n+\n+TeamId Battleground::GetOtherTeamId(TeamId teamId) const\n+{\n+    return (teamId == TEAM_ALLIANCE) ? TEAM_HORDE : (teamId == TEAM_HORDE) ? TEAM_ALLIANCE : teamId;\n+}\n+\n+TeamId Battleground::GetBotTeamId(ObjectGuid guid) const\n+{\n+    uint32 team = GetBotTeam(guid);\n+    switch (team)\n+    {\n+        case ALLIANCE:\n+            return TEAM_ALLIANCE;\n+        case HORDE:\n+            return TEAM_HORDE;\n+        case TEAM_ALLIANCE:\n+        case TEAM_HORDE:\n+            return TeamId(team);\n+        default:\n+            return TEAM_NEUTRAL;\n+    }\n+}\n+\n+uint32 Battleground::GetBotTeam(ObjectGuid guid) const\n+{\n+    BattlegroundBotMap::const_iterator itr = m_Bots.find(guid);\n+    if (itr != m_Bots.end())\n+        return itr->second.Team;\n+    return 0;\n+}\n+//end npcbot\n \n // Return the player's team based on battlegroundplayer info\n // Used in same faction arena matches mainly\n@@ -1728,6 +2196,14 @@ uint32 Battleground::GetOtherTeam(uint32 teamId) const\n \n bool Battleground::IsPlayerInBattleground(ObjectGuid guid) const\n {\n+    //npcbot\n+    if (guid.IsCreature())\n+    {\n+        BattlegroundBotMap::const_iterator bitr = m_Bots.find(guid);\n+        if (bitr != m_Bots.end())\n+            return true;\n+    }\n+    //end npcbot\n     BattlegroundPlayerMap::const_iterator itr = m_Players.find(guid);\n     if (itr != m_Players.end())\n         return true;\n@@ -1755,6 +2231,17 @@ void Battleground::PlayerAddedToBGCheckIfBGIsRunning(Player* player)\n uint32 Battleground::GetAlivePlayersCountByTeam(uint32 Team) const\n {\n     int count = 0;\n+    //npcbot\n+    for (BattlegroundBotMap::const_iterator itr = m_Bots.begin(); itr != m_Bots.end(); ++itr)\n+    {\n+        if (GetBotTeam(itr->first) == Team)\n+        {\n+            Creature const* bot = BotDataMgr::FindBot(itr->first.GetEntry());\n+            if (bot && bot->IsAlive() && bot->GetShapeshiftForm() != FORM_SPIRITOFREDEMPTION)\n+                ++count;\n+        }\n+    }\n+    //end npcbot\n     for (BattlegroundPlayerMap::const_iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr)\n     {\n         if (itr->second.Team == Team)\n@@ -1797,6 +2284,13 @@ WorldSafeLocsEntry const* Battleground::GetClosestGraveyard(Player* player)\n     return sObjectMgr->GetClosestGraveyard(player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), player->GetMapId(), player->GetTeam(), player);\n }\n \n+//npcbot\n+WorldSafeLocsEntry const* Battleground::GetClosestGraveyardForBot(WorldLocation const& curPos, uint32 team) const\n+{\n+    return sObjectMgr->GetClosestGraveyard(curPos.GetPositionX(), curPos.GetPositionY(), curPos.GetPositionZ(), curPos.GetMapId(), team, nullptr);\n+}\n+//end npcbot\n+\n void Battleground::StartTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry)\n {\n     for (BattlegroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr)\n@@ -1816,6 +2310,74 @@ void Battleground::RewardXPAtKill(Player* killer, Player* victim)\n         killer->RewardPlayerAndGroupAtKill(victim, true);\n }\n \n+//npcbot\n+void Battleground::RewardXPAtKill(Player* killer, Creature* victim)\n+{\n+    if (sWorld->getBoolConfig(CONFIG_BG_XP_FOR_KILL) && killer && victim)\n+        killer->RewardPlayerAndGroupAtKill(victim, true);\n+}\n+\n+void Battleground::RewardXPAtKill(Creature* killer, Player* victim)\n+{\n+    if (sWorld->getBoolConfig(CONFIG_BG_XP_FOR_KILL) && killer && victim)\n+    {\n+        Player* pkiller = killer->IsFreeBot() ? nullptr : killer->GetBotOwner();\n+        if (!pkiller)\n+        {\n+            uint32 team = (BotDataMgr::GetTeamIdForFaction(killer->GetFaction()) == TEAM_ALLIANCE) ? ALLIANCE : HORDE;\n+            if (Group const* group = GetBgRaid(team))\n+            {\n+                float mindist = SIZE_OF_GRIDS;\n+                for (GroupReference const* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())\n+                {\n+                    if (Player* gPlayer = itr->GetSource())\n+                    {\n+                        float dist = gPlayer->GetExactDist2d(victim);\n+                        if (dist < mindist)\n+                        {\n+                            mindist = dist;\n+                            pkiller = gPlayer;\n+                        }\n+                    }\n+                }\n+            }\n+        }\n+        if (pkiller && pkiller->IsAtGroupRewardDistance(victim))\n+            pkiller->RewardPlayerAndGroupAtKill(victim, true);\n+    }\n+}\n+\n+void Battleground::RewardXPAtKill(Creature* killer, Creature* victim)\n+{\n+    if (sWorld->getBoolConfig(CONFIG_BG_XP_FOR_KILL) && killer && victim)\n+    {\n+        Player* pkiller = killer->IsFreeBot() ? nullptr : killer->GetBotOwner();\n+        if (!pkiller)\n+        {\n+            uint32 team = (BotDataMgr::GetTeamIdForFaction(killer->GetFaction()) == TEAM_ALLIANCE) ? ALLIANCE : HORDE;\n+            if (Group const* group = GetBgRaid(team))\n+            {\n+                float mindist = SIZE_OF_GRIDS;\n+                for (GroupReference const* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())\n+                {\n+                    if (Player* gPlayer = itr->GetSource())\n+                    {\n+                        float dist = gPlayer->GetExactDist2d(victim);\n+                        if (dist < mindist)\n+                        {\n+                            mindist = dist;\n+                            pkiller = gPlayer;\n+                        }\n+                    }\n+                }\n+            }\n+        }\n+        if (pkiller && pkiller->IsAtGroupRewardDistance(victim))\n+            pkiller->RewardPlayerAndGroupAtKill(victim, true);\n+    }\n+}\n+//end npcbot\n+\n uint32 Battleground::GetTeamScore(uint32 teamId) const\n {\n     if (teamId == TEAM_ALLIANCE || teamId == TEAM_HORDE)\ndiff --git a/src/server/game/Battlegrounds/Battleground.h b/src/server/game/Battlegrounds/Battleground.h\nindex a412fd09e0..5217d34e26 100644\n--- a/src/server/game/Battlegrounds/Battleground.h\n+++ b/src/server/game/Battlegrounds/Battleground.h\n@@ -194,6 +194,13 @@ struct BattlegroundPlayer\n     uint32 Team;                                           // Player's team\n };\n \n+//npcbot\n+struct BattlegroundBot\n+{\n+    uint32 Team;                                            // bot's team\n+};\n+//end npcbot\n+\n struct BattlegroundObjectInfo\n {\n     BattlegroundObjectInfo() : object(nullptr), timer(0), spellid(0) { }\n@@ -340,6 +347,10 @@ class TC_GAME_API Battleground\n         bool isRated() const        { return m_IsRated; }\n \n         typedef std::map<ObjectGuid, BattlegroundPlayer> BattlegroundPlayerMap;\n+        //npcbot\n+        typedef std::map<ObjectGuid, BattlegroundBot> BattlegroundBotMap;\n+        [[nodiscard]] BattlegroundBotMap const& GetBots() const { return m_Bots; }\n+        //end npcbot\n         BattlegroundPlayerMap const& GetPlayers() const { return m_Players; }\n         uint32 GetPlayersSize() const { return m_Players.size(); }\n \n@@ -434,6 +445,30 @@ class TC_GAME_API Battleground\n         virtual void HandleKillPlayer(Player* player, Player* killer);\n         virtual void HandleKillUnit(Creature* /*creature*/, Player* /*killer*/) { }\n \n+        //npcbot\n+        uint32 GetBotScoresSize() const { return BotScores.size(); }\n+        void RemoveBotFromResurrectQueue(ObjectGuid guid);\n+        uint32 GetBotTeam(ObjectGuid guid) const;\n+        TeamId GetBotTeamId(ObjectGuid guid) const;\n+        TeamId GetOtherTeamId(TeamId teamId) const;\n+        void AddOrSetBotToCorrectBgGroup(Creature* bot, uint32 team);\n+        void RewardXPAtKill(Player* killer, Creature* victim);\n+        void RewardXPAtKill(Creature* killer, Player* victim);\n+        void RewardXPAtKill(Creature* killer, Creature* victim);\n+        virtual void AddBot(Creature* bot);\n+        virtual void RemoveBotAtLeave(ObjectGuid guid);\n+        virtual WorldSafeLocsEntry const* GetClosestGraveyardForBot(WorldLocation const& curPos, uint32 team) const;\n+        virtual bool UpdateBotScore(Creature const* bot, uint32 type, uint32 value, bool doAddHonor = true);\n+        virtual void RemoveBot(ObjectGuid /*guid*/) {}\n+        virtual void HandleBotKillPlayer(Creature* killer, Player* victim);\n+        virtual void HandleBotKillBot(Creature* killer, Creature* victim);\n+        virtual void HandlePlayerKillBot(Creature* victim, Player* killer);\n+        virtual void HandleBotKillUnit(Creature* /*killer*/, Creature* /*victim*/) { }\n+        virtual void EventBotDroppedFlag(Creature* /*bot*/) { }\n+        virtual void EventBotClickedOnFlag(Creature* /*bot*/, GameObject* /*target_obj*/) { }\n+        virtual void HandleBotAreaTrigger(Creature* /*bot*/, uint32 /*trigger*/) { }\n+        //end npcbot\n+\n         // Battleground events\n         virtual void EventPlayerDroppedFlag(Player* /*player*/) { }\n         virtual void EventPlayerClickedOnFlag(Player* /*player*/, GameObject* /*target_obj*/) { }\n@@ -533,6 +568,10 @@ class TC_GAME_API Battleground\n \n         // Scorekeeping\n         BattlegroundScoreMap PlayerScores;                // Player scores\n+        //npcbot\n+        BattlegroundScoreMap BotScores;\n+        BattlegroundBotMap m_Bots;\n+        //end npcbot\n         // must be implemented in BG subclass\n         virtual void RemovePlayer(Player* /*player*/, ObjectGuid /*guid*/, uint32 /*team*/) { }\n \ndiff --git a/src/server/game/Battlegrounds/BattlegroundMgr.h b/src/server/game/Battlegrounds/BattlegroundMgr.h\nindex d32366f90c..0d8ca7ee2f 100644\n--- a/src/server/game/Battlegrounds/BattlegroundMgr.h\n+++ b/src/server/game/Battlegrounds/BattlegroundMgr.h\n@@ -206,6 +206,11 @@ class TC_GAME_API BattlegroundMgr\n         typedef std::map<uint32 /*mapId*/, BattlegroundTemplate*> BattlegroundMapTemplateContainer;\n         BattlegroundTemplateMap _battlegroundTemplates;\n         BattlegroundMapTemplateContainer _battlegroundMapTemplates;\n+\n+    //npcbot\n+public:\n+    BattlegroundDataContainer const& GetBgDataStore() const { return bgDataStore; }\n+    //end npcbot\n };\n \n #define sBattlegroundMgr BattlegroundMgr::instance()\ndiff --git a/src/server/game/Battlegrounds/BattlegroundQueue.cpp b/src/server/game/Battlegrounds/BattlegroundQueue.cpp\nindex 6d3cabc618..e97160f81a 100644\n--- a/src/server/game/Battlegrounds/BattlegroundQueue.cpp\n+++ b/src/server/game/Battlegrounds/BattlegroundQueue.cpp\n@@ -31,6 +31,14 @@\n #include \"Player.h\"\n #include \"World.h\"\n \n+//npcbot\n+//non-PCH\n+#include \"Creature.h\"\n+#include \"botconfig.h\"\n+#include \"botdatamgr.h\"\n+#include \"botmgr.h\"\n+//end npcbot\n+\n /*********************************************************/\n /***            BATTLEGROUND QUEUE SYSTEM              ***/\n /*********************************************************/\n@@ -173,6 +181,22 @@ GroupQueueInfo* BattlegroundQueue::AddGroup(Player* leader, Group const* group,\n             // add the pinfo to ginfo's list\n             ginfo->Players[member->GetGUID()]  = &pl_info;\n         }\n+\n+        //npcbot: queue bots (bg only)\n+        if (!arenateamid)\n+        {\n+            for (GroupBotReference const* itr = group->GetFirstBotMember(); itr != nullptr; itr = itr->next())\n+            {\n+                Creature const* bot = itr->GetSource();\n+                if (!bot)\n+                    continue;\n+                PlayerQueueInfo& pl_info = m_QueuedPlayers[bot->GetGUID()];\n+                pl_info.LastOnlineTime   = lastOnlineTime;\n+                pl_info.GroupInfo        = ginfo;\n+                ginfo->Players[bot->GetGUID()] = &pl_info;\n+            }\n+        }\n+        //end npcbot\n     }\n     else\n     {\n@@ -221,8 +245,97 @@ GroupQueueInfo* BattlegroundQueue::AddGroup(Player* leader, Group const* group,\n         //release mutex\n     }\n \n+    //npcbot: try to queue wandering bots\n+    if (!isRated && !isPremade && !arenateamid && !sBattlegroundMgr->isTesting())\n+    {\n+        if (!BotDataMgr::GenerateBattlegroundBots(leader, group, this, bracketEntry, ginfo))\n+        {\n+            TC_LOG_WARN(\"npcbots\", \"Did NOT generate bots for BG {} for leader {} ({} members)\",\n+                uint32(m_queueId.BattlemasterListId), leader->GetDebugInfo().c_str(), group ? group->GetMembersCount() : 0u);\n+        }\n+    }\n+    //end npcbot\n+\n+    return ginfo;\n+}\n+\n+//npcbot\n+GroupQueueInfo* BattlegroundQueue::AddBotAsGroup(ObjectGuid guid, uint32 team, PvPDifficultyEntry const* bracketEntry, bool isRated, uint32 ArenaRating, uint32 MatchmakerRating, uint32 arenateamid, uint32 PreviousOpponentsArenaTeamId)\n+{\n+    ASSERT(guid.IsCreature());\n+\n+    // create new ginfo\n+    GroupQueueInfo* ginfo            = new GroupQueueInfo;\n+    ginfo->ArenaTeamId               = arenateamid;\n+    ginfo->IsRated                   = isRated;\n+    ginfo->IsInvitedToBGInstanceGUID = 0;\n+    ginfo->JoinTime                  = GameTime::GetGameTimeMS();\n+    ginfo->RemoveInviteTime          = 0;\n+    ginfo->Team                      = Team(team);\n+    ginfo->ArenaTeamRating           = ArenaRating;\n+    ginfo->ArenaMatchmakerRating     = MatchmakerRating;\n+    ginfo->PreviousOpponentsTeamId   = PreviousOpponentsArenaTeamId;\n+    ginfo->OpponentsTeamRating       = 0;\n+    ginfo->OpponentsMatchmakerRating = 0;\n+\n+    ginfo->Players.clear();\n+\n+    //compute index (if group is premade or joined a rated match) to queues\n+    uint32 index = 0;\n+    if (!isRated)\n+        index += PVP_TEAMS_COUNT;\n+    if (ginfo->Team == HORDE)\n+        index++;\n+\n+    TC_LOG_DEBUG(\"npcbots\", \"Adding NPCBot {} to BattlegroundQueue bgTypeId : {}, bracket_id : {}, index : {}\", guid.GetEntry(), m_queueId.BattlemasterListId, m_queueId.BracketId, index);\n+\n+    uint32 lastOnlineTime = GameTime::GetGameTimeMS();\n+\n+    //announce world (this don't need mutex)\n+    if (isRated && sWorld->getBoolConfig(CONFIG_ARENA_QUEUE_ANNOUNCER_ENABLE))\n+    {\n+        ArenaTeam* team = sArenaTeamMgr->GetArenaTeamById(arenateamid);\n+        if (team)\n+            sWorld->SendWorldText(LANG_ARENA_QUEUE_ANNOUNCE_WORLD_JOIN, team->GetName().c_str(), m_queueId.TeamSize, m_queueId.TeamSize, ginfo->ArenaTeamRating);\n+    }\n+\n+    PlayerQueueInfo& pl_info = m_QueuedPlayers[guid];\n+    pl_info.LastOnlineTime   = lastOnlineTime;\n+    pl_info.GroupInfo        = ginfo;\n+    ginfo->Players[guid]     = &pl_info;\n+\n+    m_QueuedGroups[index].push_back(ginfo);\n+\n+    //announce to world, this code needs mutex\n+    if (!isRated && sWorld->getBoolConfig(CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_ENABLE))\n+    {\n+        if (Battleground const* bg = sBattlegroundMgr->GetBattlegroundTemplate(BattlegroundTypeId(m_queueId.BattlemasterListId)))\n+        {\n+            uint32 MinPlayers = bg->GetMinPlayersPerTeam();\n+            uint32 qHorde = 0;\n+            uint32 qAlliance = 0;\n+            uint32 q_min_level = bracketEntry->MinLevel;\n+            uint32 q_max_level = bracketEntry->MaxLevel;\n+            GroupsQueueType::const_iterator itr;\n+            for (itr = m_QueuedGroups[BG_QUEUE_NORMAL_ALLIANCE].begin(); itr != m_QueuedGroups[BG_QUEUE_NORMAL_ALLIANCE].end(); ++itr)\n+                if (!(*itr)->IsInvitedToBGInstanceGUID)\n+                    qAlliance += (*itr)->Players.size();\n+            for (itr = m_QueuedGroups[BG_QUEUE_NORMAL_HORDE].begin(); itr != m_QueuedGroups[BG_QUEUE_NORMAL_HORDE].end(); ++itr)\n+                if (!(*itr)->IsInvitedToBGInstanceGUID)\n+                    qHorde += (*itr)->Players.size();\n+\n+            // Show queue status to player only (when joining queue)\n+            if (!sWorld->getBoolConfig(CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_PLAYERONLY))\n+            {\n+                sWorld->SendWorldText(LANG_BG_QUEUE_ANNOUNCE_WORLD, bg->GetName().c_str(), q_min_level, q_max_level,\n+                    qAlliance, (MinPlayers > qAlliance) ? MinPlayers - qAlliance : (uint32)0, qHorde, (MinPlayers > qHorde) ? MinPlayers - qHorde : (uint32)0);\n+            }\n+        }\n+    }\n+\n     return ginfo;\n }\n+//end npcbot\n \n void BattlegroundQueue::PlayerInvitedToBGUpdateAverageWaitTime(GroupQueueInfo* ginfo)\n {\n@@ -361,6 +474,31 @@ void BattlegroundQueue::RemovePlayer(ObjectGuid guid, bool decreaseInvitedCount)\n         }\n     }\n \n+    //npcbot: remove player's bots\n+    if (!group->Players.empty() && guid.IsPlayer())\n+    {\n+        std::vector<ObjectGuid> botguids;\n+        botguids.reserve(BotCfg::GetMaxNpcBots(DEFAULT_MAX_LEVEL) / 2);\n+        BotDataMgr::GetNPCBotGuidsByOwner(botguids, guid);\n+        for (std::vector<ObjectGuid>::const_iterator ci = botguids.begin(); ci != botguids.end() && !group->Players.empty(); ++ci)\n+        {\n+            auto bqpitr = m_QueuedPlayers.find(*ci);\n+            if (bqpitr != m_QueuedPlayers.end())\n+            {\n+                auto bgpitr = group->Players.find(*ci);\n+                if (bgpitr != group->Players.end())\n+                    group->Players.erase(bgpitr);\n+\n+                if (decreaseInvitedCount && group->IsInvitedToBGInstanceGUID)\n+                    if (Battleground* bg = sBattlegroundMgr->GetBattleground(group->IsInvitedToBGInstanceGUID, BattlegroundTypeId(m_queueId.BattlemasterListId)))\n+                        bg->DecreaseInvitedCount(group->Team);\n+\n+                m_QueuedPlayers.erase(bqpitr);\n+            }\n+        }\n+    }\n+    //end npcbot\n+\n     // remove group queue info if needed\n     if (group->Players.empty())\n     {\n@@ -401,6 +539,15 @@ bool BattlegroundQueue::IsPlayerInvited(ObjectGuid pl_guid, const uint32 bgInsta\n         && qItr->second.GroupInfo->RemoveInviteTime == removeTime);\n }\n \n+//npcbot\n+bool BattlegroundQueue::IsBotInvited(ObjectGuid guid, uint32 bgInstanceGuid) const\n+{\n+    ASSERT(guid.IsCreature());\n+    QueuedPlayersMap::const_iterator qItr = m_QueuedPlayers.find(guid);\n+    return (qItr != m_QueuedPlayers.end() && qItr->second.GroupInfo->IsInvitedToBGInstanceGUID == bgInstanceGuid);\n+}\n+//end npcbot\n+\n bool BattlegroundQueue::GetPlayerGroupInfoData(ObjectGuid guid, GroupQueueInfo* ginfo)\n {\n     QueuedPlayersMap::const_iterator qItr = m_QueuedPlayers.find(guid);\n@@ -438,6 +585,15 @@ bool BattlegroundQueue::InviteGroupToBG(GroupQueueInfo* ginfo, Battleground* bg,\n         // loop through the players\n         for (std::map<ObjectGuid, PlayerQueueInfo*>::iterator itr = ginfo->Players.begin(); itr != ginfo->Players.end(); ++itr)\n         {\n+            //npcbot: invite bots\n+            if (itr->first.IsCreature())\n+            {\n+                PlayerInvitedToBGUpdateAverageWaitTime(ginfo);\n+                BotMgr::InviteBotToBG(itr->first, ginfo, bg);\n+                continue;\n+            }\n+            //end npcbot\n+\n             // get the player\n             Player* player = ObjectAccessor::FindConnectedPlayer(itr->first);\n             // if offline, skip him, this should not happen - player is removed from queue when he logs out\ndiff --git a/src/server/game/Battlegrounds/BattlegroundQueue.h b/src/server/game/Battlegrounds/BattlegroundQueue.h\nindex 7dfa68a430..a8325d4101 100644\n--- a/src/server/game/Battlegrounds/BattlegroundQueue.h\n+++ b/src/server/game/Battlegrounds/BattlegroundQueue.h\n@@ -82,6 +82,10 @@ class TC_GAME_API BattlegroundQueue\n         bool CheckNormalMatch(Battleground* bg_template, uint32 minPlayers, uint32 maxPlayers);\n         bool CheckSkirmishForSameFaction(uint32 minPlayersPerTeam);\n         GroupQueueInfo* AddGroup(Player* leader, Group const* group, PvPDifficultyEntry const* bracketEntry, bool isRated, bool isPremade, uint32 ArenaRating, uint32 MatchmakerRating, uint32 ArenaTeamId = 0, uint32 OpponentsArenaTeamId = 0);\n+        //npcbot\n+        GroupQueueInfo* AddBotAsGroup(ObjectGuid leaderGuid, uint32 team, PvPDifficultyEntry const* bracketEntry, bool isPremade, uint32 ArenaRating, uint32 MatchmakerRating, uint32 ArenaTeamId = 0, uint32 OpponentsArenaTeamId = 0);\n+        bool IsBotInvited(ObjectGuid guid, uint32 bgInstanceGuid) const;\n+        //end npcbot\n         void RemovePlayer(ObjectGuid guid, bool decreaseInvitedCount);\n         bool IsPlayerInvited(ObjectGuid pl_guid, const uint32 bgInstanceGuid, const uint32 removeTime);\n         bool GetPlayerGroupInfoData(ObjectGuid guid, GroupQueueInfo* ginfo);\ndiff --git a/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp\nindex 87b23d79a2..dc55b0802c 100644\n--- a/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp\n+++ b/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp\n@@ -29,6 +29,11 @@\n #include \"WorldSession.h\"\n #include \"WorldStatePackets.h\"\n \n+//npcbot\n+#include \"botdatamgr.h\"\n+#include \"botmgr.h\"\n+//end npcbot\n+\n void BattlegroundABScore::BuildObjectivesBlock(WorldPackets::Battleground::PVPLogData_Player& playerData)\n {\n     playerData.Stats = { BasesAssaulted, BasesDefended };\n@@ -234,6 +239,16 @@ void BattlegroundAB::AddPlayer(Player* player)\n         PlayerScores[player->GetGUID()] = new BattlegroundABScore(player->GetGUID());\n }\n \n+//npcbot\n+void BattlegroundAB::AddBot(Creature* bot)\n+{\n+    bool const isInBattleground = IsPlayerInBattleground(bot->GetGUID());\n+    Battleground::AddBot(bot);\n+    if (!isInBattleground)\n+        BotScores[bot->GetGUID()] = new BattlegroundABScore(bot->GetGUID());\n+}\n+//end npcbot\n+\n void BattlegroundAB::RemovePlayer(Player* /*player*/, ObjectGuid /*guid*/, uint32 /*team*/)\n {\n }\n@@ -537,6 +552,165 @@ void BattlegroundAB::EventPlayerClickedOnFlag(Player* source, GameObject* /*targ\n     PlaySoundToAll(sound);\n }\n \n+//npcbot\n+void BattlegroundAB::EventBotClickedOnFlag(Creature* bot, GameObject* /*target_obj*/)\n+{\n+    if (GetStatus() != STATUS_IN_PROGRESS)\n+        return;\n+\n+    uint8 node = BG_AB_NODE_STABLES;\n+    GameObject* obj = GetBgMap()->GetGameObject(BgObjects[node*8+7]);\n+    while ((node < BG_AB_DYNAMIC_NODES_COUNT) && ((!obj) || (!bot->IsWithinDistInMap(obj, 10))))\n+    {\n+        ++node;\n+        obj = GetBgMap()->GetGameObject(BgObjects[node*8+BG_AB_OBJECT_AURA_CONTESTED]);\n+    }\n+\n+    if (node == BG_AB_DYNAMIC_NODES_COUNT)\n+    {\n+        // this means our player isn't close to any of banners - maybe cheater ??\n+        return;\n+    }\n+\n+    TeamId teamIndex = GetBotTeamId(bot->GetGUID());\n+\n+    // Check if player really could use this banner, not cheated\n+    if (!(m_Nodes[node] == 0 || teamIndex == m_Nodes[node]%2))\n+        return;\n+\n+    bot->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT);\n+    uint32 sound = 0;\n+    // If node is neutral, change to contested\n+    if (m_Nodes[node] == BG_AB_NODE_TYPE_NEUTRAL)\n+    {\n+        UpdateBotScore(bot, SCORE_BASES_ASSAULTED, 1);\n+        m_prevNodes[node] = m_Nodes[node];\n+        m_Nodes[node] = teamIndex + 1;\n+        // burn current neutral banner\n+        _DelBanner(node, BG_AB_NODE_TYPE_NEUTRAL, 0);\n+        // create new contested banner\n+        _CreateBanner(node, BG_AB_NODE_TYPE_CONTESTED, teamIndex, true);\n+        _SendNodeUpdate(node);\n+        m_NodeTimers[node] = BG_AB_FLAG_CAPTURING_TIME;\n+\n+        if (teamIndex == TEAM_ALLIANCE)\n+            SendBroadcastText(ABNodes[node].TextAllianceClaims, CHAT_MSG_BG_SYSTEM_ALLIANCE, bot);\n+        else\n+            SendBroadcastText(ABNodes[node].TextHordeClaims, CHAT_MSG_BG_SYSTEM_HORDE, bot);\n+\n+        sound = BG_AB_SOUND_NODE_CLAIMED;\n+    }\n+    // If node is contested\n+    else if ((m_Nodes[node] == BG_AB_NODE_STATUS_ALLY_CONTESTED) || (m_Nodes[node] == BG_AB_NODE_STATUS_HORDE_CONTESTED))\n+    {\n+        // If last state is NOT occupied, change node to enemy-contested\n+        if (m_prevNodes[node] < BG_AB_NODE_TYPE_OCCUPIED)\n+        {\n+            UpdateBotScore(bot, SCORE_BASES_ASSAULTED, 1);\n+            m_prevNodes[node] = m_Nodes[node];\n+            m_Nodes[node] = uint8(teamIndex) + BG_AB_NODE_TYPE_CONTESTED;\n+            // burn current contested banner\n+            _DelBanner(node, BG_AB_NODE_TYPE_CONTESTED, !teamIndex);\n+            // create new contested banner\n+            _CreateBanner(node, BG_AB_NODE_TYPE_CONTESTED, teamIndex, true);\n+            _SendNodeUpdate(node);\n+            m_NodeTimers[node] = BG_AB_FLAG_CAPTURING_TIME;\n+\n+            if (teamIndex == TEAM_ALLIANCE)\n+                SendBroadcastText(ABNodes[node].TextAllianceAssaulted, CHAT_MSG_BG_SYSTEM_ALLIANCE, bot);\n+            else\n+                SendBroadcastText(ABNodes[node].TextHordeAssaulted, CHAT_MSG_BG_SYSTEM_HORDE, bot);\n+        }\n+        // If contested, change back to occupied\n+        else\n+        {\n+            UpdateBotScore(bot, SCORE_BASES_DEFENDED, 1);\n+            m_prevNodes[node] = m_Nodes[node];\n+            m_Nodes[node] = uint8(teamIndex) + BG_AB_NODE_TYPE_OCCUPIED;\n+            // burn current contested banner\n+            _DelBanner(node, BG_AB_NODE_TYPE_CONTESTED, !teamIndex);\n+            // create new occupied banner\n+            _CreateBanner(node, BG_AB_NODE_TYPE_OCCUPIED, teamIndex, true);\n+            _SendNodeUpdate(node);\n+            m_NodeTimers[node] = 0;\n+            _NodeOccupied(node, (teamIndex == TEAM_ALLIANCE) ? ALLIANCE : HORDE);\n+\n+            if (teamIndex == TEAM_ALLIANCE)\n+                SendBroadcastText(ABNodes[node].TextAllianceDefended, CHAT_MSG_BG_SYSTEM_ALLIANCE, bot);\n+            else\n+                SendBroadcastText(ABNodes[node].TextHordeDefended, CHAT_MSG_BG_SYSTEM_HORDE, bot);\n+        }\n+        sound = (teamIndex == TEAM_ALLIANCE) ? BG_AB_SOUND_NODE_ASSAULTED_ALLIANCE : BG_AB_SOUND_NODE_ASSAULTED_HORDE;\n+    }\n+    // If node is occupied, change to enemy-contested\n+    else\n+    {\n+        UpdateBotScore(bot, SCORE_BASES_ASSAULTED, 1);\n+        m_prevNodes[node] = m_Nodes[node];\n+        m_Nodes[node] = uint8(teamIndex) + BG_AB_NODE_TYPE_CONTESTED;\n+        // burn current occupied banner\n+        _DelBanner(node, BG_AB_NODE_TYPE_OCCUPIED, !teamIndex);\n+        // create new contested banner\n+        _CreateBanner(node, BG_AB_NODE_TYPE_CONTESTED, teamIndex, true);\n+        _SendNodeUpdate(node);\n+        _NodeDeOccupied(node);\n+        m_NodeTimers[node] = BG_AB_FLAG_CAPTURING_TIME;\n+\n+        if (teamIndex == TEAM_ALLIANCE)\n+            SendBroadcastText(ABNodes[node].TextAllianceAssaulted, CHAT_MSG_BG_SYSTEM_ALLIANCE, bot);\n+        else\n+            SendBroadcastText(ABNodes[node].TextHordeAssaulted, CHAT_MSG_BG_SYSTEM_HORDE, bot);\n+\n+        sound = (teamIndex == TEAM_ALLIANCE) ? BG_AB_SOUND_NODE_ASSAULTED_ALLIANCE : BG_AB_SOUND_NODE_ASSAULTED_HORDE;\n+    }\n+\n+    // If node is occupied again, send \"X has taken the Y\" msg.\n+    if (m_Nodes[node] >= BG_AB_NODE_TYPE_OCCUPIED)\n+    {\n+        if (teamIndex == TEAM_ALLIANCE)\n+            SendBroadcastText(ABNodes[node].TextAllianceTaken, CHAT_MSG_BG_SYSTEM_ALLIANCE);\n+        else\n+            SendBroadcastText(ABNodes[node].TextHordeTaken, CHAT_MSG_BG_SYSTEM_HORDE);\n+    }\n+    PlaySoundToAll(sound);\n+}\n+\n+bool BattlegroundAB::IsNodeOccupied(uint8 node, TeamId teamId) const\n+{\n+    if (node < BG_AB_DYNAMIC_NODES_COUNT)\n+    {\n+        switch (teamId)\n+        {\n+            case TEAM_ALLIANCE:\n+                return m_Nodes[node] == BG_AB_NODE_STATUS_ALLY_OCCUPIED;\n+            case TEAM_HORDE:\n+                return m_Nodes[node] == BG_AB_NODE_STATUS_HORDE_OCCUPIED;\n+            default:\n+                break;\n+        }\n+    }\n+\n+    return false;\n+}\n+bool BattlegroundAB::IsNodeContested(uint8 node, TeamId teamId) const\n+{\n+    if (node < BG_AB_DYNAMIC_NODES_COUNT)\n+    {\n+        switch (teamId)\n+        {\n+            case TEAM_ALLIANCE:\n+                return m_Nodes[node] == BG_AB_NODE_STATUS_ALLY_CONTESTED;\n+            case TEAM_HORDE:\n+                return m_Nodes[node] == BG_AB_NODE_STATUS_HORDE_CONTESTED;\n+            default:\n+                break;\n+        }\n+    }\n+\n+    return false;\n+}\n+//end npcbot\n+\n uint32 BattlegroundAB::GetPrematureWinner()\n {\n     // How many bases each team owns\n@@ -679,6 +853,83 @@ WorldSafeLocsEntry const* BattlegroundAB::GetClosestGraveyard(Player* player)\n     return good_entry;\n }\n \n+//npcbot\n+WorldSafeLocsEntry const* BattlegroundAB::GetClosestGraveyardForBot(WorldLocation const& curPos, uint32 team) const\n+{\n+    TeamId teamIndex = GetTeamIndexByTeamId(team);\n+\n+    // Is there any occupied node for this team?\n+    std::vector<uint8> nodes;\n+    for (uint8 i = 0; i < BG_AB_DYNAMIC_NODES_COUNT; ++i)\n+        if (m_Nodes[i] == teamIndex + 3)\n+            nodes.push_back(i);\n+\n+    WorldSafeLocsEntry const* good_entry = nullptr;\n+    // If so, select the closest node to place ghost on\n+    if (!nodes.empty())\n+    {\n+        float plr_x = curPos.GetPositionX();\n+        float plr_y = curPos.GetPositionY();\n+\n+        float mindist = 999999.0f;\n+        for (uint8 i = 0; i < nodes.size(); ++i)\n+        {\n+            WorldSafeLocsEntry const* entry = sWorldSafeLocsStore.LookupEntry(BG_AB_GraveyardIds[nodes[i]]);\n+            if (!entry)\n+                continue;\n+            float dist = (entry->Loc.X - plr_x)*(entry->Loc.X - plr_x)+(entry->Loc.Y - plr_y)*(entry->Loc.Y - plr_y);\n+            if (mindist > dist)\n+            {\n+                mindist = dist;\n+                good_entry = entry;\n+            }\n+        }\n+        nodes.clear();\n+    }\n+    // If not, place ghost on starting location\n+    if (!good_entry)\n+        good_entry = sWorldSafeLocsStore.LookupEntry(BG_AB_GraveyardIds[teamIndex+5]);\n+\n+    return good_entry;\n+}\n+\n+void BattlegroundAB::RewardKillScore(TeamId teamId, uint32 amount)\n+{\n+    // Score feature\n+    m_TeamScores[teamId] += amount;\n+    if (m_TeamScores[teamId] > BG_AB_MAX_TEAM_SCORE)\n+        m_TeamScores[teamId] = BG_AB_MAX_TEAM_SCORE;\n+    UpdateWorldState(teamId == TEAM_ALLIANCE ? BG_AB_OP_RESOURCES_ALLY : BG_AB_OP_RESOURCES_HORDE, m_TeamScores[teamId]);\n+    if (m_TeamScores[teamId] >= BG_AB_MAX_TEAM_SCORE)\n+        EndBattleground(teamId);\n+}\n+\n+void BattlegroundAB::HandleBotKillPlayer(Creature* killer, Player* victim)\n+{\n+    if (GetStatus() != STATUS_IN_PROGRESS)\n+        return;\n+\n+    Battleground::HandleBotKillPlayer(killer, victim);\n+    //RewardKillScore(GetBotTeamId(killer->GetGUID()), BG_AB_TickPoints[1]);\n+}\n+void BattlegroundAB::HandleBotKillBot(Creature* killer, Creature* victim)\n+{\n+    if (GetStatus() != STATUS_IN_PROGRESS)\n+        return;\n+\n+    Battleground::HandleBotKillBot(killer, victim);\n+    //RewardKillScore(GetBotTeamId(killer->GetGUID()), BG_AB_TickPoints[1]);\n+}\n+void BattlegroundAB::HandlePlayerKillBot(Creature* victim, Player* killer)\n+{\n+    if (GetStatus() != STATUS_IN_PROGRESS)\n+        return;\n+\n+    Battleground::HandlePlayerKillBot(victim, killer);\n+    //RewardKillScore(GetBotTeamId(killer->GetGUID()), BG_AB_TickPoints[1]);\n+}\n+//end npcbot\n+\n bool BattlegroundAB::UpdatePlayerScore(Player* player, uint32 type, uint32 value, bool doAddHonor)\n {\n     if (!Battleground::UpdatePlayerScore(player, type, value, doAddHonor))\ndiff --git a/src/server/game/Battlegrounds/Zones/BattlegroundAB.h b/src/server/game/Battlegrounds/Zones/BattlegroundAB.h\nindex d23b751b83..2e11e9ebae 100644\n--- a/src/server/game/Battlegrounds/Zones/BattlegroundAB.h\n+++ b/src/server/game/Battlegrounds/Zones/BattlegroundAB.h\n@@ -313,6 +313,18 @@ class BattlegroundAB : public Battleground\n         void EndBattleground(uint32 winner) override;\n         WorldSafeLocsEntry const* GetClosestGraveyard(Player* player) override;\n \n+        //npcbot\n+        WorldSafeLocsEntry const* GetClosestGraveyardForBot(WorldLocation const& curPos, uint32 team) const override;\n+        void AddBot(Creature* bot) override;\n+        void RewardKillScore(TeamId teamId, uint32 amount);\n+        void HandleBotKillPlayer(Creature* killer, Player* victim) override;\n+        void HandleBotKillBot(Creature* killer, Creature* victim) override;\n+        void HandlePlayerKillBot(Creature* victim, Player* killer) override;\n+        void EventBotClickedOnFlag(Creature* bot, GameObject* target_obj) override;\n+        bool IsNodeOccupied(uint8 node, TeamId teamId) const;\n+        bool IsNodeContested(uint8 node, TeamId teamId) const;\n+        //end npcbot\n+\n         /* Scorekeeping */\n         bool UpdatePlayerScore(Player* player, uint32 type, uint32 value, bool doAddHonor = true) override;\n \ndiff --git a/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp\nindex b6469b8251..157ec59b85 100644\n--- a/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp\n+++ b/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp\n@@ -28,6 +28,11 @@\n #include \"WorldSession.h\"\n #include \"WorldStatePackets.h\"\n \n+//npcbot\n+#include \"botdatamgr.h\"\n+#include \"botmgr.h\"\n+//end npcbot\n+\n void BattlegroundAVScore::BuildObjectivesBlock(WorldPackets::Battleground::PVPLogData_Player& playerData)\n {\n     playerData.Stats = { GraveyardsAssaulted, GraveyardsDefended, TowersAssaulted, TowersDefended, MinesCaptured };\n@@ -72,6 +77,33 @@ void BattlegroundAV::HandleKillPlayer(Player* player, Player* killer)\n     UpdateScore(player->GetTeam(), -1);\n }\n \n+//npcbot\n+void BattlegroundAV::HandleBotKillPlayer(Creature* killer, Player* victim)\n+{\n+    if (GetStatus() != STATUS_IN_PROGRESS)\n+        return;\n+\n+    Battleground::HandleBotKillPlayer(killer, victim);\n+    UpdateScore(victim->GetTeam(), -1);\n+}\n+void BattlegroundAV::HandleBotKillBot(Creature* killer, Creature* victim)\n+{\n+    if (GetStatus() != STATUS_IN_PROGRESS)\n+        return;\n+\n+    Battleground::HandleBotKillBot(killer, victim);\n+    UpdateScore(GetBotTeam(victim->GetGUID()), -1);\n+}\n+void BattlegroundAV::HandlePlayerKillBot(Creature* victim, Player* killer)\n+{\n+    if (GetStatus() != STATUS_IN_PROGRESS)\n+        return;\n+\n+    Battleground::HandlePlayerKillBot(victim, killer);\n+    UpdateScore(GetBotTeam(victim->GetGUID()), -1);\n+}\n+//end npcbot\n+\n void BattlegroundAV::HandleKillUnit(Creature* unit, Player* killer)\n {\n     TC_LOG_DEBUG(\"bg.battleground\", \"bg_av HandleKillUnit {}\", unit->GetEntry());\n@@ -149,6 +181,75 @@ void BattlegroundAV::HandleKillUnit(Creature* unit, Player* killer)\n         ChangeMineOwner(AV_SOUTH_MINE, killer->GetTeam());\n }\n \n+//npcbot\n+void BattlegroundAV::HandleBotKillUnit(Creature* killer, Creature* victim)\n+{\n+    TC_LOG_DEBUG(\"bg.battleground\", \"bg_av HandleBotKillUnit {}\", victim->GetEntry());\n+    if (GetStatus() != STATUS_IN_PROGRESS)\n+        return;\n+    uint32 entry = victim->GetEntry();\n+\n+    if (entry == BG_AV_CreatureInfo[AV_NPC_A_BOSS])\n+    {\n+        CastSpellOnTeam(23658, HORDE); //this is a spell which finishes a quest where a player has to kill the boss\n+        RewardReputationToTeam(729, BG_AV_REP_BOSS, HORDE);\n+        RewardHonorToTeam(GetBonusHonorFromKill(BG_AV_KILL_BOSS), HORDE);\n+        EndBattleground(HORDE);\n+        DelCreature(AV_CPLACE_TRIGGER17);\n+    }\n+    else if (entry == BG_AV_CreatureInfo[AV_NPC_H_BOSS])\n+    {\n+        CastSpellOnTeam(23658, ALLIANCE); //this is a spell which finishes a quest where a player has to kill the boss\n+        RewardReputationToTeam(730, BG_AV_REP_BOSS, ALLIANCE);\n+        RewardHonorToTeam(GetBonusHonorFromKill(BG_AV_KILL_BOSS), ALLIANCE);\n+        EndBattleground(ALLIANCE);\n+        DelCreature(AV_CPLACE_TRIGGER19);\n+    }\n+    else if (entry == BG_AV_CreatureInfo[AV_NPC_A_CAPTAIN])\n+    {\n+        if (!m_CaptainAlive[0])\n+        {\n+            TC_LOG_ERROR(\"bg.battleground\", \"Killed a Captain twice, please report this bug, if you haven't done \\\".respawn\\\"\");\n+            return;\n+        }\n+        m_CaptainAlive[0]=false;\n+        RewardReputationToTeam(729, BG_AV_REP_CAPTAIN, HORDE);\n+        RewardHonorToTeam(GetBonusHonorFromKill(BG_AV_KILL_CAPTAIN), HORDE);\n+        UpdateScore(ALLIANCE, (-1)*BG_AV_RES_CAPTAIN);\n+        //spawn destroyed aura\n+        for (uint8 i=0; i <= 9; i++)\n+            SpawnBGObject(BG_AV_OBJECT_BURN_BUILDING_ALLIANCE+i, RESPAWN_IMMEDIATELY);\n+        DelCreature(AV_CPLACE_TRIGGER16);\n+\n+        if (Creature* herold = GetBGCreature(AV_CPLACE_HERALD))\n+            herold->AI()->Talk(TEXT_STORMPIKE_GENERAL_DEAD);\n+    }\n+    else if (entry == BG_AV_CreatureInfo[AV_NPC_H_CAPTAIN])\n+    {\n+        if (!m_CaptainAlive[1])\n+        {\n+            TC_LOG_ERROR(\"bg.battleground\", \"Killed a Captain twice, please report this bug, if you haven't done \\\".respawn\\\"\");\n+            return;\n+        }\n+        m_CaptainAlive[1]=false;\n+        RewardReputationToTeam(730, BG_AV_REP_CAPTAIN, ALLIANCE);\n+        RewardHonorToTeam(GetBonusHonorFromKill(BG_AV_KILL_CAPTAIN), ALLIANCE);\n+        UpdateScore(HORDE, (-1)*BG_AV_RES_CAPTAIN);\n+        //spawn destroyed aura\n+        for (uint8 i=0; i <= 9; i++)\n+            SpawnBGObject(BG_AV_OBJECT_BURN_BUILDING_HORDE+i, RESPAWN_IMMEDIATELY);\n+        DelCreature(AV_CPLACE_TRIGGER18);\n+\n+        if (Creature* herold = GetBGCreature(AV_CPLACE_HERALD))\n+            herold->AI()->Talk(TEXT_FROSTWOLF_GENERAL_DEAD);\n+    }\n+    else if (entry == BG_AV_CreatureInfo[AV_NPC_N_MINE_N_4] || entry == BG_AV_CreatureInfo[AV_NPC_N_MINE_A_4] || entry == BG_AV_CreatureInfo[AV_NPC_N_MINE_H_4])\n+        ChangeMineOwner(AV_NORTH_MINE, GetBotTeam(killer->GetGUID()));\n+    else if (entry == BG_AV_CreatureInfo[AV_NPC_S_MINE_N_4] || entry == BG_AV_CreatureInfo[AV_NPC_S_MINE_A_4] || entry == BG_AV_CreatureInfo[AV_NPC_S_MINE_H_4])\n+        ChangeMineOwner(AV_SOUTH_MINE, GetBotTeam(killer->GetGUID()));\n+}\n+//end npcbot\n+\n void BattlegroundAV::HandleQuestComplete(uint32 questid, Player* player)\n {\n     if (GetStatus() != STATUS_IN_PROGRESS)\n@@ -447,6 +548,16 @@ void BattlegroundAV::AddPlayer(Player* player)\n         PlayerScores[player->GetGUID()] = new BattlegroundAVScore(player->GetGUID());\n }\n \n+//npcbot\n+void BattlegroundAV::AddBot(Creature* bot)\n+{\n+    bool const isInBattleground = IsPlayerInBattleground(bot->GetGUID());\n+    Battleground::AddBot(bot);\n+    if (!isInBattleground)\n+        BotScores[bot->GetGUID()] = new BattlegroundAVScore(bot->GetGUID());\n+}\n+//end npcbot\n+\n void BattlegroundAV::EndBattleground(uint32 winner)\n {\n     //calculate bonuskills for both teams:\n@@ -500,6 +611,18 @@ void BattlegroundAV::RemovePlayer(Player* player, ObjectGuid /*guid*/, uint32 /*\n     player->RemoveAurasDueToSpell(AV_BUFF_H_CAPTAIN);\n }\n \n+//npcbot\n+void BattlegroundAV::RemoveBot(ObjectGuid guid)\n+{\n+    if (Creature const* bot = BotDataMgr::FindBot(guid.GetEntry()))\n+    {\n+        const_cast<Creature*>(bot)->RemoveAurasDueToSpell(AV_BUFF_ARMOR);\n+        const_cast<Creature*>(bot)->RemoveAurasDueToSpell(AV_BUFF_A_CAPTAIN);\n+        const_cast<Creature*>(bot)->RemoveAurasDueToSpell(AV_BUFF_H_CAPTAIN);\n+    }\n+}\n+//end npcbot\n+\n void BattlegroundAV::HandleAreaTrigger(Player* player, uint32 trigger)\n {\n     if (GetStatus() != STATUS_IN_PROGRESS)\n@@ -799,8 +922,18 @@ BG_AV_Nodes BattlegroundAV::GetNodeThroughObject(uint32 object)\n     return BG_AV_Nodes(0);\n }\n \n+//npcbot\n+/*\n+//end npcbot\n uint32 BattlegroundAV::GetObjectThroughNode(BG_AV_Nodes node)\n+//npcbot\n+*/\n+uint32 BattlegroundAV::GetObjectThroughNode(BG_AV_Nodes node, bool log) const\n+//end npcbot\n { //this function is the counterpart to GetNodeThroughObject()\n+    //npcbot\n+    if (log)\n+    //end npcbot\n     TC_LOG_DEBUG(\"bg.battleground\", \"bg_AV GetObjectThroughNode {}\", node);\n     if (m_Nodes[node].Owner == ALLIANCE)\n     {\n@@ -867,6 +1000,36 @@ void BattlegroundAV::EventPlayerClickedOnFlag(Player* source, GameObject* target\n     }\n }\n \n+//npcbot\n+void BattlegroundAV::EventBotClickedOnFlag(Creature* bot, GameObject* target_obj)\n+{\n+    if (GetStatus() != STATUS_IN_PROGRESS)\n+        return;\n+    int32 object = GetObjectType(target_obj->GetGUID());\n+    TC_LOG_DEBUG(\"bg.battleground\", \"BG_AV bot is using gameobject {} with type {}\", target_obj->GetEntry(), object);\n+    if (object < 0)\n+        return;\n+    switch (target_obj->GetEntry())\n+    {\n+        case BG_AV_OBJECTID_BANNER_A:\n+        case BG_AV_OBJECTID_BANNER_A_B:\n+        case BG_AV_OBJECTID_BANNER_H:\n+        case BG_AV_OBJECTID_BANNER_H_B:\n+        case BG_AV_OBJECTID_BANNER_SNOWFALL_N:\n+            EventBotAssaultsPoint(bot, object);\n+            break;\n+        case BG_AV_OBJECTID_BANNER_CONT_A:\n+        case BG_AV_OBJECTID_BANNER_CONT_A_B:\n+        case BG_AV_OBJECTID_BANNER_CONT_H:\n+        case BG_AV_OBJECTID_BANNER_CONT_H_B:\n+            EventBotDefendsPoint(bot, object);\n+            break;\n+        default:\n+            break;\n+    }\n+}\n+//end npcbot\n+\n void BattlegroundAV::EventPlayerDefendsPoint(Player* player, uint32 object)\n {\n     ASSERT(GetStatus() == STATUS_IN_PROGRESS);\n@@ -933,6 +1096,72 @@ void BattlegroundAV::EventPlayerDefendsPoint(Player* player, uint32 object)\n     UpdatePlayerScore(player, IsTower(node) ? SCORE_TOWERS_DEFENDED : SCORE_GRAVEYARDS_DEFENDED, 1);\n }\n \n+void BattlegroundAV::EventBotDefendsPoint(Creature* bot, uint32 object)\n+{\n+    ASSERT(GetStatus() == STATUS_IN_PROGRESS);\n+    BG_AV_Nodes node = GetNodeThroughObject(object);\n+\n+    uint32 owner = m_Nodes[node].Owner; //maybe should name it prevowner\n+    uint32 team = GetBotTeam(bot->GetGUID());\n+\n+    if (owner == team || m_Nodes[node].State != POINT_ASSAULTED)\n+        return;\n+    if (m_Nodes[node].TotalOwner == AV_NEUTRAL_TEAM)\n+    { //until snowfall doesn't belong to anyone it is better handled in assault-code\n+        ASSERT(node == BG_AV_NODES_SNOWFALL_GRAVE); //currently the only neutral grave\n+        EventBotAssaultsPoint(bot, object);\n+        return;\n+    }\n+    TC_LOG_DEBUG(\"bg.battleground\", \"player defends point object: {} node: {}\", object, node);\n+    if (m_Nodes[node].PrevOwner != team)\n+    {\n+        TC_LOG_ERROR(\"bg.battleground\", \"BG_AV: player defends point which doesn't belong to his team {}\", node);\n+        return;\n+    }\n+\n+   //spawn new go :)\n+    if (m_Nodes[node].Owner == ALLIANCE)\n+        SpawnBGObject(object+22, RESPAWN_IMMEDIATELY); //spawn horde banner\n+    else\n+        SpawnBGObject(object-22, RESPAWN_IMMEDIATELY); //spawn alliance banner\n+\n+    if (!IsTower(node))\n+    {\n+        SpawnBGObject(BG_AV_OBJECT_AURA_N_FIRSTAID_STATION + 3 * node, RESPAWN_ONE_DAY);\n+        SpawnBGObject(BG_AV_OBJECT_AURA_A_FIRSTAID_STATION + uint32(GetTeamIndexByTeamId(team)) + 3 * node, RESPAWN_IMMEDIATELY);\n+    }\n+        // despawn old go\n+    SpawnBGObject(object, RESPAWN_ONE_DAY);\n+\n+    DefendNode(node, team);\n+    PopulateNode(node);\n+    UpdateNodeWorldState(node);\n+\n+    if (IsTower(node))\n+    {\n+        //spawn big flag+aura on top of tower\n+        SpawnBGObject(BG_AV_OBJECT_TAURA_A_DUNBALDAR_SOUTH+(2*(node-BG_AV_NODES_DUNBALDAR_SOUTH)), (team == ALLIANCE)? RESPAWN_IMMEDIATELY : RESPAWN_ONE_DAY);\n+        SpawnBGObject(BG_AV_OBJECT_TAURA_H_DUNBALDAR_SOUTH+(2*(node-BG_AV_NODES_DUNBALDAR_SOUTH)), (team == HORDE)? RESPAWN_IMMEDIATELY : RESPAWN_ONE_DAY);\n+        SpawnBGObject(BG_AV_OBJECT_TFLAG_A_DUNBALDAR_SOUTH+(2*(node-BG_AV_NODES_DUNBALDAR_SOUTH)), (team == ALLIANCE)? RESPAWN_IMMEDIATELY : RESPAWN_ONE_DAY);\n+        SpawnBGObject(BG_AV_OBJECT_TFLAG_H_DUNBALDAR_SOUTH+(2*(node-BG_AV_NODES_DUNBALDAR_SOUTH)), (team == HORDE)? RESPAWN_IMMEDIATELY : RESPAWN_ONE_DAY);\n+    }\n+    else if (node == BG_AV_NODES_SNOWFALL_GRAVE) //snowfall eyecandy\n+    {\n+        for (uint8 i = 0; i < 4; i++)\n+        {\n+            SpawnBGObject(((owner == ALLIANCE)?BG_AV_OBJECT_SNOW_EYECANDY_PA : BG_AV_OBJECT_SNOW_EYECANDY_PH)+i, RESPAWN_ONE_DAY);\n+            SpawnBGObject(((team == ALLIANCE)?BG_AV_OBJECT_SNOW_EYECANDY_A : BG_AV_OBJECT_SNOW_EYECANDY_H)+i, RESPAWN_IMMEDIATELY);\n+        }\n+    }\n+\n+    if (StaticNodeInfo const* nodeInfo = GetStaticNodeInfo(node))\n+        if (Creature* herold = GetBGCreature(AV_CPLACE_HERALD))\n+            herold->AI()->Talk(team == ALLIANCE ? nodeInfo->TextIds.AllianceCapture : nodeInfo->TextIds.HordeCapture);\n+\n+    // update the statistic for the defending player\n+    UpdateBotScore(bot, IsTower(node) ? SCORE_TOWERS_DEFENDED : SCORE_GRAVEYARDS_DEFENDED, 1);\n+}\n+\n void BattlegroundAV::EventPlayerAssaultsPoint(Player* player, uint32 object)\n {\n     ASSERT(GetStatus() == STATUS_IN_PROGRESS);\n@@ -1024,6 +1253,98 @@ void BattlegroundAV::EventPlayerAssaultsPoint(Player* player, uint32 object)\n     UpdatePlayerScore(player, (IsTower(node)) ? SCORE_TOWERS_ASSAULTED : SCORE_GRAVEYARDS_ASSAULTED, 1);\n }\n \n+void BattlegroundAV::EventBotAssaultsPoint(Creature* bot, uint32 object)\n+{\n+    ASSERT(GetStatus() == STATUS_IN_PROGRESS);\n+\n+    BG_AV_Nodes node = GetNodeThroughObject(object);\n+    uint32 owner = m_Nodes[node].Owner; //maybe name it prevowner\n+    uint32 team  = GetBotTeam(bot->GetGUID());\n+    TC_LOG_DEBUG(\"bg.battleground\", \"bg_av: player assaults point object {} node {}\", object, node);\n+    if (owner == team || team == m_Nodes[node].TotalOwner)\n+        return; //surely a gm used this object\n+\n+    if (node == BG_AV_NODES_SNOWFALL_GRAVE) //snowfall is a bit special in capping + it gets eyecandy stuff\n+    {\n+        if (object == BG_AV_OBJECT_FLAG_N_SNOWFALL_GRAVE) //initial capping\n+        {\n+            if (!(owner == AV_NEUTRAL_TEAM && m_Nodes[node].TotalOwner == AV_NEUTRAL_TEAM))\n+                return;\n+\n+            if (team == ALLIANCE)\n+                SpawnBGObject(BG_AV_OBJECT_FLAG_C_A_SNOWFALL_GRAVE, RESPAWN_IMMEDIATELY);\n+            else\n+                SpawnBGObject(BG_AV_OBJECT_FLAG_C_H_SNOWFALL_GRAVE, RESPAWN_IMMEDIATELY);\n+            SpawnBGObject(BG_AV_OBJECT_AURA_N_FIRSTAID_STATION+3*node, RESPAWN_IMMEDIATELY); //neutral aura spawn\n+        }\n+        else if (m_Nodes[node].TotalOwner == AV_NEUTRAL_TEAM) //recapping, when no team owns this node realy\n+        {\n+            if (!(m_Nodes[node].State != POINT_CONTROLED))\n+                return;\n+\n+            if (team == ALLIANCE)\n+                SpawnBGObject(object-11, RESPAWN_IMMEDIATELY);\n+            else\n+                SpawnBGObject(object+11, RESPAWN_IMMEDIATELY);\n+        }\n+        //eyecandy\n+        uint32 spawn, despawn;\n+        if (team == ALLIANCE)\n+        {\n+            despawn = (m_Nodes[node].State == POINT_ASSAULTED)?BG_AV_OBJECT_SNOW_EYECANDY_PH : BG_AV_OBJECT_SNOW_EYECANDY_H;\n+            spawn = BG_AV_OBJECT_SNOW_EYECANDY_PA;\n+        }\n+        else\n+        {\n+            despawn = (m_Nodes[node].State == POINT_ASSAULTED)?BG_AV_OBJECT_SNOW_EYECANDY_PA : BG_AV_OBJECT_SNOW_EYECANDY_A;\n+            spawn = BG_AV_OBJECT_SNOW_EYECANDY_PH;\n+        }\n+        for (uint8 i = 0; i < 4; i++)\n+        {\n+            SpawnBGObject(despawn+i, RESPAWN_ONE_DAY);\n+            SpawnBGObject(spawn+i, RESPAWN_IMMEDIATELY);\n+        }\n+    }\n+\n+    AssaultNode(node, team);\n+\n+    //if snowfall gots capped it can be handled like all other graveyards\n+    if (m_Nodes[node].TotalOwner != AV_NEUTRAL_TEAM)\n+    {\n+        ASSERT(owner != AV_NEUTRAL_TEAM);\n+        if (team == ALLIANCE)\n+            SpawnBGObject(object-22, RESPAWN_IMMEDIATELY);\n+        else\n+            SpawnBGObject(object+22, RESPAWN_IMMEDIATELY);\n+        if (IsTower(node))\n+        { //spawning/despawning of bigflag+aura\n+            SpawnBGObject(BG_AV_OBJECT_TAURA_A_DUNBALDAR_SOUTH+(2*(node-BG_AV_NODES_DUNBALDAR_SOUTH)), (team == ALLIANCE)? RESPAWN_IMMEDIATELY : RESPAWN_ONE_DAY);\n+            SpawnBGObject(BG_AV_OBJECT_TAURA_H_DUNBALDAR_SOUTH+(2*(node-BG_AV_NODES_DUNBALDAR_SOUTH)), (team == HORDE)? RESPAWN_IMMEDIATELY : RESPAWN_ONE_DAY);\n+            SpawnBGObject(BG_AV_OBJECT_TFLAG_A_DUNBALDAR_SOUTH+(2*(node-BG_AV_NODES_DUNBALDAR_SOUTH)), (team == ALLIANCE)? RESPAWN_IMMEDIATELY : RESPAWN_ONE_DAY);\n+            SpawnBGObject(BG_AV_OBJECT_TFLAG_H_DUNBALDAR_SOUTH+(2*(node-BG_AV_NODES_DUNBALDAR_SOUTH)), (team == HORDE)? RESPAWN_IMMEDIATELY : RESPAWN_ONE_DAY);\n+        }\n+        else\n+        {\n+            //spawning/despawning of aura\n+            SpawnBGObject(BG_AV_OBJECT_AURA_N_FIRSTAID_STATION + 3 * node, RESPAWN_IMMEDIATELY); //neutral aura spawn\n+            SpawnBGObject(BG_AV_OBJECT_AURA_A_FIRSTAID_STATION + uint32(GetTeamIndexByTeamId(owner)) + 3 * node, RESPAWN_ONE_DAY); //teeamaura despawn\n+\n+            RelocateDeadPlayers(BgCreatures[node]);\n+        }\n+        DePopulateNode(node);\n+    }\n+\n+    SpawnBGObject(object, RESPAWN_ONE_DAY); //delete old banner\n+    UpdateNodeWorldState(node);\n+\n+    if (StaticNodeInfo const* nodeInfo = GetStaticNodeInfo(node))\n+        if (Creature* herold = GetBGCreature(AV_CPLACE_HERALD))\n+            herold->AI()->Talk(team == ALLIANCE ? nodeInfo->TextIds.AllianceAttack : nodeInfo->TextIds.HordeAttack);\n+\n+    // update the statistic for the assaulting player\n+    UpdateBotScore(bot, (IsTower(node)) ? SCORE_TOWERS_ASSAULTED : SCORE_GRAVEYARDS_ASSAULTED, 1);\n+}\n+\n void BattlegroundAV::FillInitialWorldStates(WorldPackets::WorldState::InitWorldStates& packet)\n {\n     for (uint8 itr = BG_AV_NODES_FIRSTAID_STATION; itr < BG_AV_NODES_MAX; ++itr)\n@@ -1130,6 +1451,41 @@ WorldSafeLocsEntry const* BattlegroundAV::GetClosestGraveyard(Player* player)\n     return pGraveyard;\n }\n \n+//npcbot\n+WorldSafeLocsEntry const* BattlegroundAV::GetClosestGraveyardForBot(WorldLocation const& curPos, uint32 team) const\n+{\n+    WorldSafeLocsEntry const* pGraveyard = nullptr;\n+    WorldSafeLocsEntry const* entry = nullptr;\n+    float dist = 0;\n+    float minDist = 0;\n+    float x, y;\n+\n+    curPos.GetPosition(x, y);\n+\n+    pGraveyard = sWorldSafeLocsStore.LookupEntry(BG_AV_GraveyardIds[GetTeamIndexByTeamId(team)+7]);\n+    minDist = (pGraveyard->Loc.X - x)*(pGraveyard->Loc.X - x)+(pGraveyard->Loc.Y - y)*(pGraveyard->Loc.Y - y);\n+\n+    for (uint8 i = BG_AV_NODES_FIRSTAID_STATION; i <= BG_AV_NODES_FROSTWOLF_HUT; ++i)\n+    {\n+        if (m_Nodes[i].Owner == team && m_Nodes[i].State == POINT_CONTROLED)\n+        {\n+            entry = sWorldSafeLocsStore.LookupEntry(BG_AV_GraveyardIds[i]);\n+            if (entry)\n+            {\n+                dist = (entry->Loc.X - x) * (entry->Loc.X - x) + (entry->Loc.Y - y) * (entry->Loc.Y - y);\n+                if (dist < minDist)\n+                {\n+                    minDist = dist;\n+                    pGraveyard = entry;\n+                }\n+            }\n+        }\n+    }\n+\n+    return pGraveyard;\n+}\n+//end npcbot\n+\n bool BattlegroundAV::SetupBattleground()\n {\n     // Create starting objects\ndiff --git a/src/server/game/Battlegrounds/Zones/BattlegroundAV.h b/src/server/game/Battlegrounds/Zones/BattlegroundAV.h\nindex 8e40f65a6a..102f754c91 100644\n--- a/src/server/game/Battlegrounds/Zones/BattlegroundAV.h\n+++ b/src/server/game/Battlegrounds/Zones/BattlegroundAV.h\n@@ -1643,6 +1643,22 @@ class BattlegroundAV : public Battleground\n \n         WorldSafeLocsEntry const* GetClosestGraveyard(Player* player) override;\n \n+        //npcbot\n+        WorldSafeLocsEntry const* GetClosestGraveyardForBot(WorldLocation const& curPos, uint32 team) const override;\n+        void AddBot(Creature* bot) override;\n+        void RemoveBot(ObjectGuid guid) override;\n+        void HandleBotKillPlayer(Creature* killer, Player* victim) override;\n+        void HandleBotKillBot(Creature* killer, Creature* victim) override;\n+        void HandlePlayerKillBot(Creature* victim, Player* killer) override;\n+        void HandleBotKillUnit(Creature* killer, Creature* victim) override;\n+        void EventBotClickedOnFlag(Creature* bot, GameObject* target_obj) override;\n+        void EventBotAssaultsPoint(Creature* bot, uint32 object);\n+        void EventBotDefendsPoint(Creature* bot, uint32 object);\n+        BG_AV_NodeInfo const (&GetNodes() const)[BG_AV_NODES_MAX] { return m_Nodes; }\n+        uint32 GetObjectThroughNodeForBot(BG_AV_Nodes node, bool log = false) { return GetObjectThroughNode(node, log); }\n+        uint32 GetMineOwner(uint8 mine_idx) const { return m_Mine_Owner[mine_idx]; }\n+        //end npcbot\n+\n         // Achievement: Av perfection and Everything counts\n         bool CheckAchievementCriteriaMeet(uint32 criteriaId, Player const* source, Unit const* target = nullptr, uint32 miscvalue1 = 0) override;\n \n@@ -1673,7 +1689,14 @@ class BattlegroundAV : public Battleground\n         }\n \n         BG_AV_Nodes GetNodeThroughObject(uint32 object);\n+        //npcbot\n+        /*\n+        //end npcbot\n         uint32 GetObjectThroughNode(BG_AV_Nodes node);\n+        //npcbot\n+        */\n+        uint32 GetObjectThroughNode(BG_AV_Nodes node, bool log = true) const;\n+        //end npcbot\n         bool IsTower(BG_AV_Nodes node) { return m_Nodes[node].Tower; }\n \n         /*mine*/\ndiff --git a/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp\nindex fa461afcf2..ab834afa83 100644\n--- a/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp\n+++ b/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp\n@@ -29,6 +29,10 @@\n #include \"Util.h\"\n #include \"WorldStatePackets.h\"\n \n+//npcbot\n+#include \"botdatamgr.h\"\n+//end npcbot\n+\n // these variables aren't used outside of this file, so declare them only here\n uint32 BG_EY_HonorScoreTicks[BG_HONOR_MODE_NUM] =\n {\n@@ -172,6 +176,25 @@ void BattlegroundEY::CheckSomeoneJoinedPoint()\n             uint8 j = 0;\n             while (j < m_PlayersNearPoint[EY_POINTS_MAX].size())\n             {\n+                if (m_PlayersNearPoint[EY_POINTS_MAX][j].IsCreature())\n+                {\n+                    Creature const* bot = BotDataMgr::FindBot(m_PlayersNearPoint[EY_POINTS_MAX][j].GetEntry());\n+                    if (!bot)\n+                    {\n+                        TC_LOG_ERROR(\"bg.battleground\", \"BattlegroundEY:CheckSomeoneJoinedPoint: Bot {} could not be found!\", m_PlayersNearPoint[EY_POINTS_MAX][j].GetEntry());\n+                        ++j;\n+                        continue;\n+                    }\n+                    if (bot->IsAlive() && !bot->HasInvisibilityAura() && !bot->HasStealthAura() && bot->IsWithinDistInMap(obj, BG_EY_POINT_RADIUS))\n+                    {\n+                        m_PlayersNearPoint[i].push_back(m_PlayersNearPoint[EY_POINTS_MAX][j]);\n+                        m_PlayersNearPoint[EY_POINTS_MAX].erase(m_PlayersNearPoint[EY_POINTS_MAX].begin() + j);\n+                    }\n+                    else\n+                        ++j;\n+\n+                    continue;\n+                }\n                 Player* player = ObjectAccessor::FindPlayer(m_PlayersNearPoint[EY_POINTS_MAX][j]);\n                 if (!player)\n                 {\n@@ -213,6 +236,29 @@ void BattlegroundEY::CheckSomeoneLeftPoint()\n             uint8 j = 0;\n             while (j < m_PlayersNearPoint[i].size())\n             {\n+                if (m_PlayersNearPoint[i][j].IsCreature())\n+                {\n+                    Creature const* bot = BotDataMgr::FindBot(m_PlayersNearPoint[i][j].GetEntry());\n+                    if (!bot)\n+                    {\n+                        TC_LOG_ERROR(\"bg.battleground\", \"BattlegroundEY:CheckSomeoneLeftPoint: Bot {} could not be found!\", m_PlayersNearPoint[i][j].GetEntry());\n+                        m_PlayersNearPoint[EY_POINTS_MAX].push_back(m_PlayersNearPoint[i][j]);\n+                        m_PlayersNearPoint[i].erase(m_PlayersNearPoint[i].begin() + j);\n+                        continue;\n+                    }\n+                    if (!(bot->IsAlive() && !bot->HasInvisibilityAura() && !bot->HasStealthAura() && bot->IsWithinDistInMap(obj, BG_EY_POINT_RADIUS)))\n+                    {\n+                        m_PlayersNearPoint[EY_POINTS_MAX].push_back(m_PlayersNearPoint[i][j]);\n+                        m_PlayersNearPoint[i].erase(m_PlayersNearPoint[i].begin() + j);\n+                    }\n+                    else\n+                    {\n+                        m_CurrentPointPlayersCount[2 * i + GetBotTeamId(bot->GetGUID())]++;\n+                        ++j;\n+                    }\n+\n+                    continue;\n+                }\n                 Player* player = ObjectAccessor::FindPlayer(m_PlayersNearPoint[i][j]);\n                 if (!player)\n                 {\n@@ -267,6 +313,33 @@ void BattlegroundEY::UpdatePointStatuses()\n \n         for (uint8 i = 0; i < m_PlayersNearPoint[point].size(); ++i)\n         {\n+            if (m_PlayersNearPoint[point][i].IsCreature())\n+            {\n+                if (Creature const* bot = BotDataMgr::FindBot(m_PlayersNearPoint[point][i].GetEntry()))\n+                {\n+                    uint32 botteam = GetBotTeam(bot->GetGUID());\n+\n+                    if (pointOwnerTeamId != m_PointOwnedByTeam[point])\n+                    {\n+                        //point was uncontrolled and player is from team which captured point\n+                        if (m_PointState[point] == EY_POINT_STATE_UNCONTROLLED && botteam == pointOwnerTeamId)\n+                            EventBotTeamCapturedPoint(bot, point);\n+\n+                        //point was under control and player isn't from team which controlled it\n+                        if (m_PointState[point] == EY_POINT_UNDER_CONTROL && botteam != m_PointOwnedByTeam[point])\n+                            EventBotTeamLostPoint(bot, point);\n+                    }\n+\n+                    /// @workaround The original AreaTrigger is covered by a bigger one and not triggered on client side.\n+                    if (point == FEL_REAVER && m_PointOwnedByTeam[point] == botteam)\n+                        if (m_FlagState && GetFlagPickerGUID() == bot->GetGUID())\n+                            if (bot->GetDistance(2044.0f, 1729.729f, 1190.03f) < 3.0f)\n+                                EventBotCapturedFlag(const_cast<Creature*>(bot), BG_EY_OBJECT_FLAG_FEL_REAVER);\n+                }\n+\n+                continue;\n+            }\n+\n             Player* player = ObjectAccessor::FindPlayer(m_PlayersNearPoint[point][i]);\n             if (player)\n             {\n@@ -365,6 +438,18 @@ void BattlegroundEY::AddPlayer(Player* player)\n     m_PlayersNearPoint[EY_POINTS_MAX].push_back(player->GetGUID());\n }\n \n+//npcbot\n+void BattlegroundEY::AddBot(Creature* bot)\n+{\n+    bool const isInBattleground = IsPlayerInBattleground(bot->GetGUID());\n+    Battleground::AddBot(bot);\n+    if (!isInBattleground)\n+        BotScores[bot->GetGUID()] = new BattlegroundEYScore(bot->GetGUID());\n+\n+    m_PlayersNearPoint[EY_POINTS_MAX].push_back(bot->GetGUID());\n+}\n+//end npcbot\n+\n void BattlegroundEY::RemovePlayer(Player* player, ObjectGuid guid, uint32 /*team*/)\n {\n     // sometimes flag aura not removed :(\n@@ -389,6 +474,32 @@ void BattlegroundEY::RemovePlayer(Player* player, ObjectGuid guid, uint32 /*team\n     }\n }\n \n+//npcbot\n+void BattlegroundEY::RemoveBot(ObjectGuid guid)\n+{\n+    // sometimes flag aura not removed :(\n+    for (int j = EY_POINTS_MAX; j >= 0; --j)\n+    {\n+        for (size_t i = 0; i < m_PlayersNearPoint[j].size(); ++i)\n+            if (m_PlayersNearPoint[j][i] == guid)\n+                m_PlayersNearPoint[j].erase(m_PlayersNearPoint[j].begin() + i);\n+    }\n+    if (IsFlagPickedup())\n+    {\n+        if (m_FlagKeeper == guid)\n+        {\n+            if (Creature const* bot = BotDataMgr::FindBot(guid.GetEntry()))\n+                EventBotDroppedFlag(const_cast<Creature*>(bot));\n+            else\n+            {\n+                SetFlagPicker(ObjectGuid::Empty);\n+                RespawnFlag(true);\n+            }\n+        }\n+    }\n+}\n+//end npcbot\n+\n void BattlegroundEY::HandleAreaTrigger(Player* player, uint32 trigger)\n {\n     if (GetStatus() != STATUS_IN_PROGRESS)\n@@ -437,6 +548,59 @@ void BattlegroundEY::HandleAreaTrigger(Player* player, uint32 trigger)\n     }\n }\n \n+//npcbot\n+void BattlegroundEY::HandleBotAreaTrigger(Creature* bot, uint32 trigger)\n+{\n+    if (GetStatus() != STATUS_IN_PROGRESS)\n+        return;\n+\n+    if (!bot->IsAlive())\n+        return;\n+\n+    ObjectGuid botguid = bot->GetGUID();\n+    uint32 botteam = GetBotTeam(botguid);\n+\n+    switch (trigger)\n+    {\n+        case TR_BLOOD_ELF_POINT:\n+            if (m_PointState[BLOOD_ELF] == EY_POINT_UNDER_CONTROL && m_PointOwnedByTeam[BLOOD_ELF] == botteam)\n+                if (m_FlagState && GetFlagPickerGUID() == botguid)\n+                    EventBotCapturedFlag(bot, BG_EY_OBJECT_FLAG_BLOOD_ELF);\n+            break;\n+        case TR_FEL_REAVER_POINT:\n+            if (m_PointState[FEL_REAVER] == EY_POINT_UNDER_CONTROL && m_PointOwnedByTeam[FEL_REAVER] == botteam)\n+                if (m_FlagState && GetFlagPickerGUID() == botguid)\n+                    EventBotCapturedFlag(bot, BG_EY_OBJECT_FLAG_FEL_REAVER);\n+            break;\n+        case TR_MAGE_TOWER_POINT:\n+            if (m_PointState[MAGE_TOWER] == EY_POINT_UNDER_CONTROL && m_PointOwnedByTeam[MAGE_TOWER] == botteam)\n+                if (m_FlagState && GetFlagPickerGUID() == botguid)\n+                    EventBotCapturedFlag(bot, BG_EY_OBJECT_FLAG_MAGE_TOWER);\n+            break;\n+        case TR_DRAENEI_RUINS_POINT:\n+            if (m_PointState[DRAENEI_RUINS] == EY_POINT_UNDER_CONTROL && m_PointOwnedByTeam[DRAENEI_RUINS] == botteam)\n+                if (m_FlagState && GetFlagPickerGUID() == botguid)\n+                    EventBotCapturedFlag(bot, BG_EY_OBJECT_FLAG_DRAENEI_RUINS);\n+            break;\n+        case 4512:\n+        case 4515:\n+        case 4517:\n+        case 4519:\n+        case 4530:\n+        case 4531:\n+        case 4568:\n+        case 4569:\n+        case 4570:\n+        case 4571:\n+        case 5866:\n+            break;\n+        default:\n+            Battleground::HandleBotAreaTrigger(bot, trigger);\n+            break;\n+    }\n+}\n+//end npcbot\n+\n bool BattlegroundEY::SetupBattleground()\n {\n         // doors\n@@ -604,6 +768,35 @@ void BattlegroundEY::HandleKillPlayer(Player* player, Player* killer)\n     EventPlayerDroppedFlag(player);\n }\n \n+//npcbot\n+void BattlegroundEY::HandleBotKillPlayer(Creature* killer, Player* victim)\n+{\n+    if (GetStatus() != STATUS_IN_PROGRESS)\n+        return;\n+\n+    Battleground::HandleBotKillPlayer(killer, victim);\n+    EventPlayerDroppedFlag(victim);\n+}\n+\n+void BattlegroundEY::HandleBotKillBot(Creature* killer, Creature* victim)\n+{\n+    if (GetStatus() != STATUS_IN_PROGRESS)\n+        return;\n+\n+    Battleground::HandleBotKillBot(killer, victim);\n+    EventBotDroppedFlag(victim);\n+}\n+\n+void BattlegroundEY::HandlePlayerKillBot(Creature* victim, Player* killer)\n+{\n+    if (GetStatus() != STATUS_IN_PROGRESS)\n+        return;\n+\n+    Battleground::HandlePlayerKillBot(victim, killer);\n+    EventBotDroppedFlag(victim);\n+}\n+//end npcbot\n+\n void BattlegroundEY::EventPlayerDroppedFlag(Player* player)\n {\n     if (GetStatus() != STATUS_IN_PROGRESS)\n@@ -640,6 +833,42 @@ void BattlegroundEY::EventPlayerDroppedFlag(Player* player)\n         SendBroadcastText(BG_EY_TEXT_FLAG_DROPPED, CHAT_MSG_BG_SYSTEM_HORDE);\n }\n \n+//end npcbot\n+void BattlegroundEY::EventBotDroppedFlag(Creature* bot)\n+{\n+    if (GetStatus() != STATUS_IN_PROGRESS)\n+    {\n+        if (IsFlagPickedup() && GetFlagPickerGUID() == bot->GetGUID())\n+        {\n+            SetFlagPicker(ObjectGuid::Empty);\n+            bot->RemoveAurasDueToSpell(BG_EY_NETHERSTORM_FLAG_SPELL);\n+        }\n+        return;\n+    }\n+\n+    if (!IsFlagPickedup())\n+        return;\n+\n+    if (GetFlagPickerGUID() != bot->GetGUID())\n+        return;\n+\n+    SetFlagPicker(ObjectGuid::Empty);\n+    bot->RemoveAurasDueToSpell(BG_EY_NETHERSTORM_FLAG_SPELL);\n+    m_FlagState = BG_EY_FLAG_STATE_ON_GROUND;\n+    m_FlagsTimer = BG_EY_FLAG_RESPAWN_TIME;\n+    bot->CastSpell(bot, SPELL_RECENTLY_DROPPED_FLAG, true);\n+    bot->CastSpell(bot, BG_EY_PLAYER_DROPPED_FLAG_SPELL, true);\n+    //this does not work correctly :((it should remove flag carrier name)\n+    UpdateWorldState(NETHERSTORM_FLAG_STATE_HORDE, BG_EY_FLAG_STATE_WAIT_RESPAWN);\n+    UpdateWorldState(NETHERSTORM_FLAG_STATE_ALLIANCE, BG_EY_FLAG_STATE_WAIT_RESPAWN);\n+\n+    if (GetBotTeamId(bot->GetGUID()) == TEAM_ALLIANCE)\n+        SendBroadcastText(BG_EY_TEXT_FLAG_DROPPED, CHAT_MSG_BG_SYSTEM_ALLIANCE);\n+    else\n+        SendBroadcastText(BG_EY_TEXT_FLAG_DROPPED, CHAT_MSG_BG_SYSTEM_HORDE);\n+}\n+//end npcbot\n+\n void BattlegroundEY::EventPlayerClickedOnFlag(Player* player, GameObject* target_obj)\n {\n     if (GetStatus() != STATUS_IN_PROGRESS || IsFlagPickedup() || !player->IsWithinDistInMap(target_obj, 10))\n@@ -672,6 +901,42 @@ void BattlegroundEY::EventPlayerClickedOnFlag(Player* player, GameObject* target\n         SendBroadcastText(BG_EY_TEXT_TAKEN_FLAG, CHAT_MSG_BG_SYSTEM_HORDE, player);\n }\n \n+//end npcbot\n+void BattlegroundEY::EventBotClickedOnFlag(Creature* bot, GameObject* target_obj)\n+{\n+    if (GetStatus() != STATUS_IN_PROGRESS || IsFlagPickedup() || !bot->IsWithinDistInMap(target_obj, 10))\n+        return;\n+\n+    TeamId botteamid = GetBotTeamId(bot->GetGUID());\n+\n+    if (botteamid == TEAM_ALLIANCE)\n+    {\n+        UpdateWorldState(NETHERSTORM_FLAG_STATE_ALLIANCE, BG_EY_FLAG_STATE_ON_PLAYER);\n+        PlaySoundToAll(BG_EY_SOUND_FLAG_PICKED_UP_ALLIANCE);\n+    }\n+    else\n+    {\n+        UpdateWorldState(NETHERSTORM_FLAG_STATE_HORDE, BG_EY_FLAG_STATE_ON_PLAYER);\n+        PlaySoundToAll(BG_EY_SOUND_FLAG_PICKED_UP_HORDE);\n+    }\n+\n+    if (m_FlagState == BG_EY_FLAG_STATE_ON_BASE)\n+        UpdateWorldState(NETHERSTORM_FLAG, 0);\n+    m_FlagState = BG_EY_FLAG_STATE_ON_PLAYER;\n+\n+    SpawnBGObject(BG_EY_OBJECT_FLAG_NETHERSTORM, RESPAWN_ONE_DAY);\n+    SetFlagPicker(bot->GetGUID());\n+    //get flag aura on player\n+    bot->CastSpell(bot, BG_EY_NETHERSTORM_FLAG_SPELL, true);\n+    bot->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT);\n+\n+    if (botteamid == TEAM_ALLIANCE)\n+        SendBroadcastText(BG_EY_TEXT_TAKEN_FLAG, CHAT_MSG_BG_SYSTEM_ALLIANCE, bot);\n+    else\n+        SendBroadcastText(BG_EY_TEXT_TAKEN_FLAG, CHAT_MSG_BG_SYSTEM_HORDE, bot);\n+}\n+//end npcbot\n+\n void BattlegroundEY::EventTeamLostPoint(Player* player, uint32 Point)\n {\n     if (GetStatus() != STATUS_IN_PROGRESS)\n@@ -717,7 +982,62 @@ void BattlegroundEY::EventTeamLostPoint(Player* player, uint32 Point)\n \n     //remove bonus honor aura trigger creature when node is lost\n     DelCreature(Point + 6);//NULL checks are in DelCreature! 0-5 spirit guides\n+\n+    //npcbot\n+    RelocateDeadPlayers(BgCreatures[Point]);\n+    //end npcbot\n+}\n+\n+//npcbot\n+void BattlegroundEY::EventBotTeamLostPoint(Creature const* bot, uint32 Point)\n+{\n+    if (GetStatus() != STATUS_IN_PROGRESS)\n+        return;\n+\n+    //Natural point\n+    uint32 Team = m_PointOwnedByTeam[Point];\n+\n+    if (!Team)\n+        return;\n+\n+    if (Team == ALLIANCE)\n+    {\n+        m_TeamPointsCount[TEAM_ALLIANCE]--;\n+        SpawnBGObject(m_LosingPointTypes[Point].DespawnObjectTypeAlliance, RESPAWN_ONE_DAY);\n+        SpawnBGObject(m_LosingPointTypes[Point].DespawnObjectTypeAlliance + 1, RESPAWN_ONE_DAY);\n+        SpawnBGObject(m_LosingPointTypes[Point].DespawnObjectTypeAlliance + 2, RESPAWN_ONE_DAY);\n+    }\n+    else\n+    {\n+        m_TeamPointsCount[TEAM_HORDE]--;\n+        SpawnBGObject(m_LosingPointTypes[Point].DespawnObjectTypeHorde, RESPAWN_ONE_DAY);\n+        SpawnBGObject(m_LosingPointTypes[Point].DespawnObjectTypeHorde + 1, RESPAWN_ONE_DAY);\n+        SpawnBGObject(m_LosingPointTypes[Point].DespawnObjectTypeHorde + 2, RESPAWN_ONE_DAY);\n+    }\n+\n+    SpawnBGObject(m_LosingPointTypes[Point].SpawnNeutralObjectType, RESPAWN_IMMEDIATELY);\n+    SpawnBGObject(m_LosingPointTypes[Point].SpawnNeutralObjectType + 1, RESPAWN_IMMEDIATELY);\n+    SpawnBGObject(m_LosingPointTypes[Point].SpawnNeutralObjectType + 2, RESPAWN_IMMEDIATELY);\n+\n+    //buff isn't despawned\n+\n+    m_PointOwnedByTeam[Point] = EY_POINT_NO_OWNER;\n+    m_PointState[Point] = EY_POINT_NO_OWNER;\n+\n+    if (Team == ALLIANCE)\n+        SendBroadcastText(m_LosingPointTypes[Point].MessageIdAlliance, CHAT_MSG_BG_SYSTEM_ALLIANCE, bot);\n+    else\n+        SendBroadcastText(m_LosingPointTypes[Point].MessageIdHorde, CHAT_MSG_BG_SYSTEM_HORDE, bot);\n+\n+    UpdatePointsIcons(Team, Point);\n+    UpdatePointsCount(Team);\n+\n+    //remove bonus honor aura trigger creature when node is lost\n+    DelCreature(Point + 6);//NULL checks are in DelCreature! 0-5 spirit guides\n+\n+    RelocateDeadPlayers(BgCreatures[Point]);\n }\n+//end npcbot\n \n void BattlegroundEY::EventTeamCapturedPoint(Player* player, uint32 Point)\n {\n@@ -782,6 +1102,71 @@ void BattlegroundEY::EventTeamCapturedPoint(Player* player, uint32 Point)\n     }\n }\n \n+//npcbot\n+void BattlegroundEY::EventBotTeamCapturedPoint(Creature const* bot, uint32 Point)\n+{\n+    if (GetStatus() != STATUS_IN_PROGRESS)\n+        return;\n+\n+    uint32 Team = GetBotTeam(bot->GetGUID());\n+\n+    SpawnBGObject(m_CapturingPointTypes[Point].DespawnNeutralObjectType, RESPAWN_ONE_DAY);\n+    SpawnBGObject(m_CapturingPointTypes[Point].DespawnNeutralObjectType + 1, RESPAWN_ONE_DAY);\n+    SpawnBGObject(m_CapturingPointTypes[Point].DespawnNeutralObjectType + 2, RESPAWN_ONE_DAY);\n+\n+    if (Team == ALLIANCE)\n+    {\n+        m_TeamPointsCount[TEAM_ALLIANCE]++;\n+        SpawnBGObject(m_CapturingPointTypes[Point].SpawnObjectTypeAlliance, RESPAWN_IMMEDIATELY);\n+        SpawnBGObject(m_CapturingPointTypes[Point].SpawnObjectTypeAlliance + 1, RESPAWN_IMMEDIATELY);\n+        SpawnBGObject(m_CapturingPointTypes[Point].SpawnObjectTypeAlliance + 2, RESPAWN_IMMEDIATELY);\n+    }\n+    else\n+    {\n+        m_TeamPointsCount[TEAM_HORDE]++;\n+        SpawnBGObject(m_CapturingPointTypes[Point].SpawnObjectTypeHorde, RESPAWN_IMMEDIATELY);\n+        SpawnBGObject(m_CapturingPointTypes[Point].SpawnObjectTypeHorde + 1, RESPAWN_IMMEDIATELY);\n+        SpawnBGObject(m_CapturingPointTypes[Point].SpawnObjectTypeHorde + 2, RESPAWN_IMMEDIATELY);\n+    }\n+\n+    //buff isn't respawned\n+\n+    m_PointOwnedByTeam[Point] = Team;\n+    m_PointState[Point] = EY_POINT_UNDER_CONTROL;\n+\n+    if (Team == ALLIANCE)\n+        SendBroadcastText(m_CapturingPointTypes[Point].MessageIdAlliance, CHAT_MSG_BG_SYSTEM_ALLIANCE, bot);\n+    else\n+        SendBroadcastText(m_CapturingPointTypes[Point].MessageIdHorde, CHAT_MSG_BG_SYSTEM_HORDE, bot);\n+\n+    if (!BgCreatures[Point].IsEmpty())\n+        DelCreature(Point);\n+\n+    WorldSafeLocsEntry const* sg = sWorldSafeLocsStore.LookupEntry(m_CapturingPointTypes[Point].GraveyardId);\n+    if (!sg || !AddSpiritGuide(Point, sg->Loc.X, sg->Loc.Y, sg->Loc.Z, 3.124139f, GetTeamIndexByTeamId(Team)))\n+        TC_LOG_ERROR(\"bg.battleground\", \"BatteGroundEY: Failed to spawn spirit guide. point: {}, team: {}, graveyard_id: {}\",\n+            Point, Team, m_CapturingPointTypes[Point].GraveyardId);\n+\n+//    SpawnBGCreature(Point, RESPAWN_IMMEDIATELY);\n+\n+    UpdatePointsIcons(Team, Point);\n+    UpdatePointsCount(Team);\n+\n+    Creature* trigger = GetBGCreature(Point + 6, false);//0-5 spirit guides\n+    if (!trigger)\n+        trigger = AddCreature(WORLD_TRIGGER, Point+6, BG_EY_TriggerPositions[Point], GetTeamIndexByTeamId(Team));\n+\n+    //add bonus honor aura trigger creature when node is accupied\n+    //cast bonus aura (+50% honor in 25yards)\n+    //aura should only apply to players who have accupied the node, set correct faction for trigger\n+    if (trigger)\n+    {\n+        trigger->SetFaction(Team == ALLIANCE ? FACTION_ALLIANCE_GENERIC : FACTION_HORDE_GENERIC);\n+        trigger->CastSpell(trigger, SPELL_HONORABLE_DEFENDER_25Y, false);\n+    }\n+}\n+//end npcbot\n+\n void BattlegroundEY::EventPlayerCapturedFlag(Player* player, uint32 BgObjectType)\n {\n     if (GetStatus() != STATUS_IN_PROGRESS || GetFlagPickerGUID() != player->GetGUID())\n@@ -816,6 +1201,43 @@ void BattlegroundEY::EventPlayerCapturedFlag(Player* player, uint32 BgObjectType\n     UpdatePlayerScore(player, SCORE_FLAG_CAPTURES, 1);\n }\n \n+//npcbot\n+void BattlegroundEY::EventBotCapturedFlag(Creature* bot, uint32 bgObjectType)\n+{\n+    if (GetStatus() != STATUS_IN_PROGRESS || GetFlagPickerGUID() != bot->GetGUID())\n+        return;\n+\n+    TeamId botteamid = GetBotTeamId(bot->GetGUID());\n+\n+    SetFlagPicker(ObjectGuid::Empty);\n+    m_FlagState = BG_EY_FLAG_STATE_WAIT_RESPAWN;\n+    bot->RemoveAurasDueToSpell(BG_EY_NETHERSTORM_FLAG_SPELL);\n+\n+    bot->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT);\n+\n+    if (botteamid == TEAM_ALLIANCE)\n+    {\n+        SendBroadcastText(BG_EY_TEXT_ALLIANCE_CAPTURED_FLAG, CHAT_MSG_BG_SYSTEM_ALLIANCE, bot);\n+        PlaySoundToAll(BG_EY_SOUND_FLAG_CAPTURED_ALLIANCE);\n+    }\n+    else\n+    {\n+        SendBroadcastText(BG_EY_TEXT_HORDE_CAPTURED_FLAG, CHAT_MSG_BG_SYSTEM_HORDE, bot);\n+        PlaySoundToAll(BG_EY_SOUND_FLAG_CAPTURED_HORDE);\n+    }\n+\n+    SpawnBGObject(bgObjectType, RESPAWN_IMMEDIATELY);\n+\n+    m_FlagsTimer = BG_EY_FLAG_RESPAWN_TIME;\n+    m_FlagCapturedBgObjectType = bgObjectType;\n+\n+    if (m_TeamPointsCount[botteamid] > 0)\n+        AddPoints(GetBotTeam(bot->GetGUID()), BG_EY_FlagPoints[m_TeamPointsCount[botteamid] - 1]);\n+\n+    UpdateBotScore(bot, SCORE_FLAG_CAPTURES, 1);\n+}\n+//end npcbot\n+\n bool BattlegroundEY::UpdatePlayerScore(Player* player, uint32 type, uint32 value, bool doAddHonor)\n {\n     if (!Battleground::UpdatePlayerScore(player, type, value, doAddHonor))\n@@ -832,6 +1254,15 @@ bool BattlegroundEY::UpdatePlayerScore(Player* player, uint32 type, uint32 value\n     return true;\n }\n \n+//end npcbot\n+bool BattlegroundEY::UpdateBotScore(Creature const* bot, uint32 type, uint32 value, bool doAddHonor)\n+{\n+    if (!Battleground::UpdateBotScore(bot, type, value, doAddHonor))\n+        return false;\n+    return true;\n+}\n+//end npcbot\n+\n void BattlegroundEY::FillInitialWorldStates(WorldPackets::WorldState::InitWorldStates& packet)\n {\n     packet.Worldstates.emplace_back(EY_HORDE_BASE, m_TeamPointsCount[TEAM_HORDE]);\n@@ -923,6 +1354,61 @@ WorldSafeLocsEntry const* BattlegroundEY::GetClosestGraveyard(Player* player)\n     return nearestEntry;\n }\n \n+//npcbot\n+WorldSafeLocsEntry const* BattlegroundEY::GetClosestGraveyardForBot(WorldLocation const& curPos, uint32 team) const\n+{\n+    uint32 g_id = 0;\n+\n+    switch (team)\n+    {\n+        case ALLIANCE: g_id = EY_GRAVEYARD_MAIN_ALLIANCE; break;\n+        case HORDE:    g_id = EY_GRAVEYARD_MAIN_HORDE;    break;\n+        default:       return nullptr;\n+    }\n+\n+    float distance, nearestDistance;\n+\n+    WorldSafeLocsEntry const* entry = nullptr;\n+    WorldSafeLocsEntry const* nearestEntry = nullptr;\n+    entry = sWorldSafeLocsStore.LookupEntry(g_id);\n+    nearestEntry = entry;\n+\n+    if (!entry)\n+    {\n+        TC_LOG_ERROR(\"bg.battleground\", \"BattlegroundEY: The main team graveyard could not be found. The graveyard system will not be operational!\");\n+        return nullptr;\n+    }\n+\n+    float x = curPos.GetPositionX();\n+    float y = curPos.GetPositionY();\n+    float z = curPos.GetPositionZ();\n+\n+    distance = (entry->Loc.X - x)*(entry->Loc.X - x) + (entry->Loc.Y - y)*(entry->Loc.Y - y) + (entry->Loc.Z - z)*(entry->Loc.Z - z);\n+    nearestDistance = distance;\n+\n+    for (uint8 i = 0; i < EY_POINTS_MAX; ++i)\n+    {\n+        if (m_PointOwnedByTeam[i] == team && m_PointState[i] == EY_POINT_UNDER_CONTROL)\n+        {\n+            entry = sWorldSafeLocsStore.LookupEntry(m_CapturingPointTypes[i].GraveyardId);\n+            if (!entry)\n+                TC_LOG_ERROR(\"bg.battleground\", \"BattlegroundEY: Graveyard {} could not be found for bot at pos: {}\", m_CapturingPointTypes[i].GraveyardId, curPos.ToString());\n+            else\n+            {\n+                distance = (entry->Loc.X - x)*(entry->Loc.X - x) + (entry->Loc.Y - y)*(entry->Loc.Y - y) + (entry->Loc.Z - z)*(entry->Loc.Z - z);\n+                if (distance < nearestDistance)\n+                {\n+                    nearestDistance = distance;\n+                    nearestEntry = entry;\n+                }\n+            }\n+        }\n+    }\n+\n+    return nearestEntry;\n+}\n+//end npcbot\n+\n bool BattlegroundEY::IsAllNodesControlledByTeam(uint32 team) const\n {\n     uint32 count = 0;\ndiff --git a/src/server/game/Battlegrounds/Zones/BattlegroundEY.h b/src/server/game/Battlegrounds/Zones/BattlegroundEY.h\nindex 81b3d897ca..c57bb04331 100644\n--- a/src/server/game/Battlegrounds/Zones/BattlegroundEY.h\n+++ b/src/server/game/Battlegrounds/Zones/BattlegroundEY.h\n@@ -409,6 +409,24 @@ class BattlegroundEY : public Battleground\n         void SetDroppedFlagGUID(ObjectGuid guid, int32 /*TeamID*/ = -1) override  { m_DroppedFlagGUID = guid; }\n         ObjectGuid GetDroppedFlagGUID() const { return m_DroppedFlagGUID; }\n \n+        //npcbot\n+        void AddBot(Creature* bot) override;\n+        WorldSafeLocsEntry const* GetClosestGraveyardForBot(WorldLocation const& curPos, uint32 team) const override;\n+        void RemoveBot(ObjectGuid guid) override;\n+        bool UpdateBotScore(Creature const* bot, uint32 type, uint32 value, bool doAddHonor = true) override;\n+        void HandleBotKillPlayer(Creature* killer, Player* victim) override;\n+        void HandleBotKillBot(Creature* killer, Creature* victim) override;\n+        void HandlePlayerKillBot(Creature* victim, Player* killer) override;\n+        void EventBotDroppedFlag(Creature* bot) override;\n+        void EventBotClickedOnFlag(Creature* bot, GameObject* target_obj) override;\n+        void HandleBotAreaTrigger(Creature* bot, uint32 trigger) override;\n+        void EventBotCapturedFlag(Creature* bot, uint32 bgObjectType);\n+        void EventBotTeamCapturedPoint(Creature const* bot, uint32 Point);\n+        void EventBotTeamLostPoint(Creature const* bot, uint32 Point);\n+        GuidVector const& GetPlayersNearPoint(uint8 point) const { return m_PlayersNearPoint[point]; }\n+        TeamId GetPointOwner(uint8 point) const { return m_PointOwnedByTeam[point] == ALLIANCE ? TEAM_ALLIANCE : m_PointOwnedByTeam[point] == HORDE ? TEAM_HORDE : TEAM_NEUTRAL; }\n+        //end npcbot\n+\n         /* Battleground Events */\n         void EventPlayerClickedOnFlag(Player* Source, GameObject* target_obj) override;\n         void EventPlayerDroppedFlag(Player* Source) override;\ndiff --git a/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp\nindex 7862710613..a9b5beb507 100644\n--- a/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp\n+++ b/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp\n@@ -28,6 +28,12 @@\n #include \"WorldPacket.h\"\n #include \"WorldStatePackets.h\"\n \n+//npcbot\n+#include \"botdatamgr.h\"\n+#include \"botmgr.h\"\n+#include \"Creature.h\"\n+//end npcbot\n+\n // these variables aren't used outside of this file, so declare them only here\n enum BG_WSG_Rewards\n {\n@@ -246,6 +252,16 @@ void BattlegroundWS::AddPlayer(Player* player)\n         PlayerScores[player->GetGUID()] = new BattlegroundWGScore(player->GetGUID());\n }\n \n+//npcbot\n+void BattlegroundWS::AddBot(Creature* bot)\n+{\n+    bool const isInBattleground = IsPlayerInBattleground(bot->GetGUID());\n+    Battleground::AddBot(bot);\n+    if (!isInBattleground)\n+        BotScores[bot->GetGUID()] = new BattlegroundWGScore(bot->GetGUID());\n+}\n+//end npcbot\n+\n void BattlegroundWS::RespawnFlag(uint32 Team, bool captured)\n {\n     if (Team == ALLIANCE)\n@@ -384,12 +400,113 @@ void BattlegroundWS::EventPlayerCapturedFlag(Player* player)\n }\n void BattlegroundWS::HandleFlagRoomCapturePoint(int32 team)\n {\n+    //npcbot\n+    if (GetFlagPickerGUID(team).IsCreature())\n+    {\n+        Creature const* flagBotCarrier = BotDataMgr::FindBot(GetFlagPickerGUID(team).GetEntry());\n+        uint32 areaBotTrigger = team == TEAM_ALLIANCE ? 3647 : 3646;\n+        if (flagBotCarrier && BotMgr::IsBotInAreaTriggerRadius(flagBotCarrier, sAreaTriggerStore.LookupEntry(areaBotTrigger)))\n+            EventBotCapturedFlag(const_cast<Creature*>(flagBotCarrier));\n+        return;\n+    }\n+    //end npcbot\n+\n     Player* flagCarrier = ObjectAccessor::GetPlayer(GetBgMap(), GetFlagPickerGUID(team));\n     uint32 areaTrigger = team == TEAM_ALLIANCE ? 3647 : 3646;\n     if (flagCarrier && flagCarrier->IsInAreaTriggerRadius(sAreaTriggerStore.LookupEntry(areaTrigger)))\n         EventPlayerCapturedFlag(flagCarrier);\n }\n \n+//npcbot\n+void BattlegroundWS::EventBotCapturedFlag(Creature* bot)\n+{\n+    if (GetStatus() != STATUS_IN_PROGRESS)\n+        return;\n+\n+    uint32 winner = 0;\n+\n+    bot->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT);\n+    if (GetBotTeam(bot->GetGUID()) == ALLIANCE)\n+    {\n+        if (!IsHordeFlagPickedup())\n+            return;\n+        SetHordeFlagPicker(ObjectGuid::Empty);              // must be before aura remove to prevent 2 events (drop+capture) at the same time\n+                                                            // horde flag in base (but not respawned yet)\n+        _flagState[TEAM_HORDE] = BG_WS_FLAG_STATE_WAIT_RESPAWN;\n+                                                            // Drop Horde Flag from Player\n+        bot->RemoveAurasDueToSpell(BG_WS_SPELL_WARSONG_FLAG);\n+        if (_flagDebuffState == 1)\n+          bot->RemoveAurasDueToSpell(WS_SPELL_FOCUSED_ASSAULT);\n+        else if (_flagDebuffState == 2)\n+          bot->RemoveAurasDueToSpell(WS_SPELL_BRUTAL_ASSAULT);\n+\n+        if (GetTeamScore(TEAM_ALLIANCE) < BG_WS_MAX_TEAM_SCORE)\n+            AddPoint(ALLIANCE, 1);\n+        PlaySoundToAll(BG_WS_SOUND_FLAG_CAPTURED_ALLIANCE);\n+        RewardReputationToTeam(890, m_ReputationCapture, ALLIANCE);\n+    }\n+    else\n+    {\n+        if (!IsAllianceFlagPickedup())\n+            return;\n+        SetAllianceFlagPicker(ObjectGuid::Empty);           // must be before aura remove to prevent 2 events (drop+capture) at the same time\n+                                                            // alliance flag in base (but not respawned yet)\n+        _flagState[TEAM_ALLIANCE] = BG_WS_FLAG_STATE_WAIT_RESPAWN;\n+                                                            // Drop Alliance Flag from Player\n+        bot->RemoveAurasDueToSpell(BG_WS_SPELL_SILVERWING_FLAG);\n+        if (_flagDebuffState == 1)\n+          bot->RemoveAurasDueToSpell(WS_SPELL_FOCUSED_ASSAULT);\n+        else if (_flagDebuffState == 2)\n+          bot->RemoveAurasDueToSpell(WS_SPELL_BRUTAL_ASSAULT);\n+\n+        if (GetTeamScore(TEAM_HORDE) < BG_WS_MAX_TEAM_SCORE)\n+            AddPoint(HORDE, 1);\n+        PlaySoundToAll(BG_WS_SOUND_FLAG_CAPTURED_HORDE);\n+        RewardReputationToTeam(889, m_ReputationCapture, HORDE);\n+    }\n+    //for flag capture is reward 2 honorable kills\n+    RewardHonorToTeam(GetBonusHonorFromKill(2), GetBotTeam(bot->GetGUID()));\n+\n+    SpawnBGObject(BG_WS_OBJECT_H_FLAG, BG_WS_FLAG_RESPAWN_TIME);\n+    SpawnBGObject(BG_WS_OBJECT_A_FLAG, BG_WS_FLAG_RESPAWN_TIME);\n+\n+    if (GetBotTeam(bot->GetGUID()) == ALLIANCE)\n+        SendBroadcastText(BG_WS_TEXT_CAPTURED_HORDE_FLAG, CHAT_MSG_BG_SYSTEM_ALLIANCE, bot);\n+    else\n+        SendBroadcastText(BG_WS_TEXT_CAPTURED_ALLIANCE_FLAG, CHAT_MSG_BG_SYSTEM_HORDE, bot);\n+\n+    UpdateFlagState(GetBotTeam(bot->GetGUID()), 1);                  // flag state none\n+    UpdateTeamScore(GetBotTeamId(bot->GetGUID()));\n+    // only flag capture should be updated\n+    UpdateBotScore(bot, SCORE_FLAG_CAPTURES, 1);      // +1 flag captures\n+\n+    // update last flag capture to be used if teamscore is equal\n+    SetLastFlagCapture(GetBotTeam(bot->GetGUID()));\n+\n+    if (GetTeamScore(TEAM_ALLIANCE) == BG_WS_MAX_TEAM_SCORE)\n+        winner = ALLIANCE;\n+\n+    if (GetTeamScore(TEAM_HORDE) == BG_WS_MAX_TEAM_SCORE)\n+        winner = HORDE;\n+\n+    if (winner)\n+    {\n+        UpdateWorldState(BG_WS_FLAG_UNK_ALLIANCE, 0);\n+        UpdateWorldState(BG_WS_FLAG_UNK_HORDE, 0);\n+        UpdateWorldState(BG_WS_FLAG_STATE_ALLIANCE, 1);\n+        UpdateWorldState(BG_WS_FLAG_STATE_HORDE, 1);\n+        UpdateWorldState(BG_WS_STATE_TIMER_ACTIVE, 0);\n+\n+        RewardHonorToTeam(BG_WSG_Honor[m_HonorMode][BG_WSG_WIN], winner);\n+        EndBattleground(winner);\n+    }\n+    else\n+    {\n+        _flagsTimer[GetTeamIndexByTeamId(GetBotTeam(bot->GetGUID())) ? 0 : 1] = BG_WS_FLAG_RESPAWN_TIME;\n+    }\n+}\n+//end npcbot\n+\n void BattlegroundWS::EventPlayerDroppedFlag(Player* player)\n {\n     if (GetStatus() != STATUS_IN_PROGRESS)\n@@ -478,6 +595,96 @@ void BattlegroundWS::EventPlayerDroppedFlag(Player* player)\n     }\n }\n \n+//npcbot\n+void BattlegroundWS::EventBotDroppedFlag(Creature* bot)\n+{\n+    if (GetStatus() != STATUS_IN_PROGRESS)\n+    {\n+        // if not running, do not cast things at the dropper player (prevent spawning the \"dropped\" flag), neither send unnecessary messages\n+        // just take off the aura\n+        if (GetBotTeam(bot->GetGUID()) == ALLIANCE)\n+        {\n+            if (!IsHordeFlagPickedup())\n+                return;\n+\n+            if (GetFlagPickerGUID(TEAM_HORDE) == bot->GetGUID())\n+            {\n+                SetHordeFlagPicker(ObjectGuid::Empty);\n+                bot->RemoveAurasDueToSpell(BG_WS_SPELL_WARSONG_FLAG);\n+            }\n+        }\n+        else\n+        {\n+            if (!IsAllianceFlagPickedup())\n+                return;\n+\n+            if (GetFlagPickerGUID(TEAM_ALLIANCE) == bot->GetGUID())\n+            {\n+                SetAllianceFlagPicker(ObjectGuid::Empty);\n+                bot->RemoveAurasDueToSpell(BG_WS_SPELL_SILVERWING_FLAG);\n+            }\n+        }\n+        return;\n+    }\n+\n+    bool set = false;\n+\n+    if (GetBotTeam(bot->GetGUID()) == ALLIANCE)\n+    {\n+        if (!IsHordeFlagPickedup())\n+            return;\n+        if (GetFlagPickerGUID(TEAM_HORDE) == bot->GetGUID())\n+        {\n+            SetHordeFlagPicker(ObjectGuid::Empty);\n+            bot->RemoveAurasDueToSpell(BG_WS_SPELL_WARSONG_FLAG);\n+            if (_flagDebuffState == 1)\n+              bot->RemoveAurasDueToSpell(WS_SPELL_FOCUSED_ASSAULT);\n+            else if (_flagDebuffState == 2)\n+              bot->RemoveAurasDueToSpell(WS_SPELL_BRUTAL_ASSAULT);\n+            _flagState[TEAM_HORDE] = BG_WS_FLAG_STATE_ON_GROUND;\n+            bot->CastSpell(bot, BG_WS_SPELL_WARSONG_FLAG_DROPPED, true);\n+            set = true;\n+        }\n+    }\n+    else\n+    {\n+        if (!IsAllianceFlagPickedup())\n+            return;\n+        if (GetFlagPickerGUID(TEAM_ALLIANCE) == bot->GetGUID())\n+        {\n+            SetAllianceFlagPicker(ObjectGuid::Empty);\n+            bot->RemoveAurasDueToSpell(BG_WS_SPELL_SILVERWING_FLAG);\n+            if (_flagDebuffState == 1)\n+              bot->RemoveAurasDueToSpell(WS_SPELL_FOCUSED_ASSAULT);\n+            else if (_flagDebuffState == 2)\n+              bot->RemoveAurasDueToSpell(WS_SPELL_BRUTAL_ASSAULT);\n+            _flagState[TEAM_ALLIANCE] = BG_WS_FLAG_STATE_ON_GROUND;\n+            bot->CastSpell(bot, BG_WS_SPELL_SILVERWING_FLAG_DROPPED, true);\n+            set = true;\n+        }\n+    }\n+\n+    if (set)\n+    {\n+        bot->CastSpell(bot, SPELL_RECENTLY_DROPPED_FLAG, true);\n+        UpdateFlagState(GetBotTeam(bot->GetGUID()), 1);\n+\n+        if (GetBotTeam(bot->GetGUID()) == ALLIANCE)\n+        {\n+            SendBroadcastText(BG_WS_TEXT_HORDE_FLAG_DROPPED, CHAT_MSG_BG_SYSTEM_HORDE, bot);\n+            UpdateWorldState(BG_WS_FLAG_UNK_HORDE, uint32(-1));\n+        }\n+        else\n+        {\n+            SendBroadcastText(BG_WS_TEXT_ALLIANCE_FLAG_DROPPED, CHAT_MSG_BG_SYSTEM_ALLIANCE, bot);\n+            UpdateWorldState(BG_WS_FLAG_UNK_ALLIANCE, uint32(-1));\n+        }\n+\n+        _flagsDropTimer[GetTeamIndexByTeamId(GetBotTeam(bot->GetGUID())) ? 0 : 1] = BG_WS_FLAG_DROP_TIME;\n+    }\n+}\n+//end npcbot\n+\n void BattlegroundWS::EventPlayerClickedOnFlag(Player* player, GameObject* target_obj)\n {\n     if (GetStatus() != STATUS_IN_PROGRESS)\n@@ -600,6 +807,157 @@ void BattlegroundWS::EventPlayerClickedOnFlag(Player* player, GameObject* target\n     player->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT);\n }\n \n+//npcbot\n+void BattlegroundWS::EventBotClickedOnFlag(Creature* bot, GameObject* target_obj)\n+{\n+    if (GetStatus() != STATUS_IN_PROGRESS)\n+        return;\n+\n+    //alliance flag picked up from base\n+    if (GetBotTeam(bot->GetGUID()) == HORDE && GetFlagState(ALLIANCE) == BG_WS_FLAG_STATE_ON_BASE\n+        && BgObjects[BG_WS_OBJECT_A_FLAG] == target_obj->GetGUID())\n+    {\n+        SendBroadcastText(BG_WS_TEXT_ALLIANCE_FLAG_PICKED_UP, CHAT_MSG_BG_SYSTEM_HORDE, bot);\n+        PlaySoundToAll(BG_WS_SOUND_ALLIANCE_FLAG_PICKED_UP);\n+        SpawnBGObject(BG_WS_OBJECT_A_FLAG, RESPAWN_ONE_DAY);\n+        SetAllianceFlagPicker(bot->GetGUID());\n+        _flagState[TEAM_ALLIANCE] = BG_WS_FLAG_STATE_ON_PLAYER;\n+        //update world state to show correct flag carrier\n+        UpdateFlagState(HORDE, BG_WS_FLAG_STATE_ON_PLAYER);\n+        UpdateWorldState(BG_WS_FLAG_UNK_ALLIANCE, 1);\n+        bot->CastSpell(bot, BG_WS_SPELL_SILVERWING_FLAG, true);\n+        if (_flagState[1] == BG_WS_FLAG_STATE_ON_PLAYER)\n+          _bothFlagsKept = true;\n+\n+        if (_flagDebuffState == 1)\n+          bot->CastSpell(bot, WS_SPELL_FOCUSED_ASSAULT, true);\n+        else if (_flagDebuffState == 2)\n+          bot->CastSpell(bot, WS_SPELL_BRUTAL_ASSAULT, true);\n+    }\n+\n+    //horde flag picked up from base\n+    if (GetBotTeam(bot->GetGUID()) == ALLIANCE && GetFlagState(HORDE) == BG_WS_FLAG_STATE_ON_BASE\n+        && BgObjects[BG_WS_OBJECT_H_FLAG] == target_obj->GetGUID())\n+    {\n+        SendBroadcastText(BG_WS_TEXT_HORDE_FLAG_PICKED_UP, CHAT_MSG_BG_SYSTEM_ALLIANCE, bot);\n+        PlaySoundToAll(BG_WS_SOUND_HORDE_FLAG_PICKED_UP);\n+        SpawnBGObject(BG_WS_OBJECT_H_FLAG, RESPAWN_ONE_DAY);\n+        SetHordeFlagPicker(bot->GetGUID());\n+        _flagState[TEAM_HORDE] = BG_WS_FLAG_STATE_ON_PLAYER;\n+        //update world state to show correct flag carrier\n+        UpdateFlagState(ALLIANCE, BG_WS_FLAG_STATE_ON_PLAYER);\n+        UpdateWorldState(BG_WS_FLAG_UNK_HORDE, 1);\n+        bot->CastSpell(bot, BG_WS_SPELL_WARSONG_FLAG, true);\n+        if (_flagState[0] == BG_WS_FLAG_STATE_ON_PLAYER)\n+          _bothFlagsKept = true;\n+\n+        if (_flagDebuffState == 1)\n+          bot->CastSpell(bot, WS_SPELL_FOCUSED_ASSAULT, true);\n+        else if (_flagDebuffState == 2)\n+          bot->CastSpell(bot, WS_SPELL_BRUTAL_ASSAULT, true);\n+    }\n+\n+    //Alliance flag on ground(not in base) (returned or picked up again from ground!)\n+    if (GetFlagState(ALLIANCE) == BG_WS_FLAG_STATE_ON_GROUND && bot->IsWithinDistInMap(target_obj, 10)\n+        && target_obj->GetGOInfo()->entry == BG_OBJECT_A_FLAG_GROUND_WS_ENTRY)\n+    {\n+        if (GetBotTeam(bot->GetGUID()) == ALLIANCE)\n+        {\n+            SendBroadcastText(BG_WS_TEXT_ALLIANCE_FLAG_RETURNED, CHAT_MSG_BG_SYSTEM_ALLIANCE, bot);\n+            UpdateFlagState(HORDE, BG_WS_FLAG_STATE_WAIT_RESPAWN);\n+            RespawnFlag(ALLIANCE, false);\n+            SpawnBGObject(BG_WS_OBJECT_A_FLAG, RESPAWN_IMMEDIATELY);\n+            PlaySoundToAll(BG_WS_SOUND_FLAG_RETURNED);\n+            UpdateBotScore(bot, SCORE_FLAG_RETURNS, 1);\n+            _bothFlagsKept = false;\n+            HandleFlagRoomCapturePoint(TEAM_HORDE); // Check Horde flag if it is in capture zone; if so, capture it\n+        }\n+        else\n+        {\n+            SendBroadcastText(BG_WS_TEXT_ALLIANCE_FLAG_PICKED_UP, CHAT_MSG_BG_SYSTEM_HORDE, bot);\n+            PlaySoundToAll(BG_WS_SOUND_ALLIANCE_FLAG_PICKED_UP);\n+            SpawnBGObject(BG_WS_OBJECT_A_FLAG, RESPAWN_ONE_DAY);\n+            SetAllianceFlagPicker(bot->GetGUID());\n+            bot->CastSpell(bot, BG_WS_SPELL_SILVERWING_FLAG, true);\n+            _flagState[TEAM_ALLIANCE] = BG_WS_FLAG_STATE_ON_PLAYER;\n+            UpdateFlagState(HORDE, BG_WS_FLAG_STATE_ON_PLAYER);\n+            if (_flagDebuffState == 1)\n+              bot->CastSpell(bot, WS_SPELL_FOCUSED_ASSAULT, true);\n+            else if (_flagDebuffState == 2)\n+              bot->CastSpell(bot, WS_SPELL_BRUTAL_ASSAULT, true);\n+            UpdateWorldState(BG_WS_FLAG_UNK_ALLIANCE, 1);\n+        }\n+        //called in HandleGameObjectUseOpcode:\n+        target_obj->Delete();\n+    }\n+\n+    //Horde flag on ground(not in base) (returned or picked up again)\n+    if (GetFlagState(HORDE) == BG_WS_FLAG_STATE_ON_GROUND && bot->IsWithinDistInMap(target_obj, 10)\n+        && target_obj->GetGOInfo()->entry == BG_OBJECT_H_FLAG_GROUND_WS_ENTRY)\n+    {\n+        if (GetBotTeam(bot->GetGUID()) == HORDE)\n+        {\n+            SendBroadcastText(BG_WS_TEXT_HORDE_FLAG_RETURNED, CHAT_MSG_BG_SYSTEM_HORDE, bot);\n+            UpdateFlagState(ALLIANCE, BG_WS_FLAG_STATE_WAIT_RESPAWN);\n+            RespawnFlag(HORDE, false);\n+            SpawnBGObject(BG_WS_OBJECT_H_FLAG, RESPAWN_IMMEDIATELY);\n+            PlaySoundToAll(BG_WS_SOUND_FLAG_RETURNED);\n+            UpdateBotScore(bot, SCORE_FLAG_RETURNS, 1);\n+            _bothFlagsKept = false;\n+            HandleFlagRoomCapturePoint(TEAM_ALLIANCE); // Check Alliance flag if it is in capture zone; if so, capture it\n+        }\n+        else\n+        {\n+            SendBroadcastText(BG_WS_TEXT_HORDE_FLAG_PICKED_UP, CHAT_MSG_BG_SYSTEM_ALLIANCE, bot);\n+            PlaySoundToAll(BG_WS_SOUND_HORDE_FLAG_PICKED_UP);\n+            SpawnBGObject(BG_WS_OBJECT_H_FLAG, RESPAWN_ONE_DAY);\n+            SetHordeFlagPicker(bot->GetGUID());\n+            bot->CastSpell(bot, BG_WS_SPELL_WARSONG_FLAG, true);\n+            _flagState[TEAM_HORDE] = BG_WS_FLAG_STATE_ON_PLAYER;\n+            UpdateFlagState(ALLIANCE, BG_WS_FLAG_STATE_ON_PLAYER);\n+            if (_flagDebuffState == 1)\n+              bot->CastSpell(bot, WS_SPELL_FOCUSED_ASSAULT, true);\n+            else if (_flagDebuffState == 2)\n+              bot->CastSpell(bot, WS_SPELL_BRUTAL_ASSAULT, true);\n+            UpdateWorldState(BG_WS_FLAG_UNK_HORDE, 1);\n+        }\n+        //called in HandleGameObjectUseOpcode:\n+        target_obj->Delete();\n+    }\n+\n+    bot->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT);\n+}\n+\n+void BattlegroundWS::RemoveBot(ObjectGuid guid)\n+{\n+    // sometimes flag aura not removed :(\n+    if (IsAllianceFlagPickedup() && m_FlagKeepers[TEAM_ALLIANCE] == guid)\n+    {\n+        Creature const* bot = BotDataMgr::FindBot(guid.GetEntry());\n+        if (!bot)\n+        {\n+            TC_LOG_ERROR(\"bg.battleground\", \"BattlegroundWS: Removing offline bot {} who has the FLAG!!\", guid.GetEntry());\n+            SetAllianceFlagPicker(ObjectGuid::Empty);\n+            RespawnFlag(ALLIANCE, false);\n+        }\n+        else\n+            EventBotDroppedFlag(const_cast<Creature*>(bot));\n+    }\n+    if (IsHordeFlagPickedup() && m_FlagKeepers[TEAM_HORDE] == guid)\n+    {\n+        Creature const* bot = BotDataMgr::FindBot(guid.GetEntry());\n+        if (!bot)\n+        {\n+            TC_LOG_ERROR(\"bg.battleground\", \"BattlegroundWS: Removing offline bot {} who has the FLAG!!\", guid.GetEntry());\n+            SetHordeFlagPicker(ObjectGuid::Empty);\n+            RespawnFlag(HORDE, false);\n+        }\n+        else\n+            EventBotDroppedFlag(const_cast<Creature*>(bot));\n+    }\n+}\n+//end npcbot\n+\n void BattlegroundWS::RemovePlayer(Player* player, ObjectGuid guid, uint32 /*team*/)\n {\n     // sometimes flag aura not removed :(\n@@ -694,6 +1052,42 @@ void BattlegroundWS::HandleAreaTrigger(Player* player, uint32 trigger)\n     //    HandleTriggerBuff(buff_guid, player);\n }\n \n+//npcbot\n+void BattlegroundWS::HandleBotAreaTrigger(Creature* bot, uint32 trigger)\n+{\n+    if (GetStatus() != STATUS_IN_PROGRESS)\n+        return;\n+\n+    switch (trigger)\n+    {\n+        case 3686:                                          // Alliance elixir of speed spawn. Trigger not working, because located inside other areatrigger, can be replaced by IsWithinDist(object, dist) in Battleground::Update().\n+        case 3687:                                          // Horde elixir of speed spawn. Trigger not working, because located inside other areatrigger, can be replaced by IsWithinDist(object, dist) in Battleground::Update().\n+        case 3706:                                          // Alliance elixir of regeneration spawn\n+        case 3708:                                          // Horde elixir of regeneration spawn\n+        case 3707:                                          // Alliance elixir of berserk spawn\n+        case 3709:                                          // Horde elixir of berserk spawn\n+        case 3649:                                          // unk1\n+        case 3688:                                          // unk2\n+        case 4628:                                          // unk3\n+        case 4629:                                          // unk4\n+            break;\n+        case 3646:                                          // Alliance Flag spawn\n+            if (_flagState[TEAM_HORDE] && !_flagState[TEAM_ALLIANCE])\n+                if (GetFlagPickerGUID(TEAM_HORDE) == bot->GetGUID())\n+                    EventBotCapturedFlag(bot);\n+            break;\n+        case 3647:                                          // Horde Flag spawn\n+            if (_flagState[TEAM_ALLIANCE] && !_flagState[TEAM_HORDE])\n+                if (GetFlagPickerGUID(TEAM_ALLIANCE) == bot->GetGUID())\n+                    EventBotCapturedFlag(bot);\n+            break;\n+        default:\n+            Battleground::HandleBotAreaTrigger(bot, trigger);\n+            break;\n+    }\n+}\n+//end npcbot\n+\n bool BattlegroundWS::SetupBattleground()\n {\n     // flags\n@@ -804,6 +1198,33 @@ void BattlegroundWS::HandleKillPlayer(Player* player, Player* killer)\n     Battleground::HandleKillPlayer(player, killer);\n }\n \n+//npcbot\n+void BattlegroundWS::HandleBotKillPlayer(Creature* killer, Player* victim)\n+{\n+    if (GetStatus() != STATUS_IN_PROGRESS)\n+        return;\n+\n+    EventPlayerDroppedFlag(victim);\n+    Battleground::HandleBotKillPlayer(killer, victim);\n+}\n+void BattlegroundWS::HandleBotKillBot(Creature* killer, Creature* victim)\n+{\n+    if (GetStatus() != STATUS_IN_PROGRESS)\n+        return;\n+\n+    EventBotDroppedFlag(victim);\n+    Battleground::HandleBotKillBot(killer, victim);\n+}\n+void BattlegroundWS::HandlePlayerKillBot(Creature* victim, Player* killer)\n+{\n+    if (GetStatus() != STATUS_IN_PROGRESS)\n+        return;\n+\n+    EventBotDroppedFlag(victim);\n+    Battleground::HandlePlayerKillBot(victim, killer);\n+}\n+//end npcbot\n+\n bool BattlegroundWS::UpdatePlayerScore(Player* player, uint32 type, uint32 value, bool doAddHonor)\n {\n     if (!Battleground::UpdatePlayerScore(player, type, value, doAddHonor))\n@@ -823,6 +1244,16 @@ bool BattlegroundWS::UpdatePlayerScore(Player* player, uint32 type, uint32 value\n     return true;\n }\n \n+//npcbot\n+bool BattlegroundWS::UpdateBotScore(Creature const* bot, uint32 type, uint32 value, bool doAddHonor)\n+{\n+    if (!Battleground::UpdateBotScore(bot, type, value, doAddHonor))\n+        return false;\n+\n+    return true;\n+}\n+//end npcbot\n+\n WorldSafeLocsEntry const* BattlegroundWS::GetClosestGraveyard(Player* player)\n {\n     //if status in progress, it returns main graveyards with spiritguides\n@@ -846,6 +1277,26 @@ WorldSafeLocsEntry const* BattlegroundWS::GetClosestGraveyard(Player* player)\n     }\n }\n \n+//npcbot\n+WorldSafeLocsEntry const* BattlegroundWS::GetClosestGraveyardForBot(WorldLocation const& /*curPos*/, uint32 team) const\n+{\n+    if (team == ALLIANCE)\n+    {\n+        if (GetStatus() == STATUS_IN_PROGRESS)\n+            return sWorldSafeLocsStore.LookupEntry(WS_GRAVEYARD_MAIN_ALLIANCE);\n+        else\n+            return sWorldSafeLocsStore.LookupEntry(WS_GRAVEYARD_FLAGROOM_ALLIANCE);\n+    }\n+    else\n+    {\n+        if (GetStatus() == STATUS_IN_PROGRESS)\n+            return sWorldSafeLocsStore.LookupEntry(WS_GRAVEYARD_MAIN_HORDE);\n+        else\n+            return sWorldSafeLocsStore.LookupEntry(WS_GRAVEYARD_FLAGROOM_HORDE);\n+    }\n+}\n+//end npcbot\n+\n void BattlegroundWS::FillInitialWorldStates(WorldPackets::WorldState::InitWorldStates& packet)\n {\n     packet.Worldstates.emplace_back(BG_WS_FLAG_CAPTURES_ALLIANCE, GetTeamScore(TEAM_ALLIANCE));\ndiff --git a/src/server/game/Battlegrounds/Zones/BattlegroundWS.h b/src/server/game/Battlegrounds/Zones/BattlegroundWS.h\nindex 1d034b30cb..458735dddd 100644\n--- a/src/server/game/Battlegrounds/Zones/BattlegroundWS.h\n+++ b/src/server/game/Battlegrounds/Zones/BattlegroundWS.h\n@@ -236,6 +236,20 @@ class BattlegroundWS : public Battleground\n         void EndBattleground(uint32 winner) override;\n         WorldSafeLocsEntry const* GetClosestGraveyard(Player* player) override;\n \n+        //npcbot\n+        WorldSafeLocsEntry const* GetClosestGraveyardForBot(WorldLocation const& curPos, uint32 team) const override;\n+        void AddBot(Creature* bot) override;\n+        void RemoveBot(ObjectGuid guid) override;\n+        bool UpdateBotScore(Creature const* bot, uint32 type, uint32 value, bool doAddHonor = true) override;\n+        void HandleBotKillPlayer(Creature* bot, Player* victim) override;\n+        void HandleBotKillBot(Creature* bot, Creature* victim) override;\n+        void HandlePlayerKillBot(Creature* bot, Player* killer) override;\n+        void EventBotDroppedFlag(Creature* bot) override;\n+        void EventBotClickedOnFlag(Creature* bot, GameObject* target_obj) override;\n+        void HandleBotAreaTrigger(Creature* bot, uint32 trigger) override;\n+        void EventBotCapturedFlag(Creature* bot);\n+        //end npcbot\n+\n         void UpdateFlagState(uint32 team, uint32 value);\n         void SetLastFlagCapture(uint32 team)                { _lastFlagCaptureTeam = team; }\n         void UpdateTeamScore(uint32 team);\ndiff --git a/src/server/game/Combat/CombatManager.cpp b/src/server/game/Combat/CombatManager.cpp\nindex 005e0d8e66..303be7b6df 100644\n--- a/src/server/game/Combat/CombatManager.cpp\n+++ b/src/server/game/Combat/CombatManager.cpp\n@@ -22,6 +22,10 @@\n #include \"CreatureAI.h\"\n #include \"Player.h\"\n \n+//npcbot\n+#include \"botmgr.h\"\n+//end npcbot\n+\n /*static*/ bool CombatManager::CanBeginCombat(Unit const* a, Unit const* b)\n {\n     // Checks combat validity before initial reference creation.\n@@ -208,12 +212,33 @@ bool CombatManager::SetInCombatWith(Unit* who, bool addSecondUnitSuppressed)\n     CombatReference* ref;\n     if (_owner->IsControlledByPlayer() && who->IsControlledByPlayer())\n         ref = new PvPCombatReference(_owner, who);\n+    //npcbot: follow pvp rules\n+    else if ((_owner->ToCreature() && _owner->ToCreature()->IsNPCBotOrPet() && who->IsControlledByPlayer()) ||\n+        (who->ToCreature() && who->ToCreature()->IsNPCBotOrPet() && _owner->IsControlledByPlayer()) ||\n+        (_owner->ToCreature() && _owner->ToCreature()->IsNPCBotOrPet() &&\n+        who->ToCreature() && who->ToCreature()->IsNPCBotOrPet()))\n+        ref = new PvPCombatReference(_owner, who);\n+    //end npcbot\n     else\n         ref = new CombatReference(_owner, who);\n \n     if (addSecondUnitSuppressed)\n         ref->Suppress(who);\n \n+    //npcbot\n+    /*\n+    if (_owner->GetTypeId() == TYPEID_PLAYER && _owner->ToPlayer()->HaveBot())\n+    {\n+        BotMap const* map = _owner->ToPlayer()->GetBotMgr()->GetBotMap();\n+        for (BotMap::const_iterator itr = map->begin(); itr != map->end(); ++itr)\n+        {\n+            itr->second->SetInCombatWith(who);\n+            if (Unit* botPet = itr->second->GetBotsPet())\n+                botPet->SetInCombatWith(who);\n+        }\n+    }*/\n+    //end npcbot\n+\n     // ...and insert it into both managers\n     PutReference(who->GetGUID(), ref);\n     who->GetCombatManager().PutReference(_owner->GetGUID(), ref);\n@@ -262,6 +287,27 @@ void CombatManager::InheritCombatStatesFrom(Unit const* who)\n             continue;\n         SetInCombatWith(target);\n     }\n+    //npcbot\n+    for (auto& ref : mgr._pveRefs)\n+    {\n+        if (!IsInCombatWith(ref.first))\n+        {\n+            Unit* target = ref.second->GetOther(who);\n+            if ((_owner->IsImmuneToPC() && target->IsNPCBotOrPet()) ||\n+                (_owner->IsImmuneToNPC() && !target->IsNPCBotOrPet()))\n+                continue;\n+            SetInCombatWith(target);\n+        }\n+    }\n+    for (auto& ref : mgr._pvpRefs)\n+    {\n+        Unit* target = ref.second->GetOther(who);\n+        if ((_owner->IsImmuneToPC() && target->IsNPCBotOrPet()) ||\n+            (_owner->IsImmuneToNPC() && !target->IsNPCBotOrPet()))\n+            continue;\n+        SetInCombatWith(target);\n+    }\n+    //end npcbot\n }\n \n void CombatManager::EndCombatBeyondRange(float range, bool includingPvP)\n@@ -387,6 +433,18 @@ bool CombatManager::UpdateOwnerCombatState() const\n \n     if (combatState)\n     {\n+        //npcbot: party combat hook\n+        Player* playerOwner = nullptr;\n+        if (_owner->GetTypeId() == TYPEID_PLAYER && _owner->ToPlayer()->HaveBot())\n+            playerOwner = _owner->ToPlayer();\n+        else if (_owner->GetTypeId() == TYPEID_UNIT && _owner->ToCreature()->IsNPCBotOrPet() &&\n+            !_owner->ToCreature()->IsFreeBot())\n+            playerOwner = _owner->ToCreature()->GetBotOwner();\n+\n+        if (playerOwner)\n+            BotMgr::OnBotPartyEngage(playerOwner);\n+        //end npcbot\n+\n         _owner->SetUnitFlag(UNIT_FLAG_IN_COMBAT);\n         _owner->AtEnterCombat();\n         if (_owner->GetTypeId() != TYPEID_UNIT)\ndiff --git a/src/server/game/Combat/ThreatManager.cpp b/src/server/game/Combat/ThreatManager.cpp\nindex 6852b79242..3fca416761 100644\n--- a/src/server/game/Combat/ThreatManager.cpp\n+++ b/src/server/game/Combat/ThreatManager.cpp\n@@ -34,6 +34,10 @@\n #include <algorithm>\n #include <boost/heap/fibonacci_heap.hpp>\n \n+//npcbot\n+#include \"botmgr.h\"\n+//end npcbot\n+\n const CompareThreatLessThan ThreatManager::CompareThreat;\n \n class ThreatManager::Heap : public boost::heap::fibonacci_heap<ThreatReference const*, boost::heap::compare<CompareThreatLessThan>>\n@@ -93,6 +97,13 @@ void ThreatReference::UpdateOffline()\n         if (b->HasUnitFlag(UNIT_FLAG_IMMUNE_TO_PC))\n             return false;\n     }\n+    //npcbot\n+    else if (a->IsNPCBotOrPet())\n+    {\n+        if (b->HasUnitFlag(UNIT_FLAG_IMMUNE_TO_PC))\n+            return false;\n+    }\n+    //end npcbot\n     else\n     {\n         if (b->HasUnitFlag(UNIT_FLAG_IMMUNE_TO_NPC))\n@@ -191,6 +202,11 @@ void ThreatReference::HeapNotifyDecreased()\n             if (tWho->GetSummonerGUID().IsPlayer())\n                 return false;\n \n+    //npcbot - npcbots and their pets cannot have threatlist\n+    if (cWho->IsNPCBot() || cWho->IsNPCBotPet())\n+        return false;\n+    //end npcbot\n+\n     return true;\n }\n \n@@ -686,6 +702,11 @@ void ThreatManager::ProcessAIUpdates()\n \n         if (Player* modOwner = victim->GetSpellModOwner())\n             modOwner->ApplySpellMod(spell->Id, SPELLMOD_THREAT, threat);\n+\n+        //npcbot: threat mods\n+        if (victim->GetTypeId() == TYPEID_UNIT && victim->ToCreature()->GetBotAI())\n+            BotMgr::ApplyBotThreatMods(victim, spell, threat);\n+        //end npcbot\n     }\n \n     // modifiers by effect school\ndiff --git a/src/server/game/Conditions/ConditionMgr.cpp b/src/server/game/Conditions/ConditionMgr.cpp\nindex 5750a7137d..4d341ecc40 100644\n--- a/src/server/game/Conditions/ConditionMgr.cpp\n+++ b/src/server/game/Conditions/ConditionMgr.cpp\n@@ -34,6 +34,10 @@\n #include \"SpellMgr.h\"\n #include \"World.h\"\n \n+//npcbot\n+#include \"bot_ai.h\"\n+//end npcbot\n+\n char const* const ConditionMgr::StaticSourceTypeData[CONDITION_SOURCE_TYPE_MAX] =\n {\n     \"None\",\n@@ -155,6 +159,11 @@ bool Condition::Meets(ConditionSourceInfo& sourceInfo) const\n         }\n         case CONDITION_ITEM:\n         {\n+            //npcbot\n+            if (object->IsNPCBot())\n+                condMeets = true;\n+            else\n+            //end npcbot\n             if (Player* player = object->ToPlayer())\n             {\n                 // don't allow 0 items (it's checked during table load)\n@@ -166,6 +175,11 @@ bool Condition::Meets(ConditionSourceInfo& sourceInfo) const\n         }\n         case CONDITION_ITEM_EQUIPPED:\n         {\n+            //npcbot\n+            if (object->IsNPCBot())\n+                condMeets = true; //for now\n+            else\n+            //end npcbot\n             if (Player* player = object->ToPlayer())\n                 condMeets = player->HasItemOrGemWithIdEquipped(ConditionValue1, 1);\n             break;\n@@ -175,6 +189,14 @@ bool Condition::Meets(ConditionSourceInfo& sourceInfo) const\n             break;\n         case CONDITION_REPUTATION_RANK:\n         {\n+            //npcbot\n+            if (object->IsNPCBot() && object->ToCreature()->GetBotAI() && !object->ToCreature()->IsFreeBot())\n+            {\n+                if (FactionEntry const* faction = sFactionStore.LookupEntry(ConditionValue1))\n+                    condMeets = (ConditionValue2 & (1 << object->ToCreature()->GetBotOwner()->GetReputationMgr().GetRank(faction)));\n+            }\n+            else\n+            //end npcbot\n             if (Player* player = object->ToPlayer())\n             {\n                 if (FactionEntry const* faction = sFactionStore.LookupEntry(ConditionValue1))\n@@ -184,12 +206,22 @@ bool Condition::Meets(ConditionSourceInfo& sourceInfo) const\n         }\n         case CONDITION_ACHIEVEMENT:\n         {\n+            //npcbot\n+            if (object->IsNPCBot())\n+                condMeets = true;\n+            else\n+            //end npcbot\n             if (Player* player = object->ToPlayer())\n                 condMeets = player->HasAchieved(ConditionValue1);\n             break;\n         }\n         case CONDITION_TEAM:\n         {\n+            //npcbot\n+            if (object->IsNPCBot() && object->ToCreature()->GetBotAI() && !object->ToCreature()->IsFreeBot())\n+                condMeets = object->ToCreature()->GetBotOwner()->GetTeam() == ConditionValue1;\n+            else\n+            //end npcbot\n             if (Player* player = object->ToPlayer())\n                 condMeets = player->GetTeam() == ConditionValue1;\n             break;\n@@ -208,12 +240,22 @@ bool Condition::Meets(ConditionSourceInfo& sourceInfo) const\n         }\n         case CONDITION_GENDER:\n         {\n+            //npcbot\n+            if (object->IsNPCBot())\n+                condMeets = object->ToCreature()->GetGender() == Gender(ConditionValue1);\n+            else\n+            //end npcbot\n             if (Player* player = object->ToPlayer())\n                 condMeets = player->GetNativeGender() == Gender(ConditionValue1);\n             break;\n         }\n         case CONDITION_SKILL:\n         {\n+            //npcbot\n+            if (object->IsNPCBot())\n+                condMeets = true;\n+            else\n+            //end npcbot\n             if (Player* player = object->ToPlayer())\n                 condMeets = player->HasSkill(ConditionValue1) && player->GetBaseSkillValue(ConditionValue1) >= ConditionValue2;\n             break;\n@@ -288,6 +330,11 @@ bool Condition::Meets(ConditionSourceInfo& sourceInfo) const\n             break;\n         case CONDITION_SPELL:\n         {\n+            //npcbot\n+            if (object->GetTypeId() == TYPEID_UNIT && object->ToCreature()->GetBotAI())\n+                condMeets = object->ToCreature()->GetBotAI()->HasSpell(sSpellMgr->GetSpellInfo(ConditionValue1)->GetFirstRankSpell()->Id);\n+            else\n+            //end npcbot\n             if (Player* player = object->ToPlayer())\n                 condMeets = player->HasSpell(ConditionValue1);\n             break;\ndiff --git a/src/server/game/DataStores/DBCStores.cpp b/src/server/game/DataStores/DBCStores.cpp\nindex 70cb052952..634a909556 100644\n--- a/src/server/game/DataStores/DBCStores.cpp\n+++ b/src/server/game/DataStores/DBCStores.cpp\n@@ -114,7 +114,7 @@ DBCStorage <HolidaysEntry>                sHolidaysStore(Holidaysfmt);\n DBCStorage <ItemEntry>                    sItemStore(Itemfmt);\n DBCStorage <ItemBagFamilyEntry>           sItemBagFamilyStore(ItemBagFamilyfmt);\n //DBCStorage <ItemCondExtCostsEntry> sItemCondExtCostsStore(ItemCondExtCostsEntryfmt);\n-//DBCStorage <ItemDisplayInfoEntry> sItemDisplayInfoStore(ItemDisplayTemplateEntryfmt); -- not used currently\n+DBCStorage <ItemDisplayInfoEntry> sItemDisplayInfoStore(ItemDisplayTemplateEntryfmt);\n DBCStorage <ItemExtendedCostEntry> sItemExtendedCostStore(ItemExtendedCostEntryfmt);\n DBCStorage <ItemLimitCategoryEntry> sItemLimitCategoryStore(ItemLimitCategoryEntryfmt);\n DBCStorage <ItemRandomPropertiesEntry> sItemRandomPropertiesStore(ItemRandomPropertiesfmt);\n@@ -337,7 +337,7 @@ void LoadDBCStores(const std::string& dataPath)\n     LOAD_DBC(sHolidaysStore,                      \"Holidays.dbc\");\n     LOAD_DBC(sItemStore,                          \"Item.dbc\");\n     LOAD_DBC(sItemBagFamilyStore,                 \"ItemBagFamily.dbc\");\n-    //LOAD_DBC(sItemDisplayInfoStore,               \"ItemDisplayInfo.dbc\");     -- not used currently\n+    LOAD_DBC(sItemDisplayInfoStore,               \"ItemDisplayInfo.dbc\");\n     //LOAD_DBC(sItemCondExtCostsStore,              \"ItemCondExtCosts.dbc\");\n     LOAD_DBC(sItemExtendedCostStore,              \"ItemExtendedCost.dbc\");\n     LOAD_DBC(sItemLimitCategoryStore,             \"ItemLimitCategory.dbc\");\ndiff --git a/src/server/game/DataStores/DBCStores.h b/src/server/game/DataStores/DBCStores.h\nindex 15760817a8..bf782a5ea7 100644\n--- a/src/server/game/DataStores/DBCStores.h\n+++ b/src/server/game/DataStores/DBCStores.h\n@@ -144,7 +144,7 @@ TC_GAME_API extern DBCStorage <GtRegenMPPerSptEntry>         sGtRegenMPPerSptSto\n TC_GAME_API extern DBCStorage <HolidaysEntry>                sHolidaysStore;\n TC_GAME_API extern DBCStorage <ItemEntry>                    sItemStore;\n TC_GAME_API extern DBCStorage <ItemBagFamilyEntry>           sItemBagFamilyStore;\n-//TC_GAME_API extern DBCStorage <ItemDisplayInfoEntry>      sItemDisplayInfoStore; -- not used currently\n+TC_GAME_API extern DBCStorage <ItemDisplayInfoEntry>         sItemDisplayInfoStore;\n TC_GAME_API extern DBCStorage <ItemExtendedCostEntry>        sItemExtendedCostStore;\n TC_GAME_API extern DBCStorage <ItemLimitCategoryEntry>       sItemLimitCategoryStore;\n TC_GAME_API extern DBCStorage <ItemRandomPropertiesEntry>    sItemRandomPropertiesStore;\ndiff --git a/src/server/game/DungeonFinding/LFGMgr.cpp b/src/server/game/DungeonFinding/LFGMgr.cpp\nindex 5befeb341a..0268bd4d10 100644\n--- a/src/server/game/DungeonFinding/LFGMgr.cpp\n+++ b/src/server/game/DungeonFinding/LFGMgr.cpp\n@@ -41,6 +41,13 @@\n #include \"World.h\"\n #include \"WorldSession.h\"\n \n+//npcbot\n+#include \"botconfig.h\"\n+#include \"botmgr.h\"\n+#include \"Chat.h\"\n+#include \"Creature.h\"\n+//end npcbot\n+\n namespace lfg\n {\n \n@@ -474,6 +481,38 @@ void LFGMgr::JoinLfg(Player* player, uint8 roles, LfgDungeonSet& dungeons, const\n                         joinData.result = LFG_JOIN_PARTY_NOT_MEET_REQS;\n                     ++memberCount;\n                     players.insert(plrg->GetGUID());\n+\n+                    //npcbot\n+                    if (!plrg->HaveBot())\n+                        continue;\n+                    //add npcbots\n+                    BotMap const* map = plrg->GetBotMgr()->GetBotMap();\n+                    for (BotMap::const_iterator itr = map->begin(); itr != map->end(); ++itr)\n+                    {\n+                        if (!grp->IsMember(itr->first))\n+                            continue;\n+\n+                        //disabled in config\n+                        if (!BotCfg::IsNpcBotDungeonFinderEnabled())\n+                        {\n+                            (ChatHandler(plrg->GetSession())).SendSysMessage(\"Using npcbots in Dungeon Finder is restricted. Contact your administration.\");\n+\n+                            if (plrg->GetGUID() != grp->GetLeaderGUID())\n+                                if (Player* leader = ObjectAccessor::FindPlayer(grp->GetLeaderGUID()))\n+                                    (ChatHandler(leader->GetSession())).PSendSysMessage(\"There is a npcbot in your group (owner: %s). Using npcbots in Dungeon Finder is restricted. Contact your administration.\",\n+                                        plrg->GetName().c_str());\n+\n+                            joinData.result = LFG_JOIN_PARTY_NOT_MEET_REQS;\n+                            break;\n+                        }\n+\n+                        if (ObjectAccessor::GetCreature(*plrg, itr->first))\n+                        {\n+                            ++memberCount;\n+                            players.insert(itr->first);\n+                        }\n+                    }\n+                    //end npcbot\n                 }\n             }\n \n@@ -571,6 +610,9 @@ void LFGMgr::JoinLfg(Player* player, uint8 roles, LfgDungeonSet& dungeons, const\n         SetState(gguid, LFG_STATE_ROLECHECK);\n         // Send update to player\n         LfgUpdateData updateData = LfgUpdateData(LFG_UPDATETYPE_JOIN_QUEUE, dungeons, comment);\n+        //npcbot\n+        std::vector<std::pair<ObjectGuid, uint8>> bot_roles;\n+        //end npcbot\n         for (GroupReference* itr = grp->GetFirstMember(); itr != nullptr; itr = itr->next())\n         {\n             if (Player* plrg = itr->GetSource())\n@@ -584,10 +626,57 @@ void LFGMgr::JoinLfg(Player* player, uint8 roles, LfgDungeonSet& dungeons, const\n                 if (!debugNames.empty())\n                     debugNames.append(\", \");\n                 debugNames.append(plrg->GetName());\n+\n+                //npcbot\n+                if (!plrg->HaveBot())\n+                    continue;\n+                //add npcbots\n+                BotMap const* map = plrg->GetBotMgr()->GetBotMap();\n+                for (BotMap::const_iterator itr = map->begin(); itr != map->end(); ++itr)\n+                {\n+                    ObjectGuid bguid = itr->first;\n+                    if (players.find(bguid) == players.end() || !grp->IsMember(bguid))\n+                        continue;\n+\n+                    Creature* bot = ObjectAccessor::GetCreature(*plrg, bguid);\n+                    if (!bot)\n+                        continue;\n+\n+                    SetState(bguid, LFG_STATE_ROLECHECK);\n+                    if (!isContinue)\n+                        SetSelectedDungeons(bguid, dungeons);\n+                    roleCheck.roles[bguid] = 0;\n+                    if (!debugNames.empty())\n+                        debugNames.append(\", \");\n+                    debugNames.append(bot->GetName());\n+\n+                    //fill possible roles (as if player selected all roles possible for class)\n+                    uint8 broles = PLAYER_ROLE_DAMAGE;\n+                    if (bot->GetBotClass() == CLASS_WARRIOR || bot->GetBotClass() == CLASS_PALADIN ||\n+                        bot->GetBotClass() == CLASS_DEATH_KNIGHT || bot->GetBotClass() == CLASS_DRUID ||\n+                        (bot->GetBotRoles() & BOT_ROLE_TANK))\n+                        broles |= PLAYER_ROLE_TANK;\n+                    if (bot->GetBotClass() == CLASS_PRIEST || bot->GetBotClass() == CLASS_DRUID ||\n+                        bot->GetBotClass() == CLASS_SHAMAN || bot->GetBotClass() == CLASS_PALADIN ||\n+                        (bot->GetBotRoles() & BOT_ROLE_HEAL))\n+                        broles |= PLAYER_ROLE_HEALER;\n+                    //remove unneeded / occupied roles so players can go with role they choose\n+                    if (roles & PLAYER_ROLE_TANK)\n+                        broles &= ~PLAYER_ROLE_TANK;\n+                    if (roles & PLAYER_ROLE_HEALER)\n+                        broles &= ~PLAYER_ROLE_HEALER;\n+\n+                    bot_roles.emplace_back(bguid, broles);\n+                }\n+                //end npcbot\n             }\n         }\n         // Update leader role\n         UpdateRoleCheck(gguid, guid, roles);\n+        //npcbot - update bots' roles\n+        for (decltype(bot_roles)::value_type const& brole_pair : bot_roles)\n+            UpdateRoleCheck(gguid, brole_pair.first, brole_pair.second);\n+        //end npcbot\n     }\n     else                                                   // Add player to queue\n     {\n@@ -724,6 +813,9 @@ void LFGMgr::UpdateRoleCheck(ObjectGuid gguid, ObjectGuid guid /* = ObjectGuid::\n         if (Player* player = ObjectAccessor::FindPlayer(guid))\n             roles = FilterClassRoles(player, roles);\n         else\n+        //npcbot: allow bots to pass through, bot roles are checked elsewhere\n+        if (guid.IsPlayer())\n+        //end npcbot\n             return;\n     }\n \n@@ -975,6 +1067,48 @@ void LFGMgr::MakeNewGroup(LfgProposal const& proposal)\n         if (!player)\n             continue;\n \n+        //npcbot - handle player's bots\n+        if (player->HaveBot())\n+        {\n+            Group* group = player->GetGroup();\n+            if (group && group != grp)\n+                Player::RemoveFromGroup(group, pguid);\n+\n+            if (!grp)\n+            {\n+                grp = new Group();\n+                grp->ConvertToLFG();\n+                grp->Create(player);\n+                ObjectGuid gguid = grp->GetGUID();\n+                SetState(gguid, LFG_STATE_PROPOSAL);\n+                sGroupMgr->AddGroup(grp);\n+            }\n+            else if (group != grp)\n+                grp->AddMember(player);\n+\n+            grp->SetLfgRoles(pguid, proposal.players.find(pguid)->second.role);\n+\n+            // Add the cooldown spell if queued for a random dungeon\n+            if (dungeon->type == LFG_TYPE_RANDOM)\n+                player->CastSpell(player, LFG_SPELL_DUNGEON_COOLDOWN, false);\n+\n+            for (GuidList::const_iterator itr2 = players.begin(); itr2 != players.end(); ++itr2)\n+            {\n+                ObjectGuid bguid = (*itr2);\n+                if (bguid.IsPlayer())\n+                    continue;\n+                Creature* bot = player->GetBotMgr()->GetBot(bguid);\n+                if (!bot)\n+                    continue;\n+\n+                player->GetBotMgr()->AddBotToGroup(bot);\n+                grp->SetLfgRoles(bguid, proposal.players.find(bguid)->second.role);\n+            }\n+\n+            continue;\n+        }\n+        //end npcbot\n+\n         Group* group = player->GetGroup();\n         if (group && group != grp)\n             group->RemoveMember(player->GetGUID());\n@@ -1049,6 +1183,29 @@ void LFGMgr::UpdateProposal(uint32 proposalId, ObjectGuid guid, bool accept)\n     if (itProposalPlayer == proposal.players.end())\n         return;\n \n+    //npcbot - player accepted proposal\n+    //make its bots accept too\n+    if (accept && guid.IsPlayer())\n+    {\n+        if (Player* player = ObjectAccessor::FindConnectedPlayer(guid))\n+        {\n+            if (player->HaveBot())\n+            {\n+                for (LfgProposalPlayerContainer::iterator itPlayers = proposal.players.begin(); itPlayers != proposal.players.end(); ++itPlayers)\n+                {\n+                    ObjectGuid bguid = itPlayers->first;\n+                    if (bguid.IsPlayer())\n+                        continue;\n+                    if (!player->GetBotMgr()->GetBot(bguid))\n+                        continue;\n+\n+                    itPlayers->second.accept = LfgAnswer(accept);\n+                }\n+            }\n+        }\n+    }\n+    //end npcbot\n+\n     LfgProposalPlayer& player = itProposalPlayer->second;\n     player.accept = LfgAnswer(accept);\n \ndiff --git a/src/server/game/DungeonFinding/LFGScripts.cpp b/src/server/game/DungeonFinding/LFGScripts.cpp\nindex ba9bbca063..0af0d6139d 100644\n--- a/src/server/game/DungeonFinding/LFGScripts.cpp\n+++ b/src/server/game/DungeonFinding/LFGScripts.cpp\n@@ -31,6 +31,10 @@\n #include \"SharedDefines.h\"\n #include \"WorldSession.h\"\n \n+//npcbot\n+#include \"Creature.h\"\n+//end npcbot\n+\n namespace lfg\n {\n \n@@ -99,6 +103,12 @@ void LFGPlayerScript::OnMapChanged(Player* player)\n             if (Player* member = itr->GetSource())\n                 player->GetSession()->SendNameQueryOpcode(member->GetGUID());\n \n+        //npcbot\n+        for (GroupBotReference* itr = group->GetFirstBotMember(); itr != nullptr; itr = itr->next())\n+            if (Creature* member = itr->GetSource())\n+                player->GetSession()->SendNameQueryOpcode(member->GetGUID());\n+        //end npcbot\n+\n         if (sLFGMgr->selectedRandomLfgDungeon(player->GetGUID()))\n             player->CastSpell(player, LFG_SPELL_LUCK_OF_THE_DRAW, true);\n     }\n@@ -106,6 +116,9 @@ void LFGPlayerScript::OnMapChanged(Player* player)\n     {\n         Group* group = player->GetGroup();\n         if (group && group->GetMembersCount() == 1)\n+        //npcbot\n+        if (!player->GetSession()->PlayerLoading())\n+        //end npcbot\n         {\n             sLFGMgr->LeaveLfg(group->GetGUID());\n             group->Disband();\ndiff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp\nindex 7a91c578cd..1ea0add940 100644\n--- a/src/server/game/Entities/Creature/Creature.cpp\n+++ b/src/server/game/Entities/Creature/Creature.cpp\n@@ -57,6 +57,13 @@\n CreatureMovementData::CreatureMovementData() : Ground(CreatureGroundMovementType::Run), Flight(CreatureFlightMovementType::None), Swim(true), Rooted(false), Chase(CreatureChaseMovementType::Run),\n Random(CreatureRandomMovementType::Walk), InteractionPauseTimer(sWorld->getIntConfig(CONFIG_CREATURE_STOP_FOR_PLAYER)) { }\n \n+//npcbot\n+#include \"bot_ai.h\"\n+#include \"botdatamgr.h\"\n+#include \"botmgr.h\"\n+#include \"bpet_ai.h\"\n+//end npcbot\n+\n std::string CreatureMovementData::ToString() const\n {\n     char const* const GroundStates[] = { \"None\", \"Run\", \"Hover\" };\n@@ -273,6 +280,11 @@ Creature::Creature(bool isWorldObject): Unit(isWorldObject), MapObject(), m_grou\n \n     ResetLootMode(); // restore default loot mode\n     m_isTempWorldObject = false;\n+\n+    //npcbot\n+    bot_AI = nullptr;\n+    bot_pet_AI = nullptr;\n+    //end npcbot\n }\n \n void Creature::AddToWorld()\n@@ -367,6 +379,11 @@ bool Creature::IsFormationLeaderMoveAllowed() const\n \n void Creature::RemoveCorpse(bool setSpawnTime, bool destroyForNearbyPlayers)\n {\n+    //npcbot\n+    if (IsNPCBotOrPet())\n+        return;\n+    //end npcbot\n+\n     if (getDeathState() != CORPSE)\n         return;\n \n@@ -669,6 +686,29 @@ void Creature::SetPhaseMask(uint32 newPhaseMask, bool update)\n \n void Creature::Update(uint32 diff)\n {\n+    //npcbot: update helper\n+    if (bot_AI)\n+    {\n+        if (!bot_AI->canUpdate)\n+        {\n+            return;\n+        }\n+\n+        bot_AI->CommonTimers(diff);\n+    }\n+    else if (bot_pet_AI)\n+    {\n+        if (!bot_pet_AI->canUpdate)\n+        {\n+            //needed for delayed unsummon\n+            m_Events.Update(diff);\n+            return;\n+        }\n+\n+        bot_pet_AI->CommonTimers(diff);\n+    }\n+    //end npcbot\n+\n     if (IsAIEnabled() && m_triggerJustAppeared && m_deathState != DEAD)\n     {\n         if (m_respawnCompatibilityMode && m_vehicleKit)\n@@ -691,6 +731,10 @@ void Creature::Update(uint32 diff)\n             break;\n         case DEAD:\n         {\n+            //npcbot\n+            if (bot_AI || bot_pet_AI)\n+                break;\n+            //end npcbot\n             if (!m_respawnCompatibilityMode)\n             {\n                 TC_LOG_ERROR(\"entities.unit\", \"Creature {} in wrong state: DEAD (3)\", GetGUID().ToString());\n@@ -756,8 +800,21 @@ void Creature::Update(uint32 diff)\n                 else\n                     m_groupLootTimer -= diff;\n             }\n+            //npcbot: update dead bots\n+            else if (bot_AI)\n+            {\n+                bot_AI->UpdateDeadAI(diff);\n+                break;\n+            }\n+            else if (bot_pet_AI)\n+                break;\n+            //end npcbot\n             else if (m_corpseRemoveTime <= GameTime::GetGameTime())\n             {\n+                //npcbot: do not remove corpse\n+                if (IsNPCBotOrPet())\n+                    break;\n+                //end npcbot\n                 RemoveCorpse(false);\n                 TC_LOG_DEBUG(\"entities.unit\", \"Removing corpse... {} \", GetEntry());\n             }\n@@ -769,6 +826,9 @@ void Creature::Update(uint32 diff)\n \n             // creature can be dead after Unit::Update call\n             // CORPSE/DEAD state will processed at next tick (in other case death timer will be updated unexpectedly)\n+            //npcbot - skip dead state for bots (handled by AI)\n+            if (!bot_AI && !bot_pet_AI)\n+            //end npcbot\n             if (!IsAlive())\n                 break;\n \n@@ -822,6 +882,11 @@ void Creature::Update(uint32 diff)\n \n             Unit::AIUpdateTick(diff);\n \n+            //npcbot: skip regeneration\n+            if (bot_AI || bot_pet_AI)\n+                break;\n+            //end npcbot\n+\n             // creature can be dead after UpdateAI call\n             // CORPSE/DEAD state will processed at next tick (in other case death timer will be updated unexpectedly)\n             if (!IsAlive())\n@@ -1007,6 +1072,11 @@ bool Creature::AIM_Create(CreatureAI* ai /*= nullptr*/)\n {\n     Motion_Initialize();\n \n+    //npcbot: prevent overriding bot_AI\n+    if (bot_AI || bot_pet_AI)\n+        return false;\n+    //end npcbot\n+\n     SetAI(ai ? ai : FactorySelector::SelectAI(this));\n \n     return true;\n@@ -1278,7 +1348,16 @@ void Creature::SetLootRecipient(Unit* unit, bool withGroup)\n     if (unit->GetTypeId() != TYPEID_PLAYER && !unit->IsVehicle())\n         return;\n \n+    /*\n     Player* player = unit->GetCharmerOrOwnerPlayerOrPlayerItself();\n+    */\n+    //npcbot - loot recipient of bot's vehicle is owner\n+    Player* player = nullptr;\n+    if (unit->IsVehicle() && unit->GetCharmerGUID().IsCreature() && unit->GetCreator() && unit->GetCreator()->IsPlayer())\n+        player = unit->GetCreator()->ToPlayer();\n+    else\n+        player = unit->GetCharmerOrOwnerPlayerOrPlayerItself();\n+    //end npcbot\n     if (!player)                                             // normal creature, no player involved\n         return;\n \n@@ -1291,6 +1370,11 @@ void Creature::SetLootRecipient(Unit* unit, bool withGroup)\n     else\n         m_lootRecipientGroup = ObjectGuid::Empty;\n \n+    //npcbot: prevent visual tap on owned bots\n+    if (IsNPCBotOrPet() && !IsFreeBot())\n+        return;\n+    //end npcbot\n+\n     SetDynamicFlag(UNIT_DYNFLAG_TAPPED);\n }\n \n@@ -1309,6 +1393,11 @@ bool Creature::isTappedBy(Player const* player) const\n \n void Creature::SaveToDB()\n {\n+    //npcbot: disallow saving generated bots\n+    if (IsNPCBot() && GetBotAI() && GetBotAI()->IsWanderer())\n+        return;\n+    //end npcbot\n+\n     // this should only be used when the creature has already been loaded\n     // preferably after adding to map, because mapid may not be valid otherwise\n     CreatureData const* data = sObjectMgr->GetCreatureData(m_spawnId);\n@@ -1324,6 +1413,11 @@ void Creature::SaveToDB()\n \n void Creature::SaveToDB(uint32 mapid, uint8 spawnMask, uint32 phaseMask)\n {\n+    //npcbot: disallow saving generated bots\n+    if (IsNPCBot() && GetBotAI() && GetBotAI()->IsWanderer())\n+        return;\n+    //end npcbot\n+\n     // update in loaded data\n     if (!m_spawnId)\n         m_spawnId = sObjectMgr->GenerateCreatureSpawnId();\n@@ -1637,6 +1731,11 @@ bool Creature::LoadFromDB(ObjectGuid::LowType spawnId, Map* map, bool addToMap,\n         return false;\n     }\n \n+    //npcbot\n+    if (BotDataMgr::SelectNpcBotData(data->id))\n+        return false;\n+    //end npcbot\n+\n     m_spawnId = spawnId;\n \n     m_respawnCompatibilityMode = ((data->spawnGroupData->flags & SPAWNGROUP_FLAG_COMPATIBILITY_MODE) != 0);\n@@ -1652,6 +1751,11 @@ bool Creature::LoadFromDB(ObjectGuid::LowType spawnId, Map* map, bool addToMap,\n \n     m_deathState = ALIVE;\n \n+    //npcbot: remove respawn time if any\n+    if (IsNPCBotOrPet())\n+        map->RemoveRespawnTime(SPAWN_TYPE_CREATURE, spawnId, nullptr, true);\n+    //end npcbot\n+\n     m_respawnTime = GetMap()->GetCreatureRespawnTime(m_spawnId);\n \n     if (!m_respawnTime && !map->IsSpawnGroupActive(data->spawnGroupData->groupId))\n@@ -1701,6 +1805,24 @@ bool Creature::LoadFromDB(ObjectGuid::LowType spawnId, Map* map, bool addToMap,\n \n     m_stringIds[AsUnderlyingType(StringIdType::Spawn)] = &data->StringId;\n \n+    //npcbot\n+    if (IsNPCBot())\n+    {\n+        //prevent loading npcbot twice (grid unload/load case)\n+        if (sWorld->GetMaxPlayerCount() > 0)\n+            return false;\n+\n+        TC_LOG_INFO(\"entities.unit\", \"Creature: loading npcbot {} (id: {})\", GetName(), GetEntry());\n+        ASSERT(!IsInWorld());\n+\n+        //don't allow removing dead bot's corpse\n+        m_respawnCompatibilityMode = true;\n+        m_corpseDelay = 0;\n+        m_respawnDelay = 0;\n+        setActive(true);\n+    }\n+    //end npcbot\n+\n     if (addToMap && !GetMap()->AddToMap(this))\n         return false;\n     return true;\n@@ -1714,6 +1836,11 @@ void Creature::SetCanDualWield(bool value)\n \n void Creature::LoadEquipment(int8 id, bool force /*= true*/)\n {\n+    //npcbot: prevent loading equipment for bots\n+    if (IsNPCBot())\n+        return;\n+    //end npcbot\n+\n     if (id == 0)\n     {\n         if (force)\n@@ -1860,6 +1987,11 @@ bool Creature::IsInvisibleDueToDespawn() const\n     if (IsAlive() || isDying() || m_corpseRemoveTime > GameTime::GetGameTime())\n         return false;\n \n+    //npcbot\n+    if (bot_AI || bot_pet_AI)\n+        return false;\n+    //end npcbot\n+\n     return true;\n }\n \n@@ -1877,9 +2009,18 @@ bool Creature::CanStartAttack(Unit const* who, bool force) const\n         return false;\n \n     // This set of checks is should be done only for creatures\n+    //npcbot\n+    /*\n+    //end npcbot\n     if ((IsImmuneToNPC() && !who->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED))\n         || (IsImmuneToPC() && who->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED)))\n         return false;\n+    //npcbot\n+    */\n+    if ((IsImmuneToNPC() && !(who->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) || who->IsNPCBotOrPet())) ||\n+        (IsImmuneToPC() && (who->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) || who->IsNPCBotOrPet())))\n+        return false;\n+    //end npcbot\n \n     // Do not attack non-combat pets\n     if (who->GetTypeId() == TYPEID_UNIT && who->GetCreatureType() == CREATURE_TYPE_NON_COMBAT_PET)\n@@ -2065,6 +2206,11 @@ void Creature::setDeathState(DeathState s)\n \n void Creature::Respawn(bool force)\n {\n+    //npcbot\n+    if (IsNPCBotOrPet())\n+        return;\n+    //end npcbot\n+\n     if (force)\n     {\n         if (IsAlive())\n@@ -2128,6 +2274,11 @@ void Creature::Respawn(bool force)\n \n void Creature::ForcedDespawn(uint32 timeMSToDespawn, Seconds forceRespawnTimer)\n {\n+    //npcbot\n+    if (IsNPCBotOrPet())\n+        return;\n+    //end npcbot\n+\n     if (timeMSToDespawn)\n     {\n         m_Events.AddEvent(new ForcedDespawnDelayEvent(*this, forceRespawnTimer), m_Events.CalculateTime(Milliseconds(timeMSToDespawn)));\n@@ -2395,6 +2546,11 @@ bool Creature::CanAssistTo(Unit const* u, Unit const* enemy, bool checkfaction /\n     if (!GetCharmerOrOwnerGUID().IsEmpty())\n         return false;\n \n+    //npcbot\n+    if (IsNPCBotOrPet())\n+        return false;\n+    //end npcbot\n+\n     // only from same creature faction\n     if (checkfaction)\n     {\n@@ -2454,6 +2610,12 @@ void Creature::SaveRespawnTime(uint32 forceDelay)\n         ri.type = SPAWN_TYPE_CREATURE;\n         ri.spawnId = m_spawnId;\n         ri.respawnTime = m_respawnTime;\n+\n+        //npcbot: save entry for checks\n+        if (IsNPCBot())\n+            ri.entry = GetEntry();\n+        //end npcbot\n+\n         GetMap()->SaveRespawnInfoDB(ri);\n         return;\n     }\n@@ -2595,6 +2757,16 @@ void Creature::SendZoneUnderAttackMessage(Player* attacker)\n \n uint32 Creature::GetShieldBlockValue() const                  //dunno mob block value\n {\n+    //npcbot - bot block value is fully calculated inside botAI\n+    if (bot_AI)\n+    {\n+        uint32 blockValue = bot_AI->GetShieldBlockValue();\n+        blockValue += GetTotalAuraModifier(SPELL_AURA_MOD_SHIELD_BLOCKVALUE);\n+        blockValue *= GetTotalAuraMultiplier(SPELL_AURA_MOD_SHIELD_BLOCKVALUE_PCT);\n+        return uint32(blockValue);\n+    }\n+    //end npcbot\n+\n     return (GetLevel()/2 + uint32(GetStat(STAT_STRENGTH)/20));\n }\n \n@@ -2653,6 +2825,17 @@ void Creature::UpdateMovementFlags()\n     if (IsMovedByClient())\n         return;\n \n+    //npcbot: do not update movement flags for vehicles controlled by npcbots\n+    if (GetCharmerGUID().IsCreature())\n+    {\n+        if (CreatureTemplate const* bot_template = sObjectMgr->GetCreatureTemplate(GetCharmerGUID().GetEntry()))\n+        {\n+            if (bot_template->IsNPCBot())\n+                return;\n+        }\n+    }\n+    //end npcbot\n+\n     // Creatures with CREATURE_FLAG_EXTRA_NO_MOVE_FLAGS_UPDATE should control MovementFlags in your own scripts\n     if (GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_NO_MOVE_FLAGS_UPDATE)\n         return;\n@@ -2703,6 +2886,11 @@ bool Creature::CanSwim() const\n     if (IsPet())\n         return true;\n \n+    //npcbot\n+    if (IsNPCBotOrPet())\n+        return true;\n+    //end npcbot\n+\n     return false;\n }\n \n@@ -2727,6 +2915,11 @@ void Creature::RefreshCanSwimFlag(bool recheck)\n \n void Creature::AllLootRemovedFromCorpse()\n {\n+    //npcbot\n+    if (IsNPCBotOrPet())\n+        return;\n+    //end npcbot\n+\n     if (loot.loot_type != LOOT_SKINNING && !IsPet() && GetCreatureTemplate()->SkinLootId && hasLootRecipient())\n         if (LootTemplates_Skinning.HaveLootFor(GetCreatureTemplate()->SkinLootId))\n             SetUnitFlag(UNIT_FLAG_SKINNABLE);\n@@ -3028,6 +3221,15 @@ void Creature::SetDisplayId(uint32 modelId)\n         SetBoundingRadius((IsPet() ? 1.0f : minfo->bounding_radius) * GetObjectScale());\n         SetCombatReach((IsPet() ? DEFAULT_PLAYER_COMBAT_REACH : minfo->combat_reach) * GetObjectScale());\n     }\n+\n+    //npcbot: send group update for bot pet\n+    if (IsNPCBotPet())\n+    {\n+        if (Creature const* botPetOwner = GetBotPetAI() ? GetBotPetAI()->GetPetsOwner() : nullptr)\n+            if (botPetOwner->GetBotAI()->GetGroup())\n+                BotMgr::SetBotGroupUpdateFlag(botPetOwner, GROUP_UPDATE_FLAG_PET_MODEL_ID);\n+    }\n+    //end npcbot\n }\n \n void Creature::SetTarget(ObjectGuid guid)\n@@ -3127,6 +3329,13 @@ void Creature::ReleaseSpellFocus(Spell const* focusSpell, bool withDelay)\n         if (!HasUnitFlag2(UNIT_FLAG2_CANNOT_TURN))\n             ReacquireSpellFocusTarget();\n     }\n+    //npcbot: bots and botpets do not use delay\n+    else if (IsNPCBot() || IsNPCBotPet())\n+    {\n+        if (!HasUnitFlag2(UNIT_FLAG2_CANNOT_TURN))\n+            ReacquireSpellFocusTarget();\n+    }\n+    //end npcbot\n     else // don't allow re-target right away to prevent visual bugs\n         _spellFocusInfo.Delay = withDelay ? 1000 : 1;\n \n@@ -3302,3 +3511,388 @@ void Creature::ExitVehicle(Position const* /*exitPosition*/)\n     if (isInVehicle && IsAlive())\n         SetHomePosition(GetPosition());\n }\n+\n+//NPCBOT\n+bool Creature::LoadBotCreatureFromDB(ObjectGuid::LowType spawnId, Map* map, bool addToMap, bool generated, uint32 entry, Position const* pos)\n+{\n+    CreatureData const* data = generated ? nullptr : sObjectMgr->GetCreatureData(spawnId);\n+    if (!data)\n+    {\n+        if (!generated)\n+        {\n+            TC_LOG_ERROR(\"sql.sql\", \"Bot creature (GUID: {}) not found in table `creature`, can't load. \", spawnId);\n+            return false;\n+        }\n+        else\n+        {\n+            ASSERT(entry != 0);\n+            ASSERT_NOTNULL(pos);\n+        }\n+    }\n+\n+    m_spawnId = spawnId;\n+    ASSERT(map->GetInstanceId() == 0);\n+\n+    m_respawnCompatibilityMode = true;\n+    m_creatureData = data;\n+    m_wanderDistance = data ? data->wander_distance : 0.f;\n+\n+    if (!Create(map->GenerateLowGuid<HighGuid::Unit>(), map,\n+        data ? data->phaseMask : PHASEMASK_NORMAL,\n+        data ? data->id : entry, data ? data->spawnPoint : *pos,\n+        data, 0U, !m_respawnCompatibilityMode))\n+        return false;\n+\n+    //We should set first home position, because then AI calls home movement\n+    SetHomePosition(*this);\n+\n+    m_deathState = ALIVE;\n+    m_respawnTime = 0;\n+\n+    SetSpawnHealth();\n+\n+    // checked at creature_template loading\n+    m_defaultMovementType = data ? MovementGeneratorType(data->movementType) : IDLE_MOTION_TYPE;\n+\n+    TC_LOG_INFO(\"entities.unit\", \"Creature: loading npcbot {} (id: {}, gen: {})\", GetName(), GetEntry(), uint32(generated));\n+    ASSERT(!IsInWorld());\n+\n+    m_corpseDelay = 0;\n+    m_respawnDelay = 0;\n+    setActive(true);\n+\n+    if (addToMap && !GetMap()->AddToMap(this))\n+        return false;\n+\n+    return true;\n+}\n+\n+uint8 Creature::GetBotClass() const\n+{\n+    return bot_AI ? bot_AI->GetBotClass() : GetClass();\n+}\n+\n+Player* Creature::GetBotOwner() const\n+{\n+    return bot_AI ? bot_AI->GetBotOwner() : bot_pet_AI ? bot_pet_AI->GetPetsOwner()->GetBotOwner() : nullptr;\n+}\n+Unit* Creature::GetBotsPet() const\n+{\n+    return bot_AI ? bot_AI->GetBotsPet() : nullptr;\n+}\n+\n+bool Creature::IsNPCBot() const\n+{\n+    return GetCreatureTemplate()->IsNPCBot();\n+}\n+\n+bool Creature::IsNPCBotPet() const\n+{\n+    return GetCreatureTemplate()->IsNPCBotPet();\n+}\n+\n+bool Creature::IsNPCBotOrPet() const\n+{\n+    return GetCreatureTemplate()->IsNPCBotOrPet();\n+}\n+\n+bool Creature::IsFreeBot() const\n+{\n+    return bot_AI ? bot_AI->IAmFree() : bot_pet_AI ? bot_pet_AI->IAmFree() : false;\n+}\n+\n+bool Creature::IsWandererBot() const\n+{\n+    return bot_AI ? bot_AI->IsWanderer() : bot_pet_AI ? bot_pet_AI->IsWanderer() : false;\n+}\n+\n+Group* Creature::GetBotGroup() const\n+{\n+    return bot_AI ? bot_AI->GetGroup() : nullptr;\n+}\n+void Creature::SetBotGroup(Group* group, int8 subgroup)\n+{\n+    if (bot_AI)\n+        bot_AI->SetGroup(group, subgroup);\n+}\n+uint8 Creature::GetSubGroup() const\n+{\n+    return bot_AI ? bot_AI->GetSubGroup() : 0;\n+}\n+void Creature::SetSubGroup(uint8 subgroup)\n+{\n+    if (bot_AI)\n+        bot_AI->SetSubGroup(subgroup);\n+}\n+\n+void Creature::SetBattlegroundOrBattlefieldRaid(Group* group, int8 subgroup)\n+{\n+    if (bot_AI)\n+        bot_AI->SetBattlegroundOrBattlefieldRaid(group, subgroup);\n+}\n+void Creature::RemoveFromBattlegroundOrBattlefieldRaid()\n+{\n+    if (bot_AI)\n+        bot_AI->RemoveFromBattlegroundOrBattlefieldRaid();\n+}\n+Group* Creature::GetOriginalGroup() const\n+{\n+    return bot_AI ? bot_AI->GetOriginalGroup() : nullptr;\n+}\n+void Creature::SetOriginalGroup(Group* group, int8 subgroup)\n+{\n+    if (bot_AI)\n+        bot_AI->SetOriginalGroup(group, subgroup);\n+}\n+uint8 Creature::GetOriginalSubGroup() const\n+{\n+    return bot_AI ? bot_AI->GetOriginalSubGroup() : 0;\n+}\n+void Creature::SetOriginalSubGroup(uint8 subgroup)\n+{\n+    if (bot_AI)\n+        bot_AI->SetOriginalSubGroup(subgroup);\n+}\n+\n+Battleground* Creature::GetBotBG() const\n+{\n+    return bot_AI ? bot_AI->GetBG() : nullptr;\n+}\n+\n+uint32 Creature::GetBotRoles() const\n+{\n+    return bot_AI ? bot_AI->GetBotRoles() : 0;\n+}\n+//Bot damage mods\n+void Creature::ApplyBotDamageMultiplierMelee(uint32& damage, CalcDamageInfo& damageinfo) const\n+{\n+    if (bot_AI)\n+        bot_AI->ApplyBotDamageMultiplierMelee(damage, damageinfo);\n+}\n+void Creature::ApplyBotDamageMultiplierMelee(int32& damage, SpellNonMeleeDamage& damageinfo, SpellInfo const* spellInfo, WeaponAttackType attackType, bool crit) const\n+{\n+    if (bot_AI)\n+        bot_AI->ApplyBotDamageMultiplierMelee(damage, damageinfo, spellInfo, attackType, crit);\n+}\n+void Creature::ApplyBotDamageMultiplierSpell(int32& damage, SpellNonMeleeDamage& damageinfo, SpellInfo const* spellInfo, WeaponAttackType attackType, bool crit) const\n+{\n+    if (bot_AI)\n+        bot_AI->ApplyBotDamageMultiplierSpell(damage, damageinfo, spellInfo, attackType, crit);\n+    else if (bot_pet_AI)\n+        bot_pet_AI->ApplyBotDamageMultiplierSpell(damage, damageinfo, spellInfo, attackType, crit);\n+}\n+void Creature::ApplyBotDamageMultiplierHeal(Unit const* victim, float& heal, SpellInfo const* spellInfo, DamageEffectType damagetype, uint32 stack) const\n+{\n+    if (bot_AI)\n+        bot_AI->ApplyBotDamageMultiplierHeal(victim, heal, spellInfo, damagetype, stack);\n+}\n+void Creature::ApplyBotCritMultiplierAll(Unit const* victim, float& crit_chance, SpellInfo const* spellInfo, SpellSchoolMask schoolMask, WeaponAttackType attackType) const\n+{\n+    if (bot_AI)\n+        bot_AI->ApplyBotCritMultiplierAll(victim, crit_chance, spellInfo, schoolMask, attackType);\n+}\n+void Creature::ApplyCreatureSpellCostMods(SpellInfo const* spellInfo, int32& cost) const\n+{\n+    if (bot_AI)\n+        bot_AI->ApplyBotSpellCostMods(spellInfo, cost);\n+}\n+void Creature::ApplyCreatureSpellCastTimeMods(SpellInfo const* spellInfo, int32& casttime) const\n+{\n+    if (bot_AI)\n+        bot_AI->ApplyBotSpellCastTimeMods(spellInfo, casttime);\n+}\n+void Creature::ApplyCreatureSpellNotLoseCastTimeMods(SpellInfo const* spellInfo, int32& delayReduce) const\n+{\n+    if (bot_AI)\n+        bot_AI->ApplyBotSpellNotLoseCastTimeMods(spellInfo, delayReduce);\n+}\n+void Creature::ApplyCreatureSpellRadiusMods(SpellInfo const* spellInfo, float& radius) const\n+{\n+    if (bot_AI)\n+        bot_AI->ApplyBotSpellRadiusMods(spellInfo, radius);\n+    else if (bot_pet_AI)\n+        bot_pet_AI->ApplyBotPetSpellRadiusMods(spellInfo, radius);\n+}\n+void Creature::ApplyCreatureSpellRangeMods(SpellInfo const* spellInfo, float& maxrange) const\n+{\n+    if (bot_AI)\n+        bot_AI->ApplyBotSpellRangeMods(spellInfo, maxrange);\n+}\n+void Creature::ApplyCreatureSpellMaxTargetsMods(SpellInfo const* spellInfo, uint32& targets) const\n+{\n+    if (bot_AI)\n+        bot_AI->ApplyBotSpellMaxTargetsMods(spellInfo, targets);\n+}\n+void Creature::ApplyCreatureSpellChanceOfSuccessMods(SpellInfo const* spellInfo, float& chance) const\n+{\n+    if (bot_AI)\n+        bot_AI->ApplyBotSpellChanceOfSuccessMods(spellInfo, chance);\n+}\n+\n+void Creature::ApplyCreatureEffectMods(SpellInfo const* spellInfo, uint8 effIndex, float& value) const\n+{\n+    if (bot_AI)\n+        bot_AI->ApplyBotEffectMods(spellInfo, effIndex, value);\n+}\n+\n+void Creature::OnBotSummon(Creature* summon)\n+{\n+    if (bot_AI)\n+        bot_AI->OnBotSummon(summon);\n+}\n+void Creature::OnBotDespawn(Creature* summon)\n+{\n+    if (bot_AI)\n+        bot_AI->OnBotDespawn(summon);\n+}\n+\n+void Creature::BotStopMovement()\n+{\n+    if (IsInWorld())\n+    {\n+        GetMotionMaster()->Clear();\n+        GetMotionMaster()->MoveIdle();\n+    }\n+    StopMoving();\n+    DisableSpline();\n+}\n+\n+bool Creature::CanParry() const\n+{\n+    return bot_AI ? bot_AI->CanParry() : true;\n+}\n+\n+bool Creature::CanDodge() const\n+{\n+    return bot_AI ? bot_AI->CanDodge() : true;\n+}\n+//unused\n+bool Creature::CanBlock() const\n+{\n+    return bot_AI ? bot_AI->CanBlock() : true;\n+}\n+//unused\n+bool Creature::CanCrit() const\n+{\n+    return bot_AI ? bot_AI->CanCrit() : true;\n+}\n+bool Creature::CanMiss() const\n+{\n+    return bot_AI ? bot_AI->CanMiss() : true;\n+}\n+\n+float Creature::GetCreatureParryChance() const\n+{\n+    return bot_AI ? bot_AI->GetBotParryChance() : 5.0f;\n+}\n+float Creature::GetCreatureDodgeChance() const\n+{\n+    return bot_AI ? bot_AI->GetBotDodgeChance() : 5.0f;\n+}\n+float Creature::GetCreatureBlockChance() const\n+{\n+    return bot_AI ? bot_AI->GetBotBlockChance() : 5.0f;\n+}\n+float Creature::GetCreatureCritChance() const\n+{\n+    return bot_AI ? bot_AI->GetBotCritChance() : 0.0f;\n+}\n+float Creature::GetCreatureMissChance() const\n+{\n+    return bot_AI ? bot_AI->GetBotMissChance() : 5.0f;\n+}\n+float Creature::GetCreatureArmorPenetrationCoef() const\n+{\n+    return bot_AI ? bot_AI->GetBotArmorPenetrationCoef() : 0.0f;\n+}\n+uint32 Creature::GetCreatureExpertise() const\n+{\n+    return bot_AI ? bot_AI->GetBotExpertise() : 0;\n+}\n+uint32 Creature::GetCreatureSpellPenetration() const\n+{\n+    return bot_AI ? bot_AI->GetBotSpellPenetration() : 0;\n+}\n+uint32 Creature::GetCreatureSpellPower() const\n+{\n+    return bot_AI ? bot_AI->GetBotSpellPower() : 0;\n+}\n+uint32 Creature::GetCreatureDefense() const\n+{\n+    return bot_AI ? bot_AI->GetBotDefense() : GetMaxSkillValueForLevel();\n+}\n+int32 Creature::GetCreatureResistanceBonus(SpellSchoolMask mask) const\n+{\n+    return bot_AI ? bot_AI->GetBotResistanceBonus(mask) : 0;\n+}\n+\n+uint8 Creature::GetCreatureComboPoints() const\n+{\n+    return bot_AI ? bot_AI->GetBotComboPoints() : 0;\n+}\n+\n+float Creature::GetCreatureAmmoDPS() const\n+{\n+    return bot_AI ? bot_AI->GetBotAmmoDPS() : 0.0f;\n+}\n+\n+bool Creature::IsTempBot() const\n+{\n+    return bot_AI && bot_AI->IsTempBot();\n+}\n+\n+MeleeHitOutcome Creature::BotRollMeleeOutcomeAgainst(Unit const* victim, WeaponAttackType attType) const\n+{\n+    return bot_AI ? bot_AI->BotRollCustomMeleeOutcomeAgainst(victim, attType) : RollMeleeOutcomeAgainst(victim, attType);\n+}\n+\n+void Creature::CastCreatureItemCombatSpell(DamageInfo const& damageInfo)\n+{\n+    if (bot_AI)\n+        bot_AI->CastBotItemCombatSpell(damageInfo);\n+}\n+\n+bool Creature::HasSpellCooldown(uint32 spell_id) const\n+{\n+    if (bot_AI)\n+        return !bot_AI->IsSpellReady(sSpellMgr->GetSpellInfo(spell_id)->GetFirstRankSpell()->Id, bot_AI->GetLastDiff(), false);\n+    else if (bot_pet_AI)\n+        return !bot_pet_AI->IsSpellReady(sSpellMgr->GetSpellInfo(spell_id)->GetFirstRankSpell()->Id, bot_pet_AI->GetLastDiff(), false);\n+\n+    return false;\n+}\n+void Creature::AddBotSpellCooldown(uint32 spellId, uint32 cooldown)\n+{\n+    if (bot_AI)\n+        bot_AI->SetSpellCooldown(sSpellMgr->GetSpellInfo(spellId)->GetFirstRankSpell()->Id, cooldown);\n+    else if (bot_pet_AI)\n+        bot_pet_AI->SetSpellCooldown(sSpellMgr->GetSpellInfo(spellId)->GetFirstRankSpell()->Id, cooldown);\n+}\n+void Creature::ReleaseBotSpellCooldown(uint32 spellId)\n+{\n+    if (bot_AI)\n+        bot_AI->ReleaseSpellCooldown(sSpellMgr->GetSpellInfo(spellId)->GetFirstRankSpell()->Id);\n+    else if (bot_pet_AI)\n+        bot_pet_AI->ReleaseSpellCooldown(sSpellMgr->GetSpellInfo(spellId)->GetFirstRankSpell()->Id);\n+}\n+\n+void Creature::SpendBotRunes(SpellInfo const* spellInfo, bool didHit)\n+{\n+    if (bot_AI)\n+        bot_AI->SpendRunes(spellInfo, didHit);\n+}\n+\n+//equips\n+Item* Creature::GetBotEquips(uint8 slot) const\n+{\n+    return bot_AI ? bot_AI->GetEquips(slot) : nullptr;\n+}\n+Item* Creature::GetBotEquipsByGuid(ObjectGuid itemGuid) const\n+{\n+    return bot_AI ? bot_AI->GetEquipsByGuid(itemGuid) : nullptr;\n+}\n+float Creature::GetBotAverageItemLevel() const\n+{\n+    return bot_AI ? bot_AI->GetAverageItemLevel() : 0.0f;\n+}\n+//END NPCBOT\ndiff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h\nindex e8c5a3e78e..93f1b6060d 100644\n--- a/src/server/game/Entities/Creature/Creature.h\n+++ b/src/server/game/Entities/Creature/Creature.h\n@@ -28,6 +28,12 @@\n #include \"MapObject.h\"\n #include <list>\n \n+// npcbot\n+class bot_ai;\n+class bot_pet_ai;\n+class Battleground;\n+//end npcbot\n+\n class CreatureAI;\n class CreatureGroup;\n class Group;\n@@ -370,6 +376,86 @@ class TC_GAME_API Creature : public Unit, public GridObject<Creature>, public Ma\n \n         void ExitVehicle(Position const* exitPosition = nullptr) override;\n \n+        //NPCBots\n+        bool LoadBotCreatureFromDB(ObjectGuid::LowType guid, Map* map, bool addToMap = true, bool generated = false, uint32 entry = 0, Position const* pos = nullptr);\n+        Player* GetBotOwner() const;\n+        Unit* GetBotsPet() const;\n+        bool IsNPCBot() const override;\n+        bool IsNPCBotPet() const override;\n+        bool IsNPCBotOrPet() const override;\n+        bool IsFreeBot() const;\n+        bool IsWandererBot() const;\n+        Group* GetBotGroup() const;\n+        void SetBotGroup(Group* group, int8 subgroup = -1);\n+        uint8 GetSubGroup() const;\n+        void SetSubGroup(uint8 subgroup);\n+        void SetBattlegroundOrBattlefieldRaid(Group* group, int8 subgroup = -1);\n+        void RemoveFromBattlegroundOrBattlefieldRaid();\n+        Group* GetOriginalGroup() const;\n+        void SetOriginalGroup(Group* group, int8 subgroup = -1);\n+        uint8 GetOriginalSubGroup() const;\n+        void SetOriginalSubGroup(uint8 subgroup);\n+        Battleground* GetBotBG() const;\n+        uint8 GetBotClass() const;\n+        uint32 GetBotRoles() const;\n+        bot_ai* GetBotAI() const { return bot_AI; }\n+        bot_pet_ai* GetBotPetAI() const { return bot_pet_AI; }\n+        void SetBotAI(bot_ai* ai) { bot_AI = ai; }\n+        void SetBotPetAI(bot_pet_ai* ai) { bot_pet_AI = ai; }\n+        void ApplyBotDamageMultiplierMelee(uint32& damage, CalcDamageInfo& damageinfo) const;\n+        void ApplyBotDamageMultiplierMelee(int32& damage, SpellNonMeleeDamage& damageinfo, SpellInfo const* spellInfo, WeaponAttackType attackType, bool crit) const;\n+        void ApplyBotDamageMultiplierSpell(int32& damage, SpellNonMeleeDamage& damageinfo, SpellInfo const* spellInfo, WeaponAttackType attackType, bool crit) const;\n+        void ApplyBotDamageMultiplierHeal(Unit const* victim, float& heal, SpellInfo const* spellInfo, DamageEffectType damagetype, uint32 stack) const;\n+        void ApplyBotCritMultiplierAll(Unit const* victim, float& crit_chance, SpellInfo const* spellInfo, SpellSchoolMask schoolMask, WeaponAttackType attackType) const;\n+        void ApplyCreatureSpellCostMods(SpellInfo const* spellInfo, int32& cost) const;\n+        void ApplyCreatureSpellCastTimeMods(SpellInfo const* spellInfo, int32& casttime) const;\n+        void ApplyCreatureSpellNotLoseCastTimeMods(SpellInfo const* spellInfo, int32& delayReduce) const;\n+        void ApplyCreatureSpellRadiusMods(SpellInfo const* spellInfo, float& radius) const;\n+        void ApplyCreatureSpellRangeMods(SpellInfo const* spellInfo, float& maxrange) const;\n+        void ApplyCreatureSpellMaxTargetsMods(SpellInfo const* spellInfo, uint32& targets) const;\n+        void ApplyCreatureSpellChanceOfSuccessMods(SpellInfo const* spellInfo, float& chance) const;\n+        void ApplyCreatureEffectMods(SpellInfo const* spellInfo, uint8 effIndex, float& value) const;\n+        void OnBotSummon(Creature* summon);\n+        void OnBotDespawn(Creature* summon);\n+        void BotStopMovement();\n+\n+        bool CanParry() const;\n+        bool CanDodge() const;\n+        bool CanBlock() const;\n+        bool CanCrit() const;\n+        bool CanMiss() const;\n+\n+        float GetCreatureParryChance() const;\n+        float GetCreatureDodgeChance() const;\n+        float GetCreatureBlockChance() const;\n+        float GetCreatureCritChance() const;\n+        float GetCreatureMissChance() const;\n+        float GetCreatureArmorPenetrationCoef() const;\n+        uint32 GetCreatureExpertise() const;\n+        uint32 GetCreatureSpellPenetration() const;\n+        uint32 GetCreatureSpellPower() const;\n+        uint32 GetCreatureDefense() const;\n+        int32 GetCreatureResistanceBonus(SpellSchoolMask mask) const;\n+        uint8 GetCreatureComboPoints() const;\n+        float GetCreatureAmmoDPS() const;\n+\n+        bool IsTempBot() const;\n+\n+        MeleeHitOutcome BotRollMeleeOutcomeAgainst(Unit const* victim, WeaponAttackType attType) const;\n+\n+        void CastCreatureItemCombatSpell(DamageInfo const& damageInfo);\n+\n+        bool HasSpellCooldown(uint32 spellId) const;\n+        void AddBotSpellCooldown(uint32 spellId, uint32 cooldown);\n+        void ReleaseBotSpellCooldown(uint32 spellId);\n+\n+        void SpendBotRunes(SpellInfo const* spellInfo, bool didHit);\n+\n+        Item* GetBotEquips(uint8 slot) const;\n+        Item* GetBotEquipsByGuid(ObjectGuid itemGuid) const;\n+        float GetBotAverageItemLevel() const;\n+        //End NPCBots\n+\n     protected:\n         bool CreateFromProto(ObjectGuid::LowType guidlow, uint32 entry, CreatureData const* data = nullptr, uint32 vehId = 0);\n         bool InitEntry(uint32 entry, CreatureData const* data = nullptr);\n@@ -426,6 +512,11 @@ class TC_GAME_API Creature : public Unit, public GridObject<Creature>, public Ma\n         bool CanAlwaysSee(WorldObject const* obj) const override;\n \n     private:\n+        //bot system\n+        bot_ai* bot_AI;\n+        bot_pet_ai* bot_pet_AI;\n+        //end bot system\n+\n         void ForcedDespawn(uint32 timeMSToDespawn = 0, Seconds forceRespawnTimer = 0s);\n         bool CheckNoGrayAggroConfig(uint32 playerLevel, uint32 creatureLevel) const; // No aggro from gray creatures\n \ndiff --git a/src/server/game/Entities/Creature/CreatureData.h b/src/server/game/Entities/Creature/CreatureData.h\nindex b38fb3ab09..aefd246573 100644\n--- a/src/server/game/Entities/Creature/CreatureData.h\n+++ b/src/server/game/Entities/Creature/CreatureData.h\n@@ -212,9 +212,12 @@ enum CreatureFlagsExtra : uint32\n     CREATURE_FLAG_EXTRA_UNUSED_31            = 0x80000000,\n \n     // Masks\n-    CREATURE_FLAG_EXTRA_UNUSED               = (CREATURE_FLAG_EXTRA_UNUSED_22 |\n-                                                CREATURE_FLAG_EXTRA_UNUSED_23 | CREATURE_FLAG_EXTRA_UNUSED_24 | CREATURE_FLAG_EXTRA_UNUSED_25 |\n-                                                CREATURE_FLAG_EXTRA_UNUSED_26 | CREATURE_FLAG_EXTRA_UNUSED_27 | CREATURE_FLAG_EXTRA_UNUSED_31), // SKIP\n+    //npcbot\n+    CREATURE_FLAG_EXTRA_NPCBOT               = (CREATURE_FLAG_EXTRA_UNUSED_31 | CREATURE_FLAG_EXTRA_UNUSED_25 | CREATURE_FLAG_EXTRA_UNUSED_26 | CREATURE_FLAG_EXTRA_UNUSED_27),\n+    CREATURE_FLAG_EXTRA_NPCBOT_PET           = (CREATURE_FLAG_EXTRA_UNUSED_31 | CREATURE_FLAG_EXTRA_UNUSED_25 | CREATURE_FLAG_EXTRA_UNUSED_27),\n+    //end npcbot\n+\n+    CREATURE_FLAG_EXTRA_UNUSED               = (CREATURE_FLAG_EXTRA_UNUSED_22 | CREATURE_FLAG_EXTRA_UNUSED_23 | CREATURE_FLAG_EXTRA_UNUSED_24), // SKIP\n \n     CREATURE_FLAG_EXTRA_DB_ALLOWED           = (0xFFFFFFFF & ~(CREATURE_FLAG_EXTRA_UNUSED | CREATURE_FLAG_EXTRA_DUNGEON_BOSS)) // SKIP\n };\n@@ -357,6 +360,21 @@ struct TC_GAME_API CreatureTemplate\n     uint32  GetFirstVisibleModel() const;\n \n     // helpers\n+    //npcbot\n+    inline bool IsNPCBot() const\n+    {\n+        return (flags_extra & CREATURE_FLAG_EXTRA_NPCBOT) == CREATURE_FLAG_EXTRA_NPCBOT;\n+    }\n+    inline bool IsNPCBotPet() const\n+    {\n+        return (flags_extra & CREATURE_FLAG_EXTRA_NPCBOT) == CREATURE_FLAG_EXTRA_NPCBOT_PET;\n+    }\n+    inline bool IsNPCBotOrPet() const\n+    {\n+        return IsNPCBot() || IsNPCBotPet();\n+    }\n+    //end npcbot\n+\n     SkillType GetRequiredLootSkill() const\n     {\n         if (type_flags & CREATURE_TYPE_FLAG_SKIN_WITH_HERBALISM)\ndiff --git a/src/server/game/Entities/Creature/TemporarySummon.cpp b/src/server/game/Entities/Creature/TemporarySummon.cpp\nindex cd3c0b9969..5a2c04a319 100644\n--- a/src/server/game/Entities/Creature/TemporarySummon.cpp\n+++ b/src/server/game/Entities/Creature/TemporarySummon.cpp\n@@ -26,6 +26,11 @@\n #include \"Pet.h\"\n #include \"Player.h\"\n \n+//npcbot\n+#include \"botmgr.h\"\n+#include \"bpet_ai.h\"\n+//end npcbot\n+\n TempSummon::TempSummon(SummonPropertiesEntry const* properties, WorldObject* owner, bool isWorldObject) :\n Creature(isWorldObject), m_Properties(properties), m_type(TEMPSUMMON_MANUAL_DESPAWN),\n m_timer(0), m_lifetime(0), m_canFollowOwner(true)\n@@ -196,6 +201,12 @@ void TempSummon::InitStats(uint32 duration)\n     if (!m_Properties)\n         return;\n \n+    //npcbot: skip deleting/reassigning player totems\n+    //normally no creatorGUID is assigned at this point, perform full check anyway for compatibilty reasons\n+    if (!(m_Properties->Slot && m_Properties->Slot >= SUMMON_SLOT_TOTEM_FIRE && m_Properties->Slot < MAX_TOTEM_SLOT &&\n+        !GetCreatorGUID().IsEmpty() && GetCreatorGUID().IsCreature() && owner && owner->GetTypeId() == TYPEID_PLAYER &&\n+        owner->ToPlayer()->HaveBot() && owner->ToPlayer()->GetBotMgr()->GetBot(GetCreatorGUID())))\n+    //end npcbot\n     if (owner)\n     {\n         std::ptrdiff_t slot = m_Properties->Slot;\n@@ -234,6 +245,14 @@ void TempSummon::InitSummon()\n         }\n         if (IsAIEnabled())\n             AI()->IsSummonedBy(owner);\n+\n+        //npcbot\n+        if (IsTempBot())\n+        {\n+            m_summonerGUID = ObjectGuid::Empty;\n+            SetCreatorGUID(m_summonerGUID);\n+        }\n+        //end npcbot\n     }\n }\n \n@@ -265,6 +284,14 @@ void TempSummon::UnSummon(uint32 msTime)\n         return;\n     }\n \n+    //npcbot\n+    if (IsNPCBotPet())\n+    {\n+        if (Creature* petowner = GetBotPetAI()->GetPetsOwner())\n+            petowner->AI()->SummonedCreatureDespawn(this);\n+    }\n+    else\n+    //end npcbot\n     if (WorldObject * owner = GetSummoner())\n     {\n         if (owner->GetTypeId() == TYPEID_UNIT && owner->ToCreature()->IsAIEnabled())\n@@ -323,6 +350,15 @@ void Minion::InitStats(uint32 duration)\n \n     SetReactState(REACT_PASSIVE);\n \n+    //npcbot\n+    //do not add bot totem to player's controlled list\n+    //client indicator will be OwnerGUID\n+    if (m_Properties && m_Properties->Slot && m_Properties->Slot >= SUMMON_SLOT_TOTEM_FIRE && m_Properties->Slot < MAX_TOTEM_SLOT &&\n+        !GetCreatorGUID().IsEmpty() && GetCreatorGUID().IsCreature() && GetOwner() && GetOwner()->GetTypeId() == TYPEID_PLAYER &&\n+        GetOwner()->ToPlayer()->HaveBot() && GetOwner()->ToPlayer()->GetBotMgr()->GetBot(GetCreatorGUID()))\n+        return;\n+    //end npcbot\n+\n     SetCreatorGUID(GetOwner()->GetGUID());\n     SetFaction(GetOwner()->GetFaction());\n \ndiff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp\nindex 910956081e..8a74c721dc 100644\n--- a/src/server/game/Entities/GameObject/GameObject.cpp\n+++ b/src/server/game/Entities/GameObject/GameObject.cpp\n@@ -706,6 +706,17 @@ void GameObject::Update(uint32 diff)\n                         Trinity::PlayerSearcher<Trinity::AnyPlayerInObjectRangeCheck> searcher(this, player, checker);\n                         Cell::VisitWorldObjects(this, searcher, radius);\n                         target = player;\n+\n+                        //npcbot\n+                        if (!target)\n+                        {\n+                            Creature* bot = nullptr;\n+                            std::function bot_checker = [=, this](Creature const* c) { return c->IsNPCBot() && c->IsAlive() && IsWithinDistInMap(c, radius); };\n+                            Trinity::CreatureSearcher searcher(this, bot, bot_checker);\n+                            Cell::VisitAllObjects(this, searcher, radius);\n+                            target = bot;\n+                        }\n+                        //end npcbot\n                     }\n \n                     if (target)\n@@ -793,6 +804,12 @@ void GameObject::Update(uint32 diff)\n                             if (Player* player = target->ToPlayer())\n                                 if (Battleground* bg = player->GetBattleground())\n                                     bg->HandleTriggerBuff(GetGUID());\n+\n+                        //npcbot\n+                        if (target->IsNPCBot() && !goInfo->trap.diameter && goInfo->trap.cooldown == 3)\n+                            if (Battleground* bg = target->ToCreature()->GetBotBG())\n+                                bg->HandleTriggerBuff(GetGUID());\n+                        //end npcbot\n                     }\n                     break;\n                 }\n@@ -1926,6 +1943,39 @@ void GameObject::Use(Unit* user)\n \n         case GAMEOBJECT_TYPE_RITUAL:              //18\n         {\n+            //npcbot\n+            if (user->IsNPCBot())\n+            {\n+                GameObjectTemplate const* info = GetGOInfo();\n+                Player* botOwner = user->ToCreature()->GetBotOwner();\n+                spellCaster = botOwner;\n+\n+                if (info->summoningRitual.animSpell)\n+                {\n+                    user->CastSpell(user, info->summoningRitual.animSpell, true);\n+                    triggered = true;\n+                }\n+\n+                spellId = info->summoningRitual.spellId;\n+                if (spellId == 62330)\n+                {\n+                    spellId = 61993;\n+                    triggered = true;\n+                }\n+                if (!info->summoningRitual.ritualPersistent)\n+                    SetLootState(GO_JUST_DEACTIVATED);\n+                else\n+                {\n+                    // reset ritual for this GO\n+                    m_ritualOwnerGUID.Clear();\n+                    m_unique_users.clear();\n+                    m_usetimes = 0;\n+                }\n+\n+                break;\n+            }\n+            //end npcbot\n+\n             if (user->GetTypeId() != TYPEID_PLAYER)\n                 return;\n \n@@ -2081,6 +2131,20 @@ void GameObject::Use(Unit* user)\n \n         case GAMEOBJECT_TYPE_FLAGSTAND:                     // 24\n         {\n+            //npcbot\n+            if (user->IsNPCBot())\n+            {\n+                Creature* bot = user->ToCreature();\n+                if (Battleground* botbg = bot->GetBotBG())\n+                {\n+                    bot->RemoveAurasByType(SPELL_AURA_MOD_STEALTH);\n+                    bot->RemoveAurasByType(SPELL_AURA_MOD_INVISIBILITY);\n+                    botbg->EventBotClickedOnFlag(bot, this);\n+                    return;\n+                }\n+            }\n+            //end npcbot\n+\n             if (user->GetTypeId() != TYPEID_PLAYER)\n                 return;\n \n@@ -2125,6 +2189,38 @@ void GameObject::Use(Unit* user)\n \n         case GAMEOBJECT_TYPE_FLAGDROP:                      // 26\n         {\n+            //npcbot\n+            if (user->IsNPCBot())\n+            {\n+                Creature* bot = user->ToCreature();\n+                if (Battleground* botbg = bot->GetBotBG())\n+                {\n+                    bot->RemoveAurasByType(SPELL_AURA_MOD_STEALTH);\n+                    bot->RemoveAurasByType(SPELL_AURA_MOD_INVISIBILITY);\n+\n+                    if (GameObjectTemplate const* bgoinfo = GetGOInfo())\n+                    {\n+                        switch (bgoinfo->entry)\n+                        {\n+                            case 179785:                        // Silverwing Flag\n+                            case 179786:                        // Warsong Flag\n+                                if (botbg->GetTypeID(true) == BATTLEGROUND_WS)\n+                                    botbg->EventBotClickedOnFlag(bot, this);\n+                                break;\n+                            case 184142:                        // Netherstorm Flag\n+                                if (botbg->GetTypeID(true) == BATTLEGROUND_EY)\n+                                    botbg->EventBotClickedOnFlag(bot, this);\n+                                break;\n+                        }\n+                    }\n+                    //this cause to call return, all flags must be deleted here!!\n+                    spellId = 0;\n+                    Delete();\n+                    break;\n+                }\n+            }\n+            //end npcbot\n+\n             if (user->GetTypeId() != TYPEID_PLAYER)\n                 return;\n \ndiff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp\nindex c2dd09c59c..2c67da53bd 100644\n--- a/src/server/game/Entities/Object/Object.cpp\n+++ b/src/server/game/Entities/Object/Object.cpp\n@@ -51,6 +51,11 @@\n #include \"World.h\"\n #include <G3D/Vector3.h>\n \n+//npcbot\n+#include \"botdatamgr.h\"\n+#include \"botmgr.h\"\n+//end npcbot\n+\n constexpr float VisibilityDistances[AsUnderlyingType(VisibilityDistanceType::Max)] =\n {\n     DEFAULT_VISIBILITY_DISTANCE,\n@@ -996,6 +1001,11 @@ void WorldObject::setActive(bool on)\n     if (GetTypeId() == TYPEID_PLAYER)\n         return;\n \n+    //npcbot: bots should never be removed from active\n+    if (on == false && IsNPCBotOrPet())\n+        return;\n+    //end npcbot\n+\n     m_isActive = on;\n \n     if (on && !IsInWorld())\n@@ -1642,7 +1652,26 @@ bool WorldObject::CanDetect(WorldObject const* obj, bool implicitDetect, bool ch\n {\n     WorldObject const* seer = this;\n \n-    // If a unit is possessing another one, it uses the detection of the latter\n+    //npcbot: master's sight only partially affects bots\n+    if (IsNPCBot())\n+    {\n+        Unit const* owner = ToCreature()->GetBotOwner();\n+        if (!owner)\n+            owner = ToUnit();\n+\n+        if (!obj->IsAlwaysDetectableFor(seer) && !obj->IsAlwaysDetectableFor(owner) && !implicitDetect)\n+        {\n+            if (!seer->CanDetectInvisibilityOf(obj) && !(owner->IsInWorld() && owner->GetMap()->IsDungeon() && owner->CanDetectInvisibilityOf(obj)))\n+                return false;\n+\n+            if (!seer->CanDetectStealthOf(obj, checkAlert))\n+                return false;\n+        }\n+\n+        return true;\n+    }\n+    //end npcbot\n+\n     // Pets don't have detection, they use the detection of their masters\n     if (Unit const* thisUnit = ToUnit())\n     {\n@@ -1918,6 +1947,11 @@ TempSummon* Map::SummonCreature(uint32 entry, Position const& pos, SummonPropert\n             summon = new Puppet(properties, summonerUnit);\n             break;\n         case UNIT_MASK_TOTEM:\n+            //npcbot: totem emul step 1\n+            if (summoner && summoner->IsNPCBot())\n+                summon = new Totem(properties, summoner->ToCreature()->GetBotOwner());\n+            else\n+            //end npcbot\n             summon = new Totem(properties, summonerUnit);\n             break;\n         case UNIT_MASK_MINION:\n@@ -1931,6 +1965,11 @@ TempSummon* Map::SummonCreature(uint32 entry, Position const& pos, SummonPropert\n         return nullptr;\n     }\n \n+    //npcbot: totem emul step 2\n+    if (summoner && summoner->IsNPCBot() && !summon->IsTempBot())\n+        summon->SetCreatorGUID(summoner->GetGUID()); // see TempSummon::InitStats()\n+    //end npcbot\n+\n     summon->SetCreatedBySpell(spellId);\n \n     summon->SetHomePosition(pos);\n@@ -1942,6 +1981,11 @@ TempSummon* Map::SummonCreature(uint32 entry, Position const& pos, SummonPropert\n     AddToMap(summon->ToCreature());\n     summon->InitSummon();\n \n+    //npcbot: totem emul step 3\n+    if (summoner && summoner->IsNPCBot())\n+        summoner->ToCreature()->OnBotSummon(summon);\n+    //end npcbot\n+\n     // call MoveInLineOfSight for nearby creatures\n     Trinity::AIRelocationNotifier notifier(*summon);\n     Cell::VisitAllObjects(summon, notifier, GetVisibilityRange());\n@@ -2206,11 +2250,23 @@ Player* WorldObject::GetCharmerOrOwnerPlayerOrPlayerItself() const\n     if (guid.IsPlayer())\n         return ObjectAccessor::GetPlayer(*this, guid);\n \n+    //npcbot\n+    if (GetTypeId() == TYPEID_UNIT && ToCreature()->IsNPCBotOrPet())\n+        if (Unit* creator = ToUnit()->GetCreator())\n+            return creator->ToPlayer();\n+    //end npcbot\n+\n     return const_cast<WorldObject*>(this)->ToPlayer();\n }\n \n Player* WorldObject::GetAffectingPlayer() const\n {\n+    //npcbot: affecting player is creator\n+    if (GetTypeId() == TYPEID_UNIT && ToCreature()->IsNPCBotOrPet())\n+        if (Unit* creator = ToUnit()->GetCreator())\n+            return creator->ToPlayer();\n+    //end npcbot\n+\n     if (!GetCharmerOrOwnerGUID())\n         return const_cast<WorldObject*>(this)->ToPlayer();\n \n@@ -2296,12 +2352,36 @@ float WorldObject::ApplyEffectModifiers(SpellInfo const* spellInfo, uint8 effInd\n                 break;\n         }\n     }\n+\n+    //npcbot: handle effect mods\n+    if (IsNPCBot())\n+        ToCreature()->ApplyCreatureEffectMods(spellInfo, effIndex, value);\n+    //end npcbot\n+\n     return value;\n }\n \n int32 WorldObject::CalcSpellDuration(SpellInfo const* spellInfo) const\n {\n     uint8 comboPoints = 0;\n+    //npcbot\n+    if (IsNPCBot())\n+        comboPoints = ToCreature()->GetCreatureComboPoints();\n+    else\n+    //npcbot: combo points support for spell duration (vehicle)\n+    if (ToCreature() && ToCreature()->IsVehicle() && ToCreature()->GetCharmerGUID().IsCreature() &&\n+        spellInfo->GetDuration() != spellInfo->GetMaxDuration())\n+    {\n+        Unit const* bot = ToCreature()->GetCharmer();\n+        if (bot && bot->IsNPCBot())\n+        {\n+            comboPoints = bot->ToCreature()->GetCreatureComboPoints();\n+            //TC_LOG_ERROR(\"scripts\", \"CalcSpellDuration bot {} veh spell {} cp {}\",\n+            //    bot->GetName(), spellProto->Id, uint32(comboPoints));\n+        }\n+    }\n+    else\n+    //end npcbot\n     if (Unit const* unit = ToUnit())\n         comboPoints = unit->GetComboPoints();\n \n@@ -2420,6 +2500,11 @@ void WorldObject::ModSpellCastTime(SpellInfo const* spellInfo, int32& castTime,\n     if (Player* modOwner = GetSpellModOwner())\n         modOwner->ApplySpellMod(spellInfo->Id, SPELLMOD_CASTING_TIME, castTime, spell);\n \n+    //npcbot - apply bot spell cast time mods\n+    if (castTime > 0 && IsNPCBot())\n+        ToCreature()->ApplyCreatureSpellCastTimeMods(spellInfo, castTime);\n+    //end npcbot\n+\n     Unit const* unitCaster = ToUnit();\n     if (!unitCaster)\n         return;\n@@ -2445,6 +2530,11 @@ void WorldObject::ModSpellDurationTime(SpellInfo const* spellInfo, int32& durati\n     if (Player* modOwner = GetSpellModOwner())\n         modOwner->ApplySpellMod(spellInfo->Id, SPELLMOD_CASTING_TIME, duration, spell);\n \n+    //npcbot - apply bot spell cast time mods\n+    if (duration > 0 && IsNPCBot())\n+        ToCreature()->ApplyCreatureSpellCastTimeMods(spellInfo, duration);\n+    //end npcbot\n+\n     Unit const* unitCaster = ToUnit();\n     if (!unitCaster)\n         return;\n@@ -2513,6 +2603,11 @@ SpellMissInfo WorldObject::MagicSpellHitResult(Unit* victim, SpellInfo const* sp\n     if (Unit const* unit = ToUnit())\n         HitChance += int32(unit->m_modSpellHitChance * 100.0f);\n \n+    //npcbot: spell hit chance bonus\n+    if (IsNPCBot())\n+        HitChance -= int32(ToCreature()->GetCreatureMissChance() * 100.f);\n+    //end npcbot\n+\n     RoundToInterval(HitChance, 0, 10000);\n \n     int32 tmp = 10000 - HitChance;\n@@ -2688,10 +2783,20 @@ ReputationRank WorldObject::GetReactionTo(WorldObject const* target) const\n \n     Unit const* unit = Coalesce<const Unit>(ToUnit(), selfPlayerOwner);\n     Unit const* targetUnit = Coalesce<const Unit>(target->ToUnit(), targetPlayerOwner);\n+    //npcbot\n+    /*\n     if (unit && unit->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED))\n     {\n         if (targetUnit && targetUnit->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED))\n         {\n+    */\n+    if (unit && (unit->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) || unit->IsNPCBotOrPet()))\n+    {\n+        if (targetUnit && (targetUnit->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) || targetUnit->IsNPCBotOrPet()))\n+        {\n+            if (unit->IsInRaidWith(targetUnit))\n+                return REP_FRIENDLY;\n+    //end npcbot\n             if (selfPlayerOwner && targetPlayerOwner)\n             {\n                 // always friendly to other unit controlled by player, or to the player himself\n@@ -2762,6 +2867,16 @@ ReputationRank WorldObject::GetReactionTo(WorldObject const* target) const\n         if ((factionTemplateEntry->Flags & FACTION_TEMPLATE_FLAG_CONTESTED_GUARD) &&\n             targetPlayerOwner->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_CONTESTED_PVP))\n             return REP_HOSTILE;\n+\n+        //npcbot\n+        if (target->IsNPCBotOrPet() && (factionTemplateEntry->Flags & FACTION_TEMPLATE_FLAG_CONTESTED_GUARD))\n+        {\n+            Unit const* bot = target->IsNPCBotPet() ? static_cast<Unit*>(targetPlayerOwner->GetBotMgr()->GetBot(target->GetOwnerGUID())) : target->ToUnit();\n+            if (bot && bot->IsNPCBot() && BotMgr::IsBotContestedPvP(bot->ToCreature()))\n+                return REP_HOSTILE;\n+        }\n+        //end npcbot\n+\n         if (ReputationRank const* repRank = targetPlayerOwner->GetReputationMgr().GetForcedRankIfAny(factionTemplateEntry))\n             return *repRank;\n         if (target->IsUnit() && !target->ToUnit()->HasUnitFlag2(UNIT_FLAG2_IGNORE_REPUTATION))\n@@ -2779,6 +2894,14 @@ ReputationRank WorldObject::GetReactionTo(WorldObject const* target) const\n             }\n         }\n     }\n+    //npcbot: contested guards reaction to bots in contested PvP mode\n+    else if (target->IsNPCBotOrPet() && (factionTemplateEntry->Flags & FACTION_TEMPLATE_FLAG_CONTESTED_GUARD))\n+    {\n+        Unit const* bot = target->IsNPCBotPet() ? target->ToUnit()->GetCreator() : target->ToUnit();\n+        if (bot && bot->IsNPCBot() && BotMgr::IsBotContestedPvP(bot->ToCreature()))\n+            return REP_HOSTILE;\n+    }\n+    //end npcbot\n \n     // common faction based check\n     if (factionTemplateEntry->IsHostileTo(*targetFactionTemplateEntry))\n@@ -2838,6 +2961,10 @@ SpellCastResult WorldObject::CastSpell(CastSpellTargetArg const& targets, uint32\n         return SPELL_FAILED_SPELL_UNAVAILABLE;\n     }\n \n+    //npcbot: try override\n+    info = info->TryGetSpellInfoOverride(this);\n+    //end npcbot\n+\n     if (!targets.Targets)\n     {\n         TC_LOG_ERROR(\"entities.unit\", \"CastSpell: Invalid target passed to spell cast {} by {}\", spellId, GetGUID().ToString());\n@@ -2873,6 +3000,11 @@ bool WorldObject::IsValidAttackTarget(WorldObject const* target, SpellInfo const\n     if (target->GetTypeId() == TYPEID_PLAYER && target->ToPlayer()->IsGameMaster())\n         return false;\n \n+    //npcbot: can't attack unit if controlled by a GM (bots, pets, possible others)\n+    if (unitTarget && unitTarget->IsControlledByPlayer() && unitTarget->GetFaction() == 35)\n+        return false;\n+    //end npcbot\n+\n     Unit const* unit = ToUnit();\n     // visibility checks (only units)\n     if (unit)\n@@ -2909,6 +3041,9 @@ bool WorldObject::IsValidAttackTarget(WorldObject const* target, SpellInfo const\n         unitOrOwner = go->GetOwner();\n \n     // ignore immunity flags when assisting\n+    //npcbot: rewrite all that\n+    /*\n+    //end npcbot\n     if (unitOrOwner && unitTarget && !(isPositiveSpell && bySpell->HasAttribute(SPELL_ATTR6_ASSIST_IGNORE_IMMUNE_FLAG)))\n     {\n         if (!unitOrOwner->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && unitTarget->IsImmuneToNPC())\n@@ -2923,7 +3058,65 @@ bool WorldObject::IsValidAttackTarget(WorldObject const* target, SpellInfo const\n         if (unitTarget->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && unitOrOwner->IsImmuneToPC())\n             return false;\n     }\n+    //npcbot\n+    */\n+    if (unitOrOwner && unitTarget && !(isPositiveSpell && bySpell->HasAttribute(SPELL_ATTR6_ASSIST_IGNORE_IMMUNE_FLAG)))\n+    {\n+        if (!unitOrOwner->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && !unitOrOwner->IsNPCBotOrPet() && unitTarget->IsImmuneToNPC())\n+            return false;\n+\n+        if (!unitTarget->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && !unitTarget->IsNPCBotOrPet() && unitOrOwner->IsImmuneToNPC())\n+            return false;\n+\n+        if ((unitOrOwner->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) || unitOrOwner->IsNPCBotOrPet()) && unitTarget->IsImmuneToPC())\n+            return false;\n+\n+        if ((unitTarget->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) || unitTarget->IsNPCBotOrPet()) && unitOrOwner->IsImmuneToPC())\n+            return false;\n+    }\n+    //end npcbot\n+\n+    //npcbot: CvB, BvC case\n+    if (unit && unitTarget &&\n+        ((IsNPCBotOrPet() && ToCreature()->IsFreeBot()) || (target->IsNPCBotOrPet() && target->ToCreature()->IsFreeBot())) &&\n+        !IsFriendlyTo(unitTarget) && !unitTarget->IsFriendlyTo(this))\n+    {\n+        if (unitTarget->IsNPCBotOrPet() && unit->IsContestedGuard())\n+        {\n+            if (Unit const* bot = unitTarget->IsNPCBotPet() ? unitTarget->GetCreator() : unitTarget)\n+            {\n+                if (BotMgr::IsBotContestedPvP(bot->ToCreature()))\n+                    return true;\n+            }\n+        }\n+        else if (unit->IsNPCBotOrPet() && unitTarget->IsContestedGuard())\n+        {\n+            if (Unit const* bot = unit->IsNPCBotPet() ? unit->GetCreator() : unit)\n+            {\n+                if (BotMgr::IsBotContestedPvP(bot->ToCreature()))\n+                    return true;\n+            }\n+        }\n+\n+        auto const* ft1 = sFactionTemplateStore.LookupEntry(unit->GetFaction());\n+        auto const* ft2 = sFactionTemplateStore.LookupEntry(unitTarget->GetFaction());\n+        auto const* fe1 = ft1 ? sFactionStore.LookupEntry(ft1->Faction) : nullptr;\n+        auto const* fe2 = ft2 ? sFactionStore.LookupEntry(ft2->Faction) : nullptr;\n+        if ((IsNPCBotOrPet() && fe2 && fe2->CanHaveReputation() && ReputationMgr::ReputationToRank(fe2, BotDataMgr::GetBotBaseReputation(unit->ToCreature(), fe2)) >= REP_NEUTRAL) ||\n+            (target->IsNPCBotOrPet() && fe1 && fe1->CanHaveReputation() && ReputationMgr::ReputationToRank(fe1, BotDataMgr::GetBotBaseReputation(unitTarget->ToCreature(), fe1)) >= REP_NEUTRAL))\n+            return false;\n+    }\n+    //end npcbot\n \n+    //npcbot: allow bots and their summons to ignore this rule\n+    if (unit && unitTarget && (unit->IsNPCBotOrPet() || unitTarget->IsNPCBotOrPet()))\n+    {}\n+    else if (unit && !unit->GetOwnerGUID().IsEmpty() && unit->GetOwnerGUID().IsCreature() && sObjectMgr->GetCreatureTemplate(unit->GetOwnerGUID().GetEntry())->IsNPCBotOrPet())\n+    {}\n+    else if (unitTarget && !unitTarget->GetOwnerGUID().IsEmpty() && unitTarget->GetOwnerGUID().IsCreature() && sObjectMgr->GetCreatureTemplate(unitTarget->GetOwnerGUID().GetEntry())->IsNPCBotOrPet())\n+    {}\n+    else\n+    //end npcbot\n     // CvC case - can attack each other only when one of them is hostile\n     if (unit && !unit->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && unitTarget && !unitTarget->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED))\n         return IsHostileTo(unitTarget) || unitTarget->IsHostileTo(this);\n@@ -2945,6 +3138,13 @@ bool WorldObject::IsValidAttackTarget(WorldObject const* target, SpellInfo const\n     Player const* playerAffectingAttacker = unit && unit->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) ? GetAffectingPlayer() : go ? GetAffectingPlayer() : nullptr;\n     Player const* playerAffectingTarget = unitTarget && unitTarget->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) ? unitTarget->GetAffectingPlayer() : nullptr;\n \n+    //npcbot: get affectingplayers for bots\n+    if (!playerAffectingAttacker && unit && unit->IsNPCBotOrPet())\n+        playerAffectingAttacker = unit->GetAffectingPlayer();\n+    if (!playerAffectingTarget && unitTarget && unitTarget->IsNPCBotOrPet())\n+        playerAffectingTarget = unitTarget->GetAffectingPlayer();\n+    //end npcbot\n+\n     // Not all neutral creatures can be attacked (even some unfriendly faction does not react aggresive to you, like Sporaggar)\n     if ((playerAffectingAttacker && !playerAffectingTarget) || (!playerAffectingAttacker && playerAffectingTarget))\n     {\n@@ -2980,6 +3180,13 @@ bool WorldObject::IsValidAttackTarget(WorldObject const* target, SpellInfo const\n     if (unitTarget && unitTarget->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && unitOrOwner && unitOrOwner->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && (unitTarget->IsInSanctuary() || unitOrOwner->IsInSanctuary()))\n         return false;\n \n+    //npcbot: BvP, PvB, BvB sanctuary case\n+    if (unitTarget && (unitTarget->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) || unitTarget->IsNPCBotOrPet()) &&\n+        unitOrOwner && (unitOrOwner->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) || unitOrOwner->IsNPCBotOrPet()) &&\n+        (unitTarget->IsInSanctuary() || unitOrOwner->IsInSanctuary()))\n+        return false;\n+    //end npcbot\n+\n     // additional checks - only PvP case\n     if (playerAffectingAttacker && playerAffectingTarget)\n     {\n@@ -2992,6 +3199,21 @@ bool WorldObject::IsValidAttackTarget(WorldObject const* target, SpellInfo const\n         return playerAffectingAttacker->HasPvpFlag(UNIT_BYTE2_FLAG_UNK1) ||\n             playerAffectingTarget->HasPvpFlag(UNIT_BYTE2_FLAG_UNK1);\n     }\n+    //npcbot: BvP checks\n+    else if (playerAffectingTarget && !playerAffectingAttacker && unit && unit->IsNPCBotOrPet())\n+    {\n+        if (Unit const* bot = unit->IsNPCBotPet() ? unit->GetCreator() : unit)\n+        {\n+            if (playerAffectingTarget->IsPvP())\n+                return true;\n+\n+            if (bot->IsFFAPvP() && playerAffectingTarget->IsFFAPvP())\n+                return true;\n+\n+            return bot->HasPvpFlag(UNIT_BYTE2_FLAG_UNK1) || playerAffectingTarget->HasPvpFlag(UNIT_BYTE2_FLAG_UNK1);\n+        }\n+    }\n+    //end npcbot\n \n     return true;\n }\n@@ -3051,6 +3273,13 @@ bool WorldObject::IsValidAssistTarget(WorldObject const* target, SpellInfo const\n             if (unitTarget && unitTarget->IsImmuneToPC())\n                 return false;\n         }\n+        //npcbot\n+        else if (unit && unit->IsNPCBotOrPet())\n+        {\n+            if (unitTarget && unitTarget->IsImmuneToPC())\n+                return false;\n+        }\n+        //end npcbot\n         else\n         {\n             if (unitTarget && unitTarget->IsImmuneToNPC())\n@@ -3095,6 +3324,20 @@ bool WorldObject::IsValidAssistTarget(WorldObject const* target, SpellInfo const\n                     return ((creatureTarget->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT) || (creatureTarget->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_CAN_ASSIST));\n     }\n \n+    //npcbot: PvP (BvB) case\n+    if (unit && unit->IsNPCBotOrPet() && unitTarget && unitTarget->IsNPCBotOrPet())\n+    {\n+        Player const* selfPlayerOwner = GetAffectingPlayer();\n+        Player const* targetPlayerOwner = unitTarget->GetAffectingPlayer();\n+        if (selfPlayerOwner && targetPlayerOwner && selfPlayerOwner != targetPlayerOwner && targetPlayerOwner->duel)\n+            return false;\n+        if (unitTarget->IsFFAPvP() && !unit->IsFFAPvP())\n+            return false;\n+        if (unitTarget->IsPvP() && unit->IsInSanctuary() && !unitTarget->IsInSanctuary())\n+            return false;\n+    }\n+    //end npcbot\n+\n     return true;\n }\n \n@@ -3254,7 +3497,7 @@ Position WorldObject::GetNearPosition(float dist, float angle)\n     return pos;\n }\n \n-Position WorldObject::GetFirstCollisionPosition(float dist, float angle)\n+Position WorldObject::GetFirstCollisionPosition(float dist, float angle) const\n {\n     Position pos = GetPosition();\n     MovePositionToFirstCollision(pos, dist, angle);\n@@ -3320,7 +3563,7 @@ void WorldObject::MovePosition(Position &pos, float dist, float angle)\n     pos.SetOrientation(GetOrientation());\n }\n \n-void WorldObject::MovePositionToFirstCollision(Position &pos, float dist, float angle)\n+void WorldObject::MovePositionToFirstCollision(Position &pos, float dist, float angle) const\n {\n     angle += GetOrientation();\n     float destx, desty, destz;\ndiff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h\nindex 94bc66eb14..cb9165292d 100644\n--- a/src/server/game/Entities/Object/Object.h\n+++ b/src/server/game/Entities/Object/Object.h\n@@ -164,6 +164,12 @@ class TC_GAME_API Object\n         // FG: some hacky helpers\n         void ForceValuesUpdateAtIndex(uint32);\n \n+        //npcbot\n+        virtual bool IsNPCBot() const { return false; }\n+        virtual bool IsNPCBotPet() const { return false; }\n+        virtual bool IsNPCBotOrPet() const { return false; }\n+        //end npcbot\n+\n         inline bool IsWorldObject() const { return isType(TYPEMASK_WORLDOBJECT); }\n         static WorldObject* ToWorldObject(Object* o) { return o ? o->ToWorldObject() : nullptr; }\n         static WorldObject const* ToWorldObject(Object const* o) { return o ? o->ToWorldObject() : nullptr; }\n@@ -350,8 +356,8 @@ class TC_GAME_API WorldObject : public Object, public WorldLocation\n         void GetClosePoint(float& x, float& y, float& z, float size, float distance2d = 0, float relAngle = 0) const;\n         void MovePosition(Position &pos, float dist, float angle);\n         Position GetNearPosition(float dist, float angle);\n-        void MovePositionToFirstCollision(Position &pos, float dist, float angle);\n-        Position GetFirstCollisionPosition(float dist, float angle);\n+        void MovePositionToFirstCollision(Position &pos, float dist, float angle) const;\n+        Position GetFirstCollisionPosition(float dist, float angle) const;\n         Position GetRandomNearPosition(float radius);\n         void GetContactPoint(WorldObject const* obj, float& x, float& y, float& z, float distance2d = CONTACT_DISTANCE) const;\n \ndiff --git a/src/server/game/Entities/Player/KillRewarder.cpp b/src/server/game/Entities/Player/KillRewarder.cpp\nindex 65b9fffc0f..5456c439db 100644\n--- a/src/server/game/Entities/Player/KillRewarder.cpp\n+++ b/src/server/game/Entities/Player/KillRewarder.cpp\n@@ -26,6 +26,11 @@\n #include \"Pet.h\"\n #include \"Player.h\"\n \n+//npcbot\n+#include \"botconfig.h\"\n+#include \"botmgr.h\"\n+//end npcbot\n+\n  // == KillRewarder ====================================================\n  // KillRewarder encapsulates logic of rewarding player upon kill with:\n  // * XP;\n@@ -76,6 +81,10 @@ KillRewarder::KillRewarder(Player* killer, Unit* victim, bool isBattleGround) :\n     // mark the credit as pvp if victim is player\n     if (victim->GetTypeId() == TYPEID_PLAYER)\n         _isPvP = true;\n+    //npcbot\n+    else if (victim->IsNPCBotOrPet())\n+        _isPvP = true;\n+    //end npcbot\n     // or if its owned by player and its not a vehicle\n     else if (victim->GetCharmerOrOwnerGUID().IsPlayer())\n         _isPvP = !victim->IsVehicle();\n@@ -106,6 +115,45 @@ inline void KillRewarder::_InitGroupData()\n                     if (_victim->GetLevel() > grayLevel && (!_maxNotGrayMember || _maxNotGrayMember->GetLevel() < lvl))\n                         _maxNotGrayMember = member;\n                 }\n+\n+        //npcbot\n+        _bots_count_xp = 0;\n+        _bots_count_honor = 0;\n+        if (BotCfg::IsNpcBotXpReductionEnabled() || BotCfg::IsNpcBotHonorReductionEnabled())\n+        {\n+            const float reward_dist_sq = std::pow(sWorld->getFloatConfig(CONFIG_GROUP_XP_DISTANCE), 2.f);\n+            for (GroupReference const* itr = _group->GetFirstMember(); itr != nullptr; itr = itr->next())\n+            {\n+                Player const* member = itr->GetSource();\n+                if (!member || !member->IsInMap(_victim) || !member->HaveBot())\n+                    continue;\n+\n+                BotMap const* botMap = member->GetBotMgr()->GetBotMap();\n+                for (auto const& kv : *botMap)\n+                {\n+                    Creature const* bot = kv.second;\n+                    if (bot && bot->IsAlive() && bot->IsInMap(_victim) &&\n+                        (member->GetMap()->IsDungeon() || _victim->GetExactDistSq(bot) <= reward_dist_sq))\n+                    {\n+                        const bool add_for_xp = BotCfg::IsNpcBotXpReductionEnabled() && (!BotCfg::IsNpcBotXpReductionGroupOnly() || _group->IsMember(kv.first));\n+                        const bool add_for_honor = BotCfg::IsNpcBotHonorReductionEnabled() && (!BotCfg::IsNpcBotHonorReductionGroupOnly() || _group->IsMember(kv.first));\n+                        if (add_for_xp || add_for_honor)\n+                        {\n+                            if (add_for_xp)\n+                                ++_bots_count_xp;\n+                            if (add_for_honor)\n+                                ++_bots_count_honor;\n+                            const uint8 lvl = bot->GetLevel();\n+                            _sumLevel += lvl;\n+                            if (_maxLevel < lvl)\n+                                _maxLevel = lvl;\n+                        }\n+                    }\n+                }\n+            }\n+        }\n+        //end npcbot\n+\n         // 2.5. _isFullXP - flag identifying that for all group members victim is not gray,\n         //      so 100% XP will be rewarded (50% otherwise).\n         _isFullXP = _maxNotGrayMember && (_maxLevel == _maxNotGrayMember->GetLevel());\n@@ -128,6 +176,14 @@ inline void KillRewarder::_InitXP(Player* player)\n inline void KillRewarder::_RewardHonor(Player* player)\n {\n     // Rewarded player must be alive.\n+    //npcbot\n+    if (BotCfg::IsNpcBotHonorReductionEnabled())\n+    {\n+        if (player->IsAlive())\n+            player->RewardHonor(_victim, _count + _bots_count_honor, -1, true);\n+    }\n+    else\n+    //end npcbot\n     if (player->IsAlive())\n         player->RewardHonor(_victim, _count, -1, true);\n }\n@@ -153,6 +209,16 @@ inline void KillRewarder::_RewardXP(Player* player, float rate)\n         // 4.2.2. Apply auras modifying rewarded XP (SPELL_AURA_MOD_XP_PCT).\n         xp *= player->GetTotalAuraMultiplier(SPELL_AURA_MOD_XP_PCT);\n \n+        //npcbot 4.2.2.1. Apply NpcBot XP reduction\n+        const uint8 xp_reduction = BotCfg::GetNpcBotXpReductionExtraAmount();\n+        const uint8 xp_reduction_start = BotCfg::GetNpcBotXpReductionExtraStartingNumber();\n+        if (xp_reduction_start > 0 && xp_reduction > 0 && _bots_count_xp >= xp_reduction_start)\n+        {\n+            const uint32 ratePct = static_cast<uint32>(std::max<int32>(100 - ((_bots_count_xp - (xp_reduction_start - 1)) * xp_reduction), 10));\n+            xp = xp * ratePct / 100;\n+        }\n+        //end npcbot\n+\n         // 4.2.3. Give XP to player.\n         player->GiveXP(xp, _victim, _groupRate);\n         if (Pet* pet = player->GetPet())\n@@ -227,6 +293,11 @@ void KillRewarder::_RewardGroup()\n             {\n                 // 3.1.2. Alter group rate if group is in raid (not for battlegrounds).\n                 bool const isRaid = !_isPvP && sMapStore.LookupEntry(_killer->GetMapId())->IsRaid() && _group->isRaidGroup();\n+                //npcbot\n+                if (_bots_count_xp)\n+                    _groupRate = Trinity::XP::xp_in_group_rate(_count + _bots_count_xp, isRaid);\n+                else\n+                //end npcbot\n                 _groupRate = Trinity::XP::xp_in_group_rate(_count, isRaid);\n             }\n \ndiff --git a/src/server/game/Entities/Player/KillRewarder.h b/src/server/game/Entities/Player/KillRewarder.h\nindex 662f8c6b0e..fbc345c409 100644\n--- a/src/server/game/Entities/Player/KillRewarder.h\n+++ b/src/server/game/Entities/Player/KillRewarder.h\n@@ -48,6 +48,10 @@ private:\n     float _groupRate;\n     Player* _maxNotGrayMember;\n     uint32 _count;\n+    //npcbot\n+    uint32 _bots_count_xp = 0;\n+    uint32 _bots_count_honor = 0;\n+    //end npcbot\n     uint32 _sumLevel;\n     uint32 _xp;\n     bool _isFullXP;\ndiff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp\nindex e0b9099746..6e9f7b7bbe 100644\n--- a/src/server/game/Entities/Player/Player.cpp\n+++ b/src/server/game/Entities/Player/Player.cpp\n@@ -108,6 +108,12 @@\n #include \"WorldSession.h\"\n #include \"WorldStatePackets.h\"\n \n+//npcbot\n+#include \"botconfig.h\"\n+#include \"botdatamgr.h\"\n+#include \"botmgr.h\"\n+//end npcbot\n+\n #define ZONE_UPDATE_INTERVAL (1*IN_MILLISECONDS)\n \n // corpse reclaim times\n@@ -332,6 +338,10 @@ Player::Player(WorldSession* session): Unit(true)\n \n     m_achievementMgr = new AchievementMgr(this);\n     m_reputationMgr = new ReputationMgr(this);\n+\n+    /////////////// NPCBot System //////////////////\n+    _botMgr = new BotMgr(this);\n+    ///////////// End NPCBot System ////////////////\n }\n \n Player::~Player()\n@@ -363,6 +373,10 @@ Player::~Player()\n     delete m_reputationMgr;\n     delete _cinematicMgr;\n \n+    //npcbot\n+    delete _botMgr;\n+    //end npcbot\n+\n     sWorld->DecreasePlayerCount();\n }\n \n@@ -1235,6 +1249,10 @@ void Player::Update(uint32 p_time)\n \n     if (IsHasDelayedTeleport())\n         TeleportTo(m_teleport_dest, m_teleport_options);\n+\n+    //NpcBot mod: Update\n+    _botMgr->Update(p_time);\n+    //end Npcbot\n }\n \n void Player::Heartbeat()\n@@ -1699,6 +1717,11 @@ bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientati\n             if (pet)\n                 UnsummonPetTemporaryIfAny();\n \n+            //bot: teleport npcbots\n+            if (HaveBot())\n+                _botMgr->OnTeleportFar(mapid, x, y, z, orientation);\n+            //end bot\n+\n             // remove all dyn objects\n             RemoveAllDynObjects();\n \n@@ -1887,6 +1910,25 @@ bool Player::IsImmunedToSpellEffect(SpellInfo const* spellInfo, SpellEffectInfo\n     return Unit::IsImmunedToSpellEffect(spellInfo, spellEffectInfo, caster, requireImmunityPurgesEffectAttribute);\n }\n \n+//NPCBOT\n+bool Player::HaveBot() const\n+{\n+    return _botMgr->HaveBot();\n+}\n+uint8 Player::GetNpcBotsCount() const\n+{\n+    return _botMgr->GetNpcBotsCount();\n+}\n+void Player::RemoveAllBots(uint8 removetype)\n+{\n+    _botMgr->RemoveAllBots(removetype);\n+}\n+void Player::UpdatePhaseForBots()\n+{\n+    _botMgr->UpdatePhaseForBots();\n+}\n+//END NPCBOT\n+\n void Player::RegenerateAll()\n {\n     m_regenTimerCount += m_regenTimer;\n@@ -2124,6 +2166,11 @@ Creature* Player::GetNPCIfCanInteractWith(ObjectGuid const& guid, NPCFlags npcFl\n     if (!creature->GetCharmerGUID().IsEmpty())\n         return nullptr;\n \n+    //npcbot\n+    if (creature->IsNPCBot() && creature->IsWithinDistInMap(this, INTERACTION_DISTANCE))\n+        return creature;\n+    //end npcbot\n+\n     // not unfriendly/hostile\n     if (creature->GetReactionTo(this) <= REP_UNFRIENDLY)\n         return nullptr;\n@@ -2247,6 +2294,10 @@ void Player::SetGameMaster(bool on)\n         m_serverSideVisibilityDetect.SetValue(SERVERSIDE_VISIBILITY_GM, SEC_PLAYER);\n     }\n \n+    //npcbot: pet is handled already, bots are not, so do it\n+    _botMgr->OnOwnerSetGameMaster(on);\n+    //end npcbot\n+\n     UpdateObjectVisibility();\n }\n \n@@ -2328,6 +2379,52 @@ void Player::RemoveFromGroup(Group* group, ObjectGuid guid, RemoveMethod method\n     if (!group)\n         return;\n \n+    //npcbot - player is being removed from group - remove bots from that group\n+    if (Player* player = ObjectAccessor::FindPlayer(guid))\n+    {\n+        if (player->HaveBot())\n+        {\n+            //remove npcbots and set up new group if needed\n+            player->GetBotMgr()->RemoveAllBotsFromGroup();\n+            group = player->GetGroup();\n+            if (!group)\n+                return; //group has been disbanded\n+        }\n+    }\n+    //npcbot - deleting player from db: remove bots\n+    else if (guid.IsPlayer())\n+    {\n+        std::vector<ObjectGuid> botguids;\n+        botguids.reserve(BotCfg::GetMaxNpcBots(DEFAULT_MAX_LEVEL) / 2 + 1);\n+        BotDataMgr::GetNPCBotGuidsByOwner(botguids, guid, true);\n+        for (std::vector<ObjectGuid>::const_iterator ci = botguids.begin(); ci != botguids.end(); ++ci)\n+        {\n+            if (group->IsMember(*ci))\n+            {\n+                if (!group->RemoveMember(*ci, method, kicker, reason))\n+                    return;\n+            }\n+        }\n+    }\n+    //npcbot - bot is being removed from group - find master and remove bot through botmap\n+    else if (guid.IsCreature())\n+    {\n+        for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())\n+        {\n+            if (Player* member = itr->GetSource())\n+            {\n+                if (!member->HaveBot())\n+                    continue;\n+\n+                if (Creature* bot = member->GetBotMgr()->GetBot(guid))\n+                {\n+                    member->GetBotMgr()->RemoveBotFromGroup(bot);\n+                    return;\n+                }\n+            }\n+        }\n+    }\n+\n     group->RemoveMember(guid, method, kicker, reason);\n }\n \n@@ -2362,6 +2459,9 @@ void Player::GiveXP(uint32 xp, Unit* victim, float group_rate)\n         return;\n \n     if (victim && victim->GetTypeId() == TYPEID_UNIT && !victim->ToCreature()->hasLootRecipient())\n+    //npcbot\n+        if (!(victim->IsNPCBot() && victim->FindMap() && victim->GetMap()->IsBattleground()))\n+    //end npcbot\n         return;\n \n     uint8 level = GetLevel();\n@@ -2496,6 +2596,10 @@ void Player::GiveLevel(uint8 level)\n     SendQuestGiverStatusMultiple();\n \n     sScriptMgr->OnPlayerLevelChanged(this, oldLevel);\n+\n+    //npcbot: force bots to update stats\n+    _botMgr->SetBotsShouldUpdateStats();\n+    //end npcbot\n }\n \n bool Player::IsMaxLevel() const\n@@ -4230,6 +4334,13 @@ void Player::DeleteFromDB(ObjectGuid playerguid, uint32 accountId, bool updateRe\n             trans->Append(stmt);\n \n             Corpse::DeleteFromDB(playerguid, trans);\n+\n+            //npcbot - erase npcbots and manager data\n+            uint32 newOwner = 0;\n+            BotDataMgr::UpdateNpcBotDataAll(guid, NPCBOT_UPDATE_OWNER, &newOwner);\n+            BotDataMgr::EraseNpcBotMgrData(playerguid);\n+            //end npcbot\n+\n             break;\n         }\n         // The character gets unlinked from the account, the name gets freed up and appears as deleted ingame\n@@ -6600,6 +6711,49 @@ bool Player::RewardHonor(Unit* victim, uint32 groupsize, int32 honor, bool pvpto\n             UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL, 1, 0, victim);\n             UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_SPECIAL_PVP_KILL, 1, 0, victim);\n         }\n+        //npcbot: honor for bots\n+        else if (victim->IsNPCBot() && !victim->ToCreature()->IsTempBot())\n+        {\n+            static const float WANDERING_BOT_HONOR_GAIN_MULT = 10.0f;\n+\n+            if (!BotCfg::IsBotHKEnabled())\n+                return false;\n+\n+            Creature const* bot = victim->ToCreature();\n+\n+            uint32 victimTeam = !bot->IsFreeBot() ? bot->GetBotOwner()->GetTeam() : BotDataMgr::GetTeamForFaction(bot->GetFaction());\n+            if (GetTeam() == victimTeam && !sWorld->IsFFAPvPRealm())\n+                return false;\n+\n+            uint8 k_level = GetLevel();\n+            uint8 k_grey = Trinity::XP::GetGrayLevel(k_level);\n+            uint8 v_level = victim->GetLevel();\n+\n+            if (v_level <= k_grey)\n+                return false;\n+\n+            if (!BotCfg::IsBotHKMessageEnabled())\n+                victim_guid.Clear(); // Don't show HK: <rank> message, only log.\n+\n+            //TODO: honor gain rate\n+            honor_f = ceil(Trinity::Honor::hk_honor_at_level_f(k_level) * (v_level - k_grey) / (k_level - k_grey));\n+            honor_f *= BotCfg::GetBotHKHonorRate();\n+            if (bot->IsWandererBot() && !bot->GetBotBG())\n+                honor_f *= WANDERING_BOT_HONOR_GAIN_MULT;\n+\n+            if (BotCfg::IsBotHKAchievementsEnabled())\n+            {\n+                ApplyModUInt32Value(PLAYER_FIELD_KILLS, 1, true);\n+                ApplyModUInt32Value(PLAYER_FIELD_LIFETIME_HONORABLE_KILLS, 1, true);\n+                UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_EARN_HONORABLE_KILL);\n+                UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HK_CLASS, BotMgr::GetBotPlayerClass(victim->ToCreature()));\n+                UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HK_RACE, BotMgr::GetBotPlayerRace(victim->ToCreature()));\n+                UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL_AT_AREA, GetAreaId());\n+                UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL, 1, 0, victim);\n+                UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_SPECIAL_PVP_KILL, 1, 0, victim);\n+            }\n+        }\n+        //end npcbot\n         else\n         {\n             if (!victim->ToCreature()->IsRacialLeader())\n@@ -8188,6 +8342,14 @@ void Player::SendLoot(ObjectGuid guid, LootType loot_type)\n                 if (GameObjectTemplateAddon const* addon = go->GetTemplateAddon())\n                     loot->generateMoneyLoot(addon->Mingold, addon->Maxgold);\n \n+            //npcbot: fill wandering bot kill reward\n+            if (lootid)\n+            {\n+                if (go->GetEntry() == GO_BOT_MONEY_BAG)\n+                    BotMgr::OnBotWandererKilled(go);\n+            }\n+            //end npcbot\n+\n             if (loot_type == LOOT_FISHING)\n                 go->getFishLoot(loot, this);\n             else if (loot_type == LOOT_FISHING_JUNK)\n@@ -17621,6 +17783,10 @@ bool Player::LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder const& hol\n \n     _LoadEquipmentSets(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_EQUIPMENT_SETS));\n \n+    //npcbots: load BotManager data\n+    _botMgr->LoadData();\n+    //end npcbots\n+\n     return true;\n }\n \n@@ -19328,6 +19494,12 @@ void Player::SaveToDB(CharacterDatabaseTransaction trans, bool create /* = false\n     // save pet (hunter pet level and experience and all type pets health/mana).\n     if (Pet* pet = GetPet())\n         pet->SavePetToDB(PET_SAVE_AS_CURRENT);\n+\n+    //npcbot: save player-related npcbot data\n+    BotDataMgr::SaveNpcBotStoredGear(GetGUID(), trans);\n+    BotDataMgr::SaveNpcBotItemSets(GetGUID(), trans);\n+    BotDataMgr::SaveNpcBotMgrData(GetGUID(), trans);\n+    //end npcbot\n }\n \n // fast save function for item/money cheating preventing - save only inventory and money state\n@@ -21445,6 +21617,18 @@ bool Player::BuyItemFromVendorSlot(ObjectGuid vendorguid, uint32 vendorslot, uin\n         return false;\n     }\n \n+    // npcbot\n+    if (HaveBot())\n+    {\n+        if (!(pProto->AllowableClass & (GetClassMask() | GetBotMgr()->GetAllNpcBotsClassMask())) &&\n+            pProto->Bonding == BIND_WHEN_PICKED_UP && !IsGameMaster())\n+        {\n+            SendBuyError(BUY_ERR_CANT_FIND_ITEM, nullptr, item, 0);\n+            return false;\n+        }\n+    }\n+    else\n+    // end npcbot\n     if (!(pProto->AllowableClass & GetClassMask()) && pProto->Bonding == BIND_WHEN_PICKED_UP && !IsGameMaster())\n     {\n         SendBuyError(BUY_ERR_CANT_FIND_ITEM, nullptr, item, 0);\n@@ -21719,6 +21903,10 @@ void Player::UpdatePvP(bool state, bool _override)\n         pvpInfo.EndTimer = GameTime::GetGameTime();\n         SetPvP(state);\n     }\n+\n+    //npcbot: update pvp flags for bots\n+    _botMgr->UpdatePvPForBots();\n+    //end npcbot\n }\n \n void Player::UpdatePotionCooldown(Spell* spell)\n@@ -23606,6 +23794,11 @@ bool Player::isHonorOrXPTarget(Unit const* victim) const\n \n     if (Creature const* creature = victim->ToCreature())\n     {\n+        //npcbot: count npcbots at xp targets (DEPRECATED)\n+        if (victim->ToCreature()->IsNPCBotOrPet())\n+            return true;\n+        //end npcbots\n+\n         if (creature->IsCritter() || creature->IsTotem())\n             return false;\n     }\ndiff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h\nindex ef259e51a3..b059c921e6 100644\n--- a/src/server/game/Entities/Player/Player.h\n+++ b/src/server/game/Entities/Player/Player.h\n@@ -80,6 +80,10 @@ enum ItemClass : uint8;\n enum LootError : uint8;\n enum LootType : uint8;\n \n+// NpcBot mod\n+class BotMgr;\n+// end NpcBot mod\n+\n namespace WorldPackets\n {\n     namespace Character\n@@ -2266,6 +2270,18 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>\n \n         std::string GetDebugInfo() const override;\n \n+        /*****************************************************************/\n+        /***                        NPCBOT SYSTEM                      ***/\n+        /*****************************************************************/\n+        BotMgr* GetBotMgr() const { return _botMgr; }\n+        bool HaveBot() const;\n+        uint8 GetNpcBotsCount() const;\n+        void RemoveAllBots(uint8 removetype = 0);\n+        void UpdatePhaseForBots();\n+        /*****************************************************************/\n+        /***                      END NPCBOT SYSTEM                    ***/\n+        /*****************************************************************/\n+\n     protected:\n         // Gamemaster whisper whitelist\n         GuidList WhisperList;\n@@ -2511,6 +2527,14 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>\n         bool m_needsZoneUpdate;\n \n     private:\n+        /*****************************************************************/\n+        /***                        NPCBOT SYSTEM                      ***/\n+        /*****************************************************************/\n+        BotMgr* _botMgr;\n+        /*****************************************************************/\n+        /***                      END NPCBOT SYSTEM                    ***/\n+        /*****************************************************************/\n+\n         // internal common parts for CanStore/StoreItem functions\n         InventoryResult CanStoreItem_InSpecificSlot(uint8 bag, uint8 slot, ItemPosCountVec& dest, ItemTemplate const* pProto, uint32& count, bool swap, Item* pSrcItem) const;\n         InventoryResult CanStoreItem_InBag(uint8 bag, ItemPosCountVec& dest, ItemTemplate const* pProto, uint32& count, bool merge, bool non_specialized, Item* pSrcItem, uint8 skip_bag, uint8 skip_slot) const;\ndiff --git a/src/server/game/Entities/Totem/Totem.cpp b/src/server/game/Entities/Totem/Totem.cpp\nindex 7609cd6d09..cb60a2b06c 100644\n--- a/src/server/game/Entities/Totem/Totem.cpp\n+++ b/src/server/game/Entities/Totem/Totem.cpp\n@@ -25,6 +25,11 @@\n #include \"SpellInfo.h\"\n #include \"TotemPackets.h\"\n \n+//npcbot\n+#include \"botmgr.h\"\n+#include \"ObjectAccessor.h\"\n+//end npcbot\n+\n Totem::Totem(SummonPropertiesEntry const* properties, Unit* owner) : Minion(properties, owner, false)\n {\n     m_unitTypeMask |= UNIT_MASK_TOTEM;\n@@ -34,6 +39,20 @@ Totem::Totem(SummonPropertiesEntry const* properties, Unit* owner) : Minion(prop\n \n void Totem::Update(uint32 time)\n {\n+    //npcbot: do not despawn bot totem if master is dead\n+    Creature const* botOwner = (GetOwner()->GetTypeId() == TYPEID_PLAYER && GetOwner()->ToPlayer()->HaveBot()) ?\n+        GetOwner()->ToPlayer()->GetBotMgr()->GetBot(GetCreatorGUID()) : nullptr;\n+\n+    if (botOwner)\n+    {\n+        if (!botOwner->IsAlive() || !IsAlive())\n+        {\n+            UnSummon();\n+            return;\n+        }\n+    }\n+    else\n+    //end npcbot\n     if (!GetOwner()->IsAlive() || !IsAlive())\n     {\n         UnSummon();                                         // remove self\n@@ -150,6 +169,12 @@ void Totem::UnSummon(uint32 msTime)\n     if (IsAlive())\n         setDeathState(DEAD);\n \n+    //npcbot: send SummonedCreatureDespawn()\n+    if (Unit* creator = GetCreator())\n+        if (creator->IsNPCBot())\n+            creator->ToCreature()->OnBotDespawn(this);\n+    //end npcbot\n+\n     AddObjectToRemoveList();\n }\n \ndiff --git a/src/server/game/Entities/Unit/StatSystem.cpp b/src/server/game/Entities/Unit/StatSystem.cpp\nindex eb2a81d628..9580bc02a5 100644\n--- a/src/server/game/Entities/Unit/StatSystem.cpp\n+++ b/src/server/game/Entities/Unit/StatSystem.cpp\n@@ -27,6 +27,10 @@\n #include \"World.h\"\n #include <numeric>\n \n+//npcbot\n+#include \"botmgr.h\"\n+//end npcbot\n+\n inline bool _ModifyUInt32(bool apply, uint32& baseValue, int32& amount)\n {\n     // If amount is negative, change sign and value of apply.\n@@ -1197,16 +1201,58 @@ void Creature::CalculateMinMaxDamage(WeaponAttackType attType, bool normalized,\n     float weaponMinDamage = GetWeaponDamageRange(attType, MINDAMAGE);\n     float weaponMaxDamage = GetWeaponDamageRange(attType, MAXDAMAGE);\n \n+    //npcbot: support for feral form\n+    if (IsNPCBot() && IsInFeralForm())\n+    {\n+        float att_speed = GetAPMultiplier(attType, false);\n+        uint8 lvl = GetLevel();\n+        if (lvl > 60)\n+            lvl = 60;\n+\n+        weaponMinDamage = lvl*0.85f*att_speed;\n+        weaponMaxDamage = lvl*1.25f*att_speed;\n+    }\n+    else\n+    //end npcbot\n     if (!CanUseAttackType(attType)) // disarm case\n     {\n+        //npcbot: mimic player-like disarm (retain damage)\n+        if (IsNPCBot())\n+        {\n+            // Main hand melee is always usable, but disarm reduces damage drastically\n+            if (attType == BASE_ATTACK)\n+            {\n+                weaponMinDamage *= 0.25f;\n+                weaponMaxDamage *= 0.25f;\n+            }\n+            else\n+            {\n+                weaponMinDamage = 0.0f;\n+                weaponMaxDamage = 0.0f;\n+            }\n+        }\n+        else\n+        {\n+        //end npcbot\n         weaponMinDamage = 0.0f;\n         weaponMaxDamage = 0.0f;\n+        //npcbot\n+        }\n+    }\n+    //end npcbot\n+    //npcbot: support for ammo\n+    else if (attType == RANGED_ATTACK)\n+    {\n+        float att_speed = GetAPMultiplier(attType, false);\n+        weaponMinDamage += GetCreatureAmmoDPS() * att_speed;\n+        weaponMaxDamage += GetCreatureAmmoDPS() * att_speed;\n+    //end npcbot\n     }\n \n     float attackPower      = GetTotalAttackPowerValue(attType);\n     float attackSpeedMulti = GetAPMultiplier(attType, normalized);\n-    float baseValue        = GetFlatModifierValue(unitMod, BASE_VALUE) + (attackPower / 14.0f) * variance;\n-    float basePct          = GetPctModifierValue(unitMod, BASE_PCT) * attackSpeedMulti;\n+    float baseValue        = GetFlatModifierValue(unitMod, BASE_VALUE) + (attackPower / 14.0f) * variance * (IsNPCBot() ? attackSpeedMulti : 1.0f);\n+    float basePct          = GetPctModifierValue(unitMod, BASE_PCT) * (!IsNPCBot() ? attackSpeedMulti : 1.0f);\n     float totalValue       = GetFlatModifierValue(unitMod, TOTAL_VALUE);\n     float totalPct         = addTotalPct ? GetPctModifierValue(unitMod, TOTAL_PCT) : 1.0f;\n     float dmgMultiplier    = GetCreatureTemplate()->ModDamage; // = ModDamage * _GetDamageMod(rank);\n@@ -1289,6 +1335,10 @@ bool Guardian::UpdateStats(Stats stat)\n                 }\n             }\n             ownersBonus = float(owner->GetStat(stat)) * mod;\n+            //npcbot\n+            if (owner->IsNPCBot())\n+                ownersBonus = BotMgr::GetBotStat(owner->ToCreature(), stat) * mod;\n+            //end npcbot\n             value += ownersBonus;\n         }\n     }\ndiff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp\nindex 0576b45ec7..5ab3621c6e 100644\n--- a/src/server/game/Entities/Unit/Unit.cpp\n+++ b/src/server/game/Entities/Unit/Unit.cpp\n@@ -84,6 +84,11 @@\n #include \"WorldSession.h\"\n #include <cmath>\n \n+//npcbot\n+#include \"botconfig.h\"\n+#include \"botmgr.h\"\n+//end npcbot\n+\n float baseMoveSpeed[MAX_MOVE_TYPE] =\n {\n     2.5f,                  // MOVE_WALK\n@@ -188,6 +193,10 @@ DamageInfo::DamageInfo(SpellNonMeleeDamage const& spellNonMeleeDamage, DamageEff\n         m_hitMask |= PROC_HIT_BLOCK;\n     if (spellNonMeleeDamage.absorb)\n         m_hitMask |= PROC_HIT_ABSORB;\n+\n+    //npcbot: override spellInfo\n+    const_cast<SpellInfo const*&>(m_spellInfo) = m_spellInfo->TryGetSpellInfoOverride(m_attacker);\n+    //end npcbot\n }\n \n void DamageInfo::ModifyDamage(int32 amount)\n@@ -723,6 +732,26 @@ bool Unit::HasBreakableByDamageCrowdControlAura(Unit* excludeCasterChannel) cons\n     if (UnitAI* attackerAI = attacker ? attacker->GetAI() : nullptr)\n         attackerAI->DamageDealt(victim, damage, damagetype);\n \n+    //npcbot\n+    if (victim->IsNPCBot())\n+        BotMgr::OnBotDamageTaken(attacker, victim, damage, cleanDamage, damagetype, spellProto);\n+    //end npcbot\n+    //npcbot: damage dealt hook for crits and spells\n+    if (attacker && attacker->IsNPCBot())\n+        BotMgr::OnBotDamageDealt(attacker, victim, damage, cleanDamage, damagetype, spellProto);\n+    //end npcbot\n+\n+    //npcbot: damage tracker hook\n+    if (damage > 0 && damage < victim->GetHealth())\n+    {\n+        Player const* botowner = victim->GetTypeId() == TYPEID_PLAYER ? victim->ToPlayer() :\n+            victim->IsNPCBot() && !victim->ToCreature()->IsFreeBot() ? victim->ToCreature()->GetBotOwner() : nullptr;\n+\n+        if (botowner && botowner->GetBotMgr() && (botowner->HaveBot() || (botowner->GetGroup() && botowner->GetGroup()->IsMember(victim->GetGUID()))))\n+            botowner->GetBotMgr()->TrackDamage(victim, damage);\n+    }\n+    //end npcbot\n+\n     // Hook for OnDamage Event\n     sScriptMgr->OnDamage(attacker, victim, damage);\n \n@@ -735,6 +764,11 @@ bool Unit::HasBreakableByDamageCrowdControlAura(Unit* excludeCasterChannel) cons\n                     controlledAI->OwnerAttackedBy(attacker);\n     }\n \n+    //npcbot\n+    if (attacker && attacker != victim && victim->IsVehicle() && victim->IsAlive())\n+        BotMgr::OnVehicleAttackedBy(attacker, victim);\n+    //end npcbot\n+\n     if (Player* player = victim->ToPlayer())\n         if (player->GetCommandStatus(CHEAT_GOD))\n             return 0;\n@@ -765,6 +799,17 @@ bool Unit::HasBreakableByDamageCrowdControlAura(Unit* excludeCasterChannel) cons\n             }\n         }\n \n+        //npcbot\n+        if (!damage && damagetype != DOT && cleanDamage && cleanDamage->absorbed_damage && victim->IsNPCBotOrPet() && attacker && victim != attacker &&\n+            (attacker->IsNPCBotOrPet() || attacker->IsControlledByPlayer()))\n+        {\n+            if (Spell* spell = victim->m_currentSpells[CURRENT_GENERIC_SPELL])\n+                if (spell->getState() == SPELL_STATE_PREPARING)\n+                    if ((spell->m_spellInfo->InterruptFlags & SPELL_INTERRUPT_FLAG_ABORT_ON_DMG) != 0)\n+                        victim->InterruptNonMeleeSpells(false);\n+        }\n+        //end npcbot\n+\n         // We're going to call functions which can modify content of the list during iteration over it's elements\n         // Let's copy the list so we can prevent iterator invalidation\n         AuraEffectList vCopyDamageCopy(victim->GetAuraEffectsByType(SPELL_AURA_SHARE_DAMAGE_PCT));\n@@ -867,13 +912,37 @@ bool Unit::HasBreakableByDamageCrowdControlAura(Unit* excludeCasterChannel) cons\n                 if (Battleground* bg = killer->GetBattleground())\n                     bg->UpdatePlayerScore(killer, SCORE_DAMAGE_DONE, damage);\n \n+            //npcbot\n+            if (victim->IsNPCBot())\n+                if (Battleground* bg = killer->GetBattleground())\n+                    bg->UpdatePlayerScore(killer, SCORE_DAMAGE_DONE, damage);\n+            //end npcbot\n+\n             killer->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_DAMAGE_DONE, health > damage ? damage : health, 0, victim);\n             killer->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_DEALT, damage);\n         }\n+        //npcbot\n+        if (attacker->IsNPCBot() && (victim->IsPlayer() || victim->IsNPCBot()))\n+        {\n+            Creature const* bot = attacker->ToCreature();\n+            if (Battleground* bg = bot->GetBotBG())\n+                bg->UpdateBotScore(bot, SCORE_DAMAGE_DONE, damage);\n+        }\n+        //end npcbot\n     }\n \n     if (victim->GetTypeId() == TYPEID_PLAYER)\n         victim->ToPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_RECEIVED, damage);\n+    //npcbot\n+    else if (victim->IsNPCBotOrPet())\n+    {\n+        if (attacker && !victim->ToCreature()->hasLootRecipient())\n+            victim->ToCreature()->SetLootRecipient(attacker);\n+        if (!attacker || attacker->IsControlledByPlayer() || (attacker->ToTempSummon() && attacker->ToTempSummon()->GetSummonerUnit() && attacker->ToTempSummon()->GetSummonerUnit()->IsPlayer()) ||\n+            (attacker->IsNPCBotOrPet() && !attacker->ToCreature()->IsFreeBot()) || (attacker->GetCreator() && attacker->GetCreator()->IsPlayer()))\n+            victim->ToCreature()->LowerPlayerDamageReq(health < damage ?  health : damage);\n+    }\n+    //end npcbot\n     else if (!victim->IsControlledByPlayer() || victim->IsVehicle())\n     {\n         if (!victim->ToCreature()->hasLootRecipient())\n@@ -958,6 +1027,28 @@ bool Unit::HasBreakableByDamageCrowdControlAura(Unit* excludeCasterChannel) cons\n             }\n         }\n \n+        //npcbot\n+        if (victim->IsNPCBot() && attacker && victim != attacker && damagetype != NODAMAGE && damagetype != DOT && damage &&\n+            (attacker->IsNPCBotOrPet() || attacker->IsControlledByPlayer()) &&\n+            (!spellProto || !(spellProto->HasAttribute(SPELL_ATTR7_NO_PUSHBACK_ON_DAMAGE) || spellProto->HasAttribute(SPELL_ATTR3_TREAT_AS_PERIODIC))))\n+        {\n+            if (Spell* spell = victim->m_currentSpells[CURRENT_GENERIC_SPELL])\n+            {\n+                if (spell->getState() == SPELL_STATE_PREPARING)\n+                {\n+                    if (spell->m_spellInfo->InterruptFlags & SPELL_INTERRUPT_FLAG_ABORT_ON_DMG)\n+                        victim->InterruptNonMeleeSpells(false);\n+                    else\n+                        spell->Delayed();\n+                }\n+            }\n+\n+            if (Spell* spell = victim->m_currentSpells[CURRENT_CHANNELED_SPELL])\n+                if (spell->getState() == SPELL_STATE_CASTING)\n+                    spell->DelayedChannel();\n+        }\n+        //end npcbot\n+\n         // last damage from duel opponent\n         if (duel_hasEnded)\n         {\n@@ -1017,6 +1108,18 @@ void Unit::CalculateSpellDamageTaken(SpellNonMeleeDamage* damageInfo, int32 dama\n             case SPELL_DAMAGE_CLASS_RANGED:\n             case SPELL_DAMAGE_CLASS_MELEE:\n             {\n+                //NpcBot mod: apply bot damage mods\n+                if (GetTypeId() == TYPEID_UNIT && ToCreature()->IsNPCBotOrPet())\n+                {\n+                    //TODO: rename to ApplyBotDamageMultiplierPhysical\n+                    ToCreature()->ApplyBotDamageMultiplierMelee(damage, *damageInfo, spellInfo, attackType, crit);\n+                    if (damageSchoolMask & SPELL_SCHOOL_MASK_NORMAL)\n+                        damage *= (BotMgr::IsWanderingWorldBot(ToCreature()) ? BotCfg::GetBotWandererDamageMod() : BotCfg::GetBotDamageModPhysical());\n+                    else if (damageSchoolMask & SPELL_SCHOOL_MASK_MAGIC)\n+                        damage *= (BotMgr::IsWanderingWorldBot(ToCreature()) ? BotCfg::GetBotWandererDamageMod() : BotCfg::GetBotDamageModSpell());\n+                }\n+                //End NpcBot\n+\n                 if (crit)\n                 {\n                     damageInfo->HitInfo |= SPELL_HIT_TYPE_CRIT;\n@@ -1068,6 +1171,17 @@ void Unit::CalculateSpellDamageTaken(SpellNonMeleeDamage* damageInfo, int32 dama\n             case SPELL_DAMAGE_CLASS_NONE:\n             case SPELL_DAMAGE_CLASS_MAGIC:\n             {\n+                //NpcBot mod: apply bot damage mods\n+                if (GetTypeId() == TYPEID_UNIT && ToCreature()->IsNPCBotOrPet())\n+                {\n+                    ToCreature()->ApplyBotDamageMultiplierSpell(damage, *damageInfo, spellInfo, attackType, crit);\n+                    if (damageSchoolMask & SPELL_SCHOOL_MASK_NORMAL)\n+                        damage *= (BotMgr::IsWanderingWorldBot(ToCreature()) ? BotCfg::GetBotWandererDamageMod() : BotCfg::GetBotDamageModPhysical());\n+                    else if (damageSchoolMask & SPELL_SCHOOL_MASK_MAGIC)\n+                        damage *= (BotMgr::IsWanderingWorldBot(ToCreature()) ? BotCfg::GetBotWandererDamageMod() : BotCfg::GetBotDamageModSpell());\n+                }\n+                //End NpcBot\n+\n                 // If crit add critical bonus\n                 if (crit)\n                 {\n@@ -1125,6 +1239,10 @@ void Unit::DealSpellDamage(SpellNonMeleeDamage const* damageInfo, bool durabilit\n         return;\n     }\n \n+    //npcbot: override spellInfo\n+    spellProto = spellProto->TryGetSpellInfoOverride(damageInfo->attacker);\n+    //end npcbot\n+\n     // Call default DealDamage\n     CleanDamage cleanDamage(damageInfo->cleanDamage, damageInfo->absorb, BASE_ATTACK, MELEE_HIT_NORMAL);\n     Unit::DealDamage(this, victim, damageInfo->damage, &cleanDamage, SPELL_DIRECT_DAMAGE, SpellSchoolMask(damageInfo->schoolMask), spellProto, durabilityLoss);\n@@ -1212,6 +1330,17 @@ void Unit::CalculateMeleeDamage(Unit* victim, CalcDamageInfo* damageInfo, Weapon\n         // Script Hook For CalculateMeleeDamage -- Allow scripts to change the Damage pre class mitigation calculations\n         sScriptMgr->ModifyMeleeDamage(damageInfo->Target, damageInfo->Attacker, damage);\n \n+        //NpcBot mod: apply bot damage mods\n+        if (GetTypeId() == TYPEID_UNIT && ToCreature()->IsNPCBotOrPet())\n+        {\n+            damageInfo->Damages[i].Damage = damage;\n+            //damage is unused. TODO: remove this redundant argument\n+            ToCreature()->ApplyBotDamageMultiplierMelee(damageInfo->Damages[i].Damage, *damageInfo);\n+            damage = damageInfo->Damages[i].Damage;\n+            damage *= (BotMgr::IsWanderingWorldBot(ToCreature()) ? BotCfg::GetBotWandererDamageMod() : BotCfg::GetBotDamageModPhysical());\n+        }\n+        //End NpcBot\n+\n         // Calculate armor reduction\n         if (Unit::IsDamageReducedByArmor(SpellSchoolMask(damageInfo->Damages[i].DamageSchoolMask)))\n         {\n@@ -1222,6 +1351,11 @@ void Unit::CalculateMeleeDamage(Unit* victim, CalcDamageInfo* damageInfo, Weapon\n             damageInfo->Damages[i].Damage = damage;\n     }\n \n+    //NpcBot mod: check custom melee outcome\n+    if (IsNPCBot())\n+        damageInfo->HitOutCome = ToCreature()->BotRollMeleeOutcomeAgainst(damageInfo->Target, damageInfo->AttackType);\n+    else\n+    //End NpcBot\n     damageInfo->HitOutCome = RollMeleeOutcomeAgainst(damageInfo->Target, damageInfo->AttackType);\n \n     switch (damageInfo->HitOutCome)\n@@ -1489,6 +1623,9 @@ void Unit::DealMeleeDamage(CalcDamageInfo* damageInfo, bool durabilityLoss)\n     if ((damageInfo->HitOutCome == MELEE_HIT_CRIT || damageInfo->HitOutCome == MELEE_HIT_CRUSHING || damageInfo->HitOutCome == MELEE_HIT_NORMAL || damageInfo->HitOutCome == MELEE_HIT_GLANCING) &&\n         GetTypeId() != TYPEID_PLAYER && !ToCreature()->IsControlledByPlayer() && !victim->HasInArc(float(M_PI), this)\n         && (victim->GetTypeId() == TYPEID_PLAYER || !victim->ToCreature()->isWorldBoss())&& !victim->IsVehicle())\n+    //npcbot: prevent daze caused by bots\n+    if (!IsNPCBotOrPet())\n+    //end npcbot\n     {\n         // 20% base chance\n         float chance = 20.0f;\n@@ -1513,6 +1650,13 @@ void Unit::DealMeleeDamage(CalcDamageInfo* damageInfo, bool durabilityLoss)\n         DamageInfo dmgInfo(*damageInfo);\n         ToPlayer()->CastItemCombatSpell(dmgInfo);\n     }\n+    //npcbot - CastItemCombatSpell for bots\n+    else if (IsNPCBot())\n+    {\n+        DamageInfo dmgInfo(*damageInfo);\n+        ToCreature()->CastCreatureItemCombatSpell(dmgInfo);\n+    }\n+    //end npcbot\n \n     // Do effect if any damage done to target\n     if (damageInfo->Damages[0].Damage + damageInfo->Damages[1].Damage)\n@@ -1636,6 +1780,15 @@ void Unit::HandleEmoteCommand(Emote emoteId)\n         }\n     }\n \n+    //npcbot: armor penetration modifier\n+    if (attacker && attacker->IsNPCBot())\n+    {\n+        // SPELL_AURA_MOD_ARMOR_PENETRATION_PCT is handled in class mods\n+        // No cap\n+        armor -= CalculatePct(armor, attacker->ToCreature()->GetCreatureArmorPenetrationCoef());\n+    }\n+    //end npcbot\n+\n     if (armor < 0.0f)\n         armor = 0.0f;\n \n@@ -1738,6 +1891,14 @@ void Unit::HandleEmoteCommand(Emote emoteId)\n             victimResistance += float(unitCaster->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_TARGET_RESISTANCE, schoolMask));\n     }\n \n+    //npcbot - spell resist and spell penetration for bots\n+    if (caster && caster->IsNPCBot())\n+        victimResistance -= caster->ToCreature()->GetCreatureSpellPenetration();\n+\n+    if (victim->IsNPCBot())\n+        victimResistance += victim->ToCreature()->GetCreatureResistanceBonus(schoolMask);\n+    //end npcbot\n+\n     // holy resistance exists in pve and comes from level difference, ignore template values\n     if (schoolMask & SPELL_SCHOOL_MASK_HOLY)\n         victimResistance = 0.0f;\n@@ -1889,6 +2050,10 @@ void Unit::HandleEmoteCommand(Emote emoteId)\n         if (float manaMultiplier = absorbAurEff->GetSpellEffectInfo().CalcValueMultiplier(absorbAurEff->GetCaster()))\n             manaReduction = int32(float(manaReduction) * manaMultiplier);\n \n+        //npcbot: fix absorption with 'manaMultiplier' < 1.0 (Mana Shield 35064)\n+        manaReduction = std::max<decltype(manaReduction)>(manaReduction, 1);\n+        //end npcbot\n+\n         int32 manaTaken = -damageInfo.GetVictim()->ModifyPower(POWER_MANA, -manaReduction);\n \n         // take case when mana has ended up into account\n@@ -2178,7 +2343,28 @@ MeleeHitOutcome Unit::RollMeleeOutcomeAgainst(Unit const* victim, WeaponAttackTy\n     // only creatures can dodge if attacker is behind\n     bool canDodge = victim->GetTypeId() != TYPEID_PLAYER || canParryOrBlock;\n \n+    //npcbot: player rules for dodge\n+    if (victim->IsNPCBot() && !canParryOrBlock)\n+        canDodge = false;\n+    //end npcbot\n+\n     // if victim is casting or cc'd it can't avoid attacks\n+    //npcbot: allow some bot classes to parry while casting\n+    if (victim->IsNPCBot())\n+    {\n+        if (victim->HasUnitState(UNIT_STATE_CONTROLLED))\n+        {\n+            canDodge = false;\n+            canParryOrBlock = false;\n+        }\n+        else if (victim->IsNonMeleeSpellCast(false, false, true))\n+        {\n+            canDodge = false;\n+            canParryOrBlock = BotMgr::CanBotParryWhileCasting(victim->ToCreature());\n+        }\n+    }\n+    else\n+    //end npcbot\n     if (victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))\n     {\n         canDodge = false;\n@@ -2214,6 +2400,9 @@ MeleeHitOutcome Unit::RollMeleeOutcomeAgainst(Unit const* victim, WeaponAttackTy\n \n     // 4. GLANCING\n     // Max 40% chance to score a glancing blow against mobs of the same or higher level (only players and pets, not for ranged weapons).\n+    //npcbot: no glances on npcbots and their pets\n+    if (!(victim->GetTypeId() == TYPEID_UNIT && victim->ToCreature()->IsNPCBotOrPet()))\n+    //end npcbot\n     if ((GetTypeId() == TYPEID_PLAYER || IsPet()) &&\n         victim->GetTypeId() != TYPEID_PLAYER && !victim->IsPet() &&\n         GetLevel() <= victim->GetLevelForTarget(this))\n@@ -2565,6 +2754,10 @@ uint32 Unit::GetDefenseSkillValue(Unit const* target) const\n         value += uint32(ToPlayer()->GetRatingBonusValue(CR_DEFENSE_SKILL));\n         return value;\n     }\n+    //npcbot - defense\n+    else if (IsNPCBot())\n+        return ToCreature()->GetCreatureDefense();\n+    //end npcbot\n     else\n         return GetMaxSkillValueForLevel(target);\n }\n@@ -2587,6 +2780,14 @@ float Unit::GetUnitDodgeChance(WeaponAttackType attType, Unit const* victim) con\n         if (!victim->IsTotem())\n         {\n             chance = 5.0f;\n+            //npcbot - custom dodge chance instead of bunch of auras and remove base chance\n+            if (victim->IsNPCBot())\n+            {\n+                if (!victim->ToCreature()->CanDodge())\n+                    return 0.f;\n+                chance = victim->ToCreature()->GetCreatureDodgeChance();\n+            }\n+            //end npcbot\n             chance += victim->GetTotalAuraModifier(SPELL_AURA_MOD_DODGE_PERCENT);\n \n             if (skillDiff <= 10)\n@@ -2607,6 +2808,13 @@ float Unit::GetUnitDodgeChance(WeaponAttackType attType, Unit const* victim) con\n     // Reduce dodge chance by attacker expertise rating\n     if (GetTypeId() == TYPEID_PLAYER)\n         chance -= ToPlayer()->GetExpertiseDodgeOrParryReduction(attType);\n+    //npcbot - manual expertise instead of auras\n+    else if (IsNPCBot())\n+    {\n+        chance -= ToCreature()->GetCreatureExpertise() / 4.0f;\n+        chance -= GetTotalAuraModifier(SPELL_AURA_MOD_EXPERTISE) / 4.0f;\n+    }\n+    //end npcbot\n     else\n         chance -= GetTotalAuraModifier(SPELL_AURA_MOD_EXPERTISE) / 4.0f;\n     return std::max(chance, 0.0f);\n@@ -2639,6 +2847,14 @@ float Unit::GetUnitParryChance(WeaponAttackType attType, Unit const* victim) con\n         if (!victim->IsTotem() && !(victim->ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_NO_PARRY))\n         {\n             chance = 5.0f;\n+            //npcbot - custom parry chance instead of bunch of auras\n+            if (victim->IsNPCBot())\n+            {\n+                if (!victim->ToCreature()->CanParry())\n+                    return 0.f;\n+                chance = victim->ToCreature()->GetCreatureParryChance();\n+            }\n+            //end npcbot\n             chance += victim->GetTotalAuraModifier(SPELL_AURA_MOD_PARRY_PERCENT);\n \n             if (skillDiff <= 10)\n@@ -2653,6 +2869,13 @@ float Unit::GetUnitParryChance(WeaponAttackType attType, Unit const* victim) con\n     // Reduce parry chance by attacker expertise rating\n     if (GetTypeId() == TYPEID_PLAYER)\n         chance -= ToPlayer()->GetExpertiseDodgeOrParryReduction(attType);\n+    //npcbot - manual expertise instead of auras\n+    else if (IsNPCBot())\n+    {\n+        chance -= ToCreature()->GetCreatureExpertise() / 4.0f;\n+        chance -= GetTotalAuraModifier(SPELL_AURA_MOD_EXPERTISE) / 4.0f;\n+    }\n+    //end npcbot\n     else\n         chance -= GetTotalAuraModifier(SPELL_AURA_MOD_EXPERTISE) / 4.0f;\n     return std::max(chance, 0.0f);\n@@ -2665,6 +2888,11 @@ float Unit::GetUnitMissChance() const\n     if (Player const* player = ToPlayer())\n         miss_chance += player->GetMissPercentageFromDefense();\n \n+    //npcbot: defense skill bonus\n+    if (Creature const* creature = ToCreature())\n+        miss_chance += (creature->GetCreatureDefense() - GetLevel() * 5) * 0.04f;\n+    //end npcbot\n+\n     return miss_chance;\n }\n \n@@ -2693,6 +2921,10 @@ float Unit::GetUnitBlockChance(WeaponAttackType attType, Unit const* victim) con\n         if (!victim->IsTotem() && !(victim->ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_NO_BLOCK))\n         {\n             chance = 5.0f;\n+            //npcbot - custom block chance instead of bunch of auras and remove base chance\n+            if (victim->IsNPCBot())\n+                chance = victim->ToCreature()->GetCreatureBlockChance();\n+            //end npcbot\n             chance += victim->GetTotalAuraModifier(SPELL_AURA_MOD_BLOCK_PERCENT);\n \n             if (skillDiff <= 10)\n@@ -2733,6 +2965,10 @@ float Unit::GetUnitCriticalChanceDone(WeaponAttackType attackType) const\n         if (!(ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_NO_CRIT))\n         {\n             chance = 5.0f;\n+            //npcbot - custom crit chance instead of bunch of auras and remove base chance\n+            if (IsNPCBot())\n+                chance = ToCreature()->GetCreatureCritChance();\n+            //end npcbot\n             chance += GetTotalAuraModifier(SPELL_AURA_MOD_WEAPON_CRIT_PERCENT);\n             chance += GetTotalAuraModifier(SPELL_AURA_MOD_CRIT_PCT);\n         }\n@@ -3035,6 +3271,11 @@ void Unit::InterruptSpell(CurrentSpellTypes spellType, bool withDelayed, bool wi\n             if (GetTypeId() == TYPEID_PLAYER)\n                 ToPlayer()->SendAutoRepeatCancel(this);\n \n+        //npcbot\n+        if (IsNPCBot())\n+            BotMgr::OnBotSpellInterrupt(this, spellType);\n+        //end npcbot\n+\n         if (spell->getState() != SPELL_STATE_FINISHED)\n             spell->cancel(result, resultOther);\n         else\n@@ -3835,6 +4076,11 @@ void Unit::RemoveAurasDueToSpellByDispel(uint32 spellId, uint32 dispellerSpellId\n             // Call AfterDispel hook on AuraScript\n             aura->CallScriptAfterDispel(&dispelInfo);\n \n+            //npcbot: hook dispels\n+            if (dispeller->IsNPCBot())\n+                BotMgr::OnBotDispelDealt(dispeller->ToUnit(), this, dispelInfo.GetRemovedCharges());\n+            //end npcbot\n+\n             return;\n         }\n         else\n@@ -5090,6 +5336,23 @@ std::vector<GameObject*> Unit::GetGameObjects(uint32 spellId) const\n     return gameobjects;\n }\n \n+//npcbot\n+GameObject* Unit::GetFirstGameObjectById(uint32 id) const\n+{\n+    for (GameObjectList::const_iterator i = m_gameObj.begin(); i != m_gameObj.end(); ++i)\n+        if ((*i)->GetEntry() == id)\n+            return *i;\n+\n+    return nullptr;\n+}\n+\n+void Unit::SetCreator(Unit* creator)\n+{\n+    //creator is unrelated to creator guid\n+    m_creator = creator;\n+}\n+//end npcbot\n+\n void Unit::AddGameObject(GameObject* gameObj)\n {\n     if (!gameObj || !gameObj->GetOwnerGUID().IsEmpty())\n@@ -5429,6 +5692,22 @@ void Unit::SetPowerType(Powers new_powertype, bool sendUpdate/* = true*/)\n                 owner->ToPlayer()->SetGroupUpdateFlag(GROUP_UPDATE_FLAG_PET_POWER_TYPE);\n         }\n     }\n+    //npcbot\n+    else if (IsNPCBotOrPet())\n+    {\n+        if (IsNPCBot())\n+        {\n+            if (ToCreature()->GetBotGroup())\n+                BotMgr::SetBotGroupUpdateFlag(ToCreature(), GROUP_UPDATE_FLAG_POWER_TYPE);\n+        }\n+        else\n+        {\n+            Unit const* owner = GetOwner();\n+            if (owner && owner->IsNPCBot() && owner->ToCreature()->GetBotsPet() == this && owner->ToCreature()->GetBotGroup())\n+                BotMgr::SetBotGroupUpdateFlag(owner->ToCreature(), GROUP_UPDATE_FLAG_PET_POWER_TYPE);\n+        }\n+    }\n+    //end npcbot\n \n     // Update max power\n     UpdateMaxPower(new_powertype);\n@@ -5612,6 +5891,9 @@ bool Unit::Attack(Unit* victim, bool meleeAttack)\n     //    ToCreature()->SetCombatStartPosition(GetPositionX(), GetPositionY(), GetPositionZ());\n \n     if (creature && !IsControlledByPlayer())\n+    //npcbot - not for npcbots either\n+    if (!creature->IsNPCBotOrPet())\n+    //end npcbot\n     {\n         EngageWithTarget(victim); // ensure that anything we're attacking has threat\n \n@@ -5713,6 +5995,19 @@ void Unit::CombatStopWithPets(bool includingCast)\n \n     for (Unit* minion : m_Controlled)\n         minion->CombatStop(includingCast);\n+\n+    //npcbot: combatstop for bots\n+    if (GetTypeId() == TYPEID_PLAYER && ToPlayer()->HaveBot())\n+    {\n+        BotMap const* map = ToPlayer()->GetBotMgr()->GetBotMap();\n+        for (BotMap::const_iterator itr = map->begin(); itr != map->end(); ++itr)\n+        {\n+            itr->second->CombatStop(includingCast);\n+            if (Unit* botPet = itr->second->GetBotsPet())\n+                botPet->CombatStop(includingCast);\n+        }\n+    }\n+    //end npcbot\n }\n \n bool Unit::isAttackingPlayer() const\n@@ -5738,6 +6033,10 @@ void Unit::RemoveAllAttackers()\n     while (!m_attackers.empty())\n     {\n         AttackerSet::iterator iter = m_attackers.begin();\n+        //npcbot\n+        if ((*iter)->IsNPCBotOrPet())\n+            BotMgr::OnBotAttackStop((*iter)->ToCreature(), this);\n+        //end npcbot\n         if (!(*iter)->AttackStop())\n         {\n             TC_LOG_ERROR(\"entities.unit\", \"WORLD: Unit has an attacker that isn't attacking it!\");\n@@ -5871,6 +6170,10 @@ Player* Unit::GetControllingPlayer() const\n             return master->GetControllingPlayer();\n         return nullptr;\n     }\n+    //npcbot\n+    else if (IsNPCBotOrPet() && ToUnit()->GetCreator())\n+        return ToUnit()->GetCreator()->ToPlayer();\n+    //end npcbot\n     else\n         return const_cast<Player*>(ToPlayer());\n }\n@@ -6197,6 +6500,14 @@ void Unit::SetCharm(Unit* charm, bool apply)\n \n             player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEAL_CAST, addhealth);\n         }\n+        //npcbot\n+        if (unit->IsNPCBot())\n+        {\n+            Creature const* bot = unit->ToCreature();\n+            if (Battleground* bg = bot->GetBotBG())\n+                bg->UpdateBotScore(bot, SCORE_HEALING_DONE, gain);\n+        }\n+        //end npcbot\n     }\n \n     if (Player* player = victim->ToPlayer())\n@@ -6312,13 +6623,23 @@ Unit* Unit::GetNextRandomRaidMemberOrPet(float radius)\n     else if (GetTypeId() == TYPEID_UNIT && IsPet())\n         player = GetOwner()->ToPlayer();\n \n+    //npcbot\n+    /*\n+    //end npcbot\n     if (!player)\n         return nullptr;\n     Group* group = player->GetGroup();\n+    //npcbot\n+    */\n+    Group* group = player ? player->GetGroup() : IsNPCBot() ? ToCreature()->GetBotGroup() : nullptr;\n+    //end npcbot\n     // When there is no group check pet presence\n     if (!group)\n     {\n         // We are pet now, return owner\n+        //npcbot\n+        if (player)\n+        //end npcbot\n         if (player != this)\n             return IsWithinDistInMap(player, radius) ? player : nullptr;\n         Unit* pet = GetGuardianPet();\n@@ -6346,6 +6667,17 @@ Unit* Unit::GetNextRandomRaidMemberOrPet(float radius)\n                 nearMembers.push_back(pet);\n         }\n \n+    //npcbot\n+    for (GroupBotReference* itr = group->GetFirstBotMember(); itr != nullptr; itr = itr->next())\n+    {\n+        if (Creature* bot = itr->GetSource())\n+        {\n+            if (bot != this && bot->IsAlive() && IsWithinDistInMap(bot, radius) && !IsHostileTo(bot))\n+                nearMembers.push_back(bot);\n+        }\n+    }\n+    //end npcbot\n+\n     if (nearMembers.empty())\n         return nullptr;\n \n@@ -6440,7 +6772,13 @@ void Unit::SendEnergizeSpellLog(Unit* victim, uint32 spellId, int32 damage, Powe\n void Unit::EnergizeBySpell(Unit* victim, uint32 spellId, int32 damage, Powers powerType)\n {\n     if (SpellInfo const* info = sSpellMgr->GetSpellInfo(spellId))\n+    {\n+        //npcbot: override spellInfo\n+        info = info->TryGetSpellInfoOverride(this);\n+        //end npcbot\n+\n         EnergizeBySpell(victim, info, damage, powerType);\n+    }\n }\n \n void Unit::EnergizeBySpell(Unit* victim, SpellInfo const* spellInfo, int32 damage, Powers powerType)\n@@ -6611,6 +6949,11 @@ float Unit::SpellDamagePctDone(Unit* victim, SpellInfo const* spellProto, Damage\n     // Done total percent damage auras\n     float DoneTotalMod = 1.0f;\n \n+    //npcbot: do not affect bots\n+    if (GetTypeId() == TYPEID_UNIT && ToCreature()->IsNPCBotOrPet())\n+    { /*do nothing*/ }\n+    else\n+    //end npcbot\n     // Pet damage?\n     if (GetTypeId() == TYPEID_UNIT && !IsPet())\n         DoneTotalMod *= ToCreature()->GetSpellDamageMod(ToCreature()->GetCreatureTemplate()->rank);\n@@ -6952,6 +7295,11 @@ uint32 Unit::SpellDamageBonusTaken(Unit* caster, SpellInfo const* spellProto, ui\n         // multiplicative bonus, for example Dispersion + Shadowform (0.10*0.85=0.085)\n         TakenTotalMod *= GetTotalAuraMultiplierByMiscMask(SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, spellProto->GetSchoolMask());\n \n+        //npcbot - damage taken modifier\n+        if (IsNPCBot())\n+            TakenTotalMod *= BotMgr::GetBotDamageTakenMod(ToCreature(), true);\n+        //end npcbot\n+\n         // From caster spells\n         if (caster)\n         {\n@@ -6988,6 +7336,11 @@ int32 Unit::SpellBaseDamageBonusDone(SpellSchoolMask schoolMask) const\n {\n     int32 DoneAdvertisedBenefit = GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_DAMAGE_DONE, schoolMask);\n \n+    //npcbot: apply bot spellpower\n+    if ((schoolMask & SPELL_SCHOOL_MASK_MAGIC) && IsNPCBot())\n+        DoneAdvertisedBenefit += ToCreature()->GetCreatureSpellPower();\n+    //end npcbot\n+\n     if (GetTypeId() == TYPEID_PLAYER)\n     {\n         // Base value\n@@ -7016,6 +7369,9 @@ float Unit::SpellCritChanceDone(SpellInfo const* spellInfo, SpellSchoolMask scho\n {\n     //! Mobs can't crit with spells. (Except player controlled)\n     if (GetTypeId() == TYPEID_UNIT && !GetSpellModOwner())\n+        //npcbot - allow bots to crit\n+        if (!ToCreature()->IsNPCBotOrPet())\n+        //end npcbot\n         return 0.0f;\n \n     // not critting spell\n@@ -7251,6 +7607,11 @@ float Unit::SpellCritChanceTaken(Unit const* caster, SpellInfo const* spellInfo,\n         });\n     }\n \n+    //npcbot - apply bot spell crit mods\n+    if (caster && caster->IsNPCBot())\n+        caster->ToCreature()->ApplyBotCritMultiplierAll(this, crit_chance, spellInfo, schoolMask, attackType);\n+    //end npcbot\n+\n     return std::max(crit_chance, 0.0f);\n }\n \n@@ -7472,6 +7833,11 @@ uint32 Unit::SpellHealingBonusDone(Unit* victim, SpellInfo const* spellProto, ui\n     if (Player* modOwner = GetSpellModOwner())\n         modOwner->ApplySpellMod(spellProto->Id, damagetype == DOT ? SPELLMOD_DOT : SPELLMOD_DAMAGE, heal);\n \n+    //npcbot - healing bonus done for bots\n+    if (IsNPCBot())\n+        ToCreature()->ApplyBotDamageMultiplierHeal(victim, heal, spellProto, damagetype, stack);\n+    //end npcbot\n+\n     return uint32(std::max(heal, 0.0f));\n }\n \n@@ -7612,6 +7978,11 @@ int32 Unit::SpellBaseHealingBonusDone(SpellSchoolMask schoolMask) const\n         return false;\n     });\n \n+    //npcbot: apply bot spellpower to healing\n+    if (IsNPCBot())\n+        advertisedBenefit += ToCreature()->GetCreatureSpellPower();\n+    //end npcbot\n+\n     // Healing bonus of spirit, intellect and strength\n     if (GetTypeId() == TYPEID_PLAYER)\n     {\n@@ -8054,6 +8425,11 @@ uint32 Unit::MeleeDamageBonusTaken(Unit* attacker, uint32 pdamage, WeaponAttackT\n     // ..taken\n     TakenTotalMod *= GetTotalAuraMultiplierByMiscMask(SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, attacker->GetMeleeDamageSchoolMask());\n \n+    //npcbot - damage taken modifier\n+    if (IsNPCBot())\n+        TakenTotalMod *= BotMgr::GetBotDamageTakenMod(ToCreature(), false);\n+    //end npcbot\n+\n     // .. taken pct (special attacks)\n     if (spellProto)\n     {\n@@ -8188,6 +8564,25 @@ void Unit::Mount(uint32 mount, uint32 VehicleId, uint32 creatureEntry)\n \n     SetUnitFlag(UNIT_FLAG_MOUNT);\n \n+    //npcbot\n+    if (IsNPCBot())\n+    {\n+        if (VehicleId)\n+        {\n+            TC_LOG_ERROR(\"scripts\", \"NPCBot::Mount mounting {}, vehicle {} ({})\", mount, VehicleId, creatureEntry);\n+            if (CreateVehicleKit(VehicleId, creatureEntry))\n+            {\n+                // Send others that we now have a vehicle\n+                WorldPacket data(SMSG_PLAYER_VEHICLE_DATA, GetPackGUID().size()+4);\n+                data << GetPackGUID();\n+                data << uint32(VehicleId);\n+                SendMessageToSet(&data, true);\n+                GetVehicleKit()->InstallAllAccessories(false);\n+            }\n+        }\n+    }\n+    else\n+    //end npcbot\n     if (Player* player = ToPlayer())\n     {\n         // mount as a vehicle\n@@ -8247,6 +8642,19 @@ void Unit::Dismount()\n     SendMessageToSet(&data, true);\n \n     // dismount as a vehicle\n+    //npcbot\n+    if (IsNPCBot() && GetVehicleKit())\n+    {\n+        //TC_LOG_ERROR(\"scripts\", \"NPCBot::Dismount dismounting vehicle {} (base {}, cre {})\",\n+        //    GetVehicleKit()->GetVehicleInfo()->m_ID, GetVehicleKit()->GetBase()->GetEntry(), GetVehicleKit()->GetCreatureEntry());\n+        data.Initialize(SMSG_PLAYER_VEHICLE_DATA, 8 + 4);\n+        data << GetPackGUID();\n+        data << uint32(0);\n+        SendMessageToSetInRange(&data, GetVisibilityRange(), /*not used*/true);\n+        RemoveVehicleKit();\n+    }\n+    else\n+    //end npcbot\n     if (GetTypeId() == TYPEID_PLAYER && GetVehicleKit())\n     {\n         // Send other players that we are no longer a vehicle\n@@ -8328,6 +8736,14 @@ void Unit::SetImmuneToPC(bool apply, bool keepCombat)\n             for (auto const& pair : m_combatManager.GetPvPCombatRefs())\n                 if (pair.second->GetOther(this)->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED))\n                     toEnd.push_back(pair.second);\n+            //npcbot\n+            for (auto const& pair : m_combatManager.GetPvECombatRefs())\n+                if (pair.second->GetOther(this)->IsNPCBotOrPet())\n+                    toEnd.push_back(pair.second);\n+            for (auto const& pair : m_combatManager.GetPvPCombatRefs())\n+                if (pair.second->GetOther(this)->IsNPCBotOrPet())\n+                    toEnd.push_back(pair.second);\n+            //end npcbot\n             for (CombatReference* ref : toEnd)\n                 ref->EndCombat();\n         }\n@@ -8351,6 +8767,9 @@ void Unit::SetImmuneToNPC(bool apply, bool keepCombat)\n             for (auto const& pair : m_combatManager.GetPvPCombatRefs())\n                 if (!pair.second->GetOther(this)->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED))\n                     toEnd.push_back(pair.second);\n+            //npcbot\n+            toEnd.remove_if([this](CombatReference const* cref) { return cref->GetOther(this)->IsNPCBotOrPet(); });\n+            //end npcbot\n             for (CombatReference* ref : toEnd)\n                 ref->EndCombat();\n         }\n@@ -8491,6 +8910,11 @@ bool Unit::IsAlwaysVisibleFor(WorldObject const* seer) const\n                 if (ownerPlayer->IsGroupVisibleFor(seerPlayer))\n                     return true;\n \n+    //npcbot - bots are always visible for owner\n+    if (GetCreator() && (seer->GetGUID() == GetCreator()->GetGUID() || (seer->IsCreature() && seer->ToCreature()->GetCreator() == GetCreator())))\n+        return true;\n+    //end npcbot\n+\n     return false;\n }\n \n@@ -8644,6 +9068,20 @@ void Unit::UpdateSpeed(UnitMoveType mtype)\n                 }\n             }\n         }\n+\n+        //npcbot\n+        if (creature->IsNPCBotPet() && !creature->IsInCombat() && GetMotionMaster()->GetCurrentMovementGeneratorType() == FOLLOW_MOTION_TYPE)\n+        {\n+            Unit* followed = ASSERT_NOTNULL(dynamic_cast<AbstractFollower*>(GetMotionMaster()->GetCurrentMovementGenerator()))->GetTarget();\n+            if (followed && (followed->GetGUID() == GetOwnerGUID() || followed->GetGUID() == GetCreatorGUID()) && !followed->IsInCombat())\n+            {\n+                float ownerSpeed = followed->GetSpeedRate(mtype);\n+                if (speed < ownerSpeed)\n+                    speed = ownerSpeed;\n+                speed *= std::min(std::max(1.0f, 0.75f + (GetDistance(followed) - PET_FOLLOW_DIST) * 0.05f), 1.5f);\n+            }\n+        }\n+        //end npcbot\n     }\n \n     // Apply strongest slow aura mod to speed\n@@ -8808,7 +9246,45 @@ void Unit::AtTargetAttacked(Unit* target, bool canInitialAggro)\n         myPlayerOwner->UpdatePvP(true);\n         myPlayerOwner->SetContestedPvP(targetPlayerOwner);\n         myPlayerOwner->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT);\n+\n+        //npcbot: init contested PvP for owned bots\n+        if (IsNPCBotOrPet() && target->IsNPCBotOrPet())\n+        {\n+            if (Unit* bot = IsNPCBotPet() ? static_cast<Unit*>(myPlayerOwner->GetBotMgr()->GetBot(GetOwnerGUID())) : this)\n+            {\n+                BotMgr::SetBotContestedPvP(bot->ToCreature());\n+                bot->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT);\n+            }\n+        }\n+        //end npcbot\n     }\n+    //npcbot: init contested PvP for free bots\n+    else if (!myPlayerOwner && IsNPCBotOrPet() && (target->IsNPCBotOrPet() || targetPlayerOwner))\n+    {\n+        if (Unit* bot = IsNPCBotPet() ? GetCreator() : this)\n+        {\n+            BotMgr::SetBotContestedPvP(bot->ToCreature());\n+            bot->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT);\n+        }\n+    }\n+    else if (myPlayerOwner && !targetPlayerOwner && target->IsNPCBotOrPet() && (IsPlayer() || IsNPCBotOrPet()))\n+    {\n+        if (IsPlayer())\n+        {\n+            myPlayerOwner->UpdatePvP(true);\n+            myPlayerOwner->SetContestedPvP();\n+            myPlayerOwner->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT);\n+        }\n+        else // if (IsNPCBotOrPet())\n+        {\n+            if (Unit* bot = IsNPCBotPet() ? static_cast<Unit*>(myPlayerOwner->GetBotMgr()->GetBot(GetOwnerGUID())) : this)\n+            {\n+                BotMgr::SetBotContestedPvP(bot->ToCreature());\n+                bot->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT);\n+            }\n+        }\n+    }\n+    //end npcbot\n }\n \n void Unit::UpdatePetCombatState()\n@@ -8875,6 +9351,12 @@ bool Unit::ApplyDiminishingToDuration(SpellInfo const* auraSpellInfo, bool trigg\n \n         if (target->IsAffectedByDiminishingReturns() && source->GetTypeId() == TYPEID_PLAYER)\n             duration = limitDuration;\n+\n+        //npcbot: limit duration if casted by npcbots\n+        if (target->GetTypeId() == TYPEID_PLAYER && source->GetTypeId() == TYPEID_UNIT &&\n+            source->ToCreature()->IsNPCBotOrPet())\n+            duration = limitDuration;\n+        //end npcbots\n     }\n \n     float mod = 1.0f;\n@@ -8951,6 +9433,17 @@ uint32 Unit::GetCreatureType() const\n             return raceEntry->CreatureType;\n         }\n     }\n+    //npcbot: support for druid's shapeshifting\n+    else if (IsNPCBot())\n+    {\n+        ShapeshiftForm form = GetShapeshiftForm();\n+        SpellShapeshiftFormEntry const* ssEntry = sSpellShapeshiftFormStore.LookupEntry(form);\n+        if (ssEntry && ssEntry->CreatureType > 0)\n+            return ssEntry->CreatureType;\n+        else\n+            return CREATURE_TYPE_HUMANOID;\n+    }\n+    //end npcbot\n     else\n         return ToCreature()->GetCreatureTemplate()->type;\n }\n@@ -9337,6 +9830,11 @@ float Unit::GetWeaponDamageRange(WeaponAttackType attType, WeaponDamageRange typ\n \n bool Unit::CanFreeMove() const\n {\n+    //npcbot: skip owner guid condition for bots\n+    if (IsNPCBotOrPet())\n+        return !HasUnitState(UNIT_STATE_CONFUSED | UNIT_STATE_FLEEING | UNIT_STATE_IN_FLIGHT |\n+            UNIT_STATE_ROOT | UNIT_STATE_STUNNED | UNIT_STATE_DISTRACTED);\n+    //end npcbot\n     return !HasUnitState(UNIT_STATE_CONFUSED | UNIT_STATE_FLEEING | UNIT_STATE_IN_FLIGHT |\n         UNIT_STATE_ROOT | UNIT_STATE_STUNNED | UNIT_STATE_DISTRACTED);\n }\n@@ -9356,6 +9854,13 @@ void Unit::SetLevel(uint8 lvl, bool sendUpdate/* = true*/)\n \n         sCharacterCache->UpdateCharacterLevel(GetGUID(), lvl);\n     }\n+    //npcbot\n+    else if (IsNPCBot())\n+    {\n+        if (ToCreature()->GetBotGroup())\n+            BotMgr::SetBotGroupUpdateFlag(ToCreature(), GROUP_UPDATE_FLAG_LEVEL);\n+    }\n+    //end npcbot\n }\n \n void Unit::SetHealth(uint32 val)\n@@ -9388,6 +9893,22 @@ void Unit::SetHealth(uint32 val)\n                 owner->ToPlayer()->SetGroupUpdateFlag(GROUP_UPDATE_FLAG_PET_CUR_HP);\n         }\n     }\n+    //npcbot\n+    else if (IsNPCBotOrPet())\n+    {\n+        if (IsNPCBot())\n+        {\n+            if (ToCreature()->GetBotGroup())\n+                BotMgr::SetBotGroupUpdateFlag(ToCreature(), GROUP_UPDATE_FLAG_CUR_HP);\n+        }\n+        else\n+        {\n+            Unit const* owner = GetOwner();\n+            if (owner && owner->IsNPCBot() && owner->ToCreature()->GetBotsPet() == this && owner->ToCreature()->GetBotGroup())\n+                BotMgr::SetBotGroupUpdateFlag(owner->ToCreature(), GROUP_UPDATE_FLAG_PET_CUR_HP);\n+        }\n+    }\n+    //end npcbot\n }\n \n void Unit::SetMaxHealth(uint32 val)\n@@ -9413,6 +9934,22 @@ void Unit::SetMaxHealth(uint32 val)\n                 owner->ToPlayer()->SetGroupUpdateFlag(GROUP_UPDATE_FLAG_PET_MAX_HP);\n         }\n     }\n+    //npcbot\n+    else if (IsNPCBotOrPet())\n+    {\n+        if (IsNPCBot())\n+        {\n+            if (ToCreature()->GetBotGroup())\n+                BotMgr::SetBotGroupUpdateFlag(ToCreature(), GROUP_UPDATE_FLAG_MAX_HP);\n+        }\n+        else\n+        {\n+            Unit const* owner = GetOwner();\n+            if (owner && owner->IsNPCBot() && owner->ToCreature()->GetBotsPet() == this && owner->ToCreature()->GetBotGroup())\n+                BotMgr::SetBotGroupUpdateFlag(owner->ToCreature(), GROUP_UPDATE_FLAG_PET_MAX_HP);\n+        }\n+    }\n+    //end npcbot\n \n     if (val < health)\n         SetHealth(val);\n@@ -9457,6 +9994,22 @@ void Unit::SetPower(Powers power, uint32 val, bool withPowerUpdate /*= true*/, b\n         if (pet->getPetType() == HUNTER_PET && power == POWER_HAPPINESS)\n             pet->UpdateDamagePhysical(BASE_ATTACK);\n     }\n+    //npcbot\n+    else if (IsNPCBotOrPet())\n+    {\n+        if (IsNPCBot())\n+        {\n+            if (ToCreature()->GetBotGroup())\n+                BotMgr::SetBotGroupUpdateFlag(ToCreature(), GROUP_UPDATE_FLAG_CUR_POWER);\n+        }\n+        else\n+        {\n+            Unit const* owner = GetOwner();\n+            if (owner && owner->IsNPCBot() && owner->ToCreature()->GetBotsPet() == this && owner->ToCreature()->GetBotGroup())\n+                BotMgr::SetBotGroupUpdateFlag(owner->ToCreature(), GROUP_UPDATE_FLAG_PET_CUR_POWER);\n+        }\n+    }\n+    //end npcbot\n }\n \n void Unit::SetMaxPower(Powers power, uint32 val)\n@@ -9479,6 +10032,22 @@ void Unit::SetMaxPower(Powers power, uint32 val)\n                 owner->ToPlayer()->SetGroupUpdateFlag(GROUP_UPDATE_FLAG_PET_MAX_POWER);\n         }\n     }\n+    //npcbot\n+    else if (IsNPCBotOrPet())\n+    {\n+        if (IsNPCBot())\n+        {\n+            if (ToCreature()->GetBotGroup())\n+                BotMgr::SetBotGroupUpdateFlag(ToCreature(), GROUP_UPDATE_FLAG_MAX_POWER);\n+        }\n+        else\n+        {\n+            Unit const* owner = GetOwner();\n+            if (owner && owner->IsNPCBot() && owner->ToCreature()->GetBotsPet() == this && owner->ToCreature()->GetBotGroup())\n+                BotMgr::SetBotGroupUpdateFlag(owner->ToCreature(), GROUP_UPDATE_FLAG_PET_MAX_POWER);\n+        }\n+    }\n+    //end npcbot\n \n     if (val < cur_power)\n         SetPower(power, val);\n@@ -10136,6 +10705,13 @@ void Unit::ProcSkillsAndReactives(bool isVictim, Unit* procTarget, uint32 typeMa\n                     ModifyAuraState(AURA_STATE_DEFENSE, true);\n                     StartReactiveTimer(REACTIVE_DEFENSE);\n                 }\n+                //npcbot - update reactives for bots (victim)\n+                if ((hitMask & PROC_HIT_PARRY) && IsNPCBot() && ToCreature()->GetBotClass() == CLASS_HUNTER)\n+                {\n+                    ModifyAuraState(AURA_STATE_HUNTER_PARRY, true);\n+                    StartReactiveTimer(REACTIVE_HUNTER_PARRY);\n+                }\n+                //end npcbot\n             }\n             else // For attacker\n             {\n@@ -10150,6 +10726,15 @@ void Unit::ProcSkillsAndReactives(bool isVictim, Unit* procTarget, uint32 typeMa\n                     AddComboPoints(procTarget, 1);\n                     StartReactiveTimer(REACTIVE_WOLVERINE_BITE);\n                 }\n+\n+                //npcbot - update reactives for bots (attacker)\n+                if ((hitMask & (PROC_HIT_DODGE | PROC_HIT_PARRY)) && IsNPCBot() && ToCreature()->GetBotClass() == CLASS_WARRIOR)\n+                {\n+                    AddComboPoints(procTarget, 1);\n+                    StartReactiveTimer(REACTIVE_OVERPOWER);\n+                }\n+                //TODO REACTIVE_WOLVERINE_BITE for bot hunter pets\n+                //end npcbot\n             }\n         }\n     }\n@@ -10518,6 +11103,13 @@ void Unit::SendComboPoints()\n     Player* owner = nullptr;\n     if (ownerGuid.IsPlayer())\n         owner = ObjectAccessor::GetPlayer(*this, ownerGuid);\n+    //npcbot\n+    else if (IsNPCBotOrPet())\n+    {\n+        if (Unit* creator = ToUnit()->GetCreator())\n+            owner = creator->ToPlayer();\n+    }\n+    //end npcbot\n     if (movingMe || owner)\n     {\n         WorldPacket data;\n@@ -10538,6 +11130,32 @@ void Unit::ClearComboPointHolders()\n         (*m_ComboPointHolders.begin())->ClearComboPoints(); // this also removes it from m_comboPointHolders\n }\n \n+//npcbot\n+void Unit::ClearReactive(ReactiveType reactive)\n+{\n+    m_reactiveTimer[reactive] = 0;\n+\n+    switch (reactive)\n+    {\n+        case REACTIVE_DEFENSE:\n+            if (HasAuraState(AURA_STATE_DEFENSE))\n+                ModifyAuraState(AURA_STATE_DEFENSE, false);\n+            break;\n+        case REACTIVE_HUNTER_PARRY:\n+            if (GetClass() == CLASS_HUNTER && HasAuraState(AURA_STATE_HUNTER_PARRY))\n+                ModifyAuraState(AURA_STATE_HUNTER_PARRY, false);\n+            break;\n+        case REACTIVE_OVERPOWER:\n+            if (GetClass() == CLASS_WARRIOR)\n+                ClearComboPoints();\n+            break;\n+        default:\n+            break;\n+        //TODO WOLVERINE_BITE clear\n+    }\n+}\n+//end npcbot\n+\n void Unit::ClearAllReactives()\n {\n     for (uint8 i = 0; i < MAX_REACTIVE; ++i)\n@@ -10667,6 +11285,9 @@ uint32 Unit::GetCastingTimeForBonus(SpellInfo const* spellProto, DamageEffectTyp\n {\n     // Not apply this to creature cast spells with casttime == 0\n     if (CastingTime == 0 && GetTypeId() == TYPEID_UNIT && !IsPet())\n+        //npcbot - skip bots\n+        if (!ToCreature()->IsNPCBotOrPet())\n+        //end npcbot\n         return 3500;\n \n     if (CastingTime > 7000) CastingTime = 7000;\n@@ -10780,6 +11401,28 @@ void Unit::UpdateAuraForGroup(uint8 slot)\n             }\n         }\n     }\n+    //npcbot\n+    else if (IsNPCBotOrPet())\n+    {\n+        if (IsNPCBot())\n+        {\n+            if (ToCreature()->GetBotGroup())\n+            {\n+                BotMgr::SetBotGroupUpdateFlag(ToCreature(), GROUP_UPDATE_FLAG_AURAS);\n+                BotMgr::SetBotAuraUpdateMaskForRaid(ToCreature(), slot);\n+            }\n+        }\n+        else\n+        {\n+            Unit const* owner = GetOwner();\n+            if (owner && owner->IsNPCBot() && owner->ToCreature()->GetBotsPet() == this && owner->ToCreature()->GetBotGroup())\n+            {\n+                BotMgr::SetBotGroupUpdateFlag(owner->ToCreature(), GROUP_UPDATE_FLAG_PET_AURAS);\n+                BotMgr::SetBotPetAuraUpdateMaskForRaid(ToCreature(), slot);\n+            }\n+        }\n+    }\n+    //end npcbot\n }\n \n void Unit::SetCantProc(bool apply)\n@@ -10945,6 +11588,11 @@ bool Unit::InitTamedPet(Pet* pet, uint8 level, uint32 spell_id)\n \n     // find player: owner of controlled `this` or `this` itself maybe\n     Player* player = nullptr;\n+    //npcbot - loot recipient of bot's vehicle is owner\n+    if (attacker && attacker->IsVehicle() && attacker->GetCharmerGUID().IsCreature() && attacker->GetCreator() && attacker->GetCreator()->IsPlayer())\n+        player = attacker->GetCreator()->ToPlayer();\n+    else\n+    //end npcbot\n     if (attacker)\n         player = attacker->GetCharmerOrOwnerPlayerOrPlayerItself();\n \n@@ -11043,6 +11691,11 @@ bool Unit::InitTamedPet(Pet* pet, uint8 level, uint32 spell_id)\n             if (creature->GetLootMode() > 0)\n                 loot->generateMoneyLoot(creature->GetCreatureTemplate()->mingold, creature->GetCreatureTemplate()->maxgold);\n \n+            //npcbot: spawn wandering bot kill reward\n+            if (creature->IsNPCBot() && creature->IsWandererBot())\n+                BotMgr::OnBotWandererKilled(creature, looter);\n+            //end npcbot\n+\n             if (group)\n             {\n                 if (hasLooterGuid)\n@@ -11059,6 +11712,11 @@ bool Unit::InitTamedPet(Pet* pet, uint8 level, uint32 spell_id)\n         player->RewardPlayerAndGroupAtKill(victim, false);\n     }\n \n+    //npcbot: spawn wandering bot kill reward\n+    if (creature && creature->IsNPCBot())\n+        BotMgr::OnBotKilled(creature, attacker);\n+    //end npcbot\n+\n     // Do KILL and KILLED procs. KILL proc is called only for the unit who landed the killing blow (and its owner - for pets and totems) regardless of who tapped the victim\n     if (attacker && (attacker->IsPet() || attacker->IsTotem()))\n     {\n@@ -11126,6 +11784,12 @@ bool Unit::InitTamedPet(Pet* pet, uint8 level, uint32 spell_id)\n         // at original death (not at SpiritOfRedemtionTalent timeout)\n         plrVictim->SetPvPDeath(player != nullptr);\n \n+        //npcbot - bots should not cause durability loss\n+        if (durabilityLoss && attacker && attacker->GetTypeId() == TYPEID_UNIT && attacker->ToCreature()->GetBotAI() &&\n+            !sWorld->getBoolConfig(CONFIG_DURABILITY_LOSS_IN_PVP))\n+            durabilityLoss = false;\n+        //end npcbot\n+\n         // only if not player and not controlled by player pet. And not at BG\n         if ((durabilityLoss && !player && !victim->ToPlayer()->InBattleground()) || (player && sWorld->getBoolConfig(CONFIG_DURABILITY_LOSS_IN_PVP)))\n         {\n@@ -11228,6 +11892,10 @@ bool Unit::InitTamedPet(Pet* pet, uint8 level, uint32 spell_id)\n         {\n             if (Player* playerVictim = victim->ToPlayer())\n                 bg->HandleKillPlayer(playerVictim, player);\n+            //npcbot: handler PvB bg kill\n+            else if (victim->IsNPCBot() && victim->ToCreature()->GetBotBG() == bg)\n+                bg->HandlePlayerKillBot(victim->ToCreature(), player);\n+            //end npcbot\n             else\n                 bg->HandleKillUnit(victim->ToCreature(), player);\n         }\n@@ -11256,6 +11924,14 @@ bool Unit::InitTamedPet(Pet* pet, uint8 level, uint32 spell_id)\n         {\n             if (Player* killed = victim->ToPlayer())\n                 sScriptMgr->OnPlayerKilledByCreature(killerCre, killed);\n+            //npcbot: Creature Kill hook for owner\n+            else if (Creature* killedCre = victim->ToCreature())\n+            {\n+                Unit* killerCreOwner = killerCre->GetCreator();\n+                if (killerCre->IsNPCBotOrPet() && killerCreOwner && killerCreOwner->GetTypeId() == TYPEID_PLAYER)\n+                    sScriptMgr->OnCreatureKill(killerCreOwner->ToPlayer(), killedCre);\n+            }\n+            //end npcbot\n         }\n     }\n }\n@@ -11884,6 +12560,17 @@ bool Unit::IsInPartyWith(Unit const* unit) const\n         (u1->GetTypeId() == TYPEID_PLAYER && u2->GetTypeId() == TYPEID_UNIT && u2->ToCreature()->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT))\n         return true;\n \n+    //npcbot\n+    Player const* pla = u1->IsPlayer() ? u1->ToPlayer() : u2->IsPlayer() ? u2->ToPlayer() : nullptr;\n+    Creature const* bot = u1->IsNPCBot() ? u1->ToCreature() : u2->IsNPCBot() ? u2->ToCreature() : nullptr;\n+    if (pla && bot)\n+        return (pla->GetGroup() && pla->GetGroup() == bot->GetBotGroup()) ? pla->GetSubGroup() == bot->GetSubGroup() : !!pla->GetBotMgr()->GetBot(bot->GetGUID());\n+    if (u1->IsNPCBot() && u2->IsNPCBot() && u1->ToCreature()->GetBotGroup() && u1->ToCreature()->GetBotGroup() == u2->ToCreature()->GetBotGroup())\n+        return u1->ToCreature()->GetSubGroup() == u2->ToCreature()->GetSubGroup();\n+    if (u1->IsNPCBot() && u2->IsNPCBot() && u1->IsFFAPvP() && u2->IsFFAPvP())\n+        return false;\n+    //end npcbot\n+\n     return u1->GetTypeId() == TYPEID_UNIT && u2->GetTypeId() == TYPEID_UNIT && u1->GetFaction() == u2->GetFaction();\n }\n \n@@ -11902,6 +12589,16 @@ bool Unit::IsInRaidWith(Unit const* unit) const\n     else if ((u2->GetTypeId() == TYPEID_PLAYER && u1->GetTypeId() == TYPEID_UNIT && u1->ToCreature()->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT) ||\n             (u1->GetTypeId() == TYPEID_PLAYER && u2->GetTypeId() == TYPEID_UNIT && u2->ToCreature()->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT))\n         return true;\n+    //npcbot\n+    Player const* pla = u1->IsPlayer() ? u1->ToPlayer() : u2->IsPlayer() ? u2->ToPlayer() : nullptr;\n+    Creature const* bot = u1->IsNPCBot() ? u1->ToCreature() : u2->IsNPCBot() ? u2->ToCreature() : nullptr;\n+    if (pla && bot)\n+        return (pla->GetGroup() && pla->GetGroup() == bot->GetBotGroup()) ? true : !!pla->GetBotMgr()->GetBot(bot->GetGUID());\n+    if (u1->IsNPCBot() && u2->IsNPCBot() && u1->ToCreature()->GetBotGroup())\n+        return  u1->ToCreature()->GetBotGroup() == u2->ToCreature()->GetBotGroup();\n+    if (u1->IsNPCBot() && u2->IsNPCBot() && u1->IsFFAPvP() && u2->IsFFAPvP())\n+        return false;\n+    //end npcbot\n \n     return u1->GetTypeId() == TYPEID_UNIT && u2->GetTypeId() == TYPEID_UNIT && u1->GetFaction() == u2->GetFaction();\n }\n@@ -11913,9 +12610,21 @@ void Unit::GetPartyMembers(std::list<Unit*> &TagUnitMap)\n     if (owner->GetTypeId() == TYPEID_PLAYER)\n         group = owner->ToPlayer()->GetGroup();\n \n+    //npcbot: get bot group\n+    if (!group && IsNPCBot())\n+        group = ToCreature()->GetBotGroup();\n+    //end npcbot\n+\n     if (group)\n     {\n+        //npcbot: get bot group\n+        /*\n+        //end npcbot\n         uint8 subgroup = owner->ToPlayer()->GetSubGroup();\n+        //npcbot: get bot group\n+        */\n+        uint8 subgroup = owner->IsPlayer() ? owner->ToPlayer()->GetSubGroup() : group->GetMemberGroup(owner->GetGUID());\n+        //end npcbot\n \n         for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())\n         {\n@@ -11932,6 +12641,14 @@ void Unit::GetPartyMembers(std::list<Unit*> &TagUnitMap)\n                         TagUnitMap.push_back(pet);\n             }\n         }\n+        //npcbot: count bots\n+        for (GroupBotReference* itr = group->GetFirstBotMember(); itr != nullptr; itr = itr->next())\n+        {\n+            Creature* bot = itr->GetSource();\n+            if (bot && group->GetMemberGroup(bot->GetGUID()) == subgroup && bot->IsAlive() && IsInMap(bot) && !IsHostileTo(bot))\n+                TagUnitMap.push_back(bot);\n+        }\n+        //end npcbot\n     }\n     else\n     {\n@@ -11940,6 +12657,18 @@ void Unit::GetPartyMembers(std::list<Unit*> &TagUnitMap)\n         if (Guardian* pet = owner->GetGuardianPet())\n             if ((pet == this || IsInMap(pet)) && pet->IsAlive())\n                 TagUnitMap.push_back(pet);\n+\n+        //npcbot: count bots\n+        if (owner->GetTypeId() == TYPEID_PLAYER && owner->ToPlayer()->HaveBot())\n+        {\n+            BotMap const* map = owner->ToPlayer()->GetBotMgr()->GetBotMap();\n+            for (BotMap::const_iterator it = map->begin(); it != map->end(); ++it)\n+            {\n+                if (it->second->IsAlive() && IsInMap(it->second) && !IsHostileTo(it->second))\n+                    TagUnitMap.push_back(it->second);\n+            }\n+        }\n+        //end npcbot\n     }\n }\n \n@@ -11968,6 +12697,10 @@ Aura* Unit::AddAura(uint32 spellId, Unit* target)\n     if (!spellInfo)\n         return nullptr;\n \n+    //npcbot: override spellInfo\n+    spellInfo = spellInfo->TryGetSpellInfoOverride(this);\n+    //end npcbot\n+\n     return AddAura(spellInfo, MAX_EFFECT_MASK, target);\n }\n \n@@ -12024,6 +12757,11 @@ void Unit::SendPlaySpellVisualKit(uint32 id, uint32 type) const\n \n bool Unit::CanApplyResilience() const\n {\n+    //npcbot: allow bots' damage to be mitigated by target's resilience\n+    if (GetTypeId() == TYPEID_UNIT && ToCreature()->IsNPCBotOrPet())\n+        return true;\n+    //end npcbot\n+\n     return !IsVehicle() && GetOwnerGUID().IsPlayer();\n }\n \n@@ -12100,12 +12838,27 @@ int32 Unit::CalculateAOEAvoidance(int32 damage, uint32 schoolMask, ObjectGuid co\n float Unit::MeleeSpellMissChance(Unit const* victim, WeaponAttackType attType, int32 skillDiff, uint32 spellId) const\n {\n     SpellInfo const* spellInfo = spellId ? sSpellMgr->GetSpellInfo(spellId) : nullptr;\n+\n+    //npcbot: override spellInfo\n+    spellInfo = spellInfo ? spellInfo->TryGetSpellInfoOverride(this) : spellInfo;\n+    //end npcbot\n+\n     if (spellInfo && spellInfo->HasAttribute(SPELL_ATTR7_CANT_MISS))\n         return 0.f;\n \n     //calculate miss chance\n     float missChance = victim->GetUnitMissChance();\n \n+    //npcbot - custom miss chance instead of bunch of auras\n+    if (IsNPCBot())\n+    {\n+        if (!ToCreature()->CanMiss())\n+            return 0.f;\n+\n+        missChance += ToCreature()->GetCreatureMissChance();\n+    }\n+    //end npcbot\n+\n     // Check if dual wielding, add additional miss penalty - when mainhand has on next swing spell, offhand doesnt suffer penalty\n     if (!spellId && haveOffhandWeapon() && attType != RANGED_ATTACK && !m_currentSpells[CURRENT_MELEE_SPELL])\n         missChance += 19.0f;\n@@ -12162,6 +12915,11 @@ void Unit::SetPhaseMask(uint32 newPhaseMask, bool update)\n             if ((*itr)->GetTypeId() == TYPEID_UNIT)\n                 (*itr)->SetPhaseMask(newPhaseMask, true);\n \n+        //npcbot: update for temporarily uncontrolled bots (teleport, taxi)\n+        if (GetTypeId() == TYPEID_PLAYER)\n+            ToPlayer()->UpdatePhaseForBots();\n+        //end npcbot\n+\n         for (uint8 i = 0; i < MAX_SUMMON_SLOT; ++i)\n             if (!m_SummonSlot[i].IsEmpty())\n                 if (Creature* summon = GetMap()->GetCreature(m_SummonSlot[i]))\n@@ -12220,6 +12978,10 @@ float Unit::GetCombatRatingReduction(CombatRating cr) const\n {\n     if (Player const* player = ToPlayer())\n         return player->GetRatingBonusValue(cr);\n+    //npcbot: get bot resilience\n+    else if (GetTypeId() == TYPEID_UNIT && ToCreature()->IsNPCBotOrPet())\n+        return BotMgr::GetBotResilience(ToCreature());\n+    //end npcbot\n     // Player's pet get resilience from owner\n     else if (IsPet() && GetOwner())\n         if (Player* owner = GetOwner()->ToPlayer())\n@@ -12425,6 +13187,183 @@ uint32 Unit::GetModelForForm(ShapeshiftForm form, uint32 spellId) const\n                 break;\n         }\n     }\n+    else if (ToCreature() && ToCreature()->GetBotOwner() && ToCreature()->GetBotOwner()->ToPlayer())\n+    {\n+        //this has to be modified after implementation of bots' appearances which will include player bytes emulation\n+        Player const* player = ToCreature()->GetBotOwner();\n+        //let's make druids look according to player but base model must be selected based on our race\n+        switch (form)\n+        {\n+            case FORM_CAT:\n+                // Based on master's Hair color\n+                if (GetRace() == RACE_NIGHTELF)\n+                {\n+                    uint8 hairColor = player->GetByteValue(PLAYER_BYTES, 3);\n+                    switch (hairColor)\n+                    {\n+                        case 7: // Violet\n+                        case 8:\n+                            return 29405;\n+                        case 3: // Light Blue\n+                            return 29406;\n+                        case 0: // Green\n+                        case 1: // Light Green\n+                        case 2: // Dark Green\n+                            return 29407;\n+                        case 4: // White\n+                            return 29408;\n+                        default: // original - Dark Blue\n+                            return 892;\n+                    }\n+                }\n+                // Based on master's Skin color\n+                else if (GetRace() == RACE_TAUREN)\n+                {\n+                    uint8 skinColor = player->GetByteValue(PLAYER_BYTES, 0);\n+                    // Male master\n+                    if (GetGender() == GENDER_MALE)\n+                    {\n+                        switch (skinColor)\n+                        {\n+                            case 12: // White\n+                            case 13:\n+                            case 14:\n+                            case 18: // Completly White\n+                                return 29409;\n+                            case 9: // Light Brown\n+                            case 10:\n+                            case 11:\n+                                return 29410;\n+                            case 6: // Brown\n+                            case 7:\n+                            case 8:\n+                                return 29411;\n+                            case 0: // Dark\n+                            case 1:\n+                            case 2:\n+                            case 3: // Dark Grey\n+                            case 4:\n+                            case 5:\n+                                return 29412;\n+                            default: // original - Grey\n+                                return 8571;\n+                        }\n+                    }\n+                    // Female master\n+                    else switch (skinColor)\n+                    {\n+                        case 10: // White\n+                            return 29409;\n+                        case 6: // Light Brown\n+                        case 7:\n+                            return 29410;\n+                        case 4: // Brown\n+                        case 5:\n+                            return 29411;\n+                        case 0: // Dark\n+                        case 1:\n+                        case 2:\n+                        case 3:\n+                            return 29412;\n+                        default: // original - Grey\n+                            return 8571;\n+                    }\n+                }\n+                else if (Player::TeamForRace(GetRace()) == ALLIANCE)\n+                    return 892;\n+                else\n+                    return 8571;\n+            case FORM_DIREBEAR:\n+            case FORM_BEAR:\n+                // Based on Hair color\n+                if (GetRace() == RACE_NIGHTELF)\n+                {\n+                    uint8 hairColor = player->GetByteValue(PLAYER_BYTES, 3);\n+                    switch (hairColor)\n+                    {\n+                        case 0: // Green\n+                        case 1: // Light Green\n+                        case 2: // Dark Green\n+                            return 29413; // 29415?\n+                        case 6: // Dark Blue\n+                            return 29414;\n+                        case 4: // White\n+                            return 29416;\n+                        case 3: // Light Blue\n+                            return 29417;\n+                        default: // original - Violet\n+                            return 2281;\n+                    }\n+                }\n+                // Based on Skin color\n+                else if (GetRace() == RACE_TAUREN)\n+                {\n+                    uint8 skinColor = player->GetByteValue(PLAYER_BYTES, 0);\n+                    // Male\n+                    if (GetGender() == GENDER_MALE)\n+                    {\n+                        switch (skinColor)\n+                        {\n+                            case 0: // Dark (Black)\n+                            case 1:\n+                            case 2:\n+                                return 29418;\n+                            case 3: // White\n+                            case 4:\n+                            case 5:\n+                            case 12:\n+                            case 13:\n+                            case 14:\n+                                return 29419;\n+                            case 9: // Light Brown/Grey\n+                            case 10:\n+                            case 11:\n+                            case 15:\n+                            case 16:\n+                            case 17:\n+                                return 29420;\n+                            case 18: // Completly White\n+                                return 29421;\n+                            default: // original - Brown\n+                                return 2289;\n+                        }\n+                    }\n+                    // Female\n+                    else switch (skinColor)\n+                    {\n+                        case 0: // Dark (Black)\n+                        case 1:\n+                            return 29418;\n+                        case 2: // White\n+                        case 3:\n+                            return 29419;\n+                        case 6: // Light Brown/Grey\n+                        case 7:\n+                        case 8:\n+                        case 9:\n+                            return 29420;\n+                        case 10: // Completly White\n+                            return 29421;\n+                        default: // original - Brown\n+                            return 2289;\n+                    }\n+                }\n+                else if (Player::TeamForRace(GetRace()) == ALLIANCE)\n+                    return 2281;\n+                else\n+                    return 2289;\n+            case FORM_FLIGHT:\n+                if (Player::TeamForRace(GetRace()) == ALLIANCE)\n+                    return 20857;\n+                return 20872;\n+            case FORM_FLIGHT_EPIC:\n+                if (Player::TeamForRace(GetRace()) == ALLIANCE)\n+                    return 21243;\n+                return 21244;\n+            default:\n+                break;\n+        }\n+    }\n \n     uint32 modelid = 0;\n     SpellShapeshiftFormEntry const* formEntry = sSpellShapeshiftFormStore.LookupEntry(form);\n@@ -12923,6 +13862,11 @@ bool Unit::UpdatePosition(float x, float y, float z, float orientation, bool tel\n \n     UpdatePositionData();\n \n+    //npcbot: send bot group update\n+    if ((relocated || turn) && IsNPCBot())\n+        BotMgr::SetBotGroupUpdateFlag(ToCreature(), GROUP_UPDATE_FLAG_POSITION);\n+    //end npcbot\n+\n     _positionUpdateInfo.Relocated = relocated;\n     _positionUpdateInfo.Turned = turn;\n \n@@ -13113,6 +14057,19 @@ void Unit::StopAttackFaction(uint32 faction_id)\n \n     for (Unit* minion : m_Controlled)\n         minion->StopAttackFaction(faction_id);\n+\n+    //npcbot: stopattackfaction for bots\n+    if (GetTypeId() == TYPEID_PLAYER && ToPlayer()->HaveBot())\n+    {\n+        BotMap const* map = ToPlayer()->GetBotMgr()->GetBotMap();\n+        for (BotMap::const_iterator itr = map->begin(); itr != map->end(); ++itr)\n+        {\n+            itr->second->StopAttackFaction(faction_id);\n+            if (Unit* botPet = itr->second->GetBotsPet())\n+                botPet->StopAttackFaction(faction_id);\n+        }\n+    }\n+    //end npcbot\n }\n \n void Unit::OutDebugInfo() const\n@@ -13601,6 +14558,10 @@ void Unit::BuildValuesUpdate(uint8 updateType, ByteBuffer* data, Player const* t\n \n     if (plr && plr->IsInSameRaidWith(target))\n         visibleFlag |= UF_FLAG_PARTY_MEMBER;\n+    //npcbot\n+    else if (IsNPCBotOrPet() && IsInRaidWith(target))\n+        visibleFlag |= UF_FLAG_PARTY_MEMBER;\n+    //end npcbot\n \n     Creature const* creature = ToCreature();\n     for (uint16 index = 0; index < m_valuesCount; ++index)\n@@ -13620,6 +14581,11 @@ void Unit::BuildValuesUpdate(uint8 updateType, ByteBuffer* data, Player const* t\n                     if (!target->CanSeeSpellClickOn(creature))\n                         appendValue &= ~UNIT_NPC_FLAG_SPELLCLICK;\n \n+                //npcbot: make wandering bots non-interactive for non-GM players\n+                if ((appendValue & UNIT_NPC_FLAG_GOSSIP) && !target->IsGameMaster() && IsNPCBotOrPet() && creature->IsWandererBot())\n+                    appendValue &= ~UNIT_NPC_FLAG_GOSSIP;\n+                //end npcbot\n+\n                 fieldBuffer << uint32(appendValue);\n             }\n             else if (index == UNIT_FIELD_AURASTATE)\n@@ -13725,6 +14691,24 @@ void Unit::BuildValuesUpdate(uint8 updateType, ByteBuffer* data, Player const* t\n                     else\n                         fieldBuffer << m_uint32Values[index];\n                 }\n+                //npcbot\n+                else if (IsNPCBotOrPet() && IsInRaidWith(target))\n+                {\n+                    FactionTemplateEntry const* ft1 = GetFactionTemplateEntry();\n+                    FactionTemplateEntry const* ft2 = target->GetFactionTemplateEntry();\n+                    if (!ft1->IsFriendlyTo(*ft2))\n+                    {\n+                        if (index == UNIT_FIELD_BYTES_2)\n+                            // Allow targetting opposite faction in party when enabled in config\n+                            fieldBuffer << (m_uint32Values[UNIT_FIELD_BYTES_2] & ((UNIT_BYTE2_FLAG_SANCTUARY /*| UNIT_BYTE2_FLAG_AURAS | UNIT_BYTE2_FLAG_UNK5*/) << 8)); // this flag is at uint8 offset 1 !!\n+                        else\n+                            // pretend that all other HOSTILE players have own faction, to allow follow, heal, rezz (trade wont work)\n+                            fieldBuffer << uint32(target->GetFaction());\n+                    }\n+                    else\n+                        fieldBuffer << m_uint32Values[index];\n+                }\n+                //end npcbot\n                 else\n                     fieldBuffer << m_uint32Values[index];\n             }\ndiff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h\nindex 8af0ae4caf..f0c4c855f5 100644\n--- a/src/server/game/Entities/Unit/Unit.h\n+++ b/src/server/game/Entities/Unit/Unit.h\n@@ -317,7 +317,7 @@ struct PlayerMovementPendingChange\n     } knockbackInfo; // used if knockback\n };\n \n-enum CombatRating\n+enum CombatRating : uint8\n {\n     CR_WEAPON_SKILL             = 0,\n     CR_DEFENSE_SKILL            = 1,\n@@ -1258,6 +1258,14 @@ class TC_GAME_API Unit : public WorldObject\n         ObjectGuid GetCharmedGUID() const { return GetGuidValue(UNIT_FIELD_CHARM); }\n         Unit* GetCharmed() const { return m_charmed; }\n \n+        //npcbot\n+        void SetControlledByPlayer(bool set) { m_ControlledByPlayer = set; }\n+        GameObject* GetFirstGameObjectById(uint32 id) const;\n+        void SetCreator(Unit* creator);\n+        Unit* GetCreator() const { return m_creator; }\n+        Unit* m_creator = nullptr;\n+        //end npcbot\n+\n         bool IsControlledByPlayer() const { return m_ControlledByPlayer; }\n         Player* GetControllingPlayer() const;\n         ObjectGuid GetCharmerOrOwnerGUID() const override { return IsCharmed() ? GetCharmerGUID() : GetOwnerGUID(); }\n@@ -1832,6 +1840,11 @@ class TC_GAME_API Unit : public WorldObject\n \n         std::string GetDebugInfo() const override;\n \n+        //npcbot\n+        bool HasReactive(ReactiveType reactive) const { return m_reactiveTimer[reactive] > 0; }\n+        void ClearReactive(ReactiveType reactive);\n+        //end npcbot\n+\n     protected:\n         explicit Unit (bool isWorldObject);\n \ndiff --git a/src/server/game/Entities/Vehicle/Vehicle.cpp b/src/server/game/Entities/Vehicle/Vehicle.cpp\nindex e746cc0faf..2fafc2dbcc 100755\n--- a/src/server/game/Entities/Vehicle/Vehicle.cpp\n+++ b/src/server/game/Entities/Vehicle/Vehicle.cpp\n@@ -33,6 +33,10 @@\n #include \"Unit.h\"\n #include \"Util.h\"\n \n+//npcbot\n+#include \"botmgr.h\"\n+//end npcbot\n+\n Vehicle::Vehicle(Unit* unit, VehicleEntry const* vehInfo, uint32 creatureEntry) :\n UsableSeatNum(0), _me(unit), _vehicleInfo(vehInfo), _creatureEntry(creatureEntry), _status(STATUS_NONE)\n {\n@@ -512,10 +516,21 @@ Vehicle* Vehicle::RemovePassenger(Unit* unit)\n     if (seat->second.SeatInfo->Flags & VEHICLE_SEAT_FLAG_PASSENGER_NOT_SELECTABLE && !seat->second.Passenger.IsUninteractible)\n         unit->RemoveUnitFlag(UNIT_FLAG_UNINTERACTIBLE);\n \n+    //npcbot\n+    if (unit->GetTypeId() == TYPEID_UNIT && unit->ToCreature()->GetBotAI())\n+        BotMgr::OnBotExitVehicle(unit->ToCreature(), this);\n+    //end npcbot\n+\n     seat->second.Passenger.Reset();\n \n     if (_me->GetTypeId() == TYPEID_UNIT && unit->GetTypeId() == TYPEID_PLAYER && seat->second.SeatInfo->Flags & VEHICLE_SEAT_FLAG_CAN_CONTROL)\n+    {\n+        //npcbot\n+        if (unit->ToPlayer()->HaveBot())\n+            BotMgr::OnBotOwnerExitVehicle(unit->ToPlayer(), this);\n+        //end npcbot\n         _me->RemoveCharmedBy(unit);\n+    }\n \n     if (_me->IsInWorld())\n     {\n@@ -831,6 +846,16 @@ bool VehicleJoinEvent::Execute(uint64, uint32)\n             else\n                 Target->GetBase()->RemoveNpcFlag(UNIT_NPC_FLAG_SPELLCLICK);\n         }\n+        //npcbot: do not allow other passengers on bot vehicles\n+        if (Passenger->IsNPCBot()/* &&\n+            (Seat->second.SeatInfo->m_flags & VEHICLE_SEAT_FLAG_CAN_CONTROL)*/)\n+        {\n+            if (Target->GetBase()->GetTypeId() == TYPEID_PLAYER)\n+                Target->GetBase()->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_PLAYER_VEHICLE);\n+            else\n+                Target->GetBase()->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK);\n+        }\n+        //end npcbot\n     }\n \n     Passenger->InterruptNonMeleeSpells(false);\n@@ -856,6 +881,14 @@ bool VehicleJoinEvent::Execute(uint64, uint32)\n         player->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_NOT_SEATED);\n     }\n \n+    //npcbot\n+    if (Creature* bot = Passenger->ToCreature())\n+    {\n+        if (Battleground* bg = bot->GetBotBG())\n+            bg->EventBotDroppedFlag(bot);\n+    }\n+    //end npcbot\n+\n     if (veSeat->HasFlag(VEHICLE_SEAT_FLAG_PASSENGER_NOT_SELECTABLE))\n         Passenger->SetUnitFlag(UNIT_FLAG_UNINTERACTIBLE);\n \n@@ -870,6 +903,11 @@ bool VehicleJoinEvent::Execute(uint64, uint32)\n     Passenger->m_movementInfo.transport.seat = Seat->first;\n     Passenger->m_movementInfo.transport.guid = Target->GetBase()->GetGUID();\n \n+    //npcbot\n+    if (Passenger->GetTypeId() == TYPEID_UNIT && Passenger->ToCreature()->GetBotAI())\n+        BotMgr::OnBotEnterVehicle(Passenger->ToCreature(), Target);\n+    //end npcbot\n+\n     if (Target->GetBase()->GetTypeId() == TYPEID_UNIT && Passenger->GetTypeId() == TYPEID_PLAYER &&\n         veSeat->HasFlag(VEHICLE_SEAT_FLAG_CAN_CONTROL))\n     {\n@@ -880,6 +918,10 @@ bool VehicleJoinEvent::Execute(uint64, uint32)\n             Abort(0);\n             return true;\n         }\n+        //npcbot\n+        if (Passenger->ToPlayer()->HaveBot())\n+            BotMgr::OnBotOwnerEnterVehicle(Passenger->ToPlayer(), Target);\n+        //end npcbot\n     }\n \n     Passenger->SendClearTarget();                            // SMSG_BREAK_TARGET\ndiff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp\nindex 01555141b3..a86b096786 100644\n--- a/src/server/game/Globals/ObjectMgr.cpp\n+++ b/src/server/game/Globals/ObjectMgr.cpp\n@@ -57,6 +57,10 @@\n #include \"Vehicle.h\"\n #include \"World.h\"\n \n+//npcbot\n+#include \"botdatamgr.h\"\n+//end npcbot\n+\n ScriptMapMap sEventScripts;\n ScriptMapMap sWaypointScripts;\n \n@@ -1211,6 +1215,11 @@ void ObjectMgr::CheckCreatureTemplate(CreatureTemplate const* cInfo)\n         const_cast<CreatureTemplate*>(cInfo)->expansion = 0;\n     }\n \n+    //npcbot: skip flags check and damage multiplier\n+    if (cInfo->IsNPCBotOrPet())\n+        return;\n+    //end npcbot\n+\n     if (uint32 badFlags = (cInfo->flags_extra & ~CREATURE_FLAG_EXTRA_DB_ALLOWED))\n     {\n         TC_LOG_ERROR(\"sql.sql\", \"Table `creature_template` lists creature (Entry: {}) with disallowed `flags_extra` {}, removing incorrect flag.\", cInfo->Entry, badFlags);\n@@ -8943,6 +8952,82 @@ SkillRangeType GetSkillRangeType(SkillRaceClassInfoEntry const* rcEntry)\n     return SKILL_RANGE_LEVEL;\n }\n \n+void ObjectMgr::LoadCreatureOutfits()\n+{\n+    uint32 oldMSTime = getMSTime();\n+\n+    _creatureOutfitStore.clear();                           // for reload case (test only)\n+\n+    //                                                 0     1      2      3     4     5       6           7\n+    QueryResult result = WorldDatabase.Query(\"SELECT entry, race, gender, skin, face, hair, haircolor, facialhair, \"\n+        //8       9        10    11     12     13    14     15     16     17     18\n+        \"head, shoulders, body, chest, waist, legs, feet, wrists, hands, back, tabard FROM creature_template_outfits\");\n+\n+    if (!result)\n+    {\n+        TC_LOG_ERROR(\"server.loading\", \">> Loaded 0 creature outfits. DB table `creature_template_outfits` is empty!\");\n+        return;\n+    }\n+\n+    uint32 count = 0;\n+\n+    do\n+    {\n+        Field* fields = result->Fetch();\n+\n+        uint32 i = 0;\n+        uint32 entry     = fields[i++].GetUInt32();\n+\n+        if (!GetCreatureTemplate(entry))\n+        {\n+            TC_LOG_ERROR(\"server.loading\", \">> Creature entry {} in `creature_template_outfits`, but not in `creature_template`!\", entry);\n+            continue;\n+        }\n+\n+        CreatureOutfit co; // const, shouldnt be changed after saving\n+        co.race          = fields[i++].GetUInt8();\n+        ChrRacesEntry const* rEntry = sChrRacesStore.LookupEntry(co.race);\n+        if (!rEntry)\n+        {\n+            TC_LOG_ERROR(\"server.loading\", \">> Creature entry {} in `creature_template_outfits` has incorrect race ({}).\", entry, uint32(co.race));\n+            continue;\n+        }\n+        co.gender        = fields[i++].GetUInt8();\n+        // Set correct displayId\n+        switch (co.gender)\n+        {\n+            case GENDER_FEMALE:\n+                _creatureTemplateStore[entry].Modelid1 = rEntry->FemaleDisplayID;\n+                break;\n+            case GENDER_MALE:\n+                _creatureTemplateStore[entry].Modelid1 = rEntry->MaleDisplayID;\n+                break;\n+            default:\n+                TC_LOG_ERROR(\"server.loading\", \">> Creature entry {} in `creature_template_outfits` has invalid gender {}\", entry, uint32(co.gender));\n+                continue;\n+        }\n+        _creatureTemplateStore[entry].Modelid2 = 0;\n+        _creatureTemplateStore[entry].Modelid3 = 0;\n+        _creatureTemplateStore[entry].Modelid4 = 0;\n+        _creatureTemplateStore[entry].unit_flags2 |= UNIT_FLAG2_MIRROR_IMAGE; // Needed so client requests mirror packet\n+\n+        co.skin          = fields[i++].GetUInt8();\n+        co.face          = fields[i++].GetUInt8();\n+        co.hair          = fields[i++].GetUInt8();\n+        co.haircolor     = fields[i++].GetUInt8();\n+        co.facialhair    = fields[i++].GetUInt8();\n+        for (uint32 j = 0; j != MAX_CREATURE_OUTFIT_DISPLAYS; ++j)\n+            co.outfit[j] = fields[i+j].GetUInt32();\n+\n+        _creatureOutfitStore[entry] = co;\n+\n+        ++count;\n+    }\n+    while (result->NextRow());\n+\n+    TC_LOG_INFO(\"server.loading\", \">> Loaded {} creature outfits in {} ms\", count, GetMSTimeDiffToNow(oldMSTime));\n+}\n+\n void ObjectMgr::LoadGameTele()\n {\n     uint32 oldMSTime = getMSTime();\n@@ -10202,6 +10287,18 @@ GameObjectOverride const* ObjectMgr::GetGameObjectOverride(ObjectGuid::LowType s\n \n CreatureTemplate const* ObjectMgr::GetCreatureTemplate(uint32 entry) const\n {\n+    //npcbot: try fetch custom creature template\n+    if (entry >= BOT_ENTRY_CREATE_BEGIN)\n+    {\n+        if (CreatureTemplate const* extra_template = BotDataMgr::GetBotExtraCreatureTemplate(entry))\n+        {\n+            //custom creature template should only exist in custom container\n+            ASSERT_NODEBUGINFO(_creatureTemplateStore.find(entry) == _creatureTemplateStore.end());\n+            return extra_template;\n+        }\n+    }\n+    //end npcbot\n+\n     return Trinity::Containers::MapGetValuePtr(_creatureTemplateStore, entry);\n }\n \ndiff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h\nindex aada65ed91..db9549b803 100644\n--- a/src/server/game/Globals/ObjectMgr.h\n+++ b/src/server/game/Globals/ObjectMgr.h\n@@ -169,6 +169,21 @@ struct GameTele\n \n typedef std::unordered_map<uint32, GameTele> GameTeleContainer;\n \n+#define MAX_CREATURE_OUTFIT_DISPLAYS 11\n+struct CreatureOutfit\n+{\n+    uint8 race;\n+    uint8 gender;\n+    uint8 face;\n+    uint8 skin;\n+    uint8 hair;\n+    uint8 facialhair;\n+    uint8 haircolor;\n+    uint32 outfit[MAX_CREATURE_OUTFIT_DISPLAYS];\n+};\n+\n+typedef std::unordered_map<uint32, CreatureOutfit > CreatureOutfitContainer;\n+\n enum ScriptsType\n {\n     SCRIPTS_FIRST = 1,\n@@ -1218,6 +1233,8 @@ class TC_GAME_API ObjectMgr\n \n         void LoadNPCSpellClickSpells();\n \n+        void LoadCreatureOutfits();\n+\n         void LoadGameTele();\n \n         void LoadGossipMenu();\n@@ -1474,6 +1491,8 @@ class TC_GAME_API ObjectMgr\n         bool AddGameTele(GameTele& data);\n         bool DeleteGameTele(std::string_view name);\n \n+        CreatureOutfitContainer const& GetCreatureOutfitMap() const { return _creatureOutfitStore; }\n+\n         Trainer::Trainer const* GetTrainer(uint32 creatureId) const;\n         std::vector<Trainer::Trainer const*> const& GetClassTrainers(uint8 classId) const { return _classTrainers.at(classId); }\n \n@@ -1629,6 +1648,8 @@ class TC_GAME_API ObjectMgr\n         PageTextContainer _pageTextStore;\n         InstanceTemplateContainer _instanceTemplateStore;\n \n+        CreatureOutfitContainer _creatureOutfitStore;\n+\n     private:\n         void LoadScripts(ScriptsType type);\n         void LoadQuestRelationsHelper(QuestRelations& map, std::string const& table);\ndiff --git a/src/server/game/Grids/Notifiers/GridNotifiers.h b/src/server/game/Grids/Notifiers/GridNotifiers.h\nindex 3a2cf3d2d8..a46c0f8a08 100644\n--- a/src/server/game/Grids/Notifiers/GridNotifiers.h\n+++ b/src/server/game/Grids/Notifiers/GridNotifiers.h\n@@ -890,6 +890,10 @@ namespace Trinity\n                     player = u->ToPlayer();\n                 else if (u->IsPet() && u->GetOwner())\n                     player = u->GetOwner()->ToPlayer();\n+                //npcbot: find bot owner\n+                else if (u->GetTypeId() == TYPEID_UNIT && u->ToCreature()->IsNPCBotOrPet() && !u->ToCreature()->IsFreeBot())\n+                    player = u->ToCreature()->GetBotOwner();\n+                //end npcbot\n \n                 if (!player)\n                     return false;\ndiff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp\nindex c9993f95f4..0bdae7505a 100644\n--- a/src/server/game/Groups/Group.cpp\n+++ b/src/server/game/Groups/Group.cpp\n@@ -42,6 +42,11 @@\n #include \"WorldPacket.h\"\n #include \"WorldSession.h\"\n \n+//npcbot\n+#include \"botdatamgr.h\"\n+#include \"botmgr.h\"\n+//end npcbot\n+\n Roll::Roll(ObjectGuid _guid, LootItem const& li) : itemGUID(_guid), itemid(li.itemid),\n itemRandomPropId(li.randomPropertyId), itemRandomSuffix(li.randomSuffix), itemCount(li.count),\n totalPlayersRolling(0), totalNeed(0), totalGreed(0), totalPass(0), itemSlot(0),\n@@ -148,6 +153,37 @@ void Group::SelectNewPartyOrRaidLeader()\n     }\n }\n \n+//npcbot\n+bool Group::Create(Creature* leader)\n+{\n+    ASSERT(isBGGroup());\n+\n+    ObjectGuid leaderGuid = leader->GetGUID();\n+\n+    m_guid = ObjectGuid::Create<HighGuid::Group>(sGroupMgr->GenerateGroupId());\n+    m_leaderGuid = leaderGuid;\n+    m_leaderName = leader->GetName();\n+\n+    m_groupType = GROUPTYPE_BGRAID;\n+\n+    _initRaidSubGroupsCounter();\n+\n+    m_lootMethod = FREE_FOR_ALL;\n+\n+    m_lootThreshold = ITEM_QUALITY_UNCOMMON;\n+    m_looterGuid = leaderGuid;\n+    m_masterLooterGuid.Clear();\n+\n+    m_dungeonDifficulty = DUNGEON_DIFFICULTY_NORMAL;\n+    m_raidDifficulty = RAID_DIFFICULTY_10MAN_NORMAL;\n+\n+    if (!AddMember(leader))\n+        return false;\n+\n+    return true;\n+}\n+//end npcbot\n+\n bool Group::Create(Player* leader)\n {\n     ObjectGuid leaderGuid = leader->GetGUID();\n@@ -282,6 +318,37 @@ void Group::LoadMemberFromDB(ObjectGuid::LowType guidLow, uint8 memberFlags, uin\n     sLFGMgr->SetupGroupMember(member.guid, GetGUID());\n }\n \n+//npcbot\n+void Group::LoadCreatureMemberFromDB(uint32 entry, uint8 memberFlags, uint8 subgroup, uint8 roles)\n+{\n+    MemberSlot member;\n+    member.guid = BotDataMgr::GetNPCBotGuid(entry);\n+\n+    // skip non-existed bot\n+    if (member.guid == ObjectGuid::Empty)\n+    {\n+        CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_NPCBOT_GROUP_MEMBER);\n+        stmt->setUInt32(0, entry);\n+        CharacterDatabase.Execute(stmt);\n+        return;\n+    }\n+\n+    CreatureTemplate const* ct = sObjectMgr->GetCreatureTemplate(entry);\n+    ASSERT(ct);\n+\n+    member.name = ct->Name;\n+    member.group = subgroup;\n+    member.flags = memberFlags;\n+    member.roles = roles;\n+\n+    m_memberSlots.push_back(member);\n+\n+    SubGroupCounterIncrease(subgroup);\n+\n+    //sLFGMgr->SetupGroupMember(member.guid, GetGUID());\n+}\n+//end npcbot\n+\n void Group::ConvertToLFG()\n {\n     m_groupType = GroupType(m_groupType | GROUPTYPE_LFG | GROUPTYPE_LFG_RESTRICTED);\n@@ -392,6 +459,76 @@ Player* Group::GetInvited(const std::string& name) const\n     return nullptr;\n }\n \n+//npcbot\n+bool Group::AddMember(Creature* creature)\n+{\n+    // Get first not-full group\n+    uint8 subGroup = 0;\n+    if (m_subGroupsCounts)\n+    {\n+        bool groupFound = false;\n+        for (; subGroup < MAX_RAID_SUBGROUPS; ++subGroup)\n+        {\n+            if (m_subGroupsCounts[subGroup] < MAX_GROUP_SIZE)\n+            {\n+                groupFound = true;\n+                break;\n+            }\n+        }\n+        // We are raid group and no one slot is free\n+        if (!groupFound)\n+            return false;\n+    }\n+\n+    MemberSlot member;\n+    member.guid      = creature->GetGUID();\n+    member.name      = creature->GetName();\n+    member.group     = subGroup;\n+    member.flags     = 0;\n+    member.roles     = 0;\n+    m_memberSlots.push_back(member);\n+\n+    SubGroupCounterIncrease(subGroup);\n+\n+    if (creature->GetBotGroup())\n+    {\n+        if (isBGGroup() || isBFGroup()) // if player is in group and he is being added to BG raid group, then call SetBattlegroundRaid()\n+            creature->SetBattlegroundOrBattlefieldRaid(this, subGroup);\n+        else //if player is in bg raid and we are adding him to normal group, then call SetOriginalGroup()\n+            creature->SetOriginalGroup(this, subGroup);\n+    }\n+    else //if player is not in group, then call set group\n+        creature->SetBotGroup(this, subGroup);\n+\n+    if (!isRaidGroup())\n+    {\n+        for (uint8 i = 0; i < TARGET_ICONS_COUNT; ++i)\n+            m_targetIcons[i].Clear();\n+    }\n+\n+    // insert into the table if we're not a battleground group\n+    if (!isBGGroup() && !isBFGroup())\n+    {\n+        //INSERT INTO characters_npcbot_group_member (guid, entry, memberFlags, subgroup, roles) VALUES(?, ?, ?, ?, ?), CONNECTION_ASYNC\n+        CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_NPCBOT_GROUP_MEMBER);\n+        stmt->setUInt32(0, m_dbStoreId);\n+        stmt->setUInt32(1, member.guid.GetEntry());\n+        stmt->setUInt8(2, member.flags);\n+        stmt->setUInt8(3, member.group);\n+        stmt->setUInt8(4, member.roles);\n+        CharacterDatabase.Execute(stmt);\n+    }\n+\n+    SendUpdate();\n+    sScriptMgr->OnGroupAddMember(this, creature->GetGUID());\n+\n+    BotMgr::SetBotGroupUpdateFlag(creature, GROUP_UPDATE_FULL);\n+    UpdateBotOutOfRange(creature);\n+\n+    return true;\n+}\n+//end npcbot\n+\n bool Group::AddMember(Player* player)\n {\n     // Get first not-full group\n@@ -532,6 +669,11 @@ bool Group::AddMember(Player* player)\n     if (m_maxEnchantingLevel < player->GetSkillValue(SKILL_ENCHANTING))\n         m_maxEnchantingLevel = player->GetSkillValue(SKILL_ENCHANTING);\n \n+    //npcbot: if player has been added to bot BG raid switch leader to it\n+    if (!m_leaderGuid.IsPlayer())\n+        ChangeLeader(player->GetGUID());\n+    //end npcbot\n+\n     return true;\n }\n \n@@ -541,6 +683,74 @@ bool Group::RemoveMember(ObjectGuid guid, RemoveMethod const& method /*= GROUP_R\n \n     sScriptMgr->OnGroupRemoveMember(this, guid, method, kicker, reason);\n \n+    //npcbot: skip group size check before removing a bot\n+    if (guid.IsCreature())\n+    {\n+        // LFG group vote kick handled in scripts\n+        if (isLFGGroup() && method == GROUP_REMOVEMETHOD_KICK)\n+            return !m_memberSlots.empty();\n+\n+        if (GetMembersCount() > ((isBGGroup() || isLFGGroup() || isBFGroup()) ? 1u : 2u))\n+        {\n+            if (Creature const* cbot = BotDataMgr::FindBot(guid.GetEntry()))\n+            {\n+                Creature* bot = const_cast<Creature*>(cbot);\n+                if (isBGGroup() || isBFGroup())\n+                    bot->RemoveFromBattlegroundOrBattlefieldRaid();\n+                else\n+                {\n+                    if (bot->GetOriginalGroup() == this)\n+                        bot->SetOriginalGroup(nullptr);\n+                    else\n+                        bot->SetBotGroup(nullptr);\n+                }\n+            }\n+\n+            // Remove bot from group in DB\n+            if (!isBGGroup() && !isBFGroup())\n+            {\n+                //DELETE FROM characters_npcbot_group_member WHERE entry = ?, CONNECTION_ASYNC\n+                CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_NPCBOT_GROUP_MEMBER);\n+                stmt->setUInt32(0, guid.GetEntry());\n+                CharacterDatabase.Execute(stmt);\n+                DelinkBotMember(guid);\n+            }\n+\n+            // Update subgroup\n+            member_witerator slot = _getMemberWSlot(guid);\n+            if (slot != m_memberSlots.end())\n+            {\n+                SubGroupCounterDecrease(slot->group);\n+                m_memberSlots.erase(slot);\n+            }\n+\n+            SendUpdate();\n+\n+            // do not disband raid group if bot owner logging out within dungeon\n+            // 1-player raid groups will not happen unless player is gm - bots will rejoin at login\n+            if (GetMembersCount() < 2 && isRaidGroup() && !(isBGGroup() || isBFGroup()) && !GetLeaderGUID().IsEmpty())\n+            {\n+                Player const* player = ObjectAccessor::FindPlayer(GetLeaderGUID());\n+                Map const* map = player ? player->FindMap() : nullptr;\n+                if (!(map && map->IsDungeon() && player && player->GetSession()->PlayerLogout()))\n+                    Disband();\n+            }\n+            else if (GetMembersCount() < ((isBGGroup() || isLFGGroup() || isBFGroup()) ? 1u : 2u))\n+            {\n+                Disband();\n+                return false;\n+            }\n+\n+            return true;\n+        }\n+        else\n+        {\n+            Disband();\n+            return false;\n+        }\n+    }\n+    //end npcbot\n+\n     Player* player = ObjectAccessor::FindConnectedPlayer(guid);\n     if (player)\n     {\n@@ -689,6 +899,9 @@ bool Group::RemoveMember(ObjectGuid guid, RemoveMethod const& method /*= GROUP_R\n         }\n \n         if (m_memberMgr.getSize() < ((isLFGGroup() || isBGGroup()) ? 1u : 2u))\n+        //npcbot: prevent group from being disbanded due to checking only players count\n+        if (GetMembersCount() < ((isLFGGroup() || isBGGroup()) ? 1u : 2u))\n+        //end npcbot\n             Disband();\n \n         return true;\n@@ -813,6 +1026,26 @@ void Group::Disband(bool hideDestroy /* = false */)\n     Player* player;\n     for (member_citerator citr = m_memberSlots.begin(); citr != m_memberSlots.end(); ++citr)\n     {\n+        //npcbot: set bot's group\n+        if (citr->guid.IsCreature())\n+        {\n+            if (Creature const* cbot = BotDataMgr::FindBot(citr->guid.GetEntry()))\n+            {\n+                Creature* bot = const_cast<Creature*>(cbot);\n+                if (isBGGroup() || isBFGroup())\n+                    bot->RemoveFromBattlegroundOrBattlefieldRaid();\n+                else\n+                {\n+                    if (bot->GetOriginalGroup() == this)\n+                        bot->SetOriginalGroup(nullptr);\n+                    else\n+                        bot->SetBotGroup(nullptr);\n+                }\n+            }\n+            continue;\n+        }\n+        //end npcbot\n+\n         player = ObjectAccessor::FindConnectedPlayer(citr->guid);\n         if (!player)\n             continue;\n@@ -891,6 +1124,12 @@ void Group::Disband(bool hideDestroy /* = false */)\n         stmt->setUInt32(0, m_dbStoreId);\n         trans->Append(stmt);\n \n+        //npcbot: bot members deletion\n+        stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_NPCBOT_GROUP_MEMBER_ALL);\n+        stmt->setUInt32(0, m_dbStoreId);\n+        trans->Append(stmt);\n+        //end npcbot\n+\n         CharacterDatabase.CommitTransaction(trans);\n \n         ResetInstances(INSTANCE_RESET_GROUP_DISBAND, false, nullptr);\n@@ -1064,6 +1303,11 @@ bool CanRollOnItem(const LootItem& item, Player const* player)\n \n void Group::GroupLoot(Loot* loot, WorldObject* pLootedObject)\n {\n+    //npcbot\n+    if (m_memberMgr.getSize() <= 1)\n+        return;\n+    //end npcbot\n+\n     std::vector<LootItem>::iterator i;\n     ItemTemplate const* item;\n     uint8 itemSlot = 0;\n@@ -1219,6 +1463,11 @@ void Group::GroupLoot(Loot* loot, WorldObject* pLootedObject)\n \n void Group::NeedBeforeGreed(Loot* loot, WorldObject* lootedObject)\n {\n+    //npcbot\n+    if (m_memberMgr.getSize() <= 1)\n+        return;\n+    //end npcbot\n+\n     ItemTemplate const* item;\n     uint8 itemSlot = 0;\n     for (std::vector<LootItem>::iterator i = loot->items.begin(); i != loot->items.end(); ++i, ++itemSlot)\n@@ -1666,6 +1915,36 @@ void Group::SetTargetIcon(uint8 id, ObjectGuid whoGuid, ObjectGuid targetGuid)\n \n     m_targetIcons[id] = targetGuid;\n \n+    //npcbot: name cache\n+    bool need_cache_name = false;\n+    Player const* setter = nullptr;\n+    for (GroupReference const* itr = GetFirstMember(); itr != nullptr; itr = itr->next())\n+    {\n+        if (itr->GetSource())\n+        {\n+            if (!need_cache_name && itr->GetSource()->GetBotMgr())\n+                need_cache_name = true;\n+            if (!setter && itr->GetSource()->GetGUID() == whoGuid)\n+                setter = itr->GetSource();\n+        }\n+\n+        if (need_cache_name && setter)\n+            break;\n+    }\n+\n+    if (need_cache_name && setter)\n+    {\n+        Unit const* newtarget = !targetGuid.IsEmpty() ? ObjectAccessor::GetUnit(*setter, targetGuid) : nullptr;\n+        std::string_view newname = newtarget ? std::string_view{ newtarget->GetName() } : std::string_view{ \"\" };\n+        for (GroupReference const* itr = GetFirstMember(); itr != nullptr; itr = itr->next())\n+        {\n+            Player const* member = itr->GetSource();\n+            if (member && member->GetBotMgr())\n+                member->GetBotMgr()->UpdateTargetIconName(id, newname);\n+        }\n+    }\n+    //end npcbot\n+\n     WorldPacket data(MSG_RAID_TARGET_UPDATE, (1+8+1+8));\n     data << uint8(0);                                       // set targets\n     data << whoGuid;\n@@ -1708,6 +1987,11 @@ void Group::SendUpdate()\n \n void Group::SendUpdateToPlayer(Player const* player, MemberSlot const* slot /*= nullptr*/)\n {\n+    //npcbot\n+    if (!player || !player->GetGUID().IsPlayer())\n+        return;\n+    //end npcbot\n+\n     if (player->GetGroup() != this)\n     {\n         if (player->GetOriginalGroup() == this)\n@@ -1751,6 +2035,10 @@ void Group::SendUpdateToPlayer(Player const* player, MemberSlot const* slot /*=\n         uint8 onlineState = (member && !member->GetSession()->PlayerLogout()) ? MEMBER_STATUS_ONLINE : MEMBER_STATUS_OFFLINE;\n         onlineState = onlineState | ((isBGGroup() || isBFGroup()) ? MEMBER_STATUS_PVP : 0);\n \n+        //npcbot: bots are always online\n+        onlineState |= citr->guid.IsCreature() ? 1 : 0;\n+        //end npcbot\n+\n         data << citr->name;\n         data << citr->guid;                             // guid\n         data << uint8(onlineState);                     // online-state\n@@ -1788,6 +2076,24 @@ void Group::SendOriginalGroupUpdateToPlayer(Player const* player) const\n     player->SendDirectMessage(&data);\n }\n \n+//npcbot\n+void Group::UpdateBotOutOfRange(Creature* creature)\n+{\n+    if (!creature || !creature->IsInWorld() || m_memberMgr.isEmpty())\n+        return;\n+\n+    WorldPacket data;\n+    BotMgr::BuildBotPartyMemberStatsChangedPacket(creature, &data);\n+\n+    for (GroupReference* itr = GetFirstMember(); itr != nullptr; itr = itr->next())\n+    {\n+        Player const*member = itr->GetSource();\n+        if (member/* && (!member->IsInMap(creature) || !member->IsWithinDist(creature, member->GetSightRange(), false))*/)\n+            member->SendDirectMessage(&data);\n+    }\n+}\n+//end npcbot\n+\n void Group::UpdatePlayerOutOfRange(Player* player)\n {\n     if (!player || !player->IsInWorld())\n@@ -1796,10 +2102,9 @@ void Group::UpdatePlayerOutOfRange(Player* player)\n     WorldPacket data;\n     player->GetSession()->BuildPartyMemberStatsChangedPacket(player, &data);\n \n-    Player* member;\n     for (GroupReference* itr = GetFirstMember(); itr != nullptr; itr = itr->next())\n     {\n-        member = itr->GetSource();\n+        Player const* member = itr->GetSource();\n         if (member && member != player && (!member->IsInMap(player) || !member->IsWithinDist(player, member->GetSightRange(), false)))\n             member->SendDirectMessage(&data);\n     }\n@@ -1915,6 +2220,24 @@ void Group::ChangeMembersGroup(ObjectGuid guid, uint8 group)\n         CharacterDatabase.Execute(stmt);\n     }\n \n+    //npcbot\n+    if (guid.IsCreature())\n+    {\n+        Creature const* cbot = BotDataMgr::FindBot(guid.GetEntry());\n+        if (Creature* bot = cbot ? const_cast<Creature*>(cbot) : nullptr)\n+        {\n+            if (bot->GetBotGroup() == this)\n+                bot->SetOriginalSubGroup(group);\n+            else\n+            {\n+                // If player is in BG raid, it is possible that he is also in normal raid - and that normal raid is stored in m_originalGroup reference\n+                prevSubGroup = bot->GetOriginalSubGroup();\n+                bot->SetOriginalSubGroup(group);\n+            }\n+        }\n+    }\n+    else\n+    //end npcbot\n     // In case the moved player is online, update the player object with the new sub group references\n     if (Player* player = ObjectAccessor::FindConnectedPlayer(guid))\n     {\n@@ -2084,6 +2407,14 @@ GroupJoinBattlegroundResult Group::CanJoinBattlegroundQueue(Battleground const*\n \n     errorGuid = ObjectGuid::Empty;\n \n+    //npcbot\n+    for (GroupBotReference const* bitr = GetFirstBotMember(); bitr != nullptr; bitr = bitr->next(), ++memberscount)\n+    {\n+        if (!bitr->GetSource())\n+            return ERR_BATTLEGROUND_JOIN_FAILED;\n+    }\n+    //end npcbot\n+\n     // only check for MinPlayerCount since MinPlayerCount == MaxPlayerCount for arenas...\n     if (bgOrTemplate->isArena() && memberscount != MinPlayerCount)\n         return ERR_ARENA_TEAM_PARTY_SIZE;\n@@ -2597,12 +2928,26 @@ void Group::SetGroupMemberFlag(ObjectGuid guid, bool apply, GroupMemberFlags fla\n     ToggleGroupMemberFlag(slot, flag, apply);\n \n     // Preserve the new setting in the db\n+    //npcbot\n+    if (!guid.IsPlayer())\n+    {\n+        CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_NPCBOT_GROUP_MEMBER_FLAG);\n+        stmt->setUInt8(0, slot->flags);\n+        stmt->setUInt32(1, guid.GetEntry());\n+        CharacterDatabase.Execute(stmt);\n+    }\n+    else\n+    {\n+    //end npcbot\n     CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_GROUP_MEMBER_FLAG);\n \n     stmt->setUInt8(0, slot->flags);\n     stmt->setUInt32(1, guid.GetCounter());\n \n     CharacterDatabase.Execute(stmt);\n+    //npcbot\n+    }\n+    //end npcbot\n \n     // Broadcast the changes to the group\n     SendUpdate();\n@@ -2657,6 +3002,28 @@ void Group::DelinkMember(ObjectGuid guid)\n     }\n }\n \n+//npcbot\n+void Group::LinkBotMember(GroupBotReference* bRef)\n+{\n+    m_botMemberMgr.insertFirst(bRef);\n+}\n+\n+void Group::DelinkBotMember(ObjectGuid guid)\n+{\n+    GroupBotReference* ref = m_botMemberMgr.getFirst();\n+    while (ref)\n+    {\n+        GroupBotReference* nextRef = ref->next();\n+        if (ref->GetSource()->GetGUID() == guid)\n+        {\n+            ref->unlink();\n+            break;\n+        }\n+        ref = nextRef;\n+    }\n+}\n+//end npcbot\n+\n Group::BoundInstancesMap& Group::GetBoundInstances(Difficulty difficulty)\n {\n     return m_boundInstances[difficulty];\ndiff --git a/src/server/game/Groups/Group.h b/src/server/game/Groups/Group.h\nindex ac00ffeab2..b425ba6c86 100644\n--- a/src/server/game/Groups/Group.h\n+++ b/src/server/game/Groups/Group.h\n@@ -192,6 +192,16 @@ class TC_GAME_API Group\n         bool Create(Player* leader);\n         void LoadGroupFromDB(Field* field);\n         void LoadMemberFromDB(ObjectGuid::LowType guidLow, uint8 memberFlags, uint8 subgroup, uint8 roles);\n+        //npcbot\n+        bool Create(Creature* leader);\n+        bool AddMember(Creature* creature);\n+        void LoadCreatureMemberFromDB(uint32 entry, uint8 memberFlags, uint8 subgroup, uint8 roles);\n+        void UpdateBotOutOfRange(Creature* creature);\n+        void LinkBotMember(GroupBotReference* bRef);\n+        void DelinkBotMember(ObjectGuid guid);\n+        GroupBotReference* GetFirstBotMember() { return m_botMemberMgr.getFirst(); }\n+        GroupBotReference const* GetFirstBotMember() const { return m_botMemberMgr.getFirst(); }\n+        //end npcbot\n         bool AddInvite(Player* player);\n         void RemoveInvite(Player* player);\n         void RemoveAllInvites();\n@@ -339,6 +349,10 @@ class TC_GAME_API Group\n         // FG: evil hacks\n         void BroadcastGroupUpdate(void);\n \n+        //npcbots\n+        ObjectGuid const* GetTargetIcons() const { return m_targetIcons; }\n+        //end npcbots\n+\n         Trinity::unique_weak_ptr<Group> GetWeakPtr() const { return m_scriptRef; }\n \n     protected:\n@@ -354,6 +368,9 @@ class TC_GAME_API Group\n \n         MemberSlotList      m_memberSlots;\n         GroupRefManager     m_memberMgr;\n+        //npcbot\n+        GroupBotRefManager  m_botMemberMgr;\n+        //end npcbot\n         InvitesList         m_invitees;\n         ObjectGuid          m_leaderGuid;\n         std::string         m_leaderName;\ndiff --git a/src/server/game/Groups/GroupMgr.cpp b/src/server/game/Groups/GroupMgr.cpp\nindex 9ed564537b..2ae20a1989 100644\n--- a/src/server/game/Groups/GroupMgr.cpp\n+++ b/src/server/game/Groups/GroupMgr.cpp\n@@ -133,7 +133,14 @@ void GroupMgr::LoadGroups()\n         // Delete all groups whose leader does not exist\n         CharacterDatabase.DirectExecute(\"DELETE FROM `groups` WHERE leaderGuid NOT IN (SELECT guid FROM characters)\");\n         // Delete all groups with less than 2 members\n+        //npcbot: adjust this\n+        /*\n+        //end npcbot\n         CharacterDatabase.DirectExecute(\"DELETE FROM `groups` WHERE guid NOT IN (SELECT guid FROM group_member GROUP BY guid HAVING COUNT(guid) > 1)\");\n+        //npcbot\n+        */\n+        CharacterDatabase.DirectExecute(\"DELETE FROM `groups` WHERE guid NOT IN (SELECT guid from group_member GROUP BY guid HAVING (SELECT (SELECT COUNT(guid) FROM group_member) + (SELECT COUNT(guid) FROM characters_npcbot_group_member)) > 1)\");\n+        //end npcbot\n \n         //                                                        0              1           2             3                 4      5          6      7         8       9\n         QueryResult result = CharacterDatabase.Query(\"SELECT g.leaderGuid, g.lootMethod, g.looterGuid, g.lootThreshold, g.icon1, g.icon2, g.icon3, g.icon4, g.icon5, g.icon6\"\ndiff --git a/src/server/game/Groups/GroupRefManager.h b/src/server/game/Groups/GroupRefManager.h\nindex acf4b7bb9d..c80f51b341 100644\n--- a/src/server/game/Groups/GroupRefManager.h\n+++ b/src/server/game/Groups/GroupRefManager.h\n@@ -30,4 +30,15 @@ class GroupRefManager : public RefManager<Group, Player>\n         GroupReference* getFirst() { return ((GroupReference*)RefManager<Group, Player>::getFirst()); }\n         GroupReference const* getFirst() const { return ((GroupReference const*)RefManager<Group, Player>::getFirst()); }\n };\n+\n+//npcbot\n+class Creature;\n+\n+class GroupBotRefManager : public RefManager<Group, Creature>\n+{\n+    public:\n+        GroupBotReference* getFirst() { return ((GroupBotReference*)RefManager<Group, Creature>::getFirst()); }\n+        GroupBotReference const* getFirst() const { return ((GroupBotReference const*)RefManager<Group, Creature>::getFirst()); }\n+};\n+//end npcbot\n #endif\ndiff --git a/src/server/game/Groups/GroupReference.cpp b/src/server/game/Groups/GroupReference.cpp\nindex 5eaa242e27..058d392fe2 100644\n--- a/src/server/game/Groups/GroupReference.cpp\n+++ b/src/server/game/Groups/GroupReference.cpp\n@@ -35,3 +35,23 @@ void GroupReference::sourceObjectDestroyLink()\n     // called from invalidate()\n     //getTarget()->DelinkMember(this);\n }\n+\n+//npcbot\n+void GroupBotReference::targetObjectBuildLink()\n+{\n+    // called from link()\n+    getTarget()->LinkBotMember(this);\n+}\n+\n+void GroupBotReference::targetObjectDestroyLink()\n+{\n+    // called from unlink()\n+    //getTarget()->DelinkMember(this);\n+}\n+\n+void GroupBotReference::sourceObjectDestroyLink()\n+{\n+    // called from invalidate()\n+    //getTarget()->DelinkMember(this);\n+}\n+//end npcbot\ndiff --git a/src/server/game/Groups/GroupReference.h b/src/server/game/Groups/GroupReference.h\nindex f0075e7cd9..955a245ac2 100644\n--- a/src/server/game/Groups/GroupReference.h\n+++ b/src/server/game/Groups/GroupReference.h\n@@ -38,4 +38,24 @@ class TC_GAME_API GroupReference : public Reference<Group, Player>\n         uint8 getSubGroup() const { return iSubGroup; }\n         void setSubGroup(uint8 pSubGroup) { iSubGroup = pSubGroup; }\n };\n+\n+//npcbot\n+class Creature;\n+\n+class TC_GAME_API GroupBotReference : public Reference<Group, Creature>\n+{\n+    protected:\n+        uint8 iSubGroup;\n+        void targetObjectBuildLink() override;\n+        void targetObjectDestroyLink() override;\n+        void sourceObjectDestroyLink() override;\n+    public:\n+        GroupBotReference() : Reference<Group, Creature>(), iSubGroup(0) { }\n+        ~GroupBotReference() { unlink(); }\n+        GroupBotReference* next() { return (GroupBotReference*)Reference<Group, Creature>::next(); }\n+        GroupBotReference const* next() const { return (GroupBotReference const*)Reference<Group, Creature>::next(); }\n+        uint8 getSubGroup() const { return iSubGroup; }\n+        void setSubGroup(uint8 pSubGroup) { iSubGroup = pSubGroup; }\n+};\n+//end npcbot\n #endif\ndiff --git a/src/server/game/Handlers/BattleGroundHandler.cpp b/src/server/game/Handlers/BattleGroundHandler.cpp\nindex 660808f8c4..1e67c17db4 100644\n--- a/src/server/game/Handlers/BattleGroundHandler.cpp\n+++ b/src/server/game/Handlers/BattleGroundHandler.cpp\n@@ -39,6 +39,12 @@\n #include \"Player.h\"\n #include \"World.h\"\n \n+//npcbot\n+#include \"botconfig.h\"\n+#include \"botdatamgr.h\"\n+#include \"botmgr.h\"\n+//end npcbot\n+\n void WorldSession::HandleBattlemasterHelloOpcode(WorldPackets::NPC::Hello& hello)\n {\n     Creature* unit = GetPlayer()->GetNPCIfCanInteractWith(hello.Unit, UNIT_NPC_FLAG_BATTLEMASTER);\n@@ -177,6 +183,22 @@ void WorldSession::HandleBattlemasterJoinOpcode(WorldPackets::Battleground::Batt\n         if (_player->HasAura(9454))\n             return;\n \n+        //npcbot: do not allow entering as group if there are bots in group\n+        if (_player->GetGroup() && _player->HaveBot())\n+        {\n+            for (auto const& mslot : _player->GetGroup()->GetMemberSlots())\n+            {\n+                if (mslot.guid.IsCreature() && _player->GetBotMgr()->GetBot(mslot.guid))\n+                {\n+                    WorldPackets::Battleground::BattlefieldStatusFailed battlefieldStatus;\n+                    BattlegroundMgr::BuildBattlegroundStatusFailed(&battlefieldStatus, ERR_BATTLEGROUND_JOIN_FAILED);\n+                    SendPacket(battlefieldStatus.Write());\n+                    return;\n+                }\n+            }\n+        }\n+        //end npcbot\n+\n         BattlegroundQueue& bgQueue = sBattlegroundMgr->GetBattlegroundQueue(bgQueueTypeId);\n         GroupQueueInfo* ginfo = bgQueue.AddGroup(_player, nullptr, bracketEntry, false, isPremade, 0, 0);\n         uint32 avgTime = bgQueue.GetAverageQueueWaitTime(ginfo);\n@@ -200,6 +222,10 @@ void WorldSession::HandleBattlemasterJoinOpcode(WorldPackets::Battleground::Batt\n         ObjectGuid errorGuid;\n         err = grp->CanJoinBattlegroundQueue(bg, bgQueueTypeId, 0, bg->GetMaxPlayersPerTeam(), false, 0, errorGuid);\n         isPremade = (grp->GetMembersCount() >= bg->GetMinPlayersPerTeam());\n+        //npcbot: check premade for bots\n+        if (isPremade && !BotCfg::IsNpcBotsPremadeEnabled() && grp->GetFirstBotMember() != nullptr)\n+            isPremade = false;\n+        //end npcbot\n \n         BattlegroundQueue& bgQueue = sBattlegroundMgr->GetBattlegroundQueue(bgQueueTypeId);\n         GroupQueueInfo* ginfo = nullptr;\n@@ -239,6 +265,22 @@ void WorldSession::HandleBattlemasterJoinOpcode(WorldPackets::Battleground::Batt\n             TC_LOG_DEBUG(\"bg.battleground\", \"Battleground: player joined queue for bg queue {{ BattlemasterListId: {}, BracketId: {}, TeamSize: {} }}, {}, NAME {}\",\n                 bgQueueTypeId.BattlemasterListId, uint32(bgQueueTypeId.BracketId), uint32(bgQueueTypeId.TeamSize),\n                 member->GetGUID().ToString(), member->GetName());\n+\n+            //npcbot: list bots\n+            if (!member->HaveBot())\n+                continue;\n+\n+            BotMap const* map = member->GetBotMgr()->GetBotMap();\n+            for (BotMap::const_iterator itr = map->begin(); itr != map->end(); ++itr)\n+            {\n+                Creature const* bot = itr->second;\n+                if (!bot || !grp->IsMember(bot->GetGUID()))\n+                    continue;\n+\n+                TC_LOG_DEBUG(\"bg.battleground\", \"Battleground: NPCBot joined queue for bg type {}: GUID {}, NAME {} (owner: {})\",\n+                    bgQueueTypeId.BattlemasterListId, bot->GetGUID().ToString(), bot->GetName(), member->GetName());\n+            }\n+            //end npcbot\n         }\n         TC_LOG_DEBUG(\"bg.battleground\", \"Battleground: group end\");\n     }\n@@ -252,15 +294,44 @@ void WorldSession::HandleBattlegroundPlayerPositionsOpcode(WorldPackets::Battleg\n         return;\n \n     WorldPackets::Battleground::BattlegroundPlayerPositions playerPositions;\n+    //npcbot\n+    Creature const* afcbot = nullptr;\n+    Creature const* hfcbot = nullptr;\n+    //end npcbot\n+\n     ObjectGuid guid = bg->GetFlagPickerGUID(TEAM_ALLIANCE);\n     if (!guid.IsEmpty())\n+    //npcbot\n+    {\n+    //end npcbot\n         if (Player* allianceFlagCarrier = ObjectAccessor::GetPlayer(*_player, guid))\n             playerPositions.FlagCarriers.emplace_back(guid, allianceFlagCarrier->GetPosition());\n+        //npcbot\n+        else if (guid.IsCreature())\n+        {\n+            afcbot = BotDataMgr::FindBot(guid.GetEntry());\n+            if (afcbot)\n+                playerPositions.FlagCarriers.emplace_back(guid, afcbot->GetPosition());\n+        }\n+    }\n+        //end npcbot\n \n     guid = bg->GetFlagPickerGUID(TEAM_HORDE);\n     if (!guid.IsEmpty())\n+    //npcbot\n+    {\n+    //end npcbot\n         if (Player* hordeFlagCarrier = ObjectAccessor::GetPlayer(*_player, guid))\n             playerPositions.FlagCarriers.emplace_back(guid, hordeFlagCarrier->GetPosition());\n+        //npcbot\n+        else if (guid.IsCreature())\n+        {\n+            hfcbot = BotDataMgr::FindBot(guid.GetEntry());\n+            if (hfcbot)\n+                playerPositions.FlagCarriers.emplace_back(guid, hfcbot->GetPosition());\n+        }\n+    }\n+        //end npcbot\n \n     SendPacket(playerPositions.Write());\n }\n@@ -568,6 +639,23 @@ void WorldSession::HandleBattlemasterJoinArena(WorldPackets::Battleground::Battl\n         return;\n \n     BattlegroundQueueTypeId bgQueueTypeId = BattlegroundMgr::BGQueueTypeId(bgTypeId, bracketEntry->GetBracketId(), arenatype);\n+\n+    //npcbot\n+    bool have_bots_in_group = false;\n+    if (_player->GetGroup() && _player->HaveBot())\n+    {\n+        for (auto const& mslot : _player->GetGroup()->GetMemberSlots())\n+        {\n+            if (mslot.guid.IsCreature() && _player->GetBotMgr()->GetBot(mslot.guid))\n+            {\n+                have_bots_in_group = true;\n+                break;\n+            }\n+        }\n+    }\n+    //end npcbot\n+\n+\n     Group* grp = _player->GetGroup();\n     if (!packet.JoinAsGroup)\n     {\n@@ -595,6 +683,16 @@ void WorldSession::HandleBattlemasterJoinArena(WorldPackets::Battleground::Battl\n         // check if has free queue slots\n         if (!_player->HasFreeBattlegroundQueueId())\n             return;\n+\n+        //npcbot: do not allow entering as group if there are bots in group\n+        if (have_bots_in_group)\n+        {\n+            WorldPackets::Battleground::BattlefieldStatusFailed battlefieldStatus;\n+            BattlegroundMgr::BuildBattlegroundStatusFailed(&battlefieldStatus, ERR_BATTLEGROUND_JOIN_FAILED);\n+            SendPacket(battlefieldStatus.Write());\n+            return;\n+        }\n+        //end npcbot\n     }\n     else\n     {\n@@ -618,6 +716,16 @@ void WorldSession::HandleBattlemasterJoinArena(WorldPackets::Battleground::Battl\n             return;\n         }\n \n+        //npcbot: do not allow bots in rated matches\n+        if (have_bots_in_group)\n+        {\n+            WorldPackets::Battleground::BattlefieldStatusFailed battlefieldStatus;\n+            BattlegroundMgr::BuildBattlegroundStatusFailed(&battlefieldStatus, ERR_BATTLEGROUND_JOIN_TIMED_OUT);\n+            SendPacket(battlefieldStatus.Write());\n+            return;\n+        }\n+        //end npcbot\n+\n         // get the team rating for queueing\n         arenaRating = at->GetRating();\n         matchmakerRating = at->GetAverageMMR(grp);\n@@ -686,6 +794,22 @@ void WorldSession::HandleBattlemasterJoinArena(WorldPackets::Battleground::Battl\n             TC_LOG_DEBUG(\"bg.battleground\", \"Battleground: player joined queue for arena as group bg queue {{ BattlemasterListId: {}, BracketId: {}, TeamSize: {} }}, {}, NAME {}\",\n                 bgQueueTypeId.BattlemasterListId, uint32(bgQueueTypeId.BracketId), uint32(bgQueueTypeId.TeamSize),\n                 member->GetGUID().ToString(), member->GetName());\n+\n+            //npcbot: list bots\n+            if (!member->HaveBot())\n+                continue;\n+\n+            BotMap const* map = member->GetBotMgr()->GetBotMap();\n+            for (BotMap::const_iterator itr = map->begin(); itr != map->end(); ++itr)\n+            {\n+                Creature const* bot = itr->second;\n+                if (!bot || !grp->IsMember(bot->GetGUID()))\n+                    continue;\n+\n+                TC_LOG_DEBUG(\"bg.battleground\", \"Battleground: NPCBot joined queue for arena bg type {}: GUID {}, NAME {} (owner: {})\",\n+                    bgQueueTypeId.BattlemasterListId, bot->GetGUID().ToString(), bot->GetName(), member->GetName());\n+            }\n+            //end npcbot\n         }\n     }\n     else\ndiff --git a/src/server/game/Handlers/GroupHandler.cpp b/src/server/game/Handlers/GroupHandler.cpp\nindex 895570999e..a12bf2abc7 100644\n--- a/src/server/game/Handlers/GroupHandler.cpp\n+++ b/src/server/game/Handlers/GroupHandler.cpp\n@@ -35,6 +35,12 @@\n #include \"World.h\"\n #include \"WorldPacket.h\"\n \n+//npcbot: try query bot name\n+#include \"CreatureData.h\"\n+#include \"botdatamgr.h\"\n+#include \"botmgr.h\"\n+//end npcbot\n+\n class Aura;\n \n /* differeces from off:\n@@ -608,6 +614,14 @@ void WorldSession::HandleGroupChangeSubGroupOpcode(WorldPacket& recvData)\n     else\n         guid = sCharacterCache->GetCharacterGuidByName(name);\n \n+    //npcbot\n+    if (guid.IsEmpty())\n+    {\n+        if (Creature const* bot = BotDataMgr::FindBot(name, GetSessionDbcLocale()))\n+            guid = bot->GetGUID();\n+    }\n+    //end npcbot\n+\n     if (guid.IsEmpty())\n         return;\n \n@@ -908,6 +922,32 @@ void WorldSession::HandleRequestPartyMemberStatsOpcode(WorldPacket &recvData)\n     ObjectGuid guid;\n     recvData >> guid;\n \n+    //npcbot: try send bot group member info\n+    if (guid.IsCreature())\n+    {\n+        if (!GetPlayer()->GetGroup() || !GetPlayer()->GetGroup()->IsMember(guid))\n+        {\n+            WorldPacket data(SMSG_PARTY_MEMBER_STATS_FULL, 3+4+2);\n+            data << uint8(0);\n+            data << guid.WriteAsPacked();\n+            data << uint32(GROUP_UPDATE_FLAG_STATUS);\n+            data << uint16(MEMBER_STATUS_OFFLINE);\n+            SendPacket(&data);\n+            return;\n+        }\n+\n+        uint32 creatureId = guid.GetEntry();\n+        CreatureTemplate const* creatureTemplate = sObjectMgr->GetCreatureTemplate(creatureId);\n+        if (creatureTemplate && creatureTemplate->IsNPCBot())\n+        {\n+            WorldPacket bpdata(SMSG_PARTY_MEMBER_STATS_FULL, 4+2+2+2+1+2*6+8+1+8);\n+            BotMgr::BuildBotPartyMemberStatsPacket(guid, &bpdata);\n+            SendPacket(&bpdata);\n+            return;\n+        }\n+    }\n+    //end npcbot\n+\n     Player* player = ObjectAccessor::FindConnectedPlayer(guid);\n     if (!player || !GetPlayer()->IsInSameRaidWith(player))\n     {\ndiff --git a/src/server/game/Handlers/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp\nindex aa7dc21031..19cc36c545 100644\n--- a/src/server/game/Handlers/ItemHandler.cpp\n+++ b/src/server/game/Handlers/ItemHandler.cpp\n@@ -30,6 +30,10 @@\n #include \"World.h\"\n #include \"WorldPacket.h\"\n \n+// npcbot\n+#include \"botmgr.h\"\n+//end npcbot\n+\n void WorldSession::HandleSplitItemOpcode(WorldPacket& recvData)\n {\n     //TC_LOG_DEBUG(\"network\", \"WORLD: CMSG_SPLIT_ITEM\");\n@@ -644,6 +648,15 @@ void WorldSession::SendListInventory(ObjectGuid vendorGuid)\n             uint32 leftInStock = !item->maxcount ? 0xFFFFFFFF : vendor->GetVendorItemCurrentCount(item);\n             if (!_player->IsGameMaster()) // ignore conditions if GM on\n             {\n+                // npcbot\n+                if (_player->HaveBot())\n+                {\n+                    if (!(itemTemplate->AllowableClass & (_player->GetClassMask() | _player->GetBotMgr()->GetAllNpcBotsClassMask())) &&\n+                        itemTemplate->Bonding == BIND_WHEN_PICKED_UP && !_player->IsGameMaster())\n+                        continue;\n+                }\n+                else\n+                // end npcbot\n                 // Respect allowed class\n                 if (!(itemTemplate->AllowableClass & _player->GetClassMask()) && itemTemplate->Bonding == BIND_WHEN_PICKED_UP)\n                     continue;\ndiff --git a/src/server/game/Handlers/LootHandler.cpp b/src/server/game/Handlers/LootHandler.cpp\nindex 64b485e563..b6a3a4490e 100644\n--- a/src/server/game/Handlers/LootHandler.cpp\n+++ b/src/server/game/Handlers/LootHandler.cpp\n@@ -31,6 +31,12 @@\n #include \"Player.h\"\n #include \"WorldPacket.h\"\n \n+//npcbot\n+#include \"botconfig.h\"\n+#include \"botmgr.h\"\n+#include \"World.h\"\n+//end npcbot\n+\n void WorldSession::HandleAutostoreLootItemOpcode(WorldPacket& recvData)\n {\n     TC_LOG_DEBUG(\"network\", \"WORLD: CMSG_AUTOSTORE_LOOT_ITEM\");\n@@ -165,6 +171,50 @@ void WorldSession::HandleLootMoneyOpcode(WorldPacket& /*recvData*/)\n     if (loot)\n     {\n         loot->NotifyMoneyRemoved();\n+        //npcbot\n+        if (shareMoney && player->GetGroup() && BotCfg::GetNpcBotMoneyShareEnabled())\n+        {\n+            Group* group = player->GetGroup();\n+            std::vector<Player*> playersNear;\n+            uint32 bots_count = 0;\n+            for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())\n+            {\n+                Player* member = itr->GetSource();\n+                if (!member)\n+                    continue;\n+\n+                if (player->IsAtGroupRewardDistance(member))\n+                    playersNear.push_back(member);\n+\n+                if (!member->HaveBot())\n+                    continue;\n+\n+                BotMap const* botMap = member->GetBotMgr()->GetBotMap();\n+                for (auto const& kv : *botMap)\n+                {\n+                    Creature const* bot = kv.second;\n+                    if (bot && bot->IsAlive() && bot->IsInMap(player) && (group->IsMember(kv.first) || !BotCfg::GetNpcBotMoneyShareGroupOnly()) &&\n+                        (member->GetMap()->IsDungeon() || player->GetDistance(bot) <= sWorld->getFloatConfig(CONFIG_GROUP_XP_DISTANCE)))\n+                        ++bots_count;\n+                }\n+            }\n+\n+            uint32 sharers_count = uint32(playersNear.size()) + bots_count;\n+            uint32 goldPerPlayer = uint32(loot->gold / sharers_count);\n+\n+            for (std::vector<Player*>::const_iterator i = playersNear.begin(); i != playersNear.end(); ++i)\n+            {\n+                (*i)->ModifyMoney(goldPerPlayer);\n+                (*i)->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LOOT_MONEY, goldPerPlayer);\n+\n+                WorldPacket data(SMSG_LOOT_MONEY_NOTIFY, 4 + 1);\n+                data << uint32(goldPerPlayer);\n+                data << uint8(sharers_count <= 1); // Controls the text displayed in chat. 0 is \"Your share is...\" and 1 is \"You loot...\"\n+                (*i)->SendDirectMessage(&data);\n+            }\n+        }\n+        else\n+        //end npcbot\n         if (shareMoney && player->GetGroup())      //item, pickpocket and players can be looted only single player\n         {\n             Group* group = player->GetGroup();\ndiff --git a/src/server/game/Handlers/QueryHandler.cpp b/src/server/game/Handlers/QueryHandler.cpp\nindex 1180a7967f..1287e1d2aa 100644\n--- a/src/server/game/Handlers/QueryHandler.cpp\n+++ b/src/server/game/Handlers/QueryHandler.cpp\n@@ -33,11 +33,51 @@\n #include \"UpdateMask.h\"\n #include \"World.h\"\n \n+//npcbot\n+#include \"CreatureData.h\"\n+#include \"botdatamgr.h\"\n+#include \"botmgr.h\"\n+//end npcbot\n+\n void WorldSession::SendNameQueryOpcode(ObjectGuid guid)\n {\n     WorldPackets::Query::QueryPlayerNameResponse response;\n     response.Player = guid;\n \n+    //npcbot: try query bot info\n+    if (guid.IsCreature())\n+    {\n+        uint32 creatureId = guid.GetEntry();\n+        CreatureTemplate const* creatureTemplate = sObjectMgr->GetCreatureTemplate(creatureId);\n+        if (creatureTemplate && creatureTemplate->IsNPCBot())\n+        {\n+            std::string_view creatureName = creatureTemplate->Name;\n+            if (CreatureLocale const* creatureInfo = sObjectMgr->GetCreatureLocale(creatureId))\n+            {\n+                uint32 loc = GetSessionDbLocaleIndex();\n+                if (creatureInfo->Name.size() > loc && !creatureInfo->Name[loc].empty() && Utf8FitTo(creatureInfo->Name[loc], {}))\n+                    creatureName = creatureInfo->Name[loc];\n+            }\n+\n+            NpcBotExtras const* extData = ASSERT_NOTNULL(BotDataMgr::SelectNpcBotExtras(creatureId));\n+            NpcBotAppearanceData const* appData = BotDataMgr::SelectNpcBotAppearance(creatureId);\n+\n+            response.Result = RESPONSE_SUCCESS; // name known\n+\n+            WorldPackets::Query::PlayerGuidLookupData& bdata = response.Data.emplace();\n+            bdata.Name = creatureName;\n+            bdata.Race = BotMgr::GetBotPlayerRace(extData->bclass, extData->race);\n+            bdata.Sex = appData ? appData->gender : static_cast<uint8>(GENDER_MALE);\n+            bdata.ClassID = BotMgr::GetBotPlayerClass(extData->bclass);\n+        }\n+        else\n+            response.Result = RESPONSE_FAILURE; // name unknown\n+\n+        SendPacket(response.Write());\n+        return;\n+    }\n+    //end npcbot\n+\n     if (CharacterCacheEntry const* characterInfo = sCharacterCache->GetCharacterCacheByGuid(guid))\n     {\n         response.Result = RESPONSE_SUCCESS; // name known\ndiff --git a/src/server/game/Handlers/SpellHandler.cpp b/src/server/game/Handlers/SpellHandler.cpp\nindex a09b37ff57..1dba3410c7 100644\n--- a/src/server/game/Handlers/SpellHandler.cpp\n+++ b/src/server/game/Handlers/SpellHandler.cpp\n@@ -39,6 +39,12 @@\n #include \"World.h\"\n #include \"WorldPacket.h\"\n \n+//npcbot\n+#include \"bot_ai.h\"\n+#include \"botconfig.h\"\n+#include \"botdatamgr.h\"\n+//end npcbot\n+\n void WorldSession::HandleClientCastFlags(WorldPacket& recvPacket, uint8 castFlags, SpellCastTargets& targets)\n {\n     // some spell cast packet including more data (for projectiles?)\n@@ -605,6 +611,109 @@ void WorldSession::HandleMirrorImageDataRequest(WorldPacket& recvData)\n     if (!unit)\n         return;\n \n+    //npcbot\n+    if (unit->GetTypeId() == TYPEID_UNIT)\n+    {\n+        CreatureOutfitContainer const& outfits = sObjectMgr->GetCreatureOutfitMap();\n+        CreatureOutfitContainer::const_iterator it = outfits.find(unit->GetEntry());\n+        if (it != outfits.end())\n+        {\n+            WorldPacket data(SMSG_MIRRORIMAGE_DATA, 68);\n+            data << guid;\n+            data << uint32(unit->GetNativeDisplayId()); // displayId\n+            data << uint8(it->second.race);             // race\n+            data << uint8(it->second.gender);           // gender\n+            data << uint8(unit->GetClass());            // class\n+            data << uint8(it->second.skin);             // skin\n+            data << uint8(it->second.face);             // face\n+            data << uint8(it->second.hair);             // hair\n+            data << uint8(it->second.haircolor);        // haircolor\n+            data << uint8(it->second.facialhair);       // facialhair\n+            data << uint32(0);                          // guildId\n+\n+            // item displays\n+            for (uint8 i = 0; i != MAX_CREATURE_OUTFIT_DISPLAYS; ++i)\n+                data << uint32(it->second.outfit[i]);\n+\n+            SendPacket(&data);\n+            return;\n+        }\n+\n+        //npcbot minion without a record in outfits table\n+        //OR\n+        //npcbot's mirror image\n+        Creature const* bot = unit->ToCreature();\n+        if (!bot->IsNPCBot() && unit->HasAuraType(SPELL_AURA_CLONE_CASTER))\n+            if (Unit const* creator = unit->GetAuraEffectsByType(SPELL_AURA_CLONE_CASTER).front()->GetCaster())\n+                if (creator->IsNPCBot())\n+                    bot = creator->ToCreature();\n+\n+        if (bot->IsNPCBot())\n+        {\n+            NpcBotAppearanceData const* appearData = BotDataMgr::SelectNpcBotAppearance(bot->GetEntry());\n+\n+            WorldPacket data(SMSG_MIRRORIMAGE_DATA, 68);\n+            data << guid;\n+            data << uint32(bot->GetDisplayId());                                       // displayId\n+            data << uint8(bot->GetRace());                                             // race\n+            data << uint8(appearData ? appearData->gender : (uint8)bot->GetGender());  // gender\n+            data << uint8(bot->GetBotAI()->GetPlayerClass());                          // class\n+            data << uint8(appearData ? appearData->skin : 0);                          // skin\n+            data << uint8(appearData ? appearData->face : 0);                          // face\n+            data << uint8(appearData ? appearData->hair : 0);                          // hair\n+            data << uint8(appearData ? appearData->haircolor : 0);                     // haircolor\n+            data << uint8(appearData ? appearData->features : 0);                      // facialhair\n+            data << uint32(0);                                                         // guildId\n+\n+            static uint8 const botItemSlots[MAX_CREATURE_OUTFIT_DISPLAYS] =\n+            {\n+                BOT_SLOT_HEAD,\n+                BOT_SLOT_SHOULDERS,\n+                BOT_SLOT_BODY,\n+                BOT_SLOT_CHEST,\n+                BOT_SLOT_WAIST,\n+                BOT_SLOT_LEGS,\n+                BOT_SLOT_FEET,\n+                BOT_SLOT_WRIST,\n+                BOT_SLOT_HANDS,\n+                BOT_SLOT_BACK,\n+                0//tabard\n+            };\n+\n+            // Display items in visible slots\n+            for (uint8 i = 0; i != MAX_CREATURE_OUTFIT_DISPLAYS; ++i)\n+            {\n+                uint8 slot = botItemSlots[i];\n+                //Items not displayed on bot: tabard, head, back\n+                if (slot == 0 ||\n+                    (slot == BOT_SLOT_HEAD && BotCfg::ShowEquippedHelm() == false) ||\n+                    (slot == BOT_SLOT_BACK && BotCfg::ShowEquippedCloak() == false))\n+                {\n+                    data << uint32(0);\n+                    continue;\n+                }\n+\n+                uint32 display_id = bot->GetBotAI()->GetEquipDisplayId(slot);\n+                if (display_id)\n+                    data << uint32(display_id);\n+                else\n+                {\n+                    //don't allow to go naked\n+                    if (slot == BOT_SLOT_CHEST)\n+                        data << uint32(CHEST_HALISCAN);\n+                    else if (slot == BOT_SLOT_LEGS)\n+                        data << uint32(LEGS_HALISCAN);\n+                    else\n+                        data << uint32(0);\n+                }\n+            }\n+\n+            SendPacket(&data);\n+            return;\n+        }\n+    }\n+    //end npcbot\n+\n     if (!unit->HasAuraType(SPELL_AURA_CLONE_CASTER))\n         return;\n \ndiff --git a/src/server/game/Instances/InstanceScript.cpp b/src/server/game/Instances/InstanceScript.cpp\nindex 745e67c586..a24e45c6ff 100644\n--- a/src/server/game/Instances/InstanceScript.cpp\n+++ b/src/server/game/Instances/InstanceScript.cpp\n@@ -39,6 +39,10 @@\n #include <cstdarg>\n #include <sstream>\n \n+//npcbot\n+#include \"botmgr.h\"\n+//end npcbot\n+\n BossBoundaryData::~BossBoundaryData()\n {\n     for (const_iterator it = begin(); it != end(); ++it)\n@@ -633,6 +637,15 @@ void InstanceScript::DoRemoveAurasDueToSpellOnPlayer(Player* player, uint32 spel\n \n     player->RemoveAurasDueToSpell(spell);\n \n+    //npcbot: include bots\n+    if (player->HaveBot())\n+    {\n+        for (auto const& bitr : *player->GetBotMgr()->GetBotMap())\n+            if (bitr.second && bitr.second->IsInWorld())\n+                DoRemoveAurasDueToSpellOnNPCBot(bitr.second, spell);\n+    }\n+    //end npcbot\n+\n     if (!includePets)\n         return;\n \n@@ -669,6 +682,15 @@ void InstanceScript::DoCastSpellOnPlayer(Player* player, uint32 spell, bool incl\n \n     player->CastSpell(player, spell, true);\n \n+    //npcbot: include bots\n+    if (player->HaveBot())\n+    {\n+        for (auto const& bitr : *player->GetBotMgr()->GetBotMap())\n+            if (bitr.second && bitr.second->IsInWorld())\n+                DoCastSpellOnNPCBot(bitr.second, spell);\n+    }\n+    //end npcbot\n+\n     if (!includePets)\n         return;\n \n@@ -691,6 +713,24 @@ void InstanceScript::DoCastSpellOnPlayer(Player* player, uint32 spell, bool incl\n     }\n }\n \n+//npcbot: hooks\n+void InstanceScript::DoRemoveAurasDueToSpellOnNPCBot(Creature* bot, uint32 spell)\n+{\n+    ASSERT(bot && bot->IsNPCBot() && bot->IsInWorld() && !bot->IsFreeBot());\n+    bot->RemoveAurasDueToSpell(spell);\n+    if (Unit* botpet = bot->GetBotsPet())\n+        botpet->RemoveAurasDueToSpell(spell);\n+}\n+\n+void InstanceScript::DoCastSpellOnNPCBot(Creature* bot, uint32 spell)\n+{\n+    ASSERT(bot && bot->IsNPCBot() && bot->IsInWorld() && !bot->IsFreeBot());\n+    bot->CastSpell(bot, spell, true);\n+    if (Unit* botpet = bot->GetBotsPet())\n+        botpet->CastSpell(botpet, spell, true);\n+}\n+//end npcbot\n+\n bool InstanceScript::ServerAllowsTwoSideGroups()\n {\n     return sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP);\ndiff --git a/src/server/game/Instances/InstanceScript.h b/src/server/game/Instances/InstanceScript.h\nindex 0423dc2eca..99a9aecdd4 100644\n--- a/src/server/game/Instances/InstanceScript.h\n+++ b/src/server/game/Instances/InstanceScript.h\n@@ -200,6 +200,13 @@ class TC_GAME_API InstanceScript : public ZoneScript\n         // Called when a player successfully leaves the instance.\n         virtual void OnPlayerLeave(Player* /*player*/) { }\n \n+        //npcbot: map hooks\n+        virtual void OnNPCBotEnter(Creature* /*bot*/) { }\n+        virtual void OnNPCBotLeave(Creature* /*bot*/) { }\n+        void DoRemoveAurasDueToSpellOnNPCBot(Creature* bot, uint32 spell);\n+        void DoCastSpellOnNPCBot(Creature* bot, uint32 spell);\n+        //end npcbot\n+\n         // Handle open / close objects\n         // * use HandleGameObject(0, boolen, GO); in OnObjectCreate in instance scripts\n         // * use HandleGameObject(GUID, boolen, nullptr); in any other script\ndiff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp\nindex 5f65a14f26..cebaeb6286 100644\n--- a/src/server/game/Maps/Map.cpp\n+++ b/src/server/game/Maps/Map.cpp\n@@ -53,6 +53,11 @@\n #include <unordered_set>\n #include <vector>\n \n+//npcbot\n+#include \"botdatamgr.h\"\n+#include \"botmgr.h\"\n+//end npcbot\n+\n u_map_magic MapMagic        = { {'M','A','P','S'} };\n uint32 MapVersionMagic      = 10;\n u_map_magic MapAreaMagic    = { {'A','R','E','A'} };\n@@ -1027,6 +1032,40 @@ template<class T>\n void Map::RemoveFromMap(T *obj, bool remove)\n {\n     bool const inWorld = obj->IsInWorld() && obj->GetTypeId() >= TYPEID_UNIT && obj->GetTypeId() <= TYPEID_GAMEOBJECT;\n+\n+    //npcbot: tempfix for bots out of grid during remove from map\n+    if constexpr (std::is_base_of_v<Creature, T>)\n+    {\n+        if (obj->IsNPCBot())\n+        {\n+            obj->RemoveFromWorld();\n+\n+            if (obj->isActiveObject())\n+                RemoveFromActive(obj);\n+\n+            if (!inWorld) // if was in world, RemoveFromWorld() called DestroyForNearbyPlayers()\n+                obj->DestroyForNearbyPlayers(); // previous obj->UpdateObjectVisibility(true)\n+\n+            if (obj->IsInGrid())\n+                obj->RemoveFromGrid();\n+            else\n+            {\n+                Player const* owner = obj->ToCreature()->GetBotOwner();\n+                BOT_LOG_ERROR(\"npcbots\", \"Map::Remove<Bot>FromMap() bot {} id {} is in map id {} \\\"{}\\\" instanceId {} but not in grid!\\nmaster: {}\\nmaster map id {} \\\"{}\\\"\",\n+                    obj->GetName(), obj->GetEntry(), GetId(), GetMapName(), i_InstanceId, owner ? owner->GetGUID().ToString() : std::string{ \"Unknown\" },\n+                    (owner && owner->IsInWorld()) ? owner->GetMap()->GetId() : 0u, (owner && owner->IsInWorld()) ? std::string(owner->GetMap()->GetMapName()) : std::string{\"Unknown\"});\n+            }\n+\n+            obj->ResetMap();\n+\n+            if (remove)\n+                DeleteFromWorld(obj);\n+\n+            return;\n+        }\n+    }\n+    //end npcbot\n+\n     obj->RemoveFromWorld();\n \n     if (obj->isActiveObject())\n@@ -3661,7 +3700,26 @@ uint32 Map::GetPlayersCountExceptGMs() const\n     uint32 count = 0;\n     for (MapRefManager::const_iterator itr = m_mapRefManager.begin(); itr != m_mapRefManager.end(); ++itr)\n         if (!itr->GetSource()->IsGameMaster())\n+        //npcbot - count npcbots as group members (event if not in group)\n+        {\n+            if (itr->GetSource()->HaveBot() && BotMgr::LimitBots(this))\n+            {\n+                ++count;\n+                BotMap const* botmap = itr->GetSource()->GetBotMgr()->GetBotMap();\n+                for (BotMap::const_iterator itr = botmap->begin(); itr != botmap->end(); ++itr)\n+                {\n+                    Creature* cre = itr->second;\n+                    if (!cre || !cre->IsInWorld() || cre->FindMap() != this || cre->IsTempBot())\n+                        continue;\n+                    ++count;\n+                }\n+                continue;\n+            }\n+        //end npcbot\n             ++count;\n+        //npcbot\n+        }\n+        //end npcbot\n     return count;\n }\n \n@@ -3759,6 +3817,10 @@ void Map::AddToActive(WorldObject* obj)\n         GridCoord p = Trinity::ComputeGridCoord(respawnLocation->GetPositionX(), respawnLocation->GetPositionY());\n         if (getNGrid(p.x_coord, p.y_coord))\n             getNGrid(p.x_coord, p.y_coord)->incUnloadActiveLock();\n+        //npcbot\n+        else if (obj->IsNPCBot())\n+            EnsureGridLoadedForActiveObject(Cell(Trinity::ComputeCellCoord(obj->GetPositionX(), obj->GetPositionY())), obj);\n+        //end npcbot\n         else\n         {\n             GridCoord p2 = Trinity::ComputeGridCoord(obj->GetPositionX(), obj->GetPositionY());\n@@ -3779,6 +3841,11 @@ void Map::RemoveFromActive(WorldObject* obj)\n             if (Creature* creature = obj->ToCreature(); !creature->IsPet() && creature->GetSpawnId())\n             {\n                 respawnLocation.emplace();\n+                //npcbot: prevent crash from accessing deleted creatureData\n+                if (creature->IsNPCBot())\n+                    creature->GetHomePosition().GetPosition(respawnLocation->m_positionX, respawnLocation->m_positionY, respawnLocation->m_positionZ);\n+                else\n+                //end npcbot\n                 creature->GetRespawnPosition(respawnLocation->m_positionX, respawnLocation->m_positionY, respawnLocation->m_positionZ);\n             }\n             break;\n@@ -3798,6 +3865,10 @@ void Map::RemoveFromActive(WorldObject* obj)\n         GridCoord p = Trinity::ComputeGridCoord(respawnLocation->GetPositionX(), respawnLocation->GetPositionY());\n         if (getNGrid(p.x_coord, p.y_coord))\n             getNGrid(p.x_coord, p.y_coord)->decUnloadActiveLock();\n+        //npcbot\n+        else if (obj->IsNPCBot())\n+            EnsureGridLoaded(Cell(Trinity::ComputeCellCoord(obj->GetPositionX(), obj->GetPositionY())));\n+        //end npcbot\n         else\n         {\n             GridCoord p2 = Trinity::ComputeGridCoord(obj->GetPositionX(), obj->GetPositionY());\n@@ -4492,6 +4563,11 @@ void Map::SaveRespawnTime(SpawnObjectType type, ObjectGuid::LowType spawnId, uin\n \n void Map::SaveRespawnInfoDB(RespawnInfo const& info, CharacterDatabaseTransaction dbTrans)\n {\n+    //npcbot: DO NOT save npcbots respawn time\n+    if (info.type == SPAWN_TYPE_CREATURE && BotDataMgr::SelectNpcBotData(info.entry))\n+        return;\n+    //end npcbot\n+\n     CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_RESPAWN);\n     stmt->setUInt16(0, info.type);\n     stmt->setUInt32(1, info.spawnId);\ndiff --git a/src/server/game/Maps/MapManager.cpp b/src/server/game/Maps/MapManager.cpp\nindex a49c8bc95f..79e71feda0 100644\n--- a/src/server/game/Maps/MapManager.cpp\n+++ b/src/server/game/Maps/MapManager.cpp\n@@ -36,6 +36,11 @@\n #include \"ScriptMgr.h\"\n #include <numeric>\n \n+//npcbot\n+#include \"botdatamgr.h\"\n+#include \"botmgr.h\"\n+//end npcbot\n+\n MapManager::MapManager()\n     : _nextInstanceId(0), _scheduledScripts(0)\n {\n@@ -53,6 +58,10 @@ void MapManager::Initialize()\n     // Start mtmaps if needed.\n     if (num_threads > 0)\n         m_updater.activate(num_threads);\n+\n+    //npcbot: load bots\n+    BotMgr::Initialize();\n+    //end npcbot\n }\n \n void MapManager::InitializeVisibilityDistanceInfo()\n@@ -217,6 +226,10 @@ Map::EnterState MapManager::PlayerCannotEnter(uint32 mapid, Player* player, bool\n \n void MapManager::Update(uint32 diff)\n {\n+    //npcbot\n+    BotDataMgr::Update(diff);\n+    //end npcbot\n+\n     i_timer.Update(diff);\n     if (!i_timer.Passed())\n         return;\n@@ -232,6 +245,10 @@ void MapManager::Update(uint32 diff)\n     if (m_updater.activated())\n         m_updater.wait();\n \n+    //npcbot\n+    BotMgr::HandleDelayedTeleports();\n+    //end npcbot\n+\n     for (iter = i_maps.begin(); iter != i_maps.end(); ++iter)\n         iter->second->DelayedUpdate(uint32(i_timer.GetCurrent()));\n \ndiff --git a/src/server/game/Movement/MotionMaster.cpp b/src/server/game/Movement/MotionMaster.cpp\nindex ed50a39017..eb7907e569 100644\n--- a/src/server/game/Movement/MotionMaster.cpp\n+++ b/src/server/game/Movement/MotionMaster.cpp\n@@ -795,6 +795,26 @@ void MotionMaster::MoveJump(float x, float y, float z, float o, float speedXY, f\n     if (speedXY < 0.01f)\n         return;\n \n+    //npcbot: blademaser only (disabled)\n+    /*\n+    if (_owner->GetTypeId() == TYPEID_UNIT && _owner->ToCreature()->IsNPCBot())\n+    {\n+        Movement::MoveSplineInit init(_owner);\n+        init.MoveTo(x, y, z, false);\n+        init.SetParabolic(speedZ, 0);\n+        init.SetFacing(o);\n+        init.SetOrientationFixed(true);\n+        init.SetVelocity(speedXY);\n+\n+        GenericMovementGenerator* movement = new GenericMovementGenerator(std::move(init), EFFECT_MOTION_TYPE, EVENT_JUMP);\n+        movement->Priority = MOTION_PRIORITY_HIGHEST;\n+        movement->BaseUnitState = UNIT_STATE_JUMPING;\n+        Add(movement);\n+        return;\n+    }\n+    */\n+    //end npcbot\n+\n     float moveTimeHalf = speedZ / Movement::gravity;\n     float max_height = -Movement::computeFallElevation(moveTimeHalf, false, -speedZ);\n \ndiff --git a/src/server/game/Movement/MovementGenerators/FollowMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/FollowMovementGenerator.cpp\nindex d236159455..69676d5cfb 100644\n--- a/src/server/game/Movement/MovementGenerators/FollowMovementGenerator.cpp\n+++ b/src/server/game/Movement/MovementGenerators/FollowMovementGenerator.cpp\n@@ -194,4 +194,16 @@ void FollowMovementGenerator::UpdatePetSpeed(Unit* owner)\n             oPet->UpdateSpeed(MOVE_SWIM);\n         }\n     }\n+\n+    //npcbot\n+    if (owner->IsNPCBotPet())\n+    {\n+        if (GetTarget() && (GetTarget()->GetGUID() == owner->GetOwnerGUID() || GetTarget()->GetGUID() == owner->GetCreatorGUID()))\n+        {\n+            owner->UpdateSpeed(MOVE_RUN);\n+            owner->UpdateSpeed(MOVE_WALK);\n+            owner->UpdateSpeed(MOVE_SWIM);\n+        }\n+    }\n+    //end npcbot\n }\ndiff --git a/src/server/game/Movement/Spline/MoveSplineInit.cpp b/src/server/game/Movement/Spline/MoveSplineInit.cpp\nindex 64842921fe..88cca461c7 100644\n--- a/src/server/game/Movement/Spline/MoveSplineInit.cpp\n+++ b/src/server/game/Movement/Spline/MoveSplineInit.cpp\n@@ -117,6 +117,11 @@ namespace Movement\n             if (Creature* creature = unit->ToCreature())\n                 if (creature->HasSearchedAssistance())\n                     args.velocity *= 0.66f;\n+\n+            //npcbot: do not emit an error if unit cannot move at all\n+            if ((unit->IsNPCBotOrPet() || !unit->CanFreeMove()) && !(args.velocity > 0.01f))\n+                return 0;\n+            //end npcbot\n         }\n \n         // limit the speed in the same way the client does\ndiff --git a/src/server/game/OutdoorPvP/OutdoorPvP.cpp b/src/server/game/OutdoorPvP/OutdoorPvP.cpp\nindex 204b98869e..e23f5c981c 100644\n--- a/src/server/game/OutdoorPvP/OutdoorPvP.cpp\n+++ b/src/server/game/OutdoorPvP/OutdoorPvP.cpp\n@@ -315,6 +315,23 @@ bool OPvPCapturePoint::Update(uint32 diff)\n     if (!fact_diff)\n         return false;\n \n+    //npcbots - count bots as players but 2 times less affect and only if there is a players difference\n+    uint32 botsCount[2];\n+\n+    for (uint8 team = 0; team != 2; ++team)\n+    {\n+        botsCount[team] = 0;\n+\n+        for (GuidSet::iterator itr = m_activePlayers[team].begin(); itr != m_activePlayers[team].end(); ++itr)\n+        {\n+            if (Player* player = ObjectAccessor::FindPlayer(*itr))\n+                botsCount[team] += player->GetNpcBotsCount();\n+        }\n+    }\n+\n+    fact_diff += 0.5f * ((float)botsCount[0] - (float)botsCount[1]) * diff / OUTDOORPVP_OBJECTIVE_UPDATE_INTERVAL;\n+    //end npcbot\n+\n     uint32 Challenger = 0;\n     float maxDiff = m_maxSpeed * diff;\n \ndiff --git a/src/server/game/Scripting/ScriptMgr.cpp b/src/server/game/Scripting/ScriptMgr.cpp\nindex 9e672f4ffe..a54edcd813 100644\n--- a/src/server/game/Scripting/ScriptMgr.cpp\n+++ b/src/server/game/Scripting/ScriptMgr.cpp\n@@ -43,6 +43,10 @@\n #include \"WorldPacket.h\"\n #include \"WorldSession.h\"\n \n+//npcbot\n+#include \"botconfig.h\"\n+//end npcbot\n+\n // Trait which indicates whether this script type\n // must be assigned in the database.\n template<typename>\n@@ -1052,6 +1056,10 @@ void ScriptMgr::Initialize()\n     // LFGScripts\n     lfg::AddSC_LFGScripts();\n \n+    //npcbot: load bot scripts here\n+    AddNpcBotScripts();\n+    //end npcbot\n+\n     // Load all static linked scripts through the script loader function.\n     ASSERT(_script_loader_callback,\n            \"Script loader callback wasn't registered!\");\ndiff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h\nindex c50e63e79f..af1ecf9374 100644\n--- a/src/server/game/Scripting/ScriptMgr.h\n+++ b/src/server/game/Scripting/ScriptMgr.h\n@@ -90,6 +90,8 @@ enum XPColorChar : uint8;\n \n #define VISIBLE_RANGE       166.0f                          //MAX visible range (size of grid)\n \n+#define MOD_PRESENT_NPCBOTS 1\n+\n /*\n     @todo Add more script type classes.\n \ndiff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp\nindex 462c0e0374..b8edefee9b 100644\n--- a/src/server/game/Server/WorldSession.cpp\n+++ b/src/server/game/Server/WorldSession.cpp\n@@ -59,6 +59,10 @@\n #include <boost/circular_buffer.hpp>\n #include <zlib.h>\n \n+//npcbot\n+#include \"botconfig.h\"\n+//end npcbot\n+\n namespace {\n \n std::string const DefaultPlayerName = \"<none>\";\n@@ -488,6 +492,10 @@ void WorldSession::LogoutPlayer(bool save)\n     m_playerLogout = true;\n     m_playerSave = save;\n \n+    //npcbot - free all bots and remove from botmap\n+    _player->RemoveAllBots();\n+    //end npcbots\n+\n     if (_player)\n     {\n         ObjectGuid lguid = _player->GetLootGUID();\n@@ -1651,6 +1659,16 @@ uint32 WorldSession::DosProtection::GetMaxPacketCounterAllowed(uint16 opcode) co\n             maxPacketCounterAllowed = PLAYER_SLOTS_COUNT;\n             break;\n         }\n+        //npcbot: prevent kicks when too many bots spawned in one spot\n+        case CMSG_GET_MIRRORIMAGE_DATA:\n+        {\n+            if (BotCfg::GetBotInfoPacketsLimit() > -1)\n+                maxPacketCounterAllowed = BotCfg::GetBotInfoPacketsLimit();\n+            else\n+                maxPacketCounterAllowed = 100;\n+            break;\n+        }\n+        //end npcbot\n         default:\n         {\n             maxPacketCounterAllowed = 100;\ndiff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp\nindex ad5984c5da..af871b71a3 100644\n--- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp\n+++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp\n@@ -44,6 +44,11 @@\n #include \"WorldPacket.h\"\n #include <numeric>\n \n+//npcbot\n+#include \"botconfig.h\"\n+#include \"botmgr.h\"\n+//end npcbot\n+\n //\n // EFFECT HANDLER NOTES\n //\n@@ -1849,6 +1854,10 @@ void AuraEffect::HandleAuraModShapeshift(AuraApplication const* aurApp, uint8 mo\n             case FORM_DEFENSIVESTANCE:\n             case FORM_BERSERKERSTANCE:\n             {\n+                //npcbot: skip this, handled inside class ai\n+                if (target->IsNPCBot())\n+                    break;\n+                //end npcbot\n                 uint32 Rage_val = 0;\n                 // Defensive Tactics\n                 if (form == FORM_DEFENSIVESTANCE)\n@@ -1884,6 +1893,10 @@ void AuraEffect::HandleAuraModShapeshift(AuraApplication const* aurApp, uint8 mo\n \n     if (target->GetTypeId() == TYPEID_PLAYER)\n         target->ToPlayer()->InitDataForForm();\n+    //npcbot: skip bots (handled inside AI)\n+    else if (target->GetTypeId() == TYPEID_UNIT && target->ToCreature()->IsNPCBotOrPet())\n+    {}\n+    //end npcbot\n     else\n         target->UpdateDisplayPower();\n \n@@ -1898,6 +1911,11 @@ void AuraEffect::HandleAuraModShapeshift(AuraApplication const* aurApp, uint8 mo\n         // and also HandleAuraModDisarm is not triggered\n         if (!target->CanUseAttackType(BASE_ATTACK))\n         {\n+            //npcbot: skip bots (handled inside AI)\n+            if (target->GetTypeId() == TYPEID_UNIT && target->ToCreature()->IsNPCBotOrPet())\n+            {}\n+            else\n+            //end npcbot\n             if (Item* pItem = target->ToPlayer()->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_MAINHAND))\n                 target->ToPlayer()->_ApplyWeaponDamage(EQUIPMENT_SLOT_MAINHAND, pItem->GetTemplate(), apply);\n         }\n@@ -2777,6 +2795,17 @@ void AuraEffect::HandleAuraModTotalThreat(AuraApplication const* aurApp, uint8 m\n \n     Unit* target = aurApp->GetTarget();\n \n+    //npcbot: handle for bots\n+    if (target->IsAlive() && target->GetTypeId() == TYPEID_UNIT &&\n+        target->ToCreature()->IsNPCBotOrPet())\n+    {\n+        Unit* caster = GetCaster();\n+        if (caster && caster->IsAlive())\n+            caster->GetThreatManager().UpdateMyTempModifiers();\n+        return;\n+    }\n+    //end npcbot\n+\n     if (!target->IsAlive() || target->GetTypeId() != TYPEID_PLAYER)\n         return;\n \n@@ -3156,6 +3185,17 @@ void AuraEffect::HandleAuraModEffectImmunity(AuraApplication const* aurApp, uint\n         else\n             sOutdoorPvPMgr->HandleDropFlag(player, GetSpellInfo()->Id);\n     }\n+\n+    //npcbot\n+    if (Creature* bot = target->ToCreature())\n+    {\n+        if (!apply && bot->IsNPCBot() && (GetSpellInfo()->AuraInterruptFlags & AURA_INTERRUPT_FLAG_IMMUNE_OR_LOST_SELECTION))\n+        {\n+            if (Battleground* botbg = bot->GetBotBG())\n+                botbg->EventBotDroppedFlag(bot);\n+        }\n+    }\n+    //end npcbot\n }\n \n void AuraEffect::HandleAuraModStateImmunity(AuraApplication const* aurApp, uint8 mode, bool apply) const\n@@ -5041,6 +5081,10 @@ void AuraEffect::HandlePeriodicTriggerSpellAuraTick(Unit* target, Unit* caster)\n \n     if (SpellInfo const* triggeredSpellInfo = sSpellMgr->GetSpellInfo(triggerSpellId))\n     {\n+        //npcbot: override spellInfo\n+        triggeredSpellInfo = triggeredSpellInfo->TryGetSpellInfoOverride(caster);\n+        //end npcbot\n+\n         if (Unit* triggerCaster = triggeredSpellInfo->NeedsToBeTriggeredByCaster(m_spellInfo) ? caster : target)\n         {\n             triggerCaster->CastSpell(target, triggerSpellId, this);\n@@ -5062,6 +5106,10 @@ void AuraEffect::HandlePeriodicTriggerSpellWithValueAuraTick(Unit* target, Unit*\n \n     if (SpellInfo const* triggeredSpellInfo = sSpellMgr->GetSpellInfo(triggerSpellId))\n     {\n+        //npcbot: override spellInfo\n+        triggeredSpellInfo = triggeredSpellInfo->TryGetSpellInfoOverride(caster);\n+        //end npcbot\n+\n         if (Unit* triggerCaster = triggeredSpellInfo->NeedsToBeTriggeredByCaster(m_spellInfo) ? caster : target)\n         {\n             CastSpellExtraArgs args(this);\n@@ -5103,6 +5151,14 @@ void AuraEffect::HandlePeriodicDamageAurasTick(Unit* target, Unit* caster) const\n \n     if (GetAuraType() == SPELL_AURA_PERIODIC_DAMAGE)\n     {\n+        //npcbot: Black Arrow damage on targets below 20%\n+        if (GetSpellInfo()->SpellFamilyName == SPELLFAMILY_WARLOCK && (GetSpellInfo()->SpellFamilyFlags[1] & 0x4) &&\n+            target->HasAuraState(AURA_STATE_HEALTHLESS_20_PERCENT))\n+        {\n+            damage *= 5;\n+        }\n+        //end npcbot\n+\n         // leave only target depending bonuses, rest is handled in calculate amount\n         if (GetBase()->GetType() == DYNOBJ_AURA_TYPE)\n             damage = caster->SpellDamageBonusDone(target, GetSpellInfo(), damage, DOT, GetSpellEffectInfo(), { }, GetBase()->GetStackAmount());\n@@ -5137,6 +5193,20 @@ void AuraEffect::HandlePeriodicDamageAurasTick(Unit* target, Unit* caster) const\n     if (crit)\n         damage = Unit::SpellCriticalDamageBonus(caster, m_spellInfo, damage, target);\n \n+    //NpcBot mod: apply bot damage mods\n+    if (caster && caster->IsNPCBotOrPet())\n+    {\n+        SpellNonMeleeDamage damageInfo(caster, target, m_spellInfo->Id, m_spellInfo->GetSchoolMask());\n+        int32 idamage = damage;\n+        caster->ToCreature()->ApplyBotDamageMultiplierSpell(idamage, damageInfo, m_spellInfo, BASE_ATTACK, crit);\n+        damage = std::max<int32>(idamage, 0);\n+        if (GetSpellInfo()->GetSchoolMask() & SPELL_SCHOOL_MASK_NORMAL)\n+            damage *= BotMgr::IsWanderingWorldBot(caster->ToCreature()) ? BotCfg::GetBotWandererDamageMod() : BotCfg::GetBotDamageModPhysical();\n+        else if (GetSpellInfo()->GetSchoolMask() & SPELL_SCHOOL_MASK_MAGIC)\n+            damage *= BotMgr::IsWanderingWorldBot(caster->ToCreature()) ? BotCfg::GetBotWandererDamageMod() : BotCfg::GetBotDamageModSpell();\n+    }\n+    //End NpcBot\n+\n     // Calculate armor mitigation\n     if (Unit::IsDamageReducedByArmor(GetSpellInfo()->GetSchoolMask(), GetSpellInfo()))\n     {\n@@ -5629,6 +5699,50 @@ void AuraEffect::HandleProcTriggerSpellAuraProc(AuraApplication* aurApp, ProcEve\n     if (SpellInfo const* triggeredSpellInfo = sSpellMgr->GetSpellInfo(triggerSpellId))\n     {\n         TC_LOG_DEBUG(\"spells.aura.effect\", \"AuraEffect::HandleProcTriggerSpellAuraProc: Triggering spell {} from aura {} proc\", triggeredSpellInfo->Id, GetId());\n+\n+        //npcbot: override spellInfo\n+        triggeredSpellInfo = triggeredSpellInfo->TryGetSpellInfoOverride(aurApp->GetBase()->GetCaster());\n+        //end npcbot\n+\n+        //npcbot\n+        Aura const* triggeredByAura = aurApp->GetBase();\n+        int32 basepoints0 = 0;\n+        switch (triggerSpellId)\n+        {\n+            // Quest - Self Healing from resurrect (invisible in log)\n+            case 25155:\n+            {\n+                switch (GetId())\n+                {\n+                    //Vampiric Aura\n+                    case 20810:\n+                    {\n+                        DamageInfo const* dinfo = eventInfo.GetDamageInfo();\n+                        uint32 damage = dinfo->GetDamage();\n+                        if (!damage)\n+                            return;\n+\n+                        // 100% / 25%\n+                        if (triggerTarget->GetGUID() == triggeredByAura->GetCasterGUID())\n+                            basepoints0 = int32(damage);\n+                        else\n+                            basepoints0 = int32(damage / 4);\n+\n+                        CastSpellExtraArgs args(true);\n+                        args.AddSpellBP0(basepoints0);\n+                        triggerCaster->CastSpell(triggerTarget, triggerSpellId, args);\n+                        return;\n+                    }\n+                    default:\n+                        break;\n+                }\n+                break;\n+            }\n+            default:\n+                break;\n+        }\n+        //end npcbot\n+\n         triggerCaster->CastSpell(triggerTarget, triggeredSpellInfo->Id, this);\n     }\n     else\n@@ -5649,6 +5763,10 @@ void AuraEffect::HandleProcTriggerSpellWithValueAuraProc(AuraApplication* aurApp\n \n     if (SpellInfo const* triggeredSpellInfo = sSpellMgr->GetSpellInfo(triggerSpellId))\n     {\n+        //npcbot: override spellInfo\n+        triggeredSpellInfo = triggeredSpellInfo->TryGetSpellInfoOverride(aurApp->GetBase()->GetCaster());\n+        //end npcbot\n+\n         CastSpellExtraArgs args(this);\n         args.AddSpellMod(SPELLVALUE_BASE_POINT0, GetAmount());\n         triggerCaster->CastSpell(triggerTarget, triggerSpellId, args);\ndiff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp\nindex 5065698e10..ff071fe632 100644\n--- a/src/server/game/Spells/Auras/SpellAuras.cpp\n+++ b/src/server/game/Spells/Auras/SpellAuras.cpp\n@@ -38,6 +38,10 @@\n #include \"World.h\"\n #include \"WorldPacket.h\"\n \n+//npcbot\n+#include \"botspell.h\"\n+//end npcbot\n+\n AuraCreateInfo::AuraCreateInfo(SpellInfo const* spellInfo, uint8 auraEffMask, WorldObject* owner) :\n     _spellInfo(spellInfo), _auraEffectMask(auraEffMask), _owner(owner)\n {\n@@ -568,6 +572,10 @@ void Aura::_ApplyForTarget(Unit* target, Unit* caster, AuraApplication* auraApp)\n             caster->GetSpellHistory()->StartCooldown(m_spellInfo, castItem ? castItem->GetEntry() : 0, nullptr, true);\n         }\n     }\n+    //npcbot: infinity cd for bots\n+    if (caster && m_spellInfo->IsCooldownStartedOnEvent() && caster->IsNPCBot())\n+        caster->ToCreature()->AddBotSpellCooldown(m_spellInfo->Id, std::numeric_limits<uint32>::max());\n+    //end npcbot\n }\n \n void Aura::_UnapplyForTarget(Unit* target, Unit* caster, AuraApplication* auraApp)\n@@ -596,6 +604,11 @@ void Aura::_UnapplyForTarget(Unit* target, Unit* caster, AuraApplication* auraAp\n     if (caster && GetSpellInfo()->IsCooldownStartedOnEvent())\n         // note: item based cooldowns and cooldown spell mods with charges ignored (unknown existed cases)\n         caster->GetSpellHistory()->SendCooldownEvent(GetSpellInfo());\n+\n+    //npcbot: release cd state for bots\n+    if (caster && m_spellInfo->IsCooldownStartedOnEvent() && caster->IsNPCBot())\n+        caster->ToCreature()->ReleaseBotSpellCooldown(m_spellInfo->Id);\n+    //end npcbot\n }\n \n // removes aura from all targets\n@@ -947,6 +960,14 @@ uint8 Aura::CalcMaxCharges(Unit* caster) const\n     if (SpellProcEntry const* procEntry = sSpellMgr->GetSpellProcEntry(GetId()))\n         maxProcCharges = procEntry->Charges;\n \n+    //npcbot: override spell proc\n+    if (caster && caster->IsNPCBot())\n+    {\n+        if (SpellProcEntry const* procOverride = GetBotSpellProceEntryOverride(GetId()))\n+            maxProcCharges = procOverride->Charges;\n+    }\n+    //end npcbot\n+\n     if (caster)\n         if (Player* modOwner = caster->GetSpellModOwner())\n             modOwner->ApplySpellMod(GetId(), SPELLMOD_CHARGES, maxProcCharges);\n@@ -1655,6 +1676,20 @@ void Aura::HandleAuraSpecificMods(AuraApplication const* aurApp, Unit* caster, b\n                     case 47788: // Guardian Spirit\n                         if (removeMode != AURA_REMOVE_BY_EXPIRE)\n                             break;\n+\n+                        //npcbot: handle Glyph of Guardian Spirit proc for bots\n+                        if (Creature* bot = caster->ToCreature())\n+                        {\n+                            if (bot->IsNPCBot() && bot->HasSpellCooldown(47788))\n+                            {\n+                                bot->AddBotSpellCooldown(47788, 60000);\n+                                bot->GetSpellHistory()->ResetCooldown(GetSpellInfo()->Id, true);\n+                                bot->GetSpellHistory()->AddCooldown(GetSpellInfo()->Id, 0, std::chrono::seconds(60));\n+                                break;\n+                            }\n+                        }\n+                        //end npcbot\n+\n                         if (caster->GetTypeId() != TYPEID_PLAYER)\n                             break;\n \n@@ -1992,6 +2027,16 @@ void Aura::PrepareProcToTrigger(AuraApplication* aurApp, ProcEventInfo& eventInf\n     }\n \n     SpellProcEntry const* procEntry = sSpellMgr->GetSpellProcEntry(GetId());\n+\n+    //npcbot: override spell proc\n+    Unit const* caster = aurApp && aurApp->GetBase()->GetCasterGUID().IsCreature() ? aurApp->GetBase()->GetCaster() : nullptr;\n+    if (caster && caster->IsNPCBot())\n+    {\n+        if (SpellProcEntry const* procOverride = GetBotSpellProceEntryOverride(GetId()))\n+            procEntry = procOverride;\n+    }\n+    //end npcbot\n+\n     ASSERT(procEntry);\n \n     // cooldowns should be added to the whole aura (see 51698 area aura)\n@@ -2001,6 +2046,16 @@ void Aura::PrepareProcToTrigger(AuraApplication* aurApp, ProcEventInfo& eventInf\n uint8 Aura::GetProcEffectMask(AuraApplication* aurApp, ProcEventInfo& eventInfo, TimePoint now) const\n {\n     SpellProcEntry const* procEntry = sSpellMgr->GetSpellProcEntry(GetId());\n+\n+    //npcbot: override spell proc\n+    Unit const* caster = aurApp && aurApp->GetBase()->GetCasterGUID().IsCreature() ? aurApp->GetBase()->GetCaster() : nullptr;\n+    if (caster && caster->IsNPCBot())\n+    {\n+        if (SpellProcEntry const* procOverride = GetBotSpellProceEntryOverride(GetId()))\n+            procEntry = procOverride;\n+    }\n+    //end npcbot\n+\n     // only auras with spell proc entry can trigger proc\n     if (!procEntry)\n         return 0;\ndiff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp\nindex eb88a41996..f5612dbc09 100644\n--- a/src/server/game/Spells/Spell.cpp\n+++ b/src/server/game/Spells/Spell.cpp\n@@ -65,6 +65,10 @@\n #include \"WorldPacket.h\"\n #include \"WorldSession.h\"\n \n+//npcbot\n+#include \"botmgr.h\"\n+//end npcbot\n+\n extern SpellEffectHandlerFn SpellEffectHandlers[TOTAL_SPELL_EFFECTS];\n \n SpellDestination::SpellDestination()\n@@ -506,7 +510,12 @@ protected:\n };\n \n Spell::Spell(WorldObject* caster, SpellInfo const* info, TriggerCastFlags triggerFlags, ObjectGuid originalCasterGUID) :\n+//npcbot: override spellInfo\n+/*\n m_spellInfo(sSpellMgr->GetSpellForDifficultyFromSpell(info, caster)),\n+*/\n+m_spellInfo((caster->IsNPCBot() ? info : sSpellMgr->GetSpellForDifficultyFromSpell(info, caster))->TryGetSpellInfoOverride(caster)),\n+//end npcbot\n m_caster((info->HasAttribute(SPELL_ATTR6_CAST_BY_CHARMER) && caster->GetCharmerOrOwner()) ? caster->GetCharmerOrOwner() : caster)\n , m_spellValue(new SpellValue(m_spellInfo)), _spellEvent(nullptr)\n {\n@@ -539,6 +548,15 @@ m_caster((info->HasAttribute(SPELL_ATTR6_CAST_BY_CHARMER) && caster->GetCharmerO\n                     m_spellSchoolMask = SpellSchoolMask(1 << pItem->GetTemplate()->Damage[0].DamageType);\n     }\n \n+    //npcbot: ranged weapon dmg school\n+    if (m_attackType == RANGED_ATTACK && m_caster->IsNPCBot() &&\n+        ((1<<(m_caster->ToCreature()->GetBotClass()-1)) & CLASSMASK_WAND_USERS))\n+    {\n+        if (Item const* pItem = m_caster->ToCreature()->GetBotEquips(2))\n+            m_spellSchoolMask = SpellSchoolMask(1 << pItem->GetTemplate()->Damage[0].DamageType);\n+    }\n+    //end npcbot\n+\n     if (!originalCasterGUID.IsEmpty())\n         m_originalCasterGUID = originalCasterGUID;\n     else\n@@ -1236,6 +1254,12 @@ void Spell::SelectImplicitConeTargets(SpellEffectInfo const& spellEffectInfo, Sp\n             {\n                 if (Unit* unitCaster = m_caster->ToUnit())\n                     maxTargets += unitCaster->GetTotalAuraModifierByAffectMask(SPELL_AURA_MOD_MAX_AFFECTED_TARGETS, m_spellInfo);\n+\n+                //npcbot - apply bot spell max targets mods\n+                if (m_caster->IsNPCBot())\n+                    m_caster->ToCreature()->ApplyCreatureSpellMaxTargetsMods(m_spellInfo, maxTargets);\n+                //end npcbot\n+\n                 Trinity::Containers::RandomResize(targets, maxTargets);\n             }\n \n@@ -1542,6 +1566,10 @@ void Spell::SelectImplicitCasterObjectTargets(SpellEffectInfo const& spellEffect\n         case TARGET_UNIT_PET:\n             if (Unit* unitCaster = m_caster->ToUnit())\n                 target = unitCaster->GetGuardianPet();\n+            //npcbot: allow bot pet as target\n+            if (!target && m_caster->IsNPCBot())\n+                target = m_caster->ToCreature()->GetBotsPet();\n+            //end npcbot\n             break;\n         case TARGET_UNIT_SUMMONER:\n             if (Unit* unitCaster = m_caster->ToUnit())\n@@ -1609,6 +1637,11 @@ void Spell::SelectImplicitChainTargets(SpellEffectInfo const& spellEffectInfo, S\n     if (Player* modOwner = m_caster->GetSpellModOwner())\n         modOwner->ApplySpellMod(m_spellInfo->Id, SPELLMOD_JUMP_TARGETS, maxTargets, this);\n \n+    //npcbot - apply bot spell max targets mods\n+    if (m_caster->IsNPCBot())\n+        m_caster->ToCreature()->ApplyCreatureSpellMaxTargetsMods(m_spellInfo, maxTargets);\n+    //end npcbot\n+\n     if (maxTargets > 1)\n     {\n         // mark damage multipliers as used\n@@ -1673,7 +1706,13 @@ void Spell::SelectImplicitTrajTargets(SpellEffectInfo const& spellEffectInfo, Sp\n     // limit max range to 300 yards, sometimes triggered spells can have 50000yds\n     float bestDist = m_spellInfo->GetMaxRange(false);\n     if (SpellInfo const* triggerSpellInfo = sSpellMgr->GetSpellInfo(spellEffectInfo.TriggerSpell))\n+    {\n+        //npcbot: override spellInfo\n+        triggerSpellInfo = triggerSpellInfo->TryGetSpellInfoOverride(GetCaster());\n+        //end npcbot\n+\n         bestDist = std::min(std::max(bestDist, triggerSpellInfo->GetMaxRange(false)), std::min(dist2d, 300.0f));\n+    }\n \n     // GameObjects don't cast traj\n     Unit* unitCaster = ASSERT_NOTNULL(m_caster->ToUnit());\n@@ -1851,7 +1890,14 @@ uint32 Spell::GetSearcherTypeMask(SpellTargetObjectTypes objType, ConditionConta\n     }\n \n     if (m_spellInfo->HasAttribute(SPELL_ATTR3_ONLY_TARGET_PLAYERS))\n+    {\n+        //npcbot: do not exclude creatures, see WorldObjectSpellNearbyTargetCheck, WorldObjectSpellAreaTargetCheck\n+        if (retMask & GRID_MAP_TYPE_MASK_CREATURE)\n+            retMask &= GRID_MAP_TYPE_MASK_CORPSE | GRID_MAP_TYPE_MASK_PLAYER | GRID_MAP_TYPE_MASK_CREATURE;\n+        else\n+        //end npcbot\n         retMask &= GRID_MAP_TYPE_MASK_CORPSE | GRID_MAP_TYPE_MASK_PLAYER;\n+    }\n     if (m_spellInfo->HasAttribute(SPELL_ATTR3_ONLY_TARGET_GHOSTS))\n         retMask &= GRID_MAP_TYPE_MASK_PLAYER;\n \n@@ -2417,6 +2463,10 @@ void Spell::TargetInfo::PreprocessTarget(Spell* spell)\n         // but respect current pvp rules (buffing/healing npcs flagged for pvp only flags you if they are in combat)\n         if (unit->IsPvP() && (unit->IsInCombat() || unit->IsCharmedOwnedByPlayerOrPlayer()) && spell->m_caster->GetTypeId() == TYPEID_PLAYER)\n             _enablePVP = true; // Decide on PvP flagging now, but act on it later.\n+        //npcbot\n+        else if (unit->IsPvP() && (unit->IsInCombat() || unit->IsNPCBotOrPet()) && spell->m_caster->GetTypeId() == TYPEID_PLAYER)\n+            _enablePVP = true; // Decide on PvP flagging now, but act on it later.\n+        //end npcbot\n \n         SpellMissInfo missInfo = spell->PreprocessSpellHit(_spellHitTarget, ScaleAura, *this);\n         if (missInfo != SPELL_MISS_NONE)\n@@ -2647,6 +2697,13 @@ void Spell::TargetInfo::DoDamageAndTriggers(Spell* spell)\n                     if (!spell->m_spellInfo->HasAttribute(SPELL_ATTR0_STOP_ATTACK_TARGET) && !spell->m_spellInfo->HasAttribute(SPELL_ATTR4_CANT_TRIGGER_ITEM_SPELLS))\n                         caster->ToPlayer()->CastItemCombatSpell(*spellDamageInfo);\n             }\n+\n+            //npcbot\n+            if (caster->IsNPCBot() && (procSpellType & (PROC_SPELL_TYPE_DAMAGE | PROC_SPELL_TYPE_NO_DMG_HEAL)) &&\n+                !(spell->m_spellInfo->Attributes & SPELL_ATTR0_STOP_ATTACK_TARGET) && !spell->m_spellInfo->HasAttribute(SPELL_ATTR4_CANT_TRIGGER_ITEM_SPELLS) &&\n+                (spell->m_spellInfo->DmgClass == SPELL_DAMAGE_CLASS_MELEE || spell->m_spellInfo->DmgClass == SPELL_DAMAGE_CLASS_RANGED))\n+                caster->ToCreature()->CastCreatureItemCombatSpell(*spellDamageInfo);\n+            //end npcbot\n         }\n \n         // set hitmask for finish procs\n@@ -2683,6 +2740,15 @@ void Spell::TargetInfo::DoDamageAndTriggers(Spell* spell)\n         else if (spell->m_caster->GetTypeId() == TYPEID_GAMEOBJECT && spell->m_caster->ToGameObject()->AI())\n             spell->m_caster->ToGameObject()->AI()->SpellHitTarget(_spellHitTarget, spell->m_spellInfo);\n \n+        //npcbot: vehicle spell hits\n+        if (spell->m_caster->GetTypeId() == TYPEID_UNIT && spell->m_caster->ToCreature()->IsVehicle() && spell->m_caster->ToCreature()->GetCharmerGUID().IsCreature())\n+        {\n+            Unit const* bot = spell->m_caster->ToCreature()->GetCharmer();\n+            if (bot && bot->IsNPCBot())\n+                bot->ToCreature()->AI()->SpellHitTarget(_spellHitTarget, spell->m_spellInfo);\n+        }\n+        //end npcbot\n+\n         if (HitAura)\n         {\n             if (AuraApplication* aurApp = HitAura->GetApplicationOfTarget(_spellHitTarget->GetGUID()))\n@@ -2800,6 +2866,27 @@ SpellMissInfo Spell::PreprocessSpellHit(Unit* unit, bool scaleAura, TargetInfo&\n             // assisting case, healing and resurrection\n             if (unit->HasUnitState(UNIT_STATE_ATTACK_PLAYER))\n             {\n+                //npcbot: bot assist case\n+                if (m_caster->IsNPCBotOrPet() && (unit->IsNPCBotOrPet() || unit->IsPlayer()))\n+                {\n+                    if (m_caster->ToCreature()->IsFreeBot())\n+                    {\n+                        Unit const* bot = m_caster->IsNPCBotPet() ? m_caster->ToUnit()->GetCreator() : m_caster->ToUnit();\n+                        if (bot && bot->IsNPCBot())\n+                            BotMgr::SetBotContestedPvP(bot->ToCreature());\n+                    }\n+                    else\n+                    {\n+                        if (Player const* pOwner = m_caster->ToUnit()->GetCreator() ? m_caster->ToUnit()->GetCreator()->ToPlayer() : nullptr)\n+                        {\n+                            Unit* bot = m_caster->IsNPCBotPet() ? static_cast<Unit*>(pOwner->GetBotMgr()->GetBot(m_caster->GetOwnerGUID())) : m_caster->ToUnit();\n+                            if (bot && bot->IsNPCBot())\n+                                BotMgr::SetBotContestedPvP(bot->ToCreature());\n+                        }\n+                    }\n+                }\n+                else\n+                //end npcbot\n                 if (Player* playerOwner = m_caster->GetCharmerOrOwnerPlayerOrPlayerItself())\n                 {\n                     playerOwner->SetContestedPvP();\n@@ -2811,6 +2898,10 @@ SpellMissInfo Spell::PreprocessSpellHit(Unit* unit, bool scaleAura, TargetInfo&\n             {\n                 if (m_originalCaster->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED)) // only do explicit combat forwarding for PvP enabled units\n                     m_originalCaster->GetCombatManager().InheritCombatStatesFrom(unit);    // for creature v creature combat, the threat forward does it for us\n+                //npcbot\n+                else if (m_originalCaster->IsNPCBotOrPet())\n+                    m_originalCaster->GetCombatManager().InheritCombatStatesFrom(unit);\n+                //end npcbot\n                 unit->GetThreatManager().ForwardThreatForAssistingMe(m_originalCaster, 0.0f, nullptr, true);\n             }\n         }\n@@ -3029,6 +3120,11 @@ bool Spell::UpdateChanneledTargetList()\n         if (Player* modOwner = m_caster->GetSpellModOwner())\n             modOwner->ApplySpellMod(m_spellInfo->Id, SPELLMOD_RANGE, range, this);\n \n+        //npcbot: apply range mods\n+        if (m_caster->IsNPCBot())\n+            m_caster->ToCreature()->ApplyCreatureSpellRangeMods(m_spellInfo, range);\n+        //end npcbot\n+\n         // add little tolerance level\n         range += std::min(MAX_SPELL_RANGE_TOLERANCE, range*0.1f); // 10% but no more than MAX_SPELL_RANGE_TOLERANCE\n     }\n@@ -3392,6 +3488,11 @@ void Spell::_cast(bool skipCheck)\n             SendCastResult(res, p1, p2);\n             SendInterrupted(res);\n \n+            //npcbot - hook for spellcast finish (unsuccessful)\n+            if (m_caster->IsNPCBotOrPet())\n+                BotMgr::OnBotSpellGo(m_caster->ToCreature(), this, false);\n+            //end npcbot\n+\n             if (modOwner)\n                 modOwner->SetSpellModTakingSpell(this, false);\n \n@@ -3547,6 +3648,17 @@ void Spell::_cast(bool skipCheck)\n         handle_immediate();\n     }\n \n+    //npcbot - hook for spellcast finish\n+    if (m_caster->GetTypeId() == TYPEID_UNIT && m_caster->ToCreature()->IsNPCBotOrPet())\n+        BotMgr::OnBotSpellGo(m_caster->ToCreature(), this);\n+    //npcbot - hook for master's spellcast finish\n+    else if (m_caster->GetTypeId() == TYPEID_PLAYER && m_caster->ToPlayer()->HaveBot())\n+        BotMgr::OnBotOwnerSpellGo(m_caster->ToPlayer(), this);\n+    //npcbot - hook for master's vehicle spellcast finish\n+    else if (m_caster->ToUnit() && m_caster->ToUnit()->IsVehicle())\n+        BotMgr::OnVehicleSpellGo(m_caster->ToUnit(), this);\n+    //end npcbot\n+\n     CallScriptAfterCastHandlers();\n \n     if (std::vector<int32> const* spell_triggered = sSpellMgr->GetSpellLinked(m_spellInfo->Id))\n@@ -3826,6 +3938,11 @@ void Spell::SendSpellCooldown()\n     if (m_caster->GetTypeId() == TYPEID_GAMEOBJECT)\n         return;\n \n+    //npcbot: handled by AI\n+    if (m_caster->IsNPCBotOrPet())\n+        return;\n+    //end npcbot\n+\n     m_caster->ToUnit()->GetSpellHistory()->HandleCooldowns(m_spellInfo, m_CastItem, this);\n }\n \n@@ -3901,6 +4018,10 @@ void Spell::update(uint32 difftime)\n                 if (Creature* creatureCaster = m_caster->ToCreature())\n                     if (creatureCaster->IsAIEnabled())\n                         creatureCaster->AI()->OnChannelFinished(m_spellInfo);\n+                //npcbot: signal channel finish to botmgr\n+                if (m_caster->IsNPCBot())\n+                    BotMgr::OnBotChannelFinish(m_caster->ToUnit(), this);\n+                //end npcbot\n             }\n             break;\n         }\n@@ -3941,6 +4062,11 @@ void Spell::finish(bool ok)\n     if (Creature* creatureCaster = unitCaster->ToCreature())\n         creatureCaster->ReleaseSpellFocus(this);\n \n+    //npcbot\n+    if (!ok && unitCaster->IsNPCBotOrPet())\n+        BotMgr::OnBotSpellGo(unitCaster, this, false);\n+    //end npcbot\n+\n     if (!ok)\n         return;\n \n@@ -3991,6 +4117,9 @@ void Spell::finish(bool ok)\n \n     // Stop Attack for some spells\n     if (m_spellInfo->HasAttribute(SPELL_ATTR0_STOP_ATTACK_TARGET))\n+    //npcbot: disable for npcbots\n+    if (!unitCaster->IsNPCBot())\n+    //end npcbot\n         unitCaster->AttackStop();\n }\n \n@@ -4849,9 +4978,38 @@ void Spell::TakePower()\n         }\n     }\n \n+    //npcbot: handle SPELLMOD_SPELL_COST_REFUND_ON_FAIL (druid Primal Precision)\n+    if (m_caster->IsNPCBot() && m_caster->ToCreature()->GetBotClass() == CLASS_DRUID)\n+    {\n+        if (powerType == POWER_ENERGY/* || powerType == POWER_RAGE || powerType == POWER_RUNE*/)\n+        {\n+            if (ObjectGuid targetGUID = m_targets.GetUnitTargetGUID(); !targetGUID.IsEmpty())\n+            {\n+                for (std::vector<TargetInfo>::iterator ihit= m_UniqueTargetInfo.begin(); ihit != m_UniqueTargetInfo.end(); ++ihit)\n+                {\n+                    if (ihit->TargetGUID == targetGUID && ihit->MissCondition != SPELL_MISS_NONE)\n+                    {\n+                        hit = false;\n+                        //Primal Precision: 80% refund\n+                        if ((m_spellInfo->SpellFamilyFlags[0] & 0x800000) || (m_spellInfo->SpellFamilyFlags[1] & 0x10000080))\n+                            m_powerCost = m_powerCost / 5;\n+                    }\n+                    break;\n+                }\n+            }\n+        }\n+    }\n+    //end npcbot\n+\n     if (powerType == POWER_RUNE)\n     {\n         TakeRunePower(hit);\n+\n+        //npcbot: spend runes (pass hit result)\n+        if (m_caster->IsNPCBot() && m_caster->ToCreature()->GetBotClass() == CLASS_DEATH_KNIGHT)\n+            m_caster->ToCreature()->SpendBotRunes(m_spellInfo, hit);\n+        //end npcbot\n+\n         return;\n     }\n \n@@ -5208,6 +5366,17 @@ SpellCastResult Spell::CheckCast(bool strict, uint32* param1 /*= nullptr*/, uint\n             else\n                 return SPELL_FAILED_NOT_READY;\n         }\n+\n+        //npcbot\n+        if (m_caster->IsNPCBot() && m_caster->ToCreature()->HasSpellCooldown(m_spellInfo->Id) && !IsIgnoringCooldowns())\n+        {\n+            //TC_LOG_ERROR(\"spells\", \"{} has cd of {} on {}\", m_caster->GetName().c_str(), m_caster->ToCreature()->GetCreatureSpellCooldownDelay(m_spellInfo->Id), m_spellInfo->SpellName[0]);\n+            if (m_triggeredByAuraSpell)\n+                return SPELL_FAILED_DONT_REPORT;\n+            //else\n+            //    return SPELL_FAILED_NOT_READY;\n+        }\n+        //end npcbot\n     }\n \n     if (m_spellInfo->HasAttribute(SPELL_ATTR7_IS_CHEAT_SPELL) && m_caster->IsUnit() && !m_caster->ToUnit()->HasUnitFlag2(UNIT_FLAG2_ALLOW_CHEAT_SPELLS))\n@@ -5410,6 +5579,11 @@ SpellCastResult Spell::CheckCast(bool strict, uint32* param1 /*= nullptr*/, uint\n         {\n             if (spellEffectInfo.TargetA.GetTarget() == TARGET_UNIT_PET)\n             {\n+                //npcbot: allow bot pet as target\n+                if (m_caster->IsNPCBot() && m_caster->ToCreature()->GetBotsPet())\n+                    break;\n+                else\n+                //end npcbot\n                 if (!unitCaster->GetGuardianPet())\n                 {\n                     if (m_triggeredByAuraSpell)              // not report pet not existence for triggered spells\n@@ -5437,6 +5611,11 @@ SpellCastResult Spell::CheckCast(bool strict, uint32* param1 /*= nullptr*/, uint\n         }\n \n     // zone check\n+    //npcbot: do not check location for bots (to avoid crash introduced in TC rev. 5cb8409f1ee57e8d)\n+    if (m_caster->IsNPCBot())\n+    {}\n+    else\n+    //end npcbot\n     if (m_caster->GetTypeId() != TYPEID_PLAYER || !m_caster->ToPlayer()->IsGameMaster())\n     {\n         uint32 zone, area;\n@@ -5720,6 +5899,15 @@ SpellCastResult Spell::CheckCast(bool strict, uint32* param1 /*= nullptr*/, uint\n                     spellEffectInfo.TargetA.GetTarget() != TARGET_GAMEOBJECT_ITEM_TARGET)\n                     break;\n \n+                //npcbot\n+                if (m_caster->IsNPCBot())\n+                {\n+                    if (spellEffectInfo.TargetA.GetTarget() == TARGET_GAMEOBJECT_TARGET && !m_targets.GetGOTarget())\n+                        return SPELL_FAILED_BAD_TARGETS;\n+                    break;\n+                }\n+                //end npcbot\n+\n                 if (m_caster->GetTypeId() != TYPEID_PLAYER  // only players can open locks, gather etc.\n                     // we need a go target in case of TARGET_GAMEOBJECT_TARGET\n                     || (spellEffectInfo.TargetA.GetTarget() == TARGET_GAMEOBJECT_TARGET && !m_targets.GetGOTarget()))\n@@ -6061,6 +6249,13 @@ SpellCastResult Spell::CheckCast(bool strict, uint32* param1 /*= nullptr*/, uint\n \n                     if (!target->GetCharmerGUID().IsEmpty())\n                         return SPELL_FAILED_CANT_BE_CHARMED;\n+ \n+                    //npcbot: do not allow to charm owned npcbots\n+                    if (target->GetCreator() && target->GetCreator()->IsPlayer())\n+                        return SPELL_FAILED_TARGET_IS_PLAYER_CONTROLLED;\n+                    else if (target->IsNPCBotOrPet())\n+                        return SPELL_FAILED_CANT_BE_CHARMED;\n+                    //end npcbot\n \n                     if (target->GetOwner() && target->GetOwner()->GetTypeId() == TYPEID_PLAYER)\n                         return SPELL_FAILED_TARGET_IS_PLAYER_CONTROLLED;\n@@ -6175,6 +6370,14 @@ SpellCastResult Spell::CheckCast(bool strict, uint32* param1 /*= nullptr*/, uint\n     {\n         if (Unit* unitCaster = m_caster->ToUnit())\n         {\n+            //npcbot\n+            if (unitCaster->IsNPCBot())\n+            {\n+                if (!unitCaster->ToCreature()->GetCreatureComboPoints())\n+                    return SPELL_FAILED_NO_COMBO_POINTS;\n+            }\n+            else\n+            //end npcbot\n             if (m_spellInfo->NeedsExplicitUnitTarget())\n             {\n                 if (!unitCaster->GetComboPoints(m_targets.GetUnitTarget()))\n@@ -6543,6 +6746,11 @@ SpellCastResult Spell::CheckRange(bool strict) const\n     float minRange, maxRange;\n     std::tie(minRange, maxRange) = GetMinMaxRange(strict);\n \n+    //npcbot: apply range mods\n+    if (m_caster->IsNPCBot())\n+        m_caster->ToCreature()->ApplyCreatureSpellRangeMods(m_spellInfo, maxRange);\n+    //end npcbot\n+\n     // dont check max_range to strictly after cast\n     if (m_spellInfo->RangeEntry && m_spellInfo->RangeEntry->Flags != SPELL_RANGE_MELEE && !strict)\n         maxRange += std::min(MAX_SPELL_RANGE_TOLERANCE, maxRange*0.1f); // 10% but no more than MAX_SPELL_RANGE_TOLERANCE\n@@ -6567,6 +6775,14 @@ SpellCastResult Spell::CheckRange(bool strict) const\n \n     if (GameObject* goTarget = m_targets.GetGOTarget())\n     {\n+        //npcbot\n+        if (!m_caster->IsPlayer())\n+        {\n+            if (!goTarget->IsAtInteractDistance(*m_caster, m_spellInfo->GetMaxRange(m_spellInfo->IsPositive())))\n+                return SPELL_FAILED_OUT_OF_RANGE;\n+        }\n+        else\n+        //end npcbot\n         if (!goTarget->IsAtInteractDistance(m_caster->ToPlayer(), m_spellInfo))\n             return SPELL_FAILED_OUT_OF_RANGE;\n     }\n@@ -7258,6 +7474,37 @@ SpellCastResult Spell::CheckItems(uint32* param1 /*= nullptr*/, uint32* param2 /\n \n void Spell::Delayed() // only called in DealDamage()\n {\n+    //npcbot\n+    if (m_caster->IsNPCBot() && (m_spellInfo->InterruptFlags & SPELL_INTERRUPT_FLAG_PUSH_BACK) && !IsDelayableNoMore())\n+    {\n+        Creature* creature = m_caster->ToCreature();\n+        int32 delaytime = 500;\n+\n+        int32 delayReduce = 100;\n+        creature->ApplyCreatureSpellNotLoseCastTimeMods(m_spellInfo, delayReduce);\n+        delayReduce += creature->GetTotalAuraModifier(SPELL_AURA_REDUCE_PUSHBACK) - 100;\n+        if (delayReduce >= 100)\n+            return;\n+\n+        AddPct(delaytime, -delayReduce);\n+\n+        if (m_timer + delaytime > m_casttime)\n+        {\n+            delaytime = m_casttime - m_timer;\n+            m_timer = m_casttime;\n+        }\n+        else\n+            m_timer += delaytime;\n+\n+        WorldPacket data(SMSG_SPELL_DELAYED, 8+4);\n+        data << creature->GetPackGUID();\n+        data << uint32(delaytime);\n+\n+        creature->SendMessageToSet(&data, true);\n+        return;\n+    }\n+    //end npcbot\n+\n     Player* playerCaster = m_caster->ToPlayer();\n     if (!playerCaster)\n         return;\n@@ -7297,6 +7544,43 @@ void Spell::Delayed() // only called in DealDamage()\n \n void Spell::DelayedChannel()\n {\n+    //npcbot\n+    if (m_caster->IsNPCBot() && m_spellState == SPELL_STATE_CASTING && (m_spellInfo->ChannelInterruptFlags & CHANNEL_FLAG_DELAY) && !IsDelayableNoMore())\n+    {\n+        Creature* creature = m_caster->ToCreature();\n+        int32 duration = ((m_channeledDuration > 0) ? m_channeledDuration : m_spellInfo->GetDuration());\n+\n+        int32 delaytime = CalculatePct(duration, 25);\n+\n+        int32 delayReduce = 100;\n+        creature->ApplyCreatureSpellNotLoseCastTimeMods(m_spellInfo, delayReduce);\n+        delayReduce += creature->GetTotalAuraModifier(SPELL_AURA_REDUCE_PUSHBACK) - 100;\n+        if (delayReduce >= 100)\n+            return;\n+\n+        AddPct(delaytime, -delayReduce);\n+\n+        if (m_timer <= delaytime)\n+        {\n+            delaytime = m_timer;\n+            m_timer = 0;\n+        }\n+        else\n+            m_timer -= delaytime;\n+\n+        for (TargetInfo const& targetInfo : m_UniqueTargetInfo)\n+            if (targetInfo.MissCondition == SPELL_MISS_NONE)\n+                if (Unit* unit = (creature->GetGUID() == targetInfo.TargetGUID) ? creature : ObjectAccessor::GetUnit(*creature, targetInfo.TargetGUID))\n+                    unit->DelayOwnedAuras(m_spellInfo->Id, m_originalCasterGUID, delaytime);\n+\n+        if (DynamicObject* dynObj = creature->GetDynObject(m_spellInfo->Id))\n+            dynObj->Delay(delaytime);\n+\n+        SendChannelUpdate(m_timer);\n+        return;\n+    }\n+    //end npcbot\n+\n     Player* playerCaster = m_caster->ToPlayer();\n     if (!playerCaster)\n         return;\n@@ -7868,6 +8152,13 @@ SpellCastResult Spell::CanOpenLock(SpellEffectInfo const& spellEffectInfo, uint3\n                     skillValue = m_CastItem || m_caster->GetTypeId() != TYPEID_PLAYER ?\n                         0 : m_caster->ToPlayer()->GetSkillValue(skillId);\n \n+                    //npcbot: use bot skill if cast through gossip\n+                    if (!m_originalCasterGUID.IsEmpty())\n+                        if (Unit const* unit = ObjectAccessor::GetUnit(*m_caster, m_originalCasterGUID))\n+                            if (unit->GetTypeId() == TYPEID_UNIT && unit->ToCreature()->GetBotClass() == CLASS_ROGUE)\n+                                skillValue = std::max<int32>(skillValue, int32(unit->GetLevel() * 5));\n+                    //end npcbot\n+\n                     // skill bonus provided by casting spell (mostly item spells)\n                     // add the effect base points modifier from the spell cast (cheat lock / skeleton key etc.)\n                     if (spellEffectInfo.TargetA.GetTarget() == TARGET_GAMEOBJECT_ITEM_TARGET || spellEffectInfo.TargetB.GetTarget() == TARGET_GAMEOBJECT_ITEM_TARGET)\n@@ -8440,6 +8731,11 @@ WorldObjectSpellNearbyTargetCheck::WorldObjectSpellNearbyTargetCheck(float range\n \n bool WorldObjectSpellNearbyTargetCheck::operator()(WorldObject* target)\n {\n+    //npcbot: custom check 1 for targeting bots by spells with SPELL_ATTR3_ONLY_TARGET_PLAYERS\n+    if (_spellInfo->HasAttribute(SPELL_ATTR3_ONLY_TARGET_PLAYERS) && target->GetTypeId() == TYPEID_UNIT && !target->IsNPCBot())\n+        return false;\n+    //end npcbot\n+\n     float dist = target->GetDistance(*_position);\n     if (dist < _range && WorldObjectSpellTargetCheck::operator ()(target))\n     {\n@@ -8464,6 +8760,11 @@ bool WorldObjectSpellAreaTargetCheck::operator()(WorldObject* target) const\n     }\n     else\n     {\n+        //npcbot: custom check 2 for targeting bots by spells with SPELL_ATTR3_ONLY_TARGET_PLAYERS\n+        if (_spellInfo->HasAttribute(SPELL_ATTR3_ONLY_TARGET_PLAYERS) && target->GetTypeId() == TYPEID_UNIT && !target->IsNPCBot())\n+            return false;\n+        //end npcbot\n+\n         bool isInsideCylinder = target->IsWithinDist2d(_position, _range) && std::abs(target->GetPositionZ() - _position->GetPositionZ()) <= _range;\n         if (!isInsideCylinder)\n             return false;\ndiff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h\nindex f14e83c167..ec87c4eafa 100644\n--- a/src/server/game/Spells/Spell.h\n+++ b/src/server/game/Spells/Spell.h\n@@ -417,6 +417,9 @@ class TC_GAME_API Spell\n \n         UsedSpellMods m_appliedMods;\n \n+        //npcbot\n+        int32 GetTimer() const { return m_timer; }\n+        //end npcbot\n         int32 GetCastTime() const { return m_casttime; }\n         bool IsAutoRepeat() const { return m_autoRepeat; }\n         void SetAutoRepeat(bool rep) { m_autoRepeat = rep; }\ndiff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp\nindex e770665749..690e2ff164 100644\n--- a/src/server/game/Spells/SpellEffects.cpp\n+++ b/src/server/game/Spells/SpellEffects.cpp\n@@ -488,6 +488,17 @@ void Spell::EffectSchoolDMG()\n                     damage += int32(energy * multiple);\n                     damage += int32(CalculatePct(unitCaster->ToPlayer()->GetComboPoints() * ap, 7));\n                 }\n+                //npcbot: Ferocious Bite support\n+                else if (unitCaster->IsNPCBot() && (m_spellInfo->SpellFamilyFlags[0] & 0x800000) && m_spellInfo->SpellVisual[0] == 6587)\n+                {\n+                    // converts each extra point of energy into ($f1+$AP/410) additional damage\n+                    float ap = unitCaster->GetTotalAttackPowerValue(BASE_ATTACK);\n+                    float multiple = ap / 410 + effectInfo->ChainAmplitude;\n+                    int32 energy = -(unitCaster->ModifyPower(POWER_ENERGY, -30));\n+                    damage += int32(energy * multiple);\n+                    damage += int32(CalculatePct(unitCaster->ToCreature()->GetCreatureComboPoints() * ap, 7));\n+                }\n+                //end npcbot\n                 // Wrath\n                 else if (m_spellInfo->SpellFamilyFlags[0] & 0x00000001)\n                 {\n@@ -550,6 +561,52 @@ void Spell::EffectSchoolDMG()\n                                 damage += combo * 40;\n                         }\n                     }\n+                    //npcbot: Envenom support\n+                    else if (unitCaster->IsNPCBot())\n+                    {\n+                        // consume from stack dozes not more that have combo-points\n+                        if (uint8 combo = unitCaster->ToCreature()->GetCreatureComboPoints())\n+                        {\n+                            // Lookup for Deadly poison (only attacker applied)\n+                            if (AuraEffect const* aurEff = unitTarget->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_ROGUE, 0x00010000, 0, 0, unitCaster->GetGUID()))\n+                            {\n+                                // count consumed deadly poison doses at target\n+                                bool needConsume = true;\n+                                uint32 spellId = aurEff->GetId();\n+\n+                                uint32 doses = aurEff->GetBase()->GetStackAmount();\n+                                if (doses > combo)\n+                                    doses = combo;\n+\n+                                // Master Poisoner\n+                                Unit::AuraEffectList const& auraList = unitCaster->GetAuraEffectsByType(SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL_NOT_STACK);\n+                                for (Unit::AuraEffectList::const_iterator iter = auraList.begin(); iter != auraList.end(); ++iter)\n+                                {\n+                                    if ((*iter)->GetSpellInfo()->SpellFamilyName == SPELLFAMILY_ROGUE && (*iter)->GetSpellInfo()->SpellIconID == 1960)\n+                                    {\n+                                        uint32 chance = (*iter)->GetSpellInfo()->GetEffect(EFFECT_2).CalcValue(unitCaster);\n+\n+                                        if (chance && roll_chance_i(chance))\n+                                            needConsume = false;\n+\n+                                        break;\n+                                    }\n+                                }\n+\n+                                if (needConsume)\n+                                    for (uint32 i = 0; i < doses; ++i)\n+                                        unitTarget->RemoveAuraFromStack(spellId, unitCaster->GetGUID());\n+\n+                                damage *= doses;\n+                                damage += int32(unitCaster->GetTotalAttackPowerValue(BASE_ATTACK) * 0.09f * combo);\n+                            }\n+\n+                            // Eviscerate and Envenom Bonus Damage (item set effect)\n+                            if (unitCaster->HasAura(37169))\n+                                damage += combo * 40;\n+                        }\n+                    }\n+                    //end npcbot\n                 }\n                 // Eviscerate\n                 else if (m_spellInfo->SpellFamilyFlags[0] & 0x00020000)\n@@ -566,6 +623,20 @@ void Spell::EffectSchoolDMG()\n                                 damage += combo*40;\n                         }\n                     }\n+                    //npcbot: Eviscerate support\n+                    else if (unitCaster->IsNPCBot())\n+                    {\n+                        if (uint32 combo = unitCaster->ToCreature()->GetCreatureComboPoints())\n+                        {\n+                            float ap = unitCaster->GetTotalAttackPowerValue(BASE_ATTACK);\n+                            damage += std::lroundf(ap * combo * 0.07f);\n+\n+                            // Eviscerate and Envenom Bonus Damage (item set effect)\n+                            if (unitCaster->HasAura(37169))\n+                                damage += combo*40;\n+                        }\n+                    }\n+                    //end npcbot\n                 }\n                 break;\n             }\n@@ -616,6 +687,27 @@ void Spell::EffectSchoolDMG()\n                             damage += irand(int32(dmg_min), int32(dmg_max));\n                         damage += int32(caster->GetAmmoDPS() * caster->GetAttackTime(RANGED_ATTACK) * 0.001f);\n                     }\n+                    //npcbot: calculate bot weapon damage\n+                    if (unitCaster->IsNPCBot())\n+                    {\n+                        if (Item* item = unitCaster->ToCreature()->GetBotEquips(2/*BOT_SLOT_RANGED*/))\n+                        {\n+                            ItemTemplate const* weaponTemplate = item->GetTemplate();\n+                            float dmg_min = 0.f;\n+                            float dmg_max = 0.f;\n+                            for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)\n+                            {\n+                                dmg_min += weaponTemplate->Damage[i].DamageMin;\n+                                dmg_max += weaponTemplate->Damage[i].DamageMax;\n+                            }\n+                            if (dmg_max == 0.0f && dmg_min > dmg_max)\n+                                damage += int32(dmg_min);\n+                            else\n+                                damage += irand(int32(dmg_min), int32(dmg_max));\n+                            damage += int32(unitCaster->ToCreature()->GetCreatureAmmoDPS() * weaponTemplate->Delay * 0.001f);\n+                        }\n+                    }\n+                    //end npcbot\n                 }\n                 break;\n             }\n@@ -717,6 +809,60 @@ void Spell::EffectTriggerSpell()\n         // special cases\n         switch (triggered_spell_id)\n         {\n+            //npcbot: triggered heal/energize calculation (effect)\n+            // Quest - Self Healing from resurrect (invisible in log)\n+            case 25155:\n+            {\n+                switch (m_spellInfo->Id)\n+                {\n+                    //Replenish Life (Regenerating Aura)\n+                    case 34756:\n+                    {\n+                        //cannot target self\n+                        if (unitCaster == unitTarget)\n+                            return;\n+\n+                        // % of max health\n+                        int32 basepoints0 = 0.01f * unitTarget->GetMaxHealth() * effectInfo->BasePoints;\n+                        //TC_LOG_ERROR(\"entities.unit\", \"TriggerSpell(%u from %u): %s on %s base val %i,\",\n+                        //    triggered_spell_id, m_spellInfo->Id, m_caster->GetName().c_str(), unitTarget->GetName().c_str(), int32(basepoints0));\n+                        CastSpellExtraArgs args(true);\n+                        args.AddSpellBP0(basepoints0);\n+                        unitTarget->CastSpell(unitTarget, triggered_spell_id, args);\n+                        return;\n+                    }\n+                    default:\n+                        break;\n+                }\n+                break;\n+            }\n+            // Energize (invisible in log)\n+            case 60628:\n+            {\n+                switch (m_spellInfo->Id)\n+                {\n+                    //Replenish Mana\n+                    case 33394:\n+                    {\n+                        //cannot target self\n+                        if (unitCaster == unitTarget)\n+                            return;\n+\n+                        // % of max mana\n+                        int32 basepoints0 = effectInfo->BasePoints;\n+                        //TC_LOG_ERROR(\"entities.unit\", \"TriggerSpell(%u from %u): %s on %s base val %i,\",\n+                        //    triggered_spell_id, m_spellInfo->Id, m_caster->GetName().c_str(), unitTarget->GetName().c_str(), int32(basepoints0));\n+                        CastSpellExtraArgs args(true);\n+                        args.AddSpellBP0(basepoints0);\n+                        unitTarget->CastSpell(unitTarget, triggered_spell_id, args);\n+                        return;\n+                    }\n+                    default:\n+                        break;\n+                }\n+                break;\n+            }\n+            //end npcbot\n             // Mirror Image\n             case 58832:\n             {\n@@ -780,6 +926,10 @@ void Spell::EffectTriggerSpell()\n         return;\n     }\n \n+    //npcbot: override spellInfo\n+    spellInfo = spellInfo->TryGetSpellInfoOverride(GetCaster());\n+    //end npcbot\n+\n     SpellCastTargets targets;\n     if (effectHandleMode == SPELL_EFFECT_HANDLE_LAUNCH_TARGET)\n     {\n@@ -837,6 +987,10 @@ void Spell::EffectTriggerMissileSpell()\n         return;\n     }\n \n+    //npcbot: override spellInfo\n+    spellInfo = spellInfo->TryGetSpellInfoOverride(GetCaster());\n+    //end npcbot\n+\n     SpellCastTargets targets;\n     if (effectHandleMode == SPELL_EFFECT_HANDLE_HIT_TARGET)\n     {\n@@ -1111,6 +1265,11 @@ void Spell::EffectPowerDrain()\n     if (powerType == POWER_MANA)\n         power -= unitTarget->GetSpellCritDamageReduction(power);\n \n+    //npcbot: handle Obsidian Destroyer's Drain Mana (target is friendly, amount is only limited by caster's max mana)\n+    if (unitCaster->GetTypeId() == TYPEID_UNIT && unitCaster->ToCreature()->GetBotClass() == 13 && powerType == POWER_MANA)\n+        power = unitCaster->GetMaxPower(powerType);\n+    //end npcbot\n+\n     int32 newDamage = -(unitTarget->ModifyPower(powerType, -int32(power)));\n \n     // Don't restore from self drain\n@@ -1769,6 +1928,48 @@ void Spell::EffectOpenLock()\n     if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET)\n         return;\n \n+    //npcbot\n+    if (m_caster->IsNPCBot() && gameObjTarget)\n+    {\n+        GameObjectTemplate const* botGoInfo = gameObjTarget->GetGOInfo();\n+        Creature* bot = m_caster->ToCreature();\n+\n+        if (botGoInfo->CannotBeUsedUnderImmunity() && bot->HasUnitFlag(UNIT_FLAG_IMMUNE))\n+            return;\n+\n+        // Arathi Basin banner opening. /// @todo Verify correctness of this check\n+        if ((botGoInfo->type == GAMEOBJECT_TYPE_BUTTON && botGoInfo->button.noDamageImmune) ||\n+            (botGoInfo->type == GAMEOBJECT_TYPE_GOOBER && botGoInfo->goober.losOK))\n+        {\n+            //CanUseBattlegroundObject() already called in CheckCast()\n+            // in battleground check\n+            if (Battleground* bg = bot->GetBotBG())\n+            {\n+                bg->EventBotClickedOnFlag(bot, gameObjTarget);\n+                return;\n+            }\n+        }\n+        else if (botGoInfo->type == GAMEOBJECT_TYPE_FLAGSTAND)\n+        {\n+            //CanUseBattlegroundObject() already called in CheckCast()\n+            // in battleground check\n+            if (Battleground* bg = bot->GetBotBG())\n+            {\n+                if (bg->GetTypeID(true) == BATTLEGROUND_EY)\n+                    bg->EventBotClickedOnFlag(bot, gameObjTarget);\n+                return;\n+            }\n+        }\n+        else if (botGoInfo->type == GAMEOBJECT_TYPE_TRAP)\n+        {\n+            gameObjTarget->SetLootState(GO_ACTIVATED);\n+            return;\n+        }\n+\n+        return;\n+    }\n+    //end npcbot\n+\n     if (m_caster->GetTypeId() != TYPEID_PLAYER)\n     {\n         TC_LOG_DEBUG(\"spells\", \"WORLD: Open Lock - No Player Caster!\");\n@@ -3073,6 +3274,14 @@ void Spell::EffectWeaponDmg()\n                     if (Item* item = unitCaster->ToPlayer()->GetWeaponForAttack(m_attackType, true))\n                         if (item->GetTemplate()->SubClass == ITEM_SUBCLASS_WEAPON_DAGGER)\n                             totalDamagePercentMod *= 1.5f;\n+\n+                //npcbot: handle bot weapons\n+                // 50% more damage with daggers\n+                if (unitCaster->IsNPCBot())\n+                    if (Item const* weapon = unitCaster->ToCreature()->GetBotEquips(m_attackType))\n+                        if (weapon->GetTemplate()->SubClass == ITEM_SUBCLASS_WEAPON_DAGGER)\n+                            totalDamagePercentMod *= 1.5f;\n+                //end npcbot\n             }\n             // Mutilate (for each hand)\n             else if (m_spellInfo->SpellFamilyFlags[1] & 0x6)\n@@ -3416,6 +3625,14 @@ void Spell::EffectSummonObjectWild()\n             if (Battleground* bg = player->GetBattleground())\n                 bg->SetDroppedFlagGUID(pGameObj->GetGUID(), player->GetTeam() == ALLIANCE ? TEAM_HORDE: TEAM_ALLIANCE);\n \n+    //npcbot\n+    if (m_caster->IsNPCBot() && pGameObj->GetGoType() == GAMEOBJECT_TYPE_FLAGDROP)\n+    {\n+        if (Battleground* bg = m_caster->ToCreature()->GetBotBG())\n+            bg->SetDroppedFlagGUID(pGameObj->GetGUID(), bg->GetOtherTeamId(bg->GetBotTeamId(m_caster->GetGUID())));\n+    }\n+    //end npcbot\n+\n     if (GameObject* linkedTrap = pGameObj->GetLinkedTrap())\n     {\n         linkedTrap->SetRespawnTime(duration > 0 ? duration / IN_MILLISECONDS : 0);\n@@ -3583,6 +3800,10 @@ void Spell::EffectSanctuary()\n         // stop all pve combat for players outside dungeons, suppress pvp combat\n         unitTarget->CombatStop(false, false);\n     }\n+    //npcbot\n+    else if (unitTarget->IsNPCBotOrPet() && !unitTarget->GetMap()->IsDungeon())\n+        unitTarget->CombatStop(false, false);\n+    //end npcbot\n     else\n     {\n         // in dungeons (or for nonplayers), reset this unit on all enemies' threat lists\n@@ -5239,6 +5460,21 @@ void Spell::SummonGuardian(SpellEffectInfo const& spellEffectInfo, uint32 entry,\n     if (Player* modOwner = unitCaster->GetSpellModOwner())\n         modOwner->ApplySpellMod(m_spellInfo->Id, SPELLMOD_DURATION, duration);\n \n+    //npcbot: most bot summons are botpets, we have no place to put summon duration mods, keep them here for now\n+    if (unitCaster->IsNPCBot())\n+    {\n+        switch (m_spellInfo->Id)\n+        {\n+            case 49028: // Dancing Rune Weapon\n+                //Glyph of Dancing Rune Weapon: +5 sec duration\n+                duration += 5000;\n+                break;\n+            default:\n+                break;\n+        }\n+    }\n+    //end npcbot\n+\n     //TempSummonType summonType = (duration == 0) ? TEMPSUMMON_DEAD_DESPAWN : TEMPSUMMON_TIMED_DESPAWN;\n     Map* map = unitCaster->GetMap();\n     for (uint32 count = 0; count < numGuardians; ++count)\n@@ -5265,6 +5501,19 @@ void Spell::SummonGuardian(SpellEffectInfo const& spellEffectInfo, uint32 entry,\n \n         if (summon->GetEntry() == 27893)\n         {\n+            //npcbot\n+            if (unitCaster->IsCreature())\n+            {\n+                if (uint32 weapon = unitCaster->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID))\n+                {\n+                    summon->SetDisplayId(11686); // modelid2\n+                    summon->SetVirtualItem(0, weapon);\n+                }\n+                else\n+                    summon->SetDisplayId(1126); // modelid1\n+            }\n+            else\n+            //end npcbot\n             if (uint32 weapon = unitCaster->GetUInt32Value(PLAYER_VISIBLE_ITEM_16_ENTRYID))\n             {\n                 summon->SetDisplayId(11686); // modelid2\ndiff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp\nindex 0fd37d8da0..0459ae4e75 100644\n--- a/src/server/game/Spells/SpellInfo.cpp\n+++ b/src/server/game/Spells/SpellInfo.cpp\n@@ -32,6 +32,11 @@\n #include \"SpellMgr.h\"\n #include \"Vehicle.h\"\n \n+//npcbot\n+#include \"botmgr.h\"\n+#include \"botspell.h\"\n+//end npcbot\n+\n uint32 GetTargetFlagMask(SpellTargetObjectTypes objType)\n {\n     switch (objType)\n@@ -474,9 +479,38 @@ int32 SpellEffectInfo::CalcValue(WorldObject const* caster /*= nullptr*/, int32\n     // random damage\n     if (casterUnit)\n     {\n+        //npcbot: Life Burst heal tempfix 2013\n+        float pointsPerComboPoint = PointsPerComboPoint;\n+        if (_spellInfo->Id == 57143 && EffectIndex == EFFECT_1)\n+        {\n+            basePoints = 2500;\n+            value = float(basePoints);\n+            pointsPerComboPoint = 2500.f;\n+        }\n+        //npcbot: bonus amount from combo points and specific mods\n+        if (casterUnit->IsNPCBot())\n+        {\n+            if (uint8 comboPoints = casterUnit->ToCreature()->GetCreatureComboPoints())\n+                value += pointsPerComboPoint * comboPoints;\n+        }\n+        //npcbot: bonus amount from combo points (vehicle)\n+        else if (casterUnit->IsVehicle() && casterUnit->GetTypeId() == TYPEID_UNIT && casterUnit->GetCharmerGUID().IsCreature() &&\n+            PointsPerComboPoint)\n+        {\n+            Unit const* bot = casterUnit->GetCharmer();\n+            if (bot && bot->IsNPCBot())\n+                if (uint8 comboPoints = bot->ToCreature()->GetCreatureComboPoints())\n+                    value += pointsPerComboPoint * comboPoints;\n+        }\n+        //npcbot: bonus amount from combo points\n+        else if (uint8 comboPoints = casterUnit->GetComboPoints())\n+            value += pointsPerComboPoint * comboPoints;\n+        //end npcbot\n+        /*\n         // bonus amount from combo points\n         if (uint8 comboPoints = casterUnit->GetComboPoints())\n             value += PointsPerComboPoint * comboPoints;\n+        */\n     }\n \n     if (caster)\n@@ -554,6 +588,11 @@ float SpellEffectInfo::CalcValueMultiplier(WorldObject* caster, Spell* spell /*=\n     if (Player* modOwner = (caster ? caster->GetSpellModOwner() : nullptr))\n         modOwner->ApplySpellMod(_spellInfo->Id, SPELLMOD_VALUE_MULTIPLIER, multiplier, spell);\n \n+    //npcbot - apply bot spell effect value mult mods\n+    if (caster && caster->IsNPCBot())\n+        BotMgr::ApplyBotEffectValueMultiplierMods(caster->ToCreature(), _spellInfo, EffectIndex, multiplier);\n+    //end npcbot\n+\n     return multiplier;\n }\n \n@@ -586,6 +625,11 @@ float SpellEffectInfo::CalcRadius(WorldObject* caster /*= nullptr*/, Spell* spel\n \n         if (Player* modOwner = caster->GetSpellModOwner())\n             modOwner->ApplySpellMod(_spellInfo->Id, SPELLMOD_RADIUS, radius, spell);\n+\n+        //npcbot - apply bot spell radius mods\n+        if (caster->GetTypeId() == TYPEID_UNIT && caster->ToCreature()->IsNPCBotOrPet())\n+            caster->ToCreature()->ApplyCreatureSpellRadiusMods(_spellInfo, radius);\n+        //end npcbot\n     }\n \n     return radius;\n@@ -892,6 +936,12 @@ SpellInfo::~SpellInfo()\n     _UnloadImplicitTargetConditionLists();\n }\n \n+SpellInfo const* SpellInfo::TryGetSpellInfoOverride(WorldObject const* caster) const\n+{\n+    SpellInfo const* spellInfoOverride = (caster && caster->IsNPCBotOrPet()) ? GetBotSpellInfoOverride(Id) : nullptr;\n+    return spellInfoOverride ? spellInfoOverride : this;\n+}\n+\n uint32 SpellInfo::GetCategory() const\n {\n     return CategoryEntry ? CategoryEntry->ID : 0;\n@@ -1717,6 +1767,9 @@ SpellCastResult SpellInfo::CheckTarget(WorldObject const* caster, WorldObject co\n \n     // corpseOwner and unit specific target checks\n     if (HasAttribute(SPELL_ATTR3_ONLY_TARGET_PLAYERS) && unitTarget->GetTypeId() != TYPEID_PLAYER)\n+        //npcbot: allow to target bots\n+        if (!unitTarget->IsNPCBot())\n+        //end npcbot\n        return SPELL_FAILED_TARGET_NOT_PLAYER;\n \n     if (!IsAllowingDeadTarget() && !unitTarget->IsAlive())\n@@ -1818,6 +1871,13 @@ SpellCastResult SpellInfo::CheckExplicitTarget(WorldObject const* caster, WorldO\n                     return SPELL_CAST_OK;\n             return SPELL_FAILED_BAD_TARGETS;\n         }\n+        //npcbot\n+        else if ((neededTargets & TARGET_FLAG_CORPSE_ALLY) && unitTarget->IsNPCBot())\n+        {\n+            if (!caster->IsValidAssistTarget(unitTarget, this))\n+                return SPELL_FAILED_BAD_TARGETS;\n+        }\n+        //end npcbot\n     }\n     return SPELL_CAST_OK;\n }\n@@ -3317,6 +3377,11 @@ int32 SpellInfo::CalcPowerCost(WorldObject const* caster, SpellSchoolMask school\n         }\n     }\n \n+    //npcbot - apply bot spell cost mods\n+    if (powerCost > 0 && caster->IsNPCBot())\n+        caster->ToCreature()->ApplyCreatureSpellCostMods(this, powerCost);\n+    //end npcbot\n+\n     // PCT mod from user auras by spell school and power type\n     Unit::AuraEffectList const& aurasPct = unitCaster->GetAuraEffectsByType(SPELL_AURA_MOD_POWER_COST_SCHOOL_PCT);\n     for (Unit::AuraEffectList::const_iterator i = aurasPct.begin(); i != aurasPct.end(); ++i)\ndiff --git a/src/server/game/Spells/SpellInfo.h b/src/server/game/Spells/SpellInfo.h\nindex 6af87e835d..e10baca113 100644\n--- a/src/server/game/Spells/SpellInfo.h\n+++ b/src/server/game/Spells/SpellInfo.h\n@@ -231,12 +231,30 @@ public:\n \n     SpellEffectInfo();\n     explicit SpellEffectInfo(SpellEntry const* spellEntry, SpellInfo const* spellInfo, uint8 effIndex);\n+    //npcbot\n+    /*\n+    //end npcbot\n     SpellEffectInfo(SpellEffectInfo const&) = delete;\n+    //npcbot\n+    */\n+    SpellEffectInfo(SpellEffectInfo const&) = default;\n+    //end npcbot\n     SpellEffectInfo(SpellEffectInfo&&) noexcept;\n+    //npcbot\n+    /*\n+    //end npcbot\n     SpellEffectInfo& operator=(SpellEffectInfo const&) = delete;\n+    //npcbot\n+    */\n+    SpellEffectInfo& operator=(SpellEffectInfo const&) = default;\n+    //end npcbot\n     SpellEffectInfo& operator=(SpellEffectInfo&&) noexcept;\n     ~SpellEffectInfo();\n \n+    //npcbot\n+    void OverrideSpellInfo(SpellInfo const* spellInfo) { ASSERT_NOTNULL(spellInfo); _spellInfo = spellInfo; }\n+    //end npcbot\n+\n     bool IsEffect() const;\n     bool IsEffect(SpellEffects effectName) const;\n     bool IsAura() const;\n@@ -270,7 +288,14 @@ private:\n     };\n     static std::array<StaticData, TOTAL_SPELL_EFFECTS> _data;\n \n+    //npcbot\n+    /*\n+    //end npcbot\n     std::unique_ptr<ImmunityInfo> _immunityInfo;\n+    //npcbot\n+    */\n+    std::shared_ptr<ImmunityInfo> _immunityInfo;\n+    //end npcbot\n };\n \n struct TC_GAME_API SpellDiminishInfo\n@@ -497,6 +522,10 @@ class TC_GAME_API SpellInfo\n \n         uint32 GetMechanicImmunityMask(Unit* caster) const;\n \n+        //npcbot\n+        SpellInfo const* TryGetSpellInfoOverride(WorldObject const* caster) const;\n+        //end npcbot\n+\n     private:\n         // loading helpers\n         void _InitializeExplicitTargetMask();\ndiff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp\nindex 8a43b29c3d..7fe8c8e046 100644\n--- a/src/server/game/Spells/SpellMgr.cpp\n+++ b/src/server/game/Spells/SpellMgr.cpp\n@@ -2946,6 +2946,18 @@ void SpellMgr::LoadSpellInfoCorrections()\n {\n     uint32 oldMSTime = getMSTime();\n \n+    //npcbot: corrections for Gunship Battle Shoot: should be able to target creatures (Hurl Axe can)\n+    ApplySpellFix({\n+        70162,  // Shoot 10N\n+        72566,  // Shoot 25N\n+        72567,  // Shoot 10H\n+        72568   // Shoot 25H\n+        }, [](SpellInfo* spellInfo)\n+    {\n+        spellInfo->AttributesEx3 &= ~SPELL_ATTR3_ONLY_TARGET_PLAYERS;\n+        spellInfo->TargetAuraSpell = 0;\n+    });\n+\n     // Some spells have no amplitude set\n     {\n         ApplySpellFix({\ndiff --git a/src/server/scripts/Commands/cs_npc.cpp b/src/server/scripts/Commands/cs_npc.cpp\nindex 755c5e410e..d353400936 100644\n--- a/src/server/scripts/Commands/cs_npc.cpp\n+++ b/src/server/scripts/Commands/cs_npc.cpp\n@@ -119,6 +119,16 @@ public:\n         if (!sObjectMgr->GetCreatureTemplate(id))\n             return false;\n \n+        //npcbot\n+        CreatureTemplate const* cinfo = sObjectMgr->GetCreatureTemplate(id);\n+        if (cinfo && cinfo->IsNPCBotOrPet())\n+        {\n+            handler->PSendSysMessage(\"You tried to spawn creature %u, which is part of NPCBots mod. To spawn bots use '.npcbot spawn' instead.\", id.get<uint32>());\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+        //end npcbot\n+\n         Player* chr = handler->GetSession()->GetPlayer();\n         Map* map = chr->GetMap();\n \n@@ -301,6 +311,16 @@ public:\n                 handler->SetSentErrorMessage(true);\n                 return false;\n             }\n+\n+            //npcbot\n+            if (creature->IsNPCBotOrPet())\n+            {\n+                handler->SendSysMessage(\"Selected creature has botAI assigned, use '.npcbot delete' instead\");\n+                handler->SetSentErrorMessage(true);\n+                return false;\n+            }\n+            //end npcbot\n+\n             if (TempSummon* summon = creature->ToTempSummon())\n             {\n                 summon->UnSummon();\n@@ -603,6 +623,17 @@ public:\n             return false;\n         }\n \n+        //npcbot\n+        CreatureTemplate const* ct = sObjectMgr->GetCreatureTemplate(data->id);\n+        ASSERT(ct);\n+        if (ct->IsNPCBotOrPet())\n+        {\n+            handler->PSendSysMessage(\"creature %u (id %u) is a part of NPCBots mod. Use '.npcbot move' instead\", lowguid, data->id);\n+            handler->SetSentErrorMessage(true);\n+            return false;\n+        }\n+        //end npcbot\n+\n         // update position in memory\n         sObjectMgr->RemoveCreatureFromGrid(lowguid, data);\n         const_cast<CreatureData*>(data)->spawnPoint.Relocate(*player);\ndiff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp\nindex 8833854416..e753a3bf22 100644\n--- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp\n+++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp\n@@ -989,6 +989,11 @@ void hyjalAI::DoOverrun(uint32 faction, const uint32 diff)\n             {\n                 for (std::list<Creature*>::const_iterator itr = creatures.begin(); itr != creatures.end(); ++itr)\n                 {\n+                    //npcbot: prevent bots from getting UNIT_FLAG_NON_ATTACKABLE\n+                    if ((*itr)->IsNPCBotOrPet())\n+                        continue;\n+                    //end npcbot\n+\n                     if ((*itr) && (*itr)->IsAlive())\n                     {\n                         (*itr)->CastSpell(*itr, SPELL_TELEPORT_VISUAL, true);\ndiff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp\nindex ac6302dd49..4a5b6a469c 100644\n--- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp\n+++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp\n@@ -200,6 +200,14 @@ hyjal_trashAI::hyjal_trashAI(Creature* creature) : EscortAI(creature)\n \n void hyjal_trashAI::DamageTaken(Unit* done_by, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/)\n {\n+    //npcbot:\n+    if (done_by && done_by->GetTypeId() == TYPEID_UNIT && done_by->ToCreature()->IsNPCBotOrPet())\n+    {\n+        damageTaken += damage;\n+        instance->SetData(DATA_RAIDDAMAGE, damage);\n+    }\n+    else\n+    //end npcbot\n     if (!done_by || done_by->GetTypeId() == TYPEID_PLAYER || done_by->IsPet())\n     {\n         damageTaken += damage;\ndiff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp\nindex b1945efdec..7d1fc98d6e 100644\n--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp\n+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp\n@@ -38,6 +38,10 @@\n #include \"Vehicle.h\"\n #include <G3D/Vector3.h>\n \n+//npcbot\n+#include \"botmgr.h\"\n+//end npcbot\n+\n enum GunshipTexts\n {\n     // High Overlord Saurfang\n@@ -614,6 +618,10 @@ struct gunship_npc_AI : public ScriptedAI\n     {\n         if (Instance->GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) != IN_PROGRESS)\n             return false;\n+        //npcbot: allow to attack bots whereever they are\n+        if (target->GetTypeId() == TYPEID_UNIT && target->ToCreature()->IsNPCBotOrPet())\n+            return true;\n+        //end npcbot\n         return target->HasAura(Instance->GetData(DATA_TEAM_IN_INSTANCE) == HORDE ? SPELL_ON_ORGRIMS_HAMMER_DECK : SPELL_ON_SKYBREAKER_DECK);\n     }\n \n@@ -746,6 +754,15 @@ class npc_gunship : public CreatureScript\n                     hull->CastSpell(hull, explosionSpell, TRIGGERED_FULL_MASK);\n                 }\n \n+                //npcbot: kill bots\n+                Transport::PassengerSet const& allpassengers = me->GetTransport()->GetPassengers();\n+                for (Transport::PassengerSet::const_iterator citr = allpassengers.begin(); citr != allpassengers.end(); ++citr)\n+                {\n+                    if ((*citr)->GetTypeId() == TYPEID_PLAYER && (*citr)->ToPlayer()->HaveBot())\n+                        (*citr)->ToPlayer()->GetBotMgr()->KillAllBots();\n+                }\n+                //end npcbot\n+\n                 creatures.clear();\n                 GetCreatureListWithEntryInGrid(creatures, me, _teamInInstance == HORDE ? NPC_HORDE_GUNSHIP_CANNON : NPC_ALLIANCE_GUNSHIP_CANNON, 200.0f);\n                 for (std::list<Creature*>::iterator itr = creatures.begin(); itr != creatures.end(); ++itr)\n@@ -1516,6 +1533,17 @@ struct npc_gunship_boarding_addAI : public gunship_npc_AI\n             return !me->_IsTargetAcceptable(player) || !me->CanStartAttack(player, true);\n         });\n \n+        //npcbot: allow bots as targets\n+        auto npcbot_check = [this](Creature const* creature) {\n+            return creature->IsNPCBotOrPet() && me->_IsTargetAcceptable(creature) && me->CanStartAttack(creature, true);\n+        };\n+        Creature* anybot = nullptr;\n+        Trinity::CreatureSearcher botsearcher(me, anybot, npcbot_check);\n+        Cell::VisitWorldObjects(me, botsearcher, 70.0f);\n+        if (anybot)\n+            return true;\n+        //end npcbot\n+\n         return !players.empty();\n     }\n \ndiff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp\nindex c3a6050d47..e6be83a2e1 100644\n--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp\n+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp\n@@ -617,6 +617,20 @@ struct npc_ice_tomb : public ScriptedAI\n     {\n         me->RemoveAllGameObjects();\n \n+        //npcbot\n+        if (_trappedPlayerGUID.IsCreature())\n+        {\n+            if (Creature* bot = ObjectAccessor::GetCreature(*me, _trappedPlayerGUID))\n+            {\n+                _trappedPlayerGUID.Clear();\n+                bot->RemoveAurasDueToSpell(SPELL_ICE_TOMB_DAMAGE);\n+                bot->RemoveAurasDueToSpell(SPELL_ASPHYXIATION);\n+                bot->RemoveAurasDueToSpell(SPELL_ICE_TOMB_UNTARGETABLE);\n+            }\n+            return;\n+        }\n+        //end npcbot\n+\n         if (Player* player = ObjectAccessor::GetPlayer(*me, _trappedPlayerGUID))\n         {\n             _trappedPlayerGUID.Clear();\n@@ -633,6 +647,21 @@ struct npc_ice_tomb : public ScriptedAI\n \n         if (_existenceCheckTimer <= diff)\n         {\n+            //npcbot\n+            if (_trappedPlayerGUID.IsCreature())\n+            {\n+                Creature* bot = ObjectAccessor::GetCreature(*me, _trappedPlayerGUID);\n+                if (!bot || !bot->IsAlive() || !bot->HasAura(SPELL_ICE_TOMB_DAMAGE))\n+                {\n+                    JustDied(me);\n+                    me->DespawnOrUnsummon();\n+                    return;\n+                }\n+                _existenceCheckTimer = 1000;\n+                return;\n+            }\n+            //end npcbot\n+\n             Player* player = ObjectAccessor::GetPlayer(*me, _trappedPlayerGUID);\n             if (!player || player->isDead() || !player->HasAura(SPELL_ICE_TOMB_DAMAGE))\n             {\ndiff --git a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp\nindex 6702d39a6b..a3cef3d55d 100644\n--- a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp\n+++ b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp\n@@ -32,6 +32,10 @@\n #include \"WorldStatePackets.h\"\n #include <unordered_set>\n \n+//npcbot\n+#include \"bot_InstanceEvents.h\"\n+//end npcbot\n+\n enum EventIds\n {\n     EVENT_PLAYERS_GUNSHIP_SPAWN     = 22663,\n@@ -203,6 +207,19 @@ class instance_icecrown_citadel : public InstanceMapScript\n                 DoRemoveAurasDueToSpellOnPlayer(player, TeamInInstance == ALLIANCE ? SPELL_STRENGHT_OF_WRYNN : SPELL_HELLSCREAMS_WARSONG, true, true);\n             }\n \n+            //npcbot: handle bot map transfer\n+            void OnNPCBotEnter(Creature* bot) override\n+            {\n+                if (IsFactionBuffActive)\n+                    DoCastSpellOnNPCBot(bot, TeamInInstance == ALLIANCE ? SPELL_STRENGHT_OF_WRYNN : SPELL_HELLSCREAMS_WARSONG);\n+            }\n+\n+            void OnNPCBotLeave(Creature* bot) override\n+            {\n+                DoRemoveAurasDueToSpellOnNPCBot(bot, TeamInInstance == ALLIANCE ? SPELL_STRENGHT_OF_WRYNN : SPELL_HELLSCREAMS_WARSONG);\n+            }\n+            //end npcbot\n+\n             void OnCreatureCreate(Creature* creature) override\n             {\n                 if (creature->IsGuardian() && creature->GetOwnerGUID().IsPlayer())\n@@ -211,6 +228,14 @@ class instance_icecrown_citadel : public InstanceMapScript\n                         creature->CastSpell(creature, TeamInInstance == ALLIANCE ? SPELL_STRENGHT_OF_WRYNN : SPELL_HELLSCREAMS_WARSONG, true);\n                 }\n \n+                //npcbot: handle bot pets\n+                if (creature->IsNPCBotPet())\n+                {\n+                    if (IsFactionBuffActive)\n+                        creature->CastSpell(creature, TeamInInstance == ALLIANCE ? SPELL_STRENGHT_OF_WRYNN : SPELL_HELLSCREAMS_WARSONG, true);\n+                }\n+                //end npcbot\n+\n                 switch (creature->GetEntry())\n                 {\n                     case NPC_NERUBAR_BROODKEEPER:\n@@ -1401,6 +1426,11 @@ class instance_icecrown_citadel : public InstanceMapScript\n                         }\n                         case EVENT_QUAKE_SHATTER:\n                         {\n+                            //npcbot\n+                            if (GameObject const* platform = instance->GetGameObject(ArthasPlatformGUID))\n+                                FrozenThronePlatformDestructionEvent(this, platform->GetPosition())();\n+                            //end npcbot\n+\n                             if (GameObject* platform = instance->GetGameObject(ArthasPlatformGUID))\n                                 platform->SetDestructibleState(GO_DESTRUCTIBLE_DAMAGED);\n                             if (GameObject* edge = instance->GetGameObject(FrozenThroneEdgeGUID))\ndiff --git a/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp b/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp\nindex 6bf76c9540..ef2370e5ef 100644\n--- a/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp\n+++ b/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp\n@@ -565,7 +565,7 @@ struct boss_four_horsemen_lady : public boss_four_horsemen_baseAI\n         if (me->HasUnitState(UNIT_STATE_CASTING))\n             return;\n \n-        if (Unit* target = SelectTarget(SelectTargetMethod::MinDistance, 0, 45.0f, true))\n+        if (Unit* target = SelectTarget(SelectTargetMethod::MinDistance, 0, 45.0f))\n             DoCast(target, SPELL_SHADOW_BOLT);\n         else\n         {\n@@ -624,7 +624,7 @@ struct boss_four_horsemen_sir : public boss_four_horsemen_baseAI\n         if (me->HasUnitState(UNIT_STATE_CASTING))\n             return;\n \n-        if (Unit* target = SelectTarget(SelectTargetMethod::MinDistance, 0, 45.0f, true))\n+        if (Unit* target = SelectTarget(SelectTargetMethod::MinDistance, 0, 45.0f))\n             DoCast(target, SPELL_HOLY_BOLT);\n         else\n         {\ndiff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp\nindex f1a0f3dedf..8b87edb3d1 100644\n--- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp\n+++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp\n@@ -449,6 +449,11 @@ class spell_volkhan_cosmetic_stun_immune_permanent : public AuraScript\n \n     void HandleApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)\n     {\n+        //npcbot\n+        if (GetTarget()->IsNPCBotOrPet())\n+            return;\n+        //end npcbot\n+\n         if (Creature* target = GetTarget()->ToCreature())\n             target->UpdateEntry(ENTRY_BRITTLE_GOLEM, nullptr, false);\n     }\ndiff --git a/src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp b/src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp\nindex b0c0ecd4b0..80fddbf153 100644\n--- a/src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp\n+++ b/src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp\n@@ -162,6 +162,22 @@ struct boss_najentus : public BossAI\n                     target->SummonGameObject(GO_NAJENTUS_SPINE, *target, QuaternionData(), 30s);\n                     Talk(SAY_NEEDLE);\n                 }\n+                //npcbot: try selecting npcbot\n+                else if (Unit* bottarget = SelectTarget(SelectTargetMethod::Random, 1, [this](Unit const* target) -> bool {\n+                    if (!target || !target->IsNPCBot() || target->ToCreature()->IsFreeBot() ||\n+                        !me->IsWithinCombatRange(target, 200.0f))\n+                        return false;\n+\n+                    return true;\n+                    }))\n+                {\n+                    DoCast(bottarget, SPELL_IMPALING_SPINE, true);\n+                    _spineTargetGUID = bottarget->GetGUID();\n+                    //must let target summon, otherwise you cannot click the spine\n+                    bottarget->SummonGameObject(GO_NAJENTUS_SPINE, *bottarget, QuaternionData(), 30s);\n+                    Talk(SAY_NEEDLE);\n+                }\n+                //end npcbot\n                 events.Repeat(20s, 25s);\n                 break;\n             case EVENT_NEEDLE:\ndiff --git a/src/server/scripts/Pet/pet_dk.cpp b/src/server/scripts/Pet/pet_dk.cpp\nindex d3adc87be1..162edb6e25 100644\n--- a/src/server/scripts/Pet/pet_dk.cpp\n+++ b/src/server/scripts/Pet/pet_dk.cpp\n@@ -74,6 +74,18 @@ struct npc_pet_dk_ebon_gargoyle : CasterAI\n         }\n     }\n \n+    //npcbot: allow bot summons to select bot's target without being engaged themselves\n+    void UpdateAI(uint32 diff) override\n+    {\n+        if (Unit const* creator = me->GetCreator())\n+            if (creator->IsCreature() && !me->GetVictim())\n+                if (Unit* victim = creator->GetVictim())\n+                    AttackStart(victim);\n+\n+        CasterAI::UpdateAI(diff);\n+    }\n+    //end npcbot\n+\n     void JustDied(Unit* /*killer*/) override\n     {\n         // Stop Feeding Gargoyle when it dies\n@@ -250,6 +262,21 @@ private:\n     // we prioritize between things that are in combat with owner based on the owner's threat to them\n     bool UpdateRuneWeaponVictim()\n     {\n+        //npcbot\n+        if (Unit const* creator = me->GetCreator())\n+        {\n+            if (creator->IsCreature())\n+            {\n+                if (Unit* victim = creator->GetVictim())\n+                {\n+                    if (me->GetVictim() != victim)\n+                        AttackStart(victim);\n+                    return true;\n+                }\n+            }\n+        }\n+        //end npcbot\n+\n         Unit* owner = me->GetOwner();\n         if (!owner)\n             return false;\ndiff --git a/src/server/scripts/Spells/spell_dk.cpp b/src/server/scripts/Spells/spell_dk.cpp\nindex 34c86ff0a9..2442676e5b 100644\n--- a/src/server/scripts/Spells/spell_dk.cpp\n+++ b/src/server/scripts/Spells/spell_dk.cpp\n@@ -362,6 +362,13 @@ private:\n             return;\n \n         amount = talentSpell->GetEffect(EFFECT_0).CalcValue(owner);\n+        //npcbot: take bot attack power into account\n+        if (Creature const* bot = owner->ToCreature())\n+        {\n+            if (bot->IsNPCBot())\n+                amount += int32(2 * bot->GetTotalAttackPowerValue(BASE_ATTACK));\n+        }\n+        //end npcbot\n         if (Player* player = owner->ToPlayer())\n             amount += int32(2 * player->GetTotalAttackPowerValue(BASE_ATTACK));\n     }\n@@ -1901,6 +1908,16 @@ private:\n     void Absorb(AuraEffect* /*aurEff*/, DamageInfo & dmgInfo, uint32 & absorbAmount)\n     {\n         // You have a chance equal to your Parry chance\n+        //npcbot handle creature case (and prevent crashes)\n+        Unit* target = GetTarget();\n+        if (target->GetTypeId() == TYPEID_UNIT)\n+        {\n+            if (dmgInfo.GetDamageType() == SPELL_DIRECT_DAMAGE &&\n+                roll_chance_f(target->ToCreature()->GetCreatureParryChance()))\n+                absorbAmount = CalculatePct(dmgInfo.GetDamage(), absorbPct);\n+        }\n+        else\n+        //end npcbot\n         if ((dmgInfo.GetDamageType() == SPELL_DIRECT_DAMAGE) && roll_chance_f(GetTarget()->GetFloatValue(PLAYER_PARRY_PERCENTAGE)))\n             absorbAmount = CalculatePct(dmgInfo.GetDamage(), absorbPct);\n     }\ndiff --git a/src/server/scripts/Spells/spell_druid.cpp b/src/server/scripts/Spells/spell_druid.cpp\nindex 37aaa997d6..50494f01bf 100644\n--- a/src/server/scripts/Spells/spell_druid.cpp\n+++ b/src/server/scripts/Spells/spell_druid.cpp\n@@ -31,6 +31,11 @@\n #include \"SpellMgr.h\"\n #include \"SpellScript.h\"\n \n+//npcbot\n+#include \"Creature.h\"\n+#include \"Group.h\"\n+//end npcbot\n+\n enum DruidSpells\n {\n     SPELL_DRUID_BEAR_FORM_PASSIVE           = 1178,\n@@ -1199,6 +1204,10 @@ class spell_dru_rip : public AuraScript\n     bool Load() override\n     {\n         Unit* caster = GetCaster();\n+        //npcbot\n+        if (caster && caster->IsNPCBot())\n+            return true;\n+        //end npcbot\n         return caster && GetCaster()->GetTypeId() == TYPEID_PLAYER;\n     }\n \n@@ -1208,6 +1217,22 @@ class spell_dru_rip : public AuraScript\n \n         if (Unit* caster = GetCaster())\n         {\n+            //npcbot\n+            if (caster && caster->IsNPCBot())\n+            {\n+                uint8 botcp = caster->ToCreature()->GetCreatureComboPoints();\n+                // Idol of Feral Shadows. Can't be handled as SpellMod due its dependency from CPs\n+                if (AuraEffect const* auraEffIdolOfFeralShadows = caster->GetAuraEffect(SPELL_DRUID_IDOL_OF_FERAL_SHADOWS, EFFECT_0))\n+                    amount += botcp * auraEffIdolOfFeralShadows->GetAmount();\n+                // Idol of Worship. Can't be handled as SpellMod due its dependency from CPs\n+                else if (AuraEffect const* auraEffIdolOfWorship = caster->GetAuraEffect(SPELL_DRUID_IDOL_OF_WORSHIP, EFFECT_0))\n+                    amount += botcp * auraEffIdolOfWorship->GetAmount();\n+\n+                amount += int32(CalculatePct(caster->GetTotalAttackPowerValue(BASE_ATTACK), botcp));\n+                return;\n+            }\n+            //end npcbot\n+\n             // 0.01 * $AP * cp\n             uint8 cp = caster->ToPlayer()->GetComboPoints();\n \n@@ -1756,6 +1781,41 @@ class spell_dru_t10_restoration_4p_bonus : public SpellScript\n \n     void FilterTargets(std::list<WorldObject*>& targets)\n     {\n+        //npcbot\n+        if (Creature* bot = GetCaster()->ToCreature())\n+        {\n+            if (bot->IsFreeBot())\n+            {\n+                targets.clear();\n+                targets.push_back(bot);\n+                return;\n+            }\n+\n+            targets.remove(GetExplTargetUnit());\n+            std::list<Unit*> tempTargets;\n+            Group const* gr = bot->GetBotOwner()->GetGroup();\n+            if (gr && !gr->IsMember(bot->GetGUID()))\n+                gr = nullptr;\n+\n+            if (gr)\n+                for (std::list<WorldObject*>::const_iterator itr = targets.begin(); itr != targets.end(); ++itr)\n+                    if (gr->IsMember((*itr)->GetGUID()))\n+                        tempTargets.push_back((*itr)->ToUnit());\n+\n+            if (tempTargets.empty())\n+            {\n+                targets.clear();\n+                FinishCast(SPELL_FAILED_DONT_REPORT);\n+                return;\n+            }\n+\n+            Unit* target = Trinity::Containers::SelectRandomContainerElement(tempTargets);\n+            targets.clear();\n+            targets.push_back(target);\n+            return;\n+        }\n+        //end npcbot\n+\n         if (!GetCaster()->ToPlayer()->GetGroup())\n         {\n             targets.clear();\n@@ -1807,6 +1867,11 @@ class spell_dru_t10_restoration_4p_bonus_dummy : public AuraScript\n         if (!healInfo || !healInfo->GetHeal())\n             return false;\n \n+        //npcbot: support for Item - Druid T10 Restoration 4P Bonus (Rejuvenation)\n+        if (eventInfo.GetActor()->IsNPCBot())\n+            return true;\n+        //end npcbot\n+\n         Player* caster = eventInfo.GetActor()->ToPlayer();\n         if (!caster)\n             return false;\ndiff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp\nindex 213c847f06..ee576042fd 100644\n--- a/src/server/scripts/Spells/spell_generic.cpp\n+++ b/src/server/scripts/Spells/spell_generic.cpp\n@@ -248,6 +248,11 @@ class spell_gen_arena_drink : public AuraScript\n \n     bool Load() override\n     {\n+        //npcbot\n+        if (GetCaster() && GetCaster()->IsNPCBot())\n+            return true;\n+        //end npcbot\n+\n         return GetCaster() && GetCaster()->GetTypeId() == TYPEID_PLAYER;\n     }\n \n@@ -269,6 +274,14 @@ class spell_gen_arena_drink : public AuraScript\n         if (!regen)\n             return;\n \n+        //npcbot\n+        if (GetCaster()->GetTypeId() == TYPEID_UNIT)\n+        {\n+            isPeriodic = false;\n+            return;\n+        }\n+        //end npcbot\n+\n         // default case - not in arena\n         if (!GetCaster()->ToPlayer()->InArena())\n             isPeriodic = false;\n@@ -280,6 +293,14 @@ class spell_gen_arena_drink : public AuraScript\n         if (!regen)\n             return;\n \n+        //npcbot\n+        if (GetCaster()->GetTypeId() == TYPEID_UNIT)\n+        {\n+            regen->ChangeAmount(amount);\n+            return;\n+        }\n+        //end npcbot\n+\n         // default case - not in arena\n         if (!GetCaster()->ToPlayer()->InArena())\n             regen->ChangeAmount(amount);\n@@ -3785,6 +3806,10 @@ class spell_gen_vehicle_scaling : public AuraScript\n \n     bool Load() override\n     {\n+        //npcbot\n+        if (GetCaster() && GetCaster()->IsNPCBot())\n+            return true;\n+        //end npcbot\n         return GetCaster() && GetCaster()->GetTypeId() == TYPEID_PLAYER;\n     }\n \n@@ -3807,7 +3832,19 @@ class spell_gen_vehicle_scaling : public AuraScript\n                 break;\n         }\n \n+        //npcbot\n+        /*\n+        //end npcbot\n         float avgILvl = caster->ToPlayer()->GetAverageItemLevel();\n+        //npcbot\n+        */\n+        float avgILvl;\n+        if (caster->GetTypeId() == TYPEID_PLAYER)\n+            avgILvl = caster->ToPlayer()->GetAverageItemLevel();\n+        else\n+            avgILvl = caster->ToCreature()->GetBotAverageItemLevel();\n+        //end npcbot\n+\n         if (avgILvl < baseItemLevel)\n             return;                     /// @todo Research possibility of scaling down\n \ndiff --git a/src/server/scripts/Spells/spell_hunter.cpp b/src/server/scripts/Spells/spell_hunter.cpp\nindex eaf7d2c572..f4b34931cb 100644\n--- a/src/server/scripts/Spells/spell_hunter.cpp\n+++ b/src/server/scripts/Spells/spell_hunter.cpp\n@@ -1122,6 +1122,22 @@ class spell_hun_sniper_training : public AuraScript\n \n     void HandleUpdatePeriodic(AuraEffect* aurEff)\n     {\n+        //npcbot: handle creatures, remove dead trigger\n+        if (!GetUnitOwner()->IsAlive())\n+            return;\n+        if (Creature const* bot = GetUnitOwner()->ToCreature())\n+        {\n+            if (!bot->IsNPCBot())\n+                return;\n+\n+            int32 baseAmount = aurEff->GetBaseAmount();\n+            int32 amount = bot->isMoving() ?\n+                bot->CalculateSpellDamage(aurEff->GetSpellEffectInfo(), &baseAmount) :\n+                aurEff->GetAmount() - 1;\n+            aurEff->SetAmount(amount);\n+            return;\n+        }\n+        //end npcbot\n         if (Player* playerTarget = GetUnitOwner()->ToPlayer())\n         {\n             int32 baseAmount = aurEff->GetBaseAmount();\ndiff --git a/src/server/scripts/Spells/spell_item.cpp b/src/server/scripts/Spells/spell_item.cpp\nindex 9028d8673c..fa4f334b47 100644\n--- a/src/server/scripts/Spells/spell_item.cpp\n+++ b/src/server/scripts/Spells/spell_item.cpp\n@@ -38,6 +38,10 @@\n #include \"SpellMgr.h\"\n #include \"SpellScript.h\"\n \n+//npcbot\n+#include \"botmgr.h\"\n+//end npcbot\n+\n enum GenericData\n {\n     SPELL_ARCANITE_DRAGONLING           = 19804,\n@@ -1643,6 +1647,11 @@ class spell_item_noggenfogger_elixir : public SpellScript\n \n     bool Load() override\n     {\n+        //npcbot\n+        if (GetCaster()->IsNPCBot())\n+            return true;\n+        //end npcbot\n+\n         return GetCaster()->GetTypeId() == TYPEID_PLAYER;\n     }\n \n@@ -3540,6 +3549,14 @@ class spell_item_death_choice : public AuraScript\n         float str = caster->GetStat(STAT_STRENGTH);\n         float agi = caster->GetStat(STAT_AGILITY);\n \n+        //npcbot: try get stats\n+        if (caster->IsNPCBot())\n+        {\n+            str = BotMgr::GetBotStat(caster->ToCreature(), BOT_STAT_MOD_STRENGTH);\n+            agi = BotMgr::GetBotStat(caster->ToCreature(), BOT_STAT_MOD_AGILITY);\n+        }\n+        //end npcbot\n+\n         switch (aurEff->GetId())\n         {\n             case SPELL_DEATH_CHOICE_NORMAL_AURA:\n@@ -3686,6 +3703,17 @@ class spell_item_darkmoon_card_greatness : public AuraScript\n         float agi = caster->GetStat(STAT_AGILITY);\n         float intl = caster->GetStat(STAT_INTELLECT);\n         float spi = caster->GetStat(STAT_SPIRIT);\n+\n+        //npcbot: try get stats\n+        if (caster->IsNPCBot())\n+        {\n+            str = BotMgr::GetBotStat(caster->ToCreature(), BOT_STAT_MOD_STRENGTH);\n+            agi = BotMgr::GetBotStat(caster->ToCreature(), BOT_STAT_MOD_AGILITY);\n+            intl = BotMgr::GetBotStat(caster->ToCreature(), BOT_STAT_MOD_INTELLECT);\n+            spi = BotMgr::GetBotStat(caster->ToCreature(), BOT_STAT_MOD_SPIRIT);\n+        }\n+        //end npcbot\n+\n         float stat = 0.0f;\n \n         uint32 spellTrigger = SPELL_DARKMOON_CARD_STRENGTH;\ndiff --git a/src/server/scripts/Spells/spell_mage.cpp b/src/server/scripts/Spells/spell_mage.cpp\nindex 3e75600ac9..e47acd3678 100644\n--- a/src/server/scripts/Spells/spell_mage.cpp\n+++ b/src/server/scripts/Spells/spell_mage.cpp\n@@ -1162,6 +1162,12 @@ class spell_mage_summon_water_elemental : public SpellScript\n     void HandleDummy(SpellEffIndex /*effIndex*/)\n     {\n         Unit* caster = GetCaster();\n+\n+        //npcbot: prevent default handler for bots\n+        if (caster->IsNPCBot())\n+            return;\n+        //end npcbot\n+\n         // Glyph of Eternal Water\n         if (caster->HasAura(SPELL_MAGE_GLYPH_OF_ETERNAL_WATER))\n             caster->CastSpell(caster, SPELL_MAGE_SUMMON_WATER_ELEMENTAL_PERMANENT, true);\ndiff --git a/src/server/scripts/Spells/spell_paladin.cpp b/src/server/scripts/Spells/spell_paladin.cpp\nindex c91810158f..2bd3aec758 100644\n--- a/src/server/scripts/Spells/spell_paladin.cpp\n+++ b/src/server/scripts/Spells/spell_paladin.cpp\n@@ -32,6 +32,10 @@\n #include \"SpellMgr.h\"\n #include \"SpellScript.h\"\n \n+//npcbot\n+#include \"Creature.h\"\n+//end npcbot\n+\n enum PaladinSpells\n {\n     SPELL_PALADIN_DIVINE_PLEA                    = 54428,\n@@ -164,6 +168,12 @@ class spell_pal_ardent_defender : public AuraScript\n     {\n         _absorbPct = GetEffectInfo(EFFECT_0).CalcValue();\n         _healPct = GetEffectInfo(EFFECT_1).CalcValue();\n+\n+        //npcbot - allow for npcbots\n+        if (GetUnitOwner()->IsNPCBot())\n+            return true;\n+        //end npcbot\n+\n         return GetUnitOwner()->GetTypeId() == TYPEID_PLAYER;\n     }\n \n@@ -178,6 +188,40 @@ class spell_pal_ardent_defender : public AuraScript\n         Unit* victim = GetTarget();\n         int32 remainingHealth = victim->GetHealth() - dmgInfo.GetDamage();\n         uint32 allowedHealth = victim->CountPctFromMaxHealth(35);\n+\n+        //npcbot - calc for bots\n+        if (victim->GetTypeId() == TYPEID_UNIT/* && victim->ToCreature()->IsNPCBot()*/)\n+        {\n+            if (remainingHealth <= 0 && !victim->GetSpellHistory()->HasCooldown(PAL_SPELL_ARDENT_DEFENDER_HEAL) &&\n+                !victim->ToCreature()->HasSpellCooldown(PAL_SPELL_ARDENT_DEFENDER_HEAL))\n+            {\n+                // Cast healing spell, completely avoid damage\n+                absorbAmount = dmgInfo.GetDamage();\n+\n+                float defenseSkillValue = victim->GetDefenseSkillValue();\n+                // Max heal when defense skill denies critical hits from raid bosses\n+                // Formula: max defense at level + 140 (rating from gear)\n+                float reqDefForMaxHeal = victim->GetMaxSkillValueForLevel() + 140.0f;\n+                float defenseFactor = std::min(1.0f, defenseSkillValue / reqDefForMaxHeal);\n+\n+                CastSpellExtraArgs args(aurEff);\n+                args.AddSpellBP0(victim->CountPctFromMaxHealth(lroundf(_healPct * defenseFactor)));\n+                victim->CastSpell(victim, PAL_SPELL_ARDENT_DEFENDER_HEAL, args);\n+                victim->GetSpellHistory()->AddCooldown(PAL_SPELL_ARDENT_DEFENDER_HEAL, 0, std::chrono::minutes(2));\n+            }\n+            else if (remainingHealth < int32(allowedHealth))\n+            {\n+                // Reduce damage that brings us under 35% (or full damage if we are already under 35%) by x%\n+                uint32 damageToReduce = (victim->GetHealth() < allowedHealth)\n+                    ? dmgInfo.GetDamage()\n+                    : allowedHealth - remainingHealth;\n+                absorbAmount = CalculatePct(damageToReduce, _absorbPct);\n+            }\n+\n+            return;\n+        }\n+        //end npcbot\n+\n         // If damage kills us\n         if (remainingHealth <= 0 && !victim->GetSpellHistory()->HasCooldown(PAL_SPELL_ARDENT_DEFENDER_HEAL))\n         {\n@@ -461,6 +505,23 @@ class spell_pal_divine_sacrifice : public AuraScript\n     {\n         if (Unit* caster = GetCaster())\n         {\n+            //npcbot: handle for bots\n+            if (caster->IsNPCBot())\n+            {\n+                Player const* owner = caster->ToCreature()->GetBotOwner();\n+                if (!owner || owner->GetTypeId() != TYPEID_PLAYER)\n+                    return false;\n+\n+                if (owner->GetGroup())\n+                    groupSize = owner->GetGroup()->GetMembersCount();\n+                else\n+                    groupSize = 1 + owner->GetNpcBotsCount();\n+\n+                remainingAmount = (caster->CountPctFromMaxHealth(GetEffectInfo(EFFECT_2).CalcValue(caster)) * groupSize);\n+                minHpPct = GetEffectInfo(EFFECT_1).CalcValue(caster);\n+                return true;\n+            }\n+            //end npcbot\n             if (caster->GetTypeId() == TYPEID_PLAYER)\n             {\n                 if (caster->ToPlayer()->GetGroup())\n@@ -1494,6 +1555,9 @@ class spell_pal_righteous_defense : public SpellScript\n     {\n         Unit* caster = GetCaster();\n         if (caster->GetTypeId() != TYPEID_PLAYER)\n+            //npcbot: this player check makes no sense\n+            if (!caster->IsNPCBot())\n+            //end npcbot\n             return SPELL_FAILED_DONT_REPORT;\n \n         if (Unit* target = GetExplTargetUnit())\ndiff --git a/src/server/scripts/Spells/spell_priest.cpp b/src/server/scripts/Spells/spell_priest.cpp\nindex b73cbe8ad1..f8c184d7a8 100644\n--- a/src/server/scripts/Spells/spell_priest.cpp\n+++ b/src/server/scripts/Spells/spell_priest.cpp\n@@ -848,6 +848,10 @@ class spell_pri_penance : public SpellScript\n \n     bool Load() override\n     {\n+        //npcbot\n+        if (GetCaster() && GetCaster()->IsNPCBot())\n+            return true;\n+        //end npcbot\n         return GetCaster()->GetTypeId() == TYPEID_PLAYER;\n     }\n \n@@ -890,6 +894,10 @@ class spell_pri_penance : public SpellScript\n     SpellCastResult CheckCast()\n     {\n         Player* caster = GetCaster()->ToPlayer();\n+        //npcbot: check for player makes no sense\n+        if (!caster && GetCaster()->IsNPCBot())\n+            caster = (Player*)GetCaster();\n+        //end npcbot\n         if (Unit* target = GetExplTargetUnit())\n             if (!caster->IsFriendlyTo(target))\n             {\n@@ -1062,6 +1070,10 @@ class spell_pri_renew : public AuraScript\n \n     bool Load() override\n     {\n+        //npcbot\n+        if (GetCaster() && GetCaster()->IsNPCBot())\n+            return true;\n+        //end npcbot\n         return GetCaster() && GetCaster()->GetTypeId() == TYPEID_PLAYER;\n     }\n \ndiff --git a/src/server/scripts/Spells/spell_rogue.cpp b/src/server/scripts/Spells/spell_rogue.cpp\nindex 3c85824eb1..1ae241e9ea 100644\n--- a/src/server/scripts/Spells/spell_rogue.cpp\n+++ b/src/server/scripts/Spells/spell_rogue.cpp\n@@ -33,6 +33,10 @@\n #include \"SpellMgr.h\"\n #include \"SpellScript.h\"\n \n+//npcbot\n+#include \"Creature.h\"\n+//end npcbot\n+\n enum RogueSpells\n {\n     SPELL_ROGUE_BLADE_FLURRY_EXTRA_ATTACK       = 22482,\n@@ -112,6 +116,10 @@ class spell_rog_cheat_death : public AuraScript\n     bool Load() override\n     {\n         absorbChance = GetEffectInfo(EFFECT_0).CalcValue();\n+        //npcbot\n+        if (GetUnitOwner()->IsNPCBot())\n+            return true;\n+        //end npcbot\n         return GetUnitOwner()->GetTypeId() == TYPEID_PLAYER;\n     }\n \n@@ -123,6 +131,27 @@ class spell_rog_cheat_death : public AuraScript\n \n     void Absorb(AuraEffect* /*aurEff*/, DamageInfo & dmgInfo, uint32 & absorbAmount)\n     {\n+        //npcbot\n+        if (Creature* bot = GetTarget()->ToCreature())\n+        {\n+            if (dmgInfo.GetDamage() < bot->GetHealth() || bot->HasSpellCooldown(SPELL_ROGUE_CHEAT_DEATH_COOLDOWN) ||\n+                bot->GetSpellHistory()->HasCooldown(SPELL_ROGUE_CHEAT_DEATH_COOLDOWN) || !roll_chance_i(absorbChance))\n+                return;\n+\n+            bot->CastSpell(bot, SPELL_ROGUE_CHEAT_DEATH_COOLDOWN, true);\n+            bot->GetSpellHistory()->AddCooldown(SPELL_ROGUE_CHEAT_DEATH_COOLDOWN, 0, std::chrono::minutes(1));\n+\n+            uint32 health10 = bot->CountPctFromMaxHealth(10);\n+\n+            if (bot->GetHealth() > health10)\n+                absorbAmount = dmgInfo.GetDamage() - bot->GetHealth() + health10;\n+            else\n+                absorbAmount = dmgInfo.GetDamage();\n+\n+            return;\n+        }\n+        //end npcbot\n+\n         Player* target = GetTarget()->ToPlayer();\n         if (dmgInfo.GetDamage() < target->GetHealth() || target->GetSpellHistory()->HasCooldown(SPELL_ROGUE_CHEAT_DEATH_COOLDOWN) || !roll_chance_i(absorbChance))\n             return;\n@@ -597,6 +626,10 @@ class spell_rog_rupture : public SpellScriptLoader\n             {\n                 Unit* caster = GetCaster();\n                 BonusDuration = 0;\n+                //npcbot\n+                if (caster && caster->IsNPCBot())\n+                    return true;\n+                //end npcbot\n                 return caster && caster->GetTypeId() == TYPEID_PLAYER;\n             }\n \n@@ -616,6 +649,18 @@ class spell_rog_rupture : public SpellScriptLoader\n                         0.0375f         // 5 points: ${($m1 + $b1*5 + 0.0375 * $AP) * 8} damage over 16 secs\n                     };\n \n+                    //npcbot\n+                    if (caster->GetTypeId() == TYPEID_UNIT)\n+                    {\n+                        uint8 cp = caster->ToCreature()->GetCreatureComboPoints();\n+                        if (cp > 5)\n+                            cp = 5;\n+\n+                        amount += int32(caster->GetTotalAttackPowerValue(BASE_ATTACK) * attackpowerPerCombo[cp]);\n+                        return;\n+                    }\n+                    //end npcbot\n+\n                     uint8 cp = caster->ToPlayer()->GetComboPoints();\n                     if (cp > 5)\n                         cp = 5;\n@@ -736,6 +781,12 @@ class spell_rog_setup : public AuraScript\n             if (eventInfo.GetActor() == target->GetSelectedUnit())\n                 return true;\n \n+        //npcbot\n+        if (Creature* creature = GetTarget()->ToCreature())\n+            if (creature->IsNPCBot())\n+                return true;\n+        //end npcbot\n+\n         return false;\n     }\n \n@@ -936,6 +987,11 @@ class spell_rog_honor_among_thieves_proc_aura : public AuraScript\n         if (!caster)\n             return;\n \n+        //npcbot\n+        if (Creature* bot = caster->ToCreature())\n+            bot->CastSpell(nullptr, SPELL_ROGUE_HONOR_AMONG_THIEVES_2, true);\n+        //end npcbot\n+\n         if (Player* player = caster->ToPlayer())\n             player->CastSpell(nullptr, SPELL_ROGUE_HONOR_AMONG_THIEVES_2, true);\n     }\ndiff --git a/src/server/scripts/Spells/spell_shaman.cpp b/src/server/scripts/Spells/spell_shaman.cpp\nindex 298118a972..e6a8c90825 100644\n--- a/src/server/scripts/Spells/spell_shaman.cpp\n+++ b/src/server/scripts/Spells/spell_shaman.cpp\n@@ -407,6 +407,16 @@ class spell_sha_earthbind_totem : public AuraScript\n     {\n         if (!GetCaster())\n             return;\n+\n+        //npcbot: workaround for bots\n+        ObjectGuid creatorGuid = GetCaster()->GetCreatorGUID();\n+        if (!creatorGuid.IsEmpty() && !creatorGuid.IsPlayer())\n+            if (Creature const* bot = ObjectAccessor::GetCreature(*GetCaster(), creatorGuid))\n+                if (AuraEffect const* aur = bot->GetDummyAuraEffect(SPELLFAMILY_SHAMAN, 2289, 0))\n+                    if (roll_chance_i(aur->GetBaseAmount()))\n+                        GetTarget()->CastSpell(nullptr, SPELL_SHAMAN_TOTEM_EARTHEN_POWER, true);\n+        //end npcbot\n+\n         if (Player* owner = GetCaster()->GetCharmerOrOwnerPlayerOrPlayerItself())\n             if (AuraEffect* aur = owner->GetDummyAuraEffect(SPELLFAMILY_SHAMAN, 2289, 0))\n                 if (roll_chance_i(aur->GetBaseAmount()))\n@@ -590,6 +600,23 @@ class spell_sha_flametongue_weapon : public AuraScript\n \n     bool CheckProc(ProcEventInfo& eventInfo)\n     {\n+        //npcbot: handle bot enchant check\n+        Creature* bot = eventInfo.GetActor()->ToCreature();\n+        if (bot && bot->IsNPCBot())\n+        {\n+            Item* item = bot->GetBotEquipsByGuid(GetAura()->GetCastItemGUID());\n+            if (!item)\n+                return false;\n+\n+            WeaponAttackType attType = bot->GetBotEquips(0/*BOT_SLOT_MAINHAND*/) == item ? BASE_ATTACK : OFF_ATTACK;\n+            if ((attType == BASE_ATTACK && !(eventInfo.GetTypeMask() & PROC_FLAG_DONE_MAINHAND_ATTACK)) ||\n+                (attType == OFF_ATTACK && !(eventInfo.GetTypeMask() & PROC_FLAG_DONE_OFFHAND_ATTACK)))\n+                return false;\n+\n+            return true;\n+        }\n+        //end npcbot\n+\n         Player* player = eventInfo.GetActor()->ToPlayer();\n         if (!player)\n             return false;\n@@ -613,6 +640,42 @@ class spell_sha_flametongue_weapon : public AuraScript\n     {\n         PreventDefaultAction();\n \n+        //npcbot: handle bot enchant proc\n+        Creature* bot = eventInfo.GetActor()->ToCreature();\n+        if (bot && bot->IsNPCBot())\n+        {\n+            Unit* target = eventInfo.GetActionTarget();\n+            WeaponAttackType attType;\n+            if (eventInfo.GetTypeMask() & PROC_FLAG_DONE_MAINHAND_ATTACK)\n+                attType = BASE_ATTACK;\n+            else\n+                attType = OFF_ATTACK;\n+\n+            Item* item = ASSERT_NOTNULL(bot->GetBotEquipsByGuid(GetAura()->GetCastItemGUID()));\n+\n+            float basePoints = aurEff->GetSpellEffectInfo().CalcValue();\n+\n+            float attackSpeed = bot->GetAttackTime(attType) / 1000.f;\n+            float fireDamage = basePoints / 100.0f;\n+            fireDamage *= attackSpeed;\n+\n+            RoundToInterval(fireDamage, basePoints / 77.0f, basePoints / 25.0f);\n+            float spellPowerBonus = bot->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_FIRE);\n+            spellPowerBonus += target->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_DAMAGE_TAKEN, SPELL_SCHOOL_MASK_FIRE);\n+\n+            float const factorMod = bot->CalculateSpellpowerCoefficientLevelPenalty(GetSpellInfo());\n+            float const spCoeff = 0.03811f;\n+            spellPowerBonus *= spCoeff * attackSpeed * factorMod;\n+\n+            CastSpellExtraArgs args(aurEff);\n+            args\n+                .SetCastItem(item)\n+                .AddSpellBP0(fireDamage + spellPowerBonus);\n+            bot->CastSpell(target, SPELL_SHAMAN_FLAMETONGUE_ATTACK, args);\n+            return;\n+        }\n+        //end npcbot\n+\n         Player* player = eventInfo.GetActor()->ToPlayer();\n         Unit* target = eventInfo.GetActionTarget();\n         WeaponAttackType attType = BASE_ATTACK;\n@@ -1837,6 +1900,23 @@ class spell_sha_windfury_weapon : public AuraScript\n \n     bool CheckProc(ProcEventInfo& eventInfo)\n     {\n+        //npcbot: handle bot enchant check\n+        Creature* bot = eventInfo.GetActor()->ToCreature();\n+        if (bot && bot->IsNPCBot())\n+        {\n+            Item* item = bot->GetBotEquipsByGuid(GetAura()->GetCastItemGUID());\n+            if (!item)\n+                return false;\n+\n+            WeaponAttackType attType = bot->GetBotEquips(0/*BOT_SLOT_MAINHAND*/) == item ? BASE_ATTACK : OFF_ATTACK;\n+            if ((attType == BASE_ATTACK && !(eventInfo.GetTypeMask() & PROC_FLAG_DONE_MAINHAND_ATTACK)) ||\n+                (attType == OFF_ATTACK && !(eventInfo.GetTypeMask() & PROC_FLAG_DONE_OFFHAND_ATTACK)))\n+                return false;\n+\n+            return true;\n+        }\n+        //end npcbot\n+\n         Player* player = eventInfo.GetActor()->ToPlayer();\n         if (!player)\n             return false;\n@@ -1860,6 +1940,53 @@ class spell_sha_windfury_weapon : public AuraScript\n     {\n         PreventDefaultAction();\n \n+        //npcbot: handle bot enchant proc\n+        Creature* bot = eventInfo.GetActor()->ToCreature();\n+        if (bot && bot->IsNPCBot())\n+        {\n+            uint32 spellId = 0;\n+            WeaponAttackType attType;\n+            if (eventInfo.GetTypeMask() & PROC_FLAG_DONE_MAINHAND_ATTACK)\n+            {\n+                spellId = SPELL_SHAMAN_WINDFURY_ATTACK_MH;\n+                attType = BASE_ATTACK;\n+            }\n+            else\n+            {\n+                spellId = SPELL_SHAMAN_WINDFURY_ATTACK_OH;\n+                attType = OFF_ATTACK;\n+            }\n+\n+            Item* item = ASSERT_NOTNULL(bot->GetBotEquipsByGuid(GetAura()->GetCastItemGUID()));\n+\n+            int32 enchantId = static_cast<int32>(item->GetEnchantmentId(TEMP_ENCHANTMENT_SLOT));\n+            int32 extraAttackPower = 0;\n+            SpellInfo const* spellInfo = sSpellMgr->AssertSpellInfo(SPELL_SHAMAN_WINDFURY_WEAPON_R1);\n+            while (spellInfo)\n+            {\n+                if (spellInfo->GetEffect(EFFECT_0).MiscValue == enchantId)\n+                {\n+                    extraAttackPower = spellInfo->GetEffect(EFFECT_1).CalcValue(bot);\n+                    break;\n+                }\n+                spellInfo = spellInfo->GetNextRankSpell();\n+            }\n+\n+            if (!extraAttackPower)\n+                return;\n+\n+            int32 amount = static_cast<int32>(extraAttackPower / 14.f * bot->GetAttackTime(attType) / 1000.f);\n+\n+            CastSpellExtraArgs args(aurEff);\n+            args.AddSpellBP0(amount);\n+            // Attack twice\n+            for (uint8 i = 0; i < 2; ++i)\n+                bot->CastSpell(eventInfo.GetActionTarget(), spellId, args);\n+\n+            return;\n+        }\n+        //end npcbot\n+\n         Player* player = eventInfo.GetActor()->ToPlayer();\n \n         uint32 spellId = 0;\ndiff --git a/src/server/scripts/Spells/spell_warlock.cpp b/src/server/scripts/Spells/spell_warlock.cpp\nindex 487f2da2c3..1346d7a574 100644\n--- a/src/server/scripts/Spells/spell_warlock.cpp\n+++ b/src/server/scripts/Spells/spell_warlock.cpp\n@@ -709,6 +709,10 @@ class spell_warl_life_tap : public SpellScript\n \n     bool Load() override\n     {\n+        //npcbot\n+        if (GetCaster()->IsNPCBot())\n+            return true;\n+        //end npcbot\n         return GetCaster()->GetTypeId() == TYPEID_PLAYER;\n     }\n \n@@ -719,6 +723,11 @@ class spell_warl_life_tap : public SpellScript\n \n     void HandleDummy(SpellEffIndex effIndex)\n     {\n+        //npcbot: skip - handled inside class AI\n+        if (GetCaster()->IsNPCBot())\n+            return;\n+        //end npcbot\n+\n         Unit* caster = GetCaster();\n         int32 base = GetEffectInfo(effIndex).CalcValue();\n \ndiff --git a/src/server/scripts/Spells/spell_warrior.cpp b/src/server/scripts/Spells/spell_warrior.cpp\nindex 6333ddaa29..e8c41cefd4 100644\n--- a/src/server/scripts/Spells/spell_warrior.cpp\n+++ b/src/server/scripts/Spells/spell_warrior.cpp\n@@ -31,6 +31,10 @@\n #include \"SpellMgr.h\"\n #include \"SpellScript.h\"\n \n+//npcbot\n+#include \"Creature.h\"\n+//end npcbot\n+\n enum WarriorSpells\n {\n     SPELL_WARRIOR_BLADESTORM_PERIODIC_WHIRLWIND     = 50622,\n@@ -266,6 +270,11 @@ class spell_warr_deep_wounds_aura : public AuraScript\n         if (!damageInfo)\n             return false;\n \n+        //npcbot: allow for bots\n+        if (eventInfo.GetActor()->IsNPCBot())\n+            return true;\n+        //end npcbot\n+\n         return eventInfo.GetActor()->GetTypeId() == TYPEID_PLAYER;\n     }\n \ndiff --git a/src/server/shared/DataStores/DBCStructure.h b/src/server/shared/DataStores/DBCStructure.h\nindex bcb3f204ff..3e3febb8a8 100644\n--- a/src/server/shared/DataStores/DBCStructure.h\n+++ b/src/server/shared/DataStores/DBCStructure.h\n@@ -878,13 +878,14 @@ struct ItemBagFamilyEntry\n     //uint32 Name_lang_mask;                                // 17\n };\n \n-/*\n struct ItemDisplayInfoEntry\n {\n-    uint32 ID;                                              // 0\n+/*\n+  */uint32 ID;/*                                            // 0\n     char const* ModelName[2];                               // 1-2\n     char const* ModelTexture[2];                            // 3-4\n-    char const* InventoryIcon[2];                           // 5-6\n+  */char const* InventoryIcon;/*                            // 5\n+    char const* InventoryIcon2;                             // 6\n     uint32 GeosetGroup[3];                                  // 7-9\n     uint32 Flags;                                           // 10\n     uint32 SpellVisualID;                                   // 11\n@@ -893,8 +894,8 @@ struct ItemDisplayInfoEntry\n     char const* Texture[8];                                 // 15-22\n     int32 ItemVisual;                                       // 23\n     uint32 ParticleColorID;                                 // 24\n-};\n */\n+};\n \n /*\n struct ItemCondExtCostsEntry\ndiff --git a/src/server/shared/DataStores/DBCfmt.h b/src/server/shared/DataStores/DBCfmt.h\nindex e19ce793b2..3121748ccd 100644\n--- a/src/server/shared/DataStores/DBCfmt.h\n+++ b/src/server/shared/DataStores/DBCfmt.h\n@@ -75,7 +75,7 @@ char constexpr GtRegenMPPerSptfmt[] = \"f\";\n char constexpr Holidaysfmt[] = \"niiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiixxsiix\";\n char constexpr Itemfmt[] = \"niiiiiii\";\n char constexpr ItemBagFamilyfmt[] = \"nxxxxxxxxxxxxxxxxx\";\n-//char constexpr ItemDisplayTemplateEntryfmt[] = \"nxxxxxxxxxxixxxxxxxxxxx\";\n+char constexpr ItemDisplayTemplateEntryfmt[] = \"nxxxxsxxxxxxxxxxxxxxxxxxx\";\n //char constexpr ItemCondExtCostsEntryfmt[] = \"xiii\";\n char constexpr ItemExtendedCostEntryfmt[] = \"niiiiiiiiiiiiiix\";\n char constexpr ItemLimitCategoryEntryfmt[] = \"nxxxxxxxxxxxxxxxxxii\";\ndiff --git a/src/server/shared/SharedDefines.h b/src/server/shared/SharedDefines.h\nindex 321f65c3d2..b3dbaeb15e 100644\n--- a/src/server/shared/SharedDefines.h\n+++ b/src/server/shared/SharedDefines.h\n@@ -209,7 +209,14 @@ enum UnitClass\n     UNIT_CLASS_MAGE                     = 8\n };\n \n+//npcbot\n+/*\n+//end npcbot\n #define CLASSMASK_ALL_CREATURES ((1<<(UNIT_CLASS_WARRIOR-1)) | (1<<(UNIT_CLASS_PALADIN-1)) | (1<<(UNIT_CLASS_ROGUE-1)) | (1<<(UNIT_CLASS_MAGE-1)))\n+//npcbot\n+*/\n+#define CLASSMASK_ALL_CREATURES CLASSMASK_ALL_PLAYABLE\n+//end npcbot\n \n #define CLASSMASK_WAND_USERS ((1<<(CLASS_PRIEST-1)) | (1<<(CLASS_MAGE-1)) | (1<<(CLASS_WARLOCK-1)))\n \ndiff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist\nindex 4224f59906..391e7a4a15 100644\n--- a/src/server/worldserver/worldserver.conf.dist\n+++ b/src/server/worldserver/worldserver.conf.dist\n@@ -3952,6 +3952,7 @@ Appender.Console=1,3,0\n Appender.Server=2,2,0,Server.log,w\n Appender.GM=2,2,1,GM.log\n Appender.DBErrors=2,2,0,DBErrors.log\n+Appender.NpcBots=1,2,0\n \n #  Logger config values: Given a logger \"name\"\n #    Logger.name\n@@ -3978,6 +3979,7 @@ Logger.scripts.hotswap=3,Console Server\n Logger.sql.sql=5,Console DBErrors\n Logger.sql.updates=3,Console Server\n Logger.mmaps=3,Server\n+Logger.npcbots=2,NpcBots Server\n \n #Logger.achievement=3,Console Server\n #Logger.addon=3,Console Server\n@@ -4166,3 +4168,766 @@ Metric.OverallStatusInterval = 1\n \n #\n ###################################################################################################\n+\n+###################################################################################################\n+# NPCBOT CONFIGURATION\n+#\n+#    NpcBot.Enable\n+#        Description: Enables NpcBot system.\n+#        Default:     1 - enable\n+#                     0 - disable\n+\n+NpcBot.Enable = 1\n+\n+#\n+#    NpcBot.LogToDB\n+#        Description: Log bot events debug info to DB. Records will be kept up to 30 days\n+#        Default:     1 - (Enable)\n+#                     0 - (Disable)\n+\n+NpcBot.LogToDB = 1\n+\n+#\n+#    NpcBot.MaxBots\n+#        Description: Maximum number of bots player can hire per level bracket:\n+#                     0-9, 10-19, 20,29, ... , 70-79, 80+.\n+#        Default:     1,1,1,1,1,1,1,1,1 - (1 for all levels)\n+#                     0,1,2,3,4,5,6,7,8 - (1 per 10 levels)\n+#        Max:         39\n+\n+NpcBot.MaxBots = 1,1,1,1,1,1,1,1,1\n+\n+#\n+#    NpcBot.MaxBotsPerClass\n+#        Description: Maximum number of bots player can hire per bot class.\n+#        Default:     0 - no limit\n+\n+NpcBot.MaxBotsPerClass = 0\n+\n+#\n+#    NpcBot.MaxBotsPerAccount\n+#        Description: Maximum total number of bots players can hire per account.\n+#        Default:     0 - no limit\n+#                     9 - up to 9 bots total per account\n+\n+NpcBot.MaxBotsPerAccount = 0\n+\n+#\n+#    NpcBot.Botgiver.FilterRaces\n+#        Description: Make botgiver only offer bots of player faction (normal classes).\n+#        Default:     0 - disable\n+\n+NpcBot.Botgiver.FilterRaces = 0\n+\n+#\n+#    NpcBot.SharedOwnership.Options\n+#        Description: Bitmask describing enabled shared ownership options.\n+#        Note:        WARNING! SHARED BOT OWNERSHIP ENABLES EXPLOITS! USE ON YOUR OWN RISK!\n+#        Note2:       Term 'share' below refers to a player whom ownership is being shared with\n+#        Values:\n+#                     0 - Disable completely (default)\n+#                     1 - Enable (allows bot owner to share their bots)\n+#                     2 - Shared equipment management (including soulbound items)\n+#                     4 - Shared ownership extension (allow shares to share the bot further)\n+#                     8 - Shared ownership removal (allows shares to remove other shares)\n+#        Notes:\n+#                     Initially only bot owner can add new shares\n+#                     Shares cannot remove bot owner from shared owneship list (or add to it)\n+#                     Shares cannot dismiss the bot. If bot ownership expires due to bot expiry\n+#                       timer equipment is always returned to the original owner. If share's bot\n+#                       ownership expires due to rent cost the bot becomes unbound instead.\n+#                     Bots will accept any player from total ownership list as current master,\n+#                       whoever is logged in currently and will not switch until they log out,\n+#                       original owner takes priority but only if bot has no master currently.\n+\n+NpcBot.SharedOwnership.Options = 0\n+\n+#\n+#    NpcBot.SharedOwnership.MaxOwners\n+#        Description: Maximum number of players a bot can be shared with (NOT counting the owner)\n+#        Note:        WARNING! SHARED BOT OWNERSHIP ENABLES EXPLOITS! USE ON YOUR OWN RISK!\n+#        Default:     0\n+#        Max:         39\n+\n+NpcBot.SharedOwnership.MaxOwners = 0\n+\n+#\n+#    NpcBot.BaseFollowDistance\n+#        Description: Default bot follow distance.\n+#        Note:        This parameter determines bots' formation size, distance at which bots\n+#                     will chase and attack enemies.\n+#        Note2:       This parameter is set for each player at login.\n+#        Default:     30\n+\n+NpcBot.BaseFollowDistance = 30\n+\n+#\n+#    NpcBot.XpReduction.Enable\n+#    NpcBot.XpReduction.GroupOnly\n+#    NpcBot.XpReduction.Extra.Amount\n+#    NpcBot.XpReduction.Extra.StartingNumber\n+#        Description: Enable Blizzlike XP penalty for using bots counting\n+#                     either all participating bots or in <GroupOnly>.\n+#                     Additional XP reduction <Amount> applies on top of that,\n+#                     starting with <StartingNumber>'th bot\n+#        Example:     Group of 4, 3 bots, reduction is 20, start is 2:\n+#                     (100% - ((3-(2-1))*20)) * 1.3 / 4 = 19.5% exp gained\n+#        Note:        Maximum extra xp reduction factor is 90%.\n+#        Default:     0 - (NpcBot.XpReduction.Enable)\n+#                     0 - (NpcBot.XpReduction.GroupOnly)\n+#                     0 - (NpcBot.XpReduction.Extra.Amount)\n+#                     2 - (NpcBot.XpReduction.Extra.StartingNumber)\n+\n+NpcBot.XpReduction.Enable               = 0\n+NpcBot.XpReduction.GroupOnly            = 0\n+NpcBot.XpReduction.Extra.Amount         = 0\n+NpcBot.XpReduction.Extra.StartingNumber = 2\n+\n+#\n+#    NpcBot.HonorReduction.Enable\n+#    NpcBot.HonorReduction.GroupOnly\n+#        Description: Enable Blizzlike honor gain reduction when using bots counting\n+#                     either all participating bots or in <GroupOnly>.\n+#        Default:     0 - (NpcBot.HonorReduction.Enable)\n+#                     0 - (NpcBot.HonorReduction.GroupOnly)\n+\n+NpcBot.HonorReduction.Enable    = 0\n+NpcBot.HonorReduction.GroupOnly = 0\n+\n+#\n+#    NpcBot.MoneyShare.Enable\n+#    NpcBot.MoneyShare.GroupOnly\n+#        Description: Share money loot with bots, effectively reducing money amount players receive.\n+#        Example:     Group of 5, 3 bots, looting 100 copper, players receive 20 copper each.\n+#        Default:     0 - (NpcBot.MoneyShare.Enable)\n+#                     0 - (NpcBot.MoneyShare.GroupOnly)\n+\n+NpcBot.MoneyShare.Enable    = 0\n+NpcBot.MoneyShare.GroupOnly = 0\n+\n+#\n+#    NpcBot.MountLevel.60\n+#    NpcBot.MountLevel.100\n+#        Description: Minimum level for bots to be able to use ground mounts\n+#        Default:     20 - (NpcBot.MountLevel.60)\n+#                     40 - (NpcBot.MountLevel.100)\n+\n+NpcBot.MountLevel.60  = 20\n+NpcBot.MountLevel.100 = 40\n+\n+#\n+#    NpcBot.HealTargetIconMask\n+#    NpcBot.TankTargetIconMask\n+#    NpcBot.OffTankTargetIconMask\n+#    NpcBot.DPSTargetIconMask\n+#    NpcBot.RangedDPSTargetIconMask\n+#    NpcBot.NoDPSTargetIconMask\n+#        Description: Icon number bitmask which bots use to search for primary attack\n+#                     target, (off-)tanking target, target to heal and protect (out of party),\n+#                     or target to try to not damage.\n+#        Note:        Many creatures cannot accept heal.\n+#        Note2:       While icon is active NPCBot ddealers/tanks will ignore any other targets\n+#                     and will not break from combat to follow you.\n+#        Note3:       If you set multiple targets only one target at a time will be used.\n+#        Example:     To check Star, Triangle and Square we need 1 + 8 + 32 = 41.\n+#        Default:     0 (Disable)\n+#                     1 - Star\n+#                     2 - Circle\n+#                     4 - Diamond\n+#                     8 - Triangle\n+#                     16 - Moon\n+#                     32 - Square\n+#                     64 - Cross\n+#                     128 - Skull\n+\n+NpcBot.HealTargetIconMask = 0\n+NpcBot.TankTargetIconMask = 0\n+NpcBot.OffTankTargetIconMask = 0\n+NpcBot.DPSTargetIconMask = 0\n+NpcBot.RangedDPSTargetIconMask = 0\n+NpcBot.NoDPSTargetIconMask = 0\n+\n+#\n+#    NpcBot.Mult.Damage.Physical\n+#    NpcBot.Mult.Damage.Spell\n+#    NpcBot.Mult.Healing\n+#    NpcBot.Mult.HP\n+#        Description: Multipliers for bots' damage, healing, etc. Allows to balance bots vs players.\n+#                     Only affects normal spawned bots and generated wandering bot in BGs.\n+#        Default:     1.0\n+#        Minimum:     0.1\n+#        Maximum:    10.0\n+\n+NpcBot.Mult.Damage.Physical = 1.0\n+NpcBot.Mult.Damage.Spell    = 1.0\n+NpcBot.Mult.Healing         = 1.0\n+NpcBot.Mult.HP              = 1.0\n+\n+#\n+#    NpcBot.Mult.Wanderer.Damage\n+#    NpcBot.Mult.Wanderer.Healing\n+#    NpcBot.Mult.Wanderer.HP\n+#    NpcBot.Mult.Wanderer.Speed\n+#        Description: Multipliers for wandering bots' damage, healing, hp and speed.\n+#                     Only affects wandering bots in open world.\n+#        Default:     1.0\n+#        Minimum:     0.1\n+#        Maximum:    10.0\n+\n+NpcBot.Mult.Wanderer.Damage  = 1.0\n+NpcBot.Mult.Wanderer.Healing = 1.0\n+NpcBot.Mult.Wanderer.HP      = 1.0\n+NpcBot.Mult.Wanderer.Speed   = 1.0\n+\n+#\n+#    NpcBot.Mult.Damage.<Class>\n+#        Description: Multipliers for bots' damage by class. Allows to balance dps between bot classes.\n+#        Default:     1.0\n+#        Minimum:     0.1\n+#        Maximum:    10.0\n+\n+NpcBot.Mult.Damage.Warrior           = 1.0\n+NpcBot.Mult.Damage.Paladin           = 1.0\n+NpcBot.Mult.Damage.Hunter            = 1.0\n+NpcBot.Mult.Damage.Rogue             = 1.0\n+NpcBot.Mult.Damage.Priest            = 1.0\n+NpcBot.Mult.Damage.DeathKnight       = 1.0\n+NpcBot.Mult.Damage.Shaman            = 1.0\n+NpcBot.Mult.Damage.Mage              = 1.0\n+NpcBot.Mult.Damage.Warlock           = 1.0\n+NpcBot.Mult.Damage.Druid             = 1.0\n+NpcBot.Mult.Damage.Blademaster       = 1.0\n+NpcBot.Mult.Damage.ObsidianDestroyer = 1.0\n+NpcBot.Mult.Damage.Archmage          = 1.0\n+NpcBot.Mult.Damage.Dreadlord         = 1.0\n+NpcBot.Mult.Damage.SpellBreaker      = 1.0\n+NpcBot.Mult.Damage.DarkRanger        = 1.0\n+NpcBot.Mult.Damage.Necromancer       = 1.0\n+NpcBot.Mult.Damage.SeaWitch          = 1.0\n+NpcBot.Mult.Damage.CryptLord         = 1.0\n+\n+#\n+#    NpcBot.Mult.Damage.Levels\n+#    NpcBot.Mult.Healing.Levels\n+#    NpcBot.Mult.HP.Levels\n+#    NpcBot.Mult.MP.Levels\n+#        Description: Multipliers for bots' damage/healing/hp/mp by level: 0-9,10-19,...,70-79,80+\n+#                     At least 9 values required each.\n+#        Default:     1.0\n+#        Minimum:     0.1\n+#        Maximum:    10.0\n+\n+NpcBot.Mult.Damage.Levels  = 1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0\n+NpcBot.Mult.Healing.Levels = 1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0\n+NpcBot.Mult.HP.Levels      = 1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0\n+NpcBot.Mult.MP.Levels      = 1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0\n+\n+#\n+#    NpcBot.Enable.Dungeon\n+#    NpcBot.Enable.Raid\n+#    NpcBot.Enable.BG\n+#    NpcBot.Enable.Arena\n+#    NpcBot.Enable.DungeonFinder\n+#        Description: Allow bots to enter PvE/PvP areas and Dungeon Finder query.\n+#        Default:     1 - (NpcBot.Enable.Dungeon)\n+#                     0 - (NpcBot.Enable.Raid)\n+#                     0 - (NpcBot.Enable.BG)\n+#                     0 - (NpcBot.Enable.Arena)\n+#                     1 - (NpcBot.Enable.DungeonFinder)\n+\n+NpcBot.Enable.Dungeon       = 1\n+NpcBot.Enable.Raid          = 0\n+NpcBot.Enable.BG            = 0\n+NpcBot.Enable.Arena         = 0\n+NpcBot.Enable.DungeonFinder = 1\n+\n+#\n+#    NpcBot.DisableInstances\n+#        Description: When NpcBot.Enable.Dungeon or/and NpcBot.Enable.Raid options are set to 1\n+#                     excludes certain instance map ids, preventing bots from entering those maps\n+#        Default:     \"\" - (None)\n+#                     \"509,531\" - (Disable AQ20 and AQ40)\n+\n+NpcBot.DisableInstances = \"\"\n+\n+#\n+#    NpcBot.Limit.Dungeon\n+#    NpcBot.Limit.Raid\n+#        Description: Enable/Disable instance players limitation rules for bots.\n+#        Default:     1 - (NpcBot.Limit.Dungeon)\n+#                     1 - (NpcBot.Limit.Raid)\n+\n+NpcBot.Limit.Dungeon = 1\n+NpcBot.Limit.Raid    = 1\n+\n+#\n+#    NpcBot.HideSpawns\n+#        Description: Prevent inactive bots from entering world\n+#        Note:        Botgiver npc will become the only way to hire bots\n+#        Note2:       Only GM's presense will reveal bot's spawn location (temporarily)\n+#        Default:     1 - (Enabled)\n+#                     0 - (Disabled, keep all spawned bots in world)\n+\n+NpcBot.HideSpawns = 1\n+\n+#\n+#    NpcBot.Cost.Hire\n+#    NpcBot.Cost.Rent\n+#        Description: Bot recruitment cost (in copper). Hire cost is the amount player has to pay\n+#                     to recruit a bot. Rent cost is the amount player has to pay per 1 hour\n+#                     to keep a bot with them, bot is automatically removed if player doesn't have\n+#                     enough money to pay the rent cost.\n+#        Note1:       Hire cost is for level 80 characters, for lower levels cost is reduced greatly\n+#        Note2:       Rent is collected every 10 minutes so at least 6 copper per hour is taken\n+#        Default:     1000000 - (NpcBot.Cost.Hire, 100 gold)\n+#                     0       - (NpcBot.Cost.Rent)\n+\n+NpcBot.Cost.Hire = 1000000\n+NpcBot.Cost.Rent = 0\n+\n+#\n+#    NpcBot.UpdateDelay.Base\n+#        Description: Base delay between bot AI update cycles (in milliseconds).\n+#        Note:        This parameter allows you to increase reaction time and slow down bots\n+#                     in general. This may be useful if you want to balance bots in PvP.\n+#        Note2:       This value is added on top of existing semi-randomized delay.\n+#        Default:     0 (No additional delay)\n+\n+NpcBot.UpdateDelay.Base = 0\n+\n+#\n+#    NpcBot.EngageDelay.DPS\n+#    NpcBot.EngageDelay.Heal\n+#        Description: Delay for first healing / non-tank damage after target was engaged\n+#                     by tank (in milliseconds).\n+#        Note:        This does not affect only bosses - all combat except PvP will be affected.\n+#        Note2:       This value affects all owned bots and is set for every player at login.\n+#        Default:     0 - (No delay)\n+#                     1000 - (1 second)\n+\n+NpcBot.EngageDelay.DPS  = 0\n+NpcBot.EngageDelay.Heal = 0\n+\n+#\n+#    NpcBot.PvP\n+#        Description: Allow bots to attack player-controlled units (players, pets, bots, etc.).\n+#        Note:        This rule only applies to player-controlled bots.\n+#        Default:     1\n+\n+NpcBot.PvP = 1\n+\n+#\n+#    NpcBot.Movements.InterruptFood\n+#        Description: Remove food and drink auras when starting to move.\n+#        Note:        Bots don't use food or drink if not standing still.\n+#        Default:     0 - (Do not interrupt)\n+#                     1 - (Interrupt food and drink)\n+\n+NpcBot.Movements.InterruptFood = 0\n+\n+#\n+#    NpcBot.EquipmentDisplay.Enable\n+#        Description: Enable displaying equipment changes other than weapons on bot models.\n+#        Note:        Client limits equipment updates to\n+#                     1) relog\n+#                     2) taking a taxi flight\n+#                     3) teleporting between maps\n+#                     4) not seeing this bot for 3 minutes\n+#                     5) bot changing displayId (polymorph, shapeshift, etc.)\n+#        Note2:       If client registers (5) of a single bot 3+ times\n+#                     said client may crash at exiting game (Error #132) unless (4) happens.\n+#        Note3:       Changing this setting requires server restart.\n+#        Note4:       Bots having no equipment will not appear naked.\n+#        Default:     1 - (Enabled)\n+#                     0 - (Disabled)\n+\n+NpcBot.EquipmentDisplay.Enable = 1\n+\n+#\n+#    NpcBot.EquipmentDisplay.ShowCloak\n+#    NpcBot.EquipmentDisplay.ShowHelm\n+#        Description: Equipment display rules.\n+#        Default:     1 - (NpcBot.EquipmentDisplay.ShowCloak)\n+#                     1 - (NpcBot.EquipmentDisplay.ShowHelm)\n+\n+NpcBot.EquipmentDisplay.ShowCloak = 1\n+NpcBot.EquipmentDisplay.ShowHelm  = 1\n+\n+#\n+#    NpcBot.Transmog.Enable\n+#        Description: Enable transmogrification of bots' equipment.\n+#        Default:     0 - (Disabled)\n+#                     1 - (Enabled)\n+\n+NpcBot.Transmog.Enable = 0\n+\n+#\n+#    NpcBot.Transmog.MixArmorClasses\n+#    NpcBot.Transmog.MixWeaponClasses\n+#    NpcBot.Transmog.MixWeaponInventoryTypes\n+#    NpcBot.Transmog.UseEquipmentSlots\n+#        Description: Enable different armor/weapon types to be transmogrified from one to another\n+#                     (i.e. plate to leather, axe to mace, dagger to polearm).\n+#                     'NpcBot.Transmog.UseEquipmentSlots' makes transmog affect equipment slots\n+#                     instead of item IDs and forces all other options.\n+#        Default:     0 - (NpcBot.Transmog.MixArmorClasses)\n+#                     0 - (NpcBot.Transmog.MixWeaponClasses)\n+#                     0 - (NpcBot.Transmog.MixWeaponInventoryTypes)\n+#                     0 - (NpcBot.Transmog.UseEquipmentSlots)\n+\n+NpcBot.Transmog.MixArmorClasses = 0\n+NpcBot.Transmog.MixWeaponClasses = 0\n+NpcBot.Transmog.MixWeaponInventoryTypes = 0\n+NpcBot.Transmog.UseEquipmentSlots = 0\n+\n+#\n+#    NpcBot.Gossip.ShowEquipmentListItems\n+#        Description: Send whisper message with clickable items list in equipment gossip menu.\n+#        Default:     0 - (Disable)\n+#                     1 - (Enable)\n+\n+NpcBot.Gossip.ShowEquipmentListItems = 0\n+\n+#\n+#    NpcBot.GearBank.Enable\n+#        Description: Enable extra bot gear storage, accessed through gossip menu (per player).\n+#        Default:     1 - (Enabled)\n+#                     0 - (Disabled)\n+\n+NpcBot.GearBank.Enable = 1\n+\n+#\n+#    NpcBot.GearBank.Capacity\n+#        Description: Maximum number of items player can keep in bot gear storage.\n+#        Note:        This parameter only affects player's ability to *deposit* items.\n+#        Default:     40 - (Maximum 40 items)\n+#                     0  - (Unlimited capacity)\n+\n+NpcBot.GearBank.Capacity = 40\n+\n+#\n+#    NpcBot.GearBank.EquipmentSets\n+#        Description: Enable players to create bot equipment sets from items currently equipped\n+#                     on a bot, allowing to quickly swap bot equipment using gear bank as storage.\n+#        Default:     0  - (Disabled)\n+#                     10 - (Enabled, allow to keep up to 10 equipment sets per player)\n+#                     30 - (Absolute maximum to fit on a single page, this is a hard limit)\n+\n+NpcBot.GearBank.EquipmentSets = 0\n+\n+#\n+#    NpcBot.Classes.<Class>.Enable\n+#        Description: Allow players to hire bots of certain classes.\n+#        Note:        Some non-standard class abilities may be unbalanced or game breaking.\n+#        Default:     1 - (NpcBot.Classes.Warrior.Enable)\n+#                     1 - (NpcBot.Classes.Paladin.Enable)\n+#                     1 - (NpcBot.Classes.Hunter.Enable)\n+#                     1 - (NpcBot.Classes.Rogue.Enable)\n+#                     1 - (NpcBot.Classes.Priest.Enable)\n+#                     1 - (NpcBot.Classes.DeathKnight.Enable)\n+#                     1 - (NpcBot.Classes.Shaman.Enable)\n+#                     1 - (NpcBot.Classes.Mage.Enable)\n+#                     1 - (NpcBot.Classes.Warlock.Enable)\n+#                     1 - (NpcBot.Classes.Druid.Enable)\n+#                     1 - (NpcBot.Classes.Blademaster.Enable)\n+#                     1 - (NpcBot.Classes.ObsidianDestroyer.Enable)\n+#                     1 - (NpcBot.Classes.Archmage.Enable)\n+#                     1 - (NpcBot.Classes.Dreadlord.Enable)\n+#                     1 - (NpcBot.Classes.SpellBreaker.Enable)\n+#                     1 - (NpcBot.Classes.DarkRanger.Enable)\n+#                     1 - (NpcBot.Classes.Necromancer.Enable)\n+#                     1 - (NpcBot.Classes.SeaWitch.Enable)\n+#                     1 - (NpcBot.Classes.CryptLord.Enable)\n+\n+NpcBot.Classes.Warrior.Enable           = 1\n+NpcBot.Classes.Paladin.Enable           = 1\n+NpcBot.Classes.Hunter.Enable            = 1\n+NpcBot.Classes.Rogue.Enable             = 1\n+NpcBot.Classes.Priest.Enable            = 1\n+NpcBot.Classes.DeathKnight.Enable       = 1\n+NpcBot.Classes.Shaman.Enable            = 1\n+NpcBot.Classes.Mage.Enable              = 1\n+NpcBot.Classes.Warlock.Enable           = 1\n+NpcBot.Classes.Druid.Enable             = 1\n+NpcBot.Classes.Blademaster.Enable       = 1\n+NpcBot.Classes.ObsidianDestroyer.Enable = 1\n+NpcBot.Classes.Archmage.Enable          = 1\n+NpcBot.Classes.Dreadlord.Enable         = 1\n+NpcBot.Classes.SpellBreaker.Enable      = 1\n+NpcBot.Classes.DarkRanger.Enable        = 1\n+NpcBot.Classes.Necromancer.Enable       = 1\n+NpcBot.Classes.SeaWitch.Enable          = 1\n+NpcBot.Classes.CryptLord.Enable         = 1\n+\n+#\n+#    NpcBot.Stats.Limits.Enable\n+#        Description: Enable or disable stats limits for bots.\n+#        Default:     0 - Disabled\n+\n+NpcBot.Stats.Limits.Enable = 0\n+\n+#\n+#    NpcBot.Stats.Limits.<Stat>\n+#        Description: Set dodge, parry, block and crit chance percentage limit for bots.\n+#        Note:        Some bot classes may ignore some of these values.\n+#        Note2:       Auras can still increase these stats above limit.\n+#        Default:     95.0 (95%)\n+\n+NpcBot.Stats.Limits.Dodge = 95.0\n+NpcBot.Stats.Limits.Parry = 95.0\n+NpcBot.Stats.Limits.Block = 95.0\n+NpcBot.Stats.Limits.Crit  = 95.0\n+\n+#\n+#    NpcBot.InfoPacketsLimit\n+#        Description: This is a workaround for known issue #5.\n+#                     If more than 100 bots are spawned in a single spot players trying\n+#                     to approach them will be kicked by AntiDOS protection due to\n+#                     'flooding' CMSG_GET_MIRRORIMAGE_DATA packets. This setting\n+#                     overrides packets limit per tick for that request type.\n+#        Note:        If you care about your server stability at all, use this only as a\n+#                     temporary solution and spread your bots spawn points properly.\n+#        Default:     -1  - (use default limit set by TC devs)\n+#                     500 - (500 bots in one spot won't get you kicked)\n+\n+NpcBot.InfoPacketsLimit = -1\n+\n+#\n+#    NpcBot.OwnershipExpireTime\n+#        Description: Time (in seconds) before bot ownership is automatically cancelled.\n+#        Note:        NPCBot ownership may only expire after player goes offline.\n+#        Note2:       All items will be mailed back to player as usual.\n+#        Default:     0 - (Disabled)\n+#                     604800 - (7 Days)\n+\n+NpcBot.OwnershipExpireTime = 0\n+\n+#\n+#    NpcBot.OwnershipExpireMode\n+#        Description: Ownership expiration mode. Determines when the timer starts.\n+#        Default:     0 - (Player goes offline, timer resets if player logs back in)\n+#                     1 - (Player hires the bot, timer never resets)\n+\n+NpcBot.OwnershipExpireMode = 0\n+\n+#\n+#    NpcBot.EnrageOnDismiss\n+#        Description: Enable Berserk buff when bot is dismissed and related hostile reaction.\n+#        Default:     1 - (Enabled)\n+#                     0 - (Disabled)\n+\n+NpcBot.EnrageOnDismiss = 1\n+\n+#\n+#    NpcBot.WanderingBots.Continents.Count\n+#        Description: Desired number of free wandering bots to generate. Wandering bots roam\n+#                     around the map looking for trouble. Names and visuals are cloned from\n+#                     existing non-spawned bots. Wandering bots aren't saved in DB.\n+#        Note:        Wandering bots keep grids loaded, increasing CPU and memory usage.\n+#        Note2:       You must have at least this number of non-spawned bots in creature_template.\n+#        Default:     0 - (Disabled)\n+\n+NpcBot.WanderingBots.Continents.Count = 0\n+\n+#\n+#    NpcBot.WanderingBots.Continents.Levels\n+#        Description: Percentage of wandering bots to spawn per level bracket:\n+#                     0-9, 10-19, 20,29, ... , 70-79, 80+.\n+#        Note:        Total percentage must be exactly 100.\n+#        Note2:       Classes with minimum level requirement may ignore this parameter.\n+#        Default:     25,15,15,10,5,10,20,0,0\n+\n+NpcBot.WanderingBots.Continents.Levels = 25,15,15,10,5,10,20,0,0\n+\n+#\n+#    NpcBot.WanderingBots.Continents.Maps\n+#        Description: Continent map IDs where wandering bots are allowed to spawn.\n+#        Note:        Wandering bots will never outlevel the map they are in.\n+#        Default:     0,1,530,571 - (Eastern Kingdoms, Kalimdor, Outland, Northrend)\n+\n+NpcBot.WanderingBots.Continents.Maps = 0,1,530,571\n+\n+#\n+#    NpcBot.WanderingBots.Continents.XPGain\n+#        Description: XP gained by wandering bots mutiplier. Directly affects bot leveling rate.\n+#        Default:     1.0 - (100% XP gained)\n+#                     0.1 - (10% XP gained)\n+#        Minimum:     0.0\n+#        Maximum:   100.0\n+\n+NpcBot.WanderingBots.Continents.XPGain = 1.0\n+\n+#\n+#    NpcBot.WanderingBots.KillReward.Money\n+#    NpcBot.WanderingBots.KillReward.ItemCount\n+#    NpcBot.WanderingBots.KillReward.ItemQuality\n+#        Description: Wandering bot kill loot reward. World maps only.\n+#                     Money: Amount of money (in copper) to drop at level 80,\n+#                       before level and kill count vs death count normalization.\n+#                     ItemCount: Maximum number of items to drop, item ids are taken from\n+#                       bot equipment. Range: 0..18.\n+#                     ItemQuality: Maximum quality of dropped items. Most bots are equipped\n+#                       with 2/3/4 (uncommon/rare/epic) Range: 0..7.\n+#        Default:     0 - (NpcBot.WanderingBots.KillReward.Money)\n+#                     0 - (NpcBot.WanderingBots.KillReward.ItemCount)\n+#                     0 - (NpcBot.WanderingBots.KillReward.ItemQuality)\n+\n+NpcBot.WanderingBots.KillReward.Money       = 0\n+NpcBot.WanderingBots.KillReward.ItemCount   = 0\n+NpcBot.WanderingBots.KillReward.ItemQuality = 0\n+\n+#\n+#    NpcBot.WanderingBots.MaxItemLevel.Levels\n+#        Description: Maximum item ilevel to generate for wandering bots per level bracket:\n+#                     0-9, 10-19, 20,29, ... , 70-79, 80+.\n+#        Note:        If item generation attempt fails becuse of item ilevel restriction\n+#                     the item will be generated again with this restriction ignored\n+#        Example:     0,0,0,0,0,0,0,0,200 makes level 80+ wandering bots only generate\n+#                     items of ilevel 200 or less\n+#        Default:     0,0,0,0,0,0,0,0,0\n+\n+NpcBot.WanderingBots.MaxItemLevel.Levels = 0,0,0,0,0,0,0,0,0\n+\n+#\n+#    NpcBot.WanderingBots.BG.Enable\n+#        Description: Allow wandering bots generation for Battlegrounds.\n+#        Note:        Bots are temporarily borrowed from non-spawned bots pool.\n+#        Default:     0 - (Disabled)\n+#                     1 - (Enable)\n+\n+NpcBot.WanderingBots.BG.Enable = 0\n+\n+#\n+#    NpcBot.WanderingBots.BG.CapLevel\n+#        Description: Enforce BG bot maximum level limit set by Expansion and MaxPlayerLevel\n+#                     config paramter values.\n+#        Default:     0 - (Disabled)\n+#                     1 - (Enable)\n+\n+NpcBot.WanderingBots.BG.CapLevel = 0\n+\n+#\n+#    NpcBot.WanderingBots.BG.CapLevelByFirstPlayer\n+#        Description: Prevent setting BG bot level higher than player triggering its generation\n+#        Default:     0 - (Disabled)\n+#                     1 - (Enable)\n+\n+NpcBot.WanderingBots.BG.CapLevelByFirstPlayer = 0\n+\n+#\n+#    NpcBot.WanderingBots.BG.TargetTeamPlayersCount.<BGTYPE>\n+#        Description: Target BG players count per team to aim for when generating BG bots.\n+#        Note:        These values can't go beyond BG minimum / maximum players per team bounds.\n+#        Default:     30 - (NpcBot.WanderingBots.BG.TargetTeamPlayersCount.AV)\n+#                     8  - (NpcBot.WanderingBots.BG.TargetTeamPlayersCount.WS)\n+#                     12 - (NpcBot.WanderingBots.BG.TargetTeamPlayersCount.AB)\n+#                     12 - (NpcBot.WanderingBots.BG.TargetTeamPlayersCount.EY)\n+#                     0  - (NpcBot.WanderingBots.BG.TargetTeamPlayersCount.SA) (NYI, Disabled)\n+#                     0  - (NpcBot.WanderingBots.BG.TargetTeamPlayersCount.IC) (NYI, Disabled)\n+\n+NpcBot.WanderingBots.BG.TargetTeamPlayersCount.AV = 30\n+NpcBot.WanderingBots.BG.TargetTeamPlayersCount.WS = 8\n+NpcBot.WanderingBots.BG.TargetTeamPlayersCount.AB = 12\n+NpcBot.WanderingBots.BG.TargetTeamPlayersCount.EY = 12\n+NpcBot.WanderingBots.BG.TargetTeamPlayersCount.SA = 0\n+NpcBot.WanderingBots.BG.TargetTeamPlayersCount.IC = 0\n+\n+#\n+#    NpcBot.WanderingBots.Classes.<Class>.Enable\n+#        Description: Allow players to hire bots of certain classes.\n+#        Note:        Some non-standard class abilities may be unbalanced or game breaking.\n+#        Default:     1 - (NpcBot.Classes.Warrior.Enable)\n+#                     1 - (NpcBot.Classes.Paladin.Enable)\n+#                     1 - (NpcBot.Classes.Hunter.Enable)\n+#                     1 - (NpcBot.Classes.Rogue.Enable)\n+#                     1 - (NpcBot.Classes.Priest.Enable)\n+#                     1 - (NpcBot.Classes.DeathKnight.Enable)\n+#                     1 - (NpcBot.Classes.Shaman.Enable)\n+#                     1 - (NpcBot.Classes.Mage.Enable)\n+#                     1 - (NpcBot.Classes.Warlock.Enable)\n+#                     1 - (NpcBot.Classes.Druid.Enable)\n+#                     1 - (NpcBot.Classes.Blademaster.Enable)\n+#                     1 - (NpcBot.Classes.ObsidianDestroyer.Enable)\n+#                     1 - (NpcBot.Classes.Archmage.Enable)\n+#                     1 - (NpcBot.Classes.Dreadlord.Enable)\n+#                     1 - (NpcBot.Classes.SpellBreaker.Enable)\n+#                     1 - (NpcBot.Classes.DarkRanger.Enable)\n+#                     1 - (NpcBot.Classes.Necromancer.Enable)\n+#                     1 - (NpcBot.Classes.SeaWitch.Enable)\n+#                     1 - (NpcBot.Classes.CryptLord.Enable)\n+\n+NpcBot.WanderingBots.Classes.Warrior.Enable           = 1\n+NpcBot.WanderingBots.Classes.Paladin.Enable           = 1\n+NpcBot.WanderingBots.Classes.Hunter.Enable            = 1\n+NpcBot.WanderingBots.Classes.Rogue.Enable             = 1\n+NpcBot.WanderingBots.Classes.Priest.Enable            = 1\n+NpcBot.WanderingBots.Classes.DeathKnight.Enable       = 1\n+NpcBot.WanderingBots.Classes.Shaman.Enable            = 1\n+NpcBot.WanderingBots.Classes.Mage.Enable              = 1\n+NpcBot.WanderingBots.Classes.Warlock.Enable           = 1\n+NpcBot.WanderingBots.Classes.Druid.Enable             = 1\n+NpcBot.WanderingBots.Classes.Blademaster.Enable       = 1\n+NpcBot.WanderingBots.Classes.ObsidianDestroyer.Enable = 1\n+NpcBot.WanderingBots.Classes.Archmage.Enable          = 1\n+NpcBot.WanderingBots.Classes.Dreadlord.Enable         = 1\n+NpcBot.WanderingBots.Classes.SpellBreaker.Enable      = 1\n+NpcBot.WanderingBots.Classes.DarkRanger.Enable        = 1\n+NpcBot.WanderingBots.Classes.Necromancer.Enable       = 1\n+NpcBot.WanderingBots.Classes.SeaWitch.Enable          = 1\n+NpcBot.WanderingBots.Classes.CryptLord.Enable         = 1\n+\n+#\n+#    NpcBot.WanderingBots.SkipTarget.Questgiver\n+#    NpcBot.WanderingBots.SkipTarget.Flightmaster\n+#        Description: Make wandering bots skip certain npc types when selecting attack target.\n+#        Note:        This option does not apply to npcs engaging the bot on their own accord.\n+#        Default:     0 - (NpcBot.WanderingBots.SkipTarget.Questgiver)\n+#                     0 - (NpcBot.WanderingBots.SkipTarget.Flightmaster)\n+\n+NpcBot.WanderingBots.SkipTarget.Questgiver   = 0\n+NpcBot.WanderingBots.SkipTarget.Flightmaster = 0\n+\n+#\n+#    NpcBot.HK.Enable\n+#        Description: Count NPCBot kill at honor kill.\n+#        Default:     1 - (Enabled)\n+#                     0 - (Disabled)\n+\n+NpcBot.HK.Enable = 1\n+\n+#\n+#    NpcBot.HK.Message.Enable\n+#        Description: Show 'HK: <rank>' message for NPCBot honor kills.\n+#        Default:     0 - (Disabled)\n+#                     1 - (Enabled)\n+\n+NpcBot.HK.Message.Enable = 0\n+\n+#\n+#    NpcBot.HK.Achievements.Enable\n+#        Description: Count NPCBot honor kills towards PvP achievements.\n+#        Default:     0 - (Disabled)\n+#                     1 - (Enabled)\n+\n+NpcBot.HK.Achievements.Enable = 0\n+\n+#\n+#    NpcBot.HK.Rate.Honor\n+#        Description: Honor gained multiplier for NPCBot honor kills.\n+#        Default:     1.0\n+#        Minimum:     0.1\n+#        Maximum:    10.0\n+\n+NpcBot.HK.Rate.Honor = 1.0\n+\n+#\n+#    NpcBot.Premade.Enable\n+#        Description: Enable joining BG as premade group while having NPCBots in group.\n+#        Note:        Queued premade groups do not trigger BG bots generation.\n+#        Default:     0 - (Disabled)\n+#                     1 - (Enabled)\n+\n+NpcBot.Premade.Enable = 0\n+\n+#\n+###################################################################################################\n"
  },
  {
    "path": "README.md",
    "content": "### This mod was last updated:\n### TC: 04 Apr 2026, [940f405ede](https://github.com/trickerer/TrinityCore-3.3.5-with-NPCBots/commit/940f405ede)\n### AC: 04 Apr 2026, [7b39ddd215](https://github.com/trickerer/AzerothCore-wotlk-with-NPCBots/commit/7b39ddd215)\n### Update schedule: every Saturday 05:00 AM UTC+0\n\n### Have questions? Found a bug? [Issues](https://github.com/trickerer/Trinity-Bots/issues)\n\n# [ THE NPCBOTS MANUAL ]\n>Compiled by: Trickerer (onlysuffering @ Gmail dot Com)  \n>Version 0.25 - 14 Jun 2023\n>Original version by: Thesawolf (@ Gmail dot Com) Version 0.3 - 20 July 2016 [here](https://github.com/thesawolf/TrinityCore/blob/TrinityCoreLegacy/README_Bots.md)\n\n---------------------------------------\n### Contents\n1. [Introduction](#introduction)\n2. [NPCBots](#npcbots)\n    - [NPCBot Mod Installation](#npcbot-mod-installation)\n        - [TrinityCore](#trinitycore)\n        - [AzerothCore](#azerothcore)\n    - [NPCBot Commands](#npcbot-commands)\n    - [NPCBot Control and Usage](#npcbot-control-and-usage)\n        - [NPCBot Getting Started](#npcbot-getting-started)\n        - [NPCBot Hiring Alternatives](#npcbot-hiring-alternatives)\n        - [NPCBot Getting Around](#npcbot-getting-around)\n        - [NPCBot Equipment](#npcbot-equipment)\n        - [NPCBot Roles](#npcbot-roles)\n        - [NPCBot Formation](#npcbot-formation)\n        - [NPCBot Abilities](#npcbot-abilities)\n        - [NPCBot Talents](#npcbot-talents)\n        - [NPCBot Grouping](#npcbot-grouping)\n        - [NPCBot Extras](#npcbot-extras)\n        - [NPCBots and Vehicles](#npcbots-and-vehicles)\n    - [NPCBot Wander System](#npcbot-wander-system)\n    - [NPCBot Config Settings](#npcbot-config-settings)\n    - [NPCBot Mod Localization](#npcbot-mod-localization)\n    - [NPCBot Extra Classes](#npcbot-extra-classes)\n    - [NPCBot Occupations](#npcbot-occupations)\n    - [NPCBot Addons](#npcbot-addons)\n3. [Guide Changelog](#guide-changelog)\n\n---------------------------------------\n## Introduction\nNPCBots is a [TrinityCore](https://github.com/TrinityCore/TrinityCore/) 3.3.5/[AzerothCore](https://github.com/azerothcore/azerothcore-wotlk/) wotlk mod  \n\nThis manual is created to officially state the purpose and explain the usage of NPCBot system\n\n\n---------------------------------------\n## NPCBOTS\nNPCBots player manual is [available on youtube](https://www.youtube.com/watch?v=fByzoyl3rCY), by **QT Blue-AI**\n\nNPCBots are hireable pet-like minions (with some exceptions). You don't have full control over them, but you can tune their behavior in many ways. Bots will follow you around, buff you, defend you and help you in general. Their main purpose is to support players during their leveling although they can do dungeons and raids, but expect them being stupid in there\n\nFeatures of the NPCBots:  \n\n- Fighting (via spells, melee, ranged combat)  \n\n- Buffing  \n\n- Healing  \n\n- Resurrecting  \n\n- Acting as a guard (when bot has no owner)  \n\n- Grouping  \n\n- DungeonFinder (they can enter dungeons with you)  \n\n- Raids (they can participate in raids)  \n\n- PvP (they can fight members of your opposing faction)  \n\n- Providing you with consumables (mage, warlock)  \n\n- Receiving buffs and consumables from you  \n\n- Equipping gear  \n\n- Assigning roles  \n\n- Abilities management  \n\n- etc...  \n\n\n### NPCBot Mod Installation\n#### TrinityCore\n- **Pre-patched repository is [here](https://github.com/trickerer/TrinityCore-3.3.5-with-NPCBots/)**. At the very beginning of this document you can find a link to its revision at a point where it was patched with the latest version of NPCBots. Clone it using\n  - `git clone https://github.com/trickerer/TrinityCore-3.3.5-with-NPCBots.git --depth 1`\n- If you still prefer to patch the core yourself, clone both TrinityCore and Trinity-Bots using\n  - `git clone https://github.com/TrinityCore/TrinityCore.git -b 3.3.5 --depth 1`\n  - `git clone https://github.com/trickerer/Trinity-Bots.git`\n- Installing NPCBots is not much different from clean install so regardless of the chosen installation method follow [TrinityCore Installation Guide](https://TrinityCore.info/) to install the server to the point where it asks you to run it\n- Now if you used a pre-patched repo jump to step `5`, otherwise keep on reading\n\n1. Copy `Trinity-Bots/NPCBots.patch` file to your `TrinityCore` folder\n2. Apply the patch using `patch -p1 < NPCBots.patch` command (`git apply NPCBots.path` may not work)\n3. Re-run CMake and re-build\n4. Merge worldserver.conf.dist into your worldserver.conf file (copy NPCBot mod settings)\n5. **Only if `Updates.AutoSetup` is set to 0 in config or if your base DBs are already created**. Apply NPCBot base DB SQL files from `TrinityCore/sql/base/` to appropriate DBs:\n  - auth_npcbot.sql\n  - characters_npcbot.sql\n  - world_npcbot.sql\n6. **Only if `Updates.EnableDatabases` is set to 0 in config**. Apply NPCBot SQL updates from `/TrinityCore/sql/custom/` to your DB (`auth/`, `characters/` and `world/` SQL files go to `auth`, `characters` and `world` DB respectively) one by one\n7. Run the server\n\n#### AzerothCore\n- **Pre-patched repository is [here](https://github.com/trickerer/AzerothCore-wotlk-with-NPCBots/)**. At the very beginning of this document you can find a link to its revision at a point where it was patched with the latest version of NPCBots. Clone it using\n  - `git clone https://github.com/trickerer/AzerothCore-wotlk-with-NPCBots.git --depth 1`\n- If you still prefer to patch the core yourself, clone both AzerothCore and Trinity-Bots using\n  - `git clone https://github.com/azerothcore/azerothcore-wotlk.git --depth 1`\n  - `git clone https://github.com/trickerer/Trinity-Bots.git`\n- Installing NPCBots is not much different from clean install so regardless of the chosen installation method follow [AzerothCore Installation Guide](https://azerothcore.org/wiki/installation) to install the server to the point where it asks you to run it\n- Now if you used a pre-patched repo jump to step `5`, otherwise keep on reading\n\n1. Copy `Trinity-Bots/AC/NPCBots.patch` file to your `azerothcore-wotlk` folder\n2. Apply the patch using `patch -p1 < NPCBots.patch` command (`git apply NPCBots.path` may not work)\n3. Re-run CMake and re-build\n4. Merge worldserver.conf.dist into your worldserver.conf file (copy NPCBot mod settings)\n5. **Only if `Updates.AutoSetup` is set to 0 in config or if your base DBs are already created**. Apply NPCBot base DB SQL files from `azerothcore-wotlk/data/sql/base/` to appropriate DBs:\n  - db_characters/characters_npcbot.sql\n  - db_characters/characters_npcbot_group_member.sql\n  - db_characters/characters_npcbot_stats.sql\n  - db_characters/characters_npcbot_transmog.sql\n  - db_world/creature_template_npcbot_appearance.sql\n  - db_world/creature_template_npcbot_extras.sql\n  - db_world/creature_template_outfits.sql\n6. **Only if `Updates.EnableDatabases` is set to 0 in config**. Apply NPCBot SQL updates from `/azerothcore-wotlk/data/sql/custom/` to your DB (`db_auth/`, `db_characters/` and `db_world/` SQL files go to `auth`, `characters` and `world` DB respectively) one by one\n7. Run the server\n\n### NPCBot Commands\nFirst of all, to list your NPCBot's stats, use `/bonk` on them (Warning: big list)  \n\nNote that some commands may not be available to all accounts (depending on their access level and permissions set in the RBAC tables (TC) / in the `command` table (AC)). You may need to change your account permissions / security level to enable usage of some commands\nMost NPCBot commands are divised by persmissions into two groups: player commands and GM commands, there are also some Admin-only commands\n```\nKEY:\n< >  (angled brackets) indicates essential command argument  \n[ ]  (square brackets) indicates optional command argument  \n |  (pipe character) indicates argument choices (i.e. this|that  = this OR that)  \n_ARGUMENT_  indicates argument names  \n```\n**COMMAND**: **`.npcbot`**, **`.npcb`** -- (Player command) by itself will list all syntax available  \n\n- **`lookup <_CLASS_> [_UNSPAWNED_ONLY_]`** -- (GM command) lookup the NPCBot entries by <CLASS>, returns list of NPCBots as ID, Name and Race  \n    - _CLASS_ = class ID (i.e. 1 for WARRIOR). **`.npcbot lookup` (`.npcb loo`)** (without the argument) to list class IDs  \n    - _UNSPAWNED_ONLY_ = boolean flag, if set to 1 shows only NPCBots which weren't spawned yet  \n    **Example Usage**:  \n        - `.npcbot lookup 7` (to list all Shamans)  \n        - `.npcb loo 11 1` (to list all unspawned Druids)  \n- **`list`** -- (GM command)  \n    - **`spawned`** -- Lists all spawned bots in the world, their location and quick status  \n        - **`free`** -- Same as above but only lists **unowned** bots  \n            **Example Usage**:  \n                - `.npcbot list spawned`  \n                - `.npcbot list spawned free`  \n                - `.npcbot list s f`  \n- **`add _TARGET_`** -- (GM command) selected NPCBot becomes yours bypassing the price condition. Only works on NPCBots which have no owner  \n    - _TARGET_ = selected NPCBot  \n    **Example Usage**:  \n        - `.npcbot add`  \n        - `.npcb add`  \n- **`remove _TARGET_`** -- (GM command) dismisses the NPCBot(s) from player's control. **Any bot removed via this command retains its gear**  \n    - _TARGET_ = selected active NPCBot (dismisses selected NPCBot)  \n    - _TARGET_ = selected player (dismisses ALL NPCBots)  \n    **Example Usage**:  \n        - `.npcbot remove`  \n        - `.npcb rem`  \n- **`free _TARGET_`** -- (GM command) frees selected NPCBot from player's ownership. **All gear will be unequipped and sent back to player, can be used on inactive NPCBot**  \n    - _TARGET_ = selected NPCBot (frees selected NPCBot)  \n    **Example Usage**:  \n        - `.npcbot free`  \n- **`spawn <_ENTRY_|_LINK_>`** -- (GM command) spawns a NPCBot in world, NPCBot is saved in DB. Only works in world maps (not instances). Note that unlike other creatures only one instance of each NPCBot can be spawned, but don't worry: there are many NPCBots to choose from  \n    - _ENTRY_ = ID of NPCBot (can be obtained from lookup list)  \n    - _LINK_ = creature_template link added by Shift-click (obtained from lookup list)  \n    **Example Usage**:  \n        - `.npcbot spawn 70001` (spawns NPCBot with ID 70001)  \n        - `.npcb sp 70002` (spawn NPCBot with ID 70002)  \n        - `.npcb sp [Haromm]` (spawn NPCBot by link)  \n- **`move <_ENTRY_|_LINK_|_TARGET_>`** -- (GM command) moves spawned NPCBot to a new location. This command replaces `.npc move` command for bots  \n    - _ENTRY_ = ID of NPCBot  \n    - _LINK_ = creature_template link added by Shift-click (obtained from lookup list)  \n    - _TARGET_ = selected NPCBot  \n    **Example Usage**:  \n        - `.npcbot move 70001` (moves NPCBot with ID 70001 to your position)  \n- **`delete`** -- (GM command) deletes NPCBot from world, NPCBot is removed from its owner if any and deleted from DB. **Gear is given back to either the bot's owner (if there is one) or the player using the command**. If you need bot owner to **not** get the gear back, `.npcbot remove` the bot before deleting. Command will fail if used from the console on **unowned but geared** NPCBots  \n    - _TARGET_ -- deletes selected NPCBot  \n        - _TARGET_ = selected NPCBot  \n        **Example Usage**:  \n            - `.npcbot delete`  \n            - `.npcb del`  \n    - id _ID_ -- deletes NPCBots using creature ID instead of targeting, usable from the console  \n        - _ID_ = creature ID (`creature_template`.`entry`)  \n        **Example Usage**:  \n            - `.npcbot delete id 70032`  \n            - `.npcb del id 70032`  \n    - free -- deletes **ALL** unowned NPCBots, all gear (if any) will be sent to the invoker GM for disposal  \n        **Example Usage**:  \n            - `.npcbot delete free`  \n            - `.npcb del f`  \n- **`set`** (GM command)  \n    - **`faction <a|h|m|f|_factionID_> _TARGET_`** -- sets the faction for selected NPCBot  \n        - a = 1802 (alliance team)  \n        - h = 1801 (horde team)  \n        - m = 14 (monster, hostile to all)  \n        - f = 35 (friendly to all)  \n        - _factionID_ = ID from FactionTemplate.dbc (experts only). It's NOT what you get by using `.lookup faction` command  \n        - _TARGET_ = selected NPCBot  \n        **Example Usage:**  \n            - `.npcbot set faction` (by itself will display list of subcommands for faction)  \n            - `.npcb s f m` (sets the faction of a selected NPCBot to HostileToAll)  \n    - **`owner <_GUID_|_NAME_> _TARGET_`** -- sets ownership of a selected NPCBot to a specific player  \n        - _GUID_ = player DB guid  \n        - _NAME_ = player name  \n        - _TARGET_ = selected NPCBot  \n        **Example Usage:**  \n            - `.npcbot set owner 312` (sets the selected NPCBot owner to the player with guid 312)  \n            - `.npcb s o Myplayer` (sets the selected NPCBot owner to the player by name `Myplayer`)  \n    - **`spec <_NUMBER_> _TARGET_`** -- forces a spec change for selected NPCBot  \n        - _NUMBER_ = a number from **1** to **30**  \n        - _TARGET_ = selected NPCBot  \n        **Example Usage:**  \n            - `.npcbot set spec 2` (selected NPCBot will instantly respec into Fury talent tree; talents will only apply to a warrior NPCBot)  \n- **`revive _TARGET_`** -- (GM command) revives NPCBot(s)  \n    - _TARGET_ = selected NPCBot (revives this NPCBot)  \n    - _TARGET_ = selected player (revives all NPCBots of selected player)  \n    **Example Usage:**  \n        - `.npcbot revive`  \n        - `.npcb rev`  \n- **`command`** -- (Player command) allows to manage your NPCBots positioning, movement and couple other things (by itself will display list of subcommands)  \n    - **`follow _TARGET_`** -- set NPCBot(s) to FOLLOW mode  \n        - **`only`** -- toggle INACTIVE mode for NPCBots. Inactive bots will not do anything but follow  \n    - **`standstill _TARGET_`** -- set NPCBot(s) to STAY mode  \n    - **`stopfully _TARGET_`** -- set NPCBot(s) to IDLE mode  \n        - _TARGET_ = selected (your) NPCBot (command affects this NPCBot)  \n        - _TARGET_ = any other unit or no selection (command affects all your NPCBots)  \n    - **`nocast`** -- toggle NPCBots' ability to cast any spells  \n    - **`nolongcast`** -- toggle NPCBots' ability to cast spells with non-zero cast time  \n    - **`unbind <_TARGET_|_NAMES..._>`** -- free NPCBot(s) temporarily without dismissing them. Bot(s) will return to home position and wait there until invited back (or server restart)  \n    - **`rebind <_TARGET_|_NAMES..._>`** -- call unbound NPCBot(s) back. Use `.npcbot info` to list your unbound NPCBots  \n        - _TARGET_ = selected (your) NPCBot (command affects this NPCBot)  \n        - _NAMES..._ = case-insensitive NPCBot name(s), *name_containing_spaces_must_be_underscored* (command affects named NPCBot(s))  \n    - **`walk`** -- toggle WALK mode for NPCBots  \n    - **`nogossip`** -- toggle GOSSIP availability for NPCBots  \n    **Example Usage:**  \n        - `.npcbot command standstill` (NPCBot stops moving and will hold position)  \n        - `.npcb co sta` (same as above)  \n        - `.npcbot command stopfully` (NPCBot will interrupt all actions, stop and not react to anything)  \n        - `.npcbot command follow` (NPCBot will follow you if not already)  \n        - `.npcbot command follow only` (all NPCBots will do nothing while following you)  \n        - `.npcb co nog` (you will not be able to open NPCBot gossip menu even out of combat)  \n        - `.npcb co unb sheal` (temporarily remove druid NPCBot Sheal)  \n- **`info _TARGET_`** -- (Player command) shows info on owned bots  \n    - _TARGET_ = selected grouped player or self (shows you info on that player)  \n    **Example Usage:**  \n        - `.npcbot info`  \n        - `.npcb in`  \n- **`hide`** -- (Player command) forces NPCBots to temporarily disappear. They will teleport off the map and out of the world for until allowed to come back. Cannot be used in combat  \n    - (No arguments)  \n    **Example Usage:**  \n        - `.npcbot hide`  \n        - `.npcb h`  \n- **`unhide`|`show`** -- (Player command) the opposite of `.npcbot hide` command; your NPCBots will appear shortly. Cannot be used in combat  \n    - (No arguments)\n    **Example Usage:**  \n        - `.npcbot unhide`  \n        - `.npcbot show`  \n- **`sendto <_TARGET_|_NAMES..._>`** -- (Player command) for 30 seconds makes NPCBot(s) wait for your signal to move to stationery position. The position must be pointed then by a dest spell (AoE, smoke flare, dynamite, etc.). Stationed bots will stay there indefinetely, use follow command to call them back. Bots in FULLSTOP state can't be moved by this  \n    - **`last <_TARGET_|_NAMES..._>`** -- (Player command) same as plain `sendto` but moves NPCBot(s) back to previous position bot was sent **from**, making it stationery  \n    - **`point <NUMBER> <_TARGET_|_NAMES..._>`** -- (Player command) moves NPCBot(s) to a previously marked station point  \n        - **`set <_NUMBER_> <_TARGET_|_NAMES..._>`** -- (Player command) marks NPCBots' current positions as a station point by the `<_NUMBER_>`  \n    - _NUMBER_ = integer in range `1 ... 5`  \n    - _TARGET_ = selected NPCBot (move single NPCBot)  \n    - _NAMES..._ = space-separated case-insensitive NPCBot names, *name_containing_spaces_must_be_underscored* (move a group of NPCBots)  \n    **Example Usage:**  \n        - `.npcbot sendto`  \n        - `.npcb send eva jol eanor harene`  \n        - `.npcbot sendto last eva jol eanor harene`  \n- **`recall _TARGET_`** -- (Player command) forces a NPCBot to move directly on your position. Usable while dead. Designed mostly for situations like when you die and your NPCBots are stuck under textures and in combat at the same time  \n    - **`teleport _TARGET_`** -- (Player command) forces NPCBots to *teleport* to you immediatelly. Cannot be used in PvP  \n    - **`spawns`** -- (Player command) forces your inactive NPCBots to teleport to their spawn locations immediatelly. Use if bots do not join you back after logout  \n    - _TARGET_ = selected NPCBot (move single NPCBot)  \n    - _TARGET_ = self (move all NPCBots)  \n    **Example Usage:**  \n        - `.npcbot recall`  \n        - `.npcb rec tele`  \n- **`kill _TARGET_`|`suicide _TARGET_`** -- (Player command) forces a NPCBot to die. Designed for troubleshooting in situations like when NPCBots are not acting normally. This can be caused by a rare bug causing creatures to retain Unit States. If this doesn't work, try to `/tickle` them  \n    - _TARGET_ = selected NPCBot (kill single NPCBot troublemaker)  \n    - _TARGET_ = self (kill all your NPCBots)  \n    **Example Usage:**  \n        - `.npcbot kill`  \n        - `.npcbot suicide`  \n- **`order`** -- (Player command) allows you to issue an order to your NPCBot. Orders take priority over any other action. Each bot can have up to 3 queued orders at a time (by itself will display list of subcommands)  \n    - **`cast <_BOT_NAME_ OR _CLASS_NAME_> <_SPELL_NAME_> [_TARGET_TOKEN_]`** -- cast some spell  \n        - _BOT_NAME_ OR _CLASS_NAME_ = your bot name in client's locale, case insensitive OR bot class name in english, in lower case, *name_containing_spaces_must_be_underscored*  \n        - _SPELL_NAME_ = spell name in client's locale. All_spaces_must_be_replaced_with_underscores. Case insensitive  \n        - _TARGET_TOKEN_ = optional target identifier string. If left empty bot will target self. Case insensitive. Possible values:  \n            - `bot`, `self` = selfcast  \n            - `me`, `master` = bot owner (you)  \n            - `target` = bot's current target (won't work if bot has no target)  \n            - `mytarget` = your current target (won't work if you have no target)  \n    **Example Usage:**  \n        - `.npcbot order cast javad lesser_healing_wave me`  \n        - `.npcbot order cast javad purge mytarget`  \n- **`useonbot`** -- (Player command) allows you to use your abilities targeting only player on NPCBots. Resurrection, party spells like Intervene, Misdirection, etc. This circumvents any *client-side* restrictions that prevent selecting bots as target for those spells  \n    - **`spell <_SPELL_ID_ OR _SPELL_LINK_ OR _SPELL_NAME_>`** -- use ability  \n        - _SPELL_ID_ = spell id  \n        - _SPELL_LINK_ = result of shift-click from spellbook to chat  \n        - _SPELL_NAME_ = result of shift-click from spellbook to macro window, either `Spell Name` or `[Spell Name]`. Case sensitive  \n    - **`item <_ITEM_ID_ OR _ITEM_LINK_ OR _ITEM_NAME_>`** -- use item  \n        - _ITEM_ID_ = spell id  \n        - _ITEM_LINK_ = result of shift-click from spellbook to chat  \n        - _ITEM_NAME_ = result of shift-click from spellbook to macro window, either `Item Name` or `[Item Name]`. Case sensitive  \n    **Example Usage:**  \n        - `.npcbot useonbot spell [Resurrection]`  \n        - `.npcbot useonbot spell Dampen Magic`  \n        - `.npcbot useonbot spell Intervene`  \n        - `.npcbot useonbot item [Gnomish Army Knife]`  \n        - `.npcb use s Intervene`  \n- **`distance <_VALUE_>`** -- (Player command) allows you to quickly set bot follow distance (by itself will display full help)  \n    - **`attack <_VALUE_|_SHORT_|_LONG_>`** -- (Player command) sets attack distance\n        - _VALUE_ = desired value for chosen distance type (within standard distance ranges)\n        - _SHORT_, _LONG_ = \"short\" and \"long\" exact strings for minimum and maximum available spell range for the class  \n    **Example Usage:**  \n        - `.npcbot distance 75`  \n        - `.npcbot distance attack 20`  \n        - `.npcb dist a short`  \n- **`vehicle eject _TARGET_`** -- (Player command) allows you to kick your NPCBots out of vehicles (bots won't dismount from vehicles automatically while in combat)  \n    - _TARGET_ = selected NPCBot (eject this NPCBot)  \n    - _TARGET_ = self (eject all NPCBots)  \n    **Example Usage:**  \n        - `.npcbot vehicle eject`  \n        - `.npcb veh e`  \n- **`go _ENTRY_`** -- (GM command) allows you to teleport to NPCBot's current location, similar to `.appear` command for players. Be careful as this command may occasionally teleport you below ground level due to creature pathing errors  \n    - _ENTRY_ = creature ID  \n    **Example Usage:**  \n        - `.npcbot go 70855` (teleport to NPCBot 70855)  \n        - `.npcb go 70855`  \n- **`wp`** -- (GM command) a set of development commands for manipulating free-roaming bots wander points. If you wish to use them see the code  \n    - **`spawnall`**  \n    - **`move`**  \n    - **`add`**  \n    - **`del`**  \n    - **`list`**  \n    - **`list all`**  \n    - **`go`**  \n    - **`setlevels`**  \n    - **`setlevels z`**  \n    - **`setflags`**  \n    - **`setflags z`**  \n    - **`setname`**  \n    - **`setlinks`**  \n    - **`info`**  \n    - **`links`**  \n- **`dump`** -- (Admin command) allows you to migrate bots data, similar to `pdump` for players (by itself will display list of subcommands)  \n    - **`write <_FILENAME_>`** -- creates a backup file containing info required to move bots to another DB  \n        - _FILENAME_ = name of the file to create, will be saved in server root folder (Windows) or home directory (Linux), if file extension is not provided, **.sql** wil be used  \n        **Example Usage:**  \n            - `.npcbot dump write bots_backup` (write to `bots_backup.sql`)  \n            - `.npcb du w 1.txt` (write to `1.txt`)  \n    - **`load <_FILENAME_> [_KICK_PLAYERS_]`** -- load NPCBots info from a backup file into DB. Requires no players to be playing (use console) and will force a server restart after completion. NPCBots mod must be already installed (all tables present)  \n        - _FILENAME_ = your backup file name, must be stored in server root folder (Windows) or home directory (Linux), if file extension is not provided, **.sql** wil be used  \n        - _KICK_PLAYERS_ = boolean flag, if set to 1 all players will be kicked from server automatically  \n        **Example Usage:**  \n            - `.npcbot dump load bots_backup` (load from `bots_backup.sql`)  \n            - `.npcb du l 1.txt` (load from `1.txt`)  \n- **`log`** (Admin command)  \n    - **`clear`** -- clears `characters_npcbot_logs` table (and resets autoincrement)  \n        - (No arguments)  \n        **Example Usage:**  \n            - `.npcbot log clear  \n            - `.npcb log c  \n- **`createnew <_NAME_> <_CLASS_> _RACE_ _GENDER_ _SKIN_ _FACE_ _HEARSTYLE_ _HAIRCOLOR_ _FEATURES_ _SOUNDSET_`** -- (Admin command) allows you to create new NPCBots for players to use. Creature ids 70800+ are used for that.  \n    - _NAME_ = name of created NPCBot. Note that first letter will always be in Upper Case, *name_containing_spaces_must_be_underscored*  \n    - _CLASS_ = this refers to NPCBot class. Use `.npcbot lookup` comand to list all available classes  \n    - _RACE_ = you have to provide a race for your new NPCbot unless you are creating a NPCBot of one of the special classes for whose race is predefined as well as other details  \n        - 1: Human  \n        - 2: Orc  \n        - 3: Dwarf  \n        - 4: Night Elf  \n        - 5: Undead  \n        - 6: Tauren  \n        - 7: Gnome  \n        - 8: Troll  \n        - 10: Blood Elf  \n        - 11: Draenei  \n    - _GENDER_ = same as _RACE_, for normal classes you have to select one  \n        - 0: Male  \n        - 1: Female  \n    - _SKIN_, _FACE_, _HEARSTYLE_, _HAIRCOLOR_, _FEATURES_ = appearance details, `0` and up. Different race/gender combinations have different constraints for visuals, use `.npcbot createnew ranges` to see them  \n    - _SOUNDSET_ = NPC voice variant for bot to use. There are 3 variants for each race, by default the choice is random  \n    **Example Usage:**  \n        - `.npcbot createnew Selendris 8 10 1 6 4 3 2 4` (creates a female redhead Blood Elf mage npcbot)  \n        - `.npcb cre Selendris 8 10 1 6 4 3 2 4` (creates a female redhead Blood Elf mage npcbot)  \n        - `.npcb createnew ranges` (prints visuals constraints for all races)  \n\n### NPCBot Control and Usage\n#### NPCBot Getting started\nIf this is your first time using an NPCBot, you'll need to do the following to get started:\n\n- `.npcbot lookup`  \n\nThis will give you a listing of the available classes with an ID to indicate each class. For example, 1 is the class ID for Warriors.  \n\n_Example Output_:\n```\n.npcbot lookup #class\nLooks up npcbots by #class, and return all matches with their creature ID's.\nBOT_CLASS_WARRIOR = 1\nBOT_CLASS_PALADIN = 2\nBOT_CLASS_HUNTER = 3\nBOT_CLASS_ROGUE = 4\nBOT_CLASS_PRIEST = 5\nBOT_CLASS_DEATH_KNIGHT = 6\nBOT_CLASS_SHAMAN = 7\nBOT_CLASS_MAGE = 8\nBOT_CLASS_WARLOCK = 9\nBOT_CLASS_DRUID = 11\nBOT_CLASS_BLADEMASTER = 12\nBOT_CLASS_SPHYNX = 13\nBOT_CLASS_ARCHMAGE = 14\nBOT_CLASS_DREADLORD = 15\nBOT_CLASS_SPELLBREAKER = 16\nBOT_CLASS_DARK_RANGER = 17\nBOT_CLASS_NECROMANCER = 18\nBOT_CLASS_SEA_WITCH = 19\nBOT_CLASS_CRYPT_LORD = 20\n```\n\nAfter you have figured out which class you want to lookup type in:\n\n- `.npcbot lookup 1`\n```\nLooking for bots of class 1...\n70001 - [Llane] Human\n70002 - [Thran] Dwarf\n70003 - [Lyria] Human\n70004 - [Ander] Dwarf\n70005 - [Malosh] Orc\n70006 - [Granis] Dwarf\n...\n70038 - [Kerra] Blood Elf\n```\nNext, you'll select an NPCBot from the list:\n\n- `.npcbot spawn 70003`  \nFor this example, we'll select Lyria with an ID of 70003\n\nLyria will spawn at your location as a level 80 Warrior (by default, NPCBots spawn at max level)  \nNote that NPCBot you spawned is friendly. By default NPCBots spawn with faction ID set to 35 (friendly to all) But NPCBots will follow realm PvP rules, even if it's a FFAPvP  \nAlso, NPCBots do not attack anything unless provoked, at which point they may attempt to do whatever it takes to kill their target; they can be very persistent  \n**NPCBots can only be spawned in world maps**\n\nRight-clicking on the NPCBot will open a _Gossip Menu_ (which gives you some command choices)  \n_Example Output_:\n```\nYou need something?\n- <Hire bot>\n- Nevermind\n```\nNote: if you are have a GM mode enabled you will also see a '\\<Debug\\>' menu\n\nNext, you'll most likely just select '\\<Hire bot\\>' which will popup a confirmation box asking:   \n\"Do you wish to hire Lyria?\", with a cost amount that you can _Accept_ or _Cancel_.\nNote: price scales with your level, but rare and elite bots cost more and may require you to be at least level X to hire them\n\nAfter NPCBot is hired, they will automatically match your level.  \nRight-clicking on the NPCBot will open a new Gossip Menu with an assortment of options (described in following subsections). Your NPCBot will follow you around in or out of group, but it's probably a good idea to get them into your group so you can monitor their location on mini-map, or health/mana, etc. Your new hired Gossip Menu will show:\n```\n- Manage equipment...\n- Manage roles...\n- Manage formation...\n- Manage abilities...\n- Manage talents...\n- Give consumable...\n- <Create Group>\n- You are dismissed\n- Pull yourself together, damnit\n- Nevermind\n- [OPTIONAL options may be displayed here]\n- <Create Group (all bots)>\n- <Add to group>\n- <Add all bots to group>\n- <Remove from group>\n- [CLASS-SPECIFIC options may be displayed here]\n```\n\nFor now, select '\\<Create Group\\>' and your NPCBot will join your group and you can begin your adventures!  \nAs mentioned previously, the other options will be discussed further down this document.\n\n#### NPCBot Hiring Alternatives\nIf you want you can also spawn an NPC which provides NPCBots hiring services. This is done normal way through `.npc add` command:\n\n- `.npc add 70000`  \nRight-click on the NPC will open a _Gossip Menu_:  \n```\nThere are always dudes ready to kill for money.\n- I need your services\n- Nevermind\n```\n\nDown the menu you will find a list of classes of NPCBots. After you select one, a list of NPCBots in the world available to you will appear.  \nNote that conditions you need to meet to hire NPCBots this way are completely the same as you would normally have, the only difference is that you don't need to go around the world to find NPCBots you need.\n\n#### NPCBot Getting Around\nWhether grouped or not, your NPCBot will follow you around, keeping you buffed along the way (if they can buff), healing you when needed (if it is a healer-type NPCBot), attacking things alongside you and even ressurecting you if you die (if they can ressurect, that is). NPCBots are designed to keep up to your run pace and will mount up on their own version of your mount when you do. In the event that they cannot keep up (due to you moving too fast or they being stuck in combat or something), your NPCBot will eventually teleport to your location (even if you go into another map).  \nNOTE: NPCBots cannot teleport to you when you are in a dungeon, if they are not part of your group.\n\nFor the most part, go somewhere and they will follow. Simple as that.\nIn those cases where following might not be safe or you want to proceed safely, you have a few options.\n\nIf your NPCBot is in your direct vicinity, you can target them and emote:\n- `/stand` to make your NPCBot stay put\n- `/wave` to make your NPCBot follow you again\n\nIf your NPCBot is not targetable or in the immediate vicinity (for selection), you can use the commands:\n\n- `.npcbot command stay` (`.npcb c s`) to make all your controlled NPCBots STAY\n\n- `.npcbot command follow` (`.npcb c f`) to make all your controlled NPCBots FOLLOW\n\nIn the event your NPCBot is too far away to path to you, your NPCBot will teleport themself to you.\nYou can also use `.npcbot recall teleport` command to force your NPCBots to teleport to you\n\nWhen you leave the world your NPCBots aren't hanging around outside the dungeon you decided to log out at. Unless you spawned that NPCBot outside that dungeon. When you log out your NPCBots temporarily become normal free NPCBots (but not hireable because they already have an owner - you) and return to their spawn location. If you picked up your NPCBot in Darnassus, it will return there. If you spawned your NPCBot on the road through the Barrens, it will return there. This can be both annoying and good, spawning NPCBots in a good central location (like in cities), will provide you an easy way to hire them (and coincidentally, they like to hang out and buff passerbys).\n\n#### NPCBot Equipment\nNPCBots spawn with some basic equipment and clothes. Some NPCBots however start with some rather powerful weapons but they are only visual and provide no benefits: no damage, no stats. Nothing. They are __purely visual__. In fact, in most cases these weapons are partial to class appearance and will always stay (like Dark Ranger and her trusty bow)  \nNPCBots give you the ability to customize their individual gear pieces to make them more effective in combat. Note that visual changes to NPCBot's equipment are not instant (except weapons)\n\nTo make changes to their gear, you need to right-click that NPCBot and choose `Manage equipment...` from their post-hire Gossip Menu. You should then see the following:\n```\n- Show me your inventory\n- Auto-equip...\n- Main hand...\n- Ranged...\n- Head...\n- Shoulders...\n- Chest...\n- Waist...\n- Legs...\n- Feet...\n- Wrist...\n- Hands...\n- Back...\n- Shirt...\n- Finger 1...\n- Finger 2...\n- Trinket 1...\n- Trinket 2...\n- Neck...\n- Unequip all\n- Update visual\n- BACK\n```\nAs you can see, you can gear up pretty much every slot on your NPCBot\n\n- `Show me your inventory` will make the NPCBot whisper you a list of everything they currently have including an item icon (helps to understand which slot the item is equipped into)\n\n- `Auto-equip` will list out all the items you have in YOUR bags that the NPCBot can use. Clicking on one of those items will automatically give it to the NPCBot and equip it into the appropriate slot\n\n- `_(INDIVIDUAL GEAR SLOTS)_` will show you what they have equipped (if any), an option to use their old equipment (if any to start with) OR an unequip option (if you gave them some gear), a listing of any item in YOUR bags that the NPCBot can use in that slot and a BACK option. Selecting any of your bag items will automatically send that item to the NPCBot and have them equip it. The option to use old equipment or unequip gear will have the NPCBot RETURN the gear you gave them BACK to YOUR bags. They will then return to the default gear/state for that slot. You can also transmogrify items in displayed gear slots (if this feature is enabled) using items you have in your inventory/bags, refer to worldserver config for transmog rules\n\n- `Unequip all` will have them do just that... dump __ALL__ gear you have given them back into YOUR bags. If you don't have enough space in your bags the excess items will be mailed to you.  NOTE: When firing an NPCBot, any gear you have given your NPCBot will automatically be returned to you\n\n- There is an additional optional item in this menu called `Bot gear bank...` which can be enabled by setting `NpcBot.GearBank.Enable = 1` in config. It gives access to unlimited storage for gear - useful when you have too many bots to keep all their extra gear in your own bags. This is an exploit of course so this feature is disabled by default. Note that this storage is saved per player so you will not lose this gear when your last bot is dismissed, but at the same time you won't be able to access it without bots to talk to\n\n- `BACK` just goes back to the previous menu\n\n#### NPCBot Roles\nNPCBot Role management allows you to adjust how they operate overall. The available options are dependent upon the class of the NPCBot you are controlling\n\nTo adjust the NPCBot's roles, you need to right-click that NPCBot and choose `Manage roles...` from their Gossip Menu. You should then see (dependent upon the class):\n```\n- Gathering...\n- Looting...\n- Tank\n- Off-Tank\n- DPS\n- Heal\n- Ranged\n- BACK\n```\nClicking on the respective Role will toggle it on/off (changing the icon)\n\nThe roles can be a little tricky to understand:\n\n- \"Tanking\" role means that NPCBots will try to produce as much threat as possible, use taunt-like abilities to reaggro targets attacking friends and use defensive cooldowns more liberally. This does NOT include attacking anything. \"Tanking\" bots with no \"Off-Tanking\" enabled are considered Main Tanks and will always stay on targets pointed by `TankTargetIconMask` (see [Config Settings](#npcbot-config-settings))\n\n- \"Off-Tanking\" is an addition to \"Tanking\" role and makes tanking NPCBots prioritize targets pointed by `OffTankTargetIconMask`. Enabling this role will automatically enable \"Tanking\" role also\n\n- \"DPS\" role allows NPCBots to actually deal damage. If this role is disabled NPCBot will not use damaging abilities, not even auto-attack\n\n- \"Heal\" is what your healers need to have enabled. If this role is disabled NPCBots will not even try to heal anything, not even themselves. No, not even in a face of certain death\n\n- \"Ranged\" role affects NPCBots' positioning and the distance they will keep from their attack target. Ranged DPS non-tanking bots will always attack target pointed by `RangedDPSTargetIconMask`\n_Example_: Warrior having Tanking + DPS + Ranged role enabled will constantly try to taunt the target and run away, only attacking if target catches up\n\nIt's recommended to only enable 1 or 2 specific roles for that class to minimize them switching tactics around alot. The only exception is Priest which can handle DPS, Heal and Ranged roles just fine (they will preserve some mana for healing and resort to wand)\n\n`Gathering...` roles allow NPCBots to collect different ores, herbs, leather and other trade goods. It does NOT allow to track those goods so good luck with that. It also does NOT allow bots to craft anything. NPCBots have their skill assigned according to their level so level 1 NPCBot for example will not be able to mine Mithril. Note that bots will only use nodes **you** are very close to\n\n`Looting...` roles allow NPCBots to automatically and quickly collect items from nearby lootable creatures for you and other players in your group. Make sure to chose loot method, quality threshold in your group and looting setting for your looter bot\n\n#### NPCBot Formation\nSome times you just want your NPCBot close.. or as far away as possible. The formation option allows you to adjust your NPCBot's distance from you.\n\nSelect `Manage formation...` from their Gossip Menu to adjust the formation. You will see:\n```\n- Follow distance (current: XX)\n- DISABLE combat positioning\n- Attack distance...\n- Attack angle...\n- Engage behavior...\n- Priority target (Tank)...\n- Priority target (DPS)...\n- BACK\n```\nNOTE1: you will see `DISABLE combat positioning`, `Attack distance...` and `Attack angle...` only if NPCBot has `Ranged` role assigned  \nNOTE2: you will see `Engage behavior` only if NPCBot is not a tank  \nNOTE3: you will see `Priority target (<Role>)...` only if NPCBot has required role(s), you are in group, and at least one target icon belonging to respectful target icon mask is set (see [Config Settings](#npcbot-config-settings)). **Priority targets are set for each NPCBot individually**  \nSelecting `Follow distance` will open up a popup window that you can enter in an amount. This amount can be anywhere from **0** to **100**. Setting any higher than **100** will default to **100** and any lower than **0** to **0**. Setting the distance to **0** will result in the NPCBot PASSIVELY following you rather closely and not engaging mobs unless you attack\n\nIf `DISABLE combat positioning` option is checked your `Ranged` NPCBots will not try to assume attack positions and will instead retain their follow positioning even in combat, only attacking targets in reach\n\nSelecting `Attack distance...` will allow you to set ranged attack distance. You will see:\n```\n- Short range attacks\n- Long range attacks\n- Exact (0-50)\n- BACK\n```\nNOTE: if \"Exact\" mode is set, its text will change to\n```\n- Exact (current: XX)\n```\nShort range are attacks that are the shortest distance of all ranged attacks for NPCBot's class. For example for paladins it is 10 yards (Judgement range) and for Mages it is 20 yards (Fire Blast range)  \nLong range attacks are the opposite of short range ones. For most classes this range is about 30-35 yards. This mode is useful when attacking something too dangerous to stand close to  \nSelecting `Exact` will open up a popup window that you can enter in an amount. This amount can be anywhere from **0** to **50**. Same rules as for follow distance  \nNOTE: setting exact attack distance to **0** will make NPCBots (and their pets) trying to position themselves on top of their target (ignoring model size)\n\n`Attack angle...` allows you to set ranged bots positioning mode. You will see:\n```\n- Normal\n- Avoid frontal AOE\n- BACK\n```\nIf you tell your NPCBots to avoid frontal AOE they will try to position themselves in the way that they won't get hit, behing their target and to the either side, but only if you do the same or are already in melee range of the target\n\n`Engage behavior...` submenu is used to manage bots' behaviour when combat is initiated:\n```\n- Delay attack by: X.XXs\n- Heal target health threshold: XX%\n- BACK\n```\nAttack delay is time (in seconds) your `DPS` NPCBots will wait before they start attacking. **This does not apply to Tanks and Healers**  \nHeal threshold is a unit health percentage, friendly units at which or below will be considered a viable heal target for your NPCBot. This is a way to tell your DPS+Heal bots to not heal anyone unless it's *really* needed. This parameter is individual to each bot. **Only available to Healers**\n\n`Priority target (<Role>)...` allows you to set main target for each bot individually and by role:\n```\n- <Icon> <Name>\n- <Icon> <Name>\n- ...\n- <None>\n- BACK\n```\nHere `Icon` is group target icon (skull, cross, etc.), `Name` is marked unit's name. Number of those rows is the number of **active** icons belonging to corresponding role. If marked target is attackable then at engage instead of normal targeting this NPCBot will immediately rush towards this unit. Be aware that priority target is **set by icon** and will persist when icon is set to another unit, this new unit becomes new priority target to all bots who have priority set to this icon. Selecting `None` disables priority target for this NPCBot.\n\n#### NPCBot Abilities\nNPCBots use most of real class spells. Some spells/abilities such as buffs, heals, remove curse/poison, etc. are available through an NPCBot's Abilities menu. Level restrictions apply to NPCBots too, for example Warlock will not be able to use Fear until level 8  \nSelecting `Manage abilities...` from the Gossip menu will give you a listing of spells/abilities that they can cast on you or for you. The \"Update\" option will refresh the spell listing as some spell may be cooled at the moment  \nIf spell is not listed this doesn't mean NPCBot does not have the spell, probably you just cannot use it manually  \nNPCBots' abilities check algorithm includes finding missing buffs, friends to heal, restocking on consumables (like healthstones), class enchants (Rogue, Shaman), utilities (like using Sprint if falling far behind), spells for party and self, self-heals, finding crowd control targets and finally, attack abilities\n\nUsing `Manage allowed abilities...` submenu you can make bots not use some of their spells. Disabled spells list is saved in DB\n\n#### NPCBot Talents\nNPCBots don't use normal talent pick choice system. Instead, main talent tree is used (according to a spec) while also picking vital talents from other two trees up to tier 3 (available to players of the same spec).  \nSelect `Manage talents...` from the Gossip menu to chose a spec. Bot will activate it and continue to progress with chosen spec as you level up. This action has no cooldown\n\n#### NPCBot Grouping\nAlthough NPCBots will follow their owner around grouped or ungrouped and will usually buff people outside their groups, creating group will make NPCBots properly utilize buffs reserved for group members only  \nGrouping is also required to properly utilize the DungeonFinder (as you cannot summon NPCBots in or into instances that are ungrouped)\n\n>**NOTE**:\n>If DungeonFinder group has only one real player loot rules will be set to _Free For All_\n\n#### NPCBots and Vehicles\nNPCBots will always try to use vehicles when player does. With random vehicle types bots will simply copy player actions, but for the essential vehicles bots will use their own tactics. Here is the list:\n```\nWyrmrest Skytalon (Eye of Eternity)\nRuby Drake (Oculus)\nEmerald Drake (Oculus)\nAmber Drake (Oculus)\nArgent Warhorse / Battleworg (Trial of the Champion)\nAlliance / Horde Gunship Cannon (Icecrown Citadel Gunship Battle)\nMutated Abomination (Icecrown Citadel Professor Putricide, bots will never use)\n```\nNote: NPCBots do not dismount from vehicles automatically while in combat. Use `.npcbot vehicle eject` command to force them out of their vehicles.\n\n#### NPCBot Extras\nDepending on NPCBot's class, there may be extra options found in the Gossip menu for that NPCBot\n\nFor example, Rogue NPCBots will present the options:\n```\n- Help me pick a lock (XX)\n- I need you to refresh poisons\n- <Choose poison (Main Hand)>\n- <Choose poison (Offhand)>\n```\nLockpicks allow you to open locked chests in the world and locked items in your inventory. The skill level (XX) is based on NPCBot's level  \nPoisons can be chosen for the expected encounters. You'll have to tell your NPCBot to refresh the poisons when you are done\n\nShaman NPCBots have similar menu for their weapon enchants\n\nMage NPCBots will give you:\n```\n- I need food\n- I need drink\n- I need a refreshment table\n- I need a portal\n```\nThese options will summon a stack of food or drink for you  \nIf your level is high enough, the mage NPCBot can summon a refreshment table and portals for you and your group\n\nWarlock NPCBots will present the options:\n```\n- I need your healthstone\n- I need a soulwell\n```\nFirst option will make that Warlock give you their healthstone  \nIf your level is high enough, the warlock NPCBot can summon a soulwell  \nLevel restrictions are applied here, too\n\nHunter and Warlock NPCBots (once they reach level 10) also have pet submenu:\n```\n- <Choose pet type>\n```\nYou are still aware of level restrictions, right?  \nBecause they don't quite apply to Hunter. He can summon any pet type, yet exotic pets are only unlocked at 80\n\nLastly, all NPCBots will have the following extra options:\n```\n- You are dismissed\n- Nevermind\n```\n`You are dismissed` will remove the NPCBot from your control. They will become pissed off, throw all their gear at you and return back to their spawn location. They will also become enraged for 5 minutes to the point where they will attack anyone attempting to hire them (this can be disabled in config)  \n`Nevermind` will simply close out the Gossip menu\n\n### NPCBot Wander System\nBesides their main purpose which is to assist players, NPCBots can also be used as autonomous units. Wandering bots spawn with gear, but are free of player's control and cannot be hired. Here is a list of features supported:  \n1. Wandering bots in open world. Config setting **`NpcBot.WanderingBots.Continents.Count`** controls desired amount of bots roaming world maps. Spawn points are random and level is selected accordingly. These bots give small reward for kill and bonus experience. See the config file for more info.  \n2. Wandering bots generated for Battlegrounds. Enabled by **`NpcBot.WanderingBots.BG.Enable`** setting, this feature allows to generate NPCBots to fill BG queue and partake in BG matches.  \n\n### NPCBot Config Settings\nIf some config settings look ambiguous this section may be of help to you\n\n- **`NpcBot.BaseFollowDistance`**\n    - This parameter determines formation size and enemy chase cutoff distance\n    - Value range: **0-100**\n    - Not saved between log-ins  \n    Explanation. Bots group around you in a formation where tanks are in front, melee are on the sides and ranged are in the back. The distance they keep from you is not changed if value of this parameter is 30 or less. Past 30 it is increased linearly up to additional 10 yards between you and a your bots. The distance at which bots start attacking incoming enemies is determined by this parameter as well. This is distance between *player* (or *bot*, if stationed) and the enemy and is about 75% of this paramenter's value. If bot's attack target moves outside of this range bot stops attacking it (unless you attack this target as well) and retreats. **This means** that if this parameter is set low bot actions and chase movement may become erratic. If this parameter is set to **0** bots will act passively unless you point an attack targets (with your melee attack, only works in combat); this may be useful in case you want bots to attack and retreat, or in situation where blind attack is dangerous and you need bots to attack only targets you want them to. **Auto-attack spells like Autoshot or Shoot Wand cancel your melee attack**\n- **`NpcBot.XpReduction`**\n    - This parameter allows you to set XP gain percent penalty for players using bots during leveling. When there is more than one player in a group the maximum number of bots hired by any player in group is used for XP reduction amount calculation\n    - Value range: **0-90**  \n    Explanation. XP amount is reduced by a percentage for every used bot after first one (it doesn't matter if bots are in group with player or not). Two bots are able to do much more damage than one player, especially at low levels. Bots also open great potential for grind. So you may want to punish your players a little. The formula is: **(100 - X \\* (Y - 1))%** XP gained, where **X** is XP reduction and **Y** is bots count. *Example: XP reduction is 10, bots count = 4; XP gained: 100 - 10 * (4 - 1) = 70% XP gained*. In any case, overall XP reduction from this parameter will never exceed 90%. **This penalty only applies to bots' owner**\n- **`NpcBot.HealTargetIconsMask`**\n    - This parameter allows players to mark units not under player's control as friends using Target Icons  \n    Explanation. Sometimes you need to protect targets other than yourself, escort quests are a good example. With this parameter activated players can set *Raid Icon* on a target they want bots to care about. Bots will treat said target as a member of player's party, heal it if needed and assist it in combat. Parameter itself is a bit mask and consists of a combination of values assigned to each target icon: **Star - 1, Circle - 2, Diamond - 4, Triangle - 8, Moon - 16, Square - 32, Cross - 64, Skull - 128**. *Example: Star, Diamond and Triangle = 1 + 4 + 8 = 13*\n- **`NpcBot.TankTargetIconsMask`**\n    - This parameter is similar to `NpcBot.HealTargetIconsMask`, but this one marks targets for your NPCBot main tanks\n    - Your main tanks **will not stop attacking pointed target** until it's dead or icon is unset\n- **`NpcBot.OffTankTargetIconsMask`**\n    - This parameter is similar to `NpcBot.TankTargetIconsMask`**, but this one marks targets for your NPCBot off-tanks\n    - Your off-tanks **will not stop attacking pointed target** until it's dead or icon is unset\n- **`NpcBot.DPSTargetIconsMask`**\n    - Same as `NpcBot.TankTargetIconsMask`, but this one affects your damage dealers, and (off-)tanks with DPS role enabled without pointed tanking target, with the same rules\n- **`NpcBot.RangedDPSTargetIconsMask`**\n    - Same as `NpcBot.DPSTargetIconsMask` but this one only affects your ranged NPCBots\n- **`NpcBot.NoDPSTargetIconMask`**\n    - NPCBots will try to not damage these targets\n- **`Heal / Tank / DPS _TargetIconsMask` priorities**\n    - For every pointed target type priority goes in reverse order of target icons list in right-click dropdown menu: from *Skull* (highest) to *Star* (lowest)\n- **`Heal / Tank / DPS _TargetIconsMask` intersections**\n    - If there are any bitmask intersections between target icons (simply put, same icon is used, on accident or otherwise), these rules are applied:\n        - Heal + DPS target **will not be protected** by taunting or attacking the attackers\n        - Heal + DPS target **may still be healed** if can be healed\n        - Heal + DPS target **may still be attacked** if attackable and in combat\n        - Heal + (Off-)Tank target **will still be tanked** if can be attacked\n        - All DPS icons will be automatically excluded from **`NoDPSTargetIconMask`**\n- **`NpcBot.Cost`**\n    - This parameter determines how much money player has to pay to hire a bot\n    - This is how much money player has to pay **at level 80**, for lower levels cost is reduced:\n        - level  1-10: cost / 5000\n        - level 11-20: cost / 100\n        - level 21-30: cost / 20\n        - level 31-40: cost / 5\n        - level  41+:  cost / 80 \\* level  \n    Explanation. The value you set is in copper (1 silver = 100 copper, 1 gold = 100 silver = 10000 copper). Rare and Elite bots cost more (**x2** for Rare and **x5** for Elite)\n- **`NpcBot.Movements.InterruptFood`**\n    - This parameter determines if bots should stop eating and drinking if they move  \n    Explanation. By default this parameter is disabled to prevent bots' food and drinks spam since bots try to eat and drink whenever they have the chance, which is every time they don't do anything even for a fraction of a second\n- **`NpcBot.EquipmentDisplay.Enable`**\n    - This parameter allows bots to display equipped items other than weapons on their model  \n    Explanation. Normally, for creatures game client only draws default model determined by model ID. This parameter force feeds clients information about unit model and items in equipment slots which is generated at server side; so instead of default model client draws player model components including skin color, face, facial hair and others including \"equipped\" items. The only problem players may encounter comes from a game client bug which can cause a crash at game exit (client crash, not server crash) with error \\#132. This bug can be reproduced by changing base model of unit having UNIT_FLAG2_MIRROR_IMAGE more than 4 times in a short period of time, so bots being polymorphed or druids shapeshifting have higher chance of causing this problem\n\n### NPCBot Mod Localization\nAll localizable string are contained in `npc_text` table. If you want to make a translation you'll have to populate `npc_text_locale` table accordingly (`Text0_0` field)  \n\n### NPCBot Extra Classes\n#### General Information\nNPCBot mod features several custom classes inspired by Warcraft III. These bots are ranked Rare, Elite or Rareelite, have different mana increase rate and cannot drink to restore mana, have increased level and hire cost, may have minimum player level requirement. Also, control magic affects them much less, even less than is does players. They are not intended to be as effective as normal classes and/or balanced at any given level. Their main purpose is to support you and other bots. For basic information on certain class use Gossip Menu and click `<Study the creature>`. If you need more info keep on reading  \n\n#### Blademaster\n*(Disabled in last version)*  \n**Rank: Rare**  \n**Level Bonus: +1**  \n**Minimum player level: 1**  \n**Equipment affects visual: no**  \n**Number included: 1**  \n**Class specifics:** Very high attack speed, equipped weapon does not affect attack speed, attack power from stats: agility x9, cannot crit with normal attacks, cannot dodge or parry, bonus armor penetration 80%  \nEquippable weapon: 2h swords, 2h axes and polearms  \nEquippable armor: any (no shield)  \nAbilities:\n\n- Netherwalk. Blademaster becomes invisible and moves faster for 30 seconds. If Blademaster breaks invisibility to attack, he will deal 150% damage on first attack\n- Mirror Image. Blademaster disappears, creating 1-3 illusions of himself (depends on hero's level). Also dispells all magic from him. Mirror Images deal no real damage and take 200% damage themselves\n- Critical Strike (passive). Gives 15% chance to deal critical strike for x2-x4 times normal damage (depends on hero's level)\n- Bladestorm (not implemented)  \n\n**Additional info:** Blademaster stands out as a class with highest single target damage capabilities and ability to almost one-shot most things if geared properly. Unfortunately, due to changes in movement mechanic, Blademaster's critical strike animation can no longer be emulated, and thus this class was disabled in last version  \n\n#### Obsidian Destroyer\n**Rank: Rareelite**  \n**Level Bonus: +3**  \n**Minimum player level: 60**  \n**Equipment affects visual: weapons only**  \n**Number included: 2**  \n**Class specifics:** *Very* high resistances, *negative* mana regeneration which cannot be countered by passive mana regeneration effects (like item mp5 stats), cannot mount, no melee attack, stamina bonus +50%, armor bonus: +50%, all damage taken reduced by 33%, attack power from stats: strength x2, spellpower bonus: 50% attack power + 200% intellect + wands, cannot eat  \nEquippable weapon: wands **x 2**  \nEquippable armor: mail/plate (no shield), **no jewelry or cape**  \nAbilities:\n\n- Devour Magic. Dispels up to 2 magic effect from enemies, up to 2 magic effects and 2 curse effects from allies and damaging summoned units in 20 yards dest area, restoring caster's mana and health (20% mana and 5% health for every dispelled effect)\n- Shadow Blast. Empowered attack that deals increased splash damage to targets in a rather large area. Main target takes more damage than others\n- Drain Mana. Drains all mana from a random ***friendly*** unit. The amount drained is limited by Obsidian Destroyer's maximum mana. **This ability cannot be disabled**\n- Replenish Mana. Energizes all surrounding party and raid members within 25 yards for 3% of their maximum mana. *This ability drains all mana*\n- Replenish Health. Heals all surrounding party and raid members within 25 yards for 3% of their maximum health. *This ability drains all mana*\n- Shadow Armor (passive). Restores mana equal to a percentage of damage taken. This ability only triggers when damage taken is enough to restore 10% of Obsidian Destroyer's mana  \n\n**Additional info:** Obsidian Destroyer in fact derives from a non-hero unit, but received elite status because of the ability to deal insane amounts of damage given the chance, support party of any kind, dispel, purge AND tank at the same time, utilizing abilities of original unit's both forms: statue form and true form  \n\n#### Archmage\n**Rank: Rare**  \n**Level Bonus: +1**  \n**Minimum player level: 20**  \n**Equipment affects visual: no**  \n**Number included: 1**  \n**Class specifics:** Always mounted (ground mount only), no melee attack, armor bonus: 500% intellect, spell damage taken reduced by 35%, spellpower bonus: 100% intellect  \nEquippable weapon: staves  \nEquippable armor: cloth (no shield)  \nAbilities:\n\n- Blizzard. It looks like your typical mage Blizzard but it's in fact a little different. It has no chill effects or anything, but has higher base damage and scales much more with spellpower\n- Summon Water Elemental. Archmage Water Elemental has 1 minute duration and 20 sec cooldown, cannot run out of mana and deals more damage since W3 Archmage could have 3 active Elementals\n- Brilliance Aura. Increases maximum mana by 10% and mana regeneration by 100% of party and raid members within 40 yards\n- Mass Teleport (not implemented)  \n\n**Additional info:** Archmage is most valued for his support capabilities in large groups, although he is very squishy  \n\n#### Dreadlord\n**Rank: Rareelite**  \n**Level Bonus: +3**  \n**Minimum player level: 60**  \n**Equipment affects visual: no**  \n**Number included: 5**  \n**Class specifics:** High resistances, cannot mount, stamina bonus +20%, armor bonus: +50%, all damage taken reduced by 15%, critical strike rating x2, attack power from stats: strength x8, spellpower bonus: 200% stength  \nEquippable weapon: axes, maces, swords, 2h axes, 2h maces, 2h swords, polearms, staves, fist weapons, daggers  \nEquippable armor: plate (no shield)  \nAbilities:\n\n- Carrion Swarm. This ability damages enemies in a very large and long frontal cone, healing Dreadlord for 100% effective damage dealt, can easily restore all health to the Dreadlord, high mana cost. Carrion Swarm deals double damage to incapacitated targets\n- Sleep. Puts enemy to sleep for 60 seconds and reduces armor by 100% for the duration. Damage over time effects do not interrupt this effect, only direct damage does\n- Vampiric Aura. Increases physical critical damage by 5% and heals party and raid members within 40 yards for 25% (100% for Dreadlord) of damage dealt by melee physical attacks. This heal generates no threat\n- Infernal. Summons an Infernal Servant at dest location, damaging and stunning enemy units in the area. Infernal is very resistant to magic and its stats scale with Dreadlord's stats. Infernal burns, dealing damage to surrounding enemies every 2 seconds, 180 sec duration  \n\n**Additional info:** Dreadlord is most useful in a big party with a lot of melee classes and also can be very annoying in pvp if packed with enough haste and armor penetration  \n\n#### Spell Breaker\n**Rank: Rare**  \n**Level Bonus: +1**  \n**Minimum player level: 20**  \n**Equipment affects visual: no**  \n**Number included: 5**  \n**Class specifics:** All spell damage taken reduced by 75%, armor penalty: -30%, attack power from stats: strength x5, block chance +90%, spellpower bonus: 200% stength  \nEquippable weapon: axes, maces, swords, fist weapons, daggers  \nEquippable armor: mail/plate  \nAbilities:\n\n- Steal Magic. Steals benefical spell from an enemy and transfers it to a nearby ally, or removes a negative spell from an ally and transfers it to a nearby enemy, affects magic and curse effects. Transferred effect duration is limited to a maximum of 5 minutes *and minimum of 5 seconds*\n- Feedback (passive). Melee attacks burn target's mana dealing arcane damage. Amount burned is equal to melee damage dealt increased by spell power. If target is drained, Spell Breaker's melee attacks will do triple damage with increased critical strike chance. If target does't have mana then instead of draining Spellbreaker's damage restores his own mana equal to 25% of damage dealt\n- Control Magic (not implemented)  \n\n**Additional info:** Spell Breaker is mostly pure support class incapable of dealing any serious damage, but may also make quick work of some hapless caster, burning all his mana in seconds  \n\n#### Dark Ranger\n**Rank: Rareelite**  \n**Level Bonus: +3**  \n**Minimum player level: 40**  \n**Equipment affects visual: no**  \n**Number included: 5**  \n**Class specifics:** Undead, damage generates no threat, sneak mode if not moving, spell damage taken reduced by 35%, attack power from stats: agility x4 + intellect x2, armor penetration bonus: 50%, crit bonus +20%, dodge bonus +30%, spellpower bonus: 50% intellect  \nEquippable weapon: swords, daggers, bows  \nEquippable armor: cloth/leather (no shield)  \nAbilities:\n\n- Silence. Silences an enemy and nearby targets for 8 seconds. Maximum of 5 targets, 15 sec cooldown\n- Black Arrow. Fires a cursed arrow dealing 150% weapon damage and additional damage over time. If affected target dies from Dark Ranger's damage, Dark Minion will spawn from the corpse (does not apply to players), leaving a pile of gore (lootable). Deals 5 times more damage if target is under 20% health. Only affects humanoids, beasts and dragonkin. If target unit's rank is rare, elite of rareelite, spawns elite Minion instead. Maximum 5 Minions, Minions live for 80 seconds and are immune to healing effects\n- Drain Life. Drains health from an enemy every second for 5 seconds starting with 0 (6 total ticks), healing Dark Ranger for 200% of the drained amount\n- Charm (not implemented)\n- Taunt (Dark Minion). Taunts an enemy within melee range to attack Dark Minion instead of Dark Ranger for 5 seconds. One-time use\n- Improved Blocking (Dark Minion). Increases chance to block an attack by 60-100% (depends on caster's level) for 6 seconds. One-time use  \n\n**Additional info:** Dark Ranger has most use in solo combined with healer, or as a support in big group due to Silence low cooldown and no other mana sinks  \n\n#### Necromancer\n**Rank: Elite**  \n**Level Bonus: +2**  \n**Minimum player level: 20**  \n**Equipment affects visual: no**  \n**Number included: 5**  \n**Class specifics:** Spell damage taken reduced by 20%, no melee attack, spellpower bonus: 100% intellect  \nEquippable weapon: staves  \nEquippable armor: cloth (no shield)  \nAbilities:\n\n- Raise Dead. Raises 2 Skeletons from a corpse (maximum 6 Skeletons, 65 seconds duration, only works on humanoids, beasts and dragonkin)\n- Unholy Frenzy. Increases target's melee attack speed by 75%, but constantly drains health and may kill the target. Lasts 45 seconds. Cannot be cancelled. Unlocked at level 30\n- Corpse Explosion. Causes a corpse to explode, dealing damage equal to 35% to 75% of dead unit's maximum health (depends on Necromancer's level) to all surrounding enemies. This damage generates no threat. Unlocked at level 40\n- Cripple. Reduces target's movement speed, melee attack speed and total strength by 50% for 60 seconds. Unlocked at level 50\n- Taunt (Skeleton). Taunts an enemy within melee range to attack Skeleton instead of Necromancer for 5 seconds. One-time use\n- Improved Blocking (Skeleton). Increases chance to block an attack by 60-100% (depends on caster's level) for 6 seconds. One-time use  \n\n**Additional info:** Necromancer has some Diablo II spirit to it. Curses may come in the future. Necromancer is mainly a support class, he doesn't have any damaging abilities besides CE, but Skeletons combined with Unholy Frenzy can help quite a lot  \n\n#### Naga Sea Witch\n**Rank: Rareelite**  \n**Level Bonus: +3**  \n**Minimum player level: 1**  \n**Equipment affects visual: no**  \n**Number included: 5**  \n**Class specifics:** Spell damage taken reduced by 30%, attack power from stats: agility x2, parry bonus +25%, spellpower bonus: 200% intellect  \nEquippable weapon: daggers, bows  \nEquippable armor: cloth (no shield)  \nAbilities:\n\n- Forked Lightning. Calls forth a cone of lightning to damage enemies. Hits from 2 to all targets (depending on Sea Witch's level), stunning them for 2 seconds. This damage generates no threat  \n- Frost Arrows. Imbues arrow with spellfrost for extra damage, slowing target's movement, attack and casting speed by 30% to 70% (depending on Sea Witch's level)  \n- Mana Shield. Creates a shield that absorbs 100% incoming (non-mitigated) damage by using Sea Witch's mana. Absorbs from 1 damage pet 10 points of mana to 10 damage per 1 point of mana (depending on Sea Witch's level)  \n- Tornado. Summons a fierce tornado that damages and slows nearby enemy units, sometimes incapacitating them completely. Tornado grows in size over time outdoors, increasing damage dealt and area of effect, but shrinks indoors, dissipating quickly. Unlocked at level 60\n- Naga (Passive). Swim speed increased by 200%, damage and dodge chance are greatly increased while in water\n\n**Additional info:** Sea Witch is a versatile ranged damage dealer. She is very durable and has some CC capabilities  \n\n#### Crypt Lord\n**Rank: Rareelite**  \n**Level Bonus: +3**  \n**Minimum player level: 1**  \n**Equipment affects visual: no**  \n**Number included: 5**  \n**Class specifics:** Melee damage taken reduced by 30%, spell damage taken reduced by 15%, stamina bonus +20%, armor bonus: up to +50%, attack power from stats: strength x9, spellpower bonus: 200% strength  \nEquippable weapon: axes, maces, swords, 2h axes, 2h maces, 2h swords, polearms, staves, fist weapons, daggers  \nEquippable armor: mail/plate (no shield)  \nAbilities:\n\n- Impale. Crypt Lord slams the ground with his massive claws, shooting spikes out in a frontal cone, dealing damage and hurling enemy units into the air in their wake, stunning them. Unlocked at level 20.  \n- Spiked Carapace. Crypt Lord's chitinous armor increases damage resistance and returns 15% to 50% damage to enemy melee attackers.  \n- Carrion Beetles. Crypt Lord progenerates a Carrion Beetle from a fresh corpse of an enemy to attack his enemies. Beetles are permanent but do not regenerate health and only 6 can be controlled at a time. Higher levels allow Crypt Lord to summon more powerful beetles. Unlocked at level 10.  \n- Locust Swarm. Crypt Lord releases a swarm of 20-40 (depends on Crypt Lord's level) angry locusts that bite and tear at nearby enemy units, reducing their ability to move or attack. As they chew the enemy flesh, they convert it into a substance that restores hit points to the Crypt Lord when they return. Unlocked at level 40.  \n\n**Additional info:** Crypt Lord is a great melee damage dealer and with little support he becomes a not bad melee tank. Higher levels also provide moderate CC capabilities. Crypt Lord is immune to poison-based effect (but not damage)  \n\n### NPCBot Occupations\n#### Database\nNPCBot data is stored in the following locations:\n\n- `characters` DB\n    - `characters_npcbot` (created by this mod) contains all information about spawned npcbots\n    - `characters_npcbot_group_member` (created by this mod) contains NPCBot group member records\n    - `characters_npcbot_transmog` (created by this mod) contains transmogrification info for NPCBots\n    - `characters_npcbot_gear_storage` (created by this mod) contains NPCBot gear storage info per player\n    Also writes to:\n        - `item_instance` (item owner assignment)\n- `world` DB\n    - `creature_template_outfits` (created by this mod) contains static display information\n    - `creature_template_npcbot_appearance` (created by this mod) contains dynamic display information\n    - `creature_template_npcbot_extras` (created by this mod) contains race and class info\n    - `creature_template_npcbot_wander_nodes` (created by this mod) movement points for wandering bots\n    - `creature_template` (ids 70000-71000\\*) contains creature base data for bots\n    - `creature_equip_template` (ids 70000-71000\\*) contains bots' standard weapons info\n    - `npc_text` (ids 70000-71000) custom text for bots' gossip and class descriptions\n    - `creature` contains info about spawned creatures in the world  \n    \\* \\- max id may be exceeded by custom NPCBots created\n\nIf you want to make changes to the static template data used for NPCBots, you make adjustments in the `world` database to those specific ids in the above tables (i.e. npcbot model, outfits, etc.)  \n**Do not** tinker with `characters` DB NPCBot tables, any bug reports containing accidently corrupted NPCBots installation will be discarded without notice  \nIf you need to delete custom created NPCBot you need to first delete the bot from the world (using `.npcbot delete` command; you need to remove their equipment first, otherwise the items become inaccessible). Then delete by entry (creature id) from `creature_template_npcbot_extras`, `creature_template_npcbot_appearance` and `creature_equip_template` tables, and finally, from `creature_template`  \nIf you need to remove NPCBot mod completely you need to first delete every spawned bot in the world (using `.npcbot delete` command). Then delete `characters_npcbot`, `characters_npcbot_group_member`, `characters_npcbot_transmog`, `characters_npcbot_gear_storage`, `creature_template_npcbot_extras`, `creature_template_npcbot_appearance` and `creature_template_npcbot_wander_nodes` tables and clean all other used tables of entries by id (70000-71000 + possibly more custom bot entries). `creature_template_outfits` can also be deleted if you are not using Npc Dress Mod\n\n#### Game World\nBots are counted as active objects and keep map grids loaded like players\nBots are being added to world at server loading (after Map System is started)\n\n#### Total number of bots included in fresh install: **312**\n\n### NPCBot Addons\nFor current version (3.3.5) there is a [NetherBot](https://github.com/NetherstormX/NetherBot) addon by NetherstormX\n\n### For supporters\n**If you really, really want to support me, visit [this boosty page](https://boosty.to/bad3dart). Even the samallest donation will let me know I'm doing the right thing here.**\n\n---------------------------------------\n## Guide Changelog\n\n- **Version 0.25** (_14 Jun 2023_)\n    - Added `.npcbot useonbot ...` commands\n- **Version 0.24** (_20 May 2023_)\n    - Crypt lord implementation details\n- **Version 0.23** (_08 Feb 2023_)\n    - Added addons info\n- **Version 0.22** (_24 Dec 2022_)\n    - General review with lots of fixes\n- **Version 0.21** (_15 Dec 2022_)\n    - Added `.npcbot sendto` command\n- **Version 0.20** (_13 Dec 2022_)\n    - Added new commands / cmd parameters\n- **Version 0.19** (_24 Jun 2022_)\n    - Added `.npcbot command walk` command\n- **Version 0.18** (_22 Jun 2022_)\n    - Added info on sea witch\n- **Version 0.17** (_18 Jun 2022_)\n    - Fixed numerous mistakes, added info on ICC vehicles\n- **Version 0.16** (_02 Jan 2022_)\n    - Added info on necromancer\n- **Version 0.15** (_29 Mar 2021_)\n    - Added info on new installation method\n- **Version 0.14** (_23 Jan 2021_)\n    - Added info on vehicle and dump commands\n- **Version 0.13** (_20 Jan 2021_)\n    - Added info on vehicles\n- **Version 0.12** (_06 Jan 2021_)\n    - Added info on autoloot\n- **Version 0.11** (_07 Nov 2020_)\n    - Added info on localization\n- **Version 0.10** (_16 Jun 2020_)\n    - Added info on new config settings\n- **Version 0.9** (_09 Jun 2020_)\n    - Added info on botgiver\n- **Version 0.8** (_15 May 2020_)\n    - Added info on raid group unit frames\n    - Added info on new commands\n    - Added info on talents\n- **Version 0.7** (_04 Nov 2019_)\n    - Added config disambiguation\n    - Added info on extra classes\n- **Version 0.5.1** (_3 Nov 2019_)\n    - Update for branch time-stop-2013\n- **Version 0.5** (_30 Oct 2019_)\n    - Markdown style fix\n- **Version 0.4** (_17 Oct 2019_)\n    - Added all extra info\n\n---------------------------------------\n"
  },
  {
    "path": "SQL/1_world_bot_appearance.sql",
    "content": "-- Handmade data, very sensitive\nDROP TABLE IF EXISTS `creature_template_npcbot_appearance`;\n\nCREATE TABLE `creature_template_npcbot_appearance` (\n  `entry` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,\n  `name*` char(16) DEFAULT 'unk' COMMENT 'unused',\n  `gender` tinyint(3) unsigned NOT NULL DEFAULT '0',\n  `skin` tinyint(3) unsigned NOT NULL DEFAULT '0',\n  `face` tinyint(3) unsigned NOT NULL DEFAULT '0',\n  `hair` tinyint(3) unsigned NOT NULL DEFAULT '0',\n  `haircolor` tinyint(3) unsigned NOT NULL DEFAULT '0',\n  `features` tinyint(3) unsigned NOT NULL DEFAULT '0',\n  PRIMARY KEY (`entry`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\ninsert into `creature_template_npcbot_appearance`(`entry`,`name*`,`gender`,`skin`,`face`,`hair`,`haircolor`,`features`)\nvalues\n(70001,'Llane',0,3,0,1,1,6),\n(70002,'Thran',0,0,0,4,5,4),\n(70003,'Lyria',1,3,4,6,4,0),\n(70004,'Ander',0,1,11,1,7,6),\n(70005,'Malosh',0,7,0,5,5,5),\n(70006,'Granis',0,0,2,9,4,4),\n(70007,'Kelstrum',0,5,4,2,2,2),\n(70008,'Dannal',0,1,0,8,5,0),\n(70009,'Austil',0,4,1,8,1,7),\n(70010,'Torm',0,7,1,2,0,2),\n(70011,'Sark',0,0,3,7,0,5),\n(70012,'Ker',1,4,0,0,0,1),\n(70013,'Harutt',0,1,3,7,0,4),\n(70014,'Krang',0,5,2,6,2,0),\n(70015,'Frang',0,0,4,1,1,3),\n(70016,'Tarshaw',0,3,3,1,0,7),\n(70017,'Grezz',0,3,5,1,0,3),\n(70018,'Sorek',0,2,1,3,1,6),\n(70019,'Zel\\'mak',0,1,0,4,8,1),\n(70020,'Alyissia',1,5,1,5,2,0),\n(70021,'Kyra',1,6,8,4,6,1),\n(70022,'Arias\\'ta',1,0,6,3,4,1),\n(70023,'Sildanair',1,3,0,2,4,2),\n(70024,'Chris',0,3,2,2,2,10),\n(70025,'Angela',1,2,7,3,8,6),\n(70026,'Baltus',0,0,0,1,8,1),\n(70027,'Kelv',0,5,1,7,3,1),\n(70028,'Bilban',0,2,2,2,7,1),\n(70029,'Wu',0,4,5,1,0,8),\n(70030,'Ilsa',1,5,6,7,3,4),\n(70031,'Darnath',0,7,8,3,0,0),\n(70032,'Evencane',0,5,9,2,4,2),\n(70033,'Kore',0,4,0,2,1,6),\n(70034,'Ahonan',0,6,1,1,6,5),\n(70035,'Behomat',0,4,8,3,6,3),\n(70036,'Ruada',1,1,2,1,6,0),\n(70037,'Kazi',1,1,2,3,3,0),\n(70038,'Kerra',1,2,0,2,2,0),\n(70051,'Sammuel',0,9,11,6,2,7),\n(70052,'Bromos',0,6,4,2,9,1),\n(70053,'Wilhelm',0,4,2,2,1,6),\n(70054,'Grayson',0,3,2,2,0,2),\n(70055,'Azar',0,2,4,3,1,6),\n(70056,'Valgar',0,4,3,0,0,0),\n(70057,'Beldruk',0,4,6,2,4,2),\n(70058,'Brandur',0,5,4,1,1,3),\n(70059,'Arthur',0,1,0,1,5,2),\n(70060,'Katherine',1,1,3,2,4,0),\n(70061,'Karman',0,3,11,10,5,8),\n(70062,'Jesthenis',0,4,0,0,0,0),\n(70063,'Noellene',1,0,1,1,1,0),\n(70064,'Aurelon',0,8,0,0,0,0),\n(70065,'Osselan',0,8,1,1,2,0),\n(70066,'Ithelis',0,9,2,2,2,0),\n(70067,'Bachi',0,3,0,10,1,0),\n(70068,'Baatun',0,6,4,3,0,7),\n(70069,'Kavaan',0,2,5,5,6,4),\n(70070,'Tullas',1,0,9,9,2,0),\n(70071,'Jol',1,0,8,8,6,0),\n(70072,'Cyssa',1,4,1,7,6,0),\n(70073,'Pyreanor',0,3,3,2,7,1),\n(70074,'Rukua',1,5,8,4,4,1),\n(70101,'Thorgas',0,4,5,8,4,8),\n(70102,'Ogromm',0,4,4,3,1,4),\n(70103,'Grif',0,0,1,5,4,4),\n(70104,'Kragg',0,7,4,3,2,2),\n(70105,'Kary',1,2,1,1,2,1),\n(70106,'Holt',0,18,3,4,0,3),\n(70107,'Urek',0,4,2,2,1,1),\n(70108,'Lanka',0,4,2,2,1,2),\n(70109,'Yaw',0,1,1,5,2,2),\n(70110,'Jen\\'shan',1,3,0,2,6,3),\n(70111,'Thotar',0,0,3,3,1,9),\n(70112,'Ormak',0,5,8,1,0,5),\n(70113,'Xor\\'juul',0,2,3,2,0,1),\n(70114,'Sian\\'dur',1,2,4,1,2,4),\n(70115,'Ayanna',1,5,0,6,5,8),\n(70116,'Dazalar',0,8,0,6,2,3),\n(70117,'Danlaar',0,0,0,3,6,0),\n(70118,'Jeen\\'ra',1,7,2,1,4,1),\n(70119,'Jocaste',1,6,1,1,6,1),\n(70120,'Dorion',0,4,6,5,0,5),\n(70121,'Daera',1,0,3,12,4,0),\n(70122,'Olmin',0,3,1,2,2,4),\n(70123,'Regnus',0,3,9,1,4,2),\n(70124,'Kaerbrus',0,2,0,0,2,2),\n(70125,'Einris',1,1,1,5,4,0),\n(70126,'Ulfir',0,6,2,5,8,1),\n(70127,'Thorfin',0,2,2,5,4,7),\n(70128,'Alenndaar',0,2,6,3,2,2),\n(70129,'Dargh',0,3,1,1,4,4),\n(70130,'Sallina',1,4,2,1,1,0),\n(70131,'Hannovia',1,0,2,2,1,0),\n(70132,'Keilnei',1,7,5,2,4,1),\n(70133,'Tana',1,8,1,1,2,0),\n(70134,'Oninath',0,0,0,0,0,0),\n(70135,'Zandine',1,8,0,1,4,0),\n(70136,'Deremiis',0,11,0,5,6,7),\n(70137,'Acteon',0,2,0,0,0,0),\n(70138,'Vord',0,11,0,5,6,7),\n(70139,'Killac',0,11,0,5,6,7),\n(70151,'Jorik',0,3,0,11,1,2),\n(70152,'Solm',0,7,8,4,9,6),\n(70153,'Keryn',1,4,4,7,0,0),\n(70154,'Osborne',0,4,9,9,0,1),\n(70155,'Hogral',0,6,7,10,5,7),\n(70156,'Ian',0,5,9,9,1,6),\n(70157,'David',0,4,2,1,1,1),\n(70158,'Marion',1,5,2,3,5,7),\n(70159,'Rwag',0,0,0,0,0,0),\n(70160,'Kaplak',0,3,5,0,0,3),\n(70161,'Gest',0,4,0,2,0,1),\n(70162,'Ormok',0,3,8,4,0,3),\n(70163,'Shenthul',0,3,0,5,5,1),\n(70164,'Frahun',0,2,1,3,5,4),\n(70165,'Jannok',0,3,2,4,5,3),\n(70166,'Syurna',1,0,3,5,4,0),\n(70167,'Erion',0,5,0,3,4,3),\n(70168,'Anishar',0,5,6,4,6,5),\n(70169,'Carolyn',1,0,6,3,1,7),\n(70170,'Miles',0,0,0,1,9,8),\n(70171,'Gregory',0,3,7,8,4,14),\n(70172,'Hulfdan',0,8,8,8,5,6),\n(70173,'Ormyr',0,0,6,4,4,4),\n(70174,'Fenthwick',0,0,2,2,5,0),\n(70175,'Fahrad',0,3,0,9,4,2),\n(70176,'Tony',0,3,0,1,0,2),\n(70177,'Kariel',0,1,0,0,0,0),\n(70178,'Tannaria',1,2,2,0,2,0),\n(70179,'Zelanis',0,0,1,1,1,0),\n(70180,'Elara',1,2,2,1,4,0),\n(70181,'Nerisen',0,1,1,2,1,0),\n(70201,'Anetta',1,0,9,14,5,0),\n(70202,'Laurena',1,0,1,4,5,0),\n(70203,'Josetta',1,1,3,17,2,0),\n(70204,'Branstock',0,2,7,1,8,0),\n(70205,'Maxan',0,2,0,6,1,5),\n(70206,'Duesten',0,0,9,5,1,0),\n(70207,'Beryl',0,0,0,0,0,12),\n(70208,'Miles',0,0,2,7,9,2),\n(70209,'Malakai',0,4,3,2,6,8),\n(70210,'Cobb',0,5,6,6,4,14),\n(70211,'Shanda',1,1,0,2,7,4),\n(70212,'Laurna',1,0,7,0,2,4),\n(70213,'Tai\\'jin',1,0,3,1,6,5),\n(70214,'Ken\\'jai',0,5,2,4,3,0),\n(70215,'Astarii',1,0,0,0,0,0),\n(70216,'Jandria',1,1,1,5,3,0),\n(70217,'Lariia',1,0,3,3,6,0),\n(70218,'Lankester',0,2,0,9,4,16),\n(70219,'Lazarus',0,0,0,6,6,14),\n(70220,'Theodrus',0,2,6,5,7,4),\n(70221,'Braenna',1,0,1,1,0,0),\n(70222,'Toldren',0,4,1,3,3,10),\n(70223,'Benjamin',0,9,11,0,0,8),\n(70224,'Joshua',0,3,0,1,1,8),\n(70225,'Zayus',0,2,0,3,1,4),\n(70226,'X\\'yera',0,2,1,2,4,4),\n(70227,'Ur\\'kyo',0,0,2,2,3,2),\n(70228,'Nara',1,0,7,4,1,3),\n(70229,'Alathea',1,4,3,0,4,5),\n(70230,'Rohan',0,0,9,4,7,5),\n(70231,'Arena',1,0,2,2,1,0),\n(70232,'Ponaris',0,1,0,1,2,0),\n(70233,'Zalduun',0,9,0,0,0,0),\n(70234,'Aldrae',0,3,1,1,1,0),\n(70235,'Lotheolan',0,8,8,1,2,0),\n(70236,'Belestra',1,4,0,1,3,0),\n(70237,'Caedmos',0,4,0,0,4,3),\n(70238,'Guvan',0,12,0,5,6,4),\n(70239,'Izmir',0,7,0,4,6,6),\n(70240,'Fallat',0,7,1,4,6,6),\n(70251,'Haromm',0,0,3,5,0,6),\n(70252,'Siln',1,10,1,3,2,1),\n(70253,'Tigor',0,13,2,2,2,1),\n(70254,'Beram',0,10,0,2,0,5),\n(70255,'Meela',1,8,1,3,0,0),\n(70256,'Narm',0,17,0,6,1,4),\n(70257,'Shikrik',1,3,4,5,1,1),\n(70258,'Swart',0,0,4,5,0,7),\n(70259,'Kardris',1,0,4,7,0,6),\n(70260,'Sian\\'tsu',1,3,3,3,1,3),\n(70261,'Sagorne',0,6,1,1,1,2),\n-- (70262,'Firmanvaar',0,0,0,1,0,0),\n-- (70263,'Nobundo',0,0,0,0,0,0),\n-- (70264,'Tuluun',0,0,0,0,0,0),\n(70265,'Sulaa',1,7,2,2,4,6),\n(70266,'Hobahken',0,0,0,0,0,0),\n(70267,'Umbrua',1,1,7,5,5,1),\n(70268,'Javad',0,4,1,6,0,1),\n(70301,'Khelden',0,7,5,7,0,5),\n(70302,'Zaldimar',0,2,10,11,9,3),\n(70303,'Maginor',0,1,9,8,7,4),\n(70304,'Marryk',0,0,4,6,7,1),\n(70305,'Magis',0,1,5,4,6,4),\n(70306,'Isabella',1,2,0,7,1,5),\n(70307,'Cain',0,0,0,7,1,10),\n(70308,'Shymm',0,5,6,6,5,12),\n(70309,'Ursyn',1,0,5,9,1,7),\n(70310,'Thurston',0,4,1,5,5,1),\n(70311,'Pierce',0,0,2,5,8,2),\n(70312,'Anastasia',1,2,7,3,8,5),\n(70313,'Bink',1,2,1,1,6,0),\n(70314,'Juli',1,1,5,5,3,0),\n(70315,'Nittlebur',0,0,4,0,7,6),\n(70316,'Jennea',1,5,4,5,4,4),\n(70317,'Un\\'Thuwa',0,1,2,1,3,4),\n(70318,'Pephredo',1,0,4,1,2,5),\n(70319,'Enyo',1,3,4,4,0,0),\n(70320,'Mai\\'ah',1,1,2,1,1,5),\n(70321,'Deino',1,2,0,3,3,2),\n(70322,'Uthel\\'nay',0,3,4,2,3,0),\n(70323,'Dink',0,1,3,2,6,1),\n(70324,'Julia',1,2,6,2,0,0),\n(70325,'Garridel',1,3,1,2,2,0),\n(70326,'Valaatu',1,9,6,7,6,5),\n(70327,'Zaedana',1,3,2,2,1,0),\n(70328,'Quithas',0,2,3,1,1,0),\n(70329,'Inethven',0,0,0,0,3,0),\n(70330,'Narinth',1,0,2,2,0,0),\n(70331,'Edirah',1,5,0,5,3,0),\n(70332,'Valustraa',1,5,5,9,6,5),\n(70333,'Semid',0,8,9,8,0,7),\n(70334,'Harnan',0,8,8,7,1,3),\n(70335,'Bati',1,8,1,2,1,0),\n(70336,'Derek',0,5,3,3,1,5),\n(70351,'Drusilla',1,0,10,4,0,0),\n(70352,'Alamar',0,2,2,3,2,5),\n(70353,'Demisette',1,0,9,2,0,0),\n(70354,'Maximillian',0,1,10,6,0,6),\n(70355,'Kartosh',0,0,7,0,1,6),\n(70356,'Maximillion',0,5,0,9,5,5),\n(70357,'Rupert',0,0,0,0,0,8),\n(70358,'Nartok',0,0,6,4,0,1),\n(70359,'Dhugru',0,5,6,4,3,9),\n(70360,'Grol\\'dar',0,3,2,3,1,2),\n(70361,'Mirket',1,5,3,7,0,5),\n(70362,'Zevrost',0,3,7,5,5,9),\n(70363,'Kaal',0,3,1,4,2,3),\n(70364,'Luther',0,4,9,0,0,0),\n(70365,'Richard',0,5,5,0,0,0),\n(70366,'Thistleheart',0,3,2,6,3,0),\n(70367,'Briarthorn',0,0,6,1,0,3),\n(70368,'Alexander',0,0,10,11,0,6),\n(70369,'Ursula',1,1,4,18,3,6),\n(70370,'Sandahl',0,4,2,11,1,6),\n(70371,'Gimrizz',0,2,5,2,0,3),\n(70372,'Teli\\'Larien',0,0,0,0,0,0),\n(70373,'Celoenus',0,0,0,2,0,0),\n(70374,'Alamma',0,0,1,0,0,0),\n(70375,'Talionia',1,0,2,1,2,0),\n(70376,'Zanien',0,0,0,0,3,0),\n(70377,'Babagaya',1,0,6,0,3,0),\n(70401,'Turak',0,4,3,5,0,5),\n(70402,'Sheal',1,7,0,3,1,1),\n(70403,'Kym',1,9,2,3,0,0),\n(70404,'Gart',0,13,1,3,2,2),\n(70405,'Gennia',1,9,3,0,1,3),\n(70406,'Mardant',0,1,1,2,0,4),\n(70407,'Kal',0,2,2,4,4,2),\n(70408,'Mathrengyl',0,5,0,2,6,3),\n(70409,'Denatharion',0,4,8,3,2,5),\n(70410,'Fylerian',0,2,1,4,5,0),\n(70411,'Sheldras',0,0,3,2,2,4),\n(70412,'Theridran',0,2,1,3,7,3),\n(70413,'Maldryn',0,2,8,5,4,0),\n(70414,'Jannos',0,5,3,2,1,5),\n(70415,'Golhine',0,0,2,6,0,4),\n(70416,'Loganaar',0,2,1,1,0,1),\n(70417,'Harene',1,6,0,3,2,4),\n(70418,'Shalannius',0,4,3,0,4,5),\n(70451,'Siouxsie',1,9,9,3,4,9),\n(70452,'Imhadria',1,10,8,6,1,0),\n(70453,'Vaelen',0,16,9,11,9,8),\n(70454,'Mynx',1,10,0,17,11,0),\n(70455,'Lankral',0,6,13,16,12,4),\n(70456,'Sliver',0,10,11,11,6,0),\n(70457,'Vereth',0,4,0,8,9,10),\n(70458,'Arly',1,7,9,2,8,4),\n(70459,'Setaal',1,14,12,15,9,2),\n(70460,'Uzo',0,8,7,8,9,18),\n(70461,'Illyrie',1,9,11,1,12,0),\n(70462,'Crok',0,11,9,10,7,3),\n(70463,'Zor\\'be',0,8,7,6,9,18),\n(70464,'Datura',1,10,11,11,18,0),\n(70465,'Stefan',0,10,12,6,12,2),\n-- (70551,'Gorkramato',0,0,14,9,7,5);\n(70555,'Detrae',0,3,12,11,19,4);\n"
  },
  {
    "path": "SQL/2_world_bot_extras.sql",
    "content": "DROP TABLE IF EXISTS `creature_template_npcbot_extras`;\n\nCREATE TABLE `creature_template_npcbot_extras` (\n  `entry` mediumint(8) unsigned NOT NULL,\n  `class` tinyint(3) unsigned NOT NULL DEFAULT '1',\n  `race` tinyint(3) unsigned NOT NULL DEFAULT '1',\n  PRIMARY KEY (`entry`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\nINSERT INTO `creature_template_npcbot_extras` (`entry`,`class`,`race`) VALUES\n('70001', '1', '1'),\n('70002', '1', '3'),\n('70003', '1', '1'),\n('70004', '1', '3'),\n('70005', '1', '2'),\n('70006', '1', '3'),\n('70007', '1', '3'),\n('70008', '1', '5'),\n('70009', '1', '5'),\n('70010', '1', '6'),\n('70011', '1', '6'),\n('70012', '1', '6'),\n('70013', '1', '6'),\n('70014', '1', '6'),\n('70015', '1', '2'),\n('70016', '1', '2'),\n('70017', '1', '2'),\n('70018', '1', '2'),\n('70019', '1', '8'),\n('70020', '1', '4'),\n('70021', '1', '4'),\n('70022', '1', '4'),\n('70023', '1', '4'),\n('70024', '1', '5'),\n('70025', '1', '5'),\n('70026', '1', '5'),\n('70027', '1', '3'),\n('70028', '1', '7'),\n('70029', '1', '1'),\n('70030', '1', '1'),\n('70031', '1', '4'),\n('70032', '1', '1'),\n('70033', '1', '11'),\n('70034', '1', '11'),\n('70035', '1', '11'),\n('70036', '1', '11'),\n('70037', '1', '11'),\n('70038', '1', '4'),\n('70051', '2', '1'),\n('70052', '2', '3'),\n('70053', '2', '1'),\n('70054', '2', '1'),\n('70055', '2', '3'),\n('70056', '2', '3'),\n('70057', '2', '3'),\n('70058', '2', '3'),\n('70059', '2', '1'),\n('70060', '2', '1'),\n('70061', '2', '1'),\n('70062', '2', '10'),\n('70063', '2', '10'),\n('70064', '2', '11'),\n('70065', '2', '10'),\n('70066', '2', '10'),\n('70067', '2', '10'),\n('70068', '2', '11'),\n('70069', '2', '11'),\n('70070', '2', '11'),\n('70071', '2', '11'),\n('70072', '2', '10'),\n('70073', '2', '10'),\n('70074', '2', '11'),\n('70101', '3', '3'),\n('70102', '3', '2'),\n('70103', '3', '3'),\n('70104', '3', '2'),\n('70105', '3', '6'),\n('70106', '3', '6'),\n('70107', '3', '6'),\n('70108', '3', '6'),\n('70109', '3', '6'),\n('70110', '3', '8'),\n('70111', '3', '2'),\n('70112', '3', '2'),\n('70113', '3', '8'),\n('70114', '3', '8'),\n('70115', '3', '4'),\n('70116', '3', '4'),\n('70117', '3', '4'),\n('70118', '3', '4'),\n('70119', '3', '4'),\n('70120', '3', '4'),\n('70121', '3', '3'),\n('70122', '3', '3'),\n('70123', '3', '3'),\n('70124', '3', '4'),\n('70125', '3', '3'),\n('70126', '3', '3'),\n('70127', '3', '3'),\n('70128', '3', '4'),\n('70129', '3', '3'),\n('70130', '3', '10'),\n('70131', '3', '10'),\n('70132', '3', '11'),\n('70133', '3', '10'),\n('70134', '3', '10'),\n('70135', '3', '11'),\n('70136', '3', '11'),\n('70137', '3', '11'),\n('70138', '3', '11'),\n('70139', '3', '11'),\n('70151', '4', '1'),\n('70152', '4', '3'),\n('70153', '4', '1'),\n('70154', '4', '1'),\n('70155', '4', '3'),\n('70156', '4', '1'),\n('70157', '4', '5'),\n('70158', '4', '5'),\n('70159', '4', '2'),\n('70160', '4', '2'),\n('70161', '4', '2'),\n('70162', '4', '2'),\n('70163', '4', '8'),\n('70164', '4', '4'),\n('70165', '4', '4'),\n('70166', '4', '4'),\n('70167', '4', '4'),\n('70168', '4', '4'),\n('70169', '4', '5'),\n('70170', '4', '5'),\n('70171', '4', '5'),\n('70172', '4', '3'),\n('70173', '4', '3'),\n('70174', '4', '7'),\n('70175', '4', '1'),\n('70176', '4', '1'),\n('70177', '4', '10'),\n('70178', '4', '10'),\n('70179', '4', '10'),\n('70180', '4', '10'),\n('70181', '4', '10'),\n('70201', '5', '1'),\n('70202', '5', '1'),\n('70203', '5', '1'),\n('70204', '5', '3'),\n('70205', '5', '3'),\n('70206', '5', '5'),\n('70207', '5', '5'),\n('70208', '5', '5'),\n('70209', '5', '5'),\n('70210', '5', '5'),\n('70211', '5', '4'),\n('70212', '5', '4'),\n('70213', '5', '8'),\n('70214', '5', '8'),\n('70215', '5', '4'),\n('70216', '5', '4'),\n('70217', '5', '4'),\n('70218', '5', '5'),\n('70219', '5', '5'),\n('70220', '5', '3'),\n('70221', '5', '3'),\n('70222', '5', '3'),\n('70223', '5', '1'),\n('70224', '5', '1'),\n('70225', '5', '8'),\n('70226', '5', '8'),\n('70227', '5', '8'),\n('70228', '5', '4'),\n('70229', '5', '4'),\n('70230', '5', '3'),\n('70231', '5', '10'),\n('70232', '5', '10'),\n('70233', '5', '11'),\n('70234', '5', '10'),\n('70235', '5', '10'),\n('70236', '5', '10'),\n('70237', '5', '11'),\n('70238', '5', '11'),\n('70239', '5', '11'),\n('70240', '5', '11'),\n('70251', '7', '2'),\n('70252', '7', '6'),\n('70253', '7', '6'),\n('70254', '7', '6'),\n('70255', '7', '6'),\n('70256', '7', '6'),\n('70257', '7', '2'),\n('70258', '7', '2'),\n('70259', '7', '2'),\n('70260', '7', '8'),\n('70261', '7', '6'),\n('70265', '7', '11'),\n('70267', '7', '11'),\n('70268', '7', '11'),\n('70301', '8', '1'),\n('70302', '8', '1'),\n('70303', '8', '1'),\n('70304', '8', '7'),\n('70305', '8', '7'),\n('70306', '8', '5'),\n('70307', '8', '5'),\n('70308', '8', '5'),\n('70309', '8', '5'),\n('70310', '8', '5'),\n('70311', '8', '5'),\n('70312', '8', '5'),\n('70313', '8', '7'),\n('70314', '8', '7'),\n('70315', '8', '7'),\n('70316', '8', '1'),\n('70317', '8', '8'),\n('70318', '8', '8'),\n('70319', '8', '8'),\n('70320', '8', '8'),\n('70321', '8', '8'),\n('70322', '8', '8'),\n('70323', '8', '7'),\n('70324', '8', '10'),\n('70325', '8', '10'),\n('70326', '8', '11'),\n('70327', '8', '10'),\n('70328', '8', '10'),\n('70329', '8', '10'),\n('70330', '8', '10'),\n('70331', '8', '11'),\n('70332', '8', '11'),\n('70333', '8', '11'),\n('70334', '8', '11'),\n('70335', '8', '11'),\n('70336', '8', '5'),\n('70351', '9', '1'),\n('70352', '9', '7'),\n('70353', '9', '1'),\n('70354', '9', '1'),\n('70355', '9', '2'),\n('70356', '9', '5'),\n('70357', '9', '5'),\n('70358', '9', '2'),\n('70359', '9', '2'),\n('70360', '9', '2'),\n('70361', '9', '2'),\n('70362', '9', '2'),\n('70363', '9', '2'),\n('70364', '9', '5'),\n('70365', '9', '5'),\n('70366', '9', '7'),\n('70367', '9', '7'),\n('70368', '9', '1'),\n('70369', '9', '1'),\n('70370', '9', '1'),\n('70371', '9', '7'),\n('70372', '9', '10'),\n('70373', '9', '10'),\n('70374', '9', '10'),\n('70375', '9', '10'),\n('70376', '9', '10'),\n('70377', '9', '7'),\n('70401', '11', '6'),\n('70402', '11', '6'),\n('70403', '11', '6'),\n('70404', '11', '6'),\n('70405', '11', '6'),\n('70406', '11', '4'),\n('70407', '11', '4'),\n('70408', '11', '4'),\n('70409', '11', '4'),\n('70410', '11', '4'),\n('70411', '11', '4'),\n('70412', '11', '4'),\n('70413', '11', '6'),\n('70414', '11', '6'),\n('70415', '11', '4'),\n('70416', '11', '4'),\n('70417', '11', '6'),\n('70418', '11', '4'),\n('70451', '6', '4'),\n('70452', '6', '10'),\n('70453', '6', '11'),\n('70454', '6', '10'),\n('70455', '6', '1'),\n('70456', '6', '10'),\n('70457', '6', '5'),\n('70458', '6', '7'),\n('70459', '6', '11'),\n('70460', '6', '8'),\n('70461', '6', '4'),\n('70462', '6', '2'),\n('70463', '6', '8'),\n('70464', '6', '10'),\n('70465', '6', '1'),\n('70501', '0', '0'),\n('70502', '0', '0'),\n('70503', '0', '0'),\n('70504', '0', '0'),\n('70505', '0', '0'),\n('70506', '0', '0'),\n('70507', '0', '0'),\n('70508', '0', '0'),\n('70509', '0', '0'),\n('70510', '0', '0'),\n('70511', '0', '0'),\n('70512', '0', '0'),\n('70513', '0', '0'),\n('70514', '0', '0'),\n('70515', '0', '0'),\n('70516', '0', '0'),\n('70517', '0', '0'),\n('70518', '0', '0'),\n('70519', '0', '0'),\n('70520', '0', '0'),\n('70521', '0', '0'),\n('70522', '0', '0'),\n('70523', '0', '0'),\n('70524', '0', '0'),\n('70525', '0', '0'),\n('70526', '0', '0'),\n('70527', '0', '0'),\n('70528', '0', '0'),\n('70529', '0', '0'),\n('70530', '0', '0'),\n('70531', '0', '0'),\n('70532', '0', '0'),\n('70533', '0', '0'),\n('70534', '0', '0'),\n('70535', '0', '0'),\n('70536', '0', '0'),\n('70537', '0', '0'),\n('70538', '0', '0'),\n('70542', '0', '0'),\n('70543', '0', '0'),\n('70544', '0', '0'),\n('70545', '0', '0'),\n('70551', '12', '15'),\n('70552', '12', '15'),\n('70553', '13', '15'),\n('70554', '13', '15'),\n('70555', '14', '1'),\n('70556', '0', '0'),\n('70557', '15', '15'),\n('70558', '15', '15'),\n('70559', '15', '15'),\n('70560', '15', '15'),\n('70561', '15', '15'),\n('70562', '0', '0'),\n('70563', '16', '15'),\n('70564', '16', '15'),\n('70565', '16', '15'),\n('70566', '16', '15'),\n('70567', '16', '15'),\n('70568', '17', '10'),\n('70569', '17', '10'),\n('70570', '17', '10'),\n('70571', '17', '10'),\n('70572', '17', '10'),\n('70573', '0', '15'),\n('70574', '0', '15');\n"
  },
  {
    "path": "SQL/3_world_bots.sql",
    "content": "-- GENERAL --\n\nSET @BOT_START = 70001;\nSET @BOT_END   = 71000;\n\n-- move to creature_template_movement InhabitType\n-- Resistance\n-- basevariance, rangevariance -- spell_school_immune_mask -- damage modifier, expirience modifier\n\n-- TOTAL BOT ENTRIES: 352 (348)\n\ndelete from `creature_template` where entry between @BOT_START and @BOT_END;\n\ninsert into `creature_template`\n(`entry`,`difficulty_entry_1`,`difficulty_entry_2`,`difficulty_entry_3`,`KillCredit1`,`KillCredit2`,\n`modelid1`,`modelid2`,`modelid3`,`modelid4`,`name`,`subname`,`IconName`,`gossip_menu_id`,`minlevel`,`maxlevel`,`exp`,\n`faction`,`npcflag`,`speed_walk`,`speed_run`,`scale`,`rank`,`dmgschool`,`BaseAttackTime`,`RangeAttackTime`,\n`unit_class`,`unit_flags`,`unit_flags2`,`dynamicflags`,`family`,`type`,`type_flags`,`lootid`,\n`pickpocketloot`,`skinloot`,`PetSpellDataId`,`VehicleId`,`mingold`,`maxgold`,`AIName`,`MovementType`,\n`HoverHeight`,`HealthModifier`,`ManaModifier`,`ArmorModifier`,`RacialLeader`,`movementId`,`RegenHealth`,\n`mechanic_immune_mask`,`flags_extra`,`ScriptName`,`VerifiedBuild`)\nvalues\n('70001','0','0','0','0','0','3343','0','0','0','Llane','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70002','0','0','0','0','0','3399','0','0','0','Thran','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70003','0','0','0','0','0','1300','0','0','0','Lyria','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70004','0','0','0','0','0','3431','0','0','0','Ander','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70005','0','0','0','0','0','4556','0','0','0','Malosh','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70006','0','0','0','0','0','3431','0','0','0','Granis','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70007','0','0','0','0','0','3053','0','0','0','Kelstrum','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70008','0','0','0','0','0','1578','0','0','0','Dannal','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70009','0','0','0','0','0','1599','0','0','0','Austil','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70010','0','0','0','0','0','2103','0','0','0','Torm','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70011','0','0','0','0','0','2096','0','0','0','Sark','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70012','0','0','0','0','0','2113','0','0','0','Ker','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70013','0','0','0','0','0','3793','0','0','0','Harutt','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70014','0','0','0','0','0','3794','0','0','0','Krang','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70015','0','0','0','0','0','1880','0','0','0','Frang','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70016','0','0','0','0','0','3743','0','0','0','Tarshaw','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70017','0','0','0','0','0','1374','0','0','0','Grezz','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70018','0','0','0','0','0','1375','0','0','0','Sorek','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70019','0','0','0','0','0','4242','0','0','0','Zel\\'mak','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70020','0','0','0','0','0','1721','0','0','0','Alyissia','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70021','0','0','0','0','0','1707','0','0','0','Kyra','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70022','0','0','0','0','0','2196','0','0','0','Arias\\'ta','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70023','0','0','0','0','0','2198','0','0','0','Sildanair','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70024','0','0','0','0','0','2620','0','0','0','Chris','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70025','0','0','0','0','0','2658','0','0','0','Angela','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70026','0','0','0','0','0','2614','0','0','0','Baltus','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70027','0','0','0','0','0','3054','0','0','0','Kelv','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70028','0','0','0','0','0','3055','0','0','0','Bilban','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70029','0','0','0','0','0','3280','0','0','0','Wu','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70030','0','0','0','0','0','3287','0','0','0','Ilsa','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70031','0','0','0','0','0','6071','0','0','0','Darnath','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70032','0','0','0','0','0','11037','0','0','0','Evencane','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70033','0','0','0','0','0','16226','0','0','0','Kore','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70034','0','0','0','0','0','17212','0','0','0','Ahonan','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70035','0','0','0','0','0','17213','0','0','0','Behomat','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70036','0','0','0','0','0','17215','0','0','0','Ruada','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70037','0','0','0','0','0','17214','0','0','0','Kazi','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n('70038','0','0','0','0','0','17211','0','0','0','Kerra','Warrior Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3400','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warrior_bot','-1'),\n-- 70039 - 70050 reserved for warriors\n('70051','0','0','0','0','0','3346','0','0','0','Sammuel','Paladin Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2300','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','paladin_bot','-1'),\n('70052','0','0','0','0','0','3393','0','0','0','Bromos','Paladin Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2300','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','paladin_bot','-1'),\n('70053','0','0','0','0','0','1299','0','0','0','Wilhelm','Paladin Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2300','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','paladin_bot','-1'),\n('70054','0','0','0','0','0','1499','0','0','0','Grayson','Paladin Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2300','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','paladin_bot','-1'),\n('70055','0','0','0','0','0','1622','0','0','0','Azar','Paladin Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2300','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','paladin_bot','-1'),\n('70056','0','0','0','0','0','3089','0','0','0','Valgar','Paladin Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2300','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','paladin_bot','-1'),\n('70057','0','0','0','0','0','3088','0','0','0','Beldruk','Paladin Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2300','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','paladin_bot','-1'),\n('70058','0','0','0','0','0','3087','0','0','0','Brandur','Paladin Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2300','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','paladin_bot','-1'),\n('70059','0','0','0','0','0','3284','0','0','0','Arthur','Paladin Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2300','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','paladin_bot','-1'),\n('70060','0','0','0','0','0','3289','0','0','0','Katherine','Paladin Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2300','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','paladin_bot','-1'),\n('70061','0','0','0','0','0','7356','0','0','0','Karman','Paladin Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2300','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','paladin_bot','-1'),\n('70062','0','0','0','0','0','15521','0','0','0','Jesthenis','Paladin Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2300','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','paladin_bot','-1'),\n('70063','0','0','0','0','0','16685','0','0','0','Noellene','Paladin Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2300','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','paladin_bot','-1'),\n('70064','0','0','0','0','0','16224','0','0','0','Aurelon','Paladin Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2300','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','paladin_bot','-1'),\n('70065','0','0','0','0','0','16815','0','0','0','Osselan','Paladin Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2300','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','paladin_bot','-1'),\n('70066','0','0','0','0','0','16811','0','0','0','Ithelis','Paladin Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2300','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','paladin_bot','-1'),\n('70067','0','0','0','0','0','16829','0','0','0','Bachi','Paladin Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2300','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','paladin_bot','-1'),\n('70068','0','0','0','0','0','17225','0','0','0','Baatun','Paladin Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2300','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','paladin_bot','-1'),\n('70069','0','0','0','0','0','17227','0','0','0','Kavaan','Paladin Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2300','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','paladin_bot','-1'),\n('70070','0','0','0','0','0','17234','0','0','0','Tullas','Paladin Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2300','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','paladin_bot','-1'),\n('70071','0','0','0','0','0','17226','0','0','0','Jol','Paladin Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2300','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','paladin_bot','-1'),\n('70072','0','0','0','0','0','19596','0','0','0','Cyssa','Paladin Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2300','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','paladin_bot','-1'),\n('70073','0','0','0','0','0','21264','0','0','0','Pyreanor','Paladin Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2300','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','paladin_bot','-1'),\n('70074','0','0','0','0','0','29735','0','0','0','Rukua','Paladin Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2300','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','paladin_bot','-1'),\n-- 70075 - 70100 reserved for paldins\n('70101','0','0','0','0','0','3395','0','0','0','Thorgas','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70102','0','0','0','0','0','4560','0','0','0','Ogromm','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70103','0','0','0','0','0','3558','0','0','0','Grif','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70104','0','0','0','0','0','4372','0','0','0','Kragg','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70105','0','0','0','0','0','2112','0','0','0','Kary','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70106','0','0','0','0','0','2087','0','0','0','Holt','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70107','0','0','0','0','0','2105','0','0','0','Urek','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70108','0','0','0','0','0','3810','0','0','0','Lanka','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70109','0','0','0','0','0','3811','0','0','0','Yaw','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70110','0','0','0','0','0','1882','0','0','0','Jen\\'shan','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70111','0','0','0','0','0','3744','0','0','0','Thotar','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70112','0','0','0','0','0','1373','0','0','0','Ormak','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70113','0','0','0','0','0','4239','0','0','0','Xor\\'juul','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70114','0','0','0','0','0','4241','0','0','0','Sian\\'dur','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70115','0','0','0','0','0','1723','0','0','0','Ayanna','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70116','0','0','0','0','0','1703','0','0','0','Dazalar','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70117','0','0','0','0','0','2066','0','0','0','Danlaar','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70118','0','0','0','0','0','2205','0','0','0','Jeen\\'ra','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70119','0','0','0','0','0','2206','0','0','0','Jocaste','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70120','0','0','0','0','0','2251','0','0','0','Dorion','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70121','0','0','0','0','0','3056','0','0','0','Daera','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70122','0','0','0','0','0','3072','0','0','0','Olmin','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70123','0','0','0','0','0','3073','0','0','0','Regnus','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70124','0','0','0','0','0','3299','0','0','0','Kaerbrus','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70125','0','0','0','0','0','3312','0','0','0','Einris','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70126','0','0','0','0','0','3309','0','0','0','Ulfir','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70127','0','0','0','0','0','3310','0','0','0','Thorfin','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70128','0','0','0','0','0','7538','0','0','0','Alenndaar','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70129','0','0','0','0','0','10245','0','0','0','Dargh','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70130','0','0','0','0','0','15520','0','0','0','Sallina','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70131','0','0','0','0','0','16681','0','0','0','Hannovia','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70132','0','0','0','0','0','16222','0','0','0','Keilnei','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70133','0','0','0','0','0','16778','0','0','0','Tana','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70134','0','0','0','0','0','16816','0','0','0','Oninath','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70135','0','0','0','0','0','16802','0','0','0','Zandine','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70136','0','0','0','0','0','17434','0','0','0','Deremiis','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70137','0','0','0','0','0','16860','0','0','0','Acteon','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70138','0','0','0','0','0','17511','0','0','0','Vord','Hunter Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n('70139','0','0','0','0','0','17488','0','0','0','Killac','Hunter bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2800','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','hunter_bot','-1'),\n-- 70140 - 70150 reserved for hunters\n('70151','0','0','0','0','0','3351','0','0','0','Jorik','Rogue Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','1600','2000','4','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','rogue_bot','-1'),\n('70152','0','0','0','0','0','3407','0','0','0','Solm','Rogue Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','1600','2000','4','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','rogue_bot','-1'),\n('70153','0','0','0','0','0','1297','0','0','0','Keryn','Rogue Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','1600','2000','4','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','rogue_bot','-1'),\n('70154','0','0','0','0','0','1507','0','0','0','Osborne','Rogue Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','1600','2000','4','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','rogue_bot','-1'),\n('70155','0','0','0','0','0','3436','0','0','0','Hogral','Rogue Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','1600','2000','4','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','rogue_bot','-1'),\n('70156','0','0','0','0','0','5146','0','0','0','Ian','Rogue Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','1600','2000','4','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','rogue_bot','-1'),\n('70157','0','0','0','0','0','1580','0','0','0','David','Rogue Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','1600','2000','4','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','rogue_bot','-1'),\n('70158','0','0','0','0','0','2130','0','0','0','Marion','Rogue Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','1600','2000','4','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','rogue_bot','-1'),\n('70159','0','0','0','0','0','1886','0','0','0','Rwag','Rogue Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','1600','2000','4','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','rogue_bot','-1'),\n('70160','0','0','0','0','0','3749','0','0','0','Kaplak','Rogue Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','1600','2000','4','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','rogue_bot','-1'),\n('70161','0','0','0','0','0','1327','0','0','0','Gest','Rogue Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','1600','2000','4','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','rogue_bot','-1'),\n('70162','0','0','0','0','0','1328','0','0','0','Ormok','Rogue Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','1600','2000','4','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','rogue_bot','-1'),\n('70163','0','0','0','0','0','4360','0','0','0','Shenthul','Rogue Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','1600','2000','4','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','rogue_bot','-1'),\n('70164','0','0','0','0','0','1725','0','0','0','Frahun','Rogue Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','1600','2000','4','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','rogue_bot','-1'),\n('70165','0','0','0','0','0','1704','0','0','0','Jannok','Rogue Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','1600','2000','4','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','rogue_bot','-1'),\n('70166','0','0','0','0','0','2231','0','0','0','Syurna','Rogue Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','1600','2000','4','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','rogue_bot','-1'),\n('70167','0','0','0','0','0','2252','0','0','0','Erion','Rogue Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','1600','2000','4','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','rogue_bot','-1'),\n('70168','0','0','0','0','0','2243','0','0','0','Anishar','Rogue Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','1600','2000','4','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','rogue_bot','-1'),\n('70169','0','0','0','0','0','2659','0','0','0','Carolyn','Rogue Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','1600','2000','4','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','rogue_bot','-1'),\n('70170','0','0','0','0','0','2639','0','0','0','Miles','Rogue Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','1600','2000','4','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','rogue_bot','-1'),\n('70171','0','0','0','0','0','2631','0','0','0','Gregory','Rogue Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','1600','2000','4','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','rogue_bot','-1'),\n('70172','0','0','0','0','0','3101','0','0','0','Hulfdan','Rogue Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','1600','2000','4','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','rogue_bot','-1'),\n('70173','0','0','0','0','0','3100','0','0','0','Ormyr','Rogue Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','1600','2000','4','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','rogue_bot','-1'),\n('70174','0','0','0','0','0','3113','0','0','0','Fenthwick','Rogue Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','1600','2000','4','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','rogue_bot','-1'),\n('70175','0','0','0','0','0','5528','0','0','0','Fahrad','Rogue Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','1600','2000','4','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','rogue_bot','-1'),\n('70176','0','0','0','0','0','13171','0','0','0','Tony','Rogue Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','1600','2000','4','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','rogue_bot','-1'),\n('70177','0','0','0','0','0','15519','0','0','0','Kariel','Rogue Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','1600','2000','4','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','rogue_bot','-1'),\n('70178','0','0','0','0','0','16689','0','0','0','Tannaria','Rogue Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','1600','2000','4','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','rogue_bot','-1'),\n('70179','0','0','0','0','0','16767','0','0','0','Zelanis','Rogue Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','1600','2000','4','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','rogue_bot','-1'),\n('70180','0','0','0','0','0','16798','0','0','0','Elara','Rogue Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','1600','2000','4','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','rogue_bot','-1'),\n('70181','0','0','0','0','0','16818','0','0','0','Nerisen','Rogue Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','1600','2000','4','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','rogue_bot','-1'),\n-- 70182 - 70200 reserved for rogues\n('70201','0','0','0','0','0','3344','0','0','0','Anetta','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70202','0','0','0','0','0','1495','0','0','0','Laurena','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70203','0','0','0','0','0','1295','0','0','0','Josetta','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70204','0','0','0','0','0','3401','0','0','0','Branstock','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70205','0','0','0','0','0','3429','0','0','0','Maxan','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70206','0','0','0','0','0','1579','0','0','0','Duesten','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70207','0','0','0','0','0','1602','0','0','0','Beryl','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70208','0','0','0','0','0','2139','0','0','0','Miles','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70209','0','0','0','0','0','2138','0','0','0','Malakai','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70210','0','0','0','0','0','2137','0','0','0','Cobb','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70211','0','0','0','0','0','1733','0','0','0','Shanda','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70212','0','0','0','0','0','1708','0','0','0','Laurna','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70213','0','0','0','0','0','1897','0','0','0','Tai\\'jin','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70214','0','0','0','0','0','4068','0','0','0','Ken\\'jai','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70215','0','0','0','0','0','2200','0','0','0','Astarii','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70216','0','0','0','0','0','2201','0','0','0','Jandria','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70217','0','0','0','0','0','2202','0','0','0','Lariia','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70218','0','0','0','0','0','2626','0','0','0','Lankester','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70219','0','0','0','0','0','2618','0','0','0','Lazarus','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70220','0','0','0','0','0','3086','0','0','0','Theodrus','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70221','0','0','0','0','0','3066','0','0','0','Braenna','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70222','0','0','0','0','0','3085','0','0','0','Toldren','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70223','0','0','0','0','0','3282','0','0','0','Benjamin','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70224','0','0','0','0','0','3283','0','0','0','Joshua','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70225','0','0','0','0','0','4690','0','0','0','Zayus','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70226','0','0','0','0','0','10473','0','0','0','X\\'yera','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70227','0','0','0','0','0','4711','0','0','0','Ur\\'kyo','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70228','0','0','0','0','0','11044','0','0','0','Nara','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70229','0','0','0','0','0','11048','0','0','0','Alathea','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70230','0','0','0','0','0','11053','0','0','0','Rohan','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70231','0','0','0','0','0','15518','0','0','0','Arena','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70232','0','0','0','0','0','16707','0','0','0','Ponaris','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70233','0','0','0','0','0','16225','0','0','0','Zalduun','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70234','0','0','0','0','0','16788','0','0','0','Aldrae','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70235','0','0','0','0','0','16817','0','0','0','Lotheolan','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70236','0','0','0','0','0','16795','0','0','0','Belestra','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70237','0','0','0','0','0','17247','0','0','0','Caedmos','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70238','0','0','0','0','0','17232','0','0','0','Guvan','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70239','0','0','0','0','0','17249','0','0','0','Izmir','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n('70240','0','0','0','0','0','17248','0','0','0','Fallat','Priest Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3600','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','priest_bot','-1'),\n-- 70241 - 70250 reserved for priests\n('70251','0','0','0','0','0','4552','0','0','0','Haromm','Shaman Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2600','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','shaman_bot','-1'),\n('70252','0','0','0','0','0','2123','0','0','0','Siln','Shaman Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2600','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','shaman_bot','-1'),\n('70253','0','0','0','0','0','2102','0','0','0','Tigor','Shaman Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2600','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','shaman_bot','-1'),\n('70254','0','0','0','0','0','2082','0','0','0','Beram','Shaman Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2600','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','shaman_bot','-1'),\n('70255','0','0','0','0','0','10180','0','0','0','Meela','Shaman Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2600','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','shaman_bot','-1'),\n('70256','0','0','0','0','0','3816','0','0','0','Narm','Shaman Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2600','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','shaman_bot','-1'),\n('70257','0','0','0','0','0','1878','0','0','0','Shikrik','Shaman Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2600','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','shaman_bot','-1'),\n('70258','0','0','0','0','0','3746','0','0','0','Swart','Shaman Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2600','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','shaman_bot','-1'),\n('70259','0','0','0','0','0','1360','0','0','0','Kardris','Shaman Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2600','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','shaman_bot','-1'),\n('70260','0','0','0','0','0','4231','0','0','0','Sian\\'tsu','Shaman Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2600','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','shaman_bot','-1'),\n('70261','0','0','0','0','0','13341','0','0','0','Sagorne','Shaman Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2600','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','shaman_bot','-1'),\n-- ('70262','0','0','0','0','0','17598','0','0','0','Firmanvaar','Shaman Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2600','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','shaman_bot','-1'),\n-- ('70263','0','0','0','0','0','17600','0','0','0','Nobundo','Shaman Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2600','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','shaman_bot','-1'),\n-- ('70264','0','0','0','0','0','17599','0','0','0','Tuluun','Shaman Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2600','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','shaman_bot','-1'),\n('70265','0','0','0','0','0','16914','0','0','0','Sulaa','Shaman Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2600','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','shaman_bot','-1'),\n-- ('70266','0','0','0','0','0','17792','0','0','0','Hobahken','Shaman Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2600','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','shaman_bot','-1'),\n('70267','0','0','0','0','0','19598','0','0','0','Umbrua','Shaman Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2600','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','shaman_bot','-1'),\n('70268','0','0','0','0','0','21265','0','0','0','Javad','Shaman Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2600','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','shaman_bot','-1'),\n-- 70269 - 70300 reserved for shamans\n('70301','0','0','0','0','0','5001','0','0','0','Khelden','Mage Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3800','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','mage_bot','-1'),\n('70302','0','0','0','0','0','1294','0','0','0','Zaldimar','Mage Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3800','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','mage_bot','-1'),\n('70303','0','0','0','0','0','1484','0','0','0','Maginor','Mage Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3800','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','mage_bot','-1'),\n('70304','0','0','0','0','0','10216','0','0','0','Marryk','Mage Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3800','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','mage_bot','-1'),\n('70305','0','0','0','0','0','10215','0','0','0','Magis','Mage Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3800','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','mage_bot','-1'),\n('70306','0','0','0','0','0','1592','0','0','0','Isabella','Mage Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3800','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','mage_bot','-1'),\n('70307','0','0','0','0','0','1600','0','0','0','Cain','Mage Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3800','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','mage_bot','-1'),\n('70308','0','0','0','0','0','2134','0','0','0','Shymm','Mage Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3800','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','mage_bot','-1'),\n('70309','0','0','0','0','0','6058','0','0','0','Ursyn','Mage Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3800','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','mage_bot','-1'),\n('70310','0','0','0','0','0','2135','0','0','0','Thurston','Mage Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3800','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','mage_bot','-1'),\n('70311','0','0','0','0','0','2644','0','0','0','Pierce','Mage Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3800','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','mage_bot','-1'),\n('70312','0','0','0','0','0','2657','0','0','0','Anastasia','Mage Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3800','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','mage_bot','-1'),\n('70313','0','0','0','0','0','3108','0','0','0','Bink','Mage Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3800','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','mage_bot','-1'),\n('70314','0','0','0','0','0','10214','0','0','0','Juli','Mage Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3800','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','mage_bot','-1'),\n('70315','0','0','0','0','0','3109','0','0','0','Nittlebur','Mage Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3800','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','mage_bot','-1'),\n('70316','0','0','0','0','0','3292','0','0','0','Jennea','Mage Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3800','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','mage_bot','-1'),\n('70317','0','0','0','0','0','10171','0','0','0','Un\\'Thuwa','Mage Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3800','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','mage_bot','-1'),\n('70318','0','0','0','0','0','4524','0','0','0','Pephredo','Mage Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3800','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','mage_bot','-1'),\n('70319','0','0','0','0','0','4522','0','0','0','Enyo','Mage Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3800','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','mage_bot','-1'),\n('70320','0','0','0','0','0','4526','0','0','0','Mai\\'ah','Mage Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3800','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','mage_bot','-1'),\n('70321','0','0','0','0','0','4523','0','0','0','Deino','Mage Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3800','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','mage_bot','-1'),\n('70322','0','0','0','0','0','6060','0','0','0','Uthel\\'nay','Mage Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3800','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','mage_bot','-1'),\n('70323','0','0','0','0','0','6072','0','0','0','Dink','Mage Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3800','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','mage_bot','-1'),\n('70324','0','0','0','0','0','15522','0','0','0','Julia','Mage Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3800','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','mage_bot','-1'),\n('70325','0','0','0','0','0','16680','0','0','0','Garridel','Mage Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3800','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','mage_bot','-1'),\n('70326','0','0','0','0','0','16223','0','0','0','Valaatu','Mage Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3800','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','mage_bot','-1'),\n('70327','0','0','0','0','0','16781','0','0','0','Zaedana','Mage Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3800','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','mage_bot','-1'),\n('70328','0','0','0','0','0','16824','0','0','0','Quithas','Mage Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3800','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','mage_bot','-1'),\n('70329','0','0','0','0','0','16809','0','0','0','Inethven','Mage Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3800','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','mage_bot','-1'),\n('70330','0','0','0','0','0','16777','0','0','0','Narinth','Mage Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3800','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','mage_bot','-1'),\n('70331','0','0','0','0','0','17242','0','0','0','Edirah','Mage Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3800','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','mage_bot','-1'),\n('70332','0','0','0','0','0','16856','0','0','0','Valustraa','Mage Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3800','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','mage_bot','-1'),\n('70333','0','0','0','0','0','17233','0','0','0','Semid','Mage Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3800','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','mage_bot','-1'),\n('70334','0','0','0','0','0','17243','0','0','0','Harnan','Mage Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3800','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','mage_bot','-1'),\n('70335','0','0','0','0','0','17241','0','0','0','Bati','Mage Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3800','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','mage_bot','-1'),\n('70336','0','0','0','0','0','11466','0','0','0','Derek','Mage Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3800','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','mage_bot','-1'),\n-- 70337 - 70350 reserved for mages\n('70351','0','0','0','0','0','3345','0','0','0','Drusilla','Warlock Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3500','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warlock_bot','-1'),\n('70352','0','0','0','0','0','1930','0','0','0','Alamar','Warlock Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3500','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warlock_bot','-1'),\n('70353','0','0','0','0','0','1469','0','0','0','Demisette','Warlock Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3500','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warlock_bot','-1'),\n('70354','0','0','0','0','0','3271','0','0','0','Maximillian','Warlock Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3500','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warlock_bot','-1'),\n('70355','0','0','0','0','0','4567','0','0','0','Kartosh','Warlock Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3500','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warlock_bot','-1'),\n('70356','0','0','0','0','0','1581','0','0','0','Maximillion','Warlock Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3500','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warlock_bot','-1'),\n('70357','0','0','0','0','0','1604','0','0','0','Rupert','Warlock Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3500','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warlock_bot','-1'),\n('70358','0','0','0','0','0','1884','0','0','0','Nartok','Warlock Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3500','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warlock_bot','-1'),\n('70359','0','0','0','0','0','3745','0','0','0','Dhugru','Warlock Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3500','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warlock_bot','-1'),\n('70360','0','0','0','0','0','1324','0','0','0','Grol\\'dar','Warlock Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3500','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warlock_bot','-1'),\n('70361','0','0','0','0','0','1325','0','0','0','Mirket','Warlock Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3500','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warlock_bot','-1'),\n('70362','0','0','0','0','0','1326','0','0','0','Zevrost','Warlock Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3500','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warlock_bot','-1'),\n('70363','0','0','0','0','0','2675','0','0','0','Kaal','Warlock Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3500','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warlock_bot','-1'),\n('70364','0','0','0','0','0','2637','0','0','0','Luther','Warlock Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3500','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warlock_bot','-1'),\n('70365','0','0','0','0','0','2646','0','0','0','Richard','Warlock Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3500','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warlock_bot','-1'),\n('70366','0','0','0','0','0','3115','0','0','0','Thistleheart','Warlock Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3500','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warlock_bot','-1'),\n('70367','0','0','0','0','0','3116','0','0','0','Briarthorn','Warlock Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3500','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warlock_bot','-1'),\n('70368','0','0','0','0','0','3122','0','0','0','Alexander','Warlock Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3500','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warlock_bot','-1'),\n('70369','0','0','0','0','0','3291','0','0','0','Ursula','Warlock Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3500','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warlock_bot','-1'),\n('70370','0','0','0','0','0','3286','0','0','0','Sandahl','Warlock Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3500','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warlock_bot','-1'),\n('70371','0','0','0','0','0','3607','0','0','0','Gimrizz','Warlock Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3500','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warlock_bot','-1'),\n('70372','0','0','0','0','0','15524','0','0','0','Teli\\'Larien','Warlock Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3500','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warlock_bot','-1'),\n('70373','0','0','0','0','0','16700','0','0','0','Celoenus','Warlock Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3500','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warlock_bot','-1'),\n('70374','0','0','0','0','0','16787','0','0','0','Alamma','Warlock Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3500','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warlock_bot','-1'),\n('70375','0','0','0','0','0','16800','0','0','0','Talionia','Warlock Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3500','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warlock_bot','-1'),\n('70376','0','0','0','0','0','16831','0','0','0','Zanien','Warlock Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3500','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warlock_bot','-1'),\n('70377','0','0','0','0','0','21604','0','0','0','Babagaya','Warlock Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3500','2000','8','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','warlock_bot','-1'),\n-- 70378 - 70400 reserved for warlocks\n('70401','0','0','0','0','0','2106','0','0','0','Turak','Druid Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2200','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','druid_bot','-1'),\n('70402','0','0','0','0','0','2121','0','0','0','Sheal','Druid Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2200','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','druid_bot','-1'),\n('70403','0','0','0','0','0','2115','0','0','0','Kym','Druid Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2200','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','druid_bot','-1'),\n('70404','0','0','0','0','0','3819','0','0','0','Gart','Druid Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2200','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','druid_bot','-1'),\n('70405','0','0','0','0','0','10734','0','0','0','Gennia','Druid Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2200','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','druid_bot','-1'),\n('70406','0','0','0','0','0','1732','0','0','0','Mardant','Druid Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2200','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','druid_bot','-1'),\n('70407','0','0','0','0','0','1706','0','0','0','Kal','Druid Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2200','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','druid_bot','-1'),\n('70408','0','0','0','0','0','2261','0','0','0','Mathrengyl','Druid Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2200','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','druid_bot','-1'),\n('70409','0','0','0','0','0','2250','0','0','0','Denatharion','Druid Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2200','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','druid_bot','-1'),\n('70410','0','0','0','0','0','2255','0','0','0','Fylerian','Druid Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2200','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','druid_bot','-1'),\n('70411','0','0','0','0','0','3300','0','0','0','Sheldras','Druid Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2200','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','druid_bot','-1'),\n('70412','0','0','0','0','0','3301','0','0','0','Theridran','Druid Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2200','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','druid_bot','-1'),\n('70413','0','0','0','0','0','3302','0','0','0','Maldryn','Druid Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2200','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','druid_bot','-1'),\n('70414','0','0','0','0','0','7357','0','0','0','Jannos','Druid Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2200','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','druid_bot','-1'),\n('70415','0','0','0','0','0','10738','0','0','0','Golhine','Druid Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2200','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','druid_bot','-1'),\n('70416','0','0','0','0','0','12053','0','0','0','Loganaar','Druid Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2200','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','druid_bot','-1'),\n('70417','0','0','0','0','0','16739','0','0','0','Harene','Druid Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2200','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','druid_bot','-1'),\n('70418','0','0','0','0','0','16858','0','0','0','Shalannius','Druid Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','2200','2000','2','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','druid_bot','-1'),\n-- 70419 - 70450 reserved for druids\n('70451','0','0','0','0','0','24935','0','0','0','Siouxsie','Death Knight Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3300','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','death_knight_bot','-1'),\n('70452','0','0','0','0','0','26939','0','0','0','Imhadria','Death Knight Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3300','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','death_knight_bot','-1'),\n('70453','0','0','0','0','0','26854','0','0','0','Vaelen','Death Knight Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3300','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','death_knight_bot','-1'),\n('70454','0','0','0','0','0','28039','0','0','0','Mynx','Death Knight Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3300','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','death_knight_bot','-1'),\n('70455','0','0','0','0','0','26688','0','0','0','Lankral','Death Knight Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3300','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','death_knight_bot','-1'),\n('70456','0','0','0','0','0','26195','0','0','0','Sliver','Death Knight Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3300','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','death_knight_bot','-1'),\n('70457','0','0','0','0','0','27402','0','0','0','Vereth','Death Knight Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3300','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','death_knight_bot','-1'),\n('70458','0','0','0','0','0','27189','0','0','0','Arly','Death Knight Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3300','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','death_knight_bot','-1'),\n('70459','0','0','0','0','0','26217','0','0','0','Setaal','Death Knight Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3300','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','death_knight_bot','-1'),\n('70460','0','0','0','0','0','26222','0','0','0','Uzo','Death Knight Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3300','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','death_knight_bot','-1'),\n('70461','0','0','0','0','0','28842','0','0','0','Illyrie','Death Knight Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3300','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','death_knight_bot','-1'),\n('70462','0','0','0','0','0','28837','0','0','0','Crok','Death Knight Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3300','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','death_knight_bot','-1'),\n('70463','0','0','0','0','0','28840','0','0','0','Zor\\'be','Death Knight Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3300','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','death_knight_bot','-1'),\n('70464','0','0','0','0','0','25512','0','0','0','Datura','Death Knight Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3300','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','death_knight_bot','-1'),\n('70465','0','0','0','0','0','25500','0','0','0','Stefan','Death Knight Bot','','0','80','80','2','35','1','1.1','1.1','1','0','0','3300','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','death_knight_bot','-1'),\n-- 70466 - 70500 reserved for deathknights\n('70501','0','0','0','0','0','4449','0','0','0','Imp',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','8','0','0','0','0','3','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','1','135266416','warlock_pet_bot','-1'),\n('70502','0','0','0','0','0','1132','0','0','0','Voidwalker',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','8','0','0','0','0','3','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','1','135266416','warlock_pet_bot','-1'),\n('70503','0','0','0','0','0','4162','0','0','0','Succubus',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','8','0','0','0','0','3','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','1','135266416','warlock_pet_bot','-1'),\n('70504','0','0','0','0','0','850','0','0','0','Felhunter',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','8','0','0','0','0','3','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','1','135266416','warlock_pet_bot','-1'),\n('70505','0','0','0','0','0','14255','0','0','0','Felguard',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','8','0','0','0','0','3','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','1','135266416','warlock_pet_bot','-1'),\n('70506','0','0','0','0','0','368','0','0','0','Spider',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','1','0','0','0','0','1','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','hunter_pet_bot','-1'),\n('70507','0','0','0','0','0','4312','0','0','0','Serpent',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','1','0','0','0','0','1','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','hunter_pet_bot','-1'),\n('70508','0','0','0','0','0','16724','0','0','0','Bird of Prey',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','1','0','0','0','0','1','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','hunter_pet_bot','-1'),\n('70509','0','0','0','0','0','8808','0','0','0','Bat',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','1','0','0','0','0','1','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','hunter_pet_bot','-1'),\n('70510','0','0','0','0','0','17562','0','0','0','Wind Serpent',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','1','0','0','0','0','1','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','hunter_pet_bot','-1'),\n('70511','0','0','0','0','0','20308','0','0','0','Ravager',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','1','0','0','0','0','1','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','hunter_pet_bot','-1'),\n('70512','0','0','0','0','0','17545','0','0','0','Dragonhawk',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','1','0','0','0','0','1','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','hunter_pet_bot','-1'),\n('70513','0','0','0','0','0','19405','0','0','0','Nether Ray',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','1','0','0','0','0','1','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','hunter_pet_bot','-1'),\n('70514','0','0','0','0','0','17753','0','0','0','Sporebat',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','1','0','0','0','0','1','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','hunter_pet_bot','-1'),\n('70515','0','0','0','0','0','15590','0','0','0','Carrion Bird',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','1','0','0','0','0','1','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','hunter_pet_bot','-1'),\n('70516','0','0','0','0','0','11319','0','0','0','Raptor',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','1','0','0','0','0','1','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','hunter_pet_bot','-1'),\n('70517','0','0','0','0','0','741','0','0','0','Wolf',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','1','0','0','0','0','1','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','hunter_pet_bot','-1'),\n('70518','0','0','0','0','0','1220','0','0','0','Tallstrider',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','1','0','0','0','0','1','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','hunter_pet_bot','-1'),\n('70519','0','0','0','0','0','321','0','0','0','Cat',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','1','0','0','0','0','1','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','hunter_pet_bot','-1'),\n('70520','0','0','0','0','0','2714','0','0','0','Hyena',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','1','0','0','0','0','1','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','hunter_pet_bot','-1'),\n('70521','0','0','0','0','0','29113','0','0','0','Wasp',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','1','0','0','0','0','1','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','hunter_pet_bot','-1'),\n('70522','0','0','0','0','0','17798','0','0','0','Teromoth',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','1','0','0','0','0','1','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','hunter_pet_bot','-1'),\n('70523','0','0','0','0','0','20790','0','0','0','Scorpid',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','1','0','0','0','0','1','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','hunter_pet_bot','-1'),\n('70524','0','0','0','0','0','1244','0','0','0','Turtle',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','1','0','0','0','0','1','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','hunter_pet_bot','-1'),\n('70525','0','0','0','0','0','809','0','0','0','Gorilla',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','1','0','0','0','0','1','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','hunter_pet_bot','-1'),\n('70526','0','0','0','0','0','706','0','0','0','Bear',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','1','0','0','0','0','1','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','hunter_pet_bot','-1'),\n('70527','0','0','0','0','0','381','0','0','0','Boar',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','1','0','0','0','0','1','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','hunter_pet_bot','-1'),\n('70528','0','0','0','0','0','1938','0','0','0','Crab',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','1','0','0','0','0','1','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','hunter_pet_bot','-1'),\n('70529','0','0','0','0','0','1250','0','0','0','Crocolisk',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','1','0','0','0','0','1','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','hunter_pet_bot','-1'),\n('70530','0','0','0','0','0','19998','0','0','0','Warp Stalker',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','1','0','0','0','0','1','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','hunter_pet_bot','-1'),\n('70531','0','0','0','0','0','11087','0','0','0','Silithid',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','1','0','0','0','0','1','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','hunter_pet_bot','-1'),\n('70532','0','0','0','0','0','10810','0','0','0','Chimaera',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','1','0','0','0','0','1','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','hunter_pet_bot','-1'),\n('70533','0','0','0','0','0','29673','0','0','0','Spirit Beast',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','1','0','0','0','0','1','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','hunter_pet_bot','-1'),\n('70534','0','0','0','0','0','12168','0','0','0','Core Hound',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','1','0','0','0','0','1','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','hunter_pet_bot','-1'),\n('70535','0','0','0','0','0','5239','0','0','0','Devilsaur',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','1','0','0','0','0','1','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','hunter_pet_bot','-1'),\n('70536','0','0','0','0','0','26279','0','0','0','Rhino',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','1','0','0','0','0','1','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','hunter_pet_bot','-1'),\n('70537','0','0','0','0','0','13212','0','0','0','Worm',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','1','0','0','0','0','1','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','hunter_pet_bot','-1'),\n('70538','0','0','0','0','0','24994','24993','24992','24995','Risen Ghoul',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','8','0','0','0','0','6','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','deathknight_pet_bot','-1'),\n-- 70539 - 70541 reserved for dk pets\n('70542','0','0','0','0','0','19110','0','0','0','Shadowfiend',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','5','1500','1500','2','0','0','0','0','10','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','priest_pet_bot','-1'),\n('70543','0','0','0','0','0','21114','0','0','0','Spirit Wolf',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','1500','1500','1','0','0','0','0','1','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','shaman_pet_bot','-1'),\n('70544','0','0','0','0','0','525','0','0','0','Water Elemental',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','8','0','0','0','0','4','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','mage_pet_bot','-1'),\n('70545','0','0','0','0','0','18922','0','0','0','Treant',NULL,'','0','80','80','2','35','0','1.2','1.3','1','0','0','2000','2000','1','0','0','0','0','4','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','druid_pet_bot','-1'),\n-- 70546 - 70550 reserved for pets\n('70551','0','0','0','0','0','17659','0','0','0','Gorkramato','Blademaster Bot','','0','81','81','2','35','1','1.1','1.1','1','4','0','2200','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157560','blademaster_bot','-1'),\n('70552','0','0','0','0','0','17659','0','0','0','Mirror Image (Blademaster)','Blademaster bot','','0','81','81','2','35','1','1.1','1.1','1','4','0','2200','2000','1','0','16432','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157560','blademaster_bot','-1'),\n('70553','0','0','0','0','0','15343','0','0','0','Osis','Obsidian Destroyer Bot','','0','83','83','2','35','1','1.1','1.1','0.7','2','0','1200','1200','8','0','0','0','0','10','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','0','sphynx_bot','-1'),\n('70554','0','0','0','0','0','15343','0','0','0','Amot','Obsidian Destroyer Bot','','0','83','83','2','35','1','1.1','1.1','0.7','2','0','1200','1200','8','0','0','0','0','10','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','0','sphynx_bot','-1'),\n('70555','0','0','0','0','0','6769','0','0','0','Detrae','Archmage Bot','','0','81','81','2','35','1','1.1','1.1','1','4','0','1420','1420','8','0','16432','0','0','7','2048','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','archmage_bot','-1'),\n('70556','0','0','0','0','0','5561','0','0','0','Water Elemental',NULL,'','0','81','81','2','35','0','1.2','1.3','1','0','0','1500','1500','1','0','0','0','0','4','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','archmage_pet_bot','-1'),\n('70557','0','0','0','0','0','348','0','0','0','Neroth','Dreadlord Bot','','0','83','83','2','35','1','1.1','1.1','1.5','2','0','1300','1300','2','0','0','0','0','3','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','0','dreadlord_bot','-1'),\n('70558','0','0','0','0','0','348','0','0','0','Fearoth','Dreadlord Bot','','0','83','83','2','35','1','1.1','1.1','1.5','2','0','1300','1300','2','0','0','0','0','3','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','0','dreadlord_bot','-1'),\n('70559','0','0','0','0','0','348','0','0','0','Zalamon','Dreadlord Bot','','0','83','83','2','35','1','1.1','1.1','1.5','2','0','1300','1300','2','0','0','0','0','3','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','0','dreadlord_bot','-1'),\n('70560','0','0','0','0','0','348','0','0','0','Lotthicus','Dreadlord Bot','','0','83','83','2','35','1','1.1','1.1','1.5','2','0','1300','1300','2','0','0','0','0','3','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','0','dreadlord_bot','-1'),\n('70561','0','0','0','0','0','348','0','0','0','Ramarot','Dreadlord Bot','','0','83','83','2','35','1','1.1','1.1','1.5','2','0','1300','1300','2','0','0','0','0','3','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','0','dreadlord_bot','-1'),\n('70562','0','0','0','0','0','169','0','0','0','Infernal',NULL,'','0','83','83','2','35','0','1.2','1.3','1.5','0','2','1350','1350','1','0','0','0','0','3','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266416','dreadlord_pet_bot','-1'),\n('70563','0','0','0','0','0','15511','0','0','0','Eanor','Spell Breaker Bot','','0','81','81','2','35','1','1.1','1.1','1.5','4','0','1900','1900','2','0','0','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','0','spellbreaker_bot','-1'),\n('70564','0','0','0','0','0','15511','0','0','0','Narsen','Spell Breaker Bot','','0','81','81','2','35','1','1.1','1.1','1.5','4','0','1900','1900','2','0','0','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','0','spellbreaker_bot','-1'),\n('70565','0','0','0','0','0','15511','0','0','0','Caelnor','Spell Breaker Bot','','0','81','81','2','35','1','1.1','1.1','1.5','4','0','1900','1900','2','0','0','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','0','spellbreaker_bot','-1'),\n('70566','0','0','0','0','0','15511','0','0','0','Daenste','Spell Breaker Bot','','0','81','81','2','35','1','1.1','1.1','1.5','4','0','1900','1900','2','0','0','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','0','spellbreaker_bot','-1'),\n('70567','0','0','0','0','0','15511','0','0','0','Neshdar','Spell Breaker Bot','','0','81','81','2','35','1','1.1','1.1','1.5','4','0','1900','1900','2','0','0','0','0','7','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','0','spellbreaker_bot','-1'),\n('70568','0','0','0','0','0','30072','0','0','0','Mara','Dark Ranger Bot','','0','83','83','2','35','1','1.1','1.1','1','2','0','2000','2000','8','0','0','0','0','6','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','0','dark_ranger_bot','-1'),\n('70569','0','0','0','0','0','30072','0','0','0','Tani','Dark Ranger Bot','','0','83','83','2','35','1','1.1','1.1','1','2','0','2000','2000','8','0','0','0','0','6','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','0','dark_ranger_bot','-1'),\n('70570','0','0','0','0','0','30072','0','0','0','Eva','Dark Ranger Bot','','0','83','83','2','35','1','1.1','1.1','1','2','0','2000','2000','8','0','0','0','0','6','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','0','dark_ranger_bot','-1'),\n('70571','0','0','0','0','0','30072','0','0','0','Darise','Dark Ranger Bot','','0','83','83','2','35','1','1.1','1.1','1','2','0','2000','2000','8','0','0','0','0','6','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','0','dark_ranger_bot','-1'),\n('70572','0','0','0','0','0','30072','0','0','0','Lyra','Dark Ranger Bot','','0','83','83','2','35','1','1.1','1.1','1','2','0','2000','2000','8','0','0','0','0','6','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','0','dark_ranger_bot','-1'),\n('70573','0','0','0','0','0','30363','0','0','0','Dark Minion',NULL,'','0','83','83','2','35','0','1.1','1.1','1','0','0','2000','2000','1','0','0','0','0','6','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','0','dark_ranger_pet_bot','-1'),\n('70574','0','0','0','0','0','30363','0','0','0','Dark Minion',NULL,'','0','83','83','2','35','0','1.1','1.1','1','1','0','2000','2000','1','0','0','0','0','6','0','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','0','dark_ranger_pet_bot','-1');\n-- 70575 - 71000 reserved for custom stuff\n\n-- GOSSIPS --\ndelete from `npc_text` where ID between @BOT_START and @BOT_END;\ninsert into `npc_text` (`ID`,`text0_0`,`VerifiedBuild`)\nvalues\n('70001','I live only to serve the master.','-1'),\n('70002','You need something?','-1'),\n('70003','Mortals... usually I kill wretches like you at sight.','-1'),\n('70004','<You see what is supposed to be an obsidian destroyer. This one looks different though, damaged and faded, and does not react to your presence. You recall the Scourge have been using their own versions of those at some point in the past. How the hell did it end up here? After further examination you notice an opening on creature\\'s back.>','-1'),\n('70005','<Obsidian Destroyer stares at you and makes a low growling sound.>','-1'),\n('70006','Are you surprised, mortal? As a lesser nathrezim I have to resort to seeking out allies. You look like you could amuse me at least.','-1'),\n('70007','What is it now, mortal?','-1'),\n('70008','Can you just leave me be? <sigh>','-1'),\n('70009','Now what?','-1'),\n-- 70010 - 70100 reserved for standard/greet gossips\n('70101','|cffff3300Blademaster|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\\\"An elite swordsman, former member of Burning Blade clan, now an elite fighter within the Horde\\\".$B$BMain attribute: Agility.$B$BNetherwalk (Windwalk). Allows Blademaster to become invisible, and move faster for a set amount of time. When the Blademaster attacks a unit to break invisibility, he will deal bonus damage.$B$BMirror Image. Confuses the enemy by creating illusions of the Blademaster and dispelling all magic from the Blademaster.$B$BCritical Strike (passive). Gives a 15% chance to deal critical x2(x3,x4) times normal damage on his attacks.$B$BBladestorm (NIY). Grants immunity to magic and deals damage to all surrounding enemies.$B$B','-1'),\n('70102','|cff9900ccObsidian Destroyer|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\\\"An obsidian winged monstrocity with insatiable hunger for magic\\\".$B$BHigh armor, very high resistances, partially immune to magic, loses mana over time and doesn\\'t benefit from passive mana regeneration effects, mail/plate armor, dual-wielding wands, deals spellshadow damage, no physical attack, cannot attack enemies not in front while moving, spell power bonus: 50% attack power + 200% intellect + wands damage.$B$BDevour Magic. Dispels up to 2 magic effects from enemies, up to 2 magic effects and up to 2 curses from allies and damaging summoned units in 20 yards area. Every dispelled effect restores 20% mana and 5% health, 7 seconds cooldown.$B$BShadow Blast. Empowered attack that deals increased splash damage.$B$BDrain Mana. Drains all mana (limited by caster\\'s mana pool) from a random friendly unit.$B$BReplenish Mana. Energizes surrounding party and raid members within 25 yards for 2% of their maximum mana nullifying caster\\'s mana, affects up to 10 targets, 3 seconds cooldown.$B$BRegenerating Aura. Heals surrounding party and raid members within 25 yards for 3% of their maximum health nullifying caster\\'s mana, affects up to 10 targets, 3 seconds cooldown.$B$BShadow Armor (passive). Restores mana equal to a percentage of damage taken.$B$B','-1'),\n('70103','|cff0000ddArchmage|r$b|cffdd6600-=Warcraft III tribute=-|r$B$BSpell damage taken reduced by 35%, partially immune to control effects, cloth armor, deals spellsfire/spellfrost damage, no physical attack, spell power bonus: 100% intellect. Main attribute: Intellect.$B$BBlizzard. Your typical blizzard, just a little more powerful, 6 seconds cooldown.$B$BSummon Water Elemental. Summons a water elemental to attack archmage\\'s enemies for 1 min, 20 seconds cooldown.$B$BBrilliance Aura. Increases maximum mana by 10% and greatly increases mana regeneration of party and raid members within 40 yards.$B$BMass Teleport. NIY.','-1'),\n('70104','|cff9900ccDreadlord|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\\\"Incredibly powerful demon who wields power of darkness and mental domination\\\".$B$BHigh armor, high resistances, partially immune to control effects, damage taken speeds up spells recharge, plate armor, deals melee/spellshadow damage, bonus damage against incapacitated targets, spell power bonus: 200% strength. Main attribute: Strength.$B$BCarrion Swarm. Sends a horde of bats combined with chaotic magic to damage enemies in a very large frontal cone, cannot crit, 10 seconds cooldown.$B$BSleep. Puts the enemy target to sleep for 60 seconds and allows next physical attack on that target to bypass armor, direct damage caused will awaken the target, 6 seconds cooldown.$B$BVampiric Aura. Increases physical critical damage by 5% and heals party and raid members within 40 yards for a percentage (100% for Dreadlord and 25% for everyone else) of damage done by melee physical attacks and Carrion Swarm, no threat.$B$BSummon Infernal Servant. Calls an infernal down from the sky dealing damage and stunning enemy units, infernal is very resistant to magic and lasts 180 seconds, 180 seconds cooldown.','-1'),\n('70105','|cff0000ddSpell Breaker|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\\\"An elven warrior trained to disrupt and contort magical energies\\\".$B$BSpell damage taken reduced by 75%, partially immune to control effects, armor penalty -30%, mail/plate armor, deals melee/arcane damage, spell power bonus: 200% strength. Main attribute: Strength.$B$BSteal Magic (Spellsteal). Steals a benefical spell from an enemy and applies it to a nearby ally or removes a negative spell from an ally and applies it to a nearby enemy, affects magic and curse effects, 3 seconds cooldown.$B$BFeedback (passive). Successful melee attacks burn target\\'s mana equal to damage caused (increased by spellpower) dealing arcane damage. If target is drained, Spell Breaker\\'s melee attacks will do triple damage with increased critical strike chance','-1'),\n('70106','|cff9900ccDark Ranger|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\\\"A former ranger of Quel\\'thalas forcibly raised from the dead\\\".$B$BSpell damage taken reduced by 35%, undead, partially immune to control effects, leather/cloth armor, deals physical/spellshadow damage, stick to shadows and generates no threat, spell power bonus: 50% intellect. Main attribute: Agility.$B$BSilence. Silences an enemy and up to 4 nearby targets for 8 seconds, 15 seconds cooldown.$B$BBlack Arrow. Fires a cursed arrow dealing 150% weapon damage and additional spellshadow damage over time. If affected target dies from Dark Ranger\\'s damage, Dark Minion will spawn from the corpse (maximum 5 Minions, 80 seconds duration, only works on humanoids, beasts and dragonkin). Deals five times more damage if target is under 20% health.$B$BDrain Life. Drains health from an enemy every second for 5 seconds, healing Dark Ranger for 200% of the drained amount.','-1');\n-- 70107 - 70200 reserved for custom class descriptions\n\n-- OUTFITS --\n-- Npc Dress mod by Rochet2\nCREATE TABLE IF NOT EXISTS `creature_template_outfits` (\n    `entry` INT(10) UNSIGNED NOT NULL,\n    `race` tinyint(3) UNSIGNED NOT NULL DEFAULT '1',\n    `gender` tinyint(3) UNSIGNED NOT NULL DEFAULT '0' COMMENT '0 for male, 1 for female',\n    `skin` tinyint(3) UNSIGNED NOT NULL DEFAULT '0',\n    `face` tinyint(3) UNSIGNED NOT NULL DEFAULT '0',\n    `hair` tinyint(3) UNSIGNED NOT NULL DEFAULT '0',\n    `haircolor` tinyint(3) UNSIGNED NOT NULL DEFAULT '0',\n    `facialhair` tinyint(3) UNSIGNED NOT NULL DEFAULT '0',\n    `head` INT(10) UNSIGNED NOT NULL DEFAULT '0',\n    `shoulders` INT(10) UNSIGNED NOT NULL DEFAULT '0',\n    `body` INT(10) UNSIGNED NOT NULL DEFAULT '0',\n    `chest` INT(10) UNSIGNED NOT NULL DEFAULT '0',\n    `waist` INT(10) UNSIGNED NOT NULL DEFAULT '0',\n    `legs` INT(10) UNSIGNED NOT NULL DEFAULT '0',\n    `feet` INT(10) UNSIGNED NOT NULL DEFAULT '0',\n    `wrists` INT(10) UNSIGNED NOT NULL DEFAULT '0',\n    `hands` INT(10) UNSIGNED NOT NULL DEFAULT '0',\n    `back` INT(10) UNSIGNED NOT NULL DEFAULT '0',\n    `tabard` INT(10) UNSIGNED NOT NULL DEFAULT '0',\n    PRIMARY KEY  (`entry`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n-- End Npc Dress mod\n\nreplace into `creature_template_outfits` (`entry`, `race`, `gender`, `skin`, `face`, `hair`, `haircolor`, `facialhair`, `head`, `shoulders`, `body`, `chest`, `waist`, `legs`, `feet`, `wrists`, `hands`, `back`, `tabard`)\nvalues\n('70551','2','0','0','14','9','7','5','0','0','0','0','59194','64674','0','36248','0','0','0'), -- Blademaster\n('70552','2','0','0','14','9','7','5','0','0','0','0','59194','64674','0','36248','0','0','0'); -- Mirror Image (Blademaster)\n\n-- Customize section\n\nSET @CLASS_WARRIOR          = 1;\nSET @CLASS_PALADIN          = 2;\nSET @CLASS_HUNTER           = 3;\nSET @CLASS_ROGUE            = 4;\nSET @CLASS_PRIEST           = 5;\nSET @CLASS_DK               = 6;\nSET @CLASS_SHAMAN           = 7;\nSET @CLASS_MAGE             = 8;\nSET @CLASS_WARLOCK          = 9;\nSET @CLASS_DRUID            = 11;\nSET @CLASS_BM               = 12;\nSET @CLASS_SPHYNX           = 13;\nSET @CLASS_ARCHMAGE         = 14;\nSET @CLASS_DREADLORD        = 15;\nSET @CLASS_SPELLBREAKER     = 16;\nSET @CLASS_DARK_RANGER      = 17;\n\n-- Add flags_extra\n\nSET @EX_NO_PARRY_HASTEN     = 8; -- 0x00000008 - CREATURE_FLAG_EXTRA_NO_PARRY_HASTEN\nSET @EX_NO_BLOCK            = 16; -- 0x00000010 - CREATURE_FLAG_EXTRA_NO_BLOCK\nSET @EX_NO_CRUSH            = 32; -- 0x00000020 - CREATURE_FLAG_EXTRA_NO_CRUSH\nSET @EX_NO_XP               = 64; -- 0x00000040 - CREATURE_FLAG_EXTRA_NO_XP_AT_KILL\nSET @EX_DIMINISH            = 1048576; -- 0x00100000 - CREATURE_FLAG_EXTRA_ALL_DIMINISH\nSET @EX_NPCBOT              = 67108864; -- 0x04000000 - CREATURE_FLAG_EXTRA_NPCBOT - custom flag\nSET @EX_NPCBOT_PET          = 134217728; -- 0x08000000 - CREATURE_FLAG_EXTRA_NPCBOT_PET - custom flag\nSET @FLAGS_EX               = @EX_NO_BLOCK | @EX_NO_CRUSH | @EX_NO_XP | @EX_DIMINISH | @EX_NPCBOT;\nSET @FLAGS_EXN              = @EX_NO_BLOCK | @EX_NO_CRUSH | @EX_NO_XP | @EX_DIMINISH | @EX_NPCBOT | @EX_NO_PARRY_HASTEN;\nSET @FLAGS_EX_PET           = @EX_NO_BLOCK | @EX_NO_CRUSH | @EX_NO_XP | @EX_DIMINISH | @EX_NPCBOT_PET;\nSET @FLAGS_EX_PET_BLOCK     = @EX_NO_CRUSH | @EX_NO_XP | @EX_DIMINISH | @EX_NPCBOT_PET;\n\n-- Add unit_flags\n-- SET @U_PVP_ATTACKABLE       = 8; -- 0x00000008 - UNIT_FLAG_PVP_ATTACKABLE\nSET @FLAGS_U                = 0;\nSET @FLAGS_U_PET            = 0;\n\n-- Add unit_flags2\nSET @U2_MIRROR_IMAGE        = 16; -- 0x00000010 - UNIT_FLAG2_MIRROR_IMAGE - 22.06.19\nSET @U2_INSTANT_APPEAR_MODEL= 32; -- 0x00000020 - UNIT_FLAG2_INSTANTLY_APPEAR_MODEL - 29.05.19\nSET @U2_ENEMY_INTERRACT     = 16384; -- 0x00004000 - UNIT_FLAG2_ALLOW_ENEMY_INTERACT\n-- SET @U2_DISABLE_TURN        = 32768; -- 0x00008000 - UNIT_FLAG2_DISABLE_TURN\nSET @FLAGS_U2               = @U2_MIRROR_IMAGE | @U2_INSTANT_APPEAR_MODEL | @U2_ENEMY_INTERRACT;\nSET @FLAGS_U2_NM            = @U2_INSTANT_APPEAR_MODEL | @U2_ENEMY_INTERRACT;\nSET @FLAGS_U2_PET           = 0;\n\n-- Add type_flags\nSET @CT_CAN_ASSIST          = 4096; -- 0x00001000 - CREATURE_TYPE_FLAG_CAN_ASSIST - 26.10.19\nSET @FLAGS_CT               = @CT_CAN_ASSIST;\n\n-- general\nUPDATE `creature_template` SET type_flags:=`type_flags`|@FLAGS_CT WHERE `entry` BETWEEN @BOT_START AND @BOT_END;\n\n-- minions\nUPDATE `creature_template` SET exp:=2, faction:=35, minlevel:=80, maxlevel:=80, BaseAttackTime:=3300, RangeAttackTime:=2000, dynamicflags:=0, speed_walk:=1.1, speed_run:=1.1, scale:=1, HealthModifier:=1, ManaModifier:=1, ArmorModifier:=1, RegenHealth:=0, mechanic_immune_mask:=0, flags_extra:=@FLAGS_EX, unit_flags:=`unit_flags`|@FLAGS_U, unit_flags2:=`unit_flags2`|@FLAGS_U2,    AIName:=''\nWHERE `entry` IN (SELECT `entry` FROM `creature_template_npcbot_extras` WHERE `class`=@CLASS_DK);\nUPDATE `creature_template` SET exp:=2, faction:=35, minlevel:=80, maxlevel:=80, BaseAttackTime:=2200, RangeAttackTime:=2000, dynamicflags:=0, speed_walk:=1.1, speed_run:=1.1, scale:=1, HealthModifier:=1, ManaModifier:=1, ArmorModifier:=1, RegenHealth:=0, mechanic_immune_mask:=0, flags_extra:=@FLAGS_EX, unit_flags:=`unit_flags`|@FLAGS_U, unit_flags2:=`unit_flags2`|@FLAGS_U2,    AIName:=''\nWHERE `entry` IN (SELECT `entry` FROM `creature_template_npcbot_extras` WHERE `class`=@CLASS_DRUID);\nUPDATE `creature_template` SET exp:=2, faction:=35, minlevel:=80, maxlevel:=80, BaseAttackTime:=2800, RangeAttackTime:=2000, dynamicflags:=0, speed_walk:=1.1, speed_run:=1.1, scale:=1, HealthModifier:=1, ManaModifier:=1, ArmorModifier:=1, RegenHealth:=0, mechanic_immune_mask:=0, flags_extra:=@FLAGS_EX, unit_flags:=`unit_flags`|@FLAGS_U, unit_flags2:=`unit_flags2`|@FLAGS_U2,    AIName:=''\nWHERE `entry` IN (SELECT `entry` FROM `creature_template_npcbot_extras` WHERE `class`=@CLASS_HUNTER);\nUPDATE `creature_template` SET exp:=2, faction:=35, minlevel:=80, maxlevel:=80, BaseAttackTime:=3800, RangeAttackTime:=2000, dynamicflags:=0, speed_walk:=1.1, speed_run:=1.1, scale:=1, HealthModifier:=1, ManaModifier:=1, ArmorModifier:=1, RegenHealth:=0, mechanic_immune_mask:=0, flags_extra:=@FLAGS_EX, unit_flags:=`unit_flags`|@FLAGS_U, unit_flags2:=`unit_flags2`|@FLAGS_U2,    AIName:=''\nWHERE `entry` IN (SELECT `entry` FROM `creature_template_npcbot_extras` WHERE `class`=@CLASS_MAGE);\nUPDATE `creature_template` SET exp:=2, faction:=35, minlevel:=80, maxlevel:=80, BaseAttackTime:=2300, RangeAttackTime:=2000, dynamicflags:=0, speed_walk:=1.1, speed_run:=1.1, scale:=1, HealthModifier:=1, ManaModifier:=1, ArmorModifier:=1, RegenHealth:=0, mechanic_immune_mask:=0, flags_extra:=@FLAGS_EX, unit_flags:=`unit_flags`|@FLAGS_U, unit_flags2:=`unit_flags2`|@FLAGS_U2,    AIName:=''\nWHERE `entry` IN (SELECT `entry` FROM `creature_template_npcbot_extras` WHERE `class`=@CLASS_PALADIN);\nUPDATE `creature_template` SET exp:=2, faction:=35, minlevel:=80, maxlevel:=80, BaseAttackTime:=3600, RangeAttackTime:=2000, dynamicflags:=0, speed_walk:=1.1, speed_run:=1.1, scale:=1, HealthModifier:=1, ManaModifier:=1, ArmorModifier:=1, RegenHealth:=0, mechanic_immune_mask:=0, flags_extra:=@FLAGS_EX, unit_flags:=`unit_flags`|@FLAGS_U, unit_flags2:=`unit_flags2`|@FLAGS_U2,    AIName:=''\nWHERE `entry` IN (SELECT `entry` FROM `creature_template_npcbot_extras` WHERE `class`=@CLASS_PRIEST);\nUPDATE `creature_template` SET exp:=2, faction:=35, minlevel:=80, maxlevel:=80, BaseAttackTime:=1600, RangeAttackTime:=2000, dynamicflags:=0, speed_walk:=1.1, speed_run:=1.1, scale:=1, HealthModifier:=1, ManaModifier:=1, ArmorModifier:=1, RegenHealth:=0, mechanic_immune_mask:=0, flags_extra:=@FLAGS_EX, unit_flags:=`unit_flags`|@FLAGS_U, unit_flags2:=`unit_flags2`|@FLAGS_U2,    AIName:=''\nWHERE `entry` IN (SELECT `entry` FROM `creature_template_npcbot_extras` WHERE `class`=@CLASS_ROGUE);\nUPDATE `creature_template` SET exp:=2, faction:=35, minlevel:=80, maxlevel:=80, BaseAttackTime:=2600, RangeAttackTime:=2000, dynamicflags:=0, speed_walk:=1.1, speed_run:=1.1, scale:=1, HealthModifier:=1, ManaModifier:=1, ArmorModifier:=1, RegenHealth:=0, mechanic_immune_mask:=0, flags_extra:=@FLAGS_EX, unit_flags:=`unit_flags`|@FLAGS_U, unit_flags2:=`unit_flags2`|@FLAGS_U2,    AIName:=''\nWHERE `entry` IN (SELECT `entry` FROM `creature_template_npcbot_extras` WHERE `class`=@CLASS_SHAMAN);\nUPDATE `creature_template` SET exp:=2, faction:=35, minlevel:=80, maxlevel:=80, BaseAttackTime:=3500, RangeAttackTime:=2000, dynamicflags:=0, speed_walk:=1.1, speed_run:=1.1, scale:=1, HealthModifier:=1, ManaModifier:=1, ArmorModifier:=1, RegenHealth:=0, mechanic_immune_mask:=0, flags_extra:=@FLAGS_EX, unit_flags:=`unit_flags`|@FLAGS_U, unit_flags2:=`unit_flags2`|@FLAGS_U2,    AIName:=''\nWHERE `entry` IN (SELECT `entry` FROM `creature_template_npcbot_extras` WHERE `class`=@CLASS_WARLOCK);\nUPDATE `creature_template` SET exp:=2, faction:=35, minlevel:=80, maxlevel:=80, BaseAttackTime:=3400, RangeAttackTime:=2000, dynamicflags:=0, speed_walk:=1.1, speed_run:=1.1, scale:=1, HealthModifier:=1, ManaModifier:=1, ArmorModifier:=1, RegenHealth:=0, mechanic_immune_mask:=0, flags_extra:=@FLAGS_EX, unit_flags:=`unit_flags`|@FLAGS_U, unit_flags2:=`unit_flags2`|@FLAGS_U2,    AIName:=''\nWHERE `entry` IN (SELECT `entry` FROM `creature_template_npcbot_extras` WHERE `class`=@CLASS_WARRIOR);\nUPDATE `creature_template` SET exp:=2, faction:=35, minlevel:=81, maxlevel:=81, BaseAttackTime:=1940, RangeAttackTime:=1940, dynamicflags:=0, speed_walk:=1.1, speed_run:=1.1, scale:=1, HealthModifier:=1, ManaModifier:=1, ArmorModifier:=1, RegenHealth:=0, mechanic_immune_mask:=1, flags_extra:=@FLAGS_EXN,unit_flags:=`unit_flags`|@FLAGS_U, unit_flags2:=`unit_flags2`|@FLAGS_U2,    AIName:=''\nWHERE `entry` IN (SELECT `entry` FROM `creature_template_npcbot_extras` WHERE `class`=@CLASS_BM);\nUPDATE `creature_template` SET exp:=2, faction:=35, minlevel:=83, maxlevel:=83, BaseAttackTime:=1350, RangeAttackTime:=1350, dynamicflags:=0, speed_walk:=1.1, speed_run:=1.1,scale:=0.7,HealthModifier:=1, ManaModifier:=1, ArmorModifier:=1, RegenHealth:=0, mechanic_immune_mask:=0, flags_extra:=@FLAGS_EX, unit_flags:=`unit_flags`|@FLAGS_U, unit_flags2:=`unit_flags2`|@FLAGS_U2_NM, AIName:=''\nWHERE `entry` IN (SELECT `entry` FROM `creature_template_npcbot_extras` WHERE `class`=@CLASS_SPHYNX);\nUPDATE `creature_template` SET exp:=2, faction:=35, minlevel:=81, maxlevel:=81, BaseAttackTime:=1420, RangeAttackTime:=1420, dynamicflags:=0, speed_walk:=1.1, speed_run:=2.1, scale:=1, HealthModifier:=1, ManaModifier:=1, ArmorModifier:=1, RegenHealth:=0, mechanic_immune_mask:=0, flags_extra:=@FLAGS_EX, unit_flags:=`unit_flags`|@FLAGS_U, unit_flags2:=`unit_flags2`|@FLAGS_U2,    AIName:=''\nWHERE `entry` IN (SELECT `entry` FROM `creature_template_npcbot_extras` WHERE `class`=@CLASS_ARCHMAGE);\nUPDATE `creature_template` SET exp:=2, faction:=35, minlevel:=83, maxlevel:=83, BaseAttackTime:=2600, RangeAttackTime:=2600, dynamicflags:=0, speed_walk:=1.1, speed_run:=1.1,scale:=1.2,HealthModifier:=1, ManaModifier:=1, ArmorModifier:=1, RegenHealth:=0, mechanic_immune_mask:=0, flags_extra:=@FLAGS_EX, unit_flags:=`unit_flags`|@FLAGS_U, unit_flags2:=`unit_flags2`|@FLAGS_U2_NM, AIName:=''\nWHERE `entry` IN (SELECT `entry` FROM `creature_template_npcbot_extras` WHERE `class`=@CLASS_DREADLORD);\nUPDATE `creature_template` SET exp:=2, faction:=35, minlevel:=81, maxlevel:=81, BaseAttackTime:=1900, RangeAttackTime:=1900, dynamicflags:=0, speed_walk:=1.1, speed_run:=1.1,scale:=1.1,HealthModifier:=1, ManaModifier:=1, ArmorModifier:=1, RegenHealth:=0, mechanic_immune_mask:=0, flags_extra:=@FLAGS_EX, unit_flags:=`unit_flags`|@FLAGS_U, unit_flags2:=`unit_flags2`|@FLAGS_U2_NM, AIName:=''\nWHERE `entry` IN (SELECT `entry` FROM `creature_template_npcbot_extras` WHERE `class`=@CLASS_SPELLBREAKER);\nUPDATE `creature_template` SET exp:=2, faction:=35, minlevel:=82, maxlevel:=82, BaseAttackTime:=2000, RangeAttackTime:=2000, dynamicflags:=0, speed_walk:=1.1, speed_run:=1.1, scale:=1, HealthModifier:=1, ManaModifier:=1, ArmorModifier:=1, RegenHealth:=0, mechanic_immune_mask:=0, flags_extra:=@FLAGS_EX, unit_flags:=`unit_flags`|@FLAGS_U, unit_flags2:=`unit_flags2`|@FLAGS_U2_NM, AIName:=''\nWHERE `entry` IN (SELECT `entry` FROM `creature_template_npcbot_extras` WHERE `class`=@CLASS_DARK_RANGER);\n\n-- pets\nSET @PET_START              = 70501;\nSET @PET_END                = 70550;\nSET @PET_WATER_ELEMENTAL    = 70556;\nSET @PET_INFERNAL           = 70562;\nSET @PET_DARK_MINION        = 70573;\nSET @PET_DARK_MINION_ELITE  = 70574;\n\nUPDATE `creature_template` SET exp:=2, faction:=35, minlevel:=80, maxlevel:=80, dynamicflags:=0, speed_walk:=1.2, speed_run:=1.3, scale:=1.0, HealthModifier:=1, ManaModifier:=1, ArmorModifier:=1, RegenHealth:=0, flags_extra:=@FLAGS_EX_PET, unit_flags:=`unit_flags`|@FLAGS_U_PET, unit_flags2:=`unit_flags2`|@FLAGS_U2_PET, AIName:=''\nWHERE `entry` BETWEEN @PET_START and @PET_END;\nUPDATE `creature_template` SET exp:=2, faction:=35, minlevel:=81, maxlevel:=81, dynamicflags:=0, speed_walk:=1.2, speed_run:=1.3, scale:=1.3, HealthModifier:=1, ManaModifier:=1, ArmorModifier:=1, RegenHealth:=0, flags_extra:=@FLAGS_EX_PET, unit_flags:=`unit_flags`|@FLAGS_U_PET, unit_flags2:=`unit_flags2`|@FLAGS_U2_PET, AIName:=''\nWHERE `entry`=@PET_WATER_ELEMENTAL;\nUPDATE `creature_template` SET exp:=2, faction:=35, minlevel:=83, maxlevel:=83, dynamicflags:=0, speed_walk:=1.2, speed_run:=1.3, scale:=1.5, HealthModifier:=1, ManaModifier:=1, ArmorModifier:=1, RegenHealth:=0, flags_extra:=@FLAGS_EX_PET, unit_flags:=`unit_flags`|@FLAGS_U_PET, unit_flags2:=`unit_flags2`|@FLAGS_U2_PET, AIName:=''\nWHERE `entry`=@PET_INFERNAL;\nUPDATE `creature_template` SET exp:=2, faction:=35, minlevel:=83, maxlevel:=83, dynamicflags:=0, speed_walk:=1.2, speed_run:=1.3, scale:=0.8, HealthModifier:=1, ManaModifier:=1, ArmorModifier:=1, RegenHealth:=0, flags_extra:=@FLAGS_EX_PET_BLOCK, unit_flags:=`unit_flags`|@FLAGS_U_PET, unit_flags2:=`unit_flags2`|@FLAGS_U2_PET, AIName:=''\nWHERE `entry`=@PET_DARK_MINION;\nUPDATE `creature_template` SET exp:=2, faction:=35, minlevel:=83, maxlevel:=83, dynamicflags:=0, speed_walk:=1.2, speed_run:=1.3, scale:=0.9, HealthModifier:=1, ManaModifier:=1, ArmorModifier:=1, RegenHealth:=0, flags_extra:=@FLAGS_EX_PET_BLOCK, unit_flags:=`unit_flags`|@FLAGS_U_PET, unit_flags2:=`unit_flags2`|@FLAGS_U2_PET, AIName:=''\nWHERE `entry`=@PET_DARK_MINION_ELITE;\n"
  },
  {
    "path": "SQL/4_world_generate_bot_equips.sql",
    "content": "/*!50003 DROP PROCEDURE IF EXISTS `sp__generate_npcbot_equips`*/;\n\nDELIMITER ;;\n\n/*!50003 CREATE*/\n/*!50003 PROCEDURE `sp__generate_npcbot_equips`()\nBEGIN\n\nDECLARE CLASS_WARRIOR INT DEFAULT 1;\nDECLARE CLASS_PALADIN INT DEFAULT 2;\nDECLARE CLASS_HUNTER INT DEFAULT 3;\nDECLARE CLASS_ROGUE INT DEFAULT 4;\nDECLARE CLASS_PRIEST INT DEFAULT 5;\nDECLARE CLASS_DEATH_KNIGHT INT DEFAULT 6;\nDECLARE CLASS_SHAMAN INT DEFAULT 7;\nDECLARE CLASS_MAGE INT DEFAULT 8;\nDECLARE CLASS_WARLOCK INT DEFAULT 9;\nDECLARE CLASS_DRUID INT DEFAULT 11;\nDECLARE CLASS_BLADEMASTER INT DEFAULT 12;\nDECLARE CLASS_SPHYNX INT DEFAULT 13;\nDECLARE CLASS_ARCHMAGE INT DEFAULT 14;\nDECLARE CLASS_DREADLORD INT DEFAULT 15;\nDECLARE CLASS_SPELL_BREAKER INT DEFAULT 16;\nDECLARE CLASS_DARK_RANGER INT DEFAULT 17;\n\nDECLARE RACE_HUMAN INT DEFAULT 1;\nDECLARE RACE_ORC INT DEFAULT 2;\nDECLARE RACE_DWARF INT DEFAULT 3;\nDECLARE RACE_NELF INT DEFAULT 4;\nDECLARE RACE_UNDEAD INT DEFAULT 5;\nDECLARE RACE_TAUREN INT DEFAULT 6;\nDECLARE RACE_GNOME INT DEFAULT 7;\nDECLARE RACE_TROLL INT DEFAULT 8;\nDECLARE RACE_BELF INT DEFAULT 10;\nDECLARE RACE_DRAENEI INT DEFAULT 11;\n\nDECLARE NPCBOT_ENTRY_BEGIN INT DEFAULT 70001;\nDECLARE NPCBOT_ENTRY_END INT DEFAULT 71000;\n\nDECLARE NPCBOT_ENTRY_PET_DARK_MINION INT DEFAULT 70573;\nDECLARE NPCBOT_ENTRY_PET_DARK_MINION_ELITE INT DEFAULT 70574;\n\nDECLARE cur_pos INT DEFAULT 0;\nDECLARE myclass INT;\nDECLARE myrace INT;\nDECLARE item1 INT DEFAULT 0;\nDECLARE item2 INT DEFAULT 0;\nDECLARE item3 INT DEFAULT 0;\n\nDELETE FROM `creature_equip_template` WHERE `CreatureID` BETWEEN NPCBOT_ENTRY_BEGIN AND NPCBOT_ENTRY_END;\n\nSET cur_pos = NPCBOT_ENTRY_BEGIN;\nWHILE cur_pos < NPCBOT_ENTRY_END DO\n    SET myclass = (SELECT `class` FROM `creature_template_npcbot_extras` WHERE `entry` = cur_pos);\n    SET myrace = (SELECT `race` FROM `creature_template_npcbot_extras` WHERE `entry` = cur_pos);\n\n    IF myclass != 0 AND myrace != 0 THEN\n\n        IF myclass = CLASS_WARRIOR THEN\n            IF myrace = RACE_TAUREN THEN\n                SET item1 = 2361; -- hammer\n            ELSEIF myrace IN(RACE_DWARF,RACE_ORC) THEN\n                SET item1 = 2483; -- axe\n            ELSEIF TRUE THEN\n                SET item1 = 2497; -- sword\n            END IF;\n        ELSEIF myclass = CLASS_PALADIN THEN\n            SET item1 = 2488; -- gladius\n            SET item3 = 0;\n            IF myrace = RACE_BELF THEN\n                SET item2 = 20841; -- sunstrider shield\n            ELSE\n                SET item2 = 7188;  -- stormwind guard shield\n            END IF;\n        ELSEIF myclass = CLASS_HUNTER THEN\n            SET item1 = 12282;\n            SET item2 = 0;\n            SET item3 = 2506;\n        ELSEIF myclass = CLASS_ROGUE THEN\n            SET item3 = 25873;\n            IF (cur_pos % 2) = 1 THEN\n                SET item1 = 2092;\n                SET item2 = 3296; -- daggers\n            ELSE\n                SET item1 = 2131;\n                SET item2 = 2484; -- swords\n            END IF;\n        ELSEIF myclass = CLASS_PRIEST THEN\n            SET item1 = 1388; -- short staff\n            SET item2 = 0;\n            SET item3 = 0;\n        ELSEIF myclass = CLASS_DEATH_KNIGHT THEN\n            SET item1 = 38633; -- dk axe\n            SET item2 = 0;\n            SET item3 = 0;\n        ELSEIF myclass = CLASS_SHAMAN THEN\n            SET item1 = 15903; -- claw\n            SET item2 = 0;\n            SET item3 = 0;\n        ELSEIF myclass = CLASS_MAGE THEN\n            SET item1 = 2132; -- staff\n            SET item2 = 0;\n            SET item3 = 0;\n        ELSEIF myclass = CLASS_WARLOCK THEN\n            SET item1 = 3661; -- staff\n            SET item2 = 0;\n            SET item3 = 0;\n        ELSEIF myclass = CLASS_DRUID THEN\n            SET item1 = 3327; -- staff\n            SET item2 = 0;\n            SET item3 = 0;\n        ELSEIF myclass = CLASS_BLADEMASTER THEN\n            SET item1 = 24044; -- blademaster polearm\n            SET item2 = 0;\n            SET item3 = 0;\n        ELSEIF myclass = CLASS_SPHYNX THEN\n            SET item1 = 5208; -- smoldering wand\n            SET item2 = 5208;\n            SET item3 = 0;\n        ELSEIF myclass = CLASS_ARCHMAGE THEN\n            SET item1 = 25917; -- white staff\n            SET item2 = 0;\n            SET item3 = 0;\n        ELSEIF myclass = CLASS_DREADLORD THEN\n            SET item1 = 0;\n            SET item2 = 0;\n            SET item3 = 0;\n        ELSEIF myclass = CLASS_SPELL_BREAKER THEN\n            SET item1 = 0;\n            SET item2 = 0;\n            SET item3 = 0;\n        ELSEIF myclass = CLASS_DARK_RANGER THEN\n            SET item1 = 20849; -- arcane forged shortsword (1.7 dps)\n            SET item2 = 0;\n            SET item3 = 34529; -- vengeful gladiator's longbow\n        END IF;\n\n        INSERT INTO `creature_equip_template` (`CreatureID`,`ID`,`itemID1`,`itemID2`,`itemID3`,`VerifiedBuild`) VALUES (cur_pos,1,item1,item2,item3,-1);\n\n    ELSEIF cur_pos = NPCBOT_ENTRY_PET_DARK_MINION OR cur_pos = NPCBOT_ENTRY_PET_DARK_MINION_ELITE THEN\n        SET item1 = 3935;\n        SET item2 = 15648;\n        SET item3 = 0;\n\n        INSERT INTO `creature_equip_template` (`CreatureID`,`ID`,`itemID1`,`itemID2`,`itemID3`,`VerifiedBuild`) VALUES (cur_pos,1,item1,item2,item3,-1);\n\n    END IF;\n\n    SET cur_pos = cur_pos + 1;\n\nEND WHILE;\n\nEND */;;\n\nDELIMITER ;\n\nCALL `sp__generate_npcbot_equips`();\n\nDROP PROCEDURE IF EXISTS `sp__generate_npcbot_equips`;\n"
  },
  {
    "path": "SQL/5_world_botgiver.sql",
    "content": "DELETE FROM `creature_template` WHERE `entry` = 70000;\nINSERT INTO `creature_template`\n(`entry`,`difficulty_entry_1`,`difficulty_entry_2`,`difficulty_entry_3`,`KillCredit1`,`KillCredit2`,\n`modelid1`,`modelid2`,`modelid3`,`modelid4`,`name`,`subname`,`IconName`,`gossip_menu_id`,`minlevel`,`maxlevel`,`exp`,\n`faction`,`npcflag`,`speed_walk`,`speed_run`,`scale`,`rank`,`dmgschool`,`BaseAttackTime`,`RangeAttackTime`,\n`BaseVariance`,`RangeVariance`,`unit_class`,`unit_flags`,`unit_flags2`,`dynamicflags`,`family`,`type`,`type_flags`,`lootid`,\n`pickpocketloot`,`skinloot`,`PetSpellDataId`,`VehicleId`,`mingold`,`maxgold`,`AIName`,`MovementType`,\n`HoverHeight`,`HealthModifier`,`ManaModifier`,`ArmorModifier`,`DamageModifier`,`ExperienceModifier`,`RacialLeader`,`movementId`,`RegenHealth`,\n`mechanic_immune_mask`,`spell_school_immune_mask`,`flags_extra`,`ScriptName`,`VerifiedBuild`)\nVALUES\n('70000','0','0','0','0','0','27541','0','0','0','Lagretta','Bots for hire','','0','83','83','2','35','1','1.4','1.14286','0.7','4','0','0','0','1','1','1','33088','2048','0','0','0','0','0','0','0','0','0','0','0','','0','1','4.8','1','1','1','1','0','0','1','0','0','0','script_bot_giver','-1');\n\nDELETE FROM `npc_text` WHERE `ID` BETWEEN 70201 AND 70204;\nINSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n('70201','There are always dudes ready to kill for money.','-1'),\n('70202','Mercenaries are always in demand. Here is what available right now.','-1'),\n('70203','Mercenaries are always in demand. Here is what available right now.','-1'),\n('70204','Seems like there is nobody available right now, check again later.','-1');\n"
  },
  {
    "path": "SQL/characters_bots.sql",
    "content": "--\nSET FOREIGN_KEY_CHECKS=0;\n\nDROP TABLE IF EXISTS `characters_npcbot`;\nCREATE TABLE `characters_npcbot` (\n  `entry` int(10) unsigned NOT NULL COMMENT 'creature_template.entry',\n  `owner` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'characters.guid (lowguid)',\n  `roles` smallint(5) unsigned NOT NULL COMMENT 'bitmask: tank(1),dps(2),heal(4),ranged(8)',\n  `faction` int(10) unsigned NOT NULL DEFAULT '35',\n  `equipMhEx` int(10) unsigned NOT NULL DEFAULT '0',\n  `equipOhEx` int(10) unsigned NOT NULL DEFAULT '0',\n  `equipRhEx` int(10) unsigned NOT NULL DEFAULT '0',\n  `equipHead` int(10) unsigned NOT NULL DEFAULT '0',\n  `equipShoulders` int(10) unsigned NOT NULL DEFAULT '0',\n  `equipChest` int(10) unsigned NOT NULL DEFAULT '0',\n  `equipWaist` int(10) unsigned NOT NULL DEFAULT '0',\n  `equipLegs` int(10) unsigned NOT NULL DEFAULT '0',\n  `equipFeet` int(10) unsigned NOT NULL DEFAULT '0',\n  `equipWrist` int(10) unsigned NOT NULL DEFAULT '0',\n  `equipHands` int(10) unsigned NOT NULL DEFAULT '0',\n  `equipBack` int(10) unsigned NOT NULL DEFAULT '0',\n  `equipBody` int(10) unsigned NOT NULL DEFAULT '0',\n  `equipFinger1` int(10) unsigned NOT NULL DEFAULT '0',\n  `equipFinger2` int(10) unsigned NOT NULL DEFAULT '0',\n  `equipTrinket1` int(10) unsigned NOT NULL DEFAULT '0',\n  `equipTrinket2` int(10) unsigned NOT NULL DEFAULT '0',\n  `equipNeck` int(10) unsigned NOT NULL DEFAULT '0',\n  PRIMARY KEY (`entry`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n"
  },
  {
    "path": "SQL/locales/deDE/npc_text_locale.sql",
    "content": "DELETE FROM `npc_text_locale` WHERE `Locale`='deDE' AND `ID` BETWEEN '70000' AND '71000';\nINSERT INTO `npc_text_locale` (`ID`, `Locale`, `Text0_0`, `Text0_1`, `Text1_0`, `Text1_1`, `Text2_0`, `Text2_1`, `Text3_0`, `Text3_1`, `Text4_0`, `Text4_1`, `Text5_0`, `Text5_1`, `Text6_0`, `Text6_1`, `Text7_0`, `Text7_1`)\nVALUES\n('70001','deDE','Ich lebe nur um dem Meister zu dienen.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70002','deDE','Brauchst du etwas?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70003','deDE','Sterbliche... Normalerweise töte ich Abschaum wie euch auf den ersten Blick.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70004','deDE','<Du siehst etwas, das ein Obsidian-Zerstörer sein soll. Dieser sieht jedoch anders aus, beschädigt und verblasst, und er reagiert nicht auf deine Anwesenheit. Du erinnerst dich, dass die Geißel irgendwann in der Vergangenheit ihre eigenen Versionen davon benutzt haben. Wie zum Teufel ist es hierher gekommen? Nach einer weiteren Untersuchung bemerkst du eine Öffnung auf dem Rücken der Kreatur.>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70005','deDE','<Obsidischan-Zerstörer starrt dich an und gibt ein leises Knurren von sich.>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70006','deDE','Bist du überrascht, Sterblicher? Als unbedeutenderer Nathrezim muss ich mir Verbündete suchen. Du siehst aus, als könntest du mich zumindest unterhalten.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70007','deDE','Was ist es diesmal, Sterblicher?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70008','deDE','Kannst du mich einfach in Ruhe lassen? <seufz>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70009','deDE','Was nun?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70010','deDE','<Du siehst eine ausgemergelte Naga-Matrone. Sie sieht müde und schwach aus und vermeidet es, dich anzusehen.>$B$BS-s-s-spare die Worte, Sterblicher...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70011','deDE','Habe ich wieder meine Haare durcheinander gebracht? <Sie bürstet ihr \"Haar\">$B...Nein, habe ich nicht. Was ist es dann?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70012','deDE','<Der vom Kampf vernarbte Gruftlord steht vor dir, er ist offensichtlich unkontrolliert. Ohne seinen Meister hat dieser mächtige untote nerubische Fürst den größten Teil seiner Macht verloren>$B$BWas wird es sein, kleine Kreatur? Dein Fleisch wird wie jedes andere sein...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70013','deDE','Ich verzehre die Lebenden und die Toten.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70101','deDE','|cffff3300Klingenmeister|r$b|cffdd6600-=Warcraft III Tribut=-|r$B$B \"Ein Elite-Schwertkämpfer, ehemaliges Mitglied des Clans der Brennenden Klinge, jetzt ein Elite-Kämpfer der Horde\".$B$BHauptattribut: Beweglichkeit.$B$BNetherlauf (Windlauf). Ermöglicht es dem Blademaster, unsichtbar zu werden und sich für eine bestimmte Zeit schneller zu bewegen. Wenn der Klingenmeister eine Einheit angreift, um die Unsichtbarkeit zu durchbrechen, verursacht er zusätzlichen Schaden.$B$BSpiegelbild. Verwirrt den Feind, indem er Illusionen des Klingenmeisters erzeugt und alle auf den Klingenmeister wirkende Zauber bannt.$B$BKritischer Schlag (passiv). Gewährt eine 15%ige Chance, mit seinen Angriffen das 2(3,4)-fache des normalen Schadens als kritisch zu verursachen.$B$BKlingensturm (NYI). Gewährt Immunität gegen Magie und fügt allen umstehenden Feinden Schaden zu.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70102','deDE','|cff9900ccObsidian Zerstörer|r$b|cffdd6600-=Warcraft III Tribut=-|r$B$B \"Ein geflügeltes Monstrum aus Obsidian mit unstillbarem Hunger nach Magie\". $B$BHohe Rüstung, sehr hohe Resistenzen, teilweise immun gegen Magie, verliert mit der Zeit Mana und profitiert nicht von passiven Manaregenerationseffekten, Kettenhemd/Plattenrüstung, zwei Zauberstäbe, verursacht Schattenzauber-Schaden, kein physischer Angriff, kann keine Gegner angreifen, die sich nicht in der Nähe befinden, während er sich bewegt, Zauberkraft-Bonus: 50% Angriffskraft + 200% Intellekt + Zauberstab-Schaden.$B$BMagie verschlingen. Entfernt bis zu 2 magische Effekte von Gegnern, bis zu 2 magische Effekte und bis zu 2 Flüche von Verbündeten und Schaden verursachende beschworene Einheiten im Umkreis von 20 Metern. Jeder gebannte Effekt stellt 20% Mana und 5% Gesundheit wieder her, 7 Sekunden Abklingzeit.$B$BSchattenschlag. Verstärkter Angriff, der erhöhten Splash-Schaden verursacht.$B$BMana entziehen. Entzieht einer zufälligen befreundeten Einheit das gesamte Mana (begrenzt durch den Manapool des Zaubernden).$B$BMana auffrischen. Versorgt umstehende Gruppen- und Schlachtzugsmitglieder im Umkreis von 25 Metern mit 3% ihres maximalen Manas, wobei das Mana des Zaubernden annulliert wird, 3 Sekunden Abklingzeit.$B$BRegenerierende Aura. Heilt Gruppen- und Schlachtzugsmitglieder im Umkreis von 25 Metern um 3% ihrer maximalen Gesundheit und macht das Mana des Zaubernden zunichte, 3 Sekunden Abklingzeit.$B$BSchattenrüstung (passiv). Stellt Mana in Höhe eines Prozentsatzes des erlittenen Schadens wieder her.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70103','deDE','|cff0000ddErzmagier|r$b|cffdd6600-=Warcraft III Tribut=-|r$B$BSZauberschaden um 35% reduziert, teilweise immun gegen Kontrolleffekte, Stoffrüstung, verursacht Feuerzauber/Frostzauber Schaden, kein physischer Angriff, Zaubermachtbonus: 100% Intelligenz. Hauptattribut: Intelligenz.$B$BBlizzard. Ein typischer Blizzard, nur etwas mächtiger, 6 Sekunden Abklingzeit.$B$BWasserelementar beschwören. Beschwört ein Wasserelementar, das die Feinde des Erzmagiers 1 Minute lang angreift, 20 Sekunden Abklingzeit.$B$BBrillianz Aura. Erhöht das maximale Mana um 10% und erhöht die Manaregeneration von Gruppen- und Schlachtzugsmitgliedern im Umkreis von 40 Metern erheblich.$B$BMassenteleport. NYI.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70104','deDE','|cff9900ccSchreckenslord|r$b|cffdd6600-=Warcraft III Tribut=-|r$B$B\"|Unglaublich mächtiger Dämon, der die Macht der Finsternis und geistige Beherrschung ausübt\".$B$BHohe Rüstung, hohe Resistenzen, teilweise immun gegen Kontrolleffekte, erlittener Schaden beschleunigt die Wiederaufladung von Zaubern, Plattenrüstung, verursacht Nahkampf-/Schattenzauberschaden, Bonusschaden gegen kampfunfähige Ziele, Bonus auf Zaubermacht: 200% Stärke. Hauptattribut: Stärke.$B$BAasschwarm. Schickt eine Horde Fledermäuse in Kombination mit Chaos Magie, um Gegnern in einem sehr großen Frontalkegel Schaden zuzufügen, kann nicht kritisch sein, 10 Sekunden Abklingzeit.$B$BSchlaf. Versetzt das gegnerische Ziel für 60 Sekunden in Schlaf und ermöglicht es, dass der nächste physische Angriff auf dieses Ziel die Rüstung umgeht, direkter verursachter Schaden weckt das Ziel auf, 6 Sekunden Abklingzeit.$B$BVampirische Aura. Erhöht physischen kritischen Schaden um 5% und heilt Gruppen- und Schlachtzugsmitglieder im Umkreis von 40 Metern um einen bestimmten Prozentsatz (100% für den Schreckenslord und 25% für alle anderen) des durch physische Nahkampfangriffe und Aasschwarm verursachten Schadens, keine Bedrohung.$B$BSBeschwörung eines Höllendieners. Ruft einen Höllendiener vom Himmel, der Schaden verursacht und gegnerische Einheiten betäubt. Der Höllendiener ist sehr resistent gegen Magie und hält 180 Sekunden lang, 180 Sekunden Abklingzeit.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70105','deDE','|cff0000ddZauberbrecher|r$b|cffdd6600-=Warcraft III Tribut=-|r$B$B\"Ein elfischer Krieger, der darauf trainiert ist, magische Energien zu unterbrechen und zu verzerren\".$B$BSZauberschaden um 75% reduziert, teilweise immun gegen Kontrolleffekte, Rüstungsabzug -30%, Ketten-/Panzerrüstung, verursacht Nahkampf-/Arkanschaden, Zaubermachtbonus: 200% Stärke. Hauptattribut: Stärke.$B$BMagie stehlen (Zauberraub). Stiehlt einem Feind einen nützlichen Zauber und wendet ihn auf einen Verbündeten in der Nähe an oder entfernt einen negativen Zauber von einem Verbündeten und wendet ihn auf einen Feind in der Nähe an, wirkt auf Magie- und Fluch-Effekte, 2 Sekunden Abklingzeit.$B$BRückkopplung (passiv). Erfolgreiche Nahkampfangriffe verbrennen das Mana des Ziels in Höhe des verursachten Schadens (erhöht durch Zaubermacht) und verursachen arkanen Schaden. Wenn das Mana des Ziels aufgebraucht ist, verursachen die Nahkampfangriffe von Zauberbrecher dreifachen Schaden mit erhöhter Chance auf einen kritischen Treffer. Wenn das Ziel kein Mana hat, erhält der Zauberbrecher Mana in Höhe von 25% des verursachten Schadens.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70106','deDE','|cff9900ccDunkler Waldläufer|r$b|cffdd6600-=Warcraft III Tribut=-|r$B$B\"Ein ehemaliger Waldläufer von Quel Thalas, der gewaltsam von den Toten auferweckt wurde.\"$B$BSZauberschaden um 35% reduziert, untot, teilweise immun gegen Kontrolleffekte, Leder-/Stoffrüstung, verursacht physischen/zauberhaften Schattenschaden, haftet an Schatten und stellt keine Bedrohung dar, Zauberkraftbonus: 50% Intelligenz. Hauptattribut: Beweglichkeit.$B$BStille. Bringt einen Gegner und bis zu 4 Ziele in der Nähe 8 Sekunden lang zum Schweigen, 15 Sekunden Abklingzeit.$B$BBSchwarzer Pfeil. Feuert einen verfluchten Pfeil ab, der 150% Waffenschaden und zusätzlichen Schattenzauberschaden über Zeit verursacht. Wenn das betroffene Ziel durch den Schaden des dunklen Waldläufers stirbt, spawnen aus der Leiche dunkle Schergen (maximal 5 Schergen, 80 Sekunden Dauer, funktioniert nur bei Humanoiden, Bestien und Drachenkin). Verursacht fünfmal mehr Schaden, wenn das Ziel weniger als 20% Gesundheit hat.$B$BLebensentzug. Entzieht einem Feind 5 Sekunden lang jede Sekunde Leben und heilt den dunklen Waldläufer für 200% der entzogenen Menge.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70107','deDE','|cff9900ccTotenbeschwörer|r$b|cffdd6600-=Warcraft III / Diablo II Tribut=-|r$B$BSZauberschaden um 20% reduziert, teilweise immun gegen Kontrolleffekte, Stoffrüstung, verursacht Zauberschattenschaden, kein physischer Angriff, Zaubermachtbonus: 100% Intelligenz. Hauptattribut: Intelligenz.$B$BRaise Dead. Erweckt 2 Skelette aus einer Leiche (maximal 6 Skelette, 65 Sekunden Dauer, funktioniert nur bei Humanoiden, Bestien und Drachenkin).$B$BUnheilige Raserei. Erhöht das Nahkampfangriffstempo des Ziels um 75%, entzieht ihm aber ständig Lebenspunkte. Hält 45 Sekunden lang an. Kann nicht abgebrochen werden. Wird auf Stufe 30 freigeschaltet.$B$BCorpse Explosion. Lässt eine Leiche explodieren und fügt allen umstehenden Gegnern Schaden in Höhe von 35% bis 75% der maximalen Lebenspunkte der toten Einheit zu (abhängig von der Stufe des Nekromanten). Dieser Schaden erzeugt keine Bedrohung. Wird auf Stufe 40 freigeschaltet.$B$BCVerkrüppeln. Verringert das Bewegungstempo, das Nahkampfangriffstempo und die Gesamtstärke des Ziels 60 Sekunden lang um 50%. Wird auf Stufe 50 freigeschaltet.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70108','deDE','|cff0000ddMeereshexe|r$b|cffdd6600-=Warcraft III Tribut=-|r$B$B\"Eine bösartige, schuppige Meeresbewohnerin, die oft mit dem Aufkommen gewaltiger Stürme in Verbindung gebracht wird.\" $B$BSZauberschaden um 30% reduziert, teilweise immun gegen Kontrolleffekte, Stoffrüstung, verursacht physischen Schaden, Zauberfrost und Zaubersturm, Angriffskraftbonus: Beweglichkeit x2, Zauberkraftbonus: 200% Intelligenz. Hauptattribut: Intelligenz.$B$BGabelblitzschlag. Ruft einen Blitzkegel herbei, um Feinden Schaden zuzufügen. Trifft 2 bis alle Ziele (je nach Stufe der Meerhexe) und betäubt sie 2 Sekunden lang. Dieser Schaden erzeugt keine Bedrohung.$B$BFrostpfeile. Durchtränkt Pfeile mit Frostzauber für zusätzlichen Schaden und verlangsamt die Bewegungs-, Angriffs- und Wirkgeschwindigkeit des Ziels um 30% bis 70% (abhängig von der Stufe der Meereshexe).$B$BMana-Schild. Erzeugt einen Schild, der 100% des eingehenden (nicht gemilderten) Schadens absorbiert, indem er das Mana der Meerhexe verwendet. Die Wirkung reicht von 1 Schaden pro 10 Mana bis 10 Schaden pro 1 Mana (je nach Stufe der Meereshexe).$B$BTornado. Beschwört einen heftigen Tornado, der gegnerische Einheiten in der Nähe beschädigt und verlangsamt, manchmal sogar komplett außer Gefecht setzt. Der Tornado wächst im Freien mit der Zeit und erhöht den verursachten Schaden und den Wirkungsbereich, schrumpft aber in geschlossenen Räumen und löst sich schnell auf. Wird auf Stufe 60 freigeschaltet.$B$BNaga (Passiv). Schwimmgeschwindigkeit, Schaden und Ausweichchance werden im Wasser stark erhöht.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70109','deDE','|cff9900ccGruftlord|r$b|cffdd6600-=Warcraft III Tribut=-|r$B$B\"Uraltes Ungetüm, einst einer der Könige von Azjol-Nerub, jetzt ein untotes Monster in den Reihen der mächtigsten Krieger des Lichkönigs\".$B$BSehr hohe Rüstung, erhöhte Resistenzen, teilweise immun gegen Steuerungseffekte, immun gegen Gifteffekte, Kettenhemd/Plattenrüstung, verursacht Nahkampf-/Zauberschattenschaden, Zauberkraftbonus: 200% Stärke. Hauptattribut: Stärke.$B$BImpale. Der Gruftlord schlägt mit seinen massiven Klauen auf den Boden und schießt Stacheln in einem frontalen Kegel aus, die Schaden verursachen und feindliche Einheiten in die Luft schleudern, um sie zu betäuben. Wird auf Stufe 20 freigeschaltet.$B$BSpitzenpanzer. Der Chitinpanzer des Crypt Lords erhöht die Schadensresistenz und fügt gegnerischen Nahkämpfern 15% bis 50% Schaden zu.$B$BAaskäfer. Der Gruftlord generiert aus der frischen Leiche eines Feindes einen Aaskäfer, der seine Feinde angreift. Die Käfer sind permanent, regenerieren aber keine Gesundheit und es können nur 6 gleichzeitig kontrolliert werden. Höhere Stufen erlauben es dem Gruftlord, mächtigere Käfer zu beschwören. Wird auf Stufe 10 freigeschaltet.$B$BLKäferschwarm. Der Gruftlord lässt einen Schwarm von 20-40 (hängt von der Stufe des Crypt Lords ab) wütenden Heuschrecken frei, die in der Nähe befindliche feindliche Einheiten beißen und zerreißen, wodurch deren Bewegungs- und Angriffsfähigkeit eingeschränkt wird. Während sie das gegnerische Fleisch verzehren, wandeln sie es in eine Substanz um, die dem Gruftlord bei seiner Rückkehr Trefferpunkte zurückgibt. Wird auf Stufe 40 freigeschaltet.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70201','deDE','Es gibt immer Leute, die bereit sind, für Geld zu töten.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70202','deDE','Söldner sind immer gefragt. Hier ist, was im Moment verfügbar ist:',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70203','deDE','Söldner sind immer gefragt. Hier ist, was im Moment verfügbar ist:',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70204','deDE','Im Moment scheint niemand verfügbar zu sein, schauen Sie später noch einmal nach.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70300','deDE','Stirb!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70301','deDE','Belebe dich wieder',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70302','deDE','Wiederbelebe  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70303','deDE','dein bot',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70304','deDE',' Bot',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70305','deDE','Ich kann noch kein Wasser herbeizaubern',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70306','deDE','Ich kann noch kein Essen herbeizaubern',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70307','deDE','Ich kann das jetzt nicht tun',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70308','deDE','Bitte sehr...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70309','deDE','Deaktiviert',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70310','deDE','Noch nicht bereit',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70311','deDE','Ungültiger Objekttyp',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70312','deDE','Fehlgeschlagen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70313','deDE','Erledigt',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70314','deDE','Ich bin nicht gestaltgewandelt',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70315','deDE','Ich habe keinen Gesundheitsstein',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70316','deDE','Ich kann noch keine Gesundheitssteine erstellen!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70317','deDE','WTF Ich kann keine Schlösser knacken!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70318','deDE','Mein Fähigkeitslevel ist nicht hoch genug',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70319','deDE','Ich ändere meine Talente zu ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70320','deDE','Waffen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70321','deDE','Furor',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70322','deDE','Schutz',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70323','deDE','Vergeltung',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70324','deDE','Tierherrschaft',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70325','deDE','Treffsicherheit',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70326','deDE','Überleben',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70327','deDE','Meucheln',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70328','deDE','Kampf',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70329','deDE','Täuschung',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70330','deDE','Disziplin',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70331','deDE','Heilig',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70332','deDE','Schatten',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70333','deDE','Blut',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70334','deDE','Frost',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70335','deDE','Unheilig',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70336','deDE','Elementar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70337','deDE','Verstärkung',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70338','deDE','Wiederherstellung',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70339','deDE','Arkan',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70340','deDE','Feuer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70341','deDE','Gebrechen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70342','deDE','Dämonologie',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70343','deDE','Zerstörung',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70344','deDE','Gleichgewicht',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70345','deDE','Widlheit',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70346','deDE','Unbekannt',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70347','deDE','Verschwinde, Schwächling',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70348','deDE',' ist nicht überzeugt',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70349','deDE','Ich werde meine Zeit nicht mit irgendetwas verschwenden.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70350','deDE','NYI',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70351','deDE','NYI',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70352','deDE','NYI',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70353','deDE','Ich bin bereit',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70354','deDE','Geh weg. Ich diene meinem Herrn  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70355','deDE','unbekannt',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70356','deDE',' auf dich!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70357','deDE',' auf mich!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70358','deDE',' auf ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70359','deDE',' benutzt!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70360','deDE','bot tank',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70361','deDE','Klasse',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70362','deDE','Spieler',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70363','deDE','Meister',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70364','deDE','nichts',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70365','deDE','Rang',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70366','deDE','Talent',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70367','deDE','Passiv',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70368','deDE','versteckt',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70369','deDE','bekannt',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70370','deDE','Fähigkeit',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70371','deDE','Str',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70372','deDE','Bew',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70373','deDE','Aus',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70374','deDE','Int',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70375','deDE','Wil',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70376','deDE','unk stat',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70377','deDE','Gesamt',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70378','deDE','Nahkampf AP',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70379','deDE','Distanz AP',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70380','deDE','Rüstung',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70381','deDE','Krit',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70382','deDE','Verteidigung',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70383','deDE','Verfehlen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70384','deDE','Ausweichen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70385','deDE','Parrieren',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70386','deDE','Blocken',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70387','deDE','Blockwert',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70388','deDE','Schaden erhalten Nahkampf',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70389','deDE','Schaden erhalten Zauber',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70390','deDE','Schadensreichweite Waffenhand',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70391','deDE','Schadensmultiplikator Waffenhand',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70392','deDE','Angriffszeit Waffenahnd',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70393','deDE','Schadensreichweite Schildhand',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70394','deDE','Schadensmultiplikator Schildhand',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70395','deDE','Angriffszeit Schildhand',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70396','deDE','Schadensreichweite Distanz',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70397','deDE','SchadensmultiplikatorDistanz',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70398','deDE','Angriffszeit Distanz',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70399','deDE','min',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70400','deDE','max',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70401','deDE','DPS',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70402','deDE','Grundlegende HP',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70403','deDE','Gesamt HP',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70404','deDE','Grundlegendes Mana',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70405','deDE','Gesamt Mana',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70406','deDE','Aktuelles Mana',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70407','deDE','Zaubermacht',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70408','deDE','Leben alle 5 Sekunden bonus',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70409','deDE','Mana alle 5 Sekunden ohne Zaubern',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70410','deDE','Mana alle 5 Sekunden beim Zaubern',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70411','deDE','Tempo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70412','deDE','Trefferwertung',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70413','deDE','Waffenkunde',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70414','deDE','Rüstungsdurchschlag',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70415','deDE','Zauberdurchschlag',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70416','deDE','%',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70417','deDE','Heilig',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70418','deDE','Feuer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70419','deDE','Natur',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70420','deDE','Frost',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70421','deDE','Schatten',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70422','deDE','Arkan',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70423','deDE','Resistenz',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70424','deDE','Befehlszustand',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70425','deDE','Folgen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70426','deDE','Angreifen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70427','deDE','Warten',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70428','deDE','Zurücksetzen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70429','deDE','Vollständig stoppen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70430','deDE','Folgeabstand',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70431','deDE','Spezifikation',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70432','deDE','Hauptaufgabe des Bots',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70433','deDE','Bot Sammelrolle',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70434','deDE','PvP Tötungen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70435','deDE','Spieler',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70436','deDE','Gestorben ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70437','deDE',' mal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70438','deDE','%s (Bot) beruhigt sich wieder',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70439','deDE','<Debug>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70440','deDE','Bist du sicher, dass du es riskieren willst  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70441','deDE',' Aufmerksamkeit?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70442','deDE','<Geld einwerfen>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70443','deDE','Möchtest du anlocken ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70444','deDE','<Versuche ein Angebot zu machen>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70445','deDE','Möchtest du folgendes anheuern ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70446','deDE','<Bot anheuern>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70447','deDE','Ausrüstung verwalten...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70448','deDE','Rollen verwalten...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70449','deDE','Formation verwalten...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70450','deDE','Fähigkeiten verwalten...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70451','deDE','Talente verwalten...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70452','deDE','Verbrauchsgüter geben...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70453','deDE','<Gruppe erstellen>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70454','deDE','<Gruppe erstellen (alle Bots)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70455','deDE','<Zur Gruppe hinzufügen>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70456','deDE','<Alle Bots zur Gruppe hinzufügen>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70457','deDE','<Aus der Gruppe entfernen>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70458','deDE','Folge mir',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70459','deDE','Halte deine Position',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70460','deDE','Bleibe hier und tue nichts',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70461','deDE','Ich brauche Essen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70462','deDE','Ich brauche was zu trinken',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70463','deDE','Ich brauche einen gedeckten Tisch',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70464','deDE','Hilf mir ein Schloss zu knacken',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70465','deDE','Ich brauche einen Gesundheitsstein',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70466','deDE','Ich brauche einen Seelenbrunnen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70467','deDE','Frische deine Gifte auf',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70468','deDE','<Gift auswählen (Waffenhand)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70469','deDE','<Gift auswählen (Schildhand)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70470','deDE','Ich möchte Verzauberungen erneuern',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70471','deDE','<Verzauberung auswählen (Waffenhand)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70472','deDE','<Verzauberung auswählen (Schildhand)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70473','deDE','Entferne deine Gestaltwandlung',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70474','deDE','<Haustierart auswählen>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70475','deDE','Du bist entlassen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70476','deDE','Willst du aufgeben ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70477','deDE','Du wirst es vielleicht bereuen...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70478','deDE','Reiß dich zusammen, verdammt noch mal!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70479','deDE','<Studiere die Kreatur>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70480','deDE','Vergiss es',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70481','deDE','Distanz',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70482','deDE','ZURÜCK',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70483','deDE','<Automatisch>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70484','deDE','<Nichts>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70485','deDE','Zufällig (Gerissenheit)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70486','deDE','Zufällig (Wildheit)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70487','deDE','Zufällig (Zähigkeit)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70488','deDE','Zeig mir deine Ausrüstung',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70489','deDE','Automatisch anlegen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70490','deDE','Waffenhand',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70491','deDE','Schildhand',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70492','deDE','Distanz',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70493','deDE','Relikt',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70494','deDE','Kopf',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70495','deDE','Schultern',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70496','deDE','Brust',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70497','deDE','Tailie',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70498','deDE','Beine',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70499','deDE','Füße',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70500','deDE','Handgelenke',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70501','deDE','Hände',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70502','deDE','Rücken',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70503','deDE','Hemd',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70504','deDE','Finger 1',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70505','deDE','Finger 2',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70506','deDE','Schmuck 1',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70507','deDE','Schmuck 2',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70508','deDE','Hals',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70509','deDE','Alles ablegen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70510','deDE','Ausrüstung aktualisieren (nur Visuell)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70511','deDE','nur Visuell',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70512','deDE','Ausgerüstet',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70513','deDE','nichts',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70514','deDE','Verwende deine alte Ausrüstung',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70515','deDE','Ablegen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70516','deDE','Hm... Ich habe nichts, was ich dir geben könnte.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70517','deDE','Sammeln',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70518','deDE','Fähigkeiten Status',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70519','deDE','Erlaubte Fähigkeiten verwalten',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70520','deDE','Benutze ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70521','deDE','Aktualisieren',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70522','deDE','Schaden',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70523','deDE','Kontrolle',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70524','deDE','Heiler',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70525','deDE','Anderes',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70526','deDE',' macht ein knirschendes Geräusch und beginnt zu folgen  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70527','deDE','%s wird sich dir erst anschließen, wenn sein Besitzer ihn entlässt',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70528','deDE','%s wird sich dir erst anschließen, wenn du Stufe 60 erreicht hast.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70529','deDE','%s wird sich dir erst anschließen, wenn du Stufe 55 erreicht hast.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70530','deDE','%s wird sich dir erst anschließen, wenn du Stufe 40 erreicht hast.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70531','deDE','%s wird sich dir erst anschließen, wenn du Stufe 20 erreicht hast.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70532','deDE','Du hast die maximale Anzahl an Npcbots für dein Level überschritten (%u)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70533','deDE','Sie haben nicht genug Geld',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70534','deDE','Du kannst nicht mehr Bots dieser Klasse haben! %u von %u',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70535','deDE','Ausrüstung in Slot %u (%s) kann nicht zurückgesetzt werden! Bot kann nicht entlassen werden!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70536','deDE','aktuell',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70537','deDE','Angriffsdistanz',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70538','deDE','Angriffe aus kurzer Entfernung',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70539','deDE','Angriffe aus großer Entfernung',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70540','deDE','Exakt',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70541','deDE','Buff entfernen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70542','deDE','Lege deinen Krafttyp fest',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70543','deDE','Kann %s aus irgendeinem dummen Grund nicht ausrüsten! Versenden per Post',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70544','deDE','Tank',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70545','deDE','Distanz',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70546','deDE','Bergbauer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70547','deDE','Kräuterkundler',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70548','deDE','Kürschner',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70549','deDE','Ingenieur',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70550','deDE','Besitz des Bots abgelaufen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70551','deDE','Das NpcBot-System ist derzeit deaktiviert. Bitte kontaktiere die Administration.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70552','deDE','%s wird sich Ihnen nicht anschließen, hat bereits einen Meister: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70553','deDE','%s kann Ihnen nicht beitreten, wenn Sie sich teleportieren wollen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70554','deDE','Aspekt',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70555','deDE','des Affen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70556','deDE','des Falken',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70557','deDE','des Geparden',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70558','deDE','der Viper',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70559','deDE','des Wildtiers',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70560','deDE','des Rudels',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70561','deDE','der Wildnis',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70562','deDE','des Drachenfalken',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70563','deDE','kein Aspekt',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70564','deDE','Aura',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70565','deDE','der Hingabe',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70566','deDE','der Konzentration',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70567','deDE','des Feuerwiderstands',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70568','deDE','des Frostwiderstands',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70569','deDE','des Schattenwiderstands',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70570','deDE','der Vergeltung',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70571','deDE','des Kreuzfahrers',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70572','deDE','Keine Aura',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70573','deDE','Verkrüppelndes Gift',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70574','deDE','Sofort wirkendes Gift',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70575','deDE','Tödliches Gift',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70576','deDE','Wundgift',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70577','deDE','Gedankenbenebelndes Gift',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70578','deDE','Narkotisierendes Gift',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70579','deDE','Nichts',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70580','deDE','Flammenzunge',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70581','deDE','Frostbrand',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70582','deDE','Windzorn',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70583','deDE','Lebensgeister',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70584','deDE','Ich brauche deine Dienste',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70585','deDE','Du hast zuviele Bots',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70586','deDE','Möchtest du diesen Bot anheuern? ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70587','deDE',' ist im Moment etwas beschäftigt, versuchen Sie es später noch einmal.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70588','deDE','Ein Vergnügen, mit Ihnen Geschäfte zu machen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70589','deDE','Krieger',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70590','deDE','Paladine',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70591','deDE','Magier',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70592','deDE','Priester',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70593','deDE','Hexenmeister',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70594','deDE','Druiden',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70595','deDE','Todesritter',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70596','deDE','Schurken',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70597','deDE','Schamanen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70598','deDE','Jäger',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70599','deDE','Klingenmeister',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70600','deDE','Zerstörer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70601','deDE','Erzmagier',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70602','deDE','Schreckenslords',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70603','deDE','Zauberbrecher',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70604','deDE','Dunkle Waldläufer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70605','deDE','Krieger',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70606','deDE','Paladin',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70607','deDE','Magier',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70608','deDE','Priester',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70609','deDE','Hexenmeister',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70610','deDE','Druide',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70611','deDE','Todesritter',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70612','deDE','Schurke',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70613','deDE','Schamane',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70614','deDE','Jäger',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70615','deDE','Klingenmeister',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70616','deDE','Zerstörer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70617','deDE','Erzmagier',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70618','deDE','Schreckenslord',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70619','deDE','Zauberbrecher',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70620','deDE','Dunkler Waldläufer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70621','deDE','Männlich',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70622','deDE','Weiblich',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70623','deDE','Mensch',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70624','deDE','Orc',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70625','deDE','Zwerg',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70626','deDE','Nachtelf',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70627','deDE','Untote',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70628','deDE','Tauren',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70629','deDE','Gnom',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70630','deDE','Troll',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70631','deDE','Blutelf',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70632','deDE','Draenei',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70633','deDE','Unbekannt',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70634','deDE','Plündern',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70635','deDE','|cff9d9d9dSchlecht|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70636','deDE','|cffffffffGewöhnlich|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70637','deDE','|cff1eff00Außergewöhnlich|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70638','deDE','|cff0070ddSelten|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70639','deDE','|cffa335eeEpisch|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70640','deDE','|cffff8000Legendär|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70641','deDE','Kampfbeginn verhalten',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70642','deDE','Verzögerung des Angriffs um',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70643','deDE','Verzögerung der Heilung um',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70644','deDE','s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70645','deDE','Off-Tank',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70646','deDE','Totenbeschwörers',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70647','deDE','Totenbeschwörer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70648','deDE','Angriffswinkel',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70649','deDE','Normal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70650','deDE','Frontales AOE vermeiden',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70651','deDE','NYI',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70652','deDE','Bist du sicher, dass das klappt? Es sollte besser das beste Wasser der Welt sein...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70653','deDE','Es scheint, als könnten Sie wirklich einen Schluck frisches Wasser gebrauchen.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70654','deDE','Meereshexes',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70655','deDE','Meereshexe',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70656','deDE','Mana pro Schaden',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70657','deDE','Schaden pro Mana',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70658','deDE','TransfiguTransmogrifikation...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70659','deDE','Kampfpositionierung DEAKTIVIEREN',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70660','deDE','Vorrangiges Ziel',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70661','deDE','Bot Ausrüstungsbank...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70662','deDE','Gegenstände einlagern...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70663','deDE','Gegenstände entnehmen...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70664','deDE','Bank ist leer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70665','deDE','Vorherige Seite',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70666','deDE','Nächste Seite',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70667','deDE','Willst du wirklich so viel Geld ausgeben, damit der Gruftlord sich wieder bewegt?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70668','deDE','Ich bezweifle, dass ihr in eurem jetzigen Zustand viel Schaden anrichten könnt, aber ich bin bereit, euch zu führen und euch dabei zu helfen, eure Kräfte wiederherzustellen.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70669','deDE','Gruftlords',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70670','deDE','Gruftlord',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70671','deDE','Reflektieren',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70672','deDE','Heuschrecken',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70673','deDE','Gesundheitsschwelle des Ziels heilen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70674','deDE','Ich benötige ein Portal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70675','deDE','Sturmwind',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70676','deDE','Eisenschmiede',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70680','deDE','Unterstadt',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70681','deDE','Donnerfels',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70682','deDE','Silbermond',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70683','deDE','Shattrath',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70684','deDE','Dalaran',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70685','deDE','Du überschreitest die maximale Anzahl an NPC‑Bots für deinen Account ({} >= {})',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70686','deDE','<Für alle Bots festlegen>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70687','deDE','(Ausrüstungsbank)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70688','deDE','Nicht genug Platz in der Ausrüstungsbank, um %u Gegenstand(‑e) zu lagern (%u / %u)!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70689','deDE','Ausrüstungs‑Sets',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70690','deDE','Erstellen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70691','deDE','Löschen',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70692','deDE','Ausrüsten',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70693','deDE','fehlt',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);\n"
  },
  {
    "path": "SQL/locales/esES/npc_text_locale.sql",
    "content": "DELETE FROM `npc_text_locale` WHERE `Locale`='esES' AND `ID` BETWEEN '70000' AND '71000';\nINSERT INTO `npc_text_locale` (`ID`, `Locale`, `Text0_0`, `Text0_1`, `Text1_0`, `Text1_1`, `Text2_0`, `Text2_1`, `Text3_0`, `Text3_1`, `Text4_0`, `Text4_1`, `Text5_0`, `Text5_1`, `Text6_0`, `Text6_1`, `Text7_0`, `Text7_1`)\nVALUES\n('70001','esES','Vivo solo para servir a mi dueño.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70002','esES','¿Necesitas algo?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70003','esES','Mortales... normalmente mato a miserables como tú a la vista.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70004','esES','<Ves lo que se supone que es un destructor de obsidiana. Sin embargo, este se ve diferente, dañado y descolorido, y no reacciona a tu presencia. Recuerdas que la Plaga ha estado usando sus propias versiones de esos en algún momento en el pasado. ¿Cómo diablos terminó aquí? Después de un examen más detallado, notas una abertura en la espalda de la criatura.>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70005','esES','<El Destructor de obsidiana te mira fijamente y emite un gruñido bajo.>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70006','esES','¿Estás sorprendido, mortal? Como nathrezim menor, tengo que recurrir a buscar aliados. Parece que podrías divertirme al menos.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70007','esES','¿Qué pasa ahora, mortal?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70008','esES','¿Puedes dejarme en paz? <suspiro>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70009','esES','¿Ahora que?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70101','esES','|cffff3300Blademaster|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\"An elite swordsman, former member of Burning Blade clan, now an elite fighter within the Horde\".$B$BMain attribute: Agility.$B$BNetherwalk (Windwalk). Allows Blademaster to become invisible, and move faster for a set amount of time. When the Blademaster attacks a unit to break invisibility, he will deal bonus damage.$B$BMirror Image. Confuses the enemy by creating illusions of the Blademaster and dispelling all magic from the Blademaster.$B$BCritical Strike (passive). Gives a 15% chance to deal critical x2(x3,x4) times normal damage on his attacks.$B$BBladestorm (NIY). Grants immunity to magic and deals damage to all surrounding enemies.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70102','esES','|cff9900ccObsidian Destroyer|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\"An obsidian winged monstrocity with insatiable hunger for magic\".$B$BHigh armor, very high resistances, partially immune to magic, loses mana over time and doesnt benefit from passive mana regeneration effects, mail/plate armor, dual-wielding wands, deals spellshadow damage, no physical attack, cannot attack enemies not in front while moving, spell power bonus: 50% attack power + 200% intellect + wands damage.$B$BDevour Magic. Dispels up to 2 magic effects from enemies, up to 2 magic effects and up to 2 curses from allies and damaging summoned units in 20 yards area. Every dispelled effect restores 20% mana and 5% health, 7 seconds cooldown.$B$BShadow Blast. Empowered attack that deals increased splash damage.$B$BDrain Mana. Drains all mana (limited by casters mana pool) from a random friendly unit.$B$BReplenish Mana. Energizes surrounding party and raid members within 25 yards for 2% of their maximum mana nullifying casters mana, affects up to 10 targets, 3 seconds cooldown.$B$BRegenerating Aura. Heals surrounding party and raid members within 25 yards for 3% of their maximum health nullifying casters mana, affects up to 10 targets, 3 seconds cooldown.$B$BShadow Armor (passive). Restores mana equal to a percentage of damage taken.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70103','esES','|cff0000ddArchmage|r$b|cffdd6600-=Warcraft III tribute=-|r$B$BSpell damage taken reduced by 35%, partially immune to control effects, cloth armor, deals spellsfire/spellfrost damage, no physical attack, spell power bonus: 100% intellect. Main attribute: Intellect.$B$BBlizzard. Your typical blizzard, just a little more powerful, 6 seconds cooldown.$B$BSummon Water Elemental. Summons a water elemental to attack archmage enemies for 1 min, 20 seconds cooldown.$B$BBrilliance Aura. Increases maximum mana by 10% and greatly increases mana regeneration of party and raid members within 40 yards.$B$BMass Teleport. NIY.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70104','esES','|cff9900ccDreadlord|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\"Incredibly powerful demon who wields power of darkness and mental domination\".$B$BHigh armor, high resistances, partially immune to control effects, damage taken speeds up spells recharge, plate armor, deals melee/spellshadow damage, bonus damage against incapacitated targets, spell power bonus: 200% strength. Main attribute: Strength.$B$BCarrion Swarm. Sends a horde of bats combined with chaotic magic to damage enemies in a very large frontal cone, cannot crit, 10 seconds cooldown.$B$BSleep. Puts the enemy target to sleep for 60 seconds and allows next physical attack on that target to bypass armor, direct damage caused will awaken the target, 6 seconds cooldown.$B$BVampiric Aura. Increases physical critical damage by 5% and heals party and raid members within 40 yards for a percentage (100% for Dreadlord and 25% for everyone else) of damage done by melee physical attacks and Carrion Swarm, no threat.$B$BSummon Infernal Servant. Calls an infernal down from the sky dealing damage and stunning enemy units, infernal is very resistant to magic and lasts 180 seconds, 180 seconds cooldown.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70105','esES','|cff0000ddSpell Breaker|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\"An elven warrior trained to disrupt and contort magical energies\".$B$BSpell damage taken reduced by 75%, partially immune to control effects, armor penalty -30%, mail/plate armor, deals melee/arcane damage, spell power bonus: 200% strength. Main attribute: Strength.$B$BSteal Magic (Spellsteal). Steals a benefical spell from an enemy and applies it to a nearby ally or removes a negative spell from an ally and applies it to a nearby enemy, affects magic and curse effects, 3 seconds cooldown.$B$BFeedback (passive). Successful melee attacks burn target mana equal to damage caused (increased by spellpower) dealing arcane damage. If target is drained, Spell Breaker melee attacks will do triple damage with increased critical strike chance',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70106','esES','|cff9900ccDark Ranger|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\"A former ranger of Quel thalas forcibly raised from the dead\".$B$BSpell damage taken reduced by 35%, undead, partially immune to control effects, leather/cloth armor, deals physical/spellshadow damage, stick to shadows and generates no threat, spell power bonus: 50% intellect. Main attribute: Agility.$B$BSilence. Silences an enemy and up to 4 nearby targets for 8 seconds, 15 seconds cooldown.$B$BBlack Arrow. Fires a cursed arrow dealing 150% weapon damage and additional spellshadow damage over time. If affected target dies from Dark Ranger damage, Dark Minion will spawn from the corpse (maximum 5 Minions, 80 seconds duration, only works on humanoids, beasts and dragonkin). Deals five times more damage if target is under 20% health.$B$BDrain Life. Drains health from an enemy every second for 5 seconds, healing Dark Ranger for 200% of the drained amount.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70201','esES','Siempre hay tipos dispuestos a matar por dinero.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70202','esES','Estos son los bots que están disponibles en este momento: ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70203','esES','Estos son los bots que están disponibles en este momento: ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70204','esES','Parece que no hay nadie disponible en este momento, vuelve más tarde.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70300','esES','¡Muere!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70301','esES','Resucitandote',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70302','esES','Resucitando ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70303','esES','tu bot',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70304','esES',' bot',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70305','esES','Todavía no puedo crear agua',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70306','esES','Todavía no puedo crear comida',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70307','esES','No puedo hacerlo ahora',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70308','esES','Aquí tienes...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70309','esES','Desactivado',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70310','esES','No está listo todavía',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70311','esES','Tipo de objeto no válido',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70312','esES','Fallido',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70313','esES','Vale',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70314','esES','No estoy en ninguna forma',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70315','esES','No tengo piedra de salud',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70316','esES','¡Aún no puedo crear piedras de salud!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70317','esES','¡WTF, no tengo forzar cerraduras!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70318','esES','Mi nivel de habilidad no es alto',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70319','esES','Cambiando mi talento a ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70320','esES','Armas',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70321','esES','Furia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70322','esES','Protección',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70323','esES','Retribución',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70324','esES','Maestro de bestias',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70325','esES','Punteria',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70326','esES','Supervivencia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70327','esES','Asesinato',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70328','esES','Combate',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70329','esES','Sutileza',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70330','esES','Disciplina',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70331','esES','Sagrado',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70332','esES','Sombra',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70333','esES','Sangre',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70334','esES','Escarcha',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70335','esES','Profano',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70336','esES','Elemental',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70337','esES','Mejora',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70338','esES','Restauración',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70339','esES','Arcano',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70340','esES','Fuego',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70341','esES','Aflición',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70342','esES','Demologia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70343','esES','Destrucción',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70344','esES','Equilibrio',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70345','esES','Combate feral',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70346','esES','Unknown',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70347','esES','Vete, debilucho',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70348','esES',' no está convencido',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70349','esES','No voy a perder el tiempo en nada',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70350','esES','NIY',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70351','esES','NIY',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70352','esES','NIY',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70353','esES','Estoy listo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70354','esES','Vete, sirvo a mi dueño ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70355','esES','unknown',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70356','esES',' en ti!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70357','esES',' en mí mismo!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70358','esES',' en ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70359','esES',' usado!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70360','esES','bot tank',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70361','esES','clase',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70362','esES','jugador',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70363','esES','dueño',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70364','esES','ninguno',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70365','esES','Rango',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70366','esES','talento',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70367','esES','pasivo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70368','esES','oculto',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70369','esES','conocido',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70370','esES','habilidad',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70371','esES','str',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70372','esES','agi',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70373','esES','sta',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70374','esES','int',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70375','esES','spi',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70376','esES','unk stat',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70377','esES','total',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70378','esES','Melee AP',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70379','esES','Ranged AP',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70380','esES','armadura',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70381','esES','crit',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70382','esES','defensa',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70383','esES','miss',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70384','esES','evasión',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70385','esES','parry',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70386','esES','bloqueo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70387','esES','valor de bloqueo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70388','esES','Daño recibido cuerpo a cuerpo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70389','esES','Daño recibido de hechizos',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70390','esES','Rango de daño mano principal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70391','esES','Daño múltiple mano principal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70392','esES','Tiempo de ataque mano principal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70393','esES','Rango de daño de mano secundaria',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70394','esES','Daño múltiple mano secundaria',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70395','esES','Tiempo de ataque mano secundaria',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70396','esES','Rango de daño a distancia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70397','esES','Daño a distancia múltiple',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70398','esES','Tiempo de ataque a distancia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70399','esES','min',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70400','esES','max',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70401','esES','DPS',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70402','esES','base hp',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70403','esES','total hp',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70404','esES','base mana',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70405','esES','total mana',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70406','esES','mana actual',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70407','esES','poder de hechizos',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70408','esES','health regen_5 bonus',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70409','esES','mana regen_5 no cast',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70410','esES','mana regen_5 casting',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70411','esES','haste',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70412','esES','hit',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70413','esES','pericia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70414','esES','penetración de armadura',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70415','esES','penetración de hechizos',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70416','esES','%',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70417','esES','sagrado',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70418','esES','fuego',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70419','esES','naturaleza',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70420','esES','escarcha',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70421','esES','sombra',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70422','esES','arcano',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70423','esES','Resistencia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70424','esES','Estados de comando',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70425','esES','Seguir',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70426','esES','Ataque',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70427','esES','Quédate',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70428','esES','Reiniciar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70429','esES','Parar por completo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70430','esES','Distancia de seguimiento',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70431','esES','Especificaciones',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70432','esES','Rol principal del bot',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70433','esES','Rol de recoleción del bot',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70434','esES','Muertes PvP',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70435','esES','jugadores',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70436','esES','Murió ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70437','esES',' veces',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70438','esES','%s (bot) se calma',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70439','esES','<Debug>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70440','esES','¿Estás seguro de que quieres arriesgarte a dibujar ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70441','esES',' atención?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70442','esES','<Insertar Moneda>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70443','esES','Quieres atraer ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70444','esES','<Intenta hacer una ofrenda>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70445','esES','Quieres contratar a ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70446','esES','<Contratar Bot>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70447','esES','Administrar equipamiento...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70448','esES','Administrar rol...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70449','esES','Administrar formación...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70450','esES','Administrar habilidades...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70451','esES','Administrar talentos...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70452','esES','Dar consumibles...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70453','esES','<Crear grupo>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70454','esES','<Crear grupo (Todos los bots)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70455','esES','<Añadir al grupo>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70456','esES','<Añadir todos los bots al grupo>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70457','esES','<Quitar del grupo>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70458','esES','¡Sigueme!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70459','esES','¡Mantén tu posición!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70460','esES','¡Quédate aquí, no hagas nada!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70461','esES','Necesito comida',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70462','esES','Necesito agua',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70463','esES','Necesito una mesa de refrigerios',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70464','esES','Ayúdame a abrir esta cerradura',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70465','esES','Necesito una piedra de salud',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70466','esES','Necesito un pozo de alma',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70467','esES','Necesito que actualices tus venenos',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70468','esES','<Elegir veneno (Mano Principal)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70469','esES','<Elegir veneno (Mano Sencundaria)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70470','esES','Necesito que actualices tus encantamientos',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70471','esES','<Elegir encantamiento (Mano Principal)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70472','esES','<Elegir encantamiento (Mano Secundaria)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70473','esES','Necesito que te quites el cambio de forma',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70474','esES','<Elegir tipo de mascota>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70475','esES','Despedir',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70476','esES','Despedir a ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70477','esES','Puede que te arrepientas...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70478','esES','!Tranquilizaté!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70479','esES','<Estudia a la criatura>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70480','esES','Nada',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70481','esES','Distancia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70482','esES','ATRÁS',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70483','esES','<auto>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70484','esES','<ninguna>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70485','esES','Aleatoria (Astucia)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70486','esES','Aleatoria (Ferocidad)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70487','esES','Aleatoria (Tenacidad)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70488','esES','Muéstrame tu inventario',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70489','esES','Auto-equipar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70490','esES','Mano Principal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70491','esES','Mano Secundaria',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70492','esES','A distancia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70493','esES','Reliquia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70494','esES','Cabeza',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70495','esES','Hombros',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70496','esES','Pecho',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70497','esES','Cintura',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70498','esES','Piernas',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70499','esES','Pies',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70500','esES','Brazales',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70501','esES','Guantes',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70502','esES','Capa',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70503','esES','Camisa',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70504','esES','Anillo1...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70505','esES','Anillo2...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70506','esES','Abalorio1',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70507','esES','Abalorio2',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70508','esES','Collar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70509','esES','Desequipar todo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70510','esES','Actualizar equipamiento (Visual)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70511','esES','Solo visual',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70512','esES','Equipado',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70513','esES','nada',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70514','esES','Usa tu equipamiento antiguo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70515','esES','Desequipar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70516','esES','Mmmm... no tengo nada que darte',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70517','esES','Recolectar material',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70518','esES','Estado de las habilidades',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70519','esES','Administrar habilidades disponibles',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70520','esES','Usar ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70521','esES','Actualizar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70522','esES','Daño',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70523','esES','Control',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70524','esES','Healer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70525','esES','Otros',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70526','esES',' hace un ruido chirriante y comienza a seguir ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70527','esES','%s no se unira a ti hasta que su dueño no lo despida.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70528','esES','%s no se unira a ti hasta que seas nivel 60',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70529','esES','%s no se unira a ti hasta que seas nivel 55',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70530','esES','%s no se unira a ti hasta que seas nivel 40',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70531','esES','%s no se unira a ti hasta que seas nivel 20',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70532','esES','Superas el número máximo de bots (%u)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70533','esES','No tienes suficiente dinero',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70534','esES','¡No puedes tener más bots de esa clase! %u de %u ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70535','esES','¡No se puede reiniciar el equipamiento en el slot %u (%s)! ¡No se puede despedir el bot!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70536','esES','actual',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70537','esES','Distancia de ataque',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70538','esES','Ataques de corto alcance',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70539','esES','Ataques de largo alcance',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70540','esES','Exacto',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70541','esES','Eliminar Buff',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70542','esES','Fija tu tipo de poder',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70543','esES','¡No se puede desequipar a %s por alguna razón! Enviando por correo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70544','esES','Tank',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70545','esES','A distancia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70546','esES','Mineria',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70547','esES','Herbolistaeria',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70548','esES','Desollar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70549','esES','Ingeniería',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70550','esES','El contrato del bot expiró',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70551','esES','Los NPCBot están deshabilitado actualmente.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70552','esES','%s No se unira a ti, ya tiene un dueño: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70553','esES','%s no puede unirse mientras estás a punto de teletransportarte',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70554','esES','Aspecto',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70555','esES','de Mono',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70556','esES','de Halcón',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70557','esES','de Guepardo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70558','esES','de Víbora',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70559','esES','de la Bestia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70560','esES','de la Manada',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70561','esES','de lo Salvaje',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70562','esES','de Dracohalcón',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70563','esES','Sin Aspecto',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70564','esES','Aura',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70565','esES','de Devoción',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70566','esES','de Concentración',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70567','esES','de Resistencia al fuego',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70568','esES','de Resistencia a la escarcha',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70569','esES','de Resistencia a las sombras',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70570','esES','de Reprensión',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70571','esES','de Cruzado',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70572','esES','Sin Aura',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70573','esES','Veneno entorpecedor',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70574','esES','Veneno instantáneo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70575','esES','Veneno mortal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70576','esES','Veneno hiriente',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70577','esES','Veneno de aturdimiento mental',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70578','esES','Veneno anestésico',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70579','esES','Nada',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70580','esES','Lengua de fuego',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70581','esES','Estigma de escarcha',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70582','esES','Viento furioso',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70583','esES','Vida terrestre',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70584','esES','Necesito tus servicios',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70585','esES','Tienes demasiados bots',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70586','esES','Quieres contratar a ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70587','esES',' está ocupado en este momento, vuelve a intentarlo más tarde.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70588','esES','Un placer hacer negocios contigo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70589','esES','Guerreros',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70590','esES','Paladines',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70591','esES','Magos',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70592','esES','Sacerdotes',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70593','esES','Brujos',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70594','esES','Druidas',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70595','esES','Caballeros de la Muerte',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70596','esES','Picaros',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70597','esES','Chamanes',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70598','esES','Cazadores',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70599','esES','Blademasters',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70600','esES','Destroyers',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70601','esES','Archmagi',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70602','esES','Dreadlords',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70603','esES','Spell Breakers',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70604','esES','Dark Rangers',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70605','esES','Guerrero',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70606','esES','Paladin',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70607','esES','Mago',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70608','esES','Sacerdote',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70609','esES','Brujo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70610','esES','Druida',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70611','esES','Caballero de la Muerte',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70612','esES','Picaro',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70613','esES','Chaman',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70614','esES','Cazador',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70615','esES','Blademaster',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70616','esES','Destroyer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70617','esES','Archmage',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70618','esES','Dreadlord',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70619','esES','Spell Breaker',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70620','esES','Dark Ranger',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70621','esES','Hombre',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70622','esES','Mujer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70623','esES','Humano',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70624','esES','Orco',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70625','esES','Enano',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70626','esES','Elfo de la noche',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70627','esES','No-muerto',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70628','esES','Tauren',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70629','esES','Gnomo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70630','esES','Troll',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70631','esES','Elfo de sangre',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70632','esES','Draenei',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70633','esES','Unknown',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70634','esES','Saquear',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70635','esES','|cff9d9d9dBasura|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70636','esES','|cffffffffComún|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70637','esES','|cff1eff00Poco común|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70638','esES','|cff0070ddRaro|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70639','esES','|cffa335eeÉpico|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70640','esES','|cffff8000Legendario|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70641','esES','Elige un comprtamineto',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70642','esES','Retrasa el ataque a',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70643','esES','Retrasa la sanación a',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70644','esES','s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70645','esES','Off-Tank',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70646','esES','Necromancers',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70647','esES','Necromancer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70648','esES','Ángulo de ataque',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70649','esES','Normal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70650','esES','Evitar AOE frontal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70652','esES','¿Estás seguro de que esto va a funcionar? Más vale que sea la mejor agua del mundo...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70653','esES','Parece que realmente te vendría bien un trago de agua fresca.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70654','esES','Brujas del mar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70655','esES','Bruja de mar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70656','esES','Maná por daño',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70657','esES','Daño por maná',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70658','esES','Transfiguración...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70659','esES','DESACTIVAR el posicionamiento de combate',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70660','esES','Objetivo prioritario',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70661','esES','Banco de equipamiento del bot...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70662','esES','Depositar objetos...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70663','esES','Retirar objetos...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70664','esES','El banco está vacío',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70665','esES','Página anterior',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70666','esES','Página siguiente',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70667','esES','¿Realmente quieres gastar todo ese dinero para volver a mover al Señor de las Criptas?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70668','esES','Dudo de tu capacidad para hacer mucho daño en tu estado actual, pero estoy dispuesto a guiarte y ayudarte a restaurar tus poderes.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70669','esES','Señores de las Criptas',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70670','esES','Señor de las Criptas',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70671','esES','Despido',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70672','esES','Langostas',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70673','esES','Umbral de salud del objetivo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70674','esES','Necesito un portal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70675','esES','Ventormenta',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70676','esES','Forjaz',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70677','esES','Darnassus',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70678','esES','El Exodar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70679','esES','Orgrimmar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70680','esES','Entrañas',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70681','esES','Cima del Trueno',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70682','esES','Ciudad de Lunargenta',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70683','esES','Shattrath',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70684','esES','Dalaran',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70685','esES','Superas el número máximo de npcbots para tu cuenta ({} >= {})',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70686','esES','<Aplicar a todos los bots>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70687','esES','(banco de equipamiento)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70688','esES','¡No hay suficiente espacio en el banco de equipamiento para almacenar %u objeto(s) (%u / %u)!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70689','esES','Conjuntos de equipamiento',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70690','esES','Crear',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70691','esES','Eliminar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70692','esES','Equipar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70693','esES','faltante',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);\n"
  },
  {
    "path": "SQL/locales/esMX/npc_text_locale.sql",
    "content": "DELETE FROM `npc_text_locale` WHERE `Locale`='esMX' AND `ID` BETWEEN '70000' AND '71000';\nINSERT INTO `npc_text_locale` (`ID`, `Locale`, `Text0_0`, `Text0_1`, `Text1_0`, `Text1_1`, `Text2_0`, `Text2_1`, `Text3_0`, `Text3_1`, `Text4_0`, `Text4_1`, `Text5_0`, `Text5_1`, `Text6_0`, `Text6_1`, `Text7_0`, `Text7_1`)\nVALUES\n('70001','esMX','Vivo solo para servir a mi dueño.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70002','esMX','¿Necesitas algo?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70003','esMX','Mortales... normalmente mato a miserables como tú a la vista.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70004','esMX','<Ves lo que se supone que es un destructor de obsidiana. Sin embargo, este se ve diferente, dañado y descolorido, y no reacciona a tu presencia. Recuerdas que la Plaga ha estado usando sus propias versiones de esos en algún momento en el pasado. ¿Cómo diablos terminó aquí? Después de un examen más detallado, notas una abertura en la espalda de la criatura.>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70005','esMX','<El Destructor de obsidiana te mira fijamente y emite un gruñido bajo.>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70006','esMX','¿Estás sorprendido, mortal? Como nathrezim menor, tengo que recurrir a buscar aliados. Parece que podrías divertirme al menos.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70007','esMX','¿Qué pasa ahora, mortal?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70008','esMX','¿Puedes dejarme en paz? <suspiro>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70009','esMX','¿Ahora que?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70101','esMX','|cffff3300Blademaster|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\"An elite swordsman, former member of Burning Blade clan, now an elite fighter within the Horde\".$B$BMain attribute: Agility.$B$BNetherwalk (Windwalk). Allows Blademaster to become invisible, and move faster for a set amount of time. When the Blademaster attacks a unit to break invisibility, he will deal bonus damage.$B$BMirror Image. Confuses the enemy by creating illusions of the Blademaster and dispelling all magic from the Blademaster.$B$BCritical Strike (passive). Gives a 15% chance to deal critical x2(x3,x4) times normal damage on his attacks.$B$BBladestorm (NIY). Grants immunity to magic and deals damage to all surrounding enemies.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70102','esMX','|cff9900ccObsidian Destroyer|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\"An obsidian winged monstrocity with insatiable hunger for magic\".$B$BHigh armor, very high resistances, partially immune to magic, loses mana over time and doesnt benefit from passive mana regeneration effects, mail/plate armor, dual-wielding wands, deals spellshadow damage, no physical attack, cannot attack enemies not in front while moving, spell power bonus: 50% attack power + 200% intellect + wands damage.$B$BDevour Magic. Dispels up to 2 magic effects from enemies, up to 2 magic effects and up to 2 curses from allies and damaging summoned units in 20 yards area. Every dispelled effect restores 20% mana and 5% health, 7 seconds cooldown.$B$BShadow Blast. Empowered attack that deals increased splash damage.$B$BDrain Mana. Drains all mana (limited by casters mana pool) from a random friendly unit.$B$BReplenish Mana. Energizes surrounding party and raid members within 25 yards for 2% of their maximum mana nullifying casters mana, affects up to 10 targets, 3 seconds cooldown.$B$BRegenerating Aura. Heals surrounding party and raid members within 25 yards for 3% of their maximum health nullifying casters mana, affects up to 10 targets, 3 seconds cooldown.$B$BShadow Armor (passive). Restores mana equal to a percentage of damage taken.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70103','esMX','|cff0000ddArchmage|r$b|cffdd6600-=Warcraft III tribute=-|r$B$BSpell damage taken reduced by 35%, partially immune to control effects, cloth armor, deals spellsfire/spellfrost damage, no physical attack, spell power bonus: 100% intellect. Main attribute: Intellect.$B$BBlizzard. Your typical blizzard, just a little more powerful, 6 seconds cooldown.$B$BSummon Water Elemental. Summons a water elemental to attack archmage enemies for 1 min, 20 seconds cooldown.$B$BBrilliance Aura. Increases maximum mana by 10% and greatly increases mana regeneration of party and raid members within 40 yards.$B$BMass Teleport. NIY.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70104','esMX','|cff9900ccDreadlord|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\"Incredibly powerful demon who wields power of darkness and mental domination\".$B$BHigh armor, high resistances, partially immune to control effects, damage taken speeds up spells recharge, plate armor, deals melee/spellshadow damage, bonus damage against incapacitated targets, spell power bonus: 200% strength. Main attribute: Strength.$B$BCarrion Swarm. Sends a horde of bats combined with chaotic magic to damage enemies in a very large frontal cone, cannot crit, 10 seconds cooldown.$B$BSleep. Puts the enemy target to sleep for 60 seconds and allows next physical attack on that target to bypass armor, direct damage caused will awaken the target, 6 seconds cooldown.$B$BVampiric Aura. Increases physical critical damage by 5% and heals party and raid members within 40 yards for a percentage (100% for Dreadlord and 25% for everyone else) of damage done by melee physical attacks and Carrion Swarm, no threat.$B$BSummon Infernal Servant. Calls an infernal down from the sky dealing damage and stunning enemy units, infernal is very resistant to magic and lasts 180 seconds, 180 seconds cooldown.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70105','esMX','|cff0000ddSpell Breaker|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\"An elven warrior trained to disrupt and contort magical energies\".$B$BSpell damage taken reduced by 75%, partially immune to control effects, armor penalty -30%, mail/plate armor, deals melee/arcane damage, spell power bonus: 200% strength. Main attribute: Strength.$B$BSteal Magic (Spellsteal). Steals a benefical spell from an enemy and applies it to a nearby ally or removes a negative spell from an ally and applies it to a nearby enemy, affects magic and curse effects, 3 seconds cooldown.$B$BFeedback (passive). Successful melee attacks burn target mana equal to damage caused (increased by spellpower) dealing arcane damage. If target is drained, Spell Breaker melee attacks will do triple damage with increased critical strike chance',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70106','esMX','|cff9900ccDark Ranger|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\"A former ranger of Quel thalas forcibly raised from the dead\".$B$BSpell damage taken reduced by 35%, undead, partially immune to control effects, leather/cloth armor, deals physical/spellshadow damage, stick to shadows and generates no threat, spell power bonus: 50% intellect. Main attribute: Agility.$B$BSilence. Silences an enemy and up to 4 nearby targets for 8 seconds, 15 seconds cooldown.$B$BBlack Arrow. Fires a cursed arrow dealing 150% weapon damage and additional spellshadow damage over time. If affected target dies from Dark Ranger damage, Dark Minion will spawn from the corpse (maximum 5 Minions, 80 seconds duration, only works on humanoids, beasts and dragonkin). Deals five times more damage if target is under 20% health.$B$BDrain Life. Drains health from an enemy every second for 5 seconds, healing Dark Ranger for 200% of the drained amount.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70201','esMX','Siempre hay tipos dispuestos a matar por dinero.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70202','esMX','Estos son los bots que están disponibles en este momento: ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70203','esMX','Estos son los bots que están disponibles en este momento: ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70204','esMX','Parece que no hay nadie disponible en este momento, vuelve más tarde.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70300','esMX','¡Muere!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70301','esMX','Resucitandote',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70302','esMX','Resucitando ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70303','esMX','tu bot',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70304','esMX',' bot',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70305','esMX','Todavía no puedo crear agua',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70306','esMX','Todavía no puedo crear comida',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70307','esMX','No puedo hacerlo ahora',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70308','esMX','Aquí tienes...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70309','esMX','Desactivado',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70310','esMX','No está listo todavía',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70311','esMX','Tipo de objeto no válido',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70312','esMX','Fallido',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70313','esMX','Vale',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70314','esMX','No estoy en ninguna forma',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70315','esMX','No tengo piedra de salud',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70316','esMX','¡Aún no puedo crear piedras de salud!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70317','esMX','¡WTF, no tengo forzar cerraduras!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70318','esMX','Mi nivel de habilidad no es alto',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70319','esMX','Cambiando mi talento a ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70320','esMX','Armas',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70321','esMX','Furia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70322','esMX','Protección',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70323','esMX','Retribución',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70324','esMX','Maestro de bestias',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70325','esMX','Punteria',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70326','esMX','Supervivencia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70327','esMX','Asesinato',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70328','esMX','Combate',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70329','esMX','Sutileza',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70330','esMX','Disciplina',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70331','esMX','Sagrado',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70332','esMX','Sombra',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70333','esMX','Sangre',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70334','esMX','Escarcha',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70335','esMX','Profano',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70336','esMX','Elemental',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70337','esMX','Mejora',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70338','esMX','Restauración',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70339','esMX','Arcano',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70340','esMX','Fuego',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70341','esMX','Aflición',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70342','esMX','Demologia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70343','esMX','Destrucción',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70344','esMX','Equilibrio',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70345','esMX','Combate feral',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70346','esMX','Unknown',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70347','esMX','Vete, debilucho',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70348','esMX',' no está convencido',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70349','esMX','No voy a perder el tiempo en nada',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70350','esMX','NIY',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70351','esMX','NIY',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70352','esMX','NIY',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70353','esMX','Estoy listo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70354','esMX','Vete, sirvo a mi dueño ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70355','esMX','unknown',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70356','esMX',' en ti!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70357','esMX',' en mí mismo!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70358','esMX',' en ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70359','esMX',' usado!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70360','esMX','bot tank',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70361','esMX','clase',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70362','esMX','jugador',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70363','esMX','dueño',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70364','esMX','ninguno',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70365','esMX','Rango',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70366','esMX','talento',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70367','esMX','pasivo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70368','esMX','oculto',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70369','esMX','conocido',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70370','esMX','habilidad',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70371','esMX','str',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70372','esMX','agi',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70373','esMX','sta',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70374','esMX','int',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70375','esMX','spi',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70376','esMX','unk stat',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70377','esMX','total',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70378','esMX','Melee AP',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70379','esMX','Ranged AP',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70380','esMX','armadura',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70381','esMX','crit',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70382','esMX','defensa',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70383','esMX','miss',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70384','esMX','evasión',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70385','esMX','parry',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70386','esMX','bloqueo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70387','esMX','valor de bloqueo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70388','esMX','Daño recibido cuerpo a cuerpo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70389','esMX','Daño recibido de hechizos',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70390','esMX','Rango de daño mano principal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70391','esMX','Daño múltiple mano principal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70392','esMX','Tiempo de ataque mano principal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70393','esMX','Rango de daño de mano secundaria',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70394','esMX','Daño múltiple mano secundaria',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70395','esMX','Tiempo de ataque mano secundaria',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70396','esMX','Rango de daño a distancia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70397','esMX','Daño a distancia múltiple',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70398','esMX','Tiempo de ataque a distancia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70399','esMX','min',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70400','esMX','max',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70401','esMX','DPS',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70402','esMX','base hp',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70403','esMX','total hp',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70404','esMX','base mana',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70405','esMX','total mana',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70406','esMX','mana actual',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70407','esMX','poder de hechizos',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70408','esMX','health regen_5 bonus',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70409','esMX','mana regen_5 no cast',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70410','esMX','mana regen_5 casting',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70411','esMX','haste',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70412','esMX','hit',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70413','esMX','pericia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70414','esMX','penetración de armadura',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70415','esMX','penetración de hechizos',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70416','esMX','%',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70417','esMX','sagrado',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70418','esMX','fuego',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70419','esMX','naturaleza',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70420','esMX','escarcha',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70421','esMX','sombra',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70422','esMX','arcano',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70423','esMX','Resistencia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70424','esMX','Estados de comando',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70425','esMX','Seguir',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70426','esMX','Ataque',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70427','esMX','Quédate',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70428','esMX','Reiniciar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70429','esMX','Parar por completo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70430','esMX','Distancia de seguimiento',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70431','esMX','Especificaciones',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70432','esMX','Rol principal del bot',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70433','esMX','Rol de recoleción del bot',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70434','esMX','Muertes PvP',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70435','esMX','jugadores',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70436','esMX','Murió ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70437','esMX',' veces',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70438','esMX','%s (bot) se calma',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70439','esMX','<Debug>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70440','esMX','¿Estás seguro de que quieres arriesgarte a dibujar ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70441','esMX',' atención?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70442','esMX','<Insertar Moneda>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70443','esMX','Quieres atraer ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70444','esMX','<Intenta hacer una ofrenda>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70445','esMX','Quieres contratar a ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70446','esMX','<Contratar Bot>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70447','esMX','Administrar equipamiento...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70448','esMX','Administrar rol...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70449','esMX','Administrar formación...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70450','esMX','Administrar habilidades...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70451','esMX','Administrar talentos...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70452','esMX','Dar consumibles...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70453','esMX','<Crear grupo>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70454','esMX','<Crear grupo (Todos los bots)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70455','esMX','<Añadir al grupo>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70456','esMX','<Añadir todos los bots al grupo>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70457','esMX','<Quitar del grupo>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70458','esMX','¡Sigueme!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70459','esMX','¡Mantén tu posición!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70460','esMX','¡Quédate aquí, no hagas nada!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70461','esMX','Necesito comida',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70462','esMX','Necesito agua',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70463','esMX','Necesito una mesa de refrigerios',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70464','esMX','Ayúdame a abrir esta cerradura',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70465','esMX','Necesito una piedra de salud',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70466','esMX','Necesito un pozo de alma',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70467','esMX','Necesito que actualices tus venenos',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70468','esMX','<Elegir veneno (Mano Principal)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70469','esMX','<Elegir veneno (Mano Sencundaria)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70470','esMX','Necesito que actualices tus encantamientos',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70471','esMX','<Elegir encantamiento (Mano Principal)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70472','esMX','<Elegir encantamiento (Mano Secundaria)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70473','esMX','Necesito que te quites el cambio de forma',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70474','esMX','<Elegir tipo de mascota>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70475','esMX','Despedir',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70476','esMX','Despedir a ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70477','esMX','Puede que te arrepientas...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70478','esMX','!Tranquilizaté!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70479','esMX','<Estudia a la criatura>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70480','esMX','Nada',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70481','esMX','Distancia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70482','esMX','ATRÁS',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70483','esMX','<auto>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70484','esMX','<ninguna>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70485','esMX','Aleatoria (Astucia)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70486','esMX','Aleatoria (Ferocidad)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70487','esMX','Aleatoria (Tenacidad)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70488','esMX','Muéstrame tu inventario',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70489','esMX','Auto-equipar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70490','esMX','Mano Principal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70491','esMX','Mano Secundaria',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70492','esMX','A distancia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70493','esMX','Reliquia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70494','esMX','Cabeza',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70495','esMX','Hombros',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70496','esMX','Pecho',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70497','esMX','Cintura',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70498','esMX','Piernas',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70499','esMX','Pies',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70500','esMX','Brazales',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70501','esMX','Guantes',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70502','esMX','Capa',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70503','esMX','Camisa',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70504','esMX','Anillo1...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70505','esMX','Anillo2...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70506','esMX','Abalorio1',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70507','esMX','Abalorio2',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70508','esMX','Collar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70509','esMX','Desequipar todo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70510','esMX','Actualizar equipamiento (Visual)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70511','esMX','Solo visual',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70512','esMX','Equipado',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70513','esMX','nada',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70514','esMX','Usa tu equipamiento antiguo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70515','esMX','Desequipar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70516','esMX','Mmmm... no tengo nada que darte',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70517','esMX','Recolectar material',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70518','esMX','Estado de las habilidades',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70519','esMX','Administrar habilidades disponibles',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70520','esMX','Usar ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70521','esMX','Actualizar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70522','esMX','Daño',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70523','esMX','Control',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70524','esMX','Healer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70525','esMX','Otros',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70526','esMX',' hace un ruido chirriante y comienza a seguir ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70527','esMX','%s no se unira a ti hasta que su dueño no lo despida.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70528','esMX','%s no se unira a ti hasta que seas nivel 60',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70529','esMX','%s no se unira a ti hasta que seas nivel 55',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70530','esMX','%s no se unira a ti hasta que seas nivel 40',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70531','esMX','%s no se unira a ti hasta que seas nivel 20',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70532','esMX','Superas el número máximo de bots (%u)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70533','esMX','No tienes suficiente dinero',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70534','esMX','¡No puedes tener más bots de esa clase! %u de %u ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70535','esMX','¡No se puede reiniciar el equipamiento en el slot %u (%s)! ¡No se puede despedir el bot!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70536','esMX','actual',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70537','esMX','Distancia de ataque',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70538','esMX','Ataques de corto alcance',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70539','esMX','Ataques de largo alcance',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70540','esMX','Exacto',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70541','esMX','Eliminar Buff',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70542','esMX','Fija tu tipo de poder',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70543','esMX','¡No se puede desequipar a %s por alguna razón! Enviando por correo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70544','esMX','Tank',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70545','esMX','A distancia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70546','esMX','Mineria',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70547','esMX','Herbolistaeria',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70548','esMX','Desollar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70549','esMX','Ingeniería',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70550','esMX','El contrato del bot expiró',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70551','esMX','Los NPCBot están deshabilitado actualmente.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70552','esMX','%s No se unira a ti, ya tiene un dueño: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70553','esMX','%s no puede unirse mientras estás a punto de teletransportarte',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70554','esMX','Aspecto',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70555','esMX','de Mono',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70556','esMX','de Halcón',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70557','esMX','de Guepardo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70558','esMX','de Víbora',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70559','esMX','de la Bestia',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70560','esMX','de la Manada',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70561','esMX','de lo Salvaje',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70562','esMX','de Dracohalcón',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70563','esMX','Sin Aspecto',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70564','esMX','Aura',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70565','esMX','de Devoción',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70566','esMX','de Concentración',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70567','esMX','de Resistencia al fuego',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70568','esMX','de Resistencia a la escarcha',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70569','esMX','de Resistencia a las sombras',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70570','esMX','de Reprensión',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70571','esMX','de Cruzado',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70572','esMX','Sin Aura',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70573','esMX','Veneno entorpecedor',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70574','esMX','Veneno instantáneo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70575','esMX','Veneno mortal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70576','esMX','Veneno hiriente',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70577','esMX','Veneno de aturdimiento mental',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70578','esMX','Veneno anestésico',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70579','esMX','Nada',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70580','esMX','Lengua de fuego',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70581','esMX','Estigma de escarcha',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70582','esMX','Viento furioso',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70583','esMX','Vida terrestre',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70584','esMX','Necesito tus servicios',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70585','esMX','Tienes demasiados bots',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70586','esMX','Quieres contratar a ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70587','esMX',' está ocupado en este momento, vuelve a intentarlo más tarde.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70588','esMX','Un placer hacer negocios contigo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70589','esMX','Guerreros',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70590','esMX','Paladines',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70591','esMX','Magos',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70592','esMX','Sacerdotes',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70593','esMX','Brujos',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70594','esMX','Druidas',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70595','esMX','Caballeros de la Muerte',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70596','esMX','Picaros',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70597','esMX','Chamanes',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70598','esMX','Cazadores',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70599','esMX','Blademasters',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70600','esMX','Destroyers',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70601','esMX','Archmagi',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70602','esMX','Dreadlords',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70603','esMX','Spell Breakers',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70604','esMX','Dark Rangers',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70605','esMX','Guerrero',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70606','esMX','Paladin',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70607','esMX','Mago',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70608','esMX','Sacerdote',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70609','esMX','Brujo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70610','esMX','Druida',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70611','esMX','Caballero de la Muerte',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70612','esMX','Picaro',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70613','esMX','Chaman',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70614','esMX','Cazador',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70615','esMX','Blademaster',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70616','esMX','Destroyer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70617','esMX','Archmage',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70618','esMX','Dreadlord',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70619','esMX','Spell Breaker',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70620','esMX','Dark Ranger',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70621','esMX','Hombre',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70622','esMX','Mujer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70623','esMX','Humano',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70624','esMX','Orco',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70625','esMX','Enano',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70626','esMX','Elfo de la noche',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70627','esMX','No-muerto',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70628','esMX','Tauren',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70629','esMX','Gnomo',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70630','esMX','Troll',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70631','esMX','Elfo de sangre',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70632','esMX','Draenei',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70633','esMX','Unknown',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70634','esMX','Saquear',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70635','esMX','|cff9d9d9dBasura|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70636','esMX','|cffffffffComún|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70637','esMX','|cff1eff00Poco común|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70638','esMX','|cff0070ddRaro|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70639','esMX','|cffa335eeÉpico|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70640','esMX','|cffff8000Legendario|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70641','esMX','Elige un comprtamineto',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70642','esMX','Retrasa el ataque a',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70643','esMX','Retrasa la sanación a',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70644','esMX','s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70645','esMX','Off-Tank',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70646','esMX','Necromancers',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70647','esMX','Necromancer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70648','esMX','Ángulo de ataque',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70649','esMX','Normal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70650','esMX','Evitar AOE frontal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70652','esMX','¿Estás seguro de que esto va a funcionar? Más vale que sea la mejor agua del mundo...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70653','esMX','Parece que realmente te vendría bien un trago de agua fresca.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70654','esMX','Brujas del mar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70655','esMX','Bruja de mar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70656','esMX','Maná por daño',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70657','esMX','Daño por maná',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70658','esMX','Transfiguración...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70659','esMX','DESACTIVAR el posicionamiento de combate',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70660','esMX','Objetivo prioritario',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);\n"
  },
  {
    "path": "SQL/locales/frFR/npc_text_locale_frFR.sql",
    "content": "-- French\nDELETE FROM `npc_text_locale` WHERE `Locale`='frFR' AND `ID` BETWEEN '70000' AND '71000';\n\nINSERT INTO `npc_text_locale` (`ID`, `Locale`, `Text0_0`, `Text0_1`, `Text1_0`, `Text1_1`, `Text2_0`, `Text2_1`, `Text3_0`, `Text3_1`, `Text4_0`, `Text4_1`, `Text5_0`, `Text5_1`, `Text6_0`, `Text6_1`, `Text7_0`, `Text7_1`) VALUES \n('70001','frFR','Je ne vis que pour servir le maître.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70002','frFR','Tu as besoin de quelque chose ?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70003','frFR','Mortels… d’ordinaire, je tue les misérables comme toi sur-le-champ.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70004','frFR','<Vous voyez ce qui est censé être un Destructeur d’Obsidienne. Celui-ci semble toutefois différent, endommagé et terni, et ne réagit pas à votre présence. Vous vous souvenez que le Fléau a utilisé ses propres versions de ces créatures à un moment donné dans le passé. Comment diable est-il arrivé ici ? Après un examen plus approfondi, vous remarquez une ouverture sur le dos de la créature.>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70005','frFR','<Le Destructeur d’Obsidienne vous fixe et émet un grondement sourd.>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70006','frFR','Es-tu surpris, mortel ? En tant que nathrezim mineur, je dois me résoudre à chercher des alliés. Tu as au moins l’air de pouvoir m’amuser.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70007','frFR','Qu’y a-t-il, maintenant, mortel ?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70008','frFR','Peux-tu me laisser tranquille ? <sigh>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70009','frFR','Et maintenant ?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70010','frFR','<Vous voyez une matriarche naga émaciée. Elle semble fatiguée et faible, et évite de vous regarder.>$B$BÉ-é-épargne tes paroles, mortel...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70011','frFR','Est-ce que je me suis ébouriffé ? <Elle remet en place sa “chevelure”>$B…Non, ce n\\'est pas ça. Alors, de quoi s\\'agit-il ?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70012','frFR','<Le Seigneur des Cryptes meurtri se tient devant vous, il est manifestement hors de contrôle. Privé de maître, ce puissant seigneur nerubien mort-vivant a perdu l\\'essentiel de son pouvoir.>$B$BQue sera-t-il, petite créature ? Ta chair conviendra comme tant d\\'autres…',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70013','frFR','Je dévore les vivants et les morts.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70101','frFR','|cffff3300Blademaster|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\"Un épéiste d\\'élite, ancien membre du clan Burning Blade, désormais combattant d\\'élite au sein de la Horde\".$B$BAttribut principal : Agilité.$B$BMarche des Ténèbres (Windwalk). Permet au Maître-lame de devenir invisible et de se déplacer plus vite pendant un temps donné. Lorsqu\\'il attaque une unité pour rompre l\\'invisibilité, il inflige des dégâts bonus.$B$BImage Miroir. Confond l\\'ennemi en créant des illusions du Maître-lame et dissipe toute magie le concernant.$B$BCoup Critique (passif). Confère 15 % de chances d\\'infliger des dégâts critiques ×2(×3,×4) fois les dégâts normaux lors de ses attaques.$B$BTempête de Lames (NIY). Octroie une immunité à la magie et inflige des dégâts à tous les ennemis alentour.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70102','frFR','|cff9900ccObsidian Destroyer|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B« Une monstruosité ailée d\\'obsidienne à la faim insatiable pour la magie ». $B$BArmure élevée, résistances très élevées, partiellement immunisé à la magie, perd du mana au fil du temps et ne bénéficie pas des effets de régénération passive, armure maille/plaques, double maniement de baguettes, inflige des dégâts d’ombre magique, pas d\\'attaque physique, ne peut pas attaquer les ennemis hors de son champ frontal en mouvement, bonus de puissance magique : 50 % de puissance d\\'attaque + 200 % d\\'intelligence + dégâts des baguettes.$B$BDévorer la Magie. Dissipe jusqu\\'à 2 effets magiques des ennemis, jusqu\\'à 2 effets magiques et 2 malédictions des alliés et unités invoquées hostiles dans un rayon de 20 m. Chaque effet dissipé restaure 20 % de mana et 5 % de vie, temps de recharge de 7 s.$B$BPoussée Sombre. Attaque renforcée infligeant des dégâts de zone accrus.$B$BDrain de Mana. Vide tout le mana (dans les limites de la réserve de l\\'incantateur) d\\'une unité alliée aléatoire.$B$BRestauration de Mana. Revigore les membres du groupe et du raid dans un rayon de 25 m en leur restituant 3 % de leur mana maximal, au prix du mana de l\\'incantateur, temps de recharge de 3 s.$B$BAura Régénératrice. Soigne les membres du groupe et du raid dans un rayon de 25 m en leur restituant 3 % de leur vie maximale, au prix du mana de l\\'incantateur, temps de recharge de 3 s.$B$BArmure d\\'Ombre (passif). Restaure du mana égal à un pourcentage des dégâts subis.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70103','frFR','|cff0000ddArchmage|r$b|cffdd6600-=Warcraft III tribute=-|r$B$BRéduction des dégâts des sorts subis de 35 %, partiellement immunisé aux effets de contrôle, armure en tissu, inflige des dégâts de feu/givre magique, pas d\\'attaque physique, bonus de puissance des sorts : 100 % d\\'intelligence. Attribut principal : Intelligence.$B$BBlizzard. Votre blizzard habituel, juste un peu plus puissant, temps de recharge de 6 s.$B$BInvocation d\\'Élémentaire d\\'Eau. Invoque un élémentaire d\\'eau pour attaquer les ennemis de l\\'archimage pendant 1 min, temps de recharge de 20 s.$B$BAura de Brillance. Augmente le mana maximum de 10 % et augmente grandement la régénération de mana des membres du groupe et du raid dans un rayon de 40 m.$B$BTéléportation de Masse. NIY.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70104','frFR','|cff9900ccDreadlord|r$b|cffdd6600-=Warcraft III tribute=-|r$B$BDémon incroyablement puissant maniant le pouvoir des ténèbres et la domination mentale.$B$BArmure élevée, résistances élevées, partiellement immunisé aux effets de contrôle, les dégâts subis accélèrent le rechargement des sorts, armure en plaques, inflige des dégâts de mêlée et d\\'ombre magique, bonus de dégâts contre les cibles incapables, bonus de puissance des sorts : 200 % de force. Attribut principal : Force.$B$BCarrion Swarm. Envoie une horde de chauves-souris mêlées à une magie chaotique infligeant des dégâts dans un très large cône frontal, ne peut pas infliger de critiques, temps de recharge : 10 s.$B$BSleep. Endort la cible pendant 60 s et permet à la prochaine attaque physique de passer outre \\'’armure ; les dégâts directs réveillent la cible, temps de recharge : 6 s.$B$BVampiric Aura. Augmente les dégâts critiques physiques de 5 % et soigne les membres du groupe et du raid dans un rayon de 40 m d’un pourcentage des dégâts infligés par les attaques physiques et Carrion Swarm (100 % pour le Dreadlord et 25 % pour les autres), sans générer de menace.$B$BSummon Infernal Servant. Invoque un serviteur infernal depuis le ciel infligeant des dégâts et étourdissant les unités ennemies ; l\\'infernal est très résistant à la magie et dure 180 s, temps de recharge : 180 s.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70105','frFR','|cff0000ddSpell Breaker|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B« Un guerrier elfe entraîné à perturber et tordre les énergies magiques ».$B$BLes dégâts des sorts subis sont réduits de 75 %, partiellement immunisé aux effets de contrôle, pénalité d\\'armure : -30 %, armure maille/plaques, inflige des dégâts de mêlée/arcane, bonus de puissance des sorts : 200 % de force. Attribut principal : Force.$B$BVol de Magie (Spellsteal). Vole un sort bénéfique à un ennemi pour l\\'appliquer à un allié proche ou retire un sort négatif d\\'un allié pour l\\'appliquer à un ennemi proche, affecte magie et malédictions, temps de recharge : 2 s.$B$BRéaction (passif). Les attaques de mêlée réussies brûlent le mana de la cible égal aux dégâts infligés (augmentés par la puissance des sorts), infligeant des dégâts d\\'arcane. Si le mana de la cible est épuisé, les attaques de mêlée du Spell Breaker infligent le triple de dégâts avec une chance de coup critique accrue. Si la cible n\\'a pas de mana, le Spell Breaker gagne un mana égal à 25 % des dégâts infligés.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70106','frFR','|cff9900ccDark Ranger|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B« Une ancienne ranger de Quel\\'Thalas ressuscitée de force ».$B$BRéduction des dégâts des sorts subis de 35 %, mort-vivant, partiellement immunisé aux effets de contrôle, armure en cuir/toile, inflige des dégâts physiques/ombre magique, reste dans l\\'ombre sans générer de menace, bonus de puissance des sorts : 50 % d\\'intelligence. Attribut principal : Agilité.$B$BSilence. Fait taire une cible et jusqu\\'à 4 cibles proches pendant 8 s, temps de recharge : 15 s.$B$BFlèche Noire. Tire une flèche maudite infligeant 150 % de dégâts d\\'arme et des dégâts d\\'ombre supplémentaires sur la durée. Si la cible meurt sous les coups de la Dark Ranger, un serviteur sombre naît de son cadavre (maximum 5, durée 80 s, n\\'affecte que les humanoïdes, bêtes et draconiens). Inflige cinq fois plus de dégâts si la cible est sous 20 % de vie.$B$BDrain de Vie. Absorbe la vie d\\'une cible chaque seconde pendant 5 s, soignant la Dark Ranger de 200 % de la quantité absorbée.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70107','frFR','|cff9900ccNecromancer|r$b|cffdd6600-=Warcraft III / Diablo II tribute=-|r$B$BRéduction des dégâts des sorts subis de 20 %, partiellement immunisé aux effets de contrôle, armure en tissu, inflige des dégâts d\\'ombre magique, pas d\\'attaque physique, bonus de puissance des sorts : 100 % d\\'intelligence. Attribut principal : Intelligence.$B$BRaise Dead. Fait surgir 2 Squelettes d\\'un cadavre (maximum 6 Squelettes, durée 65 s, n\\'affecte que les humanoïdes, bêtes et draconiens).$B$BUnholy Frenzy. Augmente la vitesse d\\'attaque mêlée de la cible de 75 %, mais draine constamment sa vie. Dure 45 s. Ne peut pas être annulé. Débloqué au niveau 30.$B$BCorpse Explosion. Fait exploser un cadavre, infligeant des dégâts égaux à 35 %–75 % de la vie maximale de l’unité morte (selon le niveau du nécromancien) à tous les ennemis alentour. Ces dégâts ne génèrent pas de menace. Débloqué au niveau 40.$B$BCripple. Réduit la vitesse de déplacement, la vitesse d\\'attaque mêlée et la force totale de la cible de 50 % pendant 60 s. Débloqué au niveau 50.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70108','frFR','|cff0000ddSea Witch|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B« Une vicieuse créature écailleuse des océans souvent associée à l\\'arrivée de tempêtes prodigieuses ».$B$BRéduction des dégâts des sorts subis de 30 %, partiellement immunisée aux effets de contrôle, armure en tissu, inflige des dégâts physiques/glace/orage magique, bonus de puissance d\\'attaque : agilité ×2, bonus de puissance des sorts : 200 % d\\'intelligence. Attribut principal : Intelligence.$B$BForked Lightning. Éclair Fourchu. Convoque un cône de foudre pour endommager les ennemis. Frappe de 2 jusqu\\'à toutes les cibles (selon le niveau de la Sea Witch\\'s), les étourdissant pendant 2 s. Ces dégâts ne génèrent pas de menace.$B$BFrost Arrows. Flèches de Givre. Imprègne les flèches de glace pour des dégâts supplémentaires, ralentissant la vitesse de déplacement, d\\'attaque et d\\'incantation de 30 % à 70 % (selon le niveau).$B$BMana Shield. Bouclier de Mana. Crée un bouclier absorbant 100 % des dégâts entrants (non atténués) en utilisant le mana de la Sea Witch. L\\'efficacité varie de 1 dégât pour 10 mana à 10 dégâts pour 1 mana (selon le niveau).$B$BTornado. Tornade. Invoque une tornade féroce infligeant des dégâts et ralentissant les unités ennemies proches, parfois les incapacitant complètement. La tornade grandit en extérieur, augmentant dégâts et zone d\\'effet, mais rétrécit en intérieur, se dissipant rapidement. Débloqué au niveau 60.$B$BNaga (Passive). Naga (passif). Vitesse de nage, dégâts et chances d\\'esquive grandement augmentés dans l\\'eau.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70109','frFR','|cff9900ccCrypt Lord|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B« Ancien béhémoth, autrefois l\\'un des rois d\\'Azjol-Nerub, désormais monstre mort-vivant parmi les guerriers les plus puissants du Roi-Liche ».$B$BArmure très élevée, résistances accrues, partiellement immunisé aux effets de contrôle, immunisé aux poisons, armure maille/plaques, inflige des dégâts de mêlée/ombre magique, bonus de puissance des sorts : 200 % de force. Attribut principal : Force.$B$BImpale. Le Crypt Lord frappe le sol de ses griffes massives, projetant des pointes en cône frontal, infligeant des dégâts et propulsant les unités ennemies dans les airs, les étourdissant. Débloqué au niveau 20.$B$BSpiked Carapace. L\\'armure chitineuse du Crypt Lord augmente la résistance aux dégâts et renvoie de 15 % à 50 % des dégâts infligés par les attaquants de mêlée.$B$BCarrion Beetles. Le Crypt Lord engendre un Scarabée de Charogne à partir d\\'un cadavre frais pour attaquer ses ennemis. Les scarabées sont permanents mais ne régénèrent pas de vie et seuls 6 peuvent être contrôlés simultanément. Les niveaux supérieurs permettent d\\'invoquer des scarabées plus puissants. Débloqué au niveau 10.$B$BLocust Swarm. Le Crypt Lord libère une nuée de 20 à 40 criquets enragés (selon son niveau) qui mordent et lacèrent les unités ennemies proches, réduisant leur capacité à se déplacer ou attaquer. En mastiquant la chair ennemie, ils la transforment en une substance qui restaure des points de vie au Crypt Lord à leur retour. Débloqué au niveau 40.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70201','frFR','Il y a toujours des types prêts à tuer pour de l\\'\\'argent.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70202','frFR','Les mercenaires sont toujours en demande. Voici ce qui est disponible pour le moment.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70203','frFR','Les mercenaires sont toujours en demande. Voici ce qui est disponible pour le moment.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70204','frFR','On dirait qu\\'il n\\'y a personne de disponible pour le moment, réessaye plus tard.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70300','frFR','Meurs !',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70301','frFR','Je te ressuscite',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70302','frFR','Ressuscite',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70303','frFR','ton bot',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70304','frFR','du bot',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70305','frFR','Je ne peux pas encore invoquer d\\'\\'eau.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70306','frFR','Je ne peux pas encore invoquer de nourriture.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70307','frFR','Je ne peux pas le faire maintenant.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70308','frFR','Tiens...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70309','frFR','Désactivé',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70310','frFR','Pas encore prêt',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70311','frFR','Type d\\'\\'objet invalide',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70312','frFR','Échec',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70313','frFR','Terminé',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70314','frFR','Je ne suis pas métamorphosé.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70315','frFR','Je n\\'ai pas de pierre de vie.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70316','frFR','Je ne peux pas encore créer de pierres de vie !',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70317','frFR','WTF, je n\\'ai pas de crochetage !',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70318','frFR','Mon niveau de compétence n\\'\\'est pas assez élevé.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70319','frFR','Changement de spécialisation vers',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70320','frFR','Armes',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70321','frFR','Fureur',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70322','frFR','Protection',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70323','frFR','Vengeance',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70324','frFR','Maîtrise des bêtes',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70325','frFR','Précision',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70326','frFR','Survie',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70327','frFR','Assassinat',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70328','frFR','Combat',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70329','frFR','Finesse',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70330','frFR','Discipline',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70331','frFR','Sacré',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70332','frFR','Ombre',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70333','frFR','Sang',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70334','frFR','Givre',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70335','frFR','Impie',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70336','frFR','Élémentaire',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70337','frFR','Amélioration',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70338','frFR','Restauration  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70339','frFR','Arcane  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70340','frFR','Feu  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70341','frFR','Affliction  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70342','frFR','Démonologie  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70343','frFR','Destruction  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70344','frFR','Équilibre  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70345','frFR','Combat farouche  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70346','frFR','Inconnu  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70347','frFR','Va-t-en, lâche !  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70348','frFR',' n\\'est pas convaincu  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70349','frFR','Je ne vais pas perdre mon temps pour n\\'importe quoi  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70350','frFR','NIY  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70351','frFR','NIY  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70352','frFR','NIY  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70353','frFR','Je suis prêt  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70354','frFR','Va-t-en. Je sers mon maître   ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70355','frFR','inconnu  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70356','frFR',' sur vous !  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70357','frFR',' sur moi !  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70358','frFR',' sur   ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70359','frFR',' utilisé !  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70360','frFR','tank de bot  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70361','frFR','classe  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70362','frFR','joueur  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70363','frFR','maître  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70364','frFR','aucun  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70365','frFR','Rang  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70366','frFR','talent  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70367','frFR','passif  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70368','frFR','caché  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70369','frFR','connu  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70370','frFR','capacité  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70371','frFR','for  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70372','frFR','agi  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70373','frFR','end  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70374','frFR','int  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70375','frFR','spi  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70376','frFR','stat inconnue  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70377','frFR','total  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70378','frFR','Puissance d’attaque (mêlée)  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70379','frFR','Puissance d’attaque (à distance)  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70380','frFR','armure  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70381','frFR','coup critique  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70382','frFR','défense  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70383','frFR','raté  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70384','frFR','esquive  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70385','frFR','parade  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70386','frFR','blocage  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70387','frFR','valeur de blocage  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70388','frFR','dégâts subis (mêlée)  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70389','frFR','dégâts subis (sorts)  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70390','frFR','plage de dégâts (main droite)  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70391','frFR','multiplicateur de dégâts (main droite)  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70392','frFR','vitesse d’attaque (main droite)  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70393','frFR','plage de dégâts (main gauche)  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70394','frFR','multiplicateur de dégâts (main gauche)  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70395','frFR','vitesse d’attaque (main gauche)  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70396','frFR','plage de dégâts (à distance)  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70397','frFR','multiplicateur de dégâts (à distance)  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70398','frFR','vitesse d’attaque (à distance)  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70399','frFR','min  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70400','frFR','max  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70401','frFR','DPS  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70402','frFR','PV de base  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70403','frFR','PV totaux  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70404','frFR','mana de base  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70405','frFR','mana total  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70406','frFR','mana actuel  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70407','frFR','puissance des sorts  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70408','frFR','régénération de vie/5 bonus  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70409','frFR','régénération de mana/5 hors incantation  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70410','frFR','régénération de mana/5 en incantation  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70411','frFR','hâte  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70412','frFR','toucher  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70413','frFR','expertise  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70414','frFR','pénétration d’armure  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70415','frFR','pénétration des sorts  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70416','frFR','pourcentage  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70417','frFR','sacré  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70418','frFR','feu  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70419','frFR','nature',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70420','frFR','givre  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70421','frFR','ombre  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70422','frFR','arcane  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70423','frFR','résistance  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70424','frFR','états de commande  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70425','frFR','suivre  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70426','frFR','attaquer  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70427','frFR','rester  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70428','frFR','réinitialiser  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70429','frFR','arrêt complet  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70430','frFR','distance de suivi  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70431','frFR','Spécialisation  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70432','frFR','masque de rôles du bot (principal)  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70433','frFR','masque de rôles du bot (récolte)  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70434','frFR','tués en JcJ  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70435','frFR','joueurs  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70436','frFR','Mort   ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70437','frFR',' fois  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70438','frFR','{} (bot) se calme  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70439','frFR','<Debug>  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70440','frFR','Es-tu sûr de vouloir prendre le risque d\\'attirer l\\'attention de  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70441','frFR','?  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70442','frFR','<Inseérer Pièce>  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70443','frFR','Veux-tu tenter de pull  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70444','frFR','<Tenter de faire une offrande>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70445','frFR','Souhaites-tu engager  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70446','frFR','<Embaucher le  bot>  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70447','frFR','Gérer l\\'équipement...  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70448','frFR','Gérer les rôles...  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70449','frFR','Gérer la formation...  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70450','frFR','Gérer les capacités...  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70451','frFR','Gérer les talents...  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70452','frFR','Donner un consommable...  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70453','frFR','<Créer un groupe>  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70454','frFR','<Créer un groupe (tous les bots)>  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70455','frFR','<Ajouter au groupe>  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70456','frFR','<Ajouter tous les bots au groupe>  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70457','frFR','<Retirer du groupe>  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70458','frFR','Suis-moi  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70459','frFR','Tiens ta position  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70460','frFR','Reste ici et ne fais rien  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70461','frFR','J\\'ai besoin de nourriture  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70462','frFR','J\\'ai besoin d\\'eau  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70463','frFR','J\\'ai besoin d\\'une table de rafraîchissements  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70464','frFR','Aide-moi à crocheter une serrure  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70465','frFR','J\\'ai besoin de ta pierre de vie  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70466','frFR','J\\'ai besoin d\\'un puits d\\'âme  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70467','frFR','J\\'ai besoin que tu renouvelles les poisons  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70468','frFR','<Choisir le poison (main droite)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70469','frFR','<Choisir le poison (main gauche)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70470','frFR','J\\'ai besoin que tu renouvelles les enchantements  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70471','frFR','<Choisir l’enchantement (main droite)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70472','frFR','<Choisir l’enchantement (main gauche)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70473','frFR','J\\'ai besoin que tu retires la métamorphose  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70474','frFR','<Choisir le type de familier>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70475','frFR','Tu es renvoyé  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70476','frFR','Vas-tu abandonner   ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70477','frFR','Tu pourrais le regretter…  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70478','frFR','Ressaisis-toi, bordel  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70479','frFR','<Étudier la créature>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70480','frFR','Laisse tomber  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70481','frFR','dist  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70482','frFR','RETOURS',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70483','frFR','<Auto>  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70484','frFR','<Aucun>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70485','frFR','Aléatoire (Ruse)  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70486','frFR','Aléatoire (Férocité)  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70487','frFR','Aléatoire (Ténacité)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70488','frFR','Montre-moi ton inventaire  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70489','frFR','Équipement automatique  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70490','frFR','Main droite  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70491','frFR','Main gauche  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70492','frFR','À distance  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70493','frFR','Relique  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70494','frFR','Tête  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70495','frFR','Épaules  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70496','frFR','Torse  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70497','frFR','Taille  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70498','frFR','Jambes  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70499','frFR','Pieds  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70500','frFR','Poignets  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70501','frFR','Mains  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70502','frFR','Dos  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70503','frFR','Chemise  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70504','frFR','Doigt1  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70505','frFR','Doigt2  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70506','frFR','Bijou1  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70507','frFR','Bijou2  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70508','frFR','Cou  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70509','frFR','Déséquiper tout  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70510','frFR','Mettre à jour l\\'aspect visuel  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70511','frFR','visuel seulement  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70512','frFR','Équipé  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70513','frFR','rien  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70514','frFR','Utilise ton ancien équipement  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70515','frFR','Déséquipe-le  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70516','frFR','Hum... je n\\'ai rien à te donner  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70517','frFR','Récolte  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70518','frFR','État des capacités  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70519','frFR','Gérer les capacités autorisées  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70520','frFR','Utiliser  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70521','frFR','Mettre à jour  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70522','frFR','Dégâts  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70523','frFR','Contrôle  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70524','frFR','Soin  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70525','frFR','Autre  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70526','frFR','  produit un bruit de grincement et commence à te suivre   ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70527','frFR','{} ne te rejoindra pas tant qu\\'il ne sera pas renvoyé par le propriétaire  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70528','frFR','{} ne te rejoindra pas tant que tu n\\'auras pas atteint le niveau 60  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70529','frFR','{} ne te rejoindra pas tant que tu n\\'auras pas atteint le niveau 55  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70530','frFR','{} ne te rejoindra pas tant que tu n\\'auras pas atteint le niveau 40  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70531','frFR','{} ne te rejoindra pas tant que tu n\\'auras pas atteint le niveau 20  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70532','frFR','Tu dépasses le nombre maximal de bots NPC pour ton niveau ({})  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70533','frFR','Tu n\\'as pas assez d\\'argent  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70534','frFR','Tu ne peux pas avoir plus de bots de cette classe ! {} sur {}  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70535','frFR','Impossible de réinitialiser l\\'équipement à l\\'emplacement {} ({}) ! Impossible de renvoyer le bot !  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70536','frFR','actuel  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70537','frFR','Distance d\\'\\'attaque  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70538','frFR','Attaques à courte portée  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70539','frFR','Attaques à longue portée  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70540','frFR','Exact  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70541','frFR','Retirer le buff  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70542','frFR','Corrige ton type de pouvoir  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70543','frFR','Impossible de déséquiper {} pour une raison stupide ! Envoi par courrier  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70544','frFR','Tank  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70545','frFR','À distance  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70546','frFR','Mineur  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70547','frFR','Herboriste  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70548','frFR','Dépeceur  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70549','frFR','Ingénieur  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70550','frFR','La propriété du bot a expiré  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70551','frFR','Le système NpcBot est actuellement désactivé. Veuillez contacter l\\'administration.  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70552','frFR','{} ne vous rejoindra pas, a déjà un maître : {}  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70553','frFR','La banque est pleine  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70554','frFR','Aspect  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70555','frFR','Singe  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70556','frFR','Faucon  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70557','frFR','Guépard  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70558','frFR','Vipère  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70559','frFR','Bête  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70560','frFR','Meute  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70561','frFR','Sauvage  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70562','frFR','Faucon-dragon  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70563','frFR','Aucun Aspect  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70564','frFR','Aura  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70565','frFR','Dévotion  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70566','frFR','Concentration  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70567','frFR','Résistance au Feu  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70568','frFR','Résistance au Givre  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70569','frFR','Résistance à l\\'Ombre  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70570','frFR','Vengeance  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70571','frFR','Croisé  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70572','frFR','Aucune Aura  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70573','frFR','Handicapant  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70574','frFR','Instantané  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70575','frFR','Mortel  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70576','frFR','Blessure  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70577','frFR','Engourdissant  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70578','frFR','Anesthésiant  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70579','frFR','Rien  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70580','frFR','Langue-de-flammes  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70581','frFR','Marque du Givre  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70582','frFR','Fureur des Vents  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70583','frFR','Vie de la Terre  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70584','frFR','J\\'\\'ai besoin de vos services  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70585','frFR','Vous avez trop de bots  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70586','frFR','Souhaitez-vous engager   ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70587','frFR',' est un peu occupé en ce moment, réessayez plus tard.  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70588','frFR','Ravi de faire affaire avec vous  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70589','frFR','Guerriers  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70590','frFR','Paladins  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70591','frFR','Mages  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70592','frFR','Prêtres  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70593','frFR','Démonistes  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70594','frFR','Druides  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70595','frFR','Chevaliers de la Mort  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70596','frFR','Voleurs  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70597','frFR','Chamans  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70598','frFR','Chasseurs  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70599','frFR','Maîtres-lames  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70600','frFR','Destructeurs  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70601','frFR','Archimages  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70602','frFR','Seigneurs du Fléau  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70603','frFR','Brise-sort  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70604','frFR','Rangers sombres  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70605','frFR','Guerrier  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70606','frFR','Paladin  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70607','frFR','Mage  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70608','frFR','Prêtre  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70609','frFR','Démoniste  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70610','frFR','Druide  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70611','frFR','Chevalier de la Mort  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70612','frFR','Voleur  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70613','frFR','Chaman  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70614','frFR','Chasseur  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70615','frFR','Maître-lame  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70616','frFR','Destructeur  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70617','frFR','Archimage  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70618','frFR','Seigneur du Fléau  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70619','frFR','Brise-sort  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70620','frFR','Ranger sombre  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70621','frFR','Masculin  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70622','frFR','Féminin  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70623','frFR','Humain  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70624','frFR','Orc  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70625','frFR','Nain  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70626','frFR','Elfe de la Nuit  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70627','frFR','Mort-vivant  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70628','frFR','Tauren  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70629','frFR','Gnome  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70630','frFR','Troll  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70631','frFR','Elfe de sang  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70632','frFR','Draeneï  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70633','frFR','Inconnu  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70634','frFR','Pillage  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70635','frFR','|cff9d9d9dMédiocre|r  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70636','frFR','|cffffffffCommun|r  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70637','frFR','|cff1eff00Non commun|r  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70638','frFR','|cff0070ddRare|r  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70639','frFR','|cffa335eeÉpique|r  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70640','frFR','|cffff8000Légendaire|r  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70641','frFR','Comportement d\\'engagement  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70642','frFR','Retarder l\\'attaque de  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70643','frFR','Retarder la guérison de  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70644','frFR','s  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70645','frFR','Off-Tank  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70646','frFR','Nécromanciens  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70647','frFR','Nécromancien  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70648','frFR','Angle d\\'attaque  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70649','frFR','Normal  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70650','frFR','Éviter la zone d\\'effet frontale  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70651','frFR','NIY  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70652','frFR','Es-tu sûr que ça va marcher ? Ça doit être la meilleure eau du monde...  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70653','frFR','Il semble que tu pourrais vraiment avoir besoin d\\'une gorgée d\\'eau fraîche.  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70654','frFR','Sorcières des Mers  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70655','frFR','Sorcière des Mers  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70656','frFR','Mana par dégât  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70657','frFR','Dégât par mana  ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70658','frFR','Transmogrification...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70659','frFR','Désactiver le positionnement de combat',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70660','frFR','Cible prioritaire',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70661','frFR','Banque d’équipement du bot...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70662','frFR','Déposer des objets...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70663','frFR','Retirer des objets...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70664','frFR','La banque est vide',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70665','frFR','Page précédente',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70666','frFR','Page suivante',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70667','frFR','Voulez-vous vraiment dépenser tout cet argent pour faire bouger à nouveau le Seigneur des Cryptes ?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70668','frFR','Je doute de ta capacité à faire beaucoup de mal dans ton état actuel, mais je suis prêt à te guider et à t\\'aider à restaurer tes pouvoirs.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70669','frFR','Crypt Lords',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70670','frFR','Crypt Lord',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70671','frFR','Renvoi',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70672','frFR','Sauterelles',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70673','frFR','Seuil de santé de la cible',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70674','frFR','J\\'ai besoin d\\'un portail',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70675','frFR','Hurlevent',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70676','frFR','Forgefer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70677','frFR','Darnassus',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70678','frFR','Exodar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70679','frFR','Orgrimmar',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70680','frFR','Fossoyeuses',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70681','frFR','Les Pitons-du-Tonnerre',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70682','frFR','Lune d\\'Argent',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70683','frFR','Shattrath',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70684','frFR','Dalaran',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70685','frFR','Vous dépassez le nombre maximal de npcbots pour votre compte ({} >= {})',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70686','frFR','<Définir pour tous les bots>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70687','frFR','(banque d’équipement)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70688','frFR','Pas assez d\\'espace dans la banque d\\'équipement pour stocker %u objet(s) (%u / %u) !',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70689','frFR','Ensembles d’équipement',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70690','frFR','Créer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70691','frFR','Supprimer',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70692','frFR','Equiper',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70693','frFR','manquant',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);\n"
  },
  {
    "path": "SQL/locales/ruRU/npc_text_locale.sql",
    "content": "DELETE FROM `npc_text_locale` WHERE `Locale`='ruRU' AND `ID` BETWEEN '70000' AND '71000';\nINSERT INTO `npc_text_locale` (`ID`, `Locale`, `Text0_0`, `Text0_1`, `Text1_0`, `Text1_1`, `Text2_0`, `Text2_1`, `Text3_0`, `Text3_1`, `Text4_0`, `Text4_1`, `Text5_0`, `Text5_1`, `Text6_0`, `Text6_1`, `Text7_0`, `Text7_1`)\nVALUES\n('70001','ruRU','Я живу только для того, чтобы служить хозяину!','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70002','ruRU','Тебе что-то нужно?','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70003','ruRU','Смертные... обычно я убиваю тварей вроде тебя как только увижу!','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70004','ruRU','<Перед вами, похоже, обсидиановый разрушитель. Этот, впрочем, выглядит иначе, поврежденный и поблекший, он не реагирует на ваше присутствие. Вам помнится Плеть когда-то давно использовала таких. Как, черт возьми, он оказался здесь? При дальнейшем осмотре вы замечаете щель на его спине.>','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70005','ruRU','<Обсидиановый Разрушитель смотрит на вас и издает глубокий рычащий звук.>','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70006','ruRU','Ты удивлен, смертный? Как низший натрезим, я вынужден прибегать к поиску союзников. Ты выглядишь так, будто сможешь меня хотя бы развлечь.','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70007','ruRU','Ну что ещё, смертный?','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70008','ruRU','Ты можешь просто оставить меня в покое? <вздох>','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70009','ruRU','Что теперь?','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70010','ruRU','<Вы видите истощенную предводительницу наг. Она выглядит усталой и слабой, и пытается не смотреть на вас.>$B$BНе нуж-жно с-с-слов, с-с-смертный...','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70011','ruRU','У меня опять что-то не так с-с причёс-ской? <Она расчесывает свои \"волосы\">$B... Нет, вс-сё в порядке. Так в чём же дело?','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70101','ruRU','|cffff3300Мастер Клинка|r$b|cffdd6600-=отсылка к Warcraft III=-|r$B$B\"Элитный мечник, бывший член клана Пылающего Клинка, ныне элитный воин ​​Орды\".$B$BОсновная характеристика: Ловкость.$B$BПуть Пустоты (Прогулка с ветром). Позволяет Мастеру клинка становиться невидимым и двигаться быстрее в течение определенного времени. Если Мастер клинка атакует врага, выходя из невидимости, он наносит дополнительный урон.$B$BЗеркальное изображение. Сбивает противника с толку, создавая иллюзию Мастера клинка и рассеивая всю магию Мастера клинка.$B$BКритический удар (пассивный). Дает 15% шанс нанести критический урон в 2(3,4) раза больше обычного при атаках.$B$BВихрь клинков (NIY). Дает иммунитет к магии и наносит урон всем окружающим врагам.$B$B','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70102','ruRU','|cff9900ccОбсидиановый Разрушитель|r$b|cffdd6600-=отсылка к Warcraft III=-|r$B$B\"Крылатое чудовище из обсидиана, обладающее ненасытной жаждой магии\".$B$BКрепкая броня, очень высокое сопротивление, частичный иммунитет к магии, постоянно теряет ману, пассивные эффекты регенерации маны для него бесполезны, кольчужная/латная броня, использует жезлы в обоих руках, наносит урон темной магией, нет физической атаки, не может атаковать во время перемещения, бонус к силе заклинаний: 50% силы атаки + 200% интеллекта + урон жезлов.$B$BПожирание магии. Снимает до 2 магических эффектов с врагов, до 2 магических эффектов и до 2 проклятий с союзников и наносит урон призванным юнитам в радиусе 20 м. Каждый развеянный эффект восстанавливает 20% маны и 5% здоровья, время восстановления 7 секунд.$B$BТеневой взрыв. Усиленная атака, наносящая повышенный урон по площади.$B$BВытягивание маны. Вытягивает всю ману (ограниченную запасом маны заклинателя) из случайного дружественного юнита.$B$BПополнить запасы маны. Восполняет манну окружающим участникав группы и рейда в радиусе 25 ярдов на 3% от их максимального запаса, сводя на нет ману заклинателя, время восстановления 3 секунды.$B$BАура восстановления. Исцеляет окружающих членов группы и рейда в радиусе 25 м на 3% от их максимального запаса здоровья, сводя на нет ману заклинателя, время восстановления 3 секунды.$B$BТемная броня (пассивная). Восстанавливает ману в размере процента от полученного урона.$B$B','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70103','ruRU','|cff0000ddАрхимаг|r$b|cffdd6600-=отсылка к Warcraft III=-|r$B$B Получаемый урон от заклинаний уменьшен на 35%, частично невосприимчив к эффектам контроля, тканевая броня, наносит урон от магии огня/льда, нет физической атаки, бонус к силе заклинаний: 100% интеллекта. Основная характеристика: Интеллект.$B$BСнежная буря. Обычная снежная буря, только немного мощнее, время восстановления 6 секунд.$B$BПризыв элементаля воды. Призывает элементаля воды, который атакует врагов архимага. Время восстановления: 1 мин., 20 сек.$B$BАура великолепия. Увеличивает максимальный запас маны на 10% и значительно увеличивает регенерацию маны участников группы и рейда в радиусе 40 м.$B$BM Массовая телепортация. NIY.$B$B','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70104','ruRU','|cff9900ccПовелитель Ужаса|r$b|cffdd6600-=отсылка к Warcraft III=-|r$B$B\"Невероятно могущественный демон, владеющий силами тьмы и управления разумом\".$B$BКрепкая броня, высокое сопротивление, частичная невосприимчивость к эффектам контроля, получаемый урон ускоряет перезарядку заклинаний, латная броня, наносит урон в ближнем бою а также урон от темной магии, дополнительный урон по целям выведенным из равновесия, бонус к силе заклинаний: 200% силы. Основная характеристика: Сила.$B$BТемная Стая. Посылает стаю летучих мышей наносящих урон от магии в конусе перед собой, не может нанести критический урон, время восстановления 10 секунд.$B$BСон. Погружает вражескую цель в сон на 60 секунд и позволяет при наненсения урона следующей физической атаке этой цели игнорировать ее броню, нанесенный прямой урон пробудит цель, время восстановления 6 секунд.$B$BАура вампиризма. Увеличивает физический критический урон на 5% и исцеляет членов группы и рейда в радиусе 40 м в процентном соотношении (100% для Повелителя ужаса и 25% для всех остальных) от урона, нанесенного физическими атаками в ближнем бою и Темной Стаей, без угрозы.$B$BПризыв Инфернала. Призывает инфернала с неба на 180 секунд, нанося урон и оглушая врагов, инфернал очень устойчив к магии, время восстановления 180 секунд.$B$B','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70105','ruRU','|cff0000ddРазрушитель Заклинаний|r$b|cffdd6600-=отсылка к Warcraft III=-|r$B$B\"Эльфийский воин, специально обученный разрушать и искажать магию\".$B$BУрон, получаемый от заклинаний, уменьшен на 75%, частично невосприимчив к эффектам контроля, штраф за броню -30%, кольчужная/латная броня, наносит урон в ближнем бою и урон от тайной магии, бонус к силе заклинаний: 200% силы. Основная характеристика: Сила.$B$BПохищение Магии. Похищает полезное заклинание у врага и передаёт его ближайшему союзнику или снимает отрицательное заклинание с союзника на ближайшего врага, влияет на эффекты магии и проклятия, время восстановления 2 секунды.$B$BСожжение Маны (пассивная). Успешные атаки ближнего боя сжигают ману цели, равную нанесенному урону (увеличенному силой заклинаний), нанося урон от тайной магии. Если мана цели исчерпана, атаки ближнего боя Разрушителя Заклинаний будут наносить тройной урон с повышенным шансом критического удара. Если у цели нет маны, Разрушитель Заклинаний восполнит ману в количестве 25% от нанесенного урона.$B$B','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70106','ruRU','|cff9900ccТемная Охотница|r$b|cffdd6600-=отсылка к Warcraft III=-|r$B$B\"Бывшая охотница Кель\\'Таласа, насильно возвращённая из мира мёртвых\".$B$B Получаемый урон от заклинаний уменьшен на 35%, нежить, частично невосприимчива к эффектам контроля, кожаная/тканевая броня, наносит физический урон/урон от темной магии, придерживается теней и не генерирует угрозы, бонус к силе заклинаний: 50% интеллекта. Основное характеристика: Ловкость.$B$BБезмолвие. Заставляет врага и до 4 его ближайших друзей замолчать на 8 секунд, теряя возможность применять заклинания, время восстановления 15 секунд.$B$BЧерная стрела. Выпускает проклятую стрелу, наносящую 150% урона от оружия и дополнительный урон от темной магии каждые несколько секунд. Если цель умирает от урона Темной Охотницы, она превратится в Тёмного Приспешника (максимум 5 приспешников, продолжительность 80 секунд, срабатывает только на гуманоидах, зверях и драконах). Наносит пятикратный урон, если у цели меньше 20% здоровья.$B$Bпохищение Жизни. Высасывает здоровье врага каждую секунду в течение 5 секунд, исцеляя Темную Охотницу на 200% от похищенного количества.$B$B','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70107','ruRU','|cff9900ccНекромант|r$b|cffdd6600-=отсылка к Warcraft III / Diablo II=-|r$B$BПолучаемый урон от заклинаний уменьшен на 20%, частично невосприимчив к эффектам контроля, тканевая броня, наносит урон от темной магии, нет физической атаки, бонус к силе заклинаний: интеллект 100%. Основная характеристика: Интеллект.$B$BВоскрешение Мертвых. Поднимает 2 скелета из трупа (максимум 6 скелетов, продолжительность 65 секунд, работает только с гуманоидами, зверями и драконами).$B$BНечестивое Бешенство. Увеличивает скорость атаки цели в ближнем бою на 75%, но постоянно истощает здоровье. Длится 45 секунд. Не может быть отменено. Разблокируется на 30 уровне.$B$BВзрыв Трупа. Заставляет труп взорваться, нанося урон в размере от 35% до 75% от максимального здоровья мертвого существа (зависит от уровня Некроманта) всем окружающим врагам. Этот урон не генерирует угрозы. Разблокируется на 40 уровне.$B$BУвечье. Снижает скорость передвижения цели, скорость атаки в ближнем бою и общую силу на 50% на 60 секунд. Разблокируется на уровне 50.$B$B','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70108','ruRU','|cff0000ddМорская Ведьма|r$b|cffdd6600-=отсылка к Warcraft III=-|r$B$B\"Грозная колдунья наг, часто ассоциирующаяся с приходом ужасных штормов\".$B$BПолучаемый урон от заклинаний уменьшен на 30%, частично невосприимчив к эффектам контроля, тканевая броня, наносит физический урон/урон от магии льда, бонус к силе атаки: ловкость x2, бонус к силе заклинаний: 200% к интеллекту. Основная характеристика: Интеллект.$B$BРаздвоенная молния. Вызывает разветвлённую молнию, наносящую урон врагам. Поражает от 2 до всех целей (в зависимости от уровня Морской Ведьмы), оглушая их на 2 секунды. Этот урон не создает угрозы.$B$BЛедяные Стрелы. Наполняет стрелу магическим морозом для дополнительного урона, снижая скорость движения цели, скорость атаки и произнесения заклинаний на 30-70% (в зависимости от уровня Морской ведьмы).$B$BЩит Маны. Создает щит, который поглощает 100% входящего (не смягченного) урона, используя ману Морской Ведьмы. Эффект варьируется от 1 единицы урона за 10 единиц маны до 10 единиц урона за 1 единицу ману (в зависимости от уровня Морской Ведьмы).$B$BТорнадо. Вызывает яростный торнадо, который наносит урон и замедляет ближайших врагов, иногда полностью выводя их из строя. На открытом пространстве Торнадо со временем разрастается, увеличивая наносимый урон и область действия, но в закрытом помещении уменьшается и быстро рассеивается. Разблокируется на уровне 60.$B$BНага (пассивный эффект). Скорость плавания, урон и шанс уклонения значительно увеличиваются в воде.$B$B','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70201','ruRU','Всегда найдутся чуваки, готовые убить за деньги.','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70202','ruRU','Наёмники востребованы всегда. Вот кто доступен прямо сейчас.','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70203','ruRU','Наёмники востребованы всегда. Вот кто доступен прямо сейчас.','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70204','ruRU','Похоже сейчас никого нет, проверь позже.','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70300','ruRU','Умри!','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70301','ruRU','Воскрешаю тебя','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70302','ruRU','Воскрешаю ','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70303','ruRU','твой бот','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70304','ruRU',' бот','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70305','ruRU','Я пока не могу применить заклинание создания воды','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70306','ruRU','Я пока не могу применить заклинание создания еды','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70307','ruRU','Я не могу сделать это сейчас','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70308','ruRU','Во-о-от...','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70309','ruRU','Отключено','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70310','ruRU','Ещё не готово','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70311','ruRU','Неверный тип объекта','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70312','ruRU','Не удалось','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70313','ruRU','Готово','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70314','ruRU','Я не изменил форму','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70315','ruRU','У меня нет камня здоровья','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70316','ruRU','Я пока не могу создавать камни здоровья!','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70317','ruRU','WTF у меня нет отмычек!','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70318','ruRU','Мой уровень навыка недостаточно высок','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70319','ruRU','Меняю специализацию на ','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70320','ruRU','Оружие','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70321','ruRU','Неистовство','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70322','ruRU','Защита','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70323','ruRU','Воздаяние','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70324','ruRU','Повелитель зверей','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70325','ruRU','Стрельба','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70326','ruRU','Выживание','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70327','ruRU','Ликвидация','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70328','ruRU','Бой','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70329','ruRU','Скрытность','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70330','ruRU','Послушание','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70331','ruRU','Свет','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70332','ruRU','Тьма','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70333','ruRU','Кровь','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70334','ruRU','Лёд','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70335','ruRU','Нечестивость','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70336','ruRU','Стихии','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70337','ruRU','Совершенствование','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70338','ruRU','Исцеление','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70339','ruRU','Тайная магия','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70340','ruRU','Огонь','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70341','ruRU','Колдовство','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70342','ruRU','Демонология','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70343','ruRU','Разрушение','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70344','ruRU','Баланс','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70345','ruRU','Сила зверя','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70346','ruRU','Неизвестно','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70347','ruRU','Проваливай, слабак','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70348','ruRU',' не убеждён','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70349','ruRU','Я не собираюсь тратить свое время на всякую ерунду','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70353','ruRU','Я готов','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70354','ruRU','Уходи. Я служу своему хозяину ','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70355','ruRU','неизвестный','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70356','ruRU',' на тебя!','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70357','ruRU',' на себя!','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70358','ruRU',' на ','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70359','ruRU',' использовано!','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70360','ruRU','бот-танк','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70361','ruRU','класс','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70362','ruRU','игрок','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70363','ruRU','владелец','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70364','ruRU','никто','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70365','ruRU','Уровень','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70366','ruRU','талант','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70367','ruRU','пассивный','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70368','ruRU','скрытый','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70369','ruRU','изучен','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70370','ruRU','способность','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70371','ruRU','сила','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70372','ruRU','ловкость','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70373','ruRU','выносливость','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70374','ruRU','интеллект','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70375','ruRU','дух','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70376','ruRU','неизвестный стат','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70377','ruRU','всего','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70378','ruRU','Сила атаки ближний бой','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70379','ruRU','Сила атаки дальний бой','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70380','ruRU','броня','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70381','ruRU','крит','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70382','ruRU','защита','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70383','ruRU','промах','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70384','ruRU','уклонение','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70385','ruRU','парирование','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70386','ruRU','блок','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70387','ruRU','показатель блокирования','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70388','ruRU','Получаемый урон в ближнем бою','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70389','ruRU','Получаемый урон от заклинаний','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70390','ruRU','Разброс урона оружия в правой руке','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70391','ruRU','Множитель урона оружия в правой руке','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70392','ruRU','Скорость атаки оружием в правой руке','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70393','ruRU','Разброс урон оружия в левой руке','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70394','ruRU','Множитель урона оружия в левой руке','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70395','ruRU','Скорость атаки оружием в левой руке','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70396','ruRU','Разброс урона оружия дальнего боя','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70397','ruRU','Множитель урона оружия дальнего боя','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70398','ruRU','Скорость атаки оружием дальнего боя','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70399','ruRU','минимум','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70400','ruRU','максимум','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70402','ruRU','базовый уровень здоровья','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70403','ruRU','всего здоровья','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70404','ruRU','базовый уровень маны','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70405','ruRU','всего маны','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70406','ruRU','текущий запас маны','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70407','ruRU','сила заклинаний','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70408','ruRU','бонус регенерации здоровья_5','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70409','ruRU','регенерация маны_5 без использования заклинания','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70410','ruRU','регенерация маны_5 при использовании заклинания','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70411','ruRU','скорость','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70412','ruRU','меткость','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70413','ruRU','мастерство','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70414','ruRU','пробивание брони','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70415','ruRU','проникновение заклинаний','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70416','ruRU','проц.','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70417','ruRU','святлая магия','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70418','ruRU','магия огня','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70419','ruRU','силы природы','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70420','ruRU','магия льда','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70421','ruRU','темная магия','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70422','ruRU','тайная магия','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70423','ruRU','Сопротивление','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70424','ruRU','Состояния команд','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70425','ruRU','Следовать','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70426','ruRU','Атаковать','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70427','ruRU','Стоять','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70428','ruRU','Сброс','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70429','ruRU','Полная остановка','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70430','ruRU','Дистанция следования','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70431','ruRU','Специализация','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70432','ruRU','Маска ролей ботов (главная)','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70433','ruRU','Маска ролей ботов (сбор)','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70434','ruRU','PvP-убийства','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70435','ruRU','игроки','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70436','ruRU','Умер ','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70437','ruRU',' раз','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70438','ruRU','%s (бот) успокаивается','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70439','ruRU','<Отладка>','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70440','ruRU','Вы уверены, что хотите рискнуть, привлекая внимание ','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70441','ruRU','?','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70442','ruRU','<Вставить монету>','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70443','ruRU','Вы хотите приманить ','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70444','ruRU','<Попробовать сделать подношение>','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70445','ruRU','Вы хотите нанять ','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70446','ruRU','<Нанять бота>','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70447','ruRU','Снаряжение...','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70448','ruRU','Роли...','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70449','ruRU','Построение...','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70450','ruRU','Способности...','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70451','ruRU','Специализация...','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70452','ruRU','Дать использовать...','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70453','ruRU','<Создать группу>','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70454','ruRU','<Создать группу (все боты)>','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70455','ruRU','<Добавить в группу>','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70456','ruRU','<Добавить всех ботов в группу>','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70457','ruRU','<Удалить из группы>','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70458','ruRU','Следуй за мной','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70459','ruRU','Удерживай позицию','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70460','ruRU','Стой здесь и ничего не делай','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70461','ruRU','Мне нужна еда','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70462','ruRU','Мне нужна вода','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70463','ruRU','Мне нужен стол с едой','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70464','ruRU','Помоги мне взломать замок','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70465','ruRU','Мне нужен камень здоровья','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70466','ruRU','Мне нужен источник душ','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70467','ruRU','Мне нужно, чтобы ты обновил яды','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70468','ruRU','<Выберите яд (правая рука)>','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70469','ruRU','<Выберите яд (левая рука)>','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70470','ruRU','Мне нужно, чтобы ты обновил чары','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70471','ruRU','<Выберите чары (правая рука)>','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70472','ruRU','<Выберите чары (левая рука)>','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70473','ruRU','Мне нужно, чтобы ты вышел из формы','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70474','ruRU','<Выбрать тип питомца>','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70475','ruRU','Свободен отсюда','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70476','ruRU','Вы действительно хотите уволить ','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70477','ruRU','Вы можете пожалеть об этом...','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70478','ruRU','Соберись, тряпка','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70479','ruRU','<Рассмотреть существо>','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70480','ruRU','Ладно, не важно','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70481','ruRU','дист.','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70482','ruRU','НАЗАД','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70483','ruRU','<Авто>','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70484','ruRU','<Нет>','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70485','ruRU','Случайный (Хитрость)','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70486','ruRU','Случайный (Свирепость)','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70487','ruRU','Случайный (Упорство)','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70488','ruRU','Покажи мне свой инвентарь','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70489','ruRU','Автовыбор','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70490','ruRU','Правая рука','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70491','ruRU','Левая рука','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70492','ruRU','Дальний бой','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70493','ruRU','Реликвия','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70494','ruRU','Голова','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70495','ruRU','Плечи','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70496','ruRU','Грудь','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70497','ruRU','Пояс','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70498','ruRU','Ноги','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70499','ruRU','Ступни','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70500','ruRU','Запястья','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70501','ruRU','Кисти рук','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70502','ruRU','Спина','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70503','ruRU','Рубашка','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70504','ruRU','Палец1','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70505','ruRU','Палец2','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70506','ruRU','Аксессуар1','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70507','ruRU','Аксессуар2','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70508','ruRU','Шея','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70509','ruRU','Снять все','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70510','ruRU','Обновить внешний вид','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70511','ruRU','только внешний вид','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70512','ruRU','Надето','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70513','ruRU','ничего','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70514','ruRU','Используй свое старое cнаряжение','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70515','ruRU','Снять','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70516','ruRU','Хм... мне нечего тебе дать','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70517','ruRU','Сбор ингредиентов','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70518','ruRU','Статус способностей','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70519','ruRU','Разрешённые способности','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70520','ruRU','Используй ','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70521','ruRU','Обновить','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70522','ruRU','Урон','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70523','ruRU','Контроль','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70524','ruRU','Лечение','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70525','ruRU','Другое','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70526','ruRU',' издает скрежет и начинает следовать за ','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70527','ruRU','%s не присоединится к вам, пока владелец не уволит','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70528','ruRU','%s не присоединится к вам, пока вы не достигнете 60-го уровня','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70529','ruRU','%s не присоединится к вам, пока вы не достигнете 55-го уровня','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70530','ruRU','%s не присоединится к вам, пока вы не достигнете 40-го уровня','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70531','ruRU','%s не присоединится к вам, пока вы не достигнете 20-го уровня','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70532','ruRU','Вы превысили максимальное количество ботов (%u)','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70533','ruRU','У вас недостаточно денег','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70534','ruRU','У вас не может быть больше ботов этого класса! %u из %u','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70535','ruRU','Не удается сбросить снаряжение в слоте %u (%s)! Не могу уволить бота!','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70536','ruRU','сейчас','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70537','ruRU','Дистанция атаки','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70538','ruRU','Короткая дистанция','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70539','ruRU','Длинная дистанция','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70540','ruRU','Заданная','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70541','ruRU','Снять бафф','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70542','ruRU','Исправь тип энергии','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70543','ruRU','Не могу снять %s по какой-то идиотской причине! Отправляю по почте','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70544','ruRU','Танк','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70545','ruRU','Дальний бой','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70546','ruRU','Горное дело','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70547','ruRU','Травничество','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70548','ruRU','Снятие шкур','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70549','ruRU','Инженерное дело','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70550','ruRU','Срок владения ботом истек из-за бездействия','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70551','ruRU','Система NpcBot в данный момент отключена. Пожалуйста, обратитесь к администратору','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70552','ruRU','%s не присоединится к вам, уже есть владелец: %s','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70553','ruRU','%s не может присоединиться к вам: телепортируется','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70554','ruRU','Дух','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70555','ruRU','Обезьяна','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70556','ruRU','Ястреб','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70557','ruRU','Гепард','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70558','ruRU','Гадюка','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70559','ruRU','Зверь','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70560','ruRU','Стая','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70561','ruRU','Дикий','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70562','ruRU','Дракондор','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70563','ruRU','Нет духа','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70564','ruRU','Аура','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70565','ruRU','Благочестие','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70566','ruRU','Сосредоточенность','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70567','ruRU','Защита от огня','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70568','ruRU','Защита от магии льда','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70569','ruRU','Защита от темной магии','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70570','ruRU','Воздаяние','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70571','ruRU','Воин света','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70572','ruRU','Нет ауры','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70573','ruRU','Калечащий','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70574','ruRU','Быстродействующий','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70575','ruRU','Смертельный','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70576','ruRU','Нейтрализующий','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70577','ruRU','Дурманящий','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70578','ruRU','Анестезирующий','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70579','ruRU','Ничего','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70580','ruRU','Языки пламени','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70581','ruRU','Ледяное клеймо','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70582','ruRU','Неистовство ветра','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70583','ruRU','Жизнь земли','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70584','ruRU','Мне нужны твои услуги','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70585','ruRU','У тебя слишком много ботов','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70586','ruRU','Вы хотите нанять ','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70587','ruRU',' сейчас немного занят, повторите попытку позже.','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70588','ruRU','Приятно иметь с тобой дело','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70589','ruRU','Воины','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70590','ruRU','Паладины','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70591','ruRU','Маги','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70592','ruRU','Жрецы','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70593','ruRU','Чернокнижники','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70594','ruRU','Друиды','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70595','ruRU','Рыцари Смерти','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70596','ruRU','Разбойники','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70597','ruRU','Шаманы','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70598','ruRU','Охотники','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70599','ruRU','Мастера Клинка','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70600','ruRU','Разрушители','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70601','ruRU','Архимаги','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70602','ruRU','Повелители Ужаса','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70603','ruRU','Разрушители Заклинаний','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70604','ruRU','Тёмные Охотницы','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70605','ruRU','Воин','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70606','ruRU','Паладин','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70607','ruRU','Маг','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70608','ruRU','Жрец','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70609','ruRU','Чернокнижник','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70610','ruRU','Друид','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70611','ruRU','Рыцарь смерти','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70612','ruRU','Разбойник','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70613','ruRU','Шаман','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70614','ruRU','Охотник','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70615','ruRU','Мастер Клинка','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70616','ruRU','Разрушитель','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70617','ruRU','Архимаг','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70618','ruRU','Повелитель Ужаса','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70619','ruRU','Разрушитель Заклинаний','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70620','ruRU','Темная Охотница','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70621','ruRU','Мужчина','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70622','ruRU','Женщина','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70623','ruRU','Человек','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70624','ruRU','Орк','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70625','ruRU','Гном','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70626','ruRU','Ночной эльф','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70627','ruRU','Нежить','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70628','ruRU','Таурен','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70629','ruRU','Гном','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70630','ruRU','Тролль','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70631','ruRU','Эльф крови','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70632','ruRU','Дреней','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70633','ruRU','Неизвестно','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70634','ruRU','Сбор добычи','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70635','ruRU','|cff9d9d9dПлохой|r','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70636','ruRU','|cffffffffОбычный|r','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70637','ruRU','|cff1eff00Необычный|r','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70638','ruRU','|cff0070ddРедкий|r','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70639','ruRU','|cffa335eeЭпический|r','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70640','ruRU','|cffff8000Легендарный|r','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70641','ruRU','Активное действие','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70642','ruRU','Задержка атаки на','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70643','ruRU','Задержка лечения на','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70644','ruRU','с','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70645','ruRU','Off-танк (второй танк)','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70646','ruRU','Некроманты','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70647','ruRU','Некромант','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70648','ruRU','Позиционирование в дальнем бою','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70649','ruRU','Обычное','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70650','ruRU','Избегать фронтального АОЕ','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70652','ruRU','Вы уверены, что это сработает? Это должна быть самая лучшая вода в мире...','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70653','ruRU','Похоже, тебе не помешает хороший глоток свежей воды.','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70654','ruRU','Морские Ведьмы','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70655','ruRU','Морская Ведьма','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70656','ruRU','Маны на единицу урона','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70657','ruRU','Урона на еденицу маны','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70658','ruRU','Трансмогрификация...','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70659','ruRU','Отключить боевое позиционирование',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70660','ruRU','Приоритетная цель',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70661','ruRU','Банковское хранилище бота...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70662','ruRU','Положить предметы...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70663','ruRU','Забрать предметы...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70664','ruRU','Банк пуст',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70665','ruRU','Предыдущая страница',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70666','ruRU','Следующая страница',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70667','ruRU','Ты действительно хочешь потратить столько золота, чтобы снова поднять Властелина Крипт?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70668','ruRU','Сомневаюсь, что ты можешь нанести много урона в своём нынешнем состоянии, но я готов направить тебя и помочь восстановить свои силы.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70669','ruRU','Властелины Крипт',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70670','ruRU','Властелин Крипт',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70671','ruRU','Уволить',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70672','ruRU','Саранча',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70673','ruRU','Порог здоровья цели',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70674','ruRU','Мне нужен портал',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70675','ruRU','Штормград',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70676','ruRU','Стальгорн',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70677','ruRU','Дарнасс',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70678','ruRU','Экзодар',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70679','ruRU','Оргриммар',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70680','ruRU','Подгород',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70681','ruRU','Громовой Утёс',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70682','ruRU','Луносвет',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70683','ruRU','Шаттрат',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70684','ruRU','Даларан',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70685','ruRU','Вы превысили максимальное количество npcbot для вашей учётной записи ({} >= {})',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70686','ruRU','<Применить ко всем ботам>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70687','ruRU','(банк снаряжения)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70688','ruRU','Недостаточно места в банке снаряжения для хранения %u предмет(ов) (%u / %u)!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70689','ruRU','Наборы снаряжения',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70690','ruRU','Создать',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70691','ruRU','Удалить',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70692','ruRU','Экипировать',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70693','ruRU','отсутствует',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);\n"
  },
  {
    "path": "SQL/locales/zhCN/creature_template_locale.sql",
    "content": "DELETE FROM `creature_template_locale` WHERE `entry`=70595 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70595, 'zhCN', '蝗虫', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70594 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70594, 'zhCN', '腐尸甲虫', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70593 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70593, 'zhCN', '腐尸甲虫', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70592 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70592, 'zhCN', '腐尸甲虫', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70591 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70591, 'zhCN', '荷鲁斯明', '地穴领主佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70590 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70590, 'zhCN', '阿拉克-阿拉姆', '地穴领主佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70589 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70589, 'zhCN', '翡若斯', '地穴领主佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70588 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70588, 'zhCN', '厄努比洛斯', '地穴领主佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70587 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70587, 'zhCN', '图坦阿拉克', '地穴领主佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70586 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70586, 'zhCN', '龙卷风', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70585 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70585, 'zhCN', '恰利布迪沙', '深渊海巫佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70584 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70584, 'zhCN', '灰云', '深渊海巫佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70583 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70583, 'zhCN', '小丽', '深渊海巫佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70582 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70582, 'zhCN', '毒蛇娜', '深渊海巫佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70581 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70581, 'zhCN', '康德拉', '深渊海巫佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70580 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70580, 'zhCN', '骷髅', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70579 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70579, 'zhCN', '德罗萨姆', '死灵法师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70578 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70578, 'zhCN', '丰磨', '死灵法师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70577 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70577, 'zhCN', '赫克斯尔', '死灵法师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70576 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70576, 'zhCN', '罗希克', '死灵法师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70575 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70575, 'zhCN', '帕卡', '死灵法师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70574 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70574, 'zhCN', '黑暗使徒', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70573 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70573, 'zhCN', '暗影使徒', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70572 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70572, 'zhCN', '丽拉', '黑暗游侠佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70571 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70571, 'zhCN', '达莉丝', '黑暗游侠佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70570 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70570, 'zhCN', '伊娃', '黑暗游侠佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70569 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70569, 'zhCN', '谭', '黑暗游侠佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70568 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70568, 'zhCN', '玛拉', '黑暗游侠佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70567 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70567, 'zhCN', '涅什达', '破法者佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70566 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70566, 'zhCN', '丹斯德', '破法者佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70565 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70565, 'zhCN', '凯尔诺', '破法者佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70564 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70564, 'zhCN', '纳森', '破法者佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70563 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70563, 'zhCN', '伊诺尔', '破法者佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70562 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70562, 'zhCN', '炼狱', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70561 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70561, 'zhCN', '拉马罗特', '恐惧魔王佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70560 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70560, 'zhCN', '罗特修斯', '恐惧魔王佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70559 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70559, 'zhCN', '扎拉蒙', '恐惧魔王佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70558 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70558, 'zhCN', '恶魔罗斯', '恐惧魔王佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70557 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70557, 'zhCN', '尼罗斯', '恐惧魔王佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70556 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70556, 'zhCN', '水元素', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70555 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70555, 'zhCN', '迪崔', '高阶法师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70554 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70554, 'zhCN', '阿默', '黑曜石毁灭者佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70553 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70553, 'zhCN', '欧西斯', '黑曜石毁灭者佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70552 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70552, 'zhCN', '剑圣', '剑圣佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70551 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70551, 'zhCN', '戈克拉马托', '剑圣佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70545 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70545, 'zhCN', '树人', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70544 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70544, 'zhCN', '水元素', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70543 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70543, 'zhCN', '灵狼', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70542 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70542, 'zhCN', '暗影恶魔', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70538 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70538, 'zhCN', '升起食尸鬼', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70537 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70537, 'zhCN', '虫子', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70536 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70536, 'zhCN', '犀牛', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70535 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70535, 'zhCN', '魔暴龙', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70534 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70534, 'zhCN', '核心犬', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70533 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70533, 'zhCN', '灵兽', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70532 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70532, 'zhCN', '奇美拉', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70531 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70531, 'zhCN', '蛰鞭兽', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70530 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70530, 'zhCN', '扭曲潜行者', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70529 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70529, 'zhCN', '鳄鱼兽', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70528 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70528, 'zhCN', '螃蟹', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70527 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70527, 'zhCN', '猪', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70526 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70526, 'zhCN', '熊', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70525 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70525, 'zhCN', '大猩猩', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70524 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70524, 'zhCN', '乌龟', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70523 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70523, 'zhCN', '天蝎灵', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70522 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70522, 'zhCN', '特罗莫斯', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70521 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70521, 'zhCN', '黄蜂', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70520 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70520, 'zhCN', '鬣狗', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70519 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70519, 'zhCN', '猫', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70518 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70518, 'zhCN', '高大步行者', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70517 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70517, 'zhCN', '狼', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70516 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70516, 'zhCN', '猛禽', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70515 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70515, 'zhCN', '腐肉鸟', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70514 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70514, 'zhCN', '孢子蝙', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70513 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70513, 'zhCN', '虚空鳐', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70512 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70512, 'zhCN', '龙鹰', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70511 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70511, 'zhCN', '毁灭者', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70510 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70510, 'zhCN', '风蛇', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70509 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70509, 'zhCN', '蝙蝠', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70508 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70508, 'zhCN', '掠食之鸟', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70507 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70507, 'zhCN', '毒蛇', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70506 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70506, 'zhCN', '蜘蛛', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70505 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70505, 'zhCN', '恶魔卫士', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70504 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70504, 'zhCN', '邪能猎犬', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70503 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70503, 'zhCN', '魅魔', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70502 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70502, 'zhCN', '虚空行者', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70501 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70501, 'zhCN', '小恶魔', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70465 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70465, 'zhCN', '史蒂芬', '死亡骑士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70464 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70464, 'zhCN', '曼陀罗', '死亡骑士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70463 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70463, 'zhCN', '佐贝', '死亡骑士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70462 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70462, 'zhCN', '克洛克', '死亡骑士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70461 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70461, 'zhCN', '伊利丽额', '死亡骑士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70460 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70460, 'zhCN', '乌佐', '死亡骑士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70459 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70459, 'zhCN', '星澈', '死亡骑士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70458 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70458, 'zhCN', '阿莉', '死亡骑士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70457 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70457, 'zhCN', '维瑞思', '死亡骑士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70456 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70456, 'zhCN', '银缕', '死亡骑士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70455 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70455, 'zhCN', '岚克雷', '死亡骑士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70454 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70454, 'zhCN', '缪妮克斯', '死亡骑士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70453 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70453, 'zhCN', '维伦', '死亡骑士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70452 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70452, 'zhCN', '音风', '死亡骑士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70451 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70451, 'zhCN', '苏西', '死亡骑士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70418 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70418, 'zhCN', '夏兰尼斯', '德鲁伊佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70417 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70417, 'zhCN', '哈琳', '德鲁伊佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70416 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70416, 'zhCN', '洛加纳尔', '德鲁伊佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70415 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70415, 'zhCN', '高林', '德鲁伊佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70414 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70414, 'zhCN', '杰诺斯', '德鲁伊佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70413 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70413, 'zhCN', '曼德林', '德鲁伊佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70412 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70412, 'zhCN', '瑟里德兰', '德鲁伊佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70411 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70411, 'zhCN', '谢尔德拉斯', '德鲁伊佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70410 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70410, 'zhCN', '费勒里安', '德鲁伊佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70409 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70409, 'zhCN', '丹纳萨利安', '德鲁伊佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70408 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70408, 'zhCN', '玛斯兰吉尔', '德鲁伊佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70407 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70407, 'zhCN', '卡尔', '德鲁伊佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70406 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70406, 'zhCN', '马丹特', '德鲁伊佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70405 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70405, 'zhCN', '珍雅', '德鲁伊佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70404 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70404, 'zhCN', '嘉特', '德鲁伊佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70403 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70403, 'zhCN', '凯姆', '德鲁伊佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70402 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70402, 'zhCN', '希尔', '德鲁伊佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70401 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70401, 'zhCN', '图拉克', '德鲁伊佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70377 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70377, 'zhCN', '巴巴加亚', '术士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70376 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70376, 'zhCN', '赞尼恩', '术士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70375 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70375, 'zhCN', '复仇者', '术士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70374 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70374, 'zhCN', '阿拉玛', '术士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70373 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70373, 'zhCN', '赛洛尼斯', '术士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70372 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70372, 'zhCN', '泰莉拉琳', '术士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70371 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70371, 'zhCN', '金瑞兹', '术士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70370 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70370, 'zhCN', '桑达尔', '术士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70369 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70369, 'zhCN', '厄伊', '术士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70368 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70368, 'zhCN', '亚历山大', '术士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70367 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70367, 'zhCN', '荆棘霜', '术士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70366 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70366, 'zhCN', '蓟心', '术士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70365 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70365, 'zhCN', '理查德', '术士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70364 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70364, 'zhCN', '路德', '术士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70363 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70363, 'zhCN', '卡尔', '术士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70362 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70362, 'zhCN', '泽弗洛斯', '术士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70361 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70361, 'zhCN', '米尔凯', '术士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70360 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70360, 'zhCN', '格洛达', '术士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70359 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70359, 'zhCN', '杜古如', '术士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70358 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70358, 'zhCN', '纳托克', '术士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70357 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70357, 'zhCN', '鲁珀', '术士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70356 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70356, 'zhCN', '马克西米利安', '术士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70355 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70355, 'zhCN', '卡托什', '术士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70354 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70354, 'zhCN', '马克西米利安', '术士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70353 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70353, 'zhCN', '德米赛特', '术士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70352 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70352, 'zhCN', '阿拉玛', '术士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70351 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70351, 'zhCN', '杜瑟拉', '术士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70336 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70336, 'zhCN', '德里克', '法师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70335 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70335, 'zhCN', '巴蒂', '法师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70334 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70334, 'zhCN', '哈南', '法师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70333 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70333, 'zhCN', '半葵', '法师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70332 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70332, 'zhCN', '华兰斯', '法师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70331 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70331, 'zhCN', '伊迪拉', '法师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70330 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70330, 'zhCN', '纳林思', '法师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70329 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70329, 'zhCN', '因特芬', '法师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70328 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70328, 'zhCN', '奎萨思', '法师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70327 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70327, 'zhCN', '泽达娜', '法师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70326 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70326, 'zhCN', '瓦拉图', '法师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70325 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70325, 'zhCN', '嘉瑞德', '法师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70324 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70324, 'zhCN', '朱莉', '法师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70323 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70323, 'zhCN', '丁克', '法师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70322 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70322, 'zhCN', '优瑟妮', '法师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70321 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70321, 'zhCN', '迪诺', '法师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70320 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70320, 'zhCN', '麦亚', '法师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70319 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70319, 'zhCN', '恩尤', '法师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70318 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70318, 'zhCN', '菲佛德', '法师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70317 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70317, 'zhCN', '恩图瓦', '法师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70316 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70316, 'zhCN', '洁娜', '法师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70315 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70315, 'zhCN', '尼特尔伯', '法师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70314 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70314, 'zhCN', '朱莉', '法师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70313 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70313, 'zhCN', '彬克', '法师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70312 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70312, 'zhCN', '安娜斯塔西娅', '法师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70311 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70311, 'zhCN', '皮尔斯', '法师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70310 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70310, 'zhCN', '瑟斯顿', '法师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70309 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70309, 'zhCN', '乌尔辛', '法师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70308 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70308, 'zhCN', '什姆', '法师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70307 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70307, 'zhCN', '肯', '法师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70306 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70306, 'zhCN', '伊莎贝拉', '法师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70305 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70305, 'zhCN', '魔姬', '法师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70304 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70304, 'zhCN', '玛瑞克', '法师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70303 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70303, 'zhCN', '玛吉诺', '法师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70302 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70302, 'zhCN', '赞迪玛', '法师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70301 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70301, 'zhCN', '凯尔登', '法师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70268 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70268, 'zhCN', '贾瓦德', '萨满佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70267 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70267, 'zhCN', '幽蓝', '萨满佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70265 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70265, 'zhCN', '舒拉', '萨满佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70261 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70261, 'zhCN', '萨戈恩', '萨满佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70260 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70260, 'zhCN', '思安德', '萨满佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70259 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70259, 'zhCN', '卡德里斯', '萨满佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70258 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70258, 'zhCN', '斯沃特', '萨满佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70257 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70257, 'zhCN', '采莎', '萨满佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70256 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70256, 'zhCN', '楠琳', '萨满佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70255 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70255, 'zhCN', '米拉', '萨满佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70254 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70254, 'zhCN', '贝拉姆', '萨满佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70253 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70253, 'zhCN', '腾格', '萨满佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70252 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70252, 'zhCN', '思琳', '萨满佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70251 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70251, 'zhCN', '哈罗姆', '萨满佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70240 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70240, 'zhCN', '法拉特', '牧师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70239 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70239, 'zhCN', '伊兹密尔', '牧师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70238 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70238, 'zhCN', '谷万', '牧师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70237 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70237, 'zhCN', '凯德莫斯', '牧师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70236 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70236, 'zhCN', '贝莱斯特拉', '牧师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70235 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70235, 'zhCN', '洛西兰', '牧师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70234 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70234, 'zhCN', '艾尔德雷', '牧师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70233 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70233, 'zhCN', '沙尔顿', '牧师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70232 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70232, 'zhCN', '波纳里斯', '牧师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70231 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70231, 'zhCN', '竞技场', '牧师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70230 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70230, 'zhCN', '若涵', '牧师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70229 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70229, 'zhCN', '艾莉西娅', '牧师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70228 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70228, 'zhCN', '娜拉', '牧师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70227 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70227, 'zhCN', '乌尔奇奥', '牧师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70226 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70226, 'zhCN', '席雅拉', '牧师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70225 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70225, 'zhCN', '泽尤斯', '牧师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70224 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70224, 'zhCN', '约书亚', '牧师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70223 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70223, 'zhCN', '本杰明', '牧师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70222 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70222, 'zhCN', '托尔德伦', '牧师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70221 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70221, 'zhCN', '布雷娜', '牧师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70220 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70220, 'zhCN', '西奥德鲁斯', '牧师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70219 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70219, 'zhCN', '拉撒路', '牧师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70218 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70218, 'zhCN', '兰开斯特', '牧师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70217 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70217, 'zhCN', '拉莉娅', '牧师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70216 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70216, 'zhCN', '杨迪儿', '牧师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70215 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70215, 'zhCN', '阿斯塔丽', '牧师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70214 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70214, 'zhCN', '肯杰', '牧师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70213 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70213, 'zhCN', '泰津', '牧师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70212 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70212, 'zhCN', '罗娜', '牧师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70211 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70211, 'zhCN', '珊达', '牧师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70210 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70210, 'zhCN', '科布', '牧师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70209 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70209, 'zhCN', '马拉凯', '牧师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70208 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70208, 'zhCN', '迈尔斯', '牧师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70207 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70207, 'zhCN', '贝丽', '牧师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70206 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70206, 'zhCN', '迪斯滕', '牧师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70205 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70205, 'zhCN', '马克森', '牧师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70204 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70204, 'zhCN', '枝根', '牧师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70203 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70203, 'zhCN', '若青', '牧师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70202 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70202, 'zhCN', '罗芮娜', '牧师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70201 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70201, 'zhCN', '安妮塔', '牧师佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70181 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70181, 'zhCN', '涅莉森', '潜行者佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70180 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70180, 'zhCN', '艾拉拉', '潜行者佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70179 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70179, 'zhCN', '泽兰尼斯', '潜行者佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70178 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70178, 'zhCN', '坦娜莉娅', '潜行者佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70177 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70177, 'zhCN', '卡丽尔', '潜行者佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70176 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70176, 'zhCN', '托尼', '潜行者佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70175 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70175, 'zhCN', '法拉德', '潜行者佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70174 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70174, 'zhCN', '芬瑟维克', '潜行者佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70173 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70173, 'zhCN', '奥米尔', '潜行者佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70172 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70172, 'zhCN', '霍尔夫丹', '潜行者佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70171 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70171, 'zhCN', '格雷戈里', '潜行者佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70170 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70170, 'zhCN', '迈尔斯', '潜行者佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70169 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70169, 'zhCN', '凯琳', '潜行者佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70168 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70168, 'zhCN', '安尼莎', '潜行者佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70167 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70167, 'zhCN', '艾瑞昂', '潜行者佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70166 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70166, 'zhCN', '思娜', '潜行者佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70165 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70165, 'zhCN', '简诺', '潜行者佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70164 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70164, 'zhCN', '弗拉洪', '潜行者佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70163 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70163, 'zhCN', '深石', '潜行者佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70162 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70162, 'zhCN', '奥莫克', '潜行者佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70161 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70161, 'zhCN', '盖斯特', '潜行者佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70160 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70160, 'zhCN', '卡普拉', '潜行者佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70159 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70159, 'zhCN', '鲁瓦格', '潜行者佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70158 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70158, 'zhCN', '玛丽安', '潜行者佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70157 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70157, 'zhCN', '大卫', '潜行者佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70156 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70156, 'zhCN', '伊恩', '潜行者佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70155 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70155, 'zhCN', '猎獭', '潜行者佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70154 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70154, 'zhCN', '奥斯本', '潜行者佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70153 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70153, 'zhCN', '凯琳', '潜行者佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70152 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70152, 'zhCN', '索尔姆', '潜行者佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70151 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70151, 'zhCN', '乔里克', '潜行者佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70139 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70139, 'zhCN', '杀手', '猎人佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70138 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70138, 'zhCN', '沃德', '猎人佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70137 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70137, 'zhCN', '阿克特翁', '猎人佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70136 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70136, 'zhCN', '德蕾米丝', '猎人佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70135 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70135, 'zhCN', '赞迪娜', '猎人佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70134 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70134, 'zhCN', '奥尼纳丝', '猎人佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70133 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70133, 'zhCN', '塔娜', '猎人佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70132 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70132, 'zhCN', '凯尔内', '猎人佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70131 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70131, 'zhCN', '汉诺维亚', '猎人佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70130 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70130, 'zhCN', '萨琳娜', '猎人佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70129 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70129, 'zhCN', '达格', '猎人佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70128 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70128, 'zhCN', '阿伦达', '猎人佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70127 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70127, 'zhCN', '托尔芬', '猎人佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70126 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70126, 'zhCN', '乌尔菲尔', '猎人佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70125 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70125, 'zhCN', '恩瑞斯', '猎人佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70124 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70124, 'zhCN', '凯布鲁斯', '猎人佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70123 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70123, 'zhCN', '雷格努斯', '猎人佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70122 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70122, 'zhCN', '奥尔明', '猎人佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70121 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70121, 'zhCN', '德拉', '猎人佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70120 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70120, 'zhCN', '多里昂', '猎人佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70119 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70119, 'zhCN', '约卡斯特', '猎人佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70118 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70118, 'zhCN', '洁娜', '猎人佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70117 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70117, 'zhCN', '丹拉尔', '猎人佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70116 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70116, 'zhCN', '达扎拉', '猎人佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70115 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70115, 'zhCN', '艾安娜', '猎人佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70114 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70114, 'zhCN', '思安杜尔', '猎人佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70113 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70113, 'zhCN', '索兹朱尔', '猎人佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70112 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70112, 'zhCN', '奥玛克', '猎人佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70111 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70111, 'zhCN', '索费雷', '猎人佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70110 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70110, 'zhCN', '杰尚', '猎人佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70109 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70109, 'zhCN', '尧', '猎人佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70108 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70108, 'zhCN', '兰卡', '猎人佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70107 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70107, 'zhCN', '优瑞', '猎人佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70106 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70106, 'zhCN', '霍尔特', '猎人佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70105 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70105, 'zhCN', '凯瑞', '猎人佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70104 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70104, 'zhCN', '克拉格', '猎人佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70103 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70103, 'zhCN', '格里夫', '猎人佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70102 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70102, 'zhCN', '奥格罗姆', '猎人佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70101 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70101, 'zhCN', '索尔加斯', '猎人佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70100 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70100, 'zhCN', '深海对话触发器', '', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70074 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70074, 'zhCN', '如云', '圣骑士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70073 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70073, 'zhCN', '烈焰者', '圣骑士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70072 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70072, 'zhCN', '希莎', '圣骑士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70071 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70071, 'zhCN', '乔勒', '圣骑士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70070 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70070, 'zhCN', '图拉斯', '圣骑士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70069 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70069, 'zhCN', '卡万', '圣骑士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70068 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70068, 'zhCN', '巴屯', '圣骑士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70067 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70067, 'zhCN', '巴奇', '圣骑士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70066 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70066, 'zhCN', '艾瑟丽丝', '圣骑士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70065 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70065, 'zhCN', '欧瑟兰', '圣骑士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70064 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70064, 'zhCN', '奥瑞隆', '圣骑士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70063 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70063, 'zhCN', '娜琳', '圣骑士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70062 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70062, 'zhCN', '杰斯汀', '圣骑士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70061 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70061, 'zhCN', '卡曼', '圣骑士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70060 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70060, 'zhCN', '凯瑟琳', '圣骑士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70059 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70059, 'zhCN', '亚瑟', '圣骑士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70058 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70058, 'zhCN', '布兰德尔', '圣骑士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70057 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70057, 'zhCN', '贝尔德鲁克', '圣骑士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70056 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70056, 'zhCN', '瓦尔加', '圣骑士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70055 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70055, 'zhCN', '阿萨尔', '圣骑士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70054 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70054, 'zhCN', '格雷森', '圣骑士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70053 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70053, 'zhCN', '威廉', '圣骑士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70052 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70052, 'zhCN', '溴盐', '圣骑士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70051 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70051, 'zhCN', '山缪尔', '圣骑士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70038 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70038, 'zhCN', '凯丽娅', '战士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70037 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70037, 'zhCN', '卡茲', '战士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70036 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70036, 'zhCN', '如娜', '战士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70035 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70035, 'zhCN', '贝霍玛', '战士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70034 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70034, 'zhCN', '阿霍南', '战士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70033 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70033, 'zhCN', '柯蕊', '战士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70032 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70032, 'zhCN', '均糖', '战士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70031 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70031, 'zhCN', '达纳斯', '战士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70030 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70030, 'zhCN', '伊莎', '战士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70029 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70029, 'zhCN', '吴', '战士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70028 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70028, 'zhCN', '毕尔邦', '战士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70027 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70027, 'zhCN', '凯尔夫', '战士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70026 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70026, 'zhCN', '巴尔图斯', '战士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70025 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70025, 'zhCN', '安琪拉', '战士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70024 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70024, 'zhCN', '克里斯', '战士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70023 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70023, 'zhCN', '西尔丹爱尔', '战士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70022 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70022, 'zhCN', '阿丽亚思塔', '战士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70021 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70021, 'zhCN', '凯拉', '战士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70020 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70020, 'zhCN', '爱丽西娅', '战士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70019 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70019, 'zhCN', '泽尔马克', '战士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70018 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70018, 'zhCN', '索热克', '战士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70017 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70017, 'zhCN', '格雷兹', '战士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70016 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70016, 'zhCN', '塔尔肖', '战士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70015 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70015, 'zhCN', '方儿', '战士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70014 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70014, 'zhCN', '克兰', '战士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70013 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70013, 'zhCN', '哈鲁特', '战士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70012 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70012, 'zhCN', '柯尔', '战士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70011 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70011, 'zhCN', '萨克', '战士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70010 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70010, 'zhCN', '托姆', '战士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70009 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70009, 'zhCN', '奥斯汀', '战士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70008 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70008, 'zhCN', '丹娜', '战士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70007 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70007, 'zhCN', '凯尔斯特拉姆', '战士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70006 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70006, 'zhCN', '格兰尼斯', '战士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70005 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70005, 'zhCN', '马洛什', '战士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70004 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70004, 'zhCN', '安德尔', '战士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70003 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70003, 'zhCN', '丽娜', '战士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70002 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70002, 'zhCN', '思兰', '战士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70001 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70001, 'zhCN', '莱恩', '战士佣兵', NULL);\nDELETE FROM `creature_template_locale` WHERE `entry`=70000 AND `locale`='zhCN';\nINSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES (70000, 'zhCN', '拉格雷塔', '佣兵中介', NULL);\n"
  },
  {
    "path": "SQL/locales/zhCN/npc_text_locale.sql",
    "content": "DELETE FROM `npc_text_locale` WHERE `Locale`='zhCN' AND `ID` BETWEEN '70000' AND '71000';\nINSERT INTO `npc_text_locale` (`ID`, `Locale`, `Text0_0`, `Text0_1`, `Text1_0`, `Text1_1`, `Text2_0`, `Text2_1`, `Text3_0`, `Text3_1`, `Text4_0`, `Text4_1`, `Text5_0`, `Text5_1`, `Text6_0`, `Text6_1`, `Text7_0`, `Text7_1`)\nVALUES\n('70001','zhCN','我愿意为你奉献一切。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70002','zhCN','你需要什么吗？',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70003','zhCN','凡人，通常情况下，我会立刻杀了你这混蛋！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70004','zhCN','<你看着这个歿境神蚀者。它看起来有点与众不同，它并没有因为你的伤害而消失，在仔细检查过后，你注意到它的背部有一个小口。>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70005','zhCN','<毁灭者盯着你，发出低沉的咆哮。>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70006','zhCN','你惊讶吗，凡人？作为一名纳斯雷兹姆，我不得不寻求盟友，你看起来至少可以逗我开心。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70007','zhCN','现在怎么样了，凡人？',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70008','zhCN','你就不能让我一个人静一静吗？ <唉……>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70009','zhCN','现在如何？',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70101','zhCN','|cffff3300剑圣|r$b|cffdd6600-=致敬魔兽争霸III=-|r$B$B\\\\\\\"剑圣，以前是燃烧之刃家族的成员，现在是部落中的精锐战士\\\"。$B$B主要属性：敏捷。$B$B疾风步：让剑圣隐形，并在一段时间内移动得更快。当剑圣攻击一个单位以打破隐身状态时，他将造成额外的伤害。$B$B镜像：制造剑圣幻象迷惑敌人，并驱散剑圣的所有魔法。$B$B致命一击(被动)：有15%的几率在他的攻击中造成致命的x2(x3，x4)倍的正常伤害。$B$B剑刃风暴：给予魔法免疫并对周围所有敌人造成伤害。$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70102','zhCN','|cff9900cc歿境神蚀者|r$b|cffdd6600-=致敬魔兽争霸III=-|r$B$B\\\\\\\"歿境神蚀者，对魔法有着无法满足的渴望\\\\\\\"。$B$B高护甲，非常高的抵抗力，部分免疫魔法，随着时间的推移失去法力\\\\并且不受益于被动法力再生效果，板甲，双持魔杖，造成暗影法术伤害，没有物理攻击\\\\法术伤害加成：50%攻击力+200% 智力增加魔杖伤害。$B$B吞噬魔法。从敌人身上驱散最多2个魔法效果，从盟友身上驱散最多2个魔法效果和最多2个诅咒，并在20码范围内伤害召唤单位。每次驱散效果回复20%法力和5%生命，7秒冷却。$B$B暗影爆炸：强化攻击，增加飞溅伤害。$B$B吸取法力：从随机友方单位吸取所有法力(受施法者法力限制)。$B$B法力再生：给周围15码范围内的团队和团队成员通电，使其法力值达到最大值的1%，影响最多10个目标，冷却3秒。$B$B生命再生：治疗周围15码范围内的团队和团队成员，使其生命值降低施法者法力上限的2%，最多影响10个目标，冷却3秒。$B$B暗影护甲(被动)：恢复相当于所受伤害百分比的法力值。$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70103','zhCN','|cff0000dd高阶法师|r$b|cffdd6600-=致敬魔兽争霸III=-|r$B$B\\\\\\\"高阶法师，无法用言语来形容的暴雪亲儿子\\\\\\\"。$B$B法术伤害降低35%，部分免疫控制效果，布甲，造成火/冰法术伤害，无物理攻击，法术能量加成：100%智力。主要属性：智力。$B$B暴风雪：典型的暴风雪，只是稍微强大一点，6秒冷却。$B$B召唤水元素：攻击高阶法师的敌人1分钟，冷却20秒。$B$B光辉光环：增加10%的法力上限，大大提高40码范围内己方和队友的法力回复。$B$B群体传送：暂未实现。$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70104','zhCN','|cff9900cc恐惧魔王|r$b|cffdd6600-=致敬魔兽争霸III=-|r$B$B\\\\\\\"恐惧魔王，拥有黑暗力量和精神控制力的强大恶魔\\\\\\\"。$B$B高护甲，高抵抗，部分免疫控制效果，所受伤害加速法术能量，板甲，造成近战/暗影法术伤害，对瘫痪目标造成额外伤害，法术能量加成：200%力量。主要属性：力量。$B$B食腐虫群：派一大群蝙蝠与混乱魔法结合，对面前锥形范围的敌人造成伤害，无法暴击，冷却10秒。$B$B沉睡：使敌方目标睡眠60秒，并允许下次对该目标的物理攻击忽视护甲，造成的直接伤害将唤醒目标，冷却6秒。$B$B吸血光环：增加5%的物理暴击伤害，治疗40码范围内的团队和突袭成员受到近战物理攻击和腐肉群伤害的百分比(恐惧领主100%，其他人25%)，没有威胁。$B$B召唤地狱火：召唤一个来自天空的恶魔，恶魔对魔法有很强的抵抗力并且持续180秒，180秒的冷却时间。$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70105','zhCN','|cff0000dd破法者|r$b|cffdd6600-=致敬魔兽争霸III=-|r$B$B\\\\\\\"破法者，一个被训练来破坏和扭曲魔法能量的精灵战士\\\\\\\"。$B$B法术伤害减少75%，部分免疫控制效果，护甲降低-30%，板甲，近战/奥术伤害，法术能量加成：200%力量。主要属性：力量。$B$B魔法偷取。从敌人身上偷取一个有益的法术并施于附近的盟友，或者从盟友身上移除一个消极的法术并施于附近的敌人，影响魔法和诅咒效果，3秒冷却。$B$B能量窃取(被动)：成功的近战攻击消耗目标的法力，相当于造成的伤害(由法术力增加)，造成奥术伤害。$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70106','zhCN','|cff9900cc黑暗游侠|r$b|cffdd6600-=致敬魔兽争霸III=-|r$B$B\\\\\\\"黑暗游侠，强行起死回生的奎尔萨拉斯的前游侠\\\\\\\"。$B$B法术伤害减少35%，不死系，部分免疫控制效果，皮甲/布甲，造成物理/暗影法术伤害，不产生威胁，法术力量加成：50%智力。主要属性：敏捷。$B$B沉默：使一个敌人和最多4个附近目标沉默8秒，15秒冷却。$B$B黑箭：射出一支诅咒之箭，造成150%武器伤害和额外的暗影伤害。如果受影响的目标死于黑暗游侠的伤害，黑暗仆从将从尸体中产生(最多5个仆从，持续时间80秒，只对人形、野兽和龙类有效)。如果目标生命低于20%，造成5倍伤害。$B$B吸取生命：每秒吸取一个敌人的生命值，持续5秒，治疗黑暗游侠消耗生命值的200%。$B$B嘲讽(暗夜仆从)：使近战范围内的敌人攻击暗夜仆从而不是暗夜游侠，持续5秒。一次性使用$B$B改进格挡(暗夜仆从)：增加格挡攻击的几率60-100%(取决于施法者的等级)，持续6秒。一次性使用。$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70107','zhCN','|cff9900cc死灵法师|r$b|cffdd6600-=魔兽争霸III / 暗黑破坏神II致敬=-|r$B$B受到的法术伤害减少20%，部分免疫控制效果，布甲，造成暗影法术伤害，没有物理攻击，法术强度加成：智力的100%。主属性：智力。$B$B死灵复生：从尸体上复活2个骷髅(最多6个骷髅，持续65秒，只对人型生物、野兽和龙类有效)。$B$B邪恶狂热：增加目标的近战攻击速度75%，但持续消耗生命。持续45秒。不能取消。30级解锁。$B$B尸体爆炸：让尸体爆炸，对周围所有敌人造成相当于死亡单位最大生命值35%至75%的伤害(取决于死灵法师的等级)。这种伤害不产生威胁。40级解锁。$B$B致残：减少目标的移动速度、近战攻击速度和总力量50%，持续60秒。$B$B嘲讽(骷髅)：嘲讽一个近战范围内的敌人攻击骷髅而不是亡灵巫师，持续5秒。一次性使用。$B$B改进格挡(骷髅)：增加格挡攻击的几率60-100%(取决于施法者的等级)，持续6秒。一次性使用。$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70108','zhCN','|cff0000dd深渊海巫|r$b|cffdd6600-=魔兽争霸III致敬=-|r$B$B\"海洋中的凶猛鳞皮居民，常与巨大风暴的到来联系在一起。\"$B$B受到的法术伤害减少30%，部分免疫控制效果，布甲，造成物理/冰霜法术/风暴法术伤害，攻击力加成：敏捷x2，法术强度加成：智力的200%。主属性：智力。$B$B分叉闪电：召唤一道闪电锥，伤害敌人。从2到所有目标(取决于海巫的等级)，使它们昏迷2秒。这种伤害不产生威胁。$B$B冰霜箭：用冰霜法术为箭矢增加额外伤害，减慢目标的移动、攻击和施法速度30%至70%(取决于海巫的等级)。$B$B法力护盾：创造一个护盾，使用海巫的法力吸收100%的(未减免的)进来伤害。效果范围从每10法力吸收1伤害到每1法力吸收10伤害(取决于海巫的等级)。$B$B龙卷风：召唤一个猛烈的龙卷风，伤害并减慢附近敌方单位的速度，有时完全使它们失去行动能力。龙卷风在户外随时间增长，增加伤害和影响区域，但在室内缩小，迅速消散。60级解锁。$B$B娜迦(被动)：在水中游泳速度、伤害和躲避几率大幅提升。$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70109','zhCN','|cff9900cc地穴领主|r$b|cffdd6600-=魔兽争霸III致敬=-|r$B$B\"古老的庞然大物，曾是艾泽拉斯之王之一，现在是巫妖王麾下最强大的亡灵战士之一。\"$B$B高度护甲，增加的抗性，部分免疫控制效果，免疫基于毒素的效果，锁甲/板甲，造成近战/暗影法术伤害，法术强度加成：力量的200%。主属性：力量。$B$B穿刺：地穴领主用他巨大的爪子猛击地面，向前锥形射出尖刺，造成伤害并将敌方单位掀入空中，使他们晕眩。20级解锁。$B$B尖刺甲壳：地穴领主的几丁质护甲增加伤害抗性，并将15%至50%的伤害反弹给近战攻击者。$B$B腐尸甲虫：地穴领主从敌人的新鲜尸体上产生一个腐尸甲虫来攻击他的敌人。甲虫是永久的，但不会恢复生命值，一次最多控制6个。更高等级允许地穴领主召唤更强大的甲虫。10级解锁。$B$B蝗虫群：地穴领主释放一群20-40只(取决于地穴领主的等级)愤怒的蝗虫，啃咬并撕扯附近的敌方单位，减少他们的移动或攻击能力。当它们啃食敌人肉体时，它们将其转化为一种物质，当它们返回时恢复地穴领主的生命值。40级解锁。$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70201','zhCN','并不总是有人愿意为钱去卖命！',NULL,'我们的服务遍布艾泽拉斯的每个角落！',NULL,'很高兴为您服务，我这里有最能打的家伙！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70202','zhCN','佣兵向来十分抢手，以下是现在你能雇佣的人：',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70203','zhCN','佣兵向来十分抢手，以下是现在你能雇佣的人：',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70204','zhCN','看来现在没有空闲的佣兵，你过些时候再来看看吧。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70300','zhCN','去死！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70301','zhCN','正在复活你！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70302','zhCN','正在复活 ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70303','zhCN','你的佣兵',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70304','zhCN','的佣兵',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70305','zhCN','我现在还不能制造魔法水',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70306','zhCN','我现在还不能制造魔法食物',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70307','zhCN','我还不能那样做',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70308','zhCN','给你……',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70309','zhCN','已禁用',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70310','zhCN','还没有准备好',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70311','zhCN','无效的物品类型',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70312','zhCN','失败',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70313','zhCN','完成',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70314','zhCN','我没有变形',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70315','zhCN','我没有治疗石',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70316','zhCN','我还不能制造治疗石',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70317','zhCN','搞什么鬼，我没有锁可开！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70318','zhCN','我的技能等级还不够高',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70319','zhCN','正在将我的天赋切换为',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70320','zhCN','武器',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70321','zhCN','狂怒',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70322','zhCN','防护',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70323','zhCN','惩戒',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70324','zhCN','野兽控制',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70325','zhCN','射击',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70326','zhCN','生存',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70327','zhCN','刺杀',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70328','zhCN','战斗',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70329','zhCN','敏锐',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70330','zhCN','戒律',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70331','zhCN','神圣',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70332','zhCN','暗影',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70333','zhCN','鲜血',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70334','zhCN','冰霜',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70335','zhCN','邪恶',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70336','zhCN','元素',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70337','zhCN','增强',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70338','zhCN','恢复',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70339','zhCN','奥术',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70340','zhCN','火焰',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70341','zhCN','痛苦',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70342','zhCN','恶魔学识',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70343','zhCN','毁灭',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70344','zhCN','平衡',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70345','zhCN','野性战斗',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70346','zhCN','未知',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70347','zhCN','滚开！ 懦夫。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70348','zhCN',' 不方便。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70349','zhCN','我不会把我宝贵的时间浪费在这些琐事上！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70350','zhCN','NIY',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70351','zhCN','NIY',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70352','zhCN','NIY',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70353','zhCN','我准备好了',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70354','zhCN','走开！我已经有雇主了！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70355','zhCN','未知',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70356','zhCN','在你身上！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70357','zhCN','在我身上！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70358','zhCN',' 对 ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70359','zhCN',' 已使用！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70360','zhCN','坦克佣兵',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70361','zhCN','职业',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70362','zhCN','玩家',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70363','zhCN','雇主',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70364','zhCN','无',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70365','zhCN','级别',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70366','zhCN','天赋',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70367','zhCN','被动',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70368','zhCN','隐藏',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70369','zhCN','已知',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70370','zhCN','能力',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70371','zhCN','力量',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70372','zhCN','敏捷',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70373','zhCN','耐力',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70374','zhCN','智力',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70375','zhCN','精神',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70376','zhCN','未知属性',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70377','zhCN','共',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70378','zhCN','近战攻击强度',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70379','zhCN','远程攻击强度',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70380','zhCN','护甲',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70381','zhCN','暴击',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70382','zhCN','防御',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70383','zhCN','未命中',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70384','zhCN','躲闪',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70385','zhCN','招架',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70386','zhCN','格挡',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70387','zhCN','盾牌格挡值',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70388','zhCN','近战防御',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70389','zhCN','法术防御',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70390','zhCN','主手攻击伤害范围',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70391','zhCN','主手攻击伤害加成',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70392','zhCN','主手攻击速度',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70393','zhCN','副手攻击伤害范围',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70394','zhCN','副手攻击伤害加成',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70395','zhCN','副手攻击速度',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70396','zhCN','远程攻击伤害范围',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70397','zhCN','远程攻击伤害加成',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70398','zhCN','远程攻击速度',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70399','zhCN','最小',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70400','zhCN','最大',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70401','zhCN','输出',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70402','zhCN','基础生命值',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70403','zhCN','最大生命值',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70404','zhCN','基础法力值',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70405','zhCN','最大法力值',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70406','zhCN','当前法力值',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70407','zhCN','法术强度',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70408','zhCN','每5秒恢复生命',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70409','zhCN','非施法状态：每5秒回复法力值',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70410','zhCN','施法状态：每5秒回复法力值',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70411','zhCN','急速',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70412','zhCN','命中',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70413','zhCN','专精',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70414','zhCN','物理 护甲穿透',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70415','zhCN','法术 护甲穿透',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70416','zhCN','%',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70417','zhCN','神圣',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70418','zhCN','火焰',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70419','zhCN','自然',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70420','zhCN','冰霜',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70421','zhCN','暗影',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70422','zhCN','奥术',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70423','zhCN','抗性',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70424','zhCN','指令状态',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70425','zhCN','跟随',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70426','zhCN','攻击',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70427','zhCN','停留',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70428','zhCN','重置',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70429','zhCN','完全停止',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70430','zhCN','跟随距离',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70431','zhCN','天赋',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70432','zhCN','佣兵主职务',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70433','zhCN','佣兵材料采集',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70434','zhCN','PvP 杀敌',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70435','zhCN','玩家',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70436','zhCN','已死亡 ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70437','zhCN',' 次',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70438','zhCN','%s (佣兵)渐渐冷静了下来。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70439','zhCN','<Debug调试>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70440','zhCN','你真的想冒险引起',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70441','zhCN','对你的注意？',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70442','zhCN','<请投币>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70443','zhCN','你想吸引',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70444','zhCN','<试着发出邀请……>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70445','zhCN','你想雇佣',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70446','zhCN','<雇佣佣兵>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70447','zhCN','佣兵 装备 管理...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70448','zhCN','佣兵 职责 管理...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70449','zhCN','佣兵 队形 管理...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70450','zhCN','佣兵 技能 管理...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70451','zhCN','佣兵 天赋 管理...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70452','zhCN','使用消耗品、合剂等...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70453','zhCN','<创建队伍>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70454','zhCN','<创建队伍(所有佣兵)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70455','zhCN','<加入队伍>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70456','zhCN','<将所有佣兵加入队伍>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70457','zhCN','<移出队伍>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70458','zhCN','跟着我！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70459','zhCN','原地守候！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70460','zhCN','停下来，什么也别做！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70461','zhCN','给我一些食物',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70462','zhCN','给我一些水',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70463','zhCN','召唤一个魔法餐桌！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70464','zhCN','帮我开个锁',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70465','zhCN','给我一颗治疗石',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70466','zhCN','召唤一个灵魂之井！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70467','zhCN','给你的武器重新上毒...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70468','zhCN','<选择毒药 (主手武器)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70469','zhCN','<选择毒药 (副手武器)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70470','zhCN','元素武器附魔...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70471','zhCN','<选择附魔 (主手武器)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70472','zhCN','<选择附魔 (副手武器)>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70473','zhCN','取消你的变形形态',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70474','zhCN','<选择宠物类型>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70475','zhCN','你被解雇了！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70476','zhCN','你确定要解雇',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70477','zhCN','你可别后悔……',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70478','zhCN','该死的，振作起来！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70479','zhCN','<职业介绍>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70480','zhCN','没事了',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70481','zhCN','距离',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70482','zhCN','返回',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70483','zhCN','<自动>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70484','zhCN','<解散宠物>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70485','zhCN','召唤随机宠物 (狡诈型)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70486','zhCN','召唤随机宠物 (残暴型)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70487','zhCN','召唤随机宠物 (坚韧型)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70488','zhCN','让我看看你的装备',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70489','zhCN','自动筛选可用装备...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70490','zhCN','主手武器...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70491','zhCN','副手武器...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70492','zhCN','远程武器...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70493','zhCN','圣物...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70494','zhCN','头部...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70495','zhCN','肩部...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70496','zhCN','胸部...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70497','zhCN','腰带...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70498','zhCN','腿部...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70499','zhCN','脚...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70500','zhCN','手腕...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70501','zhCN','手...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70502','zhCN','披风...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70503','zhCN','衬衣...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70504','zhCN','戒指1...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70505','zhCN','戒指2...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70506','zhCN','饰品1...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70507','zhCN','饰品2...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70508','zhCN','颈部...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70509','zhCN','卸下全部装备(退回到背包)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70510','zhCN','刷新佣兵外观',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70511','zhCN','只有外观，无实际效果',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70512','zhCN','已装备',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70513','zhCN','没有可供选择的装备',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70514','zhCN','使用你的旧装备',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70515','zhCN','卸下这件装备',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70516','zhCN','额……我没有适合你的装备了……',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70517','zhCN','收集材料',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70518','zhCN','技能状态...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70519','zhCN','管理可用技能...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70520','zhCN','使用 ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70521','zhCN','刷新',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70522','zhCN','伤害类技能...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70523','zhCN','控制类技能...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70524','zhCN','治疗类技能...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70525','zhCN','其他技能...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70526','zhCN',' 发出了一阵摩擦声，并开始跟随着 ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70527','zhCN','在他的雇主把他解雇之前，%s不能加入你的队伍。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70528','zhCN','在你到达60级以前，%s不会加入你们',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70529','zhCN','在你到达55级以前，%s不会加入你们',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70530','zhCN','在你到达40级以前，%s不会加入你们',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70531','zhCN','在你到达20级以前，%s不会加入你们',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70532','zhCN','你最多只能招募%u个佣兵！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70533','zhCN','你没有足够的现金',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70534','zhCN','你最多只能招募%u位%u。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70535','zhCN','无法退还装备 %u (%s)！无法解佣兵！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70536','zhCN','当前设定',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70537','zhCN','攻击距离',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70538','zhCN','最小远程攻击距离...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70539','zhCN','最大远程攻击距离...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70540','zhCN','设定攻击距离',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70541','zhCN','移除增益魔法...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70542','zhCN','修正属性...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70543','zhCN','因为某些原因，无法卸下 %s 这件装备将发到你的邮箱。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70544','zhCN','坦克',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70545','zhCN','远程',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70546','zhCN','采矿',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70547','zhCN','草药',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70548','zhCN','剥皮',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70549','zhCN','工程学',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70550','zhCN','由于长时间未上线，已自动解除雇佣状态。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70551','zhCN','佣兵系统已被禁用，请联系管理员。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70552','zhCN','%s 不能加入你的队伍，已经有雇主了：%s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70553','zhCN','%s 正在传送中，不能加入你的队伍',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70554','zhCN','守护',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70555','zhCN','灵猴',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70556','zhCN','雄鹰守护',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70557','zhCN','猎豹守护',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70558','zhCN','蝰蛇守护',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70559','zhCN','野兽守护',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70560','zhCN','豹群守护',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70561','zhCN','野性守护',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70562','zhCN','龙鹰守护',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70563','zhCN','无守护',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70564','zhCN','光环',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70565','zhCN','虔诚',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70566','zhCN','专注',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70567','zhCN','火焰抗性',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70568','zhCN','冰霜抗性',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70569','zhCN','暗影抗性',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70570','zhCN','惩戒',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70571','zhCN','十字军',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70572','zhCN','无光环',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70573','zhCN','减速药膏',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70574','zhCN','速效药膏',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70575','zhCN','致命药膏',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70576','zhCN','致伤药膏',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70577','zhCN','麻痹药膏',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70578','zhCN','麻醉药膏',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70579','zhCN','无',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70580','zhCN','火舌武器',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70581','zhCN','冰封武器',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70582','zhCN','风怒武器',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70583','zhCN','大地生命武器',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70584','zhCN','我需要你的服务。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70585','zhCN','你不能再雇佣更多的佣兵了。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70586','zhCN','你希望雇佣',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70587','zhCN','现在正在忙着，请稍后再试。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70588','zhCN','很高兴和你进行交易。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70589','zhCN','战士',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70590','zhCN','圣骑士',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70591','zhCN','法师',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70592','zhCN','牧师',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70593','zhCN','术士',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70594','zhCN','德鲁伊',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70595','zhCN','死亡骑士',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70596','zhCN','盗贼',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70597','zhCN','萨满',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70598','zhCN','猎人',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70599','zhCN','剑圣',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70600','zhCN','歿境神蚀者',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70601','zhCN','高阶法师',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70602','zhCN','恐惧魔王',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70603','zhCN','破法者',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70604','zhCN','黑暗游侠',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70605','zhCN','战士',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70606','zhCN','圣骑士',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70607','zhCN','法师',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70608','zhCN','牧师',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70609','zhCN','术士',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70610','zhCN','德鲁伊',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70611','zhCN','死亡骑士',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70612','zhCN','盗贼',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70613','zhCN','萨满',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70614','zhCN','猎人',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70615','zhCN','剑圣',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70616','zhCN','歿境神蚀者',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70617','zhCN','高阶法师',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70618','zhCN','恐惧魔王',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70619','zhCN','破法者',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70620','zhCN','黑暗游侠',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70621','zhCN','男',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70622','zhCN','女',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70623','zhCN','人类',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70624','zhCN','兽人',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70625','zhCN','矮人',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70626','zhCN','暗夜精灵',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70627','zhCN','亡灵',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70628','zhCN','牛头人',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70629','zhCN','侏儒',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70630','zhCN','地精',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70631','zhCN','血精灵',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70632','zhCN','德莱尼',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70633','zhCN','未知',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70634','zhCN','自动拾取',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70635','zhCN','|cff9d9d9d灰色|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70636','zhCN','|cffffffff白色|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70637','zhCN','|cff1eff00绿色|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70638','zhCN','|cff0070dd蓝色|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70639','zhCN','|cffa335ee紫色|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70640','zhCN','|cffff8000橙色|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70641','zhCN','参与行为',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70642','zhCN','|延迟攻击时间|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70643','zhCN','|延迟治疗时间|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70644','zhCN','|秒|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70645','zhCN','副坦克',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70646','zhCN','亡灵法师们',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70647','zhCN','亡灵法师',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70648','zhCN','攻击方向',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70649','zhCN','正常',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70650','zhCN','避免正面AOE',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70651','zhCN','|NIY|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70652','zhCN','|你确定这会奏效吗？最好是世界上最好的水……|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70653','zhCN','|看来你真的需要喝点淡水。|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70654','zhCN','海女巫们',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70655','zhCN','海女巫',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70656','zhCN','|每点伤害的法力|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70657','zhCN','|每点魔法的伤害|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70658','zhCN','幻化...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70659','zhCN','禁用战斗定位',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70660','zhCN','优先目标',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70661','zhCN','佣兵装备银行...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70662','zhCN','存款项目...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70663','zhCN','撤回物品...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70664','zhCN','银行是空的',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70665','zhCN','前一页',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70666','zhCN','下一页',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70667','zhCN','你真的想花这么多钱让地穴领主再次动起来吗？',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70668','zhCN','我很怀疑你现在的状态，但我愿意带领你并帮助你恢复力量。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70669','zhCN','地穴领主们',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70670','zhCN','地穴领主',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70671','zhCN','反射',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70672','zhCN','蝗虫',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70673','zhCN','治疗目标生命阈值',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70674','zhCN','我需要传送门',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70675','zhCN','暴风城',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70676','zhCN','铁炉堡',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70677','zhCN','达纳苏斯',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70678','zhCN','埃索达',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70679','zhCN','奥格瑞玛',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70680','zhCN','幽暗城',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70681','zhCN','雷霆崖',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70682','zhCN','银月城',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70683','zhCN','沙塔斯城',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70684','zhCN','达拉然',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70685','zhCN','你已超过帐户的最大NPC机器人数量 ({} >= {})',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70686','zhCN','<为所有机器人设置>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70687','zhCN','(装备银行)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70688','zhCN','装备银行没有足够的空间存放 %u 件物品 (%u / %u)！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70689','zhCN','装备方案',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70690','zhCN','创建',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70691','zhCN','删除',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70692','zhCN','装备',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70693','zhCN','缺失',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);\n"
  },
  {
    "path": "SQL/locales/zhTW/npc_text_locale.sql",
    "content": "DELETE FROM `npc_text_locale` WHERE `Locale`='zhTW' AND `ID` BETWEEN '70000' AND '71000';\nINSERT INTO `npc_text_locale` (`ID`, `Locale`, `Text0_0`, `Text0_1`, `Text1_0`, `Text1_1`, `Text2_0`, `Text2_1`, `Text3_0`, `Text3_1`, `Text4_0`, `Text4_1`, `Text5_0`, `Text5_1`, `Text6_0`, `Text6_1`, `Text7_0`, `Text7_1`)\nVALUES\n('70001','zhTW','我願意為你奉獻一切。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70002','zhTW','你需要什麼嗎？',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70003','zhTW','凡人，通常情況下，我會立刻殺了你這混蛋！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70004','zhTW','<你看著這個黑曜石毀滅者。它看起來有點與眾不同，它並沒有因為你的傷害而消失，在仔細檢查過後，你注意到它的背部有一個小口。>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70005','zhTW','<毀滅者盯著你，發出低沉的咆哮。>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70006','zhTW','你驚訝嗎，凡人？作為一名納斯雷茲姆，我不得不尋求盟友，你看起來至少可以逗我開心。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70007','zhTW','現在怎麼樣了，凡人？',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70008','zhTW','你就不能讓我一個人靜一靜嗎？ <唉...>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70009','zhTW','現在如何？',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70101','zhTW','|cffff3300劍聖|r$b|cffdd6600-=致敬魔獸爭霸III=-|r$B$B\\\\\\\"劍聖,以前是燃燒之刃家族的成員,現在是部落中的精銳戰士\\\".$B$B主要屬性:敏捷.$B$B疾風步.讓劍聖隱形,並在一段時間內移動得更快.當劍聖攻擊一個單位以打破隱身狀態時,他將造成額外的傷害.$B$B鏡像.製造劍聖幻象迷惑敵人,並驅散劍聖的所有魔法.$B$B爆擊(被動).有15%的機率在他的攻擊中造成致命的x2(x3,x4)倍的正常傷害.$B$B劍刃風暴. 給予魔法免疫並對周圍所有敵人造成傷害.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70102','zhTW','|cff9900cc黑曜石毀滅者|r$b|cffdd6600-=致敬魔獸爭霸III=-|r$B$B\\\\\\\"黑曜石毀滅者,對魔法有著無法滿足的渴望\\\\\\\".$B$B高護甲,非常高的抵抗力,部分免疫魔法,隨著時間的推移失去法力\\\\並且不受益於被動法力再生效果,鎧甲,雙持魔杖,造成暗影法術傷害,沒有物理攻擊\\\\法術傷害加成:50%攻擊力+200% 智力增加魔杖傷害.$B$B吞噬魔法.從敵人身上驅散最多2個魔法效果,從盟友身上驅散最多2個魔法效果和最多2個詛咒,並在20碼範圍內傷害召喚單位.每次驅散效果回復20%法力和5%生命,7秒冷卻.$B$B暗影爆炸.強化攻擊,增加飛濺傷害.$B$B吸取法力.從隨機友方單位吸取所有法力(受施法者法力限制).$B$B補充法力.給周圍15碼範圍內的團隊和團隊成員通電,使其法力值達到最大值的1%,影響最多10個目標,冷卻3秒.$B$B再生光環.治療周圍15碼範圍內的團隊和團隊成員,使其生命值降低施法者法力上限的2%,最多影響10個目標,冷卻3秒.$B$B暗影護甲(被動).恢復相當於所受傷害百分比的法力值.$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70103','zhTW','|cff0000dd大魔導師|r$b|cffdd6600-=致敬魔獸爭霸III=-|r$B$B\\\\\\\"大法師,無法用言語來形容的暴雪親兒子\\\\\\\".$B$B法術傷害降低35%,部分免疫控制效果,布甲,造成火/冰法術傷害,無物理攻擊,法術能量加成:100%智力.主要屬性:智力.$B$B暴風雪！典型的暴風雪,只是稍微強大一點,6秒冷卻.召喚水元素攻擊大法師的敵人1分鐘,冷卻20秒.$B$B光輝光環.增加10%的法力上限,大大提高40碼範圍內己方和隊友的法力回復.$B$B大規模傳送.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70104','zhTW','|cff9900cc恐懼魔王|r$b|cffdd6600-=致敬魔獸爭霸III=-|r$B$B\\\\\\\"恐懼魔王,擁有黑暗力量和精神控制力的強大惡魔\\\\\\\".$B$B高護甲,高抵抗,部分免疫控制效果,所受傷害加速法術能量,鎧甲,造成近戰/暗影法術傷害,對癱瘓目標造成額外傷害,法術能量加成:200%力量.主要屬性:力量.$B$B腐蝕蟲群.派一大群蝙蝠與混亂魔法結合,對面前錐形範圍的敵人造成傷害,無法暴擊,冷卻10秒.$B$B沉睡.使敵方目標睡眠60秒,並允許下次對該目標的物理攻擊忽視護甲,造成的直接傷害將喚醒目標,冷卻6秒.$B$B吸血鬼的光環.增加5%的物理暴擊傷害,治療40碼範圍內的團隊和突襲成員受到近戰物理攻擊和腐肉群傷害的百分比(驚懼領主100%,其他人25%),沒有威脅.$B$B召喚地獄惡魔.召喚一個來自天空的惡魔,惡魔對魔法有很強的抵抗力並且持續180秒,180秒的冷卻時間.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70105','zhTW','|cff0000dd破法者|r$b|cffdd6600-=致敬魔獸爭霸III=-|r$B$B\\\\\\\"破法者,一個被訓練來破壞和扭曲魔法能量的精靈戰士\\\\\\\".$B$B法術傷害減少75%,部分免疫控制效果,護甲降低-30%,鎧甲,近戰/秘法傷害,法術能量加成:200%力量.主要屬性:力量.$B$B魔法偷取.從敵人身上偷取一個有益的法術並施於附近的盟友,或者從盟友身上移除一個消極的法術並施於附近的敵人,影響魔法和詛咒效果,3秒冷卻.$B$B能量竊取(被動).成功的近戰攻擊消耗目標的法力,相當於造成的傷害(由法術力增加),造成秘法傷害.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70106','zhTW','|cff9900cc黑暗遊俠|r$b|cffdd6600-=致敬魔獸爭霸III=-|r$B$B\\\\\\\"黑暗遊俠,強行起死回生的奎爾薩拉斯的前遊俠\\\\\\\".$B$B法術傷害減少35%,不死系,部分免疫控制效果,皮甲/布甲,造成物理/暗影法術傷害,不產生威脅,法術力量加成:50%智力.主要屬性:敏捷.$B$B沉默.使一個敵人和最多4個附近目標沉默8秒,15秒冷卻.$B$B黑箭.射出一支詛咒之箭,造成150%武器傷害和額外的暗影傷害.如果受影響的目標死於黑暗遊俠的傷害,黑暗僕從將從屍體中產生(最多5個僕從,持續時間80秒,只對人形、野獸和龍類有效).如果目標生命低於20%,造成5倍傷害.$B$B吸取生命.每秒吸取一個敵人的生命值,持續5秒,治療黑暗遊俠消耗生命值的200%.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70107','zhTW','|cff9900cc死靈法師|r$b|cffdd6600-=魔獸爭霸III / 暗黑破壞神II致敬=-|r$B$B受到的法術傷害減少20%,部分免疫控制效果,布甲,造成暗影法術傷害,沒有物理攻擊,法術強度加成: 智力的100%。主屬性: 智力。$B$B復活死者: 從屍體上復活2個骷髏(最多6個骷髏,持續65秒,只對人型生物、野獸和龍類有效)。$B$B邪惡狂熱: 增加目標的近戰攻擊速度75%,但持續消耗生命。持續45秒。不能取消。30級解鎖。$B$B屍體爆炸。讓屍體爆炸,對周圍所有敵人造成相當於死亡單位最大生命值35%至75%的傷害(取決於死靈法師的等級)。這種傷害不產生威脅。40級解鎖。$B$B殘廢: 減少目標的移動速度、近戰攻擊速度和總力量50%,持續60秒。50級解鎖。$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70108','zhTW','|cff0000dd海巫|r$b|cffdd6600-=魔獸爭霸III致敬=-|r$B$B\"海洋中的凶猛鱗皮居民,常與巨大風暴的到來聯繫在一起。\"$B$B受到的法術傷害減少30%,部分免疫控制效果,布甲,造成物理/冰霜法術/風暴法術傷害,攻擊力加成: 敏捷x2,法術強度加成: 智力的200%。主屬性: 智力。$B$B分叉閃電: 召喚一道閃電錐,傷害敵人。從2到所有目標(取決於海巫的等級),使它們昏迷2秒。這種傷害不產生威脅。$B$B冰霜箭。用冰霜法術為箭矢增加額外傷害,減慢目標的移動、攻擊和施法速度30%至70%(取決於海巫的等級)。$B$B法力護盾: 創造一個護盾,使用海巫的法力吸收100%的(未減免的)進來傷害。效果範圍從每10法力吸收1傷害到每1法力吸收10傷害(取決於海巫的等級)。$B$B龍捲風: 召喚一個猛烈的龍捲風,傷害並減慢附近敵方單位的速度,有時完全使它們失去行動能力。龍捲風在戶外隨時間增長,增加傷害和影響區域,但在室內縮小,迅速消散。60級解鎖。$B$B娜迦(被動): 在水中游泳速度、傷害和躲避機率大幅提升。$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70109','zhTW','|cff9900cc地穴領主|r$b|cffdd6600-=魔獸爭霸III致敬=-|r$B$B\"古老的龐然大物,曾是艾澤拉斯之王之一,現在是巫妖王麾下最強大的亡靈戰士之一。\"$B$B高度護甲,增加的抗性,部分免疫控制效果,免疫基於毒素的效果,鎖甲/板甲,造成近戰/暗影法術傷害,法術強度加成: 力量的200%。主屬性: 力量。$B$B穿刺。地穴領主用他巨大的爪子猛擊地面,向前錐形射出尖刺,造成傷害並將敵方單位掀入空中,使他們暈眩。20級解鎖。$B$B刺甲: 地穴領主的幾丁質護甲增加傷害抗性,並將15%至50%的傷害反彈給近戰攻擊者。$B$B腐屍甲蟲。地穴領主從敵人的新鮮屍體上產生一個腐屍甲蟲來攻擊他的敵人。甲蟲是永久的,但不會恢復生命值,一次最多控制6個。更高等級允許地穴領主召喚更強大的甲蟲。10級解鎖。$B$B蝗蟲群: 地穴領主釋放一群20-40隻(取決於地穴領主的等級)憤怒的蝗蟲,啃咬並撕扯附近的敵方單位,減少他們的移動或攻擊能力。當它們啃食敵人肉體時,它們將其轉化為一種物質,當它們返回時恢復地穴領主的生命值。40級解鎖。$B$B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70201','zhTW','並不總是有人願意為錢去賣命！',NULL,'我們的服務遍布艾澤拉斯的每個角落！',NULL,'很高興為您服務，我這里有最能打的傢伙！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70202','zhTW','雇傭兵向來十分搶手；以下是現在你能雇傭的人：',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70203','zhTW','雇傭兵向來十分搶手；以下是現在你能雇傭的人：',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70204','zhTW','看來現在沒有空閒的雇傭兵，你過些時候再來看看吧。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70300','zhTW','去死！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70301','zhTW','正在復活你！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70302','zhTW','正在復活 ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70303','zhTW','你的機器人',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70304','zhTW','的機器人',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70305','zhTW','我現在還不能製造魔法水',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70306','zhTW','我現在還不能製造魔法食物',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70307','zhTW','我還不能那樣做',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70308','zhTW','給你...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70309','zhTW','已禁用',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70310','zhTW','還沒有準備好',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70311','zhTW','無效的物品類型',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70312','zhTW','失敗',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70313','zhTW','完成',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70314','zhTW','我沒有變形',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70315','zhTW','我沒有治療石',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70316','zhTW','我還不能製造治療石',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70317','zhTW','搞什麼鬼，我沒有鎖可開！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70318','zhTW','我的技能等級還不夠高',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70319','zhTW','正在將我的天賦切換為',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70320','zhTW','武器',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70321','zhTW','狂怒',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70322','zhTW','防護',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70323','zhTW','懲戒',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70324','zhTW','野獸控制',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70325','zhTW','射擊',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70326','zhTW','生存',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70327','zhTW','刺殺',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70328','zhTW','戰鬥',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70329','zhTW','敏銳',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70330','zhTW','戒律',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70331','zhTW','神聖',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70332','zhTW','暗影',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70333','zhTW','鮮血',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70334','zhTW','冰霜',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70335','zhTW','邪惡',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70336','zhTW','元素',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70337','zhTW','增強',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70338','zhTW','恢復',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70339','zhTW','秘法',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70340','zhTW','火焰',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70341','zhTW','痛苦',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70342','zhTW','惡魔學識',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70343','zhTW','毀滅',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70344','zhTW','平衡',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70345','zhTW','野性戰鬥',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70346','zhTW','未知',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70347','zhTW','滾開！ 懦夫。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70348','zhTW',' 不方便。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70349','zhTW','我不會把我寶貴的時間浪費在這些瑣事上！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70350','zhTW','NIY',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70351','zhTW','NIY',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70352','zhTW','NIY',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70353','zhTW','我準備好了',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70354','zhTW','走開！我已經有雇主了！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70355','zhTW','未知',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70356','zhTW','在你身上！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70357','zhTW','在我身上！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70358','zhTW',' 對 ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70359','zhTW',' 已使用！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70360','zhTW','坦克機器人',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70361','zhTW','職業',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70362','zhTW','玩家',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70363','zhTW','雇主',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70364','zhTW','無',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70365','zhTW','級別',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70366','zhTW','天賦',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70367','zhTW','被動',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70368','zhTW','隱藏',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70369','zhTW','已知',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70370','zhTW','能力',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70371','zhTW','力量',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70372','zhTW','敏捷',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70373','zhTW','耐力',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70374','zhTW','智力',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70375','zhTW','精神',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70376','zhTW','未知屬性',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70377','zhTW','共',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70378','zhTW','近戰攻擊強度',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70379','zhTW','遠程攻擊強度',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70380','zhTW','護甲',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70381','zhTW','暴擊',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70382','zhTW','防禦',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70383','zhTW','未命中',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70384','zhTW','躲閃',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70385','zhTW','招架',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70386','zhTW','格擋',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70387','zhTW','盾牌格擋值',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70388','zhTW','近戰防禦',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70389','zhTW','法術防禦',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70390','zhTW','主手攻擊傷害範圍',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70391','zhTW','主手攻擊傷害加成',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70392','zhTW','主手攻擊速度',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70393','zhTW','副手攻擊傷害範圍',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70394','zhTW','副手攻擊傷害加成',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70395','zhTW','副手攻擊速度',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70396','zhTW','遠程攻擊傷害範圍',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70397','zhTW','遠程攻擊傷害加成',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70398','zhTW','遠程攻擊速度',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70399','zhTW','最小',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70400','zhTW','最大',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70401','zhTW','輸出',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70402','zhTW','基礎生命值',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70403','zhTW','最大生命值',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70404','zhTW','基礎法力值',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70405','zhTW','最大法力值',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70406','zhTW','當前法力值',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70407','zhTW','法術強度',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70408','zhTW','每5秒恢復生命',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70409','zhTW','非施法狀態：每5秒回復法力值',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70410','zhTW','施法狀態：每5秒回復法力值',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70411','zhTW','急速',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70412','zhTW','命中',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70413','zhTW','專精',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70414','zhTW','物理 護甲穿透',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70415','zhTW','法術 護甲穿透',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70416','zhTW','%',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70417','zhTW','神聖',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70418','zhTW','火焰',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70419','zhTW','自然',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70420','zhTW','冰霜',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70421','zhTW','暗影',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70422','zhTW','秘法',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70423','zhTW','抗性',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70424','zhTW','指令狀態',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70425','zhTW','跟隨',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70426','zhTW','攻擊',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70427','zhTW','停留',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70428','zhTW','重置',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70429','zhTW','完全停止',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70430','zhTW','跟隨距離',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70431','zhTW','天賦',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70432','zhTW','機器人主職務',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70433','zhTW','機器人材料採集',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70434','zhTW','PvP 殺敵',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70435','zhTW','玩家',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70436','zhTW','已死亡 ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70437','zhTW',' 次',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70438','zhTW','%s （機器人）漸漸冷靜了下來。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70439','zhTW','<Debug調試>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70440','zhTW','你真的想冒險引起',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70441','zhTW','對你的注意？',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70442','zhTW','<請投幣>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70443','zhTW','你想吸引',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70444','zhTW','<試著發出邀請...>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70445','zhTW','你想雇傭',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70446','zhTW','<雇傭機器人>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70447','zhTW','機器人 裝備 管理...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70448','zhTW','機器人 職責 管理...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70449','zhTW','機器人 隊形 管理...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70450','zhTW','機器人 技能 管理...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70451','zhTW','機器人 天賦 管理...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70452','zhTW','使用消耗品、合劑等...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70453','zhTW','<創建隊伍>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70454','zhTW','<創建隊伍（所有機器人）>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70455','zhTW','<加入隊伍>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70456','zhTW','<將所有機器人加入隊伍>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70457','zhTW','<移出隊伍>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70458','zhTW','跟著我！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70459','zhTW','原地守候！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70460','zhTW','停下來，什麼也別做！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70461','zhTW','給我一些食物',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70462','zhTW','給我一些水',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70463','zhTW','召喚一個魔法餐桌！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70464','zhTW','幫我開個鎖',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70465','zhTW','給我一顆治療石',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70466','zhTW','召喚一個靈魂之井！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70467','zhTW','給你的武器重新上毒...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70468','zhTW','<選擇毒藥 （主手武器）>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70469','zhTW','<選擇毒藥 （副手武器）>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70470','zhTW','元素武器附魔...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70471','zhTW','<選擇附魔 （主手武器）>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70472','zhTW','<選擇附魔 （副手武器）>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70473','zhTW','取消你的變形形態',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70474','zhTW','<選擇寵物類型>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70475','zhTW','你被解雇了！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70476','zhTW','你確定要解雇',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70477','zhTW','你可別後悔...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70478','zhTW','該死的，振作起來！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70479','zhTW','<職業介紹>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70480','zhTW','沒事了',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70481','zhTW','距離',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70482','zhTW','返回',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70483','zhTW','<自動>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70484','zhTW','<解散寵物>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70485','zhTW','召喚隨機寵物 (狡詐型)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70486','zhTW','召喚隨機寵物 (殘暴型)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70487','zhTW','召喚隨機寵物 (堅韌型)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70488','zhTW','讓我看看你的裝備',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70489','zhTW','自動篩選可用裝備...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70490','zhTW','主手武器...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70491','zhTW','副手武器...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70492','zhTW','遠程武器...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70493','zhTW','聖物...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70494','zhTW','頭部...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70495','zhTW','肩部...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70496','zhTW','胸部...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70497','zhTW','腰帶...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70498','zhTW','腿部...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70499','zhTW','腳...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70500','zhTW','手腕...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70501','zhTW','手...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70502','zhTW','披風...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70503','zhTW','襯衣...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70504','zhTW','戒指1...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70505','zhTW','戒指2...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70506','zhTW','飾品1...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70507','zhTW','飾品2...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70508','zhTW','頸部...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70509','zhTW','卸下全部裝備（退回到背包）',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70510','zhTW','刷新機器人外觀',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70511','zhTW','只有外觀，無實際效果',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70512','zhTW','已裝備',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70513','zhTW','沒有可供選擇的裝備',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70514','zhTW','使用你的舊裝備',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70515','zhTW','卸下這件裝備',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70516','zhTW','額...我沒有適合你的裝備了...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70517','zhTW','收集材料',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70518','zhTW','技能狀態...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70519','zhTW','管理可用技能...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70520','zhTW','使用 ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70521','zhTW','刷新',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70522','zhTW','傷害類技能...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70523','zhTW','控制類技能...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70524','zhTW','治療類技能...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70525','zhTW','其他技能...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70526','zhTW',' 發出了一陣摩擦聲，並開始跟隨著 ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70527','zhTW','在他的雇主把他解雇之前， %s不能加入你的隊伍。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70528','zhTW','在你到達60級以前， %s不會加入你們',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70529','zhTW','在你到達55級以前， %s不會加入你們',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70530','zhTW','在你到達40級以前， %s不會加入你們',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70531','zhTW','在你到達20級以前， %s不會加入你們',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70532','zhTW','你最多只能招募%u個機器人！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70533','zhTW','你沒有足夠的現金',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70534','zhTW','你最多只能招募%u位%u。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70535','zhTW','無法退還裝備 %u (%s)! 無法解雇機器人！',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70536','zhTW','當前設定',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70537','zhTW','攻擊距離',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70538','zhTW','最小遠程攻擊距離...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70539','zhTW','最大遠程攻擊距離...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70540','zhTW','設定攻擊距離',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70541','zhTW','移除增益魔法...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70542','zhTW','修正屬性...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70543','zhTW','因為某些原因，無法卸下 %s 這件裝備將發到你的郵箱。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70544','zhTW','坦克',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70545','zhTW','遠程',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70546','zhTW','採礦',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70547','zhTW','草藥',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70548','zhTW','剝皮',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70549','zhTW','工程學',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70550','zhTW','由於長時間未上線，已自動解除雇傭狀態。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70551','zhTW','機器人系統已被停用，請聯系管理員。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70552','zhTW','%s 不能假如你的隊伍，已經有雇主了：%s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70553','zhTW','%s 正在傳送中，不能加入你的隊伍',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70554','zhTW','守護',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70555','zhTW','靈猴',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70556','zhTW','雄鷹守護',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70557','zhTW','獵豹守護',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70558','zhTW','蝮蛇守護',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70559','zhTW','野獸守護',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70560','zhTW','豹群守護',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70561','zhTW','野性守護',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70562','zhTW','龍鷹守護',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70563','zhTW','無守護',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70564','zhTW','光環',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70565','zhTW','虔誠',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70566','zhTW','專注',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70567','zhTW','火焰抗性',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70568','zhTW','冰霜抗性',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70569','zhTW','暗影抗性',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70570','zhTW','懲戒',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70571','zhTW','十字軍',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70572','zhTW','無光環',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70573','zhTW','減速藥膏',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70574','zhTW','速效藥膏',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70575','zhTW','致命藥膏',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70576','zhTW','致傷藥膏',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70577','zhTW','麻痹藥膏',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70578','zhTW','麻醉藥膏',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70579','zhTW','無',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70580','zhTW','火舌武器',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70581','zhTW','冰封武器',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70582','zhTW','風怒武器',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70583','zhTW','大地生命武器',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70584','zhTW','我需要你的服務。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70585','zhTW','你不能再雇傭更多的機器人了。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70586','zhTW','你希望雇傭',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70587','zhTW','現在正在忙著，請稍後再試。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70588','zhTW','很高興和你進行交易。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70589','zhTW','戰士',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70590','zhTW','聖騎士',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70591','zhTW','法師',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70592','zhTW','牧師',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70593','zhTW','術士',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70594','zhTW','德魯伊',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70595','zhTW','死亡騎士',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70596','zhTW','盜賊',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70597','zhTW','薩滿',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70598','zhTW','獵人',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70599','zhTW','劍聖',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70600','zhTW','黑曜石毀滅者',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70601','zhTW','大法師',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70602','zhTW','恐懼魔王',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70603','zhTW','破法者',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70604','zhTW','黑暗遊俠',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70605','zhTW','戰士',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70606','zhTW','聖騎士',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70607','zhTW','法師',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70608','zhTW','牧師',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70609','zhTW','術士',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70610','zhTW','德魯伊',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70611','zhTW','死亡騎士',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70612','zhTW','盜賊',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70613','zhTW','薩滿',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70614','zhTW','獵人',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70615','zhTW','劍聖',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70616','zhTW','黑曜石毀滅者',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70617','zhTW','大法師',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70618','zhTW','恐懼魔王',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70619','zhTW','破法者',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70620','zhTW','黑暗遊俠',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70621','zhTW','男',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70622','zhTW','女',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70623','zhTW','人類',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70624','zhTW','獸人',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70625','zhTW','矮人',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70626','zhTW','夜精靈',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70627','zhTW','不死族',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70628','zhTW','牛頭人',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70629','zhTW','地精',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70630','zhTW','食人妖',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70631','zhTW','血精靈',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70632','zhTW','德萊尼',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70633','zhTW','未知',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70634','zhTW','自動拾取',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70635','zhTW','|cff9d9d9d灰色|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70636','zhTW','|cffffffff白色|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70637','zhTW','|cff1eff00綠色|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70638','zhTW','|cff0070dd藍色|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70639','zhTW','|cffa335ee紫色|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70640','zhTW','|cffff8000橙色|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70641','zhTW','參與行為',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70642','zhTW','|延遲攻擊時間|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70643','zhTW','|延遲治療時間|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70644','zhTW','|秒|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70645','zhTW','|副坦克|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70646','zhTW','|死靈法師們|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70647','zhTW','|死靈法師|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70648','zhTW','|攻擊方向|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70649','zhTW','|正常|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70650','zhTW','|避免正面AOE|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70651','zhTW','|NIY|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70652','zhTW','|你確定這會奏效嗎？最好是世界上最好的水....|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70653','zhTW','|看來你真的需要喝點淡水。|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70654','zhTW','|海女巫們|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70655','zhTW','|海女巫|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70656','zhTW','|每點傷害的法力|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70657','zhTW','|每點魔法的傷害|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70658','zhTW','幻化...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70659','zhTW','禁用戰鬥定位',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70660','zhTW','優先目標',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70661','zhTW','機器人裝備銀行...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70662','zhTW','存款項目...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70663','zhTW','撤回物品...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70664','zhTW','銀行是空的',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70665','zhTW','前一頁',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70666','zhTW','下一頁',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70667','zhTW','你真的想花這麼多錢讓地窟領主再次動起來嗎？',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70668','zhTW','我很懷疑你現在的狀態,但我願意帶領你並幫助你恢復力量。',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70669','zhTW','地窟領主們|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70670','zhTW','|地窟領主|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70671','zhTW','反射',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70672','zhTW','蝗蟲',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70673','zhTW','治療目標生命閾值',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70674','zhTW','我需要傳送門',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70675','zhTW','暴風城',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70676','zhTW','鐵爐堡',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70677','zhTW','達納蘇斯',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70678','zhTW','艾克索達',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70679','zhTW','奧格瑞瑪',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70680','zhTW','幽暗城',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70681','zhTW','雷霆崖',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70682','zhTW','銀月城',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70683','zhTW','沙塔斯城',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),\n('70684','zhTW','達拉然',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);\n"
  },
  {
    "path": "SQL/merge_sqls_auth_unix.sh",
    "content": "#!/bin/bash\ncat updates/auth/*.sql > ALL_auth.sql\n"
  },
  {
    "path": "SQL/merge_sqls_auth_windows.bat",
    "content": "copy /a updates\\auth\\*.sql /b ALL_auth.sql\n"
  },
  {
    "path": "SQL/merge_sqls_characters_unix.sh",
    "content": "#!/bin/bash\ncat characters_bots.sql > ALL_characters.sql\ncat updates/characters/*.sql >> ALL_characters.sql\n"
  },
  {
    "path": "SQL/merge_sqls_characters_windows.bat",
    "content": "copy /a characters_bots.sql + /a updates\\characters\\*.sql /b ALL_characters.sql\n"
  },
  {
    "path": "SQL/merge_sqls_world_unix.sh",
    "content": "#!/bin/bash\ncat *world_*.sql > ALL_world.sql\ncat updates/world/*.sql >> ALL_world.sql\n"
  },
  {
    "path": "SQL/merge_sqls_world_windows.bat",
    "content": "copy /a *world_*.sql + /a updates\\world\\*.sql /b ALL_world.sql\n"
  },
  {
    "path": "SQL/updates/auth/2021_09_14_00_rbac_permissions.sql",
    "content": "--\nSET @PERMISSION_START = 70001;\nSET @PERMISSION_END   = 70033;\n\nDELETE FROM `rbac_permissions` WHERE id BETWEEN @PERMISSION_START AND @PERMISSION_END;\nINSERT INTO `rbac_permissions` (`id`,`name`) VALUES\n('70001','Command: npcbot'),\n('70002','Command: npcbot add'),\n('70003','Command: npcbot remove'),\n('70004','Command: npcbot spawn'),\n('70005','Command: npcbot move'),\n('70006','Command: npcbot delete'),\n('70007','Command: npcbot lookup'),\n('70008','Command: npcbot revive'),\n('70009','Command: npcbot reloadconfig'),\n('70010','Command: npcbot info'),\n('70011','Command: npcbot hide'),\n('70012','Command: npcbot unhide'),\n('70013','Command: npcbot recall'),\n('70014','Command: npcbot kill'),\n('70015','Command: npcbot debug raid'),\n('70016','Command: npcbot debug mount'),\n('70017','Command: npcbot debug spellvisual'),\n('70018','Command: npcbot debug states'),\n('70019','Command: npcbot toggle flags'),\n('70020','Command: npcbot set faction'),\n('70021','Command: npcbot set owner'),\n('70022','Command: npcbot set spec'),\n('70023','Command: npcbot command standstill'),\n('70024','Command: npcbot command stopfully'),\n('70025','Command: npcbot command follow'),\n('70026','Command: npcbot distance attack short'),\n('70027','Command: npcbot distance attack long'),\n('70028','Command: npcbot distance attack'),\n('70029','Command: npcbot distance'),\n('70030','Command: npcbot order cast'),\n('70031','Command: npcbot vehicle eject'),\n('70032','Command: npcbot dump load'),\n('70033','Command: npcbot dump write');\n"
  },
  {
    "path": "SQL/updates/auth/2021_09_14_01_rbac_linked_permissions.sql",
    "content": "--\nSET @PERMISSION_START = 70001;\nSET @PERMISSION_END   = 70033;\n\nDELETE FROM `rbac_linked_permissions` WHERE linkedId BETWEEN @PERMISSION_START AND @PERMISSION_END;\nINSERT INTO `rbac_linked_permissions` (`id`,`linkedId`) VALUES\n('199','70001'),\n('197','70002'),\n('197','70003'),\n('197','70004'),\n('197','70005'),\n('197','70006'),\n('197','70007'),\n('197','70008'),\n('197','70009'),\n('199','70010'),\n('199','70011'),\n('199','70012'),\n('199','70013'),\n('199','70014'),\n('197','70015'),\n('197','70016'),\n('197','70017'),\n('197','70018'),\n('197','70019'),\n('197','70020'),\n('197','70021'),\n('197','70022'),\n('199','70023'),\n('199','70024'),\n('199','70025'),\n('199','70026'),\n('199','70027'),\n('199','70028'),\n('199','70029'),\n('199','70030'),\n('199','70031'),\n('196','70032'),\n('196','70033');\n"
  },
  {
    "path": "SQL/updates/auth/2021_12_29_00_rbac_permissions.sql",
    "content": "--\nSET @PERMISSION_START = 70034;\nSET @PERMISSION_END   = 70034;\n\nDELETE FROM `rbac_permissions` WHERE id BETWEEN @PERMISSION_START AND @PERMISSION_END;\nINSERT INTO `rbac_permissions` (`id`,`name`) VALUES\n('70034','Command: npcbot spawned');\n"
  },
  {
    "path": "SQL/updates/auth/2021_12_29_01_rbac_linked_permissions.sql",
    "content": "--\nSET @PERMISSION_START = 70034;\nSET @PERMISSION_END   = 70034;\n\nDELETE FROM `rbac_linked_permissions` WHERE linkedId BETWEEN @PERMISSION_START AND @PERMISSION_END;\nINSERT INTO `rbac_linked_permissions` (`id`,`linkedId`) VALUES\n('196','70034');\n"
  },
  {
    "path": "SQL/updates/auth/2022_06_24_00_rbac_permissions.sql",
    "content": "--\nSET @PERMISSION_START = 70035;\nSET @PERMISSION_END   = 70035;\n\nDELETE FROM `rbac_permissions` WHERE id BETWEEN @PERMISSION_START AND @PERMISSION_END;\nINSERT INTO `rbac_permissions` (`id`,`name`) VALUES\n('70035','Command: npcbot command walk');\n"
  },
  {
    "path": "SQL/updates/auth/2022_06_24_01_rbac_linked_permissions.sql",
    "content": "--\nSET @PERMISSION_START = 70035;\nSET @PERMISSION_END   = 70035;\n\nDELETE FROM `rbac_linked_permissions` WHERE linkedId BETWEEN @PERMISSION_START AND @PERMISSION_END;\nINSERT INTO `rbac_linked_permissions` (`id`,`linkedId`) VALUES\n('199','70035');\n"
  },
  {
    "path": "SQL/updates/auth/2022_07_04_00_rbac_permissions.sql",
    "content": "--\nSET @PERMISSION_START = 70036;\nSET @PERMISSION_END   = 70036;\n\nDELETE FROM `rbac_permissions` WHERE id BETWEEN @PERMISSION_START AND @PERMISSION_END;\nINSERT INTO `rbac_permissions` (`id`,`name`) VALUES\n('70036','Command: npcbot createnew');\n"
  },
  {
    "path": "SQL/updates/auth/2022_07_04_01_rbac_linked_permissions.sql",
    "content": "--\nSET @PERMISSION_START = 70036;\nSET @PERMISSION_END   = 70036;\n\nDELETE FROM `rbac_linked_permissions` WHERE linkedId BETWEEN @PERMISSION_START AND @PERMISSION_END;\nINSERT INTO `rbac_linked_permissions` (`id`,`linkedId`) VALUES\n('196','70036');\n"
  },
  {
    "path": "SQL/updates/auth/2022_11_30_00_rbac_permissions.sql",
    "content": "--\nSET @PERMISSION_START = 70037;\nSET @PERMISSION_END   = 70037;\n\nDELETE FROM `rbac_permissions` WHERE id BETWEEN @PERMISSION_START AND @PERMISSION_END;\nINSERT INTO `rbac_permissions` (`id`,`name`) VALUES\n('70037','Command: npcbot sendto');\n"
  },
  {
    "path": "SQL/updates/auth/2022_11_30_rbac_linked_permissions.sql",
    "content": "--\nSET @PERMISSION_START = 70037;\nSET @PERMISSION_END   = 70037;\n\nDELETE FROM `rbac_linked_permissions` WHERE linkedId BETWEEN @PERMISSION_START AND @PERMISSION_END;\nINSERT INTO `rbac_linked_permissions` (`id`,`linkedId`) VALUES\n('199','70037');\n"
  },
  {
    "path": "SQL/updates/auth/2023_08_12_00_rbac_linked_permissions.sql",
    "content": "--\nUPDATE `rbac_linked_permissions` SET `id`='197' WHERE (`id`='196') AND (`linkedId`='70034');\n"
  },
  {
    "path": "SQL/updates/characters/2020_05_15_characters_npcbot_NPCBots_4.7.8a-4.7.27a.sql",
    "content": "ALTER TABLE `characters_npcbot` ADD `spec` tinyint(3) unsigned NOT NULL DEFAULT '1' AFTER `roles`;\n"
  },
  {
    "path": "SQL/updates/characters/2020_06_21_characters_npcbot_43fceb98.sql",
    "content": "DROP TEMPORARY TABLE IF EXISTS `npcbot_extras_temp`;\n\nCREATE TEMPORARY TABLE `npcbot_extras_temp` (\n  `entry` MEDIUMINT(8) UNSIGNED NOT NULL,\n  `class` TINYINT(3) UNSIGNED NOT NULL DEFAULT '1',\n  PRIMARY KEY (`entry`)\n) ENGINE=INNODB DEFAULT CHARSET=utf8;\n\nINSERT INTO `npcbot_extras_temp` (`entry`,`class`) VALUES\n('70001','1'),('70002','1'),('70003','1'),('70004','1'),('70005','1'),\n('70006','1'),('70007','1'),('70008','1'),('70009','1'),('70010','1'),\n('70011','1'),('70012','1'),('70013','1'),('70014','1'),('70015','1'),\n('70016','1'),('70017','1'),('70018','1'),('70019','1'),('70020','1'),\n('70021','1'),('70022','1'),('70023','1'),('70024','1'),('70025','1'),\n('70026','1'),('70027','1'),('70028','1'),('70029','1'),('70030','1'),\n('70031','1'),('70032','1'),('70033','1'),('70034','1'),('70035','1'),\n('70036','1'),('70037','1'),('70038','1'),('70051','2'),('70052','2'),\n('70053','2'),('70054','2'),('70055','2'),('70056','2'),('70057','2'),\n('70058','2'),('70059','2'),('70060','2'),('70061','2'),('70062','2'),\n('70063','2'),('70064','2'),('70065','2'),('70066','2'),('70067','2'),\n('70068','2'),('70069','2'),('70070','2'),('70071','2'),('70072','2'),\n('70073','2'),('70074','2'),('70101','3'),('70102','3'),('70103','3'),\n('70104','3'),('70105','3'),('70106','3'),('70107','3'),('70108','3'),\n('70109','3'),('70110','3'),('70111','3'),('70112','3'),('70113','3'),\n('70114','3'),('70115','3'),('70116','3'),('70117','3'),('70118','3'),\n('70119','3'),('70120','3'),('70121','3'),('70122','3'),('70123','3'),\n('70124','3'),('70125','3'),('70126','3'),('70127','3'),('70128','3'),\n('70129','3'),('70130','3'),('70131','3'),('70132','3'),('70133','3'),\n('70134','3'),('70135','3'),('70136','3'),('70137','3'),('70138','3'),\n('70139','3'),('70151','4'),('70152','4'),('70153','4'),('70154','4'),\n('70155','4'),('70156','4'),('70157','4'),('70158','4'),('70159','4'),\n('70160','4'),('70161','4'),('70162','4'),('70163','4'),('70164','4'),\n('70165','4'),('70166','4'),('70167','4'),('70168','4'),('70169','4'),\n('70170','4'),('70171','4'),('70172','4'),('70173','4'),('70174','4'),\n('70175','4'),('70176','4'),('70177','4'),('70178','4'),('70179','4'),\n('70180','4'),('70181','4'),('70201','5'),('70202','5'),('70203','5'),\n('70204','5'),('70205','5'),('70206','5'),('70207','5'),('70208','5'),\n('70209','5'),('70210','5'),('70211','5'),('70212','5'),('70213','5'),\n('70214','5'),('70215','5'),('70216','5'),('70217','5'),('70218','5'),\n('70219','5'),('70220','5'),('70221','5'),('70222','5'),('70223','5'),\n('70224','5'),('70225','5'),('70226','5'),('70227','5'),('70228','5'),\n('70229','5'),('70230','5'),('70231','5'),('70232','5'),('70233','5'),\n('70234','5'),('70235','5'),('70236','5'),('70237','5'),('70238','5'),\n('70239','5'),('70240','5'),('70251','7'),('70252','7'),('70253','7'),\n('70254','7'),('70255','7'),('70256','7'),('70257','7'),('70258','7'),\n('70259','7'),('70260','7'),('70261','7'),('70265','7'),('70267','7'),\n('70268','7'),('70301','8'),('70302','8'),('70303','8'),('70304','8'),\n('70305','8'),('70306','8'),('70307','8'),('70308','8'),('70309','8'),\n('70310','8'),('70311','8'),('70312','8'),('70313','8'),('70314','8'),\n('70315','8'),('70316','8'),('70317','8'),('70318','8'),('70319','8'),\n('70320','8'),('70321','8'),('70322','8'),('70323','8'),('70324','8'),\n('70325','8'),('70326','8'),('70327','8'),('70328','8'),('70329','8'),\n('70330','8'),('70331','8'),('70332','8'),('70333','8'),('70334','8'),\n('70335','8'),('70336','8'),('70351','9'),('70352','9'),('70353','9'),\n('70354','9'),('70355','9'),('70356','9'),('70357','9'),('70358','9'),\n('70359','9'),('70360','9'),('70361','9'),('70362','9'),('70363','9'),\n('70364','9'),('70365','9'),('70366','9'),('70367','9'),('70368','9'),\n('70369','9'),('70370','9'),('70371','9'),('70372','9'),('70373','9'),\n('70374','9'),('70375','9'),('70376','9'),('70377','9'),('70401','11'),\n('70402','11'),('70403','11'),('70404','11'),('70405','11'),('70406','11'),\n('70407','11'),('70408','11'),('70409','11'),('70410','11'),('70411','11'),\n('70412','11'),('70413','11'),('70414','11'),('70415','11'),('70416','11'),\n('70417','11'),('70418','11'),('70451','6'),('70452','6'),('70453','6'),\n('70454','6'),('70455','6'),('70456','6'),('70457','6'),('70458','6'),\n('70459','6'),('70460','6'),('70461','6'),('70462','6'),('70463','6'),\n('70464','6'),('70465','6'),('70501','0'),('70502','0'),('70503','0'),\n('70504','0'),('70505','0'),('70506','0'),('70507','0'),('70508','0'),\n('70509','0'),('70510','0'),('70511','0'),('70512','0'),('70513','0'),\n('70514','0'),('70515','0'),('70516','0'),('70517','0'),('70518','0'),\n('70519','0'),('70520','0'),('70521','0'),('70522','0'),('70523','0'),\n('70524','0'),('70525','0'),('70526','0'),('70527','0'),('70528','0'),\n('70529','0'),('70530','0'),('70531','0'),('70532','0'),('70533','0'),\n('70534','0'),('70535','0'),('70536','0'),('70537','0'),('70538','0'),\n('70542','0'),('70543','0'),('70544','0'),('70545','0'),('70551','12'),\n('70552','12'),('70553','13'),('70554','13'),('70555','14'),('70556','0'),\n('70557','15'),('70558','15'),('70559','15'),('70560','15'),('70561','15'),\n('70562','0'),('70563','16'),('70564','16'),('70565','16'),('70566','16'),\n('70567','16'),('70568','17'),('70569','17'),('70570','17'),('70571','17'),\n('70572','17'),('70573','0'),('70574','0');\n\n/*!50003 DROP PROCEDURE IF EXISTS `sp__update_specs_2020_06_21`*/;\n\nDELIMITER ;;\n\n/*!50003 CREATE*/\n/*!50003 PROCEDURE `sp__update_specs_2020_06_21`()\nBEGIN\n\nDECLARE CLASS_WARRIOR INT DEFAULT 1;\nDECLARE CLASS_PALADIN INT DEFAULT 2;\nDECLARE CLASS_HUNTER INT DEFAULT 3;\nDECLARE CLASS_ROGUE INT DEFAULT 4;\nDECLARE CLASS_PRIEST INT DEFAULT 5;\nDECLARE CLASS_DEATH_KNIGHT INT DEFAULT 6;\nDECLARE CLASS_SHAMAN INT DEFAULT 7;\nDECLARE CLASS_MAGE INT DEFAULT 8;\nDECLARE CLASS_WARLOCK INT DEFAULT 9;\nDECLARE CLASS_DRUID INT DEFAULT 11;\nDECLARE CLASS_BLADEMASTER INT DEFAULT 12;\nDECLARE CLASS_SPHYNX INT DEFAULT 13;\nDECLARE CLASS_ARCHMAGE INT DEFAULT 14;\nDECLARE CLASS_DREADLORD INT DEFAULT 15;\nDECLARE CLASS_SPELL_BREAKER INT DEFAULT 16;\nDECLARE CLASS_DARK_RANGER INT DEFAULT 17;\n\nDECLARE SPEC_START_WARRIOR INT DEFAULT 1;\nDECLARE SPEC_START_PALADIN INT DEFAULT 4;\nDECLARE SPEC_START_HUNTER INT DEFAULT 7;\nDECLARE SPEC_START_ROGUE INT DEFAULT 10;\nDECLARE SPEC_START_PRIEST INT DEFAULT 13;\nDECLARE SPEC_START_DEATH_KNIGHT INT DEFAULT 16;\nDECLARE SPEC_START_SHAMAN INT DEFAULT 19;\nDECLARE SPEC_START_MAGE INT DEFAULT 22;\nDECLARE SPEC_START_WARLOCK INT DEFAULT 25;\nDECLARE SPEC_START_DRUID INT DEFAULT 28;\nDECLARE SPEC_DEFAULT INT DEFAULT 31;\n\nDECLARE NPCBOT_ENTRY_BEGIN INT DEFAULT 70001;\nDECLARE NPCBOT_ENTRY_END INT DEFAULT 71000;\n\nDECLARE cur_pos INT;\nDECLARE myclass INT;\nDECLARE myspec INT;\n\nSET cur_pos = NPCBOT_ENTRY_BEGIN;\nWHILE cur_pos < NPCBOT_ENTRY_END DO\n    SET myclass = (SELECT `class` FROM `npcbot_extras_temp` WHERE `entry` = cur_pos);\n    SET myspec = (SELECT `spec` FROM `characters_npcbot` WHERE `entry` = cur_pos);\n\n    IF myclass != 0 AND myspec != 0 AND myspec < 4 THEN\n\n        IF myclass = CLASS_WARRIOR THEN\n            SET myspec = myspec + SPEC_START_WARRIOR - 1;\n        ELSEIF myclass = CLASS_PALADIN THEN\n            SET myspec = myspec + SPEC_START_PALADIN - 1;\n        ELSEIF myclass = CLASS_HUNTER THEN\n            SET myspec = myspec + SPEC_START_HUNTER - 1;\n        ELSEIF myclass = CLASS_ROGUE THEN\n            SET myspec = myspec + SPEC_START_ROGUE - 1;\n        ELSEIF myclass = CLASS_PRIEST THEN\n            SET myspec = myspec + SPEC_START_PRIEST - 1;\n        ELSEIF myclass = CLASS_DEATH_KNIGHT THEN\n            SET myspec = myspec + SPEC_START_DEATH_KNIGHT - 1;\n        ELSEIF myclass = CLASS_SHAMAN THEN\n            SET myspec = myspec + SPEC_START_SHAMAN - 1;\n        ELSEIF myclass = CLASS_MAGE THEN\n            SET myspec = myspec + SPEC_START_MAGE - 1;\n        ELSEIF myclass = CLASS_WARLOCK THEN\n            SET myspec = myspec + SPEC_START_WARLOCK - 1;\n        ELSEIF myclass = CLASS_DRUID THEN\n            SET myspec = myspec + SPEC_START_DRUID - 1;\n        ELSE\n            SET myspec = SPEC_DEFAULT;\n        END IF;\n\n        UPDATE `characters_npcbot` SET `spec` = myspec WHERE `entry` = cur_pos;\n\n    END IF;\n\n    SET cur_pos = cur_pos + 1;\n\nEND WHILE;\n\nDROP TEMPORARY TABLE IF EXISTS `npcbot_extras_temp`;\n\nEND*/;;\n\nDELIMITER ;\n\nCALL `sp__update_specs_2020_06_21`();\n\nDROP PROCEDURE IF EXISTS `sp__update_specs_2020_06_21`;\n"
  },
  {
    "path": "SQL/updates/characters/2020_10_08_characters_npcbot_NPCBots_4.7.34a-4.7.39a.sql",
    "content": "ALTER TABLE `characters_npcbot` ADD `spells_disabled` longtext AFTER `equipNeck`;\n"
  },
  {
    "path": "SQL/updates/characters/2021_01_04_characters_npcbot.sql",
    "content": "ALTER TABLE `characters_npcbot` MODIFY COLUMN `roles` int(10) unsigned NOT NULL COMMENT 'bitmask: tank(1),dps(2),heal(4),ranged(8)';\n"
  },
  {
    "path": "SQL/updates/characters/2021_01_24_characters_npcbot_stats.sql",
    "content": "DROP TABLE IF EXISTS `characters_npcbot_stats`;\n\nCREATE TABLE `characters_npcbot_stats` (\n  `entry` int(10) unsigned NOT NULL DEFAULT '0',\n  `maxhealth` int(10) unsigned NOT NULL DEFAULT '0',\n  `maxpower` int(10) unsigned NOT NULL DEFAULT '0',\n  `strength` int(10) unsigned NOT NULL DEFAULT '0',\n  `agility` int(10) unsigned NOT NULL DEFAULT '0',\n  `stamina` int(10) unsigned NOT NULL DEFAULT '0',\n  `intellect` int(10) unsigned NOT NULL DEFAULT '0',\n  `spirit` int(10) unsigned NOT NULL DEFAULT '0',\n  `armor` int(10) unsigned NOT NULL DEFAULT '0',\n  `defense` int(10) unsigned NOT NULL DEFAULT '0',\n  `resHoly` int(10) unsigned NOT NULL DEFAULT '0',\n  `resFire` int(10) unsigned NOT NULL DEFAULT '0',\n  `resNature` int(10) unsigned NOT NULL DEFAULT '0',\n  `resFrost` int(10) unsigned NOT NULL DEFAULT '0',\n  `resShadow` int(10) unsigned NOT NULL DEFAULT '0',\n  `resArcane` int(10) unsigned NOT NULL DEFAULT '0',\n  `blockPct` float unsigned NOT NULL DEFAULT '0',\n  `dodgePct` float unsigned NOT NULL DEFAULT '0',\n  `parryPct` float unsigned NOT NULL DEFAULT '0',\n  `critPct` float unsigned NOT NULL DEFAULT '0',\n  `attackPower` int(10) unsigned NOT NULL DEFAULT '0',\n  `spellPower` int(10) unsigned NOT NULL DEFAULT '0',\n  `spellPen` int(10) unsigned NOT NULL DEFAULT '0',\n  `hastePct` float unsigned NOT NULL DEFAULT '0',\n  `hitBonusPct` float unsigned NOT NULL DEFAULT '0',\n  `expertise` int(10) unsigned NOT NULL DEFAULT '0',\n  `armorPenPct` float unsigned NOT NULL DEFAULT '0',\n  PRIMARY KEY (`entry`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n"
  },
  {
    "path": "SQL/updates/characters/2021_08_27_characters_npcbot.sql",
    "content": "-- An update for shifted roles\nUPDATE `characters_npcbot` SET `roles` = (roles & 0x1) | ((roles & ~0x1) << 1);\n"
  },
  {
    "path": "SQL/updates/characters/2022_11_15_characters_npcbot_transmog.sql",
    "content": "--\nDROP TABLE IF EXISTS `characters_npcbot_transmog`;\nCREATE TABLE `characters_npcbot_transmog` (\n  `entry` int(10) unsigned NOT NULL,\n  `slot` tinyint(3) unsigned NOT NULL,\n  `item_id` int(10) unsigned NOT NULL DEFAULT '0',\n  `fake_id` int(10) unsigned NOT NULL DEFAULT '0',\n  PRIMARY KEY (`entry`,`slot`),\n  CONSTRAINT `bot_id` FOREIGN KEY (`entry`) REFERENCES `characters_npcbot` (`entry`) ON DELETE CASCADE ON UPDATE CASCADE\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n"
  },
  {
    "path": "SQL/updates/characters/2022_11_27_characters_npcbot_group_member.sql",
    "content": "--\nDROP TABLE IF EXISTS `characters_npcbot_group_member`;\nCREATE TABLE `characters_npcbot_group_member` (\n  `guid` int(10) unsigned NOT NULL,\n  `entry` int(10) unsigned NOT NULL,\n  `memberFlags` tinyint(3) unsigned NOT NULL DEFAULT '0',\n  `subgroup` tinyint(3) unsigned NOT NULL DEFAULT '0',\n  `roles` tinyint(3) unsigned NOT NULL DEFAULT '0',\n  PRIMARY KEY (`entry`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n"
  },
  {
    "path": "SQL/updates/characters/2023_05_16_00_characters_npcbot_gear_storage.sql",
    "content": "--\nSET FOREIGN_KEY_CHECKS=0;\nDROP TABLE IF EXISTS `characters_npcbot_gear_storage`;\nCREATE TABLE `characters_npcbot_gear_storage` (\n  `guid` int(10) unsigned NOT NULL DEFAULT '0',\n  `item_guid` int(10) unsigned NOT NULL DEFAULT '0',\n  PRIMARY KEY (`item_guid`),\n  KEY `existing_player` (`guid`),\n  CONSTRAINT `characters_npcbot_gear_storage_ibfk_1` FOREIGN KEY (`item_guid`) REFERENCES `item_instance` (`guid`) ON DELETE CASCADE ON UPDATE CASCADE,\n  CONSTRAINT `existing_player` FOREIGN KEY (`guid`) REFERENCES `characters` (`guid`) ON DELETE CASCADE ON UPDATE CASCADE\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Bot item storage system';\n"
  },
  {
    "path": "SQL/updates/characters/2023_05_26_00_characters_npcbot_transmog.sql",
    "content": "--\nALTER TABLE `characters_npcbot_transmog` MODIFY `fake_id` int(11) NOT NULL DEFAULT '-1' AFTER `item_id`;\n"
  },
  {
    "path": "SQL/updates/characters/2024_03_12_00_characters_npcbot.sql",
    "content": "--\n/*!50003 DROP PROCEDURE IF EXISTS `sp__drop_column_if_exists`*/;\nDELIMITER ;;\n/*!50003 CREATE*/\n/*!50003 PROCEDURE `sp__drop_column_if_exists`(`@TABLE` varchar(100), `@COLUMN` varchar(100))\nBEGIN\nDECLARE `@EXISTS` INT DEFAULT 0;\nSELECT COUNT(*) INTO `@EXISTS` FROM `information_schema`.`columns`WHERE `TABLE_SCHEMA` = DATABASE() AND `TABLE_NAME` = `@TABLE` AND `COLUMN_NAME` = `@COLUMN`;\nIF (`@EXISTS` > 0) THEN\n    ALTER TABLE `characters_npcbot` DROP COLUMN `hire_time`;\nEND IF;\nEND */;;\n\nDELIMITER ;\n\nCALL `sp__drop_column_if_exists`('characters_npcbot', 'hire_time');\n\nDROP PROCEDURE IF EXISTS `sp__drop_column_if_exists`;\n\nALTER TABLE `characters_npcbot` ADD `hire_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP AFTER `faction`;\n"
  },
  {
    "path": "SQL/updates/characters/2024_05_29_00_characters_npcbot_logs.sql",
    "content": "--\nSET FOREIGN_KEY_CHECKS=0;\nDROP TABLE IF EXISTS `characters_npcbot_logs`;\nCREATE TABLE `characters_npcbot_logs` (\n  `id` bigint unsigned NOT NULL AUTO_INCREMENT,\n  `entry` int unsigned NOT NULL DEFAULT '0',\n  `owner` int NOT NULL DEFAULT '-1',\n  `mapid` int NOT NULL DEFAULT '-1',\n  `inmap` tinyint NOT NULL DEFAULT '-1',\n  `inworld` tinyint NOT NULL DEFAULT '-1',\n  `type` smallint unsigned NOT NULL DEFAULT '0',\n  `param1` varchar(51) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,\n  `param2` varchar(51) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,\n  `param3` varchar(51) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,\n  `param4` varchar(51) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,\n  `param5` varchar(51) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,\n  `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;\n"
  },
  {
    "path": "SQL/updates/characters/2024_10_17_00_characters_npcbot_settings.sql",
    "content": "--\nSET FOREIGN_KEY_CHECKS=0;\nDROP TABLE IF EXISTS `characters_npcbot_settings`;\nCREATE TABLE `characters_npcbot_settings` (\n  `owner` int unsigned NOT NULL,\n  `dist_follow` tinyint unsigned NOT NULL DEFAULT '30',\n  `dist_attack` tinyint unsigned NOT NULL DEFAULT '0',\n  `attack_range_mode` tinyint unsigned NOT NULL DEFAULT '1',\n  `attack_angle_mode` tinyint unsigned NOT NULL DEFAULT '1',\n  `engage_delay_dps` int unsigned NOT NULL DEFAULT '0',\n  `engage_delay_heal` int unsigned NOT NULL DEFAULT '0',\n  `flags` int unsigned NOT NULL DEFAULT '0',\n  PRIMARY KEY (`owner`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;\n"
  },
  {
    "path": "SQL/updates/characters/2024_11_13_00_characters_npcbot_gear_set.sql",
    "content": "--\nDROP TABLE IF EXISTS `characters_npcbot_gear_set`;\nCREATE TABLE `characters_npcbot_gear_set` (\n  `owner` int unsigned NOT NULL DEFAULT '0',\n  `set_id` tinyint unsigned NOT NULL DEFAULT '0',\n  `set_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n  PRIMARY KEY (`owner`,`set_id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Bot equipment sets system';\n"
  },
  {
    "path": "SQL/updates/characters/2024_11_13_01_characters_npcbot_gear_set_item.sql",
    "content": "--\nDROP TABLE IF EXISTS `characters_npcbot_gear_set_item`;\nCREATE TABLE `characters_npcbot_gear_set_item` (\n  `owner` int unsigned NOT NULL DEFAULT '0',\n  `set_id` tinyint unsigned NOT NULL DEFAULT '0',\n  `slot` tinyint unsigned NOT NULL DEFAULT '0',\n  `item_id` mediumint unsigned NOT NULL DEFAULT '0',\n  PRIMARY KEY (`owner`,`set_id`,`slot`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Bot equipment sets system';\n"
  },
  {
    "path": "SQL/updates/characters/2024_11_21_00_characters_npcbot.sql",
    "content": "--\nALTER TABLE `characters_npcbot` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;\nALTER TABLE `characters_npcbot` ADD `miscvalues` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL AFTER `spells_disabled`;\n"
  },
  {
    "path": "SQL/updates/world/2020_07_08_creature_template_npcbot_extras.sql",
    "content": "-- Zandine race fix\nUPDATE `creature_template_npcbot_extras` SET `race`='10' WHERE (`entry`='70135');\n"
  },
  {
    "path": "SQL/updates/world/2020_09_25_creature_template.sql",
    "content": "-- Marion modelId fix\nUPDATE `creature_template` SET `modelid1`='1603' WHERE (`entry`='70158');\n"
  },
  {
    "path": "SQL/updates/world/2020_10_14_creature_classlevelstats.sql",
    "content": "--\nSET @CLASS_HUNTER           = 3;\nSET @CLASS_PRIEST           = 5;\nSET @CLASS_DK               = 6;\nSET @CLASS_SHAMAN           = 7;\nSET @CLASS_WARLOCK          = 9;\nSET @CLASS_DRUID            = 11;\n\n-- actual values are irrelevant, but hp and mana must be > 1\nDELETE FROM `creature_classlevelstats` WHERE `class` IN (@CLASS_HUNTER,@CLASS_PRIEST,@CLASS_DK,@CLASS_SHAMAN,@CLASS_WARLOCK,@CLASS_DRUID) AND `level` BETWEEN '1' AND '100';\nINSERT INTO `creature_classlevelstats` (`level`,`class`,`basehp0`,`basehp1`,`basehp2`,`basemana`,`basearmor`,`attackpower`,`rangedattackpower`,`damage_base`,`damage_exp1`,`damage_exp2`,`comment`) VALUES\n('1', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('1', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('1', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('1', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('1', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('1', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('2', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('2', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('2', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('2', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('2', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('2', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('3', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('3', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('3', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('3', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('3', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('3', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('4', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('4', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('4', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('4', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('4', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('4', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('5', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('5', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('5', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('5', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('5', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('5', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('6', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('6', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('6', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('6', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('6', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('6', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('7', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('7', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('7', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('7', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('7', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('7', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('8', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('8', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('8', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('8', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('8', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('8', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('9', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('9', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('9', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('9', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('9', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('9', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('10', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('10', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('10', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('10', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('10', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('10', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('11', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('11', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('11', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('11', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('11', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('11', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('12', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('12', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('12', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('12', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('12', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('12', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('13', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('13', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('13', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('13', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('13', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('13', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('14', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('14', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('14', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('14', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('14', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('14', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('15', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('15', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('15', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('15', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('15', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('15', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('16', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('16', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('16', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('16', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('16', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('16', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('17', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('17', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('17', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('17', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('17', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('17', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('18', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('18', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('18', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('18', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('18', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('18', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('19', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('19', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('19', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('19', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('19', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('19', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('20', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('20', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('20', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('20', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('20', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('20', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('21', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('21', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('21', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('21', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('21', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('21', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('22', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('22', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('22', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('22', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('22', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('22', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('23', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('23', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('23', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('23', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('23', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('23', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('24', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('24', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('24', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('24', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('24', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('24', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('25', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('25', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('25', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('25', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('25', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('25', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('26', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('26', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('26', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('26', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('26', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('26', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('27', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('27', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('27', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('27', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('27', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('27', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('28', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('28', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('28', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('28', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('28', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('28', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('29', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('29', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('29', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('29', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('29', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('29', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('30', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('30', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('30', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('30', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('30', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('30', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('31', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('31', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('31', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('31', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('31', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('31', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('32', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('32', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('32', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('32', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('32', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('32', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('33', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('33', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('33', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('33', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('33', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('33', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('34', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('34', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('34', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('34', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('34', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('34', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('35', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('35', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('35', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('35', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('35', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('35', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('36', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('36', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('36', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('36', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('36', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('36', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('37', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('37', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('37', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('37', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('37', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('37', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('38', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('38', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('38', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('38', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('38', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('38', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('39', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('39', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('39', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('39', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('39', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('39', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('40', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('40', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('40', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('40', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('40', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('40', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('41', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('41', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('41', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('41', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('41', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('41', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('42', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('42', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('42', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('42', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('42', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('42', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('43', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('43', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('43', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('43', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('43', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('43', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('44', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('44', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('44', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('44', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('44', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('44', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('45', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('45', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('45', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('45', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('45', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('45', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('46', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('46', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('46', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('46', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('46', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('46', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('47', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('47', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('47', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('47', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('47', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('47', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('48', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('48', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('48', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('48', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('48', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('48', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('49', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('49', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('49', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('49', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('49', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('49', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('50', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('50', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('50', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('50', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('50', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('50', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('51', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('51', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('51', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('51', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('51', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('51', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('52', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('52', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('52', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('52', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('52', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('52', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('53', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('53', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('53', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('53', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('53', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('53', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('54', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('54', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('54', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('54', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('54', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('54', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('55', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('55', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('55', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('55', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('55', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('55', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('56', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('56', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('56', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('56', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('56', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('56', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('57', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('57', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('57', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('57', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('57', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('57', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('58', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('58', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('58', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('58', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('58', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('58', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('59', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('59', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('59', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('59', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('59', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('59', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('60', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('60', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('60', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('60', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('60', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('60', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('61', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('61', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('61', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('61', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('61', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('61', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('62', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('62', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('62', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('62', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('62', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('62', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('63', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('63', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('63', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('63', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('63', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('63', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('64', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('64', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('64', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('64', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('64', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('64', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('65', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('65', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('65', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('65', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('65', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('65', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('66', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('66', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('66', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('66', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('66', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('66', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('67', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('67', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('67', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('67', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('67', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('67', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('68', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('68', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('68', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('68', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('68', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('68', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('69', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('69', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('69', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('69', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('69', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('69', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('70', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('70', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('70', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('70', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('70', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('70', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('71', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('71', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('71', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('71', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('71', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('71', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('72', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('72', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('72', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('72', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('72', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('72', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('73', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('73', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('73', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('73', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('73', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('73', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('74', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('74', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('74', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('74', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('74', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('74', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('75', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('75', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('75', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('75', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('75', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('75', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('76', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('76', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('76', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('76', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('76', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('76', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('77', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('77', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('77', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('77', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('77', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('77', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('78', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('78', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('78', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('78', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('78', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('78', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('79', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('79', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('79', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('79', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('79', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('79', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('80', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('80', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('80', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('80', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('80', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('80', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('81', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('81', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('81', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('81', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('81', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('81', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('82', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('82', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('82', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('82', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('82', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('82', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('83', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('83', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('83', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('83', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('83', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('83', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('84', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('84', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('84', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('84', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('84', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('84', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('85', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('85', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('85', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('85', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('85', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('85', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('86', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('86', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('86', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('86', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('86', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('86', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('87', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('87', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('87', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('87', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('87', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('87', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('88', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('88', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('88', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('88', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('88', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('88', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('89', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('89', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('89', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('89', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('89', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('89', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('90', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('90', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('90', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('90', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('90', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('90', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('91', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('91', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('91', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('91', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('91', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('91', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('92', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('92', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('92', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('92', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('92', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('92', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('93', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('93', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('93', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('93', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('93', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('93', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('94', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('94', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('94', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('94', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('94', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('94', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('95', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('95', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('95', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('95', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('95', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('95', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('96', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('96', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('96', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('96', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('96', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('96', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('97', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('97', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('97', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('97', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('97', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('97', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('98', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('98', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('98', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('98', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('98', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('98', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('99', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('99', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('99', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('99', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('99', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('99', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('100', @CLASS_HUNTER, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('100', @CLASS_PRIEST, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('100', @CLASS_DK,     '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('100', @CLASS_SHAMAN, '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('100', @CLASS_WARLOCK,'2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL),\n('100', @CLASS_DRUID,  '2', '2', '2', '2', '0', '0', '0', '0.1', '0', '0', NULL);\n"
  },
  {
    "path": "SQL/updates/world/2020_10_14_creature_template.sql",
    "content": "--\nSET @CLASS_WARRIOR          = 1;\nSET @CLASS_PALADIN          = 2;\nSET @CLASS_HUNTER           = 3;\nSET @CLASS_ROGUE            = 4;\nSET @CLASS_PRIEST           = 5;\nSET @CLASS_DK               = 6;\nSET @CLASS_SHAMAN           = 7;\nSET @CLASS_MAGE             = 8;\nSET @CLASS_WARLOCK          = 9;\nSET @CLASS_DRUID            = 11;\nSET @CLASS_BM               = 12;\nSET @CLASS_SPHYNX           = 13;\nSET @CLASS_ARCHMAGE         = 14;\nSET @CLASS_DREADLORD        = 15;\nSET @CLASS_SPELLBREAKER     = 16;\nSET @CLASS_DARK_RANGER      = 17;\n\nUPDATE `creature_template` SET `unit_class`:=@CLASS_DK\nWHERE `entry` IN (SELECT `entry` FROM `creature_template_npcbot_extras` WHERE `class`=@CLASS_DK);\nUPDATE `creature_template` SET `unit_class`:=@CLASS_DRUID\nWHERE `entry` IN (SELECT `entry` FROM `creature_template_npcbot_extras` WHERE `class`=@CLASS_DRUID);\nUPDATE `creature_template` SET `unit_class`:=@CLASS_HUNTER\nWHERE `entry` IN (SELECT `entry` FROM `creature_template_npcbot_extras` WHERE `class`=@CLASS_HUNTER);\nUPDATE `creature_template` SET `unit_class`:=@CLASS_MAGE\nWHERE `entry` IN (SELECT `entry` FROM `creature_template_npcbot_extras` WHERE `class`=@CLASS_MAGE);\nUPDATE `creature_template` SET `unit_class`:=@CLASS_PALADIN\nWHERE `entry` IN (SELECT `entry` FROM `creature_template_npcbot_extras` WHERE `class`=@CLASS_PALADIN);\nUPDATE `creature_template` SET `unit_class`:=@CLASS_PRIEST\nWHERE `entry` IN (SELECT `entry` FROM `creature_template_npcbot_extras` WHERE `class`=@CLASS_PRIEST);\nUPDATE `creature_template` SET `unit_class`:=@CLASS_ROGUE\nWHERE `entry` IN (SELECT `entry` FROM `creature_template_npcbot_extras` WHERE `class`=@CLASS_ROGUE);\nUPDATE `creature_template` SET `unit_class`:=@CLASS_SHAMAN\nWHERE `entry` IN (SELECT `entry` FROM `creature_template_npcbot_extras` WHERE `class`=@CLASS_SHAMAN);\nUPDATE `creature_template` SET `unit_class`:=@CLASS_WARLOCK\nWHERE `entry` IN (SELECT `entry` FROM `creature_template_npcbot_extras` WHERE `class`=@CLASS_WARLOCK);\nUPDATE `creature_template` SET `unit_class`:=@CLASS_WARRIOR\nWHERE `entry` IN (SELECT `entry` FROM `creature_template_npcbot_extras` WHERE `class`=@CLASS_WARRIOR);\nUPDATE `creature_template` SET `unit_class`:=@CLASS_WARRIOR\nWHERE `entry` IN (SELECT `entry` FROM `creature_template_npcbot_extras` WHERE `class`=@CLASS_BM);\nUPDATE `creature_template` SET `unit_class`:=@CLASS_WARLOCK\nWHERE `entry` IN (SELECT `entry` FROM `creature_template_npcbot_extras` WHERE `class`=@CLASS_SPHYNX);\nUPDATE `creature_template` SET `unit_class`:=@CLASS_MAGE\nWHERE `entry` IN (SELECT `entry` FROM `creature_template_npcbot_extras` WHERE `class`=@CLASS_ARCHMAGE);\nUPDATE `creature_template` SET `unit_class`:=@CLASS_WARLOCK\nWHERE `entry` IN (SELECT `entry` FROM `creature_template_npcbot_extras` WHERE `class`=@CLASS_DREADLORD);\nUPDATE `creature_template` SET `unit_class`:=@CLASS_PALADIN\nWHERE `entry` IN (SELECT `entry` FROM `creature_template_npcbot_extras` WHERE `class`=@CLASS_SPELLBREAKER);\nUPDATE `creature_template` SET `unit_class`:=@CLASS_DK\nWHERE `entry` IN (SELECT `entry` FROM `creature_template_npcbot_extras` WHERE `class`=@CLASS_DARK_RANGER);\n"
  },
  {
    "path": "SQL/updates/world/2020_10_15_creature_template.sql",
    "content": "--\nUPDATE `creature_template` SET `unit_flags2`='16416' WHERE `entry` IN ('70551','70552');\n"
  },
  {
    "path": "SQL/updates/world/2020_11_07_npc_text.sql",
    "content": "--\nSET @LOCALIZED_STRINGS_START = 70300;\nSET @LOCALIZED_STRINGS_END   = 70799;\n\n-- LOCALIZATION STRING --\n\nDELETE FROM `npc_text` WHERE ID BETWEEN @LOCALIZED_STRINGS_START and @LOCALIZED_STRINGS_END;\nINSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n('70300','Die!','-1'),\n('70301','Rezzing You','-1'),\n('70302','Rezzing ','-1'),\n('70303','your bot','-1'),\n('70304','\\'s bot','-1'),\n('70305','I can\\'t conjure water yet','-1'),\n('70306','I can\\'t conjure food yet','-1'),\n('70307','I can\\'t do it right now','-1'),\n('70308','Here you go...','-1'),\n('70309','Disabled','-1'),\n('70310','Not ready yet','-1'),\n('70311','Invalid object type','-1'),\n('70312','Failed','-1'),\n('70313','Done','-1'),\n('70314','I am not shapeshifted','-1'),\n('70315','I don\\'t have a healthstone','-1'),\n('70316','I can\\'t create healthstones yet!','-1'),\n('70317','WTF I don\\'t have lockpicking!','-1'),\n('70318','My skill level in not high enough','-1'),\n('70319','Changing my spec to ','-1'),\n('70320','Arms','-1'),\n('70321','Fury','-1'),\n('70322','Protection','-1'),\n('70323','Retribution','-1'),\n('70324','Beast Mastery','-1'),\n('70325','Marksmanship','-1'),\n('70326','Survival','-1'),\n('70327','Assassination','-1'),\n('70328','Combat','-1'),\n('70329','Subtlety','-1'),\n('70330','Discipline','-1'),\n('70331','Holy','-1'),\n('70332','Shadow','-1'),\n('70333','Blood','-1'),\n('70334','Frost','-1'),\n('70335','Unholy','-1'),\n('70336','Elemental','-1'),\n('70337','Enhancement','-1'),\n('70338','Restoration','-1'),\n('70339','Arcane','-1'),\n('70340','Fire','-1'),\n('70341','Affliction','-1'),\n('70342','Demonology','-1'),\n('70343','Destruction','-1'),\n('70344','Balance','-1'),\n('70345','Feral Combat','-1'),\n('70346','Unknown','-1'),\n('70347','Go away, weakling','-1'),\n('70348',' is not convinced','-1'),\n('70349','I am not going to waste my time on just anything','-1'),\n('70350','NIY','-1'),\n('70351','NIY','-1'),\n('70352','NIY','-1'),\n('70353','I am ready','-1'),\n('70354','Go away. I serve my master ','-1'),\n('70355','unknown','-1'),\n('70356',' on You!','-1'),\n('70357',' on myself!','-1'),\n('70358',' on ','-1'),\n('70359',' used!','-1'),\n('70360','bot tank','-1'),\n('70361','class','-1'),\n('70362','player','-1'),\n('70363','master','-1'),\n('70364','none','-1'),\n('70365','Rank','-1'),\n('70366','talent','-1'),\n('70367','passive','-1'),\n('70368','hidden','-1'),\n('70369','known','-1'),\n('70370','ability','-1'),\n('70371','str','-1'),\n('70372','agi','-1'),\n('70373','sta','-1'),\n('70374','int','-1'),\n('70375','spi','-1'),\n('70376','unk stat','-1'),\n('70377','total','-1'),\n('70378','Melee AP','-1'),\n('70379','Ranged AP','-1'),\n('70380','armor','-1'),\n('70381','crit','-1'),\n('70382','defense','-1'),\n('70383','miss','-1'),\n('70384','dodge','-1'),\n('70385','parry','-1'),\n('70386','block','-1'),\n('70387','block value','-1'),\n('70388','Damage taken melee','-1'),\n('70389','Damage taken spell','-1'),\n('70390','Damage range mainhand','-1'),\n('70391','Damage mult mainhand','-1'),\n('70392','Attack time mainhand','-1'),\n('70393','Damage range offhand','-1'),\n('70394','Damage mult offhand','-1'),\n('70395','Attack time offhand','-1'),\n('70396','Damage range ranged','-1'),\n('70397','Damage mult ranged','-1'),\n('70398','Attack time ranged','-1'),\n('70399','min','-1'),\n('70400','max','-1'),\n('70401','DPS','-1'),\n('70402','base hp','-1'),\n('70403','total hp','-1'),\n('70404','base mana','-1'),\n('70405','total mana','-1'),\n('70406','current mana','-1'),\n('70407','spell power','-1'),\n('70408','health regen_5 bonus','-1'),\n('70409','mana regen_5 no cast','-1'),\n('70410','mana regen_5 casting','-1'),\n('70411','haste','-1'),\n('70412','hit','-1'),\n('70413','expertise','-1'),\n('70414','armor penetration','-1'),\n('70415','spell penetration','-1'),\n('70416','pct','-1'),\n('70417','holy','-1'),\n('70418','fire','-1'),\n('70419','nature','-1'),\n('70420','frost','-1'),\n('70421','shadow','-1'),\n('70422','arcane','-1'),\n('70423','Resistance','-1'),\n('70424','Command states','-1'),\n('70425','Follow','-1'),\n('70426','Attack','-1'),\n('70427','Stay','-1'),\n('70428','Reset','-1'),\n('70429','FullStop','-1'),\n('70430','Follow distance','-1'),\n('70431','Spec','-1'),\n('70432','Bot roles mask main','-1'),\n('70433','Bot roles mask gathering','-1'),\n('70434','PvP kills','-1'),\n('70435','players','-1'),\n('70436','Died ','-1'),\n('70437',' times','-1'),\n('70438','%s (bot) calms down','-1'),\n('70439','<Debug>','-1'),\n('70440','Are you sure you want to risk drawing ','-1'),\n('70441','\\'s attention?','-1'),\n('70442','<Insert Coin>','-1'),\n('70443','Do you want to entice ','-1'),\n('70444','<Try to make an offering>','-1'),\n('70445','Do you wish to hire ','-1'),\n('70446','<Hire bot>','-1'),\n('70447','Manage equipment...','-1'),\n('70448','Manage roles...','-1'),\n('70449','Manage formation...','-1'),\n('70450','Manage abilities...','-1'),\n('70451','Manage talents...','-1'),\n('70452','Give consumable...','-1'),\n('70453','<Create group>','-1'),\n('70454','<Create group (all bots)>','-1'),\n('70455','<Add to group>','-1'),\n('70456','<Add all bots to group>','-1'),\n('70457','<Remove from group>','-1'),\n('70458','Follow me','-1'),\n('70459','Hold your position','-1'),\n('70460','Stay here and don\\'t do anything','-1'),\n('70461','I need food','-1'),\n('70462','I need water','-1'),\n('70463','I need a refreshment table','-1'),\n('70464','Help me pick a lock','-1'),\n('70465','I need your healthstone','-1'),\n('70466','I need a soulwell','-1'),\n('70467','I need you to refresh poisons','-1'),\n('70468','<Choose poison (Main Hand)>','-1'),\n('70469','<Choose poison (Offhand)>','-1'),\n('70470','I need you to refresh enchants','-1'),\n('70471','<Choose enchant (Main Hand)>','-1'),\n('70472','<Choose enchant (Offhand)>','-1'),\n('70473','I need you to remove shapeshift','-1'),\n('70474','<Choose pet type>','-1'),\n('70475','You are dismissed','-1'),\n('70476','Are you going to abandon ','-1'),\n('70477','You may regret it...','-1'),\n('70478','Pull yourself together, damnit','-1'),\n('70479','<Study the creature>','-1'),\n('70480','Nevermind','-1'),\n('70481','dist','-1'),\n('70482','BACK','-1'),\n('70483','<Auto>','-1'),\n('70484','<None>','-1'),\n('70485','Random (Cunning)','-1'),\n('70486','Random (Ferocity)','-1'),\n('70487','Random (Tenacity)','-1'),\n('70488','Show me your inventory','-1'),\n('70489','Auto-equip...','-1'),\n('70490','Main hand','-1'),\n('70491','Off-hand','-1'),\n('70492','Ranged','-1'),\n('70493','Relic','-1'),\n('70494','Head','-1'),\n('70495','Shoulders','-1'),\n('70496','Chest','-1'),\n('70497','Waist','-1'),\n('70498','Legs','-1'),\n('70499','Feet','-1'),\n('70500','Wrist','-1'),\n('70501','Hands','-1'),\n('70502','Back','-1'),\n('70503','Shirt','-1'),\n('70504','Finger1','-1'),\n('70505','Finger2','-1'),\n('70506','Trinket1','-1'),\n('70507','Trinket2','-1'),\n('70508','Neck','-1'),\n('70509','Unequip all','-1'),\n('70510','Update visual','-1'),\n('70511','visual only','-1'),\n('70512','Equipped','-1'),\n('70513','nothing','-1'),\n('70514','Use your old equipment','-1'),\n('70515','Unequip it','-1'),\n('70516','Hm... I have nothing to give you','-1'),\n('70517','Gathering','-1'),\n('70518','Abilities status','-1'),\n('70519','Manage allowed abilities','-1'),\n('70520','Use ','-1'),\n('70521','Update','-1'),\n('70522','Damage','-1'),\n('70523','Control','-1'),\n('70524','Heal','-1'),\n('70525','Other','-1'),\n('70526',' makes a grinding sound and begins to follow ','-1'),\n('70527','%s will not join you until dismissed by the owner','-1'),\n('70528','%s will not join you until you are level 60','-1'),\n('70529','%s will not join you until you are level 55','-1'),\n('70530','%s will not join you until you are level 40','-1'),\n('70531','%s will not join you until you are level 20','-1'),\n('70532','You exceed max npcbots (%u)','-1'),\n('70533','You don\\'t have enough money','-1'),\n('70534','You cannot have more bots of that class! %u of %u','-1'),\n('70535','Cannot reset equipment in slot %u (%s)! Cannot dismiss bot!','-1'),\n('70536','current','-1'),\n('70537','Attack distance','-1'),\n('70538','Short range attacks','-1'),\n('70539','Long range attacks','-1'),\n('70540','Exact','-1'),\n('70541','Remove buff','-1'),\n('70542','Fix your power type','-1'),\n('70543','Cannot unequip %s for some stupid reason! Sending through mail','-1'),\n('70544','Tank','-1'),\n('70545','Ranged','-1'),\n('70546','Miner','-1'),\n('70547','Herbalist','-1'),\n('70548','Skinner','-1'),\n('70549','Engineer','-1'),\n('70550','Bot ownership expired due to inactivity','-1'),\n('70551','NpcBot system is currently disabled. Please contact administration.','-1'),\n('70552','%s will not join you, already has master: %s','-1'),\n('70553','%s cannot join you while about to teleport','-1'),\n('70554','Aspect','-1'),\n('70555','Monkey','-1'),\n('70556','Hawk','-1'),\n('70557','Cheetah','-1'),\n('70558','Viper','-1'),\n('70559','Beast','-1'),\n('70560','Pack','-1'),\n('70561','Wild','-1'),\n('70562','Dragonhawk','-1'),\n('70563','No Aspect','-1'),\n('70564','Aura','-1'),\n('70565','Devotion','-1'),\n('70566','Concentration','-1'),\n('70567','Fire Resistance','-1'),\n('70568','Frost Resistance','-1'),\n('70569','Shadow Resistance','-1'),\n('70570','Retribution','-1'),\n('70571','Crusader','-1'),\n('70572','No Aura','-1'),\n('70573','Crippling','-1'),\n('70574','Instant','-1'),\n('70575','Deadly','-1'),\n('70576','Wound','-1'),\n('70577','Mind-Numbing','-1'),\n('70578','Anesthetic','-1'),\n('70579','Nothing','-1'),\n('70580','Flametongue','-1'),\n('70581','Frostbrand','-1'),\n('70582','Windfury','-1'),\n('70583','Earthliving','-1'),\n('70584','I need your services','-1'),\n('70585','You have too many bots','-1'),\n('70586','Do you wish to hire ','-1'),\n('70587',' is a bit busy at the moment, try again later.','-1'),\n('70588','Pleasure doing business with you','-1'),\n('70589','Warriors','-1'),\n('70590','Paladins','-1'),\n('70591','Mages','-1'),\n('70592','Priests','-1'),\n('70593','Warlocks','-1'),\n('70594','Druids','-1'),\n('70595','Death Knights','-1'),\n('70596','Rogues','-1'),\n('70597','Shamans','-1'),\n('70598','Hunters','-1'),\n('70599','Blademasters','-1'),\n('70600','Destroyers','-1'),\n('70601','Archmagi','-1'),\n('70602','Dreadlords','-1'),\n('70603','Spell Breakers','-1'),\n('70604','Dark Rangers','-1'),\n('70605','Warrior','-1'),\n('70606','Paladin','-1'),\n('70607','Mage','-1'),\n('70608','Priest','-1'),\n('70609','Warlock','-1'),\n('70610','Druid','-1'),\n('70611','Death Knight','-1'),\n('70612','Rogue','-1'),\n('70613','Shaman','-1'),\n('70614','Hunter','-1'),\n('70615','Blademaster','-1'),\n('70616','Destroyer','-1'),\n('70617','Archmage','-1'),\n('70618','Dreadlord','-1'),\n('70619','Spell Breaker','-1'),\n('70620','Dark Ranger','-1');\n"
  },
  {
    "path": "SQL/updates/world/2020_12_11_npc_text.sql",
    "content": "--\nDELETE FROM `npc_text` WHERE ID = 70550;\nINSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n('70550','Bot ownership expired','-1');\n"
  },
  {
    "path": "SQL/updates/world/2021_01_04_npc_text.sql",
    "content": "--\nSET @LOCALIZED_STRINGS_START = 70621;\nSET @LOCALIZED_STRINGS_END   = 70633;\n\nDELETE FROM `npc_text` WHERE ID BETWEEN @LOCALIZED_STRINGS_START and @LOCALIZED_STRINGS_END;\nINSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n('70621','Male','-1'),\n('70622','Female','-1'),\n('70623','Human','-1'),\n('70624','Orc','-1'),\n('70625','Dwarf','-1'),\n('70626','Night Elf','-1'),\n('70627','Undead','-1'),\n('70628','Tauren','-1'),\n('70629','Gnome','-1'),\n('70630','Troll','-1'),\n('70631','Blood Elf','-1'),\n('70632','Draenei','-1'),\n('70633','Unknown','-1');\n"
  },
  {
    "path": "SQL/updates/world/2021_01_05_npc_text.sql",
    "content": "--\nSET @LOCALIZED_STRINGS_START = 70634;\nSET @LOCALIZED_STRINGS_END   = 70640;\n\nDELETE FROM `npc_text` WHERE ID BETWEEN @LOCALIZED_STRINGS_START and @LOCALIZED_STRINGS_END;\nINSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n('70634','Looting','-1'),\n('70635','|cff9d9d9dPoor|r','-1'),\n('70636','|cffffffffCommon|r','-1'),\n('70637','|cff1eff00Uncommon|r','-1'),\n('70638','|cff0070ddRare|r','-1'),\n('70639','|cffa335eeEpic|r','-1'),\n('70640','|cffff8000Legendary|r','-1');\n"
  },
  {
    "path": "SQL/updates/world/2021_01_08_npc_text.sql",
    "content": "--\nSET @LOCALIZED_STRINGS_START = 70641;\nSET @LOCALIZED_STRINGS_END   = 70643;\n\nDELETE FROM `npc_text` WHERE ID BETWEEN @LOCALIZED_STRINGS_START and @LOCALIZED_STRINGS_END;\nINSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n('70641','Grab on ','-1'),\n('70642','my ','-1'),\n('70643','<Exit Vehicle>','-1');\n"
  },
  {
    "path": "SQL/updates/world/2021_02_01_npc_text.sql",
    "content": "--\nUPDATE `npc_text` SET `text0_0`='Auto-equip' WHERE (`ID`='70489');\n"
  },
  {
    "path": "SQL/updates/world/2021_03_29_npc_text.sql",
    "content": "--\nSET @LOCALIZED_STRINGS_START = 70641;\nSET @LOCALIZED_STRINGS_END   = 70644;\n\nDELETE FROM `npc_text` WHERE ID BETWEEN @LOCALIZED_STRINGS_START and @LOCALIZED_STRINGS_END;\nINSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n('70641','Engage behavior','-1'),\n('70642','Delay attack by','-1'),\n('70643','Delay healing by','-1'),\n('70644','s','-1');\n"
  },
  {
    "path": "SQL/updates/world/2021_08_20_creature_template_npcbot_extras.sql",
    "content": "-- Kerra race fix\nUPDATE `creature_template_npcbot_extras` SET `race`='10' WHERE (`entry`='70038');\n"
  },
  {
    "path": "SQL/updates/world/2021_08_27_npc_text.sql",
    "content": "--\nDELETE FROM `npc_text` WHERE ID = 70645;\nINSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n('70645','Off-Tank','-1');\n"
  },
  {
    "path": "SQL/updates/world/2021_10_12_creature_template.sql",
    "content": "--\nSET @BOT_START = 70001;\nSET @BOT_END   = 71000;\n\nSET @U2_MIRROR_IMAGE          = 16;    -- 0x00000010 - UNIT_FLAG2_MIRROR_IMAGE\nSET @U2_ENABLE_ENEMY_INTERACT = 16384; -- 0x00004000 - UNIT_FLAG2_ALLOW_ENEMY_INTERACT\n\nUPDATE `creature_template` SET `unit_flags2` = `unit_flags2`&~(@U2_MIRROR_IMAGE|@U2_ENABLE_ENEMY_INTERACT) WHERE `entry` BETWEEN @BOT_START AND @BOT_END;\n"
  },
  {
    "path": "SQL/updates/world/2022_01_02_00_creature_template_npcbot_extras.sql",
    "content": "--\nSET @BOT_START = 70575;\nSET @BOT_END   = 70580;\n\nDELETE FROM `creature_template_npcbot_extras` WHERE `entry` BETWEEN @BOT_START AND @BOT_END;\nINSERT INTO `creature_template_npcbot_extras` (`entry`,`class`,`race`) VALUES\n('70575', '18', '1'),\n('70576', '18', '1'),\n('70577', '18', '1'),\n('70578', '18', '1'),\n('70579', '18', '1'),\n('70580', '0', '15');\n"
  },
  {
    "path": "SQL/updates/world/2022_01_02_01_generate_equips_necromancer.sql",
    "content": "/*!50003 DROP PROCEDURE IF EXISTS `sp__generate_necromancer_equips`*/;\n\nDELIMITER ;;\n\n/*!50003 CREATE*/\n/*!50003 PROCEDURE `sp__generate_necromancer_equips`()\nBEGIN\n\nDECLARE CLASS_NECROMANCER INT DEFAULT 18;\n\nDECLARE NPCBOT_ENTRY_BEGIN INT DEFAULT 70575;\nDECLARE NPCBOT_ENTRY_END INT DEFAULT 71000;\n\nDECLARE NPCBOT_ENTRY_PET_NECROSKELETON INT DEFAULT 70580;\n\nDECLARE cur_pos INT DEFAULT 0;\nDECLARE myclass INT;\nDECLARE myrace INT;\nDECLARE item1 INT DEFAULT 0;\nDECLARE item2 INT DEFAULT 0;\nDECLARE item3 INT DEFAULT 0;\n\nDELETE FROM `creature_equip_template` WHERE `CreatureID` BETWEEN NPCBOT_ENTRY_BEGIN AND NPCBOT_ENTRY_END;\n\nSET cur_pos = NPCBOT_ENTRY_BEGIN;\nWHILE cur_pos < NPCBOT_ENTRY_END DO\n    SET myclass = (SELECT `class` FROM `creature_template_npcbot_extras` WHERE `entry` = cur_pos);\n    SET myrace = (SELECT `race` FROM `creature_template_npcbot_extras` WHERE `entry` = cur_pos);\n\n    IF myclass != 0 AND myrace != 0 THEN\n\n        IF myclass = CLASS_NECROMANCER THEN\n            SET item1 = 13937; -- staff\n        END IF;\n\n        INSERT INTO `creature_equip_template` (`CreatureID`,`ID`,`itemID1`,`itemID2`,`itemID3`,`VerifiedBuild`) VALUES (cur_pos,1,item1,item2,item3,-1);\n\n    ELSEIF cur_pos = NPCBOT_ENTRY_PET_NECROSKELETON THEN\n        SET item1 = 3935;\n        SET item2 = 15648;\n        SET item3 = 0;\n\n        INSERT INTO `creature_equip_template` (`CreatureID`,`ID`,`itemID1`,`itemID2`,`itemID3`,`VerifiedBuild`) VALUES (cur_pos,1,item1,item2,item3,-1);\n\n    END IF;\n\n    SET cur_pos = cur_pos + 1;\n\nEND WHILE;\n\nEND */;;\n\nDELIMITER ;\n\nCALL `sp__generate_necromancer_equips`();\n\nDROP PROCEDURE IF EXISTS `sp__generate_necromancer_equips`;\n"
  },
  {
    "path": "SQL/updates/world/2022_01_02_02_creature_template.sql",
    "content": "--\nSET @BOT_START = 70575;\nSET @BOT_END   = 70580;\n\nDELETE FROM `creature_template` WHERE `entry` BETWEEN @BOT_START AND @BOT_END;\n\nINSERT INTO `creature_template`\n(`entry`,`difficulty_entry_1`,`difficulty_entry_2`,`difficulty_entry_3`,`KillCredit1`,`KillCredit2`,\n`modelid1`,`modelid2`,`modelid3`,`modelid4`,`name`,`subname`,`IconName`,`gossip_menu_id`,`minlevel`,`maxlevel`,`exp`,\n`faction`,`npcflag`,`speed_walk`,`speed_run`,`scale`,`rank`,`dmgschool`,`BaseAttackTime`,`RangeAttackTime`,\n`unit_class`,`unit_flags`,`unit_flags2`,`dynamicflags`,`family`,`type`,`type_flags`,`lootid`,\n`pickpocketloot`,`skinloot`,`PetSpellDataId`,`VehicleId`,`mingold`,`maxgold`,`AIName`,`MovementType`,\n`HoverHeight`,`HealthModifier`,`ManaModifier`,`ArmorModifier`,`RacialLeader`,`movementId`,`RegenHealth`,\n`mechanic_immune_mask`,`flags_extra`,`ScriptName`,`VerifiedBuild`)\nVALUES\n('70575','0','0','0','0','0','23277','0','0','0','Prakar','Necromancer Bot','','0','82','82','2','35','1','1.1','1.1','1','1','0','1800','1800','9','0','32','0','0','7','4096','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','necromancer_bot','-1'),\n('70576','0','0','0','0','0','23277','0','0','0','Rothik','Necromancer Bot','','0','82','82','2','35','1','1.1','1.1','1','1','0','1800','1800','9','0','32','0','0','7','4096','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','necromancer_bot','-1'),\n('70577','0','0','0','0','0','23277','0','0','0','Hexir','Necromancer Bot','','0','82','82','2','35','1','1.1','1.1','1','1','0','1800','1800','9','0','32','0','0','7','4096','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','necromancer_bot','-1'),\n('70578','0','0','0','0','0','23277','0','0','0','Fikhar','Necromancer Bot','','0','82','82','2','35','1','1.1','1.1','1','1','0','1800','1800','9','0','32','0','0','7','4096','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','necromancer_bot','-1'),\n('70579','0','0','0','0','0','23277','0','0','0','Drothum','Necromancer Bot','','0','82','82','2','35','1','1.1','1.1','1','1','0','1800','1800','9','0','32','0','0','7','4096','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','68157552','necromancer_bot','-1'),\n('70580','0','0','0','0','0','200','0','0','0','Skeleton',NULL,'','0','82','82','2','35','0','1.2','1.3','1.1','0','0','2000','2000','1','0','0','0','0','6','4096','0','0','0','0','0','0','0','','0','1','1','1','1','0','0','0','0','135266400','necromancer_pet_bot','-1');\n"
  },
  {
    "path": "SQL/updates/world/2022_01_02_03_npc_text.sql",
    "content": "--\nSET @LOCALIZED_STRINGS_START = 70107;\nSET @LOCALIZED_STRINGS_END   = 70107;\n\nDELETE FROM `npc_text` WHERE ID BETWEEN @LOCALIZED_STRINGS_START and @LOCALIZED_STRINGS_END;\nINSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n('70107','|cff9900ccNecromancer|r$b|cffdd6600-=Warcraft III / Diablo II tribute=-|r$B$BSpell damage taken reduced by 20%, partially immune to control effects, cloth armor, deals spellshadow damage, no physical attack, spell power bonus: 100% intellect. Main attribute: Intellect.$B$BRaise Dead. Raises 2 Skeletons from a corpse (maximum 6 Skeletons, 65 seconds duration, only works on humanoids, beasts and dragonkin).$B$BUnholy Frenzy. Increases target\\'s melee attack speed by 75%, but constantly drains health. Lasts 45 seconds. Cannot be cancelled. Unlocked at level 30.$B$BCorpse Explosion. Causes a corpse to explode, dealing damage equal to 35% to 75% of dead unit\\'s maximum health (depends on Necromancer\\'s level) to all surrounding enemies. This damage generates no threat. Unlocked at level 40.$B$BCripple. Reduces target\\'s movement speed, melee attack speed and total strength by 50% for 60 seconds. Unlocked at level 50.','-1');\n\nSET @LOCALIZED_STRINGS_START = 70646;\nSET @LOCALIZED_STRINGS_END   = 70647;\n\nDELETE FROM `npc_text` WHERE ID BETWEEN @LOCALIZED_STRINGS_START and @LOCALIZED_STRINGS_END;\nINSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n('70646','Necromancers','-1'),\n('70647','Necromancer','-1');\n"
  },
  {
    "path": "SQL/updates/world/2022_01_31_npc_text.sql",
    "content": "--\n\nSET @LOCALIZED_STRINGS_START = 70648;\nSET @LOCALIZED_STRINGS_END   = 70650;\n\nDELETE FROM `npc_text` WHERE ID BETWEEN @LOCALIZED_STRINGS_START and @LOCALIZED_STRINGS_END;\nINSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n('70648','Attack angle','-1'),\n('70649','Normal','-1'),\n('70650','Avoid frontal AOE','-1');\n"
  },
  {
    "path": "SQL/updates/world/2022_06_15_00_creature_template_npcbot_extras.sql",
    "content": "-- Maldryn race fix\nUPDATE `creature_template_npcbot_extras` SET `race`='4' WHERE (`entry`='70413');\n"
  },
  {
    "path": "SQL/updates/world/2022_06_17_npc_text.sql",
    "content": "--\n\nUPDATE `npc_text` SET `text0_0`='|cff9900ccObsidian Destroyer|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\\\"An obsidian winged monstrocity with insatiable hunger for magic\\\".$B$BHigh armor, very high resistances, partially immune to magic, loses mana over time and doesn\\'t benefit from passive mana regeneration effects, mail/plate armor, dual-wielding wands, deals spellshadow damage, no physical attack, cannot attack enemies not in front while moving, spell power bonus: 50% attack power + 200% intellect + wands damage.$B$BDevour Magic. Dispels up to 2 magic effects from enemies, up to 2 magic effects and up to 2 curses from allies and damaging summoned units in 20 yards area. Every dispelled effect restores 20% mana and 5% health, 7 seconds cooldown.$B$BShadow Blast. Empowered attack that deals increased splash damage.$B$BDrain Mana. Drains all mana (limited by caster\\'s mana pool) from a random friendly unit.$B$BReplenish Mana. Energizes surrounding party and raid members within 25 yards for 3% of their maximum mana nullifying caster\\'s mana, 3 seconds cooldown.$B$BRegenerating Aura. Heals surrounding party and raid members within 25 yards for 3% of their maximum health nullifying caster\\'s mana, 3 seconds cooldown.$B$BShadow Armor (passive). Restores mana equal to a percentage of damage taken.$B$B' WHERE (`ID`='70102');\n"
  },
  {
    "path": "SQL/updates/world/2022_06_22_00_creature_template_npcbot_extras.sql",
    "content": "--\nSET @BOT_START = 70581;\nSET @BOT_END   = 70585;\n\nDELETE FROM `creature_template_npcbot_extras` WHERE `entry` BETWEEN @BOT_START AND @BOT_END;\nINSERT INTO `creature_template_npcbot_extras` (`entry`,`class`,`race`) VALUES\n('70581', '19', '13'),\n('70582', '19', '13'),\n('70583', '19', '13'),\n('70584', '19', '13'),\n('70585', '19', '13');\n"
  },
  {
    "path": "SQL/updates/world/2022_06_22_01_generate_equips_sea_witch.sql",
    "content": "/*!50003 DROP PROCEDURE IF EXISTS `sp__generate_seawitch_equips`*/;\n\nDELIMITER ;;\n\n/*!50003 CREATE*/\n/*!50003 PROCEDURE `sp__generate_seawitch_equips`()\nBEGIN\n\nDECLARE CLASS_SEA_WITCH INT DEFAULT 19;\n\nDECLARE NPCBOT_ENTRY_BEGIN INT DEFAULT 70581;\nDECLARE NPCBOT_ENTRY_END INT DEFAULT 70585;\n\nDECLARE cur_pos INT DEFAULT 0;\nDECLARE myclass INT;\nDECLARE myrace INT;\nDECLARE item1 INT DEFAULT 0;\nDECLARE item2 INT DEFAULT 0;\nDECLARE item3 INT DEFAULT 0;\n\nDELETE FROM `creature_equip_template` WHERE `CreatureID` BETWEEN NPCBOT_ENTRY_BEGIN AND NPCBOT_ENTRY_END;\n\nSET cur_pos = NPCBOT_ENTRY_BEGIN;\nWHILE cur_pos <= NPCBOT_ENTRY_END DO\n    SET myclass = (SELECT `class` FROM `creature_template_npcbot_extras` WHERE `entry` = cur_pos);\n    SET myrace = (SELECT `race` FROM `creature_template_npcbot_extras` WHERE `entry` = cur_pos);\n\n    IF myclass != 0 AND myrace != 0 THEN\n\n        IF myclass = CLASS_SEA_WITCH THEN\n            SET item1 = 20852; -- dagger\n            SET item2 = 20852; -- dagger\n            SET item3 = 17069; -- bow\n        END IF;\n\n        INSERT INTO `creature_equip_template` (`CreatureID`,`ID`,`itemID1`,`itemID2`,`itemID3`,`VerifiedBuild`) VALUES (cur_pos,1,item1,item2,item3,-1);\n\n    END IF;\n\n    SET cur_pos = cur_pos + 1;\n\nEND WHILE;\n\nEND */;;\n\nDELIMITER ;\n\nCALL `sp__generate_seawitch_equips`();\n\nDROP PROCEDURE IF EXISTS `sp__generate_seawitch_equips`;\n"
  },
  {
    "path": "SQL/updates/world/2022_06_22_02_creature_template.sql",
    "content": "--\nSET @BOT_START = 70581;\nSET @BOT_END   = 70586;\n\nDELETE FROM `creature_template` WHERE `entry` BETWEEN @BOT_START AND @BOT_END;\n\nINSERT INTO `creature_template`\n(`entry`,`difficulty_entry_1`,`difficulty_entry_2`,`difficulty_entry_3`,`KillCredit1`,`KillCredit2`,\n`modelid1`,`modelid2`,`modelid3`,`modelid4`,`name`,`subname`,`IconName`,`gossip_menu_id`,`minlevel`,`maxlevel`,`exp`,\n`faction`,`npcflag`,`speed_walk`,`speed_run`,`scale`,`rank`,`dmgschool`,`BaseAttackTime`,`RangeAttackTime`,\n`BaseVariance`,`RangeVariance`,`unit_class`,`unit_flags`,`unit_flags2`,`dynamicflags`,`family`,`type`,`type_flags`,`lootid`,\n`pickpocketloot`,`skinloot`,`PetSpellDataId`,`VehicleId`,`mingold`,`maxgold`,`AIName`,`MovementType`,\n`HoverHeight`,`HealthModifier`,`ManaModifier`,`ArmorModifier`,`DamageModifier`,`ExperienceModifier`,`RacialLeader`,`movementId`,`RegenHealth`,\n`mechanic_immune_mask`,`spell_school_immune_mask`,`flags_extra`,`ScriptName`,`VerifiedBuild`)\nVALUES\n('70581','0','0','0','0','0','20748','0','0','0','Kondra','Sea Witch Bot','','0','83','83','2','35','1','1.05','1.05','0.5','2','0','1900','1900','1','1','8','0','32','0','0','7','4096','0','0','0','0','0','0','0','','0','1','1','1','1','1','1','0','0','0','0','0','68157552','sea_witch_bot','-1'),\n('70582','0','0','0','0','0','20748','0','0','0','Serpentra','Sea Witch Bot','','0','83','83','2','35','1','1.05','1.05','0.5','2','0','1900','1900','1','1','8','0','32','0','0','7','4096','0','0','0','0','0','0','0','','0','1','1','1','1','1','1','0','0','0','0','0','68157552','sea_witch_bot','-1'),\n('70583','0','0','0','0','0','20748','0','0','0','Serena','Sea Witch Bot','','0','83','83','2','35','1','1.05','1.05','0.5','2','0','1900','1900','1','1','8','0','32','0','0','7','4096','0','0','0','0','0','0','0','','0','1','1','1','1','1','1','0','0','0','0','0','68157552','sea_witch_bot','-1'),\n('70584','0','0','0','0','0','20748','0','0','0','Asprah','Sea Witch Bot','','0','83','83','2','35','1','1.05','1.05','0.5','2','0','1900','1900','1','1','8','0','32','0','0','7','4096','0','0','0','0','0','0','0','','0','1','1','1','1','1','1','0','0','0','0','0','68157552','sea_witch_bot','-1'),\n('70585','0','0','0','0','0','20748','0','0','0','Charib\\'dishal','Sea Witch Bot','','0','83','83','2','35','1','1.05','1.05','0.5','2','0','1900','1900','1','1','8','0','32','0','0','7','4096','0','0','0','0','0','0','0','','0','1','1','1','1','1','1','0','0','0','0','0','68157552','sea_witch_bot','-1'),\n('70586','0','0','0','0','0','20211','0','0','0','Tornado','','','0','83','83','2','35','0','0.9','0.9','3','1','0','2000','2000','1','1','1','33554432','32768','0','0','4','33554432','0','0','0','0','0','0','0','','0','1','1','1','1','1','1','0','0','0','0','0','671096832','sea_witch_pet_bot','-1');\n"
  },
  {
    "path": "SQL/updates/world/2022_06_22_03_npc_text.sql",
    "content": "--\nSET @LOCALIZED_STRINGS_START = 70010;\nSET @LOCALIZED_STRINGS_END   = 70011;\n\nDELETE FROM `npc_text` WHERE ID BETWEEN @LOCALIZED_STRINGS_START and @LOCALIZED_STRINGS_END;\nINSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n('70010','<You see an emaciated naga matron. She looks tired and weak, and avoids looking at you.>$B$BS-s-s-spare the words, mortal...','-1'),\n('70011','Did I mess-s-s-s up my hair again? <She brushes her \\\"hair\\\">$B...No, I didn\\'t. Then what is it?','-1');\n\nSET @LOCALIZED_STRINGS_START = 70108;\nSET @LOCALIZED_STRINGS_END   = 70108;\n\nDELETE FROM `npc_text` WHERE ID BETWEEN @LOCALIZED_STRINGS_START and @LOCALIZED_STRINGS_END;\nINSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n('70108','|cff0000ddSea Witch|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\"A vicious scaly denizen of ocean often associated with the coming of prodigious storms\".$B$BSpell damage taken reduced by 30%, partially immune to control effects, cloth armor, deals physical/spellfrost/spellstorm damage, attack power bonus: agility x2, spell power bonus: 200% intellect. Main attribute: Intellect.$B$BForked Lightning. Calls forth a cone of lightning to damage enemies. Hits from 2 to all targets (depending on Sea Witch\\'s level), stunning them for 2 seconds. This damage generates no threat.$B$BFrost Arrows. Imbues arrow with spellfrost for extra damage, slowing target\\'s movement, attack and casting speed by 30% to 70% (depending on Sea Witch\\'s level).$B$BMana Shield. Creates a shield that absorbs 100% incoming (non-mitigated) damage by using Sea Witch\\'s mana. Absorbs 2 to 10 damage per point of mana (depending on Sea Witch\\'s level).$B$BTornado. Summons a fierce tornado that damages and slows nearby enemy units, sometimes incapacitating them completely. Tornado grows over time oudoors, increasing damage dealt and area of effect, but shrinks indoors, dissipating quickly. Unlocked at level 60.$B$BNaga (Passive). Swim speed increased by 200%, damage and dodge chance are greatly increased while in water.','-1');\n\nSET @LOCALIZED_STRINGS_START = 70651;\nSET @LOCALIZED_STRINGS_END   = 70655;\n\nDELETE FROM `npc_text` WHERE ID BETWEEN @LOCALIZED_STRINGS_START and @LOCALIZED_STRINGS_END;\nINSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n('70651','NIY','-1'),\n('70652','Are you sure this is gonna work? It\\'s better be the best water in the world...','-1'),\n('70653','Seems like you could really use a drink of fresh water.','-1'),\n('70654','Sea Witches','-1'),\n('70655','Sea Witch','-1');\n"
  },
  {
    "path": "SQL/updates/world/2022_06_23_00_command.sql",
    "content": "--\nDELETE FROM `command` WHERE `name` LIKE 'npcbot %';\nINSERT INTO `command` (`name`) VALUES\n('npcbot add'),\n('npcbot command'),\n('npcbot command follow'),\n('npcbot command standstill'),\n('npcbot command stopfully'),\n('npcbot delete'),\n('npcbot distance'),\n('npcbot distance attack'),\n('npcbot distance attack long'),\n('npcbot distance attack short'),\n('npcbot dump'),\n('npcbot dump load'),\n('npcbot dump write'),\n('npcbot hide'),\n('npcbot info'),\n('npcbot kill'),\n('npcbot lookup'),\n('npcbot move'),\n('npcbot order'),\n('npcbot order cast'),\n('npcbot recall'),\n('npcbot recall teleport'),\n('npcbot reloadconfig'),\n('npcbot remove'),\n('npcbot revive'),\n('npcbot set'),\n('npcbot set faction'),\n('npcbot set owner'),\n('npcbot set spec'),\n('npcbot show'),\n('npcbot spawn'),\n('npcbot spawned'),\n('npcbot suicide'),\n('npcbot unhide'),\n('npcbot vehicle'),\n('npcbot vehicle eject');\n"
  },
  {
    "path": "SQL/updates/world/2022_06_24_00_npc_text.sql",
    "content": "--\nSET @LOCALIZED_STRINGS_START = 70108;\nSET @LOCALIZED_STRINGS_END   = 70108;\n\nDELETE FROM `npc_text` WHERE ID BETWEEN @LOCALIZED_STRINGS_START and @LOCALIZED_STRINGS_END;\nINSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n('70108','|cff0000ddSea Witch|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\"A vicious scaly denizen of ocean often associated with the coming of prodigious storms\".$B$BSpell damage taken reduced by 30%, partially immune to control effects, cloth armor, deals physical/spellfrost/spellstorm damage, attack power bonus: agility x2, spell power bonus: 200% intellect. Main attribute: Intellect.$B$BForked Lightning. Calls forth a cone of lightning to damage enemies. Hits from 2 to all targets (depending on Sea Witch\\'s level), stunning them for 2 seconds. This damage generates no threat.$B$BFrost Arrows. Imbues arrow with spellfrost for extra damage, slowing target\\'s movement, attack and casting speed by 30% to 70% (depending on Sea Witch\\'s level).$B$BMana Shield. Creates a shield that absorbs 100% incoming (non-mitigated) damage by using Sea Witch\\'s mana. Effect ranges from 1 damage per 10 mana to 10 damage per 1 mana (depending on Sea Witch\\'s level).$B$BTornado. Summons a fierce tornado that damages and slows nearby enemy units, sometimes incapacitating them completely. Tornado grows over time oudoors, increasing damage dealt and area of effect, but shrinks indoors, dissipating quickly. Unlocked at level 60.$B$BNaga (Passive). Swim speed increased by 200%, damage and dodge chance are greatly increased while in water.','-1');\n"
  },
  {
    "path": "SQL/updates/world/2022_06_24_01_npc_text.sql",
    "content": "--\nSET @LOCALIZED_STRINGS_START = 70656;\nSET @LOCALIZED_STRINGS_END   = 70657;\n\nDELETE FROM `npc_text` WHERE ID BETWEEN @LOCALIZED_STRINGS_START and @LOCALIZED_STRINGS_END;\nINSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n('70656','Mana per damage','-1'),\n('70657','Damage per mana','-1');\n"
  },
  {
    "path": "SQL/updates/world/2022_06_24_02_command.sql",
    "content": "--\nDELETE FROM `command` WHERE `name`='npcbot command walk';\nINSERT INTO `command` (`name`) VALUES\n('npcbot command walk');\n"
  },
  {
    "path": "SQL/updates/world/2022_07_04_00_command.sql",
    "content": "--\nDELETE FROM `command` WHERE `name`='npcbot createnew';\nINSERT INTO `command` (`name`) VALUES\n('npcbot createnew');\n"
  },
  {
    "path": "SQL/updates/world/2022_07_25_00_npc_text.sql",
    "content": "--\nUPDATE `npc_text` SET `text0_0`='|cff0000ddArchmage|r$b|cffdd6600-=Warcraft III tribute=-|r$B$BSpell damage taken reduced by 35%, partially immune to control effects, cloth armor, deals spellsfire/spellfrost damage, no physical attack, spell power bonus: 100% intellect. Main attribute: Intellect.$B$BBlizzard. Your typical blizzard, just a little more powerful, 6 seconds cooldown.$B$BSummon Water Elemental. Summons a water elemental to attack archmage\\'s enemies for 1 min, 20 seconds cooldown.$B$BBrilliance Aura. Increases maximum mana by 10% and greatly increases mana regeneration of party and raid members within 40 yards.$B$BMass Teleport. NIY.$B$B' WHERE (`ID`='70103');\nUPDATE `npc_text` SET `text0_0`='|cff9900ccDreadlord|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\\\"Incredibly powerful demon who wields power of darkness and mental domination\\\".$B$BHigh armor, high resistances, partially immune to control effects, damage taken speeds up spells recharge, plate armor, deals melee/spellshadow damage, bonus damage against incapacitated targets, spell power bonus: 200% strength. Main attribute: Strength.$B$BCarrion Swarm. Sends a horde of bats combined with chaotic magic to damage enemies in a very large frontal cone, cannot crit, 10 seconds cooldown.$B$BSleep. Puts the enemy target to sleep for 60 seconds and allows next physical attack on that target to bypass armor, direct damage caused will awaken the target, 6 seconds cooldown.$B$BVampiric Aura. Increases physical critical damage by 5% and heals party and raid members within 40 yards for a percentage (100% for Dreadlord and 25% for everyone else) of damage done by melee physical attacks and Carrion Swarm, no threat.$B$BSummon Infernal Servant. Calls an infernal down from the sky dealing damage and stunning enemy units, infernal is very resistant to magic and lasts 180 seconds, 180 seconds cooldown.$B$B' WHERE (`ID`='70104');\nUPDATE `npc_text` SET `text0_0`='|cff0000ddSpell Breaker|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\\\"An elven warrior trained to disrupt and contort magical energies\\\".$B$BSpell damage taken reduced by 75%, partially immune to control effects, armor penalty -30%, mail/plate armor, deals melee/arcane damage, spell power bonus: 200% strength. Main attribute: Strength.$B$BSteal Magic (Spellsteal). Steals a benefical spell from an enemy and applies it to a nearby ally or removes a negative spell from an ally and applies it to a nearby enemy, affects magic and curse effects, 2 seconds cooldown.$B$BFeedback (passive). Successful melee attacks burn target\\'s mana equal to damage caused (increased by spellpower) dealing arcane damage. If target\\'s mana is depleted, Spell Breaker\\'s melee attacks will do triple damage with increased critical strike chance. If target does not have mana, Spell Breaker will gain mana equal to 25% of damage dealt.$B$B' WHERE (`ID`='70105');\nUPDATE `npc_text` SET `text0_0`='|cff9900ccDark Ranger|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\\\"A former ranger of Quel\\'thalas forcibly raised from the dead\\\".$B$BSpell damage taken reduced by 35%, undead, partially immune to control effects, leather/cloth armor, deals physical/spellshadow damage, stick to shadows and generates no threat, spell power bonus: 50% intellect. Main attribute: Agility.$B$BSilence. Silences an enemy and up to 4 nearby targets for 8 seconds, 15 seconds cooldown.$B$BBlack Arrow. Fires a cursed arrow dealing 150% weapon damage and additional spellshadow damage over time. If affected target dies from Dark Ranger\\'s damage, Dark Minion will spawn from the corpse (maximum 5 Minions, 80 seconds duration, only works on humanoids, beasts and dragonkin). Deals five times more damage if target is under 20% health.$B$BDrain Life. Drains health from an enemy every second for 5 seconds, healing Dark Ranger for 200% of the drained amount.$B$B' WHERE (`ID`='70106');\nUPDATE `npc_text` SET `text0_0`='|cff9900ccNecromancer|r$b|cffdd6600-=Warcraft III / Diablo II tribute=-|r$B$BSpell damage taken reduced by 20%, partially immune to control effects, cloth armor, deals spellshadow damage, no physical attack, spell power bonus: 100% intellect. Main attribute: Intellect.$B$BRaise Dead. Raises 2 Skeletons from a corpse (maximum 6 Skeletons, 65 seconds duration, only works on humanoids, beasts and dragonkin).$B$BUnholy Frenzy. Increases target\\'s melee attack speed by 75%, but constantly drains health. Lasts 45 seconds. Cannot be cancelled. Unlocked at level 30.$B$BCorpse Explosion. Causes a corpse to explode, dealing damage equal to 35% to 75% of dead unit\\'s maximum health (depends on Necromancer\\'s level) to all surrounding enemies. This damage generates no threat. Unlocked at level 40.$B$BCripple. Reduces target\\'s movement speed, melee attack speed and total strength by 50% for 60 seconds. Unlocked at level 50.$B$B' WHERE (`ID`='70107');\nUPDATE `npc_text` SET `text0_0`='|cff0000ddSea Witch|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\\\"A vicious scaly denizen of ocean often associated with the coming of prodigious storms\\\".$B$BSpell damage taken reduced by 30%, partially immune to control effects, cloth armor, deals physical/spellfrost/spellstorm damage, attack power bonus: agility x2, spell power bonus: 200% intellect. Main attribute: Intellect.$B$BForked Lightning. Calls forth a cone of lightning to damage enemies. Hits from 2 to all targets (depending on Sea Witch\\'s level), stunning them for 2 seconds. This damage generates no threat.$B$BFrost Arrows. Imbues arrow with spellfrost for extra damage, slowing target\\'s movement, attack and casting speed by 30% to 70% (depending on Sea Witch\\'s level).$B$BMana Shield. Creates a shield that absorbs 100% incoming (non-mitigated) damage by using Sea Witch\\'s mana. Effect ranges from 1 damage per 10 mana to 10 damage per 1 mana (depending on Sea Witch\\'s level).$B$BTornado. Summons a fierce tornado that damages and slows nearby enemy units, sometimes incapacitating them completely. Tornado grows over time outdoors, increasing damage dealt and area of effect, but shrinks indoors, dissipating quickly. Unlocked at level 60.$B$BNaga (Passive). Swim speed, damage and dodge chance are greatly increased while in water.$B$B' WHERE (`ID`='70108');\n"
  },
  {
    "path": "SQL/updates/world/2022_11_15_00_npc_text.sql",
    "content": "--\nSET @LOCALIZED_STRINGS_START = 70658;\nSET @LOCALIZED_STRINGS_END   = 70658;\n\nDELETE FROM `npc_text` WHERE ID BETWEEN @LOCALIZED_STRINGS_START and @LOCALIZED_STRINGS_END;\nINSERT INTO `npc_text` (`ID`,`text0_0`) VALUES\n('70658','Transmogrification...');\n"
  },
  {
    "path": "SQL/updates/world/2022_11_30_00_command.sql",
    "content": "--\nDELETE FROM `command` WHERE `name`='npcbot sendto';\nINSERT INTO `command` (`name`) VALUES\n('npcbot sendto');\n"
  },
  {
    "path": "SQL/updates/world/2022_12_08_00_npc_text.sql",
    "content": "--\nSET @BOT_START = 70659;\nSET @BOT_END   = 70659;\n\nDELETE FROM `npc_text` WHERE `ID` BETWEEN @BOT_START AND @BOT_END AND `ID` != 70100;\n\nINSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n(@BOT_START+0, \"DISABLE combat positioning\", -1);\n"
  },
  {
    "path": "SQL/updates/world/2022_12_17_00_command.sql",
    "content": "--\nDELETE FROM `command` WHERE `name` IN ('npcbot list spawned','npcbot list spawned free','npcbot delete free','npcbot delete id');\nINSERT INTO `command` (`name`) VALUES\n('npcbot list spawned'),\n('npcbot list spawned free'),\n('npcbot delete free'),\n('npcbot delete id');\n"
  },
  {
    "path": "SQL/updates/world/2022_12_17_01_command.sql",
    "content": "--\nDELETE FROM `command` WHERE `name` = 'npcbot spawned';\n"
  },
  {
    "path": "SQL/updates/world/2022_12_23_00_command.sql",
    "content": "--\nDELETE FROM `command` WHERE `name` IN ('npcbot command nogossip','npcbot command rebind','npcbot command unbind');\nINSERT INTO `command` (`name`) VALUES\n('npcbot command nogossip'),\n('npcbot command rebind'),\n('npcbot command unbind');\n"
  },
  {
    "path": "SQL/updates/world/2023_01_02_00_npc_text.sql",
    "content": "--\nSET @BOT_START = 70660;\nSET @BOT_END   = 70660;\n\nDELETE FROM `npc_text` WHERE `ID` BETWEEN @BOT_START AND @BOT_END;\n\nINSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n(@BOT_START+0, \"Priority target\", -1);\n"
  },
  {
    "path": "SQL/updates/world/2023_01_10_00_command.sql",
    "content": "--\nDELETE FROM `command` WHERE `name` = 'npcbot sendto last';\nINSERT INTO `command` (`name`) VALUES\n('npcbot sendto last');\n"
  },
  {
    "path": "SQL/updates/world/2023_01_11_00_command.sql",
    "content": "--\nDELETE FROM `command` WHERE `name` IN ('npcbot sendto point','npcbot sendto point set');\nINSERT INTO `command` (`name`) VALUES\n('npcbot sendto point'),\n('npcbot sendto point set');\n"
  },
  {
    "path": "SQL/updates/world/2023_03_10_00_command.sql",
    "content": "--\nDELETE FROM `command` WHERE `name` = 'npcbot go';\nINSERT INTO `command` (`name`) VALUES\n('npcbot go');\n"
  },
  {
    "path": "SQL/updates/world/2023_03_10_01_command.sql",
    "content": "--\nDELETE FROM `command` WHERE `name` = 'npcbot recall spawns';\nINSERT INTO `command` (`name`) VALUES\n('npcbot recall spawns');\n"
  },
  {
    "path": "SQL/updates/world/2023_03_12_00_creature_template_npcbot_wander_nodes.sql",
    "content": "--\nDROP TABLE IF EXISTS `creature_template_npcbot_wander_nodes`;\nCREATE TABLE `creature_template_npcbot_wander_nodes` (\n  `id` int(10) unsigned NOT NULL,\n  `name` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'RENAME_ME',\n  `mapid` smallint(5) unsigned NOT NULL DEFAULT '0',\n  `zoneid` int(10) unsigned NOT NULL DEFAULT '0',\n  `areaid` int(10) unsigned NOT NULL DEFAULT '0',\n  `minlevel` tinyint(3) unsigned NOT NULL DEFAULT '0',\n  `maxlevel` tinyint(3) unsigned NOT NULL DEFAULT '0',\n  `flags` int(10) unsigned NOT NULL DEFAULT '0',\n  `x` float NOT NULL DEFAULT '0',\n  `y` float NOT NULL DEFAULT '0',\n  `z` float NOT NULL DEFAULT '0',\n  `o` float NOT NULL DEFAULT '0',\n  `links` mediumtext COLLATE utf8mb4_unicode_ci,\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Bot Wander Map';\n"
  },
  {
    "path": "SQL/updates/world/2023_03_14_00_creature_wander_nodes.sql",
    "content": "--\nDROP TABLE IF EXISTS `creature_wander_nodes`;\n"
  },
  {
    "path": "SQL/updates/world/2023_03_21_00_creature_template_npcbot_wander_nodes.sql",
    "content": "--\nDROP TABLE IF EXISTS `creature_template_npcbot_wander_nodes`;\n\nCREATE TABLE `creature_template_npcbot_wander_nodes` (\n  `id` int(10) unsigned NOT NULL,\n  `name` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'RENAME_ME',\n  `mapid` smallint(5) unsigned NOT NULL DEFAULT '0',\n  `zoneid` int(10) unsigned NOT NULL DEFAULT '0',\n  `areaid` int(10) unsigned NOT NULL DEFAULT '0',\n  `minlevel` tinyint(3) unsigned NOT NULL DEFAULT '0',\n  `maxlevel` tinyint(3) unsigned NOT NULL DEFAULT '0',\n  `flags` int(10) unsigned NOT NULL DEFAULT '0',\n  `x` float NOT NULL DEFAULT '0',\n  `y` float NOT NULL DEFAULT '0',\n  `z` float NOT NULL DEFAULT '0',\n  `o` float NOT NULL DEFAULT '0',\n  `links` mediumtext COLLATE utf8mb4_unicode_ci,\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Bot Wander Map';\n\nINSERT INTO `creature_template_npcbot_wander_nodes`(`id`,`name`,`mapid`,`zoneid`,`areaid`,`minlevel`,`maxlevel`,`flags`,`x`,`y`,`z`,`o`,`links`) VALUES\n(1,'Anvilmar',0,1,132,1,5,2,-6077.84,384.826,393.598,4.63263,'542:0 '),\n(2,'Brill',0,85,159,1,10,5,2249.85,278.414,34.1142,5.11546,'18:0 277:0 278:0 279:0 281:0 '),\n(3,'Darkshire',0,10,42,18,30,3,-10560.6,-1182.34,27.9637,3.1803,'783:0 784:0 787:0 788:0 789:0 '),\n(4,'Deathknell',0,85,154,1,10,5,1879.83,1588.2,90.1725,5.25172,'295:0 296:0 '),\n(5,'Dun Algaz',0,11,836,18,30,0,-4245.13,-2356.42,204.034,3.9477,'483:0 '),\n(6,'Dun Modr',0,11,205,18,30,0,-2610.26,-2350.56,81.5918,1.1263,'444:0 '),\n(7,'Goldshire',0,12,87,1,10,3,-9480.09,63.5218,56.1755,3.4173,'88:0 71:0 16:0 42:0 72:0 710:0 709:0 714:0 717:0 '),\n(8,'Ironforge',0,1,809,1,10,2,-5023.64,-831.425,495.319,5.37056,'559:0 560:0 '),\n(9,'Kharanos',0,1,131,1,10,3,-5501.22,-472.604,408.453,2.4002,'537:0 545:0 557:0 '),\n(10,'Lakeshire',0,44,69,13,25,3,-9235.12,-2145.54,71.2121,5.71383,'665:0 666:0 '),\n(11,'Menethil Harbor',0,11,150,18,30,3,-3672.7,-828.455,9.89925,3.18444,'476:0 477:0 478:0 '),\n(12,'Moonbrook',0,40,20,8,20,2,-11017.1,1510.17,43.1667,2.58627,'737:0 738:0 736:0 747:0 '),\n(13,'Northshire Abbey',0,12,9,1,10,3,-8900.51,-116.199,81.8499,0.369434,'710:0 70:0 73:0 '),\n(14,'Raven Hill',0,10,94,18,30,0,-10805.5,291.025,30.9282,3.92422,'751:0 753:0 754:0 755:0 766:0 '),\n(15,'Sentinel Hill',0,40,108,8,20,3,-10509.5,1047.74,60.519,5.20046,'741:0 742:0 745:0 746:0 736:0 750:0 '),\n(16,'Stormwind City',0,12,12,1,10,2,-9153.77,364.057,90.151,5.16709,'42:0 710:0 712:0 7:0 '),\n(17,'The Sepulcher',0,130,228,8,20,5,470.768,1589.82,126.632,5.16292,'305:0 '),\n(18,'Undercity',0,85,153,1,10,5,1885.94,236.924,58.0313,3.1016,'2:0 285:0 '),\n(19,'Thelsamar',0,38,144,8,20,3,-5334.7,-3015.26,324.2,1.73643,'503:0 504:0 '),\n(20,'Southshore',0,267,271,18,30,3,-803.031,-531.727,15.9656,1.39359,'362:0 363:0 376:0 384:0 385:0 356:0 '),\n(21,'Tarren Mill',0,267,272,18,30,5,-27.0354,-900.562,55.9602,4.57301,'378:0 380:0 379:0 384:0 '),\n(22,'Refuge Pointe',0,45,320,28,40,3,-1280.81,-2466.89,34.7175,5.16384,'78:0 416:0 419:0 '),\n(23,'Hammerfall',0,45,321,28,40,5,-955.494,-3540.82,56.7101,3.23882,'438:0 '),\n(24,'Kargath',0,3,340,33,45,5,-6625,-2152.82,249.141,4.5492,'594:0 598:0 '),\n(25,'Angor Fortress',0,3,338,33,45,0,-6392.65,-3158,299.765,4.68826,'608:0 620:0 '),\n(26,'Bloodhoof Village',1,215,222,1,10,0,-2323.92,-394.981,-9.12757,0.10888,''),\n(27,'Camp Narache',1,215,221,1,10,0,-2906.49,-253.607,52.941,5.73627,''),\n(28,'Razor Hill',1,14,362,1,10,0,312.659,-4745.52,9.54734,1.10362,'66:0 '),\n(29,'The Den',1,14,363,1,10,0,-604.098,-4202.92,38.7281,1.10189,''),\n(30,'Orgrimmar',1,14,14,1,10,0,1381.77,-4371.16,26.023,2.19128,''),\n(31,'Senjin Village',1,14,367,1,10,0,-819.492,-4918.24,18.3507,2.67153,''),\n(32,'The Crossroads',1,17,380,8,20,0,-455.9,-2652.15,95.5864,4.41391,''),\n(33,'Aldrassil',1,141,256,1,10,0,10462.7,805.993,1312.66,0.945149,'61:0 62:0 63:0 65:0 '),\n(34,'Dolanaar',1,141,186,1,10,0,9787.99,949.897,1306.73,0.734179,'63:0 '),\n(35,'Ratchet',1,17,392,8,20,0,-951.364,-3680.07,8.04046,0.798474,''),\n(36,'Booty Bay',0,33,35,33,45,0,-14308.8,440.139,25.5878,0.828079,'959:0 960:0 961:0 '),\n(37,'Gromgol Base Camp',0,33,117,33,45,5,-12416.5,185.125,1.83125,6.17782,'904:0 900:0 908:0 '),\n(38,'Astranaar',1,331,415,18,30,0,2720.43,-382.391,107.089,1.24727,''),\n(39,'Stonetalon Peak',1,406,467,13,25,0,2658.78,1449.71,226.135,5.85107,'155:0 '),\n(40,'Thalanaar',1,357,489,38,50,0,-4510.03,-779.474,-41.5367,0.513916,''),\n(41,'Freewind Post',1,400,484,23,35,0,-5454.07,-2445.5,90.1122,6.10667,'119:0 120:0 '),\n(42,'Mirror Lake',0,12,92,1,10,2,-9389.26,458.427,38.2852,2.4529,'72:0 16:0 88:0 7:0 '),\n(44,'Drywhisker Gorge',0,45,318,28,40,0,-1014.22,-3827.39,145.41,2.59534,'440:0 '),\n(45,'Sun Rock Retreat',1,406,460,13,25,0,936.308,910.974,104.44,0.864181,'151:0 '),\n(46,'Temple of Zin-Malor',1,16,1223,43,54,0,3549.15,-5359.12,188.348,1.22969,''),\n(47,'Hetaeras Clutch',1,16,1222,43,54,0,3556.64,-6232.79,44.0085,4.90175,'141:0 195:0 '),\n(48,'Uthers Tomb',0,28,196,48,56,0,1021.5,-1809.43,77.1448,3.5376,'271:0 '),\n(49,'Scholomance',0,139,2057,53,60,0,1262.19,-2579.41,123.746,4.56181,''),\n(50,'Whitereach Post',1,400,2237,23,35,0,-4917.35,-1375.5,-52.612,3.05417,''),\n(51,'Stonard',0,8,75,33,45,5,-10445,-3261.11,20.179,5.57373,'828:0 829:0 830:0 '),\n(52,'Gadgetzan',1,440,976,38,50,0,-7139.15,-3752.11,8.53951,2.41012,''),\n(53,'Camp Mojache',1,357,1099,38,50,0,-4394.98,215.611,25.4138,0.668987,'136:0 137:0 '),\n(54,'Theramore Isle',1,15,513,33,45,0,-3680.17,-4388.51,10.5544,2.126,'109:0 '),\n(55,'Aerie Peak',0,47,348,38,50,0,170.251,-2085.14,112.706,5.73674,'82:0 386:0 387:0 388:0 '),\n(56,'Everlook',1,618,2255,53,60,0,6723.46,-4662.5,720.986,4.0489,'143:0 147:0 '),\n(57,'Shadowprey Village',1,405,2408,28,40,0,-1657.85,3097.92,30.5002,4.53043,'127:0 '),\n(58,'Feathermoon Stronghold',1,357,1116,38,50,0,-4434.99,3276.74,11.7782,1.86721,''),\n(59,'Auberdine',1,148,442,8,20,0,6439.33,411.951,10.8632,4.98592,''),\n(60,'Nijels Point',1,405,608,28,40,0,202.521,1308.24,190.237,3.56577,''),\n(61,'Aldrassil',1,141,256,1,10,0,10479.6,812.281,1322.74,1.7975,'33:0 62:0 63:0 65:0 '),\n(62,'Shadowthread Cave',1,141,257,1,10,0,10756.2,921.301,1338.56,2.9431,'33:0 61:0 65:0 '),\n(63,'Fel Rock',1,141,258,1,10,0,10050.6,1031.2,1329.95,1.85839,'33:0 34:0 61:0 65:0 '),\n(64,'Banethil Barrow Den',1,141,736,1,10,0,9864.17,1557.41,1328.3,4.60699,''),\n(65,'The Cleft',1,141,263,1,10,0,10316.4,1200.62,1458.08,3.62911,'33:0 61:0 62:0 63:0 '),\n(66,'Razorwind Canyon',1,14,410,1,10,0,636.963,-4534.04,8.82068,1.74237,'28:0 67:0 '),\n(67,'Torkren Farm',1,14,2979,1,10,0,726.297,-4242.41,17.2915,1.86203,'66:0 '),\n(69,'Ironbands Compound',0,1,716,1,10,2,-5858.7,-2004.1,401.648,0.478922,'523:0 528:0 '),\n(70,'Echo Ridge Mine',0,12,34,1,10,2,-8691.38,-113.152,89.09,5.86134,'73:0 13:0 711:0 '),\n(71,'Maclure Vineyards',0,12,64,1,10,2,-9948.39,69.1568,33.3005,5.49869,'72:0 7:0 714:0 716:0 '),\n(72,'Stonefield Farm',0,12,63,1,10,2,-9901.14,378.19,35.2801,5.75613,'71:0 7:0 42:0 88:0 713:0 714:0 717:0 '),\n(73,'Northshire Vineyards',0,12,59,1,10,2,-9067.35,-333.965,73.4519,1.09469,'70:0 13:0 '),\n(74,'Tower of Ilgalar',0,44,96,18,25,0,-9282.21,-3330.43,115.604,1.41034,'683:0 685:0 686:0 '),\n(75,'Renders Rock',0,44,998,13,25,0,-8677.89,-2302.91,155.917,1.18325,'661:0 662:0 '),\n(76,'Spirit Den',0,33,1742,33,45,0,-13751.4,-18.3165,44.0002,0.851192,'964:0 '),\n(77,'Rethban Caverns',0,44,98,13,25,2,-8976.38,-2016.83,136.063,1.26142,'670:0 671:0 '),\n(78,'Boulderfist Outpost',0,45,1858,28,40,0,-1183.46,-2180.67,55.5524,1.6849,'22:0 415:0 416:0 419:0 '),\n(79,'Groshgok Compound',0,41,2937,50,60,0,-11094.7,-2311.06,117.13,4.77931,'800:0 803:0 804:0 '),\n(80,'Stagalbog Cave',0,8,1817,33,45,0,-10775.6,-3747.85,22.347,3.74768,'186:0 825:0 824:0 826:0 828:0 832:0 '),\n(81,'The Tower of Arathor',0,45,324,28,40,0,-1760.68,-1537.05,64.8696,2.02383,'425:0 '),\n(82,'Wildhammer Keep',0,47,349,38,50,0,257.234,-2208.21,142.103,6.19816,'55:0 387:0 388:0 '),\n(83,'Night Webs Hollow',0,85,155,1,10,4,2053.22,1802.16,99.8006,1.83635,'295:0 '),\n(84,'Terrorweb Tunnel',0,139,2626,53,60,0,3035.33,-2773.9,100.473,5.05065,'215:0 243:0 '),\n(85,'Browman Mill',0,139,2269,53,60,0,2483.98,-5183.79,76.1135,3.20045,'234:0 211:0 '),\n(86,'Uldaman',0,3,1337,33,45,0,-6092.01,-3179.35,255.852,5.9237,'621:0 '),\n(87,'Dustbelch Grotto',0,3,347,33,45,0,-7299.86,-2270.26,244.599,3.07308,'595:0 '),\n(88,'Westbrook Garrison',0,12,120,1,10,2,-9671.96,690.134,36.5414,5.31336,'72:0 42:0 713:0 7:0 717:0 '),\n(89,'Jasperlode Mine',0,12,54,1,10,0,-9194.18,-610.205,60.7892,0.426731,'701:0 702:0 707:0 708:0 '),\n(91,'Algaz Station',0,38,925,8,20,0,-4880.26,-2723,328.908,0.873682,'485:0 486:0 487:0 500:0 502:0 '),\n(92,'Grim Batol',0,11,1037,61,70,0,-4130,-3468.16,259.76,0.014411,'454:0 '),\n(93,'Venture Co. Mine',1,215,215,1,10,0,-1501.49,-1036.19,151.717,1.01756,''),\n(94,'Blackwood Den',1,148,455,8,20,0,4619.42,25.6126,69.7834,4.80597,'95:0 '),\n(95,'Wildbend River',1,148,454,8,20,0,5056.04,220.755,22.9081,5.20884,'94:0 '),\n(96,'Cliffspring Falls',1,148,445,8,20,0,6870.57,-662.396,82.9506,0.302464,''),\n(97,'Fray Island',1,17,720,8,20,0,-1668.51,-4329.2,3.26569,0.222455,''),\n(98,'Wailing Caverns',1,17,718,8,20,0,-837.968,-2037,80.467,1.58062,''),\n(99,'Shady Rest Inn',1,15,403,33,45,0,-3723.63,-2535.18,69.5651,1.00004,'103:0 '),\n(100,'Darkmist Cavern',1,15,499,33,45,0,-2829.79,-2722.81,36.7883,2.20851,'102:0 187:0 '),\n(101,'North Point Tower',1,15,504,33,45,0,-2884.79,-3429.99,39.357,3.86048,'102:0 110:0 '),\n(102,'Bluefen',1,15,507,33,45,0,-2685.32,-3087.58,41.4492,4.02905,'100:0 101:0 187:0 '),\n(103,'Lost Point',1,15,506,33,45,0,-3925.5,-2862.15,46.4791,4.55427,'99:0 108:0 '),\n(104,'Tidefury Cove',1,15,517,33,45,0,-4300.98,-4062.71,-10.5964,2.84709,'106:0 '),\n(105,'Stonemaul Ruins',1,15,508,33,45,0,-4346.02,-3321.15,34.2542,6.16796,'106:0 233:0 '),\n(106,'Onyxias Lair',1,15,511,33,45,0,-4698.06,-3720.58,47.1529,0.469848,'104:0 105:0 107:0 '),\n(107,'Emberstrifes Den',1,15,2158,33,45,0,-4987.73,-3832.99,44.1305,3.70876,'106:0 '),\n(108,'Bloodfen Burrow',1,15,498,33,45,0,-4335.04,-2639.53,38.0638,1.30845,'103:0 '),\n(109,'Sentry Point',1,15,503,33,45,0,-3476.59,-4109.08,17.1041,4.05466,'54:0 '),\n(110,'Swamplight Manor',1,15,497,33,45,0,-2949.47,-3893.5,35.0303,1.23141,'101:0 '),\n(111,'Marshals Refuge',1,490,541,46,56,0,-6143.21,-1078.89,-198.367,5.66637,''),\n(112,'Fungal Rock',1,490,542,46,56,0,-6370.15,-1836.52,-260.084,0.958035,''),\n(113,'Wavestrider Beach',1,440,988,38,50,0,-7693.45,-4878.96,0.661957,4.5132,''),\n(114,'Uldum',1,440,989,38,50,0,-9635.41,-2787.2,7.85617,5.44167,''),\n(115,'Darkcloud Pinnacle',1,400,2097,23,35,0,-5086.21,-1919.44,88.1806,6.15461,'116:0 119:0 '),\n(116,'Roguefeather Den',1,400,487,23,35,0,-5466.71,-1636.27,29.0246,3.60035,'115:0 '),\n(117,'Mirage Raceway',1,400,2240,23,35,0,-6239.42,-3973.12,-58.7501,5.06259,'122:0 123:0 '),\n(118,'The Rustmaul Digsite',1,400,479,23,35,0,-6490.61,-3449.15,-58.7821,3.58106,'123:0 '),\n(119,'Splithoof Hold',1,400,1557,23,35,0,-5065.61,-2367.61,-53.6725,4.0206,'41:0 115:0 120:0 '),\n(120,'The Weathered Nook',1,400,2303,23,35,0,-5213.85,-2794.53,-7.83752,2.24538,'41:0 119:0 '),\n(121,'Ironstone Camp',1,400,3037,23,35,0,-5848.05,-3412.38,-51.0548,0.373431,'122:0 '),\n(122,'Weazels Crater',1,400,3038,23,35,0,-5799.94,-3899.53,-96.7429,1.92693,'117:0 121:0 '),\n(123,'Tahonda Ruins',1,400,3039,23,35,0,-6569.91,-3894.97,-58.7495,0.100017,'117:0 118:0 '),\n(124,'Rolands Doom',0,10,2161,24,30,0,-11045.3,-1130.98,38.585,3.65547,'780:0 781:0 '),\n(126,'Bolgans Hole',1,405,600,28,40,0,-2281.95,2499.6,73.7525,5.34105,''),\n(127,'Maraudon',1,405,2100,28,40,0,-1422.62,2918.45,136.147,4.46498,'57:0 '),\n(128,'Ghost Walker Post',1,405,597,28,40,0,-1224.06,1736.67,90.0219,0.112112,'129:0 '),\n(129,'Scrabblescrews Camp',1,405,2617,28,40,0,-1407.87,1493.13,60.8875,4.75641,'128:0 '),\n(130,'Valley of Bones',1,405,2657,28,40,0,-2251.19,1513.55,63.5889,6.25387,''),\n(131,'Rage Scar Hold',1,357,1115,38,50,0,-3842.71,1738.94,142.708,2.30123,''),\n(132,'Ruins of Solarsal',1,357,1117,38,50,0,-4852.91,3616.63,16.4186,4.11504,''),\n(133,'Ravaged Twilight Camp',1,1377,3100,53,60,0,-6206.25,1766.95,17.464,4.2566,''),\n(134,'Twilight Post',1,1377,3098,53,60,0,-6740.04,1636.32,15.2836,4.04162,'189:0 202:0 '),\n(135,'Twilight Outpost',1,1377,3099,53,60,0,-7929.11,1833.28,4.86506,0.733634,''),\n(136,'Woodpaw Hills',1,357,2519,38,50,0,-4915.81,199.275,52.2959,6.13256,'53:0 '),\n(137,'Lariss Pavillion',1,357,2518,38,50,0,-4052.72,81.5525,77.1755,5.22503,'53:0 '),\n(138,'Slither Rock',0,46,2419,48,56,0,-7653.86,-2991.1,135.917,1.62615,'648:0 650:0 652:0 '),\n(139,'Flame Crest',0,46,251,48,56,0,-7486.64,-2184.45,166.505,5.87909,'646:0 '),\n(140,'Shalzarus Lair',1,357,3117,38,50,0,-5492.37,3622.79,1.62975,3.27216,''),\n(141,'Scalebeards Cave',1,16,3140,43,54,0,3705.1,-6043.45,2.50768,0.191079,'47:0 195:0 '),\n(142,'Timbermaw Hold',1,618,618,53,60,0,6900.63,-2298.18,588.52,1.94812,'148:0 '),\n(143,'The Ruins of KelTheril',1,618,2252,53,60,0,6426.76,-4304.99,664.687,3.04093,'56:0 194:0 '),\n(144,'Dun Mandarr',1,618,2248,53,60,0,5718.83,-4507.31,761.083,4.26757,''),\n(145,'Talrendis Point',1,16,3137,43,54,0,2707.72,-3869.25,104.208,5.79411,''),\n(146,'Rethress Sanctum',1,16,3138,43,54,0,2195.67,-6438.33,2.1301,4.39206,''),\n(147,'Moon Horror Den',1,618,3139,53,60,0,7123.02,-4631.57,639.68,2.0052,'56:0 '),\n(148,'Timbermaw Hold',1,361,1769,46,56,0,6817.78,-2097.68,624.839,2.56313,'142:0 '),\n(149,'Irontree Cavern',1,361,1768,46,56,0,6481.87,-1571,438.965,0.859127,''),\n(150,'Bloodvenom Post',1,361,1997,46,56,0,5111.98,-353.403,357.231,5.23802,''),\n(151,'Sishir Canyon',1,406,2541,13,25,0,515.845,624.05,68.1596,5.69462,'45:0 '),\n(152,'Cragpool Lake',1,406,463,13,25,0,1543.57,70.1338,-10.3835,0.632571,''),\n(153,'Windshear Mine',1,406,461,13,25,0,981.949,-358.9,14.3123,3.71479,''),\n(154,'The Talondeep Path',1,406,1277,13,25,0,1531.94,-576.57,67.9212,5.18318,'168:0 '),\n(155,'The Talon Den',1,406,468,13,25,0,2416.89,1792.39,393.641,3.36062,'39:0 '),\n(156,'The Ruins of OrdilAran',1,331,412,18,30,0,3493.89,-119.601,0.714987,2.44963,'157:0 '),\n(157,'Bathrans Haunt',1,331,411,18,30,0,3827.37,-161.305,-0.60768,3.24941,'156:0 '),\n(158,'Zoramgar Outpost',1,331,2897,18,30,0,3362.22,1010.16,3.59814,2.49558,''),\n(159,'Falfarren River',1,331,433,18,30,0,2231.21,-2222.91,94.4116,6.0491,'163:0 175:0 '),\n(160,'Xavian',1,331,429,18,30,0,2936.56,-2822.67,212.731,0.0776333,'161:0 '),\n(161,'Forest Song',1,331,2358,18,30,0,2880.33,-3287.54,156.204,1.1163,'160:0 '),\n(162,'Demon Fall Canyon',1,331,435,18,30,0,1702.45,-3150.99,93.5217,3.37253,'164:0 '),\n(163,'Silverwing Outpost',1,331,2360,18,30,0,1776.64,-2065.15,102.283,2.23373,'159:0 169:0 182:0 '),\n(164,'The DorDanil Barrow Den',1,331,432,18,30,0,1776.23,-2678.36,111.666,5.44343,'162:0 169:0 175:0 '),\n(165,'Silverwind Refuge',1,331,420,18,30,0,2130.27,-1190.25,99.3456,1.77657,'166:0 168:0 '),\n(166,'Greenpaw Village',1,331,2359,18,30,0,2291.29,-1444.96,87.8806,1.08665,'165:0 '),\n(167,'Bloodtooth Camp',1,331,2357,18,30,0,1612.52,-1465.1,157.023,5.78447,'182:0 '),\n(168,'The Talondeep Path',1,406,1277,13,25,0,1930.26,-732.677,114.534,3.7975,'154:0 165:0 '),\n(169,'Warsong Labor Camp',1,331,3177,18,30,0,1575.91,-2463.94,98.549,2.24558,'163:0 164:0 '),\n(170,'Aridens Camp',0,41,2560,50,60,0,-10443.3,-2141.1,90.7796,5.92189,'801:0 '),\n(171,'Deadwind Ravine',0,41,2558,50,60,0,-10607.9,-1904.89,117.201,2.66188,'798:0 799:0 '),\n(172,'Sleeping Gorge',0,41,2938,50,60,0,-10740.7,-1951.45,121.127,3.69664,'800:0 801:0 '),\n(173,'Chillwind Camp',0,28,3197,48,56,1,940.955,-1419.2,66.7723,0.796556,'271:0 272:0 334:0 '),\n(174,'Camp Taurajo',1,17,378,8,20,0,-2352.66,-1921.67,95.7825,1.62324,''),\n(175,'Splintertree Post',1,331,431,18,30,0,2286.41,-2564.67,105.481,4.11999,'159:0 164:0 '),\n(176,'The Swarming Pillar',1,1377,3097,53,60,0,-7066.79,731.852,67.2655,1.04864,'177:0 188:0 189:0 205:0 '),\n(177,'Bones of Grakkarond',1,1377,3257,53,60,0,-7234.61,874.224,0.285286,1.72442,'176:0 188:0 189:0 205:0 '),\n(178,'Woodpaw Den',1,357,2520,38,50,0,-4835.2,863.048,137.048,3.8637,''),\n(179,'Revantusk Village',0,47,3317,38,50,5,-573.459,-4590.51,10.4122,3.48476,'407:0 '),\n(180,'Thorium Point',0,51,1446,43,54,0,-6521.12,-1190.02,309.255,4.39589,'590:0 '),\n(181,'Morshan Base Camp',1,17,1599,8,20,0,1035.13,-2113.34,122.947,5.1989,'182:0 '),\n(182,'Silverwing Grove',1,331,3319,18,30,0,1462.48,-1858.93,123.55,1.74032,'163:0 167:0 181:0 '),\n(183,'The Weeping Cave',0,28,198,48,56,0,2249.61,-2389.63,59.8017,5.27414,'244:0 255:0 256:0 '),\n(184,'Valors Rest',1,1377,3077,53,60,0,-6404.33,-292.647,1.04401,3.06251,'190:0 191:0 '),\n(185,'Yojamba Isle',0,33,3357,33,45,0,-11838,1268.18,1.74176,4.79629,'894:0 887:0 895:0 896:0 '),\n(186,'Misty Reed Post',0,8,1978,33,45,4,-10854.8,-4093.43,21.7429,5.03063,'825:0 80:0 826:0 '),\n(187,'Brackenwall Village',1,15,496,33,45,0,-3132.98,-2880.71,34.718,4.58324,'100:0 102:0 '),\n(188,'Cenarion Hold',1,1377,3425,53,60,0,-6886.15,718.398,42.798,6.10305,'176:0 177:0 189:0 '),\n(189,'Twilight Base Camp',1,1377,2739,53,60,0,-6996.15,1195.01,11.4959,1.16226,'134:0 176:0 177:0 188:0 202:0 204:0 '),\n(190,'Staghelm Point',1,1377,3426,53,60,0,-6517.49,97.5554,126.126,1.85794,'184:0 191:0 '),\n(191,'Twilights Run',1,1377,3446,53,60,0,-6310.14,136.591,15.4595,2.53339,'184:0 190:0 '),\n(192,'Ortells Hideout',1,1377,2744,53,60,0,-7586.17,226.396,10.8663,1.24673,'205:0 '),\n(193,'Bronzebeard Encampment',1,1377,3427,53,60,0,-8021.76,1105.84,3.54927,1.43333,'203:0 '),\n(194,'Under Attack - Winterspring',1,618,2251,53,60,0,6519.57,-4117.1,661.535,4.32283,'143:0 '),\n(195,'Under Attack - Azshara',1,16,1222,43,54,0,3366.79,-6226.81,-15.3194,1.50275,'47:0 141:0 '),\n(196,'BLC1',0,4,4,43,54,0,-11202.2,-3034.46,6.232,1.13173,'839:0 841:0 845:0 852:0 854:0 '),\n(198,'Under Attack - Tanaris Desert',1,440,440,38,50,0,-8277.12,-3484.09,17.7284,1.51601,''),\n(199,'Under Attack - Eastern Plaguelands',0,139,2258,53,60,0,2492.32,-3803.41,177.692,4.09879,'248:0 '),\n(200,'Ivars Patch',0,130,239,8,20,4,1233.05,1214.28,52.5845,3.07876,'201:0 298:0 299:0 303:0 '),\n(201,'Valgans Field',0,130,227,8,20,4,908.754,1255.63,45.9684,0.575633,'299:0 302:0 303:0 200:0 '),\n(202,'Sandworm! - A Silithyst beast has surfaced',1,1377,2742,53,60,0,-6548.72,1150.51,-1.23794,4.6252,'134:0 189:0 '),\n(203,'Sandworm! - A Silithyst beast has surfaced',1,1377,1377,53,60,0,-7786.01,978.815,-2.90318,5.53981,'193:0 '),\n(204,'Sandworm! - A Silithyst beast has surfaced',1,1377,2743,53,60,0,-7463.3,1411.7,3.70656,4.14577,'189:0 '),\n(205,'Sandworm! - A Silithyst beast has surfaced',1,1377,2738,53,60,0,-7377.08,447.046,4.53578,2.59898,'176:0 177:0 192:0 '),\n(211,'Eastwall Tower - Horde',0,139,2271,53,60,0,2550.77,-4783.57,109.501,5.47479,'85:0 235:0 237:0 250:0 '),\n(215,'Plaguewood Tower - Horde, Progressing',0,139,4067,53,60,0,2991.34,-3045.27,119.143,2.65173,'84:0 241:0 242:0 '),\n(220,'Northpass Tower - Horde, Contested',0,139,2275,53,60,0,3168.41,-4356.58,138.976,4.89792,'236:0 237:0 238:0 '),\n(230,'Crown Guard Tower - Alliance',0,139,2263,53,60,0,1861.6,-3701.08,160.834,4.34226,'248:0 247:0 249:0 '),\n(233,'Mudsprocket',1,15,4010,33,45,0,-4590.83,-3182.5,34.9064,2.13752,'105:0 '),\n(234,'LightsHopeChapel',0,139,2268,53,60,1,2273.52,-5332.92,88.0978,1.44413,'85:0 252:0 '),\n(235,'BlackwoodLake',0,139,2624,53,60,0,2464.31,-4192.32,86.7625,5.25334,'211:0 236:0 250:0 '),\n(236,'EPL_hubN1',0,139,139,53,60,0,2895.84,-4274.37,91.0774,2.94428,'220:0 235:0 237:0 240:0 '),\n(237,'Northdale',0,139,2272,53,60,0,2939.45,-4922.8,110.201,2.76758,'236:0 211:0 220:0 238:0 '),\n(238,'ZulMasharEntrance',0,139,2273,53,60,0,3243.57,-4728.42,157.177,1.67982,'237:0 220:0 239:0 '),\n(239,'MazraAlor',0,139,2274,53,60,0,3446.77,-4987,196.046,5.53613,'238:0 '),\n(240,'PlaguewoodEast',0,139,2277,53,60,0,3031.09,-3786.79,119.967,4.37961,'236:0 241:0 242:0 '),\n(241,'PlaguewoodSouth',0,139,2277,53,60,0,2764.18,-3442.19,97.1331,4.24216,'215:0 240:0 242:0 '),\n(242,'PlaguewoodCenter',0,139,2277,53,60,0,3137.26,-3403.95,139.517,0.937594,'215:0 240:0 241:0 '),\n(243,'TerrorweTunnelWest',0,139,2619,53,60,0,2724.41,-2453.2,66.836,5.42496,'244:0 84:0 '),\n(244,'ThondorilRiverSouth',0,139,2619,53,60,0,2417.75,-2469.65,72.4504,0.00296164,'183:0 243:0 245:0 '),\n(245,'EPL_hubSW',0,139,139,53,60,0,2076.2,-2853.69,86.3391,0.879086,'244:0 246:0 248:0 255:0 '),\n(246,'EPL_hubSWRoad',0,139,139,53,60,0,1811.3,-3046.98,75.4985,1.09939,'245:0 247:0 255:0 '),\n(247,'Undercroft',0,139,2261,53,60,0,1600.37,-3283.08,91.4858,0.567285,'246:0 230:0 '),\n(248,'EPL_hubSW2',0,139,139,53,60,0,2175.83,-3487.76,123.024,5.90406,'199:0 230:0 245:0 '),\n(249,'EPL_SRoad',0,139,139,53,60,0,1841.76,-4088.5,101.961,5.05584,'230:0 250:0 '),\n(250,'CorinsCrossing',0,139,2264,53,60,0,2074.45,-4556.23,73.5772,0.745981,'211:0 235:0 249:0 251:0 252:0 '),\n(251,'ScarletBaseCamp',0,139,2265,53,60,0,1656.05,-4826.35,87.7738,0.384695,'250:0 252:0 253:0 '),\n(252,'PestilentScar',0,139,2622,53,60,0,2013.6,-4964.85,73.6116,5.58402,'234:0 250:0 251:0 253:0 '),\n(253,'TyrshandEntrance',0,139,2266,53,60,0,1690.77,-5201.46,74.6226,4.83788,'251:0 252:0 254:0 '),\n(254,'Tyrshand',0,139,2266,53,60,0,1609.91,-5528.27,111.168,4.2076,'253:0 '),\n(255,'ThondorilRiverBridge',0,139,2619,53,60,0,1924.72,-2608.2,62.8109,4.6761,'183:0 245:0 246:0 256:0 '),\n(256,'GahrronWithering',0,28,201,48,56,0,1768.07,-2280.14,59.7087,0.010807,'183:0 255:0 257:0 258:0 '),\n(257,'WritingHaunt',0,28,202,48,56,0,1506.64,-1862.76,59.0986,5.271,'256:0 258:0 259:0 266:0 269:0 '),\n(258,'WPL_hubC2',0,28,28,48,56,0,1760.12,-1779.45,64.8245,4.87437,'256:0 257:0 259:0 260:0 266:0 269:0 '),\n(259,'DalsonTears',0,28,200,48,56,0,1864.12,-1558.81,59.2668,3.44495,'257:0 258:0 260:0 266:0 267:0 269:0 '),\n(260,'WPL_hubN1',0,28,28,48,56,0,2122.47,-1665.81,64.0458,5.36013,'258:0 259:0 261:0 262:0 '),\n(261,'NorthridgeLumberCamp',0,28,192,48,56,0,2421.88,-1647.26,103.541,5.77835,'260:0 '),\n(262,'WPL_hubN2',0,28,28,48,56,0,2425.99,-1947.45,109.098,4.71217,'260:0 263:0 '),\n(263,'HearthglenTower',0,28,28,48,56,0,2701.43,-1944.23,107.238,0.832291,'262:0 265:0 '),\n(264,'Hearthglen',0,28,203,48,56,0,2924.12,-1426.31,150.782,1.09736,'265:0 '),\n(265,'HearthglenEntrance',0,28,190,48,56,0,2782.62,-1612.54,129.551,0.826396,'264:0 263:0 '),\n(266,'WPL_hubC1',0,28,28,48,56,0,1680.03,-1358.64,69.8578,5.02985,'268:0 257:0 258:0 259:0 267:0 269:0 270:0 274:0 '),\n(267,'FelstoneField',0,28,199,48,56,0,1795.08,-1188.53,59.8914,5.54821,'268:0 259:0 266:0 269:0 273:0 274:0 '),\n(268,'AndorhalW',0,28,193,48,56,0,1336.99,-1272.01,57.8614,2.26525,'266:0 267:0 269:0 270:0 272:0 '),\n(269,'AndorhalNE',0,28,193,48,56,0,1540.11,-1606.19,65.1216,5.937,'257:0 258:0 259:0 266:0 267:0 268:0 270:0 '),\n(270,'AndorhalEntranceSE',0,28,197,48,56,0,1294.98,-1678.78,62.5727,3.83801,'268:0 266:0 269:0 271:0 '),\n(271,'SorrowHillCR',0,28,197,48,56,0,1162.78,-1758.3,60.6308,3.04279,'48:0 173:0 270:0 '),\n(272,'AndorhalEntranceSW',0,28,28,48,56,0,1214.59,-1145.63,60.8962,5.48342,'268:0 173:0 '),\n(273,'Bulwark',0,28,813,10,56,4,1718.17,-802.509,57.5466,1.68044,'267:0 274:0 275:0 276:0 '),\n(274,'WPL_hubE',0,28,813,48,56,0,1663.85,-956.731,69.3084,0.651574,'266:0 267:0 273:0 '),\n(275,'TG_hubSE',0,85,85,1,10,4,1806.63,-369.504,32.3876,6.02566,'273:0 276:0 277:0 '),\n(276,'BalnirFarmstead',0,85,165,6,10,4,2029.54,-432.459,35.4011,5.30269,'273:0 275:0 277:0 '),\n(277,'TG_hubC2',0,85,85,1,10,4,2029.86,-87.8105,35.5077,4.49765,'2:0 275:0 276:0 '),\n(278,'BrillEntrance',0,85,159,1,10,4,2296.05,429.197,35.7333,5.74799,'2:0 279:0 285:0 297:0 '),\n(279,'GarrensHauntGraves',0,85,85,4,10,4,2599.87,521.024,17.2769,5.97968,'2:0 278:0 280:0 281:0 '),\n(280,'GarrensHaunt',0,85,164,6,10,4,2883.52,376.589,25.8553,5.87914,'279:0 281:0 284:0 '),\n(281,'BrightwaterLake',0,85,85,1,10,4,2634.44,79.5244,31.089,6.13244,'2:0 279:0 280:0 282:0 284:0 '),\n(282,'NorthCoastE',0,85,168,7,10,4,3032.54,-341.266,5.44748,2.52746,'281:0 283:0 '),\n(283,'NorthCoastC',0,85,168,1,10,4,2935.15,41.7046,6.92148,4.82869,'282:0 284:0 '),\n(284,'NorthCoastW',0,85,168,1,10,4,2984.21,388.32,7.96326,4.49688,'280:0 281:0 283:0 '),\n(285,'ColdHearthManor',0,85,166,1,10,4,2107.98,617.879,35.0405,0.497239,'278:0 18:0 286:0 287:0 297:0 '),\n(286,'TG_hubC1',0,85,85,1,10,0,2204.7,1063.28,28.6853,4.1572,'285:0 287:0 288:0 292:0 294:0 '),\n(287,'CrusadersOutpost',0,85,85,1,10,0,1797.65,703.831,48.147,1.54771,'286:0 285:0 297:0 '),\n(288,'TH_hubNE',0,85,85,1,10,4,2446.9,1082.07,58.5203,0.911539,'286:0 289:0 292:0 293:0 294:0 '),\n(289,'AgamandMillsEntrance',0,85,157,4,10,4,2701.33,937.571,110.912,0.173269,'288:0 290:0 291:0 '),\n(290,'AgamandMillsW',0,85,157,6,10,4,2889.98,1065.92,105.434,5.38438,'289:0 291:0 '),\n(291,'AgamandMillsE',0,85,157,6,10,4,2973.71,619.932,93.8373,1.31013,'289:0 290:0 '),\n(292,'SollidenFarmstead',0,85,156,1,10,4,2329.03,1407.79,33.3337,0.622907,'286:0 288:0 293:0 294:0 '),\n(293,'CrusadersOutpost',0,85,85,1,10,4,2430.28,1585.02,37.0619,0.587566,'288:0 292:0 '),\n(294,'UndeadStartExit',0,85,85,5,10,4,2197.51,1192.39,31.5497,5.11342,'288:0 286:0 292:0 295:0 '),\n(295,'UndeadStartEnd',0,85,154,1,10,4,2061.91,1418.99,63.8379,5.30978,'294:0 83:0 4:0 296:0 '),\n(296,'UndeadStartE',0,85,154,1,10,4,1805.3,1351.42,87.1354,0.232168,'295:0 4:0 '),\n(297,'TH_exitS',0,85,85,7,12,4,1642.09,555.658,33.4922,2.88878,'278:0 285:0 287:0 298:0 '),\n(298,'ShiningStrandN',0,130,927,8,14,4,1331.69,679.903,40.5373,1.02387,'297:0 200:0 '),\n(299,'DeadField',0,130,240,8,20,4,1076.06,1545.35,28.6412,4.79771,'201:0 300:0 301:0 302:0 303:0 200:0 '),\n(300,'SkitteringDark',0,130,226,8,20,4,1271.34,1974.49,17.8502,4.31862,'299:0 301:0 '),\n(301,'NorthTidesHollow',0,130,305,8,20,4,833.25,1880.5,21.9868,5.06279,'299:0 300:0 '),\n(302,'SPF_hubC1',0,130,130,8,20,4,867.729,1518.72,35.2045,0.160734,'201:0 299:0 303:0 304:0 '),\n(303,'SPF_hubC2',0,130,130,8,20,4,934.532,1356.51,43.5579,3.0887,'201:0 299:0 302:0 200:0 305:0 '),\n(304,'SPF_hubC3',0,130,130,8,20,4,736.764,1449.26,64.4284,0.457609,'302:0 305:0 306:0 '),\n(305,'SPF_hubC4',0,130,130,8,20,4,587.903,1352.93,90.6192,0.359403,'303:0 304:0 306:0 17:0 313:0 '),\n(306,'DecrepitFerry',0,130,237,13,20,4,664.305,1021.48,45.3265,5.10911,'304:0 305:0 307:0 '),\n(307,'FenrisIsle',0,130,172,15,20,4,704.961,674.359,43.3624,1.57874,'306:0 308:0 311:0 '),\n(308,'FenrisIsleSE',0,130,172,15,20,4,653.059,335.097,35.0481,1.33722,'307:0 309:0 '),\n(309,'FenrisIsleE',0,130,232,16,20,4,866.03,78.8803,34.2361,2.23258,'308:0 310:0 '),\n(310,'DawningIsles',0,130,232,17,22,4,1199.57,370.42,34.3257,3.13185,'309:0 '),\n(311,'FenrisKeep',0,130,172,8,20,4,1013.6,734.689,59.2651,3.23986,'307:0 '),\n(312,'DeepElemMineFork',0,130,213,8,20,4,271.231,1110.33,80.2136,5.99661,'313:0 314:0 317:0 318:0 '),\n(313,'SPF_hubC5',0,130,130,8,20,4,385.877,1253.37,80.2878,0.320144,'305:0 312:0 315:0 '),\n(314,'DeepElemMine',0,130,213,8,20,4,376.82,1082.54,106.396,3.03959,'312:0 '),\n(315,'SPF_hubC6',0,130,130,8,20,4,194.263,1268.01,72.8331,6.23812,'313:0 316:0 317:0 318:0 '),\n(316,'OlsensFarthing',0,130,229,8,20,4,171.155,1487.65,114.395,4.84404,'315:0 '),\n(317,'SPF_DalaranCamp1',0,130,130,8,20,4,-50.4703,1331.43,60.9321,5.92005,'315:0 312:0 318:0 319:0 323:0 '),\n(318,'SPF_hubS1',0,130,130,8,20,4,-132.172,1170.25,63.4384,0.508657,'315:0 317:0 312:0 319:0 323:0 326:0 '),\n(319,'AmberhillEntrance',0,130,233,11,20,4,-131.822,896.74,65.831,1.54539,'317:0 318:0 320:0 321:0 323:0 325:0 '),\n(320,'AmberhillHall',0,130,233,13,20,4,-141.972,812.61,63.737,1.09457,'319:0 '),\n(321,'AmberhillFarms',0,130,233,15,20,4,88.1028,694.265,60.6053,2.4376,'322:0 319:0 '),\n(322,'AmberhillMurlocCamp',0,130,130,15,20,4,434.265,696.251,33.7837,3.19747,'321:0 '),\n(323,'SPF_hubS2',0,130,130,8,20,4,-330.828,1311.68,37.1012,1.70757,'317:0 318:0 319:0 324:0 326:0 327:0 '),\n(324,'PyrewoodVillage',0,130,204,8,20,4,-383.772,1597.45,16.8392,4.90611,'323:0 '),\n(325,'SPF_exitSE',0,130,130,15,20,4,-543.136,724.877,91.2236,0.975962,'319:0 326:0 357:0 '),\n(326,'SPF_hubS3',0,130,130,8,20,4,-503.287,1113.31,76.93,0.514545,'318:0 323:0 325:0 '),\n(327,'GreymaneWall',0,130,230,8,20,4,-744.895,1522.56,15.5245,5.84742,'323:0 '),\n(328,'DandredsFold',0,36,1682,35,40,0,1235.47,-274.821,40.3856,4.48552,'329:0 '),\n(329,'UplandsN',0,36,284,28,40,0,1085.27,-663.59,87.8456,1.24773,'328:0 330:0 '),\n(330,'UplandsS',0,36,284,28,40,0,958.693,-748.597,114.797,4.04964,'329:0 331:0 335:0 '),\n(331,'Strahnbard',0,36,280,28,40,0,683.909,-963.157,164.301,0.671641,'330:0 332:0 343:0 '),\n(332,'AM_hubE1',0,36,36,28,40,0,615.654,-1043.7,168.11,0.331968,'331:0 333:0 381:0 '),\n(333,'AM_hubE2',0,36,1684,36,42,0,640.065,-1460.93,76.3018,6.17925,'332:0 334:0 '),\n(334,'ChillwindCampRoad',0,28,3197,48,56,0,933.473,-1479.87,62.8272,3.06319,'333:0 173:0 '),\n(335,'SlaughterHollowNE',0,36,283,28,40,0,802.9,-628.854,149.733,3.01018,'330:0 336:0 337:0 '),\n(336,'SlaughterHollowN',0,36,283,28,40,0,835.191,-445.445,134.228,4.48673,'335:0 '),\n(337,'SlaughterHollowC',0,36,281,28,40,0,620.637,-522.586,179.928,5.73159,'335:0 338:0 343:0 '),\n(338,'RuinsOfAlterac',0,36,281,28,40,0,631.058,-371.491,154.481,2.42898,'340:0 337:0 339:0 '),\n(339,'RuinsOfAlteracSW',0,36,281,28,40,0,500.776,-173.116,151.449,5.19357,'340:0 338:0 341:0 '),\n(340,'RuinsOfAlteracSE',0,36,281,28,40,0,397.344,-248.661,161.727,5.94755,'338:0 339:0 '),\n(341,'RuinsOfAlteracE',0,36,281,28,40,0,573.088,-14.3215,142.366,3.66008,'339:0 342:0 '),\n(342,'RuinsOfAlteracSSW',0,36,1683,28,40,0,252.323,-82.4394,141.544,0.263228,'341:0 344:0 '),\n(343,'RuinsOfAlteracE',0,36,1357,28,40,0,493.629,-621.553,172.877,0.602885,'331:0 337:0 344:0 345:0 380:0 '),\n(344,'RuinsOfAlteracS',0,36,1683,28,40,0,141.788,-316.452,150.648,1.12125,'342:0 343:0 346:0 '),\n(345,'CorrahnsDagger',0,36,1679,28,40,0,-45.3608,-581.074,153.724,5.82187,'343:0 346:0 380:0 '),\n(346,'CorrahnsDaggerFork',0,36,1679,28,40,0,57.1052,-405.389,132.108,2.70582,'344:0 345:0 347:0 385:0 '),\n(347,'Headland',0,36,1680,28,40,0,-163.833,-293.019,151.411,0.123425,'346:0 348:0 '),\n(348,'GavinsNaze',0,36,1677,28,40,0,-63.0062,-197.056,131.24,2.72704,'347:0 349:0 350:0 355:0 '),\n(349,'GavinsNazeTop',0,36,1677,28,40,0,-125.184,-59.9939,147.694,5.63693,'348:0 350:0 '),\n(350,'GavinsNazeW',0,36,279,28,40,0,68.1015,-53.44,99.6287,3.99152,'348:0 349:0 351:0 352:0 353:0 '),\n(351,'DalaranCraterN',0,36,279,28,40,4,466.751,167.322,41.9053,3.38088,'350:0 352:0 '),\n(352,'DalaranCraterS',0,36,279,28,40,4,90.2654,237.935,43.2902,5.2894,'351:0 350:0 353:0 354:0 '),\n(353,'LordamereInternmentCamp',0,36,278,28,40,4,-90.5356,218.366,53.2755,6.11997,'352:0 350:0 354:0 '),\n(354,'HillsbradFieldsC',0,267,286,18,30,4,-499.681,78.0454,56.6165,0.278575,'352:0 353:0 356:0 355:0 '),\n(355,'HillsbradFieldsE',0,267,286,18,30,0,-437.039,-135.243,56.2029,2.13409,'354:0 356:0 348:0 385:0 '),\n(356,'HillsbradFieldsSRoad',0,267,267,18,30,0,-639.845,-98.2014,47.262,0.172558,'358:0 360:0 354:0 357:0 361:0 355:0 385:0 20:0 '),\n(357,'SouthPointTower',0,267,285,18,30,0,-637.717,273.387,63.926,4.49972,'356:0 325:0 358:0 359:0 '),\n(358,'WesternStrandW',0,267,295,18,30,0,-979.029,273.179,7.90667,5.62479,'357:0 356:0 359:0 '),\n(359,'WesternStrandSW',0,267,295,18,30,0,-1128.84,276.704,0.0000662804,5.89576,'357:0 358:0 360:0 '),\n(360,'WesternStrandS',0,267,295,18,30,0,-1156.55,7.61478,0.00000548363,6.16081,'359:0 356:0 361:0 '),\n(361,'WesternStrandS',0,267,295,18,30,0,-1102.38,-114.03,0.0000309944,0.148599,'362:0 360:0 356:0 '),\n(362,'WesternStrandE',0,267,271,18,30,0,-962.262,-506.545,2.13023,1.90396,'361:0 363:0 20:0 '),\n(363,'SouthshoreS',0,267,271,18,30,0,-974.276,-592.998,0.229758,0.372044,'362:0 364:0 20:0 '),\n(364,'EasternStrandW',0,267,294,18,30,0,-1012.85,-790.213,9.01406,5.30042,'363:0 365:0 368:0 376:0 '),\n(365,'EasternStrandC',0,267,294,18,30,0,-1183.14,-847.579,1.43171,6.18988,'364:0 366:0 '),\n(366,'EasternStrandS',0,267,294,18,30,0,-1311.64,-1052.47,18.2271,0.929683,'365:0 367:0 368:0 '),\n(367,'DunGarok',0,267,290,18,30,4,-1256.01,-1190.37,38.9786,2.03514,'366:0 368:0 376:0 '),\n(368,'DunGarokRoad',0,267,267,18,30,0,-1049.49,-1239.84,53.3175,1.75045,'364:0 366:0 367:0 369:0 373:0 '),\n(369,'HillsbradFoothillsExitSE',0,267,267,18,30,0,-784.955,-1512.45,56.6724,1.97822,'370:0 368:0 373:0 410:0 '),\n(370,'HillsbradFoothillsExitE',0,267,275,18,30,0,-594.279,-1721.03,62.3187,2.25507,'369:0 371:0 411:0 '),\n(371,'DurnholdeNE',0,267,275,18,30,0,-383.173,-1720.01,90.0634,3.41784,'372:0 370:0 '),\n(372,'DurnholdeNNE',0,267,275,18,30,0,-316.76,-1609.34,86.0559,5.49914,'371:0 377:0 386:0 '),\n(373,'DurnholdeS',0,267,267,18,30,0,-669.891,-1326.66,66.6887,5.65621,'376:0 374:0 368:0 369:0 383:0 '),\n(374,'DurnholdeInside',0,267,275,18,30,0,-518.661,-1435.16,64.889,2.5637,'373:0 375:0 '),\n(375,'DurnholdeInsideDeep',0,267,275,18,30,0,-512.473,-1541.62,67.1947,1.69387,'374:0 '),\n(376,'NethanderStead',0,267,289,18,30,0,-915.831,-926.49,31.1754,1.19711,'364:0 367:0 373:0 383:0 20:0 '),\n(377,'DurnholdeN',0,267,275,18,30,0,-298.033,-1310.71,76.9034,4.69017,'372:0 378:0 383:0 '),\n(378,'DurnholdeNN',0,267,267,18,30,0,-37.1467,-1296.59,83.7166,3.13705,'377:0 21:0 '),\n(379,'TarrenMillN',0,267,267,18,30,4,188.047,-974.547,75.5356,0.0209713,'21:0 381:0 '),\n(380,'GallowsCorner',0,36,1357,28,40,0,324.254,-615.115,145.246,3.03887,'343:0 345:0 21:0 382:0 '),\n(381,'SoferasCorner',0,36,36,28,40,0,461.934,-926.633,129.374,2.72668,'379:0 332:0 382:0 '),\n(382,'SoferasNaze',0,36,1678,28,40,0,248.314,-839.928,146.333,0.818164,'381:0 380:0 '),\n(383,'HFH_bridge',0,267,267,18,30,0,-487.607,-967.55,34.4918,4.54488,'377:0 376:0 373:0 384:0 '),\n(384,'DarrowHillE',0,267,267,18,30,0,-323.998,-672.57,54.6417,3.9048,'21:0 383:0 385:0 20:0 '),\n(385,'DarrowHillW',0,267,1056,18,30,0,-332.483,-447.42,58.4647,0.297842,'346:0 355:0 356:0 384:0 20:0 '),\n(386,'HinterlandsEntrance',0,47,47,38,50,0,-77.4076,-1845.63,143.116,2.46164,'372:0 55:0 '),\n(387,'ZunWatha',0,47,352,38,50,0,-11.9998,-2493.37,119.659,1.99629,'55:0 82:0 388:0 391:0 '),\n(388,'QuelDanilS',0,47,47,38,50,0,65.3995,-2664.2,111.823,5.20269,'55:0 82:0 387:0 389:0 390:0 391:0 392:0 '),\n(389,'QuelDanil',0,47,350,38,50,4,210.196,-2789.46,122.156,1.50935,'388:0 390:0 392:0 '),\n(390,'HL_hubW',0,47,47,38,50,0,132.208,-2876.17,116.583,1.69588,'388:0 389:0 392:0 393:0 397:0 398:0 '),\n(391,'BogensLedge',0,47,1887,38,50,0,-198.398,-2585.67,120.378,6.18051,'387:0 388:0 393:0 '),\n(392,'HiriWatha',0,47,1885,38,50,0,-35.4616,-2815.33,122.143,0.435323,'389:0 390:0 388:0 393:0 '),\n(393,'ShadraAlorEntrance',0,47,47,38,50,0,-160.179,-2955.33,115.773,1.96371,'391:0 392:0 390:0 395:0 394:0 396:0 398:0 400:0 '),\n(394,'ShadraAlorE',0,47,353,38,50,0,-366.126,-2955.41,89.39,6.27554,'393:0 395:0 396:0 '),\n(395,'ShadraAlorS',0,47,353,38,50,0,-455.461,-2839.4,105.834,6.08704,'393:0 394:0 396:0 '),\n(396,'ShadraAlorW',0,47,353,38,50,0,-296.621,-2833,96.7074,5.15045,'393:0 395:0 394:0 '),\n(397,'AgolWatha',0,47,1884,38,50,0,397.177,-3352.2,123.451,2.24644,'390:0 398:0 399:0 '),\n(398,'CreepingRun',0,47,1886,38,50,0,116.576,-3466.05,107.658,1.12922,'393:0 397:0 390:0 399:0 400:0 401:0 '),\n(399,'SkulkRock',0,47,351,38,50,0,363.014,-3796.73,171.76,1.54745,'397:0 398:0 401:0 404:0 '),\n(400,'AltarOfZul',0,47,355,38,50,0,-147.861,-3319.03,121.957,3.93113,'393:0 398:0 '),\n(401,'HL_hubC',0,47,47,38,50,0,109.926,-3922.75,136.697,0.948588,'398:0 399:0 402:0 403:0 404:0 '),\n(402,'JinthaAlor',0,47,354,38,50,0,-217.196,-4159.98,118.665,0.453769,'401:0 403:0 '),\n(403,'OverlookCliffsS',0,47,307,38,50,0,-150.233,-4250.21,120.905,4.17653,'401:0 402:0 405:0 '),\n(404,'SeradaneBridge',0,47,351,38,50,0,472.513,-3907.18,113.731,5.88677,'399:0 401:0 409:0 '),\n(405,'OverlookCliffsRampTop',0,47,307,38,50,0,-243.665,-4377.48,105.997,0.98978,'403:0 406:0 '),\n(406,'OverlookCliffsRampBottom',0,47,307,38,50,0,-3.15739,-4629.26,13.899,2.27391,'405:0 407:0 408:0 '),\n(407,'RevantuskOutside',0,47,307,38,50,0,-355.789,-4475.87,11.3783,0.924997,'406:0 179:0 '),\n(408,'OverlookCliffsEnd',0,47,307,38,50,0,133.371,-4745.73,2.05405,2.27392,'406:0 '),\n(409,'Seradane',0,47,356,60,80,0,755.958,-4011.61,92.8808,5.95432,'404:0 '),\n(410,'ArathiExitNW',0,45,334,28,40,0,-889.426,-1677.32,57.6111,1.06053,'369:0 411:0 412:0 414:0 '),\n(411,'ArathiExitN',0,45,45,28,40,0,-684.458,-1831.3,53.3946,0.936824,'370:0 410:0 412:0 413:0 '),\n(412,'ArathiCW',0,45,45,28,40,0,-863.176,-1785.9,39.6302,5.66886,'410:0 411:0 413:0 414:0 '),\n(413,'NorthfoldManor',0,45,313,28,40,0,-822.895,-2039.83,34.4558,1.25884,'411:0 412:0 415:0 '),\n(414,'Arathi_hubW',0,45,45,28,40,0,-1190.48,-1731.63,56.3674,6.26181,'410:0 412:0 415:0 420:0 '),\n(415,'NorthfoldManor',0,45,313,28,40,0,-933.512,-2120.29,56.5869,2.05011,'78:0 413:0 414:0 416:0 '),\n(416,'RefugePointeExitN',0,45,315,28,40,0,-1158.07,-2706.9,52.0215,2.18796,'78:0 22:0 415:0 417:0 418:0 419:0 435:0 '),\n(417,'DabyrieFarmstead',0,45,45,28,40,0,-1091.19,-2856.55,42.4006,1.78073,'416:0 418:0 435:0 436:0 '),\n(418,'ArathiCO',0,45,336,28,40,0,-1352.09,-2738.95,59.0948,6.08275,'416:0 417:0 419:0 431:0 432:0 435:0 '),\n(419,'RefugePointeExitS',0,45,45,28,40,0,-1466.43,-2424.6,57.8277,5.98262,'22:0 78:0 416:0 418:0 420:0 427:0 429:0 431:0 '),\n(420,'StromgardeRoad',0,45,45,28,40,0,-1323.01,-1833.39,63.6564,0.712589,'421:0 414:0 419:0 427:0 '),\n(421,'StromgardeInside',0,45,324,28,40,0,-1576.29,-1800.48,67.6512,3.46934,'422:0 423:0 424:0 420:0 '),\n(422,'StromgardeKeep',0,45,324,28,40,0,-1660.06,-1803.63,83.0724,6.27321,'421:0 426:0 '),\n(423,'StromgardeE',0,45,324,28,40,0,-1602.44,-1922.26,67.2707,1.50115,'421:0 '),\n(424,'StromgardeW1',0,45,324,28,40,0,-1596.2,-1745.56,67.3627,5.09826,'421:0 425:0 '),\n(425,'StromgardeW2',0,45,324,28,40,0,-1720.34,-1736.69,52.4064,6.26851,'424:0 81:0 '),\n(426,'StromgardeKeepSide',0,45,324,28,40,0,-1681.32,-1933.25,80.6272,1.35821,'422:0 '),\n(427,'ArathiCI',0,45,335,28,40,0,-1517.62,-2100.44,22.3405,4.92548,'419:0 420:0 428:0 '),\n(428,'ThandolRoadN',0,45,45,28,40,0,-1995.23,-2466.74,78.7992,0.837489,'427:0 429:0 441:0 '),\n(429,'ArathiRoadSmid',0,45,45,28,40,0,-1763.42,-2422.8,59.5627,0.9015,'419:0 428:0 431:0 430:0 '),\n(430,'BoulderfistHall',0,45,316,28,40,0,-1941.13,-2794.22,85.7724,0.38314,'429:0 431:0 432:0 '),\n(431,'Arathi_hubE1',0,45,45,28,40,0,-1570.23,-2675.51,35.6533,6.03014,'419:0 418:0 429:0 432:0 435:0 430:0 '),\n(432,'Arathi_hubE2',0,45,317,28,40,0,-1705.19,-3021.39,31.689,0.310091,'433:0 418:0 431:0 434:0 430:0 '),\n(433,'WitherbarkVillage',0,45,317,28,40,0,-1867.12,-3365.42,56.1179,1.07782,'432:0 '),\n(434,'GoshekFarm',0,45,314,28,40,0,-1526.14,-3075.57,14.1487,2.82925,'432:0 435:0 '),\n(435,'Arathi_hubNE1',0,45,45,28,40,0,-1297.32,-3141.76,34.9289,1.25489,'416:0 417:0 418:0 431:0 434:0 436:0 438:0 '),\n(436,'Arathi_hubNE2',0,45,45,28,40,0,-1005.91,-3313.55,55.2766,2.32737,'435:0 417:0 437:0 438:0 '),\n(437,'ArathiCE',0,45,333,28,40,0,-839.717,-3280.93,78.5616,3.98495,'436:0 438:0 '),\n(438,'HammerfallEntrance',0,45,321,28,40,0,-1164.53,-3558.81,50.1497,1.47167,'435:0 436:0 437:0 23:0 439:0 '),\n(439,'DrywhiskerGorgeOutside',0,45,318,28,40,0,-1086,-3696.31,81.3913,2.10981,'438:0 440:0 '),\n(440,'DrywhiskerGorgeEntrance',0,45,318,28,40,0,-1083.95,-3820.83,128.504,1.71515,'439:0 44:0 '),\n(441,'ArathiRoadSbottom',0,45,880,28,40,0,-2248.64,-2487.38,80.1236,4.70713,'428:0 442:0 443:0 '),\n(442,'ThandolSpanCamp',0,45,45,28,40,0,-2249.4,-2633.38,78.816,1.44851,'441:0 '),\n(443,'ThandolSpanS',0,11,881,18,30,0,-2478.16,-2506.16,78.5672,0.110205,'441:0 444:0 '),\n(444,'DunModrCamp',0,11,881,18,30,0,-2609.79,-2494.69,80.9667,1.57693,'443:0 6:0 445:0 '),\n(445,'Wetlands_hubN1',0,11,11,18,30,0,-2937.95,-2470.57,26.6988,6.13028,'444:0 446:0 447:0 461:0 462:0 '),\n(446,'DaggerforgeHill',0,11,1016,18,30,0,-2859.63,-2907.96,33.1564,1.54551,'445:0 448:0 449:0 '),\n(447,'WL_hubC1',0,11,11,18,30,0,-3206.06,-2452.65,10.0327,5.76822,'445:0 448:0 455:0 461:0 462:0 '),\n(448,'Greenwarden',0,11,1025,18,30,0,-3254.89,-2726.4,9.41813,1.21683,'446:0 447:0 449:0 455:0 458:0 '),\n(449,'WL_hubE1',0,11,11,18,30,0,-3421.46,-3088.4,22.5006,4.5862,'446:0 448:0 450:0 451:0 455:0 456:0 '),\n(450,'RaptorRidge',0,11,1017,23,30,0,-3132.51,-3240.98,63.5747,2.76015,'449:0 451:0 '),\n(451,'DragonmawGates',0,11,1038,61,70,0,-3452,-3659.86,58.5533,1.08333,'449:0 450:0 452:0 '),\n(452,'DragonmawGatesI1',0,11,1038,61,70,0,-3594.66,-4056.85,113.625,1.23963,'451:0 453:0 '),\n(453,'DragonmawGatesI2',0,11,1038,61,70,0,-3956.61,-4019.52,170.857,6.00896,'452:0 454:0 '),\n(454,'DragonmawGatesI3',0,11,1037,61,70,0,-4145.01,-3662.88,204.651,5.17056,'92:0 453:0 '),\n(455,'WL_hubS1',0,11,1020,18,30,0,-3777.35,-2817.99,12.647,0.508038,'447:0 448:0 449:0 456:0 457:0 '),\n(456,'MosshideFen',0,11,1020,18,30,0,-3913.48,-3043.47,11.7092,0.398469,'449:0 455:0 457:0 '),\n(457,'ThelgenRock',0,11,1021,18,30,0,-3921.58,-2647.27,36.3203,4.94005,'455:0 456:0 479:0 '),\n(458,'AngerfangEnampmentE',0,11,1036,18,30,0,-3503.17,-2440.43,48.2306,5.48001,'448:0 459:0 '),\n(459,'AngerfangEnampmentW',0,11,1036,18,30,0,-3354.34,-2190.82,45.3521,1.88565,'458:0 460:0 461:0 '),\n(460,'AngerfangEnampmentTop',0,11,1036,18,30,0,-3458.4,-2008.76,119.804,5.31784,'459:0 '),\n(461,'WL_hubW1',0,11,11,18,30,0,-3186.98,-2117.49,15.8054,4.81126,'445:0 447:0 459:0 462:0 463:0 467:0 '),\n(462,'IronbeardsTomb',0,11,309,18,30,0,-2861.94,-2217.72,29.2628,4.06121,'445:0 447:0 461:0 463:0 464:0 '),\n(463,'MosshideWest',0,11,11,18,30,0,-2916.55,-1848.65,10.201,4.36986,'461:0 462:0 464:0 465:0 466:0 467:0 '),\n(464,'BaradinBayN',0,11,1023,18,30,0,-2598.33,-1745.42,10.159,4.05766,'462:0 463:0 465:0 466:0 '),\n(465,'BaradinBayNW',0,11,298,18,30,0,-2723.52,-1348.51,9.75282,4.1578,'464:0 463:0 466:0 474:0 '),\n(466,'BaradinBayW',0,11,1022,18,30,0,-2951.24,-1112.1,9.14625,2.36904,'464:0 463:0 465:0 474:0 475:0 476:0 '),\n(467,'WhelgarsOutside',0,11,1024,18,30,0,-3208.01,-1693.31,8.6748,4.04314,'461:0 463:0 468:0 473:0 474:0 '),\n(468,'WhelgarsEntrance',0,11,118,18,30,0,-3328.04,-1856.79,25.9266,3.14189,'467:0 469:0 470:0 '),\n(469,'WhelgarsBottom',0,11,118,18,30,0,-3540.59,-1803.75,24.3572,5.93869,'468:0 '),\n(470,'WhelgarsRamp',0,11,118,18,30,0,-3370.49,-1931.82,63.5201,0.805329,'468:0 471:0 '),\n(471,'WhelgarsRampTop',0,11,118,18,30,0,-3471.16,-1925.52,113.829,3.80162,'470:0 472:0 '),\n(472,'WhelgarsCave',0,11,118,18,30,0,-3569.75,-1976.96,117.678,0.449137,'471:0 '),\n(473,'BlueChannelMarsh',0,11,1018,18,30,0,-3582.96,-1324.33,9.39017,5.56012,'467:0 474:0 476:0 '),\n(474,'BluegillMarsh',0,11,1022,18,30,0,-3135.95,-1301.23,7.27194,1.32132,'465:0 466:0 467:0 473:0 475:0 476:0 '),\n(475,'BaradinBayS',0,11,298,18,30,0,-3202.27,-925.946,8.88303,5.67636,'466:0 474:0 476:0 '),\n(476,'MenethilHarborRoad',0,11,1022,18,30,2,-3333.27,-1053.79,8.28482,2.51317,'11:0 466:0 473:0 474:0 475:0 '),\n(477,'MenethilBayS',0,11,298,18,30,2,-3909.27,-638.054,4.91793,5.35238,'11:0 '),\n(478,'MenethilBayN',0,11,298,18,30,2,-3732.25,-581.622,4.65228,4.77512,'11:0 '),\n(479,'DunAlgazBottom',0,11,836,18,30,0,-4086.88,-2624.69,43.3702,1.60133,'457:0 480:0 '),\n(480,'DunAlgazMid1',0,11,836,18,30,0,-4092.37,-2403.53,100.01,4.74881,'479:0 481:0 '),\n(481,'DunAlgazMid2',0,11,836,18,30,0,-3994.82,-2377.44,120.415,3.60017,'480:0 482:0 '),\n(482,'DunAlgazMid3',0,11,836,18,30,0,-4070,-2464.84,155.161,3.20551,'481:0 483:0 '),\n(483,'DunAlgazMid4',0,11,836,18,30,0,-4418.61,-2470.44,212.203,0.00303268,'482:0 5:0 484:0 '),\n(484,'DunAlgazMid5',0,11,836,18,30,0,-4453.35,-2691.02,268.159,1.48548,'483:0 485:0 '),\n(485,'DunAlgazTop',0,38,837,8,20,0,-4741.84,-2699.03,325.269,6.26389,'484:0 91:0 487:0 488:0 '),\n(486,'NorthGatePassBottom',0,38,838,8,20,2,-4797.55,-2537.41,354.11,2.07534,'91:0 524:0 '),\n(487,'SilverStreamMine',0,38,149,8,20,2,-4801.44,-2968.22,321.735,1.63004,'91:0 485:0 488:0 '),\n(488,'StonewroughDamW',0,38,146,8,20,2,-4676.63,-3184.73,310.249,2.0836,'487:0 485:0 489:0 '),\n(489,'StonewroughDamC',0,38,146,8,20,2,-4761.78,-3306.52,310.258,4.81285,'488:0 490:0 '),\n(490,'StonewroughDamE',0,38,146,8,20,2,-4680.9,-3464.1,310.208,3.57506,'489:0 491:0 '),\n(491,'TheLochNE',0,38,38,8,20,2,-4859.79,-3631.09,306.481,2.35809,'490:0 492:0 495:0 496:0 497:0 '),\n(492,'MogroshStronghold',0,38,143,8,20,2,-4884.91,-3956.61,298.791,3.26837,'491:0 493:0 494:0 495:0 '),\n(493,'MogroshStrongholdTop',0,38,143,8,20,2,-4853.52,-4046.55,315.354,1.54756,'492:0 '),\n(494,'LochModanE',0,38,38,8,20,2,-5200.93,-4080.99,324.555,1.53421,'492:0 495:0 512:0 '),\n(495,'LochModanC2',0,38,38,8,20,2,-5358.15,-3755.11,304.073,5.92655,'491:0 492:0 494:0 496:0 506:0 512:0 '),\n(496,'LochIsleE',0,38,38,8,20,2,-4983.21,-3478.31,305.5,4.76612,'491:0 495:0 497:0 498:0 '),\n(497,'LochIsleW',0,38,38,8,20,2,-4869.1,-3302.75,307.516,3.90807,'491:0 496:0 498:0 '),\n(498,'LochIsleS',0,38,38,8,20,2,-5031.68,-3316.94,298.701,5.51616,'497:0 496:0 499:0 '),\n(499,'LochC1',0,38,556,8,20,2,-5138.3,-3125.08,302.046,2.10361,'498:0 502:0 '),\n(500,'LochW1',0,38,38,8,20,2,-5067.56,-2665.82,323.188,6.27801,'91:0 501:0 502:0 '),\n(501,'LochW2',0,38,38,8,20,2,-5383.73,-2741.02,362.182,0.255963,'500:0 502:0 503:0 '),\n(502,'LochW3',0,38,38,8,20,0,-5215.01,-2861.61,336.947,0.715418,'91:0 499:0 500:0 501:0 503:0 '),\n(503,'ThelsamarEntrance',0,38,38,8,20,0,-5405.86,-2884.97,342.8,0.491581,'501:0 502:0 19:0 504:0 515:0 '),\n(504,'LochC3',0,38,144,8,20,0,-5441.5,-3109.22,349.359,0.721317,'503:0 19:0 505:0 '),\n(505,'LochS',0,38,38,8,20,0,-5860.82,-3292.84,292.88,5.93047,'504:0 506:0 621:0 '),\n(506,'IronbandsExcavationOutside',0,38,142,8,20,2,-5617.55,-3680.57,313.913,2.11697,'495:0 505:0 507:0 509:0 '),\n(507,'IronbandsExcavationSW',0,38,142,8,20,2,-5787.94,-3777.91,328.169,4.57725,'506:0 508:0 510:0 '),\n(508,'IronbandsExcavationInside1',0,38,142,8,20,2,-5722.82,-3946.06,324.917,2.02667,'507:0 509:0 '),\n(509,'IronbandsExcavationInside2',0,38,142,8,20,2,-5578.49,-3926.28,327.498,1.64379,'506:0 508:0 '),\n(510,'LochCornerSE',0,38,147,8,20,2,-5843.55,-4145.23,387.605,1.3532,'507:0 511:0 512:0 '),\n(511,'FastriderLodgeEntrance',0,38,147,8,20,2,-5555.41,-4251.75,380.644,2.87687,'510:0 512:0 513:0 '),\n(512,'LochModanSE',0,38,147,8,20,2,-5553.71,-4104.44,372.683,1.01823,'494:0 495:0 510:0 511:0 '),\n(513,'FarstriderLodge',0,38,147,8,20,2,-5621.61,-4334.97,403.763,0.951478,'511:0 514:0 '),\n(514,'FarstriderLodgeInside',0,38,147,8,20,3,-5674.26,-4247.48,407.006,5.29276,'513:0 '),\n(515,'LochModanSW1',0,38,38,8,20,2,-5673.4,-2775.82,363.022,5.89359,'503:0 516:0 519:0 '),\n(516,'StonesplinterValley1',0,38,923,8,20,2,-5878.01,-2909.13,366.788,0.558766,'515:0 517:0 518:0 '),\n(517,'StonesplinterValley2',0,38,923,8,20,2,-6057.08,-3024.86,403.365,0.541086,'516:0 '),\n(518,'StonesplinterValley3',0,38,923,8,20,2,-6077.12,-2770.04,413.566,5.71294,'516:0 '),\n(519,'LochModanSW2',0,38,924,8,20,2,-5804.6,-2605.8,316.201,6.15474,'515:0 520:0 521:0 '),\n(520,'LochModanSW3',0,38,924,8,20,2,-6029.33,-2496.11,310.016,2.1924,'519:0 561:0 '),\n(521,'SouthGatePassBottom',0,38,839,8,20,2,-5690.63,-2589.07,346.087,0.415367,'519:0 522:0 '),\n(522,'SouthGateOutpost',0,1,806,1,10,0,-5520.09,-2399.78,400.417,2.27487,'521:0 523:0 '),\n(523,'SouthGatePassTop',0,1,805,1,10,2,-5636.7,-2242.95,424.761,5.34381,'522:0 527:0 69:0 '),\n(524,'NorthGatePassTop1',0,1,808,1,10,2,-4911.88,-2330.69,408.794,5.22601,'486:0 525:0 '),\n(525,'NorthGatePassBottom2',0,1,808,1,10,2,-5204.26,-2288.4,400.984,2.97781,'524:0 526:0 '),\n(526,'NorthGatePassTop2',0,1,807,1,10,2,-5294.53,-2180,423.003,2.8011,'525:0 527:0 '),\n(527,'DunMoroghPassFork',0,1,1,1,10,2,-5515.28,-2008.17,399.376,4.60752,'526:0 523:0 528:0 '),\n(528,'DunMoroghE1',0,1,1,1,10,2,-5509.11,-1798.18,397.338,5.99176,'527:0 69:0 529:0 '),\n(529,'GolBolarFork',0,1,1,1,10,2,-5611.84,-1487.57,399.057,5.05517,'528:0 530:0 533:0 '),\n(530,'GolBolarCamp',0,1,134,1,10,2,-5711.36,-1562.28,383.568,2.84075,'529:0 531:0 '),\n(531,'GolBolarQuarry1',0,1,134,1,10,2,-5849.25,-1514.03,358.812,5.96152,'530:0 532:0 '),\n(532,'GolBolarQuarry2',0,1,134,1,10,2,-5737.17,-1683.52,362.196,6.04595,'531:0 '),\n(533,'TundridHills',0,1,804,1,10,2,-5651.13,-1033.73,410.816,4.75985,'529:0 534:0 536:0 556:0 '),\n(534,'Vagash1',0,1,1,1,10,2,-5422.73,-1195.14,450.063,2.06791,'533:0 535:0 '),\n(535,'Vagash2',0,1,803,1,10,2,-5417.7,-1264.17,446.78,2.22146,'534:0 '),\n(536,'DunMoroghS1',0,1,1,1,10,2,-5892.71,-628.276,400.121,5.26175,'533:0 537:0 '),\n(537,'DwarfGnomeStartExit1',0,1,1,1,10,2,-5975.18,-476.82,406.774,5.36188,'536:0 9:0 538:0 '),\n(538,'DwarfGnomeStartExit2',0,1,1,1,10,2,-6013.25,-224.693,412.196,4.79638,'537:0 539:0 '),\n(539,'DwarfGnomeStartExit3',0,1,800,1,10,2,-5890.34,69.4737,372.157,4.07706,'538:0 540:0 545:0 546:0 '),\n(540,'ColdridgePass1',0,1,800,1,10,2,-6066.08,42.2314,408.342,0.120498,'539:0 541:0 '),\n(541,'ColdridgePass2',0,1,800,4,10,2,-6231.65,125.6,430.753,5.63871,'540:0 542:0 '),\n(542,'DwarfGnomeStart1',0,1,132,1,10,3,-6261.08,369.552,383.537,4.94484,'541:0 1:0 543:0 544:0 '),\n(543,'DwarfGnomeStart2',0,1,132,1,10,2,-6482.65,496.244,386.328,5.80485,'542:0 544:0 '),\n(544,'DwarfGnomeStart3',0,1,132,1,10,2,-6269.69,741.137,386.893,4.77403,'542:0 543:0 '),\n(545,'GrizzledDen',0,1,136,1,10,2,-5690.95,-281.229,364.314,5.54297,'539:0 9:0 '),\n(546,'DunMoroghSW1',0,1,1,1,10,2,-5756.39,127.948,368.817,4.07511,'539:0 547:0 548:0 '),\n(547,'OldIcebeard',0,1,801,1,10,2,-5602.44,-28.5472,416.22,2.31387,'546:0 '),\n(548,'DunMoroghW1',0,1,135,1,10,2,-5661.62,365.277,393.274,4.27146,'546:0 549:0 550:0 551:0 '),\n(549,'FrostmaneHold',0,1,135,1,10,2,-5549.4,568.067,394.761,1.30462,'548:0 551:0 '),\n(550,'GnomereganS',0,1,133,1,10,2,-5183.81,585.068,404.291,4.35,'548:0 551:0 '),\n(551,'IceflowLake',0,1,211,1,10,2,-5250.86,115.774,394.041,2.85773,'548:0 549:0 550:0 552:0 555:0 '),\n(552,'ShimmerRidge1',0,1,802,1,10,2,-5266.4,-149.752,437.903,6.01894,'551:0 553:0 '),\n(553,'ShimmerRidge2',0,1,802,1,10,2,-5088.11,-166.104,442.035,0.727311,'552:0 554:0 555:0 '),\n(554,'ShimmerRidge3',0,1,802,1,10,2,-5043,-267.85,441.4,2.19994,'553:0 '),\n(555,'ShimmerRidge4',0,1,802,1,10,2,-5021.64,-132.237,411.899,3.77858,'553:0 551:0 '),\n(556,'DunmoroghC1',0,1,1,1,10,2,-5391.34,-928.482,393.467,4.06525,'533:0 557:0 '),\n(557,'IronforgeRamp',0,1,1,1,10,2,-5259.37,-493.579,386.436,3.14828,'556:0 9:0 558:0 '),\n(558,'IronforgeRampMid',0,1,809,1,10,2,-5197.66,-730.697,445.722,5.89324,'557:0 559:0 '),\n(559,'IronforgeRampTop',0,1,809,1,10,2,-5060.46,-745.984,480.27,3.47972,'558:0 8:0 '),\n(560,'IronforgeBank',0,1537,1537,1,60,3,-4909.88,-969.761,501.463,5.46481,'8:0 '),\n(561,'SGgate',0,51,1959,43,54,0,-6413.58,-2007.56,244.634,2.74852,'520:0 562:0 563:0 '),\n(562,'DustfireValleyMid',0,51,1959,43,54,0,-6590.48,-1884.27,245.713,1.74321,'561:0 580:0 585:0 '),\n(563,'SGexitE',0,51,51,43,54,0,-6906.38,-1818.59,241.661,5.89992,'561:0 564:0 566:0 593:0 '),\n(564,'GrimesiltDigSite',0,51,247,43,54,0,-7019.65,-1698.57,241.667,5.46992,'563:0 565:0 566:0 567:0 568:0 '),\n(565,'TannerCamp',0,51,1958,43,54,0,-7225.75,-1752.49,244.286,0.924438,'564:0 566:0 567:0 568:0 '),\n(566,'SGtower4',0,51,1444,43,54,0,-6980,-1505.92,242.742,3.93841,'563:0 564:0 565:0 567:0 568:0 '),\n(567,'SGtower3',0,51,1444,43,54,0,-7036.7,-1320.2,244.272,4.7631,'565:0 564:0 566:0 568:0 '),\n(568,'SGsouth1',0,51,1444,43,54,0,-7155.86,-1317.76,242.155,5.03211,'565:0 569:0 567:0 564:0 566:0 '),\n(569,'BRM_SG1',0,51,1445,43,54,0,-7215.95,-1057.94,242.73,1.72755,'571:0 568:0 570:0 572:0 573:0 '),\n(570,'BRM_SG2',0,25,25,46,60,0,-7399.25,-1106.95,278.077,0.229401,'569:0 622:0 '),\n(571,'SGwest1',0,51,51,43,54,0,-7085,-941.753,268.272,4.123,'569:0 572:0 573:0 '),\n(572,'SGtower2',0,51,51,43,54,0,-7001.07,-1109.84,243.97,2.78587,'571:0 569:0 573:0 '),\n(573,'SGwest2',0,51,51,43,54,0,-6974.99,-1007.32,241.667,3.29324,'571:0 569:0 572:0 574:0 588:0 '),\n(574,'CauldronRampTop',0,51,246,43,54,0,-6974.25,-1172.02,228.781,3.87051,'573:0 575:0 '),\n(575,'CauldronRampMid1',0,51,246,43,54,0,-7024.61,-1220.88,207.974,5.71816,'574:0 576:0 '),\n(576,'CauldronRampMid2',0,51,246,43,54,0,-6955.19,-1270.62,180.686,0.528642,'575:0 577:0 581:0 '),\n(577,'CauldronRampBottom',0,51,246,43,54,0,-6866.28,-1410.17,172.855,2.20156,'576:0 578:0 '),\n(578,'CauldronRamp2Bottom',0,51,246,43,54,0,-6712.76,-1610.77,196.339,2.17329,'577:0 579:0 '),\n(579,'CauldronRamp2Mid',0,51,246,43,54,0,-6668.28,-1664.76,229.053,1.92432,'578:0 580:0 '),\n(580,'CauldronRamp2Top',0,51,246,43,54,0,-6680,-1730.07,255.913,4.54363,'562:0 579:0 '),\n(581,'SlagPit1',0,51,1443,43,54,0,-6850.01,-1218.8,177.395,3.61294,'576:0 582:0 '),\n(582,'SlagPit2',0,51,1443,43,54,0,-6764.59,-1174.15,187.213,1.12951,'581:0 583:0 '),\n(583,'SlagPit3',0,51,1443,43,54,0,-6439.47,-1311.02,180.938,2.63197,'582:0 584:0 '),\n(584,'SlagPit4',0,51,1443,43,54,0,-6631.29,-1289.33,208.714,0.00481129,'583:0 '),\n(585,'SG_hubN1',0,51,51,43,54,0,-6686.77,-1347.22,247.961,4.79378,'562:0 586:0 588:0 589:0 '),\n(586,'CauldronTopN',0,51,246,43,54,0,-6862.1,-1188.37,240.366,5.51045,'585:0 '),\n(587,'FirewatchRidgeBottom',0,51,1442,43,54,0,-6612.66,-860.886,244.297,0.237204,'588:0 589:0 591:0 '),\n(588,'FirewatchRidgeS',0,51,1442,43,54,0,-6817.17,-866.771,248.462,4.87941,'573:0 585:0 587:0 '),\n(589,'ThoriumPointRampBottom',0,51,1442,43,54,0,-6608.41,-1025.59,244.328,1.21161,'587:0 585:0 590:0 '),\n(590,'ThoriumPointRampTop',0,51,1446,43,54,1,-6473.64,-1104.63,303.285,2.64303,'589:0 180:0 '),\n(591,'FirewatchRidgeTop1',0,51,1442,43,54,0,-6473.38,-887.709,324.088,3.80543,'587:0 592:0 '),\n(592,'FirewatchRidgeTop2',0,51,1442,43,54,0,-6502.46,-1018.74,344.372,1.2407,'591:0 '),\n(593,'SGexitEmid',0,51,51,43,54,0,-6952.2,-2064.74,282.478,5.11429,'563:0 594:0 '),\n(594,'BLexitW',0,3,3,33,45,0,-6885.86,-2233.35,242.64,0.361067,'593:0 595:0 24:0 '),\n(595,'ApocryphansRest',0,3,337,33,45,0,-6892.26,-2477.47,247.238,1.71982,'594:0 87:0 596:0 597:0 600:0 601:0 602:0 '),\n(596,'CampCaggS',0,3,344,33,45,0,-7270.91,-2407.34,268.195,5.1163,'595:0 597:0 '),\n(597,'CampCaggE',0,3,3,33,45,0,-7140.34,-2650.51,243.568,0.467924,'595:0 596:0 602:0 603:0 '),\n(598,'KargathE',0,3,3,33,45,0,-6600.53,-2373.56,254.037,0.026153,'600:0 599:0 24:0 '),\n(599,'KargathNE',0,3,3,33,45,0,-6431.02,-2454.24,321.326,3.51922,'598:0 600:0 '),\n(600,'DustbowlW',0,3,1878,33,45,0,-6718.55,-2572.24,241.801,0.471881,'595:0 598:0 599:0 601:0 602:0 '),\n(601,'DustbowlNE',0,3,1878,33,45,0,-6653.03,-2889.09,241.667,2.73974,'595:0 600:0 602:0 620:0 '),\n(602,'BL_hubC',0,3,1879,33,45,0,-6902.56,-2958.24,244.772,1.67356,'600:0 597:0 601:0 595:0 608:0 603:0 '),\n(603,'AgmondsendS',0,3,345,33,45,0,-7141.97,-3251.77,246.326,0.774282,'597:0 602:0 604:0 605:0 607:0 '),\n(604,'BL_elemsS',0,3,3,33,45,0,-7319.09,-3144.54,317.901,5.93436,'603:0 '),\n(605,'AgmondsEnd',0,3,345,33,45,0,-7033.01,-3313.39,238.277,2.5061,'603:0 606:0 607:0 609:0 '),\n(606,'BL_elemsSE',0,3,3,33,45,0,-7339.37,-3450.9,320.961,0.385524,'605:0 '),\n(607,'CampBoff',0,3,342,33,45,0,-7039.11,-3655.92,244.152,1.66966,'603:0 605:0 608:0 609:0 '),\n(608,'BL_hubN1',0,3,1877,33,45,0,-6667.51,-3285.91,241.069,2.14484,'25:0 602:0 607:0 609:0 620:0 '),\n(609,'BL_hubNE1',0,3,1898,33,45,0,-6775.23,-3555.53,245.004,5.79028,'605:0 607:0 608:0 610:0 617:0 620:0 '),\n(610,'LethlorRavineEntranceS',0,3,339,38,45,0,-6742.54,-3895.6,264.574,1.61394,'609:0 611:0 '),\n(611,'LethlorRavineS',0,3,339,38,45,0,-7002.17,-3938.58,263.889,5.47219,'610:0 612:0 '),\n(612,'LethlorRavineC',0,3,339,38,45,0,-6820.98,-4135.08,263.933,2.32276,'611:0 613:0 '),\n(613,'LethlorRavineN',0,3,339,38,45,0,-6424.74,-4106.41,263.889,3.0143,'612:0 614:0 '),\n(614,'LethlorRavineNW',0,3,339,38,45,0,-6513.4,-4004.6,264.394,5.30492,'613:0 615:0 '),\n(615,'LethlorRavineEntranceN',0,3,339,38,45,0,-6396.09,-3976.18,268.618,3.37284,'614:0 616:0 '),\n(616,'LethlorRavineExitN',0,3,1898,38,45,0,-6467.07,-3837.32,315.608,5.41801,'615:0 617:0 '),\n(617,'CampKoshS',0,3,1898,33,45,0,-6360.66,-3685.6,245.154,4.17511,'616:0 609:0 618:0 619:0 '),\n(618,'CampKosh',0,3,341,33,45,0,-6249.45,-3750.01,243.041,2.72409,'617:0 619:0 '),\n(619,'HammertoesDigsite',0,3,346,33,45,0,-6349.91,-3447.28,241.681,0.369852,'617:0 618:0 620:0 621:0 '),\n(620,'BL_hubN2',0,3,338,33,45,0,-6494.59,-3248.21,242.617,1.06886,'25:0 601:0 608:0 609:0 619:0 '),\n(621,'MakersTerrace',0,3,1897,33,45,0,-6056.99,-3302.11,258.645,3.45646,'86:0 505:0 619:0 '),\n(622,'BRM_SG3',0,25,25,46,60,0,-7496.19,-1063.83,264.543,4.72301,'570:0 623:0 628:0 '),\n(623,'BRM_chain1',0,25,25,46,60,0,-7501.48,-1151.43,269.644,1.34305,'622:0 624:0 627:0 '),\n(624,'BRM_chain2',0,25,25,46,60,0,-7599.78,-1110.62,249.93,1.94977,'623:0 625:0 '),\n(625,'BRM_chain3',0,25,25,46,60,0,-7523.43,-1048.09,180.912,0.471264,'624:0 626:0 '),\n(626,'BRM_chain4',0,25,25,46,60,0,-7383.99,-1012.09,173.658,3.00809,'625:0 '),\n(627,'BRM_BRS1',0,25,25,46,60,0,-7609.9,-1226.43,233.401,0.518375,'623:0 628:0 '),\n(628,'BRM_BS1',0,25,25,46,60,0,-7697.61,-1089.8,217.609,3.00611,'627:0 622:0 629:0 '),\n(629,'BRM_BS2',0,25,25,46,60,0,-7769.06,-1129.81,215.084,0.38328,'628:0 630:0 '),\n(630,'BRM_BS3',0,25,25,46,60,0,-7993.75,-1138.96,163.061,0.128021,'629:0 631:0 637:0 639:0 641:0 '),\n(631,'DracodarNW',0,46,2421,48,56,0,-7968.74,-817.038,131.202,4.58672,'630:0 632:0 636:0 '),\n(632,'AltarOfStormsRoad',0,46,46,48,56,0,-7803.25,-717,176.761,6.28318,'631:0 633:0 '),\n(633,'AltarOfStormsFork',0,46,255,48,56,0,-7679.67,-712.976,183.628,3.3461,'632:0 634:0 635:0 '),\n(634,'AltarOfStormsVendor',0,46,255,48,56,0,-7644.75,-636.535,200.452,4.00749,'633:0 '),\n(635,'AltarOfStorms',0,46,255,48,56,0,-7586.74,-773.071,190.859,2.70569,'633:0 '),\n(636,'DracodarW',0,46,2421,48,56,0,-8170.67,-727.141,135.21,5.81979,'631:0 637:0 '),\n(637,'DracodarS',0,46,2421,48,56,0,-8255.07,-1040.7,147.3,0.143321,'630:0 636:0 638:0 639:0 '),\n(638,'DracodarS_hill1',0,46,2421,48,56,0,-8419.15,-933.413,214.705,5.70788,'637:0 '),\n(639,'DracodarSE',0,46,46,48,56,0,-8254.03,-1168.68,144.64,0.0510463,'630:0 637:0 640:0 641:0 '),\n(640,'DracodarS_hill2',0,46,46,48,56,0,-8431.62,-1227.92,207.816,0.498725,'639:0 '),\n(641,'DracodarHub',0,46,46,48,56,0,-8073.86,-1401.78,132.05,4.03301,'630:0 639:0 642:0 644:0 645:0 '),\n(642,'BlackrockStrongholdOutside',0,46,46,48,56,0,-7757.29,-1591.7,133.263,1.43923,'641:0 643:0 644:0 646:0 '),\n(643,'BlackrockStrongholdInside',0,46,252,48,56,0,-7698.11,-1443.02,139.787,4.00159,'642:0 '),\n(644,'PillarOfAshS',0,46,46,48,56,0,-8232.79,-1737.58,147.888,6.17911,'641:0 642:0 645:0 658:0 '),\n(645,'PillarOfAshE',0,46,253,48,56,0,-8102.12,-1922.65,134.695,1.31201,'641:0 644:0 646:0 647:0 658:0 '),\n(646,'ThaurissanNW',0,46,250,48,56,0,-7704.8,-2045.32,133.437,1.61634,'642:0 645:0 139:0 647:0 648:0 '),\n(647,'DreadmaulRockW',0,46,249,48,56,0,-7971.45,-2449.46,130.882,1.47692,'646:0 645:0 648:0 652:0 654:0 658:0 659:0 660:0 '),\n(648,'DreadmaulRockNW',0,46,249,48,56,0,-7665.96,-2453.95,147.044,2.94798,'647:0 646:0 138:0 649:0 654:0 '),\n(649,'DreadmaulRockNE',0,46,249,48,56,0,-7765.85,-2707.5,172.836,1.14313,'648:0 650:0 655:0 '),\n(650,'DreadmaulRockSE',0,46,2420,48,56,0,-8161.75,-2869.02,134.8,0.000368118,'649:0 138:0 651:0 652:0 659:0 '),\n(651,'MorgansVigil',0,46,2418,48,56,0,-8379.57,-2741.96,186.492,6.13436,'650:0 652:0 659:0 '),\n(652,'DreadmaulRockTop1',0,46,249,48,56,0,-7971.64,-2664.1,198.213,2.32517,'647:0 650:0 651:0 138:0 653:0 '),\n(653,'DreadmaulRockTop2',0,46,249,48,56,0,-7873.63,-2613.13,221.072,2.92403,'652:0 '),\n(654,'DreadmaulRockNWW',0,46,249,48,56,0,-7776.13,-2493.23,160.084,5.03518,'648:0 647:0 '),\n(655,'DreadmaulRockInside1',0,46,249,48,56,0,-7848.98,-2661.75,172.955,1.73534,'649:0 656:0 657:0 '),\n(656,'DreadmaulRockInside2',0,46,249,48,56,0,-7961.48,-2603.36,173.834,6.08133,'655:0 '),\n(657,'DreadmaulRockInside3',0,46,249,48,56,0,-7975.04,-2695.45,157.958,5.80842,'655:0 '),\n(658,'DreadmaulPassW',0,46,46,48,56,0,-8216.14,-2308.1,151.442,1.03911,'644:0 645:0 647:0 659:0 '),\n(659,'DreadmaulPassN',0,46,46,48,56,0,-8150.16,-2629.44,133.659,1.18246,'647:0 650:0 651:0 658:0 660:0 '),\n(660,'DreadmaulPass',0,46,2417,48,56,0,-8431.68,-2546.4,133.207,6.07628,'647:0 659:0 661:0 '),\n(661,'RedridgeExitN',0,44,44,13,25,0,-8900,-2574.56,131.851,0.152413,'660:0 75:0 663:0 '),\n(662,'RendersRockInside',0,44,998,13,25,0,-8738.68,-2205.37,149.754,2.59501,'75:0 '),\n(663,'AlthersMillEntrance',0,44,97,13,25,0,-9153.73,-2628.6,109.561,0.156359,'661:0 664:0 690:0 '),\n(664,'RedridgeHub1',0,44,44,13,25,0,-9099.79,-2451.23,120.464,0.197585,'663:0 665:0 667:0 669:0 '),\n(665,'RedridgeBridgeN',0,44,69,13,25,2,-9287.68,-2284.47,67.5443,5.81789,'664:0 10:0 672:0 673:0 '),\n(666,'RedridgeW',0,44,44,13,25,2,-9312.11,-1873.26,82.1473,5.08747,'10:0 672:0 '),\n(667,'RedridgeCanyons1',0,44,95,13,25,2,-8916.14,-2305.07,134.682,3.96044,'664:0 668:0 670:0 '),\n(668,'RedridgeCanyons2',0,44,95,13,25,2,-8864.57,-2150.9,133.327,3.71892,'667:0 669:0 670:0 '),\n(669,'RedridgeCanyons3',0,44,69,13,25,2,-9145.97,-2198.54,119.516,4.7478,'668:0 664:0 670:0 '),\n(670,'RedridgeCanyons4',0,44,95,13,25,2,-9135.91,-2029.37,127.775,5.01877,'667:0 668:0 669:0 77:0 '),\n(671,'RethbanCavernsInside',0,44,98,13,25,0,-8826.83,-1947.01,133.091,2.11555,'77:0 '),\n(672,'RedridgeBridgeS',0,44,44,13,25,2,-9503.49,-2289.12,74.7234,1.13183,'665:0 666:0 674:0 675:0 '),\n(673,'EverstillN',0,44,68,13,25,2,-9263.45,-2458.04,56.1636,1.20646,'665:0 '),\n(674,'ThreeCorners',0,44,1002,13,25,0,-9607.09,-2055.97,65.077,4.99696,'672:0 675:0 692:0 693:0 694:0 '),\n(675,'RedridgeS1',0,44,1001,13,25,0,-9713.82,-2284.16,63.9369,5.46531,'672:0 674:0 676:0 677:0 '),\n(676,'RedridgeS2',0,44,68,13,25,0,-9620.32,-2514.61,59.4453,0.974015,'675:0 677:0 '),\n(677,'RedridgeS3',0,44,1001,13,25,0,-9624.96,-2717.09,56.3955,1.53951,'676:0 675:0 678:0 679:0 691:0 '),\n(678,'StonewatchS',0,44,70,18,25,0,-9468.55,-3007.78,135.551,1.52185,'677:0 689:0 '),\n(679,'RedridgeS4',0,44,997,13,25,0,-9751.37,-3185.18,58.6091,5.63735,'677:0 680:0 681:0 '),\n(680,'RedridgeE1',0,44,997,13,25,0,-9611,-3315.1,49.8404,2.09716,'679:0 681:0 682:0 683:0 684:0 '),\n(681,'RedridgeE2',0,44,71,13,25,0,-9499.43,-3249.9,50.6,3.02197,'679:0 680:0 '),\n(682,'RedridgeE3',0,44,44,18,25,0,-9598.71,-3503.57,121.964,2.30923,'680:0 683:0 '),\n(683,'RedridgeE4',0,44,71,18,25,0,-9465.03,-3460.8,116.076,2.91242,'680:0 682:0 74:0 684:0 '),\n(684,'RedridgeE5',0,44,71,18,25,0,-9469.61,-3328.04,5.51622,4.94268,'680:0 683:0 '),\n(685,'RedridgeNE',0,44,1000,18,25,0,-9116.4,-3271.35,104.33,2.00332,'74:0 686:0 687:0 '),\n(686,'RedridgeE6',0,44,1000,18,25,0,-9317.33,-3210.41,107.191,5.54352,'685:0 74:0 687:0 '),\n(687,'StonewatchFork',0,44,70,18,25,0,-9195.1,-3020.88,94.6252,4.57746,'686:0 685:0 688:0 689:0 690:0 '),\n(688,'StonewatchTower',0,44,999,18,25,0,-9297.56,-2958.62,128.754,5.64364,'687:0 689:0 '),\n(689,'StonewatchTop',0,44,2099,18,25,0,-9364.92,-3072.52,164.756,3.2698,'687:0 688:0 678:0 '),\n(690,'AlthersMillCenter',0,44,97,13,25,0,-9215.61,-2770.74,89.3399,4.66193,'687:0 663:0 '),\n(691,'EverstillE',0,44,44,13,25,0,-9457.68,-2870.36,85.486,2.24488,'677:0 '),\n(692,'ThreeCornersCamp1',0,44,1002,13,25,0,-9472.89,-1956.22,83.561,4.19346,'674:0 693:0 694:0 '),\n(693,'RedridgeExitW1',0,44,1002,13,25,2,-9620.34,-1809.71,51.8565,1.49408,'692:0 674:0 694:0 696:0 '),\n(694,'RedridgeExitW2',0,44,1002,13,25,0,-9831.1,-1766.69,23.8242,2.51983,'692:0 674:0 693:0 695:0 792:0 '),\n(695,'ElwynnHubS1',0,12,798,1,10,2,-9928.36,-1115.12,24.1788,6.21189,'705:0 704:0 694:0 696:0 706:0 '),\n(696,'ElwynnHubE1',0,12,12,1,10,2,-9659.48,-1341.54,48.8561,4.72993,'693:0 697:0 698:0 704:0 695:0 '),\n(697,'EastvaleLC1',0,12,88,1,10,2,-9405,-1343.43,50.0284,2.89799,'696:0 698:0 699:0 '),\n(698,'StoneCairnLakeSE',0,12,86,1,10,2,-9299.52,-1180.36,69.4951,3.31622,'696:0 697:0 699:0 701:0 797:0 '),\n(699,'StoneCairnLakeNE',0,12,86,1,10,2,-8956.22,-1264.96,77.7779,2.94511,'700:0 697:0 698:0 797:0 '),\n(700,'StoneCairnLakeNW',0,12,86,1,10,2,-8860.62,-826.796,71.9141,4.57088,'699:0 701:0 797:0 '),\n(701,'StoneCairnLakeSW',0,12,12,1,10,2,-9355.59,-802.598,64.4981,0.692979,'89:0 700:0 708:0 698:0 705:0 706:0 707:0 797:0 '),\n(702,'JasperlodeMineInside1',0,12,54,1,10,2,-9125.33,-585.357,58.3507,3.90606,'89:0 703:0 '),\n(703,'JasperlodeMineInside2',0,12,54,1,10,2,-9049.44,-618.138,53.1456,4.05725,'702:0 '),\n(704,'ElwynnHubE2',0,12,12,1,10,2,-9613.79,-1100.85,40.5009,4.62273,'696:0 705:0 695:0 '),\n(705,'ElwynnHubE3',0,12,12,1,10,2,-9618.95,-1024.81,40.4731,4.99973,'704:0 695:0 701:0 706:0 707:0 '),\n(706,'BrackwellPumpkinPatch',0,12,62,1,10,2,-9777.88,-877.924,39.5328,5.4101,'705:0 701:0 695:0 707:0 '),\n(707,'ElwynnHubC1',0,12,12,1,10,2,-9609.57,-527.364,55.1285,4.48725,'89:0 708:0 701:0 705:0 706:0 716:0 '),\n(708,'CrystalLakeE',0,12,18,1,10,2,-9464.16,-422.645,58.9952,3.63313,'89:0 701:0 707:0 709:0 '),\n(709,'CrystalLakeW',0,12,18,1,10,2,-9470.07,-173.045,59.9322,4.58858,'708:0 710:0 7:0 '),\n(710,'NorthshireExit',0,12,12,1,10,2,-9133.8,-66.2742,82.4151,1.35237,'709:0 16:0 13:0 7:0 '),\n(711,'EchoRidgeMineInside',0,12,34,1,10,2,-8560.22,-214.447,85.0045,2.95145,'70:0 '),\n(712,'TradeDistrict',0,1519,1519,1,60,3,-8794.44,645.505,94.4595,3.54245,'16:0 '),\n(713,'ForestsEdgeS',0,12,60,1,10,2,-10070.2,658.114,37.3319,5.88491,'72:0 88:0 717:0 '),\n(714,'FargodeepMineOutside',0,12,57,1,10,2,-9868.23,221.066,14.0194,6.19474,'7:0 71:0 72:0 715:0 '),\n(715,'FargodeepMineInside',0,12,57,1,10,2,-9779.25,104.966,4.57989,3.01191,'714:0 '),\n(716,'ElwynnHubS2',0,12,12,1,10,2,-9808.32,-269.092,40.0067,5.15408,'71:0 707:0 '),\n(717,'ElwynnExitW',0,12,60,1,10,2,-9747.07,741.601,25.5892,4.55914,'7:0 88:0 72:0 713:0 718:0 '),\n(718,'WestfallExitNE',0,40,916,8,20,2,-9853.3,918.261,30.2216,5.34454,'717:0 719:0 745:0 746:0 '),\n(719,'Longshore1',0,40,2,8,20,2,-9616.19,1059.16,5.79699,0.013632,'720:0 718:0 745:0 '),\n(720,'Longshore2',0,40,2,8,20,2,-9634.2,1389.29,9.09694,4.71817,'719:0 721:0 '),\n(721,'Longshore3',0,40,2,8,20,2,-9648.12,1575.23,3.54258,4.75547,'720:0 722:0 '),\n(722,'Longshore4',0,40,2,8,20,2,-9776.1,1654.24,11.5179,2.15188,'721:0 723:0 742:0 743:0 '),\n(723,'Longshore5',0,40,2,8,20,2,-9985.75,1913.6,4.86301,5.35756,'722:0 724:0 742:0 '),\n(724,'Longshore6',0,40,2,8,20,2,-10334,2061.94,3.69692,5.05125,'723:0 725:0 739:0 '),\n(725,'Longshore7',0,40,2,8,20,2,-10695.4,2102.07,8.28685,6.14098,'724:0 726:0 738:0 '),\n(726,'Longshore8',0,40,2,8,20,2,-10975.2,2108.77,-0.213533,6.27058,'725:0 727:0 737:0 '),\n(727,'Longshore9',0,40,2,8,20,2,-11307.8,1926.18,9.26031,4.25015,'726:0 728:0 '),\n(728,'Longshore10',0,40,2,8,20,2,-11466.2,1725.82,8.61195,0.641238,'727:0 729:0 '),\n(729,'DaggerHillsW',0,40,920,8,20,2,-11264.1,1714.56,39.9062,4.76851,'728:0 730:0 737:0 '),\n(730,'DaggerHillsC1',0,40,920,8,20,2,-11258.8,1470.77,88.9353,4.93148,'729:0 731:0 '),\n(731,'DaggerHillsC2',0,40,920,8,20,2,-11211.1,1297.89,91.1699,1.90966,'730:0 732:0 733:0 '),\n(732,'DaggerHillsNook',0,40,920,8,20,2,-11235.2,1182.36,91.6522,1.1871,'731:0 733:0 '),\n(733,'DaggerHillsE',0,40,920,8,20,2,-11062.7,1163.02,43.0261,2.75789,'736:0 732:0 731:0 734:0 735:0 750:0 '),\n(734,'DustPlains',0,40,922,8,20,2,-11152,739.176,32.5228,1.40505,'733:0 735:0 750:0 '),\n(735,'DeadAcre',0,40,917,8,20,2,-10770.8,864.294,33.1505,2.913,'736:0 733:0 734:0 746:0 750:0 '),\n(736,'WestfallHubC1',0,40,40,8,20,2,-10842.5,1196.94,34.875,1.14192,'12:0 15:0 735:0 733:0 738:0 741:0 750:0 '),\n(737,'DemontsPlace',0,40,921,8,20,2,-11087.9,1894.97,35.4372,5.06105,'726:0 729:0 12:0 738:0 '),\n(738,'AlexstonFarmstead',0,40,219,8,20,2,-10615,1671.77,41.41,4.1441,'737:0 725:0 12:0 741:0 742:0 736:0 '),\n(739,'GoldCoastQuarry',0,40,113,8,20,2,-10403.7,1909.99,9.96272,4.64675,'724:0 740:0 741:0 '),\n(740,'GoldCoastQuarryInside',0,40,113,8,20,2,-10575.3,1990.25,-8.03668,3.01509,'739:0 '),\n(741,'WestfallHubC2',0,40,40,8,20,2,-10495.4,1349.24,42.6842,1.76042,'738:0 739:0 15:0 742:0 745:0 736:0 '),\n(742,'WestfallHubC3',0,40,918,8,20,2,-10274.9,1408.84,38.9079,3.90454,'741:0 738:0 723:0 722:0 15:0 743:0 745:0 '),\n(743,'JangolodeMine',0,40,111,8,20,2,-10017,1466.37,41.0745,6.08639,'742:0 722:0 744:0 745:0 '),\n(744,'JangolodeMineInside',0,40,111,8,20,2,-9887.11,1427.15,40.0346,0.896887,'743:0 '),\n(745,'SaldeansFarm',0,40,107,8,20,2,-10154.1,1116.55,36.8816,1.65283,'15:0 718:0 719:0 741:0 742:0 743:0 746:0 '),\n(746,'WestfallHubE1',0,40,40,8,20,2,-10333.7,859.579,39.774,0.563072,'15:0 718:0 735:0 745:0 752:0 '),\n(747,'DefiasHideout',0,1581,1581,15,22,2,-11112,1483.69,32.39,3.56723,'12:0 748:0 '),\n(748,'Deadmines1',0,1581,1581,15,22,2,-11252.8,1533.82,28.6803,0.814416,'747:0 749:0 '),\n(749,'Deadmines2',0,1581,1581,15,22,2,-11214.4,1638.37,27.2613,1.55073,'748:0 '),\n(750,'WestfallExitSE',0,40,40,8,20,2,-10870.3,667.353,30.8385,4.48578,'733:0 734:0 735:0 736:0 15:0 751:0 '),\n(751,'DuskwoodExitW',0,10,10,18,30,0,-10857.5,557.367,30.4883,6.27453,'750:0 752:0 14:0 753:0 755:0 '),\n(752,'HushedBankN',0,10,1097,18,30,0,-10326.3,623.959,26.42,3.17024,'746:0 751:0 757:0 758:0 763:0 '),\n(753,'AddlesSteadW',0,10,536,18,30,0,-11054.9,270.776,25.2035,6.01338,'751:0 14:0 754:0 '),\n(754,'AddlesSteadE',0,10,536,18,30,0,-10997.4,179.443,30.4059,1.04377,'753:0 14:0 766:0 '),\n(755,'RHCemetaryS',0,10,492,18,30,0,-10587.6,294.965,31.0441,0.0129175,'751:0 14:0 756:0 757:0 765:0 766:0 '),\n(756,'RHCemetaryNE',0,10,492,24,30,0,-10398,201.223,34.2462,5.21064,'755:0 757:0 758:0 762:0 764:0 765:0 '),\n(757,'RHCemetaryW',0,10,492,22,30,0,-10427.4,409.679,46.6267,4.40525,'752:0 755:0 756:0 758:0 759:0 '),\n(758,'RHCemetaryN',0,10,243,24,30,0,-10308.2,348.036,59.693,3.07006,'752:0 757:0 756:0 '),\n(759,'DawningWoodCatacombs1',0,10,2098,18,30,0,-10261.5,383.964,10.414,2.92673,'757:0 760:0 '),\n(760,'DawningWoodCatacombs2',0,10,2098,18,30,0,-10234.6,284.99,2.79944,4.82935,'759:0 761:0 '),\n(761,'DawningWoodCatacombs3',0,10,2098,18,30,0,-10220.1,166.144,0.047382,3.23144,'760:0 762:0 '),\n(762,'DawningWoodCatacombs4',0,10,2098,18,30,0,-10338.4,136.513,4.82896,0.380849,'756:0 761:0 '),\n(763,'DuskwoodNW1',0,10,799,18,30,0,-10173.2,350.099,32.3759,4.62356,'752:0 764:0 '),\n(764,'DuskwoodNW2',0,10,799,18,30,0,-10183.8,-55.3832,27.6626,5.67208,'763:0 756:0 765:0 793:0 '),\n(765,'DuskwoodC1',0,10,10,18,30,0,-10482,-16.5716,51.5694,0.81242,'764:0 755:0 756:0 766:0 '),\n(766,'DuskwoodC2',0,10,10,18,30,0,-10750.8,67.4617,28.3337,1.80202,'765:0 755:0 14:0 754:0 767:0 '),\n(767,'DuskwoodC3',0,10,10,18,30,0,-10910.1,-371.894,39.8351,3.06651,'766:0 768:0 769:0 773:0 774:0 775:0 779:0 795:0 '),\n(768,'DuskwoodExitS',0,10,10,18,30,0,-11268.2,-368.936,61.3823,6.14723,'767:0 858:0 '),\n(769,'VulGolOgreMound1',0,10,93,24,30,0,-11005.9,-176.407,14.5532,5.12818,'767:0 770:0 771:0 '),\n(770,'VulGolOgreMound2',0,10,93,24,30,0,-10959.3,-38.5543,13.6432,4.44096,'769:0 771:0 '),\n(771,'VulGolOgreMound3',0,10,93,24,30,0,-11083.6,-80.7448,16.7954,5.39522,'769:0 770:0 772:0 '),\n(772,'VulGolOgreMoundInside',0,10,93,24,30,0,-11234.1,-172.07,4.22438,4.5174,'771:0 '),\n(773,'YorgenFarmsteadW',0,10,245,24,30,0,-11096.9,-452.028,32.1764,4.54422,'767:0 774:0 '),\n(774,'YorgenFarmsteadE',0,10,245,24,30,0,-11052.8,-598.054,29.3447,1.47723,'767:0 773:0 776:0 '),\n(775,'DuskwoodC4',0,10,10,18,30,0,-10908,-739.892,54.8364,0.583838,'767:0 776:0 778:0 779:0 '),\n(776,'RottingOrchardW',0,10,241,18,30,0,-10986.3,-770.892,55.1122,1.55183,'774:0 775:0 777:0 778:0 '),\n(777,'RottingOrchardS',0,10,241,18,30,0,-11103.5,-891.729,62.1149,0.69773,'776:0 778:0 '),\n(778,'DuskwoodC5',0,10,10,18,30,0,-10823,-837.935,55.75,1.63037,'775:0 776:0 777:0 779:0 780:0 '),\n(779,'DuskwoodC6',0,10,10,18,30,0,-10768,-644.008,42.2621,2.90859,'767:0 775:0 778:0 786:0 '),\n(780,'DuskwoodE1',0,10,42,18,30,0,-10757.1,-1156.72,24.9918,1.69202,'778:0 124:0 782:0 783:0 '),\n(781,'RolandsDoomInside',0,10,2161,24,30,0,-11157.5,-1167.04,42.5151,0.315576,'124:0 '),\n(782,'TranquilGardensCemetery',0,10,121,18,30,0,-11023.4,-1315.7,53.1833,6.14911,'780:0 783:0 '),\n(783,'DuskwoodE2',0,10,10,18,30,0,-10813.8,-1366.37,42.2527,0.00140238,'780:0 782:0 3:0 784:0 794:0 '),\n(784,'DarkshireExitE',0,10,10,18,30,0,-10539.7,-1338.09,48.0906,1.65268,'785:0 783:0 3:0 '),\n(785,'DuskwoodExitE',0,10,10,18,30,0,-10442.9,-1486.98,73.8977,5.13748,'784:0 798:0 '),\n(786,'DuskwoodC7',0,10,242,24,30,0,-10451.9,-825.607,50.4132,2.61635,'779:0 787:0 788:0 793:0 '),\n(787,'DuskwoodC8',0,10,242,24,30,0,-10647.9,-908.344,50.934,5.93661,'786:0 3:0 788:0 '),\n(788,'DuskwoodNE1',0,10,242,18,30,0,-10219.2,-1021.98,31.9202,2.92658,'786:0 787:0 3:0 789:0 790:0 793:0 '),\n(789,'ManorMismantle',0,10,1098,24,30,0,-10332.7,-1264.03,35.3024,1.53643,'788:0 3:0 790:0 '),\n(790,'DuskwoodNE2',0,10,10,18,30,0,-10181.4,-1145.35,24.304,3.28393,'788:0 789:0 791:0 793:0 '),\n(791,'DuskwoodNE3',0,10,10,18,30,0,-10067.1,-1379.68,29.9246,1.99195,'790:0 792:0 '),\n(792,'DuskwoodExitNE',0,10,10,18,30,0,-9963.01,-1637.21,27.2574,2.08816,'694:0 791:0 '),\n(793,'DuskwoodN',0,10,799,18,30,0,-10020.5,-660.012,39.1578,1.66406,'790:0 788:0 764:0 786:0 '),\n(794,'Naraxis',0,10,10,18,30,0,-10619.4,-1502.44,90.534,3.1465,'783:0 '),\n(795,'TwilightGroveEntrance',0,10,10,50,60,0,-10718.7,-425.681,126.691,0.442773,'767:0 796:0 '),\n(796,'TwilightGrove',0,10,856,50,60,0,-10419.3,-421.597,45.6561,3.03852,'795:0 '),\n(797,'HeroesVigil',0,12,56,1,10,0,-9101.04,-1034.1,72.9837,5.20227,'698:0 699:0 700:0 701:0 '),\n(798,'DWPExitW',0,41,2697,50,60,0,-10464.2,-1734.78,86.7801,1.49361,'785:0 171:0 802:0 '),\n(799,'DeadwindRavineSW',0,41,2558,50,60,0,-10919.4,-1957.74,114.777,4.67839,'171:0 800:0 '),\n(800,'TheViceW',0,41,2561,50,60,0,-10843.3,-2118.87,121.161,1.51324,'799:0 172:0 79:0 '),\n(801,'DWPExitE',0,41,2938,50,60,0,-10593.5,-2125.78,90.9212,3.83802,'172:0 170:0 802:0 811:0 '),\n(802,'DeadsmansCrossingE',0,41,41,50,60,0,-10437,-2037.61,94.6245,1.59492,'798:0 801:0 810:0 '),\n(803,'GroshgokCompoundInside',0,41,2937,50,60,0,-11169.4,-2483.11,105.139,0.944598,'79:0 '),\n(804,'KarazhanOutskirts',0,41,2562,50,60,0,-11148.9,-2130,55.9803,1.2403,'79:0 805:0 806:0 '),\n(805,'Karazhan',0,41,2562,50,60,0,-11115.2,-2008.72,48.4017,4.31317,'804:0 806:0 '),\n(806,'KarazhanCellarEntrance',0,41,2837,50,60,0,-11173.4,-2033.69,47.0759,0.798522,'804:0 805:0 807:0 '),\n(807,'KarazhanCellar1',0,41,2837,50,60,0,-11100.4,-1963.77,1.93936,4.49657,'806:0 808:0 '),\n(808,'KarazhanCellar2',0,41,2837,50,60,0,-11159.5,-1898.41,-17.7918,6.21463,'807:0 809:0 '),\n(809,'KarazhanCellar3',0,41,2837,50,60,0,-11033.9,-1910.04,-32.9889,4.98353,'808:0 '),\n(810,'DeadmansCrossingBottom',0,41,41,50,60,0,-10282.6,-2019.49,51.0186,2.21028,'802:0 '),\n(811,'SSExitW',0,8,8,33,45,0,-10546.2,-2376.39,84.2413,1.87648,'801:0 812:0 '),\n(812,'SSW1',0,8,8,33,45,0,-10381.8,-2424.26,52.7345,2.75809,'811:0 813:0 '),\n(813,'SSW2',0,8,8,33,45,0,-10427.8,-2549.06,24.1947,5.68762,'812:0 814:0 830:0 '),\n(814,'IthariusCaveOutside',0,8,1777,33,45,0,-10561.3,-2508.68,22.0709,5.83489,'813:0 815:0 816:0 '),\n(815,'IthariusCave',0,8,1777,33,45,0,-10677.4,-2531.21,28.912,6.2649,'814:0 '),\n(816,'SSCRW1',0,8,1780,33,45,0,-10387.5,-2710.03,21.6778,1.56036,'814:0 817:0 818:0 819:0 830:0 '),\n(817,'MistyValley',0,8,116,33,45,0,-10110,-2413.91,29.9136,4.35049,'816:0 818:0 '),\n(818,'SSW3',0,8,8,33,45,0,-10320.4,-2794.27,21.9908,1.07734,'817:0 816:0 819:0 820:0 829:0 830:0 '),\n(819,'Harborage',0,8,657,33,45,3,-10113,-2807.71,22.1444,3.06047,'818:0 816:0 820:0 829:0 '),\n(820,'SSN1',0,8,1798,33,45,0,-10099.4,-3266.23,20.4381,1.58785,'818:0 819:0 821:0 827:0 828:0 829:0 '),\n(821,'SSN2',0,8,76,33,45,0,-9974.74,-3687.45,21.6788,2.09247,'820:0 822:0 823:0 827:0 828:0 829:0 '),\n(822,'SSNE1',0,8,2403,33,45,0,-9634.53,-3969.85,0.0000146627,2.75613,'821:0 823:0 '),\n(823,'SSNE2',0,8,300,33,45,0,-10034.8,-4306.49,1.78832,0.101491,'822:0 821:0 824:0 826:0 827:0 '),\n(824,'SSE',0,8,300,33,45,0,-10512,-4371.71,6.04597,6.27469,'823:0 825:0 80:0 826:0 827:0 '),\n(825,'SSSE',0,8,300,33,45,0,-11038.3,-4116.28,1.98503,5.82703,'186:0 824:0 80:0 '),\n(826,'PoolOfTearsE',0,8,1778,33,45,0,-10444.5,-4087.57,23.9872,1.47592,'80:0 186:0 823:0 824:0 827:0 '),\n(827,'PoolOfTearsN',0,8,8,33,45,0,-10147.3,-3802.05,22.1649,2.27113,'820:0 821:0 823:0 824:0 826:0 828:0 829:0 '),\n(828,'PoolOfTearsW',0,8,8,33,45,0,-10377.4,-3577.61,22.0023,3.94206,'820:0 821:0 827:0 80:0 51:0 829:0 '),\n(829,'SSC',0,8,1798,33,45,0,-10292.9,-3192.2,22.1489,5.69742,'818:0 819:0 820:0 821:0 827:0 828:0 51:0 830:0 '),\n(830,'SSExitS',0,8,8,33,45,0,-10553.9,-3043.33,24.794,0.0857489,'813:0 816:0 818:0 829:0 51:0 831:0 '),\n(831,'SSExitSS',0,4,4,43,54,0,-10690.8,-2978.8,37.8508,5.87412,'830:0 834:0 '),\n(832,'StagalbogInside1',0,8,1817,33,45,0,-10966.8,-3697.03,11.0105,4.21105,'80:0 833:0 '),\n(833,'StagalbogInside2',0,8,1817,33,45,0,-10894.6,-3613.42,16.0499,6.1176,'832:0 '),\n(834,'BLExitN',0,4,4,43,54,0,-10811.4,-2992.21,41.134,0.16765,'831:0 835:0 839:0 846:0 '),\n(835,'BLNW1',0,4,1437,43,54,0,-11009.6,-2785.5,4.70615,5.63206,'834:0 836:0 839:0 840:0 '),\n(836,'DreadmaulHoldEntrance',0,4,1437,43,54,0,-10916.9,-2714.76,7.63624,3.85903,'835:0 837:0 838:0 '),\n(837,'DreadmaulHoldRight',0,4,1437,43,54,0,-10814.2,-2705.35,8.14439,3.20125,'836:0 838:0 '),\n(838,'DreadmaulHoldLeft',0,4,1437,43,54,0,-10859.8,-2615.61,8.07541,4.52661,'836:0 837:0 '),\n(839,'BLNW2',0,4,4,43,54,0,-11080.5,-2903.3,9.18506,0.371865,'835:0 834:0 196:0 '),\n(840,'BLW1',0,4,4,43,54,0,-11249.1,-2724.95,13.3527,2.49675,'835:0 841:0 842:0 '),\n(841,'DreadmaulPost',0,4,1439,43,54,0,-11528.8,-2858.71,8.50437,6.19557,'840:0 196:0 842:0 856:0 '),\n(842,'BLAltarOfStormsBottom',0,4,4,43,54,0,-11501.6,-2718.85,5.65372,0.900431,'840:0 841:0 843:0 856:0 '),\n(843,'BLAltarOfStormsMid',0,4,4,47,54,0,-11381.5,-2566.03,75.8033,3.74358,'842:0 844:0 '),\n(844,'BLAltarOfStormsTop',0,4,1441,47,54,0,-11255.9,-2556.41,97.0494,2.9896,'843:0 '),\n(845,'BLE1',0,4,4,43,54,0,-11149.6,-3232.6,8.07553,2.30354,'196:0 846:0 850:0 '),\n(846,'NethergardeOutside',0,4,1438,43,54,0,-10961.7,-3200.5,45.5708,0.954623,'834:0 845:0 847:0 '),\n(847,'NethergardeInside1',0,4,1438,43,54,2,-11008.9,-3340.48,64.7225,4.78147,'846:0 848:0 '),\n(848,'NethergardeInside2',0,4,1438,43,54,3,-10993.2,-3453.24,64.8707,3.21459,'847:0 849:0 '),\n(849,'NethergardeInside3',0,4,1438,43,54,2,-11112.2,-3438.11,79.0946,6.1402,'848:0 '),\n(850,'BLE2',0,4,1440,43,54,0,-11310.9,-3410.18,7.46828,4.16649,'845:0 851:0 852:0 '),\n(851,'BLE2Inside',0,4,1440,43,54,0,-11225.8,-3486.48,8.69295,2.17551,'850:0 '),\n(852,'BLE3',0,4,4,43,54,0,-11438.8,-3304.34,7.30604,5.76674,'196:0 850:0 853:0 854:0 '),\n(853,'BLSE',0,4,72,43,54,0,-11632.5,-3381.23,14.577,0.215935,'852:0 854:0 855:0 '),\n(854,'BLS1',0,4,4,43,54,0,-11607.8,-3099.85,7.81021,5.30924,'196:0 852:0 853:0 855:0 '),\n(855,'BLS2',0,4,72,43,54,0,-11765.8,-2959.84,7.91609,5.25623,'853:0 854:0 856:0 '),\n(856,'BLS3',0,4,4,43,54,0,-11716.6,-2785.99,8.27783,3.20635,'855:0 841:0 842:0 857:0 '),\n(857,'TaintedScar1',0,4,73,55,60,0,-11907.8,-2658.64,-2.15637,5.48008,'856:0 '),\n(858,'SVExitN',0,33,33,33,45,0,-11362.1,-380.82,64.9035,0.170793,'768:0 859:0 '),\n(859,'SVExitNFork',0,33,33,33,45,0,-11397.1,-284.376,58.1739,3.29667,'858:0 860:0 861:0 '),\n(860,'RebelCamp',0,33,99,33,45,3,-11314.2,-182.813,75.1397,3.66777,'859:0 '),\n(861,'SVEntranceN',0,33,33,33,45,0,-11511.9,-302.586,38.7986,0.353382,'859:0 863:0 864:0 862:0 '),\n(862,'NesingwarysExpeditionCamp',0,33,100,33,45,0,-11616,-50.0157,10.9823,4.49439,'861:0 879:0 880:0 881:0 901:0 902:0 907:0 '),\n(863,'SVNBridge1N',0,33,33,33,45,0,-11604.1,-282.333,37.221,5.64107,'861:0 879:0 '),\n(864,'SVNHubN1',0,33,33,33,45,0,-11643.7,-473.703,17.1608,0.3141,'861:0 865:0 873:0 '),\n(865,'KurzensCompound',0,33,101,33,45,0,-11604,-644.056,29.157,3.77181,'864:0 866:0 872:0 '),\n(866,'TheStockpile1',0,33,106,33,45,0,-11461.5,-750.28,30.6105,4.24893,'865:0 867:0 '),\n(867,'TheStockpile2',0,33,106,33,45,0,-11514.8,-845.839,22.0076,3.08261,'866:0 868:0 869:0 '),\n(868,'TheStockpile3',0,33,106,33,45,0,-11418.4,-794.929,14.9653,3.89354,'867:0 '),\n(869,'TheStockpile4',0,33,106,33,45,0,-11506.4,-946.763,29.2275,0.414209,'867:0 870:0 '),\n(870,'TheStockpile5',0,33,106,33,45,0,-11406.8,-896.737,18.0813,0.89682,'869:0 871:0 '),\n(871,'TheStockpile6',0,33,106,33,45,0,-11337.1,-985.396,27.3203,1.9202,'870:0 '),\n(872,'SVNHubN2',0,33,33,33,45,0,-11729.7,-799.127,29.6214,0.89486,'865:0 873:0 875:0 913:0 '),\n(873,'VentureCoBaseCamp',0,33,1760,33,45,0,-11959.6,-531.751,11.3978,5.11834,'872:0 864:0 874:0 875:0 913:0 '),\n(874,'SVNHub1',0,33,33,33,45,0,-12225,-546.002,28.8839,0.0407319,'873:0 875:0 911:0 913:0 915:0 '),\n(875,'SVE1',0,33,33,33,45,0,-12149.1,-965.968,32.4681,1.43677,'872:0 873:0 874:0 876:0 878:0 913:0 '),\n(876,'MoshoggOgreMound',0,33,105,33,45,0,-12352.7,-972.262,13.1171,5.38338,'875:0 877:0 878:0 913:0 '),\n(877,'MoshoggOgreMoundInside',0,33,105,33,45,0,-12364,-1147.48,0.104103,2.92311,'876:0 '),\n(878,'MoshoggOgreMoundUpper',0,33,105,33,45,0,-12466.5,-881.644,39.1084,5.72306,'875:0 876:0 914:0 918:0 '),\n(879,'SVNBridge1C',0,33,33,33,45,0,-11710.1,-210.005,39.5643,5.90174,'863:0 880:0 862:0 '),\n(880,'SVNBridge1S',0,33,33,33,45,0,-11818.3,-43.4252,39.7487,5.27146,'879:0 862:0 903:0 905:0 907:0 '),\n(881,'SVNHubW1',0,33,33,33,45,0,-11518.9,255.102,25.1192,4.23669,'862:0 882:0 883:0 901:0 '),\n(882,'SVNHubW2',0,33,33,33,45,0,-11502.5,373.117,53.2392,3.3217,'881:0 883:0 '),\n(883,'ZulKundaNE',0,33,33,33,45,0,-11650.7,401.397,42.8581,5.68183,'881:0 882:0 884:0 889:0 890:0 '),\n(884,'ZulKundaE',0,33,33,33,45,0,-11785.5,436.17,47.4037,6.2807,'883:0 885:0 889:0 899:0 '),\n(885,'ZulKundaSE',0,33,33,33,45,0,-11863.3,560.263,47.0214,5.06137,'884:0 886:0 887:0 889:0 '),\n(886,'ZulKundaS',0,33,33,33,45,0,-11831.5,711.922,45.1329,4.4252,'885:0 888:0 '),\n(887,'SavageCoastNW1',0,33,301,33,45,0,-11924.1,793.032,3.06387,4.97496,'885:0 894:0 185:0 897:0 898:0 '),\n(888,'ZulKunda1',0,33,102,33,45,0,-11690.4,742.837,49.7495,3.41987,'886:0 889:0 891:0 '),\n(889,'ZulKunda2',0,33,102,33,45,0,-11694.8,565.959,49.7011,1.34053,'883:0 884:0 885:0 888:0 890:0 891:0 '),\n(890,'ZulKunda3',0,33,102,33,45,0,-11550.4,601.183,50.5784,3.11945,'883:0 889:0 891:0 '),\n(891,'ZulKunda4',0,33,102,33,45,0,-11622.9,760.15,39.7329,0.007312,'888:0 889:0 890:0 892:0 893:0 '),\n(892,'ZulKunda5',0,33,102,33,45,0,-11528.7,724.898,59.4101,3.50037,'891:0 '),\n(893,'ZulKundaW',0,33,122,33,45,0,-11572.6,840.524,8.14386,2.72086,'891:0 894:0 '),\n(894,'SavageCoastNW2',0,33,122,33,45,0,-11692.5,954.651,3.70656,5.00441,'893:0 887:0 185:0 897:0 '),\n(895,'YojambaIsleW',0,33,3357,33,45,0,-11810.6,1364.62,0.0261903,4.46053,'185:0 '),\n(896,'YojambaIsleN',0,33,3357,33,45,0,-11748.3,1318.44,5.22585,2.37531,'185:0 '),\n(897,'VileReefIsle',0,33,301,33,45,0,-12154.2,871.091,18.6659,5.996,'894:0 887:0 '),\n(898,'SavageCoastW1',0,33,301,33,45,0,-12016.1,440.588,3.35169,0.661185,'887:0 899:0 900:0 '),\n(899,'SVNWHub1',0,33,33,33,45,0,-11888.7,290.463,12.6077,0.998902,'898:0 884:0 900:0 901:0 902:0 903:0 '),\n(900,'SavageCoastW2',0,33,33,33,45,0,-12196.8,238.239,2.19021,4.81004,'898:0 899:0 904:0 37:0 '),\n(901,'SVNHunW3',0,33,100,33,45,0,-11656.6,59.5536,17.3151,1.50941,'899:0 881:0 862:0 902:0 '),\n(902,'TkashiRuins',0,33,126,33,45,0,-11843.2,59.0602,14.1655,3.34528,'899:0 901:0 862:0 903:0 905:0 '),\n(903,'KalaiRuins',0,33,125,33,45,0,-12069.3,66.3927,-5.18214,3.5436,'902:0 899:0 880:0 904:0 906:0 '),\n(904,'SVNHub2',0,33,33,33,45,0,-12283.3,28.601,18.2879,0.246879,'903:0 900:0 37:0 912:0 '),\n(905,'SVNBridge2N',0,33,33,33,45,0,-11907.9,-50.0313,39.7259,0.870484,'902:0 880:0 906:0 907:0 '),\n(906,'SVNBridge2S',0,33,33,33,45,0,-12090.1,-139.679,35.2928,0.399245,'903:0 905:0 910:0 '),\n(907,'SVCHub1',0,33,33,33,45,0,-11853.5,-167.599,15.3333,0.51312,'862:0 880:0 905:0 '),\n(908,'SavageCoastW3',0,33,301,33,45,0,-12543.1,74.9728,0.873061,0.513523,'37:0 912:0 '),\n(909,'SavageCoastW4',0,33,1578,33,45,0,-12691.2,142.464,3.092,5.80512,'921:0 924:0 925:0 936:0 '),\n(910,'SVNBridge3W',0,33,33,33,45,0,-12171.4,-240.719,29.8621,0.766786,'906:0 911:0 912:0 '),\n(911,'SVNBridge3E',0,33,33,33,45,0,-12157.4,-431.52,30.3485,1.45204,'874:0 910:0 913:0 '),\n(912,'MizjahRuins',0,33,129,33,45,0,-12468.7,-147.093,13.8431,5.95827,'904:0 908:0 910:0 916:0 '),\n(913,'SVNHub3',0,33,1740,33,45,0,-12127.6,-649.027,14.8876,2.30225,'874:0 876:0 911:0 873:0 875:0 872:0 '),\n(914,'BaliamahRuins',0,33,127,33,45,0,-12540.7,-734.478,39.4424,6.20568,'878:0 915:0 917:0 918:0 '),\n(915,'SVNHub4',0,33,33,33,45,0,-12417,-580.502,11.0755,6.10556,'914:0 874:0 916:0 '),\n(916,'SVNHub5',0,33,33,33,45,0,-12522,-370.721,12.7107,0.882666,'912:0 915:0 917:0 921:0 '),\n(917,'ZiatajaiRuins',0,33,128,33,45,0,-12701.1,-464.07,30.0552,6.19787,'914:0 916:0 918:0 920:0 '),\n(918,'ZulMamweN',0,33,33,33,45,0,-12776.9,-784.489,63.0348,0.421265,'878:0 914:0 917:0 919:0 '),\n(919,'ZulMamweC',0,33,103,33,45,0,-12985.7,-833.459,69.9343,0.193503,'918:0 920:0 '),\n(920,'ZulMamweW',0,33,103,33,45,0,-12943.6,-608.837,53.0521,6.05178,'917:0 919:0 '),\n(921,'SVSHub1',0,33,33,33,45,0,-12826,-301.024,9.96047,5.46666,'916:0 922:0 909:0 925:0 '),\n(922,'SVSVentureCoMine1',0,33,33,33,45,0,-12978,-452.477,53.6008,5.60214,'921:0 923:0 '),\n(923,'SVSVentureCoMine2',0,33,33,33,45,0,-13088.9,-466.483,47.2022,3.61705,'922:0 '),\n(924,'GurubashiArenaOuterN',0,33,1577,33,45,0,-12949,251.702,18.4183,2.2214,'909:0 937:0 '),\n(925,'STCHub1',0,33,1577,33,45,0,-13136.8,-184.248,-3.10173,5.92455,'909:0 921:0 926:0 929:0 '),\n(926,'CrystalveinMine1',0,33,310,33,45,0,-13322.7,-420.202,15.4509,2.04861,'925:0 927:0 928:0 929:0 '),\n(927,'CrystalveinMine2',0,33,310,33,45,0,-13158.5,-564.518,4.64271,0.568135,'926:0 928:0 '),\n(928,'CrystalveinMine3',0,33,310,33,45,0,-13170,-467.696,3.57551,3.1305,'926:0 927:0 '),\n(929,'STCHub2',0,33,1577,33,45,0,-13246.3,-110.492,19.5979,5.04296,'926:0 925:0 930:0 '),\n(930,'GurubashiOuterSE',0,33,1741,33,45,0,-13280.6,57.3154,17.1498,4.95263,'929:0 931:0 932:0 933:0 934:0 '),\n(931,'GurubashiOuterSSE',0,33,1741,33,45,0,-13402.5,96.0163,23.7905,6.03724,'930:0 932:0 933:0 934:0 935:0 943:0 944:0 '),\n(932,'RuinsOfJubuwal',0,33,477,33,45,0,-13382.8,-24.5642,22.0332,0.894086,'930:0 931:0 '),\n(933,'GurubashiArenaInside1',0,33,2177,33,45,0,-13216,312.587,21.8574,3.50161,'930:0 931:0 934:0 '),\n(934,'GurubashiArenaInside2',0,33,2177,33,45,0,-13163.8,257.166,21.8574,3.62531,'930:0 931:0 933:0 '),\n(935,'STCHub3',0,33,1577,33,45,0,-13475.6,312.292,31.942,5.22555,'931:0 938:0 942:0 '),\n(936,'SSavageCoast1',0,33,1578,33,45,0,-12862.3,459.666,6.403,4.74253,'909:0 937:0 '),\n(937,'GurubashiArenaOuterW',0,33,1741,33,45,0,-13076.6,428.328,24.6507,6.12678,'924:0 936:0 938:0 '),\n(938,'GurubashiArenaOuterSW',0,33,1577,33,45,0,-13273.2,479.65,3.7542,5.77924,'935:0 937:0 939:0 940:0 '),\n(939,'BloodsailCompoundW',0,33,1739,33,45,0,-13331.9,777.87,2.16424,3.85895,'938:0 940:0 941:0 '),\n(940,'BloodsailCompoundC',0,33,1739,33,45,0,-13470.3,687.069,8.46535,3.18977,'938:0 939:0 941:0 '),\n(941,'SSavageCoast2',0,33,1578,33,45,0,-13705.9,620.54,10.152,3.17013,'939:0 940:0 966:0 968:0 '),\n(942,'STCHub4',0,33,1577,33,45,0,-13618.7,330.576,43.7429,5.59271,'935:0 943:0 968:0 '),\n(943,'STCHub5',0,33,1577,33,45,0,-13719.1,129.331,23.7103,3.72188,'931:0 942:0 944:0 964:0 965:0 '),\n(944,'STCHub6',0,33,1577,33,45,0,-13572.2,-93.8439,42.7481,1.44857,'931:0 943:0 945:0 '),\n(945,'RuinsOfAboraz',0,33,311,33,45,0,-13627.7,-351.772,12.434,1.10692,'944:0 946:0 '),\n(946,'CrystalShore1',0,33,302,33,45,0,-13867.2,-89.5993,18.4363,2.92315,'945:0 947:0 964:0 '),\n(947,'CrystalShore2',0,33,302,33,45,0,-14086.6,-142.781,3.55938,1.30916,'946:0 948:0 '),\n(948,'WildShore1',0,33,43,33,45,0,-14260.2,-15.7846,3.81308,5.84287,'947:0 949:0 '),\n(949,'WildShore2',0,33,43,33,45,0,-14293.2,109.305,7.5176,0.82025,'948:0 950:0 962:0 '),\n(950,'WildShore3',0,33,43,33,45,0,-14585.8,177.319,2.91916,6.15507,'949:0 951:0 952:0 955:0 958:0 '),\n(951,'WildShore4',0,33,43,33,45,0,-14708.6,511.328,2.52661,5.16547,'950:0 952:0 '),\n(952,'WildShoreShips1',0,33,43,33,45,0,-14894,302.458,3.67936,4.08476,'950:0 951:0 953:0 954:0 955:0 '),\n(953,'WildShoreShips1Left',0,33,43,33,45,0,-14940,357.129,0.221882,0.0694,'952:0 '),\n(954,'WildShoreShips1Right',0,33,43,33,45,0,-15009.9,266.91,0.198072,0.0485881,'952:0 '),\n(955,'WildShoreShips2',0,33,43,33,45,0,-14843.8,75.9812,2.07268,0.570875,'950:0 952:0 956:0 957:0 '),\n(956,'WildShoreShips2Center',0,33,43,33,45,0,-14926.8,110.764,0.2001,4.9102,'955:0 '),\n(957,'JagueroIsle1',0,33,297,33,45,0,-14817.1,-427.547,1.62653,0.804531,'955:0 958:0 '),\n(958,'JagueroIsle2',0,33,297,33,45,0,-14556.9,-277.709,10.043,3.68499,'950:0 957:0 '),\n(959,'BootyBayW',0,33,35,33,45,0,-14300.4,523.178,8.69884,4.45859,'36:0 960:0 '),\n(960,'BootyBayS',0,33,35,33,45,1,-14462.8,467.081,15.1246,5.4423,'36:0 959:0 '),\n(961,'BootyBayEntrance',0,33,1577,33,45,0,-14249.5,333.168,24.6767,2.49077,'36:0 962:0 967:0 '),\n(962,'STCHub7',0,33,1577,33,45,0,-14217.2,239.309,20.2817,3.77098,'949:0 961:0 963:0 '),\n(963,'STCHub8',0,33,1577,33,45,0,-14073.6,266.586,17.42,5.16308,'962:0 964:0 965:0 '),\n(964,'MistvaleValley',0,33,1737,33,45,0,-13952.8,86.1666,15.8298,5.2161,'76:0 943:0 946:0 963:0 '),\n(965,'STCHub9',0,33,1577,33,45,0,-13879.6,258.837,17.7662,5.83459,'943:0 963:0 '),\n(966,'SSavageCoast3',0,33,1578,33,45,0,-13908.6,676.67,10.0579,5.32409,'967:0 941:0 969:0 '),\n(967,'SSavageCoast4',0,33,1578,33,45,0,-14050.8,500.109,2.8225,0.635261,'961:0 966:0 '),\n(968,'SSavageCoast5',0,33,1578,33,45,0,-13683.6,505.174,34.349,3.2526,'941:0 942:0 969:0 970:0 '),\n(969,'SSavageCoast6',0,33,1577,33,45,0,-13859.9,575.635,44.9464,6.06235,'966:0 968:0 '),\n(970,'SSavageCoast7',0,33,1577,33,45,0,-13849.3,494.156,89.7643,5.84244,'968:0 971:0 '),\n(971,'SSavageCoast8',0,33,1738,33,45,0,-13806.7,377.83,94.1372,2.10198,'970:0 ');\n"
  },
  {
    "path": "SQL/updates/world/2023_04_04_00_creature_template_npcbot_wander_nodes.sql",
    "content": "--\nDROP TABLE IF EXISTS `creature_template_npcbot_wander_nodes`;\nCREATE TABLE `creature_template_npcbot_wander_nodes` (\n  `id` int(10) unsigned NOT NULL,\n  `name` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'RENAME_ME',\n  `mapid` smallint(5) unsigned NOT NULL DEFAULT '0',\n  `zoneid` int(10) unsigned NOT NULL DEFAULT '0',\n  `areaid` int(10) unsigned NOT NULL DEFAULT '0',\n  `minlevel` tinyint(3) unsigned NOT NULL DEFAULT '0',\n  `maxlevel` tinyint(3) unsigned NOT NULL DEFAULT '0',\n  `flags` int(10) unsigned NOT NULL DEFAULT '0',\n  `x` float NOT NULL DEFAULT '0',\n  `y` float NOT NULL DEFAULT '0',\n  `z` float NOT NULL DEFAULT '0',\n  `o` float NOT NULL DEFAULT '0',\n  `links` mediumtext COLLATE utf8mb4_unicode_ci,\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Bot Wander Map';\n\nINSERT INTO `creature_template_npcbot_wander_nodes` (`id`,`name`,`mapid`,`zoneid`,`areaid`,`minlevel`,`maxlevel`,`flags`,`x`,`y`,`z`,`o`,`links`) VALUES\n(1,'Anvilmar',0,1,132,1,5,2,-6077.84,384.826,393.598,4.63263,'542:0 '),\n(2,'Brill',0,85,159,1,10,5,2249.85,278.414,34.1142,5.11546,'18:0 277:0 278:0 279:0 281:0 '),\n(3,'Darkshire',0,10,42,18,30,3,-10560.6,-1182.34,27.9637,3.1803,'783:0 784:0 787:0 788:0 789:0 '),\n(4,'Deathknell',0,85,154,1,10,5,1879.83,1588.2,90.1725,5.25172,'295:0 296:0 '),\n(5,'Dun Algaz',0,11,836,18,30,0,-4245.13,-2356.42,204.034,3.9477,'483:0 '),\n(6,'Dun Modr',0,11,205,18,30,0,-2610.26,-2350.56,81.5918,1.1263,'444:0 '),\n(7,'Goldshire',0,12,87,1,10,3,-9480.09,63.5218,56.1755,3.4173,'88:0 71:0 16:0 42:0 72:0 710:0 709:0 714:0 717:0 '),\n(8,'Ironforge',0,1,809,1,10,2,-5023.64,-831.425,495.319,5.37056,'559:0 560:0 '),\n(9,'Kharanos',0,1,131,1,10,3,-5501.22,-472.604,408.453,2.4002,'537:0 545:0 557:0 '),\n(10,'Lakeshire',0,44,69,13,25,3,-9235.12,-2145.54,71.2121,5.71383,'665:0 666:0 '),\n(11,'Menethil Harbor',0,11,150,18,30,3,-3672.7,-828.455,9.89925,3.18444,'476:0 477:0 478:0 '),\n(12,'Moonbrook',0,40,20,8,20,2,-11017.1,1510.17,43.1667,2.58627,'737:0 738:0 736:0 747:0 '),\n(13,'Northshire Abbey',0,12,9,1,10,3,-8900.51,-116.199,81.8499,0.369434,'710:0 70:0 73:0 '),\n(14,'Raven Hill',0,10,94,18,30,0,-10805.5,291.025,30.9282,3.92422,'751:0 753:0 754:0 755:0 766:0 '),\n(15,'Sentinel Hill',0,40,108,8,20,3,-10509.5,1047.74,60.519,5.20046,'741:0 742:0 745:0 746:0 736:0 750:0 '),\n(16,'Stormwind City',0,12,12,1,10,2,-9153.77,364.057,90.151,5.16709,'42:0 710:0 712:0 7:0 '),\n(17,'The Sepulcher',0,130,228,8,20,5,470.768,1589.82,126.632,5.16292,'305:0 '),\n(18,'Undercity',0,85,153,1,10,5,1885.94,236.924,58.0313,3.1016,'2:0 285:0 '),\n(19,'Thelsamar',0,38,144,8,20,3,-5334.7,-3015.26,324.2,1.73643,'503:0 504:0 '),\n(20,'Southshore',0,267,271,18,30,3,-803.031,-531.727,15.9656,1.39359,'362:0 363:0 376:0 384:0 385:0 356:0 '),\n(21,'Tarren Mill',0,267,272,18,30,5,-27.0354,-900.562,55.9602,4.57301,'378:0 380:0 379:0 384:0 '),\n(22,'Refuge Pointe',0,45,320,28,40,3,-1280.81,-2466.89,34.7175,5.16384,'78:0 416:0 419:0 '),\n(23,'Hammerfall',0,45,321,28,40,5,-955.494,-3540.82,56.7101,3.23882,'438:0 '),\n(24,'Kargath',0,3,340,33,45,5,-6625,-2152.82,249.141,4.5492,'594:0 598:0 '),\n(25,'Angor Fortress',0,3,338,33,45,0,-6392.65,-3158,299.765,4.68826,'608:0 620:0 '),\n(26,'Bloodhoof Village',1,215,222,1,10,5,-2383.39,-343.878,-0.729101,4.63375,'1817:0 1818:0 1819:0 '),\n(27,'Camp Narache',1,215,221,1,10,5,-2886.88,-207.003,54.8208,5.16976,'1825:0 1826:0 '),\n(28,'Razor Hill',1,14,362,1,10,0,311.158,-4740.49,9.58476,2.69842,'1401:0 1402:0 1409:0 '),\n(29,'The Den',1,14,363,1,10,0,-604.098,-4202.92,38.7281,1.10189,'1431:0 '),\n(30,'Orgrimmar',1,14,14,1,10,5,1429.15,-4364.86,25.4626,0.273189,'1361:0 '),\n(31,'Senjin Village',1,14,367,1,10,0,-827.631,-4901.78,19.7839,0.842982,'1413:0 1419:0 1420:0 1421:0 1422:0 '),\n(32,'The Crossroads',1,17,380,8,25,5,-456.721,-2653.33,95.6449,4.9548,'1487:0 1490:0 1526:0 1535:0 '),\n(33,'Aldrassil',1,141,256,1,4,2,10318.8,828.943,1326.38,0.947904,'972:0 62:0 974:0 '),\n(34,'Dolanaar',1,141,186,1,10,3,9809.39,956.34,1308.79,0.244923,'981:0 983:0 985:0 '),\n(35,'Ratchet',1,17,392,8,25,0,-949.408,-3670.31,9.21524,5.18454,'1475:0 1562:0 1484:0 1618:0 '),\n(36,'Booty Bay',0,33,35,33,45,0,-14308.8,440.139,25.5878,0.828079,'959:0 960:0 961:0 '),\n(37,'Gromgol Base Camp',0,33,117,33,45,5,-12416.5,185.125,1.83125,6.17782,'904:0 900:0 908:0 '),\n(38,'Astranaar',1,331,415,18,30,3,2687.8,-420.338,107.402,0.195851,'1056:0 1055:0 '),\n(39,'Stonetalon Peak',1,406,467,18,25,3,2693.45,1481.51,235.304,5.88192,'1692:0 1694:0 1690:0 '),\n(40,'Thalanaar',1,357,489,23,35,3,-4496.36,-778.473,-40.558,2.54579,'2014:0 2019:0 2020:0 2021:0 '),\n(41,'Freewind Post',1,400,484,23,35,4,-5429.82,-2388.59,89.4787,2.85815,'2104:0 2105:0 '),\n(42,'Mirror Lake',0,12,92,1,10,2,-9389.26,458.427,38.2852,2.4529,'72:0 16:0 88:0 7:0 '),\n(44,'Drywhisker Gorge',0,45,318,28,40,0,-1014.22,-3827.39,145.41,2.59534,'440:0 '),\n(45,'Sun Rock Retreat',1,406,460,13,25,4,946.771,895.865,106.952,1.46258,'1662:0 1663:0 '),\n(46,'Temple of Zin-Malor',1,16,1223,43,54,0,3549.15,-5359.12,188.348,1.22969,'1325:0 '),\n(48,'Uthers Tomb',0,28,196,48,56,0,1021.5,-1809.43,77.1448,3.5376,'271:0 '),\n(50,'Whitereach Post',1,400,2237,23,35,0,-4917.35,-1375.5,-52.612,3.05417,'2034:0 2036:0 2038:0 2040:0 '),\n(51,'Stonard',0,8,75,33,45,5,-10445,-3261.11,20.179,5.57373,'828:0 829:0 830:0 '),\n(52,'Gadgetzan',1,440,976,38,50,0,-7145.2,-3724,8.49316,4.91643,'2144:0 2146:0 2147:0 '),\n(53,'Camp Mojache',1,357,1099,38,50,4,-4402.29,263.941,25.2783,4.51526,'1995:0 1996:0 1997:0 '),\n(54,'Theramore Isle',1,15,513,33,45,2,-3702.55,-4393.17,15.8191,0.332538,'1882:0 1883:0 '),\n(55,'Aerie Peak',0,47,348,38,50,0,151.003,-2052.21,117.992,6.03287,'82:0 386:0 387:0 388:0 '),\n(56,'Everlook',1,618,2255,53,60,0,6726.4,-4671.8,720.854,3.62348,'1218:0 1240:0 '),\n(57,'Shadowprey Village',1,405,2408,31,40,5,-1591.76,3150,62.5296,3.57741,'1792:0 '),\n(58,'Feathermoon Stronghold',1,357,1116,38,50,3,-4377.97,3297.09,28.7853,5.12409,'1940:0 1941:0 1939:0 '),\n(59,'Auberdine',1,148,442,8,20,0,6300.77,315.841,22.9342,5.97913,'993:0 994:0 1008:0 1010:0 1011:0 1012:0 '),\n(60,'Nijels Point',1,405,608,28,40,3,164.433,1335.57,197.473,2.41439,'1716:0 '),\n(62,'Shadowthread Cave',1,141,257,1,4,2,10749.1,923.327,1336.99,6.25796,'33:0 972:0 973:0 '),\n(63,'Fel Rock',1,141,258,1,10,2,10038.9,1030.06,1329.12,0.362337,'983:0 984:0 '),\n(64,'Banethil Barrow Den',1,141,736,4,10,2,9972.27,1541.52,1308.75,3.05312,'985:0 986:0 987:0 '),\n(66,'DurotarCanyon1_1',1,14,410,1,10,0,622.608,-4563.33,7.7631,0.614446,'1372:0 1373:0 1374:0 '),\n(67,'Torkren Farm',1,14,2979,1,10,0,723.247,-4242.04,17.2031,4.54537,'1372:0 1373:0 1385:0 1392:0 1400:0 '),\n(69,'Ironbands Compound',0,1,716,1,10,2,-5858.7,-2004.1,401.648,0.478922,'523:0 528:0 '),\n(70,'Echo Ridge Mine',0,12,34,1,10,2,-8691.38,-113.152,89.09,5.86134,'73:0 13:0 711:0 '),\n(71,'Maclure Vineyards',0,12,64,1,10,2,-9948.39,69.1568,33.3005,5.49869,'72:0 7:0 714:0 716:0 '),\n(72,'Stonefield Farm',0,12,63,1,10,2,-9901.14,378.19,35.2801,5.75613,'71:0 7:0 42:0 88:0 713:0 714:0 717:0 '),\n(73,'Northshire Vineyards',0,12,59,1,10,2,-9067.35,-333.965,73.4519,1.09469,'70:0 13:0 '),\n(74,'Tower of Ilgalar',0,44,96,18,25,0,-9282.21,-3330.43,115.604,1.41034,'683:0 685:0 686:0 '),\n(75,'Renders Rock',0,44,998,13,25,0,-8677.89,-2302.91,155.917,1.18325,'661:0 662:0 '),\n(76,'Spirit Den',0,33,1742,33,45,0,-13751.4,-18.3165,44.0002,0.851192,'964:0 '),\n(77,'Rethban Caverns',0,44,98,13,25,2,-8976.38,-2016.83,136.063,1.26142,'670:0 671:0 '),\n(78,'Boulderfist Outpost',0,45,1858,28,40,0,-1183.46,-2180.67,55.5524,1.6849,'22:0 415:0 416:0 419:0 '),\n(79,'Groshgok Compound',0,41,2937,50,60,0,-11094.7,-2311.06,117.13,4.77931,'800:0 803:0 804:0 '),\n(80,'Stagalbog Cave',0,8,1817,33,45,0,-10775.6,-3747.85,22.347,3.74768,'186:0 825:0 824:0 826:0 828:0 832:0 '),\n(81,'The Tower of Arathor',0,45,324,28,40,0,-1760.68,-1537.05,64.8696,2.02383,'425:0 '),\n(82,'Wildhammer Keep',0,47,349,38,50,3,250.073,-2203.83,125.172,0.474207,'55:0 387:0 388:0 '),\n(83,'Night Webs Hollow',0,85,155,1,10,4,2053.22,1802.16,99.8006,1.83635,'295:0 '),\n(84,'Terrorweb Tunnel',0,139,2626,53,60,0,3035.33,-2773.9,100.473,5.05065,'215:0 243:0 '),\n(85,'Browman Mill',0,139,2269,53,60,0,2475.41,-5143.98,77.5041,5.20031,'234:0 211:0 '),\n(86,'Uldaman',0,3,1337,33,45,0,-6092.01,-3179.35,255.852,5.9237,'621:0 '),\n(87,'Dustbelch Grotto',0,3,347,33,45,0,-7299.86,-2270.26,244.599,3.07308,'595:0 '),\n(88,'Westbrook Garrison',0,12,120,1,10,2,-9671.96,690.134,36.5414,5.31336,'72:0 42:0 713:0 7:0 717:0 '),\n(89,'Jasperlode Mine',0,12,54,1,10,0,-9194.18,-610.205,60.7892,0.426731,'701:0 702:0 707:0 708:0 '),\n(91,'Algaz Station',0,38,925,8,20,0,-4880.26,-2723,328.908,0.873682,'485:0 486:0 487:0 500:0 502:0 '),\n(92,'Grim Batol',0,11,1037,61,70,0,-4130,-3468.16,259.76,0.014411,'454:0 '),\n(93,'Venture Co. Mine',1,215,215,1,10,4,-1466.09,-994.107,148.38,4.09562,'1868:0 '),\n(94,'Blackwood Den',1,148,455,8,20,0,4626.07,40.557,68.8626,1.32329,'95:0 999:0 1003:0 1006:0 '),\n(95,'WindbendRiverS',1,148,454,8,20,0,5014.05,224.988,33.2141,0.194282,'996:0 999:0 1005:0 94:0 1006:0 '),\n(96,'Cliffspring Falls',1,148,445,8,20,0,6878.37,-656.215,84.4074,3.85022,'1019:0 1020:0 1021:0 '),\n(98,'Wailing Caverns',1,17,718,8,25,0,-868.365,-2044.69,81.6627,1.16842,'1539:0 1540:0 1557:0 1614:0 '),\n(99,'Shady Rest Inn',1,15,403,33,45,0,-3695.7,-2558.8,61.0548,1.48476,'1872:0 1873:0 1904:0 '),\n(100,'Darkmist Cavern',1,15,499,33,45,0,-2829.79,-2722.81,36.7883,2.20851,'187:0 102:0 1902:0 '),\n(101,'North Point Tower',1,15,504,33,45,2,-2869.79,-3419.99,39.3517,3.30334,'102:0 1875:0 1877:0 1878:0 1902:0 '),\n(102,'Bluefen',1,15,507,33,45,0,-2695.87,-3011.4,41.88,2.01726,'100:0 187:0 1874:0 101:0 1875:0 1902:0 '),\n(103,'Lost Point',1,15,506,33,45,0,-3917.65,-2833.95,42.7963,4.55319,'1873:0 1904:0 1907:0 1908:0 1909:0 '),\n(104,'Tidefury Cove',1,15,517,33,45,0,-4414.52,-4100.84,6.37542,0.28057,'106:0 1912:0 '),\n(105,'Stonemaul Ruins',1,15,508,33,45,0,-4346.02,-3321.15,34.2542,6.16796,'106:0 233:0 1906:0 1907:0 1909:0 '),\n(106,'Onyxias Lair',1,15,511,33,45,0,-4638.56,-3708.98,38.6239,2.33441,'233:0 105:0 1910:0 1911:0 104:0 '),\n(107,'Emberstrifes Den',1,15,2158,33,45,0,-4956.66,-3850.19,43.6067,2.10466,'1910:0 1911:0 '),\n(108,'Bloodfen Burrow',1,15,498,33,45,0,-4335.04,-2639.53,38.0638,1.30845,'1908:0 1909:0 '),\n(109,'Sentry Point',1,15,503,33,45,0,-3410.26,-4186.35,10.7187,3.27073,'1881:0 1882:0 '),\n(110,'Swamplight Manor',1,15,497,33,45,0,-2949.47,-3893.5,35.0303,1.23141,'1877:0 1878:0 1879:0 1880:0 '),\n(111,'Marshals Refuge',1,490,541,46,56,1,-6112.07,-1130.95,-187.426,1.5835,'2245:0 2246:0 '),\n(112,'Fungal Rock',1,490,542,46,56,0,-6383.04,-1806.79,-266.123,6.01903,'2249:0 2250:0 2251:0 '),\n(113,'Wavestrider Beach',1,440,988,38,50,0,-7619.63,-4828.43,0.668867,3.36332,'2157:0 2158:0 2159:0 2160:0 '),\n(114,'Uldum',1,440,989,44,55,0,-9473.22,-2749.02,15.4728,5.89777,'2193:0 2194:0 2195:0 '),\n(115,'Darkcloud Pinnacle',1,400,2097,23,35,0,-5086.21,-1919.44,88.1806,6.15461,'2071:0 2077:0 2078:0 '),\n(116,'Roguefeather Den',1,400,487,23,35,0,-5462.36,-1633.26,30.0036,4.16001,'2056:0 2057:0 '),\n(117,'Mirage Raceway',1,400,2240,23,35,0,-6239.42,-3973.12,-58.7501,5.06259,'122:0 123:0 2136:0 2137:0 118:0 2138:0 '),\n(118,'The Rustmaul Digsite',1,400,479,23,35,0,-6490.61,-3449.15,-58.7821,3.58106,'117:0 123:0 2138:0 2139:0 '),\n(119,'Splithoof Hold',1,400,1557,23,35,0,-5071.33,-2349.27,-53.6634,5.48527,'2084:0 2094:0 2112:0 '),\n(121,'Ironstone Camp',1,400,3037,23,35,0,-5813.18,-3421.49,-50.9325,2.44381,'2131:0 2133:0 122:0 2134:0 2138:0 '),\n(122,'Weazels Crater',1,400,3038,23,35,0,-5880.19,-3796.15,-59.9445,0.25844,'121:0 2133:0 2134:0 2136:0 117:0 2138:0 '),\n(123,'Tahonda Ruins',1,400,3039,23,35,0,-6569.91,-3894.97,-58.7495,0.100017,'117:0 2137:0 118:0 2138:0 2140:0 '),\n(124,'Rolands Doom',0,10,2161,24,30,0,-11045.3,-1130.98,38.585,3.65547,'780:0 781:0 '),\n(127,'Maraudon',1,405,2100,33,40,0,-1421.88,2905.15,136.781,1.31624,'1786:0 1787:0 '),\n(128,'Ghost Walker Post',1,405,597,28,40,4,-1258.05,1699.26,89.9098,0.914953,'1765:0 1766:0 1769:0 1776:0 '),\n(129,'Scrabblescrews Camp',1,405,2617,31,40,0,-1407.87,1493.13,60.8875,4.75641,'1749:0 1750:0 1764:0 1769:0 1770:0 1777:0 1778:0 '),\n(130,'Valley of Bones',1,405,2657,33,40,0,-2323.83,1355.6,63.5887,1.00444,'1812:0 1813:0 '),\n(131,'Rage Scar Hold',1,357,1115,38,50,0,-3839.01,1752.22,143.122,4.59397,'1927:0 1928:0 '),\n(132,'Ruins of Solarsal',1,357,1117,38,50,2,-4932.61,3653.2,12.2193,0.301741,'1940:0 1941:0 140:0 '),\n(133,'Ravaged Twilight Camp',1,1377,3100,53,60,0,-6206.25,1766.95,17.464,4.2566,'2318:0 2319:0 '),\n(134,'Twilight Post',1,1377,3098,55,60,0,-6753.94,1661.67,6.34336,0.541008,'2319:0 2320:0 2321:0 2322:0 '),\n(135,'Twilight Outpost',1,1377,3099,55,60,0,-7929.11,1833.28,4.86506,0.733634,'2336:0 2337:0 2338:0 '),\n(136,'Woodpaw Hills',1,357,2519,38,50,0,-4867.47,196.488,57.1639,3.31322,'1991:0 1992:0 '),\n(137,'Lariss Pavillion',1,357,2518,38,50,0,-4097.42,96.644,76.2811,5.8877,'2004:0 2006:0 2007:0 '),\n(138,'Slither Rock',0,46,2419,48,56,0,-7653.86,-2991.1,135.917,1.62615,'648:0 650:0 652:0 '),\n(139,'Flame Crest',0,46,251,48,56,5,-7486.64,-2184.45,166.505,5.87909,'646:0 '),\n(140,'Shalzarus Lair',1,357,3117,38,50,0,-5418.89,3677.45,4.7662,3.81836,'132:0 1942:0 '),\n(142,'Timbermaw Hold',1,618,618,53,60,0,6889.31,-2300.49,584.754,3.03017,'1196:0 1202:0 '),\n(143,'The Ruins of KelTheril',1,618,2252,53,60,0,6430.1,-4328.62,666.714,0.935105,'1216:0 '),\n(144,'Dun Mandarr',1,618,2248,53,60,0,5667.17,-4495.06,769.144,0.689558,'1255:0 1258:0 1259:0 1260:0 '),\n(145,'Talrendis Point',1,16,3137,43,54,3,2689.78,-3854.8,103.228,5.51976,'1270:0 '),\n(147,'Moon Horror Den',1,618,3139,53,60,0,7122.72,-4596.74,637.499,3.77862,'1225:0 '),\n(148,'Timbermaw Hold',1,361,1769,46,56,0,6811.82,-2090.36,625.019,5.71392,'1148:0 1196:0 '),\n(149,'Irontree Cavern',1,361,1768,46,56,0,6464.49,-1502.77,438.462,4.97283,'1142:0 1143:0 1183:0 1184:0 '),\n(150,'Bloodvenom Post',1,361,1997,46,56,5,5070.53,-333.931,367.077,5.98328,'1164:0 '),\n(151,'Sishir Canyon',1,406,2541,13,25,0,599.482,622.34,74.9622,3.1924,'1645:0 '),\n(152,'Cragpool Lake',1,406,463,13,25,0,1491.34,85.8624,11.9254,3.12763,'1649:0 1650:0 1651:0 1652:0 '),\n(153,'Windshear Mine',1,406,461,13,25,0,981.949,-358.9,14.3123,3.71479,'1648:0 1654:0 1655:0 '),\n(154,'The Talondeep Path',1,406,1277,13,25,0,1531.94,-576.57,67.9212,5.18318,'1653:0 1655:0 168:0 '),\n(155,'The Talon Den',1,406,468,18,25,4,2416.89,1792.39,393.641,3.36062,'1692:0 1693:0 '),\n(156,'The Ruins of OrdilAran',1,331,412,18,30,0,3476.85,-104.536,2.98631,5.31466,'157:0 1029:0 1031:0 1033:0 '),\n(157,'Bathrans Haunt',1,331,411,18,30,0,3827.37,-161.305,-0.60768,3.24941,'1028:0 156:0 '),\n(158,'Zoramgar Outpost',1,331,2897,18,30,5,3362.22,1010.16,3.59814,2.49558,'1035:0 1036:0 1037:0 '),\n(159,'Falfarren River',1,331,433,18,30,0,2247.11,-2187.63,105.176,0.680699,'1078:0 1079:0 '),\n(160,'Xavian',1,331,429,18,30,0,2931.82,-2808,212.839,0.056247,'1080:0 1081:0 1085:0 '),\n(161,'Forest Song',1,331,2358,18,30,3,2936.03,-3270.73,159.15,3.69459,'1085:0 1091:0 1093:0 '),\n(162,'Demon Fall Canyon',1,331,435,18,30,0,1708.23,-3157.86,94.4801,5.70126,'1099:0 1100:0 1104:0 '),\n(163,'Silverwing Outpost',1,331,2360,18,30,0,1776.04,-2061.14,106.556,1.50326,'1109:0 '),\n(164,'The DorDanil Barrow Den',1,331,432,18,30,0,1776.92,-2583.5,85.9882,3.82761,'169:0 1113:0 1115:0 1117:0 '),\n(165,'Silverwind Refuge',1,331,420,18,30,0,2141.6,-1189.65,96.7733,3.54353,'1063:0 1064:0 1066:0 '),\n(166,'Greenpaw Village',1,331,2359,18,30,0,2274.68,-1460.01,90.2583,4.48209,'1066:0 1068:0 1069:0 '),\n(167,'Bloodtooth Camp',1,331,2357,18,30,0,1668.68,-1469.31,140.228,5.79562,'1067:0 '),\n(168,'The Talondeep Path',1,406,1277,13,25,0,1941.31,-740.96,113.545,2.12791,'154:0 1063:0 '),\n(169,'Warsong Labor Camp',1,331,3177,18,30,0,1575.91,-2463.94,98.549,2.24558,'164:0 1110:0 '),\n(170,'Aridens Camp',0,41,2560,50,60,0,-10443.3,-2141.1,90.7796,5.92189,'801:0 '),\n(171,'Deadwind Ravine',0,41,2558,50,60,0,-10607.9,-1904.89,117.201,2.66188,'798:0 799:0 '),\n(172,'Sleeping Gorge',0,41,2938,50,60,0,-10740.7,-1951.45,121.127,3.69664,'800:0 801:0 '),\n(173,'Chillwind Camp',0,28,3197,48,56,3,940.955,-1419.2,66.7723,0.796556,'271:0 272:0 334:0 '),\n(174,'Camp Taurajo',1,17,378,8,25,5,-2353.97,-1913.23,95.7826,0.204344,'1550:0 1551:0 1553:0 1554:0 1584:0 1585:0 1814:0 '),\n(175,'Splintertree Post',1,331,431,18,30,5,2251.83,-2538.3,90.4185,6.01297,'1113:0 1114:0 '),\n(177,'Bones of Grakkarond',1,1377,3257,53,60,0,-7228.09,854.674,-1.38994,1.38965,'2323:0 2324:0 2335:0 2343:0 2348:0 2349:0 2350:0 '),\n(178,'Woodpaw Den',1,357,2520,38,50,0,-4775.84,905.452,142.986,4.17326,'1980:0 '),\n(179,'Revantusk Village',0,47,3317,38,50,5,-573.459,-4590.51,10.4122,3.48476,'407:0 '),\n(180,'Thorium Point',0,51,1446,43,54,0,-6521.12,-1190.02,309.255,4.39589,'590:0 '),\n(183,'The Weeping Cave',0,28,198,48,56,0,2249.61,-2389.63,59.8017,5.27414,'244:0 255:0 256:0 '),\n(184,'Valors Rest',1,1377,3077,50,60,0,-6382.38,-308.522,-1.89701,4.0769,'2292:0 2293:0 '),\n(185,'Yojamba Isle',0,33,3357,33,45,0,-11838,1268.18,1.74176,4.79629,'894:0 887:0 895:0 896:0 '),\n(186,'Misty Reed Post',0,8,1978,33,45,4,-10854.8,-4093.43,21.7429,5.03063,'825:0 80:0 826:0 '),\n(187,'Brackenwall Village',1,15,496,33,45,5,-3113.73,-2860.5,34.4097,2.94207,'1873:0 100:0 102:0 '),\n(188,'Cenarion Hold',1,1377,3425,53,60,3,-6886.15,718.398,42.798,6.10305,'2305:0 2306:0 '),\n(189,'Twilight Base Camp',1,1377,2739,53,60,0,-6969.25,1167.66,12.8483,1.06764,'2322:0 2323:0 2324:0 2325:0 2335:0 '),\n(191,'Twilights Run',1,1377,3446,55,60,0,-6332.81,164.268,6.01109,2.33216,'2295:0 2296:0 2297:0 2299:0 '),\n(192,'Ortells Hideout',1,1377,2744,53,60,0,-7601.34,285.736,2.83228,0.367888,'2349:0 2357:0 2358:0 '),\n(193,'Bronzebeard Encampment',1,1377,3427,53,60,0,-7993.44,1118.16,-1.76652,1.00873,'2339:0 2340:0 2341:0 2344:0 2347:0 2346:0 '),\n(196,'BLC1',0,4,4,43,54,0,-11202.2,-3034.46,6.232,1.13173,'839:0 841:0 845:0 852:0 854:0 '),\n(199,'Under Attack - Eastern Plaguelands',0,139,2258,53,60,0,2492.32,-3803.41,177.692,4.09879,'248:0 '),\n(200,'Ivars Patch',0,130,239,8,20,4,1233.05,1214.28,52.5845,3.07876,'201:0 298:0 299:0 303:0 '),\n(201,'Valgans Field',0,130,227,8,20,4,908.754,1255.63,45.9684,0.575633,'299:0 302:0 303:0 200:0 '),\n(211,'Eastwall Tower - Horde',0,139,2271,53,60,0,2550.77,-4783.57,109.501,5.47479,'85:0 235:0 237:0 250:0 '),\n(215,'Plaguewood Tower - Horde, Progressing',0,139,4067,53,60,0,2991.34,-3045.27,119.143,2.65173,'84:0 241:0 242:0 '),\n(220,'Northpass Tower - Horde, Contested',0,139,2275,53,60,0,3168.41,-4356.58,138.976,4.89792,'236:0 237:0 238:0 '),\n(230,'Crown Guard Tower - Alliance',0,139,2263,53,60,0,1861.6,-3701.08,160.834,4.34226,'248:0 247:0 249:0 2369:0 '),\n(233,'Mudsprocket',1,15,4010,33,45,1,-4601.09,-3173.17,38.4677,3.21013,'1909:0 106:0 105:0 1911:0 '),\n(234,'LightsHopeChapel',0,139,2268,53,60,1,2207.38,-5321.35,92.2225,0.203619,'85:0 252:0 '),\n(235,'BlackwoodLake',0,139,2624,53,60,0,2464.31,-4192.32,86.7625,5.25334,'211:0 236:0 250:0 '),\n(236,'EPL_hubN1',0,139,139,53,60,0,2895.84,-4274.37,91.0774,2.94428,'220:0 235:0 237:0 240:0 '),\n(237,'Northdale',0,139,2272,53,60,0,2939.45,-4922.8,110.201,2.76758,'236:0 211:0 220:0 238:0 '),\n(238,'ZulMasharEntrance',0,139,2273,53,60,0,3243.57,-4728.42,157.177,1.67982,'237:0 220:0 239:0 '),\n(239,'MazraAlor',0,139,2274,53,60,0,3446.77,-4987,196.046,5.53613,'238:0 '),\n(240,'PlaguewoodEast',0,139,2277,53,60,0,3031.09,-3786.79,119.967,4.37961,'236:0 241:0 242:0 '),\n(241,'PlaguewoodSouth',0,139,2277,53,60,0,2764.18,-3442.19,97.1331,4.24216,'215:0 240:0 242:0 '),\n(242,'PlaguewoodCenter',0,139,2277,53,60,0,3137.26,-3403.95,139.517,0.937594,'215:0 240:0 241:0 '),\n(243,'TerrorweTunnelWest',0,139,2619,53,60,0,2724.41,-2453.2,66.836,5.42496,'244:0 84:0 '),\n(244,'ThondorilRiverSouth',0,139,2619,53,60,0,2417.75,-2469.65,72.4504,0.00296164,'183:0 243:0 245:0 '),\n(245,'EPL_hubSW',0,139,139,53,60,0,2076.2,-2853.69,86.3391,0.879086,'244:0 246:0 248:0 255:0 '),\n(246,'EPL_hubSWRoad',0,139,139,53,60,0,1811.3,-3046.98,75.4985,1.09939,'245:0 247:0 255:0 '),\n(247,'Undercroft',0,139,2261,53,60,0,1600.37,-3283.08,91.4858,0.567285,'246:0 230:0 '),\n(248,'EPL_hubSW2',0,139,139,53,60,0,2175.83,-3487.76,123.024,5.90406,'199:0 230:0 245:0 '),\n(249,'EPL_SRoad',0,139,139,53,60,0,1841.76,-4088.5,101.961,5.05584,'230:0 250:0 '),\n(250,'CorinsCrossing',0,139,2264,53,60,0,2074.45,-4556.23,73.5772,0.745981,'211:0 235:0 249:0 251:0 252:0 '),\n(251,'ScarletBaseCamp',0,139,2265,53,60,0,1656.05,-4826.35,87.7738,0.384695,'250:0 252:0 253:0 '),\n(252,'PestilentScar',0,139,2622,53,60,0,2013.6,-4964.85,73.6116,5.58402,'234:0 250:0 251:0 253:0 '),\n(253,'TyrshandEntrance',0,139,2266,53,60,0,1690.77,-5201.46,74.6226,4.83788,'251:0 252:0 254:0 '),\n(254,'Tyrshand',0,139,2266,53,60,0,1609.91,-5528.27,111.168,4.2076,'253:0 '),\n(255,'ThondorilRiverBridge',0,139,2619,53,60,0,1924.72,-2608.2,62.8109,4.6761,'183:0 245:0 246:0 256:0 '),\n(256,'GahrronWithering',0,28,201,48,56,0,1768.07,-2280.14,59.7087,0.010807,'183:0 255:0 257:0 258:0 '),\n(257,'WritingHaunt',0,28,202,48,56,0,1506.64,-1862.76,59.0986,5.271,'256:0 258:0 259:0 266:0 269:0 '),\n(258,'WPL_hubC2',0,28,28,48,56,0,1760.12,-1779.45,64.8245,4.87437,'256:0 257:0 259:0 260:0 266:0 269:0 '),\n(259,'DalsonTears',0,28,200,48,56,0,1864.12,-1558.81,59.2668,3.44495,'257:0 258:0 260:0 266:0 267:0 269:0 '),\n(260,'WPL_hubN1',0,28,28,48,56,0,2122.47,-1665.81,64.0458,5.36013,'258:0 259:0 261:0 262:0 '),\n(261,'NorthridgeLumberCamp',0,28,192,48,56,0,2421.88,-1647.26,103.541,5.77835,'260:0 '),\n(262,'WPL_hubN2',0,28,28,48,56,0,2425.99,-1947.45,109.098,4.71217,'260:0 263:0 '),\n(263,'HearthglenTower',0,28,28,48,56,0,2701.43,-1944.23,107.238,0.832291,'262:0 265:0 '),\n(264,'Hearthglen',0,28,203,48,56,0,2924.12,-1426.31,150.782,1.09736,'265:0 '),\n(265,'HearthglenEntrance',0,28,190,48,56,0,2782.62,-1612.54,129.551,0.826396,'264:0 263:0 '),\n(266,'WPL_hubC1',0,28,28,48,56,0,1680.03,-1358.64,69.8578,5.02985,'268:0 257:0 258:0 259:0 267:0 269:0 270:0 274:0 '),\n(267,'FelstoneField',0,28,199,48,56,0,1795.08,-1188.53,59.8914,5.54821,'268:0 259:0 266:0 269:0 273:0 274:0 '),\n(268,'AndorhalW',0,28,193,48,56,0,1336.99,-1272.01,57.8614,2.26525,'266:0 267:0 269:0 270:0 272:0 '),\n(269,'AndorhalNE',0,28,193,48,56,0,1540.11,-1606.19,65.1216,5.937,'257:0 258:0 259:0 266:0 267:0 268:0 270:0 '),\n(270,'AndorhalEntranceSE',0,28,197,48,56,0,1294.98,-1678.78,62.5727,3.83801,'268:0 266:0 269:0 271:0 '),\n(271,'SorrowHillCR',0,28,197,48,56,0,1162.78,-1758.3,60.6308,3.04279,'48:0 173:0 270:0 334:0 '),\n(272,'AndorhalEntranceSW',0,28,28,48,56,0,1214.59,-1145.63,60.8962,5.48342,'268:0 173:0 334:0 '),\n(273,'Bulwark',0,28,813,48,56,5,1718.17,-802.509,57.5466,1.68044,'267:0 274:0 275:0 276:0 '),\n(274,'WPL_hubE',0,28,813,48,56,0,1663.85,-956.731,69.3084,0.651574,'266:0 267:0 273:0 '),\n(275,'TG_hubSE',0,85,85,1,10,4,1806.63,-369.504,32.3876,6.02566,'273:0 276:0 277:0 '),\n(276,'BalnirFarmstead',0,85,165,6,10,4,2029.54,-432.459,35.4011,5.30269,'273:0 275:0 277:0 '),\n(277,'TG_hubC2',0,85,85,1,10,4,2029.86,-87.8105,35.5077,4.49765,'2:0 275:0 276:0 '),\n(278,'BrillEntrance',0,85,159,1,10,4,2296.05,429.197,35.7333,5.74799,'2:0 279:0 285:0 297:0 '),\n(279,'GarrensHauntGraves',0,85,85,4,10,4,2599.87,521.024,17.2769,5.97968,'2:0 278:0 280:0 281:0 '),\n(280,'GarrensHaunt',0,85,164,6,10,4,2883.52,376.589,25.8553,5.87914,'279:0 281:0 284:0 '),\n(281,'BrightwaterLake',0,85,85,1,10,4,2634.44,79.5244,31.089,6.13244,'2:0 279:0 280:0 282:0 284:0 '),\n(282,'NorthCoastE',0,85,168,7,10,4,3032.54,-341.266,5.44748,2.52746,'281:0 283:0 '),\n(283,'NorthCoastC',0,85,168,1,10,4,2935.15,41.7046,6.92148,4.82869,'282:0 284:0 '),\n(284,'NorthCoastW',0,85,168,1,10,4,2984.21,388.32,7.96326,4.49688,'280:0 281:0 283:0 '),\n(285,'ColdHearthManor',0,85,166,1,10,4,2107.98,617.879,35.0405,0.497239,'278:0 18:0 286:0 287:0 297:0 '),\n(286,'TG_hubC1',0,85,85,1,10,0,2204.7,1063.28,28.6853,4.1572,'285:0 287:0 288:0 292:0 294:0 '),\n(287,'CrusadersOutpost',0,85,85,1,10,0,1797.65,703.831,48.147,1.54771,'286:0 285:0 297:0 '),\n(288,'TG_hubNE',0,85,85,1,10,4,2446.9,1082.07,58.5203,0.911539,'286:0 289:0 292:0 293:0 294:0 '),\n(289,'AgamandMillsEntrance',0,85,157,4,10,4,2701.33,937.571,110.912,0.173269,'288:0 290:0 291:0 '),\n(290,'AgamandMillsW',0,85,157,6,10,4,2889.98,1065.92,105.434,5.38438,'289:0 291:0 '),\n(291,'AgamandMillsE',0,85,157,6,10,4,2973.71,619.932,93.8373,1.31013,'289:0 290:0 '),\n(292,'SollidenFarmstead',0,85,156,1,10,4,2329.03,1407.79,33.3337,0.622907,'286:0 288:0 293:0 294:0 '),\n(293,'CrusadersOutpost',0,85,85,1,10,4,2430.28,1585.02,37.0619,0.587566,'288:0 292:0 '),\n(294,'UndeadStartExit',0,85,85,5,10,4,2197.51,1192.39,31.5497,5.11342,'288:0 286:0 292:0 295:0 '),\n(295,'UndeadStartEnd',0,85,154,1,10,4,2061.91,1418.99,63.8379,5.30978,'294:0 83:0 4:0 296:0 '),\n(296,'UndeadStartE',0,85,154,1,10,4,1805.3,1351.42,87.1354,0.232168,'295:0 4:0 '),\n(297,'TH_exitS',0,85,85,7,12,4,1642.09,555.658,33.4922,2.88878,'278:0 285:0 287:0 298:0 '),\n(298,'ShiningStrandN',0,130,927,8,14,4,1331.69,679.903,40.5373,1.02387,'297:0 200:0 '),\n(299,'DeadField',0,130,240,8,20,4,1076.06,1545.35,28.6412,4.79771,'201:0 300:0 301:0 302:0 303:0 200:0 '),\n(300,'SkitteringDark',0,130,226,8,20,4,1271.34,1974.49,17.8502,4.31862,'299:0 301:0 '),\n(301,'NorthTidesHollow',0,130,305,8,20,4,833.25,1880.5,21.9868,5.06279,'299:0 300:0 '),\n(302,'SPF_hubC1',0,130,130,8,20,4,867.729,1518.72,35.2045,0.160734,'201:0 299:0 303:0 304:0 '),\n(303,'SPF_hubC2',0,130,130,8,20,4,934.532,1356.51,43.5579,3.0887,'201:0 299:0 302:0 200:0 305:0 '),\n(304,'SPF_hubC3',0,130,130,8,20,4,736.764,1449.26,64.4284,0.457609,'302:0 305:0 306:0 '),\n(305,'SPF_hubC4',0,130,130,8,20,4,587.903,1352.93,90.6192,0.359403,'303:0 304:0 306:0 17:0 313:0 '),\n(306,'DecrepitFerry',0,130,237,13,20,4,664.305,1021.48,45.3265,5.10911,'304:0 305:0 307:0 '),\n(307,'FenrisIsle',0,130,172,15,20,4,704.961,674.359,43.3624,1.57874,'306:0 308:0 311:0 '),\n(308,'FenrisIsleSE',0,130,172,15,20,4,653.059,335.097,35.0481,1.33722,'307:0 309:0 '),\n(309,'FenrisIsleE',0,130,232,16,20,4,866.03,78.8803,34.2361,2.23258,'308:0 310:0 '),\n(310,'DawningIsles',0,130,232,17,22,4,1199.57,370.42,34.3257,3.13185,'309:0 '),\n(311,'FenrisKeep',0,130,172,8,20,4,1013.6,734.689,59.2651,3.23986,'307:0 '),\n(312,'DeepElemMineFork',0,130,213,8,20,4,271.231,1110.33,80.2136,5.99661,'313:0 314:0 317:0 318:0 '),\n(313,'SPF_hubC5',0,130,130,8,20,4,385.877,1253.37,80.2878,0.320144,'305:0 312:0 315:0 '),\n(314,'DeepElemMine',0,130,213,8,20,4,376.82,1082.54,106.396,3.03959,'312:0 '),\n(315,'SPF_hubC6',0,130,130,8,20,4,194.263,1268.01,72.8331,6.23812,'313:0 316:0 317:0 318:0 '),\n(316,'OlsensFarthing',0,130,229,8,20,4,171.155,1487.65,114.395,4.84404,'315:0 '),\n(317,'SPF_DalaranCamp1',0,130,130,8,20,4,-50.4703,1331.43,60.9321,5.92005,'315:0 312:0 318:0 319:0 323:0 '),\n(318,'SPF_hubS1',0,130,130,8,20,4,-132.172,1170.25,63.4384,0.508657,'315:0 317:0 312:0 319:0 323:0 326:0 '),\n(319,'AmberhillEntrance',0,130,233,11,20,4,-131.822,896.74,65.831,1.54539,'317:0 318:0 320:0 321:0 323:0 325:0 '),\n(320,'AmberhillHall',0,130,233,13,20,4,-141.972,812.61,63.737,1.09457,'319:0 '),\n(321,'AmberhillFarms',0,130,233,15,20,4,88.1028,694.265,60.6053,2.4376,'322:0 319:0 '),\n(322,'AmberhillMurlocCamp',0,130,130,15,20,4,434.265,696.251,33.7837,3.19747,'321:0 '),\n(323,'SPF_hubS2',0,130,130,8,20,4,-330.828,1311.68,37.1012,1.70757,'317:0 318:0 319:0 324:0 326:0 327:0 '),\n(324,'PyrewoodVillage',0,130,204,8,20,4,-383.772,1597.45,16.8392,4.90611,'323:0 '),\n(325,'SPF_exitSE',0,130,130,15,20,4,-543.136,724.877,91.2236,0.975962,'319:0 326:0 357:0 '),\n(326,'SPF_hubS3',0,130,130,8,20,4,-503.287,1113.31,76.93,0.514545,'318:0 323:0 325:0 '),\n(327,'GreymaneWall',0,130,230,8,20,4,-744.895,1522.56,15.5245,5.84742,'323:0 '),\n(328,'DandredsFold',0,36,1682,35,40,0,1235.47,-274.821,40.3856,4.48552,'329:0 '),\n(329,'UplandsN',0,36,284,28,40,0,1085.27,-663.59,87.8456,1.24773,'328:0 330:0 '),\n(330,'UplandsS',0,36,284,28,40,0,958.693,-748.597,114.797,4.04964,'329:0 331:0 335:0 '),\n(331,'Strahnbard',0,36,280,28,40,0,683.909,-963.157,164.301,0.671641,'330:0 332:0 343:0 '),\n(332,'AM_hubE1',0,36,36,28,40,0,615.654,-1043.7,168.11,0.331968,'331:0 333:0 381:0 '),\n(333,'AM_hubE2',0,36,1684,36,42,0,641.277,-1429.39,84.6042,5.55291,'332:0 334:0 '),\n(334,'ChillwindCampRoad',0,28,3197,48,56,0,966.365,-1511.29,75.4645,2.81971,'173:0 271:0 272:0 333:0 '),\n(335,'SlaughterHollowNE',0,36,283,28,40,0,802.9,-628.854,149.733,3.01018,'330:0 336:0 337:0 '),\n(336,'SlaughterHollowN',0,36,283,28,40,0,835.191,-445.445,134.228,4.48673,'335:0 '),\n(337,'SlaughterHollowC',0,36,281,28,40,0,620.637,-522.586,179.928,5.73159,'335:0 338:0 343:0 '),\n(338,'RuinsOfAlterac',0,36,281,28,40,0,631.058,-371.491,154.481,2.42898,'340:0 337:0 339:0 '),\n(339,'RuinsOfAlteracSW',0,36,281,28,40,0,500.776,-173.116,151.449,5.19357,'340:0 338:0 341:0 '),\n(340,'RuinsOfAlteracSE',0,36,281,28,40,0,397.344,-248.661,161.727,5.94755,'338:0 339:0 '),\n(341,'RuinsOfAlteracE',0,36,281,28,40,0,573.088,-14.3215,142.366,3.66008,'339:0 342:0 '),\n(342,'RuinsOfAlteracSSW',0,36,1683,28,40,0,252.323,-82.4394,141.544,0.263228,'341:0 344:0 '),\n(343,'RuinsOfAlteracE',0,36,1357,28,40,0,493.629,-621.553,172.877,0.602885,'331:0 337:0 344:0 345:0 380:0 '),\n(344,'RuinsOfAlteracS',0,36,1683,28,40,0,141.788,-316.452,150.648,1.12125,'342:0 343:0 346:0 '),\n(345,'CorrahnsDagger',0,36,1679,28,40,0,-45.3608,-581.074,153.724,5.82187,'343:0 346:0 380:0 '),\n(346,'CorrahnsDaggerFork',0,36,1679,28,40,0,57.1052,-405.389,132.108,2.70582,'344:0 345:0 347:0 385:0 '),\n(347,'Headland',0,36,1680,28,40,0,-163.833,-293.019,151.411,0.123425,'346:0 348:0 '),\n(348,'GavinsNaze',0,36,1677,28,40,0,-63.0062,-197.056,131.24,2.72704,'347:0 349:0 350:0 355:0 '),\n(349,'GavinsNazeTop',0,36,1677,28,40,0,-125.184,-59.9939,147.694,5.63693,'348:0 350:0 '),\n(350,'GavinsNazeW',0,36,279,28,40,0,68.1015,-53.44,99.6287,3.99152,'348:0 349:0 351:0 352:0 353:0 '),\n(351,'DalaranCraterN',0,36,279,28,40,4,466.751,167.322,41.9053,3.38088,'350:0 352:0 '),\n(352,'DalaranCraterS',0,36,279,28,40,4,90.2654,237.935,43.2902,5.2894,'351:0 350:0 353:0 354:0 '),\n(353,'LordamereInternmentCamp',0,36,278,28,40,4,-90.5356,218.366,53.2755,6.11997,'352:0 350:0 354:0 '),\n(354,'HillsbradFieldsC',0,267,286,18,30,4,-499.681,78.0454,56.6165,0.278575,'352:0 353:0 356:0 355:0 '),\n(355,'HillsbradFieldsE',0,267,286,18,30,0,-437.039,-135.243,56.2029,2.13409,'354:0 356:0 348:0 385:0 '),\n(356,'HillsbradFieldsSRoad',0,267,267,18,30,0,-639.845,-98.2014,47.262,0.172558,'20:0 358:0 360:0 354:0 355:0 361:0 385:0 357:0 '),\n(357,'SouthPointTower',0,267,285,18,30,5,-613.976,388.915,83.0604,2.91123,'325:0 356:0 358:0 '),\n(358,'WesternStrandW',0,267,295,18,30,0,-979.029,273.179,7.90667,5.62479,'356:0 359:0 357:0 '),\n(359,'WesternStrandSW',0,267,295,18,30,0,-1128.84,276.704,0.0000662804,5.89576,'358:0 360:0 '),\n(360,'WesternStrandS',0,267,295,18,30,0,-1156.55,7.61478,0.00000548363,6.16081,'359:0 356:0 361:0 '),\n(361,'WesternStrandS',0,267,295,18,30,0,-1102.38,-114.03,0.0000309944,0.148599,'362:0 360:0 356:0 '),\n(362,'WesternStrandE',0,267,271,18,30,0,-962.262,-506.545,2.13023,1.90396,'361:0 363:0 20:0 '),\n(363,'SouthshoreS',0,267,271,18,30,0,-974.276,-592.998,0.229758,0.372044,'362:0 364:0 20:0 '),\n(364,'EasternStrandW',0,267,294,18,30,0,-1012.85,-790.213,9.01406,5.30042,'363:0 365:0 368:0 376:0 '),\n(365,'EasternStrandC',0,267,294,18,30,0,-1183.14,-847.579,1.43171,6.18988,'364:0 366:0 '),\n(366,'EasternStrandS',0,267,294,18,30,0,-1311.64,-1052.47,18.2271,0.929683,'365:0 367:0 368:0 '),\n(367,'DunGarok',0,267,290,18,30,4,-1256.01,-1190.37,38.9786,2.03514,'366:0 368:0 376:0 '),\n(368,'DunGarokRoad',0,267,267,18,30,0,-1049.49,-1239.84,53.3175,1.75045,'364:0 366:0 367:0 369:0 373:0 '),\n(369,'HillsbradFoothillsExitSE',0,267,267,18,30,0,-784.955,-1512.45,56.6724,1.97822,'370:0 368:0 373:0 410:0 '),\n(370,'HillsbradFoothillsExitE',0,267,275,18,30,0,-594.279,-1721.03,62.3187,2.25507,'369:0 371:0 411:0 '),\n(371,'DurnholdeNE',0,267,275,18,30,0,-383.173,-1720.01,90.0634,3.41784,'372:0 370:0 '),\n(372,'DurnholdeNNE',0,267,275,18,30,0,-316.76,-1609.34,86.0559,5.49914,'371:0 377:0 386:0 '),\n(373,'DurnholdeS',0,267,267,18,30,0,-669.891,-1326.66,66.6887,5.65621,'376:0 374:0 368:0 369:0 383:0 '),\n(374,'DurnholdeInside',0,267,275,18,30,0,-518.661,-1435.16,64.889,2.5637,'373:0 375:0 '),\n(375,'DurnholdeInsideDeep',0,267,275,18,30,0,-512.473,-1541.62,67.1947,1.69387,'374:0 '),\n(376,'NethanderStead',0,267,289,18,30,0,-915.831,-926.49,31.1754,1.19711,'364:0 367:0 373:0 383:0 20:0 '),\n(377,'DurnholdeN',0,267,275,18,30,0,-298.033,-1310.71,76.9034,4.69017,'372:0 378:0 383:0 '),\n(378,'DurnholdeNN',0,267,267,18,30,0,-37.1467,-1296.59,83.7166,3.13705,'377:0 21:0 '),\n(379,'TarrenMillN',0,267,267,18,30,4,188.047,-974.547,75.5356,0.0209713,'21:0 381:0 '),\n(380,'GallowsCorner',0,36,1357,28,40,0,324.254,-615.115,145.246,3.03887,'343:0 345:0 21:0 382:0 '),\n(381,'SoferasCorner',0,36,36,28,40,0,461.934,-926.633,129.374,2.72668,'379:0 332:0 382:0 '),\n(382,'SoferasNaze',0,36,1678,28,40,0,248.314,-839.928,146.333,0.818164,'381:0 380:0 '),\n(383,'HFH_bridge',0,267,267,18,30,0,-487.607,-967.55,34.4918,4.54488,'377:0 376:0 373:0 384:0 '),\n(384,'DarrowHillE',0,267,267,18,30,0,-323.998,-672.57,54.6417,3.9048,'21:0 383:0 385:0 20:0 '),\n(385,'DarrowHillW',0,267,1056,18,30,0,-332.483,-447.42,58.4647,0.297842,'346:0 355:0 356:0 384:0 20:0 '),\n(386,'HinterlandsEntrance',0,47,47,38,50,0,-77.4076,-1845.63,143.116,2.46164,'372:0 55:0 '),\n(387,'ZunWatha',0,47,352,38,50,0,-11.9998,-2493.37,119.659,1.99629,'55:0 82:0 388:0 391:0 '),\n(388,'QuelDanilS',0,47,47,38,50,0,65.3995,-2664.2,111.823,5.20269,'55:0 82:0 387:0 389:0 390:0 391:0 392:0 '),\n(389,'QuelDanil',0,47,350,38,50,4,210.196,-2789.46,122.156,1.50935,'388:0 390:0 392:0 '),\n(390,'HL_hubW',0,47,47,38,50,0,132.208,-2876.17,116.583,1.69588,'388:0 389:0 392:0 393:0 397:0 398:0 '),\n(391,'BogensLedge',0,47,1887,38,50,0,-198.398,-2585.67,120.378,6.18051,'387:0 388:0 393:0 '),\n(392,'HiriWatha',0,47,1885,38,50,0,-35.4616,-2815.33,122.143,0.435323,'389:0 390:0 388:0 393:0 '),\n(393,'ShadraAlorEntrance',0,47,47,38,50,0,-160.179,-2955.33,115.773,1.96371,'391:0 392:0 390:0 395:0 394:0 396:0 398:0 400:0 '),\n(394,'ShadraAlorE',0,47,353,38,50,0,-366.126,-2955.41,89.39,6.27554,'393:0 395:0 396:0 '),\n(395,'ShadraAlorS',0,47,353,38,50,0,-455.461,-2839.4,105.834,6.08704,'393:0 394:0 396:0 '),\n(396,'ShadraAlorW',0,47,353,38,50,0,-296.621,-2833,96.7074,5.15045,'393:0 395:0 394:0 '),\n(397,'AgolWatha',0,47,1884,38,50,0,397.177,-3352.2,123.451,2.24644,'390:0 398:0 399:0 '),\n(398,'CreepingRun',0,47,1886,38,50,0,116.576,-3466.05,107.658,1.12922,'393:0 397:0 390:0 399:0 400:0 401:0 '),\n(399,'SkulkRock',0,47,351,38,50,0,363.014,-3796.73,171.76,1.54745,'397:0 398:0 401:0 404:0 '),\n(400,'AltarOfZul',0,47,355,38,50,0,-147.861,-3319.03,121.957,3.93113,'393:0 398:0 '),\n(401,'HL_hubC',0,47,47,38,50,0,109.926,-3922.75,136.697,0.948588,'398:0 399:0 402:0 403:0 404:0 '),\n(402,'JinthaAlor',0,47,354,38,50,0,-217.196,-4159.98,118.665,0.453769,'401:0 403:0 '),\n(403,'OverlookCliffsS',0,47,307,38,50,0,-150.233,-4250.21,120.905,4.17653,'401:0 402:0 405:0 '),\n(404,'SeradaneBridge',0,47,351,38,50,0,472.513,-3907.18,113.731,5.88677,'399:0 401:0 409:0 '),\n(405,'OverlookCliffsRampTop',0,47,307,38,50,0,-243.665,-4377.48,105.997,0.98978,'403:0 406:0 '),\n(406,'OverlookCliffsRampBottom',0,47,307,38,50,0,-3.15739,-4629.26,13.899,2.27391,'405:0 407:0 408:0 '),\n(407,'RevantuskOutside',0,47,307,38,50,0,-355.789,-4475.87,11.3783,0.924997,'406:0 179:0 '),\n(408,'OverlookCliffsEnd',0,47,307,38,50,0,133.371,-4745.73,2.05405,2.27392,'406:0 '),\n(409,'Seradane',0,47,356,60,80,0,755.958,-4011.61,92.8808,5.95432,'404:0 '),\n(410,'ArathiExitNW',0,45,334,28,40,0,-889.426,-1677.32,57.6111,1.06053,'369:0 411:0 412:0 414:0 '),\n(411,'ArathiExitN',0,45,45,28,40,0,-684.458,-1831.3,53.3946,0.936824,'370:0 410:0 412:0 413:0 '),\n(412,'ArathiCW',0,45,45,28,40,0,-863.176,-1785.9,39.6302,5.66886,'410:0 411:0 413:0 414:0 '),\n(413,'NorthfoldManor',0,45,313,28,40,0,-822.895,-2039.83,34.4558,1.25884,'411:0 412:0 415:0 '),\n(414,'Arathi_hubW',0,45,45,28,40,0,-1190.48,-1731.63,56.3674,6.26181,'410:0 412:0 415:0 420:0 '),\n(415,'NorthfoldManor',0,45,313,28,40,0,-933.512,-2120.29,56.5869,2.05011,'78:0 413:0 414:0 416:0 '),\n(416,'RefugePointeExitN',0,45,315,28,40,0,-1158.07,-2706.9,52.0215,2.18796,'78:0 22:0 415:0 417:0 418:0 419:0 435:0 '),\n(417,'DabyrieFarmstead',0,45,45,28,40,0,-1091.19,-2856.55,42.4006,1.78073,'416:0 418:0 435:0 436:0 '),\n(418,'ArathiCO',0,45,336,28,40,0,-1352.09,-2738.95,59.0948,6.08275,'416:0 417:0 419:0 431:0 432:0 435:0 '),\n(419,'RefugePointeExitS',0,45,45,28,40,0,-1466.43,-2424.6,57.8277,5.98262,'22:0 78:0 416:0 418:0 420:0 427:0 429:0 431:0 '),\n(420,'StromgardeRoad',0,45,45,28,40,0,-1323.01,-1833.39,63.6564,0.712589,'421:0 414:0 419:0 427:0 '),\n(421,'StromgardeInside',0,45,324,28,40,0,-1576.29,-1800.48,67.6512,3.46934,'422:0 423:0 424:0 420:0 '),\n(422,'StromgardeKeep',0,45,324,28,40,0,-1660.06,-1803.63,83.0724,6.27321,'421:0 426:0 '),\n(423,'StromgardeE',0,45,324,28,40,0,-1602.44,-1922.26,67.2707,1.50115,'421:0 '),\n(424,'StromgardeW1',0,45,324,28,40,0,-1596.2,-1745.56,67.3627,5.09826,'421:0 425:0 '),\n(425,'StromgardeW2',0,45,324,28,40,0,-1720.34,-1736.69,52.4064,6.26851,'424:0 81:0 '),\n(426,'StromgardeKeepSide',0,45,324,28,40,0,-1681.32,-1933.25,80.6272,1.35821,'422:0 '),\n(427,'ArathiCI',0,45,335,28,40,0,-1517.62,-2100.44,22.3405,4.92548,'419:0 420:0 428:0 '),\n(428,'ThandolRoadN',0,45,45,28,40,0,-1995.23,-2466.74,78.7992,0.837489,'427:0 429:0 441:0 '),\n(429,'ArathiRoadSmid',0,45,45,28,40,0,-1763.42,-2422.8,59.5627,0.9015,'419:0 428:0 431:0 430:0 '),\n(430,'BoulderfistHall',0,45,316,28,40,0,-1941.13,-2794.22,85.7724,0.38314,'429:0 431:0 432:0 '),\n(431,'Arathi_hubE1',0,45,45,28,40,0,-1570.23,-2675.51,35.6533,6.03014,'419:0 418:0 429:0 432:0 435:0 430:0 '),\n(432,'Arathi_hubE2',0,45,317,28,40,0,-1705.19,-3021.39,31.689,0.310091,'433:0 418:0 431:0 434:0 430:0 '),\n(433,'WitherbarkVillage',0,45,317,28,40,0,-1867.12,-3365.42,56.1179,1.07782,'432:0 '),\n(434,'GoshekFarm',0,45,314,28,40,0,-1526.14,-3075.57,14.1487,2.82925,'432:0 435:0 '),\n(435,'Arathi_hubNE1',0,45,45,28,40,0,-1297.32,-3141.76,34.9289,1.25489,'416:0 417:0 418:0 431:0 434:0 436:0 438:0 '),\n(436,'Arathi_hubNE2',0,45,45,28,40,0,-1005.91,-3313.55,55.2766,2.32737,'435:0 417:0 437:0 438:0 '),\n(437,'ArathiCE',0,45,333,28,40,0,-839.717,-3280.93,78.5616,3.98495,'436:0 438:0 '),\n(438,'HammerfallEntrance',0,45,321,28,40,0,-1164.53,-3558.81,50.1497,1.47167,'435:0 436:0 437:0 23:0 439:0 '),\n(439,'DrywhiskerGorgeOutside',0,45,318,28,40,0,-1086,-3696.31,81.3913,2.10981,'438:0 440:0 '),\n(440,'DrywhiskerGorgeEntrance',0,45,318,28,40,0,-1083.95,-3820.83,128.504,1.71515,'439:0 44:0 '),\n(441,'ArathiRoadSbottom',0,45,880,28,40,0,-2248.64,-2487.38,80.1236,4.70713,'428:0 442:0 443:0 '),\n(442,'ThandolSpanCamp',0,45,45,28,40,0,-2249.4,-2633.38,78.816,1.44851,'441:0 '),\n(443,'ThandolSpanS',0,11,881,18,30,0,-2478.16,-2506.16,78.5672,0.110205,'441:0 444:0 '),\n(444,'DunModrCamp',0,11,881,18,30,0,-2609.79,-2494.69,80.9667,1.57693,'443:0 6:0 445:0 '),\n(445,'Wetlands_hubN1',0,11,11,18,30,0,-2937.95,-2470.57,26.6988,6.13028,'444:0 446:0 447:0 461:0 462:0 '),\n(446,'DaggerforgeHill',0,11,1016,18,30,0,-2859.63,-2907.96,33.1564,1.54551,'445:0 448:0 449:0 '),\n(447,'WL_hubC1',0,11,11,18,30,0,-3206.06,-2452.65,10.0327,5.76822,'445:0 448:0 455:0 461:0 462:0 '),\n(448,'Greenwarden',0,11,1025,18,30,0,-3254.89,-2726.4,9.41813,1.21683,'446:0 447:0 449:0 455:0 458:0 '),\n(449,'WL_hubE1',0,11,11,18,30,0,-3421.46,-3088.4,22.5006,4.5862,'446:0 448:0 450:0 451:0 455:0 456:0 '),\n(450,'RaptorRidge',0,11,1017,23,30,0,-3132.51,-3240.98,63.5747,2.76015,'449:0 451:0 '),\n(451,'DragonmawGates',0,11,1038,61,70,0,-3452,-3659.86,58.5533,1.08333,'449:0 450:0 452:0 '),\n(452,'DragonmawGatesI1',0,11,1038,61,70,0,-3594.66,-4056.85,113.625,1.23963,'451:0 453:0 '),\n(453,'DragonmawGatesI2',0,11,1038,61,70,0,-3956.61,-4019.52,170.857,6.00896,'452:0 454:0 '),\n(454,'DragonmawGatesI3',0,11,1037,61,70,0,-4145.01,-3662.88,204.651,5.17056,'92:0 453:0 '),\n(455,'WL_hubS1',0,11,1020,18,30,0,-3777.35,-2817.99,12.647,0.508038,'447:0 448:0 449:0 456:0 457:0 '),\n(456,'MosshideFen',0,11,1020,18,30,0,-3913.48,-3043.47,11.7092,0.398469,'449:0 455:0 457:0 '),\n(457,'ThelgenRock',0,11,1021,18,30,0,-3921.58,-2647.27,36.3203,4.94005,'455:0 456:0 479:0 '),\n(458,'AngerfangEnampmentE',0,11,1036,18,30,0,-3503.17,-2440.43,48.2306,5.48001,'448:0 459:0 '),\n(459,'AngerfangEnampmentW',0,11,1036,18,30,0,-3354.34,-2190.82,45.3521,1.88565,'458:0 460:0 461:0 '),\n(460,'AngerfangEnampmentTop',0,11,1036,18,30,0,-3458.4,-2008.76,119.804,5.31784,'459:0 '),\n(461,'WL_hubW1',0,11,11,18,30,0,-3186.98,-2117.49,15.8054,4.81126,'445:0 447:0 459:0 462:0 463:0 467:0 '),\n(462,'IronbeardsTomb',0,11,309,18,30,0,-2861.94,-2217.72,29.2628,4.06121,'445:0 447:0 461:0 463:0 464:0 '),\n(463,'MosshideWest',0,11,11,18,30,0,-2916.55,-1848.65,10.201,4.36986,'461:0 462:0 464:0 465:0 466:0 467:0 '),\n(464,'BaradinBayN',0,11,1023,18,30,5,-2598.33,-1745.42,10.159,4.05766,'462:0 463:0 465:0 466:0 '),\n(465,'BaradinBayNW',0,11,298,18,30,0,-2723.52,-1348.51,9.75282,4.1578,'464:0 463:0 466:0 474:0 '),\n(466,'BaradinBayW',0,11,1022,18,30,0,-2951.24,-1112.1,9.14625,2.36904,'464:0 463:0 465:0 474:0 475:0 476:0 '),\n(467,'WhelgarsOutside',0,11,1024,18,30,0,-3208.01,-1693.31,8.6748,4.04314,'461:0 463:0 468:0 473:0 474:0 '),\n(468,'WhelgarsEntrance',0,11,118,18,30,0,-3328.04,-1856.79,25.9266,3.14189,'467:0 469:0 470:0 '),\n(469,'WhelgarsBottom',0,11,118,18,30,0,-3540.59,-1803.75,24.3572,5.93869,'468:0 '),\n(470,'WhelgarsRamp',0,11,118,18,30,0,-3370.49,-1931.82,63.5201,0.805329,'468:0 471:0 '),\n(471,'WhelgarsRampTop',0,11,118,18,30,0,-3471.16,-1925.52,113.829,3.80162,'470:0 472:0 '),\n(472,'WhelgarsCave',0,11,118,18,30,0,-3569.75,-1976.96,117.678,0.449137,'471:0 '),\n(473,'BlueChannelMarsh',0,11,1018,18,30,0,-3582.96,-1324.33,9.39017,5.56012,'467:0 474:0 476:0 '),\n(474,'BluegillMarsh',0,11,1022,18,30,0,-3135.95,-1301.23,7.27194,1.32132,'465:0 466:0 467:0 473:0 475:0 476:0 '),\n(475,'BaradinBayS',0,11,298,18,30,0,-3202.27,-925.946,8.88303,5.67636,'466:0 474:0 476:0 '),\n(476,'MenethilHarborRoad',0,11,1022,18,30,2,-3333.27,-1053.79,8.28482,2.51317,'11:0 466:0 473:0 474:0 475:0 '),\n(477,'MenethilBayS',0,11,298,18,30,2,-3909.27,-638.054,4.91793,5.35238,'11:0 '),\n(478,'MenethilBayN',0,11,298,18,30,2,-3732.25,-581.622,4.65228,4.77512,'11:0 '),\n(479,'DunAlgazBottom',0,11,836,18,30,0,-4086.88,-2624.69,43.3702,1.60133,'457:0 480:0 '),\n(480,'DunAlgazMid1',0,11,836,18,30,0,-4092.37,-2403.53,100.01,4.74881,'479:0 481:0 '),\n(481,'DunAlgazMid2',0,11,836,18,30,0,-3994.82,-2377.44,120.415,3.60017,'480:0 482:0 '),\n(482,'DunAlgazMid3',0,11,836,18,30,0,-4070,-2464.84,155.161,3.20551,'481:0 483:0 '),\n(483,'DunAlgazMid4',0,11,836,18,30,0,-4418.61,-2470.44,212.203,0.00303268,'482:0 5:0 484:0 '),\n(484,'DunAlgazMid5',0,11,836,18,30,0,-4453.35,-2691.02,268.159,1.48548,'483:0 485:0 '),\n(485,'DunAlgazTop',0,38,837,8,20,0,-4741.84,-2699.03,325.269,6.26389,'484:0 91:0 487:0 488:0 '),\n(486,'NorthGatePassBottom',0,38,838,8,20,2,-4797.55,-2537.41,354.11,2.07534,'91:0 524:0 '),\n(487,'SilverStreamMine',0,38,149,8,20,2,-4801.44,-2968.22,321.735,1.63004,'91:0 485:0 488:0 '),\n(488,'StonewroughDamW',0,38,146,8,20,2,-4676.63,-3184.73,310.249,2.0836,'487:0 485:0 489:0 '),\n(489,'StonewroughDamC',0,38,146,8,20,2,-4761.78,-3306.52,310.258,4.81285,'488:0 490:0 '),\n(490,'StonewroughDamE',0,38,146,8,20,2,-4680.9,-3464.1,310.208,3.57506,'489:0 491:0 '),\n(491,'TheLochNE',0,38,38,8,20,2,-4859.79,-3631.09,306.481,2.35809,'490:0 492:0 495:0 496:0 497:0 '),\n(492,'MogroshStronghold',0,38,143,8,20,2,-4884.91,-3956.61,298.791,3.26837,'491:0 493:0 494:0 495:0 '),\n(493,'MogroshStrongholdTop',0,38,143,8,20,2,-4853.52,-4046.55,315.354,1.54756,'492:0 '),\n(494,'LochModanE',0,38,38,8,20,2,-5200.93,-4080.99,324.555,1.53421,'492:0 495:0 512:0 '),\n(495,'LochModanC2',0,38,38,8,20,2,-5358.15,-3755.11,304.073,5.92655,'491:0 492:0 494:0 496:0 506:0 512:0 '),\n(496,'LochIsleE',0,38,38,8,20,2,-4983.21,-3478.31,305.5,4.76612,'491:0 495:0 497:0 498:0 '),\n(497,'LochIsleW',0,38,38,8,20,2,-4869.1,-3302.75,307.516,3.90807,'491:0 496:0 498:0 '),\n(498,'LochIsleS',0,38,38,8,20,2,-5031.68,-3316.94,298.701,5.51616,'497:0 496:0 499:0 '),\n(499,'LochC1',0,38,556,8,20,2,-5138.3,-3125.08,302.046,2.10361,'498:0 502:0 '),\n(500,'LochW1',0,38,38,8,20,2,-5067.56,-2665.82,323.188,6.27801,'91:0 501:0 502:0 '),\n(501,'LochW2',0,38,38,8,20,2,-5383.73,-2741.02,362.182,0.255963,'500:0 502:0 503:0 '),\n(502,'LochW3',0,38,38,8,20,0,-5215.01,-2861.61,336.947,0.715418,'91:0 499:0 500:0 501:0 503:0 '),\n(503,'ThelsamarEntrance',0,38,38,8,20,0,-5405.86,-2884.97,342.8,0.491581,'501:0 502:0 19:0 504:0 515:0 '),\n(504,'LochC3',0,38,144,8,20,0,-5441.5,-3109.22,349.359,0.721317,'503:0 19:0 505:0 '),\n(505,'LochS',0,38,38,8,20,0,-5860.82,-3292.84,292.88,5.93047,'504:0 506:0 621:0 '),\n(506,'IronbandsExcavationOutside',0,38,142,8,20,2,-5617.55,-3680.57,313.913,2.11697,'495:0 505:0 507:0 509:0 '),\n(507,'IronbandsExcavationSW',0,38,142,8,20,2,-5787.94,-3777.91,328.169,4.57725,'506:0 508:0 510:0 '),\n(508,'IronbandsExcavationInside1',0,38,142,8,20,2,-5722.82,-3946.06,324.917,2.02667,'507:0 509:0 '),\n(509,'IronbandsExcavationInside2',0,38,142,8,20,2,-5578.49,-3926.28,327.498,1.64379,'506:0 508:0 '),\n(510,'LochCornerSE',0,38,147,8,20,2,-5843.55,-4145.23,387.605,1.3532,'507:0 511:0 512:0 '),\n(511,'FastriderLodgeEntrance',0,38,147,8,20,2,-5555.41,-4251.75,380.644,2.87687,'510:0 512:0 513:0 '),\n(512,'LochModanSE',0,38,147,8,20,2,-5553.71,-4104.44,372.683,1.01823,'494:0 495:0 510:0 511:0 '),\n(513,'FarstriderLodge',0,38,147,8,20,2,-5621.61,-4334.97,403.763,0.951478,'511:0 514:0 '),\n(514,'FarstriderLodgeInside',0,38,147,8,20,3,-5674.26,-4247.48,407.006,5.29276,'513:0 '),\n(515,'LochModanSW1',0,38,38,8,20,2,-5673.4,-2775.82,363.022,5.89359,'503:0 516:0 519:0 '),\n(516,'StonesplinterValley1',0,38,923,8,20,2,-5878.01,-2909.13,366.788,0.558766,'515:0 517:0 518:0 '),\n(517,'StonesplinterValley2',0,38,923,8,20,2,-6057.08,-3024.86,403.365,0.541086,'516:0 '),\n(518,'StonesplinterValley3',0,38,923,8,20,2,-6077.12,-2770.04,413.566,5.71294,'516:0 '),\n(519,'LochModanSW2',0,38,924,8,20,2,-5804.6,-2605.8,316.201,6.15474,'515:0 520:0 521:0 '),\n(520,'LochModanSW3',0,38,924,8,20,2,-6029.33,-2496.11,310.016,2.1924,'519:0 561:0 '),\n(521,'SouthGatePassBottom',0,38,839,8,20,2,-5690.63,-2589.07,346.087,0.415367,'519:0 522:0 '),\n(522,'SouthGateOutpost',0,1,806,1,10,0,-5520.09,-2399.78,400.417,2.27487,'521:0 523:0 '),\n(523,'SouthGatePassTop',0,1,805,1,10,2,-5636.7,-2242.95,424.761,5.34381,'522:0 527:0 69:0 '),\n(524,'NorthGatePassTop1',0,1,808,1,10,2,-4911.88,-2330.69,408.794,5.22601,'486:0 525:0 '),\n(525,'NorthGatePassBottom2',0,1,808,1,10,2,-5204.26,-2288.4,400.984,2.97781,'524:0 526:0 '),\n(526,'NorthGatePassTop2',0,1,807,1,10,2,-5294.53,-2180,423.003,2.8011,'525:0 527:0 '),\n(527,'DunMoroghPassFork',0,1,1,1,10,2,-5515.28,-2008.17,399.376,4.60752,'526:0 523:0 528:0 '),\n(528,'DunMoroghE1',0,1,1,1,10,2,-5509.11,-1798.18,397.338,5.99176,'527:0 69:0 529:0 '),\n(529,'GolBolarFork',0,1,1,1,10,2,-5611.84,-1487.57,399.057,5.05517,'528:0 530:0 533:0 '),\n(530,'GolBolarCamp',0,1,134,1,10,2,-5711.36,-1562.28,383.568,2.84075,'529:0 531:0 '),\n(531,'GolBolarQuarry1',0,1,134,1,10,2,-5849.25,-1514.03,358.812,5.96152,'530:0 532:0 '),\n(532,'GolBolarQuarry2',0,1,134,1,10,2,-5737.17,-1683.52,362.196,6.04595,'531:0 '),\n(533,'TundridHills',0,1,804,1,10,2,-5651.13,-1033.73,410.816,4.75985,'529:0 534:0 536:0 556:0 '),\n(534,'Vagash1',0,1,1,1,10,2,-5422.73,-1195.14,450.063,2.06791,'533:0 535:0 '),\n(535,'Vagash2',0,1,803,1,10,2,-5417.7,-1264.17,446.78,2.22146,'534:0 '),\n(536,'DunMoroghS1',0,1,1,1,10,2,-5892.71,-628.276,400.121,5.26175,'533:0 537:0 '),\n(537,'DwarfGnomeStartExit1',0,1,1,1,10,2,-5975.18,-476.82,406.774,5.36188,'536:0 9:0 538:0 '),\n(538,'DwarfGnomeStartExit2',0,1,1,1,10,2,-6013.25,-224.693,412.196,4.79638,'537:0 539:0 '),\n(539,'DwarfGnomeStartExit3',0,1,800,1,10,2,-5890.34,69.4737,372.157,4.07706,'538:0 540:0 545:0 546:0 '),\n(540,'ColdridgePass1',0,1,800,1,10,2,-6066.08,42.2314,408.342,0.120498,'539:0 541:0 '),\n(541,'ColdridgePass2',0,1,800,4,10,2,-6231.65,125.6,430.753,5.63871,'540:0 542:0 '),\n(542,'DwarfGnomeStart1',0,1,132,1,10,3,-6261.08,369.552,383.537,4.94484,'541:0 1:0 543:0 544:0 '),\n(543,'DwarfGnomeStart2',0,1,132,1,10,2,-6482.65,496.244,386.328,5.80485,'542:0 544:0 '),\n(544,'DwarfGnomeStart3',0,1,132,1,10,2,-6269.69,741.137,386.893,4.77403,'542:0 543:0 '),\n(545,'GrizzledDen',0,1,136,1,10,2,-5690.95,-281.229,364.314,5.54297,'539:0 9:0 '),\n(546,'DunMoroghSW1',0,1,1,1,10,2,-5756.39,127.948,368.817,4.07511,'539:0 547:0 548:0 '),\n(547,'OldIcebeard',0,1,801,1,10,2,-5602.44,-28.5472,416.22,2.31387,'546:0 '),\n(548,'DunMoroghW1',0,1,135,1,10,2,-5661.62,365.277,393.274,4.27146,'546:0 549:0 550:0 551:0 '),\n(549,'FrostmaneHold',0,1,135,1,10,2,-5549.4,568.067,394.761,1.30462,'548:0 551:0 '),\n(550,'GnomereganS',0,1,133,1,10,2,-5183.81,585.068,404.291,4.35,'548:0 551:0 '),\n(551,'IceflowLake',0,1,211,1,10,2,-5250.86,115.774,394.041,2.85773,'548:0 549:0 550:0 552:0 555:0 '),\n(552,'ShimmerRidge1',0,1,802,1,10,2,-5266.4,-149.752,437.903,6.01894,'551:0 553:0 '),\n(553,'ShimmerRidge2',0,1,802,1,10,2,-5088.11,-166.104,442.035,0.727311,'552:0 554:0 555:0 '),\n(554,'ShimmerRidge3',0,1,802,1,10,2,-5043,-267.85,441.4,2.19994,'553:0 '),\n(555,'ShimmerRidge4',0,1,802,1,10,2,-5021.64,-132.237,411.899,3.77858,'553:0 551:0 '),\n(556,'DunmoroghC1',0,1,1,1,10,2,-5391.34,-928.482,393.467,4.06525,'533:0 557:0 '),\n(557,'IronforgeRamp',0,1,1,1,10,2,-5259.37,-493.579,386.436,3.14828,'556:0 9:0 558:0 '),\n(558,'IronforgeRampMid',0,1,809,1,10,2,-5197.66,-730.697,445.722,5.89324,'557:0 559:0 '),\n(559,'IronforgeRampTop',0,1,809,1,10,2,-5060.46,-745.984,480.27,3.47972,'558:0 8:0 '),\n(560,'IronforgeBank',0,1537,1537,1,10,3,-4909.88,-969.761,501.463,5.46481,'8:0 '),\n(561,'SGgate',0,51,1959,43,54,0,-6413.58,-2007.56,244.634,2.74852,'520:0 562:0 563:0 '),\n(562,'DustfireValleyMid',0,51,1959,43,54,0,-6590.48,-1884.27,245.713,1.74321,'561:0 580:0 585:0 '),\n(563,'SGexitE',0,51,51,43,54,0,-6906.38,-1818.59,241.661,5.89992,'561:0 564:0 566:0 593:0 '),\n(564,'GrimesiltDigSite',0,51,247,43,54,0,-7019.65,-1698.57,241.667,5.46992,'563:0 565:0 566:0 567:0 568:0 '),\n(565,'TannerCamp',0,51,1958,43,54,0,-7225.75,-1752.49,244.286,0.924438,'564:0 566:0 567:0 568:0 '),\n(566,'SGtower4',0,51,1444,43,54,0,-6980,-1505.92,242.742,3.93841,'563:0 564:0 565:0 567:0 568:0 '),\n(567,'SGtower3',0,51,1444,43,54,0,-7036.7,-1320.2,244.272,4.7631,'565:0 564:0 566:0 568:0 '),\n(568,'SGsouth1',0,51,1444,43,54,0,-7155.86,-1317.76,242.155,5.03211,'565:0 569:0 567:0 564:0 566:0 '),\n(569,'BRM_SG1',0,51,1445,43,54,0,-7215.95,-1057.94,242.73,1.72755,'571:0 568:0 570:0 572:0 573:0 '),\n(570,'BRM_SG2',0,25,25,46,60,0,-7399.25,-1106.95,278.077,0.229401,'569:0 622:0 '),\n(571,'SGwest1',0,51,51,43,54,0,-7085,-941.753,268.272,4.123,'569:0 572:0 573:0 '),\n(572,'SGtower2',0,51,51,43,54,0,-7001.07,-1109.84,243.97,2.78587,'571:0 569:0 573:0 '),\n(573,'SGwest2',0,51,51,43,54,0,-6974.99,-1007.32,241.667,3.29324,'571:0 569:0 572:0 574:0 588:0 '),\n(574,'CauldronRampTop',0,51,246,43,54,0,-6974.25,-1172.02,228.781,3.87051,'573:0 575:0 '),\n(575,'CauldronRampMid1',0,51,246,43,54,0,-7024.61,-1220.88,207.974,5.71816,'574:0 576:0 '),\n(576,'CauldronRampMid2',0,51,246,43,54,0,-6955.19,-1270.62,180.686,0.528642,'575:0 577:0 581:0 '),\n(577,'CauldronRampBottom',0,51,246,43,54,0,-6866.28,-1410.17,172.855,2.20156,'576:0 578:0 '),\n(578,'CauldronRamp2Bottom',0,51,246,43,54,0,-6712.76,-1610.77,196.339,2.17329,'577:0 579:0 '),\n(579,'CauldronRamp2Mid',0,51,246,43,54,0,-6668.28,-1664.76,229.053,1.92432,'578:0 580:0 '),\n(580,'CauldronRamp2Top',0,51,246,43,54,0,-6680,-1730.07,255.913,4.54363,'562:0 579:0 '),\n(581,'SlagPit1',0,51,1443,43,54,0,-6850.01,-1218.8,177.395,3.61294,'576:0 582:0 '),\n(582,'SlagPit2',0,51,1443,43,54,0,-6764.59,-1174.15,187.213,1.12951,'581:0 583:0 '),\n(583,'SlagPit3',0,51,1443,43,54,0,-6439.47,-1311.02,180.938,2.63197,'582:0 584:0 '),\n(584,'SlagPit4',0,51,1443,43,54,0,-6631.29,-1289.33,208.714,0.00481129,'583:0 '),\n(585,'SG_hubN1',0,51,51,43,54,0,-6686.77,-1347.22,247.961,4.79378,'562:0 586:0 588:0 589:0 '),\n(586,'CauldronTopN',0,51,246,43,54,0,-6862.1,-1188.37,240.366,5.51045,'585:0 '),\n(587,'FirewatchRidgeBottom',0,51,1442,43,54,0,-6612.66,-860.886,244.297,0.237204,'588:0 589:0 591:0 '),\n(588,'FirewatchRidgeS',0,51,1442,43,54,0,-6817.17,-866.771,248.462,4.87941,'573:0 585:0 587:0 '),\n(589,'ThoriumPointRampBottom',0,51,1442,43,54,0,-6608.41,-1025.59,244.328,1.21161,'587:0 585:0 590:0 '),\n(590,'ThoriumPointRampTop',0,51,1446,43,54,1,-6473.64,-1104.63,303.285,2.64303,'589:0 180:0 '),\n(591,'FirewatchRidgeTop1',0,51,1442,43,54,0,-6473.38,-887.709,324.088,3.80543,'587:0 592:0 '),\n(592,'FirewatchRidgeTop2',0,51,1442,43,54,0,-6502.46,-1018.74,344.372,1.2407,'591:0 '),\n(593,'SGexitEmid',0,51,51,43,54,0,-6952.2,-2064.74,282.478,5.11429,'563:0 594:0 '),\n(594,'BLexitW',0,3,3,33,45,0,-6885.86,-2233.35,242.64,0.361067,'593:0 595:0 24:0 '),\n(595,'ApocryphansRest',0,3,337,33,45,0,-6892.26,-2477.47,247.238,1.71982,'594:0 87:0 596:0 597:0 600:0 601:0 602:0 '),\n(596,'CampCaggS',0,3,344,33,45,0,-7270.91,-2407.34,268.195,5.1163,'595:0 597:0 '),\n(597,'CampCaggE',0,3,3,33,45,0,-7140.34,-2650.51,243.568,0.467924,'595:0 596:0 602:0 603:0 '),\n(598,'KargathE',0,3,3,33,45,0,-6600.53,-2373.56,254.037,0.026153,'600:0 599:0 24:0 '),\n(599,'KargathNE',0,3,3,33,45,0,-6431.02,-2454.24,321.326,3.51922,'598:0 600:0 '),\n(600,'DustbowlW',0,3,1878,33,45,0,-6718.55,-2572.24,241.801,0.471881,'595:0 598:0 599:0 601:0 602:0 '),\n(601,'DustbowlNE',0,3,1878,33,45,0,-6653.03,-2889.09,241.667,2.73974,'595:0 600:0 602:0 620:0 '),\n(602,'BL_hubC',0,3,1879,33,45,0,-6902.56,-2958.24,244.772,1.67356,'600:0 597:0 601:0 595:0 608:0 603:0 '),\n(603,'AgmondsendS',0,3,345,33,45,0,-7141.97,-3251.77,246.326,0.774282,'597:0 602:0 604:0 605:0 607:0 '),\n(604,'BL_elemsS',0,3,3,33,45,0,-7319.09,-3144.54,317.901,5.93436,'603:0 '),\n(605,'AgmondsEnd',0,3,345,33,45,0,-7033.01,-3313.39,238.277,2.5061,'603:0 606:0 607:0 609:0 '),\n(606,'BL_elemsSE',0,3,3,33,45,0,-7339.37,-3450.9,320.961,0.385524,'605:0 '),\n(607,'CampBoff',0,3,342,33,45,0,-7039.11,-3655.92,244.152,1.66966,'603:0 605:0 608:0 609:0 '),\n(608,'BL_hubN1',0,3,1877,33,45,0,-6667.51,-3285.91,241.069,2.14484,'25:0 602:0 607:0 609:0 620:0 '),\n(609,'BL_hubNE1',0,3,1898,33,45,0,-6775.23,-3555.53,245.004,5.79028,'605:0 607:0 608:0 610:0 617:0 620:0 '),\n(610,'LethlorRavineEntranceS',0,3,339,38,45,0,-6742.54,-3895.6,264.574,1.61394,'609:0 611:0 '),\n(611,'LethlorRavineS',0,3,339,38,45,0,-7002.17,-3938.58,263.889,5.47219,'610:0 612:0 '),\n(612,'LethlorRavineC',0,3,339,38,45,0,-6820.98,-4135.08,263.933,2.32276,'611:0 613:0 '),\n(613,'LethlorRavineN',0,3,339,38,45,0,-6424.74,-4106.41,263.889,3.0143,'612:0 614:0 '),\n(614,'LethlorRavineNW',0,3,339,38,45,0,-6513.4,-4004.6,264.394,5.30492,'613:0 615:0 '),\n(615,'LethlorRavineEntranceN',0,3,339,38,45,0,-6396.09,-3976.18,268.618,3.37284,'614:0 616:0 '),\n(616,'LethlorRavineExitN',0,3,1898,38,45,0,-6467.07,-3837.32,315.608,5.41801,'615:0 617:0 '),\n(617,'CampKoshS',0,3,1898,33,45,0,-6360.66,-3685.6,245.154,4.17511,'616:0 609:0 618:0 619:0 '),\n(618,'CampKosh',0,3,341,33,45,0,-6249.45,-3750.01,243.041,2.72409,'617:0 619:0 '),\n(619,'HammertoesDigsite',0,3,346,33,45,0,-6349.91,-3447.28,241.681,0.369852,'617:0 618:0 620:0 621:0 '),\n(620,'BL_hubN2',0,3,338,33,45,0,-6494.59,-3248.21,242.617,1.06886,'25:0 601:0 608:0 609:0 619:0 '),\n(621,'MakersTerrace',0,3,1897,33,45,0,-6056.99,-3302.11,258.645,3.45646,'86:0 505:0 619:0 '),\n(622,'BRM_SG3',0,25,25,46,60,0,-7496.19,-1063.83,264.543,4.72301,'570:0 623:0 628:0 '),\n(623,'BRM_chain1',0,25,25,46,60,0,-7501.48,-1151.43,269.644,1.34305,'622:0 624:0 627:0 '),\n(624,'BRM_chain2',0,25,25,46,60,0,-7599.78,-1110.62,249.93,1.94977,'623:0 625:0 '),\n(625,'BRM_chain3',0,25,25,46,60,0,-7523.43,-1048.09,180.912,0.471264,'624:0 626:0 '),\n(626,'BRM_chain4',0,25,25,46,60,0,-7383.99,-1012.09,173.658,3.00809,'625:0 '),\n(627,'BRM_BRS1',0,25,25,46,60,0,-7609.9,-1226.43,233.401,0.518375,'623:0 628:0 '),\n(628,'BRM_BS1',0,25,25,46,60,0,-7697.61,-1089.8,217.609,3.00611,'627:0 622:0 629:0 '),\n(629,'BRM_BS2',0,25,25,46,60,0,-7769.06,-1129.81,215.084,0.38328,'628:0 630:0 '),\n(630,'BRM_BS3',0,25,25,46,60,0,-7993.75,-1138.96,163.061,0.128021,'629:0 631:0 637:0 639:0 641:0 '),\n(631,'DracodarNW',0,46,2421,48,56,0,-7968.74,-817.038,131.202,4.58672,'630:0 632:0 636:0 '),\n(632,'AltarOfStormsRoad',0,46,46,48,56,0,-7803.25,-717,176.761,6.28318,'631:0 633:0 '),\n(633,'AltarOfStormsFork',0,46,255,48,56,0,-7679.67,-712.976,183.628,3.3461,'632:0 634:0 635:0 '),\n(634,'AltarOfStormsVendor',0,46,255,48,56,0,-7644.75,-636.535,200.452,4.00749,'633:0 '),\n(635,'AltarOfStorms1',0,46,255,48,56,0,-7626.75,-709.048,183.359,5.20123,'633:0 2368:0 '),\n(636,'DracodarW',0,46,2421,48,56,0,-8170.67,-727.141,135.21,5.81979,'631:0 637:0 '),\n(637,'DracodarS',0,46,2421,48,56,0,-8255.07,-1040.7,147.3,0.143321,'630:0 636:0 638:0 639:0 '),\n(638,'DracodarS_hill1',0,46,2421,48,56,0,-8419.15,-933.413,214.705,5.70788,'637:0 '),\n(639,'DracodarSE',0,46,46,48,56,0,-8254.03,-1168.68,144.64,0.0510463,'630:0 637:0 640:0 641:0 '),\n(640,'DracodarS_hill2',0,46,46,48,56,0,-8431.62,-1227.92,207.816,0.498725,'639:0 '),\n(641,'DracodarHub',0,46,46,48,56,0,-8073.86,-1401.78,132.05,4.03301,'630:0 639:0 642:0 644:0 645:0 '),\n(642,'BlackrockStrongholdOutside',0,46,46,48,56,0,-7757.29,-1591.7,133.263,1.43923,'641:0 643:0 644:0 646:0 '),\n(643,'BlackrockStrongholdInside',0,46,252,48,56,0,-7698.11,-1443.02,139.787,4.00159,'642:0 '),\n(644,'PillarOfAshS',0,46,46,48,56,0,-8232.79,-1737.58,147.888,6.17911,'641:0 642:0 645:0 658:0 '),\n(645,'PillarOfAshE',0,46,253,48,56,0,-8102.12,-1922.65,134.695,1.31201,'641:0 644:0 646:0 647:0 658:0 '),\n(646,'ThaurissanNW',0,46,250,48,56,0,-7704.8,-2045.32,133.437,1.61634,'642:0 645:0 139:0 647:0 648:0 '),\n(647,'DreadmaulRockW',0,46,249,48,56,0,-7971.45,-2449.46,130.882,1.47692,'646:0 645:0 648:0 652:0 654:0 658:0 659:0 660:0 '),\n(648,'DreadmaulRockNW',0,46,249,48,56,0,-7665.96,-2453.95,147.044,2.94798,'647:0 646:0 138:0 649:0 654:0 '),\n(649,'DreadmaulRockNE',0,46,249,48,56,0,-7765.85,-2707.5,172.836,1.14313,'648:0 650:0 655:0 '),\n(650,'DreadmaulRockSE',0,46,2420,48,56,0,-8161.75,-2869.02,134.8,0.000368118,'649:0 138:0 651:0 652:0 659:0 '),\n(651,'MorgansVigil',0,46,2418,48,56,3,-8379.57,-2741.96,186.492,6.13436,'650:0 652:0 659:0 '),\n(652,'DreadmaulRockTop1',0,46,249,48,56,0,-7971.64,-2664.1,198.213,2.32517,'647:0 650:0 651:0 138:0 653:0 '),\n(653,'DreadmaulRockTop2',0,46,249,48,56,0,-7873.63,-2613.13,221.072,2.92403,'652:0 '),\n(654,'DreadmaulRockNWW',0,46,249,48,56,0,-7776.13,-2493.23,160.084,5.03518,'648:0 647:0 '),\n(655,'DreadmaulRockInside1',0,46,249,48,56,0,-7848.98,-2661.75,172.955,1.73534,'649:0 656:0 657:0 '),\n(656,'DreadmaulRockInside2',0,46,249,48,56,0,-7961.48,-2603.36,173.834,6.08133,'655:0 '),\n(657,'DreadmaulRockInside3',0,46,249,48,56,0,-7975.04,-2695.45,157.958,5.80842,'655:0 '),\n(658,'DreadmaulPassW',0,46,46,48,56,0,-8216.14,-2308.1,151.442,1.03911,'644:0 645:0 647:0 659:0 '),\n(659,'DreadmaulPassN',0,46,46,48,56,0,-8150.16,-2629.44,133.659,1.18246,'647:0 650:0 651:0 658:0 660:0 '),\n(660,'DreadmaulPass',0,46,2417,48,56,0,-8431.68,-2546.4,133.207,6.07628,'647:0 659:0 661:0 '),\n(661,'RedridgeExitN',0,44,44,13,25,0,-8900,-2574.56,131.851,0.152413,'660:0 75:0 663:0 '),\n(662,'RendersRockInside',0,44,998,13,25,0,-8738.68,-2205.37,149.754,2.59501,'75:0 '),\n(663,'AlthersMillEntrance',0,44,97,13,25,0,-9153.73,-2628.6,109.561,0.156359,'661:0 664:0 690:0 '),\n(664,'RedridgeHub1',0,44,44,13,25,0,-9099.79,-2451.23,120.464,0.197585,'663:0 665:0 667:0 669:0 '),\n(665,'RedridgeBridgeN',0,44,69,13,25,2,-9287.68,-2284.47,67.5443,5.81789,'664:0 10:0 672:0 673:0 '),\n(666,'RedridgeW',0,44,44,13,25,2,-9312.11,-1873.26,82.1473,5.08747,'10:0 672:0 '),\n(667,'RedridgeCanyons1',0,44,95,13,25,2,-8916.14,-2305.07,134.682,3.96044,'664:0 668:0 670:0 '),\n(668,'RedridgeCanyons2',0,44,95,13,25,2,-8864.57,-2150.9,133.327,3.71892,'667:0 669:0 670:0 '),\n(669,'RedridgeCanyons3',0,44,69,13,25,2,-9145.97,-2198.54,119.516,4.7478,'668:0 664:0 670:0 '),\n(670,'RedridgeCanyons4',0,44,95,13,25,2,-9135.91,-2029.37,127.775,5.01877,'667:0 668:0 669:0 77:0 '),\n(671,'RethbanCavernsInside',0,44,98,13,25,0,-8826.83,-1947.01,133.091,2.11555,'77:0 '),\n(672,'RedridgeBridgeS',0,44,44,13,25,2,-9503.49,-2289.12,74.7234,1.13183,'665:0 666:0 674:0 675:0 '),\n(673,'EverstillN',0,44,68,13,25,2,-9263.45,-2458.04,56.1636,1.20646,'665:0 '),\n(674,'ThreeCorners',0,44,1002,13,25,0,-9607.09,-2055.97,65.077,4.99696,'672:0 675:0 692:0 693:0 694:0 '),\n(675,'RedridgeS1',0,44,1001,13,25,0,-9713.82,-2284.16,63.9369,5.46531,'672:0 674:0 676:0 677:0 '),\n(676,'RedridgeS2',0,44,68,13,25,0,-9620.32,-2514.61,59.4453,0.974015,'675:0 677:0 '),\n(677,'RedridgeS3',0,44,1001,13,25,0,-9624.96,-2717.09,56.3955,1.53951,'676:0 675:0 678:0 679:0 691:0 '),\n(678,'StonewatchS',0,44,70,18,25,0,-9468.55,-3007.78,135.551,1.52185,'677:0 689:0 '),\n(679,'RedridgeS4',0,44,997,13,25,0,-9751.37,-3185.18,58.6091,5.63735,'677:0 680:0 681:0 '),\n(680,'RedridgeE1',0,44,997,13,25,0,-9611,-3315.1,49.8404,2.09716,'679:0 681:0 682:0 683:0 684:0 '),\n(681,'RedridgeE2',0,44,71,13,25,0,-9499.43,-3249.9,50.6,3.02197,'679:0 680:0 '),\n(682,'RedridgeE3',0,44,44,18,25,2,-9598.71,-3503.57,121.964,2.30923,'680:0 683:0 '),\n(683,'RedridgeE4',0,44,71,18,25,1,-9465.03,-3460.8,116.076,2.91242,'680:0 682:0 74:0 684:0 '),\n(684,'RedridgeE5',0,44,71,18,25,0,-9469.61,-3328.04,5.51622,4.94268,'680:0 683:0 '),\n(685,'RedridgeNE',0,44,1000,18,25,0,-9116.4,-3271.35,104.33,2.00332,'74:0 686:0 687:0 '),\n(686,'RedridgeE6',0,44,1000,18,25,0,-9317.33,-3210.41,107.191,5.54352,'685:0 74:0 687:0 '),\n(687,'StonewatchFork',0,44,70,18,25,0,-9195.1,-3020.88,94.6252,4.57746,'686:0 685:0 688:0 689:0 690:0 '),\n(688,'StonewatchTower',0,44,999,18,25,0,-9297.56,-2958.62,128.754,5.64364,'687:0 689:0 '),\n(689,'StonewatchTop',0,44,2099,18,25,0,-9364.92,-3072.52,164.756,3.2698,'687:0 688:0 678:0 '),\n(690,'AlthersMillCenter',0,44,97,13,25,0,-9215.61,-2770.74,89.3399,4.66193,'687:0 663:0 '),\n(691,'EverstillE',0,44,44,13,25,0,-9457.68,-2870.36,85.486,2.24488,'677:0 '),\n(692,'ThreeCornersCamp1',0,44,1002,13,25,0,-9472.89,-1956.22,83.561,4.19346,'674:0 693:0 694:0 '),\n(693,'RedridgeExitW1',0,44,1002,13,25,2,-9620.34,-1809.71,51.8565,1.49408,'692:0 674:0 694:0 696:0 '),\n(694,'RedridgeExitW2',0,44,1002,13,25,0,-9831.1,-1766.69,23.8242,2.51983,'692:0 674:0 693:0 695:0 792:0 '),\n(695,'ElwynnHubS1',0,12,798,1,10,2,-9928.36,-1115.12,24.1788,6.21189,'705:0 704:0 694:0 696:0 706:0 '),\n(696,'ElwynnHubE1',0,12,12,1,10,2,-9659.48,-1341.54,48.8561,4.72993,'693:0 697:0 698:0 704:0 695:0 '),\n(697,'EastvaleLC1',0,12,88,1,10,2,-9405,-1343.43,50.0284,2.89799,'696:0 698:0 699:0 '),\n(698,'StoneCairnLakeSE',0,12,86,1,10,2,-9299.52,-1180.36,69.4951,3.31622,'696:0 697:0 699:0 701:0 797:0 '),\n(699,'StoneCairnLakeNE',0,12,86,1,10,2,-8956.22,-1264.96,77.7779,2.94511,'700:0 697:0 698:0 797:0 '),\n(700,'StoneCairnLakeNW',0,12,86,1,10,2,-8860.62,-826.796,71.9141,4.57088,'699:0 701:0 797:0 '),\n(701,'StoneCairnLakeSW',0,12,12,1,10,2,-9355.59,-802.598,64.4981,0.692979,'89:0 700:0 708:0 698:0 705:0 706:0 707:0 797:0 '),\n(702,'JasperlodeMineInside1',0,12,54,1,10,2,-9125.33,-585.357,58.3507,3.90606,'89:0 703:0 '),\n(703,'JasperlodeMineInside2',0,12,54,1,10,2,-9049.44,-618.138,53.1456,4.05725,'702:0 '),\n(704,'ElwynnHubE2',0,12,12,1,10,2,-9613.79,-1100.85,40.5009,4.62273,'696:0 705:0 695:0 '),\n(705,'ElwynnHubE3',0,12,12,1,10,2,-9618.95,-1024.81,40.4731,4.99973,'704:0 695:0 701:0 706:0 707:0 '),\n(706,'BrackwellPumpkinPatch',0,12,62,1,10,2,-9777.88,-877.924,39.5328,5.4101,'705:0 701:0 695:0 707:0 '),\n(707,'ElwynnHubC1',0,12,12,1,10,2,-9609.57,-527.364,55.1285,4.48725,'89:0 708:0 701:0 705:0 706:0 716:0 '),\n(708,'CrystalLakeE',0,12,18,1,10,2,-9464.16,-422.645,58.9952,3.63313,'89:0 701:0 707:0 709:0 '),\n(709,'CrystalLakeW',0,12,18,1,10,2,-9470.07,-173.045,59.9322,4.58858,'708:0 710:0 7:0 '),\n(710,'NorthshireExit',0,12,12,1,10,2,-9133.8,-66.2742,82.4151,1.35237,'709:0 16:0 13:0 7:0 '),\n(711,'EchoRidgeMineInside',0,12,34,1,10,2,-8560.22,-214.447,85.0045,2.95145,'70:0 '),\n(712,'TradeDistrict',0,1519,1519,1,10,3,-8794.44,645.505,94.4595,3.54245,'16:0 '),\n(713,'ForestsEdgeS',0,12,60,1,10,2,-10070.2,658.114,37.3319,5.88491,'72:0 88:0 717:0 '),\n(714,'FargodeepMineOutside',0,12,57,1,10,2,-9868.23,221.066,14.0194,6.19474,'7:0 71:0 72:0 715:0 '),\n(715,'FargodeepMineInside',0,12,57,1,10,2,-9779.25,104.966,4.57989,3.01191,'714:0 '),\n(716,'ElwynnHubS2',0,12,12,1,10,2,-9808.32,-269.092,40.0067,5.15408,'71:0 707:0 '),\n(717,'ElwynnExitW',0,12,60,1,10,2,-9747.07,741.601,25.5892,4.55914,'7:0 88:0 72:0 713:0 718:0 '),\n(718,'WestfallExitNE',0,40,916,8,20,2,-9853.3,918.261,30.2216,5.34454,'717:0 719:0 745:0 746:0 '),\n(719,'Longshore1',0,40,2,8,20,2,-9616.19,1059.16,5.79699,0.013632,'720:0 718:0 745:0 '),\n(720,'Longshore2',0,40,2,8,20,2,-9634.2,1389.29,9.09694,4.71817,'719:0 721:0 '),\n(721,'Longshore3',0,40,2,8,20,2,-9648.12,1575.23,3.54258,4.75547,'720:0 722:0 '),\n(722,'Longshore4',0,40,2,8,20,2,-9776.1,1654.24,11.5179,2.15188,'721:0 723:0 742:0 743:0 '),\n(723,'Longshore5',0,40,2,8,20,2,-9985.75,1913.6,4.86301,5.35756,'722:0 724:0 742:0 '),\n(724,'Longshore6',0,40,2,8,20,2,-10334,2061.94,3.69692,5.05125,'723:0 725:0 739:0 '),\n(725,'Longshore7',0,40,2,8,20,2,-10695.4,2102.07,8.28685,6.14098,'724:0 726:0 738:0 '),\n(726,'Longshore8',0,40,2,8,20,2,-10975.2,2108.77,-0.213533,6.27058,'725:0 727:0 737:0 '),\n(727,'Longshore9',0,40,2,8,20,2,-11307.8,1926.18,9.26031,4.25015,'726:0 728:0 '),\n(728,'Longshore10',0,40,2,8,20,2,-11466.2,1725.82,8.61195,0.641238,'727:0 729:0 '),\n(729,'DaggerHillsW',0,40,920,8,20,2,-11264.1,1714.56,39.9062,4.76851,'728:0 730:0 737:0 '),\n(730,'DaggerHillsC1',0,40,920,8,20,2,-11258.8,1470.77,88.9353,4.93148,'729:0 731:0 '),\n(731,'DaggerHillsC2',0,40,920,8,20,2,-11211.1,1297.89,91.1699,1.90966,'730:0 732:0 733:0 '),\n(732,'DaggerHillsNook',0,40,920,8,20,2,-11235.2,1182.36,91.6522,1.1871,'731:0 733:0 '),\n(733,'DaggerHillsE',0,40,920,8,20,2,-11062.7,1163.02,43.0261,2.75789,'736:0 732:0 731:0 734:0 735:0 750:0 '),\n(734,'DustPlains',0,40,922,8,20,2,-11152,739.176,32.5228,1.40505,'733:0 735:0 750:0 '),\n(735,'DeadAcre',0,40,917,8,20,2,-10770.8,864.294,33.1505,2.913,'736:0 733:0 734:0 746:0 750:0 '),\n(736,'WestfallHubC1',0,40,40,8,20,2,-10842.5,1196.94,34.875,1.14192,'12:0 15:0 735:0 733:0 738:0 741:0 750:0 '),\n(737,'DemontsPlace',0,40,921,8,20,2,-11087.9,1894.97,35.4372,5.06105,'726:0 729:0 12:0 738:0 '),\n(738,'AlexstonFarmstead',0,40,219,8,20,2,-10615,1671.77,41.41,4.1441,'737:0 725:0 12:0 741:0 742:0 736:0 '),\n(739,'GoldCoastQuarry',0,40,113,8,20,2,-10403.7,1909.99,9.96272,4.64675,'724:0 740:0 741:0 '),\n(740,'GoldCoastQuarryInside',0,40,113,8,20,2,-10575.3,1990.25,-8.03668,3.01509,'739:0 '),\n(741,'WestfallHubC2',0,40,40,8,20,2,-10495.4,1349.24,42.6842,1.76042,'738:0 739:0 15:0 742:0 745:0 736:0 '),\n(742,'WestfallHubC3',0,40,918,8,20,2,-10274.9,1408.84,38.9079,3.90454,'741:0 738:0 723:0 722:0 15:0 743:0 745:0 '),\n(743,'JangolodeMine',0,40,111,8,20,2,-10017,1466.37,41.0745,6.08639,'742:0 722:0 744:0 745:0 '),\n(744,'JangolodeMineInside',0,40,111,8,20,2,-9887.11,1427.15,40.0346,0.896887,'743:0 '),\n(745,'SaldeansFarm',0,40,107,8,20,2,-10154.1,1116.55,36.8816,1.65283,'15:0 718:0 719:0 741:0 742:0 743:0 746:0 '),\n(746,'WestfallHubE1',0,40,40,8,20,2,-10333.7,859.579,39.774,0.563072,'15:0 718:0 735:0 745:0 752:0 '),\n(747,'DefiasHideout',0,1581,1581,15,22,2,-11112,1483.69,32.39,3.56723,'12:0 748:0 '),\n(748,'Deadmines1',0,1581,1581,15,22,2,-11252.8,1533.82,28.6803,0.814416,'747:0 749:0 '),\n(749,'Deadmines2',0,1581,1581,15,22,2,-11214.4,1638.37,27.2613,1.55073,'748:0 '),\n(750,'WestfallExitSE',0,40,40,8,20,2,-10870.3,667.353,30.8385,4.48578,'733:0 734:0 735:0 736:0 15:0 751:0 '),\n(751,'DuskwoodExitW',0,10,10,18,30,0,-10857.5,557.367,30.4883,6.27453,'750:0 752:0 14:0 753:0 755:0 '),\n(752,'HushedBankN',0,10,1097,18,30,0,-10326.3,623.959,26.42,3.17024,'746:0 751:0 757:0 758:0 763:0 '),\n(753,'AddlesSteadW',0,10,536,18,30,0,-11054.9,270.776,25.2035,6.01338,'751:0 14:0 754:0 '),\n(754,'AddlesSteadE',0,10,536,18,30,0,-10997.4,179.443,30.4059,1.04377,'753:0 14:0 766:0 '),\n(755,'RHCemetaryS',0,10,492,18,30,0,-10587.6,294.965,31.0441,0.0129175,'751:0 14:0 756:0 757:0 765:0 766:0 '),\n(756,'RHCemetaryNE',0,10,492,24,30,0,-10398,201.223,34.2462,5.21064,'755:0 757:0 758:0 762:0 764:0 765:0 '),\n(757,'RHCemetaryW',0,10,492,22,30,0,-10427.4,409.679,46.6267,4.40525,'752:0 755:0 756:0 758:0 759:0 '),\n(758,'RHCemetaryN',0,10,243,24,30,0,-10308.2,348.036,59.693,3.07006,'752:0 757:0 756:0 '),\n(759,'DawningWoodCatacombs1',0,10,2098,18,30,0,-10261.5,383.964,10.414,2.92673,'757:0 760:0 '),\n(760,'DawningWoodCatacombs2',0,10,2098,18,30,0,-10234.6,284.99,2.79944,4.82935,'759:0 761:0 '),\n(761,'DawningWoodCatacombs3',0,10,2098,18,30,0,-10220.1,166.144,0.047382,3.23144,'760:0 762:0 '),\n(762,'DawningWoodCatacombs4',0,10,2098,18,30,0,-10338.4,136.513,4.82896,0.380849,'756:0 761:0 '),\n(763,'DuskwoodNW1',0,10,799,18,30,0,-10173.2,350.099,32.3759,4.62356,'752:0 764:0 '),\n(764,'DuskwoodNW2',0,10,799,18,30,0,-10183.8,-55.3832,27.6626,5.67208,'763:0 756:0 765:0 793:0 '),\n(765,'DuskwoodC1',0,10,10,18,30,0,-10482,-16.5716,51.5694,0.81242,'764:0 755:0 756:0 766:0 '),\n(766,'DuskwoodC2',0,10,10,18,30,0,-10750.8,67.4617,28.3337,1.80202,'765:0 755:0 14:0 754:0 767:0 '),\n(767,'DuskwoodC3',0,10,10,18,30,0,-10910.1,-371.894,39.8351,3.06651,'766:0 768:0 769:0 773:0 774:0 775:0 779:0 795:0 '),\n(768,'DuskwoodExitS',0,10,10,18,30,0,-11268.2,-368.936,61.3823,6.14723,'767:0 858:0 '),\n(769,'VulGolOgreMound1',0,10,93,24,30,0,-11005.9,-176.407,14.5532,5.12818,'767:0 770:0 771:0 '),\n(770,'VulGolOgreMound2',0,10,93,24,30,0,-10959.3,-38.5543,13.6432,4.44096,'769:0 771:0 '),\n(771,'VulGolOgreMound3',0,10,93,24,30,0,-11083.6,-80.7448,16.7954,5.39522,'769:0 770:0 772:0 '),\n(772,'VulGolOgreMoundInside',0,10,93,24,30,0,-11234.1,-172.07,4.22438,4.5174,'771:0 '),\n(773,'YorgenFarmsteadW',0,10,245,24,30,0,-11096.9,-452.028,32.1764,4.54422,'767:0 774:0 '),\n(774,'YorgenFarmsteadE',0,10,245,24,30,0,-11052.8,-598.054,29.3447,1.47723,'767:0 773:0 776:0 '),\n(775,'DuskwoodC4',0,10,10,18,30,0,-10908,-739.892,54.8364,0.583838,'767:0 776:0 778:0 779:0 '),\n(776,'RottingOrchardW',0,10,241,18,30,0,-10986.3,-770.892,55.1122,1.55183,'774:0 775:0 777:0 778:0 '),\n(777,'RottingOrchardS',0,10,241,18,30,0,-11103.5,-891.729,62.1149,0.69773,'776:0 778:0 '),\n(778,'DuskwoodC5',0,10,10,18,30,0,-10823,-837.935,55.75,1.63037,'775:0 776:0 777:0 779:0 780:0 '),\n(779,'DuskwoodC6',0,10,10,18,30,0,-10768,-644.008,42.2621,2.90859,'767:0 775:0 778:0 786:0 '),\n(780,'DuskwoodE1',0,10,42,18,30,0,-10757.1,-1156.72,24.9918,1.69202,'778:0 124:0 782:0 783:0 '),\n(781,'RolandsDoomInside',0,10,2161,24,30,0,-11157.5,-1167.04,42.5151,0.315576,'124:0 '),\n(782,'TranquilGardensCemetery',0,10,121,18,30,0,-11023.4,-1315.7,53.1833,6.14911,'780:0 783:0 '),\n(783,'DuskwoodE2',0,10,10,18,30,0,-10813.8,-1366.37,42.2527,0.00140238,'780:0 782:0 3:0 784:0 794:0 '),\n(784,'DarkshireExitE',0,10,10,18,30,0,-10539.7,-1338.09,48.0906,1.65268,'785:0 783:0 3:0 '),\n(785,'DuskwoodExitE',0,10,10,18,30,0,-10442.9,-1486.98,73.8977,5.13748,'784:0 798:0 '),\n(786,'DuskwoodC7',0,10,242,24,30,0,-10451.9,-825.607,50.4132,2.61635,'779:0 787:0 788:0 793:0 '),\n(787,'DuskwoodC8',0,10,242,24,30,0,-10647.9,-908.344,50.934,5.93661,'786:0 3:0 788:0 '),\n(788,'DuskwoodNE1',0,10,242,18,30,0,-10219.2,-1021.98,31.9202,2.92658,'786:0 787:0 3:0 789:0 790:0 793:0 '),\n(789,'ManorMismantle',0,10,1098,24,30,0,-10332.7,-1264.03,35.3024,1.53643,'788:0 3:0 790:0 '),\n(790,'DuskwoodNE2',0,10,10,18,30,0,-10181.4,-1145.35,24.304,3.28393,'788:0 789:0 791:0 793:0 '),\n(791,'DuskwoodNE3',0,10,10,18,30,0,-10067.1,-1379.68,29.9246,1.99195,'790:0 792:0 '),\n(792,'DuskwoodExitNE',0,10,10,18,30,0,-9963.01,-1637.21,27.2574,2.08816,'694:0 791:0 '),\n(793,'DuskwoodN',0,10,799,18,30,0,-10020.5,-660.012,39.1578,1.66406,'790:0 788:0 764:0 786:0 '),\n(794,'Naraxis',0,10,10,18,30,0,-10619.4,-1502.44,90.534,3.1465,'783:0 '),\n(795,'TwilightGroveEntrance',0,10,10,50,60,0,-10718.7,-425.681,126.691,0.442773,'767:0 796:0 '),\n(796,'TwilightGrove',0,10,856,50,60,0,-10419.3,-421.597,45.6561,3.03852,'795:0 '),\n(797,'HeroesVigil',0,12,56,1,10,0,-9101.04,-1034.1,72.9837,5.20227,'698:0 699:0 700:0 701:0 '),\n(798,'DWPExitW',0,41,2697,50,60,0,-10464.2,-1734.78,86.7801,1.49361,'785:0 171:0 802:0 '),\n(799,'DeadwindRavineSW',0,41,2558,50,60,0,-10919.4,-1957.74,114.777,4.67839,'171:0 800:0 '),\n(800,'TheViceW',0,41,2561,50,60,0,-10843.3,-2118.87,121.161,1.51324,'799:0 172:0 79:0 '),\n(801,'DWPExitE',0,41,2938,50,60,0,-10593.5,-2125.78,90.9212,3.83802,'172:0 170:0 802:0 811:0 '),\n(802,'DeadsmansCrossingE',0,41,41,50,60,0,-10437,-2037.61,94.6245,1.59492,'798:0 801:0 810:0 '),\n(803,'GroshgokCompoundInside',0,41,2937,50,60,0,-11169.4,-2483.11,105.139,0.944598,'79:0 '),\n(804,'KarazhanOutskirts',0,41,2562,50,60,0,-11148.9,-2130,55.9803,1.2403,'79:0 805:0 806:0 '),\n(805,'Karazhan',0,41,2562,50,60,0,-11115.2,-2008.72,48.4017,4.31317,'804:0 806:0 '),\n(806,'KarazhanCellarEntrance',0,41,2837,50,60,0,-11173.4,-2033.69,47.0759,0.798522,'804:0 805:0 807:0 '),\n(807,'KarazhanCellar1',0,41,2837,50,60,0,-11100.4,-1963.77,1.93936,4.49657,'806:0 808:0 '),\n(808,'KarazhanCellar2',0,41,2837,50,60,0,-11159.5,-1898.41,-17.7918,6.21463,'807:0 809:0 '),\n(809,'KarazhanCellar3',0,41,2837,50,60,0,-11033.9,-1910.04,-32.9889,4.98353,'808:0 '),\n(810,'DeadmansCrossingBottom',0,41,41,50,60,0,-10282.6,-2019.49,51.0186,2.21028,'802:0 '),\n(811,'SSExitW',0,8,8,33,45,0,-10546.2,-2376.39,84.2413,1.87648,'801:0 812:0 '),\n(812,'SSW1',0,8,8,33,45,0,-10381.8,-2424.26,52.7345,2.75809,'811:0 813:0 '),\n(813,'SSW2',0,8,8,33,45,0,-10427.8,-2549.06,24.1947,5.68762,'812:0 814:0 830:0 '),\n(814,'IthariusCaveOutside',0,8,1777,33,45,0,-10561.3,-2508.68,22.0709,5.83489,'813:0 815:0 816:0 '),\n(815,'IthariusCave',0,8,1777,33,45,0,-10677.4,-2531.21,28.912,6.2649,'814:0 '),\n(816,'SSCRW1',0,8,1780,33,45,0,-10387.5,-2710.03,21.6778,1.56036,'814:0 817:0 818:0 819:0 830:0 '),\n(817,'MistyValley',0,8,116,33,45,0,-10110,-2413.91,29.9136,4.35049,'816:0 818:0 '),\n(818,'SSW3',0,8,8,33,45,0,-10320.4,-2794.27,21.9908,1.07734,'817:0 816:0 819:0 820:0 829:0 830:0 '),\n(819,'Harborage',0,8,657,33,45,2,-10113,-2807.71,22.1444,3.06047,'818:0 816:0 820:0 829:0 '),\n(820,'SSN1',0,8,1798,33,45,0,-10099.4,-3266.23,20.4381,1.58785,'818:0 819:0 821:0 827:0 828:0 829:0 '),\n(821,'SSN2',0,8,76,33,45,0,-9974.74,-3687.45,21.6788,2.09247,'820:0 822:0 823:0 827:0 828:0 829:0 '),\n(822,'SSNE1',0,8,2403,33,45,0,-9634.53,-3969.85,0.0000146627,2.75613,'821:0 823:0 '),\n(823,'SSNE2',0,8,300,33,45,0,-10034.8,-4306.49,1.78832,0.101491,'822:0 821:0 824:0 826:0 827:0 '),\n(824,'SSE',0,8,300,33,45,0,-10512,-4371.71,6.04597,6.27469,'823:0 825:0 80:0 826:0 827:0 '),\n(825,'SSSE',0,8,300,33,45,0,-11038.3,-4116.28,1.98503,5.82703,'186:0 824:0 80:0 '),\n(826,'PoolOfTearsE',0,8,1778,33,45,0,-10444.5,-4087.57,23.9872,1.47592,'80:0 186:0 823:0 824:0 827:0 '),\n(827,'PoolOfTearsN',0,8,8,33,45,0,-10147.3,-3802.05,22.1649,2.27113,'820:0 821:0 823:0 824:0 826:0 828:0 829:0 '),\n(828,'PoolOfTearsW',0,8,8,33,45,0,-10377.4,-3577.61,22.0023,3.94206,'820:0 821:0 827:0 80:0 51:0 829:0 '),\n(829,'SSC',0,8,1798,33,45,0,-10292.9,-3192.2,22.1489,5.69742,'818:0 819:0 820:0 821:0 827:0 828:0 51:0 830:0 '),\n(830,'SSExitS',0,8,8,33,45,0,-10553.9,-3043.33,24.794,0.0857489,'813:0 816:0 818:0 829:0 51:0 831:0 '),\n(831,'SSExitSS',0,4,4,43,54,0,-10690.8,-2978.8,37.8508,5.87412,'830:0 834:0 '),\n(832,'StagalbogInside1',0,8,1817,33,45,0,-10966.8,-3697.03,11.0105,4.21105,'80:0 833:0 '),\n(833,'StagalbogInside2',0,8,1817,33,45,0,-10894.6,-3613.42,16.0499,6.1176,'832:0 '),\n(834,'BLExitN',0,4,4,43,54,0,-10811.4,-2992.21,41.134,0.16765,'831:0 835:0 839:0 846:0 '),\n(835,'BLNW1',0,4,1437,43,54,0,-11009.6,-2785.5,4.70615,5.63206,'834:0 836:0 839:0 840:0 '),\n(836,'DreadmaulHoldEntrance',0,4,1437,43,54,0,-10916.9,-2714.76,7.63624,3.85903,'835:0 837:0 838:0 '),\n(837,'DreadmaulHoldRight',0,4,1437,43,54,0,-10814.2,-2705.35,8.14439,3.20125,'836:0 838:0 '),\n(838,'DreadmaulHoldLeft',0,4,1437,43,54,0,-10859.8,-2615.61,8.07541,4.52661,'836:0 837:0 '),\n(839,'BLNW2',0,4,4,43,54,0,-11080.5,-2903.3,9.18506,0.371865,'835:0 834:0 196:0 '),\n(840,'BLW1',0,4,4,43,54,0,-11268.2,-2725.08,11.1047,5.91718,'835:0 841:0 842:0 '),\n(841,'DreadmaulPost',0,4,1439,43,54,0,-11528.8,-2858.71,8.50437,6.19557,'840:0 196:0 842:0 856:0 '),\n(842,'BLAltarOfStormsBottom',0,4,4,43,54,0,-11501.6,-2718.85,5.65372,0.900431,'840:0 841:0 843:0 856:0 '),\n(843,'BLAltarOfStormsMid',0,4,4,47,54,0,-11381.5,-2566.03,75.8033,3.74358,'842:0 844:0 '),\n(844,'BLAltarOfStormsTop',0,4,1441,47,54,1,-11255.9,-2556.41,97.0494,2.9896,'843:0 '),\n(845,'BLE1',0,4,4,43,54,0,-11149.6,-3232.6,8.07553,2.30354,'196:0 846:0 850:0 '),\n(846,'NethergardeOutside',0,4,1438,43,54,0,-10961.7,-3200.5,45.5708,0.954623,'834:0 845:0 847:0 '),\n(847,'NethergardeInside1',0,4,1438,43,54,2,-11008.9,-3340.48,64.7225,4.78147,'846:0 848:0 '),\n(848,'NethergardeInside2',0,4,1438,43,54,3,-10993.2,-3453.24,64.8707,3.21459,'847:0 849:0 '),\n(849,'NethergardeInside3',0,4,1438,43,54,2,-11112.2,-3438.11,79.0946,6.1402,'848:0 '),\n(850,'BLE2',0,4,1440,43,54,0,-11310.9,-3410.18,7.46828,4.16649,'845:0 851:0 852:0 '),\n(851,'BLE2Inside',0,4,1440,43,54,0,-11225.8,-3486.48,8.69295,2.17551,'850:0 '),\n(852,'BLE3',0,4,4,43,54,0,-11438.8,-3304.34,7.30604,5.76674,'196:0 850:0 853:0 854:0 '),\n(853,'BLSE',0,4,72,43,54,0,-11632.5,-3381.23,14.577,0.215935,'852:0 854:0 855:0 '),\n(854,'BLS1',0,4,4,43,54,0,-11607.8,-3099.85,7.81021,5.30924,'196:0 852:0 853:0 855:0 '),\n(855,'BLS2',0,4,72,43,54,0,-11765.8,-2959.84,7.91609,5.25623,'853:0 854:0 856:0 2370:0 '),\n(856,'BLS3',0,4,4,43,54,0,-11716.6,-2785.99,8.27783,3.20635,'855:0 841:0 842:0 857:0 '),\n(857,'TaintedScar1',0,4,73,55,60,0,-11907.8,-2658.64,-2.15637,5.48008,'856:0 '),\n(858,'SVExitN',0,33,33,33,45,0,-11362.1,-380.82,64.9035,0.170793,'768:0 859:0 '),\n(859,'SVExitNFork',0,33,33,33,45,0,-11397.1,-284.376,58.1739,3.29667,'858:0 860:0 861:0 '),\n(860,'RebelCamp',0,33,99,33,45,3,-11314.2,-182.813,75.1397,3.66777,'859:0 '),\n(861,'SVEntranceN',0,33,33,33,45,0,-11511.9,-302.586,38.7986,0.353382,'859:0 863:0 864:0 862:0 '),\n(862,'NesingwarysExpeditionCamp',0,33,100,33,45,1,-11616,-50.0157,10.9823,4.49439,'861:0 879:0 880:0 881:0 901:0 902:0 907:0 '),\n(863,'SVNBridge1N',0,33,33,33,45,0,-11604.1,-282.333,37.221,5.64107,'861:0 879:0 '),\n(864,'SVNHubN1',0,33,33,33,45,0,-11643.7,-473.703,17.1608,0.3141,'861:0 865:0 873:0 '),\n(865,'KurzensCompound',0,33,101,33,45,0,-11604,-644.056,29.157,3.77181,'864:0 866:0 872:0 '),\n(866,'TheStockpile1',0,33,106,33,45,0,-11461.5,-750.28,30.6105,4.24893,'865:0 867:0 '),\n(867,'TheStockpile2',0,33,106,33,45,0,-11514.8,-845.839,22.0076,3.08261,'866:0 868:0 869:0 '),\n(868,'TheStockpile3',0,33,106,33,45,0,-11418.4,-794.929,14.9653,3.89354,'867:0 '),\n(869,'TheStockpile4',0,33,106,33,45,0,-11506.4,-946.763,29.2275,0.414209,'867:0 870:0 '),\n(870,'TheStockpile5',0,33,106,33,45,0,-11406.8,-896.737,18.0813,0.89682,'869:0 871:0 '),\n(871,'TheStockpile6',0,33,106,33,45,0,-11337.1,-985.396,27.3203,1.9202,'870:0 '),\n(872,'SVNHubN2',0,33,33,33,45,0,-11729.7,-799.127,29.6214,0.89486,'865:0 873:0 875:0 913:0 '),\n(873,'VentureCoBaseCamp',0,33,1760,33,45,0,-11959.6,-531.751,11.3978,5.11834,'872:0 864:0 874:0 875:0 913:0 '),\n(874,'SVNHub1',0,33,33,33,45,0,-12225,-546.002,28.8839,0.0407319,'873:0 875:0 911:0 913:0 915:0 '),\n(875,'SVE1',0,33,33,33,45,0,-12149.1,-965.968,32.4681,1.43677,'872:0 873:0 874:0 876:0 878:0 913:0 '),\n(876,'MoshoggOgreMound',0,33,105,33,45,0,-12352.7,-972.262,13.1171,5.38338,'875:0 877:0 878:0 913:0 '),\n(877,'MoshoggOgreMoundInside',0,33,105,33,45,0,-12364,-1147.48,0.104103,2.92311,'876:0 '),\n(878,'MoshoggOgreMoundUpper',0,33,105,33,45,0,-12466.5,-881.644,39.1084,5.72306,'875:0 876:0 914:0 918:0 '),\n(879,'SVNBridge1C',0,33,33,33,45,0,-11710.1,-210.005,39.5643,5.90174,'863:0 880:0 862:0 '),\n(880,'SVNBridge1S',0,33,33,33,45,0,-11818.3,-43.4252,39.7487,5.27146,'879:0 862:0 903:0 905:0 907:0 '),\n(881,'SVNHubW1',0,33,33,33,45,0,-11518.9,255.102,25.1192,4.23669,'862:0 882:0 883:0 901:0 '),\n(882,'SVNHubW2',0,33,33,33,45,0,-11502.5,373.117,53.2392,3.3217,'881:0 883:0 '),\n(883,'ZulKundaNE',0,33,33,33,45,0,-11650.7,401.397,42.8581,5.68183,'881:0 882:0 884:0 889:0 890:0 '),\n(884,'ZulKundaE',0,33,33,33,45,0,-11785.5,436.17,47.4037,6.2807,'883:0 885:0 889:0 899:0 '),\n(885,'ZulKundaSE',0,33,33,33,45,0,-11863.3,560.263,47.0214,5.06137,'884:0 886:0 887:0 889:0 '),\n(886,'ZulKundaS',0,33,33,33,45,0,-11831.5,711.922,45.1329,4.4252,'885:0 888:0 '),\n(887,'SavageCoastNW1',0,33,301,33,45,0,-11924.1,793.032,3.06387,4.97496,'885:0 894:0 185:0 897:0 898:0 '),\n(888,'ZulKunda1',0,33,102,33,45,0,-11690.4,742.837,49.7495,3.41987,'886:0 889:0 891:0 '),\n(889,'ZulKunda2',0,33,102,33,45,0,-11694.8,565.959,49.7011,1.34053,'883:0 884:0 885:0 888:0 890:0 891:0 '),\n(890,'ZulKunda3',0,33,102,33,45,0,-11550.4,601.183,50.5784,3.11945,'883:0 889:0 891:0 '),\n(891,'ZulKunda4',0,33,102,33,45,0,-11622.9,760.15,39.7329,0.007312,'888:0 889:0 890:0 892:0 893:0 '),\n(892,'ZulKunda5',0,33,102,33,45,0,-11528.7,724.898,59.4101,3.50037,'891:0 '),\n(893,'ZulKundaW',0,33,122,33,45,0,-11572.6,840.524,8.14386,2.72086,'891:0 894:0 '),\n(894,'SavageCoastNW2',0,33,122,33,45,0,-11692.5,954.651,3.70656,5.00441,'893:0 887:0 185:0 897:0 '),\n(895,'YojambaIsleW',0,33,3357,33,45,0,-11810.6,1364.62,0.0261903,4.46053,'185:0 '),\n(896,'YojambaIsleN',0,33,3357,33,45,0,-11748.3,1318.44,5.22585,2.37531,'185:0 '),\n(897,'VileReefIsle',0,33,301,33,45,0,-12154.2,871.091,18.6659,5.996,'894:0 887:0 '),\n(898,'SavageCoastW1',0,33,301,33,45,0,-12016.1,440.588,3.35169,0.661185,'887:0 899:0 900:0 '),\n(899,'SVNWHub1',0,33,33,33,45,0,-11888.7,290.463,12.6077,0.998902,'898:0 884:0 900:0 901:0 902:0 903:0 '),\n(900,'SavageCoastW2',0,33,33,33,45,0,-12196.8,238.239,2.19021,4.81004,'898:0 899:0 904:0 37:0 '),\n(901,'SVNHunW3',0,33,100,33,45,0,-11656.6,59.5536,17.3151,1.50941,'899:0 881:0 862:0 902:0 '),\n(902,'TkashiRuins',0,33,126,33,45,0,-11843.2,59.0602,14.1655,3.34528,'899:0 901:0 862:0 903:0 905:0 '),\n(903,'KalaiRuins',0,33,125,33,45,0,-12069.3,66.3927,-5.18214,3.5436,'902:0 899:0 880:0 904:0 906:0 '),\n(904,'SVNHub2',0,33,33,33,45,0,-12283.3,28.601,18.2879,0.246879,'903:0 900:0 37:0 912:0 '),\n(905,'SVNBridge2N',0,33,33,33,45,0,-11907.9,-50.0313,39.7259,0.870484,'902:0 880:0 906:0 907:0 '),\n(906,'SVNBridge2S',0,33,33,33,45,0,-12090.1,-139.679,35.2928,0.399245,'903:0 905:0 910:0 '),\n(907,'SVCHub1',0,33,33,33,45,0,-11853.5,-167.599,15.3333,0.51312,'862:0 880:0 905:0 '),\n(908,'SavageCoastW3',0,33,301,33,45,0,-12543.1,74.9728,0.873061,0.513523,'37:0 912:0 '),\n(909,'SavageCoastW4',0,33,1578,33,45,0,-12691.2,142.464,3.092,5.80512,'921:0 924:0 925:0 936:0 '),\n(910,'SVNBridge3W',0,33,33,33,45,0,-12171.4,-240.719,29.8621,0.766786,'906:0 911:0 912:0 '),\n(911,'SVNBridge3E',0,33,33,33,45,0,-12157.4,-431.52,30.3485,1.45204,'874:0 910:0 913:0 '),\n(912,'MizjahRuins',0,33,129,33,45,0,-12468.7,-147.093,13.8431,5.95827,'904:0 908:0 910:0 916:0 '),\n(913,'SVNHub3',0,33,1740,33,45,0,-12127.6,-649.027,14.8876,2.30225,'874:0 876:0 911:0 873:0 875:0 872:0 '),\n(914,'BaliamahRuins',0,33,127,33,45,0,-12540.7,-734.478,39.4424,6.20568,'878:0 915:0 917:0 918:0 '),\n(915,'SVNHub4',0,33,33,33,45,0,-12417,-580.502,11.0755,6.10556,'914:0 874:0 916:0 '),\n(916,'SVNHub5',0,33,33,33,45,0,-12522,-370.721,12.7107,0.882666,'912:0 915:0 917:0 921:0 '),\n(917,'ZiatajaiRuins',0,33,128,33,45,0,-12701.1,-464.07,30.0552,6.19787,'914:0 916:0 918:0 920:0 '),\n(918,'ZulMamweN',0,33,33,33,45,0,-12776.9,-784.489,63.0348,0.421265,'878:0 914:0 917:0 919:0 '),\n(919,'ZulMamweC',0,33,103,33,45,0,-12985.7,-833.459,69.9343,0.193503,'918:0 920:0 '),\n(920,'ZulMamweW',0,33,103,33,45,0,-12943.6,-608.837,53.0521,6.05178,'917:0 919:0 '),\n(921,'SVSHub1',0,33,33,33,45,0,-12826,-301.024,9.96047,5.46666,'916:0 922:0 909:0 925:0 '),\n(922,'SVSVentureCoMine1',0,33,33,33,45,0,-12978,-452.477,53.6008,5.60214,'921:0 923:0 '),\n(923,'SVSVentureCoMine2',0,33,33,33,45,0,-13088.9,-466.483,47.2022,3.61705,'922:0 '),\n(924,'GurubashiArenaOuterN',0,33,1577,33,45,0,-12949,251.702,18.4183,2.2214,'909:0 937:0 '),\n(925,'STCHub1',0,33,1577,33,45,0,-13136.8,-184.248,-3.10173,5.92455,'909:0 921:0 926:0 929:0 '),\n(926,'CrystalveinMine1',0,33,310,33,45,0,-13322.7,-420.202,15.4509,2.04861,'925:0 927:0 928:0 929:0 '),\n(927,'CrystalveinMine2',0,33,310,33,45,0,-13158.5,-564.518,4.64271,0.568135,'926:0 928:0 '),\n(928,'CrystalveinMine3',0,33,310,33,45,0,-13170,-467.696,3.57551,3.1305,'926:0 927:0 '),\n(929,'STCHub2',0,33,1577,33,45,0,-13246.3,-110.492,19.5979,5.04296,'926:0 925:0 930:0 '),\n(930,'GurubashiOuterSE',0,33,1741,33,45,0,-13280.6,57.3154,17.1498,4.95263,'929:0 931:0 932:0 933:0 934:0 '),\n(931,'GurubashiOuterSSE',0,33,1741,33,45,0,-13402.5,96.0163,23.7905,6.03724,'930:0 932:0 933:0 934:0 935:0 943:0 944:0 '),\n(932,'RuinsOfJubuwal',0,33,477,33,45,0,-13382.8,-24.5642,22.0332,0.894086,'930:0 931:0 '),\n(933,'GurubashiArenaInside1',0,33,2177,33,45,0,-13216,312.587,21.8574,3.50161,'930:0 931:0 934:0 '),\n(934,'GurubashiArenaInside2',0,33,2177,33,45,0,-13163.8,257.166,21.8574,3.62531,'930:0 931:0 933:0 '),\n(935,'STCHub3',0,33,1577,33,45,0,-13475.6,312.292,31.942,5.22555,'931:0 938:0 942:0 '),\n(936,'SSavageCoast1',0,33,1578,33,45,0,-12862.3,459.666,6.403,4.74253,'909:0 937:0 '),\n(937,'GurubashiArenaOuterW',0,33,1741,33,45,0,-13076.6,428.328,24.6507,6.12678,'924:0 936:0 938:0 '),\n(938,'GurubashiArenaOuterSW',0,33,1577,33,45,0,-13273.2,479.65,3.7542,5.77924,'935:0 937:0 939:0 940:0 '),\n(939,'BloodsailCompoundW',0,33,1739,33,45,0,-13331.9,777.87,2.16424,3.85895,'938:0 940:0 941:0 '),\n(940,'BloodsailCompoundC',0,33,1739,33,45,0,-13470.3,687.069,8.46535,3.18977,'938:0 939:0 941:0 '),\n(941,'SSavageCoast2',0,33,1578,33,45,0,-13705.9,620.54,10.152,3.17013,'939:0 940:0 966:0 968:0 '),\n(942,'STCHub4',0,33,1577,33,45,0,-13618.7,330.576,43.7429,5.59271,'935:0 943:0 968:0 '),\n(943,'STCHub5',0,33,1577,33,45,0,-13719.1,129.331,23.7103,3.72188,'931:0 942:0 944:0 964:0 965:0 '),\n(944,'STCHub6',0,33,1577,33,45,0,-13572.2,-93.8439,42.7481,1.44857,'931:0 943:0 945:0 '),\n(945,'RuinsOfAboraz',0,33,311,33,45,0,-13627.7,-351.772,12.434,1.10692,'944:0 946:0 '),\n(946,'CrystalShore1',0,33,302,33,45,0,-13867.2,-89.5993,18.4363,2.92315,'945:0 947:0 964:0 '),\n(947,'CrystalShore2',0,33,302,33,45,0,-14086.6,-142.781,3.55938,1.30916,'946:0 948:0 '),\n(948,'WildShore1',0,33,43,33,45,0,-14260.2,-15.7846,3.81308,5.84287,'947:0 949:0 '),\n(949,'WildShore2',0,33,43,33,45,0,-14293.2,109.305,7.5176,0.82025,'948:0 950:0 962:0 '),\n(950,'WildShore3',0,33,43,33,45,0,-14585.8,177.319,2.91916,6.15507,'949:0 951:0 952:0 955:0 958:0 '),\n(951,'WildShore4',0,33,43,33,45,0,-14708.6,511.328,2.52661,5.16547,'950:0 952:0 '),\n(952,'WildShoreShips1',0,33,43,33,45,0,-14894,302.458,3.67936,4.08476,'950:0 951:0 953:0 954:0 955:0 '),\n(953,'WildShoreShips1Left',0,33,43,33,45,0,-14940,357.129,0.221882,0.0694,'952:0 '),\n(954,'WildShoreShips1Right',0,33,43,33,45,0,-15009.9,266.91,0.198072,0.0485881,'952:0 '),\n(955,'WildShoreShips2',0,33,43,33,45,0,-14843.8,75.9812,2.07268,0.570875,'950:0 952:0 956:0 957:0 '),\n(956,'WildShoreShips2Center',0,33,43,33,45,0,-14926.8,110.764,0.2001,4.9102,'955:0 '),\n(957,'JagueroIsle1',0,33,297,33,45,0,-14817.1,-427.547,1.62653,0.804531,'955:0 958:0 '),\n(958,'JagueroIsle2',0,33,297,33,45,0,-14556.9,-277.709,10.043,3.68499,'950:0 957:0 '),\n(959,'BootyBayW',0,33,35,33,45,0,-14300.4,523.178,8.69884,4.45859,'36:0 960:0 '),\n(960,'BootyBayS',0,33,35,33,45,1,-14462.8,467.081,15.1246,5.4423,'36:0 959:0 '),\n(961,'BootyBayEntrance',0,33,1577,33,45,0,-14249.5,333.168,24.6767,2.49077,'36:0 962:0 967:0 '),\n(962,'STCHub7',0,33,1577,33,45,0,-14217.2,239.309,20.2817,3.77098,'949:0 961:0 963:0 '),\n(963,'STCHub8',0,33,1577,33,45,0,-14073.6,266.586,17.42,5.16308,'962:0 964:0 965:0 '),\n(964,'MistvaleValley',0,33,1737,33,45,0,-13952.8,86.1666,15.8298,5.2161,'76:0 943:0 946:0 963:0 '),\n(965,'STCHub9',0,33,1577,33,45,0,-13879.6,258.837,17.7662,5.83459,'943:0 963:0 '),\n(966,'SSavageCoast3',0,33,1578,33,45,0,-13908.6,676.67,10.0579,5.32409,'967:0 941:0 969:0 '),\n(967,'SSavageCoast4',0,33,1578,33,45,0,-14050.8,500.109,2.8225,0.635261,'961:0 966:0 '),\n(968,'SSavageCoast5',0,33,1578,33,45,0,-13683.6,505.174,34.349,3.2526,'941:0 942:0 969:0 970:0 '),\n(969,'SSavageCoast6',0,33,1577,33,45,0,-13859.9,575.635,44.9464,6.06235,'966:0 968:0 '),\n(970,'SSavageCoast7',0,33,1577,33,45,0,-13849.3,494.156,89.7643,5.84244,'968:0 971:0 '),\n(971,'SSavageCoast8',0,33,1738,33,45,0,-13806.7,377.83,94.1372,2.10198,'970:0 '),\n(972,'Shadowglen',1,141,188,1,4,2,10281,1001.05,1342.98,5.96933,'33:0 62:0 '),\n(973,'ShadowthreadCaveInside',1,141,257,1,10,2,10936.3,951.018,1322.87,0.852457,'62:0 '),\n(974,'ShadowglenExit1',1,141,188,1,10,2,10236.2,699.749,1353.3,3.24203,'33:0 975:0 '),\n(975,'ShadowglenExit2',1,141,141,1,10,2,9988.41,591.889,1315.9,0.829698,'974:0 976:0 983:0 '),\n(976,'StarbreezeVillage',1,141,260,1,10,2,9825.13,399.226,1308.15,0.857567,'975:0 977:0 978:0 '),\n(977,'StarbreezeBackyard',1,141,141,1,10,2,10038.9,286.037,1323.77,1.89429,'976:0 '),\n(978,'TeldrassilS1',1,141,141,1,10,2,9396.17,568.108,1320.55,0.244948,'976:0 979:0 '),\n(979,'TeldrassilS2',1,141,141,1,10,2,9232.75,931.478,1321.37,5.94693,'978:0 980:0 '),\n(980,'TeldrassilS3',1,141,141,1,10,2,9171.08,1419.38,1320.31,5.13404,'979:0 981:0 '),\n(981,'TeldrassilHubS1',1,141,141,1,10,2,9352.14,1496.95,1274.46,0.140488,'980:0 982:0 34:0 988:0 '),\n(982,'GnarlpineHold',1,141,261,5,10,2,9106.12,1796.37,1324.94,4.59408,'981:0 '),\n(983,'DolanaarRoadE',1,141,141,1,10,2,9883.36,802.735,1309.84,1.38768,'975:0 63:0 34:0 '),\n(984,'FelRockInside',1,141,258,1,10,2,10112.3,1195.5,1312.02,5.06294,'63:0 '),\n(985,'DolanaarRoadW',1,141,141,1,10,2,9956.16,1248.6,1307.74,2.3227,'34:0 64:0 989:0 '),\n(986,'BanethilBarrowDenInside',1,141,262,4,10,2,9759.16,1553.23,1264.26,3.07786,'64:0 '),\n(987,'TeldrassilHubW1',1,141,141,1,10,2,10032.9,1820.23,1320.1,4.58073,'64:0 988:0 989:0 990:0 992:0 '),\n(988,'PoolsOfArlithrien',1,141,478,1,10,2,9596.69,1802.05,1293.91,5.64964,'981:0 987:0 '),\n(989,'TeldrassilHubW2',1,141,141,1,10,2,10162.3,1440.21,1325.14,3.89821,'985:0 987:0 '),\n(990,'OracleGladeRoad',1,141,141,4,10,2,10352,1874.33,1324.48,6.02465,'987:0 991:0 '),\n(991,'OracleGlade',1,141,264,1,10,2,10884.7,2071.72,1327.43,2.94589,'990:0 '),\n(992,'DarnassusEntrance',1,1657,1657,1,60,3,9945.1,2019.66,1351.87,4.64235,'987:0 '),\n(993,'AuberdineSpawn',1,148,442,8,20,3,6553.45,522.918,11.8561,3.67005,'59:0 994:0 '),\n(994,'LongWash1',1,148,453,8,20,2,6232.15,537.866,7.35703,5.18,'59:0 993:0 995:0 1008:0 '),\n(995,'LongWash2',1,148,2077,8,20,2,5552.17,453.898,19.6886,6.27955,'994:0 996:0 1005:0 1008:0 '),\n(996,'TwilightShore1',1,148,2078,14,20,2,5012.98,536.041,5.96794,4.54499,'995:0 997:0 1005:0 95:0 '),\n(997,'TwilightShore2',1,148,2078,14,20,2,4688.48,865.878,2.79823,2.76606,'996:0 998:0 999:0 '),\n(998,'TwilightShore3',1,148,2078,14,20,2,4503.92,906.145,4.30626,5.45958,'997:0 1002:0 1038:0 '),\n(999,'RemtravelsExcavation',1,148,450,8,20,2,4714.44,550.759,26.823,1.95474,'997:0 1000:0 95:0 94:0 '),\n(1000,'RemtravelsExcavationInside1',1,148,450,14,20,2,4620.8,642.65,6.43919,5.10026,'999:0 1001:0 '),\n(1001,'RemtravelsExcavationInside2',1,148,450,14,20,2,4567.99,561.83,1.27184,0.69615,'1000:0 '),\n(1002,'DarkshoreExitSW',1,148,2077,8,20,2,4243.34,412.704,58.3351,0.245327,'998:0 1003:0 1027:0 '),\n(1003,'DarkshoreExitFork',1,148,2077,8,20,2,4395.16,213.188,52.2559,2.29326,'1002:0 1004:0 94:0 1006:0 '),\n(1004,'DarkshoreExitSE',1,148,2077,8,20,2,4141.67,41.4988,23.6074,3.67163,'1003:0 1028:0 '),\n(1005,'WindbendRiverN',1,148,2077,8,20,2,5261.19,254.236,30.0406,3.18665,'995:0 996:0 95:0 1008:0 1009:0 '),\n(1006,'MastersGlaiveRoad',1,148,2077,8,20,2,4568.13,285.307,57.6068,1.63547,'94:0 95:0 1003:0 1007:0 '),\n(1007,'MastersGlaive',1,148,449,8,20,2,4541.58,449.011,32.0175,5.01071,'1006:0 '),\n(1008,'AmetharanRoad',1,148,2077,8,20,2,5720.14,311.438,20.1904,4.41184,'59:0 994:0 995:0 1005:0 1009:0 1010:0 '),\n(1009,'Ametharan',1,148,447,8,20,2,5586.01,84.3345,27.1266,1.57459,'1005:0 1008:0 1010:0 '),\n(1010,'AmetharanN',1,148,447,8,20,2,5801.69,83.785,34.5622,2.98046,'59:0 1008:0 1009:0 1011:0 '),\n(1011,'DarkshoreMoonkins',1,148,148,8,20,2,6267.1,23.9018,32.4976,3.19251,'59:0 1010:0 1012:0 1013:0 '),\n(1012,'DarkshoreNRoad1',1,148,148,8,20,2,6568,183.3,33.0481,3.37511,'59:0 1011:0 1013:0 1014:0 '),\n(1013,'BashalAran',1,148,446,8,20,2,6724.32,-182.155,32.4813,2.68198,'1011:0 1012:0 1014:0 '),\n(1014,'DarkshoreNRoad2',1,148,148,8,20,2,6818.81,102.669,19.5599,2.84101,'1012:0 1013:0 1015:0 '),\n(1015,'DarkshoreNRoad3',1,148,148,8,20,2,6851.5,-74.339,19.6655,5.58399,'1014:0 1016:0 1022:0 '),\n(1016,'DarkshoreNRoad4',1,148,148,8,20,2,7119.42,-81.8027,14.4199,3.09232,'1015:0 1017:0 1022:0 '),\n(1017,'DarkshoreNRoad5',1,148,148,8,20,2,7256.24,-291.22,21.0422,4.79468,'1016:0 1018:0 1022:0 '),\n(1018,'DarkshoreNRoad6',1,148,148,8,20,2,7251.65,-503.552,27.2626,1.57453,'1017:0 1019:0 1023:0 1026:0 1024:0 '),\n(1019,'CliffspringFalls1',1,148,445,8,20,2,6945.23,-647.544,58.2647,0.698808,'1018:0 96:0 1022:0 '),\n(1020,'CliffspringFallsInside1',1,148,445,8,20,2,6751.15,-678.916,69.6518,0.322209,'96:0 '),\n(1021,'CliffspringFallsInside2',1,148,445,8,20,2,6801.08,-758.228,69.6369,1.04478,'96:0 '),\n(1022,'CliffspringRiverCamp',1,148,456,8,20,2,6874.54,-444.951,41.5568,5.10331,'1015:0 1016:0 1017:0 1019:0 '),\n(1023,'TowerOfAlthalaxx',1,148,444,14,20,2,7134.02,-794.131,67.6245,1.1665,'1018:0 1024:0 '),\n(1024,'RuinsOfMathystra1',1,148,443,14,20,2,7266.69,-945.767,35.1327,5.29378,'1018:0 1023:0 1025:0 1026:0 '),\n(1025,'RuinsOfMathystra2',1,148,443,14,20,2,7600.47,-1097.96,49.7759,2.73731,'1026:0 1024:0 '),\n(1026,'RuinsOfMathystra3',1,148,443,14,20,2,7493.36,-767.521,12.9545,3.62677,'1018:0 1025:0 1024:0 '),\n(1027,'ZoramStrandFork',1,331,331,18,30,2,3817.2,679.137,5.10897,5.73165,'1002:0 1035:0 1036:0 1039:0 '),\n(1028,'AshenvaleNW_hub1',1,331,331,18,30,0,3974.7,-4.75098,16.9651,0.475045,'157:0 1004:0 1029:0 '),\n(1029,'AshenvaleNW_hub2',1,331,331,18,30,0,3657.91,209.708,2.09702,5.65554,'156:0 1028:0 1030:0 1031:0 '),\n(1030,'AshenvaleNW_hub3',1,331,331,18,30,0,3467.65,456.674,-1.34147,5.28246,'1029:0 1031:0 1032:0 1033:0 1035:0 '),\n(1031,'AshenvaleNW_hub4',1,331,413,18,30,0,3455.92,219.392,12.6662,4.49903,'156:0 1029:0 1030:0 1033:0 '),\n(1032,'AshenvaleNW_hub5',1,331,441,18,30,0,3249.97,704.667,5.38086,5.25498,'1030:0 1034:0 '),\n(1033,'MaestrasPost',1,331,413,18,30,0,3259.03,232.17,11.012,5.89391,'156:0 1030:0 1031:0 1034:0 1040:0 '),\n(1034,'LakeFalathim',1,331,441,18,30,0,3042.8,537.807,4.22352,5.78789,'1032:0 1033:0 '),\n(1035,'ZoramStrandExit',1,331,331,18,30,0,3657.05,656.795,4.96231,0.51393,'158:0 1027:0 1030:0 1036:0 '),\n(1036,'ZoramStrandC',1,331,414,18,30,0,3801.56,849.009,0.513784,2.44601,'158:0 1027:0 1035:0 1037:0 1039:0 '),\n(1037,'ZoramStrandS',1,331,414,18,30,0,3530.82,1106.94,3.5186,5.37358,'158:0 1036:0 '),\n(1038,'ZoramStrandNWIsle',1,331,414,18,30,0,4170.75,1326.83,19.2012,4.42522,'998:0 1039:0 '),\n(1039,'ZoramStrandN',1,331,414,18,30,0,4069.2,824.531,3.14713,3.15877,'1027:0 1036:0 1038:0 '),\n(1040,'MaestraHighway1',1,331,413,18,30,0,3098.29,226.932,38.2729,0.113369,'1033:0 1041:0 '),\n(1041,'MaestraHighway2',1,331,413,18,30,0,3010.21,148.647,65.398,0.16052,'1040:0 1042:0 '),\n(1042,'MaestraHighway3',1,331,331,18,30,0,2859.2,196.478,94.7169,5.92141,'1041:0 1043:0 '),\n(1043,'MaestraHighway4',1,331,331,18,30,0,2812.81,41.9868,95.6736,1.28951,'1042:0 1044:0 1058:0 '),\n(1044,'ThistlefurVillageExit',1,331,331,18,30,0,2868.2,-73.4622,101.174,1.57029,'1043:0 1045:0 1046:0 1056:0 1058:0 '),\n(1045,'ThistlefurVillageRoad1',1,331,331,18,30,0,3135.26,-172.008,106.895,2.338,'1044:0 1046:0 1047:0 1051:0 '),\n(1046,'ThistlefurVillageRoad2',1,331,331,18,30,0,3105.59,-62.1211,99.9184,3.67319,'1044:0 1045:0 '),\n(1047,'ThistlefurVillage1',1,331,2301,18,30,0,3406.44,-322.711,134.117,2.65215,'1045:0 1048:0 '),\n(1048,'ThistlefurVillage2',1,331,2301,18,30,0,3405.57,-442.447,153.072,1.32875,'1047:0 1049:0 1051:0 '),\n(1049,'ThistlefurVillage3',1,331,2301,18,30,0,3502.9,-501.921,187.011,2.83083,'1048:0 1050:0 '),\n(1050,'ThistlefurVillage4',1,331,2301,18,30,0,3340.18,-745.556,165.112,0.56888,'1049:0 '),\n(1051,'ThistlefurVillage5',1,331,331,18,30,0,3151.47,-574.826,152.496,0.537465,'1045:0 1048:0 1052:0 '),\n(1052,'IrisLakeFork',1,331,424,18,30,0,2898.98,-769.452,163.783,4.51548,'1051:0 1053:0 1054:0 1055:0 '),\n(1053,'IrisLake',1,331,424,18,30,0,2942.58,-1048.01,198.163,1.57223,'1052:0 '),\n(1054,'AshenvaleC_hub1',1,331,331,18,30,0,2507.45,-866.571,135.152,0.193841,'1052:0 1055:0 1065:0 '),\n(1055,'AshenvaleC_hub2',1,331,415,18,30,0,2438.14,-533.1,114.408,0.47461,'38:0 1052:0 1054:0 1057:0 1059:0 '),\n(1056,'AshenvaleC_hub3',1,331,415,18,30,2,2850.97,-220.421,105.829,4.13457,'38:0 1044:0 '),\n(1057,'AshenvaleC_hub4h',1,331,415,18,30,0,2496.08,-368.618,107.608,4.35054,'1055:0 1058:0 '),\n(1058,'AshenvaleC_hub5h',1,331,415,18,30,0,2723.63,-97.6203,94.1401,0.260605,'1043:0 1044:0 1057:0 1060:0 '),\n(1059,'RuinsOfStardust',1,331,418,18,30,0,2078.15,-208.159,97.3023,6.04115,'1055:0 1063:0 '),\n(1060,'FireScarShrine1',1,331,417,18,30,0,2256.66,75.4186,101.15,2.42832,'1058:0 1061:0 '),\n(1061,'FireScarShrine2',1,331,417,18,30,0,2216.37,200.114,132.147,0.0014348,'1060:0 1062:0 '),\n(1062,'FireScarShrine3',1,331,417,18,30,0,2267.87,408.396,133.106,0.831985,'1061:0 '),\n(1063,'MystralLakeW',1,331,421,18,30,0,2023,-843.478,97.5457,1.65663,'1064:0 1059:0 165:0 168:0 '),\n(1064,'MystralLakeC',1,331,421,18,30,0,1984.95,-1113.44,95.5274,1.49563,'1063:0 165:0 1067:0 '),\n(1065,'AshenvaleC_hub6',1,331,331,18,30,0,2450.24,-1258.76,125.028,2.45577,'1054:0 1066:0 1068:0 1071:0 '),\n(1066,'AshenvaleC_hub7',1,331,331,18,30,0,2235.23,-1257.52,78.4907,4.80606,'166:0 1065:0 165:0 '),\n(1067,'AshenvaleC_hub8',1,331,331,18,30,0,1948.15,-1576.73,62.1809,2.79343,'167:0 1064:0 1069:0 '),\n(1068,'AshenvaleC_hub9',1,331,426,18,30,0,2312.84,-1688.24,121.859,1.16373,'166:0 1065:0 1072:0 1074:0 '),\n(1069,'AshenvaleC_hub10',1,331,331,18,30,0,2066.34,-1671.01,66.4345,2.13565,'166:0 1067:0 1070:0 '),\n(1070,'AshenvaleE_hub1',1,331,2457,18,30,0,2042.45,-1869.26,98.5045,1.0065,'1069:0 1074:0 1106:0 '),\n(1071,'AshenvaleC_hub11',1,331,331,18,30,0,2610.58,-1273.73,147.484,1.45233,'1065:0 1072:0 '),\n(1072,'AshenvaleC_hub12',1,331,426,18,30,0,2492.08,-1690.32,135.531,1.25401,'1068:0 1071:0 1073:0 '),\n(1073,'AshenvaleC_hub13',1,331,2457,18,30,0,2524.32,-1885.69,143.053,1.82734,'1072:0 1074:0 1075:0 '),\n(1074,'AshenvaleC_hub14',1,331,2457,18,30,0,2243.34,-1738.27,110.775,5.1594,'1068:0 1073:0 1070:0 '),\n(1075,'AshenvaleExitN1',1,331,2457,18,30,0,2722.91,-1983,158.23,2.65788,'1073:0 1076:0 1078:0 '),\n(1076,'AshenvaleExitN2',1,331,2457,18,30,0,3188.58,-1706.76,164.247,3.95184,'1075:0 1077:0 '),\n(1077,'AshenvaleExitN3',1,331,2457,18,30,0,3297.65,-1543.44,164.945,5.56976,'1076:0 1118:0 '),\n(1078,'AshenvaleC_hub14',1,331,2457,18,30,0,2434.66,-2007.27,137.863,5.44996,'159:0 1075:0 '),\n(1079,'FalfarenRiverN1',1,331,433,18,30,0,2635.78,-2457.48,169.635,2.50866,'159:0 1080:0 1086:0 '),\n(1080,'FalfarenRiverN2',1,331,433,18,30,0,2714.01,-2536.19,182.43,2.13757,'1079:0 1081:0 160:0 '),\n(1081,'NightRunE',1,331,428,18,30,0,2790.65,-2428.46,206.042,3.93612,'1080:0 1082:0 160:0 '),\n(1082,'NightRun',1,331,428,18,30,0,2635.93,-2273.51,202.702,5.29878,'1081:0 1083:0 1084:0 '),\n(1083,'NightRunC',1,331,428,18,30,0,2508.34,-2113.14,200.284,6.10971,'1082:0 1084:0 '),\n(1084,'NightRunW1',1,331,428,18,30,0,2796.44,-2157.58,201.403,3.2489,'1082:0 1083:0 '),\n(1085,'ForestSongEntranceW',1,331,2358,18,30,0,2816.28,-3116.79,176.969,1.10278,'160:0 161:0 1088:0 1089:0 '),\n(1086,'AshenvaleE_hub2',1,331,2457,18,30,0,2468.98,-2717.07,150.406,4.36767,'1079:0 1087:0 1114:0 '),\n(1087,'AshenvaleE_hub3',1,331,2457,18,30,0,2544.03,-2863.47,160.596,1.768,'1086:0 1088:0 '),\n(1088,'SatyrnaarEntrance',1,331,2457,18,30,0,2634.38,-3046.12,161.142,6.24673,'1085:0 1087:0 1089:0 1090:0 1096:0 '),\n(1089,'Satyrnaar',1,331,430,18,30,0,2728.6,-2942.91,140.775,5.09219,'1085:0 1088:0 '),\n(1090,'AshenvaleE_hub4',1,331,2457,18,30,0,2718.15,-3174.63,154.002,4.95083,'1088:0 1091:0 '),\n(1091,'AshenvaleE_hub5',1,331,2457,18,30,0,2747.9,-3325.14,129.722,0.481917,'161:0 1090:0 1092:0 1096:0 1097:0 '),\n(1092,'AshenvaleE_hub6',1,331,2457,18,30,0,2858.75,-3503.4,106.63,0.432834,'1091:0 1093:0 1095:0 '),\n(1093,'BoughShadowEntrance',1,331,2358,18,30,0,3097.87,-3414.65,140.149,2.35511,'161:0 1092:0 1094:0 '),\n(1094,'BoughShadow',1,331,438,50,60,0,3193.56,-3715.88,121.867,1.87405,'1093:0 '),\n(1095,'AshenvaleExitE1',1,331,2457,18,30,0,2885.88,-3697.95,96.0233,1.45779,'1092:0 1269:0 '),\n(1096,'WarsongLumberCampW1',1,331,437,18,30,0,2228.79,-3249.63,101.566,0.607582,'1088:0 1091:0 1097:0 1099:0 '),\n(1097,'WarsongLumberCampE1',1,331,437,18,30,0,2451.74,-3379.23,102.331,4.70735,'1091:0 1096:0 1098:0 1356:0 '),\n(1098,'KargathiaKeep',1,331,2637,18,30,2,2437.92,-3546.25,98.3118,2.20389,'1097:0 '),\n(1099,'FelfireHillFork',1,331,434,18,30,0,2080.86,-3145.14,101.473,3.35095,'1116:0 162:0 1096:0 1356:0 '),\n(1100,'DemonFallRidgeW1',1,331,436,18,30,0,1674.45,-3019.31,126.383,5.53436,'162:0 1101:0 '),\n(1101,'DemonFallRidgeW2',1,331,436,18,30,0,1590.49,-2969.19,181.724,5.65806,'1100:0 1102:0 '),\n(1102,'DemonFallRidgeW3',1,331,436,18,30,0,1540.54,-2824.95,181.724,2.53218,'1101:0 1103:0 '),\n(1103,'DemonFallRidgeW4',1,331,436,18,30,0,1461.22,-2803.04,146.324,2.97199,'1102:0 '),\n(1104,'DemonFallRidgeE1',1,331,435,18,30,0,1627.48,-3316.31,144.676,0.784629,'162:0 1105:0 '),\n(1105,'DemonFallRidgeE2',1,331,435,18,30,0,1721.33,-3476.04,144.293,2.30437,'1104:0 '),\n(1106,'AshenvaleE_hub7',1,331,433,18,30,0,1988.27,-1943.15,97.1296,1.1247,'1070:0 1107:0 '),\n(1107,'AshenvaleE_hub8',1,331,2457,18,30,0,1962.79,-2012.8,96.2461,1.06579,'1106:0 1108:0 '),\n(1108,'AshenvaleE_hub9',1,331,2457,18,30,0,1921.52,-2170.42,94.4681,2.67153,'1107:0 1109:0 1113:0 '),\n(1109,'AshenvaleE_hub10',1,331,2457,18,30,0,1650,-2198.36,90.4962,0.191633,'163:0 1108:0 1110:0 1111:0 1112:0 '),\n(1110,'AshenvaleExitSh',1,331,2457,18,30,0,1372.44,-2259.8,89.962,3.46083,'1111:0 1109:0 1112:0 169:0 1518:0 '),\n(1111,'AshenvaleExitSa',1,17,1703,8,25,2,1283.04,-2337.27,95.7661,5.44005,'1109:0 1110:0 1519:0 '),\n(1112,'AshenvaleE_hub11',1,331,422,18,30,0,1407.02,-2005.8,95.7095,5.15141,'1109:0 1110:0 '),\n(1113,'SplintertreePostRoadW',1,331,431,18,30,0,1994.45,-2424.98,91.2477,1.28488,'164:0 175:0 1108:0 1114:0 '),\n(1114,'SplintertreePostFork',1,331,2457,18,30,0,2176.5,-2659.1,114.31,6.03653,'175:0 1086:0 1113:0 1115:0 '),\n(1115,'SplintertreePostRoadE',1,331,2457,18,30,0,2082.36,-2724.41,108.011,0.790059,'164:0 1114:0 1116:0 '),\n(1116,'FelfireHillBridgeW',1,331,434,18,30,0,2039.97,-2914.67,108.448,1.43407,'1099:0 1115:0 1356:0 '),\n(1117,'DorDanilarrowDenInside',1,331,432,18,30,0,1800.96,-2749.28,74.2595,4.55915,'164:0 '),\n(1118,'FelwoodExitS',1,361,361,46,56,0,3743.81,-1481.83,196.177,3.29581,'1077:0 1119:0 '),\n(1119,'EmeraldSanctuaryFork',1,361,2479,46,56,0,3880.67,-1320.46,216.16,2.5595,'1118:0 1120:0 1123:0 1124:0 '),\n(1120,'DeadwoodVillage1',1,361,1761,46,56,0,3687.18,-1161.35,207.07,5.5283,'1119:0 1121:0 1122:0 '),\n(1121,'DeadwoodVillage2',1,361,1761,46,56,0,3530.84,-1083.16,232.998,0.383932,'1120:0 1122:0 '),\n(1122,'DeadwoodVillage3',1,361,361,46,56,0,3799.15,-1018.83,233.051,3.60798,'1120:0 1121:0 1124:0 1149:0 '),\n(1123,'EmeraldSanctuary',1,361,2479,46,56,1,4008.37,-1323.24,254.74,2.01756,'1119:0 1124:0 '),\n(1124,'FelwoodRoad1',1,361,361,46,56,0,3917.77,-1102.56,251.192,4.86854,'1119:0 1122:0 1123:0 1125:0 1149:0 '),\n(1125,'FelwoodRoad2',1,361,361,46,56,0,4111.01,-1000.91,273.994,3.79844,'1124:0 1126:0 1149:0 1155:0 '),\n(1126,'FelwoodRoad3',1,361,361,46,56,0,4217.57,-895.05,283.719,4.15774,'1125:0 1127:0 1149:0 1156:0 1157:0 1158:0 '),\n(1127,'FelwoodRoad4',1,361,361,46,56,0,4284.53,-848.098,284.982,3.75914,'1126:0 1128:0 '),\n(1128,'FelwoodRoad5',1,361,361,46,56,0,4421.12,-848.39,292.935,3.21525,'1127:0 1129:0 1157:0 '),\n(1129,'FelwoodRoad6',1,361,361,46,56,0,4543.91,-853.393,298.894,3.13867,'1128:0 1130:0 '),\n(1130,'FelwoodRoad7',1,361,361,46,56,0,4626.9,-811.164,299.948,3.55493,'1129:0 1131:0 1158:0 '),\n(1131,'FelwoodRoad8',1,361,361,46,56,0,4816.57,-743.65,300.125,3.49799,'1130:0 1132:0 1162:0 '),\n(1132,'FelwoodRoad9',1,361,361,46,56,0,4924.41,-736.286,307.085,3.21525,'1131:0 1133:0 1161:0 '),\n(1133,'FelwoodRoad10',1,361,361,46,56,0,5067.29,-754.16,325.077,3.06602,'1132:0 1134:0 1162:0 '),\n(1134,'FelwoodRoad11',1,361,361,46,56,0,5190.8,-721.312,342.065,3.32245,'1133:0 1135:0 1163:0 '),\n(1135,'FelwoodRoad12',1,361,1765,46,56,0,5321.67,-714.318,345.44,3.1693,'1134:0 1136:0 1175:0 '),\n(1136,'FelwoodRoad13',1,361,361,46,56,0,5528.6,-586.974,357.722,3.70533,'1135:0 1137:0 1175:0 1176:0 '),\n(1137,'FelwoodRoad14',1,361,361,46,56,0,5829.53,-657.626,373.409,2.93956,'1136:0 1138:0 1176:0 1177:0 '),\n(1138,'FelwoodRoad15',1,361,361,46,56,0,6212.38,-740.556,409.705,2.87084,'1137:0 1139:0 '),\n(1139,'FelwoodRoad16',1,361,361,46,56,0,6248.94,-853.467,415.845,1.8714,'1138:0 1140:0 1180:0 1188:0 '),\n(1140,'FelwoodRoad17',1,361,361,46,56,0,6316.22,-1000.95,421.045,1.77912,'1139:0 1141:0 1181:0 '),\n(1141,'FelwoodRoad18',1,361,361,46,56,0,6517.96,-1128.86,435.787,2.40548,'1140:0 1142:0 1187:0 '),\n(1142,'FelwoodRoad19',1,361,361,46,56,0,6589.42,-1238.14,446.438,2.19734,'1141:0 1143:0 1181:0 149:0 '),\n(1143,'FelwoodRoad20',1,361,361,46,56,0,6642.07,-1424.29,466.141,1.83997,'1142:0 1144:0 149:0 1190:0 '),\n(1144,'FelwoodRoad21',1,361,361,46,56,0,6582.2,-1624.29,494.577,1.32358,'1143:0 1145:0 1190:0 '),\n(1145,'FelwoodRoad22',1,361,361,46,56,0,6510.95,-1745.71,510.835,1.13311,'1144:0 1146:0 1183:0 '),\n(1146,'FelwoodRoad23',1,361,361,46,56,0,6528.61,-1901.05,539.009,1.63379,'1145:0 1147:0 1191:0 1193:0 '),\n(1147,'FelwoodRoad24',1,361,361,46,56,0,6558.12,-2008.36,559.656,1.52776,'1146:0 1148:0 1193:0 '),\n(1148,'FelwoodRoad25',1,361,361,46,56,0,6560.77,-2085.29,574.689,1.48063,'1147:0 1191:0 148:0 '),\n(1149,'JadefireGlenEntrance',1,361,361,46,56,0,3926.58,-911.03,268.957,1.31568,'1122:0 1124:0 1125:0 1126:0 1150:0 1157:0 '),\n(1150,'JadefireGlen1',1,361,2480,46,56,0,3811.45,-783.703,310.11,5.52543,'1149:0 1151:0 1152:0 1153:0 '),\n(1151,'JadefireGlen2',1,361,2480,46,56,0,3718.85,-847.307,312.709,0.532263,'1150:0 '),\n(1152,'JadefireGlen3',1,361,2480,46,56,0,3912.89,-762.669,314.637,3.43039,'1150:0 '),\n(1153,'JadefireGlen4',1,361,2480,46,56,0,3856.5,-672.112,328.888,4.11173,'1150:0 1154:0 '),\n(1154,'JadefireGlen5',1,361,2480,46,56,0,4036.91,-552.243,344.95,3.72492,'1153:0 '),\n(1155,'FelwoodSide1_1',1,361,361,46,56,0,4213.32,-1147.96,320.929,1.94598,'1125:0 1156:0 '),\n(1156,'FelwoodSide1_2',1,361,361,46,56,0,4310.85,-1068.85,323.86,2.16393,'1126:0 1155:0 '),\n(1157,'FelwoodSide2_1',1,361,361,46,56,0,4140.08,-676.318,285.659,4.10583,'1126:0 1128:0 1149:0 '),\n(1158,'RuinsOfConstellas1',1,361,2481,46,56,0,4508.94,-658.169,260.072,5.34478,'1126:0 1130:0 1159:0 '),\n(1159,'RuinsOfConstellas2',1,361,2481,46,56,0,4578.21,-555.417,290.438,2.46629,'1158:0 1160:0 '),\n(1160,'RuinsOfConstellas3',1,361,2481,46,56,0,4580.93,-222.976,301.195,4.57508,'1159:0 '),\n(1161,'Jaedenar1',1,361,1763,46,56,0,4922.62,-656.651,308.014,3.98916,'1132:0 1162:0 '),\n(1162,'Jaedenar2',1,361,1763,46,56,0,4883.95,-595.824,308.56,5.16136,'1131:0 1133:0 1161:0 1163:0 1165:0 1166:0 '),\n(1163,'BloodvenomPostEntrance',1,361,361,46,56,0,5228.11,-538.087,328.617,3.14997,'1134:0 1162:0 1164:0 '),\n(1164,'BloodvenomPost',1,361,1997,46,56,0,5222.93,-365.293,325.373,4.62848,'150:0 1163:0 '),\n(1165,'ShrineOfTheDeceiver',1,361,1771,46,56,0,4783.38,-551.646,274.445,4.62258,'1162:0 '),\n(1166,'Jaedenar3',1,361,1763,46,56,0,4729.93,-453.696,349.944,4.46628,'1162:0 1167:0 '),\n(1167,'Jaedenar4',1,361,1763,46,56,0,4856.52,-382.228,350.288,4.8845,'1166:0 1168:0 '),\n(1168,'ShadowHold1',1,361,1770,46,56,0,4986.27,-445.68,316.676,5.65694,'1167:0 1169:0 '),\n(1169,'ShadowHold2',1,361,1770,46,56,0,5098.64,-485.812,296.677,4.68186,'1168:0 1170:0 '),\n(1170,'ShadowHold3',1,361,1770,46,56,0,5178.54,-485.604,301.227,5.33099,'1169:0 1171:0 '),\n(1171,'ShadowHold4',1,361,1770,46,56,0,5275.41,-671.399,253.46,3.4162,'1170:0 1172:0 '),\n(1172,'ShadowHold5',1,361,1770,46,56,0,5339.64,-532.836,254.255,4.57192,'1171:0 1173:0 1174:0 '),\n(1173,'ShadowHold6',1,361,1770,46,56,0,5427.58,-486.39,248.303,2.98345,'1172:0 '),\n(1174,'ShadowHold7',1,361,1770,46,56,0,5435.52,-425.111,272.429,5.11384,'1172:0 '),\n(1175,'ShatterScarVale1',1,361,1766,46,56,0,5476.34,-722.154,342.284,2.91904,'1135:0 1136:0 1176:0 1178:0 '),\n(1176,'ShatterScarVale2',1,361,1766,46,56,0,5601.44,-768.8,344.125,2.60488,'1136:0 1137:0 1175:0 1178:0 '),\n(1177,'ShatterScarVale3',1,361,1766,46,56,0,5560.13,-1032.72,379.177,1.06354,'1137:0 1178:0 1179:0 '),\n(1178,'ShatterScarVale4',1,361,1766,46,56,0,5457.81,-881.575,366.112,0.423435,'1175:0 1176:0 1177:0 '),\n(1179,'ShatterScarVale5',1,361,1766,46,56,0,5754.61,-1189.42,406.559,5.86624,'1177:0 1180:0 '),\n(1180,'IrontreeWoods1',1,361,1767,46,56,0,6121.79,-1182.38,370.89,3.93611,'1139:0 1179:0 1181:0 1182:0 '),\n(1181,'IrontreeWoods2',1,361,1767,46,56,0,6394.76,-1179.55,386.014,6.27855,'1140:0 1142:0 1180:0 '),\n(1182,'IrontreeWoods3',1,361,1767,46,56,0,6130.52,-1612.09,477.459,1.51512,'1180:0 1183:0 '),\n(1183,'IrontreeWoods4',1,361,1767,46,56,0,6296.99,-1561.48,453.656,3.98913,'1145:0 1182:0 149:0 '),\n(1184,'IrontreeCavern1',1,361,1768,46,56,0,6352.66,-1649.89,424.433,0.128896,'149:0 1185:0 1186:0 '),\n(1185,'IrontreeCavern2',1,361,1768,46,56,0,6439.2,-1697.67,413.417,3.51397,'1184:0 '),\n(1186,'IrontreeCavern3',1,361,1768,46,56,0,6348.65,-1752.82,421.668,2.4419,'1184:0 '),\n(1187,'JadefireRun1',1,361,2618,46,56,0,6621.19,-889.352,485.149,4.30328,'1141:0 1188:0 '),\n(1188,'JadefireRun2',1,361,2618,46,56,0,6459.98,-779.685,474.056,3.5611,'1139:0 1187:0 1189:0 '),\n(1189,'JadefireRun3',1,361,2618,46,56,0,6292.94,-589.199,467.536,5.59331,'1188:0 '),\n(1190,'FelwoodSide3_1',1,361,361,46,56,0,6839.58,-1594.78,491.498,3.27443,'1143:0 1144:0 '),\n(1191,'TalonbranchGladeEntrance',1,361,1998,46,56,0,6265.97,-1990.07,570.371,0.397118,'1146:0 1148:0 1192:0 '),\n(1192,'TalonbranchGlade',1,361,1998,46,56,3,6170.94,-1933.43,569.997,5.3569,'1191:0 '),\n(1193,'FelpawVillage1',1,361,1762,46,56,0,6806.95,-1993.95,564.972,2.74938,'1146:0 1147:0 1194:0 1195:0 '),\n(1194,'FelpawVillage2',1,361,1762,46,56,0,6789.17,-1850.3,554.16,4.19844,'1193:0 1195:0 '),\n(1195,'FelpawVillage3',1,361,1762,46,56,0,6929.55,-1812.01,575.12,3.87447,'1193:0 1194:0 '),\n(1196,'TimbermawHoldInside',1,361,1769,46,56,0,7017.44,-2122.43,586.887,0.262027,'142:0 148:0 1197:0 '),\n(1197,'MoongladeExitS',1,493,493,46,60,0,7409.39,-2177.56,520.829,3.84148,'1196:0 1198:0 1199:0 '),\n(1198,'MoongladeFlightH',1,493,493,46,60,5,7479.01,-2119.01,492.215,1.99187,'1197:0 1199:0 '),\n(1199,'MoongladeMainRoad1',1,493,493,46,60,0,7621.21,-2207.23,468.939,2.73996,'1197:0 1198:0 1200:0 '),\n(1200,'MoongladeMainRoad2',1,493,493,46,60,0,7521.64,-2483.68,454.141,1.37142,'1199:0 1201:0 '),\n(1201,'MoongladeFlightA',1,493,493,46,60,3,7441.03,-2497.31,462.16,0.100638,'1200:0 '),\n(1202,'FrostfireHotSprings1',1,618,2246,53,60,0,6669.75,-2350.35,569.688,6.11089,'142:0 1203:0 1204:0 1205:0 '),\n(1203,'FrostfireHotSprings2',1,618,618,53,60,0,6516.03,-2438.96,575.469,0.575811,'1202:0 1204:0 1205:0 1206:0 '),\n(1204,'FrostfireHotSprings3',1,618,2246,53,60,0,6739.97,-2534.28,547.608,2.35473,'1202:0 1203:0 1205:0 1206:0 1207:0 '),\n(1205,'FrostfireHotSprings4',1,618,2246,53,60,0,6844.94,-2510.17,562.168,2.83383,'1202:0 1203:0 1204:0 1207:0 '),\n(1206,'WinterspringWRoad1',1,618,618,53,60,0,6552.68,-2761.31,569.286,1.6412,'1203:0 1204:0 1208:0 1209:0 '),\n(1207,'FrostfireHotSprings5',1,618,2246,53,60,0,6778.35,-2683.46,542.964,1.10124,'1204:0 1205:0 '),\n(1208,'WinterspringWRoad2',1,618,618,53,60,0,6544.07,-3009.5,594.631,1.59877,'1206:0 1209:0 1211:0 1213:0 '),\n(1209,'TimbermawPost1',1,618,2243,53,60,0,6443.26,-2975.94,574.619,1.46329,'1206:0 1208:0 1210:0 '),\n(1210,'TimbermawPost2',1,618,2243,53,60,0,6501.28,-3395.1,596.264,1.54182,'1209:0 1212:0 '),\n(1211,'WinterspringWRoad3',1,618,618,53,60,0,6612.45,-3218.46,610.975,1.85402,'1208:0 1212:0 1213:0 '),\n(1212,'WinterspringWRoad4',1,618,618,53,60,0,6645.3,-3475.9,667.925,1.61251,'1210:0 1211:0 1214:0 '),\n(1213,'FrostfireHotSprings6',1,618,2246,53,60,0,6782.88,-3070.45,577.01,3.04979,'1208:0 1211:0 '),\n(1214,'WinterspringWRoad5',1,618,618,53,60,0,6657.52,-3668.1,695.82,1.56341,'1212:0 1215:0 1216:0 1221:0 '),\n(1215,'WinterspringWRoad6',1,618,2252,53,60,0,6397.07,-3892.14,680.982,0.597365,'1214:0 1216:0 1217:0 '),\n(1216,'LakeKeltheril',1,618,2251,53,60,0,6536.55,-4131.94,665.606,1.20213,'1214:0 1215:0 143:0 1218:0 '),\n(1217,'Mazthoril1',1,618,2245,53,60,0,6183.02,-4265.44,745.257,1.04309,'1215:0 1218:0 1219:0 '),\n(1218,'EverlookFork1',1,618,2255,53,60,0,6655.73,-4560.81,717.041,1.46131,'56:0 1216:0 1217:0 1239:0 1240:0 '),\n(1219,'Mazthoril2',1,618,2245,53,60,0,5991.6,-4416.44,712.225,0.648425,'1217:0 1220:0 1255:0 1259:0 '),\n(1220,'Mazthoril3',1,618,2245,53,60,0,6111.88,-4459.18,665.247,2.8927,'1219:0 1254:0 1255:0 '),\n(1221,'WinterspringCFork',1,618,618,53,60,0,6913.24,-4134.15,695.074,1.72442,'1214:0 1222:0 1224:0 1225:0 '),\n(1222,'WinterspringNRoad1',1,618,618,53,60,0,7189.47,-4145.52,708.652,2.01894,'1221:0 1223:0 1224:0 1225:0 1226:0 '),\n(1223,'StarfallVillage1',1,618,2253,53,60,2,7163.35,-3949.34,749.855,4.52632,'1222:0 1224:0 '),\n(1224,'StarfallVillage2',1,618,2253,53,60,2,7095.04,-4017.7,744.806,3.57795,'1221:0 1222:0 1223:0 '),\n(1225,'WinterspringN_hub1',1,618,618,53,60,0,7243.63,-4428.68,637.464,1.30573,'147:0 1221:0 1222:0 1235:0 '),\n(1226,'WinterspringNRoad2',1,618,618,53,60,0,7437.77,-4106.34,703.256,3.39493,'1222:0 1227:0 1231:0 1233:0 '),\n(1227,'WinterspringNRoad3',1,618,2241,53,60,0,7658.36,-4006.12,703.193,3.60307,'1226:0 1228:0 1229:0 1230:0 '),\n(1228,'FrostsaberRock',1,618,2241,53,60,0,8080.15,-3838.54,691.237,3.49507,'1227:0 1229:0 1230:0 '),\n(1229,'FrostsaberRockSide1',1,618,2241,53,60,0,7601.67,-3828.53,689.193,5.16206,'1227:0 1228:0 '),\n(1230,'FrostsaberRockSide2',1,618,2241,53,60,0,7960.17,-4207.36,694.89,1.05442,'1227:0 1228:0 1231:0 1232:0 '),\n(1231,'FrostsaberRockSide3',1,618,2241,53,60,0,7696.88,-4240.08,674.756,0.182632,'1226:0 1230:0 1232:0 1233:0 '),\n(1232,'FrostsaberRockSide4',1,618,2241,53,60,0,7898.77,-4343.01,714.863,1.26058,'1230:0 1231:0 1234:0 '),\n(1233,'WinterspringN_hub2',1,618,618,53,60,0,7541.26,-4433.34,604.622,1.91639,'1226:0 1231:0 1234:0 1235:0 '),\n(1234,'WinterspringN_hub3',1,618,618,53,60,0,7841.47,-4633.94,711.459,1.96351,'1232:0 1233:0 '),\n(1235,'WinterspringN_hub4',1,618,618,53,60,0,7409.79,-4690.69,629.373,2.1363,'1225:0 1233:0 1236:0 1238:0 '),\n(1236,'WinterspringN_hub5',1,618,618,53,60,0,7593.76,-4979.89,701.375,2.05382,'1235:0 1237:0 1238:0 '),\n(1237,'HiddenGrove',1,618,2242,53,60,0,7765.82,-4824.05,695.683,4.13316,'1236:0 '),\n(1238,'WinterfallVillage1',1,618,2244,53,60,0,7043.19,-4998.21,715.354,0.445711,'1235:0 1236:0 1243:0 '),\n(1239,'EverlookFork2',1,618,2255,53,60,0,6611.3,-4739.92,698.015,0.695072,'1218:0 1241:0 1247:0 1254:0 '),\n(1240,'EverlookFlightH',1,618,2255,53,60,5,6816.77,-4612.99,710.669,6.21445,'56:0 1218:0 1242:0 '),\n(1241,'EverlookFlightA',1,618,2255,53,60,3,6790.08,-4744.29,701.5,3.20441,'1239:0 1242:0 '),\n(1242,'WinterspringN_hub6',1,618,618,53,60,0,6927.32,-4786.97,694.458,2.5918,'1240:0 1241:0 1243:0 '),\n(1243,'WinterfallVillageOutside',1,618,2244,53,60,0,6939.52,-5010.6,692.554,1.59042,'1238:0 1242:0 1244:0 '),\n(1244,'WinterfallVillage2',1,618,2244,53,60,0,6808.46,-5094.96,695.933,0.427246,'1243:0 1245:0 '),\n(1245,'WinterfallVillage3',1,618,2244,53,60,0,6729.74,-5155.43,735.364,6.18029,'1244:0 1246:0 '),\n(1246,'WinterfallVillage4',1,618,2244,53,60,0,6716.73,-5241.35,779.049,1.49343,'1245:0 '),\n(1247,'IceThistleHills1',1,618,2247,53,60,0,6422.5,-5063.45,747.183,0.955424,'1239:0 1248:0 1249:0 '),\n(1248,'IceThistleHills2',1,618,2247,53,60,0,6075.66,-5048.11,793.011,6.23722,'1247:0 1255:0 '),\n(1249,'IceThistleHillsCave1',1,618,2247,53,60,0,6558.26,-5114.63,770.071,4.80583,'1247:0 1250:0 '),\n(1250,'IceThistleHillsCave2',1,618,2247,53,60,0,6647.69,-5270.98,753.532,0.248568,'1249:0 1251:0 1252:0 '),\n(1251,'IceThistleHillsCave3',1,618,2247,53,60,0,6547.52,-5279.93,751.433,0.29569,'1250:0 '),\n(1252,'IceThistleHillsCave4',1,618,2247,53,60,0,6591.19,-5377.61,757.91,2.11585,'1250:0 1253:0 '),\n(1253,'IceThistleHillsCave5',1,618,2247,53,60,0,6749.19,-5302.24,746.013,3.42748,'1252:0 '),\n(1254,'WinterspringSFork',1,618,618,53,60,0,6181.52,-4918.26,736.9,1.70352,'1220:0 1239:0 1255:0 '),\n(1255,'WinterspringSRoad1',1,618,618,53,60,0,5738.96,-4759.97,772.327,5.63249,'144:0 1219:0 1220:0 1248:0 1254:0 1256:0 1258:0 '),\n(1256,'OwlWingThicket1',1,618,2250,53,60,0,5704.51,-4972.1,807.203,1.24015,'1255:0 1257:0 '),\n(1257,'OwlWingThicket2',1,618,2250,53,60,0,5516.17,-4932.2,843.306,5.86024,'1256:0 '),\n(1258,'WinterspringSRoad2',1,618,618,53,60,0,5542.21,-4699,784.197,5.83863,'144:0 1255:0 1263:0 '),\n(1259,'DunMandarrW',1,618,2248,53,60,0,5726.18,-4420.5,778.036,0.0455333,'144:0 1219:0 '),\n(1260,'FrostwhisperGorge1',1,618,2249,53,60,0,5376.4,-4513.45,720.025,0.126024,'144:0 1261:0 '),\n(1261,'FrostwhisperGorge2',1,618,2249,53,60,0,5296.85,-4663.41,691.461,1.09206,'1260:0 1262:0 '),\n(1262,'FrostwhisperGorge3',1,618,2249,53,60,0,5259.63,-4868.84,691.501,1.4769,'1261:0 '),\n(1263,'FrostwhisperGorgeBridge1',1,618,618,53,60,0,5329.29,-4753.88,815.467,6.28158,'1258:0 1264:0 '),\n(1264,'FrostwhisperGorgeBridge2',1,618,618,53,60,1,5184.44,-4704.74,823.398,6.16966,'1263:0 1265:0 '),\n(1265,'DarkwhisperGorge1',1,618,618,53,60,0,5076.75,-4593.36,846.068,5.72001,'1264:0 1266:0 1267:0 1268:0 '),\n(1266,'DarkwhisperGorge2',1,618,2249,53,60,0,5094.49,-4876.76,867.355,1.66931,'1265:0 '),\n(1267,'DarkwhisperGorge3',1,618,2249,53,60,0,5323.19,-4418.49,854.383,3.62103,'1265:0 '),\n(1268,'DarkwhisperGorge4',1,618,2256,53,60,0,4938.26,-4535.16,855.372,3.64264,'1265:0 '),\n(1269,'AzsharaExitW',1,16,878,43,54,0,2800.83,-3813.24,83.7107,0.929092,'1095:0 1270:0 '),\n(1270,'TalrendisPointRoad',1,16,3137,43,54,0,2749.62,-3926.91,89.3218,0.361656,'1269:0 145:0 1271:0 1273:0 '),\n(1271,'ShadowsongShrine1',1,16,878,43,54,0,2935.67,-3982.68,124.392,2.73551,'1270:0 1272:0 '),\n(1272,'ShadowsongShrine2',1,16,1235,43,54,0,2850.78,-4024.75,140.874,0.32041,'1271:0 '),\n(1273,'AzsharaRoad1',1,16,16,43,54,0,2815.94,-4122.46,94.8896,2.21715,'1270:0 1274:0 1279:0 '),\n(1274,'AzsharaRoad2',1,16,16,43,54,0,2941.29,-4227.56,95.186,2.45278,'1273:0 1275:0 1280:0 '),\n(1275,'AzsharaRoad3',1,16,16,43,54,0,3057.29,-4322.31,90.9214,2.58827,'1274:0 1276:0 1280:0 '),\n(1276,'AzsharaRoad4',1,16,16,43,54,0,3229.99,-4491.16,92.7121,1.9737,'1275:0 1277:0 1280:0 1284:0 '),\n(1277,'AzsharaRoad5',1,16,16,43,54,0,3333.33,-4589.69,92.2964,2.31141,'1276:0 1278:0 1283:0 1286:0 1326:0 '),\n(1278,'AzsharaRoad6',1,16,16,43,54,0,3451.9,-4750.56,108.662,2.10326,'1277:0 1286:0 1287:0 1288:0 1324:0 1327:0 '),\n(1279,'AzsharaE1',1,16,16,43,54,0,2997.33,-4106.35,99.9666,3.2087,'1273:0 1280:0 1283:0 '),\n(1280,'AzsharaE2',1,16,1236,43,54,0,3118.77,-4225.25,100.015,2.98486,'1274:0 1275:0 1276:0 1279:0 1281:0 1283:0 '),\n(1281,'AzsharaE3',1,16,1236,43,54,0,3300.36,-4275.9,126.16,2.80817,'1280:0 1282:0 '),\n(1282,'AzsharaE4',1,16,1236,43,54,0,3271.81,-4373.57,125.961,1.43765,'1281:0 '),\n(1283,'AzsharaE5',1,16,1236,43,54,0,3373.1,-4206.33,105.482,3.57,'1277:0 1279:0 1280:0 1284:0 1285:0 '),\n(1284,'AzsharaE6',1,16,16,43,54,0,3582.46,-4138.13,104.333,3.80758,'1276:0 1283:0 1285:0 '),\n(1285,'Valormok',1,16,1237,43,54,5,3613.75,-4414.24,112.731,2.85922,'1283:0 1284:0 1286:0 '),\n(1286,'AzsharaE7',1,16,16,43,54,0,3590.09,-4639.97,116.675,1.6988,'1277:0 1278:0 1285:0 1287:0 '),\n(1287,'AzsharaE8',1,16,1224,43,54,0,3744.78,-4813.74,138.923,2.88199,'1278:0 1286:0 1289:0 '),\n(1288,'AzsharaE9',1,16,1221,43,54,0,3499.39,-4902.72,144.155,1.64696,'1278:0 1289:0 '),\n(1289,'AzsharaE10',1,16,1221,43,54,0,3759.42,-4967.77,142.273,2.79364,'1287:0 1288:0 1290:0 '),\n(1290,'AzsharaN1',1,16,1216,43,54,0,4036.22,-5259.02,107.607,2.29688,'1289:0 1291:0 1292:0 1322:0 '),\n(1291,'AzsharaN2',1,16,1216,43,54,0,4056.25,-5430.36,110.698,6.13747,'1290:0 1294:0 1293:0 1322:0 '),\n(1292,'AzsharaN3',1,16,1216,43,54,0,4443.1,-5422.68,110.062,2.83485,'1290:0 1293:0 '),\n(1293,'AzsharaN4',1,16,1225,43,54,0,4501.55,-5509.11,112.466,2.9016,'1291:0 1292:0 1294:0 1295:0 '),\n(1294,'AzsharaN5',1,16,1225,43,54,0,4344.93,-5684.07,101.657,1.91789,'1291:0 1293:0 1296:0 1297:0 1322:0 '),\n(1295,'AzsharaN6',1,16,1219,43,54,0,4731.82,-5683.23,101.157,2.58744,'1293:0 1296:0 1297:0 '),\n(1296,'AzsharaN7',1,16,1220,43,54,0,4463.44,-6017.87,99.0046,1.97484,'1294:0 1295:0 1299:0 1300:0 '),\n(1297,'AzsharaN8',1,16,1219,43,54,0,4794.73,-5948.23,94.5572,2.9291,'1294:0 1295:0 1298:0 1300:0 '),\n(1298,'AzsharaN9',1,16,1219,43,54,0,4752.23,-6324.43,112.261,1.52126,'1297:0 1300:0 1301:0 '),\n(1299,'AzsharaN10',1,16,1220,43,54,0,4304.26,-6172.26,132.068,0.476687,'1296:0 1300:0 '),\n(1300,'AzsharaN11',1,16,1220,43,54,0,4483.15,-6277.92,109.808,2.02983,'1296:0 1297:0 1298:0 1299:0 1302:0 '),\n(1301,'AzsharaN12',1,16,1219,43,54,0,4815.57,-6641.1,96.3628,1.82366,'1298:0 1302:0 1304:0 '),\n(1302,'AzsharaN13',1,16,1219,43,54,0,4579.43,-6593.47,100.233,1.80599,'1300:0 1301:0 1303:0 '),\n(1303,'AzsharaN14',1,16,2497,43,54,0,4335.22,-6872.83,94.6868,0.889033,'1302:0 1304:0 1305:0 1306:0 '),\n(1304,'AzsharaN15',1,16,2497,43,54,0,4772.55,-7077.06,93.7659,1.50753,'1301:0 1303:0 1306:0 1308:0 '),\n(1305,'AzsharaN16',1,16,1228,43,54,0,4163.23,-7077.25,104.42,0.918482,'1303:0 '),\n(1306,'AzsharaN17',1,16,2497,43,54,0,4378.53,-7190.76,114.567,1.36616,'1303:0 1304:0 1307:0 '),\n(1307,'AzsharaN18',1,16,2497,43,54,0,4547.1,-7477.55,77.7456,1.89042,'1306:0 1308:0 1312:0 1313:0 '),\n(1308,'AzsharaN19',1,16,2497,43,54,0,4697.79,-7545.77,76.1055,2.41466,'1304:0 1307:0 1309:0 1311:0 '),\n(1309,'AzsharaN20',1,16,1230,43,54,0,4879.55,-7649.88,-0.264126,2.8859,'1308:0 1310:0 1311:0 '),\n(1310,'AzsharaN21',1,16,1230,43,54,0,4981.1,-7379.41,2.45741,4.29372,'1309:0 '),\n(1311,'AzsharaN22',1,16,1230,43,54,0,4636.23,-7784.83,-0.404812,0.517923,'1308:0 1309:0 1312:0 1313:0 '),\n(1312,'AzsharaN23',1,16,1229,43,54,0,4265.54,-7853.88,3.0357,0.839938,'1307:0 1311:0 1313:0 '),\n(1313,'AzsharaN24',1,16,1228,43,54,0,4328.17,-7549.27,10.4959,5.60927,'1307:0 1311:0 1312:0 1314:0 1316:0 '),\n(1314,'AzsharaN25',1,16,1228,43,54,0,4248.34,-7195.83,18.9926,3.96189,'1313:0 1315:0 '),\n(1315,'AzsharaN26',1,16,1226,43,54,0,4103.25,-7187.96,10.5715,6.16297,'1314:0 1316:0 1317:0 '),\n(1316,'AzsharaN27',1,16,1226,43,54,0,4038.51,-7321.54,1.12717,0.769242,'1313:0 1315:0 1317:0 '),\n(1317,'AzsharaN28',1,16,1226,43,54,0,3934.81,-7205.7,26.486,5.91163,'1315:0 1316:0 1318:0 1320:0 1321:0 '),\n(1318,'TempleOfArkkoran1',1,16,1226,43,54,0,3807.79,-7280.66,26.4812,1.14034,'1317:0 1319:0 '),\n(1319,'TempleOfArkkoran2',1,16,1226,43,54,0,3768.46,-7134.44,26.4806,5.96857,'1318:0 1320:0 '),\n(1320,'TempleOfArkkoran3',1,16,1226,43,54,0,3902.48,-7060.61,26.4811,4.31335,'1317:0 1319:0 '),\n(1321,'TempleOfArkkoran4',1,16,1226,43,54,0,3858.12,-7171.88,24.03,5.83506,'1317:0 '),\n(1322,'AzsharaRamp1Top',1,16,1225,43,54,0,4108.38,-5554.42,99.4778,1.77221,'1290:0 1291:0 1294:0 1323:0 '),\n(1323,'AzsharaRamp1Bottom',1,16,1228,43,54,0,3897.1,-5695.14,17.2205,0.46452,'1322:0 1341:0 1342:0 '),\n(1324,'AzsharaC1',1,16,1221,43,54,0,3389.18,-4881.96,119.527,0.94754,'1278:0 1325:0 '),\n(1325,'AzsharaC2',1,16,1221,43,54,0,3548.39,-5142.38,83.2368,2.40053,'1324:0 1326:0 1328:0 46:0 1332:0 '),\n(1326,'AzsharaC3',1,16,1221,43,54,0,3353.2,-4996.79,88.9565,1.84487,'1277:0 1325:0 '),\n(1327,'AzsharaC4',1,16,1233,43,54,0,3111.76,-5099.04,133.69,0.892567,'1278:0 1328:0 1343:0 1344:0 '),\n(1328,'AzsharaC5',1,16,1221,43,54,0,3288.43,-5313.47,92.0357,2.24738,'1325:0 1327:0 1329:0 '),\n(1329,'AzsharaC6',1,16,1221,43,54,0,3069.52,-5522.7,98.46,0.58232,'1328:0 1330:0 1343:0 '),\n(1330,'AzsharaC7',1,16,1231,43,54,0,3063.44,-5615.53,60.2217,1.67206,'1329:0 1331:0 1338:0 '),\n(1331,'AzsharaC8',1,16,1231,43,54,0,3004.41,-5699.66,35.8993,0.918073,'1330:0 1334:0 '),\n(1332,'AzsharaC9',1,16,1221,43,54,0,3744.95,-5305.2,85.9123,2.48299,'1325:0 1333:0 '),\n(1333,'AzsharaC10',1,16,1228,43,54,0,3658.05,-5517.8,24.2321,1.28329,'1332:0 1339:0 1340:0 1341:0 '),\n(1334,'AzsharaC11',1,16,1231,43,54,0,3087.73,-5859.39,-0.161575,2.13546,'1331:0 1335:0 1338:0 '),\n(1335,'AzsharaC12',1,16,1231,43,54,0,2934.41,-5884.56,25.8109,0.120912,'1334:0 1336:0 '),\n(1336,'AzsharaC13',1,16,1231,43,54,0,2980.62,-6084.05,0.213247,2.38089,'1335:0 1337:0 '),\n(1337,'AzsharaC14',1,16,1231,43,54,0,2846.38,-6166.7,3.60284,0.643192,'1336:0 '),\n(1338,'AzsharaC15',1,16,1231,43,54,0,3226.36,-5673.24,15.8216,3.93007,'1330:0 1334:0 1339:0 1340:0 '),\n(1339,'AzsharaC16',1,16,1231,43,54,0,3427.33,-5505.43,26.9806,5.26131,'1333:0 1338:0 1340:0 1341:0 '),\n(1340,'AzsharaC17',1,16,1231,43,54,0,3475.44,-5753.95,11.6531,1.76236,'1333:0 1338:0 1339:0 1341:0 '),\n(1341,'AzsharaC18',1,16,1228,43,54,0,3704.73,-5723.53,4.41024,0.254392,'1323:0 1333:0 1339:0 1340:0 1342:0 '),\n(1342,'AzsharaC19',1,16,1228,43,54,0,3948.84,-5885.08,8.49314,2.09811,'1323:0 1341:0 '),\n(1343,'AzsharaS1',1,16,1234,43,54,0,2887.1,-5407.2,110.727,1.29111,'1327:0 1329:0 1344:0 1347:0 1346:0 '),\n(1344,'AzsharaS2',1,16,1234,43,54,0,2671.51,-5134.67,110.162,6.23323,'1327:0 1343:0 1345:0 '),\n(1345,'AzsharaS3',1,16,1234,43,54,0,2476.44,-5345.72,112.668,0.747221,'1344:0 1346:0 '),\n(1346,'AzsharaS4',1,16,16,43,54,0,2551.54,-5739.78,99.3784,1.5499,'1343:0 1345:0 1347:0 1348:0 '),\n(1347,'AzsharaS5',1,16,16,43,54,0,2773.38,-5801.37,102.296,1.23417,'1343:0 1346:0 '),\n(1348,'AzsharaS6',1,16,16,43,54,0,2497.05,-6122.14,101.12,1.55774,'1346:0 1349:0 '),\n(1349,'AzsharaS7',1,16,16,43,54,0,2591.64,-6535.29,102.94,1.79136,'1348:0 1350:0 1351:0 '),\n(1350,'AzsharaS8',1,16,16,43,54,0,2738.28,-6626.16,105.229,0.130243,'1349:0 '),\n(1351,'AzsharaS9',1,16,1232,43,54,0,2530.76,-6691.49,105.655,1.22588,'1349:0 1352:0 1353:0 '),\n(1352,'AzsharaS10',1,16,1232,43,54,0,2594.6,-6859.47,124.355,1.98575,'1351:0 '),\n(1353,'AzsharaS11',1,16,1232,43,54,0,2469.22,-6950.98,112.622,1.32995,'1351:0 1354:0 '),\n(1354,'AzsharaS12',1,16,1232,43,54,0,2290.99,-6837.2,120.824,5.67516,'1353:0 1355:0 '),\n(1355,'AzsharaS13',1,16,1232,43,54,0,2245.13,-6620.49,130.493,5.82242,'1354:0 '),\n(1356,'NightsongWoodsSE',1,331,2457,18,30,0,2031.76,-3416.6,92.6375,6.12481,'1097:0 1099:0 1116:0 1357:0 '),\n(1357,'SouthfuryRiver1',1,331,879,18,30,0,2157.71,-3580.65,40.0791,2.2096,'1356:0 1358:0 '),\n(1358,'SouthfuryRiver2',1,331,879,18,30,0,1982.59,-3613.01,40.3535,1.3378,'1357:0 1359:0 '),\n(1359,'SouthfuryRiver3',1,331,879,18,30,4,1751.38,-3745.84,39.7381,3.16817,'1358:0 1360:0 '),\n(1360,'OrgrimmarExitW',1,17,815,8,25,4,1641.94,-3837.63,50.7719,5.47332,'1359:0 1454:0 '),\n(1361,'DurotarN_hub1',1,14,14,1,10,4,1290.89,-4391.75,26.2836,3.73994,'30:0 1362:0 1377:0 1385:0 1386:0 '),\n(1362,'DurotarN_hub2',1,14,14,1,10,4,1341.58,-4623.78,24.2112,1.68496,'1361:0 1363:0 1365:0 1377:0 '),\n(1363,'SkullRock1',1,14,817,1,10,4,1448.11,-4879.66,11.5034,1.9029,'1362:0 1364:0 1365:0 '),\n(1364,'SkullRock2',1,14,817,1,10,4,1445.58,-4687.97,-5.65162,4.9365,'1363:0 '),\n(1365,'DurotarN_hub3',1,14,14,1,10,4,1100.2,-4908.62,14.577,0.165201,'1362:0 1363:0 1366:0 1367:0 '),\n(1366,'DurotarN_hub4',1,14,375,1,10,4,985.89,-5115.68,1.41706,1.16658,'1365:0 1367:0 '),\n(1367,'DurotarN_hub5',1,14,14,1,10,4,809.043,-4957.4,16.2794,2.83475,'1365:0 1366:0 1368:0 1370:0 '),\n(1368,'DustwindCave1',1,14,14,1,10,4,778.919,-4756.62,37.5488,4.94158,'1367:0 1369:0 1370:0 '),\n(1369,'DustwindCave2',1,14,371,1,10,4,931.181,-4715.15,19.9519,2.6443,'1368:0 '),\n(1370,'DurotarN_hub6',1,14,14,1,10,4,512.237,-4785.91,29.1897,1.93467,'1367:0 1368:0 1371:0 1407:0 '),\n(1371,'DurotarN_hub7',1,14,14,1,10,4,438.776,-4564.65,52.1313,5.05391,'1370:0 1372:0 1400:0 1403:0 '),\n(1372,'DurotarN_hub8',1,14,14,1,10,4,599.139,-4404.63,18.4833,5.05392,'1371:0 66:0 67:0 1400:0 1403:0 '),\n(1373,'DurotarCanyon1_2',1,14,410,1,10,4,754.968,-4457.2,15.6687,1.93155,'66:0 67:0 '),\n(1374,'DurotarCanyon1_3',1,14,14,1,10,4,720.095,-4682.12,-6.58629,2.1711,'66:0 1375:0 1401:0 '),\n(1375,'DurotarCanyon1_4',1,14,14,1,10,4,762.27,-4587.67,0.395604,5.89975,'1374:0 1376:0 1384:0 '),\n(1376,'DurotarCanyon1_5',1,14,410,1,10,4,909.793,-4623.59,17.4591,2.58341,'1375:0 1377:0 1378:0 '),\n(1377,'DurotarCanyon1_6',1,14,14,1,10,4,1089.79,-4544.84,18.7912,3.37862,'1361:0 1362:0 1376:0 1385:0 '),\n(1378,'DurotarCanyon1_7',1,14,410,1,10,4,846.499,-4687.15,10.6635,4.45069,'1376:0 1379:0 '),\n(1379,'DurotarCanyon1_8',1,14,370,1,10,4,822.93,-4819.09,11.1622,1.25216,'1378:0 1380:0 '),\n(1380,'DurotarCanyon1_9',1,14,370,1,10,4,922.247,-4823.86,14.833,3.04091,'1379:0 1381:0 1382:0 '),\n(1381,'DurotarCanyon1_10',1,14,370,1,10,4,984.82,-4668.01,26.8858,4.65295,'1380:0 '),\n(1382,'DurotarCanyon1_11',1,14,370,1,10,4,1028.11,-4807.86,13.422,1.33267,'1380:0 1383:0 '),\n(1383,'DurotarCanyon1_12',1,14,370,1,10,4,1112.67,-4667.33,19.0025,5.6445,'1382:0 '),\n(1384,'DurotarCanyon1_13',1,14,14,1,10,4,863.608,-4507.22,5.89497,4.47623,'1375:0 1385:0 '),\n(1385,'DurotarCanyon1_14',1,14,14,1,10,4,1076.54,-4421.72,18.043,3.13516,'67:0 1361:0 1377:0 1384:0 1387:0 '),\n(1386,'RocktuskFarm',1,14,1296,1,10,4,1261.75,-4189.97,25.9612,5.01817,'1361:0 1387:0 1388:0 '),\n(1387,'DurotarN_hub9',1,14,14,1,10,4,1103.69,-4095.77,17.1414,5.61704,'1385:0 1386:0 1388:0 1389:0 '),\n(1388,'DurotarN_hub10',1,14,14,1,10,4,1240.84,-3994.36,19.8563,4.64119,'1386:0 1387:0 1389:0 1452:0 1453:0 '),\n(1389,'DurotarN_hub11',1,14,814,1,10,4,932.462,-3903.15,18.4923,5.69476,'1387:0 1388:0 1390:0 1391:0 1451:0 1452:0 '),\n(1390,'DurotarN_hub12',1,14,14,1,10,4,554.028,-3867,21.5181,6.15421,'1389:0 1391:0 1392:0 1405:0 1406:0 '),\n(1391,'DurotarN_hub13',1,14,14,1,10,4,484.992,-4008.81,21.634,0.40509,'1389:0 1390:0 1392:0 1400:0 1405:0 1406:0 '),\n(1392,'DurotarCanyon2_1',1,14,14,1,10,4,621.087,-4034.14,5.79289,6.22882,'67:0 1390:0 1391:0 1393:0 1400:0 '),\n(1393,'DurotarCanyon2_2',1,14,369,1,10,4,805.35,-4026.74,-8.81716,3.20306,'1392:0 1394:0 1398:0 '),\n(1394,'DurotarCanyon2_3',1,14,369,1,10,4,924.692,-4010.46,-13.3326,3.34246,'1393:0 1395:0 '),\n(1395,'DurotarCanyon2_4',1,14,369,1,10,4,969.211,-4144.86,-6.8125,2.00533,'1394:0 1396:0 1397:0 '),\n(1396,'DurotarCanyon2_5',1,14,369,1,10,4,858.51,-4186.73,-13.9605,0.410964,'1395:0 '),\n(1397,'DurotarCanyon2_6',1,14,369,1,10,4,955.695,-4276.78,-6.40429,1.49874,'1395:0 '),\n(1398,'DurotarCanyon2_7',1,14,369,1,10,4,832.014,-4096.6,-12.8537,2.28805,'1393:0 1399:0 '),\n(1399,'DurotarCanyon2_8',1,14,369,1,10,4,733.597,-4112.95,-9.91997,0.344189,'1398:0 '),\n(1400,'RazormaneGrounds',1,14,816,1,10,4,394.471,-4227.01,25.6721,6.10902,'67:0 1371:0 1372:0 1391:0 1392:0 1403:0 1404:0 '),\n(1401,'DurotarCanyon1_15',1,14,14,1,10,4,618.018,-4729.15,-9.7302,0.530719,'1374:0 28:0 '),\n(1402,'DurotarRoadW1',1,14,14,1,10,4,229.555,-4564.93,14.4257,4.87206,'28:0 1403:0 1409:0 1437:0 '),\n(1403,'DurotarRoadW2',1,14,14,1,10,4,311.231,-4367.13,23.2866,0.650496,'1371:0 1372:0 1400:0 1402:0 1404:0 1437:0 1440:0 '),\n(1404,'DurotarRoadW3',1,14,14,1,10,4,290.25,-4093.37,30.0616,4.8897,'1400:0 1403:0 1405:0 1440:0 1441:0 1443:0 '),\n(1405,'DurotarRoadW4',1,14,14,1,10,4,289.101,-3928.87,32.0584,5.95001,'1390:0 1391:0 1404:0 1406:0 1441:0 1443:0 '),\n(1406,'DurotarWBridge',1,14,814,1,10,4,317.731,-3805.25,24.3367,6.02659,'1390:0 1391:0 1405:0 1443:0 1449:0 '),\n(1407,'DurotarS_hub1',1,14,14,1,10,4,250.862,-4982.03,19.1509,0.356019,'1370:0 1408:0 1409:0 1410:0 1414:0 '),\n(1408,'DurotarS_hub2',1,14,373,1,10,4,274.781,-5126.02,4.75879,2.02892,'1407:0 1414:0 '),\n(1409,'DurotarRoadS1',1,14,14,1,10,4,119.098,-4745.19,15.4912,5.09591,'28:0 1402:0 1407:0 1410:0 1414:0 1415:0 '),\n(1410,'DurotarRoadS2',1,14,14,1,10,4,-99.4238,-4745.37,21.6208,0.102741,'1407:0 1409:0 1411:0 1414:0 '),\n(1411,'DurotarRoadS3',1,14,14,1,10,4,-278.577,-4798.87,28.7297,0.267683,'1410:0 1412:0 1414:0 1415:0 '),\n(1412,'DurotarRoadS4',1,14,14,1,10,4,-448.465,-4791.29,35.8497,6.27205,'1411:0 1413:0 '),\n(1413,'DurotarRoadS5',1,14,14,1,10,4,-640.871,-4736.39,33.6569,6.15227,'1412:0 31:0 1419:0 1421:0 1422:0 1429:0 '),\n(1414,'TirigardeKeep1',1,14,372,1,10,4,-84.5912,-5061.01,15.5227,0.185219,'1407:0 1408:0 1409:0 1410:0 1411:0 1415:0 '),\n(1415,'TirigardeKeep2',1,14,372,1,10,4,-198.068,-5050.76,20.9866,3.49606,'1409:0 1411:0 1414:0 1416:0 1417:0 '),\n(1416,'TirigardeKeep3',1,14,372,1,10,4,-225.492,-5115.3,49.3248,1.51096,'1415:0 '),\n(1417,'TirigardeKeep4',1,14,372,1,10,4,-321.717,-5084.89,21.2127,0.285748,'1415:0 1418:0 '),\n(1418,'TirigardeKeep5',1,14,373,1,10,4,-291.897,-5186.7,20.4791,1.8644,'1417:0 '),\n(1419,'DurotarS_hub3',1,14,393,1,10,4,-716.008,-5088.67,9.54796,1.34603,'31:0 1413:0 1420:0 1444:0 '),\n(1420,'DurotarS_hub4',1,14,393,1,10,4,-920.843,-4982.52,11.1974,5.87385,'31:0 1419:0 1421:0 1422:0 1445:0 '),\n(1421,'DurotarS_hub5',1,14,393,1,10,4,-1100.19,-4784.19,8.13918,5.95632,'31:0 1413:0 1420:0 1422:0 '),\n(1422,'DurotarCanyon3_1',1,14,14,1,10,4,-978.237,-4704.6,20.1681,1.62878,'31:0 1413:0 1420:0 1421:0 1423:0 '),\n(1423,'DurotarCanyon3_2',1,14,366,1,10,4,-986.47,-4574.42,25.5859,4.28734,'1422:0 1424:0 1425:0 1427:0 '),\n(1424,'DurotarCanyon3_3',1,14,366,1,10,4,-1067.61,-4604.24,25.8221,3.64331,'1423:0 '),\n(1425,'DurotarCanyon3_4',1,14,366,1,10,4,-1047.58,-4451.84,27.4603,4.97458,'1423:0 1426:0 '),\n(1426,'DurotarCanyon3_5',1,14,366,1,10,4,-965.059,-4407.81,29.5222,3.58441,'1425:0 '),\n(1427,'DurotarCanyon3_6',1,14,366,1,10,4,-981.936,-4503.15,25.7079,1.87618,'1423:0 1428:0 '),\n(1428,'DurotarCanyon3_7',1,14,366,1,10,4,-904.997,-4477.99,29.6937,3.30756,'1427:0 '),\n(1429,'ValleyOfTrials1',1,14,363,1,10,4,-603.24,-4597.62,41.2213,4.5544,'1413:0 1430:0 '),\n(1430,'ValleyOfTrials2',1,14,363,1,10,4,-580.729,-4526.65,41.4449,4.54262,'1429:0 1431:0 '),\n(1431,'ValleyOfTrials3',1,14,363,1,10,4,-589.381,-4297.57,37.9694,5.56165,'1430:0 29:0 1432:0 1433:0 1434:0 1436:0 '),\n(1432,'ValleyOfTrials4',1,14,363,1,10,4,-746.092,-4261.15,43.9991,6.03879,'1431:0 '),\n(1433,'ValleyOfTrials5',1,14,363,1,10,4,-409.694,-4455.21,51.0433,2.32778,'1431:0 1434:0 1436:0 '),\n(1434,'ValleyOfTrials6',1,14,363,1,10,4,-197.604,-4331.89,68.4747,3.01697,'1431:0 1433:0 1435:0 1436:0 '),\n(1435,'ValleyOfTrials7',1,14,365,1,10,4,-87.1332,-4210.24,49.4149,4.1067,'1434:0 '),\n(1436,'ValleyOfTrials8',1,14,363,1,10,4,-403.018,-4206.27,53.0641,5.51453,'1431:0 1433:0 1434:0 '),\n(1437,'DurotarSW_hub1',1,14,816,1,10,4,162.168,-4433.07,35.4298,5.87386,'1402:0 1403:0 1438:0 1439:0 '),\n(1438,'DurotarSW_hub2',1,14,816,1,10,4,80.4142,-4475.95,43.2596,0.578313,'1437:0 1439:0 '),\n(1439,'DurotarSW_hub3',1,14,816,1,10,4,107.992,-4332.41,52.3223,5.13559,'1437:0 1438:0 1440:0 '),\n(1440,'DurotarSW_hub4',1,14,816,1,10,4,29.2317,-4205.25,67.7773,5.8385,'1403:0 1404:0 1439:0 1441:0 '),\n(1441,'DurotarSW_hub5',1,14,14,1,10,4,-53.7095,-4041.71,67.3331,0.00298548,'1404:0 1405:0 1440:0 1442:0 1443:0 '),\n(1442,'DurotarSW_hub6',1,14,814,1,10,4,-173.855,-3864.96,35.2069,5.30244,'1441:0 1443:0 1476:0 1474:0 '),\n(1443,'DurotarSW_hub7',1,14,14,1,10,4,72.4652,-3876.98,41.5453,3.44105,'1404:0 1405:0 1406:0 1441:0 1442:0 1474:0 '),\n(1444,'EchoIsles1',1,14,368,1,10,4,-808.575,-5363.62,2.20208,1.32598,'1419:0 1445:0 1448:0 '),\n(1445,'EchoIsles2',1,14,368,1,10,4,-1142.01,-5152.05,1.44042,0.283367,'1420:0 1444:0 1446:0 '),\n(1446,'EchoIsles3',1,14,368,1,10,4,-1236.39,-5359.85,5.43454,0.742817,'1445:0 1447:0 1448:0 '),\n(1447,'EchoIsles4',1,14,368,1,10,4,-1232.75,-5606.75,4.85907,1.49091,'1446:0 1448:0 '),\n(1448,'EchoIsles5',1,14,368,1,10,4,-1035.61,-5519.3,7.91372,2.83395,'1444:0 1446:0 1447:0 '),\n(1449,'BarrensNWBridge',1,17,17,8,25,4,313.815,-3718.22,26.5065,4.61206,'1406:0 1450:0 '),\n(1450,'BarrensNW1',1,17,379,8,25,4,319.615,-3637.99,27.1854,4.5885,'1449:0 1451:0 1473:0 1474:0 '),\n(1451,'BarrensNW2',1,17,17,8,25,4,824.833,-3721.02,27.1993,3.19834,'1389:0 1450:0 1452:0 '),\n(1452,'BarrensNW3',1,17,17,8,25,0,1017.81,-3739.15,27.7416,5.18933,'1388:0 1389:0 1451:0 1453:0 1455:0 1459:0 '),\n(1453,'BarrensNW4',1,17,17,8,25,4,1260.21,-3830.17,30.3266,3.3515,'1388:0 1452:0 1454:0 '),\n(1454,'BarrensNW5',1,17,815,8,25,4,1550.39,-3863.76,40.7872,0.119578,'1360:0 1453:0 '),\n(1455,'BarrensNW6',1,17,381,12,25,0,1205.41,-3622.44,82.8357,4.34975,'1452:0 1456:0 1457:0 '),\n(1456,'BarrensNW7',1,17,381,12,25,0,1348.99,-3642.47,111.642,2.66035,'1455:0 1457:0 '),\n(1457,'BarrensNW8',1,17,381,12,25,0,1351.11,-3571.19,92.4931,1.99552,'1455:0 1456:0 1458:0 '),\n(1458,'BarrensNW9',1,17,381,8,25,0,1340.7,-3455.1,93.8483,3.69787,'1457:0 '),\n(1459,'BarrensNW10',1,17,17,12,25,0,1103.13,-3455.42,87.1314,4.31322,'1452:0 1460:0 1462:0 1465:0 '),\n(1460,'BarrensNW11',1,17,17,12,25,0,724.802,-3585.11,91.2962,0.655228,'1459:0 1461:0 '),\n(1461,'BarrensNW12',1,17,17,8,25,0,383.869,-3439.47,95.2678,5.6425,'1460:0 1470:0 1471:0 '),\n(1462,'BarrensNW13',1,17,17,12,25,0,1223.08,-3084.31,93.9201,4.30731,'1459:0 1463:0 1464:0 1466:0 '),\n(1463,'BarrensNW14',1,17,17,18,25,0,1229.76,-2928.45,141.696,4.49974,'1462:0 1464:0 '),\n(1464,'BarrensNW15',1,17,17,12,25,0,1012.81,-2999.42,92.4922,0.109361,'1462:0 1463:0 1465:0 1466:0 1467:0 1469:0 '),\n(1465,'BarrensNW16',1,17,382,12,25,0,955.029,-3084.95,93.7057,5.40099,'1459:0 1464:0 1466:0 '),\n(1466,'BarrensNW17',1,17,382,12,25,0,1020.82,-3080.5,105.204,1.82743,'1462:0 1464:0 1465:0 '),\n(1467,'BarrensNW18',1,17,17,8,25,0,898.48,-2740.8,99.757,5.46973,'1464:0 1468:0 1469:0 '),\n(1468,'BarrensNW19',1,17,17,8,25,0,803.624,-2654.79,91.6669,5.87813,'1467:0 1469:0 1496:0 1497:0 '),\n(1469,'BarrensNW20',1,17,17,8,25,0,605.003,-2881.18,91.6679,0.109375,'1464:0 1467:0 1468:0 1470:0 1471:0 1493:0 1496:0 '),\n(1470,'BarrensNW21',1,17,17,8,25,0,470.698,-3149.25,95.5705,1.16378,'1461:0 1469:0 1471:0 1472:0 '),\n(1471,'BarrensNW22',1,17,17,8,25,0,382.399,-3074.79,91.8682,5.88794,'1461:0 1469:0 1470:0 1472:0 1477:0 '),\n(1472,'BarrensNW23',1,17,17,8,25,0,146.635,-3204.39,80.1468,0.405853,'1470:0 1471:0 1473:0 1474:0 1477:0 1478:0 1479:0 '),\n(1473,'BarrensNW24',1,17,17,8,25,0,204.31,-3418.93,30.6025,4.75106,'1450:0 1472:0 1474:0 '),\n(1474,'BarrensNW25',1,17,17,8,25,0,18.7822,-3604.62,27.213,0.267903,'1442:0 1443:0 1450:0 1472:0 1473:0 1476:0 '),\n(1475,'BarrensNW26',1,17,391,8,25,0,-701.915,-3931.25,25.2456,2.31781,'35:0 1476:0 '),\n(1476,'BarrensNW27',1,17,17,8,25,0,-364.212,-3750.15,28.5958,0.262038,'1442:0 1475:0 1474:0 '),\n(1477,'BarrensNW28',1,17,17,8,25,0,111.71,-2964.41,95.9003,5.8816,'1471:0 1472:0 1478:0 1491:0 1492:0 '),\n(1478,'BarrensNW29',1,17,1699,8,25,0,-7.39568,-3036.98,91.6667,5.57137,'1472:0 1477:0 1479:0 1480:0 1489:0 1491:0 '),\n(1479,'BarrensNW30',1,17,1699,8,25,0,-80.6494,-3175.83,92.6429,0.527153,'1472:0 1478:0 1480:0 '),\n(1480,'BarrensNW31',1,17,1699,8,25,0,-43.7595,-3360.78,91.6672,1.44018,'1478:0 1479:0 1481:0 '),\n(1481,'BarrensNW32',1,17,1699,8,25,0,-298.484,-3473.6,91.6745,0.415233,'1480:0 1482:0 1483:0 '),\n(1482,'BarrensNW33',1,17,17,8,25,0,-636.173,-3699.63,92.7051,0.694045,'1481:0 1483:0 '),\n(1483,'BarrensNW34',1,17,17,8,25,0,-807.155,-3308.81,91.6657,5.92872,'1482:0 1481:0 1485:0 1486:0 1484:0 '),\n(1484,'BarrensNW35',1,17,17,8,25,0,-1029.31,-3412.99,75.3336,4.91947,'35:0 1483:0 1485:0 1563:0 '),\n(1485,'BarrensNW36',1,17,17,8,25,0,-949.557,-3245.5,94.7159,4.38735,'1483:0 1486:0 1536:0 1538:0 1484:0 1563:0 '),\n(1486,'BarrensNW37',1,17,17,8,25,0,-679.296,-2946.69,95.7877,4.08497,'1487:0 1488:0 1483:0 1485:0 1535:0 1536:0 1537:0 1539:0 '),\n(1487,'BarrensNW38',1,17,17,8,25,0,-494.28,-2779.02,91.6669,0.741136,'1486:0 32:0 1488:0 '),\n(1488,'BarrensNW39',1,17,1699,8,25,0,-242.594,-2859.38,91.9719,3.12681,'1486:0 1487:0 1489:0 1490:0 1491:0 '),\n(1489,'BarrensNW40',1,17,1699,8,25,0,-191.258,-3014.29,91.6673,2.33356,'1478:0 1488:0 1491:0 '),\n(1490,'BarrensNW41',1,17,458,8,25,0,-264.197,-2688.78,95.0971,4.53071,'32:0 1488:0 1491:0 1525:0 '),\n(1491,'BarrensNW42',1,17,17,8,25,0,72.2048,-2789.84,95.8713,3.29567,'1490:0 1488:0 1489:0 1477:0 1478:0 1492:0 1525:0 '),\n(1492,'BarrensNW43',1,17,458,8,25,0,205.138,-2695.31,91.667,3.68445,'1477:0 1491:0 1493:0 1494:0 1495:0 '),\n(1493,'BarrensNW44',1,17,458,8,25,0,400.957,-2643.1,91.667,3.49596,'1469:0 1492:0 1494:0 1496:0 '),\n(1494,'BarrensNW45',1,17,17,8,25,0,266.964,-2535.13,91.6658,3.36441,'1492:0 1493:0 1495:0 '),\n(1495,'BarrensNW46',1,17,17,8,25,0,78.9108,-2561.24,92.6826,5.54193,'1492:0 1494:0 1524:0 '),\n(1496,'BarrensNW47',1,17,458,8,25,0,575.696,-2568.22,95.8126,5.44179,'1468:0 1469:0 1493:0 1497:0 '),\n(1497,'BarrensNW48',1,17,458,8,25,0,687.068,-2366.64,91.6681,4.22717,'1468:0 1496:0 1498:0 1499:0 '),\n(1498,'BarrensNW49',1,17,458,8,25,0,804.041,-2282.18,91.6685,3.41822,'1497:0 1499:0 1500:0 1519:0 '),\n(1499,'BarrensNW50',1,17,17,12,25,0,703.606,-2031.77,91.6667,4.72591,'1497:0 1498:0 1500:0 1509:0 1510:0 '),\n(1500,'BarrensNW51',1,17,17,12,25,0,529.014,-2166.69,94.5542,0.545634,'1498:0 1499:0 1501:0 '),\n(1501,'DreadmistPeak1',1,17,384,12,25,0,459.817,-2082.78,138.447,5.5015,'1500:0 1502:0 1504:0 '),\n(1502,'DreadmistPeak2',1,17,384,12,25,0,375.749,-2068.56,138.668,6.1259,'1501:0 1503:0 '),\n(1503,'DreadmistPeak3',1,17,384,12,25,0,324.847,-1976.99,98.671,5.27963,'1502:0 1510:0 1520:0 '),\n(1504,'DreadmistPeak4',1,17,384,12,25,0,417.639,-2212.21,181.222,1.37424,'1501:0 1505:0 '),\n(1505,'DreadmistPeak5',1,17,384,12,25,0,307.073,-2144.55,210.989,5.7273,'1504:0 1506:0 1507:0 '),\n(1506,'DreadmistPeak6',1,17,2138,12,25,0,319.238,-2233.42,211.954,1.68053,'1505:0 '),\n(1507,'DreadmistPeak7',1,17,384,8,25,0,353.055,-2209.97,222.18,1.93971,'1505:0 1508:0 '),\n(1508,'DreadmistPeak8',1,17,384,17,25,0,322.312,-2277.26,243.384,1.42331,'1507:0 '),\n(1509,'BarrensNW52',1,17,17,12,25,0,583.146,-1755.46,92.9558,1.45863,'1499:0 1510:0 1511:0 '),\n(1510,'BarrensNW53',1,17,17,8,25,0,372.587,-1848.86,91.6675,6.01198,'1503:0 1499:0 1509:0 1520:0 1521:0 1522:0 '),\n(1511,'BarrensNW54',1,17,383,12,25,0,535.439,-1429.14,91.6668,4.989,'1509:0 1512:0 1514:0 1515:0 1516:0 '),\n(1512,'BarrensNW55',1,17,383,12,25,0,709.638,-1260.36,91.682,3.91105,'1511:0 1513:0 '),\n(1513,'BarrensNW56',1,17,383,12,25,0,817.064,-1365.59,91.871,2.68583,'1512:0 '),\n(1514,'BarrensNW57',1,17,383,12,25,0,532.937,-1155.43,91.6668,4.67093,'1511:0 '),\n(1515,'BarrensNW58',1,17,383,12,25,0,296.616,-1482.58,91.6668,0.139182,'1511:0 1517:0 1516:0 1520:0 '),\n(1516,'BarrensNW59',1,17,383,12,25,0,300.682,-1617.75,91.6668,0.681106,'1511:0 1515:0 1517:0 1520:0 '),\n(1517,'BarrensNW60',1,17,17,8,25,0,42.8186,-1528.23,91.6728,3.42876,'1515:0 1516:0 1520:0 1523:0 1531:0 1533:0 '),\n(1518,'BarrensExitN1h',1,17,1703,8,25,4,1261.05,-2223.39,92.0335,0.0904736,'1110:0 1519:0 '),\n(1519,'BarrensExitN2',1,17,1703,8,25,0,1157.98,-2338.54,92.3068,2.80599,'1111:0 1498:0 1518:0 '),\n(1520,'BarrensNW61',1,17,17,8,25,0,242.384,-1748.46,91.6668,5.32751,'1503:0 1510:0 1515:0 1516:0 1517:0 1521:0 '),\n(1521,'BarrensNW62',1,17,17,8,25,0,130.568,-1864.4,92.6122,0.169403,'1510:0 1520:0 1522:0 1523:0 '),\n(1522,'BarrensNW63',1,17,386,8,25,0,132.261,-1980.79,93.8709,0.723104,'1510:0 1521:0 1524:0 1528:0 '),\n(1523,'BarrensNW64',1,17,17,8,25,0,-136.632,-1764.4,93.1031,0.640629,'1517:0 1521:0 1524:0 1528:0 1529:0 1530:0 1531:0 '),\n(1524,'BarrensNW65',1,17,17,8,25,0,-73.4923,-2214.29,92.1839,1.03725,'1495:0 1522:0 1523:0 1527:0 1528:0 '),\n(1525,'BarrensNW66',1,17,17,8,25,0,-246.525,-2527.3,91.7286,5.22342,'1490:0 1491:0 1527:0 1526:0 1528:0 '),\n(1526,'BarrensNW67',1,17,380,8,25,4,-349.471,-2524,95.5815,4.46591,'32:0 1525:0 1527:0 '),\n(1527,'BarrensNW68',1,17,17,8,25,0,-344.921,-2376.03,92.3735,5.15509,'1524:0 1525:0 1526:0 1528:0 1534:0 '),\n(1528,'BarrensNW69',1,17,17,8,25,0,-281.4,-2113.94,95.7902,6.18005,'1522:0 1523:0 1524:0 1525:0 1527:0 1529:0 '),\n(1529,'BarrensNW70',1,17,17,8,25,0,-430.244,-1826.78,95.7877,0.218878,'1523:0 1528:0 1530:0 1557:0 '),\n(1530,'BarrensNW71',1,17,17,8,25,0,-515.745,-1537.11,91.6677,5.10603,'1523:0 1529:0 1531:0 1532:0 1557:0 '),\n(1531,'BarrensNW72',1,17,17,8,25,0,-343.855,-1488.98,92.6671,5.38288,'1517:0 1523:0 1530:0 1532:0 '),\n(1532,'BarrensExitW1h',1,17,1702,8,25,4,-390.512,-1368.33,91.7005,4.15177,'1530:0 1531:0 1533:0 '),\n(1533,'BarrensExitW2h',1,17,17,13,25,0,-245.782,-1071.05,33.877,5.35494,'1517:0 1532:0 1619:0 1621:0 '),\n(1534,'BarrensC1',1,17,17,8,25,0,-554.876,-2457.12,91.7172,0.415224,'1527:0 1535:0 '),\n(1535,'BarrensC2',1,17,458,8,25,0,-733.228,-2616.64,95.7878,6.07401,'32:0 1486:0 1534:0 1536:0 1537:0 1539:0 '),\n(1536,'BarrensC3',1,17,388,8,25,0,-1088.78,-2943.42,93.188,0.309157,'1485:0 1486:0 1535:0 1537:0 1538:0 1539:0 1563:0 '),\n(1537,'BarrensC4',1,17,388,8,25,0,-1234.76,-2828.43,94.4675,5.62828,'1486:0 1535:0 1536:0 1542:0 1543:0 '),\n(1538,'BarrensC5',1,17,17,8,25,0,-1482.86,-2989.48,91.6667,0.000901222,'1485:0 1536:0 1542:0 1543:0 1546:0 1545:0 1544:0 1563:0 '),\n(1539,'BarrensC6',1,17,458,8,25,0,-950.333,-2486.75,94.2879,5.17669,'98:0 1486:0 1535:0 1536:0 1540:0 1541:0 '),\n(1540,'BarrensC7',1,17,387,8,25,0,-1024.84,-2164.71,84.5132,0.52637,'98:0 1539:0 1541:0 '),\n(1541,'BarrensC8',1,17,17,8,25,0,-1117.92,-2388.71,94.9693,5.93383,'1539:0 1540:0 1542:0 1556:0 '),\n(1542,'BarrensC9',1,17,458,8,25,0,-1390.23,-2505.64,95.7878,4.84017,'1537:0 1538:0 1541:0 1543:0 1555:0 '),\n(1543,'BarrensC10',1,17,458,8,25,0,-1623.03,-2514.87,91.6709,0.0433447,'1537:0 1538:0 1542:0 1546:0 1555:0 1544:0 '),\n(1544,'BarrensC11',1,17,17,8,25,0,-1811.46,-3139.58,82.9337,0.885322,'1571:0 1545:0 1538:0 1543:0 1546:0 1568:0 1613:0 '),\n(1545,'BarrensC12',1,17,1698,14,25,0,-1907.03,-2804.32,92.2989,1.69465,'1538:0 1546:0 1547:0 1548:0 1544:0 '),\n(1546,'BarrensC13',1,17,1157,8,25,0,-1711.88,-2559.16,91.6722,0.463532,'1538:0 1543:0 1545:0 1548:0 1549:0 1544:0 '),\n(1547,'BarrensC14',1,17,1698,14,25,0,-2248.79,-2613.16,92.2697,5.81799,'1545:0 1548:0 1550:0 1551:0 '),\n(1548,'BarrensC15',1,17,1698,14,25,0,-2094.77,-2532.69,91.9084,5.93581,'1545:0 1546:0 1547:0 1549:0 1550:0 1551:0 1583:0 '),\n(1549,'BarrensC16',1,17,1157,8,25,0,-1876.87,-2436.12,95.4993,5.38799,'1546:0 1548:0 1551:0 1552:0 1555:0 '),\n(1550,'BarrensC17',1,17,1157,8,25,0,-2277.85,-2179.6,95.7945,5.15236,'174:0 1547:0 1548:0 1551:0 1552:0 1554:0 1583:0 1585:0 '),\n(1551,'BarrensC18',1,17,1157,8,25,0,-2101.34,-2220.57,95.7877,5.73158,'174:0 1547:0 1548:0 1549:0 1550:0 1552:0 '),\n(1552,'BarrensC19',1,17,1700,14,25,0,-1909.45,-2038.55,92.9508,3.72685,'1549:0 1550:0 1551:0 1553:0 1554:0 1555:0 1560:0 '),\n(1553,'BarrensC20',1,17,1700,14,25,0,-2121.99,-1733.9,91.6668,3.88196,'174:0 1552:0 1554:0 1560:0 1584:0 '),\n(1554,'BarrensC21',1,17,1700,14,25,0,-2085.34,-1938.99,95.871,2.79616,'174:0 1550:0 1552:0 1553:0 1560:0 '),\n(1555,'BarrensC22',1,17,17,14,25,0,-1638.12,-2190.4,92.6765,5.08558,'1542:0 1543:0 1549:0 1552:0 1556:0 1558:0 1561:0 '),\n(1556,'BarrensC23',1,17,17,8,25,0,-1266.05,-2043.5,92.6438,3.55996,'1541:0 1555:0 1557:0 1558:0 '),\n(1557,'BarrensC24',1,17,17,8,25,0,-926.196,-1839.83,92.0056,5.03258,'98:0 1529:0 1530:0 1556:0 1558:0 '),\n(1558,'BarrensC25',1,17,1700,14,25,0,-1425.03,-1796.65,92.0678,5.31103,'1555:0 1556:0 1557:0 1559:0 1561:0 '),\n(1559,'BarrensC26',1,17,1700,14,25,0,-1440.3,-1560.56,95.9826,0.920663,'1558:0 1561:0 '),\n(1560,'BarrensC27',1,17,1700,14,25,0,-1871.3,-1875.92,93.6595,4.45692,'1552:0 1553:0 1554:0 1561:0 '),\n(1561,'BarrensC28',1,17,1700,14,25,0,-1612.86,-1781.52,91.7801,1.78067,'1555:0 1558:0 1559:0 1560:0 '),\n(1562,'BarrensC29',1,17,391,8,25,0,-1376.36,-3840.81,18.7024,0.388567,'35:0 1565:0 1569:0 '),\n(1563,'BarrensC30',1,17,17,8,25,0,-1136.17,-3317.73,91.835,0.363033,'1484:0 1485:0 1536:0 1538:0 1564:0 '),\n(1564,'BarrensC31',1,17,17,8,25,0,-1232.04,-3640.85,93.8864,1.23286,'1563:0 1565:0 '),\n(1565,'BarrensC32',1,17,17,12,25,0,-1358.56,-3651.68,91.8621,5.3562,'1562:0 1564:0 1566:0 '),\n(1566,'BarrensC33',1,17,17,12,25,0,-1611.42,-3708.07,89.8631,0.284498,'1565:0 1567:0 1568:0 '),\n(1567,'BarrensC34',1,17,17,12,25,0,-1630.78,-3593.7,93.0714,4.90264,'1566:0 1568:0 '),\n(1568,'BarrensC35',1,17,17,12,25,0,-1755.9,-3578.38,93.1759,5.92169,'1544:0 1566:0 1567:0 '),\n(1569,'BarrensC36',1,17,391,8,25,0,-1644.33,-3851.75,13.843,0.197311,'1562:0 1570:0 '),\n(1570,'BarrensC37',1,17,385,8,25,0,-1877.52,-3684.16,8.56349,5.68766,'1569:0 1571:0 1572:0 1575:0 '),\n(1571,'BarrensC38',1,17,385,8,25,0,-1962.03,-3412.38,56.1606,4.99848,'1544:0 1570:0 '),\n(1572,'BarrensC39',1,17,385,8,25,0,-2093.49,-3786.65,1.11667,0.38229,'1570:0 1573:0 '),\n(1573,'BarrensC40',1,17,385,33,45,0,-2168.16,-3893.99,0.105911,2.3988,'1572:0 1574:0 1900:0 '),\n(1574,'BarrensC41',1,17,385,33,45,0,-2296.44,-3875.08,0.411085,0.0838384,'1573:0 1896:0 1900:0 '),\n(1575,'NorthwatchHold1',1,17,385,12,25,4,-2006.43,-3674.7,21.8223,5.27337,'1570:0 1576:0 '),\n(1576,'NorthwatchHold2',1,17,385,12,25,4,-2014.16,-3558.11,22.9401,4.40551,'1575:0 1577:0 '),\n(1577,'NorthwatchHold3',1,17,385,12,25,4,-2105.62,-3592.85,59.4242,0.125087,'1576:0 1578:0 1579:0 '),\n(1578,'NorthwatchHold4',1,17,385,8,25,4,-2106.59,-3663.32,96.1895,0.928159,'1577:0 '),\n(1579,'NorthwatchHold5',1,17,385,12,25,4,-2186.42,-3696.81,90.2787,1.00002,'1577:0 1580:0 1581:0 '),\n(1580,'NorthwatchHold6',1,17,385,12,25,4,-2222.08,-3775.47,130.862,0.551559,'1579:0 '),\n(1581,'NorthwatchHold7',1,17,385,12,25,4,-2146.93,-3560.64,91.6658,4.29007,'1579:0 1582:0 '),\n(1582,'NorthwatchHold8',1,17,385,12,25,4,-2088.88,-3507.98,130.084,4.00692,'1581:0 '),\n(1583,'BarrensS1',1,17,1156,18,25,0,-2489.54,-2427.29,91.7094,6.28066,'1548:0 1550:0 1585:0 1586:0 '),\n(1584,'BarrensS2',1,17,1156,18,25,0,-2509.21,-1790.84,91.6888,0.117235,'174:0 1553:0 1585:0 1586:0 1587:0 '),\n(1585,'BarrensS3',1,17,1157,18,25,0,-2496.45,-2147.95,95.7846,6.25905,'174:0 1550:0 1583:0 1584:0 1586:0 '),\n(1586,'BarrensS4',1,17,1157,18,25,0,-2759.08,-2184.15,95.793,0.0131506,'1583:0 1584:0 1585:0 1587:0 '),\n(1587,'BarrensS5',1,17,1157,18,25,0,-2945.71,-2047.99,95.7879,0.507956,'1584:0 1586:0 1588:0 1589:0 1591:0 '),\n(1588,'BarrensS6',1,17,1157,18,25,0,-3285.06,-2049.93,92.2466,6.10862,'1587:0 1589:0 1590:0 1591:0 1593:0 1594:0 1596:0 '),\n(1589,'BarrensS7',1,17,390,18,25,0,-3079.79,-1941.98,94.9653,3.28119,'1587:0 1588:0 1590:0 '),\n(1590,'BarrensS8',1,17,390,18,25,0,-3131.93,-1680.95,92.0185,4.74203,'1588:0 1589:0 '),\n(1591,'BarrensS9',1,17,390,18,25,0,-3131.04,-2171.34,93.5897,1.45786,'1587:0 1588:0 1592:0 1596:0 '),\n(1592,'BarrensS10',1,17,390,18,25,0,-3110.95,-2348.03,94.3578,1.81325,'1591:0 '),\n(1593,'BarrensS11',1,17,1156,18,25,0,-3458.57,-1830.89,91.667,5.2042,'1588:0 1595:0 '),\n(1594,'BarrensS12',1,17,1157,18,25,0,-3481.33,-2051.77,96.4547,0.0284251,'1588:0 1595:0 1596:0 '),\n(1595,'BarrensS13',1,17,1157,18,25,0,-3653.21,-2015.41,91.6668,0.540897,'1593:0 1594:0 1596:0 1597:0 1599:0 1600:0 '),\n(1596,'BarrensS14',1,17,1156,18,25,0,-3651.34,-2318.77,91.6674,0.625316,'1595:0 1588:0 1591:0 1594:0 1597:0 1607:0 1872:0 '),\n(1597,'BarrensS15',1,17,1157,18,25,0,-3840.72,-2048.27,91.6821,6.27935,'1595:0 1596:0 1598:0 1599:0 1600:0 1607:0 '),\n(1598,'BarrensS16',1,17,1157,18,25,0,-4067.36,-2048.82,91.6672,6.16353,'1597:0 1601:0 1602:0 1607:0 1610:0 '),\n(1599,'BarrensS17',1,17,1701,18,25,0,-3730.53,-1594.06,93.2113,4.82441,'1595:0 1597:0 1600:0 1601:0 '),\n(1600,'BarrensS18',1,17,1701,18,25,0,-3894.71,-1618.14,91.6668,0.128916,'1595:0 1597:0 1599:0 1601:0 '),\n(1601,'BarrensS19',1,17,1701,18,25,0,-4039.89,-1841.83,94.2054,0.676733,'1598:0 1599:0 1600:0 1602:0 '),\n(1602,'BarrensS20',1,17,1157,18,25,0,-4188.61,-1914.07,91.6668,5.68758,'1598:0 1601:0 1603:0 '),\n(1603,'BarrensS21',1,17,1157,18,25,0,-4356.79,-1884.72,89.6352,5.97818,'1602:0 1604:0 1606:0 '),\n(1604,'BarrensS22',1,17,1157,18,25,0,-4478.66,-1866.94,86.1087,1.26186,'1603:0 1605:0 '),\n(1605,'BarrensRFK1',1,17,1717,18,25,0,-4476,-1686.51,81.5791,4.60765,'1604:0 '),\n(1606,'BarrensRFD1',1,17,1316,30,40,0,-4487.33,-2054.23,75.9531,5.76807,'1603:0 '),\n(1607,'BaelModan1',1,17,359,18,25,4,-3989.77,-2218.81,95.0004,6.06065,'1596:0 1597:0 1598:0 1608:0 '),\n(1608,'BaelModan2',1,17,359,18,25,4,-4109.4,-2315.19,125.071,0.600164,'1607:0 1609:0 '),\n(1609,'BaelModan3',1,17,2157,8,25,4,-4073.79,-2368.19,108.909,2.02644,'1608:0 '),\n(1610,'BaelModan4',1,17,359,18,25,4,-4176.57,-2101.49,72.6592,0.294635,'1598:0 1611:0 '),\n(1611,'BaelModan5',1,17,359,18,25,4,-4071.12,-2157.56,50.3844,2.75686,'1610:0 1612:0 '),\n(1612,'BaelModan6',1,17,359,18,25,4,-4223.35,-2272.53,60.9001,0.575407,'1611:0 '),\n(1613,'RaptorGrounds',1,17,1697,12,25,0,-2042.89,-3229.73,91.8767,0.499641,'1544:0 '),\n(1614,'BarrensWC1',1,718,718,8,20,0,-692.325,-2048.77,65.8045,0.216115,'98:0 1615:0 '),\n(1615,'BarrensWC2',1,718,718,12,25,0,-580.407,-2042.49,57.4486,4.80284,'1614:0 1616:0 '),\n(1616,'BarrensWC3',1,718,718,12,25,0,-677.272,-2203.72,25.3109,0.830688,'1615:0 1617:0 '),\n(1617,'BarrensWC4',1,718,718,12,25,0,-638.458,-2387.33,25.6848,1.69853,'1616:0 '),\n(1618,'RatchetSpawn',1,17,392,8,20,1,-1057.17,-3641.62,23.878,5.32863,'35:0 '),\n(1619,'BarrensExitW2_1a',1,17,17,13,25,2,-365.7,-970.989,26.4604,0.0515498,'1533:0 1620:0 '),\n(1620,'BarrensExitW2_2',1,17,17,13,25,2,-257.953,-835.045,8.42398,4.38694,'1619:0 1621:0 1622:0 '),\n(1621,'STMExitE',1,406,469,13,25,4,-231.912,-777.297,7.15901,4.25107,'1533:0 1620:0 1622:0 '),\n(1622,'StonetalonSE1',1,406,469,13,25,0,-183.878,-696.708,0.285728,4.19806,'1620:0 1621:0 1623:0 '),\n(1623,'StonetalonSE2',1,406,2538,13,25,0,7.63915,-645.484,-33.8698,3.50887,'1622:0 1624:0 1625:0 1626:0 1630:0 '),\n(1624,'StonetalonSE3',1,406,469,13,25,0,-21.452,-771.961,1.19909,1.25477,'1623:0 1625:0 '),\n(1625,'StonetalonSE4',1,406,469,13,25,0,173.964,-863.908,2.87119,2.42107,'1623:0 1624:0 '),\n(1626,'StonetalonSE5',1,406,2537,13,25,0,127.03,-646.104,-0.157034,3.15149,'1623:0 1627:0 '),\n(1627,'StonetalonSE6',1,406,2537,13,25,0,102.577,-522.122,3.25329,4.9677,'1626:0 1628:0 1629:0 '),\n(1628,'StonetalonSE7',1,406,2537,13,25,0,219.214,-475.456,21.9453,3.60701,'1627:0 1629:0 '),\n(1629,'StonetalonSE8',1,406,469,13,25,0,104.777,-261.978,5.20105,5.15819,'1627:0 1628:0 1632:0 1633:0 '),\n(1630,'StonetalonSE9',1,406,2538,13,25,0,-62.1728,-442.081,-37.1112,5.01095,'1623:0 1631:0 '),\n(1631,'StonetalonSE10',1,406,469,13,25,0,-29.9825,-291.416,-5.66732,4.59076,'1630:0 1632:0 '),\n(1632,'StonetalonSE11',1,406,2539,13,25,0,-2.18294,-227.074,15.1619,4.29231,'1629:0 1631:0 1633:0 1640:0 '),\n(1633,'StonetalonSE12',1,406,1076,13,25,0,59.7029,-127.555,15.3056,4.18039,'1629:0 1632:0 1634:0 '),\n(1634,'StonetalonSE13',1,406,1076,13,25,0,109.545,-71.7213,22.4065,2.6092,'1633:0 1635:0 1641:0 '),\n(1635,'StonetalonSE14',1,406,2540,13,25,0,23.5805,-29.4616,31.6752,5.8097,'1634:0 1636:0 '),\n(1636,'StonetalonSE15',1,406,2540,13,25,0,-14.5426,41.0345,49.7486,5.30902,'1635:0 1637:0 '),\n(1637,'StonetalonSE16',1,406,2540,13,25,0,-152.111,135.096,48.9698,5.51519,'1636:0 1638:0 '),\n(1638,'StonetalonSE17',1,406,3157,13,25,0,-114.052,239.055,102.383,4.22518,'1637:0 1639:0 '),\n(1639,'StonetalonSE18',1,406,3157,13,25,0,2.62312,403.85,101.011,3.79714,'1638:0 '),\n(1640,'StonetalonSE19',1,406,2539,13,25,5,-235.218,-347.587,20.2574,0.490614,'1632:0 '),\n(1641,'StonetalonSE20',1,406,1076,13,25,0,197.073,203.918,52.5873,4.43331,'1634:0 1642:0 '),\n(1642,'StonetalonSE21',1,406,1076,13,25,0,274.453,322.855,41.911,4.60022,'1641:0 1643:0 '),\n(1643,'StonetalonSE22',1,406,1076,13,25,0,447.877,347.349,47.8893,3.28665,'1642:0 1644:0 1646:0 '),\n(1644,'StonetalonSE23',1,406,2541,13,25,0,426.687,491.945,98.4352,4.79266,'1643:0 1645:0 '),\n(1645,'StonetalonSE24',1,406,2541,13,25,0,465.249,636.071,69.1319,4.43923,'1644:0 151:0 '),\n(1646,'StonetalonSE25',1,406,1076,13,25,0,547.002,317.026,51.4155,2.61083,'1643:0 1647:0 1660:0 '),\n(1647,'StonetalonSE26',1,406,461,13,25,0,944.851,205.469,22.8061,2.8916,'1646:0 1648:0 1649:0 1650:0 '),\n(1648,'StonetalonE1',1,406,636,13,25,0,1111.38,-250.367,-1.11603,1.94521,'1647:0 153:0 1649:0 1651:0 1655:0 '),\n(1649,'StonetalonE2',1,406,636,13,25,0,1154.28,55.6527,1.56437,2.89789,'1647:0 1648:0 152:0 1650:0 1651:0 1655:0 '),\n(1650,'StonetalonE3',1,406,461,13,25,0,1307.08,338.017,30.2635,3.38681,'152:0 1647:0 1649:0 1651:0 '),\n(1651,'StonetalonE4',1,406,461,13,25,0,1299.88,-37.5445,6.46784,2.5696,'152:0 1648:0 1649:0 1650:0 1655:0 '),\n(1652,'StonetalonE5',1,406,463,13,25,0,1596.92,-164.112,37.8,1.7689,'152:0 1653:0 1656:0 '),\n(1653,'StonetalonE6',1,406,461,13,25,0,1503.38,-325.077,23.7601,0.679167,'154:0 1652:0 1655:0 '),\n(1654,'StonetalonE7',1,406,461,13,25,0,1239.88,-573.82,14.7456,2.30493,'153:0 1655:0 '),\n(1655,'StonetalonE8',1,406,461,13,25,0,1274.45,-389.01,15.6582,4.91048,'153:0 154:0 1648:0 1649:0 1651:0 1653:0 1654:0 '),\n(1656,'StonetalonE9',1,406,463,13,25,0,1689.34,-66.4877,90.3719,1.43312,'1652:0 1657:0 '),\n(1657,'StonetalonE10',1,406,463,13,25,0,1683.31,88.067,136.952,4.78089,'1656:0 1658:0 '),\n(1658,'StonetalonE11',1,406,463,13,25,0,1607.48,98.5127,98.5487,1.23875,'1657:0 1659:0 '),\n(1659,'StonetalonE12',1,406,463,13,25,0,1607.14,183.852,104.64,5.9099,'1658:0 '),\n(1660,'StonetalonC1',1,406,1076,13,25,0,741.152,432.351,64.3987,3.6401,'1646:0 1661:0 1662:0 '),\n(1661,'StonetalonC2',1,406,1076,13,25,3,734.898,323.955,63.5237,1.26623,'1660:0 1662:0 '),\n(1662,'StonetalonC3',1,406,1076,13,25,0,911.255,644.216,97.0932,4.02886,'1660:0 1661:0 45:0 1670:0 '),\n(1663,'StonetalonC4',1,406,460,13,25,5,967.945,1059.83,107.154,4.48637,'45:0 1664:0 '),\n(1664,'StonetalonC5',1,406,460,20,25,4,857.673,1068.45,134.552,6.12668,'1663:0 1665:0 '),\n(1665,'StonetalonC6',1,406,406,20,25,4,770.751,1128.86,184.567,5.69273,'1664:0 1666:0 '),\n(1666,'StonetalonC7',1,406,406,20,25,4,763.22,1201.45,167.109,4.77383,'1665:0 1667:0 '),\n(1667,'StonetalonC8',1,406,406,20,25,4,612.567,1230.12,105.052,5.96764,'1666:0 1668:0 '),\n(1668,'StonetalonC9',1,406,465,20,25,4,639.837,1320.23,57.7872,0.670119,'1667:0 1669:0 '),\n(1669,'StonetalonC10',1,406,465,20,25,0,717.122,1407.26,-11.3895,4.23973,'1668:0 1698:0 1699:0 1703:0 '),\n(1670,'StonetalonC11',1,406,1076,16,25,0,1254.55,723.188,177.709,3.60317,'1662:0 1671:0 1677:0 '),\n(1671,'StonetalonC12',1,406,406,18,25,2,1149.35,812.103,216.145,0.074743,'1670:0 1672:0 '),\n(1672,'StonetalonC13',1,406,406,18,25,2,1174.45,1039.29,211.338,4.51028,'1671:0 1673:0 '),\n(1673,'StonetalonC14',1,406,406,18,25,2,1150.98,1125.82,230.66,4.8323,'1672:0 1674:0 '),\n(1674,'StonetalonC15',1,406,406,18,25,2,1185.65,1218.77,221.734,4.2727,'1673:0 1675:0 '),\n(1675,'StonetalonC16',1,406,406,18,25,2,1120.4,1212.75,204.833,0.0197749,'1674:0 1676:0 '),\n(1676,'StonetalonC17',1,406,406,18,25,2,1150.62,1371.11,126.775,4.37873,'1675:0 1697:0 '),\n(1677,'StonetalonC18',1,406,464,16,25,0,1370.73,733.802,156.258,3.23598,'1670:0 1678:0 1681:0 '),\n(1678,'StonetalonC19',1,406,464,16,25,0,1446.65,663,145.249,2.57819,'1677:0 1679:0 1680:0 '),\n(1679,'StonetalonC20',1,406,464,16,25,0,1553.51,543.727,164.574,2.16586,'1678:0 1680:0 '),\n(1680,'StonetalonC21',1,406,464,16,25,0,1584.31,756.555,132.915,4.49848,'1678:0 1679:0 1681:0 1686:0 '),\n(1681,'StonetalonC22',1,406,464,16,25,0,1440.45,891.877,138.324,4.65164,'1677:0 1680:0 1682:0 1683:0 '),\n(1682,'StonetalonC23',1,406,464,16,25,0,1361.44,1063.47,166.157,5.2289,'1681:0 1683:0 '),\n(1683,'StonetalonC24',1,406,464,16,25,0,1500.8,1046.96,144.855,4.37673,'1681:0 1682:0 1684:0 1685:0 '),\n(1684,'StonetalonC25',1,406,464,16,25,0,1668.56,1003.04,136.669,2.88249,'1683:0 1685:0 1686:0 1687:0 '),\n(1685,'StonetalonC26',1,406,406,16,25,0,1533.39,1167.23,150.198,5.27402,'1683:0 1684:0 1695:0 '),\n(1686,'StonetalonC27',1,406,464,16,25,0,1837.17,772.144,145.217,3.08276,'1680:0 1684:0 1687:0 '),\n(1687,'StonetalonC28',1,406,464,16,25,0,1832.42,946.127,147.601,2.87658,'1684:0 1686:0 1688:0 '),\n(1688,'StonetalonN1',1,406,406,16,25,0,2089.45,985.763,224.629,0.496822,'1687:0 1689:0 1690:0 '),\n(1689,'StonetalonN2',1,406,467,16,25,0,2389.72,1113.13,305.081,3.60307,'1688:0 '),\n(1690,'StonetalonN3',1,406,467,16,25,0,2406.02,1262.32,293.173,4.48076,'39:0 1688:0 1691:0 1694:0 '),\n(1691,'StonetalonN4',1,406,467,16,25,0,2308.04,1474.22,278.518,5.29758,'1692:0 1694:0 1690:0 '),\n(1692,'StonetalonN5',1,406,468,16,25,0,2455.85,1706.87,321.807,3.7366,'1691:0 155:0 39:0 1694:0 '),\n(1693,'StonetalonN6',1,406,468,16,25,4,2502.8,1923.14,341.618,4.8177,'155:0 '),\n(1694,'StonetalonN7',1,406,467,18,25,0,2490.31,1474.07,262.723,0.177969,'39:0 1691:0 1692:0 1690:0 '),\n(1695,'StonetalonW1',1,406,406,18,25,0,1531.08,1382.61,154.485,3.40792,'1685:0 1696:0 '),\n(1696,'StonetalonW2',1,406,406,18,25,0,1396,1443.1,122.505,3.64354,'1695:0 1697:0 '),\n(1697,'StonetalonW3',1,406,406,18,25,0,1250.91,1480.82,78.0749,3.62587,'1676:0 1696:0 1698:0 '),\n(1698,'StonetalonW4',1,406,465,20,25,0,926.026,1574.39,-15.7829,5.87604,'1669:0 1697:0 1702:0 1703:0 '),\n(1699,'StonetalonW5',1,406,465,20,25,0,546.937,1540.31,-5.73179,5.59329,'1669:0 1700:0 1703:0 '),\n(1700,'StonetalonW6',1,406,465,20,25,0,498.082,1756.93,4.7637,5.0278,'1699:0 1701:0 1703:0 1704:0 '),\n(1701,'StonetalonW7',1,406,465,20,25,0,684.965,1869.36,-7.54489,3.9518,'1700:0 1702:0 1703:0 '),\n(1702,'StonetalonW8',1,406,465,20,25,0,905.075,1799.18,-4.36236,2.8974,'1698:0 1701:0 1703:0 '),\n(1703,'StonetalonW9',1,406,465,20,25,0,709.779,1654.47,-27.9084,0.454811,'1669:0 1698:0 1699:0 1700:0 1701:0 1702:0 '),\n(1704,'STMExitSW',1,406,465,20,25,0,386.19,1791.83,40.6481,5.89762,'1700:0 1705:0 '),\n(1705,'DesolaceExitN',1,405,405,28,40,0,254.286,1837.65,86.6541,5.89961,'1704:0 1706:0 '),\n(1706,'DesolaceN1',1,405,405,28,40,0,136.31,1790.75,86.2292,4.91001,'1705:0 1707:0 1708:0 1709:0 '),\n(1707,'DesolaceN2',1,405,405,28,40,0,174.958,1580.05,166.08,3.19588,'1706:0 1708:0 '),\n(1708,'DesolaceN3',1,405,405,28,40,0,-43.4822,1503,100.016,0.657084,'1706:0 1707:0 1709:0 1711:0 1712:0 1713:0 '),\n(1709,'DesolaceN4',1,405,599,28,40,0,-240.456,1624.18,94.7617,2.12576,'1706:0 1708:0 1710:0 1711:0 1712:0 '),\n(1710,'DesolaceN5',1,405,599,28,40,0,-478.435,1651.62,103.311,6.16664,'1709:0 1711:0 1724:0 1727:0 '),\n(1711,'DesolaceN6',1,405,405,28,40,0,-519.027,1436.95,89.0591,0.360579,'1708:0 1709:0 1710:0 1712:0 1723:0 1743:0 1744:0 1745:0 '),\n(1712,'DesolaceN7',1,405,405,28,40,0,-262.519,1170.51,90.2776,1.81553,'1708:0 1709:0 1711:0 1713:0 1717:0 1720:0 1723:0 '),\n(1713,'DesolaceN8',1,405,405,28,40,0,-68.2755,1158.91,90.8663,1.88621,'1708:0 1712:0 1714:0 1717:0 1720:0 '),\n(1714,'DesolaceN9',1,405,608,28,40,2,24.7744,1218.69,134.023,3.19194,'1713:0 1715:0 '),\n(1715,'DesolaceN10',1,405,608,28,40,2,166.996,1219.58,166.116,3.12321,'1714:0 1716:0 '),\n(1716,'DesolaceN11',1,405,608,28,40,2,222.502,1276.25,189.878,5.01405,'1715:0 60:0 '),\n(1717,'DesolaceN12',1,405,603,28,40,0,-37.1114,929.567,91.722,2.17957,'1712:0 1713:0 1718:0 1720:0 1721:0 '),\n(1718,'DesolaceN13',1,405,603,28,40,0,7.08753,779.096,91.8455,4.34648,'1717:0 1719:0 '),\n(1719,'DesolaceN14',1,405,603,28,40,0,-67.217,604.321,91.3718,1.59562,'1718:0 1720:0 1721:0 '),\n(1720,'DesolaceN15',1,405,603,28,40,0,-319.285,898.298,89.3548,5.81712,'1712:0 1713:0 1717:0 1719:0 1721:0 1722:0 1723:0 '),\n(1721,'DesolaceN16',1,405,603,28,40,0,-88.9887,771.679,132.892,1.27553,'1717:0 1719:0 1720:0 '),\n(1722,'DesolaceN17',1,405,405,28,40,0,-524.771,816.278,91.0366,0.333055,'1720:0 1723:0 1744:0 '),\n(1723,'DesolaceN18',1,405,405,28,40,0,-518.678,1099.09,93.063,6.1992,'1711:0 1712:0 1720:0 1722:0 1744:0 1745:0 '),\n(1724,'DesolaceN19',1,405,599,28,40,0,-433.656,1712.56,127.171,4.07939,'1710:0 1725:0 1726:0 '),\n(1725,'DesolaceN20',1,405,599,28,40,0,-346.92,1761.61,138.371,0.287887,'1724:0 '),\n(1726,'DesolaceN21',1,405,599,28,40,0,-409.361,1865.43,127.463,4.65667,'1724:0 '),\n(1727,'DesolaceN22',1,405,599,28,40,0,-557.524,1836.01,96.4213,5.15932,'1710:0 1728:0 1743:0 '),\n(1728,'DesolaceN23',1,405,405,28,40,0,-596.61,2002.61,88.4432,6.14696,'1727:0 1729:0 1730:0 1731:0 1742:0 1743:0 '),\n(1729,'DesolaceN24',1,405,405,28,40,0,-409.395,2019.53,98.1479,3.16245,'1728:0 1730:0 1731:0 '),\n(1730,'DesolaceN25',1,405,598,28,40,0,-362.318,2211.47,90.4702,1.2127,'1728:0 1729:0 1731:0 1732:0 1733:0 '),\n(1731,'DesolaceN26',1,405,2405,28,40,0,-574.499,2247.88,89.8498,5.11024,'1728:0 1729:0 1730:0 1732:0 1738:0 1741:0 1742:0 1772:0 '),\n(1732,'DesolaceN27',1,405,2405,28,40,0,-436.581,2351.38,60.8605,4.01462,'1730:0 1731:0 1734:0 1735:0 '),\n(1733,'DesolaceN28',1,405,598,28,40,0,-45.3846,2199.95,94.7517,3.10159,'1730:0 '),\n(1734,'DesolaceN29',1,405,598,28,40,0,-223.597,2401.87,19.3117,3.25671,'1732:0 1735:0 '),\n(1735,'DesolaceN30',1,405,598,28,40,0,-240.439,2492.2,1.43883,3.79864,'1732:0 1734:0 1736:0 1737:0 '),\n(1736,'DesolaceN31',1,405,2405,28,40,0,-370.369,2605.96,1.54797,5.56185,'1735:0 1739:0 '),\n(1737,'DesolaceN32',1,405,2406,31,40,0,263.113,2974.68,2.07535,3.87325,'1735:0 '),\n(1738,'DesolaceN33',1,405,2405,28,40,0,-601.969,2431.57,74.1931,4.86205,'1731:0 1739:0 1741:0 '),\n(1739,'DesolaceN34',1,405,2405,28,40,0,-502.176,2576.74,18.2199,4.19054,'1736:0 1738:0 1740:0 '),\n(1740,'DesolaceN35',1,405,598,28,40,0,-719.849,2595.3,58.3371,6.23453,'1739:0 1741:0 '),\n(1741,'DesolaceN36',1,405,405,31,40,0,-750.951,2392.96,91.9055,1.38273,'1731:0 1738:0 1740:0 1742:0 1770:0 1772:0 '),\n(1742,'DesolaceN37',1,405,405,28,40,0,-759.272,2036.09,91.7138,1.7715,'1728:0 1731:0 1741:0 1770:0 1771:0 '),\n(1743,'DesolaceN38',1,405,405,28,40,0,-785.037,1666.3,90.7953,3.33248,'1711:0 1727:0 1728:0 1745:0 1769:0 1770:0 '),\n(1744,'DesolaceN39',1,405,609,28,40,0,-796.298,1079.33,90.2949,6.11672,'1711:0 1722:0 1723:0 1745:0 1746:0 1747:0 '),\n(1745,'DesolaceN40',1,405,405,28,40,0,-754.549,1363.26,88.5616,5.47467,'1711:0 1723:0 1743:0 1744:0 1769:0 '),\n(1746,'DesolaceN41',1,405,609,28,40,0,-897.587,897.096,95.0181,0.982181,'1744:0 1747:0 1748:0 '),\n(1747,'DesolaceC1',1,405,405,28,40,0,-1125.97,1230.91,93.7933,5.43931,'1744:0 1746:0 1748:0 1749:0 1769:0 '),\n(1748,'DesolaceC2',1,405,405,28,40,0,-1391.67,958.264,89.5921,0.552166,'1746:0 1747:0 1750:0 1751:0 '),\n(1749,'DesolaceC3',1,405,405,28,40,0,-1427.18,1225.61,103.863,0.133931,'1747:0 129:0 1750:0 '),\n(1750,'DesolaceC4',1,405,604,28,40,0,-1577.16,1114.97,90.6547,0.632647,'129:0 1748:0 1749:0 1751:0 1760:0 1762:0 '),\n(1751,'DesolaceC5',1,405,604,28,40,0,-1631.55,978.868,90.3134,0.0954253,'1748:0 1750:0 1752:0 1759:0 1760:0 '),\n(1752,'DesolaceC6',1,405,604,34,40,0,-1672.96,839.546,93.6943,1.409,'1751:0 1753:0 '),\n(1753,'DesolaceC7',1,405,604,34,40,0,-1824.57,798.663,103.148,0.209302,'1752:0 1754:0 '),\n(1754,'DesolaceC8',1,405,2198,34,40,0,-1847.21,666.041,107.727,1.26565,'1753:0 1755:0 1756:0 '),\n(1755,'DesolaceC9',1,405,2198,34,40,0,-1837.82,584.775,136.457,1.64775,'1754:0 '),\n(1756,'DesolaceC10',1,405,2198,34,40,0,-2020.93,674.999,118.726,6.26783,'1754:0 1757:0 '),\n(1757,'DesolaceC11',1,405,2198,34,40,0,-2022.56,589.179,143.38,5.31357,'1756:0 1758:0 '),\n(1758,'DesolaceC12',1,405,2198,34,40,0,-1933.59,514.493,164.939,2.49988,'1757:0 '),\n(1759,'DesolaceC13',1,405,604,28,40,0,-1799.06,928.096,91.3039,0.218297,'1751:0 1760:0 1762:0 '),\n(1760,'DesolaceC14',1,405,604,28,40,0,-1889.74,1110.04,92.5553,5.97134,'1750:0 1751:0 1759:0 1761:0 1762:0 '),\n(1761,'DesolaceC15',1,405,405,31,40,0,-1897.9,1372.61,61.1381,4.74417,'1760:0 1762:0 1764:0 1777:0 1811:0 1813:0 '),\n(1762,'DesolaceC16',1,405,604,28,40,0,-1749.34,1214.45,91.3952,0.204553,'1750:0 1759:0 1760:0 1761:0 1763:0 '),\n(1763,'DesolaceC17',1,405,405,28,40,0,-1569.77,1277.99,87.9315,3.56017,'1762:0 1764:0 '),\n(1764,'DesolaceC18',1,405,405,31,40,0,-1699.9,1433.42,61.6894,0.112268,'129:0 1761:0 1763:0 '),\n(1765,'DesolaceC19',1,405,597,28,40,4,-1335.75,1704.43,89.9029,5.8932,'128:0 '),\n(1766,'DesolaceC20',1,405,597,28,40,4,-1199.03,1771.37,99.5835,4.08873,'128:0 1767:0 '),\n(1767,'DesolaceC21',1,405,597,28,40,4,-1157.92,1848.6,99.595,4.17119,'1766:0 1768:0 '),\n(1768,'DesolaceC22',1,405,597,28,40,4,-1151.69,1938.33,88.8694,1.73253,'1767:0 '),\n(1769,'DesolaceC23',1,405,405,31,40,0,-1193.57,1475.36,61.1112,4.30472,'128:0 129:0 1743:0 1745:0 1747:0 1770:0 1777:0 '),\n(1770,'DesolaceC24',1,405,405,31,40,0,-1051.16,1759.04,62.2132,3.91398,'129:0 1741:0 1742:0 1743:0 1769:0 1771:0 1776:0 '),\n(1771,'DesolaceC25',1,405,405,31,40,0,-1096.46,2045.41,58.5175,4.84859,'1742:0 1770:0 1772:0 1775:0 '),\n(1772,'DesolaceC26',1,405,405,31,40,0,-1095.17,2383.16,92.5366,5.96779,'1731:0 1741:0 1771:0 1773:0 '),\n(1773,'DesolaceC27',1,405,405,31,40,0,-1419.73,2331.31,91.8161,0.0556962,'1772:0 1774:0 1778:0 1779:0 1798:0 '),\n(1774,'DesolaceC28',1,405,596,31,40,0,-1340.98,2101.55,63.5443,1.99366,'1773:0 1775:0 1776:0 1778:0 '),\n(1775,'DesolaceC29',1,405,596,31,40,0,-1225.31,2021.97,59.0277,2.34708,'1771:0 1774:0 1776:0 '),\n(1776,'DesolaceC30',1,405,596,31,40,0,-1362.19,1917.79,50.1441,0.929436,'128:0 1770:0 1774:0 1775:0 1777:0 '),\n(1777,'DesolaceC31',1,405,405,31,40,0,-1575.89,1726.59,58.925,5.73608,'129:0 1761:0 1769:0 1776:0 1778:0 1809:0 1810:0 '),\n(1778,'DesolaceC32',1,405,405,31,40,0,-1561.67,1991.32,61.6415,0.949069,'129:0 1773:0 1774:0 1777:0 1809:0 '),\n(1779,'DesolaceC33',1,405,607,33,40,0,-1371.99,2554.03,108.02,4.4441,'1773:0 1780:0 1781:0 '),\n(1780,'DesolaceC34',1,405,607,33,40,0,-1392.44,2659.84,112.065,5.41015,'1779:0 1781:0 '),\n(1781,'DesolaceC35',1,405,607,33,40,0,-1251.49,2685.06,111.557,3.5193,'1779:0 1780:0 1782:0 1783:0 '),\n(1782,'DesolaceC36',1,405,607,33,40,0,-1123.21,2688.52,111.831,2.59448,'1781:0 1783:0 '),\n(1783,'DesolaceC37',1,405,607,33,40,0,-1161.95,2795.33,122.835,2.23711,'1781:0 1782:0 1784:0 1785:0 '),\n(1784,'DesolaceC38',1,405,607,33,40,0,-1067.79,2918.91,179.121,3.97481,'1783:0 '),\n(1785,'DesolaceC39',1,405,607,33,40,0,-1289.84,2920.03,113.966,5.30998,'1783:0 1786:0 '),\n(1786,'DesolaceC40',1,405,607,33,40,0,-1360.57,2783.12,113.08,5.63201,'1785:0 127:0 1787:0 '),\n(1787,'DesolaceC41',1,405,607,33,40,0,-1422.79,2793.13,111.697,0.937294,'127:0 1786:0 1788:0 '),\n(1788,'DesolaceC42',1,405,607,33,40,0,-1470.51,2717.61,112.426,0.907843,'1787:0 1789:0 '),\n(1789,'DesolaceC43',1,405,607,33,40,0,-1526.76,2740.76,111.941,5.60649,'1788:0 1790:0 '),\n(1790,'DesolaceC44',1,405,607,33,40,0,-1487.94,2839.33,111.17,4.34789,'1789:0 1791:0 '),\n(1791,'DesolaceC45',1,405,607,33,40,0,-1571.53,2902.93,112.301,5.73411,'1790:0 1794:0 '),\n(1792,'DesolaceC46',1,405,2408,31,40,4,-1727.84,3103.88,35.0044,5.61552,'57:0 1793:0 '),\n(1793,'DesolaceC47',1,405,598,31,40,4,-1841.75,3013.22,11.277,0.475075,'1792:0 1794:0 1795:0 '),\n(1794,'DesolaceC48',1,405,598,31,40,0,-1852.69,2854.14,50.9586,0.237108,'1791:0 1795:0 1793:0 1796:0 1797:0 '),\n(1795,'DesolaceC49',1,405,598,31,40,0,-1990.78,2803.76,56.2314,0.896844,'1794:0 1793:0 1796:0 1797:0 '),\n(1796,'DesolaceS1',1,405,606,28,40,0,-2002.35,2610.23,62.383,1.22083,'1794:0 1795:0 1797:0 1799:0 1800:0 '),\n(1797,'DesolaceS2',1,405,405,28,40,0,-1772.22,2471.83,73.3018,5.67404,'1794:0 1795:0 1796:0 1798:0 1800:0 '),\n(1798,'DesolaceS3',1,405,405,31,40,0,-1592.19,2396.96,91.4972,2.81715,'1773:0 1797:0 1799:0 '),\n(1799,'DesolaceS4',1,405,405,31,40,0,-1797.31,2149.68,62.4428,1.77847,'1796:0 1798:0 1800:0 1809:0 '),\n(1800,'DesolaceS5',1,405,606,28,40,0,-1967.47,2474.94,61.5806,1.35043,'1796:0 1797:0 1799:0 1801:0 1803:0 '),\n(1801,'DesolaceS6',1,405,606,28,40,0,-2098.84,2409.19,61.4027,3.19808,'1800:0 1802:0 1803:0 '),\n(1802,'DesolaceExitS',1,405,405,28,40,0,-2402.61,2363.59,108.604,0.107536,'1801:0 1913:0 '),\n(1803,'DesolaceS7',1,405,602,33,40,0,-2145.67,2180.6,67.6286,1.21495,'1800:0 1801:0 1804:0 1806:0 '),\n(1804,'DesolaceS8',1,405,602,33,40,0,-2190.56,1992.71,64.0673,1.30332,'1803:0 1805:0 '),\n(1805,'DesolaceS9',1,405,602,33,40,0,-2171.01,1903.5,66.9158,1.58018,'1804:0 1807:0 '),\n(1806,'DesolaceS10',1,405,602,33,40,0,-1981.74,2045.99,59.3955,2.2831,'1803:0 1808:0 1809:0 '),\n(1807,'DesolaceS11',1,405,602,33,40,0,-2096.65,1787.92,57.1531,1.95912,'1805:0 1808:0 1811:0 '),\n(1808,'DesolaceS12',1,405,602,33,40,0,-1982.92,1838.14,63.409,3.36694,'1806:0 1807:0 1810:0 '),\n(1809,'DesolaceS13',1,405,602,33,40,0,-1815.92,1988.94,59.0664,1.39951,'1777:0 1778:0 1799:0 1806:0 '),\n(1810,'DesolaceS14',1,405,602,33,40,0,-1765.64,1678.32,60.7555,0.438962,'1777:0 1808:0 1811:0 '),\n(1811,'DesolaceS15',1,405,405,31,40,0,-2062.67,1679.65,60.5781,5.56172,'1761:0 1807:0 1810:0 1812:0 '),\n(1812,'DesolaceS16',1,405,2657,33,40,0,-2225.06,1577.55,60.1882,0.421288,'130:0 1811:0 '),\n(1813,'DesolaceS17',1,405,2657,33,40,0,-2153.93,1293.66,63.9415,0.29169,'130:0 1761:0 '),\n(1814,'MulgoreExitE',1,215,215,1,10,4,-2345.37,-1484.97,40.0713,4.66713,'174:0 1815:0 '),\n(1815,'Mulgore1',1,215,215,1,10,4,-2440.53,-1200.03,-9.30534,1.55892,'1814:0 1816:0 1865:0 1869:0 '),\n(1816,'Mulgore2',1,215,215,1,10,4,-2371.49,-904.809,-9.42438,4.38439,'1815:0 1817:0 1865:0 1866:0 1869:0 '),\n(1817,'Mulgore3',1,215,215,1,10,4,-2311.97,-607.857,-9.42454,4.65338,'1816:0 26:0 1818:0 1819:0 1869:0 '),\n(1818,'Mulgore4',1,215,223,1,10,4,-2105.91,-429.602,-6.83183,3.82086,'26:0 1817:0 1846:0 '),\n(1819,'Mulgore5',1,215,215,1,10,4,-2475.36,-501.699,-9.42479,5.94732,'26:0 1817:0 1820:0 1869:0 '),\n(1820,'Mulgore6',1,215,215,1,10,4,-2628.95,-190.942,-9.21765,5.24046,'1819:0 1821:0 1843:0 1844:0 1869:0 '),\n(1821,'Mulgore7',1,215,215,1,10,4,-2844.69,184.459,62.1599,5.51927,'1820:0 1822:0 1843:0 1844:0 '),\n(1822,'Mulgore8',1,215,215,1,10,4,-2993.74,194.655,71.8138,0.231569,'1821:0 1823:0 '),\n(1823,'Mulgore9',1,215,220,1,10,4,-3072.38,82.3203,78.0188,1.03857,'1822:0 1824:0 '),\n(1824,'Mulgore10',1,215,220,1,10,4,-3137.17,-93.9051,45.0213,1.34488,'1823:0 1825:0 1842:0 '),\n(1825,'Mulgore11',1,215,220,1,10,4,-3063.95,-239.512,50.6424,1.85735,'1824:0 27:0 1842:0 '),\n(1826,'Mulgore12',1,215,220,1,10,4,-2891.86,-697.729,45.2768,1.58442,'27:0 1827:0 1842:0 '),\n(1827,'Mulgore13',1,215,220,1,10,4,-3261.33,-846.251,48.8421,0.235503,'1826:0 1828:0 1830:0 1841:0 1842:0 '),\n(1828,'Mulgore14',1,215,220,1,10,4,-3366.64,-1016.68,109.367,6.12009,'1827:0 1829:0 '),\n(1829,'Mulgore15',1,215,358,1,10,4,-3224,-1083.1,88.5366,2.85872,'1828:0 1830:0 '),\n(1830,'Mulgore16',1,215,358,1,10,4,-3119.41,-1033.45,49.7491,3.46937,'1827:0 1829:0 1831:0 1832:0 '),\n(1831,'Mulgore17',1,215,358,1,10,4,-3063.5,-1162.46,66.0398,0.149071,'1830:0 1832:0 1833:0 '),\n(1832,'Mulgore18',1,215,358,1,10,4,-2991.05,-1001.3,57.8123,3.50664,'1830:0 1831:0 '),\n(1833,'Mulgore19',1,215,358,1,10,4,-2989.95,-1155.46,58.1984,3.50469,'1831:0 1834:0 1837:0 '),\n(1834,'Mulgore20',1,215,358,1,10,4,-2907.83,-1077.93,55.9333,3.94844,'1833:0 1835:0 1837:0 '),\n(1835,'Mulgore21',1,215,358,1,10,4,-2844.44,-1016.64,56.9403,4.16051,'1834:0 1836:0 '),\n(1836,'Mulgore22',1,215,358,1,10,4,-2854.01,-1100.12,90.8135,0.692983,'1835:0 '),\n(1837,'Mulgore23',1,215,358,1,10,4,-2883.85,-1231.28,72.9943,1.82985,'1833:0 1834:0 1838:0 1840:0 '),\n(1838,'Mulgore24',1,215,358,1,10,4,-3026.45,-1229.87,71.6597,6.01404,'1837:0 1839:0 '),\n(1839,'Mulgore25',1,215,358,1,10,4,-2970.92,-1323.02,80.5074,1.92996,'1838:0 1840:0 '),\n(1840,'Mulgore26',1,215,358,1,10,4,-2895.78,-1325.44,95.4793,2.24804,'1837:0 1839:0 '),\n(1841,'Mulgore27',1,215,220,1,10,4,-3440.17,-866.836,69.6282,6.24768,'1827:0 1842:0 '),\n(1842,'Mulgore28',1,215,220,1,10,4,-3367.33,-495.02,69.8435,4.71616,'1824:0 1825:0 1826:0 1827:0 1841:0 '),\n(1843,'Mulgore29',1,215,818,1,10,4,-2404.86,217.609,48.1932,3.41043,'1820:0 1821:0 1844:0 1845:0 1847:0 1870:0 '),\n(1844,'Mulgore30',1,215,215,1,10,4,-2261.05,-69.3042,-1.37537,2.79193,'1820:0 1821:0 1843:0 1845:0 1846:0 1847:0 '),\n(1845,'Mulgore31',1,215,215,1,10,4,-1909.74,216.749,46.1874,3.10216,'1843:0 1844:0 1847:0 1848:0 1849:0 1871:0 '),\n(1846,'Mulgore32',1,215,223,1,10,4,-2045.76,-343.178,-6.87874,4.09177,'1818:0 1844:0 1847:0 1862:0 1863:0 '),\n(1847,'Mulgore33',1,215,215,1,10,4,-1920.69,-119.003,-11.7465,4.00341,'1843:0 1844:0 1845:0 1846:0 1848:0 1862:0 '),\n(1848,'Mulgore34',1,215,215,1,10,4,-1668.96,-1.5923,-11.6961,3.52429,'1845:0 1847:0 1849:0 1850:0 1862:0 '),\n(1849,'Mulgore35',1,215,215,1,10,5,-1427.28,82.3261,15.7467,3.85023,'1845:0 1848:0 1850:0 '),\n(1850,'Mulgore36',1,215,215,1,10,4,-1347.57,320.413,8.78348,0.441607,'1848:0 1849:0 1851:0 1852:0 '),\n(1851,'Mulgore37',1,1638,1638,1,10,4,-1148.06,245.946,40.6026,3.4811,'1850:0 1852:0 1853:0 1854:0 '),\n(1852,'Mulgore38',1,215,215,1,10,4,-996.688,514.659,49.632,4.10942,'1850:0 1851:0 '),\n(1853,'Mulgore39',1,215,215,1,10,4,-751.74,38.1612,-20.8616,2.04343,'1851:0 1854:0 1856:0 1855:0 '),\n(1854,'Mulgore40',1,215,215,1,10,4,-927.854,10.2372,12.3669,2.39686,'1851:0 1853:0 1856:0 1855:0 '),\n(1855,'Mulgore41',1,215,819,1,10,4,-561.426,-405.799,30.6454,1.96489,'1853:0 1854:0 1856:0 1857:0 '),\n(1856,'Mulgore42',1,215,215,1,10,4,-901.7,-443.722,-39.0694,1.58907,'1853:0 1854:0 1855:0 1857:0 1861:0 '),\n(1857,'Mulgore43',1,215,820,1,10,4,-924.517,-801.42,-5.66428,4.78761,'1855:0 1856:0 1858:0 1860:0 1861:0 '),\n(1858,'Mulgore44',1,215,225,1,10,4,-956.811,-1082.75,42.1933,1.43395,'1857:0 1859:0 '),\n(1859,'Mulgore45',1,215,225,1,10,4,-1099.12,-1152.59,50.0739,0.809557,'1858:0 1860:0 '),\n(1860,'Mulgore46',1,215,820,1,10,4,-1365.16,-841.737,-8.11366,5.8636,'1857:0 1859:0 1861:0 1862:0 1863:0 '),\n(1861,'Mulgore47',1,215,820,1,10,4,-1254.38,-429.801,-44.919,0.114484,'1856:0 1857:0 1860:0 1862:0 '),\n(1862,'Mulgore48',1,215,820,1,10,4,-1600.99,-429.634,-38.9597,5.5357,'1846:0 1847:0 1848:0 1860:0 1861:0 1863:0 1864:0 '),\n(1863,'Mulgore49',1,215,820,1,10,4,-1742.71,-749.243,-8.79196,6.02461,'1846:0 1860:0 1862:0 1864:0 1865:0 1866:0 '),\n(1864,'Mulgore50',1,215,224,1,10,4,-1925.81,-713.913,3.65139,0.842938,'1862:0 1863:0 1865:0 1866:0 '),\n(1865,'Mulgore51',1,215,215,1,10,4,-2111.14,-877.576,-5.68659,6.00889,'1815:0 1816:0 1863:0 1864:0 1866:0 '),\n(1866,'Mulgore52',1,215,360,1,10,4,-1975.78,-1068.43,47.7644,0.687805,'1816:0 1863:0 1864:0 1865:0 1867:0 '),\n(1867,'Mulgore53',1,215,360,1,10,4,-1884.66,-1112.51,92.8851,6.08152,'1866:0 1868:0 '),\n(1868,'Mulgore54',1,215,360,1,10,4,-1584.13,-1092.53,103.917,3.87848,'1867:0 93:0 '),\n(1869,'Mulgore55',1,215,215,1,10,4,-2751.82,-857.915,4.54324,5.9912,'1815:0 1816:0 1817:0 1819:0 1820:0 '),\n(1870,'Mulgore56',1,215,818,1,10,4,-2369.44,444.618,66.6944,2.44118,'1843:0 '),\n(1871,'Mulgore57',1,215,404,1,10,4,-1938.35,454.865,133.59,5.01926,'1845:0 '),\n(1872,'DWMExitW',1,15,15,33,45,0,-3684.38,-2471.41,78.489,4.65716,'1596:0 99:0 '),\n(1873,'DustwallowC1',1,15,15,33,45,0,-3476.61,-2710.46,33.3673,2.4724,'99:0 187:0 1903:0 1904:0 103:0 '),\n(1874,'BlackhoofVillage',1,15,512,33,45,0,-2455.85,-3159.6,35.8624,3.43489,'102:0 1875:0 '),\n(1875,'DustwallowN1',1,15,15,33,45,0,-2686.37,-3372.62,34.5997,0.845044,'101:0 102:0 1874:0 1876:0 1877:0 1902:0 '),\n(1876,'DustwallowN2',1,15,15,33,45,0,-2562.07,-3486.87,34.2695,2.37303,'1875:0 1877:0 '),\n(1877,'DustwallowN3',1,15,15,33,45,0,-2671.59,-3675.6,30.8794,2.00782,'101:0 110:0 1875:0 1876:0 1878:0 1879:0 1894:0 '),\n(1878,'DustwallowN4',1,15,502,33,45,0,-2914.27,-3675.73,33.4338,1.38735,'101:0 110:0 1877:0 1879:0 1880:0 '),\n(1879,'DustwallowN5',1,15,502,33,45,0,-2802.66,-3997.22,36.7838,2.19983,'110:0 1877:0 1878:0 1880:0 1892:0 '),\n(1880,'DustwallowN6',1,15,502,33,45,0,-3155.95,-3974.68,29.251,1.17881,'110:0 1878:0 1879:0 1881:0 1887:0 '),\n(1881,'DustwallowN7',1,15,15,33,45,0,-3305.97,-4095.97,23.4925,0.654559,'109:0 1880:0 '),\n(1882,'DustwallowN8',1,15,15,33,45,0,-3491.34,-4245.46,7.816,1.17292,'109:0 54:0 1884:0 1912:0 '),\n(1883,'TheramoreInn',1,15,513,33,45,3,-3627.66,-4472.85,17.4714,0.218669,'54:0 '),\n(1884,'DustwallowCoastN1',1,15,518,33,45,0,-3458.13,-4377.69,0.755389,2.14564,'1882:0 1885:0 '),\n(1885,'DustwallowCoastN2',1,15,518,33,45,0,-3329.33,-4289.33,1.48119,3.70268,'1884:0 1886:0 '),\n(1886,'DustwallowCoastN3',1,15,518,33,45,0,-3142.27,-4215.25,0.891156,0.280307,'1885:0 1887:0 1897:0 '),\n(1887,'DustwallowCoastN4',1,15,518,33,45,0,-2985.17,-4207.51,1.60007,3.33747,'1880:0 1886:0 1888:0 1897:0 '),\n(1888,'DustwallowCoastN5',1,15,518,33,45,0,-2802.02,-4220.5,1.16157,3.12737,'1889:0 1887:0 1897:0 1898:0 '),\n(1889,'DustwallowCoastN6',1,15,518,33,45,0,-2682.96,-4150.2,0.491195,3.24911,'1888:0 1890:0 1898:0 '),\n(1890,'DustwallowCoastN7',1,15,518,33,45,0,-2644.79,-4076.96,0.24736,4.12678,'1889:0 1891:0 1892:0 1893:0 '),\n(1891,'DustwallowCoastN8',1,15,518,33,45,0,-2634.51,-3970.05,1.40599,4.46647,'1890:0 1892:0 1893:0 1894:0 '),\n(1892,'DustwallowCoastN9',1,15,518,33,45,0,-2678.39,-4014.18,4.97984,2.78377,'1879:0 1890:0 1891:0 '),\n(1893,'DustwallowCoastN10',1,15,518,33,45,0,-2559.21,-4015.96,9.99785,3.70856,'1890:0 1891:0 1899:0 '),\n(1894,'DustwallowCoastN11',1,15,518,33,45,0,-2607.14,-3826.64,6.27917,4.49985,'1877:0 1891:0 1895:0 '),\n(1895,'DustwallowCoastN12',1,15,518,33,45,0,-2466.63,-3818.63,2.61691,3.22358,'1896:0 1894:0 1899:0 1900:0 '),\n(1896,'DustwallowCoastN13',1,17,385,33,45,0,-2395.84,-3763.83,5.73158,5.36182,'1574:0 1895:0 '),\n(1897,'DustwallowCoastN14',1,15,518,33,45,0,-3001.64,-4378.46,9.05538,1.1933,'1886:0 1887:0 1888:0 '),\n(1898,'DustwallowCoastN15',1,15,518,33,45,0,-2662.99,-4255.03,3.90542,2.70126,'1888:0 1889:0 1901:0 '),\n(1899,'DustwallowCoastN16',1,15,518,33,45,0,-2408.96,-4080.5,3.33986,2.28499,'1893:0 1895:0 1900:0 1901:0 '),\n(1900,'DustwallowCoastN17',1,15,518,33,45,0,-2302.1,-4086.25,16.0641,1.37353,'1573:0 1574:0 1895:0 1899:0 1901:0 '),\n(1901,'DustwallowCoastN18',1,15,518,33,45,0,-2291.73,-4303.19,4.72444,2.85793,'1898:0 1899:0 1900:0 '),\n(1902,'DustwallowN9',1,15,15,33,45,0,-2942.4,-3252.27,31.3912,5.0692,'100:0 101:0 102:0 1875:0 1903:0 '),\n(1903,'DustwallowC2',1,15,15,33,45,0,-3285.02,-3185.79,32.3767,5.19094,'1873:0 1902:0 1904:0 1905:0 '),\n(1904,'DustwallowC3',1,15,2302,33,45,0,-3645.37,-3105.83,35.4956,0.749902,'99:0 1873:0 1903:0 1905:0 1907:0 103:0 '),\n(1905,'DustwallowC4',1,15,4046,33,45,0,-3692.77,-3428.45,36.5831,1.67942,'1903:0 1904:0 1906:0 1907:0 '),\n(1906,'DustwallowC5',1,15,501,33,45,0,-4023.01,-3761.02,42.2472,0.725162,'1905:0 1907:0 105:0 '),\n(1907,'DustwallowC6',1,15,4049,33,45,0,-4017.64,-3385.66,38.3117,5.35312,'1904:0 1905:0 1906:0 103:0 105:0 '),\n(1908,'DustwallowC7',1,15,510,33,45,0,-4230.28,-2794.11,27.7681,6.16323,'103:0 108:0 1909:0 '),\n(1909,'DustwallowS1',1,15,509,33,45,0,-4392.92,-2968.72,72.0173,1.4685,'103:0 108:0 1908:0 233:0 105:0 '),\n(1910,'DustwallowS2',1,15,511,33,45,0,-4652.75,-3983.64,63.5063,1.62756,'106:0 107:0 '),\n(1911,'DustwallowS3',1,15,511,33,45,0,-4869.31,-3443.39,39.4441,0.620287,'106:0 107:0 233:0 '),\n(1912,'DustwallowCoastS1',1,15,516,33,45,0,-3990.53,-4144.75,15.8765,3.0059,'104:0 1882:0 '),\n(1913,'FeralasN1',1,357,1114,38,50,0,-2571.82,2244.63,96.3995,0.543668,'1802:0 1914:0 '),\n(1914,'FeralasN2',1,357,1114,38,50,0,-2742,2335.99,62.5691,5.81565,'1913:0 1915:0 1920:0 1921:0 '),\n(1915,'FeralasN3',1,357,1114,38,50,0,-2829.93,2719.49,74.7843,5.10291,'1914:0 1916:0 1920:0 '),\n(1916,'FeralasN4',1,357,1114,38,50,0,-3032.68,2638.14,54.8507,0.249148,'1915:0 1917:0 1920:0 '),\n(1917,'FeralasN5',1,357,1119,38,50,0,-3246.59,2815.94,85.1355,5.88045,'1916:0 1918:0 '),\n(1918,'FeralasN6',1,357,1119,38,50,0,-3570.32,2569.75,80.1298,0.734128,'1917:0 1919:0 1923:0 '),\n(1919,'FeralasN7',1,357,1119,38,50,0,-3349.08,2217.29,32.4203,2.18908,'1918:0 1920:0 1922:0 '),\n(1920,'FeralasN8',1,357,1119,38,50,0,-2939.01,2249.46,45.7452,1.87688,'1914:0 1915:0 1916:0 1919:0 1921:0 '),\n(1921,'FeralasN9',1,357,1111,50,60,0,-2867.51,1894.77,52.6495,3.09033,'1914:0 1920:0 '),\n(1922,'FeralasN10',1,357,1119,38,50,0,-3464.98,2077.93,40.3195,0.882963,'1919:0 1923:0 1925:0 1926:0 '),\n(1923,'FeralasN11',1,357,1119,38,50,0,-3508.95,2343.43,61.5171,1.82151,'1918:0 1922:0 1924:0 '),\n(1924,'FeralasN12',1,357,1119,38,50,0,-3582.9,2225.74,39.1949,3.55134,'1923:0 1925:0 '),\n(1925,'FeralasN13',1,357,1119,38,50,0,-3677.85,2192.02,79.5813,5.92325,'1922:0 1924:0 1929:0 '),\n(1926,'FeralasN14',1,357,1119,38,50,0,-3902.37,1958.83,79.7325,5.2537,'1922:0 1927:0 1931:0 '),\n(1927,'FeralasN15',1,357,1115,38,50,0,-3845.14,1829.16,124.075,1.98644,'1926:0 131:0 '),\n(1928,'FeralasN16',1,357,1115,38,50,0,-3896.35,1647.85,117.592,4.8178,'131:0 '),\n(1929,'FeralasN17',1,357,1119,38,50,0,-3899.54,2080.79,120.315,0.496151,'1925:0 1930:0 '),\n(1930,'FeralasN18',1,357,1119,38,50,0,-4106.11,2126.23,91.7704,5.83686,'1929:0 1931:0 1932:0 '),\n(1931,'FeralasN19',1,357,1119,38,50,0,-4171.24,2101.97,88.0788,0.490217,'1926:0 1930:0 1943:0 '),\n(1932,'FeralasCoast1',1,357,1108,38,50,0,-4118.28,2330.97,2.19033,5.05932,'1930:0 1933:0 1935:0 '),\n(1933,'FeralasCoast2',1,357,1108,38,50,0,-4052.79,2718.62,0.6784,4.75105,'1932:0 1934:0 1939:0 '),\n(1934,'FeralasCoast3',1,357,1108,38,50,0,-3843.41,3064.54,7.61114,4.17574,'1933:0 '),\n(1935,'FeralasCoast4',1,357,1108,38,50,0,-4379.47,2356.68,-0.331094,5.57371,'1932:0 1936:0 1937:0 1939:0 1944:0 '),\n(1936,'FeralasCoast5',1,357,1108,38,50,0,-4743.36,2004.49,5.62754,0.704225,'1935:0 1937:0 1950:0 '),\n(1937,'FeralasCoast6',1,357,1108,38,50,0,-4901.88,2189.77,1.21295,5.78972,'1935:0 1936:0 1938:0 '),\n(1938,'FeralasCoast7',1,357,1108,38,50,0,-5436.32,2245.93,4.15669,6.02534,'1937:0 '),\n(1939,'FeathermoonCoast',1,357,1116,38,50,2,-4396.44,3096.49,-0.543116,1.686,'58:0 1933:0 1935:0 '),\n(1940,'SardorIsle1',1,357,1117,38,50,2,-4874.91,3238.84,9.84719,0.996823,'58:0 132:0 1941:0 '),\n(1941,'SardorIsle2',1,357,1120,38,50,2,-4509.12,3541.55,19.5222,3.63969,'58:0 132:0 1940:0 '),\n(1942,'ShalzarusLairInside',1,357,3117,38,50,0,-5628.12,3481.23,0.291859,1.03412,'140:0 '),\n(1943,'FeralasC1',1,357,1108,38,50,0,-4354.27,2114.61,65.9115,3.94793,'1931:0 1944:0 '),\n(1944,'FeralasC2',1,357,1108,38,50,0,-4459.61,2051.49,45.6382,0.749398,'1935:0 1943:0 1945:0 '),\n(1945,'FeralasC3',1,357,1108,38,50,0,-4587.74,2020.12,49.7424,0.107333,'1944:0 1946:0 '),\n(1946,'FeralasC4',1,357,1108,38,50,0,-4669.12,1941.38,71.209,4.65283,'1945:0 1947:0 '),\n(1947,'FeralasC5',1,357,1136,38,50,0,-4689.38,1793.15,92.5165,3.59252,'1946:0 1948:0 1951:0 '),\n(1948,'FeralasC6',1,357,1136,38,50,0,-4548.77,1825.47,91.6009,4.86489,'1947:0 1949:0 '),\n(1949,'FeralasC7',1,357,2577,38,50,0,-4570.42,1333.99,110.276,1.57406,'1948:0 1952:0 1966:0 '),\n(1950,'FeralasC8',1,357,1136,38,50,0,-4774.62,1706.39,79.0617,1.25399,'1936:0 1951:0 '),\n(1951,'FeralasC9',1,357,1136,38,50,0,-4747.41,1601.96,83.6922,1.48372,'1947:0 1950:0 1952:0 1953:0 '),\n(1952,'FeralasC10',1,357,1136,38,50,0,-4850.91,1315.71,81.0286,0.264391,'1949:0 1951:0 1966:0 '),\n(1953,'FeralasC11',1,357,1105,38,50,0,-4984.77,1575.59,59.7078,0.164254,'1951:0 1954:0 1956:0 1964:0 '),\n(1954,'FeralasC12',1,357,1105,38,50,0,-4932.88,1723.53,64.1127,4.66263,'1953:0 1955:0 '),\n(1955,'FeralasC13',1,357,1105,38,50,0,-5149.79,1759.34,78.4796,0.706951,'1954:0 '),\n(1956,'FeralasC14',1,357,1136,38,50,0,-5121.12,1597.3,62.6844,6.11245,'1953:0 1957:0 1964:0 '),\n(1957,'FeralasC15',1,357,1136,38,50,0,-5312.41,1586.43,50.2301,2.5919,'1956:0 1958:0 1961:0 1964:0 '),\n(1958,'FeralasC16',1,357,1106,38,50,0,-5747.35,1698.84,93.4873,6.16546,'1957:0 1959:0 '),\n(1959,'FeralasC17',1,357,2522,38,50,0,-5765.25,1224.11,66.4458,1.50412,'1958:0 1960:0 '),\n(1960,'FeralasC18',1,357,2522,38,50,0,-5550.63,1116.69,56.7549,0.496841,'1959:0 1961:0 '),\n(1961,'FeralasC19',1,357,2522,38,50,0,-5461.46,1368.9,22.0332,4.46507,'1957:0 1960:0 1962:0 1964:0 '),\n(1962,'FeralasC20',1,357,2522,38,50,0,-5595.89,1373.16,54.1263,3.31838,'1961:0 1963:0 '),\n(1963,'FeralasC21',1,357,2522,38,50,0,-5687.79,1413.51,73.2559,3.3773,'1962:0 '),\n(1964,'FeralasC22',1,357,2522,38,50,0,-5109.82,1250.83,51.7218,2.34252,'1953:0 1956:0 1957:0 1961:0 1965:0 '),\n(1965,'FeralasC23',1,357,2522,38,50,0,-4947.18,1144.74,76.4718,2.43362,'1964:0 1966:0 '),\n(1966,'FeralasC24',1,357,1136,38,50,0,-4819.41,1182.67,88.2722,1.88973,'1949:0 1952:0 1965:0 1967:0 '),\n(1967,'FeralasC25',1,357,2521,38,50,0,-4850.75,1054.39,94.6178,1.13575,'1966:0 1968:0 '),\n(1968,'FeralasC26',1,357,357,38,50,0,-4701.43,1002.11,106.384,2.81258,'1967:0 1969:0 1972:0 '),\n(1969,'FeralasC27',1,357,357,38,50,0,-4686.71,913.041,90.3337,1.80138,'1968:0 1970:0 '),\n(1970,'FeralasC28',1,357,357,38,50,0,-4641.48,856.356,83.6012,2.41398,'1969:0 1971:0 '),\n(1971,'FeralasC29',1,357,357,38,50,0,-4679.42,716.437,75.2356,1.09647,'1970:0 1974:0 1981:0 '),\n(1972,'FeralasC30',1,357,357,38,50,0,-4555.72,884.281,58.0988,3.21115,'1968:0 1973:0 '),\n(1973,'FeralasC31',1,357,357,38,50,0,-4505.93,684.371,66.7637,1.78171,'1972:0 1974:0 1975:0 1976:0 '),\n(1974,'FeralasE1',1,357,357,38,50,0,-4659.39,623.64,52.4147,4.96061,'1971:0 1973:0 1975:0 1978:0 2006:0 '),\n(1975,'FeralasE2',1,357,357,38,50,0,-4635.27,542.675,37.1032,1.8524,'1973:0 1974:0 1976:0 1981:0 1993:0 1994:0 1995:0 '),\n(1976,'FeralasE3',1,357,357,38,50,0,-4390.02,604.52,62.0106,2.9598,'1973:0 1975:0 1977:0 1995:0 2006:0 '),\n(1977,'FeralasE4',1,357,1100,38,50,0,-4212.24,655.545,69.8097,3.6706,'1976:0 2005:0 2006:0 '),\n(1978,'FeralasE5',1,357,2519,38,50,0,-4898.74,674.126,43.55,1.02185,'1974:0 1979:0 1981:0 1982:0 '),\n(1979,'FeralasE6',1,357,2519,38,50,0,-4953.5,761.759,82.878,5.39652,'1978:0 1980:0 '),\n(1980,'FeralasE7',1,357,2520,38,50,0,-4845.02,785.634,113.891,1.35172,'1979:0 178:0 '),\n(1981,'FeralasE8',1,357,2519,38,50,0,-4880.52,558.22,12.8999,1.88775,'1971:0 1975:0 1978:0 1993:0 1994:0 '),\n(1982,'FeralasE9',1,357,2519,38,50,0,-5149.35,692.713,54.9213,6.26831,'1978:0 1983:0 1994:0 '),\n(1983,'FeralasE10',1,357,1101,38,50,0,-5319.6,478.232,53.9695,0.898155,'1982:0 1984:0 1994:0 '),\n(1984,'FeralasE11',1,357,1101,38,50,0,-5163.07,220.677,54.4074,1.30064,'1983:0 1985:0 1986:0 1987:0 1988:0 1991:0 '),\n(1985,'FeralasE12',1,357,1101,38,50,0,-5302,428.292,8.41442,3.73933,'1984:0 '),\n(1986,'FeralasE13',1,357,1101,38,50,0,-5384.3,261.887,20.4496,0.905996,'1984:0 '),\n(1987,'FeralasE14',1,357,1101,38,50,0,-5265.18,-4.42852,15.1479,1.56377,'1984:0 '),\n(1988,'FeralasE15',1,357,1101,38,50,0,-5343.63,67.4607,28.7204,3.66077,'1984:0 1989:0 1990:0 '),\n(1989,'FeralasE16',1,357,1101,38,50,0,-5450.99,119.201,27.5633,6.28204,'1988:0 '),\n(1990,'FeralasE17',1,357,1101,38,50,0,-5340.47,-23.1596,18.5077,1.41062,'1988:0 '),\n(1991,'FeralasE18',1,357,2519,38,50,0,-4991.17,205.185,56.0523,2.62992,'1984:0 136:0 1992:0 1994:0 '),\n(1992,'FeralasE19',1,357,1137,38,50,0,-4866.29,339.413,26.1994,4.53453,'136:0 1991:0 1993:0 1994:0 1999:0 '),\n(1993,'FeralasE20',1,357,357,38,50,0,-4722.79,464.496,31.986,3.94744,'1975:0 1981:0 1992:0 '),\n(1994,'FeralasE21',1,357,2519,38,50,0,-5009.99,424.997,15.1355,0.648747,'1975:0 1981:0 1982:0 1983:0 1991:0 1992:0 '),\n(1995,'FeralasE22',1,357,357,38,50,4,-4578.16,370.868,33.8808,1.77815,'1975:0 1976:0 53:0 2006:0 '),\n(1996,'FeralasE23',1,357,1099,38,50,5,-4481.74,227.782,48.3927,0.264285,'53:0 '),\n(1997,'FeralasE24',1,357,1099,38,50,4,-4376.3,121.922,32.6793,1.76165,'53:0 1998:0 '),\n(1998,'FeralasE25',1,357,1137,38,50,4,-4328.21,-19.6833,60.5124,1.72631,'1997:0 2003:0 '),\n(1999,'FeralasE26',1,357,357,38,50,0,-4659.2,184.738,43.8095,4.93936,'1992:0 2000:0 '),\n(2000,'FeralasE27',1,357,357,38,50,0,-4603.74,66.3705,89.2353,5.28101,'1999:0 2001:0 '),\n(2001,'FeralasE28',1,357,357,38,50,0,-4564.62,-31.7688,90.9571,1.80758,'2000:0 2002:0 '),\n(2002,'FeralasE29',1,357,357,38,50,0,-4446.96,-44.7766,57.3336,5.9427,'2001:0 2003:0 2009:0 '),\n(2003,'FeralasE30',1,357,1137,38,50,0,-4300.16,-85.5649,62.2238,2.29256,'1998:0 2002:0 2004:0 2007:0 2008:0 '),\n(2004,'FeralasE31',1,357,2518,38,50,0,-4205.65,113.809,55.5058,4.08129,'2003:0 2006:0 137:0 '),\n(2005,'FeralasE32',1,357,1100,38,50,0,-4133.72,537.891,69.2153,3.29981,'1977:0 2006:0 '),\n(2006,'FeralasE33',1,357,357,38,50,0,-4279.19,459.305,53.0559,3.87904,'1974:0 1976:0 1977:0 1995:0 2004:0 2005:0 137:0 '),\n(2007,'FeralasE34',1,357,1137,38,50,0,-4106.63,-81.3584,57.9545,3.10739,'2003:0 137:0 2008:0 '),\n(2008,'FeralasE35',1,357,1137,38,50,0,-4234.2,-193.867,59.9266,1.9823,'2003:0 2007:0 2010:0 2017:0 '),\n(2009,'FeralasE36',1,357,1137,38,50,0,-4457.62,-347.118,42.7385,1.56603,'2002:0 2010:0 2013:0 '),\n(2010,'FeralasE37',1,357,1137,38,50,0,-4279.38,-302.439,53.8359,3.38225,'2008:0 2009:0 2011:0 '),\n(2011,'FeralasE38',1,357,1137,38,50,0,-4304.01,-380.254,42.9873,1.37949,'2010:0 2012:0 '),\n(2012,'FeralasE39',1,357,1137,38,50,0,-4323.94,-518.378,18.8016,1.66222,'2011:0 2013:0 2015:0 '),\n(2013,'FeralasE40',1,357,1137,38,50,0,-4484.94,-528.383,12.6689,1.34413,'2009:0 2012:0 2014:0 '),\n(2014,'FeralasE41',1,357,1137,38,50,0,-4483.85,-680.591,-13.4172,2.0451,'2013:0 40:0 2019:0 '),\n(2015,'FeralasE42',1,357,1137,38,50,0,-4357.69,-582.597,3.62467,1.18115,'2012:0 2016:0 '),\n(2016,'FeralasE43',1,357,1137,38,50,0,-4283.62,-657.145,-16.5908,4.73115,'2015:0 2019:0 '),\n(2017,'FeralasE44',1,357,1137,38,50,0,-4097.49,-507.444,10.4313,4.54463,'2008:0 2018:0 '),\n(2018,'FeralasE45',1,357,1137,38,50,0,-4189.57,-767.003,-39.6189,2.74803,'2017:0 2019:0 2023:0 '),\n(2019,'FeralasE46',1,357,1137,38,50,0,-4273.71,-763.178,-44.585,1.5287,'40:0 2014:0 2016:0 2018:0 2020:0 '),\n(2020,'ThousandNeedlesW1',1,400,400,23,35,0,-4400.82,-883.395,-57.6691,2.28464,'40:0 2019:0 2022:0 2024:0 '),\n(2021,'ThousandNeedlesW2',1,400,400,23,35,0,-4635.23,-913.058,-56.816,0.876811,'40:0 2022:0 2030:0 '),\n(2022,'ThousandNeedlesW3',1,400,400,23,35,0,-4526.31,-1003.24,-57.3019,0.841468,'2020:0 2021:0 2024:0 2025:0 '),\n(2023,'ThousandNeedlesW4',1,400,400,23,35,0,-4265.7,-975.548,-52.6163,1.36572,'2018:0 2024:0 '),\n(2024,'ThousandNeedlesW5',1,400,400,23,35,0,-4345.17,-1001.19,-55.4334,0.859138,'2020:0 2022:0 2023:0 2026:0 '),\n(2025,'ThousandNeedlesW6',1,400,400,23,35,0,-4577.79,-1063.18,-51.9676,0.682426,'2022:0 2026:0 2027:0 '),\n(2026,'ThousandNeedlesW7',1,400,480,23,35,0,-4478.86,-1145.77,-53.883,1.10654,'2024:0 2025:0 2028:0 '),\n(2027,'ThousandNeedlesW8',1,400,400,23,35,0,-4653.89,-1114.06,-54.8856,5.97601,'2025:0 2028:0 2029:0 '),\n(2028,'ThousandNeedlesW9',1,400,480,23,35,0,-4608.02,-1288.85,-51.0977,0.870926,'2026:0 2027:0 2033:0 2037:0 '),\n(2029,'ThousandNeedlesW10',1,400,400,23,35,0,-4726.44,-1099.89,-54.2582,6.07616,'2027:0 2030:0 2033:0 '),\n(2030,'ThousandNeedlesW11',1,400,400,23,35,0,-4790.74,-1025.56,-58.7304,0.476274,'2021:0 2029:0 2031:0 2058:0 '),\n(2031,'ThousandNeedlesW12',1,400,400,23,35,0,-4923.35,-1082.53,-50.209,0.562663,'2030:0 2032:0 2035:0 '),\n(2032,'ThousandNeedlesW13',1,400,400,23,35,0,-4838.39,-1191.4,-49.6151,2.08829,'2031:0 2033:0 2034:0 '),\n(2033,'ThousandNeedlesW14',1,400,400,23,35,0,-4768.1,-1216.56,-52.8083,3.08574,'2028:0 2029:0 2032:0 2036:0 '),\n(2034,'ThousandNeedlesW15',1,400,400,23,35,0,-4942.46,-1263.31,-48.5414,1.36768,'2032:0 2035:0 50:0 '),\n(2035,'ThousandNeedlesW16',1,400,400,23,35,0,-5066.47,-1194.08,-55.537,0.71973,'2031:0 2034:0 2039:0 '),\n(2036,'ThousandNeedlesW17',1,400,400,23,35,0,-4769.77,-1352.68,-49.836,1.52869,'50:0 2033:0 2037:0 2040:0 '),\n(2037,'ThousandNeedlesW18',1,400,400,23,35,0,-4652.8,-1464.98,-50.872,2.47901,'2028:0 2036:0 2041:0 2043:0 '),\n(2038,'ThousandNeedlesW19',1,400,400,23,35,0,-5074.73,-1410.96,-52.2312,0.222955,'50:0 2039:0 2048:0 '),\n(2039,'ThousandNeedlesW20',1,400,400,23,35,0,-5194.18,-1406.79,-50.3763,0.764877,'2035:0 2038:0 2050:0 '),\n(2040,'ThousandNeedlesW21',1,400,400,23,35,0,-4891.87,-1456.05,-51.236,1.07118,'50:0 2036:0 2042:0 2048:0 '),\n(2041,'ThousandNeedlesW22',1,400,400,23,35,0,-4757,-1501.21,-28.7948,0.370198,'2037:0 2042:0 '),\n(2042,'ThousandNeedlesW23',1,400,400,23,35,0,-4811.64,-1556.31,-50.0359,0.963171,'2040:0 2041:0 2043:0 2046:0 '),\n(2043,'ThousandNeedlesW24',1,400,400,23,35,0,-4661.22,-1624.56,-25.4573,1.73482,'2037:0 2042:0 2044:0 '),\n(2044,'ThousandNeedlesW25',1,400,400,23,35,0,-4624.13,-1730.14,-31.5621,1.85852,'2043:0 2045:0 '),\n(2045,'ThousandNeedlesW26',1,400,485,23,35,0,-4691.02,-1824.75,-56.5207,1.01619,'2044:0 2047:0 2081:0 '),\n(2046,'ThousandNeedlesW27',1,400,400,23,35,0,-4811.86,-1670.4,-51.0873,1.72892,'2042:0 2047:0 2052:0 '),\n(2047,'ThousandNeedlesW28',1,400,2097,23,35,0,-4783.23,-1788.72,-49.3172,1.42261,'2045:0 2046:0 2051:0 '),\n(2048,'ThousandNeedlesW29',1,400,400,23,35,0,-4982.42,-1560.83,-47.125,1.17787,'2038:0 2040:0 2049:0 2052:0 '),\n(2049,'ThousandNeedlesW30',1,400,400,23,35,0,-5165.39,-1577.56,-54.4116,0.343386,'2048:0 2050:0 2054:0 '),\n(2050,'ThousandNeedlesW31',1,400,483,23,35,0,-5295.65,-1509.76,-56.4121,0.573119,'2039:0 2049:0 2055:0 '),\n(2051,'ThousandNeedlesW32',1,400,2097,23,35,0,-4855.93,-1831.87,-51.9183,1.28194,'2047:0 2052:0 2079:0 2080:0 '),\n(2052,'ThousandNeedlesW33',1,400,400,23,35,0,-4969.52,-1717.69,-61.5435,1.6491,'2046:0 2048:0 2051:0 2053:0 '),\n(2053,'ThousandNeedlesW34',1,400,400,23,35,0,-5061.47,-1763.65,-66.1325,0.36653,'2052:0 2054:0 2068:0 '),\n(2054,'ThousandNeedlesW35',1,400,400,23,35,0,-5173.45,-1717.17,-61.8311,6.25112,'2049:0 2053:0 2055:0 2086:0 2087:0 '),\n(2055,'ThousandNeedlesW36',1,400,483,23,35,0,-5372.83,-1603.26,-55.6282,0.975215,'2050:0 2054:0 2056:0 2087:0 2088:0 '),\n(2056,'ThousandNeedlesW37',1,400,483,23,35,0,-5472.25,-1702.35,2.75952,1.04984,'2055:0 116:0 '),\n(2057,'ThousandNeedlesW38',1,400,487,23,35,0,-5593.3,-1588.57,6.36415,0.366532,'116:0 '),\n(2058,'ThousandNeedlesW39',1,400,482,23,35,0,-4950.58,-1058.58,-14.0026,1.23243,'2030:0 2059:0 '),\n(2059,'ThousandNeedlesW40',1,400,482,23,35,0,-4980.25,-980.015,-4.94507,5.09659,'2058:0 2060:0 2062:0 2061:0 '),\n(2060,'ThousandNeedlesW41',1,400,482,23,35,0,-4876.43,-922.254,-5.58887,3.87725,'2059:0 2062:0 2061:0 '),\n(2061,'ThousandNeedlesW42',1,400,482,23,35,0,-5005.39,-842.193,-5.46968,5.01411,'2059:0 2060:0 2062:0 '),\n(2062,'ThousandNeedlesW43',1,400,482,23,35,0,-5051.17,-927.317,-5.60775,4.14232,'2059:0 2060:0 2061:0 2063:0 2064:0 '),\n(2063,'ThousandNeedlesW44',1,400,482,23,35,0,-5166.88,-896.379,-5.07889,5.92361,'2062:0 '),\n(2064,'ThousandNeedlesW45',1,400,482,23,35,0,-5091.13,-1008.99,-5.23615,3.78733,'2062:0 2065:0 '),\n(2065,'ThousandNeedlesW46',1,400,482,23,35,0,-5126.17,-1095.6,50.5447,1.11501,'2064:0 2066:0 '),\n(2066,'ThousandNeedlesW47',1,400,482,23,35,0,-5191.66,-1142.08,49.8328,4.3371,'2065:0 2067:0 '),\n(2067,'ThousandNeedlesW48',1,400,482,23,35,0,-5186.85,-1242.42,53.7882,2.36968,'2066:0 '),\n(2068,'DarkcloudPinnacle1',1,400,2097,23,35,0,-5005.12,-1890.45,3.66479,1.83561,'2053:0 2069:0 '),\n(2069,'DarkcloudPinnacle2',1,400,2097,23,35,0,-4901.08,-1867.77,34.9781,3.58507,'2068:0 2070:0 '),\n(2070,'DarkcloudPinnacle3',1,400,2097,23,35,0,-4776.06,-1872.74,90.3879,3.04316,'2069:0 2071:0 '),\n(2071,'DarkcloudPinnacle4',1,400,2097,23,35,0,-4876.74,-1978.26,91.8746,0.720343,'2070:0 2072:0 115:0 '),\n(2072,'DarkcloudPinnacle5',1,400,2097,23,35,0,-4915.54,-2071.05,84.7897,4.93989,'2071:0 2073:0 2076:0 '),\n(2073,'DarkcloudPinnacle6',1,400,2097,23,35,0,-4831.42,-2151.41,81.6488,1.60588,'2072:0 2074:0 2075:0 '),\n(2074,'DarkcloudPinnacle7',1,400,2097,23,35,0,-4748.26,-2111.8,83.523,4.04415,'2073:0 '),\n(2075,'DarkcloudPinnacle8',1,400,400,23,35,0,-4842.57,-2213.19,85.1857,5.94087,'2073:0 '),\n(2076,'DarkcloudPinnacle9',1,400,2097,23,35,0,-5016.1,-2107.74,83.8605,6.28252,'2072:0 '),\n(2077,'DarkcloudPinnacle10',1,400,2097,23,35,0,-5170.08,-2145.09,93.7072,3.77318,'115:0 '),\n(2078,'DarkcloudPinnacle11',1,400,2097,23,35,0,-4921.47,-1843.98,80.8273,3.6318,'115:0 '),\n(2079,'ThousandNeedlesC1',1,400,2097,23,35,0,-4970.93,-1895.26,-42.399,2.08851,'2051:0 2080:0 '),\n(2080,'ThousandNeedlesC2',1,400,2097,23,35,0,-4870.6,-1904.88,-51.5857,2.74235,'2051:0 2079:0 2082:0 '),\n(2081,'ThousandNeedlesC3',1,400,2097,23,35,0,-4709.18,-1916.95,-45.1441,1.27365,'2045:0 2082:0 '),\n(2082,'ThousandNeedlesC4',1,400,2097,23,35,0,-4776.72,-1989.22,-60.8744,1.12639,'2080:0 2081:0 2083:0 '),\n(2083,'ThousandNeedlesC5',1,400,2097,23,35,0,-4881.01,-2128.55,-44.1711,3.78849,'2082:0 2084:0 '),\n(2084,'ThousandNeedlesC6',1,400,481,23,35,0,-5057.5,-2264.52,-53.5104,0.73918,'2083:0 2085:0 2094:0 119:0 '),\n(2085,'ThousandNeedlesC7',1,400,2097,23,35,0,-5086.72,-2103.07,-39.7408,4.73175,'2084:0 2086:0 '),\n(2086,'ThousandNeedlesC8',1,400,400,23,35,0,-5241.22,-1991.69,-60.4397,4.88884,'2054:0 2085:0 2090:0 2094:0 '),\n(2087,'ThousandNeedlesC9',1,400,483,23,35,0,-5343.03,-1806.64,-52.2102,0.525945,'2054:0 2055:0 2089:0 '),\n(2088,'ThousandNeedlesC10',1,400,483,23,35,0,-5473.39,-1743.1,-18.0835,0.979516,'2055:0 2089:0 '),\n(2089,'ThousandNeedlesC11',1,400,483,23,35,0,-5533.01,-1878.93,-58.2063,1.19746,'2087:0 2088:0 2090:0 2092:0 '),\n(2090,'ThousandNeedlesC12',1,400,400,23,35,0,-5432.97,-2043.66,-64.7738,6.26721,'2086:0 2089:0 2091:0 '),\n(2091,'ThousandNeedlesC13',1,400,400,23,35,0,-5465.16,-2122.43,-60.3274,1.03645,'2090:0 2092:0 2095:0 '),\n(2092,'ThousandNeedlesC14',1,400,400,23,35,0,-5599.58,-2073.33,-64.8276,0.983438,'2089:0 2091:0 2093:0 '),\n(2093,'ThousandNeedlesC15',1,400,400,23,35,0,-5667.81,-2212.47,-58.1306,1.11303,'2092:0 2096:0 2106:0 '),\n(2094,'ThousandNeedlesC16',1,400,400,23,35,0,-5287.5,-2195.62,-54.0753,0.741926,'2084:0 2086:0 2095:0 2097:0 119:0 '),\n(2095,'ThousandNeedlesC17',1,400,400,23,35,0,-5426.32,-2213.81,-58.3051,6.2613,'2091:0 2094:0 2096:0 2097:0 '),\n(2096,'ThousandNeedlesC18',1,400,400,23,35,0,-5522.8,-2260.72,-59.6581,0.457222,'2093:0 2095:0 2098:0 '),\n(2097,'ThousandNeedlesC19',1,400,400,23,35,0,-5326.39,-2315.08,-42.353,1.99266,'2094:0 2095:0 2098:0 2110:0 '),\n(2098,'ThousandNeedlesC20',1,400,484,23,35,4,-5535.61,-2362.59,-50.5979,1.14639,'2096:0 2097:0 2099:0 2107:0 '),\n(2099,'ThousandNeedlesC21',1,400,484,23,35,4,-5649.75,-2375.72,2.56609,6.22399,'2098:0 2100:0 '),\n(2100,'ThousandNeedlesC22',1,400,484,23,35,4,-5656.57,-2454.18,0.642997,4.88096,'2099:0 2101:0 '),\n(2101,'ThousandNeedlesC23',1,400,484,23,35,4,-5604.75,-2490.4,30.4679,0.258887,'2100:0 2102:0 '),\n(2102,'ThousandNeedlesC24',1,400,484,23,35,4,-5527.14,-2463.43,30.6774,2.88172,'2101:0 2103:0 '),\n(2103,'ThousandNeedlesC25',1,400,484,23,35,4,-5474.04,-2382.59,57.2742,4.1305,'2102:0 2104:0 '),\n(2104,'ThousandNeedlesC26',1,400,484,23,35,4,-5424.92,-2272.98,82.5255,4.55855,'2103:0 41:0 '),\n(2105,'ThousandNeedlesC27',1,400,484,23,35,5,-5477.21,-2454.4,89.2838,1.45228,'41:0 '),\n(2106,'ThousandNeedlesC28',1,400,400,23,35,0,-5735.44,-2408.6,-53.3532,0.767009,'2093:0 2107:0 2108:0 '),\n(2107,'ThousandNeedlesC29',1,400,484,23,35,0,-5587.73,-2442.35,-50.4618,1.40318,'2098:0 2106:0 2109:0 '),\n(2108,'ThousandNeedlesC30',1,400,400,23,35,0,-5685.83,-2597.38,-56.0596,2.12378,'2106:0 2109:0 2119:0 '),\n(2109,'ThousandNeedlesC31',1,400,484,23,35,0,-5520.25,-2555.03,-56.5953,1.46797,'2107:0 2108:0 2111:0 2118:0 '),\n(2110,'ThousandNeedlesC32',1,400,484,23,35,0,-5309.22,-2432.88,-43.4182,2.04524,'2097:0 2111:0 2112:0 '),\n(2111,'ThousandNeedlesC33',1,400,400,23,35,4,-5357.57,-2551.14,-55.4342,1.46403,'2109:0 2110:0 2113:0 2115:0 '),\n(2112,'ThousandNeedlesC34',1,400,400,23,35,0,-5163.1,-2464.2,-52.5964,1.02224,'119:0 2110:0 2113:0 '),\n(2113,'ThousandNeedlesC35',1,400,400,23,35,0,-5168.45,-2584.79,-50.393,1.73498,'2111:0 2112:0 2114:0 '),\n(2114,'ThousandNeedlesC36',1,400,400,23,35,0,-5206.18,-2701.85,-49.9805,1.80567,'2113:0 2115:0 2116:0 '),\n(2115,'ThousandNeedlesC37',1,400,400,23,35,0,-5338.74,-2645.97,-45.5587,1.67019,'2111:0 2114:0 2117:0 '),\n(2116,'ThousandNeedlesC38',1,400,2303,23,35,0,-5338.36,-2841.96,-55.7141,1.17145,'2114:0 2117:0 2120:0 2123:0 '),\n(2117,'ThousandNeedlesC39',1,400,400,23,35,0,-5400.44,-2696.1,-41.6368,5.12985,'2115:0 2116:0 2118:0 '),\n(2118,'ThousandNeedlesC40',1,400,400,23,35,0,-5508.15,-2681.27,-49.789,6.27849,'2109:0 2117:0 2119:0 '),\n(2119,'ThousandNeedlesC41',1,400,400,23,35,0,-5557.86,-2761.38,-53.7029,2.24548,'2108:0 2118:0 2121:0 '),\n(2120,'ThousandNeedlesC42',1,400,2303,23,35,0,-5427.21,-2905.53,-56.1528,0.737522,'2116:0 2121:0 2122:0 '),\n(2121,'ThousandNeedlesC43',1,400,400,23,35,0,-5557.61,-2850.74,-55.2145,1.22644,'2119:0 2120:0 2124:0 '),\n(2122,'ThousandNeedlesC44',1,400,2303,23,35,0,-5449.75,-3008,-48.4049,1.26768,'2120:0 2123:0 2125:0 '),\n(2123,'ThousandNeedlesC45',1,400,2303,23,35,0,-5324.57,-3065.64,-49.0275,2.62249,'2116:0 2122:0 2127:0 '),\n(2124,'ThousandNeedlesC46',1,400,400,23,35,0,-5623.73,-2943.53,-50.4623,1.05563,'2121:0 2125:0 2126:0 '),\n(2125,'ThousandNeedlesC47',1,400,400,23,35,0,-5602.92,-3056.82,-51.9701,1.71732,'2122:0 2124:0 2126:0 2130:0 '),\n(2126,'ThousandNeedlesC48',1,400,400,23,35,0,-5718.6,-3126.82,-37.7719,1.04973,'2124:0 2125:0 2131:0 '),\n(2127,'ThousandNeedlesC49',1,400,400,23,35,0,-5328.41,-3207.34,-47.4244,5.04348,'2123:0 2128:0 2129:0 '),\n(2128,'ThousandNeedlesC50',1,400,400,23,35,0,-5464.87,-3276.04,-34.1317,0.525478,'2127:0 2129:0 2130:0 '),\n(2129,'ThousandNeedlesC51',1,400,400,23,35,0,-5455.25,-3387.53,-41.6009,1.22056,'2127:0 2128:0 2132:0 '),\n(2130,'ThousandNeedlesC52',1,400,400,23,35,0,-5569.49,-3268.7,-44.3082,1.72125,'2125:0 2128:0 2131:0 2133:0 '),\n(2131,'ThousandNeedlesC53',1,400,400,23,35,0,-5740.95,-3216.87,-41.218,1.17932,'2126:0 2130:0 121:0 '),\n(2132,'ThousandNeedlesC54',1,400,439,23,35,0,-5553.99,-3514.19,-56.2254,0.918174,'2129:0 2133:0 2134:0 '),\n(2133,'ThousandNeedlesC55',1,400,439,23,35,0,-5650.38,-3490.29,-57.2333,1.16557,'121:0 2130:0 2132:0 122:0 2134:0 '),\n(2134,'ThousandNeedlesE1',1,400,2240,23,35,0,-5619.93,-3820.34,-58.7494,1.7723,'121:0 122:0 2132:0 2133:0 2135:0 2136:0 '),\n(2135,'ThousandNeedlesE2',1,400,439,23,35,0,-5645.47,-4214.99,-58.7498,1.71339,'2134:0 2136:0 '),\n(2136,'ThousandNeedlesE3',1,400,2240,23,35,0,-5936.34,-4266.6,-58.7493,0.65899,'122:0 2134:0 2135:0 117:0 2137:0 '),\n(2137,'ThousandNeedlesE4',1,400,2240,23,35,0,-6405.27,-4240.86,-58.749,0.861231,'117:0 123:0 2136:0 '),\n(2138,'ThousandNeedlesE5',1,400,439,23,35,0,-6173.94,-3567.25,-58.7497,5.13183,'117:0 118:0 121:0 122:0 123:0 '),\n(2139,'ThousandNeedlesE6',1,400,439,23,35,0,-6638.63,-3654.02,-58.7493,0.631484,'118:0 2141:0 '),\n(2140,'ThousandNeedlesE7',1,400,439,23,35,0,-6660.6,-3797.14,-58.5293,2.97002,'123:0 2141:0 '),\n(2141,'ThousandNeedlesE8',1,400,439,23,35,0,-6820.59,-3759.56,21.2097,1.72713,'2139:0 2140:0 2142:0 '),\n(2142,'TanarisExitN1',1,440,440,38,50,0,-6890.93,-3772.75,52.9557,0.201496,'2141:0 2143:0 '),\n(2143,'TanarisExitN2',1,440,440,38,50,0,-6952.74,-3716.92,43.1345,3.42359,'2142:0 2144:0 2145:0 '),\n(2144,'GadgetzanH1',1,440,976,38,50,5,-7047.86,-3764.87,11.4018,3.75207,'2143:0 52:0 2147:0 2148:0 2149:0 2166:0 '),\n(2145,'GadgetzanA1',1,440,976,38,50,2,-7182.58,-3638.57,11.2417,5.95314,'2143:0 2146:0 2165:0 2166:0 '),\n(2146,'GadgetzanA2',1,440,976,38,50,3,-7232.4,-3740.53,8.47838,5.52708,'2145:0 52:0 2147:0 2148:0 2165:0 2166:0 '),\n(2147,'GadgetzanS',1,440,976,38,50,1,-7160.74,-3844,8.72832,1.31539,'52:0 2144:0 2146:0 '),\n(2148,'Tanaris1',1,440,440,38,50,0,-7236.3,-4040.94,11.0963,1.40179,'2144:0 2146:0 2149:0 2150:0 2158:0 2161:0 2165:0 '),\n(2149,'Tanaris2',1,440,1937,38,50,0,-7012.17,-4180.07,10.8027,2.40318,'2144:0 2148:0 2150:0 2151:0 2152:0 '),\n(2150,'Tanaris3',1,440,440,38,50,0,-7183.44,-4321.24,9.48149,1.28398,'2148:0 2149:0 2151:0 2152:0 2157:0 2158:0 '),\n(2151,'Tanaris4',1,440,1937,38,50,0,-6915.38,-4366.17,11.3936,2.18522,'2149:0 2150:0 2152:0 '),\n(2152,'Tanaris5',1,440,440,38,50,0,-7083.47,-4512.85,8.48356,1.53726,'2149:0 2150:0 2151:0 2153:0 2157:0 2158:0 '),\n(2153,'Tanaris6',1,440,977,38,50,0,-6965.03,-4691.43,8.43736,2.08705,'2152:0 2154:0 2155:0 2156:0 2157:0 '),\n(2154,'Tanaris7',1,440,977,38,50,0,-6745.21,-4852.73,0.167925,2.76838,'2153:0 2155:0 '),\n(2155,'Tanaris8',1,440,977,38,50,0,-6936.98,-4872.05,0.71439,1.89659,'2153:0 2154:0 2156:0 '),\n(2156,'Tanaris9',1,440,988,38,50,0,-7135.69,-4833.99,0.699453,1.36644,'2153:0 2155:0 2157:0 '),\n(2157,'Tanaris10',1,440,985,38,50,0,-7326.32,-4666.64,8.78219,0.194235,'2150:0 2152:0 2153:0 2156:0 2158:0 113:0 '),\n(2158,'Tanaris11',1,440,985,38,50,0,-7455.84,-4410.59,11.5646,0.58301,'2148:0 2150:0 2152:0 2157:0 113:0 2160:0 2161:0 '),\n(2159,'Tanaris12',1,440,988,40,50,0,-7777.85,-4943.31,6.30343,4.78293,'113:0 2160:0 2210:0 '),\n(2160,'Tanaris13',1,440,985,38,50,0,-7765.82,-4633.67,11.3435,5.2954,'113:0 2158:0 2159:0 2161:0 2162:0 '),\n(2161,'Tanaris14',1,440,1938,38,50,0,-7816.44,-4067.72,9.39531,5.57225,'2148:0 2158:0 2160:0 2162:0 2163:0 2164:0 2165:0 '),\n(2162,'Tanaris15',1,440,440,40,50,0,-8124.61,-4381.44,10.6814,6.10827,'2160:0 2161:0 2163:0 2206:0 '),\n(2163,'Tanaris16',1,440,440,40,50,0,-8211.49,-4018.52,10.2243,5.89032,'2161:0 2162:0 2164:0 2205:0 2209:0 '),\n(2164,'Tanaris17',1,440,1938,38,50,0,-7957.98,-3774.76,42.6206,4.73579,'2161:0 2163:0 2165:0 2173:0 '),\n(2165,'Tanaris18',1,440,440,38,50,0,-7532.17,-3671.41,9.08631,5.75681,'2145:0 2146:0 2148:0 2161:0 2164:0 2166:0 2172:0 2173:0 '),\n(2166,'Tanaris19',1,440,440,38,50,0,-7149.95,-3429.64,10.9479,4.73187,'2144:0 2145:0 2146:0 2165:0 2167:0 2170:0 2172:0 '),\n(2167,'Tanaris20',1,440,979,38,50,0,-6944.47,-3147.06,30.6034,1.0405,'2166:0 2168:0 2169:0 2170:0 '),\n(2168,'Tanaris21',1,440,978,38,50,0,-6847.43,-2908.93,8.88901,4.55712,'2167:0 2169:0 2170:0 '),\n(2169,'Tanaris22',1,440,979,38,50,0,-6994.4,-2790.52,8.87793,5.49763,'2167:0 2168:0 2170:0 2171:0 '),\n(2170,'Tanaris23',1,440,979,38,50,0,-7181.29,-3008.99,31.1598,2.12434,'2166:0 2167:0 2168:0 2169:0 2171:0 2172:0 '),\n(2171,'Tanaris24',1,440,982,40,50,0,-7405.37,-2656.15,12.3269,5.64056,'2169:0 2170:0 2172:0 2174:0 2175:0 '),\n(2172,'Tanaris25',1,440,979,38,50,0,-7432.96,-3165.88,11.6881,0.195781,'2165:0 2166:0 2170:0 2171:0 2173:0 2174:0 '),\n(2173,'Tanaris26',1,440,1939,38,50,0,-7856.78,-3289.98,68.7512,5.401,'2164:0 2165:0 2172:0 2174:0 2184:0 2187:0 '),\n(2174,'Tanaris27',1,440,982,40,50,0,-7689.14,-2835.54,14.0257,3.79487,'2171:0 2172:0 2173:0 2175:0 2179:0 2182:0 2184:0 '),\n(2175,'Tanaris28',1,440,982,44,55,0,-7757.78,-2516.52,8.85209,5.79567,'2171:0 2174:0 2176:0 2177:0 2178:0 2179:0 2183:0 '),\n(2176,'Tanaris29',1,440,982,38,50,0,-7885.89,-2645.63,-56.7571,1.76264,'2175:0 '),\n(2177,'Tanaris30',1,440,982,38,50,0,-7691.97,-2600,-56.5855,2.87594,'2175:0 '),\n(2178,'Tanaris31',1,440,982,38,50,0,-7867.56,-2503.34,-45.915,6.01951,'2175:0 '),\n(2179,'Tanaris32',1,440,982,44,55,0,-8024.98,-2496.1,4.7767,5.76032,'2174:0 2175:0 2180:0 2181:0 2182:0 '),\n(2180,'Tanaris33',1,440,982,38,50,0,-7961.12,-2608.77,-51.3402,2.94075,'2181:0 2179:0 '),\n(2181,'Tanaris34',1,440,982,38,50,0,-7948.03,-2388.48,-27.27,2.48522,'2180:0 2179:0 '),\n(2182,'Tanaris35',1,440,982,44,55,0,-8192.63,-2678.87,9.10516,6.208,'2174:0 2179:0 2183:0 2185:0 '),\n(2183,'Tanaris36',1,440,982,40,50,0,-8237.94,-2283.21,9.47101,5.21841,'2175:0 2182:0 2188:0 2189:0 2190:0 '),\n(2184,'Tanaris37',1,440,1939,40,50,0,-8080.23,-2940.32,41.1249,5.97434,'2173:0 2174:0 2185:0 2186:0 2187:0 '),\n(2185,'Tanaris38',1,440,983,40,50,0,-8463.57,-2772.2,16.342,6.04503,'2182:0 2184:0 2186:0 2187:0 2190:0 '),\n(2186,'Tanaris39',1,440,983,40,50,0,-8572.13,-2989.04,10.5515,0.775002,'2184:0 2185:0 2187:0 2190:0 2194:0 2196:0 '),\n(2187,'Tanaris40',1,440,983,40,50,0,-8349.72,-3161.78,10.5974,1.38762,'2173:0 2184:0 2185:0 2186:0 '),\n(2188,'Tanaris41',1,440,440,44,55,0,-8568.73,-2090.66,8.81721,5.96256,'2183:0 2189:0 2220:0 '),\n(2189,'Tanaris42',1,440,980,44,55,0,-8728.04,-2264.78,8.87691,0.109387,'2183:0 2188:0 2190:0 2191:0 2192:0 '),\n(2190,'Tanaris43',1,440,440,40,50,0,-8780.75,-2536.53,12.5632,1.2757,'2183:0 2185:0 2186:0 2189:0 2192:0 2194:0 '),\n(2191,'Tanaris44',1,440,980,44,55,0,-9113.86,-2138.28,14.5526,5.80156,'2189:0 2192:0 '),\n(2192,'Tanaris45',1,440,440,44,55,0,-9078.5,-2368.44,15.1243,6.03129,'2189:0 2190:0 2191:0 2193:0 2194:0 '),\n(2193,'Tanaris46',1,440,440,40,50,0,-9394.76,-2441.52,12.341,0.162396,'2192:0 114:0 2194:0 '),\n(2194,'Tanaris47',1,440,992,40,50,0,-9166,-2942.59,27.3153,4.4055,'114:0 2186:0 2190:0 2192:0 2193:0 2195:0 2196:0 '),\n(2195,'Tanaris48',1,440,992,40,50,0,-9259.98,-3213.55,17.6595,1.63894,'114:0 2194:0 2196:0 2197:0 2198:0 '),\n(2196,'Tanaris49',1,440,984,40,50,0,-8891.65,-3316.57,17.9459,2.09054,'2186:0 2194:0 2195:0 2197:0 2198:0 '),\n(2197,'Tanaris50',1,440,981,44,55,0,-8891.37,-3634.86,9.8928,2.97216,'2195:0 2196:0 2198:0 2199:0 2204:0 2205:0 '),\n(2198,'Tanaris51',1,440,440,40,50,0,-9376.51,-3525.65,10.4557,1.04009,'2195:0 2196:0 2197:0 2199:0 '),\n(2199,'Tanaris52',1,440,981,44,55,0,-9238.88,-3842.23,16.1398,6.21782,'2197:0 2198:0 2200:0 2201:0 2204:0 '),\n(2200,'Tanaris53',1,440,981,44,55,0,-9122.46,-4119.91,14.5657,1.92562,'2199:0 2202:0 2203:0 2204:0 '),\n(2201,'Tanaris54',1,440,981,38,50,0,-9448.09,-4056.48,-45.7265,1.70179,'2199:0 '),\n(2202,'Tanaris55',1,440,981,38,50,0,-9058.94,-4138.03,-30.5429,1.76658,'2200:0 '),\n(2203,'Tanaris56',1,440,981,38,50,0,-9239.16,-3990.68,-38.2526,5.54632,'2200:0 '),\n(2204,'Tanaris57',1,440,981,44,55,0,-8846.97,-4120.67,11.0961,2.09647,'2197:0 2199:0 2200:0 2205:0 2209:0 '),\n(2205,'Tanaris58',1,440,440,40,50,0,-8582.56,-3848.15,27.4666,3.85733,'2163:0 2197:0 2204:0 2209:0 '),\n(2206,'Tanaris59',1,440,440,40,50,0,-8436.38,-4485.59,9.98615,0.059917,'2162:0 2207:0 2209:0 '),\n(2207,'Tanaris60',1,440,1940,44,50,0,-8543.26,-4792.62,0.74885,2.08624,'2206:0 2208:0 2371:0 '),\n(2208,'Tanaris61',1,440,1940,44,50,0,-8731.47,-4651.05,6.22094,6.04857,'2207:0 2209:0 '),\n(2209,'Tanaris62',1,440,981,40,50,0,-8636.73,-4274.81,14.2733,1.53645,'2163:0 2204:0 2205:0 2206:0 2208:0 '),\n(2210,'Tanaris63',1,440,1336,40,50,0,-7834.45,-5044.24,4.58704,0.700017,'2159:0 2211:0 '),\n(2211,'Tanaris64',1,440,1336,40,50,0,-7869.58,-5185.77,0.738081,3.22506,'2210:0 2212:0 2213:0 2215:0 '),\n(2212,'Tanaris65',1,440,1336,40,50,0,-8043.72,-5139.25,11.1577,5.95236,'2211:0 '),\n(2213,'Tanaris66',1,440,1336,40,50,0,-7985.53,-5405.09,1.12058,1.11823,'2211:0 2214:0 2215:0 2216:0 '),\n(2214,'Tanaris67',1,440,1336,40,50,0,-7957.94,-5481.79,0.207866,2.5025,'2213:0 '),\n(2215,'Tanaris68',1,440,1336,40,50,0,-7979.86,-5272.84,0.574685,0.762833,'2211:0 2213:0 2216:0 2217:0 2218:0 2219:0 '),\n(2216,'Tanaris69',1,440,1336,40,50,0,-8057.83,-5349.53,19.8843,5.57338,'2213:0 2215:0 '),\n(2217,'Tanaris70',1,440,1336,40,50,0,-8101.51,-5296.31,2.11654,0.146278,'2215:0 '),\n(2218,'Tanaris71',1,440,1336,40,50,0,-8088.86,-5238.43,1.94444,6.18206,'2215:0 '),\n(2219,'Tanaris72',1,440,1336,40,50,0,-8005.83,-5204.31,4.73672,1.59535,'2215:0 '),\n(2220,'TanarisExitSW',1,440,440,44,55,0,-8243.03,-2079.74,-95.586,0.052021,'2188:0 2221:0 '),\n(2221,'Ungoro1',1,490,490,44,56,0,-8066.01,-2098.76,-168.295,6.18792,'2220:0 2222:0 '),\n(2222,'Ungoro2',1,490,490,44,56,0,-7916.41,-2142.07,-238.077,0.49967,'2221:0 2223:0 '),\n(2223,'Ungoro3',1,490,490,44,56,0,-7864.72,-2099.17,-266.094,3.40762,'2222:0 2224:0 2260:0 '),\n(2224,'Ungoro4',1,490,1942,44,56,0,-7934.33,-2040.71,-267.978,5.68527,'2223:0 2225:0 '),\n(2225,'Ungoro5',1,490,1942,44,56,0,-7884.5,-1843.96,-274.777,4.70158,'2224:0 2226:0 2260:0 2261:0 '),\n(2226,'Ungoro6',1,490,540,46,56,0,-8088.18,-1491.28,-269.655,5.9268,'2225:0 2227:0 2228:0 2261:0 '),\n(2227,'Ungoro7',1,490,490,46,56,0,-8249.65,-1584.9,-198.819,0.538974,'2226:0 2229:0 '),\n(2228,'Ungoro8',1,490,540,46,56,0,-8064.8,-1172.37,-270.687,4.96077,'2226:0 2229:0 2232:0 '),\n(2229,'Ungoro9',1,490,540,46,56,0,-7866.69,-1345.21,-274.102,2.63992,'2227:0 2228:0 2230:0 2231:0 2232:0 2261:0 2262:0 2265:0 '),\n(2230,'Ungoro10',1,490,490,46,56,0,-7978.25,-1085.08,-328.506,4.68783,'2229:0 '),\n(2231,'Ungoro11',1,490,540,46,56,0,-8110.2,-1212.13,-336.702,6.17813,'2229:0 '),\n(2232,'Ungoro12',1,490,539,48,56,0,-7862.94,-1011.26,-266.988,4.49344,'2228:0 2229:0 2233:0 2234:0 2262:0 '),\n(2233,'Ungoro13',1,490,539,48,56,0,-7893.05,-604.125,-260.044,4.74085,'2232:0 2234:0 2235:0 '),\n(2234,'Ungoro14',1,490,539,48,56,0,-7779.84,-752.864,-268.32,4.3658,'2232:0 2233:0 2235:0 2262:0 2263:0 '),\n(2235,'Ungoro15',1,490,543,48,56,0,-7516.02,-568.085,-272.224,3.45867,'2233:0 2234:0 2236:0 2240:0 2263:0 '),\n(2236,'Ungoro16',1,490,543,48,56,0,-7357.96,-423.47,-270.864,3.80227,'2235:0 2237:0 2238:0 '),\n(2237,'Ungoro17',1,490,543,48,56,0,-7453.5,-224.428,-202.131,5.11585,'2236:0 '),\n(2238,'Ungoro18',1,490,543,48,56,0,-7065.02,-412.024,-271.337,3.13271,'2236:0 2239:0 2240:0 '),\n(2239,'Ungoro19',1,490,490,48,56,0,-6942.78,-227.898,-200.477,4.11643,'2238:0 '),\n(2240,'Ungoro20',1,490,543,48,56,0,-7057.61,-568.049,-272.117,3.13074,'2235:0 2238:0 2241:0 2273:0 2275:0 '),\n(2241,'Ungoro21',1,490,490,46,56,0,-6819.88,-500.077,-273.734,4.04377,'2240:0 2242:0 2273:0 '),\n(2242,'Ungoro22',1,490,490,46,56,0,-6621.16,-628.631,-271.06,2.65557,'2241:0 2243:0 2273:0 2289:0 '),\n(2243,'Ungoro23',1,490,490,46,56,0,-6516.77,-714.125,-272.04,4.8802,'2242:0 2244:0 2271:0 '),\n(2244,'Ungoro24',1,490,538,46,56,0,-6357.05,-1044.55,-271.024,2.01939,'2243:0 2245:0 2247:0 '),\n(2245,'Ungoro25',1,490,541,46,56,0,-6247.33,-1096.9,-216.374,2.3198,'111:0 2244:0 2246:0 '),\n(2246,'Ungoro26',1,490,541,46,56,0,-6263.44,-1146.22,-245.676,0.70581,'111:0 2245:0 2247:0 '),\n(2247,'Ungoro27',1,490,538,46,56,0,-6307.92,-1177.22,-269.521,1.78377,'2244:0 2246:0 2248:0 '),\n(2248,'Ungoro28',1,490,538,46,56,0,-6416.8,-1325.76,-272.118,0.908046,'2247:0 2249:0 2270:0 2271:0 '),\n(2249,'Ungoro29',1,490,538,46,56,0,-6394.87,-1511.09,-269.907,1.76217,'2248:0 112:0 2251:0 2269:0 2270:0 2271:0 '),\n(2250,'Ungoro30',1,490,542,46,56,0,-6359.08,-1992.29,-276.383,1.21435,'112:0 '),\n(2251,'Ungoro31',1,490,538,46,56,0,-6575.48,-1808.43,-271.11,0.413242,'112:0 2249:0 2252:0 2253:0 2269:0 2270:0 '),\n(2252,'Ungoro32',1,490,490,46,56,0,-6527.29,-2027.48,-271.963,1.5501,'2251:0 2253:0 '),\n(2253,'Ungoro33',1,490,490,46,56,0,-6834.73,-2083.14,-267.953,0.248293,'2251:0 2252:0 2254:0 2267:0 2269:0 '),\n(2254,'Ungoro34',1,490,1942,46,56,0,-7068.84,-2256.36,-271.191,0.560497,'2253:0 2255:0 2256:0 2267:0 '),\n(2255,'Ungoro35',1,490,1943,46,56,0,-6944.44,-2436.79,-201.566,2.1097,'2254:0 '),\n(2256,'Ungoro36',1,490,1942,46,56,0,-7266.48,-2293,-268.44,0.00677204,'2254:0 2257:0 '),\n(2257,'Ungoro37',1,490,1942,44,56,0,-7476.48,-2263.22,-266.534,5.76177,'2256:0 2258:0 2259:0 '),\n(2258,'Ungoro38',1,490,1942,46,56,0,-7419.79,-2422.73,-214.477,1.54419,'2257:0 '),\n(2259,'Ungoro39',1,490,1942,44,56,0,-7613.45,-2129.98,-272.086,5.58506,'2257:0 2260:0 2266:0 '),\n(2260,'Ungoro40',1,490,1942,44,56,0,-7787.58,-1962.82,-272.166,5.62628,'2223:0 2225:0 2259:0 2261:0 2266:0 '),\n(2261,'Ungoro41',1,490,1942,46,56,0,-7685.24,-1654.69,-272.216,4.29698,'2225:0 2226:0 2229:0 2260:0 2265:0 2266:0 '),\n(2262,'Ungoro42',1,490,490,48,56,0,-7724.44,-1062.81,-269.408,1.8701,'2229:0 2232:0 2234:0 2263:0 2264:0 '),\n(2263,'Ungoro43',1,490,539,48,56,0,-7524.61,-811.974,-269.097,2.63781,'2234:0 2235:0 2262:0 2264:0 2276:0 '),\n(2264,'Ungoro44',1,490,490,46,56,0,-7536.49,-1136.09,-271.668,2.21958,'2262:0 2263:0 2265:0 2276:0 '),\n(2265,'Ungoro45',1,490,490,46,56,0,-7540.94,-1440.28,-272.37,1.75227,'2229:0 2261:0 2264:0 2268:0 '),\n(2266,'Ungoro46',1,490,1942,44,56,0,-7481.25,-1864.35,-272.185,3.61563,'2259:0 2260:0 2261:0 2267:0 '),\n(2267,'Ungoro47',1,490,1942,46,56,0,-7196.2,-1804.18,-272.191,4.61501,'2253:0 2254:0 2266:0 2268:0 '),\n(2268,'Ungoro48',1,490,537,46,56,0,-7052.38,-1597.57,-270.962,3.20599,'2265:0 2267:0 2269:0 2270:0 2272:0 2279:0 2280:0 '),\n(2269,'Ungoro49',1,490,538,46,56,0,-6864.28,-1691.91,-271.236,0.290198,'2249:0 2251:0 2253:0 2268:0 2270:0 '),\n(2270,'Ungoro50',1,490,538,46,56,0,-6742.71,-1481.45,-270.728,0.152749,'2248:0 2249:0 2251:0 2268:0 2269:0 2271:0 2272:0 '),\n(2271,'Ungoro51',1,490,538,46,56,0,-6687.22,-1202.84,-270.132,5.43062,'2243:0 2248:0 2249:0 2270:0 2272:0 2274:0 2275:0 '),\n(2272,'Ungoro52',1,490,537,48,56,0,-6971.9,-1359.19,-272.023,5.74869,'2268:0 2270:0 2271:0 2280:0 '),\n(2273,'Ungoro53',1,490,490,46,56,0,-6905.86,-744.591,-271.912,1.82168,'2240:0 2241:0 2242:0 2274:0 2275:0 '),\n(2274,'Ungoro54',1,490,490,46,56,0,-6713.26,-889.582,-269.981,2.47553,'2271:0 2273:0 2275:0 '),\n(2275,'Ungoro55',1,490,490,46,56,0,-7071.75,-971.188,-268.921,1.5625,'2240:0 2271:0 2273:0 2274:0 2276:0 '),\n(2276,'Ungoro56',1,490,537,48,56,0,-7262.04,-1142.55,-256.214,3.05082,'2263:0 2264:0 2275:0 2277:0 '),\n(2277,'Ungoro57',1,490,537,48,56,0,-7276.34,-1237.12,-242.301,0.11537,'2276:0 2278:0 2286:0 '),\n(2278,'Ungoro58',1,490,537,48,56,0,-7196.58,-1221.48,-206.377,2.70522,'2277:0 '),\n(2279,'Ungoro59',1,490,537,48,56,0,-7139.11,-1460.35,-240.441,5.44625,'2268:0 '),\n(2280,'Ungoro60',1,490,537,48,56,0,-6995.92,-1426.86,-263.362,1.61744,'2268:0 2272:0 2281:0 '),\n(2281,'Ungoro61',1,490,537,48,56,0,-7087.82,-1424.62,-235.604,0.254778,'2280:0 2282:0 '),\n(2282,'Ungoro62',1,490,537,48,56,0,-7094.67,-1371.27,-215.077,4.51555,'2281:0 2283:0 '),\n(2283,'Ungoro63',1,490,537,48,56,0,-7151.31,-1318.52,-184.389,0.761355,'2282:0 2284:0 2285:0 '),\n(2284,'Ungoro64',1,490,537,48,56,0,-7093.52,-1298.11,-185.557,3.52203,'2283:0 '),\n(2285,'Ungoro65',1,490,537,48,56,0,-7193.59,-1360.95,-184.286,6.25914,'2283:0 '),\n(2286,'Ungoro66',1,490,537,48,56,0,-7288.45,-1306.18,-240.621,1.48982,'2277:0 2287:0 '),\n(2287,'Ungoro67',1,490,537,48,56,0,-7220.03,-1431,-231.915,2.60313,'2286:0 2288:0 '),\n(2288,'Ungoro68',1,490,537,48,56,0,-7328.61,-1466.63,-241.155,0.211588,'2287:0 '),\n(2289,'Ungoro69',1,490,490,50,56,0,-6487.3,-527.418,-240.618,3.68697,'2242:0 2290:0 '),\n(2290,'Ungoro70',1,490,490,50,56,0,-6221.83,-588.48,-118.307,2.76414,'2289:0 2291:0 '),\n(2291,'Ungoro71',1,490,490,50,56,0,-6222.04,-471.141,-64.8223,4.41936,'2290:0 2292:0 '),\n(2292,'Silithus1',1,1377,1377,50,60,0,-6290.28,-372.309,-0.180207,5.29035,'2291:0 184:0 '),\n(2293,'Silithus2',1,1377,1377,50,60,0,-6723.42,16.99,1.33043,2.60703,'184:0 2294:0 2295:0 2296:0 '),\n(2294,'Silithus3',1,1377,2738,50,60,0,-7058.45,311.497,7.73577,5.31076,'2293:0 2295:0 2304:0 2350:0 2351:0 2352:0 2353:0 '),\n(2295,'Silithus4',1,1377,1377,50,60,0,-6775.62,325.939,7.96733,4.88272,'191:0 2293:0 2294:0 2296:0 2304:0 2350:0 '),\n(2296,'Silithus5',1,1377,1377,53,60,0,-6480.77,427.825,2.85797,3.86957,'191:0 2293:0 2295:0 2299:0 2304:0 2311:0 '),\n(2297,'Silithus6',1,1377,3446,53,60,0,-6249.14,4.14336,6.27956,4.62356,'191:0 2298:0 '),\n(2298,'Silithus7',1,1377,3446,53,60,0,-6303.03,23.7784,-8.51367,4.98288,'2297:0 '),\n(2299,'Silithus8',1,1377,1377,53,60,0,-6325.77,679.48,7.83164,4.56898,'191:0 2296:0 2300:0 2304:0 2311:0 '),\n(2300,'Silithus9',1,1377,2742,53,60,0,-6512.68,1140.49,5.52295,5.13838,'2299:0 2301:0 2311:0 2317:0 2322:0 2323:0 '),\n(2301,'Silithus10',1,1377,2742,53,60,0,-6376.67,1003.32,-29.6361,5.81971,'2300:0 2302:0 2303:0 '),\n(2302,'Silithus11',1,1377,2742,53,60,0,-6233.34,982.199,-44.8168,2.95104,'2301:0 2303:0 '),\n(2303,'Silithus12',1,1377,2742,53,60,0,-6264.39,1180.37,-17.4845,2.70757,'2301:0 2302:0 '),\n(2304,'Silithus13',1,1377,3425,50,60,0,-6806.63,645.151,14.4502,4.36084,'2294:0 2295:0 2296:0 2299:0 2305:0 2350:0 2351:0 '),\n(2305,'Silithus14',1,1377,3425,53,60,0,-6809.1,722.467,39.8123,2.17349,'2304:0 2306:0 188:0 '),\n(2306,'Silithus15',1,1377,3425,53,60,0,-6835.28,767.676,43.3803,5.14818,'2305:0 188:0 2307:0 2308:0 2309:0 2310:0 '),\n(2307,'Silithus16',1,1377,3425,53,60,5,-6754.01,823.51,57.2677,3.58719,'2306:0 '),\n(2308,'Silithus17',1,1377,3425,53,60,1,-6739.83,766.866,128.438,3.03271,'2306:0 '),\n(2309,'Silithus18',1,1377,3425,53,60,0,-6767.97,869.849,23.6798,5.43995,'2306:0 2310:0 2311:0 '),\n(2310,'Silithus19',1,1377,3425,53,60,0,-6882.21,862.037,35.6652,6.05845,'2306:0 2309:0 2323:0 '),\n(2311,'Silithus20',1,1377,2742,53,60,0,-6689.89,843.881,1.63418,4.68008,'2296:0 2299:0 2300:0 2309:0 2312:0 2313:0 '),\n(2312,'Silithus21',1,1377,2742,53,60,0,-6610.39,1133.65,-47.8484,4.53085,'2311:0 '),\n(2313,'Silithus22',1,1377,2742,53,60,0,-6560.42,848.396,-19.7968,5.5872,'2311:0 2314:0 2315:0 2316:0 '),\n(2314,'Silithus23',1,1377,2742,53,60,0,-6485.94,926.037,-42.1164,4.07923,'2313:0 '),\n(2315,'Silithus24',1,1377,2742,53,60,0,-6592.71,755.859,-52.6973,0.303426,'2313:0 '),\n(2316,'Silithus25',1,1377,2742,53,60,0,-6626.24,951.29,-53.3026,5.44387,'2313:0 '),\n(2317,'Silithus26',1,1377,2742,53,60,0,-6416.82,1332.7,1.61694,4.0223,'2300:0 2318:0 2322:0 '),\n(2318,'Silithus27',1,1377,2740,53,60,0,-6260.69,1633.49,6.1983,4.14011,'2317:0 2319:0 133:0 '),\n(2319,'Silithus28',1,1377,1377,53,60,0,-6412.61,1879.6,4.97151,5.48313,'2318:0 133:0 2320:0 134:0 '),\n(2320,'Silithus29',1,1377,1377,53,60,0,-6709.78,1906.69,5.58306,6.01956,'2319:0 2321:0 134:0 '),\n(2321,'Silithus30',1,1377,2743,53,60,0,-6952.45,1684.29,2.49135,0.649405,'2320:0 134:0 2322:0 2325:0 '),\n(2322,'Silithus31',1,1377,1377,53,60,0,-6798.69,1359.48,2.84112,2.99187,'134:0 189:0 2300:0 2317:0 2321:0 2325:0 '),\n(2323,'Silithus32',1,1377,1377,53,60,0,-6935.53,933.15,20.0826,5.50711,'177:0 189:0 2300:0 2310:0 2324:0 2351:0 '),\n(2324,'Silithus33',1,1377,1377,53,60,0,-7170.32,969.526,1.6856,0.846154,'177:0 189:0 2323:0 2335:0 2343:0 '),\n(2325,'Silithus34',1,1377,2743,55,60,0,-7102.06,1490.93,6.9342,0.374927,'189:0 2321:0 2322:0 2326:0 '),\n(2326,'Silithus35',1,1377,2743,55,60,0,-7227.39,1476.62,-3.4765,1.83774,'2325:0 2327:0 2335:0 2336:0 '),\n(2327,'Silithus36',1,1377,2743,55,60,0,-7304.89,1624.78,-30.4609,5.43684,'2326:0 2328:0 2329:0 2330:0 '),\n(2328,'Silithus37',1,1377,2743,55,60,0,-7466.84,1605.7,-50.256,4.1959,'2327:0 2331:0 '),\n(2329,'Silithus38',1,1377,2743,55,60,0,-7434.92,1813.75,-46.5685,5.83934,'2327:0 2332:0 '),\n(2330,'Silithus39',1,1377,2743,55,60,0,-7246.4,1714.88,-63.0024,4.43346,'2327:0 2333:0 2334:0 '),\n(2331,'Silithus40',1,1377,1377,53,60,0,-7396.76,1242.93,-84.3036,3.00401,'2328:0 '),\n(2332,'Silithus41',1,1377,2743,53,60,0,-7611.96,1707.51,-36.9118,0.00770472,'2329:0 '),\n(2333,'Silithus42',1,1377,2743,53,60,0,-7390.74,1717.46,-92.9352,5.54673,'2330:0 '),\n(2334,'Silithus43',1,1377,2743,53,60,0,-7320.18,1835.39,-90.5829,0.977671,'2330:0 '),\n(2335,'Silithus44',1,1377,1377,53,60,0,-7395.86,1200.83,3.1343,6.21237,'177:0 189:0 2324:0 2326:0 2336:0 2341:0 2342:0 2343:0 '),\n(2336,'Silithus45',1,1377,2743,53,60,0,-7467.85,1375.97,4.32407,0.317961,'2326:0 2335:0 135:0 2337:0 2341:0 2342:0 '),\n(2337,'Silithus46',1,1377,1377,53,60,0,-7741.83,1415.69,0.628408,1.87894,'135:0 2336:0 2338:0 2339:0 2340:0 '),\n(2338,'Silithus47',1,1377,1377,53,60,0,-7929.26,1491.4,-6.62955,0.141247,'135:0 2337:0 2339:0 '),\n(2339,'Silithus48',1,1377,1377,53,60,0,-7951.61,1381.21,2.92482,0.094128,'193:0 2337:0 2338:0 2340:0 '),\n(2340,'Silithus49',1,1377,1377,53,60,0,-7884.95,1305.55,-9.32275,1.92018,'193:0 2337:0 2339:0 2341:0 '),\n(2341,'Silithus50',1,1377,1377,53,60,0,-7724.06,1121.13,1.90701,2.14991,'193:0 2335:0 2336:0 2340:0 2342:0 2347:0 '),\n(2342,'Silithus51',1,1377,1377,53,60,0,-7614.56,1040.35,4.34335,2.37375,'2335:0 2336:0 2341:0 2343:0 2347:0 2348:0 '),\n(2343,'Silithus52',1,1377,1377,53,60,0,-7446.46,1011.04,1.56245,2.60898,'177:0 2324:0 2335:0 2342:0 2348:0 '),\n(2344,'Silithus53',1,1377,3427,53,60,0,-8071.74,1080.25,7.69378,0.464863,'193:0 2345:0 '),\n(2345,'Silithus54',1,1377,1377,55,60,0,-8049.18,988.938,42.0219,2.43622,'2344:0 '),\n(2346,'Silithus55',1,1377,2744,55,60,0,-8023.11,662.371,-12.5444,1.51572,'193:0 2359:0 '),\n(2347,'Silithus56',1,1377,2744,53,60,0,-7855.36,863.831,-4.99768,1.56248,'193:0 2341:0 2342:0 2348:0 '),\n(2348,'Silithus57',1,1377,1377,53,60,0,-7512.58,878.283,-2.19269,1.08534,'177:0 2342:0 2343:0 2347:0 2349:0 2350:0 '),\n(2349,'Silithus58',1,1377,1377,53,60,0,-7412.18,577.662,-7.35207,4.30862,'177:0 2348:0 2355:0 2357:0 192:0 2359:0 '),\n(2350,'Silithus59',1,1377,1377,53,60,0,-7177.07,574.409,1.58818,2.04744,'177:0 2294:0 2295:0 2304:0 2348:0 2351:0 2352:0 2355:0 '),\n(2351,'Silithus60',1,1377,3097,53,60,0,-6922.48,666.906,11.4539,0.176223,'2294:0 2304:0 2323:0 2350:0 '),\n(2352,'Silithus61',1,1377,2738,50,60,0,-7078.09,417.604,8.20627,4.43703,'2294:0 2350:0 2353:0 '),\n(2353,'Silithus62',1,1377,2738,50,60,0,-7146.41,350.222,26.2951,0.0509645,'2294:0 2352:0 2354:0 2356:0 '),\n(2354,'Silithus63',1,1377,2738,50,60,0,-7259.78,328.568,47.9494,0.00187492,'2353:0 2356:0 2357:0 '),\n(2355,'Silithus64',1,1377,2738,50,60,0,-7283.42,473.511,11.4843,5.52991,'2349:0 2350:0 2356:0 2357:0 '),\n(2356,'Silithus65',1,1377,2738,50,60,0,-7183.12,437.593,64.3972,4.38322,'2353:0 2354:0 2355:0 '),\n(2357,'Silithus66',1,1377,2738,50,60,0,-7342.29,338.615,9.9245,1.29662,'2349:0 2354:0 2355:0 192:0 '),\n(2358,'Silithus67',1,1377,2744,53,60,0,-7815.08,208.412,5.58908,6.15627,'192:0 '),\n(2359,'Silithus68',1,1377,2744,55,60,0,-7734.1,629.157,-47.1739,6.08166,'2349:0 2360:0 2361:0 2346:0 '),\n(2360,'Silithus69',1,1377,2744,55,60,0,-7803.61,427.995,-36.2971,1.11402,'2359:0 2361:0 2362:0 '),\n(2361,'Silithus70',1,1377,2744,55,60,0,-7937.51,488.881,-34.8964,5.632,'2359:0 2360:0 2365:0 2366:0 '),\n(2362,'Silithus71',1,1377,2744,55,60,0,-7860.7,346.797,-48.3413,1.79141,'2360:0 2363:0 2364:0 '),\n(2363,'Silithus72',1,1377,2744,53,60,0,-7708.29,262.213,-42.7965,5.31941,'2362:0 '),\n(2364,'Silithus73',1,1377,2744,53,60,0,-7678.37,284.795,-37.2732,5.97131,'2362:0 '),\n(2365,'Silithus74',1,1377,1377,53,60,0,-8294.16,376.133,-94.7165,0.44759,'2361:0 '),\n(2366,'Silithus75',1,1377,2744,53,60,0,-8140.13,753.793,-85.1582,5.97285,'2361:0 2367:0 '),\n(2367,'Silithus76',1,1377,1377,53,60,0,-8313.26,729.325,-74.3037,4.85955,'2366:0 '),\n(2368,'AltarOfStorms2',0,46,255,48,56,1,-7605.65,-798.145,190.852,3.45765,'635:0 '),\n(2369,'Darrowshire',0,139,2262,53,60,1,1416.41,-3653.3,82.0183,4.38389,'230:0 '),\n(2370,'BLS4H',0,4,72,43,54,5,-11896.1,-3084.13,31.0889,0.713907,'855:0 '),\n(2371,'TanarisSpawnAll',1,440,1940,44,50,1,-8319.94,-5071.72,4.11589,2.25351,'2207:0 ');\n"
  },
  {
    "path": "SQL/updates/world/2023_04_11_00_creature_template_npcbot_wander_nodes.sql",
    "content": "--\nDELETE FROM `creature_template_npcbot_wander_nodes` WHERE `id` IN (2372,2373,2374,2375,2376,2377,2378,2379,2380,2381,2382,2383,2384,2385,2386,2387,2388,2389,2390,2391,2392,2393,2394,2395);\nINSERT INTO `creature_template_npcbot_wander_nodes`(`id`,`name`,`mapid`,`zoneid`,`areaid`,`minlevel`,`maxlevel`,`flags`,`x`,`y`,`z`,`o`,`links`) VALUES\n(2372,'WarsongGulchSpawnA1',489,3277,4571,10,80,59,1523.81,1481.76,351.992,3.14159,'2373:0 2375:0 2378:0 2377:0 '),\n(2373,'WarsongGulchAInside1',489,3277,3321,10,80,0,1488.03,1463.62,362.472,1.46358,'2372:0 2374:0 2379:0 '),\n(2374,'WarsongGulchAInside2',489,3277,4571,10,80,32,1530.85,1468.31,362.665,3.14825,'2372:0 2373:0 '),\n(2375,'WarsongGulchAInside3',489,3277,3321,10,80,0,1471.13,1454.77,342.795,6.27608,'2372:0 2376:0 2380:0 '),\n(2376,'WarsongGulchAInside4',489,3277,3321,10,80,32,1523.32,1468.01,373.688,4.44809,'2374:0 2375:0 '),\n(2377,'WarsongGulchAInside5',489,3277,3321,10,80,0,1439.11,1574.68,343.587,5.09406,'2381:0 2383:0 2372:0 '),\n(2378,'WarsongGulchAInside6',489,3277,3321,10,80,0,1416.56,1540.82,342.735,5.58886,'2381:0 2383:0 2372:0 '),\n(2379,'WarsongGulchAInside7',489,3277,3321,10,80,0,1360.6,1392.13,326.593,5.39054,'2381:0 2382:0 2373:0 '),\n(2380,'WarsongGulchAInside8',489,3277,3321,10,80,0,1356.9,1461.83,324.512,0.0216269,'2381:0 2382:0 2383:0 2375:0 '),\n(2381,'WarsongGulchMidC1',489,3277,3277,10,80,2,1231.42,1473.79,307.813,5.82692,'2391:0 2392:0 '),\n(2382,'WarsongGulchMidE1',489,3277,3277,10,80,2,1225.27,1411.04,310.329,0.0703331,'2391:0 2392:0 '),\n(2383,'WarsongGulchMidW1',489,3277,3277,10,80,2,1195.67,1530.47,306.785,6.16029,'2391:0 2392:0 '),\n(2384,'WarsongGulchSpawnH1',489,3277,4572,10,80,61,929.191,1434.63,345.536,0.0577507,'2385:0 2387:0 2390:0 2389:0 '),\n(2385,'WarsongGulchHInside1',489,3277,3320,10,80,0,965.729,1453.27,356.269,4.75445,'2384:0 2391:0 2386:0 '),\n(2386,'WarsongGulchHInside2',489,3277,4572,10,80,32,925.907,1451.62,355.856,5.79629,'2384:0 2385:0 '),\n(2387,'WarsongGulchHInside3',489,3277,3320,10,80,0,982.314,1463.02,335.964,1.72006,'2384:0 2392:0 2388:0 '),\n(2388,'WarsongGulchHInside4',489,3277,3320,10,80,32,931.381,1448.91,367.604,1.1742,'2386:0 2387:0 '),\n(2389,'WarsongGulchHInside5',489,3277,3320,10,80,0,1033.59,1363.21,342.852,2.24035,'2394:0 2395:0 2384:0 '),\n(2390,'WarsongGulchHInside6',489,3277,3320,10,80,0,1060.56,1390.51,338.618,2.82356,'2394:0 2395:0 2384:0 '),\n(2391,'WarsongGulchHInside7',489,3277,3320,10,80,0,1086.1,1540.21,316.792,2.79013,'2393:0 2394:0 2385:0 '),\n(2392,'WarsongGulchHInside8',489,3277,3320,10,80,0,1119.21,1462.5,316.34,3.25941,'2393:0 2394:0 2395:0 2387:0 '),\n(2393,'WarsongGulchMidW2',489,3277,3277,10,80,4,1255.33,1511.56,309.973,3.31243,'2379:0 2380:0 '),\n(2394,'WarsongGulchMidC2',489,3277,3277,10,80,4,1217.19,1480.7,306.432,3.41258,'2379:0 2380:0 '),\n(2395,'WarsongGulchMidE2',489,3277,3277,10,80,4,1263.56,1400.5,310.369,3.07681,'2379:0 2380:0 ');\n"
  },
  {
    "path": "SQL/updates/world/2023_04_16_00_creature_template_npcbot_wander_nodes.sql",
    "content": "--\nDELETE FROM `creature_template_npcbot_wander_nodes` WHERE `id` IN (2372,2373,2374,2375,2376,2377,2378,2379,2380,2381,2382,2383,2384,2385,2386,2387,2388,2389,2390,2391,2392,2393,2394,2395);\nINSERT INTO `creature_template_npcbot_wander_nodes`(`id`,`name`,`mapid`,`zoneid`,`areaid`,`minlevel`,`maxlevel`,`flags`,`x`,`y`,`z`,`o`,`links`) VALUES\n(2372,'WarsongGulchSpawnA1',489,3277,4571,10,80,251,1535.77,1481.37,352.109,0.188495,'2373:0 2375:0 2378:0 2377:0 '),\n(2373,'WarsongGulchAInside1',489,3277,3321,10,80,0,1488.03,1463.62,362.472,1.46358,'2372:0 2374:0 2379:0 '),\n(2374,'WarsongGulchAInside2',489,3277,4571,10,80,32,1530.85,1468.31,362.665,3.14825,'2372:0 2373:0 '),\n(2375,'WarsongGulchAInside3',489,3277,3321,10,80,0,1471.13,1454.77,342.795,6.27608,'2372:0 2376:0 2380:0 '),\n(2376,'WarsongGulchAInside4',489,3277,3321,10,80,32,1523.32,1468.01,373.688,4.44809,'2374:0 2375:0 '),\n(2377,'WarsongGulchAInside5',489,3277,3321,10,80,0,1439.11,1574.68,343.587,5.09406,'2381:0 2383:0 2372:0 '),\n(2378,'WarsongGulchAInside6',489,3277,3321,10,80,0,1416.56,1540.82,342.735,5.58886,'2381:0 2383:0 2372:0 '),\n(2379,'WarsongGulchAInside7',489,3277,3321,10,80,0,1360.6,1392.13,326.593,5.39054,'2381:0 2382:0 2373:0 '),\n(2380,'WarsongGulchAInside8',489,3277,3321,10,80,0,1356.9,1461.83,324.512,0.0216269,'2381:0 2382:0 2383:0 2375:0 '),\n(2381,'WarsongGulchMidC1',489,3277,3277,10,80,0,1231.42,1473.79,307.813,5.82692,'2391:0 2392:0 '),\n(2382,'WarsongGulchMidE1',489,3277,3277,10,80,0,1225.27,1411.04,310.329,0.0703331,'2391:0 2392:0 '),\n(2383,'WarsongGulchMidW1',489,3277,3277,10,80,0,1195.67,1530.47,306.785,6.16029,'2391:0 2392:0 '),\n(2384,'WarsongGulchSpawnH1',489,3277,4572,10,80,253,919.418,1434.62,345.695,3.13216,'2385:0 2387:0 2390:0 2389:0 '),\n(2385,'WarsongGulchHInside1',489,3277,3320,10,80,0,965.729,1453.27,356.269,4.75445,'2384:0 2391:0 2386:0 '),\n(2386,'WarsongGulchHInside2',489,3277,4572,10,80,32,925.907,1451.62,355.856,5.79629,'2384:0 2385:0 '),\n(2387,'WarsongGulchHInside3',489,3277,3320,10,80,0,982.314,1463.02,335.964,1.72006,'2384:0 2392:0 2388:0 '),\n(2388,'WarsongGulchHInside4',489,3277,3320,10,80,32,931.381,1448.91,367.604,1.1742,'2386:0 2387:0 '),\n(2389,'WarsongGulchHInside5',489,3277,3320,10,80,0,1033.59,1363.21,342.852,2.24035,'2394:0 2395:0 2384:0 '),\n(2390,'WarsongGulchHInside6',489,3277,3320,10,80,0,1060.56,1390.51,338.618,2.82356,'2394:0 2395:0 2384:0 '),\n(2391,'WarsongGulchHInside7',489,3277,3320,10,80,0,1086.1,1540.21,316.792,2.79013,'2393:0 2394:0 2385:0 '),\n(2392,'WarsongGulchHInside8',489,3277,3320,10,80,0,1119.21,1462.5,316.34,3.25941,'2393:0 2394:0 2395:0 2387:0 '),\n(2393,'WarsongGulchMidW2',489,3277,3277,10,80,0,1255.33,1511.56,309.973,3.31243,'2379:0 2380:0 '),\n(2394,'WarsongGulchMidC2',489,3277,3277,10,80,0,1217.19,1480.7,306.432,3.41258,'2379:0 2380:0 '),\n(2395,'WarsongGulchMidE2',489,3277,3277,10,80,0,1263.56,1400.5,310.369,3.07681,'2379:0 2380:0 ');\n"
  },
  {
    "path": "SQL/updates/world/2023_04_18_00_creature_template_npcbot_appearance.sql",
    "content": "--\nDELETE FROM `creature_template_npcbot_appearance` WHERE (`entry`='70266');\n"
  },
  {
    "path": "SQL/updates/world/2023_04_22_00_creature_template_npcbot_wander_nodes.sql",
    "content": "--\nDELETE FROM `creature_template_npcbot_wander_nodes` WHERE `id` IN (2396,2397,2398,2399,2400,2401,2402,2403,2404,2405,2406,2407,2408,2409,2410,2411,2412,2413,2414,2415,2416,2417,2418,2419,2420,2421,2422,2423,2424,2425,2426,2427,2428,2429,2430,2431,2432,2433,2434,2435,2436);\nINSERT INTO `creature_template_npcbot_wander_nodes`(`id`,`name`,`mapid`,`zoneid`,`areaid`,`minlevel`,`maxlevel`,`flags`,`x`,`y`,`z`,`o`,`links`) VALUES\n(2396,'ArathiBasinSpawnA',529,3358,3417,20,80,3,1313.9,1310.74,-9.01043,3.83874,'2397:0 '),\n(2397,'ArathiBasinStartA',529,3358,3358,20,80,0,1241.32,1228.52,-40.2271,4.12149,'2411:0 2398:0 '),\n(2398,'ArathiBasinStables',529,3358,3424,20,80,128,1168.45,1204.15,-56.582,6.24992,'2397:0 2399:0 '),\n(2399,'ArathiBasinStablesBridge',529,3358,3358,20,80,0,1088.6,1223.56,-53.4783,0.143443,'2400:0 2398:0 2403:0 '),\n(2400,'ArathiBasinMillLow1',529,3358,3358,20,80,0,988.277,1179.75,-50.2717,5.04236,'2399:0 2401:0 2416:0 '),\n(2401,'ArathiBasinMillLow2',529,3358,3358,20,80,0,890.451,1109.94,-56.335,4.04097,'2400:0 2402:0 '),\n(2402,'ArathiBasinMillLow3',529,3358,3358,20,80,0,845.513,978.663,-60.2139,0.977914,'2401:0 2408:0 2415:0 '),\n(2403,'ArathiBasinMillUp1',529,3358,3358,20,80,0,939.139,1227.33,-23.8137,3.6404,'2399:0 2404:0 '),\n(2404,'ArathiBasinMill',529,3358,3422,20,80,136,852.619,1151.8,11.5342,0.752077,'2405:0 2403:0 '),\n(2405,'ArathiBasinMillUp2',529,3358,3422,20,80,0,783.565,1047.78,-26.1072,1.57478,'2404:0 2408:0 '),\n(2406,'ArathiBasinSpawnH',529,3358,3418,20,80,5,684.071,681.281,-12.9148,0.836507,'2407:0 '),\n(2407,'ArathiBasinStartH',529,3358,3358,20,80,0,748.646,759.099,-41.5104,0.818832,'2409:0 2408:0 '),\n(2408,'ArathiBasinFarm',529,3358,3420,20,80,128,809.5,872.547,-56.7509,1.20759,'2405:0 2407:0 2402:0 '),\n(2409,'ArathiBasinFarmBridge',529,3358,3420,20,80,0,864.499,771.902,-51.7236,0.695112,'2407:0 2410:0 '),\n(2410,'ArathiBasinMineForkSE',529,3358,3358,20,80,0,956.739,804.522,-61.6094,0.524283,'2409:0 2412:0 2414:0 '),\n(2411,'ArathiBasinMineForkNW',529,3358,3358,20,80,0,1221.3,1088.37,-59.7666,4.47091,'2412:0 2397:0 2413:0 '),\n(2412,'ArathiBasinMine',529,3358,3423,20,80,136,1151.72,846.381,-110.525,2.55257,'2411:0 2410:0 '),\n(2413,'ArathiBasinMineUp1',529,3358,3358,20,80,0,1156.61,991.63,-63.6154,2.3307,'2411:0 2414:0 2416:0 '),\n(2414,'ArathiBasinMineUp2',529,3358,3358,20,80,0,1040.93,882.871,-61.8051,2.33458,'2410:0 2415:0 2413:0 '),\n(2415,'ArathiBasinBlacksmithForkS',529,3358,3421,20,80,0,922.673,999.161,-55.5623,5.49188,'2402:0 2414:0 2417:0 2416:0 '),\n(2416,'ArathiBasinBlacksmithForkN',529,3358,3421,20,80,0,1050.68,999.89,-50.4064,5.62341,'2400:0 2413:0 2415:0 2417:0 '),\n(2417,'ArathiBasinBlacksmith',529,3358,3421,20,80,136,979.258,1043.34,-44.3749,0.106003,'2415:0 2416:0 ');\n"
  },
  {
    "path": "SQL/updates/world/2023_04_28_00_creature_template.sql",
    "content": "--\nUPDATE `creature_template` SET `flags_extra` = (`flags_extra` | 0x02000000) WHERE (`flags_extra` & 0x0A000000) = 0x08000000 AND `entry` > 70000;\nUPDATE `creature_template` SET `flags_extra` = (`flags_extra` | 0x0A000000) WHERE (`flags_extra` & 0x0E000000) = 0x04000000 AND `entry` > 70000;\n"
  },
  {
    "path": "SQL/updates/world/2023_05_14_00_creature_template_npcbot_wander_nodes.sql",
    "content": "--\nUPDATE `creature_template_npcbot_wander_nodes` SET `minlevel`='23',`flags`='1' WHERE (`id`='753');\n"
  },
  {
    "path": "SQL/updates/world/2023_05_16_00_npc_text.sql",
    "content": "--\nSET @BOT_START = 70661;\nSET @BOT_END   = 70666;\n\nDELETE FROM `npc_text` WHERE `ID` BETWEEN @BOT_START AND @BOT_END;\n\nINSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n(@BOT_START+0, \"Bot gear bank...\", -1),\n(@BOT_START+1, \"Deposit items...\", -1),\n(@BOT_START+2, \"Withdraw items...\", -1),\n(@BOT_START+3, \"Bank is empty\", -1),\n(@BOT_START+4, \"Previous page\", -1),\n(@BOT_START+5, \"Next page\", -1);\n"
  },
  {
    "path": "SQL/updates/world/2023_05_20_00_creature_template.sql",
    "content": "--\nSET @BOT_START = 70587;\nSET @BOT_END   = 70595;\n\nDELETE FROM `creature_template` WHERE `entry` BETWEEN @BOT_START AND @BOT_END;\n\nINSERT INTO `creature_template`\n(`entry`,`difficulty_entry_1`,`difficulty_entry_2`,`difficulty_entry_3`,`KillCredit1`,`KillCredit2`,\n`modelid1`,`modelid2`,`modelid3`,`modelid4`,`name`,`subname`,`IconName`,`gossip_menu_id`,`minlevel`,`maxlevel`,`exp`,\n`faction`,`npcflag`,`speed_walk`,`speed_run`,`scale`,`rank`,`dmgschool`,`BaseAttackTime`,`RangeAttackTime`,\n`BaseVariance`,`RangeVariance`,`unit_class`,`unit_flags`,`unit_flags2`,`dynamicflags`,`family`,`type`,`type_flags`,`lootid`,\n`pickpocketloot`,`skinloot`,`PetSpellDataId`,`VehicleId`,`mingold`,`maxgold`,`AIName`,`MovementType`,\n`HoverHeight`,`HealthModifier`,`ManaModifier`,`ArmorModifier`,`DamageModifier`,`ExperienceModifier`,`RacialLeader`,`movementId`,\n`RegenHealth`,`mechanic_immune_mask`,`spell_school_immune_mask`,`flags_extra`,`ScriptName`,`VerifiedBuild`)\nVALUES\n('70587','0','0','0','0','0','27395','0','0','0','Tuten\\'arak','Crypt Lord Bot','','0','83','83','2','35','1','1.1','1.1','0.5','2','0','1900','1900','1','1','1','0','32','0','0','6','4096','0','0','0','0','0','0','0','','0','1','1','1','1','1','1','0','0','0','0','0','235929712','crypt_lord_bot','-1'),\n('70588','0','0','0','0','0','27395','0','0','0','Anubiros','Crypt Lord Bot','','0','83','83','2','35','1','1.1','1.1','0.5','2','0','1900','1900','1','1','1','0','32','0','0','6','4096','0','0','0','0','0','0','0','','0','1','1','1','1','1','1','0','0','0','0','0','235929712','crypt_lord_bot','-1'),\n('70589','0','0','0','0','0','27395','0','0','0','Nephri\\'thos','Crypt Lord Bot','','0','83','83','2','35','1','1.1','1.1','0.5','2','0','1900','1900','1','1','1','0','32','0','0','6','4096','0','0','0','0','0','0','0','','0','1','1','1','1','1','1','0','0','0','0','0','235929712','crypt_lord_bot','-1'),\n('70590','0','0','0','0','0','27395','0','0','0','Arak-arahm','Crypt Lord Bot','','0','83','83','2','35','1','1.1','1.1','0.5','2','0','1900','1900','1','1','1','0','32','0','0','6','4096','0','0','0','0','0','0','0','','0','1','1','1','1','1','1','0','0','0','0','0','235929712','crypt_lord_bot','-1'),\n('70591','0','0','0','0','0','27395','0','0','0','Horus\\'aman','Crypt Lord Bot','','0','83','83','2','35','1','1.1','1.1','0.5','2','0','1900','1900','1','1','1','0','32','0','0','6','4096','0','0','0','0','0','0','0','','0','1','1','1','1','1','1','0','0','0','0','0','235929712','crypt_lord_bot','-1'),\n('70592','0','0','0','0','0','11094','0','0','0','Carrion Beetle','','','0','83','83','2','35','0','1.05','1.05','0.5','0','0','1500','1500','1','1','1','0','0','0','0','6','4096','0','0','0','0','0','0','0','','0','1','1','1','1','1','1','0','0','0','0','0','168820832','crypt_lord_pet_bot','-1'),\n('70593','0','0','0','0','0','11094','0','0','0','Carrion Beetle','','','0','83','83','2','35','0','1.05','1.05','0.7','0','0','1500','1500','1','1','1','0','0','0','0','6','4096','0','0','0','0','0','0','0','','0','1','1','1','1','1','1','0','0','0','0','0','168820832','crypt_lord_pet_bot','-1'),\n('70594','0','0','0','0','0','11094','0','0','0','Carrion Beetle','','','0','83','83','2','35','0','1.05','1.05','0.9','0','0','1500','1500','1','1','1','0','0','0','0','6','4096','0','0','0','0','0','0','0','','0','1','1','1','1','1','1','0','0','0','0','0','168820832','crypt_lord_pet_bot','-1'),\n('70595','0','0','0','0','0','19252','0','0','0','Locust','','','0','83','83','2','35','0','1.4','1.4','0.25','1','0','1200','1200','1','1','1','33554432','0','0','0','6','4096','0','0','0','0','0','0','0','','0','2','1','1','1','1','1','0','0','0','0','0','704782368','crypt_lord_pet_bot','-1');\n"
  },
  {
    "path": "SQL/updates/world/2023_05_20_01_creature_equip_template.sql",
    "content": "--\nSET @BOT_START = 70587;\nSET @BOT_END   = 70591;\n\nDELETE FROM `creature_equip_template` WHERE `CreatureID` BETWEEN @BOT_START AND @BOT_END;\nINSERT INTO `creature_equip_template`\n(`CreatureID`,`ID`,`VerifiedBuild`)\nVALUES\n('70587','1','-1'),\n('70588','1','-1'),\n('70589','1','-1'),\n('70590','1','-1'),\n('70591','1','-1');\n"
  },
  {
    "path": "SQL/updates/world/2023_05_20_02_creature_template_npcbot_extras.sql",
    "content": "--\nSET @BOT_START = 70587;\nSET @BOT_END   = 70595;\n\nDELETE FROM `creature_template_npcbot_extras` WHERE `entry` BETWEEN @BOT_START AND @BOT_END;\nINSERT INTO `creature_template_npcbot_extras` (`entry`,`class`,`race`) VALUES\n('70587', '20', '15'),\n('70588', '20', '15'),\n('70589', '20', '15'),\n('70590', '20', '15'),\n('70591', '20', '15'),\n('70592', '0', '15'),\n('70593', '0', '15'),\n('70594', '0', '15'),\n('70595', '0', '15');\n"
  },
  {
    "path": "SQL/updates/world/2023_05_20_03_npc_text.sql",
    "content": "--\nSET @LOCALIZED_STRINGS_START = 70012;\nSET @LOCALIZED_STRINGS_END   = 70013;\n\nDELETE FROM `npc_text` WHERE ID BETWEEN @LOCALIZED_STRINGS_START and @LOCALIZED_STRINGS_END;\nINSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n(70012,'<Battle-scarred Crypt Lord stands before you, he is obviously uncontrolled. Without master this mighty undead nerubian lord has lost most of his power>$B$BWhat will it be, tiny creature? Your flesh will do like any other...','-1'),\n(70013,'I consume the living and the dead.','-1');\n\nSET @LOCALIZED_STRINGS_START = 70109;\nSET @LOCALIZED_STRINGS_END   = 70109;\n\nDELETE FROM `npc_text` WHERE ID BETWEEN @LOCALIZED_STRINGS_START and @LOCALIZED_STRINGS_END;\nINSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n(70109,'|cff9900ccCrypt Lord|r$b|cffdd6600-=Warcraft III tribute=-|r$B$B\\\"Ancient behemoth, once one of the kings of Azjol-Nerub, now an undead monster within ranks of Lich King\\'s mightiest warriors\\\".$B$BVery high armor, increased resistances, partially immune to control effects, immune to poison-based effects, mail/plate armor, deals melee/spellshadow damage, spell power bonus: 200% strength. Main attribute: Strength.$B$BImpale. Crypt Lord slams the ground with his massive claws, shooting spikes out in a frontal cone, dealing damage and hurling enemy units into the air in their wake, stunning them. Unlocked at level 20.$B$BSpiked Carapace. Crypt Lord\\'s chitinous armor increases damage resistance and returns 15% to 50% damage to enemy melee attackers.$B$BCarrion Beetles. Crypt Lord progenerates a Carrion Beetle from a fresh corpse of an enemy to attack his enemies. Beetles are permanent but do not regenerate health and only 6 can be controlled at a time. Higher levels allow Crypt Lord to summon more powerful beetles. Unlocked at level 10.$B$BLocust Swarm. Crypt Lord releases a swarm of 20-40 (depends on Crypt Lord\\'s level) angry locusts that bite and tear at nearby enemy units, reducing their ability to move or attack. As they chew the enemy flesh, they convert it into a substance that restores hit points to the Crypt Lord when they return. Unlocked at level 40.$B$B',-1);\n\nSET @LOCALIZED_STRINGS_START = 70667;\nSET @LOCALIZED_STRINGS_END   = 70672;\n\nDELETE FROM `npc_text` WHERE ID BETWEEN @LOCALIZED_STRINGS_START and @LOCALIZED_STRINGS_END;\nINSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n(70667,'Do you really want to spend all this money to make Crypt Lord move again?','-1'),\n(70668,'I doubt your ability to do much harm in your current state, but I am willing to lead you and help you restore your powers.','-1'),\n(70669,'Crypt Lords','-1'),\n(70670,'Crypt Lord','-1'),\n(70671,'Reflect','-1'),\n(70672,'Locusts','-1');\n"
  },
  {
    "path": "SQL/updates/world/2023_06_02_00_creature_template_npcbot_extras.sql",
    "content": "--\nUPDATE `creature_template_npcbot_wander_nodes` SET `flags`='1' WHERE (`id`='283');\n"
  },
  {
    "path": "SQL/updates/world/2023_06_03_00_creature_template.sql",
    "content": "--\nUPDATE `creature_template` SET `flags_extra`=(`flags_extra`|0x80000000) WHERE `entry` > 70000 AND (`flags_extra`&0x8E000000) IN (0xE000000, 0xA000000);\n"
  },
  {
    "path": "SQL/updates/world/2023_06_09_00_creature_template_npcbot_wander_nodes.sql",
    "content": "--\nSET @WP_START = 2418;\nSET @WP_END   = 5038;\n\nDELETE FROM `creature_template_npcbot_wander_nodes` WHERE `id` BETWEEN @WP_START AND @WP_END;\nINSERT INTO `creature_template_npcbot_wander_nodes`(`id`,`name`,`mapid`,`zoneid`,`areaid`,`minlevel`,`maxlevel`,`flags`,`x`,`y`,`z`,`o`,`links`) VALUES\n('2418','hellfire001','530','3483','3804','60','63','0','-88.1661','1757.73','61.4158','2.30551','2419:0 2422:0 '),\n('2419','hellfire002','530','3483','3804','60','63','0','-130.83','1837.76','78.4899','5.22012','2418:0 2420:0 2422:0 '),\n('2420','hellfire003','530','3483','3542','60','63','0','-228.144','1920.56','96.8968','1.90495','2419:0 2421:0 2422:0 '),\n('2421','hellfire004','530','3483','3542','60','63','1','-207.846','2150.92','80.3185','1.58606','2420:0 2442:0 2453:0 '),\n('2422','hellfire005','530','3483','3804','60','63','0','-320.252','1725.48','60.1535','0.383608','2418:0 2419:0 2420:0 2423:0 '),\n('2423','hellfire006','530','3483','3804','60','63','0','-443.68','1809.38','64.2507','6.17593','2422:0 2424:0 '),\n('2424','hellfire007','530','3483','3815','60','63','0','-614.482','1855.41','72.3221','2.91339','2423:0 2425:0 '),\n('2425','hellfire008','530','3483','3483','60','63','0','-772.087','1924.89','51.3142','3.69486','2424:0 2426:0 2427:0 '),\n('2426','hellfire009','530','3483','3582','60','63','0','-890.066','1889.54','71.6232','2.99193','2425:0 '),\n('2427','hellfire010','530','3483','3483','60','63','0','-665.15','2133.08','41.0304','6.09818','2425:0 2428:0 '),\n('2428','hellfire011','530','3483','3483','60','63','0','-830.651','2170.3','10.6442','6.00392','2427:0 2429:0 '),\n('2429','hellfire012','530','3483','3582','60','63','0','-1044.48','2221.12','18.1881','2.68955','2428:0 2430:0 2432:0 '),\n('2430','hellfire013','530','3483','3582','60','63','0','-1060.21','2075.54','65.7492','1.53579','2429:0 2431:0 '),\n('2431','hellfire014','530','3483','3582','60','63','0','-1136.98','1968.35','74.7199','4.3593','2430:0 '),\n('2432','hellfire015','530','3483','3483','60','63','0','-1116.71','2366.85','26.2','1.55936','2429:0 2433:0 '),\n('2433','hellfire016','530','3483','3483','60','63','0','-1209.75','2517.59','48.9283','1.97249','2432:0 '),\n('2434','hellfire017','530','3483','3483','60','63','0','-927.061','2680.73','24.4655','4.225','2435:0 2438:0 '),\n('2435','hellfire018','530','3483','3483','60','63','0','-991.176','2930.18','4.1955','4.89571','2434:0 2458:0 2459:0 '),\n('2436','hellfire019','530','3483','3483','60','63','0','-652.576','2459.81','56.8494','0.00658825','2437:0 2438:0 '),\n('2437','hellfire020','530','3483','3483','60','63','0','-382.816','2594.23','50.224','3.72781','2436:0 '),\n('2438','hellfire021','530','3483','3538','60','63','3','-721.67','2675.81','95.7509','0.770785','2434:0 2436:0 '),\n('2439','hellfire022','530','3483','3483','60','63','0','-449.715','2925.64','21.2132','0.32312','2440:0 '),\n('2440','hellfire023','530','3483','3483','60','63','0','-593.071','2998.53','15.8438','0.017592','2439:0 2441:0 '),\n('2441','hellfire024','530','3483','3483','60','63','0','-749.912','3117.85','4.88152','5.75179','2440:0 2458:0 2499:0 '),\n('2442','hellfire025','530','3483','3483','60','63','0','-80.7943','2320.17','65.6333','4.50299','2421:0 2443:0 2446:0 2453:0 '),\n('2443','hellfire026','530','3483','3483','60','63','0','18.4377','2469.36','53.639','4.22811','2442:0 2444:0 2446:0 '),\n('2444','hellfire027','530','3483','3536','60','63','4','33.0662','2661.07','75.7738','3.89274','2443:0 2445:0 '),\n('2445','hellfire028','530','3483','3536','60','63','5','221.743','2789.93','121.175','3.98307','2444:0 2496:0 '),\n('2446','hellfire029','530','3483','3793','60','63','0','158.425','2334.4','54.1841','5.04414','2442:0 2443:0 2447:0 '),\n('2447','hellfire030','530','3483','3793','60','63','0','270.62','2240.47','56.9978','2.96989','2446:0 2448:0 '),\n('2448','hellfire031','530','3483','3793','60','63','0','255.635','2040.2','31.817','2.78925','2447:0 2449:0 '),\n('2449','hellfire032','530','3483','3483','60','63','0','446.912','2049.26','99.1622','3.3783','2448:0 2450:0 '),\n('2450','hellfire033','530','3483','3483','60','63','0','442.066','2351.62','123.026','4.69385','2449:0 2451:0 '),\n('2451','hellfire034','530','3483','3483','60','63','0','438.394','2661.09','177.718','4.90591','2450:0 2452:0 '),\n('2452','hellfire035','530','3483','3549','60','63','0','549.636','2796.65','217.8','4.31374','2451:0 '),\n('2453','hellfire036','530','3483','3542','60','63','0','-220.959','2363','37.4537','1.6049','2421:0 2442:0 2454:0 '),\n('2454','hellfire037','530','3483','3542','60','63','0','-248.594','2648.76','-11.9763','4.88786','2453:0 2455:0 '),\n('2455','hellfire038','530','3483','3542','60','63','0','-270.052','2895.86','-55.0992','4.86824','2454:0 2456:0 2457:0 '),\n('2456','hellfire039','530','3483','3545','60','63','0','-371.638','3039.8','-63.8946','5.60259','2455:0 '),\n('2457','hellfire040','530','3483','3545','60','63','0','-243.298','3044.75','-65.4235','4.48185','2455:0 '),\n('2458','hellfire041','530','3483','3483','60','63','0','-930.007','3088.24','16.9479','0.133084','2435:0 2441:0 2459:0 2466:0 '),\n('2459','hellfire042','530','3483','3483','60','63','0','-1233.86','3071.59','29.2379','5.81622','2458:0 2435:0 2460:0 2462:0 '),\n('2460','hellfire043','530','3483','3796','60','63','0','-1370.5','2890.29','-26.0325','3.35557','2459:0 2461:0 '),\n('2461','hellfire044','530','3483','3546','60','63','0','-1257.98','2677.11','1.84108','2.88824','2460:0 '),\n('2462','hellfire045','530','3483','3483','60','63','0','-1343.14','3305.78','47.482','2.24265','2459:0 2463:0 '),\n('2463','hellfire046','530','3483','3765','60','63','0','-1519.57','3487.42','30.3847','2.18217','2462:0 2464:0 '),\n('2464','hellfire047','530','3483','3765','60','63','0','-1621.55','3645.56','31.4811','1.74235','2463:0 2465:0 '),\n('2465','hellfire048','530','3483','3765','60','63','0','-1680.38','3854.3','36.4441','1.97326','2464:0 2784:0 '),\n('2466','hellfire049','530','3483','3483','60','63','0','-1003.35','3339.19','79.143','4.83211','2458:0 2467:0 '),\n('2467','hellfire050','530','3483','3483','60','63','0','-866.12','3482.05','93.6018','3.97209','2466:0 2468:0 '),\n('2468','hellfire051','530','3483','3543','60','63','0','-842.626','3645.6','31.4407','5.28056','2467:0 2469:0 '),\n('2469','hellfire052','530','3483','3543','60','63','0','-578.854','3725.85','28.9962','3.4176','2468:0 2470:0 '),\n('2470','hellfire053','530','3483','3543','60','63','0','-629.058','3954.17','28.9952','4.88236','2469:0 2471:0 2472:0 2474:0 '),\n('2471','hellfire054','530','3483','3483','60','63','0','-503.474','4084.93','51.2172','4.03729','2470:0 2474:0 2481:0 '),\n('2472','hellfire055','530','3483','3543','60','63','0','-841.235','4095.51','32.9704','5.79579','2470:0 2473:0 2474:0 2477:0 '),\n('2473','hellfire056','530','3483','3483','60','63','0','-950.497','4184.92','29.5337','3.20635','2472:0 2475:0 2477:0 '),\n('2474','hellfire057','530','3483','3554','60','63','5','-659.228','4167.05','67.8382','3.41684','2470:0 2471:0 2472:0 2481:0 '),\n('2475','hellfire058','530','3483','3556','60','63','0','-1174.94','4209.88','20.9412','0.188851','2473:0 2476:0 '),\n('2476','hellfire059','530','3483','3798','60','63','0','-1287.84','4075.76','93.8567','5.93954','2475:0 '),\n('2477','hellfire060','530','3483','3483','60','63','0','-1036.95','4000.75','83.0333','2.90005','2472:0 2473:0 2478:0 '),\n('2478','hellfire061','530','3483','3483','60','63','0','-891.162','4017.27','84.496','3.16788','2477:0 2479:0 '),\n('2479','hellfire062','530','3483','3543','60','63','0','-799.397','3955.75','91.0415','2.42568','2478:0 2480:0 '),\n('2480','hellfire063','530','3483','3483','60','63','0','-766.496','3789.21','113.362','1.77223','2479:0 '),\n('2481','hellfire064','530','3483','3483','60','63','0','-593.759','4335.47','52.0515','4.60437','2474:0 2471:0 2482:0 '),\n('2482','hellfire065','530','3483','3483','60','63','0','-336.014','4367.15','59.658','3.93679','2481:0 2483:0 2509:0 '),\n('2483','hellfire066','530','3483','3483','60','63','0','-202.4','4447.51','42.6762','3.81506','2482:0 2484:0 2506:0 2509:0 '),\n('2484','hellfire067','530','3483','3483','60','63','0','-100.749','4241.25','83.9687','2.24269','2483:0 2485:0 2487:0 2489:0 2505:0 '),\n('2485','hellfire068','530','3483','3552','60','63','2','63.0268','4335.15','96.8814','6.21365','2484:0 2486:0 2487:0 '),\n('2486','hellfire069','530','3483','3552','60','63','3','215.545','4332.38','119.241','2.95661','2485:0 '),\n('2487','hellfire070','530','3483','3483','60','63','0','39.4389','4153.06','71.524','1.85939','2484:0 2485:0 2488:0 2489:0 2505:0 '),\n('2488','hellfire071','530','3483','3483','60','63','0','150.282','3945.51','79.661','2.2835','2487:0 2489:0 2515:0 '),\n('2489','hellfire072','530','3483','3483','60','63','0','-96.2588','3960.84','99.7364','0.521852','2484:0 2488:0 2487:0 2490:0 2505:0 '),\n('2490','hellfire073','530','3483','3669','60','63','0','-120.509','3779.67','72.1233','1.75885','2489:0 2491:0 '),\n('2491','hellfire074','530','3483','3553','60','63','0','-61.6848','3514.21','73.5858','5.1667','2490:0 2492:0 2494:0 2498:0 '),\n('2492','hellfire075','530','3483','3553','60','63','0','318.42','3476.5','61.5198','2.95581','2491:0 2493:0 '),\n('2493','hellfire076','530','3483','3553','60','63','0','383.974','3310.89','74.522','1.91516','2492:0 '),\n('2494','hellfire077','530','3483','3483','60','63','0','-44.2798','3288.99','27.2629','1.47534','2491:0 2495:0 2498:0 '),\n('2495','hellfire078','530','3483','3483','60','63','0','-43.1353','3087.28','-1.55873','1.59942','2494:0 2496:0 '),\n('2496','hellfire079','530','3483','3483','60','63','0','312.814','2983.21','19.5651','2.81914','2445:0 2495:0 2497:0 '),\n('2497','hellfire080','530','3483','3799','60','63','0','459.167','3040.66','17.0606','3.687','2496:0 '),\n('2498','hellfire081','530','3483','3670','60','63','0','-182.907','3456.14','39.4587','0.671851','2491:0 2494:0 '),\n('2499','hellfire082','530','3483','3671','60','63','0','-567.836','3269.14','15.2208','4.86979','2441:0 2500:0 '),\n('2500','hellfire083','530','3483','3671','60','63','0','-549.666','3476.52','45.226','4.64597','2499:0 2501:0 2502:0 '),\n('2501','hellfire084','530','3483','3671','60','63','0','-445.867','3462.18','37.6671','2.82071','2500:0 '),\n('2502','hellfire085','530','3483','3669','60','63','0','-452.212','3658.72','45.9024','0.816375','2500:0 2503:0 '),\n('2503','hellfire086','530','3483','3483','60','63','0','-378.049','3871.34','62.3491','4.48419','2502:0 2504:0 '),\n('2504','hellfire087','530','3483','3669','60','63','0','-294.007','3742.96','51.9568','2.11386','2503:0 2505:0 '),\n('2505','hellfire088','530','3483','3483','60','63','0','-203.95','4100.77','98.2207','5.35677','2484:0 2487:0 2489:0 2504:0 '),\n('2506','hellfire089','530','3483','3483','60','63','1','-249.051','4768.73','14.6773','1.56722','2483:0 2507:0 2508:0 2509:0 2512:0 2513:0 '),\n('2507','hellfire090','530','3483','3797','60','63','0','13.8026','4691.45','41.6534','6.21284','2506:0 2513:0 '),\n('2508','hellfire091','530','3483','3551','60','63','0','-556.09','4800.17','34.169','3.11602','2506:0 2509:0 2512:0 '),\n('2509','hellfire092','530','3483','3483','60','63','0','-412.14','4578.53','39.0585','2.37774','2506:0 2482:0 2483:0 2508:0 2512:0 '),\n('2510','hellfire093','530','3483','3800','60','63','0','-259.551','5042.36','65.21','1.36455','2511:0 2517:0 '),\n('2511','hellfire094','530','3483','3795','60','63','0','-403.556','4975.22','40.4154','0.508468','2510:0 2512:0 '),\n('2512','hellfire095','530','3483','3795','60','63','0','-417.252','4788.73','19.9639','2.94399','2509:0 2506:0 2508:0 2511:0 '),\n('2513','hellfire096','530','3483','3797','60','63','0','-68.76','4846.8','50.753','4.86823','2506:0 2507:0 2514:0 '),\n('2514','hellfire097','530','3483','3797','60','63','0','173.831','4854.22','77.6594','3.44272','2513:0 '),\n('2515','hellfire098','530','3483','3483','60','63','0','335.776','4014.33','100.063','3.83622','2488:0 2516:0 '),\n('2516','hellfire099','530','3483','3483','60','63','0','353.816','3871.24','144.979','1.47611','2515:0 '),\n('2517','hellfire100','530','3483','3800','60','63','0','-234.311','5165.64','83.9852','4.49598','2510:0 2518:0 '),\n('2518','zangar101','530','3521','3521','61','64','0','-271.021','5303.67','41.8812','4.77871','2517:0 2519:0 '),\n('2519','zangar102','530','3521','3565','61','64','1','-220.592','5436.56','21.669','5.30379','2518:0 2520:0 2521:0 '),\n('2520','zangar103','530','3521','3521','61','64','0','-84.4992','5395.31','22.3401','3.21027','2519:0 2659:0 '),\n('2521','zangar104','530','3521','3521','61','64','0','-395.049','5385.52','18.5881','6.06676','2519:0 2522:0 '),\n('2522','zangar105','530','3521','3521','61','64','0','-535.462','5435.61','20.9825','5.81938','2521:0 2523:0 '),\n('2523','zangar106','530','3521','3521','61','64','0','-672.658','5367.99','22.9724','0.237551','2522:0 2524:0 '),\n('2524','zangar107','530','3521','3641','61','64','0','-758.891','5282.57','17.6121','1.72588','2523:0 2525:0 '),\n('2525','zangar108','530','3521','3641','61','64','0','-813.122','5198.88','19.1746','1.05202','2524:0 2526:0 '),\n('2526','zangar109','530','3521','3641','61','64','0','-976.189','5260.97','19.0927','6.05108','2525:0 2527:0 2672:0 '),\n('2527','zangar110','530','3521','3521','61','64','0','-934.208','5419.78','22.8095','4.46851','2526:0 2528:0 2672:0 '),\n('2528','zangar111','530','3521','3521','61','64','0','-966.5','5606.91','22.0137','4.97508','2527:0 2529:0 '),\n('2529','zangar112','530','3521','3521','61','64','0','-912.293','5682.09','21.6937','5.08504','2528:0 2530:0 '),\n('2530','zangar113','530','3521','3521','61','64','0','-913.195','5896.44','20.1725','4.59652','2529:0 2531:0 2534:0 '),\n('2531','zangar114','530','3521','3521','61','64','0','-909.682','6045.49','19.7314','4.59651','2530:0 2532:0 2534:0 2535:0 '),\n('2532','zangar115','530','3521','3521','61','64','0','-1037.12','6091.11','19.5931','5.89242','2531:0 2533:0 '),\n('2533','zangar116','530','3521','3521','61','64','0','-1163.58','6201.43','53.0219','5.61282','2532:0 2671:0 '),\n('2534','zangar117','530','3521','3841','61','64','0','-796.58','5918.23','22.3409','2.31415','2530:0 2531:0 2535:0 '),\n('2535','zangar118','530','3521','3521','61','64','0','-701.347','6013.97','22.3146','3.22521','2534:0 2531:0 2536:0 2537:0 '),\n('2536','zangar119','530','3521','3841','61','64','0','-592.408','5933.75','20.813','5.51464','2535:0 2537:0 '),\n('2537','zangar120','530','3521','3521','61','64','0','-504.59','6048.64','23.1686','4.20775','2536:0 2535:0 2538:0 '),\n('2538','zangar121','530','3521','3841','61','64','0','-495.325','5854.59','20.3458','2.52376','2537:0 2539:0 '),\n('2539','zangar122','530','3521','3521','61','64','0','-318.55','6013.33','23.3657','3.50315','2538:0 2540:0 2654:0 '),\n('2540','zangar123','530','3521','3819','61','64','0','-352.699','6158.62','21.7844','4.91293','2539:0 2541:0 2654:0 '),\n('2541','zangar124','530','3521','3819','61','64','0','-338.739','6298.09','21.04','4.63411','2540:0 2542:0 '),\n('2542','zangar125','530','3521','3819','61','64','0','-409.277','6401.64','21.9404','0.801373','2541:0 2543:0 2546:0 '),\n('2543','zangar126','530','3521','3819','61','64','0','-230.832','6354.36','21.7058','3.81024','2542:0 2544:0 '),\n('2544','zangar127','530','3521','3659','61','64','0','-139.857','6456.59','20.0973','3.85658','2543:0 2545:0 2653:0 '),\n('2545','zangar128','530','3521','3659','61','64','0','-269.671','6613.48','23.0533','4.34353','2544:0 2546:0 '),\n('2546','zangar129','530','3521','3659','61','64','0','-383.175','6598.68','22.9642','4.52024','2542:0 2545:0 2547:0 '),\n('2547','zangar130','530','3521','3659','61','64','0','-215.725','6703.55','20.6145','4.19588','2546:0 2548:0 2549:0 '),\n('2548','zangar131','530','3521','3659','61','64','0','-63.9463','6759.2','20.4434','3.22986','2547:0 2549:0 2555:0 '),\n('2549','zangar132','530','3521','3659','61','64','0','-261.475','6823.98','21.6241','5.85702','2547:0 2548:0 2550:0 '),\n('2550','zangar133','530','3521','3642','61','64','0','-208.234','6950.07','20.1839','0.893301','2549:0 2551:0 '),\n('2551','zangar134','530','3521','3642','61','64','0','-126.36','7041.34','18.9083','3.86997','2550:0 2552:0 '),\n('2552','zangar135','530','3521','3642','61','64','0','-50.056','7132.44','19.2134','4.60817','2551:0 2553:0 '),\n('2553','zangar136','530','3521','3521','61','64','0','64.7648','7212.88','22.0782','0.46519','2552:0 2554:0 2562:0 2563:0 2574:0 '),\n('2554','zangar137','530','3521','3521','61','64','0','44.854','7014.88','23.4767','1.78543','2553:0 2555:0 '),\n('2555','zangar138','530','3521','3521','61','64','0','43.5835','6871.99','22.3894','4.7567','2554:0 2548:0 2556:0 2557:0 '),\n('2556','zangar139','530','3521','3521','61','64','0','157.048','6719.99','20.4444','2.3259','2555:0 2557:0 2641:0 '),\n('2557','zangar140','530','3521','3720','61','64','0','223.784','6824.17','25.6438','3.74197','2555:0 2556:0 2558:0 2641:0 '),\n('2558','zangar141','530','3521','3720','61','64','0','234.681','6926.14','23.7418','4.49203','2557:0 2559:0 '),\n('2559','zangar142','530','3521','3720','61','64','0','212.404','7079.58','35.2277','4.69231','2558:0 2560:0 '),\n('2560','zangar143','530','3521','3720','61','64','0','220.362','7208.94','25.1738','4.71196','2559:0 2561:0 '),\n('2561','zangar144','530','3521','3720','61','64','0','336.506','7340.86','41.5461','4.13471','2560:0 2562:0 2633:0 '),\n('2562','zangar145','530','3521','3720','61','64','0','157.889','7365.75','22.1067','6.02358','2553:0 2561:0 2563:0 '),\n('2563','zangar146','530','3521','3521','61','64','0','63.1597','7443.51','22.1993','5.2932','2553:0 2562:0 2564:0 2574:0 '),\n('2564','zangar147','530','3521','3521','61','64','0','115.528','7547.02','21.6598','4.53135','2563:0 2565:0 2569:0 '),\n('2565','zangar148','530','3521','3521','61','64','0','118.141','7658.13','21.5634','4.72141','2564:0 2566:0 2569:0 2575:0 2633:0 '),\n('2566','zangar149','530','3521','3521','61','64','4','246.937','7753.08','23.1428','3.93445','2565:0 2567:0 2569:0 2575:0 2633:0 '),\n('2567','zangar150','530','3521','3645','61','64','5','264.306','7863.47','23.7956','4.64131','2566:0 2568:0 2569:0 2575:0 '),\n('2568','zangar151','530','3521','3521','61','64','4','449.39','7844.62','22.0319','3.04694','2567:0 2615:0 '),\n('2569','zangar152','530','3521','3521','61','64','0','81.5617','7740.29','21.6356','3.14119','2564:0 2565:0 2566:0 2567:0 2570:0 2575:0 '),\n('2570','zangar153','530','3521','3521','61','64','0','-28.0868','7736.24','20.5893','6.25922','2569:0 2571:0 2575:0 2582:0 '),\n('2571','zangar154','530','3521','3521','61','64','0','-170.551','7601.35','23.3202','0.757515','2570:0 2572:0 2581:0 '),\n('2572','zangar155','530','3521','3521','61','64','0','-174.825','7443.51','21.9702','1.57433','2571:0 2573:0 2574:0 '),\n('2573','zangar156','530','3521','3642','61','64','0','-120.981','7305.7','23.422','1.77461','2572:0 2574:0 '),\n('2574','zangar157','530','3521','3521','61','64','0','-20.2426','7327.37','23.7348','2.19481','2573:0 2572:0 2563:0 2553:0 '),\n('2575','zangar158','530','3521','3521','61','64','0','84.0333','7841.91','22.0373','4.55886','2565:0 2566:0 2567:0 2569:0 2570:0 2576:0 '),\n('2576','zangar159','530','3521','3521','61','64','0','65.13','7971.37','21.6779','4.89266','2575:0 2577:0 '),\n('2577','zangar160','530','3521','3521','61','64','0','43.5829','8117.3','22.3841','4.94372','2576:0 2578:0 2598:0 '),\n('2578','zangar161','530','3521','3521','61','64','0','-49.1017','8195.83','23.1999','5.71343','2577:0 2579:0 2583:0 2587:0 '),\n('2579','zangar162','530','3521','3646','61','64','0','-209.87','8126.35','19.9595','0.261968','2578:0 2580:0 2582:0 2583:0 '),\n('2580','zangar163','530','3521','3646','61','64','0','-261.772','7885.5','18.5845','1.41258','2579:0 2581:0 2582:0 '),\n('2581','zangar164','530','3521','3521','61','64','0','-259.719','7720.02','20.8878','1.65605','2571:0 2580:0 '),\n('2582','zangar165','530','3521','3646','61','64','0','-98.2706','7905.01','21.2267','4.92567','2570:0 2579:0 2580:0 '),\n('2583','zangar166','530','3521','3521','61','64','0','-180.804','8271.58','22.3452','2.13749','2578:0 2579:0 2584:0 2587:0 '),\n('2584','zangar167','530','3521','3521','61','64','0','-280.916','8401.01','22.613','5.34193','2583:0 2585:0 '),\n('2585','zangar168','530','3521','3521','61','64','0','-414.115','8416.71','22.9544','6.2098','2584:0 2586:0 2949:0 '),\n('2586','zangar169','530','3521','3521','61','64','0','-208.705','8507.09','22.1101','4.05625','2585:0 2587:0 '),\n('2587','zangar170','530','3521','3521','61','64','0','-76.6423','8339.54','20.5708','1.28772','2583:0 2578:0 2586:0 2588:0 '),\n('2588','zangar171','530','3521','3521','61','64','0','2.14825','8447.62','24.0799','1.18326','2587:0 2589:0 2596:0 '),\n('2589','zangar172','530','3521','3647','61','64','0','-67.5414','8574.38','21.4033','5.22493','2588:0 2590:0 2596:0 '),\n('2590','zangar173','530','3521','3647','61','64','0','-131.783','8711.6','20.1378','5.16367','2589:0 2591:0 '),\n('2591','zangar174','530','3521','3647','61','64','0','-58.2395','8845.13','19.6236','4.45683','2590:0 2592:0 '),\n('2592','zangar175','530','3521','3647','61','64','0','-158.14','8998.32','22.6743','5.39853','2591:0 2593:0 '),\n('2593','zangar176','530','3521','3521','61','64','0','49.2289','8919.95','22.8353','4.08298','2592:0 2594:0 2612:0 '),\n('2594','zangar177','530','3521','3658','61','64','0','191.332','8791.02','22.5064','3.15621','2593:0 2595:0 '),\n('2595','zangar178','530','3521','3658','61','64','0','100.838','8633.77','22.3518','1.01992','2594:0 2596:0 '),\n('2596','zangar179','530','3521','3521','61','64','0','46.3545','8528.92','21.3211','3.67772','2588:0 2589:0 2595:0 2597:0 '),\n('2597','zangar180','530','3521','3521','61','64','1','201.143','8506.92','24.4625','4.24664','2596:0 2598:0 '),\n('2598','zangar181','530','3521','3656','61','64','0','176.313','8271.1','19.3723','2.275','2577:0 2597:0 2599:0 '),\n('2599','zangar182','530','3521','3656','61','64','0','285.943','8219.3','20.2926','3.15229','2598:0 2600:0 '),\n('2600','zangar183','530','3521','3656','61','64','0','386.339','8346.33','22.789','4.31625','2599:0 2601:0 '),\n('2601','zangar184','530','3521','3656','61','64','0','494.267','8437.25','21.4802','4.07671','2600:0 2602:0 2609:0 2613:0 '),\n('2602','zangar185','530','3521','3656','61','64','0','608.933','8508.26','22.3504','3.55914','2601:0 2603:0 2609:0 '),\n('2603','zangar186','530','3521','3521','61','64','0','742.61','8532.55','22.4318','3.26227','2602:0 2604:0 2608:0 2609:0 '),\n('2604','zangar187','530','3521','3521','61','64','0','895.923','8416.01','24.0337','2.57898','2603:0 2605:0 '),\n('2605','zangar188','530','3521','3650','61','64','0','1075.84','8407.67','22.4904','3.12875','2604:0 2606:0 2607:0 2620:0 '),\n('2606','zangar189','530','3521','3650','61','64','0','1227.41','8505.09','22.644','3.70367','2605:0 2607:0 2621:0 '),\n('2607','zangar190','530','3521','3650','61','64','0','1037.11','8556.71','23.1526','5.52971','2605:0 2606:0 2608:0 '),\n('2608','zangar191','530','3521','3521','61','64','0','838.679','8631.92','21.121','3.9','2607:0 2603:0 '),\n('2609','zangar192','530','3521','3657','61','64','0','532.243','8648.7','20.2148','1.72209','2601:0 2602:0 2603:0 2610:0 '),\n('2610','zangar193','530','3521','3521','61','64','0','500.585','8831.78','29.9762','3.31252','2609:0 2611:0 '),\n('2611','zangar194','530','3521','3521','61','64','0','312.939','8988.81','29.3602','2.17448','2610:0 2612:0 '),\n('2612','zangar195','530','3521','3521','61','64','0','153.844','9001.52','20.6373','4.20787','2593:0 2611:0 '),\n('2613','zangar196','530','3521','3643','61','64','0','634.189','8249.73','20.9802','4.23537','2601:0 2614:0 '),\n('2614','zangar197','530','3521','3643','61','64','0','610.771','8068.12','19.5665','1.60114','2613:0 2615:0 2617:0 '),\n('2615','zangar198','530','3521','3667','61','64','0','579.736','7860.06','21.923','1.46997','2568:0 2614:0 2616:0 '),\n('2616','zangar199','530','3521','3667','61','64','0','737.751','7895.31','21.9665','6.19807','2615:0 2617:0 '),\n('2617','zangar200','530','3521','3521','61','64','0','787.048','8075.83','19.8301','1.19115','2614:0 2616:0 2618:0 '),\n('2618','zangar201','530','3521','3667','61','64','0','940.179','8075.93','22.3322','3.07219','2617:0 2619:0 2625:0 '),\n('2619','zangar202','530','3521','3667','61','64','0','1079.94','8078.99','22.0839','3.44134','2618:0 2620:0 2624:0 '),\n('2620','zangar203','530','3521','3640','61','64','0','1142.01','8208.94','18.3815','1.68911','2605:0 2619:0 2624:0 '),\n('2621','zangar204','530','3521','3650','61','64','0','1365.27','8597.28','20.4376','3.62905','2606:0 2622:0 '),\n('2622','zangar205','530','3521','3650','61','64','0','1473.46','8617.75','-19.2604','3.20336','2621:0 2623:0 '),\n('2623','zangar206','530','3521','3651','61','64','0','1617.83','8604.6','-25.7602','3.11932','2622:0 '),\n('2624','zangar207','530','3521','3521','61','64','0','1204.46','7994.66','23.5559','2.79496','2619:0 2620:0 2625:0 '),\n('2625','zangar208','530','3521','3667','61','64','0','985.581','7906.61','21.9749','1.94279','2618:0 2624:0 2626:0 '),\n('2626','zangar209','530','3521','3667','61','64','0','924.71','7759.51','22.2632','4.47963','2625:0 2627:0 '),\n('2627','zangar210','530','3521','3667','61','64','0','972.886','7540.98','20.6745','5.06474','2626:0 2628:0 '),\n('2628','zangar211','530','3521','3766','61','64','3','1008.04','7381.67','36.2454','2.67557','2627:0 2629:0 3123:0 '),\n('2629','zangar212','530','3521','3521','61','64','2','888.478','7369.16','20.9021','3.3785','2628:0 2630:0 2634:0 '),\n('2630','zangar213','530','3521','3521','61','64','0','749.898','7401.62','22.0246','0.295815','2629:0 2631:0 2634:0 '),\n('2631','zangar214','530','3521','3653','61','64','0','578.096','7540.84','19.4559','5.3043','2630:0 2632:0 '),\n('2632','zangar215','530','3521','3653','61','64','0','453.399','7459.1','23.6644','2.9591','2631:0 2633:0 '),\n('2633','zangar216','530','3521','3521','61','64','0','301.56','7502.53','18.7007','4.88489','2561:0 2632:0 2566:0 2565:0 '),\n('2634','zangar217','530','3521','3653','61','64','0','723.766','7219.4','18.4476','1.52104','2629:0 2630:0 2635:0 '),\n('2635','zangar218','530','3521','3653','61','64','0','828.704','7046.99','21.9746','5.47316','2634:0 2636:0 '),\n('2636','zangar219','530','3521','3521','61','64','0','813.291','6859.8','21.1175','4.5346','2635:0 2637:0 '),\n('2637','zangar220','530','3521','3521','61','64','0','786.813','6686.79','19.6235','4.77415','2636:0 2638:0 '),\n('2638','zangar221','530','3521','3521','61','64','0','739.145','6548.18','21.4284','2.68185','2637:0 2639:0 2646:0 '),\n('2639','zangar222','530','3521','3653','61','64','0','533.697','6616.1','23.4617','5.98523','2638:0 2640:0 2646:0 '),\n('2640','zangar223','530','3521','3521','61','64','0','392.669','6497.59','21.0234','1.88546','2639:0 2641:0 2642:0 2646:0 '),\n('2641','zangar224','530','3521','3521','61','64','0','309.995','6655.73','21.2137','5.01134','2556:0 2640:0 2557:0 '),\n('2642','zangar225','530','3521','3521','61','64','0','377.938','6282.83','22.023','4.47492','2640:0 2643:0 '),\n('2643','zangar226','530','3521','3521','61','64','0','413.817','6144.54','22.2423','1.89569','2642:0 2644:0 2649:0 '),\n('2644','zangar227','530','3521','3521','61','64','0','588.059','6075.05','22.5742','2.63553','2643:0 2645:0 2647:0 2670:0 '),\n('2645','zangar228','530','3521','3818','61','64','0','603.408','6285.69','21.8038','4.64065','2644:0 2646:0 2647:0 '),\n('2646','zangar229','530','3521','3653','61','64','0','621.81','6442.18','20.5988','2.00643','2638:0 2639:0 2640:0 2645:0 '),\n('2647','zangar230','530','3521','3521','61','64','0','691.526','6136.65','24.626','4.02491','2644:0 2645:0 2648:0 3018:0 '),\n('2648','zangar231','530','3521','3521','61','64','0','718.677','6010.01','23.0266','4.85273','2647:0 2670:0 3018:0 '),\n('2649','zangar232','530','3521','3644','61','64','3','284.699','5949','26.4296','1.71192','2643:0 2650:0 2657:0 '),\n('2650','zangar233','530','3521','3521','61','64','2','171.4','6095.69','21.4396','5.75672','2649:0 2651:0 2654:0 2657:0 '),\n('2651','zangar234','530','3521','3521','61','64','0','220.592','6179.94','22.7879','2.4926','2650:0 2652:0 '),\n('2652','zangar235','530','3521','3521','61','64','0','109.112','6307.6','20.5752','2.47375','2651:0 2653:0 2654:0 '),\n('2653','zangar236','530','3521','3659','61','64','0','-2.05183','6372.4','21.196','6.01275','2544:0 2652:0 '),\n('2654','zangar237','530','3521','3521','61','64','0','-101.637','6148.49','20.9712','3.74609','2539:0 2540:0 2652:0 2650:0 2655:0 '),\n('2655','zangar238','530','3521','3521','61','64','0','-95.8529','5919.89','21.912','1.45665','2654:0 2656:0 '),\n('2656','zangar239','530','3521','3521','61','64','0','13.2803','5837.85','22.8222','2.53657','2655:0 2657:0 '),\n('2657','zangar240','530','3521','3521','61','64','0','151.585','5801.02','22.4062','1.73938','2649:0 2650:0 2656:0 2658:0 '),\n('2658','zangar241','530','3521','3521','61','64','0','12.867','5638.72','21.5024','0.850312','2657:0 2659:0 '),\n('2659','zangar242','530','3521','3521','61','64','0','48.9274','5481.91','21.872','2.08181','2520:0 2658:0 2660:0 2662:0 '),\n('2660','zangar243','530','3521','3521','61','64','4','71.9609','5332.54','21.9147','5.20377','2659:0 2661:0 2662:0 '),\n('2661','zangar244','530','3521','3718','61','64','5','85.2911','5223.84','22.6669','1.80693','2660:0 '),\n('2662','zangar245','530','3521','3648','61','64','0','158.923','5429.39','21.7352','4.09636','2660:0 2659:0 2663:0 '),\n('2663','zangar246','530','3521','3648','61','64','0','315.219','5408.5','20.9134','6.16588','2662:0 2664:0 2665:0 '),\n('2664','zangar247','530','3521','3648','61','64','0','377.232','5291.67','16.6948','0.491381','2663:0 2665:0 '),\n('2665','zangar248','530','3521','3648','61','64','0','610.457','5425.64','-14.6579','4.20083','2663:0 2664:0 2666:0 2667:0 2668:0 '),\n('2666','zangar249','530','3521','3648','61','64','0','820.719','5482.54','9.38793','3.43975','2665:0 2667:0 '),\n('2667','zangar250','530','3521','3648','61','64','0','675.579','5207.73','-0.430108','1.71187','2665:0 2666:0 '),\n('2668','zangar251','530','3521','3648','61','64','0','581.932','5617.72','21.5502','1.58306','2665:0 2669:0 '),\n('2669','zangar252','530','3521','3521','61','64','0','549.492','5772.45','23.2954','1.1668','2668:0 2670:0 '),\n('2670','zangar253','530','3521','3521','61','64','0','569.447','5936.2','20.4341','1.13146','2669:0 2648:0 2644:0 3018:0 '),\n('2671','nagrand254','530','3521','3521','61','64','0','-1293.68','6268.96','47.863','5.30897','2533:0 2973:0 '),\n('2672','zangar255','530','3521','3521','61','64','0','-1072.75','5374.44','23.0643','3.2316','2526:0 2527:0 2673:0 '),\n('2673','tero256','530','3519','3519','61','64','0','-1193.26','5326.41','32.1568','3.76253','2672:0 2674:0 '),\n('2674','tero257','530','3519','3519','61','64','0','-1352.86','5166.19','60.3214','0.730896','2673:0 2675:0 '),\n('2675','tero258','530','3519','3519','61','64','0','-1481.09','5196.68','44.2804','2.26164','2674:0 2676:0 '),\n('2676','tero259','530','3703','3703','61','64','0','-1562.26','5219.05','26.8104','5.79513','2675:0 2677:0 '),\n('2677','tero260','530','3703','3703','61','64','0','-1646.24','5089.63','9.06231','3.96908','2676:0 2678:0 2679:0 '),\n('2678','tero261','530','3519','3519','62','65','0','-1504.23','5007.75','-5.38562','2.6182','2677:0 '),\n('2679','tero262','530','3703','3703','62','65','0','-1767.61','5061.37','7.70519','3.4303','2677:0 2680:0 '),\n('2680','tero263','530','3703','3703','62','65','0','-1923.14','5054.44','19.4908','2.72737','2679:0 2681:0 2682:0 2787:0 '),\n('2681','tero264','530','3519','3519','62','65','0','-1970.49','4974.82','28.2638','4.09397','2680:0 2770:0 2787:0 '),\n('2682','tero265','530','3703','3703','62','65','0','-2043.23','5134.06','8.27497','5.68597','2680:0 2683:0 2787:0 '),\n('2683','tero266','530','3519','3519','62','65','0','-2181.58','5096.17','-21.1362','0.23923','2682:0 2684:0 2685:0 2686:0 2787:0 '),\n('2684','tero267','530','3519','3519','62','65','0','-2216.99','4909.63','1.39859','1.40554','2683:0 2787:0 '),\n('2685','tero268','530','3519','3519','62','65','0','-2303.98','5268.43','-9.97572','5.28148','2683:0 2686:0 2687:0 2690:0 '),\n('2686','tero269','530','3519','3682','62','65','0','-2344.61','5051.57','-2.04758','0.266708','2685:0 2683:0 2690:0 '),\n('2687','tero270','530','3519','3677','62','65','0','-2431.44','5399.92','1.64547','5.51947','2685:0 2688:0 '),\n('2688','tero271','530','3519','3519','62','65','0','-2521.64','5210.06','1.76945','1.04896','2687:0 2689:0 2691:0 '),\n('2689','tero272','530','3519','3682','62','65','0','-2502.78','5113.56','7.96009','6.26007','2688:0 2690:0 2691:0 '),\n('2690','tero273','530','3519','3519','62','65','0','-2359.81','5159.68','-3.26821','3.01403','2689:0 2685:0 2686:0 '),\n('2691','tero274','530','3519','3519','62','65','0','-2640.66','5114.54','-2.29','3.12004','2688:0 2689:0 2692:0 '),\n('2692','tero275','530','3519','3887','62','65','1','-2764.32','5083.04','-6.61069','4.7576','2691:0 2693:0 2694:0 '),\n('2693','tero276','530','3519','3697','62','65','0','-2753.24','4900.43','-9.77721','1.5139','2692:0 2694:0 2696:0 '),\n('2694','tero277','530','3519','3697','62','65','0','-2924.05','5077.7','-21.4831','6.27734','2693:0 2692:0 2695:0 2696:0 '),\n('2695','tero278','530','3519','3697','62','65','0','-2988.38','5242.11','-18.2224','5.09376','2694:0 2737:0 2739:0 '),\n('2696','tero279','530','3519','3697','62','65','0','-2927.67','4884.87','-20.3937','1.65765','2693:0 2694:0 2697:0 '),\n('2697','tero280','530','3519','3891','62','65','0','-2833.33','4763.19','-3.82034','2.17758','2696:0 2698:0 '),\n('2698','tero281','530','3519','3891','62','65','0','-2735.66','4761.53','-7.97762','3.14205','2697:0 2699:0 '),\n('2699','tero282','530','3519','3697','62','65','0','-2927.04','4629.03','-20.1141','1.04898','2698:0 2700:0 2701:0 2703:0 '),\n('2700','tero283','530','3519','3697','62','65','0','-2792.58','4548.65','-5.17792','2.36688','2699:0 '),\n('2701','tero284','530','3519','3697','62','65','0','-3098.66','4626.88','-20.2418','0.186611','2699:0 2702:0 2707:0 '),\n('2702','tero285','530','3519','3697','62','65','0','-3111.3','4451.66','-21.8624','1.72364','2701:0 2703:0 '),\n('2703','tero286','530','3519','3697','62','65','0','-2978.71','4453.52','-19.1914','1.37334','2702:0 2699:0 2704:0 2762:0 '),\n('2704','tero287','530','3519','3697','62','65','0','-3124.74','4312.73','-13.4977','1.36941','2703:0 2705:0 2744:0 '),\n('2705','tero288','530','3519','3697','62','65','0','-3343.1','4318.47','-21.2101','0.0703571','2704:0 2706:0 2708:0 2744:0 '),\n('2706','tero289','530','3519','3697','62','65','0','-3251.81','4540.47','-21.009','4.41204','2705:0 2707:0 2709:0 '),\n('2707','tero290','530','3519','3688','62','65','0','-3251.45','4665.87','-22.0178','5.15817','2706:0 2701:0 '),\n('2708','tero291','530','3519','3892','62','65','0','-3461.56','4373.44','-11.6911','5.77627','2705:0 2709:0 2710:0 '),\n('2709','tero292','530','3519','3697','62','65','0','-3412.64','4543.05','-19.8323','4.37513','2708:0 2706:0 2710:0 '),\n('2710','tero293','530','3519','3697','62','65','0','-3615.55','4423.5','-15.264','6.23338','2708:0 2709:0 2711:0 2712:0 '),\n('2711','tero294','530','3519','3885','62','65','0','-3737.19','4335.92','3.0303','0.715952','2710:0 2712:0 '),\n('2712','tero295','530','3519','3697','62','65','0','-3717.12','4553.09','-15.395','5.41343','2710:0 2711:0 2713:0 '),\n('2713','tero296','530','3519','3886','62','65','0','-3751.58','4692.08','-17.1029','5.18959','2712:0 2714:0 2717:0 '),\n('2714','tero297','530','3519','3688','62','65','0','-3628.23','4736.46','-22.1214','3.39967','2713:0 2715:0 '),\n('2715','tero298','530','3519','3688','62','65','0','-3683.64','4880.37','-22.2453','4.85659','2714:0 2716:0 '),\n('2716','tero299','530','3519','3697','62','65','0','-3787.46','5013.52','-20.1657','5.31998','2715:0 2717:0 2718:0 '),\n('2717','tero300','530','3519','3697','62','65','0','-3875.72','4882.7','-35.8103','0.180317','2716:0 2713:0 '),\n('2718','tero301','530','3519','3697','62','65','0','-3756.44','5163.25','-22.4721','4.73093','2716:0 2720:0 2719:0 '),\n('2719','tero302','530','3519','3697','62','65','1','-3750.45','5404.46','-3.33481','1.38198','2718:0 2720:0 2721:0 '),\n('2720','tero303','530','3519','3894','62','65','0','-3634.78','5300.46','-21.1377','3.63217','2718:0 2721:0 2741:0 2719:0 '),\n('2721','tero304','530','3519','3697','62','65','0','-3670.35','5445.73','-4.16488','5.0239','2720:0 2722:0 2741:0 2719:0 '),\n('2722','tero305','530','3519','3697','62','65','0','-3645.73','5559.5','-2.14497','4.56524','2721:0 2723:0 '),\n('2723','tero306','530','3519','3686','62','65','0','-3642.69','5710.06','-2.77685','4.68385','2722:0 2724:0 2725:0 '),\n('2724','tero307','530','3519','3519','62','65','0','-3501.7','5745.82','0.234953','3.52538','2723:0 2730:0 '),\n('2725','tero308','530','3519','3519','62','65','0','-3733.98','5830.74','-2.74856','5.14723','2723:0 2726:0 '),\n('2726','tero309','530','3519','3519','62','65','0','-3787.12','5986.43','-1.72887','4.96659','2725:0 2727:0 '),\n('2727','tero310','530','3519','3519','62','65','0','-3628.51','6056.29','-3.33948','3.46806','2726:0 2728:0 '),\n('2728','tero311','530','3519','3519','62','65','0','-3508.49','6174.6','4.08676','3.93145','2727:0 2729:0 '),\n('2729','tero312','530','3519','3519','62','65','0','-3378.56','5998.98','-6.51004','2.27505','2728:0 2730:0 2731:0 2742:0 '),\n('2730','tero313','530','3519','3519','62','65','0','-3476.42','5902.44','-30.7079','0.739594','2729:0 2724:0 2731:0 '),\n('2731','tero314','530','3519','3519','62','65','0','-3285.32','5879.96','-19.0985','2.70702','2730:0 2729:0 2732:0 2742:0 '),\n('2732','tero315','530','3519','3519','62','65','0','-3364.14','5789.3','-1.76223','1.10479','2731:0 2733:0 2742:0 '),\n('2733','tero316','530','3519','3697','62','65','0','-3305.33','5740.49','0.884062','4.92025','2732:0 2734:0 2742:0 '),\n('2734','tero317','530','3519','3697','62','65','0','-3286.23','5602.34','-6.97428','4.90454','2733:0 2735:0 '),\n('2735','tero318','530','3519','3697','62','65','0','-3117.93','5582.45','-7.6733','6.23185','2734:0 2736:0 2739:0 '),\n('2736','tero319','530','3519','3697','62','65','0','-2973.64','5517.8','-7.12772','5.62318','2735:0 2737:0 2739:0 '),\n('2737','tero320','530','3519','3697','62','65','0','-2940.15','5358.09','-13.875','4.96972','2736:0 2695:0 2738:0 2739:0 '),\n('2738','tero321','530','3519','3697','62','65','0','-2795.19','5341.13','-2.81699','5.23676','2737:0 '),\n('2739','tero322','530','3519','3697','62','65','0','-3141.55','5381.37','-22.1389','0.524372','2695:0 2735:0 2736:0 2737:0 2740:0 '),\n('2740','tero323','530','3519','3697','62','65','0','-3327.94','5329.47','-18.7903','0.115962','2739:0 2741:0 '),\n('2741','tero324','530','3519','3697','62','65','0','-3499.7','5387.05','-17.1808','2.91198','2740:0 2720:0 2721:0 '),\n('2742','tero325','530','3519','3519','62','65','0','-3184.45','5888','2.6866','3.28897','2729:0 2731:0 2732:0 2733:0 2743:0 2823:0 '),\n('2743','tero326','530','3519','3519','62','65','0','-3032.12','5978.81','4.34466','3.72093','2742:0 2823:0 '),\n('2744','tero327','530','3519','3697','62','65','0','-3134.88','4193.43','-7.28336','1.29796','2704:0 2705:0 2745:0 '),\n('2745','tero328','530','3519','3697','62','65','0','-3028.19','4178.94','-0.0653765','2.95906','2744:0 2746:0 '),\n('2746','tero329','530','3519','3519','62','65','0','-2977.23','4157.96','8.11812','3.04232','2745:0 2747:0 '),\n('2747','tero330','530','3519','3684','62','65','3','-2960.39','4073.83','2.27582','5.22886','2746:0 2748:0 '),\n('2748','tero331','530','3519','3684','62','65','3','-2931.59','3983.95','-0.908721','4.85187','2747:0 2749:0 '),\n('2749','tero332','530','3519','3519','62','65','2','-2826.95','3982.66','1.7483','3.08078','2748:0 2750:0 '),\n('2750','tero333','530','3519','3519','62','65','0','-2775.95','3939.94','2.93918','0.30046','2749:0 2751:0 '),\n('2751','tero334','530','3519','3519','62','65','0','-2653.89','3959.73','4.49025','3.42242','2750:0 2752:0 2791:0 '),\n('2752','tero335','530','3519','3519','62','65','0','-2556.49','4106.29','1.74147','4.38846','2751:0 2753:0 2790:0 '),\n('2753','tero336','530','3519','3519','62','65','0','-2371.13','4150.23','2.76251','3.40672','2752:0 2754:0 2763:0 '),\n('2754','tero337','530','3519','3519','62','65','0','-2284.4','4192.35','1.1876','3.57951','2753:0 2755:0 2763:0 '),\n('2755','tero338','530','3519','3675','62','65','0','-2258.83','4242.98','1.82659','4.04289','2754:0 2756:0 2763:0 '),\n('2756','tero339','530','3519','3519','62','65','0','-2454.44','4246.04','1.04828','6.28128','2755:0 2757:0 '),\n('2757','tero340','530','3519','3519','62','65','4','-2553.08','4300.19','21.2595','5.70952','2756:0 2758:0 '),\n('2758','tero341','530','3519','3683','62','65','5','-2594.46','4387.9','29.7655','5.39144','2757:0 2759:0 '),\n('2759','tero342','530','3519','3683','62','65','5','-2656.03','4422.89','36.1553','5.66241','2758:0 2760:0 '),\n('2760','tero343','530','3519','3683','62','65','4','-2719.28','4376.75','22.1052','0.28636','2759:0 2761:0 '),\n('2761','tero344','530','3519','3697','62','65','0','-2834.82','4335.44','5.95973','3.39654','2760:0 2762:0 '),\n('2762','tero345','530','3519','3697','62','65','0','-2909.54','4349.69','0.308415','2.08492','2761:0 2703:0 '),\n('2763','tero346','530','3519','3675','62','65','0','-2170.52','4243.01','5.56803','3.39654','2753:0 2754:0 2755:0 2764:0 2822:0 '),\n('2764','tero347','530','3519','3675','62','65','0','-2148.84','4189.65','7.46099','4.90842','2763:0 2765:0 2766:0 2822:0 '),\n('2765','tero348','530','3519','3519','62','65','0','-2169.46','4024.43','0.27975','4.58248','2764:0 2788:0 2793:0 '),\n('2766','tero349','530','3519','3675','62','65','0','-2043.89','4276.14','4.85305','3.85599','2764:0 2767:0 2780:0 2822:0 '),\n('2767','tero350','530','3519','3519','62','65','0','-2003.56','4443.33','7.66134','1.22491','2766:0 2768:0 2780:0 2785:0 2822:0 '),\n('2768','tero351','530','3519','3674','62','65','0','-1957.79','4600.09','4.55853','1.42126','2767:0 2769:0 2777:0 2780:0 2785:0 '),\n('2769','tero352','530','3519','3674','62','65','0','-1958.96','4765.62','-1.86355','1.51943','2768:0 2770:0 2785:0 2787:0 '),\n('2770','tero353','530','3519','3519','62','65','0','-1920.31','4893.8','2.58999','4.29189','2769:0 2681:0 2771:0 2787:0 '),\n('2771','tero354','530','3519','3674','62','65','0','-1767.42','4808.53','10.9381','2.60326','2770:0 2772:0 '),\n('2772','tero355','530','3519','3519','62','65','0','-1610.9','4687.94','-0.462587','3.37452','2771:0 2773:0 '),\n('2773','tero356','530','3519','3519','62','65','0','-1438.54','4646.53','23.7191','3.09413','2772:0 2774:0 '),\n('2774','tero357','530','3519','3689','62','65','0','-1505.3','4470.55','41.7643','1.30342','2773:0 2775:0 2779:0 '),\n('2775','tero358','530','3519','3674','62','65','0','-1652.18','4568.13','2.67411','5.85088','2774:0 2776:0 '),\n('2776','tero359','530','3519','3674','62','65','0','-1796.78','4588.16','10.9079','6.12577','2775:0 2777:0 2778:0 2780:0 '),\n('2777','tero360','530','3519','3674','62','65','0','-1895.32','4551.89','11.162','0.506242','2776:0 2768:0 2778:0 2780:0 2785:0 '),\n('2778','tero361','530','3519','3689','62','65','0','-1732.56','4448.64','2.34425','5.26889','2777:0 2776:0 2779:0 2780:0 '),\n('2779','tero362','530','3519','3689','62','65','0','-1608.22','4353.23','36.5945','1.16519','2778:0 2774:0 '),\n('2780','tero363','530','3519','3519','62','65','0','-1921.27','4373.25','1.92765','2.16501','2766:0 2767:0 2768:0 2776:0 2777:0 2778:0 2781:0 2822:0 '),\n('2781','tero364','530','3519','3519','62','65','0','-1840.29','4219.11','25.1803','2.004','2780:0 2782:0 2822:0 '),\n('2782','tero365','530','3519','3519','62','65','0','-1752.97','4184.94','57.0737','5.13381','2781:0 2783:0 2822:0 '),\n('2783','tero366','530','3519','3858','62','65','0','-1716.88','4074.81','63.5817','4.67042','2782:0 2784:0 '),\n('2784','tero367','530','3519','3858','62','65','0','-1691.82','3935.7','48.2267','4.84636','2783:0 2465:0 '),\n('2785','tero368','530','3519','3519','62','65','0','-2102.76','4635.13','-7.65692','2.95747','2767:0 2768:0 2769:0 2777:0 2786:0 '),\n('2786','tero369','530','3519','3519','62','65','0','-2257.36','4704.28','-0.0780256','1.2021','2785:0 '),\n('2787','tero370','530','3519','3519','62','65','0','-2070.88','4924.17','13.5597','3.10277','2680:0 2681:0 2682:0 2683:0 2684:0 2769:0 2770:0 '),\n('2788','tero371','530','3519','3519','62','65','0','-2246.8','3880.41','2.21742','1.23746','2765:0 2789:0 2793:0 '),\n('2789','tero372','530','3519','3519','62','65','0','-2340.28','3972.87','-13.2572','5.73387','2788:0 2790:0 2793:0 '),\n('2790','tero373','530','3519','3519','62','65','0','-2488.61','4019.54','0.242718','5.94199','2789:0 2752:0 2792:0 '),\n('2791','tero374','530','3519','3860','62','65','0','-2554.91','3912.09','9.61175','2.80825','2751:0 2792:0 '),\n('2792','tero375','530','3519','3860','62','65','0','-2485.03','3909.12','5.70774','1.75582','2791:0 2790:0 '),\n('2793','tero376','530','3519','3519','62','65','0','-2259.61','3793.94','0.912792','1.33958','2765:0 2788:0 2789:0 2794:0 2817:0 '),\n('2794','tero377','530','3519','3519','62','65','0','-2386.92','3640.31','1.09836','4.00208','2793:0 2795:0 2804:0 '),\n('2795','tero378','530','3519','3519','62','65','0','-2479.53','3552.42','1.40969','5.89488','2794:0 2796:0 2805:0 '),\n('2796','tero379','530','3519','3519','62','65','0','-2345.97','3468.35','-9.89249','2.70223','2795:0 2797:0 2805:0 '),\n('2797','tero380','530','3519','3519','62','65','0','-2312.38','3409.64','-11.2993','4.48901','2796:0 2798:0 '),\n('2798','tero381','530','3519','3681','62','65','0','-2354.51','3272.69','-1.60544','1.28851','2797:0 2799:0 '),\n('2799','tero382','530','3519','3681','62','65','0','-2370.38','3203.41','-1.58182','4.34763','2798:0 2800:0 2808:0 '),\n('2800','tero383','530','3519','3681','62','65','0','-2266.46','3160.45','-5.07597','2.81611','2799:0 2801:0 '),\n('2801','tero384','530','3519','3519','62','65','0','-2151','3259.96','-30.9173','0.993986','2800:0 2802:0 '),\n('2802','tero385','530','3519','3519','62','65','0','-2122.05','3416.4','-46.8967','4.54007','2801:0 2803:0 2817:0 '),\n('2803','tero386','530','3519','3519','62','65','0','-2185.17','3533.98','-39.5174','5.06236','2802:0 2804:0 2817:0 '),\n('2804','tero387','530','3519','3519','62','65','0','-2281.3','3632.39','-12.7757','5.10555','2803:0 2794:0 2817:0 '),\n('2805','tero388','530','3519','3519','62','65','0','-2591.73','3492.79','0.37378','0.569874','2795:0 2796:0 2806:0 '),\n('2806','tero389','530','3519','3519','62','65','0','-2706.59','3361.89','-0.445352','4.0649','2805:0 2807:0 2809:0 2810:0 '),\n('2807','tero390','530','3519','3519','62','65','0','-2599.6','3260.29','1.92252','2.39202','2806:0 2808:0 2809:0 '),\n('2808','tero391','530','3519','3519','62','65','0','-2474.91','3212.52','3.71098','0.644506','2807:0 2799:0 '),\n('2809','tero392','530','3519','3519','62','65','0','-2789.26','3261.1','5.82088','0.813367','2806:0 2807:0 3580:0 '),\n('2810','tero393','530','3519','3685','62','65','0','-2834.79','3413.38','-40.4077','5.88312','2806:0 2811:0 2816:0 '),\n('2811','tero394','530','3519','3519','62','65','0','-2792.39','3494.53','-29.9885','3.12636','2810:0 2812:0 '),\n('2812','tero395','530','3519','3685','62','65','0','-2893.22','3498.45','-28.8532','2.48233','2811:0 2813:0 '),\n('2813','tero396','530','3519','3685','62','65','0','-2966.27','3553.99','-6.76611','5.48021','2812:0 2814:0 '),\n('2814','tero397','530','3519','3685','62','65','0','-2986.16','3462.38','0.040144','1.25475','2813:0 2815:0 '),\n('2815','tero398','530','3519','3685','62','65','0','-2966.04','3366.93','-1.18287','0.0020256','2814:0 2816:0 '),\n('2816','tero399','530','3519','3519','62','65','0','-2877.47','3356.32','-19.7096','2.96298','2815:0 2810:0 '),\n('2817','tero400','530','3519','3519','62','65','0','-2096.95','3654.03','-54.8181','4.15287','2793:0 2802:0 2803:0 2804:0 2818:0 '),\n('2818','tero401','530','3519','3519','62','65','0','-2064.06','3807.53','1.04682','4.11754','2817:0 2819:0 '),\n('2819','tero402','530','3519','3676','62','65','0','-1908.63','3920.4','-2.85436','0.610731','2818:0 2820:0 2821:0 '),\n('2820','tero403','530','3519','3519','62','65','0','-1975.78','4077.99','-0.0257859','4.60841','2819:0 2821:0 2822:0 '),\n('2821','tero404','530','3519','3676','62','65','0','-2060.38','3925.05','-0.749629','0.524347','2820:0 2819:0 '),\n('2822','tero405','530','3519','3519','62','65','0','-1932.67','4229.67','0.0246133','4.45526','2763:0 2764:0 2766:0 2767:0 2780:0 2781:0 2782:0 2820:0 '),\n('2823','nag406','530','3518','3788','62','65','0','-2979.16','5983.95','6.75645','5.87684','2742:0 2743:0 2824:0 '),\n('2824','nag407','530','3518','3788','64','67','0','-2903.9','5958.93','14.5613','0.547909','2823:0 2825:0 '),\n('2825','nag408','530','3518','3788','64','67','0','-2695.32','6074.17','39.2839','0.398684','2824:0 2826:0 '),\n('2826','nag409','530','3518','3518','64','67','0','-2642.01','6196.52','35.4889','4.38459','2825:0 2827:0 2830:0 '),\n('2827','nag410','530','3518','3610','64','67','0','-2584.26','6153','22.5432','1.45591','2826:0 2828:0 2878:0 '),\n('2828','nag411','530','3518','3518','64','67','0','-2469.6','6354.46','29.3999','3.93692','2827:0 2829:0 2848:0 2868:0 '),\n('2829','nag412','530','3518','3518','64','67','0','-2598.81','6353.52','38.4982','4.67519','2828:0 2830:0 2848:0 '),\n('2830','nag413','530','3518','3518','64','67','0','-2647.16','6298.81','39.1645','4.36889','2829:0 2826:0 2831:0 '),\n('2831','nag414','530','3518','3518','64','67','0','-2698.48','6403.1','37.6375','5.24131','2830:0 2832:0 '),\n('2832','nag416','530','3518','3637','64','67','0','-2811.55','6437.45','63.1489','2.87099','2833:0 2834:0 2838:0 2831:0 '),\n('2833','nag417','530','3518','3637','64','67','0','-2883.12','6557.15','51.9561','5.05205','2832:0 2836:0 2839:0 '),\n('2834','nag418','530','3518','3637','64','67','0','-2866.92','6391.89','80.9253','0.732363','2832:0 2835:0 '),\n('2835','nag419','530','3518','3637','64','67','0','-2947.68','6377.55','94.6931','0.234009','2834:0 2836:0 2837:0 '),\n('2836','nag420','530','3518','3637','64','67','0','-2933.99','6526.24','74.3112','5.85317','2833:0 2835:0 '),\n('2837','nag421','530','3518','3637','64','67','0','-2858.26','6300.73','73.5168','2.16181','2835:0 2838:0 '),\n('2838','nag422','530','3518','3637','64','67','0','-2800.78','6320.06','63.9422','1.52171','2837:0 2832:0 '),\n('2839','nag423','530','3518','3518','64','67','0','-2813.58','6624.23','27.952','0.826629','2833:0 2840:0 2843:0 '),\n('2840','nag424','530','3518','3518','64','67','0','-2876.27','6701.94','18.9403','5.46206','2839:0 2841:0 '),\n('2841','nag425','530','3518','3518','64','67','0','-2695.5','6579.52','23.3102','2.71395','2840:0 2842:0 '),\n('2842','nag426','530','3518','3518','64','67','0','-2618.02','6729.9','-1.1338','4.0884','2841:0 2843:0 '),\n('2843','nag427','530','3518','3518','64','67','0','-2762.9','6813.59','-4.67732','4.5989','2839:0 2842:0 2844:0 2979:0 '),\n('2844','nag428','530','3518','3518','64','67','0','-2754.65','6993.51','-7.49834','4.92564','2843:0 2845:0 2979:0 2980:0 '),\n('2845','nag429','530','3518','3518','64','67','0','-2554.45','7061.91','-8.95898','0.31535','2844:0 2846:0 2849:0 '),\n('2846','nag430','530','3518','3518','64','67','0','-2401.18','6918.47','-1.9365','5.18482','2845:0 2847:0 2849:0 2860:0 2871:0 '),\n('2847','nag431','530','3518','3518','64','67','0','-2443.4','6718.82','0.5495','4.75286','2846:0 2848:0 2870:0 '),\n('2848','nag432','530','3518','3518','64','67','0','-2465.96','6485.46','18.388','4.48583','2847:0 2828:0 2829:0 '),\n('2849','nag433','530','3518','3518','64','67','0','-2495.17','7067.29','-6.61379','5.16519','2845:0 2846:0 2850:0 2860:0 '),\n('2850','nag434','530','3518','3518','64','67','2','-2545.1','7142.88','17.2089','5.26259','2849:0 2851:0 '),\n('2851','nag435','530','3518','3626','64','67','3','-2587.61','7240.05','13.2805','5.09373','2850:0 2852:0 2853:0 '),\n('2852','nag436','530','3518','3626','64','67','2','-2552.46','7299.13','13.4929','4.96416','2851:0 2855:0 '),\n('2853','nag437','530','3518','3626','64','67','2','-2670.89','7210.11','23.8723','0.310654','2851:0 2854:0 '),\n('2854','nag438','530','3518','3626','64','67','3','-2655.58','7280.08','30.7964','4.57931','2853:0 '),\n('2855','nag439','530','3518','3626','64','67','2','-2487.77','7333.59','-15.1601','0.389211','2852:0 2856:0 '),\n('2856','nag440','530','3518','3518','64','67','2','-2287.49','7419.75','-15.9035','3.46169','2855:0 2857:0 2913:0 '),\n('2857','nag441','530','3518','3518','64','67','0','-2167.73','7320.37','-34.5989','5.71198','2856:0 2912:0 2858:0 '),\n('2858','nag443','530','3518','3705','64','67','0','-2271.92','7267.29','-57.0529','4.8127','2859:0 2857:0 '),\n('2859','nag444','530','3518','3705','64','67','0','-2261.19','7161.5','-56.5907','4.81663','2860:0 2861:0 2858:0 '),\n('2860','nag445','530','3518','3518','64','67','0','-2347.48','7041.26','-12.5344','2.817','2859:0 2846:0 2849:0 '),\n('2861','nag447','530','3518','3705','64','67','0','-2116.24','7209.42','-112.779','5.97431','2859:0 2862:0 '),\n('2862','nag448','530','3518','3705','64','67','0','-1904.26','7175.34','-92.9691','3.12725','2863:0 2861:0 '),\n('2863','nag449','530','3518','3705','64','67','0','-1985.26','6900.65','-85.609','5.34993','2862:0 2864:0 '),\n('2864','nag450','530','3518','3518','64','67','0','-1848.57','6696.54','-53.151','5.40883','2863:0 2865:0 2872:0 '),\n('2865','nag451','530','3518','3518','64','67','0','-1730.63','6547.09','19.5667','5.00434','2864:0 2866:0 2872:0 2885:0 2889:0 '),\n('2866','nag452','530','3518','3518','64','67','0','-1929.46','6510.46','16.1863','2.96231','2865:0 2867:0 2885:0 2974:0 '),\n('2867','nag453','530','3518','3638','64','67','0','-2134.61','6517.76','14.0285','6.16673','2866:0 2868:0 2869:0 2885:0 '),\n('2868','nag454','530','3518','3518','64','67','0','-2312.35','6407.62','22.8307','0.6603','2867:0 2828:0 2869:0 '),\n('2869','nag455','530','3518','3518','64','67','0','-2275.72','6586.73','3.55526','5.16535','2868:0 2867:0 2870:0 2877:0 '),\n('2870','nag456','530','3518','3518','64','67','0','-2337.25','6706.87','-0.736603','5.08052','2869:0 2847:0 '),\n('2871','nag457','530','3518','3518','64','67','0','-2230.6','6874.1','-6.45156','5.78973','2846:0 '),\n('2872','nag458','530','3518','3518','64','67','0','-1596.41','6719.35','6.94102','2.95446','2865:0 2864:0 2873:0 2889:0 '),\n('2873','nag459','530','3518','3518','64','67','0','-1749.49','6887.02','-31.8672','3.0919','2872:0 2874:0 2902:0 '),\n('2874','nag460','530','3518','3705','64','67','0','-2033.22','6893.42','-39.0869','0.112087','2873:0 2875:0 '),\n('2875','nag461','530','3518','3638','64','67','0','-2099.87','6812.26','-29.9742','0.936751','2874:0 2876:0 '),\n('2876','nag462','530','3518','3638','64','67','0','-2097.69','6747.79','-3.22856','3.89457','2875:0 2877:0 '),\n('2877','nag463','530','3518','3638','64','67','0','-2181.79','6690.97','-0.800369','0.623385','2876:0 2869:0 '),\n('2878','nag464','530','3518','3610','64','67','0','-2569.73','6270.11','18.4891','5.91894','2827:0 2879:0 '),\n('2879','nag465','530','3518','3610','64','67','0','-2480.31','6262.64','30.7263','5.11194','2878:0 2880:0 '),\n('2880','nag466','530','3518','3610','64','67','0','-2447.6','6170.75','50.9756','3.42333','2879:0 2881:0 '),\n('2881','nag467','530','3518','3610','64','67','0','-2505.35','6175.86','59.938','5.6892','2880:0 2882:0 '),\n('2882','nag468','530','3518','3610','64','67','0','-2439.68','6122.93','84.0967','2.43372','2881:0 2883:0 '),\n('2883','nag469','530','3518','3610','64','67','0','-2332.91','6161.97','53.5534','0.177271','2882:0 2884:0 '),\n('2884','nag470','530','3518','3610','64','67','0','-2259.12','6100.84','76.839','2.48242','2883:0 '),\n('2885','nag471','530','3518','3518','64','67','0','-1938.01','6408.13','38.4565','3.95504','2865:0 2866:0 2867:0 2886:0 2974:0 '),\n('2886','nag472','530','3518','3518','64','67','0','-2080.87','6349.27','43.0054','5.9188','2885:0 2887:0 2974:0 '),\n('2887','nag473','530','3518','3634','64','67','0','-1853.87','6319.73','46.4678','2.96543','2886:0 2888:0 2974:0 '),\n('2888','nag474','530','3518','3518','64','67','0','-1699.25','6393.14','40.5718','0.499271','2887:0 2889:0 2973:0 '),\n('2889','nag475','530','3518','3518','64','67','0','-1534.13','6557.83','19.5951','2.01038','2872:0 2888:0 2865:0 2890:0 2973:0 '),\n('2890','nag476','530','3518','3518','64','67','0','-1482.81','6727.6','24.7441','1.27603','2889:0 2891:0 '),\n('2891','nag477','530','3518','3518','64','67','0','-1390.93','6854.77','28.5326','0.624149','2890:0 2902:0 2899:0 '),\n('2892','nag480','530','3518','3613','64','67','4','-1409.34','7112.02','33.814','1.09183','2893:0 2899:0 '),\n('2893','nag481','530','3518','3613','64','67','5','-1329.62','7212.68','33.1588','0.853479','2892:0 2894:0 2901:0 '),\n('2894','nag482','530','3518','3613','64','67','4','-1270.74','7314.59','33.6816','4.21027','2893:0 2895:0 '),\n('2895','nag483','530','3518','3613','64','67','4','-1220.36','7373.07','33.23','4.20635','2894:0 2896:0 2897:0 '),\n('2896','nag484','530','3518','3518','64','67','0','-1212.08','7477.88','22.0868','1.54857','2895:0 2908:0 2972:0 '),\n('2897','nag485','530','3518','3613','64','67','4','-1182.14','7317.1','34.1095','4.44589','2895:0 2898:0 '),\n('2898','nag486','530','3518','3613','64','67','4','-1195.71','7212.96','50.7515','1.47708','2897:0 2900:0 '),\n('2899','nag487','530','3518','3613','64','67','4','-1266.65','6971.73','37.8915','2.73527','2891:0 2892:0 2900:0 '),\n('2900','nag488','530','3518','3613','64','67','5','-1222.4','7167.59','57.2656','4.44744','2898:0 2901:0 2899:0 '),\n('2901','nag489','530','3518','3613','64','67','4','-1276.87','7200.65','48.3758','5.06006','2893:0 2900:0 '),\n('2902','nag491','530','3518','3518','64','67','0','-1550.75','6994.79','2.3684','5.6216','2891:0 2873:0 2903:0 '),\n('2903','nag492','530','3518','3518','64','67','0','-1663.57','7019.01','0.239528','1.55716','2902:0 2904:0 2910:0 '),\n('2904','nag493','530','3518','3518','64','67','0','-1624.79','7247.01','1.99533','4.52597','2903:0 2905:0 2910:0 '),\n('2905','nag494','530','3518','3518','64','67','0','-1561.04','7386.09','1.02012','0.650024','2904:0 2906:0 2909:0 '),\n('2906','nag495','530','3518','3518','64','67','0','-1369.87','7525.98','8.40119','6.06534','2905:0 2907:0 3014:0 '),\n('2907','nag496','530','3518','3628','64','67','0','-1342.35','7749.72','-4.85434','4.51025','2906:0 2908:0 3005:0 '),\n('2908','nag497','530','3518','3518','64','67','0','-1244.21','7675','9.34848','4.90297','2907:0 2896:0 2965:0 '),\n('2909','nag498','530','3518','3518','64','67','0','-1822.25','7460.83','-6.36199','6.02215','2905:0 2910:0 3017:0 '),\n('2910','nag499','530','3518','3518','64','67','0','-1788.32','7255.55','-7.10964','1.73702','2909:0 2904:0 2903:0 2911:0 '),\n('2911','nag500','530','3518','3518','64','67','0','-1876.28','7247.82','-15.0226','2.58134','2910:0 2912:0 '),\n('2912','nag501','530','3518','3518','64','67','0','-2010.2','7318.56','-33.8028','5.83525','2911:0 2857:0 '),\n('2913','nag502','530','3518','3518','64','67','0','-2284.88','7613.96','-8.38883','4.91632','2856:0 2914:0 2915:0 2928:0 '),\n('2914','nag503','530','3518','3518','64','67','0','-2110.77','7507.01','-30.9661','2.75255','2913:0 '),\n('2915','nag504','530','3518','3518','64','67','0','-2280.53','7760.34','-25.2768','3.08634','2913:0 2916:0 2928:0 2999:0 '),\n('2916','nag505','530','3518','3631','64','67','0','-2202.48','7982.31','-19.9501','4.31156','2915:0 2917:0 2930:0 2999:0 '),\n('2917','nag506','530','3518','3518','64','67','0','-2164.5','8163.38','-23.2432','1.37024','2916:0 2918:0 2930:0 2995:0 '),\n('2918','nag507','530','3518','3518','64','67','0','-2186.27','8355.19','-20.7293','1.74723','2917:0 2919:0 2931:0 2995:0 '),\n('2919','nag508','530','3518','3518','64','67','0','-2261.53','8552.19','-18.4527','1.93573','2918:0 2920:0 2931:0 2932:0 2933:0 '),\n('2920','nag509','530','3518','3631','64','67','0','-2454.9','8618.3','-25.5244','2.80359','2919:0 2921:0 2932:0 '),\n('2921','nag510','530','3518','3518','64','67','0','-2638.28','8663.06','-21.4046','2.94104','2920:0 2922:0 2932:0 '),\n('2922','nag511','530','3518','3631','64','67','0','-2824.97','8623.37','-27.21','4.0995','2921:0 2923:0 '),\n('2923','nag512','530','3518','3518','64','67','0','-2867.65','8450.08','-30.1391','4.44507','2922:0 2924:0 '),\n('2924','nag513','530','3518','3631','64','67','0','-2899.04','8250.79','-34.7269','4.57858','2923:0 2925:0 '),\n('2925','nag514','530','3518','3518','64','67','0','-2888.4','8048.68','-26.7216','5.47001','2924:0 2926:0 '),\n('2926','nag515','530','3518','3518','64','67','0','-2777.53','7867.47','-33.0086','5.33648','2925:0 2927:0 2984:0 '),\n('2927','nag516','530','3518','3518','64','67','0','-2646.42','7719.28','-30.5333','5.53675','2926:0 2928:0 2929:0 2984:0 '),\n('2928','nag517','530','3518','3518','64','67','0','-2469.37','7698.03','-17.5014','0.0114679','2915:0 2927:0 2913:0 2929:0 '),\n('2929','nag518','530','3518','3631','64','67','0','-2548.6','7872.59','-53.4948','1.39927','2928:0 2927:0 2930:0 '),\n('2930','nag519','530','3518','3631','64','67','0','-2377.16','8119.54','-42.3084','5.94673','2929:0 2916:0 2917:0 2931:0 '),\n('2931','nag520','530','3518','3631','64','67','0','-2383.8','8337.19','-39.2254','0.68063','2930:0 2918:0 2919:0 2932:0 '),\n('2932','nag521','530','3518','3631','64','67','0','-2489.29','8499.84','-36.8544','3.07375','2931:0 2920:0 2919:0 2921:0 '),\n('2933','nag522','530','3518','3518','64','67','0','-2206.87','8693.03','-3.10935','4.27148','2919:0 2934:0 2985:0 '),\n('2934','nag523','530','3518','3518','64','67','1','-2042.46','8705.35','18.0019','0.174061','2933:0 2935:0 '),\n('2935','nag524','530','3518','3518','64','67','0','-1841.7','8722.11','25.2892','5.96245','2934:0 2936:0 '),\n('2936','nag525','530','3518','3518','64','67','0','-1640.31','8750.19','32.1406','6.19414','2935:0 2937:0 2959:0 2987:0 '),\n('2937','nag526','530','3518','3518','64','67','0','-1515.41','8730.96','27.2727','5.36163','2936:0 2938:0 2959:0 2940:0 '),\n('2938','nag527','530','3518','3518','64','67','0','-1371.92','8548.95','11.8041','3.728','2937:0 2939:0 2944:0 2950:0 '),\n('2939','nag528','530','3518','3622','64','67','0','-1460.34','8490.57','4.09139','0.714427','2938:0 2943:0 3011:0 '),\n('2940','nag530','530','3518','3622','64','67','0','-1570.36','8600.16','4.98091','3.67147','2937:0 2941:0 2943:0 '),\n('2941','nag531','530','3518','3622','64','67','0','-1642.07','8541.56','-12.6482','5.37185','2942:0 2940:0 '),\n('2942','nag532','530','3518','3622','64','67','0','-1595.85','8476.21','-11.7076','0.541643','2941:0 2943:0 '),\n('2943','nag533','530','3518','3622','64','67','0','-1526.1','8519.38','1.01318','3.57721','2942:0 2939:0 2940:0 '),\n('2944','nag534','530','3518','3518','64','67','0','-1207.6','8431.13','20.2568','5.9334','2938:0 2945:0 2950:0 '),\n('2945','nag535','530','3518','3518','64','67','0','-1095.6','8405.41','20.4451','5.79204','2944:0 2946:0 2950:0 '),\n('2946','nag536','530','3518','3518','64','67','0','-953.793','8333.32','22.8678','0.0193606','2945:0 2947:0 2962:0 '),\n('2947','nag537','530','3518','3518','64','67','0','-745.188','8393.11','33.9484','0.313885','2946:0 2948:0 '),\n('2948','nag538','530','3518','3763','64','67','0','-588.034','8447.14','64.625','6.12976','2947:0 2949:0 '),\n('2949','nag539','530','3518','3763','64','67','0','-494.831','8433.32','38.1295','6.07479','2948:0 2585:0 '),\n('2950','nag540','530','3518','3518','64','67','0','-1168.9','8591.89','36.759','1.21709','2938:0 2944:0 2945:0 2951:0 2961:0 '),\n('2951','nag541','530','3518','3617','64','67','0','-1067.77','8749.39','84.4276','1.60586','2950:0 2952:0 '),\n('2952','nag542','530','3518','3617','64','67','0','-1080.66','8823.02','100.874','1.41736','2951:0 2953:0 '),\n('2953','nag543','530','3518','3617','64','67','0','-1090.98','8945.42','103.447','0.588767','2952:0 2954:0 '),\n('2954','nag544','530','3518','3617','64','67','0','-963.69','8887.28','146.6','3.44055','2953:0 2955:0 '),\n('2955','nag545','530','3518','3617','64','67','0','-868.709','8940.17','156.257','5.74571','2954:0 2956:0 '),\n('2956','nag546','530','3518','3617','64','67','0','-752.326','8861.16','182.978','4.2134','2955:0 2957:0 2958:0 '),\n('2957','nag547','530','3518','3617','64','67','0','-651.777','8791','201.252','0.180777','2956:0 '),\n('2958','nag553','530','3518','3617','64','67','0','-902.893','8685.38','170.054','1.29602','2956:0 '),\n('2959','nag554','530','3518','3625','64','67','0','-1431.81','8885.86','36.9729','1.07333','2936:0 2937:0 2960:0 2994:0 '),\n('2960','nag555','530','3518','3625','64','67','0','-1305.49','8958.42','58.5828','5.24728','2959:0 2961:0 '),\n('2961','nag556','530','3518','3518','64','67','0','-1225.12','8803.57','39.6271','4.88207','2960:0 2950:0 '),\n('2962','nag557','530','3518','3518','64','67','0','-968.504','8169.97','14.3663','5.25514','2946:0 2963:0 '),\n('2963','nag558','530','3518','3518','64','67','0','-917.128','8072.21','21.4411','5.19624','2962:0 2964:0 2966:0 '),\n('2964','nag559','530','3518','3518','64','67','0','-1020.93','7945.51','22.9619','4.026','2963:0 2965:0 2966:0 '),\n('2965','nag560','530','3518','3518','64','67','0','-1146.56','7828.51','14.0417','4.1548','2964:0 2908:0 '),\n('2966','nag561','530','3518','3616','64','67','0','-852.563','7887.28','40.6401','4.6339','2963:0 2964:0 2967:0 '),\n('2967','nag562','530','3518','3616','64','67','0','-830.358','7797.91','38.3027','4.69279','2966:0 2968:0 '),\n('2968','nag563','530','3518','3616','64','67','0','-829.954','7695.84','37.7371','5.2465','2967:0 2969:0 '),\n('2969','nag564','530','3518','3616','64','67','0','-783.358','7540.05','60.9113','5.00303','2968:0 2970:0 '),\n('2970','nag565','530','3518','3518','64','67','0','-763.166','7451.73','58.8323','4.56714','2969:0 2971:0 '),\n('2971','nag566','530','3518','3518','64','67','0','-933.691','7394.83','34.4282','3.14949','2970:0 2972:0 '),\n('2972','nag567','530','3518','3518','64','67','0','-1090.44','7395.57','33.0234','2.48583','2971:0 2896:0 '),\n('2973','nag568','530','3518','3518','64','67','1','-1409.72','6385.4','38.2999','5.37255','2671:0 2888:0 2889:0 '),\n('2974','nag569','530','3518','3634','64','67','0','-2075.76','6274.62','62.3128','0.289453','2866:0 2885:0 2886:0 2887:0 2975:0 '),\n('2975','nag571','530','3518','3518','64','67','0','-2094.97','6179.79','87.9183','1.00219','2974:0 2976:0 '),\n('2976','nag572','530','3518','3761','64','67','0','-2030.06','6071.21','119.672','4.93705','2977:0 2975:0 '),\n('2977','nag573','530','3518','3761','64','67','0','-2001.22','5972.22','151.597','6.26043','2976:0 2978:0 '),\n('2978','nag574','530','3518','3761','64','67','0','-1946.52','5928.39','150.948','1.91915','2977:0 '),\n('2979','nag575','530','3518','3518','64','67','0','-2897.91','6988.92','-35.6052','0.23407','2843:0 2844:0 2980:0 '),\n('2980','nag576','530','3518','3518','64','67','0','-2847.89','7102.5','-8.05767','2.77876','2979:0 2844:0 2981:0 '),\n('2981','nag577','530','3518','3518','64','67','0','-2912.74','7175.13','-2.27885','1.70277','2980:0 2982:0 '),\n('2982','nag578','530','3518','3518','64','67','0','-2935.1','7301.43','3.27707','1.53784','2981:0 2983:0 '),\n('2983','nag579','530','3518','3518','64','67','0','-2902.48','7467.17','2.79586','1.43181','2982:0 2984:0 '),\n('2984','nag580','530','3518','3518','64','67','0','-2802.19','7645.35','-6.45531','0.870248','2983:0 2926:0 2927:0 '),\n('2985','nag581','530','3518','3633','64','67','0','-2196.09','8827.81','16.1506','4.59461','2933:0 2986:0 '),\n('2986','nag582','530','3518','3633','64','67','0','-2071.65','8894.1','28.0157','0.506613','2985:0 2987:0 '),\n('2987','nag583','530','3518','3518','64','67','0','-1884.01','8889.41','36.2099','5.7138','2936:0 2986:0 2988:0 '),\n('2988','nag584','530','3518','3518','64','67','0','-1916.54','9091.13','52.9111','1.74753','2987:0 2989:0 '),\n('2989','nag585','530','3518','3624','64','67','0','-1849.22','9237.75','70.9999','5.57243','2988:0 2990:0 '),\n('2990','nag586','530','3518','3624','64','67','0','-1755.41','9160.76','79.5049','5.59599','2989:0 2991:0 '),\n('2991','nag587','530','3518','3518','64','67','0','-1651.3','9137.62','86.3008','5.99261','2990:0 2992:0 '),\n('2992','nag588','530','3518','3518','64','67','0','-1545.69','9099.13','82.8122','5.48996','2991:0 2993:0 '),\n('2993','nag589','530','3518','3625','64','67','0','-1448.69','9002.9','57.299','5.25434','2992:0 2994:0 '),\n('2994','nag590','530','3518','3625','64','67','0','-1419.87','8948.03','58.9144','6.12613','2993:0 2959:0 '),\n('2995','nag591','530','3518','3518','64','67','0','-2052.37','8225.22','-6.54776','2.94922','2917:0 2918:0 2996:0 '),\n('2996','nag592','530','3518','3518','64','67','0','-1986.35','8210.53','0.797534','4.84989','2995:0 2997:0 3000:0 '),\n('2997','nag593','530','3518','3518','64','67','0','-2024.61','8154.98','1.25254','4.1077','2996:0 2998:0 '),\n('2998','nag594','530','3518','3518','64','67','0','-2103.83','8063.36','2.18912','4.10771','2997:0 2999:0 '),\n('2999','nag595','530','3518','3518','64','67','0','-2156.48','7911.49','-11.2008','4.37866','2998:0 2916:0 2915:0 '),\n('3000','nag596','530','3518','3628','64','67','0','-1840.26','7999.74','-24.7446','2.3484','2996:0 3001:0 '),\n('3001','nag597','530','3518','3628','64','67','0','-1746.01','7996.18','-27.0075','3.06865','3000:0 3002:0 '),\n('3002','nag598','530','3518','3628','64','67','0','-1653.08','7993.42','-26.6535','6.25344','3001:0 3006:0 '),\n('3003','nag600','530','3518','3628','64','67','0','-1550.22','7929.2','-21.6393','6.03352','3004:0 3006:0 '),\n('3004','nag601','530','3518','3628','64','67','0','-1483.84','7905.42','-19.2864','5.65261','3003:0 3005:0 '),\n('3005','nag602','530','3518','3628','64','67','0','-1404.2','7842.35','-18.1886','5.40914','3004:0 2907:0 '),\n('3006','nag603','530','3518','3628','64','67','0','-1554.58','7990.68','-21.1856','3.99937','3002:0 3003:0 3007:0 3008:0 '),\n('3007','nag604','530','3518','3628','64','67','0','-1601.1','7865.59','-22.0744','4.70386','3012:0 3006:0 '),\n('3008','nag605','530','3518','3628','64','67','0','-1478.18','8079.45','-21.4921','0.88839','3009:0 3006:0 '),\n('3009','nag606','530','3518','3518','64','67','0','-1517.43','8229.34','-15.3084','1.82694','3008:0 3010:0 '),\n('3010','nag607','530','3518','3622','64','67','0','-1508.91','8347.15','-12.1475','1.98089','3009:0 3011:0 '),\n('3011','nag608','530','3518','3622','64','67','0','-1502.91','8432.5','-0.939562','0.853047','3010:0 2939:0 '),\n('3012','nag609','530','3518','3628','64','67','0','-1604.12','7762.81','-21.7436','1.48608','3007:0 3013:0 3015:0 '),\n('3013','nag610','530','3518','3518','64','67','0','-1587.52','7621.15','-10.2326','4.91826','3012:0 3014:0 3015:0 '),\n('3014','nag611','530','3518','3518','64','67','0','-1475.29','7596.72','-5.21911','5.69972','3013:0 2906:0 3015:0 '),\n('3015','nag612','530','3518','3628','64','67','0','-1647.6','7686.9','-14.3996','0.653543','3013:0 3014:0 3012:0 3016:0 '),\n('3016','nag613','530','3518','3518','64','67','0','-1703.41','7669.14','-14.3192','3.85013','3015:0 3017:0 '),\n('3017','nag614','530','3518','3518','64','67','0','-1781.28','7605.53','-8.7957','3.82657','3016:0 2909:0 '),\n('3018','zang615','530','3521','3521','64','67','0','794.211','5932.33','57.6977','1.47191','2647:0 2648:0 2670:0 3019:0 '),\n('3019','zang616','530','3521','3521','64','67','0','820.771','6049.46','79.8283','4.84129','3018:0 3020:0 '),\n('3020','bedg617','530','3522','3767','65','70','0','882.952','5919.73','115.632','0.505885','3019:0 3021:0 '),\n('3021','bedg618','530','3522','3767','65','70','0','942.091','5960.21','121.279','0.600133','3020:0 3022:0 '),\n('3022','bedg619','530','3522','3522','65','70','0','1067.62','6060.89','132.716','0.256129','3021:0 3023:0 '),\n('3023','bedg620','530','3522','3522','65','70','0','1132.44','6081.19','153.605','5.97461','3022:0 3024:0 '),\n('3024','bedg621','530','3522','3522','65','70','0','1202.41','6057.05','164.269','5.95105','3023:0 3025:0 '),\n('3025','bedg622','530','3522','3522','65','70','0','1278.35','5993.43','168.127','5.58584','3024:0 3026:0 '),\n('3026','bedg623','530','3522','3522','65','70','0','1406.14','6036.86','152.292','0.476827','3025:0 3027:0 '),\n('3027','bedg624','530','3522','3522','65','70','0','1466.01','6069.6','133.93','6.17882','3026:0 3028:0 '),\n('3028','bedg625','530','3522','3522','65','70','0','1591.09','6047.48','128.651','6.21023','3027:0 3029:0 '),\n('3029','bedg626','530','3522','3768','65','70','0','1713.44','6043.35','143.923','6.2495','3028:0 3030:0 3049:0 '),\n('3030','bedg627','530','3522','3768','65','70','0','1762.72','5869.71','155.631','4.98895','3029:0 3031:0 3049:0 '),\n('3031','bedg628','530','3522','3833','65','70','0','1802.41','5792.15','188.129','6.12384','3030:0 3032:0 '),\n('3032','bedg629','530','3522','3833','65','70','0','1865.39','5786.05','215.307','4.78866','3031:0 3033:0 '),\n('3033','bedg631','530','3522','3833','65','70','0','1882.59','5668.18','256.167','1.82379','3034:0 3037:0 3032:0 '),\n('3034','bedg632','530','3522','3833','65','70','0','2046.5','5630.87','263.828','6.03743','3033:0 3035:0 3036:0 3037:0 3040:0 '),\n('3035','bedg633','530','3522','3922','65','70','0','2186.78','5679.45','267.903','1.53317','3034:0 3236:0 '),\n('3036','bedg634','530','3522','3833','65','70','0','2078.91','5730.76','265.935','3.74408','3034:0 3037:0 '),\n('3037','bedg635','530','3522','3833','65','70','0','1986.76','5663.91','265.451','5.29919','3036:0 3034:0 3033:0 3038:0 '),\n('3038','bedg636','530','3522','3918','65','70','0','1882.53','5595.86','256.211','0.429695','3037:0 3039:0 '),\n('3039','bedg637','530','3522','3918','65','70','3','1913.85','5539.89','265.641','4.76903','3038:0 3040:0 '),\n('3040','bedg638','530','3522','3918','65','70','3','1980.47','5572.14','258.131','2.97243','3039:0 3034:0 3041:0 '),\n('3041','bedg639','530','3522','3833','65','70','0','1818.29','5603','261.471','3.82655','3040:0 3042:0 3048:0 '),\n('3042','bedg640','530','3522','3918','65','70','0','1800.72','5550.99','267.48','2.61311','3041:0 3043:0 3047:0 '),\n('3043','bedg641','530','3522','3919','65','70','0','1708.89','5566.11','265.641','3.36316','3042:0 3047:0 3235:0 '),\n('3044','bedg643','530','3522','3919','65','70','0','1564.28','5423.88','265.088','1.83317','3045:0 3235:0 '),\n('3045','bedg644','530','3522','3919','65','70','0','1534.04','5541.59','258.021','1.3761','3044:0 3046:0 '),\n('3046','bedg645','530','3522','3919','65','70','0','1599.86','5605.47','266.783','0.413989','3045:0 3047:0 '),\n('3047','bedg646','530','3522','3919','65','70','0','1692.34','5649.63','265.597','5.29918','3046:0 3043:0 3042:0 3048:0 '),\n('3048','bedg647','530','3522','3919','65','70','0','1775.77','5678.9','267.502','5.25597','3041:0 3047:0 '),\n('3049','bedg648','530','3522','3768','65','70','0','1827.31','6004.38','138.57','2.3814','3029:0 3030:0 3050:0 '),\n('3050','bedg649','530','3522','3768','65','70','0','1934.89','5992.25','140.661','0.472881','3049:0 3051:0 3087:0 '),\n('3051','bedg650','530','3522','3768','65','70','0','2035.37','6038.3','145.555','3.92079','3050:0 3052:0 3087:0 '),\n('3052','bedg651','530','3522','3768','65','70','0','2098.1','5939.59','137.134','5.31486','3051:0 3053:0 3087:0 '),\n('3053','bedg652','530','3522','3831','65','70','0','2140.78','5883.29','138.074','5.36983','3052:0 3054:0 '),\n('3054','bedg653','530','3522','3831','65','70','0','2169.87','5811.41','120.231','1.97692','3053:0 3055:0 '),\n('3055','bedg654','530','3522','3831','65','70','0','2156.44','5731.77','120.753','4.55303','3054:0 3056:0 '),\n('3056','bedg655','530','3522','3831','65','70','0','2209.5','5671.79','127.813','5.09887','3055:0 3057:0 '),\n('3057','bedg656','530','3522','3831','65','70','0','2242.52','5586.84','144.63','4.98106','3056:0 3058:0 '),\n('3058','bedg657','530','3522','3831','65','70','0','2242.64','5516.54','161.969','4.74938','3057:0 3059:0 '),\n('3059','bedg658','530','3522','3831','65','70','0','2266.32','5460.89','147.107','3.73228','3058:0 3060:0 3061:0 '),\n('3060','bedg659','530','3522','3831','65','70','0','2243.22','5409.52','144.241','3.16286','3061:0 3059:0 '),\n('3061','bedg660','530','3522','3831','65','70','0','2184.26','5427.04','144.314','3.26496','3060:0 3062:0 3059:0 '),\n('3062','bedg661','530','3522','3831','65','70','0','2056.91','5452.67','144.871','3.87757','3061:0 3063:0 '),\n('3063','bedg662','530','3522','3831','65','70','0','1986.16','5372.79','148.912','3.58305','3062:0 3064:0 '),\n('3064','bedg663','530','3522','3831','65','70','0','1869.19','5342.55','144.553','3.39455','3063:0 3065:0 '),\n('3065','bedg664','530','3522','3831','65','70','0','1844.86','5256.68','138.071','1.36038','3064:0 3066:0 '),\n('3066','bedg666','530','3522','3831','65','70','0','1882.44','5202','150.044','6.2809','3065:0 3067:0 '),\n('3067','bedg668','530','3522','3831','65','70','0','1942.47','5157.81','163.104','1.47426','3066:0 3068:0 '),\n('3068','bedg670','530','3522','3831','65','70','0','1859.25','5091.18','146.37','4.69048','3067:0 3069:0 '),\n('3069','bedg672','530','3522','3831','65','70','0','1892.19','4998.98','146.563','5.3777','3070:0 3068:0 '),\n('3070','bedg673','530','3522','3827','65','70','0','1882.75','4918.05','144.661','4.59623','3069:0 3071:0 3079:0 '),\n('3071','bedg674','530','3522','3827','65','70','0','1970.05','4876.31','143.046','5.83716','3070:0 3072:0 3078:0 '),\n('3072','bedg675','530','3522','3844','65','70','0','2066.28','4886.71','148.962','0.107673','3071:0 3073:0 '),\n('3073','bedg676','530','3522','3844','65','70','0','2113.18','4914.06','149.085','6.14739','3072:0 3074:0 '),\n('3074','bedg677','530','3522','3827','65','70','0','2197.61','4955.01','153.824','2.65786','3073:0 3075:0 3232:0 '),\n('3075','bedg678','530','3522','3844','65','70','5','2122.42','4767.11','145.442','4.39595','3074:0 3076:0 3077:0 '),\n('3076','bedg679','530','3522','3844','65','70','5','2051.79','4712.94','149.377','4.14775','3075:0 '),\n('3077','bedg680','530','3522','3844','65','70','4','2045.43','4756.7','142.832','3.24454','3075:0 3078:0 '),\n('3078','bedg681','530','3522','3827','65','70','0','1924.25','4753.97','143.374','3.15815','3077:0 3071:0 3079:0 '),\n('3079','bedg682','530','3522','3827','65','70','0','1818.76','4741.32','143.599','3.17386','3078:0 3080:0 3081:0 3070:0 '),\n('3080','bedg683','530','3522','3783','65','70','0','1763.5','4636.75','148.572','2.17246','3081:0 3079:0 '),\n('3081','bedg684','530','3522','3827','65','70','0','1721.08','4751.46','141.246','2.47877','3080:0 3082:0 3079:0 '),\n('3082','bedg685','530','3522','3827','65','70','0','1671.81','4805.51','144.067','1.15537','3081:0 3083:0 '),\n('3083','bedg686','530','3522','3827','65','70','0','1716.64','4889.56','168.716','1.08076','3082:0 3084:0 '),\n('3084','bedg690','530','3522','3779','65','70','0','1764.57','5020.59','169.786','2.98533','3083:0 3085:0 '),\n('3085','bedg691','530','3522','3779','65','70','0','1689.52','5029.67','171.17','6.17405','3086:0 3084:0 '),\n('3086','bedg692','530','3522','3779','65','70','0','1644.1','5086.59','174.824','5.08627','3085:0 '),\n('3087','bedg693','530','3522','3768','65','70','0','2051.36','6085.99','147.268','1.58417','3050:0 3051:0 3052:0 3088:0 3094:0 '),\n('3088','bedg694','530','3522','3768','65','70','0','2163.29','6091.67','144.685','6.16931','3087:0 3089:0 3093:0 '),\n('3089','bedg695','530','3522','3769','65','70','5','2276.18','6049.52','143.141','5.80411','3088:0 3090:0 '),\n('3090','bedg696','530','3522','3769','65','70','4','2338.36','6031.21','142.438','2.8196','3089:0 3091:0 '),\n('3091','bedg697','530','3522','3769','65','70','5','2384.95','6054.49','138.162','1.60222','3090:0 3092:0 '),\n('3092','bedg698','530','3522','3768','65','70','0','2372.13','6149.95','128.725','3.20443','3091:0 3093:0 3160:0 '),\n('3093','bedg699','530','3522','3768','65','70','0','2265.65','6155.81','138.179','3.41256','3092:0 3088:0 '),\n('3094','bedg700','530','3522','3768','65','70','0','2028.28','6216.03','134.538','4.67706','3087:0 3095:0 '),\n('3095','bedg701','530','3522','3771','65','70','0','2041.4','6592.18','135.807','3.54607','3094:0 3096:0 3102:0 '),\n('3096','bedg702','530','3522','3772','65','70','3','2066.72','6735.02','154.854','4.59066','3095:0 3097:0 3101:0 '),\n('3097','bedg703','530','3522','3772','65','70','2','1972.28','6779.92','162.128','1.46478','3096:0 3098:0 '),\n('3098','bedg704','530','3522','3772','65','70','2','1959.55','6842.15','158.876','3.29476','3097:0 3099:0 3105:0 '),\n('3099','bedg705','530','3522','3772','65','70','3','2065.72','6849.09','172.562','0.0589211','3098:0 3100:0 '),\n('3100','bedg706','530','3522','3772','65','70','2','2135.82','6829.36','173.431','4.65351','3099:0 3101:0 '),\n('3101','bedg707','530','3522','3772','65','70','2','2140.28','6753.83','165.006','3.40472','3100:0 3096:0 '),\n('3102','bedg708','530','3522','3771','65','70','0','1952.24','6615.86','143.542','5.85751','3095:0 3103:0 3104:0 '),\n('3103','bedg709','530','3522','3771','65','70','0','1869.68','6608.28','143.783','2.00906','3102:0 3104:0 '),\n('3104','bedg710','530','3522','3771','65','70','0','1867.3','6714.18','142.554','2.81017','3102:0 3103:0 3105:0 '),\n('3105','bedg711','530','3522','3771','65','70','0','1794.79','6806.46','137.334','0.147653','3104:0 3098:0 3106:0 3125:0 '),\n('3106','bedg712','530','3522','3782','65','70','0','1698.35','6823.85','136.031','2.50777','3105:0 3107:0 3112:0 3113:0 '),\n('3107','bedg713','530','3522','3782','65','70','0','1660.38','6861.71','142.107','2.01886','3106:0 3108:0 '),\n('3108','bedg714','530','3522','3782','65','70','0','1628.86','6909.46','152.556','2.54312','3107:0 3109:0 '),\n('3109','bedg715','530','3522','3782','65','70','0','1565.97','6934.47','157.679','0.579622','3108:0 3110:0 '),\n('3110','bedg716','530','3522','3782','65','70','0','1642.57','6995.64','157.952','6.01458','3109:0 3111:0 '),\n('3111','bedg717','530','3522','3782','65','70','0','1706.57','6967.44','152.552','5.15456','3110:0 3112:0 '),\n('3112','bedg718','530','3522','3782','65','70','0','1749.11','6892.32','140.635','4.05192','3111:0 3106:0 '),\n('3113','bedg719','530','3522','3782','65','70','0','1636.12','6812.12','131.714','0.187751','3106:0 3114:0 3124:0 '),\n('3114','bedg720','530','3522','3782','65','70','0','1569.95','6826.69','128.23','3.23117','3113:0 3115:0 '),\n('3115','bedg721','530','3522','3522','65','70','0','1487.42','6820.82','107.218','2.83454','3114:0 3116:0 '),\n('3116','bedg722','530','3522','3522','65','70','0','1418.63','6847.18','110.541','2.77564','3115:0 3117:0 '),\n('3117','bedg723','530','3522','3522','65','70','0','1357.84','6881.95','95.233','5.88189','3116:0 3118:0 '),\n('3118','bedg724','530','3522','3522','65','70','0','1305.01','6962.51','93.0961','3.03875','3117:0 3119:0 '),\n('3119','bedg725','530','3522','3522','65','70','0','1224.71','6978.54','90.3881','2.59893','3118:0 3120:0 '),\n('3120','bedg726','530','3522','3522','65','70','0','1145.67','7048.89','113.579','2.41436','3119:0 3121:0 '),\n('3121','bedg727','530','3522','3522','65','70','2','1107.87','7095.02','122.35','3.18012','3120:0 3122:0 '),\n('3122','bedg728','530','3522','3770','65','70','2','1053.11','7098.72','116.217','0.376251','3121:0 3123:0 '),\n('3123','bedg729','530','3522','3770','65','70','2','1020.4','7173.65','86.2439','1.66823','3122:0 2628:0 '),\n('3124','bedg730','530','3522','3824','65','70','0','1647.1','6732.39','116.704','4.75248','3113:0 3125:0 '),\n('3125','bedg731','530','3522','3771','65','70','0','1740.86','6736.89','134.249','0.774434','3124:0 3105:0 3126:0 '),\n('3126','bedg732','530','3522','3824','65','70','0','1628.32','6690.04','108.29','6.13869','3125:0 3127:0 '),\n('3127','bedg733','530','3522','3824','65','70','0','1723.61','6678.08','87.8644','5.8481','3126:0 3128:0 '),\n('3128','bedg734','530','3522','3824','65','70','0','1772.91','6642.19','74.5483','2.51408','3127:0 3129:0 '),\n('3129','bedg735','530','3522','3824','65','70','0','1619.66','6621.4','33.3376','3.64899','3128:0 3130:0 '),\n('3130','bedg736','530','3522','3824','65','70','0','1761.7','6532.98','4.13407','5.72636','3129:0 3131:0 3263:0 '),\n('3131','bedg737','530','3522','3824','65','70','0','1936.85','6455.82','1.98027','5.87558','3130:0 3132:0 3261:0 '),\n('3132','bedg738','530','3522','3824','65','70','0','2158.79','6394.21','-10.3376','6.01302','3131:0 3133:0 '),\n('3133','bedg739','530','3522','3931','65','70','0','2352.32','6410.86','-10.3378','0.246553','3132:0 3134:0 3136:0 '),\n('3134','bedg740','530','3522','3773','65','70','0','2401.13','6465.38','3.57212','0.140524','3133:0 3135:0 '),\n('3135','bedg741','530','3522','3773','65','70','0','2489.83','6479','-6.94094','0.898433','3134:0 3136:0 3137:0 '),\n('3136','bedg742','530','3522','3931','65','70','0','2486.13','6407.7','-10.338','3.05435','3135:0 3133:0 3143:0 '),\n('3137','bedg743','530','3522','3773','65','70','0','2546.35','6560.09','1.844','4.13898','3135:0 3138:0 3139:0 3140:0 3142:0 '),\n('3138','bedg744','530','3522','3773','65','70','0','2667.31','6519.19','0.94932','5.95717','3137:0 '),\n('3139','bedg745','530','3522','3773','65','70','0','2613.6','6682.32','23.1547','1.02881','3137:0 3142:0 '),\n('3140','bedg746','530','3522','3773','65','70','0','2376.02','6637.4','10.9828','6.02394','3137:0 3141:0 '),\n('3141','bedg747','530','3522','3773','65','70','0','2482.22','6684.55','0.72676','5.48987','3140:0 3142:0 '),\n('3142','bedg748','530','3522','3773','65','70','0','2570.07','6610.1','7.6561','4.0683','3141:0 3137:0 3139:0 '),\n('3143','bedg749','530','3522','3931','65','70','0','2625.59','6357.13','-10.3379','0.0313585','3136:0 3144:0 3150:0 '),\n('3144','bedg750','530','3522','3862','65','70','0','2747.24','6390.91','2.251','5.27782','3143:0 3145:0 '),\n('3145','bedg751','530','3522','3862','65','70','0','2871.51','6233.27','11.692','5.37992','3144:0 3146:0 3150:0 '),\n('3146','bedg752','530','3522','3862','65','70','0','2980.33','6146.77','4.99801','5.25426','3145:0 3147:0 '),\n('3147','bedg753','530','3522','3826','65','70','0','3036.46','6073.22','0.772358','5.36224','3146:0 3148:0 '),\n('3148','bedg754','530','3522','3826','65','70','0','3098.88','6022.32','1.18446','4.5042','3147:0 3149:0 '),\n('3149','bedg755','530','3522','3826','65','70','0','3081.27','5967.39','-10.3385','2.55249','3148:0 3150:0 3154:0 '),\n('3150','bedg756','530','3522','3825','65','70','0','2759.83','6108.29','-10.3396','6.08285','3145:0 3149:0 3143:0 3151:0 3157:0 '),\n('3151','bedg757','530','3522','3825','65','70','1','2685.12','5895.26','-16.1123','4.71862','3150:0 3152:0 '),\n('3152','bedg758','530','3522','3825','65','70','0','2687.78','5785.12','-16.8636','4.73433','3151:0 3153:0 '),\n('3153','bedg759','530','3522','3904','65','70','0','2695.75','5583.37','-10.6374','4.75001','3152:0 '),\n('3154','bedg760','530','3522','3826','65','70','0','3126.83','5854.78','-10.3341','5.52444','3149:0 3155:0 3156:0 '),\n('3155','bedg761','530','3522','3826','65','70','0','3287.4','5738.99','-10.3325','5.79933','3154:0 3156:0 3161:0 '),\n('3156','bedg762','530','3522','3826','65','70','0','3281.88','5854.49','-1.4584','3.21929','3155:0 3154:0 3161:0 '),\n('3157','bedg763','530','3522','3825','65','70','0','2582.1','6136.86','24.0804','4.49162','3150:0 3158:0 '),\n('3158','bedg765','530','3522','3825','65','70','0','2521.32','6015.69','84.9349','2.22967','3157:0 3159:0 '),\n('3159','bedg767','530','3522','3768','65','70','0','2494.15','6124.82','111.3','1.62492','3160:0 3158:0 '),\n('3160','bedg768','530','3522','3768','65','70','0','2427.5','6152.5','122.621','2.74804','3159:0 3092:0 '),\n('3161','bedg769','530','3522','3826','65','70','0','3383.33','5729.17','-10.3389','3.41014','3155:0 3156:0 3162:0 3163:0 3172:0 '),\n('3162','bedg770','530','3522','3777','65','70','0','3452.63','5809.98','1.12407','0.865436','3161:0 3164:0 '),\n('3163','bedg771','530','3522','3826','65','70','0','3520','5691.54','-10.3386','6.05377','3161:0 3164:0 '),\n('3164','bedg772','530','3522','3777','65','70','0','3523.18','5795.46','1.6669','1.53041','3163:0 3162:0 3165:0 '),\n('3165','bedg773','530','3522','3826','65','70','0','3589.57','5684.17','-10.2714','6.25066','3164:0 3166:0 '),\n('3166','bedg774','530','3522','3774','65','70','0','3660.48','5491.29','-20.7025','5.0647','3165:0 3171:0 '),\n('3167','bedg775','530','3522','3774','65','70','0','3641.58','5308.33','-20.5148','5.3867','3168:0 3171:0 '),\n('3168','bedg776','530','3522','3774','65','70','0','3587.11','5221.49','14.2925','1.80371','3169:0 3167:0 '),\n('3169','bedg777','530','3522','3774','65','70','0','3438.2','5241.29','-6.61032','0.307527','3168:0 '),\n('3170','bedg779','530','3522','3774','65','70','0','3593.15','5382.62','-9.51038','0.0970404','3171:0 '),\n('3171','bedg780','530','3522','3774','65','70','0','3651.06','5374.99','-20.2357','1.49502','3170:0 3166:0 3167:0 '),\n('3172','bedg781','530','3522','3826','65','70','0','3233.27','5636.21','38.3515','5.69295','3161:0 3173:0 '),\n('3173','bedg782','530','3522','3826','65','70','0','3303.69','5597.03','55.3332','6.0071','3172:0 3174:0 '),\n('3174','bedg783','530','3522','3826','65','70','0','3374.58','5579.62','85.0975','4.19284','3173:0 3175:0 '),\n('3175','bedg784','530','3522','3828','65','70','0','3306.73','5468.57','141.818','6.03852','3174:0 3176:0 3179:0 '),\n('3176','bedg785','530','3522','3828','65','70','0','3389.48','5461.86','145.745','4.75047','3175:0 3177:0 '),\n('3177','bedg786','530','3522','3829','65','70','0','3363.88','5342.13','147.792','3.91795','3176:0 3178:0 '),\n('3178','bedg787','530','3522','3829','65','70','0','3286','5287.73','147.247','2.3825','3177:0 3179:0 3182:0 '),\n('3179','bedg788','530','3522','3828','65','70','0','3187.06','5468.2','146.95','2.07226','3178:0 3175:0 3180:0 '),\n('3180','bedg789','530','3522','3828','65','70','0','3116.13','5482.01','145.293','4.71905','3179:0 3181:0 3183:0 '),\n('3181','bedg790','530','3522','3829','65','70','0','3130.15','5332.98','148.604','4.94682','3180:0 3182:0 '),\n('3182','bedg791','530','3522','3829','65','70','0','3215.6','5360.26','142.29','5.42984','3181:0 3178:0 '),\n('3183','bedg792','530','3522','3828','65','70','0','2956.95','5583.27','146.351','5.04498','3180:0 3184:0 3186:0 '),\n('3184','bedg793','530','3522','3952','65','70','0','2952.85','5779.65','134.692','1.27116','3183:0 3185:0 '),\n('3185','bedg794','530','3522','3952','65','70','0','3050.1','5991.54','130.725','1.20636','3184:0 3238:0 '),\n('3186','bedg795','530','3522','3951','65','70','1','2949.59','5525.69','144.16','2.62095','3183:0 3187:0 '),\n('3187','bedg796','530','3522','3828','65','70','0','2915.37','5365.92','147.713','1.64902','3186:0 3188:0 '),\n('3188','bedg797','530','3522','3867','65','70','0','2973.41','5294.89','183.643','6.14688','3187:0 3189:0 '),\n('3189','bedg798','530','3522','3867','65','70','0','3038.23','5281.8','219.214','4.54468','3188:0 3190:0 '),\n('3190','bedg799','530','3522','3867','65','70','0','3021.8','5214.18','250.296','5.00414','3189:0 3191:0 '),\n('3191','bedg800','530','3522','3867','65','70','0','3082.54','5063.01','264.326','4.87847','3190:0 3192:0 3211:0 3212:0 '),\n('3192','bedg801','530','3522','3867','65','70','0','3099.95','4980.23','265.505','6.22935','3191:0 3193:0 3218:0 3221:0 '),\n('3193','bedg802','530','3522','3867','65','70','0','3304.97','4970.79','264.838','5.68742','3192:0 3194:0 3210:0 '),\n('3194','bedg803','530','3522','3867','65','70','0','3434.24','4937.21','262.546','5.47143','3193:0 3195:0 3209:0 3210:0 '),\n('3195','bedg804','530','3522','3867','65','70','0','3574.68','4758.04','240.131','5.37718','3194:0 3196:0 3202:0 '),\n('3196','bedg805','530','3522','3863','65','70','0','3564.29','4641.89','228.617','3.77105','3195:0 3197:0 '),\n('3197','bedg806','530','3522','3863','65','70','0','3459.92','4594.26','206.487','3.08147','3196:0 3198:0 3199:0 '),\n('3198','bedg807','530','3522','3962','65','70','0','3346.24','4594.8','221.66','2.70055','3197:0 '),\n('3199','bedg808','530','3522','3863','65','70','0','3393.49','4543.75','179.957','4.49519','3197:0 3200:0 '),\n('3200','bedg809','530','3522','3863','65','70','0','3360.85','4462.38','157.372','4.73472','3199:0 3201:0 3269:0 '),\n('3201','bedg810','530','3522','3863','65','70','0','3368.28','4367.62','122.375','1.75021','3200:0 3269:0 '),\n('3202','bedg811','530','3522','3866','65','70','0','3701.21','4770.37','244.343','1.75806','3195:0 3203:0 '),\n('3203','bedg812','530','3522','3866','65','70','0','3761.47','4802.74','254.61','1.73842','3202:0 3204:0 '),\n('3204','bedg813','530','3522','3866','65','70','0','3738.29','4879.52','256.491','2.75944','3203:0 3205:0 '),\n('3205','bedg814','530','3522','3866','65','70','0','3668.47','4898.18','260.046','1.56956','3204:0 3206:0 '),\n('3206','bedg815','530','3522','3866','65','70','0','3668.33','5008.48','266.738','4.7465','3205:0 3207:0 3208:0 '),\n('3207','bedg816','530','3522','3866','65','70','0','3732.68','5010.06','273.797','4.86824','3206:0 '),\n('3208','bedg817','530','3522','3866','65','70','0','3581.65','5022.38','265.138','6.01885','3206:0 3209:0 '),\n('3209','bedg818','530','3522','3866','65','70','0','3523.16','4984.99','269.146','3.77261','3208:0 3194:0 '),\n('3210','bedg819','530','3522','3867','65','70','0','3312.28','5066.6','254.195','4.73865','3193:0 3194:0 3211:0 '),\n('3211','bedg820','530','3522','3867','65','70','0','3243.07','5149.71','260.466','2.97621','3210:0 3191:0 '),\n('3212','bedg821','530','3522','3942','65','70','0','2961.39','5151.76','265.026','5.66383','3191:0 3213:0 3217:0 '),\n('3213','bedg822','530','3522','3942','65','70','0','2940.58','5217.19','264.835','2.79713','3212:0 3214:0 '),\n('3214','bedg823','530','3522','3942','65','70','0','2844.64','5234.99','267.298','3.70426','3213:0 3215:0 '),\n('3215','bedg824','530','3522','3942','65','70','0','2724.25','5157.06','265.076','3.71605','3214:0 3216:0 3222:0 '),\n('3216','bedg825','530','3522','3867','65','70','0','2816.5','5099.67','265.683','5.72666','3215:0 3217:0 '),\n('3217','bedg826','530','3522','3867','65','70','0','2900.18','5096.37','265.127','0.775502','3212:0 3216:0 3218:0 3221:0 '),\n('3218','bedg827','530','3522','3787','65','70','0','2929.12','4947.5','266.731','4.91062','3192:0 3217:0 3219:0 3221:0 '),\n('3219','bedg828','530','3522','3787','65','70','0','2898.72','4782.92','277.957','4.52971','3218:0 3220:0 '),\n('3220','bedg829','530','3522','3787','65','70','0','2984.26','4824.35','278.892','1.56875','3219:0 3221:0 '),\n('3221','bedg830','530','3522','3787','65','70','0','2852.35','4933.54','267.974','6.12327','3220:0 3218:0 3192:0 3217:0 '),\n('3222','bedg831','530','3522','3833','65','70','0','2545.57','5293.37','266.598','6.1005','3215:0 3223:0 3237:0 '),\n('3223','bedg832','530','3522','3833','65','70','0','2456.71','5321.66','264.923','2.73899','3222:0 3224:0 3230:0 3237:0 '),\n('3224','bedg833','530','3522','3833','65','70','0','2282.88','5171.44','264.676','3.69325','3223:0 3225:0 3230:0 '),\n('3225','bedg834','530','3522','3953','65','70','0','2194.7','5122.32','258.602','4.28623','3224:0 3226:0 '),\n('3226','bedg835','530','3522','3953','65','70','0','2189.16','5051.76','252.603','2.1395','3225:0 3227:0 '),\n('3227','bedg836','530','3522','3953','65','70','0','2116.51','5085.08','256.974','5.94279','3226:0 3228:0 3231:0 '),\n('3228','bedg837','530','3522','3953','65','70','0','2090.4','5162.61','265.04','2.37496','3227:0 3229:0 3233:0 '),\n('3229','bedg838','530','3522','3953','65','70','0','2063.34','5235.11','265.179','0.122197','3228:0 3230:0 '),\n('3230','bedg839','530','3522','3833','65','70','0','2316.24','5243.18','261.206','0.031876','3229:0 3224:0 3223:0 '),\n('3231','bedg840','530','3522','3953','65','70','0','2089.3','5022.57','223.769','0.835746','3227:0 3232:0 '),\n('3232','bedg841','530','3522','3953','65','70','0','2164.72','5005.6','178.623','5.23199','3231:0 3074:0 '),\n('3233','bedg842','530','3522','3953','65','70','0','1740.09','5133.27','265.058','3.33132','3228:0 3234:0 '),\n('3234','bedg843','530','3522','3919','65','70','0','1674.61','5254.04','265.321','1.92546','3233:0 3235:0 '),\n('3235','bedg844','530','3522','3919','65','70','0','1612.29','5464.5','265.941','1.8587','3234:0 3044:0 3043:0 '),\n('3236','bedg845','530','3522','3833','65','70','0','2395.42','5588.73','267.895','5.88623','3035:0 3237:0 '),\n('3237','bedg846','530','3522','3833','65','70','0','2397.69','5390.93','264.287','4.72385','3236:0 3223:0 3222:0 '),\n('3238','bedg847','530','3522','3954','65','70','0','3094.62','6101.88','130.589','1.3065','3185:0 3239:0 '),\n('3239','bedg848','530','3522','3954','65','70','0','3120.37','6181.58','137.697','1.30738','3238:0 3240:0 '),\n('3240','bedg849','530','3522','3954','65','70','0','3147.57','6248.67','124.212','0.486635','3239:0 3241:0 '),\n('3241','bedg850','530','3522','3954','65','70','0','3217.19','6289.41','124.654','1.62939','3240:0 3242:0 '),\n('3242','bedg851','530','3522','3954','65','70','0','3215.71','6365.94','119.805','1.02856','3241:0 3243:0 '),\n('3243','bedg852','530','3522','3954','65','70','0','3279.94','6464.48','149.929','0.887189','3242:0 3244:0 '),\n('3244','bedg853','530','3522','3830','65','70','0','3323.9','6505.86','159.443','0.796868','3243:0 3245:0 3260:0 '),\n('3245','bedg854','530','3522','3781','65','70','0','3488.68','6673.14','148.361','0.895043','3244:0 3246:0 3260:0 '),\n('3246','bedg855','530','3522','3781','65','70','0','3566.67','6807.32','137.289','2.01031','3245:0 3247:0 3256:0 '),\n('3247','bedg856','530','3522','3830','65','70','0','3446.01','7089.42','152.831','1.97497','3246:0 3248:0 3250:0 3251:0 '),\n('3248','bedg857','530','3522','3830','65','70','0','3286.14','7143.51','168.873','3.41617','3247:0 3249:0 '),\n('3249','bedg858','530','3522','3830','65','70','0','3303.87','6962.97','164.125','0.482707','3248:0 3250:0 '),\n('3250','bedg859','530','3522','3830','65','70','0','3360.25','6980.78','163.409','0.305992','3249:0 3247:0 '),\n('3251','bedg860','530','3522','3903','65','70','0','3481.37','7222.76','141.365','1.30345','3247:0 3252:0 '),\n('3252','bedg861','530','3522','3903','65','70','0','3590.93','7211.94','137.85','5.43858','3251:0 3253:0 '),\n('3253','bedg862','530','3522','3903','65','70','0','3641.59','7154.45','142.814','5.19904','3252:0 3254:0 '),\n('3254','bedg863','530','3522','3903','65','70','0','3697.31','7047.11','149.054','4.94771','3253:0 3255:0 '),\n('3255','bedg864','530','3522','3830','65','70','0','3765.97','6838.37','141.277','4.82598','3254:0 3256:0 '),\n('3256','bedg865','530','3522','3781','65','70','0','3736.74','6702.81','136.262','4.17018','3246:0 3255:0 3257:0 '),\n('3257','bedg866','530','3522','3781','65','70','0','3630.09','6582.49','134.163','3.31724','3256:0 3258:0 '),\n('3258','bedg867','530','3522','3781','65','70','0','3502.63','6555.2','131.654','3.74921','3257:0 3259:0 '),\n('3259','bedg868','530','3522','3830','65','70','0','3447.34','6507.7','134.998','3.17979','3258:0 3260:0 '),\n('3260','bedg869','530','3522','3830','65','70','0','3367.73','6538.54','150.282','2.78317','3244:0 3259:0 3245:0 '),\n('3261','bedg870','530','3522','3824','65','70','0','1832.55','6314.24','0.000980531','2.39439','3131:0 3262:0 '),\n('3262','bedg871','530','3522','3824','65','70','0','1739.41','6384.91','-10.3385','3.01878','3261:0 3263:0 '),\n('3263','bedg872','530','3522','3776','65','70','0','1654.93','6407.76','-10.1815','2.87741','3262:0 3130:0 3264:0 '),\n('3264','bedg873','530','3522','3776','65','70','0','1604.99','6316.74','1.22794','4.18509','3263:0 3265:0 '),\n('3265','bedg874','530','3522','3824','65','70','0','1475.3','6532.8','-10.3385','5.60273','3264:0 3266:0 '),\n('3266','bedg876','530','3522','3778','65','70','0','1361.1','6534.43','6.43101','6.15055','3265:0 3267:0 '),\n('3267','bedg877','530','3522','3778','65','70','0','1339.54','6590.17','-8.16829','2.78314','3268:0 3266:0 '),\n('3268','bedg878','530','3522','3778','65','70','0','1355.69','6688.28','-22.7054','2.60447','3267:0 '),\n('3269','net880','530','3523','3868','67','70','0','3385.12','4257.44','122.681','4.84713','3200:0 3201:0 3270:0 '),\n('3270','net881','530','3523','3523','67','70','0','3394.02','4139.94','151.096','1.574','3269:0 3271:0 '),\n('3271','net883','530','3523','3523','67','70','0','3433.77','4036.61','177.446','4.57617','3272:0 3270:0 '),\n('3272','net884','530','3523','3523','67','70','0','3443.07','3946.93','166.449','4.15205','3271:0 3273:0 '),\n('3273','net885','530','3523','3523','67','70','0','3403.88','3894.6','153.082','3.72008','3272:0 3274:0 '),\n('3274','net886','530','3523','3523','67','70','0','3356.69','3870.95','144.623','4.91389','3273:0 3275:0 3284:0 3285:0 '),\n('3275','net887','530','3523','3523','67','70','0','3379','3814.14','142.822','4.46228','3274:0 3276:0 '),\n('3276','net888','530','3523','3725','67','70','0','3356.46','3730.03','141.12','5.51863','3275:0 3277:0 '),\n('3277','net889','530','3523','3725','67','70','0','3395.58','3698.26','144.989','5.91132','3276:0 3278:0 '),\n('3278','net890','530','3523','3725','67','70','0','3463.55','3674.25','150.706','4.98848','3277:0 3279:0 '),\n('3279','net891','530','3523','3725','67','70','0','3489.72','3601.83','158.293','4.35231','3278:0 3280:0 '),\n('3280','net892','530','3523','3725','67','70','0','3537.5','3575.94','135.389','2.48697','3279:0 3281:0 '),\n('3281','net893','530','3523','3725','67','70','0','3582.4','3548.11','124.35','1.42276','3280:0 3282:0 '),\n('3282','net894','530','3523','3721','67','70','0','3601.15','3625.27','127.148','2.16889','3281:0 3283:0 '),\n('3283','net895','530','3523','3725','67','70','0','3506.7','3744.78','141.004','1.82724','3282:0 3284:0 '),\n('3284','net896','530','3523','3523','67','70','0','3492.41','3820.83','138.898','2.78542','3283:0 3274:0 '),\n('3285','net897','530','3523','3523','67','70','0','3288.33','3814.38','139.103','3.2089','3274:0 3286:0 '),\n('3286','net898','530','3523','3523','67','70','0','3228.8','3802.26','137.833','3.34242','3285:0 3287:0 3318:0 3319:0 '),\n('3287','net899','530','3523','3712','67','70','0','3127.16','3690.44','142.929','3.42881','3286:0 3318:0 3319:0 3324:0 '),\n('3288','net903','530','3523','3712','67','70','0','2999.35','3698.08','144.031','2.76314','3289:0 3315:0 3323:0 3316:0 '),\n('3289','net904','530','3523','3712','67','70','0','2922.84','3722.08','143.833','1.69299','3290:0 3288:0 '),\n('3290','net905','530','3523','3523','67','70','0','2885.06','3679.8','140.256','0.687686','3289:0 3291:0 '),\n('3291','net906','530','3523','3523','67','70','0','2816.99','3697.81','120.765','3.2795','3290:0 3292:0 '),\n('3292','net907','530','3523','3523','67','70','0','2757.67','3673.48','134.526','2.26241','3291:0 3293:0 3336:0 '),\n('3293','net908','530','3523','3729','67','70','0','2719.32','3721.32','139.083','3.091','3292:0 3294:0 '),\n('3294','net909','530','3523','3729','67','70','0','2639.32','3732.64','144.622','2.23884','3293:0 3295:0 '),\n('3295','net910','530','3523','3729','67','70','0','2585.42','3776.42','143.482','2.4509','3294:0 3296:0 3339:0 '),\n('3296','net911','530','3523','3729','67','70','0','2514.06','3815.49','129.888','2.12889','3295:0 3297:0 '),\n('3297','net912','530','3523','3729','67','70','0','2508.94','3883.67','132.691','1.6655','3296:0 3298:0 '),\n('3298','net913','530','3523','3729','67','70','0','2477.31','4067.17','130.201','5.03879','3297:0 3299:0 '),\n('3299','net914','530','3523','3523','67','70','0','2545.65','4202.77','136.176','0.542382','3298:0 3300:0 '),\n('3300','net915','530','3523','3523','67','70','0','2609.03','4303.08','140.386','0.000453472','3299:0 3301:0 '),\n('3301','net916','530','3523','3726','67','70','0','2747.27','4290.97','151.997','6.19723','3300:0 3302:0 '),\n('3302','net917','530','3523','3726','67','70','0','2895.85','4349.05','157.653','4.53219','3301:0 3303:0 '),\n('3303','net918','530','3523','3726','67','70','0','2865.03','4280.18','159.366','5.10554','3302:0 3304:0 '),\n('3304','net919','530','3523','3726','67','70','0','2890.62','4215.62','164.008','5.09376','3303:0 3305:0 3312:0 '),\n('3305','net920','530','3523','3726','67','70','0','2940.62','4199.62','164.007','0.322464','3304:0 3306:0 3311:0 '),\n('3306','net921','530','3523','3726','67','70','0','2999.27','4224.49','160.851','0.401004','3305:0 3307:0 '),\n('3307','net922','530','3523','3726','67','70','0','3026.75','4163.73','153.291','4.74035','3306:0 3308:0 '),\n('3308','net923','530','3523','3726','67','70','0','3010.04','4106.05','150.967','4.08455','3307:0 3309:0 '),\n('3309','net924','530','3523','3726','67','70','0','2977.7','4033.08','148.218','1.89329','3308:0 3310:0 3313:0 '),\n('3310','net925','530','3523','3726','67','70','0','2939.58','4099.08','162.599','2.04252','3309:0 3311:0 '),\n('3311','net926','530','3523','3726','67','70','0','2918.39','4149.56','164.008','1.96398','3310:0 3305:0 3312:0 '),\n('3312','net927','530','3523','3726','67','70','0','2870.91','4167.67','164.007','1.92863','3311:0 3304:0 '),\n('3313','net928','530','3523','3523','67','70','0','2982.92','3921.89','146.316','1.62627','3309:0 3314:0 '),\n('3314','net929','530','3523','3523','67','70','0','3051.56','3890.86','143.683','5.83993','3313:0 3315:0 '),\n('3315','net930','530','3523','3712','67','70','0','3039.6','3790.04','145.363','4.28485','3314:0 3317:0 3288:0 '),\n('3316','net931','530','3523','3712','67','70','0','3064.35','3704.05','142.478','3.15387','3288:0 3324:0 '),\n('3317','net932','530','3523','3523','67','70','0','3092.9','3822.62','142.74','5.9106','3315:0 3318:0 '),\n('3318','net933','530','3523','3523','67','70','0','3125.95','3779.17','142.072','0.118293','3317:0 3287:0 3286:0 '),\n('3319','net934','530','3523','3523','67','70','0','3196.76','3711.71','129.813','5.90669','3287:0 3286:0 3320:0 '),\n('3320','net935','530','3523','3523','67','70','0','3253.35','3630.84','126.607','3.66438','3319:0 3321:0 '),\n('3321','net936','530','3523','3523','67','70','0','3139.27','3579.06','142.77','3.24419','3320:0 3322:0 '),\n('3322','net937','530','3523','3712','67','70','0','3046.95','3595.34','143.235','1.59486','3321:0 3325:0 3324:0 '),\n('3323','net938','530','3523','3712','1','60','0','2935.94','3648.71','132.577','0.379446','3288:0 3324:0 '),\n('3324','net939','530','3523','3712','67','70','1','3062.95','3645.68','144.33','5.51596','3287:0 3322:0 3323:0 3316:0 '),\n('3325','net940','530','3523','3523','67','70','0','3016.58','3539.17','143.581','3.54657','3322:0 3326:0 3340:0 '),\n('3326','net941','530','3523','3523','67','70','0','2859.55','3471.67','136.322','0.389269','3325:0 3327:0 3334:0 '),\n('3327','net942','530','3523','3723','67','70','0','2805.81','3360.76','144.743','4.68931','3326:0 3328:0 '),\n('3328','net944','530','3523','3723','67','70','0','2802.57','3251.58','147.597','1.60466','3327:0 3329:0 '),\n('3329','net945','530','3523','3723','67','70','0','2769.35','3153.34','149.314','2.61194','3330:0 3328:0 '),\n('3330','net946','530','3523','3723','67','70','0','2713.25','3168.67','147.073','4.21416','3329:0 3331:0 '),\n('3331','net947','530','3523','3721','67','70','0','2645.59','3055.71','123.459','0.911553','3330:0 3332:0 3347:0 3348:0 '),\n('3332','net948','530','3523','3723','67','70','0','2635.1','3154.85','135.257','1.35923','3331:0 3333:0 '),\n('3333','net949','530','3523','3523','67','70','0','2617.24','3347.94','142.696','1.66554','3332:0 3334:0 3337:0 '),\n('3334','net950','530','3523','3523','67','70','0','2742.84','3444.31','140.23','4.12776','3333:0 3326:0 3335:0 '),\n('3335','net951','530','3523','3523','67','70','0','2704.66','3571.67','134.738','5.57132','3334:0 3336:0 '),\n('3336','net952','530','3523','3523','67','70','0','2828.97','3612.56','157.278','2.2157','3335:0 3292:0 '),\n('3337','net953','530','3523','3721','67','70','0','2522.14','3469.45','130.706','1.47151','3333:0 3338:0 '),\n('3338','net954','530','3523','3523','67','70','0','2544.17','3592.01','138.626','1.39297','3337:0 3339:0 '),\n('3339','net955','530','3523','3721','67','70','0','2528.36','3697.54','134.608','0.964924','3338:0 3295:0 '),\n('3340','net956','530','3523','3523','67','70','0','3051.39','3455.12','118.577','4.822','3325:0 3341:0 '),\n('3341','net957','530','3523','3523','67','70','0','3057.51','3309.81','106.678','5.00264','3340:0 3342:0 '),\n('3342','net958','530','3523','3721','67','70','0','3103.15','3197.03','101.208','5.67416','3341:0 3343:0 3344:0 '),\n('3343','net959','530','3523','3721','67','70','0','3221.06','3114.67','102.79','5.68986','3342:0 3385:0 3386:0 '),\n('3344','net960','530','3523','3921','67','70','0','2987.27','3194.73','134.342','4.05624','3342:0 3345:0 '),\n('3345','net961','530','3523','3921','67','70','0','2929.07','3149.43','147.291','1.12512','3344:0 3346:0 '),\n('3346','net962','530','3523','3721','67','70','0','2829.63','2992.81','120.478','2.75876','3345:0 3347:0 '),\n('3347','net963','530','3523','3721','67','70','0','2726.18','3015.49','121.825','2.99045','3346:0 3331:0 '),\n('3348','net964','530','3523','3721','67','70','0','2519.49','2940.34','119.757','3.88108','3331:0 3349:0 '),\n('3349','net965','530','3523','3730','67','70','0','2455.26','2867.95','131.925','4.34839','3348:0 3350:0 3354:0 '),\n('3350','net966','530','3523','3730','67','70','0','2531.85','2827','126.995','4.61936','3351:0 3349:0 '),\n('3351','net967','530','3523','3730','67','70','0','2555.92','2738.68','119.45','1.55822','3350:0 3352:0 3376:0 '),\n('3352','net970','530','3523','3730','67','70','0','2501.34','2718.83','131.657','2.74617','3353:0 3351:0 3375:0 '),\n('3353','net971','530','3523','3730','67','70','0','2440.85','2747.78','134.493','2.69511','3354:0 3356:0 3352:0 '),\n('3354','net972','530','3523','3730','67','70','0','2424.83','2798.75','134.493','1.0929','3353:0 3355:0 3349:0 '),\n('3355','net973','530','3523','3730','67','70','0','2364.39','2781.17','133.656','5.81904','3354:0 3356:0 '),\n('3356','net974','530','3523','3730','67','70','0','2392.65','2726.98','134.491','5.0199','3353:0 3355:0 3357:0 '),\n('3357','net975','530','3523','3730','67','70','0','2364.76','2665.91','130.977','1.12433','3356:0 3358:0 '),\n('3358','net976','530','3523','3523','67','70','0','2326','2600.19','126.548','4.98456','3357:0 3359:0 '),\n('3359','net977','530','3523','3523','67','70','0','2287.03','2439.79','104.053','4.47406','3358:0 3360:0 '),\n('3360','net978','530','3523','3523','67','70','0','2336.37','2367.16','115.816','5.18877','3359:0 3373:0 3361:0 '),\n('3361','net979','530','3523','3523','67','70','0','2310.67','2271.59','98.2741','5.2673','3360:0 3362:0 3367:0 '),\n('3362','net981','530','3523','3935','67','70','0','2246.67','2310.26','89.8977','3.71223','3363:0 3372:0 3361:0 '),\n('3363','net982','530','3523','3934','67','70','0','2176.86','2262.3','76.0387','4.01068','3362:0 3364:0 3372:0 '),\n('3364','net983','530','3523','3934','67','70','0','2119.56','2206.31','71.3039','6.1607','3363:0 3365:0 '),\n('3365','net984','530','3523','3934','67','70','0','2180.34','2173.31','71.6002','5.61288','3364:0 3366:0 '),\n('3366','net985','530','3523','3934','67','70','0','2233.52','2115.22','71.2016','2.29655','3365:0 3367:0 '),\n('3367','net987','530','3523','3934','67','70','0','2294.17','2189.49','93.5883','6.28047','3368:0 3361:0 3366:0 '),\n('3368','net990','530','3523','3934','67','70','0','2353.3','2183.05','89.3993','6.15874','3367:0 3369:0 '),\n('3369','net991','530','3523','3879','67','70','0','2411.12','2183.37','89.9985','4.94529','3368:0 3370:0 '),\n('3370','net992','530','3523','3879','67','70','0','2523.75','2185.83','102.693','5.98201','3369:0 3371:0 '),\n('3371','net993','530','3523','3879','67','70','0','2484.6','2033.27','88.1469','4.36606','3370:0 '),\n('3372','net997','530','3523','3935','67','70','0','2183.73','2382.64','98.0661','5.72675','3362:0 3363:0 '),\n('3373','net999','530','3523','3837','67','70','0','2400.24','2395.93','142.613','3.9737','3374:0 3360:0 '),\n('3374','net1000','530','3523','3837','67','70','0','2482.84','2424.13','134.571','3.45533','3373:0 3375:0 '),\n('3375','net1001','530','3523','3523','67','70','0','2516.55','2638.79','129.583','6.18383','3374:0 3352:0 3376:0 '),\n('3376','net1003','530','3523','3523','67','70','0','2599.94','2630.3','129.384','5.99453','3351:0 3375:0 3377:0 '),\n('3377','net1004','530','3523','3721','67','70','0','2697.9','2608.37','102.479','0.0883238','3378:0 3376:0 '),\n('3378','net1005','530','3523','3721','67','70','0','2824.9','2626.19','104.537','0.139375','3377:0 3379:0 '),\n('3379','net1006','530','3523','3523','67','70','0','2944.38','2624.27','115.88','6.27726','3378:0 3380:0 '),\n('3380','net1007','530','3523','3523','67','70','0','3044.31','2606.49','109.94','6.10839','3379:0 3381:0 3410:0 '),\n('3381','net1008','530','3523','3523','67','70','0','3088.57','2759.93','115.588','1.28997','3380:0 3382:0 '),\n('3382','net1009','530','3523','3523','67','70','0','3181.15','2839.31','132.63','0.00191784','3381:0 3383:0 '),\n('3383','net1010','530','3523','3877','67','70','0','3314.68','2857.1','140.864','0.174705','3382:0 3384:0 3394:0 '),\n('3384','net1011','530','3523','3523','67','70','0','3251.04','2889.15','139.525','5.61752','3383:0 3385:0 '),\n('3385','net1012','530','3523','3523','67','70','0','3260.45','2979.53','133.71','1.72431','3384:0 3343:0 '),\n('3386','net1013','530','3523','3721','67','70','0','3328.19','3109.33','123.938','0.003479','3343:0 3387:0 '),\n('3387','net1014','530','3523','3721','67','70','0','3467.09','3253.66','100.83','0.804579','3386:0 3388:0 '),\n('3388','net1015','530','3523','3523','67','70','0','3558.21','3192.19','105.717','5.68976','3387:0 3389:0 '),\n('3389','net1016','530','3523','3877','67','70','0','3523.96','3113.12','130.592','4.30353','3388:0 3390:0 '),\n('3390','net1017','530','3523','3877','67','70','0','3511.13','3048.77','142.826','5.09678','3389:0 3391:0 '),\n('3391','net1018','530','3523','3877','67','70','0','3536.43','3000.68','143.097','5.20281','3390:0 3395:0 3392:0 '),\n('3392','net1020','530','3523','3877','67','70','0','3646.43','3045.04','123.609','0.195882','3391:0 3393:0 '),\n('3393','net1021','530','3523','3523','67','70','0','3924.41','3119.4','115.634','0.278359','3526:0 3392:0 '),\n('3394','net1022','530','3523','3877','67','70','1','3410.82','2878.14','142.972','0.18804','3383:0 3395:0 3396:0 '),\n('3395','net1023','530','3523','3877','67','70','0','3473.27','2973.11','143.266','0.989146','3394:0 3391:0 '),\n('3396','net1024','530','3523','3877','67','70','0','3472.55','2819.87','145.201','4.69465','3394:0 3397:0 '),\n('3397','net1025','530','3523','3523','67','70','0','3576.26','2719.73','151.525','3.15525','3396:0 3398:0 '),\n('3398','net1026','530','3523','3523','67','70','0','3439.56','2608.19','150.833','0.802981','3397:0 3399:0 '),\n('3399','net1027','530','3523','3523','67','70','0','3372.76','2617.96','145.564','2.25596','3398:0 3400:0 3403:0 '),\n('3400','net1028','530','3523','3727','67','70','0','3328.76','2674.02','157.504','3.71287','3399:0 3401:0 '),\n('3401','net1029','530','3523','3727','67','70','0','3250.52','2628.38','139.888','2.91962','3400:0 3402:0 '),\n('3402','net1030','530','3523','3523','67','70','0','3285.42','2563.6','113.658','4.09772','3401:0 3403:0 '),\n('3403','net1031','530','3523','3523','67','70','0','3352.87','2536.5','95.7401','1.21138','3399:0 3402:0 3404:0 '),\n('3404','net1033','530','3523','3728','67','70','0','3246.86','2379.03','91.5897','4.38044','3403:0 3405:0 '),\n('3405','net1035','530','3523','3728','67','70','0','3241.13','2272.31','99.5301','4.56501','3404:0 3406:0 '),\n('3406','net1037','530','3523','3728','67','70','0','3202.86','2140.94','138.867','1.63547','3423:0 3405:0 3407:0 '),\n('3407','net1039','530','3523','3728','67','70','0','3162.82','2326.75','134.887','1.78864','3406:0 3408:0 '),\n('3408','net1040','530','3523','3728','67','70','0','3160.48','2406.47','131.04','1.60014','3409:0 3407:0 '),\n('3409','net1041','530','3523','3728','67','70','0','3113.17','2449.04','120.183','2.1774','3408:0 3410:0 '),\n('3410','net1042','530','3523','3728','67','70','0','3069.26','2504.52','114.18','1.78077','3409:0 3380:0 3411:0 '),\n('3411','net1043','530','3523','3734','67','70','0','3083.75','2363.04','144.526','4.81242','3410:0 3412:0 '),\n('3412','net1044','530','3523','3734','67','70','0','3085.33','2294.83','150.494','4.74173','3411:0 3413:0 3419:0 '),\n('3413','net1045','530','3523','3734','67','70','0','3125.61','2238.22','150.562','3.67359','3412:0 3414:0 '),\n('3414','net1046','530','3523','3734','67','70','0','3074.15','2209.78','161.33','3.55578','3413:0 3415:0 '),\n('3415','net1047','530','3523','3734','67','70','0','3017.03','2183.87','165.329','3.55578','3414:0 3416:0 3418:0 '),\n('3416','net1048','530','3523','3734','67','70','0','2998.08','2133.47','165.328','4.35295','3415:0 3417:0 3420:0 '),\n('3417','net1049','530','3523','3734','67','70','0','2946.6','2153.28','165.328','2.77429','3416:0 3418:0 '),\n('3418','net1050','530','3523','3734','67','70','0','2965.73','2206.06','165.328','1.22313','3417:0 3415:0 3419:0 '),\n('3419','net1051','530','3523','3734','67','70','0','2936.31','2281.19','161.738','6.1684','3412:0 3418:0 '),\n('3420','net1054','530','3523','3734','67','70','0','3024.32','2073.46','161.904','5.51533','3416:0 3421:0 '),\n('3421','net1055','530','3523','3728','67','70','0','3109.36','1996.97','143.897','5.55067','3420:0 3422:0 '),\n('3422','net1056','530','3523','3728','67','70','0','3166.19','1968.36','143.636','5.79022','3421:0 3423:0 3424:0 '),\n('3423','net1057','530','3523','3728','67','70','0','3200.13','2051.68','140.786','4.08789','3422:0 3406:0 '),\n('3424','net1058','530','3523','3728','67','70','0','3152.12','1897.92','143.899','6.07689','3422:0 3425:0 3427:0 '),\n('3425','net1059','530','3523','3728','67','70','0','3101.78','1824.2','144.391','4.03094','3426:0 3424:0 '),\n('3426','net1060','530','3523','3728','67','70','1','3001.93','1820.1','139.674','3.72463','3425:0 '),\n('3427','net1061','530','3523','3728','67','70','0','3242.1','1874.48','139.223','3.2581','3424:0 3428:0 '),\n('3428','net1062','530','3523','3721','67','70','0','3356.3','1846.42','102.117','6.15621','3427:0 3429:0 '),\n('3429','net1063','530','3523','3721','67','70','0','3493.95','1840.83','95.7573','0.214661','3428:0 3430:0 '),\n('3430','net1064','530','3523','3735','67','70','0','3613.29','1892.38','114.291','3.62722','3429:0 3459:0 3460:0 '),\n('3431','net1066','530','3523','3736','67','70','0','3865.27','1760.4','212.947','0.885387','3432:0 3456:0 '),\n('3432','net1067','530','3523','3736','67','70','0','3913.4','1809.95','227.674','2.24413','3431:0 3442:0 3433:0 '),\n('3433','net1070','530','3523','3736','67','70','0','3881.31','1918.58','254.223','0.97178','3432:0 3434:0 '),\n('3434','net1071','530','3523','3736','67','70','0','3915.93','1973.35','257.813','1.00712','3435:0 3437:0 3433:0 '),\n('3435','net1072','530','3523','3736','67','70','0','3903.14','2024.48','257.813','1.77289','3434:0 3436:0 '),\n('3436','net1073','530','3523','3736','67','70','0','3959.61','2037.62','257.813','0.233506','3435:0 3437:0 3438:0 '),\n('3437','net1074','530','3523','3736','67','70','0','3969.45','1982.24','257.813','4.86736','3436:0 3434:0 '),\n('3438','net1075','530','3523','3736','67','70','0','3996.64','2094.06','254.332','0.975711','3436:0 3439:0 '),\n('3439','net1077','530','3523','3736','67','70','0','4094.87','2029.53','236.513','5.17366','3438:0 3440:0 '),\n('3440','net1078','530','3523','3736','67','70','0','4145.6','1950.14','225.805','2.1106','3443:0 3441:0 3439:0 '),\n('3441','net1079','530','3523','3736','67','70','0','4106.82','1883.96','228.654','3.273','3440:0 3442:0 '),\n('3442','net1081','530','3523','3736','67','70','0','3993.09','1800.64','228.295','3.01381','3432:0 3441:0 '),\n('3443','net1082','530','3523','3736','67','70','0','4192.46','2017.97','187.695','1.85243','3440:0 3444:0 '),\n('3444','net1083','530','3523','3736','67','70','0','4174.2','2071.5','164.367','1.33406','3443:0 3445:0 '),\n('3445','net1084','530','3523','3735','67','70','0','4198.79','2173.44','151.336','1.33406','3444:0 3446:0 3447:0 3477:0 '),\n('3446','net1085','530','3523','3735','67','70','0','4292.53','2293.49','122.367','0.595787','3445:0 3478:0 '),\n('3447','net1086','530','3523','3854','67','70','0','4247.96','2110.73','144.575','4.7741','3445:0 3448:0 '),\n('3448','net1087','530','3523','3735','67','70','0','4252.18','1989.35','136.107','4.82514','3447:0 3449:0 '),\n('3449','net1088','530','3523','3735','67','70','0','4268.67','1894.47','138.946','4.87226','3448:0 3450:0 3453:0 '),\n('3450','net1089','530','3523','3735','67','70','0','4299.75','1730.52','113.615','4.18507','3449:0 3451:0 '),\n('3451','net1090','530','3523','3735','67','70','0','4113.8','1674.62','130.483','2.68103','3450:0 3452:0 '),\n('3452','net1091','530','3523','3735','67','70','0','4046.36','1742.75','145.812','2.35116','3451:0 3453:0 3454:0 '),\n('3453','net1092','530','3523','3735','67','70','0','4181.61','1781.88','136.718','0.423012','3452:0 3449:0 '),\n('3454','net1093','530','3523','3735','67','70','0','3930.55','1683.62','139.355','3.27165','3452:0 3455:0 '),\n('3455','net1094','530','3523','3735','67','70','0','3819.95','1651.37','133.174','2.01794','3454:0 3457:0 3456:0 '),\n('3456','net1095','530','3523','3735','67','70','0','3785.44','1751.5','175.377','2.55396','3431:0 3455:0 3459:0 '),\n('3457','net1097','530','3523','3735','67','70','0','3779.17','1581.07','120.895','1.36998','3455:0 3458:0 '),\n('3458','net1098','530','3523','3735','67','70','0','3710.46','1647.45','128.67','1.14614','3457:0 3459:0 '),\n('3459','net1099','530','3523','3735','67','70','0','3682.83','1822.97','129.53','5.05546','3458:0 3430:0 3456:0 '),\n('3460','net1100','530','3523','3735','67','70','0','3551.83','1960.87','89.9501','1.23472','3430:0 3461:0 3462:0 '),\n('3461','net1101','530','3523','3735','67','70','0','3582.85','2061.58','97.1173','1.30541','3460:0 '),\n('3462','net1102','530','3523','3735','67','70','0','3654.98','2151.19','121.699','1.26065','3460:0 3463:0 '),\n('3463','net1103','530','3523','3735','67','70','0','3647.05','2320.07','95.0628','1.67298','3462:0 3464:0 '),\n('3464','net1104','530','3523','3735','67','70','0','3753.6','2270.39','127.706','5.84031','3463:0 3465:0 '),\n('3465','net1105','530','3523','3735','67','70','0','3743.54','2216.22','132.261','5.08632','3464:0 3466:0 '),\n('3466','net1106','530','3523','3880','67','70','0','3752.43','2164.28','140.754','4.1949','3465:0 3467:0 3473:0 '),\n('3467','net1107','530','3523','3880','67','70','0','3712.58','2091.74','151.686','5.93062','3466:0 3468:0 '),\n('3468','net1108','530','3523','3880','67','70','0','3791.21','2078.46','153.464','0.004788','3467:0 3469:0 '),\n('3469','net1109','530','3523','3880','67','70','0','3833.37','2045.96','145.651','5.41226','3468:0 3470:0 '),\n('3470','net1110','530','3523','3880','67','70','0','3890.34','2027.56','147.129','1.10633','3469:0 3471:0 '),\n('3471','net1112','530','3523','3880','67','70','0','3911.03','2086.24','156.158','1.07294','3470:0 3472:0 '),\n('3472','net1113','530','3523','3880','67','70','0','3942.19','2139.62','160.422','6.24086','3471:0 '),\n('3473','net1114','530','3523','3735','67','70','0','3790.48','2245.91','149.586','4.56011','3466:0 3474:0 '),\n('3474','net1115','530','3523','3735','67','70','0','3843.92','2279.21','153.861','2.84204','3473:0 3475:0 '),\n('3475','net1116','530','3523','3735','67','70','0','3944.34','2283.35','158.599','6.04059','3474:0 3476:0 '),\n('3476','net1117','530','3523','3735','67','70','0','4063.98','2226.19','164.346','5.41228','3475:0 3477:0 '),\n('3477','net1119','530','3523','3735','67','70','0','4123.87','2142.65','157.701','2.91076','3445:0 3476:0 '),\n('3478','net1121','530','3523','3741','67','70','0','4466.87','2397.83','122.968','0.527102','3446:0 3479:0 '),\n('3479','net1122','530','3523','3741','67','70','0','4530.13','2410.14','141.874','5.42799','3478:0 3480:0 3484:0 '),\n('3480','net1123','530','3523','3741','67','70','0','4566.37','2316.31','146.43','5.07457','3479:0 3481:0 '),\n('3481','net1124','530','3523','3741','67','70','0','4632.34','2295.23','162.104','1.47351','3480:0 3482:0 '),\n('3482','net1125','530','3523','3741','67','70','0','4622.3','2365.33','187.361','1.96046','3481:0 3483:0 '),\n('3483','net1126','530','3523','3741','67','70','0','4729.92','2383.24','198.355','3.24458','3482:0 '),\n('3484','net1127','530','3523','3741','67','70','0','4575.52','2543.12','194.543','0.915856','3479:0 3485:0 '),\n('3485','net1128','530','3523','3741','67','70','0','4579.8','2608.07','196.971','1.06115','3484:0 3486:0 '),\n('3486','net1129','530','3523','3741','67','70','0','4616.02','2682.15','187.718','1.52847','3485:0 3487:0 '),\n('3487','net1130','530','3523','3523','67','70','0','4613.1','2774.93','159.097','0.786306','3486:0 3488:0 3507:0 '),\n('3488','net1131','530','3523','3523','67','70','0','4581.46','2841.92','146.738','1.62271','3487:0 3489:0 3508:0 '),\n('3489','net1132','530','3523','3523','67','70','0','4623.84','2957.12','144.621','1.21823','3488:0 3490:0 3509:0 '),\n('3490','net1133','530','3523','3850','67','70','0','4760.8','2985.3','129.535','0.205073','3489:0 3491:0 '),\n('3491','net1134','530','3523','3850','67','70','0','4849.32','2917.43','146.288','5.62826','3490:0 3492:0 '),\n('3492','net1135','530','3523','3874','67','70','0','4916.97','2942.46','157.256','0.212934','3491:0 3493:0 '),\n('3493','net1136','530','3523','3850','67','70','0','4803.44','3004.17','134.11','2.64374','3492:0 3494:0 '),\n('3494','net1137','530','3523','3523','67','70','0','4689.74','3022.54','131.238','0.00480604','3493:0 3495:0 '),\n('3495','net1138','530','3523','3523','67','70','0','4770.95','3072.84','120.927','0.216864','3494:0 3496:0 '),\n('3496','net1139','530','3523','3523','67','70','0','4841.73','3077.92','111.914','5.77749','3495:0 3497:0 3579:0 '),\n('3497','net1140','530','3523','3874','67','70','0','4921.37','3026.16','99.5096','5.7068','3496:0 3498:0 '),\n('3498','net1141','530','3523','3874','67','70','0','5030.73','3015.92','91.2729','6.18983','3497:0 3499:0 '),\n('3499','net1142','530','3523','3874','67','70','0','5047.36','2928.45','88.8179','4.9057','3498:0 3500:0 '),\n('3500','net1143','530','3523','3874','67','70','0','4988.68','2838.26','81.9239','3.64121','3499:0 3501:0 '),\n('3501','net1144','530','3523','3850','67','70','0','4907.06','2817.68','91.5802','3.63336','3500:0 3502:0 '),\n('3502','net1145','530','3523','3850','67','70','0','4903.41','2721.51','83.4709','4.33629','3501:0 3503:0 '),\n('3503','net1146','530','3523','3850','67','70','0','4844.82','2634.49','94.0377','2.49061','3502:0 3504:0 '),\n('3504','net1147','530','3523','3850','67','70','0','4803.14','2703.36','87.3788','2.22751','3503:0 3505:0 '),\n('3505','net1148','530','3523','3850','67','70','0','4741.03','2771.78','92.6406','2.30998','3504:0 3506:0 '),\n('3506','net1149','530','3523','3850','67','70','0','4719.31','2848.51','113.113','1.8623','3505:0 3507:0 '),\n('3507','net1150','530','3523','3850','67','70','0','4656.43','2805.22','134.562','3.22497','3506:0 3487:0 '),\n('3508','net1151','530','3523','3876','67','70','0','4484.96','2804.2','139.481','1.71701','3488:0 3530:0 '),\n('3509','net1152','530','3523','3740','67','70','0','4590.85','3169.73','146.93','4.87431','3489:0 3510:0 3511:0 3516:0 3569:0 '),\n('3510','net1153','530','3523','3740','67','70','0','4693.85','3149.86','170.153','5.31804','3509:0 3511:0 '),\n('3511','net1154','530','3523','3740','1','60','0','4655.8','3065','169.231','2.59665','3510:0 3509:0 3512:0 '),\n('3512','net1155','530','3523','3740','67','70','0','4685.7','3259.51','173.132','2.39442','3511:0 3513:0 3515:0 '),\n('3513','net1156','530','3523','3740','67','70','0','4776.31','3293.39','196.421','1.55207','3512:0 3514:0 '),\n('3514','net1157','530','3523','3740','67','70','0','4732.45','3359.96','201.252','3.83758','3513:0 3515:0 '),\n('3515','net1158','530','3523','3740','67','70','0','4630.74','3310.08','170.694','5.45551','3514:0 3512:0 '),\n('3516','net1159','530','3523','3523','67','70','0','4397.77','3265.13','143.404','2.67128','3509:0 3517:0 3521:0 3522:0 3569:0 3533:0 '),\n('3517','net1160','530','3523','3739','67','70','0','4463.52','3434.86','167.212','1.19866','3516:0 3518:0 3521:0 '),\n('3518','net1161','530','3523','3739','67','70','0','4387.49','3412.69','167.78','2.42782','3517:0 3519:0 '),\n('3519','net1162','530','3523','3739','67','70','0','4350.61','3471.82','175.837','4.81542','3518:0 3520:0 '),\n('3520','net1163','530','3523','3739','67','70','0','4364.97','3377.13','154.103','0.876653','3519:0 3521:0 '),\n('3521','net1164','530','3523','3739','67','70','0','4427.16','3339.99','152.658','0.896303','3520:0 3516:0 3517:0 '),\n('3522','net1165','530','3523','3738','67','70','0','4313.76','3185.04','161.274','0.774559','3516:0 3523:0 '),\n('3523','net1166','530','3523','3738','67','70','1','4231.39','3159.2','178.712','0.566429','3522:0 3524:0 '),\n('3524','net1167','530','3523','3738','67','70','0','4178.63','3151.63','175.35','3.55094','3523:0 3525:0 '),\n('3525','net1168','530','3523','3738','67','70','0','4098.18','3118.59','159.275','3.31924','3524:0 3526:0 '),\n('3526','net1169','530','3523','3738','67','70','0','4000.86','3107.64','138.035','3.24856','3525:0 3393:0 3527:0 '),\n('3527','net1170','530','3523','3875','67','70','0','4031.23','3259.48','139.947','1.37536','3526:0 3528:0 '),\n('3528','net1171','530','3523','3875','67','70','0','4071.98','3372.71','141.877','5.11779','3527:0 3529:0 3535:0 '),\n('3529','net1172','530','3523','3875','67','70','0','4151.5','3229.24','196.056','3.95933','3528:0 '),\n('3530','net1173','530','3523','3876','67','70','0','4466.66','2879.42','140.619','2.91867','3508:0 3531:0 '),\n('3531','net1174','530','3523','3876','67','70','0','4370.42','2904.8','148.304','2.95794','3530:0 3532:0 '),\n('3532','net1175','530','3523','3876','67','70','0','4330.52','2945.08','132.085','5.41232','3531:0 '),\n('3533','net1176','530','3523','3523','67','70','0','4301.84','3317.13','147.441','2.74981','3516:0 3534:0 '),\n('3534','net1178','530','3523','3523','67','70','0','4181.61','3456.1','144.034','2.38458','3535:0 3533:0 '),\n('3535','net1179','530','3523','3875','67','70','0','4137.43','3393.24','142.177','3.93968','3534:0 3528:0 3536:0 '),\n('3536','net1180','530','3523','3523','67','70','0','4138.78','3496.33','135.37','2.48591','3535:0 3537:0 3563:0 '),\n('3537','net1181','530','3523','3852','67','70','0','4091.57','3538.26','117.689','1.98718','3536:0 3538:0 '),\n('3538','net1182','530','3523','3852','67','70','0','4069.39','3591.81','114.31','2.34453','3537:0 3539:0 '),\n('3539','net1183','530','3523','3722','67','70','0','3910.13','3724.58','112.828','2.44664','3538:0 3540:0 '),\n('3540','net1184','530','3523','3722','67','70','0','3891.58','3773.08','119.636','1.37064','3539:0 3541:0 3556:0 '),\n('3541','net1185','530','3523','3722','67','70','0','3908.92','3833.69','129.749','1.2921','3540:0 3542:0 '),\n('3542','net1186','530','3523','3722','67','70','0','3990.07','3844.3','168.636','3.74058','3541:0 3543:0 '),\n('3543','net1188','530','3523','3722','67','70','0','3883.22','3936.25','179.58','1.96754','3542:0 3544:0 '),\n('3544','net1189','530','3523','3722','67','70','0','3884.07','3990.71','182.988','1.21356','3545:0 3555:0 3543:0 '),\n('3545','net1190','530','3523','3722','67','70','0','3912.9','4038.34','190.499','6.07518','3544:0 3546:0 '),\n('3546','net1191','530','3523','3722','67','70','0','3973.04','4023.83','194.227','6.0634','3545:0 3547:0 3549:0 '),\n('3547','net1192','530','3523','3722','67','70','0','4018.79','4051.87','194.227','0.549902','3546:0 3548:0 3552:0 '),\n('3548','net1193','530','3523','3722','67','70','0','4047.95','4004.82','194.226','3.89178','3547:0 3549:0 '),\n('3549','net1194','530','3523','3722','67','70','0','4001.04','3975.21','194.226','3.74256','3548:0 3546:0 3550:0 '),\n('3550','net1195','530','3523','3722','67','70','0','3987.35','3916.16','191.701','4.48476','3549:0 3551:0 '),\n('3551','net1196','530','3523','3722','67','70','0','4046.25','3890.47','189.426','0.432092','3550:0 '),\n('3552','net1197','530','3523','3722','67','70','0','4034.82','4111.42','191.69','4.44076','3547:0 3553:0 '),\n('3553','net1198','530','3523','3722','67','70','0','4009.09','4170.41','196.566','3.6907','3552:0 3554:0 '),\n('3554','net1199','530','3523','3722','67','70','0','3913.64','4108.63','193.142','4.23262','3553:0 3555:0 '),\n('3555','net1200','530','3523','3722','67','70','0','3881.18','4041.13','183.645','4.80596','3554:0 3544:0 '),\n('3556','net1202','530','3523','3722','67','70','0','3793.14','3905.54','108.811','1.48529','3540:0 3557:0 '),\n('3557','net1203','530','3523','3881','67','70','0','3802.78','4013.52','122.041','4.63866','3558:0 3556:0 '),\n('3558','net1204','530','3523','3881','67','70','0','3873.36','4009.36','122.335','5.89452','3557:0 3559:0 '),\n('3559','net1205','530','3523','3881','67','70','0','3925.68','3980.18','123.291','0.96222','3558:0 3560:0 '),\n('3560','net1206','530','3523','3881','67','70','0','3946.32','4028.85','115.31','5.07772','3559:0 3561:0 '),\n('3561','net1207','530','3523','3881','67','70','0','4034.51','3981.16','124.954','0.0315266','3560:0 3562:0 '),\n('3562','net1208','530','3523','3881','67','70','0','4093.15','3979.78','116.913','6.25973','3561:0 '),\n('3563','net1209','530','3523','3523','67','70','0','4192.46','3560.85','141.75','3.80144','3536:0 3564:0 '),\n('3564','net1210','530','3523','3721','67','70','0','4226.42','3607.77','132.686','0.593084','3563:0 3565:0 '),\n('3565','net1212','530','3523','3721','67','70','0','4313.98','3676.81','118.894','5.57251','3564:0 3566:0 '),\n('3566','net1213','530','3523','3523','67','70','0','4402.34','3609.63','125.622','5.65104','3567:0 3565:0 '),\n('3567','net1214','530','3523','3523','67','70','0','4488.77','3626.57','104.723','0.252208','3566:0 3568:0 '),\n('3568','net1215','530','3523','3721','67','70','0','4533.39','3589.74','117.794','5.57721','3567:0 '),\n('3569','net1216','530','3523','3740','67','70','0','4515.18','3245.18','144.362','1.06117','3509:0 3516:0 3570:0 '),\n('3570','net1217','530','3523','3740','67','70','0','4540.26','3296.59','134.776','0.813774','3569:0 3571:0 '),\n('3571','net1218','530','3523','3523','67','70','0','4586.71','3342.4','125.714','0.566373','3570:0 3572:0 '),\n('3572','net1219','530','3523','3523','67','70','0','4668.88','3392.34','110.519','0.444637','3571:0 3573:0 '),\n('3573','net1220','530','3523','3900','67','70','0','4744.11','3423.26','102.517','0.629205','3572:0 3574:0 '),\n('3574','net1221','530','3523','3900','67','70','0','4791.18','3452.42','102.703','5.32589','3573:0 3575:0 '),\n('3575','net1222','530','3523','3523','67','70','0','4831.57','3384.27','122','4.79967','3574:0 3576:0 '),\n('3576','net1223','530','3523','3523','67','70','0','4850.84','3313.75','131.13','3.99465','3575:0 3577:0 '),\n('3577','net1224','530','3523','3523','67','70','0','4816.07','3269.64','149.703','0.982658','3576:0 3578:0 '),\n('3578','net1225','530','3523','3523','67','70','0','4832.65','3173.12','139.44','1.878','3577:0 3579:0 '),\n('3579','net1226','530','3523','3523','67','70','0','4806.1','3117.37','139.757','4.67009','3578:0 3496:0 '),\n('3580','shmv1227','530','3520','3520','67','70','0','-2866.67','3174.8','12.0966','4.03472','2809:0 3581:0 '),\n('3581','shmv1228','530','3520','3520','67','70','0','-2919.41','3080.6','39.7651','0.776879','3580:0 3582:0 '),\n('3582','shmv1229','530','3520','3520','67','70','0','-2912.13','3021.5','54.1235','3.61375','3581:0 3583:0 '),\n('3583','shmv1230','530','3520','3520','67','70','0','-3025.35','2947.82','86.1102','3.93969','3582:0 3584:0 '),\n('3584','shmv1231','530','3520','3743','67','70','0','-3075.55','2877.97','82.0334','3.71192','3583:0 3585:0 3592:0 3749:0 '),\n('3585','shmv1232','530','3520','3743','67','70','0','-3179.64','2866.95','94.9902','2.90296','3584:0 3586:0 '),\n('3586','shmv1233','530','3520','3743','67','70','0','-3236.04','2882.68','114.136','3.1857','3585:0 3587:0 3746:0 '),\n('3587','shmv1234','530','3520','3743','67','70','0','-3367.61','2868.56','158.738','3.24853','3586:0 3588:0 3591:0 '),\n('3588','shmv1235','530','3520','3743','67','70','0','-3404.24','2930.17','169.88','0.354339','3587:0 3589:0 '),\n('3589','shmv1236','530','3520','3743','67','70','0','-3346.8','2955.36','169.88','0.413244','3588:0 3590:0 '),\n('3590','shmv1237','530','3520','3743','67','70','0','-3375.43','3001.18','170.817','2.12933','3589:0 3591:0 '),\n('3591','shmv1238','530','3520','3743','67','70','0','-3444.14','2938.58','172.959','3.88077','3590:0 3587:0 '),\n('3592','shmv1239','530','3520','3520','67','70','0','-3181.96','2718.28','68.7275','4.12424','3584:0 3593:0 3602:0 '),\n('3593','shmv1240','530','3520','3744','67','70','0','-3176.94','2562.78','61.0113','0.102998','3592:0 3594:0 3603:0 '),\n('3594','shmv1241','530','3520','3744','67','70','5','-3111.48','2564.12','61.7347','0.0205314','3593:0 3595:0 '),\n('3595','shmv1242','530','3520','3744','67','70','5','-3059.25','2507.74','62.9718','4.55621','3594:0 3596:0 '),\n('3596','shmv1243','530','3520','3744','67','70','4','-3069.01','2436.27','63.7223','4.4227','3595:0 3597:0 '),\n('3597','shmv1244','530','3520','3520','67','70','0','-3123.06','2321.13','59.93','3.60981','3596:0 3598:0 3604:0 '),\n('3598','shmv1245','530','3520','3520','67','70','0','-3231.28','2289.35','59.5698','4.92143','3597:0 3599:0 3652:0 '),\n('3599','shmv1246','530','3520','3520','67','70','0','-3462.86','2282.37','63.8282','3.30352','3598:0 3600:0 3605:0 '),\n('3600','shmv1247','530','3520','3949','67','70','0','-3455.95','2462.16','58.5579','1.65025','3599:0 3601:0 3652:0 '),\n('3601','shmv1248','530','3520','3520','67','70','0','-3483.53','2605.88','62.0554','4.92536','3600:0 3602:0 3750:0 '),\n('3602','shmv1249','530','3520','3520','67','70','0','-3301.81','2669.56','57.3856','0.154061','3601:0 3592:0 3603:0 '),\n('3603','shmv1250','530','3520','3744','67','70','0','-3199.36','2470.72','62.1645','2.00446','3602:0 3593:0 3604:0 '),\n('3604','shmv1251','530','3520','3520','67','70','0','-3210.03','2392.06','61.8107','5.34555','3597:0 3603:0 '),\n('3605','shmv1252','530','3520','3520','67','70','0','-3690.32','2310.79','78.5618','6.17099','3599:0 3606:0 3612:0 3750:0 '),\n('3606','shmv1253','530','3520','3752','67','70','0','-3792.84','2478.03','79.8242','1.51751','3605:0 3607:0 3611:0 '),\n('3607','shmv1254','530','3520','3752','67','70','0','-3790.89','2565.75','91.2376','1.68244','3606:0 3608:0 3609:0 '),\n('3608','shmv1255','530','3520','3752','67','70','0','-3793.32','2666.77','101.912','1.6471','3607:0 '),\n('3609','shmv1256','530','3520','3752','67','70','0','-4020.54','2670.54','126.986','4.24676','3607:0 3610:0 '),\n('3610','shmv1257','530','3520','3752','67','70','0','-4064.49','2549.64','134.278','5.45704','3609:0 3611:0 '),\n('3611','shmv1258','530','3520','3752','67','70','0','-3950.4','2473.76','116.781','0.0024457','3610:0 3606:0 '),\n('3612','shmv1259','530','3520','3745','67','70','0','-3762.45','2127.89','76.7131','3.78807','3605:0 3613:0 3616:0 '),\n('3613','shmv1260','530','3520','3745','67','70','2','-3882.03','2033.78','96.002','2.18978','3612:0 3614:0 3616:0 '),\n('3614','shmv1261','530','3520','3745','67','70','3','-3952.84','2136.12','98.2022','2.21727','3613:0 3615:0 '),\n('3615','shmv1262','530','3520','3745','67','70','3','-3972.41','2203.81','101.676','5.04862','3614:0 '),\n('3616','shmv1263','530','3520','3520','67','70','0','-3769.55','1947.31','94.6509','4.07473','3612:0 3613:0 3617:0 '),\n('3617','shmv1264','530','3520','3520','67','70','0','-3890.57','1771.31','96.9587','3.89017','3616:0 3618:0 3653:0 '),\n('3618','shmv1265','530','3520','3520','67','70','0','-4052.33','1643.87','94.7068','4.5499','3617:0 3619:0 '),\n('3619','shmv1266','530','3520','3520','67','70','0','-4057.55','1395.83','83.9803','4.95438','3618:0 3620:0 3664:0 3679:0 '),\n('3620','shmv1267','530','3520','3520','67','70','0','-4028.73','1253.84','79.0241','1.89525','3619:0 3621:0 '),\n('3621','shmv1268','530','3520','3520','67','70','0','-3956.14','1083.59','27.6555','5.11538','3620:0 3622:0 3684:0 3771:0 '),\n('3622','shmv1269','530','3520','3520','67','70','0','-3882.17','883.51','18.5293','4.46743','3621:0 3623:0 3685:0 '),\n('3623','shmv1270','530','3520','3520','67','70','0','-3840.27','741.517','11.8649','0.0181477','3622:0 3624:0 3685:0 '),\n('3624','shmv1271','530','3520','3520','67','70','0','-3586.49','737.497','-11.4566','0.0534906','3623:0 3625:0 3627:0 3778:0 '),\n('3625','shmv1272','530','3520','3520','67','70','0','-3561.52','586.272','10.6201','4.78552','3624:0 3626:0 3693:0 3705:0 '),\n('3626','shmv1273','530','3520','3520','67','70','0','-3569.67','423.902','28.3305','4.75019','3625:0 '),\n('3627','shmv1274','530','3520','3520','67','70','0','-3346.71','753.909','-26.6716','0.0849111','3624:0 3628:0 3729:0 '),\n('3628','shmv1275','530','3520','3520','67','70','0','-3232.2','784.314','-19.8198','0.00243998','3627:0 3629:0 '),\n('3629','shmv1276','530','3520','3754','67','70','0','-3120.7','799.898','-22.5484','1.24337','3628:0 3630:0 3717:0 '),\n('3630','shmv1277','530','3520','3520','67','70','0','-3121.46','1102.68','20.44','1.2473','3629:0 3631:0 3717:0 '),\n('3631','shmv1278','530','3520','3753','67','70','0','-3106.91','1197.3','22.976','1.40439','3630:0 3632:0 3725:0 3726:0 '),\n('3632','shmv1279','530','3520','3520','67','70','0','-3026.37','1314.44','8.68562','0.968488','3631:0 3633:0 3733:0 '),\n('3633','shmv1280','530','3520','3520','67','70','0','-2904.03','1491.38','14.8027','0.960634','3632:0 3634:0 '),\n('3634','shmv1281','530','3520','3750','67','70','0','-2867.58','1577.53','15.2282','2.85737','3633:0 3635:0 3751:0 '),\n('3635','shmv1282','530','3520','3750','67','70','0','-2824.65','1682.74','22.3429','1.17662','3634:0 3636:0 '),\n('3636','shmv1283','530','3520','3750','67','70','0','-2886.26','1742.5','43.8502','2.40576','3635:0 3637:0 '),\n('3637','shmv1284','530','3520','3520','67','70','0','-2975.68','1908','104.519','2.08612','3636:0 3638:0 '),\n('3638','shmv1285','530','3520','3520','67','70','0','-3102.48','1972.24','105.605','0.868752','3637:0 3639:0 3642:0 '),\n('3639','shmv1286','530','3520','3520','67','70','0','-3180.63','2099.72','75.4619','0.291484','3638:0 3640:0 3643:0 '),\n('3640','shmv1287','530','3520','3933','67','70','0','-3042.81','2156.41','79.2338','0.393586','3639:0 3641:0 '),\n('3641','shmv1288','530','3520','3933','67','70','0','-3015.9','2104.22','90.4026','4.71721','3640:0 3642:0 '),\n('3642','shmv1289','530','3520','3933','67','70','0','-3017.6','2046.19','96.9335','3.75903','3641:0 3638:0 '),\n('3643','shmv1290','530','3520','3748','67','70','0','-3265.68','2066.96','73.9146','4.35987','3639:0 3652:0 3644:0 '),\n('3644','shmv1291','530','3520','3748','67','70','0','-3287.9','1978.44','52.6152','2.07043','3643:0 3648:0 '),\n('3645','shmv1294','530','3520','3748','67','70','0','-3389.68','1984.65','24.8931','1.53832','3646:0 3648:0 '),\n('3646','shmv1295','530','3520','3748','67','70','0','-3405.52','2054.01','15.1476','3.06395','3647:0 3645:0 '),\n('3647','shmv1296','530','3520','3748','67','70','0','-3321.42','2125.97','3.08638','2.40814','3646:0 '),\n('3648','shmv1297','530','3520','3748','67','70','0','-3343.59','2008.19','32.1771','2.00758','3649:0 3645:0 3644:0 '),\n('3649','shmv1298','530','3520','3748','67','70','0','-3419.14','2114.58','34.4588','2.18822','3648:0 3650:0 '),\n('3650','shmv1299','530','3520','3748','67','70','0','-3495.43','2186.55','33.5276','5.96992','3649:0 3651:0 '),\n('3651','shmv1301','530','3520','3748','67','70','0','-3410.98','2272.59','33.8565','1.54813','3650:0 '),\n('3652','shmv1302','530','3520','3949','67','70','0','-3336.88','2207.97','74.9806','2.06645','3643:0 3598:0 3600:0 '),\n('3653','shmv1303','530','3520','3932','67','70','0','-4003.29','1878.34','76.5277','5.50491','3617:0 3654:0 '),\n('3654','shmv1304','530','3520','3932','67','70','0','-4085.04','1923.15','77.0726','5.10829','3653:0 3655:0 '),\n('3655','shmv1305','530','3520','3932','67','70','0','-4058.27','1821.93','84.9857','4.00088','3654:0 3656:0 '),\n('3656','shmv1306','530','3520','3932','67','70','0','-4103.15','1784.26','103.457','4.80985','3655:0 3657:0 '),\n('3657','shmv1307','530','3520','3932','67','70','0','-4195.07','1861.58','109.916','5.5167','3656:0 3658:0 '),\n('3658','shmv1308','530','3520','3822','67','70','0','-4334.08','1789.5','144.816','3.61996','3657:0 3659:0 '),\n('3659','shmv1309','530','3520','3822','67','70','0','-4420.11','1797.35','157.396','4.44855','3658:0 3660:0 3668:0 '),\n('3660','shmv1310','530','3520','3822','67','70','0','-4448.82','1724.98','158.876','4.33467','3659:0 3661:0 3666:0 '),\n('3661','shmv1311','530','3520','3822','67','70','0','-4383.86','1707.44','156.573','5.0533','3660:0 3662:0 '),\n('3662','shmv1312','530','3520','3822','67','70','0','-4361','1640.49','156.748','5.04152','3661:0 3663:0 3665:0 '),\n('3663','shmv1313','530','3520','3822','67','70','0','-4252.69','1521.47','129.453','5.45072','3662:0 3664:0 3672:0 '),\n('3664','shmv1314','530','3520','3822','67','70','0','-4141.51','1512.19','103.518','6.20863','3663:0 3619:0 '),\n('3665','shmv1315','530','3520','3822','67','70','0','-4423.22','1575.75','164.241','3.96398','3662:0 3666:0 '),\n('3666','shmv1316','530','3520','3822','67','70','0','-4491.12','1668.12','165.043','2.20469','3665:0 3660:0 3667:0 '),\n('3667','shmv1317','530','3520','3822','67','70','0','-4564.8','1670.31','174.579','3.11182','3666:0 '),\n('3668','shmv1318','530','3520','3520','67','70','0','-4426.81','1860.99','159.258','2.50232','3659:0 3669:0 '),\n('3669','shmv1319','530','3520','3930','67','70','0','-4488.03','1934.26','144.075','1.12787','3668:0 3670:0 '),\n('3670','shmv1320','530','3520','3930','67','70','0','-4450.04','1988.33','105.344','2.32482','3669:0 3671:0 '),\n('3671','shmv1321','530','3520','3930','67','70','0','-4500.91','2022.31','100.196','4.19013','3670:0 '),\n('3672','shmv1323','530','3520','3929','67','70','0','-4234.47','1405.21','129.348','4.72107','3663:0 3673:0 '),\n('3673','shmv1324','530','3520','3929','67','70','0','-4309.54','1384.96','143.997','3.08352','3672:0 3674:0 '),\n('3674','shmv1325','530','3520','3950','67','70','0','-4558.9','1328.47','135.392','6.27616','3673:0 3675:0 '),\n('3675','shmv1326','530','3520','3929','67','70','0','-4452.67','1313.79','113.624','0.000826359','3674:0 3676:0 '),\n('3676','shmv1327','530','3520','3929','67','70','0','-4318.73','1322.33','73.5928','6.21333','3675:0 3677:0 3680:0 '),\n('3677','shmv1328','530','3520','3929','67','70','0','-4226.21','1305.14','56.0568','6.20155','3676:0 3678:0 '),\n('3678','shmv1329','530','3520','3929','67','70','0','-4117.45','1299.67','52.606','1.29281','3677:0 3679:0 '),\n('3679','shmv1330','530','3520','3520','67','70','0','-4096.52','1451.91','87.6478','5.2198','3678:0 3619:0 '),\n('3680','shmv1331','530','3520','3929','67','70','0','-4403.59','1300.45','84.0575','3.42125','3676:0 3681:0 '),\n('3681','shmv1332','530','3520','3520','67','70','0','-4511.47','1203.3','34.9082','3.43695','3680:0 3682:0 '),\n('3682','shmv1333','530','3520','3945','67','70','0','-4641.99','1163.55','-14.0182','0.205018','3681:0 3683:0 '),\n('3683','shmv1334','530','3520','3945','67','70','0','-4660.62','1088.53','0.90432','5.98162','3682:0 '),\n('3684','shmv1335','530','3520','3938','67','70','1','-4090.85','1104.54','41.0582','5.28662','3621:0 3685:0 '),\n('3685','shmv1336','530','3520','3758','67','70','0','-4110.45','861.06','9.26995','4.56397','3684:0 3622:0 3623:0 3686:0 '),\n('3686','shmv1337','530','3520','3939','67','70','0','-4149.68','586.65','8.64057','4.66214','3685:0 3687:0 '),\n('3687','shmv1338','530','3520','3939','67','70','0','-4184.61','489.528','29.5585','1.24958','3688:0 3689:0 3686:0 '),\n('3688','shmv1339','530','3520','3939','67','70','0','-4114.39','424.914','34.9882','2.74575','3687:0 '),\n('3689','shmv1341','530','3520','3939','67','70','0','-4224.07','420.493','51.1341','1.46947','3687:0 3690:0 '),\n('3690','shmv1342','530','3520','3939','67','70','0','-4299.45','334.074','109.437','3.99453','3689:0 3691:0 '),\n('3691','shmv1344','530','3520','3939','67','70','0','-4202.19','250.869','124.805','2.69862','3690:0 3692:0 '),\n('3692','shmv1345','530','3520','3939','67','70','0','-4203.68','345.854','115.285','1.493','3691:0 '),\n('3693','shmv1346','530','3520','3520','67','70','0','-3501.72','557.894','16.7235','0.323666','3625:0 3694:0 '),\n('3694','shmv1347','530','3520','3757','67','70','0','-3426.99','580.376','42.2179','5.95105','3693:0 3695:0 '),\n('3695','shmv1348','530','3520','3757','67','70','0','-3327.45','544.282','74.5225','4.63944','3694:0 3696:0 '),\n('3696','shmv1349','530','3520','3757','67','70','0','-3333.62','454.382','99.8124','6.05315','3695:0 3697:0 3704:0 '),\n('3697','shmv1350','530','3520','3757','67','70','0','-3228.24','439.514','104.731','3.31604','3696:0 3698:0 '),\n('3698','shmv1351','530','3520','3757','67','70','0','-3392.06','415.921','103.96','4.61195','3697:0 3699:0 3704:0 '),\n('3699','shmv1352','530','3520','3757','67','70','0','-3390.43','293.527','103.961','4.72583','3698:0 3700:0 '),\n('3700','shmv1353','530','3520','3757','67','70','0','-3337.54','294.86','116.382','1.36824','3699:0 3701:0 '),\n('3701','shmv1354','530','3520','3757','67','70','0','-3324.03','371.217','120.458','5.9746','3700:0 3702:0 '),\n('3702','shmv1355','530','3520','3757','67','70','0','-3231.77','337.352','127.504','4.49021','3701:0 3703:0 '),\n('3703','shmv1356','530','3520','3757','67','70','0','-3239.92','279.443','137.131','4.57267','3702:0 '),\n('3704','shmv1357','530','3520','3757','67','70','0','-3416.2','459.709','103.935','5.91964','3696:0 3698:0 '),\n('3705','shmv1358','530','3520','3756','67','70','0','-3685.39','550.038','35.0742','2.93905','3625:0 3706:0 '),\n('3706','shmv1359','530','3520','3756','67','70','0','-3813.8','565.02','71.7251','4.91432','3705:0 3707:0 '),\n('3707','shmv1360','530','3520','3756','67','70','0','-3802.41','461.803','99.9172','4.68655','3706:0 3708:0 3716:0 '),\n('3708','shmv1361','530','3520','3756','67','70','0','-3896.83','442.087','104.97','6.26668','3707:0 3709:0 '),\n('3709','shmv1362','530','3520','3756','67','70','0','-3719.39','417.216','104.061','2.6833','3708:0 3710:0 3716:0 '),\n('3710','shmv1363','530','3520','3756','67','70','0','-3732.23','295.716','104.066','3.10939','3709:0 3711:0 '),\n('3711','shmv1364','530','3520','3756','67','70','0','-3786.92','297.908','116.455','3.10153','3710:0 3712:0 '),\n('3712','shmv1365','530','3520','3756','67','70','0','-3812.37','248.065','120.604','1.80405','3711:0 3713:0 '),\n('3713','shmv1366','530','3520','3756','67','70','0','-3838.38','357.549','120.582','1.80405','3712:0 3714:0 '),\n('3714','shmv1367','530','3520','3756','67','70','0','-3904.87','343.016','127.62','4.76657','3713:0 3715:0 '),\n('3715','shmv1368','530','3520','3756','67','70','0','-3890.45','282.542','137.239','3.8665','3714:0 '),\n('3716','shmv1369','530','3520','3756','67','70','0','-3719.66','475.869','104.038','4.2914','3709:0 3707:0 '),\n('3717','shmv1370','530','3520','3754','67','70','0','-3124.49','886.832','-14.3889','1.56135','3629:0 3630:0 3718:0 '),\n('3718','shmv1371','530','3520','3754','67','70','1','-3061.33','830.398','-10.215','4.92836','3717:0 3719:0 '),\n('3719','shmv1372','530','3520','3520','67','70','0','-3030.95','544.921','-1.12904','0.00390148','3718:0 3720:0 '),\n('3720','shmv1373','530','3520','3520','67','70','0','-2881.37','547.854','-13.197','0.0196085','3719:0 3721:0 '),\n('3721','shmv1374','530','3520','3520','67','70','0','-2744.62','677.917','-16.4588','1.42468','3720:0 3722:0 '),\n('3722','shmv1375','530','3520','3520','67','70','0','-2720.25','857.215','-3.3875','4.54664','3721:0 3723:0 '),\n('3723','shmv1376','530','3520','3520','67','70','0','-2768.24','985.559','-2.57223','2.06085','3722:0 3724:0 '),\n('3724','shmv1377','530','3520','3520','67','70','0','-2871.08','1130.08','8.92665','3.16433','3723:0 3725:0 '),\n('3725','shmv1378','530','3520','3520','67','70','0','-2984.92','1134.44','-3.92959','2.62712','3724:0 3631:0 '),\n('3726','shmv1379','530','3520','3753','67','70','0','-3245.6','1189.8','59.4774','4.33927','3631:0 3727:0 3731:0 '),\n('3727','shmv1380','530','3520','3753','67','70','0','-3222.89','1092.48','64.7857','6.14175','3726:0 3728:0 3731:0 3732:0 '),\n('3728','shmv1381','530','3520','3753','67','70','0','-3292.57','985.163','40.7467','5.15608','3727:0 3730:0 '),\n('3729','shmv1382','530','3520','3753','67','70','0','-3344.18','870.1','-14.6762','4.80342','3627:0 3730:0 '),\n('3730','shmv1383','530','3520','3753','67','70','0','-3205.87','897.037','49.1172','0.192352','3729:0 3728:0 '),\n('3731','shmv1384','530','3520','3753','67','70','0','-3399.1','1175.31','50.0129','3.15252','3726:0 3727:0 3732:0 '),\n('3732','shmv1385','530','3520','3753','67','70','0','-3335.34','1043.32','47.1116','0.383668','3727:0 3731:0 3772:0 '),\n('3733','shmv1386','530','3520','3749','67','70','0','-2929.04','1324.33','7.92349','5.43769','3632:0 3734:0 '),\n('3734','shmv1387','530','3520','3749','67','70','0','-2845.89','1301.54','6.02801','3.20519','3733:0 3735:0 '),\n('3735','shmv1388','530','3520','3749','67','70','0','-2847.46','1231.33','6.78906','1.62065','3734:0 3736:0 '),\n('3736','shmv1390','530','3520','3749','67','70','0','-2732.51','1138.3','2.89233','2.40802','3735:0 3737:0 '),\n('3737','shmv1391','530','3520','3749','67','70','0','-2634.08','1230.04','11.146','1.86804','3738:0 3736:0 '),\n('3738','shmv1392','530','3520','3749','67','70','0','-2651.9','1282.45','26.4813','3.01869','3737:0 3739:0 '),\n('3739','shmv1393','530','3520','3749','67','70','0','-2710.39','1300.75','33.7332','1.28218','3738:0 3740:0 '),\n('3740','shmv1394','530','3520','3749','67','70','0','-2690.89','1361.98','35.0836','6.28124','3739:0 3741:0 '),\n('3741','shmv1395','530','3520','3749','67','70','0','-2617.04','1355.97','37.2382','0.18183','3740:0 3742:0 '),\n('3742','shmv1396','530','3520','3749','67','70','0','-2769.22','1301.12','33.2111','3.48993','3741:0 3743:0 3745:0 '),\n('3743','shmv1397','530','3520','3749','67','70','0','-2721.9','1224.71','33.0771','5.26886','3742:0 3744:0 '),\n('3744','shmv1398','530','3520','3749','67','70','0','-2817.63','1365.79','38.5145','5.53669','3743:0 3745:0 '),\n('3745','shmv1399','530','3520','3749','67','70','0','-2766.14','1383.17','37.6732','0.325571','3744:0 3742:0 '),\n('3746','shmv1400','530','3520','3743','67','70','0','-3280.76','3002.45','141.658','1.22092','3586:0 3747:0 '),\n('3747','shmv1401','530','3520','3743','67','70','0','-3273.62','3077.71','139.787','0.31771','3746:0 3748:0 '),\n('3748','shmv1402','530','3520','3743','67','70','0','-3211.67','3079.46','126.239','5.52566','3747:0 3749:0 '),\n('3749','shmv1403','530','3520','3743','67','70','0','-3143.09','3024.9','104.296','5.41086','3584:0 3748:0 '),\n('3750','shmv1405','530','3520','3752','67','70','0','-3656.3','2553.97','77.5087','0.0120506','3601:0 3605:0 '),\n('3751','shmv1406','530','3520','3750','67','70','0','-2941.74','1589.4','40.8211','2.08903','3634:0 3752:0 '),\n('3752','shmv1407','530','3520','3750','67','70','0','-2978.15','1677.35','67.3118','2.1715','3751:0 3753:0 '),\n('3753','shmv1408','530','3520','3750','67','70','0','-3032.93','1672.83','67.4735','3.60878','3752:0 3754:0 3757:0 '),\n('3754','shmv1409','530','3520','3750','67','70','0','-3131.22','1754.16','79.6664','2.79589','3753:0 3755:0 '),\n('3755','shmv1410','530','3520','3750','67','70','0','-3191.61','1765.69','88.3304','2.95297','3754:0 3756:0 '),\n('3756','shmv1411','530','3520','3520','67','70','0','-3345.81','1700.42','95.7466','5.65474','3755:0 3757:0 '),\n('3757','shmv1412','530','3520','3520','67','70','0','-3188.39','1586.02','63.3792','0.565352','3756:0 3753:0 3758:0 3760:0 '),\n('3758','shmv1413','530','3520','3520','67','70','0','-3052.53','1476.53','17.9049','2.50057','3757:0 3759:0 '),\n('3759','shmv1414','530','3520','3520','67','70','0','-3107.69','1379.15','12.0022','4.19702','3758:0 '),\n('3760','shmv1415','530','3520','3750','67','70','0','-3103.19','1550.28','39.5694','2.77978','3757:0 3761:0 '),\n('3761','shmv1416','530','3520','3520','67','70','0','-3196.31','1501.96','57.1479','2.95256','3760:0 3762:0 '),\n('3762','shmv1417','530','3520','3747','67','70','0','-3282.99','1527.47','52.2295','5.92921','3761:0 3763:0 '),\n('3763','shmv1418','530','3520','3747','67','70','0','-3394.49','1550.46','48.1579','2.93214','3762:0 3764:0 '),\n('3764','shmv1419','530','3520','3747','67','70','0','-3500.47','1622.81','43.8418','3.38295','3763:0 3765:0 '),\n('3765','shmv1420','530','3520','3747','67','70','0','-3693.06','1558.48','46.9758','1.02649','3764:0 3766:0 '),\n('3766','shmv1421','530','3520','3747','67','70','0','-3828.74','1475.85','43.1674','4.10996','3765:0 3767:0 '),\n('3767','shmv1422','530','3520','3747','67','70','0','-3888.12','1398.74','43.6642','4.04478','3766:0 3768:0 '),\n('3768','shmv1423','530','3520','3747','67','70','0','-3858.68','1336.7','42.2274','4.47911','3767:0 3769:0 '),\n('3769','shmv1424','530','3520','3747','67','70','0','-3883.95','1244.97','42.1164','4.44376','3768:0 3770:0 3771:0 '),\n('3770','shmv1425','530','3520','3520','67','70','0','-3774.38','1225.16','84.9138','6.04598','3769:0 '),\n('3771','shmv1426','530','3520','3520','67','70','0','-3969.44','1164.97','46.6673','5.0878','3769:0 3621:0 '),\n('3772','shmv1427','530','3520','3753','67','70','0','-3423.61','1074.97','42.8376','3.2539','3732:0 3773:0 '),\n('3773','shmv1428','530','3520','3520','67','70','0','-3574.75','1067.86','40.499','3.19107','3772:0 3774:0 '),\n('3774','shmv1429','530','3520','3821','67','70','0','-3680.33','1058.59','68.153','2.90833','3773:0 3775:0 3776:0 '),\n('3775','shmv1430','530','3520','3821','67','70','0','-3760.76','1068.11','70.1361','6.14809','3774:0 '),\n('3776','shmv1431','530','3520','3520','67','70','0','-3642.27','894.441','45.4124','5.92247','3774:0 3777:0 '),\n('3777','shmv1432','530','3520','3520','67','70','0','-3522.57','841.492','-2.90146','4.68834','3776:0 3778:0 '),\n('3778','shmv1433','530','3520','3520','67','70','0','-3522.09','776.814','-14.2281','4.71976','3777:0 3624:0 '),\n('3779','bt001','571','3537','4129','68','73','5','2817.61','6168.46','85.5727','3.94245','3780:0 '),\n('3780','bt002','571','3537','4020','68','73','5','2726.11','6082.88','72.3512','3.45943','3779:0 3781:0 '),\n('3781','bt003','571','3537','4020','68','73','0','2604.99','6083.81','53.2961','2.26563','3780:0 3782:0 3832:0 '),\n('3782','bt004','571','3537','4020','68','73','0','2505.63','6178.07','53.1691','5.59574','3781:0 3783:0 3839:0 '),\n('3783','bt005','571','3537','4130','68','73','0','2589.16','6313.74','86.8706','0.137219','3782:0 3784:0 3832:0 '),\n('3784','bt006','571','3537','3537','68','73','0','2818.32','6342.97','101.266','3.15078','3783:0 3785:0 3791:0 '),\n('3785','bt007','571','3537','3537','68','73','0','2823.08','6550.12','55.029','4.6077','3784:0 3786:0 3790:0 '),\n('3786','bt008','571','3537','4106','68','73','0','2946.88','6730.38','13.9226','0.998791','3785:0 3787:0 3788:0 '),\n('3787','bt009','571','3537','4106','68','73','0','3100','6716.93','0.818624','2.88374','3786:0 '),\n('3788','bt010','571','3537','4106','68','73','0','2769.6','6817.13','0.382068','5.63656','3786:0 3789:0 '),\n('3789','bt011','571','3537','4031','68','73','0','2511.71','6709.76','8.65944','0.559735','3788:0 3790:0 '),\n('3790','bt012','571','3537','4130','68','73','0','2598.94','6513.07','41.9513','4.98704','3789:0 3785:0 '),\n('3791','bt013','571','3537','3537','68','73','0','2977.63','6387.87','96.0276','3.55919','3784:0 3792:0 '),\n('3792','bt014','571','3537','3537','68','73','0','3117.74','6401.57','85.8869','4.84331','3791:0 3793:0 '),\n('3793','bt015','571','3537','3537','68','73','0','3146.95','6242.85','96.6515','5.78972','3792:0 3794:0 '),\n('3794','bt016','571','3537','4105','68','73','0','3332.48','6165.54','75.7667','2.87983','3793:0 '),\n('3795','bt017','571','3537','3537','68','73','0','3270.88','5961.4','84.9677','4.81845','3796:0 3797:0 3826:0 '),\n('3796','bt018','571','3537','3537','68','73','1','3624.25','5933.39','136.215','3.44596','3797:0 3795:0 '),\n('3797','bt019','571','3537','4109','68','73','0','3297.83','5691.4','59.3737','4.58728','3796:0 3798:0 3795:0 '),\n('3798','bt020','571','3537','3537','68','73','0','3304.79','5470.21','55.3479','4.73257','3797:0 3799:0 3852:0 '),\n('3799','bt021','571','3537','3537','68','73','0','3482.47','5425.21','50.7507','1.49045','3798:0 3800:0 '),\n('3800','bt022','571','3537','3537','68','73','0','3532.8','5540.21','65.5113','4.20635','3799:0 3801:0 3937:0 '),\n('3801','bt023','571','3537','3537','68','73','0','3504.09','5638.44','63.5206','1.09146','3800:0 3802:0 3937:0 '),\n('3802','bt024','571','3537','3537','68','73','0','3651.69','5686.01','66.2432','0.569961','3801:0 3803:0 3937:0 '),\n('3803','bt025','571','3537','3537','68','73','0','3809.81','5773.85','68.3307','0.134065','3802:0 3804:0 3937:0 '),\n('3804','bt026','571','3537','4127','68','73','0','3969.32','5781.55','74.0472','0.432523','3803:0 3805:0 3896:0 '),\n('3805','bt027','571','3537','3537','68','73','0','4170.05','5855.36','62.8346','0.137999','3804:0 3806:0 3816:0 3819:0 '),\n('3806','bt028','571','3537','3537','68','73','0','4324.68','6015.4','25.5474','1.07655','3805:0 3807:0 '),\n('3807','bt029','571','3537','4099','68','73','0','4401.85','6148.33','0.553693','4.54723','3806:0 3808:0 '),\n('3808','bt030','571','3537','4033','68','73','0','4287.27','6236.78','0.383892','3.29845','3807:0 3809:0 '),\n('3809','bt031','571','3537','4033','68','73','0','4184.73','6193.42','9.12228','1.7952','3808:0 3810:0 '),\n('3810','bt032','571','3537','4033','68','73','0','4149.36','6252.75','30.8789','2.52797','3809:0 3811:0 3812:0 '),\n('3811','bt033','571','3537','4097','68','73','0','4056.14','6303.43','25.1363','1.18887','3810:0 '),\n('3812','bt034','571','3537','4097','68','73','0','4052.65','6367.67','27.4251','1.08833','3810:0 3813:0 3815:0 '),\n('3813','bt035','571','3537','4097','68','73','0','3991.71','6304.02','8.08314','0.901407','3812:0 '),\n('3814','bt036','571','3537','4097','68','73','0','3854.4','6397.67','24.5748','5.34115','3815:0 '),\n('3815','bt037','571','3537','4097','68','73','0','3960.88','6426.15','11.3447','0.519589','3812:0 3814:0 '),\n('3816','bt038','571','3537','4134','68','73','0','4404.37','5906.55','55.8142','0.126085','3805:0 3817:0 3818:0 '),\n('3817','bt039','571','3537','4132','68','73','0','4547.19','6017.64','76.7052','4.37901','3816:0 '),\n('3818','bt040','571','3537','4122','68','73','5','4484.77','5763.64','79.4306','1.41963','3816:0 3819:0 '),\n('3819','bt041','571','3537','4133','68','73','0','4321.96','5776.59','72.5697','2.66048','3818:0 3805:0 '),\n('3820','bt042','571','3537','4032','68','73','3','2227.28','5312.07','10.5729','1.23497','3821:0 3851:0 '),\n('3821','bt043','571','3537','4101','68','73','0','2273.96','5439.49','1.81269','1.1525','3820:0 3822:0 3833:0 3916:0 '),\n('3822','bt044','571','3537','4101','68','73','0','2418.25','5390.85','3.76168','0.12363','3821:0 3823:0 '),\n('3823','bt045','571','3537','3537','68','73','0','2601.94','5522.47','38.0963','6.28036','3822:0 3824:0 3833:0 3840:0 3848:0 '),\n('3824','bt046','571','3537','3537','68','73','0','2887.65','5415.26','58.4905','5.60492','3823:0 3852:0 3859:0 '),\n('3825','bt047','571','3537','4021','68','73','0','2976.39','5660.32','52.2738','1.38733','3826:0 '),\n('3826','bt048','571','3537','4021','68','73','0','3019.96','5816.72','88.3166','0.8297','3825:0 3827:0 3795:0 '),\n('3827','bt049','571','3537','4020','68','73','0','2993.07','5973.66','112.995','5.04023','3826:0 3828:0 '),\n('3828','bt050','571','3537','4129','68','73','0','2915.6','6074.59','78.0969','1.4863','3827:0 3829:0 3844:0 '),\n('3829','bt051','571','3537','4020','68','73','0','2970.01','6149.83','61.7495','2.0298','3828:0 3830:0 '),\n('3830','bt052','571','3537','4020','68','73','0','2899.1','6282.26','61.4057','2.97228','3829:0 3831:0 '),\n('3831','bt053','571','3537','4020','68','73','0','2773.74','6303.56','77.083','3.07674','3830:0 3832:0 '),\n('3832','bt054','571','3537','4020','68','73','0','2654.28','6218.95','38.8344','4.55721','3831:0 3781:0 3783:0 '),\n('3833','bt055','571','3537','3537','68','73','0','2316.99','5624.68','36.408','5.33239','3823:0 3821:0 3834:0 '),\n('3834','bt056','571','3537','3537','68','73','0','2143.16','5781.38','58.7998','1.77058','3833:0 3837:0 '),\n('3835','bt057','571','3537','4028','68','73','0','1868.5','5774.99','0.860459','1.34802','3917:0 '),\n('3836','bt058','571','3537','4028','68','73','0','1923.91','6030.9','10.7946','1.48154','3837:0 3918:0 '),\n('3837','bt059','571','3537','3537','68','73','0','2116.07','6079.06','52.9292','3.89037','3836:0 3834:0 3838:0 3846:0 '),\n('3838','bt060','571','3537','4021','68','73','0','2104.14','6314.43','60.0072','0.106311','3837:0 3839:0 '),\n('3839','bt061','571','3537','4021','68','73','0','2357.04','6208.05','40.7146','2.64945','3838:0 3782:0 '),\n('3840','bt062','571','3537','4022','68','73','0','2647.51','5693.12','46.7099','1.50275','3823:0 3841:0 '),\n('3841','bt063','571','3537','4022','68','73','0','2631.68','5852.04','45.3245','5.86957','3840:0 3842:0 '),\n('3842','bt064','571','3537','4022','68','73','0','2763.87','5811.38','59.8902','6.23478','3841:0 3843:0 '),\n('3843','bt065','571','3537','4021','68','73','0','2848.66','5818.04','101.625','5.91276','3842:0 3844:0 3845:0 '),\n('3844','bt066','571','3537','4020','68','73','0','2837.49','5974.58','114.197','5.01191','3843:0 3828:0 '),\n('3845','bt067','571','3537','4021','68','73','0','2607.08','5956.42','94.4153','5.56483','3843:0 3846:0 3847:0 '),\n('3846','bt068','571','3537','4022','68','73','0','2327.62','5973.77','98.5945','4.36317','3837:0 3845:0 '),\n('3847','bt069','571','3537','4022','68','73','0','2489.14','5813.21','139.945','0.867364','3845:0 '),\n('3848','bt070','571','3537','4111','68','73','0','2684.66','5308.92','31.1745','1.9606','3823:0 3849:0 '),\n('3849','bt071','571','3537','4111','68','73','0','2495.15','5199.97','32.4263','0.802134','3848:0 3850:0 '),\n('3850','bt072','571','3537','4032','68','73','0','2416.87','5247.86','1.88448','3.32877','3849:0 3851:0 '),\n('3851','bt073','571','3537','4032','68','73','3','2334.99','5249.7','9.01216','2.3698','3820:0 3850:0 '),\n('3852','bt074','571','3537','3537','68','73','0','3128.49','5378.84','58.5466','0.00337601','3824:0 3798:0 3853:0 3859:0 '),\n('3853','bt075','571','3537','3537','68','73','0','3264.11','5285.37','39.4799','3.97355','3852:0 3854:0 3891:0 '),\n('3854','bt076','571','3537','4043','68','73','0','3152.24','5121.1','38.3072','4.18325','3853:0 3855:0 3860:0 3891:0 '),\n('3855','bt077','571','3537','4043','68','73','0','2949.22','5102.38','35.483','3.44497','3856:0 3859:0 3854:0 '),\n('3856','bt078','571','3537','4043','68','73','0','2736.6','5010.38','28.1472','3.12924','3855:0 3857:0 '),\n('3857','bt079','571','3537','4115','68','73','0','2737.31','5202.71','29.0469','0.938766','3856:0 3858:0 3859:0 '),\n('3858','bt080','571','3537','4115','68','73','0','2535.47','5082.9','7.68824','3.5887','3857:0 '),\n('3859','bt081','571','3537','3537','68','73','0','2918.19','5295.64','60.2339','1.05579','3824:0 3855:0 3857:0 3852:0 '),\n('3860','bt082','571','3537','4041','68','73','0','3128.73','4853.66','2.08073','1.16652','3854:0 3861:0 '),\n('3861','bt083','571','3537','4041','68','73','0','3050.52','4655.31','2.27362','4.47304','3860:0 3862:0 '),\n('3862','bt084','571','3537','4043','68','73','0','3249.06','4558.38','29.5811','5.62916','3861:0 3863:0 '),\n('3863','bt085','571','3537','4043','68','73','0','3284.24','4264.38','24.2109','5.22075','3862:0 3864:0 3938:0 '),\n('3864','bt086','571','3537','4037','68','73','4','3412.42','4072.4','16.8945','0.69685','3863:0 3865:0 3866:0 3873:0 3939:0 '),\n('3865','bt087','571','3537','4037','68','73','5','3463.15','4158.38','17.1932','1.45869','3864:0 '),\n('3866','bt088','571','3537','4043','68','73','0','3662.21','3965.65','26.4976','5.18541','3864:0 3867:0 3878:0 '),\n('3867','bt089','571','3537','4125','68','73','0','3676.8','3741.97','49.5236','5.32678','3866:0 3868:0 3878:0 '),\n('3868','bt090','571','3537','4125','68','73','0','3823.07','3647','46.2292','5.63701','3867:0 3869:0 3871:0 3872:0 '),\n('3869','bt091','571','3537','4135','68','73','0','4026.86','3532.95','104.358','5.75874','3868:0 3870:0 3872:0 '),\n('3870','bt092','571','3537','4125','68','73','0','3935.56','3404.04','80.8418','5.58987','3869:0 3871:0 '),\n('3871','bt093','571','3537','4125','68','73','0','3825.9','3505.46','64.8278','1.04239','3868:0 3870:0 '),\n('3872','bt094','571','3537','4125','68','73','0','3966.88','3721.48','61.9247','4.14707','3868:0 3869:0 '),\n('3873','bt095','571','3537','4042','68','73','0','3416.97','3883.04','26.1293','5.22225','3864:0 3874:0 3939:0 '),\n('3874','bt096','571','3537','4042','68','73','0','3450.42','3652.26','27.974','2.1592','3873:0 3875:0 3940:0 '),\n('3875','bt097','571','3537','4042','68','73','0','3456.33','3430.49','17.996','4.9827','3874:0 3876:0 '),\n('3876','bt098','571','3537','4042','68','73','0','3518.4','3187.54','25.0806','4.80206','3875:0 3877:0 '),\n('3877','bt099','571','65','4478','68','73','0','3572.51','3037.08','26.2165','3.86352','3876:0 4109:0 '),\n('3878','bt100','571','3537','3537','68','73','0','3907.42','4000.44','45.1941','4.47613','3866:0 3867:0 3879:0 '),\n('3879','bt101','571','3537','3537','68','73','0','4042.02','4199.98','49.6907','0.696007','3878:0 3880:0 '),\n('3880','bt102','571','3537','3537','68','73','0','4186.94','4464.21','27.3466','1.05336','3879:0 3881:0 '),\n('3881','bt103','571','3537','4119','68','73','0','4191.29','4697.78','12.0312','2.68463','3880:0 3882:0 3883:0 3884:0 3908:0 '),\n('3882','bt104','571','3537','4118','68','73','0','4358.92','4576.58','16.3385','5.84976','3881:0 '),\n('3883','bt105','571','3537','4036','68','73','0','3992.84','4812.66','11.7213','5.55524','3881:0 '),\n('3884','bt106','571','3537','4119','68','73','0','3978.85','4564.24','-2.51875','3.44252','3881:0 3885:0 3914:0 '),\n('3885','bt107','571','3537','4117','68','73','0','3699.55','4487.54','-0.818554','2.97836','3884:0 3886:0 '),\n('3886','bt108','571','3537','4117','68','73','0','3443.04','4422.46','-0.530089','0.645731','3885:0 3887:0 '),\n('3887','bt109','571','3537','4035','68','73','0','3568.75','4584.96','-13.5973','0.527922','3886:0 3888:0 '),\n('3888','bt110','571','3537','4035','68','73','0','3686.72','4734.84','-12.073','1.14839','3887:0 3889:0 3915:0 '),\n('3889','bt111','571','3537','4035','68','73','0','3703.7','4927.72','-12.9951','2.73489','3888:0 3890:0 3912:0 '),\n('3890','bt112','571','3537','4116','68','73','0','3479.66','5024.98','-1.50934','2.71133','3889:0 3891:0 '),\n('3891','bt113','571','3537','4116','68','73','0','3344.22','5119.48','13.0385','2.55424','3890:0 3853:0 3854:0 3892:0 '),\n('3892','bt114','571','3537','4116','68','73','0','3589.81','5076.79','13.0073','6.10424','3891:0 3893:0 '),\n('3893','bt115','571','3537','3537','68','73','0','3668.09','5254.47','34.8015','1.05413','3892:0 3894:0 3911:0 '),\n('3894','bt116','571','3537','3537','68','73','0','3717.74','5416.1','41.956','1.99268','3893:0 3895:0 3937:0 '),\n('3895','bt117','571','3537','3537','68','73','0','3919.2','5534.82','36.9202','0.89312','3894:0 3896:0 '),\n('3896','bt118','571','3537','3537','68','73','0','4101.61','5617.94','41.1963','5.88275','3895:0 3804:0 3897:0 '),\n('3897','bt119','571','3537','3537','68','73','0','4252.89','5577.24','46.4033','5.33689','3896:0 3898:0 3903:0 '),\n('3898','bt120','571','3537','4123','68','73','0','4429.17','5431.27','38.6653','5.43664','3897:0 3899:0 '),\n('3899','bt121','571','3537','4123','68','73','0','4389.18','5365.34','1.39626','5.27172','3898:0 3900:0 '),\n('3900','bt122','571','3537','4123','68','73','0','4489.75','5395.86','-16.0358','0.830292','3899:0 3901:0 '),\n('3901','bt123','571','3537','4123','68','73','0','4444.7','5327.16','-22.3982','5.89611','3900:0 3902:0 '),\n('3902','bt124','571','3537','4123','68','73','0','4542.22','5322.8','-31.8246','3.56034','3901:0 '),\n('3903','bt125','571','3537','4123','68','73','0','4522.99','5561.63','52.4235','6.06731','3897:0 3904:0 4644:0 '),\n('3904','bt126','571','3537','4123','68','73','0','4530.95','5430.29','84.8166','1.59052','3903:0 3905:0 '),\n('3905','bt127','571','3537','4123','68','73','0','4525.48','5247.8','73.7381','4.37083','3904:0 3906:0 '),\n('3906','bt128','571','3537','4123','68','73','0','4475.24','5066.41','51.9566','0.934718','3905:0 3907:0 '),\n('3907','bt129','571','3537','4123','68','73','0','4378.74','5017.74','24.8345','2.46704','3906:0 3908:0 3909:0 '),\n('3908','bt130','571','3537','3537','68','73','0','4344.7','4804.82','24.8231','4.24124','3907:0 3881:0 '),\n('3909','bt131','571','3537','4116','68','73','0','4205.12','5146.23','13.0876','5.95813','3907:0 3910:0 '),\n('3910','bt132','571','3537','4108','68','73','3','4060.38','5267.77','24.7438','5.56545','3909:0 3911:0 '),\n('3911','bt133','571','3537','4116','68','73','0','3893.4','5186.84','13.0414','3.37026','3910:0 3893:0 3912:0 '),\n('3912','bt134','571','3537','4116','68','73','0','3840.13','5037.99','-1.50988','0.413233','3911:0 3889:0 3913:0 '),\n('3913','bt135','571','3537','4035','68','73','0','3925.28','4915.39','-12.887','4.60333','3912:0 3914:0 '),\n('3914','bt136','571','3537','4035','68','73','0','3887.73','4693.73','-12.995','4.14386','3913:0 3884:0 3915:0 '),\n('3915','bt137','571','3537','4035','68','73','0','3732.85','4647.89','-12.6525','0.821628','3914:0 3888:0 '),\n('3916','bt138','571','3537','4101','68','73','0','2084.44','5480.67','0.253263','0.428928','3821:0 3917:0 '),\n('3917','bt139','571','3537','3537','68','73','0','1935.03','5589.92','0.355845','5.97934','3916:0 3835:0 '),\n('3918','bt140','571','3537','4029','68','73','0','1494.92','5829.11','1.38787','4.0072','3836:0 3919:0 '),\n('3919','bt141','571','3537','4029','68','73','0','1384.5','5858.44','15.4001','4.19177','3918:0 3920:0 '),\n('3920','bt142','571','3537','4029','68','73','0','1449.43','5734.18','1.3254','1.10514','3919:0 3921:0 '),\n('3921','bt143','571','3537','4029','68','73','0','1402.52','5714.94','23.5628','4.00326','3920:0 3922:0 '),\n('3922','bt144','571','3537','4029','68','73','0','1316.7','5605.69','5.52566','5.40127','3921:0 '),\n('3923','bt145','571','3537','4024','68','73','0','4152.49','7034.79','165.636','2.43875','3924:0 3936:0 '),\n('3924','bt146','571','3537','4024','68','73','0','3999','7159.1','167.793','0.0786215','3923:0 3925:0 '),\n('3925','bt147','571','3537','4024','68','73','0','3840.49','7254.47','172.045','3.52653','3924:0 3926:0 3928:0 '),\n('3926','bt148','571','3537','4024','68','73','0','3676.61','7110.41','160.171','4.50434','3925:0 3927:0 3929:0 '),\n('3927','bt149','571','3537','4024','68','73','0','3597.15','7199.39','221.934','1.51276','3926:0 3928:0 3929:0 '),\n('3928','bt150','571','3537','4024','68','73','0','3751.72','7333.67','208.956','0.378648','3927:0 3925:0 '),\n('3929','bt151','571','3537','4024','68','73','0','3611.29','6969.11','170.734','1.15225','3926:0 3927:0 3930:0 '),\n('3930','bt152','571','3537','4024','68','73','0','3644.46','6805.44','166.924','3.99932','3929:0 3931:0 '),\n('3931','bt153','571','3537','4121','68','73','1','3587.41','6661.1','195.429','4.60014','3930:0 3932:0 '),\n('3932','bt154','571','3537','4024','68','73','0','3749.63','6602.97','169.446','3.8658','3931:0 3933:0 3935:0 '),\n('3933','bt155','571','3537','4024','68','73','0','3912.17','6596.2','168.227','0.700643','3932:0 3934:0 '),\n('3934','bt156','571','3537','4024','68','73','0','3971.08','6785.73','156.758','4.88682','3933:0 3935:0 3936:0 '),\n('3935','bt157','571','3537','4024','68','73','0','3826.86','6694.29','152.782','4.14698','3934:0 3932:0 '),\n('3936','bt158','571','3537','4024','68','73','0','4074.45','6887.11','166.976','1.01716','3923:0 3934:0 '),\n('3937','bt159','571','3537','4039','68','73','0','3663.21','5603.77','32.8151','3.07099','3800:0 3801:0 3802:0 3803:0 3894:0 '),\n('3938','bt160','571','3537','4113','68','73','1','2913.96','4067.33','1.63263','0.498753','3863:0 3939:0 '),\n('3939','bt161','571','3537','4138','68','73','3','3111.58','3838.69','22.5558','0.795238','3864:0 3873:0 3940:0 3938:0 '),\n('3940','bt162','571','3537','4138','68','73','0','3323.93','3770.67','24.5945','5.57327','3939:0 3874:0 '),\n('3941','hf163','571','495','3998','68','73','3','1418.1','-3190.73','162.344','4.57189','3942:0 '),\n('3942','hf164','571','495','3998','68','73','2','1365.12','-3385.23','185.736','4.52084','3941:0 3943:0 '),\n('3943','hf165','571','495','4048','68','73','0','1219.72','-3550.97','164.966','4.23495','3942:0 3944:0 '),\n('3944','hf166','571','495','4048','68','73','0','1121.91','-3657.07','156.248','4.07787','3943:0 3945:0 3985:0 '),\n('3945','hf167','571','495','4048','68','73','0','1046.11','-3833.51','162.833','4.6512','3944:0 3946:0 3958:0 3985:0 '),\n('3946','hf168','571','495','4048','68','73','0','920.447','-4015.29','170.279','3.21786','3945:0 3947:0 3958:0 '),\n('3947','hf169','571','495','3992','68','73','0','694.778','-3872.94','246.328','2.73877','3946:0 3948:0 '),\n('3948','hf170','571','495','495','68','73','0','507.763','-4025.28','259.283','4.81221','3947:0 3949:0 '),\n('3949','hf171','571','495','4260','68','73','0','397.137','-4223.42','249.354','3.78334','3948:0 3950:0 3979:0 '),\n('3950','hf172','571','495','495','68','73','0','222.582','-4391.88','248.592','4.40773','3949:0 3951:0 4086:0 '),\n('3951','hf173','571','495','3991','68','73','0','253.033','-4572.61','240.212','5.55441','3950:0 3952:0 4082:0 '),\n('3952','hf174','571','495','3991','68','73','5','371.97','-4633.54','245.156','2.78588','3951:0 3953:0 3957:0 4085:0 '),\n('3953','hf175','571','495','3991','68','73','4','407.209','-4712.58','228.909','5.83714','3952:0 3954:0 '),\n('3954','hf176','571','495','3991','68','73','0','510.661','-4763.01','208.318','0.924468','3953:0 3955:0 4082:0 '),\n('3955','hf177','571','495','495','68','73','0','628.585','-4581.53','203.482','0.904833','3954:0 3956:0 '),\n('3956','hf178','571','495','3991','68','73','0','460.455','-4423.52','211.022','2.64078','3955:0 3957:0 3979:0 '),\n('3957','hf179','571','495','3991','68','73','4','383.884','-4495.8','236.504','4.36866','3956:0 3952:0 '),\n('3958','hf180','571','495','495','68','73','0','1081.71','-4036.81','154.348','4.76135','3945:0 3946:0 3985:0 '),\n('3959','hf181','571','495','495','68','73','0','1215.66','-4263.51','149.864','5.26401','3960:0 '),\n('3960','hf182','571','495','495','68','73','0','1258.74','-4522.15','173.24','3.83852','3959:0 3961:0 '),\n('3961','hf183','571','495','495','68','73','0','1124.26','-4644.36','183.694','3.62646','3960:0 3962:0 '),\n('3962','hf184','571','495','495','68','73','0','857.223','-4730.31','113.82','0.273598','3961:0 3963:0 '),\n('3963','hf185','571','495','495','68','73','0','706.968','-4825.12','79.1984','4.0553','3962:0 3964:0 '),\n('3964','hf186','571','495','3981','68','73','2','634.301','-4890.02','28.6664','4.92709','3963:0 3965:0 3978:0 '),\n('3965','hf187','571','495','3981','68','73','2','682.36','-4963','6.24529','0.414974','3964:0 3966:0 3978:0 '),\n('3966','hf188','571','495','3982','68','73','0','854.979','-4933.54','4.27721','0.230407','3965:0 3967:0 '),\n('3967','hf189','571','495','3982','68','73','0','1039.98','-4925.08','9.42985','0.387488','3966:0 3968:0 '),\n('3968','hf190','571','495','3982','68','73','0','945.95','-4873.37','4.59329','0.540618','3967:0 3969:0 '),\n('3969','hf191','571','495','3982','68','73','0','1068.1','-4819.17','26.6749','3.6728','3968:0 3970:0 '),\n('3970','hf192','571','495','3983','68','73','0','1158.2','-4813.94','28.9399','0.405537','3969:0 3971:0 '),\n('3971','hf193','571','495','3983','68','73','0','1104.87','-4804.91','-6.8197','0.572031','3970:0 3972:0 '),\n('3972','hf194','571','495','3983','1','60','0','980.459','-4819.09','-72.4413','0.31677','3971:0 3973:0 '),\n('3973','hf195','571','495','3983','68','73','0','841.596','-4863.98','-72.4161','5.00561','3972:0 3974:0 3975:0 '),\n('3974','hf196','571','495','3983','68','73','0','875.874','-4966.04','-72.4404','1.87186','3973:0 '),\n('3975','hf197','571','495','495','68','73','0','795.673','-4726.51','-96.2356','1.47131','3973:0 3976:0 '),\n('3976','hf198','571','495','3983','68','73','0','835.937','-4866.89','-115.736','2.10747','3975:0 3977:0 '),\n('3977','hf199','571','495','3983','68','73','0','945.547','-4827.44','-116.158','0.281421','3976:0 '),\n('3978','hf200','571','495','3981','68','73','3','554.553','-4986.67','10.1867','0.251579','3964:0 3965:0 '),\n('3979','hf201','571','495','495','68','73','0','628.213','-4255.8','210.916','3.49527','3949:0 3956:0 3980:0 '),\n('3980','hf202','571','495','3994','68','73','0','765.99','-4299.85','185.031','3.00833','3979:0 3981:0 '),\n('3981','hf203','571','495','3994','68','73','0','798.758','-4362.47','161.294','4.9679','3980:0 3982:0 '),\n('3982','hf204','571','495','3994','68','73','0','902.1','-4478.73','144.331','5.55301','3981:0 3983:0 3984:0 '),\n('3983','hf205','571','495','3994','68','73','0','1004.65','-4395.88','150.922','4.0804','3982:0 3984:0 '),\n('3984','hf206','571','495','3994','68','73','0','909.858','-4395.54','139.649','4.34665','3983:0 3982:0 '),\n('3985','hf207','571','495','4048','68','73','0','1203.65','-3825.84','142.684','1.05976','3944:0 3945:0 3958:0 3986:0 '),\n('3986','hf208','571','495','495','68','73','0','1408.56','-3737.55','135.962','1.67629','3985:0 3987:0 '),\n('3987','hf209','571','495','495','68','73','0','1558.28','-3740.43','144.691','0.00336027','3986:0 3988:0 '),\n('3988','hf210','571','495','495','68','73','1','1706.02','-3730.74','148.901','3.19209','3987:0 3989:0 4027:0 '),\n('3989','hf211','571','495','495','68','73','0','1803.26','-3895.57','170.472','0.273537','3988:0 3990:0 '),\n('3990','hf212','571','495','495','68','73','0','1949.63','-3842.81','173.777','1.70846','3989:0 3991:0 '),\n('3991','hf213','571','495','4068','68','73','0','2008.1','-3689.61','173.671','1.9378','3990:0 3992:0 '),\n('3992','hf214','571','495','4068','68','73','0','1967.39','-3604.53','158.109','5.18071','3991:0 3993:0 4031:0 '),\n('3993','hf215','571','495','495','68','73','0','2096.74','-3545.48','153.897','6.17032','3992:0 3994:0 '),\n('3994','hf216','571','495','495','68','73','0','2318.6','-3583.13','165.228','0.334813','3993:0 3995:0 '),\n('3995','hf217','571','495','4006','68','73','0','2535.68','-3475.65','183.975','0.49582','3994:0 3996:0 3999:0 '),\n('3996','hf218','571','495','4006','68','73','0','2624.04','-3562.9','205.26','5.49331','3995:0 3997:0 3999:0 '),\n('3997','hf219','571','495','4006','68','73','0','2727.06','-3698.08','221.722','5.46582','3996:0 3998:0 '),\n('3998','hf220','571','495','4065','68','73','0','2838.83','-3844.63','244.563','5.37','3997:0 '),\n('3999','hf221','571','495','4006','68','73','0','2613.9','-3384.95','183','4.543','3995:0 3996:0 4000:0 4001:0 '),\n('4000','hf222','571','495','4006','68','73','0','2724.44','-3424.92','224.685','0.694536','3999:0 '),\n('4001','hf223','571','495','4054','68','73','0','2578.54','-3191.48','141.337','1.90327','3999:0 4002:0 '),\n('4002','hf224','571','495','495','68','73','0','2515.29','-2957.64','111.213','1.93861','4001:0 4003:0 4011:0 4318:0 '),\n('4003','hf225','571','495','4054','68','73','0','2301.09','-3135.29','143.7','3.73482','4002:0 4004:0 4010:0 '),\n('4004','hf226','571','495','4054','68','73','0','2243.04','-3261.92','151.734','2.70201','4003:0 4005:0 '),\n('4005','hf227','571','495','3999','68','73','0','2145.39','-3331.7','144.475','1.2019','4004:0 4006:0 '),\n('4006','hf228','571','495','3999','68','73','0','2086.44','-3330','104.792','3.06722','4005:0 4007:0 '),\n('4007','hf229','571','495','3999','68','73','0','1983.23','-3286.99','111.741','1.78624','4006:0 4008:0 '),\n('4008','hf230','571','495','3999','68','73','0','2045.23','-3172.46','139.784','4.15736','4007:0 4009:0 '),\n('4009','hf231','571','495','4062','68','73','5','2094.18','-2981.02','144.898','4.45895','4008:0 4010:0 '),\n('4010','hf232','571','495','495','68','73','0','2264.88','-3015.48','135.084','5.19722','4009:0 4003:0 '),\n('4011','hf233','571','495','495','68','73','0','2606.41','-2825.71','69.3506','1.32522','4002:0 4012:0 4318:0 '),\n('4012','hf234','571','495','4070','68','73','0','2558.46','-2678.02','3.25504','5.60171','4011:0 4013:0 4322:0 '),\n('4013','hf235','571','495','4070','68','73','0','2430.12','-2758.92','5.62901','3.37275','4012:0 4014:0 '),\n('4014','hf236','571','495','4070','68','73','0','2281.27','-2774.11','4.91082','0.329327','4013:0 4015:0 '),\n('4015','hf237','571','495','4070','68','73','0','2153.11','-2770.66','4.86218','3.08765','4014:0 4016:0 '),\n('4016','hf238','571','495','4070','68','73','0','1967.15','-2762.53','3.5219','3.17561','4015:0 4017:0 '),\n('4017','hf239','571','495','4070','68','73','0','1835.91','-2814.57','3.48005','3.54396','4016:0 4018:0 '),\n('4018','hf240','571','495','4070','68','73','0','1677.38','-2975.29','3.95501','4.155','4017:0 4019:0 '),\n('4019','hf241','571','495','4071','68','73','0','1576.78','-3123.46','2.99581','4.44402','4018:0 4020:0 4029:0 '),\n('4020','hf242','571','495','4071','68','73','0','1609.87','-3258.66','3.34169','4.86186','4019:0 4021:0 '),\n('4021','hf243','571','495','4071','68','73','0','1629.47','-3440.1','29.9326','3.35783','4020:0 4022:0 4030:0 '),\n('4022','hf244','571','495','4071','68','73','0','1490.07','-3428.63','88.8301','0.0332379','4021:0 4023:0 '),\n('4023','hf245','571','495','4071','68','73','0','1554.39','-3419.81','97.6795','4.70636','4022:0 4024:0 4026:0 4028:0 '),\n('4024','hf246','571','495','4071','68','73','0','1638.14','-3283.78','76.0526','5.23256','4023:0 4025:0 '),\n('4025','hf247','571','495','4071','68','73','0','1772.14','-3327.31','81.7587','4.30737','4024:0 '),\n('4026','hf248','571','495','4071','68','73','0','1641.48','-3512.7','92.7675','1.7077','4023:0 4027:0 '),\n('4027','hf249','571','495','495','68','73','0','1670.45','-3682.65','149.579','1.75245','4026:0 3988:0 4028:0 '),\n('4028','hf250','571','495','4071','68','73','0','1565.95','-3550.52','112.177','1.48387','4027:0 4023:0 '),\n('4029','hf251','571','495','495','68','73','0','1489.29','-3099.07','39.9696','5.34802','4019:0 4030:0 '),\n('4030','hf252','571','495','4071','68','73','0','1511.33','-3269.6','74.5615','0.545315','4029:0 4021:0 '),\n('4031','hf253','571','495','495','68','73','0','2104.47','-3840.68','209.54','2.27867','3992:0 4032:0 '),\n('4032','hf254','571','495','4002','68','73','0','2068.75','-4073.32','236.821','4.87048','4031:0 4033:0 4039:0 '),\n('4033','hf255','571','495','4002','68','73','0','1987.13','-4141.88','216.964','3.23293','4032:0 4034:0 '),\n('4034','hf256','571','495','4002','68','73','0','1838.02','-4120.86','223.042','2.70435','4033:0 4035:0 4038:0 '),\n('4035','hf257','571','495','4002','68','73','0','1672.75','-4022.82','249.031','3.18894','4034:0 4036:0 '),\n('4036','hf258','571','495','4002','68','73','0','1693.59','-4091.47','270.671','4.86183','4035:0 4037:0 '),\n('4037','hf259','571','495','4002','68','73','0','1644.9','-4213.64','258.417','6.27555','4036:0 4038:0 '),\n('4038','hf260','571','495','4002','68','73','0','1773.12','-4215.36','238.947','0.851593','4037:0 4034:0 '),\n('4039','hf261','571','495','495','68','73','0','2130.43','-4316.44','219.989','1.40137','4032:0 4040:0 '),\n('4040','hf262','571','495','495','68','73','0','2183.63','-4535.73','216.514','4.86106','4039:0 4041:0 '),\n('4041','hf263','571','495','495','68','73','0','2377.58','-4396.75','228.263','0.804472','4040:0 4042:0 '),\n('4042','hf264','571','495','495','68','73','0','2551.09','-4320.92','279.902','6.10198','4041:0 4043:0 '),\n('4043','hf265','571','495','4018','68','73','5','2613.73','-4366.35','276.555','2.42318','4042:0 4044:0 '),\n('4044','hf266','571','495','4018','68','73','4','2716.59','-4368.81','272.672','5.25063','4043:0 4045:0 '),\n('4045','hf267','571','495','495','68','73','0','2797.23','-4621.23','277.95','5.09748','4044:0 4046:0 4352:0 '),\n('4046','hf268','571','495','495','68','73','0','2607.42','-4744.93','256.769','3.77173','4045:0 4047:0 '),\n('4047','hf269','571','495','495','68','73','0','2455.43','-4885.82','260.773','3.54789','4046:0 4048:0 4051:0 '),\n('4048','hf270','571','495','495','68','73','3','2431.15','-4962.71','273.723','1.34484','4047:0 4049:0 '),\n('4049','hf271','571','495','4003','68','73','2','2510.75','-4994.59','283.35','2.79784','4048:0 4050:0 '),\n('4050','hf272','571','495','4003','68','73','2','2456.13','-5113.98','277.313','4.08197','4049:0 '),\n('4051','hf273','571','495','495','68','73','0','2232.27','-4879.42','237.068','0.178543','4047:0 4052:0 '),\n('4052','hf274','571','495','495','68','73','0','2035.15','-4874.68','210.788','3.93982','4051:0 4053:0 4056:0 '),\n('4053','hf275','571','495','495','68','73','0','1888.77','-4884.63','168.445','3.11672','4052:0 4054:0 '),\n('4054','hf276','571','495','4059','68','73','0','1712.12','-4879.28','126.121','3.13635','4053:0 4055:0 '),\n('4055','hf277','571','495','4059','68','73','0','1563','-4951.92','143.133','4.04662','4054:0 '),\n('4056','hf278','571','495','495','68','73','0','1915.43','-5076.01','179.861','4.59721','4052:0 4057:0 '),\n('4057','hf279','571','495','495','68','73','0','1824.95','-5278.57','182.601','4.39143','4056:0 4058:0 4064:0 '),\n('4058','hf280','571','495','4061','68','73','0','1965.2','-5427.02','202.866','6.04468','4057:0 4059:0 '),\n('4059','hf281','571','495','4061','68','73','0','2137.38','-5461.32','239.114','6.25123','4058:0 4060:0 '),\n('4060','hf282','571','495','4061','68','73','0','2177.05','-5614.25','226.937','4.76369','4059:0 4061:0 4397:0 '),\n('4061','hf283','571','495','4061','68','73','0','2173.72','-5813.08','225.029','3.53925','4060:0 4062:0 4397:0 '),\n('4062','hf284','571','495','4061','68','73','0','1978.82','-5763.87','223.278','2.62034','4061:0 4063:0 '),\n('4063','hf285','571','495','4061','68','73','0','1834.38','-5629.13','215.972','1.48308','4062:0 4064:0 '),\n('4064','hf286','571','495','495','68','73','1','1667.21','-5453.46','197.385','2.72951','4063:0 4057:0 4065:0 4068:0 '),\n('4065','hf287','571','495','4001','68','73','0','1532.35','-5419.75','189.418','2.63761','4064:0 4066:0 '),\n('4066','hf288','571','495','4001','68','73','0','1486.1','-5319.6','195.08','1.17912','4065:0 4067:0 '),\n('4067','hf289','571','495','4001','68','73','0','1504.6','-5264.18','206.615','0.745568','4066:0 '),\n('4068','hf290','571','495','495','68','73','0','1492.09','-5524.43','200.456','3.74892','4064:0 4069:0 4072:0 '),\n('4069','hf291','571','495','4403','68','73','0','1532.33','-5613.29','226.19','4.85477','4068:0 4070:0 '),\n('4070','hf292','571','495','4402','68','73','4','1541.33','-5689.58','248.356','1.64643','4069:0 4071:0 '),\n('4071','hf293','571','495','495','68','73','5','1631.27','-5779.62','258.389','2.51272','4070:0 '),\n('4072','hf294','571','495','495','68','73','0','1394.07','-5574.59','205.361','0.236628','4068:0 4073:0 '),\n('4073','hf295','571','495','495','68','73','0','1234.61','-5679.7','225.93','3.5408','4072:0 4074:0 4104:0 '),\n('4074','hf296','571','495','3984','68','73','0','1037.41','-5697.06','228.706','3.34052','4073:0 4075:0 4108:0 '),\n('4075','hf297','571','495','495','68','73','0','877.228','-5789.41','249.962','3.77328','4074:0 4076:0 '),\n('4076','hf298','571','495','495','68','73','0','739.705','-5863.89','287.056','4.11336','4075:0 4077:0 '),\n('4077','hf299','571','495','495','68','73','3','483.188','-5922.44','308.68','1.33265','4076:0 4078:0 '),\n('4078','hf300','571','495','495','68','73','0','513.926','-5588.33','281.883','2.6321','4077:0 4079:0 '),\n('4079','hf301','571','495','495','68','73','0','342.715','-5438.85','298.648','2.30775','4078:0 4080:0 '),\n('4080','hf302','571','495','495','68','73','0','221.35','-5242.73','299.653','1.84436','4079:0 4081:0 '),\n('4081','hf303','571','495','4057','68','73','0','161.173','-4925.94','298.444','1.79331','4080:0 4082:0 4083:0 4085:0 '),\n('4082','hf304','571','495','495','68','73','0','285.533','-4807.39','248.989','1.63624','4081:0 3951:0 3954:0 '),\n('4083','hf305','571','495','4057','68','73','0','-28.8267','-4914.36','302.775','3.12851','4081:0 4084:0 '),\n('4084','hf306','571','495','4057','68','73','0','-143.121','-5118.6','323.883','1.16107','4083:0 '),\n('4085','hf307','571','495','495','68','73','0','115.019','-4716.56','289.321','1.68335','4081:0 3952:0 4086:0 '),\n('4086','hf308','571','495','495','68','73','0','156.917','-4507.79','256.612','1.23411','4085:0 3950:0 '),\n('4087','hf309','571','495','3988','68','73','1','778.297','-2898.22','7.01161','4.8391','4088:0 '),\n('4088','hf310','571','495','3987','68','73','0','741.908','-3049.69','25.2093','3.79609','4087:0 4089:0 4092:0 4093:0 4094:0 4095:0 '),\n('4089','hf311','571','495','3987','68','73','0','590.131','-3156.57','40.1902','3.94689','4088:0 4090:0 4099:0 '),\n('4090','hf312','571','495','3987','68','73','0','471.48','-3318.84','48.7074','3.51255','4089:0 4091:0 '),\n('4091','hf313','571','495','3987','68','73','0','386.081','-3089.98','71.2014','1.81688','4090:0 4092:0 '),\n('4092','hf314','571','495','3987','68','73','0','508.887','-3028.15','24.4901','2.16561','4091:0 4088:0 '),\n('4093','hf315','571','495','3987','68','73','0','986.117','-3034.77','57.92','0.46364','4088:0 4094:0 '),\n('4094','hf316','571','495','3987','68','73','0','749.692','-3240.83','24.9581','2.15066','4088:0 4093:0 4097:0 '),\n('4095','hf317','571','495','3987','68','73','0','675.991','-3161.57','61.349','1.00634','4088:0 4096:0 '),\n('4096','hf318','571','495','3987','68','73','0','677.454','-3393.96','67.7866','4.88621','4095:0 '),\n('4097','hf319','571','495','3987','68','73','0','566.586','-3287.72','26.0315','4.65294','4094:0 4098:0 '),\n('4098','hf320','571','495','4226','68','73','0','551.1','-3494.05','3.24654','4.58853','4097:0 '),\n('4099','hf321','571','495','3987','68','73','0','370.473','-3216.41','23.421','3.95629','4089:0 4100:0 '),\n('4100','hf322','571','495','4474','68','73','0','223.035','-3291.75','0.0638989','3.59893','4099:0 4101:0 '),\n('4101','hf323','571','495','4474','68','73','0','114.305','-3330.69','0.616794','0.370948','4100:0 4102:0 '),\n('4102','hf324','571','495','3989','68','73','0','-16.534','-3453.36','32.7157','1.36763','4101:0 4103:0 '),\n('4103','hf325','571','495','3990','68','73','0','-130.721','-3573.93','3.18551','1.92133','4102:0 '),\n('4104','hf326','571','495','495','68','73','0','1337.07','-5914.2','292.65','4.10948','4073:0 4105:0 '),\n('4105','hf327','571','495','4005','68','73','0','1323.93','-6111.92','266.982','3.40577','4104:0 4106:0 '),\n('4106','hf328','571','495','4005','68','73','0','1181.44','-6169.63','232.169','2.26694','4105:0 4107:0 '),\n('4107','hf329','571','495','4005','68','73','0','1118.44','-6156.85','260.616','1.64883','4106:0 4108:0 '),\n('4108','hf330','571','495','495','68','73','0','1131.33','-5884.77','271.705','2.04153','4107:0 4074:0 '),\n('4109','db331','571','65','4478','70','74','0','3509.64','2944.69','24.9497','4.10306','3877:0 '),\n('4110','db332','571','65','65','70','74','0','3526.72','2777.23','49.7018','4.66854','4111:0 4267:0 4274:0 '),\n('4111','db333','571','65','4157','70','74','0','3369.46','2655.03','38.9276','4.90416','4110:0 4112:0 '),\n('4112','db334','571','65','4157','70','74','0','3440.83','2477.55','45.9125','4.61748','4111:0 4113:0 '),\n('4113','db335','571','65','4157','70','74','0','3395.92','2379.05','36.7537','2.28876','4112:0 4114:0 '),\n('4114','db336','571','65','4157','70','74','0','3343.5','2223.35','29.9841','5.39185','4113:0 4116:0 4115:0 '),\n('4115','db337','571','65','65','70','74','3','3489.08','1998.02','64.8654','1.46526','4114:0 4116:0 4260:0 '),\n('4116','db338','571','65','4160','70','74','0','3228.78','1905.36','132.824','3.97029','4117:0 4114:0 4115:0 '),\n('4117','db339','571','65','4160','70','74','0','2981.37','1896.75','127.972','2.94456','4116:0 4118:0 '),\n('4118','db340','571','65','4160','70','74','0','2800.15','1812.41','147.093','5.30074','4117:0 4119:0 '),\n('4119','db341','571','65','4160','70','74','0','2944.01','1641.57','152.165','4.64493','4118:0 4120:0 '),\n('4120','db342','571','65','4153','70','74','0','2869.62','1469.27','157.603','5.17349','4119:0 4121:0 '),\n('4121','db343','571','65','4153','70','74','0','2927.17','1282.72','151.277','5.62666','4120:0 4122:0 '),\n('4122','db344','571','65','4153','70','74','0','3121.27','1266.58','158.478','3.9082','4121:0 4123:0 4128:0 '),\n('4123','db345','571','65','4154','70','74','0','3098.59','1055.28','114.785','4.75643','4122:0 4124:0 4127:0 '),\n('4124','db346','571','65','4152','70','74','0','3015.6','886.551','57.0023','3.13067','4123:0 4125:0 4127:0 '),\n('4125','db347','571','65','4152','70','74','0','2864.53','878.189','19.1406','2.82436','4124:0 4126:0 '),\n('4126','db348','571','65','4152','70','74','1','2657.93','892.145','4.37495','3.30424','4125:0 '),\n('4127','db349','571','65','4154','70','74','0','3216.12','884.158','119.499','2.58873','4123:0 4124:0 4128:0 '),\n('4128','db350','571','65','4154','70','74','0','3342.09','1163.09','140.364','0.88363','4122:0 4127:0 4129:0 '),\n('4129','db351','571','65','4154','70','74','0','3499.57','1159.74','129.579','0.224683','4128:0 4130:0 4254:0 '),\n('4130','db352','571','65','4254','70','74','0','3512.34','930.529','67.6824','4.436','4129:0 4131:0 '),\n('4131','db353','571','65','4254','70','74','0','3439.05','725.86','74.9159','3.52022','4130:0 4132:0 '),\n('4132','db354','571','65','4254','70','74','0','3383.4','548.065','79.6602','4.13597','4131:0 4133:0 '),\n('4133','db355','571','65','4254','70','74','0','3284.71','349.551','72.0866','4.38102','4132:0 4134:0 '),\n('4134','db356','571','65','4254','70','74','0','3258.62','161.424','74.762','4.63863','4133:0 4135:0 '),\n('4135','db357','571','65','4254','70','74','0','3199.28','-65.6434','75.8214','5.73582','4134:0 4136:0 '),\n('4136','db358','571','65','4254','70','74','0','3396.24','-138.385','72.6226','6.16308','4135:0 4137:0 4222:0 '),\n('4137','db359','571','65','4176','70','74','0','3614.83','-219.548','59.6726','5.91567','4136:0 4138:0 '),\n('4138','db360','571','65','4254','70','74','0','3790.53','-250.696','72.8378','0.182258','4137:0 4221:0 '),\n('4139','db361','571','65','4254','70','74','0','3996.13','-105.238','55.0057','0.538831','4140:0 '),\n('4140','db362','571','65','4254','70','74','0','4209.42','-149.468','68.6085','5.25672','4139:0 4141:0 '),\n('4141','db363','571','65','4254','70','74','0','4346.6','-340.238','86.1907','5.65727','4140:0 4185:0 '),\n('4142','db364','571','65','4254','70','74','0','4531.54','-157.776','94.5998','0.726543','4143:0 '),\n('4143','db365','571','65','4253','70','74','0','4529.69','-5.32293','72.4325','1.1538','4142:0 4144:0 '),\n('4144','db366','571','65','4187','70','74','0','4719.33','26.5065','64.7658','0.68649','4143:0 4145:0 '),\n('4145','db367','571','65','4187','70','74','0','4857.73','152.013','95.1974','0.64722','4144:0 4146:0 4148:0 '),\n('4146','db368','571','65','4187','70','74','0','5023.32','291.159','160.107','0.61659','4145:0 4147:0 '),\n('4147','db369','571','65','4187','70','74','0','5185.63','203.224','194.36','2.54081','4146:0 4631:0 '),\n('4148','db370','571','65','4187','70','74','0','4916.98','373.751','114.702','2.28006','4145:0 4149:0 '),\n('4149','db371','571','65','4396','70','74','0','4715.84','582.426','121.086','2.36646','4148:0 4150:0 4182:0 '),\n('4150','db372','571','65','4254','70','74','0','4669.25','828.097','110.706','2.44265','4151:0 4179:0 4149:0 '),\n('4151','db373','571','65','4254','70','74','0','4441.38','887.155','84.3941','2.82121','4150:0 4152:0 4153:0 '),\n('4152','db374','571','65','4254','70','74','0','4443.49','662.985','67.5233','2.64843','4151:0 4153:0 '),\n('4153','db375','571','65','4254','70','74','0','4350.16','761.448','67.5378','5.48843','4152:0 4151:0 4154:0 '),\n('4154','db376','571','65','4173','70','74','0','4171.02','645.93','64.3628','5.72325','4153:0 4155:0 '),\n('4155','db377','571','65','4173','70','74','0','4234.66','525','11.3008','1.28578','4154:0 4156:0 '),\n('4156','db378','571','65','4173','70','74','0','4325.75','527.107','-8.31338','5.11853','4155:0 4157:0 '),\n('4157','db379','571','65','4173','70','74','0','4340.91','393.399','-6.35666','0.319745','4156:0 4158:0 '),\n('4158','db380','571','65','4173','70','74','0','4445.71','448.569','48.7618','3.60429','4157:0 4159:0 '),\n('4159','db381','571','65','4254','70','74','0','4396.23','306.166','44.9454','3.30034','4158:0 4160:0 '),\n('4160','db382','571','65','4254','70','74','0','4238.24','300.479','69.4901','3.54617','4159:0 4161:0 '),\n('4161','db383','571','65','4254','70','74','0','4069.57','365.886','52.151','2.76941','4160:0 4162:0 '),\n('4162','db384','571','65','4254','70','74','0','3905.43','429.963','42.0653','2.76941','4161:0 4163:0 '),\n('4163','db385','571','65','4254','70','74','0','3784.72','555.764','65.4753','2.52593','4162:0 4164:0 '),\n('4164','db386','571','65','4254','70','74','0','3856.57','647.11','62.7715','2.10102','4163:0 4165:0 '),\n('4165','db387','571','65','4254','70','74','0','3750.11','814.498','76.6706','1.69811','4164:0 4166:0 4169:0 '),\n('4166','db388','571','65','4168','70','74','0','3669.68','935.971','55.9559','1.74995','4165:0 4167:0 '),\n('4167','db389','571','65','4168','70','74','0','3656.82','1058.49','58.5011','5.83088','4166:0 4168:0 '),\n('4168','db390','571','65','4168','70','74','0','3822.88','1076.68','57.7067','4.99837','4167:0 4169:0 '),\n('4169','db391','571','65','4168','70','74','0','3851.01','940.099','56.0659','4.66535','4168:0 4165:0 4170:0 '),\n('4170','db392','571','65','4254','70','74','0','4005.33','1003','53.2598','6.17489','4169:0 4171:0 '),\n('4171','db393','571','65','4254','70','74','0','4142.41','981.525','78.4202','0.463487','4170:0 4172:0 '),\n('4172','db394','571','65','4254','70','74','0','4305.2','1039.06','63.1545','6.25972','4171:0 4173:0 '),\n('4173','db395','571','65','65','70','74','0','4276.99','1183.3','141.02','6.17961','4172:0 4174:0 '),\n('4174','db396','571','65','65','70','74','0','4489.67','1187.53','136.792','1.18448','4173:0 4175:0 4179:0 '),\n('4175','db397','571','65','4169','70','74','2','4570.48','1377.12','189.542','1.18173','4174:0 4176:0 '),\n('4176','db398','571','65','4169','70','74','3','4589.48','1435.55','189.222','0.103772','4175:0 4177:0 4178:0 '),\n('4177','db399','571','65','4169','70','74','2','4621.53','1507.35','204.751','1.03447','4176:0 '),\n('4178','db400','571','65','4171','70','74','2','4711.55','1446.21','175.428','5.44841','4176:0 '),\n('4179','db401','571','65','65','70','74','0','4690.88','1098.68','123.008','2.0861','4180:0 4174:0 4150:0 '),\n('4180','db402','571','65','4170','70','74','4','4841.36','1140.74','171.495','1.04781','4181:0 4179:0 '),\n('4181','db403','571','65','4170','70','74','5','4947.98','1224.66','225.705','1.29599','4180:0 '),\n('4182','db404','571','65','4230','70','74','0','4857.56','636.316','157.933','3.35764','4183:0 4149:0 '),\n('4183','db405','571','65','4230','70','74','0','4919.39','858.686','179.409','4.72424','4182:0 4184:0 '),\n('4184','db406','571','65','4230','70','74','0','5115.8','1070.31','223.911','0.494084','4183:0 '),\n('4185','db407','571','65','65','70','74','0','4361.47','-666.576','126.529','4.95513','4141:0 4186:0 4190:0 '),\n('4186','db408','571','65','4193','70','74','0','4506.23','-611.765','138.674','0.191691','4185:0 4187:0 '),\n('4187','db409','571','65','4193','70','74','0','4635.8','-532.061','166.561','4.05115','4186:0 4188:0 '),\n('4188','db410','571','65','4193','70','74','0','4701.77','-386.751','178.452','4.03308','4187:0 4189:0 '),\n('4189','db411','571','65','65','70','74','0','4744.71','-265.341','170.449','0.542767','4188:0 '),\n('4190','db412','571','65','65','70','74','0','4381.74','-907.37','164.196','4.73833','4185:0 4191:0 '),\n('4191','db413','571','65','65','70','74','0','4453.65','-1048.77','166.994','5.44283','4190:0 4192:0 4193:0 '),\n('4192','db414','571','65','4191','70','74','1','4598.46','-1084.15','165.481','5.41142','4191:0 4197:0 '),\n('4193','db415','571','65','65','70','74','0','4459.56','-1263.85','163.284','4.29694','4191:0 4194:0 4198:0 4199:0 '),\n('4194','db416','571','65','4194','70','74','0','4561.66','-1361.99','156.723','5.94234','4193:0 4195:0 '),\n('4195','db417','571','65','4194','70','74','0','4677.53','-1359.08','162.34','2.13944','4194:0 4196:0 4451:0 '),\n('4196','db418','571','65','4194','70','74','0','4810.96','-1263.2','168.051','2.83451','4195:0 4197:0 '),\n('4197','db419','571','65','65','70','74','0','4682.42','-1190.97','164.492','2.29651','4196:0 4192:0 '),\n('4198','db420','571','65','65','70','74','0','4426.84','-1508.64','159.241','4.50584','4193:0 4276:0 '),\n('4199','db421','571','65','65','70','74','0','4306.11','-1358.64','159.518','2.56747','4193:0 4200:0 '),\n('4200','db422','571','65','4189','70','74','0','4174.24','-1186.41','145.827','2.02005','4199:0 4201:0 '),\n('4201','db423','571','65','4189','70','74','0','4007.83','-1254.48','133.053','2.98923','4200:0 4202:0 '),\n('4202','db424','571','65','65','70','74','0','3870.4','-1277.63','147.246','3.74243','4201:0 4203:0 4211:0 '),\n('4203','db425','571','65','4188','70','74','0','3760.87','-1379.1','135.314','4.06287','4202:0 4204:0 '),\n('4204','db426','571','65','4188','70','74','0','3749.27','-1504.65','141.102','2.59496','4203:0 4205:0 '),\n('4205','db427','571','65','4188','70','74','0','3628.59','-1546.14','118.335','2.62324','4204:0 4206:0 '),\n('4206','db428','571','65','4188','70','74','0','3581.08','-1357.67','107.693','1.20402','4205:0 4207:0 '),\n('4207','db429','571','65','4188','70','74','0','3627.72','-1237','112.462','1.20323','4206:0 4208:0 '),\n('4208','db430','571','65','4188','70','74','0','3662.83','-1064.27','125.377','1.29591','4207:0 4209:0 '),\n('4209','db431','571','65','4188','70','74','0','3755.72','-1010.08','121.509','5.72713','4208:0 4210:0 4212:0 '),\n('4210','db432','571','65','4188','70','74','0','3850.53','-1132.6','122.334','6.27534','4209:0 4211:0 '),\n('4211','db433','571','65','65','70','74','0','3942.27','-1148.57','140.166','4.29771','4210:0 4202:0 '),\n('4212','db434','571','65','4177','70','74','0','3746.15','-891.172','162.614','2.06089','4209:0 4213:0 4216:0 '),\n('4213','db435','571','65','4177','70','74','0','3650.12','-879.646','162.72','3.17459','4212:0 4214:0 '),\n('4214','db436','571','65','4177','70','74','2','3590.79','-835.238','172.37','1.65563','4213:0 4215:0 4240:0 '),\n('4215','db437','571','65','4243','70','74','0','3599.65','-781.467','147.621','0.0926948','4214:0 '),\n('4216','db438','571','65','4177','70','74','3','3768.81','-779.501','195.937','4.02283','4212:0 4217:0 '),\n('4217','db439','571','65','4177','70','74','2','3925.37','-698.927','241.206','0.865546','4216:0 4218:0 '),\n('4218','db440','571','65','4175','70','74','0','3986.58','-553.999','216.076','2.58635','4217:0 4219:0 '),\n('4219','db441','571','65','4254','70','74','0','3809.46','-473.161','169.556','2.73087','4218:0 4220:0 '),\n('4220','db442','571','65','65','70','74','0','3724.29','-439.939','157.058','3.21388','4219:0 4221:0 '),\n('4221','db443','571','65','4254','70','74','0','3784.04','-368.672','97.0346','1.91644','4220:0 4138:0 '),\n('4222','db444','571','65','4254','70','74','0','3263.75','-275.159','91.4928','3.40319','4136:0 4223:0 '),\n('4223','db445','571','65','65','70','74','0','3244.55','-472.809','140.618','1.83632','4222:0 4224:0 4234:0 '),\n('4224','db446','571','65','65','70','74','0','3148.48','-604.869','113.192','1.5842','4223:0 4225:0 4237:0 '),\n('4225','db447','571','65','4180','70','74','0','2993.93','-429.733','123.402','2.59501','4224:0 4226:0 '),\n('4226','db448','571','65','4180','70','74','0','2867.29','-384.503','112.462','2.7623','4225:0 4227:0 4233:0 '),\n('4227','db449','571','65','4180','70','74','0','2773.28','-465.739','116.162','4.48387','4226:0 4228:0 '),\n('4228','db450','571','65','4180','70','74','0','2687.72','-431.283','71.3279','2.92957','4227:0 4229:0 '),\n('4229','db451','571','65','4181','70','74','0','2536.4','-415.378','2.90773','1.58496','4228:0 4230:0 4253:0 '),\n('4230','db452','571','65','4181','70','74','0','2612.51','-244.345','1.72779','6.26044','4229:0 4231:0 '),\n('4231','db453','571','65','4180','70','74','0','2656.87','-171.598','62.2241','1.32029','4230:0 4232:0 '),\n('4232','db454','571','65','4180','70','74','0','2737.23','-100.56','114.159','4.23648','4231:0 4233:0 '),\n('4233','db455','571','65','4180','70','74','0','2792.04','-264.842','132.149','5.26534','4232:0 4226:0 '),\n('4234','db456','571','65','4186','70','74','5','3231.05','-661.255','166.734','1.42239','4223:0 4235:0 '),\n('4235','db457','571','65','4186','70','74','4','3272.19','-751.348','168.143','4.40298','4234:0 4236:0 '),\n('4236','db458','571','65','65','70','74','0','3325.52','-1005.39','123.604','2.0507','4235:0 4237:0 4238:0 4249:0 '),\n('4237','db459','571','65','65','70','74','0','3207.68','-802.517','112.975','2.23134','4236:0 4224:0 '),\n('4238','db460','571','65','65','70','74','0','3400.63','-1169.43','112.122','5.78762','4236:0 4239:0 4241:0 '),\n('4239','db461','571','65','65','70','74','0','3494.11','-1049.52','124.775','0.832553','4238:0 4240:0 '),\n('4240','db462','571','65','4177','70','74','2','3600.71','-914.48','156.552','1.53549','4239:0 4214:0 '),\n('4241','db463','571','65','65','70','74','0','3235.06','-1355.04','70.8979','3.83276','4238:0 4242:0 '),\n('4242','db464','571','65','4257','70','74','0','3180.86','-1542.39','40.4347','4.7124','4241:0 4243:0 4277:0 '),\n('4243','db465','571','65','4241','70','74','0','3051.36','-1392.98','57.3848','2.94133','4242:0 4244:0 '),\n('4244','db466','571','65','4241','70','74','0','2889.8','-1432.73','58.3338','3.04186','4243:0 4245:0 '),\n('4245','db467','571','65','4241','70','74','0','2772.55','-1373.06','40.6788','6.18974','4244:0 4246:0 '),\n('4246','db468','571','65','4185','70','74','0','2882.77','-1303.94','6.48389','1.04459','4245:0 4247:0 '),\n('4247','db469','571','65','4185','70','74','0','2938.22','-1169.74','6.81704','5.99025','4246:0 4248:0 4250:0 '),\n('4248','db470','571','65','4185','70','74','0','3085.09','-1193.85','12.4717','5.4876','4247:0 4249:0 '),\n('4249','db471','571','65','4185','70','74','0','3180.57','-1059.52','44.9918','0.29769','4248:0 4236:0 '),\n('4250','db472','571','65','4185','70','74','0','2929.48','-986.506','4.6099','1.77817','4247:0 4251:0 '),\n('4251','db473','571','65','4185','70','74','0','2865.52','-836.167','15.7438','2.35701','4250:0 4252:0 '),\n('4252','db474','571','65','4185','70','74','0','2691.63','-707.31','8.95638','2.62875','4251:0 4253:0 '),\n('4253','db475','571','65','4181','70','74','0','2662.91','-565.045','4.97671','2.87851','4252:0 4229:0 '),\n('4254','db476','571','65','65','70','74','0','3597.9','1391.95','92.2854','0.792481','4129:0 4255:0 '),\n('4255','db477','571','65','4165','70','74','4','3768.55','1529.38','86.92','0.415486','4254:0 4256:0 '),\n('4256','db478','571','65','4165','70','74','5','3841.3','1533.41','89.7247','1.82685','4255:0 4257:0 '),\n('4257','db479','571','65','4165','70','74','4','3890.52','1637.61','96.2566','0.644815','4256:0 4258:0 '),\n('4258','db480','571','65','65','70','74','0','4003.51','1741.08','142.414','3.8728','4257:0 4259:0 '),\n('4259','db481','571','65','65','70','74','0','3800.66','1801.11','107.946','0.35893','4258:0 4260:0 4273:0 '),\n('4260','db482','571','65','65','70','74','0','3642.7','1910.26','75.9736','1.69646','4259:0 4261:0 4115:0 '),\n('4261','db483','571','65','65','70','74','0','3615.88','2050.78','74.6297','1.7962','4260:0 4262:0 4265:0 '),\n('4262','db484','571','65','4164','70','74','0','3709.48','2144.81','53.4192','3.56571','4261:0 4263:0 4264:0 '),\n('4263','db485','571','65','4164','70','74','0','3706.64','2076.92','21.8594','1.15533','4262:0 4264:0 '),\n('4264','db486','571','65','4164','70','74','0','3772.34','2169.36','27.3597','4.8828','4263:0 4262:0 '),\n('4265','db487','571','65','65','70','74','0','3638.81','2223.64','76.3879','1.34851','4261:0 4266:0 '),\n('4266','db488','571','65','65','70','74','0','3608.56','2424.79','84.7521','0.47515','4265:0 4267:0 '),\n('4267','db489','571','65','65','70','74','0','3667.57','2606.35','104.934','2.34754','4266:0 4110:0 4268:0 '),\n('4268','db490','571','65','65','70','74','0','3821.64','2594.47','138.086','5.63442','4267:0 4269:0 '),\n('4269','db491','571','65','4163','70','74','0','3877.75','2397.8','152.255','5.33596','4268:0 4270:0 '),\n('4270','db492','571','65','4163','70','74','0','4003.82','2286.07','153.425','6.19125','4269:0 4271:0 '),\n('4271','db493','571','65','4163','70','74','0','4084.73','2159.31','153.682','4.48536','4270:0 4272:0 '),\n('4272','db494','571','65','4163','70','74','0','3961.11','2124.54','131.41','3.85941','4271:0 4273:0 '),\n('4273','db495','571','65','65','70','74','0','3825.91','1954.77','104.913','4.14765','4272:0 4259:0 '),\n('4274','db496','571','65','4151','70','74','4','3706.43','2835.58','88.7151','0.419359','4110:0 4275:0 '),\n('4275','db497','571','65','4151','70','74','5','3828.74','2884','90.3388','0.171959','4274:0 '),\n('4276','gh498','571','394','394','72','76','0','4412.91','-1618.03','162.125','4.64085','4198:0 4289:0 '),\n('4277','gh499','571','394','394','72','76','0','3182.34','-1659.02','38.7919','4.89218','4242:0 4278:0 '),\n('4278','gh500','571','394','394','72','76','0','3170.1','-1849.63','70.0118','5.13957','4277:0 4279:0 '),\n('4279','gh501','571','394','4236','72','76','0','3193.69','-1991.71','85.0008','6.13546','4278:0 4280:0 4306:0 '),\n('4280','gh502','571','394','394','72','76','0','3351.7','-1957.7','116.26','3.20042','4279:0 4281:0 4302:0 '),\n('4281','gh503','571','394','394','72','76','0','3506.14','-1975.54','165.694','5.76004','4280:0 4282:0 4301:0 '),\n('4282','gh504','571','394','394','72','76','0','3654.24','-2134.59','147.89','4.94165','4281:0 4283:0 4331:0 '),\n('4283','gh505','571','394','394','72','76','0','3768.13','-2266.2','173.421','6.00979','4282:0 4284:0 4297:0 4331:0 '),\n('4284','gh506','571','394','394','72','76','0','3965.13','-2347.84','213.634','6.13467','4283:0 4285:0 4446:0 '),\n('4285','gh507','571','394','394','72','76','0','4179.57','-2348.21','225.457','0.204908','4284:0 4286:0 4435:0 '),\n('4286','gh508','571','394','394','72','76','0','4360.95','-2316.79','201.282','0.15857','4285:0 4287:0 4296:0 '),\n('4287','gh509','571','394','394','72','76','0','4456.7','-2146.34','174.126','1.54558','4286:0 4288:0 '),\n('4288','gh510','571','394','394','72','76','0','4445.16','-1972.91','158.144','1.95792','4287:0 4289:0 '),\n('4289','gh511','571','394','394','72','76','0','4441.13','-1782.37','162.404','1.80319','4288:0 4276:0 4290:0 '),\n('4290','gh512','571','394','394','72','76','0','4395.14','-1892.04','161.168','3.62925','4289:0 4291:0 '),\n('4291','gh513','571','394','4209','72','76','0','4294.12','-1906.66','197.755','3.31587','4290:0 4292:0 4293:0 4294:0 '),\n('4292','gh514','571','394','4209','72','76','0','4245.43','-2019.66','235.391','1.60371','4291:0 '),\n('4293','gh515','571','394','4209','72','76','0','4219.61','-1824.36','202.548','2.41267','4291:0 '),\n('4294','gh516','571','394','4209','72','76','0','4141.35','-1993.19','212.874','4.66597','4291:0 4295:0 '),\n('4295','gh517','571','394','4209','72','76','0','4200.73','-2152.09','218.191','0.0124693','4294:0 4296:0 '),\n('4296','gh518','571','394','394','72','76','0','4337.91','-2212.2','191.313','5.10972','4295:0 4286:0 '),\n('4297','gh519','571','394','394','72','76','0','3919.84','-2211.56','210.955','0.375331','4283:0 4298:0 '),\n('4298','gh520','571','394','394','72','76','0','3841.19','-2055.11','210.168','1.65396','4297:0 4299:0 '),\n('4299','gh521','571','394','394','72','76','0','3817.14','-1865.71','214.679','1.96419','4298:0 4300:0 '),\n('4300','gh522','571','394','394','72','76','0','3654.79','-1866.78','173.387','2.8674','4299:0 4301:0 '),\n('4301','gh523','571','394','394','72','76','0','3559.72','-1897.37','155.876','3.47686','4300:0 4281:0 '),\n('4302','gh524','571','394','394','72','76','0','3387.84','-2133.26','124.553','5.44191','4280:0 4303:0 '),\n('4303','gh525','571','394','4206','72','76','4','3345.18','-2217.45','119.375','3.61665','4302:0 4304:0 '),\n('4304','gh526','571','394','4206','72','76','5','3256.98','-2231.76','116.09','1.0425','4303:0 4305:0 '),\n('4305','gh527','571','394','394','72','76','0','3086.49','-2267.46','94.942','1.73561','4304:0 4306:0 4314:0 '),\n('4306','gh528','571','394','394','72','76','0','3084.66','-2084.36','87.6685','1.27615','4305:0 4279:0 4307:0 '),\n('4307','gh529','571','394','394','72','76','0','2953.2','-1963.36','51.3225','2.81396','4306:0 4308:0 '),\n('4308','gh530','571','394','4242','72','76','0','2828.38','-1917.21','9.14124','2.88465','4307:0 4309:0 4310:0 '),\n('4309','gh531','571','394','4242','72','76','0','2698.31','-2040.99','3.89624','0.465604','4308:0 4313:0 '),\n('4310','gh532','571','394','4242','72','76','0','2755.77','-1781.45','5.41989','5.167','4308:0 4311:0 '),\n('4311','gh533','571','394','4242','72','76','0','2565.61','-1807.96','9.92644','3.51374','4310:0 4312:0 '),\n('4312','gh534','571','394','4242','72','76','0','2542.58','-1990.88','8.43344','5.20077','4311:0 4313:0 '),\n('4313','gh535','571','394','4242','72','76','0','2617','-2122.41','7.0106','0.525292','4312:0 4309:0 '),\n('4314','gh536','571','394','394','72','76','0','3111.6','-2469.39','60.839','4.64079','4305:0 4315:0 '),\n('4315','gh537','571','394','394','72','76','0','3050.93','-2690.26','65.2339','4.32742','4314:0 4316:0 '),\n('4316','gh538','571','394','394','72','76','0','2996.43','-2911.54','99.7541','3.55929','4315:0 4317:0 4323:0 '),\n('4317','gh539','571','394','394','72','76','0','2806.9','-2891.38','64.0493','3.18937','4316:0 4318:0 '),\n('4318','gh540','571','394','394','72','76','0','2688.1','-2877.41','68.4325','1.86676','4319:0 4317:0 4011:0 4002:0 '),\n('4319','gh541','571','394','4207','72','76','0','2863.15','-2691.55','84.6612','0.692585','4320:0 4318:0 '),\n('4320','gh542','571','394','4207','72','76','0','2913.28','-2523.08','77.2727','2.2516','4319:0 4321:0 '),\n('4321','gh543','571','394','4207','72','76','0','2759.62','-2433.25','39.5256','4.18681','4320:0 4322:0 '),\n('4322','gh544','571','394','394','72','76','0','2655.99','-2570.44','12.8707','0.715349','4321:0 4012:0 '),\n('4323','gh545','571','394','4240','72','76','0','3159.97','-2966.67','125.976','5.16462','4316:0 4324:0 '),\n('4324','gh546','571','394','394','72','76','0','3229.99','-3097.97','155.647','5.16069','4323:0 4325:0 4333:0 '),\n('4325','gh547','571','394','394','72','76','0','3347.86','-2939.95','194.535','0.886556','4324:0 4326:0 '),\n('4326','gh548','571','394','4204','72','76','3','3409.22','-2819.78','200.664','5.07272','4325:0 4327:0 '),\n('4327','gh549','571','394','394','72','76','0','3563.32','-2837.92','196.693','3.21211','4326:0 4328:0 '),\n('4328','gh550','571','394','394','72','76','0','3639.37','-2888.65','220.844','1.05698','4327:0 4329:0 4332:0 4432:0 '),\n('4329','gh551','571','394','394','72','76','0','3750.73','-2701.59','175.222','0.808005','4328:0 4330:0 4448:0 '),\n('4330','gh552','571','394','394','72','76','0','3701.9','-2499.94','160.171','2.01988','4329:0 4331:0 '),\n('4331','gh553','571','394','394','72','76','0','3667.41','-2329.55','156.4','0.83785','4330:0 4283:0 4282:0 '),\n('4332','gh554','571','394','394','72','76','0','3567.56','-3072.84','238.573','4.01871','4328:0 4333:0 4334:0 '),\n('4333','gh555','571','394','394','72','76','0','3355.89','-3183.89','200.874','2.94663','4332:0 4324:0 '),\n('4334','gh556','571','394','394','72','76','0','3543.08','-3277.22','242.517','4.88658','4332:0 4335:0 '),\n('4335','gh557','571','394','394','72','76','0','3676.96','-3469.09','242.035','5.54866','4334:0 4336:0 4429:0 '),\n('4336','gh558','571','394','394','72','76','0','3696.59','-3688.31','209.189','4.55906','4335:0 4337:0 '),\n('4337','gh559','571','394','394','72','76','0','3728.04','-3862.81','183.316','0.164743','4336:0 4338:0 4340:0 4347:0 '),\n('4338','gh560','571','394','4215','72','76','0','3590.62','-3901.08','196.64','2.77227','4337:0 4339:0 '),\n('4339','gh561','571','394','4215','72','76','0','3525.9','-3755.42','228.317','2.26176','4338:0 '),\n('4340','gh562','571','394','395','72','76','0','3841.06','-3743.21','175.461','6.13141','4337:0 4341:0 '),\n('4341','gh563','571','394','395','72','76','0','3974.14','-3774.46','151.082','6.17382','4340:0 4342:0 '),\n('4342','gh564','571','394','395','72','76','0','4052.02','-3740.14','220.288','4.50485','4341:0 4343:0 '),\n('4343','gh565','571','394','395','72','76','0','4135.39','-3710.81','180.991','2.0819','4342:0 4344:0 '),\n('4344','gh566','571','394','395','72','76','0','4194.15','-3814.05','181.668','4.59518','4343:0 4345:0 '),\n('4345','gh567','571','394','395','72','76','0','4181.7','-3982.87','170.498','4.5402','4344:0 4346:0 4409:0 '),\n('4346','gh568','571','394','394','72','76','0','4024.2','-4043.93','176.713','3.04794','4345:0 4347:0 4409:0 '),\n('4347','gh569','571','394','394','72','76','0','3787.44','-3987.74','181.678','2.65995','4346:0 4337:0 4348:0 '),\n('4348','gh570','571','394','394','72','76','0','3718.3','-4188.38','192.248','4.50249','4347:0 4349:0 4356:0 '),\n('4349','gh571','571','394','394','72','76','0','3545.36','-4300.26','227.855','3.59221','4348:0 4350:0 '),\n('4350','gh572','571','394','394','72','76','0','3375.07','-4408.72','245.826','4.29907','4349:0 4351:0 4353:0 '),\n('4351','gh573','571','394','4480','72','76','0','3261.77','-4590.54','305.739','3.95742','4350:0 4352:0 '),\n('4352','gh574','571','394','4480','72','76','0','3089.14','-4641.2','316.308','3.35188','4351:0 4045:0 '),\n('4353','gh575','571','394','4218','72','76','0','3502.07','-4548.51','221.433','3.38171','4350:0 4354:0 '),\n('4354','gh576','571','394','394','72','76','0','3656.98','-4455.52','184.363','5.84315','4353:0 4355:0 '),\n('4355','gh577','571','394','394','72','76','0','3731.98','-4511.53','193.763','0.757702','4354:0 4356:0 '),\n('4356','gh578','571','394','394','72','76','5','3851.11','-4369.54','192.918','1.37424','4355:0 4348:0 4357:0 '),\n('4357','gh579','571','394','4205','72','76','0','3939.37','-4409.34','238.255','4.98392','4356:0 4358:0 '),\n('4358','gh580','571','394','4205','72','76','0','4062.37','-4401.54','260.429','0.235388','4357:0 4359:0 4408:0 4410:0 '),\n('4359','gh581','571','394','394','72','76','0','4171.31','-4502.24','219.959','1.1284','4358:0 4360:0 '),\n('4360','gh582','571','394','4205','72','76','0','4003.62','-4566.46','195.348','3.13431','4359:0 4361:0 '),\n('4361','gh583','571','394','394','72','76','0','4008.13','-4692.66','141.153','5.45436','4360:0 4362:0 '),\n('4362','gh584','571','394','4231','72','76','0','4082.28','-4754.21','96.3716','4.76714','4361:0 4363:0 '),\n('4363','gh585','571','394','4249','72','76','0','4193.08','-4880.87','42.4572','3.89614','4362:0 4364:0 4374:0 4382:0 '),\n('4364','gh586','571','394','4249','72','76','0','4317.27','-4702.62','75.8335','0.62967','4363:0 4365:0 '),\n('4365','gh587','571','394','4249','72','76','0','4444.07','-4566.46','104.898','1.65462','4364:0 4366:0 '),\n('4366','gh588','571','394','4249','72','76','0','4428.45','-4387.5','151.381','1.08913','4365:0 4367:0 '),\n('4367','gh589','571','394','4159','72','76','0','4438.72','-4286.42','161.56','6.09212','4366:0 4368:0 4420:0 '),\n('4368','gh590','571','394','4249','72','76','0','4621.51','-4357.67','181.183','5.95781','4367:0 4369:0 '),\n('4369','gh591','571','394','4221','72','76','0','4732.05','-4454.6','194.355','5.45673','4368:0 4370:0 '),\n('4370','gh592','571','394','4221','72','76','0','4820.92','-4522.91','200.404','5.83294','4369:0 4371:0 '),\n('4371','gh593','571','394','4221','72','76','0','4909.98','-4586.39','219.616','4.43492','4370:0 4372:0 '),\n('4372','gh594','571','394','4221','72','76','0','4984.98','-4692.79','219.491','5.1245','4371:0 4373:0 '),\n('4373','gh595','571','394','4221','72','76','0','5041.25','-4817','219.501','2.53662','4372:0 '),\n('4374','gh596','571','394','4212','72','76','0','4339.89','-4870.51','34.7802','0.17335','4363:0 4375:0 '),\n('4375','gh597','571','394','4216','72','76','0','4474.49','-4921.22','14.201','5.96566','4374:0 4376:0 4377:0 '),\n('4376','gh598','571','394','4212','72','76','0','4518.04','-5017.36','3.25924','5.12764','4375:0 '),\n('4377','gh599','571','394','4216','72','76','0','4569.4','-4865.21','47.9919','0.149002','4375:0 4378:0 4379:0 4380:0 '),\n('4378','gh600','571','394','4216','72','76','0','4707.48','-4794.55','47.992','5.06167','4377:0 4379:0 '),\n('4379','gh601','571','394','4216','72','76','0','4708.25','-4910.12','47.9928','1.36166','4377:0 4378:0 '),\n('4380','gh602','571','394','4216','72','76','0','4744.53','-4859.91','26.2962','0.387759','4377:0 4381:0 '),\n('4381','gh603','571','394','4216','72','76','0','4816.99','-4789.4','25.4718','0.872349','4380:0 '),\n('4382','gh604','571','394','4249','72','76','0','4022.33','-4997.21','41.214','3.78223','4363:0 4383:0 4391:0 '),\n('4383','gh605','571','394','4249','72','76','0','3816.35','-5011.96','106.526','3.31727','4382:0 4384:0 4392:0 '),\n('4384','gh606','571','394','4220','72','76','0','3646.81','-5000.53','175.852','4.1867','4383:0 4385:0 '),\n('4385','gh607','571','394','4220','72','76','0','3524.22','-5120.65','233.744','2.61591','4384:0 4386:0 4389:0 '),\n('4386','gh608','571','394','4220','72','76','0','3419.01','-4995.77','285.739','2.5845','4385:0 4387:0 '),\n('4387','gh609','571','394','4220','72','76','0','3356.74','-5082.19','325.289','3.94009','4386:0 4388:0 '),\n('4388','gh610','571','394','4220','72','76','0','3310.99','-5122.5','340.978','1.36004','4387:0 '),\n('4389','gh611','571','394','4220','72','76','0','3433.34','-5250.17','269.339','1.01289','4385:0 4390:0 '),\n('4390','gh612','571','394','4220','72','76','0','3407.12','-5388.15','267.856','1.78573','4389:0 '),\n('4391','gh613','571','394','4212','72','76','0','4006.9','-5232.47','7.75033','1.18098','4382:0 4402:0 '),\n('4392','gh614','571','394','394','72','76','0','3757.96','-5153.08','119.324','4.14823','4383:0 4393:0 '),\n('4393','gh615','571','394','394','72','76','0','3598.76','-5357.93','139.869','4.05555','4392:0 4394:0 '),\n('4394','gh616','571','394','4213','72','76','0','3443.06','-5490.97','198.431','3.26623','4393:0 4395:0 '),\n('4395','gh617','571','394','4213','72','76','0','3274.45','-5572.3','213.641','3.71783','4394:0 4396:0 '),\n('4396','gh618','571','394','4213','72','76','0','3100.03','-5709.35','220.326','3.74532','4395:0 4401:0 '),\n('4397','hf619','571','495','4061','68','73','0','2323.35','-5813.06','251.394','3.16805','4060:0 4061:0 4398:0 '),\n('4398','hf620','571','495','495','68','73','0','2519.29','-5851.8','276.256','4.73492','4397:0 4399:0 '),\n('4399','hf621','571','495','495','68','73','0','2703.09','-5953.52','271.511','6.11722','4398:0 4400:0 '),\n('4400','hf622','571','495','4252','68','73','0','2849.67','-5840.96','273.44','0.629637','4399:0 4401:0 '),\n('4401','hf623','571','495','4252','68','73','0','3003.04','-5779.08','254.433','0.523608','4400:0 4396:0 '),\n('4402','gh624','571','394','4212','72','76','0','4153.59','-5224.2','7.42476','6.08423','4391:0 4403:0 '),\n('4403','gh625','571','394','4212','72','76','0','4327.94','-5342.7','4.49671','5.82112','4402:0 4404:0 '),\n('4404','gh626','571','394','4244','72','76','0','4543.08','-5485.22','2.18391','5.50775','4403:0 4405:0 '),\n('4405','gh627','571','394','4244','72','76','0','4695.42','-5635.74','77.5219','4.55742','4404:0 4406:0 '),\n('4406','gh628','571','394','4245','72','76','0','4616.66','-5660.81','114.593','4.22877','4405:0 4407:0 '),\n('4407','gh629','571','394','4245','72','76','0','4593.57','-5707.41','184.506','1.02041','4406:0 '),\n('4408','gh630','571','394','394','72','76','0','4113.47','-4233.27','243.732','1.89258','4358:0 4409:0 '),\n('4409','gh631','571','394','394','72','76','1','4125.58','-4095.14','182.823','2.77224','4408:0 4346:0 4345:0 '),\n('4410','gh632','571','394','394','72','76','0','4172.63','-4310.2','238.733','2.85314','4358:0 4411:0 '),\n('4411','gh633','571','394','394','72','76','0','4326.78','-4119.6','193.825','0.547988','4410:0 4412:0 '),\n('4412','gh634','571','394','394','72','76','0','4486.09','-3977.4','186.997','5.61774','4411:0 4413:0 4422:0 '),\n('4413','gh635','571','394','394','72','76','0','4625.2','-4092.13','199.11','2.30728','4412:0 4414:0 '),\n('4414','gh636','571','394','394','72','76','0','4734.83','-4181.86','231.297','2.31358','4413:0 4415:0 '),\n('4415','gh637','571','394','394','72','76','0','4906.69','-4306.46','257.585','0.692519','4414:0 4416:0 4449:0 '),\n('4416','gh638','571','394','4214','72','76','0','5016.3','-4437.54','278.117','5.31851','4415:0 4417:0 '),\n('4417','gh639','571','394','4214','72','76','0','5101.89','-4569.13','283.736','5.11902','4416:0 4418:0 '),\n('4418','gh640','571','394','4214','72','76','0','5193.65','-4729.96','293.156','5.98138','4417:0 4419:0 '),\n('4419','gh641','571','394','4214','72','76','0','5380.16','-4761.41','305.589','6.26491','4418:0 '),\n('4420','gh642','571','394','4159','72','76','2','4508.01','-4224.81','167.488','4.05322','4367:0 4421:0 '),\n('4421','gh643','571','394','4159','72','76','3','4593.24','-4223.94','178.654','3.05419','4420:0 '),\n('4422','gh644','571','394','394','72','76','0','4397.58','-3823.41','207.663','1.98605','4412:0 4423:0 '),\n('4423','gh645','571','394','4235','72','76','0','4363.62','-3661.89','253.292','1.03572','4422:0 4424:0 4426:0 '),\n('4424','gh646','571','394','4270','72','76','0','4464.25','-3523.69','231.349','0.662651','4423:0 4425:0 '),\n('4425','gh647','571','394','4270','72','76','0','4540.35','-3448.14','226.932','0.666578','4424:0 4450:0 '),\n('4426','gh648','571','394','394','72','76','0','4254.62','-3537.34','262.169','3.11545','4423:0 4427:0 '),\n('4427','gh649','571','394','394','72','76','0','4082.82','-3452.53','279.273','2.96073','4426:0 4428:0 '),\n('4428','gh650','571','394','4267','72','76','0','4017.93','-3398.46','291.406','1.89652','4427:0 4429:0 4430:0 '),\n('4429','gh651','571','394','394','72','76','0','3805.22','-3452.83','276.397','3.26311','4428:0 4335:0 '),\n('4430','gh652','571','394','394','72','76','0','3927.34','-3218.24','296.696','2.32848','4428:0 4431:0 4438:0 '),\n('4431','gh653','571','394','394','72','76','0','3809.69','-3057.95','274.256','2.59945','4430:0 4432:0 4445:0 '),\n('4432','gh654','571','394','394','72','76','0','3727.35','-2986.21','236.602','2.62301','4431:0 4328:0 4433:0 '),\n('4433','gh655','571','394','4203','72','76','0','3799.13','-2875.46','222.297','0.855862','4432:0 4434:0 '),\n('4434','gh656','571','394','394','72','76','0','3912.6','-2792.74','176.353','3.96212','4433:0 '),\n('4435','gh657','571','394','4199','72','76','0','4204.22','-2467.24','229.848','5.58004','4285:0 4436:0 4437:0 '),\n('4436','gh658','571','394','4199','72','76','1','4355.92','-2485.04','242.225','3.56707','4435:0 4437:0 '),\n('4437','gh659','571','394','4199','72','76','0','4320.51','-2585.42','246.459','1.97429','4436:0 4435:0 '),\n('4438','gh660','571','394','4222','72','76','0','4055.91','-3147.98','278.056','5.70496','4430:0 4439:0 '),\n('4439','gh661','571','394','4222','72','76','0','4250.54','-3177.85','307.936','0.898319','4438:0 4440:0 '),\n('4440','gh662','571','394','4222','72','76','0','4326.86','-3320.66','310.551','0.546446','4439:0 4441:0 '),\n('4441','gh663','571','394','4222','72','76','0','4447.75','-3199.73','313.463','2.16044','4440:0 4442:0 '),\n('4442','gh664','571','394','4222','72','76','0','4418.84','-2984.71','309.349','1.76303','4441:0 4443:0 '),\n('4443','gh665','571','394','4222','72','76','0','4226.67','-2862.19','281.474','3.5718','4442:0 4444:0 '),\n('4444','gh666','571','394','4222','72','76','0','4035.13','-2946.41','276.096','3.8946','4443:0 4445:0 '),\n('4445','gh667','571','394','4222','72','76','0','3928.19','-3008.94','275.401','3.52703','4444:0 4431:0 '),\n('4446','gh668','571','394','394','72','76','0','3974.25','-2486.57','216.336','4.66038','4284:0 4447:0 '),\n('4447','gh669','571','394','4202','72','76','0','3933.08','-2603.19','206.74','5.22586','4446:0 4448:0 '),\n('4448','gh670','571','394','394','72','76','0','3783','-2602.59','191.183','4.81351','4447:0 4329:0 '),\n('4449','zd671','571','66','66','73','77','0','5075.22','-4157.1','351.671','0.704319','4415:0 4576:0 4577:0 '),\n('4450','zd672','571','66','66','73','77','0','4642.75','-3362.88','292.419','0.845695','4425:0 4516:0 '),\n('4451','zd673','571','66','66','73','77','0','4845.51','-1504.94','248.946','5.30284','4195:0 4452:0 '),\n('4452','zd674','571','66','66','73','77','0','4915.37','-1688.61','248.309','4.74834','4451:0 4453:0 '),\n('4453','zd675','571','66','66','73','77','0','4913.71','-1902.76','248.309','4.71615','4452:0 4454:0 4456:0 '),\n('4454','zd676','571','66','66','73','77','0','4907.24','-2149.46','248.308','4.51509','4453:0 4455:0 4456:0 '),\n('4455','zd677','571','66','4316','73','77','0','4935.58','-2282.22','243.077','5.02638','4454:0 4492:0 '),\n('4456','zd678','571','66','66','73','77','0','4948.85','-2047.71','248.309','0.0634512','4454:0 4453:0 4457:0 '),\n('4457','zd679','571','66','66','73','77','0','5154.72','-2050.3','248.297','1.1198','4456:0 4458:0 4488:0 4489:0 '),\n('4458','zd680','571','66','66','73','77','0','5198.14','-1908','243.765','1.97824','4457:0 4459:0 '),\n('4459','zd681','571','66','4311','73','77','0','5168.01','-1763.65','243.57','1.69157','4458:0 4460:0 '),\n('4460','zd682','571','66','4311','73','77','0','5227.64','-1629.23','235.86','1.70729','4459:0 4461:0 '),\n('4461','zd683','571','66','66','73','77','0','5202.17','-1444.6','235.3','1.67195','4460:0 4462:0 4463:0 '),\n('4462','zd684','571','66','4312','73','77','1','5228.85','-1333.15','242.312','5.2078','4461:0 4463:0 '),\n('4463','zd685','571','66','66','73','77','0','5369.86','-1421.32','236.955','3.0236','4462:0 4461:0 4464:0 '),\n('4464','zd686','571','66','66','73','77','0','5446.59','-1338.52','239.221','4.34385','4463:0 4465:0 4466:0 4486:0 '),\n('4465','zd687','571','66','66','73','77','0','5443.61','-1214.88','247.443','1.55882','4464:0 4607:0 '),\n('4466','zd688','571','66','4313','73','77','0','5555.66','-1397.11','239.86','2.99374','4464:0 4467:0 '),\n('4467','zd689','571','66','4313','73','77','0','5695.79','-1400.51','234.446','5.54941','4466:0 4468:0 4481:0 '),\n('4468','zd690','571','66','4313','73','77','0','5775.25','-1545.64','229.906','6.10312','4467:0 4469:0 4481:0 '),\n('4469','zd691','571','66','4469','73','77','0','5886.45','-1638.86','237.734','5.61617','4468:0 4470:0 4482:0 '),\n('4470','zd692','571','66','4469','73','77','0','5972.87','-1716.32','231.167','5.38055','4469:0 4471:0 '),\n('4471','zd693','571','66','4469','73','77','0','6050.18','-1854.06','239.866','4.90932','4470:0 4472:0 '),\n('4472','zd694','571','66','4315','73','77','0','6083.8','-1956.71','235.309','5.74812','4471:0 4473:0 4475:0 '),\n('4473','zd695','571','66','4315','73','77','0','6239.25','-1977.17','235.732','4.86297','4472:0 4474:0 '),\n('4474','zd696','571','66','4315','73','77','0','6209.7','-2182.71','236.212','3.31259','4473:0 4475:0 '),\n('4475','zd697','571','66','4315','73','77','0','6062.56','-2208.12','234.275','1.69703','4474:0 4472:0 4476:0 '),\n('4476','zd698','571','66','4315','73','77','0','5846.96','-2232.9','236.499','3.12253','4475:0 4477:0 '),\n('4477','zd699','571','66','4468','73','77','0','5680.87','-2213.84','239.83','3.10525','4476:0 4478:0 4483:0 '),\n('4478','zd700','571','66','4468','73','77','0','5565.53','-2198.52','235.496','1.86432','4477:0 4479:0 '),\n('4479','zd701','571','66','4468','73','77','0','5571.97','-1996.67','237.88','1.26977','4478:0 4480:0 4483:0 4484:0 '),\n('4480','zd702','571','66','4468','73','77','0','5653.64','-1810.94','236.435','1.32868','4479:0 4481:0 4482:0 '),\n('4481','zd703','571','66','4313','73','77','0','5609.8','-1610.43','237.022','0.732563','4480:0 4468:0 4467:0 '),\n('4482','zd704','571','66','4468','73','77','0','5833.14','-1759.05','233.346','1.1936','4480:0 4469:0 4483:0 '),\n('4483','zd705','571','66','4468','73','77','0','5766.32','-1991.79','235.993','4.71376','4482:0 4477:0 4479:0 '),\n('4484','zd706','571','66','66','73','77','0','5444.04','-1955.64','248.222','4.72161','4479:0 4485:0 4487:0 4488:0 '),\n('4485','zd707','571','66','66','73','77','0','5446.88','-1747.93','248.337','1.71275','4484:0 4486:0 '),\n('4486','zd708','571','66','66','73','77','0','5445.34','-1527.93','248.26','1.56823','4485:0 4464:0 '),\n('4487','zd709','571','66','66','73','77','0','5449.03','-2186.49','248.309','4.69804','4484:0 4493:0 '),\n('4488','zd710','571','66','66','73','77','0','5286.44','-2043.61','246.138','3.10918','4484:0 4457:0 '),\n('4489','zd711','571','66','4317','73','77','1','5168.98','-2192.3','236.538','5.78582','4457:0 4490:0 '),\n('4490','zd712','571','66','66','73','77','0','5057.15','-2200.22','244.382','3.79877','4489:0 4491:0 '),\n('4491','zd713','571','66','66','73','77','0','5039.31','-2353.08','242.172','3.30084','4490:0 4492:0 '),\n('4492','zd714','571','66','4316','73','77','0','4870.93','-2382.92','234.006','2.40312','4491:0 4455:0 '),\n('4493','zd715','571','66','4275','73','77','0','5451.23','-2302.91','297.236','1.61772','4487:0 4494:0 4495:0 4522:0 '),\n('4494','zd716','571','66','4275','73','77','0','5448.61','-2517.18','292.419','4.61951','4493:0 4495:0 4511:0 4522:0 '),\n('4495','zd717','571','66','4275','73','77','0','5555.82','-2440.17','290.942','2.83587','4494:0 4493:0 4496:0 4522:0 '),\n('4496','zd718','571','66','4318','73','77','0','5688.46','-2430.58','287.55','3.11862','4495:0 4497:0 '),\n('4497','zd719','571','66','4294','73','77','0','5806.54','-2342.64','290.484','5.7662','4496:0 4498:0 '),\n('4498','zd720','571','66','4294','73','77','0','5929.41','-2434.64','292.384','5.92563','4497:0 4499:0 '),\n('4499','zd721','571','66','4294','73','77','0','6095.28','-2375.23','290.191','0.345376','4498:0 4500:0 '),\n('4500','zd722','571','66','4276','73','77','0','6180.98','-2386.29','307.72','4.9046','4499:0 4501:0 '),\n('4501','zd723','571','66','4276','73','77','0','6189.69','-2520.06','304.709','4.73102','4500:0 4502:0 4507:0 '),\n('4502','zd724','571','66','4276','73','77','0','6265.08','-2506.2','302.978','4.68313','4501:0 4503:0 '),\n('4503','zd725','571','66','4276','73','77','0','6245.94','-2735.34','302.749','3.45398','4502:0 4504:0 4505:0 '),\n('4504','zd726','571','66','4276','73','77','0','6057.61','-2737.89','302.8','1.51562','4503:0 4506:0 '),\n('4505','zd727','571','66','66','73','77','0','6297.01','-2862.98','293.934','2.17613','4503:0 '),\n('4506','zd728','571','66','66','73','77','0','6048.63','-2898.7','296.891','3.34009','4504:0 '),\n('4507','zd729','571','66','4276','73','77','0','6198.47','-2622.9','293.162','1.74809','4501:0 4508:0 '),\n('4508','zd730','571','66','4276','73','77','0','6057.09','-2616.09','302.748','3.26077','4507:0 4509:0 '),\n('4509','zd731','571','66','66','73','77','0','5884.73','-2617.57','292.418','3.15396','4508:0 4510:0 '),\n('4510','zd732','571','66','66','73','77','0','5672.49','-2619.11','292.418','3.13825','4509:0 4511:0 4523:0 '),\n('4511','zd733','571','66','4275','73','77','1','5457.16','-2620.72','306.551','1.83449','4510:0 4494:0 4512:0 '),\n('4512','zd734','571','66','66','73','77','0','5332.55','-2708.7','292.419','3.89224','4511:0 4513:0 4520:0 '),\n('4513','zd735','571','66','66','73','77','0','5189.96','-2843.82','292.419','5.47639','4512:0 4514:0 4517:0 4519:0 4520:0 '),\n('4514','zd736','571','66','66','73','77','0','5035.14','-2975.52','292.29','3.86318','4513:0 4515:0 4519:0 4529:0 '),\n('4515','zd737','571','66','66','73','77','0','4891.99','-3121.16','292.419','3.92601','4514:0 4516:0 4532:0 '),\n('4516','zd738','571','66','66','73','77','0','4770.68','-3237.29','292.419','3.91659','4515:0 4450:0 4533:0 '),\n('4517','zd739','571','66','66','73','77','0','5358.22','-3018.37','292.42','5.50546','4513:0 4518:0 4529:0 '),\n('4518','zd740','571','66','66','73','77','0','5504.36','-3161.64','327.623','5.5251','4517:0 4528:0 4537:0 '),\n('4519','zd741','571','66','4278','73','77','0','4997.42','-2791.64','287.647','5.40334','4514:0 4513:0 4520:0 '),\n('4520','zd742','571','66','4278','73','77','0','5158.28','-2673.27','288.27','0.638333','4519:0 4512:0 4513:0 4521:0 '),\n('4521','zd743','571','66','66','73','77','0','5256.37','-2555.92','288.451','1.56824','4520:0 4522:0 '),\n('4522','zd744','571','66','4275','73','77','0','5338.16','-2432.94','289.035','0.00530624','4521:0 4494:0 4493:0 4495:0 '),\n('4523','zd745','571','66','4280','73','77','0','5779.01','-2690.72','276.583','2.21778','4510:0 4524:0 '),\n('4524','zd746','571','66','4320','73','77','0','5721.5','-2843.26','274.479','3.99436','4523:0 4525:0 4527:0 '),\n('4525','zd747','571','66','4320','73','77','1','5795.09','-3017.85','286.307','5.12926','4524:0 4526:0 '),\n('4526','zd748','571','66','4320','73','77','0','5829.57','-3089.62','343.078','5.24393','4525:0 4542:0 '),\n('4527','zd749','571','66','4280','73','77','0','5611.83','-2947.53','274.379','3.44223','4524:0 4528:0 '),\n('4528','zd750','571','66','4280','73','77','0','5467.65','-3021.98','288.17','4.29281','4527:0 4518:0 '),\n('4529','zd751','571','66','4279','73','77','0','5183.53','-3158.14','271.373','0.983891','4517:0 4514:0 4530:0 '),\n('4530','zd752','571','66','4279','73','77','0','5277.96','-3280.48','281.073','4.24508','4529:0 4531:0 '),\n('4531','zd753','571','66','4279','73','77','0','5170.84','-3397.25','289.096','2.18261','4530:0 4532:0 4534:0 '),\n('4532','zd754','571','66','4279','73','77','0','5037.17','-3252.81','278.555','2.42609','4531:0 4515:0 '),\n('4533','zd755','571','66','4299','73','77','0','4868.35','-3381.36','292.891','5.68473','4516:0 4534:0 '),\n('4534','zd756','571','66','4299','73','77','0','5062.51','-3481.16','289.586','4.38568','4533:0 4531:0 4535:0 '),\n('4535','zd757','571','66','4299','73','77','0','5037.37','-3645.39','298.622','4.61344','4534:0 4536:0 '),\n('4536','zd758','571','66','4299','73','77','0','5087.62','-3673.69','368.159','1.40275','4535:0 '),\n('4537','zd759','571','66','66','73','77','0','5653.1','-3291.77','372.841','5.39966','4518:0 4538:0 4542:0 4573:0 '),\n('4538','zd760','571','66','4323','73','77','0','5760.12','-3480.35','382.038','4.42027','4537:0 4539:0 4542:0 4573:0 '),\n('4539','zd761','571','66','4323','73','77','1','5763.21','-3592.34','386.495','5.18723','4538:0 4540:0 '),\n('4540','zd762','571','66','66','73','77','0','5805.54','-3730.07','371.987','2.07548','4539:0 4541:0 4558:0 4568:0 '),\n('4541','zd763','571','66','66','73','77','0','5926.35','-3596.12','371.987','2.21685','4540:0 4542:0 4559:0 '),\n('4542','zd764','571','66','66','73','77','0','5852.16','-3456.19','373.499','0.462273','4537:0 4541:0 4538:0 4543:0 4526:0 '),\n('4543','zd765','571','66','4327','73','77','0','6015.43','-3354.83','351.334','0.898171','4542:0 4544:0 4546:0 '),\n('4544','zd766','571','66','4327','73','77','0','6064.66','-3220.41','351.084','5.24378','4543:0 4545:0 '),\n('4545','zd767','571','66','4327','73','77','0','6170.15','-3269.78','354.099','4.83851','4544:0 4546:0 4550:0 '),\n('4546','zd768','571','66','4327','73','77','0','6123.58','-3376.38','350.427','3.6502','4545:0 4543:0 4547:0 '),\n('4547','zd769','571','66','4328','73','77','0','6121.57','-3498.34','384.702','6.11321','4546:0 4549:0 4548:0 '),\n('4548','zd770','571','66','4328','73','77','0','6262.56','-3570.42','383.729','4.01857','4547:0 4549:0 4556:0 '),\n('4549','zd771','571','66','4328','73','77','0','6183.8','-3653.66','384.553','1.57362','4547:0 4548:0 4559:0 '),\n('4550','zd772','571','66','4321','73','77','0','6322.87','-3285.06','388.539','6.26715','4545:0 4551:0 4555:0 4556:0 '),\n('4551','zd773','571','66','4321','73','77','0','6411.23','-3132.08','389.357','0.676679','4550:0 4552:0 '),\n('4552','zd774','571','66','4321','73','77','0','6573.73','-3100.58','392.875','3.25828','4551:0 4553:0 '),\n('4553','zd775','571','66','4321','73','77','0','6591.66','-3194.21','412.812','2.18937','4552:0 4554:0 '),\n('4554','zd776','571','66','4321','73','77','0','6440.64','-3192.66','402.475','4.61546','4553:0 4555:0 '),\n('4555','zd777','571','66','4321','73','77','0','6464.24','-3278.19','402.912','0.40965','4554:0 4550:0 '),\n('4556','zd778','571','66','4321','73','77','0','6447.03','-3450.35','388.772','5.0215','4550:0 4557:0 4548:0 '),\n('4557','zd779','571','66','66','73','77','0','6351.61','-3625.18','379.474','1.56496','4556:0 '),\n('4558','zd780','571','66','4326','73','77','0','5890.65','-3784.26','361.962','2.65353','4540:0 4559:0 4560:0 '),\n('4559','zd781','571','66','66','73','77','0','6002.17','-3684.49','371.988','2.91507','4558:0 4541:0 4549:0 4581:0 '),\n('4560','zd782','571','66','66','73','77','0','5871.01','-3998.48','364.264','5.0278','4558:0 4561:0 '),\n('4561','zd783','571','66','4371','73','77','0','5936.71','-4166.52','353.36','6.12894','4560:0 4562:0 4564:0 4565:0 '),\n('4562','zd784','571','66','4371','73','77','0','6121.47','-4241.02','320.493','2.98578','4561:0 4563:0 '),\n('4563','zd785','571','66','4371','73','77','0','6077.47','-4432.62','362.867','1.61132','4562:0 4564:0 '),\n('4564','zd786','571','66','4371','73','77','0','5913.09','-4334','361.983','1.57991','4561:0 4563:0 '),\n('4565','zd787','571','66','4325','73','77','0','5789.33','-4263.74','371.348','4.26205','4561:0 4566:0 '),\n('4566','zd788','571','66','4325','73','77','0','5716.79','-4325.83','373.993','4.5605','4565:0 4567:0 4580:0 '),\n('4567','zd789','571','66','4325','73','77','0','5716.89','-4120.29','353.305','1.62547','4566:0 4568:0 4580:0 '),\n('4568','zd790','571','66','66','73','77','0','5706.28','-3833.4','371.987','0.940598','4567:0 4540:0 4569:0 '),\n('4569','zd791','571','66','66','73','77','0','5537.84','-3840.96','372.119','2.47998','4568:0 4570:0 4571:0 '),\n('4570','zd792','571','66','4322','73','77','0','5351.53','-3648.35','361.961','2.27578','4569:0 4571:0 4572:0 4574:0 '),\n('4571','zd793','571','66','4322','73','77','0','5343.06','-3764.54','373.087','0.190553','4569:0 4570:0 '),\n('4572','zd794','571','66','66','73','77','0','5524.4','-3572.01','365.432','0.730907','4570:0 4573:0 '),\n('4573','zd795','571','66','4324','73','77','0','5626.9','-3422.21','363.833','0.990089','4572:0 4537:0 4538:0 '),\n('4574','zd796','571','66','4322','73','77','0','5153.32','-3723.32','360.396','4.07514','4570:0 4575:0 '),\n('4575','zd797','571','66','4322','73','77','0','5076.21','-3849.59','356.664','4.99406','4574:0 4576:0 '),\n('4576','zd798','571','66','66','73','77','0','5136.04','-4040.57','355.425','5.10401','4575:0 4449:0 4577:0 '),\n('4577','zd799','571','66','66','73','77','0','5278.78','-4177.66','363.104','2.86954','4576:0 4449:0 4578:0 '),\n('4578','zd800','571','66','66','73','77','0','5437.96','-4288.78','363.086','5.803','4577:0 4579:0 4580:0 '),\n('4579','zd801','571','66','66','73','77','0','5440.87','-4452.18','379.545','5.85562','4578:0 '),\n('4580','zd802','571','66','4325','73','77','0','5627.9','-4207.17','364.009','5.93258','4578:0 4567:0 4566:0 '),\n('4581','zd803','571','66','66','73','77','0','6164.11','-3834.22','436.687','5.57209','4559:0 4582:0 '),\n('4582','zd804','571','66','66','73','77','0','6297.28','-3979.47','456.92','5.47784','4581:0 4583:0 '),\n('4583','zd805','571','66','66','73','77','0','6443.44','-4126.1','462.301','5.40087','4582:0 4584:0 4594:0 '),\n('4584','zd806','571','66','4329','73','77','0','6406.23','-4295.64','457.247','4.84558','4583:0 4585:0 4593:0 '),\n('4585','zd807','571','66','66','73','77','0','6273.9','-4442.23','450.834','3.83242','4584:0 4586:0 4589:0 '),\n('4586','zd808','571','66','4329','73','77','0','6178.17','-4399.01','456.879','1.41967','4585:0 4587:0 '),\n('4587','zd809','571','66','4329','73','77','0','6227.62','-4232.4','436.632','4.94847','4586:0 4588:0 '),\n('4588','zd810','571','66','4329','73','77','0','6214.01','-4138.28','447.456','5.0066','4587:0 '),\n('4589','zd811','571','66','4373','73','77','0','6412.14','-4626.89','453.335','2.16502','4585:0 4590:0 '),\n('4590','zd812','571','66','4375','73','77','0','6602.74','-4663.95','450.613','0.474835','4589:0 4591:0 4605:0 '),\n('4591','zd813','571','66','4375','73','77','0','6698.48','-4568.11','450.518','2.11632','4590:0 4592:0 '),\n('4592','zd814','571','66','4375','73','77','0','6638.09','-4503.12','485.547','2.39985','4591:0 4593:0 '),\n('4593','zd815','571','66','4373','73','77','0','6532.06','-4368.66','450.654','5.95377','4592:0 4584:0 4594:0 '),\n('4594','zd816','571','66','66','73','77','0','6586.21','-4259.92','452.582','2.52315','4593:0 4583:0 4595:0 '),\n('4595','zd817','571','66','66','73','77','0','6681.53','-4181.26','455.784','5.78336','4594:0 4596:0 4603:0 '),\n('4596','zd818','571','66','66','73','77','0','6821.02','-4227.92','452.785','0.387671','4595:0 4597:0 4603:0 '),\n('4597','zd819','571','66','4579','73','77','1','6899.77','-4113.21','467.355','4.92777','4596:0 4598:0 '),\n('4598','zd820','571','66','66','73','77','0','7055.14','-4222.88','450.363','3.95496','4597:0 4599:0 '),\n('4599','zd821','571','66','66','73','77','0','7139.88','-4413.45','457.062','4.921','4598:0 4600:0 '),\n('4600','zd822','571','66','4375','73','77','0','7003.8','-4522.32','450.519','3.23161','4599:0 4601:0 '),\n('4601','zd823','571','66','4375','73','77','0','6879.7','-4603.96','452.922','4.36494','4600:0 4602:0 4604:0 '),\n('4602','zd824','571','66','4375','73','77','0','6779.05','-4455.52','441.057','2.48784','4601:0 4603:0 '),\n('4603','zd825','571','66','4375','73','77','0','6738.67','-4314.66','450.026','0.835357','4602:0 4596:0 4595:0 '),\n('4604','zd826','571','66','4375','73','77','0','6817.32','-4743.11','450.661','4.44034','4601:0 4605:0 '),\n('4605','zd827','571','66','66','73','77','0','6680.31','-4847.44','452.584','2.08415','4604:0 4590:0 4606:0 '),\n('4606','zd828','571','66','4375','73','77','0','6841.86','-4987.38','451.036','5.56582','4605:0 '),\n('4607','cs829','571','2817','4557','74','78','0','5438.42','-1075.94','181.63','1.64666','4465:0 4608:0 4611:0 4613:0 '),\n('4608','cs830','571','2817','4554','74','78','0','5414.79','-913.179','165.857','1.65453','4607:0 4609:0 '),\n('4609','cs831','571','2817','4557','74','78','0','5529.65','-840.32','161.565','0.178767','4608:0 4610:0 4612:0 4624:0 '),\n('4610','cs832','571','2817','4557','74','78','0','5646.92','-907.293','186.362','5.31056','4609:0 4611:0 '),\n('4611','cs833','571','2817','4557','74','78','0','5531.5','-987.127','191.383','0.576966','4607:0 4610:0 '),\n('4612','cs834','571','2817','4558','74','78','5','5605.93','-749.995','199.49','1.05213','4609:0 '),\n('4613','cs835','571','2817','4554','74','78','0','5331.06','-914.795','170.103','1.60977','4607:0 4614:0 '),\n('4614','cs836','571','2817','4554','74','78','0','5307.84','-750.937','162.904','2.08886','4613:0 4615:0 '),\n('4615','cs837','571','2817','4557','74','78','0','5179.88','-711.115','164.986','1.15816','4614:0 4616:0 4618:0 '),\n('4616','cs838','571','2817','2817','74','78','2','5082.9','-704.384','186.517','6.16508','4615:0 4617:0 '),\n('4617','cs839','571','2817','4559','74','78','3','5062.59','-611.621','218.683','5.43466','4616:0 '),\n('4618','cs840','571','2817','4557','74','78','0','5185.33','-555.375','158.496','1.08748','4615:0 4619:0 '),\n('4619','cs841','571','2817','4557','74','78','0','5212.12','-335.385','163.451','1.20529','4618:0 4620:0 '),\n('4620','cs842','571','2817','4557','74','78','0','5329.19','-218.838','166.128','0.232181','4619:0 4621:0 4629:0 '),\n('4621','cs843','571','2817','4557','74','78','0','5520.69','-188.647','157.616','0.0751006','4620:0 4622:0 4629:0 '),\n('4622','cs844','571','2817','4557','74','78','0','5672.16','-264.918','167.932','5.74096','4621:0 4623:0 4625:0 4720:0 '),\n('4623','cs845','571','2817','4557','74','78','0','5583.23','-439.368','154.644','4.20158','4622:0 4624:0 '),\n('4624','cs846','571','2817','4554','74','78','0','5498.08','-612.708','152.463','4.75686','4623:0 4609:0 '),\n('4625','cs847','571','2817','4553','74','78','0','5679.51','-108.805','178.045','1.46212','4622:0 4626:0 4855:0 '),\n('4626','cs848','571','2817','4553','74','78','0','5720.75','54.3693','171.054','1.38122','4625:0 4627:0 4628:0 4643:0 '),\n('4627','cs849','571','2817','4553','74','78','0','5765.22','181.998','182.874','0.613098','4626:0 '),\n('4628','cs850','571','2817','4553','74','78','0','5544.73','121.881','150.263','4.18823','4626:0 4629:0 '),\n('4629','cs851','571','2817','4553','74','78','0','5414.2','-47.7746','149.795','3.91334','4628:0 4621:0 4620:0 4630:0 '),\n('4630','cs852','571','2817','2817','74','78','0','5354.31','126.368','161.642','2.27029','4629:0 4631:0 4632:0 '),\n('4631','cs853','571','2817','2817','74','78','0','5257.75','154.168','191.769','2.73995','4630:0 4147:0 '),\n('4632','cs854','571','2817','2817','74','78','0','5423.58','292.611','156.85','1.48646','4630:0 4633:0 '),\n('4633','cs855','571','2817','2817','74','78','0','5436.65','406.464','167.948','1.52965','4632:0 4634:0 4642:0 '),\n('4634','cs856','571','2817','4555','74','78','0','5332.71','578.052','182.7','1.3333','4633:0 4635:0 '),\n('4635','cs857','571','2817','4555','74','78','0','5471.03','710.798','171.741','0.739547','4634:0 4636:0 '),\n('4636','cs858','571','2817','2817','74','78','0','5519.14','908.014','167.988','1.35608','4635:0 4637:0 4638:0 '),\n('4637','cs859','571','2817','4556','74','78','1','5706.15','1006.05','174.48','3.67458','4636:0 '),\n('4638','cs860','571','2817','2817','74','78','0','5682.36','825.06','156.036','5.32233','4636:0 4639:0 '),\n('4639','cs861','571','2817','2817','74','78','0','5849.61','885.831','160.066','0.393957','4638:0 4640:0 '),\n('4640','cs862','571','2817','4553','74','78','0','5854.17','706.025','164.715','4.73956','4639:0 4641:0 '),\n('4641','cs863','571','2817','4553','74','78','0','5740.73','555.099','158.091','4.03271','4640:0 4642:0 '),\n('4642','cs864','571','2817','4553','74','78','0','5615.21','410.65','156.222','3.51042','4641:0 4633:0 4643:0 '),\n('4643','cs865','571','2817','4553','74','78','0','5676.64','245.015','166.802','4.93592','4642:0 4626:0 '),\n('4644','sb866','571','3711','4483','74','78','0','4671.5','5526.35','34.4275','0.54946','3903:0 4645:0 '),\n('4645','sb867','571','3711','3711','74','78','0','4892.01','5531.93','-71.5606','0.0389507','4644:0 4646:0 4674:0 '),\n('4646','sb868','571','3711','4289','74','78','0','4952.39','5739.79','-75.5644','1.2249','4645:0 4647:0 '),\n('4647','sb869','571','3711','4289','74','78','0','5130.17','5883.3','-75.7286','0.492126','4646:0 4648:0 '),\n('4648','sb870','571','3711','4289','74','78','0','5325.13','5886.98','-68.7967','0.00281286','4647:0 4649:0 4675:0 '),\n('4649','sb871','571','3711','4285','74','78','0','5507.19','5934.35','-51.6289','6.11243','4648:0 4650:0 '),\n('4650','sb872','571','3711','3711','74','78','0','5713','5871.42','-60.4173','5.97499','4649:0 4651:0 4714:0 '),\n('4651','sb873','571','3711','4289','74','78','0','5882.95','5730.44','-63.8448','5.56737','4650:0 4652:0 '),\n('4652','sb874','571','3711','4289','74','78','0','6018.42','5571.93','-74.0181','5.18095','4651:0 4653:0 4703:0 '),\n('4653','sb875','571','3711','4385','74','78','0','6082.5','5353.27','-92.7974','4.70422','4652:0 4654:0 4702:0 '),\n('4654','sb876','571','3711','3711','74','78','0','6268.69','5300.48','-100.197','0.380579','4653:0 4655:0 '),\n('4655','sb877','571','3711','3711','74','78','0','6450.25','5197.28','-64.1861','5.49824','4654:0 4656:0 '),\n('4656','sb878','571','3711','4376','74','78','0','6507.21','4992.87','-60.1724','4.97202','4655:0 4657:0 4696:0 '),\n('4657','sb879','571','3711','3711','74','78','0','6524.26','4794.34','-58.974','4.36726','4656:0 4658:0 '),\n('4658','sb880','571','3711','4368','74','78','0','6443.53','4602.81','-66.2857','4.55104','4657:0 4659:0 4695:0 4697:0 '),\n('4659','sb881','571','3711','4368','74','78','0','6405.01','4366.1','-47.8041','3.90309','4658:0 4660:0 4694:0 4695:0 '),\n('4660','sb882','571','3711','3711','74','78','0','6226.59','4265.96','-45.1729','3.55594','4659:0 4661:0 4694:0 '),\n('4661','sb883','571','3711','4283','74','78','0','6111.71','4134.4','-48.7024','4.20861','4660:0 4662:0 '),\n('4662','sb884','571','3711','4283','74','78','0','6038.48','4009.63','-42.6825','4.13556','4661:0 4663:0 '),\n('4663','sb885','571','3711','4283','74','78','0','5938.28','3889.47','-35.5353','3.47426','4662:0 4664:0 4692:0 '),\n('4664','sb886','571','3711','4283','74','78','0','5785.88','3776.91','-41.0442','3.94','4663:0 4665:0 4692:0 4693:0 '),\n('4665','sb887','571','3711','3711','74','78','0','5624.29','3606.52','-21.7442','3.13811','4664:0 4666:0 4693:0 '),\n('4666','sb888','571','3711','4283','74','78','0','5488.8','3794.13','-58.7714','2.25061','4665:0 4667:0 '),\n('4667','sb889','571','3711','4387','74','78','0','5337.73','3917.13','-70.8363','2.57655','4666:0 4668:0 4688:0 4689:0 '),\n('4668','sb890','571','3711','3711','74','78','0','5220.59','4104.15','-78.9241','2.09588','4667:0 4669:0 4687:0 '),\n('4669','sb891','571','3711','3711','74','78','0','5146.69','4294.33','-99.9765','1.80057','4668:0 4670:0 4686:0 '),\n('4670','sb892','571','3711','3711','74','78','1','5110.31','4494.04','-98.6996','1.66941','4669:0 4671:0 '),\n('4671','sb893','571','3711','3711','74','78','0','5098.19','4704.21','-133.607','2.04248','4670:0 4672:0 4681:0 '),\n('4672','sb894','571','3711','3711','74','78','0','4975.85','4879.83','-101.866','1.73853','4671:0 4673:0 4682:0 '),\n('4673','sb895','571','3711','3711','74','78','0','4881.56','5059.86','-91.1009','1.00104','4672:0 4674:0 '),\n('4674','sb896','571','3711','3711','74','78','0','4917.13','5259.43','-92.7846','1.6058','4673:0 4645:0 4718:0 '),\n('4675','sb897','571','3711','3711','74','78','0','5325.03','5694.77','-87.1296','4.35079','4648:0 4676:0 '),\n('4676','sb898','571','3711','4288','74','78','0','5283.58','5529.21','-98.5324','4.62568','4675:0 4677:0 '),\n('4677','sb899','571','3711','3711','74','78','0','5296.26','5368.21','-119.485','5.45035','4676:0 4678:0 4715:0 '),\n('4678','sb900','571','3711','4293','74','78','0','5334.1','5156.57','-135.744','4.8503','4677:0 4679:0 '),\n('4679','sb901','571','3711','4293','74','78','0','5316.24','4983.73','-135.985','4.21805','4678:0 4680:0 4719:0 '),\n('4680','sb902','571','3711','4293','74','78','0','5263.3','4836.68','-132.956','4.22984','4679:0 4681:0 '),\n('4681','sb903','571','3711','4293','74','78','0','5171.92','4761.28','-134.094','3.64315','4680:0 4671:0 '),\n('4682','sb904','571','3711','3711','74','78','0','4906.61','4752.07','-80.9517','3.99658','4672:0 4683:0 '),\n('4683','sb905','571','3711','4388','74','78','0','4784.59','4651.45','-67.3646','4.27774','4682:0 4684:0 '),\n('4684','sb906','571','3711','4388','74','78','0','4776.89','4461.82','-65.79','0.115909','4683:0 4685:0 '),\n('4685','sb907','571','3711','3711','74','78','0','4858.79','4312.13','-51.668','4.56127','4684:0 4686:0 '),\n('4686','sb908','571','3711','4304','74','78','0','5008.15','4265.85','-85.0377','2.88757','4685:0 4669:0 '),\n('4687','sb909','571','3711','4303','74','78','0','5141.4','4002.05','-61.6423','4.65002','4668:0 4688:0 '),\n('4688','sb910','571','3711','3711','74','78','0','5236.32','3820.55','-29.2583','0.629582','4687:0 4667:0 '),\n('4689','sb911','571','3711','4283','74','78','0','5426.13','4100.88','-86.7674','1.1935','4667:0 4690:0 '),\n('4690','sb912','571','3711','4283','74','78','0','5555.95','4256','-102.563','0.234915','4689:0 4691:0 4710:0 '),\n('4691','sb913','571','3711','4283','74','78','0','5713.23','4134.64','-89.7735','5.05333','4690:0 4692:0 '),\n('4692','sb914','571','3711','4283','74','78','0','5757.78','3962.65','-74.4666','5.33842','4691:0 4663:0 4664:0 '),\n('4693','sb915','571','3711','4297','74','78','0','5782.35','3632.67','-13.2643','3.22964','4664:0 4665:0 '),\n('4694','sb916','571','3711','3711','74','78','0','6360.37','4223.67','-44.0521','1.79237','4659:0 4660:0 '),\n('4695','sb917','571','3711','4368','74','78','0','6543.56','4456.6','-47.1567','2.3712','4659:0 4658:0 '),\n('4696','sb918','571','3711','4376','74','78','0','6354.19','4873.76','-84.2341','5.19234','4656:0 4697:0 '),\n('4697','sb919','571','3711','3711','74','78','0','6357.09','4685.34','-78.5111','5.19313','4696:0 4658:0 4698:0 '),\n('4698','sb920','571','3711','3711','74','78','0','6208.52','4590.1','-92.1573','3.70988','4697:0 4699:0 '),\n('4699','sb921','571','3711','3711','74','78','0','6025.9','4686.81','-95.5438','1.9176','4698:0 4700:0 '),\n('4700','sb922','571','3711','3711','74','78','0','5994.9','4894.76','-99.8287','1.31128','4699:0 4701:0 '),\n('4701','sb923','571','3711','4385','74','78','0','5981.34','5089.26','-100.986','1.44401','4700:0 4702:0 '),\n('4702','sb924','571','3711','4391','74','78','0','5939.08','5277.6','-99.1834','0.521168','4701:0 4653:0 4703:0 4704:0 '),\n('4703','sb925','571','3711','4391','74','78','0','5903.46','5420.52','-94.3184','1.13064','4702:0 4652:0 '),\n('4704','sb926','571','3711','4293','74','78','0','5830.14','5100.16','-132.628','3.78921','4702:0 4705:0 '),\n('4705','sb927','571','3711','4293','74','78','0','5680.53','5002.31','-134.988','3.89916','4704:0 4706:0 '),\n('4706','sb928','571','3711','4293','74','78','0','5699.45','4825.48','-137.014','5.40319','4705:0 4707:0 '),\n('4707','sb929','571','3711','4293','74','78','0','5769.89','4694.83','-130.521','4.6445','4706:0 4708:0 '),\n('4708','sb930','571','3711','4293','74','78','0','5768.78','4519.94','-133.978','4.9029','4707:0 4709:0 '),\n('4709','sb931','571','3711','4293','74','78','0','5638.21','4442.49','-138.205','3.53632','4708:0 4710:0 4711:0 '),\n('4710','sb932','571','3711','4293','74','78','0','5520.96','4384.34','-134.132','5.02072','4709:0 4690:0 '),\n('4711','sb933','571','3711','4293','74','78','1','5647.9','4579.12','-137.584','3.59247','4709:0 4712:0 '),\n('4712','sb934','571','3711','4293','74','78','0','5559.82','4670.56','-135.523','1.45736','4711:0 4713:0 '),\n('4713','sb935','571','3711','4383','74','78','5','5497.21','4748.71','-193.716','5.27047','4712:0 '),\n('4714','sb936','571','3711','4284','74','78','1','5575.69','5751.97','-74.7038','0.766207','4650:0 4717:0 '),\n('4715','sb937','571','3711','4285','74','78','0','5456.52','5353.98','-134.279','6.15248','4677:0 4716:0 '),\n('4716','sb938','571','3711','3711','74','78','0','5648.23','5302.27','-121.201','1.53199','4715:0 4717:0 '),\n('4717','sb939','571','3711','3711','74','78','0','5580.86','5590.13','-92.6294','1.61445','4716:0 4714:0 '),\n('4718','sb940','571','3711','3711','74','78','0','5041.36','5069.92','-110.999','5.98282','4674:0 4719:0 '),\n('4719','sb941','571','3711','4293','74','78','0','5202.57','5018.06','-134.206','5.92392','4718:0 4679:0 '),\n('4720','sp942','571','67','67','76','80','0','5752.46','-354.53','205.676','5.2249','4622:0 4721:0 '),\n('4721','sp943','571','67','4419','76','80','0','5903.83','-485.757','296.6','6.0849','4720:0 4722:0 '),\n('4722','sp944','571','67','4419','76','80','0','6079.55','-564.659','370.689','5.9286','4721:0 4723:0 4735:0 4736:0 '),\n('4723','sp945','571','67','4419','76','80','0','6182.6','-758.333','400.203','4.95','4722:0 4724:0 4734:0 '),\n('4724','sp946','571','67','4419','76','80','0','6143.85','-967.832','398.945','4.41828','4723:0 4725:0 4726:0 '),\n('4725','sp947','571','67','4418','76','80','1','6122.51','-1083.62','402.604','1.60263','4724:0 '),\n('4726','sp948','571','67','4419','76','80','0','6273.81','-1034.37','412.299','5.98122','4724:0 4727:0 4737:0 '),\n('4727','sp949','571','67','4462','76','80','0','6444.88','-1034.29','429.644','6.27654','4726:0 4728:0 '),\n('4728','sp950','571','67','4462','76','80','0','6611.36','-1016.67','427.636','0.199126','4727:0 4729:0 4730:0 '),\n('4729','sp951','571','67','4462','76','80','0','6639.97','-1111.4','427.1','3.18364','4728:0 '),\n('4730','sp952','571','67','4462','76','80','0','6673.93','-1219.13','398.841','5.0403','4728:0 4731:0 4732:0 '),\n('4731','sp953','571','67','4462','76','80','0','6592.21','-1275.82','392.991','5.05994','4730:0 '),\n('4732','sp954','571','67','4462','76','80','0','6697.35','-1426.2','388.747','4.94449','4730:0 4733:0 '),\n('4733','sp955','571','67','4462','76','80','0','6795.01','-1512.06','359.911','5.79979','4732:0 '),\n('4734','sp956','571','67','4419','76','80','0','6324.13','-838.805','407.569','0.335772','4723:0 '),\n('4735','sp957','571','67','4419','76','80','0','6232.08','-626.646','414.707','2.81842','4722:0 '),\n('4736','sp958','571','67','4419','76','80','0','6146.68','-346.08','436.33','4.09626','4722:0 '),\n('4737','sp959','571','67','4419','76','80','0','6257','-1198.57','428.281','5.0293','4726:0 4738:0 4739:0 '),\n('4738','sp960','571','67','4460','76','80','0','6297.61','-1350.75','426.332','4.79525','4737:0 4745:0 '),\n('4739','sp961','571','67','4460','76','80','0','6393.21','-1222.32','429.226','4.92092','4737:0 4740:0 '),\n('4740','sp962','571','67','4419','76','80','0','6471.87','-1383.27','479.473','4.04521','4739:0 4741:0 '),\n('4741','sp963','571','67','4421','76','80','0','6345.12','-1517.97','434.126','3.78838','4740:0 4742:0 '),\n('4742','sp964','571','67','4421','76','80','0','6349.58','-1586.52','428.04','5.62228','4741:0 4743:0 4745:0 '),\n('4743','sp965','571','67','4421','76','80','0','6455.08','-1685.64','435.366','5.95606','4742:0 4744:0 '),\n('4744','sp966','571','67','4421','76','80','0','6462.41','-1739.78','484.912','2.47281','4743:0 '),\n('4745','sp967','571','67','4421','76','80','0','6232.83','-1499.78','419.118','0.960144','4742:0 4738:0 '),\n('4746','sp968','571','67','4484','76','80','1','8455.31','-325.265','906.979','2.46809','4747:0 '),\n('4747','sp969','571','67','4484','76','80','0','8485.73','-279.992','850.711','1.97722','4746:0 4748:0 '),\n('4748','sp970','571','67','4436','76','80','0','8483.73','-136.842','797.392','1.57038','4747:0 4749:0 4752:0 '),\n('4749','sp971','571','67','4436','76','80','0','8481.05','57.8398','786.425','1.56174','4748:0 4750:0 '),\n('4750','sp972','571','67','4436','76','80','0','8468.58','226.668','788.805','1.98979','4749:0 4751:0 '),\n('4751','sp973','571','67','4436','76','80','0','8317.77','105.355','824.229','4.03339','4750:0 4752:0 '),\n('4752','sp974','571','67','4436','76','80','0','8313.08','-91.3043','827.379','4.66407','4751:0 4748:0 4753:0 4765:0 '),\n('4753','sp975','571','67','4435','76','80','0','8202.06','-202.29','871.634','4.01769','4752:0 4754:0 4756:0 '),\n('4754','sp976','571','67','4435','76','80','0','8237.33','-247.278','952.88','3.24408','4753:0 4755:0 '),\n('4755','sp977','571','67','4435','76','80','0','8092.31','-403.116','964.773','0.843118','4754:0 '),\n('4756','sp978','571','67','4435','76','80','0','8040.6','-222.79','846.911','3.84806','4753:0 4757:0 '),\n('4757','sp979','571','67','4435','76','80','0','7945.56','-368.7','884.037','5.26884','4756:0 4758:0 4759:0 4761:0 '),\n('4758','sp980','571','67','4435','76','80','0','7953.58','-524.527','913.45','5.63719','4757:0 4783:0 '),\n('4759','sp981','571','67','4435','76','80','0','8056.94','-415.927','981.568','4.73712','4757:0 4760:0 '),\n('4760','sp982','571','67','4435','76','80','0','8116.43','-385.365','981.611','0.510895','4759:0 '),\n('4761','sp983','571','67','4436','76','80','0','7847.85','-252.132','885.258','1.43374','4757:0 4762:0 4770:0 '),\n('4762','sp984','571','67','4436','76','80','0','7851.3','-120.4','880.754','2.3126','4761:0 4763:0 '),\n('4763','sp985','571','67','4486','76','80','0','7796.32','-44.5017','882.083','4.37664','4762:0 4764:0 '),\n('4764','sp986','571','67','4486','76','80','0','7737.47','-4.97132','866.565','4.27297','4763:0 '),\n('4765','sp987','571','67','4434','76','80','0','8078.57','-32.5271','869.499','2.49247','4752:0 4766:0 '),\n('4766','sp988','571','67','4434','76','80','0','8168.23','99.4058','898.859','1.3183','4765:0 4767:0 '),\n('4767','sp989','571','67','4434','76','80','0','7974.07','-6.90656','961.657','1.27039','4766:0 4768:0 '),\n('4768','sp990','571','67','4434','76','80','0','7950.02','93.3063','1028.03','0.358544','4767:0 4769:0 '),\n('4769','sp991','571','67','4434','76','80','0','7756.08','70.5513','1009.34','2.07228','4768:0 '),\n('4770','sp992','571','67','4436','76','80','0','7731.17','-155.37','873.081','2.5828','4761:0 4771:0 '),\n('4771','sp993','571','67','67','76','80','0','7531.71','-82.1077','837.076','3.3682','4770:0 4772:0 '),\n('4772','sp994','571','67','4424','76','80','0','7365.61','-62.5754','778.928','3.05011','4771:0 4773:0 4777:0 '),\n('4773','sp995','571','67','4424','76','80','0','7426.39','97.7694','770.976','6.19485','4772:0 4774:0 '),\n('4774','sp996','571','67','4499','76','80','0','7491.52','288.222','774.525','2.91503','4773:0 4775:0 '),\n('4775','sp997','571','67','4424','76','80','0','7352.12','248.002','774.191','5.46442','4774:0 4776:0 '),\n('4776','sp998','571','67','4424','76','80','0','7358.47','144.777','783.476','4.25726','4775:0 4777:0 '),\n('4777','sp999','571','67','4424','76','80','0','7260.89','6.23937','773.777','4.18657','4776:0 4772:0 4778:0 '),\n('4778','sp1000','571','67','4424','76','80','0','7178.24','-109.916','772.616','4.20384','4777:0 4779:0 4782:0 '),\n('4779','sp1001','571','67','4452','76','80','0','7066.53','-147.905','785.381','3.57396','4778:0 4780:0 '),\n('4780','sp1002','571','67','4453','76','80','0','6959.39','-173.873','763.88','2.97313','4779:0 4781:0 '),\n('4781','sp1003','571','67','4453','76','80','0','6782.97','-67.7557','738.941','2.11233','4780:0 '),\n('4782','sp1004','571','67','4452','76','80','0','7090.4','-308.701','774.099','4.51251','4778:0 '),\n('4783','sp1005','571','67','67','76','80','0','8123.18','-622.333','945.418','5.51782','4758:0 4784:0 '),\n('4784','sp1006','571','67','4446','76','80','0','8249.28','-737.261','923.975','5.57986','4783:0 4785:0 '),\n('4785','sp1007','571','67','4446','76','80','0','8264.89','-900.437','923.875','2.77599','4784:0 4786:0 4788:0 '),\n('4786','sp1008','571','67','4485','76','80','0','8140.52','-817.38','956.118','4.95861','4785:0 4787:0 '),\n('4787','sp1009','571','67','4485','76','80','0','8148.76','-940.656','956.955','0.816413','4786:0 '),\n('4788','sp1010','571','67','4446','76','80','0','8178.94','-1015.84','926.187','5.46676','4785:0 4789:0 '),\n('4789','sp1011','571','67','4446','76','80','0','8330.55','-1186.57','924.477','5.49032','4788:0 '),\n('4790','sp1012','571','67','4441','76','80','4','7798.27','-2842.24','1219.51','2.4704','4791:0 4792:0 '),\n('4791','sp1013','571','67','4441','76','80','5','7804.98','-2945.31','1256.79','1.43524','4790:0 '),\n('4792','sp1014','571','67','4441','76','80','0','7866.14','-2800.43','1136.14','2.6746','4790:0 4793:0 4808:0 '),\n('4793','sp1015','571','67','4444','76','80','0','7974.26','-2941.67','1137.82','0.286989','4792:0 4794:0 '),\n('4794','sp1016','571','67','4444','76','80','0','8053.32','-2899.02','1136.35','5.48632','4793:0 4795:0 4799:0 '),\n('4795','sp1017','571','67','67','76','80','0','8303.1','-2938.59','1067.71','2.65574','4794:0 4796:0 '),\n('4796','sp1018','571','67','4488','76','80','0','8126.19','-2813.7','1044.76','1.21375','4795:0 4797:0 4798:0 '),\n('4797','sp1019','571','67','4488','76','80','0','8235.54','-2730.69','1035.47','6.08244','4796:0 4798:0 '),\n('4798','sp1020','571','67','4488','76','80','0','8268.8','-2840.55','1051.57','2.98168','4797:0 4796:0 '),\n('4799','sp1021','571','67','4444','76','80','0','8178.4','-2765.96','1137.8','1.58369','4794:0 4800:0 '),\n('4800','sp1022','571','67','4444','76','80','0','8192.81','-2569.46','1145.92','1.28524','4799:0 4801:0 4807:0 '),\n('4801','sp1023','571','67','4446','76','80','0','8213.34','-2399.15','1136.06','1.39441','4800:0 4802:0 '),\n('4802','sp1024','571','67','4446','76','80','0','8146.87','-2304.3','1157.9','3.14664','4801:0 4803:0 4804:0 '),\n('4803','sp1025','571','67','4446','76','80','0','8041.79','-2401.8','1157.91','1.83659','4802:0 4804:0 4805:0 '),\n('4804','sp1026','571','67','4446','76','80','0','7981.22','-2241.64','1157.87','2.17589','4803:0 4802:0 '),\n('4805','sp1027','571','67','4446','76','80','0','7920.25','-2449.09','1137.97','1.81145','4803:0 4806:0 4809:0 '),\n('4806','sp1028','571','67','4444','76','80','0','7924.11','-2571.76','1159.29','2.58976','4805:0 4807:0 '),\n('4807','sp1029','571','67','4444','76','80','0','8046.59','-2635.79','1135.01','6.18452','4806:0 4800:0 4808:0 '),\n('4808','sp1030','571','67','4463','76','80','0','7915.54','-2719.76','1135.12','3.80869','4807:0 4792:0 '),\n('4809','sp1031','571','67','4446','76','80','0','7902.91','-2332.91','1153.05','3.63118','4805:0 4810:0 '),\n('4810','sp1032','571','67','4442','76','80','0','7759.44','-2386.38','1077.61','2.84264','4809:0 4811:0 '),\n('4811','sp1033','571','67','4442','76','80','0','7670.97','-2282.57','1010.94','2.45387','4810:0 4812:0 '),\n('4812','sp1034','571','67','4442','76','80','0','7541.71','-2363.06','867.728','2.12164','4811:0 4813:0 '),\n('4813','sp1035','571','67','4442','76','80','0','7465.67','-2485.65','760.441','0.00970542','4812:0 4814:0 4827:0 '),\n('4814','sp1036','571','67','4438','76','80','0','7327.84','-2537.89','748.903','4.00974','4813:0 4815:0 4827:0 '),\n('4815','sp1037','571','67','4438','76','80','0','7348.8','-2768.24','766.138','4.91922','4814:0 4816:0 '),\n('4816','sp1038','571','67','4438','76','80','0','7348.82','-2958.97','838.738','4.70872','4815:0 4817:0 4826:0 '),\n('4817','sp1039','571','67','4439','76','80','0','7229.61','-3136.68','837.486','4.08826','4816:0 4818:0 4826:0 '),\n('4818','sp1040','571','67','4495','76','80','0','7202.51','-3334.74','843.826','4.6883','4817:0 4819:0 '),\n('4819','sp1041','571','67','4439','76','80','0','7368.35','-3244.03','851.789','5.98892','4818:0 4820:0 '),\n('4820','sp1042','571','67','4439','76','80','0','7555.15','-3237.78','842.017','0.160478','4819:0 4821:0 '),\n('4821','sp1043','571','67','4440','76','80','0','7723.64','-3278.88','863.372','5.73209','4820:0 4822:0 '),\n('4822','sp1044','571','67','4440','76','80','0','7843.39','-3412.02','865.974','6.25831','4821:0 4823:0 '),\n('4823','sp1045','571','67','4440','76','80','0','8007.01','-3282.63','865.574','2.51589','4822:0 4824:0 '),\n('4824','sp1046','571','67','4440','76','80','0','7854.16','-3160.4','864.749','3.02718','4823:0 4825:0 '),\n('4825','sp1047','571','67','4440','76','80','0','7635.61','-3117.6','867.091','3.3971','4824:0 4826:0 '),\n('4826','sp1048','571','67','4439','76','80','0','7437.01','-3083.87','837.452','2.68239','4825:0 4816:0 4817:0 '),\n('4827','sp1049','571','67','4437','76','80','0','7293.97','-2399.5','753.5','6.25517','4814:0 4813:0 4828:0 '),\n('4828','sp1050','571','67','4437','76','80','0','7210.78','-2258.23','756.519','2.1766','4827:0 4829:0 '),\n('4829','sp1051','571','67','4437','76','80','0','7094.38','-2114.84','759.283','2.32896','4828:0 4830:0 '),\n('4830','sp1052','571','67','4437','76','80','0','7071.57','-1957.32','769.29','1.71086','4829:0 4831:0 '),\n('4831','sp1053','571','67','4422','76','80','0','7047.94','-1819.05','822.822','1.51843','4830:0 4832:0 '),\n('4832','sp1054','571','67','4422','76','80','0','7016.16','-1682.12','819.647','1.56948','4831:0 4833:0 4834:0 4841:0 '),\n('4833','sp1055','571','67','4422','76','80','0','6952.92','-1523.53','837.796','1.58755','4832:0 4834:0 4835:0 '),\n('4834','sp1056','571','67','4422','76','80','0','6876.88','-1688.13','820.475','5.87424','4833:0 4832:0 '),\n('4835','sp1057','571','67','4425','76','80','0','6933.96','-1355.59','831.143','1.62444','4833:0 4836:0 '),\n('4836','sp1058','571','67','4425','76','80','0','6927.88','-1275.08','819.873','1.80979','4835:0 4837:0 '),\n('4837','sp1059','571','67','4423','76','80','0','6891.54','-1120.83','801.801','2.04934','4836:0 4838:0 4840:0 '),\n('4838','sp1060','571','67','4423','76','80','0','6874.8','-994.702','800.05','1.94645','4837:0 4839:0 '),\n('4839','sp1061','571','67','4423','76','80','0','6713.98','-1032.73','766.307','5.25848','4838:0 4840:0 '),\n('4840','sp1062','571','67','4423','76','80','0','6823.44','-1136.74','794.362','1.42024','4839:0 4837:0 '),\n('4841','sp1063','571','67','4422','76','80','0','7059.17','-1565.01','830.127','1.02674','4832:0 4842:0 '),\n('4842','sp1064','571','67','4432','76','80','1','7107.06','-1444.92','924.841','0.0175042','4841:0 4843:0 4854:0 '),\n('4843','sp1065','571','67','4432','76','80','0','7224.43','-1369.92','917.332','1.04952','4842:0 4844:0 '),\n('4844','sp1066','571','67','4432','76','80','0','7304.81','-1229.95','912.257','1.04952','4843:0 4845:0 '),\n('4845','sp1067','571','67','4473','76','80','0','7277.74','-1094.09','938.898','4.08901','4844:0 4846:0 4847:0 '),\n('4846','sp1068','571','67','4473','76','80','0','7159.16','-1203.13','929.255','3.39314','4845:0 '),\n('4847','sp1069','571','67','4432','76','80','0','7276.68','-952.788','919.235','1.31654','4845:0 4848:0 '),\n('4848','sp1070','571','67','4432','76','80','0','7442.11','-871.692','910.159','0.46203','4847:0 4849:0 '),\n('4849','sp1071','571','67','4432','76','80','0','7617.15','-899.183','911.902','5.67158','4848:0 4850:0 '),\n('4850','sp1072','571','67','4432','76','80','0','7731.32','-1040.44','920.428','5.0087','4849:0 4851:0 '),\n('4851','sp1073','571','67','4432','76','80','0','7620.47','-1211.71','928.587','4.24765','4850:0 4852:0 '),\n('4852','sp1074','571','67','4432','76','80','0','7523.4','-1365.25','935.317','3.55807','4851:0 4853:0 '),\n('4853','sp1075','571','67','4432','76','80','0','7392.6','-1463.43','928.011','4.00967','4852:0 4854:0 '),\n('4854','sp1076','571','67','4536','76','80','0','7307.54','-1573.81','942.399','2.34934','4853:0 4842:0 '),\n('4855','cs1077','571','2817','2817','76','80','0','5850.58','-134.972','227.342','6.13811','4625:0 4856:0 '),\n('4856','ic1078','571','210','4501','77','80','0','5971.83','-162.754','303.817','0.106256','4855:0 4857:0 '),\n('4857','ic1079','571','210','4501','77','80','1','6141.12','-52.066','381.591','0.738502','4856:0 4858:0 '),\n('4858','ic1080','571','210','4501','77','80','0','6194.51','34.1853','380.232','0.656035','4857:0 4859:0 4861:0 '),\n('4859','ic1081','571','210','4504','77','80','0','6172.36','156.629','374.276','0.907363','4858:0 4860:0 '),\n('4860','ic1082','571','210','4504','77','80','0','6379.33','179.484','392.956','0.48639','4859:0 4861:0 4862:0 '),\n('4861','ic1083','571','210','4501','77','80','0','6302.14','95.8391','390.823','3.94214','4860:0 4858:0 '),\n('4862','ic1084','571','210','4505','77','80','0','6510.94','285.541','400.181','0.224064','4860:0 4863:0 '),\n('4863','ic1085','571','210','4505','77','80','0','6561.12','378.976','420.028','1.01575','4862:0 4864:0 4865:0 '),\n('4864','ic1086','571','210','4506','77','80','0','6586.56','556.561','402.946','1.2011','4863:0 4865:0 4866:0 '),\n('4865','ic1087','571','210','4506','77','80','0','6708.22','403.424','412.114','3.63504','4864:0 4863:0 4870:0 '),\n('4866','ic1088','571','210','4506','77','80','0','6723.06','690.867','407.835','0.367783','4864:0 4867:0 4897:0 '),\n('4867','ic1089','571','210','4506','77','80','0','6907.33','730.085','420.328','0.313591','4866:0 4868:0 4892:0 '),\n('4868','ic1090','571','210','4506','77','80','0','6968.03','622.605','462.269','4.11884','4867:0 4869:0 4871:0 '),\n('4869','ic1091','571','210','4506','77','80','0','6892.8','465.906','471.697','4.29869','4868:0 '),\n('4870','ic1092','571','210','4506','77','80','0','6802.58','551.703','425.103','0.960751','4865:0 '),\n('4871','ic1093','571','210','4506','77','80','0','7175.08','588.447','498.301','5.6747','4868:0 4872:0 4873:0 '),\n('4872','ic1094','571','210','4506','77','80','0','7078.72','503.754','527.049','0.380329','4871:0 '),\n('4873','ic1095','571','210','4593','77','80','0','7262.77','707.458','487.068','0.969396','4871:0 4874:0 '),\n('4874','ic1096','571','210','210','77','80','0','7380.79','847.639','456.611','1.04794','4873:0 4875:0 '),\n('4875','ic1097','571','210','4533','77','80','0','7556.82','768.81','478.284','6.18915','4874:0 4876:0 4877:0 '),\n('4876','ic1098','571','210','4533','77','80','0','7584.83','947.602','480.255','1.08485','4875:0 4877:0 '),\n('4877','ic1099','571','210','4533','77','80','0','7712.14','808.936','478.443','2.68156','4876:0 4875:0 4878:0 '),\n('4878','ic1100','571','210','4533','77','80','0','7860.07','894.491','452.788','0.0928901','4877:0 4879:0 4888:0 4891:0 '),\n('4879','ic1101','571','210','4533','77','80','0','8034.56','793.581','473.244','0.0151296','4878:0 4880:0 '),\n('4880','ic1102','571','210','4658','77','80','0','8220.62','796.211','504.283','0.00650024','4879:0 4881:0 '),\n('4881','ic1103','571','210','4658','77','80','0','8374.24','796.938','547.919','6.10983','4880:0 4882:0 4887:0 '),\n('4882','ic1104','571','210','4669','77','80','0','8423.03','930.654','544.674','1.16574','4881:0 4883:0 '),\n('4883','ic1105','571','210','4658','77','80','1','8522.2','1039.69','548.104','0.757338','4882:0 4884:0 '),\n('4884','ic1106','571','210','4658','77','80','0','8609.95','905.31','545.094','5.03776','4883:0 4885:0 '),\n('4885','ic1107','571','210','4658','77','80','3','8585.78','716.794','547.469','4.14555','4884:0 4886:0 '),\n('4886','ic1108','571','210','4658','77','80','0','8489.61','581.224','559.708','4.17226','4885:0 4887:0 '),\n('4887','ic1109','571','210','4658','77','80','5','8440.59','706.692','547.293','2.35563','4886:0 4881:0 '),\n('4888','ic1110','571','210','4533','77','80','0','7765.83','995.585','447.266','2.83001','4878:0 4889:0 '),\n('4889','ic1111','571','210','4533','77','80','0','7711.5','1167.13','440.596','0.808391','4888:0 4890:0 '),\n('4890','ic1112','571','210','4533','77','80','0','7859.21','1231.56','441.972','0.590053','4889:0 4891:0 4921:0 '),\n('4891','ic1113','571','210','4533','77','80','0','7895.54','1042.03','450.717','4.64349','4890:0 4878:0 '),\n('4892','ic1114','571','210','4508','77','80','0','6955.49','874.331','402.675','1.29769','4867:0 4893:0 '),\n('4893','ic1115','571','210','4508','77','80','0','7020.59','1065.06','402.857','1.32832','4892:0 4894:0 '),\n('4894','ic1116','571','210','4508','77','80','0','6957.22','1339.68','398.602','1.97863','4893:0 4895:0 '),\n('4895','ic1117','571','210','4508','77','80','0','6833.49','1460.28','390.712','1.81761','4894:0 4896:0 '),\n('4896','ic1118','571','210','210','77','80','0','6826.51','1619.37','389.033','4.69297','4895:0 '),\n('4897','ic1119','571','210','4507','77','80','0','6666.86','830.852','365.983','2.48285','4866:0 4898:0 '),\n('4898','ic1120','571','210','4507','77','80','0','6599.05','917.605','308.63','2.05873','4897:0 4899:0 '),\n('4899','ic1121','571','210','4507','77','80','0','6597.42','1025.81','280.105','1.11625','4898:0 4900:0 4904:0 '),\n('4900','ic1122','571','210','4507','77','80','0','6559.27','1194.84','276.689','2.19853','4899:0 4901:0 '),\n('4901','ic1123','571','210','4507','77','80','0','6688.4','1234.6','276.432','6.14281','4900:0 4902:0 '),\n('4902','ic1124','571','210','4507','77','80','0','6863.13','1227.79','282.996','5.66451','4901:0 4903:0 4905:0 '),\n('4903','ic1125','571','210','4507','77','80','0','6896.72','1042.62','305.673','4.53274','4902:0 4904:0 4905:0 '),\n('4904','ic1126','571','210','4507','77','80','0','6726.14','1037','288.797','3.31459','4903:0 4899:0 '),\n('4905','ic1127','571','210','4508','77','80','0','7001.55','1212.52','307.249','0.331647','4903:0 4902:0 4906:0 4907:0 '),\n('4906','ic1128','571','210','4537','77','80','0','7135.37','1189.66','298.703','5.1862','4905:0 4915:0 '),\n('4907','ic1129','571','210','4508','77','80','0','7048.99','1354.24','304.707','4.93802','4905:0 4908:0 '),\n('4908','ic1130','571','210','4537','77','80','0','7186.05','1411.54','315.97','0.428269','4907:0 4909:0 5003:0 '),\n('4909','ic1131','571','210','4537','77','80','0','7349.91','1448.05','320.323','0.242915','4908:0 4910:0 5003:0 '),\n('4910','ic1132','571','210','4537','77','80','0','7474.88','1490.17','330.932','0.611267','4909:0 4911:0 '),\n('4911','ic1133','571','210','4537','77','80','0','7573.73','1609.11','345.106','1.19325','4910:0 4912:0 4916:0 '),\n('4912','ic1134','571','210','4537','77','80','0','7721.75','1522.15','349.093','5.66688','4911:0 4913:0 4920:0 '),\n('4913','ic1135','571','210','4537','77','80','0','7720.3','1336.02','354.115','4.43774','4912:0 4914:0 4922:0 '),\n('4914','ic1136','571','210','4537','77','80','0','7534.59','1265.76','334.056','2.73578','4913:0 4915:0 '),\n('4915','ic1137','571','210','4537','77','80','0','7314','1220.63','315.76','3.35624','4914:0 4906:0 '),\n('4916','ic1138','571','210','4509','77','80','0','7577.1','1786.78','359.583','1.47521','4911:0 4917:0 '),\n('4917','ic1139','571','210','4509','77','80','0','7669.29','1945.97','367.174','1.15084','4916:0 4918:0 4927:0 '),\n('4918','ic1140','571','210','4509','77','80','0','7873.9','1929.78','365.964','6.20016','4917:0 4919:0 4923:0 '),\n('4919','ic1141','571','210','4509','77','80','0','7887.76','1725.17','368.82','4.09059','4918:0 4920:0 '),\n('4920','ic1142','571','210','4509','77','80','0','7765','1638.88','350.579','4.75974','4919:0 4912:0 '),\n('4921','ic1143','571','210','210','77','80','0','7920.44','1374.41','452.53','1.61423','4890:0 4922:0 '),\n('4922','ic1144','571','210','4537','77','80','0','7822.59','1365.97','388.481','3.40023','4921:0 4913:0 '),\n('4923','ic1145','571','210','4510','77','80','0','7809.24','2060.92','392.033','1.58203','4918:0 4924:0 '),\n('4924','ic1146','571','210','4540','77','80','0','7858.11','2248.57','376.618','1.4603','4923:0 4925:0 '),\n('4925','ic1147','571','210','4540','77','80','0','7823.2','2412.9','388.323','1.80744','4924:0 4926:0 '),\n('4926','ic1148','571','210','4540','77','80','0','7793.72','2597.47','402.105','1.67392','4925:0 4938:0 '),\n('4927','ic1149','571','210','4510','77','80','0','7699.75','2069.29','391.653','1.65822','4917:0 4928:0 '),\n('4928','ic1150','571','210','4540','77','80','0','7652.21','2249.08','368.676','2.35408','4927:0 4929:0 '),\n('4929','ic1151','571','210','4540','77','80','0','7521.07','2342.93','375.359','2.52294','4928:0 4930:0 '),\n('4930','ic1152','571','210','4523','77','80','0','7369.4','2442.13','391.045','2.44441','4929:0 4931:0 4939:0 '),\n('4931','ic1153','571','210','4523','77','80','0','7198.45','2497.03','404.398','2.97341','4930:0 4932:0 4939:0 '),\n('4932','ic1154','571','210','4523','77','80','0','7035.47','2497.06','410.594','3.37789','4931:0 4933:0 '),\n('4933','ic1155','571','210','4523','77','80','0','7014.72','2665.38','400.29','1.87621','4932:0 4934:0 '),\n('4934','ic1156','571','210','4523','77','80','0','7013.48','2866.37','424.885','1.59347','4933:0 4935:0 '),\n('4935','ic1157','571','210','4523','77','80','0','7165.04','2990.37','441.491','6.14878','4934:0 4936:0 '),\n('4936','ic1158','571','210','4523','77','80','0','7332.14','2917.95','423.697','5.78906','4935:0 4937:0 4939:0 4940:0 '),\n('4937','ic1159','571','210','4540','77','80','0','7502.18','2817.76','419.764','5.68225','4936:0 4938:0 4939:0 '),\n('4938','ic1160','571','210','4516','77','80','0','7710.23','2726.49','412.219','5.21495','4937:0 4926:0 5009:0 '),\n('4939','ic1161','571','210','4523','77','80','0','7307.93','2711.18','396.859','4.63376','4937:0 4930:0 4931:0 4936:0 '),\n('4940','ic1162','571','210','210','77','80','0','7358.64','3080.68','476.932','1.77884','4936:0 4941:0 '),\n('4941','ic1163','571','210','210','77','80','0','7199','3207.31','545.531','1.97125','4940:0 4942:0 '),\n('4942','ic1164','571','210','210','77','80','0','7139.56','3362.03','669.633','2.10878','4941:0 4943:0 '),\n('4943','ic1165','571','210','4531','77','80','0','6985.22','3466.47','708.57','2.8337','4942:0 4944:0 4974:0 '),\n('4944','ic1166','571','210','4531','77','80','0','6890.27','3530.05','708.606','5.39253','4943:0 4945:0 '),\n('4945','ic1167','571','210','4531','77','80','0','6830.55','3590.9','740.056','5.22131','4944:0 4946:0 '),\n('4946','ic1168','571','210','4496','77','80','0','6868.76','3731.57','755.294','4.54431','4945:0 4947:0 '),\n('4947','ic1169','571','210','4496','77','80','0','7002.18','3880.5','610.484','1.63677','4946:0 4948:0 4949:0 4951:0 '),\n('4948','ic1170','571','210','4496','77','80','0','6831.56','3987.86','615.968','2.45046','4947:0 4949:0 '),\n('4949','ic1171','571','210','4496','77','80','0','6897.56','3919.65','615.975','4.57026','4948:0 4947:0 4950:0 '),\n('4950','ic1172','571','210','4528','77','80','0','6814.18','3788.63','621.07','1.05954','4949:0 '),\n('4951','ic1173','571','210','4496','77','80','0','7138.52','3955.81','581.785','5.65333','4947:0 4952:0 5020:0 5022:0 '),\n('4952','ic1174','571','210','4498','77','80','0','7284.9','3836.51','604.369','5.59993','4951:0 4953:0 '),\n('4953','ic1175','571','210','4498','77','80','0','7410.57','3732.09','627.678','5.65962','4952:0 4954:0 '),\n('4954','ic1176','571','210','4526','77','80','0','7512.15','3660.34','623.332','6.01697','4953:0 4955:0 4973:0 '),\n('4955','ic1177','571','210','4526','77','80','0','7593.36','3544.42','655.937','5.07214','4954:0 4956:0 '),\n('4956','ic1178','571','210','4526','77','80','0','7671','3432.93','656.192','2.35151','4955:0 4957:0 '),\n('4957','ic1179','571','210','4526','77','80','0','7795.77','3500.91','658.351','0.992774','4956:0 4958:0 4959:0 4971:0 '),\n('4958','ic1180','571','210','4526','77','80','0','7883.18','3469.31','671.838','6.04917','4957:0 '),\n('4959','ic1181','571','210','4526','77','80','0','7919.33','3582.64','631.477','0.58594','4957:0 4960:0 '),\n('4960','ic1182','571','210','4524','77','80','0','8041.43','3526.53','654.716','6.08922','4959:0 4961:0 4968:0 '),\n('4961','ic1183','571','210','4524','77','80','0','8187.82','3610.43','658.019','0.290628','4960:0 4962:0 '),\n('4962','ic1184','571','210','4524','77','80','0','8317.43','3535.48','657.912','4.87265','4961:0 4963:0 '),\n('4963','ic1185','571','210','4524','77','80','0','8248.7','3338.48','654.291','5.09882','4962:0 4964:0 4968:0 '),\n('4964','ic1186','571','210','4496','77','80','0','8311.26','3170.17','618.951','5.16165','4963:0 4965:0 '),\n('4965','ic1187','571','210','4497','77','80','0','8430.96','3102.38','588.141','4.91819','4964:0 4966:0 '),\n('4966','ic1188','571','210','4492','77','80','0','8426.9','2947.18','602.293','4.77996','4965:0 4967:0 '),\n('4967','ic1189','571','210','4492','77','80','0','8429.04','2879.47','606.259','1.76717','4966:0 '),\n('4968','ic1190','571','210','4524','77','80','0','8105.02','3418.73','672.247','3.83984','4960:0 4963:0 4969:0 '),\n('4969','ic1191','571','210','4525','77','80','0','7990.63','3300.15','676.112','3.81628','4968:0 4970:0 '),\n('4970','ic1192','571','210','4525','77','80','0','7944.78','3251.88','632.818','3.79665','4969:0 '),\n('4971','ic1193','571','210','4526','77','80','0','7848.54','3632.5','653.393','4.16107','4957:0 4972:0 '),\n('4972','ic1194','571','210','4526','77','80','0','7717.96','3673.53','653.297','3.444','4971:0 4973:0 '),\n('4973','ic1195','571','210','4526','77','80','0','7617.43','3670.12','634.89','3.02774','4972:0 4954:0 '),\n('4974','ic1196','571','210','4531','77','80','0','6853.09','3478.09','692.779','3.04894','4943:0 4975:0 4976:0 4977:0 '),\n('4975','ic1197','571','210','4531','77','80','0','6714.63','3539.45','668.964','2.71907','4974:0 4977:0 '),\n('4976','ic1198','571','210','4531','77','80','0','6719.14','3429.9','682.197','3.43144','4974:0 4977:0 5024:0 '),\n('4977','ic1199','571','210','4531','77','80','0','6774.33','3483.53','672.159','3.05053','4974:0 4976:0 4975:0 4978:0 '),\n('4978','ic1200','571','210','4531','77','80','0','6549.04','3449.66','598.005','3.34505','4977:0 4979:0 '),\n('4979','ic1201','571','210','4531','77','80','0','6461.08','3286.15','631.506','5.01716','4978:0 4980:0 '),\n('4980','ic1202','571','210','4531','77','80','0','6452.51','3119.45','657.481','1.45066','4979:0 4981:0 '),\n('4981','ic1203','571','210','4518','77','80','0','6526.9','3000.14','651.117','4.87342','4980:0 4982:0 '),\n('4982','ic1204','571','210','4518','77','80','0','6547.7','2810.28','651.117','4.72026','4981:0 4983:0 '),\n('4983','ic1205','571','210','4518','77','80','0','6524.74','2581.76','651.117','4.51292','4982:0 4984:0 '),\n('4984','ic1206','571','210','4518','77','80','0','6630.74','2328.4','651.585','5.06506','4983:0 4985:0 '),\n('4985','ic1207','571','210','4518','77','80','0','6619.16','2134.02','651.118','4.86635','4984:0 4986:0 '),\n('4986','ic1208','571','210','4520','77','80','0','6609.61','1940.41','652.242','3.77073','4985:0 4987:0 4990:0 '),\n('4987','ic1209','571','210','4520','77','80','0','6436.2','1960.49','631.376','3.19739','4986:0 4988:0 '),\n('4988','ic1210','571','210','4520','77','80','0','6238.67','1930.65','631.948','3.56731','4987:0 4989:0 '),\n('4989','ic1211','571','210','4520','77','80','0','6075.08','1919.83','632.648','3.19032','4988:0 '),\n('4990','ic1212','571','210','4520','77','80','0','6546.79','1812.75','629.551','4.65274','4986:0 4991:0 4992:0 '),\n('4991','ic1213','571','210','4520','77','80','0','6556.05','1624.57','633.228','4.76113','4990:0 4992:0 '),\n('4992','ic1214','571','210','4520','77','80','0','6590.03','1684.23','628.876','3.70395','4991:0 4990:0 4993:0 '),\n('4993','ic1215','571','210','4513','77','80','0','6728.5','1651.46','572.96','1.13099','4992:0 4994:0 '),\n('4994','ic1216','571','210','4513','77','80','0','6809.4','1726.92','556.264','3.80763','4993:0 4995:0 4996:0 '),\n('4995','ic1217','571','210','4513','77','80','0','6812.51','1821.36','578.354','4.77131','4994:0 '),\n('4996','ic1218','571','210','4513','77','80','0','6952.4','1697.92','518.536','2.9209','4994:0 4997:0 '),\n('4997','ic1219','571','210','4513','77','80','0','7031.52','1779.42','506.019','1.12469','4996:0 4998:0 5000:0 '),\n('4998','ic1220','571','210','4514','77','80','0','7025.43','1902.07','528.077','5.0187','4997:0 4999:0 '),\n('4999','ic1221','571','210','4514','77','80','0','6960.52','2014.43','520.864','4.66919','4998:0 '),\n('5000','ic1222','571','210','4513','77','80','0','7201.98','1696.05','469.261','2.30668','4997:0 5001:0 5004:0 5005:0 '),\n('5001','ic1223','571','210','210','77','80','0','7348.32','1642.76','429.984','1.78832','5000:0 5002:0 '),\n('5002','ic1224','571','210','210','77','80','0','7214.66','1585.03','379.979','5.44591','5001:0 5003:0 '),\n('5003','ic1225','571','210','4537','77','80','0','7281.16','1492.2','326.379','1.64772','5002:0 4909:0 4908:0 5004:0 '),\n('5004','ic1226','571','210','210','77','80','0','7331.27','1765.54','456.844','3.80914','5003:0 5000:0 '),\n('5005','ic1227','571','210','4513','77','80','0','7136.03','1876.5','532.96','4.77911','5000:0 5006:0 '),\n('5006','ic1228','571','210','4513','77','80','0','7224.2','1973.83','570.931','1.27072','5005:0 5007:0 5008:0 '),\n('5007','ic1229','571','210','4513','77','80','1','7242.67','2168.33','565.646','4.69493','5006:0 '),\n('5008','ic1230','571','210','4513','77','80','0','7100.09','2122.12','621.203','4.3801','5006:0 '),\n('5009','ic1231','571','210','4540','77','80','0','7682.15','2851.03','469.055','2.77003','4938:0 5010:0 '),\n('5010','ic1232','571','210','4517','77','80','0','7685.31','3002.19','541.332','0.921987','5009:0 5011:0 '),\n('5011','ic1233','571','210','4517','77','80','0','7702.82','3078.43','557.351','5.63045','5010:0 5012:0 5019:0 '),\n('5012','ic1234','571','210','4517','77','80','0','7843.82','2935.68','517.933','0.541764','5011:0 5013:0 '),\n('5013','ic1235','571','210','4517','77','80','0','7934.47','2994.97','541.057','3.56948','5012:0 5014:0 '),\n('5014','ic1236','571','210','4517','77','80','0','8021.28','2971.58','563.405','2.3317','5013:0 5015:0 '),\n('5015','ic1237','571','210','4517','77','80','0','8106.95','2852.61','559.292','5.73169','5014:0 5016:0 5025:0 '),\n('5016','ic1238','571','210','4477','77','80','0','8243','2776.54','640.775','6.08434','5015:0 5017:0 '),\n('5017','ic1239','571','210','4477','77','80','0','8383.84','2730.79','655.094','5.79375','5016:0 5018:0 '),\n('5018','ic1240','571','210','4477','77','80','1','8508.77','2673.5','652.354','5.83302','5017:0 '),\n('5019','ic1241','571','210','4517','77','80','0','7575.23','3170.11','577.394','5.58719','5011:0 '),\n('5020','ic1242','571','210','4496','77','80','0','6971.39','3981.75','552.612','5.94612','4951:0 5021:0 '),\n('5021','ic1243','571','210','4496','77','80','0','6934.59','4194.33','535.202','1.79686','5020:0 '),\n('5022','ic1244','571','210','4496','77','80','0','7162.84','4153.53','633.939','2.91213','4951:0 5023:0 '),\n('5023','ic1245','571','210','4496','77','80','0','7019.95','4225.08','665.892','2.06625','5022:0 '),\n('5024','ic1246','571','210','4531','77','80','0','6545.08','3321.6','665.004','4.0596','4976:0 '),\n('5025','ic1247','571','210','210','77','80','0','8061.74','2755.35','542.008','4.48453','5015:0 5026:0 '),\n('5026','ic1248','571','210','210','77','80','0','8077.07','2597.13','519.549','4.54375','5025:0 5027:0 '),\n('5027','ic1249','571','210','4510','77','80','0','8103.98','2410.6','490.587','4.97494','5026:0 5028:0 '),\n('5028','ic1250','571','210','4510','77','80','0','8060.18','2339.25','484.62','3.25413','5027:0 5029:0 '),\n('5029','ic1251','571','210','4510','77','80','0','7982.84','2214.78','500.312','4.5092','5028:0 5030:0 5031:0 '),\n('5030','ic1252','571','210','4510','77','80','0','8163.01','2189.09','499.737','3.33032','5029:0 '),\n('5031','ic1253','571','210','4510','77','80','0','7986.6','2067','499.729','3.00752','5029:0 5032:0 5035:0 '),\n('5032','ic1254','571','210','4510','77','80','0','8120.19','1962.29','501.671','5.88521','5031:0 5033:0 '),\n('5033','ic1255','571','210','4510','77','80','0','8204.78','1874.81','514.771','1.36602','5032:0 5034:0 '),\n('5034','ic1256','571','210','4510','77','80','0','8179.12','2049.72','550.596','2.65329','5033:0 '),\n('5035','ic1257','571','210','4510','77','80','0','7751.59','2060.95','499.864','3.22507','5031:0 5036:0 '),\n('5036','ic1258','571','210','4510','77','80','0','7549.16','2067.17','500.312','3.28947','5035:0 5037:0 5038:0 '),\n('5037','ic1259','571','210','4510','77','80','0','7438.58','2146.13','500.312','2.65644','5036:0 '),\n('5038','ic1260','571','210','4510','77','80','0','7492.17','1991.36','500.301','0.996881','5036:0 ');\n"
  },
  {
    "path": "SQL/updates/world/2023_06_16_00_creature_template_npcbot_wander_nodes.sql",
    "content": "--\nUPDATE `creature_template_npcbot_wander_nodes` SET `flags`='4' WHERE (`id`='28'); -- Razor Hill: make Horde-only\n-- Durotar canyon (Drygulch Ravine)\nUPDATE `creature_template_npcbot_wander_nodes` SET `flags`='0' WHERE `id` IN ('66','1372','1373','1374','1375','1376','1377','1378','1380','1381','1382','1383','1384','1385','1401');\nUPDATE `creature_template_npcbot_wander_nodes` SET `flags`='1' WHERE (`id`='419'); -- RefugePointeExitS: allow neutral spawns\nUPDATE `creature_template_npcbot_wander_nodes` SET `flags`='1' WHERE (`id`='505'); -- LochS: allow neutral spawns\nUPDATE `creature_template_npcbot_wander_nodes` SET `flags`='1' WHERE (`id`='1071'); -- AshenvaleC_hub11: allow neutral spawns\nUPDATE `creature_template_npcbot_wander_nodes` SET `flags`='1' WHERE (`id`='1379'); -- DurotarCanyon1: allow neutral spawns\nUPDATE `creature_template_npcbot_wander_nodes` SET `flags`='1' WHERE (`id`='1739'); -- DesolaceN34: allow neutral spawns\n"
  },
  {
    "path": "SQL/updates/world/2023_06_18_00_command.sql",
    "content": "--\nINSERT IGNORE INTO `command` (`name`) VALUES\n('npcbot command follow only'),\n('npcbot command nocast'),\n('npcbot command nolongcast'),\n('npcbot debug guids'),\n('npcbot debug model'),\n('npcbot debug mount'),\n('npcbot debug names'),\n('npcbot debug raid'),\n('npcbot debug spellvisual'),\n('npcbot debug states'),\n('npcbot debug wbequips'),\n('npcbot debug spells'),\n('npcbot gs'),\n('npcbot useonbot item'),\n('npcbot useonbot spell'),\n('npcbot wp add'),\n('npcbot wp go'),\n('npcbot wp info'),\n('npcbot wp links'),\n('npcbot wp list'),\n('npcbot wp list all'),\n('npcbot wp move'),\n('npcbot wp setflags'),\n('npcbot wp setflags z'),\n('npcbot wp setlevels'),\n('npcbot wp setlevels z'),\n('npcbot wp setlinks'),\n('npcbot wp del'),\n('npcbot wp setname'),\n('npcbot wp spawnall');\n"
  },
  {
    "path": "SQL/updates/world/2023_06_18_01_creature_template_npcbot_disabled_items.sql",
    "content": "--\nDROP TABLE IF EXISTS `creature_template_npcbot_disabled_items`;\nCREATE TABLE `creature_template_npcbot_disabled_items` (\n  `id` int(10) unsigned NOT NULL DEFAULT '0',\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n"
  },
  {
    "path": "SQL/updates/world/2023_06_19_00_creature_template_npcbot_disabled_items.sql",
    "content": "--\nINSERT IGNORE INTO `creature_template_npcbot_disabled_items` (`id`) VALUES\n('77'),\n('1046'),\n('1047'),\n('1170'),\n('1174'),\n('1354'),\n('1719'),\n('2811'),\n('2812'),\n('2814'),\n('3068'),\n('3271'),\n('3333'),\n('3436'),\n('3883'),\n('3885'),\n('3886'),\n('3887'),\n('3888'),\n('3933'),\n('3935'),\n('4193'),\n('4616'),\n('4657'),\n('4664'),\n('4667'),\n('4670'),\n('4673'),\n('4902'),\n('4934'),\n('4950'),\n('4955'),\n('4956'),\n('5040'),\n('5294'),\n('5295'),\n('5296'),\n('5297'),\n('5298'),\n('5607'),\n('12755'),\n('13242'),\n('14363'),\n('14597'),\n('14609'),\n('14691'),\n('14696'),\n('15888'),\n('15889'),\n('22391'),\n('23553');\n"
  },
  {
    "path": "SQL/updates/world/2023_06_19_01_creature_template.sql",
    "content": "--\nUPDATE `creature_template` SET `speed_walk` = 1.0, `speed_run` = 1.0 WHERE `entry` > 70000 AND (`flags_extra`&0x8E000000) = 0x8E000000 AND `speed_run` > 1.0;\n"
  },
  {
    "path": "SQL/updates/world/2023_06_22_00_command.sql",
    "content": "--\nDELETE FROM `command` WHERE `name` LIKE 'npcbot debug %';\n"
  },
  {
    "path": "SQL/updates/world/2023_06_24_00_creature_template_npcbot_wander_nodes.sql",
    "content": "--\nSET @WP_START = 5039;\nSET @WP_END   = 5087;\n\nDELETE FROM `creature_template_npcbot_wander_nodes` WHERE `id` BETWEEN @WP_START AND @WP_END;\nINSERT INTO `creature_template_npcbot_wander_nodes`(`id`,`name`,`mapid`,`zoneid`,`areaid`,`minlevel`,`maxlevel`,`flags`,`x`,`y`,`z`,`o`,`links`) VALUES\n('5039', 'AlteracValleySpawnA', '30', '2597', '2597', '50', '80', '3', '801.027', '-493.883', '99.6917', '3.08066', '5040:0 '),\n('5040', 'AlteracValleyStartA1', '30', '2597', '3299', '50', '80', '2', '717.929', '-475.351', '75.1276', '2.10478', '5041:0 5079:0 '),\n('5041', 'AlteracValleyStartA2', '30', '2597', '3299', '50', '80', '34', '664.972', '-400.377', '68.7491', '2.43269', '5042:0 5077:0 '),\n('5042', 'AlteracValleyStartA3', '30', '2597', '3299', '50', '80', '2', '610.827', '-388.879', '66.5562', '3.30843', '5043:0 '),\n('5043', 'AlteracValleyStartA4', '30', '2597', '2597', '50', '80', '2', '463.128', '-438.201', '33.0107', '2.75865', '5044:0 '),\n('5044', 'AlteracValleyHubA1', '30', '2597', '2597', '50', '80', '0', '401.785', '-393.695', '-1.05733', '2.60355', '5045:0 5084:0 '),\n('5045', 'AlteracValleyBunker2', '30', '2597', '3304', '50', '80', '0', '221.727', '-412.006', '41.1425', '2.14206', '5046:0 5047:0 5044:0 '),\n('5046', 'AlteracValleyBunker2Inside', '30', '2597', '3304', '50', '80', '146', '204.453', '-359.47', '56.3831', '2.20687', '5045:0 '),\n('5047', 'AlteracValleyGYA1', '30', '2597', '3302', '50', '80', '128', '76.8322', '-399.172', '45.7006', '1.69996', '5045:0 5048:0 5049:0 5050:0 '),\n('5048', 'AlteracValleyBelinda', '30', '2597', '2958', '50', '80', '0', '-36.1268', '-290.741', '15.0786', '3.0354', '5047:0 '),\n('5049', 'AlteracValleyCN', '30', '2597', '2597', '50', '80', '0', '-133.7', '-368.866', '8.47712', '6.00431', '5047:0 5052:0 5087:0 '),\n('5050', 'AlteracValleyBunker1Inside', '30', '2597', '3305', '50', '80', '146', '-151.384', '-442.049', '40.3942', '1.08956', '5047:0 '),\n('5051', 'AlteracValleyGYC', '30', '2597', '3301', '50', '80', '128', '-200.494', '-109.396', '78.5207', '4.95373', '5087:0 5086:0 '),\n('5052', 'AlteracValleyCS1', '30', '2597', '3057', '50', '80', '0', '-262.759', '-292.49', '6.80088', '5.73925', '5049:0 5053:0 '),\n('5053', 'AlteracValleyCS2', '30', '2597', '3057', '50', '80', '0', '-473.131', '-273.873', '24.7318', '3.74628', '5052:0 5054:0 5086:0 '),\n('5054', 'AlteracValleyCS3', '30', '2597', '2597', '50', '80', '32', '-525.235', '-353.849', '37.0353', '4.37461', '5055:0 5053:0 '),\n('5055', 'AlteracValleyCS4', '30', '2597', '2597', '50', '80', '0', '-601.467', '-320.914', '51.7167', '6.08664', '5054:0 5056:0 '),\n('5056', 'AlteracValleyGYH1', '30', '2597', '2597', '50', '80', '128', '-615.967', '-397.593', '60.6924', '0.333583', '5055:0 5057:0 5058:0 5059:0 '),\n('5057', 'AlteracValleyTower1Inside', '30', '2597', '2977', '50', '80', '148', '-569.205', '-264.746', '75.0088', '2.58769', '5056:0 '),\n('5058', 'AlteracValleyGalvangar', '30', '2597', '2977', '50', '80', '0', '-536.858', '-168.875', '57.0098', '2.75262', '5056:0 '),\n('5059', 'AlteracValleyTower2', '30', '2597', '2962', '50', '80', '0', '-715.985', '-350.671', '66.8321', '2.63482', '5056:0 5060:0 5061:0 '),\n('5060', 'AlteracValleyTower2Inside', '30', '2597', '2962', '50', '80', '148', '-767.615', '-361.296', '90.8949', '4.27041', '5059:0 '),\n('5061', 'AlteracValleyGYH2', '30', '2597', '2597', '50', '80', '128', '-1083.95', '-341.705', '55.3047', '0.111719', '5059:0 5064:0 5082:0 '),\n('5062', 'AlteracValleyStartH1', '30', '2597', '2597', '50', '80', '4', '-1144.38', '-442.064', '56.7427', '0.904973', '5061:0 '),\n('5063', 'AlteracValleySpawnH', '30', '2597', '2597', '50', '80', '5', '-1386.53', '-549.064', '55.0284', '0.628112', '5062:0 '),\n('5064', 'AlteracValleyBaseH1', '30', '2597', '2961', '50', '80', '0', '-1241.61', '-363.466', '59.6773', '2.10074', '5061:0 5065:0 '),\n('5065', 'AlteracValleyBaseH2', '30', '2597', '2961', '50', '80', '0', '-1210.4', '-252.908', '72.7007', '3.07856', '5064:0 5066:0 '),\n('5066', 'AlteracValleyBaseH3', '30', '2597', '2978', '50', '80', '0', '-1286.08', '-289.551', '89.091', '3.10996', '5065:0 5067:0 '),\n('5067', 'AlteracValleyGYH3', '30', '2597', '2978', '50', '80', '128', '-1404.13', '-312.526', '89.4075', '1.4783', '5066:0 5068:0 5069:0 5070:0 '),\n('5068', 'AlteracValleyTower3Inside', '30', '2597', '2978', '50', '80', '148', '-1301.34', '-267.703', '114.151', '0.219693', '5067:0 '),\n('5069', 'AlteracValleyTower4Inside', '30', '2597', '2978', '50', '80', '148', '-1304.35', '-313.854', '113.867', '5.07738', '5067:0 '),\n('5070', 'AlteracValleyDrekthar', '30', '2597', '4407', '50', '80', '276', '-1367.71', '-227.007', '98.4255', '2.09366', '5067:0 '),\n('5071', 'AlteracValleyGYA2', '30', '2597', '3303', '50', '80', '128', '664.375', '-295.432', '30.2906', '1.6334', '5072:0 5080:0 5084:0 '),\n('5072', 'AlteracValleyBaseA1', '30', '2597', '2959', '50', '80', '0', '628.165', '-209.132', '39.032', '1.71587', '5073:0 5071:0 '),\n('5073', 'AlteracValleyGYA3', '30', '2597', '2959', '50', '80', '128', '635.165', '-28.286', '46.6157', '4.25874', '5072:0 5074:0 5075:0 5076:0 '),\n('5074', 'AlteracValleyBunker3Inside', '30', '2597', '2959', '50', '80', '146', '672.521', '-142.475', '63.6551', '4.09365', '5073:0 '),\n('5075', 'AlteracValleyBunker4Inside', '30', '2597', '2959', '50', '80', '146', '555.611', '-77.7777', '51.9336', '1.81992', '5073:0 '),\n('5076', 'AlteracValleyVanndar', '30', '2597', '4408', '50', '80', '274', '712.208', '-13.5129', '50.1354', '0.288398', '5073:0 '),\n('5077', 'AlteracValleyShortcutA1', '30', '2597', '3303', '50', '80', '34', '668.321', '-376.13', '30.4499', '1.65697', '5071:0 '),\n('5078', 'AlteracValleyShortcutH1', '30', '2597', '2597', '50', '80', '36', '-550.621', '-356.862', '50.2404', '5.33475', '5054:0 '),\n('5079', 'AlteracValleyMineA1', '30', '2597', '2957', '50', '80', '34', '774.881', '-363.728', '78.8805', '1.75712', '5080:0 '),\n('5080', 'AlteracValleyMineA2', '30', '2597', '2957', '50', '80', '32', '776.68', '-313.432', '54.4907', '0.0135369', '5081:0 5071:0 '),\n('5081', 'AlteracValleyMineA3', '30', '2597', '2957', '50', '80', '512', '870.508', '-436.928', '51.1438', '5.59377', '5080:0 '),\n('5082', 'AlteracValleyMineH1', '30', '2597', '2963', '50', '80', '0', '-964.106', '-216.1', '69.4372', '0.822477', '5061:0 5083:0 '),\n('5083', 'AlteracValleyMineH2', '30', '2597', '2963', '50', '80', '512', '-857.468', '-102.82', '65.0282', '0.681106', '5082:0 '),\n('5084', 'AlteracValleyAuxA1', '30', '2597', '2597', '50', '80', '0', '517.454', '-327.563', '-1.03301', '0.235552', '5044:0 5071:0 '),\n('5085', 'AlteracValleyIcebloodGY', '30', '2597', '3300', '50', '80', '0', '-531.167', '-405.06', '49.5441', '2.83719', '5056:0 5078:0 '),\n('5086', 'AlteracValleyGYCS', '30', '2597', '3057', '50', '80', '0', '-296.163', '-118.723', '18.4795', '0.58704', '5051:0 5053:0 '),\n('5087', 'AlteracValleyGYCN', '30', '2597', '2597', '50', '80', '0', '-154.952', '-231.949', '10.0454', '1.75925', '5049:0 5051:0 ');\n"
  },
  {
    "path": "SQL/updates/world/2023_06_26_00_creature_template_npcbot_wander_nodes.sql",
    "content": "--\nDELETE FROM `creature_template_npcbot_wander_nodes` WHERE `id` IN (2396,2406);\nINSERT INTO `creature_template_npcbot_wander_nodes`(`id`,`name`,`mapid`,`zoneid`,`areaid`,`minlevel`,`maxlevel`,`flags`,`x`,`y`,`z`,`o`,`links`) VALUES\n('2396','ArathiBasinSpawnA','529','3358','3417','20','80','3','1289.51','1286.41','-14.466','3.89804','2397:0 '),\n('2406','ArathiBasinSpawnH','529','3358','3418','20','80','5','704.074','704.457','-16.4305','0.79572','2407:0 ');\n"
  },
  {
    "path": "SQL/updates/world/2023_07_01_00_creature_template_npcbot_disabled_items.sql",
    "content": "-- Test items: 'LK ARENA ...', 'LK Arena ...', 'LK Honor ...' (SELECT entry,name FROM item_template WHERE name LIKE 'LK %';)\nINSERT IGNORE INTO `creature_template_npcbot_disabled_items` (`id`) VALUES\n('42000'),\n('42019'),\n('41995'),\n('42007'),\n('42013'),\n('40650'),\n('41900'),\n('41911'),\n('42083');\n"
  },
  {
    "path": "SQL/updates/world/2023_08_13_00_creature_template_npcbot_appearance.sql",
    "content": "--\nALTER TABLE `creature_template_npcbot_appearance` MODIFY COLUMN `name*` char(100) DEFAULT 'unk' COMMENT 'unused', CHARSET=utf8mb4;\n"
  },
  {
    "path": "SQL/updates/world/2024_03_12_00_npc_text.sql",
    "content": "--\nSET @LOCALIZED_STRINGS_START = 70673;\nSET @LOCALIZED_STRINGS_END   = 70673;\n\nDELETE FROM `npc_text` WHERE ID BETWEEN @LOCALIZED_STRINGS_START and @LOCALIZED_STRINGS_END;\nINSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n(70673,'Heal target health threshold','-1');\n"
  },
  {
    "path": "SQL/updates/world/2024_03_18_00_npc_text.sql",
    "content": "--\nUPDATE `npc_text` SET `text0_0`='You exceed max npcbots for your level (%u)' WHERE (`ID`='70532');\n"
  },
  {
    "path": "SQL/updates/world/2024_03_19_00_npc_text.sql",
    "content": "--\nSET @LOCALIZED_STRINGS_START = 70674;\nSET @LOCALIZED_STRINGS_END   = 70684;\n\nDELETE FROM `npc_text` WHERE ID BETWEEN @LOCALIZED_STRINGS_START and @LOCALIZED_STRINGS_END;\nINSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n(70674,'I need a portal','-1'),\n(70675,'Stormwind','-1'),\n(70676,'Ironforge','-1'),\n(70677,'Darnassus','-1'),\n(70678,'Exodar','-1'),\n(70679,'Orgrimmar','-1'),\n(70680,'Undercity','-1'),\n(70681,'Thunder Bluff','-1'),\n(70682,'Silvermoon','-1'),\n(70683,'Shattrath','-1'),\n(70684,'Dalaran','-1');\n"
  },
  {
    "path": "SQL/updates/world/2024_05_29_00_command.sql",
    "content": "--\nINSERT IGNORE INTO `command` (`name`) VALUES\n('npcbot log clear');\n"
  },
  {
    "path": "SQL/updates/world/2024_08_14_00_npc_text.sql",
    "content": "--\nSET @LOCALIZED_STRINGS_START = 70685;\nSET @LOCALIZED_STRINGS_END   = 70685;\n\nDELETE FROM `npc_text` WHERE ID BETWEEN @LOCALIZED_STRINGS_START and @LOCALIZED_STRINGS_END;\nINSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n(@LOCALIZED_STRINGS_START,'You exceed max npcbots for your account (%u >= %u)','-1');\n"
  },
  {
    "path": "SQL/updates/world/2024_08_15_00_command.sql",
    "content": "--\nINSERT IGNORE INTO `command` (`name`) VALUES\n('npcbot free');\n"
  },
  {
    "path": "SQL/updates/world/2024_08_31_00_command.sql",
    "content": "--\nINSERT IGNORE INTO `command` (`name`) VALUES\n('npcbot order pull');\n"
  },
  {
    "path": "SQL/updates/world/2024_10_21_00_npc_text.sql",
    "content": "--\nSET @LOCALIZED_STRINGS_START = 70686;\nSET @LOCALIZED_STRINGS_END   = 70686;\n\nDELETE FROM `npc_text` WHERE ID BETWEEN @LOCALIZED_STRINGS_START and @LOCALIZED_STRINGS_END;\nINSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n(@LOCALIZED_STRINGS_START,'<Set for all bots>','-1');\n"
  },
  {
    "path": "SQL/updates/world/2024_10_27_00_command.sql",
    "content": "--\nINSERT IGNORE INTO `command` (`name`) VALUES\n('npcbot wp setweights');\n"
  },
  {
    "path": "SQL/updates/world/2024_10_31_creature_template_wander_nodes.sql",
    "content": "--\nDELETE FROM `creature_template_npcbot_wander_nodes` WHERE `id` BETWEEN 2372 AND 5095;\nINSERT INTO `creature_template_npcbot_wander_nodes` (`id`,`name`,`mapid`,`zoneid`,`areaid`,`minlevel`,`maxlevel`,`flags`,`x`,`y`,`z`,`o`,`links`) VALUES\n('2372', 'hellfire001', '530', '3483', '3804', '60', '63', '0', '-88.1661', '1757.73', '61.4158', '2.30551', '2373:0 2376:0 '),\n('2373', 'hellfire002', '530', '3483', '3804', '60', '63', '0', '-130.83', '1837.76', '78.4899', '5.22012', '2372:0 2374:0 2376:0 '),\n('2374', 'hellfire003', '530', '3483', '3542', '60', '63', '0', '-228.144', '1920.56', '96.8968', '1.90495', '2373:0 2375:0 2376:0 '),\n('2375', 'hellfire004', '530', '3483', '3542', '60', '63', '1', '-207.846', '2150.92', '80.3185', '1.58606', '2374:0 2396:0 2407:0 '),\n('2376', 'hellfire005', '530', '3483', '3804', '60', '63', '0', '-320.252', '1725.48', '60.1535', '0.383608', '2372:0 2373:0 2374:0 2377:0 '),\n('2377', 'hellfire006', '530', '3483', '3804', '60', '63', '0', '-443.68', '1809.38', '64.2507', '6.17593', '2376:0 2378:0 '),\n('2378', 'hellfire007', '530', '3483', '3815', '60', '63', '0', '-614.482', '1855.41', '72.3221', '2.91339', '2377:0 2379:0 '),\n('2379', 'hellfire008', '530', '3483', '3483', '60', '63', '0', '-772.087', '1924.89', '51.3142', '3.69486', '2378:0 2380:0 2381:0 '),\n('2380', 'hellfire009', '530', '3483', '3582', '60', '63', '0', '-890.066', '1889.54', '71.6232', '2.99193', '2379:0 '),\n('2381', 'hellfire010', '530', '3483', '3483', '60', '63', '0', '-665.15', '2133.08', '41.0304', '6.09818', '2379:0 2382:0 '),\n('2382', 'hellfire011', '530', '3483', '3483', '60', '63', '0', '-830.651', '2170.3', '10.6442', '6.00392', '2381:0 2383:0 '),\n('2383', 'hellfire012', '530', '3483', '3582', '60', '63', '0', '-1044.48', '2221.12', '18.1881', '2.68955', '2382:0 2384:0 2386:0 '),\n('2384', 'hellfire013', '530', '3483', '3582', '60', '63', '0', '-1060.21', '2075.54', '65.7492', '1.53579', '2383:0 2385:0 '),\n('2385', 'hellfire014', '530', '3483', '3582', '60', '63', '0', '-1136.98', '1968.35', '74.7199', '4.3593', '2384:0 '),\n('2386', 'hellfire015', '530', '3483', '3483', '60', '63', '0', '-1116.71', '2366.85', '26.2', '1.55936', '2383:0 2387:0 '),\n('2387', 'hellfire016', '530', '3483', '3483', '60', '63', '0', '-1209.75', '2517.59', '48.9283', '1.97249', '2386:0 '),\n('2388', 'hellfire017', '530', '3483', '3483', '60', '63', '0', '-927.061', '2680.73', '24.4655', '4.225', '2389:0 2392:0 '),\n('2389', 'hellfire018', '530', '3483', '3483', '60', '63', '0', '-991.176', '2930.18', '4.1955', '4.89571', '2388:0 2412:0 2413:0 '),\n('2390', 'hellfire019', '530', '3483', '3483', '60', '63', '0', '-652.576', '2459.81', '56.8494', '0.00658825', '2391:0 2392:0 '),\n('2391', 'hellfire020', '530', '3483', '3483', '60', '63', '0', '-382.816', '2594.23', '50.224', '3.72781', '2390:0 '),\n('2392', 'hellfire021', '530', '3483', '3538', '60', '63', '3', '-721.67', '2675.81', '95.7509', '0.770785', '2388:0 2390:0 '),\n('2393', 'hellfire022', '530', '3483', '3483', '60', '63', '0', '-449.715', '2925.64', '21.2132', '0.32312', '2394:0 '),\n('2394', 'hellfire023', '530', '3483', '3483', '60', '63', '0', '-593.071', '2998.53', '15.8438', '0.017592', '2393:0 2395:0 '),\n('2395', 'hellfire024', '530', '3483', '3483', '60', '63', '0', '-749.912', '3117.85', '4.88152', '5.75179', '2394:0 2412:0 2453:0 '),\n('2396', 'hellfire025', '530', '3483', '3483', '60', '63', '0', '-80.7943', '2320.17', '65.6333', '4.50299', '2375:0 2397:0 2400:0 2407:0 '),\n('2397', 'hellfire026', '530', '3483', '3483', '60', '63', '0', '18.4377', '2469.36', '53.639', '4.22811', '2396:0 2398:0 2400:0 '),\n('2398', 'hellfire027', '530', '3483', '3536', '60', '63', '4', '33.0662', '2661.07', '75.7738', '3.89274', '2397:0 2399:0 '),\n('2399', 'hellfire028', '530', '3483', '3536', '60', '63', '5', '221.743', '2789.93', '121.175', '3.98307', '2398:0 2450:0 '),\n('2400', 'hellfire029', '530', '3483', '3793', '60', '63', '0', '158.425', '2334.4', '54.1841', '5.04414', '2396:0 2397:0 2401:0 '),\n('2401', 'hellfire030', '530', '3483', '3793', '60', '63', '0', '270.62', '2240.47', '56.9978', '2.96989', '2400:0 2402:0 '),\n('2402', 'hellfire031', '530', '3483', '3793', '60', '63', '0', '255.635', '2040.2', '31.817', '2.78925', '2401:0 2403:0 '),\n('2403', 'hellfire032', '530', '3483', '3483', '60', '63', '0', '446.912', '2049.26', '99.1622', '3.3783', '2402:0 2404:0 '),\n('2404', 'hellfire033', '530', '3483', '3483', '60', '63', '0', '442.066', '2351.62', '123.026', '4.69385', '2403:0 2405:0 '),\n('2405', 'hellfire034', '530', '3483', '3483', '60', '63', '0', '438.394', '2661.09', '177.718', '4.90591', '2404:0 2406:0 '),\n('2406', 'hellfire035', '530', '3483', '3549', '60', '63', '0', '549.636', '2796.65', '217.8', '4.31374', '2405:0 '),\n('2407', 'hellfire036', '530', '3483', '3542', '60', '63', '0', '-220.959', '2363', '37.4537', '1.6049', '2375:0 2396:0 2408:0 '),\n('2408', 'hellfire037', '530', '3483', '3542', '60', '63', '0', '-248.594', '2648.76', '-11.9763', '4.88786', '2407:0 2409:0 '),\n('2409', 'hellfire038', '530', '3483', '3542', '60', '63', '0', '-270.052', '2895.86', '-55.0992', '4.86824', '2408:0 2410:0 2411:0 '),\n('2410', 'hellfire039', '530', '3483', '3545', '60', '63', '0', '-371.638', '3039.8', '-63.8946', '5.60259', '2409:0 '),\n('2411', 'hellfire040', '530', '3483', '3545', '60', '63', '0', '-243.298', '3044.75', '-65.4235', '4.48185', '2409:0 '),\n('2412', 'hellfire041', '530', '3483', '3483', '60', '63', '0', '-930.007', '3088.24', '16.9479', '0.133084', '2389:0 2395:0 2413:0 2420:0 '),\n('2413', 'hellfire042', '530', '3483', '3483', '60', '63', '0', '-1233.86', '3071.59', '29.2379', '5.81622', '2412:0 2389:0 2414:0 2416:0 '),\n('2414', 'hellfire043', '530', '3483', '3796', '60', '63', '0', '-1370.5', '2890.29', '-26.0325', '3.35557', '2413:0 2415:0 '),\n('2415', 'hellfire044', '530', '3483', '3546', '60', '63', '0', '-1257.98', '2677.11', '1.84108', '2.88824', '2414:0 '),\n('2416', 'hellfire045', '530', '3483', '3483', '60', '63', '0', '-1343.14', '3305.78', '47.482', '2.24265', '2413:0 2417:0 '),\n('2417', 'hellfire046', '530', '3483', '3765', '60', '63', '0', '-1519.57', '3487.42', '30.3847', '2.18217', '2416:0 2418:0 '),\n('2418', 'hellfire047', '530', '3483', '3765', '60', '63', '0', '-1621.55', '3645.56', '31.4811', '1.74235', '2417:0 2419:0 '),\n('2419', 'hellfire048', '530', '3483', '3765', '60', '63', '0', '-1680.38', '3854.3', '36.4441', '1.97326', '2418:0 2738:0 '),\n('2420', 'hellfire049', '530', '3483', '3483', '60', '63', '0', '-1003.35', '3339.19', '79.143', '4.83211', '2412:0 2421:0 '),\n('2421', 'hellfire050', '530', '3483', '3483', '60', '63', '0', '-866.12', '3482.05', '93.6018', '3.97209', '2420:0 2422:0 '),\n('2422', 'hellfire051', '530', '3483', '3543', '60', '63', '0', '-842.626', '3645.6', '31.4407', '5.28056', '2421:0 2423:0 '),\n('2423', 'hellfire052', '530', '3483', '3543', '60', '63', '0', '-578.854', '3725.85', '28.9962', '3.4176', '2422:0 2424:0 '),\n('2424', 'hellfire053', '530', '3483', '3543', '60', '63', '0', '-629.058', '3954.17', '28.9952', '4.88236', '2423:0 2425:0 2426:0 2428:0 '),\n('2425', 'hellfire054', '530', '3483', '3483', '60', '63', '0', '-503.474', '4084.93', '51.2172', '4.03729', '2424:0 2428:0 2435:0 '),\n('2426', 'hellfire055', '530', '3483', '3543', '60', '63', '0', '-841.235', '4095.51', '32.9704', '5.79579', '2424:0 2427:0 2428:0 2431:0 '),\n('2427', 'hellfire056', '530', '3483', '3483', '60', '63', '0', '-950.497', '4184.92', '29.5337', '3.20635', '2426:0 2429:0 2431:0 '),\n('2428', 'hellfire057', '530', '3483', '3554', '60', '63', '5', '-659.228', '4167.05', '67.8382', '3.41684', '2424:0 2425:0 2426:0 2435:0 '),\n('2429', 'hellfire058', '530', '3483', '3556', '60', '63', '0', '-1174.94', '4209.88', '20.9412', '0.188851', '2427:0 2430:0 '),\n('2430', 'hellfire059', '530', '3483', '3798', '60', '63', '0', '-1287.84', '4075.76', '93.8567', '5.93954', '2429:0 '),\n('2431', 'hellfire060', '530', '3483', '3483', '60', '63', '0', '-1036.95', '4000.75', '83.0333', '2.90005', '2426:0 2427:0 2432:0 '),\n('2432', 'hellfire061', '530', '3483', '3483', '60', '63', '0', '-891.162', '4017.27', '84.496', '3.16788', '2431:0 2433:0 '),\n('2433', 'hellfire062', '530', '3483', '3543', '60', '63', '0', '-799.397', '3955.75', '91.0415', '2.42568', '2432:0 2434:0 '),\n('2434', 'hellfire063', '530', '3483', '3483', '60', '63', '0', '-766.496', '3789.21', '113.362', '1.77223', '2433:0 '),\n('2435', 'hellfire064', '530', '3483', '3483', '60', '63', '0', '-593.759', '4335.47', '52.0515', '4.60437', '2428:0 2425:0 2436:0 '),\n('2436', 'hellfire065', '530', '3483', '3483', '60', '63', '0', '-336.014', '4367.15', '59.658', '3.93679', '2435:0 2437:0 2463:0 '),\n('2437', 'hellfire066', '530', '3483', '3483', '60', '63', '0', '-202.4', '4447.51', '42.6762', '3.81506', '2436:0 2438:0 2460:0 2463:0 '),\n('2438', 'hellfire067', '530', '3483', '3483', '60', '63', '0', '-100.749', '4241.25', '83.9687', '2.24269', '2437:0 2439:0 2441:0 2443:0 2459:0 '),\n('2439', 'hellfire068', '530', '3483', '3552', '60', '63', '2', '63.0268', '4335.15', '96.8814', '6.21365', '2438:0 2440:0 2441:0 '),\n('2440', 'hellfire069', '530', '3483', '3552', '60', '63', '3', '215.545', '4332.38', '119.241', '2.95661', '2439:0 '),\n('2441', 'hellfire070', '530', '3483', '3483', '60', '63', '0', '39.4389', '4153.06', '71.524', '1.85939', '2438:0 2439:0 2442:0 2443:0 2459:0 '),\n('2442', 'hellfire071', '530', '3483', '3483', '60', '63', '0', '150.282', '3945.51', '79.661', '2.2835', '2441:0 2443:0 2469:0 '),\n('2443', 'hellfire072', '530', '3483', '3483', '60', '63', '0', '-96.2588', '3960.84', '99.7364', '0.521852', '2438:0 2442:0 2441:0 2444:0 2459:0 '),\n('2444', 'hellfire073', '530', '3483', '3669', '60', '63', '0', '-120.509', '3779.67', '72.1233', '1.75885', '2443:0 2445:0 '),\n('2445', 'hellfire074', '530', '3483', '3553', '60', '63', '0', '-61.6848', '3514.21', '73.5858', '5.1667', '2444:0 2446:0 2448:0 2452:0 '),\n('2446', 'hellfire075', '530', '3483', '3553', '60', '63', '0', '318.42', '3476.5', '61.5198', '2.95581', '2445:0 2447:0 '),\n('2447', 'hellfire076', '530', '3483', '3553', '60', '63', '0', '383.974', '3310.89', '74.522', '1.91516', '2446:0 '),\n('2448', 'hellfire077', '530', '3483', '3483', '60', '63', '0', '-44.2798', '3288.99', '27.2629', '1.47534', '2445:0 2449:0 2452:0 '),\n('2449', 'hellfire078', '530', '3483', '3483', '60', '63', '0', '-43.1353', '3087.28', '-1.55873', '1.59942', '2448:0 2450:0 '),\n('2450', 'hellfire079', '530', '3483', '3483', '60', '63', '0', '312.814', '2983.21', '19.5651', '2.81914', '2399:0 2449:0 2451:0 '),\n('2451', 'hellfire080', '530', '3483', '3799', '60', '63', '0', '459.167', '3040.66', '17.0606', '3.687', '2450:0 '),\n('2452', 'hellfire081', '530', '3483', '3670', '60', '63', '0', '-182.907', '3456.14', '39.4587', '0.671851', '2445:0 2448:0 '),\n('2453', 'hellfire082', '530', '3483', '3671', '60', '63', '0', '-567.836', '3269.14', '15.2208', '4.86979', '2395:0 2454:0 '),\n('2454', 'hellfire083', '530', '3483', '3671', '60', '63', '0', '-549.666', '3476.52', '45.226', '4.64597', '2453:0 2455:0 2456:0 '),\n('2455', 'hellfire084', '530', '3483', '3671', '60', '63', '0', '-445.867', '3462.18', '37.6671', '2.82071', '2454:0 '),\n('2456', 'hellfire085', '530', '3483', '3669', '60', '63', '0', '-452.212', '3658.72', '45.9024', '0.816375', '2454:0 2457:0 '),\n('2457', 'hellfire086', '530', '3483', '3483', '60', '63', '0', '-378.049', '3871.34', '62.3491', '4.48419', '2456:0 2458:0 '),\n('2458', 'hellfire087', '530', '3483', '3669', '60', '63', '0', '-294.007', '3742.96', '51.9568', '2.11386', '2457:0 2459:0 '),\n('2459', 'hellfire088', '530', '3483', '3483', '60', '63', '0', '-203.95', '4100.77', '98.2207', '5.35677', '2438:0 2441:0 2443:0 2458:0 '),\n('2460', 'hellfire089', '530', '3483', '3483', '60', '63', '1', '-249.051', '4768.73', '14.6773', '1.56722', '2437:0 2461:0 2462:0 2463:0 2466:0 2467:0 '),\n('2461', 'hellfire090', '530', '3483', '3797', '60', '63', '0', '13.8026', '4691.45', '41.6534', '6.21284', '2460:0 2467:0 '),\n('2462', 'hellfire091', '530', '3483', '3551', '60', '63', '0', '-556.09', '4800.17', '34.169', '3.11602', '2460:0 2463:0 2466:0 '),\n('2463', 'hellfire092', '530', '3483', '3483', '60', '63', '0', '-412.14', '4578.53', '39.0585', '2.37774', '2460:0 2436:0 2437:0 2462:0 2466:0 '),\n('2464', 'hellfire093', '530', '3483', '3800', '60', '63', '0', '-259.551', '5042.36', '65.21', '1.36455', '2465:0 2471:0 '),\n('2465', 'hellfire094', '530', '3483', '3795', '60', '63', '0', '-403.556', '4975.22', '40.4154', '0.508468', '2464:0 2466:0 '),\n('2466', 'hellfire095', '530', '3483', '3795', '60', '63', '0', '-417.252', '4788.73', '19.9639', '2.94399', '2463:0 2460:0 2462:0 2465:0 '),\n('2467', 'hellfire096', '530', '3483', '3797', '60', '63', '0', '-68.76', '4846.8', '50.753', '4.86823', '2460:0 2461:0 2468:0 '),\n('2468', 'hellfire097', '530', '3483', '3797', '60', '63', '0', '173.831', '4854.22', '77.6594', '3.44272', '2467:0 '),\n('2469', 'hellfire098', '530', '3483', '3483', '60', '63', '0', '335.776', '4014.33', '100.063', '3.83622', '2442:0 2470:0 '),\n('2470', 'hellfire099', '530', '3483', '3483', '60', '63', '0', '353.816', '3871.24', '144.979', '1.47611', '2469:0 '),\n('2471', 'hellfire100', '530', '3483', '3800', '60', '63', '0', '-234.311', '5165.64', '83.9852', '4.49598', '2464:0 2472:0 '),\n('2472', 'zangar101', '530', '3521', '3521', '61', '64', '0', '-271.021', '5303.67', '41.8812', '4.77871', '2471:0 2473:0 '),\n('2473', 'zangar102', '530', '3521', '3565', '61', '64', '1', '-220.592', '5436.56', '21.669', '5.30379', '2472:0 2474:0 2475:0 '),\n('2474', 'zangar103', '530', '3521', '3521', '61', '64', '0', '-84.4992', '5395.31', '22.3401', '3.21027', '2473:0 2613:0 '),\n('2475', 'zangar104', '530', '3521', '3521', '61', '64', '0', '-395.049', '5385.52', '18.5881', '6.06676', '2473:0 2476:0 '),\n('2476', 'zangar105', '530', '3521', '3521', '61', '64', '0', '-535.462', '5435.61', '20.9825', '5.81938', '2475:0 2477:0 '),\n('2477', 'zangar106', '530', '3521', '3521', '61', '64', '0', '-672.658', '5367.99', '22.9724', '0.237551', '2476:0 2478:0 '),\n('2478', 'zangar107', '530', '3521', '3641', '61', '64', '0', '-758.891', '5282.57', '17.6121', '1.72588', '2477:0 2479:0 '),\n('2479', 'zangar108', '530', '3521', '3641', '61', '64', '0', '-813.122', '5198.88', '19.1746', '1.05202', '2478:0 2480:0 '),\n('2480', 'zangar109', '530', '3521', '3641', '61', '64', '0', '-976.189', '5260.97', '19.0927', '6.05108', '2479:0 2481:0 2626:0 '),\n('2481', 'zangar110', '530', '3521', '3521', '61', '64', '0', '-934.208', '5419.78', '22.8095', '4.46851', '2480:0 2482:0 2626:0 '),\n('2482', 'zangar111', '530', '3521', '3521', '61', '64', '0', '-966.5', '5606.91', '22.0137', '4.97508', '2481:0 2483:0 '),\n('2483', 'zangar112', '530', '3521', '3521', '61', '64', '0', '-912.293', '5682.09', '21.6937', '5.08504', '2482:0 2484:0 '),\n('2484', 'zangar113', '530', '3521', '3521', '61', '64', '0', '-913.195', '5896.44', '20.1725', '4.59652', '2483:0 2485:0 2488:0 '),\n('2485', 'zangar114', '530', '3521', '3521', '61', '64', '0', '-909.682', '6045.49', '19.7314', '4.59651', '2484:0 2486:0 2488:0 2489:0 '),\n('2486', 'zangar115', '530', '3521', '3521', '61', '64', '0', '-1037.12', '6091.11', '19.5931', '5.89242', '2485:0 2487:0 '),\n('2487', 'zangar116', '530', '3521', '3521', '61', '64', '0', '-1163.58', '6201.43', '53.0219', '5.61282', '2486:0 2625:0 '),\n('2488', 'zangar117', '530', '3521', '3841', '61', '64', '0', '-796.58', '5918.23', '22.3409', '2.31415', '2484:0 2485:0 2489:0 '),\n('2489', 'zangar118', '530', '3521', '3521', '61', '64', '0', '-701.347', '6013.97', '22.3146', '3.22521', '2488:0 2485:0 2490:0 2491:0 '),\n('2490', 'zangar119', '530', '3521', '3841', '61', '64', '0', '-592.408', '5933.75', '20.813', '5.51464', '2489:0 2491:0 '),\n('2491', 'zangar120', '530', '3521', '3521', '61', '64', '0', '-504.59', '6048.64', '23.1686', '4.20775', '2490:0 2489:0 2492:0 '),\n('2492', 'zangar121', '530', '3521', '3841', '61', '64', '0', '-495.325', '5854.59', '20.3458', '2.52376', '2491:0 2493:0 '),\n('2493', 'zangar122', '530', '3521', '3521', '61', '64', '0', '-318.55', '6013.33', '23.3657', '3.50315', '2492:0 2494:0 2608:0 '),\n('2494', 'zangar123', '530', '3521', '3819', '61', '64', '0', '-352.699', '6158.62', '21.7844', '4.91293', '2493:0 2495:0 2608:0 '),\n('2495', 'zangar124', '530', '3521', '3819', '61', '64', '0', '-338.739', '6298.09', '21.04', '4.63411', '2494:0 2496:0 '),\n('2496', 'zangar125', '530', '3521', '3819', '61', '64', '0', '-409.277', '6401.64', '21.9404', '0.801373', '2495:0 2497:0 2500:0 '),\n('2497', 'zangar126', '530', '3521', '3819', '61', '64', '0', '-230.832', '6354.36', '21.7058', '3.81024', '2496:0 2498:0 '),\n('2498', 'zangar127', '530', '3521', '3659', '61', '64', '0', '-139.857', '6456.59', '20.0973', '3.85658', '2497:0 2499:0 2607:0 '),\n('2499', 'zangar128', '530', '3521', '3659', '61', '64', '0', '-269.671', '6613.48', '23.0533', '4.34353', '2498:0 2500:0 '),\n('2500', 'zangar129', '530', '3521', '3659', '61', '64', '0', '-383.175', '6598.68', '22.9642', '4.52024', '2496:0 2499:0 2501:0 '),\n('2501', 'zangar130', '530', '3521', '3659', '61', '64', '0', '-215.725', '6703.55', '20.6145', '4.19588', '2500:0 2502:0 2503:0 '),\n('2502', 'zangar131', '530', '3521', '3659', '61', '64', '0', '-63.9463', '6759.2', '20.4434', '3.22986', '2501:0 2503:0 2509:0 '),\n('2503', 'zangar132', '530', '3521', '3659', '61', '64', '0', '-261.475', '6823.98', '21.6241', '5.85702', '2501:0 2502:0 2504:0 '),\n('2504', 'zangar133', '530', '3521', '3642', '61', '64', '0', '-208.234', '6950.07', '20.1839', '0.893301', '2503:0 2505:0 '),\n('2505', 'zangar134', '530', '3521', '3642', '61', '64', '0', '-126.36', '7041.34', '18.9083', '3.86997', '2504:0 2506:0 '),\n('2506', 'zangar135', '530', '3521', '3642', '61', '64', '0', '-50.056', '7132.44', '19.2134', '4.60817', '2505:0 2507:0 '),\n('2507', 'zangar136', '530', '3521', '3521', '61', '64', '0', '64.7648', '7212.88', '22.0782', '0.46519', '2506:0 2508:0 2516:0 2517:0 2528:0 '),\n('2508', 'zangar137', '530', '3521', '3521', '61', '64', '0', '44.854', '7014.88', '23.4767', '1.78543', '2507:0 2509:0 '),\n('2509', 'zangar138', '530', '3521', '3521', '61', '64', '0', '43.5835', '6871.99', '22.3894', '4.7567', '2508:0 2502:0 2510:0 2511:0 '),\n('2510', 'zangar139', '530', '3521', '3521', '61', '64', '0', '157.048', '6719.99', '20.4444', '2.3259', '2509:0 2511:0 2595:0 '),\n('2511', 'zangar140', '530', '3521', '3720', '61', '64', '0', '223.784', '6824.17', '25.6438', '3.74197', '2509:0 2510:0 2512:0 2595:0 '),\n('2512', 'zangar141', '530', '3521', '3720', '61', '64', '0', '234.681', '6926.14', '23.7418', '4.49203', '2511:0 2513:0 '),\n('2513', 'zangar142', '530', '3521', '3720', '61', '64', '0', '212.404', '7079.58', '35.2277', '4.69231', '2512:0 2514:0 '),\n('2514', 'zangar143', '530', '3521', '3720', '61', '64', '0', '220.362', '7208.94', '25.1738', '4.71196', '2513:0 2515:0 '),\n('2515', 'zangar144', '530', '3521', '3720', '61', '64', '0', '336.506', '7340.86', '41.5461', '4.13471', '2514:0 2516:0 2587:0 '),\n('2516', 'zangar145', '530', '3521', '3720', '61', '64', '0', '157.889', '7365.75', '22.1067', '6.02358', '2507:0 2515:0 2517:0 '),\n('2517', 'zangar146', '530', '3521', '3521', '61', '64', '0', '63.1597', '7443.51', '22.1993', '5.2932', '2507:0 2516:0 2518:0 2528:0 '),\n('2518', 'zangar147', '530', '3521', '3521', '61', '64', '0', '115.528', '7547.02', '21.6598', '4.53135', '2517:0 2519:0 2523:0 '),\n('2519', 'zangar148', '530', '3521', '3521', '61', '64', '0', '118.141', '7658.13', '21.5634', '4.72141', '2518:0 2520:0 2523:0 2529:0 2587:0 '),\n('2520', 'zangar149', '530', '3521', '3521', '61', '64', '4', '246.937', '7753.08', '23.1428', '3.93445', '2519:0 2521:0 2523:0 2529:0 2587:0 '),\n('2521', 'zangar150', '530', '3521', '3645', '61', '64', '5', '264.306', '7863.47', '23.7956', '4.64131', '2520:0 2522:0 2523:0 2529:0 '),\n('2522', 'zangar151', '530', '3521', '3521', '61', '64', '4', '449.39', '7844.62', '22.0319', '3.04694', '2521:0 2569:0 '),\n('2523', 'zangar152', '530', '3521', '3521', '61', '64', '0', '81.5617', '7740.29', '21.6356', '3.14119', '2518:0 2519:0 2520:0 2521:0 2524:0 2529:0 '),\n('2524', 'zangar153', '530', '3521', '3521', '61', '64', '0', '-28.0868', '7736.24', '20.5893', '6.25922', '2523:0 2525:0 2529:0 2536:0 '),\n('2525', 'zangar154', '530', '3521', '3521', '61', '64', '0', '-170.551', '7601.35', '23.3202', '0.757515', '2524:0 2526:0 2535:0 '),\n('2526', 'zangar155', '530', '3521', '3521', '61', '64', '0', '-174.825', '7443.51', '21.9702', '1.57433', '2525:0 2527:0 2528:0 '),\n('2527', 'zangar156', '530', '3521', '3642', '61', '64', '0', '-120.981', '7305.7', '23.422', '1.77461', '2526:0 2528:0 '),\n('2528', 'zangar157', '530', '3521', '3521', '61', '64', '0', '-20.2426', '7327.37', '23.7348', '2.19481', '2527:0 2526:0 2517:0 2507:0 '),\n('2529', 'zangar158', '530', '3521', '3521', '61', '64', '0', '84.0333', '7841.91', '22.0373', '4.55886', '2519:0 2520:0 2521:0 2523:0 2524:0 2530:0 '),\n('2530', 'zangar159', '530', '3521', '3521', '61', '64', '0', '65.13', '7971.37', '21.6779', '4.89266', '2529:0 2531:0 '),\n('2531', 'zangar160', '530', '3521', '3521', '61', '64', '0', '43.5829', '8117.3', '22.3841', '4.94372', '2530:0 2532:0 2552:0 '),\n('2532', 'zangar161', '530', '3521', '3521', '61', '64', '0', '-49.1017', '8195.83', '23.1999', '5.71343', '2531:0 2533:0 2537:0 2541:0 '),\n('2533', 'zangar162', '530', '3521', '3646', '61', '64', '0', '-209.87', '8126.35', '19.9595', '0.261968', '2532:0 2534:0 2536:0 2537:0 '),\n('2534', 'zangar163', '530', '3521', '3646', '61', '64', '0', '-261.772', '7885.5', '18.5845', '1.41258', '2533:0 2535:0 2536:0 '),\n('2535', 'zangar164', '530', '3521', '3521', '61', '64', '0', '-259.719', '7720.02', '20.8878', '1.65605', '2525:0 2534:0 '),\n('2536', 'zangar165', '530', '3521', '3646', '61', '64', '0', '-98.2706', '7905.01', '21.2267', '4.92567', '2524:0 2533:0 2534:0 '),\n('2537', 'zangar166', '530', '3521', '3521', '61', '64', '0', '-180.804', '8271.58', '22.3452', '2.13749', '2532:0 2533:0 2538:0 2541:0 '),\n('2538', 'zangar167', '530', '3521', '3521', '61', '64', '0', '-280.916', '8401.01', '22.613', '5.34193', '2537:0 2539:0 '),\n('2539', 'zangar168', '530', '3521', '3521', '61', '64', '0', '-414.115', '8416.71', '22.9544', '6.2098', '2538:0 2540:0 2903:0 '),\n('2540', 'zangar169', '530', '3521', '3521', '61', '64', '0', '-208.705', '8507.09', '22.1101', '4.05625', '2539:0 2541:0 '),\n('2541', 'zangar170', '530', '3521', '3521', '61', '64', '0', '-76.6423', '8339.54', '20.5708', '1.28772', '2537:0 2532:0 2540:0 2542:0 '),\n('2542', 'zangar171', '530', '3521', '3521', '61', '64', '0', '2.14825', '8447.62', '24.0799', '1.18326', '2541:0 2543:0 2550:0 '),\n('2543', 'zangar172', '530', '3521', '3647', '61', '64', '0', '-67.5414', '8574.38', '21.4033', '5.22493', '2542:0 2544:0 2550:0 '),\n('2544', 'zangar173', '530', '3521', '3647', '61', '64', '0', '-131.783', '8711.6', '20.1378', '5.16367', '2543:0 2545:0 '),\n('2545', 'zangar174', '530', '3521', '3647', '61', '64', '0', '-58.2395', '8845.13', '19.6236', '4.45683', '2544:0 2546:0 '),\n('2546', 'zangar175', '530', '3521', '3647', '61', '64', '0', '-158.14', '8998.32', '22.6743', '5.39853', '2545:0 2547:0 '),\n('2547', 'zangar176', '530', '3521', '3521', '61', '64', '0', '49.2289', '8919.95', '22.8353', '4.08298', '2546:0 2548:0 2566:0 '),\n('2548', 'zangar177', '530', '3521', '3658', '61', '64', '0', '191.332', '8791.02', '22.5064', '3.15621', '2547:0 2549:0 '),\n('2549', 'zangar178', '530', '3521', '3658', '61', '64', '0', '100.838', '8633.77', '22.3518', '1.01992', '2548:0 2550:0 '),\n('2550', 'zangar179', '530', '3521', '3521', '61', '64', '0', '46.3545', '8528.92', '21.3211', '3.67772', '2542:0 2543:0 2549:0 2551:0 '),\n('2551', 'zangar180', '530', '3521', '3521', '61', '64', '1', '201.143', '8506.92', '24.4625', '4.24664', '2550:0 2552:0 '),\n('2552', 'zangar181', '530', '3521', '3656', '61', '64', '0', '176.313', '8271.1', '19.3723', '2.275', '2531:0 2551:0 2553:0 '),\n('2553', 'zangar182', '530', '3521', '3656', '61', '64', '0', '285.943', '8219.3', '20.2926', '3.15229', '2552:0 2554:0 '),\n('2554', 'zangar183', '530', '3521', '3656', '61', '64', '0', '386.339', '8346.33', '22.789', '4.31625', '2553:0 2555:0 '),\n('2555', 'zangar184', '530', '3521', '3656', '61', '64', '0', '494.267', '8437.25', '21.4802', '4.07671', '2554:0 2556:0 2563:0 2567:0 '),\n('2556', 'zangar185', '530', '3521', '3656', '61', '64', '0', '608.933', '8508.26', '22.3504', '3.55914', '2555:0 2557:0 2563:0 '),\n('2557', 'zangar186', '530', '3521', '3521', '61', '64', '0', '742.61', '8532.55', '22.4318', '3.26227', '2556:0 2558:0 2562:0 2563:0 '),\n('2558', 'zangar187', '530', '3521', '3521', '61', '64', '0', '895.923', '8416.01', '24.0337', '2.57898', '2557:0 2559:0 '),\n('2559', 'zangar188', '530', '3521', '3650', '61', '64', '0', '1075.84', '8407.67', '22.4904', '3.12875', '2558:0 2560:0 2561:0 2574:0 '),\n('2560', 'zangar189', '530', '3521', '3650', '61', '64', '0', '1227.41', '8505.09', '22.644', '3.70367', '2559:0 2561:0 2575:0 '),\n('2561', 'zangar190', '530', '3521', '3650', '61', '64', '0', '1037.11', '8556.71', '23.1526', '5.52971', '2559:0 2560:0 2562:0 '),\n('2562', 'zangar191', '530', '3521', '3521', '61', '64', '0', '838.679', '8631.92', '21.121', '3.9', '2561:0 2557:0 '),\n('2563', 'zangar192', '530', '3521', '3657', '61', '64', '0', '532.243', '8648.7', '20.2148', '1.72209', '2555:0 2556:0 2557:0 2564:0 '),\n('2564', 'zangar193', '530', '3521', '3521', '61', '64', '0', '500.585', '8831.78', '29.9762', '3.31252', '2563:0 2565:0 '),\n('2565', 'zangar194', '530', '3521', '3521', '61', '64', '0', '312.939', '8988.81', '29.3602', '2.17448', '2564:0 2566:0 '),\n('2566', 'zangar195', '530', '3521', '3521', '61', '64', '0', '153.844', '9001.52', '20.6373', '4.20787', '2547:0 2565:0 '),\n('2567', 'zangar196', '530', '3521', '3643', '61', '64', '0', '634.189', '8249.73', '20.9802', '4.23537', '2555:0 2568:0 '),\n('2568', 'zangar197', '530', '3521', '3643', '61', '64', '0', '610.771', '8068.12', '19.5665', '1.60114', '2567:0 2569:0 2571:0 '),\n('2569', 'zangar198', '530', '3521', '3667', '61', '64', '0', '579.736', '7860.06', '21.923', '1.46997', '2522:0 2568:0 2570:0 '),\n('2570', 'zangar199', '530', '3521', '3667', '61', '64', '0', '737.751', '7895.31', '21.9665', '6.19807', '2569:0 2571:0 '),\n('2571', 'zangar200', '530', '3521', '3521', '61', '64', '0', '787.048', '8075.83', '19.8301', '1.19115', '2568:0 2570:0 2572:0 '),\n('2572', 'zangar201', '530', '3521', '3667', '61', '64', '0', '940.179', '8075.93', '22.3322', '3.07219', '2571:0 2573:0 2579:0 '),\n('2573', 'zangar202', '530', '3521', '3667', '61', '64', '0', '1079.94', '8078.99', '22.0839', '3.44134', '2572:0 2574:0 2578:0 '),\n('2574', 'zangar203', '530', '3521', '3640', '61', '64', '0', '1142.01', '8208.94', '18.3815', '1.68911', '2559:0 2573:0 2578:0 '),\n('2575', 'zangar204', '530', '3521', '3650', '61', '64', '0', '1365.27', '8597.28', '20.4376', '3.62905', '2560:0 2576:0 '),\n('2576', 'zangar205', '530', '3521', '3650', '61', '64', '0', '1473.46', '8617.75', '-19.2604', '3.20336', '2575:0 2577:0 '),\n('2577', 'zangar206', '530', '3521', '3651', '61', '64', '0', '1617.83', '8604.6', '-25.7602', '3.11932', '2576:0 '),\n('2578', 'zangar207', '530', '3521', '3521', '61', '64', '0', '1204.46', '7994.66', '23.5559', '2.79496', '2573:0 2574:0 2579:0 '),\n('2579', 'zangar208', '530', '3521', '3667', '61', '64', '0', '985.581', '7906.61', '21.9749', '1.94279', '2572:0 2578:0 2580:0 '),\n('2580', 'zangar209', '530', '3521', '3667', '61', '64', '0', '924.71', '7759.51', '22.2632', '4.47963', '2579:0 2581:0 '),\n('2581', 'zangar210', '530', '3521', '3667', '61', '64', '0', '972.886', '7540.98', '20.6745', '5.06474', '2580:0 2582:0 '),\n('2582', 'zangar211', '530', '3521', '3766', '61', '64', '3', '1008.04', '7381.67', '36.2454', '2.67557', '2581:0 2583:0 3077:0 '),\n('2583', 'zangar212', '530', '3521', '3521', '61', '64', '2', '888.478', '7369.16', '20.9021', '3.3785', '2582:0 2584:0 2588:0 '),\n('2584', 'zangar213', '530', '3521', '3521', '61', '64', '0', '749.898', '7401.62', '22.0246', '0.295815', '2583:0 2585:0 2588:0 '),\n('2585', 'zangar214', '530', '3521', '3653', '61', '64', '0', '578.096', '7540.84', '19.4559', '5.3043', '2584:0 2586:0 '),\n('2586', 'zangar215', '530', '3521', '3653', '61', '64', '0', '453.399', '7459.1', '23.6644', '2.9591', '2585:0 2587:0 '),\n('2587', 'zangar216', '530', '3521', '3521', '61', '64', '0', '301.56', '7502.53', '18.7007', '4.88489', '2515:0 2586:0 2520:0 2519:0 '),\n('2588', 'zangar217', '530', '3521', '3653', '61', '64', '0', '723.766', '7219.4', '18.4476', '1.52104', '2583:0 2584:0 2589:0 '),\n('2589', 'zangar218', '530', '3521', '3653', '61', '64', '0', '828.704', '7046.99', '21.9746', '5.47316', '2588:0 2590:0 '),\n('2590', 'zangar219', '530', '3521', '3521', '61', '64', '0', '813.291', '6859.8', '21.1175', '4.5346', '2589:0 2591:0 '),\n('2591', 'zangar220', '530', '3521', '3521', '61', '64', '0', '786.813', '6686.79', '19.6235', '4.77415', '2590:0 2592:0 '),\n('2592', 'zangar221', '530', '3521', '3521', '61', '64', '0', '739.145', '6548.18', '21.4284', '2.68185', '2591:0 2593:0 2600:0 '),\n('2593', 'zangar222', '530', '3521', '3653', '61', '64', '0', '533.697', '6616.1', '23.4617', '5.98523', '2592:0 2594:0 2600:0 '),\n('2594', 'zangar223', '530', '3521', '3521', '61', '64', '0', '392.669', '6497.59', '21.0234', '1.88546', '2593:0 2595:0 2596:0 2600:0 '),\n('2595', 'zangar224', '530', '3521', '3521', '61', '64', '0', '309.995', '6655.73', '21.2137', '5.01134', '2510:0 2594:0 2511:0 '),\n('2596', 'zangar225', '530', '3521', '3521', '61', '64', '0', '377.938', '6282.83', '22.023', '4.47492', '2594:0 2597:0 '),\n('2597', 'zangar226', '530', '3521', '3521', '61', '64', '0', '413.817', '6144.54', '22.2423', '1.89569', '2596:0 2598:0 2603:0 '),\n('2598', 'zangar227', '530', '3521', '3521', '61', '64', '0', '588.059', '6075.05', '22.5742', '2.63553', '2597:0 2599:0 2601:0 2624:0 '),\n('2599', 'zangar228', '530', '3521', '3818', '61', '64', '0', '603.408', '6285.69', '21.8038', '4.64065', '2598:0 2600:0 2601:0 '),\n('2600', 'zangar229', '530', '3521', '3653', '61', '64', '0', '621.81', '6442.18', '20.5988', '2.00643', '2592:0 2593:0 2594:0 2599:0 '),\n('2601', 'zangar230', '530', '3521', '3521', '61', '64', '0', '691.526', '6136.65', '24.626', '4.02491', '2598:0 2599:0 2602:0 2972:0 '),\n('2602', 'zangar231', '530', '3521', '3521', '61', '64', '0', '718.677', '6010.01', '23.0266', '4.85273', '2601:0 2624:0 2972:0 '),\n('2603', 'zangar232', '530', '3521', '3644', '61', '64', '3', '284.699', '5949', '26.4296', '1.71192', '2597:0 2604:0 2611:0 '),\n('2604', 'zangar233', '530', '3521', '3521', '61', '64', '2', '171.4', '6095.69', '21.4396', '5.75672', '2603:0 2605:0 2608:0 2611:0 '),\n('2605', 'zangar234', '530', '3521', '3521', '61', '64', '0', '220.592', '6179.94', '22.7879', '2.4926', '2604:0 2606:0 '),\n('2606', 'zangar235', '530', '3521', '3521', '61', '64', '0', '109.112', '6307.6', '20.5752', '2.47375', '2605:0 2607:0 2608:0 '),\n('2607', 'zangar236', '530', '3521', '3659', '61', '64', '0', '-2.05183', '6372.4', '21.196', '6.01275', '2498:0 2606:0 '),\n('2608', 'zangar237', '530', '3521', '3521', '61', '64', '0', '-101.637', '6148.49', '20.9712', '3.74609', '2493:0 2494:0 2606:0 2604:0 2609:0 '),\n('2609', 'zangar238', '530', '3521', '3521', '61', '64', '0', '-95.8529', '5919.89', '21.912', '1.45665', '2608:0 2610:0 '),\n('2610', 'zangar239', '530', '3521', '3521', '61', '64', '0', '13.2803', '5837.85', '22.8222', '2.53657', '2609:0 2611:0 '),\n('2611', 'zangar240', '530', '3521', '3521', '61', '64', '0', '151.585', '5801.02', '22.4062', '1.73938', '2603:0 2604:0 2610:0 2612:0 '),\n('2612', 'zangar241', '530', '3521', '3521', '61', '64', '0', '12.867', '5638.72', '21.5024', '0.850312', '2611:0 2613:0 '),\n('2613', 'zangar242', '530', '3521', '3521', '61', '64', '0', '48.9274', '5481.91', '21.872', '2.08181', '2474:0 2612:0 2614:0 2616:0 '),\n('2614', 'zangar243', '530', '3521', '3521', '61', '64', '4', '71.9609', '5332.54', '21.9147', '5.20377', '2613:0 2615:0 2616:0 '),\n('2615', 'zangar244', '530', '3521', '3718', '61', '64', '5', '85.2911', '5223.84', '22.6669', '1.80693', '2614:0 '),\n('2616', 'zangar245', '530', '3521', '3648', '61', '64', '0', '158.923', '5429.39', '21.7352', '4.09636', '2614:0 2613:0 2617:0 '),\n('2617', 'zangar246', '530', '3521', '3648', '61', '64', '0', '315.219', '5408.5', '20.9134', '6.16588', '2616:0 2618:0 2619:0 '),\n('2618', 'zangar247', '530', '3521', '3648', '61', '64', '0', '377.232', '5291.67', '16.6948', '0.491381', '2617:0 2619:0 '),\n('2619', 'zangar248', '530', '3521', '3648', '61', '64', '0', '610.457', '5425.64', '-14.6579', '4.20083', '2617:0 2618:0 2620:0 2621:0 2622:0 '),\n('2620', 'zangar249', '530', '3521', '3648', '61', '64', '0', '820.719', '5482.54', '9.38793', '3.43975', '2619:0 2621:0 '),\n('2621', 'zangar250', '530', '3521', '3648', '61', '64', '0', '675.579', '5207.73', '-0.430108', '1.71187', '2619:0 2620:0 '),\n('2622', 'zangar251', '530', '3521', '3648', '61', '64', '0', '581.932', '5617.72', '21.5502', '1.58306', '2619:0 2623:0 '),\n('2623', 'zangar252', '530', '3521', '3521', '61', '64', '0', '549.492', '5772.45', '23.2954', '1.1668', '2622:0 2624:0 '),\n('2624', 'zangar253', '530', '3521', '3521', '61', '64', '0', '569.447', '5936.2', '20.4341', '1.13146', '2623:0 2602:0 2598:0 2972:0 '),\n('2625', 'nagrand254', '530', '3521', '3521', '61', '64', '0', '-1293.68', '6268.96', '47.863', '5.30897', '2487:0 2927:0 '),\n('2626', 'zangar255', '530', '3521', '3521', '61', '64', '0', '-1072.75', '5374.44', '23.0643', '3.2316', '2480:0 2481:0 2627:0 '),\n('2627', 'tero256', '530', '3519', '3519', '61', '64', '0', '-1193.26', '5326.41', '32.1568', '3.76253', '2626:0 2628:0 '),\n('2628', 'tero257', '530', '3519', '3519', '61', '64', '0', '-1352.86', '5166.19', '60.3214', '0.730896', '2627:0 2629:0 '),\n('2629', 'tero258', '530', '3519', '3519', '61', '64', '0', '-1481.09', '5196.68', '44.2804', '2.26164', '2628:0 2630:0 '),\n('2630', 'tero259', '530', '3703', '3703', '61', '64', '0', '-1562.26', '5219.05', '26.8104', '5.79513', '2629:0 2631:0 '),\n('2631', 'tero260', '530', '3703', '3703', '61', '64', '0', '-1646.24', '5089.63', '9.06231', '3.96908', '2630:0 2632:0 2633:0 '),\n('2632', 'tero261', '530', '3519', '3519', '62', '65', '0', '-1504.23', '5007.75', '-5.38562', '2.6182', '2631:0 '),\n('2633', 'tero262', '530', '3703', '3703', '62', '65', '0', '-1767.61', '5061.37', '7.70519', '3.4303', '2631:0 2634:0 '),\n('2634', 'tero263', '530', '3703', '3703', '62', '65', '0', '-1923.14', '5054.44', '19.4908', '2.72737', '2633:0 2635:0 2636:0 2741:0 '),\n('2635', 'tero264', '530', '3519', '3519', '62', '65', '0', '-1970.49', '4974.82', '28.2638', '4.09397', '2634:0 2724:0 2741:0 '),\n('2636', 'tero265', '530', '3703', '3703', '62', '65', '0', '-2043.23', '5134.06', '8.27497', '5.68597', '2634:0 2637:0 2741:0 '),\n('2637', 'tero266', '530', '3519', '3519', '62', '65', '0', '-2181.58', '5096.17', '-21.1362', '0.23923', '2636:0 2638:0 2639:0 2640:0 2741:0 '),\n('2638', 'tero267', '530', '3519', '3519', '62', '65', '0', '-2216.99', '4909.63', '1.39859', '1.40554', '2637:0 2741:0 '),\n('2639', 'tero268', '530', '3519', '3519', '62', '65', '0', '-2303.98', '5268.43', '-9.97572', '5.28148', '2637:0 2640:0 2641:0 2644:0 '),\n('2640', 'tero269', '530', '3519', '3682', '62', '65', '0', '-2344.61', '5051.57', '-2.04758', '0.266708', '2639:0 2637:0 2644:0 '),\n('2641', 'tero270', '530', '3519', '3677', '62', '65', '0', '-2431.44', '5399.92', '1.64547', '5.51947', '2639:0 2642:0 '),\n('2642', 'tero271', '530', '3519', '3519', '62', '65', '0', '-2521.64', '5210.06', '1.76945', '1.04896', '2641:0 2643:0 2645:0 '),\n('2643', 'tero272', '530', '3519', '3682', '62', '65', '0', '-2502.78', '5113.56', '7.96009', '6.26007', '2642:0 2644:0 2645:0 '),\n('2644', 'tero273', '530', '3519', '3519', '62', '65', '0', '-2359.81', '5159.68', '-3.26821', '3.01403', '2643:0 2639:0 2640:0 '),\n('2645', 'tero274', '530', '3519', '3519', '62', '65', '0', '-2640.66', '5114.54', '-2.29', '3.12004', '2642:0 2643:0 2646:0 '),\n('2646', 'tero275', '530', '3519', '3887', '62', '65', '1', '-2764.32', '5083.04', '-6.61069', '4.7576', '2645:0 2647:0 2648:0 '),\n('2647', 'tero276', '530', '3519', '3697', '62', '65', '0', '-2753.24', '4900.43', '-9.77721', '1.5139', '2646:0 2648:0 2650:0 '),\n('2648', 'tero277', '530', '3519', '3697', '62', '65', '0', '-2924.05', '5077.7', '-21.4831', '6.27734', '2647:0 2646:0 2649:0 2650:0 '),\n('2649', 'tero278', '530', '3519', '3697', '62', '65', '0', '-2988.38', '5242.11', '-18.2224', '5.09376', '2648:0 2691:0 2693:0 '),\n('2650', 'tero279', '530', '3519', '3697', '62', '65', '0', '-2927.67', '4884.87', '-20.3937', '1.65765', '2647:0 2648:0 2651:0 '),\n('2651', 'tero280', '530', '3519', '3891', '62', '65', '0', '-2833.33', '4763.19', '-3.82034', '2.17758', '2650:0 2652:0 '),\n('2652', 'tero281', '530', '3519', '3891', '62', '65', '0', '-2735.66', '4761.53', '-7.97762', '3.14205', '2651:0 2653:0 '),\n('2653', 'tero282', '530', '3519', '3697', '62', '65', '0', '-2927.04', '4629.03', '-20.1141', '1.04898', '2652:0 2654:0 2655:0 2657:0 '),\n('2654', 'tero283', '530', '3519', '3697', '62', '65', '0', '-2792.58', '4548.65', '-5.17792', '2.36688', '2653:0 '),\n('2655', 'tero284', '530', '3519', '3697', '62', '65', '0', '-3098.66', '4626.88', '-20.2418', '0.186611', '2653:0 2656:0 2661:0 '),\n('2656', 'tero285', '530', '3519', '3697', '62', '65', '0', '-3111.3', '4451.66', '-21.8624', '1.72364', '2655:0 2657:0 '),\n('2657', 'tero286', '530', '3519', '3697', '62', '65', '0', '-2978.71', '4453.52', '-19.1914', '1.37334', '2656:0 2653:0 2658:0 2716:0 '),\n('2658', 'tero287', '530', '3519', '3697', '62', '65', '0', '-3124.74', '4312.73', '-13.4977', '1.36941', '2657:0 2659:0 2698:0 '),\n('2659', 'tero288', '530', '3519', '3697', '62', '65', '0', '-3343.1', '4318.47', '-21.2101', '0.0703571', '2658:0 2660:0 2662:0 2698:0 '),\n('2660', 'tero289', '530', '3519', '3697', '62', '65', '0', '-3251.81', '4540.47', '-21.009', '4.41204', '2659:0 2661:0 2663:0 '),\n('2661', 'tero290', '530', '3519', '3688', '62', '65', '0', '-3251.45', '4665.87', '-22.0178', '5.15817', '2660:0 2655:0 '),\n('2662', 'tero291', '530', '3519', '3892', '62', '65', '0', '-3461.56', '4373.44', '-11.6911', '5.77627', '2659:0 2663:0 2664:0 '),\n('2663', 'tero292', '530', '3519', '3697', '62', '65', '0', '-3412.64', '4543.05', '-19.8323', '4.37513', '2662:0 2660:0 2664:0 '),\n('2664', 'tero293', '530', '3519', '3697', '62', '65', '0', '-3615.55', '4423.5', '-15.264', '6.23338', '2662:0 2663:0 2665:0 2666:0 '),\n('2665', 'tero294', '530', '3519', '3885', '62', '65', '0', '-3737.19', '4335.92', '3.0303', '0.715952', '2664:0 2666:0 '),\n('2666', 'tero295', '530', '3519', '3697', '62', '65', '0', '-3717.12', '4553.09', '-15.395', '5.41343', '2664:0 2665:0 2667:0 '),\n('2667', 'tero296', '530', '3519', '3886', '62', '65', '0', '-3751.58', '4692.08', '-17.1029', '5.18959', '2666:0 2668:0 2671:0 '),\n('2668', 'tero297', '530', '3519', '3688', '62', '65', '0', '-3628.23', '4736.46', '-22.1214', '3.39967', '2667:0 2669:0 '),\n('2669', 'tero298', '530', '3519', '3688', '62', '65', '0', '-3683.64', '4880.37', '-22.2453', '4.85659', '2668:0 2670:0 '),\n('2670', 'tero299', '530', '3519', '3697', '62', '65', '0', '-3787.46', '5013.52', '-20.1657', '5.31998', '2669:0 2671:0 2672:0 '),\n('2671', 'tero300', '530', '3519', '3697', '62', '65', '0', '-3875.72', '4882.7', '-35.8103', '0.180317', '2670:0 2667:0 '),\n('2672', 'tero301', '530', '3519', '3697', '62', '65', '0', '-3756.44', '5163.25', '-22.4721', '4.73093', '2670:0 2674:0 2673:0 '),\n('2673', 'tero302', '530', '3519', '3697', '62', '65', '1', '-3750.45', '5404.46', '-3.33481', '1.38198', '2672:0 2674:0 2675:0 '),\n('2674', 'tero303', '530', '3519', '3894', '62', '65', '0', '-3634.78', '5300.46', '-21.1377', '3.63217', '2672:0 2675:0 2695:0 2673:0 '),\n('2675', 'tero304', '530', '3519', '3697', '62', '65', '0', '-3670.35', '5445.73', '-4.16488', '5.0239', '2674:0 2676:0 2695:0 2673:0 '),\n('2676', 'tero305', '530', '3519', '3697', '62', '65', '0', '-3645.73', '5559.5', '-2.14497', '4.56524', '2675:0 2677:0 '),\n('2677', 'tero306', '530', '3519', '3686', '62', '65', '0', '-3642.69', '5710.06', '-2.77685', '4.68385', '2676:0 2678:0 2679:0 '),\n('2678', 'tero307', '530', '3519', '3519', '62', '65', '0', '-3501.7', '5745.82', '0.234953', '3.52538', '2677:0 2684:0 '),\n('2679', 'tero308', '530', '3519', '3519', '62', '65', '0', '-3733.98', '5830.74', '-2.74856', '5.14723', '2677:0 2680:0 '),\n('2680', 'tero309', '530', '3519', '3519', '62', '65', '0', '-3787.12', '5986.43', '-1.72887', '4.96659', '2679:0 2681:0 '),\n('2681', 'tero310', '530', '3519', '3519', '62', '65', '0', '-3628.51', '6056.29', '-3.33948', '3.46806', '2680:0 2682:0 '),\n('2682', 'tero311', '530', '3519', '3519', '62', '65', '0', '-3508.49', '6174.6', '4.08676', '3.93145', '2681:0 2683:0 '),\n('2683', 'tero312', '530', '3519', '3519', '62', '65', '0', '-3378.56', '5998.98', '-6.51004', '2.27505', '2682:0 2684:0 2685:0 2696:0 '),\n('2684', 'tero313', '530', '3519', '3519', '62', '65', '0', '-3476.42', '5902.44', '-30.7079', '0.739594', '2683:0 2678:0 2685:0 '),\n('2685', 'tero314', '530', '3519', '3519', '62', '65', '0', '-3285.32', '5879.96', '-19.0985', '2.70702', '2684:0 2683:0 2686:0 2696:0 '),\n('2686', 'tero315', '530', '3519', '3519', '62', '65', '0', '-3364.14', '5789.3', '-1.76223', '1.10479', '2685:0 2687:0 2696:0 '),\n('2687', 'tero316', '530', '3519', '3697', '62', '65', '0', '-3305.33', '5740.49', '0.884062', '4.92025', '2686:0 2688:0 2696:0 '),\n('2688', 'tero317', '530', '3519', '3697', '62', '65', '0', '-3286.23', '5602.34', '-6.97428', '4.90454', '2687:0 2689:0 '),\n('2689', 'tero318', '530', '3519', '3697', '62', '65', '0', '-3117.93', '5582.45', '-7.6733', '6.23185', '2688:0 2690:0 2693:0 '),\n('2690', 'tero319', '530', '3519', '3697', '62', '65', '0', '-2973.64', '5517.8', '-7.12772', '5.62318', '2689:0 2691:0 2693:0 '),\n('2691', 'tero320', '530', '3519', '3697', '62', '65', '0', '-2940.15', '5358.09', '-13.875', '4.96972', '2690:0 2649:0 2692:0 2693:0 '),\n('2692', 'tero321', '530', '3519', '3697', '62', '65', '0', '-2795.19', '5341.13', '-2.81699', '5.23676', '2691:0 '),\n('2693', 'tero322', '530', '3519', '3697', '62', '65', '0', '-3141.55', '5381.37', '-22.1389', '0.524372', '2649:0 2689:0 2690:0 2691:0 2694:0 '),\n('2694', 'tero323', '530', '3519', '3697', '62', '65', '0', '-3327.94', '5329.47', '-18.7903', '0.115962', '2693:0 2695:0 '),\n('2695', 'tero324', '530', '3519', '3697', '62', '65', '0', '-3499.7', '5387.05', '-17.1808', '2.91198', '2694:0 2674:0 2675:0 '),\n('2696', 'tero325', '530', '3519', '3519', '62', '65', '0', '-3184.45', '5888', '2.6866', '3.28897', '2683:0 2685:0 2686:0 2687:0 2697:0 2777:0 '),\n('2697', 'tero326', '530', '3519', '3519', '62', '65', '0', '-3032.12', '5978.81', '4.34466', '3.72093', '2696:0 2777:0 '),\n('2698', 'tero327', '530', '3519', '3697', '62', '65', '0', '-3134.88', '4193.43', '-7.28336', '1.29796', '2658:0 2659:0 2699:0 '),\n('2699', 'tero328', '530', '3519', '3697', '62', '65', '0', '-3028.19', '4178.94', '-0.0653765', '2.95906', '2698:0 2700:0 '),\n('2700', 'tero329', '530', '3519', '3519', '62', '65', '0', '-2977.23', '4157.96', '8.11812', '3.04232', '2699:0 2701:0 '),\n('2701', 'tero330', '530', '3519', '3684', '62', '65', '3', '-2960.39', '4073.83', '2.27582', '5.22886', '2700:0 2702:0 '),\n('2702', 'tero331', '530', '3519', '3684', '62', '65', '3', '-2931.59', '3983.95', '-0.908721', '4.85187', '2701:0 2703:0 '),\n('2703', 'tero332', '530', '3519', '3519', '62', '65', '2', '-2826.95', '3982.66', '1.7483', '3.08078', '2702:0 2704:0 '),\n('2704', 'tero333', '530', '3519', '3519', '62', '65', '0', '-2775.95', '3939.94', '2.93918', '0.30046', '2703:0 2705:0 '),\n('2705', 'tero334', '530', '3519', '3519', '62', '65', '0', '-2653.89', '3959.73', '4.49025', '3.42242', '2704:0 2706:0 2745:0 '),\n('2706', 'tero335', '530', '3519', '3519', '62', '65', '0', '-2556.49', '4106.29', '1.74147', '4.38846', '2705:0 2707:0 2744:0 '),\n('2707', 'tero336', '530', '3519', '3519', '62', '65', '0', '-2371.13', '4150.23', '2.76251', '3.40672', '2706:0 2708:0 2717:0 '),\n('2708', 'tero337', '530', '3519', '3519', '62', '65', '0', '-2284.4', '4192.35', '1.1876', '3.57951', '2707:0 2709:0 2717:0 '),\n('2709', 'tero338', '530', '3519', '3675', '62', '65', '0', '-2258.83', '4242.98', '1.82659', '4.04289', '2708:0 2710:0 2717:0 '),\n('2710', 'tero339', '530', '3519', '3519', '62', '65', '0', '-2454.44', '4246.04', '1.04828', '6.28128', '2709:0 2711:0 '),\n('2711', 'tero340', '530', '3519', '3519', '62', '65', '4', '-2553.08', '4300.19', '21.2595', '5.70952', '2710:0 2712:0 '),\n('2712', 'tero341', '530', '3519', '3683', '62', '65', '5', '-2594.46', '4387.9', '29.7655', '5.39144', '2711:0 2713:0 '),\n('2713', 'tero342', '530', '3519', '3683', '62', '65', '5', '-2656.03', '4422.89', '36.1553', '5.66241', '2712:0 2714:0 '),\n('2714', 'tero343', '530', '3519', '3683', '62', '65', '4', '-2719.28', '4376.75', '22.1052', '0.28636', '2713:0 2715:0 '),\n('2715', 'tero344', '530', '3519', '3697', '62', '65', '0', '-2834.82', '4335.44', '5.95973', '3.39654', '2714:0 2716:0 '),\n('2716', 'tero345', '530', '3519', '3697', '62', '65', '0', '-2909.54', '4349.69', '0.308415', '2.08492', '2715:0 2657:0 '),\n('2717', 'tero346', '530', '3519', '3675', '62', '65', '0', '-2170.52', '4243.01', '5.56803', '3.39654', '2707:0 2708:0 2709:0 2718:0 2776:0 '),\n('2718', 'tero347', '530', '3519', '3675', '62', '65', '0', '-2148.84', '4189.65', '7.46099', '4.90842', '2717:0 2719:0 2720:0 2776:0 '),\n('2719', 'tero348', '530', '3519', '3519', '62', '65', '0', '-2169.46', '4024.43', '0.27975', '4.58248', '2718:0 2742:0 2747:0 '),\n('2720', 'tero349', '530', '3519', '3675', '62', '65', '0', '-2043.89', '4276.14', '4.85305', '3.85599', '2718:0 2721:0 2734:0 2776:0 '),\n('2721', 'tero350', '530', '3519', '3519', '62', '65', '0', '-2003.56', '4443.33', '7.66134', '1.22491', '2720:0 2722:0 2734:0 2739:0 2776:0 '),\n('2722', 'tero351', '530', '3519', '3674', '62', '65', '0', '-1957.79', '4600.09', '4.55853', '1.42126', '2721:0 2723:0 2731:0 2734:0 2739:0 '),\n('2723', 'tero352', '530', '3519', '3674', '62', '65', '0', '-1958.96', '4765.62', '-1.86355', '1.51943', '2722:0 2724:0 2739:0 2741:0 '),\n('2724', 'tero353', '530', '3519', '3519', '62', '65', '0', '-1920.31', '4893.8', '2.58999', '4.29189', '2723:0 2635:0 2725:0 2741:0 '),\n('2725', 'tero354', '530', '3519', '3674', '62', '65', '0', '-1767.42', '4808.53', '10.9381', '2.60326', '2724:0 2726:0 '),\n('2726', 'tero355', '530', '3519', '3519', '62', '65', '0', '-1610.9', '4687.94', '-0.462587', '3.37452', '2725:0 2727:0 '),\n('2727', 'tero356', '530', '3519', '3519', '62', '65', '0', '-1438.54', '4646.53', '23.7191', '3.09413', '2726:0 2728:0 '),\n('2728', 'tero357', '530', '3519', '3689', '62', '65', '0', '-1505.3', '4470.55', '41.7643', '1.30342', '2727:0 2729:0 2733:0 '),\n('2729', 'tero358', '530', '3519', '3674', '62', '65', '0', '-1652.18', '4568.13', '2.67411', '5.85088', '2728:0 2730:0 '),\n('2730', 'tero359', '530', '3519', '3674', '62', '65', '0', '-1796.78', '4588.16', '10.9079', '6.12577', '2729:0 2731:0 2732:0 2734:0 '),\n('2731', 'tero360', '530', '3519', '3674', '62', '65', '0', '-1895.32', '4551.89', '11.162', '0.506242', '2730:0 2722:0 2732:0 2734:0 2739:0 '),\n('2732', 'tero361', '530', '3519', '3689', '62', '65', '0', '-1732.56', '4448.64', '2.34425', '5.26889', '2731:0 2730:0 2733:0 2734:0 '),\n('2733', 'tero362', '530', '3519', '3689', '62', '65', '0', '-1608.22', '4353.23', '36.5945', '1.16519', '2732:0 2728:0 '),\n('2734', 'tero363', '530', '3519', '3519', '62', '65', '0', '-1921.27', '4373.25', '1.92765', '2.16501', '2720:0 2721:0 2722:0 2730:0 2731:0 2732:0 2735:0 2776:0 '),\n('2735', 'tero364', '530', '3519', '3519', '62', '65', '0', '-1840.29', '4219.11', '25.1803', '2.004', '2734:0 2736:0 2776:0 '),\n('2736', 'tero365', '530', '3519', '3519', '62', '65', '0', '-1752.97', '4184.94', '57.0737', '5.13381', '2735:0 2737:0 2776:0 '),\n('2737', 'tero366', '530', '3519', '3858', '62', '65', '0', '-1716.88', '4074.81', '63.5817', '4.67042', '2736:0 2738:0 '),\n('2738', 'tero367', '530', '3519', '3858', '62', '65', '0', '-1691.82', '3935.7', '48.2267', '4.84636', '2737:0 2419:0 '),\n('2739', 'tero368', '530', '3519', '3519', '62', '65', '0', '-2102.76', '4635.13', '-7.65692', '2.95747', '2721:0 2722:0 2723:0 2731:0 2740:0 '),\n('2740', 'tero369', '530', '3519', '3519', '62', '65', '0', '-2257.36', '4704.28', '-0.0780256', '1.2021', '2739:0 '),\n('2741', 'tero370', '530', '3519', '3519', '62', '65', '0', '-2070.88', '4924.17', '13.5597', '3.10277', '2634:0 2635:0 2636:0 2637:0 2638:0 2723:0 2724:0 '),\n('2742', 'tero371', '530', '3519', '3519', '62', '65', '0', '-2246.8', '3880.41', '2.21742', '1.23746', '2719:0 2743:0 2747:0 '),\n('2743', 'tero372', '530', '3519', '3519', '62', '65', '0', '-2340.28', '3972.87', '-13.2572', '5.73387', '2742:0 2744:0 2747:0 '),\n('2744', 'tero373', '530', '3519', '3519', '62', '65', '0', '-2488.61', '4019.54', '0.242718', '5.94199', '2743:0 2706:0 2746:0 '),\n('2745', 'tero374', '530', '3519', '3860', '62', '65', '0', '-2554.91', '3912.09', '9.61175', '2.80825', '2705:0 2746:0 '),\n('2746', 'tero375', '530', '3519', '3860', '62', '65', '0', '-2485.03', '3909.12', '5.70774', '1.75582', '2745:0 2744:0 '),\n('2747', 'tero376', '530', '3519', '3519', '62', '65', '0', '-2259.61', '3793.94', '0.912792', '1.33958', '2719:0 2742:0 2743:0 2748:0 2771:0 '),\n('2748', 'tero377', '530', '3519', '3519', '62', '65', '0', '-2386.92', '3640.31', '1.09836', '4.00208', '2747:0 2749:0 2758:0 '),\n('2749', 'tero378', '530', '3519', '3519', '62', '65', '0', '-2479.53', '3552.42', '1.40969', '5.89488', '2748:0 2750:0 2759:0 '),\n('2750', 'tero379', '530', '3519', '3519', '62', '65', '0', '-2345.97', '3468.35', '-9.89249', '2.70223', '2749:0 2751:0 2759:0 '),\n('2751', 'tero380', '530', '3519', '3519', '62', '65', '0', '-2312.38', '3409.64', '-11.2993', '4.48901', '2750:0 2752:0 '),\n('2752', 'tero381', '530', '3519', '3681', '62', '65', '0', '-2354.51', '3272.69', '-1.60544', '1.28851', '2751:0 2753:0 '),\n('2753', 'tero382', '530', '3519', '3681', '62', '65', '0', '-2370.38', '3203.41', '-1.58182', '4.34763', '2752:0 2754:0 2762:0 '),\n('2754', 'tero383', '530', '3519', '3681', '62', '65', '0', '-2266.46', '3160.45', '-5.07597', '2.81611', '2753:0 2755:0 '),\n('2755', 'tero384', '530', '3519', '3519', '62', '65', '0', '-2151', '3259.96', '-30.9173', '0.993986', '2754:0 2756:0 '),\n('2756', 'tero385', '530', '3519', '3519', '62', '65', '0', '-2122.05', '3416.4', '-46.8967', '4.54007', '2755:0 2757:0 2771:0 '),\n('2757', 'tero386', '530', '3519', '3519', '62', '65', '0', '-2185.17', '3533.98', '-39.5174', '5.06236', '2756:0 2758:0 2771:0 '),\n('2758', 'tero387', '530', '3519', '3519', '62', '65', '0', '-2281.3', '3632.39', '-12.7757', '5.10555', '2757:0 2748:0 2771:0 '),\n('2759', 'tero388', '530', '3519', '3519', '62', '65', '0', '-2591.73', '3492.79', '0.37378', '0.569874', '2749:0 2750:0 2760:0 '),\n('2760', 'tero389', '530', '3519', '3519', '62', '65', '0', '-2706.59', '3361.89', '-0.445352', '4.0649', '2759:0 2761:0 2763:0 2764:0 '),\n('2761', 'tero390', '530', '3519', '3519', '62', '65', '0', '-2599.6', '3260.29', '1.92252', '2.39202', '2760:0 2762:0 2763:0 '),\n('2762', 'tero391', '530', '3519', '3519', '62', '65', '0', '-2474.91', '3212.52', '3.71098', '0.644506', '2761:0 2753:0 '),\n('2763', 'tero392', '530', '3519', '3519', '62', '65', '0', '-2789.26', '3261.1', '5.82088', '0.813367', '2760:0 2761:0 3534:0 '),\n('2764', 'tero393', '530', '3519', '3685', '62', '65', '0', '-2834.79', '3413.38', '-40.4077', '5.88312', '2760:0 2765:0 2770:0 '),\n('2765', 'tero394', '530', '3519', '3519', '62', '65', '0', '-2792.39', '3494.53', '-29.9885', '3.12636', '2764:0 2766:0 '),\n('2766', 'tero395', '530', '3519', '3685', '62', '65', '0', '-2893.22', '3498.45', '-28.8532', '2.48233', '2765:0 2767:0 '),\n('2767', 'tero396', '530', '3519', '3685', '62', '65', '0', '-2966.27', '3553.99', '-6.76611', '5.48021', '2766:0 2768:0 '),\n('2768', 'tero397', '530', '3519', '3685', '62', '65', '0', '-2986.16', '3462.38', '0.040144', '1.25475', '2767:0 2769:0 '),\n('2769', 'tero398', '530', '3519', '3685', '62', '65', '0', '-2966.04', '3366.93', '-1.18287', '0.0020256', '2768:0 2770:0 '),\n('2770', 'tero399', '530', '3519', '3519', '62', '65', '0', '-2877.47', '3356.32', '-19.7096', '2.96298', '2769:0 2764:0 '),\n('2771', 'tero400', '530', '3519', '3519', '62', '65', '0', '-2096.95', '3654.03', '-54.8181', '4.15287', '2747:0 2756:0 2757:0 2758:0 2772:0 '),\n('2772', 'tero401', '530', '3519', '3519', '62', '65', '0', '-2064.06', '3807.53', '1.04682', '4.11754', '2771:0 2773:0 '),\n('2773', 'tero402', '530', '3519', '3676', '62', '65', '0', '-1908.63', '3920.4', '-2.85436', '0.610731', '2772:0 2774:0 2775:0 '),\n('2774', 'tero403', '530', '3519', '3519', '62', '65', '0', '-1975.78', '4077.99', '-0.0257859', '4.60841', '2773:0 2775:0 2776:0 '),\n('2775', 'tero404', '530', '3519', '3676', '62', '65', '0', '-2060.38', '3925.05', '-0.749629', '0.524347', '2774:0 2773:0 '),\n('2776', 'tero405', '530', '3519', '3519', '62', '65', '0', '-1932.67', '4229.67', '0.0246133', '4.45526', '2717:0 2718:0 2720:0 2721:0 2734:0 2735:0 2736:0 2774:0 '),\n('2777', 'nag406', '530', '3518', '3788', '62', '65', '0', '-2979.16', '5983.95', '6.75645', '5.87684', '2696:0 2697:0 2778:0 '),\n('2778', 'nag407', '530', '3518', '3788', '64', '67', '0', '-2903.9', '5958.93', '14.5613', '0.547909', '2777:0 2779:0 '),\n('2779', 'nag408', '530', '3518', '3788', '64', '67', '0', '-2695.32', '6074.17', '39.2839', '0.398684', '2778:0 2780:0 '),\n('2780', 'nag409', '530', '3518', '3518', '64', '67', '0', '-2642.01', '6196.52', '35.4889', '4.38459', '2779:0 2781:0 2784:0 '),\n('2781', 'nag410', '530', '3518', '3610', '64', '67', '0', '-2584.26', '6153', '22.5432', '1.45591', '2780:0 2782:0 2832:0 '),\n('2782', 'nag411', '530', '3518', '3518', '64', '67', '0', '-2469.6', '6354.46', '29.3999', '3.93692', '2781:0 2783:0 2802:0 2822:0 '),\n('2783', 'nag412', '530', '3518', '3518', '64', '67', '0', '-2598.81', '6353.52', '38.4982', '4.67519', '2782:0 2784:0 2802:0 '),\n('2784', 'nag413', '530', '3518', '3518', '64', '67', '0', '-2647.16', '6298.81', '39.1645', '4.36889', '2783:0 2780:0 2785:0 '),\n('2785', 'nag414', '530', '3518', '3518', '64', '67', '0', '-2698.48', '6403.1', '37.6375', '5.24131', '2784:0 2786:0 '),\n('2786', 'nag416', '530', '3518', '3637', '64', '67', '0', '-2811.55', '6437.45', '63.1489', '2.87099', '2787:0 2788:0 2792:0 2785:0 '),\n('2787', 'nag417', '530', '3518', '3637', '64', '67', '0', '-2883.12', '6557.15', '51.9561', '5.05205', '2786:0 2790:0 2793:0 '),\n('2788', 'nag418', '530', '3518', '3637', '64', '67', '0', '-2866.92', '6391.89', '80.9253', '0.732363', '2786:0 2789:0 '),\n('2789', 'nag419', '530', '3518', '3637', '64', '67', '0', '-2947.68', '6377.55', '94.6931', '0.234009', '2788:0 2790:0 2791:0 '),\n('2790', 'nag420', '530', '3518', '3637', '64', '67', '0', '-2933.99', '6526.24', '74.3112', '5.85317', '2787:0 2789:0 '),\n('2791', 'nag421', '530', '3518', '3637', '64', '67', '0', '-2858.26', '6300.73', '73.5168', '2.16181', '2789:0 2792:0 '),\n('2792', 'nag422', '530', '3518', '3637', '64', '67', '0', '-2800.78', '6320.06', '63.9422', '1.52171', '2791:0 2786:0 '),\n('2793', 'nag423', '530', '3518', '3518', '64', '67', '0', '-2813.58', '6624.23', '27.952', '0.826629', '2787:0 2794:0 2797:0 '),\n('2794', 'nag424', '530', '3518', '3518', '64', '67', '0', '-2876.27', '6701.94', '18.9403', '5.46206', '2793:0 2795:0 '),\n('2795', 'nag425', '530', '3518', '3518', '64', '67', '0', '-2695.5', '6579.52', '23.3102', '2.71395', '2794:0 2796:0 '),\n('2796', 'nag426', '530', '3518', '3518', '64', '67', '0', '-2618.02', '6729.9', '-1.1338', '4.0884', '2795:0 2797:0 '),\n('2797', 'nag427', '530', '3518', '3518', '64', '67', '0', '-2762.9', '6813.59', '-4.67732', '4.5989', '2793:0 2796:0 2798:0 2933:0 '),\n('2798', 'nag428', '530', '3518', '3518', '64', '67', '0', '-2754.65', '6993.51', '-7.49834', '4.92564', '2797:0 2799:0 2933:0 2934:0 '),\n('2799', 'nag429', '530', '3518', '3518', '64', '67', '0', '-2554.45', '7061.91', '-8.95898', '0.31535', '2798:0 2800:0 2803:0 '),\n('2800', 'nag430', '530', '3518', '3518', '64', '67', '0', '-2401.18', '6918.47', '-1.9365', '5.18482', '2799:0 2801:0 2803:0 2814:0 2825:0 '),\n('2801', 'nag431', '530', '3518', '3518', '64', '67', '0', '-2443.4', '6718.82', '0.5495', '4.75286', '2800:0 2802:0 2824:0 '),\n('2802', 'nag432', '530', '3518', '3518', '64', '67', '0', '-2465.96', '6485.46', '18.388', '4.48583', '2801:0 2782:0 2783:0 '),\n('2803', 'nag433', '530', '3518', '3518', '64', '67', '0', '-2495.17', '7067.29', '-6.61379', '5.16519', '2799:0 2800:0 2804:0 2814:0 '),\n('2804', 'nag434', '530', '3518', '3518', '64', '67', '2', '-2545.1', '7142.88', '17.2089', '5.26259', '2803:0 2805:0 '),\n('2805', 'nag435', '530', '3518', '3626', '64', '67', '3', '-2587.61', '7240.05', '13.2805', '5.09373', '2804:0 2806:0 2807:0 '),\n('2806', 'nag436', '530', '3518', '3626', '64', '67', '2', '-2552.46', '7299.13', '13.4929', '4.96416', '2805:0 2809:0 '),\n('2807', 'nag437', '530', '3518', '3626', '64', '67', '2', '-2670.89', '7210.11', '23.8723', '0.310654', '2805:0 2808:0 '),\n('2808', 'nag438', '530', '3518', '3626', '64', '67', '3', '-2655.58', '7280.08', '30.7964', '4.57931', '2807:0 '),\n('2809', 'nag439', '530', '3518', '3626', '64', '67', '2', '-2487.77', '7333.59', '-15.1601', '0.389211', '2806:0 2810:0 '),\n('2810', 'nag440', '530', '3518', '3518', '64', '67', '2', '-2287.49', '7419.75', '-15.9035', '3.46169', '2809:0 2811:0 2867:0 '),\n('2811', 'nag441', '530', '3518', '3518', '64', '67', '0', '-2167.73', '7320.37', '-34.5989', '5.71198', '2810:0 2866:0 2812:0 '),\n('2812', 'nag443', '530', '3518', '3705', '64', '67', '0', '-2271.92', '7267.29', '-57.0529', '4.8127', '2813:0 2811:0 '),\n('2813', 'nag444', '530', '3518', '3705', '64', '67', '0', '-2261.19', '7161.5', '-56.5907', '4.81663', '2814:0 2815:0 2812:0 '),\n('2814', 'nag445', '530', '3518', '3518', '64', '67', '0', '-2347.48', '7041.26', '-12.5344', '2.817', '2813:0 2800:0 2803:0 '),\n('2815', 'nag447', '530', '3518', '3705', '64', '67', '0', '-2116.24', '7209.42', '-112.779', '5.97431', '2813:0 2816:0 '),\n('2816', 'nag448', '530', '3518', '3705', '64', '67', '0', '-1904.26', '7175.34', '-92.9691', '3.12725', '2817:0 2815:0 '),\n('2817', 'nag449', '530', '3518', '3705', '64', '67', '0', '-1985.26', '6900.65', '-85.609', '5.34993', '2816:0 2818:0 '),\n('2818', 'nag450', '530', '3518', '3518', '64', '67', '0', '-1848.57', '6696.54', '-53.151', '5.40883', '2817:0 2819:0 2826:0 '),\n('2819', 'nag451', '530', '3518', '3518', '64', '67', '0', '-1730.63', '6547.09', '19.5667', '5.00434', '2818:0 2820:0 2826:0 2839:0 2843:0 '),\n('2820', 'nag452', '530', '3518', '3518', '64', '67', '0', '-1929.46', '6510.46', '16.1863', '2.96231', '2819:0 2821:0 2839:0 2928:0 '),\n('2821', 'nag453', '530', '3518', '3638', '64', '67', '0', '-2134.61', '6517.76', '14.0285', '6.16673', '2820:0 2822:0 2823:0 2839:0 '),\n('2822', 'nag454', '530', '3518', '3518', '64', '67', '0', '-2312.35', '6407.62', '22.8307', '0.6603', '2821:0 2782:0 2823:0 '),\n('2823', 'nag455', '530', '3518', '3518', '64', '67', '0', '-2275.72', '6586.73', '3.55526', '5.16535', '2822:0 2821:0 2824:0 2831:0 '),\n('2824', 'nag456', '530', '3518', '3518', '64', '67', '0', '-2337.25', '6706.87', '-0.736603', '5.08052', '2823:0 2801:0 '),\n('2825', 'nag457', '530', '3518', '3518', '64', '67', '0', '-2230.6', '6874.1', '-6.45156', '5.78973', '2800:0 '),\n('2826', 'nag458', '530', '3518', '3518', '64', '67', '0', '-1596.41', '6719.35', '6.94102', '2.95446', '2819:0 2818:0 2827:0 2843:0 '),\n('2827', 'nag459', '530', '3518', '3518', '64', '67', '0', '-1749.49', '6887.02', '-31.8672', '3.0919', '2826:0 2828:0 2856:0 '),\n('2828', 'nag460', '530', '3518', '3705', '64', '67', '0', '-2033.22', '6893.42', '-39.0869', '0.112087', '2827:0 2829:0 '),\n('2829', 'nag461', '530', '3518', '3638', '64', '67', '0', '-2099.87', '6812.26', '-29.9742', '0.936751', '2828:0 2830:0 '),\n('2830', 'nag462', '530', '3518', '3638', '64', '67', '0', '-2097.69', '6747.79', '-3.22856', '3.89457', '2829:0 2831:0 '),\n('2831', 'nag463', '530', '3518', '3638', '64', '67', '0', '-2181.79', '6690.97', '-0.800369', '0.623385', '2830:0 2823:0 '),\n('2832', 'nag464', '530', '3518', '3610', '64', '67', '0', '-2569.73', '6270.11', '18.4891', '5.91894', '2781:0 2833:0 '),\n('2833', 'nag465', '530', '3518', '3610', '64', '67', '0', '-2480.31', '6262.64', '30.7263', '5.11194', '2832:0 2834:0 '),\n('2834', 'nag466', '530', '3518', '3610', '64', '67', '0', '-2447.6', '6170.75', '50.9756', '3.42333', '2833:0 2835:0 '),\n('2835', 'nag467', '530', '3518', '3610', '64', '67', '0', '-2505.35', '6175.86', '59.938', '5.6892', '2834:0 2836:0 '),\n('2836', 'nag468', '530', '3518', '3610', '64', '67', '0', '-2439.68', '6122.93', '84.0967', '2.43372', '2835:0 2837:0 '),\n('2837', 'nag469', '530', '3518', '3610', '64', '67', '0', '-2332.91', '6161.97', '53.5534', '0.177271', '2836:0 2838:0 '),\n('2838', 'nag470', '530', '3518', '3610', '64', '67', '0', '-2259.12', '6100.84', '76.839', '2.48242', '2837:0 '),\n('2839', 'nag471', '530', '3518', '3518', '64', '67', '0', '-1938.01', '6408.13', '38.4565', '3.95504', '2819:0 2820:0 2821:0 2840:0 2928:0 '),\n('2840', 'nag472', '530', '3518', '3518', '64', '67', '0', '-2080.87', '6349.27', '43.0054', '5.9188', '2839:0 2841:0 2928:0 '),\n('2841', 'nag473', '530', '3518', '3634', '64', '67', '0', '-1853.87', '6319.73', '46.4678', '2.96543', '2840:0 2842:0 2928:0 '),\n('2842', 'nag474', '530', '3518', '3518', '64', '67', '0', '-1699.25', '6393.14', '40.5718', '0.499271', '2841:0 2843:0 2927:0 '),\n('2843', 'nag475', '530', '3518', '3518', '64', '67', '0', '-1534.13', '6557.83', '19.5951', '2.01038', '2826:0 2842:0 2819:0 2844:0 2927:0 '),\n('2844', 'nag476', '530', '3518', '3518', '64', '67', '0', '-1482.81', '6727.6', '24.7441', '1.27603', '2843:0 2845:0 '),\n('2845', 'nag477', '530', '3518', '3518', '64', '67', '0', '-1390.93', '6854.77', '28.5326', '0.624149', '2844:0 2856:0 2853:0 '),\n('2846', 'nag480', '530', '3518', '3613', '64', '67', '4', '-1409.34', '7112.02', '33.814', '1.09183', '2847:0 2853:0 '),\n('2847', 'nag481', '530', '3518', '3613', '64', '67', '5', '-1329.62', '7212.68', '33.1588', '0.853479', '2846:0 2848:0 2855:0 '),\n('2848', 'nag482', '530', '3518', '3613', '64', '67', '4', '-1270.74', '7314.59', '33.6816', '4.21027', '2847:0 2849:0 '),\n('2849', 'nag483', '530', '3518', '3613', '64', '67', '4', '-1220.36', '7373.07', '33.23', '4.20635', '2848:0 2850:0 2851:0 '),\n('2850', 'nag484', '530', '3518', '3518', '64', '67', '0', '-1212.08', '7477.88', '22.0868', '1.54857', '2849:0 2862:0 2926:0 '),\n('2851', 'nag485', '530', '3518', '3613', '64', '67', '4', '-1182.14', '7317.1', '34.1095', '4.44589', '2849:0 2852:0 '),\n('2852', 'nag486', '530', '3518', '3613', '64', '67', '4', '-1195.71', '7212.96', '50.7515', '1.47708', '2851:0 2854:0 '),\n('2853', 'nag487', '530', '3518', '3613', '64', '67', '4', '-1266.65', '6971.73', '37.8915', '2.73527', '2845:0 2846:0 2854:0 '),\n('2854', 'nag488', '530', '3518', '3613', '64', '67', '5', '-1222.4', '7167.59', '57.2656', '4.44744', '2852:0 2855:0 2853:0 '),\n('2855', 'nag489', '530', '3518', '3613', '64', '67', '4', '-1276.87', '7200.65', '48.3758', '5.06006', '2847:0 2854:0 '),\n('2856', 'nag491', '530', '3518', '3518', '64', '67', '0', '-1550.75', '6994.79', '2.3684', '5.6216', '2845:0 2827:0 2857:0 '),\n('2857', 'nag492', '530', '3518', '3518', '64', '67', '0', '-1663.57', '7019.01', '0.239528', '1.55716', '2856:0 2858:0 2864:0 '),\n('2858', 'nag493', '530', '3518', '3518', '64', '67', '0', '-1624.79', '7247.01', '1.99533', '4.52597', '2857:0 2859:0 2864:0 '),\n('2859', 'nag494', '530', '3518', '3518', '64', '67', '0', '-1561.04', '7386.09', '1.02012', '0.650024', '2858:0 2860:0 2863:0 '),\n('2860', 'nag495', '530', '3518', '3518', '64', '67', '0', '-1369.87', '7525.98', '8.40119', '6.06534', '2859:0 2861:0 2968:0 '),\n('2861', 'nag496', '530', '3518', '3628', '64', '67', '0', '-1342.35', '7749.72', '-4.85434', '4.51025', '2860:0 2862:0 2959:0 '),\n('2862', 'nag497', '530', '3518', '3518', '64', '67', '0', '-1244.21', '7675', '9.34848', '4.90297', '2861:0 2850:0 2919:0 '),\n('2863', 'nag498', '530', '3518', '3518', '64', '67', '0', '-1822.25', '7460.83', '-6.36199', '6.02215', '2859:0 2864:0 2971:0 '),\n('2864', 'nag499', '530', '3518', '3518', '64', '67', '0', '-1788.32', '7255.55', '-7.10964', '1.73702', '2863:0 2858:0 2857:0 2865:0 '),\n('2865', 'nag500', '530', '3518', '3518', '64', '67', '0', '-1876.28', '7247.82', '-15.0226', '2.58134', '2864:0 2866:0 '),\n('2866', 'nag501', '530', '3518', '3518', '64', '67', '0', '-2010.2', '7318.56', '-33.8028', '5.83525', '2865:0 2811:0 '),\n('2867', 'nag502', '530', '3518', '3518', '64', '67', '0', '-2284.88', '7613.96', '-8.38883', '4.91632', '2810:0 2868:0 2869:0 2882:0 '),\n('2868', 'nag503', '530', '3518', '3518', '64', '67', '0', '-2110.77', '7507.01', '-30.9661', '2.75255', '2867:0 '),\n('2869', 'nag504', '530', '3518', '3518', '64', '67', '0', '-2280.53', '7760.34', '-25.2768', '3.08634', '2867:0 2870:0 2882:0 2953:0 '),\n('2870', 'nag505', '530', '3518', '3631', '64', '67', '0', '-2202.48', '7982.31', '-19.9501', '4.31156', '2869:0 2871:0 2884:0 2953:0 '),\n('2871', 'nag506', '530', '3518', '3518', '64', '67', '0', '-2164.5', '8163.38', '-23.2432', '1.37024', '2870:0 2872:0 2884:0 2949:0 '),\n('2872', 'nag507', '530', '3518', '3518', '64', '67', '0', '-2186.27', '8355.19', '-20.7293', '1.74723', '2871:0 2873:0 2885:0 2949:0 '),\n('2873', 'nag508', '530', '3518', '3518', '64', '67', '0', '-2261.53', '8552.19', '-18.4527', '1.93573', '2872:0 2874:0 2885:0 2886:0 2887:0 '),\n('2874', 'nag509', '530', '3518', '3631', '64', '67', '0', '-2454.9', '8618.3', '-25.5244', '2.80359', '2873:0 2875:0 2886:0 '),\n('2875', 'nag510', '530', '3518', '3518', '64', '67', '0', '-2638.28', '8663.06', '-21.4046', '2.94104', '2874:0 2876:0 2886:0 '),\n('2876', 'nag511', '530', '3518', '3631', '64', '67', '0', '-2824.97', '8623.37', '-27.21', '4.0995', '2875:0 2877:0 '),\n('2877', 'nag512', '530', '3518', '3518', '64', '67', '0', '-2867.65', '8450.08', '-30.1391', '4.44507', '2876:0 2878:0 '),\n('2878', 'nag513', '530', '3518', '3631', '64', '67', '0', '-2899.04', '8250.79', '-34.7269', '4.57858', '2877:0 2879:0 '),\n('2879', 'nag514', '530', '3518', '3518', '64', '67', '0', '-2888.4', '8048.68', '-26.7216', '5.47001', '2878:0 2880:0 '),\n('2880', 'nag515', '530', '3518', '3518', '64', '67', '0', '-2777.53', '7867.47', '-33.0086', '5.33648', '2879:0 2881:0 2938:0 '),\n('2881', 'nag516', '530', '3518', '3518', '64', '67', '0', '-2646.42', '7719.28', '-30.5333', '5.53675', '2880:0 2882:0 2883:0 2938:0 '),\n('2882', 'nag517', '530', '3518', '3518', '64', '67', '0', '-2469.37', '7698.03', '-17.5014', '0.0114679', '2869:0 2881:0 2867:0 2883:0 '),\n('2883', 'nag518', '530', '3518', '3631', '64', '67', '0', '-2548.6', '7872.59', '-53.4948', '1.39927', '2882:0 2881:0 2884:0 '),\n('2884', 'nag519', '530', '3518', '3631', '64', '67', '0', '-2377.16', '8119.54', '-42.3084', '5.94673', '2883:0 2870:0 2871:0 2885:0 '),\n('2885', 'nag520', '530', '3518', '3631', '64', '67', '0', '-2383.8', '8337.19', '-39.2254', '0.68063', '2884:0 2872:0 2873:0 2886:0 '),\n('2886', 'nag521', '530', '3518', '3631', '64', '67', '0', '-2489.29', '8499.84', '-36.8544', '3.07375', '2885:0 2874:0 2873:0 2875:0 '),\n('2887', 'nag522', '530', '3518', '3518', '64', '67', '0', '-2206.87', '8693.03', '-3.10935', '4.27148', '2873:0 2888:0 2939:0 '),\n('2888', 'nag523', '530', '3518', '3518', '64', '67', '1', '-2042.46', '8705.35', '18.0019', '0.174061', '2887:0 2889:0 '),\n('2889', 'nag524', '530', '3518', '3518', '64', '67', '0', '-1841.7', '8722.11', '25.2892', '5.96245', '2888:0 2890:0 '),\n('2890', 'nag525', '530', '3518', '3518', '64', '67', '0', '-1640.31', '8750.19', '32.1406', '6.19414', '2889:0 2891:0 2913:0 2941:0 '),\n('2891', 'nag526', '530', '3518', '3518', '64', '67', '0', '-1515.41', '8730.96', '27.2727', '5.36163', '2890:0 2892:0 2913:0 2894:0 '),\n('2892', 'nag527', '530', '3518', '3518', '64', '67', '0', '-1371.92', '8548.95', '11.8041', '3.728', '2891:0 2893:0 2898:0 2904:0 '),\n('2893', 'nag528', '530', '3518', '3622', '64', '67', '0', '-1460.34', '8490.57', '4.09139', '0.714427', '2892:0 2897:0 2965:0 '),\n('2894', 'nag530', '530', '3518', '3622', '64', '67', '0', '-1570.36', '8600.16', '4.98091', '3.67147', '2891:0 2895:0 2897:0 '),\n('2895', 'nag531', '530', '3518', '3622', '64', '67', '0', '-1642.07', '8541.56', '-12.6482', '5.37185', '2896:0 2894:0 '),\n('2896', 'nag532', '530', '3518', '3622', '64', '67', '0', '-1595.85', '8476.21', '-11.7076', '0.541643', '2895:0 2897:0 '),\n('2897', 'nag533', '530', '3518', '3622', '64', '67', '0', '-1526.1', '8519.38', '1.01318', '3.57721', '2896:0 2893:0 2894:0 '),\n('2898', 'nag534', '530', '3518', '3518', '64', '67', '0', '-1207.6', '8431.13', '20.2568', '5.9334', '2892:0 2899:0 2904:0 '),\n('2899', 'nag535', '530', '3518', '3518', '64', '67', '0', '-1095.6', '8405.41', '20.4451', '5.79204', '2898:0 2900:0 2904:0 '),\n('2900', 'nag536', '530', '3518', '3518', '64', '67', '0', '-953.793', '8333.32', '22.8678', '0.0193606', '2899:0 2901:0 2916:0 '),\n('2901', 'nag537', '530', '3518', '3518', '64', '67', '0', '-745.188', '8393.11', '33.9484', '0.313885', '2900:0 2902:0 '),\n('2902', 'nag538', '530', '3518', '3763', '64', '67', '0', '-588.034', '8447.14', '64.625', '6.12976', '2901:0 2903:0 '),\n('2903', 'nag539', '530', '3518', '3763', '64', '67', '0', '-494.831', '8433.32', '38.1295', '6.07479', '2902:0 2539:0 '),\n('2904', 'nag540', '530', '3518', '3518', '64', '67', '0', '-1168.9', '8591.89', '36.759', '1.21709', '2892:0 2898:0 2899:0 2905:0 2915:0 '),\n('2905', 'nag541', '530', '3518', '3617', '64', '67', '0', '-1067.77', '8749.39', '84.4276', '1.60586', '2904:0 2906:0 '),\n('2906', 'nag542', '530', '3518', '3617', '64', '67', '0', '-1080.66', '8823.02', '100.874', '1.41736', '2905:0 2907:0 '),\n('2907', 'nag543', '530', '3518', '3617', '64', '67', '0', '-1090.98', '8945.42', '103.447', '0.588767', '2906:0 2908:0 '),\n('2908', 'nag544', '530', '3518', '3617', '64', '67', '0', '-963.69', '8887.28', '146.6', '3.44055', '2907:0 2909:0 '),\n('2909', 'nag545', '530', '3518', '3617', '64', '67', '0', '-868.709', '8940.17', '156.257', '5.74571', '2908:0 2910:0 '),\n('2910', 'nag546', '530', '3518', '3617', '64', '67', '0', '-752.326', '8861.16', '182.978', '4.2134', '2909:0 2911:0 2912:0 '),\n('2911', 'nag547', '530', '3518', '3617', '64', '67', '0', '-651.777', '8791', '201.252', '0.180777', '2910:0 '),\n('2912', 'nag553', '530', '3518', '3617', '64', '67', '0', '-902.893', '8685.38', '170.054', '1.29602', '2910:0 '),\n('2913', 'nag554', '530', '3518', '3625', '64', '67', '0', '-1431.81', '8885.86', '36.9729', '1.07333', '2890:0 2891:0 2914:0 2948:0 '),\n('2914', 'nag555', '530', '3518', '3625', '64', '67', '0', '-1305.49', '8958.42', '58.5828', '5.24728', '2913:0 2915:0 '),\n('2915', 'nag556', '530', '3518', '3518', '64', '67', '0', '-1225.12', '8803.57', '39.6271', '4.88207', '2914:0 2904:0 '),\n('2916', 'nag557', '530', '3518', '3518', '64', '67', '0', '-968.504', '8169.97', '14.3663', '5.25514', '2900:0 2917:0 '),\n('2917', 'nag558', '530', '3518', '3518', '64', '67', '0', '-917.128', '8072.21', '21.4411', '5.19624', '2916:0 2918:0 2920:0 '),\n('2918', 'nag559', '530', '3518', '3518', '64', '67', '0', '-1020.93', '7945.51', '22.9619', '4.026', '2917:0 2919:0 2920:0 '),\n('2919', 'nag560', '530', '3518', '3518', '64', '67', '0', '-1146.56', '7828.51', '14.0417', '4.1548', '2918:0 2862:0 '),\n('2920', 'nag561', '530', '3518', '3616', '64', '67', '0', '-852.563', '7887.28', '40.6401', '4.6339', '2917:0 2918:0 2921:0 '),\n('2921', 'nag562', '530', '3518', '3616', '64', '67', '0', '-830.358', '7797.91', '38.3027', '4.69279', '2920:0 2922:0 '),\n('2922', 'nag563', '530', '3518', '3616', '64', '67', '0', '-829.954', '7695.84', '37.7371', '5.2465', '2921:0 2923:0 '),\n('2923', 'nag564', '530', '3518', '3616', '64', '67', '0', '-783.358', '7540.05', '60.9113', '5.00303', '2922:0 2924:0 '),\n('2924', 'nag565', '530', '3518', '3518', '64', '67', '0', '-763.166', '7451.73', '58.8323', '4.56714', '2923:0 2925:0 '),\n('2925', 'nag566', '530', '3518', '3518', '64', '67', '0', '-933.691', '7394.83', '34.4282', '3.14949', '2924:0 2926:0 '),\n('2926', 'nag567', '530', '3518', '3518', '64', '67', '0', '-1090.44', '7395.57', '33.0234', '2.48583', '2925:0 2850:0 '),\n('2927', 'nag568', '530', '3518', '3518', '64', '67', '1', '-1409.72', '6385.4', '38.2999', '5.37255', '2625:0 2842:0 2843:0 '),\n('2928', 'nag569', '530', '3518', '3634', '64', '67', '0', '-2075.76', '6274.62', '62.3128', '0.289453', '2820:0 2839:0 2840:0 2841:0 2929:0 '),\n('2929', 'nag571', '530', '3518', '3518', '64', '67', '0', '-2094.97', '6179.79', '87.9183', '1.00219', '2928:0 2930:0 '),\n('2930', 'nag572', '530', '3518', '3761', '64', '67', '0', '-2030.06', '6071.21', '119.672', '4.93705', '2931:0 2929:0 '),\n('2931', 'nag573', '530', '3518', '3761', '64', '67', '0', '-2001.22', '5972.22', '151.597', '6.26043', '2930:0 2932:0 '),\n('2932', 'nag574', '530', '3518', '3761', '64', '67', '0', '-1946.52', '5928.39', '150.948', '1.91915', '2931:0 '),\n('2933', 'nag575', '530', '3518', '3518', '64', '67', '0', '-2897.91', '6988.92', '-35.6052', '0.23407', '2797:0 2798:0 2934:0 '),\n('2934', 'nag576', '530', '3518', '3518', '64', '67', '0', '-2847.89', '7102.5', '-8.05767', '2.77876', '2933:0 2798:0 2935:0 '),\n('2935', 'nag577', '530', '3518', '3518', '64', '67', '0', '-2912.74', '7175.13', '-2.27885', '1.70277', '2934:0 2936:0 '),\n('2936', 'nag578', '530', '3518', '3518', '64', '67', '0', '-2935.1', '7301.43', '3.27707', '1.53784', '2935:0 2937:0 '),\n('2937', 'nag579', '530', '3518', '3518', '64', '67', '0', '-2902.48', '7467.17', '2.79586', '1.43181', '2936:0 2938:0 '),\n('2938', 'nag580', '530', '3518', '3518', '64', '67', '0', '-2802.19', '7645.35', '-6.45531', '0.870248', '2937:0 2880:0 2881:0 '),\n('2939', 'nag581', '530', '3518', '3633', '64', '67', '0', '-2196.09', '8827.81', '16.1506', '4.59461', '2887:0 2940:0 '),\n('2940', 'nag582', '530', '3518', '3633', '64', '67', '0', '-2071.65', '8894.1', '28.0157', '0.506613', '2939:0 2941:0 '),\n('2941', 'nag583', '530', '3518', '3518', '64', '67', '0', '-1884.01', '8889.41', '36.2099', '5.7138', '2890:0 2940:0 2942:0 '),\n('2942', 'nag584', '530', '3518', '3518', '64', '67', '0', '-1916.54', '9091.13', '52.9111', '1.74753', '2941:0 2943:0 '),\n('2943', 'nag585', '530', '3518', '3624', '64', '67', '0', '-1849.22', '9237.75', '70.9999', '5.57243', '2942:0 2944:0 '),\n('2944', 'nag586', '530', '3518', '3624', '64', '67', '0', '-1755.41', '9160.76', '79.5049', '5.59599', '2943:0 2945:0 '),\n('2945', 'nag587', '530', '3518', '3518', '64', '67', '0', '-1651.3', '9137.62', '86.3008', '5.99261', '2944:0 2946:0 '),\n('2946', 'nag588', '530', '3518', '3518', '64', '67', '0', '-1545.69', '9099.13', '82.8122', '5.48996', '2945:0 2947:0 '),\n('2947', 'nag589', '530', '3518', '3625', '64', '67', '0', '-1448.69', '9002.9', '57.299', '5.25434', '2946:0 2948:0 '),\n('2948', 'nag590', '530', '3518', '3625', '64', '67', '0', '-1419.87', '8948.03', '58.9144', '6.12613', '2947:0 2913:0 '),\n('2949', 'nag591', '530', '3518', '3518', '64', '67', '0', '-2052.37', '8225.22', '-6.54776', '2.94922', '2871:0 2872:0 2950:0 '),\n('2950', 'nag592', '530', '3518', '3518', '64', '67', '0', '-1986.35', '8210.53', '0.797534', '4.84989', '2949:0 2951:0 2954:0 '),\n('2951', 'nag593', '530', '3518', '3518', '64', '67', '0', '-2024.61', '8154.98', '1.25254', '4.1077', '2950:0 2952:0 '),\n('2952', 'nag594', '530', '3518', '3518', '64', '67', '0', '-2103.83', '8063.36', '2.18912', '4.10771', '2951:0 2953:0 '),\n('2953', 'nag595', '530', '3518', '3518', '64', '67', '0', '-2156.48', '7911.49', '-11.2008', '4.37866', '2952:0 2870:0 2869:0 '),\n('2954', 'nag596', '530', '3518', '3628', '64', '67', '0', '-1840.26', '7999.74', '-24.7446', '2.3484', '2950:0 2955:0 '),\n('2955', 'nag597', '530', '3518', '3628', '64', '67', '0', '-1746.01', '7996.18', '-27.0075', '3.06865', '2954:0 2956:0 '),\n('2956', 'nag598', '530', '3518', '3628', '64', '67', '0', '-1653.08', '7993.42', '-26.6535', '6.25344', '2955:0 2960:0 '),\n('2957', 'nag600', '530', '3518', '3628', '64', '67', '0', '-1550.22', '7929.2', '-21.6393', '6.03352', '2958:0 2960:0 '),\n('2958', 'nag601', '530', '3518', '3628', '64', '67', '0', '-1483.84', '7905.42', '-19.2864', '5.65261', '2957:0 2959:0 '),\n('2959', 'nag602', '530', '3518', '3628', '64', '67', '0', '-1404.2', '7842.35', '-18.1886', '5.40914', '2958:0 2861:0 '),\n('2960', 'nag603', '530', '3518', '3628', '64', '67', '0', '-1554.58', '7990.68', '-21.1856', '3.99937', '2956:0 2957:0 2961:0 2962:0 '),\n('2961', 'nag604', '530', '3518', '3628', '64', '67', '0', '-1601.1', '7865.59', '-22.0744', '4.70386', '2966:0 2960:0 '),\n('2962', 'nag605', '530', '3518', '3628', '64', '67', '0', '-1478.18', '8079.45', '-21.4921', '0.88839', '2963:0 2960:0 '),\n('2963', 'nag606', '530', '3518', '3518', '64', '67', '0', '-1517.43', '8229.34', '-15.3084', '1.82694', '2962:0 2964:0 '),\n('2964', 'nag607', '530', '3518', '3622', '64', '67', '0', '-1508.91', '8347.15', '-12.1475', '1.98089', '2963:0 2965:0 '),\n('2965', 'nag608', '530', '3518', '3622', '64', '67', '0', '-1502.91', '8432.5', '-0.939562', '0.853047', '2964:0 2893:0 '),\n('2966', 'nag609', '530', '3518', '3628', '64', '67', '0', '-1604.12', '7762.81', '-21.7436', '1.48608', '2961:0 2967:0 2969:0 '),\n('2967', 'nag610', '530', '3518', '3518', '64', '67', '0', '-1587.52', '7621.15', '-10.2326', '4.91826', '2966:0 2968:0 2969:0 '),\n('2968', 'nag611', '530', '3518', '3518', '64', '67', '0', '-1475.29', '7596.72', '-5.21911', '5.69972', '2967:0 2860:0 2969:0 '),\n('2969', 'nag612', '530', '3518', '3628', '64', '67', '0', '-1647.6', '7686.9', '-14.3996', '0.653543', '2967:0 2968:0 2966:0 2970:0 '),\n('2970', 'nag613', '530', '3518', '3518', '64', '67', '0', '-1703.41', '7669.14', '-14.3192', '3.85013', '2969:0 2971:0 '),\n('2971', 'nag614', '530', '3518', '3518', '64', '67', '0', '-1781.28', '7605.53', '-8.7957', '3.82657', '2970:0 2863:0 '),\n('2972', 'zang615', '530', '3521', '3521', '64', '67', '0', '794.211', '5932.33', '57.6977', '1.47191', '2601:0 2602:0 2624:0 2973:0 '),\n('2973', 'zang616', '530', '3521', '3521', '64', '67', '0', '820.771', '6049.46', '79.8283', '4.84129', '2972:0 2974:0 '),\n('2974', 'bedg617', '530', '3522', '3767', '65', '70', '0', '882.952', '5919.73', '115.632', '0.505885', '2973:0 2975:0 '),\n('2975', 'bedg618', '530', '3522', '3767', '65', '70', '0', '942.091', '5960.21', '121.279', '0.600133', '2974:0 2976:0 '),\n('2976', 'bedg619', '530', '3522', '3522', '65', '70', '0', '1067.62', '6060.89', '132.716', '0.256129', '2975:0 2977:0 '),\n('2977', 'bedg620', '530', '3522', '3522', '65', '70', '0', '1132.44', '6081.19', '153.605', '5.97461', '2976:0 2978:0 '),\n('2978', 'bedg621', '530', '3522', '3522', '65', '70', '0', '1202.41', '6057.05', '164.269', '5.95105', '2977:0 2979:0 '),\n('2979', 'bedg622', '530', '3522', '3522', '65', '70', '0', '1278.35', '5993.43', '168.127', '5.58584', '2978:0 2980:0 '),\n('2980', 'bedg623', '530', '3522', '3522', '65', '70', '0', '1406.14', '6036.86', '152.292', '0.476827', '2979:0 2981:0 '),\n('2981', 'bedg624', '530', '3522', '3522', '65', '70', '0', '1466.01', '6069.6', '133.93', '6.17882', '2980:0 2982:0 '),\n('2982', 'bedg625', '530', '3522', '3522', '65', '70', '0', '1591.09', '6047.48', '128.651', '6.21023', '2981:0 2983:0 '),\n('2983', 'bedg626', '530', '3522', '3768', '65', '70', '0', '1713.44', '6043.35', '143.923', '6.2495', '2982:0 2984:0 3003:0 '),\n('2984', 'bedg627', '530', '3522', '3768', '65', '70', '0', '1762.72', '5869.71', '155.631', '4.98895', '2983:0 2985:0 3003:0 '),\n('2985', 'bedg628', '530', '3522', '3833', '65', '70', '0', '1802.41', '5792.15', '188.129', '6.12384', '2984:0 2986:0 '),\n('2986', 'bedg629', '530', '3522', '3833', '65', '70', '0', '1865.39', '5786.05', '215.307', '4.78866', '2985:0 2987:0 '),\n('2987', 'bedg631', '530', '3522', '3833', '65', '70', '0', '1882.59', '5668.18', '256.167', '1.82379', '2988:0 2991:0 2986:0 '),\n('2988', 'bedg632', '530', '3522', '3833', '65', '70', '0', '2046.5', '5630.87', '263.828', '6.03743', '2987:0 2989:0 2990:0 2991:0 2994:0 '),\n('2989', 'bedg633', '530', '3522', '3922', '65', '70', '0', '2186.78', '5679.45', '267.903', '1.53317', '2988:0 3190:0 '),\n('2990', 'bedg634', '530', '3522', '3833', '65', '70', '0', '2078.91', '5730.76', '265.935', '3.74408', '2988:0 2991:0 '),\n('2991', 'bedg635', '530', '3522', '3833', '65', '70', '0', '1986.76', '5663.91', '265.451', '5.29919', '2990:0 2988:0 2987:0 2992:0 '),\n('2992', 'bedg636', '530', '3522', '3918', '65', '70', '0', '1882.53', '5595.86', '256.211', '0.429695', '2991:0 2993:0 '),\n('2993', 'bedg637', '530', '3522', '3918', '65', '70', '3', '1913.85', '5539.89', '265.641', '4.76903', '2992:0 2994:0 '),\n('2994', 'bedg638', '530', '3522', '3918', '65', '70', '3', '1980.47', '5572.14', '258.131', '2.97243', '2993:0 2988:0 2995:0 '),\n('2995', 'bedg639', '530', '3522', '3833', '65', '70', '0', '1818.29', '5603', '261.471', '3.82655', '2994:0 2996:0 3002:0 '),\n('2996', 'bedg640', '530', '3522', '3918', '65', '70', '0', '1800.72', '5550.99', '267.48', '2.61311', '2995:0 2997:0 3001:0 '),\n('2997', 'bedg641', '530', '3522', '3919', '65', '70', '0', '1708.89', '5566.11', '265.641', '3.36316', '2996:0 3001:0 3189:0 '),\n('2998', 'bedg643', '530', '3522', '3919', '65', '70', '0', '1564.28', '5423.88', '265.088', '1.83317', '2999:0 3189:0 '),\n('2999', 'bedg644', '530', '3522', '3919', '65', '70', '0', '1534.04', '5541.59', '258.021', '1.3761', '2998:0 3000:0 '),\n('3000', 'bedg645', '530', '3522', '3919', '65', '70', '0', '1599.86', '5605.47', '266.783', '0.413989', '2999:0 3001:0 '),\n('3001', 'bedg646', '530', '3522', '3919', '65', '70', '0', '1692.34', '5649.63', '265.597', '5.29918', '3000:0 2997:0 2996:0 3002:0 '),\n('3002', 'bedg647', '530', '3522', '3919', '65', '70', '0', '1775.77', '5678.9', '267.502', '5.25597', '2995:0 3001:0 '),\n('3003', 'bedg648', '530', '3522', '3768', '65', '70', '0', '1827.31', '6004.38', '138.57', '2.3814', '2983:0 2984:0 3004:0 '),\n('3004', 'bedg649', '530', '3522', '3768', '65', '70', '0', '1934.89', '5992.25', '140.661', '0.472881', '3003:0 3005:0 3041:0 '),\n('3005', 'bedg650', '530', '3522', '3768', '65', '70', '0', '2035.37', '6038.3', '145.555', '3.92079', '3004:0 3006:0 3041:0 '),\n('3006', 'bedg651', '530', '3522', '3768', '65', '70', '0', '2098.1', '5939.59', '137.134', '5.31486', '3005:0 3007:0 3041:0 '),\n('3007', 'bedg652', '530', '3522', '3831', '65', '70', '0', '2140.78', '5883.29', '138.074', '5.36983', '3006:0 3008:0 '),\n('3008', 'bedg653', '530', '3522', '3831', '65', '70', '0', '2169.87', '5811.41', '120.231', '1.97692', '3007:0 3009:0 '),\n('3009', 'bedg654', '530', '3522', '3831', '65', '70', '0', '2156.44', '5731.77', '120.753', '4.55303', '3008:0 3010:0 '),\n('3010', 'bedg655', '530', '3522', '3831', '65', '70', '0', '2209.5', '5671.79', '127.813', '5.09887', '3009:0 3011:0 '),\n('3011', 'bedg656', '530', '3522', '3831', '65', '70', '0', '2242.52', '5586.84', '144.63', '4.98106', '3010:0 3012:0 '),\n('3012', 'bedg657', '530', '3522', '3831', '65', '70', '0', '2242.64', '5516.54', '161.969', '4.74938', '3011:0 3013:0 '),\n('3013', 'bedg658', '530', '3522', '3831', '65', '70', '0', '2266.32', '5460.89', '147.107', '3.73228', '3012:0 3014:0 3015:0 '),\n('3014', 'bedg659', '530', '3522', '3831', '65', '70', '0', '2243.22', '5409.52', '144.241', '3.16286', '3015:0 3013:0 '),\n('3015', 'bedg660', '530', '3522', '3831', '65', '70', '0', '2184.26', '5427.04', '144.314', '3.26496', '3014:0 3016:0 3013:0 '),\n('3016', 'bedg661', '530', '3522', '3831', '65', '70', '0', '2056.91', '5452.67', '144.871', '3.87757', '3015:0 3017:0 '),\n('3017', 'bedg662', '530', '3522', '3831', '65', '70', '0', '1986.16', '5372.79', '148.912', '3.58305', '3016:0 3018:0 '),\n('3018', 'bedg663', '530', '3522', '3831', '65', '70', '0', '1869.19', '5342.55', '144.553', '3.39455', '3017:0 3019:0 '),\n('3019', 'bedg664', '530', '3522', '3831', '65', '70', '0', '1844.86', '5256.68', '138.071', '1.36038', '3018:0 3020:0 '),\n('3020', 'bedg666', '530', '3522', '3831', '65', '70', '0', '1882.44', '5202', '150.044', '6.2809', '3019:0 3021:0 '),\n('3021', 'bedg668', '530', '3522', '3831', '65', '70', '0', '1942.47', '5157.81', '163.104', '1.47426', '3020:0 3022:0 '),\n('3022', 'bedg670', '530', '3522', '3831', '65', '70', '0', '1859.25', '5091.18', '146.37', '4.69048', '3021:0 3023:0 '),\n('3023', 'bedg672', '530', '3522', '3831', '65', '70', '0', '1892.19', '4998.98', '146.563', '5.3777', '3024:0 3022:0 '),\n('3024', 'bedg673', '530', '3522', '3827', '65', '70', '0', '1882.75', '4918.05', '144.661', '4.59623', '3023:0 3025:0 3033:0 '),\n('3025', 'bedg674', '530', '3522', '3827', '65', '70', '0', '1970.05', '4876.31', '143.046', '5.83716', '3024:0 3026:0 3032:0 '),\n('3026', 'bedg675', '530', '3522', '3844', '65', '70', '0', '2066.28', '4886.71', '148.962', '0.107673', '3025:0 3027:0 '),\n('3027', 'bedg676', '530', '3522', '3844', '65', '70', '0', '2113.18', '4914.06', '149.085', '6.14739', '3026:0 3028:0 '),\n('3028', 'bedg677', '530', '3522', '3827', '65', '70', '0', '2197.61', '4955.01', '153.824', '2.65786', '3027:0 3029:0 3186:0 '),\n('3029', 'bedg678', '530', '3522', '3844', '65', '70', '5', '2122.42', '4767.11', '145.442', '4.39595', '3028:0 3030:0 3031:0 '),\n('3030', 'bedg679', '530', '3522', '3844', '65', '70', '5', '2051.79', '4712.94', '149.377', '4.14775', '3029:0 '),\n('3031', 'bedg680', '530', '3522', '3844', '65', '70', '4', '2045.43', '4756.7', '142.832', '3.24454', '3029:0 3032:0 '),\n('3032', 'bedg681', '530', '3522', '3827', '65', '70', '0', '1924.25', '4753.97', '143.374', '3.15815', '3031:0 3025:0 3033:0 '),\n('3033', 'bedg682', '530', '3522', '3827', '65', '70', '0', '1818.76', '4741.32', '143.599', '3.17386', '3032:0 3034:0 3035:0 3024:0 '),\n('3034', 'bedg683', '530', '3522', '3783', '65', '70', '0', '1763.5', '4636.75', '148.572', '2.17246', '3035:0 3033:0 '),\n('3035', 'bedg684', '530', '3522', '3827', '65', '70', '0', '1721.08', '4751.46', '141.246', '2.47877', '3034:0 3036:0 3033:0 '),\n('3036', 'bedg685', '530', '3522', '3827', '65', '70', '0', '1671.81', '4805.51', '144.067', '1.15537', '3035:0 3037:0 '),\n('3037', 'bedg686', '530', '3522', '3827', '65', '70', '0', '1716.64', '4889.56', '168.716', '1.08076', '3036:0 3038:0 '),\n('3038', 'bedg690', '530', '3522', '3779', '65', '70', '0', '1764.57', '5020.59', '169.786', '2.98533', '3037:0 3039:0 '),\n('3039', 'bedg691', '530', '3522', '3779', '65', '70', '0', '1689.52', '5029.67', '171.17', '6.17405', '3040:0 3038:0 '),\n('3040', 'bedg692', '530', '3522', '3779', '65', '70', '0', '1644.1', '5086.59', '174.824', '5.08627', '3039:0 '),\n('3041', 'bedg693', '530', '3522', '3768', '65', '70', '0', '2051.36', '6085.99', '147.268', '1.58417', '3004:0 3005:0 3006:0 3042:0 3048:0 '),\n('3042', 'bedg694', '530', '3522', '3768', '65', '70', '0', '2163.29', '6091.67', '144.685', '6.16931', '3041:0 3043:0 3047:0 '),\n('3043', 'bedg695', '530', '3522', '3769', '65', '70', '5', '2276.18', '6049.52', '143.141', '5.80411', '3042:0 3044:0 '),\n('3044', 'bedg696', '530', '3522', '3769', '65', '70', '4', '2338.36', '6031.21', '142.438', '2.8196', '3043:0 3045:0 '),\n('3045', 'bedg697', '530', '3522', '3769', '65', '70', '5', '2384.95', '6054.49', '138.162', '1.60222', '3044:0 3046:0 '),\n('3046', 'bedg698', '530', '3522', '3768', '65', '70', '0', '2372.13', '6149.95', '128.725', '3.20443', '3045:0 3047:0 3114:0 '),\n('3047', 'bedg699', '530', '3522', '3768', '65', '70', '0', '2265.65', '6155.81', '138.179', '3.41256', '3046:0 3042:0 '),\n('3048', 'bedg700', '530', '3522', '3768', '65', '70', '0', '2028.28', '6216.03', '134.538', '4.67706', '3041:0 3049:0 '),\n('3049', 'bedg701', '530', '3522', '3771', '65', '70', '0', '2041.4', '6592.18', '135.807', '3.54607', '3048:0 3050:0 3056:0 '),\n('3050', 'bedg702', '530', '3522', '3772', '65', '70', '3', '2066.72', '6735.02', '154.854', '4.59066', '3049:0 3051:0 3055:0 '),\n('3051', 'bedg703', '530', '3522', '3772', '65', '70', '2', '1972.28', '6779.92', '162.128', '1.46478', '3050:0 3052:0 '),\n('3052', 'bedg704', '530', '3522', '3772', '65', '70', '2', '1959.55', '6842.15', '158.876', '3.29476', '3051:0 3053:0 3059:0 '),\n('3053', 'bedg705', '530', '3522', '3772', '65', '70', '3', '2065.72', '6849.09', '172.562', '0.0589211', '3052:0 3054:0 '),\n('3054', 'bedg706', '530', '3522', '3772', '65', '70', '2', '2135.82', '6829.36', '173.431', '4.65351', '3053:0 3055:0 '),\n('3055', 'bedg707', '530', '3522', '3772', '65', '70', '2', '2140.28', '6753.83', '165.006', '3.40472', '3054:0 3050:0 '),\n('3056', 'bedg708', '530', '3522', '3771', '65', '70', '0', '1952.24', '6615.86', '143.542', '5.85751', '3049:0 3057:0 3058:0 '),\n('3057', 'bedg709', '530', '3522', '3771', '65', '70', '0', '1869.68', '6608.28', '143.783', '2.00906', '3056:0 3058:0 '),\n('3058', 'bedg710', '530', '3522', '3771', '65', '70', '0', '1867.3', '6714.18', '142.554', '2.81017', '3056:0 3057:0 3059:0 '),\n('3059', 'bedg711', '530', '3522', '3771', '65', '70', '0', '1794.79', '6806.46', '137.334', '0.147653', '3058:0 3052:0 3060:0 3079:0 '),\n('3060', 'bedg712', '530', '3522', '3782', '65', '70', '0', '1698.35', '6823.85', '136.031', '2.50777', '3059:0 3061:0 3066:0 3067:0 '),\n('3061', 'bedg713', '530', '3522', '3782', '65', '70', '0', '1660.38', '6861.71', '142.107', '2.01886', '3060:0 3062:0 '),\n('3062', 'bedg714', '530', '3522', '3782', '65', '70', '0', '1628.86', '6909.46', '152.556', '2.54312', '3061:0 3063:0 '),\n('3063', 'bedg715', '530', '3522', '3782', '65', '70', '0', '1565.97', '6934.47', '157.679', '0.579622', '3062:0 3064:0 '),\n('3064', 'bedg716', '530', '3522', '3782', '65', '70', '0', '1642.57', '6995.64', '157.952', '6.01458', '3063:0 3065:0 '),\n('3065', 'bedg717', '530', '3522', '3782', '65', '70', '0', '1706.57', '6967.44', '152.552', '5.15456', '3064:0 3066:0 '),\n('3066', 'bedg718', '530', '3522', '3782', '65', '70', '0', '1749.11', '6892.32', '140.635', '4.05192', '3065:0 3060:0 '),\n('3067', 'bedg719', '530', '3522', '3782', '65', '70', '0', '1636.12', '6812.12', '131.714', '0.187751', '3060:0 3068:0 3078:0 '),\n('3068', 'bedg720', '530', '3522', '3782', '65', '70', '0', '1569.95', '6826.69', '128.23', '3.23117', '3067:0 3069:0 '),\n('3069', 'bedg721', '530', '3522', '3522', '65', '70', '0', '1487.42', '6820.82', '107.218', '2.83454', '3068:0 3070:0 '),\n('3070', 'bedg722', '530', '3522', '3522', '65', '70', '0', '1418.63', '6847.18', '110.541', '2.77564', '3069:0 3071:0 '),\n('3071', 'bedg723', '530', '3522', '3522', '65', '70', '0', '1357.84', '6881.95', '95.233', '5.88189', '3070:0 3072:0 '),\n('3072', 'bedg724', '530', '3522', '3522', '65', '70', '0', '1305.01', '6962.51', '93.0961', '3.03875', '3071:0 3073:0 '),\n('3073', 'bedg725', '530', '3522', '3522', '65', '70', '0', '1224.71', '6978.54', '90.3881', '2.59893', '3072:0 3074:0 '),\n('3074', 'bedg726', '530', '3522', '3522', '65', '70', '0', '1145.67', '7048.89', '113.579', '2.41436', '3073:0 3075:0 '),\n('3075', 'bedg727', '530', '3522', '3522', '65', '70', '2', '1107.87', '7095.02', '122.35', '3.18012', '3074:0 3076:0 '),\n('3076', 'bedg728', '530', '3522', '3770', '65', '70', '2', '1053.11', '7098.72', '116.217', '0.376251', '3075:0 3077:0 '),\n('3077', 'bedg729', '530', '3522', '3770', '65', '70', '2', '1020.4', '7173.65', '86.2439', '1.66823', '3076:0 2582:0 '),\n('3078', 'bedg730', '530', '3522', '3824', '65', '70', '0', '1647.1', '6732.39', '116.704', '4.75248', '3067:0 3079:0 '),\n('3079', 'bedg731', '530', '3522', '3771', '65', '70', '0', '1740.86', '6736.89', '134.249', '0.774434', '3078:0 3059:0 3080:0 '),\n('3080', 'bedg732', '530', '3522', '3824', '65', '70', '0', '1628.32', '6690.04', '108.29', '6.13869', '3079:0 3081:0 '),\n('3081', 'bedg733', '530', '3522', '3824', '65', '70', '0', '1723.61', '6678.08', '87.8644', '5.8481', '3080:0 3082:0 '),\n('3082', 'bedg734', '530', '3522', '3824', '65', '70', '0', '1772.91', '6642.19', '74.5483', '2.51408', '3081:0 3083:0 '),\n('3083', 'bedg735', '530', '3522', '3824', '65', '70', '0', '1619.66', '6621.4', '33.3376', '3.64899', '3082:0 3084:0 '),\n('3084', 'bedg736', '530', '3522', '3824', '65', '70', '0', '1761.7', '6532.98', '4.13407', '5.72636', '3083:0 3085:0 3217:0 '),\n('3085', 'bedg737', '530', '3522', '3824', '65', '70', '0', '1936.85', '6455.82', '1.98027', '5.87558', '3084:0 3086:0 3215:0 '),\n('3086', 'bedg738', '530', '3522', '3824', '65', '70', '0', '2158.79', '6394.21', '-10.3376', '6.01302', '3085:0 3087:0 '),\n('3087', 'bedg739', '530', '3522', '3931', '65', '70', '0', '2352.32', '6410.86', '-10.3378', '0.246553', '3086:0 3088:0 3090:0 '),\n('3088', 'bedg740', '530', '3522', '3773', '65', '70', '0', '2401.13', '6465.38', '3.57212', '0.140524', '3087:0 3089:0 '),\n('3089', 'bedg741', '530', '3522', '3773', '65', '70', '0', '2489.83', '6479', '-6.94094', '0.898433', '3088:0 3090:0 3091:0 '),\n('3090', 'bedg742', '530', '3522', '3931', '65', '70', '0', '2486.13', '6407.7', '-10.338', '3.05435', '3089:0 3087:0 3097:0 '),\n('3091', 'bedg743', '530', '3522', '3773', '65', '70', '0', '2546.35', '6560.09', '1.844', '4.13898', '3089:0 3092:0 3093:0 3094:0 3096:0 '),\n('3092', 'bedg744', '530', '3522', '3773', '65', '70', '0', '2667.31', '6519.19', '0.94932', '5.95717', '3091:0 '),\n('3093', 'bedg745', '530', '3522', '3773', '65', '70', '0', '2613.6', '6682.32', '23.1547', '1.02881', '3091:0 3096:0 '),\n('3094', 'bedg746', '530', '3522', '3773', '65', '70', '0', '2376.02', '6637.4', '10.9828', '6.02394', '3091:0 3095:0 '),\n('3095', 'bedg747', '530', '3522', '3773', '65', '70', '0', '2482.22', '6684.55', '0.72676', '5.48987', '3094:0 3096:0 '),\n('3096', 'bedg748', '530', '3522', '3773', '65', '70', '0', '2570.07', '6610.1', '7.6561', '4.0683', '3095:0 3091:0 3093:0 '),\n('3097', 'bedg749', '530', '3522', '3931', '65', '70', '0', '2625.59', '6357.13', '-10.3379', '0.0313585', '3090:0 3098:0 3104:0 '),\n('3098', 'bedg750', '530', '3522', '3862', '65', '70', '0', '2747.24', '6390.91', '2.251', '5.27782', '3097:0 3099:0 '),\n('3099', 'bedg751', '530', '3522', '3862', '65', '70', '0', '2871.51', '6233.27', '11.692', '5.37992', '3098:0 3100:0 3104:0 '),\n('3100', 'bedg752', '530', '3522', '3862', '65', '70', '0', '2980.33', '6146.77', '4.99801', '5.25426', '3099:0 3101:0 '),\n('3101', 'bedg753', '530', '3522', '3826', '65', '70', '0', '3036.46', '6073.22', '0.772358', '5.36224', '3100:0 3102:0 '),\n('3102', 'bedg754', '530', '3522', '3826', '65', '70', '0', '3098.88', '6022.32', '1.18446', '4.5042', '3101:0 3103:0 '),\n('3103', 'bedg755', '530', '3522', '3826', '65', '70', '0', '3081.27', '5967.39', '-10.3385', '2.55249', '3102:0 3104:0 3108:0 '),\n('3104', 'bedg756', '530', '3522', '3825', '65', '70', '0', '2759.83', '6108.29', '-10.3396', '6.08285', '3099:0 3103:0 3097:0 3105:0 3111:0 '),\n('3105', 'bedg757', '530', '3522', '3825', '65', '70', '1', '2685.12', '5895.26', '-16.1123', '4.71862', '3104:0 3106:0 '),\n('3106', 'bedg758', '530', '3522', '3825', '65', '70', '0', '2687.78', '5785.12', '-16.8636', '4.73433', '3105:0 3107:0 '),\n('3107', 'bedg759', '530', '3522', '3904', '65', '70', '0', '2695.75', '5583.37', '-10.6374', '4.75001', '3106:0 '),\n('3108', 'bedg760', '530', '3522', '3826', '65', '70', '0', '3126.83', '5854.78', '-10.3341', '5.52444', '3103:0 3109:0 3110:0 '),\n('3109', 'bedg761', '530', '3522', '3826', '65', '70', '0', '3287.4', '5738.99', '-10.3325', '5.79933', '3108:0 3110:0 3115:0 '),\n('3110', 'bedg762', '530', '3522', '3826', '65', '70', '0', '3281.88', '5854.49', '-1.4584', '3.21929', '3109:0 3108:0 3115:0 '),\n('3111', 'bedg763', '530', '3522', '3825', '65', '70', '0', '2582.1', '6136.86', '24.0804', '4.49162', '3104:0 3112:0 '),\n('3112', 'bedg765', '530', '3522', '3825', '65', '70', '0', '2521.32', '6015.69', '84.9349', '2.22967', '3111:0 3113:0 '),\n('3113', 'bedg767', '530', '3522', '3768', '65', '70', '0', '2494.15', '6124.82', '111.3', '1.62492', '3114:0 3112:0 '),\n('3114', 'bedg768', '530', '3522', '3768', '65', '70', '0', '2427.5', '6152.5', '122.621', '2.74804', '3113:0 3046:0 '),\n('3115', 'bedg769', '530', '3522', '3826', '65', '70', '0', '3383.33', '5729.17', '-10.3389', '3.41014', '3109:0 3110:0 3116:0 3117:0 3126:0 '),\n('3116', 'bedg770', '530', '3522', '3777', '65', '70', '0', '3452.63', '5809.98', '1.12407', '0.865436', '3115:0 3118:0 '),\n('3117', 'bedg771', '530', '3522', '3826', '65', '70', '0', '3520', '5691.54', '-10.3386', '6.05377', '3115:0 3118:0 '),\n('3118', 'bedg772', '530', '3522', '3777', '65', '70', '0', '3523.18', '5795.46', '1.6669', '1.53041', '3117:0 3116:0 3119:0 '),\n('3119', 'bedg773', '530', '3522', '3826', '65', '70', '0', '3589.57', '5684.17', '-10.2714', '6.25066', '3118:0 3120:0 '),\n('3120', 'bedg774', '530', '3522', '3774', '65', '70', '0', '3660.48', '5491.29', '-20.7025', '5.0647', '3119:0 3125:0 '),\n('3121', 'bedg775', '530', '3522', '3774', '65', '70', '0', '3641.58', '5308.33', '-20.5148', '5.3867', '3122:0 3125:0 '),\n('3122', 'bedg776', '530', '3522', '3774', '65', '70', '0', '3587.11', '5221.49', '14.2925', '1.80371', '3123:0 3121:0 '),\n('3123', 'bedg777', '530', '3522', '3774', '65', '70', '0', '3438.2', '5241.29', '-6.61032', '0.307527', '3122:0 '),\n('3124', 'bedg779', '530', '3522', '3774', '65', '70', '0', '3593.15', '5382.62', '-9.51038', '0.0970404', '3125:0 '),\n('3125', 'bedg780', '530', '3522', '3774', '65', '70', '0', '3651.06', '5374.99', '-20.2357', '1.49502', '3124:0 3120:0 3121:0 '),\n('3126', 'bedg781', '530', '3522', '3826', '65', '70', '0', '3233.27', '5636.21', '38.3515', '5.69295', '3115:0 3127:0 '),\n('3127', 'bedg782', '530', '3522', '3826', '65', '70', '0', '3303.69', '5597.03', '55.3332', '6.0071', '3126:0 3128:0 '),\n('3128', 'bedg783', '530', '3522', '3826', '65', '70', '0', '3374.58', '5579.62', '85.0975', '4.19284', '3127:0 3129:0 '),\n('3129', 'bedg784', '530', '3522', '3828', '65', '70', '0', '3306.73', '5468.57', '141.818', '6.03852', '3128:0 3130:0 3133:0 '),\n('3130', 'bedg785', '530', '3522', '3828', '65', '70', '0', '3389.48', '5461.86', '145.745', '4.75047', '3129:0 3131:0 '),\n('3131', 'bedg786', '530', '3522', '3829', '65', '70', '0', '3363.88', '5342.13', '147.792', '3.91795', '3130:0 3132:0 '),\n('3132', 'bedg787', '530', '3522', '3829', '65', '70', '0', '3286', '5287.73', '147.247', '2.3825', '3131:0 3133:0 3136:0 '),\n('3133', 'bedg788', '530', '3522', '3828', '65', '70', '0', '3187.06', '5468.2', '146.95', '2.07226', '3132:0 3129:0 3134:0 '),\n('3134', 'bedg789', '530', '3522', '3828', '65', '70', '0', '3116.13', '5482.01', '145.293', '4.71905', '3133:0 3135:0 3137:0 '),\n('3135', 'bedg790', '530', '3522', '3829', '65', '70', '0', '3130.15', '5332.98', '148.604', '4.94682', '3134:0 3136:0 '),\n('3136', 'bedg791', '530', '3522', '3829', '65', '70', '0', '3215.6', '5360.26', '142.29', '5.42984', '3135:0 3132:0 '),\n('3137', 'bedg792', '530', '3522', '3828', '65', '70', '0', '2956.95', '5583.27', '146.351', '5.04498', '3134:0 3138:0 3140:0 '),\n('3138', 'bedg793', '530', '3522', '3952', '65', '70', '0', '2952.85', '5779.65', '134.692', '1.27116', '3137:0 3139:0 '),\n('3139', 'bedg794', '530', '3522', '3952', '65', '70', '0', '3050.1', '5991.54', '130.725', '1.20636', '3138:0 3192:0 '),\n('3140', 'bedg795', '530', '3522', '3951', '65', '70', '1', '2949.59', '5525.69', '144.16', '2.62095', '3137:0 3141:0 '),\n('3141', 'bedg796', '530', '3522', '3828', '65', '70', '0', '2915.37', '5365.92', '147.713', '1.64902', '3140:0 3142:0 '),\n('3142', 'bedg797', '530', '3522', '3867', '65', '70', '0', '2973.41', '5294.89', '183.643', '6.14688', '3141:0 3143:0 '),\n('3143', 'bedg798', '530', '3522', '3867', '65', '70', '0', '3038.23', '5281.8', '219.214', '4.54468', '3142:0 3144:0 '),\n('3144', 'bedg799', '530', '3522', '3867', '65', '70', '0', '3021.8', '5214.18', '250.296', '5.00414', '3143:0 3145:0 '),\n('3145', 'bedg800', '530', '3522', '3867', '65', '70', '0', '3082.54', '5063.01', '264.326', '4.87847', '3144:0 3146:0 3165:0 3166:0 '),\n('3146', 'bedg801', '530', '3522', '3867', '65', '70', '0', '3099.95', '4980.23', '265.505', '6.22935', '3145:0 3147:0 3172:0 3175:0 '),\n('3147', 'bedg802', '530', '3522', '3867', '65', '70', '0', '3304.97', '4970.79', '264.838', '5.68742', '3146:0 3148:0 3164:0 '),\n('3148', 'bedg803', '530', '3522', '3867', '65', '70', '0', '3434.24', '4937.21', '262.546', '5.47143', '3147:0 3149:0 3163:0 3164:0 '),\n('3149', 'bedg804', '530', '3522', '3867', '65', '70', '0', '3574.68', '4758.04', '240.131', '5.37718', '3148:0 3150:0 3156:0 '),\n('3150', 'bedg805', '530', '3522', '3863', '65', '70', '0', '3564.29', '4641.89', '228.617', '3.77105', '3149:0 3151:0 '),\n('3151', 'bedg806', '530', '3522', '3863', '65', '70', '0', '3459.92', '4594.26', '206.487', '3.08147', '3150:0 3152:0 3153:0 '),\n('3152', 'bedg807', '530', '3522', '3962', '65', '70', '0', '3346.24', '4594.8', '221.66', '2.70055', '3151:0 '),\n('3153', 'bedg808', '530', '3522', '3863', '65', '70', '0', '3393.49', '4543.75', '179.957', '4.49519', '3151:0 3154:0 '),\n('3154', 'bedg809', '530', '3522', '3863', '65', '70', '0', '3360.85', '4462.38', '157.372', '4.73472', '3153:0 3155:0 3223:0 '),\n('3155', 'bedg810', '530', '3522', '3863', '65', '70', '0', '3368.28', '4367.62', '122.375', '1.75021', '3154:0 3223:0 '),\n('3156', 'bedg811', '530', '3522', '3866', '65', '70', '0', '3701.21', '4770.37', '244.343', '1.75806', '3149:0 3157:0 '),\n('3157', 'bedg812', '530', '3522', '3866', '65', '70', '0', '3761.47', '4802.74', '254.61', '1.73842', '3156:0 3158:0 '),\n('3158', 'bedg813', '530', '3522', '3866', '65', '70', '0', '3738.29', '4879.52', '256.491', '2.75944', '3157:0 3159:0 '),\n('3159', 'bedg814', '530', '3522', '3866', '65', '70', '0', '3668.47', '4898.18', '260.046', '1.56956', '3158:0 3160:0 '),\n('3160', 'bedg815', '530', '3522', '3866', '65', '70', '0', '3668.33', '5008.48', '266.738', '4.7465', '3159:0 3161:0 3162:0 '),\n('3161', 'bedg816', '530', '3522', '3866', '65', '70', '0', '3732.68', '5010.06', '273.797', '4.86824', '3160:0 '),\n('3162', 'bedg817', '530', '3522', '3866', '65', '70', '0', '3581.65', '5022.38', '265.138', '6.01885', '3160:0 3163:0 '),\n('3163', 'bedg818', '530', '3522', '3866', '65', '70', '0', '3523.16', '4984.99', '269.146', '3.77261', '3162:0 3148:0 '),\n('3164', 'bedg819', '530', '3522', '3867', '65', '70', '0', '3312.28', '5066.6', '254.195', '4.73865', '3147:0 3148:0 3165:0 '),\n('3165', 'bedg820', '530', '3522', '3867', '65', '70', '0', '3243.07', '5149.71', '260.466', '2.97621', '3164:0 3145:0 '),\n('3166', 'bedg821', '530', '3522', '3942', '65', '70', '0', '2961.39', '5151.76', '265.026', '5.66383', '3145:0 3167:0 3171:0 '),\n('3167', 'bedg822', '530', '3522', '3942', '65', '70', '0', '2940.58', '5217.19', '264.835', '2.79713', '3166:0 3168:0 '),\n('3168', 'bedg823', '530', '3522', '3942', '65', '70', '0', '2844.64', '5234.99', '267.298', '3.70426', '3167:0 3169:0 '),\n('3169', 'bedg824', '530', '3522', '3942', '65', '70', '0', '2724.25', '5157.06', '265.076', '3.71605', '3168:0 3170:0 3176:0 '),\n('3170', 'bedg825', '530', '3522', '3867', '65', '70', '0', '2816.5', '5099.67', '265.683', '5.72666', '3169:0 3171:0 '),\n('3171', 'bedg826', '530', '3522', '3867', '65', '70', '0', '2900.18', '5096.37', '265.127', '0.775502', '3166:0 3170:0 3172:0 3175:0 '),\n('3172', 'bedg827', '530', '3522', '3787', '65', '70', '0', '2929.12', '4947.5', '266.731', '4.91062', '3146:0 3171:0 3173:0 3175:0 '),\n('3173', 'bedg828', '530', '3522', '3787', '65', '70', '0', '2898.72', '4782.92', '277.957', '4.52971', '3172:0 3174:0 '),\n('3174', 'bedg829', '530', '3522', '3787', '65', '70', '0', '2984.26', '4824.35', '278.892', '1.56875', '3173:0 3175:0 '),\n('3175', 'bedg830', '530', '3522', '3787', '65', '70', '0', '2852.35', '4933.54', '267.974', '6.12327', '3174:0 3172:0 3146:0 3171:0 '),\n('3176', 'bedg831', '530', '3522', '3833', '65', '70', '0', '2545.57', '5293.37', '266.598', '6.1005', '3169:0 3177:0 3191:0 '),\n('3177', 'bedg832', '530', '3522', '3833', '65', '70', '0', '2456.71', '5321.66', '264.923', '2.73899', '3176:0 3178:0 3184:0 3191:0 '),\n('3178', 'bedg833', '530', '3522', '3833', '65', '70', '0', '2282.88', '5171.44', '264.676', '3.69325', '3177:0 3179:0 3184:0 '),\n('3179', 'bedg834', '530', '3522', '3953', '65', '70', '0', '2194.7', '5122.32', '258.602', '4.28623', '3178:0 3180:0 '),\n('3180', 'bedg835', '530', '3522', '3953', '65', '70', '0', '2189.16', '5051.76', '252.603', '2.1395', '3179:0 3181:0 '),\n('3181', 'bedg836', '530', '3522', '3953', '65', '70', '0', '2116.51', '5085.08', '256.974', '5.94279', '3180:0 3182:0 3185:0 '),\n('3182', 'bedg837', '530', '3522', '3953', '65', '70', '0', '2090.4', '5162.61', '265.04', '2.37496', '3181:0 3183:0 3187:0 '),\n('3183', 'bedg838', '530', '3522', '3953', '65', '70', '0', '2063.34', '5235.11', '265.179', '0.122197', '3182:0 3184:0 '),\n('3184', 'bedg839', '530', '3522', '3833', '65', '70', '0', '2316.24', '5243.18', '261.206', '0.031876', '3183:0 3178:0 3177:0 '),\n('3185', 'bedg840', '530', '3522', '3953', '65', '70', '0', '2089.3', '5022.57', '223.769', '0.835746', '3181:0 3186:0 '),\n('3186', 'bedg841', '530', '3522', '3953', '65', '70', '0', '2164.72', '5005.6', '178.623', '5.23199', '3185:0 3028:0 '),\n('3187', 'bedg842', '530', '3522', '3953', '65', '70', '0', '1740.09', '5133.27', '265.058', '3.33132', '3182:0 3188:0 '),\n('3188', 'bedg843', '530', '3522', '3919', '65', '70', '0', '1674.61', '5254.04', '265.321', '1.92546', '3187:0 3189:0 '),\n('3189', 'bedg844', '530', '3522', '3919', '65', '70', '0', '1612.29', '5464.5', '265.941', '1.8587', '3188:0 2998:0 2997:0 '),\n('3190', 'bedg845', '530', '3522', '3833', '65', '70', '0', '2395.42', '5588.73', '267.895', '5.88623', '2989:0 3191:0 '),\n('3191', 'bedg846', '530', '3522', '3833', '65', '70', '0', '2397.69', '5390.93', '264.287', '4.72385', '3190:0 3177:0 3176:0 '),\n('3192', 'bedg847', '530', '3522', '3954', '65', '70', '0', '3094.62', '6101.88', '130.589', '1.3065', '3139:0 3193:0 '),\n('3193', 'bedg848', '530', '3522', '3954', '65', '70', '0', '3120.37', '6181.58', '137.697', '1.30738', '3192:0 3194:0 '),\n('3194', 'bedg849', '530', '3522', '3954', '65', '70', '0', '3147.57', '6248.67', '124.212', '0.486635', '3193:0 3195:0 '),\n('3195', 'bedg850', '530', '3522', '3954', '65', '70', '0', '3217.19', '6289.41', '124.654', '1.62939', '3194:0 3196:0 '),\n('3196', 'bedg851', '530', '3522', '3954', '65', '70', '0', '3215.71', '6365.94', '119.805', '1.02856', '3195:0 3197:0 '),\n('3197', 'bedg852', '530', '3522', '3954', '65', '70', '0', '3279.94', '6464.48', '149.929', '0.887189', '3196:0 3198:0 '),\n('3198', 'bedg853', '530', '3522', '3830', '65', '70', '0', '3323.9', '6505.86', '159.443', '0.796868', '3197:0 3199:0 3214:0 '),\n('3199', 'bedg854', '530', '3522', '3781', '65', '70', '0', '3488.68', '6673.14', '148.361', '0.895043', '3198:0 3200:0 3214:0 '),\n('3200', 'bedg855', '530', '3522', '3781', '65', '70', '0', '3566.67', '6807.32', '137.289', '2.01031', '3199:0 3201:0 3210:0 '),\n('3201', 'bedg856', '530', '3522', '3830', '65', '70', '0', '3446.01', '7089.42', '152.831', '1.97497', '3200:0 3202:0 3204:0 3205:0 '),\n('3202', 'bedg857', '530', '3522', '3830', '65', '70', '0', '3286.14', '7143.51', '168.873', '3.41617', '3201:0 3203:0 '),\n('3203', 'bedg858', '530', '3522', '3830', '65', '70', '0', '3303.87', '6962.97', '164.125', '0.482707', '3202:0 3204:0 '),\n('3204', 'bedg859', '530', '3522', '3830', '65', '70', '0', '3360.25', '6980.78', '163.409', '0.305992', '3203:0 3201:0 '),\n('3205', 'bedg860', '530', '3522', '3903', '65', '70', '0', '3481.37', '7222.76', '141.365', '1.30345', '3201:0 3206:0 '),\n('3206', 'bedg861', '530', '3522', '3903', '65', '70', '0', '3590.93', '7211.94', '137.85', '5.43858', '3205:0 3207:0 '),\n('3207', 'bedg862', '530', '3522', '3903', '65', '70', '0', '3641.59', '7154.45', '142.814', '5.19904', '3206:0 3208:0 '),\n('3208', 'bedg863', '530', '3522', '3903', '65', '70', '0', '3697.31', '7047.11', '149.054', '4.94771', '3207:0 3209:0 '),\n('3209', 'bedg864', '530', '3522', '3830', '65', '70', '0', '3765.97', '6838.37', '141.277', '4.82598', '3208:0 3210:0 '),\n('3210', 'bedg865', '530', '3522', '3781', '65', '70', '0', '3736.74', '6702.81', '136.262', '4.17018', '3200:0 3209:0 3211:0 '),\n('3211', 'bedg866', '530', '3522', '3781', '65', '70', '0', '3630.09', '6582.49', '134.163', '3.31724', '3210:0 3212:0 '),\n('3212', 'bedg867', '530', '3522', '3781', '65', '70', '0', '3502.63', '6555.2', '131.654', '3.74921', '3211:0 3213:0 '),\n('3213', 'bedg868', '530', '3522', '3830', '65', '70', '0', '3447.34', '6507.7', '134.998', '3.17979', '3212:0 3214:0 '),\n('3214', 'bedg869', '530', '3522', '3830', '65', '70', '0', '3367.73', '6538.54', '150.282', '2.78317', '3198:0 3213:0 3199:0 '),\n('3215', 'bedg870', '530', '3522', '3824', '65', '70', '0', '1832.55', '6314.24', '0.000980531', '2.39439', '3085:0 3216:0 '),\n('3216', 'bedg871', '530', '3522', '3824', '65', '70', '0', '1739.41', '6384.91', '-10.3385', '3.01878', '3215:0 3217:0 '),\n('3217', 'bedg872', '530', '3522', '3776', '65', '70', '0', '1654.93', '6407.76', '-10.1815', '2.87741', '3216:0 3084:0 3218:0 '),\n('3218', 'bedg873', '530', '3522', '3776', '65', '70', '0', '1604.99', '6316.74', '1.22794', '4.18509', '3217:0 3219:0 '),\n('3219', 'bedg874', '530', '3522', '3824', '65', '70', '0', '1475.3', '6532.8', '-10.3385', '5.60273', '3218:0 3220:0 '),\n('3220', 'bedg876', '530', '3522', '3778', '65', '70', '0', '1361.1', '6534.43', '6.43101', '6.15055', '3219:0 3221:0 '),\n('3221', 'bedg877', '530', '3522', '3778', '65', '70', '0', '1339.54', '6590.17', '-8.16829', '2.78314', '3222:0 3220:0 '),\n('3222', 'bedg878', '530', '3522', '3778', '65', '70', '0', '1355.69', '6688.28', '-22.7054', '2.60447', '3221:0 '),\n('3223', 'net880', '530', '3523', '3868', '67', '70', '0', '3385.12', '4257.44', '122.681', '4.84713', '3154:0 3155:0 3224:0 '),\n('3224', 'net881', '530', '3523', '3523', '67', '70', '0', '3394.02', '4139.94', '151.096', '1.574', '3223:0 3225:0 '),\n('3225', 'net883', '530', '3523', '3523', '67', '70', '0', '3433.77', '4036.61', '177.446', '4.57617', '3226:0 3224:0 '),\n('3226', 'net884', '530', '3523', '3523', '67', '70', '0', '3443.07', '3946.93', '166.449', '4.15205', '3225:0 3227:0 '),\n('3227', 'net885', '530', '3523', '3523', '67', '70', '0', '3403.88', '3894.6', '153.082', '3.72008', '3226:0 3228:0 '),\n('3228', 'net886', '530', '3523', '3523', '67', '70', '0', '3356.69', '3870.95', '144.623', '4.91389', '3227:0 3229:0 3238:0 3239:0 '),\n('3229', 'net887', '530', '3523', '3523', '67', '70', '0', '3379', '3814.14', '142.822', '4.46228', '3228:0 3230:0 '),\n('3230', 'net888', '530', '3523', '3725', '67', '70', '0', '3356.46', '3730.03', '141.12', '5.51863', '3229:0 3231:0 '),\n('3231', 'net889', '530', '3523', '3725', '67', '70', '0', '3395.58', '3698.26', '144.989', '5.91132', '3230:0 3232:0 '),\n('3232', 'net890', '530', '3523', '3725', '67', '70', '0', '3463.55', '3674.25', '150.706', '4.98848', '3231:0 3233:0 '),\n('3233', 'net891', '530', '3523', '3725', '67', '70', '0', '3489.72', '3601.83', '158.293', '4.35231', '3232:0 3234:0 '),\n('3234', 'net892', '530', '3523', '3725', '67', '70', '0', '3537.5', '3575.94', '135.389', '2.48697', '3233:0 3235:0 '),\n('3235', 'net893', '530', '3523', '3725', '67', '70', '0', '3582.4', '3548.11', '124.35', '1.42276', '3234:0 3236:0 '),\n('3236', 'net894', '530', '3523', '3721', '67', '70', '0', '3601.15', '3625.27', '127.148', '2.16889', '3235:0 3237:0 '),\n('3237', 'net895', '530', '3523', '3725', '67', '70', '0', '3506.7', '3744.78', '141.004', '1.82724', '3236:0 3238:0 '),\n('3238', 'net896', '530', '3523', '3523', '67', '70', '0', '3492.41', '3820.83', '138.898', '2.78542', '3237:0 3228:0 '),\n('3239', 'net897', '530', '3523', '3523', '67', '70', '0', '3288.33', '3814.38', '139.103', '3.2089', '3228:0 3240:0 '),\n('3240', 'net898', '530', '3523', '3523', '67', '70', '0', '3228.8', '3802.26', '137.833', '3.34242', '3239:0 3241:0 3272:0 3273:0 '),\n('3241', 'net899', '530', '3523', '3712', '67', '70', '0', '3127.16', '3690.44', '142.929', '3.42881', '3240:0 3272:0 3273:0 3278:0 '),\n('3242', 'net903', '530', '3523', '3712', '67', '70', '0', '2999.35', '3698.08', '144.031', '2.76314', '3243:0 3269:0 3277:0 3270:0 '),\n('3243', 'net904', '530', '3523', '3712', '67', '70', '0', '2922.84', '3722.08', '143.833', '1.69299', '3244:0 3242:0 '),\n('3244', 'net905', '530', '3523', '3523', '67', '70', '0', '2885.06', '3679.8', '140.256', '0.687686', '3243:0 3245:0 '),\n('3245', 'net906', '530', '3523', '3523', '67', '70', '0', '2816.99', '3697.81', '120.765', '3.2795', '3244:0 3246:0 '),\n('3246', 'net907', '530', '3523', '3523', '67', '70', '0', '2757.67', '3673.48', '134.526', '2.26241', '3245:0 3247:0 3290:0 '),\n('3247', 'net908', '530', '3523', '3729', '67', '70', '0', '2719.32', '3721.32', '139.083', '3.091', '3246:0 3248:0 '),\n('3248', 'net909', '530', '3523', '3729', '67', '70', '0', '2639.32', '3732.64', '144.622', '2.23884', '3247:0 3249:0 '),\n('3249', 'net910', '530', '3523', '3729', '67', '70', '0', '2585.42', '3776.42', '143.482', '2.4509', '3248:0 3250:0 3293:0 '),\n('3250', 'net911', '530', '3523', '3729', '67', '70', '0', '2514.06', '3815.49', '129.888', '2.12889', '3249:0 3251:0 '),\n('3251', 'net912', '530', '3523', '3729', '67', '70', '0', '2508.94', '3883.67', '132.691', '1.6655', '3250:0 3252:0 '),\n('3252', 'net913', '530', '3523', '3729', '67', '70', '0', '2477.31', '4067.17', '130.201', '5.03879', '3251:0 3253:0 '),\n('3253', 'net914', '530', '3523', '3523', '67', '70', '0', '2545.65', '4202.77', '136.176', '0.542382', '3252:0 3254:0 '),\n('3254', 'net915', '530', '3523', '3523', '67', '70', '0', '2609.03', '4303.08', '140.386', '0.000453472', '3253:0 3255:0 '),\n('3255', 'net916', '530', '3523', '3726', '67', '70', '0', '2747.27', '4290.97', '151.997', '6.19723', '3254:0 3256:0 '),\n('3256', 'net917', '530', '3523', '3726', '67', '70', '0', '2895.85', '4349.05', '157.653', '4.53219', '3255:0 3257:0 '),\n('3257', 'net918', '530', '3523', '3726', '67', '70', '0', '2865.03', '4280.18', '159.366', '5.10554', '3256:0 3258:0 '),\n('3258', 'net919', '530', '3523', '3726', '67', '70', '0', '2890.62', '4215.62', '164.008', '5.09376', '3257:0 3259:0 3266:0 '),\n('3259', 'net920', '530', '3523', '3726', '67', '70', '0', '2940.62', '4199.62', '164.007', '0.322464', '3258:0 3260:0 3265:0 '),\n('3260', 'net921', '530', '3523', '3726', '67', '70', '0', '2999.27', '4224.49', '160.851', '0.401004', '3259:0 3261:0 '),\n('3261', 'net922', '530', '3523', '3726', '67', '70', '0', '3026.75', '4163.73', '153.291', '4.74035', '3260:0 3262:0 '),\n('3262', 'net923', '530', '3523', '3726', '67', '70', '0', '3010.04', '4106.05', '150.967', '4.08455', '3261:0 3263:0 '),\n('3263', 'net924', '530', '3523', '3726', '67', '70', '0', '2977.7', '4033.08', '148.218', '1.89329', '3262:0 3264:0 3267:0 '),\n('3264', 'net925', '530', '3523', '3726', '67', '70', '0', '2939.58', '4099.08', '162.599', '2.04252', '3263:0 3265:0 '),\n('3265', 'net926', '530', '3523', '3726', '67', '70', '0', '2918.39', '4149.56', '164.008', '1.96398', '3264:0 3259:0 3266:0 '),\n('3266', 'net927', '530', '3523', '3726', '67', '70', '0', '2870.91', '4167.67', '164.007', '1.92863', '3265:0 3258:0 '),\n('3267', 'net928', '530', '3523', '3523', '67', '70', '0', '2982.92', '3921.89', '146.316', '1.62627', '3263:0 3268:0 '),\n('3268', 'net929', '530', '3523', '3523', '67', '70', '0', '3051.56', '3890.86', '143.683', '5.83993', '3267:0 3269:0 '),\n('3269', 'net930', '530', '3523', '3712', '67', '70', '0', '3039.6', '3790.04', '145.363', '4.28485', '3268:0 3271:0 3242:0 '),\n('3270', 'net931', '530', '3523', '3712', '67', '70', '0', '3064.35', '3704.05', '142.478', '3.15387', '3242:0 3278:0 '),\n('3271', 'net932', '530', '3523', '3523', '67', '70', '0', '3092.9', '3822.62', '142.74', '5.9106', '3269:0 3272:0 '),\n('3272', 'net933', '530', '3523', '3523', '67', '70', '0', '3125.95', '3779.17', '142.072', '0.118293', '3271:0 3241:0 3240:0 '),\n('3273', 'net934', '530', '3523', '3523', '67', '70', '0', '3196.76', '3711.71', '129.813', '5.90669', '3241:0 3240:0 3274:0 '),\n('3274', 'net935', '530', '3523', '3523', '67', '70', '0', '3253.35', '3630.84', '126.607', '3.66438', '3273:0 3275:0 '),\n('3275', 'net936', '530', '3523', '3523', '67', '70', '0', '3139.27', '3579.06', '142.77', '3.24419', '3274:0 3276:0 '),\n('3276', 'net937', '530', '3523', '3712', '67', '70', '0', '3046.95', '3595.34', '143.235', '1.59486', '3275:0 3279:0 3278:0 '),\n('3277', 'net938', '530', '3523', '3712', '1', '60', '0', '2935.94', '3648.71', '132.577', '0.379446', '3242:0 3278:0 '),\n('3278', 'net939', '530', '3523', '3712', '67', '70', '1', '3062.95', '3645.68', '144.33', '5.51596', '3241:0 3276:0 3277:0 3270:0 '),\n('3279', 'net940', '530', '3523', '3523', '67', '70', '0', '3016.58', '3539.17', '143.581', '3.54657', '3276:0 3280:0 3294:0 '),\n('3280', 'net941', '530', '3523', '3523', '67', '70', '0', '2859.55', '3471.67', '136.322', '0.389269', '3279:0 3281:0 3288:0 '),\n('3281', 'net942', '530', '3523', '3723', '67', '70', '0', '2805.81', '3360.76', '144.743', '4.68931', '3280:0 3282:0 '),\n('3282', 'net944', '530', '3523', '3723', '67', '70', '0', '2802.57', '3251.58', '147.597', '1.60466', '3281:0 3283:0 '),\n('3283', 'net945', '530', '3523', '3723', '67', '70', '0', '2769.35', '3153.34', '149.314', '2.61194', '3284:0 3282:0 '),\n('3284', 'net946', '530', '3523', '3723', '67', '70', '0', '2713.25', '3168.67', '147.073', '4.21416', '3283:0 3285:0 '),\n('3285', 'net947', '530', '3523', '3721', '67', '70', '0', '2645.59', '3055.71', '123.459', '0.911553', '3284:0 3286:0 3301:0 3302:0 '),\n('3286', 'net948', '530', '3523', '3723', '67', '70', '0', '2635.1', '3154.85', '135.257', '1.35923', '3285:0 3287:0 '),\n('3287', 'net949', '530', '3523', '3523', '67', '70', '0', '2617.24', '3347.94', '142.696', '1.66554', '3286:0 3288:0 3291:0 '),\n('3288', 'net950', '530', '3523', '3523', '67', '70', '0', '2742.84', '3444.31', '140.23', '4.12776', '3287:0 3280:0 3289:0 '),\n('3289', 'net951', '530', '3523', '3523', '67', '70', '0', '2704.66', '3571.67', '134.738', '5.57132', '3288:0 3290:0 '),\n('3290', 'net952', '530', '3523', '3523', '67', '70', '0', '2828.97', '3612.56', '157.278', '2.2157', '3289:0 3246:0 '),\n('3291', 'net953', '530', '3523', '3721', '67', '70', '0', '2522.14', '3469.45', '130.706', '1.47151', '3287:0 3292:0 '),\n('3292', 'net954', '530', '3523', '3523', '67', '70', '0', '2544.17', '3592.01', '138.626', '1.39297', '3291:0 3293:0 '),\n('3293', 'net955', '530', '3523', '3721', '67', '70', '0', '2528.36', '3697.54', '134.608', '0.964924', '3292:0 3249:0 '),\n('3294', 'net956', '530', '3523', '3523', '67', '70', '0', '3051.39', '3455.12', '118.577', '4.822', '3279:0 3295:0 '),\n('3295', 'net957', '530', '3523', '3523', '67', '70', '0', '3057.51', '3309.81', '106.678', '5.00264', '3294:0 3296:0 '),\n('3296', 'net958', '530', '3523', '3721', '67', '70', '0', '3103.15', '3197.03', '101.208', '5.67416', '3295:0 3297:0 3298:0 '),\n('3297', 'net959', '530', '3523', '3721', '67', '70', '0', '3221.06', '3114.67', '102.79', '5.68986', '3296:0 3339:0 3340:0 '),\n('3298', 'net960', '530', '3523', '3921', '67', '70', '0', '2987.27', '3194.73', '134.342', '4.05624', '3296:0 3299:0 '),\n('3299', 'net961', '530', '3523', '3921', '67', '70', '0', '2929.07', '3149.43', '147.291', '1.12512', '3298:0 3300:0 '),\n('3300', 'net962', '530', '3523', '3721', '67', '70', '0', '2829.63', '2992.81', '120.478', '2.75876', '3299:0 3301:0 '),\n('3301', 'net963', '530', '3523', '3721', '67', '70', '0', '2726.18', '3015.49', '121.825', '2.99045', '3300:0 3285:0 '),\n('3302', 'net964', '530', '3523', '3721', '67', '70', '0', '2519.49', '2940.34', '119.757', '3.88108', '3285:0 3303:0 '),\n('3303', 'net965', '530', '3523', '3730', '67', '70', '0', '2455.26', '2867.95', '131.925', '4.34839', '3302:0 3304:0 3308:0 '),\n('3304', 'net966', '530', '3523', '3730', '67', '70', '0', '2531.85', '2827', '126.995', '4.61936', '3305:0 3303:0 '),\n('3305', 'net967', '530', '3523', '3730', '67', '70', '0', '2555.92', '2738.68', '119.45', '1.55822', '3304:0 3306:0 3330:0 '),\n('3306', 'net970', '530', '3523', '3730', '67', '70', '0', '2501.34', '2718.83', '131.657', '2.74617', '3307:0 3305:0 3329:0 '),\n('3307', 'net971', '530', '3523', '3730', '67', '70', '0', '2440.85', '2747.78', '134.493', '2.69511', '3308:0 3310:0 3306:0 '),\n('3308', 'net972', '530', '3523', '3730', '67', '70', '0', '2424.83', '2798.75', '134.493', '1.0929', '3307:0 3309:0 3303:0 '),\n('3309', 'net973', '530', '3523', '3730', '67', '70', '0', '2364.39', '2781.17', '133.656', '5.81904', '3308:0 3310:0 '),\n('3310', 'net974', '530', '3523', '3730', '67', '70', '0', '2392.65', '2726.98', '134.491', '5.0199', '3307:0 3309:0 3311:0 '),\n('3311', 'net975', '530', '3523', '3730', '67', '70', '0', '2364.76', '2665.91', '130.977', '1.12433', '3310:0 3312:0 '),\n('3312', 'net976', '530', '3523', '3523', '67', '70', '0', '2326', '2600.19', '126.548', '4.98456', '3311:0 3313:0 '),\n('3313', 'net977', '530', '3523', '3523', '67', '70', '0', '2287.03', '2439.79', '104.053', '4.47406', '3312:0 3314:0 '),\n('3314', 'net978', '530', '3523', '3523', '67', '70', '0', '2336.37', '2367.16', '115.816', '5.18877', '3313:0 3327:0 3315:0 '),\n('3315', 'net979', '530', '3523', '3523', '67', '70', '0', '2310.67', '2271.59', '98.2741', '5.2673', '3314:0 3316:0 3321:0 '),\n('3316', 'net981', '530', '3523', '3935', '67', '70', '0', '2246.67', '2310.26', '89.8977', '3.71223', '3317:0 3326:0 3315:0 '),\n('3317', 'net982', '530', '3523', '3934', '67', '70', '0', '2176.86', '2262.3', '76.0387', '4.01068', '3316:0 3318:0 3326:0 '),\n('3318', 'net983', '530', '3523', '3934', '67', '70', '0', '2119.56', '2206.31', '71.3039', '6.1607', '3317:0 3319:0 '),\n('3319', 'net984', '530', '3523', '3934', '67', '70', '0', '2180.34', '2173.31', '71.6002', '5.61288', '3318:0 3320:0 '),\n('3320', 'net985', '530', '3523', '3934', '67', '70', '0', '2233.52', '2115.22', '71.2016', '2.29655', '3319:0 3321:0 '),\n('3321', 'net987', '530', '3523', '3934', '67', '70', '0', '2294.17', '2189.49', '93.5883', '6.28047', '3322:0 3315:0 3320:0 '),\n('3322', 'net990', '530', '3523', '3934', '67', '70', '0', '2353.3', '2183.05', '89.3993', '6.15874', '3321:0 3323:0 '),\n('3323', 'net991', '530', '3523', '3879', '67', '70', '0', '2411.12', '2183.37', '89.9985', '4.94529', '3322:0 3324:0 '),\n('3324', 'net992', '530', '3523', '3879', '67', '70', '0', '2523.75', '2185.83', '102.693', '5.98201', '3323:0 3325:0 '),\n('3325', 'net993', '530', '3523', '3879', '67', '70', '0', '2484.6', '2033.27', '88.1469', '4.36606', '3324:0 '),\n('3326', 'net997', '530', '3523', '3935', '67', '70', '0', '2183.73', '2382.64', '98.0661', '5.72675', '3316:0 3317:0 '),\n('3327', 'net999', '530', '3523', '3837', '67', '70', '0', '2400.24', '2395.93', '142.613', '3.9737', '3328:0 3314:0 '),\n('3328', 'net1000', '530', '3523', '3837', '67', '70', '0', '2482.84', '2424.13', '134.571', '3.45533', '3327:0 3329:0 '),\n('3329', 'net1001', '530', '3523', '3523', '67', '70', '0', '2516.55', '2638.79', '129.583', '6.18383', '3328:0 3306:0 3330:0 '),\n('3330', 'net1003', '530', '3523', '3523', '67', '70', '0', '2599.94', '2630.3', '129.384', '5.99453', '3305:0 3329:0 3331:0 '),\n('3331', 'net1004', '530', '3523', '3721', '67', '70', '0', '2697.9', '2608.37', '102.479', '0.0883238', '3332:0 3330:0 '),\n('3332', 'net1005', '530', '3523', '3721', '67', '70', '0', '2824.9', '2626.19', '104.537', '0.139375', '3331:0 3333:0 '),\n('3333', 'net1006', '530', '3523', '3523', '67', '70', '0', '2944.38', '2624.27', '115.88', '6.27726', '3332:0 3334:0 '),\n('3334', 'net1007', '530', '3523', '3523', '67', '70', '0', '3044.31', '2606.49', '109.94', '6.10839', '3333:0 3335:0 3364:0 '),\n('3335', 'net1008', '530', '3523', '3523', '67', '70', '0', '3088.57', '2759.93', '115.588', '1.28997', '3334:0 3336:0 '),\n('3336', 'net1009', '530', '3523', '3523', '67', '70', '0', '3181.15', '2839.31', '132.63', '0.00191784', '3335:0 3337:0 '),\n('3337', 'net1010', '530', '3523', '3877', '67', '70', '0', '3314.68', '2857.1', '140.864', '0.174705', '3336:0 3338:0 3348:0 '),\n('3338', 'net1011', '530', '3523', '3523', '67', '70', '0', '3251.04', '2889.15', '139.525', '5.61752', '3337:0 3339:0 '),\n('3339', 'net1012', '530', '3523', '3523', '67', '70', '0', '3260.45', '2979.53', '133.71', '1.72431', '3338:0 3297:0 '),\n('3340', 'net1013', '530', '3523', '3721', '67', '70', '0', '3328.19', '3109.33', '123.938', '0.003479', '3297:0 3341:0 '),\n('3341', 'net1014', '530', '3523', '3721', '67', '70', '0', '3467.09', '3253.66', '100.83', '0.804579', '3340:0 3342:0 '),\n('3342', 'net1015', '530', '3523', '3523', '67', '70', '0', '3558.21', '3192.19', '105.717', '5.68976', '3341:0 3343:0 '),\n('3343', 'net1016', '530', '3523', '3877', '67', '70', '0', '3523.96', '3113.12', '130.592', '4.30353', '3342:0 3344:0 '),\n('3344', 'net1017', '530', '3523', '3877', '67', '70', '0', '3511.13', '3048.77', '142.826', '5.09678', '3343:0 3345:0 '),\n('3345', 'net1018', '530', '3523', '3877', '67', '70', '0', '3536.43', '3000.68', '143.097', '5.20281', '3344:0 3349:0 3346:0 '),\n('3346', 'net1020', '530', '3523', '3877', '67', '70', '0', '3646.43', '3045.04', '123.609', '0.195882', '3345:0 3347:0 '),\n('3347', 'net1021', '530', '3523', '3523', '67', '70', '0', '3924.41', '3119.4', '115.634', '0.278359', '3480:0 3346:0 '),\n('3348', 'net1022', '530', '3523', '3877', '67', '70', '1', '3410.82', '2878.14', '142.972', '0.18804', '3337:0 3349:0 3350:0 '),\n('3349', 'net1023', '530', '3523', '3877', '67', '70', '0', '3473.27', '2973.11', '143.266', '0.989146', '3348:0 3345:0 '),\n('3350', 'net1024', '530', '3523', '3877', '67', '70', '0', '3472.55', '2819.87', '145.201', '4.69465', '3348:0 3351:0 '),\n('3351', 'net1025', '530', '3523', '3523', '67', '70', '0', '3576.26', '2719.73', '151.525', '3.15525', '3350:0 3352:0 '),\n('3352', 'net1026', '530', '3523', '3523', '67', '70', '0', '3439.56', '2608.19', '150.833', '0.802981', '3351:0 3353:0 '),\n('3353', 'net1027', '530', '3523', '3523', '67', '70', '0', '3372.76', '2617.96', '145.564', '2.25596', '3352:0 3354:0 3357:0 '),\n('3354', 'net1028', '530', '3523', '3727', '67', '70', '0', '3328.76', '2674.02', '157.504', '3.71287', '3353:0 3355:0 '),\n('3355', 'net1029', '530', '3523', '3727', '67', '70', '0', '3250.52', '2628.38', '139.888', '2.91962', '3354:0 3356:0 '),\n('3356', 'net1030', '530', '3523', '3523', '67', '70', '0', '3285.42', '2563.6', '113.658', '4.09772', '3355:0 3357:0 '),\n('3357', 'net1031', '530', '3523', '3523', '67', '70', '0', '3352.87', '2536.5', '95.7401', '1.21138', '3353:0 3356:0 3358:0 '),\n('3358', 'net1033', '530', '3523', '3728', '67', '70', '0', '3246.86', '2379.03', '91.5897', '4.38044', '3357:0 3359:0 '),\n('3359', 'net1035', '530', '3523', '3728', '67', '70', '0', '3241.13', '2272.31', '99.5301', '4.56501', '3358:0 3360:0 '),\n('3360', 'net1037', '530', '3523', '3728', '67', '70', '0', '3202.86', '2140.94', '138.867', '1.63547', '3377:0 3359:0 3361:0 '),\n('3361', 'net1039', '530', '3523', '3728', '67', '70', '0', '3162.82', '2326.75', '134.887', '1.78864', '3360:0 3362:0 '),\n('3362', 'net1040', '530', '3523', '3728', '67', '70', '0', '3160.48', '2406.47', '131.04', '1.60014', '3363:0 3361:0 '),\n('3363', 'net1041', '530', '3523', '3728', '67', '70', '0', '3113.17', '2449.04', '120.183', '2.1774', '3362:0 3364:0 '),\n('3364', 'net1042', '530', '3523', '3728', '67', '70', '0', '3069.26', '2504.52', '114.18', '1.78077', '3363:0 3334:0 3365:0 '),\n('3365', 'net1043', '530', '3523', '3734', '67', '70', '0', '3083.75', '2363.04', '144.526', '4.81242', '3364:0 3366:0 '),\n('3366', 'net1044', '530', '3523', '3734', '67', '70', '0', '3085.33', '2294.83', '150.494', '4.74173', '3365:0 3367:0 3373:0 '),\n('3367', 'net1045', '530', '3523', '3734', '67', '70', '0', '3125.61', '2238.22', '150.562', '3.67359', '3366:0 3368:0 '),\n('3368', 'net1046', '530', '3523', '3734', '67', '70', '0', '3074.15', '2209.78', '161.33', '3.55578', '3367:0 3369:0 '),\n('3369', 'net1047', '530', '3523', '3734', '67', '70', '0', '3017.03', '2183.87', '165.329', '3.55578', '3368:0 3370:0 3372:0 '),\n('3370', 'net1048', '530', '3523', '3734', '67', '70', '0', '2998.08', '2133.47', '165.328', '4.35295', '3369:0 3371:0 3374:0 '),\n('3371', 'net1049', '530', '3523', '3734', '67', '70', '0', '2946.6', '2153.28', '165.328', '2.77429', '3370:0 3372:0 '),\n('3372', 'net1050', '530', '3523', '3734', '67', '70', '0', '2965.73', '2206.06', '165.328', '1.22313', '3371:0 3369:0 3373:0 '),\n('3373', 'net1051', '530', '3523', '3734', '67', '70', '0', '2936.31', '2281.19', '161.738', '6.1684', '3366:0 3372:0 '),\n('3374', 'net1054', '530', '3523', '3734', '67', '70', '0', '3024.32', '2073.46', '161.904', '5.51533', '3370:0 3375:0 '),\n('3375', 'net1055', '530', '3523', '3728', '67', '70', '0', '3109.36', '1996.97', '143.897', '5.55067', '3374:0 3376:0 '),\n('3376', 'net1056', '530', '3523', '3728', '67', '70', '0', '3166.19', '1968.36', '143.636', '5.79022', '3375:0 3377:0 3378:0 '),\n('3377', 'net1057', '530', '3523', '3728', '67', '70', '0', '3200.13', '2051.68', '140.786', '4.08789', '3376:0 3360:0 '),\n('3378', 'net1058', '530', '3523', '3728', '67', '70', '0', '3152.12', '1897.92', '143.899', '6.07689', '3376:0 3379:0 3381:0 '),\n('3379', 'net1059', '530', '3523', '3728', '67', '70', '0', '3101.78', '1824.2', '144.391', '4.03094', '3380:0 3378:0 '),\n('3380', 'net1060', '530', '3523', '3728', '67', '70', '1', '3001.93', '1820.1', '139.674', '3.72463', '3379:0 '),\n('3381', 'net1061', '530', '3523', '3728', '67', '70', '0', '3242.1', '1874.48', '139.223', '3.2581', '3378:0 3382:0 '),\n('3382', 'net1062', '530', '3523', '3721', '67', '70', '0', '3356.3', '1846.42', '102.117', '6.15621', '3381:0 3383:0 '),\n('3383', 'net1063', '530', '3523', '3721', '67', '70', '0', '3493.95', '1840.83', '95.7573', '0.214661', '3382:0 3384:0 '),\n('3384', 'net1064', '530', '3523', '3735', '67', '70', '0', '3613.29', '1892.38', '114.291', '3.62722', '3383:0 3413:0 3414:0 '),\n('3385', 'net1066', '530', '3523', '3736', '67', '70', '0', '3865.27', '1760.4', '212.947', '0.885387', '3386:0 3410:0 '),\n('3386', 'net1067', '530', '3523', '3736', '67', '70', '0', '3913.4', '1809.95', '227.674', '2.24413', '3385:0 3396:0 3387:0 '),\n('3387', 'net1070', '530', '3523', '3736', '67', '70', '0', '3881.31', '1918.58', '254.223', '0.97178', '3386:0 3388:0 '),\n('3388', 'net1071', '530', '3523', '3736', '67', '70', '0', '3915.93', '1973.35', '257.813', '1.00712', '3389:0 3391:0 3387:0 '),\n('3389', 'net1072', '530', '3523', '3736', '67', '70', '0', '3903.14', '2024.48', '257.813', '1.77289', '3388:0 3390:0 '),\n('3390', 'net1073', '530', '3523', '3736', '67', '70', '0', '3959.61', '2037.62', '257.813', '0.233506', '3389:0 3391:0 3392:0 '),\n('3391', 'net1074', '530', '3523', '3736', '67', '70', '0', '3969.45', '1982.24', '257.813', '4.86736', '3390:0 3388:0 '),\n('3392', 'net1075', '530', '3523', '3736', '67', '70', '0', '3996.64', '2094.06', '254.332', '0.975711', '3390:0 3393:0 '),\n('3393', 'net1077', '530', '3523', '3736', '67', '70', '0', '4094.87', '2029.53', '236.513', '5.17366', '3392:0 3394:0 '),\n('3394', 'net1078', '530', '3523', '3736', '67', '70', '0', '4145.6', '1950.14', '225.805', '2.1106', '3397:0 3395:0 3393:0 '),\n('3395', 'net1079', '530', '3523', '3736', '67', '70', '0', '4106.82', '1883.96', '228.654', '3.273', '3394:0 3396:0 '),\n('3396', 'net1081', '530', '3523', '3736', '67', '70', '0', '3993.09', '1800.64', '228.295', '3.01381', '3386:0 3395:0 '),\n('3397', 'net1082', '530', '3523', '3736', '67', '70', '0', '4192.46', '2017.97', '187.695', '1.85243', '3394:0 3398:0 '),\n('3398', 'net1083', '530', '3523', '3736', '67', '70', '0', '4174.2', '2071.5', '164.367', '1.33406', '3397:0 3399:0 '),\n('3399', 'net1084', '530', '3523', '3735', '67', '70', '0', '4198.79', '2173.44', '151.336', '1.33406', '3398:0 3400:0 3401:0 3431:0 '),\n('3400', 'net1085', '530', '3523', '3735', '67', '70', '0', '4292.53', '2293.49', '122.367', '0.595787', '3399:0 3432:0 '),\n('3401', 'net1086', '530', '3523', '3854', '67', '70', '0', '4247.96', '2110.73', '144.575', '4.7741', '3399:0 3402:0 '),\n('3402', 'net1087', '530', '3523', '3735', '67', '70', '0', '4252.18', '1989.35', '136.107', '4.82514', '3401:0 3403:0 '),\n('3403', 'net1088', '530', '3523', '3735', '67', '70', '0', '4268.67', '1894.47', '138.946', '4.87226', '3402:0 3404:0 3407:0 '),\n('3404', 'net1089', '530', '3523', '3735', '67', '70', '0', '4299.75', '1730.52', '113.615', '4.18507', '3403:0 3405:0 '),\n('3405', 'net1090', '530', '3523', '3735', '67', '70', '0', '4113.8', '1674.62', '130.483', '2.68103', '3404:0 3406:0 '),\n('3406', 'net1091', '530', '3523', '3735', '67', '70', '0', '4046.36', '1742.75', '145.812', '2.35116', '3405:0 3407:0 3408:0 '),\n('3407', 'net1092', '530', '3523', '3735', '67', '70', '0', '4181.61', '1781.88', '136.718', '0.423012', '3406:0 3403:0 '),\n('3408', 'net1093', '530', '3523', '3735', '67', '70', '0', '3930.55', '1683.62', '139.355', '3.27165', '3406:0 3409:0 '),\n('3409', 'net1094', '530', '3523', '3735', '67', '70', '0', '3819.95', '1651.37', '133.174', '2.01794', '3408:0 3411:0 3410:0 '),\n('3410', 'net1095', '530', '3523', '3735', '67', '70', '0', '3785.44', '1751.5', '175.377', '2.55396', '3385:0 3409:0 3413:0 '),\n('3411', 'net1097', '530', '3523', '3735', '67', '70', '0', '3779.17', '1581.07', '120.895', '1.36998', '3409:0 3412:0 '),\n('3412', 'net1098', '530', '3523', '3735', '67', '70', '0', '3710.46', '1647.45', '128.67', '1.14614', '3411:0 3413:0 '),\n('3413', 'net1099', '530', '3523', '3735', '67', '70', '0', '3682.83', '1822.97', '129.53', '5.05546', '3412:0 3384:0 3410:0 '),\n('3414', 'net1100', '530', '3523', '3735', '67', '70', '0', '3551.83', '1960.87', '89.9501', '1.23472', '3384:0 3415:0 3416:0 '),\n('3415', 'net1101', '530', '3523', '3735', '67', '70', '0', '3582.85', '2061.58', '97.1173', '1.30541', '3414:0 '),\n('3416', 'net1102', '530', '3523', '3735', '67', '70', '0', '3654.98', '2151.19', '121.699', '1.26065', '3414:0 3417:0 '),\n('3417', 'net1103', '530', '3523', '3735', '67', '70', '0', '3647.05', '2320.07', '95.0628', '1.67298', '3416:0 3418:0 '),\n('3418', 'net1104', '530', '3523', '3735', '67', '70', '0', '3753.6', '2270.39', '127.706', '5.84031', '3417:0 3419:0 '),\n('3419', 'net1105', '530', '3523', '3735', '67', '70', '0', '3743.54', '2216.22', '132.261', '5.08632', '3418:0 3420:0 '),\n('3420', 'net1106', '530', '3523', '3880', '67', '70', '0', '3752.43', '2164.28', '140.754', '4.1949', '3419:0 3421:0 3427:0 '),\n('3421', 'net1107', '530', '3523', '3880', '67', '70', '0', '3712.58', '2091.74', '151.686', '5.93062', '3420:0 3422:0 '),\n('3422', 'net1108', '530', '3523', '3880', '67', '70', '0', '3791.21', '2078.46', '153.464', '0.004788', '3421:0 3423:0 '),\n('3423', 'net1109', '530', '3523', '3880', '67', '70', '0', '3833.37', '2045.96', '145.651', '5.41226', '3422:0 3424:0 '),\n('3424', 'net1110', '530', '3523', '3880', '67', '70', '0', '3890.34', '2027.56', '147.129', '1.10633', '3423:0 3425:0 '),\n('3425', 'net1112', '530', '3523', '3880', '67', '70', '0', '3911.03', '2086.24', '156.158', '1.07294', '3424:0 3426:0 '),\n('3426', 'net1113', '530', '3523', '3880', '67', '70', '0', '3942.19', '2139.62', '160.422', '6.24086', '3425:0 '),\n('3427', 'net1114', '530', '3523', '3735', '67', '70', '0', '3790.48', '2245.91', '149.586', '4.56011', '3420:0 3428:0 '),\n('3428', 'net1115', '530', '3523', '3735', '67', '70', '0', '3843.92', '2279.21', '153.861', '2.84204', '3427:0 3429:0 '),\n('3429', 'net1116', '530', '3523', '3735', '67', '70', '0', '3944.34', '2283.35', '158.599', '6.04059', '3428:0 3430:0 '),\n('3430', 'net1117', '530', '3523', '3735', '67', '70', '0', '4063.98', '2226.19', '164.346', '5.41228', '3429:0 3431:0 '),\n('3431', 'net1119', '530', '3523', '3735', '67', '70', '0', '4123.87', '2142.65', '157.701', '2.91076', '3399:0 3430:0 '),\n('3432', 'net1121', '530', '3523', '3741', '67', '70', '0', '4466.87', '2397.83', '122.968', '0.527102', '3400:0 3433:0 '),\n('3433', 'net1122', '530', '3523', '3741', '67', '70', '0', '4530.13', '2410.14', '141.874', '5.42799', '3432:0 3434:0 3438:0 '),\n('3434', 'net1123', '530', '3523', '3741', '67', '70', '0', '4566.37', '2316.31', '146.43', '5.07457', '3433:0 3435:0 '),\n('3435', 'net1124', '530', '3523', '3741', '67', '70', '0', '4632.34', '2295.23', '162.104', '1.47351', '3434:0 3436:0 '),\n('3436', 'net1125', '530', '3523', '3741', '67', '70', '0', '4622.3', '2365.33', '187.361', '1.96046', '3435:0 3437:0 '),\n('3437', 'net1126', '530', '3523', '3741', '67', '70', '0', '4729.92', '2383.24', '198.355', '3.24458', '3436:0 '),\n('3438', 'net1127', '530', '3523', '3741', '67', '70', '0', '4575.52', '2543.12', '194.543', '0.915856', '3433:0 3439:0 '),\n('3439', 'net1128', '530', '3523', '3741', '67', '70', '0', '4579.8', '2608.07', '196.971', '1.06115', '3438:0 3440:0 '),\n('3440', 'net1129', '530', '3523', '3741', '67', '70', '0', '4616.02', '2682.15', '187.718', '1.52847', '3439:0 3441:0 '),\n('3441', 'net1130', '530', '3523', '3523', '67', '70', '0', '4613.1', '2774.93', '159.097', '0.786306', '3440:0 3442:0 3461:0 '),\n('3442', 'net1131', '530', '3523', '3523', '67', '70', '0', '4581.46', '2841.92', '146.738', '1.62271', '3441:0 3443:0 3462:0 '),\n('3443', 'net1132', '530', '3523', '3523', '67', '70', '0', '4623.84', '2957.12', '144.621', '1.21823', '3442:0 3444:0 3463:0 '),\n('3444', 'net1133', '530', '3523', '3850', '67', '70', '0', '4760.8', '2985.3', '129.535', '0.205073', '3443:0 3445:0 '),\n('3445', 'net1134', '530', '3523', '3850', '67', '70', '0', '4849.32', '2917.43', '146.288', '5.62826', '3444:0 3446:0 '),\n('3446', 'net1135', '530', '3523', '3874', '67', '70', '0', '4916.97', '2942.46', '157.256', '0.212934', '3445:0 3447:0 '),\n('3447', 'net1136', '530', '3523', '3850', '67', '70', '0', '4803.44', '3004.17', '134.11', '2.64374', '3446:0 3448:0 '),\n('3448', 'net1137', '530', '3523', '3523', '67', '70', '0', '4689.74', '3022.54', '131.238', '0.00480604', '3447:0 3449:0 '),\n('3449', 'net1138', '530', '3523', '3523', '67', '70', '0', '4770.95', '3072.84', '120.927', '0.216864', '3448:0 3450:0 '),\n('3450', 'net1139', '530', '3523', '3523', '67', '70', '0', '4841.73', '3077.92', '111.914', '5.77749', '3449:0 3451:0 3533:0 '),\n('3451', 'net1140', '530', '3523', '3874', '67', '70', '0', '4921.37', '3026.16', '99.5096', '5.7068', '3450:0 3452:0 '),\n('3452', 'net1141', '530', '3523', '3874', '67', '70', '0', '5030.73', '3015.92', '91.2729', '6.18983', '3451:0 3453:0 '),\n('3453', 'net1142', '530', '3523', '3874', '67', '70', '0', '5047.36', '2928.45', '88.8179', '4.9057', '3452:0 3454:0 '),\n('3454', 'net1143', '530', '3523', '3874', '67', '70', '0', '4988.68', '2838.26', '81.9239', '3.64121', '3453:0 3455:0 '),\n('3455', 'net1144', '530', '3523', '3850', '67', '70', '0', '4907.06', '2817.68', '91.5802', '3.63336', '3454:0 3456:0 '),\n('3456', 'net1145', '530', '3523', '3850', '67', '70', '0', '4903.41', '2721.51', '83.4709', '4.33629', '3455:0 3457:0 '),\n('3457', 'net1146', '530', '3523', '3850', '67', '70', '0', '4844.82', '2634.49', '94.0377', '2.49061', '3456:0 3458:0 '),\n('3458', 'net1147', '530', '3523', '3850', '67', '70', '0', '4803.14', '2703.36', '87.3788', '2.22751', '3457:0 3459:0 '),\n('3459', 'net1148', '530', '3523', '3850', '67', '70', '0', '4741.03', '2771.78', '92.6406', '2.30998', '3458:0 3460:0 '),\n('3460', 'net1149', '530', '3523', '3850', '67', '70', '0', '4719.31', '2848.51', '113.113', '1.8623', '3459:0 3461:0 '),\n('3461', 'net1150', '530', '3523', '3850', '67', '70', '0', '4656.43', '2805.22', '134.562', '3.22497', '3460:0 3441:0 '),\n('3462', 'net1151', '530', '3523', '3876', '67', '70', '0', '4484.96', '2804.2', '139.481', '1.71701', '3442:0 3484:0 '),\n('3463', 'net1152', '530', '3523', '3740', '67', '70', '0', '4590.85', '3169.73', '146.93', '4.87431', '3443:0 3464:0 3465:0 3470:0 3523:0 '),\n('3464', 'net1153', '530', '3523', '3740', '67', '70', '0', '4693.85', '3149.86', '170.153', '5.31804', '3463:0 3465:0 '),\n('3465', 'net1154', '530', '3523', '3740', '1', '60', '0', '4655.8', '3065', '169.231', '2.59665', '3464:0 3463:0 3466:0 '),\n('3466', 'net1155', '530', '3523', '3740', '67', '70', '0', '4685.7', '3259.51', '173.132', '2.39442', '3465:0 3467:0 3469:0 '),\n('3467', 'net1156', '530', '3523', '3740', '67', '70', '0', '4776.31', '3293.39', '196.421', '1.55207', '3466:0 3468:0 '),\n('3468', 'net1157', '530', '3523', '3740', '67', '70', '0', '4732.45', '3359.96', '201.252', '3.83758', '3467:0 3469:0 '),\n('3469', 'net1158', '530', '3523', '3740', '67', '70', '0', '4630.74', '3310.08', '170.694', '5.45551', '3468:0 3466:0 '),\n('3470', 'net1159', '530', '3523', '3523', '67', '70', '0', '4397.77', '3265.13', '143.404', '2.67128', '3463:0 3471:0 3475:0 3476:0 3523:0 3487:0 '),\n('3471', 'net1160', '530', '3523', '3739', '67', '70', '0', '4463.52', '3434.86', '167.212', '1.19866', '3470:0 3472:0 3475:0 '),\n('3472', 'net1161', '530', '3523', '3739', '67', '70', '0', '4387.49', '3412.69', '167.78', '2.42782', '3471:0 3473:0 '),\n('3473', 'net1162', '530', '3523', '3739', '67', '70', '0', '4350.61', '3471.82', '175.837', '4.81542', '3472:0 3474:0 '),\n('3474', 'net1163', '530', '3523', '3739', '67', '70', '0', '4364.97', '3377.13', '154.103', '0.876653', '3473:0 3475:0 '),\n('3475', 'net1164', '530', '3523', '3739', '67', '70', '0', '4427.16', '3339.99', '152.658', '0.896303', '3474:0 3470:0 3471:0 '),\n('3476', 'net1165', '530', '3523', '3738', '67', '70', '0', '4313.76', '3185.04', '161.274', '0.774559', '3470:0 3477:0 '),\n('3477', 'net1166', '530', '3523', '3738', '67', '70', '1', '4231.39', '3159.2', '178.712', '0.566429', '3476:0 3478:0 '),\n('3478', 'net1167', '530', '3523', '3738', '67', '70', '0', '4178.63', '3151.63', '175.35', '3.55094', '3477:0 3479:0 '),\n('3479', 'net1168', '530', '3523', '3738', '67', '70', '0', '4098.18', '3118.59', '159.275', '3.31924', '3478:0 3480:0 '),\n('3480', 'net1169', '530', '3523', '3738', '67', '70', '0', '4000.86', '3107.64', '138.035', '3.24856', '3479:0 3347:0 3481:0 '),\n('3481', 'net1170', '530', '3523', '3875', '67', '70', '0', '4031.23', '3259.48', '139.947', '1.37536', '3480:0 3482:0 '),\n('3482', 'net1171', '530', '3523', '3875', '67', '70', '0', '4071.98', '3372.71', '141.877', '5.11779', '3481:0 3483:0 3489:0 '),\n('3483', 'net1172', '530', '3523', '3875', '67', '70', '0', '4151.5', '3229.24', '196.056', '3.95933', '3482:0 '),\n('3484', 'net1173', '530', '3523', '3876', '67', '70', '0', '4466.66', '2879.42', '140.619', '2.91867', '3462:0 3485:0 '),\n('3485', 'net1174', '530', '3523', '3876', '67', '70', '0', '4370.42', '2904.8', '148.304', '2.95794', '3484:0 3486:0 '),\n('3486', 'net1175', '530', '3523', '3876', '67', '70', '0', '4330.52', '2945.08', '132.085', '5.41232', '3485:0 '),\n('3487', 'net1176', '530', '3523', '3523', '67', '70', '0', '4301.84', '3317.13', '147.441', '2.74981', '3470:0 3488:0 '),\n('3488', 'net1178', '530', '3523', '3523', '67', '70', '0', '4181.61', '3456.1', '144.034', '2.38458', '3489:0 3487:0 '),\n('3489', 'net1179', '530', '3523', '3875', '67', '70', '0', '4137.43', '3393.24', '142.177', '3.93968', '3488:0 3482:0 3490:0 '),\n('3490', 'net1180', '530', '3523', '3523', '67', '70', '0', '4138.78', '3496.33', '135.37', '2.48591', '3489:0 3491:0 3517:0 '),\n('3491', 'net1181', '530', '3523', '3852', '67', '70', '0', '4091.57', '3538.26', '117.689', '1.98718', '3490:0 3492:0 '),\n('3492', 'net1182', '530', '3523', '3852', '67', '70', '0', '4069.39', '3591.81', '114.31', '2.34453', '3491:0 3493:0 '),\n('3493', 'net1183', '530', '3523', '3722', '67', '70', '0', '3910.13', '3724.58', '112.828', '2.44664', '3492:0 3494:0 '),\n('3494', 'net1184', '530', '3523', '3722', '67', '70', '0', '3891.58', '3773.08', '119.636', '1.37064', '3493:0 3495:0 3510:0 '),\n('3495', 'net1185', '530', '3523', '3722', '67', '70', '0', '3908.92', '3833.69', '129.749', '1.2921', '3494:0 3496:0 '),\n('3496', 'net1186', '530', '3523', '3722', '67', '70', '0', '3990.07', '3844.3', '168.636', '3.74058', '3495:0 3497:0 '),\n('3497', 'net1188', '530', '3523', '3722', '67', '70', '0', '3883.22', '3936.25', '179.58', '1.96754', '3496:0 3498:0 '),\n('3498', 'net1189', '530', '3523', '3722', '67', '70', '0', '3884.07', '3990.71', '182.988', '1.21356', '3499:0 3509:0 3497:0 '),\n('3499', 'net1190', '530', '3523', '3722', '67', '70', '0', '3912.9', '4038.34', '190.499', '6.07518', '3498:0 3500:0 '),\n('3500', 'net1191', '530', '3523', '3722', '67', '70', '0', '3973.04', '4023.83', '194.227', '6.0634', '3499:0 3501:0 3503:0 '),\n('3501', 'net1192', '530', '3523', '3722', '67', '70', '0', '4018.79', '4051.87', '194.227', '0.549902', '3500:0 3502:0 3506:0 '),\n('3502', 'net1193', '530', '3523', '3722', '67', '70', '0', '4047.95', '4004.82', '194.226', '3.89178', '3501:0 3503:0 '),\n('3503', 'net1194', '530', '3523', '3722', '67', '70', '0', '4001.04', '3975.21', '194.226', '3.74256', '3502:0 3500:0 3504:0 '),\n('3504', 'net1195', '530', '3523', '3722', '67', '70', '0', '3987.35', '3916.16', '191.701', '4.48476', '3503:0 3505:0 '),\n('3505', 'net1196', '530', '3523', '3722', '67', '70', '0', '4046.25', '3890.47', '189.426', '0.432092', '3504:0 '),\n('3506', 'net1197', '530', '3523', '3722', '67', '70', '0', '4034.82', '4111.42', '191.69', '4.44076', '3501:0 3507:0 '),\n('3507', 'net1198', '530', '3523', '3722', '67', '70', '0', '4009.09', '4170.41', '196.566', '3.6907', '3506:0 3508:0 '),\n('3508', 'net1199', '530', '3523', '3722', '67', '70', '0', '3913.64', '4108.63', '193.142', '4.23262', '3507:0 3509:0 '),\n('3509', 'net1200', '530', '3523', '3722', '67', '70', '0', '3881.18', '4041.13', '183.645', '4.80596', '3508:0 3498:0 '),\n('3510', 'net1202', '530', '3523', '3722', '67', '70', '0', '3793.14', '3905.54', '108.811', '1.48529', '3494:0 3511:0 '),\n('3511', 'net1203', '530', '3523', '3881', '67', '70', '0', '3802.78', '4013.52', '122.041', '4.63866', '3512:0 3510:0 '),\n('3512', 'net1204', '530', '3523', '3881', '67', '70', '0', '3873.36', '4009.36', '122.335', '5.89452', '3511:0 3513:0 '),\n('3513', 'net1205', '530', '3523', '3881', '67', '70', '0', '3925.68', '3980.18', '123.291', '0.96222', '3512:0 3514:0 '),\n('3514', 'net1206', '530', '3523', '3881', '67', '70', '0', '3946.32', '4028.85', '115.31', '5.07772', '3513:0 3515:0 '),\n('3515', 'net1207', '530', '3523', '3881', '67', '70', '0', '4034.51', '3981.16', '124.954', '0.0315266', '3514:0 3516:0 '),\n('3516', 'net1208', '530', '3523', '3881', '67', '70', '0', '4093.15', '3979.78', '116.913', '6.25973', '3515:0 '),\n('3517', 'net1209', '530', '3523', '3523', '67', '70', '0', '4192.46', '3560.85', '141.75', '3.80144', '3490:0 3518:0 '),\n('3518', 'net1210', '530', '3523', '3721', '67', '70', '0', '4226.42', '3607.77', '132.686', '0.593084', '3517:0 3519:0 '),\n('3519', 'net1212', '530', '3523', '3721', '67', '70', '0', '4313.98', '3676.81', '118.894', '5.57251', '3518:0 3520:0 '),\n('3520', 'net1213', '530', '3523', '3523', '67', '70', '0', '4402.34', '3609.63', '125.622', '5.65104', '3521:0 3519:0 '),\n('3521', 'net1214', '530', '3523', '3523', '67', '70', '0', '4488.77', '3626.57', '104.723', '0.252208', '3520:0 3522:0 '),\n('3522', 'net1215', '530', '3523', '3721', '67', '70', '0', '4533.39', '3589.74', '117.794', '5.57721', '3521:0 '),\n('3523', 'net1216', '530', '3523', '3740', '67', '70', '0', '4515.18', '3245.18', '144.362', '1.06117', '3463:0 3470:0 3524:0 '),\n('3524', 'net1217', '530', '3523', '3740', '67', '70', '0', '4540.26', '3296.59', '134.776', '0.813774', '3523:0 3525:0 '),\n('3525', 'net1218', '530', '3523', '3523', '67', '70', '0', '4586.71', '3342.4', '125.714', '0.566373', '3524:0 3526:0 '),\n('3526', 'net1219', '530', '3523', '3523', '67', '70', '0', '4668.88', '3392.34', '110.519', '0.444637', '3525:0 3527:0 '),\n('3527', 'net1220', '530', '3523', '3900', '67', '70', '0', '4744.11', '3423.26', '102.517', '0.629205', '3526:0 3528:0 '),\n('3528', 'net1221', '530', '3523', '3900', '67', '70', '0', '4791.18', '3452.42', '102.703', '5.32589', '3527:0 3529:0 '),\n('3529', 'net1222', '530', '3523', '3523', '67', '70', '0', '4831.57', '3384.27', '122', '4.79967', '3528:0 3530:0 '),\n('3530', 'net1223', '530', '3523', '3523', '67', '70', '0', '4850.84', '3313.75', '131.13', '3.99465', '3529:0 3531:0 '),\n('3531', 'net1224', '530', '3523', '3523', '67', '70', '0', '4816.07', '3269.64', '149.703', '0.982658', '3530:0 3532:0 '),\n('3532', 'net1225', '530', '3523', '3523', '67', '70', '0', '4832.65', '3173.12', '139.44', '1.878', '3531:0 3533:0 '),\n('3533', 'net1226', '530', '3523', '3523', '67', '70', '0', '4806.1', '3117.37', '139.757', '4.67009', '3532:0 3450:0 '),\n('3534', 'shmv1227', '530', '3520', '3520', '67', '70', '0', '-2866.67', '3174.8', '12.0966', '4.03472', '2763:0 3535:0 '),\n('3535', 'shmv1228', '530', '3520', '3520', '67', '70', '0', '-2919.41', '3080.6', '39.7651', '0.776879', '3534:0 3536:0 '),\n('3536', 'shmv1229', '530', '3520', '3520', '67', '70', '0', '-2912.13', '3021.5', '54.1235', '3.61375', '3535:0 3537:0 '),\n('3537', 'shmv1230', '530', '3520', '3520', '67', '70', '0', '-3025.35', '2947.82', '86.1102', '3.93969', '3536:0 3538:0 '),\n('3538', 'shmv1231', '530', '3520', '3743', '67', '70', '0', '-3075.55', '2877.97', '82.0334', '3.71192', '3537:0 3539:0 3546:0 3703:0 '),\n('3539', 'shmv1232', '530', '3520', '3743', '67', '70', '0', '-3179.64', '2866.95', '94.9902', '2.90296', '3538:0 3540:0 '),\n('3540', 'shmv1233', '530', '3520', '3743', '67', '70', '0', '-3236.04', '2882.68', '114.136', '3.1857', '3539:0 3541:0 3700:0 '),\n('3541', 'shmv1234', '530', '3520', '3743', '67', '70', '0', '-3367.61', '2868.56', '158.738', '3.24853', '3540:0 3542:0 3545:0 '),\n('3542', 'shmv1235', '530', '3520', '3743', '67', '70', '0', '-3404.24', '2930.17', '169.88', '0.354339', '3541:0 3543:0 '),\n('3543', 'shmv1236', '530', '3520', '3743', '67', '70', '0', '-3346.8', '2955.36', '169.88', '0.413244', '3542:0 3544:0 '),\n('3544', 'shmv1237', '530', '3520', '3743', '67', '70', '0', '-3375.43', '3001.18', '170.817', '2.12933', '3543:0 3545:0 '),\n('3545', 'shmv1238', '530', '3520', '3743', '67', '70', '0', '-3444.14', '2938.58', '172.959', '3.88077', '3544:0 3541:0 '),\n('3546', 'shmv1239', '530', '3520', '3520', '67', '70', '0', '-3181.96', '2718.28', '68.7275', '4.12424', '3538:0 3547:0 3556:0 '),\n('3547', 'shmv1240', '530', '3520', '3744', '67', '70', '0', '-3176.94', '2562.78', '61.0113', '0.102998', '3546:0 3548:0 3557:0 '),\n('3548', 'shmv1241', '530', '3520', '3744', '67', '70', '5', '-3111.48', '2564.12', '61.7347', '0.0205314', '3547:0 3549:0 '),\n('3549', 'shmv1242', '530', '3520', '3744', '67', '70', '5', '-3059.25', '2507.74', '62.9718', '4.55621', '3548:0 3550:0 '),\n('3550', 'shmv1243', '530', '3520', '3744', '67', '70', '4', '-3069.01', '2436.27', '63.7223', '4.4227', '3549:0 3551:0 '),\n('3551', 'shmv1244', '530', '3520', '3520', '67', '70', '0', '-3123.06', '2321.13', '59.93', '3.60981', '3550:0 3552:0 3558:0 '),\n('3552', 'shmv1245', '530', '3520', '3520', '67', '70', '0', '-3231.28', '2289.35', '59.5698', '4.92143', '3551:0 3553:0 3606:0 '),\n('3553', 'shmv1246', '530', '3520', '3520', '67', '70', '0', '-3462.86', '2282.37', '63.8282', '3.30352', '3552:0 3554:0 3559:0 '),\n('3554', 'shmv1247', '530', '3520', '3949', '67', '70', '0', '-3455.95', '2462.16', '58.5579', '1.65025', '3553:0 3555:0 3606:0 '),\n('3555', 'shmv1248', '530', '3520', '3520', '67', '70', '0', '-3483.53', '2605.88', '62.0554', '4.92536', '3554:0 3556:0 3704:0 '),\n('3556', 'shmv1249', '530', '3520', '3520', '67', '70', '0', '-3301.81', '2669.56', '57.3856', '0.154061', '3555:0 3546:0 3557:0 '),\n('3557', 'shmv1250', '530', '3520', '3744', '67', '70', '0', '-3199.36', '2470.72', '62.1645', '2.00446', '3556:0 3547:0 3558:0 '),\n('3558', 'shmv1251', '530', '3520', '3520', '67', '70', '0', '-3210.03', '2392.06', '61.8107', '5.34555', '3551:0 3557:0 '),\n('3559', 'shmv1252', '530', '3520', '3520', '67', '70', '0', '-3690.32', '2310.79', '78.5618', '6.17099', '3553:0 3560:0 3566:0 3704:0 '),\n('3560', 'shmv1253', '530', '3520', '3752', '67', '70', '0', '-3792.84', '2478.03', '79.8242', '1.51751', '3559:0 3561:0 3565:0 '),\n('3561', 'shmv1254', '530', '3520', '3752', '67', '70', '0', '-3790.89', '2565.75', '91.2376', '1.68244', '3560:0 3562:0 3563:0 '),\n('3562', 'shmv1255', '530', '3520', '3752', '67', '70', '0', '-3793.32', '2666.77', '101.912', '1.6471', '3561:0 '),\n('3563', 'shmv1256', '530', '3520', '3752', '67', '70', '0', '-4020.54', '2670.54', '126.986', '4.24676', '3561:0 3564:0 '),\n('3564', 'shmv1257', '530', '3520', '3752', '67', '70', '0', '-4064.49', '2549.64', '134.278', '5.45704', '3563:0 3565:0 '),\n('3565', 'shmv1258', '530', '3520', '3752', '67', '70', '0', '-3950.4', '2473.76', '116.781', '0.0024457', '3564:0 3560:0 '),\n('3566', 'shmv1259', '530', '3520', '3745', '67', '70', '0', '-3762.45', '2127.89', '76.7131', '3.78807', '3559:0 3567:0 3570:0 '),\n('3567', 'shmv1260', '530', '3520', '3745', '67', '70', '2', '-3882.03', '2033.78', '96.002', '2.18978', '3566:0 3568:0 3570:0 '),\n('3568', 'shmv1261', '530', '3520', '3745', '67', '70', '3', '-3952.84', '2136.12', '98.2022', '2.21727', '3567:0 3569:0 '),\n('3569', 'shmv1262', '530', '3520', '3745', '67', '70', '3', '-3972.41', '2203.81', '101.676', '5.04862', '3568:0 '),\n('3570', 'shmv1263', '530', '3520', '3520', '67', '70', '0', '-3769.55', '1947.31', '94.6509', '4.07473', '3566:0 3567:0 3571:0 '),\n('3571', 'shmv1264', '530', '3520', '3520', '67', '70', '0', '-3890.57', '1771.31', '96.9587', '3.89017', '3570:0 3572:0 3607:0 '),\n('3572', 'shmv1265', '530', '3520', '3520', '67', '70', '0', '-4052.33', '1643.87', '94.7068', '4.5499', '3571:0 3573:0 '),\n('3573', 'shmv1266', '530', '3520', '3520', '67', '70', '0', '-4057.55', '1395.83', '83.9803', '4.95438', '3572:0 3574:0 3618:0 3633:0 '),\n('3574', 'shmv1267', '530', '3520', '3520', '67', '70', '0', '-4028.73', '1253.84', '79.0241', '1.89525', '3573:0 3575:0 '),\n('3575', 'shmv1268', '530', '3520', '3520', '67', '70', '0', '-3956.14', '1083.59', '27.6555', '5.11538', '3574:0 3576:0 3638:0 3725:0 '),\n('3576', 'shmv1269', '530', '3520', '3520', '67', '70', '0', '-3882.17', '883.51', '18.5293', '4.46743', '3575:0 3577:0 3639:0 '),\n('3577', 'shmv1270', '530', '3520', '3520', '67', '70', '0', '-3840.27', '741.517', '11.8649', '0.0181477', '3576:0 3578:0 3639:0 '),\n('3578', 'shmv1271', '530', '3520', '3520', '67', '70', '0', '-3586.49', '737.497', '-11.4566', '0.0534906', '3577:0 3579:0 3581:0 3732:0 '),\n('3579', 'shmv1272', '530', '3520', '3520', '67', '70', '0', '-3561.52', '586.272', '10.6201', '4.78552', '3578:0 3580:0 3647:0 3659:0 '),\n('3580', 'shmv1273', '530', '3520', '3520', '67', '70', '0', '-3569.67', '423.902', '28.3305', '4.75019', '3579:0 '),\n('3581', 'shmv1274', '530', '3520', '3520', '67', '70', '0', '-3346.71', '753.909', '-26.6716', '0.0849111', '3578:0 3582:0 3683:0 '),\n('3582', 'shmv1275', '530', '3520', '3520', '67', '70', '0', '-3232.2', '784.314', '-19.8198', '0.00243998', '3581:0 3583:0 '),\n('3583', 'shmv1276', '530', '3520', '3754', '67', '70', '0', '-3120.7', '799.898', '-22.5484', '1.24337', '3582:0 3584:0 3671:0 '),\n('3584', 'shmv1277', '530', '3520', '3520', '67', '70', '0', '-3121.46', '1102.68', '20.44', '1.2473', '3583:0 3585:0 3671:0 '),\n('3585', 'shmv1278', '530', '3520', '3753', '67', '70', '0', '-3106.91', '1197.3', '22.976', '1.40439', '3584:0 3586:0 3679:0 3680:0 '),\n('3586', 'shmv1279', '530', '3520', '3520', '67', '70', '0', '-3026.37', '1314.44', '8.68562', '0.968488', '3585:0 3587:0 3687:0 '),\n('3587', 'shmv1280', '530', '3520', '3520', '67', '70', '0', '-2904.03', '1491.38', '14.8027', '0.960634', '3586:0 3588:0 '),\n('3588', 'shmv1281', '530', '3520', '3750', '67', '70', '0', '-2867.58', '1577.53', '15.2282', '2.85737', '3587:0 3589:0 3705:0 '),\n('3589', 'shmv1282', '530', '3520', '3750', '67', '70', '0', '-2824.65', '1682.74', '22.3429', '1.17662', '3588:0 3590:0 '),\n('3590', 'shmv1283', '530', '3520', '3750', '67', '70', '0', '-2886.26', '1742.5', '43.8502', '2.40576', '3589:0 3591:0 '),\n('3591', 'shmv1284', '530', '3520', '3520', '67', '70', '0', '-2975.68', '1908', '104.519', '2.08612', '3590:0 3592:0 '),\n('3592', 'shmv1285', '530', '3520', '3520', '67', '70', '0', '-3102.48', '1972.24', '105.605', '0.868752', '3591:0 3593:0 3596:0 '),\n('3593', 'shmv1286', '530', '3520', '3520', '67', '70', '0', '-3180.63', '2099.72', '75.4619', '0.291484', '3592:0 3594:0 3597:0 '),\n('3594', 'shmv1287', '530', '3520', '3933', '67', '70', '0', '-3042.81', '2156.41', '79.2338', '0.393586', '3593:0 3595:0 '),\n('3595', 'shmv1288', '530', '3520', '3933', '67', '70', '0', '-3015.9', '2104.22', '90.4026', '4.71721', '3594:0 3596:0 '),\n('3596', 'shmv1289', '530', '3520', '3933', '67', '70', '0', '-3017.6', '2046.19', '96.9335', '3.75903', '3595:0 3592:0 '),\n('3597', 'shmv1290', '530', '3520', '3748', '67', '70', '0', '-3265.68', '2066.96', '73.9146', '4.35987', '3593:0 3606:0 3598:0 '),\n('3598', 'shmv1291', '530', '3520', '3748', '67', '70', '0', '-3287.9', '1978.44', '52.6152', '2.07043', '3597:0 3602:0 '),\n('3599', 'shmv1294', '530', '3520', '3748', '67', '70', '0', '-3389.68', '1984.65', '24.8931', '1.53832', '3600:0 3602:0 '),\n('3600', 'shmv1295', '530', '3520', '3748', '67', '70', '0', '-3405.52', '2054.01', '15.1476', '3.06395', '3601:0 3599:0 '),\n('3601', 'shmv1296', '530', '3520', '3748', '67', '70', '0', '-3321.42', '2125.97', '3.08638', '2.40814', '3600:0 '),\n('3602', 'shmv1297', '530', '3520', '3748', '67', '70', '0', '-3343.59', '2008.19', '32.1771', '2.00758', '3603:0 3599:0 3598:0 '),\n('3603', 'shmv1298', '530', '3520', '3748', '67', '70', '0', '-3419.14', '2114.58', '34.4588', '2.18822', '3602:0 3604:0 '),\n('3604', 'shmv1299', '530', '3520', '3748', '67', '70', '0', '-3495.43', '2186.55', '33.5276', '5.96992', '3603:0 3605:0 '),\n('3605', 'shmv1301', '530', '3520', '3748', '67', '70', '0', '-3410.98', '2272.59', '33.8565', '1.54813', '3604:0 '),\n('3606', 'shmv1302', '530', '3520', '3949', '67', '70', '0', '-3336.88', '2207.97', '74.9806', '2.06645', '3597:0 3552:0 3554:0 '),\n('3607', 'shmv1303', '530', '3520', '3932', '67', '70', '0', '-4003.29', '1878.34', '76.5277', '5.50491', '3571:0 3608:0 '),\n('3608', 'shmv1304', '530', '3520', '3932', '67', '70', '0', '-4085.04', '1923.15', '77.0726', '5.10829', '3607:0 3609:0 '),\n('3609', 'shmv1305', '530', '3520', '3932', '67', '70', '0', '-4058.27', '1821.93', '84.9857', '4.00088', '3608:0 3610:0 '),\n('3610', 'shmv1306', '530', '3520', '3932', '67', '70', '0', '-4103.15', '1784.26', '103.457', '4.80985', '3609:0 3611:0 '),\n('3611', 'shmv1307', '530', '3520', '3932', '67', '70', '0', '-4195.07', '1861.58', '109.916', '5.5167', '3610:0 3612:0 '),\n('3612', 'shmv1308', '530', '3520', '3822', '67', '70', '0', '-4334.08', '1789.5', '144.816', '3.61996', '3611:0 3613:0 '),\n('3613', 'shmv1309', '530', '3520', '3822', '67', '70', '0', '-4420.11', '1797.35', '157.396', '4.44855', '3612:0 3614:0 3622:0 '),\n('3614', 'shmv1310', '530', '3520', '3822', '67', '70', '0', '-4448.82', '1724.98', '158.876', '4.33467', '3613:0 3615:0 3620:0 '),\n('3615', 'shmv1311', '530', '3520', '3822', '67', '70', '0', '-4383.86', '1707.44', '156.573', '5.0533', '3614:0 3616:0 '),\n('3616', 'shmv1312', '530', '3520', '3822', '67', '70', '0', '-4361', '1640.49', '156.748', '5.04152', '3615:0 3617:0 3619:0 '),\n('3617', 'shmv1313', '530', '3520', '3822', '67', '70', '0', '-4252.69', '1521.47', '129.453', '5.45072', '3616:0 3618:0 3626:0 '),\n('3618', 'shmv1314', '530', '3520', '3822', '67', '70', '0', '-4141.51', '1512.19', '103.518', '6.20863', '3617:0 3573:0 '),\n('3619', 'shmv1315', '530', '3520', '3822', '67', '70', '0', '-4423.22', '1575.75', '164.241', '3.96398', '3616:0 3620:0 '),\n('3620', 'shmv1316', '530', '3520', '3822', '67', '70', '0', '-4491.12', '1668.12', '165.043', '2.20469', '3619:0 3614:0 3621:0 '),\n('3621', 'shmv1317', '530', '3520', '3822', '67', '70', '0', '-4564.8', '1670.31', '174.579', '3.11182', '3620:0 '),\n('3622', 'shmv1318', '530', '3520', '3520', '67', '70', '0', '-4426.81', '1860.99', '159.258', '2.50232', '3613:0 3623:0 '),\n('3623', 'shmv1319', '530', '3520', '3930', '67', '70', '0', '-4488.03', '1934.26', '144.075', '1.12787', '3622:0 3624:0 '),\n('3624', 'shmv1320', '530', '3520', '3930', '67', '70', '0', '-4450.04', '1988.33', '105.344', '2.32482', '3623:0 3625:0 '),\n('3625', 'shmv1321', '530', '3520', '3930', '67', '70', '0', '-4500.91', '2022.31', '100.196', '4.19013', '3624:0 '),\n('3626', 'shmv1323', '530', '3520', '3929', '67', '70', '0', '-4234.47', '1405.21', '129.348', '4.72107', '3617:0 3627:0 '),\n('3627', 'shmv1324', '530', '3520', '3929', '67', '70', '0', '-4309.54', '1384.96', '143.997', '3.08352', '3626:0 3628:0 '),\n('3628', 'shmv1325', '530', '3520', '3950', '67', '70', '0', '-4558.9', '1328.47', '135.392', '6.27616', '3627:0 3629:0 '),\n('3629', 'shmv1326', '530', '3520', '3929', '67', '70', '0', '-4452.67', '1313.79', '113.624', '0.000826359', '3628:0 3630:0 '),\n('3630', 'shmv1327', '530', '3520', '3929', '67', '70', '0', '-4318.73', '1322.33', '73.5928', '6.21333', '3629:0 3631:0 3634:0 '),\n('3631', 'shmv1328', '530', '3520', '3929', '67', '70', '0', '-4226.21', '1305.14', '56.0568', '6.20155', '3630:0 3632:0 '),\n('3632', 'shmv1329', '530', '3520', '3929', '67', '70', '0', '-4117.45', '1299.67', '52.606', '1.29281', '3631:0 3633:0 '),\n('3633', 'shmv1330', '530', '3520', '3520', '67', '70', '0', '-4096.52', '1451.91', '87.6478', '5.2198', '3632:0 3573:0 '),\n('3634', 'shmv1331', '530', '3520', '3929', '67', '70', '0', '-4403.59', '1300.45', '84.0575', '3.42125', '3630:0 3635:0 '),\n('3635', 'shmv1332', '530', '3520', '3520', '67', '70', '0', '-4511.47', '1203.3', '34.9082', '3.43695', '3634:0 3636:0 '),\n('3636', 'shmv1333', '530', '3520', '3945', '67', '70', '0', '-4641.99', '1163.55', '-14.0182', '0.205018', '3635:0 3637:0 '),\n('3637', 'shmv1334', '530', '3520', '3945', '67', '70', '0', '-4660.62', '1088.53', '0.90432', '5.98162', '3636:0 '),\n('3638', 'shmv1335', '530', '3520', '3938', '67', '70', '1', '-4090.85', '1104.54', '41.0582', '5.28662', '3575:0 3639:0 '),\n('3639', 'shmv1336', '530', '3520', '3758', '67', '70', '0', '-4110.45', '861.06', '9.26995', '4.56397', '3638:0 3576:0 3577:0 3640:0 '),\n('3640', 'shmv1337', '530', '3520', '3939', '67', '70', '0', '-4149.68', '586.65', '8.64057', '4.66214', '3639:0 3641:0 '),\n('3641', 'shmv1338', '530', '3520', '3939', '67', '70', '0', '-4184.61', '489.528', '29.5585', '1.24958', '3642:0 3643:0 3640:0 '),\n('3642', 'shmv1339', '530', '3520', '3939', '67', '70', '0', '-4114.39', '424.914', '34.9882', '2.74575', '3641:0 '),\n('3643', 'shmv1341', '530', '3520', '3939', '67', '70', '0', '-4224.07', '420.493', '51.1341', '1.46947', '3641:0 3644:0 '),\n('3644', 'shmv1342', '530', '3520', '3939', '67', '70', '0', '-4299.45', '334.074', '109.437', '3.99453', '3643:0 3645:0 '),\n('3645', 'shmv1344', '530', '3520', '3939', '67', '70', '0', '-4202.19', '250.869', '124.805', '2.69862', '3644:0 3646:0 '),\n('3646', 'shmv1345', '530', '3520', '3939', '67', '70', '0', '-4203.68', '345.854', '115.285', '1.493', '3645:0 '),\n('3647', 'shmv1346', '530', '3520', '3520', '67', '70', '0', '-3501.72', '557.894', '16.7235', '0.323666', '3579:0 3648:0 '),\n('3648', 'shmv1347', '530', '3520', '3757', '67', '70', '0', '-3426.99', '580.376', '42.2179', '5.95105', '3647:0 3649:0 '),\n('3649', 'shmv1348', '530', '3520', '3757', '67', '70', '0', '-3327.45', '544.282', '74.5225', '4.63944', '3648:0 3650:0 '),\n('3650', 'shmv1349', '530', '3520', '3757', '67', '70', '0', '-3333.62', '454.382', '99.8124', '6.05315', '3649:0 3651:0 3658:0 '),\n('3651', 'shmv1350', '530', '3520', '3757', '67', '70', '0', '-3228.24', '439.514', '104.731', '3.31604', '3650:0 3652:0 '),\n('3652', 'shmv1351', '530', '3520', '3757', '67', '70', '0', '-3392.06', '415.921', '103.96', '4.61195', '3651:0 3653:0 3658:0 '),\n('3653', 'shmv1352', '530', '3520', '3757', '67', '70', '0', '-3390.43', '293.527', '103.961', '4.72583', '3652:0 3654:0 '),\n('3654', 'shmv1353', '530', '3520', '3757', '67', '70', '0', '-3337.54', '294.86', '116.382', '1.36824', '3653:0 3655:0 '),\n('3655', 'shmv1354', '530', '3520', '3757', '67', '70', '0', '-3324.03', '371.217', '120.458', '5.9746', '3654:0 3656:0 '),\n('3656', 'shmv1355', '530', '3520', '3757', '67', '70', '0', '-3231.77', '337.352', '127.504', '4.49021', '3655:0 3657:0 '),\n('3657', 'shmv1356', '530', '3520', '3757', '67', '70', '0', '-3239.92', '279.443', '137.131', '4.57267', '3656:0 '),\n('3658', 'shmv1357', '530', '3520', '3757', '67', '70', '0', '-3416.2', '459.709', '103.935', '5.91964', '3650:0 3652:0 '),\n('3659', 'shmv1358', '530', '3520', '3756', '67', '70', '0', '-3685.39', '550.038', '35.0742', '2.93905', '3579:0 3660:0 '),\n('3660', 'shmv1359', '530', '3520', '3756', '67', '70', '0', '-3813.8', '565.02', '71.7251', '4.91432', '3659:0 3661:0 '),\n('3661', 'shmv1360', '530', '3520', '3756', '67', '70', '0', '-3802.41', '461.803', '99.9172', '4.68655', '3660:0 3662:0 3670:0 '),\n('3662', 'shmv1361', '530', '3520', '3756', '67', '70', '0', '-3896.83', '442.087', '104.97', '6.26668', '3661:0 3663:0 '),\n('3663', 'shmv1362', '530', '3520', '3756', '67', '70', '0', '-3719.39', '417.216', '104.061', '2.6833', '3662:0 3664:0 3670:0 '),\n('3664', 'shmv1363', '530', '3520', '3756', '67', '70', '0', '-3732.23', '295.716', '104.066', '3.10939', '3663:0 3665:0 '),\n('3665', 'shmv1364', '530', '3520', '3756', '67', '70', '0', '-3786.92', '297.908', '116.455', '3.10153', '3664:0 3666:0 '),\n('3666', 'shmv1365', '530', '3520', '3756', '67', '70', '0', '-3812.37', '248.065', '120.604', '1.80405', '3665:0 3667:0 '),\n('3667', 'shmv1366', '530', '3520', '3756', '67', '70', '0', '-3838.38', '357.549', '120.582', '1.80405', '3666:0 3668:0 '),\n('3668', 'shmv1367', '530', '3520', '3756', '67', '70', '0', '-3904.87', '343.016', '127.62', '4.76657', '3667:0 3669:0 '),\n('3669', 'shmv1368', '530', '3520', '3756', '67', '70', '0', '-3890.45', '282.542', '137.239', '3.8665', '3668:0 '),\n('3670', 'shmv1369', '530', '3520', '3756', '67', '70', '0', '-3719.66', '475.869', '104.038', '4.2914', '3663:0 3661:0 '),\n('3671', 'shmv1370', '530', '3520', '3754', '67', '70', '0', '-3124.49', '886.832', '-14.3889', '1.56135', '3583:0 3584:0 3672:0 '),\n('3672', 'shmv1371', '530', '3520', '3754', '67', '70', '1', '-3061.33', '830.398', '-10.215', '4.92836', '3671:0 3673:0 '),\n('3673', 'shmv1372', '530', '3520', '3520', '67', '70', '0', '-3030.95', '544.921', '-1.12904', '0.00390148', '3672:0 3674:0 '),\n('3674', 'shmv1373', '530', '3520', '3520', '67', '70', '0', '-2881.37', '547.854', '-13.197', '0.0196085', '3673:0 3675:0 '),\n('3675', 'shmv1374', '530', '3520', '3520', '67', '70', '0', '-2744.62', '677.917', '-16.4588', '1.42468', '3674:0 3676:0 '),\n('3676', 'shmv1375', '530', '3520', '3520', '67', '70', '0', '-2720.25', '857.215', '-3.3875', '4.54664', '3675:0 3677:0 '),\n('3677', 'shmv1376', '530', '3520', '3520', '67', '70', '0', '-2768.24', '985.559', '-2.57223', '2.06085', '3676:0 3678:0 '),\n('3678', 'shmv1377', '530', '3520', '3520', '67', '70', '0', '-2871.08', '1130.08', '8.92665', '3.16433', '3677:0 3679:0 '),\n('3679', 'shmv1378', '530', '3520', '3520', '67', '70', '0', '-2984.92', '1134.44', '-3.92959', '2.62712', '3678:0 3585:0 '),\n('3680', 'shmv1379', '530', '3520', '3753', '67', '70', '0', '-3245.6', '1189.8', '59.4774', '4.33927', '3585:0 3681:0 3685:0 '),\n('3681', 'shmv1380', '530', '3520', '3753', '67', '70', '0', '-3222.89', '1092.48', '64.7857', '6.14175', '3680:0 3682:0 3685:0 3686:0 '),\n('3682', 'shmv1381', '530', '3520', '3753', '67', '70', '0', '-3292.57', '985.163', '40.7467', '5.15608', '3681:0 3684:0 '),\n('3683', 'shmv1382', '530', '3520', '3753', '67', '70', '0', '-3344.18', '870.1', '-14.6762', '4.80342', '3581:0 3684:0 '),\n('3684', 'shmv1383', '530', '3520', '3753', '67', '70', '0', '-3205.87', '897.037', '49.1172', '0.192352', '3683:0 3682:0 '),\n('3685', 'shmv1384', '530', '3520', '3753', '67', '70', '0', '-3399.1', '1175.31', '50.0129', '3.15252', '3680:0 3681:0 3686:0 '),\n('3686', 'shmv1385', '530', '3520', '3753', '67', '70', '0', '-3335.34', '1043.32', '47.1116', '0.383668', '3681:0 3685:0 3726:0 '),\n('3687', 'shmv1386', '530', '3520', '3749', '67', '70', '0', '-2929.04', '1324.33', '7.92349', '5.43769', '3586:0 3688:0 '),\n('3688', 'shmv1387', '530', '3520', '3749', '67', '70', '0', '-2845.89', '1301.54', '6.02801', '3.20519', '3687:0 3689:0 '),\n('3689', 'shmv1388', '530', '3520', '3749', '67', '70', '0', '-2847.46', '1231.33', '6.78906', '1.62065', '3688:0 3690:0 '),\n('3690', 'shmv1390', '530', '3520', '3749', '67', '70', '0', '-2732.51', '1138.3', '2.89233', '2.40802', '3689:0 3691:0 '),\n('3691', 'shmv1391', '530', '3520', '3749', '67', '70', '0', '-2634.08', '1230.04', '11.146', '1.86804', '3692:0 3690:0 '),\n('3692', 'shmv1392', '530', '3520', '3749', '67', '70', '0', '-2651.9', '1282.45', '26.4813', '3.01869', '3691:0 3693:0 '),\n('3693', 'shmv1393', '530', '3520', '3749', '67', '70', '0', '-2710.39', '1300.75', '33.7332', '1.28218', '3692:0 3694:0 '),\n('3694', 'shmv1394', '530', '3520', '3749', '67', '70', '0', '-2690.89', '1361.98', '35.0836', '6.28124', '3693:0 3695:0 '),\n('3695', 'shmv1395', '530', '3520', '3749', '67', '70', '0', '-2617.04', '1355.97', '37.2382', '0.18183', '3694:0 3696:0 '),\n('3696', 'shmv1396', '530', '3520', '3749', '67', '70', '0', '-2769.22', '1301.12', '33.2111', '3.48993', '3695:0 3697:0 3699:0 '),\n('3697', 'shmv1397', '530', '3520', '3749', '67', '70', '0', '-2721.9', '1224.71', '33.0771', '5.26886', '3696:0 3698:0 '),\n('3698', 'shmv1398', '530', '3520', '3749', '67', '70', '0', '-2817.63', '1365.79', '38.5145', '5.53669', '3697:0 3699:0 '),\n('3699', 'shmv1399', '530', '3520', '3749', '67', '70', '0', '-2766.14', '1383.17', '37.6732', '0.325571', '3698:0 3696:0 '),\n('3700', 'shmv1400', '530', '3520', '3743', '67', '70', '0', '-3280.76', '3002.45', '141.658', '1.22092', '3540:0 3701:0 '),\n('3701', 'shmv1401', '530', '3520', '3743', '67', '70', '0', '-3273.62', '3077.71', '139.787', '0.31771', '3700:0 3702:0 '),\n('3702', 'shmv1402', '530', '3520', '3743', '67', '70', '0', '-3211.67', '3079.46', '126.239', '5.52566', '3701:0 3703:0 '),\n('3703', 'shmv1403', '530', '3520', '3743', '67', '70', '0', '-3143.09', '3024.9', '104.296', '5.41086', '3538:0 3702:0 '),\n('3704', 'shmv1405', '530', '3520', '3752', '67', '70', '0', '-3656.3', '2553.97', '77.5087', '0.0120506', '3555:0 3559:0 '),\n('3705', 'shmv1406', '530', '3520', '3750', '67', '70', '0', '-2941.74', '1589.4', '40.8211', '2.08903', '3588:0 3706:0 '),\n('3706', 'shmv1407', '530', '3520', '3750', '67', '70', '0', '-2978.15', '1677.35', '67.3118', '2.1715', '3705:0 3707:0 '),\n('3707', 'shmv1408', '530', '3520', '3750', '67', '70', '0', '-3032.93', '1672.83', '67.4735', '3.60878', '3706:0 3708:0 3711:0 '),\n('3708', 'shmv1409', '530', '3520', '3750', '67', '70', '0', '-3131.22', '1754.16', '79.6664', '2.79589', '3707:0 3709:0 '),\n('3709', 'shmv1410', '530', '3520', '3750', '67', '70', '0', '-3191.61', '1765.69', '88.3304', '2.95297', '3708:0 3710:0 '),\n('3710', 'shmv1411', '530', '3520', '3520', '67', '70', '0', '-3345.81', '1700.42', '95.7466', '5.65474', '3709:0 3711:0 '),\n('3711', 'shmv1412', '530', '3520', '3520', '67', '70', '0', '-3188.39', '1586.02', '63.3792', '0.565352', '3710:0 3707:0 3712:0 3714:0 '),\n('3712', 'shmv1413', '530', '3520', '3520', '67', '70', '0', '-3052.53', '1476.53', '17.9049', '2.50057', '3711:0 3713:0 '),\n('3713', 'shmv1414', '530', '3520', '3520', '67', '70', '0', '-3107.69', '1379.15', '12.0022', '4.19702', '3712:0 '),\n('3714', 'shmv1415', '530', '3520', '3750', '67', '70', '0', '-3103.19', '1550.28', '39.5694', '2.77978', '3711:0 3715:0 '),\n('3715', 'shmv1416', '530', '3520', '3520', '67', '70', '0', '-3196.31', '1501.96', '57.1479', '2.95256', '3714:0 3716:0 '),\n('3716', 'shmv1417', '530', '3520', '3747', '67', '70', '0', '-3282.99', '1527.47', '52.2295', '5.92921', '3715:0 3717:0 '),\n('3717', 'shmv1418', '530', '3520', '3747', '67', '70', '0', '-3394.49', '1550.46', '48.1579', '2.93214', '3716:0 3718:0 '),\n('3718', 'shmv1419', '530', '3520', '3747', '67', '70', '0', '-3500.47', '1622.81', '43.8418', '3.38295', '3717:0 3719:0 '),\n('3719', 'shmv1420', '530', '3520', '3747', '67', '70', '0', '-3693.06', '1558.48', '46.9758', '1.02649', '3718:0 3720:0 '),\n('3720', 'shmv1421', '530', '3520', '3747', '67', '70', '0', '-3828.74', '1475.85', '43.1674', '4.10996', '3719:0 3721:0 '),\n('3721', 'shmv1422', '530', '3520', '3747', '67', '70', '0', '-3888.12', '1398.74', '43.6642', '4.04478', '3720:0 3722:0 '),\n('3722', 'shmv1423', '530', '3520', '3747', '67', '70', '0', '-3858.68', '1336.7', '42.2274', '4.47911', '3721:0 3723:0 '),\n('3723', 'shmv1424', '530', '3520', '3747', '67', '70', '0', '-3883.95', '1244.97', '42.1164', '4.44376', '3722:0 3724:0 3725:0 '),\n('3724', 'shmv1425', '530', '3520', '3520', '67', '70', '0', '-3774.38', '1225.16', '84.9138', '6.04598', '3723:0 '),\n('3725', 'shmv1426', '530', '3520', '3520', '67', '70', '0', '-3969.44', '1164.97', '46.6673', '5.0878', '3723:0 3575:0 '),\n('3726', 'shmv1427', '530', '3520', '3753', '67', '70', '0', '-3423.61', '1074.97', '42.8376', '3.2539', '3686:0 3727:0 '),\n('3727', 'shmv1428', '530', '3520', '3520', '67', '70', '0', '-3574.75', '1067.86', '40.499', '3.19107', '3726:0 3728:0 '),\n('3728', 'shmv1429', '530', '3520', '3821', '67', '70', '0', '-3680.33', '1058.59', '68.153', '2.90833', '3727:0 3729:0 3730:0 '),\n('3729', 'shmv1430', '530', '3520', '3821', '67', '70', '0', '-3760.76', '1068.11', '70.1361', '6.14809', '3728:0 '),\n('3730', 'shmv1431', '530', '3520', '3520', '67', '70', '0', '-3642.27', '894.441', '45.4124', '5.92247', '3728:0 3731:0 '),\n('3731', 'shmv1432', '530', '3520', '3520', '67', '70', '0', '-3522.57', '841.492', '-2.90146', '4.68834', '3730:0 3732:0 '),\n('3732', 'shmv1433', '530', '3520', '3520', '67', '70', '0', '-3522.09', '776.814', '-14.2281', '4.71976', '3731:0 3578:0 '),\n('3733', 'bt001', '571', '3537', '4129', '68', '73', '5', '2817.61', '6168.46', '85.5727', '3.94245', '3734:0 '),\n('3734', 'bt002', '571', '3537', '4020', '68', '73', '5', '2726.11', '6082.88', '72.3512', '3.45943', '3733:0 3735:0 '),\n('3735', 'bt003', '571', '3537', '4020', '68', '73', '0', '2604.99', '6083.81', '53.2961', '2.26563', '3734:0 3736:0 3786:0 '),\n('3736', 'bt004', '571', '3537', '4020', '68', '73', '0', '2505.63', '6178.07', '53.1691', '5.59574', '3735:0 3737:0 3793:0 '),\n('3737', 'bt005', '571', '3537', '4130', '68', '73', '0', '2589.16', '6313.74', '86.8706', '0.137219', '3736:0 3738:0 3786:0 '),\n('3738', 'bt006', '571', '3537', '3537', '68', '73', '0', '2818.32', '6342.97', '101.266', '3.15078', '3737:0 3739:0 3745:0 '),\n('3739', 'bt007', '571', '3537', '3537', '68', '73', '0', '2823.08', '6550.12', '55.029', '4.6077', '3738:0 3740:0 3744:0 '),\n('3740', 'bt008', '571', '3537', '4106', '68', '73', '0', '2946.88', '6730.38', '13.9226', '0.998791', '3739:0 3741:0 3742:0 '),\n('3741', 'bt009', '571', '3537', '4106', '68', '73', '0', '3100', '6716.93', '0.818624', '2.88374', '3740:0 '),\n('3742', 'bt010', '571', '3537', '4106', '68', '73', '0', '2769.6', '6817.13', '0.382068', '5.63656', '3740:0 3743:0 '),\n('3743', 'bt011', '571', '3537', '4031', '68', '73', '0', '2511.71', '6709.76', '8.65944', '0.559735', '3742:0 3744:0 '),\n('3744', 'bt012', '571', '3537', '4130', '68', '73', '0', '2598.94', '6513.07', '41.9513', '4.98704', '3743:0 3739:0 '),\n('3745', 'bt013', '571', '3537', '3537', '68', '73', '0', '2977.63', '6387.87', '96.0276', '3.55919', '3738:0 3746:0 '),\n('3746', 'bt014', '571', '3537', '3537', '68', '73', '0', '3117.74', '6401.57', '85.8869', '4.84331', '3745:0 3747:0 '),\n('3747', 'bt015', '571', '3537', '3537', '68', '73', '0', '3146.95', '6242.85', '96.6515', '5.78972', '3746:0 3748:0 '),\n('3748', 'bt016', '571', '3537', '4105', '68', '73', '0', '3332.48', '6165.54', '75.7667', '2.87983', '3747:0 '),\n('3749', 'bt017', '571', '3537', '3537', '68', '73', '0', '3270.88', '5961.4', '84.9677', '4.81845', '3750:0 3751:0 3780:0 '),\n('3750', 'bt018', '571', '3537', '3537', '68', '73', '1', '3624.25', '5933.39', '136.215', '3.44596', '3751:0 3749:0 '),\n('3751', 'bt019', '571', '3537', '4109', '68', '73', '0', '3297.83', '5691.4', '59.3737', '4.58728', '3750:0 3752:0 3749:0 '),\n('3752', 'bt020', '571', '3537', '3537', '68', '73', '0', '3304.79', '5470.21', '55.3479', '4.73257', '3751:0 3753:0 3806:0 '),\n('3753', 'bt021', '571', '3537', '3537', '68', '73', '0', '3482.47', '5425.21', '50.7507', '1.49045', '3752:0 3754:0 '),\n('3754', 'bt022', '571', '3537', '3537', '68', '73', '0', '3532.8', '5540.21', '65.5113', '4.20635', '3753:0 3755:0 3891:0 '),\n('3755', 'bt023', '571', '3537', '3537', '68', '73', '0', '3504.09', '5638.44', '63.5206', '1.09146', '3754:0 3756:0 3891:0 '),\n('3756', 'bt024', '571', '3537', '3537', '68', '73', '0', '3651.69', '5686.01', '66.2432', '0.569961', '3755:0 3757:0 3891:0 '),\n('3757', 'bt025', '571', '3537', '3537', '68', '73', '0', '3809.81', '5773.85', '68.3307', '0.134065', '3756:0 3758:0 3891:0 '),\n('3758', 'bt026', '571', '3537', '4127', '68', '73', '0', '3969.32', '5781.55', '74.0472', '0.432523', '3757:0 3759:0 3850:0 '),\n('3759', 'bt027', '571', '3537', '3537', '68', '73', '0', '4170.05', '5855.36', '62.8346', '0.137999', '3758:0 3760:0 3770:0 3773:0 '),\n('3760', 'bt028', '571', '3537', '3537', '68', '73', '0', '4324.68', '6015.4', '25.5474', '1.07655', '3759:0 3761:0 '),\n('3761', 'bt029', '571', '3537', '4099', '68', '73', '0', '4401.85', '6148.33', '0.553693', '4.54723', '3760:0 3762:0 '),\n('3762', 'bt030', '571', '3537', '4033', '68', '73', '0', '4287.27', '6236.78', '0.383892', '3.29845', '3761:0 3763:0 '),\n('3763', 'bt031', '571', '3537', '4033', '68', '73', '0', '4184.73', '6193.42', '9.12228', '1.7952', '3762:0 3764:0 '),\n('3764', 'bt032', '571', '3537', '4033', '68', '73', '0', '4149.36', '6252.75', '30.8789', '2.52797', '3763:0 3765:0 3766:0 '),\n('3765', 'bt033', '571', '3537', '4097', '68', '73', '0', '4056.14', '6303.43', '25.1363', '1.18887', '3764:0 '),\n('3766', 'bt034', '571', '3537', '4097', '68', '73', '0', '4052.65', '6367.67', '27.4251', '1.08833', '3764:0 3767:0 3769:0 '),\n('3767', 'bt035', '571', '3537', '4097', '68', '73', '0', '3991.71', '6304.02', '8.08314', '0.901407', '3766:0 '),\n('3768', 'bt036', '571', '3537', '4097', '68', '73', '0', '3854.4', '6397.67', '24.5748', '5.34115', '3769:0 '),\n('3769', 'bt037', '571', '3537', '4097', '68', '73', '0', '3960.88', '6426.15', '11.3447', '0.519589', '3766:0 3768:0 '),\n('3770', 'bt038', '571', '3537', '4134', '68', '73', '0', '4404.37', '5906.55', '55.8142', '0.126085', '3759:0 3771:0 3772:0 '),\n('3771', 'bt039', '571', '3537', '4132', '68', '73', '0', '4547.19', '6017.64', '76.7052', '4.37901', '3770:0 '),\n('3772', 'bt040', '571', '3537', '4122', '68', '73', '5', '4484.77', '5763.64', '79.4306', '1.41963', '3770:0 3773:0 '),\n('3773', 'bt041', '571', '3537', '4133', '68', '73', '0', '4321.96', '5776.59', '72.5697', '2.66048', '3772:0 3759:0 '),\n('3774', 'bt042', '571', '3537', '4032', '68', '73', '3', '2227.28', '5312.07', '10.5729', '1.23497', '3775:0 3805:0 '),\n('3775', 'bt043', '571', '3537', '4101', '68', '73', '0', '2273.96', '5439.49', '1.81269', '1.1525', '3774:0 3776:0 3787:0 3870:0 '),\n('3776', 'bt044', '571', '3537', '4101', '68', '73', '0', '2418.25', '5390.85', '3.76168', '0.12363', '3775:0 3777:0 '),\n('3777', 'bt045', '571', '3537', '3537', '68', '73', '0', '2601.94', '5522.47', '38.0963', '6.28036', '3776:0 3778:0 3787:0 3794:0 3802:0 '),\n('3778', 'bt046', '571', '3537', '3537', '68', '73', '0', '2887.65', '5415.26', '58.4905', '5.60492', '3777:0 3806:0 3813:0 '),\n('3779', 'bt047', '571', '3537', '4021', '68', '73', '0', '2976.39', '5660.32', '52.2738', '1.38733', '3780:0 '),\n('3780', 'bt048', '571', '3537', '4021', '68', '73', '0', '3019.96', '5816.72', '88.3166', '0.8297', '3779:0 3781:0 3749:0 '),\n('3781', 'bt049', '571', '3537', '4020', '68', '73', '0', '2993.07', '5973.66', '112.995', '5.04023', '3780:0 3782:0 '),\n('3782', 'bt050', '571', '3537', '4129', '68', '73', '0', '2915.6', '6074.59', '78.0969', '1.4863', '3781:0 3783:0 3798:0 '),\n('3783', 'bt051', '571', '3537', '4020', '68', '73', '0', '2970.01', '6149.83', '61.7495', '2.0298', '3782:0 3784:0 '),\n('3784', 'bt052', '571', '3537', '4020', '68', '73', '0', '2899.1', '6282.26', '61.4057', '2.97228', '3783:0 3785:0 '),\n('3785', 'bt053', '571', '3537', '4020', '68', '73', '0', '2773.74', '6303.56', '77.083', '3.07674', '3784:0 3786:0 '),\n('3786', 'bt054', '571', '3537', '4020', '68', '73', '0', '2654.28', '6218.95', '38.8344', '4.55721', '3785:0 3735:0 3737:0 '),\n('3787', 'bt055', '571', '3537', '3537', '68', '73', '0', '2316.99', '5624.68', '36.408', '5.33239', '3777:0 3775:0 3788:0 '),\n('3788', 'bt056', '571', '3537', '3537', '68', '73', '0', '2143.16', '5781.38', '58.7998', '1.77058', '3787:0 3791:0 '),\n('3789', 'bt057', '571', '3537', '4028', '68', '73', '0', '1868.5', '5774.99', '0.860459', '1.34802', '3871:0 '),\n('3790', 'bt058', '571', '3537', '4028', '68', '73', '0', '1923.91', '6030.9', '10.7946', '1.48154', '3791:0 3872:0 '),\n('3791', 'bt059', '571', '3537', '3537', '68', '73', '0', '2116.07', '6079.06', '52.9292', '3.89037', '3790:0 3788:0 3792:0 3800:0 '),\n('3792', 'bt060', '571', '3537', '4021', '68', '73', '0', '2104.14', '6314.43', '60.0072', '0.106311', '3791:0 3793:0 '),\n('3793', 'bt061', '571', '3537', '4021', '68', '73', '0', '2357.04', '6208.05', '40.7146', '2.64945', '3792:0 3736:0 '),\n('3794', 'bt062', '571', '3537', '4022', '68', '73', '0', '2647.51', '5693.12', '46.7099', '1.50275', '3777:0 3795:0 '),\n('3795', 'bt063', '571', '3537', '4022', '68', '73', '0', '2631.68', '5852.04', '45.3245', '5.86957', '3794:0 3796:0 '),\n('3796', 'bt064', '571', '3537', '4022', '68', '73', '0', '2763.87', '5811.38', '59.8902', '6.23478', '3795:0 3797:0 '),\n('3797', 'bt065', '571', '3537', '4021', '68', '73', '0', '2848.66', '5818.04', '101.625', '5.91276', '3796:0 3798:0 3799:0 '),\n('3798', 'bt066', '571', '3537', '4020', '68', '73', '0', '2837.49', '5974.58', '114.197', '5.01191', '3797:0 3782:0 '),\n('3799', 'bt067', '571', '3537', '4021', '68', '73', '0', '2607.08', '5956.42', '94.4153', '5.56483', '3797:0 3800:0 3801:0 '),\n('3800', 'bt068', '571', '3537', '4022', '68', '73', '0', '2327.62', '5973.77', '98.5945', '4.36317', '3791:0 3799:0 '),\n('3801', 'bt069', '571', '3537', '4022', '68', '73', '0', '2489.14', '5813.21', '139.945', '0.867364', '3799:0 '),\n('3802', 'bt070', '571', '3537', '4111', '68', '73', '0', '2684.66', '5308.92', '31.1745', '1.9606', '3777:0 3803:0 '),\n('3803', 'bt071', '571', '3537', '4111', '68', '73', '0', '2495.15', '5199.97', '32.4263', '0.802134', '3802:0 3804:0 '),\n('3804', 'bt072', '571', '3537', '4032', '68', '73', '0', '2416.87', '5247.86', '1.88448', '3.32877', '3803:0 3805:0 '),\n('3805', 'bt073', '571', '3537', '4032', '68', '73', '3', '2334.99', '5249.7', '9.01216', '2.3698', '3774:0 3804:0 '),\n('3806', 'bt074', '571', '3537', '3537', '68', '73', '0', '3128.49', '5378.84', '58.5466', '0.00337601', '3778:0 3752:0 3807:0 3813:0 '),\n('3807', 'bt075', '571', '3537', '3537', '68', '73', '0', '3264.11', '5285.37', '39.4799', '3.97355', '3806:0 3808:0 3845:0 '),\n('3808', 'bt076', '571', '3537', '4043', '68', '73', '0', '3152.24', '5121.1', '38.3072', '4.18325', '3807:0 3809:0 3814:0 3845:0 '),\n('3809', 'bt077', '571', '3537', '4043', '68', '73', '0', '2949.22', '5102.38', '35.483', '3.44497', '3810:0 3813:0 3808:0 '),\n('3810', 'bt078', '571', '3537', '4043', '68', '73', '0', '2736.6', '5010.38', '28.1472', '3.12924', '3809:0 3811:0 '),\n('3811', 'bt079', '571', '3537', '4115', '68', '73', '0', '2737.31', '5202.71', '29.0469', '0.938766', '3810:0 3812:0 3813:0 '),\n('3812', 'bt080', '571', '3537', '4115', '68', '73', '0', '2535.47', '5082.9', '7.68824', '3.5887', '3811:0 '),\n('3813', 'bt081', '571', '3537', '3537', '68', '73', '0', '2918.19', '5295.64', '60.2339', '1.05579', '3778:0 3809:0 3811:0 3806:0 '),\n('3814', 'bt082', '571', '3537', '4041', '68', '73', '0', '3128.73', '4853.66', '2.08073', '1.16652', '3808:0 3815:0 '),\n('3815', 'bt083', '571', '3537', '4041', '68', '73', '0', '3050.52', '4655.31', '2.27362', '4.47304', '3814:0 3816:0 '),\n('3816', 'bt084', '571', '3537', '4043', '68', '73', '0', '3249.06', '4558.38', '29.5811', '5.62916', '3815:0 3817:0 '),\n('3817', 'bt085', '571', '3537', '4043', '68', '73', '0', '3284.24', '4264.38', '24.2109', '5.22075', '3816:0 3818:0 3892:0 '),\n('3818', 'bt086', '571', '3537', '4037', '68', '73', '4', '3412.42', '4072.4', '16.8945', '0.69685', '3817:0 3819:0 3820:0 3827:0 3893:0 '),\n('3819', 'bt087', '571', '3537', '4037', '68', '73', '5', '3463.15', '4158.38', '17.1932', '1.45869', '3818:0 '),\n('3820', 'bt088', '571', '3537', '4043', '68', '73', '0', '3662.21', '3965.65', '26.4976', '5.18541', '3818:0 3821:0 3832:0 '),\n('3821', 'bt089', '571', '3537', '4125', '68', '73', '0', '3676.8', '3741.97', '49.5236', '5.32678', '3820:0 3822:0 3832:0 '),\n('3822', 'bt090', '571', '3537', '4125', '68', '73', '0', '3823.07', '3647', '46.2292', '5.63701', '3821:0 3823:0 3825:0 3826:0 '),\n('3823', 'bt091', '571', '3537', '4135', '68', '73', '0', '4026.86', '3532.95', '104.358', '5.75874', '3822:0 3824:0 3826:0 '),\n('3824', 'bt092', '571', '3537', '4125', '68', '73', '0', '3935.56', '3404.04', '80.8418', '5.58987', '3823:0 3825:0 '),\n('3825', 'bt093', '571', '3537', '4125', '68', '73', '0', '3825.9', '3505.46', '64.8278', '1.04239', '3822:0 3824:0 '),\n('3826', 'bt094', '571', '3537', '4125', '68', '73', '0', '3966.88', '3721.48', '61.9247', '4.14707', '3822:0 3823:0 '),\n('3827', 'bt095', '571', '3537', '4042', '68', '73', '0', '3416.97', '3883.04', '26.1293', '5.22225', '3818:0 3828:0 3893:0 '),\n('3828', 'bt096', '571', '3537', '4042', '68', '73', '0', '3450.42', '3652.26', '27.974', '2.1592', '3827:0 3829:0 3894:0 '),\n('3829', 'bt097', '571', '3537', '4042', '68', '73', '0', '3456.33', '3430.49', '17.996', '4.9827', '3828:0 3830:0 '),\n('3830', 'bt098', '571', '3537', '4042', '68', '73', '0', '3518.4', '3187.54', '25.0806', '4.80206', '3829:0 3831:0 '),\n('3831', 'bt099', '571', '65', '4478', '68', '73', '0', '3572.51', '3037.08', '26.2165', '3.86352', '3830:0 4063:0 '),\n('3832', 'bt100', '571', '3537', '3537', '68', '73', '0', '3907.42', '4000.44', '45.1941', '4.47613', '3820:0 3821:0 3833:0 '),\n('3833', 'bt101', '571', '3537', '3537', '68', '73', '0', '4042.02', '4199.98', '49.6907', '0.696007', '3832:0 3834:0 '),\n('3834', 'bt102', '571', '3537', '3537', '68', '73', '0', '4186.94', '4464.21', '27.3466', '1.05336', '3833:0 3835:0 '),\n('3835', 'bt103', '571', '3537', '4119', '68', '73', '0', '4191.29', '4697.78', '12.0312', '2.68463', '3834:0 3836:0 3837:0 3838:0 3862:0 '),\n('3836', 'bt104', '571', '3537', '4118', '68', '73', '0', '4358.92', '4576.58', '16.3385', '5.84976', '3835:0 '),\n('3837', 'bt105', '571', '3537', '4036', '68', '73', '0', '3992.84', '4812.66', '11.7213', '5.55524', '3835:0 '),\n('3838', 'bt106', '571', '3537', '4119', '68', '73', '0', '3978.85', '4564.24', '-2.51875', '3.44252', '3835:0 3839:0 3868:0 '),\n('3839', 'bt107', '571', '3537', '4117', '68', '73', '0', '3699.55', '4487.54', '-0.818554', '2.97836', '3838:0 3840:0 '),\n('3840', 'bt108', '571', '3537', '4117', '68', '73', '0', '3443.04', '4422.46', '-0.530089', '0.645731', '3839:0 3841:0 '),\n('3841', 'bt109', '571', '3537', '4035', '68', '73', '0', '3568.75', '4584.96', '-13.5973', '0.527922', '3840:0 3842:0 '),\n('3842', 'bt110', '571', '3537', '4035', '68', '73', '0', '3686.72', '4734.84', '-12.073', '1.14839', '3841:0 3843:0 3869:0 '),\n('3843', 'bt111', '571', '3537', '4035', '68', '73', '0', '3703.7', '4927.72', '-12.9951', '2.73489', '3842:0 3844:0 3866:0 '),\n('3844', 'bt112', '571', '3537', '4116', '68', '73', '0', '3479.66', '5024.98', '-1.50934', '2.71133', '3843:0 3845:0 '),\n('3845', 'bt113', '571', '3537', '4116', '68', '73', '0', '3344.22', '5119.48', '13.0385', '2.55424', '3844:0 3807:0 3808:0 3846:0 '),\n('3846', 'bt114', '571', '3537', '4116', '68', '73', '0', '3589.81', '5076.79', '13.0073', '6.10424', '3845:0 3847:0 '),\n('3847', 'bt115', '571', '3537', '3537', '68', '73', '0', '3668.09', '5254.47', '34.8015', '1.05413', '3846:0 3848:0 3865:0 '),\n('3848', 'bt116', '571', '3537', '3537', '68', '73', '0', '3717.74', '5416.1', '41.956', '1.99268', '3847:0 3849:0 3891:0 '),\n('3849', 'bt117', '571', '3537', '3537', '68', '73', '0', '3919.2', '5534.82', '36.9202', '0.89312', '3848:0 3850:0 '),\n('3850', 'bt118', '571', '3537', '3537', '68', '73', '0', '4101.61', '5617.94', '41.1963', '5.88275', '3849:0 3758:0 3851:0 '),\n('3851', 'bt119', '571', '3537', '3537', '68', '73', '0', '4252.89', '5577.24', '46.4033', '5.33689', '3850:0 3852:0 3857:0 '),\n('3852', 'bt120', '571', '3537', '4123', '68', '73', '0', '4429.17', '5431.27', '38.6653', '5.43664', '3851:0 3853:0 '),\n('3853', 'bt121', '571', '3537', '4123', '68', '73', '0', '4389.18', '5365.34', '1.39626', '5.27172', '3852:0 3854:0 '),\n('3854', 'bt122', '571', '3537', '4123', '68', '73', '0', '4489.75', '5395.86', '-16.0358', '0.830292', '3853:0 3855:0 '),\n('3855', 'bt123', '571', '3537', '4123', '68', '73', '0', '4444.7', '5327.16', '-22.3982', '5.89611', '3854:0 3856:0 '),\n('3856', 'bt124', '571', '3537', '4123', '68', '73', '0', '4542.22', '5322.8', '-31.8246', '3.56034', '3855:0 '),\n('3857', 'bt125', '571', '3537', '4123', '68', '73', '0', '4522.99', '5561.63', '52.4235', '6.06731', '3851:0 3858:0 4598:0 '),\n('3858', 'bt126', '571', '3537', '4123', '68', '73', '0', '4530.95', '5430.29', '84.8166', '1.59052', '3857:0 3859:0 '),\n('3859', 'bt127', '571', '3537', '4123', '68', '73', '0', '4525.48', '5247.8', '73.7381', '4.37083', '3858:0 3860:0 '),\n('3860', 'bt128', '571', '3537', '4123', '68', '73', '0', '4475.24', '5066.41', '51.9566', '0.934718', '3859:0 3861:0 '),\n('3861', 'bt129', '571', '3537', '4123', '68', '73', '0', '4378.74', '5017.74', '24.8345', '2.46704', '3860:0 3862:0 3863:0 '),\n('3862', 'bt130', '571', '3537', '3537', '68', '73', '0', '4344.7', '4804.82', '24.8231', '4.24124', '3861:0 3835:0 '),\n('3863', 'bt131', '571', '3537', '4116', '68', '73', '0', '4205.12', '5146.23', '13.0876', '5.95813', '3861:0 3864:0 '),\n('3864', 'bt132', '571', '3537', '4108', '68', '73', '3', '4060.38', '5267.77', '24.7438', '5.56545', '3863:0 3865:0 '),\n('3865', 'bt133', '571', '3537', '4116', '68', '73', '0', '3893.4', '5186.84', '13.0414', '3.37026', '3864:0 3847:0 3866:0 '),\n('3866', 'bt134', '571', '3537', '4116', '68', '73', '0', '3840.13', '5037.99', '-1.50988', '0.413233', '3865:0 3843:0 3867:0 '),\n('3867', 'bt135', '571', '3537', '4035', '68', '73', '0', '3925.28', '4915.39', '-12.887', '4.60333', '3866:0 3868:0 '),\n('3868', 'bt136', '571', '3537', '4035', '68', '73', '0', '3887.73', '4693.73', '-12.995', '4.14386', '3867:0 3838:0 3869:0 '),\n('3869', 'bt137', '571', '3537', '4035', '68', '73', '0', '3732.85', '4647.89', '-12.6525', '0.821628', '3868:0 3842:0 '),\n('3870', 'bt138', '571', '3537', '4101', '68', '73', '0', '2084.44', '5480.67', '0.253263', '0.428928', '3775:0 3871:0 '),\n('3871', 'bt139', '571', '3537', '3537', '68', '73', '0', '1935.03', '5589.92', '0.355845', '5.97934', '3870:0 3789:0 '),\n('3872', 'bt140', '571', '3537', '4029', '68', '73', '0', '1494.92', '5829.11', '1.38787', '4.0072', '3790:0 3873:0 '),\n('3873', 'bt141', '571', '3537', '4029', '68', '73', '0', '1384.5', '5858.44', '15.4001', '4.19177', '3872:0 3874:0 '),\n('3874', 'bt142', '571', '3537', '4029', '68', '73', '0', '1449.43', '5734.18', '1.3254', '1.10514', '3873:0 3875:0 '),\n('3875', 'bt143', '571', '3537', '4029', '68', '73', '0', '1402.52', '5714.94', '23.5628', '4.00326', '3874:0 3876:0 '),\n('3876', 'bt144', '571', '3537', '4029', '68', '73', '0', '1316.7', '5605.69', '5.52566', '5.40127', '3875:0 '),\n('3877', 'bt145', '571', '3537', '4024', '68', '73', '0', '4152.49', '7034.79', '165.636', '2.43875', '3878:0 3890:0 '),\n('3878', 'bt146', '571', '3537', '4024', '68', '73', '0', '3999', '7159.1', '167.793', '0.0786215', '3877:0 3879:0 '),\n('3879', 'bt147', '571', '3537', '4024', '68', '73', '0', '3840.49', '7254.47', '172.045', '3.52653', '3878:0 3880:0 3882:0 '),\n('3880', 'bt148', '571', '3537', '4024', '68', '73', '0', '3676.61', '7110.41', '160.171', '4.50434', '3879:0 3881:0 3883:0 '),\n('3881', 'bt149', '571', '3537', '4024', '68', '73', '0', '3597.15', '7199.39', '221.934', '1.51276', '3880:0 3882:0 3883:0 '),\n('3882', 'bt150', '571', '3537', '4024', '68', '73', '0', '3751.72', '7333.67', '208.956', '0.378648', '3881:0 3879:0 '),\n('3883', 'bt151', '571', '3537', '4024', '68', '73', '0', '3611.29', '6969.11', '170.734', '1.15225', '3880:0 3881:0 3884:0 '),\n('3884', 'bt152', '571', '3537', '4024', '68', '73', '0', '3644.46', '6805.44', '166.924', '3.99932', '3883:0 3885:0 '),\n('3885', 'bt153', '571', '3537', '4121', '68', '73', '1', '3587.41', '6661.1', '195.429', '4.60014', '3884:0 3886:0 '),\n('3886', 'bt154', '571', '3537', '4024', '68', '73', '0', '3749.63', '6602.97', '169.446', '3.8658', '3885:0 3887:0 3889:0 '),\n('3887', 'bt155', '571', '3537', '4024', '68', '73', '0', '3912.17', '6596.2', '168.227', '0.700643', '3886:0 3888:0 '),\n('3888', 'bt156', '571', '3537', '4024', '68', '73', '0', '3971.08', '6785.73', '156.758', '4.88682', '3887:0 3889:0 3890:0 '),\n('3889', 'bt157', '571', '3537', '4024', '68', '73', '0', '3826.86', '6694.29', '152.782', '4.14698', '3888:0 3886:0 '),\n('3890', 'bt158', '571', '3537', '4024', '68', '73', '0', '4074.45', '6887.11', '166.976', '1.01716', '3877:0 3888:0 '),\n('3891', 'bt159', '571', '3537', '4039', '68', '73', '0', '3663.21', '5603.77', '32.8151', '3.07099', '3754:0 3755:0 3756:0 3757:0 3848:0 '),\n('3892', 'bt160', '571', '3537', '4113', '68', '73', '1', '2913.96', '4067.33', '1.63263', '0.498753', '3817:0 3893:0 '),\n('3893', 'bt161', '571', '3537', '4138', '68', '73', '3', '3111.58', '3838.69', '22.5558', '0.795238', '3818:0 3827:0 3894:0 3892:0 '),\n('3894', 'bt162', '571', '3537', '4138', '68', '73', '0', '3323.93', '3770.67', '24.5945', '5.57327', '3893:0 3828:0 '),\n('3895', 'hf163', '571', '495', '3998', '68', '73', '3', '1418.1', '-3190.73', '162.344', '4.57189', '3896:0 '),\n('3896', 'hf164', '571', '495', '3998', '68', '73', '2', '1365.12', '-3385.23', '185.736', '4.52084', '3895:0 3897:0 '),\n('3897', 'hf165', '571', '495', '4048', '68', '73', '0', '1219.72', '-3550.97', '164.966', '4.23495', '3896:0 3898:0 '),\n('3898', 'hf166', '571', '495', '4048', '68', '73', '0', '1121.91', '-3657.07', '156.248', '4.07787', '3897:0 3899:0 3939:0 '),\n('3899', 'hf167', '571', '495', '4048', '68', '73', '0', '1046.11', '-3833.51', '162.833', '4.6512', '3898:0 3900:0 3912:0 3939:0 '),\n('3900', 'hf168', '571', '495', '4048', '68', '73', '0', '920.447', '-4015.29', '170.279', '3.21786', '3899:0 3901:0 3912:0 '),\n('3901', 'hf169', '571', '495', '3992', '68', '73', '0', '694.778', '-3872.94', '246.328', '2.73877', '3900:0 3902:0 '),\n('3902', 'hf170', '571', '495', '495', '68', '73', '0', '507.763', '-4025.28', '259.283', '4.81221', '3901:0 3903:0 '),\n('3903', 'hf171', '571', '495', '4260', '68', '73', '0', '397.137', '-4223.42', '249.354', '3.78334', '3902:0 3904:0 3933:0 '),\n('3904', 'hf172', '571', '495', '495', '68', '73', '0', '222.582', '-4391.88', '248.592', '4.40773', '3903:0 3905:0 4040:0 '),\n('3905', 'hf173', '571', '495', '3991', '68', '73', '0', '253.033', '-4572.61', '240.212', '5.55441', '3904:0 3906:0 4036:0 '),\n('3906', 'hf174', '571', '495', '3991', '68', '73', '5', '371.97', '-4633.54', '245.156', '2.78588', '3905:0 3907:0 3911:0 4039:0 '),\n('3907', 'hf175', '571', '495', '3991', '68', '73', '4', '407.209', '-4712.58', '228.909', '5.83714', '3906:0 3908:0 '),\n('3908', 'hf176', '571', '495', '3991', '68', '73', '0', '510.661', '-4763.01', '208.318', '0.924468', '3907:0 3909:0 4036:0 '),\n('3909', 'hf177', '571', '495', '495', '68', '73', '0', '628.585', '-4581.53', '203.482', '0.904833', '3908:0 3910:0 '),\n('3910', 'hf178', '571', '495', '3991', '68', '73', '0', '460.455', '-4423.52', '211.022', '2.64078', '3909:0 3911:0 3933:0 '),\n('3911', 'hf179', '571', '495', '3991', '68', '73', '4', '383.884', '-4495.8', '236.504', '4.36866', '3910:0 3906:0 '),\n('3912', 'hf180', '571', '495', '495', '68', '73', '0', '1081.71', '-4036.81', '154.348', '4.76135', '3899:0 3900:0 3939:0 '),\n('3913', 'hf181', '571', '495', '495', '68', '73', '0', '1215.66', '-4263.51', '149.864', '5.26401', '3914:0 '),\n('3914', 'hf182', '571', '495', '495', '68', '73', '0', '1258.74', '-4522.15', '173.24', '3.83852', '3913:0 3915:0 '),\n('3915', 'hf183', '571', '495', '495', '68', '73', '0', '1124.26', '-4644.36', '183.694', '3.62646', '3914:0 3916:0 '),\n('3916', 'hf184', '571', '495', '495', '68', '73', '0', '857.223', '-4730.31', '113.82', '0.273598', '3915:0 3917:0 '),\n('3917', 'hf185', '571', '495', '495', '68', '73', '0', '706.968', '-4825.12', '79.1984', '4.0553', '3916:0 3918:0 '),\n('3918', 'hf186', '571', '495', '3981', '68', '73', '2', '634.301', '-4890.02', '28.6664', '4.92709', '3917:0 3919:0 3932:0 '),\n('3919', 'hf187', '571', '495', '3981', '68', '73', '2', '682.36', '-4963', '6.24529', '0.414974', '3918:0 3920:0 3932:0 '),\n('3920', 'hf188', '571', '495', '3982', '68', '73', '0', '854.979', '-4933.54', '4.27721', '0.230407', '3919:0 3921:0 '),\n('3921', 'hf189', '571', '495', '3982', '68', '73', '0', '1039.98', '-4925.08', '9.42985', '0.387488', '3920:0 3922:0 '),\n('3922', 'hf190', '571', '495', '3982', '68', '73', '0', '945.95', '-4873.37', '4.59329', '0.540618', '3921:0 3923:0 '),\n('3923', 'hf191', '571', '495', '3982', '68', '73', '0', '1068.1', '-4819.17', '26.6749', '3.6728', '3922:0 3924:0 '),\n('3924', 'hf192', '571', '495', '3983', '68', '73', '0', '1158.2', '-4813.94', '28.9399', '0.405537', '3923:0 3925:0 '),\n('3925', 'hf193', '571', '495', '3983', '68', '73', '0', '1104.87', '-4804.91', '-6.8197', '0.572031', '3924:0 3926:0 '),\n('3926', 'hf194', '571', '495', '3983', '1', '60', '0', '980.459', '-4819.09', '-72.4413', '0.31677', '3925:0 3927:0 '),\n('3927', 'hf195', '571', '495', '3983', '68', '73', '0', '841.596', '-4863.98', '-72.4161', '5.00561', '3926:0 3928:0 3929:0 '),\n('3928', 'hf196', '571', '495', '3983', '68', '73', '0', '875.874', '-4966.04', '-72.4404', '1.87186', '3927:0 '),\n('3929', 'hf197', '571', '495', '495', '68', '73', '0', '795.673', '-4726.51', '-96.2356', '1.47131', '3927:0 3930:0 '),\n('3930', 'hf198', '571', '495', '3983', '68', '73', '0', '835.937', '-4866.89', '-115.736', '2.10747', '3929:0 3931:0 '),\n('3931', 'hf199', '571', '495', '3983', '68', '73', '0', '945.547', '-4827.44', '-116.158', '0.281421', '3930:0 '),\n('3932', 'hf200', '571', '495', '3981', '68', '73', '3', '554.553', '-4986.67', '10.1867', '0.251579', '3918:0 3919:0 '),\n('3933', 'hf201', '571', '495', '495', '68', '73', '0', '628.213', '-4255.8', '210.916', '3.49527', '3903:0 3910:0 3934:0 '),\n('3934', 'hf202', '571', '495', '3994', '68', '73', '0', '765.99', '-4299.85', '185.031', '3.00833', '3933:0 3935:0 '),\n('3935', 'hf203', '571', '495', '3994', '68', '73', '0', '798.758', '-4362.47', '161.294', '4.9679', '3934:0 3936:0 '),\n('3936', 'hf204', '571', '495', '3994', '68', '73', '0', '902.1', '-4478.73', '144.331', '5.55301', '3935:0 3937:0 3938:0 '),\n('3937', 'hf205', '571', '495', '3994', '68', '73', '0', '1004.65', '-4395.88', '150.922', '4.0804', '3936:0 3938:0 '),\n('3938', 'hf206', '571', '495', '3994', '68', '73', '0', '909.858', '-4395.54', '139.649', '4.34665', '3937:0 3936:0 '),\n('3939', 'hf207', '571', '495', '4048', '68', '73', '0', '1203.65', '-3825.84', '142.684', '1.05976', '3898:0 3899:0 3912:0 3940:0 '),\n('3940', 'hf208', '571', '495', '495', '68', '73', '0', '1408.56', '-3737.55', '135.962', '1.67629', '3939:0 3941:0 '),\n('3941', 'hf209', '571', '495', '495', '68', '73', '0', '1558.28', '-3740.43', '144.691', '0.00336027', '3940:0 3942:0 '),\n('3942', 'hf210', '571', '495', '495', '68', '73', '1', '1706.02', '-3730.74', '148.901', '3.19209', '3941:0 3943:0 3981:0 '),\n('3943', 'hf211', '571', '495', '495', '68', '73', '0', '1803.26', '-3895.57', '170.472', '0.273537', '3942:0 3944:0 '),\n('3944', 'hf212', '571', '495', '495', '68', '73', '0', '1949.63', '-3842.81', '173.777', '1.70846', '3943:0 3945:0 '),\n('3945', 'hf213', '571', '495', '4068', '68', '73', '0', '2008.1', '-3689.61', '173.671', '1.9378', '3944:0 3946:0 '),\n('3946', 'hf214', '571', '495', '4068', '68', '73', '0', '1967.39', '-3604.53', '158.109', '5.18071', '3945:0 3947:0 3985:0 '),\n('3947', 'hf215', '571', '495', '495', '68', '73', '0', '2096.74', '-3545.48', '153.897', '6.17032', '3946:0 3948:0 '),\n('3948', 'hf216', '571', '495', '495', '68', '73', '0', '2318.6', '-3583.13', '165.228', '0.334813', '3947:0 3949:0 '),\n('3949', 'hf217', '571', '495', '4006', '68', '73', '0', '2535.68', '-3475.65', '183.975', '0.49582', '3948:0 3950:0 3953:0 '),\n('3950', 'hf218', '571', '495', '4006', '68', '73', '0', '2624.04', '-3562.9', '205.26', '5.49331', '3949:0 3951:0 3953:0 '),\n('3951', 'hf219', '571', '495', '4006', '68', '73', '0', '2727.06', '-3698.08', '221.722', '5.46582', '3950:0 3952:0 '),\n('3952', 'hf220', '571', '495', '4065', '68', '73', '0', '2838.83', '-3844.63', '244.563', '5.37', '3951:0 '),\n('3953', 'hf221', '571', '495', '4006', '68', '73', '0', '2613.9', '-3384.95', '183', '4.543', '3949:0 3950:0 3954:0 3955:0 '),\n('3954', 'hf222', '571', '495', '4006', '68', '73', '0', '2724.44', '-3424.92', '224.685', '0.694536', '3953:0 '),\n('3955', 'hf223', '571', '495', '4054', '68', '73', '0', '2578.54', '-3191.48', '141.337', '1.90327', '3953:0 3956:0 '),\n('3956', 'hf224', '571', '495', '495', '68', '73', '0', '2515.29', '-2957.64', '111.213', '1.93861', '3955:0 3957:0 3965:0 4272:0 '),\n('3957', 'hf225', '571', '495', '4054', '68', '73', '0', '2301.09', '-3135.29', '143.7', '3.73482', '3956:0 3958:0 3964:0 '),\n('3958', 'hf226', '571', '495', '4054', '68', '73', '0', '2243.04', '-3261.92', '151.734', '2.70201', '3957:0 3959:0 '),\n('3959', 'hf227', '571', '495', '3999', '68', '73', '0', '2145.39', '-3331.7', '144.475', '1.2019', '3958:0 3960:0 '),\n('3960', 'hf228', '571', '495', '3999', '68', '73', '0', '2086.44', '-3330', '104.792', '3.06722', '3959:0 3961:0 '),\n('3961', 'hf229', '571', '495', '3999', '68', '73', '0', '1983.23', '-3286.99', '111.741', '1.78624', '3960:0 3962:0 '),\n('3962', 'hf230', '571', '495', '3999', '68', '73', '0', '2045.23', '-3172.46', '139.784', '4.15736', '3961:0 3963:0 '),\n('3963', 'hf231', '571', '495', '4062', '68', '73', '5', '2094.18', '-2981.02', '144.898', '4.45895', '3962:0 3964:0 '),\n('3964', 'hf232', '571', '495', '495', '68', '73', '0', '2264.88', '-3015.48', '135.084', '5.19722', '3963:0 3957:0 '),\n('3965', 'hf233', '571', '495', '495', '68', '73', '0', '2606.41', '-2825.71', '69.3506', '1.32522', '3956:0 3966:0 4272:0 '),\n('3966', 'hf234', '571', '495', '4070', '68', '73', '0', '2558.46', '-2678.02', '3.25504', '5.60171', '3965:0 3967:0 4276:0 '),\n('3967', 'hf235', '571', '495', '4070', '68', '73', '0', '2430.12', '-2758.92', '5.62901', '3.37275', '3966:0 3968:0 '),\n('3968', 'hf236', '571', '495', '4070', '68', '73', '0', '2281.27', '-2774.11', '4.91082', '0.329327', '3967:0 3969:0 '),\n('3969', 'hf237', '571', '495', '4070', '68', '73', '0', '2153.11', '-2770.66', '4.86218', '3.08765', '3968:0 3970:0 '),\n('3970', 'hf238', '571', '495', '4070', '68', '73', '0', '1967.15', '-2762.53', '3.5219', '3.17561', '3969:0 3971:0 '),\n('3971', 'hf239', '571', '495', '4070', '68', '73', '0', '1835.91', '-2814.57', '3.48005', '3.54396', '3970:0 3972:0 '),\n('3972', 'hf240', '571', '495', '4070', '68', '73', '0', '1677.38', '-2975.29', '3.95501', '4.155', '3971:0 3973:0 '),\n('3973', 'hf241', '571', '495', '4071', '68', '73', '0', '1576.78', '-3123.46', '2.99581', '4.44402', '3972:0 3974:0 3983:0 '),\n('3974', 'hf242', '571', '495', '4071', '68', '73', '0', '1609.87', '-3258.66', '3.34169', '4.86186', '3973:0 3975:0 '),\n('3975', 'hf243', '571', '495', '4071', '68', '73', '0', '1629.47', '-3440.1', '29.9326', '3.35783', '3974:0 3976:0 3984:0 '),\n('3976', 'hf244', '571', '495', '4071', '68', '73', '0', '1490.07', '-3428.63', '88.8301', '0.0332379', '3975:0 3977:0 '),\n('3977', 'hf245', '571', '495', '4071', '68', '73', '0', '1554.39', '-3419.81', '97.6795', '4.70636', '3976:0 3978:0 3980:0 3982:0 '),\n('3978', 'hf246', '571', '495', '4071', '68', '73', '0', '1638.14', '-3283.78', '76.0526', '5.23256', '3977:0 3979:0 '),\n('3979', 'hf247', '571', '495', '4071', '68', '73', '0', '1772.14', '-3327.31', '81.7587', '4.30737', '3978:0 '),\n('3980', 'hf248', '571', '495', '4071', '68', '73', '0', '1641.48', '-3512.7', '92.7675', '1.7077', '3977:0 3981:0 '),\n('3981', 'hf249', '571', '495', '495', '68', '73', '0', '1670.45', '-3682.65', '149.579', '1.75245', '3980:0 3942:0 3982:0 '),\n('3982', 'hf250', '571', '495', '4071', '68', '73', '0', '1565.95', '-3550.52', '112.177', '1.48387', '3981:0 3977:0 '),\n('3983', 'hf251', '571', '495', '495', '68', '73', '0', '1489.29', '-3099.07', '39.9696', '5.34802', '3973:0 3984:0 '),\n('3984', 'hf252', '571', '495', '4071', '68', '73', '0', '1511.33', '-3269.6', '74.5615', '0.545315', '3983:0 3975:0 '),\n('3985', 'hf253', '571', '495', '495', '68', '73', '0', '2104.47', '-3840.68', '209.54', '2.27867', '3946:0 3986:0 '),\n('3986', 'hf254', '571', '495', '4002', '68', '73', '0', '2068.75', '-4073.32', '236.821', '4.87048', '3985:0 3987:0 3993:0 '),\n('3987', 'hf255', '571', '495', '4002', '68', '73', '0', '1987.13', '-4141.88', '216.964', '3.23293', '3986:0 3988:0 '),\n('3988', 'hf256', '571', '495', '4002', '68', '73', '0', '1838.02', '-4120.86', '223.042', '2.70435', '3987:0 3989:0 3992:0 '),\n('3989', 'hf257', '571', '495', '4002', '68', '73', '0', '1672.75', '-4022.82', '249.031', '3.18894', '3988:0 3990:0 '),\n('3990', 'hf258', '571', '495', '4002', '68', '73', '0', '1693.59', '-4091.47', '270.671', '4.86183', '3989:0 3991:0 '),\n('3991', 'hf259', '571', '495', '4002', '68', '73', '0', '1644.9', '-4213.64', '258.417', '6.27555', '3990:0 3992:0 '),\n('3992', 'hf260', '571', '495', '4002', '68', '73', '0', '1773.12', '-4215.36', '238.947', '0.851593', '3991:0 3988:0 '),\n('3993', 'hf261', '571', '495', '495', '68', '73', '0', '2130.43', '-4316.44', '219.989', '1.40137', '3986:0 3994:0 '),\n('3994', 'hf262', '571', '495', '495', '68', '73', '0', '2183.63', '-4535.73', '216.514', '4.86106', '3993:0 3995:0 '),\n('3995', 'hf263', '571', '495', '495', '68', '73', '0', '2377.58', '-4396.75', '228.263', '0.804472', '3994:0 3996:0 '),\n('3996', 'hf264', '571', '495', '495', '68', '73', '0', '2551.09', '-4320.92', '279.902', '6.10198', '3995:0 3997:0 '),\n('3997', 'hf265', '571', '495', '4018', '68', '73', '5', '2613.73', '-4366.35', '276.555', '2.42318', '3996:0 3998:0 '),\n('3998', 'hf266', '571', '495', '4018', '68', '73', '4', '2716.59', '-4368.81', '272.672', '5.25063', '3997:0 3999:0 '),\n('3999', 'hf267', '571', '495', '495', '68', '73', '0', '2797.23', '-4621.23', '277.95', '5.09748', '3998:0 4000:0 4306:0 '),\n('4000', 'hf268', '571', '495', '495', '68', '73', '0', '2607.42', '-4744.93', '256.769', '3.77173', '3999:0 4001:0 '),\n('4001', 'hf269', '571', '495', '495', '68', '73', '0', '2455.43', '-4885.82', '260.773', '3.54789', '4000:0 4002:0 4005:0 '),\n('4002', 'hf270', '571', '495', '495', '68', '73', '3', '2431.15', '-4962.71', '273.723', '1.34484', '4001:0 4003:0 '),\n('4003', 'hf271', '571', '495', '4003', '68', '73', '2', '2510.75', '-4994.59', '283.35', '2.79784', '4002:0 4004:0 '),\n('4004', 'hf272', '571', '495', '4003', '68', '73', '2', '2456.13', '-5113.98', '277.313', '4.08197', '4003:0 '),\n('4005', 'hf273', '571', '495', '495', '68', '73', '0', '2232.27', '-4879.42', '237.068', '0.178543', '4001:0 4006:0 '),\n('4006', 'hf274', '571', '495', '495', '68', '73', '0', '2035.15', '-4874.68', '210.788', '3.93982', '4005:0 4007:0 4010:0 '),\n('4007', 'hf275', '571', '495', '495', '68', '73', '0', '1888.77', '-4884.63', '168.445', '3.11672', '4006:0 4008:0 '),\n('4008', 'hf276', '571', '495', '4059', '68', '73', '0', '1712.12', '-4879.28', '126.121', '3.13635', '4007:0 4009:0 '),\n('4009', 'hf277', '571', '495', '4059', '68', '73', '0', '1563', '-4951.92', '143.133', '4.04662', '4008:0 '),\n('4010', 'hf278', '571', '495', '495', '68', '73', '0', '1915.43', '-5076.01', '179.861', '4.59721', '4006:0 4011:0 '),\n('4011', 'hf279', '571', '495', '495', '68', '73', '0', '1824.95', '-5278.57', '182.601', '4.39143', '4010:0 4012:0 4018:0 '),\n('4012', 'hf280', '571', '495', '4061', '68', '73', '0', '1965.2', '-5427.02', '202.866', '6.04468', '4011:0 4013:0 '),\n('4013', 'hf281', '571', '495', '4061', '68', '73', '0', '2137.38', '-5461.32', '239.114', '6.25123', '4012:0 4014:0 '),\n('4014', 'hf282', '571', '495', '4061', '68', '73', '0', '2177.05', '-5614.25', '226.937', '4.76369', '4013:0 4015:0 4351:0 '),\n('4015', 'hf283', '571', '495', '4061', '68', '73', '0', '2173.72', '-5813.08', '225.029', '3.53925', '4014:0 4016:0 4351:0 '),\n('4016', 'hf284', '571', '495', '4061', '68', '73', '0', '1978.82', '-5763.87', '223.278', '2.62034', '4015:0 4017:0 '),\n('4017', 'hf285', '571', '495', '4061', '68', '73', '0', '1834.38', '-5629.13', '215.972', '1.48308', '4016:0 4018:0 '),\n('4018', 'hf286', '571', '495', '495', '68', '73', '1', '1667.21', '-5453.46', '197.385', '2.72951', '4017:0 4011:0 4019:0 4022:0 '),\n('4019', 'hf287', '571', '495', '4001', '68', '73', '0', '1532.35', '-5419.75', '189.418', '2.63761', '4018:0 4020:0 '),\n('4020', 'hf288', '571', '495', '4001', '68', '73', '0', '1486.1', '-5319.6', '195.08', '1.17912', '4019:0 4021:0 '),\n('4021', 'hf289', '571', '495', '4001', '68', '73', '0', '1504.6', '-5264.18', '206.615', '0.745568', '4020:0 '),\n('4022', 'hf290', '571', '495', '495', '68', '73', '0', '1492.09', '-5524.43', '200.456', '3.74892', '4018:0 4023:0 4026:0 '),\n('4023', 'hf291', '571', '495', '4403', '68', '73', '0', '1532.33', '-5613.29', '226.19', '4.85477', '4022:0 4024:0 '),\n('4024', 'hf292', '571', '495', '4402', '68', '73', '4', '1541.33', '-5689.58', '248.356', '1.64643', '4023:0 4025:0 '),\n('4025', 'hf293', '571', '495', '495', '68', '73', '5', '1631.27', '-5779.62', '258.389', '2.51272', '4024:0 '),\n('4026', 'hf294', '571', '495', '495', '68', '73', '0', '1394.07', '-5574.59', '205.361', '0.236628', '4022:0 4027:0 '),\n('4027', 'hf295', '571', '495', '495', '68', '73', '0', '1234.61', '-5679.7', '225.93', '3.5408', '4026:0 4028:0 4058:0 '),\n('4028', 'hf296', '571', '495', '3984', '68', '73', '0', '1037.41', '-5697.06', '228.706', '3.34052', '4027:0 4029:0 4062:0 '),\n('4029', 'hf297', '571', '495', '495', '68', '73', '0', '877.228', '-5789.41', '249.962', '3.77328', '4028:0 4030:0 '),\n('4030', 'hf298', '571', '495', '495', '68', '73', '0', '739.705', '-5863.89', '287.056', '4.11336', '4029:0 4031:0 '),\n('4031', 'hf299', '571', '495', '495', '68', '73', '3', '483.188', '-5922.44', '308.68', '1.33265', '4030:0 4032:0 '),\n('4032', 'hf300', '571', '495', '495', '68', '73', '0', '513.926', '-5588.33', '281.883', '2.6321', '4031:0 4033:0 '),\n('4033', 'hf301', '571', '495', '495', '68', '73', '0', '342.715', '-5438.85', '298.648', '2.30775', '4032:0 4034:0 '),\n('4034', 'hf302', '571', '495', '495', '68', '73', '0', '221.35', '-5242.73', '299.653', '1.84436', '4033:0 4035:0 '),\n('4035', 'hf303', '571', '495', '4057', '68', '73', '0', '161.173', '-4925.94', '298.444', '1.79331', '4034:0 4036:0 4037:0 4039:0 '),\n('4036', 'hf304', '571', '495', '495', '68', '73', '0', '285.533', '-4807.39', '248.989', '1.63624', '4035:0 3905:0 3908:0 '),\n('4037', 'hf305', '571', '495', '4057', '68', '73', '0', '-28.8267', '-4914.36', '302.775', '3.12851', '4035:0 4038:0 '),\n('4038', 'hf306', '571', '495', '4057', '68', '73', '0', '-143.121', '-5118.6', '323.883', '1.16107', '4037:0 '),\n('4039', 'hf307', '571', '495', '495', '68', '73', '0', '115.019', '-4716.56', '289.321', '1.68335', '4035:0 3906:0 4040:0 '),\n('4040', 'hf308', '571', '495', '495', '68', '73', '0', '156.917', '-4507.79', '256.612', '1.23411', '4039:0 3904:0 '),\n('4041', 'hf309', '571', '495', '3988', '68', '73', '1', '778.297', '-2898.22', '7.01161', '4.8391', '4042:0 '),\n('4042', 'hf310', '571', '495', '3987', '68', '73', '0', '741.908', '-3049.69', '25.2093', '3.79609', '4041:0 4043:0 4046:0 4047:0 4048:0 4049:0 '),\n('4043', 'hf311', '571', '495', '3987', '68', '73', '0', '590.131', '-3156.57', '40.1902', '3.94689', '4042:0 4044:0 4053:0 '),\n('4044', 'hf312', '571', '495', '3987', '68', '73', '0', '471.48', '-3318.84', '48.7074', '3.51255', '4043:0 4045:0 '),\n('4045', 'hf313', '571', '495', '3987', '68', '73', '0', '386.081', '-3089.98', '71.2014', '1.81688', '4044:0 4046:0 '),\n('4046', 'hf314', '571', '495', '3987', '68', '73', '0', '508.887', '-3028.15', '24.4901', '2.16561', '4045:0 4042:0 '),\n('4047', 'hf315', '571', '495', '3987', '68', '73', '0', '986.117', '-3034.77', '57.92', '0.46364', '4042:0 4048:0 '),\n('4048', 'hf316', '571', '495', '3987', '68', '73', '0', '749.692', '-3240.83', '24.9581', '2.15066', '4042:0 4047:0 4051:0 '),\n('4049', 'hf317', '571', '495', '3987', '68', '73', '0', '675.991', '-3161.57', '61.349', '1.00634', '4042:0 4050:0 '),\n('4050', 'hf318', '571', '495', '3987', '68', '73', '0', '677.454', '-3393.96', '67.7866', '4.88621', '4049:0 '),\n('4051', 'hf319', '571', '495', '3987', '68', '73', '0', '566.586', '-3287.72', '26.0315', '4.65294', '4048:0 4052:0 '),\n('4052', 'hf320', '571', '495', '4226', '68', '73', '0', '551.1', '-3494.05', '3.24654', '4.58853', '4051:0 '),\n('4053', 'hf321', '571', '495', '3987', '68', '73', '0', '370.473', '-3216.41', '23.421', '3.95629', '4043:0 4054:0 '),\n('4054', 'hf322', '571', '495', '4474', '68', '73', '0', '223.035', '-3291.75', '0.0638989', '3.59893', '4053:0 4055:0 '),\n('4055', 'hf323', '571', '495', '4474', '68', '73', '0', '114.305', '-3330.69', '0.616794', '0.370948', '4054:0 4056:0 '),\n('4056', 'hf324', '571', '495', '3989', '68', '73', '0', '-16.534', '-3453.36', '32.7157', '1.36763', '4055:0 4057:0 '),\n('4057', 'hf325', '571', '495', '3990', '68', '73', '0', '-130.721', '-3573.93', '3.18551', '1.92133', '4056:0 '),\n('4058', 'hf326', '571', '495', '495', '68', '73', '0', '1337.07', '-5914.2', '292.65', '4.10948', '4027:0 4059:0 '),\n('4059', 'hf327', '571', '495', '4005', '68', '73', '0', '1323.93', '-6111.92', '266.982', '3.40577', '4058:0 4060:0 '),\n('4060', 'hf328', '571', '495', '4005', '68', '73', '0', '1181.44', '-6169.63', '232.169', '2.26694', '4059:0 4061:0 '),\n('4061', 'hf329', '571', '495', '4005', '68', '73', '0', '1118.44', '-6156.85', '260.616', '1.64883', '4060:0 4062:0 '),\n('4062', 'hf330', '571', '495', '495', '68', '73', '0', '1131.33', '-5884.77', '271.705', '2.04153', '4061:0 4028:0 '),\n('4063', 'db331', '571', '65', '4478', '70', '74', '0', '3509.64', '2944.69', '24.9497', '4.10306', '3831:0 '),\n('4064', 'db332', '571', '65', '65', '70', '74', '0', '3526.72', '2777.23', '49.7018', '4.66854', '4065:0 4221:0 4228:0 '),\n('4065', 'db333', '571', '65', '4157', '70', '74', '0', '3369.46', '2655.03', '38.9276', '4.90416', '4064:0 4066:0 '),\n('4066', 'db334', '571', '65', '4157', '70', '74', '0', '3440.83', '2477.55', '45.9125', '4.61748', '4065:0 4067:0 '),\n('4067', 'db335', '571', '65', '4157', '70', '74', '0', '3395.92', '2379.05', '36.7537', '2.28876', '4066:0 4068:0 '),\n('4068', 'db336', '571', '65', '4157', '70', '74', '0', '3343.5', '2223.35', '29.9841', '5.39185', '4067:0 4070:0 4069:0 '),\n('4069', 'db337', '571', '65', '65', '70', '74', '3', '3489.08', '1998.02', '64.8654', '1.46526', '4068:0 4070:0 4214:0 '),\n('4070', 'db338', '571', '65', '4160', '70', '74', '0', '3228.78', '1905.36', '132.824', '3.97029', '4071:0 4068:0 4069:0 '),\n('4071', 'db339', '571', '65', '4160', '70', '74', '0', '2981.37', '1896.75', '127.972', '2.94456', '4070:0 4072:0 '),\n('4072', 'db340', '571', '65', '4160', '70', '74', '0', '2800.15', '1812.41', '147.093', '5.30074', '4071:0 4073:0 '),\n('4073', 'db341', '571', '65', '4160', '70', '74', '0', '2944.01', '1641.57', '152.165', '4.64493', '4072:0 4074:0 '),\n('4074', 'db342', '571', '65', '4153', '70', '74', '0', '2869.62', '1469.27', '157.603', '5.17349', '4073:0 4075:0 '),\n('4075', 'db343', '571', '65', '4153', '70', '74', '0', '2927.17', '1282.72', '151.277', '5.62666', '4074:0 4076:0 '),\n('4076', 'db344', '571', '65', '4153', '70', '74', '0', '3121.27', '1266.58', '158.478', '3.9082', '4075:0 4077:0 4082:0 '),\n('4077', 'db345', '571', '65', '4154', '70', '74', '0', '3098.59', '1055.28', '114.785', '4.75643', '4076:0 4078:0 4081:0 '),\n('4078', 'db346', '571', '65', '4152', '70', '74', '0', '3015.6', '886.551', '57.0023', '3.13067', '4077:0 4079:0 4081:0 '),\n('4079', 'db347', '571', '65', '4152', '70', '74', '0', '2864.53', '878.189', '19.1406', '2.82436', '4078:0 4080:0 '),\n('4080', 'db348', '571', '65', '4152', '70', '74', '1', '2657.93', '892.145', '4.37495', '3.30424', '4079:0 '),\n('4081', 'db349', '571', '65', '4154', '70', '74', '0', '3216.12', '884.158', '119.499', '2.58873', '4077:0 4078:0 4082:0 '),\n('4082', 'db350', '571', '65', '4154', '70', '74', '0', '3342.09', '1163.09', '140.364', '0.88363', '4076:0 4081:0 4083:0 '),\n('4083', 'db351', '571', '65', '4154', '70', '74', '0', '3499.57', '1159.74', '129.579', '0.224683', '4082:0 4084:0 4208:0 '),\n('4084', 'db352', '571', '65', '4254', '70', '74', '0', '3512.34', '930.529', '67.6824', '4.436', '4083:0 4085:0 '),\n('4085', 'db353', '571', '65', '4254', '70', '74', '0', '3439.05', '725.86', '74.9159', '3.52022', '4084:0 4086:0 '),\n('4086', 'db354', '571', '65', '4254', '70', '74', '0', '3383.4', '548.065', '79.6602', '4.13597', '4085:0 4087:0 '),\n('4087', 'db355', '571', '65', '4254', '70', '74', '0', '3284.71', '349.551', '72.0866', '4.38102', '4086:0 4088:0 '),\n('4088', 'db356', '571', '65', '4254', '70', '74', '0', '3258.62', '161.424', '74.762', '4.63863', '4087:0 4089:0 '),\n('4089', 'db357', '571', '65', '4254', '70', '74', '0', '3199.28', '-65.6434', '75.8214', '5.73582', '4088:0 4090:0 '),\n('4090', 'db358', '571', '65', '4254', '70', '74', '0', '3396.24', '-138.385', '72.6226', '6.16308', '4089:0 4091:0 4176:0 '),\n('4091', 'db359', '571', '65', '4176', '70', '74', '0', '3614.83', '-219.548', '59.6726', '5.91567', '4090:0 4092:0 '),\n('4092', 'db360', '571', '65', '4254', '70', '74', '0', '3790.53', '-250.696', '72.8378', '0.182258', '4091:0 4175:0 '),\n('4093', 'db361', '571', '65', '4254', '70', '74', '0', '3996.13', '-105.238', '55.0057', '0.538831', '4094:0 '),\n('4094', 'db362', '571', '65', '4254', '70', '74', '0', '4209.42', '-149.468', '68.6085', '5.25672', '4093:0 4095:0 '),\n('4095', 'db363', '571', '65', '4254', '70', '74', '0', '4346.6', '-340.238', '86.1907', '5.65727', '4094:0 4139:0 '),\n('4096', 'db364', '571', '65', '4254', '70', '74', '0', '4531.54', '-157.776', '94.5998', '0.726543', '4097:0 '),\n('4097', 'db365', '571', '65', '4253', '70', '74', '0', '4529.69', '-5.32293', '72.4325', '1.1538', '4096:0 4098:0 '),\n('4098', 'db366', '571', '65', '4187', '70', '74', '0', '4719.33', '26.5065', '64.7658', '0.68649', '4097:0 4099:0 '),\n('4099', 'db367', '571', '65', '4187', '70', '74', '0', '4857.73', '152.013', '95.1974', '0.64722', '4098:0 4100:0 4102:0 '),\n('4100', 'db368', '571', '65', '4187', '70', '74', '0', '5023.32', '291.159', '160.107', '0.61659', '4099:0 4101:0 '),\n('4101', 'db369', '571', '65', '4187', '70', '74', '0', '5185.63', '203.224', '194.36', '2.54081', '4100:0 4585:0 '),\n('4102', 'db370', '571', '65', '4187', '70', '74', '0', '4916.98', '373.751', '114.702', '2.28006', '4099:0 4103:0 '),\n('4103', 'db371', '571', '65', '4396', '70', '74', '0', '4715.84', '582.426', '121.086', '2.36646', '4102:0 4104:0 4136:0 '),\n('4104', 'db372', '571', '65', '4254', '70', '74', '0', '4669.25', '828.097', '110.706', '2.44265', '4105:0 4133:0 4103:0 '),\n('4105', 'db373', '571', '65', '4254', '70', '74', '0', '4441.38', '887.155', '84.3941', '2.82121', '4104:0 4106:0 4107:0 '),\n('4106', 'db374', '571', '65', '4254', '70', '74', '0', '4443.49', '662.985', '67.5233', '2.64843', '4105:0 4107:0 '),\n('4107', 'db375', '571', '65', '4254', '70', '74', '0', '4350.16', '761.448', '67.5378', '5.48843', '4106:0 4105:0 4108:0 '),\n('4108', 'db376', '571', '65', '4173', '70', '74', '0', '4171.02', '645.93', '64.3628', '5.72325', '4107:0 4109:0 '),\n('4109', 'db377', '571', '65', '4173', '70', '74', '0', '4234.66', '525', '11.3008', '1.28578', '4108:0 4110:0 '),\n('4110', 'db378', '571', '65', '4173', '70', '74', '0', '4325.75', '527.107', '-8.31338', '5.11853', '4109:0 4111:0 '),\n('4111', 'db379', '571', '65', '4173', '70', '74', '0', '4340.91', '393.399', '-6.35666', '0.319745', '4110:0 4112:0 '),\n('4112', 'db380', '571', '65', '4173', '70', '74', '0', '4445.71', '448.569', '48.7618', '3.60429', '4111:0 4113:0 '),\n('4113', 'db381', '571', '65', '4254', '70', '74', '0', '4396.23', '306.166', '44.9454', '3.30034', '4112:0 4114:0 '),\n('4114', 'db382', '571', '65', '4254', '70', '74', '0', '4238.24', '300.479', '69.4901', '3.54617', '4113:0 4115:0 '),\n('4115', 'db383', '571', '65', '4254', '70', '74', '0', '4069.57', '365.886', '52.151', '2.76941', '4114:0 4116:0 '),\n('4116', 'db384', '571', '65', '4254', '70', '74', '0', '3905.43', '429.963', '42.0653', '2.76941', '4115:0 4117:0 '),\n('4117', 'db385', '571', '65', '4254', '70', '74', '0', '3784.72', '555.764', '65.4753', '2.52593', '4116:0 4118:0 '),\n('4118', 'db386', '571', '65', '4254', '70', '74', '0', '3856.57', '647.11', '62.7715', '2.10102', '4117:0 4119:0 '),\n('4119', 'db387', '571', '65', '4254', '70', '74', '0', '3750.11', '814.498', '76.6706', '1.69811', '4118:0 4120:0 4123:0 '),\n('4120', 'db388', '571', '65', '4168', '70', '74', '0', '3669.68', '935.971', '55.9559', '1.74995', '4119:0 4121:0 '),\n('4121', 'db389', '571', '65', '4168', '70', '74', '0', '3656.82', '1058.49', '58.5011', '5.83088', '4120:0 4122:0 '),\n('4122', 'db390', '571', '65', '4168', '70', '74', '0', '3822.88', '1076.68', '57.7067', '4.99837', '4121:0 4123:0 '),\n('4123', 'db391', '571', '65', '4168', '70', '74', '0', '3851.01', '940.099', '56.0659', '4.66535', '4122:0 4119:0 4124:0 '),\n('4124', 'db392', '571', '65', '4254', '70', '74', '0', '4005.33', '1003', '53.2598', '6.17489', '4123:0 4125:0 '),\n('4125', 'db393', '571', '65', '4254', '70', '74', '0', '4142.41', '981.525', '78.4202', '0.463487', '4124:0 4126:0 '),\n('4126', 'db394', '571', '65', '4254', '70', '74', '0', '4305.2', '1039.06', '63.1545', '6.25972', '4125:0 4127:0 '),\n('4127', 'db395', '571', '65', '65', '70', '74', '0', '4276.99', '1183.3', '141.02', '6.17961', '4126:0 4128:0 '),\n('4128', 'db396', '571', '65', '65', '70', '74', '0', '4489.67', '1187.53', '136.792', '1.18448', '4127:0 4129:0 4133:0 '),\n('4129', 'db397', '571', '65', '4169', '70', '74', '2', '4570.48', '1377.12', '189.542', '1.18173', '4128:0 4130:0 '),\n('4130', 'db398', '571', '65', '4169', '70', '74', '3', '4589.48', '1435.55', '189.222', '0.103772', '4129:0 4131:0 4132:0 '),\n('4131', 'db399', '571', '65', '4169', '70', '74', '2', '4621.53', '1507.35', '204.751', '1.03447', '4130:0 '),\n('4132', 'db400', '571', '65', '4171', '70', '74', '2', '4711.55', '1446.21', '175.428', '5.44841', '4130:0 '),\n('4133', 'db401', '571', '65', '65', '70', '74', '0', '4690.88', '1098.68', '123.008', '2.0861', '4134:0 4128:0 4104:0 '),\n('4134', 'db402', '571', '65', '4170', '70', '74', '4', '4841.36', '1140.74', '171.495', '1.04781', '4135:0 4133:0 '),\n('4135', 'db403', '571', '65', '4170', '70', '74', '5', '4947.98', '1224.66', '225.705', '1.29599', '4134:0 '),\n('4136', 'db404', '571', '65', '4230', '70', '74', '0', '4857.56', '636.316', '157.933', '3.35764', '4137:0 4103:0 '),\n('4137', 'db405', '571', '65', '4230', '70', '74', '0', '4919.39', '858.686', '179.409', '4.72424', '4136:0 4138:0 '),\n('4138', 'db406', '571', '65', '4230', '70', '74', '0', '5115.8', '1070.31', '223.911', '0.494084', '4137:0 '),\n('4139', 'db407', '571', '65', '65', '70', '74', '0', '4361.47', '-666.576', '126.529', '4.95513', '4095:0 4140:0 4144:0 '),\n('4140', 'db408', '571', '65', '4193', '70', '74', '0', '4506.23', '-611.765', '138.674', '0.191691', '4139:0 4141:0 '),\n('4141', 'db409', '571', '65', '4193', '70', '74', '0', '4635.8', '-532.061', '166.561', '4.05115', '4140:0 4142:0 '),\n('4142', 'db410', '571', '65', '4193', '70', '74', '0', '4701.77', '-386.751', '178.452', '4.03308', '4141:0 4143:0 '),\n('4143', 'db411', '571', '65', '65', '70', '74', '0', '4744.71', '-265.341', '170.449', '0.542767', '4142:0 '),\n('4144', 'db412', '571', '65', '65', '70', '74', '0', '4381.74', '-907.37', '164.196', '4.73833', '4139:0 4145:0 '),\n('4145', 'db413', '571', '65', '65', '70', '74', '0', '4453.65', '-1048.77', '166.994', '5.44283', '4144:0 4146:0 4147:0 '),\n('4146', 'db414', '571', '65', '4191', '70', '74', '1', '4598.46', '-1084.15', '165.481', '5.41142', '4145:0 4151:0 '),\n('4147', 'db415', '571', '65', '65', '70', '74', '0', '4459.56', '-1263.85', '163.284', '4.29694', '4145:0 4148:0 4152:0 4153:0 '),\n('4148', 'db416', '571', '65', '4194', '70', '74', '0', '4561.66', '-1361.99', '156.723', '5.94234', '4147:0 4149:0 '),\n('4149', 'db417', '571', '65', '4194', '70', '74', '0', '4677.53', '-1359.08', '162.34', '2.13944', '4148:0 4150:0 4405:0 '),\n('4150', 'db418', '571', '65', '4194', '70', '74', '0', '4810.96', '-1263.2', '168.051', '2.83451', '4149:0 4151:0 '),\n('4151', 'db419', '571', '65', '65', '70', '74', '0', '4682.42', '-1190.97', '164.492', '2.29651', '4150:0 4146:0 '),\n('4152', 'db420', '571', '65', '65', '70', '74', '0', '4426.84', '-1508.64', '159.241', '4.50584', '4147:0 4230:0 '),\n('4153', 'db421', '571', '65', '65', '70', '74', '0', '4306.11', '-1358.64', '159.518', '2.56747', '4147:0 4154:0 '),\n('4154', 'db422', '571', '65', '4189', '70', '74', '0', '4174.24', '-1186.41', '145.827', '2.02005', '4153:0 4155:0 '),\n('4155', 'db423', '571', '65', '4189', '70', '74', '0', '4007.83', '-1254.48', '133.053', '2.98923', '4154:0 4156:0 '),\n('4156', 'db424', '571', '65', '65', '70', '74', '0', '3870.4', '-1277.63', '147.246', '3.74243', '4155:0 4157:0 4165:0 '),\n('4157', 'db425', '571', '65', '4188', '70', '74', '0', '3760.87', '-1379.1', '135.314', '4.06287', '4156:0 4158:0 '),\n('4158', 'db426', '571', '65', '4188', '70', '74', '0', '3749.27', '-1504.65', '141.102', '2.59496', '4157:0 4159:0 '),\n('4159', 'db427', '571', '65', '4188', '70', '74', '0', '3628.59', '-1546.14', '118.335', '2.62324', '4158:0 4160:0 '),\n('4160', 'db428', '571', '65', '4188', '70', '74', '0', '3581.08', '-1357.67', '107.693', '1.20402', '4159:0 4161:0 '),\n('4161', 'db429', '571', '65', '4188', '70', '74', '0', '3627.72', '-1237', '112.462', '1.20323', '4160:0 4162:0 '),\n('4162', 'db430', '571', '65', '4188', '70', '74', '0', '3662.83', '-1064.27', '125.377', '1.29591', '4161:0 4163:0 '),\n('4163', 'db431', '571', '65', '4188', '70', '74', '0', '3755.72', '-1010.08', '121.509', '5.72713', '4162:0 4164:0 4166:0 '),\n('4164', 'db432', '571', '65', '4188', '70', '74', '0', '3850.53', '-1132.6', '122.334', '6.27534', '4163:0 4165:0 '),\n('4165', 'db433', '571', '65', '65', '70', '74', '0', '3942.27', '-1148.57', '140.166', '4.29771', '4164:0 4156:0 '),\n('4166', 'db434', '571', '65', '4177', '70', '74', '0', '3746.15', '-891.172', '162.614', '2.06089', '4163:0 4167:0 4170:0 '),\n('4167', 'db435', '571', '65', '4177', '70', '74', '0', '3650.12', '-879.646', '162.72', '3.17459', '4166:0 4168:0 '),\n('4168', 'db436', '571', '65', '4177', '70', '74', '2', '3590.79', '-835.238', '172.37', '1.65563', '4167:0 4169:0 4194:0 '),\n('4169', 'db437', '571', '65', '4243', '70', '74', '0', '3599.65', '-781.467', '147.621', '0.0926948', '4168:0 '),\n('4170', 'db438', '571', '65', '4177', '70', '74', '3', '3768.81', '-779.501', '195.937', '4.02283', '4166:0 4171:0 '),\n('4171', 'db439', '571', '65', '4177', '70', '74', '2', '3925.37', '-698.927', '241.206', '0.865546', '4170:0 4172:0 '),\n('4172', 'db440', '571', '65', '4175', '70', '74', '0', '3986.58', '-553.999', '216.076', '2.58635', '4171:0 4173:0 '),\n('4173', 'db441', '571', '65', '4254', '70', '74', '0', '3809.46', '-473.161', '169.556', '2.73087', '4172:0 4174:0 '),\n('4174', 'db442', '571', '65', '65', '70', '74', '0', '3724.29', '-439.939', '157.058', '3.21388', '4173:0 4175:0 '),\n('4175', 'db443', '571', '65', '4254', '70', '74', '0', '3784.04', '-368.672', '97.0346', '1.91644', '4174:0 4092:0 '),\n('4176', 'db444', '571', '65', '4254', '70', '74', '0', '3263.75', '-275.159', '91.4928', '3.40319', '4090:0 4177:0 '),\n('4177', 'db445', '571', '65', '65', '70', '74', '0', '3244.55', '-472.809', '140.618', '1.83632', '4176:0 4178:0 4188:0 '),\n('4178', 'db446', '571', '65', '65', '70', '74', '0', '3148.48', '-604.869', '113.192', '1.5842', '4177:0 4179:0 4191:0 '),\n('4179', 'db447', '571', '65', '4180', '70', '74', '0', '2993.93', '-429.733', '123.402', '2.59501', '4178:0 4180:0 '),\n('4180', 'db448', '571', '65', '4180', '70', '74', '0', '2867.29', '-384.503', '112.462', '2.7623', '4179:0 4181:0 4187:0 '),\n('4181', 'db449', '571', '65', '4180', '70', '74', '0', '2773.28', '-465.739', '116.162', '4.48387', '4180:0 4182:0 '),\n('4182', 'db450', '571', '65', '4180', '70', '74', '0', '2687.72', '-431.283', '71.3279', '2.92957', '4181:0 4183:0 '),\n('4183', 'db451', '571', '65', '4181', '70', '74', '0', '2536.4', '-415.378', '2.90773', '1.58496', '4182:0 4184:0 4207:0 '),\n('4184', 'db452', '571', '65', '4181', '70', '74', '0', '2612.51', '-244.345', '1.72779', '6.26044', '4183:0 4185:0 '),\n('4185', 'db453', '571', '65', '4180', '70', '74', '0', '2656.87', '-171.598', '62.2241', '1.32029', '4184:0 4186:0 '),\n('4186', 'db454', '571', '65', '4180', '70', '74', '0', '2737.23', '-100.56', '114.159', '4.23648', '4185:0 4187:0 '),\n('4187', 'db455', '571', '65', '4180', '70', '74', '0', '2792.04', '-264.842', '132.149', '5.26534', '4186:0 4180:0 '),\n('4188', 'db456', '571', '65', '4186', '70', '74', '5', '3231.05', '-661.255', '166.734', '1.42239', '4177:0 4189:0 '),\n('4189', 'db457', '571', '65', '4186', '70', '74', '4', '3272.19', '-751.348', '168.143', '4.40298', '4188:0 4190:0 '),\n('4190', 'db458', '571', '65', '65', '70', '74', '0', '3325.52', '-1005.39', '123.604', '2.0507', '4189:0 4191:0 4192:0 4203:0 '),\n('4191', 'db459', '571', '65', '65', '70', '74', '0', '3207.68', '-802.517', '112.975', '2.23134', '4190:0 4178:0 '),\n('4192', 'db460', '571', '65', '65', '70', '74', '0', '3400.63', '-1169.43', '112.122', '5.78762', '4190:0 4193:0 4195:0 '),\n('4193', 'db461', '571', '65', '65', '70', '74', '0', '3494.11', '-1049.52', '124.775', '0.832553', '4192:0 4194:0 '),\n('4194', 'db462', '571', '65', '4177', '70', '74', '2', '3600.71', '-914.48', '156.552', '1.53549', '4193:0 4168:0 '),\n('4195', 'db463', '571', '65', '65', '70', '74', '0', '3235.06', '-1355.04', '70.8979', '3.83276', '4192:0 4196:0 '),\n('4196', 'db464', '571', '65', '4257', '70', '74', '0', '3180.86', '-1542.39', '40.4347', '4.7124', '4195:0 4197:0 4231:0 '),\n('4197', 'db465', '571', '65', '4241', '70', '74', '0', '3051.36', '-1392.98', '57.3848', '2.94133', '4196:0 4198:0 '),\n('4198', 'db466', '571', '65', '4241', '70', '74', '0', '2889.8', '-1432.73', '58.3338', '3.04186', '4197:0 4199:0 '),\n('4199', 'db467', '571', '65', '4241', '70', '74', '0', '2772.55', '-1373.06', '40.6788', '6.18974', '4198:0 4200:0 '),\n('4200', 'db468', '571', '65', '4185', '70', '74', '0', '2882.77', '-1303.94', '6.48389', '1.04459', '4199:0 4201:0 '),\n('4201', 'db469', '571', '65', '4185', '70', '74', '0', '2938.22', '-1169.74', '6.81704', '5.99025', '4200:0 4202:0 4204:0 '),\n('4202', 'db470', '571', '65', '4185', '70', '74', '0', '3085.09', '-1193.85', '12.4717', '5.4876', '4201:0 4203:0 '),\n('4203', 'db471', '571', '65', '4185', '70', '74', '0', '3180.57', '-1059.52', '44.9918', '0.29769', '4202:0 4190:0 '),\n('4204', 'db472', '571', '65', '4185', '70', '74', '0', '2929.48', '-986.506', '4.6099', '1.77817', '4201:0 4205:0 '),\n('4205', 'db473', '571', '65', '4185', '70', '74', '0', '2865.52', '-836.167', '15.7438', '2.35701', '4204:0 4206:0 '),\n('4206', 'db474', '571', '65', '4185', '70', '74', '0', '2691.63', '-707.31', '8.95638', '2.62875', '4205:0 4207:0 '),\n('4207', 'db475', '571', '65', '4181', '70', '74', '0', '2662.91', '-565.045', '4.97671', '2.87851', '4206:0 4183:0 '),\n('4208', 'db476', '571', '65', '65', '70', '74', '0', '3597.9', '1391.95', '92.2854', '0.792481', '4083:0 4209:0 '),\n('4209', 'db477', '571', '65', '4165', '70', '74', '4', '3768.55', '1529.38', '86.92', '0.415486', '4208:0 4210:0 '),\n('4210', 'db478', '571', '65', '4165', '70', '74', '5', '3841.3', '1533.41', '89.7247', '1.82685', '4209:0 4211:0 '),\n('4211', 'db479', '571', '65', '4165', '70', '74', '4', '3890.52', '1637.61', '96.2566', '0.644815', '4210:0 4212:0 '),\n('4212', 'db480', '571', '65', '65', '70', '74', '0', '4003.51', '1741.08', '142.414', '3.8728', '4211:0 4213:0 '),\n('4213', 'db481', '571', '65', '65', '70', '74', '0', '3800.66', '1801.11', '107.946', '0.35893', '4212:0 4214:0 4227:0 '),\n('4214', 'db482', '571', '65', '65', '70', '74', '0', '3642.7', '1910.26', '75.9736', '1.69646', '4213:0 4215:0 4069:0 '),\n('4215', 'db483', '571', '65', '65', '70', '74', '0', '3615.88', '2050.78', '74.6297', '1.7962', '4214:0 4216:0 4219:0 '),\n('4216', 'db484', '571', '65', '4164', '70', '74', '0', '3709.48', '2144.81', '53.4192', '3.56571', '4215:0 4217:0 4218:0 '),\n('4217', 'db485', '571', '65', '4164', '70', '74', '0', '3706.64', '2076.92', '21.8594', '1.15533', '4216:0 4218:0 '),\n('4218', 'db486', '571', '65', '4164', '70', '74', '0', '3772.34', '2169.36', '27.3597', '4.8828', '4217:0 4216:0 '),\n('4219', 'db487', '571', '65', '65', '70', '74', '0', '3638.81', '2223.64', '76.3879', '1.34851', '4215:0 4220:0 '),\n('4220', 'db488', '571', '65', '65', '70', '74', '0', '3608.56', '2424.79', '84.7521', '0.47515', '4219:0 4221:0 '),\n('4221', 'db489', '571', '65', '65', '70', '74', '0', '3667.57', '2606.35', '104.934', '2.34754', '4220:0 4064:0 4222:0 '),\n('4222', 'db490', '571', '65', '65', '70', '74', '0', '3821.64', '2594.47', '138.086', '5.63442', '4221:0 4223:0 '),\n('4223', 'db491', '571', '65', '4163', '70', '74', '0', '3877.75', '2397.8', '152.255', '5.33596', '4222:0 4224:0 '),\n('4224', 'db492', '571', '65', '4163', '70', '74', '0', '4003.82', '2286.07', '153.425', '6.19125', '4223:0 4225:0 '),\n('4225', 'db493', '571', '65', '4163', '70', '74', '0', '4084.73', '2159.31', '153.682', '4.48536', '4224:0 4226:0 '),\n('4226', 'db494', '571', '65', '4163', '70', '74', '0', '3961.11', '2124.54', '131.41', '3.85941', '4225:0 4227:0 '),\n('4227', 'db495', '571', '65', '65', '70', '74', '0', '3825.91', '1954.77', '104.913', '4.14765', '4226:0 4213:0 '),\n('4228', 'db496', '571', '65', '4151', '70', '74', '4', '3706.43', '2835.58', '88.7151', '0.419359', '4064:0 4229:0 '),\n('4229', 'db497', '571', '65', '4151', '70', '74', '5', '3828.74', '2884', '90.3388', '0.171959', '4228:0 '),\n('4230', 'gh498', '571', '394', '394', '72', '76', '0', '4412.91', '-1618.03', '162.125', '4.64085', '4152:0 4243:0 '),\n('4231', 'gh499', '571', '394', '394', '72', '76', '0', '3182.34', '-1659.02', '38.7919', '4.89218', '4196:0 4232:0 '),\n('4232', 'gh500', '571', '394', '394', '72', '76', '0', '3170.1', '-1849.63', '70.0118', '5.13957', '4231:0 4233:0 '),\n('4233', 'gh501', '571', '394', '4236', '72', '76', '0', '3193.69', '-1991.71', '85.0008', '6.13546', '4232:0 4234:0 4260:0 '),\n('4234', 'gh502', '571', '394', '394', '72', '76', '0', '3351.7', '-1957.7', '116.26', '3.20042', '4233:0 4235:0 4256:0 '),\n('4235', 'gh503', '571', '394', '394', '72', '76', '0', '3506.14', '-1975.54', '165.694', '5.76004', '4234:0 4236:0 4255:0 '),\n('4236', 'gh504', '571', '394', '394', '72', '76', '0', '3654.24', '-2134.59', '147.89', '4.94165', '4235:0 4237:0 4285:0 '),\n('4237', 'gh505', '571', '394', '394', '72', '76', '0', '3768.13', '-2266.2', '173.421', '6.00979', '4236:0 4238:0 4251:0 4285:0 '),\n('4238', 'gh506', '571', '394', '394', '72', '76', '0', '3965.13', '-2347.84', '213.634', '6.13467', '4237:0 4239:0 4400:0 '),\n('4239', 'gh507', '571', '394', '394', '72', '76', '0', '4179.57', '-2348.21', '225.457', '0.204908', '4238:0 4240:0 4389:0 '),\n('4240', 'gh508', '571', '394', '394', '72', '76', '0', '4360.95', '-2316.79', '201.282', '0.15857', '4239:0 4241:0 4250:0 '),\n('4241', 'gh509', '571', '394', '394', '72', '76', '0', '4456.7', '-2146.34', '174.126', '1.54558', '4240:0 4242:0 '),\n('4242', 'gh510', '571', '394', '394', '72', '76', '0', '4445.16', '-1972.91', '158.144', '1.95792', '4241:0 4243:0 '),\n('4243', 'gh511', '571', '394', '394', '72', '76', '0', '4441.13', '-1782.37', '162.404', '1.80319', '4242:0 4230:0 4244:0 '),\n('4244', 'gh512', '571', '394', '394', '72', '76', '0', '4395.14', '-1892.04', '161.168', '3.62925', '4243:0 4245:0 '),\n('4245', 'gh513', '571', '394', '4209', '72', '76', '0', '4294.12', '-1906.66', '197.755', '3.31587', '4244:0 4246:0 4247:0 4248:0 '),\n('4246', 'gh514', '571', '394', '4209', '72', '76', '0', '4245.43', '-2019.66', '235.391', '1.60371', '4245:0 '),\n('4247', 'gh515', '571', '394', '4209', '72', '76', '0', '4219.61', '-1824.36', '202.548', '2.41267', '4245:0 '),\n('4248', 'gh516', '571', '394', '4209', '72', '76', '0', '4141.35', '-1993.19', '212.874', '4.66597', '4245:0 4249:0 '),\n('4249', 'gh517', '571', '394', '4209', '72', '76', '0', '4200.73', '-2152.09', '218.191', '0.0124693', '4248:0 4250:0 '),\n('4250', 'gh518', '571', '394', '394', '72', '76', '0', '4337.91', '-2212.2', '191.313', '5.10972', '4249:0 4240:0 '),\n('4251', 'gh519', '571', '394', '394', '72', '76', '0', '3919.84', '-2211.56', '210.955', '0.375331', '4237:0 4252:0 '),\n('4252', 'gh520', '571', '394', '394', '72', '76', '0', '3841.19', '-2055.11', '210.168', '1.65396', '4251:0 4253:0 '),\n('4253', 'gh521', '571', '394', '394', '72', '76', '0', '3817.14', '-1865.71', '214.679', '1.96419', '4252:0 4254:0 '),\n('4254', 'gh522', '571', '394', '394', '72', '76', '0', '3654.79', '-1866.78', '173.387', '2.8674', '4253:0 4255:0 '),\n('4255', 'gh523', '571', '394', '394', '72', '76', '0', '3559.72', '-1897.37', '155.876', '3.47686', '4254:0 4235:0 '),\n('4256', 'gh524', '571', '394', '394', '72', '76', '0', '3387.84', '-2133.26', '124.553', '5.44191', '4234:0 4257:0 '),\n('4257', 'gh525', '571', '394', '4206', '72', '76', '4', '3345.18', '-2217.45', '119.375', '3.61665', '4256:0 4258:0 '),\n('4258', 'gh526', '571', '394', '4206', '72', '76', '5', '3256.98', '-2231.76', '116.09', '1.0425', '4257:0 4259:0 '),\n('4259', 'gh527', '571', '394', '394', '72', '76', '0', '3086.49', '-2267.46', '94.942', '1.73561', '4258:0 4260:0 4268:0 '),\n('4260', 'gh528', '571', '394', '394', '72', '76', '0', '3084.66', '-2084.36', '87.6685', '1.27615', '4259:0 4233:0 4261:0 '),\n('4261', 'gh529', '571', '394', '394', '72', '76', '0', '2953.2', '-1963.36', '51.3225', '2.81396', '4260:0 4262:0 '),\n('4262', 'gh530', '571', '394', '4242', '72', '76', '0', '2828.38', '-1917.21', '9.14124', '2.88465', '4261:0 4263:0 4264:0 '),\n('4263', 'gh531', '571', '394', '4242', '72', '76', '0', '2698.31', '-2040.99', '3.89624', '0.465604', '4262:0 4267:0 '),\n('4264', 'gh532', '571', '394', '4242', '72', '76', '0', '2755.77', '-1781.45', '5.41989', '5.167', '4262:0 4265:0 '),\n('4265', 'gh533', '571', '394', '4242', '72', '76', '0', '2565.61', '-1807.96', '9.92644', '3.51374', '4264:0 4266:0 '),\n('4266', 'gh534', '571', '394', '4242', '72', '76', '0', '2542.58', '-1990.88', '8.43344', '5.20077', '4265:0 4267:0 '),\n('4267', 'gh535', '571', '394', '4242', '72', '76', '0', '2617', '-2122.41', '7.0106', '0.525292', '4266:0 4263:0 '),\n('4268', 'gh536', '571', '394', '394', '72', '76', '0', '3111.6', '-2469.39', '60.839', '4.64079', '4259:0 4269:0 '),\n('4269', 'gh537', '571', '394', '394', '72', '76', '0', '3050.93', '-2690.26', '65.2339', '4.32742', '4268:0 4270:0 '),\n('4270', 'gh538', '571', '394', '394', '72', '76', '0', '2996.43', '-2911.54', '99.7541', '3.55929', '4269:0 4271:0 4277:0 '),\n('4271', 'gh539', '571', '394', '394', '72', '76', '0', '2806.9', '-2891.38', '64.0493', '3.18937', '4270:0 4272:0 '),\n('4272', 'gh540', '571', '394', '394', '72', '76', '0', '2688.1', '-2877.41', '68.4325', '1.86676', '4273:0 4271:0 3965:0 3956:0 '),\n('4273', 'gh541', '571', '394', '4207', '72', '76', '0', '2863.15', '-2691.55', '84.6612', '0.692585', '4274:0 4272:0 '),\n('4274', 'gh542', '571', '394', '4207', '72', '76', '0', '2913.28', '-2523.08', '77.2727', '2.2516', '4273:0 4275:0 '),\n('4275', 'gh543', '571', '394', '4207', '72', '76', '0', '2759.62', '-2433.25', '39.5256', '4.18681', '4274:0 4276:0 '),\n('4276', 'gh544', '571', '394', '394', '72', '76', '0', '2655.99', '-2570.44', '12.8707', '0.715349', '4275:0 3966:0 '),\n('4277', 'gh545', '571', '394', '4240', '72', '76', '0', '3159.97', '-2966.67', '125.976', '5.16462', '4270:0 4278:0 '),\n('4278', 'gh546', '571', '394', '394', '72', '76', '0', '3229.99', '-3097.97', '155.647', '5.16069', '4277:0 4279:0 4287:0 '),\n('4279', 'gh547', '571', '394', '394', '72', '76', '0', '3347.86', '-2939.95', '194.535', '0.886556', '4278:0 4280:0 '),\n('4280', 'gh548', '571', '394', '4204', '72', '76', '3', '3409.22', '-2819.78', '200.664', '5.07272', '4279:0 4281:0 '),\n('4281', 'gh549', '571', '394', '394', '72', '76', '0', '3563.32', '-2837.92', '196.693', '3.21211', '4280:0 4282:0 '),\n('4282', 'gh550', '571', '394', '394', '72', '76', '0', '3639.37', '-2888.65', '220.844', '1.05698', '4281:0 4283:0 4286:0 4386:0 '),\n('4283', 'gh551', '571', '394', '394', '72', '76', '0', '3750.73', '-2701.59', '175.222', '0.808005', '4282:0 4284:0 4402:0 '),\n('4284', 'gh552', '571', '394', '394', '72', '76', '0', '3701.9', '-2499.94', '160.171', '2.01988', '4283:0 4285:0 '),\n('4285', 'gh553', '571', '394', '394', '72', '76', '0', '3667.41', '-2329.55', '156.4', '0.83785', '4284:0 4237:0 4236:0 '),\n('4286', 'gh554', '571', '394', '394', '72', '76', '0', '3567.56', '-3072.84', '238.573', '4.01871', '4282:0 4287:0 4288:0 '),\n('4287', 'gh555', '571', '394', '394', '72', '76', '0', '3355.89', '-3183.89', '200.874', '2.94663', '4286:0 4278:0 '),\n('4288', 'gh556', '571', '394', '394', '72', '76', '0', '3543.08', '-3277.22', '242.517', '4.88658', '4286:0 4289:0 '),\n('4289', 'gh557', '571', '394', '394', '72', '76', '0', '3676.96', '-3469.09', '242.035', '5.54866', '4288:0 4290:0 4383:0 '),\n('4290', 'gh558', '571', '394', '394', '72', '76', '0', '3696.59', '-3688.31', '209.189', '4.55906', '4289:0 4291:0 '),\n('4291', 'gh559', '571', '394', '394', '72', '76', '0', '3728.04', '-3862.81', '183.316', '0.164743', '4290:0 4292:0 4294:0 4301:0 '),\n('4292', 'gh560', '571', '394', '4215', '72', '76', '0', '3590.62', '-3901.08', '196.64', '2.77227', '4291:0 4293:0 '),\n('4293', 'gh561', '571', '394', '4215', '72', '76', '0', '3525.9', '-3755.42', '228.317', '2.26176', '4292:0 '),\n('4294', 'gh562', '571', '394', '395', '72', '76', '0', '3841.06', '-3743.21', '175.461', '6.13141', '4291:0 4295:0 '),\n('4295', 'gh563', '571', '394', '395', '72', '76', '0', '3974.14', '-3774.46', '151.082', '6.17382', '4294:0 4296:0 '),\n('4296', 'gh564', '571', '394', '395', '72', '76', '0', '4052.02', '-3740.14', '220.288', '4.50485', '4295:0 4297:0 '),\n('4297', 'gh565', '571', '394', '395', '72', '76', '0', '4135.39', '-3710.81', '180.991', '2.0819', '4296:0 4298:0 '),\n('4298', 'gh566', '571', '394', '395', '72', '76', '0', '4194.15', '-3814.05', '181.668', '4.59518', '4297:0 4299:0 '),\n('4299', 'gh567', '571', '394', '395', '72', '76', '0', '4181.7', '-3982.87', '170.498', '4.5402', '4298:0 4300:0 4363:0 '),\n('4300', 'gh568', '571', '394', '394', '72', '76', '0', '4024.2', '-4043.93', '176.713', '3.04794', '4299:0 4301:0 4363:0 '),\n('4301', 'gh569', '571', '394', '394', '72', '76', '0', '3787.44', '-3987.74', '181.678', '2.65995', '4300:0 4291:0 4302:0 '),\n('4302', 'gh570', '571', '394', '394', '72', '76', '0', '3718.3', '-4188.38', '192.248', '4.50249', '4301:0 4303:0 4310:0 '),\n('4303', 'gh571', '571', '394', '394', '72', '76', '0', '3545.36', '-4300.26', '227.855', '3.59221', '4302:0 4304:0 '),\n('4304', 'gh572', '571', '394', '394', '72', '76', '0', '3375.07', '-4408.72', '245.826', '4.29907', '4303:0 4305:0 4307:0 '),\n('4305', 'gh573', '571', '394', '4480', '72', '76', '0', '3261.77', '-4590.54', '305.739', '3.95742', '4304:0 4306:0 '),\n('4306', 'gh574', '571', '394', '4480', '72', '76', '0', '3089.14', '-4641.2', '316.308', '3.35188', '4305:0 3999:0 '),\n('4307', 'gh575', '571', '394', '4218', '72', '76', '0', '3502.07', '-4548.51', '221.433', '3.38171', '4304:0 4308:0 '),\n('4308', 'gh576', '571', '394', '394', '72', '76', '0', '3656.98', '-4455.52', '184.363', '5.84315', '4307:0 4309:0 '),\n('4309', 'gh577', '571', '394', '394', '72', '76', '0', '3731.98', '-4511.53', '193.763', '0.757702', '4308:0 4310:0 '),\n('4310', 'gh578', '571', '394', '394', '72', '76', '5', '3851.11', '-4369.54', '192.918', '1.37424', '4309:0 4302:0 4311:0 '),\n('4311', 'gh579', '571', '394', '4205', '72', '76', '0', '3939.37', '-4409.34', '238.255', '4.98392', '4310:0 4312:0 '),\n('4312', 'gh580', '571', '394', '4205', '72', '76', '0', '4062.37', '-4401.54', '260.429', '0.235388', '4311:0 4313:0 4362:0 4364:0 '),\n('4313', 'gh581', '571', '394', '394', '72', '76', '0', '4171.31', '-4502.24', '219.959', '1.1284', '4312:0 4314:0 '),\n('4314', 'gh582', '571', '394', '4205', '72', '76', '0', '4003.62', '-4566.46', '195.348', '3.13431', '4313:0 4315:0 '),\n('4315', 'gh583', '571', '394', '394', '72', '76', '0', '4008.13', '-4692.66', '141.153', '5.45436', '4314:0 4316:0 '),\n('4316', 'gh584', '571', '394', '4231', '72', '76', '0', '4082.28', '-4754.21', '96.3716', '4.76714', '4315:0 4317:0 '),\n('4317', 'gh585', '571', '394', '4249', '72', '76', '0', '4193.08', '-4880.87', '42.4572', '3.89614', '4316:0 4318:0 4328:0 4336:0 '),\n('4318', 'gh586', '571', '394', '4249', '72', '76', '0', '4317.27', '-4702.62', '75.8335', '0.62967', '4317:0 4319:0 '),\n('4319', 'gh587', '571', '394', '4249', '72', '76', '0', '4444.07', '-4566.46', '104.898', '1.65462', '4318:0 4320:0 '),\n('4320', 'gh588', '571', '394', '4249', '72', '76', '0', '4428.45', '-4387.5', '151.381', '1.08913', '4319:0 4321:0 '),\n('4321', 'gh589', '571', '394', '4159', '72', '76', '0', '4438.72', '-4286.42', '161.56', '6.09212', '4320:0 4322:0 4374:0 '),\n('4322', 'gh590', '571', '394', '4249', '72', '76', '0', '4621.51', '-4357.67', '181.183', '5.95781', '4321:0 4323:0 '),\n('4323', 'gh591', '571', '394', '4221', '72', '76', '0', '4732.05', '-4454.6', '194.355', '5.45673', '4322:0 4324:0 '),\n('4324', 'gh592', '571', '394', '4221', '72', '76', '0', '4820.92', '-4522.91', '200.404', '5.83294', '4323:0 4325:0 '),\n('4325', 'gh593', '571', '394', '4221', '72', '76', '0', '4909.98', '-4586.39', '219.616', '4.43492', '4324:0 4326:0 '),\n('4326', 'gh594', '571', '394', '4221', '72', '76', '0', '4984.98', '-4692.79', '219.491', '5.1245', '4325:0 4327:0 '),\n('4327', 'gh595', '571', '394', '4221', '72', '76', '0', '5041.25', '-4817', '219.501', '2.53662', '4326:0 '),\n('4328', 'gh596', '571', '394', '4212', '72', '76', '0', '4339.89', '-4870.51', '34.7802', '0.17335', '4317:0 4329:0 '),\n('4329', 'gh597', '571', '394', '4216', '72', '76', '0', '4474.49', '-4921.22', '14.201', '5.96566', '4328:0 4330:0 4331:0 '),\n('4330', 'gh598', '571', '394', '4212', '72', '76', '0', '4518.04', '-5017.36', '3.25924', '5.12764', '4329:0 '),\n('4331', 'gh599', '571', '394', '4216', '72', '76', '0', '4569.4', '-4865.21', '47.9919', '0.149002', '4329:0 4332:0 4333:0 4334:0 '),\n('4332', 'gh600', '571', '394', '4216', '72', '76', '0', '4707.48', '-4794.55', '47.992', '5.06167', '4331:0 4333:0 '),\n('4333', 'gh601', '571', '394', '4216', '72', '76', '0', '4708.25', '-4910.12', '47.9928', '1.36166', '4331:0 4332:0 '),\n('4334', 'gh602', '571', '394', '4216', '72', '76', '0', '4744.53', '-4859.91', '26.2962', '0.387759', '4331:0 4335:0 '),\n('4335', 'gh603', '571', '394', '4216', '72', '76', '0', '4816.99', '-4789.4', '25.4718', '0.872349', '4334:0 '),\n('4336', 'gh604', '571', '394', '4249', '72', '76', '0', '4022.33', '-4997.21', '41.214', '3.78223', '4317:0 4337:0 4345:0 '),\n('4337', 'gh605', '571', '394', '4249', '72', '76', '0', '3816.35', '-5011.96', '106.526', '3.31727', '4336:0 4338:0 4346:0 '),\n('4338', 'gh606', '571', '394', '4220', '72', '76', '0', '3646.81', '-5000.53', '175.852', '4.1867', '4337:0 4339:0 '),\n('4339', 'gh607', '571', '394', '4220', '72', '76', '0', '3524.22', '-5120.65', '233.744', '2.61591', '4338:0 4340:0 4343:0 '),\n('4340', 'gh608', '571', '394', '4220', '72', '76', '0', '3419.01', '-4995.77', '285.739', '2.5845', '4339:0 4341:0 '),\n('4341', 'gh609', '571', '394', '4220', '72', '76', '0', '3356.74', '-5082.19', '325.289', '3.94009', '4340:0 4342:0 '),\n('4342', 'gh610', '571', '394', '4220', '72', '76', '0', '3310.99', '-5122.5', '340.978', '1.36004', '4341:0 '),\n('4343', 'gh611', '571', '394', '4220', '72', '76', '0', '3433.34', '-5250.17', '269.339', '1.01289', '4339:0 4344:0 '),\n('4344', 'gh612', '571', '394', '4220', '72', '76', '0', '3407.12', '-5388.15', '267.856', '1.78573', '4343:0 '),\n('4345', 'gh613', '571', '394', '4212', '72', '76', '0', '4006.9', '-5232.47', '7.75033', '1.18098', '4336:0 4356:0 '),\n('4346', 'gh614', '571', '394', '394', '72', '76', '0', '3757.96', '-5153.08', '119.324', '4.14823', '4337:0 4347:0 '),\n('4347', 'gh615', '571', '394', '394', '72', '76', '0', '3598.76', '-5357.93', '139.869', '4.05555', '4346:0 4348:0 '),\n('4348', 'gh616', '571', '394', '4213', '72', '76', '0', '3443.06', '-5490.97', '198.431', '3.26623', '4347:0 4349:0 '),\n('4349', 'gh617', '571', '394', '4213', '72', '76', '0', '3274.45', '-5572.3', '213.641', '3.71783', '4348:0 4350:0 '),\n('4350', 'gh618', '571', '394', '4213', '72', '76', '0', '3100.03', '-5709.35', '220.326', '3.74532', '4349:0 4355:0 '),\n('4351', 'hf619', '571', '495', '4061', '68', '73', '0', '2323.35', '-5813.06', '251.394', '3.16805', '4014:0 4015:0 4352:0 '),\n('4352', 'hf620', '571', '495', '495', '68', '73', '0', '2519.29', '-5851.8', '276.256', '4.73492', '4351:0 4353:0 '),\n('4353', 'hf621', '571', '495', '495', '68', '73', '0', '2703.09', '-5953.52', '271.511', '6.11722', '4352:0 4354:0 '),\n('4354', 'hf622', '571', '495', '4252', '68', '73', '0', '2849.67', '-5840.96', '273.44', '0.629637', '4353:0 4355:0 '),\n('4355', 'hf623', '571', '495', '4252', '68', '73', '0', '3003.04', '-5779.08', '254.433', '0.523608', '4354:0 4350:0 '),\n('4356', 'gh624', '571', '394', '4212', '72', '76', '0', '4153.59', '-5224.2', '7.42476', '6.08423', '4345:0 4357:0 '),\n('4357', 'gh625', '571', '394', '4212', '72', '76', '0', '4327.94', '-5342.7', '4.49671', '5.82112', '4356:0 4358:0 '),\n('4358', 'gh626', '571', '394', '4244', '72', '76', '0', '4543.08', '-5485.22', '2.18391', '5.50775', '4357:0 4359:0 '),\n('4359', 'gh627', '571', '394', '4244', '72', '76', '0', '4695.42', '-5635.74', '77.5219', '4.55742', '4358:0 4360:0 '),\n('4360', 'gh628', '571', '394', '4245', '72', '76', '0', '4616.66', '-5660.81', '114.593', '4.22877', '4359:0 4361:0 '),\n('4361', 'gh629', '571', '394', '4245', '72', '76', '0', '4593.57', '-5707.41', '184.506', '1.02041', '4360:0 '),\n('4362', 'gh630', '571', '394', '394', '72', '76', '0', '4113.47', '-4233.27', '243.732', '1.89258', '4312:0 4363:0 '),\n('4363', 'gh631', '571', '394', '394', '72', '76', '1', '4125.58', '-4095.14', '182.823', '2.77224', '4362:0 4300:0 4299:0 '),\n('4364', 'gh632', '571', '394', '394', '72', '76', '0', '4172.63', '-4310.2', '238.733', '2.85314', '4312:0 4365:0 '),\n('4365', 'gh633', '571', '394', '394', '72', '76', '0', '4326.78', '-4119.6', '193.825', '0.547988', '4364:0 4366:0 '),\n('4366', 'gh634', '571', '394', '394', '72', '76', '0', '4486.09', '-3977.4', '186.997', '5.61774', '4365:0 4367:0 4376:0 '),\n('4367', 'gh635', '571', '394', '394', '72', '76', '0', '4625.2', '-4092.13', '199.11', '2.30728', '4366:0 4368:0 '),\n('4368', 'gh636', '571', '394', '394', '72', '76', '0', '4734.83', '-4181.86', '231.297', '2.31358', '4367:0 4369:0 '),\n('4369', 'gh637', '571', '394', '394', '72', '76', '0', '4906.69', '-4306.46', '257.585', '0.692519', '4368:0 4370:0 4403:0 '),\n('4370', 'gh638', '571', '394', '4214', '72', '76', '0', '5016.3', '-4437.54', '278.117', '5.31851', '4369:0 4371:0 '),\n('4371', 'gh639', '571', '394', '4214', '72', '76', '0', '5101.89', '-4569.13', '283.736', '5.11902', '4370:0 4372:0 '),\n('4372', 'gh640', '571', '394', '4214', '72', '76', '0', '5193.65', '-4729.96', '293.156', '5.98138', '4371:0 4373:0 '),\n('4373', 'gh641', '571', '394', '4214', '72', '76', '0', '5380.16', '-4761.41', '305.589', '6.26491', '4372:0 '),\n('4374', 'gh642', '571', '394', '4159', '72', '76', '2', '4508.01', '-4224.81', '167.488', '4.05322', '4321:0 4375:0 '),\n('4375', 'gh643', '571', '394', '4159', '72', '76', '3', '4593.24', '-4223.94', '178.654', '3.05419', '4374:0 '),\n('4376', 'gh644', '571', '394', '394', '72', '76', '0', '4397.58', '-3823.41', '207.663', '1.98605', '4366:0 4377:0 '),\n('4377', 'gh645', '571', '394', '4235', '72', '76', '0', '4363.62', '-3661.89', '253.292', '1.03572', '4376:0 4378:0 4380:0 '),\n('4378', 'gh646', '571', '394', '4270', '72', '76', '0', '4464.25', '-3523.69', '231.349', '0.662651', '4377:0 4379:0 '),\n('4379', 'gh647', '571', '394', '4270', '72', '76', '0', '4540.35', '-3448.14', '226.932', '0.666578', '4378:0 4404:0 '),\n('4380', 'gh648', '571', '394', '394', '72', '76', '0', '4254.62', '-3537.34', '262.169', '3.11545', '4377:0 4381:0 '),\n('4381', 'gh649', '571', '394', '394', '72', '76', '0', '4082.82', '-3452.53', '279.273', '2.96073', '4380:0 4382:0 '),\n('4382', 'gh650', '571', '394', '4267', '72', '76', '0', '4017.93', '-3398.46', '291.406', '1.89652', '4381:0 4383:0 4384:0 '),\n('4383', 'gh651', '571', '394', '394', '72', '76', '0', '3805.22', '-3452.83', '276.397', '3.26311', '4382:0 4289:0 '),\n('4384', 'gh652', '571', '394', '394', '72', '76', '0', '3927.34', '-3218.24', '296.696', '2.32848', '4382:0 4385:0 4392:0 '),\n('4385', 'gh653', '571', '394', '394', '72', '76', '0', '3809.69', '-3057.95', '274.256', '2.59945', '4384:0 4386:0 4399:0 '),\n('4386', 'gh654', '571', '394', '394', '72', '76', '0', '3727.35', '-2986.21', '236.602', '2.62301', '4385:0 4282:0 4387:0 '),\n('4387', 'gh655', '571', '394', '4203', '72', '76', '0', '3799.13', '-2875.46', '222.297', '0.855862', '4386:0 4388:0 '),\n('4388', 'gh656', '571', '394', '394', '72', '76', '0', '3912.6', '-2792.74', '176.353', '3.96212', '4387:0 '),\n('4389', 'gh657', '571', '394', '4199', '72', '76', '0', '4204.22', '-2467.24', '229.848', '5.58004', '4239:0 4390:0 4391:0 '),\n('4390', 'gh658', '571', '394', '4199', '72', '76', '1', '4355.92', '-2485.04', '242.225', '3.56707', '4389:0 4391:0 '),\n('4391', 'gh659', '571', '394', '4199', '72', '76', '0', '4320.51', '-2585.42', '246.459', '1.97429', '4390:0 4389:0 '),\n('4392', 'gh660', '571', '394', '4222', '72', '76', '0', '4055.91', '-3147.98', '278.056', '5.70496', '4384:0 4393:0 '),\n('4393', 'gh661', '571', '394', '4222', '72', '76', '0', '4250.54', '-3177.85', '307.936', '0.898319', '4392:0 4394:0 '),\n('4394', 'gh662', '571', '394', '4222', '72', '76', '0', '4326.86', '-3320.66', '310.551', '0.546446', '4393:0 4395:0 '),\n('4395', 'gh663', '571', '394', '4222', '72', '76', '0', '4447.75', '-3199.73', '313.463', '2.16044', '4394:0 4396:0 '),\n('4396', 'gh664', '571', '394', '4222', '72', '76', '0', '4418.84', '-2984.71', '309.349', '1.76303', '4395:0 4397:0 '),\n('4397', 'gh665', '571', '394', '4222', '72', '76', '0', '4226.67', '-2862.19', '281.474', '3.5718', '4396:0 4398:0 '),\n('4398', 'gh666', '571', '394', '4222', '72', '76', '0', '4035.13', '-2946.41', '276.096', '3.8946', '4397:0 4399:0 '),\n('4399', 'gh667', '571', '394', '4222', '72', '76', '0', '3928.19', '-3008.94', '275.401', '3.52703', '4398:0 4385:0 '),\n('4400', 'gh668', '571', '394', '394', '72', '76', '0', '3974.25', '-2486.57', '216.336', '4.66038', '4238:0 4401:0 '),\n('4401', 'gh669', '571', '394', '4202', '72', '76', '0', '3933.08', '-2603.19', '206.74', '5.22586', '4400:0 4402:0 '),\n('4402', 'gh670', '571', '394', '394', '72', '76', '0', '3783', '-2602.59', '191.183', '4.81351', '4401:0 4283:0 '),\n('4403', 'zd671', '571', '66', '66', '73', '77', '0', '5075.22', '-4157.1', '351.671', '0.704319', '4369:0 4530:0 4531:0 '),\n('4404', 'zd672', '571', '66', '66', '73', '77', '0', '4642.75', '-3362.88', '292.419', '0.845695', '4379:0 4470:0 '),\n('4405', 'zd673', '571', '66', '66', '73', '77', '0', '4845.51', '-1504.94', '248.946', '5.30284', '4149:0 4406:0 '),\n('4406', 'zd674', '571', '66', '66', '73', '77', '0', '4915.37', '-1688.61', '248.309', '4.74834', '4405:0 4407:0 '),\n('4407', 'zd675', '571', '66', '66', '73', '77', '0', '4913.71', '-1902.76', '248.309', '4.71615', '4406:0 4408:0 4410:0 '),\n('4408', 'zd676', '571', '66', '66', '73', '77', '0', '4907.24', '-2149.46', '248.308', '4.51509', '4407:0 4409:0 4410:0 '),\n('4409', 'zd677', '571', '66', '4316', '73', '77', '0', '4935.58', '-2282.22', '243.077', '5.02638', '4408:0 4446:0 '),\n('4410', 'zd678', '571', '66', '66', '73', '77', '0', '4948.85', '-2047.71', '248.309', '0.0634512', '4408:0 4407:0 4411:0 '),\n('4411', 'zd679', '571', '66', '66', '73', '77', '0', '5154.72', '-2050.3', '248.297', '1.1198', '4410:0 4412:0 4442:0 4443:0 '),\n('4412', 'zd680', '571', '66', '66', '73', '77', '0', '5198.14', '-1908', '243.765', '1.97824', '4411:0 4413:0 '),\n('4413', 'zd681', '571', '66', '4311', '73', '77', '0', '5168.01', '-1763.65', '243.57', '1.69157', '4412:0 4414:0 '),\n('4414', 'zd682', '571', '66', '4311', '73', '77', '0', '5227.64', '-1629.23', '235.86', '1.70729', '4413:0 4415:0 '),\n('4415', 'zd683', '571', '66', '66', '73', '77', '0', '5202.17', '-1444.6', '235.3', '1.67195', '4414:0 4416:0 4417:0 '),\n('4416', 'zd684', '571', '66', '4312', '73', '77', '1', '5228.85', '-1333.15', '242.312', '5.2078', '4415:0 4417:0 '),\n('4417', 'zd685', '571', '66', '66', '73', '77', '0', '5369.86', '-1421.32', '236.955', '3.0236', '4416:0 4415:0 4418:0 '),\n('4418', 'zd686', '571', '66', '66', '73', '77', '0', '5446.59', '-1338.52', '239.221', '4.34385', '4417:0 4419:0 4420:0 4440:0 '),\n('4419', 'zd687', '571', '66', '66', '73', '77', '0', '5443.61', '-1214.88', '247.443', '1.55882', '4418:0 4561:0 '),\n('4420', 'zd688', '571', '66', '4313', '73', '77', '0', '5555.66', '-1397.11', '239.86', '2.99374', '4418:0 4421:0 '),\n('4421', 'zd689', '571', '66', '4313', '73', '77', '0', '5695.79', '-1400.51', '234.446', '5.54941', '4420:0 4422:0 4435:0 '),\n('4422', 'zd690', '571', '66', '4313', '73', '77', '0', '5775.25', '-1545.64', '229.906', '6.10312', '4421:0 4423:0 4435:0 '),\n('4423', 'zd691', '571', '66', '4469', '73', '77', '0', '5886.45', '-1638.86', '237.734', '5.61617', '4422:0 4424:0 4436:0 '),\n('4424', 'zd692', '571', '66', '4469', '73', '77', '0', '5972.87', '-1716.32', '231.167', '5.38055', '4423:0 4425:0 '),\n('4425', 'zd693', '571', '66', '4469', '73', '77', '0', '6050.18', '-1854.06', '239.866', '4.90932', '4424:0 4426:0 '),\n('4426', 'zd694', '571', '66', '4315', '73', '77', '0', '6083.8', '-1956.71', '235.309', '5.74812', '4425:0 4427:0 4429:0 '),\n('4427', 'zd695', '571', '66', '4315', '73', '77', '0', '6239.25', '-1977.17', '235.732', '4.86297', '4426:0 4428:0 '),\n('4428', 'zd696', '571', '66', '4315', '73', '77', '0', '6209.7', '-2182.71', '236.212', '3.31259', '4427:0 4429:0 '),\n('4429', 'zd697', '571', '66', '4315', '73', '77', '0', '6062.56', '-2208.12', '234.275', '1.69703', '4428:0 4426:0 4430:0 '),\n('4430', 'zd698', '571', '66', '4315', '73', '77', '0', '5846.96', '-2232.9', '236.499', '3.12253', '4429:0 4431:0 '),\n('4431', 'zd699', '571', '66', '4468', '73', '77', '0', '5680.87', '-2213.84', '239.83', '3.10525', '4430:0 4432:0 4437:0 '),\n('4432', 'zd700', '571', '66', '4468', '73', '77', '0', '5565.53', '-2198.52', '235.496', '1.86432', '4431:0 4433:0 '),\n('4433', 'zd701', '571', '66', '4468', '73', '77', '0', '5571.97', '-1996.67', '237.88', '1.26977', '4432:0 4434:0 4437:0 4438:0 '),\n('4434', 'zd702', '571', '66', '4468', '73', '77', '0', '5653.64', '-1810.94', '236.435', '1.32868', '4433:0 4435:0 4436:0 '),\n('4435', 'zd703', '571', '66', '4313', '73', '77', '0', '5609.8', '-1610.43', '237.022', '0.732563', '4434:0 4422:0 4421:0 '),\n('4436', 'zd704', '571', '66', '4468', '73', '77', '0', '5833.14', '-1759.05', '233.346', '1.1936', '4434:0 4423:0 4437:0 '),\n('4437', 'zd705', '571', '66', '4468', '73', '77', '0', '5766.32', '-1991.79', '235.993', '4.71376', '4436:0 4431:0 4433:0 '),\n('4438', 'zd706', '571', '66', '66', '73', '77', '0', '5444.04', '-1955.64', '248.222', '4.72161', '4433:0 4439:0 4441:0 4442:0 '),\n('4439', 'zd707', '571', '66', '66', '73', '77', '0', '5446.88', '-1747.93', '248.337', '1.71275', '4438:0 4440:0 '),\n('4440', 'zd708', '571', '66', '66', '73', '77', '0', '5445.34', '-1527.93', '248.26', '1.56823', '4439:0 4418:0 '),\n('4441', 'zd709', '571', '66', '66', '73', '77', '0', '5449.03', '-2186.49', '248.309', '4.69804', '4438:0 4447:0 '),\n('4442', 'zd710', '571', '66', '66', '73', '77', '0', '5286.44', '-2043.61', '246.138', '3.10918', '4438:0 4411:0 '),\n('4443', 'zd711', '571', '66', '4317', '73', '77', '1', '5168.98', '-2192.3', '236.538', '5.78582', '4411:0 4444:0 '),\n('4444', 'zd712', '571', '66', '66', '73', '77', '0', '5057.15', '-2200.22', '244.382', '3.79877', '4443:0 4445:0 '),\n('4445', 'zd713', '571', '66', '66', '73', '77', '0', '5039.31', '-2353.08', '242.172', '3.30084', '4444:0 4446:0 '),\n('4446', 'zd714', '571', '66', '4316', '73', '77', '0', '4870.93', '-2382.92', '234.006', '2.40312', '4445:0 4409:0 '),\n('4447', 'zd715', '571', '66', '4275', '73', '77', '0', '5451.23', '-2302.91', '297.236', '1.61772', '4441:0 4448:0 4449:0 4476:0 '),\n('4448', 'zd716', '571', '66', '4275', '73', '77', '0', '5448.61', '-2517.18', '292.419', '4.61951', '4447:0 4449:0 4465:0 4476:0 '),\n('4449', 'zd717', '571', '66', '4275', '73', '77', '0', '5555.82', '-2440.17', '290.942', '2.83587', '4448:0 4447:0 4450:0 4476:0 '),\n('4450', 'zd718', '571', '66', '4318', '73', '77', '0', '5688.46', '-2430.58', '287.55', '3.11862', '4449:0 4451:0 '),\n('4451', 'zd719', '571', '66', '4294', '73', '77', '0', '5806.54', '-2342.64', '290.484', '5.7662', '4450:0 4452:0 '),\n('4452', 'zd720', '571', '66', '4294', '73', '77', '0', '5929.41', '-2434.64', '292.384', '5.92563', '4451:0 4453:0 '),\n('4453', 'zd721', '571', '66', '4294', '73', '77', '0', '6095.28', '-2375.23', '290.191', '0.345376', '4452:0 4454:0 '),\n('4454', 'zd722', '571', '66', '4276', '73', '77', '0', '6180.98', '-2386.29', '307.72', '4.9046', '4453:0 4455:0 '),\n('4455', 'zd723', '571', '66', '4276', '73', '77', '0', '6189.69', '-2520.06', '304.709', '4.73102', '4454:0 4456:0 4461:0 '),\n('4456', 'zd724', '571', '66', '4276', '73', '77', '0', '6265.08', '-2506.2', '302.978', '4.68313', '4455:0 4457:0 '),\n('4457', 'zd725', '571', '66', '4276', '73', '77', '0', '6245.94', '-2735.34', '302.749', '3.45398', '4456:0 4458:0 4459:0 '),\n('4458', 'zd726', '571', '66', '4276', '73', '77', '0', '6057.61', '-2737.89', '302.8', '1.51562', '4457:0 4460:0 '),\n('4459', 'zd727', '571', '66', '66', '73', '77', '0', '6297.01', '-2862.98', '293.934', '2.17613', '4457:0 '),\n('4460', 'zd728', '571', '66', '66', '73', '77', '0', '6048.63', '-2898.7', '296.891', '3.34009', '4458:0 '),\n('4461', 'zd729', '571', '66', '4276', '73', '77', '0', '6198.47', '-2622.9', '293.162', '1.74809', '4455:0 4462:0 '),\n('4462', 'zd730', '571', '66', '4276', '73', '77', '0', '6057.09', '-2616.09', '302.748', '3.26077', '4461:0 4463:0 '),\n('4463', 'zd731', '571', '66', '66', '73', '77', '0', '5884.73', '-2617.57', '292.418', '3.15396', '4462:0 4464:0 '),\n('4464', 'zd732', '571', '66', '66', '73', '77', '0', '5672.49', '-2619.11', '292.418', '3.13825', '4463:0 4465:0 4477:0 '),\n('4465', 'zd733', '571', '66', '4275', '73', '77', '1', '5457.16', '-2620.72', '306.551', '1.83449', '4464:0 4448:0 4466:0 '),\n('4466', 'zd734', '571', '66', '66', '73', '77', '0', '5332.55', '-2708.7', '292.419', '3.89224', '4465:0 4467:0 4474:0 '),\n('4467', 'zd735', '571', '66', '66', '73', '77', '0', '5189.96', '-2843.82', '292.419', '5.47639', '4466:0 4468:0 4471:0 4473:0 4474:0 '),\n('4468', 'zd736', '571', '66', '66', '73', '77', '0', '5035.14', '-2975.52', '292.29', '3.86318', '4467:0 4469:0 4473:0 4483:0 '),\n('4469', 'zd737', '571', '66', '66', '73', '77', '0', '4891.99', '-3121.16', '292.419', '3.92601', '4468:0 4470:0 4486:0 '),\n('4470', 'zd738', '571', '66', '66', '73', '77', '0', '4770.68', '-3237.29', '292.419', '3.91659', '4469:0 4404:0 4487:0 '),\n('4471', 'zd739', '571', '66', '66', '73', '77', '0', '5358.22', '-3018.37', '292.42', '5.50546', '4467:0 4472:0 4483:0 '),\n('4472', 'zd740', '571', '66', '66', '73', '77', '0', '5504.36', '-3161.64', '327.623', '5.5251', '4471:0 4482:0 4491:0 '),\n('4473', 'zd741', '571', '66', '4278', '73', '77', '0', '4997.42', '-2791.64', '287.647', '5.40334', '4468:0 4467:0 4474:0 '),\n('4474', 'zd742', '571', '66', '4278', '73', '77', '0', '5158.28', '-2673.27', '288.27', '0.638333', '4473:0 4466:0 4467:0 4475:0 '),\n('4475', 'zd743', '571', '66', '66', '73', '77', '0', '5256.37', '-2555.92', '288.451', '1.56824', '4474:0 4476:0 '),\n('4476', 'zd744', '571', '66', '4275', '73', '77', '0', '5338.16', '-2432.94', '289.035', '0.00530624', '4475:0 4448:0 4447:0 4449:0 '),\n('4477', 'zd745', '571', '66', '4280', '73', '77', '0', '5779.01', '-2690.72', '276.583', '2.21778', '4464:0 4478:0 '),\n('4478', 'zd746', '571', '66', '4320', '73', '77', '0', '5721.5', '-2843.26', '274.479', '3.99436', '4477:0 4479:0 4481:0 '),\n('4479', 'zd747', '571', '66', '4320', '73', '77', '1', '5795.09', '-3017.85', '286.307', '5.12926', '4478:0 4480:0 '),\n('4480', 'zd748', '571', '66', '4320', '73', '77', '0', '5829.57', '-3089.62', '343.078', '5.24393', '4479:0 4496:0 '),\n('4481', 'zd749', '571', '66', '4280', '73', '77', '0', '5611.83', '-2947.53', '274.379', '3.44223', '4478:0 4482:0 '),\n('4482', 'zd750', '571', '66', '4280', '73', '77', '0', '5467.65', '-3021.98', '288.17', '4.29281', '4481:0 4472:0 '),\n('4483', 'zd751', '571', '66', '4279', '73', '77', '0', '5183.53', '-3158.14', '271.373', '0.983891', '4471:0 4468:0 4484:0 '),\n('4484', 'zd752', '571', '66', '4279', '73', '77', '0', '5277.96', '-3280.48', '281.073', '4.24508', '4483:0 4485:0 '),\n('4485', 'zd753', '571', '66', '4279', '73', '77', '0', '5170.84', '-3397.25', '289.096', '2.18261', '4484:0 4486:0 4488:0 '),\n('4486', 'zd754', '571', '66', '4279', '73', '77', '0', '5037.17', '-3252.81', '278.555', '2.42609', '4485:0 4469:0 '),\n('4487', 'zd755', '571', '66', '4299', '73', '77', '0', '4868.35', '-3381.36', '292.891', '5.68473', '4470:0 4488:0 '),\n('4488', 'zd756', '571', '66', '4299', '73', '77', '0', '5062.51', '-3481.16', '289.586', '4.38568', '4487:0 4485:0 4489:0 '),\n('4489', 'zd757', '571', '66', '4299', '73', '77', '0', '5037.37', '-3645.39', '298.622', '4.61344', '4488:0 4490:0 '),\n('4490', 'zd758', '571', '66', '4299', '73', '77', '0', '5087.62', '-3673.69', '368.159', '1.40275', '4489:0 '),\n('4491', 'zd759', '571', '66', '66', '73', '77', '0', '5653.1', '-3291.77', '372.841', '5.39966', '4472:0 4492:0 4496:0 4527:0 '),\n('4492', 'zd760', '571', '66', '4323', '73', '77', '0', '5760.12', '-3480.35', '382.038', '4.42027', '4491:0 4493:0 4496:0 4527:0 '),\n('4493', 'zd761', '571', '66', '4323', '73', '77', '1', '5763.21', '-3592.34', '386.495', '5.18723', '4492:0 4494:0 '),\n('4494', 'zd762', '571', '66', '66', '73', '77', '0', '5805.54', '-3730.07', '371.987', '2.07548', '4493:0 4495:0 4512:0 4522:0 '),\n('4495', 'zd763', '571', '66', '66', '73', '77', '0', '5926.35', '-3596.12', '371.987', '2.21685', '4494:0 4496:0 4513:0 '),\n('4496', 'zd764', '571', '66', '66', '73', '77', '0', '5852.16', '-3456.19', '373.499', '0.462273', '4491:0 4495:0 4492:0 4497:0 4480:0 '),\n('4497', 'zd765', '571', '66', '4327', '73', '77', '0', '6015.43', '-3354.83', '351.334', '0.898171', '4496:0 4498:0 4500:0 '),\n('4498', 'zd766', '571', '66', '4327', '73', '77', '0', '6064.66', '-3220.41', '351.084', '5.24378', '4497:0 4499:0 '),\n('4499', 'zd767', '571', '66', '4327', '73', '77', '0', '6170.15', '-3269.78', '354.099', '4.83851', '4498:0 4500:0 4504:0 '),\n('4500', 'zd768', '571', '66', '4327', '73', '77', '0', '6123.58', '-3376.38', '350.427', '3.6502', '4499:0 4497:0 4501:0 '),\n('4501', 'zd769', '571', '66', '4328', '73', '77', '0', '6121.57', '-3498.34', '384.702', '6.11321', '4500:0 4503:0 4502:0 '),\n('4502', 'zd770', '571', '66', '4328', '73', '77', '0', '6262.56', '-3570.42', '383.729', '4.01857', '4501:0 4503:0 4510:0 '),\n('4503', 'zd771', '571', '66', '4328', '73', '77', '0', '6183.8', '-3653.66', '384.553', '1.57362', '4501:0 4502:0 4513:0 '),\n('4504', 'zd772', '571', '66', '4321', '73', '77', '0', '6322.87', '-3285.06', '388.539', '6.26715', '4499:0 4505:0 4509:0 4510:0 '),\n('4505', 'zd773', '571', '66', '4321', '73', '77', '0', '6411.23', '-3132.08', '389.357', '0.676679', '4504:0 4506:0 '),\n('4506', 'zd774', '571', '66', '4321', '73', '77', '0', '6573.73', '-3100.58', '392.875', '3.25828', '4505:0 4507:0 '),\n('4507', 'zd775', '571', '66', '4321', '73', '77', '0', '6591.66', '-3194.21', '412.812', '2.18937', '4506:0 4508:0 '),\n('4508', 'zd776', '571', '66', '4321', '73', '77', '0', '6440.64', '-3192.66', '402.475', '4.61546', '4507:0 4509:0 '),\n('4509', 'zd777', '571', '66', '4321', '73', '77', '0', '6464.24', '-3278.19', '402.912', '0.40965', '4508:0 4504:0 '),\n('4510', 'zd778', '571', '66', '4321', '73', '77', '0', '6447.03', '-3450.35', '388.772', '5.0215', '4504:0 4511:0 4502:0 '),\n('4511', 'zd779', '571', '66', '66', '73', '77', '0', '6351.61', '-3625.18', '379.474', '1.56496', '4510:0 '),\n('4512', 'zd780', '571', '66', '4326', '73', '77', '0', '5890.65', '-3784.26', '361.962', '2.65353', '4494:0 4513:0 4514:0 '),\n('4513', 'zd781', '571', '66', '66', '73', '77', '0', '6002.17', '-3684.49', '371.988', '2.91507', '4512:0 4495:0 4503:0 4535:0 '),\n('4514', 'zd782', '571', '66', '66', '73', '77', '0', '5871.01', '-3998.48', '364.264', '5.0278', '4512:0 4515:0 '),\n('4515', 'zd783', '571', '66', '4371', '73', '77', '0', '5936.71', '-4166.52', '353.36', '6.12894', '4514:0 4516:0 4518:0 4519:0 '),\n('4516', 'zd784', '571', '66', '4371', '73', '77', '0', '6121.47', '-4241.02', '320.493', '2.98578', '4515:0 4517:0 '),\n('4517', 'zd785', '571', '66', '4371', '73', '77', '0', '6077.47', '-4432.62', '362.867', '1.61132', '4516:0 4518:0 '),\n('4518', 'zd786', '571', '66', '4371', '73', '77', '0', '5913.09', '-4334', '361.983', '1.57991', '4515:0 4517:0 '),\n('4519', 'zd787', '571', '66', '4325', '73', '77', '0', '5789.33', '-4263.74', '371.348', '4.26205', '4515:0 4520:0 '),\n('4520', 'zd788', '571', '66', '4325', '73', '77', '0', '5716.79', '-4325.83', '373.993', '4.5605', '4519:0 4521:0 4534:0 '),\n('4521', 'zd789', '571', '66', '4325', '73', '77', '0', '5716.89', '-4120.29', '353.305', '1.62547', '4520:0 4522:0 4534:0 '),\n('4522', 'zd790', '571', '66', '66', '73', '77', '0', '5706.28', '-3833.4', '371.987', '0.940598', '4521:0 4494:0 4523:0 '),\n('4523', 'zd791', '571', '66', '66', '73', '77', '0', '5537.84', '-3840.96', '372.119', '2.47998', '4522:0 4524:0 4525:0 '),\n('4524', 'zd792', '571', '66', '4322', '73', '77', '0', '5351.53', '-3648.35', '361.961', '2.27578', '4523:0 4525:0 4526:0 4528:0 '),\n('4525', 'zd793', '571', '66', '4322', '73', '77', '0', '5343.06', '-3764.54', '373.087', '0.190553', '4523:0 4524:0 '),\n('4526', 'zd794', '571', '66', '66', '73', '77', '0', '5524.4', '-3572.01', '365.432', '0.730907', '4524:0 4527:0 '),\n('4527', 'zd795', '571', '66', '4324', '73', '77', '0', '5626.9', '-3422.21', '363.833', '0.990089', '4526:0 4491:0 4492:0 '),\n('4528', 'zd796', '571', '66', '4322', '73', '77', '0', '5153.32', '-3723.32', '360.396', '4.07514', '4524:0 4529:0 '),\n('4529', 'zd797', '571', '66', '4322', '73', '77', '0', '5076.21', '-3849.59', '356.664', '4.99406', '4528:0 4530:0 '),\n('4530', 'zd798', '571', '66', '66', '73', '77', '0', '5136.04', '-4040.57', '355.425', '5.10401', '4529:0 4403:0 4531:0 '),\n('4531', 'zd799', '571', '66', '66', '73', '77', '0', '5278.78', '-4177.66', '363.104', '2.86954', '4530:0 4403:0 4532:0 '),\n('4532', 'zd800', '571', '66', '66', '73', '77', '0', '5437.96', '-4288.78', '363.086', '5.803', '4531:0 4533:0 4534:0 '),\n('4533', 'zd801', '571', '66', '66', '73', '77', '0', '5440.87', '-4452.18', '379.545', '5.85562', '4532:0 '),\n('4534', 'zd802', '571', '66', '4325', '73', '77', '0', '5627.9', '-4207.17', '364.009', '5.93258', '4532:0 4521:0 4520:0 '),\n('4535', 'zd803', '571', '66', '66', '73', '77', '0', '6164.11', '-3834.22', '436.687', '5.57209', '4513:0 4536:0 '),\n('4536', 'zd804', '571', '66', '66', '73', '77', '0', '6297.28', '-3979.47', '456.92', '5.47784', '4535:0 4537:0 '),\n('4537', 'zd805', '571', '66', '66', '73', '77', '0', '6443.44', '-4126.1', '462.301', '5.40087', '4536:0 4538:0 4548:0 '),\n('4538', 'zd806', '571', '66', '4329', '73', '77', '0', '6406.23', '-4295.64', '457.247', '4.84558', '4537:0 4539:0 4547:0 '),\n('4539', 'zd807', '571', '66', '66', '73', '77', '0', '6273.9', '-4442.23', '450.834', '3.83242', '4538:0 4540:0 4543:0 '),\n('4540', 'zd808', '571', '66', '4329', '73', '77', '0', '6178.17', '-4399.01', '456.879', '1.41967', '4539:0 4541:0 '),\n('4541', 'zd809', '571', '66', '4329', '73', '77', '0', '6227.62', '-4232.4', '436.632', '4.94847', '4540:0 4542:0 '),\n('4542', 'zd810', '571', '66', '4329', '73', '77', '0', '6214.01', '-4138.28', '447.456', '5.0066', '4541:0 '),\n('4543', 'zd811', '571', '66', '4373', '73', '77', '0', '6412.14', '-4626.89', '453.335', '2.16502', '4539:0 4544:0 '),\n('4544', 'zd812', '571', '66', '4375', '73', '77', '0', '6602.74', '-4663.95', '450.613', '0.474835', '4543:0 4545:0 4559:0 '),\n('4545', 'zd813', '571', '66', '4375', '73', '77', '0', '6698.48', '-4568.11', '450.518', '2.11632', '4544:0 4546:0 '),\n('4546', 'zd814', '571', '66', '4375', '73', '77', '0', '6638.09', '-4503.12', '485.547', '2.39985', '4545:0 4547:0 '),\n('4547', 'zd815', '571', '66', '4373', '73', '77', '0', '6532.06', '-4368.66', '450.654', '5.95377', '4546:0 4538:0 4548:0 '),\n('4548', 'zd816', '571', '66', '66', '73', '77', '0', '6586.21', '-4259.92', '452.582', '2.52315', '4547:0 4537:0 4549:0 '),\n('4549', 'zd817', '571', '66', '66', '73', '77', '0', '6681.53', '-4181.26', '455.784', '5.78336', '4548:0 4550:0 4557:0 '),\n('4550', 'zd818', '571', '66', '66', '73', '77', '0', '6821.02', '-4227.92', '452.785', '0.387671', '4549:0 4551:0 4557:0 '),\n('4551', 'zd819', '571', '66', '4579', '73', '77', '1', '6899.77', '-4113.21', '467.355', '4.92777', '4550:0 4552:0 '),\n('4552', 'zd820', '571', '66', '66', '73', '77', '0', '7055.14', '-4222.88', '450.363', '3.95496', '4551:0 4553:0 '),\n('4553', 'zd821', '571', '66', '66', '73', '77', '0', '7139.88', '-4413.45', '457.062', '4.921', '4552:0 4554:0 '),\n('4554', 'zd822', '571', '66', '4375', '73', '77', '0', '7003.8', '-4522.32', '450.519', '3.23161', '4553:0 4555:0 '),\n('4555', 'zd823', '571', '66', '4375', '73', '77', '0', '6879.7', '-4603.96', '452.922', '4.36494', '4554:0 4556:0 4558:0 '),\n('4556', 'zd824', '571', '66', '4375', '73', '77', '0', '6779.05', '-4455.52', '441.057', '2.48784', '4555:0 4557:0 '),\n('4557', 'zd825', '571', '66', '4375', '73', '77', '0', '6738.67', '-4314.66', '450.026', '0.835357', '4556:0 4550:0 4549:0 '),\n('4558', 'zd826', '571', '66', '4375', '73', '77', '0', '6817.32', '-4743.11', '450.661', '4.44034', '4555:0 4559:0 '),\n('4559', 'zd827', '571', '66', '66', '73', '77', '0', '6680.31', '-4847.44', '452.584', '2.08415', '4558:0 4544:0 4560:0 '),\n('4560', 'zd828', '571', '66', '4375', '73', '77', '0', '6841.86', '-4987.38', '451.036', '5.56582', '4559:0 '),\n('4561', 'cs829', '571', '2817', '4557', '74', '78', '0', '5438.42', '-1075.94', '181.63', '1.64666', '4419:0 4562:0 4565:0 4567:0 '),\n('4562', 'cs830', '571', '2817', '4554', '74', '78', '0', '5414.79', '-913.179', '165.857', '1.65453', '4561:0 4563:0 '),\n('4563', 'cs831', '571', '2817', '4557', '74', '78', '0', '5529.65', '-840.32', '161.565', '0.178767', '4562:0 4564:0 4566:0 4578:0 '),\n('4564', 'cs832', '571', '2817', '4557', '74', '78', '0', '5646.92', '-907.293', '186.362', '5.31056', '4563:0 4565:0 '),\n('4565', 'cs833', '571', '2817', '4557', '74', '78', '0', '5531.5', '-987.127', '191.383', '0.576966', '4561:0 4564:0 '),\n('4566', 'cs834', '571', '2817', '4558', '74', '78', '5', '5605.93', '-749.995', '199.49', '1.05213', '4563:0 '),\n('4567', 'cs835', '571', '2817', '4554', '74', '78', '0', '5331.06', '-914.795', '170.103', '1.60977', '4561:0 4568:0 '),\n('4568', 'cs836', '571', '2817', '4554', '74', '78', '0', '5307.84', '-750.937', '162.904', '2.08886', '4567:0 4569:0 '),\n('4569', 'cs837', '571', '2817', '4557', '74', '78', '0', '5179.88', '-711.115', '164.986', '1.15816', '4568:0 4570:0 4572:0 '),\n('4570', 'cs838', '571', '2817', '2817', '74', '78', '2', '5082.9', '-704.384', '186.517', '6.16508', '4569:0 4571:0 '),\n('4571', 'cs839', '571', '2817', '4559', '74', '78', '3', '5062.59', '-611.621', '218.683', '5.43466', '4570:0 '),\n('4572', 'cs840', '571', '2817', '4557', '74', '78', '0', '5185.33', '-555.375', '158.496', '1.08748', '4569:0 4573:0 '),\n('4573', 'cs841', '571', '2817', '4557', '74', '78', '0', '5212.12', '-335.385', '163.451', '1.20529', '4572:0 4574:0 '),\n('4574', 'cs842', '571', '2817', '4557', '74', '78', '0', '5329.19', '-218.838', '166.128', '0.232181', '4573:0 4575:0 4583:0 '),\n('4575', 'cs843', '571', '2817', '4557', '74', '78', '0', '5520.69', '-188.647', '157.616', '0.0751006', '4574:0 4576:0 4583:0 '),\n('4576', 'cs844', '571', '2817', '4557', '74', '78', '0', '5672.16', '-264.918', '167.932', '5.74096', '4575:0 4577:0 4579:0 4674:0 '),\n('4577', 'cs845', '571', '2817', '4557', '74', '78', '0', '5583.23', '-439.368', '154.644', '4.20158', '4576:0 4578:0 '),\n('4578', 'cs846', '571', '2817', '4554', '74', '78', '0', '5498.08', '-612.708', '152.463', '4.75686', '4577:0 4563:0 '),\n('4579', 'cs847', '571', '2817', '4553', '74', '78', '0', '5679.51', '-108.805', '178.045', '1.46212', '4576:0 4580:0 4809:0 '),\n('4580', 'cs848', '571', '2817', '4553', '74', '78', '0', '5720.75', '54.3693', '171.054', '1.38122', '4579:0 4581:0 4582:0 4597:0 '),\n('4581', 'cs849', '571', '2817', '4553', '74', '78', '0', '5765.22', '181.998', '182.874', '0.613098', '4580:0 '),\n('4582', 'cs850', '571', '2817', '4553', '74', '78', '0', '5544.73', '121.881', '150.263', '4.18823', '4580:0 4583:0 '),\n('4583', 'cs851', '571', '2817', '4553', '74', '78', '0', '5414.2', '-47.7746', '149.795', '3.91334', '4582:0 4575:0 4574:0 4584:0 '),\n('4584', 'cs852', '571', '2817', '2817', '74', '78', '0', '5354.31', '126.368', '161.642', '2.27029', '4583:0 4585:0 4586:0 '),\n('4585', 'cs853', '571', '2817', '2817', '74', '78', '0', '5257.75', '154.168', '191.769', '2.73995', '4584:0 4101:0 '),\n('4586', 'cs854', '571', '2817', '2817', '74', '78', '0', '5423.58', '292.611', '156.85', '1.48646', '4584:0 4587:0 '),\n('4587', 'cs855', '571', '2817', '2817', '74', '78', '0', '5436.65', '406.464', '167.948', '1.52965', '4586:0 4588:0 4596:0 '),\n('4588', 'cs856', '571', '2817', '4555', '74', '78', '0', '5332.71', '578.052', '182.7', '1.3333', '4587:0 4589:0 '),\n('4589', 'cs857', '571', '2817', '4555', '74', '78', '0', '5471.03', '710.798', '171.741', '0.739547', '4588:0 4590:0 '),\n('4590', 'cs858', '571', '2817', '2817', '74', '78', '0', '5519.14', '908.014', '167.988', '1.35608', '4589:0 4591:0 4592:0 '),\n('4591', 'cs859', '571', '2817', '4556', '74', '78', '1', '5706.15', '1006.05', '174.48', '3.67458', '4590:0 '),\n('4592', 'cs860', '571', '2817', '2817', '74', '78', '0', '5682.36', '825.06', '156.036', '5.32233', '4590:0 4593:0 '),\n('4593', 'cs861', '571', '2817', '2817', '74', '78', '0', '5849.61', '885.831', '160.066', '0.393957', '4592:0 4594:0 '),\n('4594', 'cs862', '571', '2817', '4553', '74', '78', '0', '5854.17', '706.025', '164.715', '4.73956', '4593:0 4595:0 '),\n('4595', 'cs863', '571', '2817', '4553', '74', '78', '0', '5740.73', '555.099', '158.091', '4.03271', '4594:0 4596:0 '),\n('4596', 'cs864', '571', '2817', '4553', '74', '78', '0', '5615.21', '410.65', '156.222', '3.51042', '4595:0 4587:0 4597:0 '),\n('4597', 'cs865', '571', '2817', '4553', '74', '78', '0', '5676.64', '245.015', '166.802', '4.93592', '4596:0 4580:0 '),\n('4598', 'sb866', '571', '3711', '4483', '74', '78', '0', '4671.5', '5526.35', '34.4275', '0.54946', '3857:0 4599:0 '),\n('4599', 'sb867', '571', '3711', '3711', '74', '78', '0', '4892.01', '5531.93', '-71.5606', '0.0389507', '4598:0 4600:0 4628:0 '),\n('4600', 'sb868', '571', '3711', '4289', '74', '78', '0', '4952.39', '5739.79', '-75.5644', '1.2249', '4599:0 4601:0 '),\n('4601', 'sb869', '571', '3711', '4289', '74', '78', '0', '5130.17', '5883.3', '-75.7286', '0.492126', '4600:0 4602:0 '),\n('4602', 'sb870', '571', '3711', '4289', '74', '78', '0', '5325.13', '5886.98', '-68.7967', '0.00281286', '4601:0 4603:0 4629:0 '),\n('4603', 'sb871', '571', '3711', '4285', '74', '78', '0', '5507.19', '5934.35', '-51.6289', '6.11243', '4602:0 4604:0 '),\n('4604', 'sb872', '571', '3711', '3711', '74', '78', '0', '5713', '5871.42', '-60.4173', '5.97499', '4603:0 4605:0 4668:0 '),\n('4605', 'sb873', '571', '3711', '4289', '74', '78', '0', '5882.95', '5730.44', '-63.8448', '5.56737', '4604:0 4606:0 '),\n('4606', 'sb874', '571', '3711', '4289', '74', '78', '0', '6018.42', '5571.93', '-74.0181', '5.18095', '4605:0 4607:0 4657:0 '),\n('4607', 'sb875', '571', '3711', '4385', '74', '78', '0', '6082.5', '5353.27', '-92.7974', '4.70422', '4606:0 4608:0 4656:0 '),\n('4608', 'sb876', '571', '3711', '3711', '74', '78', '0', '6268.69', '5300.48', '-100.197', '0.380579', '4607:0 4609:0 '),\n('4609', 'sb877', '571', '3711', '3711', '74', '78', '0', '6450.25', '5197.28', '-64.1861', '5.49824', '4608:0 4610:0 '),\n('4610', 'sb878', '571', '3711', '4376', '74', '78', '0', '6507.21', '4992.87', '-60.1724', '4.97202', '4609:0 4611:0 4650:0 '),\n('4611', 'sb879', '571', '3711', '3711', '74', '78', '0', '6524.26', '4794.34', '-58.974', '4.36726', '4610:0 4612:0 '),\n('4612', 'sb880', '571', '3711', '4368', '74', '78', '0', '6443.53', '4602.81', '-66.2857', '4.55104', '4611:0 4613:0 4649:0 4651:0 '),\n('4613', 'sb881', '571', '3711', '4368', '74', '78', '0', '6405.01', '4366.1', '-47.8041', '3.90309', '4612:0 4614:0 4648:0 4649:0 '),\n('4614', 'sb882', '571', '3711', '3711', '74', '78', '0', '6226.59', '4265.96', '-45.1729', '3.55594', '4613:0 4615:0 4648:0 '),\n('4615', 'sb883', '571', '3711', '4283', '74', '78', '0', '6111.71', '4134.4', '-48.7024', '4.20861', '4614:0 4616:0 '),\n('4616', 'sb884', '571', '3711', '4283', '74', '78', '0', '6038.48', '4009.63', '-42.6825', '4.13556', '4615:0 4617:0 '),\n('4617', 'sb885', '571', '3711', '4283', '74', '78', '0', '5938.28', '3889.47', '-35.5353', '3.47426', '4616:0 4618:0 4646:0 '),\n('4618', 'sb886', '571', '3711', '4283', '74', '78', '0', '5785.88', '3776.91', '-41.0442', '3.94', '4617:0 4619:0 4646:0 4647:0 '),\n('4619', 'sb887', '571', '3711', '3711', '74', '78', '0', '5624.29', '3606.52', '-21.7442', '3.13811', '4618:0 4620:0 4647:0 '),\n('4620', 'sb888', '571', '3711', '4283', '74', '78', '0', '5488.8', '3794.13', '-58.7714', '2.25061', '4619:0 4621:0 '),\n('4621', 'sb889', '571', '3711', '4387', '74', '78', '0', '5337.73', '3917.13', '-70.8363', '2.57655', '4620:0 4622:0 4642:0 4643:0 '),\n('4622', 'sb890', '571', '3711', '3711', '74', '78', '0', '5220.59', '4104.15', '-78.9241', '2.09588', '4621:0 4623:0 4641:0 '),\n('4623', 'sb891', '571', '3711', '3711', '74', '78', '0', '5146.69', '4294.33', '-99.9765', '1.80057', '4622:0 4624:0 4640:0 '),\n('4624', 'sb892', '571', '3711', '3711', '74', '78', '1', '5110.31', '4494.04', '-98.6996', '1.66941', '4623:0 4625:0 '),\n('4625', 'sb893', '571', '3711', '3711', '74', '78', '0', '5098.19', '4704.21', '-133.607', '2.04248', '4624:0 4626:0 4635:0 '),\n('4626', 'sb894', '571', '3711', '3711', '74', '78', '0', '4975.85', '4879.83', '-101.866', '1.73853', '4625:0 4627:0 4636:0 '),\n('4627', 'sb895', '571', '3711', '3711', '74', '78', '0', '4881.56', '5059.86', '-91.1009', '1.00104', '4626:0 4628:0 '),\n('4628', 'sb896', '571', '3711', '3711', '74', '78', '0', '4917.13', '5259.43', '-92.7846', '1.6058', '4627:0 4599:0 4672:0 '),\n('4629', 'sb897', '571', '3711', '3711', '74', '78', '0', '5325.03', '5694.77', '-87.1296', '4.35079', '4602:0 4630:0 '),\n('4630', 'sb898', '571', '3711', '4288', '74', '78', '0', '5283.58', '5529.21', '-98.5324', '4.62568', '4629:0 4631:0 '),\n('4631', 'sb899', '571', '3711', '3711', '74', '78', '0', '5296.26', '5368.21', '-119.485', '5.45035', '4630:0 4632:0 4669:0 '),\n('4632', 'sb900', '571', '3711', '4293', '74', '78', '0', '5334.1', '5156.57', '-135.744', '4.8503', '4631:0 4633:0 '),\n('4633', 'sb901', '571', '3711', '4293', '74', '78', '0', '5316.24', '4983.73', '-135.985', '4.21805', '4632:0 4634:0 4673:0 '),\n('4634', 'sb902', '571', '3711', '4293', '74', '78', '0', '5263.3', '4836.68', '-132.956', '4.22984', '4633:0 4635:0 '),\n('4635', 'sb903', '571', '3711', '4293', '74', '78', '0', '5171.92', '4761.28', '-134.094', '3.64315', '4634:0 4625:0 '),\n('4636', 'sb904', '571', '3711', '3711', '74', '78', '0', '4906.61', '4752.07', '-80.9517', '3.99658', '4626:0 4637:0 '),\n('4637', 'sb905', '571', '3711', '4388', '74', '78', '0', '4784.59', '4651.45', '-67.3646', '4.27774', '4636:0 4638:0 '),\n('4638', 'sb906', '571', '3711', '4388', '74', '78', '0', '4776.89', '4461.82', '-65.79', '0.115909', '4637:0 4639:0 '),\n('4639', 'sb907', '571', '3711', '3711', '74', '78', '0', '4858.79', '4312.13', '-51.668', '4.56127', '4638:0 4640:0 '),\n('4640', 'sb908', '571', '3711', '4304', '74', '78', '0', '5008.15', '4265.85', '-85.0377', '2.88757', '4639:0 4623:0 '),\n('4641', 'sb909', '571', '3711', '4303', '74', '78', '0', '5141.4', '4002.05', '-61.6423', '4.65002', '4622:0 4642:0 '),\n('4642', 'sb910', '571', '3711', '3711', '74', '78', '0', '5236.32', '3820.55', '-29.2583', '0.629582', '4641:0 4621:0 '),\n('4643', 'sb911', '571', '3711', '4283', '74', '78', '0', '5426.13', '4100.88', '-86.7674', '1.1935', '4621:0 4644:0 '),\n('4644', 'sb912', '571', '3711', '4283', '74', '78', '0', '5555.95', '4256', '-102.563', '0.234915', '4643:0 4645:0 4664:0 '),\n('4645', 'sb913', '571', '3711', '4283', '74', '78', '0', '5713.23', '4134.64', '-89.7735', '5.05333', '4644:0 4646:0 '),\n('4646', 'sb914', '571', '3711', '4283', '74', '78', '0', '5757.78', '3962.65', '-74.4666', '5.33842', '4645:0 4617:0 4618:0 '),\n('4647', 'sb915', '571', '3711', '4297', '74', '78', '0', '5782.35', '3632.67', '-13.2643', '3.22964', '4618:0 4619:0 '),\n('4648', 'sb916', '571', '3711', '3711', '74', '78', '0', '6360.37', '4223.67', '-44.0521', '1.79237', '4613:0 4614:0 '),\n('4649', 'sb917', '571', '3711', '4368', '74', '78', '0', '6543.56', '4456.6', '-47.1567', '2.3712', '4613:0 4612:0 '),\n('4650', 'sb918', '571', '3711', '4376', '74', '78', '0', '6354.19', '4873.76', '-84.2341', '5.19234', '4610:0 4651:0 '),\n('4651', 'sb919', '571', '3711', '3711', '74', '78', '0', '6357.09', '4685.34', '-78.5111', '5.19313', '4650:0 4612:0 4652:0 '),\n('4652', 'sb920', '571', '3711', '3711', '74', '78', '0', '6208.52', '4590.1', '-92.1573', '3.70988', '4651:0 4653:0 '),\n('4653', 'sb921', '571', '3711', '3711', '74', '78', '0', '6025.9', '4686.81', '-95.5438', '1.9176', '4652:0 4654:0 '),\n('4654', 'sb922', '571', '3711', '3711', '74', '78', '0', '5994.9', '4894.76', '-99.8287', '1.31128', '4653:0 4655:0 '),\n('4655', 'sb923', '571', '3711', '4385', '74', '78', '0', '5981.34', '5089.26', '-100.986', '1.44401', '4654:0 4656:0 '),\n('4656', 'sb924', '571', '3711', '4391', '74', '78', '0', '5939.08', '5277.6', '-99.1834', '0.521168', '4655:0 4607:0 4657:0 4658:0 '),\n('4657', 'sb925', '571', '3711', '4391', '74', '78', '0', '5903.46', '5420.52', '-94.3184', '1.13064', '4656:0 4606:0 '),\n('4658', 'sb926', '571', '3711', '4293', '74', '78', '0', '5830.14', '5100.16', '-132.628', '3.78921', '4656:0 4659:0 '),\n('4659', 'sb927', '571', '3711', '4293', '74', '78', '0', '5680.53', '5002.31', '-134.988', '3.89916', '4658:0 4660:0 '),\n('4660', 'sb928', '571', '3711', '4293', '74', '78', '0', '5699.45', '4825.48', '-137.014', '5.40319', '4659:0 4661:0 '),\n('4661', 'sb929', '571', '3711', '4293', '74', '78', '0', '5769.89', '4694.83', '-130.521', '4.6445', '4660:0 4662:0 '),\n('4662', 'sb930', '571', '3711', '4293', '74', '78', '0', '5768.78', '4519.94', '-133.978', '4.9029', '4661:0 4663:0 '),\n('4663', 'sb931', '571', '3711', '4293', '74', '78', '0', '5638.21', '4442.49', '-138.205', '3.53632', '4662:0 4664:0 4665:0 '),\n('4664', 'sb932', '571', '3711', '4293', '74', '78', '0', '5520.96', '4384.34', '-134.132', '5.02072', '4663:0 4644:0 '),\n('4665', 'sb933', '571', '3711', '4293', '74', '78', '1', '5647.9', '4579.12', '-137.584', '3.59247', '4663:0 4666:0 '),\n('4666', 'sb934', '571', '3711', '4293', '74', '78', '0', '5559.82', '4670.56', '-135.523', '1.45736', '4665:0 4667:0 '),\n('4667', 'sb935', '571', '3711', '4383', '74', '78', '5', '5497.21', '4748.71', '-193.716', '5.27047', '4666:0 '),\n('4668', 'sb936', '571', '3711', '4284', '74', '78', '1', '5575.69', '5751.97', '-74.7038', '0.766207', '4604:0 4671:0 '),\n('4669', 'sb937', '571', '3711', '4285', '74', '78', '0', '5456.52', '5353.98', '-134.279', '6.15248', '4631:0 4670:0 '),\n('4670', 'sb938', '571', '3711', '3711', '74', '78', '0', '5648.23', '5302.27', '-121.201', '1.53199', '4669:0 4671:0 '),\n('4671', 'sb939', '571', '3711', '3711', '74', '78', '0', '5580.86', '5590.13', '-92.6294', '1.61445', '4670:0 4668:0 '),\n('4672', 'sb940', '571', '3711', '3711', '74', '78', '0', '5041.36', '5069.92', '-110.999', '5.98282', '4628:0 4673:0 '),\n('4673', 'sb941', '571', '3711', '4293', '74', '78', '0', '5202.57', '5018.06', '-134.206', '5.92392', '4672:0 4633:0 '),\n('4674', 'sp942', '571', '67', '67', '76', '80', '0', '5752.46', '-354.53', '205.676', '5.2249', '4576:0 4675:0 '),\n('4675', 'sp943', '571', '67', '4419', '76', '80', '0', '5903.83', '-485.757', '296.6', '6.0849', '4674:0 4676:0 '),\n('4676', 'sp944', '571', '67', '4419', '76', '80', '0', '6079.55', '-564.659', '370.689', '5.9286', '4675:0 4677:0 4689:0 4690:0 '),\n('4677', 'sp945', '571', '67', '4419', '76', '80', '0', '6182.6', '-758.333', '400.203', '4.95', '4676:0 4678:0 4688:0 '),\n('4678', 'sp946', '571', '67', '4419', '76', '80', '0', '6143.85', '-967.832', '398.945', '4.41828', '4677:0 4679:0 4680:0 '),\n('4679', 'sp947', '571', '67', '4418', '76', '80', '1', '6122.51', '-1083.62', '402.604', '1.60263', '4678:0 '),\n('4680', 'sp948', '571', '67', '4419', '76', '80', '0', '6273.81', '-1034.37', '412.299', '5.98122', '4678:0 4681:0 4691:0 '),\n('4681', 'sp949', '571', '67', '4462', '76', '80', '0', '6444.88', '-1034.29', '429.644', '6.27654', '4680:0 4682:0 '),\n('4682', 'sp950', '571', '67', '4462', '76', '80', '0', '6611.36', '-1016.67', '427.636', '0.199126', '4681:0 4683:0 4684:0 '),\n('4683', 'sp951', '571', '67', '4462', '76', '80', '0', '6639.97', '-1111.4', '427.1', '3.18364', '4682:0 '),\n('4684', 'sp952', '571', '67', '4462', '76', '80', '0', '6673.93', '-1219.13', '398.841', '5.0403', '4682:0 4685:0 4686:0 '),\n('4685', 'sp953', '571', '67', '4462', '76', '80', '0', '6592.21', '-1275.82', '392.991', '5.05994', '4684:0 '),\n('4686', 'sp954', '571', '67', '4462', '76', '80', '0', '6697.35', '-1426.2', '388.747', '4.94449', '4684:0 4687:0 '),\n('4687', 'sp955', '571', '67', '4462', '76', '80', '0', '6795.01', '-1512.06', '359.911', '5.79979', '4686:0 '),\n('4688', 'sp956', '571', '67', '4419', '76', '80', '0', '6324.13', '-838.805', '407.569', '0.335772', '4677:0 '),\n('4689', 'sp957', '571', '67', '4419', '76', '80', '0', '6232.08', '-626.646', '414.707', '2.81842', '4676:0 '),\n('4690', 'sp958', '571', '67', '4419', '76', '80', '0', '6146.68', '-346.08', '436.33', '4.09626', '4676:0 '),\n('4691', 'sp959', '571', '67', '4419', '76', '80', '0', '6257', '-1198.57', '428.281', '5.0293', '4680:0 4692:0 4693:0 '),\n('4692', 'sp960', '571', '67', '4460', '76', '80', '0', '6297.61', '-1350.75', '426.332', '4.79525', '4691:0 4699:0 '),\n('4693', 'sp961', '571', '67', '4460', '76', '80', '0', '6393.21', '-1222.32', '429.226', '4.92092', '4691:0 4694:0 '),\n('4694', 'sp962', '571', '67', '4419', '76', '80', '0', '6471.87', '-1383.27', '479.473', '4.04521', '4693:0 4695:0 '),\n('4695', 'sp963', '571', '67', '4421', '76', '80', '0', '6345.12', '-1517.97', '434.126', '3.78838', '4694:0 4696:0 '),\n('4696', 'sp964', '571', '67', '4421', '76', '80', '0', '6349.58', '-1586.52', '428.04', '5.62228', '4695:0 4697:0 4699:0 '),\n('4697', 'sp965', '571', '67', '4421', '76', '80', '0', '6455.08', '-1685.64', '435.366', '5.95606', '4696:0 4698:0 '),\n('4698', 'sp966', '571', '67', '4421', '76', '80', '0', '6462.41', '-1739.78', '484.912', '2.47281', '4697:0 '),\n('4699', 'sp967', '571', '67', '4421', '76', '80', '0', '6232.83', '-1499.78', '419.118', '0.960144', '4696:0 4692:0 '),\n('4700', 'sp968', '571', '67', '4484', '76', '80', '1', '8455.31', '-325.265', '906.979', '2.46809', '4701:0 '),\n('4701', 'sp969', '571', '67', '4484', '76', '80', '0', '8485.73', '-279.992', '850.711', '1.97722', '4700:0 4702:0 '),\n('4702', 'sp970', '571', '67', '4436', '76', '80', '0', '8483.73', '-136.842', '797.392', '1.57038', '4701:0 4703:0 4706:0 '),\n('4703', 'sp971', '571', '67', '4436', '76', '80', '0', '8481.05', '57.8398', '786.425', '1.56174', '4702:0 4704:0 '),\n('4704', 'sp972', '571', '67', '4436', '76', '80', '0', '8468.58', '226.668', '788.805', '1.98979', '4703:0 4705:0 '),\n('4705', 'sp973', '571', '67', '4436', '76', '80', '0', '8317.77', '105.355', '824.229', '4.03339', '4704:0 4706:0 '),\n('4706', 'sp974', '571', '67', '4436', '76', '80', '0', '8313.08', '-91.3043', '827.379', '4.66407', '4705:0 4702:0 4707:0 4719:0 '),\n('4707', 'sp975', '571', '67', '4435', '76', '80', '0', '8202.06', '-202.29', '871.634', '4.01769', '4706:0 4708:0 4710:0 '),\n('4708', 'sp976', '571', '67', '4435', '76', '80', '0', '8237.33', '-247.278', '952.88', '3.24408', '4707:0 4709:0 '),\n('4709', 'sp977', '571', '67', '4435', '76', '80', '0', '8092.31', '-403.116', '964.773', '0.843118', '4708:0 '),\n('4710', 'sp978', '571', '67', '4435', '76', '80', '0', '8040.6', '-222.79', '846.911', '3.84806', '4707:0 4711:0 '),\n('4711', 'sp979', '571', '67', '4435', '76', '80', '0', '7945.56', '-368.7', '884.037', '5.26884', '4710:0 4712:0 4713:0 4715:0 '),\n('4712', 'sp980', '571', '67', '4435', '76', '80', '0', '7953.58', '-524.527', '913.45', '5.63719', '4711:0 4737:0 '),\n('4713', 'sp981', '571', '67', '4435', '76', '80', '0', '8056.94', '-415.927', '981.568', '4.73712', '4711:0 4714:0 '),\n('4714', 'sp982', '571', '67', '4435', '76', '80', '0', '8116.43', '-385.365', '981.611', '0.510895', '4713:0 '),\n('4715', 'sp983', '571', '67', '4436', '76', '80', '0', '7847.85', '-252.132', '885.258', '1.43374', '4711:0 4716:0 4724:0 '),\n('4716', 'sp984', '571', '67', '4436', '76', '80', '0', '7851.3', '-120.4', '880.754', '2.3126', '4715:0 4717:0 '),\n('4717', 'sp985', '571', '67', '4486', '76', '80', '0', '7796.32', '-44.5017', '882.083', '4.37664', '4716:0 4718:0 '),\n('4718', 'sp986', '571', '67', '4486', '76', '80', '0', '7737.47', '-4.97132', '866.565', '4.27297', '4717:0 '),\n('4719', 'sp987', '571', '67', '4434', '76', '80', '0', '8078.57', '-32.5271', '869.499', '2.49247', '4706:0 4720:0 '),\n('4720', 'sp988', '571', '67', '4434', '76', '80', '0', '8168.23', '99.4058', '898.859', '1.3183', '4719:0 4721:0 '),\n('4721', 'sp989', '571', '67', '4434', '76', '80', '0', '7974.07', '-6.90656', '961.657', '1.27039', '4720:0 4722:0 '),\n('4722', 'sp990', '571', '67', '4434', '76', '80', '0', '7950.02', '93.3063', '1028.03', '0.358544', '4721:0 4723:0 '),\n('4723', 'sp991', '571', '67', '4434', '76', '80', '0', '7756.08', '70.5513', '1009.34', '2.07228', '4722:0 '),\n('4724', 'sp992', '571', '67', '4436', '76', '80', '0', '7731.17', '-155.37', '873.081', '2.5828', '4715:0 4725:0 '),\n('4725', 'sp993', '571', '67', '67', '76', '80', '0', '7531.71', '-82.1077', '837.076', '3.3682', '4724:0 4726:0 '),\n('4726', 'sp994', '571', '67', '4424', '76', '80', '0', '7365.61', '-62.5754', '778.928', '3.05011', '4725:0 4727:0 4731:0 '),\n('4727', 'sp995', '571', '67', '4424', '76', '80', '0', '7426.39', '97.7694', '770.976', '6.19485', '4726:0 4728:0 '),\n('4728', 'sp996', '571', '67', '4499', '76', '80', '0', '7491.52', '288.222', '774.525', '2.91503', '4727:0 4729:0 '),\n('4729', 'sp997', '571', '67', '4424', '76', '80', '0', '7352.12', '248.002', '774.191', '5.46442', '4728:0 4730:0 '),\n('4730', 'sp998', '571', '67', '4424', '76', '80', '0', '7358.47', '144.777', '783.476', '4.25726', '4729:0 4731:0 '),\n('4731', 'sp999', '571', '67', '4424', '76', '80', '0', '7260.89', '6.23937', '773.777', '4.18657', '4730:0 4726:0 4732:0 '),\n('4732', 'sp1000', '571', '67', '4424', '76', '80', '0', '7178.24', '-109.916', '772.616', '4.20384', '4731:0 4733:0 4736:0 '),\n('4733', 'sp1001', '571', '67', '4452', '76', '80', '0', '7066.53', '-147.905', '785.381', '3.57396', '4732:0 4734:0 '),\n('4734', 'sp1002', '571', '67', '4453', '76', '80', '0', '6959.39', '-173.873', '763.88', '2.97313', '4733:0 4735:0 '),\n('4735', 'sp1003', '571', '67', '4453', '76', '80', '0', '6782.97', '-67.7557', '738.941', '2.11233', '4734:0 '),\n('4736', 'sp1004', '571', '67', '4452', '76', '80', '0', '7090.4', '-308.701', '774.099', '4.51251', '4732:0 '),\n('4737', 'sp1005', '571', '67', '67', '76', '80', '0', '8123.18', '-622.333', '945.418', '5.51782', '4712:0 4738:0 '),\n('4738', 'sp1006', '571', '67', '4446', '76', '80', '0', '8249.28', '-737.261', '923.975', '5.57986', '4737:0 4739:0 '),\n('4739', 'sp1007', '571', '67', '4446', '76', '80', '0', '8264.89', '-900.437', '923.875', '2.77599', '4738:0 4740:0 4742:0 '),\n('4740', 'sp1008', '571', '67', '4485', '76', '80', '0', '8140.52', '-817.38', '956.118', '4.95861', '4739:0 4741:0 '),\n('4741', 'sp1009', '571', '67', '4485', '76', '80', '0', '8148.76', '-940.656', '956.955', '0.816413', '4740:0 '),\n('4742', 'sp1010', '571', '67', '4446', '76', '80', '0', '8178.94', '-1015.84', '926.187', '5.46676', '4739:0 4743:0 '),\n('4743', 'sp1011', '571', '67', '4446', '76', '80', '0', '8330.55', '-1186.57', '924.477', '5.49032', '4742:0 '),\n('4744', 'sp1012', '571', '67', '4441', '76', '80', '4', '7798.27', '-2842.24', '1219.51', '2.4704', '4745:0 4746:0 '),\n('4745', 'sp1013', '571', '67', '4441', '76', '80', '5', '7804.98', '-2945.31', '1256.79', '1.43524', '4744:0 '),\n('4746', 'sp1014', '571', '67', '4441', '76', '80', '0', '7866.14', '-2800.43', '1136.14', '2.6746', '4744:0 4747:0 4762:0 '),\n('4747', 'sp1015', '571', '67', '4444', '76', '80', '0', '7974.26', '-2941.67', '1137.82', '0.286989', '4746:0 4748:0 '),\n('4748', 'sp1016', '571', '67', '4444', '76', '80', '0', '8053.32', '-2899.02', '1136.35', '5.48632', '4747:0 4749:0 4753:0 '),\n('4749', 'sp1017', '571', '67', '67', '76', '80', '0', '8303.1', '-2938.59', '1067.71', '2.65574', '4748:0 4750:0 '),\n('4750', 'sp1018', '571', '67', '4488', '76', '80', '0', '8126.19', '-2813.7', '1044.76', '1.21375', '4749:0 4751:0 4752:0 '),\n('4751', 'sp1019', '571', '67', '4488', '76', '80', '0', '8235.54', '-2730.69', '1035.47', '6.08244', '4750:0 4752:0 '),\n('4752', 'sp1020', '571', '67', '4488', '76', '80', '0', '8268.8', '-2840.55', '1051.57', '2.98168', '4751:0 4750:0 '),\n('4753', 'sp1021', '571', '67', '4444', '76', '80', '0', '8178.4', '-2765.96', '1137.8', '1.58369', '4748:0 4754:0 '),\n('4754', 'sp1022', '571', '67', '4444', '76', '80', '0', '8192.81', '-2569.46', '1145.92', '1.28524', '4753:0 4755:0 4761:0 '),\n('4755', 'sp1023', '571', '67', '4446', '76', '80', '0', '8213.34', '-2399.15', '1136.06', '1.39441', '4754:0 4756:0 '),\n('4756', 'sp1024', '571', '67', '4446', '76', '80', '0', '8146.87', '-2304.3', '1157.9', '3.14664', '4755:0 4757:0 4758:0 '),\n('4757', 'sp1025', '571', '67', '4446', '76', '80', '0', '8041.79', '-2401.8', '1157.91', '1.83659', '4756:0 4758:0 4759:0 '),\n('4758', 'sp1026', '571', '67', '4446', '76', '80', '0', '7981.22', '-2241.64', '1157.87', '2.17589', '4757:0 4756:0 '),\n('4759', 'sp1027', '571', '67', '4446', '76', '80', '0', '7920.25', '-2449.09', '1137.97', '1.81145', '4757:0 4760:0 4763:0 '),\n('4760', 'sp1028', '571', '67', '4444', '76', '80', '0', '7924.11', '-2571.76', '1159.29', '2.58976', '4759:0 4761:0 '),\n('4761', 'sp1029', '571', '67', '4444', '76', '80', '0', '8046.59', '-2635.79', '1135.01', '6.18452', '4760:0 4754:0 4762:0 '),\n('4762', 'sp1030', '571', '67', '4463', '76', '80', '0', '7915.54', '-2719.76', '1135.12', '3.80869', '4761:0 4746:0 '),\n('4763', 'sp1031', '571', '67', '4446', '76', '80', '0', '7902.91', '-2332.91', '1153.05', '3.63118', '4759:0 4764:0 '),\n('4764', 'sp1032', '571', '67', '4442', '76', '80', '0', '7759.44', '-2386.38', '1077.61', '2.84264', '4763:0 4765:0 '),\n('4765', 'sp1033', '571', '67', '4442', '76', '80', '0', '7670.97', '-2282.57', '1010.94', '2.45387', '4764:0 4766:0 '),\n('4766', 'sp1034', '571', '67', '4442', '76', '80', '0', '7541.71', '-2363.06', '867.728', '2.12164', '4765:0 4767:0 '),\n('4767', 'sp1035', '571', '67', '4442', '76', '80', '0', '7465.67', '-2485.65', '760.441', '0.00970542', '4766:0 4768:0 4781:0 '),\n('4768', 'sp1036', '571', '67', '4438', '76', '80', '0', '7327.84', '-2537.89', '748.903', '4.00974', '4767:0 4769:0 4781:0 '),\n('4769', 'sp1037', '571', '67', '4438', '76', '80', '0', '7348.8', '-2768.24', '766.138', '4.91922', '4768:0 4770:0 '),\n('4770', 'sp1038', '571', '67', '4438', '76', '80', '0', '7348.82', '-2958.97', '838.738', '4.70872', '4769:0 4771:0 4780:0 '),\n('4771', 'sp1039', '571', '67', '4439', '76', '80', '0', '7229.61', '-3136.68', '837.486', '4.08826', '4770:0 4772:0 4780:0 '),\n('4772', 'sp1040', '571', '67', '4495', '76', '80', '0', '7202.51', '-3334.74', '843.826', '4.6883', '4771:0 4773:0 '),\n('4773', 'sp1041', '571', '67', '4439', '76', '80', '0', '7368.35', '-3244.03', '851.789', '5.98892', '4772:0 4774:0 '),\n('4774', 'sp1042', '571', '67', '4439', '76', '80', '0', '7555.15', '-3237.78', '842.017', '0.160478', '4773:0 4775:0 '),\n('4775', 'sp1043', '571', '67', '4440', '76', '80', '0', '7723.64', '-3278.88', '863.372', '5.73209', '4774:0 4776:0 '),\n('4776', 'sp1044', '571', '67', '4440', '76', '80', '0', '7843.39', '-3412.02', '865.974', '6.25831', '4775:0 4777:0 '),\n('4777', 'sp1045', '571', '67', '4440', '76', '80', '0', '8007.01', '-3282.63', '865.574', '2.51589', '4776:0 4778:0 '),\n('4778', 'sp1046', '571', '67', '4440', '76', '80', '0', '7854.16', '-3160.4', '864.749', '3.02718', '4777:0 4779:0 '),\n('4779', 'sp1047', '571', '67', '4440', '76', '80', '0', '7635.61', '-3117.6', '867.091', '3.3971', '4778:0 4780:0 '),\n('4780', 'sp1048', '571', '67', '4439', '76', '80', '0', '7437.01', '-3083.87', '837.452', '2.68239', '4779:0 4770:0 4771:0 '),\n('4781', 'sp1049', '571', '67', '4437', '76', '80', '0', '7293.97', '-2399.5', '753.5', '6.25517', '4768:0 4767:0 4782:0 '),\n('4782', 'sp1050', '571', '67', '4437', '76', '80', '0', '7210.78', '-2258.23', '756.519', '2.1766', '4781:0 4783:0 '),\n('4783', 'sp1051', '571', '67', '4437', '76', '80', '0', '7094.38', '-2114.84', '759.283', '2.32896', '4782:0 4784:0 '),\n('4784', 'sp1052', '571', '67', '4437', '76', '80', '0', '7071.57', '-1957.32', '769.29', '1.71086', '4783:0 4785:0 '),\n('4785', 'sp1053', '571', '67', '4422', '76', '80', '0', '7047.94', '-1819.05', '822.822', '1.51843', '4784:0 4786:0 '),\n('4786', 'sp1054', '571', '67', '4422', '76', '80', '0', '7016.16', '-1682.12', '819.647', '1.56948', '4785:0 4787:0 4788:0 4795:0 '),\n('4787', 'sp1055', '571', '67', '4422', '76', '80', '0', '6952.92', '-1523.53', '837.796', '1.58755', '4786:0 4788:0 4789:0 '),\n('4788', 'sp1056', '571', '67', '4422', '76', '80', '0', '6876.88', '-1688.13', '820.475', '5.87424', '4787:0 4786:0 '),\n('4789', 'sp1057', '571', '67', '4425', '76', '80', '0', '6933.96', '-1355.59', '831.143', '1.62444', '4787:0 4790:0 '),\n('4790', 'sp1058', '571', '67', '4425', '76', '80', '0', '6927.88', '-1275.08', '819.873', '1.80979', '4789:0 4791:0 '),\n('4791', 'sp1059', '571', '67', '4423', '76', '80', '0', '6891.54', '-1120.83', '801.801', '2.04934', '4790:0 4792:0 4794:0 '),\n('4792', 'sp1060', '571', '67', '4423', '76', '80', '0', '6874.8', '-994.702', '800.05', '1.94645', '4791:0 4793:0 '),\n('4793', 'sp1061', '571', '67', '4423', '76', '80', '0', '6713.98', '-1032.73', '766.307', '5.25848', '4792:0 4794:0 '),\n('4794', 'sp1062', '571', '67', '4423', '76', '80', '0', '6823.44', '-1136.74', '794.362', '1.42024', '4793:0 4791:0 '),\n('4795', 'sp1063', '571', '67', '4422', '76', '80', '0', '7059.17', '-1565.01', '830.127', '1.02674', '4786:0 4796:0 '),\n('4796', 'sp1064', '571', '67', '4432', '76', '80', '1', '7107.06', '-1444.92', '924.841', '0.0175042', '4795:0 4797:0 4808:0 '),\n('4797', 'sp1065', '571', '67', '4432', '76', '80', '0', '7224.43', '-1369.92', '917.332', '1.04952', '4796:0 4798:0 '),\n('4798', 'sp1066', '571', '67', '4432', '76', '80', '0', '7304.81', '-1229.95', '912.257', '1.04952', '4797:0 4799:0 '),\n('4799', 'sp1067', '571', '67', '4473', '76', '80', '0', '7277.74', '-1094.09', '938.898', '4.08901', '4798:0 4800:0 4801:0 '),\n('4800', 'sp1068', '571', '67', '4473', '76', '80', '0', '7159.16', '-1203.13', '929.255', '3.39314', '4799:0 '),\n('4801', 'sp1069', '571', '67', '4432', '76', '80', '0', '7276.68', '-952.788', '919.235', '1.31654', '4799:0 4802:0 '),\n('4802', 'sp1070', '571', '67', '4432', '76', '80', '0', '7442.11', '-871.692', '910.159', '0.46203', '4801:0 4803:0 '),\n('4803', 'sp1071', '571', '67', '4432', '76', '80', '0', '7617.15', '-899.183', '911.902', '5.67158', '4802:0 4804:0 '),\n('4804', 'sp1072', '571', '67', '4432', '76', '80', '0', '7731.32', '-1040.44', '920.428', '5.0087', '4803:0 4805:0 '),\n('4805', 'sp1073', '571', '67', '4432', '76', '80', '0', '7620.47', '-1211.71', '928.587', '4.24765', '4804:0 4806:0 '),\n('4806', 'sp1074', '571', '67', '4432', '76', '80', '0', '7523.4', '-1365.25', '935.317', '3.55807', '4805:0 4807:0 '),\n('4807', 'sp1075', '571', '67', '4432', '76', '80', '0', '7392.6', '-1463.43', '928.011', '4.00967', '4806:0 4808:0 '),\n('4808', 'sp1076', '571', '67', '4536', '76', '80', '0', '7307.54', '-1573.81', '942.399', '2.34934', '4807:0 4796:0 '),\n('4809', 'cs1077', '571', '2817', '2817', '76', '80', '0', '5850.58', '-134.972', '227.342', '6.13811', '4579:0 4810:0 '),\n('4810', 'ic1078', '571', '210', '4501', '77', '80', '0', '5971.83', '-162.754', '303.817', '0.106256', '4809:0 4811:0 '),\n('4811', 'ic1079', '571', '210', '4501', '77', '80', '1', '6141.12', '-52.066', '381.591', '0.738502', '4810:0 4812:0 '),\n('4812', 'ic1080', '571', '210', '4501', '77', '80', '0', '6194.51', '34.1853', '380.232', '0.656035', '4811:0 4813:0 4815:0 '),\n('4813', 'ic1081', '571', '210', '4504', '77', '80', '0', '6172.36', '156.629', '374.276', '0.907363', '4812:0 4814:0 '),\n('4814', 'ic1082', '571', '210', '4504', '77', '80', '0', '6379.33', '179.484', '392.956', '0.48639', '4813:0 4815:0 4816:0 '),\n('4815', 'ic1083', '571', '210', '4501', '77', '80', '0', '6302.14', '95.8391', '390.823', '3.94214', '4814:0 4812:0 '),\n('4816', 'ic1084', '571', '210', '4505', '77', '80', '0', '6510.94', '285.541', '400.181', '0.224064', '4814:0 4817:0 '),\n('4817', 'ic1085', '571', '210', '4505', '77', '80', '0', '6561.12', '378.976', '420.028', '1.01575', '4816:0 4818:0 4819:0 '),\n('4818', 'ic1086', '571', '210', '4506', '77', '80', '0', '6586.56', '556.561', '402.946', '1.2011', '4817:0 4819:0 4820:0 '),\n('4819', 'ic1087', '571', '210', '4506', '77', '80', '0', '6708.22', '403.424', '412.114', '3.63504', '4818:0 4817:0 4824:0 '),\n('4820', 'ic1088', '571', '210', '4506', '77', '80', '0', '6723.06', '690.867', '407.835', '0.367783', '4818:0 4821:0 4851:0 '),\n('4821', 'ic1089', '571', '210', '4506', '77', '80', '0', '6907.33', '730.085', '420.328', '0.313591', '4820:0 4822:0 4846:0 '),\n('4822', 'ic1090', '571', '210', '4506', '77', '80', '0', '6968.03', '622.605', '462.269', '4.11884', '4821:0 4823:0 4825:0 '),\n('4823', 'ic1091', '571', '210', '4506', '77', '80', '0', '6892.8', '465.906', '471.697', '4.29869', '4822:0 '),\n('4824', 'ic1092', '571', '210', '4506', '77', '80', '0', '6802.58', '551.703', '425.103', '0.960751', '4819:0 '),\n('4825', 'ic1093', '571', '210', '4506', '77', '80', '0', '7175.08', '588.447', '498.301', '5.6747', '4822:0 4826:0 4827:0 '),\n('4826', 'ic1094', '571', '210', '4506', '77', '80', '0', '7078.72', '503.754', '527.049', '0.380329', '4825:0 '),\n('4827', 'ic1095', '571', '210', '4593', '77', '80', '0', '7262.77', '707.458', '487.068', '0.969396', '4825:0 4828:0 '),\n('4828', 'ic1096', '571', '210', '210', '77', '80', '0', '7380.79', '847.639', '456.611', '1.04794', '4827:0 4829:0 '),\n('4829', 'ic1097', '571', '210', '4533', '77', '80', '0', '7556.82', '768.81', '478.284', '6.18915', '4828:0 4830:0 4831:0 '),\n('4830', 'ic1098', '571', '210', '4533', '77', '80', '0', '7584.83', '947.602', '480.255', '1.08485', '4829:0 4831:0 '),\n('4831', 'ic1099', '571', '210', '4533', '77', '80', '0', '7712.14', '808.936', '478.443', '2.68156', '4830:0 4829:0 4832:0 '),\n('4832', 'ic1100', '571', '210', '4533', '77', '80', '0', '7860.07', '894.491', '452.788', '0.0928901', '4831:0 4833:0 4842:0 4845:0 '),\n('4833', 'ic1101', '571', '210', '4533', '77', '80', '0', '8034.56', '793.581', '473.244', '0.0151296', '4832:0 4834:0 '),\n('4834', 'ic1102', '571', '210', '4658', '77', '80', '0', '8220.62', '796.211', '504.283', '0.00650024', '4833:0 4835:0 '),\n('4835', 'ic1103', '571', '210', '4658', '77', '80', '0', '8374.24', '796.938', '547.919', '6.10983', '4834:0 4836:0 4841:0 '),\n('4836', 'ic1104', '571', '210', '4669', '77', '80', '0', '8423.03', '930.654', '544.674', '1.16574', '4835:0 4837:0 '),\n('4837', 'ic1105', '571', '210', '4658', '77', '80', '1', '8522.2', '1039.69', '548.104', '0.757338', '4836:0 4838:0 '),\n('4838', 'ic1106', '571', '210', '4658', '77', '80', '0', '8609.95', '905.31', '545.094', '5.03776', '4837:0 4839:0 '),\n('4839', 'ic1107', '571', '210', '4658', '77', '80', '3', '8585.78', '716.794', '547.469', '4.14555', '4838:0 4840:0 '),\n('4840', 'ic1108', '571', '210', '4658', '77', '80', '0', '8489.61', '581.224', '559.708', '4.17226', '4839:0 4841:0 '),\n('4841', 'ic1109', '571', '210', '4658', '77', '80', '5', '8440.59', '706.692', '547.293', '2.35563', '4840:0 4835:0 '),\n('4842', 'ic1110', '571', '210', '4533', '77', '80', '0', '7765.83', '995.585', '447.266', '2.83001', '4832:0 4843:0 '),\n('4843', 'ic1111', '571', '210', '4533', '77', '80', '0', '7711.5', '1167.13', '440.596', '0.808391', '4842:0 4844:0 '),\n('4844', 'ic1112', '571', '210', '4533', '77', '80', '0', '7859.21', '1231.56', '441.972', '0.590053', '4843:0 4845:0 4875:0 '),\n('4845', 'ic1113', '571', '210', '4533', '77', '80', '0', '7895.54', '1042.03', '450.717', '4.64349', '4844:0 4832:0 '),\n('4846', 'ic1114', '571', '210', '4508', '77', '80', '0', '6955.49', '874.331', '402.675', '1.29769', '4821:0 4847:0 '),\n('4847', 'ic1115', '571', '210', '4508', '77', '80', '0', '7020.59', '1065.06', '402.857', '1.32832', '4846:0 4848:0 '),\n('4848', 'ic1116', '571', '210', '4508', '77', '80', '0', '6957.22', '1339.68', '398.602', '1.97863', '4847:0 4849:0 '),\n('4849', 'ic1117', '571', '210', '4508', '77', '80', '0', '6833.49', '1460.28', '390.712', '1.81761', '4848:0 4850:0 '),\n('4850', 'ic1118', '571', '210', '210', '77', '80', '0', '6826.51', '1619.37', '389.033', '4.69297', '4849:0 '),\n('4851', 'ic1119', '571', '210', '4507', '77', '80', '0', '6666.86', '830.852', '365.983', '2.48285', '4820:0 4852:0 '),\n('4852', 'ic1120', '571', '210', '4507', '77', '80', '0', '6599.05', '917.605', '308.63', '2.05873', '4851:0 4853:0 '),\n('4853', 'ic1121', '571', '210', '4507', '77', '80', '0', '6597.42', '1025.81', '280.105', '1.11625', '4852:0 4854:0 4858:0 '),\n('4854', 'ic1122', '571', '210', '4507', '77', '80', '0', '6559.27', '1194.84', '276.689', '2.19853', '4853:0 4855:0 '),\n('4855', 'ic1123', '571', '210', '4507', '77', '80', '0', '6688.4', '1234.6', '276.432', '6.14281', '4854:0 4856:0 '),\n('4856', 'ic1124', '571', '210', '4507', '77', '80', '0', '6863.13', '1227.79', '282.996', '5.66451', '4855:0 4857:0 4859:0 '),\n('4857', 'ic1125', '571', '210', '4507', '77', '80', '0', '6896.72', '1042.62', '305.673', '4.53274', '4856:0 4858:0 4859:0 '),\n('4858', 'ic1126', '571', '210', '4507', '77', '80', '0', '6726.14', '1037', '288.797', '3.31459', '4857:0 4853:0 '),\n('4859', 'ic1127', '571', '210', '4508', '77', '80', '0', '7001.55', '1212.52', '307.249', '0.331647', '4857:0 4856:0 4860:0 4861:0 '),\n('4860', 'ic1128', '571', '210', '4537', '77', '80', '0', '7135.37', '1189.66', '298.703', '5.1862', '4859:0 4869:0 '),\n('4861', 'ic1129', '571', '210', '4508', '77', '80', '0', '7048.99', '1354.24', '304.707', '4.93802', '4859:0 4862:0 '),\n('4862', 'ic1130', '571', '210', '4537', '77', '80', '0', '7186.05', '1411.54', '315.97', '0.428269', '4861:0 4863:0 4957:0 '),\n('4863', 'ic1131', '571', '210', '4537', '77', '80', '0', '7349.91', '1448.05', '320.323', '0.242915', '4862:0 4864:0 4957:0 '),\n('4864', 'ic1132', '571', '210', '4537', '77', '80', '0', '7474.88', '1490.17', '330.932', '0.611267', '4863:0 4865:0 '),\n('4865', 'ic1133', '571', '210', '4537', '77', '80', '0', '7573.73', '1609.11', '345.106', '1.19325', '4864:0 4866:0 4870:0 '),\n('4866', 'ic1134', '571', '210', '4537', '77', '80', '0', '7721.75', '1522.15', '349.093', '5.66688', '4865:0 4867:0 4874:0 '),\n('4867', 'ic1135', '571', '210', '4537', '77', '80', '0', '7720.3', '1336.02', '354.115', '4.43774', '4866:0 4868:0 4876:0 '),\n('4868', 'ic1136', '571', '210', '4537', '77', '80', '0', '7534.59', '1265.76', '334.056', '2.73578', '4867:0 4869:0 '),\n('4869', 'ic1137', '571', '210', '4537', '77', '80', '0', '7314', '1220.63', '315.76', '3.35624', '4868:0 4860:0 '),\n('4870', 'ic1138', '571', '210', '4509', '77', '80', '0', '7577.1', '1786.78', '359.583', '1.47521', '4865:0 4871:0 '),\n('4871', 'ic1139', '571', '210', '4509', '77', '80', '0', '7669.29', '1945.97', '367.174', '1.15084', '4870:0 4872:0 4881:0 '),\n('4872', 'ic1140', '571', '210', '4509', '77', '80', '0', '7873.9', '1929.78', '365.964', '6.20016', '4871:0 4873:0 4877:0 '),\n('4873', 'ic1141', '571', '210', '4509', '77', '80', '0', '7887.76', '1725.17', '368.82', '4.09059', '4872:0 4874:0 '),\n('4874', 'ic1142', '571', '210', '4509', '77', '80', '0', '7765', '1638.88', '350.579', '4.75974', '4873:0 4866:0 '),\n('4875', 'ic1143', '571', '210', '210', '77', '80', '0', '7920.44', '1374.41', '452.53', '1.61423', '4844:0 4876:0 '),\n('4876', 'ic1144', '571', '210', '4537', '77', '80', '0', '7822.59', '1365.97', '388.481', '3.40023', '4875:0 4867:0 '),\n('4877', 'ic1145', '571', '210', '4510', '77', '80', '0', '7809.24', '2060.92', '392.033', '1.58203', '4872:0 4878:0 '),\n('4878', 'ic1146', '571', '210', '4540', '77', '80', '0', '7858.11', '2248.57', '376.618', '1.4603', '4877:0 4879:0 '),\n('4879', 'ic1147', '571', '210', '4540', '77', '80', '0', '7823.2', '2412.9', '388.323', '1.80744', '4878:0 4880:0 '),\n('4880', 'ic1148', '571', '210', '4540', '77', '80', '0', '7793.72', '2597.47', '402.105', '1.67392', '4879:0 4892:0 '),\n('4881', 'ic1149', '571', '210', '4510', '77', '80', '0', '7699.75', '2069.29', '391.653', '1.65822', '4871:0 4882:0 '),\n('4882', 'ic1150', '571', '210', '4540', '77', '80', '0', '7652.21', '2249.08', '368.676', '2.35408', '4881:0 4883:0 '),\n('4883', 'ic1151', '571', '210', '4540', '77', '80', '0', '7521.07', '2342.93', '375.359', '2.52294', '4882:0 4884:0 '),\n('4884', 'ic1152', '571', '210', '4523', '77', '80', '0', '7369.4', '2442.13', '391.045', '2.44441', '4883:0 4885:0 4893:0 '),\n('4885', 'ic1153', '571', '210', '4523', '77', '80', '0', '7198.45', '2497.03', '404.398', '2.97341', '4884:0 4886:0 4893:0 '),\n('4886', 'ic1154', '571', '210', '4523', '77', '80', '0', '7035.47', '2497.06', '410.594', '3.37789', '4885:0 4887:0 '),\n('4887', 'ic1155', '571', '210', '4523', '77', '80', '0', '7014.72', '2665.38', '400.29', '1.87621', '4886:0 4888:0 '),\n('4888', 'ic1156', '571', '210', '4523', '77', '80', '0', '7013.48', '2866.37', '424.885', '1.59347', '4887:0 4889:0 '),\n('4889', 'ic1157', '571', '210', '4523', '77', '80', '0', '7165.04', '2990.37', '441.491', '6.14878', '4888:0 4890:0 '),\n('4890', 'ic1158', '571', '210', '4523', '77', '80', '0', '7332.14', '2917.95', '423.697', '5.78906', '4889:0 4891:0 4893:0 4894:0 '),\n('4891', 'ic1159', '571', '210', '4540', '77', '80', '0', '7502.18', '2817.76', '419.764', '5.68225', '4890:0 4892:0 4893:0 '),\n('4892', 'ic1160', '571', '210', '4516', '77', '80', '0', '7710.23', '2726.49', '412.219', '5.21495', '4891:0 4880:0 4963:0 '),\n('4893', 'ic1161', '571', '210', '4523', '77', '80', '0', '7307.93', '2711.18', '396.859', '4.63376', '4891:0 4884:0 4885:0 4890:0 '),\n('4894', 'ic1162', '571', '210', '210', '77', '80', '0', '7358.64', '3080.68', '476.932', '1.77884', '4890:0 4895:0 '),\n('4895', 'ic1163', '571', '210', '210', '77', '80', '0', '7199', '3207.31', '545.531', '1.97125', '4894:0 4896:0 '),\n('4896', 'ic1164', '571', '210', '210', '77', '80', '0', '7139.56', '3362.03', '669.633', '2.10878', '4895:0 4897:0 '),\n('4897', 'ic1165', '571', '210', '4531', '77', '80', '0', '6985.22', '3466.47', '708.57', '2.8337', '4896:0 4898:0 4928:0 '),\n('4898', 'ic1166', '571', '210', '4531', '77', '80', '0', '6890.27', '3530.05', '708.606', '5.39253', '4897:0 4899:0 '),\n('4899', 'ic1167', '571', '210', '4531', '77', '80', '0', '6830.55', '3590.9', '740.056', '5.22131', '4898:0 4900:0 '),\n('4900', 'ic1168', '571', '210', '4496', '77', '80', '0', '6868.76', '3731.57', '755.294', '4.54431', '4899:0 4901:0 '),\n('4901', 'ic1169', '571', '210', '4496', '77', '80', '0', '7002.18', '3880.5', '610.484', '1.63677', '4900:0 4902:0 4903:0 4905:0 '),\n('4902', 'ic1170', '571', '210', '4496', '77', '80', '0', '6831.56', '3987.86', '615.968', '2.45046', '4901:0 4903:0 '),\n('4903', 'ic1171', '571', '210', '4496', '77', '80', '0', '6897.56', '3919.65', '615.975', '4.57026', '4902:0 4901:0 4904:0 '),\n('4904', 'ic1172', '571', '210', '4528', '77', '80', '0', '6814.18', '3788.63', '621.07', '1.05954', '4903:0 '),\n('4905', 'ic1173', '571', '210', '4496', '77', '80', '0', '7138.52', '3955.81', '581.785', '5.65333', '4901:0 4906:0 4974:0 4976:0 '),\n('4906', 'ic1174', '571', '210', '4498', '77', '80', '0', '7284.9', '3836.51', '604.369', '5.59993', '4905:0 4907:0 '),\n('4907', 'ic1175', '571', '210', '4498', '77', '80', '0', '7410.57', '3732.09', '627.678', '5.65962', '4906:0 4908:0 '),\n('4908', 'ic1176', '571', '210', '4526', '77', '80', '0', '7512.15', '3660.34', '623.332', '6.01697', '4907:0 4909:0 4927:0 '),\n('4909', 'ic1177', '571', '210', '4526', '77', '80', '0', '7593.36', '3544.42', '655.937', '5.07214', '4908:0 4910:0 '),\n('4910', 'ic1178', '571', '210', '4526', '77', '80', '0', '7671', '3432.93', '656.192', '2.35151', '4909:0 4911:0 '),\n('4911', 'ic1179', '571', '210', '4526', '77', '80', '0', '7795.77', '3500.91', '658.351', '0.992774', '4910:0 4912:0 4913:0 4925:0 '),\n('4912', 'ic1180', '571', '210', '4526', '77', '80', '0', '7883.18', '3469.31', '671.838', '6.04917', '4911:0 '),\n('4913', 'ic1181', '571', '210', '4526', '77', '80', '0', '7919.33', '3582.64', '631.477', '0.58594', '4911:0 4914:0 '),\n('4914', 'ic1182', '571', '210', '4524', '77', '80', '0', '8041.43', '3526.53', '654.716', '6.08922', '4913:0 4915:0 4922:0 '),\n('4915', 'ic1183', '571', '210', '4524', '77', '80', '0', '8187.82', '3610.43', '658.019', '0.290628', '4914:0 4916:0 '),\n('4916', 'ic1184', '571', '210', '4524', '77', '80', '0', '8317.43', '3535.48', '657.912', '4.87265', '4915:0 4917:0 '),\n('4917', 'ic1185', '571', '210', '4524', '77', '80', '0', '8248.7', '3338.48', '654.291', '5.09882', '4916:0 4918:0 4922:0 '),\n('4918', 'ic1186', '571', '210', '4496', '77', '80', '0', '8311.26', '3170.17', '618.951', '5.16165', '4917:0 4919:0 '),\n('4919', 'ic1187', '571', '210', '4497', '77', '80', '0', '8430.96', '3102.38', '588.141', '4.91819', '4918:0 4920:0 '),\n('4920', 'ic1188', '571', '210', '4492', '77', '80', '0', '8426.9', '2947.18', '602.293', '4.77996', '4919:0 4921:0 '),\n('4921', 'ic1189', '571', '210', '4492', '77', '80', '0', '8429.04', '2879.47', '606.259', '1.76717', '4920:0 '),\n('4922', 'ic1190', '571', '210', '4524', '77', '80', '0', '8105.02', '3418.73', '672.247', '3.83984', '4914:0 4917:0 4923:0 '),\n('4923', 'ic1191', '571', '210', '4525', '77', '80', '0', '7990.63', '3300.15', '676.112', '3.81628', '4922:0 4924:0 '),\n('4924', 'ic1192', '571', '210', '4525', '77', '80', '0', '7944.78', '3251.88', '632.818', '3.79665', '4923:0 '),\n('4925', 'ic1193', '571', '210', '4526', '77', '80', '0', '7848.54', '3632.5', '653.393', '4.16107', '4911:0 4926:0 '),\n('4926', 'ic1194', '571', '210', '4526', '77', '80', '0', '7717.96', '3673.53', '653.297', '3.444', '4925:0 4927:0 '),\n('4927', 'ic1195', '571', '210', '4526', '77', '80', '0', '7617.43', '3670.12', '634.89', '3.02774', '4926:0 4908:0 '),\n('4928', 'ic1196', '571', '210', '4531', '77', '80', '0', '6853.09', '3478.09', '692.779', '3.04894', '4897:0 4929:0 4930:0 4931:0 '),\n('4929', 'ic1197', '571', '210', '4531', '77', '80', '0', '6714.63', '3539.45', '668.964', '2.71907', '4928:0 4931:0 '),\n('4930', 'ic1198', '571', '210', '4531', '77', '80', '0', '6719.14', '3429.9', '682.197', '3.43144', '4928:0 4931:0 4978:0 '),\n('4931', 'ic1199', '571', '210', '4531', '77', '80', '0', '6774.33', '3483.53', '672.159', '3.05053', '4928:0 4930:0 4929:0 4932:0 '),\n('4932', 'ic1200', '571', '210', '4531', '77', '80', '0', '6549.04', '3449.66', '598.005', '3.34505', '4931:0 4933:0 '),\n('4933', 'ic1201', '571', '210', '4531', '77', '80', '0', '6461.08', '3286.15', '631.506', '5.01716', '4932:0 4934:0 '),\n('4934', 'ic1202', '571', '210', '4531', '77', '80', '0', '6452.51', '3119.45', '657.481', '1.45066', '4933:0 4935:0 '),\n('4935', 'ic1203', '571', '210', '4518', '77', '80', '0', '6526.9', '3000.14', '651.117', '4.87342', '4934:0 4936:0 '),\n('4936', 'ic1204', '571', '210', '4518', '77', '80', '0', '6547.7', '2810.28', '651.117', '4.72026', '4935:0 4937:0 '),\n('4937', 'ic1205', '571', '210', '4518', '77', '80', '0', '6524.74', '2581.76', '651.117', '4.51292', '4936:0 4938:0 '),\n('4938', 'ic1206', '571', '210', '4518', '77', '80', '0', '6630.74', '2328.4', '651.585', '5.06506', '4937:0 4939:0 '),\n('4939', 'ic1207', '571', '210', '4518', '77', '80', '0', '6619.16', '2134.02', '651.118', '4.86635', '4938:0 4940:0 '),\n('4940', 'ic1208', '571', '210', '4520', '77', '80', '0', '6609.61', '1940.41', '652.242', '3.77073', '4939:0 4941:0 4944:0 '),\n('4941', 'ic1209', '571', '210', '4520', '77', '80', '0', '6436.2', '1960.49', '631.376', '3.19739', '4940:0 4942:0 '),\n('4942', 'ic1210', '571', '210', '4520', '77', '80', '0', '6238.67', '1930.65', '631.948', '3.56731', '4941:0 4943:0 '),\n('4943', 'ic1211', '571', '210', '4520', '77', '80', '0', '6075.08', '1919.83', '632.648', '3.19032', '4942:0 '),\n('4944', 'ic1212', '571', '210', '4520', '77', '80', '0', '6546.79', '1812.75', '629.551', '4.65274', '4940:0 4945:0 4946:0 '),\n('4945', 'ic1213', '571', '210', '4520', '77', '80', '0', '6556.05', '1624.57', '633.228', '4.76113', '4944:0 4946:0 '),\n('4946', 'ic1214', '571', '210', '4520', '77', '80', '0', '6590.03', '1684.23', '628.876', '3.70395', '4945:0 4944:0 4947:0 '),\n('4947', 'ic1215', '571', '210', '4513', '77', '80', '0', '6728.5', '1651.46', '572.96', '1.13099', '4946:0 4948:0 '),\n('4948', 'ic1216', '571', '210', '4513', '77', '80', '0', '6809.4', '1726.92', '556.264', '3.80763', '4947:0 4949:0 4950:0 '),\n('4949', 'ic1217', '571', '210', '4513', '77', '80', '0', '6812.51', '1821.36', '578.354', '4.77131', '4948:0 '),\n('4950', 'ic1218', '571', '210', '4513', '77', '80', '0', '6952.4', '1697.92', '518.536', '2.9209', '4948:0 4951:0 '),\n('4951', 'ic1219', '571', '210', '4513', '77', '80', '0', '7031.52', '1779.42', '506.019', '1.12469', '4950:0 4952:0 4954:0 '),\n('4952', 'ic1220', '571', '210', '4514', '77', '80', '0', '7025.43', '1902.07', '528.077', '5.0187', '4951:0 4953:0 '),\n('4953', 'ic1221', '571', '210', '4514', '77', '80', '0', '6960.52', '2014.43', '520.864', '4.66919', '4952:0 '),\n('4954', 'ic1222', '571', '210', '4513', '77', '80', '0', '7201.98', '1696.05', '469.261', '2.30668', '4951:0 4955:0 4958:0 4959:0 '),\n('4955', 'ic1223', '571', '210', '210', '77', '80', '0', '7348.32', '1642.76', '429.984', '1.78832', '4954:0 4956:0 '),\n('4956', 'ic1224', '571', '210', '210', '77', '80', '0', '7214.66', '1585.03', '379.979', '5.44591', '4955:0 4957:0 '),\n('4957', 'ic1225', '571', '210', '4537', '77', '80', '0', '7281.16', '1492.2', '326.379', '1.64772', '4956:0 4863:0 4862:0 4958:0 '),\n('4958', 'ic1226', '571', '210', '210', '77', '80', '0', '7331.27', '1765.54', '456.844', '3.80914', '4957:0 4954:0 '),\n('4959', 'ic1227', '571', '210', '4513', '77', '80', '0', '7136.03', '1876.5', '532.96', '4.77911', '4954:0 4960:0 '),\n('4960', 'ic1228', '571', '210', '4513', '77', '80', '0', '7224.2', '1973.83', '570.931', '1.27072', '4959:0 4961:0 4962:0 '),\n('4961', 'ic1229', '571', '210', '4513', '77', '80', '1', '7242.67', '2168.33', '565.646', '4.69493', '4960:0 '),\n('4962', 'ic1230', '571', '210', '4513', '77', '80', '0', '7100.09', '2122.12', '621.203', '4.3801', '4960:0 '),\n('4963', 'ic1231', '571', '210', '4540', '77', '80', '0', '7682.15', '2851.03', '469.055', '2.77003', '4892:0 4964:0 '),\n('4964', 'ic1232', '571', '210', '4517', '77', '80', '0', '7685.31', '3002.19', '541.332', '0.921987', '4963:0 4965:0 '),\n('4965', 'ic1233', '571', '210', '4517', '77', '80', '0', '7702.82', '3078.43', '557.351', '5.63045', '4964:0 4966:0 4973:0 '),\n('4966', 'ic1234', '571', '210', '4517', '77', '80', '0', '7843.82', '2935.68', '517.933', '0.541764', '4965:0 4967:0 '),\n('4967', 'ic1235', '571', '210', '4517', '77', '80', '0', '7934.47', '2994.97', '541.057', '3.56948', '4966:0 4968:0 '),\n('4968', 'ic1236', '571', '210', '4517', '77', '80', '0', '8021.28', '2971.58', '563.405', '2.3317', '4967:0 4969:0 '),\n('4969', 'ic1237', '571', '210', '4517', '77', '80', '0', '8106.95', '2852.61', '559.292', '5.73169', '4968:0 4970:0 4979:0 '),\n('4970', 'ic1238', '571', '210', '4477', '77', '80', '0', '8243', '2776.54', '640.775', '6.08434', '4969:0 4971:0 '),\n('4971', 'ic1239', '571', '210', '4477', '77', '80', '0', '8383.84', '2730.79', '655.094', '5.79375', '4970:0 4972:0 '),\n('4972', 'ic1240', '571', '210', '4477', '77', '80', '1', '8508.77', '2673.5', '652.354', '5.83302', '4971:0 '),\n('4973', 'ic1241', '571', '210', '4517', '77', '80', '0', '7575.23', '3170.11', '577.394', '5.58719', '4965:0 '),\n('4974', 'ic1242', '571', '210', '4496', '77', '80', '0', '6971.39', '3981.75', '552.612', '5.94612', '4905:0 4975:0 '),\n('4975', 'ic1243', '571', '210', '4496', '77', '80', '0', '6934.59', '4194.33', '535.202', '1.79686', '4974:0 '),\n('4976', 'ic1244', '571', '210', '4496', '77', '80', '0', '7162.84', '4153.53', '633.939', '2.91213', '4905:0 4977:0 '),\n('4977', 'ic1245', '571', '210', '4496', '77', '80', '0', '7019.95', '4225.08', '665.892', '2.06625', '4976:0 '),\n('4978', 'ic1246', '571', '210', '4531', '77', '80', '0', '6545.08', '3321.6', '665.004', '4.0596', '4930:0 '),\n('4979', 'ic1247', '571', '210', '210', '77', '80', '0', '8061.74', '2755.35', '542.008', '4.48453', '4969:0 4980:0 '),\n('4980', 'ic1248', '571', '210', '210', '77', '80', '0', '8077.07', '2597.13', '519.549', '4.54375', '4979:0 4981:0 '),\n('4981', 'ic1249', '571', '210', '4510', '77', '80', '0', '8103.98', '2410.6', '490.587', '4.97494', '4980:0 4982:0 '),\n('4982', 'ic1250', '571', '210', '4510', '77', '80', '0', '8060.18', '2339.25', '484.62', '3.25413', '4981:0 4983:0 '),\n('4983', 'ic1251', '571', '210', '4510', '77', '80', '0', '7982.84', '2214.78', '500.312', '4.5092', '4982:0 4984:0 4985:0 '),\n('4984', 'ic1252', '571', '210', '4510', '77', '80', '0', '8163.01', '2189.09', '499.737', '3.33032', '4983:0 '),\n('4985', 'ic1253', '571', '210', '4510', '77', '80', '0', '7986.6', '2067', '499.729', '3.00752', '4983:0 4986:0 4989:0 '),\n('4986', 'ic1254', '571', '210', '4510', '77', '80', '0', '8120.19', '1962.29', '501.671', '5.88521', '4985:0 4987:0 '),\n('4987', 'ic1255', '571', '210', '4510', '77', '80', '0', '8204.78', '1874.81', '514.771', '1.36602', '4986:0 4988:0 '),\n('4988', 'ic1256', '571', '210', '4510', '77', '80', '0', '8179.12', '2049.72', '550.596', '2.65329', '4987:0 '),\n('4989', 'ic1257', '571', '210', '4510', '77', '80', '0', '7751.59', '2060.95', '499.864', '3.22507', '4985:0 4990:0 '),\n('4990', 'ic1258', '571', '210', '4510', '77', '80', '0', '7549.16', '2067.17', '500.312', '3.28947', '4989:0 4991:0 4992:0 '),\n('4991', 'ic1259', '571', '210', '4510', '77', '80', '0', '7438.58', '2146.13', '500.312', '2.65644', '4990:0 '),\n('4992', 'ic1260', '571', '210', '4510', '77', '80', '0', '7492.17', '1991.36', '500.301', '0.996881', '4990:0 '),\n('4993', 'WarsongGulchSpawnA1', '489', '3277', '4571', '10', '80', '251', '1535.77', '1481.37', '352.109', '0.188495', '4996:0 5020:0 '),\n('4994', 'WarsongGulchAInside1', '489', '3277', '3321', '10', '80', '0', '1479.77', '1456.5', '362.546', '6.24394', '4995:0 5020:0 5000:0 '),\n('4995', 'WarsongGulchAInside2', '489', '3277', '4571', '10', '80', '32', '1530.85', '1468.31', '362.665', '3.14825', '4993:0 '),\n('4996', 'WarsongGulchAInside3', '489', '3277', '3321', '10', '80', '0', '1471.13', '1454.77', '342.795', '6.27608', '4997:0 5001:0 4993:0 '),\n('4997', 'WarsongGulchAInside4', '489', '3277', '3321', '10', '80', '36', '1522.96', '1457.18', '373.688', '1.69647', '4995:0 '),\n('4998', 'WarsongGulchAInside5', '489', '3277', '3321', '10', '80', '34', '1397.56', '1566.08', '343.126', '4.09978', '5018:0 '),\n('4999', 'WarsongGulchAInside6', '489', '3277', '3321', '10', '80', '34', '1422.41', '1527.05', '342.47', '3.08073', '5017:0 '),\n('5000', 'WarsongGulchAInside7', '489', '3277', '3321', '10', '80', '0', '1398.06', '1394.26', '337.292', '3.63638', '5012:0 4994:0 5011:0 5013:0 5014:0 5022:0 '),\n('5001', 'WarsongGulchAInside8', '489', '3277', '3321', '10', '80', '0', '1350.63', '1462.19', '323.48', '6.23998', '4996:0 5011:0 5012:0 5013:0 5014:0 5022:0 '),\n('5002', 'WarsongGulchSpawnH1', '489', '3277', '4572', '10', '80', '253', '919.418', '1434.62', '345.695', '3.13216', '5005:0 5019:0 '),\n('5003', 'WarsongGulchHInside1', '489', '3277', '3320', '10', '80', '0', '974.016', '1460.64', '356.184', '6.0456', '5004:0 5009:0 5019:0 '),\n('5004', 'WarsongGulchHInside2', '489', '3277', '4572', '10', '80', '32', '925.907', '1451.62', '355.856', '5.79629', '5002:0 '),\n('5005', 'WarsongGulchHInside3', '489', '3277', '3320', '10', '80', '0', '983.244', '1461.02', '336.019', '0.412332', '5006:0 5002:0 5010:0 '),\n('5006', 'WarsongGulchHInside4', '489', '3277', '3320', '10', '80', '34', '931.587', '1460.23', '367.604', '1.31163', '5004:0 '),\n('5007', 'WarsongGulchHInside5', '489', '3277', '3320', '10', '80', '36', '1071.48', '1375.61', '339.77', '5.94986', '5016:0 '),\n('5008', 'WarsongGulchHInside6', '489', '3277', '3320', '10', '80', '36', '1056.79', '1399.58', '338.281', '6.09319', '5015:0 '),\n('5009', 'WarsongGulchHInside7', '489', '3277', '3320', '10', '80', '0', '1047.02', '1538', '333.504', '0.447699', '5013:0 5003:0 5011:0 5012:0 5014:0 5023:0 '),\n('5010', 'WarsongGulchHInside8', '489', '3277', '3320', '10', '80', '0', '1124.69', '1463.21', '315.869', '3.32571', '5005:0 5011:0 5012:0 5013:0 5014:0 5023:0 '),\n('5011', 'WarsongGulchMid1', '489', '3277', '3277', '10', '80', '0', '1236.54', '1542.18', '306.233', '4.86553', '5001:0 5010:0 5023:0 5009:0 '),\n('5012', 'WarsongGulchMid2', '489', '3277', '3277', '10', '80', '0', '1226.74', '1479.78', '307.286', '3.2221', '5001:0 5022:0 5010:0 5023:0 5009:0 '),\n('5013', 'WarsongGulchMid3', '489', '3277', '3277', '10', '80', '0', '1263.56', '1400.5', '310.369', '3.07681', '5000:0 5001:0 5022:0 5010:0 5023:0 '),\n('5014', 'WarsongGulchMid4', '489', '3277', '3277', '10', '80', '0', '1225.87', '1335.88', '312.589', '0.771655', '5000:0 5001:0 5022:0 5010:0 '),\n('5015', 'WarsongGulchCliffH1', '489', '3277', '3320', '10', '80', '36', '1069.83', '1398.92', '324.032', '3.19735', '5010:0 5012:0 5013:0 5014:0 5024:0 '),\n('5016', 'WarsongGulchCliffH2', '489', '3277', '3320', '10', '80', '36', '1081.68', '1369.7', '321.199', '2.78226', '5010:0 5012:0 5013:0 5014:0 5024:0 '),\n('5017', 'WarsongGulchCliffA1', '489', '3277', '3321', '10', '80', '34', '1406.26', '1532.45', '324.559', '6.09621', '5001:0 5011:0 5012:0 5013:0 5021:0 '),\n('5018', 'WarsongGulchCliffA2', '489', '3277', '3321', '10', '80', '34', '1385.08', '1571.34', '321.478', '5.74278', '5001:0 5011:0 5012:0 5013:0 5021:0 '),\n('5019', 'WarsongGulchHInside9', '489', '3277', '3320', '10', '80', '0', '956.507', '1421.77', '345.527', '2.11349', '5007:0 5008:0 5002:0 5003:0 '),\n('5020', 'WarsongGulchAInside9', '489', '3277', '3321', '10', '80', '0', '1500.52', '1493.83', '352.198', '4.62677', '4998:0 4999:0 4993:0 4994:0 '),\n('5021', 'WarsongGulchBuffNW', '489', '3277', '3277', '10', '80', '2048', '1318.7', '1550.35', '313.235', '2.83923', '5011:0 5012:0 5013:0 '),\n('5022', 'WarsongGulchBuffNE', '489', '3277', '3277', '10', '80', '4096', '1320.61', '1380.27', '314.891', '4.10568', '5000:0 5001:0 5012:0 5013:0 5014:0 '),\n('5023', 'WarsongGulchBuffSW', '489', '3277', '3277', '10', '80', '16384', '1138.3', '1558.94', '306.906', '0.653861', '5010:0 5011:0 5012:0 5013:0 5009:0 '),\n('5024', 'WarsongGulchBuffSE', '489', '3277', '3277', '10', '80', '8192', '1111.58', '1352.73', '316.565', '2.66841', '5012:0 5013:0 5014:0 '),\n('5025', 'ArathiBasinSpawnA', '529', '3358', '3417', '20', '80', '3', '1289.51', '1286.41', '-14.466', '3.89804', '5026:0 '),\n('5026', 'ArathiBasinStartA', '529', '3358', '3358', '20', '80', '0', '1241.32', '1228.52', '-40.2271', '4.12149', '5040:0 5027:0 '),\n('5027', 'ArathiBasinStables', '529', '3358', '3424', '20', '80', '128', '1168.45', '1204.15', '-56.582', '6.24992', '5026:0 5028:0 '),\n('5028', 'ArathiBasinStablesBridge', '529', '3358', '3358', '20', '80', '0', '1088.6', '1223.56', '-53.4783', '0.143443', '5029:0 5027:0 5032:0 '),\n('5029', 'ArathiBasinMillLow1', '529', '3358', '3358', '20', '80', '0', '988.277', '1179.75', '-50.2717', '5.04236', '5028:0 5030:0 5045:0 '),\n('5030', 'ArathiBasinMillLow2', '529', '3358', '3358', '20', '80', '0', '890.451', '1109.94', '-56.335', '4.04097', '5029:0 5031:0 '),\n('5031', 'ArathiBasinMillLow3', '529', '3358', '3358', '20', '80', '0', '845.513', '978.663', '-60.2139', '0.977914', '5030:0 5037:0 5044:0 '),\n('5032', 'ArathiBasinMillUp1', '529', '3358', '3358', '20', '80', '0', '939.139', '1227.33', '-23.8137', '3.6404', '5028:0 5033:0 '),\n('5033', 'ArathiBasinMill', '529', '3358', '3422', '20', '80', '136', '852.619', '1151.8', '11.5342', '0.752077', '5034:0 5032:0 '),\n('5034', 'ArathiBasinMillUp2', '529', '3358', '3422', '20', '80', '0', '783.565', '1047.78', '-26.1072', '1.57478', '5033:0 5037:0 '),\n('5035', 'ArathiBasinSpawnH', '529', '3358', '3418', '20', '80', '5', '704.074', '704.457', '-16.4305', '0.79572', '5036:0 '),\n('5036', 'ArathiBasinStartH', '529', '3358', '3358', '20', '80', '0', '748.646', '759.099', '-41.5104', '0.818832', '5038:0 5037:0 '),\n('5037', 'ArathiBasinFarm', '529', '3358', '3420', '20', '80', '128', '809.5', '872.547', '-56.7509', '1.20759', '5034:0 5036:0 5031:0 '),\n('5038', 'ArathiBasinFarmBridge', '529', '3358', '3420', '20', '80', '0', '864.499', '771.902', '-51.7236', '0.695112', '5036:0 5039:0 '),\n('5039', 'ArathiBasinMineForkSE', '529', '3358', '3358', '20', '80', '0', '956.739', '804.522', '-61.6094', '0.524283', '5038:0 5041:0 5043:0 '),\n('5040', 'ArathiBasinMineForkNW', '529', '3358', '3358', '20', '80', '0', '1221.3', '1088.37', '-59.7666', '4.47091', '5041:0 5026:0 5042:0 '),\n('5041', 'ArathiBasinMine', '529', '3358', '3423', '20', '80', '136', '1151.72', '846.381', '-110.525', '2.55257', '5040:0 5039:0 '),\n('5042', 'ArathiBasinMineUp1', '529', '3358', '3358', '20', '80', '0', '1156.61', '991.63', '-63.6154', '2.3307', '5040:0 5043:0 5045:0 '),\n('5043', 'ArathiBasinMineUp2', '529', '3358', '3358', '20', '80', '0', '1040.93', '882.871', '-61.8051', '2.33458', '5039:0 5044:0 5042:0 '),\n('5044', 'ArathiBasinBlacksmithForkS', '529', '3358', '3421', '20', '80', '0', '922.673', '999.161', '-55.5623', '5.49188', '5031:0 5043:0 5046:0 5045:0 '),\n('5045', 'ArathiBasinBlacksmithForkN', '529', '3358', '3421', '20', '80', '0', '1050.68', '999.89', '-50.4064', '5.62341', '5029:0 5042:0 5044:0 5046:0 '),\n('5046', 'ArathiBasinBlacksmith', '529', '3358', '3421', '20', '80', '136', '979.258', '1043.34', '-44.3749', '0.106003', '5044:0 5045:0 '),\n('5047', 'AlteracValleySpawnA', '30', '2597', '2597', '50', '80', '3', '801.027', '-493.883', '99.6917', '3.08066', '5048:0 '),\n('5048', 'AlteracValleyStartA1', '30', '2597', '3299', '50', '80', '2', '717.929', '-475.351', '75.1276', '2.10478', '5049:0 5087:0 '),\n('5049', 'AlteracValleyStartA2', '30', '2597', '3299', '50', '80', '34', '664.972', '-400.377', '68.7491', '2.43269', '5050:0 5085:0 '),\n('5050', 'AlteracValleyStartA3', '30', '2597', '3299', '50', '80', '2', '610.827', '-388.879', '66.5562', '3.30843', '5051:0 '),\n('5051', 'AlteracValleyStartA4', '30', '2597', '2597', '50', '80', '2', '463.128', '-438.201', '33.0107', '2.75865', '5052:0 '),\n('5052', 'AlteracValleyHubA1', '30', '2597', '2597', '50', '80', '0', '401.785', '-393.695', '-1.05733', '2.60355', '5053:0 5092:0 '),\n('5053', 'AlteracValleyBunker2', '30', '2597', '3304', '50', '80', '0', '221.727', '-412.006', '41.1425', '2.14206', '5054:0 5055:0 5052:0 '),\n('5054', 'AlteracValleyBunker2Inside', '30', '2597', '3304', '50', '80', '146', '204.453', '-359.47', '56.3831', '2.20687', '5053:0 '),\n('5055', 'AlteracValleyGYA1', '30', '2597', '3302', '50', '80', '128', '76.8322', '-399.172', '45.7006', '1.69996', '5053:0 5056:0 5057:0 5058:0 '),\n('5056', 'AlteracValleyBelinda', '30', '2597', '2958', '50', '80', '0', '-36.1268', '-290.741', '15.0786', '3.0354', '5055:0 '),\n('5057', 'AlteracValleyCN', '30', '2597', '2597', '50', '80', '0', '-133.7', '-368.866', '8.47712', '6.00431', '5055:0 5060:0 5095:0 '),\n('5058', 'AlteracValleyBunker1Inside', '30', '2597', '3305', '50', '80', '146', '-151.384', '-442.049', '40.3942', '1.08956', '5055:0 '),\n('5059', 'AlteracValleyGYC', '30', '2597', '3301', '50', '80', '128', '-200.494', '-109.396', '78.5207', '4.95373', '5095:0 5094:0 '),\n('5060', 'AlteracValleyCS1', '30', '2597', '3057', '50', '80', '0', '-262.759', '-292.49', '6.80088', '5.73925', '5057:0 5061:0 '),\n('5061', 'AlteracValleyCS2', '30', '2597', '3057', '50', '80', '0', '-473.131', '-273.873', '24.7318', '3.74628', '5060:0 5062:0 5094:0 '),\n('5062', 'AlteracValleyCS3', '30', '2597', '2597', '50', '80', '32', '-525.235', '-353.849', '37.0353', '4.37461', '5063:0 5061:0 '),\n('5063', 'AlteracValleyCS4', '30', '2597', '2597', '50', '80', '0', '-601.467', '-320.914', '51.7167', '6.08664', '5062:0 5064:0 '),\n('5064', 'AlteracValleyGYH1', '30', '2597', '2597', '50', '80', '128', '-615.967', '-397.593', '60.6924', '0.333583', '5063:0 5065:0 5066:0 5067:0 '),\n('5065', 'AlteracValleyTower1Inside', '30', '2597', '2977', '50', '80', '148', '-569.205', '-264.746', '75.0088', '2.58769', '5064:0 '),\n('5066', 'AlteracValleyGalvangar', '30', '2597', '2977', '50', '80', '0', '-536.858', '-168.875', '57.0098', '2.75262', '5064:0 '),\n('5067', 'AlteracValleyTower2', '30', '2597', '2962', '50', '80', '0', '-715.985', '-350.671', '66.8321', '2.63482', '5064:0 5068:0 5069:0 '),\n('5068', 'AlteracValleyTower2Inside', '30', '2597', '2962', '50', '80', '148', '-767.615', '-361.296', '90.8949', '4.27041', '5067:0 '),\n('5069', 'AlteracValleyGYH2', '30', '2597', '2597', '50', '80', '128', '-1083.95', '-341.705', '55.3047', '0.111719', '5067:0 5072:0 5090:0 '),\n('5070', 'AlteracValleyStartH1', '30', '2597', '2597', '50', '80', '4', '-1144.38', '-442.064', '56.7427', '0.904973', '5069:0 '),\n('5071', 'AlteracValleySpawnH', '30', '2597', '2597', '50', '80', '5', '-1386.53', '-549.064', '55.0284', '0.628112', '5070:0 '),\n('5072', 'AlteracValleyBaseH1', '30', '2597', '2961', '50', '80', '0', '-1241.61', '-363.466', '59.6773', '2.10074', '5069:0 5073:0 '),\n('5073', 'AlteracValleyBaseH2', '30', '2597', '2961', '50', '80', '0', '-1210.4', '-252.908', '72.7007', '3.07856', '5072:0 5074:0 '),\n('5074', 'AlteracValleyBaseH3', '30', '2597', '2978', '50', '80', '0', '-1286.08', '-289.551', '89.091', '3.10996', '5073:0 5075:0 '),\n('5075', 'AlteracValleyGYH3', '30', '2597', '2978', '50', '80', '128', '-1404.13', '-312.526', '89.4075', '1.4783', '5074:0 5076:0 5077:0 5078:0 '),\n('5076', 'AlteracValleyTower3Inside', '30', '2597', '2978', '50', '80', '148', '-1301.34', '-267.703', '114.151', '0.219693', '5075:0 '),\n('5077', 'AlteracValleyTower4Inside', '30', '2597', '2978', '50', '80', '148', '-1304.35', '-313.854', '113.867', '5.07738', '5075:0 '),\n('5078', 'AlteracValleyDrekthar', '30', '2597', '4407', '50', '80', '276', '-1367.71', '-227.007', '98.4255', '2.09366', '5075:0 '),\n('5079', 'AlteracValleyGYA2', '30', '2597', '3303', '50', '80', '128', '664.375', '-295.432', '30.2906', '1.6334', '5080:0 5088:0 5092:0 '),\n('5080', 'AlteracValleyBaseA1', '30', '2597', '2959', '50', '80', '0', '628.165', '-209.132', '39.032', '1.71587', '5081:0 5079:0 '),\n('5081', 'AlteracValleyGYA3', '30', '2597', '2959', '50', '80', '128', '635.165', '-28.286', '46.6157', '4.25874', '5080:0 5082:0 5083:0 5084:0 '),\n('5082', 'AlteracValleyBunker3Inside', '30', '2597', '2959', '50', '80', '146', '672.521', '-142.475', '63.6551', '4.09365', '5081:0 '),\n('5083', 'AlteracValleyBunker4Inside', '30', '2597', '2959', '50', '80', '146', '555.611', '-77.7777', '51.9336', '1.81992', '5081:0 '),\n('5084', 'AlteracValleyVanndar', '30', '2597', '4408', '50', '80', '274', '712.208', '-13.5129', '50.1354', '0.288398', '5081:0 '),\n('5085', 'AlteracValleyShortcutA1', '30', '2597', '3303', '50', '80', '34', '668.321', '-376.13', '30.4499', '1.65697', '5079:0 '),\n('5086', 'AlteracValleyShortcutH1', '30', '2597', '2597', '50', '80', '36', '-550.621', '-356.862', '50.2404', '5.33475', '5062:0 '),\n('5087', 'AlteracValleyMineA1', '30', '2597', '2957', '50', '80', '34', '774.881', '-363.728', '78.8805', '1.75712', '5088:0 '),\n('5088', 'AlteracValleyMineA2', '30', '2597', '2957', '50', '80', '32', '776.68', '-313.432', '54.4907', '0.0135369', '5089:0 5079:0 '),\n('5089', 'AlteracValleyMineA3', '30', '2597', '2957', '50', '80', '512', '870.508', '-436.928', '51.1438', '5.59377', '5088:0 '),\n('5090', 'AlteracValleyMineH1', '30', '2597', '2963', '50', '80', '0', '-964.106', '-216.1', '69.4372', '0.822477', '5069:0 5091:0 '),\n('5091', 'AlteracValleyMineH2', '30', '2597', '2963', '50', '80', '512', '-857.468', '-102.82', '65.0282', '0.681106', '5090:0 '),\n('5092', 'AlteracValleyAuxA1', '30', '2597', '2597', '50', '80', '0', '517.454', '-327.563', '-1.03301', '0.235552', '5052:0 5079:0 '),\n('5093', 'AlteracValleyIcebloodGY', '30', '2597', '3300', '50', '80', '0', '-531.167', '-405.06', '49.5441', '2.83719', '5064:0 5086:0 '),\n('5094', 'AlteracValleyGYCS', '30', '2597', '3057', '50', '80', '0', '-296.163', '-118.723', '18.4795', '0.58704', '5059:0 5061:0 '),\n('5095', 'AlteracValleyGYCN', '30', '2597', '2597', '50', '80', '0', '-154.952', '-231.949', '10.0454', '1.75925', '5057:0 5059:0 ');\n"
  },
  {
    "path": "SQL/updates/world/2024_11_01_creature_template_wander_nodes.sql",
    "content": "--\nDELETE FROM `creature_template_npcbot_wander_nodes` WHERE `id` BETWEEN 5025 AND 5106;\nINSERT INTO `creature_template_npcbot_wander_nodes` (`id`,`name`,`mapid`,`zoneid`,`areaid`,`minlevel`,`maxlevel`,`flags`,`x`,`y`,`z`,`o`,`links`) VALUES\n('5025', 'ArathiBasinSpawnA', '529', '3358', '3417', '20', '80', '19', '1289.51', '1286.41', '-14.466', '3.89804', '5026:0 '),\n('5026', 'ArathiBasinStartA', '529', '3358', '3358', '20', '80', '0', '1241.32', '1228.52', '-40.2271', '4.12149', '5025:0 5027:0 5028:0 5040:0 '),\n('5027', 'ArathiBasinStables', '529', '3358', '3424', '20', '80', '128', '1168.45', '1204.15', '-56.582', '6.24992', '5028:0 5040:0 5054:0 5026:0 '),\n('5028', 'ArathiBasinStablesBridge', '529', '3358', '3358', '20', '80', '0', '1088.6', '1223.56', '-53.4783', '0.143443', '5029:0 5032:0 5027:0 5026:0 '),\n('5029', 'ArathiBasinMillLow1', '529', '3358', '3358', '20', '80', '0', '988.277', '1179.75', '-50.2717', '5.04236', '5028:0 5030:0 5045:0 5032:0 '),\n('5030', 'ArathiBasinMillLow2', '529', '3358', '3358', '20', '80', '0', '894.665', '1107.2', '-57.5224', '0.784845', '5029:0 5031:0 '),\n('5031', 'ArathiBasinMillLow3', '529', '3358', '3358', '20', '80', '0', '827.933', '976.767', '-54.503', '0.786809', '5030:0 5034:0 5037:0 5044:0 '),\n('5032', 'ArathiBasinMillUp1', '529', '3358', '3358', '20', '80', '0', '945.567', '1228.54', '-27.3493', '5.38137', '5028:0 5029:0 5056:0 '),\n('5033', 'ArathiBasinMill', '529', '3358', '3422', '20', '80', '128', '859.442', '1146.07', '11.648', '2.38114', '5057:0 5056:0 5053:0 '),\n('5034', 'ArathiBasinMillUp2', '529', '3358', '3422', '20', '80', '0', '782.036', '1026.34', '-36.027', '5.5934', '5037:0 5031:0 5057:0 '),\n('5035', 'ArathiBasinSpawnH', '529', '3358', '3418', '20', '80', '21', '704.074', '704.457', '-16.4305', '0.79572', '5036:0 '),\n('5036', 'ArathiBasinStartH', '529', '3358', '3358', '20', '80', '0', '758.421', '762.987', '-43.2233', '0.712183', '5037:0 5035:0 5038:0 '),\n('5037', 'ArathiBasinFarm', '529', '3358', '3420', '20', '80', '128', '809.518', '872.639', '-56.7354', '0.10154', '5034:0 5036:0 5038:0 5052:0 5039:0 5031:0 '),\n('5038', 'ArathiBasinFarmBridge', '529', '3358', '3420', '20', '80', '0', '864.632', '772.771', '-51.793', '3.98729', '5036:0 5037:0 5039:0 '),\n('5039', 'ArathiBasinMineForkSE', '529', '3358', '3358', '20', '80', '0', '956.739', '804.522', '-61.6094', '0.524283', '5037:0 5038:0 5043:0 5050:0 '),\n('5040', 'ArathiBasinMineForkNW', '529', '3358', '3358', '20', '80', '0', '1221.3', '1088.37', '-59.7666', '4.47091', '5042:0 5027:0 5048:0 5026:0 '),\n('5041', 'ArathiBasinMine', '529', '3358', '3423', '20', '80', '128', '1151.72', '846.381', '-110.525', '2.55257', '5051:0 5048:0 5050:0 '),\n('5042', 'ArathiBasinMineUp1', '529', '3358', '3358', '20', '80', '0', '1147.72', '998.593', '-63.7325', '3.58672', '5040:0 5043:0 5045:0 5047:0 '),\n('5043', 'ArathiBasinMineUp2', '529', '3358', '3358', '20', '80', '0', '1040.93', '882.871', '-61.8051', '2.33458', '5044:0 5042:0 5049:0 5039:0 '),\n('5044', 'ArathiBasinBlacksmithForkS', '529', '3358', '3421', '20', '80', '0', '947.881', '1005.66', '-48.5412', '3.2392', '5043:0 5046:0 5045:0 5031:0 '),\n('5045', 'ArathiBasinBlacksmithForkN', '529', '3358', '3421', '20', '80', '0', '1025.4', '999.605', '-46.1926', '2.74243', '5029:0 5042:0 5044:0 5046:0 '),\n('5046', 'ArathiBasinBlacksmith', '529', '3358', '3421', '20', '80', '128', '979.258', '1043.34', '-44.3749', '0.106003', '5044:0 5045:0 5055:0 '),\n('5047', 'ArathiBasinMineCliff1', '529', '3358', '3358', '20', '80', '65544', '1164', '966.548', '-66.2884', '2.12191', '5048:0 5042:0 '),\n('5048', 'ArathiBasinMineDrop1', '529', '3358', '3358', '20', '80', '131072', '1180.76', '949.456', '-97.1403', '2.75853', '5040:0 5041:0 5050:0 '),\n('5049', 'ArathiBasinMineCliff2', '529', '3358', '3358', '20', '80', '65544', '1075.94', '851.303', '-65.9095', '2.44001', '5050:0 5043:0 '),\n('5050', 'ArathiBasinMineDrop2', '529', '3358', '3358', '20', '80', '131072', '1089.48', '842.85', '-102.208', '2.56371', '5039:0 5041:0 5048:0 '),\n('5051', 'ArathiBasinMineBuff', '529', '3358', '3423', '20', '80', '16392', '1148.7', '816.306', '-98.4955', '1.60396', '5041:0 '),\n('5052', 'ArathiBasinFarmBuff', '529', '3358', '3420', '20', '80', '4104', '815.759', '842.924', '-56.5402', '5.98651', '5037:0 '),\n('5053', 'ArathiBasinMillBuff', '529', '3358', '3422', '20', '80', '8200', '810.493', '1184', '11.9217', '5.57811', '5033:0 '),\n('5054', 'ArathiBasinStablesBuff', '529', '3358', '3424', '20', '80', '2056', '1184.4', '1185.75', '-56.3632', '5.47167', '5027:0 '),\n('5055', 'ArathiBasinBlacksmithBuff', '529', '3358', '3421', '20', '80', '32776', '989.914', '1008.62', '-42.6033', '2.21464', '5046:0 '),\n('5056', 'ArathiBasinMillUp3', '529', '3358', '3422', '20', '80', '0', '874.487', '1198.33', '8.83505', '3.90873', '5032:0 5033:0 5057:0 '),\n('5057', 'ArathiBasinMillUp4', '529', '3358', '3422', '20', '80', '0', '797.429', '1127.41', '9.63979', '0.623809', '5033:0 5034:0 5056:0 '),\n('5058', 'AlteracValleySpawnA', '30', '2597', '2597', '50', '80', '3', '801.027', '-493.883', '99.6917', '3.08066', '5059:0 '),\n('5059', 'AlteracValleyStartA1', '30', '2597', '3299', '50', '80', '2', '717.929', '-475.351', '75.1276', '2.10478', '5060:0 5098:0 '),\n('5060', 'AlteracValleyStartA2', '30', '2597', '3299', '50', '80', '34', '664.972', '-400.377', '68.7491', '2.43269', '5061:0 5096:0 '),\n('5061', 'AlteracValleyStartA3', '30', '2597', '3299', '50', '80', '2', '610.827', '-388.879', '66.5562', '3.30843', '5062:0 '),\n('5062', 'AlteracValleyStartA4', '30', '2597', '2597', '50', '80', '2', '463.128', '-438.201', '33.0107', '2.75865', '5063:0 '),\n('5063', 'AlteracValleyHubA1', '30', '2597', '2597', '50', '80', '0', '401.785', '-393.695', '-1.05733', '2.60355', '5064:0 5103:0 '),\n('5064', 'AlteracValleyBunker2', '30', '2597', '3304', '50', '80', '0', '221.727', '-412.006', '41.1425', '2.14206', '5065:0 5066:0 5063:0 '),\n('5065', 'AlteracValleyBunker2Inside', '30', '2597', '3304', '50', '80', '146', '204.453', '-359.47', '56.3831', '2.20687', '5064:0 '),\n('5066', 'AlteracValleyGYA1', '30', '2597', '3302', '50', '80', '128', '76.8322', '-399.172', '45.7006', '1.69996', '5064:0 5067:0 5068:0 5069:0 '),\n('5067', 'AlteracValleyBelinda', '30', '2597', '2958', '50', '80', '0', '-36.1268', '-290.741', '15.0786', '3.0354', '5066:0 '),\n('5068', 'AlteracValleyCN', '30', '2597', '2597', '50', '80', '0', '-133.7', '-368.866', '8.47712', '6.00431', '5066:0 5071:0 5106:0 '),\n('5069', 'AlteracValleyBunker1Inside', '30', '2597', '3305', '50', '80', '146', '-151.384', '-442.049', '40.3942', '1.08956', '5066:0 '),\n('5070', 'AlteracValleyGYC', '30', '2597', '3301', '50', '80', '128', '-200.494', '-109.396', '78.5207', '4.95373', '5106:0 5105:0 '),\n('5071', 'AlteracValleyCS1', '30', '2597', '3057', '50', '80', '0', '-262.759', '-292.49', '6.80088', '5.73925', '5068:0 5072:0 '),\n('5072', 'AlteracValleyCS2', '30', '2597', '3057', '50', '80', '0', '-473.131', '-273.873', '24.7318', '3.74628', '5071:0 5073:0 5105:0 '),\n('5073', 'AlteracValleyCS3', '30', '2597', '2597', '50', '80', '32', '-525.235', '-353.849', '37.0353', '4.37461', '5074:0 5072:0 '),\n('5074', 'AlteracValleyCS4', '30', '2597', '2597', '50', '80', '0', '-601.467', '-320.914', '51.7167', '6.08664', '5073:0 5075:0 '),\n('5075', 'AlteracValleyGYH1', '30', '2597', '2597', '50', '80', '128', '-615.967', '-397.593', '60.6924', '0.333583', '5074:0 5076:0 5077:0 5078:0 '),\n('5076', 'AlteracValleyTower1Inside', '30', '2597', '2977', '50', '80', '148', '-569.205', '-264.746', '75.0088', '2.58769', '5075:0 '),\n('5077', 'AlteracValleyGalvangar', '30', '2597', '2977', '50', '80', '0', '-536.858', '-168.875', '57.0098', '2.75262', '5075:0 '),\n('5078', 'AlteracValleyTower2', '30', '2597', '2962', '50', '80', '0', '-715.985', '-350.671', '66.8321', '2.63482', '5075:0 5079:0 5080:0 '),\n('5079', 'AlteracValleyTower2Inside', '30', '2597', '2962', '50', '80', '148', '-767.615', '-361.296', '90.8949', '4.27041', '5078:0 '),\n('5080', 'AlteracValleyGYH2', '30', '2597', '2597', '50', '80', '128', '-1083.95', '-341.705', '55.3047', '0.111719', '5078:0 5083:0 5101:0 '),\n('5081', 'AlteracValleyStartH1', '30', '2597', '2597', '50', '80', '4', '-1144.38', '-442.064', '56.7427', '0.904973', '5080:0 '),\n('5082', 'AlteracValleySpawnH', '30', '2597', '2597', '50', '80', '5', '-1386.53', '-549.064', '55.0284', '0.628112', '5081:0 '),\n('5083', 'AlteracValleyBaseH1', '30', '2597', '2961', '50', '80', '0', '-1241.61', '-363.466', '59.6773', '2.10074', '5080:0 5084:0 '),\n('5084', 'AlteracValleyBaseH2', '30', '2597', '2961', '50', '80', '0', '-1210.4', '-252.908', '72.7007', '3.07856', '5083:0 5085:0 '),\n('5085', 'AlteracValleyBaseH3', '30', '2597', '2978', '50', '80', '0', '-1286.08', '-289.551', '89.091', '3.10996', '5084:0 5086:0 '),\n('5086', 'AlteracValleyGYH3', '30', '2597', '2978', '50', '80', '128', '-1404.13', '-312.526', '89.4075', '1.4783', '5085:0 5087:0 5088:0 5089:0 '),\n('5087', 'AlteracValleyTower3Inside', '30', '2597', '2978', '50', '80', '148', '-1301.34', '-267.703', '114.151', '0.219693', '5086:0 '),\n('5088', 'AlteracValleyTower4Inside', '30', '2597', '2978', '50', '80', '148', '-1304.35', '-313.854', '113.867', '5.07738', '5086:0 '),\n('5089', 'AlteracValleyDrekthar', '30', '2597', '4407', '50', '80', '276', '-1367.71', '-227.007', '98.4255', '2.09366', '5086:0 '),\n('5090', 'AlteracValleyGYA2', '30', '2597', '3303', '50', '80', '128', '664.375', '-295.432', '30.2906', '1.6334', '5091:0 5099:0 5103:0 '),\n('5091', 'AlteracValleyBaseA1', '30', '2597', '2959', '50', '80', '0', '628.165', '-209.132', '39.032', '1.71587', '5092:0 5090:0 '),\n('5092', 'AlteracValleyGYA3', '30', '2597', '2959', '50', '80', '128', '635.165', '-28.286', '46.6157', '4.25874', '5091:0 5093:0 5094:0 5095:0 '),\n('5093', 'AlteracValleyBunker3Inside', '30', '2597', '2959', '50', '80', '146', '672.521', '-142.475', '63.6551', '4.09365', '5092:0 '),\n('5094', 'AlteracValleyBunker4Inside', '30', '2597', '2959', '50', '80', '146', '555.611', '-77.7777', '51.9336', '1.81992', '5092:0 '),\n('5095', 'AlteracValleyVanndar', '30', '2597', '4408', '50', '80', '274', '712.208', '-13.5129', '50.1354', '0.288398', '5092:0 '),\n('5096', 'AlteracValleyShortcutA1', '30', '2597', '3303', '50', '80', '34', '668.321', '-376.13', '30.4499', '1.65697', '5090:0 '),\n('5097', 'AlteracValleyShortcutH1', '30', '2597', '2597', '50', '80', '36', '-550.621', '-356.862', '50.2404', '5.33475', '5073:0 '),\n('5098', 'AlteracValleyMineA1', '30', '2597', '2957', '50', '80', '34', '774.881', '-363.728', '78.8805', '1.75712', '5099:0 '),\n('5099', 'AlteracValleyMineA2', '30', '2597', '2957', '50', '80', '32', '776.68', '-313.432', '54.4907', '0.0135369', '5100:0 5090:0 '),\n('5100', 'AlteracValleyMineA3', '30', '2597', '2957', '50', '80', '512', '870.508', '-436.928', '51.1438', '5.59377', '5099:0 '),\n('5101', 'AlteracValleyMineH1', '30', '2597', '2963', '50', '80', '0', '-964.106', '-216.1', '69.4372', '0.822477', '5080:0 5102:0 '),\n('5102', 'AlteracValleyMineH2', '30', '2597', '2963', '50', '80', '512', '-857.468', '-102.82', '65.0282', '0.681106', '5101:0 '),\n('5103', 'AlteracValleyAuxA1', '30', '2597', '2597', '50', '80', '0', '517.454', '-327.563', '-1.03301', '0.235552', '5063:0 5090:0 '),\n('5104', 'AlteracValleyIcebloodGY', '30', '2597', '3300', '50', '80', '0', '-531.167', '-405.06', '49.5441', '2.83719', '5075:0 5097:0 '),\n('5105', 'AlteracValleyGYCS', '30', '2597', '3057', '50', '80', '0', '-296.163', '-118.723', '18.4795', '0.58704', '5070:0 5072:0 '),\n('5106', 'AlteracValleyGYCN', '30', '2597', '2597', '50', '80', '0', '-154.952', '-231.949', '10.0454', '1.75925', '5068:0 5070:0 ');\n"
  },
  {
    "path": "SQL/updates/world/2024_11_04_creature_template_wander_nodes.sql",
    "content": "--\nDELETE FROM `creature_template_npcbot_wander_nodes` WHERE `id` BETWEEN 5058 AND 5110;\nINSERT INTO `creature_template_npcbot_wander_nodes` (`id`,`name`,`mapid`,`zoneid`,`areaid`,`minlevel`,`maxlevel`,`flags`,`x`,`y`,`z`,`o`,`links`) VALUES\n('5058', 'AlteracValleySpawnA', '30', '2597', '2597', '50', '80', '3', '801.027', '-493.883', '99.6917', '3.08066', '5059:0 '),\n('5059', 'AlteracValleyStartA1', '30', '2597', '3299', '50', '80', '2', '717.929', '-475.351', '75.1276', '2.10478', '5060:0 5098:0 '),\n('5060', 'AlteracValleyStartA2', '30', '2597', '3299', '50', '80', '65538', '664.972', '-400.377', '68.7491', '2.43269', '5061:0 5098:0 '),\n('5061', 'AlteracValleyStartA3', '30', '2597', '3299', '50', '80', '10', '610.827', '-388.879', '66.5562', '3.30843', '5062:0 5060:0 '),\n('5062', 'AlteracValleyStartA4', '30', '2597', '2597', '50', '80', '10', '463.128', '-438.201', '33.0107', '2.75865', '5063:0 '),\n('5063', 'AlteracValleyHubA1', '30', '2597', '2597', '50', '80', '8', '401.785', '-393.695', '-1.05733', '2.60355', '5064:0 5103:0 '),\n('5064', 'AlteracValleyBunker2', '30', '2597', '3304', '50', '80', '8', '221.727', '-412.006', '41.1425', '2.14206', '5065:0 5066:0 5063:0 '),\n('5065', 'AlteracValleyBunker2Inside', '30', '2597', '3304', '50', '80', '146', '204.453', '-359.47', '56.3831', '2.20687', '5064:0 '),\n('5066', 'AlteracValleyGYA1', '30', '2597', '3302', '50', '80', '136', '76.8322', '-399.172', '45.7006', '1.69996', '5064:0 5067:0 5068:0 5069:0 5109:0 '),\n('5067', 'AlteracValleyBelinda', '30', '2597', '2958', '50', '80', '1042', '-36.1268', '-290.741', '15.0786', '3.0354', '5066:0 '),\n('5068', 'AlteracValleyCN', '30', '2597', '2597', '50', '80', '8', '-63.4528', '-374.738', '13.4643', '2.01653', '5066:0 5071:0 5106:0 5107:0 '),\n('5069', 'AlteracValleyBunker1Inside', '30', '2597', '3305', '50', '80', '146', '-151.384', '-442.049', '40.3942', '1.08956', '5066:0 '),\n('5070', 'AlteracValleyGYC', '30', '2597', '3301', '50', '80', '136', '-200.494', '-109.396', '78.5207', '4.95373', '5106:0 5105:0 '),\n('5071', 'AlteracValleyCS1', '30', '2597', '3057', '50', '80', '8', '-255.035', '-296.856', '6.68142', '5.07206', '5068:0 5072:0 '),\n('5072', 'AlteracValleyCS2', '30', '2597', '3057', '50', '80', '8', '-473.131', '-273.873', '24.7318', '3.74628', '5071:0 5105:0 5107:0 5108:0 5073:0 '),\n('5073', 'AlteracValleyCS3', '30', '2597', '2597', '50', '80', '32', '-525.235', '-353.849', '37.0353', '4.37461', '5072:0 5074:0 5110:0 '),\n('5074', 'AlteracValleyCS4', '30', '2597', '2597', '50', '80', '8', '-601.467', '-320.914', '51.7167', '6.08664', '5075:0 5073:0 '),\n('5075', 'AlteracValleyGYH1', '30', '2597', '2597', '50', '80', '136', '-615.967', '-397.593', '60.6924', '0.333583', '5074:0 5076:0 5077:0 5078:0 '),\n('5076', 'AlteracValleyTower1Inside', '30', '2597', '2977', '50', '80', '148', '-569.205', '-264.746', '75.0088', '2.58769', '5075:0 '),\n('5077', 'AlteracValleyGalvangar', '30', '2597', '2977', '50', '80', '1044', '-536.858', '-168.875', '57.0098', '2.75262', '5075:0 '),\n('5078', 'AlteracValleyTower2', '30', '2597', '2962', '50', '80', '8', '-715.985', '-350.671', '66.8321', '2.63482', '5075:0 5079:0 5080:0 '),\n('5079', 'AlteracValleyTower2Inside', '30', '2597', '2962', '50', '80', '148', '-767.615', '-361.296', '90.8949', '4.27041', '5078:0 '),\n('5080', 'AlteracValleyGYH2', '30', '2597', '2597', '50', '80', '136', '-1083.95', '-341.705', '55.3047', '0.111719', '5078:0 5083:0 5101:0 '),\n('5081', 'AlteracValleyStartH1', '30', '2597', '2597', '50', '80', '4', '-1144.38', '-442.064', '56.7427', '0.904973', '5080:0 '),\n('5082', 'AlteracValleySpawnH', '30', '2597', '2597', '50', '80', '5', '-1386.53', '-549.064', '55.0284', '0.628112', '5081:0 '),\n('5083', 'AlteracValleyBaseH1', '30', '2597', '2961', '50', '80', '8', '-1241.61', '-363.466', '59.6773', '2.10074', '5080:0 5084:0 '),\n('5084', 'AlteracValleyBaseH2', '30', '2597', '2961', '50', '80', '8', '-1210.4', '-252.908', '72.7007', '3.07856', '5083:0 5085:0 '),\n('5085', 'AlteracValleyBaseH3', '30', '2597', '2978', '50', '80', '8', '-1286.08', '-289.551', '89.091', '3.10996', '5084:0 5086:0 '),\n('5086', 'AlteracValleyGYH3', '30', '2597', '2978', '50', '80', '136', '-1404.13', '-312.526', '89.4075', '1.4783', '5085:0 5087:0 5088:0 5089:0 '),\n('5087', 'AlteracValleyTower3Inside', '30', '2597', '2978', '50', '80', '148', '-1301.34', '-267.703', '114.151', '0.219693', '5086:0 '),\n('5088', 'AlteracValleyTower4Inside', '30', '2597', '2978', '50', '80', '148', '-1304.35', '-313.854', '113.867', '5.07738', '5086:0 '),\n('5089', 'AlteracValleyDrekthar', '30', '2597', '4407', '50', '80', '276', '-1367.71', '-227.007', '98.4255', '2.09366', '5086:0 '),\n('5090', 'AlteracValleyGYA2', '30', '2597', '3303', '50', '80', '136', '664.375', '-295.432', '30.2906', '1.6334', '5091:0 5099:0 5103:0 '),\n('5091', 'AlteracValleyBaseA1', '30', '2597', '2959', '50', '80', '8', '628.165', '-209.132', '39.032', '1.71587', '5092:0 5090:0 '),\n('5092', 'AlteracValleyGYA3', '30', '2597', '2959', '50', '80', '136', '635.165', '-28.286', '46.6157', '4.25874', '5091:0 5093:0 5094:0 5095:0 '),\n('5093', 'AlteracValleyBunker3Inside', '30', '2597', '2959', '50', '80', '146', '672.521', '-142.475', '63.6551', '4.09365', '5092:0 '),\n('5094', 'AlteracValleyBunker4Inside', '30', '2597', '2959', '50', '80', '146', '555.611', '-77.7777', '51.9336', '1.81992', '5092:0 '),\n('5095', 'AlteracValleyVanndar', '30', '2597', '4408', '50', '80', '274', '712.208', '-13.5129', '50.1354', '0.288398', '5092:0 '),\n('5096', 'AlteracValleyShortcutA1', '30', '2597', '3303', '50', '80', '131074', '668.321', '-376.13', '30.4499', '1.65697', '5090:0 '),\n('5097', 'AlteracValleyShortcutH1', '30', '2597', '2597', '50', '80', '32', '-550.621', '-356.862', '50.2404', '5.33475', '5073:0 '),\n('5098', 'AlteracValleyMineA1', '30', '2597', '2957', '50', '80', '65538', '774.881', '-363.728', '78.8805', '1.75712', '5099:0 5060:0 '),\n('5099', 'AlteracValleyMineA2', '30', '2597', '2957', '50', '80', '131072', '776.68', '-313.432', '54.4907', '0.0135369', '5100:0 5090:0 '),\n('5100', 'AlteracValleyMineA3', '30', '2597', '2957', '50', '80', '512', '870.508', '-436.928', '51.1438', '5.59377', '5099:0 '),\n('5101', 'AlteracValleyMineH1', '30', '2597', '2963', '50', '80', '8', '-964.106', '-216.1', '69.4372', '0.822477', '5080:0 5102:0 '),\n('5102', 'AlteracValleyMineH2', '30', '2597', '2963', '50', '80', '512', '-853.987', '-98.7783', '67.5444', '6.16727', '5101:0 '),\n('5103', 'AlteracValleyAuxA1', '30', '2597', '2597', '50', '80', '8', '517.454', '-327.563', '-1.03301', '0.235552', '5063:0 5090:0 '),\n('5104', 'AlteracValleyIcebloodGY', '30', '2597', '3300', '50', '80', '0', '-531.167', '-405.06', '49.5441', '2.83719', '5075:0 5097:0 '),\n('5105', 'AlteracValleyGYCS', '30', '2597', '3057', '50', '80', '8', '-311.905', '-130.479', '14.734', '0.412742', '5070:0 5106:0 5072:0 '),\n('5106', 'AlteracValleyGYCN', '30', '2597', '2597', '50', '80', '8', '-143.447', '-249.084', '6.68667', '1.83233', '5068:0 5070:0 5105:0 5108:0 5109:0 '),\n('5107', 'AlteracValleyCS5', '30', '2597', '3057', '50', '80', '8', '-228.16', '-372.069', '9.52872', '3.05359', '5068:0 5110:0 5072:0 '),\n('5108', 'AlteracValleyCS6', '30', '2597', '3057', '50', '80', '8', '-276.653', '-212.64', '7.9686', '3.4754', '5106:0 5072:0 '),\n('5109', 'AlteracValleyCNE', '30', '2597', '2958', '50', '80', '0', '72.783', '-254.66', '17.9217', '3.41296', '5066:0 5106:0 '),\n('5110', 'AlteracValleyCS7', '30', '2597', '3057', '1', '60', '8', '-336.807', '-401.764', '10.041', '0.0278354', '5107:0 5073:0 ');\n"
  },
  {
    "path": "SQL/updates/world/2024_11_05_creature_template_wander_nodes.sql",
    "content": "--\nUPDATE `creature_template_npcbot_wander_nodes` SET `minlevel`='50', `maxlevel`='80' WHERE `id`='5110';\n"
  },
  {
    "path": "SQL/updates/world/2024_11_07_creature_template_wander_nodes.sql",
    "content": "--\nDELETE FROM `creature_template_npcbot_wander_nodes` WHERE `id` BETWEEN 5111 AND 5146;\nINSERT INTO `creature_template_npcbot_wander_nodes` (`id`,`name`,`mapid`,`zoneid`,`areaid`,`minlevel`,`maxlevel`,`flags`,`x`,`y`,`z`,`o`,`links`) VALUES\n('5111', 'EyeOfTheStormSpawnA', '566', '3820', '3820', '60', '80', '3', '2523.45', '1596.62', '1269.24', '3.03123', '5112:0 5113:0 '),\n('5112', 'EyeOfTheStormSpawnA1', '566', '3820', '3820', '60', '80', '65538', '2496.81', '1612.95', '1255.15', '2.81918', '5114:0 '),\n('5113', 'EyeOfTheStormSpawnA2', '566', '3820', '3820', '60', '80', '65538', '2499.13', '1579.21', '1257.44', '3.44945', '5115:0 '),\n('5114', 'EyeOfTheStormStartA1', '566', '3820', '3820', '60', '80', '131074', '2471.65', '1621.06', '1215.96', '2.97233', '5116:0 '),\n('5115', 'EyeOfTheStormStartA2', '566', '3820', '3820', '60', '80', '131074', '2473.83', '1571', '1213.66', '3.45534', '5117:0 '),\n('5116', 'EyeOfTheStormStartA3', '566', '3820', '3820', '60', '80', '2', '2425.5', '1615.75', '1187.87', '0.156239', '5118:0 5119:0 '),\n('5117', 'EyeOfTheStormStartA4', '566', '3820', '3820', '60', '80', '2', '2417.92', '1560.53', '1185.04', '0.233193', '5119:0 5120:0 '),\n('5118', 'EyeOfTheStormForkNW', '566', '3820', '3869', '60', '80', '8', '2279.22', '1660.34', '1165.68', '0.589394', '5119:0 5121:0 5136:0 '),\n('5119', 'EyeOfTheStormForkN', '566', '3820', '3820', '60', '80', '8', '2275.68', '1577.95', '1165.37', '2.88866', '5120:0 5135:0 5144:0 5118:0 5145:0 '),\n('5120', 'EyeOfTheStormForkNE', '566', '3820', '3871', '60', '80', '8', '2285.71', '1469.1', '1181.66', '5.18595', '5119:0 5122:0 5137:0 '),\n('5121', 'EyeOfTheStormBridgeWN', '566', '3820', '3869', '60', '80', '8', '2220.37', '1754.67', '1152.16', '4.67543', '5133:0 5136:0 5118:0 '),\n('5122', 'EyeOfTheStormBridgeEN', '566', '3820', '3871', '60', '80', '8', '2234.95', '1402.23', '1177.94', '3.26368', '5134:0 5120:0 5137:0 '),\n('5123', 'EyeOfTheStormSpawnH', '566', '3820', '3820', '60', '80', '5', '1807.99', '1539.31', '1267.53', '0.120124', '5124:0 5125:0 '),\n('5124', 'EyeOfTheStormSpawnH1', '566', '3820', '3820', '60', '80', '65540', '1831.62', '1557.48', '1255.46', '0.46766', '5127:0 '),\n('5125', 'EyeOfTheStormSpawnH2', '566', '3820', '3820', '60', '80', '65540', '1833.06', '1524.15', '1255.31', '5.93795', '5126:0 '),\n('5126', 'EyeOfTheStormStartH1', '566', '3820', '3820', '60', '80', '131076', '1856.01', '1515.9', '1219.47', '5.93795', '5128:0 '),\n('5127', 'EyeOfTheStormStartH2', '566', '3820', '3820', '60', '80', '131076', '1855.89', '1566.34', '1214.69', '0.34985', '5129:0 '),\n('5128', 'EyeOfTheStormStartH3', '566', '3820', '3820', '60', '80', '4', '1925.07', '1519.35', '1181.58', '0.00431252', '5130:0 5131:0 '),\n('5129', 'EyeOfTheStormStartH4', '566', '3820', '3820', '60', '80', '4', '1937.55', '1593.16', '1178.75', '3.0124', '5131:0 5132:0 '),\n('5130', 'EyeOfTheStormForkSE', '566', '3820', '3870', '60', '80', '8', '2059.13', '1468.67', '1165.76', '4.64205', '5131:0 5134:0 5139:0 '),\n('5131', 'EyeOfTheStormForkSC', '566', '3820', '3820', '60', '80', '8', '2075.02', '1548.37', '1160.58', '0.138568', '5132:0 5135:0 5144:0 5130:0 5146:0 '),\n('5132', 'EyeOfTheStormForkSW', '566', '3820', '3820', '60', '80', '8', '2047.2', '1663.97', '1173.93', '1.64971', '5131:0 5133:0 5138:0 '),\n('5133', 'EyeOfTheStormBridgeWS', '566', '3820', '3872', '60', '80', '8', '2099.21', '1735.01', '1170.54', '0.0965541', '5121:0 5132:0 5138:0 '),\n('5134', 'EyeOfTheStormBridgeES', '566', '3820', '3870', '60', '80', '8', '2110.22', '1381.67', '1162.48', '0.00426722', '5122:0 5139:0 5130:0 '),\n('5135', 'EyeOfTheStormFlagC', '566', '3820', '3820', '60', '80', '262280', '2174.59', '1568.74', '1159.96', '0.248524', '5119:0 5131:0 '),\n('5136', 'EyeOfTheStormFlagNW', '566', '3820', '3869', '60', '80', '72', '2284.84', '1731', '1189.89', '1.72509', '5121:0 5140:0 5118:0 '),\n('5137', 'EyeOfTheStormFlagNE', '566', '3820', '3871', '60', '80', '72', '2286.49', '1402.29', '1197.1', '4.74102', '5120:0 5122:0 5141:0 '),\n('5138', 'EyeOfTheStormFlagSW', '566', '3820', '3872', '60', '80', '72', '2044.01', '1729.74', '1189.86', '1.56605', '5132:0 5133:0 5142:0 '),\n('5139', 'EyeOfTheStormFlagSE', '566', '3820', '3870', '60', '80', '72', '2048.47', '1393.69', '1194.36', '4.79796', '5134:0 5143:0 5130:0 '),\n('5140', 'EyeOfTheStormBuffNW', '566', '3820', '3820', '60', '80', '2056', '2283.56', '1748.26', '1189.71', '3.13137', '5136:0 '),\n('5141', 'EyeOfTheStormBuffNE', '566', '3820', '3820', '60', '80', '4104', '2302.56', '1391.69', '1197.79', '5.33441', '5137:0 '),\n('5142', 'EyeOfTheStormBuffSW', '566', '3820', '3820', '60', '80', '8200', '2046.47', '1749.34', '1190.02', '1.65874', '5138:0 '),\n('5143', 'EyeOfTheStormBuffSE', '566', '3820', '3870', '60', '80', '16392', '2050.3', '1372.75', '1194.56', '4.89851', '5139:0 '),\n('5144', 'EyeOfTheStormFlagCBottom', '566', '3820', '3820', '60', '80', '8', '2178.98', '1538.52', '1129.18', '1.72942', '5119:0 5131:0 '),\n('5145', 'EyeOfTheStormLockA', '566', '3820', '3820', '60', '80', '524', '2423.64', '1588.87', '1188.15', '0.101702', '5119:0 '),\n('5146', 'EyeOfTheStormLockH', '566', '3820', '3820', '60', '80', '522', '1908.01', '1542.98', '1188.84', '3.26882', '5131:0 ');\n"
  },
  {
    "path": "SQL/updates/world/2024_11_11_00_npc_text.sql",
    "content": "--\nSET @LOCALIZED_STRINGS_START = 70553;\nSET @LOCALIZED_STRINGS_END   = 70553;\n\nDELETE FROM `npc_text` WHERE ID BETWEEN @LOCALIZED_STRINGS_START and @LOCALIZED_STRINGS_END;\nINSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n(@LOCALIZED_STRINGS_START,'Bank is full','-1');\n"
  },
  {
    "path": "SQL/updates/world/2024_11_11_01_npc_text.sql",
    "content": "--\nSET @LOCALIZED_STRINGS_START = 70687;\nSET @LOCALIZED_STRINGS_END   = 70688;\n\nDELETE FROM `npc_text` WHERE ID BETWEEN @LOCALIZED_STRINGS_START and @LOCALIZED_STRINGS_END;\nINSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n(@LOCALIZED_STRINGS_START+0,' (gear bank)','-1'),\n(@LOCALIZED_STRINGS_START+1,'Not enough gear bank space to store %u item(s) (%u / %u)!','-1');\n"
  },
  {
    "path": "SQL/updates/world/2024_11_13_00_npc_text.sql",
    "content": "--\nSET @LOCALIZED_STRINGS_START = 70689;\nSET @LOCALIZED_STRINGS_END   = 70693;\n\nDELETE FROM `npc_text` WHERE ID BETWEEN @LOCALIZED_STRINGS_START and @LOCALIZED_STRINGS_END;\nINSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n(@LOCALIZED_STRINGS_START+0,'Equipment sets','-1'),\n(@LOCALIZED_STRINGS_START+1,'Create','-1'),\n(@LOCALIZED_STRINGS_START+2,'Delete','-1'),\n(@LOCALIZED_STRINGS_START+3,'Equip','-1'),\n(@LOCALIZED_STRINGS_START+4,'missing','-1');\n"
  },
  {
    "path": "SQL/updates/world/2026_01_07_creature_template_wander_nodes.sql",
    "content": "DELIMITER $$\nCREATE PROCEDURE tmpAddColumnIfNotExists( IN p_column_name    VARCHAR(64), IN p_add_statement  TEXT )\nBEGIN\n    IF NOT EXISTS (\n        SELECT 1\n        FROM INFORMATION_SCHEMA.COLUMNS\n        WHERE TABLE_SCHEMA = DATABASE()\n          AND TABLE_NAME = 'creature_template_npcbot_wander_nodes'\n          AND COLUMN_NAME = p_column_name\n    ) THEN\n        SET @sql = CONCAT( 'ALTER TABLE `creature_template_npcbot_wander_nodes` ', p_add_statement );\n\n        PREPARE stmt FROM @sql;\n        EXECUTE stmt;\n        DEALLOCATE PREPARE stmt;\n    END IF;\nEND$$\nDELIMITER ;\n\nCALL tmpAddColumnIfNotExists( 'minwaittime', 'ADD `minwaittime` INT UNSIGNED NOT NULL DEFAULT 3000 AFTER `maxlevel`' );\nCALL tmpAddColumnIfNotExists( 'maxwaittime', 'ADD `maxwaittime` INT UNSIGNED NOT NULL DEFAULT 7000 AFTER `minwaittime`' );\nCALL tmpAddColumnIfNotExists( 'proximity', 'ADD `proximity` FLOAT NOT NULL DEFAULT 0 AFTER `maxwaittime`' );\n\nDROP PROCEDURE tmpAddColumnIfNotExists;\n"
  },
  {
    "path": "SQL/updates/world/2026_01_15_00_npc_text.sql",
    "content": "--\nSET @LOCALIZED_STRINGS_START = 70694;\nSET @LOCALIZED_STRINGS_END   = 70700;\n\nDELETE FROM `npc_text` WHERE ID BETWEEN @LOCALIZED_STRINGS_START and @LOCALIZED_STRINGS_END;\nINSERT INTO `npc_text` (`ID`,`text0_0`,`VerifiedBuild`) VALUES\n(@LOCALIZED_STRINGS_START+0,'Manage ownership...','-1'),\n(@LOCALIZED_STRINGS_START+1,'<Add owner>','-1'),\n(@LOCALIZED_STRINGS_START+2,'WARNING: by sharing ownership over your bot you give another player FULL control over their inventory, roles and all other settings (including sharing them with others)','-1'),\n(@LOCALIZED_STRINGS_START+3,'<Remove owner>','-1'),\n(@LOCALIZED_STRINGS_START+4,'Owners limit exceeded','-1'),\n(@LOCALIZED_STRINGS_START+5,'Shared with','-1'),\n(@LOCALIZED_STRINGS_START+6,'Owner','-1');\n"
  },
  {
    "path": "SQL/updates/world/2026_03_12_creature_template_wander_nodes.sql",
    "content": "--\n-- NorthCoastC: make horde-only\nUPDATE `creature_template_npcbot_wander_nodes` SET `flags`=`flags`|4 WHERE (`id`='283');\n-- DurotarCanyon1_8: make horde-only\nUPDATE `creature_template_npcbot_wander_nodes` SET `flags`=`flags`|4 WHERE (`id`='1379');\n"
  },
  {
    "path": "THANKS",
    "content": "I Thank all who ever worked on NPC Bots\nSpecial thanks to:\n    Rochet2 for NPC Dress mod\n    Thesawolf for his work on Readme\n    396842276 for zhCN translation\n    -Shiken- (den13501), ZacLai for zhTW translation\n    souloi for his work on zhCN translation\n    xBarselonx for ruRU translation\n    Lleguito for esES/esMX translation\n    NetherstormX for NetherBot addon\n    QT Blue-AI for NPCbots video tutorials\n    Jinnaix for deDE translation\n    AreChen for zhCN and zhTW translations\n    Wishmaster117 (Alex Dcnh) for multiple translation updates\n\nCode contributors:\n    328950225\n    xtracripper\n    ornfelt\n    Russianranger\n    Dinkledork (Day36512)\n    Conan1996-2\n\nTools contributors:\n    Ryu1254\n\nSupporters:\n    1) By a bounty posted on issue(s):\n        itdevsteve\n    2) By a direct donation:\n        opicron\n        Ryu1254\n        Jinnaix\n"
  },
  {
    "path": "tools/contrib/npcbot stats and gear/01 create table characters_npcbot_class_role.sql",
    "content": "-- \n\nDROP TABLE IF EXISTS `characters_npcbot_class_role`;\n\nCREATE TABLE `characters_npcbot_class_role` (\n\t`entry` INT(11) unsigned NOT NULL DEFAULT '0',\n\t`class_role` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8_general_ci',\n\tPRIMARY KEY (`entry`)\n)\nCOLLATE='latin1_swedish_ci'\nENGINE=InnoDB;\n"
  },
  {
    "path": "tools/contrib/npcbot stats and gear/02 fnc get_bot_classspec.sql",
    "content": "-- \n\nDROP FUNCTION IF EXISTS Get_BOT_CLASSSPEC;\n\nDELIMITER //\n\nCREATE function Get_BOT_CLASSSPEC (bot_entry INT)\nRETURNS VARCHAR(20)\n\nBEGIN\n\tDECLARE BOT_CLASSSPEC VARCHAR(20);\n\t\n\tselect \n\tcase \n\t\twhen creature_template.unit_class = 1 and characters_npcbot.spec IN (1,2) then 'Warrior DPS'\n\t\twhen creature_template.unit_class = 1 and characters_npcbot.spec = 3 then 'Warrior Tank'\n\t\twhen creature_template.unit_class = 2 and characters_npcbot.spec = 4 then 'Paladin Healer'\n\t\twhen creature_template.unit_class = 2 and characters_npcbot.spec = 5 then 'Paladin Tank'\n\t\twhen creature_template.unit_class = 2 and characters_npcbot.spec = 6 then 'Paladin DPS'\n\t\twhen creature_template.unit_class = 3 then 'Hunter'\n\t\twhen creature_template.unit_class = 4 then 'Rogue'\n\t\twhen creature_template.unit_class = 5 and characters_npcbot.spec IN (13,14) then 'Priest Healer'\n\t\twhen creature_template.unit_class = 5 and characters_npcbot.spec = 15 then 'Priest DPS'\n\t\twhen creature_template.unit_class = 6 and Get_BOT_Role(characters_npcbot.roles) = 'DPS' then 'DK DPS'\n\t\twhen creature_template.unit_class = 6 and Get_BOT_Role(characters_npcbot.roles) = 'Tank' then 'DK Tank'\n\t\twhen creature_template.unit_class = 7 and characters_npcbot.spec = 19 then 'Shaman Elemental'\n\t\twhen creature_template.unit_class = 7 and characters_npcbot.spec = 20 then 'Shaman Enhancement'\n\t\twhen creature_template.unit_class = 7 and characters_npcbot.spec = 21 then 'Shaman Healer'\n\t\twhen creature_template.unit_class = 8 then 'Mage'\n\t\twhen creature_template.unit_class = 9 then 'Warlock'\n\t\twhen creature_template.unit_class = 11 and characters_npcbot.spec = 28 then 'Druid Balance'\n\t\twhen creature_template.unit_class = 11 and characters_npcbot.spec = 29 and Get_BOT_Role(characters_npcbot.roles) = 'DPS' then 'Druid Feral DPS'\n\t\twhen creature_template.unit_class = 11 and characters_npcbot.spec = 29 and Get_BOT_Role(characters_npcbot.roles) = 'Tank' then 'Druid Feral Tank'\n\t\twhen creature_template.unit_class = 11 and characters_npcbot.spec = 30  then 'Druid Healer'\n\tEND INTO BOT_CLASSSPEC\n\tFROM characters.characters_npcbot\n\tINNER JOIN world.creature_template ON creature_template.entry = characters_npcbot.entry\n   WHERE characters_npcbot.entry = bot_entry;\n\t\n\tRETURN BOT_CLASSSPEC;\n\nEND //\n\nDELIMITER ;\n"
  },
  {
    "path": "tools/contrib/npcbot stats and gear/03 fnc get_bot_role.sql",
    "content": "-- \n\nSET GLOBAL log_bin_trust_function_creators = 1;\n\nDROP FUNCTION IF EXISTS Get_BOT_Role;\n\nDELIMITER //\n\nCREATE function Get_BOT_Role (role_mask INT)\nRETURNS VARCHAR(20)\n\n\nBEGIN\n\tDECLARE role VARCHAR(20);\n\n\tIF\t\trole_mask & 8 THEN\tSET role = 'Heal';\n\tELSEIF\trole_mask & 4 THEN\tSET role = 'DPS';\n\tELSEIF\trole_mask & 1 THEN\tSET role = 'Tank';\n\tEND IF;\n\n\tRETURN role;\n\nEND //\n\nDELIMITER ;\n"
  },
  {
    "path": "tools/contrib/npcbot stats and gear/04 create trigger.sql",
    "content": "-- \n\nDROP TRIGGER IF EXISTS characters_npcbot_stat_update_class_role;\n\nDELIMITER $$\n\nCREATE TRIGGER characters_npcbot_stat_update_class_role AFTER UPDATE ON characters_npcbot \nFOR EACH ROW \nBEGIN\n\tif EXISTS (SELECT entry FROM characters_npcbot_class_role WHERE characters_npcbot_class_role.entry = NEW.entry)\n\tthen\n\t\tUPDATE characters_npcbot_class_role\n\t\tSET characters_npcbot_class_role.class_role = Get_BOT_CLASSSPEC(new.entry)\n\t\tWHERE characters_npcbot_class_role.entry = NEW.entry;\n\telse\n\t\tINSERT INTO characters_npcbot_class_role (entry, class_role)\n\t\tVALUES (NEW.entry, Get_BOT_CLASSSPEC(new.entry));\n\tEND if;\nEND $$\n\nDELIMITER ;\n"
  },
  {
    "path": "tools/contrib/npcbot stats and gear/05 create view character_npcbot_gear.sql",
    "content": "-- \n\nDROP VIEW IF EXISTS vw_characters_npcbot_gear;\n\nCREATE VIEW vw_characters_npcbot_gear AS\n\n\nSELECT  \n       characters.name AS 'Character Name', \n\t\t creature_template.name AS 'NPCBot Name',\n\t\tIFNULL(MhEx_n.ItemLevel,0) + IFNULL(OhEx_n.ItemLevel,0) + IFNULL(RhEx_n.ItemLevel,0) + IFNULL(Head_n.ItemLevel,0) + IFNULL(Shoulders_n.ItemLevel,0) + IFNULL(Chest_n.ItemLevel,0) + IFNULL(Waist_n.ItemLevel,0) + IFNULL(Legs_n.ItemLevel,0) + IFNULL(Feet_n.ItemLevel,0) + IFNULL(Wrist_n.ItemLevel,0) + IFNULL(Hands_n.ItemLevel,0) + IFNULL(Back_n.ItemLevel,0) +\tIFNULL(Finger1_n.ItemLevel,0) + IFNULL(Finger2_n.ItemLevel,0) + IFNULL(Trinket1_n.ItemLevel,0) + IFNULL(Trinket2_n.ItemLevel,0) + IFNULL(Neck_n.ItemLevel,0) AS 'Gear Score',\n\t\tcharacters_npcbot_class_role.class_role AS 'NPCBot Classe',\n\n\n\t\tCASE\n\t\t\tWHEN (characters_npcbot_class_role.class_role IN ('Warrior DPS', 'Paladin DPS', 'DK DPS')) AND (MhEx.itemEntry in (50070,50412,50425)) THEN CONCAT('LBis ',MhEx_n.ItemLevel,' ',MhEx_n.name)\n\t\t\tWHEN (characters_npcbot_class_role.class_role IN ('Warrior DPS', 'Paladin DPS', 'DK DPS')) AND (MhEx.itemEntry in (50730,49623,50672,50737,50735)) THEN CONCAT('Bis ',MhEx_n.ItemLevel,' ',MhEx_n.name) \n\t\t\tWHEN (characters_npcbot_class_role.class_role IN ('Warrior Tank', 'Paladin Tank')) AND (MhEx.itemEntry in (49997)) THEN CONCAT('LBis ',MhEx_n.ItemLevel,' ',MhEx_n.name)\n\t\t\tWHEN (characters_npcbot_class_role.class_role IN ('Warrior Tank', 'Paladin Tank')) AND (MhEx.itemEntry in (50738)) THEN CONCAT('Bis ',MhEx_n.ItemLevel,' ',MhEx_n.name)\t\t\t\n\t\t\tWHEN (characters_npcbot_class_role.class_role IN ('DK Tank')) AND (MhEx.itemEntry in (50730)) THEN CONCAT('LBis ',MhEx_n.ItemLevel,' ',MhEx_n.name)\n\t\t\tWHEN (characters_npcbot_class_role.class_role IN ('DK Tank')) AND (MhEx.itemEntry in (50070,49623)) THEN CONCAT('Bis ',MhEx_n.ItemLevel,' ',MhEx_n.name)\n\t\t\tWHEN (characters_npcbot_class_role.class_role IN ('Shaman Elemental', 'Druid Balance', 'Priest DPS')) AND (MhEx.itemEntry in (50428)) THEN CONCAT('LBis ',MhEx_n.ItemLevel,' ',MhEx_n.name) \n\t\t\tWHEN (characters_npcbot_class_role.class_role IN ('Shaman Elemental', 'Druid Balance', 'Priest DPS')) AND (MhEx.itemEntry in (50734)) THEN CONCAT('Bis ',MhEx_n.ItemLevel,' ',MhEx_n.name) \n\t\t\tWHEN (characters_npcbot_class_role.class_role IN ('Mage', 'Warlock')) AND (MhEx.itemEntry in (50427)) THEN CONCAT('LBis ',MhEx_n.ItemLevel,' ',MhEx_n.name)\n\t\t\tWHEN (characters_npcbot_class_role.class_role IN ('Mage', 'Warlock')) AND (MhEx.itemEntry in (50732)) THEN CONCAT('Bis ',MhEx_n.ItemLevel,' ',MhEx_n.name)\n\t\t\tWHEN (characters_npcbot_class_role.class_role IN ('Paladin Healer', 'Priest Healer', 'Shaman Healer', 'Druid Healer')) AND (MhEx.itemEntry in (50428,50427,50028,46017,50429)) THEN CONCAT('LBis ',MhEx_n.ItemLevel,' ',MhEx_n.name) \n\t\t\tWHEN (characters_npcbot_class_role.class_role IN ('Paladin Healer', 'Priest Healer', 'Shaman Healer', 'Druid Healer')) AND (MhEx.itemEntry in (50734,50732,50685,70731)) THEN CONCAT('Bis ',MhEx_n.ItemLevel,' ',MhEx_n.name)\n\t\t\tWHEN (characters_npcbot_class_role.class_role IN ('Druid Feral Tank')) AND (MhEx.itemEntry = 50426) THEN CONCAT('LBis ',MhEx_n.ItemLevel,' ',MhEx_n.name) \n\t\t\tWHEN (characters_npcbot_class_role.class_role IN ('Druid Feral Tank')) AND (MhEx.itemEntry = 50735) THEN CONCAT('Bis ',MhEx_n.ItemLevel,' ',MhEx_n.name) \n\t\t\tWHEN (characters_npcbot_class_role.class_role IN ('Hunter', 'Druid Feral DPS')) AND (MhEx.itemEntry in (50423)) THEN CONCAT('LBis ',MhEx_n.ItemLevel,' ',MhEx_n.name)\n\t\t\tWHEN (characters_npcbot_class_role.class_role IN ('Hunter', 'Druid Feral DPS')) AND (MhEx.itemEntry in (50735)) THEN CONCAT('Bis ',MhEx_n.ItemLevel,' ',MhEx_n.name)\n\t\t\tWHEN (characters_npcbot_class_role.class_role IN ('Rogue', 'Shaman Enhancement')) AND (MhEx.itemEntry in (50426,50012)) THEN CONCAT('LBis ',MhEx_n.ItemLevel,' ',MhEx_n.name)\n\t\t\tWHEN (characters_npcbot_class_role.class_role IN ('Rogue', 'Shaman Enhancement')) AND (MhEx.itemEntry in (50736,50737)) THEN CONCAT('Bis ',MhEx_n.ItemLevel,' ',MhEx_n.name)\t\t\t\n\t\tELSE \n\t\t\tCONCAT(MhEx_n.ItemLevel,' ',MhEx_n.name) \n\t\tEND AS '01 Main Hand',\n\t\tCASE \n\t\t\tWHEN (characters_npcbot_class_role.class_role IN ('Warrior DPS')) AND (OhEx.itemEntry in (49919)) THEN CONCAT('LBis ',OhEx_n.ItemLevel,' ',OhEx_n.name)\n\t\t\tWHEN (characters_npcbot_class_role.class_role IN ('Warrior DPS')) AND (OhEx.itemEntry in (50603)) THEN CONCAT('Bis ',OhEx_n.ItemLevel,' ',OhEx_n.name) \n\t\t\tWHEN (characters_npcbot_class_role.class_role IN ('DK DPS')) AND (OhEx.itemEntry in (50412,50012)) THEN CONCAT('LBis ',OhEx_n.ItemLevel,' ',OhEx_n.name)\n\t\t\tWHEN (characters_npcbot_class_role.class_role IN ('DK DPS')) AND (OhEx.itemEntry in (50737,50672)) THEN CONCAT('Bis ',OhEx_n.ItemLevel,' ',OhEx_n.name)\n\t\t\tWHEN (characters_npcbot_class_role.class_role IN ('Warrior Tank', 'Paladin Tank')) AND (OhEx.itemEntry in (50065)) THEN CONCAT('LBis ',OhEx_n.ItemLevel,' ',OhEx_n.name)\n\t\t\tWHEN (characters_npcbot_class_role.class_role IN ('Warrior Tank', 'Paladin Tank')) AND (OhEx.itemEntry in (50729)) THEN CONCAT('Bis ',OhEx_n.ItemLevel,' ',OhEx_n.name)\t\t\t\n\t\t\tWHEN (characters_npcbot_class_role.class_role IN ('Paladin Healer', 'Shaman Healer', 'Shaman Elemental')) AND (OhEx.itemEntry in (49976)) THEN CONCAT('LBis ',OhEx_n.ItemLevel,' ',OhEx_n.name)\n\t\t\tWHEN (characters_npcbot_class_role.class_role IN ('Paladin Healer', 'Shaman Healer', 'Shaman Elemental')) AND (OhEx.itemEntry in (50616)) THEN CONCAT('Bis ',OhEx_n.ItemLevel,' ',OhEx_n.name)\n\t\t\tWHEN (characters_npcbot_class_role.class_role IN ('Mage', 'Warlock', 'Druid Balance', 'Priest DPS', 'Priest Healer')) AND (OhEx.itemEntry in (50173)) THEN CONCAT('LBis ',OhEx_n.ItemLevel,' ',OhEx_n.name)\n\t\t\tWHEN (characters_npcbot_class_role.class_role IN ('Mage', 'Warlock', 'Druid Balance', 'Priest DPS', 'Priest Healer')) AND (OhEx.itemEntry in (50719)) THEN CONCAT('Bis ',OhEx_n.ItemLevel,' ',OhEx_n.name)\n\t\t\tWHEN (characters_npcbot_class_role.class_role IN ('Druid Healer')) AND (OhEx.itemEntry in (50423)) THEN CONCAT('LBis ',OhEx_n.ItemLevel,' ',OhEx_n.name)\n\t\t\tWHEN (characters_npcbot_class_role.class_role IN ('Druid Healer')) AND (OhEx.itemEntry in (50635)) THEN CONCAT('Bis ',OhEx_n.ItemLevel,' ',OhEx_n.name)\n\t\t\t\n\t\t\tWHEN (characters_npcbot_class_role.class_role IN ('Hunter', 'Rogue', 'Druid Feral DPS', 'Shaman Enhancement')) AND (OhEx.itemEntry in (50654,50737)) THEN CONCAT('Bis ',OhEx_n.ItemLevel,' ',OhEx_n.name) \n\t\tELSE \n\t\t\tCONCAT(OhEx_n.ItemLevel,' ',OhEx_n.name) \n\t\tEND AS '02 Off Hand',\n\t\tCASE \n\t\t\tWHEN (characters_npcbot_class_role.class_role IN ('Warrior DPS', 'Paladin DPS', 'DK DPS')) AND (RhEx.itemEntry in (49981)) THEN CONCAT('LBis ',RhEx_n.ItemLevel,' ',RhEx_n.name)\n\t\t\tWHEN (characters_npcbot_class_role.class_role IN ('Warrior DPS', 'Paladin DPS', 'DK DPS')) AND (RhEx.itemEntry in (50455,50733)) THEN CONCAT('Bis ',RhEx_n.ItemLevel,' ',RhEx_n.name) \n\t\t\tWHEN (characters_npcbot_class_role.class_role IN ('Warrior Tank', 'Paladin Tank', 'DK Tank')) AND (RhEx.itemEntry in (50462,51561)) THEN CONCAT('LBis ',RhEx_n.ItemLevel,' ',RhEx_n.name) \n\t\t\tWHEN (characters_npcbot_class_role.class_role IN ('Warrior Tank', 'Paladin Tank', 'DK Tank')) AND (RhEx.itemEntry in (51834)) THEN CONCAT('Bis ',RhEx_n.ItemLevel,' ',RhEx_n.name) \n\t\t\tWHEN (characters_npcbot_class_role.class_role IN ('Mage', 'Warlock', 'Priest DPS')) AND (RhEx.itemEntry in (50033)) THEN CONCAT('LBis ',RhEx_n.ItemLevel,' ',RhEx_n.name)\n\t\t\tWHEN (characters_npcbot_class_role.class_role IN ('Mage', 'Warlock', 'Priest DPS')) AND (RhEx.itemEntry in (50684)) THEN CONCAT('Bis ',RhEx_n.ItemLevel,' ',RhEx_n.name)\n\t\t\tWHEN (characters_npcbot_class_role.class_role IN ('Priest Healer')) AND (RhEx.itemEntry in (50472)) THEN CONCAT('LBis ',RhEx_n.ItemLevel,' ',RhEx_n.name)\n\t\t\tWHEN (characters_npcbot_class_role.class_role IN ('Priest Healer')) AND (RhEx.itemEntry in (50631)) THEN CONCAT('Bis ',RhEx_n.ItemLevel,' ',RhEx_n.name)\n\t\t\tWHEN (characters_npcbot_class_role.class_role IN ('Paladin Healer', 'Shaman Healer', 'Druid Healer', 'Shaman Elemental')) AND (RhEx.itemEntry in (50458,50454,40705)) THEN CONCAT('Bis ',RhEx_n.ItemLevel,' ',RhEx_n.name)\n\t\t\tWHEN (characters_npcbot_class_role.class_role IN ('Druid Feral Tank')) AND (RhEx.itemEntry = 50456) THEN CONCAT('Bis ',RhEx_n.ItemLevel,' ',RhEx_n.name)\n\t\t\t\n\t\t\tWHEN (characters_npcbot_class_role.class_role IN ('Hunter', 'Rogue', 'Druid Feral DPS', 'Shaman Enhancement')) AND (RhEx.itemEntry in (50733,50456,50463)) THEN CONCAT('Bis ',RhEx_n.ItemLevel,' ',RhEx_n.name) \n\t\tELSE \n\t\t\tCONCAT(RhEx_n.ItemLevel,' ',RhEx_n.name) \n\t\tEND AS '03 Range',\n\tCASE \n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Warrior DPS', 'Paladin DPS', 'DK DPS')) AND (Head.itemEntry in (51212,51127,51162)) THEN CONCAT('LBis ',Head_n.ItemLevel,' ',Head_n.name) \n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Warrior DPS', 'Paladin DPS', 'DK DPS')) AND (Head.itemEntry in (51227,51312,51277)) THEN CONCAT('Bis ',Head_n.ItemLevel,' ',Head_n.name) \n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Warrior Tank', 'Paladin Tank')) AND (Head.itemEntry in (49986)) THEN CONCAT('LBis ',Head_n.ItemLevel,' ',Head_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Warrior Tank', 'Paladin Tank')) AND (Head.itemEntry in (50640)) THEN CONCAT('Bis ',Head_n.ItemLevel,' ',Head_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('DK Tank')) AND (Head.itemEntry in (51133)) THEN CONCAT('LBis ',Head_n.ItemLevel,' ',Head_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('DK Tank')) AND (Head.itemEntry in (51306)) THEN CONCAT('Bis ',Head_n.ItemLevel,' ',Head_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Mage', 'Warlock', 'Shaman Elemental', 'Druid Balance', 'Priest DPS')) AND (Head.itemEntry in (51149,51158,51184,51202,51208)) THEN CONCAT('LBis ',Head_n.ItemLevel,' ',Head_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Mage', 'Warlock', 'Shaman Elemental', 'Druid Balance', 'Priest DPS')) AND (Head.itemEntry in (51290,51255,51237,51231,51281)) THEN CONCAT('Bis ',Head_n.ItemLevel,' ',Head_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Paladin Healer', 'Priest Healer', 'Shaman Healer', 'Druid Healer')) AND (Head.itemEntry in (51137,51167,51178,51192)) THEN CONCAT('LBis ',Head_n.ItemLevel,' ',Head_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Paladin Healer', 'Priest Healer', 'Shaman Healer', 'Druid Healer')) AND (Head.itemEntry in (51302,51272,51261,51247)) THEN CONCAT('Bis ',Head_n.ItemLevel,' ',Head_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Hunter', 'Rogue', 'Druid Feral DPS','Druid Feral Tank', 'Shaman Enhancement')) AND (Head.itemEntry in (51143,51153,51187,51197)) THEN CONCAT('LBis ',Head_n.ItemLevel,' ',Head_n.name) \n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Hunter', 'Rogue', 'Druid Feral DPS','Druid Feral Tank', 'Shaman Enhancement')) AND (Head.itemEntry in (51286,51296,51252,51242)) THEN CONCAT('Bis ',Head_n.ItemLevel,' ',Head_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Rogue')) AND (Head.itemEntry in (50073)) THEN CONCAT('LBis ',Head_n.ItemLevel,' ',Head_n.name) \n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Rogue')) AND (Head.itemEntry in (50713)) THEN CONCAT('Bis ',Head_n.ItemLevel,' ',Head_n.name)\n\tELSE \n\t\tCONCAT(Head_n.ItemLevel,' ',Head_n.name) \n\tEND AS '04 Head',\n \tCASE \n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Warrior DPS', 'Paladin DPS', 'DK DPS')) AND (Shoulders.itemEntry in (51210,51125,51160)) THEN CONCAT('LBis ',Shoulders_n.ItemLevel,' ',Shoulders_n.name) \n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Warrior DPS', 'Paladin DPS', 'DK DPS')) AND (Shoulders.itemEntry in (51229,51314,51279)) THEN CONCAT('Bis ',Shoulders_n.ItemLevel,' ',Shoulders_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Warrior Tank')) AND (Shoulders.itemEntry in (51383)) THEN CONCAT('LBis ',Shoulders_n.ItemLevel,' ',Shoulders_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Warrior Tank')) AND (Shoulders.itemEntry in (51847)) THEN CONCAT('Bis ',Shoulders_n.ItemLevel,' ',Shoulders_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Paladin Tank')) AND (Shoulders.itemEntry in (50003)) THEN CONCAT('LBis ',Shoulders_n.ItemLevel,' ',Shoulders_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Paladin Tank')) AND (Shoulders.itemEntry in (50660)) THEN CONCAT('Bis ',Shoulders_n.ItemLevel,' ',Shoulders_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('DK Tank')) AND (Shoulders.itemEntry in (51130)) THEN CONCAT('LBis ',Shoulders_n.ItemLevel,' ',Shoulders_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('DK Tank')) AND (Shoulders.itemEntry in (51309)) THEN CONCAT('Bis ',Shoulders_n.ItemLevel,' ',Shoulders_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Mage', 'Warlock', 'Shaman Elemental', 'Druid Balance', 'Priest DPS')) AND (Shoulders.itemEntry in (51147,51155,51182,51204,51205)) THEN CONCAT('LBis ',Shoulders_n.ItemLevel,' ',Shoulders_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Mage', 'Warlock', 'Shaman Elemental', 'Druid Balance', 'Priest DPS')) AND (Shoulders.itemEntry in (51292,51284,51257,51235,51234)) THEN CONCAT('Bis ',Shoulders_n.ItemLevel,' ',Shoulders_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Paladin Healer', 'Priest Healer', 'Shaman Healer', 'Druid Healer')) AND (Shoulders.itemEntry in (51135,51166,51175,51194)) THEN CONCAT('LBis ',Shoulders_n.ItemLevel,' ',Shoulders_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Paladin Healer', 'Priest Healer', 'Shaman Healer', 'Druid Healer')) AND (Shoulders.itemEntry in (51245,51304,51273,51264)) THEN CONCAT('Bis ',Shoulders_n.ItemLevel,' ',Shoulders_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Rogue')) AND (Shoulders.itemEntry = 49987) THEN CONCAT('LBis ',Shoulders_n.ItemLevel,' ',Shoulders_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Rogue')) AND (Shoulders.itemEntry = 50646) THEN CONCAT('Bis ',Shoulders_n.ItemLevel,' ',Shoulders_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Hunter', 'Rogue', 'Druid Feral DPS', 'Druid Feral Tank', 'Shaman Enhancement')) AND (Shoulders.itemEntry in (51140,51151,51185,51199)) THEN CONCAT('LBis ',Shoulders_n.ItemLevel,' ',Shoulders_n.name) \n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Hunter', 'Rogue', 'Druid Feral DPS', 'Druid Feral Tank', 'Shaman Enhancement')) AND (Shoulders.itemEntry in (51288,51299,51254,51240)) THEN CONCAT('Bis ',Shoulders_n.ItemLevel,' ',Shoulders_n.name) \n\tELSE \n\t\tCONCAT(Shoulders_n.ItemLevel,' ',Shoulders_n.name) \n\tEND AS '05 Shoulder',\n\tCASE \n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Warrior DPS', 'Paladin DPS', 'DK DPS')) AND (Chest.itemEntry in (51214,51129,51164)) THEN CONCAT('LBis ',Chest_n.ItemLevel,' ',Chest_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Warrior DPS', 'Paladin DPS', 'DK DPS')) AND (Chest.itemEntry in (51225,51310,51275)) THEN CONCAT('Bis ',Chest_n.ItemLevel,' ',Chest_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Warrior Tank', 'Paladin Tank', 'DK Tank')) AND (Chest.itemEntry in (51134,51174,51219)) THEN CONCAT('LBis ',Chest_n.ItemLevel,' ',Chest_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Warrior Tank', 'Paladin Tank', 'DK Tank')) AND (Chest.itemEntry in (51220,51265,51305)) THEN CONCAT('Bis ',Chest_n.ItemLevel,' ',Chest_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Mage', 'Warlock', 'Shaman Elemental', 'Druid Balance', 'Priest DPS')) AND (Chest.itemEntry in (51145,61156,51180,51200,51206)) THEN CONCAT('LBis ',Chest_n.ItemLevel,' ',Chest_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Mage', 'Warlock', 'Shaman Elemental', 'Druid Balance', 'Priest DPS')) AND (Chest.itemEntry in (51294,51259,51239,51233,51283)) THEN CONCAT('Bis ',Chest_n.ItemLevel,' ',Chest_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Paladin Healer', 'Priest Healer', 'Shaman Healer')) AND (Chest.itemEntry in (50027,51176,51190)) THEN CONCAT('LBis ',Chest_n.ItemLevel,' ',Chest_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Paladin Healer', 'Priest Healer', 'Shaman Healer')) AND (Chest.itemEntry in (50680,51263,51249)) THEN CONCAT('Bis ',Chest_n.ItemLevel,' ',Chest_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Priest Healer', 'Druid Healer')) AND (Chest.itemEntry in (50172)) THEN CONCAT('LBis ',Chest_n.ItemLevel,' ',Chest_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Priest Healer', 'Druid Healer')) AND (Chest.itemEntry in (50717)) THEN CONCAT('Bis ',Chest_n.ItemLevel,' ',Chest_n.name)\n\t\twhen (characters_npcbot_class_role.class_role IN ('Druid Feral Tank', 'Rogue')) AND (Chest.itemEntry = 50001) THEN CONCAT('LBis ',Chest_n.ItemLevel,' ',Chest_n.name) \n\t\twhen (characters_npcbot_class_role.class_role IN ('Druid Feral Tank', 'Rogue')) AND (Chest.itemEntry = 50656) THEN CONCAT('Bis ',Chest_n.ItemLevel,' ',Chest_n.name) \n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Hunter', 'Rogue', 'Druid Feral DPS', 'Shaman Enhancement')) AND (Chest.itemEntry in (51141,51150,51189)) THEN CONCAT('LBis ',Chest_n.ItemLevel,' ',Chest_n.name) \n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Hunter', 'Rogue', 'Druid Feral DPS', 'Shaman Enhancement')) AND (Chest.itemEntry in (51289,51298,51250)) THEN CONCAT('Bis ',Chest_n.ItemLevel,' ',Chest_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Shaman Enhancement')) AND (Chest.itemEntry in (50038)) THEN CONCAT('LBis ',Chest_n.ItemLevel,' ',Chest_n.name) \n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Shaman Enhancement')) AND (Chest.itemEntry in (50689)) THEN CONCAT('Bis ',Chest_n.ItemLevel,' ',Chest_n.name) \t\t\n\tELSE \n\t\tCONCAT(Chest_n.ItemLevel,' ',Chest_n.name) \n\tEND AS '06 Chest',\n\tCASE \n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Warrior DPS', 'DK DPS')) AND (Waist.itemEntry in (50187)) THEN CONCAT('LBis ',Waist_n.ItemLevel,' ',Waist_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Warrior DPS', 'DK DPS')) AND (Waist.itemEntry in (50620)) THEN CONCAT('Bis ',Waist_n.ItemLevel,' ',Waist_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Paladin DPS')) AND (Waist.itemEntry in (50067)) THEN CONCAT('LBis ',Waist_n.ItemLevel,' ',Waist_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Paladin DPS')) AND (Waist.itemEntry in (50707)) THEN CONCAT('Bis ',Waist_n.ItemLevel,' ',Waist_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Warrior Tank')) AND (Waist.itemEntry in (50036)) THEN CONCAT('LBis ',Waist_n.ItemLevel,' ',Waist_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Warrior Tank')) AND (Waist.itemEntry in (50691)) THEN CONCAT('Bis ',Waist_n.ItemLevel,' ',Waist_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Paladin Tank', 'DK Tank')) AND (Waist.itemEntry in (50991)) THEN CONCAT('Bis ',Waist_n.ItemLevel,' ',Waist_n.name)\t\t\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Mage', 'Warlock', 'Shaman Elemental', 'Druid Balance', 'Priest DPS')) AND (Waist.itemEntry in (49978,53488)) THEN CONCAT('LBis ',Waist_n.ItemLevel,' ',Waist_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Mage', 'Warlock', 'Shaman Elemental', 'Druid Balance', 'Priest DPS')) AND (Waist.itemEntry in (54587,50613)) THEN CONCAT('Bis ',Waist_n.ItemLevel,' ',Waist_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Druid Healer')) AND (Waist.itemEntry in (50069)) THEN CONCAT('LBis ',Waist_n.ItemLevel,' ',Waist_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Druid Healer')) AND (Waist.itemEntry in (50705)) THEN CONCAT('Bis ',Waist_n.ItemLevel,' ',Waist_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Paladin Healer', 'Shaman Healer')) AND (Waist.itemEntry in (53488)) THEN CONCAT('LBis ',Waist_n.ItemLevel,' ',Waist_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Paladin Healer', 'Shaman Healer')) AND (Waist.itemEntry in (54587)) THEN CONCAT('Bis ',Waist_n.ItemLevel,' ',Waist_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Priest Healer')) AND (Waist.itemEntry in (49978,50063)) THEN CONCAT('LBis ',Waist_n.ItemLevel,' ',Waist_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Priest Healer')) AND (Waist.itemEntry in (50613,50702)) THEN CONCAT('Bis ',Waist_n.ItemLevel,' ',Waist_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Druid Feral Tank','Rogue')) AND (Waist.itemEntry = 50067) THEN CONCAT('LBis ',Waist_n.ItemLevel,' ',Waist_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Druid Feral Tank', 'Druid Feral DPS','Rogue')) AND (Waist.itemEntry = 50707) THEN CONCAT('Bis ',Waist_n.ItemLevel,' ',Waist_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Druid Feral DPS')) AND (Waist.itemEntry IN (50067,50995)) THEN CONCAT('LBis ',Waist_n.ItemLevel,' ',Waist_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Hunter', 'Shaman Enhancement')) AND (Waist.itemEntry in (50413)) THEN CONCAT('LBis ',Waist_n.ItemLevel,' ',Waist_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Hunter', 'Shaman Enhancement')) AND (Waist.itemEntry in (50688)) THEN CONCAT('Bis ',Waist_n.ItemLevel,' ',Waist_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Rogue')) AND (Waist.itemEntry in (47107)) THEN CONCAT('LBis ',Waist_n.ItemLevel,' ',Waist_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Rogue')) AND (Waist.itemEntry in (47112)) THEN CONCAT('Bis ',Waist_n.ItemLevel,' ',Waist_n.name)\n\tELSE \n\t\tCONCAT(Waist_n.ItemLevel,' ',Waist_n.name) \n\tEND AS '07 Waist',\n\tCASE \n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Warrior DPS', 'Paladin DPS', 'DK DPS')) AND (Legs.itemEntry in (51211,51126,51161)) THEN CONCAT('LBis ',Legs_n.ItemLevel,' ',Legs_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Warrior DPS', 'Paladin DPS', 'DK DPS')) AND (Legs.itemEntry in (51228,51313,51278)) THEN CONCAT('Bis ',Legs_n.ItemLevel,' ',Legs_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Warrior Tank', 'DK Tank')) AND (Legs.itemEntry in (49964)) THEN CONCAT('LBis ',Legs_n.ItemLevel,' ',Legs_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Warrior Tank', 'DK Tank')) AND (Legs.itemEntry in (50612)) THEN CONCAT('Bis ',Legs_n.ItemLevel,' ',Legs_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Paladin Tank')) AND (Legs.itemEntry in (5904)) THEN CONCAT('Bis ',Legs_n.ItemLevel,' ',Legs_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Mage', 'Warlock', 'Shaman Elemental', 'Druid Balance', 'Priest DPS')) AND (Legs.itemEntry = 50056) THEN CONCAT('LBis ',Legs_n.ItemLevel,' ',Legs_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Mage', 'Warlock', 'Shaman Elemental', 'Druid Balance', 'Priest DPS')) AND (Legs.itemEntry = 50694) THEN CONCAT('Bis ',Legs_n.ItemLevel,' ',Legs_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Paladin Healer', 'Priest Healer', 'Shaman Healer', 'Druid Healer')) AND (Legs.itemEntry in (51136,50056,51177,51193)) THEN CONCAT('LBis ',Legs_n.ItemLevel,' ',Legs_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Paladin Healer', 'Priest Healer', 'Shaman Healer', 'Druid Healer')) AND (Legs.itemEntry in (51246,51303,51262,50694)) THEN CONCAT('Bis ',Legs_n.ItemLevel,' ',Legs_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Druid Feral Tank', 'Rogue', 'Druid Feral DPS', 'Shaman Enhancement')) AND (Legs.itemEntry in (51142,51186,51198)) THEN CONCAT('LBis ',Legs_n.ItemLevel,' ',Legs_n.name) \n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Druid Feral Tank', 'Rogue', 'Druid Feral DPS', 'Shaman Enhancement')) AND (Legs.itemEntry in (51297,51253,51241)) THEN CONCAT('Bis ',Legs_n.ItemLevel,' ',Legs_n.name) \n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Hunter')) AND (Legs.itemEntry in (49988)) THEN CONCAT('LBis ',Legs_n.ItemLevel,' ',Legs_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Hunter')) AND (Legs.itemEntry in (50645)) THEN CONCAT('Bis ',Legs_n.ItemLevel,' ',Legs_n.name)\n\tELSE \n\t\tCONCAT(Legs_n.ItemLevel,' ',Legs_n.name) \n\tEND AS '08 Legs',\n\tCASE\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Warrior DPS')) AND (Feet.itemEntry IN (53125,49983)) THEN CONCAT('LBis ',Feet_n.ItemLevel,' ',Feet_n.name) \n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Warrior DPS')) AND (Feet.itemEntry IN (50639,54578)) THEN CONCAT('Bis ',Feet_n.ItemLevel,' ',Feet_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Paladin DPS', 'DK DPS')) AND (Feet.itemEntry IN (53125)) THEN CONCAT('LBis ',Feet_n.ItemLevel,' ',Feet_n.name) \n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Paladin DPS', 'DK DPS')) AND (Feet.itemEntry IN (54578)) THEN CONCAT('Bis ',Feet_n.ItemLevel,' ',Feet_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Warrior Tank', 'Paladin Tank', 'DK Tank')) AND (Feet.itemEntry in (53129)) THEN CONCAT('LBis ',Feet_n.ItemLevel,' ',Feet_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Warrior Tank', 'Paladin Tank', 'DK Tank')) AND (Feet.itemEntry in (54579)) THEN CONCAT('Bis ',Feet_n.ItemLevel,' ',Feet_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Mage', 'Warlock', 'Shaman Elemental', 'Druid Balance', 'Priest DPS', 'Priest Healer', 'Shaman Healer')) AND (Feet.itemEntry = 50062) THEN CONCAT('LBis ',Feet_n.ItemLevel,' ',Feet_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Mage', 'Warlock', 'Shaman Elemental', 'Druid Balance', 'Priest DPS', 'Priest Healer', 'Shaman Healer')) AND (Feet.itemEntry = 50699) THEN CONCAT('Bis ',Feet_n.ItemLevel,' ',Feet_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Paladin Healer')) AND (Feet.itemEntry in (53487)) THEN CONCAT('LBis ',Feet_n.ItemLevel,' ',Feet_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Paladin Healer')) AND (Feet.itemEntry in (54586)) THEN CONCAT('Bis ',Feet_n.ItemLevel,' ',Feet_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Druid Healer')) AND (Feet.itemEntry in (50009)) THEN CONCAT('LBis ',Feet_n.ItemLevel,' ',Feet_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Druid Healer')) AND (Feet.itemEntry in (50665)) THEN CONCAT('Bis ',Feet_n.ItemLevel,' ',Feet_n.name) \n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Druid Feral Tank', 'Druid Feral DPS')) AND (Feet.itemEntry in (49895,49950)) THEN CONCAT('LBis ',Feet_n.ItemLevel,' ',Feet_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Druid Feral Tank', 'Druid Feral DPS','Rogue')) AND (Feet.itemEntry = 50607) THEN CONCAT('Bis ',Feet_n.ItemLevel,' ',Feet_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Rogue')) AND (Feet.itemEntry = 49950) THEN CONCAT('LBis ',Feet_n.ItemLevel,' ',Feet_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Hunter', 'Shaman Enhancement')) AND (Feet.itemEntry in (53127)) THEN CONCAT('LBis ',Feet_n.ItemLevel,' ',Feet_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Hunter', 'Shaman Enhancement')) AND (Feet.itemEntry in (54577)) THEN CONCAT('Bis ',Feet_n.ItemLevel,' ',Feet_n.name)\n\tELSE \n\t\tCONCAT(Feet_n.ItemLevel,' ',Feet_n.name) \n\tEND AS '09 Feet',\n\tCASE \n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Warrior DPS', 'Paladin DPS', 'DK DPS')) AND (Wrist.itemEntry in (50333,50002,53126)) THEN CONCAT('LBis ',Wrist_n.ItemLevel,' ',Wrist_n.name) \n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Warrior DPS', 'Paladin DPS', 'DK DPS')) AND (Wrist.itemEntry in (50670,50659,54580)) THEN CONCAT('Bis ',Wrist_n.ItemLevel,' ',Wrist_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Warrior Tank', 'Paladin Tank', 'DK Tank')) AND (Wrist.itemEntry in (50802)) THEN CONCAT('LBis ',Wrist_n.ItemLevel,' ',Wrist_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Warrior Tank', 'Paladin Tank', 'DK Tank')) AND (Wrist.itemEntry in (51901)) THEN CONCAT('Bis ',Wrist_n.ItemLevel,' ',Wrist_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Mage', 'Warlock', 'Shaman Elemental', 'Druid Balance', 'Priest DPS', 'Paladin Healer', 'Priest Healer')) AND (Wrist.itemEntry = 53486) THEN CONCAT('LBis ',Wrist_n.ItemLevel,' ',Wrist_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Mage', 'Warlock', 'Shaman Elemental', 'Druid Balance', 'Priest DPS', 'Paladin Healer', 'Priest Healer')) AND (Wrist.itemEntry = 54582) THEN CONCAT('Bis ',Wrist_n.ItemLevel,' ',Wrist_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Druid Healer')) AND (Wrist.itemEntry in (50417,53134)) THEN CONCAT('LBis ',Wrist_n.ItemLevel,' ',Wrist_n.name) \n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Druid Healer')) AND (Wrist.itemEntry in (50630,54584)) THEN CONCAT('Bis ',Wrist_n.ItemLevel,' ',Wrist_n.name) \n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Shaman Healer')) AND (Wrist.itemEntry in (50030)) THEN CONCAT('LBis ',Wrist_n.ItemLevel,' ',Wrist_n.name) \n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Shaman Healer')) AND (Wrist.itemEntry in (50687)) THEN CONCAT('Bis ',Wrist_n.ItemLevel,' ',Wrist_n.name) \n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Druid Feral Tank','Rogue', 'Druid Feral DPS')) AND (Wrist.itemEntry in (50333,53126)) THEN CONCAT('LBis ',Wrist_n.ItemLevel,' ',Wrist_n.name) \n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Druid Feral Tank','Rogue', 'Druid Feral DPS')) AND (Wrist.itemEntry in (50670,54580)) THEN CONCAT('Bis ',Wrist_n.ItemLevel,' ',Wrist_n.name) \n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Hunter',  'Shaman Enhancement')) AND (Wrist.itemEntry in (50000)) THEN CONCAT('LBis ',Wrist_n.ItemLevel,' ',Wrist_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Hunter',  'Shaman Enhancement')) AND (Wrist.itemEntry in (50655)) THEN CONCAT('Bis ',Wrist_n.ItemLevel,' ',Wrist_n.name)\n\tELSE \n\t\tCONCAT(Wrist_n.ItemLevel,' ',Wrist_n.name) \n\tEND AS '10 Wrist', \n\tCASE \n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Warrior DPS')) AND (Hands.itemEntry in (50021)) THEN CONCAT('LBis ',Hands_n.ItemLevel,' ',Hands_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Warrior DPS')) AND (Hands.itemEntry in (50675)) THEN CONCAT('Bis ',Hands_n.ItemLevel,' ',Hands_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Paladin DPS', 'DK DPS')) AND (Hands.itemEntry in (50037)) THEN CONCAT('LBis ',Hands_n.ItemLevel,' ',Hands_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Paladin DPS', 'DK DPS')) AND (Hands.itemEntry in (50690)) THEN CONCAT('Bis ',Hands_n.ItemLevel,' ',Hands_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Warrior Tank', 'Paladin Tank', 'DK Tank')) AND (Hands.itemEntry in (51132,51172,51217)) THEN CONCAT('LBis ',Hands_n.ItemLevel,' ',Hands_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Warrior Tank', 'Paladin Tank', 'DK Tank')) AND (Hands.itemEntry in (51222,51267,51307)) THEN CONCAT('Bis ',Hands_n.ItemLevel,' ',Hands_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Mage', 'Warlock', 'Shaman Elemental', 'Druid Balance', 'Priest DPS')) AND (Hands.itemEntry in (51148,51159,51183,51201,51209)) THEN CONCAT('LBis ',Hands_n.ItemLevel,' ',Hands_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Mage', 'Warlock', 'Shaman Elemental', 'Druid Balance', 'Priest DPS')) AND (Hands.itemEntry in (51291,51256,51238,51230,51280)) THEN CONCAT('Bis ',Hands_n.ItemLevel,' ',Hands_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Paladin Healer', 'Priest Healer', 'Druid Healer')) AND (Hands.itemEntry in (49995,51179,51138)) THEN CONCAT('LBis ',Hands_n.ItemLevel,' ',Hands_n.name) \n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Paladin Healer', 'Priest Healer', 'Druid Healer')) AND (Hands.itemEntry in (50650,51260,51301)) THEN CONCAT('Bis ',Hands_n.ItemLevel,' ',Hands_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Priest Healer')) AND (Hands.itemEntry in (50176)) THEN CONCAT('LBis ',Hands_n.ItemLevel,' ',Hands_n.name) \n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Priest Healer')) AND (Hands.itemEntry in (50722)) THEN CONCAT('Bis ',Hands_n.ItemLevel,' ',Hands_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Shaman Healer')) AND (Hands.itemEntry in (50064)) THEN CONCAT('LBis ',Hands_n.ItemLevel,' ',Hands_n.name) \n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Shaman Healer')) AND (Hands.itemEntry in (50703)) THEN CONCAT('Bis ',Hands_n.ItemLevel,' ',Hands_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Druid Feral Tank', 'Hunter', 'Rogue', 'Shaman Enhancement' )) AND (Hands.itemEntry in (51144,51154,51188,51196)) THEN CONCAT('LBis ',Hands_n.ItemLevel,' ',Hands_n.name) \n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Druid Feral Tank', 'Hunter', 'Rogue', 'Shaman Enhancement' )) AND (Hands.itemEntry in (51295,51285,51251,51243)) THEN CONCAT('Bis ',Hands_n.ItemLevel,' ',Hands_n.name) \n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Rogue', 'Druid Feral DPS' )) AND (Hands.itemEntry in (50021)) THEN CONCAT('LBis ',Hands_n.ItemLevel,' ',Hands_n.name) \n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Rogue', 'Druid Feral DPS' )) AND (Hands.itemEntry in (50675)) THEN CONCAT('Bis ',Hands_n.ItemLevel,' ',Hands_n.name) \n\tELSE \n\t\tCONCAT(Hands_n.ItemLevel,' ',Hands_n.name) \n\tEND AS '11 Hand', \n\tCASE \n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Warrior DPS', 'DK DPS')) AND (Back.itemEntry in (50019,47545)) THEN CONCAT('LBis ',Back_n.ItemLevel,' ',Back_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Warrior DPS', 'DK DPS')) AND (Back.itemEntry in (50677)) THEN CONCAT('Bis ',Back_n.ItemLevel,' ',Back_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Paladin DPS')) AND (Back.itemEntry in (49998)) THEN CONCAT('LBis ',Back_n.ItemLevel,' ',Back_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Paladin DPS')) AND (Back.itemEntry in (50653)) THEN CONCAT('Bis ',Back_n.ItemLevel,' ',Back_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Warrior Tank', 'Paladin Tank', 'DK Tank')) AND (Back.itemEntry = 50466) THEN CONCAT('Bis ',Back_n.ItemLevel,' ',Back_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Mage', 'Warlock', 'Shaman Elemental', 'Druid Balance', 'Priest DPS')) AND (Back.itemEntry = 53489) THEN CONCAT('LBis ',Back_n.ItemLevel,' ',Back_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Mage', 'Warlock', 'Shaman Elemental', 'Druid Balance', 'Priest DPS')) AND (Back.itemEntry = 54583) THEN CONCAT('Bis ',Back_n.ItemLevel,' ',Back_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Paladin Healer', 'Priest Healer', 'Shaman Healer')) AND (Back.itemEntry in (53489)) THEN CONCAT('LBis ',Back_n.ItemLevel,' ',Back_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Paladin Healer', 'Priest Healer', 'Shaman Healer')) AND (Back.itemEntry in (54583)) THEN CONCAT('Bis ',Back_n.ItemLevel,' ',Back_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Priest Healer', 'Druid Healer')) AND (Back.itemEntry in (50014)) THEN CONCAT('LBis ',Back_n.ItemLevel,' ',Back_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Priest Healer', 'Druid Healer')) AND (Back.itemEntry in (50668)) THEN CONCAT('Bis ',Back_n.ItemLevel,' ',Back_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Druid Feral Tank')) AND (Back.itemEntry = 50466) THEN CONCAT('Bis ',Back_n.ItemLevel,' ',Back_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Rogue')) AND (Back.itemEntry = 50470) THEN CONCAT('LBis ',Back_n.ItemLevel,' ',Back_n.name)\t\t\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Hunter', 'Rogue', 'Druid Feral DPS', 'Shaman Enhancement')) AND (Back.itemEntry in (49998,47545)) THEN CONCAT('LBis ',Back_n.ItemLevel,' ',Back_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Hunter', 'Rogue', 'Druid Feral DPS', 'Shaman Enhancement')) AND (Back.itemEntry in (50653)) THEN CONCAT('LBis ',Back_n.ItemLevel,' ',Back_n.name) \n\tELSE \n\t\tCONCAT(Back_n.ItemLevel,' ',Back_n.name) \n\tEND AS '12 Back', \t\t \n\tCASE \n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Warrior DPS')) AND (Finger1.itemEntry in (52571,49999)) THEN CONCAT('LBis ',Finger1_n.ItemLevel,' ',Finger1_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Warrior DPS')) AND (Finger1.itemEntry in (52572,50657)) THEN CONCAT('Bis ',Finger1_n.ItemLevel,' ',Finger1_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Paladin DPS')) AND (Finger1.itemEntry in (52571,50401,50414,53133)) THEN CONCAT('LBis ',Finger1_n.ItemLevel,' ',Finger1_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Paladin DPS')) AND (Finger1.itemEntry in (52572,50402,50693,54576)) THEN CONCAT('Bis ',Finger1_n.ItemLevel,' ',Finger1_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('DK DPS')) AND (Finger1.itemEntry in (52571,50414,49999)) THEN CONCAT('LBis ',Finger1_n.ItemLevel,' ',Finger1_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('DK DPS')) AND (Finger1.itemEntry in (52572,50693,50657)) THEN CONCAT('Bis ',Finger1_n.ItemLevel,' ',Finger1_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Warrior Tank', 'Paladin Tank', 'DK Tank')) AND (Finger1.itemEntry in (50403,50185)) THEN CONCAT('LBis ',Finger1_n.ItemLevel,' ',Finger1_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Warrior Tank', 'Paladin Tank', 'DK Tank')) AND (Finger1.itemEntry in (50622,50404)) THEN CONCAT('Bis ',Finger1_n.ItemLevel,' ',Finger1_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Mage', 'Warlock', 'Shaman Elemental', 'Druid Balance', 'Priest DPS')) AND (Finger1.itemEntry in (50397,50170,49977,50008)) THEN CONCAT('LBis ',Finger1_n.ItemLevel,' ',Finger1_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Mage', 'Warlock', 'Shaman Elemental', 'Druid Balance', 'Priest DPS')) AND (Finger1.itemEntry in (50398,50714,50614,50664)) THEN CONCAT('Bis ',Finger1_n.ItemLevel,' ',Finger1_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Paladin Healer', 'Priest Healer', 'Shaman Healer', 'Druid Healer')) AND (Finger1.itemEntry in (50399)) THEN CONCAT('LBis ',Finger1_n.ItemLevel,' ',Finger1_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Paladin Healer', 'Priest Healer', 'Shaman Healer', 'Druid Healer')) AND (Finger1.itemEntry in (50400)) THEN CONCAT('Bis ',Finger1_n.ItemLevel,' ',Finger1_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Priest Healer', 'Druid Healer')) AND (Finger1.itemEntry in (50424)) THEN CONCAT('LBis ',Finger1_n.ItemLevel,' ',Finger1_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Priest Healer', 'Druid Healer')) AND (Finger1.itemEntry in (50636)) THEN CONCAT('Bis ',Finger1_n.ItemLevel,' ',Finger1_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Priest Healer')) AND (Finger1.itemEntry in (49990)) THEN CONCAT('LBis ',Finger1_n.ItemLevel,' ',Finger1_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Priest Healer')) AND (Finger1.itemEntry in (50664)) THEN CONCAT('Bis ',Finger1_n.ItemLevel,' ',Finger1_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Paladin Healer')) AND (Finger1.itemEntry in (53490)) THEN CONCAT('LBis ',Finger1_n.ItemLevel,' ',Finger1_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Paladin Healer')) AND (Finger1.itemEntry in (54585)) THEN CONCAT('Bis ',Finger1_n.ItemLevel,' ',Finger1_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Paladin Healer','Shaman Healer')) AND (Finger1.itemEntry in (50008)) THEN CONCAT('LBis ',Finger1_n.ItemLevel,' ',Finger1_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Paladin Healer','Shaman Healer')) AND (Finger1.itemEntry in (50664)) THEN CONCAT('Bis ',Finger1_n.ItemLevel,' ',Finger1_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Druid Feral Tank')) AND (Finger1.itemEntry in (50403,50185,50025,53133)) THEN CONCAT('LBis ',Finger1_n.ItemLevel,' ',Finger1_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Druid Feral Tank')) AND (Finger1.itemEntry in (50404,50622,50678,54576)) THEN CONCAT('Bis ',Finger1_n.ItemLevel,' ',Finger1_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Druid Feral DPS')) AND (Finger1.itemEntry in (50401,50186,53133)) THEN CONCAT('LBis ',Finger1_n.ItemLevel,' ',Finger1_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Druid Feral DPS')) AND (Finger1.itemEntry in (50402,40618,54578)) THEN CONCAT('Bis ',Finger1_n.ItemLevel,' ',Finger1_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Hunter', 'Rogue')) AND (Finger1.itemEntry in (50401,50186,53133)) THEN CONCAT('LBis ',Finger1_n.ItemLevel,' ',Finger1_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Hunter', 'Rogue')) AND (Finger1.itemEntry in (50402,50618,54576)) THEN CONCAT('Bis ',Finger1_n.ItemLevel,' ',Finger1_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Shaman Enhancement')) AND (Finger1.itemEntry in (50401,50025)) THEN CONCAT('LBis ',Finger1_n.ItemLevel,' ',Finger1_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Shaman Enhancement')) AND (Finger1.itemEntry in (50402,50678)) THEN CONCAT('Bis ',Finger1_n.ItemLevel,' ',Finger1_n.name) \n\tELSE \n\t\tCONCAT(Finger1_n.ItemLevel,' ',Finger1_n.name) \n\tEND AS '13 Finger 1',\n\tCASE \n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Warrior DPS')) AND (Finger2.itemEntry in (52571,49999)) THEN CONCAT('LBis ',Finger2_n.ItemLevel,' ',Finger2_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Warrior DPS')) AND (Finger2.itemEntry in (52572,50657)) THEN CONCAT('Bis ',Finger2_n.ItemLevel,' ',Finger2_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Paladin DPS')) AND (Finger2.itemEntry in (52571,50401,50414,53133)) THEN CONCAT('LBis ',Finger2_n.ItemLevel,' ',Finger2_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Paladin DPS')) AND (Finger2.itemEntry in (52572,50402,50693,54576)) THEN CONCAT('Bis ',Finger2_n.ItemLevel,' ',Finger2_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('DK DPS')) AND (Finger2.itemEntry in (52571,50414,49999)) THEN CONCAT('LBis ',Finger2_n.ItemLevel,' ',Finger2_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('DK DPS')) AND (Finger2.itemEntry in (52572,50693,50657)) THEN CONCAT('Bis ',Finger2_n.ItemLevel,' ',Finger2_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Warrior Tank', 'Paladin Tank', 'DK Tank')) AND (Finger2.itemEntry in (50403,50185)) THEN CONCAT('LBis ',Finger2_n.ItemLevel,' ',Finger2_n.name) \n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Warrior Tank', 'Paladin Tank', 'DK Tank')) AND (Finger2.itemEntry in (50622,50404)) THEN CONCAT('Bis ',Finger2_n.ItemLevel,' ',Finger2_n.name) \n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Mage', 'Warlock', 'Shaman Elemental', 'Druid Balance', 'Priest DPS')) AND (Finger2.itemEntry in (50397,50170,49977,50008)) THEN CONCAT('LBis ',Finger2_n.ItemLevel,' ',Finger2_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Mage', 'Warlock', 'Shaman Elemental', 'Druid Balance', 'Priest DPS')) AND (Finger2.itemEntry in (50398,50714,50614,50664)) THEN CONCAT('Bis ',Finger2_n.ItemLevel,' ',Finger2_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Paladin Healer', 'Priest Healer', 'Shaman Healer', 'Druid Healer')) AND (Finger2.itemEntry in (50399)) THEN CONCAT('LBis ',Finger2_n.ItemLevel,' ',Finger2_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Paladin Healer', 'Priest Healer', 'Shaman Healer', 'Druid Healer')) AND (Finger2.itemEntry in (50400)) THEN CONCAT('Bis ',Finger2_n.ItemLevel,' ',Finger2_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Priest Healer', 'Druid Healer')) AND (Finger2.itemEntry in (50424)) THEN CONCAT('LBis ',Finger2_n.ItemLevel,' ',Finger2_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Priest Healer', 'Druid Healer')) AND (Finger2.itemEntry in (50636)) THEN CONCAT('Bis ',Finger2_n.ItemLevel,' ',Finger2_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Priest Healer')) AND (Finger2.itemEntry in (49990)) THEN CONCAT('LBis ',Finger2_n.ItemLevel,' ',Finger2_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Priest Healer')) AND (Finger2.itemEntry in (50664)) THEN CONCAT('Bis ',Finger2_n.ItemLevel,' ',Finger2_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Paladin Healer')) AND (Finger2.itemEntry in (53490)) THEN CONCAT('LBis ',Finger2_n.ItemLevel,' ',Finger2_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Paladin Healer')) AND (Finger2.itemEntry in (54585)) THEN CONCAT('Bis ',Finger2_n.ItemLevel,' ',Finger2_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Paladin Healer','Shaman Healer')) AND (Finger2.itemEntry in (50008)) THEN CONCAT('LBis ',Finger2_n.ItemLevel,' ',Finger2_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Paladin Healer','Shaman Healer')) AND (Finger2.itemEntry in (50664)) THEN CONCAT('Bis ',Finger2_n.ItemLevel,' ',Finger2_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Druid Feral Tank')) AND (Finger2.itemEntry in (50403,50185,50025,53133)) THEN CONCAT('LBis ',Finger2_n.ItemLevel,' ',Finger2_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Druid Feral Tank')) AND (Finger2.itemEntry in (50404,50622,50678,54576)) THEN CONCAT('Bis ',Finger2_n.ItemLevel,' ',Finger2_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Druid Feral DPS')) AND (Finger2.itemEntry in (50401,50186,53133)) THEN CONCAT('LBis ',Finger2_n.ItemLevel,' ',Finger2_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Druid Feral DPS')) AND (Finger2.itemEntry in (50402,40618,54578)) THEN CONCAT('Bis ',Finger2_n.ItemLevel,' ',Finger2_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Hunter', 'Rogue')) AND (Finger2.itemEntry in (50401,50186,53133)) THEN CONCAT('LBis ',Finger2_n.ItemLevel,' ',Finger2_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Hunter', 'Rogue')) AND (Finger2.itemEntry in (50402,50618,54576)) THEN CONCAT('Bis ',Finger2_n.ItemLevel,' ',Finger2_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Shaman Enhancement')) AND (Finger2.itemEntry in (50401,50025)) THEN CONCAT('LBis ',Finger2_n.ItemLevel,' ',Finger2_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Shaman Enhancement')) AND (Finger2.itemEntry in (50402,50678)) THEN CONCAT('Bis ',Finger2_n.ItemLevel,' ',Finger2_n.name)  \n\tELSE\n\t\tCONCAT(Finger2_n.ItemLevel,' ',Finger2_n.name) \n\tEND AS '14 Finger 2',\n\tCASE \n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Warrior DPS', 'DK DPS')) AND (Trinket1.itemEntry in (50362,54569)) THEN CONCAT('LBis ',Trinket1_n.ItemLevel,' ',Trinket1_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Warrior DPS', 'DK DPS')) AND (Trinket1.itemEntry in (50363,54590)) THEN CONCAT('Bis ',Trinket1_n.ItemLevel,' ',Trinket1_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Paladin DPS')) AND (Trinket1.itemEntry in (54569,50351)) THEN CONCAT('LBis ',Trinket1_n.ItemLevel,' ',Trinket1_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Paladin DPS')) AND (Trinket1.itemEntry in (54590,50706)) THEN CONCAT('Bis ',Trinket1_n.ItemLevel,' ',Trinket1_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Warrior Tank', 'DK Tank')) AND (Trinket1.itemEntry in (50352,50356,54571,50361,50341)) THEN CONCAT('LBis ',Trinket1_n.ItemLevel,' ',Trinket1_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Warrior Tank', 'DK Tank')) AND (Trinket1.itemEntry in (50349,54591,50364,50344)) THEN CONCAT('Bis ',Trinket1_n.ItemLevel,' ',Trinket1_n.name) \n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Paladin Tank')) AND (Trinket1.itemEntry in (54571,50361)) THEN CONCAT('LBis ',Trinket1_n.ItemLevel,' ',Trinket1_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Paladin Tank')) AND (Trinket1.itemEntry in (54591,50364)) THEN CONCAT('Bis ',Trinket1_n.ItemLevel,' ',Trinket1_n.name) \n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Mage', 'Warlock', 'Shaman Elemental', 'Druid Balance', 'Priest DPS')) AND (Trinket1.itemEntry in (54572,50360,50353)) THEN CONCAT('LBis ',Trinket1_n.ItemLevel,' ',Trinket1_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Mage', 'Warlock', 'Shaman Elemental', 'Druid Balance', 'Priest DPS')) AND (Trinket1.itemEntry in (54588,50365,50348)) THEN CONCAT('Bis ',Trinket1_n.ItemLevel,' ',Trinket1_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Priest Healer', 'Shaman Healer', 'Druid Healer')) AND (Trinket1.itemEntry in (50359,54573)) THEN CONCAT('LBis ',Trinket1_n.ItemLevel,' ',Trinket1_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Priest Healer', 'Shaman Healer', 'Druid Healer')) AND (Trinket1.itemEntry in (50366,54589)) THEN CONCAT('Bis ',Trinket1_n.ItemLevel,' ',Trinket1_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Paladin Healer')) AND (Trinket1.itemEntry in (56051,47041,48724)) THEN CONCAT('LBis ',Trinket1_n.ItemLevel,' ',Trinket1_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Paladin Healer')) AND (Trinket1.itemEntry in (47059)) THEN CONCAT('Bis ',Trinket1_n.ItemLevel,' ',Trinket1_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Druid Feral Tank')) AND (Trinket1.itemEntry in (50356,50361,50341)) THEN CONCAT('LBis ',Trinket1_n.ItemLevel,' ',Trinket1_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Druid Feral Tank')) AND (Trinket1.itemEntry in (50364,50344)) THEN CONCAT('Bis ',Trinket1_n.ItemLevel,' ',Trinket1_n.name) \n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Hunter','Druid Feral DPS', 'Rogue')) AND (Trinket1.itemEntry in (50362,64569)) THEN CONCAT('LBis ',Trinket1_n.ItemLevel,' ',Trinket1_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Hunter','Druid Feral DPS', 'Rogue')) AND (Trinket1.itemEntry in (50363,54590)) THEN CONCAT('Bis ',Trinket1_n.ItemLevel,' ',Trinket1_n.name) \n\t\tWHEN (characters_npcbot_class_role.class_role IN ( 'Rogue', 'Shaman Enhancement')) AND (Trinket1.itemEntry in (54569,50351)) THEN CONCAT('LBis ',Trinket1_n.ItemLevel,' ',Trinket1_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ( 'Rogue', 'Shaman Enhancement')) AND (Trinket1.itemEntry in (54590,50506)) THEN CONCAT('Bis ',Trinket1_n.ItemLevel,' ',Trinket1_n.name) \n\tELSE \n\t\tCONCAT(Trinket1_n.ItemLevel,' ',Trinket1_n.name) \n\tEND AS '15 Trincket 1',\n\tCASE \n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Warrior DPS', 'DK DPS')) AND (Trinket2.itemEntry in (50362,54569)) THEN CONCAT('LBis ',Trinket2_n.ItemLevel,' ',Trinket2_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Warrior DPS', 'DK DPS')) AND (Trinket2.itemEntry in (50363,54590)) THEN CONCAT('Bis ',Trinket2_n.ItemLevel,' ',Trinket2_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Paladin DPS')) AND (Trinket2.itemEntry in (54569,50351)) THEN CONCAT('LBis ',Trinket2_n.ItemLevel,' ',Trinket2_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Paladin DPS')) AND (Trinket2.itemEntry in (54590,50706)) THEN CONCAT('Bis ',Trinket2_n.ItemLevel,' ',Trinket2_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Warrior Tank', 'DK Tank')) AND (Trinket2.itemEntry in (50352,50356,54571,50361,50341)) THEN CONCAT('LBis ',Trinket2_n.ItemLevel,' ',Trinket2_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Warrior Tank', 'DK Tank')) AND (Trinket2.itemEntry in (50349,54591,50364,50344)) THEN CONCAT('Bis ',Trinket2_n.ItemLevel,' ',Trinket2_n.name) \n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Paladin Tank')) AND (Trinket2.itemEntry in (54571,50361)) THEN CONCAT('LBis ',Trinket2_n.ItemLevel,' ',Trinket2_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Paladin Tank')) AND (Trinket2.itemEntry in (54591,50364)) THEN CONCAT('Bis ',Trinket2_n.ItemLevel,' ',Trinket2_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Mage', 'Warlock', 'Shaman Elemental', 'Druid Balance', 'Priest DPS')) AND (Trinket2.itemEntry in (54572,50360,50353)) THEN CONCAT('LBis ',Trinket2_n.ItemLevel,' ',Trinket2_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Mage', 'Warlock', 'Shaman Elemental', 'Druid Balance', 'Priest DPS')) AND (Trinket2.itemEntry in (54588,50365,50348)) THEN CONCAT('Bis ',Trinket2_n.ItemLevel,' ',Trinket2_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Priest Healer', 'Shaman Healer', 'Druid Healer')) AND (Trinket2.itemEntry in (50359,54573)) THEN CONCAT('LBis ',Trinket2_n.ItemLevel,' ',Trinket2_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Priest Healer', 'Shaman Healer', 'Druid Healer')) AND (Trinket2.itemEntry in (50366,54589)) THEN CONCAT('Bis ',Trinket2_n.ItemLevel,' ',Trinket2_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Paladin Healer')) AND (Trinket2.itemEntry in (56051,47041,48724)) THEN CONCAT('LBis ',Trinket2_n.ItemLevel,' ',Trinket2_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Paladin Healer')) AND (Trinket2.itemEntry in (47059)) THEN CONCAT('Bis ',Trinket2_n.ItemLevel,' ',Trinket2_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Druid Feral Tank')) AND (Trinket2.itemEntry in (50356,50361,50341)) THEN CONCAT('LBis ',Trinket2_n.ItemLevel,' ',Trinket2_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Druid Feral Tank')) AND (Trinket2.itemEntry in (50364,50344)) THEN CONCAT('Bis ',Trinket2_n.ItemLevel,' ',Trinket2_n.name) \n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Hunter','Druid Feral DPS', 'Rogue')) AND (Trinket2.itemEntry in (50362,64569)) THEN CONCAT('LBis ',Trinket2_n.ItemLevel,' ',Trinket2_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Hunter','Druid Feral DPS', 'Rogue')) AND (Trinket2.itemEntry in (50363,54590)) THEN CONCAT('Bis ',Trinket2_n.ItemLevel,' ',Trinket2_n.name) \n\t\tWHEN (characters_npcbot_class_role.class_role IN ( 'Rogue', 'Shaman Enhancement')) AND (Trinket2.itemEntry in (54569,50351)) THEN CONCAT('LBis ',Trinket2_n.ItemLevel,' ',Trinket2_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ( 'Rogue', 'Shaman Enhancement')) AND (Trinket2.itemEntry in (54590,50506)) THEN CONCAT('Bis ',Trinket2_n.ItemLevel,' ',Trinket2_n.name) \n\tELSE \n\t\tCONCAT(Trinket2_n.ItemLevel,' ',Trinket2_n.name) \n\tEND AS '16 Trincket 2', \n\tCASE \n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Warrior DPS', 'Paladin DPS', 'DK DPS')) AND (Neck.itemEntry in (53132)) THEN CONCAT('LBis ',Neck_n.ItemLevel,' ',Neck_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Warrior DPS', 'Paladin DPS', 'DK DPS')) AND (Neck.itemEntry in (54581)) THEN CONCAT('Bis ',Neck_n.ItemLevel,' ',Neck_n.name) \n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Warrior Tank', 'Paladin Tank', 'DK Tank')) AND (Neck.itemEntry in (50023)) THEN CONCAT('LBis ',Neck_n.ItemLevel,' ',Neck_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Warrior Tank', 'Paladin Tank', 'DK Tank')) AND (Neck.itemEntry in (50682)) THEN CONCAT('Bis ',Neck_n.ItemLevel,' ',Neck_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Mage', 'Warlock', 'Shaman Elemental', 'Druid Balance', 'Priest DPS')) AND (Neck.itemEntry = 50182) THEN CONCAT('LBis ',Neck_n.ItemLevel,' ',Neck_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Mage', 'Warlock', 'Shaman Elemental', 'Druid Balance', 'Priest DPS')) AND (Neck.itemEntry = 50724) THEN CONCAT('Bis ',Neck_n.ItemLevel,' ',Neck_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Paladin Healer', 'Priest Healer', 'Shaman Healer')) AND (Neck.itemEntry in (50182)) THEN CONCAT('LBis ',Neck_n.ItemLevel,' ',Neck_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Paladin Healer', 'Priest Healer', 'Shaman Healer')) AND (Neck.itemEntry in (50724)) THEN CONCAT('Bis ',Neck_n.ItemLevel,' ',Neck_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Priest Healer', 'Druid Healer')) AND (Neck.itemEntry in (49975)) THEN CONCAT('LBis ',Neck_n.ItemLevel,' ',Neck_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Priest Healer', 'Druid Healer')) AND (Neck.itemEntry in (50609)) THEN CONCAT('Bis ',Neck_n.ItemLevel,' ',Neck_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Druid Feral Tank')) AND (Neck.itemEntry = 50023) THEN CONCAT('LBis ',Neck_n.ItemLevel,' ',Neck_n.name) \n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Druid Feral Tank')) AND (Neck.itemEntry = 50682) THEN CONCAT('Bis ',Neck_n.ItemLevel,' ',Neck_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Hunter', 'Rogue', 'Druid Feral DPS', 'Shaman Enhancement')) AND (Neck.itemEntry = 50421) THEN CONCAT('LBis ',Neck_n.ItemLevel,' ',Neck_n.name)\n\t\tWHEN (characters_npcbot_class_role.class_role IN ('Hunter', 'Rogue', 'Druid Feral DPS', 'Shaman Enhancement')) AND (Neck.itemEntry = 50633) THEN CONCAT('Bis ',Neck_n.ItemLevel,' ',Neck_n.name) \n\tELSE \n\t\tCONCAT(Neck_n.ItemLevel,' ',Neck_n.name) \n\tEND AS '17 Neck', \n\t\t case\n\t\t\t #Strength DPS\n\t\t     when (characters_npcbot_class_role.class_role IN ('Warrior DPS', 'Paladin DPS', 'DK DPS')) then \n\t\t     \t\tcase \n\t\t\t \t  \t\twhen (MhEx_n.stat_type1 = 4 or MhEx_n.stat_type2 = 4 or MhEx_n.stat_type3 = 4 or MhEx_n.stat_type4 = 4 or MhEx_n.stat_type5 = 4 or MhEx_n.stat_type6 = 4) AND (MhEx_n.stat_type1 IN (12,13,14) or MhEx_n.stat_type2 IN (12,13,14) or MhEx_n.stat_type3 IN (12,13,14) or MhEx_n.stat_type4 IN (12,13,14) or MhEx_n.stat_type5 IN (12,13,14) or MhEx_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (MhEx_n.stat_type1 = 3 or MhEx_n.stat_type2 = 3 or MhEx_n.stat_type3 = 3 or MhEx_n.stat_type4 = 3 or MhEx_n.stat_type5 = 3 or MhEx_n.stat_type6 = 3) AND (MhEx_n.stat_type1 IN (12,13,14) or MhEx_n.stat_type2 IN (12,13,14) or MhEx_n.stat_type3 IN (12,13,14) or MhEx_n.stat_type4 IN (12,13,14) or MhEx_n.stat_type5 IN (12,13,14) or MhEx_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (MhEx_n.stat_type1 = 4 or MhEx_n.stat_type2 = 4 or MhEx_n.stat_type3 = 4 or MhEx_n.stat_type4 = 4 or MhEx_n.stat_type5 = 4 or MhEx_n.stat_type6 = 4) AND (MhEx_n.stat_type1 IN (0,31,32,38,44) or MhEx_n.stat_type2 IN (0,31,32,38,44) or MhEx_n.stat_type3 IN (0,31,32,38,44) or MhEx_n.stat_type4 IN (0,31,32,38,44) or MhEx_n.stat_type5 IN (0,31,32,38,44) or MhEx_n.stat_type6 IN (0,31,32,38,44)) then \n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen MhEx_n.ItemLevel >=200 AND MhEx_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen MhEx_n.socketColor_1 = 0 and MhEx_n.socketColor_2 = 0 and MhEx_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\t\twhen left(MhEx.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\twhen MhEx.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\twhen left(MhEx.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(MhEx.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen MhEx_n.ItemLevel >= 251 AND MhEx_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen MhEx_n.ItemLevel >= 264 AND MhEx_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen MhEx_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND \n\t\t\t \t  \t\twhen (MhEx_n.stat_type1 = 3 or MhEx_n.stat_type2 = 3 or MhEx_n.stat_type3 = 3 or MhEx_n.stat_type4 = 3 or MhEx_n.stat_type5 = 3 or MhEx_n.stat_type6 = 3) AND (MhEx_n.stat_type1 IN (0,31,32,38,44) or MhEx_n.stat_type2 IN (0,31,32,38,44) or MhEx_n.stat_type3 IN (0,31,32,38,44) or MhEx_n.stat_type4 IN (0,31,32,38,44) or MhEx_n.stat_type5 IN (0,31,32,38,44) or MhEx_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (MhEx_n.stat_type1 = 5 or MhEx_n.stat_type2 = 5 or MhEx_n.stat_type3 = 5 or MhEx_n.stat_type4 = 5 or MhEx_n.stat_type5 = 5 or MhEx_n.stat_type6 = 5) AND (MhEx_n.stat_type1 IN (31) or MhEx_n.stat_type2 IN (31) or MhEx_n.stat_type3 IN (31) or MhEx_n.stat_type4 IN (31) or MhEx_n.stat_type5 IN (31) or MhEx_n.stat_type6 IN (31)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (MhEx_n.stat_type1 = 5 or MhEx_n.stat_type2 = 5 or MhEx_n.stat_type3 = 5 or MhEx_n.stat_type4 = 5 or MhEx_n.stat_type5 = 5 or MhEx_n.stat_type6 = 5) AND (MhEx_n.stat_type1 IN (32,36,45) or MhEx_n.stat_type2 IN (32,36,45) or MhEx_n.stat_type3 IN (32,36,45) or MhEx_n.stat_type4 IN (32,36,45) or MhEx_n.stat_type5 IN (32,36,45) or MhEx_n.stat_type6 IN (32,36,45)) then '1 Gear with wrong stat'\n\t\t\t \t  \tEND\n\t\t\t #Strength Tank\n\t\t     when (characters_npcbot_class_role.class_role IN ('Warrior Tank', 'Paladin Tank', 'DK Tank')) then\n\t\t     \t\tcase \n\t\t\t \t  \t\twhen (MhEx_n.stat_type1 = 4 or MhEx_n.stat_type2 = 4 or MhEx_n.stat_type3 = 4 or MhEx_n.stat_type4 = 4 or MhEx_n.stat_type5 = 4 or MhEx_n.stat_type6 = 4) AND (MhEx_n.stat_type1 IN (12,13,14) or MhEx_n.stat_type2 IN (12,13,14) or MhEx_n.stat_type3 IN (12,13,14) or MhEx_n.stat_type4 IN (12,13,14) or MhEx_n.stat_type5 IN (12,13,14) or MhEx_n.stat_type6 IN (12,13,14)) then \n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen MhEx_n.ItemLevel >=200 AND MhEx_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen MhEx_n.socketColor_1 = 0 and MhEx_n.socketColor_2 = 0 and MhEx_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\t\twhen left(MhEx.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\twhen MhEx.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\twhen left(MhEx.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(MhEx.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen MhEx_n.ItemLevel >= 251 AND MhEx_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen MhEx_n.ItemLevel >= 264 AND MhEx_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen MhEx_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t\t\t \t  \t\twhen (MhEx_n.stat_type1 = 3 or MhEx_n.stat_type2 = 3 or MhEx_n.stat_type3 = 3 or MhEx_n.stat_type4 = 3 or MhEx_n.stat_type5 = 3 or MhEx_n.stat_type6 = 3) AND (MhEx_n.stat_type1 IN (12,13,14) or MhEx_n.stat_type2 IN (12,13,14) or MhEx_n.stat_type3 IN (12,13,14) or MhEx_n.stat_type4 IN (12,13,14) or MhEx_n.stat_type5 IN (12,13,14) or MhEx_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (MhEx_n.stat_type1 = 4 or MhEx_n.stat_type2 = 4 or MhEx_n.stat_type3 = 4 or MhEx_n.stat_type4 = 4 or MhEx_n.stat_type5 = 4 or MhEx_n.stat_type6 = 4) AND (MhEx_n.stat_type1 IN (0,31,32,38,44) or MhEx_n.stat_type2 IN (0,31,32,38,44) or MhEx_n.stat_type3 IN (0,31,32,38,44) or MhEx_n.stat_type4 IN (0,31,32,38,44) or MhEx_n.stat_type5 IN (0,31,32,38,44) or MhEx_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (MhEx_n.stat_type1 = 3 or MhEx_n.stat_type2 = 3 or MhEx_n.stat_type3 = 3 or MhEx_n.stat_type4 = 3 or MhEx_n.stat_type5 = 3 or MhEx_n.stat_type6 = 3) AND (MhEx_n.stat_type1 IN (0,31,32,38,44) or MhEx_n.stat_type2 IN (0,31,32,38,44) or MhEx_n.stat_type3 IN (0,31,32,38,44) or MhEx_n.stat_type4 IN (0,31,32,38,44) or MhEx_n.stat_type5 IN (0,31,32,38,44) or MhEx_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (MhEx_n.stat_type1 = 5 or MhEx_n.stat_type2 = 5 or MhEx_n.stat_type3 = 5 or MhEx_n.stat_type4 = 5 or MhEx_n.stat_type5 = 5 or MhEx_n.stat_type6 = 5) AND (MhEx_n.stat_type1 IN (31) or MhEx_n.stat_type2 IN (31) or MhEx_n.stat_type3 IN (31) or MhEx_n.stat_type4 IN (31) or MhEx_n.stat_type5 IN (31) or MhEx_n.stat_type6 IN (31)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (MhEx_n.stat_type1 = 5 or MhEx_n.stat_type2 = 5 or MhEx_n.stat_type3 = 5 or MhEx_n.stat_type4 = 5 or MhEx_n.stat_type5 = 5 or MhEx_n.stat_type6 = 5) AND (MhEx_n.stat_type1 IN (32,36,45) or MhEx_n.stat_type2 IN (32,36,45) or MhEx_n.stat_type3 IN (32,36,45) or MhEx_n.stat_type4 IN (32,36,45) or MhEx_n.stat_type5 IN (32,36,45) or MhEx_n.stat_type6 IN (32,36,45)) then '1 Gear with wrong stat'\n\t\t\t \t  \tEND\n\t\t\t \t#Magic DPS\n\t\t      when (characters_npcbot_class_role.class_role IN ('Mage', 'Warlock', 'Shaman Elemental', 'Druid Balance', 'Priest DPS')) then\n\t\t\t \t\tcase \n\t\t\t \t  \t\twhen (MhEx_n.stat_type1 = 4 or MhEx_n.stat_type2 = 4 or MhEx_n.stat_type3 = 4 or MhEx_n.stat_type4 = 4 or MhEx_n.stat_type5 = 4 or MhEx_n.stat_type6 = 4) AND (MhEx_n.stat_type1 IN (12,13,14) or MhEx_n.stat_type2 IN (12,13,14) or MhEx_n.stat_type3 IN (12,13,14) or MhEx_n.stat_type4 IN (12,13,14) or MhEx_n.stat_type5 IN (12,13,14) or MhEx_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (MhEx_n.stat_type1 = 3 or MhEx_n.stat_type2 = 3 or MhEx_n.stat_type3 = 3 or MhEx_n.stat_type4 = 3 or MhEx_n.stat_type5 = 3 or MhEx_n.stat_type6 = 3) AND (MhEx_n.stat_type1 IN (12,13,14) or MhEx_n.stat_type2 IN (12,13,14) or MhEx_n.stat_type3 IN (12,13,14) or MhEx_n.stat_type4 IN (12,13,14) or MhEx_n.stat_type5 IN (12,13,14) or MhEx_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (MhEx_n.stat_type1 = 4 or MhEx_n.stat_type2 = 4 or MhEx_n.stat_type3 = 4 or MhEx_n.stat_type4 = 4 or MhEx_n.stat_type5 = 4 or MhEx_n.stat_type6 = 4) AND (MhEx_n.stat_type1 IN (0,31,32,38,44) or MhEx_n.stat_type2 IN (0,31,32,38,44) or MhEx_n.stat_type3 IN (0,31,32,38,44) or MhEx_n.stat_type4 IN (0,31,32,38,44) or MhEx_n.stat_type5 IN (0,31,32,38,44) or MhEx_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (MhEx_n.stat_type1 = 3 or MhEx_n.stat_type2 = 3 or MhEx_n.stat_type3 = 3 or MhEx_n.stat_type4 = 3 or MhEx_n.stat_type5 = 3 or MhEx_n.stat_type6 = 3) AND (MhEx_n.stat_type1 IN (0,31,32,38,44) or MhEx_n.stat_type2 IN (0,31,32,38,44) or MhEx_n.stat_type3 IN (0,31,32,38,44) or MhEx_n.stat_type4 IN (0,31,32,38,44) or MhEx_n.stat_type5 IN (0,31,32,38,44) or MhEx_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (MhEx_n.stat_type1 = 5 or MhEx_n.stat_type2 = 5 or MhEx_n.stat_type3 = 5 or MhEx_n.stat_type4 = 5 or MhEx_n.stat_type5 = 5 or MhEx_n.stat_type6 = 5) AND (MhEx_n.stat_type1 IN (31) or MhEx_n.stat_type2 IN (31) or MhEx_n.stat_type3 IN (31) or MhEx_n.stat_type4 IN (31) or MhEx_n.stat_type5 IN (31) or MhEx_n.stat_type6 IN (31)) then\n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen MhEx_n.ItemLevel >=200 AND MhEx_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen MhEx_n.socketColor_1 = 0 and MhEx_n.socketColor_2 = 0 and MhEx_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\t\twhen left(MhEx.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\twhen MhEx.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\twhen left(MhEx.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(MhEx.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen MhEx_n.ItemLevel >= 251 AND MhEx_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen MhEx_n.ItemLevel >= 264 AND MhEx_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen MhEx_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t\t\t\t  \t\twhen (MhEx_n.stat_type1 = 5 or MhEx_n.stat_type2 = 5 or MhEx_n.stat_type3 = 5 or MhEx_n.stat_type4 = 5 or MhEx_n.stat_type5 = 5 or MhEx_n.stat_type6 = 5) AND (MhEx_n.stat_type1 IN (32,36,45) or MhEx_n.stat_type2 IN (32,36,45) or MhEx_n.stat_type3 IN (32,36,45) or MhEx_n.stat_type4 IN (32,36,45) or MhEx_n.stat_type5 IN (32,36,45) or MhEx_n.stat_type6 IN (32,36,45)) then \n\t\t\t\t\t\t  \t\tcase\n\t\t\t\t\t\t  \t\t\twhen MhEx_n.ItemLevel >=200 AND MhEx_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t  \t\t\twhen MhEx_n.socketColor_1 = 0 and MhEx_n.socketColor_2 = 0 and MhEx_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\t\twhen left(MhEx.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\twhen MhEx.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\twhen left(MhEx.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(MhEx.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen MhEx_n.ItemLevel >= 251 AND MhEx_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen MhEx_n.ItemLevel >= 264 AND MhEx_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen MhEx_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t\t\t \t  \tEND\n\t\t\t  #Healer / DPS\n\t\t     when (characters_npcbot_class_role.class_role IN ('Paladin Healer', 'Priest Healer', 'Warlock', 'Mage', 'Shaman Healer', 'Druid Healer')) then \n\t\t\t \t\tcase \n\t\t\t \t  \t\twhen (MhEx_n.stat_type1 = 4 or MhEx_n.stat_type2 = 4 or MhEx_n.stat_type3 = 4 or MhEx_n.stat_type4 = 4 or MhEx_n.stat_type5 = 4 or MhEx_n.stat_type6 = 4) AND (MhEx_n.stat_type1 IN (12,13,14) or MhEx_n.stat_type2 IN (12,13,14) or MhEx_n.stat_type3 IN (12,13,14) or MhEx_n.stat_type4 IN (12,13,14) or MhEx_n.stat_type5 IN (12,13,14) or MhEx_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (MhEx_n.stat_type1 = 3 or MhEx_n.stat_type2 = 3 or MhEx_n.stat_type3 = 3 or MhEx_n.stat_type4 = 3 or MhEx_n.stat_type5 = 3 or MhEx_n.stat_type6 = 3) AND (MhEx_n.stat_type1 IN (12,13,14) or MhEx_n.stat_type2 IN (12,13,14) or MhEx_n.stat_type3 IN (12,13,14) or MhEx_n.stat_type4 IN (12,13,14) or MhEx_n.stat_type5 IN (12,13,14) or MhEx_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (MhEx_n.stat_type1 = 4 or MhEx_n.stat_type2 = 4 or MhEx_n.stat_type3 = 4 or MhEx_n.stat_type4 = 4 or MhEx_n.stat_type5 = 4 or MhEx_n.stat_type6 = 4) AND (MhEx_n.stat_type1 IN (0,31,32,38,44) or MhEx_n.stat_type2 IN (0,31,32,38,44) or MhEx_n.stat_type3 IN (0,31,32,38,44) or MhEx_n.stat_type4 IN (0,31,32,38,44) or MhEx_n.stat_type5 IN (0,31,32,38,44) or MhEx_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (MhEx_n.stat_type1 = 3 or MhEx_n.stat_type2 = 3 or MhEx_n.stat_type3 = 3 or MhEx_n.stat_type4 = 3 or MhEx_n.stat_type5 = 3 or MhEx_n.stat_type6 = 3) AND (MhEx_n.stat_type1 IN (0,31,32,38,44) or MhEx_n.stat_type2 IN (0,31,32,38,44) or MhEx_n.stat_type3 IN (0,31,32,38,44) or MhEx_n.stat_type4 IN (0,31,32,38,44) or MhEx_n.stat_type5 IN (0,31,32,38,44) or MhEx_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (MhEx_n.stat_type1 = 5 or MhEx_n.stat_type2 = 5 or MhEx_n.stat_type3 = 5 or MhEx_n.stat_type4 = 5 or MhEx_n.stat_type5 = 5 or MhEx_n.stat_type6 = 5) AND (MhEx_n.stat_type1 IN (31) or MhEx_n.stat_type2 IN (31) or MhEx_n.stat_type3 IN (31) or MhEx_n.stat_type4 IN (31) or MhEx_n.stat_type5 IN (31) or MhEx_n.stat_type6 IN (31)) then '2 Gear not optimal for Healer'\n\t\t\t\t  \t\twhen (MhEx_n.stat_type1 = 5 or MhEx_n.stat_type2 = 5 or MhEx_n.stat_type3 = 5 or MhEx_n.stat_type4 = 5 or MhEx_n.stat_type5 = 5 or MhEx_n.stat_type6 = 5) AND (MhEx_n.stat_type1 IN (32,36,45) or MhEx_n.stat_type2 IN (32,36,45) or MhEx_n.stat_type3 IN (32,36,45) or MhEx_n.stat_type4 IN (32,36,45) or MhEx_n.stat_type5 IN (32,36,45) or MhEx_n.stat_type6 IN (32,36,45)) then\n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen MhEx_n.ItemLevel >=200 AND MhEx_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen MhEx_n.socketColor_1 = 0 and MhEx_n.socketColor_2 = 0 and MhEx_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\t\twhen left(MhEx.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\twhen MhEx.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\twhen left(MhEx.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(MhEx.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen MhEx_n.ItemLevel >= 251 AND MhEx_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen MhEx_n.ItemLevel >= 264 AND MhEx_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen MhEx_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t\t\t \t  \tEND\n\t\t\t \t#Agility Tank\n\t\t     when (characters_npcbot_class_role.class_role IN ('Druid Feral Tank')) then \n\t\t\t \t\tcase \n\t\t\t \t  \t\twhen (MhEx_n.stat_type1 = 4 or MhEx_n.stat_type2 = 4 or MhEx_n.stat_type3 = 4 or MhEx_n.stat_type4 = 4 or MhEx_n.stat_type5 = 4 or MhEx_n.stat_type6 = 4) AND (MhEx_n.stat_type1 IN (12,13,14) or MhEx_n.stat_type2 IN (12,13,14) or MhEx_n.stat_type3 IN (12,13,14) or MhEx_n.stat_type4 IN (12,13,14) or MhEx_n.stat_type5 IN (12,13,14) or MhEx_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (MhEx_n.stat_type1 = 3 or MhEx_n.stat_type2 = 3 or MhEx_n.stat_type3 = 3 or MhEx_n.stat_type4 = 3 or MhEx_n.stat_type5 = 3 or MhEx_n.stat_type6 = 3) AND (MhEx_n.stat_type1 IN (12,13,14) or MhEx_n.stat_type2 IN (12,13,14) or MhEx_n.stat_type3 IN (12,13,14) or MhEx_n.stat_type4 IN (12,13,14) or MhEx_n.stat_type5 IN (12,13,14) or MhEx_n.stat_type6 IN (12,13,14)) then\n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen MhEx_n.ItemLevel >=200 AND MhEx_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen MhEx_n.socketColor_1 = 0 and MhEx_n.socketColor_2 = 0 and MhEx_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\t\twhen left(MhEx.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\twhen MhEx.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\twhen left(MhEx.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(MhEx.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen MhEx_n.ItemLevel >= 251 AND MhEx_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen MhEx_n.ItemLevel >= 264 AND MhEx_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen MhEx_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t  \t\t\t  \t\twhen (MhEx_n.stat_type1 = 4 or MhEx_n.stat_type2 = 4 or MhEx_n.stat_type3 = 4 or MhEx_n.stat_type4 = 4 or MhEx_n.stat_type5 = 4 or MhEx_n.stat_type6 = 4) AND (MhEx_n.stat_type1 IN (0,31,32,38,44) or MhEx_n.stat_type2 IN (0,31,32,38,44) or MhEx_n.stat_type3 IN (0,31,32,38,44) or MhEx_n.stat_type4 IN (0,31,32,38,44) or MhEx_n.stat_type5 IN (0,31,32,38,44) or MhEx_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (MhEx_n.stat_type1 = 3 or MhEx_n.stat_type2 = 3 or MhEx_n.stat_type3 = 3 or MhEx_n.stat_type4 = 3 or MhEx_n.stat_type5 = 3 or MhEx_n.stat_type6 = 3) AND (MhEx_n.stat_type1 IN (0,31,32,38,44) or MhEx_n.stat_type2 IN (0,31,32,38,44) or MhEx_n.stat_type3 IN (0,31,32,38,44) or MhEx_n.stat_type4 IN (0,31,32,38,44) or MhEx_n.stat_type5 IN (0,31,32,38,44) or MhEx_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (MhEx_n.stat_type1 = 5 or MhEx_n.stat_type2 = 5 or MhEx_n.stat_type3 = 5 or MhEx_n.stat_type4 = 5 or MhEx_n.stat_type5 = 5 or MhEx_n.stat_type6 = 5) AND (MhEx_n.stat_type1 IN (31) or MhEx_n.stat_type2 IN (31) or MhEx_n.stat_type3 IN (31) or MhEx_n.stat_type4 IN (31) or MhEx_n.stat_type5 IN (31) or MhEx_n.stat_type6 IN (31)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (MhEx_n.stat_type1 = 5 or MhEx_n.stat_type2 = 5 or MhEx_n.stat_type3 = 5 or MhEx_n.stat_type4 = 5 or MhEx_n.stat_type5 = 5 or MhEx_n.stat_type6 = 5) AND (MhEx_n.stat_type1 IN (32,36,45) or MhEx_n.stat_type2 IN (32,36,45) or MhEx_n.stat_type3 IN (32,36,45) or MhEx_n.stat_type4 IN (32,36,45) or MhEx_n.stat_type5 IN (32,36,45) or MhEx_n.stat_type6 IN (32,36,45)) then '1 Gear with wrong stat'\n\t\t\t \t  \tEND\n\t\t\t #Agility DPS\n\t\t\t \n\t\t     when (characters_npcbot_class_role.class_role IN ('Hunter', 'Rogue', 'Druid Feral DPS', 'Shaman Enhancement')) then \n\t\t\t\t\tcase \n\t\t\t \t  \t\twhen (MhEx_n.stat_type1 = 4 or MhEx_n.stat_type2 = 4 or MhEx_n.stat_type3 = 4 or MhEx_n.stat_type4 = 4 or MhEx_n.stat_type5 = 4 or MhEx_n.stat_type6 = 4) AND (MhEx_n.stat_type1 IN (12,13,14) or MhEx_n.stat_type2 IN (12,13,14) or MhEx_n.stat_type3 IN (12,13,14) or MhEx_n.stat_type4 IN (12,13,14) or MhEx_n.stat_type5 IN (12,13,14) or MhEx_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (MhEx_n.stat_type1 = 3 or MhEx_n.stat_type2 = 3 or MhEx_n.stat_type3 = 3 or MhEx_n.stat_type4 = 3 or MhEx_n.stat_type5 = 3 or MhEx_n.stat_type6 = 3) AND (MhEx_n.stat_type1 IN (12,13,14) or MhEx_n.stat_type2 IN (12,13,14) or MhEx_n.stat_type3 IN (12,13,14) or MhEx_n.stat_type4 IN (12,13,14) or MhEx_n.stat_type5 IN (12,13,14) or MhEx_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (MhEx_n.stat_type1 = 4 or MhEx_n.stat_type2 = 4 or MhEx_n.stat_type3 = 4 or MhEx_n.stat_type4 = 4 or MhEx_n.stat_type5 = 4 or MhEx_n.stat_type6 = 4) AND (MhEx_n.stat_type1 IN (0,31,32,38,44) or MhEx_n.stat_type2 IN (0,31,32,38,44) or MhEx_n.stat_type3 IN (0,31,32,38,44) or MhEx_n.stat_type4 IN (0,31,32,38,44) or MhEx_n.stat_type5 IN (0,31,32,38,44) or MhEx_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (MhEx_n.stat_type1 = 3 or MhEx_n.stat_type2 = 3 or MhEx_n.stat_type3 = 3 or MhEx_n.stat_type4 = 3 or MhEx_n.stat_type5 = 3 or MhEx_n.stat_type6 = 3) AND (MhEx_n.stat_type1 IN (0,31,32,38,44) or MhEx_n.stat_type2 IN (0,31,32,38,44) or MhEx_n.stat_type3 IN (0,31,32,38,44) or MhEx_n.stat_type4 IN (0,31,32,38,44) or MhEx_n.stat_type5 IN (0,31,32,38,44) or MhEx_n.stat_type6 IN (0,31,32,38,44)) then \n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen MhEx_n.ItemLevel >=200 AND MhEx_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen MhEx_n.socketColor_1 = 0 and MhEx_n.socketColor_2 = 0 and MhEx_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\t\twhen left(MhEx.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\twhen MhEx.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\twhen left(MhEx.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(MhEx.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen MhEx_n.ItemLevel >= 251 AND MhEx_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen MhEx_n.ItemLevel >= 264 AND MhEx_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen MhEx_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND \n\t\t\t\t  \t\twhen (MhEx_n.stat_type1 = 5 or MhEx_n.stat_type2 = 5 or MhEx_n.stat_type3 = 5 or MhEx_n.stat_type4 = 5 or MhEx_n.stat_type5 = 5 or MhEx_n.stat_type6 = 5) AND (MhEx_n.stat_type1 IN (31) or MhEx_n.stat_type2 IN (31) or MhEx_n.stat_type3 IN (31) or MhEx_n.stat_type4 IN (31) or MhEx_n.stat_type5 IN (31) or MhEx_n.stat_type6 IN (31)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (MhEx_n.stat_type1 = 5 or MhEx_n.stat_type2 = 5 or MhEx_n.stat_type3 = 5 or MhEx_n.stat_type4 = 5 or MhEx_n.stat_type5 = 5 or MhEx_n.stat_type6 = 5) AND (MhEx_n.stat_type1 IN (32,36,45) or MhEx_n.stat_type2 IN (32,36,45) or MhEx_n.stat_type3 IN (32,36,45) or MhEx_n.stat_type4 IN (32,36,45) or MhEx_n.stat_type5 IN (32,36,45) or MhEx_n.stat_type6 IN (32,36,45)) then '1 Gear with wrong stat'\n\t\t\t \t  \tEND\n\t\t end  AS '01 Main hand Analyze',\n\n\t\t case\n\t\t\t #Strength DPS\n\t\t     when (characters_npcbot_class_role.class_role IN ('Warrior DPS', 'Paladin DPS', 'DK DPS')) then \n\t\t     \t\tcase \n\t\t\t \t  \t\twhen (OhEx_n.stat_type1 = 4 or OhEx_n.stat_type2 = 4 or OhEx_n.stat_type3 = 4 or OhEx_n.stat_type4 = 4 or OhEx_n.stat_type5 = 4 or OhEx_n.stat_type6 = 4) AND (OhEx_n.stat_type1 IN (12,13,14) or OhEx_n.stat_type2 IN (12,13,14) or OhEx_n.stat_type3 IN (12,13,14) or OhEx_n.stat_type4 IN (12,13,14) or OhEx_n.stat_type5 IN (12,13,14) or OhEx_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (OhEx_n.stat_type1 = 3 or OhEx_n.stat_type2 = 3 or OhEx_n.stat_type3 = 3 or OhEx_n.stat_type4 = 3 or OhEx_n.stat_type5 = 3 or OhEx_n.stat_type6 = 3) AND (OhEx_n.stat_type1 IN (12,13,14) or OhEx_n.stat_type2 IN (12,13,14) or OhEx_n.stat_type3 IN (12,13,14) or OhEx_n.stat_type4 IN (12,13,14) or OhEx_n.stat_type5 IN (12,13,14) or OhEx_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (OhEx_n.stat_type1 = 4 or OhEx_n.stat_type2 = 4 or OhEx_n.stat_type3 = 4 or OhEx_n.stat_type4 = 4 or OhEx_n.stat_type5 = 4 or OhEx_n.stat_type6 = 4) AND (OhEx_n.stat_type1 IN (0,31,32,38,44) or OhEx_n.stat_type2 IN (0,31,32,38,44) or OhEx_n.stat_type3 IN (0,31,32,38,44) or OhEx_n.stat_type4 IN (0,31,32,38,44) or OhEx_n.stat_type5 IN (0,31,32,38,44) or OhEx_n.stat_type6 IN (0,31,32,38,44)) then \n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen OhEx_n.ItemLevel >=200 AND OhEx_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen OhEx_n.socketColor_1 = 0 and OhEx_n.socketColor_2 = 0 and OhEx_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\t\twhen left(OhEx.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\twhen OhEx.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\twhen left(OhEx.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(OhEx.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen OhEx_n.ItemLevel >= 251 AND OhEx_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen OhEx_n.ItemLevel >= 264 AND OhEx_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen OhEx_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND \n\t\t\t \t  \t\twhen (OhEx_n.stat_type1 = 3 or OhEx_n.stat_type2 = 3 or OhEx_n.stat_type3 = 3 or OhEx_n.stat_type4 = 3 or OhEx_n.stat_type5 = 3 or OhEx_n.stat_type6 = 3) AND (OhEx_n.stat_type1 IN (0,31,32,38,44) or OhEx_n.stat_type2 IN (0,31,32,38,44) or OhEx_n.stat_type3 IN (0,31,32,38,44) or OhEx_n.stat_type4 IN (0,31,32,38,44) or OhEx_n.stat_type5 IN (0,31,32,38,44) or OhEx_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (OhEx_n.stat_type1 = 5 or OhEx_n.stat_type2 = 5 or OhEx_n.stat_type3 = 5 or OhEx_n.stat_type4 = 5 or OhEx_n.stat_type5 = 5 or OhEx_n.stat_type6 = 5) AND (OhEx_n.stat_type1 IN (31) or OhEx_n.stat_type2 IN (31) or OhEx_n.stat_type3 IN (31) or OhEx_n.stat_type4 IN (31) or OhEx_n.stat_type5 IN (31) or OhEx_n.stat_type6 IN (31)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (OhEx_n.stat_type1 = 5 or OhEx_n.stat_type2 = 5 or OhEx_n.stat_type3 = 5 or OhEx_n.stat_type4 = 5 or OhEx_n.stat_type5 = 5 or OhEx_n.stat_type6 = 5) AND (OhEx_n.stat_type1 IN (32,36,45) or OhEx_n.stat_type2 IN (32,36,45) or OhEx_n.stat_type3 IN (32,36,45) or OhEx_n.stat_type4 IN (32,36,45) or OhEx_n.stat_type5 IN (32,36,45) or OhEx_n.stat_type6 IN (32,36,45)) then '1 Gear with wrong stat'\n\t\t\t \t  \tEND\n\t\t\t #Strength Tank\n\t\t     when (characters_npcbot_class_role.class_role IN ('Warrior Tank', 'Paladin Tank', 'DK Tank')) then\n\t\t     \t\tcase \n\t\t\t \t  \t\twhen (OhEx_n.stat_type1 = 4 or OhEx_n.stat_type2 = 4 or OhEx_n.stat_type3 = 4 or OhEx_n.stat_type4 = 4 or OhEx_n.stat_type5 = 4 or OhEx_n.stat_type6 = 4) AND (OhEx_n.stat_type1 IN (12,13,14) or OhEx_n.stat_type2 IN (12,13,14) or OhEx_n.stat_type3 IN (12,13,14) or OhEx_n.stat_type4 IN (12,13,14) or OhEx_n.stat_type5 IN (12,13,14) or OhEx_n.stat_type6 IN (12,13,14)) then \n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen OhEx_n.ItemLevel >=200 AND OhEx_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen OhEx_n.socketColor_1 = 0 and OhEx_n.socketColor_2 = 0 and OhEx_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\t\twhen left(OhEx.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\twhen OhEx.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\twhen left(OhEx.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(OhEx.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen OhEx_n.ItemLevel >= 251 AND OhEx_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen OhEx_n.ItemLevel >= 264 AND OhEx_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen OhEx_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t\t\t \t  \t\twhen (OhEx_n.stat_type1 = 3 or OhEx_n.stat_type2 = 3 or OhEx_n.stat_type3 = 3 or OhEx_n.stat_type4 = 3 or OhEx_n.stat_type5 = 3 or OhEx_n.stat_type6 = 3) AND (OhEx_n.stat_type1 IN (12,13,14) or OhEx_n.stat_type2 IN (12,13,14) or OhEx_n.stat_type3 IN (12,13,14) or OhEx_n.stat_type4 IN (12,13,14) or OhEx_n.stat_type5 IN (12,13,14) or OhEx_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (OhEx_n.stat_type1 = 4 or OhEx_n.stat_type2 = 4 or OhEx_n.stat_type3 = 4 or OhEx_n.stat_type4 = 4 or OhEx_n.stat_type5 = 4 or OhEx_n.stat_type6 = 4) AND (OhEx_n.stat_type1 IN (0,31,32,38,44) or OhEx_n.stat_type2 IN (0,31,32,38,44) or OhEx_n.stat_type3 IN (0,31,32,38,44) or OhEx_n.stat_type4 IN (0,31,32,38,44) or OhEx_n.stat_type5 IN (0,31,32,38,44) or OhEx_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (OhEx_n.stat_type1 = 3 or OhEx_n.stat_type2 = 3 or OhEx_n.stat_type3 = 3 or OhEx_n.stat_type4 = 3 or OhEx_n.stat_type5 = 3 or OhEx_n.stat_type6 = 3) AND (OhEx_n.stat_type1 IN (0,31,32,38,44) or OhEx_n.stat_type2 IN (0,31,32,38,44) or OhEx_n.stat_type3 IN (0,31,32,38,44) or OhEx_n.stat_type4 IN (0,31,32,38,44) or OhEx_n.stat_type5 IN (0,31,32,38,44) or OhEx_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (OhEx_n.stat_type1 = 5 or OhEx_n.stat_type2 = 5 or OhEx_n.stat_type3 = 5 or OhEx_n.stat_type4 = 5 or OhEx_n.stat_type5 = 5 or OhEx_n.stat_type6 = 5) AND (OhEx_n.stat_type1 IN (31) or OhEx_n.stat_type2 IN (31) or OhEx_n.stat_type3 IN (31) or OhEx_n.stat_type4 IN (31) or OhEx_n.stat_type5 IN (31) or OhEx_n.stat_type6 IN (31)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (OhEx_n.stat_type1 = 5 or OhEx_n.stat_type2 = 5 or OhEx_n.stat_type3 = 5 or OhEx_n.stat_type4 = 5 or OhEx_n.stat_type5 = 5 or OhEx_n.stat_type6 = 5) AND (OhEx_n.stat_type1 IN (32,36,45) or OhEx_n.stat_type2 IN (32,36,45) or OhEx_n.stat_type3 IN (32,36,45) or OhEx_n.stat_type4 IN (32,36,45) or OhEx_n.stat_type5 IN (32,36,45) or OhEx_n.stat_type6 IN (32,36,45)) then '1 Gear with wrong stat'\n\t\t\t \t  \tEND\n\t\t\t \t#Magic DPS\n\t\t      when (characters_npcbot_class_role.class_role IN ('Mage', 'Warlock', 'Shaman Elemental', 'Druid Balance', 'Priest DPS')) then\n\t\t\t \t\tcase \n\t\t\t \t  \t\twhen (OhEx_n.stat_type1 = 4 or OhEx_n.stat_type2 = 4 or OhEx_n.stat_type3 = 4 or OhEx_n.stat_type4 = 4 or OhEx_n.stat_type5 = 4 or OhEx_n.stat_type6 = 4) AND (OhEx_n.stat_type1 IN (12,13,14) or OhEx_n.stat_type2 IN (12,13,14) or OhEx_n.stat_type3 IN (12,13,14) or OhEx_n.stat_type4 IN (12,13,14) or OhEx_n.stat_type5 IN (12,13,14) or OhEx_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (OhEx_n.stat_type1 = 3 or OhEx_n.stat_type2 = 3 or OhEx_n.stat_type3 = 3 or OhEx_n.stat_type4 = 3 or OhEx_n.stat_type5 = 3 or OhEx_n.stat_type6 = 3) AND (OhEx_n.stat_type1 IN (12,13,14) or OhEx_n.stat_type2 IN (12,13,14) or OhEx_n.stat_type3 IN (12,13,14) or OhEx_n.stat_type4 IN (12,13,14) or OhEx_n.stat_type5 IN (12,13,14) or OhEx_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (OhEx_n.stat_type1 = 4 or OhEx_n.stat_type2 = 4 or OhEx_n.stat_type3 = 4 or OhEx_n.stat_type4 = 4 or OhEx_n.stat_type5 = 4 or OhEx_n.stat_type6 = 4) AND (OhEx_n.stat_type1 IN (0,31,32,38,44) or OhEx_n.stat_type2 IN (0,31,32,38,44) or OhEx_n.stat_type3 IN (0,31,32,38,44) or OhEx_n.stat_type4 IN (0,31,32,38,44) or OhEx_n.stat_type5 IN (0,31,32,38,44) or OhEx_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (OhEx_n.stat_type1 = 3 or OhEx_n.stat_type2 = 3 or OhEx_n.stat_type3 = 3 or OhEx_n.stat_type4 = 3 or OhEx_n.stat_type5 = 3 or OhEx_n.stat_type6 = 3) AND (OhEx_n.stat_type1 IN (0,31,32,38,44) or OhEx_n.stat_type2 IN (0,31,32,38,44) or OhEx_n.stat_type3 IN (0,31,32,38,44) or OhEx_n.stat_type4 IN (0,31,32,38,44) or OhEx_n.stat_type5 IN (0,31,32,38,44) or OhEx_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (OhEx_n.stat_type1 = 5 or OhEx_n.stat_type2 = 5 or OhEx_n.stat_type3 = 5 or OhEx_n.stat_type4 = 5 or OhEx_n.stat_type5 = 5 or OhEx_n.stat_type6 = 5) AND (OhEx_n.stat_type1 IN (31) or OhEx_n.stat_type2 IN (31) or OhEx_n.stat_type3 IN (31) or OhEx_n.stat_type4 IN (31) or OhEx_n.stat_type5 IN (31) or OhEx_n.stat_type6 IN (31)) then\n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen OhEx_n.ItemLevel >=200 AND OhEx_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen OhEx_n.socketColor_1 = 0 and OhEx_n.socketColor_2 = 0 and OhEx_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\t\twhen left(OhEx.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\twhen OhEx.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\twhen left(OhEx.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(OhEx.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen OhEx_n.ItemLevel >= 251 AND OhEx_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen OhEx_n.ItemLevel >= 264 AND OhEx_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen OhEx_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t\t\t\t  \t\twhen (OhEx_n.stat_type1 = 5 or OhEx_n.stat_type2 = 5 or OhEx_n.stat_type3 = 5 or OhEx_n.stat_type4 = 5 or OhEx_n.stat_type5 = 5 or OhEx_n.stat_type6 = 5) AND (OhEx_n.stat_type1 IN (32,36,45) or OhEx_n.stat_type2 IN (32,36,45) or OhEx_n.stat_type3 IN (32,36,45) or OhEx_n.stat_type4 IN (32,36,45) or OhEx_n.stat_type5 IN (32,36,45) or OhEx_n.stat_type6 IN (32,36,45)) then \n\t\t\t\t\t\t  \t\tcase\n\t\t\t\t\t\t\t\t\twhen OhEx_n.ItemLevel >=200 AND OhEx_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen OhEx_n.socketColor_1 = 0 and OhEx_n.socketColor_2 = 0 and OhEx_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\t\twhen left(OhEx.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\twhen OhEx.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\twhen left(OhEx.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(OhEx.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen OhEx_n.ItemLevel >= 251 AND OhEx_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen OhEx_n.ItemLevel >= 264 AND OhEx_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen OhEx_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t\t\t \t  \tEND\n\t\t\t  #Healer / DPS\n\t\t     when (characters_npcbot_class_role.class_role IN ('Paladin Healer', 'Priest Healer', 'Warlock', 'Mage', 'Shaman Healer', 'Druid Healer'))\n\t\t\t        then \n\t\t\t \t\tcase \n\t\t\t \t  \t\twhen (OhEx_n.stat_type1 = 4 or OhEx_n.stat_type2 = 4 or OhEx_n.stat_type3 = 4 or OhEx_n.stat_type4 = 4 or OhEx_n.stat_type5 = 4 or OhEx_n.stat_type6 = 4) AND (OhEx_n.stat_type1 IN (12,13,14) or OhEx_n.stat_type2 IN (12,13,14) or OhEx_n.stat_type3 IN (12,13,14) or OhEx_n.stat_type4 IN (12,13,14) or OhEx_n.stat_type5 IN (12,13,14) or OhEx_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (OhEx_n.stat_type1 = 3 or OhEx_n.stat_type2 = 3 or OhEx_n.stat_type3 = 3 or OhEx_n.stat_type4 = 3 or OhEx_n.stat_type5 = 3 or OhEx_n.stat_type6 = 3) AND (OhEx_n.stat_type1 IN (12,13,14) or OhEx_n.stat_type2 IN (12,13,14) or OhEx_n.stat_type3 IN (12,13,14) or OhEx_n.stat_type4 IN (12,13,14) or OhEx_n.stat_type5 IN (12,13,14) or OhEx_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (OhEx_n.stat_type1 = 4 or OhEx_n.stat_type2 = 4 or OhEx_n.stat_type3 = 4 or OhEx_n.stat_type4 = 4 or OhEx_n.stat_type5 = 4 or OhEx_n.stat_type6 = 4) AND (OhEx_n.stat_type1 IN (0,31,32,38,44) or OhEx_n.stat_type2 IN (0,31,32,38,44) or OhEx_n.stat_type3 IN (0,31,32,38,44) or OhEx_n.stat_type4 IN (0,31,32,38,44) or OhEx_n.stat_type5 IN (0,31,32,38,44) or OhEx_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (OhEx_n.stat_type1 = 3 or OhEx_n.stat_type2 = 3 or OhEx_n.stat_type3 = 3 or OhEx_n.stat_type4 = 3 or OhEx_n.stat_type5 = 3 or OhEx_n.stat_type6 = 3) AND (OhEx_n.stat_type1 IN (0,31,32,38,44) or OhEx_n.stat_type2 IN (0,31,32,38,44) or OhEx_n.stat_type3 IN (0,31,32,38,44) or OhEx_n.stat_type4 IN (0,31,32,38,44) or OhEx_n.stat_type5 IN (0,31,32,38,44) or OhEx_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (OhEx_n.stat_type1 = 5 or OhEx_n.stat_type2 = 5 or OhEx_n.stat_type3 = 5 or OhEx_n.stat_type4 = 5 or OhEx_n.stat_type5 = 5 or OhEx_n.stat_type6 = 5) AND (OhEx_n.stat_type1 IN (31) or OhEx_n.stat_type2 IN (31) or OhEx_n.stat_type3 IN (31) or OhEx_n.stat_type4 IN (31) or OhEx_n.stat_type5 IN (31) or OhEx_n.stat_type6 IN (31)) then '2 Gear not optimal for Healer'\n\t\t\t\t  \t\twhen (OhEx_n.stat_type1 = 5 or OhEx_n.stat_type2 = 5 or OhEx_n.stat_type3 = 5 or OhEx_n.stat_type4 = 5 or OhEx_n.stat_type5 = 5 or OhEx_n.stat_type6 = 5) AND (OhEx_n.stat_type1 IN (32,36,45) or OhEx_n.stat_type2 IN (32,36,45) or OhEx_n.stat_type3 IN (32,36,45) or OhEx_n.stat_type4 IN (32,36,45) or OhEx_n.stat_type5 IN (32,36,45) or OhEx_n.stat_type6 IN (32,36,45)) then\n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen OhEx_n.ItemLevel >=200 AND OhEx_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen OhEx_n.socketColor_1 = 0 and OhEx_n.socketColor_2 = 0 and OhEx_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\t\twhen left(OhEx.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\twhen OhEx.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\twhen left(OhEx.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(OhEx.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen OhEx_n.ItemLevel >= 251 AND OhEx_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen OhEx_n.ItemLevel >= 264 AND OhEx_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen OhEx_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t\t\t \t  \tEND\n\t\t\t \t#Agility Tank\n\t\t     when (characters_npcbot_class_role.class_role IN ('Druid Feral Tank')) then \n\t\t\t \t\tcase \n\t\t\t \t  \t\twhen (OhEx_n.stat_type1 = 4 or OhEx_n.stat_type2 = 4 or OhEx_n.stat_type3 = 4 or OhEx_n.stat_type4 = 4 or OhEx_n.stat_type5 = 4 or OhEx_n.stat_type6 = 4) AND (OhEx_n.stat_type1 IN (12,13,14) or OhEx_n.stat_type2 IN (12,13,14) or OhEx_n.stat_type3 IN (12,13,14) or OhEx_n.stat_type4 IN (12,13,14) or OhEx_n.stat_type5 IN (12,13,14) or OhEx_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (OhEx_n.stat_type1 = 3 or OhEx_n.stat_type2 = 3 or OhEx_n.stat_type3 = 3 or OhEx_n.stat_type4 = 3 or OhEx_n.stat_type5 = 3 or OhEx_n.stat_type6 = 3) AND (OhEx_n.stat_type1 IN (12,13,14) or OhEx_n.stat_type2 IN (12,13,14) or OhEx_n.stat_type3 IN (12,13,14) or OhEx_n.stat_type4 IN (12,13,14) or OhEx_n.stat_type5 IN (12,13,14) or OhEx_n.stat_type6 IN (12,13,14)) then\n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen OhEx_n.ItemLevel >=200 AND OhEx_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen OhEx_n.socketColor_1 = 0 and OhEx_n.socketColor_2 = 0 and OhEx_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\t\twhen left(OhEx.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\twhen OhEx.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\twhen left(OhEx.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(OhEx.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen OhEx_n.ItemLevel >= 251 AND OhEx_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen OhEx_n.ItemLevel >= 264 AND OhEx_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen OhEx_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t  \t\t\t  \t\twhen (OhEx_n.stat_type1 = 4 or OhEx_n.stat_type2 = 4 or OhEx_n.stat_type3 = 4 or OhEx_n.stat_type4 = 4 or OhEx_n.stat_type5 = 4 or OhEx_n.stat_type6 = 4) AND (OhEx_n.stat_type1 IN (0,31,32,38,44) or OhEx_n.stat_type2 IN (0,31,32,38,44) or OhEx_n.stat_type3 IN (0,31,32,38,44) or OhEx_n.stat_type4 IN (0,31,32,38,44) or OhEx_n.stat_type5 IN (0,31,32,38,44) or OhEx_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (OhEx_n.stat_type1 = 3 or OhEx_n.stat_type2 = 3 or OhEx_n.stat_type3 = 3 or OhEx_n.stat_type4 = 3 or OhEx_n.stat_type5 = 3 or OhEx_n.stat_type6 = 3) AND (OhEx_n.stat_type1 IN (0,31,32,38,44) or OhEx_n.stat_type2 IN (0,31,32,38,44) or OhEx_n.stat_type3 IN (0,31,32,38,44) or OhEx_n.stat_type4 IN (0,31,32,38,44) or OhEx_n.stat_type5 IN (0,31,32,38,44) or OhEx_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (OhEx_n.stat_type1 = 5 or OhEx_n.stat_type2 = 5 or OhEx_n.stat_type3 = 5 or OhEx_n.stat_type4 = 5 or OhEx_n.stat_type5 = 5 or OhEx_n.stat_type6 = 5) AND (OhEx_n.stat_type1 IN (31) or OhEx_n.stat_type2 IN (31) or OhEx_n.stat_type3 IN (31) or OhEx_n.stat_type4 IN (31) or OhEx_n.stat_type5 IN (31) or OhEx_n.stat_type6 IN (31)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (OhEx_n.stat_type1 = 5 or OhEx_n.stat_type2 = 5 or OhEx_n.stat_type3 = 5 or OhEx_n.stat_type4 = 5 or OhEx_n.stat_type5 = 5 or OhEx_n.stat_type6 = 5) AND (OhEx_n.stat_type1 IN (32,36,45) or OhEx_n.stat_type2 IN (32,36,45) or OhEx_n.stat_type3 IN (32,36,45) or OhEx_n.stat_type4 IN (32,36,45) or OhEx_n.stat_type5 IN (32,36,45) or OhEx_n.stat_type6 IN (32,36,45)) then '1 Gear with wrong stat'\n\t\t\t \t  \tEND\n\t\t\t #Agility DPS\n\t\t     when (characters_npcbot_class_role.class_role IN ('Hunter', 'Rogue', 'Druid Feral DPS', 'Shaman Enhancement')) then \n\t\t\t\t\tcase \n\t\t\t \t  \t\twhen (OhEx_n.stat_type1 = 4 or OhEx_n.stat_type2 = 4 or OhEx_n.stat_type3 = 4 or OhEx_n.stat_type4 = 4 or OhEx_n.stat_type5 = 4 or OhEx_n.stat_type6 = 4) AND (OhEx_n.stat_type1 IN (12,13,14) or OhEx_n.stat_type2 IN (12,13,14) or OhEx_n.stat_type3 IN (12,13,14) or OhEx_n.stat_type4 IN (12,13,14) or OhEx_n.stat_type5 IN (12,13,14) or OhEx_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (OhEx_n.stat_type1 = 3 or OhEx_n.stat_type2 = 3 or OhEx_n.stat_type3 = 3 or OhEx_n.stat_type4 = 3 or OhEx_n.stat_type5 = 3 or OhEx_n.stat_type6 = 3) AND (OhEx_n.stat_type1 IN (12,13,14) or OhEx_n.stat_type2 IN (12,13,14) or OhEx_n.stat_type3 IN (12,13,14) or OhEx_n.stat_type4 IN (12,13,14) or OhEx_n.stat_type5 IN (12,13,14) or OhEx_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (OhEx_n.stat_type1 = 4 or OhEx_n.stat_type2 = 4 or OhEx_n.stat_type3 = 4 or OhEx_n.stat_type4 = 4 or OhEx_n.stat_type5 = 4 or OhEx_n.stat_type6 = 4) AND (OhEx_n.stat_type1 IN (0,31,32,38,44) or OhEx_n.stat_type2 IN (0,31,32,38,44) or OhEx_n.stat_type3 IN (0,31,32,38,44) or OhEx_n.stat_type4 IN (0,31,32,38,44) or OhEx_n.stat_type5 IN (0,31,32,38,44) or OhEx_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (OhEx_n.stat_type1 = 3 or OhEx_n.stat_type2 = 3 or OhEx_n.stat_type3 = 3 or OhEx_n.stat_type4 = 3 or OhEx_n.stat_type5 = 3 or OhEx_n.stat_type6 = 3) AND (OhEx_n.stat_type1 IN (0,31,32,38,44) or OhEx_n.stat_type2 IN (0,31,32,38,44) or OhEx_n.stat_type3 IN (0,31,32,38,44) or OhEx_n.stat_type4 IN (0,31,32,38,44) or OhEx_n.stat_type5 IN (0,31,32,38,44) or OhEx_n.stat_type6 IN (0,31,32,38,44)) then \n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen OhEx_n.ItemLevel >=200 AND OhEx_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen OhEx_n.socketColor_1 = 0 and OhEx_n.socketColor_2 = 0 and OhEx_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\t\twhen left(OhEx.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\twhen OhEx.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\twhen left(OhEx.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(OhEx.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen OhEx_n.ItemLevel >= 251 AND OhEx_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen OhEx_n.ItemLevel >= 264 AND OhEx_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen OhEx_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND \n\t\t\t\t  \t\twhen (OhEx_n.stat_type1 = 5 or OhEx_n.stat_type2 = 5 or OhEx_n.stat_type3 = 5 or OhEx_n.stat_type4 = 5 or OhEx_n.stat_type5 = 5 or OhEx_n.stat_type6 = 5) AND (OhEx_n.stat_type1 IN (31) or OhEx_n.stat_type2 IN (31) or OhEx_n.stat_type3 IN (31) or OhEx_n.stat_type4 IN (31) or OhEx_n.stat_type5 IN (31) or OhEx_n.stat_type6 IN (31)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (OhEx_n.stat_type1 = 5 or OhEx_n.stat_type2 = 5 or OhEx_n.stat_type3 = 5 or OhEx_n.stat_type4 = 5 or OhEx_n.stat_type5 = 5 or OhEx_n.stat_type6 = 5) AND (OhEx_n.stat_type1 IN (32,36,45) or OhEx_n.stat_type2 IN (32,36,45) or OhEx_n.stat_type3 IN (32,36,45) or OhEx_n.stat_type4 IN (32,36,45) or OhEx_n.stat_type5 IN (32,36,45) or OhEx_n.stat_type6 IN (32,36,45)) then '1 Gear with wrong stat'\n\t\t\t \t  \tEND\n\t\t end  AS '02 Off hand Analyze',\n\t\t \n\t\t case\n\t\t\t #Strength DPS\n\t\t     when (characters_npcbot_class_role.class_role IN ('Warrior DPS', 'Paladin DPS', 'DK DPS')) then \n\t\t     \t\tcase \n\t\t\t \t  \t\twhen (RhEx_n.stat_type1 = 4 or RhEx_n.stat_type2 = 4 or RhEx_n.stat_type3 = 4 or RhEx_n.stat_type4 = 4 or RhEx_n.stat_type5 = 4 or RhEx_n.stat_type6 = 4) AND (RhEx_n.stat_type1 IN (12,13,14) or RhEx_n.stat_type2 IN (12,13,14) or RhEx_n.stat_type3 IN (12,13,14) or RhEx_n.stat_type4 IN (12,13,14) or RhEx_n.stat_type5 IN (12,13,14) or RhEx_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (RhEx_n.stat_type1 = 3 or RhEx_n.stat_type2 = 3 or RhEx_n.stat_type3 = 3 or RhEx_n.stat_type4 = 3 or RhEx_n.stat_type5 = 3 or RhEx_n.stat_type6 = 3) AND (RhEx_n.stat_type1 IN (12,13,14) or RhEx_n.stat_type2 IN (12,13,14) or RhEx_n.stat_type3 IN (12,13,14) or RhEx_n.stat_type4 IN (12,13,14) or RhEx_n.stat_type5 IN (12,13,14) or RhEx_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (RhEx_n.stat_type1 IN (3,4) or RhEx_n.stat_type2 IN (3,4) or RhEx_n.stat_type3 IN (3,4) or RhEx_n.stat_type4 IN (3,4) or RhEx_n.stat_type5 IN (3,4) or RhEx_n.stat_type6 IN (3,4)) AND (RhEx_n.stat_type1 IN (0,31,32,38,44) or RhEx_n.stat_type2 IN (0,31,32,38,44) or RhEx_n.stat_type3 IN (0,31,32,38,44) or RhEx_n.stat_type4 IN (0,31,32,38,44) or RhEx_n.stat_type5 IN (0,31,32,38,44) or RhEx_n.stat_type6 IN (0,31,32,38,44)) then \n\t\t\t\t\t\tcase\n\t\t\t\t\t\t\twhen RhEx_n.socketColor_1 = 0 and RhEx_n.socketColor_2 = 0 and RhEx_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen left(RhEx.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\twhen RhEx_n.ItemLevel >=200 AND RhEx_n.ItemLevel< 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\t\twhen RhEx_n.ItemLevel >= 251 AND RhEx_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\t\tWhen RhEx_n.ItemLevel >= 264 AND RhEx_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\t\tWhen RhEx_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\twhen RhEx.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\twhen left(RhEx.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\twhen RIGHT(RhEx.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen RhEx_n.ItemLevel >=200 AND RhEx_n.ItemLevel< 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen RhEx_n.ItemLevel >= 251 AND RhEx_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen RhEx_n.ItemLevel >= 264 AND RhEx_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen RhEx_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t\t\t\t\t\t\tend \n\t\t\t \t  \t\twhen (RhEx_n.stat_type1 = 3 or RhEx_n.stat_type2 = 3 or RhEx_n.stat_type3 = 3 or RhEx_n.stat_type4 = 3 or RhEx_n.stat_type5 = 3 or RhEx_n.stat_type6 = 3) AND (RhEx_n.stat_type1 IN (0,31,32,38,44) or RhEx_n.stat_type2 IN (0,31,32,38,44) or RhEx_n.stat_type3 IN (0,31,32,38,44) or RhEx_n.stat_type4 IN (0,31,32,38,44) or RhEx_n.stat_type5 IN (0,31,32,38,44) or RhEx_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (RhEx_n.stat_type1 = 5 or RhEx_n.stat_type2 = 5 or RhEx_n.stat_type3 = 5 or RhEx_n.stat_type4 = 5 or RhEx_n.stat_type5 = 5 or RhEx_n.stat_type6 = 5) AND (RhEx_n.stat_type1 IN (31) or RhEx_n.stat_type2 IN (31) or RhEx_n.stat_type3 IN (31) or RhEx_n.stat_type4 IN (31) or RhEx_n.stat_type5 IN (31) or RhEx_n.stat_type6 IN (31)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (RhEx_n.stat_type1 = 5 or RhEx_n.stat_type2 = 5 or RhEx_n.stat_type3 = 5 or RhEx_n.stat_type4 = 5 or RhEx_n.stat_type5 = 5 or RhEx_n.stat_type6 = 5) AND (RhEx_n.stat_type1 IN (32,36,45) or RhEx_n.stat_type2 IN (32,36,45) or RhEx_n.stat_type3 IN (32,36,45) or RhEx_n.stat_type4 IN (32,36,45) or RhEx_n.stat_type5 IN (32,36,45) or RhEx_n.stat_type6 IN (32,36,45)) then '1 Gear with wrong stat'\n\t\t\t \t  \tEND\n\t\t\t #Strength Tank\n\t\t     when (characters_npcbot_class_role.class_role IN ('Warrior Tank', 'Paladin Tank', 'DK Tank')) then\n\t\t     \t\tcase \n\t\t\t \t  \t\twhen (RhEx_n.stat_type1 = 4 or RhEx_n.stat_type2 = 4 or RhEx_n.stat_type3 = 4 or RhEx_n.stat_type4 = 4 or RhEx_n.stat_type5 = 4 or RhEx_n.stat_type6 = 4) AND (RhEx_n.stat_type1 IN (12,13,14) or RhEx_n.stat_type2 IN (12,13,14) or RhEx_n.stat_type3 IN (12,13,14) or RhEx_n.stat_type4 IN (12,13,14) or RhEx_n.stat_type5 IN (12,13,14) or RhEx_n.stat_type6 IN (12,13,14)) then \n\t\t\t\t\t\tcase\n\t\t\t\t\t\t\twhen RhEx_n.socketColor_1 = 0 and RhEx_n.socketColor_2 = 0 and RhEx_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen left(RhEx.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\twhen RhEx_n.ItemLevel >=200 AND RhEx_n.ItemLevel< 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\t\twhen RhEx_n.ItemLevel >= 251 AND RhEx_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\t\tWhen RhEx_n.ItemLevel >= 264 AND RhEx_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\t\tWhen RhEx_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\twhen RhEx.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\twhen left(RhEx.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\twhen RIGHT(RhEx.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen RhEx_n.ItemLevel >=200 AND RhEx_n.ItemLevel< 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen RhEx_n.ItemLevel >= 251 AND RhEx_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen RhEx_n.ItemLevel >= 264 AND RhEx_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen RhEx_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t\t\t\t\t\t\tend \n\t\t\t \t  \t\twhen (RhEx_n.stat_type1 = 3 or RhEx_n.stat_type2 = 3 or RhEx_n.stat_type3 = 3 or RhEx_n.stat_type4 = 3 or RhEx_n.stat_type5 = 3 or RhEx_n.stat_type6 = 3) AND (RhEx_n.stat_type1 IN (12,13,14) or RhEx_n.stat_type2 IN (12,13,14) or RhEx_n.stat_type3 IN (12,13,14) or RhEx_n.stat_type4 IN (12,13,14) or RhEx_n.stat_type5 IN (12,13,14) or RhEx_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (RhEx_n.stat_type1 = 4 or RhEx_n.stat_type2 = 4 or RhEx_n.stat_type3 = 4 or RhEx_n.stat_type4 = 4 or RhEx_n.stat_type5 = 4 or RhEx_n.stat_type6 = 4) AND (RhEx_n.stat_type1 IN (0,31,32,38,44) or RhEx_n.stat_type2 IN (0,31,32,38,44) or RhEx_n.stat_type3 IN (0,31,32,38,44) or RhEx_n.stat_type4 IN (0,31,32,38,44) or RhEx_n.stat_type5 IN (0,31,32,38,44) or RhEx_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (RhEx_n.stat_type1 = 3 or RhEx_n.stat_type2 = 3 or RhEx_n.stat_type3 = 3 or RhEx_n.stat_type4 = 3 or RhEx_n.stat_type5 = 3 or RhEx_n.stat_type6 = 3) AND (RhEx_n.stat_type1 IN (0,31,32,38,44) or RhEx_n.stat_type2 IN (0,31,32,38,44) or RhEx_n.stat_type3 IN (0,31,32,38,44) or RhEx_n.stat_type4 IN (0,31,32,38,44) or RhEx_n.stat_type5 IN (0,31,32,38,44) or RhEx_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (RhEx_n.stat_type1 = 5 or RhEx_n.stat_type2 = 5 or RhEx_n.stat_type3 = 5 or RhEx_n.stat_type4 = 5 or RhEx_n.stat_type5 = 5 or RhEx_n.stat_type6 = 5) AND (RhEx_n.stat_type1 IN (31) or RhEx_n.stat_type2 IN (31) or RhEx_n.stat_type3 IN (31) or RhEx_n.stat_type4 IN (31) or RhEx_n.stat_type5 IN (31) or RhEx_n.stat_type6 IN (31)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (RhEx_n.stat_type1 = 5 or RhEx_n.stat_type2 = 5 or RhEx_n.stat_type3 = 5 or RhEx_n.stat_type4 = 5 or RhEx_n.stat_type5 = 5 or RhEx_n.stat_type6 = 5) AND (RhEx_n.stat_type1 IN (32,36,45) or RhEx_n.stat_type2 IN (32,36,45) or RhEx_n.stat_type3 IN (32,36,45) or RhEx_n.stat_type4 IN (32,36,45) or RhEx_n.stat_type5 IN (32,36,45) or RhEx_n.stat_type6 IN (32,36,45)) then '1 Gear with wrong stat'\n\t\t\t \t  \tEND\n\t\t\t \t#Magic DPS\n\t\t      when (characters_npcbot_class_role.class_role IN ('Mage', 'Warlock', 'Shaman Elemental', 'Druid Balance', 'Priest DPS')) then\n\t\t\t \t\tcase \n\t\t\t \t  \t\twhen (RhEx_n.stat_type1 = 4 or RhEx_n.stat_type2 = 4 or RhEx_n.stat_type3 = 4 or RhEx_n.stat_type4 = 4 or RhEx_n.stat_type5 = 4 or RhEx_n.stat_type6 = 4) AND (RhEx_n.stat_type1 IN (12,13,14) or RhEx_n.stat_type2 IN (12,13,14) or RhEx_n.stat_type3 IN (12,13,14) or RhEx_n.stat_type4 IN (12,13,14) or RhEx_n.stat_type5 IN (12,13,14) or RhEx_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (RhEx_n.stat_type1 = 3 or RhEx_n.stat_type2 = 3 or RhEx_n.stat_type3 = 3 or RhEx_n.stat_type4 = 3 or RhEx_n.stat_type5 = 3 or RhEx_n.stat_type6 = 3) AND (RhEx_n.stat_type1 IN (12,13,14) or RhEx_n.stat_type2 IN (12,13,14) or RhEx_n.stat_type3 IN (12,13,14) or RhEx_n.stat_type4 IN (12,13,14) or RhEx_n.stat_type5 IN (12,13,14) or RhEx_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (RhEx_n.stat_type1 = 4 or RhEx_n.stat_type2 = 4 or RhEx_n.stat_type3 = 4 or RhEx_n.stat_type4 = 4 or RhEx_n.stat_type5 = 4 or RhEx_n.stat_type6 = 4) AND (RhEx_n.stat_type1 IN (0,31,32,38,44) or RhEx_n.stat_type2 IN (0,31,32,38,44) or RhEx_n.stat_type3 IN (0,31,32,38,44) or RhEx_n.stat_type4 IN (0,31,32,38,44) or RhEx_n.stat_type5 IN (0,31,32,38,44) or RhEx_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (RhEx_n.stat_type1 = 3 or RhEx_n.stat_type2 = 3 or RhEx_n.stat_type3 = 3 or RhEx_n.stat_type4 = 3 or RhEx_n.stat_type5 = 3 or RhEx_n.stat_type6 = 3) AND (RhEx_n.stat_type1 IN (0,31,32,38,44) or RhEx_n.stat_type2 IN (0,31,32,38,44) or RhEx_n.stat_type3 IN (0,31,32,38,44) or RhEx_n.stat_type4 IN (0,31,32,38,44) or RhEx_n.stat_type5 IN (0,31,32,38,44) or RhEx_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (RhEx_n.stat_type1 = 5 or RhEx_n.stat_type2 = 5 or RhEx_n.stat_type3 = 5 or RhEx_n.stat_type4 = 5 or RhEx_n.stat_type5 = 5 or RhEx_n.stat_type6 = 5) AND (RhEx_n.stat_type1 IN (31) or RhEx_n.stat_type2 IN (31) or RhEx_n.stat_type3 IN (31) or RhEx_n.stat_type4 IN (31) or RhEx_n.stat_type5 IN (31) or RhEx_n.stat_type6 IN (31)) then\n\t\t\t\t\t\tcase\n\t\t\t\t\t\t\twhen RhEx_n.socketColor_1 = 0 and RhEx_n.socketColor_2 = 0 and RhEx_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen left(RhEx.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\twhen RhEx_n.ItemLevel >=200 AND RhEx_n.ItemLevel< 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\t\twhen RhEx_n.ItemLevel >= 251 AND RhEx_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\t\tWhen RhEx_n.ItemLevel >= 264 AND RhEx_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\t\tWhen RhEx_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\twhen RhEx.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\twhen left(RhEx.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\twhen RIGHT(RhEx.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen RhEx_n.ItemLevel >=200 AND RhEx_n.ItemLevel< 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen RhEx_n.ItemLevel >= 251 AND RhEx_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen RhEx_n.ItemLevel >= 264 AND RhEx_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen RhEx_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t\t\t\t\t\t\tend \n\t\t\t\t  \t\twhen (RhEx_n.stat_type1 = 5 or RhEx_n.stat_type2 = 5 or RhEx_n.stat_type3 = 5 or RhEx_n.stat_type4 = 5 or RhEx_n.stat_type5 = 5 or RhEx_n.stat_type6 = 5) AND (RhEx_n.stat_type1 IN (32,36,45) or RhEx_n.stat_type2 IN (32,36,45) or RhEx_n.stat_type3 IN (32,36,45) or RhEx_n.stat_type4 IN (32,36,45) or RhEx_n.stat_type5 IN (32,36,45) or RhEx_n.stat_type6 IN (32,36,45)) then \n\t\t\t\t\t\tcase\n\t\t\t\t\t\t\twhen RhEx_n.socketColor_1 = 0 and RhEx_n.socketColor_2 = 0 and RhEx_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen left(RhEx.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\twhen RhEx_n.ItemLevel >=200 AND RhEx_n.ItemLevel< 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\t\twhen RhEx_n.ItemLevel >= 251 AND RhEx_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\t\tWhen RhEx_n.ItemLevel >= 264 AND RhEx_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\t\tWhen RhEx_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\twhen RhEx.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\twhen left(RhEx.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\twhen RIGHT(RhEx.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen RhEx_n.ItemLevel >=200 AND RhEx_n.ItemLevel< 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen RhEx_n.ItemLevel >= 251 AND RhEx_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen RhEx_n.ItemLevel >= 264 AND RhEx_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen RhEx_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t\t\t\t\t\t\tend \n\t\t\t \t  \tEND\n\t\t\t  #Healer / DPS\n\t\t     when (characters_npcbot_class_role.class_role IN ('Paladin Healer', 'Priest Healer', 'Warlock', 'Mage', 'Shaman Healer', 'Druid Healer'))\n\t\t\t        then \n\t\t\t \t\tcase \n\t\t\t \t  \t\twhen (RhEx_n.stat_type1 = 4 or RhEx_n.stat_type2 = 4 or RhEx_n.stat_type3 = 4 or RhEx_n.stat_type4 = 4 or RhEx_n.stat_type5 = 4 or RhEx_n.stat_type6 = 4) AND (RhEx_n.stat_type1 IN (12,13,14) or RhEx_n.stat_type2 IN (12,13,14) or RhEx_n.stat_type3 IN (12,13,14) or RhEx_n.stat_type4 IN (12,13,14) or RhEx_n.stat_type5 IN (12,13,14) or RhEx_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (RhEx_n.stat_type1 = 3 or RhEx_n.stat_type2 = 3 or RhEx_n.stat_type3 = 3 or RhEx_n.stat_type4 = 3 or RhEx_n.stat_type5 = 3 or RhEx_n.stat_type6 = 3) AND (RhEx_n.stat_type1 IN (12,13,14) or RhEx_n.stat_type2 IN (12,13,14) or RhEx_n.stat_type3 IN (12,13,14) or RhEx_n.stat_type4 IN (12,13,14) or RhEx_n.stat_type5 IN (12,13,14) or RhEx_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (RhEx_n.stat_type1 = 4 or RhEx_n.stat_type2 = 4 or RhEx_n.stat_type3 = 4 or RhEx_n.stat_type4 = 4 or RhEx_n.stat_type5 = 4 or RhEx_n.stat_type6 = 4) AND (RhEx_n.stat_type1 IN (0,31,32,38,44) or RhEx_n.stat_type2 IN (0,31,32,38,44) or RhEx_n.stat_type3 IN (0,31,32,38,44) or RhEx_n.stat_type4 IN (0,31,32,38,44) or RhEx_n.stat_type5 IN (0,31,32,38,44) or RhEx_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (RhEx_n.stat_type1 = 3 or RhEx_n.stat_type2 = 3 or RhEx_n.stat_type3 = 3 or RhEx_n.stat_type4 = 3 or RhEx_n.stat_type5 = 3 or RhEx_n.stat_type6 = 3) AND (RhEx_n.stat_type1 IN (0,31,32,38,44) or RhEx_n.stat_type2 IN (0,31,32,38,44) or RhEx_n.stat_type3 IN (0,31,32,38,44) or RhEx_n.stat_type4 IN (0,31,32,38,44) or RhEx_n.stat_type5 IN (0,31,32,38,44) or RhEx_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (RhEx_n.stat_type1 = 5 or RhEx_n.stat_type2 = 5 or RhEx_n.stat_type3 = 5 or RhEx_n.stat_type4 = 5 or RhEx_n.stat_type5 = 5 or RhEx_n.stat_type6 = 5) AND (RhEx_n.stat_type1 IN (31) or RhEx_n.stat_type2 IN (31) or RhEx_n.stat_type3 IN (31) or RhEx_n.stat_type4 IN (31) or RhEx_n.stat_type5 IN (31) or RhEx_n.stat_type6 IN (31)) then '2 Gear not optimal for Healer'\n\t\t\t\t  \t\twhen (RhEx_n.stat_type1 = 5 or RhEx_n.stat_type2 = 5 or RhEx_n.stat_type3 = 5 or RhEx_n.stat_type4 = 5 or RhEx_n.stat_type5 = 5 or RhEx_n.stat_type6 = 5) AND (RhEx_n.stat_type1 IN (32,36,45) or RhEx_n.stat_type2 IN (32,36,45) or RhEx_n.stat_type3 IN (32,36,45) or RhEx_n.stat_type4 IN (32,36,45) or RhEx_n.stat_type5 IN (32,36,45) or RhEx_n.stat_type6 IN (32,36,45)) then\n\t\t\t\t\t\tcase\n\t\t\t\t\t\t\twhen RhEx_n.socketColor_1 = 0 and RhEx_n.socketColor_2 = 0 and RhEx_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen left(RhEx.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\twhen RhEx_n.ItemLevel >=200 AND RhEx_n.ItemLevel< 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\t\twhen RhEx_n.ItemLevel >= 251 AND RhEx_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\t\tWhen RhEx_n.ItemLevel >= 264 AND RhEx_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\t\tWhen RhEx_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\twhen RhEx.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\twhen left(RhEx.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\twhen RIGHT(RhEx.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen RhEx_n.ItemLevel >=200 AND RhEx_n.ItemLevel< 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen RhEx_n.ItemLevel >= 251 AND RhEx_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen RhEx_n.ItemLevel >= 264 AND RhEx_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen RhEx_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t\t\t\t\t\t\tend \n\t\t\t \t  \tEND\n\t\t\t \t#Agility Tank\n\t\t     when (characters_npcbot_class_role.class_role IN ('Druid Feral Tank')) then \n\t\t\t \t\tcase \n\t\t\t \t  \t\twhen (RhEx_n.stat_type1 = 4 or RhEx_n.stat_type2 = 4 or RhEx_n.stat_type3 = 4 or RhEx_n.stat_type4 = 4 or RhEx_n.stat_type5 = 4 or RhEx_n.stat_type6 = 4) AND (RhEx_n.stat_type1 IN (12,13,14) or RhEx_n.stat_type2 IN (12,13,14) or RhEx_n.stat_type3 IN (12,13,14) or RhEx_n.stat_type4 IN (12,13,14) or RhEx_n.stat_type5 IN (12,13,14) or RhEx_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (RhEx_n.stat_type1 = 3 or RhEx_n.stat_type2 = 3 or RhEx_n.stat_type3 = 3 or RhEx_n.stat_type4 = 3 or RhEx_n.stat_type5 = 3 or RhEx_n.stat_type6 = 3) AND (RhEx_n.stat_type1 IN (12,13,14) or RhEx_n.stat_type2 IN (12,13,14) or RhEx_n.stat_type3 IN (12,13,14) or RhEx_n.stat_type4 IN (12,13,14) or RhEx_n.stat_type5 IN (12,13,14) or RhEx_n.stat_type6 IN (12,13,14)) then\n\t\t\t\t\t\tcase\n\t\t\t\t\t\t\twhen RhEx_n.socketColor_1 = 0 and RhEx_n.socketColor_2 = 0 and RhEx_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen left(RhEx.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\twhen RhEx_n.ItemLevel >=200 AND RhEx_n.ItemLevel< 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\t\twhen RhEx_n.ItemLevel >= 251 AND RhEx_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\t\tWhen RhEx_n.ItemLevel >= 264 AND RhEx_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\t\tWhen RhEx_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\twhen RhEx.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\twhen left(RhEx.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\twhen RIGHT(RhEx.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen RhEx_n.ItemLevel >=200 AND RhEx_n.ItemLevel< 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen RhEx_n.ItemLevel >= 251 AND RhEx_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen RhEx_n.ItemLevel >= 264 AND RhEx_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen RhEx_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t\t\t\t\t\t\tend \n\t  \t\t\t  \t\twhen (RhEx_n.stat_type1 = 4 or RhEx_n.stat_type2 = 4 or RhEx_n.stat_type3 = 4 or RhEx_n.stat_type4 = 4 or RhEx_n.stat_type5 = 4 or RhEx_n.stat_type6 = 4) AND (RhEx_n.stat_type1 IN (0,31,32,38,44) or RhEx_n.stat_type2 IN (0,31,32,38,44) or RhEx_n.stat_type3 IN (0,31,32,38,44) or RhEx_n.stat_type4 IN (0,31,32,38,44) or RhEx_n.stat_type5 IN (0,31,32,38,44) or RhEx_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (RhEx_n.stat_type1 = 3 or RhEx_n.stat_type2 = 3 or RhEx_n.stat_type3 = 3 or RhEx_n.stat_type4 = 3 or RhEx_n.stat_type5 = 3 or RhEx_n.stat_type6 = 3) AND (RhEx_n.stat_type1 IN (0,31,32,38,44) or RhEx_n.stat_type2 IN (0,31,32,38,44) or RhEx_n.stat_type3 IN (0,31,32,38,44) or RhEx_n.stat_type4 IN (0,31,32,38,44) or RhEx_n.stat_type5 IN (0,31,32,38,44) or RhEx_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (RhEx_n.stat_type1 = 5 or RhEx_n.stat_type2 = 5 or RhEx_n.stat_type3 = 5 or RhEx_n.stat_type4 = 5 or RhEx_n.stat_type5 = 5 or RhEx_n.stat_type6 = 5) AND (RhEx_n.stat_type1 IN (31) or RhEx_n.stat_type2 IN (31) or RhEx_n.stat_type3 IN (31) or RhEx_n.stat_type4 IN (31) or RhEx_n.stat_type5 IN (31) or RhEx_n.stat_type6 IN (31)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (RhEx_n.stat_type1 = 5 or RhEx_n.stat_type2 = 5 or RhEx_n.stat_type3 = 5 or RhEx_n.stat_type4 = 5 or RhEx_n.stat_type5 = 5 or RhEx_n.stat_type6 = 5) AND (RhEx_n.stat_type1 IN (32,36,45) or RhEx_n.stat_type2 IN (32,36,45) or RhEx_n.stat_type3 IN (32,36,45) or RhEx_n.stat_type4 IN (32,36,45) or RhEx_n.stat_type5 IN (32,36,45) or RhEx_n.stat_type6 IN (32,36,45)) then '1 Gear with wrong stat'\n\t\t\t \t  \tEND\n\t\t\t #Agility DPS\n\t\t     when (characters_npcbot_class_role.class_role IN ('Hunter', 'Rogue', 'Druid Feral DPS', 'Shaman Enhancement')) then \n\t\t\t\t\tcase \n\t\t\t \t  \t\twhen (RhEx_n.stat_type1 = 4 or RhEx_n.stat_type2 = 4 or RhEx_n.stat_type3 = 4 or RhEx_n.stat_type4 = 4 or RhEx_n.stat_type5 = 4 or RhEx_n.stat_type6 = 4) AND (RhEx_n.stat_type1 IN (12,13,14) or RhEx_n.stat_type2 IN (12,13,14) or RhEx_n.stat_type3 IN (12,13,14) or RhEx_n.stat_type4 IN (12,13,14) or RhEx_n.stat_type5 IN (12,13,14) or RhEx_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (RhEx_n.stat_type1 = 3 or RhEx_n.stat_type2 = 3 or RhEx_n.stat_type3 = 3 or RhEx_n.stat_type4 = 3 or RhEx_n.stat_type5 = 3 or RhEx_n.stat_type6 = 3) AND (RhEx_n.stat_type1 IN (12,13,14) or RhEx_n.stat_type2 IN (12,13,14) or RhEx_n.stat_type3 IN (12,13,14) or RhEx_n.stat_type4 IN (12,13,14) or RhEx_n.stat_type5 IN (12,13,14) or RhEx_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (RhEx_n.stat_type1 = 4 or RhEx_n.stat_type2 = 4 or RhEx_n.stat_type3 = 4 or RhEx_n.stat_type4 = 4 or RhEx_n.stat_type5 = 4 or RhEx_n.stat_type6 = 4) AND (RhEx_n.stat_type1 IN (0,31,32,38,44) or RhEx_n.stat_type2 IN (0,31,32,38,44) or RhEx_n.stat_type3 IN (0,31,32,38,44) or RhEx_n.stat_type4 IN (0,31,32,38,44) or RhEx_n.stat_type5 IN (0,31,32,38,44) or RhEx_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (RhEx_n.stat_type1 = 3 or RhEx_n.stat_type2 = 3 or RhEx_n.stat_type3 = 3 or RhEx_n.stat_type4 = 3 or RhEx_n.stat_type5 = 3 or RhEx_n.stat_type6 = 3) AND (RhEx_n.stat_type1 IN (0,31,32,38,44) or RhEx_n.stat_type2 IN (0,31,32,38,44) or RhEx_n.stat_type3 IN (0,31,32,38,44) or RhEx_n.stat_type4 IN (0,31,32,38,44) or RhEx_n.stat_type5 IN (0,31,32,38,44) or RhEx_n.stat_type6 IN (0,31,32,38,44)) then \n\t\t\t\t\t\tcase\n\t\t\t\t\t\t\twhen RhEx_n.socketColor_1 = 0 and RhEx_n.socketColor_2 = 0 and RhEx_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen left(RhEx.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\twhen RhEx_n.ItemLevel >=200 AND RhEx_n.ItemLevel< 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\t\twhen RhEx_n.ItemLevel >= 251 AND RhEx_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\t\tWhen RhEx_n.ItemLevel >= 264 AND RhEx_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\t\tWhen RhEx_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\twhen RhEx.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\twhen left(RhEx.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\twhen RIGHT(RhEx.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen RhEx_n.ItemLevel >=200 AND RhEx_n.ItemLevel< 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen RhEx_n.ItemLevel >= 251 AND RhEx_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen RhEx_n.ItemLevel >= 264 AND RhEx_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen RhEx_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t\t\t\t\t\t\tend \n\t\t\t\t  \t\twhen (RhEx_n.stat_type1 = 5 or RhEx_n.stat_type2 = 5 or RhEx_n.stat_type3 = 5 or RhEx_n.stat_type4 = 5 or RhEx_n.stat_type5 = 5 or RhEx_n.stat_type6 = 5) AND (RhEx_n.stat_type1 IN (31) or RhEx_n.stat_type2 IN (31) or RhEx_n.stat_type3 IN (31) or RhEx_n.stat_type4 IN (31) or RhEx_n.stat_type5 IN (31) or RhEx_n.stat_type6 IN (31)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (RhEx_n.stat_type1 = 5 or RhEx_n.stat_type2 = 5 or RhEx_n.stat_type3 = 5 or RhEx_n.stat_type4 = 5 or RhEx_n.stat_type5 = 5 or RhEx_n.stat_type6 = 5) AND (RhEx_n.stat_type1 IN (32,36,45) or RhEx_n.stat_type2 IN (32,36,45) or RhEx_n.stat_type3 IN (32,36,45) or RhEx_n.stat_type4 IN (32,36,45) or RhEx_n.stat_type5 IN (32,36,45) or RhEx_n.stat_type6 IN (32,36,45)) then '1 Gear with wrong stat'\n\t\t\t \t  \tEND\n\t\t end  AS '03 Range Analyze',\n\t\t \n\n\t\t case\n\t\t\t #Strength DPS\n\t\t     when (characters_npcbot_class_role.class_role IN ('Warrior DPS', 'Paladin DPS', 'DK DPS')) then \n\t\t     \t\tcase \n\t\t\t \t  \t\twhen (Head_n.stat_type1 = 4 or Head_n.stat_type2 = 4 or Head_n.stat_type3 = 4 or Head_n.stat_type4 = 4 or Head_n.stat_type5 = 4 or Head_n.stat_type6 = 4) AND (Head_n.stat_type1 IN (12,13,14) or Head_n.stat_type2 IN (12,13,14) or Head_n.stat_type3 IN (12,13,14) or Head_n.stat_type4 IN (12,13,14) or Head_n.stat_type5 IN (12,13,14) or Head_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Head_n.stat_type1 = 3 or Head_n.stat_type2 = 3 or Head_n.stat_type3 = 3 or Head_n.stat_type4 = 3 or Head_n.stat_type5 = 3 or Head_n.stat_type6 = 3) AND (Head_n.stat_type1 IN (12,13,14) or Head_n.stat_type2 IN (12,13,14) or Head_n.stat_type3 IN (12,13,14) or Head_n.stat_type4 IN (12,13,14) or Head_n.stat_type5 IN (12,13,14) or Head_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (Head_n.stat_type1 = 4 or Head_n.stat_type2 = 4 or Head_n.stat_type3 = 4 or Head_n.stat_type4 = 4 or Head_n.stat_type5 = 4 or Head_n.stat_type6 = 4) AND (Head_n.stat_type1 IN (0,31,32,38,44) or Head_n.stat_type2 IN (0,31,32,38,44) or Head_n.stat_type3 IN (0,31,32,38,44) or Head_n.stat_type4 IN (0,31,32,38,44) or Head_n.stat_type5 IN (0,31,32,38,44) or Head_n.stat_type6 IN (0,31,32,38,44)) then \n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen Head_n.ItemLevel >=200 AND Head_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen Head_n.socketColor_1 = 0 and Head_n.socketColor_2 = 0 and Head_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\t\twhen left(Head.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\twhen Head.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\twhen left(Head.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Head.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Head_n.ItemLevel >= 251 AND Head_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Head_n.ItemLevel >= 264 AND Head_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Head_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND \n\t\t\t \t  \t\twhen (Head_n.stat_type1 = 3 or Head_n.stat_type2 = 3 or Head_n.stat_type3 = 3 or Head_n.stat_type4 = 3 or Head_n.stat_type5 = 3 or Head_n.stat_type6 = 3) AND (Head_n.stat_type1 IN (0,31,32,38,44) or Head_n.stat_type2 IN (0,31,32,38,44) or Head_n.stat_type3 IN (0,31,32,38,44) or Head_n.stat_type4 IN (0,31,32,38,44) or Head_n.stat_type5 IN (0,31,32,38,44) or Head_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Head_n.stat_type1 = 5 or Head_n.stat_type2 = 5 or Head_n.stat_type3 = 5 or Head_n.stat_type4 = 5 or Head_n.stat_type5 = 5 or Head_n.stat_type6 = 5) AND (Head_n.stat_type1 IN (31) or Head_n.stat_type2 IN (31) or Head_n.stat_type3 IN (31) or Head_n.stat_type4 IN (31) or Head_n.stat_type5 IN (31) or Head_n.stat_type6 IN (31)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Head_n.stat_type1 = 5 or Head_n.stat_type2 = 5 or Head_n.stat_type3 = 5 or Head_n.stat_type4 = 5 or Head_n.stat_type5 = 5 or Head_n.stat_type6 = 5) AND (Head_n.stat_type1 IN (32,36,45) or Head_n.stat_type2 IN (32,36,45) or Head_n.stat_type3 IN (32,36,45) or Head_n.stat_type4 IN (32,36,45) or Head_n.stat_type5 IN (32,36,45) or Head_n.stat_type6 IN (32,36,45)) then '1 Gear with wrong stat'\n\t\t\t \t  \tEND\n\t\t\t #Strength Tank\n\t\t     when (characters_npcbot_class_role.class_role IN ('Warrior Tank', 'Paladin Tank', 'DK Tank')) then\n\t\t     \t\tcase \n\t\t\t \t  \t\twhen (Head_n.stat_type1 = 4 or Head_n.stat_type2 = 4 or Head_n.stat_type3 = 4 or Head_n.stat_type4 = 4 or Head_n.stat_type5 = 4 or Head_n.stat_type6 = 4) AND (Head_n.stat_type1 IN (12,13,14) or Head_n.stat_type2 IN (12,13,14) or Head_n.stat_type3 IN (12,13,14) or Head_n.stat_type4 IN (12,13,14) or Head_n.stat_type5 IN (12,13,14) or Head_n.stat_type6 IN (12,13,14)) then \n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen Head_n.ItemLevel >=200 AND Head_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen Head_n.socketColor_1 = 0 and Head_n.socketColor_2 = 0 and Head_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\t\twhen left(Head.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\twhen Head.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\twhen left(Head.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Head.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Head_n.ItemLevel >= 251 AND Head_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Head_n.ItemLevel >= 264 AND Head_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Head_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t\t\t \t  \t\twhen (Head_n.stat_type1 = 3 or Head_n.stat_type2 = 3 or Head_n.stat_type3 = 3 or Head_n.stat_type4 = 3 or Head_n.stat_type5 = 3 or Head_n.stat_type6 = 3) AND (Head_n.stat_type1 IN (12,13,14) or Head_n.stat_type2 IN (12,13,14) or Head_n.stat_type3 IN (12,13,14) or Head_n.stat_type4 IN (12,13,14) or Head_n.stat_type5 IN (12,13,14) or Head_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (Head_n.stat_type1 = 4 or Head_n.stat_type2 = 4 or Head_n.stat_type3 = 4 or Head_n.stat_type4 = 4 or Head_n.stat_type5 = 4 or Head_n.stat_type6 = 4) AND (Head_n.stat_type1 IN (0,31,32,38,44) or Head_n.stat_type2 IN (0,31,32,38,44) or Head_n.stat_type3 IN (0,31,32,38,44) or Head_n.stat_type4 IN (0,31,32,38,44) or Head_n.stat_type5 IN (0,31,32,38,44) or Head_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Head_n.stat_type1 = 3 or Head_n.stat_type2 = 3 or Head_n.stat_type3 = 3 or Head_n.stat_type4 = 3 or Head_n.stat_type5 = 3 or Head_n.stat_type6 = 3) AND (Head_n.stat_type1 IN (0,31,32,38,44) or Head_n.stat_type2 IN (0,31,32,38,44) or Head_n.stat_type3 IN (0,31,32,38,44) or Head_n.stat_type4 IN (0,31,32,38,44) or Head_n.stat_type5 IN (0,31,32,38,44) or Head_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Head_n.stat_type1 = 5 or Head_n.stat_type2 = 5 or Head_n.stat_type3 = 5 or Head_n.stat_type4 = 5 or Head_n.stat_type5 = 5 or Head_n.stat_type6 = 5) AND (Head_n.stat_type1 IN (31) or Head_n.stat_type2 IN (31) or Head_n.stat_type3 IN (31) or Head_n.stat_type4 IN (31) or Head_n.stat_type5 IN (31) or Head_n.stat_type6 IN (31)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Head_n.stat_type1 = 5 or Head_n.stat_type2 = 5 or Head_n.stat_type3 = 5 or Head_n.stat_type4 = 5 or Head_n.stat_type5 = 5 or Head_n.stat_type6 = 5) AND (Head_n.stat_type1 IN (32,36,45) or Head_n.stat_type2 IN (32,36,45) or Head_n.stat_type3 IN (32,36,45) or Head_n.stat_type4 IN (32,36,45) or Head_n.stat_type5 IN (32,36,45) or Head_n.stat_type6 IN (32,36,45)) then '1 Gear with wrong stat'\n\t\t\t \t  \tEND\n\t\t\t \t#Magic DPS\n\t\t      when (characters_npcbot_class_role.class_role IN ('Mage', 'Warlock', 'Shaman Elemental', 'Druid Balance', 'Priest DPS')) then\n\t\t\t \t\tcase \n\t\t\t \t  \t\twhen (Head_n.stat_type1 = 4 or Head_n.stat_type2 = 4 or Head_n.stat_type3 = 4 or Head_n.stat_type4 = 4 or Head_n.stat_type5 = 4 or Head_n.stat_type6 = 4) AND (Head_n.stat_type1 IN (12,13,14) or Head_n.stat_type2 IN (12,13,14) or Head_n.stat_type3 IN (12,13,14) or Head_n.stat_type4 IN (12,13,14) or Head_n.stat_type5 IN (12,13,14) or Head_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Head_n.stat_type1 = 3 or Head_n.stat_type2 = 3 or Head_n.stat_type3 = 3 or Head_n.stat_type4 = 3 or Head_n.stat_type5 = 3 or Head_n.stat_type6 = 3) AND (Head_n.stat_type1 IN (12,13,14) or Head_n.stat_type2 IN (12,13,14) or Head_n.stat_type3 IN (12,13,14) or Head_n.stat_type4 IN (12,13,14) or Head_n.stat_type5 IN (12,13,14) or Head_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (Head_n.stat_type1 = 4 or Head_n.stat_type2 = 4 or Head_n.stat_type3 = 4 or Head_n.stat_type4 = 4 or Head_n.stat_type5 = 4 or Head_n.stat_type6 = 4) AND (Head_n.stat_type1 IN (0,31,32,38,44) or Head_n.stat_type2 IN (0,31,32,38,44) or Head_n.stat_type3 IN (0,31,32,38,44) or Head_n.stat_type4 IN (0,31,32,38,44) or Head_n.stat_type5 IN (0,31,32,38,44) or Head_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Head_n.stat_type1 = 3 or Head_n.stat_type2 = 3 or Head_n.stat_type3 = 3 or Head_n.stat_type4 = 3 or Head_n.stat_type5 = 3 or Head_n.stat_type6 = 3) AND (Head_n.stat_type1 IN (0,31,32,38,44) or Head_n.stat_type2 IN (0,31,32,38,44) or Head_n.stat_type3 IN (0,31,32,38,44) or Head_n.stat_type4 IN (0,31,32,38,44) or Head_n.stat_type5 IN (0,31,32,38,44) or Head_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Head_n.stat_type1 = 5 or Head_n.stat_type2 = 5 or Head_n.stat_type3 = 5 or Head_n.stat_type4 = 5 or Head_n.stat_type5 = 5 or Head_n.stat_type6 = 5) AND (Head_n.stat_type1 IN (31) or Head_n.stat_type2 IN (31) or Head_n.stat_type3 IN (31) or Head_n.stat_type4 IN (31) or Head_n.stat_type5 IN (31) or Head_n.stat_type6 IN (31)) then\n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen Head_n.ItemLevel >=200 AND Head_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen Head_n.socketColor_1 = 0 and Head_n.socketColor_2 = 0 and Head_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\t\twhen left(Head.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\twhen Head.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\twhen left(Head.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Head.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Head_n.ItemLevel >= 251 AND Head_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Head_n.ItemLevel >= 264 AND Head_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Head_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t\t\t\t  \t\twhen (Head_n.stat_type1 = 5 or Head_n.stat_type2 = 5 or Head_n.stat_type3 = 5 or Head_n.stat_type4 = 5 or Head_n.stat_type5 = 5 or Head_n.stat_type6 = 5) AND (Head_n.stat_type1 IN (32,36,45) or Head_n.stat_type2 IN (32,36,45) or Head_n.stat_type3 IN (32,36,45) or Head_n.stat_type4 IN (32,36,45) or Head_n.stat_type5 IN (32,36,45) or Head_n.stat_type6 IN (32,36,45)) then \n\t\t\t\t\t\t  \t\tcase\n\t\t\t\t\t\t\t\t\twhen Head_n.ItemLevel >=200 AND Head_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen Head_n.socketColor_1 = 0 and Head_n.socketColor_2 = 0 and Head_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\t\twhen left(Head.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\twhen Head.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\twhen left(Head.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Head.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Head_n.ItemLevel >= 251 AND Head_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Head_n.ItemLevel >= 264 AND Head_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Head_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t\t\t \t  \tEND\n\t\t\t  #Healer / DPS\n\t\t     when (characters_npcbot_class_role.class_role IN ('Paladin Healer', 'Priest Healer', 'Warlock', 'Mage', 'Shaman Healer', 'Druid Healer'))\n\t\t\t        then \n\t\t\t \t\tcase \n\t\t\t \t  \t\twhen (Head_n.stat_type1 = 4 or Head_n.stat_type2 = 4 or Head_n.stat_type3 = 4 or Head_n.stat_type4 = 4 or Head_n.stat_type5 = 4 or Head_n.stat_type6 = 4) AND (Head_n.stat_type1 IN (12,13,14) or Head_n.stat_type2 IN (12,13,14) or Head_n.stat_type3 IN (12,13,14) or Head_n.stat_type4 IN (12,13,14) or Head_n.stat_type5 IN (12,13,14) or Head_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Head_n.stat_type1 = 3 or Head_n.stat_type2 = 3 or Head_n.stat_type3 = 3 or Head_n.stat_type4 = 3 or Head_n.stat_type5 = 3 or Head_n.stat_type6 = 3) AND (Head_n.stat_type1 IN (12,13,14) or Head_n.stat_type2 IN (12,13,14) or Head_n.stat_type3 IN (12,13,14) or Head_n.stat_type4 IN (12,13,14) or Head_n.stat_type5 IN (12,13,14) or Head_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (Head_n.stat_type1 = 4 or Head_n.stat_type2 = 4 or Head_n.stat_type3 = 4 or Head_n.stat_type4 = 4 or Head_n.stat_type5 = 4 or Head_n.stat_type6 = 4) AND (Head_n.stat_type1 IN (0,31,32,38,44) or Head_n.stat_type2 IN (0,31,32,38,44) or Head_n.stat_type3 IN (0,31,32,38,44) or Head_n.stat_type4 IN (0,31,32,38,44) or Head_n.stat_type5 IN (0,31,32,38,44) or Head_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Head_n.stat_type1 = 3 or Head_n.stat_type2 = 3 or Head_n.stat_type3 = 3 or Head_n.stat_type4 = 3 or Head_n.stat_type5 = 3 or Head_n.stat_type6 = 3) AND (Head_n.stat_type1 IN (0,31,32,38,44) or Head_n.stat_type2 IN (0,31,32,38,44) or Head_n.stat_type3 IN (0,31,32,38,44) or Head_n.stat_type4 IN (0,31,32,38,44) or Head_n.stat_type5 IN (0,31,32,38,44) or Head_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Head_n.stat_type1 = 5 or Head_n.stat_type2 = 5 or Head_n.stat_type3 = 5 or Head_n.stat_type4 = 5 or Head_n.stat_type5 = 5 or Head_n.stat_type6 = 5) AND (Head_n.stat_type1 IN (31) or Head_n.stat_type2 IN (31) or Head_n.stat_type3 IN (31) or Head_n.stat_type4 IN (31) or Head_n.stat_type5 IN (31) or Head_n.stat_type6 IN (31)) then '2 Gear not optimal for Healer'\n\t\t\t\t  \t\twhen (Head_n.stat_type1 = 5 or Head_n.stat_type2 = 5 or Head_n.stat_type3 = 5 or Head_n.stat_type4 = 5 or Head_n.stat_type5 = 5 or Head_n.stat_type6 = 5) AND (Head_n.stat_type1 IN (32,36,45) or Head_n.stat_type2 IN (32,36,45) or Head_n.stat_type3 IN (32,36,45) or Head_n.stat_type4 IN (32,36,45) or Head_n.stat_type5 IN (32,36,45) or Head_n.stat_type6 IN (32,36,45)) then\n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen Head_n.ItemLevel >=200 AND Head_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen Head_n.socketColor_1 = 0 and Head_n.socketColor_2 = 0 and Head_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\t\twhen left(Head.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\twhen Head.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\twhen left(Head.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Head.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Head_n.ItemLevel >= 251 AND Head_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Head_n.ItemLevel >= 264 AND Head_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Head_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t\t\t \t  \tEND\n\t\t\t \t#Agility Tank\n\t\t     when (characters_npcbot_class_role.class_role IN ('Druid Feral Tank')) then \n\t\t\t \t\tcase \n\t\t\t \t  \t\twhen (Head_n.stat_type1 = 4 or Head_n.stat_type2 = 4 or Head_n.stat_type3 = 4 or Head_n.stat_type4 = 4 or Head_n.stat_type5 = 4 or Head_n.stat_type6 = 4) AND (Head_n.stat_type1 IN (12,13,14) or Head_n.stat_type2 IN (12,13,14) or Head_n.stat_type3 IN (12,13,14) or Head_n.stat_type4 IN (12,13,14) or Head_n.stat_type5 IN (12,13,14) or Head_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Head_n.stat_type1 = 3 or Head_n.stat_type2 = 3 or Head_n.stat_type3 = 3 or Head_n.stat_type4 = 3 or Head_n.stat_type5 = 3 or Head_n.stat_type6 = 3) AND (Head_n.stat_type1 IN (12,13,14) or Head_n.stat_type2 IN (12,13,14) or Head_n.stat_type3 IN (12,13,14) or Head_n.stat_type4 IN (12,13,14) or Head_n.stat_type5 IN (12,13,14) or Head_n.stat_type6 IN (12,13,14)) then\n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen Head_n.ItemLevel >=200 AND Head_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen Head_n.socketColor_1 = 0 and Head_n.socketColor_2 = 0 and Head_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\t\twhen left(Head.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\twhen Head.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\twhen left(Head.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Head.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Head_n.ItemLevel >= 251 AND Head_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Head_n.ItemLevel >= 264 AND Head_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Head_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t  \t\t\t  \t\twhen (Head_n.stat_type1 = 4 or Head_n.stat_type2 = 4 or Head_n.stat_type3 = 4 or Head_n.stat_type4 = 4 or Head_n.stat_type5 = 4 or Head_n.stat_type6 = 4) AND (Head_n.stat_type1 IN (0,31,32,38,44) or Head_n.stat_type2 IN (0,31,32,38,44) or Head_n.stat_type3 IN (0,31,32,38,44) or Head_n.stat_type4 IN (0,31,32,38,44) or Head_n.stat_type5 IN (0,31,32,38,44) or Head_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Head_n.stat_type1 = 3 or Head_n.stat_type2 = 3 or Head_n.stat_type3 = 3 or Head_n.stat_type4 = 3 or Head_n.stat_type5 = 3 or Head_n.stat_type6 = 3) AND (Head_n.stat_type1 IN (0,31,32,38,44) or Head_n.stat_type2 IN (0,31,32,38,44) or Head_n.stat_type3 IN (0,31,32,38,44) or Head_n.stat_type4 IN (0,31,32,38,44) or Head_n.stat_type5 IN (0,31,32,38,44) or Head_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Head_n.stat_type1 = 5 or Head_n.stat_type2 = 5 or Head_n.stat_type3 = 5 or Head_n.stat_type4 = 5 or Head_n.stat_type5 = 5 or Head_n.stat_type6 = 5) AND (Head_n.stat_type1 IN (31) or Head_n.stat_type2 IN (31) or Head_n.stat_type3 IN (31) or Head_n.stat_type4 IN (31) or Head_n.stat_type5 IN (31) or Head_n.stat_type6 IN (31)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Head_n.stat_type1 = 5 or Head_n.stat_type2 = 5 or Head_n.stat_type3 = 5 or Head_n.stat_type4 = 5 or Head_n.stat_type5 = 5 or Head_n.stat_type6 = 5) AND (Head_n.stat_type1 IN (32,36,45) or Head_n.stat_type2 IN (32,36,45) or Head_n.stat_type3 IN (32,36,45) or Head_n.stat_type4 IN (32,36,45) or Head_n.stat_type5 IN (32,36,45) or Head_n.stat_type6 IN (32,36,45)) then '1 Gear with wrong stat'\n\t\t\t \t  \tEND\n\t\t\t #Agility DPS\n\t\t     when (characters_npcbot_class_role.class_role IN ('Hunter', 'Rogue', 'Druid Feral DPS', 'Shaman Enhancement')) then \n\t\t\t\t\tcase \n\t\t\t \t  \t\twhen (Head_n.stat_type1 = 4 or Head_n.stat_type2 = 4 or Head_n.stat_type3 = 4 or Head_n.stat_type4 = 4 or Head_n.stat_type5 = 4 or Head_n.stat_type6 = 4) AND (Head_n.stat_type1 IN (12,13,14) or Head_n.stat_type2 IN (12,13,14) or Head_n.stat_type3 IN (12,13,14) or Head_n.stat_type4 IN (12,13,14) or Head_n.stat_type5 IN (12,13,14) or Head_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Head_n.stat_type1 = 3 or Head_n.stat_type2 = 3 or Head_n.stat_type3 = 3 or Head_n.stat_type4 = 3 or Head_n.stat_type5 = 3 or Head_n.stat_type6 = 3) AND (Head_n.stat_type1 IN (12,13,14) or Head_n.stat_type2 IN (12,13,14) or Head_n.stat_type3 IN (12,13,14) or Head_n.stat_type4 IN (12,13,14) or Head_n.stat_type5 IN (12,13,14) or Head_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (Head_n.stat_type1 = 4 or Head_n.stat_type2 = 4 or Head_n.stat_type3 = 4 or Head_n.stat_type4 = 4 or Head_n.stat_type5 = 4 or Head_n.stat_type6 = 4) AND (Head_n.stat_type1 IN (0,31,32,38,44) or Head_n.stat_type2 IN (0,31,32,38,44) or Head_n.stat_type3 IN (0,31,32,38,44) or Head_n.stat_type4 IN (0,31,32,38,44) or Head_n.stat_type5 IN (0,31,32,38,44) or Head_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Head_n.stat_type1 = 3 or Head_n.stat_type2 = 3 or Head_n.stat_type3 = 3 or Head_n.stat_type4 = 3 or Head_n.stat_type5 = 3 or Head_n.stat_type6 = 3) AND (Head_n.stat_type1 IN (0,31,32,38,44) or Head_n.stat_type2 IN (0,31,32,38,44) or Head_n.stat_type3 IN (0,31,32,38,44) or Head_n.stat_type4 IN (0,31,32,38,44) or Head_n.stat_type5 IN (0,31,32,38,44) or Head_n.stat_type6 IN (0,31,32,38,44)) then \n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen Head_n.ItemLevel >=200 AND Head_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen Head_n.socketColor_1 = 0 and Head_n.socketColor_2 = 0 and Head_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\t\twhen left(Head.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\twhen Head.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\twhen left(Head.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Head.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Head_n.ItemLevel >= 251 AND Head_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Head_n.ItemLevel >= 264 AND Head_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Head_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND \n\t\t\t\t  \t\twhen (Head_n.stat_type1 = 5 or Head_n.stat_type2 = 5 or Head_n.stat_type3 = 5 or Head_n.stat_type4 = 5 or Head_n.stat_type5 = 5 or Head_n.stat_type6 = 5) AND (Head_n.stat_type1 IN (31) or Head_n.stat_type2 IN (31) or Head_n.stat_type3 IN (31) or Head_n.stat_type4 IN (31) or Head_n.stat_type5 IN (31) or Head_n.stat_type6 IN (31)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Head_n.stat_type1 = 5 or Head_n.stat_type2 = 5 or Head_n.stat_type3 = 5 or Head_n.stat_type4 = 5 or Head_n.stat_type5 = 5 or Head_n.stat_type6 = 5) AND (Head_n.stat_type1 IN (32,36,45) or Head_n.stat_type2 IN (32,36,45) or Head_n.stat_type3 IN (32,36,45) or Head_n.stat_type4 IN (32,36,45) or Head_n.stat_type5 IN (32,36,45) or Head_n.stat_type6 IN (32,36,45)) then '1 Gear with wrong stat'\n\t\t\t \t  \tEND\n\t\t end  AS '04 Head Analyze',\n\n\t \t\t case\n\t\t\t #Strength DPS\n\t\t     when (characters_npcbot_class_role.class_role IN ('Warrior DPS', 'Paladin DPS', 'DK DPS')) then \n\t\t     \t\tcase \n\t\t\t \t  \t\twhen (Shoulders_n.stat_type1 = 4 or Shoulders_n.stat_type2 = 4 or Shoulders_n.stat_type3 = 4 or Shoulders_n.stat_type4 = 4 or Shoulders_n.stat_type5 = 4 or Shoulders_n.stat_type6 = 4) AND (Shoulders_n.stat_type1 IN (12,13,14) or Shoulders_n.stat_type2 IN (12,13,14) or Shoulders_n.stat_type3 IN (12,13,14) or Shoulders_n.stat_type4 IN (12,13,14) or Shoulders_n.stat_type5 IN (12,13,14) or Shoulders_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Shoulders_n.stat_type1 = 3 or Shoulders_n.stat_type2 = 3 or Shoulders_n.stat_type3 = 3 or Shoulders_n.stat_type4 = 3 or Shoulders_n.stat_type5 = 3 or Shoulders_n.stat_type6 = 3) AND (Shoulders_n.stat_type1 IN (12,13,14) or Shoulders_n.stat_type2 IN (12,13,14) or Shoulders_n.stat_type3 IN (12,13,14) or Shoulders_n.stat_type4 IN (12,13,14) or Shoulders_n.stat_type5 IN (12,13,14) or Shoulders_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (Shoulders_n.stat_type1 = 4 or Shoulders_n.stat_type2 = 4 or Shoulders_n.stat_type3 = 4 or Shoulders_n.stat_type4 = 4 or Shoulders_n.stat_type5 = 4 or Shoulders_n.stat_type6 = 4) AND (Shoulders_n.stat_type1 IN (0,31,32,38,44) or Shoulders_n.stat_type2 IN (0,31,32,38,44) or Shoulders_n.stat_type3 IN (0,31,32,38,44) or Shoulders_n.stat_type4 IN (0,31,32,38,44) or Shoulders_n.stat_type5 IN (0,31,32,38,44) or Shoulders_n.stat_type6 IN (0,31,32,38,44)) then \n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen Shoulders_n.ItemLevel >=200 AND Shoulders_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen Shoulders_n.socketColor_1 = 0 and Shoulders_n.socketColor_2 = 0 and Shoulders_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\t\twhen left(Shoulders.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\twhen Shoulders.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\twhen left(Shoulders.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Shoulders.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Shoulders_n.ItemLevel >= 251 AND Shoulders_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Shoulders_n.ItemLevel >= 264 AND Shoulders_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Shoulders_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND \n\t\t\t \t  \t\twhen (Shoulders_n.stat_type1 = 3 or Shoulders_n.stat_type2 = 3 or Shoulders_n.stat_type3 = 3 or Shoulders_n.stat_type4 = 3 or Shoulders_n.stat_type5 = 3 or Shoulders_n.stat_type6 = 3) AND (Shoulders_n.stat_type1 IN (0,31,32,38,44) or Shoulders_n.stat_type2 IN (0,31,32,38,44) or Shoulders_n.stat_type3 IN (0,31,32,38,44) or Shoulders_n.stat_type4 IN (0,31,32,38,44) or Shoulders_n.stat_type5 IN (0,31,32,38,44) or Shoulders_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Shoulders_n.stat_type1 = 5 or Shoulders_n.stat_type2 = 5 or Shoulders_n.stat_type3 = 5 or Shoulders_n.stat_type4 = 5 or Shoulders_n.stat_type5 = 5 or Shoulders_n.stat_type6 = 5) AND (Shoulders_n.stat_type1 IN (31) or Shoulders_n.stat_type2 IN (31) or Shoulders_n.stat_type3 IN (31) or Shoulders_n.stat_type4 IN (31) or Shoulders_n.stat_type5 IN (31) or Shoulders_n.stat_type6 IN (31)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Shoulders_n.stat_type1 = 5 or Shoulders_n.stat_type2 = 5 or Shoulders_n.stat_type3 = 5 or Shoulders_n.stat_type4 = 5 or Shoulders_n.stat_type5 = 5 or Shoulders_n.stat_type6 = 5) AND (Shoulders_n.stat_type1 IN (32,36,45) or Shoulders_n.stat_type2 IN (32,36,45) or Shoulders_n.stat_type3 IN (32,36,45) or Shoulders_n.stat_type4 IN (32,36,45) or Shoulders_n.stat_type5 IN (32,36,45) or Shoulders_n.stat_type6 IN (32,36,45)) then '1 Gear with wrong stat'\n\t\t\t \t  \tEND\n\t\t\t #Strength Tank\n\t\t     when (characters_npcbot_class_role.class_role IN ('Warrior Tank', 'Paladin Tank', 'DK Tank')) then\n\t\t     \t\tcase \n\t\t\t \t  \t\twhen (Shoulders_n.stat_type1 = 4 or Shoulders_n.stat_type2 = 4 or Shoulders_n.stat_type3 = 4 or Shoulders_n.stat_type4 = 4 or Shoulders_n.stat_type5 = 4 or Shoulders_n.stat_type6 = 4) AND (Shoulders_n.stat_type1 IN (12,13,14) or Shoulders_n.stat_type2 IN (12,13,14) or Shoulders_n.stat_type3 IN (12,13,14) or Shoulders_n.stat_type4 IN (12,13,14) or Shoulders_n.stat_type5 IN (12,13,14) or Shoulders_n.stat_type6 IN (12,13,14)) then \n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen Shoulders_n.ItemLevel >=200 AND Shoulders_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen Shoulders_n.socketColor_1 = 0 and Shoulders_n.socketColor_2 = 0 and Shoulders_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\t\twhen left(Shoulders.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\twhen Shoulders.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\twhen left(Shoulders.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Shoulders.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Shoulders_n.ItemLevel >= 251 AND Shoulders_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Shoulders_n.ItemLevel >= 264 AND Shoulders_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Shoulders_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t\t\t \t  \t\twhen (Shoulders_n.stat_type1 = 3 or Shoulders_n.stat_type2 = 3 or Shoulders_n.stat_type3 = 3 or Shoulders_n.stat_type4 = 3 or Shoulders_n.stat_type5 = 3 or Shoulders_n.stat_type6 = 3) AND (Shoulders_n.stat_type1 IN (12,13,14) or Shoulders_n.stat_type2 IN (12,13,14) or Shoulders_n.stat_type3 IN (12,13,14) or Shoulders_n.stat_type4 IN (12,13,14) or Shoulders_n.stat_type5 IN (12,13,14) or Shoulders_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (Shoulders_n.stat_type1 = 4 or Shoulders_n.stat_type2 = 4 or Shoulders_n.stat_type3 = 4 or Shoulders_n.stat_type4 = 4 or Shoulders_n.stat_type5 = 4 or Shoulders_n.stat_type6 = 4) AND (Shoulders_n.stat_type1 IN (0,31,32,38,44) or Shoulders_n.stat_type2 IN (0,31,32,38,44) or Shoulders_n.stat_type3 IN (0,31,32,38,44) or Shoulders_n.stat_type4 IN (0,31,32,38,44) or Shoulders_n.stat_type5 IN (0,31,32,38,44) or Shoulders_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Shoulders_n.stat_type1 = 3 or Shoulders_n.stat_type2 = 3 or Shoulders_n.stat_type3 = 3 or Shoulders_n.stat_type4 = 3 or Shoulders_n.stat_type5 = 3 or Shoulders_n.stat_type6 = 3) AND (Shoulders_n.stat_type1 IN (0,31,32,38,44) or Shoulders_n.stat_type2 IN (0,31,32,38,44) or Shoulders_n.stat_type3 IN (0,31,32,38,44) or Shoulders_n.stat_type4 IN (0,31,32,38,44) or Shoulders_n.stat_type5 IN (0,31,32,38,44) or Shoulders_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Shoulders_n.stat_type1 = 5 or Shoulders_n.stat_type2 = 5 or Shoulders_n.stat_type3 = 5 or Shoulders_n.stat_type4 = 5 or Shoulders_n.stat_type5 = 5 or Shoulders_n.stat_type6 = 5) AND (Shoulders_n.stat_type1 IN (31) or Shoulders_n.stat_type2 IN (31) or Shoulders_n.stat_type3 IN (31) or Shoulders_n.stat_type4 IN (31) or Shoulders_n.stat_type5 IN (31) or Shoulders_n.stat_type6 IN (31)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Shoulders_n.stat_type1 = 5 or Shoulders_n.stat_type2 = 5 or Shoulders_n.stat_type3 = 5 or Shoulders_n.stat_type4 = 5 or Shoulders_n.stat_type5 = 5 or Shoulders_n.stat_type6 = 5) AND (Shoulders_n.stat_type1 IN (32,36,45) or Shoulders_n.stat_type2 IN (32,36,45) or Shoulders_n.stat_type3 IN (32,36,45) or Shoulders_n.stat_type4 IN (32,36,45) or Shoulders_n.stat_type5 IN (32,36,45) or Shoulders_n.stat_type6 IN (32,36,45)) then '1 Gear with wrong stat'\n\t\t\t \t  \tEND\n\t\t\t \t#Magic DPS\n\t\t      when (characters_npcbot_class_role.class_role IN ('Mage', 'Warlock', 'Shaman Elemental', 'Druid Balance', 'Priest DPS')) then\n\t\t\t \t\tcase \n\t\t\t \t  \t\twhen (Shoulders_n.stat_type1 = 4 or Shoulders_n.stat_type2 = 4 or Shoulders_n.stat_type3 = 4 or Shoulders_n.stat_type4 = 4 or Shoulders_n.stat_type5 = 4 or Shoulders_n.stat_type6 = 4) AND (Shoulders_n.stat_type1 IN (12,13,14) or Shoulders_n.stat_type2 IN (12,13,14) or Shoulders_n.stat_type3 IN (12,13,14) or Shoulders_n.stat_type4 IN (12,13,14) or Shoulders_n.stat_type5 IN (12,13,14) or Shoulders_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Shoulders_n.stat_type1 = 3 or Shoulders_n.stat_type2 = 3 or Shoulders_n.stat_type3 = 3 or Shoulders_n.stat_type4 = 3 or Shoulders_n.stat_type5 = 3 or Shoulders_n.stat_type6 = 3) AND (Shoulders_n.stat_type1 IN (12,13,14) or Shoulders_n.stat_type2 IN (12,13,14) or Shoulders_n.stat_type3 IN (12,13,14) or Shoulders_n.stat_type4 IN (12,13,14) or Shoulders_n.stat_type5 IN (12,13,14) or Shoulders_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (Shoulders_n.stat_type1 = 4 or Shoulders_n.stat_type2 = 4 or Shoulders_n.stat_type3 = 4 or Shoulders_n.stat_type4 = 4 or Shoulders_n.stat_type5 = 4 or Shoulders_n.stat_type6 = 4) AND (Shoulders_n.stat_type1 IN (0,31,32,38,44) or Shoulders_n.stat_type2 IN (0,31,32,38,44) or Shoulders_n.stat_type3 IN (0,31,32,38,44) or Shoulders_n.stat_type4 IN (0,31,32,38,44) or Shoulders_n.stat_type5 IN (0,31,32,38,44) or Shoulders_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Shoulders_n.stat_type1 = 3 or Shoulders_n.stat_type2 = 3 or Shoulders_n.stat_type3 = 3 or Shoulders_n.stat_type4 = 3 or Shoulders_n.stat_type5 = 3 or Shoulders_n.stat_type6 = 3) AND (Shoulders_n.stat_type1 IN (0,31,32,38,44) or Shoulders_n.stat_type2 IN (0,31,32,38,44) or Shoulders_n.stat_type3 IN (0,31,32,38,44) or Shoulders_n.stat_type4 IN (0,31,32,38,44) or Shoulders_n.stat_type5 IN (0,31,32,38,44) or Shoulders_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Shoulders_n.stat_type1 = 5 or Shoulders_n.stat_type2 = 5 or Shoulders_n.stat_type3 = 5 or Shoulders_n.stat_type4 = 5 or Shoulders_n.stat_type5 = 5 or Shoulders_n.stat_type6 = 5) AND (Shoulders_n.stat_type1 IN (31) or Shoulders_n.stat_type2 IN (31) or Shoulders_n.stat_type3 IN (31) or Shoulders_n.stat_type4 IN (31) or Shoulders_n.stat_type5 IN (31) or Shoulders_n.stat_type6 IN (31)) then\n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen Shoulders_n.ItemLevel >=200 AND Shoulders_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen Shoulders_n.socketColor_1 = 0 and Shoulders_n.socketColor_2 = 0 and Shoulders_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\t\twhen left(Shoulders.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\twhen Shoulders.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\twhen left(Shoulders.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Shoulders.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Shoulders_n.ItemLevel >= 251 AND Shoulders_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Shoulders_n.ItemLevel >= 264 AND Shoulders_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Shoulders_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t\t\t\t  \t\twhen (Shoulders_n.stat_type1 = 5 or Shoulders_n.stat_type2 = 5 or Shoulders_n.stat_type3 = 5 or Shoulders_n.stat_type4 = 5 or Shoulders_n.stat_type5 = 5 or Shoulders_n.stat_type6 = 5) AND (Shoulders_n.stat_type1 IN (32,36,45) or Shoulders_n.stat_type2 IN (32,36,45) or Shoulders_n.stat_type3 IN (32,36,45) or Shoulders_n.stat_type4 IN (32,36,45) or Shoulders_n.stat_type5 IN (32,36,45) or Shoulders_n.stat_type6 IN (32,36,45)) then \n\t\t\t\t\t\t  \t\tcase\n\t\t\t\t\t\t\t\t\twhen Shoulders_n.ItemLevel >=200 AND Shoulders_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen Shoulders_n.socketColor_1 = 0 and Shoulders_n.socketColor_2 = 0 and Shoulders_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\t\twhen left(Shoulders.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\twhen Shoulders.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\twhen left(Shoulders.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Shoulders.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Shoulders_n.ItemLevel >= 251 AND Shoulders_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Shoulders_n.ItemLevel >= 264 AND Shoulders_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Shoulders_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND #'Wrong Weapon used: Intellect DPS/Heal'\n\t\t\t \t  \tEND\n\t\t\t  #Healer / DPS\n\t\t     when (characters_npcbot_class_role.class_role IN ('Paladin Healer', 'Priest Healer', 'Warlock', 'Mage', 'Shaman Healer', 'Druid Healer'))\n\t\t\t        then \n\t\t\t \t\tcase \n\t\t\t \t  \t\twhen (Shoulders_n.stat_type1 = 4 or Shoulders_n.stat_type2 = 4 or Shoulders_n.stat_type3 = 4 or Shoulders_n.stat_type4 = 4 or Shoulders_n.stat_type5 = 4 or Shoulders_n.stat_type6 = 4) AND (Shoulders_n.stat_type1 IN (12,13,14) or Shoulders_n.stat_type2 IN (12,13,14) or Shoulders_n.stat_type3 IN (12,13,14) or Shoulders_n.stat_type4 IN (12,13,14) or Shoulders_n.stat_type5 IN (12,13,14) or Shoulders_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Shoulders_n.stat_type1 = 3 or Shoulders_n.stat_type2 = 3 or Shoulders_n.stat_type3 = 3 or Shoulders_n.stat_type4 = 3 or Shoulders_n.stat_type5 = 3 or Shoulders_n.stat_type6 = 3) AND (Shoulders_n.stat_type1 IN (12,13,14) or Shoulders_n.stat_type2 IN (12,13,14) or Shoulders_n.stat_type3 IN (12,13,14) or Shoulders_n.stat_type4 IN (12,13,14) or Shoulders_n.stat_type5 IN (12,13,14) or Shoulders_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (Shoulders_n.stat_type1 = 4 or Shoulders_n.stat_type2 = 4 or Shoulders_n.stat_type3 = 4 or Shoulders_n.stat_type4 = 4 or Shoulders_n.stat_type5 = 4 or Shoulders_n.stat_type6 = 4) AND (Shoulders_n.stat_type1 IN (0,31,32,38,44) or Shoulders_n.stat_type2 IN (0,31,32,38,44) or Shoulders_n.stat_type3 IN (0,31,32,38,44) or Shoulders_n.stat_type4 IN (0,31,32,38,44) or Shoulders_n.stat_type5 IN (0,31,32,38,44) or Shoulders_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Shoulders_n.stat_type1 = 3 or Shoulders_n.stat_type2 = 3 or Shoulders_n.stat_type3 = 3 or Shoulders_n.stat_type4 = 3 or Shoulders_n.stat_type5 = 3 or Shoulders_n.stat_type6 = 3) AND (Shoulders_n.stat_type1 IN (0,31,32,38,44) or Shoulders_n.stat_type2 IN (0,31,32,38,44) or Shoulders_n.stat_type3 IN (0,31,32,38,44) or Shoulders_n.stat_type4 IN (0,31,32,38,44) or Shoulders_n.stat_type5 IN (0,31,32,38,44) or Shoulders_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Shoulders_n.stat_type1 = 5 or Shoulders_n.stat_type2 = 5 or Shoulders_n.stat_type3 = 5 or Shoulders_n.stat_type4 = 5 or Shoulders_n.stat_type5 = 5 or Shoulders_n.stat_type6 = 5) AND (Shoulders_n.stat_type1 IN (31) or Shoulders_n.stat_type2 IN (31) or Shoulders_n.stat_type3 IN (31) or Shoulders_n.stat_type4 IN (31) or Shoulders_n.stat_type5 IN (31) or Shoulders_n.stat_type6 IN (31)) then '2 Gear not optimal for Healer'\n\t\t\t\t  \t\twhen (Shoulders_n.stat_type1 = 5 or Shoulders_n.stat_type2 = 5 or Shoulders_n.stat_type3 = 5 or Shoulders_n.stat_type4 = 5 or Shoulders_n.stat_type5 = 5 or Shoulders_n.stat_type6 = 5) AND (Shoulders_n.stat_type1 IN (32,36,45) or Shoulders_n.stat_type2 IN (32,36,45) or Shoulders_n.stat_type3 IN (32,36,45) or Shoulders_n.stat_type4 IN (32,36,45) or Shoulders_n.stat_type5 IN (32,36,45) or Shoulders_n.stat_type6 IN (32,36,45)) then\n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen Shoulders_n.ItemLevel >=200 AND Shoulders_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen Shoulders_n.socketColor_1 = 0 and Shoulders_n.socketColor_2 = 0 and Shoulders_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\t\twhen left(Shoulders.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\twhen Shoulders.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\twhen left(Shoulders.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Shoulders.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Shoulders_n.ItemLevel >= 251 AND Shoulders_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Shoulders_n.ItemLevel >= 264 AND Shoulders_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Shoulders_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t\t\t \t  \tEND\n\t\t\t \t#Agility Tank\n\t\t     when (characters_npcbot_class_role.class_role IN ('Druid Feral Tank')) then \n\t\t\t \t\tcase \n\t\t\t \t  \t\twhen (Shoulders_n.stat_type1 = 4 or Shoulders_n.stat_type2 = 4 or Shoulders_n.stat_type3 = 4 or Shoulders_n.stat_type4 = 4 or Shoulders_n.stat_type5 = 4 or Shoulders_n.stat_type6 = 4) AND (Shoulders_n.stat_type1 IN (12,13,14) or Shoulders_n.stat_type2 IN (12,13,14) or Shoulders_n.stat_type3 IN (12,13,14) or Shoulders_n.stat_type4 IN (12,13,14) or Shoulders_n.stat_type5 IN (12,13,14) or Shoulders_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Shoulders_n.stat_type1 = 3 or Shoulders_n.stat_type2 = 3 or Shoulders_n.stat_type3 = 3 or Shoulders_n.stat_type4 = 3 or Shoulders_n.stat_type5 = 3 or Shoulders_n.stat_type6 = 3) AND (Shoulders_n.stat_type1 IN (12,13,14) or Shoulders_n.stat_type2 IN (12,13,14) or Shoulders_n.stat_type3 IN (12,13,14) or Shoulders_n.stat_type4 IN (12,13,14) or Shoulders_n.stat_type5 IN (12,13,14) or Shoulders_n.stat_type6 IN (12,13,14)) then\n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen Shoulders_n.ItemLevel >=200 AND Shoulders_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen Shoulders_n.socketColor_1 = 0 and Shoulders_n.socketColor_2 = 0 and Shoulders_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\t\twhen left(Shoulders.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\twhen Shoulders.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\twhen left(Shoulders.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Shoulders.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Shoulders_n.ItemLevel >= 251 AND Shoulders_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Shoulders_n.ItemLevel >= 264 AND Shoulders_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Shoulders_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t  \t\t\t  \t\twhen (Shoulders_n.stat_type1 = 4 or Shoulders_n.stat_type2 = 4 or Shoulders_n.stat_type3 = 4 or Shoulders_n.stat_type4 = 4 or Shoulders_n.stat_type5 = 4 or Shoulders_n.stat_type6 = 4) AND (Shoulders_n.stat_type1 IN (0,31,32,38,44) or Shoulders_n.stat_type2 IN (0,31,32,38,44) or Shoulders_n.stat_type3 IN (0,31,32,38,44) or Shoulders_n.stat_type4 IN (0,31,32,38,44) or Shoulders_n.stat_type5 IN (0,31,32,38,44) or Shoulders_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Shoulders_n.stat_type1 = 3 or Shoulders_n.stat_type2 = 3 or Shoulders_n.stat_type3 = 3 or Shoulders_n.stat_type4 = 3 or Shoulders_n.stat_type5 = 3 or Shoulders_n.stat_type6 = 3) AND (Shoulders_n.stat_type1 IN (0,31,32,38,44) or Shoulders_n.stat_type2 IN (0,31,32,38,44) or Shoulders_n.stat_type3 IN (0,31,32,38,44) or Shoulders_n.stat_type4 IN (0,31,32,38,44) or Shoulders_n.stat_type5 IN (0,31,32,38,44) or Shoulders_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Shoulders_n.stat_type1 = 5 or Shoulders_n.stat_type2 = 5 or Shoulders_n.stat_type3 = 5 or Shoulders_n.stat_type4 = 5 or Shoulders_n.stat_type5 = 5 or Shoulders_n.stat_type6 = 5) AND (Shoulders_n.stat_type1 IN (31) or Shoulders_n.stat_type2 IN (31) or Shoulders_n.stat_type3 IN (31) or Shoulders_n.stat_type4 IN (31) or Shoulders_n.stat_type5 IN (31) or Shoulders_n.stat_type6 IN (31)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Shoulders_n.stat_type1 = 5 or Shoulders_n.stat_type2 = 5 or Shoulders_n.stat_type3 = 5 or Shoulders_n.stat_type4 = 5 or Shoulders_n.stat_type5 = 5 or Shoulders_n.stat_type6 = 5) AND (Shoulders_n.stat_type1 IN (32,36,45) or Shoulders_n.stat_type2 IN (32,36,45) or Shoulders_n.stat_type3 IN (32,36,45) or Shoulders_n.stat_type4 IN (32,36,45) or Shoulders_n.stat_type5 IN (32,36,45) or Shoulders_n.stat_type6 IN (32,36,45)) then '1 Gear with wrong stat'\n\t\t\t \t  \tEND\n\t\t\t #Agility DPS\n\t\t     when (characters_npcbot_class_role.class_role IN ('Hunter', 'Rogue', 'Druid Feral DPS', 'Shaman Enhancement')) then \n\t\t\t\t\tcase \n\t\t\t \t  \t\twhen (Shoulders_n.stat_type1 = 4 or Shoulders_n.stat_type2 = 4 or Shoulders_n.stat_type3 = 4 or Shoulders_n.stat_type4 = 4 or Shoulders_n.stat_type5 = 4 or Shoulders_n.stat_type6 = 4) AND (Shoulders_n.stat_type1 IN (12,13,14) or Shoulders_n.stat_type2 IN (12,13,14) or Shoulders_n.stat_type3 IN (12,13,14) or Shoulders_n.stat_type4 IN (12,13,14) or Shoulders_n.stat_type5 IN (12,13,14) or Shoulders_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Shoulders_n.stat_type1 = 3 or Shoulders_n.stat_type2 = 3 or Shoulders_n.stat_type3 = 3 or Shoulders_n.stat_type4 = 3 or Shoulders_n.stat_type5 = 3 or Shoulders_n.stat_type6 = 3) AND (Shoulders_n.stat_type1 IN (12,13,14) or Shoulders_n.stat_type2 IN (12,13,14) or Shoulders_n.stat_type3 IN (12,13,14) or Shoulders_n.stat_type4 IN (12,13,14) or Shoulders_n.stat_type5 IN (12,13,14) or Shoulders_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (Shoulders_n.stat_type1 = 4 or Shoulders_n.stat_type2 = 4 or Shoulders_n.stat_type3 = 4 or Shoulders_n.stat_type4 = 4 or Shoulders_n.stat_type5 = 4 or Shoulders_n.stat_type6 = 4) AND (Shoulders_n.stat_type1 IN (0,31,32,38,44) or Shoulders_n.stat_type2 IN (0,31,32,38,44) or Shoulders_n.stat_type3 IN (0,31,32,38,44) or Shoulders_n.stat_type4 IN (0,31,32,38,44) or Shoulders_n.stat_type5 IN (0,31,32,38,44) or Shoulders_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Shoulders_n.stat_type1 = 3 or Shoulders_n.stat_type2 = 3 or Shoulders_n.stat_type3 = 3 or Shoulders_n.stat_type4 = 3 or Shoulders_n.stat_type5 = 3 or Shoulders_n.stat_type6 = 3) AND (Shoulders_n.stat_type1 IN (0,31,32,38,44) or Shoulders_n.stat_type2 IN (0,31,32,38,44) or Shoulders_n.stat_type3 IN (0,31,32,38,44) or Shoulders_n.stat_type4 IN (0,31,32,38,44) or Shoulders_n.stat_type5 IN (0,31,32,38,44) or Shoulders_n.stat_type6 IN (0,31,32,38,44)) then \n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen Shoulders_n.ItemLevel >=200 AND Shoulders_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen Shoulders_n.socketColor_1 = 0 and Shoulders_n.socketColor_2 = 0 and Shoulders_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\t\twhen left(Shoulders.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\twhen Shoulders.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\twhen left(Shoulders.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Shoulders.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Shoulders_n.ItemLevel >= 251 AND Shoulders_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Shoulders_n.ItemLevel >= 264 AND Shoulders_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Shoulders_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND \n\t\t\t\t  \t\twhen (Shoulders_n.stat_type1 = 5 or Shoulders_n.stat_type2 = 5 or Shoulders_n.stat_type3 = 5 or Shoulders_n.stat_type4 = 5 or Shoulders_n.stat_type5 = 5 or Shoulders_n.stat_type6 = 5) AND (Shoulders_n.stat_type1 IN (31) or Shoulders_n.stat_type2 IN (31) or Shoulders_n.stat_type3 IN (31) or Shoulders_n.stat_type4 IN (31) or Shoulders_n.stat_type5 IN (31) or Shoulders_n.stat_type6 IN (31)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Shoulders_n.stat_type1 = 5 or Shoulders_n.stat_type2 = 5 or Shoulders_n.stat_type3 = 5 or Shoulders_n.stat_type4 = 5 or Shoulders_n.stat_type5 = 5 or Shoulders_n.stat_type6 = 5) AND (Shoulders_n.stat_type1 IN (32,36,45) or Shoulders_n.stat_type2 IN (32,36,45) or Shoulders_n.stat_type3 IN (32,36,45) or Shoulders_n.stat_type4 IN (32,36,45) or Shoulders_n.stat_type5 IN (32,36,45) or Shoulders_n.stat_type6 IN (32,36,45)) then '1 Gear with wrong stat'\n\t\t\t \t  \tEND\n\t\t end  AS '05 Shoulder Analyze',\n\n\t\t case\n\t\t\t #Strength DPS\n\t\t     when (characters_npcbot_class_role.class_role IN ('Warrior DPS', 'Paladin DPS', 'DK DPS')) then \n\t\t     \t\tcase \n\t\t\t \t  \t\twhen (Chest_n.stat_type1 = 4 or Chest_n.stat_type2 = 4 or Chest_n.stat_type3 = 4 or Chest_n.stat_type4 = 4 or Chest_n.stat_type5 = 4 or Chest_n.stat_type6 = 4) AND (Chest_n.stat_type1 IN (12,13,14) or Chest_n.stat_type2 IN (12,13,14) or Chest_n.stat_type3 IN (12,13,14) or Chest_n.stat_type4 IN (12,13,14) or Chest_n.stat_type5 IN (12,13,14) or Chest_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Chest_n.stat_type1 = 3 or Chest_n.stat_type2 = 3 or Chest_n.stat_type3 = 3 or Chest_n.stat_type4 = 3 or Chest_n.stat_type5 = 3 or Chest_n.stat_type6 = 3) AND (Chest_n.stat_type1 IN (12,13,14) or Chest_n.stat_type2 IN (12,13,14) or Chest_n.stat_type3 IN (12,13,14) or Chest_n.stat_type4 IN (12,13,14) or Chest_n.stat_type5 IN (12,13,14) or Chest_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (Chest_n.stat_type1 = 4 or Chest_n.stat_type2 = 4 or Chest_n.stat_type3 = 4 or Chest_n.stat_type4 = 4 or Chest_n.stat_type5 = 4 or Chest_n.stat_type6 = 4) AND (Chest_n.stat_type1 IN (0,31,32,38,44) or Chest_n.stat_type2 IN (0,31,32,38,44) or Chest_n.stat_type3 IN (0,31,32,38,44) or Chest_n.stat_type4 IN (0,31,32,38,44) or Chest_n.stat_type5 IN (0,31,32,38,44) or Chest_n.stat_type6 IN (0,31,32,38,44)) then \n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen Chest_n.ItemLevel >=200 AND Chest_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen Chest_n.socketColor_1 = 0 and Chest_n.socketColor_2 = 0 and Chest_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\t\twhen left(Chest.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\twhen Chest.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\twhen left(Chest.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Chest.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Chest_n.ItemLevel >= 251 AND Chest_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Chest_n.ItemLevel >= 264 AND Chest_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Chest_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND \n\t\t\t \t  \t\twhen (Chest_n.stat_type1 = 3 or Chest_n.stat_type2 = 3 or Chest_n.stat_type3 = 3 or Chest_n.stat_type4 = 3 or Chest_n.stat_type5 = 3 or Chest_n.stat_type6 = 3) AND (Chest_n.stat_type1 IN (0,31,32,38,44) or Chest_n.stat_type2 IN (0,31,32,38,44) or Chest_n.stat_type3 IN (0,31,32,38,44) or Chest_n.stat_type4 IN (0,31,32,38,44) or Chest_n.stat_type5 IN (0,31,32,38,44) or Chest_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Chest_n.stat_type1 = 5 or Chest_n.stat_type2 = 5 or Chest_n.stat_type3 = 5 or Chest_n.stat_type4 = 5 or Chest_n.stat_type5 = 5 or Chest_n.stat_type6 = 5) AND (Chest_n.stat_type1 IN (31) or Chest_n.stat_type2 IN (31) or Chest_n.stat_type3 IN (31) or Chest_n.stat_type4 IN (31) or Chest_n.stat_type5 IN (31) or Chest_n.stat_type6 IN (31)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Chest_n.stat_type1 = 5 or Chest_n.stat_type2 = 5 or Chest_n.stat_type3 = 5 or Chest_n.stat_type4 = 5 or Chest_n.stat_type5 = 5 or Chest_n.stat_type6 = 5) AND (Chest_n.stat_type1 IN (32,36,45) or Chest_n.stat_type2 IN (32,36,45) or Chest_n.stat_type3 IN (32,36,45) or Chest_n.stat_type4 IN (32,36,45) or Chest_n.stat_type5 IN (32,36,45) or Chest_n.stat_type6 IN (32,36,45)) then '1 Gear with wrong stat'\n\t\t\t \t  \tEND\n\t\t\t #Strength Tank\n\t\t     when (characters_npcbot_class_role.class_role IN ('Warrior Tank', 'Paladin Tank', 'DK Tank')) then\n\t\t     \t\tcase \n\t\t\t \t  \t\twhen (Chest_n.stat_type1 = 4 or Chest_n.stat_type2 = 4 or Chest_n.stat_type3 = 4 or Chest_n.stat_type4 = 4 or Chest_n.stat_type5 = 4 or Chest_n.stat_type6 = 4) AND (Chest_n.stat_type1 IN (12,13,14) or Chest_n.stat_type2 IN (12,13,14) or Chest_n.stat_type3 IN (12,13,14) or Chest_n.stat_type4 IN (12,13,14) or Chest_n.stat_type5 IN (12,13,14) or Chest_n.stat_type6 IN (12,13,14)) then \n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen Chest_n.ItemLevel >=200 AND Chest_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen Chest_n.socketColor_1 = 0 and Chest_n.socketColor_2 = 0 and Chest_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\t\twhen left(Chest.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\twhen Chest.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\twhen left(Chest.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Chest.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Chest_n.ItemLevel >= 251 AND Chest_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Chest_n.ItemLevel >= 264 AND Chest_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Chest_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t\t\t \t  \t\twhen (Chest_n.stat_type1 = 3 or Chest_n.stat_type2 = 3 or Chest_n.stat_type3 = 3 or Chest_n.stat_type4 = 3 or Chest_n.stat_type5 = 3 or Chest_n.stat_type6 = 3) AND (Chest_n.stat_type1 IN (12,13,14) or Chest_n.stat_type2 IN (12,13,14) or Chest_n.stat_type3 IN (12,13,14) or Chest_n.stat_type4 IN (12,13,14) or Chest_n.stat_type5 IN (12,13,14) or Chest_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (Chest_n.stat_type1 = 4 or Chest_n.stat_type2 = 4 or Chest_n.stat_type3 = 4 or Chest_n.stat_type4 = 4 or Chest_n.stat_type5 = 4 or Chest_n.stat_type6 = 4) AND (Chest_n.stat_type1 IN (0,31,32,38,44) or Chest_n.stat_type2 IN (0,31,32,38,44) or Chest_n.stat_type3 IN (0,31,32,38,44) or Chest_n.stat_type4 IN (0,31,32,38,44) or Chest_n.stat_type5 IN (0,31,32,38,44) or Chest_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Chest_n.stat_type1 = 3 or Chest_n.stat_type2 = 3 or Chest_n.stat_type3 = 3 or Chest_n.stat_type4 = 3 or Chest_n.stat_type5 = 3 or Chest_n.stat_type6 = 3) AND (Chest_n.stat_type1 IN (0,31,32,38,44) or Chest_n.stat_type2 IN (0,31,32,38,44) or Chest_n.stat_type3 IN (0,31,32,38,44) or Chest_n.stat_type4 IN (0,31,32,38,44) or Chest_n.stat_type5 IN (0,31,32,38,44) or Chest_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Chest_n.stat_type1 = 5 or Chest_n.stat_type2 = 5 or Chest_n.stat_type3 = 5 or Chest_n.stat_type4 = 5 or Chest_n.stat_type5 = 5 or Chest_n.stat_type6 = 5) AND (Chest_n.stat_type1 IN (31) or Chest_n.stat_type2 IN (31) or Chest_n.stat_type3 IN (31) or Chest_n.stat_type4 IN (31) or Chest_n.stat_type5 IN (31) or Chest_n.stat_type6 IN (31)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Chest_n.stat_type1 = 5 or Chest_n.stat_type2 = 5 or Chest_n.stat_type3 = 5 or Chest_n.stat_type4 = 5 or Chest_n.stat_type5 = 5 or Chest_n.stat_type6 = 5) AND (Chest_n.stat_type1 IN (32,36,45) or Chest_n.stat_type2 IN (32,36,45) or Chest_n.stat_type3 IN (32,36,45) or Chest_n.stat_type4 IN (32,36,45) or Chest_n.stat_type5 IN (32,36,45) or Chest_n.stat_type6 IN (32,36,45)) then '1 Gear with wrong stat'\n\t\t\t \t  \tEND\n\t\t\t \t#Magic DPS\n\t\t      when (characters_npcbot_class_role.class_role IN ('Mage', 'Warlock', 'Shaman Elemental', 'Druid Balance', 'Priest DPS')) then\n\t\t\t \t\tcase \n\t\t\t \t  \t\twhen (Chest_n.stat_type1 = 4 or Chest_n.stat_type2 = 4 or Chest_n.stat_type3 = 4 or Chest_n.stat_type4 = 4 or Chest_n.stat_type5 = 4 or Chest_n.stat_type6 = 4) AND (Chest_n.stat_type1 IN (12,13,14) or Chest_n.stat_type2 IN (12,13,14) or Chest_n.stat_type3 IN (12,13,14) or Chest_n.stat_type4 IN (12,13,14) or Chest_n.stat_type5 IN (12,13,14) or Chest_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Chest_n.stat_type1 = 3 or Chest_n.stat_type2 = 3 or Chest_n.stat_type3 = 3 or Chest_n.stat_type4 = 3 or Chest_n.stat_type5 = 3 or Chest_n.stat_type6 = 3) AND (Chest_n.stat_type1 IN (12,13,14) or Chest_n.stat_type2 IN (12,13,14) or Chest_n.stat_type3 IN (12,13,14) or Chest_n.stat_type4 IN (12,13,14) or Chest_n.stat_type5 IN (12,13,14) or Chest_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (Chest_n.stat_type1 = 4 or Chest_n.stat_type2 = 4 or Chest_n.stat_type3 = 4 or Chest_n.stat_type4 = 4 or Chest_n.stat_type5 = 4 or Chest_n.stat_type6 = 4) AND (Chest_n.stat_type1 IN (0,31,32,38,44) or Chest_n.stat_type2 IN (0,31,32,38,44) or Chest_n.stat_type3 IN (0,31,32,38,44) or Chest_n.stat_type4 IN (0,31,32,38,44) or Chest_n.stat_type5 IN (0,31,32,38,44) or Chest_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Chest_n.stat_type1 = 3 or Chest_n.stat_type2 = 3 or Chest_n.stat_type3 = 3 or Chest_n.stat_type4 = 3 or Chest_n.stat_type5 = 3 or Chest_n.stat_type6 = 3) AND (Chest_n.stat_type1 IN (0,31,32,38,44) or Chest_n.stat_type2 IN (0,31,32,38,44) or Chest_n.stat_type3 IN (0,31,32,38,44) or Chest_n.stat_type4 IN (0,31,32,38,44) or Chest_n.stat_type5 IN (0,31,32,38,44) or Chest_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Chest_n.stat_type1 = 5 or Chest_n.stat_type2 = 5 or Chest_n.stat_type3 = 5 or Chest_n.stat_type4 = 5 or Chest_n.stat_type5 = 5 or Chest_n.stat_type6 = 5) AND (Chest_n.stat_type1 IN (31) or Chest_n.stat_type2 IN (31) or Chest_n.stat_type3 IN (31) or Chest_n.stat_type4 IN (31) or Chest_n.stat_type5 IN (31) or Chest_n.stat_type6 IN (31)) then\n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen Chest_n.ItemLevel >=200 AND Chest_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen Chest_n.socketColor_1 = 0 and Chest_n.socketColor_2 = 0 and Chest_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\t\twhen left(Chest.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\twhen Chest.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\twhen left(Chest.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Chest.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Chest_n.ItemLevel >= 251 AND Chest_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Chest_n.ItemLevel >= 264 AND Chest_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Chest_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t\t\t\t  \t\twhen (Chest_n.stat_type1 = 5 or Chest_n.stat_type2 = 5 or Chest_n.stat_type3 = 5 or Chest_n.stat_type4 = 5 or Chest_n.stat_type5 = 5 or Chest_n.stat_type6 = 5) AND (Chest_n.stat_type1 IN (32,36,45) or Chest_n.stat_type2 IN (32,36,45) or Chest_n.stat_type3 IN (32,36,45) or Chest_n.stat_type4 IN (32,36,45) or Chest_n.stat_type5 IN (32,36,45) or Chest_n.stat_type6 IN (32,36,45)) then \n\t\t\t\t\t\t  \t\tcase\n\t\t\t\t\t\t\t\t\twhen Chest_n.ItemLevel >=200 AND Chest_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen Chest_n.socketColor_1 = 0 and Chest_n.socketColor_2 = 0 and Chest_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\t\twhen left(Chest.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\twhen Chest.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\twhen left(Chest.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Chest.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Chest_n.ItemLevel >= 251 AND Chest_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Chest_n.ItemLevel >= 264 AND Chest_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Chest_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t\t\t \t  \tEND\n\t\t\t  #Healer / DPS\n\t\t     when (characters_npcbot_class_role.class_role IN ('Paladin Healer', 'Priest Healer', 'Warlock', 'Mage', 'Shaman Healer', 'Druid Healer'))\n\t\t\t        then \n\t\t\t \t\tcase \n\t\t\t \t  \t\twhen (Chest_n.stat_type1 = 4 or Chest_n.stat_type2 = 4 or Chest_n.stat_type3 = 4 or Chest_n.stat_type4 = 4 or Chest_n.stat_type5 = 4 or Chest_n.stat_type6 = 4) AND (Chest_n.stat_type1 IN (12,13,14) or Chest_n.stat_type2 IN (12,13,14) or Chest_n.stat_type3 IN (12,13,14) or Chest_n.stat_type4 IN (12,13,14) or Chest_n.stat_type5 IN (12,13,14) or Chest_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Chest_n.stat_type1 = 3 or Chest_n.stat_type2 = 3 or Chest_n.stat_type3 = 3 or Chest_n.stat_type4 = 3 or Chest_n.stat_type5 = 3 or Chest_n.stat_type6 = 3) AND (Chest_n.stat_type1 IN (12,13,14) or Chest_n.stat_type2 IN (12,13,14) or Chest_n.stat_type3 IN (12,13,14) or Chest_n.stat_type4 IN (12,13,14) or Chest_n.stat_type5 IN (12,13,14) or Chest_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (Chest_n.stat_type1 = 4 or Chest_n.stat_type2 = 4 or Chest_n.stat_type3 = 4 or Chest_n.stat_type4 = 4 or Chest_n.stat_type5 = 4 or Chest_n.stat_type6 = 4) AND (Chest_n.stat_type1 IN (0,31,32,38,44) or Chest_n.stat_type2 IN (0,31,32,38,44) or Chest_n.stat_type3 IN (0,31,32,38,44) or Chest_n.stat_type4 IN (0,31,32,38,44) or Chest_n.stat_type5 IN (0,31,32,38,44) or Chest_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Chest_n.stat_type1 = 3 or Chest_n.stat_type2 = 3 or Chest_n.stat_type3 = 3 or Chest_n.stat_type4 = 3 or Chest_n.stat_type5 = 3 or Chest_n.stat_type6 = 3) AND (Chest_n.stat_type1 IN (0,31,32,38,44) or Chest_n.stat_type2 IN (0,31,32,38,44) or Chest_n.stat_type3 IN (0,31,32,38,44) or Chest_n.stat_type4 IN (0,31,32,38,44) or Chest_n.stat_type5 IN (0,31,32,38,44) or Chest_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Chest_n.stat_type1 = 5 or Chest_n.stat_type2 = 5 or Chest_n.stat_type3 = 5 or Chest_n.stat_type4 = 5 or Chest_n.stat_type5 = 5 or Chest_n.stat_type6 = 5) AND (Chest_n.stat_type1 IN (31) or Chest_n.stat_type2 IN (31) or Chest_n.stat_type3 IN (31) or Chest_n.stat_type4 IN (31) or Chest_n.stat_type5 IN (31) or Chest_n.stat_type6 IN (31)) then '2 Gear not optimal for Healer'\n\t\t\t\t  \t\twhen (Chest_n.stat_type1 = 5 or Chest_n.stat_type2 = 5 or Chest_n.stat_type3 = 5 or Chest_n.stat_type4 = 5 or Chest_n.stat_type5 = 5 or Chest_n.stat_type6 = 5) AND (Chest_n.stat_type1 IN (32,36,45) or Chest_n.stat_type2 IN (32,36,45) or Chest_n.stat_type3 IN (32,36,45) or Chest_n.stat_type4 IN (32,36,45) or Chest_n.stat_type5 IN (32,36,45) or Chest_n.stat_type6 IN (32,36,45)) then\n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen Chest_n.ItemLevel >=200 AND Chest_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen Chest_n.socketColor_1 = 0 and Chest_n.socketColor_2 = 0 and Chest_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\t\twhen left(Chest.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\twhen Chest.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\twhen left(Chest.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Chest.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Chest_n.ItemLevel >= 251 AND Chest_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Chest_n.ItemLevel >= 264 AND Chest_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Chest_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t\t\t \t  \tEND\n\t\t\t \t#Agility Tank\n\t\t     when (characters_npcbot_class_role.class_role IN ('Druid Feral Tank')) then \n\t\t\t \t\tcase \n\t\t\t \t  \t\twhen (Chest_n.stat_type1 = 4 or Chest_n.stat_type2 = 4 or Chest_n.stat_type3 = 4 or Chest_n.stat_type4 = 4 or Chest_n.stat_type5 = 4 or Chest_n.stat_type6 = 4) AND (Chest_n.stat_type1 IN (12,13,14) or Chest_n.stat_type2 IN (12,13,14) or Chest_n.stat_type3 IN (12,13,14) or Chest_n.stat_type4 IN (12,13,14) or Chest_n.stat_type5 IN (12,13,14) or Chest_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Chest_n.stat_type1 = 3 or Chest_n.stat_type2 = 3 or Chest_n.stat_type3 = 3 or Chest_n.stat_type4 = 3 or Chest_n.stat_type5 = 3 or Chest_n.stat_type6 = 3) AND (Chest_n.stat_type1 IN (12,13,14) or Chest_n.stat_type2 IN (12,13,14) or Chest_n.stat_type3 IN (12,13,14) or Chest_n.stat_type4 IN (12,13,14) or Chest_n.stat_type5 IN (12,13,14) or Chest_n.stat_type6 IN (12,13,14)) then\n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen Chest_n.ItemLevel >=200 AND Chest_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen Chest_n.socketColor_1 = 0 and Chest_n.socketColor_2 = 0 and Chest_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\t\twhen left(Chest.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\twhen Chest.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\twhen left(Chest.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Chest.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Chest_n.ItemLevel >= 251 AND Chest_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Chest_n.ItemLevel >= 264 AND Chest_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Chest_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t  \t\t\t  \t\twhen (Chest_n.stat_type1 = 4 or Chest_n.stat_type2 = 4 or Chest_n.stat_type3 = 4 or Chest_n.stat_type4 = 4 or Chest_n.stat_type5 = 4 or Chest_n.stat_type6 = 4) AND (Chest_n.stat_type1 IN (0,31,32,38,44) or Chest_n.stat_type2 IN (0,31,32,38,44) or Chest_n.stat_type3 IN (0,31,32,38,44) or Chest_n.stat_type4 IN (0,31,32,38,44) or Chest_n.stat_type5 IN (0,31,32,38,44) or Chest_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Chest_n.stat_type1 = 3 or Chest_n.stat_type2 = 3 or Chest_n.stat_type3 = 3 or Chest_n.stat_type4 = 3 or Chest_n.stat_type5 = 3 or Chest_n.stat_type6 = 3) AND (Chest_n.stat_type1 IN (0,31,32,38,44) or Chest_n.stat_type2 IN (0,31,32,38,44) or Chest_n.stat_type3 IN (0,31,32,38,44) or Chest_n.stat_type4 IN (0,31,32,38,44) or Chest_n.stat_type5 IN (0,31,32,38,44) or Chest_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Chest_n.stat_type1 = 5 or Chest_n.stat_type2 = 5 or Chest_n.stat_type3 = 5 or Chest_n.stat_type4 = 5 or Chest_n.stat_type5 = 5 or Chest_n.stat_type6 = 5) AND (Chest_n.stat_type1 IN (31) or Chest_n.stat_type2 IN (31) or Chest_n.stat_type3 IN (31) or Chest_n.stat_type4 IN (31) or Chest_n.stat_type5 IN (31) or Chest_n.stat_type6 IN (31)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Chest_n.stat_type1 = 5 or Chest_n.stat_type2 = 5 or Chest_n.stat_type3 = 5 or Chest_n.stat_type4 = 5 or Chest_n.stat_type5 = 5 or Chest_n.stat_type6 = 5) AND (Chest_n.stat_type1 IN (32,36,45) or Chest_n.stat_type2 IN (32,36,45) or Chest_n.stat_type3 IN (32,36,45) or Chest_n.stat_type4 IN (32,36,45) or Chest_n.stat_type5 IN (32,36,45) or Chest_n.stat_type6 IN (32,36,45)) then '1 Gear with wrong stat'\n\t\t\t \t  \tEND\n\t\t\t #Agility DPS\n\t\t     when (characters_npcbot_class_role.class_role IN ('Hunter', 'Rogue', 'Druid Feral DPS', 'Shaman Enhancement')) then \n\t\t\t\t\tcase \n\t\t\t \t  \t\twhen (Chest_n.stat_type1 = 4 or Chest_n.stat_type2 = 4 or Chest_n.stat_type3 = 4 or Chest_n.stat_type4 = 4 or Chest_n.stat_type5 = 4 or Chest_n.stat_type6 = 4) AND (Chest_n.stat_type1 IN (12,13,14) or Chest_n.stat_type2 IN (12,13,14) or Chest_n.stat_type3 IN (12,13,14) or Chest_n.stat_type4 IN (12,13,14) or Chest_n.stat_type5 IN (12,13,14) or Chest_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Chest_n.stat_type1 = 3 or Chest_n.stat_type2 = 3 or Chest_n.stat_type3 = 3 or Chest_n.stat_type4 = 3 or Chest_n.stat_type5 = 3 or Chest_n.stat_type6 = 3) AND (Chest_n.stat_type1 IN (12,13,14) or Chest_n.stat_type2 IN (12,13,14) or Chest_n.stat_type3 IN (12,13,14) or Chest_n.stat_type4 IN (12,13,14) or Chest_n.stat_type5 IN (12,13,14) or Chest_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (Chest_n.stat_type1 = 4 or Chest_n.stat_type2 = 4 or Chest_n.stat_type3 = 4 or Chest_n.stat_type4 = 4 or Chest_n.stat_type5 = 4 or Chest_n.stat_type6 = 4) AND (Chest_n.stat_type1 IN (0,31,32,38,44) or Chest_n.stat_type2 IN (0,31,32,38,44) or Chest_n.stat_type3 IN (0,31,32,38,44) or Chest_n.stat_type4 IN (0,31,32,38,44) or Chest_n.stat_type5 IN (0,31,32,38,44) or Chest_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Chest_n.stat_type1 = 3 or Chest_n.stat_type2 = 3 or Chest_n.stat_type3 = 3 or Chest_n.stat_type4 = 3 or Chest_n.stat_type5 = 3 or Chest_n.stat_type6 = 3) AND (Chest_n.stat_type1 IN (0,31,32,38,44) or Chest_n.stat_type2 IN (0,31,32,38,44) or Chest_n.stat_type3 IN (0,31,32,38,44) or Chest_n.stat_type4 IN (0,31,32,38,44) or Chest_n.stat_type5 IN (0,31,32,38,44) or Chest_n.stat_type6 IN (0,31,32,38,44)) then \n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen Chest_n.ItemLevel >=200 AND Chest_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen Chest_n.socketColor_1 = 0 and Chest_n.socketColor_2 = 0 and Chest_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\t\twhen left(Chest.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\twhen Chest.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\twhen left(Chest.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Chest.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Chest_n.ItemLevel >= 251 AND Chest_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Chest_n.ItemLevel >= 264 AND Chest_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Chest_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND \n\t\t\t\t  \t\twhen (Chest_n.stat_type1 = 5 or Chest_n.stat_type2 = 5 or Chest_n.stat_type3 = 5 or Chest_n.stat_type4 = 5 or Chest_n.stat_type5 = 5 or Chest_n.stat_type6 = 5) AND (Chest_n.stat_type1 IN (31) or Chest_n.stat_type2 IN (31) or Chest_n.stat_type3 IN (31) or Chest_n.stat_type4 IN (31) or Chest_n.stat_type5 IN (31) or Chest_n.stat_type6 IN (31)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Chest_n.stat_type1 = 5 or Chest_n.stat_type2 = 5 or Chest_n.stat_type3 = 5 or Chest_n.stat_type4 = 5 or Chest_n.stat_type5 = 5 or Chest_n.stat_type6 = 5) AND (Chest_n.stat_type1 IN (32,36,45) or Chest_n.stat_type2 IN (32,36,45) or Chest_n.stat_type3 IN (32,36,45) or Chest_n.stat_type4 IN (32,36,45) or Chest_n.stat_type5 IN (32,36,45) or Chest_n.stat_type6 IN (32,36,45)) then '1 Gear with wrong stat'\n\t\t\t \t  \tEND\n\t\t end  AS '06 Chest Analyze',\n\n\t\t case\n\t\t\t #Strength DPS\n\t\t     when (characters_npcbot_class_role.class_role IN ('Warrior DPS', 'Paladin DPS', 'DK DPS')) then \n\t\t     \t\tcase \n\t\t\t \t  \t\twhen (Waist_n.stat_type1 = 4 or Waist_n.stat_type2 = 4 or Waist_n.stat_type3 = 4 or Waist_n.stat_type4 = 4 or Waist_n.stat_type5 = 4 or Waist_n.stat_type6 = 4) AND (Waist_n.stat_type1 IN (12,13,14) or Waist_n.stat_type2 IN (12,13,14) or Waist_n.stat_type3 IN (12,13,14) or Waist_n.stat_type4 IN (12,13,14) or Waist_n.stat_type5 IN (12,13,14) or Waist_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Waist_n.stat_type1 = 3 or Waist_n.stat_type2 = 3 or Waist_n.stat_type3 = 3 or Waist_n.stat_type4 = 3 or Waist_n.stat_type5 = 3 or Waist_n.stat_type6 = 3) AND (Waist_n.stat_type1 IN (12,13,14) or Waist_n.stat_type2 IN (12,13,14) or Waist_n.stat_type3 IN (12,13,14) or Waist_n.stat_type4 IN (12,13,14) or Waist_n.stat_type5 IN (12,13,14) or Waist_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (Waist_n.stat_type1 = 4 or Waist_n.stat_type2 = 4 or Waist_n.stat_type3 = 4 or Waist_n.stat_type4 = 4 or Waist_n.stat_type5 = 4 or Waist_n.stat_type6 = 4) AND (Waist_n.stat_type1 IN (0,31,32,38,44) or Waist_n.stat_type2 IN (0,31,32,38,44) or Waist_n.stat_type3 IN (0,31,32,38,44) or Waist_n.stat_type4 IN (0,31,32,38,44) or Waist_n.stat_type5 IN (0,31,32,38,44) or Waist_n.stat_type6 IN (0,31,32,38,44)) then \n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen Waist_n.ItemLevel >=200 AND Waist_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\t#when Waist_n.socketColor_1 = 0 and Waist_n.socketColor_2 = 0 and Waist_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t#\tcase\n\t\t\t\t\t\t\t\t\t#\t\twhen left(Waist.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t#\tend\n\t\t\t\t\t\t\t\t\t#when Waist.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\t#when left(Waist.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Waist.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Waist_n.ItemLevel >= 251 AND Waist_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Waist_n.ItemLevel >= 264 AND Waist_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Waist_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND \n\t\t\t \t  \t\twhen (Waist_n.stat_type1 = 3 or Waist_n.stat_type2 = 3 or Waist_n.stat_type3 = 3 or Waist_n.stat_type4 = 3 or Waist_n.stat_type5 = 3 or Waist_n.stat_type6 = 3) AND (Waist_n.stat_type1 IN (0,31,32,38,44) or Waist_n.stat_type2 IN (0,31,32,38,44) or Waist_n.stat_type3 IN (0,31,32,38,44) or Waist_n.stat_type4 IN (0,31,32,38,44) or Waist_n.stat_type5 IN (0,31,32,38,44) or Waist_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Waist_n.stat_type1 = 5 or Waist_n.stat_type2 = 5 or Waist_n.stat_type3 = 5 or Waist_n.stat_type4 = 5 or Waist_n.stat_type5 = 5 or Waist_n.stat_type6 = 5) AND (Waist_n.stat_type1 IN (31) or Waist_n.stat_type2 IN (31) or Waist_n.stat_type3 IN (31) or Waist_n.stat_type4 IN (31) or Waist_n.stat_type5 IN (31) or Waist_n.stat_type6 IN (31)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Waist_n.stat_type1 = 5 or Waist_n.stat_type2 = 5 or Waist_n.stat_type3 = 5 or Waist_n.stat_type4 = 5 or Waist_n.stat_type5 = 5 or Waist_n.stat_type6 = 5) AND (Waist_n.stat_type1 IN (32,36,45) or Waist_n.stat_type2 IN (32,36,45) or Waist_n.stat_type3 IN (32,36,45) or Waist_n.stat_type4 IN (32,36,45) or Waist_n.stat_type5 IN (32,36,45) or Waist_n.stat_type6 IN (32,36,45)) then '1 Gear with wrong stat'\n\t\t\t \t  \tEND\n\t\t\t #Strength Tank\n\t\t     when (characters_npcbot_class_role.class_role IN ('Warrior Tank', 'Paladin Tank', 'DK Tank')) then\n\t\t     \t\tcase \n\t\t\t \t  \t\twhen (Waist_n.stat_type1 = 4 or Waist_n.stat_type2 = 4 or Waist_n.stat_type3 = 4 or Waist_n.stat_type4 = 4 or Waist_n.stat_type5 = 4 or Waist_n.stat_type6 = 4) AND (Waist_n.stat_type1 IN (12,13,14) or Waist_n.stat_type2 IN (12,13,14) or Waist_n.stat_type3 IN (12,13,14) or Waist_n.stat_type4 IN (12,13,14) or Waist_n.stat_type5 IN (12,13,14) or Waist_n.stat_type6 IN (12,13,14)) then \n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen Waist_n.ItemLevel >=200 AND Waist_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\t#when Waist_n.socketColor_1 = 0 and Waist_n.socketColor_2 = 0 and Waist_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t#\tcase\n\t\t\t\t\t\t\t\t\t#\t\twhen left(Waist.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t#\tend\n\t\t\t\t\t\t\t\t\t#when Waist.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\t#when left(Waist.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Waist.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Waist_n.ItemLevel >= 251 AND Waist_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Waist_n.ItemLevel >= 264 AND Waist_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Waist_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t\t\t \t  \t\twhen (Waist_n.stat_type1 = 3 or Waist_n.stat_type2 = 3 or Waist_n.stat_type3 = 3 or Waist_n.stat_type4 = 3 or Waist_n.stat_type5 = 3 or Waist_n.stat_type6 = 3) AND (Waist_n.stat_type1 IN (12,13,14) or Waist_n.stat_type2 IN (12,13,14) or Waist_n.stat_type3 IN (12,13,14) or Waist_n.stat_type4 IN (12,13,14) or Waist_n.stat_type5 IN (12,13,14) or Waist_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (Waist_n.stat_type1 = 4 or Waist_n.stat_type2 = 4 or Waist_n.stat_type3 = 4 or Waist_n.stat_type4 = 4 or Waist_n.stat_type5 = 4 or Waist_n.stat_type6 = 4) AND (Waist_n.stat_type1 IN (0,31,32,38,44) or Waist_n.stat_type2 IN (0,31,32,38,44) or Waist_n.stat_type3 IN (0,31,32,38,44) or Waist_n.stat_type4 IN (0,31,32,38,44) or Waist_n.stat_type5 IN (0,31,32,38,44) or Waist_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Waist_n.stat_type1 = 3 or Waist_n.stat_type2 = 3 or Waist_n.stat_type3 = 3 or Waist_n.stat_type4 = 3 or Waist_n.stat_type5 = 3 or Waist_n.stat_type6 = 3) AND (Waist_n.stat_type1 IN (0,31,32,38,44) or Waist_n.stat_type2 IN (0,31,32,38,44) or Waist_n.stat_type3 IN (0,31,32,38,44) or Waist_n.stat_type4 IN (0,31,32,38,44) or Waist_n.stat_type5 IN (0,31,32,38,44) or Waist_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Waist_n.stat_type1 = 5 or Waist_n.stat_type2 = 5 or Waist_n.stat_type3 = 5 or Waist_n.stat_type4 = 5 or Waist_n.stat_type5 = 5 or Waist_n.stat_type6 = 5) AND (Waist_n.stat_type1 IN (31) or Waist_n.stat_type2 IN (31) or Waist_n.stat_type3 IN (31) or Waist_n.stat_type4 IN (31) or Waist_n.stat_type5 IN (31) or Waist_n.stat_type6 IN (31)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Waist_n.stat_type1 = 5 or Waist_n.stat_type2 = 5 or Waist_n.stat_type3 = 5 or Waist_n.stat_type4 = 5 or Waist_n.stat_type5 = 5 or Waist_n.stat_type6 = 5) AND (Waist_n.stat_type1 IN (32,36,45) or Waist_n.stat_type2 IN (32,36,45) or Waist_n.stat_type3 IN (32,36,45) or Waist_n.stat_type4 IN (32,36,45) or Waist_n.stat_type5 IN (32,36,45) or Waist_n.stat_type6 IN (32,36,45)) then '1 Gear with wrong stat'\n\t\t\t \t  \tEND\n\t\t\t \t#Magic DPS\n\t\t      when (characters_npcbot_class_role.class_role IN ('Mage', 'Warlock', 'Shaman Elemental', 'Druid Balance', 'Priest DPS')) then\n\t\t\t \t\tcase \n\t\t\t \t  \t\twhen (Waist_n.stat_type1 = 4 or Waist_n.stat_type2 = 4 or Waist_n.stat_type3 = 4 or Waist_n.stat_type4 = 4 or Waist_n.stat_type5 = 4 or Waist_n.stat_type6 = 4) AND (Waist_n.stat_type1 IN (12,13,14) or Waist_n.stat_type2 IN (12,13,14) or Waist_n.stat_type3 IN (12,13,14) or Waist_n.stat_type4 IN (12,13,14) or Waist_n.stat_type5 IN (12,13,14) or Waist_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Waist_n.stat_type1 = 3 or Waist_n.stat_type2 = 3 or Waist_n.stat_type3 = 3 or Waist_n.stat_type4 = 3 or Waist_n.stat_type5 = 3 or Waist_n.stat_type6 = 3) AND (Waist_n.stat_type1 IN (12,13,14) or Waist_n.stat_type2 IN (12,13,14) or Waist_n.stat_type3 IN (12,13,14) or Waist_n.stat_type4 IN (12,13,14) or Waist_n.stat_type5 IN (12,13,14) or Waist_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (Waist_n.stat_type1 = 4 or Waist_n.stat_type2 = 4 or Waist_n.stat_type3 = 4 or Waist_n.stat_type4 = 4 or Waist_n.stat_type5 = 4 or Waist_n.stat_type6 = 4) AND (Waist_n.stat_type1 IN (0,31,32,38,44) or Waist_n.stat_type2 IN (0,31,32,38,44) or Waist_n.stat_type3 IN (0,31,32,38,44) or Waist_n.stat_type4 IN (0,31,32,38,44) or Waist_n.stat_type5 IN (0,31,32,38,44) or Waist_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Waist_n.stat_type1 = 3 or Waist_n.stat_type2 = 3 or Waist_n.stat_type3 = 3 or Waist_n.stat_type4 = 3 or Waist_n.stat_type5 = 3 or Waist_n.stat_type6 = 3) AND (Waist_n.stat_type1 IN (0,31,32,38,44) or Waist_n.stat_type2 IN (0,31,32,38,44) or Waist_n.stat_type3 IN (0,31,32,38,44) or Waist_n.stat_type4 IN (0,31,32,38,44) or Waist_n.stat_type5 IN (0,31,32,38,44) or Waist_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Waist_n.stat_type1 = 5 or Waist_n.stat_type2 = 5 or Waist_n.stat_type3 = 5 or Waist_n.stat_type4 = 5 or Waist_n.stat_type5 = 5 or Waist_n.stat_type6 = 5) AND (Waist_n.stat_type1 IN (31) or Waist_n.stat_type2 IN (31) or Waist_n.stat_type3 IN (31) or Waist_n.stat_type4 IN (31) or Waist_n.stat_type5 IN (31) or Waist_n.stat_type6 IN (31)) then\n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen Waist_n.ItemLevel >=200 AND Waist_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\t#when Waist_n.socketColor_1 = 0 and Waist_n.socketColor_2 = 0 and Waist_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t#\tcase\n\t\t\t\t\t\t\t\t\t#\t\twhen left(Waist.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t#\tend\n\t\t\t\t\t\t\t\t\t#when Waist.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\t#when left(Waist.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Waist.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Waist_n.ItemLevel >= 251 AND Waist_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Waist_n.ItemLevel >= 264 AND Waist_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Waist_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t\t\t\t  \t\twhen (Waist_n.stat_type1 = 5 or Waist_n.stat_type2 = 5 or Waist_n.stat_type3 = 5 or Waist_n.stat_type4 = 5 or Waist_n.stat_type5 = 5 or Waist_n.stat_type6 = 5) AND (Waist_n.stat_type1 IN (32,36,45) or Waist_n.stat_type2 IN (32,36,45) or Waist_n.stat_type3 IN (32,36,45) or Waist_n.stat_type4 IN (32,36,45) or Waist_n.stat_type5 IN (32,36,45) or Waist_n.stat_type6 IN (32,36,45)) then \n\t\t\t\t\t\t  \t\tcase\n\t\t\t\t\t\t\t\t\twhen Waist_n.ItemLevel >=200 AND Waist_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\t#when Waist_n.socketColor_1 = 0 and Waist_n.socketColor_2 = 0 and Waist_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t#\tcase\n\t\t\t\t\t\t\t\t\t#\t\twhen left(Waist.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t#\tend\n\t\t\t\t\t\t\t\t\t#when Waist.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\t#when left(Waist.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Waist.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Waist_n.ItemLevel >= 251 AND Waist_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Waist_n.ItemLevel >= 264 AND Waist_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Waist_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t\t\t \t  \tEND\n\t\t\t  #Healer / DPS\n\t\t     when (characters_npcbot_class_role.class_role IN ('Paladin Healer', 'Priest Healer', 'Warlock', 'Mage', 'Shaman Healer', 'Druid Healer'))\n\t\t\t        then \n\t\t\t \t\tcase \n\t\t\t \t  \t\twhen (Waist_n.stat_type1 = 4 or Waist_n.stat_type2 = 4 or Waist_n.stat_type3 = 4 or Waist_n.stat_type4 = 4 or Waist_n.stat_type5 = 4 or Waist_n.stat_type6 = 4) AND (Waist_n.stat_type1 IN (12,13,14) or Waist_n.stat_type2 IN (12,13,14) or Waist_n.stat_type3 IN (12,13,14) or Waist_n.stat_type4 IN (12,13,14) or Waist_n.stat_type5 IN (12,13,14) or Waist_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Waist_n.stat_type1 = 3 or Waist_n.stat_type2 = 3 or Waist_n.stat_type3 = 3 or Waist_n.stat_type4 = 3 or Waist_n.stat_type5 = 3 or Waist_n.stat_type6 = 3) AND (Waist_n.stat_type1 IN (12,13,14) or Waist_n.stat_type2 IN (12,13,14) or Waist_n.stat_type3 IN (12,13,14) or Waist_n.stat_type4 IN (12,13,14) or Waist_n.stat_type5 IN (12,13,14) or Waist_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (Waist_n.stat_type1 = 4 or Waist_n.stat_type2 = 4 or Waist_n.stat_type3 = 4 or Waist_n.stat_type4 = 4 or Waist_n.stat_type5 = 4 or Waist_n.stat_type6 = 4) AND (Waist_n.stat_type1 IN (0,31,32,38,44) or Waist_n.stat_type2 IN (0,31,32,38,44) or Waist_n.stat_type3 IN (0,31,32,38,44) or Waist_n.stat_type4 IN (0,31,32,38,44) or Waist_n.stat_type5 IN (0,31,32,38,44) or Waist_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Waist_n.stat_type1 = 3 or Waist_n.stat_type2 = 3 or Waist_n.stat_type3 = 3 or Waist_n.stat_type4 = 3 or Waist_n.stat_type5 = 3 or Waist_n.stat_type6 = 3) AND (Waist_n.stat_type1 IN (0,31,32,38,44) or Waist_n.stat_type2 IN (0,31,32,38,44) or Waist_n.stat_type3 IN (0,31,32,38,44) or Waist_n.stat_type4 IN (0,31,32,38,44) or Waist_n.stat_type5 IN (0,31,32,38,44) or Waist_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Waist_n.stat_type1 = 5 or Waist_n.stat_type2 = 5 or Waist_n.stat_type3 = 5 or Waist_n.stat_type4 = 5 or Waist_n.stat_type5 = 5 or Waist_n.stat_type6 = 5) AND (Waist_n.stat_type1 IN (31) or Waist_n.stat_type2 IN (31) or Waist_n.stat_type3 IN (31) or Waist_n.stat_type4 IN (31) or Waist_n.stat_type5 IN (31) or Waist_n.stat_type6 IN (31)) then '2 Gear not optimal for Healer'\n\t\t\t\t  \t\twhen (Waist_n.stat_type1 = 5 or Waist_n.stat_type2 = 5 or Waist_n.stat_type3 = 5 or Waist_n.stat_type4 = 5 or Waist_n.stat_type5 = 5 or Waist_n.stat_type6 = 5) AND (Waist_n.stat_type1 IN (32,36,45) or Waist_n.stat_type2 IN (32,36,45) or Waist_n.stat_type3 IN (32,36,45) or Waist_n.stat_type4 IN (32,36,45) or Waist_n.stat_type5 IN (32,36,45) or Waist_n.stat_type6 IN (32,36,45)) then\n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen Waist_n.ItemLevel >=200 AND Waist_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\t#when Waist_n.socketColor_1 = 0 and Waist_n.socketColor_2 = 0 and Waist_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t#\tcase\n\t\t\t\t\t\t\t\t\t#\t\twhen left(Waist.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t#\tend\n\t\t\t\t\t\t\t\t\t#when Waist.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\t#when left(Waist.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Waist.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Waist_n.ItemLevel >= 251 AND Waist_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Waist_n.ItemLevel >= 264 AND Waist_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Waist_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t\t\t \t  \tEND\n\t\t\t \t#Agility Tank\n\t\t     when (characters_npcbot_class_role.class_role IN ('Druid Feral Tank')) then \n\t\t\t \t\tcase \n\t\t\t \t  \t\twhen (Waist_n.stat_type1 = 4 or Waist_n.stat_type2 = 4 or Waist_n.stat_type3 = 4 or Waist_n.stat_type4 = 4 or Waist_n.stat_type5 = 4 or Waist_n.stat_type6 = 4) AND (Waist_n.stat_type1 IN (12,13,14) or Waist_n.stat_type2 IN (12,13,14) or Waist_n.stat_type3 IN (12,13,14) or Waist_n.stat_type4 IN (12,13,14) or Waist_n.stat_type5 IN (12,13,14) or Waist_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Waist_n.stat_type1 = 3 or Waist_n.stat_type2 = 3 or Waist_n.stat_type3 = 3 or Waist_n.stat_type4 = 3 or Waist_n.stat_type5 = 3 or Waist_n.stat_type6 = 3) AND (Waist_n.stat_type1 IN (12,13,14) or Waist_n.stat_type2 IN (12,13,14) or Waist_n.stat_type3 IN (12,13,14) or Waist_n.stat_type4 IN (12,13,14) or Waist_n.stat_type5 IN (12,13,14) or Waist_n.stat_type6 IN (12,13,14)) then\n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen Waist_n.ItemLevel >=200 AND Waist_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\t#when Waist_n.socketColor_1 = 0 and Waist_n.socketColor_2 = 0 and Waist_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t#\tcase\n\t\t\t\t\t\t\t\t\t#\t\twhen left(Waist.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t#\tend\n\t\t\t\t\t\t\t\t\t#when Waist.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\t#when left(Waist.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Waist.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Waist_n.ItemLevel >= 251 AND Waist_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Waist_n.ItemLevel >= 264 AND Waist_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Waist_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t  \t\t\t  \t\twhen (Waist_n.stat_type1 = 4 or Waist_n.stat_type2 = 4 or Waist_n.stat_type3 = 4 or Waist_n.stat_type4 = 4 or Waist_n.stat_type5 = 4 or Waist_n.stat_type6 = 4) AND (Waist_n.stat_type1 IN (0,31,32,38,44) or Waist_n.stat_type2 IN (0,31,32,38,44) or Waist_n.stat_type3 IN (0,31,32,38,44) or Waist_n.stat_type4 IN (0,31,32,38,44) or Waist_n.stat_type5 IN (0,31,32,38,44) or Waist_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Waist_n.stat_type1 = 3 or Waist_n.stat_type2 = 3 or Waist_n.stat_type3 = 3 or Waist_n.stat_type4 = 3 or Waist_n.stat_type5 = 3 or Waist_n.stat_type6 = 3) AND (Waist_n.stat_type1 IN (0,31,32,38,44) or Waist_n.stat_type2 IN (0,31,32,38,44) or Waist_n.stat_type3 IN (0,31,32,38,44) or Waist_n.stat_type4 IN (0,31,32,38,44) or Waist_n.stat_type5 IN (0,31,32,38,44) or Waist_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Waist_n.stat_type1 = 5 or Waist_n.stat_type2 = 5 or Waist_n.stat_type3 = 5 or Waist_n.stat_type4 = 5 or Waist_n.stat_type5 = 5 or Waist_n.stat_type6 = 5) AND (Waist_n.stat_type1 IN (31) or Waist_n.stat_type2 IN (31) or Waist_n.stat_type3 IN (31) or Waist_n.stat_type4 IN (31) or Waist_n.stat_type5 IN (31) or Waist_n.stat_type6 IN (31)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Waist_n.stat_type1 = 5 or Waist_n.stat_type2 = 5 or Waist_n.stat_type3 = 5 or Waist_n.stat_type4 = 5 or Waist_n.stat_type5 = 5 or Waist_n.stat_type6 = 5) AND (Waist_n.stat_type1 IN (32,36,45) or Waist_n.stat_type2 IN (32,36,45) or Waist_n.stat_type3 IN (32,36,45) or Waist_n.stat_type4 IN (32,36,45) or Waist_n.stat_type5 IN (32,36,45) or Waist_n.stat_type6 IN (32,36,45)) then '1 Gear with wrong stat'\n\t\t\t \t  \tEND\n\t\t\t #Agility DPS\n\t\t     when (characters_npcbot_class_role.class_role IN ('Hunter', 'Rogue', 'Druid Feral DPS', 'Shaman Enhancement')) then \n\t\t\t\t\tcase \n\t\t\t \t  \t\twhen (Waist_n.stat_type1 = 4 or Waist_n.stat_type2 = 4 or Waist_n.stat_type3 = 4 or Waist_n.stat_type4 = 4 or Waist_n.stat_type5 = 4 or Waist_n.stat_type6 = 4) AND (Waist_n.stat_type1 IN (12,13,14) or Waist_n.stat_type2 IN (12,13,14) or Waist_n.stat_type3 IN (12,13,14) or Waist_n.stat_type4 IN (12,13,14) or Waist_n.stat_type5 IN (12,13,14) or Waist_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Waist_n.stat_type1 = 3 or Waist_n.stat_type2 = 3 or Waist_n.stat_type3 = 3 or Waist_n.stat_type4 = 3 or Waist_n.stat_type5 = 3 or Waist_n.stat_type6 = 3) AND (Waist_n.stat_type1 IN (12,13,14) or Waist_n.stat_type2 IN (12,13,14) or Waist_n.stat_type3 IN (12,13,14) or Waist_n.stat_type4 IN (12,13,14) or Waist_n.stat_type5 IN (12,13,14) or Waist_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (Waist_n.stat_type1 = 4 or Waist_n.stat_type2 = 4 or Waist_n.stat_type3 = 4 or Waist_n.stat_type4 = 4 or Waist_n.stat_type5 = 4 or Waist_n.stat_type6 = 4) AND (Waist_n.stat_type1 IN (0,31,32,38,44) or Waist_n.stat_type2 IN (0,31,32,38,44) or Waist_n.stat_type3 IN (0,31,32,38,44) or Waist_n.stat_type4 IN (0,31,32,38,44) or Waist_n.stat_type5 IN (0,31,32,38,44) or Waist_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Waist_n.stat_type1 = 3 or Waist_n.stat_type2 = 3 or Waist_n.stat_type3 = 3 or Waist_n.stat_type4 = 3 or Waist_n.stat_type5 = 3 or Waist_n.stat_type6 = 3) AND (Waist_n.stat_type1 IN (0,31,32,38,44) or Waist_n.stat_type2 IN (0,31,32,38,44) or Waist_n.stat_type3 IN (0,31,32,38,44) or Waist_n.stat_type4 IN (0,31,32,38,44) or Waist_n.stat_type5 IN (0,31,32,38,44) or Waist_n.stat_type6 IN (0,31,32,38,44)) then \n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen Waist_n.ItemLevel >=200 AND Waist_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\t#when Waist_n.socketColor_1 = 0 and Waist_n.socketColor_2 = 0 and Waist_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t#\tcase\n\t\t\t\t\t\t\t\t\t#\t\twhen left(Waist.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t#\tend\n\t\t\t\t\t\t\t\t\t#when Waist.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\t#when left(Waist.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Waist.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Waist_n.ItemLevel >= 251 AND Waist_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Waist_n.ItemLevel >= 264 AND Waist_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Waist_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND \n\t\t\t\t  \t\twhen (Waist_n.stat_type1 = 5 or Waist_n.stat_type2 = 5 or Waist_n.stat_type3 = 5 or Waist_n.stat_type4 = 5 or Waist_n.stat_type5 = 5 or Waist_n.stat_type6 = 5) AND (Waist_n.stat_type1 IN (31) or Waist_n.stat_type2 IN (31) or Waist_n.stat_type3 IN (31) or Waist_n.stat_type4 IN (31) or Waist_n.stat_type5 IN (31) or Waist_n.stat_type6 IN (31)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Waist_n.stat_type1 = 5 or Waist_n.stat_type2 = 5 or Waist_n.stat_type3 = 5 or Waist_n.stat_type4 = 5 or Waist_n.stat_type5 = 5 or Waist_n.stat_type6 = 5) AND (Waist_n.stat_type1 IN (32,36,45) or Waist_n.stat_type2 IN (32,36,45) or Waist_n.stat_type3 IN (32,36,45) or Waist_n.stat_type4 IN (32,36,45) or Waist_n.stat_type5 IN (32,36,45) or Waist_n.stat_type6 IN (32,36,45)) then '1 Gear with wrong stat'\n\t\t\t \t  \tEND\n\t\t end  AS '07 Waist Analyze',\n\n\t\t case\n\t\t\t #Strength DPS\n\t\t     when (characters_npcbot_class_role.class_role IN ('Warrior DPS', 'Paladin DPS', 'DK DPS')) then \n\t\t     \t\tcase \n\t\t\t \t  \t\twhen (Legs_n.stat_type1 = 4 or Legs_n.stat_type2 = 4 or Legs_n.stat_type3 = 4 or Legs_n.stat_type4 = 4 or Legs_n.stat_type5 = 4 or Legs_n.stat_type6 = 4) AND (Legs_n.stat_type1 IN (12,13,14) or Legs_n.stat_type2 IN (12,13,14) or Legs_n.stat_type3 IN (12,13,14) or Legs_n.stat_type4 IN (12,13,14) or Legs_n.stat_type5 IN (12,13,14) or Legs_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Legs_n.stat_type1 = 3 or Legs_n.stat_type2 = 3 or Legs_n.stat_type3 = 3 or Legs_n.stat_type4 = 3 or Legs_n.stat_type5 = 3 or Legs_n.stat_type6 = 3) AND (Legs_n.stat_type1 IN (12,13,14) or Legs_n.stat_type2 IN (12,13,14) or Legs_n.stat_type3 IN (12,13,14) or Legs_n.stat_type4 IN (12,13,14) or Legs_n.stat_type5 IN (12,13,14) or Legs_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (Legs_n.stat_type1 = 4 or Legs_n.stat_type2 = 4 or Legs_n.stat_type3 = 4 or Legs_n.stat_type4 = 4 or Legs_n.stat_type5 = 4 or Legs_n.stat_type6 = 4) AND (Legs_n.stat_type1 IN (0,31,32,38,44) or Legs_n.stat_type2 IN (0,31,32,38,44) or Legs_n.stat_type3 IN (0,31,32,38,44) or Legs_n.stat_type4 IN (0,31,32,38,44) or Legs_n.stat_type5 IN (0,31,32,38,44) or Legs_n.stat_type6 IN (0,31,32,38,44)) then \n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen Legs_n.ItemLevel >=200 AND Legs_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen Legs_n.socketColor_1 = 0 and Legs_n.socketColor_2 = 0 and Legs_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\t\twhen left(Legs.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\twhen Legs.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\twhen left(Legs.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Legs.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Legs_n.ItemLevel >= 251 AND Legs_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Legs_n.ItemLevel >= 264 AND Legs_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Legs_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND \n\t\t\t \t  \t\twhen (Legs_n.stat_type1 = 3 or Legs_n.stat_type2 = 3 or Legs_n.stat_type3 = 3 or Legs_n.stat_type4 = 3 or Legs_n.stat_type5 = 3 or Legs_n.stat_type6 = 3) AND (Legs_n.stat_type1 IN (0,31,32,38,44) or Legs_n.stat_type2 IN (0,31,32,38,44) or Legs_n.stat_type3 IN (0,31,32,38,44) or Legs_n.stat_type4 IN (0,31,32,38,44) or Legs_n.stat_type5 IN (0,31,32,38,44) or Legs_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Legs_n.stat_type1 = 5 or Legs_n.stat_type2 = 5 or Legs_n.stat_type3 = 5 or Legs_n.stat_type4 = 5 or Legs_n.stat_type5 = 5 or Legs_n.stat_type6 = 5) AND (Legs_n.stat_type1 IN (31) or Legs_n.stat_type2 IN (31) or Legs_n.stat_type3 IN (31) or Legs_n.stat_type4 IN (31) or Legs_n.stat_type5 IN (31) or Legs_n.stat_type6 IN (31)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Legs_n.stat_type1 = 5 or Legs_n.stat_type2 = 5 or Legs_n.stat_type3 = 5 or Legs_n.stat_type4 = 5 or Legs_n.stat_type5 = 5 or Legs_n.stat_type6 = 5) AND (Legs_n.stat_type1 IN (32,36,45) or Legs_n.stat_type2 IN (32,36,45) or Legs_n.stat_type3 IN (32,36,45) or Legs_n.stat_type4 IN (32,36,45) or Legs_n.stat_type5 IN (32,36,45) or Legs_n.stat_type6 IN (32,36,45)) then '1 Gear with wrong stat'\n\t\t\t \t  \tEND\n\t\t\t #Strength Tank\n\t\t     when (characters_npcbot_class_role.class_role IN ('Warrior Tank', 'Paladin Tank', 'DK Tank')) then\n\t\t     \t\tcase \n\t\t\t \t  \t\twhen (Legs_n.stat_type1 = 4 or Legs_n.stat_type2 = 4 or Legs_n.stat_type3 = 4 or Legs_n.stat_type4 = 4 or Legs_n.stat_type5 = 4 or Legs_n.stat_type6 = 4) AND (Legs_n.stat_type1 IN (12,13,14) or Legs_n.stat_type2 IN (12,13,14) or Legs_n.stat_type3 IN (12,13,14) or Legs_n.stat_type4 IN (12,13,14) or Legs_n.stat_type5 IN (12,13,14) or Legs_n.stat_type6 IN (12,13,14)) then \n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen Legs_n.ItemLevel >=200 AND Legs_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen Legs_n.socketColor_1 = 0 and Legs_n.socketColor_2 = 0 and Legs_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\t\twhen left(Legs.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\twhen Legs.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\twhen left(Legs.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Legs.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Legs_n.ItemLevel >= 251 AND Legs_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Legs_n.ItemLevel >= 264 AND Legs_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Legs_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t\t\t \t  \t\twhen (Legs_n.stat_type1 = 3 or Legs_n.stat_type2 = 3 or Legs_n.stat_type3 = 3 or Legs_n.stat_type4 = 3 or Legs_n.stat_type5 = 3 or Legs_n.stat_type6 = 3) AND (Legs_n.stat_type1 IN (12,13,14) or Legs_n.stat_type2 IN (12,13,14) or Legs_n.stat_type3 IN (12,13,14) or Legs_n.stat_type4 IN (12,13,14) or Legs_n.stat_type5 IN (12,13,14) or Legs_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (Legs_n.stat_type1 = 4 or Legs_n.stat_type2 = 4 or Legs_n.stat_type3 = 4 or Legs_n.stat_type4 = 4 or Legs_n.stat_type5 = 4 or Legs_n.stat_type6 = 4) AND (Legs_n.stat_type1 IN (0,31,32,38,44) or Legs_n.stat_type2 IN (0,31,32,38,44) or Legs_n.stat_type3 IN (0,31,32,38,44) or Legs_n.stat_type4 IN (0,31,32,38,44) or Legs_n.stat_type5 IN (0,31,32,38,44) or Legs_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Legs_n.stat_type1 = 3 or Legs_n.stat_type2 = 3 or Legs_n.stat_type3 = 3 or Legs_n.stat_type4 = 3 or Legs_n.stat_type5 = 3 or Legs_n.stat_type6 = 3) AND (Legs_n.stat_type1 IN (0,31,32,38,44) or Legs_n.stat_type2 IN (0,31,32,38,44) or Legs_n.stat_type3 IN (0,31,32,38,44) or Legs_n.stat_type4 IN (0,31,32,38,44) or Legs_n.stat_type5 IN (0,31,32,38,44) or Legs_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Legs_n.stat_type1 = 5 or Legs_n.stat_type2 = 5 or Legs_n.stat_type3 = 5 or Legs_n.stat_type4 = 5 or Legs_n.stat_type5 = 5 or Legs_n.stat_type6 = 5) AND (Legs_n.stat_type1 IN (31) or Legs_n.stat_type2 IN (31) or Legs_n.stat_type3 IN (31) or Legs_n.stat_type4 IN (31) or Legs_n.stat_type5 IN (31) or Legs_n.stat_type6 IN (31)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Legs_n.stat_type1 = 5 or Legs_n.stat_type2 = 5 or Legs_n.stat_type3 = 5 or Legs_n.stat_type4 = 5 or Legs_n.stat_type5 = 5 or Legs_n.stat_type6 = 5) AND (Legs_n.stat_type1 IN (32,36,45) or Legs_n.stat_type2 IN (32,36,45) or Legs_n.stat_type3 IN (32,36,45) or Legs_n.stat_type4 IN (32,36,45) or Legs_n.stat_type5 IN (32,36,45) or Legs_n.stat_type6 IN (32,36,45)) then '1 Gear with wrong stat'\n\t\t\t \t  \tEND\n\t\t\t \t#Magic DPS\n\t\t      when (characters_npcbot_class_role.class_role IN ('Mage', 'Warlock', 'Shaman Elemental', 'Druid Balance', 'Priest DPS')) then\n\t\t\t \t\tcase \n\t\t\t \t  \t\twhen (Legs_n.stat_type1 = 4 or Legs_n.stat_type2 = 4 or Legs_n.stat_type3 = 4 or Legs_n.stat_type4 = 4 or Legs_n.stat_type5 = 4 or Legs_n.stat_type6 = 4) AND (Legs_n.stat_type1 IN (12,13,14) or Legs_n.stat_type2 IN (12,13,14) or Legs_n.stat_type3 IN (12,13,14) or Legs_n.stat_type4 IN (12,13,14) or Legs_n.stat_type5 IN (12,13,14) or Legs_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Legs_n.stat_type1 = 3 or Legs_n.stat_type2 = 3 or Legs_n.stat_type3 = 3 or Legs_n.stat_type4 = 3 or Legs_n.stat_type5 = 3 or Legs_n.stat_type6 = 3) AND (Legs_n.stat_type1 IN (12,13,14) or Legs_n.stat_type2 IN (12,13,14) or Legs_n.stat_type3 IN (12,13,14) or Legs_n.stat_type4 IN (12,13,14) or Legs_n.stat_type5 IN (12,13,14) or Legs_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (Legs_n.stat_type1 = 4 or Legs_n.stat_type2 = 4 or Legs_n.stat_type3 = 4 or Legs_n.stat_type4 = 4 or Legs_n.stat_type5 = 4 or Legs_n.stat_type6 = 4) AND (Legs_n.stat_type1 IN (0,31,32,38,44) or Legs_n.stat_type2 IN (0,31,32,38,44) or Legs_n.stat_type3 IN (0,31,32,38,44) or Legs_n.stat_type4 IN (0,31,32,38,44) or Legs_n.stat_type5 IN (0,31,32,38,44) or Legs_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Legs_n.stat_type1 = 3 or Legs_n.stat_type2 = 3 or Legs_n.stat_type3 = 3 or Legs_n.stat_type4 = 3 or Legs_n.stat_type5 = 3 or Legs_n.stat_type6 = 3) AND (Legs_n.stat_type1 IN (0,31,32,38,44) or Legs_n.stat_type2 IN (0,31,32,38,44) or Legs_n.stat_type3 IN (0,31,32,38,44) or Legs_n.stat_type4 IN (0,31,32,38,44) or Legs_n.stat_type5 IN (0,31,32,38,44) or Legs_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Legs_n.stat_type1 = 5 or Legs_n.stat_type2 = 5 or Legs_n.stat_type3 = 5 or Legs_n.stat_type4 = 5 or Legs_n.stat_type5 = 5 or Legs_n.stat_type6 = 5) AND (Legs_n.stat_type1 IN (31) or Legs_n.stat_type2 IN (31) or Legs_n.stat_type3 IN (31) or Legs_n.stat_type4 IN (31) or Legs_n.stat_type5 IN (31) or Legs_n.stat_type6 IN (31)) then\n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen Legs_n.ItemLevel >=200 AND Legs_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen Legs_n.socketColor_1 = 0 and Legs_n.socketColor_2 = 0 and Legs_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\t\twhen left(Legs.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\twhen Legs.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\twhen left(Legs.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Legs.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Legs_n.ItemLevel >= 251 AND Legs_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Legs_n.ItemLevel >= 264 AND Legs_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Legs_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t\t\t\t  \t\twhen (Legs_n.stat_type1 = 5 or Legs_n.stat_type2 = 5 or Legs_n.stat_type3 = 5 or Legs_n.stat_type4 = 5 or Legs_n.stat_type5 = 5 or Legs_n.stat_type6 = 5) AND (Legs_n.stat_type1 IN (32,36,45) or Legs_n.stat_type2 IN (32,36,45) or Legs_n.stat_type3 IN (32,36,45) or Legs_n.stat_type4 IN (32,36,45) or Legs_n.stat_type5 IN (32,36,45) or Legs_n.stat_type6 IN (32,36,45)) then \n\t\t\t\t\t\t  \t\tcase\n\t\t\t\t\t\t\t\t\twhen Legs_n.ItemLevel >=200 AND Legs_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen Legs_n.socketColor_1 = 0 and Legs_n.socketColor_2 = 0 and Legs_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\t\twhen left(Legs.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\twhen Legs.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\twhen left(Legs.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Legs.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Legs_n.ItemLevel >= 251 AND Legs_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Legs_n.ItemLevel >= 264 AND Legs_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Legs_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t\t\t \t  \tEND\n\t\t\t  #Healer / DPS\n\t\t     when (characters_npcbot_class_role.class_role IN ('Paladin Healer', 'Priest Healer', 'Warlock', 'Mage', 'Shaman Healer', 'Druid Healer'))\n\t\t\t        then \n\t\t\t \t\tcase \n\t\t\t \t  \t\twhen (Legs_n.stat_type1 = 4 or Legs_n.stat_type2 = 4 or Legs_n.stat_type3 = 4 or Legs_n.stat_type4 = 4 or Legs_n.stat_type5 = 4 or Legs_n.stat_type6 = 4) AND (Legs_n.stat_type1 IN (12,13,14) or Legs_n.stat_type2 IN (12,13,14) or Legs_n.stat_type3 IN (12,13,14) or Legs_n.stat_type4 IN (12,13,14) or Legs_n.stat_type5 IN (12,13,14) or Legs_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Legs_n.stat_type1 = 3 or Legs_n.stat_type2 = 3 or Legs_n.stat_type3 = 3 or Legs_n.stat_type4 = 3 or Legs_n.stat_type5 = 3 or Legs_n.stat_type6 = 3) AND (Legs_n.stat_type1 IN (12,13,14) or Legs_n.stat_type2 IN (12,13,14) or Legs_n.stat_type3 IN (12,13,14) or Legs_n.stat_type4 IN (12,13,14) or Legs_n.stat_type5 IN (12,13,14) or Legs_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (Legs_n.stat_type1 = 4 or Legs_n.stat_type2 = 4 or Legs_n.stat_type3 = 4 or Legs_n.stat_type4 = 4 or Legs_n.stat_type5 = 4 or Legs_n.stat_type6 = 4) AND (Legs_n.stat_type1 IN (0,31,32,38,44) or Legs_n.stat_type2 IN (0,31,32,38,44) or Legs_n.stat_type3 IN (0,31,32,38,44) or Legs_n.stat_type4 IN (0,31,32,38,44) or Legs_n.stat_type5 IN (0,31,32,38,44) or Legs_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Legs_n.stat_type1 = 3 or Legs_n.stat_type2 = 3 or Legs_n.stat_type3 = 3 or Legs_n.stat_type4 = 3 or Legs_n.stat_type5 = 3 or Legs_n.stat_type6 = 3) AND (Legs_n.stat_type1 IN (0,31,32,38,44) or Legs_n.stat_type2 IN (0,31,32,38,44) or Legs_n.stat_type3 IN (0,31,32,38,44) or Legs_n.stat_type4 IN (0,31,32,38,44) or Legs_n.stat_type5 IN (0,31,32,38,44) or Legs_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Legs_n.stat_type1 = 5 or Legs_n.stat_type2 = 5 or Legs_n.stat_type3 = 5 or Legs_n.stat_type4 = 5 or Legs_n.stat_type5 = 5 or Legs_n.stat_type6 = 5) AND (Legs_n.stat_type1 IN (31) or Legs_n.stat_type2 IN (31) or Legs_n.stat_type3 IN (31) or Legs_n.stat_type4 IN (31) or Legs_n.stat_type5 IN (31) or Legs_n.stat_type6 IN (31)) then '2 Gear not optimal for Healer'\n\t\t\t\t  \t\twhen (Legs_n.stat_type1 = 5 or Legs_n.stat_type2 = 5 or Legs_n.stat_type3 = 5 or Legs_n.stat_type4 = 5 or Legs_n.stat_type5 = 5 or Legs_n.stat_type6 = 5) AND (Legs_n.stat_type1 IN (32,36,45) or Legs_n.stat_type2 IN (32,36,45) or Legs_n.stat_type3 IN (32,36,45) or Legs_n.stat_type4 IN (32,36,45) or Legs_n.stat_type5 IN (32,36,45) or Legs_n.stat_type6 IN (32,36,45)) then\n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen Legs_n.ItemLevel >=200 AND Legs_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen Legs_n.socketColor_1 = 0 and Legs_n.socketColor_2 = 0 and Legs_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\t\twhen left(Legs.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\twhen Legs.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\twhen left(Legs.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Legs.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Legs_n.ItemLevel >= 251 AND Legs_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Legs_n.ItemLevel >= 264 AND Legs_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Legs_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t\t\t \t  \tEND\n\t\t\t \t#Agility Tank\n\t\t     when (characters_npcbot_class_role.class_role IN ('Druid Feral Tank')) then \n\t\t\t \t\tcase \n\t\t\t \t  \t\twhen (Legs_n.stat_type1 = 4 or Legs_n.stat_type2 = 4 or Legs_n.stat_type3 = 4 or Legs_n.stat_type4 = 4 or Legs_n.stat_type5 = 4 or Legs_n.stat_type6 = 4) AND (Legs_n.stat_type1 IN (12,13,14) or Legs_n.stat_type2 IN (12,13,14) or Legs_n.stat_type3 IN (12,13,14) or Legs_n.stat_type4 IN (12,13,14) or Legs_n.stat_type5 IN (12,13,14) or Legs_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Legs_n.stat_type1 = 3 or Legs_n.stat_type2 = 3 or Legs_n.stat_type3 = 3 or Legs_n.stat_type4 = 3 or Legs_n.stat_type5 = 3 or Legs_n.stat_type6 = 3) AND (Legs_n.stat_type1 IN (12,13,14) or Legs_n.stat_type2 IN (12,13,14) or Legs_n.stat_type3 IN (12,13,14) or Legs_n.stat_type4 IN (12,13,14) or Legs_n.stat_type5 IN (12,13,14) or Legs_n.stat_type6 IN (12,13,14)) then\n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen Legs_n.ItemLevel >=200 AND Legs_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen Legs_n.socketColor_1 = 0 and Legs_n.socketColor_2 = 0 and Legs_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\t\twhen left(Legs.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\twhen Legs.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\twhen left(Legs.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Legs.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Legs_n.ItemLevel >= 251 AND Legs_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Legs_n.ItemLevel >= 264 AND Legs_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Legs_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t  \t\t\t  \t\twhen (Legs_n.stat_type1 = 4 or Legs_n.stat_type2 = 4 or Legs_n.stat_type3 = 4 or Legs_n.stat_type4 = 4 or Legs_n.stat_type5 = 4 or Legs_n.stat_type6 = 4) AND (Legs_n.stat_type1 IN (0,31,32,38,44) or Legs_n.stat_type2 IN (0,31,32,38,44) or Legs_n.stat_type3 IN (0,31,32,38,44) or Legs_n.stat_type4 IN (0,31,32,38,44) or Legs_n.stat_type5 IN (0,31,32,38,44) or Legs_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Legs_n.stat_type1 = 3 or Legs_n.stat_type2 = 3 or Legs_n.stat_type3 = 3 or Legs_n.stat_type4 = 3 or Legs_n.stat_type5 = 3 or Legs_n.stat_type6 = 3) AND (Legs_n.stat_type1 IN (0,31,32,38,44) or Legs_n.stat_type2 IN (0,31,32,38,44) or Legs_n.stat_type3 IN (0,31,32,38,44) or Legs_n.stat_type4 IN (0,31,32,38,44) or Legs_n.stat_type5 IN (0,31,32,38,44) or Legs_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Legs_n.stat_type1 = 5 or Legs_n.stat_type2 = 5 or Legs_n.stat_type3 = 5 or Legs_n.stat_type4 = 5 or Legs_n.stat_type5 = 5 or Legs_n.stat_type6 = 5) AND (Legs_n.stat_type1 IN (31) or Legs_n.stat_type2 IN (31) or Legs_n.stat_type3 IN (31) or Legs_n.stat_type4 IN (31) or Legs_n.stat_type5 IN (31) or Legs_n.stat_type6 IN (31)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Legs_n.stat_type1 = 5 or Legs_n.stat_type2 = 5 or Legs_n.stat_type3 = 5 or Legs_n.stat_type4 = 5 or Legs_n.stat_type5 = 5 or Legs_n.stat_type6 = 5) AND (Legs_n.stat_type1 IN (32,36,45) or Legs_n.stat_type2 IN (32,36,45) or Legs_n.stat_type3 IN (32,36,45) or Legs_n.stat_type4 IN (32,36,45) or Legs_n.stat_type5 IN (32,36,45) or Legs_n.stat_type6 IN (32,36,45)) then '1 Gear with wrong stat'\n\t\t\t \t  \tEND\n\t\t\t #Agility DPS\n\t\t     when (characters_npcbot_class_role.class_role IN ('Hunter', 'Rogue', 'Druid Feral DPS', 'Shaman Enhancement')) then \n\t\t\t\t\tcase \n\t\t\t \t  \t\twhen (Legs_n.stat_type1 = 4 or Legs_n.stat_type2 = 4 or Legs_n.stat_type3 = 4 or Legs_n.stat_type4 = 4 or Legs_n.stat_type5 = 4 or Legs_n.stat_type6 = 4) AND (Legs_n.stat_type1 IN (12,13,14) or Legs_n.stat_type2 IN (12,13,14) or Legs_n.stat_type3 IN (12,13,14) or Legs_n.stat_type4 IN (12,13,14) or Legs_n.stat_type5 IN (12,13,14) or Legs_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Legs_n.stat_type1 = 3 or Legs_n.stat_type2 = 3 or Legs_n.stat_type3 = 3 or Legs_n.stat_type4 = 3 or Legs_n.stat_type5 = 3 or Legs_n.stat_type6 = 3) AND (Legs_n.stat_type1 IN (12,13,14) or Legs_n.stat_type2 IN (12,13,14) or Legs_n.stat_type3 IN (12,13,14) or Legs_n.stat_type4 IN (12,13,14) or Legs_n.stat_type5 IN (12,13,14) or Legs_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (Legs_n.stat_type1 = 4 or Legs_n.stat_type2 = 4 or Legs_n.stat_type3 = 4 or Legs_n.stat_type4 = 4 or Legs_n.stat_type5 = 4 or Legs_n.stat_type6 = 4) AND (Legs_n.stat_type1 IN (0,31,32,38,44) or Legs_n.stat_type2 IN (0,31,32,38,44) or Legs_n.stat_type3 IN (0,31,32,38,44) or Legs_n.stat_type4 IN (0,31,32,38,44) or Legs_n.stat_type5 IN (0,31,32,38,44) or Legs_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Legs_n.stat_type1 = 3 or Legs_n.stat_type2 = 3 or Legs_n.stat_type3 = 3 or Legs_n.stat_type4 = 3 or Legs_n.stat_type5 = 3 or Legs_n.stat_type6 = 3) AND (Legs_n.stat_type1 IN (0,31,32,38,44) or Legs_n.stat_type2 IN (0,31,32,38,44) or Legs_n.stat_type3 IN (0,31,32,38,44) or Legs_n.stat_type4 IN (0,31,32,38,44) or Legs_n.stat_type5 IN (0,31,32,38,44) or Legs_n.stat_type6 IN (0,31,32,38,44)) then \n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen Legs_n.ItemLevel >=200 AND Legs_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen Legs_n.socketColor_1 = 0 and Legs_n.socketColor_2 = 0 and Legs_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\t\twhen left(Legs.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\twhen Legs.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\twhen left(Legs.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Legs.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Legs_n.ItemLevel >= 251 AND Legs_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Legs_n.ItemLevel >= 264 AND Legs_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Legs_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND \n\t\t\t\t  \t\twhen (Legs_n.stat_type1 = 5 or Legs_n.stat_type2 = 5 or Legs_n.stat_type3 = 5 or Legs_n.stat_type4 = 5 or Legs_n.stat_type5 = 5 or Legs_n.stat_type6 = 5) AND (Legs_n.stat_type1 IN (31) or Legs_n.stat_type2 IN (31) or Legs_n.stat_type3 IN (31) or Legs_n.stat_type4 IN (31) or Legs_n.stat_type5 IN (31) or Legs_n.stat_type6 IN (31)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Legs_n.stat_type1 = 5 or Legs_n.stat_type2 = 5 or Legs_n.stat_type3 = 5 or Legs_n.stat_type4 = 5 or Legs_n.stat_type5 = 5 or Legs_n.stat_type6 = 5) AND (Legs_n.stat_type1 IN (32,36,45) or Legs_n.stat_type2 IN (32,36,45) or Legs_n.stat_type3 IN (32,36,45) or Legs_n.stat_type4 IN (32,36,45) or Legs_n.stat_type5 IN (32,36,45) or Legs_n.stat_type6 IN (32,36,45)) then '1 Gear with wrong stat'\n\t\t\t \t  \tEND\n\t\t end  AS '08 Legs Analyze',\n \n\t\t case\n\t\t\t #Strength DPS\n\t\t     when (characters_npcbot_class_role.class_role IN ('Warrior DPS', 'Paladin DPS', 'DK DPS')) then \n\t\t     \t\tcase \n\t\t\t \t  \t\twhen (Feet_n.stat_type1 = 4 or Feet_n.stat_type2 = 4 or Feet_n.stat_type3 = 4 or Feet_n.stat_type4 = 4 or Feet_n.stat_type5 = 4 or Feet_n.stat_type6 = 4) AND (Feet_n.stat_type1 IN (12,13,14) or Feet_n.stat_type2 IN (12,13,14) or Feet_n.stat_type3 IN (12,13,14) or Feet_n.stat_type4 IN (12,13,14) or Feet_n.stat_type5 IN (12,13,14) or Feet_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Feet_n.stat_type1 = 3 or Feet_n.stat_type2 = 3 or Feet_n.stat_type3 = 3 or Feet_n.stat_type4 = 3 or Feet_n.stat_type5 = 3 or Feet_n.stat_type6 = 3) AND (Feet_n.stat_type1 IN (12,13,14) or Feet_n.stat_type2 IN (12,13,14) or Feet_n.stat_type3 IN (12,13,14) or Feet_n.stat_type4 IN (12,13,14) or Feet_n.stat_type5 IN (12,13,14) or Feet_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (Feet_n.stat_type1 = 4 or Feet_n.stat_type2 = 4 or Feet_n.stat_type3 = 4 or Feet_n.stat_type4 = 4 or Feet_n.stat_type5 = 4 or Feet_n.stat_type6 = 4) AND (Feet_n.stat_type1 IN (0,31,32,38,44) or Feet_n.stat_type2 IN (0,31,32,38,44) or Feet_n.stat_type3 IN (0,31,32,38,44) or Feet_n.stat_type4 IN (0,31,32,38,44) or Feet_n.stat_type5 IN (0,31,32,38,44) or Feet_n.stat_type6 IN (0,31,32,38,44)) then \n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen Feet_n.ItemLevel >=200 AND Feet_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen Feet_n.socketColor_1 = 0 and Feet_n.socketColor_2 = 0 and Feet_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\t\twhen left(Feet.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\twhen Feet.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\twhen left(Feet.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Feet.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Feet_n.ItemLevel >= 251 AND Feet_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Feet_n.ItemLevel >= 264 AND Feet_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Feet_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND \n\t\t\t \t  \t\twhen (Feet_n.stat_type1 = 3 or Feet_n.stat_type2 = 3 or Feet_n.stat_type3 = 3 or Feet_n.stat_type4 = 3 or Feet_n.stat_type5 = 3 or Feet_n.stat_type6 = 3) AND (Feet_n.stat_type1 IN (0,31,32,38,44) or Feet_n.stat_type2 IN (0,31,32,38,44) or Feet_n.stat_type3 IN (0,31,32,38,44) or Feet_n.stat_type4 IN (0,31,32,38,44) or Feet_n.stat_type5 IN (0,31,32,38,44) or Feet_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Feet_n.stat_type1 = 5 or Feet_n.stat_type2 = 5 or Feet_n.stat_type3 = 5 or Feet_n.stat_type4 = 5 or Feet_n.stat_type5 = 5 or Feet_n.stat_type6 = 5) AND (Feet_n.stat_type1 IN (31) or Feet_n.stat_type2 IN (31) or Feet_n.stat_type3 IN (31) or Feet_n.stat_type4 IN (31) or Feet_n.stat_type5 IN (31) or Feet_n.stat_type6 IN (31)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Feet_n.stat_type1 = 5 or Feet_n.stat_type2 = 5 or Feet_n.stat_type3 = 5 or Feet_n.stat_type4 = 5 or Feet_n.stat_type5 = 5 or Feet_n.stat_type6 = 5) AND (Feet_n.stat_type1 IN (32,36,45) or Feet_n.stat_type2 IN (32,36,45) or Feet_n.stat_type3 IN (32,36,45) or Feet_n.stat_type4 IN (32,36,45) or Feet_n.stat_type5 IN (32,36,45) or Feet_n.stat_type6 IN (32,36,45)) then '1 Gear with wrong stat'\n\t\t\t \t  \tEND\n\t\t\t #Strength Tank\n\t\t     when (characters_npcbot_class_role.class_role IN ('Warrior Tank', 'Paladin Tank', 'DK Tank')) then\n\t\t     \t\tcase \n\t\t\t \t  \t\twhen (Feet_n.stat_type1 = 4 or Feet_n.stat_type2 = 4 or Feet_n.stat_type3 = 4 or Feet_n.stat_type4 = 4 or Feet_n.stat_type5 = 4 or Feet_n.stat_type6 = 4) AND (Feet_n.stat_type1 IN (12,13,14) or Feet_n.stat_type2 IN (12,13,14) or Feet_n.stat_type3 IN (12,13,14) or Feet_n.stat_type4 IN (12,13,14) or Feet_n.stat_type5 IN (12,13,14) or Feet_n.stat_type6 IN (12,13,14)) then \n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen Feet_n.ItemLevel >=200 AND Feet_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen Feet_n.socketColor_1 = 0 and Feet_n.socketColor_2 = 0 and Feet_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\t\twhen left(Feet.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\twhen Feet.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\twhen left(Feet.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Feet.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Feet_n.ItemLevel >= 251 AND Feet_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Feet_n.ItemLevel >= 264 AND Feet_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Feet_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t\t\t \t  \t\twhen (Feet_n.stat_type1 = 3 or Feet_n.stat_type2 = 3 or Feet_n.stat_type3 = 3 or Feet_n.stat_type4 = 3 or Feet_n.stat_type5 = 3 or Feet_n.stat_type6 = 3) AND (Feet_n.stat_type1 IN (12,13,14) or Feet_n.stat_type2 IN (12,13,14) or Feet_n.stat_type3 IN (12,13,14) or Feet_n.stat_type4 IN (12,13,14) or Feet_n.stat_type5 IN (12,13,14) or Feet_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (Feet_n.stat_type1 = 4 or Feet_n.stat_type2 = 4 or Feet_n.stat_type3 = 4 or Feet_n.stat_type4 = 4 or Feet_n.stat_type5 = 4 or Feet_n.stat_type6 = 4) AND (Feet_n.stat_type1 IN (0,31,32,38,44) or Feet_n.stat_type2 IN (0,31,32,38,44) or Feet_n.stat_type3 IN (0,31,32,38,44) or Feet_n.stat_type4 IN (0,31,32,38,44) or Feet_n.stat_type5 IN (0,31,32,38,44) or Feet_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Feet_n.stat_type1 = 3 or Feet_n.stat_type2 = 3 or Feet_n.stat_type3 = 3 or Feet_n.stat_type4 = 3 or Feet_n.stat_type5 = 3 or Feet_n.stat_type6 = 3) AND (Feet_n.stat_type1 IN (0,31,32,38,44) or Feet_n.stat_type2 IN (0,31,32,38,44) or Feet_n.stat_type3 IN (0,31,32,38,44) or Feet_n.stat_type4 IN (0,31,32,38,44) or Feet_n.stat_type5 IN (0,31,32,38,44) or Feet_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Feet_n.stat_type1 = 5 or Feet_n.stat_type2 = 5 or Feet_n.stat_type3 = 5 or Feet_n.stat_type4 = 5 or Feet_n.stat_type5 = 5 or Feet_n.stat_type6 = 5) AND (Feet_n.stat_type1 IN (31) or Feet_n.stat_type2 IN (31) or Feet_n.stat_type3 IN (31) or Feet_n.stat_type4 IN (31) or Feet_n.stat_type5 IN (31) or Feet_n.stat_type6 IN (31)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Feet_n.stat_type1 = 5 or Feet_n.stat_type2 = 5 or Feet_n.stat_type3 = 5 or Feet_n.stat_type4 = 5 or Feet_n.stat_type5 = 5 or Feet_n.stat_type6 = 5) AND (Feet_n.stat_type1 IN (32,36,45) or Feet_n.stat_type2 IN (32,36,45) or Feet_n.stat_type3 IN (32,36,45) or Feet_n.stat_type4 IN (32,36,45) or Feet_n.stat_type5 IN (32,36,45) or Feet_n.stat_type6 IN (32,36,45)) then '1 Gear with wrong stat'\n\t\t\t \t  \tEND\n\t\t\t \t#Magic DPS\n\t\t      when (characters_npcbot_class_role.class_role IN ('Mage', 'Warlock', 'Shaman Elemental', 'Druid Balance', 'Priest DPS')) then\n\t\t\t \t\tcase \n\t\t\t \t  \t\twhen (Feet_n.stat_type1 = 4 or Feet_n.stat_type2 = 4 or Feet_n.stat_type3 = 4 or Feet_n.stat_type4 = 4 or Feet_n.stat_type5 = 4 or Feet_n.stat_type6 = 4) AND (Feet_n.stat_type1 IN (12,13,14) or Feet_n.stat_type2 IN (12,13,14) or Feet_n.stat_type3 IN (12,13,14) or Feet_n.stat_type4 IN (12,13,14) or Feet_n.stat_type5 IN (12,13,14) or Feet_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Feet_n.stat_type1 = 3 or Feet_n.stat_type2 = 3 or Feet_n.stat_type3 = 3 or Feet_n.stat_type4 = 3 or Feet_n.stat_type5 = 3 or Feet_n.stat_type6 = 3) AND (Feet_n.stat_type1 IN (12,13,14) or Feet_n.stat_type2 IN (12,13,14) or Feet_n.stat_type3 IN (12,13,14) or Feet_n.stat_type4 IN (12,13,14) or Feet_n.stat_type5 IN (12,13,14) or Feet_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (Feet_n.stat_type1 = 4 or Feet_n.stat_type2 = 4 or Feet_n.stat_type3 = 4 or Feet_n.stat_type4 = 4 or Feet_n.stat_type5 = 4 or Feet_n.stat_type6 = 4) AND (Feet_n.stat_type1 IN (0,31,32,38,44) or Feet_n.stat_type2 IN (0,31,32,38,44) or Feet_n.stat_type3 IN (0,31,32,38,44) or Feet_n.stat_type4 IN (0,31,32,38,44) or Feet_n.stat_type5 IN (0,31,32,38,44) or Feet_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Feet_n.stat_type1 = 3 or Feet_n.stat_type2 = 3 or Feet_n.stat_type3 = 3 or Feet_n.stat_type4 = 3 or Feet_n.stat_type5 = 3 or Feet_n.stat_type6 = 3) AND (Feet_n.stat_type1 IN (0,31,32,38,44) or Feet_n.stat_type2 IN (0,31,32,38,44) or Feet_n.stat_type3 IN (0,31,32,38,44) or Feet_n.stat_type4 IN (0,31,32,38,44) or Feet_n.stat_type5 IN (0,31,32,38,44) or Feet_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Feet_n.stat_type1 = 5 or Feet_n.stat_type2 = 5 or Feet_n.stat_type3 = 5 or Feet_n.stat_type4 = 5 or Feet_n.stat_type5 = 5 or Feet_n.stat_type6 = 5) AND (Feet_n.stat_type1 IN (31) or Feet_n.stat_type2 IN (31) or Feet_n.stat_type3 IN (31) or Feet_n.stat_type4 IN (31) or Feet_n.stat_type5 IN (31) or Feet_n.stat_type6 IN (31)) then\n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen Feet_n.ItemLevel >=200 AND Feet_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen Feet_n.socketColor_1 = 0 and Feet_n.socketColor_2 = 0 and Feet_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\t\twhen left(Feet.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\twhen Feet.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\twhen left(Feet.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Feet.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Feet_n.ItemLevel >= 251 AND Feet_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Feet_n.ItemLevel >= 264 AND Feet_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Feet_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t\t\t\t  \t\twhen (Feet_n.stat_type1 = 5 or Feet_n.stat_type2 = 5 or Feet_n.stat_type3 = 5 or Feet_n.stat_type4 = 5 or Feet_n.stat_type5 = 5 or Feet_n.stat_type6 = 5) AND (Feet_n.stat_type1 IN (32,36,45) or Feet_n.stat_type2 IN (32,36,45) or Feet_n.stat_type3 IN (32,36,45) or Feet_n.stat_type4 IN (32,36,45) or Feet_n.stat_type5 IN (32,36,45) or Feet_n.stat_type6 IN (32,36,45)) then \n\t\t\t\t\t\t  \t\tcase\n\t\t\t\t\t\t\t\t\twhen Feet_n.ItemLevel >=200 AND Feet_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen Feet_n.socketColor_1 = 0 and Feet_n.socketColor_2 = 0 and Feet_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\t\twhen left(Feet.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\twhen Feet.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\twhen left(Feet.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Feet.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Feet_n.ItemLevel >= 251 AND Feet_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Feet_n.ItemLevel >= 264 AND Feet_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Feet_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t\t\t \t  \tEND\n\t\t\t  #Healer / DPS\n\t\t     when (characters_npcbot_class_role.class_role IN ('Paladin Healer', 'Priest Healer', 'Warlock', 'Mage', 'Shaman Healer', 'Druid Healer'))\n\t\t\t        then \n\t\t\t \t\tcase \n\t\t\t \t  \t\twhen (Feet_n.stat_type1 = 4 or Feet_n.stat_type2 = 4 or Feet_n.stat_type3 = 4 or Feet_n.stat_type4 = 4 or Feet_n.stat_type5 = 4 or Feet_n.stat_type6 = 4) AND (Feet_n.stat_type1 IN (12,13,14) or Feet_n.stat_type2 IN (12,13,14) or Feet_n.stat_type3 IN (12,13,14) or Feet_n.stat_type4 IN (12,13,14) or Feet_n.stat_type5 IN (12,13,14) or Feet_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Feet_n.stat_type1 = 3 or Feet_n.stat_type2 = 3 or Feet_n.stat_type3 = 3 or Feet_n.stat_type4 = 3 or Feet_n.stat_type5 = 3 or Feet_n.stat_type6 = 3) AND (Feet_n.stat_type1 IN (12,13,14) or Feet_n.stat_type2 IN (12,13,14) or Feet_n.stat_type3 IN (12,13,14) or Feet_n.stat_type4 IN (12,13,14) or Feet_n.stat_type5 IN (12,13,14) or Feet_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (Feet_n.stat_type1 = 4 or Feet_n.stat_type2 = 4 or Feet_n.stat_type3 = 4 or Feet_n.stat_type4 = 4 or Feet_n.stat_type5 = 4 or Feet_n.stat_type6 = 4) AND (Feet_n.stat_type1 IN (0,31,32,38,44) or Feet_n.stat_type2 IN (0,31,32,38,44) or Feet_n.stat_type3 IN (0,31,32,38,44) or Feet_n.stat_type4 IN (0,31,32,38,44) or Feet_n.stat_type5 IN (0,31,32,38,44) or Feet_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Feet_n.stat_type1 = 3 or Feet_n.stat_type2 = 3 or Feet_n.stat_type3 = 3 or Feet_n.stat_type4 = 3 or Feet_n.stat_type5 = 3 or Feet_n.stat_type6 = 3) AND (Feet_n.stat_type1 IN (0,31,32,38,44) or Feet_n.stat_type2 IN (0,31,32,38,44) or Feet_n.stat_type3 IN (0,31,32,38,44) or Feet_n.stat_type4 IN (0,31,32,38,44) or Feet_n.stat_type5 IN (0,31,32,38,44) or Feet_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Feet_n.stat_type1 = 5 or Feet_n.stat_type2 = 5 or Feet_n.stat_type3 = 5 or Feet_n.stat_type4 = 5 or Feet_n.stat_type5 = 5 or Feet_n.stat_type6 = 5) AND (Feet_n.stat_type1 IN (31) or Feet_n.stat_type2 IN (31) or Feet_n.stat_type3 IN (31) or Feet_n.stat_type4 IN (31) or Feet_n.stat_type5 IN (31) or Feet_n.stat_type6 IN (31)) then '2 Gear not optimal for Healer'\n\t\t\t\t  \t\twhen (Feet_n.stat_type1 = 5 or Feet_n.stat_type2 = 5 or Feet_n.stat_type3 = 5 or Feet_n.stat_type4 = 5 or Feet_n.stat_type5 = 5 or Feet_n.stat_type6 = 5) AND (Feet_n.stat_type1 IN (32,36,45) or Feet_n.stat_type2 IN (32,36,45) or Feet_n.stat_type3 IN (32,36,45) or Feet_n.stat_type4 IN (32,36,45) or Feet_n.stat_type5 IN (32,36,45) or Feet_n.stat_type6 IN (32,36,45)) then\n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen Feet_n.ItemLevel >=200 AND Feet_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen Feet_n.socketColor_1 = 0 and Feet_n.socketColor_2 = 0 and Feet_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\t\twhen left(Feet.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\twhen Feet.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\twhen left(Feet.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Feet.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Feet_n.ItemLevel >= 251 AND Feet_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Feet_n.ItemLevel >= 264 AND Feet_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Feet_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t\t\t \t  \tEND\n\t\t\t \t#Agility Tank\n\t\t     when (characters_npcbot_class_role.class_role IN ('Druid Feral Tank')) then \n\t\t\t \t\tcase \n\t\t\t \t  \t\twhen (Feet_n.stat_type1 = 4 or Feet_n.stat_type2 = 4 or Feet_n.stat_type3 = 4 or Feet_n.stat_type4 = 4 or Feet_n.stat_type5 = 4 or Feet_n.stat_type6 = 4) AND (Feet_n.stat_type1 IN (12,13,14) or Feet_n.stat_type2 IN (12,13,14) or Feet_n.stat_type3 IN (12,13,14) or Feet_n.stat_type4 IN (12,13,14) or Feet_n.stat_type5 IN (12,13,14) or Feet_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Feet_n.stat_type1 = 3 or Feet_n.stat_type2 = 3 or Feet_n.stat_type3 = 3 or Feet_n.stat_type4 = 3 or Feet_n.stat_type5 = 3 or Feet_n.stat_type6 = 3) AND (Feet_n.stat_type1 IN (12,13,14) or Feet_n.stat_type2 IN (12,13,14) or Feet_n.stat_type3 IN (12,13,14) or Feet_n.stat_type4 IN (12,13,14) or Feet_n.stat_type5 IN (12,13,14) or Feet_n.stat_type6 IN (12,13,14)) then\n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen Feet_n.ItemLevel >=200 AND Feet_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen Feet_n.socketColor_1 = 0 and Feet_n.socketColor_2 = 0 and Feet_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\t\twhen left(Feet.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\twhen Feet.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\twhen left(Feet.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Feet.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Feet_n.ItemLevel >= 251 AND Feet_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Feet_n.ItemLevel >= 264 AND Feet_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Feet_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t  \t\t\t  \t\twhen (Feet_n.stat_type1 = 4 or Feet_n.stat_type2 = 4 or Feet_n.stat_type3 = 4 or Feet_n.stat_type4 = 4 or Feet_n.stat_type5 = 4 or Feet_n.stat_type6 = 4) AND (Feet_n.stat_type1 IN (0,31,32,38,44) or Feet_n.stat_type2 IN (0,31,32,38,44) or Feet_n.stat_type3 IN (0,31,32,38,44) or Feet_n.stat_type4 IN (0,31,32,38,44) or Feet_n.stat_type5 IN (0,31,32,38,44) or Feet_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Feet_n.stat_type1 = 3 or Feet_n.stat_type2 = 3 or Feet_n.stat_type3 = 3 or Feet_n.stat_type4 = 3 or Feet_n.stat_type5 = 3 or Feet_n.stat_type6 = 3) AND (Feet_n.stat_type1 IN (0,31,32,38,44) or Feet_n.stat_type2 IN (0,31,32,38,44) or Feet_n.stat_type3 IN (0,31,32,38,44) or Feet_n.stat_type4 IN (0,31,32,38,44) or Feet_n.stat_type5 IN (0,31,32,38,44) or Feet_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Feet_n.stat_type1 = 5 or Feet_n.stat_type2 = 5 or Feet_n.stat_type3 = 5 or Feet_n.stat_type4 = 5 or Feet_n.stat_type5 = 5 or Feet_n.stat_type6 = 5) AND (Feet_n.stat_type1 IN (31) or Feet_n.stat_type2 IN (31) or Feet_n.stat_type3 IN (31) or Feet_n.stat_type4 IN (31) or Feet_n.stat_type5 IN (31) or Feet_n.stat_type6 IN (31)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Feet_n.stat_type1 = 5 or Feet_n.stat_type2 = 5 or Feet_n.stat_type3 = 5 or Feet_n.stat_type4 = 5 or Feet_n.stat_type5 = 5 or Feet_n.stat_type6 = 5) AND (Feet_n.stat_type1 IN (32,36,45) or Feet_n.stat_type2 IN (32,36,45) or Feet_n.stat_type3 IN (32,36,45) or Feet_n.stat_type4 IN (32,36,45) or Feet_n.stat_type5 IN (32,36,45) or Feet_n.stat_type6 IN (32,36,45)) then '1 Gear with wrong stat'\n\t\t\t \t  \tEND\n\t\t\t #Agility DPS\n\t\t     when (characters_npcbot_class_role.class_role IN ('Hunter', 'Rogue', 'Druid Feral DPS', 'Shaman Enhancement')) then \n\t\t\t\t\tcase \n\t\t\t \t  \t\twhen (Feet_n.stat_type1 = 4 or Feet_n.stat_type2 = 4 or Feet_n.stat_type3 = 4 or Feet_n.stat_type4 = 4 or Feet_n.stat_type5 = 4 or Feet_n.stat_type6 = 4) AND (Feet_n.stat_type1 IN (12,13,14) or Feet_n.stat_type2 IN (12,13,14) or Feet_n.stat_type3 IN (12,13,14) or Feet_n.stat_type4 IN (12,13,14) or Feet_n.stat_type5 IN (12,13,14) or Feet_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Feet_n.stat_type1 = 3 or Feet_n.stat_type2 = 3 or Feet_n.stat_type3 = 3 or Feet_n.stat_type4 = 3 or Feet_n.stat_type5 = 3 or Feet_n.stat_type6 = 3) AND (Feet_n.stat_type1 IN (12,13,14) or Feet_n.stat_type2 IN (12,13,14) or Feet_n.stat_type3 IN (12,13,14) or Feet_n.stat_type4 IN (12,13,14) or Feet_n.stat_type5 IN (12,13,14) or Feet_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (Feet_n.stat_type1 = 4 or Feet_n.stat_type2 = 4 or Feet_n.stat_type3 = 4 or Feet_n.stat_type4 = 4 or Feet_n.stat_type5 = 4 or Feet_n.stat_type6 = 4) AND (Feet_n.stat_type1 IN (0,31,32,38,44) or Feet_n.stat_type2 IN (0,31,32,38,44) or Feet_n.stat_type3 IN (0,31,32,38,44) or Feet_n.stat_type4 IN (0,31,32,38,44) or Feet_n.stat_type5 IN (0,31,32,38,44) or Feet_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Feet_n.stat_type1 = 3 or Feet_n.stat_type2 = 3 or Feet_n.stat_type3 = 3 or Feet_n.stat_type4 = 3 or Feet_n.stat_type5 = 3 or Feet_n.stat_type6 = 3) AND (Feet_n.stat_type1 IN (0,31,32,38,44) or Feet_n.stat_type2 IN (0,31,32,38,44) or Feet_n.stat_type3 IN (0,31,32,38,44) or Feet_n.stat_type4 IN (0,31,32,38,44) or Feet_n.stat_type5 IN (0,31,32,38,44) or Feet_n.stat_type6 IN (0,31,32,38,44)) then \n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen Feet_n.ItemLevel >=200 AND Feet_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen Feet_n.socketColor_1 = 0 and Feet_n.socketColor_2 = 0 and Feet_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\t\twhen left(Feet.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\twhen Feet.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\twhen left(Feet.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Feet.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Feet_n.ItemLevel >= 251 AND Feet_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Feet_n.ItemLevel >= 264 AND Feet_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Feet_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND \n\t\t\t\t  \t\twhen (Feet_n.stat_type1 = 5 or Feet_n.stat_type2 = 5 or Feet_n.stat_type3 = 5 or Feet_n.stat_type4 = 5 or Feet_n.stat_type5 = 5 or Feet_n.stat_type6 = 5) AND (Feet_n.stat_type1 IN (31) or Feet_n.stat_type2 IN (31) or Feet_n.stat_type3 IN (31) or Feet_n.stat_type4 IN (31) or Feet_n.stat_type5 IN (31) or Feet_n.stat_type6 IN (31)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Feet_n.stat_type1 = 5 or Feet_n.stat_type2 = 5 or Feet_n.stat_type3 = 5 or Feet_n.stat_type4 = 5 or Feet_n.stat_type5 = 5 or Feet_n.stat_type6 = 5) AND (Feet_n.stat_type1 IN (32,36,45) or Feet_n.stat_type2 IN (32,36,45) or Feet_n.stat_type3 IN (32,36,45) or Feet_n.stat_type4 IN (32,36,45) or Feet_n.stat_type5 IN (32,36,45) or Feet_n.stat_type6 IN (32,36,45)) then '1 Gear with wrong stat'\n\t\t\t \t  \tEND\n\t\t end  AS '09 Feet Analyze',\n\n\t\t case\n\t\t\t #Strength DPS\n\t\t     when (characters_npcbot_class_role.class_role IN ('Warrior DPS', 'Paladin DPS', 'DK DPS')) then \n\t\t     \t\tcase \n\t\t\t \t  \t\twhen (Wrist_n.stat_type1 = 4 or Wrist_n.stat_type2 = 4 or Wrist_n.stat_type3 = 4 or Wrist_n.stat_type4 = 4 or Wrist_n.stat_type5 = 4 or Wrist_n.stat_type6 = 4) AND (Wrist_n.stat_type1 IN (12,13,14) or Wrist_n.stat_type2 IN (12,13,14) or Wrist_n.stat_type3 IN (12,13,14) or Wrist_n.stat_type4 IN (12,13,14) or Wrist_n.stat_type5 IN (12,13,14) or Wrist_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Wrist_n.stat_type1 = 3 or Wrist_n.stat_type2 = 3 or Wrist_n.stat_type3 = 3 or Wrist_n.stat_type4 = 3 or Wrist_n.stat_type5 = 3 or Wrist_n.stat_type6 = 3) AND (Wrist_n.stat_type1 IN (12,13,14) or Wrist_n.stat_type2 IN (12,13,14) or Wrist_n.stat_type3 IN (12,13,14) or Wrist_n.stat_type4 IN (12,13,14) or Wrist_n.stat_type5 IN (12,13,14) or Wrist_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (Wrist_n.stat_type1 = 4 or Wrist_n.stat_type2 = 4 or Wrist_n.stat_type3 = 4 or Wrist_n.stat_type4 = 4 or Wrist_n.stat_type5 = 4 or Wrist_n.stat_type6 = 4) AND (Wrist_n.stat_type1 IN (0,31,32,38,44) or Wrist_n.stat_type2 IN (0,31,32,38,44) or Wrist_n.stat_type3 IN (0,31,32,38,44) or Wrist_n.stat_type4 IN (0,31,32,38,44) or Wrist_n.stat_type5 IN (0,31,32,38,44) or Wrist_n.stat_type6 IN (0,31,32,38,44)) then \n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen Wrist_n.ItemLevel >=200 AND Wrist_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen Wrist_n.socketColor_1 = 0 and Wrist_n.socketColor_2 = 0 and Wrist_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\t\twhen left(Wrist.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\twhen Wrist.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\twhen left(Wrist.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Wrist.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Wrist_n.ItemLevel >= 251 AND Wrist_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Wrist_n.ItemLevel >= 264 AND Wrist_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Wrist_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND \n\t\t\t \t  \t\twhen (Wrist_n.stat_type1 = 3 or Wrist_n.stat_type2 = 3 or Wrist_n.stat_type3 = 3 or Wrist_n.stat_type4 = 3 or Wrist_n.stat_type5 = 3 or Wrist_n.stat_type6 = 3) AND (Wrist_n.stat_type1 IN (0,31,32,38,44) or Wrist_n.stat_type2 IN (0,31,32,38,44) or Wrist_n.stat_type3 IN (0,31,32,38,44) or Wrist_n.stat_type4 IN (0,31,32,38,44) or Wrist_n.stat_type5 IN (0,31,32,38,44) or Wrist_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Wrist_n.stat_type1 = 5 or Wrist_n.stat_type2 = 5 or Wrist_n.stat_type3 = 5 or Wrist_n.stat_type4 = 5 or Wrist_n.stat_type5 = 5 or Wrist_n.stat_type6 = 5) AND (Wrist_n.stat_type1 IN (31) or Wrist_n.stat_type2 IN (31) or Wrist_n.stat_type3 IN (31) or Wrist_n.stat_type4 IN (31) or Wrist_n.stat_type5 IN (31) or Wrist_n.stat_type6 IN (31)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Wrist_n.stat_type1 = 5 or Wrist_n.stat_type2 = 5 or Wrist_n.stat_type3 = 5 or Wrist_n.stat_type4 = 5 or Wrist_n.stat_type5 = 5 or Wrist_n.stat_type6 = 5) AND (Wrist_n.stat_type1 IN (32,36,45) or Wrist_n.stat_type2 IN (32,36,45) or Wrist_n.stat_type3 IN (32,36,45) or Wrist_n.stat_type4 IN (32,36,45) or Wrist_n.stat_type5 IN (32,36,45) or Wrist_n.stat_type6 IN (32,36,45)) then '1 Gear with wrong stat'\n\t\t\t \t  \tEND\n\t\t\t #Strength Tank\n\t\t     when (characters_npcbot_class_role.class_role IN ('Warrior Tank', 'Paladin Tank', 'DK Tank')) then\n\t\t     \t\tcase \n\t\t\t \t  \t\twhen (Wrist_n.stat_type1 = 4 or Wrist_n.stat_type2 = 4 or Wrist_n.stat_type3 = 4 or Wrist_n.stat_type4 = 4 or Wrist_n.stat_type5 = 4 or Wrist_n.stat_type6 = 4) AND (Wrist_n.stat_type1 IN (12,13,14) or Wrist_n.stat_type2 IN (12,13,14) or Wrist_n.stat_type3 IN (12,13,14) or Wrist_n.stat_type4 IN (12,13,14) or Wrist_n.stat_type5 IN (12,13,14) or Wrist_n.stat_type6 IN (12,13,14)) then \n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen Wrist_n.ItemLevel >=200 AND Wrist_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen Wrist_n.socketColor_1 = 0 and Wrist_n.socketColor_2 = 0 and Wrist_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\t\twhen left(Wrist.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\twhen Wrist.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\twhen left(Wrist.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Wrist.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Wrist_n.ItemLevel >= 251 AND Wrist_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Wrist_n.ItemLevel >= 264 AND Wrist_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Wrist_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t\t\t \t  \t\twhen (Wrist_n.stat_type1 = 3 or Wrist_n.stat_type2 = 3 or Wrist_n.stat_type3 = 3 or Wrist_n.stat_type4 = 3 or Wrist_n.stat_type5 = 3 or Wrist_n.stat_type6 = 3) AND (Wrist_n.stat_type1 IN (12,13,14) or Wrist_n.stat_type2 IN (12,13,14) or Wrist_n.stat_type3 IN (12,13,14) or Wrist_n.stat_type4 IN (12,13,14) or Wrist_n.stat_type5 IN (12,13,14) or Wrist_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (Wrist_n.stat_type1 = 4 or Wrist_n.stat_type2 = 4 or Wrist_n.stat_type3 = 4 or Wrist_n.stat_type4 = 4 or Wrist_n.stat_type5 = 4 or Wrist_n.stat_type6 = 4) AND (Wrist_n.stat_type1 IN (0,31,32,38,44) or Wrist_n.stat_type2 IN (0,31,32,38,44) or Wrist_n.stat_type3 IN (0,31,32,38,44) or Wrist_n.stat_type4 IN (0,31,32,38,44) or Wrist_n.stat_type5 IN (0,31,32,38,44) or Wrist_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Wrist_n.stat_type1 = 3 or Wrist_n.stat_type2 = 3 or Wrist_n.stat_type3 = 3 or Wrist_n.stat_type4 = 3 or Wrist_n.stat_type5 = 3 or Wrist_n.stat_type6 = 3) AND (Wrist_n.stat_type1 IN (0,31,32,38,44) or Wrist_n.stat_type2 IN (0,31,32,38,44) or Wrist_n.stat_type3 IN (0,31,32,38,44) or Wrist_n.stat_type4 IN (0,31,32,38,44) or Wrist_n.stat_type5 IN (0,31,32,38,44) or Wrist_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Wrist_n.stat_type1 = 5 or Wrist_n.stat_type2 = 5 or Wrist_n.stat_type3 = 5 or Wrist_n.stat_type4 = 5 or Wrist_n.stat_type5 = 5 or Wrist_n.stat_type6 = 5) AND (Wrist_n.stat_type1 IN (31) or Wrist_n.stat_type2 IN (31) or Wrist_n.stat_type3 IN (31) or Wrist_n.stat_type4 IN (31) or Wrist_n.stat_type5 IN (31) or Wrist_n.stat_type6 IN (31)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Wrist_n.stat_type1 = 5 or Wrist_n.stat_type2 = 5 or Wrist_n.stat_type3 = 5 or Wrist_n.stat_type4 = 5 or Wrist_n.stat_type5 = 5 or Wrist_n.stat_type6 = 5) AND (Wrist_n.stat_type1 IN (32,36,45) or Wrist_n.stat_type2 IN (32,36,45) or Wrist_n.stat_type3 IN (32,36,45) or Wrist_n.stat_type4 IN (32,36,45) or Wrist_n.stat_type5 IN (32,36,45) or Wrist_n.stat_type6 IN (32,36,45)) then '1 Gear with wrong stat'\n\t\t\t \t  \tEND\n\t\t\t \t#Magic DPS\n\t\t      when (characters_npcbot_class_role.class_role IN ('Mage', 'Warlock', 'Shaman Elemental', 'Druid Balance', 'Priest DPS')) then\n\t\t\t \t\tcase \n\t\t\t \t  \t\twhen (Wrist_n.stat_type1 = 4 or Wrist_n.stat_type2 = 4 or Wrist_n.stat_type3 = 4 or Wrist_n.stat_type4 = 4 or Wrist_n.stat_type5 = 4 or Wrist_n.stat_type6 = 4) AND (Wrist_n.stat_type1 IN (12,13,14) or Wrist_n.stat_type2 IN (12,13,14) or Wrist_n.stat_type3 IN (12,13,14) or Wrist_n.stat_type4 IN (12,13,14) or Wrist_n.stat_type5 IN (12,13,14) or Wrist_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Wrist_n.stat_type1 = 3 or Wrist_n.stat_type2 = 3 or Wrist_n.stat_type3 = 3 or Wrist_n.stat_type4 = 3 or Wrist_n.stat_type5 = 3 or Wrist_n.stat_type6 = 3) AND (Wrist_n.stat_type1 IN (12,13,14) or Wrist_n.stat_type2 IN (12,13,14) or Wrist_n.stat_type3 IN (12,13,14) or Wrist_n.stat_type4 IN (12,13,14) or Wrist_n.stat_type5 IN (12,13,14) or Wrist_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (Wrist_n.stat_type1 = 4 or Wrist_n.stat_type2 = 4 or Wrist_n.stat_type3 = 4 or Wrist_n.stat_type4 = 4 or Wrist_n.stat_type5 = 4 or Wrist_n.stat_type6 = 4) AND (Wrist_n.stat_type1 IN (0,31,32,38,44) or Wrist_n.stat_type2 IN (0,31,32,38,44) or Wrist_n.stat_type3 IN (0,31,32,38,44) or Wrist_n.stat_type4 IN (0,31,32,38,44) or Wrist_n.stat_type5 IN (0,31,32,38,44) or Wrist_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Wrist_n.stat_type1 = 3 or Wrist_n.stat_type2 = 3 or Wrist_n.stat_type3 = 3 or Wrist_n.stat_type4 = 3 or Wrist_n.stat_type5 = 3 or Wrist_n.stat_type6 = 3) AND (Wrist_n.stat_type1 IN (0,31,32,38,44) or Wrist_n.stat_type2 IN (0,31,32,38,44) or Wrist_n.stat_type3 IN (0,31,32,38,44) or Wrist_n.stat_type4 IN (0,31,32,38,44) or Wrist_n.stat_type5 IN (0,31,32,38,44) or Wrist_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Wrist_n.stat_type1 = 5 or Wrist_n.stat_type2 = 5 or Wrist_n.stat_type3 = 5 or Wrist_n.stat_type4 = 5 or Wrist_n.stat_type5 = 5 or Wrist_n.stat_type6 = 5) AND (Wrist_n.stat_type1 IN (31) or Wrist_n.stat_type2 IN (31) or Wrist_n.stat_type3 IN (31) or Wrist_n.stat_type4 IN (31) or Wrist_n.stat_type5 IN (31) or Wrist_n.stat_type6 IN (31)) then\n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen Wrist_n.ItemLevel >=200 AND Wrist_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen Wrist_n.socketColor_1 = 0 and Wrist_n.socketColor_2 = 0 and Wrist_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\t\twhen left(Wrist.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\twhen Wrist.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\twhen left(Wrist.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Wrist.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Wrist_n.ItemLevel >= 251 AND Wrist_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Wrist_n.ItemLevel >= 264 AND Wrist_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Wrist_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t\t\t\t  \t\twhen (Wrist_n.stat_type1 = 5 or Wrist_n.stat_type2 = 5 or Wrist_n.stat_type3 = 5 or Wrist_n.stat_type4 = 5 or Wrist_n.stat_type5 = 5 or Wrist_n.stat_type6 = 5) AND (Wrist_n.stat_type1 IN (32,36,45) or Wrist_n.stat_type2 IN (32,36,45) or Wrist_n.stat_type3 IN (32,36,45) or Wrist_n.stat_type4 IN (32,36,45) or Wrist_n.stat_type5 IN (32,36,45) or Wrist_n.stat_type6 IN (32,36,45)) then \n\t\t\t\t\t\t  \t\tcase\n\t\t\t\t\t\t\t\t\twhen Wrist_n.ItemLevel >=200 AND Wrist_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen Wrist_n.socketColor_1 = 0 and Wrist_n.socketColor_2 = 0 and Wrist_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\t\twhen left(Wrist.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\twhen Wrist.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\twhen left(Wrist.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Wrist.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Wrist_n.ItemLevel >= 251 AND Wrist_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Wrist_n.ItemLevel >= 264 AND Wrist_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Wrist_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t\t\t \t  \tEND\n\t\t\t  #Healer / DPS\n\t\t     when (characters_npcbot_class_role.class_role IN ('Paladin Healer', 'Priest Healer', 'Warlock', 'Mage', 'Shaman Healer', 'Druid Healer'))\n\t\t\t        then \n\t\t\t \t\tcase \n\t\t\t \t  \t\twhen (Wrist_n.stat_type1 = 4 or Wrist_n.stat_type2 = 4 or Wrist_n.stat_type3 = 4 or Wrist_n.stat_type4 = 4 or Wrist_n.stat_type5 = 4 or Wrist_n.stat_type6 = 4) AND (Wrist_n.stat_type1 IN (12,13,14) or Wrist_n.stat_type2 IN (12,13,14) or Wrist_n.stat_type3 IN (12,13,14) or Wrist_n.stat_type4 IN (12,13,14) or Wrist_n.stat_type5 IN (12,13,14) or Wrist_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Wrist_n.stat_type1 = 3 or Wrist_n.stat_type2 = 3 or Wrist_n.stat_type3 = 3 or Wrist_n.stat_type4 = 3 or Wrist_n.stat_type5 = 3 or Wrist_n.stat_type6 = 3) AND (Wrist_n.stat_type1 IN (12,13,14) or Wrist_n.stat_type2 IN (12,13,14) or Wrist_n.stat_type3 IN (12,13,14) or Wrist_n.stat_type4 IN (12,13,14) or Wrist_n.stat_type5 IN (12,13,14) or Wrist_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (Wrist_n.stat_type1 = 4 or Wrist_n.stat_type2 = 4 or Wrist_n.stat_type3 = 4 or Wrist_n.stat_type4 = 4 or Wrist_n.stat_type5 = 4 or Wrist_n.stat_type6 = 4) AND (Wrist_n.stat_type1 IN (0,31,32,38,44) or Wrist_n.stat_type2 IN (0,31,32,38,44) or Wrist_n.stat_type3 IN (0,31,32,38,44) or Wrist_n.stat_type4 IN (0,31,32,38,44) or Wrist_n.stat_type5 IN (0,31,32,38,44) or Wrist_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Wrist_n.stat_type1 = 3 or Wrist_n.stat_type2 = 3 or Wrist_n.stat_type3 = 3 or Wrist_n.stat_type4 = 3 or Wrist_n.stat_type5 = 3 or Wrist_n.stat_type6 = 3) AND (Wrist_n.stat_type1 IN (0,31,32,38,44) or Wrist_n.stat_type2 IN (0,31,32,38,44) or Wrist_n.stat_type3 IN (0,31,32,38,44) or Wrist_n.stat_type4 IN (0,31,32,38,44) or Wrist_n.stat_type5 IN (0,31,32,38,44) or Wrist_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Wrist_n.stat_type1 = 5 or Wrist_n.stat_type2 = 5 or Wrist_n.stat_type3 = 5 or Wrist_n.stat_type4 = 5 or Wrist_n.stat_type5 = 5 or Wrist_n.stat_type6 = 5) AND (Wrist_n.stat_type1 IN (31) or Wrist_n.stat_type2 IN (31) or Wrist_n.stat_type3 IN (31) or Wrist_n.stat_type4 IN (31) or Wrist_n.stat_type5 IN (31) or Wrist_n.stat_type6 IN (31)) then '2 Gear not optimal for Healer'\n\t\t\t\t  \t\twhen (Wrist_n.stat_type1 = 5 or Wrist_n.stat_type2 = 5 or Wrist_n.stat_type3 = 5 or Wrist_n.stat_type4 = 5 or Wrist_n.stat_type5 = 5 or Wrist_n.stat_type6 = 5) AND (Wrist_n.stat_type1 IN (32,36,45) or Wrist_n.stat_type2 IN (32,36,45) or Wrist_n.stat_type3 IN (32,36,45) or Wrist_n.stat_type4 IN (32,36,45) or Wrist_n.stat_type5 IN (32,36,45) or Wrist_n.stat_type6 IN (32,36,45)) then\n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen Wrist_n.ItemLevel >=200 AND Wrist_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen Wrist_n.socketColor_1 = 0 and Wrist_n.socketColor_2 = 0 and Wrist_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\t\twhen left(Wrist.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\twhen Wrist.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\twhen left(Wrist.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Wrist.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Wrist_n.ItemLevel >= 251 AND Wrist_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Wrist_n.ItemLevel >= 264 AND Wrist_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Wrist_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t\t\t \t  \tEND\n\t\t\t \t#Agility Tank\n\t\t     when (characters_npcbot_class_role.class_role IN ('Druid Feral Tank')) then \n\t\t\t \t\tcase \n\t\t\t \t  \t\twhen (Wrist_n.stat_type1 = 4 or Wrist_n.stat_type2 = 4 or Wrist_n.stat_type3 = 4 or Wrist_n.stat_type4 = 4 or Wrist_n.stat_type5 = 4 or Wrist_n.stat_type6 = 4) AND (Wrist_n.stat_type1 IN (12,13,14) or Wrist_n.stat_type2 IN (12,13,14) or Wrist_n.stat_type3 IN (12,13,14) or Wrist_n.stat_type4 IN (12,13,14) or Wrist_n.stat_type5 IN (12,13,14) or Wrist_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Wrist_n.stat_type1 = 3 or Wrist_n.stat_type2 = 3 or Wrist_n.stat_type3 = 3 or Wrist_n.stat_type4 = 3 or Wrist_n.stat_type5 = 3 or Wrist_n.stat_type6 = 3) AND (Wrist_n.stat_type1 IN (12,13,14) or Wrist_n.stat_type2 IN (12,13,14) or Wrist_n.stat_type3 IN (12,13,14) or Wrist_n.stat_type4 IN (12,13,14) or Wrist_n.stat_type5 IN (12,13,14) or Wrist_n.stat_type6 IN (12,13,14)) then\n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen Wrist_n.ItemLevel >=200 AND Wrist_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen Wrist_n.socketColor_1 = 0 and Wrist_n.socketColor_2 = 0 and Wrist_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\t\twhen left(Wrist.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\twhen Wrist.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\twhen left(Wrist.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Wrist.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Wrist_n.ItemLevel >= 251 AND Wrist_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Wrist_n.ItemLevel >= 264 AND Wrist_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Wrist_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t  \t\t\t  \t\twhen (Wrist_n.stat_type1 = 4 or Wrist_n.stat_type2 = 4 or Wrist_n.stat_type3 = 4 or Wrist_n.stat_type4 = 4 or Wrist_n.stat_type5 = 4 or Wrist_n.stat_type6 = 4) AND (Wrist_n.stat_type1 IN (0,31,32,38,44) or Wrist_n.stat_type2 IN (0,31,32,38,44) or Wrist_n.stat_type3 IN (0,31,32,38,44) or Wrist_n.stat_type4 IN (0,31,32,38,44) or Wrist_n.stat_type5 IN (0,31,32,38,44) or Wrist_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Wrist_n.stat_type1 = 3 or Wrist_n.stat_type2 = 3 or Wrist_n.stat_type3 = 3 or Wrist_n.stat_type4 = 3 or Wrist_n.stat_type5 = 3 or Wrist_n.stat_type6 = 3) AND (Wrist_n.stat_type1 IN (0,31,32,38,44) or Wrist_n.stat_type2 IN (0,31,32,38,44) or Wrist_n.stat_type3 IN (0,31,32,38,44) or Wrist_n.stat_type4 IN (0,31,32,38,44) or Wrist_n.stat_type5 IN (0,31,32,38,44) or Wrist_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Wrist_n.stat_type1 = 5 or Wrist_n.stat_type2 = 5 or Wrist_n.stat_type3 = 5 or Wrist_n.stat_type4 = 5 or Wrist_n.stat_type5 = 5 or Wrist_n.stat_type6 = 5) AND (Wrist_n.stat_type1 IN (31) or Wrist_n.stat_type2 IN (31) or Wrist_n.stat_type3 IN (31) or Wrist_n.stat_type4 IN (31) or Wrist_n.stat_type5 IN (31) or Wrist_n.stat_type6 IN (31)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Wrist_n.stat_type1 = 5 or Wrist_n.stat_type2 = 5 or Wrist_n.stat_type3 = 5 or Wrist_n.stat_type4 = 5 or Wrist_n.stat_type5 = 5 or Wrist_n.stat_type6 = 5) AND (Wrist_n.stat_type1 IN (32,36,45) or Wrist_n.stat_type2 IN (32,36,45) or Wrist_n.stat_type3 IN (32,36,45) or Wrist_n.stat_type4 IN (32,36,45) or Wrist_n.stat_type5 IN (32,36,45) or Wrist_n.stat_type6 IN (32,36,45)) then '1 Gear with wrong stat'\n\t\t\t \t  \tEND\n\t\t\t #Agility DPS\n\t\t     when (characters_npcbot_class_role.class_role IN ('Hunter', 'Rogue', 'Druid Feral DPS', 'Shaman Enhancement')) then \n\t\t\t\t\tcase \n\t\t\t \t  \t\twhen (Wrist_n.stat_type1 = 4 or Wrist_n.stat_type2 = 4 or Wrist_n.stat_type3 = 4 or Wrist_n.stat_type4 = 4 or Wrist_n.stat_type5 = 4 or Wrist_n.stat_type6 = 4) AND (Wrist_n.stat_type1 IN (12,13,14) or Wrist_n.stat_type2 IN (12,13,14) or Wrist_n.stat_type3 IN (12,13,14) or Wrist_n.stat_type4 IN (12,13,14) or Wrist_n.stat_type5 IN (12,13,14) or Wrist_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Wrist_n.stat_type1 = 3 or Wrist_n.stat_type2 = 3 or Wrist_n.stat_type3 = 3 or Wrist_n.stat_type4 = 3 or Wrist_n.stat_type5 = 3 or Wrist_n.stat_type6 = 3) AND (Wrist_n.stat_type1 IN (12,13,14) or Wrist_n.stat_type2 IN (12,13,14) or Wrist_n.stat_type3 IN (12,13,14) or Wrist_n.stat_type4 IN (12,13,14) or Wrist_n.stat_type5 IN (12,13,14) or Wrist_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (Wrist_n.stat_type1 = 4 or Wrist_n.stat_type2 = 4 or Wrist_n.stat_type3 = 4 or Wrist_n.stat_type4 = 4 or Wrist_n.stat_type5 = 4 or Wrist_n.stat_type6 = 4) AND (Wrist_n.stat_type1 IN (0,31,32,38,44) or Wrist_n.stat_type2 IN (0,31,32,38,44) or Wrist_n.stat_type3 IN (0,31,32,38,44) or Wrist_n.stat_type4 IN (0,31,32,38,44) or Wrist_n.stat_type5 IN (0,31,32,38,44) or Wrist_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Wrist_n.stat_type1 = 3 or Wrist_n.stat_type2 = 3 or Wrist_n.stat_type3 = 3 or Wrist_n.stat_type4 = 3 or Wrist_n.stat_type5 = 3 or Wrist_n.stat_type6 = 3) AND (Wrist_n.stat_type1 IN (0,31,32,38,44) or Wrist_n.stat_type2 IN (0,31,32,38,44) or Wrist_n.stat_type3 IN (0,31,32,38,44) or Wrist_n.stat_type4 IN (0,31,32,38,44) or Wrist_n.stat_type5 IN (0,31,32,38,44) or Wrist_n.stat_type6 IN (0,31,32,38,44)) then \n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen Wrist_n.ItemLevel >=200 AND Wrist_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen Wrist_n.socketColor_1 = 0 and Wrist_n.socketColor_2 = 0 and Wrist_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\t\twhen left(Wrist.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\twhen Wrist.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\twhen left(Wrist.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Wrist.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Wrist_n.ItemLevel >= 251 AND Wrist_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Wrist_n.ItemLevel >= 264 AND Wrist_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Wrist_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND \n\t\t\t\t  \t\twhen (Wrist_n.stat_type1 = 5 or Wrist_n.stat_type2 = 5 or Wrist_n.stat_type3 = 5 or Wrist_n.stat_type4 = 5 or Wrist_n.stat_type5 = 5 or Wrist_n.stat_type6 = 5) AND (Wrist_n.stat_type1 IN (31) or Wrist_n.stat_type2 IN (31) or Wrist_n.stat_type3 IN (31) or Wrist_n.stat_type4 IN (31) or Wrist_n.stat_type5 IN (31) or Wrist_n.stat_type6 IN (31)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Wrist_n.stat_type1 = 5 or Wrist_n.stat_type2 = 5 or Wrist_n.stat_type3 = 5 or Wrist_n.stat_type4 = 5 or Wrist_n.stat_type5 = 5 or Wrist_n.stat_type6 = 5) AND (Wrist_n.stat_type1 IN (32,36,45) or Wrist_n.stat_type2 IN (32,36,45) or Wrist_n.stat_type3 IN (32,36,45) or Wrist_n.stat_type4 IN (32,36,45) or Wrist_n.stat_type5 IN (32,36,45) or Wrist_n.stat_type6 IN (32,36,45)) then '1 Gear with wrong stat'\n\t\t\t \t  \tEND\n\t\t end  AS '10 Wrist Analyze',\n\n\t\t case\n\t\t\t #Strength DPS\n\t\t     when (characters_npcbot_class_role.class_role IN ('Warrior DPS', 'Paladin DPS', 'DK DPS')) then \n\t\t     \t\tcase \n\t\t\t \t  \t\twhen (Hands_n.stat_type1 = 4 or Hands_n.stat_type2 = 4 or Hands_n.stat_type3 = 4 or Hands_n.stat_type4 = 4 or Hands_n.stat_type5 = 4 or Hands_n.stat_type6 = 4) AND (Hands_n.stat_type1 IN (12,13,14) or Hands_n.stat_type2 IN (12,13,14) or Hands_n.stat_type3 IN (12,13,14) or Hands_n.stat_type4 IN (12,13,14) or Hands_n.stat_type5 IN (12,13,14) or Hands_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Hands_n.stat_type1 = 3 or Hands_n.stat_type2 = 3 or Hands_n.stat_type3 = 3 or Hands_n.stat_type4 = 3 or Hands_n.stat_type5 = 3 or Hands_n.stat_type6 = 3) AND (Hands_n.stat_type1 IN (12,13,14) or Hands_n.stat_type2 IN (12,13,14) or Hands_n.stat_type3 IN (12,13,14) or Hands_n.stat_type4 IN (12,13,14) or Hands_n.stat_type5 IN (12,13,14) or Hands_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (Hands_n.stat_type1 = 4 or Hands_n.stat_type2 = 4 or Hands_n.stat_type3 = 4 or Hands_n.stat_type4 = 4 or Hands_n.stat_type5 = 4 or Hands_n.stat_type6 = 4) AND (Hands_n.stat_type1 IN (0,31,32,38,44) or Hands_n.stat_type2 IN (0,31,32,38,44) or Hands_n.stat_type3 IN (0,31,32,38,44) or Hands_n.stat_type4 IN (0,31,32,38,44) or Hands_n.stat_type5 IN (0,31,32,38,44) or Hands_n.stat_type6 IN (0,31,32,38,44)) then \n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen Hands_n.ItemLevel >=200 AND Hands_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen Hands_n.socketColor_1 = 0 and Hands_n.socketColor_2 = 0 and Hands_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\t\twhen left(Hands.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\twhen Hands.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\twhen left(Hands.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Hands.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Hands_n.ItemLevel >= 251 AND Hands_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Hands_n.ItemLevel >= 264 AND Hands_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Hands_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND \n\t\t\t \t  \t\twhen (Hands_n.stat_type1 = 3 or Hands_n.stat_type2 = 3 or Hands_n.stat_type3 = 3 or Hands_n.stat_type4 = 3 or Hands_n.stat_type5 = 3 or Hands_n.stat_type6 = 3) AND (Hands_n.stat_type1 IN (0,31,32,38,44) or Hands_n.stat_type2 IN (0,31,32,38,44) or Hands_n.stat_type3 IN (0,31,32,38,44) or Hands_n.stat_type4 IN (0,31,32,38,44) or Hands_n.stat_type5 IN (0,31,32,38,44) or Hands_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Hands_n.stat_type1 = 5 or Hands_n.stat_type2 = 5 or Hands_n.stat_type3 = 5 or Hands_n.stat_type4 = 5 or Hands_n.stat_type5 = 5 or Hands_n.stat_type6 = 5) AND (Hands_n.stat_type1 IN (31) or Hands_n.stat_type2 IN (31) or Hands_n.stat_type3 IN (31) or Hands_n.stat_type4 IN (31) or Hands_n.stat_type5 IN (31) or Hands_n.stat_type6 IN (31)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Hands_n.stat_type1 = 5 or Hands_n.stat_type2 = 5 or Hands_n.stat_type3 = 5 or Hands_n.stat_type4 = 5 or Hands_n.stat_type5 = 5 or Hands_n.stat_type6 = 5) AND (Hands_n.stat_type1 IN (32,36,45) or Hands_n.stat_type2 IN (32,36,45) or Hands_n.stat_type3 IN (32,36,45) or Hands_n.stat_type4 IN (32,36,45) or Hands_n.stat_type5 IN (32,36,45) or Hands_n.stat_type6 IN (32,36,45)) then '1 Gear with wrong stat'\n\t\t\t \t  \tEND\n\t\t\t #Strength Tank\n\t\t     when (characters_npcbot_class_role.class_role IN ('Warrior Tank', 'Paladin Tank', 'DK Tank')) then\n\t\t     \t\tcase \n\t\t\t \t  \t\twhen (Hands_n.stat_type1 = 4 or Hands_n.stat_type2 = 4 or Hands_n.stat_type3 = 4 or Hands_n.stat_type4 = 4 or Hands_n.stat_type5 = 4 or Hands_n.stat_type6 = 4) AND (Hands_n.stat_type1 IN (12,13,14) or Hands_n.stat_type2 IN (12,13,14) or Hands_n.stat_type3 IN (12,13,14) or Hands_n.stat_type4 IN (12,13,14) or Hands_n.stat_type5 IN (12,13,14) or Hands_n.stat_type6 IN (12,13,14)) then \n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen Hands_n.ItemLevel >=200 AND Hands_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen Hands_n.socketColor_1 = 0 and Hands_n.socketColor_2 = 0 and Hands_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\t\twhen left(Hands.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\twhen Hands.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\twhen left(Hands.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Hands.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Hands_n.ItemLevel >= 251 AND Hands_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Hands_n.ItemLevel >= 264 AND Hands_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Hands_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t\t\t \t  \t\twhen (Hands_n.stat_type1 = 3 or Hands_n.stat_type2 = 3 or Hands_n.stat_type3 = 3 or Hands_n.stat_type4 = 3 or Hands_n.stat_type5 = 3 or Hands_n.stat_type6 = 3) AND (Hands_n.stat_type1 IN (12,13,14) or Hands_n.stat_type2 IN (12,13,14) or Hands_n.stat_type3 IN (12,13,14) or Hands_n.stat_type4 IN (12,13,14) or Hands_n.stat_type5 IN (12,13,14) or Hands_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (Hands_n.stat_type1 = 4 or Hands_n.stat_type2 = 4 or Hands_n.stat_type3 = 4 or Hands_n.stat_type4 = 4 or Hands_n.stat_type5 = 4 or Hands_n.stat_type6 = 4) AND (Hands_n.stat_type1 IN (0,31,32,38,44) or Hands_n.stat_type2 IN (0,31,32,38,44) or Hands_n.stat_type3 IN (0,31,32,38,44) or Hands_n.stat_type4 IN (0,31,32,38,44) or Hands_n.stat_type5 IN (0,31,32,38,44) or Hands_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Hands_n.stat_type1 = 3 or Hands_n.stat_type2 = 3 or Hands_n.stat_type3 = 3 or Hands_n.stat_type4 = 3 or Hands_n.stat_type5 = 3 or Hands_n.stat_type6 = 3) AND (Hands_n.stat_type1 IN (0,31,32,38,44) or Hands_n.stat_type2 IN (0,31,32,38,44) or Hands_n.stat_type3 IN (0,31,32,38,44) or Hands_n.stat_type4 IN (0,31,32,38,44) or Hands_n.stat_type5 IN (0,31,32,38,44) or Hands_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Hands_n.stat_type1 = 5 or Hands_n.stat_type2 = 5 or Hands_n.stat_type3 = 5 or Hands_n.stat_type4 = 5 or Hands_n.stat_type5 = 5 or Hands_n.stat_type6 = 5) AND (Hands_n.stat_type1 IN (31) or Hands_n.stat_type2 IN (31) or Hands_n.stat_type3 IN (31) or Hands_n.stat_type4 IN (31) or Hands_n.stat_type5 IN (31) or Hands_n.stat_type6 IN (31)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Hands_n.stat_type1 = 5 or Hands_n.stat_type2 = 5 or Hands_n.stat_type3 = 5 or Hands_n.stat_type4 = 5 or Hands_n.stat_type5 = 5 or Hands_n.stat_type6 = 5) AND (Hands_n.stat_type1 IN (32,36,45) or Hands_n.stat_type2 IN (32,36,45) or Hands_n.stat_type3 IN (32,36,45) or Hands_n.stat_type4 IN (32,36,45) or Hands_n.stat_type5 IN (32,36,45) or Hands_n.stat_type6 IN (32,36,45)) then '1 Gear with wrong stat'\n\t\t\t \t  \tEND\n\t\t\t \t#Magic DPS\n\t\t      when (characters_npcbot_class_role.class_role IN ('Mage', 'Warlock', 'Shaman Elemental', 'Druid Balance', 'Priest DPS')) then\n\t\t\t \t\tcase \n\t\t\t \t  \t\twhen (Hands_n.stat_type1 = 4 or Hands_n.stat_type2 = 4 or Hands_n.stat_type3 = 4 or Hands_n.stat_type4 = 4 or Hands_n.stat_type5 = 4 or Hands_n.stat_type6 = 4) AND (Hands_n.stat_type1 IN (12,13,14) or Hands_n.stat_type2 IN (12,13,14) or Hands_n.stat_type3 IN (12,13,14) or Hands_n.stat_type4 IN (12,13,14) or Hands_n.stat_type5 IN (12,13,14) or Hands_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Hands_n.stat_type1 = 3 or Hands_n.stat_type2 = 3 or Hands_n.stat_type3 = 3 or Hands_n.stat_type4 = 3 or Hands_n.stat_type5 = 3 or Hands_n.stat_type6 = 3) AND (Hands_n.stat_type1 IN (12,13,14) or Hands_n.stat_type2 IN (12,13,14) or Hands_n.stat_type3 IN (12,13,14) or Hands_n.stat_type4 IN (12,13,14) or Hands_n.stat_type5 IN (12,13,14) or Hands_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (Hands_n.stat_type1 = 4 or Hands_n.stat_type2 = 4 or Hands_n.stat_type3 = 4 or Hands_n.stat_type4 = 4 or Hands_n.stat_type5 = 4 or Hands_n.stat_type6 = 4) AND (Hands_n.stat_type1 IN (0,31,32,38,44) or Hands_n.stat_type2 IN (0,31,32,38,44) or Hands_n.stat_type3 IN (0,31,32,38,44) or Hands_n.stat_type4 IN (0,31,32,38,44) or Hands_n.stat_type5 IN (0,31,32,38,44) or Hands_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Hands_n.stat_type1 = 3 or Hands_n.stat_type2 = 3 or Hands_n.stat_type3 = 3 or Hands_n.stat_type4 = 3 or Hands_n.stat_type5 = 3 or Hands_n.stat_type6 = 3) AND (Hands_n.stat_type1 IN (0,31,32,38,44) or Hands_n.stat_type2 IN (0,31,32,38,44) or Hands_n.stat_type3 IN (0,31,32,38,44) or Hands_n.stat_type4 IN (0,31,32,38,44) or Hands_n.stat_type5 IN (0,31,32,38,44) or Hands_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Hands_n.stat_type1 = 5 or Hands_n.stat_type2 = 5 or Hands_n.stat_type3 = 5 or Hands_n.stat_type4 = 5 or Hands_n.stat_type5 = 5 or Hands_n.stat_type6 = 5) AND (Hands_n.stat_type1 IN (31) or Hands_n.stat_type2 IN (31) or Hands_n.stat_type3 IN (31) or Hands_n.stat_type4 IN (31) or Hands_n.stat_type5 IN (31) or Hands_n.stat_type6 IN (31)) then\n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen Hands_n.ItemLevel >=200 AND Hands_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen Hands_n.socketColor_1 = 0 and Hands_n.socketColor_2 = 0 and Hands_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\t\twhen left(Hands.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\twhen Hands.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\twhen left(Hands.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Hands.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Hands_n.ItemLevel >= 251 AND Hands_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Hands_n.ItemLevel >= 264 AND Hands_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Hands_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t\t\t\t  \t\twhen (Hands_n.stat_type1 = 5 or Hands_n.stat_type2 = 5 or Hands_n.stat_type3 = 5 or Hands_n.stat_type4 = 5 or Hands_n.stat_type5 = 5 or Hands_n.stat_type6 = 5) AND (Hands_n.stat_type1 IN (32,36,45) or Hands_n.stat_type2 IN (32,36,45) or Hands_n.stat_type3 IN (32,36,45) or Hands_n.stat_type4 IN (32,36,45) or Hands_n.stat_type5 IN (32,36,45) or Hands_n.stat_type6 IN (32,36,45)) then \n\t\t\t\t\t\t  \t\tcase\n\t\t\t\t\t\t\t\t\twhen Hands_n.ItemLevel >=200 AND Hands_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen Hands_n.socketColor_1 = 0 and Hands_n.socketColor_2 = 0 and Hands_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\t\twhen left(Hands.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\twhen Hands.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\twhen left(Hands.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Hands.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Hands_n.ItemLevel >= 251 AND Hands_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Hands_n.ItemLevel >= 264 AND Hands_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Hands_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t\t\t \t  \tEND\n\t\t\t  #Healer / DPS\n\t\t     when (characters_npcbot_class_role.class_role IN ('Paladin Healer', 'Priest Healer', 'Warlock', 'Mage', 'Shaman Healer', 'Druid Healer'))\n\t\t\t        then \n\t\t\t \t\tcase \n\t\t\t \t  \t\twhen (Hands_n.stat_type1 = 4 or Hands_n.stat_type2 = 4 or Hands_n.stat_type3 = 4 or Hands_n.stat_type4 = 4 or Hands_n.stat_type5 = 4 or Hands_n.stat_type6 = 4) AND (Hands_n.stat_type1 IN (12,13,14) or Hands_n.stat_type2 IN (12,13,14) or Hands_n.stat_type3 IN (12,13,14) or Hands_n.stat_type4 IN (12,13,14) or Hands_n.stat_type5 IN (12,13,14) or Hands_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Hands_n.stat_type1 = 3 or Hands_n.stat_type2 = 3 or Hands_n.stat_type3 = 3 or Hands_n.stat_type4 = 3 or Hands_n.stat_type5 = 3 or Hands_n.stat_type6 = 3) AND (Hands_n.stat_type1 IN (12,13,14) or Hands_n.stat_type2 IN (12,13,14) or Hands_n.stat_type3 IN (12,13,14) or Hands_n.stat_type4 IN (12,13,14) or Hands_n.stat_type5 IN (12,13,14) or Hands_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (Hands_n.stat_type1 = 4 or Hands_n.stat_type2 = 4 or Hands_n.stat_type3 = 4 or Hands_n.stat_type4 = 4 or Hands_n.stat_type5 = 4 or Hands_n.stat_type6 = 4) AND (Hands_n.stat_type1 IN (0,31,32,38,44) or Hands_n.stat_type2 IN (0,31,32,38,44) or Hands_n.stat_type3 IN (0,31,32,38,44) or Hands_n.stat_type4 IN (0,31,32,38,44) or Hands_n.stat_type5 IN (0,31,32,38,44) or Hands_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Hands_n.stat_type1 = 3 or Hands_n.stat_type2 = 3 or Hands_n.stat_type3 = 3 or Hands_n.stat_type4 = 3 or Hands_n.stat_type5 = 3 or Hands_n.stat_type6 = 3) AND (Hands_n.stat_type1 IN (0,31,32,38,44) or Hands_n.stat_type2 IN (0,31,32,38,44) or Hands_n.stat_type3 IN (0,31,32,38,44) or Hands_n.stat_type4 IN (0,31,32,38,44) or Hands_n.stat_type5 IN (0,31,32,38,44) or Hands_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Hands_n.stat_type1 = 5 or Hands_n.stat_type2 = 5 or Hands_n.stat_type3 = 5 or Hands_n.stat_type4 = 5 or Hands_n.stat_type5 = 5 or Hands_n.stat_type6 = 5) AND (Hands_n.stat_type1 IN (31) or Hands_n.stat_type2 IN (31) or Hands_n.stat_type3 IN (31) or Hands_n.stat_type4 IN (31) or Hands_n.stat_type5 IN (31) or Hands_n.stat_type6 IN (31)) then '2 Gear not optimal for Healer'\n\t\t\t\t  \t\twhen (Hands_n.stat_type1 = 5 or Hands_n.stat_type2 = 5 or Hands_n.stat_type3 = 5 or Hands_n.stat_type4 = 5 or Hands_n.stat_type5 = 5 or Hands_n.stat_type6 = 5) AND (Hands_n.stat_type1 IN (32,36,45) or Hands_n.stat_type2 IN (32,36,45) or Hands_n.stat_type3 IN (32,36,45) or Hands_n.stat_type4 IN (32,36,45) or Hands_n.stat_type5 IN (32,36,45) or Hands_n.stat_type6 IN (32,36,45)) then\n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen Hands_n.ItemLevel >=200 AND Hands_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen Hands_n.socketColor_1 = 0 and Hands_n.socketColor_2 = 0 and Hands_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\t\twhen left(Hands.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\twhen Hands.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\twhen left(Hands.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Hands.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Hands_n.ItemLevel >= 251 AND Hands_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Hands_n.ItemLevel >= 264 AND Hands_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Hands_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t\t\t \t  \tEND\n\t\t\t \t#Agility Tank\n\t\t     when (characters_npcbot_class_role.class_role IN ('Druid Feral Tank')) then \n\t\t\t \t\tcase \n\t\t\t \t  \t\twhen (Hands_n.stat_type1 = 4 or Hands_n.stat_type2 = 4 or Hands_n.stat_type3 = 4 or Hands_n.stat_type4 = 4 or Hands_n.stat_type5 = 4 or Hands_n.stat_type6 = 4) AND (Hands_n.stat_type1 IN (12,13,14) or Hands_n.stat_type2 IN (12,13,14) or Hands_n.stat_type3 IN (12,13,14) or Hands_n.stat_type4 IN (12,13,14) or Hands_n.stat_type5 IN (12,13,14) or Hands_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Hands_n.stat_type1 = 3 or Hands_n.stat_type2 = 3 or Hands_n.stat_type3 = 3 or Hands_n.stat_type4 = 3 or Hands_n.stat_type5 = 3 or Hands_n.stat_type6 = 3) AND (Hands_n.stat_type1 IN (12,13,14) or Hands_n.stat_type2 IN (12,13,14) or Hands_n.stat_type3 IN (12,13,14) or Hands_n.stat_type4 IN (12,13,14) or Hands_n.stat_type5 IN (12,13,14) or Hands_n.stat_type6 IN (12,13,14)) then\n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen Hands_n.ItemLevel >=200 AND Hands_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen Hands_n.socketColor_1 = 0 and Hands_n.socketColor_2 = 0 and Hands_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\t\twhen left(Hands.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\twhen Hands.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\twhen left(Hands.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Hands.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Hands_n.ItemLevel >= 251 AND Hands_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Hands_n.ItemLevel >= 264 AND Hands_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Hands_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t  \t\t\t  \t\twhen (Hands_n.stat_type1 = 4 or Hands_n.stat_type2 = 4 or Hands_n.stat_type3 = 4 or Hands_n.stat_type4 = 4 or Hands_n.stat_type5 = 4 or Hands_n.stat_type6 = 4) AND (Hands_n.stat_type1 IN (0,31,32,38,44) or Hands_n.stat_type2 IN (0,31,32,38,44) or Hands_n.stat_type3 IN (0,31,32,38,44) or Hands_n.stat_type4 IN (0,31,32,38,44) or Hands_n.stat_type5 IN (0,31,32,38,44) or Hands_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Hands_n.stat_type1 = 3 or Hands_n.stat_type2 = 3 or Hands_n.stat_type3 = 3 or Hands_n.stat_type4 = 3 or Hands_n.stat_type5 = 3 or Hands_n.stat_type6 = 3) AND (Hands_n.stat_type1 IN (0,31,32,38,44) or Hands_n.stat_type2 IN (0,31,32,38,44) or Hands_n.stat_type3 IN (0,31,32,38,44) or Hands_n.stat_type4 IN (0,31,32,38,44) or Hands_n.stat_type5 IN (0,31,32,38,44) or Hands_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Hands_n.stat_type1 = 5 or Hands_n.stat_type2 = 5 or Hands_n.stat_type3 = 5 or Hands_n.stat_type4 = 5 or Hands_n.stat_type5 = 5 or Hands_n.stat_type6 = 5) AND (Hands_n.stat_type1 IN (31) or Hands_n.stat_type2 IN (31) or Hands_n.stat_type3 IN (31) or Hands_n.stat_type4 IN (31) or Hands_n.stat_type5 IN (31) or Hands_n.stat_type6 IN (31)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Hands_n.stat_type1 = 5 or Hands_n.stat_type2 = 5 or Hands_n.stat_type3 = 5 or Hands_n.stat_type4 = 5 or Hands_n.stat_type5 = 5 or Hands_n.stat_type6 = 5) AND (Hands_n.stat_type1 IN (32,36,45) or Hands_n.stat_type2 IN (32,36,45) or Hands_n.stat_type3 IN (32,36,45) or Hands_n.stat_type4 IN (32,36,45) or Hands_n.stat_type5 IN (32,36,45) or Hands_n.stat_type6 IN (32,36,45)) then '1 Gear with wrong stat'\n\t\t\t \t  \tEND\n\t\t\t #Agility DPS\n\t\t     when (characters_npcbot_class_role.class_role IN ('Hunter', 'Rogue', 'Druid Feral DPS', 'Shaman Enhancement')) then \n\t\t\t\t\tcase \n\t\t\t \t  \t\twhen (Hands_n.stat_type1 = 4 or Hands_n.stat_type2 = 4 or Hands_n.stat_type3 = 4 or Hands_n.stat_type4 = 4 or Hands_n.stat_type5 = 4 or Hands_n.stat_type6 = 4) AND (Hands_n.stat_type1 IN (12,13,14) or Hands_n.stat_type2 IN (12,13,14) or Hands_n.stat_type3 IN (12,13,14) or Hands_n.stat_type4 IN (12,13,14) or Hands_n.stat_type5 IN (12,13,14) or Hands_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Hands_n.stat_type1 = 3 or Hands_n.stat_type2 = 3 or Hands_n.stat_type3 = 3 or Hands_n.stat_type4 = 3 or Hands_n.stat_type5 = 3 or Hands_n.stat_type6 = 3) AND (Hands_n.stat_type1 IN (12,13,14) or Hands_n.stat_type2 IN (12,13,14) or Hands_n.stat_type3 IN (12,13,14) or Hands_n.stat_type4 IN (12,13,14) or Hands_n.stat_type5 IN (12,13,14) or Hands_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (Hands_n.stat_type1 = 4 or Hands_n.stat_type2 = 4 or Hands_n.stat_type3 = 4 or Hands_n.stat_type4 = 4 or Hands_n.stat_type5 = 4 or Hands_n.stat_type6 = 4) AND (Hands_n.stat_type1 IN (0,31,32,38,44) or Hands_n.stat_type2 IN (0,31,32,38,44) or Hands_n.stat_type3 IN (0,31,32,38,44) or Hands_n.stat_type4 IN (0,31,32,38,44) or Hands_n.stat_type5 IN (0,31,32,38,44) or Hands_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Hands_n.stat_type1 = 3 or Hands_n.stat_type2 = 3 or Hands_n.stat_type3 = 3 or Hands_n.stat_type4 = 3 or Hands_n.stat_type5 = 3 or Hands_n.stat_type6 = 3) AND (Hands_n.stat_type1 IN (0,31,32,38,44) or Hands_n.stat_type2 IN (0,31,32,38,44) or Hands_n.stat_type3 IN (0,31,32,38,44) or Hands_n.stat_type4 IN (0,31,32,38,44) or Hands_n.stat_type5 IN (0,31,32,38,44) or Hands_n.stat_type6 IN (0,31,32,38,44)) then \n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen Hands_n.ItemLevel >=200 AND Hands_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen Hands_n.socketColor_1 = 0 and Hands_n.socketColor_2 = 0 and Hands_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\t\twhen left(Hands.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\twhen Hands.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\twhen left(Hands.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Hands.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Hands_n.ItemLevel >= 251 AND Hands_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Hands_n.ItemLevel >= 264 AND Hands_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Hands_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND \n\t\t\t\t  \t\twhen (Hands_n.stat_type1 = 5 or Hands_n.stat_type2 = 5 or Hands_n.stat_type3 = 5 or Hands_n.stat_type4 = 5 or Hands_n.stat_type5 = 5 or Hands_n.stat_type6 = 5) AND (Hands_n.stat_type1 IN (31) or Hands_n.stat_type2 IN (31) or Hands_n.stat_type3 IN (31) or Hands_n.stat_type4 IN (31) or Hands_n.stat_type5 IN (31) or Hands_n.stat_type6 IN (31)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Hands_n.stat_type1 = 5 or Hands_n.stat_type2 = 5 or Hands_n.stat_type3 = 5 or Hands_n.stat_type4 = 5 or Hands_n.stat_type5 = 5 or Hands_n.stat_type6 = 5) AND (Hands_n.stat_type1 IN (32,36,45) or Hands_n.stat_type2 IN (32,36,45) or Hands_n.stat_type3 IN (32,36,45) or Hands_n.stat_type4 IN (32,36,45) or Hands_n.stat_type5 IN (32,36,45) or Hands_n.stat_type6 IN (32,36,45)) then '1 Gear with wrong stat'\n\t\t\t \t  \tEND\n\t\t end  AS '11 Hand Analyze',\n\n\t\t case\n\t\t\t #Strength DPS\n\t\t     when (characters_npcbot_class_role.class_role IN ('Warrior DPS', 'Paladin DPS', 'DK DPS')) then \n\t\t     \t\tcase \n\t\t\t \t  \t\twhen (Back_n.stat_type1 = 4 or Back_n.stat_type2 = 4 or Back_n.stat_type3 = 4 or Back_n.stat_type4 = 4 or Back_n.stat_type5 = 4 or Back_n.stat_type6 = 4) AND (Back_n.stat_type1 IN (12,13,14) or Back_n.stat_type2 IN (12,13,14) or Back_n.stat_type3 IN (12,13,14) or Back_n.stat_type4 IN (12,13,14) or Back_n.stat_type5 IN (12,13,14) or Back_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Back_n.stat_type1 = 3 or Back_n.stat_type2 = 3 or Back_n.stat_type3 = 3 or Back_n.stat_type4 = 3 or Back_n.stat_type5 = 3 or Back_n.stat_type6 = 3) AND (Back_n.stat_type1 IN (12,13,14) or Back_n.stat_type2 IN (12,13,14) or Back_n.stat_type3 IN (12,13,14) or Back_n.stat_type4 IN (12,13,14) or Back_n.stat_type5 IN (12,13,14) or Back_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (Back_n.stat_type1 = 4 or Back_n.stat_type2 = 4 or Back_n.stat_type3 = 4 or Back_n.stat_type4 = 4 or Back_n.stat_type5 = 4 or Back_n.stat_type6 = 4) AND (Back_n.stat_type1 IN (0,31,32,38,44) or Back_n.stat_type2 IN (0,31,32,38,44) or Back_n.stat_type3 IN (0,31,32,38,44) or Back_n.stat_type4 IN (0,31,32,38,44) or Back_n.stat_type5 IN (0,31,32,38,44) or Back_n.stat_type6 IN (0,31,32,38,44)) then \n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen Back_n.ItemLevel >=200 AND Back_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen Back_n.socketColor_1 = 0 and Back_n.socketColor_2 = 0 and Back_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\t\twhen left(Back.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\twhen Back.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\twhen left(Back.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Back.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Back_n.ItemLevel >= 251 AND Back_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Back_n.ItemLevel >= 264 AND Back_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Back_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND \n\t\t\t \t  \t\twhen (Back_n.stat_type1 = 3 or Back_n.stat_type2 = 3 or Back_n.stat_type3 = 3 or Back_n.stat_type4 = 3 or Back_n.stat_type5 = 3 or Back_n.stat_type6 = 3) AND (Back_n.stat_type1 IN (0,31,32,38,44) or Back_n.stat_type2 IN (0,31,32,38,44) or Back_n.stat_type3 IN (0,31,32,38,44) or Back_n.stat_type4 IN (0,31,32,38,44) or Back_n.stat_type5 IN (0,31,32,38,44) or Back_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Back_n.stat_type1 = 5 or Back_n.stat_type2 = 5 or Back_n.stat_type3 = 5 or Back_n.stat_type4 = 5 or Back_n.stat_type5 = 5 or Back_n.stat_type6 = 5) AND (Back_n.stat_type1 IN (31) or Back_n.stat_type2 IN (31) or Back_n.stat_type3 IN (31) or Back_n.stat_type4 IN (31) or Back_n.stat_type5 IN (31) or Back_n.stat_type6 IN (31)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Back_n.stat_type1 = 5 or Back_n.stat_type2 = 5 or Back_n.stat_type3 = 5 or Back_n.stat_type4 = 5 or Back_n.stat_type5 = 5 or Back_n.stat_type6 = 5) AND (Back_n.stat_type1 IN (32,36,45) or Back_n.stat_type2 IN (32,36,45) or Back_n.stat_type3 IN (32,36,45) or Back_n.stat_type4 IN (32,36,45) or Back_n.stat_type5 IN (32,36,45) or Back_n.stat_type6 IN (32,36,45)) then '1 Gear with wrong stat'\n\t\t\t \t  \tEND\n\t\t\t #Strength Tank\n\t\t     when (characters_npcbot_class_role.class_role IN ('Warrior Tank', 'Paladin Tank', 'DK Tank')) then\n\t\t     \t\tcase \n\t\t\t \t  \t\twhen (Back_n.stat_type1 = 4 or Back_n.stat_type2 = 4 or Back_n.stat_type3 = 4 or Back_n.stat_type4 = 4 or Back_n.stat_type5 = 4 or Back_n.stat_type6 = 4) AND (Back_n.stat_type1 IN (12,13,14) or Back_n.stat_type2 IN (12,13,14) or Back_n.stat_type3 IN (12,13,14) or Back_n.stat_type4 IN (12,13,14) or Back_n.stat_type5 IN (12,13,14) or Back_n.stat_type6 IN (12,13,14)) then \n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen Back_n.ItemLevel >=200 AND Back_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen Back_n.socketColor_1 = 0 and Back_n.socketColor_2 = 0 and Back_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\t\twhen left(Back.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\twhen Back.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\twhen left(Back.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Back.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Back_n.ItemLevel >= 251 AND Back_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Back_n.ItemLevel >= 264 AND Back_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Back_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t\t\t \t  \t\twhen (Back_n.stat_type1 = 3 or Back_n.stat_type2 = 3 or Back_n.stat_type3 = 3 or Back_n.stat_type4 = 3 or Back_n.stat_type5 = 3 or Back_n.stat_type6 = 3) AND (Back_n.stat_type1 IN (12,13,14) or Back_n.stat_type2 IN (12,13,14) or Back_n.stat_type3 IN (12,13,14) or Back_n.stat_type4 IN (12,13,14) or Back_n.stat_type5 IN (12,13,14) or Back_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (Back_n.stat_type1 = 4 or Back_n.stat_type2 = 4 or Back_n.stat_type3 = 4 or Back_n.stat_type4 = 4 or Back_n.stat_type5 = 4 or Back_n.stat_type6 = 4) AND (Back_n.stat_type1 IN (0,31,32,38,44) or Back_n.stat_type2 IN (0,31,32,38,44) or Back_n.stat_type3 IN (0,31,32,38,44) or Back_n.stat_type4 IN (0,31,32,38,44) or Back_n.stat_type5 IN (0,31,32,38,44) or Back_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Back_n.stat_type1 = 3 or Back_n.stat_type2 = 3 or Back_n.stat_type3 = 3 or Back_n.stat_type4 = 3 or Back_n.stat_type5 = 3 or Back_n.stat_type6 = 3) AND (Back_n.stat_type1 IN (0,31,32,38,44) or Back_n.stat_type2 IN (0,31,32,38,44) or Back_n.stat_type3 IN (0,31,32,38,44) or Back_n.stat_type4 IN (0,31,32,38,44) or Back_n.stat_type5 IN (0,31,32,38,44) or Back_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Back_n.stat_type1 = 5 or Back_n.stat_type2 = 5 or Back_n.stat_type3 = 5 or Back_n.stat_type4 = 5 or Back_n.stat_type5 = 5 or Back_n.stat_type6 = 5) AND (Back_n.stat_type1 IN (31) or Back_n.stat_type2 IN (31) or Back_n.stat_type3 IN (31) or Back_n.stat_type4 IN (31) or Back_n.stat_type5 IN (31) or Back_n.stat_type6 IN (31)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Back_n.stat_type1 = 5 or Back_n.stat_type2 = 5 or Back_n.stat_type3 = 5 or Back_n.stat_type4 = 5 or Back_n.stat_type5 = 5 or Back_n.stat_type6 = 5) AND (Back_n.stat_type1 IN (32,36,45) or Back_n.stat_type2 IN (32,36,45) or Back_n.stat_type3 IN (32,36,45) or Back_n.stat_type4 IN (32,36,45) or Back_n.stat_type5 IN (32,36,45) or Back_n.stat_type6 IN (32,36,45)) then '1 Gear with wrong stat'\n\t\t\t \t  \tEND\n\t\t\t \t#Magic DPS\n\t\t      when (characters_npcbot_class_role.class_role IN ('Mage', 'Warlock', 'Shaman Elemental', 'Druid Balance', 'Priest DPS')) then\n\t\t\t \t\tcase \n\t\t\t \t  \t\twhen (Back_n.stat_type1 = 4 or Back_n.stat_type2 = 4 or Back_n.stat_type3 = 4 or Back_n.stat_type4 = 4 or Back_n.stat_type5 = 4 or Back_n.stat_type6 = 4) AND (Back_n.stat_type1 IN (12,13,14) or Back_n.stat_type2 IN (12,13,14) or Back_n.stat_type3 IN (12,13,14) or Back_n.stat_type4 IN (12,13,14) or Back_n.stat_type5 IN (12,13,14) or Back_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Back_n.stat_type1 = 3 or Back_n.stat_type2 = 3 or Back_n.stat_type3 = 3 or Back_n.stat_type4 = 3 or Back_n.stat_type5 = 3 or Back_n.stat_type6 = 3) AND (Back_n.stat_type1 IN (12,13,14) or Back_n.stat_type2 IN (12,13,14) or Back_n.stat_type3 IN (12,13,14) or Back_n.stat_type4 IN (12,13,14) or Back_n.stat_type5 IN (12,13,14) or Back_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (Back_n.stat_type1 = 4 or Back_n.stat_type2 = 4 or Back_n.stat_type3 = 4 or Back_n.stat_type4 = 4 or Back_n.stat_type5 = 4 or Back_n.stat_type6 = 4) AND (Back_n.stat_type1 IN (0,31,32,38,44) or Back_n.stat_type2 IN (0,31,32,38,44) or Back_n.stat_type3 IN (0,31,32,38,44) or Back_n.stat_type4 IN (0,31,32,38,44) or Back_n.stat_type5 IN (0,31,32,38,44) or Back_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Back_n.stat_type1 = 3 or Back_n.stat_type2 = 3 or Back_n.stat_type3 = 3 or Back_n.stat_type4 = 3 or Back_n.stat_type5 = 3 or Back_n.stat_type6 = 3) AND (Back_n.stat_type1 IN (0,31,32,38,44) or Back_n.stat_type2 IN (0,31,32,38,44) or Back_n.stat_type3 IN (0,31,32,38,44) or Back_n.stat_type4 IN (0,31,32,38,44) or Back_n.stat_type5 IN (0,31,32,38,44) or Back_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Back_n.stat_type1 = 5 or Back_n.stat_type2 = 5 or Back_n.stat_type3 = 5 or Back_n.stat_type4 = 5 or Back_n.stat_type5 = 5 or Back_n.stat_type6 = 5) AND (Back_n.stat_type1 IN (31) or Back_n.stat_type2 IN (31) or Back_n.stat_type3 IN (31) or Back_n.stat_type4 IN (31) or Back_n.stat_type5 IN (31) or Back_n.stat_type6 IN (31)) then\n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen Back_n.ItemLevel >=200 AND Back_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen Back_n.socketColor_1 = 0 and Back_n.socketColor_2 = 0 and Back_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\t\twhen left(Back.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\twhen Back.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\twhen left(Back.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Back.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Back_n.ItemLevel >= 251 AND Back_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Back_n.ItemLevel >= 264 AND Back_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Back_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t\t\t\t  \t\twhen (Back_n.stat_type1 = 5 or Back_n.stat_type2 = 5 or Back_n.stat_type3 = 5 or Back_n.stat_type4 = 5 or Back_n.stat_type5 = 5 or Back_n.stat_type6 = 5) AND (Back_n.stat_type1 IN (32,36,45) or Back_n.stat_type2 IN (32,36,45) or Back_n.stat_type3 IN (32,36,45) or Back_n.stat_type4 IN (32,36,45) or Back_n.stat_type5 IN (32,36,45) or Back_n.stat_type6 IN (32,36,45)) then \n\t\t\t\t\t\t  \t\tcase\n\t\t\t\t\t\t\t\t\twhen Back_n.ItemLevel >=200 AND Back_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen Back_n.socketColor_1 = 0 and Back_n.socketColor_2 = 0 and Back_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\t\twhen left(Back.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\twhen Back.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\twhen left(Back.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Back.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Back_n.ItemLevel >= 251 AND Back_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Back_n.ItemLevel >= 264 AND Back_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Back_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t\t\t \t  \tEND\n\t\t\t  #Healer / DPS\n\t\t     when (characters_npcbot_class_role.class_role IN ('Paladin Healer', 'Priest Healer', 'Warlock', 'Mage', 'Shaman Healer', 'Druid Healer'))\n\t\t\t        then \n\t\t\t \t\tcase \n\t\t\t \t  \t\twhen (Back_n.stat_type1 = 4 or Back_n.stat_type2 = 4 or Back_n.stat_type3 = 4 or Back_n.stat_type4 = 4 or Back_n.stat_type5 = 4 or Back_n.stat_type6 = 4) AND (Back_n.stat_type1 IN (12,13,14) or Back_n.stat_type2 IN (12,13,14) or Back_n.stat_type3 IN (12,13,14) or Back_n.stat_type4 IN (12,13,14) or Back_n.stat_type5 IN (12,13,14) or Back_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Back_n.stat_type1 = 3 or Back_n.stat_type2 = 3 or Back_n.stat_type3 = 3 or Back_n.stat_type4 = 3 or Back_n.stat_type5 = 3 or Back_n.stat_type6 = 3) AND (Back_n.stat_type1 IN (12,13,14) or Back_n.stat_type2 IN (12,13,14) or Back_n.stat_type3 IN (12,13,14) or Back_n.stat_type4 IN (12,13,14) or Back_n.stat_type5 IN (12,13,14) or Back_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (Back_n.stat_type1 = 4 or Back_n.stat_type2 = 4 or Back_n.stat_type3 = 4 or Back_n.stat_type4 = 4 or Back_n.stat_type5 = 4 or Back_n.stat_type6 = 4) AND (Back_n.stat_type1 IN (0,31,32,38,44) or Back_n.stat_type2 IN (0,31,32,38,44) or Back_n.stat_type3 IN (0,31,32,38,44) or Back_n.stat_type4 IN (0,31,32,38,44) or Back_n.stat_type5 IN (0,31,32,38,44) or Back_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Back_n.stat_type1 = 3 or Back_n.stat_type2 = 3 or Back_n.stat_type3 = 3 or Back_n.stat_type4 = 3 or Back_n.stat_type5 = 3 or Back_n.stat_type6 = 3) AND (Back_n.stat_type1 IN (0,31,32,38,44) or Back_n.stat_type2 IN (0,31,32,38,44) or Back_n.stat_type3 IN (0,31,32,38,44) or Back_n.stat_type4 IN (0,31,32,38,44) or Back_n.stat_type5 IN (0,31,32,38,44) or Back_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Back_n.stat_type1 = 5 or Back_n.stat_type2 = 5 or Back_n.stat_type3 = 5 or Back_n.stat_type4 = 5 or Back_n.stat_type5 = 5 or Back_n.stat_type6 = 5) AND (Back_n.stat_type1 IN (31) or Back_n.stat_type2 IN (31) or Back_n.stat_type3 IN (31) or Back_n.stat_type4 IN (31) or Back_n.stat_type5 IN (31) or Back_n.stat_type6 IN (31)) then '2 Gear not optimal for Healer'\n\t\t\t\t  \t\twhen (Back_n.stat_type1 = 5 or Back_n.stat_type2 = 5 or Back_n.stat_type3 = 5 or Back_n.stat_type4 = 5 or Back_n.stat_type5 = 5 or Back_n.stat_type6 = 5) AND (Back_n.stat_type1 IN (32,36,45) or Back_n.stat_type2 IN (32,36,45) or Back_n.stat_type3 IN (32,36,45) or Back_n.stat_type4 IN (32,36,45) or Back_n.stat_type5 IN (32,36,45) or Back_n.stat_type6 IN (32,36,45)) then\n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen Back_n.ItemLevel >=200 AND Back_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen Back_n.socketColor_1 = 0 and Back_n.socketColor_2 = 0 and Back_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\t\twhen left(Back.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\twhen Back.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\twhen left(Back.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Back.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Back_n.ItemLevel >= 251 AND Back_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Back_n.ItemLevel >= 264 AND Back_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Back_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t\t\t \t  \tEND\n\t\t\t \t#Agility Tank\n\t\t     when (characters_npcbot_class_role.class_role IN ('Druid Feral Tank')) then \n\t\t\t \t\tcase \n\t\t\t \t  \t\twhen (Back_n.stat_type1 = 4 or Back_n.stat_type2 = 4 or Back_n.stat_type3 = 4 or Back_n.stat_type4 = 4 or Back_n.stat_type5 = 4 or Back_n.stat_type6 = 4) AND (Back_n.stat_type1 IN (12,13,14) or Back_n.stat_type2 IN (12,13,14) or Back_n.stat_type3 IN (12,13,14) or Back_n.stat_type4 IN (12,13,14) or Back_n.stat_type5 IN (12,13,14) or Back_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Back_n.stat_type1 = 3 or Back_n.stat_type2 = 3 or Back_n.stat_type3 = 3 or Back_n.stat_type4 = 3 or Back_n.stat_type5 = 3 or Back_n.stat_type6 = 3) AND (Back_n.stat_type1 IN (12,13,14) or Back_n.stat_type2 IN (12,13,14) or Back_n.stat_type3 IN (12,13,14) or Back_n.stat_type4 IN (12,13,14) or Back_n.stat_type5 IN (12,13,14) or Back_n.stat_type6 IN (12,13,14)) then\n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen Back_n.ItemLevel >=200 AND Back_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen Back_n.socketColor_1 = 0 and Back_n.socketColor_2 = 0 and Back_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\t\twhen left(Back.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\twhen Back.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\twhen left(Back.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Back.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Back_n.ItemLevel >= 251 AND Back_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Back_n.ItemLevel >= 264 AND Back_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Back_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t  \t\t\t  \t\twhen (Back_n.stat_type1 = 4 or Back_n.stat_type2 = 4 or Back_n.stat_type3 = 4 or Back_n.stat_type4 = 4 or Back_n.stat_type5 = 4 or Back_n.stat_type6 = 4) AND (Back_n.stat_type1 IN (0,31,32,38,44) or Back_n.stat_type2 IN (0,31,32,38,44) or Back_n.stat_type3 IN (0,31,32,38,44) or Back_n.stat_type4 IN (0,31,32,38,44) or Back_n.stat_type5 IN (0,31,32,38,44) or Back_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Back_n.stat_type1 = 3 or Back_n.stat_type2 = 3 or Back_n.stat_type3 = 3 or Back_n.stat_type4 = 3 or Back_n.stat_type5 = 3 or Back_n.stat_type6 = 3) AND (Back_n.stat_type1 IN (0,31,32,38,44) or Back_n.stat_type2 IN (0,31,32,38,44) or Back_n.stat_type3 IN (0,31,32,38,44) or Back_n.stat_type4 IN (0,31,32,38,44) or Back_n.stat_type5 IN (0,31,32,38,44) or Back_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Back_n.stat_type1 = 5 or Back_n.stat_type2 = 5 or Back_n.stat_type3 = 5 or Back_n.stat_type4 = 5 or Back_n.stat_type5 = 5 or Back_n.stat_type6 = 5) AND (Back_n.stat_type1 IN (31) or Back_n.stat_type2 IN (31) or Back_n.stat_type3 IN (31) or Back_n.stat_type4 IN (31) or Back_n.stat_type5 IN (31) or Back_n.stat_type6 IN (31)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Back_n.stat_type1 = 5 or Back_n.stat_type2 = 5 or Back_n.stat_type3 = 5 or Back_n.stat_type4 = 5 or Back_n.stat_type5 = 5 or Back_n.stat_type6 = 5) AND (Back_n.stat_type1 IN (32,36,45) or Back_n.stat_type2 IN (32,36,45) or Back_n.stat_type3 IN (32,36,45) or Back_n.stat_type4 IN (32,36,45) or Back_n.stat_type5 IN (32,36,45) or Back_n.stat_type6 IN (32,36,45)) then '1 Gear with wrong stat'\n\t\t\t \t  \tEND\n\t\t\t #Agility DPS\n\t\t     when (characters_npcbot_class_role.class_role IN ('Hunter', 'Rogue', 'Druid Feral DPS', 'Shaman Enhancement')) then \n\t\t\t\t\tcase \n\t\t\t \t  \t\twhen (Back_n.stat_type1 = 4 or Back_n.stat_type2 = 4 or Back_n.stat_type3 = 4 or Back_n.stat_type4 = 4 or Back_n.stat_type5 = 4 or Back_n.stat_type6 = 4) AND (Back_n.stat_type1 IN (12,13,14) or Back_n.stat_type2 IN (12,13,14) or Back_n.stat_type3 IN (12,13,14) or Back_n.stat_type4 IN (12,13,14) or Back_n.stat_type5 IN (12,13,14) or Back_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Back_n.stat_type1 = 3 or Back_n.stat_type2 = 3 or Back_n.stat_type3 = 3 or Back_n.stat_type4 = 3 or Back_n.stat_type5 = 3 or Back_n.stat_type6 = 3) AND (Back_n.stat_type1 IN (12,13,14) or Back_n.stat_type2 IN (12,13,14) or Back_n.stat_type3 IN (12,13,14) or Back_n.stat_type4 IN (12,13,14) or Back_n.stat_type5 IN (12,13,14) or Back_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (Back_n.stat_type1 = 4 or Back_n.stat_type2 = 4 or Back_n.stat_type3 = 4 or Back_n.stat_type4 = 4 or Back_n.stat_type5 = 4 or Back_n.stat_type6 = 4) AND (Back_n.stat_type1 IN (0,31,32,38,44) or Back_n.stat_type2 IN (0,31,32,38,44) or Back_n.stat_type3 IN (0,31,32,38,44) or Back_n.stat_type4 IN (0,31,32,38,44) or Back_n.stat_type5 IN (0,31,32,38,44) or Back_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Back_n.stat_type1 = 3 or Back_n.stat_type2 = 3 or Back_n.stat_type3 = 3 or Back_n.stat_type4 = 3 or Back_n.stat_type5 = 3 or Back_n.stat_type6 = 3) AND (Back_n.stat_type1 IN (0,31,32,38,44) or Back_n.stat_type2 IN (0,31,32,38,44) or Back_n.stat_type3 IN (0,31,32,38,44) or Back_n.stat_type4 IN (0,31,32,38,44) or Back_n.stat_type5 IN (0,31,32,38,44) or Back_n.stat_type6 IN (0,31,32,38,44)) then \n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen Back_n.ItemLevel >=200 AND Back_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen Back_n.socketColor_1 = 0 and Back_n.socketColor_2 = 0 and Back_n.socketColor_3 = 0 then\n\t\t\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\t\t\twhen left(Back.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\twhen Back.enchantments = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' then '7 Gear missing enchanting / gem'\n\t\t\t\t\t\t\t\t\twhen left(Back.enchantments,5) = '0 0 0' then '8 Gear missing enchanting'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Back.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Back_n.ItemLevel >= 251 AND Back_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Back_n.ItemLevel >= 264 AND Back_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Back_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND \n\t\t\t\t  \t\twhen (Back_n.stat_type1 = 5 or Back_n.stat_type2 = 5 or Back_n.stat_type3 = 5 or Back_n.stat_type4 = 5 or Back_n.stat_type5 = 5 or Back_n.stat_type6 = 5) AND (Back_n.stat_type1 IN (31) or Back_n.stat_type2 IN (31) or Back_n.stat_type3 IN (31) or Back_n.stat_type4 IN (31) or Back_n.stat_type5 IN (31) or Back_n.stat_type6 IN (31)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Back_n.stat_type1 = 5 or Back_n.stat_type2 = 5 or Back_n.stat_type3 = 5 or Back_n.stat_type4 = 5 or Back_n.stat_type5 = 5 or Back_n.stat_type6 = 5) AND (Back_n.stat_type1 IN (32,36,45) or Back_n.stat_type2 IN (32,36,45) or Back_n.stat_type3 IN (32,36,45) or Back_n.stat_type4 IN (32,36,45) or Back_n.stat_type5 IN (32,36,45) or Back_n.stat_type6 IN (32,36,45)) then '1 Gear with wrong stat'\n\t\t\t \t  \tEND\n\t\t end  AS '12 Back Analyze',\n\n\t\t case\n\t\t\t #Strength DPS\n\t\t     when (characters_npcbot_class_role.class_role IN ('Warrior DPS', 'Paladin DPS', 'DK DPS')) then \n\t\t     \t\tcase \n\t\t\t \t  \t\twhen (Finger1_n.stat_type1 = 4 or Finger1_n.stat_type2 = 4 or Finger1_n.stat_type3 = 4 or Finger1_n.stat_type4 = 4 or Finger1_n.stat_type5 = 4 or Finger1_n.stat_type6 = 4) AND (Finger1_n.stat_type1 IN (12,13,14) or Finger1_n.stat_type2 IN (12,13,14) or Finger1_n.stat_type3 IN (12,13,14) or Finger1_n.stat_type4 IN (12,13,14) or Finger1_n.stat_type5 IN (12,13,14) or Finger1_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Finger1_n.stat_type1 = 3 or Finger1_n.stat_type2 = 3 or Finger1_n.stat_type3 = 3 or Finger1_n.stat_type4 = 3 or Finger1_n.stat_type5 = 3 or Finger1_n.stat_type6 = 3) AND (Finger1_n.stat_type1 IN (12,13,14) or Finger1_n.stat_type2 IN (12,13,14) or Finger1_n.stat_type3 IN (12,13,14) or Finger1_n.stat_type4 IN (12,13,14) or Finger1_n.stat_type5 IN (12,13,14) or Finger1_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (Finger1_n.stat_type1 = 4 or Finger1_n.stat_type2 = 4 or Finger1_n.stat_type3 = 4 or Finger1_n.stat_type4 = 4 or Finger1_n.stat_type5 = 4 or Finger1_n.stat_type6 = 4) AND (Finger1_n.stat_type1 IN (0,31,32,38,44) or Finger1_n.stat_type2 IN (0,31,32,38,44) or Finger1_n.stat_type3 IN (0,31,32,38,44) or Finger1_n.stat_type4 IN (0,31,32,38,44) or Finger1_n.stat_type5 IN (0,31,32,38,44) or Finger1_n.stat_type6 IN (0,31,32,38,44)) then \n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen Finger1_n.ItemLevel >=200 AND Finger1_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Finger1.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Finger1_n.ItemLevel >= 251 AND Finger1_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Finger1_n.ItemLevel >= 264 AND Finger1_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Finger1_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND \n\t\t\t \t  \t\twhen (Finger1_n.stat_type1 = 3 or Finger1_n.stat_type2 = 3 or Finger1_n.stat_type3 = 3 or Finger1_n.stat_type4 = 3 or Finger1_n.stat_type5 = 3 or Finger1_n.stat_type6 = 3) AND (Finger1_n.stat_type1 IN (0,31,32,38,44) or Finger1_n.stat_type2 IN (0,31,32,38,44) or Finger1_n.stat_type3 IN (0,31,32,38,44) or Finger1_n.stat_type4 IN (0,31,32,38,44) or Finger1_n.stat_type5 IN (0,31,32,38,44) or Finger1_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Finger1_n.stat_type1 = 5 or Finger1_n.stat_type2 = 5 or Finger1_n.stat_type3 = 5 or Finger1_n.stat_type4 = 5 or Finger1_n.stat_type5 = 5 or Finger1_n.stat_type6 = 5) AND (Finger1_n.stat_type1 IN (31) or Finger1_n.stat_type2 IN (31) or Finger1_n.stat_type3 IN (31) or Finger1_n.stat_type4 IN (31) or Finger1_n.stat_type5 IN (31) or Finger1_n.stat_type6 IN (31)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Finger1_n.stat_type1 = 5 or Finger1_n.stat_type2 = 5 or Finger1_n.stat_type3 = 5 or Finger1_n.stat_type4 = 5 or Finger1_n.stat_type5 = 5 or Finger1_n.stat_type6 = 5) AND (Finger1_n.stat_type1 IN (32,36,45) or Finger1_n.stat_type2 IN (32,36,45) or Finger1_n.stat_type3 IN (32,36,45) or Finger1_n.stat_type4 IN (32,36,45) or Finger1_n.stat_type5 IN (32,36,45) or Finger1_n.stat_type6 IN (32,36,45)) then '1 Gear with wrong stat'\n\t\t\t \t  \tEND\n\t\t\t #Strength Tank\n\t\t     when (characters_npcbot_class_role.class_role IN ('Warrior Tank', 'Paladin Tank', 'DK Tank')) then\n\t\t     \t\tcase \n\t\t\t \t  \t\twhen (Finger1_n.stat_type1 = 4 or Finger1_n.stat_type2 = 4 or Finger1_n.stat_type3 = 4 or Finger1_n.stat_type4 = 4 or Finger1_n.stat_type5 = 4 or Finger1_n.stat_type6 = 4) AND (Finger1_n.stat_type1 IN (12,13,14) or Finger1_n.stat_type2 IN (12,13,14) or Finger1_n.stat_type3 IN (12,13,14) or Finger1_n.stat_type4 IN (12,13,14) or Finger1_n.stat_type5 IN (12,13,14) or Finger1_n.stat_type6 IN (12,13,14)) then \n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen Finger1_n.ItemLevel >=200 AND Finger1_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Finger1.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Finger1_n.ItemLevel >= 251 AND Finger1_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Finger1_n.ItemLevel >= 264 AND Finger1_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Finger1_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t\t\t \t  \t\twhen (Finger1_n.stat_type1 = 3 or Finger1_n.stat_type2 = 3 or Finger1_n.stat_type3 = 3 or Finger1_n.stat_type4 = 3 or Finger1_n.stat_type5 = 3 or Finger1_n.stat_type6 = 3) AND (Finger1_n.stat_type1 IN (12,13,14) or Finger1_n.stat_type2 IN (12,13,14) or Finger1_n.stat_type3 IN (12,13,14) or Finger1_n.stat_type4 IN (12,13,14) or Finger1_n.stat_type5 IN (12,13,14) or Finger1_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (Finger1_n.stat_type1 = 4 or Finger1_n.stat_type2 = 4 or Finger1_n.stat_type3 = 4 or Finger1_n.stat_type4 = 4 or Finger1_n.stat_type5 = 4 or Finger1_n.stat_type6 = 4) AND (Finger1_n.stat_type1 IN (0,31,32,38,44) or Finger1_n.stat_type2 IN (0,31,32,38,44) or Finger1_n.stat_type3 IN (0,31,32,38,44) or Finger1_n.stat_type4 IN (0,31,32,38,44) or Finger1_n.stat_type5 IN (0,31,32,38,44) or Finger1_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Finger1_n.stat_type1 = 3 or Finger1_n.stat_type2 = 3 or Finger1_n.stat_type3 = 3 or Finger1_n.stat_type4 = 3 or Finger1_n.stat_type5 = 3 or Finger1_n.stat_type6 = 3) AND (Finger1_n.stat_type1 IN (0,31,32,38,44) or Finger1_n.stat_type2 IN (0,31,32,38,44) or Finger1_n.stat_type3 IN (0,31,32,38,44) or Finger1_n.stat_type4 IN (0,31,32,38,44) or Finger1_n.stat_type5 IN (0,31,32,38,44) or Finger1_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Finger1_n.stat_type1 = 5 or Finger1_n.stat_type2 = 5 or Finger1_n.stat_type3 = 5 or Finger1_n.stat_type4 = 5 or Finger1_n.stat_type5 = 5 or Finger1_n.stat_type6 = 5) AND (Finger1_n.stat_type1 IN (31) or Finger1_n.stat_type2 IN (31) or Finger1_n.stat_type3 IN (31) or Finger1_n.stat_type4 IN (31) or Finger1_n.stat_type5 IN (31) or Finger1_n.stat_type6 IN (31)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Finger1_n.stat_type1 = 5 or Finger1_n.stat_type2 = 5 or Finger1_n.stat_type3 = 5 or Finger1_n.stat_type4 = 5 or Finger1_n.stat_type5 = 5 or Finger1_n.stat_type6 = 5) AND (Finger1_n.stat_type1 IN (32,36,45) or Finger1_n.stat_type2 IN (32,36,45) or Finger1_n.stat_type3 IN (32,36,45) or Finger1_n.stat_type4 IN (32,36,45) or Finger1_n.stat_type5 IN (32,36,45) or Finger1_n.stat_type6 IN (32,36,45)) then '1 Gear with wrong stat'\n\t\t\t \t  \tEND\n\t\t\t \t#Magic DPS\n\t\t      when (characters_npcbot_class_role.class_role IN ('Mage', 'Warlock', 'Shaman Elemental', 'Druid Balance', 'Priest DPS')) then\n\t\t\t \t\tcase \n\t\t\t \t  \t\twhen (Finger1_n.stat_type1 = 4 or Finger1_n.stat_type2 = 4 or Finger1_n.stat_type3 = 4 or Finger1_n.stat_type4 = 4 or Finger1_n.stat_type5 = 4 or Finger1_n.stat_type6 = 4) AND (Finger1_n.stat_type1 IN (12,13,14) or Finger1_n.stat_type2 IN (12,13,14) or Finger1_n.stat_type3 IN (12,13,14) or Finger1_n.stat_type4 IN (12,13,14) or Finger1_n.stat_type5 IN (12,13,14) or Finger1_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Finger1_n.stat_type1 = 3 or Finger1_n.stat_type2 = 3 or Finger1_n.stat_type3 = 3 or Finger1_n.stat_type4 = 3 or Finger1_n.stat_type5 = 3 or Finger1_n.stat_type6 = 3) AND (Finger1_n.stat_type1 IN (12,13,14) or Finger1_n.stat_type2 IN (12,13,14) or Finger1_n.stat_type3 IN (12,13,14) or Finger1_n.stat_type4 IN (12,13,14) or Finger1_n.stat_type5 IN (12,13,14) or Finger1_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (Finger1_n.stat_type1 = 4 or Finger1_n.stat_type2 = 4 or Finger1_n.stat_type3 = 4 or Finger1_n.stat_type4 = 4 or Finger1_n.stat_type5 = 4 or Finger1_n.stat_type6 = 4) AND (Finger1_n.stat_type1 IN (0,31,32,38,44) or Finger1_n.stat_type2 IN (0,31,32,38,44) or Finger1_n.stat_type3 IN (0,31,32,38,44) or Finger1_n.stat_type4 IN (0,31,32,38,44) or Finger1_n.stat_type5 IN (0,31,32,38,44) or Finger1_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Finger1_n.stat_type1 = 3 or Finger1_n.stat_type2 = 3 or Finger1_n.stat_type3 = 3 or Finger1_n.stat_type4 = 3 or Finger1_n.stat_type5 = 3 or Finger1_n.stat_type6 = 3) AND (Finger1_n.stat_type1 IN (0,31,32,38,44) or Finger1_n.stat_type2 IN (0,31,32,38,44) or Finger1_n.stat_type3 IN (0,31,32,38,44) or Finger1_n.stat_type4 IN (0,31,32,38,44) or Finger1_n.stat_type5 IN (0,31,32,38,44) or Finger1_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Finger1_n.stat_type1 = 5 or Finger1_n.stat_type2 = 5 or Finger1_n.stat_type3 = 5 or Finger1_n.stat_type4 = 5 or Finger1_n.stat_type5 = 5 or Finger1_n.stat_type6 = 5) AND (Finger1_n.stat_type1 IN (31) or Finger1_n.stat_type2 IN (31) or Finger1_n.stat_type3 IN (31) or Finger1_n.stat_type4 IN (31) or Finger1_n.stat_type5 IN (31) or Finger1_n.stat_type6 IN (31)) then\n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen Finger1_n.ItemLevel >=200 AND Finger1_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Finger1.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Finger1_n.ItemLevel >= 251 AND Finger1_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Finger1_n.ItemLevel >= 264 AND Finger1_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Finger1_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t\t\t\t  \t\twhen (Finger1_n.stat_type1 = 5 or Finger1_n.stat_type2 = 5 or Finger1_n.stat_type3 = 5 or Finger1_n.stat_type4 = 5 or Finger1_n.stat_type5 = 5 or Finger1_n.stat_type6 = 5) AND (Finger1_n.stat_type1 IN (32,36,45) or Finger1_n.stat_type2 IN (32,36,45) or Finger1_n.stat_type3 IN (32,36,45) or Finger1_n.stat_type4 IN (32,36,45) or Finger1_n.stat_type5 IN (32,36,45) or Finger1_n.stat_type6 IN (32,36,45)) then \n\t\t\t\t\t\t  \t\tcase\n\t\t\t\t\t\t\t\t\twhen Finger1_n.ItemLevel >=200 AND Finger1_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Finger1.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Finger1_n.ItemLevel >= 251 AND Finger1_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Finger1_n.ItemLevel >= 264 AND Finger1_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Finger1_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t\t\t \t  \tEND\n\t\t\t  #Healer / DPS\n\t\t     when (characters_npcbot_class_role.class_role IN ('Paladin Healer', 'Priest Healer', 'Warlock', 'Mage', 'Shaman Healer', 'Druid Healer'))\n\t\t\t        then \n\t\t\t \t\tcase \n\t\t\t \t  \t\twhen (Finger1_n.stat_type1 = 4 or Finger1_n.stat_type2 = 4 or Finger1_n.stat_type3 = 4 or Finger1_n.stat_type4 = 4 or Finger1_n.stat_type5 = 4 or Finger1_n.stat_type6 = 4) AND (Finger1_n.stat_type1 IN (12,13,14) or Finger1_n.stat_type2 IN (12,13,14) or Finger1_n.stat_type3 IN (12,13,14) or Finger1_n.stat_type4 IN (12,13,14) or Finger1_n.stat_type5 IN (12,13,14) or Finger1_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Finger1_n.stat_type1 = 3 or Finger1_n.stat_type2 = 3 or Finger1_n.stat_type3 = 3 or Finger1_n.stat_type4 = 3 or Finger1_n.stat_type5 = 3 or Finger1_n.stat_type6 = 3) AND (Finger1_n.stat_type1 IN (12,13,14) or Finger1_n.stat_type2 IN (12,13,14) or Finger1_n.stat_type3 IN (12,13,14) or Finger1_n.stat_type4 IN (12,13,14) or Finger1_n.stat_type5 IN (12,13,14) or Finger1_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (Finger1_n.stat_type1 = 4 or Finger1_n.stat_type2 = 4 or Finger1_n.stat_type3 = 4 or Finger1_n.stat_type4 = 4 or Finger1_n.stat_type5 = 4 or Finger1_n.stat_type6 = 4) AND (Finger1_n.stat_type1 IN (0,31,32,38,44) or Finger1_n.stat_type2 IN (0,31,32,38,44) or Finger1_n.stat_type3 IN (0,31,32,38,44) or Finger1_n.stat_type4 IN (0,31,32,38,44) or Finger1_n.stat_type5 IN (0,31,32,38,44) or Finger1_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Finger1_n.stat_type1 = 3 or Finger1_n.stat_type2 = 3 or Finger1_n.stat_type3 = 3 or Finger1_n.stat_type4 = 3 or Finger1_n.stat_type5 = 3 or Finger1_n.stat_type6 = 3) AND (Finger1_n.stat_type1 IN (0,31,32,38,44) or Finger1_n.stat_type2 IN (0,31,32,38,44) or Finger1_n.stat_type3 IN (0,31,32,38,44) or Finger1_n.stat_type4 IN (0,31,32,38,44) or Finger1_n.stat_type5 IN (0,31,32,38,44) or Finger1_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Finger1_n.stat_type1 = 5 or Finger1_n.stat_type2 = 5 or Finger1_n.stat_type3 = 5 or Finger1_n.stat_type4 = 5 or Finger1_n.stat_type5 = 5 or Finger1_n.stat_type6 = 5) AND (Finger1_n.stat_type1 IN (31) or Finger1_n.stat_type2 IN (31) or Finger1_n.stat_type3 IN (31) or Finger1_n.stat_type4 IN (31) or Finger1_n.stat_type5 IN (31) or Finger1_n.stat_type6 IN (31)) then '2 Gear not optimal for Healer'\n\t\t\t\t  \t\twhen (Finger1_n.stat_type1 = 5 or Finger1_n.stat_type2 = 5 or Finger1_n.stat_type3 = 5 or Finger1_n.stat_type4 = 5 or Finger1_n.stat_type5 = 5 or Finger1_n.stat_type6 = 5) AND (Finger1_n.stat_type1 IN (32,36,45) or Finger1_n.stat_type2 IN (32,36,45) or Finger1_n.stat_type3 IN (32,36,45) or Finger1_n.stat_type4 IN (32,36,45) or Finger1_n.stat_type5 IN (32,36,45) or Finger1_n.stat_type6 IN (32,36,45)) then\n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen Finger1_n.ItemLevel >=200 AND Finger1_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Finger1.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Finger1_n.ItemLevel >= 251 AND Finger1_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Finger1_n.ItemLevel >= 264 AND Finger1_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Finger1_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t\t\t \t  \tEND\n\t\t\t \t#Agility Tank\n\t\t     when (characters_npcbot_class_role.class_role IN ('Druid Feral Tank')) then \n\t\t\t \t\tcase \n\t\t\t \t  \t\twhen (Finger1_n.stat_type1 = 4 or Finger1_n.stat_type2 = 4 or Finger1_n.stat_type3 = 4 or Finger1_n.stat_type4 = 4 or Finger1_n.stat_type5 = 4 or Finger1_n.stat_type6 = 4) AND (Finger1_n.stat_type1 IN (12,13,14) or Finger1_n.stat_type2 IN (12,13,14) or Finger1_n.stat_type3 IN (12,13,14) or Finger1_n.stat_type4 IN (12,13,14) or Finger1_n.stat_type5 IN (12,13,14) or Finger1_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Finger1_n.stat_type1 = 3 or Finger1_n.stat_type2 = 3 or Finger1_n.stat_type3 = 3 or Finger1_n.stat_type4 = 3 or Finger1_n.stat_type5 = 3 or Finger1_n.stat_type6 = 3) AND (Finger1_n.stat_type1 IN (12,13,14) or Finger1_n.stat_type2 IN (12,13,14) or Finger1_n.stat_type3 IN (12,13,14) or Finger1_n.stat_type4 IN (12,13,14) or Finger1_n.stat_type5 IN (12,13,14) or Finger1_n.stat_type6 IN (12,13,14)) then\n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen Finger1_n.ItemLevel >=200 AND Finger1_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Finger1.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Finger1_n.ItemLevel >= 251 AND Finger1_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Finger1_n.ItemLevel >= 264 AND Finger1_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Finger1_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t  \t\t\t  \t\twhen (Finger1_n.stat_type1 = 4 or Finger1_n.stat_type2 = 4 or Finger1_n.stat_type3 = 4 or Finger1_n.stat_type4 = 4 or Finger1_n.stat_type5 = 4 or Finger1_n.stat_type6 = 4) AND (Finger1_n.stat_type1 IN (0,31,32,38,44) or Finger1_n.stat_type2 IN (0,31,32,38,44) or Finger1_n.stat_type3 IN (0,31,32,38,44) or Finger1_n.stat_type4 IN (0,31,32,38,44) or Finger1_n.stat_type5 IN (0,31,32,38,44) or Finger1_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Finger1_n.stat_type1 = 3 or Finger1_n.stat_type2 = 3 or Finger1_n.stat_type3 = 3 or Finger1_n.stat_type4 = 3 or Finger1_n.stat_type5 = 3 or Finger1_n.stat_type6 = 3) AND (Finger1_n.stat_type1 IN (0,31,32,38,44) or Finger1_n.stat_type2 IN (0,31,32,38,44) or Finger1_n.stat_type3 IN (0,31,32,38,44) or Finger1_n.stat_type4 IN (0,31,32,38,44) or Finger1_n.stat_type5 IN (0,31,32,38,44) or Finger1_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Finger1_n.stat_type1 = 5 or Finger1_n.stat_type2 = 5 or Finger1_n.stat_type3 = 5 or Finger1_n.stat_type4 = 5 or Finger1_n.stat_type5 = 5 or Finger1_n.stat_type6 = 5) AND (Finger1_n.stat_type1 IN (31) or Finger1_n.stat_type2 IN (31) or Finger1_n.stat_type3 IN (31) or Finger1_n.stat_type4 IN (31) or Finger1_n.stat_type5 IN (31) or Finger1_n.stat_type6 IN (31)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Finger1_n.stat_type1 = 5 or Finger1_n.stat_type2 = 5 or Finger1_n.stat_type3 = 5 or Finger1_n.stat_type4 = 5 or Finger1_n.stat_type5 = 5 or Finger1_n.stat_type6 = 5) AND (Finger1_n.stat_type1 IN (32,36,45) or Finger1_n.stat_type2 IN (32,36,45) or Finger1_n.stat_type3 IN (32,36,45) or Finger1_n.stat_type4 IN (32,36,45) or Finger1_n.stat_type5 IN (32,36,45) or Finger1_n.stat_type6 IN (32,36,45)) then '1 Gear with wrong stat'\n\t\t\t \t  \tEND\n\t\t\t #Agility DPS\n\t\t     when (characters_npcbot_class_role.class_role IN ('Hunter', 'Rogue', 'Druid Feral DPS', 'Shaman Enhancement')) then \n\t\t\t\t\tcase \n\t\t\t \t  \t\twhen (Finger1_n.stat_type1 = 4 or Finger1_n.stat_type2 = 4 or Finger1_n.stat_type3 = 4 or Finger1_n.stat_type4 = 4 or Finger1_n.stat_type5 = 4 or Finger1_n.stat_type6 = 4) AND (Finger1_n.stat_type1 IN (12,13,14) or Finger1_n.stat_type2 IN (12,13,14) or Finger1_n.stat_type3 IN (12,13,14) or Finger1_n.stat_type4 IN (12,13,14) or Finger1_n.stat_type5 IN (12,13,14) or Finger1_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Finger1_n.stat_type1 = 3 or Finger1_n.stat_type2 = 3 or Finger1_n.stat_type3 = 3 or Finger1_n.stat_type4 = 3 or Finger1_n.stat_type5 = 3 or Finger1_n.stat_type6 = 3) AND (Finger1_n.stat_type1 IN (12,13,14) or Finger1_n.stat_type2 IN (12,13,14) or Finger1_n.stat_type3 IN (12,13,14) or Finger1_n.stat_type4 IN (12,13,14) or Finger1_n.stat_type5 IN (12,13,14) or Finger1_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (Finger1_n.stat_type1 = 4 or Finger1_n.stat_type2 = 4 or Finger1_n.stat_type3 = 4 or Finger1_n.stat_type4 = 4 or Finger1_n.stat_type5 = 4 or Finger1_n.stat_type6 = 4) AND (Finger1_n.stat_type1 IN (0,31,32,38,44) or Finger1_n.stat_type2 IN (0,31,32,38,44) or Finger1_n.stat_type3 IN (0,31,32,38,44) or Finger1_n.stat_type4 IN (0,31,32,38,44) or Finger1_n.stat_type5 IN (0,31,32,38,44) or Finger1_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Finger1_n.stat_type1 = 3 or Finger1_n.stat_type2 = 3 or Finger1_n.stat_type3 = 3 or Finger1_n.stat_type4 = 3 or Finger1_n.stat_type5 = 3 or Finger1_n.stat_type6 = 3) AND (Finger1_n.stat_type1 IN (0,31,32,38,44) or Finger1_n.stat_type2 IN (0,31,32,38,44) or Finger1_n.stat_type3 IN (0,31,32,38,44) or Finger1_n.stat_type4 IN (0,31,32,38,44) or Finger1_n.stat_type5 IN (0,31,32,38,44) or Finger1_n.stat_type6 IN (0,31,32,38,44)) then \n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen Finger1_n.ItemLevel >=200 AND Finger1_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Finger1.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Finger1_n.ItemLevel >= 251 AND Finger1_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Finger1_n.ItemLevel >= 264 AND Finger1_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Finger1_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND \n\t\t\t\t  \t\twhen (Finger1_n.stat_type1 = 5 or Finger1_n.stat_type2 = 5 or Finger1_n.stat_type3 = 5 or Finger1_n.stat_type4 = 5 or Finger1_n.stat_type5 = 5 or Finger1_n.stat_type6 = 5) AND (Finger1_n.stat_type1 IN (31) or Finger1_n.stat_type2 IN (31) or Finger1_n.stat_type3 IN (31) or Finger1_n.stat_type4 IN (31) or Finger1_n.stat_type5 IN (31) or Finger1_n.stat_type6 IN (31)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Finger1_n.stat_type1 = 5 or Finger1_n.stat_type2 = 5 or Finger1_n.stat_type3 = 5 or Finger1_n.stat_type4 = 5 or Finger1_n.stat_type5 = 5 or Finger1_n.stat_type6 = 5) AND (Finger1_n.stat_type1 IN (32,36,45) or Finger1_n.stat_type2 IN (32,36,45) or Finger1_n.stat_type3 IN (32,36,45) or Finger1_n.stat_type4 IN (32,36,45) or Finger1_n.stat_type5 IN (32,36,45) or Finger1_n.stat_type6 IN (32,36,45)) then '1 Gear with wrong stat'\n\t\t\t \t  \tEND\n\t\t end  AS '13 Finger 1 Analyze',\n\n\t\t case\n\t\t\t #Strength DPS\n\t\t     when (characters_npcbot_class_role.class_role IN ('Warrior DPS', 'Paladin DPS', 'DK DPS')) then \n\t\t     \t\tcase \n\t\t\t \t  \t\twhen (Finger2_n.stat_type1 = 4 or Finger2_n.stat_type2 = 4 or Finger2_n.stat_type3 = 4 or Finger2_n.stat_type4 = 4 or Finger2_n.stat_type5 = 4 or Finger2_n.stat_type6 = 4) AND (Finger2_n.stat_type1 IN (12,13,14) or Finger2_n.stat_type2 IN (12,13,14) or Finger2_n.stat_type3 IN (12,13,14) or Finger2_n.stat_type4 IN (12,13,14) or Finger2_n.stat_type5 IN (12,13,14) or Finger2_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Finger2_n.stat_type1 = 3 or Finger2_n.stat_type2 = 3 or Finger2_n.stat_type3 = 3 or Finger2_n.stat_type4 = 3 or Finger2_n.stat_type5 = 3 or Finger2_n.stat_type6 = 3) AND (Finger2_n.stat_type1 IN (12,13,14) or Finger2_n.stat_type2 IN (12,13,14) or Finger2_n.stat_type3 IN (12,13,14) or Finger2_n.stat_type4 IN (12,13,14) or Finger2_n.stat_type5 IN (12,13,14) or Finger2_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (Finger2_n.stat_type1 = 4 or Finger2_n.stat_type2 = 4 or Finger2_n.stat_type3 = 4 or Finger2_n.stat_type4 = 4 or Finger2_n.stat_type5 = 4 or Finger2_n.stat_type6 = 4) AND (Finger2_n.stat_type1 IN (0,31,32,38,44) or Finger2_n.stat_type2 IN (0,31,32,38,44) or Finger2_n.stat_type3 IN (0,31,32,38,44) or Finger2_n.stat_type4 IN (0,31,32,38,44) or Finger2_n.stat_type5 IN (0,31,32,38,44) or Finger2_n.stat_type6 IN (0,31,32,38,44)) then \n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen Finger2_n.ItemLevel >=200 AND Finger2_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Finger2.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Finger2_n.ItemLevel >= 251 AND Finger2_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Finger2_n.ItemLevel >= 264 AND Finger2_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Finger2_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND \n\t\t\t \t  \t\twhen (Finger2_n.stat_type1 = 3 or Finger2_n.stat_type2 = 3 or Finger2_n.stat_type3 = 3 or Finger2_n.stat_type4 = 3 or Finger2_n.stat_type5 = 3 or Finger2_n.stat_type6 = 3) AND (Finger2_n.stat_type1 IN (0,31,32,38,44) or Finger2_n.stat_type2 IN (0,31,32,38,44) or Finger2_n.stat_type3 IN (0,31,32,38,44) or Finger2_n.stat_type4 IN (0,31,32,38,44) or Finger2_n.stat_type5 IN (0,31,32,38,44) or Finger2_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Finger2_n.stat_type1 = 5 or Finger2_n.stat_type2 = 5 or Finger2_n.stat_type3 = 5 or Finger2_n.stat_type4 = 5 or Finger2_n.stat_type5 = 5 or Finger2_n.stat_type6 = 5) AND (Finger2_n.stat_type1 IN (31) or Finger2_n.stat_type2 IN (31) or Finger2_n.stat_type3 IN (31) or Finger2_n.stat_type4 IN (31) or Finger2_n.stat_type5 IN (31) or Finger2_n.stat_type6 IN (31)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Finger2_n.stat_type1 = 5 or Finger2_n.stat_type2 = 5 or Finger2_n.stat_type3 = 5 or Finger2_n.stat_type4 = 5 or Finger2_n.stat_type5 = 5 or Finger2_n.stat_type6 = 5) AND (Finger2_n.stat_type1 IN (32,36,45) or Finger2_n.stat_type2 IN (32,36,45) or Finger2_n.stat_type3 IN (32,36,45) or Finger2_n.stat_type4 IN (32,36,45) or Finger2_n.stat_type5 IN (32,36,45) or Finger2_n.stat_type6 IN (32,36,45)) then '1 Gear with wrong stat'\n\t\t\t \t  \tEND\n\t\t\t #Strength Tank\n\t\t     when (characters_npcbot_class_role.class_role IN ('Warrior Tank', 'Paladin Tank', 'DK Tank')) then\n\t\t     \t\tcase \n\t\t\t \t  \t\twhen (Finger2_n.stat_type1 = 4 or Finger2_n.stat_type2 = 4 or Finger2_n.stat_type3 = 4 or Finger2_n.stat_type4 = 4 or Finger2_n.stat_type5 = 4 or Finger2_n.stat_type6 = 4) AND (Finger2_n.stat_type1 IN (12,13,14) or Finger2_n.stat_type2 IN (12,13,14) or Finger2_n.stat_type3 IN (12,13,14) or Finger2_n.stat_type4 IN (12,13,14) or Finger2_n.stat_type5 IN (12,13,14) or Finger2_n.stat_type6 IN (12,13,14)) then \n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen Finger2_n.ItemLevel >=200 AND Finger2_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Finger2.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Finger2_n.ItemLevel >= 251 AND Finger2_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Finger2_n.ItemLevel >= 264 AND Finger2_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Finger2_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t\t\t \t  \t\twhen (Finger2_n.stat_type1 = 3 or Finger2_n.stat_type2 = 3 or Finger2_n.stat_type3 = 3 or Finger2_n.stat_type4 = 3 or Finger2_n.stat_type5 = 3 or Finger2_n.stat_type6 = 3) AND (Finger2_n.stat_type1 IN (12,13,14) or Finger2_n.stat_type2 IN (12,13,14) or Finger2_n.stat_type3 IN (12,13,14) or Finger2_n.stat_type4 IN (12,13,14) or Finger2_n.stat_type5 IN (12,13,14) or Finger2_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (Finger2_n.stat_type1 = 4 or Finger2_n.stat_type2 = 4 or Finger2_n.stat_type3 = 4 or Finger2_n.stat_type4 = 4 or Finger2_n.stat_type5 = 4 or Finger2_n.stat_type6 = 4) AND (Finger2_n.stat_type1 IN (0,31,32,38,44) or Finger2_n.stat_type2 IN (0,31,32,38,44) or Finger2_n.stat_type3 IN (0,31,32,38,44) or Finger2_n.stat_type4 IN (0,31,32,38,44) or Finger2_n.stat_type5 IN (0,31,32,38,44) or Finger2_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Finger2_n.stat_type1 = 3 or Finger2_n.stat_type2 = 3 or Finger2_n.stat_type3 = 3 or Finger2_n.stat_type4 = 3 or Finger2_n.stat_type5 = 3 or Finger2_n.stat_type6 = 3) AND (Finger2_n.stat_type1 IN (0,31,32,38,44) or Finger2_n.stat_type2 IN (0,31,32,38,44) or Finger2_n.stat_type3 IN (0,31,32,38,44) or Finger2_n.stat_type4 IN (0,31,32,38,44) or Finger2_n.stat_type5 IN (0,31,32,38,44) or Finger2_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Finger2_n.stat_type1 = 5 or Finger2_n.stat_type2 = 5 or Finger2_n.stat_type3 = 5 or Finger2_n.stat_type4 = 5 or Finger2_n.stat_type5 = 5 or Finger2_n.stat_type6 = 5) AND (Finger2_n.stat_type1 IN (31) or Finger2_n.stat_type2 IN (31) or Finger2_n.stat_type3 IN (31) or Finger2_n.stat_type4 IN (31) or Finger2_n.stat_type5 IN (31) or Finger2_n.stat_type6 IN (31)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Finger2_n.stat_type1 = 5 or Finger2_n.stat_type2 = 5 or Finger2_n.stat_type3 = 5 or Finger2_n.stat_type4 = 5 or Finger2_n.stat_type5 = 5 or Finger2_n.stat_type6 = 5) AND (Finger2_n.stat_type1 IN (32,36,45) or Finger2_n.stat_type2 IN (32,36,45) or Finger2_n.stat_type3 IN (32,36,45) or Finger2_n.stat_type4 IN (32,36,45) or Finger2_n.stat_type5 IN (32,36,45) or Finger2_n.stat_type6 IN (32,36,45)) then '1 Gear with wrong stat'\n\t\t\t \t  \tEND\n\t\t\t \t#Magic DPS\n\t\t      when (characters_npcbot_class_role.class_role IN ('Mage', 'Warlock', 'Shaman Elemental', 'Druid Balance', 'Priest DPS')) then\n\t\t\t \t\tcase \n\t\t\t \t  \t\twhen (Finger2_n.stat_type1 = 4 or Finger2_n.stat_type2 = 4 or Finger2_n.stat_type3 = 4 or Finger2_n.stat_type4 = 4 or Finger2_n.stat_type5 = 4 or Finger2_n.stat_type6 = 4) AND (Finger2_n.stat_type1 IN (12,13,14) or Finger2_n.stat_type2 IN (12,13,14) or Finger2_n.stat_type3 IN (12,13,14) or Finger2_n.stat_type4 IN (12,13,14) or Finger2_n.stat_type5 IN (12,13,14) or Finger2_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Finger2_n.stat_type1 = 3 or Finger2_n.stat_type2 = 3 or Finger2_n.stat_type3 = 3 or Finger2_n.stat_type4 = 3 or Finger2_n.stat_type5 = 3 or Finger2_n.stat_type6 = 3) AND (Finger2_n.stat_type1 IN (12,13,14) or Finger2_n.stat_type2 IN (12,13,14) or Finger2_n.stat_type3 IN (12,13,14) or Finger2_n.stat_type4 IN (12,13,14) or Finger2_n.stat_type5 IN (12,13,14) or Finger2_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (Finger2_n.stat_type1 = 4 or Finger2_n.stat_type2 = 4 or Finger2_n.stat_type3 = 4 or Finger2_n.stat_type4 = 4 or Finger2_n.stat_type5 = 4 or Finger2_n.stat_type6 = 4) AND (Finger2_n.stat_type1 IN (0,31,32,38,44) or Finger2_n.stat_type2 IN (0,31,32,38,44) or Finger2_n.stat_type3 IN (0,31,32,38,44) or Finger2_n.stat_type4 IN (0,31,32,38,44) or Finger2_n.stat_type5 IN (0,31,32,38,44) or Finger2_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Finger2_n.stat_type1 = 3 or Finger2_n.stat_type2 = 3 or Finger2_n.stat_type3 = 3 or Finger2_n.stat_type4 = 3 or Finger2_n.stat_type5 = 3 or Finger2_n.stat_type6 = 3) AND (Finger2_n.stat_type1 IN (0,31,32,38,44) or Finger2_n.stat_type2 IN (0,31,32,38,44) or Finger2_n.stat_type3 IN (0,31,32,38,44) or Finger2_n.stat_type4 IN (0,31,32,38,44) or Finger2_n.stat_type5 IN (0,31,32,38,44) or Finger2_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Finger2_n.stat_type1 = 5 or Finger2_n.stat_type2 = 5 or Finger2_n.stat_type3 = 5 or Finger2_n.stat_type4 = 5 or Finger2_n.stat_type5 = 5 or Finger2_n.stat_type6 = 5) AND (Finger2_n.stat_type1 IN (31) or Finger2_n.stat_type2 IN (31) or Finger2_n.stat_type3 IN (31) or Finger2_n.stat_type4 IN (31) or Finger2_n.stat_type5 IN (31) or Finger2_n.stat_type6 IN (31)) then\n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen Finger2_n.ItemLevel >=200 AND Finger2_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Finger2.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Finger2_n.ItemLevel >= 251 AND Finger2_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Finger2_n.ItemLevel >= 264 AND Finger2_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Finger2_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t\t\t\t  \t\twhen (Finger2_n.stat_type1 = 5 or Finger2_n.stat_type2 = 5 or Finger2_n.stat_type3 = 5 or Finger2_n.stat_type4 = 5 or Finger2_n.stat_type5 = 5 or Finger2_n.stat_type6 = 5) AND (Finger2_n.stat_type1 IN (32,36,45) or Finger2_n.stat_type2 IN (32,36,45) or Finger2_n.stat_type3 IN (32,36,45) or Finger2_n.stat_type4 IN (32,36,45) or Finger2_n.stat_type5 IN (32,36,45) or Finger2_n.stat_type6 IN (32,36,45)) then \n\t\t\t\t\t\t  \t\tcase\n\t\t\t\t\t\t\t\t\twhen Finger2_n.ItemLevel >=200 AND Finger2_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Finger2.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Finger2_n.ItemLevel >= 251 AND Finger2_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Finger2_n.ItemLevel >= 264 AND Finger2_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Finger2_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t\t\t \t  \tEND\n\t\t\t  #Healer / DPS\n\t\t     when (characters_npcbot_class_role.class_role IN ('Paladin Healer', 'Priest Healer', 'Warlock', 'Mage', 'Shaman Healer', 'Druid Healer'))\n\t\t\t        then \n\t\t\t \t\tcase \n\t\t\t \t  \t\twhen (Finger2_n.stat_type1 = 4 or Finger2_n.stat_type2 = 4 or Finger2_n.stat_type3 = 4 or Finger2_n.stat_type4 = 4 or Finger2_n.stat_type5 = 4 or Finger2_n.stat_type6 = 4) AND (Finger2_n.stat_type1 IN (12,13,14) or Finger2_n.stat_type2 IN (12,13,14) or Finger2_n.stat_type3 IN (12,13,14) or Finger2_n.stat_type4 IN (12,13,14) or Finger2_n.stat_type5 IN (12,13,14) or Finger2_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Finger2_n.stat_type1 = 3 or Finger2_n.stat_type2 = 3 or Finger2_n.stat_type3 = 3 or Finger2_n.stat_type4 = 3 or Finger2_n.stat_type5 = 3 or Finger2_n.stat_type6 = 3) AND (Finger2_n.stat_type1 IN (12,13,14) or Finger2_n.stat_type2 IN (12,13,14) or Finger2_n.stat_type3 IN (12,13,14) or Finger2_n.stat_type4 IN (12,13,14) or Finger2_n.stat_type5 IN (12,13,14) or Finger2_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (Finger2_n.stat_type1 = 4 or Finger2_n.stat_type2 = 4 or Finger2_n.stat_type3 = 4 or Finger2_n.stat_type4 = 4 or Finger2_n.stat_type5 = 4 or Finger2_n.stat_type6 = 4) AND (Finger2_n.stat_type1 IN (0,31,32,38,44) or Finger2_n.stat_type2 IN (0,31,32,38,44) or Finger2_n.stat_type3 IN (0,31,32,38,44) or Finger2_n.stat_type4 IN (0,31,32,38,44) or Finger2_n.stat_type5 IN (0,31,32,38,44) or Finger2_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Finger2_n.stat_type1 = 3 or Finger2_n.stat_type2 = 3 or Finger2_n.stat_type3 = 3 or Finger2_n.stat_type4 = 3 or Finger2_n.stat_type5 = 3 or Finger2_n.stat_type6 = 3) AND (Finger2_n.stat_type1 IN (0,31,32,38,44) or Finger2_n.stat_type2 IN (0,31,32,38,44) or Finger2_n.stat_type3 IN (0,31,32,38,44) or Finger2_n.stat_type4 IN (0,31,32,38,44) or Finger2_n.stat_type5 IN (0,31,32,38,44) or Finger2_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Finger2_n.stat_type1 = 5 or Finger2_n.stat_type2 = 5 or Finger2_n.stat_type3 = 5 or Finger2_n.stat_type4 = 5 or Finger2_n.stat_type5 = 5 or Finger2_n.stat_type6 = 5) AND (Finger2_n.stat_type1 IN (31) or Finger2_n.stat_type2 IN (31) or Finger2_n.stat_type3 IN (31) or Finger2_n.stat_type4 IN (31) or Finger2_n.stat_type5 IN (31) or Finger2_n.stat_type6 IN (31)) then '2 Gear not optimal for Healer'\n\t\t\t\t  \t\twhen (Finger2_n.stat_type1 = 5 or Finger2_n.stat_type2 = 5 or Finger2_n.stat_type3 = 5 or Finger2_n.stat_type4 = 5 or Finger2_n.stat_type5 = 5 or Finger2_n.stat_type6 = 5) AND (Finger2_n.stat_type1 IN (32,36,45) or Finger2_n.stat_type2 IN (32,36,45) or Finger2_n.stat_type3 IN (32,36,45) or Finger2_n.stat_type4 IN (32,36,45) or Finger2_n.stat_type5 IN (32,36,45) or Finger2_n.stat_type6 IN (32,36,45)) then\n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen Finger2_n.ItemLevel >=200 AND Finger2_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Finger2.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Finger2_n.ItemLevel >= 251 AND Finger2_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Finger2_n.ItemLevel >= 264 AND Finger2_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Finger2_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t\t\t \t  \tEND\n\t\t\t \t#Agility Tank\n\t\t     when (characters_npcbot_class_role.class_role IN ('Druid Feral Tank')) then \n\t\t\t \t\tcase \n\t\t\t \t  \t\twhen (Finger2_n.stat_type1 = 4 or Finger2_n.stat_type2 = 4 or Finger2_n.stat_type3 = 4 or Finger2_n.stat_type4 = 4 or Finger2_n.stat_type5 = 4 or Finger2_n.stat_type6 = 4) AND (Finger2_n.stat_type1 IN (12,13,14) or Finger2_n.stat_type2 IN (12,13,14) or Finger2_n.stat_type3 IN (12,13,14) or Finger2_n.stat_type4 IN (12,13,14) or Finger2_n.stat_type5 IN (12,13,14) or Finger2_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Finger2_n.stat_type1 = 3 or Finger2_n.stat_type2 = 3 or Finger2_n.stat_type3 = 3 or Finger2_n.stat_type4 = 3 or Finger2_n.stat_type5 = 3 or Finger2_n.stat_type6 = 3) AND (Finger2_n.stat_type1 IN (12,13,14) or Finger2_n.stat_type2 IN (12,13,14) or Finger2_n.stat_type3 IN (12,13,14) or Finger2_n.stat_type4 IN (12,13,14) or Finger2_n.stat_type5 IN (12,13,14) or Finger2_n.stat_type6 IN (12,13,14)) then\n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen Finger2_n.ItemLevel >=200 AND Finger2_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Finger2.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Finger2_n.ItemLevel >= 251 AND Finger2_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Finger2_n.ItemLevel >= 264 AND Finger2_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Finger2_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t  \t\t\t  \t\twhen (Finger2_n.stat_type1 = 4 or Finger2_n.stat_type2 = 4 or Finger2_n.stat_type3 = 4 or Finger2_n.stat_type4 = 4 or Finger2_n.stat_type5 = 4 or Finger2_n.stat_type6 = 4) AND (Finger2_n.stat_type1 IN (0,31,32,38,44) or Finger2_n.stat_type2 IN (0,31,32,38,44) or Finger2_n.stat_type3 IN (0,31,32,38,44) or Finger2_n.stat_type4 IN (0,31,32,38,44) or Finger2_n.stat_type5 IN (0,31,32,38,44) or Finger2_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Finger2_n.stat_type1 = 3 or Finger2_n.stat_type2 = 3 or Finger2_n.stat_type3 = 3 or Finger2_n.stat_type4 = 3 or Finger2_n.stat_type5 = 3 or Finger2_n.stat_type6 = 3) AND (Finger2_n.stat_type1 IN (0,31,32,38,44) or Finger2_n.stat_type2 IN (0,31,32,38,44) or Finger2_n.stat_type3 IN (0,31,32,38,44) or Finger2_n.stat_type4 IN (0,31,32,38,44) or Finger2_n.stat_type5 IN (0,31,32,38,44) or Finger2_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Finger2_n.stat_type1 = 5 or Finger2_n.stat_type2 = 5 or Finger2_n.stat_type3 = 5 or Finger2_n.stat_type4 = 5 or Finger2_n.stat_type5 = 5 or Finger2_n.stat_type6 = 5) AND (Finger2_n.stat_type1 IN (31) or Finger2_n.stat_type2 IN (31) or Finger2_n.stat_type3 IN (31) or Finger2_n.stat_type4 IN (31) or Finger2_n.stat_type5 IN (31) or Finger2_n.stat_type6 IN (31)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Finger2_n.stat_type1 = 5 or Finger2_n.stat_type2 = 5 or Finger2_n.stat_type3 = 5 or Finger2_n.stat_type4 = 5 or Finger2_n.stat_type5 = 5 or Finger2_n.stat_type6 = 5) AND (Finger2_n.stat_type1 IN (32,36,45) or Finger2_n.stat_type2 IN (32,36,45) or Finger2_n.stat_type3 IN (32,36,45) or Finger2_n.stat_type4 IN (32,36,45) or Finger2_n.stat_type5 IN (32,36,45) or Finger2_n.stat_type6 IN (32,36,45)) then '1 Gear with wrong stat'\n\t\t\t \t  \tEND\n\t\t\t #Agility DPS\n\t\t     when (characters_npcbot_class_role.class_role IN ('Hunter', 'Rogue', 'Druid Feral DPS', 'Shaman Enhancement')) then \n\t\t\t\t\tcase \n\t\t\t \t  \t\twhen (Finger2_n.stat_type1 = 4 or Finger2_n.stat_type2 = 4 or Finger2_n.stat_type3 = 4 or Finger2_n.stat_type4 = 4 or Finger2_n.stat_type5 = 4 or Finger2_n.stat_type6 = 4) AND (Finger2_n.stat_type1 IN (12,13,14) or Finger2_n.stat_type2 IN (12,13,14) or Finger2_n.stat_type3 IN (12,13,14) or Finger2_n.stat_type4 IN (12,13,14) or Finger2_n.stat_type5 IN (12,13,14) or Finger2_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Finger2_n.stat_type1 = 3 or Finger2_n.stat_type2 = 3 or Finger2_n.stat_type3 = 3 or Finger2_n.stat_type4 = 3 or Finger2_n.stat_type5 = 3 or Finger2_n.stat_type6 = 3) AND (Finger2_n.stat_type1 IN (12,13,14) or Finger2_n.stat_type2 IN (12,13,14) or Finger2_n.stat_type3 IN (12,13,14) or Finger2_n.stat_type4 IN (12,13,14) or Finger2_n.stat_type5 IN (12,13,14) or Finger2_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (Finger2_n.stat_type1 = 4 or Finger2_n.stat_type2 = 4 or Finger2_n.stat_type3 = 4 or Finger2_n.stat_type4 = 4 or Finger2_n.stat_type5 = 4 or Finger2_n.stat_type6 = 4) AND (Finger2_n.stat_type1 IN (0,31,32,38,44) or Finger2_n.stat_type2 IN (0,31,32,38,44) or Finger2_n.stat_type3 IN (0,31,32,38,44) or Finger2_n.stat_type4 IN (0,31,32,38,44) or Finger2_n.stat_type5 IN (0,31,32,38,44) or Finger2_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Finger2_n.stat_type1 = 3 or Finger2_n.stat_type2 = 3 or Finger2_n.stat_type3 = 3 or Finger2_n.stat_type4 = 3 or Finger2_n.stat_type5 = 3 or Finger2_n.stat_type6 = 3) AND (Finger2_n.stat_type1 IN (0,31,32,38,44) or Finger2_n.stat_type2 IN (0,31,32,38,44) or Finger2_n.stat_type3 IN (0,31,32,38,44) or Finger2_n.stat_type4 IN (0,31,32,38,44) or Finger2_n.stat_type5 IN (0,31,32,38,44) or Finger2_n.stat_type6 IN (0,31,32,38,44)) then \n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen Finger2_n.ItemLevel >=200 AND Finger2_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Finger2.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Finger2_n.ItemLevel >= 251 AND Finger2_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Finger2_n.ItemLevel >= 264 AND Finger2_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Finger2_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND \n\t\t\t\t  \t\twhen (Finger2_n.stat_type1 = 5 or Finger2_n.stat_type2 = 5 or Finger2_n.stat_type3 = 5 or Finger2_n.stat_type4 = 5 or Finger2_n.stat_type5 = 5 or Finger2_n.stat_type6 = 5) AND (Finger2_n.stat_type1 IN (31) or Finger2_n.stat_type2 IN (31) or Finger2_n.stat_type3 IN (31) or Finger2_n.stat_type4 IN (31) or Finger2_n.stat_type5 IN (31) or Finger2_n.stat_type6 IN (31)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Finger2_n.stat_type1 = 5 or Finger2_n.stat_type2 = 5 or Finger2_n.stat_type3 = 5 or Finger2_n.stat_type4 = 5 or Finger2_n.stat_type5 = 5 or Finger2_n.stat_type6 = 5) AND (Finger2_n.stat_type1 IN (32,36,45) or Finger2_n.stat_type2 IN (32,36,45) or Finger2_n.stat_type3 IN (32,36,45) or Finger2_n.stat_type4 IN (32,36,45) or Finger2_n.stat_type5 IN (32,36,45) or Finger2_n.stat_type6 IN (32,36,45)) then '1 Gear with wrong stat'\n\t\t\t \t  \tEND\n\t\t end  AS '14 Finger 2 Analyze',\n \n\t\t case \n\t\t \t  when (Trinket1_n.stat_type1 IN (12,13,14) or Trinket1_n.stat_type2 IN (12,13,14) or Trinket1_n.stat_type3 IN (12,13,14) or Trinket1_n.stat_type4 IN (12,13,14) or Trinket1_n.stat_type5 IN (12,13,14) or Trinket1_n.stat_type6 IN (12,13,14)) then\n\t\t\t\t\tcase\n\t\t\t\t\t\twhen Trinket1_n.ItemLevel >=200 AND Trinket1_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\twhen Trinket1_n.ItemLevel >= 251 AND Trinket1_n.ItemLevel < 264 then '4 ICC10 Tank'\n\t\t\t\t\t\tWhen Trinket1_n.ItemLevel >= 264 AND Trinket1_n.ItemLevel <=271 then '5 ICC25/10H Tank'\n\t\t\t\t\t\tWhen Trinket1_n.ItemLevel >= 277 then '6 ICC25H Tank'\n\t\t\t\t\tEND\n  \t\t\t  when (Trinket1_n.stat_type1 IN (31,32,38,44) or Trinket1_n.stat_type2 IN (31,32,38,44) or Trinket1_n.stat_type3 IN (31,32,38,44) or Trinket1_n.stat_type4 IN (31,32,38,44) or Trinket1_n.stat_type5 IN (31,32,38,44) or Trinket1_n.stat_type6 IN (31,32,38,44)) then\n\t\t\t\t\tcase\n\t\t\t\t\t\twhen Trinket1_n.ItemLevel >=200 and Trinket1_n.ItemLevel < 251 then '3 Heroic DPS'\n\t\t\t\t\t\twhen Trinket1_n.ItemLevel >= 251 AND Trinket1_n.ItemLevel < 264 then '4 ICC10 DPS'\n\t\t\t\t\t\tWhen Trinket1_n.ItemLevel >= 264 AND Trinket1_n.ItemLevel <=271 then '5 ICC25/10H DPS'\n\t\t\t\t\t\tWhen Trinket1_n.ItemLevel >= 277 then '6 ICC25H DPS'\n\t\t\t\t\tEND\n\t\t\t  when (Trinket1_n.stat_type1 IN (43) or Trinket1_n.stat_type2 IN (43) or Trinket1_n.stat_type3 IN (43) or Trinket1_n.stat_type4 IN (43) or Trinket1_n.stat_type5 IN (43) or Trinket1_n.stat_type6 IN (43)) then\n\t\t\t\t\tcase\n\t\t\t\t\t\twhen Trinket1_n.ItemLevel > 200 and Trinket1_n.ItemLevel < 251 then '3 Heroic DPS/heal'\n\t\t\t\t\t\twhen Trinket1_n.ItemLevel >= 251 AND Trinket1_n.ItemLevel < 264 then '4 ICC10 DPS/heal'\n\t\t\t\t\t\tWhen Trinket1_n.ItemLevel >= 264 AND Trinket1_n.ItemLevel <=271 then '5 ICC25/10H DPS/heal'\n\t\t\t\t\t\tWhen Trinket1_n.ItemLevel >= 277 then '6 ICC25H DPS/heal'\n\t\t\t\t\tend\n\t\t END AS '15 Trinket 1 Analyze',\n\n\t\t case \n\t\t \t  when (Trinket2_n.stat_type1 IN (12,13,14) or Trinket2_n.stat_type2 IN (12,13,14) or Trinket2_n.stat_type3 IN (12,13,14) or Trinket2_n.stat_type4 IN (12,13,14) or Trinket2_n.stat_type5 IN (12,13,14) or Trinket2_n.stat_type6 IN (12,13,14)) then\n\t\t \t  \t\tcase\n\t\t\t\t\t\twhen Trinket2_n.ItemLevel > 200 and Trinket2_n.ItemLevel < 251 then '3 Heroic Tank'\n\t\t\t\t\t\twhen Trinket2_n.ItemLevel >= 251 AND Trinket2_n.ItemLevel < 264 then '4 ICC10 Tank'\n\t\t\t\t\t\tWhen Trinket2_n.ItemLevel >= 264 AND Trinket2_n.ItemLevel <=271 then '5 ICC25/10H Tank'\n\t\t\t\t\t\tWhen Trinket2_n.ItemLevel >= 277 then '6 ICC25H Tank'\n\t\t\t\t\tEND\n  \t\t\t  when (Trinket2_n.stat_type1 IN (31,32,38,44) or Trinket2_n.stat_type2 IN (31,32,38,44) or Trinket2_n.stat_type3 IN (31,32,38,44) or Trinket2_n.stat_type4 IN (31,32,38,44) or Trinket2_n.stat_type5 IN (31,32,38,44) or Trinket2_n.stat_type6 IN (31,32,38,44)) then\n\t\t\t\t\tcase\n\t\t\t\t\t\twhen Trinket2_n.ItemLevel > 200 and Trinket2_n.ItemLevel < 251 then '3 Heroic DPS'\n\t\t\t\t\t\twhen Trinket2_n.ItemLevel >= 251 AND Trinket2_n.ItemLevel < 264 then '4 ICC10 DPS'\n\t\t\t\t\t\tWhen Trinket2_n.ItemLevel >= 264 AND Trinket2_n.ItemLevel <=271 then '5 ICC25/10H DPS'\n\t\t\t\t\t\tWhen Trinket2_n.ItemLevel >= 277 then '6 ICC25H DPS'\n\t\t\t\t\tEND\n\t\t\t  when (Trinket2_n.stat_type1 IN (43) or Trinket2_n.stat_type2 IN (43) or Trinket2_n.stat_type3 IN (43) or Trinket2_n.stat_type4 IN (43) or Trinket2_n.stat_type5 IN (43) or Trinket2_n.stat_type6 IN (43)) then\n\t\t\t\t\tcase\n\t\t\t\t\t\twhen Trinket2_n.ItemLevel > 200 and Trinket2_n.ItemLevel < 251 then '3 Heroic DPS/heal'\n\t\t\t\t\t\twhen Trinket2_n.ItemLevel >= 251 AND Trinket2_n.ItemLevel < 264 then '4 ICC10 DPS/heal'\n\t\t\t\t\t\tWhen Trinket2_n.ItemLevel >= 264 AND Trinket2_n.ItemLevel <=271 then '5 ICC25/10H DPS/heal'\n\t\t\t\t\t\tWhen Trinket2_n.ItemLevel >= 277 then '6 ICC25H DPS/heal'\n\t\t\t\t\tEND\n\t\t END AS '16 Trinket 2 analyze',\n\t\t \n\n\t\t case\n\t\t\t #Strength DPS\n\t\t     when (characters_npcbot_class_role.class_role IN ('Warrior DPS', 'Paladin DPS', 'DK DPS')) then \n\t\t     \t\tcase \n\t\t\t \t  \t\twhen (Neck_n.stat_type1 = 4 or Neck_n.stat_type2 = 4 or Neck_n.stat_type3 = 4 or Neck_n.stat_type4 = 4 or Neck_n.stat_type5 = 4 or Neck_n.stat_type6 = 4) AND (Neck_n.stat_type1 IN (12,13,14) or Neck_n.stat_type2 IN (12,13,14) or Neck_n.stat_type3 IN (12,13,14) or Neck_n.stat_type4 IN (12,13,14) or Neck_n.stat_type5 IN (12,13,14) or Neck_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Neck_n.stat_type1 = 3 or Neck_n.stat_type2 = 3 or Neck_n.stat_type3 = 3 or Neck_n.stat_type4 = 3 or Neck_n.stat_type5 = 3 or Neck_n.stat_type6 = 3) AND (Neck_n.stat_type1 IN (12,13,14) or Neck_n.stat_type2 IN (12,13,14) or Neck_n.stat_type3 IN (12,13,14) or Neck_n.stat_type4 IN (12,13,14) or Neck_n.stat_type5 IN (12,13,14) or Neck_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (Neck_n.stat_type1 = 4 or Neck_n.stat_type2 = 4 or Neck_n.stat_type3 = 4 or Neck_n.stat_type4 = 4 or Neck_n.stat_type5 = 4 or Neck_n.stat_type6 = 4) AND (Neck_n.stat_type1 IN (0,31,32,38,44) or Neck_n.stat_type2 IN (0,31,32,38,44) or Neck_n.stat_type3 IN (0,31,32,38,44) or Neck_n.stat_type4 IN (0,31,32,38,44) or Neck_n.stat_type5 IN (0,31,32,38,44) or Neck_n.stat_type6 IN (0,31,32,38,44)) then \n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen Neck_n.ItemLevel >=200 AND Neck_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Neck.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Neck_n.ItemLevel >= 251 AND Neck_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Neck_n.ItemLevel >= 264 AND Neck_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Neck_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND \n\t\t\t \t  \t\twhen (Neck_n.stat_type1 = 3 or Neck_n.stat_type2 = 3 or Neck_n.stat_type3 = 3 or Neck_n.stat_type4 = 3 or Neck_n.stat_type5 = 3 or Neck_n.stat_type6 = 3) AND (Neck_n.stat_type1 IN (0,31,32,38,44) or Neck_n.stat_type2 IN (0,31,32,38,44) or Neck_n.stat_type3 IN (0,31,32,38,44) or Neck_n.stat_type4 IN (0,31,32,38,44) or Neck_n.stat_type5 IN (0,31,32,38,44) or Neck_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Neck_n.stat_type1 = 5 or Neck_n.stat_type2 = 5 or Neck_n.stat_type3 = 5 or Neck_n.stat_type4 = 5 or Neck_n.stat_type5 = 5 or Neck_n.stat_type6 = 5) AND (Neck_n.stat_type1 IN (31) or Neck_n.stat_type2 IN (31) or Neck_n.stat_type3 IN (31) or Neck_n.stat_type4 IN (31) or Neck_n.stat_type5 IN (31) or Neck_n.stat_type6 IN (31)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Neck_n.stat_type1 = 5 or Neck_n.stat_type2 = 5 or Neck_n.stat_type3 = 5 or Neck_n.stat_type4 = 5 or Neck_n.stat_type5 = 5 or Neck_n.stat_type6 = 5) AND (Neck_n.stat_type1 IN (32,36,45) or Neck_n.stat_type2 IN (32,36,45) or Neck_n.stat_type3 IN (32,36,45) or Neck_n.stat_type4 IN (32,36,45) or Neck_n.stat_type5 IN (32,36,45) or Neck_n.stat_type6 IN (32,36,45)) then '1 Gear with wrong stat'\n\t\t\t \t  \tEND\n\t\t\t #Strength Tank\n\t\t     when (characters_npcbot_class_role.class_role IN ('Warrior Tank', 'Paladin Tank', 'DK Tank')) then\n\t\t     \t\tcase \n\t\t\t \t  \t\twhen (Neck_n.stat_type1 = 4 or Neck_n.stat_type2 = 4 or Neck_n.stat_type3 = 4 or Neck_n.stat_type4 = 4 or Neck_n.stat_type5 = 4 or Neck_n.stat_type6 = 4) AND (Neck_n.stat_type1 IN (12,13,14) or Neck_n.stat_type2 IN (12,13,14) or Neck_n.stat_type3 IN (12,13,14) or Neck_n.stat_type4 IN (12,13,14) or Neck_n.stat_type5 IN (12,13,14) or Neck_n.stat_type6 IN (12,13,14)) then \n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen Neck_n.ItemLevel >=200 AND Neck_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Neck.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Neck_n.ItemLevel >= 251 AND Neck_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Neck_n.ItemLevel >= 264 AND Neck_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Neck_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t\t\t \t  \t\twhen (Neck_n.stat_type1 = 3 or Neck_n.stat_type2 = 3 or Neck_n.stat_type3 = 3 or Neck_n.stat_type4 = 3 or Neck_n.stat_type5 = 3 or Neck_n.stat_type6 = 3) AND (Neck_n.stat_type1 IN (12,13,14) or Neck_n.stat_type2 IN (12,13,14) or Neck_n.stat_type3 IN (12,13,14) or Neck_n.stat_type4 IN (12,13,14) or Neck_n.stat_type5 IN (12,13,14) or Neck_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (Neck_n.stat_type1 = 4 or Neck_n.stat_type2 = 4 or Neck_n.stat_type3 = 4 or Neck_n.stat_type4 = 4 or Neck_n.stat_type5 = 4 or Neck_n.stat_type6 = 4) AND (Neck_n.stat_type1 IN (0,31,32,38,44) or Neck_n.stat_type2 IN (0,31,32,38,44) or Neck_n.stat_type3 IN (0,31,32,38,44) or Neck_n.stat_type4 IN (0,31,32,38,44) or Neck_n.stat_type5 IN (0,31,32,38,44) or Neck_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Neck_n.stat_type1 = 3 or Neck_n.stat_type2 = 3 or Neck_n.stat_type3 = 3 or Neck_n.stat_type4 = 3 or Neck_n.stat_type5 = 3 or Neck_n.stat_type6 = 3) AND (Neck_n.stat_type1 IN (0,31,32,38,44) or Neck_n.stat_type2 IN (0,31,32,38,44) or Neck_n.stat_type3 IN (0,31,32,38,44) or Neck_n.stat_type4 IN (0,31,32,38,44) or Neck_n.stat_type5 IN (0,31,32,38,44) or Neck_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Neck_n.stat_type1 = 5 or Neck_n.stat_type2 = 5 or Neck_n.stat_type3 = 5 or Neck_n.stat_type4 = 5 or Neck_n.stat_type5 = 5 or Neck_n.stat_type6 = 5) AND (Neck_n.stat_type1 IN (31) or Neck_n.stat_type2 IN (31) or Neck_n.stat_type3 IN (31) or Neck_n.stat_type4 IN (31) or Neck_n.stat_type5 IN (31) or Neck_n.stat_type6 IN (31)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Neck_n.stat_type1 = 5 or Neck_n.stat_type2 = 5 or Neck_n.stat_type3 = 5 or Neck_n.stat_type4 = 5 or Neck_n.stat_type5 = 5 or Neck_n.stat_type6 = 5) AND (Neck_n.stat_type1 IN (32,36,45) or Neck_n.stat_type2 IN (32,36,45) or Neck_n.stat_type3 IN (32,36,45) or Neck_n.stat_type4 IN (32,36,45) or Neck_n.stat_type5 IN (32,36,45) or Neck_n.stat_type6 IN (32,36,45)) then '1 Gear with wrong stat'\n\t\t\t \t  \tEND\n\t\t\t \t#Magic DPS\n\t\t      when (characters_npcbot_class_role.class_role IN ('Mage', 'Warlock', 'Shaman Elemental', 'Druid Balance', 'Priest DPS')) then\n\t\t\t \t\tcase \n\t\t\t \t  \t\twhen (Neck_n.stat_type1 = 4 or Neck_n.stat_type2 = 4 or Neck_n.stat_type3 = 4 or Neck_n.stat_type4 = 4 or Neck_n.stat_type5 = 4 or Neck_n.stat_type6 = 4) AND (Neck_n.stat_type1 IN (12,13,14) or Neck_n.stat_type2 IN (12,13,14) or Neck_n.stat_type3 IN (12,13,14) or Neck_n.stat_type4 IN (12,13,14) or Neck_n.stat_type5 IN (12,13,14) or Neck_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Neck_n.stat_type1 = 3 or Neck_n.stat_type2 = 3 or Neck_n.stat_type3 = 3 or Neck_n.stat_type4 = 3 or Neck_n.stat_type5 = 3 or Neck_n.stat_type6 = 3) AND (Neck_n.stat_type1 IN (12,13,14) or Neck_n.stat_type2 IN (12,13,14) or Neck_n.stat_type3 IN (12,13,14) or Neck_n.stat_type4 IN (12,13,14) or Neck_n.stat_type5 IN (12,13,14) or Neck_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (Neck_n.stat_type1 = 4 or Neck_n.stat_type2 = 4 or Neck_n.stat_type3 = 4 or Neck_n.stat_type4 = 4 or Neck_n.stat_type5 = 4 or Neck_n.stat_type6 = 4) AND (Neck_n.stat_type1 IN (0,31,32,38,44) or Neck_n.stat_type2 IN (0,31,32,38,44) or Neck_n.stat_type3 IN (0,31,32,38,44) or Neck_n.stat_type4 IN (0,31,32,38,44) or Neck_n.stat_type5 IN (0,31,32,38,44) or Neck_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Neck_n.stat_type1 = 3 or Neck_n.stat_type2 = 3 or Neck_n.stat_type3 = 3 or Neck_n.stat_type4 = 3 or Neck_n.stat_type5 = 3 or Neck_n.stat_type6 = 3) AND (Neck_n.stat_type1 IN (0,31,32,38,44) or Neck_n.stat_type2 IN (0,31,32,38,44) or Neck_n.stat_type3 IN (0,31,32,38,44) or Neck_n.stat_type4 IN (0,31,32,38,44) or Neck_n.stat_type5 IN (0,31,32,38,44) or Neck_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Neck_n.stat_type1 = 5 or Neck_n.stat_type2 = 5 or Neck_n.stat_type3 = 5 or Neck_n.stat_type4 = 5 or Neck_n.stat_type5 = 5 or Neck_n.stat_type6 = 5) AND (Neck_n.stat_type1 IN (31) or Neck_n.stat_type2 IN (31) or Neck_n.stat_type3 IN (31) or Neck_n.stat_type4 IN (31) or Neck_n.stat_type5 IN (31) or Neck_n.stat_type6 IN (31)) then\n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen Neck_n.ItemLevel >=200 AND Neck_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Neck.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Neck_n.ItemLevel >= 251 AND Neck_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Neck_n.ItemLevel >= 264 AND Neck_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Neck_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t\t\t\t  \t\twhen (Neck_n.stat_type1 = 5 or Neck_n.stat_type2 = 5 or Neck_n.stat_type3 = 5 or Neck_n.stat_type4 = 5 or Neck_n.stat_type5 = 5 or Neck_n.stat_type6 = 5) AND (Neck_n.stat_type1 IN (32,36,45) or Neck_n.stat_type2 IN (32,36,45) or Neck_n.stat_type3 IN (32,36,45) or Neck_n.stat_type4 IN (32,36,45) or Neck_n.stat_type5 IN (32,36,45) or Neck_n.stat_type6 IN (32,36,45)) then \n\t\t\t\t\t\t  \t\tcase\n\t\t\t\t\t\t\t\t\twhen Neck_n.ItemLevel >=200 AND Neck_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Neck.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Neck_n.ItemLevel >= 251 AND Neck_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Neck_n.ItemLevel >= 264 AND Neck_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Neck_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t\t\t \t  \tEND\n\t\t\t  #Healer / DPS\n\t\t     when (characters_npcbot_class_role.class_role IN ('Paladin Healer', 'Priest Healer', 'Warlock', 'Mage', 'Shaman Healer', 'Druid Healer'))\n\t\t\t        then \n\t\t\t \t\tcase \n\t\t\t \t  \t\twhen (Neck_n.stat_type1 = 4 or Neck_n.stat_type2 = 4 or Neck_n.stat_type3 = 4 or Neck_n.stat_type4 = 4 or Neck_n.stat_type5 = 4 or Neck_n.stat_type6 = 4) AND (Neck_n.stat_type1 IN (12,13,14) or Neck_n.stat_type2 IN (12,13,14) or Neck_n.stat_type3 IN (12,13,14) or Neck_n.stat_type4 IN (12,13,14) or Neck_n.stat_type5 IN (12,13,14) or Neck_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Neck_n.stat_type1 = 3 or Neck_n.stat_type2 = 3 or Neck_n.stat_type3 = 3 or Neck_n.stat_type4 = 3 or Neck_n.stat_type5 = 3 or Neck_n.stat_type6 = 3) AND (Neck_n.stat_type1 IN (12,13,14) or Neck_n.stat_type2 IN (12,13,14) or Neck_n.stat_type3 IN (12,13,14) or Neck_n.stat_type4 IN (12,13,14) or Neck_n.stat_type5 IN (12,13,14) or Neck_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (Neck_n.stat_type1 = 4 or Neck_n.stat_type2 = 4 or Neck_n.stat_type3 = 4 or Neck_n.stat_type4 = 4 or Neck_n.stat_type5 = 4 or Neck_n.stat_type6 = 4) AND (Neck_n.stat_type1 IN (0,31,32,38,44) or Neck_n.stat_type2 IN (0,31,32,38,44) or Neck_n.stat_type3 IN (0,31,32,38,44) or Neck_n.stat_type4 IN (0,31,32,38,44) or Neck_n.stat_type5 IN (0,31,32,38,44) or Neck_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Neck_n.stat_type1 = 3 or Neck_n.stat_type2 = 3 or Neck_n.stat_type3 = 3 or Neck_n.stat_type4 = 3 or Neck_n.stat_type5 = 3 or Neck_n.stat_type6 = 3) AND (Neck_n.stat_type1 IN (0,31,32,38,44) or Neck_n.stat_type2 IN (0,31,32,38,44) or Neck_n.stat_type3 IN (0,31,32,38,44) or Neck_n.stat_type4 IN (0,31,32,38,44) or Neck_n.stat_type5 IN (0,31,32,38,44) or Neck_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Neck_n.stat_type1 = 5 or Neck_n.stat_type2 = 5 or Neck_n.stat_type3 = 5 or Neck_n.stat_type4 = 5 or Neck_n.stat_type5 = 5 or Neck_n.stat_type6 = 5) AND (Neck_n.stat_type1 IN (31) or Neck_n.stat_type2 IN (31) or Neck_n.stat_type3 IN (31) or Neck_n.stat_type4 IN (31) or Neck_n.stat_type5 IN (31) or Neck_n.stat_type6 IN (31)) then '2 Gear not optimal for Healer'\n\t\t\t\t  \t\twhen (Neck_n.stat_type1 = 5 or Neck_n.stat_type2 = 5 or Neck_n.stat_type3 = 5 or Neck_n.stat_type4 = 5 or Neck_n.stat_type5 = 5 or Neck_n.stat_type6 = 5) AND (Neck_n.stat_type1 IN (32,36,45) or Neck_n.stat_type2 IN (32,36,45) or Neck_n.stat_type3 IN (32,36,45) or Neck_n.stat_type4 IN (32,36,45) or Neck_n.stat_type5 IN (32,36,45) or Neck_n.stat_type6 IN (32,36,45)) then\n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen Neck_n.ItemLevel >=200 AND Neck_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Neck.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Neck_n.ItemLevel >= 251 AND Neck_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Neck_n.ItemLevel >= 264 AND Neck_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Neck_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t\t\t \t  \tEND\n\t\t\t \t#Agility Tank\n\t\t     when (characters_npcbot_class_role.class_role IN ('Druid Feral Tank')) then \n\t\t\t \t\tcase \n\t\t\t \t  \t\twhen (Neck_n.stat_type1 = 4 or Neck_n.stat_type2 = 4 or Neck_n.stat_type3 = 4 or Neck_n.stat_type4 = 4 or Neck_n.stat_type5 = 4 or Neck_n.stat_type6 = 4) AND (Neck_n.stat_type1 IN (12,13,14) or Neck_n.stat_type2 IN (12,13,14) or Neck_n.stat_type3 IN (12,13,14) or Neck_n.stat_type4 IN (12,13,14) or Neck_n.stat_type5 IN (12,13,14) or Neck_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Neck_n.stat_type1 = 3 or Neck_n.stat_type2 = 3 or Neck_n.stat_type3 = 3 or Neck_n.stat_type4 = 3 or Neck_n.stat_type5 = 3 or Neck_n.stat_type6 = 3) AND (Neck_n.stat_type1 IN (12,13,14) or Neck_n.stat_type2 IN (12,13,14) or Neck_n.stat_type3 IN (12,13,14) or Neck_n.stat_type4 IN (12,13,14) or Neck_n.stat_type5 IN (12,13,14) or Neck_n.stat_type6 IN (12,13,14)) then\n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen Neck_n.ItemLevel >=200 AND Neck_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Neck.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Neck_n.ItemLevel >= 251 AND Neck_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Neck_n.ItemLevel >= 264 AND Neck_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Neck_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND\n\t  \t\t\t  \t\twhen (Neck_n.stat_type1 = 4 or Neck_n.stat_type2 = 4 or Neck_n.stat_type3 = 4 or Neck_n.stat_type4 = 4 or Neck_n.stat_type5 = 4 or Neck_n.stat_type6 = 4) AND (Neck_n.stat_type1 IN (0,31,32,38,44) or Neck_n.stat_type2 IN (0,31,32,38,44) or Neck_n.stat_type3 IN (0,31,32,38,44) or Neck_n.stat_type4 IN (0,31,32,38,44) or Neck_n.stat_type5 IN (0,31,32,38,44) or Neck_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Neck_n.stat_type1 = 3 or Neck_n.stat_type2 = 3 or Neck_n.stat_type3 = 3 or Neck_n.stat_type4 = 3 or Neck_n.stat_type5 = 3 or Neck_n.stat_type6 = 3) AND (Neck_n.stat_type1 IN (0,31,32,38,44) or Neck_n.stat_type2 IN (0,31,32,38,44) or Neck_n.stat_type3 IN (0,31,32,38,44) or Neck_n.stat_type4 IN (0,31,32,38,44) or Neck_n.stat_type5 IN (0,31,32,38,44) or Neck_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Neck_n.stat_type1 = 5 or Neck_n.stat_type2 = 5 or Neck_n.stat_type3 = 5 or Neck_n.stat_type4 = 5 or Neck_n.stat_type5 = 5 or Neck_n.stat_type6 = 5) AND (Neck_n.stat_type1 IN (31) or Neck_n.stat_type2 IN (31) or Neck_n.stat_type3 IN (31) or Neck_n.stat_type4 IN (31) or Neck_n.stat_type5 IN (31) or Neck_n.stat_type6 IN (31)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Neck_n.stat_type1 = 5 or Neck_n.stat_type2 = 5 or Neck_n.stat_type3 = 5 or Neck_n.stat_type4 = 5 or Neck_n.stat_type5 = 5 or Neck_n.stat_type6 = 5) AND (Neck_n.stat_type1 IN (32,36,45) or Neck_n.stat_type2 IN (32,36,45) or Neck_n.stat_type3 IN (32,36,45) or Neck_n.stat_type4 IN (32,36,45) or Neck_n.stat_type5 IN (32,36,45) or Neck_n.stat_type6 IN (32,36,45)) then '1 Gear with wrong stat'\n\t\t\t \t  \tEND\n\t\t\t #Agility DPS\n\t\t     when (characters_npcbot_class_role.class_role IN ('Hunter', 'Rogue', 'Druid Feral DPS', 'Shaman Enhancement')) then \n\t\t\t\t\tcase \n\t\t\t \t  \t\twhen (Neck_n.stat_type1 = 4 or Neck_n.stat_type2 = 4 or Neck_n.stat_type3 = 4 or Neck_n.stat_type4 = 4 or Neck_n.stat_type5 = 4 or Neck_n.stat_type6 = 4) AND (Neck_n.stat_type1 IN (12,13,14) or Neck_n.stat_type2 IN (12,13,14) or Neck_n.stat_type3 IN (12,13,14) or Neck_n.stat_type4 IN (12,13,14) or Neck_n.stat_type5 IN (12,13,14) or Neck_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Neck_n.stat_type1 = 3 or Neck_n.stat_type2 = 3 or Neck_n.stat_type3 = 3 or Neck_n.stat_type4 = 3 or Neck_n.stat_type5 = 3 or Neck_n.stat_type6 = 3) AND (Neck_n.stat_type1 IN (12,13,14) or Neck_n.stat_type2 IN (12,13,14) or Neck_n.stat_type3 IN (12,13,14) or Neck_n.stat_type4 IN (12,13,14) or Neck_n.stat_type5 IN (12,13,14) or Neck_n.stat_type6 IN (12,13,14)) then '1 Gear with wrong stat'\n\t  \t\t\t  \t\twhen (Neck_n.stat_type1 = 4 or Neck_n.stat_type2 = 4 or Neck_n.stat_type3 = 4 or Neck_n.stat_type4 = 4 or Neck_n.stat_type5 = 4 or Neck_n.stat_type6 = 4) AND (Neck_n.stat_type1 IN (0,31,32,38,44) or Neck_n.stat_type2 IN (0,31,32,38,44) or Neck_n.stat_type3 IN (0,31,32,38,44) or Neck_n.stat_type4 IN (0,31,32,38,44) or Neck_n.stat_type5 IN (0,31,32,38,44) or Neck_n.stat_type6 IN (0,31,32,38,44)) then '1 Gear with wrong stat'\n\t\t\t \t  \t\twhen (Neck_n.stat_type1 = 3 or Neck_n.stat_type2 = 3 or Neck_n.stat_type3 = 3 or Neck_n.stat_type4 = 3 or Neck_n.stat_type5 = 3 or Neck_n.stat_type6 = 3) AND (Neck_n.stat_type1 IN (0,31,32,38,44) or Neck_n.stat_type2 IN (0,31,32,38,44) or Neck_n.stat_type3 IN (0,31,32,38,44) or Neck_n.stat_type4 IN (0,31,32,38,44) or Neck_n.stat_type5 IN (0,31,32,38,44) or Neck_n.stat_type6 IN (0,31,32,38,44)) then \n\t\t\t\t\t\t\t\tcase\n\t\t\t\t\t\t\t\t\twhen Neck_n.ItemLevel >=200 AND Neck_n.ItemLevel < 251 then '3 Heroic'\n\t\t\t\t\t\t\t\t\twhen RIGHT(Neck.enchantments,70) = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ' then '9 Gear missing gem'\n\t\t\t\t\t\t\t\t\twhen Neck_n.ItemLevel >= 251 AND Neck_n.ItemLevel < 264 then '4 ICC10'\n\t\t\t\t\t\t\t\t\tWhen Neck_n.ItemLevel >= 264 AND Neck_n.ItemLevel <=271 then '5 ICC25/10H'\n\t\t\t\t\t\t\t\t\tWhen Neck_n.ItemLevel >= 277 then '6 ICC25H'\n\t\t\t\t\t\t\t\tEND \n\t\t\t\t  \t\twhen (Neck_n.stat_type1 = 5 or Neck_n.stat_type2 = 5 or Neck_n.stat_type3 = 5 or Neck_n.stat_type4 = 5 or Neck_n.stat_type5 = 5 or Neck_n.stat_type6 = 5) AND (Neck_n.stat_type1 IN (31) or Neck_n.stat_type2 IN (31) or Neck_n.stat_type3 IN (31) or Neck_n.stat_type4 IN (31) or Neck_n.stat_type5 IN (31) or Neck_n.stat_type6 IN (31)) then '1 Gear with wrong stat'\n\t\t\t\t  \t\twhen (Neck_n.stat_type1 = 5 or Neck_n.stat_type2 = 5 or Neck_n.stat_type3 = 5 or Neck_n.stat_type4 = 5 or Neck_n.stat_type5 = 5 or Neck_n.stat_type6 = 5) AND (Neck_n.stat_type1 IN (32,36,45) or Neck_n.stat_type2 IN (32,36,45) or Neck_n.stat_type3 IN (32,36,45) or Neck_n.stat_type4 IN (32,36,45) or Neck_n.stat_type5 IN (32,36,45) or Neck_n.stat_type6 IN (32,36,45)) then '1 Gear with wrong stat'\n\t\t\t\t  \tEND\n\t\t end  AS '17 Neck Analyze'\nFROM characters.characters_npcbot npcbot\nINNER JOIN world.creature_template ON creature_template.entry = npcbot.entry\ninner JOIN characters.characters ON characters.guid = npcbot.owner\nleft JOIN characters.item_instance MhEx ON MhEx.guid = npcbot.equipMhEx\nleft JOIN world.item_template MhEx_n ON MhEx_n.entry = MhEx.itemEntry\nleft JOIN characters.item_instance OhEx ON OhEx.guid = npcbot.equipOhEx\nleft JOIN world.item_template OhEx_n ON OhEx_n.entry = OhEx.itementry\nleft JOIN characters.item_instance RhEx ON RhEx.guid = npcbot.equipRhEx\nleft JOIN world.item_template RhEx_n ON RhEx_n.entry = RhEx.itementry\nleft JOIN characters.item_instance Head ON Head.guid = npcbot.equipHead\nleft JOIN world.item_template Head_n ON Head_n.entry = Head.itementry\nleft JOIN characters.item_instance Shoulders ON Shoulders.guid = npcbot.equipShoulders\nleft JOIN world.item_template Shoulders_n ON Shoulders_n.entry = Shoulders.itementry\nleft JOIN characters.item_instance Chest ON Chest.guid = npcbot.equipChest\nleft JOIN world.item_template Chest_n ON Chest_n.entry = Chest.itementry\nleft JOIN characters.item_instance Waist ON Waist.guid = npcbot.equipWaist\nleft JOIN world.item_template Waist_n ON Waist_n.entry = Waist.itementry\nleft JOIN characters.item_instance Legs ON Legs.guid = npcbot.equipLegs\nleft JOIN world.item_template Legs_n ON Legs_n.entry = Legs.itementry\nleft JOIN characters.item_instance Feet ON Feet.guid = npcbot.equipFeet\nleft JOIN world.item_template Feet_n ON Feet_n.entry = Feet.itementry\nleft JOIN characters.item_instance Wrist ON Wrist.guid = npcbot.equipWrist\nleft JOIN world.item_template Wrist_n ON Wrist_n.entry = Wrist.itementry\nleft JOIN characters.item_instance Hands ON Hands.guid = npcbot.equipHands\nleft JOIN world.item_template Hands_n ON Hands_n.entry = Hands.itementry\nleft JOIN characters.item_instance Back ON Back.guid = npcbot.equipBack\nleft JOIN world.item_template Back_n ON Back_n.entry = Back.itementry\nleft JOIN characters.item_instance Body ON Body.guid = npcbot.equipBody\nleft JOIN world.item_template Body_n ON Body_n.entry = Body.itementry\nleft JOIN characters.item_instance Finger1 ON Finger1.guid = npcbot.equipFinger1\nleft JOIN world.item_template Finger1_n ON Finger1_n.entry = Finger1.itementry\nleft JOIN characters.item_instance Finger2 ON Finger2.guid = npcbot.equipFinger2\nleft JOIN world.item_template Finger2_n ON Finger2_n.entry = Finger2.itementry\nleft JOIN characters.item_instance Trinket1 ON Trinket1.guid = npcbot.equipTrinket1\nleft JOIN world.item_template Trinket1_n ON Trinket1_n.entry = Trinket1.itementry\nleft JOIN characters.item_instance Trinket2 ON Trinket2.guid = npcbot.equipTrinket2\nleft JOIN world.item_template Trinket2_n ON Trinket2_n.entry = Trinket2.itementry\nleft JOIN characters.item_instance Neck ON Neck.guid = npcbot.equipNeck\nleft JOIN world.item_template Neck_n ON Neck_n.entry = Neck.itementry\nleft join characters.characters_npcbot_class_role on characters_npcbot_class_role.entry = npcbot.entry ;\n"
  },
  {
    "path": "tools/contrib/npcbot stats and gear/06 create view characters_npcbot_stats.sql",
    "content": "-- \n\nDROP VIEW IF EXISTS vw_characters_npcbot_stats;\n\nCREATE VIEW vw_characters_npcbot_stats as\n\n\nSELECT \n       characters.name AS 'Owner',\n       characters.name AS 'Bot name' , \n       case\n\t\t \t when characters.class = 1 then 'Warrior'\n\t\t\t when characters.class = 2 then 'Paladin'\n\t\t\t when characters.class = 3 then 'Hunter'\n\t\t\t when characters.class = 4 then 'Rogue'\n\t\t\t when characters.class = 5 then 'Priest'\n\t\t\t when characters.class = 6 then 'DK'\n\t\t\t when characters.class = 7 then 'Shaman'\n\t\t\t when characters.class = 8 then 'Mage'\n\t\t\t when characters.class = 9 then 'Warlock'\n\t\t\t when characters.class = 11 then 'Druid'\n\t\t end AS 'NPCBot Classe',\n       char_stats.maxhealth AS 'HP',\n\t\t char_stats.maxpower1 AS 'Mana/Rage/Energy',\n\t\t char_stats.strength AS 'Strength',\n\t\t char_stats.agility AS 'Agility',\n\t\t char_stats.stamina AS 'Stamina',\n\t\t char_stats.intellect AS 'Intellect',\n\t\t char_stats.spirit AS 'Spirit',\n\t\t char_stats.armor AS 'Armor',\n\t\t '0' AS 'Defense', \n\t\t char_stats.resHoly AS 'Holy resist',\n\t\t char_stats.resFire AS 'Fire resist',\n\t\t char_stats.resNature AS 'Nature resist',\n\t\t char_stats.resFrost AS 'Frost resist',\n\t\t char_stats.resShadow as 'Shadow resist',\n\t\t char_stats.resArcane AS 'Arcane resist',\n\t\t round(char_stats.blockPct, 2) AS 'Block %',\n\t\t round(char_stats.dodgePct, 2) AS 'Dodge %',\n\t\t round(char_stats.parryPct, 2) AS 'Parry %',\n\t\t case\n\t\t \tWhen characters.class IN (3) then round (char_stats.rangedCritPct,2)\n\t\t \twhen characters.class IN (1,2,4,6,11) then round(char_stats.critPct,2)\n\t\t\twhen characters.class in (5,7,8,9) then round(char_stats.spellCritPct,2)\n\t\t END AS 'Critical %',\n\t\t case\n\t\t \tWhen characters.class IN (3) then char_stats.rangedAttackPower \n\t\t \twhen characters.class IN (1,2,4,6,11) then char_stats.attackPower\n\t\t \twhen characters.class in (5,7,8,9) then char_stats.rangedAttackPower\n\t\t END AS 'Att Power',\n\t\t char_stats.spellPower AS 'Spell Power',\n\t\t '0' AS 'Hast %' ,\n\t\t '0' AS 'Hit %',\n\t\t'0' AS 'Expertise',\n\t\t'0' AS 'Armor Pen %'\nFROM characters.character_stats char_stats\nINNER JOIN characters.characters ON characters.guid = char_stats.guid \n\nUNION ALL\n\nSELECT \n       characters.name AS 'Owner' , \n       creature_template.name AS 'Bot name',\n       npcbot_class_role.class_role AS 'NPCBot Classe',\n       npcbot_stats.maxhealth AS 'HP',\n\t\t npcbot_stats.maxpower AS 'Mana/Rage/Energy',\n\t\t npcbot_stats.strength AS 'Strength',\n\t\t npcbot_stats.agility AS 'Agility',\n\t\t npcbot_stats.stamina AS 'Stamina',\n\t\t npcbot_stats.intellect AS 'Intellect',\n\t\t npcbot_stats.spirit AS 'Spirit',\n\t\t npcbot_stats.armor AS 'Armor',\n\t\t npcbot_stats.defense AS 'Defense', \n\t\t npcbot_stats.resHoly AS 'Holy resist',\n\t\t npcbot_stats.resFire AS 'Fire resist',\n\t\t npcbot_stats.resNature AS 'Nature resist',\n\t\t npcbot_stats.resFrost AS 'Frost resist',\n\t\t npcbot_stats.resShadow as 'Shadow resist',\n\t\t npcbot_stats.resArcane AS 'Arcane resist',\n\t\t round(npcbot_stats.blockPct,2) AS 'Block %',\n\t\t round(npcbot_stats.dodgePct,2) AS 'Dodge %',\n\t\t round(npcbot_stats.parryPct,2) AS 'Parry %',\n\t\t round(npcbot_stats.critPct,2) AS 'Critical %',\n\t\t npcbot_stats.attackPower AS 'Attack Power',\n\t\t npcbot_stats.spellPower AS 'Spell Power',\n\t\t round(npcbot_stats.hastePct,2) AS 'Hast %' ,\n\t\t round(npcbot_stats.hitBonusPct,2) AS 'Hit %',\n\t\t round(npcbot_stats.expertise,2) AS 'Expertise',\n\t\t round(npcbot_stats.armorPenPct,2) AS 'Armor Pen %'\nFROM characters.characters_npcbot_stats npcbot_stats\nINNER JOIN characters.characters_npcbot npcbot ON npcbot_stats.entry = npcbot.entry\nINNER JOIN world.creature_template ON creature_template.entry = npcbot.entry\nINNER JOIN characters.characters ON characters.guid = npcbot.owner\nleft join characters.characters_npcbot_class_role npcbot_class_role on npcbot_class_role.entry = npcbot.entry ;\n"
  },
  {
    "path": "tools/contrib/npcbot stats and gear/07 populate table characters_npcbot_class_role.sql",
    "content": "-- \n\n-- existing bots\nTRUNCATE TABLE `characters_npcbot_class_role`;\nINSERT INTO `characters_npcbot_class_role` (`entry`) (SELECT `entry` FROM `characters_npcbot`);\n\n-- trigger `characters_npcbot_class_role`.`class_roles` update\nUPDATE `characters_npcbot` SET `roles`=`roles`;\n"
  }
]